ZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX2JpdF9yZWZlcmVuY2UgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX19iaXRfcmVmZXJlbmNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNGEyMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX19iaXRfcmVmZXJlbmNlCkBAIC0wLDAgKzEsMTI4MCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9fX0JJVF9SRUZFUkVOQ0UKKyNkZWZpbmUgX0xJQkNQUF9fX0JJVF9SRUZFUkVOQ0UKKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfUFVTSF9NQUNST1MKKyNpbmNsdWRlIDxfX3VuZGVmX21hY3Jvcz4KKworCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKwordGVtcGxhdGUgPGNsYXNzIF9DcCwgYm9vbCBfSXNDb25zdCwgdHlwZW5hbWUgX0NwOjpfX3N0b3JhZ2VfdHlwZSA9IDA+IGNsYXNzIF9fYml0X2l0ZXJhdG9yOwordGVtcGxhdGUgPGNsYXNzIF9DcD4gY2xhc3MgX19iaXRfY29uc3RfcmVmZXJlbmNlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9faGFzX3N0b3JhZ2VfdHlwZQoreworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NwLCBib29sID0gX19oYXNfc3RvcmFnZV90eXBlPF9DcD46OnZhbHVlPgorY2xhc3MgX19iaXRfcmVmZXJlbmNlCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ3A6Ol9fc3RvcmFnZV90eXBlICAgIF9fc3RvcmFnZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NwOjpfX3N0b3JhZ2VfcG9pbnRlciBfX3N0b3JhZ2VfcG9pbnRlcjsKKworICAgIF9fc3RvcmFnZV9wb2ludGVyIF9fc2VnXzsKKyAgICBfX3N0b3JhZ2VfdHlwZSAgICBfX21hc2tfOworCisgICAgZnJpZW5kIHR5cGVuYW1lIF9DcDo6X19zZWxmOworCisgICAgZnJpZW5kIGNsYXNzIF9fYml0X2NvbnN0X3JlZmVyZW5jZTxfQ3A+OworICAgIGZyaWVuZCBjbGFzcyBfX2JpdF9pdGVyYXRvcjxfQ3AsIGZhbHNlPjsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIG9wZXJhdG9yIGJvb2woKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBzdGF0aWNfY2FzdDxib29sPigqX19zZWdfICYgX19tYXNrXyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYm9vbCBvcGVyYXRvciB+KCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gIXN0YXRpY19jYXN0PGJvb2w+KCp0aGlzKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19iaXRfcmVmZXJlbmNlJiBvcGVyYXRvcj0oYm9vbCBfX3gpIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgaWYgKF9feCkKKyAgICAgICAgICAgICpfX3NlZ18gfD0gX19tYXNrXzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKl9fc2VnXyAmPSB+X19tYXNrXzsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2JpdF9yZWZlcmVuY2UmIG9wZXJhdG9yPShjb25zdCBfX2JpdF9yZWZlcmVuY2UmIF9feCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gb3BlcmF0b3I9KHN0YXRpY19jYXN0PGJvb2w+KF9feCkpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCBmbGlwKCkgX05PRVhDRVBUIHsqX19zZWdfIF49IF9fbWFza187fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX19iaXRfaXRlcmF0b3I8X0NwLCBmYWxzZT4gb3BlcmF0b3ImKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19iaXRfaXRlcmF0b3I8X0NwLCBmYWxzZT4oX19zZWdfLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oX19jdHooX19tYXNrXykpKTt9Citwcml2YXRlOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2JpdF9yZWZlcmVuY2UoX19zdG9yYWdlX3BvaW50ZXIgX19zLCBfX3N0b3JhZ2VfdHlwZSBfX20pIF9OT0VYQ0VQVAorICAgICAgICA6IF9fc2VnXyhfX3MpLCBfX21hc2tfKF9fbSkge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ3A+CitjbGFzcyBfX2JpdF9yZWZlcmVuY2U8X0NwLCBmYWxzZT4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ3A+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChfX2JpdF9yZWZlcmVuY2U8X0NwPiBfX3gsIF9fYml0X3JlZmVyZW5jZTxfQ3A+IF9feSkgX05PRVhDRVBUCit7CisgICAgYm9vbCBfX3QgPSBfX3g7CisgICAgX194ID0gX195OworICAgIF9feSA9IF9fdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DcCwgY2xhc3MgX0RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3N3YXAoX19iaXRfcmVmZXJlbmNlPF9DcD4gX194LCBfX2JpdF9yZWZlcmVuY2U8X0RwPiBfX3kpIF9OT0VYQ0VQVAoreworICAgIGJvb2wgX190ID0gX194OworICAgIF9feCA9IF9feTsKKyAgICBfX3kgPSBfX3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ3A+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChfX2JpdF9yZWZlcmVuY2U8X0NwPiBfX3gsIGJvb2wmIF9feSkgX05PRVhDRVBUCit7CisgICAgYm9vbCBfX3QgPSBfX3g7CisgICAgX194ID0gX195OworICAgIF9feSA9IF9fdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzd2FwKGJvb2wmIF9feCwgX19iaXRfcmVmZXJlbmNlPF9DcD4gX195KSBfTk9FWENFUFQKK3sKKyAgICBib29sIF9fdCA9IF9feDsKKyAgICBfX3ggPSBfX3k7CisgICAgX195ID0gX190OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NwPgorY2xhc3MgX19iaXRfY29uc3RfcmVmZXJlbmNlCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ3A6Ol9fc3RvcmFnZV90eXBlICAgICAgICAgIF9fc3RvcmFnZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NwOjpfX2NvbnN0X3N0b3JhZ2VfcG9pbnRlciBfX3N0b3JhZ2VfcG9pbnRlcjsKKworICAgIF9fc3RvcmFnZV9wb2ludGVyICAgICAgICBfX3NlZ187CisgICAgX19zdG9yYWdlX3R5cGUgX19tYXNrXzsKKworICAgIGZyaWVuZCB0eXBlbmFtZSBfQ3A6Ol9fc2VsZjsKKyAgICBmcmllbmQgY2xhc3MgX19iaXRfaXRlcmF0b3I8X0NwLCB0cnVlPjsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19iaXRfY29uc3RfcmVmZXJlbmNlKGNvbnN0IF9fYml0X3JlZmVyZW5jZTxfQ3A+JiBfX3gpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fc2VnXyhfX3guX19zZWdfKSwgX19tYXNrXyhfX3guX19tYXNrXykge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KCpfX3NlZ18gJiBfX21hc2tfKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fYml0X2l0ZXJhdG9yPF9DcCwgdHJ1ZT4gb3BlcmF0b3ImKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19iaXRfaXRlcmF0b3I8X0NwLCB0cnVlPihfX3NlZ18sIHN0YXRpY19jYXN0PHVuc2lnbmVkPihfX2N0eihfX21hc2tfKSkpO30KK3ByaXZhdGU6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9MSUJDUFBfQ09OU1RFWFBSCisgICAgX19iaXRfY29uc3RfcmVmZXJlbmNlKF9fc3RvcmFnZV9wb2ludGVyIF9fcywgX19zdG9yYWdlX3R5cGUgX19tKSBfTk9FWENFUFQKKyAgICAgICAgOiBfX3NlZ18oX19zKSwgX19tYXNrXyhfX20pIHt9CisKKyAgICBfX2JpdF9jb25zdF9yZWZlcmVuY2UmIG9wZXJhdG9yPShjb25zdCBfX2JpdF9jb25zdF9yZWZlcmVuY2UmIF9feCk7Cit9OworCisvLyBmaW5kCisKK3RlbXBsYXRlIDxjbGFzcyBfQ3AsIGJvb2wgX0lzQ29uc3Q+CitfX2JpdF9pdGVyYXRvcjxfQ3AsIF9Jc0NvbnN0PgorX19maW5kX2Jvb2xfdHJ1ZShfX2JpdF9pdGVyYXRvcjxfQ3AsIF9Jc0NvbnN0PiBfX2ZpcnN0LCB0eXBlbmFtZSBfQ3A6OnNpemVfdHlwZSBfX24pCit7CisgICAgdHlwZWRlZiBfX2JpdF9pdGVyYXRvcjxfQ3AsIF9Jc0NvbnN0PiBfSXQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXQ6Ol9fc3RvcmFnZV90eXBlIF9fc3RvcmFnZV90eXBlOworICAgIHN0YXRpYyBjb25zdCBpbnQgX19iaXRzX3Blcl93b3JkID0gX0l0OjpfX2JpdHNfcGVyX3dvcmQ7CisgICAgLy8gZG8gZmlyc3QgcGFydGlhbCB3b3JkCisgICAgaWYgKF9fZmlyc3QuX19jdHpfICE9IDApCisgICAgeworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2Nsel9mID0gc3RhdGljX2Nhc3Q8X19zdG9yYWdlX3R5cGU+KF9fYml0c19wZXJfd29yZCAtIF9fZmlyc3QuX19jdHpfKTsKKyAgICAgICAgX19zdG9yYWdlX3R5cGUgX19kbiA9IF9WU1REOjptaW4oX19jbHpfZiwgX19uKTsKKyAgICAgICAgX19zdG9yYWdlX3R5cGUgX19tID0gKH5fX3N0b3JhZ2VfdHlwZSgwKSA8PCBfX2ZpcnN0Ll9fY3R6XykgJiAofl9fc3RvcmFnZV90eXBlKDApID4+IChfX2Nsel9mIC0gX19kbikpOworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2IgPSAqX19maXJzdC5fX3NlZ18gJiBfX207CisgICAgICAgIGlmIChfX2IpCisgICAgICAgICAgICByZXR1cm4gX0l0KF9fZmlyc3QuX19zZWdfLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oX1ZTVEQ6Ol9fY3R6KF9fYikpKTsKKyAgICAgICAgaWYgKF9fbiA9PSBfX2RuKQorICAgICAgICAgICAgcmV0dXJuIF9fZmlyc3QgKyBfX247CisgICAgICAgIF9fbiAtPSBfX2RuOworICAgICAgICArK19fZmlyc3QuX19zZWdfOworICAgIH0KKyAgICAvLyBkbyBtaWRkbGUgd2hvbGUgd29yZHMKKyAgICBmb3IgKDsgX19uID49IF9fYml0c19wZXJfd29yZDsgKytfX2ZpcnN0Ll9fc2VnXywgX19uIC09IF9fYml0c19wZXJfd29yZCkKKyAgICAgICAgaWYgKCpfX2ZpcnN0Ll9fc2VnXykKKyAgICAgICAgICAgIHJldHVybiBfSXQoX19maXJzdC5fX3NlZ18sIHN0YXRpY19jYXN0PHVuc2lnbmVkPihfVlNURDo6X19jdHooKl9fZmlyc3QuX19zZWdfKSkpOworICAgIC8vIGRvIGxhc3QgcGFydGlhbCB3b3JkCisgICAgaWYgKF9fbiA+IDApCisgICAgeworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX20gPSB+X19zdG9yYWdlX3R5cGUoMCkgPj4gKF9fYml0c19wZXJfd29yZCAtIF9fbik7CisgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fYiA9ICpfX2ZpcnN0Ll9fc2VnXyAmIF9fbTsKKyAgICAgICAgaWYgKF9fYikKKyAgICAgICAgICAgIHJldHVybiBfSXQoX19maXJzdC5fX3NlZ18sIHN0YXRpY19jYXN0PHVuc2lnbmVkPihfVlNURDo6X19jdHooX19iKSkpOworICAgIH0KKyAgICByZXR1cm4gX0l0KF9fZmlyc3QuX19zZWdfLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oX19uKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ3AsIGJvb2wgX0lzQ29uc3Q+CitfX2JpdF9pdGVyYXRvcjxfQ3AsIF9Jc0NvbnN0PgorX19maW5kX2Jvb2xfZmFsc2UoX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD4gX19maXJzdCwgdHlwZW5hbWUgX0NwOjpzaXplX3R5cGUgX19uKQoreworICAgIHR5cGVkZWYgX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD4gX0l0OworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0OjpfX3N0b3JhZ2VfdHlwZSBfX3N0b3JhZ2VfdHlwZTsKKyAgICBjb25zdCBpbnQgX19iaXRzX3Blcl93b3JkID0gX0l0OjpfX2JpdHNfcGVyX3dvcmQ7CisgICAgLy8gZG8gZmlyc3QgcGFydGlhbCB3b3JkCisgICAgaWYgKF9fZmlyc3QuX19jdHpfICE9IDApCisgICAgeworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2Nsel9mID0gc3RhdGljX2Nhc3Q8X19zdG9yYWdlX3R5cGU+KF9fYml0c19wZXJfd29yZCAtIF9fZmlyc3QuX19jdHpfKTsKKyAgICAgICAgX19zdG9yYWdlX3R5cGUgX19kbiA9IF9WU1REOjptaW4oX19jbHpfZiwgX19uKTsKKyAgICAgICAgX19zdG9yYWdlX3R5cGUgX19tID0gKH5fX3N0b3JhZ2VfdHlwZSgwKSA8PCBfX2ZpcnN0Ll9fY3R6XykgJiAofl9fc3RvcmFnZV90eXBlKDApID4+IChfX2Nsel9mIC0gX19kbikpOworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2IgPSB+Kl9fZmlyc3QuX19zZWdfICYgX19tOworICAgICAgICBpZiAoX19iKQorICAgICAgICAgICAgcmV0dXJuIF9JdChfX2ZpcnN0Ll9fc2VnXywgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KF9WU1REOjpfX2N0eihfX2IpKSk7CisgICAgICAgIGlmIChfX24gPT0gX19kbikKKyAgICAgICAgICAgIHJldHVybiBfX2ZpcnN0ICsgX19uOworICAgICAgICBfX24gLT0gX19kbjsKKyAgICAgICAgKytfX2ZpcnN0Ll9fc2VnXzsKKyAgICB9CisgICAgLy8gZG8gbWlkZGxlIHdob2xlIHdvcmRzCisgICAgZm9yICg7IF9fbiA+PSBfX2JpdHNfcGVyX3dvcmQ7ICsrX19maXJzdC5fX3NlZ18sIF9fbiAtPSBfX2JpdHNfcGVyX3dvcmQpCisgICAgeworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2IgPSB+Kl9fZmlyc3QuX19zZWdfOworICAgICAgICBpZiAoX19iKQorICAgICAgICAgICAgcmV0dXJuIF9JdChfX2ZpcnN0Ll9fc2VnXywgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KF9WU1REOjpfX2N0eihfX2IpKSk7CisgICAgfQorICAgIC8vIGRvIGxhc3QgcGFydGlhbCB3b3JkCisgICAgaWYgKF9fbiA+IDApCisgICAgeworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX20gPSB+X19zdG9yYWdlX3R5cGUoMCkgPj4gKF9fYml0c19wZXJfd29yZCAtIF9fbik7CisgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fYiA9IH4qX19maXJzdC5fX3NlZ18gJiBfX207CisgICAgICAgIGlmIChfX2IpCisgICAgICAgICAgICByZXR1cm4gX0l0KF9fZmlyc3QuX19zZWdfLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oX1ZTVEQ6Ol9fY3R6KF9fYikpKTsKKyAgICB9CisgICAgcmV0dXJuIF9JdChfX2ZpcnN0Ll9fc2VnXywgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KF9fbikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NwLCBib29sIF9Jc0NvbnN0LCBjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD4KK2ZpbmQoX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD4gX19maXJzdCwgX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD4gX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsdWVfKQoreworICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihfX3ZhbHVlXykpCisgICAgICAgIHJldHVybiBfX2ZpbmRfYm9vbF90cnVlKF9fZmlyc3QsIHN0YXRpY19jYXN0PHR5cGVuYW1lIF9DcDo6c2l6ZV90eXBlPihfX2xhc3QgLSBfX2ZpcnN0KSk7CisgICAgcmV0dXJuIF9fZmluZF9ib29sX2ZhbHNlKF9fZmlyc3QsIHN0YXRpY19jYXN0PHR5cGVuYW1lIF9DcDo6c2l6ZV90eXBlPihfX2xhc3QgLSBfX2ZpcnN0KSk7Cit9CisKKy8vIGNvdW50CisKK3RlbXBsYXRlIDxjbGFzcyBfQ3AsIGJvb2wgX0lzQ29uc3Q+Cit0eXBlbmFtZSBfX2JpdF9pdGVyYXRvcjxfQ3AsIF9Jc0NvbnN0Pjo6ZGlmZmVyZW5jZV90eXBlCitfX2NvdW50X2Jvb2xfdHJ1ZShfX2JpdF9pdGVyYXRvcjxfQ3AsIF9Jc0NvbnN0PiBfX2ZpcnN0LCB0eXBlbmFtZSBfQ3A6OnNpemVfdHlwZSBfX24pCit7CisgICAgdHlwZWRlZiBfX2JpdF9pdGVyYXRvcjxfQ3AsIF9Jc0NvbnN0PiBfSXQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXQ6Ol9fc3RvcmFnZV90eXBlIF9fc3RvcmFnZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIGNvbnN0IGludCBfX2JpdHNfcGVyX3dvcmQgPSBfSXQ6Ol9fYml0c19wZXJfd29yZDsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19yID0gMDsKKyAgICAvLyBkbyBmaXJzdCBwYXJ0aWFsIHdvcmQKKyAgICBpZiAoX19maXJzdC5fX2N0el8gIT0gMCkKKyAgICB7CisgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fY2x6X2YgPSBzdGF0aWNfY2FzdDxfX3N0b3JhZ2VfdHlwZT4oX19iaXRzX3Blcl93b3JkIC0gX19maXJzdC5fX2N0el8pOworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2RuID0gX1ZTVEQ6Om1pbihfX2Nsel9mLCBfX24pOworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX20gPSAofl9fc3RvcmFnZV90eXBlKDApIDw8IF9fZmlyc3QuX19jdHpfKSAmICh+X19zdG9yYWdlX3R5cGUoMCkgPj4gKF9fY2x6X2YgLSBfX2RuKSk7CisgICAgICAgIF9fciA9IF9WU1REOjpfX3BvcF9jb3VudCgqX19maXJzdC5fX3NlZ18gJiBfX20pOworICAgICAgICBfX24gLT0gX19kbjsKKyAgICAgICAgKytfX2ZpcnN0Ll9fc2VnXzsKKyAgICB9CisgICAgLy8gZG8gbWlkZGxlIHdob2xlIHdvcmRzCisgICAgZm9yICg7IF9fbiA+PSBfX2JpdHNfcGVyX3dvcmQ7ICsrX19maXJzdC5fX3NlZ18sIF9fbiAtPSBfX2JpdHNfcGVyX3dvcmQpCisgICAgICAgIF9fciArPSBfVlNURDo6X19wb3BfY291bnQoKl9fZmlyc3QuX19zZWdfKTsKKyAgICAvLyBkbyBsYXN0IHBhcnRpYWwgd29yZAorICAgIGlmIChfX24gPiAwKQorICAgIHsKKyAgICAgICAgX19zdG9yYWdlX3R5cGUgX19tID0gfl9fc3RvcmFnZV90eXBlKDApID4+IChfX2JpdHNfcGVyX3dvcmQgLSBfX24pOworICAgICAgICBfX3IgKz0gX1ZTVEQ6Ol9fcG9wX2NvdW50KCpfX2ZpcnN0Ll9fc2VnXyAmIF9fbSk7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ3AsIGJvb2wgX0lzQ29uc3Q+Cit0eXBlbmFtZSBfX2JpdF9pdGVyYXRvcjxfQ3AsIF9Jc0NvbnN0Pjo6ZGlmZmVyZW5jZV90eXBlCitfX2NvdW50X2Jvb2xfZmFsc2UoX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD4gX19maXJzdCwgdHlwZW5hbWUgX0NwOjpzaXplX3R5cGUgX19uKQoreworICAgIHR5cGVkZWYgX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD4gX0l0OworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0OjpfX3N0b3JhZ2VfdHlwZSBfX3N0b3JhZ2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICBjb25zdCBpbnQgX19iaXRzX3Blcl93b3JkID0gX0l0OjpfX2JpdHNfcGVyX3dvcmQ7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fciA9IDA7CisgICAgLy8gZG8gZmlyc3QgcGFydGlhbCB3b3JkCisgICAgaWYgKF9fZmlyc3QuX19jdHpfICE9IDApCisgICAgeworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2Nsel9mID0gc3RhdGljX2Nhc3Q8X19zdG9yYWdlX3R5cGU+KF9fYml0c19wZXJfd29yZCAtIF9fZmlyc3QuX19jdHpfKTsKKyAgICAgICAgX19zdG9yYWdlX3R5cGUgX19kbiA9IF9WU1REOjptaW4oX19jbHpfZiwgX19uKTsKKyAgICAgICAgX19zdG9yYWdlX3R5cGUgX19tID0gKH5fX3N0b3JhZ2VfdHlwZSgwKSA8PCBfX2ZpcnN0Ll9fY3R6XykgJiAofl9fc3RvcmFnZV90eXBlKDApID4+IChfX2Nsel9mIC0gX19kbikpOworICAgICAgICBfX3IgPSBfVlNURDo6X19wb3BfY291bnQofipfX2ZpcnN0Ll9fc2VnXyAmIF9fbSk7CisgICAgICAgIF9fbiAtPSBfX2RuOworICAgICAgICArK19fZmlyc3QuX19zZWdfOworICAgIH0KKyAgICAvLyBkbyBtaWRkbGUgd2hvbGUgd29yZHMKKyAgICBmb3IgKDsgX19uID49IF9fYml0c19wZXJfd29yZDsgKytfX2ZpcnN0Ll9fc2VnXywgX19uIC09IF9fYml0c19wZXJfd29yZCkKKyAgICAgICAgX19yICs9IF9WU1REOjpfX3BvcF9jb3VudCh+Kl9fZmlyc3QuX19zZWdfKTsKKyAgICAvLyBkbyBsYXN0IHBhcnRpYWwgd29yZAorICAgIGlmIChfX24gPiAwKQorICAgIHsKKyAgICAgICAgX19zdG9yYWdlX3R5cGUgX19tID0gfl9fc3RvcmFnZV90eXBlKDApID4+IChfX2JpdHNfcGVyX3dvcmQgLSBfX24pOworICAgICAgICBfX3IgKz0gX1ZTVEQ6Ol9fcG9wX2NvdW50KH4qX19maXJzdC5fX3NlZ18gJiBfX20pOworICAgIH0KKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NwLCBib29sIF9Jc0NvbnN0LCBjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD46OmRpZmZlcmVuY2VfdHlwZQorY291bnQoX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD4gX19maXJzdCwgX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD4gX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsdWVfKQoreworICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihfX3ZhbHVlXykpCisgICAgICAgIHJldHVybiBfX2NvdW50X2Jvb2xfdHJ1ZShfX2ZpcnN0LCBzdGF0aWNfY2FzdDx0eXBlbmFtZSBfQ3A6OnNpemVfdHlwZT4oX19sYXN0IC0gX19maXJzdCkpOworICAgIHJldHVybiBfX2NvdW50X2Jvb2xfZmFsc2UoX19maXJzdCwgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgX0NwOjpzaXplX3R5cGU+KF9fbGFzdCAtIF9fZmlyc3QpKTsKK30KKworLy8gZmlsbF9uCisKK3RlbXBsYXRlIDxjbGFzcyBfQ3A+Cit2b2lkCitfX2ZpbGxfbl9mYWxzZShfX2JpdF9pdGVyYXRvcjxfQ3AsIGZhbHNlPiBfX2ZpcnN0LCB0eXBlbmFtZSBfQ3A6OnNpemVfdHlwZSBfX24pCit7CisgICAgdHlwZWRlZiBfX2JpdF9pdGVyYXRvcjxfQ3AsIGZhbHNlPiBfSXQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXQ6Ol9fc3RvcmFnZV90eXBlIF9fc3RvcmFnZV90eXBlOworICAgIGNvbnN0IGludCBfX2JpdHNfcGVyX3dvcmQgPSBfSXQ6Ol9fYml0c19wZXJfd29yZDsKKyAgICAvLyBkbyBmaXJzdCBwYXJ0aWFsIHdvcmQKKyAgICBpZiAoX19maXJzdC5fX2N0el8gIT0gMCkKKyAgICB7CisgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fY2x6X2YgPSBzdGF0aWNfY2FzdDxfX3N0b3JhZ2VfdHlwZT4oX19iaXRzX3Blcl93b3JkIC0gX19maXJzdC5fX2N0el8pOworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2RuID0gX1ZTVEQ6Om1pbihfX2Nsel9mLCBfX24pOworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX20gPSAofl9fc3RvcmFnZV90eXBlKDApIDw8IF9fZmlyc3QuX19jdHpfKSAmICh+X19zdG9yYWdlX3R5cGUoMCkgPj4gKF9fY2x6X2YgLSBfX2RuKSk7CisgICAgICAgICpfX2ZpcnN0Ll9fc2VnXyAmPSB+X19tOworICAgICAgICBfX24gLT0gX19kbjsKKyAgICAgICAgKytfX2ZpcnN0Ll9fc2VnXzsKKyAgICB9CisgICAgLy8gZG8gbWlkZGxlIHdob2xlIHdvcmRzCisgICAgX19zdG9yYWdlX3R5cGUgX19udyA9IF9fbiAvIF9fYml0c19wZXJfd29yZDsKKyAgICBfVlNURDo6bWVtc2V0KF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fZmlyc3QuX19zZWdfKSwgMCwgX19udyAqIHNpemVvZihfX3N0b3JhZ2VfdHlwZSkpOworICAgIF9fbiAtPSBfX253ICogX19iaXRzX3Blcl93b3JkOworICAgIC8vIGRvIGxhc3QgcGFydGlhbCB3b3JkCisgICAgaWYgKF9fbiA+IDApCisgICAgeworICAgICAgICBfX2ZpcnN0Ll9fc2VnXyArPSBfX253OworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX20gPSB+X19zdG9yYWdlX3R5cGUoMCkgPj4gKF9fYml0c19wZXJfd29yZCAtIF9fbik7CisgICAgICAgICpfX2ZpcnN0Ll9fc2VnXyAmPSB+X19tOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9DcD4KK3ZvaWQKK19fZmlsbF9uX3RydWUoX19iaXRfaXRlcmF0b3I8X0NwLCBmYWxzZT4gX19maXJzdCwgdHlwZW5hbWUgX0NwOjpzaXplX3R5cGUgX19uKQoreworICAgIHR5cGVkZWYgX19iaXRfaXRlcmF0b3I8X0NwLCBmYWxzZT4gX0l0OworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0OjpfX3N0b3JhZ2VfdHlwZSBfX3N0b3JhZ2VfdHlwZTsKKyAgICBjb25zdCBpbnQgX19iaXRzX3Blcl93b3JkID0gX0l0OjpfX2JpdHNfcGVyX3dvcmQ7CisgICAgLy8gZG8gZmlyc3QgcGFydGlhbCB3b3JkCisgICAgaWYgKF9fZmlyc3QuX19jdHpfICE9IDApCisgICAgeworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2Nsel9mID0gc3RhdGljX2Nhc3Q8X19zdG9yYWdlX3R5cGU+KF9fYml0c19wZXJfd29yZCAtIF9fZmlyc3QuX19jdHpfKTsKKyAgICAgICAgX19zdG9yYWdlX3R5cGUgX19kbiA9IF9WU1REOjptaW4oX19jbHpfZiwgX19uKTsKKyAgICAgICAgX19zdG9yYWdlX3R5cGUgX19tID0gKH5fX3N0b3JhZ2VfdHlwZSgwKSA8PCBfX2ZpcnN0Ll9fY3R6XykgJiAofl9fc3RvcmFnZV90eXBlKDApID4+IChfX2Nsel9mIC0gX19kbikpOworICAgICAgICAqX19maXJzdC5fX3NlZ18gfD0gX19tOworICAgICAgICBfX24gLT0gX19kbjsKKyAgICAgICAgKytfX2ZpcnN0Ll9fc2VnXzsKKyAgICB9CisgICAgLy8gZG8gbWlkZGxlIHdob2xlIHdvcmRzCisgICAgX19zdG9yYWdlX3R5cGUgX19udyA9IF9fbiAvIF9fYml0c19wZXJfd29yZDsKKyAgICBfVlNURDo6bWVtc2V0KF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fZmlyc3QuX19zZWdfKSwgLTEsIF9fbncgKiBzaXplb2YoX19zdG9yYWdlX3R5cGUpKTsKKyAgICBfX24gLT0gX19udyAqIF9fYml0c19wZXJfd29yZDsKKyAgICAvLyBkbyBsYXN0IHBhcnRpYWwgd29yZAorICAgIGlmIChfX24gPiAwKQorICAgIHsKKyAgICAgICAgX19maXJzdC5fX3NlZ18gKz0gX19udzsKKyAgICAgICAgX19zdG9yYWdlX3R5cGUgX19tID0gfl9fc3RvcmFnZV90eXBlKDApID4+IChfX2JpdHNfcGVyX3dvcmQgLSBfX24pOworICAgICAgICAqX19maXJzdC5fX3NlZ18gfD0gX19tOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9DcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitmaWxsX24oX19iaXRfaXRlcmF0b3I8X0NwLCBmYWxzZT4gX19maXJzdCwgdHlwZW5hbWUgX0NwOjpzaXplX3R5cGUgX19uLCBib29sIF9fdmFsdWVfKQoreworICAgIGlmIChfX24gPiAwKQorICAgIHsKKyAgICAgICAgaWYgKF9fdmFsdWVfKQorICAgICAgICAgICAgX19maWxsX25fdHJ1ZShfX2ZpcnN0LCBfX24pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX2ZpbGxfbl9mYWxzZShfX2ZpcnN0LCBfX24pOworICAgIH0KK30KKworLy8gZmlsbAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK2ZpbGwoX19iaXRfaXRlcmF0b3I8X0NwLCBmYWxzZT4gX19maXJzdCwgX19iaXRfaXRlcmF0b3I8X0NwLCBmYWxzZT4gX19sYXN0LCBib29sIF9fdmFsdWVfKQoreworICAgIF9WU1REOjpmaWxsX24oX19maXJzdCwgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgX0NwOjpzaXplX3R5cGU+KF9fbGFzdCAtIF9fZmlyc3QpLCBfX3ZhbHVlXyk7Cit9CisKKy8vIGNvcHkKKwordGVtcGxhdGUgPGNsYXNzIF9DcCwgYm9vbCBfSXNDb25zdD4KK19fYml0X2l0ZXJhdG9yPF9DcCwgZmFsc2U+CitfX2NvcHlfYWxpZ25lZChfX2JpdF9pdGVyYXRvcjxfQ3AsIF9Jc0NvbnN0PiBfX2ZpcnN0LCBfX2JpdF9pdGVyYXRvcjxfQ3AsIF9Jc0NvbnN0PiBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYml0X2l0ZXJhdG9yPF9DcCwgZmFsc2U+IF9fcmVzdWx0KQoreworICAgIHR5cGVkZWYgX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD4gX0luOworICAgIHR5cGVkZWYgIHR5cGVuYW1lIF9Jbjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jbjo6X19zdG9yYWdlX3R5cGUgX19zdG9yYWdlX3R5cGU7CisgICAgY29uc3QgaW50IF9fYml0c19wZXJfd29yZCA9IF9Jbjo6X19iaXRzX3Blcl93b3JkOworICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgIGlmIChfX24gPiAwKQorICAgIHsKKyAgICAgICAgLy8gZG8gZmlyc3Qgd29yZAorICAgICAgICBpZiAoX19maXJzdC5fX2N0el8gIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgX19jbHogPSBfX2JpdHNfcGVyX3dvcmQgLSBfX2ZpcnN0Ll9fY3R6XzsKKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2RuID0gX1ZTVEQ6Om1pbihzdGF0aWNfY2FzdDxkaWZmZXJlbmNlX3R5cGU+KF9fY2x6KSwgX19uKTsKKyAgICAgICAgICAgIF9fbiAtPSBfX2RuOworICAgICAgICAgICAgX19zdG9yYWdlX3R5cGUgX19tID0gKH5fX3N0b3JhZ2VfdHlwZSgwKSA8PCBfX2ZpcnN0Ll9fY3R6XykgJiAofl9fc3RvcmFnZV90eXBlKDApID4+IChfX2NseiAtIF9fZG4pKTsKKyAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fYiA9ICpfX2ZpcnN0Ll9fc2VnXyAmIF9fbTsKKyAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gJj0gfl9fbTsKKyAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gfD0gX19iOworICAgICAgICAgICAgX19yZXN1bHQuX19zZWdfICs9IChfX2RuICsgX19yZXN1bHQuX19jdHpfKSAvIF9fYml0c19wZXJfd29yZDsKKyAgICAgICAgICAgIF9fcmVzdWx0Ll9fY3R6XyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPigoX19kbiArIF9fcmVzdWx0Ll9fY3R6XykgICUgX19iaXRzX3Blcl93b3JkKTsKKyAgICAgICAgICAgICsrX19maXJzdC5fX3NlZ187CisgICAgICAgICAgICAvLyBfX2ZpcnN0Ll9fY3R6XyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLy8gX19maXJzdC5fX2N0el8gPT0gMDsKKyAgICAgICAgLy8gZG8gbWlkZGxlIHdvcmRzCisgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fbncgPSBfX24gLyBfX2JpdHNfcGVyX3dvcmQ7CisgICAgICAgIF9WU1REOjptZW1tb3ZlKF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fcmVzdWx0Ll9fc2VnXyksCisgICAgICAgICAgICAgICAgICAgICAgIF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fZmlyc3QuX19zZWdfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgX19udyAqIHNpemVvZihfX3N0b3JhZ2VfdHlwZSkpOworICAgICAgICBfX24gLT0gX19udyAqIF9fYml0c19wZXJfd29yZDsKKyAgICAgICAgX19yZXN1bHQuX19zZWdfICs9IF9fbnc7CisgICAgICAgIC8vIGRvIGxhc3Qgd29yZAorICAgICAgICBpZiAoX19uID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgX19maXJzdC5fX3NlZ18gKz0gX19udzsKKyAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fbSA9IH5fX3N0b3JhZ2VfdHlwZSgwKSA+PiAoX19iaXRzX3Blcl93b3JkIC0gX19uKTsKKyAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fYiA9ICpfX2ZpcnN0Ll9fc2VnXyAmIF9fbTsKKyAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gJj0gfl9fbTsKKyAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gfD0gX19iOworICAgICAgICAgICAgX19yZXN1bHQuX19jdHpfID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KF9fbik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NwLCBib29sIF9Jc0NvbnN0PgorX19iaXRfaXRlcmF0b3I8X0NwLCBmYWxzZT4KK19fY29weV91bmFsaWduZWQoX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD4gX19maXJzdCwgX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD4gX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYml0X2l0ZXJhdG9yPF9DcCwgZmFsc2U+IF9fcmVzdWx0KQoreworICAgIHR5cGVkZWYgX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD4gX0luOworICAgIHR5cGVkZWYgIHR5cGVuYW1lIF9Jbjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jbjo6X19zdG9yYWdlX3R5cGUgX19zdG9yYWdlX3R5cGU7CisgICAgc3RhdGljIGNvbnN0IGludCBfX2JpdHNfcGVyX3dvcmQgPSBfSW46Ol9fYml0c19wZXJfd29yZDsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19sYXN0IC0gX19maXJzdDsKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIC8vIGRvIGZpcnN0IHdvcmQKKyAgICAgICAgaWYgKF9fZmlyc3QuX19jdHpfICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIF9fY2x6X2YgPSBfX2JpdHNfcGVyX3dvcmQgLSBfX2ZpcnN0Ll9fY3R6XzsKKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2RuID0gX1ZTVEQ6Om1pbihzdGF0aWNfY2FzdDxkaWZmZXJlbmNlX3R5cGU+KF9fY2x6X2YpLCBfX24pOworICAgICAgICAgICAgX19uIC09IF9fZG47CisgICAgICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX20gPSAofl9fc3RvcmFnZV90eXBlKDApIDw8IF9fZmlyc3QuX19jdHpfKSAmICh+X19zdG9yYWdlX3R5cGUoMCkgPj4gKF9fY2x6X2YgLSBfX2RuKSk7CisgICAgICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2IgPSAqX19maXJzdC5fX3NlZ18gJiBfX207CisgICAgICAgICAgICB1bnNpZ25lZCBfX2Nsel9yID0gX19iaXRzX3Blcl93b3JkIC0gX19yZXN1bHQuX19jdHpfOworICAgICAgICAgICAgX19zdG9yYWdlX3R5cGUgX19kZG4gPSBfVlNURDo6bWluPF9fc3RvcmFnZV90eXBlPihfX2RuLCBfX2Nsel9yKTsKKyAgICAgICAgICAgIF9fbSA9ICh+X19zdG9yYWdlX3R5cGUoMCkgPDwgX19yZXN1bHQuX19jdHpfKSAmICh+X19zdG9yYWdlX3R5cGUoMCkgPj4gKF9fY2x6X3IgLSBfX2RkbikpOworICAgICAgICAgICAgKl9fcmVzdWx0Ll9fc2VnXyAmPSB+X19tOworICAgICAgICAgICAgaWYgKF9fcmVzdWx0Ll9fY3R6XyA+IF9fZmlyc3QuX19jdHpfKQorICAgICAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gfD0gX19iIDw8IChfX3Jlc3VsdC5fX2N0el8gLSBfX2ZpcnN0Ll9fY3R6Xyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKl9fcmVzdWx0Ll9fc2VnXyB8PSBfX2IgPj4gKF9fZmlyc3QuX19jdHpfIC0gX19yZXN1bHQuX19jdHpfKTsKKyAgICAgICAgICAgIF9fcmVzdWx0Ll9fc2VnXyArPSAoX19kZG4gKyBfX3Jlc3VsdC5fX2N0el8pIC8gX19iaXRzX3Blcl93b3JkOworICAgICAgICAgICAgX19yZXN1bHQuX19jdHpfID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KChfX2RkbiArIF9fcmVzdWx0Ll9fY3R6XykgICUgX19iaXRzX3Blcl93b3JkKTsKKyAgICAgICAgICAgIF9fZG4gLT0gX19kZG47CisgICAgICAgICAgICBpZiAoX19kbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19tID0gfl9fc3RvcmFnZV90eXBlKDApID4+IChfX2JpdHNfcGVyX3dvcmQgLSBfX2RuKTsKKyAgICAgICAgICAgICAgICAqX19yZXN1bHQuX19zZWdfICY9IH5fX207CisgICAgICAgICAgICAgICAgKl9fcmVzdWx0Ll9fc2VnXyB8PSBfX2IgPj4gKF9fZmlyc3QuX19jdHpfICsgX19kZG4pOworICAgICAgICAgICAgICAgIF9fcmVzdWx0Ll9fY3R6XyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihfX2RuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrX19maXJzdC5fX3NlZ187CisgICAgICAgICAgICAvLyBfX2ZpcnN0Ll9fY3R6XyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLy8gX19maXJzdC5fX2N0el8gPT0gMDsKKyAgICAgICAgLy8gZG8gbWlkZGxlIHdvcmRzCisgICAgICAgIHVuc2lnbmVkIF9fY2x6X3IgPSBfX2JpdHNfcGVyX3dvcmQgLSBfX3Jlc3VsdC5fX2N0el87CisgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fbSA9IH5fX3N0b3JhZ2VfdHlwZSgwKSA8PCBfX3Jlc3VsdC5fX2N0el87CisgICAgICAgIGZvciAoOyBfX24gPj0gX19iaXRzX3Blcl93b3JkOyBfX24gLT0gX19iaXRzX3Blcl93b3JkLCArK19fZmlyc3QuX19zZWdfKQorICAgICAgICB7CisgICAgICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2IgPSAqX19maXJzdC5fX3NlZ187CisgICAgICAgICAgICAqX19yZXN1bHQuX19zZWdfICY9IH5fX207CisgICAgICAgICAgICAqX19yZXN1bHQuX19zZWdfIHw9IF9fYiA8PCBfX3Jlc3VsdC5fX2N0el87CisgICAgICAgICAgICArK19fcmVzdWx0Ll9fc2VnXzsKKyAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gJj0gX19tOworICAgICAgICAgICAgKl9fcmVzdWx0Ll9fc2VnXyB8PSBfX2IgPj4gX19jbHpfcjsKKyAgICAgICAgfQorICAgICAgICAvLyBkbyBsYXN0IHdvcmQKKyAgICAgICAgaWYgKF9fbiA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fbSA9IH5fX3N0b3JhZ2VfdHlwZSgwKSA+PiAoX19iaXRzX3Blcl93b3JkIC0gX19uKTsKKyAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fYiA9ICpfX2ZpcnN0Ll9fc2VnXyAmIF9fbTsKKyAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fZG4gPSBfVlNURDo6bWluKF9fbiwgc3RhdGljX2Nhc3Q8ZGlmZmVyZW5jZV90eXBlPihfX2Nsel9yKSk7CisgICAgICAgICAgICBfX20gPSAofl9fc3RvcmFnZV90eXBlKDApIDw8IF9fcmVzdWx0Ll9fY3R6XykgJiAofl9fc3RvcmFnZV90eXBlKDApID4+IChfX2Nsel9yIC0gX19kbikpOworICAgICAgICAgICAgKl9fcmVzdWx0Ll9fc2VnXyAmPSB+X19tOworICAgICAgICAgICAgKl9fcmVzdWx0Ll9fc2VnXyB8PSBfX2IgPDwgX19yZXN1bHQuX19jdHpfOworICAgICAgICAgICAgX19yZXN1bHQuX19zZWdfICs9IChfX2RuICsgX19yZXN1bHQuX19jdHpfKSAvIF9fYml0c19wZXJfd29yZDsKKyAgICAgICAgICAgIF9fcmVzdWx0Ll9fY3R6XyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPigoX19kbiArIF9fcmVzdWx0Ll9fY3R6XykgICUgX19iaXRzX3Blcl93b3JkKTsKKyAgICAgICAgICAgIF9fbiAtPSBfX2RuOworICAgICAgICAgICAgaWYgKF9fbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19tID0gfl9fc3RvcmFnZV90eXBlKDApID4+IChfX2JpdHNfcGVyX3dvcmQgLSBfX24pOworICAgICAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gJj0gfl9fbTsKKyAgICAgICAgICAgICAgICAqX19yZXN1bHQuX19zZWdfIHw9IF9fYiA+PiBfX2RuOworICAgICAgICAgICAgICAgIF9fcmVzdWx0Ll9fY3R6XyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihfX24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DcCwgYm9vbCBfSXNDb25zdD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfX2JpdF9pdGVyYXRvcjxfQ3AsIGZhbHNlPgorY29weShfX2JpdF9pdGVyYXRvcjxfQ3AsIF9Jc0NvbnN0PiBfX2ZpcnN0LCBfX2JpdF9pdGVyYXRvcjxfQ3AsIF9Jc0NvbnN0PiBfX2xhc3QsIF9fYml0X2l0ZXJhdG9yPF9DcCwgZmFsc2U+IF9fcmVzdWx0KQoreworICAgIGlmIChfX2ZpcnN0Ll9fY3R6XyA9PSBfX3Jlc3VsdC5fX2N0el8pCisgICAgICAgIHJldHVybiBfX2NvcHlfYWxpZ25lZChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKKyAgICByZXR1cm4gX19jb3B5X3VuYWxpZ25lZChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKK30KKworLy8gY29weV9iYWNrd2FyZAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NwLCBib29sIF9Jc0NvbnN0PgorX19iaXRfaXRlcmF0b3I8X0NwLCBmYWxzZT4KK19fY29weV9iYWNrd2FyZF9hbGlnbmVkKF9fYml0X2l0ZXJhdG9yPF9DcCwgX0lzQ29uc3Q+IF9fZmlyc3QsIF9fYml0X2l0ZXJhdG9yPF9DcCwgX0lzQ29uc3Q+IF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iaXRfaXRlcmF0b3I8X0NwLCBmYWxzZT4gX19yZXN1bHQpCit7CisgICAgdHlwZWRlZiBfX2JpdF9pdGVyYXRvcjxfQ3AsIF9Jc0NvbnN0PiBfSW47CisgICAgdHlwZWRlZiAgdHlwZW5hbWUgX0luOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0luOjpfX3N0b3JhZ2VfdHlwZSBfX3N0b3JhZ2VfdHlwZTsKKyAgICBjb25zdCBpbnQgX19iaXRzX3Blcl93b3JkID0gX0luOjpfX2JpdHNfcGVyX3dvcmQ7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgaWYgKF9fbiA+IDApCisgICAgeworICAgICAgICAvLyBkbyBmaXJzdCB3b3JkCisgICAgICAgIGlmIChfX2xhc3QuX19jdHpfICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2RuID0gX1ZTVEQ6Om1pbihzdGF0aWNfY2FzdDxkaWZmZXJlbmNlX3R5cGU+KF9fbGFzdC5fX2N0el8pLCBfX24pOworICAgICAgICAgICAgX19uIC09IF9fZG47CisgICAgICAgICAgICB1bnNpZ25lZCBfX2NseiA9IF9fYml0c19wZXJfd29yZCAtIF9fbGFzdC5fX2N0el87CisgICAgICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX20gPSAofl9fc3RvcmFnZV90eXBlKDApIDw8IChfX2xhc3QuX19jdHpfIC0gX19kbikpICYgKH5fX3N0b3JhZ2VfdHlwZSgwKSA+PiBfX2Nseik7CisgICAgICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2IgPSAqX19sYXN0Ll9fc2VnXyAmIF9fbTsKKyAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gJj0gfl9fbTsKKyAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gfD0gX19iOworICAgICAgICAgICAgX19yZXN1bHQuX19jdHpfID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KCgoLV9fZG4gJiAoX19iaXRzX3Blcl93b3JkIC0gMSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Jlc3VsdC5fX2N0el8pICAlIF9fYml0c19wZXJfd29yZCk7CisgICAgICAgICAgICAvLyBfX2xhc3QuX19jdHpfID0gMAorICAgICAgICAgfQorICAgICAgICAvLyBfX2xhc3QuX19jdHpfID09IDAgfHwgX19uID09IDAKKyAgICAgICAgLy8gX19yZXN1bHQuX19jdHpfID09IDAgfHwgX19uID09IDAKKyAgICAgICAgLy8gZG8gbWlkZGxlIHdvcmRzCisgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fbncgPSBfX24gLyBfX2JpdHNfcGVyX3dvcmQ7CisgICAgICAgIF9fcmVzdWx0Ll9fc2VnXyAtPSBfX253OworICAgICAgICBfX2xhc3QuX19zZWdfIC09IF9fbnc7CisgICAgICAgIF9WU1REOjptZW1tb3ZlKF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fcmVzdWx0Ll9fc2VnXyksCisgICAgICAgICAgICAgICAgICAgICAgIF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fbGFzdC5fX3NlZ18pLAorICAgICAgICAgICAgICAgICAgICAgICBfX253ICogc2l6ZW9mKF9fc3RvcmFnZV90eXBlKSk7CisgICAgICAgIF9fbiAtPSBfX253ICogX19iaXRzX3Blcl93b3JkOworICAgICAgICAvLyBkbyBsYXN0IHdvcmQKKyAgICAgICAgaWYgKF9fbiA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fbSA9IH5fX3N0b3JhZ2VfdHlwZSgwKSA8PCAoX19iaXRzX3Blcl93b3JkIC0gX19uKTsKKyAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fYiA9ICotLV9fbGFzdC5fX3NlZ18gJiBfX207CisgICAgICAgICAgICAqLS1fX3Jlc3VsdC5fX3NlZ18gJj0gfl9fbTsKKyAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gfD0gX19iOworICAgICAgICAgICAgX19yZXN1bHQuX19jdHpfID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KC1fX24gJiAoX19iaXRzX3Blcl93b3JkIC0gMSkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DcCwgYm9vbCBfSXNDb25zdD4KK19fYml0X2l0ZXJhdG9yPF9DcCwgZmFsc2U+CitfX2NvcHlfYmFja3dhcmRfdW5hbGlnbmVkKF9fYml0X2l0ZXJhdG9yPF9DcCwgX0lzQ29uc3Q+IF9fZmlyc3QsIF9fYml0X2l0ZXJhdG9yPF9DcCwgX0lzQ29uc3Q+IF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JpdF9pdGVyYXRvcjxfQ3AsIGZhbHNlPiBfX3Jlc3VsdCkKK3sKKyAgICB0eXBlZGVmIF9fYml0X2l0ZXJhdG9yPF9DcCwgX0lzQ29uc3Q+IF9JbjsKKyAgICB0eXBlZGVmICB0eXBlbmFtZSBfSW46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSW46Ol9fc3RvcmFnZV90eXBlIF9fc3RvcmFnZV90eXBlOworICAgIGNvbnN0IGludCBfX2JpdHNfcGVyX3dvcmQgPSBfSW46Ol9fYml0c19wZXJfd29yZDsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19sYXN0IC0gX19maXJzdDsKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIC8vIGRvIGZpcnN0IHdvcmQKKyAgICAgICAgaWYgKF9fbGFzdC5fX2N0el8gIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fZG4gPSBfVlNURDo6bWluKHN0YXRpY19jYXN0PGRpZmZlcmVuY2VfdHlwZT4oX19sYXN0Ll9fY3R6XyksIF9fbik7CisgICAgICAgICAgICBfX24gLT0gX19kbjsKKyAgICAgICAgICAgIHVuc2lnbmVkIF9fY2x6X2wgPSBfX2JpdHNfcGVyX3dvcmQgLSBfX2xhc3QuX19jdHpfOworICAgICAgICAgICAgX19zdG9yYWdlX3R5cGUgX19tID0gKH5fX3N0b3JhZ2VfdHlwZSgwKSA8PCAoX19sYXN0Ll9fY3R6XyAtIF9fZG4pKSAmICh+X19zdG9yYWdlX3R5cGUoMCkgPj4gX19jbHpfbCk7CisgICAgICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2IgPSAqX19sYXN0Ll9fc2VnXyAmIF9fbTsKKyAgICAgICAgICAgIHVuc2lnbmVkIF9fY2x6X3IgPSBfX2JpdHNfcGVyX3dvcmQgLSBfX3Jlc3VsdC5fX2N0el87CisgICAgICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2RkbiA9IF9WU1REOjptaW4oX19kbiwgc3RhdGljX2Nhc3Q8ZGlmZmVyZW5jZV90eXBlPihfX3Jlc3VsdC5fX2N0el8pKTsKKyAgICAgICAgICAgIGlmIChfX2RkbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19tID0gKH5fX3N0b3JhZ2VfdHlwZSgwKSA8PCAoX19yZXN1bHQuX19jdHpfIC0gX19kZG4pKSAmICh+X19zdG9yYWdlX3R5cGUoMCkgPj4gX19jbHpfcik7CisgICAgICAgICAgICAgICAgKl9fcmVzdWx0Ll9fc2VnXyAmPSB+X19tOworICAgICAgICAgICAgICAgIGlmIChfX3Jlc3VsdC5fX2N0el8gPiBfX2xhc3QuX19jdHpfKQorICAgICAgICAgICAgICAgICAgICAqX19yZXN1bHQuX19zZWdfIHw9IF9fYiA8PCAoX19yZXN1bHQuX19jdHpfIC0gX19sYXN0Ll9fY3R6Xyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqX19yZXN1bHQuX19zZWdfIHw9IF9fYiA+PiAoX19sYXN0Ll9fY3R6XyAtIF9fcmVzdWx0Ll9fY3R6Xyk7CisgICAgICAgICAgICAgICAgX19yZXN1bHQuX19jdHpfID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KCgoLV9fZGRuICYgKF9fYml0c19wZXJfd29yZCAtIDEpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Jlc3VsdC5fX2N0el8pICAlIF9fYml0c19wZXJfd29yZCk7CisgICAgICAgICAgICAgICAgX19kbiAtPSBfX2RkbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfX2RuID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBfX3Jlc3VsdC5fX2N0el8gPT0gMAorICAgICAgICAgICAgICAgIC0tX19yZXN1bHQuX19zZWdfOworICAgICAgICAgICAgICAgIF9fcmVzdWx0Ll9fY3R6XyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPigtX19kbiAmIChfX2JpdHNfcGVyX3dvcmQgLSAxKSk7CisgICAgICAgICAgICAgICAgX19tID0gfl9fc3RvcmFnZV90eXBlKDApIDw8IF9fcmVzdWx0Ll9fY3R6XzsKKyAgICAgICAgICAgICAgICAqX19yZXN1bHQuX19zZWdfICY9IH5fX207CisgICAgICAgICAgICAgICAgX19sYXN0Ll9fY3R6XyAtPSBfX2RuICsgX19kZG47CisgICAgICAgICAgICAgICAgKl9fcmVzdWx0Ll9fc2VnXyB8PSBfX2IgPDwgKF9fcmVzdWx0Ll9fY3R6XyAtIF9fbGFzdC5fX2N0el8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gX19sYXN0Ll9fY3R6XyA9IDAKKyAgICAgICAgIH0KKyAgICAgICAgLy8gX19sYXN0Ll9fY3R6XyA9PSAwIHx8IF9fbiA9PSAwCisgICAgICAgIC8vIF9fcmVzdWx0Ll9fY3R6XyAhPSAwIHx8IF9fbiA9PSAwCisgICAgICAgIC8vIGRvIG1pZGRsZSB3b3JkcworICAgICAgICB1bnNpZ25lZCBfX2Nsel9yID0gX19iaXRzX3Blcl93b3JkIC0gX19yZXN1bHQuX19jdHpfOworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX20gPSB+X19zdG9yYWdlX3R5cGUoMCkgPj4gX19jbHpfcjsKKyAgICAgICAgZm9yICg7IF9fbiA+PSBfX2JpdHNfcGVyX3dvcmQ7IF9fbiAtPSBfX2JpdHNfcGVyX3dvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fYiA9ICotLV9fbGFzdC5fX3NlZ187CisgICAgICAgICAgICAqX19yZXN1bHQuX19zZWdfICY9IH5fX207CisgICAgICAgICAgICAqX19yZXN1bHQuX19zZWdfIHw9IF9fYiA+PiBfX2Nsel9yOworICAgICAgICAgICAgKi0tX19yZXN1bHQuX19zZWdfICY9IF9fbTsKKyAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gfD0gX19iIDw8IF9fcmVzdWx0Ll9fY3R6XzsKKyAgICAgICAgfQorICAgICAgICAvLyBkbyBsYXN0IHdvcmQKKyAgICAgICAgaWYgKF9fbiA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fbSA9IH5fX3N0b3JhZ2VfdHlwZSgwKSA8PCAoX19iaXRzX3Blcl93b3JkIC0gX19uKTsKKyAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fYiA9ICotLV9fbGFzdC5fX3NlZ18gJiBfX207CisgICAgICAgICAgICBfX2Nsel9yID0gX19iaXRzX3Blcl93b3JkIC0gX19yZXN1bHQuX19jdHpfOworICAgICAgICAgICAgX19zdG9yYWdlX3R5cGUgX19kbiA9IF9WU1REOjptaW4oX19uLCBzdGF0aWNfY2FzdDxkaWZmZXJlbmNlX3R5cGU+KF9fcmVzdWx0Ll9fY3R6XykpOworICAgICAgICAgICAgX19tID0gKH5fX3N0b3JhZ2VfdHlwZSgwKSA8PCAoX19yZXN1bHQuX19jdHpfIC0gX19kbikpICYgKH5fX3N0b3JhZ2VfdHlwZSgwKSA+PiBfX2Nsel9yKTsKKyAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gJj0gfl9fbTsKKyAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gfD0gX19iID4+IChfX2JpdHNfcGVyX3dvcmQgLSBfX3Jlc3VsdC5fX2N0el8pOworICAgICAgICAgICAgX19yZXN1bHQuX19jdHpfID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KCgoLV9fZG4gJiAoX19iaXRzX3Blcl93b3JkIC0gMSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yZXN1bHQuX19jdHpfKSAgJSBfX2JpdHNfcGVyX3dvcmQpOworICAgICAgICAgICAgX19uIC09IF9fZG47CisgICAgICAgICAgICBpZiAoX19uID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBfX3Jlc3VsdC5fX2N0el8gPT0gMAorICAgICAgICAgICAgICAgIC0tX19yZXN1bHQuX19zZWdfOworICAgICAgICAgICAgICAgIF9fcmVzdWx0Ll9fY3R6XyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPigtX19uICYgKF9fYml0c19wZXJfd29yZCAtIDEpKTsKKyAgICAgICAgICAgICAgICBfX20gPSB+X19zdG9yYWdlX3R5cGUoMCkgPDwgX19yZXN1bHQuX19jdHpfOworICAgICAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gJj0gfl9fbTsKKyAgICAgICAgICAgICAgICAqX19yZXN1bHQuX19zZWdfIHw9IF9fYiA8PCAoX19yZXN1bHQuX19jdHpfIC0gKF9fYml0c19wZXJfd29yZCAtIF9fbiAtIF9fZG4pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ3AsIGJvb2wgX0lzQ29uc3Q+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX19iaXRfaXRlcmF0b3I8X0NwLCBmYWxzZT4KK2NvcHlfYmFja3dhcmQoX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD4gX19maXJzdCwgX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD4gX19sYXN0LCBfX2JpdF9pdGVyYXRvcjxfQ3AsIGZhbHNlPiBfX3Jlc3VsdCkKK3sKKyAgICBpZiAoX19sYXN0Ll9fY3R6XyA9PSBfX3Jlc3VsdC5fX2N0el8pCisgICAgICAgIHJldHVybiBfX2NvcHlfYmFja3dhcmRfYWxpZ25lZChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKKyAgICByZXR1cm4gX19jb3B5X2JhY2t3YXJkX3VuYWxpZ25lZChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKK30KKworLy8gbW92ZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NwLCBib29sIF9Jc0NvbnN0PgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19fYml0X2l0ZXJhdG9yPF9DcCwgZmFsc2U+Cittb3ZlKF9fYml0X2l0ZXJhdG9yPF9DcCwgX0lzQ29uc3Q+IF9fZmlyc3QsIF9fYml0X2l0ZXJhdG9yPF9DcCwgX0lzQ29uc3Q+IF9fbGFzdCwgX19iaXRfaXRlcmF0b3I8X0NwLCBmYWxzZT4gX19yZXN1bHQpCit7CisgICAgcmV0dXJuIF9WU1REOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOworfQorCisvLyBtb3ZlX2JhY2t3YXJkCisKK3RlbXBsYXRlIDxjbGFzcyBfQ3AsIGJvb2wgX0lzQ29uc3Q+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX19iaXRfaXRlcmF0b3I8X0NwLCBmYWxzZT4KK21vdmVfYmFja3dhcmQoX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD4gX19maXJzdCwgX19iaXRfaXRlcmF0b3I8X0NwLCBfSXNDb25zdD4gX19sYXN0LCBfX2JpdF9pdGVyYXRvcjxfQ3AsIGZhbHNlPiBfX3Jlc3VsdCkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OmNvcHlfYmFja3dhcmQoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7Cit9CisKKy8vIHN3YXBfcmFuZ2VzCisKK3RlbXBsYXRlIDxjbGFzcyBfX0MxLCBjbGFzcyBfX0MyPgorX19iaXRfaXRlcmF0b3I8X19DMiwgZmFsc2U+CitfX3N3YXBfcmFuZ2VzX2FsaWduZWQoX19iaXRfaXRlcmF0b3I8X19DMSwgZmFsc2U+IF9fZmlyc3QsIF9fYml0X2l0ZXJhdG9yPF9fQzEsIGZhbHNlPiBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgX19iaXRfaXRlcmF0b3I8X19DMiwgZmFsc2U+IF9fcmVzdWx0KQoreworICAgIHR5cGVkZWYgX19iaXRfaXRlcmF0b3I8X19DMSwgZmFsc2U+IF9JMTsKKyAgICB0eXBlZGVmICB0eXBlbmFtZSBfSTE6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSTE6Ol9fc3RvcmFnZV90eXBlIF9fc3RvcmFnZV90eXBlOworICAgIGNvbnN0IGludCBfX2JpdHNfcGVyX3dvcmQgPSBfSTE6Ol9fYml0c19wZXJfd29yZDsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19sYXN0IC0gX19maXJzdDsKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIC8vIGRvIGZpcnN0IHdvcmQKKyAgICAgICAgaWYgKF9fZmlyc3QuX19jdHpfICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIF9fY2x6ID0gX19iaXRzX3Blcl93b3JkIC0gX19maXJzdC5fX2N0el87CisgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19kbiA9IF9WU1REOjptaW4oc3RhdGljX2Nhc3Q8ZGlmZmVyZW5jZV90eXBlPihfX2NseiksIF9fbik7CisgICAgICAgICAgICBfX24gLT0gX19kbjsKKyAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fbSA9ICh+X19zdG9yYWdlX3R5cGUoMCkgPDwgX19maXJzdC5fX2N0el8pICYgKH5fX3N0b3JhZ2VfdHlwZSgwKSA+PiAoX19jbHogLSBfX2RuKSk7CisgICAgICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2IxID0gKl9fZmlyc3QuX19zZWdfICYgX19tOworICAgICAgICAgICAgKl9fZmlyc3QuX19zZWdfICY9IH5fX207CisgICAgICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2IyID0gKl9fcmVzdWx0Ll9fc2VnXyAmIF9fbTsKKyAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gJj0gfl9fbTsKKyAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gfD0gX19iMTsKKyAgICAgICAgICAgICpfX2ZpcnN0Ll9fc2VnXyAgfD0gX19iMjsKKyAgICAgICAgICAgIF9fcmVzdWx0Ll9fc2VnXyArPSAoX19kbiArIF9fcmVzdWx0Ll9fY3R6XykgLyBfX2JpdHNfcGVyX3dvcmQ7CisgICAgICAgICAgICBfX3Jlc3VsdC5fX2N0el8gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oKF9fZG4gKyBfX3Jlc3VsdC5fX2N0el8pICAlIF9fYml0c19wZXJfd29yZCk7CisgICAgICAgICAgICArK19fZmlyc3QuX19zZWdfOworICAgICAgICAgICAgLy8gX19maXJzdC5fX2N0el8gPSAwOworICAgICAgICB9CisgICAgICAgIC8vIF9fZmlyc3QuX19jdHpfID09IDA7CisgICAgICAgIC8vIGRvIG1pZGRsZSB3b3JkcworICAgICAgICBmb3IgKDsgX19uID49IF9fYml0c19wZXJfd29yZDsgX19uIC09IF9fYml0c19wZXJfd29yZCwgKytfX2ZpcnN0Ll9fc2VnXywgKytfX3Jlc3VsdC5fX3NlZ18pCisgICAgICAgICAgICBzd2FwKCpfX2ZpcnN0Ll9fc2VnXywgKl9fcmVzdWx0Ll9fc2VnXyk7CisgICAgICAgIC8vIGRvIGxhc3Qgd29yZAorICAgICAgICBpZiAoX19uID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgX19zdG9yYWdlX3R5cGUgX19tID0gfl9fc3RvcmFnZV90eXBlKDApID4+IChfX2JpdHNfcGVyX3dvcmQgLSBfX24pOworICAgICAgICAgICAgX19zdG9yYWdlX3R5cGUgX19iMSA9ICpfX2ZpcnN0Ll9fc2VnXyAmIF9fbTsKKyAgICAgICAgICAgICpfX2ZpcnN0Ll9fc2VnXyAmPSB+X19tOworICAgICAgICAgICAgX19zdG9yYWdlX3R5cGUgX19iMiA9ICpfX3Jlc3VsdC5fX3NlZ18gJiBfX207CisgICAgICAgICAgICAqX19yZXN1bHQuX19zZWdfICY9IH5fX207CisgICAgICAgICAgICAqX19yZXN1bHQuX19zZWdfIHw9IF9fYjE7CisgICAgICAgICAgICAqX19maXJzdC5fX3NlZ18gIHw9IF9fYjI7CisgICAgICAgICAgICBfX3Jlc3VsdC5fX2N0el8gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oX19uKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfX0MxLCBjbGFzcyBfX0MyPgorX19iaXRfaXRlcmF0b3I8X19DMiwgZmFsc2U+CitfX3N3YXBfcmFuZ2VzX3VuYWxpZ25lZChfX2JpdF9pdGVyYXRvcjxfX0MxLCBmYWxzZT4gX19maXJzdCwgX19iaXRfaXRlcmF0b3I8X19DMSwgZmFsc2U+IF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYml0X2l0ZXJhdG9yPF9fQzIsIGZhbHNlPiBfX3Jlc3VsdCkKK3sKKyAgICB0eXBlZGVmIF9fYml0X2l0ZXJhdG9yPF9fQzEsIGZhbHNlPiBfSTE7CisgICAgdHlwZWRlZiAgdHlwZW5hbWUgX0kxOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0kxOjpfX3N0b3JhZ2VfdHlwZSBfX3N0b3JhZ2VfdHlwZTsKKyAgICBjb25zdCBpbnQgX19iaXRzX3Blcl93b3JkID0gX0kxOjpfX2JpdHNfcGVyX3dvcmQ7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgaWYgKF9fbiA+IDApCisgICAgeworICAgICAgICAvLyBkbyBmaXJzdCB3b3JkCisgICAgICAgIGlmIChfX2ZpcnN0Ll9fY3R6XyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBfX2Nsel9mID0gX19iaXRzX3Blcl93b3JkIC0gX19maXJzdC5fX2N0el87CisgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19kbiA9IF9WU1REOjptaW4oc3RhdGljX2Nhc3Q8ZGlmZmVyZW5jZV90eXBlPihfX2Nsel9mKSwgX19uKTsKKyAgICAgICAgICAgIF9fbiAtPSBfX2RuOworICAgICAgICAgICAgX19zdG9yYWdlX3R5cGUgX19tID0gKH5fX3N0b3JhZ2VfdHlwZSgwKSA8PCBfX2ZpcnN0Ll9fY3R6XykgJiAofl9fc3RvcmFnZV90eXBlKDApID4+IChfX2Nsel9mIC0gX19kbikpOworICAgICAgICAgICAgX19zdG9yYWdlX3R5cGUgX19iMSA9ICpfX2ZpcnN0Ll9fc2VnXyAmIF9fbTsKKyAgICAgICAgICAgICpfX2ZpcnN0Ll9fc2VnXyAmPSB+X19tOworICAgICAgICAgICAgdW5zaWduZWQgX19jbHpfciA9IF9fYml0c19wZXJfd29yZCAtIF9fcmVzdWx0Ll9fY3R6XzsKKyAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fZGRuID0gX1ZTVEQ6Om1pbjxfX3N0b3JhZ2VfdHlwZT4oX19kbiwgX19jbHpfcik7CisgICAgICAgICAgICBfX20gPSAofl9fc3RvcmFnZV90eXBlKDApIDw8IF9fcmVzdWx0Ll9fY3R6XykgJiAofl9fc3RvcmFnZV90eXBlKDApID4+IChfX2Nsel9yIC0gX19kZG4pKTsKKyAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fYjIgPSAqX19yZXN1bHQuX19zZWdfICYgX19tOworICAgICAgICAgICAgKl9fcmVzdWx0Ll9fc2VnXyAmPSB+X19tOworICAgICAgICAgICAgaWYgKF9fcmVzdWx0Ll9fY3R6XyA+IF9fZmlyc3QuX19jdHpfKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9fcyA9IF9fcmVzdWx0Ll9fY3R6XyAtIF9fZmlyc3QuX19jdHpfOworICAgICAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gfD0gX19iMSA8PCBfX3M7CisgICAgICAgICAgICAgICAgKl9fZmlyc3QuX19zZWdfICB8PSBfX2IyID4+IF9fczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBfX3MgPSBfX2ZpcnN0Ll9fY3R6XyAtIF9fcmVzdWx0Ll9fY3R6XzsKKyAgICAgICAgICAgICAgICAqX19yZXN1bHQuX19zZWdfIHw9IF9fYjEgPj4gX19zOworICAgICAgICAgICAgICAgICpfX2ZpcnN0Ll9fc2VnXyAgfD0gX19iMiA8PCBfX3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX3Jlc3VsdC5fX3NlZ18gKz0gKF9fZGRuICsgX19yZXN1bHQuX19jdHpfKSAvIF9fYml0c19wZXJfd29yZDsKKyAgICAgICAgICAgIF9fcmVzdWx0Ll9fY3R6XyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPigoX19kZG4gKyBfX3Jlc3VsdC5fX2N0el8pICAlIF9fYml0c19wZXJfd29yZCk7CisgICAgICAgICAgICBfX2RuIC09IF9fZGRuOworICAgICAgICAgICAgaWYgKF9fZG4gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fbSA9IH5fX3N0b3JhZ2VfdHlwZSgwKSA+PiAoX19iaXRzX3Blcl93b3JkIC0gX19kbik7CisgICAgICAgICAgICAgICAgX19iMiA9ICpfX3Jlc3VsdC5fX3NlZ18gJiBfX207CisgICAgICAgICAgICAgICAgKl9fcmVzdWx0Ll9fc2VnXyAmPSB+X19tOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9fcyA9IF9fZmlyc3QuX19jdHpfICsgX19kZG47CisgICAgICAgICAgICAgICAgKl9fcmVzdWx0Ll9fc2VnXyB8PSBfX2IxID4+IF9fczsKKyAgICAgICAgICAgICAgICAqX19maXJzdC5fX3NlZ18gIHw9IF9fYjIgPDwgX19zOworICAgICAgICAgICAgICAgIF9fcmVzdWx0Ll9fY3R6XyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihfX2RuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrX19maXJzdC5fX3NlZ187CisgICAgICAgICAgICAvLyBfX2ZpcnN0Ll9fY3R6XyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLy8gX19maXJzdC5fX2N0el8gPT0gMDsKKyAgICAgICAgLy8gZG8gbWlkZGxlIHdvcmRzCisgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fbSA9IH5fX3N0b3JhZ2VfdHlwZSgwKSA8PCBfX3Jlc3VsdC5fX2N0el87CisgICAgICAgIHVuc2lnbmVkIF9fY2x6X3IgPSBfX2JpdHNfcGVyX3dvcmQgLSBfX3Jlc3VsdC5fX2N0el87CisgICAgICAgIGZvciAoOyBfX24gPj0gX19iaXRzX3Blcl93b3JkOyBfX24gLT0gX19iaXRzX3Blcl93b3JkLCArK19fZmlyc3QuX19zZWdfKQorICAgICAgICB7CisgICAgICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2IxID0gKl9fZmlyc3QuX19zZWdfOworICAgICAgICAgICAgX19zdG9yYWdlX3R5cGUgX19iMiA9ICpfX3Jlc3VsdC5fX3NlZ18gJiBfX207CisgICAgICAgICAgICAqX19yZXN1bHQuX19zZWdfICY9IH5fX207CisgICAgICAgICAgICAqX19yZXN1bHQuX19zZWdfIHw9IF9fYjEgPDwgX19yZXN1bHQuX19jdHpfOworICAgICAgICAgICAgKl9fZmlyc3QuX19zZWdfICA9IF9fYjIgPj4gX19yZXN1bHQuX19jdHpfOworICAgICAgICAgICAgKytfX3Jlc3VsdC5fX3NlZ187CisgICAgICAgICAgICBfX2IyID0gKl9fcmVzdWx0Ll9fc2VnXyAmIH5fX207CisgICAgICAgICAgICAqX19yZXN1bHQuX19zZWdfICY9IF9fbTsKKyAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gfD0gX19iMSA+PiBfX2Nsel9yOworICAgICAgICAgICAgKl9fZmlyc3QuX19zZWdfICB8PSBfX2IyIDw8IF9fY2x6X3I7CisgICAgICAgIH0KKyAgICAgICAgLy8gZG8gbGFzdCB3b3JkCisgICAgICAgIGlmIChfX24gPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBfX20gPSB+X19zdG9yYWdlX3R5cGUoMCkgPj4gKF9fYml0c19wZXJfd29yZCAtIF9fbik7CisgICAgICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2IxID0gKl9fZmlyc3QuX19zZWdfICYgX19tOworICAgICAgICAgICAgKl9fZmlyc3QuX19zZWdfICY9IH5fX207CisgICAgICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2RuID0gX1ZTVEQ6Om1pbjxfX3N0b3JhZ2VfdHlwZT4oX19uLCBfX2Nsel9yKTsKKyAgICAgICAgICAgIF9fbSA9ICh+X19zdG9yYWdlX3R5cGUoMCkgPDwgX19yZXN1bHQuX19jdHpfKSAmICh+X19zdG9yYWdlX3R5cGUoMCkgPj4gKF9fY2x6X3IgLSBfX2RuKSk7CisgICAgICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2IyID0gKl9fcmVzdWx0Ll9fc2VnXyAmIF9fbTsKKyAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gJj0gfl9fbTsKKyAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gfD0gX19iMSA8PCBfX3Jlc3VsdC5fX2N0el87CisgICAgICAgICAgICAqX19maXJzdC5fX3NlZ18gIHw9IF9fYjIgPj4gX19yZXN1bHQuX19jdHpfOworICAgICAgICAgICAgX19yZXN1bHQuX19zZWdfICs9IChfX2RuICsgX19yZXN1bHQuX19jdHpfKSAvIF9fYml0c19wZXJfd29yZDsKKyAgICAgICAgICAgIF9fcmVzdWx0Ll9fY3R6XyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPigoX19kbiArIF9fcmVzdWx0Ll9fY3R6XykgICUgX19iaXRzX3Blcl93b3JkKTsKKyAgICAgICAgICAgIF9fbiAtPSBfX2RuOworICAgICAgICAgICAgaWYgKF9fbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19tID0gfl9fc3RvcmFnZV90eXBlKDApID4+IChfX2JpdHNfcGVyX3dvcmQgLSBfX24pOworICAgICAgICAgICAgICAgIF9fYjIgPSAqX19yZXN1bHQuX19zZWdfICYgX19tOworICAgICAgICAgICAgICAgICpfX3Jlc3VsdC5fX3NlZ18gJj0gfl9fbTsKKyAgICAgICAgICAgICAgICAqX19yZXN1bHQuX19zZWdfIHw9IF9fYjEgPj4gX19kbjsKKyAgICAgICAgICAgICAgICAqX19maXJzdC5fX3NlZ18gIHw9IF9fYjIgPDwgX19kbjsKKyAgICAgICAgICAgICAgICBfX3Jlc3VsdC5fX2N0el8gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oX19uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfX0MxLCBjbGFzcyBfX0MyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19fYml0X2l0ZXJhdG9yPF9fQzIsIGZhbHNlPgorc3dhcF9yYW5nZXMoX19iaXRfaXRlcmF0b3I8X19DMSwgZmFsc2U+IF9fZmlyc3QxLCBfX2JpdF9pdGVyYXRvcjxfX0MxLCBmYWxzZT4gX19sYXN0MSwKKyAgICAgICAgICAgIF9fYml0X2l0ZXJhdG9yPF9fQzIsIGZhbHNlPiBfX2ZpcnN0MikKK3sKKyAgICBpZiAoX19maXJzdDEuX19jdHpfID09IF9fZmlyc3QyLl9fY3R6XykKKyAgICAgICAgcmV0dXJuIF9fc3dhcF9yYW5nZXNfYWxpZ25lZChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIpOworICAgIHJldHVybiBfX3N3YXBfcmFuZ2VzX3VuYWxpZ25lZChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIpOworfQorCisvLyByb3RhdGUKKwordGVtcGxhdGUgPGNsYXNzIF9DcD4KK3N0cnVjdCBfX2JpdF9hcnJheQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NwOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NwOjpfX3N0b3JhZ2VfdHlwZSAgX19zdG9yYWdlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ3A6Ol9fc3RvcmFnZV9wb2ludGVyIF9fc3RvcmFnZV9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NwOjppdGVyYXRvciAgICAgICAgaXRlcmF0b3I7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIF9fYml0c19wZXJfd29yZCA9IF9DcDo6X19iaXRzX3Blcl93b3JkOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBfTnAgPSA0OworCisgICAgZGlmZmVyZW5jZV90eXBlIF9fc2l6ZV87CisgICAgX19zdG9yYWdlX3R5cGUgX193b3JkX1tfTnBdOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgZGlmZmVyZW5jZV90eXBlIGNhcGFjaXR5KCkKKyAgICAgICAge3JldHVybiBzdGF0aWNfY2FzdDxkaWZmZXJlbmNlX3R5cGU+KF9OcCAqIF9fYml0c19wZXJfd29yZCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZXhwbGljaXQgX19iaXRfYXJyYXkoZGlmZmVyZW5jZV90eXBlIF9fcykgOiBfX3NpemVfKF9fcykge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGl0ZXJhdG9yIGJlZ2luKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpdGVyYXRvcihwb2ludGVyX3RyYWl0czxfX3N0b3JhZ2VfcG9pbnRlcj46OnBvaW50ZXJfdG8oX193b3JkX1swXSksIDApOworICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGl0ZXJhdG9yIGVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gaXRlcmF0b3IocG9pbnRlcl90cmFpdHM8X19zdG9yYWdlX3BvaW50ZXI+Ojpwb2ludGVyX3RvKF9fd29yZF9bMF0pICsgX19zaXplXyAvIF9fYml0c19wZXJfd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KF9fc2l6ZV8gJSBfX2JpdHNfcGVyX3dvcmQpKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NwPgorX19iaXRfaXRlcmF0b3I8X0NwLCBmYWxzZT4KK3JvdGF0ZShfX2JpdF9pdGVyYXRvcjxfQ3AsIGZhbHNlPiBfX2ZpcnN0LCBfX2JpdF9pdGVyYXRvcjxfQ3AsIGZhbHNlPiBfX21pZGRsZSwgX19iaXRfaXRlcmF0b3I8X0NwLCBmYWxzZT4gX19sYXN0KQoreworICAgIHR5cGVkZWYgX19iaXRfaXRlcmF0b3I8X0NwLCBmYWxzZT4gX0kxOworICAgIHR5cGVkZWYgIHR5cGVuYW1lIF9JMTo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19kMSA9IF9fbWlkZGxlIC0gX19maXJzdDsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19kMiA9IF9fbGFzdCAtIF9fbWlkZGxlOworICAgIF9JMSBfX3IgPSBfX2ZpcnN0ICsgX19kMjsKKyAgICB3aGlsZSAoX19kMSAhPSAwICYmIF9fZDIgIT0gMCkKKyAgICB7CisgICAgICAgIGlmIChfX2QxIDw9IF9fZDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX2QxIDw9IF9fYml0X2FycmF5PF9DcD46OmNhcGFjaXR5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19iaXRfYXJyYXk8X0NwPiBfX2IoX19kMSk7CisgICAgICAgICAgICAgICAgX1ZTVEQ6OmNvcHkoX19maXJzdCwgX19taWRkbGUsIF9fYi5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBfVlNURDo6Y29weShfX2IuYmVnaW4oKSwgX19iLmVuZCgpLCBfVlNURDo6Y29weShfX21pZGRsZSwgX19sYXN0LCBfX2ZpcnN0KSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19iaXRfaXRlcmF0b3I8X0NwLCBmYWxzZT4gX19tcCA9IF9WU1REOjpzd2FwX3JhbmdlcyhfX2ZpcnN0LCBfX21pZGRsZSwgX19taWRkbGUpOworICAgICAgICAgICAgICAgIF9fZmlyc3QgPSBfX21pZGRsZTsKKyAgICAgICAgICAgICAgICBfX21pZGRsZSA9IF9fbXA7CisgICAgICAgICAgICAgICAgX19kMiAtPSBfX2QxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9fZDIgPD0gX19iaXRfYXJyYXk8X0NwPjo6Y2FwYWNpdHkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX2JpdF9hcnJheTxfQ3A+IF9fYihfX2QyKTsKKyAgICAgICAgICAgICAgICBfVlNURDo6Y29weShfX21pZGRsZSwgX19sYXN0LCBfX2IuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgX1ZTVEQ6OmNvcHlfYmFja3dhcmQoX19iLmJlZ2luKCksIF9fYi5lbmQoKSwgX1ZTVEQ6OmNvcHlfYmFja3dhcmQoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fYml0X2l0ZXJhdG9yPF9DcCwgZmFsc2U+IF9fbXAgPSBfX2ZpcnN0ICsgX19kMjsKKyAgICAgICAgICAgICAgICBfVlNURDo6c3dhcF9yYW5nZXMoX19maXJzdCwgX19tcCwgX19taWRkbGUpOworICAgICAgICAgICAgICAgIF9fZmlyc3QgPSBfX21wOworICAgICAgICAgICAgICAgIF9fZDEgLT0gX19kMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19yOworfQorCisvLyBlcXVhbAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NwLCBib29sIF9JQzEsIGJvb2wgX0lDMj4KK2Jvb2wKK19fZXF1YWxfdW5hbGlnbmVkKF9fYml0X2l0ZXJhdG9yPF9DcCwgX0lDMT4gX19maXJzdDEsIF9fYml0X2l0ZXJhdG9yPF9DcCwgX0lDMT4gX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgIF9fYml0X2l0ZXJhdG9yPF9DcCwgX0lDMj4gX19maXJzdDIpCit7CisgICAgdHlwZWRlZiBfX2JpdF9pdGVyYXRvcjxfQ3AsIF9JQzE+IF9JdDsKKyAgICB0eXBlZGVmICB0eXBlbmFtZSBfSXQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXQ6Ol9fc3RvcmFnZV90eXBlIF9fc3RvcmFnZV90eXBlOworICAgIHN0YXRpYyBjb25zdCBpbnQgX19iaXRzX3Blcl93b3JkID0gX0l0OjpfX2JpdHNfcGVyX3dvcmQ7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9fbGFzdDEgLSBfX2ZpcnN0MTsKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIC8vIGRvIGZpcnN0IHdvcmQKKyAgICAgICAgaWYgKF9fZmlyc3QxLl9fY3R6XyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBfX2Nsel9mID0gX19iaXRzX3Blcl93b3JkIC0gX19maXJzdDEuX19jdHpfOworICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fZG4gPSBfVlNURDo6bWluKHN0YXRpY19jYXN0PGRpZmZlcmVuY2VfdHlwZT4oX19jbHpfZiksIF9fbik7CisgICAgICAgICAgICBfX24gLT0gX19kbjsKKyAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fbSA9ICh+X19zdG9yYWdlX3R5cGUoMCkgPDwgX19maXJzdDEuX19jdHpfKSAmICh+X19zdG9yYWdlX3R5cGUoMCkgPj4gKF9fY2x6X2YgLSBfX2RuKSk7CisgICAgICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX2IgPSAqX19maXJzdDEuX19zZWdfICYgX19tOworICAgICAgICAgICAgdW5zaWduZWQgX19jbHpfciA9IF9fYml0c19wZXJfd29yZCAtIF9fZmlyc3QyLl9fY3R6XzsKKyAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fZGRuID0gX1ZTVEQ6Om1pbjxfX3N0b3JhZ2VfdHlwZT4oX19kbiwgX19jbHpfcik7CisgICAgICAgICAgICBfX20gPSAofl9fc3RvcmFnZV90eXBlKDApIDw8IF9fZmlyc3QyLl9fY3R6XykgJiAofl9fc3RvcmFnZV90eXBlKDApID4+IChfX2Nsel9yIC0gX19kZG4pKTsKKyAgICAgICAgICAgIGlmIChfX2ZpcnN0Mi5fX2N0el8gPiBfX2ZpcnN0MS5fX2N0el8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCgqX19maXJzdDIuX19zZWdfICYgX19tKSAhPSAoX19iIDw8IChfX2ZpcnN0Mi5fX2N0el8gLSBfX2ZpcnN0MS5fX2N0el8pKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoKl9fZmlyc3QyLl9fc2VnXyAmIF9fbSkgIT0gKF9fYiA+PiAoX19maXJzdDEuX19jdHpfIC0gX19maXJzdDIuX19jdHpfKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fZmlyc3QyLl9fc2VnXyArPSAoX19kZG4gKyBfX2ZpcnN0Mi5fX2N0el8pIC8gX19iaXRzX3Blcl93b3JkOworICAgICAgICAgICAgX19maXJzdDIuX19jdHpfID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KChfX2RkbiArIF9fZmlyc3QyLl9fY3R6XykgICUgX19iaXRzX3Blcl93b3JkKTsKKyAgICAgICAgICAgIF9fZG4gLT0gX19kZG47CisgICAgICAgICAgICBpZiAoX19kbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19tID0gfl9fc3RvcmFnZV90eXBlKDApID4+IChfX2JpdHNfcGVyX3dvcmQgLSBfX2RuKTsKKyAgICAgICAgICAgICAgICBpZiAoKCpfX2ZpcnN0Mi5fX3NlZ18gJiBfX20pICE9IChfX2IgPj4gKF9fZmlyc3QxLl9fY3R6XyArIF9fZGRuKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBfX2ZpcnN0Mi5fX2N0el8gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oX19kbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK19fZmlyc3QxLl9fc2VnXzsKKyAgICAgICAgICAgIC8vIF9fZmlyc3QxLl9fY3R6XyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLy8gX19maXJzdDEuX19jdHpfID09IDA7CisgICAgICAgIC8vIGRvIG1pZGRsZSB3b3JkcworICAgICAgICB1bnNpZ25lZCBfX2Nsel9yID0gX19iaXRzX3Blcl93b3JkIC0gX19maXJzdDIuX19jdHpfOworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX20gPSB+X19zdG9yYWdlX3R5cGUoMCkgPDwgX19maXJzdDIuX19jdHpfOworICAgICAgICBmb3IgKDsgX19uID49IF9fYml0c19wZXJfd29yZDsgX19uIC09IF9fYml0c19wZXJfd29yZCwgKytfX2ZpcnN0MS5fX3NlZ18pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fYiA9ICpfX2ZpcnN0MS5fX3NlZ187CisgICAgICAgICAgICBpZiAoKCpfX2ZpcnN0Mi5fX3NlZ18gJiBfX20pICE9IChfX2IgPDwgX19maXJzdDIuX19jdHpfKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICArK19fZmlyc3QyLl9fc2VnXzsKKyAgICAgICAgICAgIGlmICgoKl9fZmlyc3QyLl9fc2VnXyAmIH5fX20pICE9IChfX2IgPj4gX19jbHpfcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIGRvIGxhc3Qgd29yZAorICAgICAgICBpZiAoX19uID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgX19tID0gfl9fc3RvcmFnZV90eXBlKDApID4+IChfX2JpdHNfcGVyX3dvcmQgLSBfX24pOworICAgICAgICAgICAgX19zdG9yYWdlX3R5cGUgX19iID0gKl9fZmlyc3QxLl9fc2VnXyAmIF9fbTsKKyAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fZG4gPSBfVlNURDo6bWluKF9fbiwgc3RhdGljX2Nhc3Q8ZGlmZmVyZW5jZV90eXBlPihfX2Nsel9yKSk7CisgICAgICAgICAgICBfX20gPSAofl9fc3RvcmFnZV90eXBlKDApIDw8IF9fZmlyc3QyLl9fY3R6XykgJiAofl9fc3RvcmFnZV90eXBlKDApID4+IChfX2Nsel9yIC0gX19kbikpOworICAgICAgICAgICAgaWYgKCgqX19maXJzdDIuX19zZWdfICYgX19tKSAhPSAoX19iIDw8IF9fZmlyc3QyLl9fY3R6XykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgX19maXJzdDIuX19zZWdfICs9IChfX2RuICsgX19maXJzdDIuX19jdHpfKSAvIF9fYml0c19wZXJfd29yZDsKKyAgICAgICAgICAgIF9fZmlyc3QyLl9fY3R6XyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPigoX19kbiArIF9fZmlyc3QyLl9fY3R6XykgICUgX19iaXRzX3Blcl93b3JkKTsKKyAgICAgICAgICAgIF9fbiAtPSBfX2RuOworICAgICAgICAgICAgaWYgKF9fbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19tID0gfl9fc3RvcmFnZV90eXBlKDApID4+IChfX2JpdHNfcGVyX3dvcmQgLSBfX24pOworICAgICAgICAgICAgICAgIGlmICgoKl9fZmlyc3QyLl9fc2VnXyAmIF9fbSkgIT0gKF9fYiA+PiBfX2RuKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NwLCBib29sIF9JQzEsIGJvb2wgX0lDMj4KK2Jvb2wKK19fZXF1YWxfYWxpZ25lZChfX2JpdF9pdGVyYXRvcjxfQ3AsIF9JQzE+IF9fZmlyc3QxLCBfX2JpdF9pdGVyYXRvcjxfQ3AsIF9JQzE+IF9fbGFzdDEsCisgICAgICAgICAgICAgICAgX19iaXRfaXRlcmF0b3I8X0NwLCBfSUMyPiBfX2ZpcnN0MikKK3sKKyAgICB0eXBlZGVmIF9fYml0X2l0ZXJhdG9yPF9DcCwgX0lDMT4gX0l0OworICAgIHR5cGVkZWYgIHR5cGVuYW1lIF9JdDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdDo6X19zdG9yYWdlX3R5cGUgX19zdG9yYWdlX3R5cGU7CisgICAgc3RhdGljIGNvbnN0IGludCBfX2JpdHNfcGVyX3dvcmQgPSBfSXQ6Ol9fYml0c19wZXJfd29yZDsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19sYXN0MSAtIF9fZmlyc3QxOworICAgIGlmIChfX24gPiAwKQorICAgIHsKKyAgICAgICAgLy8gZG8gZmlyc3Qgd29yZAorICAgICAgICBpZiAoX19maXJzdDEuX19jdHpfICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIF9fY2x6ID0gX19iaXRzX3Blcl93b3JkIC0gX19maXJzdDEuX19jdHpfOworICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fZG4gPSBfVlNURDo6bWluKHN0YXRpY19jYXN0PGRpZmZlcmVuY2VfdHlwZT4oX19jbHopLCBfX24pOworICAgICAgICAgICAgX19uIC09IF9fZG47CisgICAgICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX20gPSAofl9fc3RvcmFnZV90eXBlKDApIDw8IF9fZmlyc3QxLl9fY3R6XykgJiAofl9fc3RvcmFnZV90eXBlKDApID4+IChfX2NseiAtIF9fZG4pKTsKKyAgICAgICAgICAgIGlmICgoKl9fZmlyc3QyLl9fc2VnXyAmIF9fbSkgIT0gKCpfX2ZpcnN0MS5fX3NlZ18gJiBfX20pKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICsrX19maXJzdDIuX19zZWdfOworICAgICAgICAgICAgKytfX2ZpcnN0MS5fX3NlZ187CisgICAgICAgICAgICAvLyBfX2ZpcnN0MS5fX2N0el8gPSAwOworICAgICAgICAgICAgLy8gX19maXJzdDIuX19jdHpfID0gMDsKKyAgICAgICAgfQorICAgICAgICAvLyBfX2ZpcnN0MS5fX2N0el8gPT0gMDsKKyAgICAgICAgLy8gX19maXJzdDIuX19jdHpfID09IDA7CisgICAgICAgIC8vIGRvIG1pZGRsZSB3b3JkcworICAgICAgICBmb3IgKDsgX19uID49IF9fYml0c19wZXJfd29yZDsgX19uIC09IF9fYml0c19wZXJfd29yZCwgKytfX2ZpcnN0MS5fX3NlZ18sICsrX19maXJzdDIuX19zZWdfKQorICAgICAgICAgICAgaWYgKCpfX2ZpcnN0Mi5fX3NlZ18gIT0gKl9fZmlyc3QxLl9fc2VnXykKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIGRvIGxhc3Qgd29yZAorICAgICAgICBpZiAoX19uID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgX19zdG9yYWdlX3R5cGUgX19tID0gfl9fc3RvcmFnZV90eXBlKDApID4+IChfX2JpdHNfcGVyX3dvcmQgLSBfX24pOworICAgICAgICAgICAgaWYgKCgqX19maXJzdDIuX19zZWdfICYgX19tKSAhPSAoKl9fZmlyc3QxLl9fc2VnXyAmIF9fbSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NwLCBib29sIF9JQzEsIGJvb2wgX0lDMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitlcXVhbChfX2JpdF9pdGVyYXRvcjxfQ3AsIF9JQzE+IF9fZmlyc3QxLCBfX2JpdF9pdGVyYXRvcjxfQ3AsIF9JQzE+IF9fbGFzdDEsIF9fYml0X2l0ZXJhdG9yPF9DcCwgX0lDMj4gX19maXJzdDIpCit7CisgICAgaWYgKF9fZmlyc3QxLl9fY3R6XyA9PSBfX2ZpcnN0Mi5fX2N0el8pCisgICAgICAgIHJldHVybiBfX2VxdWFsX2FsaWduZWQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyKTsKKyAgICByZXR1cm4gX19lcXVhbF91bmFsaWduZWQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DcCwgYm9vbCBfSXNDb25zdCwKKyAgICAgICAgICB0eXBlbmFtZSBfQ3A6Ol9fc3RvcmFnZV90eXBlPgorY2xhc3MgX19iaXRfaXRlcmF0b3IKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DcDo6ZGlmZmVyZW5jZV90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9fYml0X2l0ZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPF9Jc0NvbnN0LCBfX2JpdF9jb25zdF9yZWZlcmVuY2U8X0NwPiwgX19iaXRfcmVmZXJlbmNlPF9DcD4gPjo6dHlwZSByZWZlcmVuY2U7CisgICAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworCitwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NwOjpfX3N0b3JhZ2VfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N0b3JhZ2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPF9Jc0NvbnN0LCB0eXBlbmFtZSBfQ3A6Ol9fY29uc3Rfc3RvcmFnZV9wb2ludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9DcDo6X19zdG9yYWdlX3BvaW50ZXI+Ojp0eXBlICBfX3N0b3JhZ2VfcG9pbnRlcjsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgX19iaXRzX3Blcl93b3JkID0gX0NwOjpfX2JpdHNfcGVyX3dvcmQ7CisKKyAgICBfX3N0b3JhZ2VfcG9pbnRlciBfX3NlZ187CisgICAgdW5zaWduZWQgICAgICAgICAgX19jdHpfOworCitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX2JpdF9pdGVyYXRvcigpIF9OT0VYQ0VQVAorI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisgICAgOiBfX3NlZ18obnVsbHB0ciksIF9fY3R6XygwKQorI2VuZGlmCisgICAge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2JpdF9pdGVyYXRvcihjb25zdCBfX2JpdF9pdGVyYXRvcjxfQ3AsIGZhbHNlPiYgX19pdCkgX05PRVhDRVBUCisgICAgICAgIDogX19zZWdfKF9faXQuX19zZWdfKSwgX19jdHpfKF9faXQuX19jdHpfKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gcmVmZXJlbmNlKF9fc2VnXywgX19zdG9yYWdlX3R5cGUoMSkgPDwgX19jdHpfKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fYml0X2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICB7CisgICAgICAgIGlmIChfX2N0el8gIT0gX19iaXRzX3Blcl93b3JkLTEpCisgICAgICAgICAgICArK19fY3R6XzsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfX2N0el8gPSAwOworICAgICAgICAgICAgKytfX3NlZ187CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX19iaXRfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpCisgICAgeworICAgICAgICBfX2JpdF9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOworICAgICAgICArKygqdGhpcyk7CisgICAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fYml0X2l0ZXJhdG9yJiBvcGVyYXRvci0tKCkKKyAgICB7CisgICAgICAgIGlmIChfX2N0el8gIT0gMCkKKyAgICAgICAgICAgIC0tX19jdHpfOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fY3R6XyA9IF9fYml0c19wZXJfd29yZCAtIDE7CisgICAgICAgICAgICAtLV9fc2VnXzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX2JpdF9pdGVyYXRvciBvcGVyYXRvci0tKGludCkKKyAgICB7CisgICAgICAgIF9fYml0X2l0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CisgICAgICAgIC0tKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuIF9fdG1wOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX19iaXRfaXRlcmF0b3ImIG9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIF9fbikKKyAgICB7CisgICAgICAgIGlmIChfX24gPj0gMCkKKyAgICAgICAgICAgIF9fc2VnXyArPSAoX19uICsgX19jdHpfKSAvIF9fYml0c19wZXJfd29yZDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX19zZWdfICs9IHN0YXRpY19jYXN0PGRpZmZlcmVuY2VfdHlwZT4oX19uIC0gX19iaXRzX3Blcl93b3JkICsgX19jdHpfICsgMSkKKyAgICAgICAgICAgICAgICAgICAgLyBzdGF0aWNfY2FzdDxkaWZmZXJlbmNlX3R5cGU+KF9fYml0c19wZXJfd29yZCk7CisgICAgICAgIF9fbiAmPSAoX19iaXRzX3Blcl93b3JkIC0gMSk7CisgICAgICAgIF9fY3R6XyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPigoX19uICsgX19jdHpfKSAgJSBfX2JpdHNfcGVyX3dvcmQpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX2JpdF9pdGVyYXRvciYgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgX19uKQorICAgIHsKKyAgICAgICAgcmV0dXJuICp0aGlzICs9IC1fX247CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX2JpdF9pdGVyYXRvciBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICAgIF9fYml0X2l0ZXJhdG9yIF9fdCgqdGhpcyk7CisgICAgICAgIF9fdCArPSBfX247CisgICAgICAgIHJldHVybiBfX3Q7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX2JpdF9pdGVyYXRvciBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICAgIF9fYml0X2l0ZXJhdG9yIF9fdCgqdGhpcyk7CisgICAgICAgIF9fdCAtPSBfX247CisgICAgICAgIHJldHVybiBfX3Q7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGZyaWVuZCBfX2JpdF9pdGVyYXRvciBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9fbiwgY29uc3QgX19iaXRfaXRlcmF0b3ImIF9faXQpIHtyZXR1cm4gX19pdCArIF9fbjt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZnJpZW5kIGRpZmZlcmVuY2VfdHlwZSBvcGVyYXRvci0oY29uc3QgX19iaXRfaXRlcmF0b3ImIF9feCwgY29uc3QgX19iaXRfaXRlcmF0b3ImIF9feSkKKyAgICAgICAge3JldHVybiAoX194Ll9fc2VnXyAtIF9feS5fX3NlZ18pICogX19iaXRzX3Blcl93b3JkICsgX194Ll9fY3R6XyAtIF9feS5fX2N0el87fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByZWZlcmVuY2Ugb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdCB7cmV0dXJuICooKnRoaXMgKyBfX24pO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfX2JpdF9pdGVyYXRvciYgX194LCBjb25zdCBfX2JpdF9pdGVyYXRvciYgX195KQorICAgICAgICB7cmV0dXJuIF9feC5fX3NlZ18gPT0gX195Ll9fc2VnXyAmJiBfX3guX19jdHpfID09IF9feS5fX2N0el87fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF9fYml0X2l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9fYml0X2l0ZXJhdG9yJiBfX3kpCisgICAgICAgIHtyZXR1cm4gIShfX3ggPT0gX195KTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZyaWVuZCBib29sIG9wZXJhdG9yPChjb25zdCBfX2JpdF9pdGVyYXRvciYgX194LCBjb25zdCBfX2JpdF9pdGVyYXRvciYgX195KQorICAgICAgICB7cmV0dXJuIF9feC5fX3NlZ18gPCBfX3kuX19zZWdfIHx8IChfX3guX19zZWdfID09IF9feS5fX3NlZ18gJiYgX194Ll9fY3R6XyA8IF9feS5fX2N0el8pO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KGNvbnN0IF9fYml0X2l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9fYml0X2l0ZXJhdG9yJiBfX3kpCisgICAgICAgIHtyZXR1cm4gX195IDwgX194O30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZnJpZW5kIGJvb2wgb3BlcmF0b3I8PShjb25zdCBfX2JpdF9pdGVyYXRvciYgX194LCBjb25zdCBfX2JpdF9pdGVyYXRvciYgX195KQorICAgICAgICB7cmV0dXJuICEoX195IDwgX194KTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZyaWVuZCBib29sIG9wZXJhdG9yPj0oY29uc3QgX19iaXRfaXRlcmF0b3ImIF9feCwgY29uc3QgX19iaXRfaXRlcmF0b3ImIF9feSkKKyAgICAgICAge3JldHVybiAhKF9feCA8IF9feSk7fQorCitwcml2YXRlOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2JpdF9pdGVyYXRvcihfX3N0b3JhZ2VfcG9pbnRlciBfX3MsIHVuc2lnbmVkIF9fY3R6KSBfTk9FWENFUFQKKyAgICAgICAgOiBfX3NlZ18oX19zKSwgX19jdHpfKF9fY3R6KSB7fQorCisgICAgZnJpZW5kIHR5cGVuYW1lIF9DcDo6X19zZWxmOworCisgICAgZnJpZW5kIGNsYXNzIF9fYml0X3JlZmVyZW5jZTxfQ3A+OworICAgIGZyaWVuZCBjbGFzcyBfX2JpdF9jb25zdF9yZWZlcmVuY2U8X0NwPjsKKyAgICBmcmllbmQgY2xhc3MgX19iaXRfaXRlcmF0b3I8X0NwLCB0cnVlPjsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0RwPiBmcmllbmQgc3RydWN0IF9fYml0X2FycmF5OworICAgIHRlbXBsYXRlIDxjbGFzcyBfRHA+IGZyaWVuZCB2b2lkIF9fZmlsbF9uX2ZhbHNlKF9fYml0X2l0ZXJhdG9yPF9EcCwgZmFsc2U+IF9fZmlyc3QsIHR5cGVuYW1lIF9EcDo6c2l6ZV90eXBlIF9fbik7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9EcD4gZnJpZW5kIHZvaWQgX19maWxsX25fdHJ1ZShfX2JpdF9pdGVyYXRvcjxfRHAsIGZhbHNlPiBfX2ZpcnN0LCB0eXBlbmFtZSBfRHA6OnNpemVfdHlwZSBfX24pOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRHAsIGJvb2wgX0lDPiBmcmllbmQgX19iaXRfaXRlcmF0b3I8X0RwLCBmYWxzZT4gX19jb3B5X2FsaWduZWQoX19iaXRfaXRlcmF0b3I8X0RwLCBfSUM+IF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iaXRfaXRlcmF0b3I8X0RwLCBfSUM+IF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JpdF9pdGVyYXRvcjxfRHAsIGZhbHNlPiBfX3Jlc3VsdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9EcCwgYm9vbCBfSUM+IGZyaWVuZCBfX2JpdF9pdGVyYXRvcjxfRHAsIGZhbHNlPiBfX2NvcHlfdW5hbGlnbmVkKF9fYml0X2l0ZXJhdG9yPF9EcCwgX0lDPiBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iaXRfaXRlcmF0b3I8X0RwLCBfSUM+IF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYml0X2l0ZXJhdG9yPF9EcCwgZmFsc2U+IF9fcmVzdWx0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0RwLCBib29sIF9JQz4gZnJpZW5kIF9fYml0X2l0ZXJhdG9yPF9EcCwgZmFsc2U+IGNvcHkoX19iaXRfaXRlcmF0b3I8X0RwLCBfSUM+IF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JpdF9pdGVyYXRvcjxfRHAsIF9JQz4gX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iaXRfaXRlcmF0b3I8X0RwLCBmYWxzZT4gX19yZXN1bHQpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRHAsIGJvb2wgX0lDPiBmcmllbmQgX19iaXRfaXRlcmF0b3I8X0RwLCBmYWxzZT4gX19jb3B5X2JhY2t3YXJkX2FsaWduZWQoX19iaXRfaXRlcmF0b3I8X0RwLCBfSUM+IF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iaXRfaXRlcmF0b3I8X0RwLCBfSUM+IF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JpdF9pdGVyYXRvcjxfRHAsIGZhbHNlPiBfX3Jlc3VsdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9EcCwgYm9vbCBfSUM+IGZyaWVuZCBfX2JpdF9pdGVyYXRvcjxfRHAsIGZhbHNlPiBfX2NvcHlfYmFja3dhcmRfdW5hbGlnbmVkKF9fYml0X2l0ZXJhdG9yPF9EcCwgX0lDPiBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iaXRfaXRlcmF0b3I8X0RwLCBfSUM+IF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYml0X2l0ZXJhdG9yPF9EcCwgZmFsc2U+IF9fcmVzdWx0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0RwLCBib29sIF9JQz4gZnJpZW5kIF9fYml0X2l0ZXJhdG9yPF9EcCwgZmFsc2U+IGNvcHlfYmFja3dhcmQoX19iaXRfaXRlcmF0b3I8X0RwLCBfSUM+IF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JpdF9pdGVyYXRvcjxfRHAsIF9JQz4gX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iaXRfaXRlcmF0b3I8X0RwLCBmYWxzZT4gX19yZXN1bHQpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfX0MxLCBjbGFzcyBfX0MyPmZyaWVuZCBfX2JpdF9pdGVyYXRvcjxfX0MyLCBmYWxzZT4gX19zd2FwX3Jhbmdlc19hbGlnbmVkKF9fYml0X2l0ZXJhdG9yPF9fQzEsIGZhbHNlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JpdF9pdGVyYXRvcjxfX0MxLCBmYWxzZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iaXRfaXRlcmF0b3I8X19DMiwgZmFsc2U+KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX19DMSwgY2xhc3MgX19DMj5mcmllbmQgX19iaXRfaXRlcmF0b3I8X19DMiwgZmFsc2U+IF9fc3dhcF9yYW5nZXNfdW5hbGlnbmVkKF9fYml0X2l0ZXJhdG9yPF9fQzEsIGZhbHNlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYml0X2l0ZXJhdG9yPF9fQzEsIGZhbHNlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYml0X2l0ZXJhdG9yPF9fQzIsIGZhbHNlPik7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9fQzEsIGNsYXNzIF9fQzI+ZnJpZW5kIF9fYml0X2l0ZXJhdG9yPF9fQzIsIGZhbHNlPiBzd2FwX3JhbmdlcyhfX2JpdF9pdGVyYXRvcjxfX0MxLCBmYWxzZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JpdF9pdGVyYXRvcjxfX0MxLCBmYWxzZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JpdF9pdGVyYXRvcjxfX0MyLCBmYWxzZT4pOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRHA+IGZyaWVuZCBfX2JpdF9pdGVyYXRvcjxfRHAsIGZhbHNlPiByb3RhdGUoX19iaXRfaXRlcmF0b3I8X0RwLCBmYWxzZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iaXRfaXRlcmF0b3I8X0RwLCBmYWxzZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iaXRfaXRlcmF0b3I8X0RwLCBmYWxzZT4pOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRHAsIGJvb2wgX0lDMSwgYm9vbCBfSUMyPiBmcmllbmQgYm9vbCBfX2VxdWFsX2FsaWduZWQoX19iaXRfaXRlcmF0b3I8X0RwLCBfSUMxPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JpdF9pdGVyYXRvcjxfRHAsIF9JQzE+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYml0X2l0ZXJhdG9yPF9EcCwgX0lDMj4pOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRHAsIGJvb2wgX0lDMSwgYm9vbCBfSUMyPiBmcmllbmQgYm9vbCBfX2VxdWFsX3VuYWxpZ25lZChfX2JpdF9pdGVyYXRvcjxfRHAsIF9JQzE+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iaXRfaXRlcmF0b3I8X0RwLCBfSUMxPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYml0X2l0ZXJhdG9yPF9EcCwgX0lDMj4pOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRHAsIGJvb2wgX0lDMSwgYm9vbCBfSUMyPiBmcmllbmQgYm9vbCBlcXVhbChfX2JpdF9pdGVyYXRvcjxfRHAsIF9JQzE+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYml0X2l0ZXJhdG9yPF9EcCwgX0lDMT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iaXRfaXRlcmF0b3I8X0RwLCBfSUMyPik7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9EcCwgYm9vbCBfSUM+IGZyaWVuZCBfX2JpdF9pdGVyYXRvcjxfRHAsIF9JQz4gX19maW5kX2Jvb2xfdHJ1ZShfX2JpdF9pdGVyYXRvcjxfRHAsIF9JQz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9EcDo6c2l6ZV90eXBlKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0RwLCBib29sIF9JQz4gZnJpZW5kIF9fYml0X2l0ZXJhdG9yPF9EcCwgX0lDPiBfX2ZpbmRfYm9vbF9mYWxzZShfX2JpdF9pdGVyYXRvcjxfRHAsIF9JQz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfRHA6OnNpemVfdHlwZSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9EcCwgYm9vbCBfSUM+IGZyaWVuZCB0eXBlbmFtZSBfX2JpdF9pdGVyYXRvcjxfRHAsIF9JQz46OmRpZmZlcmVuY2VfdHlwZQorICAgICAgICAgICAgICAgICAgIF9fY291bnRfYm9vbF90cnVlKF9fYml0X2l0ZXJhdG9yPF9EcCwgX0lDPiwgdHlwZW5hbWUgX0RwOjpzaXplX3R5cGUpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRHAsIGJvb2wgX0lDPiBmcmllbmQgdHlwZW5hbWUgX19iaXRfaXRlcmF0b3I8X0RwLCBfSUM+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICAgICAgICAgICAgICAgICBfX2NvdW50X2Jvb2xfZmFsc2UoX19iaXRfaXRlcmF0b3I8X0RwLCBfSUM+LCB0eXBlbmFtZSBfRHA6OnNpemVfdHlwZSk7Cit9OworCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKK19MSUJDUFBfUE9QX01BQ1JPUworCisjZW5kaWYgIC8vIF9MSUJDUFBfX19CSVRfUkVGRVJFTkNFCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX19ic2RfbG9jYWxlX2RlZmF1bHRzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX19ic2RfbG9jYWxlX2RlZmF1bHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JjNDA3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX2JzZF9sb2NhbGVfZGVmYXVsdHMuaApAQCAtMCwwICsxLDM3IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIF9fYnNkX2xvY2FsZV9kZWZhdWx0cy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoZSBCU0RzIGhhdmUgbG90cyBvZiAqX2wgZnVuY3Rpb25zLiAgV2UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgdGhvc2Ugc3ltYm9scworLy8gb24gb3RoZXIgcGxhdGZvcm1zIHRob3VnaCwgZm9yIGZlYXIgb2YgY29uZmxpY3RzIHdpdGggdXNlciBjb2RlLiAgU28gaGVyZSwKKy8vIHdlIHdpbGwgZGVmaW5lIHRoZSBtYXBwaW5nIGZyb20gYW4gaW50ZXJuYWwgbWFjcm8gdG8gdGhlIHJlYWwgQlNEIHN5bWJvbC4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9CU0RfTE9DQUxFX0RFRkFVTFRTX0gKKyNkZWZpbmUgX0xJQkNQUF9CU0RfTE9DQUxFX0RFRkFVTFRTX0gKKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKKyNkZWZpbmUgX19saWJjcHBfbWJfY3VyX21heF9sKGxvYykgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX0NVUl9NQVhfTChsb2MpCisjZGVmaW5lIF9fbGliY3BwX2J0b3djX2woY2gsIGxvYykgICAgICAgICAgICAgICAgICAgICAgICAgICBidG93Y19sKGNoLCBsb2MpCisjZGVmaW5lIF9fbGliY3BwX3djdG9iX2wod2NoLCBsb2MpICAgICAgICAgICAgICAgICAgICAgICAgICB3Y3RvYl9sKHdjaCwgbG9jKQorI2RlZmluZSBfX2xpYmNwcF93Y3NucnRvbWJzX2woZHN0LCBzcmMsIG53YywgbGVuLCBwcywgbG9jKSAgd2NzbnJ0b21ic19sKGRzdCwgc3JjLCBud2MsIGxlbiwgcHMsIGxvYykKKyNkZWZpbmUgX19saWJjcHBfd2NydG9tYl9sKHNyYywgd2MsIHBzLCBsb2MpICAgICAgICAgICAgICAgIHdjcnRvbWJfbChzcmMsIHdjLCBwcywgbG9jKQorI2RlZmluZSBfX2xpYmNwcF9tYnNucnRvd2NzX2woZHN0LCBzcmMsIG5tcywgbGVuLCBwcywgbG9jKSAgbWJzbnJ0b3djc19sKGRzdCwgc3JjLCBubXMsIGxlbiwgcHMsIGxvYykKKyNkZWZpbmUgX19saWJjcHBfbWJydG93Y19sKHB3YywgcywgbiwgcHMsIGwpICAgICAgICAgICAgICAgIG1icnRvd2NfbChwd2MsIHMsIG4sIHBzLCBsKQorI2RlZmluZSBfX2xpYmNwcF9tYnRvd2NfbChwd2MsIHBtYiwgbWF4LCBsKSAgICAgICAgICAgICAgICAgbWJ0b3djX2wocHdjLCBwbWIsIG1heCwgbCkKKyNkZWZpbmUgX19saWJjcHBfbWJybGVuX2wocywgbiwgcHMsIGwpICAgICAgICAgICAgICAgICAgICAgIG1icmxlbl9sKHMsIG4sIHBzLCBsKQorI2RlZmluZSBfX2xpYmNwcF9sb2NhbGVjb252X2wobCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlY29udl9sKGwpCisjZGVmaW5lIF9fbGliY3BwX21ic3J0b3djc19sKGRlc3QsIHNyYywgbGVuLCBwcywgbCkgICAgICAgICBtYnNydG93Y3NfbChkZXN0LCBzcmMsIGxlbiwgcHMsIGwpCisjZGVmaW5lIF9fbGliY3BwX3NucHJpbnRmX2woLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50Zl9sKF9fVkFfQVJHU19fKQorI2RlZmluZSBfX2xpYmNwcF9hc3ByaW50Zl9sKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNwcmludGZfbChfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19saWJjcHBfc3NjYW5mX2woLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzY2FuZl9sKF9fVkFfQVJHU19fKQorCisjZW5kaWYgLy8gX0xJQkNQUF9CU0RfTE9DQUxFX0RFRkFVTFRTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX2JzZF9sb2NhbGVfZmFsbGJhY2tzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX19ic2RfbG9jYWxlX2ZhbGxiYWNrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlOWUwOTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX19ic2RfbG9jYWxlX2ZhbGxiYWNrcy5oCkBAIC0wLDAgKzEsMTQwIEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIF9fYnNkX2xvY2FsZV9mYWxsYmFja3MuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoZSBCU0RzIGhhdmUgbG90cyBvZiAqX2wgZnVuY3Rpb25zLiAgVGhpcyBmaWxlIHByb3ZpZGVzIHJlaW1wbGVtZW50YXRpb25zCisvLyBvZiB0aG9zZSBmdW5jdGlvbnMgZm9yIG5vbi1CU0QgcGxhdGZvcm1zLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0JTRF9MT0NBTEVfRkFMTEJBQ0tTX0RFRkFVTFRTX0gKKyNkZWZpbmUgX0xJQkNQUF9CU0RfTE9DQUxFX0ZBTExCQUNLU19ERUZBVUxUU19ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKworaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORQorZGVjbHR5cGUoTUJfQ1VSX01BWCkgX19saWJjcHBfbWJfY3VyX21heF9sKGxvY2FsZV90IF9fbCkKK3sKKyAgICBfX2xpYmNwcF9sb2NhbGVfZ3VhcmQgX19jdXJyZW50KF9fbCk7CisgICAgcmV0dXJuIE1CX0NVUl9NQVg7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUKK3dpbnRfdCBfX2xpYmNwcF9idG93Y19sKGludCBfX2MsIGxvY2FsZV90IF9fbCkKK3sKKyAgICBfX2xpYmNwcF9sb2NhbGVfZ3VhcmQgX19jdXJyZW50KF9fbCk7CisgICAgcmV0dXJuIGJ0b3djKF9fYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUKK2ludCBfX2xpYmNwcF93Y3RvYl9sKHdpbnRfdCBfX2MsIGxvY2FsZV90IF9fbCkKK3sKKyAgICBfX2xpYmNwcF9sb2NhbGVfZ3VhcmQgX19jdXJyZW50KF9fbCk7CisgICAgcmV0dXJuIHdjdG9iKF9fYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUKK3NpemVfdCBfX2xpYmNwcF93Y3NucnRvbWJzX2woY2hhciAqX19kZXN0LCBjb25zdCB3Y2hhcl90ICoqX19zcmMsIHNpemVfdCBfX253YywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19wcywgbG9jYWxlX3QgX19sKQoreworICAgIF9fbGliY3BwX2xvY2FsZV9ndWFyZCBfX2N1cnJlbnQoX19sKTsKKyAgICByZXR1cm4gd2NzbnJ0b21icyhfX2Rlc3QsIF9fc3JjLCBfX253YywgX19sZW4sIF9fcHMpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCitzaXplX3QgX19saWJjcHBfd2NydG9tYl9sKGNoYXIgKl9fcywgd2NoYXJfdCBfX3djLCBtYnN0YXRlX3QgKl9fcHMsIGxvY2FsZV90IF9fbCkKK3sKKyAgICBfX2xpYmNwcF9sb2NhbGVfZ3VhcmQgX19jdXJyZW50KF9fbCk7CisgICAgcmV0dXJuIHdjcnRvbWIoX19zLCBfX3djLCBfX3BzKTsKK30KKworaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORQorc2l6ZV90IF9fbGliY3BwX21ic25ydG93Y3NfbCh3Y2hhcl90ICogX19kZXN0LCBjb25zdCBjaGFyICoqX19zcmMsIHNpemVfdCBfX25tcywKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19wcywgbG9jYWxlX3QgX19sKQoreworICAgIF9fbGliY3BwX2xvY2FsZV9ndWFyZCBfX2N1cnJlbnQoX19sKTsKKyAgICByZXR1cm4gbWJzbnJ0b3djcyhfX2Rlc3QsIF9fc3JjLCBfX25tcywgX19sZW4sIF9fcHMpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCitzaXplX3QgX19saWJjcHBfbWJydG93Y19sKHdjaGFyX3QgKl9fcHdjLCBjb25zdCBjaGFyICpfX3MsIHNpemVfdCBfX24sCisgICAgICAgICAgICAgICAgICAgbWJzdGF0ZV90ICpfX3BzLCBsb2NhbGVfdCBfX2wpCit7CisgICAgX19saWJjcHBfbG9jYWxlX2d1YXJkIF9fY3VycmVudChfX2wpOworICAgIHJldHVybiBtYnJ0b3djKF9fcHdjLCBfX3MsIF9fbiwgX19wcyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUKK2ludCBfX2xpYmNwcF9tYnRvd2NfbCh3Y2hhcl90ICpfX3B3YywgY29uc3QgY2hhciAqX19wbWIsIHNpemVfdCBfX21heCwgbG9jYWxlX3QgX19sKQoreworICAgIF9fbGliY3BwX2xvY2FsZV9ndWFyZCBfX2N1cnJlbnQoX19sKTsKKyAgICByZXR1cm4gbWJ0b3djKF9fcHdjLCBfX3BtYiwgX19tYXgpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCitzaXplX3QgX19saWJjcHBfbWJybGVuX2woY29uc3QgY2hhciAqX19zLCBzaXplX3QgX19uLCBtYnN0YXRlX3QgKl9fcHMsIGxvY2FsZV90IF9fbCkKK3sKKyAgICBfX2xpYmNwcF9sb2NhbGVfZ3VhcmQgX19jdXJyZW50KF9fbCk7CisgICAgcmV0dXJuIG1icmxlbihfX3MsIF9fbiwgX19wcyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUKK2xjb252ICpfX2xpYmNwcF9sb2NhbGVjb252X2wobG9jYWxlX3QgX19sKQoreworICAgIF9fbGliY3BwX2xvY2FsZV9ndWFyZCBfX2N1cnJlbnQoX19sKTsKKyAgICByZXR1cm4gbG9jYWxlY29udigpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCitzaXplX3QgX19saWJjcHBfbWJzcnRvd2NzX2wod2NoYXJfdCAqX19kZXN0LCBjb25zdCBjaGFyICoqX19zcmMsIHNpemVfdCBfX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgIG1ic3RhdGVfdCAqX19wcywgbG9jYWxlX3QgX19sKQoreworICAgIF9fbGliY3BwX2xvY2FsZV9ndWFyZCBfX2N1cnJlbnQoX19sKTsKKyAgICByZXR1cm4gbWJzcnRvd2NzKF9fZGVzdCwgX19zcmMsIF9fbGVuLCBfX3BzKTsKK30KKworaW5saW5lCitpbnQgX19saWJjcHBfc25wcmludGZfbChjaGFyICpfX3MsIHNpemVfdCBfX24sIGxvY2FsZV90IF9fbCwgY29uc3QgY2hhciAqX19mb3JtYXQsIC4uLikgeworICAgIHZhX2xpc3QgX192YTsKKyAgICB2YV9zdGFydChfX3ZhLCBfX2Zvcm1hdCk7CisgICAgX19saWJjcHBfbG9jYWxlX2d1YXJkIF9fY3VycmVudChfX2wpOworICAgIGludCBfX3JlcyA9IHZzbnByaW50ZihfX3MsIF9fbiwgX19mb3JtYXQsIF9fdmEpOworICAgIHZhX2VuZChfX3ZhKTsKKyAgICByZXR1cm4gX19yZXM7Cit9CisKK2lubGluZQoraW50IF9fbGliY3BwX2FzcHJpbnRmX2woY2hhciAqKl9fcywgbG9jYWxlX3QgX19sLCBjb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKSB7CisgICAgdmFfbGlzdCBfX3ZhOworICAgIHZhX3N0YXJ0KF9fdmEsIF9fZm9ybWF0KTsKKyAgICBfX2xpYmNwcF9sb2NhbGVfZ3VhcmQgX19jdXJyZW50KF9fbCk7CisgICAgaW50IF9fcmVzID0gdmFzcHJpbnRmKF9fcywgX19mb3JtYXQsIF9fdmEpOworICAgIHZhX2VuZChfX3ZhKTsKKyAgICByZXR1cm4gX19yZXM7Cit9CisKK2lubGluZQoraW50IF9fbGliY3BwX3NzY2FuZl9sKGNvbnN0IGNoYXIgKl9fcywgbG9jYWxlX3QgX19sLCBjb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKSB7CisgICAgdmFfbGlzdCBfX3ZhOworICAgIHZhX3N0YXJ0KF9fdmEsIF9fZm9ybWF0KTsKKyAgICBfX2xpYmNwcF9sb2NhbGVfZ3VhcmQgX19jdXJyZW50KF9fbCk7CisgICAgaW50IF9fcmVzID0gdnNzY2FuZihfX3MsIF9fZm9ybWF0LCBfX3ZhKTsKKyAgICB2YV9lbmQoX192YSk7CisgICAgcmV0dXJuIF9fcmVzOworfQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKKyNlbmRpZiAvLyBfTElCQ1BQX0JTRF9MT0NBTEVfRkFMTEJBQ0tTX0RFRkFVTFRTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX2NvbmZpZyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTUwZWRlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fY29uZmlnCkBAIC0wLDAgKzEsMTMxOSBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIF9fY29uZmlnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9DT05GSUcKKyNkZWZpbmUgX0xJQkNQUF9DT05GSUcKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fY2xhbmdfXykKKyMgIGlmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorIyAgICBkZWZpbmUgX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUgorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisjaWZkZWYgX19HTlVDX18KKyMgIGRlZmluZSBfR05VQ19WRVIgKF9fR05VQ19fICogMTAwICsgX19HTlVDX01JTk9SX18pCisvLyBUaGUgX0dOVUNfVkVSX05FVyBtYWNybyBiZXR0ZXIgcmVwcmVzZW50cyB0aGUgbmV3IEdDQyB2ZXJzaW9uaW5nIHNjaGVtZQorLy8gaW50cm9kdWNlZCBpbiBHQ0MgNS4wLgorIyAgZGVmaW5lIF9HTlVDX1ZFUl9ORVcgKF9HTlVDX1ZFUiAqIDEwICsgX19HTlVDX1BBVENITEVWRUxfXykKKyNlbHNlCisjICBkZWZpbmUgX0dOVUNfVkVSIDAKKyMgIGRlZmluZSBfR05VQ19WRVJfTkVXIDAKKyNlbmRpZgorCisjZGVmaW5lIF9MSUJDUFBfVkVSU0lPTiA3MDAwCisKKyNpZm5kZWYgX0xJQkNQUF9BQklfVkVSU0lPTgorI2RlZmluZSBfTElCQ1BQX0FCSV9WRVJTSU9OIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0VMRl9fKQorIyAgZGVmaW5lIF9MSUJDUFBfT0JKRUNUX0ZPUk1BVF9FTEYgICAxCisjZWxpZiBkZWZpbmVkKF9fTUFDSF9fKQorIyAgZGVmaW5lIF9MSUJDUFBfT0JKRUNUX0ZPUk1BVF9NQUNITyAxCisjZWxpZiBkZWZpbmVkKF9XSU4zMikKKyMgIGRlZmluZSBfTElCQ1BQX09CSkVDVF9GT1JNQVRfQ09GRiAgMQorI2VsaWYgZGVmaW5lZChfX3dhc21fXykKKyMgIGRlZmluZSBfTElCQ1BQX09CSkVDVF9GT1JNQVRfV0FTTSAgMQorI2Vsc2UKKyMgIGVycm9yIFVua25vd24gb2JqZWN0IGZpbGUgZm9ybWF0CisjZW5kaWYKKworI2lmIGRlZmluZWQoX0xJQkNQUF9BQklfVU5TVEFCTEUpIHx8IF9MSUJDUFBfQUJJX1ZFUlNJT04gPj0gMgorLy8gQ2hhbmdlIHNob3J0IHN0cmluZyByZXByZXNlbnRhdGlvbiBzbyB0aGF0IHN0cmluZyBkYXRhIHN0YXJ0cyBhdCBvZmZzZXQgMCwKKy8vIGltcHJvdmluZyBpdHMgYWxpZ25tZW50IGluIHNvbWUgY2FzZXMuCisjICBkZWZpbmUgX0xJQkNQUF9BQklfQUxURVJOQVRFX1NUUklOR19MQVlPVVQKKy8vIEZpeCBkZXF1ZSBpdGVyYXRvciB0eXBlIGluIG9yZGVyIHRvIHN1cHBvcnQgaW5jb21wbGV0ZSB0eXBlcy4KKyMgIGRlZmluZSBfTElCQ1BQX0FCSV9JTkNPTVBMRVRFX1RZUEVTX0lOX0RFUVVFCisvLyBGaXggdW5kZWZpbmVkIGJlaGF2aW9yIGluIGhvdyBzdGQ6Omxpc3Qgc3RvcmVzIGl0cyBsaW5rZWQgbm9kZXMuCisjICBkZWZpbmUgX0xJQkNQUF9BQklfTElTVF9SRU1PVkVfTk9ERV9QT0lOVEVSX1VCCisvLyBGaXggdW5kZWZpbmVkIGJlaGF2aW9yIGluICBob3cgX190cmVlIHN0b3JlcyBpdHMgZW5kIGFuZCBwYXJlbnQgbm9kZXMuCisjICBkZWZpbmUgX0xJQkNQUF9BQklfVFJFRV9SRU1PVkVfTk9ERV9QT0lOVEVSX1VCCisvLyBGaXggdW5kZWZpbmVkIGJlaGF2aW9yIGluIGhvdyBfX2hhc2hfdGFibGUgc3RvcmVzIGl0cyBwb2ludGVyIHR5cGVzLgorIyAgZGVmaW5lIF9MSUJDUFBfQUJJX0ZJWF9VTk9SREVSRURfTk9ERV9QT0lOVEVSX1VCCisjICBkZWZpbmUgX0xJQkNQUF9BQklfRk9SV0FSRF9MSVNUX1JFTU9WRV9OT0RFX1BPSU5URVJfVUIKKyMgIGRlZmluZSBfTElCQ1BQX0FCSV9GSVhfVU5PUkRFUkVEX0NPTlRBSU5FUl9TSVpFX1RZUEUKKy8vIERvbid0IHVzZSBhIG51bGxwdHJfdCBzaW11bGF0aW9uIHR5cGUgaW4gQysrMDMgaW5zdGVhZCB1c2luZyBDKysxMSBudWxscHRyCisvLyBwcm92aWRlZCB1bmRlciB0aGUgYWx0ZXJuYXRlIGtleXdvcmQgX19udWxscHRyLCB3aGljaCBjaGFuZ2VzIHRoZSBtYW5nbGluZworLy8gb2YgbnVsbHB0cl90LiBUaGlzIG9wdGlvbiBpcyBBQkkgaW5jb21wYXRpYmxlIHdpdGggR0NDIGluIEMrKzAzIG1vZGUuCisjICBkZWZpbmUgX0xJQkNQUF9BQklfQUxXQVlTX1VTRV9DWFgxMV9OVUxMUFRSCisvLyBEZWZpbmUgdGhlIGBwb2ludGVyX3NhZmV0eWAgZW51bSBhcyBhIEMrKzExIHN0cm9uZ2x5IHR5cGVkIGVudW1lcmF0aW9uCisvLyBpbnN0ZWFkIG9mIGFzIGEgY2xhc3Mgc2ltdWxhdGluZyBhbiBlbnVtLiBJZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkCisvLyBgcG9pbnRlcl9zYWZldHlgIGFuZCBgZ2V0X3BvaW50ZXJfc2FmZXR5KClgIHdpbGwgbm8gbG9uZ2VyIGJlIGF2YWlsYWJsZQorLy8gaW4gQysrMDMuCisjICBkZWZpbmUgX0xJQkNQUF9BQklfUE9JTlRFUl9TQUZFVFlfRU5VTV9UWVBFCisvLyBEZWZpbmUgYSBrZXkgZnVuY3Rpb24gZm9yIGBiYWRfZnVuY3Rpb25fY2FsbGAgaW4gdGhlIGxpYnJhcnksIHRvIGNlbnRyYWxpemUKKy8vIGl0cyB2dGFibGUgYW5kIHR5cGVpbmZvIHRvIGxpYmMrKyByYXRoZXIgdGhhbiBoYXZpbmcgYWxsIG90aGVyIGxpYnJhcmllcworLy8gdXNpbmcgdGhhdCBjbGFzcyBkZWZpbmUgdGhlaXIgb3duIGNvcGllcy4KKyMgIGRlZmluZSBfTElCQ1BQX0FCSV9CQURfRlVOQ1RJT05fQ0FMTF9LRVlfRlVOQ1RJT04KKy8vIEVuYWJsZSBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBfX2RvX2dldF8odW4pc2lnbmVkIHdoaWNoIGF2b2lkcyByZWR1bmRhbnQgY29waWVzLgorIyAgZGVmaW5lIF9MSUJDUFBfQUJJX09QVElNSVpFRF9MT0NBTEVfTlVNX0dFVAorLy8gVXNlIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBpbnRlZ2VyIHR5cGUgdG8gcmVwcmVzZW50IHRoZSBpbmRleCBvZiB0aGUgdmFyaWFudC4KKy8vIFByZXZpb3VzbHkgbGliYysrIHVzZWQgInVuc2lnbmVkIGludCIgZXhjbHVzaXZseS4KKyMgIGRlZmluZSBfTElCQ1BQX0FCSV9WQVJJQU5UX0lOREVYX1RZUEVfT1BUSU1JWkFUSU9OCisjZWxpZiBfTElCQ1BQX0FCSV9WRVJTSU9OID09IDEKKyMgIGlmICFkZWZpbmVkKF9MSUJDUFBfT0JKRUNUX0ZPUk1BVF9DT0ZGKQorLy8gRW5hYmxlIGNvbXBpbGluZyBjb3BpZXMgb2Ygbm93IGlubGluZSBtZXRob2RzIGludG8gdGhlIGR5bGliIHRvIHN1cHBvcnQKKy8vIGFwcGxpY2F0aW9ucyBjb21waWxlZCBhZ2FpbnN0IG9sZGVyIGxpYnJhcmllcy4gVGhpcyBpcyB1bm5lY2Vzc2FyeSB3aXRoCisvLyBDT0ZGIGRsbGV4cG9ydCBzZW1hbnRpY3MsIHNpbmNlIGRsbGV4cG9ydCBmb3JjZXMgYSBub24taW5saW5lIGRlZmluaXRpb24KKy8vIG9mIGlubGluZSBmdW5jdGlvbnMgdG8gYmUgZW1pdHRlZCBhbnl3YXkuIE91ciBvd24gbm9uLWlubGluZSBjb3B5IHdvdWxkCisvLyBjb25mbGljdCB3aXRoIHRoZSBkbGxleHBvcnQtZW1pdHRlZCBjb3B5LCBzbyB3ZSBkaXNhYmxlIGl0LgorIyAgICBkZWZpbmUgX0xJQkNQUF9ERVBSRUNBVEVEX0FCSV9MRUdBQ1lfTElCUkFSWV9ERUZJTklUSU9OU19GT1JfSU5MSU5FX0ZVTkNUSU9OUworIyAgZW5kaWYKKy8vIEZlYXR1cmUgbWFjcm9zIGZvciBkaXNhYmxpbmcgcHJlIEFCSSB2MSBmZWF0dXJlcy4gQWxsIG9mIHRoZXNlIG9wdGlvbnMKKy8vIGFyZSBkZXByZWNhdGVkLgorIyAgaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyMgICAgZGVmaW5lIF9MSUJDUFBfREVQUkVDQVRFRF9BQklfRElTQUJMRV9QQUlSX1RSSVZJQUxfQ09QWV9DVE9SCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfTElCQ1BQX1RSSVZJQUxfUEFJUl9DT1BZX0NUT1IKKyNlcnJvciAiX0xJQkNQUF9UUklWSUFMX1BBSVJfQ09QWV9DVE9SIiBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiBcCisgICAgICAgdXNlIF9MSUJDUFBfREVQUkVDQVRFRF9BQklfRElTQUJMRV9QQUlSX1RSSVZJQUxfQ09QWV9DVE9SIGluc3RlYWQKKyNlbmRpZgorCisjZGVmaW5lIF9MSUJDUFBfQ09OQ0FUMShfTElCQ1BQX1gsX0xJQkNQUF9ZKSBfTElCQ1BQX1gjI19MSUJDUFBfWQorI2RlZmluZSBfTElCQ1BQX0NPTkNBVChfTElCQ1BQX1gsX0xJQkNQUF9ZKSBfTElCQ1BQX0NPTkNBVDEoX0xJQkNQUF9YLF9MSUJDUFBfWSkKKworI2RlZmluZSBfTElCQ1BQX05BTUVTUEFDRSBfTElCQ1BQX0NPTkNBVChfXyxfTElCQ1BQX0FCSV9WRVJTSU9OKQorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjZGVmaW5lIF9MSUJDUFBfQ1hYMDNfTEFORworI2VuZGlmCisKKyNpZm5kZWYgX19oYXNfYXR0cmlidXRlCisjZGVmaW5lIF9faGFzX2F0dHJpYnV0ZShfX3gpIDAKKyNlbmRpZgorCisjaWZuZGVmIF9faGFzX2J1aWx0aW4KKyNkZWZpbmUgX19oYXNfYnVpbHRpbihfX3gpIDAKKyNlbmRpZgorCisjaWZuZGVmIF9faGFzX2V4dGVuc2lvbgorI2RlZmluZSBfX2hhc19leHRlbnNpb24oX194KSAwCisjZW5kaWYKKworI2lmbmRlZiBfX2hhc19mZWF0dXJlCisjZGVmaW5lIF9faGFzX2ZlYXR1cmUoX194KSAwCisjZW5kaWYKKworI2lmbmRlZiBfX2hhc19jcHBfYXR0cmlidXRlCisjZGVmaW5lIF9faGFzX2NwcF9hdHRyaWJ1dGUoX194KSAwCisjZW5kaWYKKworLy8gJ19faXNfaWRlbnRpZmllcicgcmV0dXJucyAnMCcgaWYgJ19feCcgaXMgYSByZXNlcnZlZCBpZGVudGlmaWVyIHByb3ZpZGVkIGJ5CisvLyB0aGUgY29tcGlsZXIgYW5kICcxJyBvdGhlcndpc2UuCisjaWZuZGVmIF9faXNfaWRlbnRpZmllcgorI2RlZmluZSBfX2lzX2lkZW50aWZpZXIoX194KSAxCisjZW5kaWYKKworI2lmbmRlZiBfX2hhc19kZWNsc3BlY19hdHRyaWJ1dGUKKyNkZWZpbmUgX19oYXNfZGVjbHNwZWNfYXR0cmlidXRlKF9feCkgMAorI2VuZGlmCisKKyNkZWZpbmUgX19oYXNfa2V5d29yZChfX3gpICEoX19pc19pZGVudGlmaWVyKF9feCkpCisKKyNpZmRlZiBfX2hhc19pbmNsdWRlCisjICBkZWZpbmUgX19saWJjcHBfaGFzX2luY2x1ZGUoX194KSBfX2hhc19pbmNsdWRlKF9feCkKKyNlbHNlCisjICBkZWZpbmUgX19saWJjcHBfaGFzX2luY2x1ZGUoX194KSAwCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19jbGFuZ19fKQorIyAgZGVmaW5lIF9MSUJDUFBfQ09NUElMRVJfQ0xBTkcKKyMgIGlmbmRlZiBfX2FwcGxlX2J1aWxkX3ZlcnNpb25fXworIyAgICBkZWZpbmUgX0xJQkNQUF9DTEFOR19WRVIgKF9fY2xhbmdfbWFqb3JfXyAqIDEwMCArIF9fY2xhbmdfbWlub3JfXykKKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorIyAgZGVmaW5lIF9MSUJDUFBfQ09NUElMRVJfR0NDCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyAgZGVmaW5lIF9MSUJDUFBfQ09NUElMRVJfTVNWQworI2VsaWYgZGVmaW5lZChfX0lCTUNQUF9fKQorIyAgZGVmaW5lIF9MSUJDUFBfQ09NUElMRVJfSUJNCisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX0NMQU5HX1ZFUgorI2RlZmluZSBfTElCQ1BQX0NMQU5HX1ZFUiAwCisjZW5kaWYKKworLy8gRklYTUU6IEFCSSBkZXRlY3Rpb24gc2hvdWxkIGJlIGRvbmUgdmlhIGNvbXBpbGVyIGJ1aWx0aW4gbWFjcm9zLiBUaGlzCisvLyBpcyBqdXN0IGEgcGxhY2Vob2xkZXIgdW50aWwgQ2xhbmcgaW1wbGVtZW50cyBzdWNoIG1hY3Jvcy4gRm9yIG5vdyBhc3N1bWUKKy8vIHRoYXQgV2luZG93cyBjb21waWxlcnMgcHJldGVuZGluZyB0byBiZSBNU1ZDKysgdGFyZ2V0IHRoZSBNaWNyb3NvZnQgQUJJLAorLy8gYW5kIGFsbG93IHRoZSB1c2VyIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgQUJJIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSB0aGlzCisvLyBoZXVyaXN0aWMgZmFsbHMgc2hvcnQuCisjaWYgZGVmaW5lZChfTElCQ1BQX0FCSV9GT1JDRV9JVEFOSVVNKSAmJiBkZWZpbmVkKF9MSUJDUFBfQUJJX0ZPUkNFX01JQ1JPU09GVCkKKyMgIGVycm9yICJPbmx5IG9uZSBvZiBfTElCQ1BQX0FCSV9GT1JDRV9JVEFOSVVNIGFuZCBfTElCQ1BQX0FCSV9GT1JDRV9NSUNST1NPRlQgY2FuIGJlIGRlZmluZWQiCisjZWxpZiBkZWZpbmVkKF9MSUJDUFBfQUJJX0ZPUkNFX0lUQU5JVU0pCisjICBkZWZpbmUgX0xJQkNQUF9BQklfSVRBTklVTQorI2VsaWYgZGVmaW5lZChfTElCQ1BQX0FCSV9GT1JDRV9NSUNST1NPRlQpCisjICBkZWZpbmUgX0xJQkNQUF9BQklfTUlDUk9TT0ZUCisjZWxzZQorIyAgaWYgZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoX01TQ19WRVIpCisjICAgIGRlZmluZSBfTElCQ1BQX0FCSV9NSUNST1NPRlQKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9MSUJDUFBfQUJJX0lUQU5JVU0KKyMgIGVuZGlmCisjZW5kaWYKKworLy8gTmVlZCB0byBkZXRlY3Qgd2hpY2ggbGliYyB3ZSdyZSB1c2luZyBpZiB3ZSdyZSBvbiBMaW51eC4KKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKyMgIGluY2x1ZGUgPGZlYXR1cmVzLmg+CisjICBpZiBkZWZpbmVkKF9fR0xJQkNfUFJFUkVRKQorIyAgICBkZWZpbmUgX0xJQkNQUF9HTElCQ19QUkVSRVEoYSwgYikgX19HTElCQ19QUkVSRVEoYSwgYikKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9MSUJDUFBfR0xJQkNfUFJFUkVRKGEsIGIpIDAKKyMgIGVuZGlmIC8vIGRlZmluZWQoX19HTElCQ19QUkVSRVEpCisjZW5kaWYgLy8gZGVmaW5lZChfX2xpbnV4X18pCisKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworIyAgaWYgX19MSVRUTEVfRU5ESUFOX18KKyMgICAgZGVmaW5lIF9MSUJDUFBfTElUVExFX0VORElBTgorIyAgZW5kaWYgIC8vIF9fTElUVExFX0VORElBTl9fCisjZW5kaWYgIC8vIF9fTElUVExFX0VORElBTl9fCisKKyNpZmRlZiBfX0JJR19FTkRJQU5fXworIyAgaWYgX19CSUdfRU5ESUFOX18KKyMgICAgZGVmaW5lIF9MSUJDUFBfQklHX0VORElBTgorIyAgZW5kaWYgIC8vIF9fQklHX0VORElBTl9fCisjZW5kaWYgIC8vIF9fQklHX0VORElBTl9fCisKKyNpZmRlZiBfX0JZVEVfT1JERVJfXworIyAgaWYgX19CWVRFX09SREVSX18gPT0gX19PUkRFUl9MSVRUTEVfRU5ESUFOX18KKyMgICAgZGVmaW5lIF9MSUJDUFBfTElUVExFX0VORElBTgorIyAgZWxpZiBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0JJR19FTkRJQU5fXworIyAgICBkZWZpbmUgX0xJQkNQUF9CSUdfRU5ESUFOCisjICBlbmRpZiAvLyBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0JJR19FTkRJQU5fXworI2VuZGlmIC8vIF9fQllURV9PUkRFUl9fCisKKyNpZmRlZiBfX0ZyZWVCU0RfXworIyAgaW5jbHVkZSA8c3lzL2VuZGlhbi5oPgorIyAgaWYgX0JZVEVfT1JERVIgPT0gX0xJVFRMRV9FTkRJQU4KKyMgICAgZGVmaW5lIF9MSUJDUFBfTElUVExFX0VORElBTgorIyAgZWxzZSAgLy8gX0JZVEVfT1JERVIgPT0gX0xJVFRMRV9FTkRJQU4KKyMgICAgZGVmaW5lIF9MSUJDUFBfQklHX0VORElBTgorIyAgZW5kaWYgIC8vIF9CWVRFX09SREVSID09IF9MSVRUTEVfRU5ESUFOCisjICBpZm5kZWYgX19MT05HX0xPTkdfU1VQUE9SVEVECisjICAgIGRlZmluZSBfTElCQ1BQX0hBU19OT19MT05HX0xPTkcKKyMgIGVuZGlmICAvLyBfX0xPTkdfTE9OR19TVVBQT1JURUQKKyNlbmRpZiAgLy8gX19GcmVlQlNEX18KKworI2lmZGVmIF9fTmV0QlNEX18KKyMgIGluY2x1ZGUgPHN5cy9lbmRpYW4uaD4KKyMgIGlmIF9CWVRFX09SREVSID09IF9MSVRUTEVfRU5ESUFOCisjICAgIGRlZmluZSBfTElCQ1BQX0xJVFRMRV9FTkRJQU4KKyMgIGVsc2UgIC8vIF9CWVRFX09SREVSID09IF9MSVRUTEVfRU5ESUFOCisjICAgIGRlZmluZSBfTElCQ1BQX0JJR19FTkRJQU4KKyMgIGVuZGlmICAvLyBfQllURV9PUkRFUiA9PSBfTElUVExFX0VORElBTgorIyAgZGVmaW5lIF9MSUJDUFBfSEFTX1FVSUNLX0VYSVQKKyNlbmRpZiAgLy8gX19OZXRCU0RfXworCisjaWYgZGVmaW5lZChfV0lOMzIpCisjICBkZWZpbmUgX0xJQkNQUF9XSU4zMkFQSQorIyAgZGVmaW5lIF9MSUJDUFBfTElUVExFX0VORElBTgorIyAgZGVmaW5lIF9MSUJDUFBfU0hPUlRfV0NIQVIgICAxCisvLyBCb3RoIE1pbkdXIGFuZCBuYXRpdmUgTVNWQyBwcm92aWRlIGEgIk1TVkMiLWxpa2UgZW52aXJvbWVudAorIyAgZGVmaW5lIF9MSUJDUFBfTVNWQ1JUX0xJS0UKKy8vIElmIG1pbmd3IG5vdCBleHBsaWNpdGx5IGRldGVjdGVkLCBhc3N1bWUgdXNpbmcgTVMgQyBydW50aW1lIG9ubHkgaWYKKy8vIGEgTVMgY29tcGF0aWJpbGl0eSB2ZXJzaW9uIGlzIHNwZWNpZmllZC4KKyMgIGlmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fTUlOR1czMl9fKQorIyAgICBkZWZpbmUgX0xJQkNQUF9NU1ZDUlQgLy8gVXNpbmcgTWljcm9zb2Z0J3MgQyBSdW50aW1lIGxpYnJhcnkKKyMgIGVuZGlmCisjICBpZiAoZGVmaW5lZChfTV9BTUQ2NCkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkgfHwgKGRlZmluZWQoX01fQVJNKSB8fCBkZWZpbmVkKF9fYXJtX18pKQorIyAgICBkZWZpbmUgX0xJQkNQUF9IQVNfQklUU0NBTjY0CisjICBlbmRpZgorIyAgZGVmaW5lIF9MSUJDUFBfSEFTX09QRU5fV0lUSF9XQ0hBUgorIyAgaWYgZGVmaW5lZChfTElCQ1BQX01TVkNSVCkKKyMgICAgZGVmaW5lIF9MSUJDUFBfSEFTX1FVSUNLX0VYSVQKKyMgIGVuZGlmCisKKy8vIFNvbWUgQ1JUIEFQSXMgYXJlIHVuYXZhaWxhYmxlIHRvIHN0b3JlIGFwcHMKKyMgIGlmIGRlZmluZWQoV0lOQVBJX0ZBTUlMWSkKKyMgICAgaW5jbHVkZSA8d2luYXBpZmFtaWx5Lmg+CisjICAgIGlmICFXSU5BUElfRkFNSUxZX1BBUlRJVElPTihXSU5BUElfUEFSVElUSU9OX0RFU0tUT1ApICYmICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoIWRlZmluZWQoV0lOQVBJX1BBUlRJVElPTl9TWVNURU0pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICFXSU5BUElfRkFNSUxZX1BBUlRJVElPTihXSU5BUElfUEFSVElUSU9OX1NZU1RFTSkpCisjICAgICAgZGVmaW5lIF9MSUJDUFBfV0lORE9XU19TVE9SRV9BUFAKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYgLy8gZGVmaW5lZChfV0lOMzIpCisKKyNpZmRlZiBfX3N1bl9fCisjICBpbmNsdWRlIDxzeXMvaXNhX2RlZnMuaD4KKyMgIGlmZGVmIF9MSVRUTEVfRU5ESUFOCisjICAgIGRlZmluZSBfTElCQ1BQX0xJVFRMRV9FTkRJQU4KKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9MSUJDUFBfQklHX0VORElBTgorIyAgZW5kaWYKKyNlbmRpZiAvLyBfX3N1bl9fCisKKyNpZiBkZWZpbmVkKF9fQ2xvdWRBQklfXykKKyAgIC8vIENlcnRhaW4gYXJjaGl0ZWN0dXJlcyBwcm92aWRlIGFyYzRyYW5kb20oKS4gUHJlZmVyIHVzaW5nCisgICAvLyBhcmM0cmFuZG9tKCkgb3ZlciAvZGV2L3t1LH1yYW5kb20gdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBvYnRhaW4KKyAgIC8vIHJhbmRvbSBkYXRhIGV2ZW4gd2hlbiB1c2luZyBzYW5kYm94aW5nIG1lY2hhbmlzbXMgc3VjaCBhcyBjaHJvb3RzLAorICAgLy8gQ2Fwc2ljdW0sIGV0Yy4KKyMgIGRlZmluZSBfTElCQ1BQX1VTSU5HX0FSQzRfUkFORE9NCisjZWxpZiBkZWZpbmVkKF9fRnVjaHNpYV9fKQorIyAgZGVmaW5lIF9MSUJDUFBfVVNJTkdfR0VURU5UUk9QWQorI2VsaWYgZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKKyAgIC8vIE5hQ2wncyBzYW5kYm94ICh3aGljaCBQTmFDbCBhbHNvIHJ1bnMgaW4pIGRvZXNuJ3QgYWxsb3cgZmlsZXN5c3RlbSBhY2Nlc3MsCisgICAvLyBpbmNsdWRpbmcgYWNjZXNzZXMgdG8gdGhlIHNwZWNpYWwgZmlsZXMgdW5kZXIgL2Rldi4gQysrMTEncworICAgLy8gc3RkOjpyYW5kb21fZGV2aWNlIGlzIGluc3RlYWQgZXhwb3NlZCB0aHJvdWdoIGEgTmFDbCBzeXNjYWxsLgorIyAgZGVmaW5lIF9MSUJDUFBfVVNJTkdfTkFDTF9SQU5ET00KKyNlbGlmIGRlZmluZWQoX0xJQkNQUF9XSU4zMkFQSSkKKyMgIGRlZmluZSBfTElCQ1BQX1VTSU5HX1dJTjMyX1JBTkRPTQorI2Vsc2UKKyMgIGRlZmluZSBfTElCQ1BQX1VTSU5HX0RFVl9SQU5ET00KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9MSVRUTEVfRU5ESUFOKSAmJiAhZGVmaW5lZChfTElCQ1BQX0JJR19FTkRJQU4pCisjICBpbmNsdWRlIDxlbmRpYW4uaD4KKyMgIGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgICAgZGVmaW5lIF9MSUJDUFBfTElUVExFX0VORElBTgorIyAgZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisjICAgIGRlZmluZSBfTElCQ1BQX0JJR19FTkRJQU4KKyMgIGVsc2UgIC8vIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgICAgZXJyb3IgdW5hYmxlIHRvIGRldGVybWluZSBlbmRpYW4KKyMgIGVuZGlmCisjZW5kaWYgIC8vICFkZWZpbmVkKF9MSUJDUFBfTElUVExFX0VORElBTikgJiYgIWRlZmluZWQoX0xJQkNQUF9CSUdfRU5ESUFOKQorCisjaWYgX19oYXNfYXR0cmlidXRlKF9fbm9fc2FuaXRpemVfXykgJiYgIWRlZmluZWQoX0xJQkNQUF9DT01QSUxFUl9HQ0MpCisjICBkZWZpbmUgX0xJQkNQUF9OT19DRkkgX19hdHRyaWJ1dGVfXygoX19ub19zYW5pdGl6ZV9fKCJjZmkiKSkpCisjZWxzZQorIyAgZGVmaW5lIF9MSUJDUFBfTk9fQ0ZJCisjZW5kaWYKKworI2lmIGRlZmluZWQoX0xJQkNQUF9DT01QSUxFUl9DTEFORykKKworLy8gX0xJQkNQUF9BTFRFUk5BVEVfU1RSSU5HX0xBWU9VVCBpcyBhbiBvbGQgbmFtZSBmb3IKKy8vIF9MSUJDUFBfQUJJX0FMVEVSTkFURV9TVFJJTkdfTEFZT1VUIGxlZnQgaGVyZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyNpZiAoZGVmaW5lZChfX0FQUExFX18pICYmICFkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAgICAgICBcCisgICAgICghZGVmaW5lZChfX2FybV9fKSB8fCBfX0FSTV9BUkNIXzdLX18gPj0gMikpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRlZmluZWQoX0xJQkNQUF9BTFRFUk5BVEVfU1RSSU5HX0xBWU9VVCkKKyNkZWZpbmUgX0xJQkNQUF9BQklfQUxURVJOQVRFX1NUUklOR19MQVlPVVQKKyNlbmRpZgorCisjaWYgX19oYXNfZmVhdHVyZShjeHhfYWxpZ25hcykKKyMgIGRlZmluZSBfQUxJR05BU19UWVBFKHgpIGFsaWduYXMoeCkKKyMgIGRlZmluZSBfQUxJR05BUyh4KSBhbGlnbmFzKHgpCisjZWxzZQorIyAgZGVmaW5lIF9BTElHTkFTX1RZUEUoeCkgX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oX19hbGlnbm9mKHgpKSkpCisjICBkZWZpbmUgX0FMSUdOQVMoeCkgX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oeCkpKQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKK3R5cGVkZWYgX19jaGFyMTZfdCBjaGFyMTZfdDsKK3R5cGVkZWYgX19jaGFyMzJfdCBjaGFyMzJfdDsKKyNlbmRpZgorCisjaWYgIShfX2hhc19mZWF0dXJlKGN4eF9leGNlcHRpb25zKSkgJiYgIWRlZmluZWQoX0xJQkNQUF9OT19FWENFUFRJT05TKQorI2RlZmluZSBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyNlbmRpZgorCisjaWYgIShfX2hhc19mZWF0dXJlKGN4eF9ydHRpKSkgJiYgIWRlZmluZWQoX0xJQkNQUF9OT19SVFRJKQorI2RlZmluZSBfTElCQ1BQX05PX1JUVEkKKyNlbmRpZgorCisjaWYgIShfX2hhc19mZWF0dXJlKGN4eF9zdHJvbmdfZW51bXMpKQorI2RlZmluZSBfTElCQ1BQX0hBU19OT19TVFJPTkdfRU5VTVMKKyNlbmRpZgorCisjaWYgIShfX2hhc19mZWF0dXJlKGN4eF9kZWNsdHlwZSkpCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX0RFQ0xUWVBFCisjZW5kaWYKKworI2lmIF9faGFzX2ZlYXR1cmUoY3h4X2F0dHJpYnV0ZXMpCisjICBkZWZpbmUgX0xJQkNQUF9OT1JFVFVSTiBbW25vcmV0dXJuXV0KKyNlbHNlCisjICBkZWZpbmUgX0xJQkNQUF9OT1JFVFVSTiBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKQorI2VuZGlmCisKKyNpZiAhKF9faGFzX2ZlYXR1cmUoY3h4X2xhbWJkYXMpKQorI2RlZmluZSBfTElCQ1BQX0hBU19OT19MQU1CREFTCisjZW5kaWYKKworI2lmICEoX19oYXNfZmVhdHVyZShjeHhfbnVsbHB0cikpCisjICBpZiAoX19oYXNfZXh0ZW5zaW9uKGN4eF9udWxscHRyKSB8fCBfX2hhc19rZXl3b3JkKF9fbnVsbHB0cikpICYmIGRlZmluZWQoX0xJQkNQUF9BQklfQUxXQVlTX1VTRV9DWFgxMV9OVUxMUFRSKQorIyAgICBkZWZpbmUgbnVsbHB0ciBfX251bGxwdHIKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9MSUJDUFBfSEFTX05PX05VTExQVFIKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmICEoX19oYXNfZmVhdHVyZShjeHhfcnZhbHVlX3JlZmVyZW5jZXMpKQorI2RlZmluZSBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworI2VuZGlmCisKKyNpZiAhKF9faGFzX2ZlYXR1cmUoY3h4X2F1dG9fdHlwZSkpCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX0FVVE9fVFlQRQorI2VuZGlmCisKKyNpZiAhKF9faGFzX2ZlYXR1cmUoY3h4X3ZhcmlhZGljX3RlbXBsYXRlcykpCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworI2VuZGlmCisKKyNpZiAhKF9faGFzX2ZlYXR1cmUoY3h4X2dlbmVyYWxpemVkX2luaXRpYWxpemVycykpCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX0dFTkVSQUxJWkVEX0lOSVRJQUxJWkVSUworI2VuZGlmCisKKyNpZiBfX2hhc19mZWF0dXJlKGlzX2Jhc2Vfb2YpCisjZGVmaW5lIF9MSUJDUFBfSEFTX0lTX0JBU0VfT0YKKyNlbmRpZgorCisjaWYgX19oYXNfZmVhdHVyZShpc19maW5hbCkKKyNkZWZpbmUgX0xJQkNQUF9IQVNfSVNfRklOQUwKKyNlbmRpZgorCisvLyBPYmplY3RpdmUtQysrIGZlYXR1cmVzIChvcHQtaW4pCisjaWYgX19oYXNfZmVhdHVyZShvYmpjX2FyYykKKyNkZWZpbmUgX0xJQkNQUF9IQVNfT0JKQ19BUkMKKyNlbmRpZgorCisjaWYgX19oYXNfZmVhdHVyZShvYmpjX2FyY193ZWFrKQorI2RlZmluZSBfTElCQ1BQX0hBU19PQkpDX0FSQ19XRUFLCisjZW5kaWYKKworI2lmICEoX19oYXNfZmVhdHVyZShjeHhfY29uc3RleHByKSkKKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fQ09OU1RFWFBSCisjZW5kaWYKKworI2lmICEoX19oYXNfZmVhdHVyZShjeHhfcmVsYXhlZF9jb25zdGV4cHIpKQorI2RlZmluZSBfTElCQ1BQX0hBU19OT19DWFgxNF9DT05TVEVYUFIKKyNlbmRpZgorCisjaWYgIShfX2hhc19mZWF0dXJlKGN4eF92YXJpYWJsZV90ZW1wbGF0ZXMpKQorI2RlZmluZSBfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMKKyNlbmRpZgorCisjaWYgX19JU09fQ19WSVNJQkxFID49IDIwMTEgfHwgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyAgaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyMgICAgZGVmaW5lIF9MSUJDUFBfSEFTX1FVSUNLX0VYSVQKKyMgICAgZGVmaW5lIF9MSUJDUFBfSEFTX0MxMV9GRUFUVVJFUworIyAgZWxpZiBkZWZpbmVkKF9fRnVjaHNpYV9fKQorIyAgICBkZWZpbmUgX0xJQkNQUF9IQVNfUVVJQ0tfRVhJVAorIyAgICBkZWZpbmUgX0xJQkNQUF9IQVNfQzExX0ZFQVRVUkVTCisjICBlbGlmIGRlZmluZWQoX19saW51eF9fKQorIyAgICBpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19NVVNMX0xJQkMpCisjICAgICAgaWYgX0xJQkNQUF9HTElCQ19QUkVSRVEoMiwgMTUpIHx8IGRlZmluZWQoX19CSU9OSUNfXykKKyMgICAgICAgIGRlZmluZSBfTElCQ1BQX0hBU19RVUlDS19FWElUCisjICAgICAgZW5kaWYKKyMgICAgICBpZiBfTElCQ1BQX0dMSUJDX1BSRVJFUSgyLCAxNykKKyMgICAgICAgIGRlZmluZSBfTElCQ1BQX0hBU19DMTFfRkVBVFVSRVMKKyMgICAgICBlbmRpZgorIyAgICBlbHNlIC8vIGRlZmluZWQoX0xJQkNQUF9IQVNfTVVTTF9MSUJDKQorIyAgICAgIGRlZmluZSBfTElCQ1BQX0hBU19RVUlDS19FWElUCisjICAgICAgZGVmaW5lIF9MSUJDUFBfSEFTX0MxMV9GRUFUVVJFUworIyAgICBlbmRpZgorIyAgZW5kaWYgLy8gX19saW51eF9fCisjZW5kaWYKKworI2lmICEoX19oYXNfZmVhdHVyZShjeHhfbm9leGNlcHQpKQorI2RlZmluZSBfTElCQ1BQX0hBU19OT19OT0VYQ0VQVAorI2VuZGlmCisKKyNpZiBfX2hhc19mZWF0dXJlKHVuZGVybHlpbmdfdHlwZSkKKyNkZWZpbmUgX0xJQkNQUF9VTkRFUkxZSU5HX1RZUEUoVCkgX191bmRlcmx5aW5nX3R5cGUoVCkKKyNlbmRpZgorCisjaWYgX19oYXNfZmVhdHVyZShpc19saXRlcmFsKQorI2RlZmluZSBfTElCQ1BQX0lTX0xJVEVSQUwoVCkgX19pc19saXRlcmFsKFQpCisjZW5kaWYKKworLy8gSW5saW5lIG5hbWVzcGFjZXMgYXJlIGF2YWlsYWJsZSBpbiBDbGFuZyByZWdhcmRsZXNzIG9mIEMrKyBkaWFsZWN0LgorI2RlZmluZSBfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQgbmFtZXNwYWNlIHN0ZCB7aW5saW5lIG5hbWVzcGFjZSBfTElCQ1BQX05BTUVTUEFDRSB7CisjZGVmaW5lIF9MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQgIH0gfQorI2RlZmluZSBfVlNURCBzdGQ6Ol9MSUJDUFBfTkFNRVNQQUNFCisKK25hbWVzcGFjZSBzdGQgeworICBpbmxpbmUgbmFtZXNwYWNlIF9MSUJDUFBfTkFNRVNQQUNFIHsKKyAgfQorfQorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fQVNBTikgJiYgIV9faGFzX2ZlYXR1cmUoYWRkcmVzc19zYW5pdGl6ZXIpCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX0FTQU4KKyNlbmRpZgorCisvLyBBbGxvdyBmb3IgYnVpbGQtdGltZSBkaXNhYmxpbmcgb2YgdW5zaWduZWQgaW50ZWdlciBzYW5pdGl6YXRpb24KKyNpZiAhZGVmaW5lZChfTElCQ1BQX0RJU0FCTEVfVUJTQU5fVU5TSUdORURfSU5URUdFUl9DSEVDSykgJiYgX19oYXNfYXR0cmlidXRlKG5vX3Nhbml0aXplKQorI2RlZmluZSBfTElCQ1BQX0RJU0FCTEVfVUJTQU5fVU5TSUdORURfSU5URUdFUl9DSEVDSyBfX2F0dHJpYnV0ZV9fKChfX25vX3Nhbml0aXplX18oInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCisjZW5kaWYKKworI2lmIF9faGFzX2J1aWx0aW4oX19idWlsdGluX2xhdW5kZXIpCisjZGVmaW5lIF9MSUJDUFBfQ09NUElMRVJfSEFTX0JVSUxUSU5fTEFVTkRFUgorI2VuZGlmCisKKyNpZiAhX19pc19pZGVudGlmaWVyKF9faGFzX3VuaXF1ZV9vYmplY3RfcmVwcmVzZW50YXRpb25zKQorI2RlZmluZSBfTElCQ1BQX0hBU19VTklRVUVfT0JKRUNUX1JFUFJFU0VOVEFUSU9OUworI2VuZGlmCisKKyNlbGlmIGRlZmluZWQoX0xJQkNQUF9DT01QSUxFUl9HQ0MpCisKKyNkZWZpbmUgX0FMSUdOQVMoeCkgX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oeCkpKQorI2RlZmluZSBfQUxJR05BU19UWVBFKHgpIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKF9fYWxpZ25vZih4KSkpKQorCisjZGVmaW5lIF9MSUJDUFBfTk9SRVRVUk4gX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKQorCisjaWYgX0dOVUNfVkVSID49IDQwNworI2RlZmluZSBfTElCQ1BQX1VOREVSTFlJTkdfVFlQRShUKSBfX3VuZGVybHlpbmdfdHlwZShUKQorI2RlZmluZSBfTElCQ1BQX0lTX0xJVEVSQUwoVCkgX19pc19saXRlcmFsX3R5cGUoVCkKKyNkZWZpbmUgX0xJQkNQUF9IQVNfSVNfRklOQUwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX0dOVUNfVkVSID49IDQwMworI2RlZmluZSBfTElCQ1BQX0hBU19JU19CQVNFX09GCisjZW5kaWYKKworI2lmICFfX0VYQ0VQVElPTlMKKyNkZWZpbmUgX0xJQkNQUF9OT19FWENFUFRJT05TCisjZW5kaWYKKworLy8gY29uc3RleHByIHdhcyBhZGRlZCB0byBHQ0MgaW4gNC42LgorI2lmIF9HTlVDX1ZFUiA8IDQwNgorIyAgZGVmaW5lIF9MSUJDUFBfSEFTX05PX0NPTlNURVhQUgorLy8gQ2FuIG9ubHkgdXNlIGNvbnN0ZXhwciBpbiBjKysxMSBtb2RlLgorI2VsaWYgIWRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pICYmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyAgZGVmaW5lIF9MSUJDUFBfSEFTX05PX0NPTlNURVhQUgorI2VuZGlmCisKKy8vIERldGVybWluZSBpZiBHQ0Mgc3VwcG9ydHMgcmVsYXhlZCBjb25zdGV4cHIKKyNpZiAhZGVmaW5lZChfX2NwcF9jb25zdGV4cHIpIHx8IF9fY3BwX2NvbnN0ZXhwciA8IDIwMTMwNEwKKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fQ1hYMTRfQ09OU1RFWFBSCisjZW5kaWYKKworLy8gR0NDIDUgd2lsbCBzdXBwb3J0IHZhcmlhYmxlIHRlbXBsYXRlcworI2lmICFkZWZpbmVkKF9fY3BwX3ZhcmlhYmxlX3RlbXBsYXRlcykgfHwgX19jcHBfdmFyaWFibGVfdGVtcGxhdGVzIDwgMjAxMzA0TAorI2RlZmluZSBfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMKKyNlbmRpZgorCisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fREVDTFRZUEUKKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fTlVMTFBUUgorI2RlZmluZSBfTElCQ1BQX0hBU19OT19VTklDT0RFX0NIQVJTCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworI2RlZmluZSBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworI2RlZmluZSBfTElCQ1BQX0hBU19OT19TVFJPTkdfRU5VTVMKKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fTk9FWENFUFQKKworI2Vsc2UgIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNpZiBfR05VQ19WRVIgPCA0MDMKKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyNlbmRpZgorCisKKyNpZiBfR05VQ19WRVIgPCA0MDQKKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fREVDTFRZUEUKKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fVU5JQ09ERV9DSEFSUworI2RlZmluZSBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fR0VORVJBTElaRURfSU5JVElBTElaRVJTCisjZW5kaWYgIC8vIF9HTlVDX1ZFUiA8IDQwNAorCisjaWYgX0dOVUNfVkVSIDwgNDA2CisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX05PRVhDRVBUCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX05VTExQVFIKKyNlbmRpZgorCisjZW5kaWYgIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNkZWZpbmUgX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1REIG5hbWVzcGFjZSBzdGQgeyBpbmxpbmUgbmFtZXNwYWNlIF9MSUJDUFBfTkFNRVNQQUNFIHsKKyNkZWZpbmUgX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURCAgfSB9CisjZGVmaW5lIF9WU1REIHN0ZDo6X0xJQkNQUF9OQU1FU1BBQ0UKKworbmFtZXNwYWNlIHN0ZCB7CisgIGlubGluZSBuYW1lc3BhY2UgX0xJQkNQUF9OQU1FU1BBQ0UgeworICB9Cit9CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19BU0FOKSAmJiAhZGVmaW5lZChfX1NBTklUSVpFX0FERFJFU1NfXykKKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fQVNBTgorI2VuZGlmCisKKyNpZiBfR05VQ19WRVIgPj0gNzAwCisjZGVmaW5lIF9MSUJDUFBfQ09NUElMRVJfSEFTX0JVSUxUSU5fTEFVTkRFUgorI2VuZGlmCisKKyNpZiBfR05VQ19WRVIgPj0gNzAwCisjZGVmaW5lIF9MSUJDUFBfSEFTX1VOSVFVRV9PQkpFQ1RfUkVQUkVTRU5UQVRJT05TCisjZW5kaWYKKworI2VsaWYgZGVmaW5lZChfTElCQ1BQX0NPTVBJTEVSX01TVkMpCisKKyNkZWZpbmUgX0xJQkNQUF9UT1NUUklORzIoeCkgI3gKKyNkZWZpbmUgX0xJQkNQUF9UT1NUUklORyh4KSBfTElCQ1BQX1RPU1RSSU5HMih4KQorI2RlZmluZSBfTElCQ1BQX1dBUk5JTkcoeCkgX19wcmFnbWEobWVzc2FnZShfX0ZJTEVfXyAiKCIgX0xJQkNQUF9UT1NUUklORyhfX0xJTkVfXykgIikgOiB3YXJuaW5nIG5vdGU6ICIgeCkpCisKKyNpZiBfTVNDX1ZFUiA8IDE5MDAKKyNlcnJvciAiTVNWQyB2ZXJzaW9ucyBwcmlvciB0byBWaXN1YWwgU3R1ZGlvIDIwMTUgYXJlIG5vdCBzdXBwb3J0ZWQiCisjZW5kaWYKKworI2RlZmluZSBfTElCQ1BQX0hBU19JU19CQVNFX09GCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX0NPTlNURVhQUgorI2RlZmluZSBfTElCQ1BQX0hBU19OT19DWFgxNF9DT05TVEVYUFIKKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTCisjaWYgX01TQ19WRVIgPD0gMTgwMAorI2RlZmluZSBfTElCQ1BQX0hBU19OT19VTklDT0RFX0NIQVJTCisjZW5kaWYKKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fTk9FWENFUFQKKyNkZWZpbmUgX19hbGlnbm9mX18gX19hbGlnbm9mCisjZGVmaW5lIF9MSUJDUFBfTk9SRVRVUk4gX19kZWNsc3BlYyhub3JldHVybikKKyNkZWZpbmUgX0FMSUdOQVMoeCkgX19kZWNsc3BlYyhhbGlnbih4KSkKKyNkZWZpbmUgX0FMSUdOQVNfVFlQRSh4KSBhbGlnbmFzKHgpCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworCisjZGVmaW5lIF9MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURCBuYW1lc3BhY2Ugc3RkIHsKKyNkZWZpbmUgX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURCAgfQorI2RlZmluZSBfVlNURCBzdGQKKworbmFtZXNwYWNlIHN0ZCB7Cit9CisKKyNkZWZpbmUgX0xJQkNQUF9XRUFLCisKKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fQVNBTgorCisjZWxpZiBkZWZpbmVkKF9MSUJDUFBfQ09NUElMRVJfSUJNKQorCisjZGVmaW5lIF9BTElHTkFTKHgpIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKHgpKSkKKyNkZWZpbmUgX0FMSUdOQVNfVFlQRSh4KSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhfX2FsaWdub2YoeCkpKSkKKyNkZWZpbmUgX0FUVFJJQlVURSh4KSBfX2F0dHJpYnV0ZV9fKCh4KSkKKyNkZWZpbmUgX0xJQkNQUF9OT1JFVFVSTiBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCisKKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fR0VORVJBTElaRURfSU5JVElBTElaRVJTCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX05PRVhDRVBUCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX05VTExQVFIKKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fVU5JQ09ERV9DSEFSUworI2RlZmluZSBfTElCQ1BQX0hBU19JU19CQVNFX09GCisjZGVmaW5lIF9MSUJDUFBfSEFTX0lTX0ZJTkFMCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUworCisjaWYgZGVmaW5lZChfQUlYKQorI2RlZmluZSBfX01VTFRJTE9DQUxFX0FQSQorI2VuZGlmCisKKyNkZWZpbmUgX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1REIG5hbWVzcGFjZSBzdGQge2lubGluZSBuYW1lc3BhY2UgX0xJQkNQUF9OQU1FU1BBQ0UgeworI2RlZmluZSBfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1REICB9IH0KKyNkZWZpbmUgX1ZTVEQgc3RkOjpfTElCQ1BQX05BTUVTUEFDRQorCituYW1lc3BhY2Ugc3RkIHsKKyAgaW5saW5lIG5hbWVzcGFjZSBfTElCQ1BQX05BTUVTUEFDRSB7CisgIH0KK30KKworI2RlZmluZSBfTElCQ1BQX0hBU19OT19BU0FOCisKKyNlbmRpZiAvLyBfTElCQ1BQX0NPTVBJTEVSX1tDTEFOR3xHQ0N8TVNWQ3xJQk1dCisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfT0JKRUNUX0ZPUk1BVF9DT0ZGKQorCisjaWZkZWYgX0RMTAorIyAgZGVmaW5lIF9MSUJDUFBfQ1JUX0ZVTkMgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjZWxzZQorIyAgZGVmaW5lIF9MSUJDUFBfQ1JUX0ZVTkMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTElCQ1BQX0RJU0FCTEVfVklTSUJJTElUWV9BTk5PVEFUSU9OUykKKyMgIGRlZmluZSBfTElCQ1BQX0RMTF9WSVMKKyMgIGRlZmluZSBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUworIyAgZGVmaW5lIF9MSUJDUFBfQ0xBU1NfVEVNUExBVEVfSU5TVEFOVElBVElPTl9WSVMKKyMgIGRlZmluZSBfTElCQ1BQX09WRVJSSURBQkxFX0ZVTkNfVklTCisjZWxpZiBkZWZpbmVkKF9MSUJDUFBfQlVJTERJTkdfTElCUkFSWSkKKyMgIGRlZmluZSBfTElCQ1BQX0RMTF9WSVMgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICBkZWZpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfVFlQRV9WSVMKKyMgIGRlZmluZSBfTElCQ1BQX0NMQVNTX1RFTVBMQVRFX0lOU1RBTlRJQVRJT05fVklTIF9MSUJDUFBfRExMX1ZJUworIyAgZGVmaW5lIF9MSUJDUFBfT1ZFUlJJREFCTEVfRlVOQ19WSVMgX0xJQkNQUF9ETExfVklTCisjZWxzZQorIyAgZGVmaW5lIF9MSUJDUFBfRExMX1ZJUyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgIGRlZmluZSBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBfTElCQ1BQX0RMTF9WSVMKKyMgIGRlZmluZSBfTElCQ1BQX0NMQVNTX1RFTVBMQVRFX0lOU1RBTlRJQVRJT05fVklTCisjICBkZWZpbmUgX0xJQkNQUF9PVkVSUklEQUJMRV9GVU5DX1ZJUworI2VuZGlmCisKKyNkZWZpbmUgX0xJQkNQUF9UWVBFX1ZJUyAgICAgICAgICAgIF9MSUJDUFBfRExMX1ZJUworI2RlZmluZSBfTElCQ1BQX0ZVTkNfVklTICAgICAgICAgICAgX0xJQkNQUF9ETExfVklTCisjZGVmaW5lIF9MSUJDUFBfRVhURVJOX1ZJUyAgICAgICAgICBfTElCQ1BQX0RMTF9WSVMKKyNkZWZpbmUgX0xJQkNQUF9FWENFUFRJT05fQUJJICAgICAgIF9MSUJDUFBfRExMX1ZJUworI2RlZmluZSBfTElCQ1BQX0hJRERFTgorI2RlZmluZSBfTElCQ1BQX01FVEhPRF9URU1QTEFURV9JTVBMSUNJVF9JTlNUQU5USUFUSU9OX1ZJUworI2RlZmluZSBfTElCQ1BQX1RFTVBMQVRFX1ZJUworI2RlZmluZSBfTElCQ1BQX0VOVU1fVklTCisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfQ09NUElMRVJfTVNWQykKKyMgIGRlZmluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fZm9yY2VpbmxpbmUKKyMgIGRlZmluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgICAgIF9fZm9yY2VpbmxpbmUKKyMgIGRlZmluZSBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9JTkxJTkVfVklTSUJJTElUWSBfX2ZvcmNlaW5saW5lCisjZWxzZQorIyAgZGVmaW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKKyMgIGRlZmluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgICAgIF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXykpCisjICBkZWZpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKKyNlbmRpZgorCisjZW5kaWYgLy8gZGVmaW5lZChfTElCQ1BQX09CSkVDVF9GT1JNQVRfQ09GRikKKworI2lmbmRlZiBfTElCQ1BQX0hJRERFTgorIyAgaWYgIWRlZmluZWQoX0xJQkNQUF9ESVNBQkxFX1ZJU0lCSUxJVFlfQU5OT1RBVElPTlMpCisjICAgIGRlZmluZSBfTElCQ1BQX0hJRERFTiBfX2F0dHJpYnV0ZV9fICgoX192aXNpYmlsaXR5X18oImhpZGRlbiIpKSkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9MSUJDUFBfSElEREVOCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX0xJQkNQUF9NRVRIT0RfVEVNUExBVEVfSU1QTElDSVRfSU5TVEFOVElBVElPTl9WSVMKKyMgIGlmICFkZWZpbmVkKF9MSUJDUFBfRElTQUJMRV9WSVNJQklMSVRZX0FOTk9UQVRJT05TKQorLy8gVGhlIGlubGluZSBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIFBSMzIxMTQgaXMgcmVzb2x2ZWQKKyMgICAgZGVmaW5lIF9MSUJDUFBfTUVUSE9EX1RFTVBMQVRFX0lNUExJQ0lUX0lOU1RBTlRJQVRJT05fVklTIGlubGluZSBfTElCQ1BQX0hJRERFTgorIyAgZWxzZQorIyAgICBkZWZpbmUgX0xJQkNQUF9NRVRIT0RfVEVNUExBVEVfSU1QTElDSVRfSU5TVEFOVElBVElPTl9WSVMKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX0ZVTkNfVklTCisjICBpZiAhZGVmaW5lZChfTElCQ1BQX0RJU0FCTEVfVklTSUJJTElUWV9BTk5PVEFUSU9OUykKKyMgICAgZGVmaW5lIF9MSUJDUFBfRlVOQ19WSVMgX19hdHRyaWJ1dGVfXyAoKF9fdmlzaWJpbGl0eV9fKCJkZWZhdWx0IikpKQorIyAgZWxzZQorIyAgICBkZWZpbmUgX0xJQkNQUF9GVU5DX1ZJUworIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9MSUJDUFBfVFlQRV9WSVMKKyMgIGlmICFkZWZpbmVkKF9MSUJDUFBfRElTQUJMRV9WSVNJQklMSVRZX0FOTk9UQVRJT05TKQorIyAgICBkZWZpbmUgX0xJQkNQUF9UWVBFX1ZJUyBfX2F0dHJpYnV0ZV9fICgoX192aXNpYmlsaXR5X18oImRlZmF1bHQiKSkpCisjICBlbHNlCisjICAgIGRlZmluZSBfTElCQ1BQX1RZUEVfVklTCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX0xJQkNQUF9URU1QTEFURV9WSVMKKyMgIGlmICFkZWZpbmVkKF9MSUJDUFBfRElTQUJMRV9WSVNJQklMSVRZX0FOTk9UQVRJT05TKQorIyAgICBpZiBfX2hhc19hdHRyaWJ1dGUoX190eXBlX3Zpc2liaWxpdHlfXykKKyMgICAgICBkZWZpbmUgX0xJQkNQUF9URU1QTEFURV9WSVMgX19hdHRyaWJ1dGVfXyAoKF9fdHlwZV92aXNpYmlsaXR5X18oImRlZmF1bHQiKSkpCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgX0xJQkNQUF9URU1QTEFURV9WSVMgX19hdHRyaWJ1dGVfXyAoKF9fdmlzaWJpbGl0eV9fKCJkZWZhdWx0IikpKQorIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBkZWZpbmUgX0xJQkNQUF9URU1QTEFURV9WSVMKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX0VYVEVSTl9WSVMKKyNkZWZpbmUgX0xJQkNQUF9FWFRFUk5fVklTCisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX09WRVJSSURBQkxFX0ZVTkNfVklTCisjZGVmaW5lIF9MSUJDUFBfT1ZFUlJJREFCTEVfRlVOQ19WSVMgX0xJQkNQUF9GVU5DX1ZJUworI2VuZGlmCisKKyNpZm5kZWYgX0xJQkNQUF9FWENFUFRJT05fQUJJCisjICBpZiAhZGVmaW5lZChfTElCQ1BQX0RJU0FCTEVfVklTSUJJTElUWV9BTk5PVEFUSU9OUykKKyMgICAgZGVmaW5lIF9MSUJDUFBfRVhDRVBUSU9OX0FCSSBfX2F0dHJpYnV0ZV9fICgoX192aXNpYmlsaXR5X18oImRlZmF1bHQiKSkpCisjICBlbHNlCisjICAgIGRlZmluZSBfTElCQ1BQX0VYQ0VQVElPTl9BQkkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX0VOVU1fVklTCisjICBpZiAhZGVmaW5lZChfTElCQ1BQX0RJU0FCTEVfVklTSUJJTElUWV9BTk5PVEFUSU9OUykgJiYgX19oYXNfYXR0cmlidXRlKF9fdHlwZV92aXNpYmlsaXR5X18pCisjICAgIGRlZmluZSBfTElCQ1BQX0VOVU1fVklTIF9fYXR0cmlidXRlX18gKChfX3R5cGVfdmlzaWJpbGl0eV9fKCJkZWZhdWx0IikpKQorIyAgZWxzZQorIyAgICBkZWZpbmUgX0xJQkNQUF9FTlVNX1ZJUworIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTCisjICBpZiAhZGVmaW5lZChfTElCQ1BQX0RJU0FCTEVfVklTSUJJTElUWV9BTk5PVEFUSU9OUykgJiYgX19oYXNfYXR0cmlidXRlKF9fdHlwZV92aXNpYmlsaXR5X18pCisjICAgIGRlZmluZSBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBfX2F0dHJpYnV0ZV9fICgoX192aXNpYmlsaXR5X18oImRlZmF1bHQiKSkpCisjICBlbHNlCisjICAgIGRlZmluZSBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUworIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9MSUJDUFBfQ0xBU1NfVEVNUExBVEVfSU5TVEFOVElBVElPTl9WSVMKKyNkZWZpbmUgX0xJQkNQUF9DTEFTU19URU1QTEFURV9JTlNUQU5USUFUSU9OX1ZJUworI2VuZGlmCisKKyNpZm5kZWYgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorIyAgaWYgIWRlZmluZWQoX0xJQkNQUF9ESVNBQkxFX1ZJU0lCSUxJVFlfQU5OT1RBVElPTlMpCisjICAgIGRlZmluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fYXR0cmlidXRlX18gKChfX3Zpc2liaWxpdHlfXygiaGlkZGVuIiksIF9fYWx3YXlzX2lubGluZV9fKSkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyMgIGlmICFkZWZpbmVkKF9MSUJDUFBfRElTQUJMRV9WSVNJQklMSVRZX0FOTk9UQVRJT05TKQorIyAgICBkZWZpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FICBfX2F0dHJpYnV0ZV9fICgoX192aXNpYmlsaXR5X18oImhpZGRlbiIpLCBfX2Fsd2F5c19pbmxpbmVfXykpCisjICBlbHNlCisjICAgIGRlZmluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgIF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXykpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyMgIGlmICFkZWZpbmVkKF9MSUJDUFBfRElTQUJMRV9WSVNJQklMSVRZX0FOTk9UQVRJT05TKQorIyAgICBkZWZpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkgX19hdHRyaWJ1dGVfXygoX192aXNpYmlsaXR5X18oImRlZmF1bHQiKSwgX19hbHdheXNfaW5saW5lX18pKQorIyAgZWxzZQorIyAgICBkZWZpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9MSUJDUFBfUFJFRkVSUkVEX09WRVJMT0FECisjICBpZiBfX2hhc19hdHRyaWJ1dGUoX19lbmFibGVfaWZfXykKKyMgICAgZGVmaW5lIF9MSUJDUFBfUFJFRkVSUkVEX09WRVJMT0FEIF9fYXR0cmlidXRlX18gKChfX2VuYWJsZV9pZl9fKHRydWUsICIiKSkpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fTk9FWENFUFQKKyMgIGRlZmluZSBfTk9FWENFUFQgbm9leGNlcHQKKyMgIGRlZmluZSBfTk9FWENFUFRfKHgpIG5vZXhjZXB0KHgpCisjZWxzZQorIyAgZGVmaW5lIF9OT0VYQ0VQVCB0aHJvdygpCisjICBkZWZpbmUgX05PRVhDRVBUXyh4KQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfREVCVUdfVVNFX0VYQ0VQVElPTlMpCisjICBpZiAhZGVmaW5lZChfTElCQ1BQX0RFQlVHKQorIyAgICBlcnJvciBjYW5ub3QgdXNlIF9MSUJDUFBfREVCVUdfVVNFX0VYQ0VQVElPTlMgdW5sZXNzIF9MSUJDUFBfREVCVUcgaXMgZGVmaW5lZAorIyAgZW5kaWYKKyMgIGlmZGVmIF9MSUJDUFBfSEFTX05PX05PRVhDRVBUCisjICAgIGRlZmluZSBfTk9FWENFUFRfREVCVUcKKyMgICAgZGVmaW5lIF9OT0VYQ0VQVF9ERUJVR18oeCkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9OT0VYQ0VQVF9ERUJVRyBub2V4Y2VwdChmYWxzZSkKKyMgICAgZGVmaW5lIF9OT0VYQ0VQVF9ERUJVR18oeCkgbm9leGNlcHQoZmFsc2UpCisjICBlbmRpZgorI2Vsc2UKKyMgIGRlZmluZSBfTk9FWENFUFRfREVCVUcgX05PRVhDRVBUCisjICBkZWZpbmUgX05PRVhDRVBUX0RFQlVHXyh4KSBfTk9FWENFUFRfKHgpCisjZW5kaWYKKworI2lmZGVmIF9MSUJDUFBfSEFTX05PX1VOSUNPREVfQ0hBUlMKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgY2hhcjE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgIGNoYXIzMl90OworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19VTklDT0RFX0NIQVJTCisKKyNpZm5kZWYgX19TSVpFT0ZfSU5UMTI4X18KKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fSU5UMTI4CisjZW5kaWYKKworI2lmZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworIyAgaWYgX19oYXNfZXh0ZW5zaW9uKGNfc3RhdGljX2Fzc2VydCkKKyMgICAgZGVmaW5lIHN0YXRpY19hc3NlcnQoX19iLCBfX20pIF9TdGF0aWNfYXNzZXJ0KF9fYiwgX19tKQorIyAgZWxzZQorZXh0ZXJuICJDKysiIHsKK3RlbXBsYXRlIDxib29sPiBzdHJ1Y3QgX19zdGF0aWNfYXNzZXJ0X3Rlc3Q7Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX19zdGF0aWNfYXNzZXJ0X3Rlc3Q8dHJ1ZT4ge307Cit0ZW1wbGF0ZSA8dW5zaWduZWQ+IHN0cnVjdCBfX3N0YXRpY19hc3NlcnRfY2hlY2sge307Cit9CisjICAgIGRlZmluZSBzdGF0aWNfYXNzZXJ0KF9fYiwgX19tKSBcCisgICAgICAgdHlwZWRlZiBfX3N0YXRpY19hc3NlcnRfY2hlY2s8c2l6ZW9mKF9fc3RhdGljX2Fzc2VydF90ZXN0PChfX2IpPik+IFwKKyAgICAgICBfTElCQ1BQX0NPTkNBVChfX3QsIF9fTElORV9fKQorIyAgZW5kaWYgLy8gX19oYXNfZXh0ZW5zaW9uKGNfc3RhdGljX2Fzc2VydCkKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyNpZmRlZiBfTElCQ1BQX0hBU19OT19ERUNMVFlQRQorLy8gR0NDIDQuNiBwcm92aWRlcyBfX2RlY2x0eXBlIGluIGFsbCBzdGFuZGFyZCBtb2Rlcy4KKyMgIGlmIF9faGFzX2tleXdvcmQoX19kZWNsdHlwZSkgfHwgX0xJQkNQUF9DTEFOR19WRVIgPj0gMzA0IHx8IF9HTlVDX1ZFUiA+PSA0MDYKKyMgICAgZGVmaW5lIGRlY2x0eXBlKF9feCkgX19kZWNsdHlwZShfX3gpCisjICBlbHNlCisjICAgIGRlZmluZSBkZWNsdHlwZShfX3gpIF9fdHlwZW9mX18oX194KQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX0xJQkNQUF9IQVNfTk9fQ09OU1RFWFBSCisjICBkZWZpbmUgX0xJQkNQUF9DT05TVEVYUFIKKyNlbHNlCisjICBkZWZpbmUgX0xJQkNQUF9DT05TVEVYUFIgY29uc3RleHByCisjZW5kaWYKKworI2lmZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworIyAgZGVmaW5lIF9MSUJDUFBfREVGQVVMVCB7fQorI2Vsc2UKKyMgIGRlZmluZSBfTElCQ1BQX0RFRkFVTFQgPSBkZWZhdWx0OworI2VuZGlmCisKKyNpZmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyMgIGRlZmluZSBfTElCQ1BQX0VRVUFMX0RFTEVURQorI2Vsc2UKKyMgIGRlZmluZSBfTElCQ1BQX0VRVUFMX0RFTEVURSA9IGRlbGV0ZQorI2VuZGlmCisKKyNpZmRlZiBfX0dOVUNfXworIyAgZGVmaW5lIF9OT0FMSUFTIF9fYXR0cmlidXRlX18oKF9fbWFsbG9jX18pKQorI2Vsc2UKKyMgIGRlZmluZSBfTk9BTElBUworI2VuZGlmCisKKyNpZiBfX2hhc19mZWF0dXJlKGN4eF9leHBsaWNpdF9jb252ZXJzaW9ucykgfHwgZGVmaW5lZChfX0lCTUNQUF9fKSB8fCBcCisgICAgKCFkZWZpbmVkKF9MSUJDUFBfQ1hYMDNfTEFORykgJiYgZGVmaW5lZChfX0dOVUNfXykpIC8vIEFsbCBzdXBwb3J0ZWQgR0NDIHZlcnNpb25zCisjICBkZWZpbmUgX0xJQkNQUF9FWFBMSUNJVCBleHBsaWNpdAorI2Vsc2UKKyMgIGRlZmluZSBfTElCQ1BQX0VYUExJQ0lUCisjZW5kaWYKKworI2lmICFfX2hhc19idWlsdGluKF9fYnVpbHRpbl9vcGVyYXRvcl9uZXcpIHx8ICFfX2hhc19idWlsdGluKF9fYnVpbHRpbl9vcGVyYXRvcl9kZWxldGUpCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX0JVSUxUSU5fT1BFUkFUT1JfTkVXX0RFTEVURQorI2VuZGlmCisKKyNpZmRlZiBfTElCQ1BQX0hBU19OT19TVFJPTkdfRU5VTVMKKyMgIGRlZmluZSBfTElCQ1BQX0RFQ0xBUkVfU1RST05HX0VOVU0oeCkgc3RydWN0IF9MSUJDUFBfVFlQRV9WSVMgeCB7IGVudW0gX19seAorIyAgZGVmaW5lIF9MSUJDUFBfREVDTEFSRV9TVFJPTkdfRU5VTV9FUElMT0coeCkgXAorICAgICBfX2x4IF9fdl87IFwKKyAgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIHgoX19seCBfX3YpIDogX192XyhfX3YpIHt9IFwKKyAgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGV4cGxpY2l0IHgoaW50IF9fdikgOiBfX3ZfKHN0YXRpY19jYXN0PF9fbHg+KF9fdikpIHt9IFwKKyAgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIG9wZXJhdG9yIGludCgpIGNvbnN0IHtyZXR1cm4gX192Xzt9IFwKKyAgICAgfTsKKyNlbHNlICAvLyBfTElCQ1BQX0hBU19OT19TVFJPTkdfRU5VTVMKKyMgIGRlZmluZSBfTElCQ1BQX0RFQ0xBUkVfU1RST05HX0VOVU0oeCkgZW51bSBjbGFzcyBfTElCQ1BQX0VOVU1fVklTIHgKKyMgIGRlZmluZSBfTElCQ1BQX0RFQ0xBUkVfU1RST05HX0VOVU1fRVBJTE9HKHgpCisjZW5kaWYgIC8vIF9MSUJDUFBfSEFTX05PX1NUUk9OR19FTlVNUworCisjaWZkZWYgX0xJQkNQUF9ERUJVRworIyAgaWYgX0xJQkNQUF9ERUJVRyA9PSAwCisjICAgIGRlZmluZSBfTElCQ1BQX0RFQlVHX0xFVkVMIDEKKyMgIGVsaWYgX0xJQkNQUF9ERUJVRyA9PSAxCisjICAgIGRlZmluZSBfTElCQ1BQX0RFQlVHX0xFVkVMIDIKKyMgIGVsc2UKKyMgICAgZXJyb3IgU3VwcG9ydGVkIHZhbHVlcyBmb3IgX0xJQkNQUF9ERUJVRyBhcmUgMCBhbmQgMQorIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkKF9MSUJDUFBfQlVJTERJTkdfTElCUkFSWSkKKyMgICAgZGVmaW5lIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFKC4uLikKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9MSUJDUFBfRElTQUJMRV9FWFRFUk5fVEVNUExBVEUKKyNkZWZpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoLi4uKQorI2RlZmluZSBfTElCQ1BQX0VYVEVSTl9URU1QTEFURTIoLi4uKQorI2VuZGlmCisKKyNpZm5kZWYgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUKKyNkZWZpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoLi4uKSBleHRlcm4gdGVtcGxhdGUgX19WQV9BUkdTX187CisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX0VYVEVSTl9URU1QTEFURTIKKyNkZWZpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUyKC4uLikgZXh0ZXJuIHRlbXBsYXRlIF9fVkFfQVJHU19fOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX0xQNjRfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKKyNkZWZpbmUgX0xJQkNQUF9OT05VTklRVUVfUlRUSV9CSVQgKDFVTEwgPDwgNjMpCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9MSUJDUFBfTVNWQ1JUX0xJS0UpIHx8IFwKKyAgICBkZWZpbmVkKF9fc3VuX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0Nsb3VkQUJJX18pCisjZGVmaW5lIF9MSUJDUFBfTE9DQUxFX19MX0VYVEVOU0lPTlMgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fdW5peF9fKSB8fCAoZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pKQorLy8gTW9zdCB1bml4IHZhcmlhbnRzIGhhdmUgY2F0b3Blbi4gIFRoZXNlIGFyZSB0aGUgc3BlY2lmaWMgb25lcyB0aGF0IGRvbid0LgorIyAgaWYgIWRlZmluZWQoX19CSU9OSUNfXykgJiYgIWRlZmluZWQoX05FV0xJQl9WRVJTSU9OKQorIyAgICBkZWZpbmUgX0xJQkNQUF9IQVNfQ0FUT1BFTiAxCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX0ZyZWVCU0RfXworI2RlZmluZSBfREVDTEFSRV9DOTlfTERCTF9NQVRIIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0FQUExFX18pCisjICBpZiAhZGVmaW5lZChfX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEKSAmJiBcCisgICAgICBkZWZpbmVkKF9fRU5WSVJPTk1FTlRfTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRURfXykKKyMgICAgZGVmaW5lIF9fTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgX19FTlZJUk9OTUVOVF9NQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRF9fCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZChfX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEKQorIyAgICBpZiBfX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEIDwgMTA2MAorIyAgICAgIGRlZmluZSBfTElCQ1BQX0hBU19OT19BTElHTkVEX0FMTE9DQVRJT04KKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYgLy8gZGVmaW5lZChfX0FQUExFX18pCisKKworI2lmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorI2RlZmluZSBfTElCQ1BQX0hBU19ERUZBVUxUUlVORUxPQ0FMRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX3N1bl9fKQorI2RlZmluZSBfTElCQ1BQX1dDVFlQRV9JU19NQVNLCisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX1NURF9WRVIKKyMgIGlmICBfX2NwbHVzcGx1cyA8PSAyMDExMDNMCisjICAgIGRlZmluZSBfTElCQ1BQX1NURF9WRVIgMTEKKyMgIGVsaWYgX19jcGx1c3BsdXMgPD0gMjAxNDAyTAorIyAgICBkZWZpbmUgX0xJQkNQUF9TVERfVkVSIDE0CisjICBlbGlmIF9fY3BsdXNwbHVzIDw9IDIwMTcwM0wKKyMgICAgZGVmaW5lIF9MSUJDUFBfU1REX1ZFUiAxNworIyAgZWxzZQorIyAgICBkZWZpbmUgX0xJQkNQUF9TVERfVkVSIDE4ICAvLyBjdXJyZW50IHllYXIsIG9yIGRhdGUgb2YgYysrMmEgcmF0aWZpY2F0aW9uCisjICBlbmRpZgorI2VuZGlmICAvLyBfTElCQ1BQX1NURF9WRVIKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisjICBkZWZpbmUgX0xJQkNQUF9ERVBSRUNBVEVEIFtbZGVwcmVjYXRlZF1dCisjZWxzZQorIyAgZGVmaW5lIF9MSUJDUFBfREVQUkVDQVRFRAorI2VuZGlmCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPD0gMTEKKyMgIGRlZmluZSBfTElCQ1BQX0VYUExJQ0lUX0FGVEVSX0NYWDExCisjICBkZWZpbmUgX0xJQkNQUF9ERVBSRUNBVEVEX0FGVEVSX0NYWDExCisjZWxzZQorIyAgZGVmaW5lIF9MSUJDUFBfRVhQTElDSVRfQUZURVJfQ1hYMTEgZXhwbGljaXQKKyMgIGRlZmluZSBfTElCQ1BQX0RFUFJFQ0FURURfQUZURVJfQ1hYMTEgW1tkZXByZWNhdGVkXV0KKyNlbmRpZgorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fQ1hYMTRfQ09OU1RFWFBSKQorIyAgZGVmaW5lIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIGNvbnN0ZXhwcgorI2Vsc2UKKyMgIGRlZmluZSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorI2VuZGlmCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19DWFgxNF9DT05TVEVYUFIpCisjICBkZWZpbmUgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQgY29uc3RleHByCisjZWxzZQorIyAgZGVmaW5lIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisjZW5kaWYKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE3ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX0NYWDE0X0NPTlNURVhQUikKKyMgIGRlZmluZSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNyBjb25zdGV4cHIKKyNlbHNlCisjICBkZWZpbmUgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKKyNlbmRpZgorCisjaWYgX19oYXNfY3BwX2F0dHJpYnV0ZShub2Rpc2NhcmQpICYmIF9MSUJDUFBfU1REX1ZFUiA+IDE3ICYmICFkZWZpbmVkKF9MSUJDUFBfRElTQUJMRV9OT0RJU0NBUkRfQUZURVJfQ1hYMTcpCisjICBkZWZpbmUgX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgW1tub2Rpc2NhcmRdXQorI2Vsc2UKKyMgIGRlZmluZSBfTElCQ1BQX05PRElTQ0FSRF9BRlRFUl9DWFgxNworI2VuZGlmCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiBkZWZpbmVkKF9fY3BwX2lubGluZV92YXJpYWJsZXMpICYmIChfX2NwcF9pbmxpbmVfdmFyaWFibGVzID49IDIwMTYwNkwpCisjICBkZWZpbmUgX0xJQkNQUF9JTkxJTkVfVkFSIGlubGluZQorI2Vsc2UKKyMgIGRlZmluZSBfTElCQ1BQX0lOTElORV9WQVIKKyNlbmRpZgorCisjaWZkZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyMgIGRlZmluZSBfTElCQ1BQX0VYUExJQ0lUX01PVkUoeCkgX1ZTVEQ6Om1vdmUoeCkKKyNlbHNlCisjICBkZWZpbmUgX0xJQkNQUF9FWFBMSUNJVF9NT1ZFKHgpICh4KQorI2VuZGlmCisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fQVNBTgorX0xJQkNQUF9GVU5DX1ZJUyBleHRlcm4gIkMiIHZvaWQgX19zYW5pdGl6ZXJfYW5ub3RhdGVfY29udGlndW91c19jb250YWluZXIoCisgIGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7CisjZW5kaWYKKworLy8gVHJ5IHRvIGZpbmQgb3V0IGlmIFJUVEkgaXMgZGlzYWJsZWQuCisvLyBnKysgYW5kIGNsLmV4ZSBoYXZlIFJUVEkgb24gYnkgZGVmYXVsdCBhbmQgZGVmaW5lIGEgbWFjcm8gd2hlbiBpdCBpcy4KKy8vIGcrKyBvbmx5IGRlZmluZXMgdGhlIG1hY3JvIGluIDQuMy4yIGFuZCBvbndhcmRzLgorI2lmICFkZWZpbmVkKF9MSUJDUFBfTk9fUlRUSSkKKyMgIGlmIGRlZmluZWQoX19HTlVDX18pICYmIFwKKyAgICAgICgoX19HTlVDX18gPj0gNSkgfHwgXAorICAgICAgIChfX0dOVUNfXyA9PSA0ICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzIHx8IF9fR05VQ19QQVRDSExFVkVMX18gPj0gMikpKSAmJiBcCisgICAgICAhZGVmaW5lZChfX0dYWF9SVFRJKQorIyAgICBkZWZpbmUgX0xJQkNQUF9OT19SVFRJCisjICBlbGlmIGRlZmluZWQoX0xJQkNQUF9DT01QSUxFUl9NU1ZDKSAmJiAhZGVmaW5lZChfQ1BQUlRUSSkKKyMgICAgZGVmaW5lIF9MSUJDUFBfTk9fUlRUSQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9MSUJDUFBfV0VBSworI2RlZmluZSBfTElCQ1BQX1dFQUsgX19hdHRyaWJ1dGVfXygoX193ZWFrX18pKQorI2VuZGlmCisKKy8vIFRocmVhZCBBUEkKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19USFJFQURTKSAmJiBcCisgICAgIWRlZmluZWQoX0xJQkNQUF9IQVNfVEhSRUFEX0FQSV9QVEhSRUFEKSAmJiBcCisgICAgIWRlZmluZWQoX0xJQkNQUF9IQVNfVEhSRUFEX0FQSV9XSU4zMikgJiYgXAorICAgICFkZWZpbmVkKF9MSUJDUFBfSEFTX1RIUkVBRF9BUElfRVhURVJOQUwpCisjICBpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBcCisgICAgICBkZWZpbmVkKF9fRnVjaHNpYV9fKSB8fCBcCisgICAgICBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IFwKKyAgICAgIGRlZmluZWQoX19saW51eF9fKSB8fCBcCisgICAgICBkZWZpbmVkKF9fQVBQTEVfXykgfHwgXAorICAgICAgZGVmaW5lZChfX0Nsb3VkQUJJX18pIHx8IFwKKyAgICAgIGRlZmluZWQoX19zdW5fXykgfHwgXAorICAgICAgKGRlZmluZWQoX19NSU5HVzMyX18pICYmIF9fbGliY3BwX2hhc19pbmNsdWRlKDxwdGhyZWFkLmg+KSkKKyMgICAgZGVmaW5lIF9MSUJDUFBfSEFTX1RIUkVBRF9BUElfUFRIUkVBRAorIyAgZWxpZiBkZWZpbmVkKF9MSUJDUFBfV0lOMzJBUEkpCisjICAgIGRlZmluZSBfTElCQ1BQX0hBU19USFJFQURfQVBJX1dJTjMyCisjICBlbHNlCisjICAgIGVycm9yICJObyB0aHJlYWQgQVBJIgorIyAgZW5kaWYgLy8gX0xJQkNQUF9IQVNfVEhSRUFEX0FQSQorI2VuZGlmIC8vIF9MSUJDUFBfSEFTX05PX1RIUkVBRFMKKworI2lmIGRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVEhSRUFEUykgJiYgZGVmaW5lZChfTElCQ1BQX0hBU19USFJFQURfQVBJX1BUSFJFQUQpCisjZXJyb3IgX0xJQkNQUF9IQVNfVEhSRUFEX0FQSV9QVEhSRUFEIG1heSBvbmx5IGJlIGRlZmluZWQgd2hlbiBcCisgICAgICAgX0xJQkNQUF9IQVNfTk9fVEhSRUFEUyBpcyBub3QgZGVmaW5lZC4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTElCQ1BQX0hBU19OT19USFJFQURTKSAmJiBkZWZpbmVkKF9MSUJDUFBfSEFTX1RIUkVBRF9BUElfRVhURVJOQUwpCisjZXJyb3IgX0xJQkNQUF9IQVNfVEhSRUFEX0FQSV9FWFRFUk5BTCBtYXkgbm90IGJlIGRlZmluZWQgd2hlbiBcCisgICAgICAgX0xJQkNQUF9IQVNfTk9fVEhSRUFEUyBpcyBkZWZpbmVkLgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfSEFTX05PX01PTk9UT05JQ19DTE9DSykgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVEhSRUFEUykKKyNlcnJvciBfTElCQ1BQX0hBU19OT19NT05PVE9OSUNfQ0xPQ0sgbWF5IG9ubHkgYmUgZGVmaW5lZCB3aGVuIFwKKyAgICAgICBfTElCQ1BQX0hBU19OT19USFJFQURTIGlzIGRlZmluZWQuCisjZW5kaWYKKworLy8gU3lzdGVtcyB0aGF0IHVzZSBjYXBhYmlsaXR5LWJhc2VkIHNlY3VyaXR5IChGcmVlQlNEIHdpdGggQ2Fwc2ljdW0sCisvLyBOdXhpIENsb3VkQUJJKSBtYXkgb25seSBwcm92aWRlIGxvY2FsIGZpbGVzeXN0ZW0gYWNjZXNzICh1c2luZyAqYXQoKSkuCisvLyBGdW5jdGlvbnMgbGlrZSBvcGVuKCksIHJlbmFtZSgpLCB1bmxpbmsoKSBhbmQgc3RhdCgpIHNob3VsZCBub3QgYmUKKy8vIHVzZWQsIGFzIHRoZXkgYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIGdsb2JhbCBmaWxlc3lzdGVtIG5hbWVzcGFjZS4KKyNpZmRlZiBfX0Nsb3VkQUJJX18KKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fR0xPQkFMX0ZJTEVTWVNURU1fTkFNRVNQQUNFCisjZW5kaWYKKworLy8gQ2xvdWRBQkkgaXMgaW50ZW5kZWQgZm9yIHJ1bm5pbmcgbmV0d29ya2VkIHNlcnZpY2VzLiBQcm9jZXNzZXMgZG8gbm90CisvLyBoYXZlIHN0YW5kYXJkIGlucHV0IGFuZCBvdXRwdXQgY2hhbm5lbHMuCisjaWZkZWYgX19DbG91ZEFCSV9fCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX1NURElOCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX1NURE9VVAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQklPTklDX18pIHx8IGRlZmluZWQoX19DbG91ZEFCSV9fKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVmaW5lZChfX0Z1Y2hzaWFfXykgfHwgZGVmaW5lZChfTElCQ1BQX0hBU19NVVNMX0xJQkMpCisjZGVmaW5lIF9MSUJDUFBfUFJPVklERVNfREVGQVVMVF9SVU5FX1RBQkxFCisjZW5kaWYKKworLy8gVGhyZWFkLXVuc2FmZSBmdW5jdGlvbnMgc3VjaCBhcyBzdHJ0b2soKSBhbmQgbG9jYWx0aW1lKCkKKy8vIGFyZSBub3QgYXZhaWxhYmxlLgorI2lmZGVmIF9fQ2xvdWRBQklfXworI2RlZmluZSBfTElCQ1BQX0hBU19OT19USFJFQURfVU5TQUZFX0NfRlVOQ1RJT05TCisjZW5kaWYKKworI2lmIF9faGFzX2ZlYXR1cmUoY3h4X2F0b21pYykgfHwgX19oYXNfZXh0ZW5zaW9uKGNfYXRvbWljKSB8fCBfX2hhc19rZXl3b3JkKF9BdG9taWMpCisjICBkZWZpbmUgX0xJQkNQUF9IQVNfQ19BVE9NSUNfSU1QCisjZWxpZiBfR05VQ19WRVIgPiA0MDcKKyMgIGRlZmluZSBfTElCQ1BQX0hBU19HQ0NfQVRPTUlDX0lNUAorI2VuZGlmCisKKyNpZiAoIWRlZmluZWQoX0xJQkNQUF9IQVNfQ19BVE9NSUNfSU1QKSAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19HQ0NfQVRPTUlDX0lNUCkpIFwKKyAgICAgfHwgZGVmaW5lZChfTElCQ1BQX0hBU19OT19USFJFQURTKQorI2RlZmluZSBfTElCQ1BQX0hBU19OT19BVE9NSUNfSEVBREVSCisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX0RJU0FCTEVfVUJTQU5fVU5TSUdORURfSU5URUdFUl9DSEVDSworI2RlZmluZSBfTElCQ1BQX0RJU0FCTEVfVUJTQU5fVU5TSUdORURfSU5URUdFUl9DSEVDSworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfRU5BQkxFX1RIUkVBRF9TQUZFVFlfQU5OT1RBVElPTlMpCisjICBpZiBkZWZpbmVkKF9fY2xhbmdfXykgJiYgX19oYXNfYXR0cmlidXRlKGFjcXVpcmVfY2FwYWJpbGl0eSkKKy8vIFdvcmsgYXJvdW5kIHRoZSBhdHRyaWJ1dGUgaGFuZGxpbmcgaW4gY2xhbmcuICBXaGVuIGJvdGggX19kZWNsc3BlYyBhbmQKKy8vIF9fYXR0cmlidXRlX18gYXJlIHByZXNlbnQsIHRoZSBwcm9jZXNzaW5nIGdvZXMgYXdyeSBwcmV2ZW50aW5nIHRoZSBkZWZpbml0aW9uCisvLyBvZiB0aGUgdHlwZXMuCisjICAgIGlmICFkZWZpbmVkKF9MSUJDUFBfT0JKRUNUX0ZPUk1BVF9DT0ZGKQorIyAgICAgIGRlZmluZSBfTElCQ1BQX0hBU19USFJFQURfU0FGRVRZX0FOTk9UQVRJT05TCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBfX2hhc19hdHRyaWJ1dGUocmVxdWlyZV9jb25zdGFudF9pbml0aWFsaXphdGlvbikKKyMgIGRlZmluZSBfTElCQ1BQX1NBRkVfU1RBVElDIF9fYXR0cmlidXRlX18oKF9fcmVxdWlyZV9jb25zdGFudF9pbml0aWFsaXphdGlvbl9fKSkKKyNlbHNlCisjICBkZWZpbmUgX0xJQkNQUF9TQUZFX1NUQVRJQworI2VuZGlmCisKKyNpZiAhX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fYWRkcmVzc29mKSAmJiBfR05VQ19WRVIgPCA3MDAKKyNkZWZpbmUgX0xJQkNQUF9IQVNfTk9fQlVJTFRJTl9BRERSRVNTT0YKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fT0ZGX1RfRlVOQ1RJT05TKQorIyAgaWYgZGVmaW5lZChfTElCQ1BQX01TVkNSVCkgfHwgZGVmaW5lZChfTkVXTElCX1ZFUlNJT04pCisjICAgIGRlZmluZSBfTElCQ1BQX0hBU19OT19PRkZfVF9GVU5DVElPTlMKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIF9faGFzX2F0dHJpYnV0ZShkaWFnbm9zZV9pZikgJiYgIWRlZmluZWQoX0xJQkNQUF9ESVNBQkxFX0FERElUSU9OQUxfRElBR05PU1RJQ1MpCisjICBkZWZpbmUgX0xJQkNQUF9ESUFHTk9TRV9XQVJOSU5HKC4uLikgXAorICAgICBfX2F0dHJpYnV0ZV9fKChkaWFnbm9zZV9pZihfX1ZBX0FSR1NfXywgIndhcm5pbmciKSkpCisjICBkZWZpbmUgX0xJQkNQUF9ESUFHTk9TRV9FUlJPUiguLi4pIFwKKyAgICAgX19hdHRyaWJ1dGVfXygoZGlhZ25vc2VfaWYoX19WQV9BUkdTX18sICJlcnJvciIpKSkKKyNlbHNlCisjICBkZWZpbmUgX0xJQkNQUF9ESUFHTk9TRV9XQVJOSU5HKC4uLikKKyMgIGRlZmluZSBfTElCQ1BQX0RJQUdOT1NFX0VSUk9SKC4uLikKKyNlbmRpZgorCisjaWYgX19oYXNfYXR0cmlidXRlKGZhbGx0aG91Z2gpIHx8IF9HTlVDX1ZFUiA+PSA3MDAKKy8vIFVzZSBhIGZ1bmN0aW9uIGxpa2UgbWFjcm8gdG8gaW1wbHkgdGhhdCBpdCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc2VtaWNvbG9uCisjICBkZWZpbmUgX0xJQkNQUF9GQUxMVEhST1VHSCgpIF9fYXR0cmlidXRlX18oKF9fZmFsbHRocm91Z2hfXykpCisjZWxzZQorIyAgZGVmaW5lIF9MSUJDUFBfRkFMTFRIUk9VR0goKSAoKHZvaWQpMCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTElCQ1BQX0FCSV9NSUNST1NPRlQpICYmIFwKKyAgICAoZGVmaW5lZChfTElCQ1BQX0NPTVBJTEVSX01TVkMpIHx8IF9faGFzX2RlY2xzcGVjX2F0dHJpYnV0ZShlbXB0eV9iYXNlcykpCisjICBkZWZpbmUgX0xJQkNQUF9ERUNMU1BFQ19FTVBUWV9CQVNFUyBfX2RlY2xzcGVjKGVtcHR5X2Jhc2VzKQorI2Vsc2UKKyMgIGRlZmluZSBfTElCQ1BQX0RFQ0xTUEVDX0VNUFRZX0JBU0VTCisjZW5kaWYKKworI2lmIGRlZmluZWQoX0xJQkNQUF9FTkFCTEVfQ1hYMTdfUkVNT1ZFRF9GRUFUVVJFUykKKyNkZWZpbmUgX0xJQkNQUF9FTkFCTEVfQ1hYMTdfUkVNT1ZFRF9BVVRPX1BUUgorI2RlZmluZSBfTElCQ1BQX0VOQUJMRV9DWFgxN19SRU1PVkVEX1VORVhQRUNURURfRlVOQ1RJT05TCisjZGVmaW5lIF9MSUJDUFBfRU5BQkxFX0NYWDE3X1JFTU9WRURfUkFORE9NX1NIVUZGTEUKKyNkZWZpbmUgX0xJQkNQUF9FTkFCTEVfQ1hYMTdfUkVNT1ZFRF9CSU5ERVJTCisjZW5kaWYgLy8gX0xJQkNQUF9FTkFCTEVfQ1hYMTdfUkVNT1ZFRF9GRUFUVVJFUworCisjaWYgIWRlZmluZWQoX19jcHBfZGVkdWN0aW9uX2d1aWRlcykgfHwgX19jcHBfZGVkdWN0aW9uX2d1aWRlcyA8IDIwMTYxMQorI2RlZmluZSBfTElCQ1BQX0hBU19OT19ERURVQ1RJT05fR1VJREVTCisjZW5kaWYKKworI2lmICFfX2hhc19rZXl3b3JkKF9faXNfYWdncmVnYXRlKSAmJiAoX0dOVUNfVkVSX05FVyA8IDcwMDEpCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX0lTX0FHR1JFR0FURQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX2NwcF9jb3JvdXRpbmVzKSB8fCBfX2NwcF9jb3JvdXRpbmVzIDwgMjAxNzAzTAorI2RlZmluZSBfTElCQ1BQX0hBU19OT19DT1JPVVRJTkVTCisjZW5kaWYKKworLy8gRGVjaWRlIHdoZXRoZXIgdG8gdXNlIGF2YWlsYWJpbGl0eSBtYWNyb3MuCisjaWYgIWRlZmluZWQoX0xJQkNQUF9CVUlMRElOR19MSUJSQVJZKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICFkZWZpbmVkKF9MSUJDUFBfRElTQUJMRV9BVkFJTEFCSUxJVFkpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2hhc19mZWF0dXJlKGF0dHJpYnV0ZV9hdmFpbGFiaWxpdHlfd2l0aF9zdHJpY3QpICYmICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19oYXNfZmVhdHVyZShhdHRyaWJ1dGVfYXZhaWxhYmlsaXR5X2luX3RlbXBsYXRlcykKKyMgIGlmZGVmIF9fQVBQTEVfXworIyAgICBkZWZpbmUgX0xJQkNQUF9VU0VfQVZBSUxBQklMSVRZX0FQUExFCisjICBlbmRpZgorI2VuZGlmCisKKy8vIERlZmluZSBhdmFpbGFiaWxpdHkgbWFjcm9zLgorI2lmIGRlZmluZWQoX0xJQkNQUF9VU0VfQVZBSUxBQklMSVRZX0FQUExFKQorIyAgZGVmaW5lIF9MSUJDUFBfQVZBSUxBQklMSVRZX1NIQVJFRF9NVVRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KG1hY29zeCxzdHJpY3QsaW50cm9kdWNlZD0xMC4xMikpKSAgICAgICAgICAgICBcCisgICAgIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShpb3Msc3RyaWN0LGludHJvZHVjZWQ9MTAuMCkpKSAgICAgICAgICAgICAgICAgXAorICAgICBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkodHZvcyxzdHJpY3QsaW50cm9kdWNlZD0xMC4wKSkpICAgICAgICAgICAgICAgIFwKKyAgICAgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KHdhdGNob3Msc3RyaWN0LGludHJvZHVjZWQ9My4wKSkpCisjICBkZWZpbmUgX0xJQkNQUF9BVkFJTEFCSUxJVFlfQkFEX09QVElPTkFMX0FDQ0VTUyBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSkpCisjICBkZWZpbmUgX0xJQkNQUF9BVkFJTEFCSUxJVFlfQkFEX0FSUkFZX0xFTkdUSCBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSkpCisjICBkZWZpbmUgX0xJQkNQUF9BVkFJTEFCSUxJVFlfQkFEX0FOWV9DQVNUIF9fYXR0cmlidXRlX18oKHVuYXZhaWxhYmxlKSkKKyMgIGRlZmluZSBfTElCQ1BQX0FWQUlMQUJJTElUWV9VTkNBVUdIVF9FWENFUFRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsc3RyaWN0LGludHJvZHVjZWQ9MTAuMTIpKSkgICAgICAgICAgICAgXAorICAgICBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkoaW9zLHN0cmljdCxpbnRyb2R1Y2VkPTEwLjApKSkgICAgICAgICAgICAgICAgIFwKKyAgICAgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KHR2b3Msc3RyaWN0LGludHJvZHVjZWQ9MTAuMCkpKSAgICAgICAgICAgICAgICBcCisgICAgIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eSh3YXRjaG9zLHN0cmljdCxpbnRyb2R1Y2VkPTMuMCkpKQorIyAgZGVmaW5lIF9MSUJDUFBfQVZBSUxBQklMSVRZX1NJWkVEX05FV19ERUxFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KG1hY29zeCxzdHJpY3QsaW50cm9kdWNlZD0xMC4xMikpKSAgICAgICAgICAgICBcCisgICAgIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShpb3Msc3RyaWN0LGludHJvZHVjZWQ9MTAuMCkpKSAgICAgICAgICAgICAgICAgXAorICAgICBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkodHZvcyxzdHJpY3QsaW50cm9kdWNlZD0xMC4wKSkpICAgICAgICAgICAgICAgIFwKKyAgICAgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KHdhdGNob3Msc3RyaWN0LGludHJvZHVjZWQ9My4wKSkpCisjICBkZWZpbmUgX0xJQkNQUF9BVkFJTEFCSUxJVFlfRlVUVVJFX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkoaW9zLHN0cmljdCxpbnRyb2R1Y2VkPTYuMCkpKQorIyAgZGVmaW5lIF9MSUJDUFBfQVZBSUxBQklMSVRZX1RZUEVJTkZPX1ZUQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KG1hY29zeCxzdHJpY3QsaW50cm9kdWNlZD0xMC45KSkpICAgICAgICAgICAgICBcCisgICAgIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShpb3Msc3RyaWN0LGludHJvZHVjZWQ9Ny4wKSkpCisjICBkZWZpbmUgX0xJQkNQUF9BVkFJTEFCSUxJVFlfTE9DQUxFX0NBVEVHT1JZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LHN0cmljdCxpbnRyb2R1Y2VkPTEwLjkpKSkgICAgICAgICAgICAgIFwKKyAgICAgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KGlvcyxzdHJpY3QsaW50cm9kdWNlZD03LjApKSkKKyMgIGRlZmluZSBfTElCQ1BQX0FWQUlMQUJJTElUWV9BVE9NSUNfU0hBUkVEX1BUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsc3RyaWN0LGludHJvZHVjZWQ9MTAuOSkpKSAgICAgICAgICAgICAgXAorICAgICBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkoaW9zLHN0cmljdCxpbnRyb2R1Y2VkPTcuMCkpKQorI2Vsc2UKKyMgIGRlZmluZSBfTElCQ1BQX0FWQUlMQUJJTElUWV9TSEFSRURfTVVURVgKKyMgIGRlZmluZSBfTElCQ1BQX0FWQUlMQUJJTElUWV9CQURfT1BUSU9OQUxfQUNDRVNTCisjICBkZWZpbmUgX0xJQkNQUF9BVkFJTEFCSUxJVFlfQkFEX0FSUkFZX0xFTkdUSAorIyAgZGVmaW5lIF9MSUJDUFBfQVZBSUxBQklMSVRZX0JBRF9BTllfQ0FTVAorIyAgZGVmaW5lIF9MSUJDUFBfQVZBSUxBQklMSVRZX1VOQ0FVR0hUX0VYQ0VQVElPTlMKKyMgIGRlZmluZSBfTElCQ1BQX0FWQUlMQUJJTElUWV9TSVpFRF9ORVdfREVMRVRFCisjICBkZWZpbmUgX0xJQkNQUF9BVkFJTEFCSUxJVFlfRlVUVVJFX0VSUk9SCisjICBkZWZpbmUgX0xJQkNQUF9BVkFJTEFCSUxJVFlfVFlQRUlORk9fVlRBQkxFCisjICBkZWZpbmUgX0xJQkNQUF9BVkFJTEFCSUxJVFlfTE9DQUxFX0NBVEVHT1JZCisjICBkZWZpbmUgX0xJQkNQUF9BVkFJTEFCSUxJVFlfQVRPTUlDX1NIQVJFRF9QVFIKKyNlbmRpZgorCisvLyBEZWZpbmUgYXZhaWxhYmlsaXR5IHRoYXQgZGVwZW5kcyBvbiBfTElCQ1BQX05PX0VYQ0VQVElPTlMuCisjaWZkZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisjICBkZWZpbmUgX0xJQkNQUF9BVkFJTEFCSUxJVFlfRFlOQVJSQVkKKyMgIGRlZmluZSBfTElCQ1BQX0FWQUlMQUJJTElUWV9GVVRVUkUKKyMgIGRlZmluZSBfTElCQ1BQX0FWQUlMQUJJTElUWV9USFJPV19CQURfQU5ZX0NBU1QKKyNlbHNlCisjICBkZWZpbmUgX0xJQkNQUF9BVkFJTEFCSUxJVFlfRFlOQVJSQVkgX0xJQkNQUF9BVkFJTEFCSUxJVFlfQkFEX0FSUkFZX0xFTkdUSAorIyAgZGVmaW5lIF9MSUJDUFBfQVZBSUxBQklMSVRZX0ZVVFVSRSBfTElCQ1BQX0FWQUlMQUJJTElUWV9GVVRVUkVfRVJST1IKKyMgIGRlZmluZSBfTElCQ1BQX0FWQUlMQUJJTElUWV9USFJPV19CQURfQU5ZX0NBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIF9MSUJDUFBfQVZBSUxBQklMSVRZX0JBRF9BTllfQ0FTVAorI2VuZGlmCisKKy8vIEF2YWlsYWJpbGl0eSBvZiBzdHJlYW0gQVBJIGluIHRoZSBkeWxpYiBnb3QgZHJvcHBlZCBhbmQgcmUtYWRkZWQuICBUaGUKKy8vIGV4dGVybiB0ZW1wbGF0ZSBzaG91bGQgZWZmZWN0aXZlbHkgYmUgYXZhaWxhYmxlIGF0OgorLy8gICAgYXZhaWxhYmlsaXR5KG1hY29zeCxpbnRyb2R1Y2VkPTEwLjkpCisvLyAgICBhdmFpbGFiaWxpdHkoaW9zLGludHJvZHVjZWQ9Ny4wKQorI2lmIGRlZmluZWQoX0xJQkNQUF9VU0VfQVZBSUxBQklMSVRZX0FQUExFKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKGRlZmluZWQoX19FTlZJUk9OTUVOVF9NQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRF9fKSAmJiAgICAgICAgICAgICAgICBcCisgICAgICBfX0VOVklST05NRU5UX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEX18gPCAxMDkwKSB8fCAgICAgICAgICAgICAgICAgXAorICAgICAoZGVmaW5lZChfX0VOVklST05NRU5UX0lQSE9ORV9PU19WRVJTSU9OX01JTl9SRVFVSVJFRF9fKSAmJiAgICAgICAgICAgICAgIFwKKyAgICAgIF9fRU5WSVJPTk1FTlRfSVBIT05FX09TX1ZFUlNJT05fTUlOX1JFUVVJUkVEX18gPCA3MDAwMCkpCisjZGVmaW5lIF9MSUJDUFBfQVZBSUxBQklMSVRZX05PX1NUUkVBTVNfRVhURVJOX1RFTVBMQVRFCisjZW5kaWYKKworI2lmIGRlZmluZWQoX0xJQkNQUF9DT01QSUxFUl9JQk0pCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX1BSQUdNQV9QVVNIX1BPUF9NQUNSTworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9QVVNIX1BPUF9NQUNSTykKKyMgIGRlZmluZSBfTElCQ1BQX1BVU0hfTUFDUk9TCisjICBkZWZpbmUgX0xJQkNQUF9QT1BfTUFDUk9TCisjZWxzZQorICAvLyBEb24ndCB3YXJuIGFib3V0IG1hY3JvIGNvbmZsaWN0cyB3aGVuIHdlIGNhbiByZXN0b3JlIHRoZW0gYXQgdGhlCisgIC8vIGVuZCBvZiB0aGUgaGVhZGVyLgorIyAgaWZuZGVmIF9MSUJDUFBfRElTQUJMRV9NQUNST19DT05GTElDVF9XQVJOSU5HUworIyAgICBkZWZpbmUgX0xJQkNQUF9ESVNBQkxFX01BQ1JPX0NPTkZMSUNUX1dBUk5JTkdTCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZChfTElCQ1BQX0NPTVBJTEVSX01TVkMpCisjICAgIGRlZmluZSBfTElCQ1BQX1BVU0hfTUFDUk9TICAgIFwKKyAgICAgICBfX3ByYWdtYShwdXNoX21hY3JvKCJtaW4iKSkgXAorICAgICAgIF9fcHJhZ21hKHB1c2hfbWFjcm8oIm1heCIpKQorIyAgICBkZWZpbmUgX0xJQkNQUF9QT1BfTUFDUk9TICAgICBcCisgICAgICAgX19wcmFnbWEocG9wX21hY3JvKCJtaW4iKSkgIFwKKyAgICAgICBfX3ByYWdtYShwb3BfbWFjcm8oIm1heCIpKQorIyAgZWxzZQorIyAgICBkZWZpbmUgX0xJQkNQUF9QVVNIX01BQ1JPUyAgICAgICAgXAorICAgICAgIF9QcmFnbWEoInB1c2hfbWFjcm8oXCJtaW5cIikiKSAgXAorICAgICAgIF9QcmFnbWEoInB1c2hfbWFjcm8oXCJtYXhcIikiKQorIyAgICBkZWZpbmUgX0xJQkNQUF9QT1BfTUFDUk9TICAgICAgICAgXAorICAgICAgIF9QcmFnbWEoInBvcF9tYWNybyhcIm1pblwiKSIpICAgXAorICAgICAgIF9QcmFnbWEoInBvcF9tYWNybyhcIm1heFwiKSIpCisjICBlbmRpZgorI2VuZGlmIC8vIGRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1BVU0hfUE9QX01BQ1JPKQorCisjaWZuZGVmIF9MSUJDUFBfTk9fQVVUT19MSU5LCisjICBpZiBkZWZpbmVkKF9MSUJDUFBfQUJJX01JQ1JPU09GVCkgJiYgIWRlZmluZWQoX0xJQkNQUF9CVUlMRElOR19MSUJSQVJZKQorIyAgICBpZiBkZWZpbmVkKF9ETEwpCisjICAgICAgcHJhZ21hIGNvbW1lbnQobGliLCAiYysrLmxpYiIpCisjICAgIGVsc2UKKyMgICAgICBwcmFnbWEgY29tbWVudChsaWIsICJsaWJjKysubGliIikKKyMgICAgZW5kaWYKKyMgIGVuZGlmIC8vIGRlZmluZWQoX0xJQkNQUF9BQklfTUlDUk9TT0ZUKSAmJiAhZGVmaW5lZChfTElCQ1BQX0JVSUxESU5HX0xJQlJBUlkpCisjZW5kaWYgLy8gX0xJQkNQUF9OT19BVVRPX0xJTksKKworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvLyBfTElCQ1BQX0NPTkZJRwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fY3h4YWJpX2NvbmZpZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fY3h4YWJpX2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YjE5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX19jeHhhYmlfY29uZmlnLmgKQEAgLTAsMCArMSw2MyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBfX2N4eGFiaV9jb25maWcuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfX19fQ1hYQUJJX0NPTkZJR19ICisjZGVmaW5lIF9fX19DWFhBQklfQ09ORklHX0gKKworI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX19VU0lOR19TSkxKX0VYQ0VQVElPTlNfXykgJiYgICAgICAgICAgICAgICAgIFwKKyAgICAhZGVmaW5lZChfX0FSTV9EV0FSRl9FSF9fKQorI2RlZmluZSBfTElCQ1hYQUJJX0FSTV9FSEFCSQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX2hhc19hdHRyaWJ1dGUpCisjZGVmaW5lIF9faGFzX2F0dHJpYnV0ZShfYXR0cmlidXRlXykgMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyAjaWYgZGVmaW5lZChfTElCQ1hYQUJJX0RJU0FCTEVfVklTSUJJTElUWV9BTk5PVEFUSU9OUykKKyAgI2RlZmluZSBfTElCQ1hYQUJJX0hJRERFTgorICAjZGVmaW5lIF9MSUJDWFhBQklfREFUQV9WSVMKKyAgI2RlZmluZSBfTElCQ1hYQUJJX0ZVTkNfVklTCisgICNkZWZpbmUgX0xJQkNYWEFCSV9UWVBFX1ZJUworICNlbGlmIGRlZmluZWQoX0xJQkNYWEFCSV9CVUlMRElOR19MSUJSQVJZKQorICAjZGVmaW5lIF9MSUJDWFhBQklfSElEREVOCisgICNkZWZpbmUgX0xJQkNYWEFCSV9EQVRBX1ZJUyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyAgI2RlZmluZSBfTElCQ1hYQUJJX0ZVTkNfVklTIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorICAjZGVmaW5lIF9MSUJDWFhBQklfVFlQRV9WSVMgX19kZWNsc3BlYyhkbGxleHBvcnQpCisgI2Vsc2UKKyAgI2RlZmluZSBfTElCQ1hYQUJJX0hJRERFTgorICAjZGVmaW5lIF9MSUJDWFhBQklfREFUQV9WSVMgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisgICNkZWZpbmUgX0xJQkNYWEFCSV9GVU5DX1ZJUyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyAgI2RlZmluZSBfTElCQ1hYQUJJX1RZUEVfVklTIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorICNlbmRpZgorI2Vsc2UKKyAjaWYgIWRlZmluZWQoX0xJQkNYWEFCSV9ESVNBQkxFX1ZJU0lCSUxJVFlfQU5OT1RBVElPTlMpCisgICNkZWZpbmUgX0xJQkNYWEFCSV9ISURERU4gX19hdHRyaWJ1dGVfXygoX192aXNpYmlsaXR5X18oImhpZGRlbiIpKSkKKyAgI2RlZmluZSBfTElCQ1hYQUJJX0RBVEFfVklTIF9fYXR0cmlidXRlX18oKF9fdmlzaWJpbGl0eV9fKCJkZWZhdWx0IikpKQorICAjZGVmaW5lIF9MSUJDWFhBQklfRlVOQ19WSVMgX19hdHRyaWJ1dGVfXygoX192aXNpYmlsaXR5X18oImRlZmF1bHQiKSkpCisgICNpZiBfX2hhc19hdHRyaWJ1dGUoX190eXBlX3Zpc2liaWxpdHlfXykKKyAgICNkZWZpbmUgX0xJQkNYWEFCSV9UWVBFX1ZJUyBfX2F0dHJpYnV0ZV9fKChfX3R5cGVfdmlzaWJpbGl0eV9fKCJkZWZhdWx0IikpKQorICAjZWxzZQorICAgI2RlZmluZSBfTElCQ1hYQUJJX1RZUEVfVklTIF9fYXR0cmlidXRlX18oKF9fdmlzaWJpbGl0eV9fKCJkZWZhdWx0IikpKQorICAjZW5kaWYKKyAjZWxzZQorICAjZGVmaW5lIF9MSUJDWFhBQklfSElEREVOCisgICNkZWZpbmUgX0xJQkNYWEFCSV9EQVRBX1ZJUworICAjZGVmaW5lIF9MSUJDWFhBQklfRlVOQ19WSVMKKyAgI2RlZmluZSBfTElCQ1hYQUJJX1RZUEVfVklTCisgI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX1dJTjMyKQorI2RlZmluZSBfTElCQ1hYQUJJX1dFQUsKKyNlbHNlCisjZGVmaW5lIF9MSUJDWFhBQklfV0VBSyBfX2F0dHJpYnV0ZV9fKChfX3dlYWtfXykpCisjZW5kaWYKKworI2VuZGlmIC8vIF9fX19DWFhBQklfQ09ORklHX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX2RlYnVnIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fZGVidWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxYmFjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX2RlYnVnCkBAIC0wLDAgKzEsMzAyIEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gX19kZWJ1ZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0RFQlVHX0gKKyNkZWZpbmUgX0xJQkNQUF9ERUJVR19ICisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfSEFTX05PX05VTExQVFIpCisjIGluY2x1ZGUgPGNzdGRkZWY+CisjZW5kaWYKKworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMSB8fCBkZWZpbmVkKF9MSUJDUFBfQlVJTERJTkdfTElCUkFSWSkKKyMgICBpbmNsdWRlIDxjc3RkbGliPgorIyAgIGluY2x1ZGUgPGNzdGRpbz4KKyMgICBpbmNsdWRlIDxjc3RkZGVmPgorIyAgIGluY2x1ZGUgPGV4Y2VwdGlvbj4KKyNlbmRpZgorCisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAxICYmICFkZWZpbmVkKF9MSUJDUFBfQVNTRVJUKQorIyBkZWZpbmUgX0xJQkNQUF9BU1NFUlQoeCwgbSkgKCh4KSA/ICh2b2lkKTAgOiBcCisgIF9WU1REOjpfX2xpYmNwcF9kZWJ1Z19mdW5jdGlvbihfVlNURDo6X19saWJjcHBfZGVidWdfaW5mbyhfX0ZJTEVfXywgX19MSU5FX18sICN4LCBtKSkpCisjZW5kaWYKKworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorI2lmbmRlZiBfTElCQ1BQX0RFQlVHX0FTU0VSVAorI2RlZmluZSBfTElCQ1BQX0RFQlVHX0FTU0VSVCh4LCBtKSBfTElCQ1BQX0FTU0VSVCh4LCBtKQorI2VuZGlmCisjZGVmaW5lIF9MSUJDUFBfREVCVUdfTU9ERSguLi4pIF9fVkFfQVJHU19fCisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX0FTU0VSVAorIyAgIGRlZmluZSBfTElCQ1BQX0FTU0VSVCh4LCBtKSAoKHZvaWQpMCkKKyNlbmRpZgorI2lmbmRlZiBfTElCQ1BQX0RFQlVHX0FTU0VSVAorIyAgIGRlZmluZSBfTElCQ1BQX0RFQlVHX0FTU0VSVCh4LCBtKSAoKHZvaWQpMCkKKyNlbmRpZgorI2lmbmRlZiBfTElCQ1BQX0RFQlVHX01PREUKKyNkZWZpbmUgX0xJQkNQUF9ERUJVR19NT0RFKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPCAxCitjbGFzcyBfTElCQ1BQX0VYQ0VQVElPTl9BQkkgX19saWJjcHBfZGVidWdfZXhjZXB0aW9uOworI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgX19saWJjcHBfZGVidWdfaW5mbyB7CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIKKyAgX19saWJjcHBfZGVidWdfaW5mbygpCisgICAgICA6IF9fZmlsZV8obnVsbHB0ciksIF9fbGluZV8oLTEpLCBfX3ByZWRfKG51bGxwdHIpLCBfX21zZ18obnVsbHB0cikge30KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgorICBfX2xpYmNwcF9kZWJ1Z19pbmZvKGNvbnN0IGNoYXIqIF9fZiwgaW50IF9fbCwgY29uc3QgY2hhciogX19wLCBjb25zdCBjaGFyKiBfX20pCisgICAgOiBfX2ZpbGVfKF9fZiksIF9fbGluZV8oX19sKSwgX19wcmVkXyhfX3ApLCBfX21zZ18oX19tKSB7fQorICBjb25zdCBjaGFyKiBfX2ZpbGVfOworICBpbnQgX19saW5lXzsKKyAgY29uc3QgY2hhciogX19wcmVkXzsKKyAgY29uc3QgY2hhciogX19tc2dfOworfTsKKworLy8vIF9fbGliY3BwX2RlYnVnX2Z1bmN0aW9uX3R5cGUgLSBUaGUgdHlwZSBvZiB0aGUgYXNzZXJ0aW9uIGZhaWx1cmUgaGFuZGxlci4KK3R5cGVkZWYgdm9pZCgqX19saWJjcHBfZGVidWdfZnVuY3Rpb25fdHlwZSkoX19saWJjcHBfZGVidWdfaW5mbyBjb25zdCYpOworCisvLy8gX19saWJjcHBfZGVidWdfZnVuY3Rpb24gLSBUaGUgaGFuZGxlciBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIF9MSUJDUFBfQVNTRVJUCisvLy8gICAgZmFpbHMuCitleHRlcm4gX0xJQkNQUF9FWFRFUk5fVklTIF9fbGliY3BwX2RlYnVnX2Z1bmN0aW9uX3R5cGUgX19saWJjcHBfZGVidWdfZnVuY3Rpb247CisKKy8vLyBfX2xpYmNwcF9hYm9ydF9kZWJ1Z19mdW5jdGlvbiAtIEEgZGVidWcgaGFuZGxlciB0aGF0IGFib3J0cyB3aGVuIGNhbGxlZC4KK19MSUJDUFBfTk9SRVRVUk4gX0xJQkNQUF9GVU5DX1ZJUwordm9pZCBfX2xpYmNwcF9hYm9ydF9kZWJ1Z19mdW5jdGlvbihfX2xpYmNwcF9kZWJ1Z19pbmZvIGNvbnN0Jik7CisKKy8vLyBfX2xpYmNwcF90aHJvd19kZWJ1Z19mdW5jdGlvbiAtIEEgZGVidWcgaGFuZGxlciB0aGF0IHRocm93cworLy8vICAgYW4gaW5zdGFuY2Ugb2YgX19saWJjcHBfZGVidWdfZXhjZXB0aW9uIHdoZW4gY2FsbGVkLgorIF9MSUJDUFBfTk9SRVRVUk4gX0xJQkNQUF9GVU5DX1ZJUwordm9pZCBfX2xpYmNwcF90aHJvd19kZWJ1Z19mdW5jdGlvbihfX2xpYmNwcF9kZWJ1Z19pbmZvIGNvbnN0Jik7CisKKy8vLyBfX2xpYmNwcF9zZXRfZGVidWdfZnVuY3Rpb24gLSBTZXQgdGhlIGRlYnVnIGhhbmRsZXIgdG8gdGhlIHNwZWNpZmllZAorLy8vICAgIGZ1bmN0aW9uLgorX0xJQkNQUF9GVU5DX1ZJUworYm9vbCBfX2xpYmNwcF9zZXRfZGVidWdfZnVuY3Rpb24oX19saWJjcHBfZGVidWdfZnVuY3Rpb25fdHlwZSBfX2Z1bmMpOworCisvLyBTZXR1cCB0aGUgdGhyb3dpbmcgZGVidWcgaGFuZGxlciBkdXJpbmcgZHluYW1pYyBpbml0aWFsaXphdGlvbi4KKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDEgJiYgZGVmaW5lZChfTElCQ1BQX0RFQlVHX1VTRV9FWENFUFRJT05TKQorIyBpZiBkZWZpbmVkKF9MSUJDUFBfTk9fRVhDRVBUSU9OUykKKyMgICBlcnJvciBfTElCQ1BQX0RFQlVHX1VTRV9FWENFUFRJT05TIGNhbm5vdCBiZSB1c2VkIHdoZW4gZXhjZXB0aW9ucyBhcmUgZGlzYWJsZWQuCisjIGVuZGlmCitzdGF0aWMgYm9vbCBfX2luaXRfZHVtbXkgPSBfX2xpYmNwcF9zZXRfZGVidWdfZnVuY3Rpb24oX19saWJjcHBfdGhyb3dfZGVidWdfZnVuY3Rpb24pOworI2VuZGlmCisKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDEgfHwgZGVmaW5lZChfTElCQ1BQX0JVSUxESU5HX0xJQlJBUlkpCitjbGFzcyBfTElCQ1BQX0VYQ0VQVElPTl9BQkkgX19saWJjcHBfZGVidWdfZXhjZXB0aW9uIDogcHVibGljIGV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIF9fbGliY3BwX2RlYnVnX2V4Y2VwdGlvbigpIF9OT0VYQ0VQVDsKKyAgZXhwbGljaXQgX19saWJjcHBfZGVidWdfZXhjZXB0aW9uKF9fbGliY3BwX2RlYnVnX2luZm8gY29uc3QmIF9faSk7CisgIF9fbGliY3BwX2RlYnVnX2V4Y2VwdGlvbihfX2xpYmNwcF9kZWJ1Z19leGNlcHRpb24gY29uc3QmKTsKKyAgfl9fbGliY3BwX2RlYnVnX2V4Y2VwdGlvbigpIF9OT0VYQ0VQVDsKKyAgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9OT0VYQ0VQVDsKK3ByaXZhdGU6CisgIHN0cnVjdCBfX2xpYmNwcF9kZWJ1Z19leGNlcHRpb25faW1wOworICBfX2xpYmNwcF9kZWJ1Z19leGNlcHRpb25faW1wICpfX2ltcF87Cit9OworI2VuZGlmCisKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIgfHwgZGVmaW5lZChfTElCQ1BQX0JVSUxESU5HX0xJQlJBUlkpCisKK3N0cnVjdCBfTElCQ1BQX1RZUEVfVklTIF9fY19ub2RlOworCitzdHJ1Y3QgX0xJQkNQUF9UWVBFX1ZJUyBfX2lfbm9kZQoreworICAgIHZvaWQqIF9faV87CisgICAgX19pX25vZGUqIF9fbmV4dF87CisgICAgX19jX25vZGUqIF9fY187CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX19pX25vZGUoY29uc3QgX19pX25vZGUmKSA9IGRlbGV0ZTsKKyAgICBfX2lfbm9kZSYgb3BlcmF0b3I9KGNvbnN0IF9faV9ub2RlJikgPSBkZWxldGU7CisjZWxzZQorcHJpdmF0ZToKKyAgICBfX2lfbm9kZShjb25zdCBfX2lfbm9kZSYpOworICAgIF9faV9ub2RlJiBvcGVyYXRvcj0oY29uc3QgX19pX25vZGUmKTsKK3B1YmxpYzoKKyNlbmRpZgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2lfbm9kZSh2b2lkKiBfX2ksIF9faV9ub2RlKiBfX25leHQsIF9fY19ub2RlKiBfX2MpCisgICAgICAgIDogX19pXyhfX2kpLCBfX25leHRfKF9fbmV4dCksIF9fY18oX19jKSB7fQorICAgIH5fX2lfbm9kZSgpOworfTsKKworc3RydWN0IF9MSUJDUFBfVFlQRV9WSVMgX19jX25vZGUKK3sKKyAgICB2b2lkKiBfX2NfOworICAgIF9fY19ub2RlKiBfX25leHRfOworICAgIF9faV9ub2RlKiogYmVnXzsKKyAgICBfX2lfbm9kZSoqIGVuZF87CisgICAgX19pX25vZGUqKiBjYXBfOworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9fY19ub2RlKGNvbnN0IF9fY19ub2RlJikgPSBkZWxldGU7CisgICAgX19jX25vZGUmIG9wZXJhdG9yPShjb25zdCBfX2Nfbm9kZSYpID0gZGVsZXRlOworI2Vsc2UKK3ByaXZhdGU6CisgICAgX19jX25vZGUoY29uc3QgX19jX25vZGUmKTsKKyAgICBfX2Nfbm9kZSYgb3BlcmF0b3I9KGNvbnN0IF9fY19ub2RlJik7CitwdWJsaWM6CisjZW5kaWYKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19jX25vZGUodm9pZCogX19jLCBfX2Nfbm9kZSogX19uZXh0KQorICAgICAgICA6IF9fY18oX19jKSwgX19uZXh0XyhfX25leHQpLCBiZWdfKG51bGxwdHIpLCBlbmRfKG51bGxwdHIpLCBjYXBfKG51bGxwdHIpIHt9CisgICAgdmlydHVhbCB+X19jX25vZGUoKTsKKworICAgIHZpcnR1YWwgYm9vbCBfX2RlcmVmZXJlbmNlYWJsZShjb25zdCB2b2lkKikgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCBfX2RlY3JlbWVudGFibGUoY29uc3Qgdm9pZCopIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgX19hZGRhYmxlKGNvbnN0IHZvaWQqLCBwdHJkaWZmX3QpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgX19zdWJzY3JpcHRhYmxlKGNvbnN0IHZvaWQqLCBwdHJkaWZmX3QpIGNvbnN0ID0gMDsKKworICAgIHZvaWQgX19hZGQoX19pX25vZGUqIF9faSk7CisgICAgX0xJQkNQUF9ISURERU4gdm9pZCBfX3JlbW92ZShfX2lfbm9kZSogX19pKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udD4KK3N0cnVjdCBfQ19ub2RlCisgICAgOiBwdWJsaWMgX19jX25vZGUKK3sKKyAgICBfQ19ub2RlKHZvaWQqIF9fYywgX19jX25vZGUqIF9fbikKKyAgICAgICAgOiBfX2Nfbm9kZShfX2MsIF9fbikge30KKworICAgIHZpcnR1YWwgYm9vbCBfX2RlcmVmZXJlbmNlYWJsZShjb25zdCB2b2lkKikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIF9fZGVjcmVtZW50YWJsZShjb25zdCB2b2lkKikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIF9fYWRkYWJsZShjb25zdCB2b2lkKiwgcHRyZGlmZl90KSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgX19zdWJzY3JpcHRhYmxlKGNvbnN0IHZvaWQqLCBwdHJkaWZmX3QpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Db250PgoraW5saW5lIGJvb2wKK19DX25vZGU8X0NvbnQ+OjpfX2RlcmVmZXJlbmNlYWJsZShjb25zdCB2b2lkKiBfX2kpIGNvbnN0Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udDo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3I7CisgICAgY29uc3QgaXRlcmF0b3IqIF9faiA9IHN0YXRpY19jYXN0PGNvbnN0IGl0ZXJhdG9yKj4oX19pKTsKKyAgICBfQ29udCogX0NwID0gc3RhdGljX2Nhc3Q8X0NvbnQqPihfX2NfKTsKKyAgICByZXR1cm4gX0NwLT5fX2RlcmVmZXJlbmNlYWJsZShfX2opOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnQ+CitpbmxpbmUgYm9vbAorX0Nfbm9kZTxfQ29udD46Ol9fZGVjcmVtZW50YWJsZShjb25zdCB2b2lkKiBfX2kpIGNvbnN0Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udDo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3I7CisgICAgY29uc3QgaXRlcmF0b3IqIF9faiA9IHN0YXRpY19jYXN0PGNvbnN0IGl0ZXJhdG9yKj4oX19pKTsKKyAgICBfQ29udCogX0NwID0gc3RhdGljX2Nhc3Q8X0NvbnQqPihfX2NfKTsKKyAgICByZXR1cm4gX0NwLT5fX2RlY3JlbWVudGFibGUoX19qKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db250PgoraW5saW5lIGJvb2wKK19DX25vZGU8X0NvbnQ+OjpfX2FkZGFibGUoY29uc3Qgdm9pZCogX19pLCBwdHJkaWZmX3QgX19uKSBjb25zdAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnQ6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworICAgIGNvbnN0IGl0ZXJhdG9yKiBfX2ogPSBzdGF0aWNfY2FzdDxjb25zdCBpdGVyYXRvcio+KF9faSk7CisgICAgX0NvbnQqIF9DcCA9IHN0YXRpY19jYXN0PF9Db250Kj4oX19jXyk7CisgICAgcmV0dXJuIF9DcC0+X19hZGRhYmxlKF9faiwgX19uKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db250PgoraW5saW5lIGJvb2wKK19DX25vZGU8X0NvbnQ+OjpfX3N1YnNjcmlwdGFibGUoY29uc3Qgdm9pZCogX19pLCBwdHJkaWZmX3QgX19uKSBjb25zdAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnQ6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworICAgIGNvbnN0IGl0ZXJhdG9yKiBfX2ogPSBzdGF0aWNfY2FzdDxjb25zdCBpdGVyYXRvcio+KF9faSk7CisgICAgX0NvbnQqIF9DcCA9IHN0YXRpY19jYXN0PF9Db250Kj4oX19jXyk7CisgICAgcmV0dXJuIF9DcC0+X19zdWJzY3JpcHRhYmxlKF9faiwgX19uKTsKK30KKworY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBfX2xpYmNwcF9kYgoreworICAgIF9fY19ub2RlKiogX19jYmVnXzsKKyAgICBfX2Nfbm9kZSoqIF9fY2VuZF87CisgICAgc2l6ZV90ICAgX19jc3pfOworICAgIF9faV9ub2RlKiogX19pYmVnXzsKKyAgICBfX2lfbm9kZSoqIF9faWVuZF87CisgICAgc2l6ZV90ICAgX19pc3pfOworCisgICAgX19saWJjcHBfZGIoKTsKK3B1YmxpYzoKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX19saWJjcHBfZGIoY29uc3QgX19saWJjcHBfZGImKSA9IGRlbGV0ZTsKKyAgICBfX2xpYmNwcF9kYiYgb3BlcmF0b3I9KGNvbnN0IF9fbGliY3BwX2RiJikgPSBkZWxldGU7CisjZWxzZQorcHJpdmF0ZToKKyAgICBfX2xpYmNwcF9kYihjb25zdCBfX2xpYmNwcF9kYiYpOworICAgIF9fbGliY3BwX2RiJiBvcGVyYXRvcj0oY29uc3QgX19saWJjcHBfZGImKTsKK3B1YmxpYzoKKyNlbmRpZgorICAgIH5fX2xpYmNwcF9kYigpOworCisgICAgY2xhc3MgX19kYl9jX2l0ZXJhdG9yOworICAgIGNsYXNzIF9fZGJfY19jb25zdF9pdGVyYXRvcjsKKyAgICBjbGFzcyBfX2RiX2lfaXRlcmF0b3I7CisgICAgY2xhc3MgX19kYl9pX2NvbnN0X2l0ZXJhdG9yOworCisgICAgX19kYl9jX2NvbnN0X2l0ZXJhdG9yIF9fY19lbmQoKSBjb25zdDsKKyAgICBfX2RiX2lfY29uc3RfaXRlcmF0b3IgX19pX2VuZCgpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9Db250PgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9faW5zZXJ0X2MoX0NvbnQqIF9fYykKKyAgICB7CisgICAgICAgIF9fY19ub2RlKiBfX24gPSBfX2luc2VydF9jKHN0YXRpY19jYXN0PHZvaWQqPihfX2MpKTsKKyAgICAgICAgOjpuZXcoX19uKSBfQ19ub2RlPF9Db250PihfX24tPl9fY18sIF9fbi0+X19uZXh0Xyk7CisgICAgfQorCisgICAgdm9pZCBfX2luc2VydF9pKHZvaWQqIF9faSk7CisgICAgX19jX25vZGUqIF9faW5zZXJ0X2Modm9pZCogX19jKTsKKyAgICB2b2lkIF9fZXJhc2VfYyh2b2lkKiBfX2MpOworCisgICAgdm9pZCBfX2luc2VydF9pYyh2b2lkKiBfX2ksIGNvbnN0IHZvaWQqIF9fYyk7CisgICAgdm9pZCBfX2l0ZXJhdG9yX2NvcHkodm9pZCogX19pLCBjb25zdCB2b2lkKiBfX2kwKTsKKyAgICB2b2lkIF9fZXJhc2VfaSh2b2lkKiBfX2kpOworCisgICAgdm9pZCogX19maW5kX2NfZnJvbV9pKHZvaWQqIF9faSkgY29uc3Q7CisgICAgdm9pZCBfX2ludmFsaWRhdGVfYWxsKHZvaWQqIF9fYyk7CisgICAgX19jX25vZGUqIF9fZmluZF9jX2FuZF9sb2NrKHZvaWQqIF9fYykgY29uc3Q7CisgICAgX19jX25vZGUqIF9fZmluZF9jKHZvaWQqIF9fYykgY29uc3Q7CisgICAgdm9pZCB1bmxvY2soKSBjb25zdDsKKworICAgIHZvaWQgc3dhcCh2b2lkKiBfX2MxLCB2b2lkKiBfX2MyKTsKKworCisgICAgYm9vbCBfX2RlcmVmZXJlbmNlYWJsZShjb25zdCB2b2lkKiBfX2kpIGNvbnN0OworICAgIGJvb2wgX19kZWNyZW1lbnRhYmxlKGNvbnN0IHZvaWQqIF9faSkgY29uc3Q7CisgICAgYm9vbCBfX2FkZGFibGUoY29uc3Qgdm9pZCogX19pLCBwdHJkaWZmX3QgX19uKSBjb25zdDsKKyAgICBib29sIF9fc3Vic2NyaXB0YWJsZShjb25zdCB2b2lkKiBfX2ksIHB0cmRpZmZfdCBfX24pIGNvbnN0OworICAgIGJvb2wgX19sZXNzX3RoYW5fY29tcGFyYWJsZShjb25zdCB2b2lkKiBfX2ksIGNvbnN0IHZvaWQqIF9faikgY29uc3Q7Citwcml2YXRlOgorICAgIF9MSUJDUFBfSElEREVOCisgICAgX19pX25vZGUqIF9faW5zZXJ0X2l0ZXJhdG9yKHZvaWQqIF9faSk7CisgICAgX0xJQkNQUF9ISURERU4KKyAgICBfX2lfbm9kZSogX19maW5kX2l0ZXJhdG9yKGNvbnN0IHZvaWQqIF9faSkgY29uc3Q7CisKKyAgICBmcmllbmQgX0xJQkNQUF9GVU5DX1ZJUyBfX2xpYmNwcF9kYiogX19nZXRfZGIoKTsKK307CisKK19MSUJDUFBfRlVOQ19WSVMgX19saWJjcHBfZGIqIF9fZ2V0X2RiKCk7CitfTElCQ1BQX0ZVTkNfVklTIGNvbnN0IF9fbGliY3BwX2RiKiBfX2dldF9jb25zdF9kYigpOworCisKKyNlbmRpZiAvLyBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIgfHwgZGVmaW5lZChfTElCQ1BQX0JVSUxESU5HX0xJQlJBUlkpCisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHX0gKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fZnVuY3Rpb25hbF8wMyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX2Z1bmN0aW9uYWxfMDMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkOGEzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX2Z1bmN0aW9uYWxfMDMKQEAgLTAsMCArMSwxNTc2IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0ZVTkNUSU9OQUxfMDMKKyNkZWZpbmUgX0xJQkNQUF9GVU5DVElPTkFMXzAzCisKKy8vIG1hbnVhbCB2YXJpYWRpYyBleHBhbnNpb24gZm9yIDxmdW5jdGlvbmFsPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworbmFtZXNwYWNlIF9fZnVuY3Rpb24geworCit0ZW1wbGF0ZTxjbGFzcyBfRnA+IGNsYXNzIF9fYmFzZTsKKwordGVtcGxhdGU8Y2xhc3MgX1JwPgorY2xhc3MgX19iYXNlPF9ScCgpPgoreworICAgIF9fYmFzZShjb25zdCBfX2Jhc2UmKTsKKyAgICBfX2Jhc2UmIG9wZXJhdG9yPShjb25zdCBfX2Jhc2UmKTsKK3B1YmxpYzoKKyAgICBfX2Jhc2UoKSB7fQorICAgIHZpcnR1YWwgfl9fYmFzZSgpIHt9CisgICAgdmlydHVhbCBfX2Jhc2UqIF9fY2xvbmUoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2b2lkIF9fY2xvbmUoX19iYXNlKikgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95X2RlYWxsb2NhdGUoKSA9IDA7CisgICAgdmlydHVhbCBfUnAgb3BlcmF0b3IoKSgpID0gMDsKKyNpZm5kZWYgX0xJQkNQUF9OT19SVFRJCisgICAgdmlydHVhbCBjb25zdCB2b2lkKiB0YXJnZXQoY29uc3QgdHlwZV9pbmZvJikgY29uc3QgPSAwOworICAgIHZpcnR1YWwgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHRhcmdldF90eXBlKCkgY29uc3QgPSAwOworI2VuZGlmICAvLyBfTElCQ1BQX05PX1JUVEkKK307CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0EwPgorY2xhc3MgX19iYXNlPF9ScChfQTApPgoreworICAgIF9fYmFzZShjb25zdCBfX2Jhc2UmKTsKKyAgICBfX2Jhc2UmIG9wZXJhdG9yPShjb25zdCBfX2Jhc2UmKTsKK3B1YmxpYzoKKyAgICBfX2Jhc2UoKSB7fQorICAgIHZpcnR1YWwgfl9fYmFzZSgpIHt9CisgICAgdmlydHVhbCBfX2Jhc2UqIF9fY2xvbmUoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2b2lkIF9fY2xvbmUoX19iYXNlKikgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95X2RlYWxsb2NhdGUoKSA9IDA7CisgICAgdmlydHVhbCBfUnAgb3BlcmF0b3IoKShfQTApID0gMDsKKyNpZm5kZWYgX0xJQkNQUF9OT19SVFRJCisgICAgdmlydHVhbCBjb25zdCB2b2lkKiB0YXJnZXQoY29uc3QgdHlwZV9pbmZvJikgY29uc3QgPSAwOworICAgIHZpcnR1YWwgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHRhcmdldF90eXBlKCkgY29uc3QgPSAwOworI2VuZGlmICAvLyBfTElCQ1BQX05PX1JUVEkKK307CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0EwLCBjbGFzcyBfQTE+CitjbGFzcyBfX2Jhc2U8X1JwKF9BMCwgX0ExKT4KK3sKKyAgICBfX2Jhc2UoY29uc3QgX19iYXNlJik7CisgICAgX19iYXNlJiBvcGVyYXRvcj0oY29uc3QgX19iYXNlJik7CitwdWJsaWM6CisgICAgX19iYXNlKCkge30KKyAgICB2aXJ0dWFsIH5fX2Jhc2UoKSB7fQorICAgIHZpcnR1YWwgX19iYXNlKiBfX2Nsb25lKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdm9pZCBfX2Nsb25lKF9fYmFzZSopIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveV9kZWFsbG9jYXRlKCkgPSAwOworICAgIHZpcnR1YWwgX1JwIG9wZXJhdG9yKCkoX0EwLCBfQTEpID0gMDsKKyNpZm5kZWYgX0xJQkNQUF9OT19SVFRJCisgICAgdmlydHVhbCBjb25zdCB2b2lkKiB0YXJnZXQoY29uc3QgdHlwZV9pbmZvJikgY29uc3QgPSAwOworICAgIHZpcnR1YWwgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHRhcmdldF90eXBlKCkgY29uc3QgPSAwOworI2VuZGlmICAvLyBfTElCQ1BQX05PX1JUVEkKK307CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KK2NsYXNzIF9fYmFzZTxfUnAoX0EwLCBfQTEsIF9BMik+Cit7CisgICAgX19iYXNlKGNvbnN0IF9fYmFzZSYpOworICAgIF9fYmFzZSYgb3BlcmF0b3I9KGNvbnN0IF9fYmFzZSYpOworcHVibGljOgorICAgIF9fYmFzZSgpIHt9CisgICAgdmlydHVhbCB+X19iYXNlKCkge30KKyAgICB2aXJ0dWFsIF9fYmFzZSogX19jbG9uZSgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgX19jbG9uZShfX2Jhc2UqKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRlc3Ryb3lfZGVhbGxvY2F0ZSgpID0gMDsKKyAgICB2aXJ0dWFsIF9ScCBvcGVyYXRvcigpKF9BMCwgX0ExLCBfQTIpID0gMDsKKyNpZm5kZWYgX0xJQkNQUF9OT19SVFRJCisgICAgdmlydHVhbCBjb25zdCB2b2lkKiB0YXJnZXQoY29uc3QgdHlwZV9pbmZvJikgY29uc3QgPSAwOworICAgIHZpcnR1YWwgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHRhcmdldF90eXBlKCkgY29uc3QgPSAwOworI2VuZGlmICAvLyBfTElCQ1BQX05PX1JUVEkKK307CisKK3RlbXBsYXRlPGNsYXNzIF9GRCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfRkI+IGNsYXNzIF9fZnVuYzsKKwordGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9ScD4KK2NsYXNzIF9fZnVuYzxfRnAsIF9BbGxvYywgX1JwKCk+CisgICAgOiBwdWJsaWMgIF9fYmFzZTxfUnAoKT4KK3sKKyAgICBfX2NvbXByZXNzZWRfcGFpcjxfRnAsIF9BbGxvYz4gX19mXzsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBfX2Z1bmMoX0ZwIF9fZikgOiBfX2ZfKF9WU1REOjptb3ZlKF9fZikpIHt9CisgICAgZXhwbGljaXQgX19mdW5jKF9GcCBfX2YsIF9BbGxvYyBfX2EpIDogX19mXyhfVlNURDo6bW92ZShfX2YpLCBfVlNURDo6bW92ZShfX2EpKSB7fQorICAgIHZpcnR1YWwgX19iYXNlPF9ScCgpPiogX19jbG9uZSgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBfX2Nsb25lKF9fYmFzZTxfUnAoKT4qKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgpOworICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95X2RlYWxsb2NhdGUoKTsKKyAgICB2aXJ0dWFsIF9ScCBvcGVyYXRvcigpKCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fUlRUSQorICAgIHZpcnR1YWwgY29uc3Qgdm9pZCogdGFyZ2V0KGNvbnN0IHR5cGVfaW5mbyYpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHRhcmdldF90eXBlKCkgY29uc3Q7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fUlRUSQorfTsKKwordGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9ScD4KK19fYmFzZTxfUnAoKT4qCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScCgpPjo6X19jbG9uZSgpIGNvbnN0Cit7CisgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz4gX19hbGxvY190cmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9hbGxvY19oZWxwZXI8X19hbGxvY190cmFpdHMsIF9fZnVuYz46OnR5cGUgX0FwOworICAgIF9BcCBfX2EoX19mXy5zZWNvbmQoKSk7CisgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9BcD4gX0RwOworICAgIHVuaXF1ZV9wdHI8X19mdW5jLCBfRHA+IF9faG9sZChfX2EuYWxsb2NhdGUoMSksIF9EcChfX2EsIDEpKTsKKyAgICA6Om5ldyAoX19ob2xkLmdldCgpKSBfX2Z1bmMoX19mXy5maXJzdCgpLCBfQWxsb2MoX19hKSk7CisgICAgcmV0dXJuIF9faG9sZC5yZWxlYXNlKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUnA+Cit2b2lkCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScCgpPjo6X19jbG9uZShfX2Jhc2U8X1JwKCk+KiBfX3ApIGNvbnN0Cit7CisgICAgOjpuZXcgKF9fcCkgX19mdW5jKF9fZl8uZmlyc3QoKSwgX19mXy5zZWNvbmQoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUnA+Cit2b2lkCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScCgpPjo6ZGVzdHJveSgpCit7CisgICAgX19mXy5+X19jb21wcmVzc2VkX3BhaXI8X0ZwLCBfQWxsb2M+KCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUnA+Cit2b2lkCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScCgpPjo6ZGVzdHJveV9kZWFsbG9jYXRlKCkKK3sKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPiBfX2FsbG9jX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2FsbG9jX2hlbHBlcjxfX2FsbG9jX3RyYWl0cywgX19mdW5jPjo6dHlwZSBfQXA7CisgICAgX0FwIF9fYShfX2ZfLnNlY29uZCgpKTsKKyAgICBfX2ZfLn5fX2NvbXByZXNzZWRfcGFpcjxfRnAsIF9BbGxvYz4oKTsKKyAgICBfX2EuZGVhbGxvY2F0ZSh0aGlzLCAxKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9ScD4KK19ScAorX19mdW5jPF9GcCwgX0FsbG9jLCBfUnAoKT46Om9wZXJhdG9yKCkoKQoreworICAgIHR5cGVkZWYgX19pbnZva2Vfdm9pZF9yZXR1cm5fd3JhcHBlcjxfUnA+IF9JbnZva2VyOworICAgIHJldHVybiBfSW52b2tlcjo6X19jYWxsKF9fZl8uZmlyc3QoKSk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9OT19SVFRJCisKK3RlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUnA+Citjb25zdCB2b2lkKgorX19mdW5jPF9GcCwgX0FsbG9jLCBfUnAoKT46OnRhcmdldChjb25zdCB0eXBlX2luZm8mIF9fdGkpIGNvbnN0Cit7CisgICAgaWYgKF9fdGkgPT0gdHlwZWlkKF9GcCkpCisgICAgICAgIHJldHVybiAmX19mXy5maXJzdCgpOworICAgIHJldHVybiAoY29uc3Qgdm9pZCopMDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9ScD4KK2NvbnN0IHN0ZDo6dHlwZV9pbmZvJgorX19mdW5jPF9GcCwgX0FsbG9jLCBfUnAoKT46OnRhcmdldF90eXBlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gdHlwZWlkKF9GcCk7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19SVFRJCisKK3RlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUnAsIGNsYXNzIF9BMD4KK2NsYXNzIF9fZnVuYzxfRnAsIF9BbGxvYywgX1JwKF9BMCk+CisgICAgOiBwdWJsaWMgIF9fYmFzZTxfUnAoX0EwKT4KK3sKKyAgICBfX2NvbXByZXNzZWRfcGFpcjxfRnAsIF9BbGxvYz4gX19mXzsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IF9fZnVuYyhfRnAgX19mKSA6IF9fZl8oX1ZTVEQ6Om1vdmUoX19mKSkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IF9fZnVuYyhfRnAgX19mLCBfQWxsb2MgX19hKQorICAgICAgICA6IF9fZl8oX1ZTVEQ6Om1vdmUoX19mKSwgX1ZTVEQ6Om1vdmUoX19hKSkge30KKyAgICB2aXJ0dWFsIF9fYmFzZTxfUnAoX0EwKT4qIF9fY2xvbmUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgX19jbG9uZShfX2Jhc2U8X1JwKF9BMCk+KikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveV9kZWFsbG9jYXRlKCk7CisgICAgdmlydHVhbCBfUnAgb3BlcmF0b3IoKShfQTApOworI2lmbmRlZiBfTElCQ1BQX05PX1JUVEkKKyAgICB2aXJ0dWFsIGNvbnN0IHZvaWQqIHRhcmdldChjb25zdCB0eXBlX2luZm8mKSBjb25zdDsKKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0YXJnZXRfdHlwZSgpIGNvbnN0OworI2VuZGlmICAvLyBfTElCQ1BQX05PX1JUVEkKK307CisKK3RlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUnAsIGNsYXNzIF9BMD4KK19fYmFzZTxfUnAoX0EwKT4qCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQTApPjo6X19jbG9uZSgpIGNvbnN0Cit7CisgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz4gX19hbGxvY190cmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9hbGxvY19oZWxwZXI8X19hbGxvY190cmFpdHMsIF9fZnVuYz46OnR5cGUgX0FwOworICAgIF9BcCBfX2EoX19mXy5zZWNvbmQoKSk7CisgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9BcD4gX0RwOworICAgIHVuaXF1ZV9wdHI8X19mdW5jLCBfRHA+IF9faG9sZChfX2EuYWxsb2NhdGUoMSksIF9EcChfX2EsIDEpKTsKKyAgICA6Om5ldyAoX19ob2xkLmdldCgpKSBfX2Z1bmMoX19mXy5maXJzdCgpLCBfQWxsb2MoX19hKSk7CisgICAgcmV0dXJuIF9faG9sZC5yZWxlYXNlKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUnAsIGNsYXNzIF9BMD4KK3ZvaWQKK19fZnVuYzxfRnAsIF9BbGxvYywgX1JwKF9BMCk+OjpfX2Nsb25lKF9fYmFzZTxfUnAoX0EwKT4qIF9fcCkgY29uc3QKK3sKKyAgICA6Om5ldyAoX19wKSBfX2Z1bmMoX19mXy5maXJzdCgpLCBfX2ZfLnNlY29uZCgpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9ScCwgY2xhc3MgX0EwPgordm9pZAorX19mdW5jPF9GcCwgX0FsbG9jLCBfUnAoX0EwKT46OmRlc3Ryb3koKQoreworICAgIF9fZl8ufl9fY29tcHJlc3NlZF9wYWlyPF9GcCwgX0FsbG9jPigpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1JwLCBjbGFzcyBfQTA+Cit2b2lkCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQTApPjo6ZGVzdHJveV9kZWFsbG9jYXRlKCkKK3sKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPiBfX2FsbG9jX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2FsbG9jX2hlbHBlcjxfX2FsbG9jX3RyYWl0cywgX19mdW5jPjo6dHlwZSBfQXA7CisgICAgX0FwIF9fYShfX2ZfLnNlY29uZCgpKTsKKyAgICBfX2ZfLn5fX2NvbXByZXNzZWRfcGFpcjxfRnAsIF9BbGxvYz4oKTsKKyAgICBfX2EuZGVhbGxvY2F0ZSh0aGlzLCAxKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9ScCwgY2xhc3MgX0EwPgorX1JwCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQTApPjo6b3BlcmF0b3IoKShfQTAgX19hMCkKK3sKKyAgICB0eXBlZGVmIF9faW52b2tlX3ZvaWRfcmV0dXJuX3dyYXBwZXI8X1JwPiBfSW52b2tlcjsKKyAgICByZXR1cm4gX0ludm9rZXI6Ol9fY2FsbChfX2ZfLmZpcnN0KCksIF9fYTApOworfQorCisjaWZuZGVmIF9MSUJDUFBfTk9fUlRUSQorCit0ZW1wbGF0ZTxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1JwLCBjbGFzcyBfQTA+Citjb25zdCB2b2lkKgorX19mdW5jPF9GcCwgX0FsbG9jLCBfUnAoX0EwKT46OnRhcmdldChjb25zdCB0eXBlX2luZm8mIF9fdGkpIGNvbnN0Cit7CisgICAgaWYgKF9fdGkgPT0gdHlwZWlkKF9GcCkpCisgICAgICAgIHJldHVybiAmX19mXy5maXJzdCgpOworICAgIHJldHVybiAoY29uc3Qgdm9pZCopMDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9ScCwgY2xhc3MgX0EwPgorY29uc3Qgc3RkOjp0eXBlX2luZm8mCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQTApPjo6dGFyZ2V0X3R5cGUoKSBjb25zdAoreworICAgIHJldHVybiB0eXBlaWQoX0ZwKTsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX05PX1JUVEkKKwordGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9ScCwgY2xhc3MgX0EwLCBjbGFzcyBfQTE+CitjbGFzcyBfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQTAsIF9BMSk+CisgICAgOiBwdWJsaWMgIF9fYmFzZTxfUnAoX0EwLCBfQTEpPgoreworICAgIF9fY29tcHJlc3NlZF9wYWlyPF9GcCwgX0FsbG9jPiBfX2ZfOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZXhwbGljaXQgX19mdW5jKF9GcCBfX2YpIDogX19mXyhfVlNURDo6bW92ZShfX2YpKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZXhwbGljaXQgX19mdW5jKF9GcCBfX2YsIF9BbGxvYyBfX2EpCisgICAgICAgIDogX19mXyhfVlNURDo6bW92ZShfX2YpLCBfVlNURDo6bW92ZShfX2EpKSB7fQorICAgIHZpcnR1YWwgX19iYXNlPF9ScChfQTAsIF9BMSk+KiBfX2Nsb25lKCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIF9fY2xvbmUoX19iYXNlPF9ScChfQTAsIF9BMSk+KikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveV9kZWFsbG9jYXRlKCk7CisgICAgdmlydHVhbCBfUnAgb3BlcmF0b3IoKShfQTAsIF9BMSk7CisjaWZuZGVmIF9MSUJDUFBfTk9fUlRUSQorICAgIHZpcnR1YWwgY29uc3Qgdm9pZCogdGFyZ2V0KGNvbnN0IHR5cGVfaW5mbyYpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHRhcmdldF90eXBlKCkgY29uc3Q7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fUlRUSQorfTsKKwordGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9ScCwgY2xhc3MgX0EwLCBjbGFzcyBfQTE+CitfX2Jhc2U8X1JwKF9BMCwgX0ExKT4qCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQTAsIF9BMSk+OjpfX2Nsb25lKCkgY29uc3QKK3sKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPiBfX2FsbG9jX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2FsbG9jX2hlbHBlcjxfX2FsbG9jX3RyYWl0cywgX19mdW5jPjo6dHlwZSBfQXA7CisgICAgX0FwIF9fYShfX2ZfLnNlY29uZCgpKTsKKyAgICB0eXBlZGVmIF9fYWxsb2NhdG9yX2Rlc3RydWN0b3I8X0FwPiBfRHA7CisgICAgdW5pcXVlX3B0cjxfX2Z1bmMsIF9EcD4gX19ob2xkKF9fYS5hbGxvY2F0ZSgxKSwgX0RwKF9fYSwgMSkpOworICAgIDo6bmV3IChfX2hvbGQuZ2V0KCkpIF9fZnVuYyhfX2ZfLmZpcnN0KCksIF9BbGxvYyhfX2EpKTsKKyAgICByZXR1cm4gX19ob2xkLnJlbGVhc2UoKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9ScCwgY2xhc3MgX0EwLCBjbGFzcyBfQTE+Cit2b2lkCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQTAsIF9BMSk+OjpfX2Nsb25lKF9fYmFzZTxfUnAoX0EwLCBfQTEpPiogX19wKSBjb25zdAoreworICAgIDo6bmV3IChfX3ApIF9fZnVuYyhfX2ZfLmZpcnN0KCksIF9fZl8uc2Vjb25kKCkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1JwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMT4KK3ZvaWQKK19fZnVuYzxfRnAsIF9BbGxvYywgX1JwKF9BMCwgX0ExKT46OmRlc3Ryb3koKQoreworICAgIF9fZl8ufl9fY29tcHJlc3NlZF9wYWlyPF9GcCwgX0FsbG9jPigpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1JwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMT4KK3ZvaWQKK19fZnVuYzxfRnAsIF9BbGxvYywgX1JwKF9BMCwgX0ExKT46OmRlc3Ryb3lfZGVhbGxvY2F0ZSgpCit7CisgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz4gX19hbGxvY190cmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9hbGxvY19oZWxwZXI8X19hbGxvY190cmFpdHMsIF9fZnVuYz46OnR5cGUgX0FwOworICAgIF9BcCBfX2EoX19mXy5zZWNvbmQoKSk7CisgICAgX19mXy5+X19jb21wcmVzc2VkX3BhaXI8X0ZwLCBfQWxsb2M+KCk7CisgICAgX19hLmRlYWxsb2NhdGUodGhpcywgMSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUnAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorX1JwCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQTAsIF9BMSk+OjpvcGVyYXRvcigpKF9BMCBfX2EwLCBfQTEgX19hMSkKK3sKKyAgICB0eXBlZGVmIF9faW52b2tlX3ZvaWRfcmV0dXJuX3dyYXBwZXI8X1JwPiBfSW52b2tlcjsKKyAgICByZXR1cm4gX0ludm9rZXI6Ol9fY2FsbChfX2ZfLmZpcnN0KCksIF9fYTAsIF9fYTEpOworfQorCisjaWZuZGVmIF9MSUJDUFBfTk9fUlRUSQorCit0ZW1wbGF0ZTxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1JwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMT4KK2NvbnN0IHZvaWQqCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQTAsIF9BMSk+Ojp0YXJnZXQoY29uc3QgdHlwZV9pbmZvJiBfX3RpKSBjb25zdAoreworICAgIGlmIChfX3RpID09IHR5cGVpZChfRnApKQorICAgICAgICByZXR1cm4gJl9fZl8uZmlyc3QoKTsKKyAgICByZXR1cm4gKGNvbnN0IHZvaWQqKTA7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUnAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorY29uc3Qgc3RkOjp0eXBlX2luZm8mCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQTAsIF9BMSk+Ojp0YXJnZXRfdHlwZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHR5cGVpZChfRnApOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fUlRUSQorCit0ZW1wbGF0ZTxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1JwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorY2xhc3MgX19mdW5jPF9GcCwgX0FsbG9jLCBfUnAoX0EwLCBfQTEsIF9BMik+CisgICAgOiBwdWJsaWMgIF9fYmFzZTxfUnAoX0EwLCBfQTEsIF9BMik+Cit7CisgICAgX19jb21wcmVzc2VkX3BhaXI8X0ZwLCBfQWxsb2M+IF9fZl87CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBleHBsaWNpdCBfX2Z1bmMoX0ZwIF9fZikgOiBfX2ZfKF9WU1REOjptb3ZlKF9fZikpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBleHBsaWNpdCBfX2Z1bmMoX0ZwIF9fZiwgX0FsbG9jIF9fYSkKKyAgICAgICAgOiBfX2ZfKF9WU1REOjptb3ZlKF9fZiksIF9WU1REOjptb3ZlKF9fYSkpIHt9CisgICAgdmlydHVhbCBfX2Jhc2U8X1JwKF9BMCwgX0ExLCBfQTIpPiogX19jbG9uZSgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBfX2Nsb25lKF9fYmFzZTxfUnAoX0EwLCBfQTEsIF9BMik+KikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveV9kZWFsbG9jYXRlKCk7CisgICAgdmlydHVhbCBfUnAgb3BlcmF0b3IoKShfQTAsIF9BMSwgX0EyKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19SVFRJCisgICAgdmlydHVhbCBjb25zdCB2b2lkKiB0YXJnZXQoY29uc3QgdHlwZV9pbmZvJikgY29uc3Q7CisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdGFyZ2V0X3R5cGUoKSBjb25zdDsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19SVFRJCit9OworCit0ZW1wbGF0ZTxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1JwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorX19iYXNlPF9ScChfQTAsIF9BMSwgX0EyKT4qCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQTAsIF9BMSwgX0EyKT46Ol9fY2xvbmUoKSBjb25zdAoreworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+IF9fYWxsb2NfdHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYWxsb2NfaGVscGVyPF9fYWxsb2NfdHJhaXRzLCBfX2Z1bmM+Ojp0eXBlIF9BcDsKKyAgICBfQXAgX19hKF9fZl8uc2Vjb25kKCkpOworICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfQXA+IF9EcDsKKyAgICB1bmlxdWVfcHRyPF9fZnVuYywgX0RwPiBfX2hvbGQoX19hLmFsbG9jYXRlKDEpLCBfRHAoX19hLCAxKSk7CisgICAgOjpuZXcgKF9faG9sZC5nZXQoKSkgX19mdW5jKF9fZl8uZmlyc3QoKSwgX0FsbG9jKF9fYSkpOworICAgIHJldHVybiBfX2hvbGQucmVsZWFzZSgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1JwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgordm9pZAorX19mdW5jPF9GcCwgX0FsbG9jLCBfUnAoX0EwLCBfQTEsIF9BMik+OjpfX2Nsb25lKF9fYmFzZTxfUnAoX0EwLCBfQTEsIF9BMik+KiBfX3ApIGNvbnN0Cit7CisgICAgOjpuZXcgKF9fcCkgX19mdW5jKF9fZl8uZmlyc3QoKSwgX19mXy5zZWNvbmQoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUnAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExLCBjbGFzcyBfQTI+Cit2b2lkCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQTAsIF9BMSwgX0EyKT46OmRlc3Ryb3koKQoreworICAgIF9fZl8ufl9fY29tcHJlc3NlZF9wYWlyPF9GcCwgX0FsbG9jPigpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1JwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgordm9pZAorX19mdW5jPF9GcCwgX0FsbG9jLCBfUnAoX0EwLCBfQTEsIF9BMik+OjpkZXN0cm95X2RlYWxsb2NhdGUoKQoreworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+IF9fYWxsb2NfdHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYWxsb2NfaGVscGVyPF9fYWxsb2NfdHJhaXRzLCBfX2Z1bmM+Ojp0eXBlIF9BcDsKKyAgICBfQXAgX19hKF9fZl8uc2Vjb25kKCkpOworICAgIF9fZl8ufl9fY29tcHJlc3NlZF9wYWlyPF9GcCwgX0FsbG9jPigpOworICAgIF9fYS5kZWFsbG9jYXRlKHRoaXMsIDEpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1JwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorX1JwCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQTAsIF9BMSwgX0EyKT46Om9wZXJhdG9yKCkoX0EwIF9fYTAsIF9BMSBfX2ExLCBfQTIgX19hMikKK3sKKyAgICB0eXBlZGVmIF9faW52b2tlX3ZvaWRfcmV0dXJuX3dyYXBwZXI8X1JwPiBfSW52b2tlcjsKKyAgICByZXR1cm4gX0ludm9rZXI6Ol9fY2FsbChfX2ZfLmZpcnN0KCksIF9fYTAsIF9fYTEsIF9fYTIpOworfQorCisjaWZuZGVmIF9MSUJDUFBfTk9fUlRUSQorCit0ZW1wbGF0ZTxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1JwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorY29uc3Qgdm9pZCoKK19fZnVuYzxfRnAsIF9BbGxvYywgX1JwKF9BMCwgX0ExLCBfQTIpPjo6dGFyZ2V0KGNvbnN0IHR5cGVfaW5mbyYgX190aSkgY29uc3QKK3sKKyAgICBpZiAoX190aSA9PSB0eXBlaWQoX0ZwKSkKKyAgICAgICAgcmV0dXJuICZfX2ZfLmZpcnN0KCk7CisgICAgcmV0dXJuIChjb25zdCB2b2lkKikwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1JwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorY29uc3Qgc3RkOjp0eXBlX2luZm8mCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQTAsIF9BMSwgX0EyKT46OnRhcmdldF90eXBlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gdHlwZWlkKF9GcCk7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19SVFRJCisKK30gIC8vIF9fZnVuY3Rpb24KKwordGVtcGxhdGU8Y2xhc3MgX1JwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgZnVuY3Rpb248X1JwKCk+Cit7CisgICAgdHlwZWRlZiBfX2Z1bmN0aW9uOjpfX2Jhc2U8X1JwKCk+IF9fYmFzZTsKKyAgICBhbGlnbmVkX3N0b3JhZ2U8MypzaXplb2Yodm9pZCopPjo6dHlwZSBfX2J1Zl87CisgICAgX19iYXNlKiBfX2ZfOworCitwdWJsaWM6CisgICAgdHlwZWRlZiBfUnAgcmVzdWx0X3R5cGU7CisKKyAgICAvLyAyMC43LjE2LjIuMSwgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IGZ1bmN0aW9uKCkgOiBfX2ZfKDApIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmdW5jdGlvbihudWxscHRyX3QpIDogX19mXygwKSB7fQorICAgIGZ1bmN0aW9uKGNvbnN0IGZ1bmN0aW9uJik7CisgICAgdGVtcGxhdGU8Y2xhc3MgX0ZwPgorICAgICAgZnVuY3Rpb24oX0ZwLAorICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPCFpc19pbnRlZ3JhbDxfRnA+Ojp2YWx1ZT46OnR5cGUqID0gMCk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfQWxsb2M+CisgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICBmdW5jdGlvbihhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYpIDogX19mXygwKSB7fQorICAgIHRlbXBsYXRlPGNsYXNzIF9BbGxvYz4KKyAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgIGZ1bmN0aW9uKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiwgbnVsbHB0cl90KSA6IF9fZl8oMCkge30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfQWxsb2M+CisgICAgICBmdW5jdGlvbihhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYsIGNvbnN0IGZ1bmN0aW9uJik7CisgICAgdGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2M+CisgICAgICBmdW5jdGlvbihhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYgX19hLCBfRnAgX19mLAorICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPCFpc19pbnRlZ3JhbDxfRnA+Ojp2YWx1ZT46OnR5cGUqID0gMCk7CisKKyAgICBmdW5jdGlvbiYgb3BlcmF0b3I9KGNvbnN0IGZ1bmN0aW9uJik7CisgICAgZnVuY3Rpb24mIG9wZXJhdG9yPShudWxscHRyX3QpOworICAgIHRlbXBsYXRlPGNsYXNzIF9GcD4KKyAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgPAorICAgICAgICAhaXNfaW50ZWdyYWw8X0ZwPjo6dmFsdWUsCisgICAgICAgIGZ1bmN0aW9uJgorICAgICAgPjo6dHlwZQorICAgICAgb3BlcmF0b3I9KF9GcCk7CisKKyAgICB+ZnVuY3Rpb24oKTsKKworICAgIC8vIDIwLjcuMTYuMi4yLCBmdW5jdGlvbiBtb2RpZmllcnM6CisgICAgdm9pZCBzd2FwKGZ1bmN0aW9uJik7CisgICAgdGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2M+CisgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICB2b2lkIGFzc2lnbihfRnAgX19mLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICAgICAge2Z1bmN0aW9uKGFsbG9jYXRvcl9hcmcsIF9fYSwgX19mKS5zd2FwKCp0aGlzKTt9CisKKyAgICAvLyAyMC43LjE2LjIuMywgZnVuY3Rpb24gY2FwYWNpdHk6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBvcGVyYXRvciBib29sKCkgY29uc3Qge3JldHVybiBfX2ZfO30KKworcHJpdmF0ZToKKyAgICAvLyBkZWxldGVkIG92ZXJsb2FkcyBjbG9zZSBwb3NzaWJsZSBob2xlIGluIHRoZSB0eXBlIHN5c3RlbQorICAgIHRlbXBsYXRlPGNsYXNzIF9SMj4KKyAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBmdW5jdGlvbjxfUjIoKT4mKSBjb25zdDsvLyA9IGRlbGV0ZTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfUjI+CisgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgZnVuY3Rpb248X1IyKCk+JikgY29uc3Q7Ly8gPSBkZWxldGU7CitwdWJsaWM6CisgICAgLy8gMjAuNy4xNi4yLjQsIGZ1bmN0aW9uIGludm9jYXRpb246CisgICAgX1JwIG9wZXJhdG9yKCkoKSBjb25zdDsKKworI2lmbmRlZiBfTElCQ1BQX05PX1JUVEkKKyAgICAvLyAyMC43LjE2LjIuNSwgZnVuY3Rpb24gdGFyZ2V0IGFjY2VzczoKKyAgICBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdGFyZ2V0X3R5cGUoKSBjb25zdDsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPiBfVHAqIHRhcmdldCgpOworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHA+IGNvbnN0IF9UcCogdGFyZ2V0KCkgY29uc3Q7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fUlRUSQorfTsKKwordGVtcGxhdGU8Y2xhc3MgX1JwPgorZnVuY3Rpb248X1JwKCk+OjpmdW5jdGlvbihjb25zdCBmdW5jdGlvbiYgX19mKQoreworICAgIGlmIChfX2YuX19mXyA9PSAwKQorICAgICAgICBfX2ZfID0gMDsKKyAgICBlbHNlIGlmIChfX2YuX19mXyA9PSAoY29uc3QgX19iYXNlKikmX19mLl9fYnVmXykKKyAgICB7CisgICAgICAgIF9fZl8gPSAoX19iYXNlKikmX19idWZfOworICAgICAgICBfX2YuX19mXy0+X19jbG9uZShfX2ZfKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBfX2ZfID0gX19mLl9fZl8tPl9fY2xvbmUoKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwPgordGVtcGxhdGU8Y2xhc3MgX0FsbG9jPgorZnVuY3Rpb248X1JwKCk+OjpmdW5jdGlvbihhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYsIGNvbnN0IGZ1bmN0aW9uJiBfX2YpCit7CisgICAgaWYgKF9fZi5fX2ZfID09IDApCisgICAgICAgIF9fZl8gPSAwOworICAgIGVsc2UgaWYgKF9fZi5fX2ZfID09IChjb25zdCBfX2Jhc2UqKSZfX2YuX19idWZfKQorICAgIHsKKyAgICAgICAgX19mXyA9IChfX2Jhc2UqKSZfX2J1Zl87CisgICAgICAgIF9fZi5fX2ZfLT5fX2Nsb25lKF9fZl8pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIF9fZl8gPSBfX2YuX19mXy0+X19jbG9uZSgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnA+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwPgorZnVuY3Rpb248X1JwKCk+OjpmdW5jdGlvbihfRnAgX19mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjwhaXNfaW50ZWdyYWw8X0ZwPjo6dmFsdWU+Ojp0eXBlKikKKyAgICA6IF9fZl8oMCkKK3sKKyAgICBpZiAoX19mdW5jdGlvbjo6X19ub3RfbnVsbChfX2YpKQorICAgIHsKKyAgICAgICAgdHlwZWRlZiBfX2Z1bmN0aW9uOjpfX2Z1bmM8X0ZwLCBhbGxvY2F0b3I8X0ZwPiwgX1JwKCk+IF9GRjsKKyAgICAgICAgaWYgKHNpemVvZihfRkYpIDw9IHNpemVvZihfX2J1Zl8pKQorICAgICAgICB7CisgICAgICAgICAgICBfX2ZfID0gKF9fYmFzZSopJl9fYnVmXzsKKyAgICAgICAgICAgIDo6bmV3IChfX2ZfKSBfRkYoX19mKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgYWxsb2NhdG9yPF9GRj4gX0FwOworICAgICAgICAgICAgX0FwIF9fYTsKKyAgICAgICAgICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfQXA+IF9EcDsKKyAgICAgICAgICAgIHVuaXF1ZV9wdHI8X19iYXNlLCBfRHA+IF9faG9sZChfX2EuYWxsb2NhdGUoMSksIF9EcChfX2EsIDEpKTsKKyAgICAgICAgICAgIDo6bmV3IChfX2hvbGQuZ2V0KCkpIF9GRihfX2YsIGFsbG9jYXRvcjxfRnA+KF9fYSkpOworICAgICAgICAgICAgX19mXyA9IF9faG9sZC5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScD4KK3RlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYz4KK2Z1bmN0aW9uPF9ScCgpPjo6ZnVuY3Rpb24oYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2MmIF9fYTAsIF9GcCBfX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPCFpc19pbnRlZ3JhbDxfRnA+Ojp2YWx1ZT46OnR5cGUqKQorICAgIDogX19mXygwKQoreworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+IF9fYWxsb2NfdHJhaXRzOworICAgIGlmIChfX2Z1bmN0aW9uOjpfX25vdF9udWxsKF9fZikpCisgICAgeworICAgICAgICB0eXBlZGVmIF9fZnVuY3Rpb246Ol9fZnVuYzxfRnAsIF9BbGxvYywgX1JwKCk+IF9GRjsKKyAgICAgICAgaWYgKHNpemVvZihfRkYpIDw9IHNpemVvZihfX2J1Zl8pKQorICAgICAgICB7CisgICAgICAgICAgICBfX2ZfID0gKF9fYmFzZSopJl9fYnVmXzsKKyAgICAgICAgICAgIDo6bmV3IChfX2ZfKSBfRkYoX19mLCBfX2EwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYWxsb2NfaGVscGVyPF9fYWxsb2NfdHJhaXRzLCBfRkY+Ojp0eXBlIF9BcDsKKyAgICAgICAgICAgIF9BcCBfX2EoX19hMCk7CisgICAgICAgICAgICB0eXBlZGVmIF9fYWxsb2NhdG9yX2Rlc3RydWN0b3I8X0FwPiBfRHA7CisgICAgICAgICAgICB1bmlxdWVfcHRyPF9fYmFzZSwgX0RwPiBfX2hvbGQoX19hLmFsbG9jYXRlKDEpLCBfRHAoX19hLCAxKSk7CisgICAgICAgICAgICA6Om5ldyAoX19ob2xkLmdldCgpKSBfRkYoX19mLCBfQWxsb2MoX19hKSk7CisgICAgICAgICAgICBfX2ZfID0gX19ob2xkLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwPgorZnVuY3Rpb248X1JwKCk+JgorZnVuY3Rpb248X1JwKCk+OjpvcGVyYXRvcj0oY29uc3QgZnVuY3Rpb24mIF9fZikKK3sKKyAgICBmdW5jdGlvbihfX2YpLnN3YXAoKnRoaXMpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwPgorZnVuY3Rpb248X1JwKCk+JgorZnVuY3Rpb248X1JwKCk+OjpvcGVyYXRvcj0obnVsbHB0cl90KQoreworICAgIGlmIChfX2ZfID09IChfX2Jhc2UqKSZfX2J1Zl8pCisgICAgICAgIF9fZl8tPmRlc3Ryb3koKTsKKyAgICBlbHNlIGlmIChfX2ZfKQorICAgICAgICBfX2ZfLT5kZXN0cm95X2RlYWxsb2NhdGUoKTsKKyAgICBfX2ZfID0gMDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScD4KK3RlbXBsYXRlIDxjbGFzcyBfRnA+Cit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICAhaXNfaW50ZWdyYWw8X0ZwPjo6dmFsdWUsCisgICAgZnVuY3Rpb248X1JwKCk+JgorPjo6dHlwZQorZnVuY3Rpb248X1JwKCk+OjpvcGVyYXRvcj0oX0ZwIF9fZikKK3sKKyAgICBmdW5jdGlvbihfVlNURDo6bW92ZShfX2YpKS5zd2FwKCp0aGlzKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScD4KK2Z1bmN0aW9uPF9ScCgpPjo6fmZ1bmN0aW9uKCkKK3sKKyAgICBpZiAoX19mXyA9PSAoX19iYXNlKikmX19idWZfKQorICAgICAgICBfX2ZfLT5kZXN0cm95KCk7CisgICAgZWxzZSBpZiAoX19mXykKKyAgICAgICAgX19mXy0+ZGVzdHJveV9kZWFsbG9jYXRlKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScD4KK3ZvaWQKK2Z1bmN0aW9uPF9ScCgpPjo6c3dhcChmdW5jdGlvbiYgX19mKQoreworICAgIGlmIChfVlNURDo6YWRkcmVzc29mKF9fZikgPT0gdGhpcykKKyAgICAgIHJldHVybjsKKyAgICBpZiAoX19mXyA9PSAoX19iYXNlKikmX19idWZfICYmIF9fZi5fX2ZfID09IChfX2Jhc2UqKSZfX2YuX19idWZfKQorICAgIHsKKyAgICAgICAgdHlwZW5hbWUgYWxpZ25lZF9zdG9yYWdlPHNpemVvZihfX2J1Zl8pPjo6dHlwZSBfX3RlbXBidWY7CisgICAgICAgIF9fYmFzZSogX190ID0gKF9fYmFzZSopJl9fdGVtcGJ1ZjsKKyAgICAgICAgX19mXy0+X19jbG9uZShfX3QpOworICAgICAgICBfX2ZfLT5kZXN0cm95KCk7CisgICAgICAgIF9fZl8gPSAwOworICAgICAgICBfX2YuX19mXy0+X19jbG9uZSgoX19iYXNlKikmX19idWZfKTsKKyAgICAgICAgX19mLl9fZl8tPmRlc3Ryb3koKTsKKyAgICAgICAgX19mLl9fZl8gPSAwOworICAgICAgICBfX2ZfID0gKF9fYmFzZSopJl9fYnVmXzsKKyAgICAgICAgX190LT5fX2Nsb25lKChfX2Jhc2UqKSZfX2YuX19idWZfKTsKKyAgICAgICAgX190LT5kZXN0cm95KCk7CisgICAgICAgIF9fZi5fX2ZfID0gKF9fYmFzZSopJl9fZi5fX2J1Zl87CisgICAgfQorICAgIGVsc2UgaWYgKF9fZl8gPT0gKF9fYmFzZSopJl9fYnVmXykKKyAgICB7CisgICAgICAgIF9fZl8tPl9fY2xvbmUoKF9fYmFzZSopJl9fZi5fX2J1Zl8pOworICAgICAgICBfX2ZfLT5kZXN0cm95KCk7CisgICAgICAgIF9fZl8gPSBfX2YuX19mXzsKKyAgICAgICAgX19mLl9fZl8gPSAoX19iYXNlKikmX19mLl9fYnVmXzsKKyAgICB9CisgICAgZWxzZSBpZiAoX19mLl9fZl8gPT0gKF9fYmFzZSopJl9fZi5fX2J1Zl8pCisgICAgeworICAgICAgICBfX2YuX19mXy0+X19jbG9uZSgoX19iYXNlKikmX19idWZfKTsKKyAgICAgICAgX19mLl9fZl8tPmRlc3Ryb3koKTsKKyAgICAgICAgX19mLl9fZl8gPSBfX2ZfOworICAgICAgICBfX2ZfID0gKF9fYmFzZSopJl9fYnVmXzsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBfVlNURDo6c3dhcChfX2ZfLCBfX2YuX19mXyk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScD4KK19ScAorZnVuY3Rpb248X1JwKCk+OjpvcGVyYXRvcigpKCkgY29uc3QKK3sKKyAgICBpZiAoX19mXyA9PSAwKQorICAgICAgICBfX3Rocm93X2JhZF9mdW5jdGlvbl9jYWxsKCk7CisgICAgcmV0dXJuICgqX19mXykoKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX05PX1JUVEkKKwordGVtcGxhdGU8Y2xhc3MgX1JwPgorY29uc3Qgc3RkOjp0eXBlX2luZm8mCitmdW5jdGlvbjxfUnAoKT46OnRhcmdldF90eXBlKCkgY29uc3QKK3sKKyAgICBpZiAoX19mXyA9PSAwKQorICAgICAgICByZXR1cm4gdHlwZWlkKHZvaWQpOworICAgIHJldHVybiBfX2ZfLT50YXJnZXRfdHlwZSgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnA+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorX1RwKgorZnVuY3Rpb248X1JwKCk+Ojp0YXJnZXQoKQoreworICAgIGlmIChfX2ZfID09IDApCisgICAgICAgIHJldHVybiAoX1RwKikwOworICAgIHJldHVybiAoX1RwKikgY29uc3RfY2FzdDx2b2lkICo+KF9fZl8tPnRhcmdldCh0eXBlaWQoX1RwKSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnA+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorY29uc3QgX1RwKgorZnVuY3Rpb248X1JwKCk+Ojp0YXJnZXQoKSBjb25zdAoreworICAgIGlmIChfX2ZfID09IDApCisgICAgICAgIHJldHVybiAoY29uc3QgX1RwKikwOworICAgIHJldHVybiAoY29uc3QgX1RwKilfX2ZfLT50YXJnZXQodHlwZWlkKF9UcCkpOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fUlRUSQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9BMD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGZ1bmN0aW9uPF9ScChfQTApPgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9BMCwgX1JwPgoreworICAgIHR5cGVkZWYgX19mdW5jdGlvbjo6X19iYXNlPF9ScChfQTApPiBfX2Jhc2U7CisgICAgYWxpZ25lZF9zdG9yYWdlPDMqc2l6ZW9mKHZvaWQqKT46OnR5cGUgX19idWZfOworICAgIF9fYmFzZSogX19mXzsKKworcHVibGljOgorICAgIHR5cGVkZWYgX1JwIHJlc3VsdF90eXBlOworCisgICAgLy8gMjAuNy4xNi4yLjEsIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBleHBsaWNpdCBmdW5jdGlvbigpIDogX19mXygwKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZnVuY3Rpb24obnVsbHB0cl90KSA6IF9fZl8oMCkge30KKyAgICBmdW5jdGlvbihjb25zdCBmdW5jdGlvbiYpOworICAgIHRlbXBsYXRlPGNsYXNzIF9GcD4KKyAgICAgIGZ1bmN0aW9uKF9GcCwKKyAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjwhaXNfaW50ZWdyYWw8X0ZwPjo6dmFsdWU+Ojp0eXBlKiA9IDApOworCisgICAgdGVtcGxhdGU8Y2xhc3MgX0FsbG9jPgorICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgZnVuY3Rpb24oYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2MmKSA6IF9fZl8oMCkge30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfQWxsb2M+CisgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICBmdW5jdGlvbihhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYsIG51bGxwdHJfdCkgOiBfX2ZfKDApIHt9CisgICAgdGVtcGxhdGU8Y2xhc3MgX0FsbG9jPgorICAgICAgZnVuY3Rpb24oYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2MmLCBjb25zdCBmdW5jdGlvbiYpOworICAgIHRlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jPgorICAgICAgZnVuY3Rpb24oYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2MmIF9fYSwgX0ZwIF9fZiwKKyAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjwhaXNfaW50ZWdyYWw8X0ZwPjo6dmFsdWU+Ojp0eXBlKiA9IDApOworCisgICAgZnVuY3Rpb24mIG9wZXJhdG9yPShjb25zdCBmdW5jdGlvbiYpOworICAgIGZ1bmN0aW9uJiBvcGVyYXRvcj0obnVsbHB0cl90KTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfRnA+CisgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgIDwKKyAgICAgICAgIWlzX2ludGVncmFsPF9GcD46OnZhbHVlLAorICAgICAgICBmdW5jdGlvbiYKKyAgICAgID46OnR5cGUKKyAgICAgIG9wZXJhdG9yPShfRnApOworCisgICAgfmZ1bmN0aW9uKCk7CisKKyAgICAvLyAyMC43LjE2LjIuMiwgZnVuY3Rpb24gbW9kaWZpZXJzOgorICAgIHZvaWQgc3dhcChmdW5jdGlvbiYpOworICAgIHRlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jPgorICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgdm9pZCBhc3NpZ24oX0ZwIF9fZiwgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgICAgIHtmdW5jdGlvbihhbGxvY2F0b3JfYXJnLCBfX2EsIF9fZikuc3dhcCgqdGhpcyk7fQorCisgICAgLy8gMjAuNy4xNi4yLjMsIGZ1bmN0aW9uIGNhcGFjaXR5OgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHtyZXR1cm4gX19mXzt9CisKK3ByaXZhdGU6CisgICAgLy8gZGVsZXRlZCBvdmVybG9hZHMgY2xvc2UgcG9zc2libGUgaG9sZSBpbiB0aGUgdHlwZSBzeXN0ZW0KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfUjIsIGNsYXNzIF9CMD4KKyAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBmdW5jdGlvbjxfUjIoX0IwKT4mKSBjb25zdDsvLyA9IGRlbGV0ZTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfUjIsIGNsYXNzIF9CMD4KKyAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBmdW5jdGlvbjxfUjIoX0IwKT4mKSBjb25zdDsvLyA9IGRlbGV0ZTsKK3B1YmxpYzoKKyAgICAvLyAyMC43LjE2LjIuNCwgZnVuY3Rpb24gaW52b2NhdGlvbjoKKyAgICBfUnAgb3BlcmF0b3IoKShfQTApIGNvbnN0OworCisjaWZuZGVmIF9MSUJDUFBfTk9fUlRUSQorICAgIC8vIDIwLjcuMTYuMi41LCBmdW5jdGlvbiB0YXJnZXQgYWNjZXNzOgorICAgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0YXJnZXRfdHlwZSgpIGNvbnN0OworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHA+IF9UcCogdGFyZ2V0KCk7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4gY29uc3QgX1RwKiB0YXJnZXQoKSBjb25zdDsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19SVFRJCit9OworCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9BMD4KK2Z1bmN0aW9uPF9ScChfQTApPjo6ZnVuY3Rpb24oY29uc3QgZnVuY3Rpb24mIF9fZikKK3sKKyAgICBpZiAoX19mLl9fZl8gPT0gMCkKKyAgICAgICAgX19mXyA9IDA7CisgICAgZWxzZSBpZiAoX19mLl9fZl8gPT0gKGNvbnN0IF9fYmFzZSopJl9fZi5fX2J1Zl8pCisgICAgeworICAgICAgICBfX2ZfID0gKF9fYmFzZSopJl9fYnVmXzsKKyAgICAgICAgX19mLl9fZl8tPl9fY2xvbmUoX19mXyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgX19mXyA9IF9fZi5fX2ZfLT5fX2Nsb25lKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0EwPgordGVtcGxhdGU8Y2xhc3MgX0FsbG9jPgorZnVuY3Rpb248X1JwKF9BMCk+OjpmdW5jdGlvbihhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYsIGNvbnN0IGZ1bmN0aW9uJiBfX2YpCit7CisgICAgaWYgKF9fZi5fX2ZfID09IDApCisgICAgICAgIF9fZl8gPSAwOworICAgIGVsc2UgaWYgKF9fZi5fX2ZfID09IChjb25zdCBfX2Jhc2UqKSZfX2YuX19idWZfKQorICAgIHsKKyAgICAgICAgX19mXyA9IChfX2Jhc2UqKSZfX2J1Zl87CisgICAgICAgIF9fZi5fX2ZfLT5fX2Nsb25lKF9fZl8pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIF9fZl8gPSBfX2YuX19mXy0+X19jbG9uZSgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9BMD4KK3RlbXBsYXRlIDxjbGFzcyBfRnA+CitmdW5jdGlvbjxfUnAoX0EwKT46OmZ1bmN0aW9uKF9GcCBfX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPCFpc19pbnRlZ3JhbDxfRnA+Ojp2YWx1ZT46OnR5cGUqKQorICAgIDogX19mXygwKQoreworICAgIGlmIChfX2Z1bmN0aW9uOjpfX25vdF9udWxsKF9fZikpCisgICAgeworICAgICAgICB0eXBlZGVmIF9fZnVuY3Rpb246Ol9fZnVuYzxfRnAsIGFsbG9jYXRvcjxfRnA+LCBfUnAoX0EwKT4gX0ZGOworICAgICAgICBpZiAoc2l6ZW9mKF9GRikgPD0gc2l6ZW9mKF9fYnVmXykpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fZl8gPSAoX19iYXNlKikmX19idWZfOworICAgICAgICAgICAgOjpuZXcgKF9fZl8pIF9GRihfX2YpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZWRlZiBhbGxvY2F0b3I8X0ZGPiBfQXA7CisgICAgICAgICAgICBfQXAgX19hOworICAgICAgICAgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9BcD4gX0RwOworICAgICAgICAgICAgdW5pcXVlX3B0cjxfX2Jhc2UsIF9EcD4gX19ob2xkKF9fYS5hbGxvY2F0ZSgxKSwgX0RwKF9fYSwgMSkpOworICAgICAgICAgICAgOjpuZXcgKF9faG9sZC5nZXQoKSkgX0ZGKF9fZiwgYWxsb2NhdG9yPF9GcD4oX19hKSk7CisgICAgICAgICAgICBfX2ZfID0gX19ob2xkLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyBfQTA+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2M+CitmdW5jdGlvbjxfUnAoX0EwKT46OmZ1bmN0aW9uKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiBfX2EwLCBfRnAgX19mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjwhaXNfaW50ZWdyYWw8X0ZwPjo6dmFsdWU+Ojp0eXBlKikKKyAgICA6IF9fZl8oMCkKK3sKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPiBfX2FsbG9jX3RyYWl0czsKKyAgICBpZiAoX19mdW5jdGlvbjo6X19ub3RfbnVsbChfX2YpKQorICAgIHsKKyAgICAgICAgdHlwZWRlZiBfX2Z1bmN0aW9uOjpfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQTApPiBfRkY7CisgICAgICAgIGlmIChzaXplb2YoX0ZGKSA8PSBzaXplb2YoX19idWZfKSkKKyAgICAgICAgeworICAgICAgICAgICAgX19mXyA9IChfX2Jhc2UqKSZfX2J1Zl87CisgICAgICAgICAgICA6Om5ldyAoX19mXykgX0ZGKF9fZiwgX19hMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2FsbG9jX2hlbHBlcjxfX2FsbG9jX3RyYWl0cywgX0ZGPjo6dHlwZSBfQXA7CisgICAgICAgICAgICBfQXAgX19hKF9fYTApOworICAgICAgICAgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9BcD4gX0RwOworICAgICAgICAgICAgdW5pcXVlX3B0cjxfX2Jhc2UsIF9EcD4gX19ob2xkKF9fYS5hbGxvY2F0ZSgxKSwgX0RwKF9fYSwgMSkpOworICAgICAgICAgICAgOjpuZXcgKF9faG9sZC5nZXQoKSkgX0ZGKF9fZiwgX0FsbG9jKF9fYSkpOworICAgICAgICAgICAgX19mXyA9IF9faG9sZC5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0EwPgorZnVuY3Rpb248X1JwKF9BMCk+JgorZnVuY3Rpb248X1JwKF9BMCk+OjpvcGVyYXRvcj0oY29uc3QgZnVuY3Rpb24mIF9fZikKK3sKKyAgICBmdW5jdGlvbihfX2YpLnN3YXAoKnRoaXMpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyBfQTA+CitmdW5jdGlvbjxfUnAoX0EwKT4mCitmdW5jdGlvbjxfUnAoX0EwKT46Om9wZXJhdG9yPShudWxscHRyX3QpCit7CisgICAgaWYgKF9fZl8gPT0gKF9fYmFzZSopJl9fYnVmXykKKyAgICAgICAgX19mXy0+ZGVzdHJveSgpOworICAgIGVsc2UgaWYgKF9fZl8pCisgICAgICAgIF9fZl8tPmRlc3Ryb3lfZGVhbGxvY2F0ZSgpOworICAgIF9fZl8gPSAwOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyBfQTA+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwPgordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgIWlzX2ludGVncmFsPF9GcD46OnZhbHVlLAorICAgIGZ1bmN0aW9uPF9ScChfQTApPiYKKz46OnR5cGUKK2Z1bmN0aW9uPF9ScChfQTApPjo6b3BlcmF0b3I9KF9GcCBfX2YpCit7CisgICAgZnVuY3Rpb24oX1ZTVEQ6Om1vdmUoX19mKSkuc3dhcCgqdGhpcyk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9BMD4KK2Z1bmN0aW9uPF9ScChfQTApPjo6fmZ1bmN0aW9uKCkKK3sKKyAgICBpZiAoX19mXyA9PSAoX19iYXNlKikmX19idWZfKQorICAgICAgICBfX2ZfLT5kZXN0cm95KCk7CisgICAgZWxzZSBpZiAoX19mXykKKyAgICAgICAgX19mXy0+ZGVzdHJveV9kZWFsbG9jYXRlKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0EwPgordm9pZAorZnVuY3Rpb248X1JwKF9BMCk+Ojpzd2FwKGZ1bmN0aW9uJiBfX2YpCit7CisgICAgaWYgKF9WU1REOjphZGRyZXNzb2YoX19mKSA9PSB0aGlzKQorICAgICAgcmV0dXJuOworICAgIGlmIChfX2ZfID09IChfX2Jhc2UqKSZfX2J1Zl8gJiYgX19mLl9fZl8gPT0gKF9fYmFzZSopJl9fZi5fX2J1Zl8pCisgICAgeworICAgICAgICB0eXBlbmFtZSBhbGlnbmVkX3N0b3JhZ2U8c2l6ZW9mKF9fYnVmXyk+Ojp0eXBlIF9fdGVtcGJ1ZjsKKyAgICAgICAgX19iYXNlKiBfX3QgPSAoX19iYXNlKikmX190ZW1wYnVmOworICAgICAgICBfX2ZfLT5fX2Nsb25lKF9fdCk7CisgICAgICAgIF9fZl8tPmRlc3Ryb3koKTsKKyAgICAgICAgX19mXyA9IDA7CisgICAgICAgIF9fZi5fX2ZfLT5fX2Nsb25lKChfX2Jhc2UqKSZfX2J1Zl8pOworICAgICAgICBfX2YuX19mXy0+ZGVzdHJveSgpOworICAgICAgICBfX2YuX19mXyA9IDA7CisgICAgICAgIF9fZl8gPSAoX19iYXNlKikmX19idWZfOworICAgICAgICBfX3QtPl9fY2xvbmUoKF9fYmFzZSopJl9fZi5fX2J1Zl8pOworICAgICAgICBfX3QtPmRlc3Ryb3koKTsKKyAgICAgICAgX19mLl9fZl8gPSAoX19iYXNlKikmX19mLl9fYnVmXzsKKyAgICB9CisgICAgZWxzZSBpZiAoX19mXyA9PSAoX19iYXNlKikmX19idWZfKQorICAgIHsKKyAgICAgICAgX19mXy0+X19jbG9uZSgoX19iYXNlKikmX19mLl9fYnVmXyk7CisgICAgICAgIF9fZl8tPmRlc3Ryb3koKTsKKyAgICAgICAgX19mXyA9IF9fZi5fX2ZfOworICAgICAgICBfX2YuX19mXyA9IChfX2Jhc2UqKSZfX2YuX19idWZfOworICAgIH0KKyAgICBlbHNlIGlmIChfX2YuX19mXyA9PSAoX19iYXNlKikmX19mLl9fYnVmXykKKyAgICB7CisgICAgICAgIF9fZi5fX2ZfLT5fX2Nsb25lKChfX2Jhc2UqKSZfX2J1Zl8pOworICAgICAgICBfX2YuX19mXy0+ZGVzdHJveSgpOworICAgICAgICBfX2YuX19mXyA9IF9fZl87CisgICAgICAgIF9fZl8gPSAoX19iYXNlKikmX19idWZfOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIF9WU1REOjpzd2FwKF9fZl8sIF9fZi5fX2ZfKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyBfQTA+CitfUnAKK2Z1bmN0aW9uPF9ScChfQTApPjo6b3BlcmF0b3IoKShfQTAgX19hMCkgY29uc3QKK3sKKyAgICBpZiAoX19mXyA9PSAwKQorICAgICAgICBfX3Rocm93X2JhZF9mdW5jdGlvbl9jYWxsKCk7CisgICAgcmV0dXJuICgqX19mXykoX19hMCk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9OT19SVFRJCisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0EwPgorY29uc3Qgc3RkOjp0eXBlX2luZm8mCitmdW5jdGlvbjxfUnAoX0EwKT46OnRhcmdldF90eXBlKCkgY29uc3QKK3sKKyAgICBpZiAoX19mXyA9PSAwKQorICAgICAgICByZXR1cm4gdHlwZWlkKHZvaWQpOworICAgIHJldHVybiBfX2ZfLT50YXJnZXRfdHlwZSgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9BMD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CitfVHAqCitmdW5jdGlvbjxfUnAoX0EwKT46OnRhcmdldCgpCit7CisgICAgaWYgKF9fZl8gPT0gMCkKKyAgICAgICAgcmV0dXJuIChfVHAqKTA7CisgICAgcmV0dXJuIChfVHAqKSBjb25zdF9jYXN0PHZvaWQgKj4oX19mXy0+dGFyZ2V0KHR5cGVpZChfVHApKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0EwPgordGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KK2NvbnN0IF9UcCoKK2Z1bmN0aW9uPF9ScChfQTApPjo6dGFyZ2V0KCkgY29uc3QKK3sKKyAgICBpZiAoX19mXyA9PSAwKQorICAgICAgICByZXR1cm4gKGNvbnN0IF9UcCopMDsKKyAgICByZXR1cm4gKGNvbnN0IF9UcCopX19mXy0+dGFyZ2V0KHR5cGVpZChfVHApKTsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX05PX1JUVEkKKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMT4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGZ1bmN0aW9uPF9ScChfQTAsIF9BMSk+CisgICAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9BMCwgX0ExLCBfUnA+Cit7CisgICAgdHlwZWRlZiBfX2Z1bmN0aW9uOjpfX2Jhc2U8X1JwKF9BMCwgX0ExKT4gX19iYXNlOworICAgIGFsaWduZWRfc3RvcmFnZTwzKnNpemVvZih2b2lkKik+Ojp0eXBlIF9fYnVmXzsKKyAgICBfX2Jhc2UqIF9fZl87CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9ScCByZXN1bHRfdHlwZTsKKworICAgIC8vIDIwLjcuMTYuMi4xLCBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZXhwbGljaXQgZnVuY3Rpb24oKSA6IF9fZl8oMCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZ1bmN0aW9uKG51bGxwdHJfdCkgOiBfX2ZfKDApIHt9CisgICAgZnVuY3Rpb24oY29uc3QgZnVuY3Rpb24mKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfRnA+CisgICAgICBmdW5jdGlvbihfRnAsCisgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8IWlzX2ludGVncmFsPF9GcD46OnZhbHVlPjo6dHlwZSogPSAwKTsKKworICAgIHRlbXBsYXRlPGNsYXNzIF9BbGxvYz4KKyAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgIGZ1bmN0aW9uKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJikgOiBfX2ZfKDApIHt9CisgICAgdGVtcGxhdGU8Y2xhc3MgX0FsbG9jPgorICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgZnVuY3Rpb24oYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2MmLCBudWxscHRyX3QpIDogX19mXygwKSB7fQorICAgIHRlbXBsYXRlPGNsYXNzIF9BbGxvYz4KKyAgICAgIGZ1bmN0aW9uKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiwgY29uc3QgZnVuY3Rpb24mKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYz4KKyAgICAgIGZ1bmN0aW9uKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiBfX2EsIF9GcCBfX2YsCisgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8IWlzX2ludGVncmFsPF9GcD46OnZhbHVlPjo6dHlwZSogPSAwKTsKKworICAgIGZ1bmN0aW9uJiBvcGVyYXRvcj0oY29uc3QgZnVuY3Rpb24mKTsKKyAgICBmdW5jdGlvbiYgb3BlcmF0b3I9KG51bGxwdHJfdCk7CisgICAgdGVtcGxhdGU8Y2xhc3MgX0ZwPgorICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICA8CisgICAgICAgICFpc19pbnRlZ3JhbDxfRnA+Ojp2YWx1ZSwKKyAgICAgICAgZnVuY3Rpb24mCisgICAgICA+Ojp0eXBlCisgICAgICBvcGVyYXRvcj0oX0ZwKTsKKworICAgIH5mdW5jdGlvbigpOworCisgICAgLy8gMjAuNy4xNi4yLjIsIGZ1bmN0aW9uIG1vZGlmaWVyczoKKyAgICB2b2lkIHN3YXAoZnVuY3Rpb24mKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYz4KKyAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgIHZvaWQgYXNzaWduKF9GcCBfX2YsIGNvbnN0IF9BbGxvYyYgX19hKQorICAgICAgICB7ZnVuY3Rpb24oYWxsb2NhdG9yX2FyZywgX19hLCBfX2YpLnN3YXAoKnRoaXMpO30KKworICAgIC8vIDIwLjcuMTYuMi4zLCBmdW5jdGlvbiBjYXBhY2l0eToKKyAgICBvcGVyYXRvciBib29sKCkgY29uc3Qge3JldHVybiBfX2ZfO30KKworcHJpdmF0ZToKKyAgICAvLyBkZWxldGVkIG92ZXJsb2FkcyBjbG9zZSBwb3NzaWJsZSBob2xlIGluIHRoZSB0eXBlIHN5c3RlbQorICAgIHRlbXBsYXRlPGNsYXNzIF9SMiwgY2xhc3MgX0IwLCBjbGFzcyBfQjE+CisgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgZnVuY3Rpb248X1IyKF9CMCwgX0IxKT4mKSBjb25zdDsvLyA9IGRlbGV0ZTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfUjIsIGNsYXNzIF9CMCwgY2xhc3MgX0IxPgorICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGZ1bmN0aW9uPF9SMihfQjAsIF9CMSk+JikgY29uc3Q7Ly8gPSBkZWxldGU7CitwdWJsaWM6CisgICAgLy8gMjAuNy4xNi4yLjQsIGZ1bmN0aW9uIGludm9jYXRpb246CisgICAgX1JwIG9wZXJhdG9yKCkoX0EwLCBfQTEpIGNvbnN0OworCisjaWZuZGVmIF9MSUJDUFBfTk9fUlRUSQorICAgIC8vIDIwLjcuMTYuMi41LCBmdW5jdGlvbiB0YXJnZXQgYWNjZXNzOgorICAgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0YXJnZXRfdHlwZSgpIGNvbnN0OworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHA+IF9UcCogdGFyZ2V0KCk7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4gY29uc3QgX1RwKiB0YXJnZXQoKSBjb25zdDsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19SVFRJCit9OworCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorZnVuY3Rpb248X1JwKF9BMCwgX0ExKT46OmZ1bmN0aW9uKGNvbnN0IGZ1bmN0aW9uJiBfX2YpCit7CisgICAgaWYgKF9fZi5fX2ZfID09IDApCisgICAgICAgIF9fZl8gPSAwOworICAgIGVsc2UgaWYgKF9fZi5fX2ZfID09IChjb25zdCBfX2Jhc2UqKSZfX2YuX19idWZfKQorICAgIHsKKyAgICAgICAgX19mXyA9IChfX2Jhc2UqKSZfX2J1Zl87CisgICAgICAgIF9fZi5fX2ZfLT5fX2Nsb25lKF9fZl8pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIF9fZl8gPSBfX2YuX19mXy0+X19jbG9uZSgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgordGVtcGxhdGU8Y2xhc3MgX0FsbG9jPgorZnVuY3Rpb248X1JwKF9BMCwgX0ExKT46OmZ1bmN0aW9uKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiwgY29uc3QgZnVuY3Rpb24mIF9fZikKK3sKKyAgICBpZiAoX19mLl9fZl8gPT0gMCkKKyAgICAgICAgX19mXyA9IDA7CisgICAgZWxzZSBpZiAoX19mLl9fZl8gPT0gKGNvbnN0IF9fYmFzZSopJl9fZi5fX2J1Zl8pCisgICAgeworICAgICAgICBfX2ZfID0gKF9fYmFzZSopJl9fYnVmXzsKKyAgICAgICAgX19mLl9fZl8tPl9fY2xvbmUoX19mXyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgX19mXyA9IF9fZi5fX2ZfLT5fX2Nsb25lKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0EwLCBjbGFzcyBfQTE+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwPgorZnVuY3Rpb248X1JwKF9BMCwgX0ExKT46OmZ1bmN0aW9uKF9GcCBfX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8IWlzX2ludGVncmFsPF9GcD46OnZhbHVlPjo6dHlwZSopCisgICAgOiBfX2ZfKDApCit7CisgICAgaWYgKF9fZnVuY3Rpb246Ol9fbm90X251bGwoX19mKSkKKyAgICB7CisgICAgICAgIHR5cGVkZWYgX19mdW5jdGlvbjo6X19mdW5jPF9GcCwgYWxsb2NhdG9yPF9GcD4sIF9ScChfQTAsIF9BMSk+IF9GRjsKKyAgICAgICAgaWYgKHNpemVvZihfRkYpIDw9IHNpemVvZihfX2J1Zl8pKQorICAgICAgICB7CisgICAgICAgICAgICBfX2ZfID0gKF9fYmFzZSopJl9fYnVmXzsKKyAgICAgICAgICAgIDo6bmV3IChfX2ZfKSBfRkYoX19mKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgYWxsb2NhdG9yPF9GRj4gX0FwOworICAgICAgICAgICAgX0FwIF9fYTsKKyAgICAgICAgICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfQXA+IF9EcDsKKyAgICAgICAgICAgIHVuaXF1ZV9wdHI8X19iYXNlLCBfRHA+IF9faG9sZChfX2EuYWxsb2NhdGUoMSksIF9EcChfX2EsIDEpKTsKKyAgICAgICAgICAgIDo6bmV3IChfX2hvbGQuZ2V0KCkpIF9GRihfX2YsIGFsbG9jYXRvcjxfRnA+KF9fYSkpOworICAgICAgICAgICAgX19mXyA9IF9faG9sZC5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0EwLCBjbGFzcyBfQTE+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2M+CitmdW5jdGlvbjxfUnAoX0EwLCBfQTEpPjo6ZnVuY3Rpb24oYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2MmIF9fYTAsIF9GcCBfX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8IWlzX2ludGVncmFsPF9GcD46OnZhbHVlPjo6dHlwZSopCisgICAgOiBfX2ZfKDApCit7CisgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz4gX19hbGxvY190cmFpdHM7CisgICAgaWYgKF9fZnVuY3Rpb246Ol9fbm90X251bGwoX19mKSkKKyAgICB7CisgICAgICAgIHR5cGVkZWYgX19mdW5jdGlvbjo6X19mdW5jPF9GcCwgX0FsbG9jLCBfUnAoX0EwLCBfQTEpPiBfRkY7CisgICAgICAgIGlmIChzaXplb2YoX0ZGKSA8PSBzaXplb2YoX19idWZfKSkKKyAgICAgICAgeworICAgICAgICAgICAgX19mXyA9IChfX2Jhc2UqKSZfX2J1Zl87CisgICAgICAgICAgICA6Om5ldyAoX19mXykgX0ZGKF9fZiwgX19hMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2FsbG9jX2hlbHBlcjxfX2FsbG9jX3RyYWl0cywgX0ZGPjo6dHlwZSBfQXA7CisgICAgICAgICAgICBfQXAgX19hKF9fYTApOworICAgICAgICAgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9BcD4gX0RwOworICAgICAgICAgICAgdW5pcXVlX3B0cjxfX2Jhc2UsIF9EcD4gX19ob2xkKF9fYS5hbGxvY2F0ZSgxKSwgX0RwKF9fYSwgMSkpOworICAgICAgICAgICAgOjpuZXcgKF9faG9sZC5nZXQoKSkgX0ZGKF9fZiwgX0FsbG9jKF9fYSkpOworICAgICAgICAgICAgX19mXyA9IF9faG9sZC5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0EwLCBjbGFzcyBfQTE+CitmdW5jdGlvbjxfUnAoX0EwLCBfQTEpPiYKK2Z1bmN0aW9uPF9ScChfQTAsIF9BMSk+OjpvcGVyYXRvcj0oY29uc3QgZnVuY3Rpb24mIF9fZikKK3sKKyAgICBmdW5jdGlvbihfX2YpLnN3YXAoKnRoaXMpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMT4KK2Z1bmN0aW9uPF9ScChfQTAsIF9BMSk+JgorZnVuY3Rpb248X1JwKF9BMCwgX0ExKT46Om9wZXJhdG9yPShudWxscHRyX3QpCit7CisgICAgaWYgKF9fZl8gPT0gKF9fYmFzZSopJl9fYnVmXykKKyAgICAgICAgX19mXy0+ZGVzdHJveSgpOworICAgIGVsc2UgaWYgKF9fZl8pCisgICAgICAgIF9fZl8tPmRlc3Ryb3lfZGVhbGxvY2F0ZSgpOworICAgIF9fZl8gPSAwOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMT4KK3RlbXBsYXRlIDxjbGFzcyBfRnA+Cit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICAhaXNfaW50ZWdyYWw8X0ZwPjo6dmFsdWUsCisgICAgZnVuY3Rpb248X1JwKF9BMCwgX0ExKT4mCis+Ojp0eXBlCitmdW5jdGlvbjxfUnAoX0EwLCBfQTEpPjo6b3BlcmF0b3I9KF9GcCBfX2YpCit7CisgICAgZnVuY3Rpb24oX1ZTVEQ6Om1vdmUoX19mKSkuc3dhcCgqdGhpcyk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorZnVuY3Rpb248X1JwKF9BMCwgX0ExKT46On5mdW5jdGlvbigpCit7CisgICAgaWYgKF9fZl8gPT0gKF9fYmFzZSopJl9fYnVmXykKKyAgICAgICAgX19mXy0+ZGVzdHJveSgpOworICAgIGVsc2UgaWYgKF9fZl8pCisgICAgICAgIF9fZl8tPmRlc3Ryb3lfZGVhbGxvY2F0ZSgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgordm9pZAorZnVuY3Rpb248X1JwKF9BMCwgX0ExKT46OnN3YXAoZnVuY3Rpb24mIF9fZikKK3sKKyAgICBpZiAoX1ZTVEQ6OmFkZHJlc3NvZihfX2YpID09IHRoaXMpCisgICAgICByZXR1cm47CisgICAgaWYgKF9fZl8gPT0gKF9fYmFzZSopJl9fYnVmXyAmJiBfX2YuX19mXyA9PSAoX19iYXNlKikmX19mLl9fYnVmXykKKyAgICB7CisgICAgICAgIHR5cGVuYW1lIGFsaWduZWRfc3RvcmFnZTxzaXplb2YoX19idWZfKT46OnR5cGUgX190ZW1wYnVmOworICAgICAgICBfX2Jhc2UqIF9fdCA9IChfX2Jhc2UqKSZfX3RlbXBidWY7CisgICAgICAgIF9fZl8tPl9fY2xvbmUoX190KTsKKyAgICAgICAgX19mXy0+ZGVzdHJveSgpOworICAgICAgICBfX2ZfID0gMDsKKyAgICAgICAgX19mLl9fZl8tPl9fY2xvbmUoKF9fYmFzZSopJl9fYnVmXyk7CisgICAgICAgIF9fZi5fX2ZfLT5kZXN0cm95KCk7CisgICAgICAgIF9fZi5fX2ZfID0gMDsKKyAgICAgICAgX19mXyA9IChfX2Jhc2UqKSZfX2J1Zl87CisgICAgICAgIF9fdC0+X19jbG9uZSgoX19iYXNlKikmX19mLl9fYnVmXyk7CisgICAgICAgIF9fdC0+ZGVzdHJveSgpOworICAgICAgICBfX2YuX19mXyA9IChfX2Jhc2UqKSZfX2YuX19idWZfOworICAgIH0KKyAgICBlbHNlIGlmIChfX2ZfID09IChfX2Jhc2UqKSZfX2J1Zl8pCisgICAgeworICAgICAgICBfX2ZfLT5fX2Nsb25lKChfX2Jhc2UqKSZfX2YuX19idWZfKTsKKyAgICAgICAgX19mXy0+ZGVzdHJveSgpOworICAgICAgICBfX2ZfID0gX19mLl9fZl87CisgICAgICAgIF9fZi5fX2ZfID0gKF9fYmFzZSopJl9fZi5fX2J1Zl87CisgICAgfQorICAgIGVsc2UgaWYgKF9fZi5fX2ZfID09IChfX2Jhc2UqKSZfX2YuX19idWZfKQorICAgIHsKKyAgICAgICAgX19mLl9fZl8tPl9fY2xvbmUoKF9fYmFzZSopJl9fYnVmXyk7CisgICAgICAgIF9fZi5fX2ZfLT5kZXN0cm95KCk7CisgICAgICAgIF9fZi5fX2ZfID0gX19mXzsKKyAgICAgICAgX19mXyA9IChfX2Jhc2UqKSZfX2J1Zl87CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgX1ZTVEQ6OnN3YXAoX19mXywgX19mLl9fZl8pOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorX1JwCitmdW5jdGlvbjxfUnAoX0EwLCBfQTEpPjo6b3BlcmF0b3IoKShfQTAgX19hMCwgX0ExIF9fYTEpIGNvbnN0Cit7CisgICAgaWYgKF9fZl8gPT0gMCkKKyAgICAgICAgX190aHJvd19iYWRfZnVuY3Rpb25fY2FsbCgpOworICAgIHJldHVybiAoKl9fZl8pKF9fYTAsIF9fYTEpOworfQorCisjaWZuZGVmIF9MSUJDUFBfTk9fUlRUSQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorY29uc3Qgc3RkOjp0eXBlX2luZm8mCitmdW5jdGlvbjxfUnAoX0EwLCBfQTEpPjo6dGFyZ2V0X3R5cGUoKSBjb25zdAoreworICAgIGlmIChfX2ZfID09IDApCisgICAgICAgIHJldHVybiB0eXBlaWQodm9pZCk7CisgICAgcmV0dXJuIF9fZl8tPnRhcmdldF90eXBlKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0EwLCBjbGFzcyBfQTE+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorX1RwKgorZnVuY3Rpb248X1JwKF9BMCwgX0ExKT46OnRhcmdldCgpCit7CisgICAgaWYgKF9fZl8gPT0gMCkKKyAgICAgICAgcmV0dXJuIChfVHAqKTA7CisgICAgcmV0dXJuIChfVHAqKSBjb25zdF9jYXN0PHZvaWQgKj4oX19mXy0+dGFyZ2V0KHR5cGVpZChfVHApKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0EwLCBjbGFzcyBfQTE+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorY29uc3QgX1RwKgorZnVuY3Rpb248X1JwKF9BMCwgX0ExKT46OnRhcmdldCgpIGNvbnN0Cit7CisgICAgaWYgKF9fZl8gPT0gMCkKKyAgICAgICAgcmV0dXJuIChjb25zdCBfVHAqKTA7CisgICAgcmV0dXJuIChjb25zdCBfVHAqKV9fZl8tPnRhcmdldCh0eXBlaWQoX1RwKSk7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19SVFRJCisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGZ1bmN0aW9uPF9ScChfQTAsIF9BMSwgX0EyKT4KK3sKKyAgICB0eXBlZGVmIF9fZnVuY3Rpb246Ol9fYmFzZTxfUnAoX0EwLCBfQTEsIF9BMik+IF9fYmFzZTsKKyAgICBhbGlnbmVkX3N0b3JhZ2U8MypzaXplb2Yodm9pZCopPjo6dHlwZSBfX2J1Zl87CisgICAgX19iYXNlKiBfX2ZfOworCitwdWJsaWM6CisgICAgdHlwZWRlZiBfUnAgcmVzdWx0X3R5cGU7CisKKyAgICAvLyAyMC43LjE2LjIuMSwgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IGZ1bmN0aW9uKCkgOiBfX2ZfKDApIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmdW5jdGlvbihudWxscHRyX3QpIDogX19mXygwKSB7fQorICAgIGZ1bmN0aW9uKGNvbnN0IGZ1bmN0aW9uJik7CisgICAgdGVtcGxhdGU8Y2xhc3MgX0ZwPgorICAgICAgZnVuY3Rpb24oX0ZwLAorICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPCFpc19pbnRlZ3JhbDxfRnA+Ojp2YWx1ZT46OnR5cGUqID0gMCk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfQWxsb2M+CisgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICBmdW5jdGlvbihhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYpIDogX19mXygwKSB7fQorICAgIHRlbXBsYXRlPGNsYXNzIF9BbGxvYz4KKyAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgIGZ1bmN0aW9uKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiwgbnVsbHB0cl90KSA6IF9fZl8oMCkge30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfQWxsb2M+CisgICAgICBmdW5jdGlvbihhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYsIGNvbnN0IGZ1bmN0aW9uJik7CisgICAgdGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2M+CisgICAgICBmdW5jdGlvbihhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYgX19hLCBfRnAgX19mLAorICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPCFpc19pbnRlZ3JhbDxfRnA+Ojp2YWx1ZT46OnR5cGUqID0gMCk7CisKKyAgICBmdW5jdGlvbiYgb3BlcmF0b3I9KGNvbnN0IGZ1bmN0aW9uJik7CisgICAgZnVuY3Rpb24mIG9wZXJhdG9yPShudWxscHRyX3QpOworICAgIHRlbXBsYXRlPGNsYXNzIF9GcD4KKyAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgPAorICAgICAgICAhaXNfaW50ZWdyYWw8X0ZwPjo6dmFsdWUsCisgICAgICAgIGZ1bmN0aW9uJgorICAgICAgPjo6dHlwZQorICAgICAgb3BlcmF0b3I9KF9GcCk7CisKKyAgICB+ZnVuY3Rpb24oKTsKKworICAgIC8vIDIwLjcuMTYuMi4yLCBmdW5jdGlvbiBtb2RpZmllcnM6CisgICAgdm9pZCBzd2FwKGZ1bmN0aW9uJik7CisgICAgdGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2M+CisgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICB2b2lkIGFzc2lnbihfRnAgX19mLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICAgICAge2Z1bmN0aW9uKGFsbG9jYXRvcl9hcmcsIF9fYSwgX19mKS5zd2FwKCp0aGlzKTt9CisKKyAgICAvLyAyMC43LjE2LjIuMywgZnVuY3Rpb24gY2FwYWNpdHk6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBvcGVyYXRvciBib29sKCkgY29uc3Qge3JldHVybiBfX2ZfO30KKworcHJpdmF0ZToKKyAgICAvLyBkZWxldGVkIG92ZXJsb2FkcyBjbG9zZSBwb3NzaWJsZSBob2xlIGluIHRoZSB0eXBlIHN5c3RlbQorICAgIHRlbXBsYXRlPGNsYXNzIF9SMiwgY2xhc3MgX0IwLCBjbGFzcyBfQjEsIGNsYXNzIF9CMj4KKyAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBmdW5jdGlvbjxfUjIoX0IwLCBfQjEsIF9CMik+JikgY29uc3Q7Ly8gPSBkZWxldGU7CisgICAgdGVtcGxhdGU8Y2xhc3MgX1IyLCBjbGFzcyBfQjAsIGNsYXNzIF9CMSwgY2xhc3MgX0IyPgorICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGZ1bmN0aW9uPF9SMihfQjAsIF9CMSwgX0IyKT4mKSBjb25zdDsvLyA9IGRlbGV0ZTsKK3B1YmxpYzoKKyAgICAvLyAyMC43LjE2LjIuNCwgZnVuY3Rpb24gaW52b2NhdGlvbjoKKyAgICBfUnAgb3BlcmF0b3IoKShfQTAsIF9BMSwgX0EyKSBjb25zdDsKKworI2lmbmRlZiBfTElCQ1BQX05PX1JUVEkKKyAgICAvLyAyMC43LjE2LjIuNSwgZnVuY3Rpb24gdGFyZ2V0IGFjY2VzczoKKyAgICBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdGFyZ2V0X3R5cGUoKSBjb25zdDsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPiBfVHAqIHRhcmdldCgpOworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHA+IGNvbnN0IF9UcCogdGFyZ2V0KCkgY29uc3Q7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fUlRUSQorfTsKKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorZnVuY3Rpb248X1JwKF9BMCwgX0ExLCBfQTIpPjo6ZnVuY3Rpb24oY29uc3QgZnVuY3Rpb24mIF9fZikKK3sKKyAgICBpZiAoX19mLl9fZl8gPT0gMCkKKyAgICAgICAgX19mXyA9IDA7CisgICAgZWxzZSBpZiAoX19mLl9fZl8gPT0gKGNvbnN0IF9fYmFzZSopJl9fZi5fX2J1Zl8pCisgICAgeworICAgICAgICBfX2ZfID0gKF9fYmFzZSopJl9fYnVmXzsKKyAgICAgICAgX19mLl9fZl8tPl9fY2xvbmUoX19mXyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgX19mXyA9IF9fZi5fX2ZfLT5fX2Nsb25lKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KK3RlbXBsYXRlPGNsYXNzIF9BbGxvYz4KK2Z1bmN0aW9uPF9ScChfQTAsIF9BMSwgX0EyKT46OmZ1bmN0aW9uKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnVuY3Rpb24mIF9fZikKK3sKKyAgICBpZiAoX19mLl9fZl8gPT0gMCkKKyAgICAgICAgX19mXyA9IDA7CisgICAgZWxzZSBpZiAoX19mLl9fZl8gPT0gKGNvbnN0IF9fYmFzZSopJl9fZi5fX2J1Zl8pCisgICAgeworICAgICAgICBfX2ZfID0gKF9fYmFzZSopJl9fYnVmXzsKKyAgICAgICAgX19mLl9fZl8tPl9fY2xvbmUoX19mXyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgX19mXyA9IF9fZi5fX2ZfLT5fX2Nsb25lKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KK3RlbXBsYXRlIDxjbGFzcyBfRnA+CitmdW5jdGlvbjxfUnAoX0EwLCBfQTEsIF9BMik+OjpmdW5jdGlvbihfRnAgX19mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjwhaXNfaW50ZWdyYWw8X0ZwPjo6dmFsdWU+Ojp0eXBlKikKKyAgICA6IF9fZl8oMCkKK3sKKyAgICBpZiAoX19mdW5jdGlvbjo6X19ub3RfbnVsbChfX2YpKQorICAgIHsKKyAgICAgICAgdHlwZWRlZiBfX2Z1bmN0aW9uOjpfX2Z1bmM8X0ZwLCBhbGxvY2F0b3I8X0ZwPiwgX1JwKF9BMCwgX0ExLCBfQTIpPiBfRkY7CisgICAgICAgIGlmIChzaXplb2YoX0ZGKSA8PSBzaXplb2YoX19idWZfKSkKKyAgICAgICAgeworICAgICAgICAgICAgX19mXyA9IChfX2Jhc2UqKSZfX2J1Zl87CisgICAgICAgICAgICA6Om5ldyAoX19mXykgX0ZGKF9fZik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIGFsbG9jYXRvcjxfRkY+IF9BcDsKKyAgICAgICAgICAgIF9BcCBfX2E7CisgICAgICAgICAgICB0eXBlZGVmIF9fYWxsb2NhdG9yX2Rlc3RydWN0b3I8X0FwPiBfRHA7CisgICAgICAgICAgICB1bmlxdWVfcHRyPF9fYmFzZSwgX0RwPiBfX2hvbGQoX19hLmFsbG9jYXRlKDEpLCBfRHAoX19hLCAxKSk7CisgICAgICAgICAgICA6Om5ldyAoX19ob2xkLmdldCgpKSBfRkYoX19mLCBhbGxvY2F0b3I8X0ZwPihfX2EpKTsKKyAgICAgICAgICAgIF9fZl8gPSBfX2hvbGQucmVsZWFzZSgpOworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExLCBjbGFzcyBfQTI+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2M+CitmdW5jdGlvbjxfUnAoX0EwLCBfQTEsIF9BMik+OjpmdW5jdGlvbihhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYgX19hMCwgX0ZwIF9fZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8IWlzX2ludGVncmFsPF9GcD46OnZhbHVlPjo6dHlwZSopCisgICAgOiBfX2ZfKDApCit7CisgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz4gX19hbGxvY190cmFpdHM7CisgICAgaWYgKF9fZnVuY3Rpb246Ol9fbm90X251bGwoX19mKSkKKyAgICB7CisgICAgICAgIHR5cGVkZWYgX19mdW5jdGlvbjo6X19mdW5jPF9GcCwgX0FsbG9jLCBfUnAoX0EwLCBfQTEsIF9BMik+IF9GRjsKKyAgICAgICAgaWYgKHNpemVvZihfRkYpIDw9IHNpemVvZihfX2J1Zl8pKQorICAgICAgICB7CisgICAgICAgICAgICBfX2ZfID0gKF9fYmFzZSopJl9fYnVmXzsKKyAgICAgICAgICAgIDo6bmV3IChfX2ZfKSBfRkYoX19mLCBfX2EwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYWxsb2NfaGVscGVyPF9fYWxsb2NfdHJhaXRzLCBfRkY+Ojp0eXBlIF9BcDsKKyAgICAgICAgICAgIF9BcCBfX2EoX19hMCk7CisgICAgICAgICAgICB0eXBlZGVmIF9fYWxsb2NhdG9yX2Rlc3RydWN0b3I8X0FwPiBfRHA7CisgICAgICAgICAgICB1bmlxdWVfcHRyPF9fYmFzZSwgX0RwPiBfX2hvbGQoX19hLmFsbG9jYXRlKDEpLCBfRHAoX19hLCAxKSk7CisgICAgICAgICAgICA6Om5ldyAoX19ob2xkLmdldCgpKSBfRkYoX19mLCBfQWxsb2MoX19hKSk7CisgICAgICAgICAgICBfX2ZfID0gX19ob2xkLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorZnVuY3Rpb248X1JwKF9BMCwgX0ExLCBfQTIpPiYKK2Z1bmN0aW9uPF9ScChfQTAsIF9BMSwgX0EyKT46Om9wZXJhdG9yPShjb25zdCBmdW5jdGlvbiYgX19mKQoreworICAgIGZ1bmN0aW9uKF9fZikuc3dhcCgqdGhpcyk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExLCBjbGFzcyBfQTI+CitmdW5jdGlvbjxfUnAoX0EwLCBfQTEsIF9BMik+JgorZnVuY3Rpb248X1JwKF9BMCwgX0ExLCBfQTIpPjo6b3BlcmF0b3I9KG51bGxwdHJfdCkKK3sKKyAgICBpZiAoX19mXyA9PSAoX19iYXNlKikmX19idWZfKQorICAgICAgICBfX2ZfLT5kZXN0cm95KCk7CisgICAgZWxzZSBpZiAoX19mXykKKyAgICAgICAgX19mXy0+ZGVzdHJveV9kZWFsbG9jYXRlKCk7CisgICAgX19mXyA9IDA7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExLCBjbGFzcyBfQTI+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwPgordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgIWlzX2ludGVncmFsPF9GcD46OnZhbHVlLAorICAgIGZ1bmN0aW9uPF9ScChfQTAsIF9BMSwgX0EyKT4mCis+Ojp0eXBlCitmdW5jdGlvbjxfUnAoX0EwLCBfQTEsIF9BMik+OjpvcGVyYXRvcj0oX0ZwIF9fZikKK3sKKyAgICBmdW5jdGlvbihfVlNURDo6bW92ZShfX2YpKS5zd2FwKCp0aGlzKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KK2Z1bmN0aW9uPF9ScChfQTAsIF9BMSwgX0EyKT46On5mdW5jdGlvbigpCit7CisgICAgaWYgKF9fZl8gPT0gKF9fYmFzZSopJl9fYnVmXykKKyAgICAgICAgX19mXy0+ZGVzdHJveSgpOworICAgIGVsc2UgaWYgKF9fZl8pCisgICAgICAgIF9fZl8tPmRlc3Ryb3lfZGVhbGxvY2F0ZSgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExLCBjbGFzcyBfQTI+Cit2b2lkCitmdW5jdGlvbjxfUnAoX0EwLCBfQTEsIF9BMik+Ojpzd2FwKGZ1bmN0aW9uJiBfX2YpCit7CisgICAgaWYgKF9WU1REOjphZGRyZXNzb2YoX19mKSA9PSB0aGlzKQorICAgICAgcmV0dXJuOworICAgIGlmIChfX2ZfID09IChfX2Jhc2UqKSZfX2J1Zl8gJiYgX19mLl9fZl8gPT0gKF9fYmFzZSopJl9fZi5fX2J1Zl8pCisgICAgeworICAgICAgICB0eXBlbmFtZSBhbGlnbmVkX3N0b3JhZ2U8c2l6ZW9mKF9fYnVmXyk+Ojp0eXBlIF9fdGVtcGJ1ZjsKKyAgICAgICAgX19iYXNlKiBfX3QgPSAoX19iYXNlKikmX190ZW1wYnVmOworICAgICAgICBfX2ZfLT5fX2Nsb25lKF9fdCk7CisgICAgICAgIF9fZl8tPmRlc3Ryb3koKTsKKyAgICAgICAgX19mXyA9IDA7CisgICAgICAgIF9fZi5fX2ZfLT5fX2Nsb25lKChfX2Jhc2UqKSZfX2J1Zl8pOworICAgICAgICBfX2YuX19mXy0+ZGVzdHJveSgpOworICAgICAgICBfX2YuX19mXyA9IDA7CisgICAgICAgIF9fZl8gPSAoX19iYXNlKikmX19idWZfOworICAgICAgICBfX3QtPl9fY2xvbmUoKF9fYmFzZSopJl9fZi5fX2J1Zl8pOworICAgICAgICBfX3QtPmRlc3Ryb3koKTsKKyAgICAgICAgX19mLl9fZl8gPSAoX19iYXNlKikmX19mLl9fYnVmXzsKKyAgICB9CisgICAgZWxzZSBpZiAoX19mXyA9PSAoX19iYXNlKikmX19idWZfKQorICAgIHsKKyAgICAgICAgX19mXy0+X19jbG9uZSgoX19iYXNlKikmX19mLl9fYnVmXyk7CisgICAgICAgIF9fZl8tPmRlc3Ryb3koKTsKKyAgICAgICAgX19mXyA9IF9fZi5fX2ZfOworICAgICAgICBfX2YuX19mXyA9IChfX2Jhc2UqKSZfX2YuX19idWZfOworICAgIH0KKyAgICBlbHNlIGlmIChfX2YuX19mXyA9PSAoX19iYXNlKikmX19mLl9fYnVmXykKKyAgICB7CisgICAgICAgIF9fZi5fX2ZfLT5fX2Nsb25lKChfX2Jhc2UqKSZfX2J1Zl8pOworICAgICAgICBfX2YuX19mXy0+ZGVzdHJveSgpOworICAgICAgICBfX2YuX19mXyA9IF9fZl87CisgICAgICAgIF9fZl8gPSAoX19iYXNlKikmX19idWZfOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIF9WU1REOjpzd2FwKF9fZl8sIF9fZi5fX2ZfKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorX1JwCitmdW5jdGlvbjxfUnAoX0EwLCBfQTEsIF9BMik+OjpvcGVyYXRvcigpKF9BMCBfX2EwLCBfQTEgX19hMSwgX0EyIF9fYTIpIGNvbnN0Cit7CisgICAgaWYgKF9fZl8gPT0gMCkKKyAgICAgICAgX190aHJvd19iYWRfZnVuY3Rpb25fY2FsbCgpOworICAgIHJldHVybiAoKl9fZl8pKF9fYTAsIF9fYTEsIF9fYTIpOworfQorCisjaWZuZGVmIF9MSUJDUFBfTk9fUlRUSQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExLCBjbGFzcyBfQTI+Citjb25zdCBzdGQ6OnR5cGVfaW5mbyYKK2Z1bmN0aW9uPF9ScChfQTAsIF9BMSwgX0EyKT46OnRhcmdldF90eXBlKCkgY29uc3QKK3sKKyAgICBpZiAoX19mXyA9PSAwKQorICAgICAgICByZXR1cm4gdHlwZWlkKHZvaWQpOworICAgIHJldHVybiBfX2ZfLT50YXJnZXRfdHlwZSgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExLCBjbGFzcyBfQTI+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorX1RwKgorZnVuY3Rpb248X1JwKF9BMCwgX0ExLCBfQTIpPjo6dGFyZ2V0KCkKK3sKKyAgICBpZiAoX19mXyA9PSAwKQorICAgICAgICByZXR1cm4gKF9UcCopMDsKKyAgICByZXR1cm4gKF9UcCopIGNvbnN0X2Nhc3Q8dm9pZCAqPihfX2ZfLT50YXJnZXQodHlwZWlkKF9UcCkpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgordGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KK2NvbnN0IF9UcCoKK2Z1bmN0aW9uPF9ScChfQTAsIF9BMSwgX0EyKT46OnRhcmdldCgpIGNvbnN0Cit7CisgICAgaWYgKF9fZl8gPT0gMCkKKyAgICAgICAgcmV0dXJuIChjb25zdCBfVHAqKTA7CisgICAgcmV0dXJuIChjb25zdCBfVHAqKV9fZl8tPnRhcmdldCh0eXBlaWQoX1RwKSk7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19SVFRJCisKK3RlbXBsYXRlIDxjbGFzcyBfRnA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBmdW5jdGlvbjxfRnA+JiBfX2YsIG51bGxwdHJfdCkge3JldHVybiAhX19mO30KKwordGVtcGxhdGUgPGNsYXNzIF9GcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj09KG51bGxwdHJfdCwgY29uc3QgZnVuY3Rpb248X0ZwPiYgX19mKSB7cmV0dXJuICFfX2Y7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yIT0oY29uc3QgZnVuY3Rpb248X0ZwPiYgX19mLCBudWxscHRyX3QpIHtyZXR1cm4gKGJvb2wpX19mO30KKwordGVtcGxhdGUgPGNsYXNzIF9GcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KG51bGxwdHJfdCwgY29uc3QgZnVuY3Rpb248X0ZwPiYgX19mKSB7cmV0dXJuIChib29sKV9fZjt9CisKK3RlbXBsYXRlIDxjbGFzcyBfRnA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChmdW5jdGlvbjxfRnA+JiBfX3gsIGZ1bmN0aW9uPF9GcD4mIF9feSkKK3tyZXR1cm4gX194LnN3YXAoX195KTt9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9GVU5DVElPTkFMXzAzCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX19mdW5jdGlvbmFsX2Jhc2UgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX19mdW5jdGlvbmFsX2Jhc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhZjRkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX2Z1bmN0aW9uYWxfYmFzZQpAQCAtMCwwICsxLDY2MyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9GVU5DVElPTkFMX0JBU0UKKyNkZWZpbmUgX0xJQkNQUF9GVU5DVElPTkFMX0JBU0UKKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHR5cGVpbmZvPgorI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyLCBjbGFzcyBfUmVzdWx0Pgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGJpbmFyeV9mdW5jdGlvbgoreworICAgIHR5cGVkZWYgX0FyZzEgICBmaXJzdF9hcmd1bWVudF90eXBlOworICAgIHR5cGVkZWYgX0FyZzIgICBzZWNvbmRfYXJndW1lbnRfdHlwZTsKKyAgICB0eXBlZGVmIF9SZXN1bHQgcmVzdWx0X3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9faGFzX3Jlc3VsdF90eXBlCit7Citwcml2YXRlOgorICAgIHN0cnVjdCBfX3R3byB7Y2hhciBfX2x4OyBjaGFyIF9fbHh4O307CisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4gc3RhdGljIF9fdHdvIF9fdGVzdCguLi4pOworICAgIHRlbXBsYXRlIDxjbGFzcyBfVXA+IHN0YXRpYyBjaGFyIF9fdGVzdCh0eXBlbmFtZSBfVXA6OnJlc3VsdF90eXBlKiA9IDApOworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gc2l6ZW9mKF9fdGVzdDxfVHA+KDApKSA9PSAxOworfTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwID0gdm9pZD4KKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorI2VuZGlmCitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgbGVzcyA6IGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4KK3sKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIAorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX194IDwgX195O30KK307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBsZXNzPHZvaWQ+Cit7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPiAKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYXV0byBvcGVyYXRvcigpKF9UMSYmIF9fdCwgX1QyJiYgX191KSBjb25zdAorICAgIF9OT0VYQ0VQVF8obm9leGNlcHQoX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpIDwgX1ZTVEQ6OmZvcndhcmQ8X1QyPihfX3UpKSkKKyAgICAtPiBkZWNsdHlwZSAgICAgICAgKF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSA8IF9WU1REOjpmb3J3YXJkPF9UMj4oX191KSkKKyAgICAgICAgeyByZXR1cm4gICAgICAgIF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSA8IF9WU1REOjpmb3J3YXJkPF9UMj4oX191KTsgfQorICAgIHR5cGVkZWYgdm9pZCBpc190cmFuc3BhcmVudDsKK307CisjZW5kaWYKKworLy8gX193ZWFrX3Jlc3VsdF90eXBlCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19kZXJpdmVzX2Zyb21fdW5hcnlfZnVuY3Rpb24KK3sKK3ByaXZhdGU6CisgICAgc3RydWN0IF9fdHdvIHtjaGFyIF9fbHg7IGNoYXIgX19seHg7fTsKKyAgICBzdGF0aWMgX190d28gX190ZXN0KC4uLik7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9BcCwgY2xhc3MgX1JwPgorICAgICAgICBzdGF0aWMgdW5hcnlfZnVuY3Rpb248X0FwLCBfUnA+CisgICAgICAgIF9fdGVzdChjb25zdCB2b2xhdGlsZSB1bmFyeV9mdW5jdGlvbjxfQXAsIF9ScD4qKTsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9ICFpc19zYW1lPGRlY2x0eXBlKF9fdGVzdCgoX1RwKikwKSksIF9fdHdvPjo6dmFsdWU7CisgICAgdHlwZWRlZiBkZWNsdHlwZShfX3Rlc3QoKF9UcCopMCkpIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fZGVyaXZlc19mcm9tX2JpbmFyeV9mdW5jdGlvbgoreworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgX190d28ge2NoYXIgX19seDsgY2hhciBfX2x4eDt9OworICAgIHN0YXRpYyBfX3R3byBfX3Rlc3QoLi4uKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ExLCBjbGFzcyBfQTIsIGNsYXNzIF9ScD4KKyAgICAgICAgc3RhdGljIGJpbmFyeV9mdW5jdGlvbjxfQTEsIF9BMiwgX1JwPgorICAgICAgICBfX3Rlc3QoY29uc3Qgdm9sYXRpbGUgYmluYXJ5X2Z1bmN0aW9uPF9BMSwgX0EyLCBfUnA+Kik7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSAhaXNfc2FtZTxkZWNsdHlwZShfX3Rlc3QoKF9UcCopMCkpLCBfX3R3bz46OnZhbHVlOworICAgIHR5cGVkZWYgZGVjbHR5cGUoX190ZXN0KChfVHAqKTApKSB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgYm9vbCA9IF9fZGVyaXZlc19mcm9tX3VuYXJ5X2Z1bmN0aW9uPF9UcD46OnZhbHVlPgorc3RydWN0IF9fbWF5YmVfZGVyaXZlX2Zyb21fdW5hcnlfZnVuY3Rpb24gIC8vIGJvb2wgaXMgdHJ1ZQorICAgIDogcHVibGljIF9fZGVyaXZlc19mcm9tX3VuYXJ5X2Z1bmN0aW9uPF9UcD46OnR5cGUKK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19tYXliZV9kZXJpdmVfZnJvbV91bmFyeV9mdW5jdGlvbjxfVHAsIGZhbHNlPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgYm9vbCA9IF9fZGVyaXZlc19mcm9tX2JpbmFyeV9mdW5jdGlvbjxfVHA+Ojp2YWx1ZT4KK3N0cnVjdCBfX21heWJlX2Rlcml2ZV9mcm9tX2JpbmFyeV9mdW5jdGlvbiAgLy8gYm9vbCBpcyB0cnVlCisgICAgOiBwdWJsaWMgX19kZXJpdmVzX2Zyb21fYmluYXJ5X2Z1bmN0aW9uPF9UcD46OnR5cGUKK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19tYXliZV9kZXJpdmVfZnJvbV9iaW5hcnlfZnVuY3Rpb248X1RwLCBmYWxzZT4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGJvb2wgPSBfX2hhc19yZXN1bHRfdHlwZTxfVHA+Ojp2YWx1ZT4KK3N0cnVjdCBfX3dlYWtfcmVzdWx0X3R5cGVfaW1wIC8vIGJvb2wgaXMgdHJ1ZQorICAgIDogcHVibGljIF9fbWF5YmVfZGVyaXZlX2Zyb21fdW5hcnlfZnVuY3Rpb248X1RwPiwKKyAgICAgIHB1YmxpYyBfX21heWJlX2Rlcml2ZV9mcm9tX2JpbmFyeV9mdW5jdGlvbjxfVHA+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHA6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX3dlYWtfcmVzdWx0X3R5cGVfaW1wPF9UcCwgZmFsc2U+CisgICAgOiBwdWJsaWMgX19tYXliZV9kZXJpdmVfZnJvbV91bmFyeV9mdW5jdGlvbjxfVHA+LAorICAgICAgcHVibGljIF9fbWF5YmVfZGVyaXZlX2Zyb21fYmluYXJ5X2Z1bmN0aW9uPF9UcD4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX193ZWFrX3Jlc3VsdF90eXBlCisgICAgOiBwdWJsaWMgX193ZWFrX3Jlc3VsdF90eXBlX2ltcDxfVHA+Cit7Cit9OworCisvLyAwIGFyZ3VtZW50IGNhc2UKKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK3N0cnVjdCBfX3dlYWtfcmVzdWx0X3R5cGU8X1JwICgpPgoreworICAgIHR5cGVkZWYgX1JwIHJlc3VsdF90eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK3N0cnVjdCBfX3dlYWtfcmVzdWx0X3R5cGU8X1JwICgmKSgpPgoreworICAgIHR5cGVkZWYgX1JwIHJlc3VsdF90eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK3N0cnVjdCBfX3dlYWtfcmVzdWx0X3R5cGU8X1JwICgqKSgpPgoreworICAgIHR5cGVkZWYgX1JwIHJlc3VsdF90eXBlOworfTsKKworLy8gMSBhcmd1bWVudCBjYXNlCisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9BMT4KK3N0cnVjdCBfX3dlYWtfcmVzdWx0X3R5cGU8X1JwIChfQTEpPgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9BMSwgX1JwPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0ExPgorc3RydWN0IF9fd2Vha19yZXN1bHRfdHlwZTxfUnAgKCYpKF9BMSk+CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X0ExLCBfUnA+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQTE+CitzdHJ1Y3QgX193ZWFrX3Jlc3VsdF90eXBlPF9ScCAoKikoX0ExKT4KKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfQTEsIF9ScD4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DcD4KK3N0cnVjdCBfX3dlYWtfcmVzdWx0X3R5cGU8X1JwIChfQ3A6OiopKCk+CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X0NwKiwgX1JwPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NwPgorc3RydWN0IF9fd2Vha19yZXN1bHRfdHlwZTxfUnAgKF9DcDo6KikoKSBjb25zdD4KKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxjb25zdCBfQ3AqLCBfUnA+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ3A+CitzdHJ1Y3QgX193ZWFrX3Jlc3VsdF90eXBlPF9ScCAoX0NwOjoqKSgpIHZvbGF0aWxlPgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHZvbGF0aWxlIF9DcCosIF9ScD4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DcD4KK3N0cnVjdCBfX3dlYWtfcmVzdWx0X3R5cGU8X1JwIChfQ3A6OiopKCkgY29uc3Qgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248Y29uc3Qgdm9sYXRpbGUgX0NwKiwgX1JwPgoreworfTsKKworLy8gMiBhcmd1bWVudCBjYXNlCisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorc3RydWN0IF9fd2Vha19yZXN1bHRfdHlwZTxfUnAgKF9BMSwgX0EyKT4KKyAgICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X0ExLCBfQTIsIF9ScD4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorc3RydWN0IF9fd2Vha19yZXN1bHRfdHlwZTxfUnAgKCopKF9BMSwgX0EyKT4KKyAgICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X0ExLCBfQTIsIF9ScD4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorc3RydWN0IF9fd2Vha19yZXN1bHRfdHlwZTxfUnAgKCYpKF9BMSwgX0EyKT4KKyAgICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X0ExLCBfQTIsIF9ScD4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DcCwgY2xhc3MgX0ExPgorc3RydWN0IF9fd2Vha19yZXN1bHRfdHlwZTxfUnAgKF9DcDo6KikoX0ExKT4KKyAgICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X0NwKiwgX0ExLCBfUnA+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ3AsIGNsYXNzIF9BMT4KK3N0cnVjdCBfX3dlYWtfcmVzdWx0X3R5cGU8X1JwIChfQ3A6OiopKF9BMSkgY29uc3Q+CisgICAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IF9DcCosIF9BMSwgX1JwPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NwLCBjbGFzcyBfQTE+CitzdHJ1Y3QgX193ZWFrX3Jlc3VsdF90eXBlPF9ScCAoX0NwOjoqKShfQTEpIHZvbGF0aWxlPgorICAgIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjx2b2xhdGlsZSBfQ3AqLCBfQTEsIF9ScD4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DcCwgY2xhc3MgX0ExPgorc3RydWN0IF9fd2Vha19yZXN1bHRfdHlwZTxfUnAgKF9DcDo6KikoX0ExKSBjb25zdCB2b2xhdGlsZT4KKyAgICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248Y29uc3Qgdm9sYXRpbGUgX0NwKiwgX0ExLCBfUnA+Cit7Cit9OworCisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisvLyAzIG9yIG1vcmUgYXJndW1lbnRzCisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyLCBjbGFzcyBfQTMsIGNsYXNzIC4uLl9BND4KK3N0cnVjdCBfX3dlYWtfcmVzdWx0X3R5cGU8X1JwIChfQTEsIF9BMiwgX0EzLCBfQTQuLi4pPgoreworICAgIHR5cGVkZWYgX1JwIHJlc3VsdF90eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0ExLCBjbGFzcyBfQTIsIGNsYXNzIF9BMywgY2xhc3MgLi4uX0E0Pgorc3RydWN0IF9fd2Vha19yZXN1bHRfdHlwZTxfUnAgKCYpKF9BMSwgX0EyLCBfQTMsIF9BNC4uLik+Cit7CisgICAgdHlwZWRlZiBfUnAgcmVzdWx0X3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMiwgY2xhc3MgX0EzLCBjbGFzcyAuLi5fQTQ+CitzdHJ1Y3QgX193ZWFrX3Jlc3VsdF90eXBlPF9ScCAoKikoX0ExLCBfQTIsIF9BMywgX0E0Li4uKT4KK3sKKyAgICB0eXBlZGVmIF9ScCByZXN1bHRfdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DcCwgY2xhc3MgX0ExLCBjbGFzcyBfQTIsIGNsYXNzIC4uLl9BMz4KK3N0cnVjdCBfX3dlYWtfcmVzdWx0X3R5cGU8X1JwIChfQ3A6OiopKF9BMSwgX0EyLCBfQTMuLi4pPgoreworICAgIHR5cGVkZWYgX1JwIHJlc3VsdF90eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMiwgY2xhc3MgLi4uX0EzPgorc3RydWN0IF9fd2Vha19yZXN1bHRfdHlwZTxfUnAgKF9DcDo6KikoX0ExLCBfQTIsIF9BMy4uLikgY29uc3Q+Cit7CisgICAgdHlwZWRlZiBfUnAgcmVzdWx0X3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ3AsIGNsYXNzIF9BMSwgY2xhc3MgX0EyLCBjbGFzcyAuLi5fQTM+CitzdHJ1Y3QgX193ZWFrX3Jlc3VsdF90eXBlPF9ScCAoX0NwOjoqKShfQTEsIF9BMiwgX0EzLi4uKSB2b2xhdGlsZT4KK3sKKyAgICB0eXBlZGVmIF9ScCByZXN1bHRfdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DcCwgY2xhc3MgX0ExLCBjbGFzcyBfQTIsIGNsYXNzIC4uLl9BMz4KK3N0cnVjdCBfX3dlYWtfcmVzdWx0X3R5cGU8X1JwIChfQ3A6OiopKF9BMSwgX0EyLCBfQTMuLi4pIGNvbnN0IHZvbGF0aWxlPgoreworICAgIHR5cGVkZWYgX1JwIHJlc3VsdF90eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgLi4uX0FyZ3M+CitzdHJ1Y3QgX19pbnZva2VfcmV0dXJuCit7CisgICAgdHlwZWRlZiBkZWNsdHlwZShfX2ludm9rZShfVlNURDo6ZGVjbHZhbDxfVHA+KCksIF9WU1REOjpkZWNsdmFsPF9BcmdzPigpLi4uKSkgdHlwZTsKK307CisKKyNlbHNlIC8vIGRlZmluZWQoX0xJQkNQUF9DWFgwM19MQU5HKQorCisjaW5jbHVkZSA8X19mdW5jdGlvbmFsX2Jhc2VfMDM+CisKKyNlbmRpZiAgLy8gIWRlZmluZWQoX0xJQkNQUF9DWFgwM19MQU5HKQorCisKK3RlbXBsYXRlIDxjbGFzcyBfUmV0Pgorc3RydWN0IF9faW52b2tlX3ZvaWRfcmV0dXJuX3dyYXBwZXIKK3sKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdGVtcGxhdGUgPGNsYXNzIC4uLl9BcmdzPgorICAgIHN0YXRpYyBfUmV0IF9fY2FsbChfQXJncyYmLi4uIF9fYXJncykgeworICAgICAgICByZXR1cm4gX19pbnZva2UoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKyNlbHNlCisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gbj4KKyAgICBzdGF0aWMgX1JldCBfX2NhbGwoX0ZuIF9fZikgeworICAgICAgICByZXR1cm4gX19pbnZva2UoX19mKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZuLCBjbGFzcyBfQTA+CisgICAgc3RhdGljIF9SZXQgX19jYWxsKF9GbiBfX2YsIF9BMCYgX19hMCkgeworICAgICAgICByZXR1cm4gX19pbnZva2UoX19mLCBfX2EwKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZuLCBjbGFzcyBfQTAsIGNsYXNzIF9BMT4KKyAgICBzdGF0aWMgX1JldCBfX2NhbGwoX0ZuIF9fZiwgX0EwJiBfX2EwLCBfQTEmIF9fYTEpIHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKF9fZiwgX19hMCwgX19hMSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9GbiwgY2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KKyAgICBzdGF0aWMgX1JldCBfX2NhbGwoX0ZuIF9fZiwgX0EwJiBfX2EwLCBfQTEmIF9fYTEsIF9BMiYgX19hMil7CisgICAgICAgIHJldHVybiBfX2ludm9rZShfX2YsIF9fYTAsIF9fYTEsIF9fYTIpOworICAgIH0KKyNlbmRpZgorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfX2ludm9rZV92b2lkX3JldHVybl93cmFwcGVyPHZvaWQ+Cit7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHRlbXBsYXRlIDxjbGFzcyAuLi5fQXJncz4KKyAgICBzdGF0aWMgdm9pZCBfX2NhbGwoX0FyZ3MmJi4uLiBfX2FyZ3MpIHsKKyAgICAgICAgX19pbnZva2UoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKyNlbHNlCisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gbj4KKyAgICBzdGF0aWMgdm9pZCBfX2NhbGwoX0ZuIF9fZikgeworICAgICAgICBfX2ludm9rZShfX2YpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm4sIGNsYXNzIF9BMD4KKyAgICBzdGF0aWMgdm9pZCBfX2NhbGwoX0ZuIF9fZiwgX0EwJiBfX2EwKSB7CisgICAgICAgIF9faW52b2tlKF9fZiwgX19hMCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9GbiwgY2xhc3MgX0EwLCBjbGFzcyBfQTE+CisgICAgc3RhdGljIHZvaWQgX19jYWxsKF9GbiBfX2YsIF9BMCYgX19hMCwgX0ExJiBfX2ExKSB7CisgICAgICAgIF9faW52b2tlKF9fZiwgX19hMCwgX19hMSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9GbiwgY2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KKyAgICBzdGF0aWMgdm9pZCBfX2NhbGwoX0ZuIF9fZiwgX0EwJiBfX2EwLCBfQTEmIF9fYTEsIF9BMiYgX19hMikgeworICAgICAgICBfX2ludm9rZShfX2YsIF9fYTAsIF9fYTEsIF9fYTIpOworICAgIH0KKyNlbmRpZgorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHJlZmVyZW5jZV93cmFwcGVyCisgICAgOiBwdWJsaWMgX193ZWFrX3Jlc3VsdF90eXBlPF9UcD4KK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgX1RwIHR5cGU7Citwcml2YXRlOgorICAgIHR5cGUqIF9fZl87CisKK3B1YmxpYzoKKyAgICAvLyBjb25zdHJ1Y3QvY29weS9kZXN0cm95CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByZWZlcmVuY2Vfd3JhcHBlcih0eXBlJiBfX2YpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fZl8oX1ZTVEQ6OmFkZHJlc3NvZihfX2YpKSB7fQorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBwcml2YXRlOiByZWZlcmVuY2Vfd3JhcHBlcih0eXBlJiYpOyBwdWJsaWM6IC8vID0gZGVsZXRlOyAvLyBkbyBub3QgYmluZCB0byB0ZW1wcworI2VuZGlmCisKKyAgICAvLyBhY2Nlc3MKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIG9wZXJhdG9yIHR5cGUmICAgICgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuICpfX2ZfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZICAgICAgICAgIHR5cGUmIGdldCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuICpfX2ZfO30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICAvLyBpbnZva2UKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ1R5cGVzPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBfX2ludm9rZV9vZjx0eXBlJiwgX0FyZ1R5cGVzLi4uPjo6dHlwZQorICAgIG9wZXJhdG9yKCkgKF9BcmdUeXBlcyYmLi4uIF9fYXJncykgY29uc3QgeworICAgICAgICByZXR1cm4gX19pbnZva2UoZ2V0KCksIF9WU1REOjpmb3J3YXJkPF9BcmdUeXBlcz4oX19hcmdzKS4uLik7CisgICAgfQorI2Vsc2UKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBfX2ludm9rZV9yZXR1cm48dHlwZT46OnR5cGUKKyAgICBvcGVyYXRvcigpICgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKGdldCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBfX2ludm9rZV9yZXR1cm4wPHR5cGUsIF9BMD46OnR5cGUKKyAgICBvcGVyYXRvcigpIChfQTAmIF9fYTApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKGdldCgpLCBfX2EwKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBfX2ludm9rZV9yZXR1cm4wPHR5cGUsIF9BMCBjb25zdD46OnR5cGUKKyAgICBvcGVyYXRvcigpIChfQTAgY29uc3QmIF9fYTApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKGdldCgpLCBfX2EwKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTE+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIF9faW52b2tlX3JldHVybjE8dHlwZSwgX0EwLCBfQTE+Ojp0eXBlCisgICAgb3BlcmF0b3IoKSAoX0EwJiBfX2EwLCBfQTEmIF9fYTEpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKGdldCgpLCBfX2EwLCBfX2ExKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTE+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIF9faW52b2tlX3JldHVybjE8dHlwZSwgX0EwIGNvbnN0LCBfQTE+Ojp0eXBlCisgICAgb3BlcmF0b3IoKSAoX0EwIGNvbnN0JiBfX2EwLCBfQTEmIF9fYTEpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKGdldCgpLCBfX2EwLCBfX2ExKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTE+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIF9faW52b2tlX3JldHVybjE8dHlwZSwgX0EwLCBfQTEgY29uc3Q+Ojp0eXBlCisgICAgb3BlcmF0b3IoKSAoX0EwJiBfX2EwLCBfQTEgY29uc3QmIF9fYTEpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKGdldCgpLCBfX2EwLCBfX2ExKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTE+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIF9faW52b2tlX3JldHVybjE8dHlwZSwgX0EwIGNvbnN0LCBfQTEgY29uc3Q+Ojp0eXBlCisgICAgb3BlcmF0b3IoKSAoX0EwIGNvbnN0JiBfX2EwLCBfQTEgY29uc3QmIF9fYTEpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKGdldCgpLCBfX2EwLCBfX2ExKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgX19pbnZva2VfcmV0dXJuMjx0eXBlLCBfQTAsIF9BMSwgX0EyPjo6dHlwZQorICAgIG9wZXJhdG9yKCkgKF9BMCYgX19hMCwgX0ExJiBfX2ExLCBfQTImIF9fYTIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKGdldCgpLCBfX2EwLCBfX2ExLCBfX2EyKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgX19pbnZva2VfcmV0dXJuMjx0eXBlLCBfQTAgY29uc3QsIF9BMSwgX0EyPjo6dHlwZQorICAgIG9wZXJhdG9yKCkgKF9BMCBjb25zdCYgX19hMCwgX0ExJiBfX2ExLCBfQTImIF9fYTIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKGdldCgpLCBfX2EwLCBfX2ExLCBfX2EyKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgX19pbnZva2VfcmV0dXJuMjx0eXBlLCBfQTAsIF9BMSBjb25zdCwgX0EyPjo6dHlwZQorICAgIG9wZXJhdG9yKCkgKF9BMCYgX19hMCwgX0ExIGNvbnN0JiBfX2ExLCBfQTImIF9fYTIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKGdldCgpLCBfX2EwLCBfX2ExLCBfX2EyKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgX19pbnZva2VfcmV0dXJuMjx0eXBlLCBfQTAsIF9BMSwgX0EyIGNvbnN0Pjo6dHlwZQorICAgIG9wZXJhdG9yKCkgKF9BMCYgX19hMCwgX0ExJiBfX2ExLCBfQTIgY29uc3QmIF9fYTIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKGdldCgpLCBfX2EwLCBfX2ExLCBfX2EyKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgX19pbnZva2VfcmV0dXJuMjx0eXBlLCBfQTAgY29uc3QsIF9BMSBjb25zdCwgX0EyPjo6dHlwZQorICAgIG9wZXJhdG9yKCkgKF9BMCBjb25zdCYgX19hMCwgX0ExIGNvbnN0JiBfX2ExLCBfQTImIF9fYTIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKGdldCgpLCBfX2EwLCBfX2ExLCBfX2EyKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgX19pbnZva2VfcmV0dXJuMjx0eXBlLCBfQTAgY29uc3QsIF9BMSwgX0EyIGNvbnN0Pjo6dHlwZQorICAgIG9wZXJhdG9yKCkgKF9BMCBjb25zdCYgX19hMCwgX0ExJiBfX2ExLCBfQTIgY29uc3QmIF9fYTIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKGdldCgpLCBfX2EwLCBfX2ExLCBfX2EyKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgX19pbnZva2VfcmV0dXJuMjx0eXBlLCBfQTAsIF9BMSBjb25zdCwgX0EyIGNvbnN0Pjo6dHlwZQorICAgIG9wZXJhdG9yKCkgKF9BMCYgX19hMCwgX0ExIGNvbnN0JiBfX2ExLCBfQTIgY29uc3QmIF9fYTIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKGdldCgpLCBfX2EwLCBfX2ExLCBfX2EyKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgX19pbnZva2VfcmV0dXJuMjx0eXBlLCBfQTAgY29uc3QsIF9BMSBjb25zdCwgX0EyIGNvbnN0Pjo6dHlwZQorICAgIG9wZXJhdG9yKCkgKF9BMCBjb25zdCYgX19hMCwgX0ExIGNvbnN0JiBfX2ExLCBfQTIgY29uc3QmIF9fYTIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKGdldCgpLCBfX2EwLCBfX2ExLCBfX2EyKTsKKyAgICB9CisjZW5kaWYgLy8gX0xJQkNQUF9DWFgwM19MQU5HCit9OworCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorcmVmZXJlbmNlX3dyYXBwZXI8X1RwPgorcmVmKF9UcCYgX190KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gcmVmZXJlbmNlX3dyYXBwZXI8X1RwPihfX3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3JlZmVyZW5jZV93cmFwcGVyPF9UcD4KK3JlZihyZWZlcmVuY2Vfd3JhcHBlcjxfVHA+IF9fdCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIHJlZihfX3QuZ2V0KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3JlZmVyZW5jZV93cmFwcGVyPGNvbnN0IF9UcD4KK2NyZWYoY29uc3QgX1RwJiBfX3QpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiByZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBfVHA+KF9fdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorcmVmZXJlbmNlX3dyYXBwZXI8Y29uc3QgX1RwPgorY3JlZihyZWZlcmVuY2Vfd3JhcHBlcjxfVHA+IF9fdCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIGNyZWYoX190LmdldCgpKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHZvaWQgcmVmKGNvbnN0IF9UcCYmKSA9IGRlbGV0ZTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHZvaWQgY3JlZihjb25zdCBfVHAmJikgPSBkZWxldGU7CisjZW5kaWYKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcywgY2xhc3MgPSB2b2lkPgorc3RydWN0IF9faXNfdHJhbnNwYXJlbnQgOiBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitzdHJ1Y3QgX19pc190cmFuc3BhcmVudDxfVHAsIF9VcCwgIAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX192b2lkX3Q8dHlwZW5hbWUgX1RwOjppc190cmFuc3BhcmVudD46OnR5cGU+CisgICA6IHRydWVfdHlwZSB7fTsKKyNlbmRpZgorCisvLyBhbGxvY2F0b3JfYXJnX3QKKworc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGFsbG9jYXRvcl9hcmdfdCB7IH07CisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfQ1hYMDNfTEFORykgfHwgZGVmaW5lZChfTElCQ1BQX0JVSUxESU5HX01FTU9SWSkKK2V4dGVybiBjb25zdCBhbGxvY2F0b3JfYXJnX3QgYWxsb2NhdG9yX2FyZzsKKyNlbHNlCisvKiBfTElCQ1BQX0lOTElORV9WQVIgKi8gY29uc3RleHByIGFsbG9jYXRvcl9hcmdfdCBhbGxvY2F0b3JfYXJnID0gYWxsb2NhdG9yX2FyZ190KCk7CisjZW5kaWYKKworLy8gdXNlc19hbGxvY2F0b3IKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2hhc19hbGxvY2F0b3JfdHlwZQoreworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgX190d28ge2NoYXIgX19seDsgY2hhciBfX2x4eDt9OworICAgIHRlbXBsYXRlIDxjbGFzcyBfVXA+IHN0YXRpYyBfX3R3byBfX3Rlc3QoLi4uKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPiBzdGF0aWMgY2hhciBfX3Rlc3QodHlwZW5hbWUgX1VwOjphbGxvY2F0b3JfdHlwZSogPSAwKTsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHNpemVvZihfX3Rlc3Q8X1RwPigwKSkgPT0gMTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYywgYm9vbCA9IF9faGFzX2FsbG9jYXRvcl90eXBlPF9UcD46OnZhbHVlPgorc3RydWN0IF9fdXNlc19hbGxvY2F0b3IKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICBpc19jb252ZXJ0aWJsZTxfQWxsb2MsIHR5cGVuYW1lIF9UcDo6YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZT4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX3VzZXNfYWxsb2NhdG9yPF9UcCwgX0FsbG9jLCBmYWxzZT4KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlCit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgdXNlc19hbGxvY2F0b3IKKyAgICA6IHB1YmxpYyBfX3VzZXNfYWxsb2NhdG9yPF9UcCwgX0FsbG9jPgoreworfTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitfTElCQ1BQX0lOTElORV9WQVIgY29uc3RleHByIHNpemVfdCB1c2VzX2FsbG9jYXRvcl92ID0gdXNlc19hbGxvY2F0b3I8X1RwLCBfQWxsb2M+Ojp2YWx1ZTsKKyNlbmRpZgorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCisvLyBhbGxvY2F0b3IgY29uc3RydWN0aW9uCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYywgY2xhc3MgLi4uX0FyZ3M+CitzdHJ1Y3QgX191c2VzX2FsbG9jX2N0b3JfaW1wCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3VuY3ZyZWY8X0FsbG9jPjo6dHlwZSBfUmF3QWxsb2M7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgX191YSA9IHVzZXNfYWxsb2NhdG9yPF9UcCwgX1Jhd0FsbG9jPjo6dmFsdWU7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgX19pYyA9CisgICAgICAgIGlzX2NvbnN0cnVjdGlibGU8X1RwLCBhbGxvY2F0b3JfYXJnX3QsIF9BbGxvYywgX0FyZ3MuLi4+Ojp2YWx1ZTsKKyAgICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gX191YSA/IDIgLSBfX2ljIDogMDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYywgY2xhc3MgLi4uX0FyZ3M+CitzdHJ1Y3QgX191c2VzX2FsbG9jX2N0b3IKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGludCwgX191c2VzX2FsbG9jX2N0b3JfaW1wPF9UcCwgX0FsbG9jLCBfQXJncy4uLj46OnZhbHVlPgorICAgIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yLCBjbGFzcy4uLiBfQXJncz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIF9fdXNlcl9hbGxvY19jb25zdHJ1Y3RfaW1wbCAoaW50ZWdyYWxfY29uc3RhbnQ8aW50LCAwPiwgX1RwICpfX3N0b3JhZ2UsIGNvbnN0IF9BbGxvY2F0b3IgJiwgX0FyZ3MgJiYuLi4gX19hcmdzICkKK3sKKyAgICBuZXcgKF9fc3RvcmFnZSkgX1RwIChfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7Cit9CisKKy8vIEZJWE1FOiBUaGlzIHNob3VsZCBoYXZlIGEgdmVyc2lvbiB3aGljaCB0YWtlcyBhIG5vbi1jb25zdCBhbGxvYy4KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3IsIGNsYXNzLi4uIF9BcmdzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQgX191c2VyX2FsbG9jX2NvbnN0cnVjdF9pbXBsIChpbnRlZ3JhbF9jb25zdGFudDxpbnQsIDE+LCBfVHAgKl9fc3RvcmFnZSwgY29uc3QgX0FsbG9jYXRvciAmX19hLCBfQXJncyAmJi4uLiBfX2FyZ3MgKQoreworICAgIG5ldyAoX19zdG9yYWdlKSBfVHAgKGFsbG9jYXRvcl9hcmcsIF9fYSwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworfQorCisvLyBGSVhNRTogVGhpcyBzaG91bGQgaGF2ZSBhIHZlcnNpb24gd2hpY2ggdGFrZXMgYSBub24tY29uc3QgYWxsb2MuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yLCBjbGFzcy4uLiBfQXJncz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIF9fdXNlcl9hbGxvY19jb25zdHJ1Y3RfaW1wbCAoaW50ZWdyYWxfY29uc3RhbnQ8aW50LCAyPiwgX1RwICpfX3N0b3JhZ2UsIGNvbnN0IF9BbGxvY2F0b3IgJl9fYSwgX0FyZ3MgJiYuLi4gX19hcmdzICkKK3sKKyAgICBuZXcgKF9fc3RvcmFnZSkgX1RwIChfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLiwgX19hKTsKK30KKworLy8gRklYTUU6IFRoZWlzIHNob3VsZCBoYXZlIGEgdmVyc2lvbiB3aGljaCB0YWtlcyBhIG5vbi1jb25zdCBhbGxvYy4KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3IsIGNsYXNzLi4uIF9BcmdzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQgX191c2VyX2FsbG9jX2NvbnN0cnVjdCAoX1RwICpfX3N0b3JhZ2UsIGNvbnN0IF9BbGxvY2F0b3IgJl9fYSwgX0FyZ3MgJiYuLi4gX19hcmdzKQoreyAKKyAgICBfX3VzZXJfYWxsb2NfY29uc3RydWN0X2ltcGwoIAorICAgICAgICAgICAgIF9fdXNlc19hbGxvY19jdG9yPF9UcCwgX0FsbG9jYXRvcj4oKSwgCisgICAgICAgICAgICAgX19zdG9yYWdlLCBfX2EsIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uCisgICAgICAgICk7Cit9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKKyNlbmRpZiAgLy8gX0xJQkNQUF9GVU5DVElPTkFMX0JBU0UKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX2Z1bmN0aW9uYWxfYmFzZV8wMyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX2Z1bmN0aW9uYWxfYmFzZV8wMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDA3ZGNmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fZnVuY3Rpb25hbF9iYXNlXzAzCkBAIC0wLDAgKzEsMjI0IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0ZVTkNUSU9OQUxfQkFTRV8wMworI2RlZmluZSBfTElCQ1BQX0ZVTkNUSU9OQUxfQkFTRV8wMworCisvLyBtYW51YWwgdmFyaWFkaWMgZXhwYW5zaW9uIGZvciA8ZnVuY3Rpb25hbD4KKworLy8gX19pbnZva2UKKwordGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UMSwgYm9vbCBfSXNGdW5jLCBib29sIF9Jc0Jhc2U+CitzdHJ1Y3QgX19lbmFibGVfaW52b2tlX2ltcDsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UMT4KK3N0cnVjdCBfX2VuYWJsZV9pbnZva2VfaW1wPF9SZXQsIF9UMSwgdHJ1ZSwgdHJ1ZT4geworICAgIHR5cGVkZWYgX1JldCBfQnVsbGV0MTsKKyAgICB0eXBlZGVmIF9CdWxsZXQxIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1QxPgorc3RydWN0IF9fZW5hYmxlX2ludm9rZV9pbXA8X1JldCwgX1QxLCB0cnVlLCBmYWxzZT4gIHsKKyAgICB0eXBlZGVmIF9SZXQgX0J1bGxldDI7CisgICAgdHlwZWRlZiBfQnVsbGV0MiB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UMT4KK3N0cnVjdCBfX2VuYWJsZV9pbnZva2VfaW1wPF9SZXQsIF9UMSwgZmFsc2UsIHRydWU+ICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX2FwcGx5X2N2PF9UMSwgX1JldD46OnR5cGUKKyAgICAgICAgICAgID46OnR5cGUgX0J1bGxldDM7CisgICAgdHlwZWRlZiBfQnVsbGV0MyB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UMT4KK3N0cnVjdCBfX2VuYWJsZV9pbnZva2VfaW1wPF9SZXQsIF9UMSwgZmFsc2UsIGZhbHNlPiAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19hcHBseV9jdjxkZWNsdHlwZSgqX1ZTVEQ6OmRlY2x2YWw8X1QxPigpKSwgX1JldD46OnR5cGUKKyAgICAgICAgICAgID46OnR5cGUgX0J1bGxldDQ7CisgICAgdHlwZWRlZiBfQnVsbGV0NCB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UMT4KK3N0cnVjdCBfX2VuYWJsZV9pbnZva2VfaW1wPF9SZXQsIF9UMSosIGZhbHNlLCBmYWxzZT4gIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fYXBwbHlfY3Y8X1QxLCBfUmV0Pjo6dHlwZQorICAgICAgICAgICAgPjo6dHlwZSBfQnVsbGV0NDsKKyAgICB0eXBlZGVmIF9CdWxsZXQ0ICB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9GbiwgY2xhc3MgX1QxLAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMgPSBfX21lbWJlcl9wb2ludGVyX3RyYWl0czxfRm4+LAorICAgICAgICAgIGNsYXNzIF9SZXQgPSB0eXBlbmFtZSBfVHJhaXRzOjpfUmV0dXJuVHlwZSwKKyAgICAgICAgICBjbGFzcyBfQ2xhc3MgPSB0eXBlbmFtZSBfVHJhaXRzOjpfQ2xhc3NUeXBlPgorc3RydWN0IF9fZW5hYmxlX2ludm9rZSA6IF9fZW5hYmxlX2ludm9rZV9pbXA8CisgICAgX1JldCwgX1QxLAorICAgIGlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyPF9Gbj46OnZhbHVlLAorICAgIGlzX2Jhc2Vfb2Y8X0NsYXNzLCB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UMT46OnR5cGU+Ojp2YWx1ZT4KK3sKK307CisKK19fbmF0IF9faW52b2tlKF9fYW55LCAuLi4pOworCisvLyBmaXJzdCBidWxsZXQKKwordGVtcGxhdGUgPGNsYXNzIF9GbiwgY2xhc3MgX1QxPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIF9fZW5hYmxlX2ludm9rZTxfRm4sIF9UMT46Ol9CdWxsZXQxCitfX2ludm9rZShfRm4gX19mLCBfVDEmIF9fdDEpIHsKKyAgICByZXR1cm4gKF9fdDEuKl9fZikoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9GbiwgY2xhc3MgX1QxLCBjbGFzcyBfQTA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgX19lbmFibGVfaW52b2tlPF9GbiwgX1QxPjo6X0J1bGxldDEKK19faW52b2tlKF9GbiBfX2YsIF9UMSYgX190MSwgX0EwJiBfX2EwKSB7CisgICAgcmV0dXJuIChfX3QxLipfX2YpKF9fYTApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZuLCBjbGFzcyBfVDEsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIF9fZW5hYmxlX2ludm9rZTxfRm4sIF9UMT46Ol9CdWxsZXQxCitfX2ludm9rZShfRm4gX19mLCBfVDEmIF9fdDEsIF9BMCYgX19hMCwgX0ExJiBfX2ExKSB7CisgICAgcmV0dXJuIChfX3QxLipfX2YpKF9fYTAsIF9fYTEpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZuLCBjbGFzcyBfVDEsIGNsYXNzIF9BMCwgY2xhc3MgX0ExLCBjbGFzcyBfQTI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgX19lbmFibGVfaW52b2tlPF9GbiwgX1QxPjo6X0J1bGxldDEKK19faW52b2tlKF9GbiBfX2YsIF9UMSYgX190MSwgX0EwJiBfX2EwLCBfQTEmIF9fYTEsIF9BMiYgX19hMikgeworICAgIHJldHVybiAoX190MS4qX19mKShfX2EwLCBfX2ExLCBfX2EyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9GbiwgY2xhc3MgX1QxPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIF9fZW5hYmxlX2ludm9rZTxfRm4sIF9UMT46Ol9CdWxsZXQyCitfX2ludm9rZShfRm4gX19mLCBfVDEmIF9fdDEpIHsKKyAgICByZXR1cm4gKCgqX190MSkuKl9fZikoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9GbiwgY2xhc3MgX1QxLCBjbGFzcyBfQTA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgX19lbmFibGVfaW52b2tlPF9GbiwgX1QxPjo6X0J1bGxldDIKK19faW52b2tlKF9GbiBfX2YsIF9UMSYgX190MSwgX0EwJiBfX2EwKSB7CisgICAgcmV0dXJuICgoKl9fdDEpLipfX2YpKF9fYTApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZuLCBjbGFzcyBfVDEsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIF9fZW5hYmxlX2ludm9rZTxfRm4sIF9UMT46Ol9CdWxsZXQyCitfX2ludm9rZShfRm4gX19mLCBfVDEmIF9fdDEsIF9BMCYgX19hMCwgX0ExJiBfX2ExKSB7CisgICAgcmV0dXJuICgoKl9fdDEpLipfX2YpKF9fYTAsIF9fYTEpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZuLCBjbGFzcyBfVDEsIGNsYXNzIF9BMCwgY2xhc3MgX0ExLCBjbGFzcyBfQTI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgX19lbmFibGVfaW52b2tlPF9GbiwgX1QxPjo6X0J1bGxldDIKK19faW52b2tlKF9GbiBfX2YsIF9UMSYgX190MSwgX0EwJiBfX2EwLCBfQTEmIF9fYTEsIF9BMiYgX19hMikgeworICAgIHJldHVybiAoKCpfX3QxKS4qX19mKShfX2EwLCBfX2ExLCBfX2EyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9GbiwgY2xhc3MgX1QxPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIF9fZW5hYmxlX2ludm9rZTxfRm4sIF9UMT46Ol9CdWxsZXQzCitfX2ludm9rZShfRm4gX19mLCBfVDEmIF9fdDEpIHsKKyAgICByZXR1cm4gX190MS4qX19mOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZuLCBjbGFzcyBfVDE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgX19lbmFibGVfaW52b2tlPF9GbiwgX1QxPjo6X0J1bGxldDQKK19faW52b2tlKF9GbiBfX2YsIF9UMSYgX190MSkgeworICAgIHJldHVybiAoKl9fdDEpLipfX2Y7Cit9CisKKy8vIGZpZnRoIGJ1bGxldAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2RlY2x0eXBlKF9WU1REOjpkZWNsdmFsPF9GcCY+KCkoKSkKK19faW52b2tlKF9GcCYgX19mKQoreworICAgIHJldHVybiBfX2YoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MgX0EwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2RlY2x0eXBlKF9WU1REOjpkZWNsdmFsPF9GcCY+KCkoX1ZTVEQ6OmRlY2x2YWw8X0EwJj4oKSkpCitfX2ludm9rZShfRnAmIF9fZiwgX0EwJiBfX2EwKQoreworICAgIHJldHVybiBfX2YoX19hMCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2RlY2x0eXBlKF9WU1REOjpkZWNsdmFsPF9GcCY+KCkoX1ZTVEQ6OmRlY2x2YWw8X0EwJj4oKSwgX1ZTVEQ6OmRlY2x2YWw8X0ExJj4oKSkpCitfX2ludm9rZShfRnAmIF9fZiwgX0EwJiBfX2EwLCBfQTEmIF9fYTEpCit7CisgICAgcmV0dXJuIF9fZihfX2EwLCBfX2ExKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitkZWNsdHlwZShfVlNURDo6ZGVjbHZhbDxfRnAmPigpKF9WU1REOjpkZWNsdmFsPF9BMCY+KCksIF9WU1REOjpkZWNsdmFsPF9BMSY+KCksIF9WU1REOjpkZWNsdmFsPF9BMiY+KCkpKQorX19pbnZva2UoX0ZwJiBfX2YsIF9BMCYgX19hMCwgX0ExJiBfX2ExLCBfQTImIF9fYTIpCit7CisgICAgcmV0dXJuIF9fZihfX2EwLCBfX2ExLCBfX2EyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9GcCwgYm9vbCA9IF9faGFzX3Jlc3VsdF90eXBlPF9fd2Vha19yZXN1bHRfdHlwZTxfRnA+ID46OnZhbHVlPgorc3RydWN0IF9faW52b2tlX3JldHVybgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX193ZWFrX3Jlc3VsdF90eXBlPF9GcD46OnJlc3VsdF90eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwPgorc3RydWN0IF9faW52b2tlX3JldHVybjxfRnAsIGZhbHNlPgoreworICAgIHR5cGVkZWYgZGVjbHR5cGUoX19pbnZva2UoX1ZTVEQ6OmRlY2x2YWw8X0ZwJj4oKSkpIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQTA+CitzdHJ1Y3QgX19pbnZva2VfcmV0dXJuMAoreworICAgIHR5cGVkZWYgZGVjbHR5cGUoX19pbnZva2UoX1ZTVEQ6OmRlY2x2YWw8X1RwJj4oKSwgX1ZTVEQ6OmRlY2x2YWw8X0EwJj4oKSkpIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfVHAsIGNsYXNzIF9BMD4KK3N0cnVjdCBfX2ludm9rZV9yZXR1cm4wPF9ScCBfVHA6OiosIF9BMD4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZW5hYmxlX2ludm9rZTxfUnAgX1RwOjoqLCBfQTA+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMT4KK3N0cnVjdCBfX2ludm9rZV9yZXR1cm4xCit7CisgICAgdHlwZWRlZiBkZWNsdHlwZShfX2ludm9rZShfVlNURDo6ZGVjbHZhbDxfVHAmPigpLCBfVlNURDo6ZGVjbHZhbDxfQTAmPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmRlY2x2YWw8X0ExJj4oKSkpIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorc3RydWN0IF9faW52b2tlX3JldHVybjE8X1JwIF9DbGFzczo6KiwgX0EwLCBfQTE+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZW5hYmxlX2ludm9rZTxfUnAgX0NsYXNzOjoqLCBfQTA+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorc3RydWN0IF9faW52b2tlX3JldHVybjIKK3sKKyAgICB0eXBlZGVmIGRlY2x0eXBlKF9faW52b2tlKF9WU1REOjpkZWNsdmFsPF9UcCY+KCksIF9WU1REOjpkZWNsdmFsPF9BMCY+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6ZGVjbHZhbDxfQTEmPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmRlY2x2YWw8X0EyJj4oKSkpIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX0NsYXNzLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorc3RydWN0IF9faW52b2tlX3JldHVybjI8X1JldCBfQ2xhc3M6OiosIF9BMCwgX0ExLCBfQTI+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZW5hYmxlX2ludm9rZTxfUmV0IF9DbGFzczo6KiwgX0EwPjo6dHlwZSB0eXBlOworfTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9GVU5DVElPTkFMX0JBU0VfMDMKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX2hhc2hfdGFibGUgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX19oYXNoX3RhYmxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNDMwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX19oYXNoX3RhYmxlCkBAIC0wLDAgKzEsMjY3NiBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9fSEFTSF9UQUJMRQorI2RlZmluZSBfTElCQ1BQX19IQVNIX1RBQkxFCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPF9fZGVidWc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX1BVU0hfTUFDUk9TCisjaW5jbHVkZSA8X191bmRlZl9tYWNyb3M+CisKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwPgordW5pb24gX19oYXNoX3ZhbHVlX3R5cGU7CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcD4KK3N0cnVjdCBfX2hhc2hfdmFsdWVfdHlwZTsKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NwLCBjbGFzcyBfSGFzaCwKKyAgICAgICAgICBib29sID0gIGlzX2VtcHR5PF9IYXNoPjo6dmFsdWUgJiYgIV9fbGliY3BwX2lzX2ZpbmFsPF9IYXNoPjo6dmFsdWU+CitjbGFzcyBfX3Vub3JkZXJlZF9tYXBfaGFzaGVyOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NwLCBjbGFzcyBfUHJlZCwKKyAgICAgICAgICBib29sID0gaXNfZW1wdHk8X1ByZWQ+Ojp2YWx1ZSAmJiAhX19saWJjcHBfaXNfZmluYWw8X1ByZWQ+Ojp2YWx1ZQorICAgICAgICAgPgorY2xhc3MgX191bm9yZGVyZWRfbWFwX2VxdWFsOworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2lzX2hhc2hfdmFsdWVfdHlwZV9pbXAgOiBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlPgorc3RydWN0IF9faXNfaGFzaF92YWx1ZV90eXBlX2ltcDxfX2hhc2hfdmFsdWVfdHlwZTxfS2V5LCBfVmFsdWU+PiA6IHRydWVfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIC4uLl9BcmdzPgorc3RydWN0IF9faXNfaGFzaF92YWx1ZV90eXBlIDogZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9PbmU+CitzdHJ1Y3QgX19pc19oYXNoX3ZhbHVlX3R5cGU8X09uZT4gOiBfX2lzX2hhc2hfdmFsdWVfdHlwZV9pbXA8dHlwZW5hbWUgX191bmN2cmVmPF9PbmU+Ojp0eXBlPiB7fTsKKyNlbmRpZgorCitfTElCQ1BQX0ZVTkNfVklTCitzaXplX3QgX19uZXh0X3ByaW1lKHNpemVfdCBfX24pOworCit0ZW1wbGF0ZSA8Y2xhc3MgX05vZGVQdHI+CitzdHJ1Y3QgX19oYXNoX25vZGVfYmFzZQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgcG9pbnRlcl90cmFpdHM8X05vZGVQdHI+OjplbGVtZW50X3R5cGUgX19ub2RlX3R5cGU7CisgICAgdHlwZWRlZiBfX2hhc2hfbm9kZV9iYXNlIF9fZmlyc3Rfbm9kZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3BvaW50ZXI8X05vZGVQdHIsIF9fZmlyc3Rfbm9kZT46OnR5cGUgX19ub2RlX2Jhc2VfcG9pbnRlcjsKKyAgICB0eXBlZGVmIF9Ob2RlUHRyIF9fbm9kZV9wb2ludGVyOworCisjaWYgZGVmaW5lZChfTElCQ1BQX0FCSV9GSVhfVU5PUkRFUkVEX05PREVfUE9JTlRFUl9VQikKKyAgdHlwZWRlZiBfX25vZGVfYmFzZV9wb2ludGVyIF9fbmV4dF9wb2ludGVyOworI2Vsc2UKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDwKKyAgICAgIGlzX3BvaW50ZXI8X19ub2RlX3BvaW50ZXI+Ojp2YWx1ZSwKKyAgICAgIF9fbm9kZV9iYXNlX3BvaW50ZXIsCisgICAgICBfX25vZGVfcG9pbnRlcj46OnR5cGUgICBfX25leHRfcG9pbnRlcjsKKyNlbmRpZgorCisgICAgX19uZXh0X3BvaW50ZXIgICAgX19uZXh0XzsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX25leHRfcG9pbnRlciBfX3B0cigpIF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxfX25leHRfcG9pbnRlcj4oCisgICAgICAgICAgICBwb2ludGVyX3RyYWl0czxfX25vZGVfYmFzZV9wb2ludGVyPjo6cG9pbnRlcl90bygqdGhpcykpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX25vZGVfcG9pbnRlciBfX3VwY2FzdCgpIF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oCisgICAgICAgICAgICBwb2ludGVyX3RyYWl0czxfX25vZGVfYmFzZV9wb2ludGVyPjo6cG9pbnRlcl90bygqdGhpcykpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3QgX19oYXNoKCkgY29uc3QgX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9fbm9kZV90eXBlIGNvbnN0Jj4oKnRoaXMpLl9faGFzaF87CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX2hhc2hfbm9kZV9iYXNlKCkgX05PRVhDRVBUIDogX19uZXh0XyhudWxscHRyKSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1ZvaWRQdHI+CitzdHJ1Y3QgX19oYXNoX25vZGUKKyAgICA6IHB1YmxpYyBfX2hhc2hfbm9kZV9iYXNlCisgICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX3JlYmluZF9wb2ludGVyPF9Wb2lkUHRyLCBfX2hhc2hfbm9kZTxfVHAsIF9Wb2lkUHRyPiA+Ojp0eXBlCisgICAgICAgICAgICAgPgoreworICAgIHR5cGVkZWYgX1RwIF9fbm9kZV92YWx1ZV90eXBlOworCisgICAgc2l6ZV90ICAgICAgICAgICAgX19oYXNoXzsKKyAgICBfX25vZGVfdmFsdWVfdHlwZSBfX3ZhbHVlXzsKK307CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitfX2lzX2hhc2hfcG93ZXIyKHNpemVfdCBfX2JjKQoreworICAgIHJldHVybiBfX2JjID4gMiAmJiAhKF9fYmMgJiAoX19iYyAtIDEpKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3NpemVfdAorX19jb25zdHJhaW5faGFzaChzaXplX3QgX19oLCBzaXplX3QgX19iYykKK3sKKyAgICByZXR1cm4gIShfX2JjICYgKF9fYmMgLSAxKSkgPyBfX2ggJiAoX19iYyAtIDEpIDoKKyAgICAgICAgKF9faCA8IF9fYmMgPyBfX2ggOiBfX2ggJSBfX2JjKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3NpemVfdAorX19uZXh0X2hhc2hfcG93MihzaXplX3QgX19uKQoreworICAgIHJldHVybiBfX24gPCAyID8gX19uIDogKHNpemVfdCgxKSA8PCAoc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjpkaWdpdHMgLSBfX2NseihfX24tMSkpKTsKK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+IGNsYXNzIF9faGFzaF90YWJsZTsKKwordGVtcGxhdGUgPGNsYXNzIF9Ob2RlUHRyPiAgICAgIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9faGFzaF9pdGVyYXRvcjsKK3RlbXBsYXRlIDxjbGFzcyBfQ29uc3ROb2RlUHRyPiBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2hhc2hfY29uc3RfaXRlcmF0b3I7Cit0ZW1wbGF0ZSA8Y2xhc3MgX05vZGVQdHI+ICAgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19oYXNoX2xvY2FsX2l0ZXJhdG9yOwordGVtcGxhdGUgPGNsYXNzIF9Db25zdE5vZGVQdHI+IGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9faGFzaF9jb25zdF9sb2NhbF9pdGVyYXRvcjsKK3RlbXBsYXRlIDxjbGFzcyBfSGFzaEl0ZXJhdG9yPiBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2hhc2hfbWFwX2l0ZXJhdG9yOwordGVtcGxhdGUgPGNsYXNzIF9IYXNoSXRlcmF0b3I+IGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9faGFzaF9tYXBfY29uc3RfaXRlcmF0b3I7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19oYXNoX2tleV92YWx1ZV90eXBlcyB7CisgIHN0YXRpY19hc3NlcnQoIWlzX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZSAmJiAhaXNfY29uc3Q8X1RwPjo6dmFsdWUsICIiKTsKKyAgdHlwZWRlZiBfVHAga2V5X3R5cGU7CisgIHR5cGVkZWYgX1RwIF9fbm9kZV92YWx1ZV90eXBlOworICB0eXBlZGVmIF9UcCBfX2NvbnRhaW5lcl92YWx1ZV90eXBlOworICBzdGF0aWMgY29uc3QgYm9vbCBfX2lzX21hcCA9IGZhbHNlOworCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgc3RhdGljIGtleV90eXBlIGNvbnN0JiBfX2dldF9rZXkoX1RwIGNvbnN0JiBfX3YpIHsKKyAgICByZXR1cm4gX192OworICB9CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgc3RhdGljIF9fY29udGFpbmVyX3ZhbHVlX3R5cGUgY29uc3QmIF9fZ2V0X3ZhbHVlKF9fbm9kZV92YWx1ZV90eXBlIGNvbnN0JiBfX3YpIHsKKyAgICByZXR1cm4gX192OworICB9CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgc3RhdGljIF9fY29udGFpbmVyX3ZhbHVlX3R5cGUqIF9fZ2V0X3B0cihfX25vZGVfdmFsdWVfdHlwZSYgX19uKSB7CisgICAgcmV0dXJuIF9WU1REOjphZGRyZXNzb2YoX19uKTsKKyAgfQorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgIF9fY29udGFpbmVyX3ZhbHVlX3R5cGUmJiBfX21vdmUoX19ub2RlX3ZhbHVlX3R5cGUmIF9fdikgeworICAgIHJldHVybiBfVlNURDo6bW92ZShfX3YpOworICB9CisjZW5kaWYKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHA+CitzdHJ1Y3QgX19oYXNoX2tleV92YWx1ZV90eXBlczxfX2hhc2hfdmFsdWVfdHlwZTxfS2V5LCBfVHA+ID4geworICB0eXBlZGVmIF9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZF90eXBlOworICB0eXBlZGVmIF9faGFzaF92YWx1ZV90eXBlPF9LZXksIF9UcD4gICAgICAgICAgICAgICAgIF9fbm9kZV92YWx1ZV90eXBlOworICB0eXBlZGVmIHBhaXI8Y29uc3QgX0tleSwgX1RwPiAgICAgICAgICAgICAgICAgICAgICAgIF9fY29udGFpbmVyX3ZhbHVlX3R5cGU7CisgIHR5cGVkZWYgcGFpcjxfS2V5LCBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uY192YWx1ZV90eXBlOworICB0eXBlZGVmIF9fY29udGFpbmVyX3ZhbHVlX3R5cGUgICAgICAgICAgICAgICAgICAgICAgIF9fbWFwX3ZhbHVlX3R5cGU7CisgIHN0YXRpYyBjb25zdCBib29sIF9faXNfbWFwID0gdHJ1ZTsKKworICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHN0YXRpYyBrZXlfdHlwZSBjb25zdCYgX19nZXRfa2V5KF9fY29udGFpbmVyX3ZhbHVlX3R5cGUgY29uc3QmIF9fdikgeworICAgIHJldHVybiBfX3YuZmlyc3Q7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPgorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHN0YXRpYyB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19zYW1lX3VuY3ZyZWY8X1VwLCBfX25vZGVfdmFsdWVfdHlwZT46OnZhbHVlLAorICAgICAgX19jb250YWluZXJfdmFsdWVfdHlwZSBjb25zdCY+Ojp0eXBlCisgIF9fZ2V0X3ZhbHVlKF9VcCYgX190KSB7CisgICAgcmV0dXJuIF9fdC5fX2NjOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfc2FtZV91bmN2cmVmPF9VcCwgX19jb250YWluZXJfdmFsdWVfdHlwZT46OnZhbHVlLAorICAgICAgX19jb250YWluZXJfdmFsdWVfdHlwZSBjb25zdCY+Ojp0eXBlCisgIF9fZ2V0X3ZhbHVlKF9VcCYgX190KSB7CisgICAgcmV0dXJuIF9fdDsKKyAgfQorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgc3RhdGljIF9fY29udGFpbmVyX3ZhbHVlX3R5cGUqIF9fZ2V0X3B0cihfX25vZGVfdmFsdWVfdHlwZSYgX19uKSB7CisgICAgcmV0dXJuIF9WU1REOjphZGRyZXNzb2YoX19uLl9fY2MpOworICB9CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHN0YXRpYyBfX25jX3ZhbHVlX3R5cGUmJiBfX21vdmUoX19ub2RlX3ZhbHVlX3R5cGUmIF9fdikgeworICAgIHJldHVybiBfVlNURDo6bW92ZShfX3YuX19uYyk7CisgIH0KKyNlbmRpZgorCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NQdHIsIGNsYXNzIF9LVlR5cGVzID0gX19oYXNoX2tleV92YWx1ZV90eXBlczxfVHA+LAorICAgICAgICAgIGJvb2wgPSBfS1ZUeXBlczo6X19pc19tYXA+CitzdHJ1Y3QgX19oYXNoX21hcF9wb2ludGVyX3R5cGVzIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NQdHIsIGNsYXNzIF9LVlR5cGVzPgorc3RydWN0IF9faGFzaF9tYXBfcG9pbnRlcl90eXBlczxfVHAsIF9BbGxvY1B0ciwgX0tWVHlwZXMsIHRydWU+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfS1ZUeXBlczo6X19tYXBfdmFsdWVfdHlwZSAgIF9NdjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9wb2ludGVyPF9BbGxvY1B0ciwgX012Pjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWFwX3ZhbHVlX3R5cGVfcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9wb2ludGVyPF9BbGxvY1B0ciwgY29uc3QgX012Pjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29uc3RfbWFwX3ZhbHVlX3R5cGVfcG9pbnRlcjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfTm9kZVB0ciwgY2xhc3MgX05vZGVUID0gdHlwZW5hbWUgcG9pbnRlcl90cmFpdHM8X05vZGVQdHI+OjplbGVtZW50X3R5cGU+CitzdHJ1Y3QgX19oYXNoX25vZGVfdHlwZXM7CisKK3RlbXBsYXRlIDxjbGFzcyBfTm9kZVB0ciwgY2xhc3MgX1RwLCBjbGFzcyBfVm9pZFB0cj4KK3N0cnVjdCBfX2hhc2hfbm9kZV90eXBlczxfTm9kZVB0ciwgX19oYXNoX25vZGU8X1RwLCBfVm9pZFB0cj4gPgorICAgIDogcHVibGljIF9faGFzaF9rZXlfdmFsdWVfdHlwZXM8X1RwPiwgX19oYXNoX21hcF9wb2ludGVyX3R5cGVzPF9UcCwgX1ZvaWRQdHI+CisKK3sKKyAgdHlwZWRlZiBfX2hhc2hfa2V5X3ZhbHVlX3R5cGVzPF9UcD4gICAgICAgICAgIF9fYmFzZTsKKworcHVibGljOgorICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3BvaW50ZXI8X05vZGVQdHIsIHZvaWQ+Ojp0eXBlICAgICAgIF9fdm9pZF9wb2ludGVyOworCisgIHR5cGVkZWYgdHlwZW5hbWUgcG9pbnRlcl90cmFpdHM8X05vZGVQdHI+OjplbGVtZW50X3R5cGUgICAgICAgX19ub2RlX3R5cGU7CisgIHR5cGVkZWYgX05vZGVQdHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlX3BvaW50ZXI7CisKKyAgdHlwZWRlZiBfX2hhc2hfbm9kZV9iYXNlPF9fbm9kZV9wb2ludGVyPiAgICAgICAgICAgICAgICAgICAgICBfX25vZGVfYmFzZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3BvaW50ZXI8X05vZGVQdHIsIF9fbm9kZV9iYXNlX3R5cGU+Ojp0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlX2Jhc2VfcG9pbnRlcjsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9fbm9kZV9iYXNlX3R5cGU6Ol9fbmV4dF9wb2ludGVyICAgICAgICAgIF9fbmV4dF9wb2ludGVyOworCisgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbm9kZV92YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3BvaW50ZXI8X1ZvaWRQdHIsIF9fbm9kZV92YWx1ZV90eXBlPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlX3ZhbHVlX3R5cGVfcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9wb2ludGVyPF9Wb2lkUHRyLCBjb25zdCBfX25vZGVfdmFsdWVfdHlwZT46OnR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29uc3Rfbm9kZV92YWx1ZV90eXBlX3BvaW50ZXI7CisKK3ByaXZhdGU6CisgICAgc3RhdGljX2Fzc2VydCghaXNfY29uc3Q8X19ub2RlX3R5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiX05vZGVQdHIgc2hvdWxkIG5ldmVyIGJlIGEgcG9pbnRlciB0byBjb25zdCIpOworICAgIHN0YXRpY19hc3NlcnQoKGlzX3NhbWU8dHlwZW5hbWUgcG9pbnRlcl90cmFpdHM8X1ZvaWRQdHI+OjplbGVtZW50X3R5cGUsIHZvaWQ+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAiX1ZvaWRQdHIgZG9lcyBub3QgcG9pbnQgdG8gdW5xdWFsaWZpZWQgdm9pZCB0eXBlIik7CisgICAgc3RhdGljX2Fzc2VydCgoaXNfc2FtZTx0eXBlbmFtZSBfX3JlYmluZF9wb2ludGVyPF9Wb2lkUHRyLCBfX25vZGVfdHlwZT46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9Ob2RlUHRyPjo6dmFsdWUpLCAiX1ZvaWRQdHIgZG9lcyBub3QgcmViaW5kIHRvIF9Ob2RlUHRyLiIpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9IYXNoSXRlcmF0b3I+CitzdHJ1Y3QgX19oYXNoX25vZGVfdHlwZXNfZnJvbV9pdGVyYXRvcjsKK3RlbXBsYXRlIDxjbGFzcyBfTm9kZVB0cj4KK3N0cnVjdCBfX2hhc2hfbm9kZV90eXBlc19mcm9tX2l0ZXJhdG9yPF9faGFzaF9pdGVyYXRvcjxfTm9kZVB0cj4gPiA6IF9faGFzaF9ub2RlX3R5cGVzPF9Ob2RlUHRyPiB7fTsKK3RlbXBsYXRlIDxjbGFzcyBfTm9kZVB0cj4KK3N0cnVjdCBfX2hhc2hfbm9kZV90eXBlc19mcm9tX2l0ZXJhdG9yPF9faGFzaF9jb25zdF9pdGVyYXRvcjxfTm9kZVB0cj4gPiA6IF9faGFzaF9ub2RlX3R5cGVzPF9Ob2RlUHRyPiB7fTsKK3RlbXBsYXRlIDxjbGFzcyBfTm9kZVB0cj4KK3N0cnVjdCBfX2hhc2hfbm9kZV90eXBlc19mcm9tX2l0ZXJhdG9yPF9faGFzaF9sb2NhbF9pdGVyYXRvcjxfTm9kZVB0cj4gPiA6IF9faGFzaF9ub2RlX3R5cGVzPF9Ob2RlUHRyPiB7fTsKK3RlbXBsYXRlIDxjbGFzcyBfTm9kZVB0cj4KK3N0cnVjdCBfX2hhc2hfbm9kZV90eXBlc19mcm9tX2l0ZXJhdG9yPF9faGFzaF9jb25zdF9sb2NhbF9pdGVyYXRvcjxfTm9kZVB0cj4gPiA6IF9faGFzaF9ub2RlX3R5cGVzPF9Ob2RlUHRyPiB7fTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX05vZGVWYWx1ZVRwLCBjbGFzcyBfVm9pZFB0cj4KK3N0cnVjdCBfX21ha2VfaGFzaF9ub2RlX3R5cGVzIHsKKyAgdHlwZWRlZiBfX2hhc2hfbm9kZTxfTm9kZVZhbHVlVHAsIF9Wb2lkUHRyPiBfTm9kZVRwOworICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3BvaW50ZXI8X1ZvaWRQdHIsIF9Ob2RlVHA+Ojp0eXBlIF9Ob2RlUHRyOworICB0eXBlZGVmIF9faGFzaF9ub2RlX3R5cGVzPF9Ob2RlUHRyPiB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Ob2RlUHRyPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19oYXNoX2l0ZXJhdG9yCit7CisgICAgdHlwZWRlZiBfX2hhc2hfbm9kZV90eXBlczxfTm9kZVB0cj4gX05vZGVUeXBlczsKKyAgICB0eXBlZGVmIF9Ob2RlUHRyICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbm9kZV9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X19uZXh0X3BvaW50ZXIgX19uZXh0X3BvaW50ZXI7CisKKyAgICBfX25leHRfcG9pbnRlciAgICAgICAgICAgIF9fbm9kZV87CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjpfX25vZGVfdmFsdWVfdHlwZSAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X19ub2RlX3ZhbHVlX3R5cGVfcG9pbnRlciBwb2ludGVyOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX2hhc2hfaXRlcmF0b3IoKSBfTk9FWENFUFQgOiBfX25vZGVfKG51bGxwdHIpIHsKKyAgICAgICAgX0xJQkNQUF9ERUJVR19NT0RFKF9fZ2V0X2RiKCktPl9faW5zZXJ0X2kodGhpcykpOworICAgIH0KKworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2hhc2hfaXRlcmF0b3IoY29uc3QgX19oYXNoX2l0ZXJhdG9yJiBfX2kpCisgICAgICAgIDogX19ub2RlXyhfX2kuX19ub2RlXykKKyAgICB7CisgICAgICAgIF9fZ2V0X2RiKCktPl9faXRlcmF0b3JfY29weSh0aGlzLCAmX19pKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgfl9faGFzaF9pdGVyYXRvcigpCisgICAgeworICAgICAgICBfX2dldF9kYigpLT5fX2VyYXNlX2kodGhpcyk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faGFzaF9pdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IF9faGFzaF9pdGVyYXRvciYgX19pKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMgIT0gJl9faSkKKyAgICAgICAgeworICAgICAgICAgICAgX19nZXRfZGIoKS0+X19pdGVyYXRvcl9jb3B5KHRoaXMsICZfX2kpOworICAgICAgICAgICAgX19ub2RlXyA9IF9faS5fX25vZGVfOworICAgICAgICB9CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgICAgIF9MSUJDUFBfREVCVUdfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZGVyZWZlcmVuY2VhYmxlKHRoaXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIGRlcmVmZXJlbmNlIGEgbm9uLWRlcmVmZXJlbmNlYWJsZSB1bm9yZGVyZWQgY29udGFpbmVyIGl0ZXJhdG9yIik7CisgICAgICAgIHJldHVybiBfX25vZGVfLT5fX3VwY2FzdCgpLT5fX3ZhbHVlXzsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeworICAgICAgICBfTElCQ1BQX0RFQlVHX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2RlcmVmZXJlbmNlYWJsZSh0aGlzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0ZWQgdG8gZGVyZWZlcmVuY2UgYSBub24tZGVyZWZlcmVuY2VhYmxlIHVub3JkZXJlZCBjb250YWluZXIgaXRlcmF0b3IiKTsKKyAgICAgICAgcmV0dXJuIHBvaW50ZXJfdHJhaXRzPHBvaW50ZXI+Ojpwb2ludGVyX3RvKF9fbm9kZV8tPl9fdXBjYXN0KCktPl9fdmFsdWVfKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeworICAgICAgICBfTElCQ1BQX0RFQlVHX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2RlcmVmZXJlbmNlYWJsZSh0aGlzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCB0byBpbmNyZW1lbnQgbm9uLWluY3JlbWVudGFibGUgdW5vcmRlcmVkIGNvbnRhaW5lciBpdGVyYXRvciIpOworICAgICAgICBfX25vZGVfID0gX19ub2RlXy0+X19uZXh0XzsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2hhc2hfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpCisgICAgeworICAgICAgICBfX2hhc2hfaXRlcmF0b3IgX190KCp0aGlzKTsKKyAgICAgICAgKysoKnRoaXMpOworICAgICAgICByZXR1cm4gX190OworICAgIH0KKworICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9faGFzaF9pdGVyYXRvciYgX194LCBjb25zdCBfX2hhc2hfaXRlcmF0b3ImIF9feSkKKyAgICB7CisgICAgICAgIHJldHVybiBfX3guX19ub2RlXyA9PSBfX3kuX19ub2RlXzsKKyAgICB9CisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgX19oYXNoX2l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9faGFzaF9pdGVyYXRvciYgX195KQorICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorCitwcml2YXRlOgorI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2hhc2hfaXRlcmF0b3IoX19uZXh0X3BvaW50ZXIgX19ub2RlLCBjb25zdCB2b2lkKiBfX2MpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fbm9kZV8oX19ub2RlKQorICAgICAgICB7CisgICAgICAgICAgICBfX2dldF9kYigpLT5fX2luc2VydF9pYyh0aGlzLCBfX2MpOworICAgICAgICB9CisjZWxzZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2hhc2hfaXRlcmF0b3IoX19uZXh0X3BvaW50ZXIgX19ub2RlKSBfTk9FWENFUFQKKyAgICAgICAgOiBfX25vZGVfKF9fbm9kZSkKKyAgICAgICAge30KKyNlbmRpZgorICAgIHRlbXBsYXRlIDxjbGFzcywgY2xhc3MsIGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9faGFzaF90YWJsZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3M+IGZyaWVuZCBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2hhc2hfY29uc3RfaXRlcmF0b3I7CisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19oYXNoX21hcF9pdGVyYXRvcjsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdW5vcmRlcmVkX21hcDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdW5vcmRlcmVkX211bHRpbWFwOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Ob2RlUHRyPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19oYXNoX2NvbnN0X2l0ZXJhdG9yCit7CisgICAgc3RhdGljX2Fzc2VydCghaXNfY29uc3Q8dHlwZW5hbWUgcG9pbnRlcl90cmFpdHM8X05vZGVQdHI+OjplbGVtZW50X3R5cGU+Ojp2YWx1ZSwgIiIpOworICAgIHR5cGVkZWYgX19oYXNoX25vZGVfdHlwZXM8X05vZGVQdHI+IF9Ob2RlVHlwZXM7CisgICAgdHlwZWRlZiBfTm9kZVB0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25vZGVfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6Ol9fbmV4dF9wb2ludGVyIF9fbmV4dF9wb2ludGVyOworCisgICAgX19uZXh0X3BvaW50ZXIgX19ub2RlXzsKKworcHVibGljOgorICAgIHR5cGVkZWYgX19oYXNoX2l0ZXJhdG9yPF9Ob2RlUHRyPiBfX25vbl9jb25zdF9pdGVyYXRvcjsKKworICAgIHR5cGVkZWYgZm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6Ol9fbm9kZV92YWx1ZV90eXBlICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6OmRpZmZlcmVuY2VfdHlwZSAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjpfX2NvbnN0X25vZGVfdmFsdWVfdHlwZV9wb2ludGVyIHBvaW50ZXI7CisKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX19oYXNoX2NvbnN0X2l0ZXJhdG9yKCkgX05PRVhDRVBUIDogX19ub2RlXyhudWxscHRyKSB7CisgICAgICAgIF9MSUJDUFBfREVCVUdfTU9ERShfX2dldF9kYigpLT5fX2luc2VydF9pKHRoaXMpKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIAorICAgIF9faGFzaF9jb25zdF9pdGVyYXRvcihjb25zdCBfX25vbl9jb25zdF9pdGVyYXRvciYgX194KSBfTk9FWENFUFQKKyAgICAgICAgOiBfX25vZGVfKF9feC5fX25vZGVfKQorICAgIHsKKyAgICAgICAgX0xJQkNQUF9ERUJVR19NT0RFKF9fZ2V0X2RiKCktPl9faXRlcmF0b3JfY29weSh0aGlzLCAmX194KSk7CisgICAgfQorCisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faGFzaF9jb25zdF9pdGVyYXRvcihjb25zdCBfX2hhc2hfY29uc3RfaXRlcmF0b3ImIF9faSkKKyAgICAgICAgOiBfX25vZGVfKF9faS5fX25vZGVfKQorICAgIHsKKyAgICAgICAgX19nZXRfZGIoKS0+X19pdGVyYXRvcl9jb3B5KHRoaXMsICZfX2kpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB+X19oYXNoX2NvbnN0X2l0ZXJhdG9yKCkKKyAgICB7CisgICAgICAgIF9fZ2V0X2RiKCktPl9fZXJhc2VfaSh0aGlzKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX2NvbnN0X2l0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgX19oYXNoX2NvbnN0X2l0ZXJhdG9yJiBfX2kpCisgICAgeworICAgICAgICBpZiAodGhpcyAhPSAmX19pKQorICAgICAgICB7CisgICAgICAgICAgICBfX2dldF9kYigpLT5fX2l0ZXJhdG9yX2NvcHkodGhpcywgJl9faSk7CisgICAgICAgICAgICBfX25vZGVfID0gX19pLl9fbm9kZV87CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgICAgX0xJQkNQUF9ERUJVR19BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19kZXJlZmVyZW5jZWFibGUodGhpcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIGRlcmVmZXJlbmNlIGEgbm9uLWRlcmVmZXJlbmNlYWJsZSB1bm9yZGVyZWQgY29udGFpbmVyIGNvbnN0X2l0ZXJhdG9yIik7CisgICAgICAgIHJldHVybiBfX25vZGVfLT5fX3VwY2FzdCgpLT5fX3ZhbHVlXzsKKyAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICAgICAgX0xJQkNQUF9ERUJVR19BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19kZXJlZmVyZW5jZWFibGUodGhpcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIGRlcmVmZXJlbmNlIGEgbm9uLWRlcmVmZXJlbmNlYWJsZSB1bm9yZGVyZWQgY29udGFpbmVyIGNvbnN0X2l0ZXJhdG9yIik7CisgICAgICAgIHJldHVybiBwb2ludGVyX3RyYWl0czxwb2ludGVyPjo6cG9pbnRlcl90byhfX25vZGVfLT5fX3VwY2FzdCgpLT5fX3ZhbHVlXyk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faGFzaF9jb25zdF9pdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKKyAgICAgICAgX0xJQkNQUF9ERUJVR19BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19kZXJlZmVyZW5jZWFibGUodGhpcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0ZWQgdG8gaW5jcmVtZW50IG5vbi1pbmNyZW1lbnRhYmxlIHVub3JkZXJlZCBjb250YWluZXIgY29uc3RfaXRlcmF0b3IiKTsKKyAgICAgICAgX19ub2RlXyA9IF9fbm9kZV8tPl9fbmV4dF87CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX2NvbnN0X2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KQorICAgIHsKKyAgICAgICAgX19oYXNoX2NvbnN0X2l0ZXJhdG9yIF9fdCgqdGhpcyk7CisgICAgICAgICsrKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuIF9fdDsKKyAgICB9CisKKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfX2hhc2hfY29uc3RfaXRlcmF0b3ImIF9feCwgY29uc3QgX19oYXNoX2NvbnN0X2l0ZXJhdG9yJiBfX3kpCisgICAgeworICAgICAgICByZXR1cm4gX194Ll9fbm9kZV8gPT0gX195Ll9fbm9kZV87CisgICAgfQorICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF9faGFzaF9jb25zdF9pdGVyYXRvciYgX194LCBjb25zdCBfX2hhc2hfY29uc3RfaXRlcmF0b3ImIF9feSkKKyAgICAgICAge3JldHVybiAhKF9feCA9PSBfX3kpO30KKworcHJpdmF0ZToKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX2NvbnN0X2l0ZXJhdG9yKF9fbmV4dF9wb2ludGVyIF9fbm9kZSwgY29uc3Qgdm9pZCogX19jKSBfTk9FWENFUFQKKyAgICAgICAgOiBfX25vZGVfKF9fbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfaWModGhpcywgX19jKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX2NvbnN0X2l0ZXJhdG9yKF9fbmV4dF9wb2ludGVyIF9fbm9kZSkgX05PRVhDRVBUCisgICAgICAgIDogX19ub2RlXyhfX25vZGUpCisgICAgICAgIHt9CisjZW5kaWYKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcywgY2xhc3M+IGZyaWVuZCBjbGFzcyBfX2hhc2hfdGFibGU7CisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19oYXNoX21hcF9jb25zdF9pdGVyYXRvcjsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdW5vcmRlcmVkX21hcDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdW5vcmRlcmVkX211bHRpbWFwOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Ob2RlUHRyPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19oYXNoX2xvY2FsX2l0ZXJhdG9yCit7CisgICAgdHlwZWRlZiBfX2hhc2hfbm9kZV90eXBlczxfTm9kZVB0cj4gX05vZGVUeXBlczsKKyAgICB0eXBlZGVmIF9Ob2RlUHRyICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbm9kZV9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X19uZXh0X3BvaW50ZXIgX19uZXh0X3BvaW50ZXI7CisKKyAgICBfX25leHRfcG9pbnRlciAgICAgICAgIF9fbm9kZV87CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICBfX2J1Y2tldF87CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICBfX2J1Y2tldF9jb3VudF87CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6Ol9fbm9kZV92YWx1ZV90eXBlICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6ZGlmZmVyZW5jZV90eXBlICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjpfX25vZGVfdmFsdWVfdHlwZV9wb2ludGVyICAgICAgcG9pbnRlcjsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX19oYXNoX2xvY2FsX2l0ZXJhdG9yKCkgX05PRVhDRVBUIDogX19ub2RlXyhudWxscHRyKSB7CisgICAgICAgIF9MSUJDUFBfREVCVUdfTU9ERShfX2dldF9kYigpLT5fX2luc2VydF9pKHRoaXMpKTsKKyAgICB9CisKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX2xvY2FsX2l0ZXJhdG9yKGNvbnN0IF9faGFzaF9sb2NhbF9pdGVyYXRvciYgX19pKQorICAgICAgICA6IF9fbm9kZV8oX19pLl9fbm9kZV8pLAorICAgICAgICAgIF9fYnVja2V0XyhfX2kuX19idWNrZXRfKSwKKyAgICAgICAgICBfX2J1Y2tldF9jb3VudF8oX19pLl9fYnVja2V0X2NvdW50XykKKyAgICB7CisgICAgICAgIF9fZ2V0X2RiKCktPl9faXRlcmF0b3JfY29weSh0aGlzLCAmX19pKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgfl9faGFzaF9sb2NhbF9pdGVyYXRvcigpCisgICAgeworICAgICAgICBfX2dldF9kYigpLT5fX2VyYXNlX2kodGhpcyk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faGFzaF9sb2NhbF9pdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IF9faGFzaF9sb2NhbF9pdGVyYXRvciYgX19pKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMgIT0gJl9faSkKKyAgICAgICAgeworICAgICAgICAgICAgX19nZXRfZGIoKS0+X19pdGVyYXRvcl9jb3B5KHRoaXMsICZfX2kpOworICAgICAgICAgICAgX19ub2RlXyA9IF9faS5fX25vZGVfOworICAgICAgICAgICAgX19idWNrZXRfID0gX19pLl9fYnVja2V0XzsKKyAgICAgICAgICAgIF9fYnVja2V0X2NvdW50XyA9IF9faS5fX2J1Y2tldF9jb3VudF87CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgICAgX0xJQkNQUF9ERUJVR19BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19kZXJlZmVyZW5jZWFibGUodGhpcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIGRlcmVmZXJlbmNlIGEgbm9uLWRlcmVmZXJlbmNlYWJsZSB1bm9yZGVyZWQgY29udGFpbmVyIGxvY2FsX2l0ZXJhdG9yIik7CisgICAgICAgIHJldHVybiBfX25vZGVfLT5fX3VwY2FzdCgpLT5fX3ZhbHVlXzsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeworICAgICAgICBfTElCQ1BQX0RFQlVHX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2RlcmVmZXJlbmNlYWJsZSh0aGlzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCB0byBkZXJlZmVyZW5jZSBhIG5vbi1kZXJlZmVyZW5jZWFibGUgdW5vcmRlcmVkIGNvbnRhaW5lciBsb2NhbF9pdGVyYXRvciIpOworICAgICAgICByZXR1cm4gcG9pbnRlcl90cmFpdHM8cG9pbnRlcj46OnBvaW50ZXJfdG8oX19ub2RlXy0+X191cGNhc3QoKS0+X192YWx1ZV8pOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2hhc2hfbG9jYWxfaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgICAgIF9MSUJDUFBfREVCVUdfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZGVyZWZlcmVuY2VhYmxlKHRoaXMpLAorICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIGluY3JlbWVudCBub24taW5jcmVtZW50YWJsZSB1bm9yZGVyZWQgY29udGFpbmVyIGxvY2FsX2l0ZXJhdG9yIik7CisgICAgICAgIF9fbm9kZV8gPSBfX25vZGVfLT5fX25leHRfOworICAgICAgICBpZiAoX19ub2RlXyAhPSBudWxscHRyICYmIF9fY29uc3RyYWluX2hhc2goX19ub2RlXy0+X19oYXNoKCksIF9fYnVja2V0X2NvdW50XykgIT0gX19idWNrZXRfKQorICAgICAgICAgICAgX19ub2RlXyA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX2xvY2FsX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KQorICAgIHsKKyAgICAgICAgX19oYXNoX2xvY2FsX2l0ZXJhdG9yIF9fdCgqdGhpcyk7CisgICAgICAgICsrKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuIF9fdDsKKyAgICB9CisKKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfX2hhc2hfbG9jYWxfaXRlcmF0b3ImIF9feCwgY29uc3QgX19oYXNoX2xvY2FsX2l0ZXJhdG9yJiBfX3kpCisgICAgeworICAgICAgICByZXR1cm4gX194Ll9fbm9kZV8gPT0gX195Ll9fbm9kZV87CisgICAgfQorICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF9faGFzaF9sb2NhbF9pdGVyYXRvciYgX194LCBjb25zdCBfX2hhc2hfbG9jYWxfaXRlcmF0b3ImIF9feSkKKyAgICAgICAge3JldHVybiAhKF9feCA9PSBfX3kpO30KKworcHJpdmF0ZToKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX2xvY2FsX2l0ZXJhdG9yKF9fbmV4dF9wb2ludGVyIF9fbm9kZSwgc2l6ZV90IF9fYnVja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19idWNrZXRfY291bnQsIGNvbnN0IHZvaWQqIF9fYykgX05PRVhDRVBUCisgICAgICAgIDogX19ub2RlXyhfX25vZGUpLAorICAgICAgICAgIF9fYnVja2V0XyhfX2J1Y2tldCksCisgICAgICAgICAgX19idWNrZXRfY291bnRfKF9fYnVja2V0X2NvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBfX2dldF9kYigpLT5fX2luc2VydF9pYyh0aGlzLCBfX2MpOworICAgICAgICAgICAgaWYgKF9fbm9kZV8gIT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICBfX25vZGVfID0gX19ub2RlXy0+X19uZXh0XzsKKyAgICAgICAgfQorI2Vsc2UKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX2xvY2FsX2l0ZXJhdG9yKF9fbmV4dF9wb2ludGVyIF9fbm9kZSwgc2l6ZV90IF9fYnVja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19idWNrZXRfY291bnQpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fbm9kZV8oX19ub2RlKSwKKyAgICAgICAgICBfX2J1Y2tldF8oX19idWNrZXQpLAorICAgICAgICAgIF9fYnVja2V0X2NvdW50XyhfX2J1Y2tldF9jb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9fbm9kZV8gIT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICBfX25vZGVfID0gX19ub2RlXy0+X19uZXh0XzsKKyAgICAgICAgfQorI2VuZGlmCisgICAgdGVtcGxhdGUgPGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzPiBmcmllbmQgY2xhc3MgX19oYXNoX3RhYmxlOworICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9faGFzaF9jb25zdF9sb2NhbF9pdGVyYXRvcjsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3M+IGZyaWVuZCBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2hhc2hfbWFwX2l0ZXJhdG9yOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Db25zdE5vZGVQdHI+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2hhc2hfY29uc3RfbG9jYWxfaXRlcmF0b3IKK3sKKyAgICB0eXBlZGVmIF9faGFzaF9ub2RlX3R5cGVzPF9Db25zdE5vZGVQdHI+IF9Ob2RlVHlwZXM7CisgICAgdHlwZWRlZiBfQ29uc3ROb2RlUHRyICAgICAgICAgICAgICAgICAgICAgICBfX25vZGVfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6Ol9fbmV4dF9wb2ludGVyIF9fbmV4dF9wb2ludGVyOworCisgICAgX19uZXh0X3BvaW50ZXIgICAgICAgICBfX25vZGVfOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgX19idWNrZXRfOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgX19idWNrZXRfY291bnRfOworCisgICAgdHlwZWRlZiBwb2ludGVyX3RyYWl0czxfX25vZGVfcG9pbnRlcj4gICAgICAgICAgX19wb2ludGVyX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcG9pbnRlcl90cmFpdHM6OmVsZW1lbnRfdHlwZSBfX25vZGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY29uc3Q8X19ub2RlPjo6dHlwZSAgICAgX19ub25fY29uc3Rfbm9kZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3BvaW50ZXI8X19ub2RlX3BvaW50ZXIsIF9fbm9uX2NvbnN0X25vZGU+Ojp0eXBlCisgICAgICAgIF9fbm9uX2NvbnN0X25vZGVfcG9pbnRlcjsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9faGFzaF9sb2NhbF9pdGVyYXRvcjxfX25vbl9jb25zdF9ub2RlX3BvaW50ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub25fY29uc3RfaXRlcmF0b3I7CisKKyAgICB0eXBlZGVmIGZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjpfX25vZGVfdmFsdWVfdHlwZSAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X19jb25zdF9ub2RlX3ZhbHVlX3R5cGVfcG9pbnRlciBwb2ludGVyOworCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9faGFzaF9jb25zdF9sb2NhbF9pdGVyYXRvcigpIF9OT0VYQ0VQVCA6IF9fbm9kZV8obnVsbHB0cikgeworICAgICAgICBfTElCQ1BQX0RFQlVHX01PREUoX19nZXRfZGIoKS0+X19pbnNlcnRfaSh0aGlzKSk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faGFzaF9jb25zdF9sb2NhbF9pdGVyYXRvcihjb25zdCBfX25vbl9jb25zdF9pdGVyYXRvciYgX194KSBfTk9FWENFUFQKKyAgICAgICAgOiBfX25vZGVfKF9feC5fX25vZGVfKSwKKyAgICAgICAgICBfX2J1Y2tldF8oX194Ll9fYnVja2V0XyksCisgICAgICAgICAgX19idWNrZXRfY291bnRfKF9feC5fX2J1Y2tldF9jb3VudF8pCisgICAgeworICAgICAgICBfTElCQ1BQX0RFQlVHX01PREUoX19nZXRfZGIoKS0+X19pdGVyYXRvcl9jb3B5KHRoaXMsICZfX3gpKTsKKyAgICB9CisKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX2NvbnN0X2xvY2FsX2l0ZXJhdG9yKGNvbnN0IF9faGFzaF9jb25zdF9sb2NhbF9pdGVyYXRvciYgX19pKQorICAgICAgICA6IF9fbm9kZV8oX19pLl9fbm9kZV8pLAorICAgICAgICAgIF9fYnVja2V0XyhfX2kuX19idWNrZXRfKSwKKyAgICAgICAgICBfX2J1Y2tldF9jb3VudF8oX19pLl9fYnVja2V0X2NvdW50XykKKyAgICB7CisgICAgICAgIF9fZ2V0X2RiKCktPl9faXRlcmF0b3JfY29weSh0aGlzLCAmX19pKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgfl9faGFzaF9jb25zdF9sb2NhbF9pdGVyYXRvcigpCisgICAgeworICAgICAgICBfX2dldF9kYigpLT5fX2VyYXNlX2kodGhpcyk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faGFzaF9jb25zdF9sb2NhbF9pdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IF9faGFzaF9jb25zdF9sb2NhbF9pdGVyYXRvciYgX19pKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMgIT0gJl9faSkKKyAgICAgICAgeworICAgICAgICAgICAgX19nZXRfZGIoKS0+X19pdGVyYXRvcl9jb3B5KHRoaXMsICZfX2kpOworICAgICAgICAgICAgX19ub2RlXyA9IF9faS5fX25vZGVfOworICAgICAgICAgICAgX19idWNrZXRfID0gX19pLl9fYnVja2V0XzsKKyAgICAgICAgICAgIF9fYnVja2V0X2NvdW50XyA9IF9faS5fX2J1Y2tldF9jb3VudF87CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgICAgX0xJQkNQUF9ERUJVR19BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19kZXJlZmVyZW5jZWFibGUodGhpcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIGRlcmVmZXJlbmNlIGEgbm9uLWRlcmVmZXJlbmNlYWJsZSB1bm9yZGVyZWQgY29udGFpbmVyIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIik7CisgICAgICAgIHJldHVybiBfX25vZGVfLT5fX3VwY2FzdCgpLT5fX3ZhbHVlXzsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeworICAgICAgICBfTElCQ1BQX0RFQlVHX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2RlcmVmZXJlbmNlYWJsZSh0aGlzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0ZWQgdG8gZGVyZWZlcmVuY2UgYSBub24tZGVyZWZlcmVuY2VhYmxlIHVub3JkZXJlZCBjb250YWluZXIgY29uc3RfbG9jYWxfaXRlcmF0b3IiKTsKKyAgICAgICAgcmV0dXJuIHBvaW50ZXJfdHJhaXRzPHBvaW50ZXI+Ojpwb2ludGVyX3RvKF9fbm9kZV8tPl9fdXBjYXN0KCktPl9fdmFsdWVfKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX2NvbnN0X2xvY2FsX2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeworICAgICAgICBfTElCQ1BQX0RFQlVHX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2RlcmVmZXJlbmNlYWJsZSh0aGlzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCB0byBpbmNyZW1lbnQgbm9uLWluY3JlbWVudGFibGUgdW5vcmRlcmVkIGNvbnRhaW5lciBjb25zdF9sb2NhbF9pdGVyYXRvciIpOworICAgICAgICBfX25vZGVfID0gX19ub2RlXy0+X19uZXh0XzsKKyAgICAgICAgaWYgKF9fbm9kZV8gIT0gbnVsbHB0ciAmJiBfX2NvbnN0cmFpbl9oYXNoKF9fbm9kZV8tPl9faGFzaCgpLCBfX2J1Y2tldF9jb3VudF8pICE9IF9fYnVja2V0XykKKyAgICAgICAgICAgIF9fbm9kZV8gPSBudWxscHRyOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faGFzaF9jb25zdF9sb2NhbF9pdGVyYXRvciBvcGVyYXRvcisrKGludCkKKyAgICB7CisgICAgICAgIF9faGFzaF9jb25zdF9sb2NhbF9pdGVyYXRvciBfX3QoKnRoaXMpOworICAgICAgICArKygqdGhpcyk7CisgICAgICAgIHJldHVybiBfX3Q7CisgICAgfQorCisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgX19oYXNoX2NvbnN0X2xvY2FsX2l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9faGFzaF9jb25zdF9sb2NhbF9pdGVyYXRvciYgX195KQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9feC5fX25vZGVfID09IF9feS5fX25vZGVfOworICAgIH0KKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfX2hhc2hfY29uc3RfbG9jYWxfaXRlcmF0b3ImIF9feCwgY29uc3QgX19oYXNoX2NvbnN0X2xvY2FsX2l0ZXJhdG9yJiBfX3kpCisgICAgICAgIHtyZXR1cm4gIShfX3ggPT0gX195KTt9CisKK3ByaXZhdGU6CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faGFzaF9jb25zdF9sb2NhbF9pdGVyYXRvcihfX25leHRfcG9pbnRlciBfX25vZGUsIHNpemVfdCBfX2J1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fYnVja2V0X2NvdW50LCBjb25zdCB2b2lkKiBfX2MpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fbm9kZV8oX19ub2RlKSwKKyAgICAgICAgICBfX2J1Y2tldF8oX19idWNrZXQpLAorICAgICAgICAgIF9fYnVja2V0X2NvdW50XyhfX2J1Y2tldF9jb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfaWModGhpcywgX19jKTsKKyAgICAgICAgICAgIGlmIChfX25vZGVfICE9IG51bGxwdHIpCisgICAgICAgICAgICAgICAgX19ub2RlXyA9IF9fbm9kZV8tPl9fbmV4dF87CisgICAgICAgIH0KKyNlbHNlCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faGFzaF9jb25zdF9sb2NhbF9pdGVyYXRvcihfX25leHRfcG9pbnRlciBfX25vZGUsIHNpemVfdCBfX2J1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fYnVja2V0X2NvdW50KSBfTk9FWENFUFQKKyAgICAgICAgOiBfX25vZGVfKF9fbm9kZSksCisgICAgICAgICAgX19idWNrZXRfKF9fYnVja2V0KSwKKyAgICAgICAgICBfX2J1Y2tldF9jb3VudF8oX19idWNrZXRfY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX25vZGVfICE9IG51bGxwdHIpCisgICAgICAgICAgICAgICAgX19ub2RlXyA9IF9fbm9kZV8tPl9fbmV4dF87CisgICAgICAgIH0KKyNlbmRpZgorICAgIHRlbXBsYXRlIDxjbGFzcywgY2xhc3MsIGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9faGFzaF90YWJsZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3M+IGZyaWVuZCBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2hhc2hfbWFwX2NvbnN0X2l0ZXJhdG9yOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK2NsYXNzIF9fYnVja2V0X2xpc3RfZGVhbGxvY2F0b3IKK3sKKyAgICB0eXBlZGVmIF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT4gICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2FsbG9jX3RyYWl0czo6c2l6ZV90eXBlICAgICAgICAgICAgICBzaXplX3R5cGU7CisKKyAgICBfX2NvbXByZXNzZWRfcGFpcjxzaXplX3R5cGUsIGFsbG9jYXRvcl90eXBlPiBfX2RhdGFfOworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnBvaW50ZXIgcG9pbnRlcjsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2J1Y2tldF9saXN0X2RlYWxsb2NhdG9yKCkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKQorICAgICAgICA6IF9fZGF0YV8oMCkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2J1Y2tldF9saXN0X2RlYWxsb2NhdG9yKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EsIHNpemVfdHlwZSBfX3NpemUpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSkKKyAgICAgICAgOiBfX2RhdGFfKF9fc2l6ZSwgX19hKSB7fQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2J1Y2tldF9saXN0X2RlYWxsb2NhdG9yKF9fYnVja2V0X2xpc3RfZGVhbGxvY2F0b3ImJiBfX3gpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSkKKyAgICAgICAgOiBfX2RhdGFfKF9WU1REOjptb3ZlKF9feC5fX2RhdGFfKSkKKyAgICB7CisgICAgICAgIF9feC5zaXplKCkgPSAwOworICAgIH0KKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSYgc2l6ZSgpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fZGF0YV8uZmlyc3QoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSAgc2l6ZSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fZGF0YV8uZmlyc3QoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYWxsb2NhdG9yX3R5cGUmIF9fYWxsb2MoKSBfTk9FWENFUFQge3JldHVybiBfX2RhdGFfLnNlY29uZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYWxsb2MoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX2RhdGFfLnNlY29uZCgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIG9wZXJhdG9yKCkocG9pbnRlciBfX3ApIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hbGxvYygpLCBfX3AsIHNpemUoKSk7CisgICAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4gY2xhc3MgX19oYXNoX21hcF9ub2RlX2Rlc3RydWN0b3I7CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CitjbGFzcyBfX2hhc2hfbm9kZV9kZXN0cnVjdG9yCit7CisgICAgdHlwZWRlZiBfQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+ICAgICAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOworCitwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2FsbG9jX3RyYWl0czo6cG9pbnRlciAgICAgICAgICAgICAgICBwb2ludGVyOworcHJpdmF0ZToKKyAgICB0eXBlZGVmIF9faGFzaF9ub2RlX3R5cGVzPHBvaW50ZXI+IF9Ob2RlVHlwZXM7CisKKyAgICBhbGxvY2F0b3JfdHlwZSYgX19uYV87CisKKyAgICBfX2hhc2hfbm9kZV9kZXN0cnVjdG9yJiBvcGVyYXRvcj0oY29uc3QgX19oYXNoX25vZGVfZGVzdHJ1Y3RvciYpOworCitwdWJsaWM6CisgICAgYm9vbCBfX3ZhbHVlX2NvbnN0cnVjdGVkOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9faGFzaF9ub2RlX2Rlc3RydWN0b3IoYWxsb2NhdG9yX3R5cGUmIF9fbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9fY29uc3RydWN0ZWQgPSBmYWxzZSkgX05PRVhDRVBUCisgICAgICAgIDogX19uYV8oX19uYSksCisgICAgICAgICAgX192YWx1ZV9jb25zdHJ1Y3RlZChfX2NvbnN0cnVjdGVkKQorICAgICAgICB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgb3BlcmF0b3IoKShwb2ludGVyIF9fcCkgX05PRVhDRVBUCisgICAgeworICAgICAgICBpZiAoX192YWx1ZV9jb25zdHJ1Y3RlZCkKKyAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpkZXN0cm95KF9fbmFfLCBfTm9kZVR5cGVzOjpfX2dldF9wdHIoX19wLT5fX3ZhbHVlXykpOworICAgICAgICBpZiAoX19wKQorICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19uYV8sIF9fcCwgMSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgX19oYXNoX21hcF9ub2RlX2Rlc3RydWN0b3I7Cit9OworCisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9fZGlhZ25vc2VfaGFzaF90YWJsZV9oZWxwZXIgeworICBzdGF0aWMgY29uc3RleHByIGJvb2wgX190cmlnZ2VyX2RpYWdub3N0aWNzKCkKKyAgICBfTElCQ1BQX0RJQUdOT1NFX1dBUk5JTkcoX19jaGVja19oYXNoX3JlcXVpcmVtZW50czxfS2V5LCBfSGFzaD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIV9faW52b2thYmxlPF9IYXNoIGNvbnN0JiwgX0tleSBjb25zdCY+Ojp2YWx1ZSwKKyAgICAgICJ0aGUgc3BlY2lmaWVkIGhhc2ggZnVuY3RvciBkb2VzIG5vdCBwcm92aWRlIGEgY29uc3QgY2FsbCBvcGVyYXRvciIpCisgICAgX0xJQkNQUF9ESUFHTk9TRV9XQVJOSU5HKGlzX2NvcHlfY29uc3RydWN0aWJsZTxfRXF1YWw+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhX19pbnZva2FibGU8X0VxdWFsIGNvbnN0JiwgX0tleSBjb25zdCYsIF9LZXkgY29uc3QmPjo6dmFsdWUsCisgICAgICAidGhlIHNwZWNpZmllZCBjb21wYXJhdG9yIHR5cGUgZG9lcyBub3QgcHJvdmlkZSBhIGNvbnN0IGNhbGwgb3BlcmF0b3IiKQorICB7CisgICAgc3RhdGljX2Fzc2VydChfX2NoZWNrX2hhc2hfcmVxdWlyZW1lbnRzPF9LZXksIF9IYXNoPjo6dmFsdWUsCisgICAgICAidGhlIHNwZWNpZmllZCBoYXNoIGRvZXMgbm90IG1lZXQgdGhlIEhhc2ggcmVxdWlyZW1lbnRzIik7CisgICAgc3RhdGljX2Fzc2VydChpc19jb3B5X2NvbnN0cnVjdGlibGU8X0VxdWFsPjo6dmFsdWUsCisgICAgICAidGhlIHNwZWNpZmllZCBjb21wYXJhdG9yIGlzIHJlcXVpcmVkIHRvIGJlIGNvcHkgY29uc3RydWN0aWJsZSIpOworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19kaWFnbm9zZV9oYXNoX3RhYmxlX2hlbHBlcjwKKyAgX19oYXNoX3ZhbHVlX3R5cGU8X0tleSwgX1ZhbHVlPiwKKyAgX191bm9yZGVyZWRfbWFwX2hhc2hlcjxfS2V5LCBfX2hhc2hfdmFsdWVfdHlwZTxfS2V5LCBfVmFsdWU+LCBfSGFzaD4sCisgIF9fdW5vcmRlcmVkX21hcF9lcXVhbDxfS2V5LCBfX2hhc2hfdmFsdWVfdHlwZTxfS2V5LCBfVmFsdWU+LCBfRXF1YWw+LAorICBfQWxsb2M+Cis6IF9fZGlhZ25vc2VfaGFzaF90YWJsZV9oZWxwZXI8X0tleSwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPgoreworfTsKKyNlbmRpZiAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgorY2xhc3MgX19oYXNoX3RhYmxlCit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfVHAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9IYXNoICBoYXNoZXI7CisgICAgdHlwZWRlZiBfRXF1YWwga2V5X2VxdWFsOworICAgIHR5cGVkZWYgX0FsbG9jIGFsbG9jYXRvcl90eXBlOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT4gX19hbGxvY190cmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZQorICAgICAgX19tYWtlX2hhc2hfbm9kZV90eXBlczx2YWx1ZV90eXBlLCB0eXBlbmFtZSBfX2FsbG9jX3RyYWl0czo6dm9pZF9wb2ludGVyPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX05vZGVUeXBlczsKK3B1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X19ub2RlX3ZhbHVlX3R5cGUgICAgICAgICAgIF9fbm9kZV92YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X19jb250YWluZXJfdmFsdWVfdHlwZSAgICAgIF9fY29udGFpbmVyX3ZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjprZXlfdHlwZSAgICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnBvaW50ZXIgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OmNvbnN0X3BvaW50ZXIgICBjb25zdF9wb2ludGVyOworI2lmbmRlZiBfTElCQ1BQX0FCSV9GSVhfVU5PUkRFUkVEX0NPTlRBSU5FUl9TSVpFX1RZUEUKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworI2Vsc2UKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6OnNpemVfdHlwZSAgICAgICAgICAgc2l6ZV90eXBlOworI2VuZGlmCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjpkaWZmZXJlbmNlX3R5cGUgICAgIGRpZmZlcmVuY2VfdHlwZTsKK3B1YmxpYzoKKyAgICAvLyBDcmVhdGUgX19ub2RlCisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6Ol9fbm9kZV90eXBlIF9fbm9kZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2FsbG9jX2hlbHBlcjxfX2FsbG9jX3RyYWl0cywgX19ub2RlPjo6dHlwZSBfX25vZGVfYWxsb2NhdG9yOworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfX25vZGVfYWxsb2NhdG9yPiAgICAgICBfX25vZGVfdHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X192b2lkX3BvaW50ZXIgICAgICBfX3ZvaWRfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6Ol9fbm9kZV9wb2ludGVyICAgICAgX19ub2RlX3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjpfX25vZGVfcG9pbnRlciAgICAgIF9fbm9kZV9jb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X19ub2RlX2Jhc2VfdHlwZSAgICBfX2ZpcnN0X25vZGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjpfX25vZGVfYmFzZV9wb2ludGVyIF9fbm9kZV9iYXNlX3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjpfX25leHRfcG9pbnRlciAgICAgIF9fbmV4dF9wb2ludGVyOworCitwcml2YXRlOgorICAgIC8vIGNoZWNrIGZvciBzYW5lIGFsbG9jYXRvciBwb2ludGVyIHJlYmluZGluZyBzZW1hbnRpY3MuIFJlYmluZGluZyB0aGUKKyAgICAvLyBhbGxvY2F0b3IgZm9yIGEgbmV3IHBvaW50ZXIgdHlwZSBzaG91bGQgYmUgZXhhY3RseSB0aGUgc2FtZSBhcyByZWJpbmRpbmcKKyAgICAvLyB0aGUgcG9pbnRlciB1c2luZyAncG9pbnRlcl90cmFpdHMnLgorICAgIHN0YXRpY19hc3NlcnQoKGlzX3NhbWU8X19ub2RlX3BvaW50ZXIsIHR5cGVuYW1lIF9fbm9kZV90cmFpdHM6OnBvaW50ZXI+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAiQWxsb2NhdG9yIGRvZXMgbm90IHJlYmluZCBwb2ludGVycyBpbiBhIHNhbmUgbWFubmVyLiIpOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYWxsb2NfaGVscGVyPF9fbm9kZV90cmFpdHMsIF9fZmlyc3Rfbm9kZT46OnR5cGUKKyAgICAgICAgX19ub2RlX2Jhc2VfYWxsb2NhdG9yOworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfX25vZGVfYmFzZV9hbGxvY2F0b3I+IF9fbm9kZV9iYXNlX3RyYWl0czsKKyAgICBzdGF0aWNfYXNzZXJ0KChpc19zYW1lPF9fbm9kZV9iYXNlX3BvaW50ZXIsIHR5cGVuYW1lIF9fbm9kZV9iYXNlX3RyYWl0czo6cG9pbnRlcj46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgIkFsbG9jYXRvciBkb2VzIG5vdCByZWJpbmQgcG9pbnRlcnMgaW4gYSBzYW5lIG1hbm5lci4iKTsKKworcHJpdmF0ZToKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYWxsb2NfaGVscGVyPF9fbm9kZV90cmFpdHMsIF9fbmV4dF9wb2ludGVyPjo6dHlwZSBfX3BvaW50ZXJfYWxsb2NhdG9yOworICAgIHR5cGVkZWYgX19idWNrZXRfbGlzdF9kZWFsbG9jYXRvcjxfX3BvaW50ZXJfYWxsb2NhdG9yPiBfX2J1Y2tldF9saXN0X2RlbGV0ZXI7CisgICAgdHlwZWRlZiB1bmlxdWVfcHRyPF9fbmV4dF9wb2ludGVyW10sIF9fYnVja2V0X2xpc3RfZGVsZXRlcj4gX19idWNrZXRfbGlzdDsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X19wb2ludGVyX2FsbG9jYXRvcj4gICAgICAgICAgX19wb2ludGVyX2FsbG9jX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYnVja2V0X2xpc3RfZGVsZXRlcjo6cG9pbnRlciAgICAgICBfX25vZGVfcG9pbnRlcl9wb2ludGVyOworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHN0YXRpY19hc3NlcnQoX19kaWFnbm9zZV9oYXNoX3RhYmxlX2hlbHBlcjxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Ol9fdHJpZ2dlcl9kaWFnbm9zdGljcygpLCAiIik7CisjZW5kaWYKKworICAgIC8vIC0tLSBNZW1iZXIgZGF0YSBiZWdpbiAtLS0KKyAgICBfX2J1Y2tldF9saXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2J1Y2tldF9saXN0XzsKKyAgICBfX2NvbXByZXNzZWRfcGFpcjxfX2ZpcnN0X25vZGUsIF9fbm9kZV9hbGxvY2F0b3I+ICAgICBfX3AxXzsKKyAgICBfX2NvbXByZXNzZWRfcGFpcjxzaXplX3R5cGUsIGhhc2hlcj4gICAgICAgICAgICAgICAgICBfX3AyXzsKKyAgICBfX2NvbXByZXNzZWRfcGFpcjxmbG9hdCwga2V5X2VxdWFsPiAgICAgICAgICAgICAgICAgICBfX3AzXzsKKyAgICAvLyAtLS0gTWVtYmVyIGRhdGEgZW5kIC0tLQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSYgc2l6ZSgpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fcDJfLmZpcnN0KCk7fQorcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgIHNpemUoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3AyXy5maXJzdCgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBoYXNoZXImIGhhc2hfZnVuY3Rpb24oKSBfTk9FWENFUFQge3JldHVybiBfX3AyXy5zZWNvbmQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IGhhc2hlciYgaGFzaF9mdW5jdGlvbigpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fcDJfLnNlY29uZCgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBmbG9hdCYgbWF4X2xvYWRfZmFjdG9yKCkgX05PRVhDRVBUIHtyZXR1cm4gX19wM18uZmlyc3QoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGZsb2F0ICBtYXhfbG9hZF9mYWN0b3IoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3AzXy5maXJzdCgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBrZXlfZXF1YWwmIGtleV9lcSgpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fcDNfLnNlY29uZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3Qga2V5X2VxdWFsJiBrZXlfZXEoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3AzXy5zZWNvbmQoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19ub2RlX2FsbG9jYXRvciYgX19ub2RlX2FsbG9jKCkgX05PRVhDRVBUIHtyZXR1cm4gX19wMV8uc2Vjb25kKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdCBfX25vZGVfYWxsb2NhdG9yJiBfX25vZGVfYWxsb2MoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX3AxXy5zZWNvbmQoKTt9CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9faGFzaF9pdGVyYXRvcjxfX25vZGVfcG9pbnRlcj4gICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfX2hhc2hfY29uc3RfaXRlcmF0b3I8X19ub2RlX3BvaW50ZXI+ICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgX19oYXNoX2xvY2FsX2l0ZXJhdG9yPF9fbm9kZV9wb2ludGVyPiAgICAgICAgICAgICBsb2NhbF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9faGFzaF9jb25zdF9sb2NhbF9pdGVyYXRvcjxfX25vZGVfcG9pbnRlcj4gICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3I7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX3RhYmxlKCkKKyAgICAgICAgX05PRVhDRVBUXygKKyAgICAgICAgICAgIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9fYnVja2V0X2xpc3Q+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8X19maXJzdF9ub2RlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9fbm9kZV9hbGxvY2F0b3I+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8aGFzaGVyPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGtleV9lcXVhbD46OnZhbHVlKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX3RhYmxlKGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCk7CisgICAgX19oYXNoX3RhYmxlKGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKyAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgZXhwbGljaXQgX19oYXNoX3RhYmxlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworICAgIF9faGFzaF90YWJsZShjb25zdCBfX2hhc2hfdGFibGUmIF9fdSk7CisgICAgX19oYXNoX3RhYmxlKGNvbnN0IF9faGFzaF90YWJsZSYgX191LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX19oYXNoX3RhYmxlKF9faGFzaF90YWJsZSYmIF9fdSkKKyAgICAgICAgX05PRVhDRVBUXygKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPF9fYnVja2V0X2xpc3Q+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8X19maXJzdF9ub2RlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPF9fbm9kZV9hbGxvY2F0b3I+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8aGFzaGVyPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGtleV9lcXVhbD46OnZhbHVlKTsKKyAgICBfX2hhc2hfdGFibGUoX19oYXNoX3RhYmxlJiYgX191LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisgICAgfl9faGFzaF90YWJsZSgpOworCisgICAgX19oYXNoX3RhYmxlJiBvcGVyYXRvcj0oY29uc3QgX19oYXNoX3RhYmxlJiBfX3UpOworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX3RhYmxlJiBvcGVyYXRvcj0oX19oYXNoX3RhYmxlJiYgX191KQorICAgICAgICBfTk9FWENFUFRfKAorICAgICAgICAgICAgX19ub2RlX3RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ6OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfX25vZGVfYWxsb2NhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGhhc2hlcj46OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxrZXlfZXF1YWw+Ojp2YWx1ZSk7CisjZW5kaWYKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQgX19hc3NpZ25fdW5pcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkIF9fYXNzaWduX211bHRpKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgX05PRVhDRVBUCisgICAgeworICAgICAgICByZXR1cm4gc3RkOjptaW48c2l6ZV90eXBlPigKKyAgICAgICAgICAgIF9fbm9kZV90cmFpdHM6Om1heF9zaXplKF9fbm9kZV9hbGxvYygpKSwKKyAgICAgICAgICAgIG51bWVyaWNfbGltaXRzPGRpZmZlcmVuY2VfdHlwZSA+OjptYXgoKQorICAgICAgICApOworICAgIH0KKworICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IF9fbm9kZV9pbnNlcnRfdW5pcXVlKF9fbm9kZV9wb2ludGVyIF9fbmQpOworICAgIGl0ZXJhdG9yICAgICAgICAgICAgIF9fbm9kZV9pbnNlcnRfbXVsdGkoX19ub2RlX3BvaW50ZXIgX19uZCk7CisgICAgaXRlcmF0b3IgICAgICAgICAgICAgX19ub2RlX2luc2VydF9tdWx0aShjb25zdF9pdGVyYXRvciBfX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25vZGVfcG9pbnRlciBfX25kKTsKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgLi4uX0FyZ3M+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IF9fZW1wbGFjZV91bmlxdWVfa2V5X2FyZ3MoX0tleSBjb25zdCYgX19rLCBfQXJncyYmLi4uIF9fYXJncyk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IF9fZW1wbGFjZV91bmlxdWVfaW1wbChfQXJncyYmLi4uIF9fYXJncyk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1BwPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBfX2VtcGxhY2VfdW5pcXVlKF9QcCYmIF9feCkgeworICAgICAgcmV0dXJuIF9fZW1wbGFjZV91bmlxdWVfZXh0cmFjdF9rZXkoX1ZTVEQ6OmZvcndhcmQ8X1BwPihfX3gpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jYW5fZXh0cmFjdF9rZXk8X1BwLCBrZXlfdHlwZT4oKSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9GaXJzdCwgY2xhc3MgX1NlY29uZD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgICBfX2Nhbl9leHRyYWN0X21hcF9rZXk8X0ZpcnN0LCBrZXlfdHlwZSwgX19jb250YWluZXJfdmFsdWVfdHlwZT46OnZhbHVlLAorICAgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgID46OnR5cGUgX19lbXBsYWNlX3VuaXF1ZShfRmlyc3QmJiBfX2YsIF9TZWNvbmQmJiBfX3MpIHsKKyAgICAgICAgcmV0dXJuIF9fZW1wbGFjZV91bmlxdWVfa2V5X2FyZ3MoX19mLCBfVlNURDo6Zm9yd2FyZDxfRmlyc3Q+KF9fZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X1NlY29uZD4oX19zKSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBfX2VtcGxhY2VfdW5pcXVlKF9BcmdzJiYuLi4gX19hcmdzKSB7CisgICAgICByZXR1cm4gX19lbXBsYWNlX3VuaXF1ZV9pbXBsKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1BwPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgIF9fZW1wbGFjZV91bmlxdWVfZXh0cmFjdF9rZXkoX1BwJiYgX194LCBfX2V4dHJhY3Rfa2V5X2ZhaWxfdGFnKSB7CisgICAgICByZXR1cm4gX19lbXBsYWNlX3VuaXF1ZV9pbXBsKF9WU1REOjpmb3J3YXJkPF9QcD4oX194KSk7CisgICAgfQorICAgIHRlbXBsYXRlIDxjbGFzcyBfUHA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgX19lbXBsYWNlX3VuaXF1ZV9leHRyYWN0X2tleShfUHAmJiBfX3gsIF9fZXh0cmFjdF9rZXlfc2VsZl90YWcpIHsKKyAgICAgIHJldHVybiBfX2VtcGxhY2VfdW5pcXVlX2tleV9hcmdzKF9feCwgX1ZTVEQ6OmZvcndhcmQ8X1BwPihfX3gpKTsKKyAgICB9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9QcD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICBfX2VtcGxhY2VfdW5pcXVlX2V4dHJhY3Rfa2V5KF9QcCYmIF9feCwgX19leHRyYWN0X2tleV9maXJzdF90YWcpIHsKKyAgICAgIHJldHVybiBfX2VtcGxhY2VfdW5pcXVlX2tleV9hcmdzKF9feC5maXJzdCwgX1ZTVEQ6OmZvcndhcmQ8X1BwPihfX3gpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIF9fZW1wbGFjZV9tdWx0aShfQXJncyYmLi4uIF9fYXJncyk7CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBfX2VtcGxhY2VfaGludF9tdWx0aShjb25zdF9pdGVyYXRvciBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKTsKKworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgX19pbnNlcnRfdW5pcXVlKF9fY29udGFpbmVyX3ZhbHVlX3R5cGUmJiBfX3gpIHsKKyAgICAgIHJldHVybiBfX2VtcGxhY2VfdW5pcXVlX2tleV9hcmdzKF9Ob2RlVHlwZXM6Ol9fZ2V0X2tleShfX3gpLCBfVlNURDo6bW92ZShfX3gpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1BwLCBjbGFzcyA9IHR5cGVuYW1lIGVuYWJsZV9pZjwKKyAgICAgICAgICAgICFfX2lzX3NhbWVfdW5jdnJlZjxfUHAsIF9fY29udGFpbmVyX3ZhbHVlX3R5cGU+Ojp2YWx1ZQorICAgICAgICA+Ojp0eXBlPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBfX2luc2VydF91bmlxdWUoX1BwJiYgX194KSB7CisgICAgICByZXR1cm4gX19lbXBsYWNlX3VuaXF1ZShfVlNURDo6Zm9yd2FyZDxfUHA+KF9feCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfUHA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIF9faW5zZXJ0X211bHRpKF9QcCYmIF9feCkgeworICAgICAgcmV0dXJuIF9fZW1wbGFjZV9tdWx0aShfVlNURDo6Zm9yd2FyZDxfUHA+KF9feCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfUHA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIF9faW5zZXJ0X211bHRpKGNvbnN0X2l0ZXJhdG9yIF9fcCwgX1BwJiYgX194KSB7CisgICAgICAgIHJldHVybiBfX2VtcGxhY2VfaGludF9tdWx0aShfX3AsIF9WU1REOjpmb3J3YXJkPF9QcD4oX194KSk7CisgICAgfQorCisjZWxzZSAgLy8gIWRlZmluZWQoX0xJQkNQUF9DWFgwM19MQU5HKQorICAgIHRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQXJncz4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gX19lbXBsYWNlX3VuaXF1ZV9rZXlfYXJncyhfS2V5IGNvbnN0JiwgX0FyZ3MmIF9fYXJncyk7CisKKyAgICBpdGVyYXRvciBfX2luc2VydF9tdWx0aShjb25zdCBfX2NvbnRhaW5lcl92YWx1ZV90eXBlJiBfX3gpOworICAgIGl0ZXJhdG9yIF9faW5zZXJ0X211bHRpKGNvbnN0X2l0ZXJhdG9yIF9fcCwgY29uc3QgX19jb250YWluZXJfdmFsdWVfdHlwZSYgX194KTsKKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IF9faW5zZXJ0X3VuaXF1ZShjb25zdCBfX2NvbnRhaW5lcl92YWx1ZV90eXBlJiBfX3gpIHsKKyAgICAgICAgcmV0dXJuIF9fZW1wbGFjZV91bmlxdWVfa2V5X2FyZ3MoX05vZGVUeXBlczo6X19nZXRfa2V5KF9feCksIF9feCk7CisgICAgfQorCisgICAgdm9pZCBjbGVhcigpIF9OT0VYQ0VQVDsKKyAgICB2b2lkIHJlaGFzaChzaXplX3R5cGUgX19uKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgX19uKQorICAgICAgICB7cmVoYXNoKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oY2VpbChfX24gLyBtYXhfbG9hZF9mYWN0b3IoKSkpKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIF9fYnVja2V0X2xpc3RfLmdldF9kZWxldGVyKCkuc2l6ZSgpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciAgICAgICBiZWdpbigpIF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgICAgICAgZW5kKCkgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgX05PRVhDRVBUOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9LZXk+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgc2l6ZV90eXBlIGJ1Y2tldChjb25zdCBfS2V5JiBfX2spIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIF9MSUJDUFBfQVNTRVJUKGJ1Y2tldF9jb3VudCgpID4gMCwKKyAgICAgICAgICAgICAgICAidW5vcmRlcmVkIGNvbnRhaW5lcjo6YnVja2V0KGtleSkgY2FsbGVkIHdoZW4gYnVja2V0X2NvdW50KCkgPT0gMCIpOworICAgICAgICAgICAgcmV0dXJuIF9fY29uc3RyYWluX2hhc2goaGFzaF9mdW5jdGlvbigpKF9fayksIGJ1Y2tldF9jb3VudCgpKTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9LZXk+CisgICAgICAgIGl0ZXJhdG9yICAgICAgIGZpbmQoY29uc3QgX0tleSYgX194KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4KKyAgICAgICAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBfS2V5JiBfX3gpIGNvbnN0OworCisgICAgdHlwZWRlZiBfX2hhc2hfbm9kZV9kZXN0cnVjdG9yPF9fbm9kZV9hbGxvY2F0b3I+IF9EcDsKKyAgICB0eXBlZGVmIHVuaXF1ZV9wdHI8X19ub2RlLCBfRHA+IF9fbm9kZV9ob2xkZXI7CisKKyAgICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBfX3ApOworICAgIGl0ZXJhdG9yIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9LZXk+CisgICAgICAgIHNpemVfdHlwZSBfX2VyYXNlX3VuaXF1ZShjb25zdCBfS2V5JiBfX2spOworICAgIHRlbXBsYXRlIDxjbGFzcyBfS2V5PgorICAgICAgICBzaXplX3R5cGUgX19lcmFzZV9tdWx0aShjb25zdCBfS2V5JiBfX2spOworICAgIF9fbm9kZV9ob2xkZXIgcmVtb3ZlKGNvbnN0X2l0ZXJhdG9yIF9fcCkgX05PRVhDRVBUOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9LZXk+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgc2l6ZV90eXBlIF9fY291bnRfdW5pcXVlKGNvbnN0IF9LZXkmIF9faykgY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9LZXk+CisgICAgICAgIHNpemVfdHlwZSBfX2NvdW50X211bHRpKGNvbnN0IF9LZXkmIF9faykgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4KKyAgICAgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICAgIF9fZXF1YWxfcmFuZ2VfdW5pcXVlKGNvbnN0IF9LZXkmIF9fayk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9LZXk+CisgICAgICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgICBfX2VxdWFsX3JhbmdlX3VuaXF1ZShjb25zdCBfS2V5JiBfX2spIGNvbnN0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9LZXk+CisgICAgICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgICBfX2VxdWFsX3JhbmdlX211bHRpKGNvbnN0IF9LZXkmIF9fayk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9LZXk+CisgICAgICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgICBfX2VxdWFsX3JhbmdlX211bHRpKGNvbnN0IF9LZXkmIF9faykgY29uc3Q7CisKKyAgICB2b2lkIHN3YXAoX19oYXNoX3RhYmxlJiBfX3UpCisjaWYgX0xJQkNQUF9TVERfVkVSIDw9IDExCisgICAgICAgIF9OT0VYQ0VQVF9ERUJVR18oCisgICAgICAgICAgICBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPGhhc2hlcj46OnZhbHVlICYmIF9faXNfbm90aHJvd19zd2FwcGFibGU8a2V5X2VxdWFsPjo6dmFsdWUKKyAgICAgICAgICAgICYmICghYWxsb2NhdG9yX3RyYWl0czxfX3BvaW50ZXJfYWxsb2NhdG9yPjo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwOjp2YWx1ZQorICAgICAgICAgICAgICAgICAgfHwgX19pc19ub3Rocm93X3N3YXBwYWJsZTxfX3BvaW50ZXJfYWxsb2NhdG9yPjo6dmFsdWUpCisgICAgICAgICAgICAmJiAoIV9fbm9kZV90cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDo6dmFsdWUKKyAgICAgICAgICAgICAgICAgIHx8IF9faXNfbm90aHJvd19zd2FwcGFibGU8X19ub2RlX2FsbG9jYXRvcj46OnZhbHVlKQorICAgICAgICAgICAgKTsKKyNlbHNlCisgICAgIF9OT0VYQ0VQVF9ERUJVR18oX19pc19ub3Rocm93X3N3YXBwYWJsZTxoYXNoZXI+Ojp2YWx1ZSAmJiBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPGtleV9lcXVhbD46OnZhbHVlKTsKKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gbWF4X3NpemUoKTsgfQorICAgIHNpemVfdHlwZSBidWNrZXRfc2l6ZShzaXplX3R5cGUgX19uKSBjb25zdDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0IGxvYWRfZmFjdG9yKCkgY29uc3QgX05PRVhDRVBUCisgICAgeworICAgICAgICBzaXplX3R5cGUgX19iYyA9IGJ1Y2tldF9jb3VudCgpOworICAgICAgICByZXR1cm4gX19iYyAhPSAwID8gKGZsb2F0KXNpemUoKSAvIF9fYmMgOiAwLmY7CisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCBtYXhfbG9hZF9mYWN0b3IoZmxvYXQgX19tbGYpIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19tbGYgPiAwLAorICAgICAgICAgICAgInVub3JkZXJlZCBjb250YWluZXI6Om1heF9sb2FkX2ZhY3RvcihsZikgY2FsbGVkIHdpdGggbGYgPD0gMCIpOworICAgICAgICBtYXhfbG9hZF9mYWN0b3IoKSA9IF9WU1REOjptYXgoX19tbGYsIGxvYWRfZmFjdG9yKCkpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBsb2NhbF9pdGVyYXRvcgorICAgIGJlZ2luKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgICBfTElCQ1BQX0FTU0VSVChfX24gPCBidWNrZXRfY291bnQoKSwKKyAgICAgICAgICAgICJ1bm9yZGVyZWQgY29udGFpbmVyOjpiZWdpbihuKSBjYWxsZWQgd2l0aCBuID49IGJ1Y2tldF9jb3VudCgpIik7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgIHJldHVybiBsb2NhbF9pdGVyYXRvcihfX2J1Y2tldF9saXN0X1tfX25dLCBfX24sIGJ1Y2tldF9jb3VudCgpLCB0aGlzKTsKKyNlbHNlCisgICAgICAgIHJldHVybiBsb2NhbF9pdGVyYXRvcihfX2J1Y2tldF9saXN0X1tfX25dLCBfX24sIGJ1Y2tldF9jb3VudCgpKTsKKyNlbmRpZgorICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBsb2NhbF9pdGVyYXRvcgorICAgIGVuZChzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19uIDwgYnVja2V0X2NvdW50KCksCisgICAgICAgICAgICAidW5vcmRlcmVkIGNvbnRhaW5lcjo6ZW5kKG4pIGNhbGxlZCB3aXRoIG4gPj0gYnVja2V0X2NvdW50KCkiKTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgcmV0dXJuIGxvY2FsX2l0ZXJhdG9yKG51bGxwdHIsIF9fbiwgYnVja2V0X2NvdW50KCksIHRoaXMpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIGxvY2FsX2l0ZXJhdG9yKG51bGxwdHIsIF9fbiwgYnVja2V0X2NvdW50KCkpOworI2VuZGlmCisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgY2JlZ2luKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgICBfTElCQ1BQX0FTU0VSVChfX24gPCBidWNrZXRfY291bnQoKSwKKyAgICAgICAgICAgICJ1bm9yZGVyZWQgY29udGFpbmVyOjpjYmVnaW4obikgY2FsbGVkIHdpdGggbiA+PSBidWNrZXRfY291bnQoKSIpOworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICByZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoX19idWNrZXRfbGlzdF9bX19uXSwgX19uLCBidWNrZXRfY291bnQoKSwgdGhpcyk7CisjZWxzZQorICAgICAgICByZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoX19idWNrZXRfbGlzdF9bX19uXSwgX19uLCBidWNrZXRfY291bnQoKSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICBjZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgICBfTElCQ1BQX0FTU0VSVChfX24gPCBidWNrZXRfY291bnQoKSwKKyAgICAgICAgICAgICJ1bm9yZGVyZWQgY29udGFpbmVyOjpjZW5kKG4pIGNhbGxlZCB3aXRoIG4gPj0gYnVja2V0X2NvdW50KCkiKTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgcmV0dXJuIGNvbnN0X2xvY2FsX2l0ZXJhdG9yKG51bGxwdHIsIF9fbiwgYnVja2V0X2NvdW50KCksIHRoaXMpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIGNvbnN0X2xvY2FsX2l0ZXJhdG9yKG51bGxwdHIsIF9fbiwgYnVja2V0X2NvdW50KCkpOworI2VuZGlmCisgICAgfQorCisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisKKyAgICBib29sIF9fZGVyZWZlcmVuY2VhYmxlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yKiBfX2kpIGNvbnN0OworICAgIGJvb2wgX19kZWNyZW1lbnRhYmxlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yKiBfX2kpIGNvbnN0OworICAgIGJvb2wgX19hZGRhYmxlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yKiBfX2ksIHB0cmRpZmZfdCBfX24pIGNvbnN0OworICAgIGJvb2wgX19zdWJzY3JpcHRhYmxlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yKiBfX2ksIHB0cmRpZmZfdCBfX24pIGNvbnN0OworCisjZW5kaWYgIC8vIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorCitwcml2YXRlOgorICAgIHZvaWQgX19yZWhhc2goc2l6ZV90eXBlIF9fbik7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdGVtcGxhdGUgPGNsYXNzIC4uLl9BcmdzPgorICAgIF9fbm9kZV9ob2xkZXIgX19jb25zdHJ1Y3Rfbm9kZShfQXJncyYmIC4uLl9fYXJncyk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZpcnN0LCBjbGFzcyAuLi5fUmVzdD4KKyAgICBfX25vZGVfaG9sZGVyIF9fY29uc3RydWN0X25vZGVfaGFzaChzaXplX3QgX19oYXNoLCBfRmlyc3QmJiBfX2YsIF9SZXN0JiYuLi4gX19yZXN0KTsKKyNlbHNlIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9fbm9kZV9ob2xkZXIgX19jb25zdHJ1Y3Rfbm9kZShjb25zdCBfX2NvbnRhaW5lcl92YWx1ZV90eXBlJiBfX3YpOworICAgIF9fbm9kZV9ob2xkZXIgX19jb25zdHJ1Y3Rfbm9kZV9oYXNoKHNpemVfdCBfX2hhc2gsIGNvbnN0IF9fY29udGFpbmVyX3ZhbHVlX3R5cGUmIF9fdik7CisjZW5kaWYKKworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19jb3B5X2Fzc2lnbl9hbGxvYyhjb25zdCBfX2hhc2hfdGFibGUmIF9fdSkKKyAgICAgICAge19fY29weV9hc3NpZ25fYWxsb2MoX191LCBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgICAgIF9fbm9kZV90cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfY29weV9hc3NpZ25tZW50Ojp2YWx1ZT4oKSk7fQorICAgIHZvaWQgX19jb3B5X2Fzc2lnbl9hbGxvYyhjb25zdCBfX2hhc2hfdGFibGUmIF9fdSwgdHJ1ZV90eXBlKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQgX19jb3B5X2Fzc2lnbl9hbGxvYyhjb25zdCBfX2hhc2hfdGFibGUmLCBmYWxzZV90eXBlKSB7fQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHZvaWQgX19tb3ZlX2Fzc2lnbihfX2hhc2hfdGFibGUmIF9fdSwgZmFsc2VfdHlwZSk7CisgICAgdm9pZCBfX21vdmVfYXNzaWduKF9faGFzaF90YWJsZSYgX191LCB0cnVlX3R5cGUpCisgICAgICAgIF9OT0VYQ0VQVF8oCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfX25vZGVfYWxsb2NhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGhhc2hlcj46OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxrZXlfZXF1YWw+Ojp2YWx1ZSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19tb3ZlX2Fzc2lnbl9hbGxvYyhfX2hhc2hfdGFibGUmIF9fdSkKKyAgICAgICAgX05PRVhDRVBUXygKKyAgICAgICAgICAgICFfX25vZGVfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWUgfHwKKyAgICAgICAgICAgIChpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfX3BvaW50ZXJfYWxsb2NhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfX25vZGVfYWxsb2NhdG9yPjo6dmFsdWUpKQorICAgICAgICB7X19tb3ZlX2Fzc2lnbl9hbGxvYyhfX3UsIGludGVncmFsX2NvbnN0YW50PGJvb2wsCisgICAgICAgICAgICAgX19ub2RlX3RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ6OnZhbHVlPigpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19tb3ZlX2Fzc2lnbl9hbGxvYyhfX2hhc2hfdGFibGUmIF9fdSwgdHJ1ZV90eXBlKQorICAgICAgICBfTk9FWENFUFRfKAorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8X19wb2ludGVyX2FsbG9jYXRvcj46OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfX25vZGVfYWxsb2NhdG9yPjo6dmFsdWUpCisgICAgeworICAgICAgICBfX2J1Y2tldF9saXN0Xy5nZXRfZGVsZXRlcigpLl9fYWxsb2MoKSA9CisgICAgICAgICAgICAgICAgX1ZTVEQ6Om1vdmUoX191Ll9fYnVja2V0X2xpc3RfLmdldF9kZWxldGVyKCkuX19hbGxvYygpKTsKKyAgICAgICAgX19ub2RlX2FsbG9jKCkgPSBfVlNURDo6bW92ZShfX3UuX19ub2RlX2FsbG9jKCkpOworICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQgX19tb3ZlX2Fzc2lnbl9hbGxvYyhfX2hhc2hfdGFibGUmLCBmYWxzZV90eXBlKSBfTk9FWENFUFQge30KKyNlbmRpZiAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIHZvaWQgX19kZWFsbG9jYXRlX25vZGUoX19uZXh0X3BvaW50ZXIgX19ucCkgX05PRVhDRVBUOworICAgIF9fbmV4dF9wb2ludGVyIF9fZGV0YWNoKCkgX05PRVhDRVBUOworCisgICAgdGVtcGxhdGUgPGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHVub3JkZXJlZF9tYXA7CisgICAgdGVtcGxhdGUgPGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHVub3JkZXJlZF9tdWx0aW1hcDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK2lubGluZQorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6X19oYXNoX3RhYmxlKCkKKyAgICBfTk9FWENFUFRfKAorICAgICAgICBpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxfX2J1Y2tldF9saXN0Pjo6dmFsdWUgJiYKKyAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8X19maXJzdF9ub2RlPjo6dmFsdWUgJiYKKyAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8X19ub2RlX2FsbG9jYXRvcj46OnZhbHVlICYmCisgICAgICAgIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGhhc2hlcj46OnZhbHVlICYmCisgICAgICAgIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGtleV9lcXVhbD46OnZhbHVlKQorICAgIDogX19wMl8oMCksCisgICAgICBfX3AzXygxLjBmKQoreworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUKK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Ol9faGFzaF90YWJsZShjb25zdCBoYXNoZXImIF9faGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCkKKyAgICA6IF9fYnVja2V0X2xpc3RfKG51bGxwdHIsIF9fYnVja2V0X2xpc3RfZGVsZXRlcigpKSwKKyAgICAgIF9fcDFfKCksCisgICAgICBfX3AyXygwLCBfX2hmKSwKKyAgICAgIF9fcDNfKDEuMGYsIF9fZXFsKQoreworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+CitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpfX2hhc2hfdGFibGUoY29uc3QgaGFzaGVyJiBfX2hmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fYnVja2V0X2xpc3RfKG51bGxwdHIsIF9fYnVja2V0X2xpc3RfZGVsZXRlcihfX3BvaW50ZXJfYWxsb2NhdG9yKF9fYSksIDApKSwKKyAgICAgIF9fcDFfKF9fc2Vjb25kX3RhZygpLCBfX25vZGVfYWxsb2NhdG9yKF9fYSkpLAorICAgICAgX19wMl8oMCwgX19oZiksCisgICAgICBfX3AzXygxLjBmLCBfX2VxbCkKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6X19oYXNoX3RhYmxlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX2J1Y2tldF9saXN0XyhudWxscHRyLCBfX2J1Y2tldF9saXN0X2RlbGV0ZXIoX19wb2ludGVyX2FsbG9jYXRvcihfX2EpLCAwKSksCisgICAgICBfX3AxXyhfX3NlY29uZF90YWcoKSwgX19ub2RlX2FsbG9jYXRvcihfX2EpKSwKKyAgICAgIF9fcDJfKDApLAorICAgICAgX19wM18oMS4wZikKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6X19oYXNoX3RhYmxlKGNvbnN0IF9faGFzaF90YWJsZSYgX191KQorICAgIDogX19idWNrZXRfbGlzdF8obnVsbHB0ciwKKyAgICAgICAgICBfX2J1Y2tldF9saXN0X2RlbGV0ZXIoYWxsb2NhdG9yX3RyYWl0czxfX3BvaW50ZXJfYWxsb2NhdG9yPjo6CisgICAgICAgICAgICAgIHNlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb24oCisgICAgICAgICAgICAgICAgICBfX3UuX19idWNrZXRfbGlzdF8uZ2V0X2RlbGV0ZXIoKS5fX2FsbG9jKCkpLCAwKSksCisgICAgICBfX3AxXyhfX3NlY29uZF90YWcoKSwgYWxsb2NhdG9yX3RyYWl0czxfX25vZGVfYWxsb2NhdG9yPjo6CisgICAgICAgICAgc2VsZWN0X29uX2NvbnRhaW5lcl9jb3B5X2NvbnN0cnVjdGlvbihfX3UuX19ub2RlX2FsbG9jKCkpKSwKKyAgICAgIF9fcDJfKDAsIF9fdS5oYXNoX2Z1bmN0aW9uKCkpLAorICAgICAgX19wM18oX191Ll9fcDNfKQoreworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+CitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpfX2hhc2hfdGFibGUoY29uc3QgX19oYXNoX3RhYmxlJiBfX3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fYnVja2V0X2xpc3RfKG51bGxwdHIsIF9fYnVja2V0X2xpc3RfZGVsZXRlcihfX3BvaW50ZXJfYWxsb2NhdG9yKF9fYSksIDApKSwKKyAgICAgIF9fcDFfKF9fc2Vjb25kX3RhZygpLCBfX25vZGVfYWxsb2NhdG9yKF9fYSkpLAorICAgICAgX19wMl8oMCwgX191Lmhhc2hfZnVuY3Rpb24oKSksCisgICAgICBfX3AzXyhfX3UuX19wM18pCit7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Ol9faGFzaF90YWJsZShfX2hhc2hfdGFibGUmJiBfX3UpCisgICAgICAgIF9OT0VYQ0VQVF8oCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxfX2J1Y2tldF9saXN0Pjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPF9fZmlyc3Rfbm9kZT46OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxfX25vZGVfYWxsb2NhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGhhc2hlcj46OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxrZXlfZXF1YWw+Ojp2YWx1ZSkKKyAgICA6IF9fYnVja2V0X2xpc3RfKF9WU1REOjptb3ZlKF9fdS5fX2J1Y2tldF9saXN0XykpLAorICAgICAgX19wMV8oX1ZTVEQ6Om1vdmUoX191Ll9fcDFfKSksCisgICAgICBfX3AyXyhfVlNURDo6bW92ZShfX3UuX19wMl8pKSwKKyAgICAgIF9fcDNfKF9WU1REOjptb3ZlKF9fdS5fX3AzXykpCit7CisgICAgaWYgKHNpemUoKSA+IDApCisgICAgeworICAgICAgICBfX2J1Y2tldF9saXN0X1tfX2NvbnN0cmFpbl9oYXNoKF9fcDFfLmZpcnN0KCkuX19uZXh0Xy0+X19oYXNoKCksIGJ1Y2tldF9jb3VudCgpKV0gPQorICAgICAgICAgICAgX19wMV8uZmlyc3QoKS5fX3B0cigpOworICAgICAgICBfX3UuX19wMV8uZmlyc3QoKS5fX25leHRfID0gbnVsbHB0cjsKKyAgICAgICAgX191LnNpemUoKSA9IDA7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+CitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpfX2hhc2hfdGFibGUoX19oYXNoX3RhYmxlJiYgX191LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX2J1Y2tldF9saXN0XyhudWxscHRyLCBfX2J1Y2tldF9saXN0X2RlbGV0ZXIoX19wb2ludGVyX2FsbG9jYXRvcihfX2EpLCAwKSksCisgICAgICBfX3AxXyhfX3NlY29uZF90YWcoKSwgX19ub2RlX2FsbG9jYXRvcihfX2EpKSwKKyAgICAgIF9fcDJfKDAsIF9WU1REOjptb3ZlKF9fdS5oYXNoX2Z1bmN0aW9uKCkpKSwKKyAgICAgIF9fcDNfKF9WU1REOjptb3ZlKF9fdS5fX3AzXykpCit7CisgICAgaWYgKF9fYSA9PSBhbGxvY2F0b3JfdHlwZShfX3UuX19ub2RlX2FsbG9jKCkpKQorICAgIHsKKyAgICAgICAgX19idWNrZXRfbGlzdF8ucmVzZXQoX191Ll9fYnVja2V0X2xpc3RfLnJlbGVhc2UoKSk7CisgICAgICAgIF9fYnVja2V0X2xpc3RfLmdldF9kZWxldGVyKCkuc2l6ZSgpID0gX191Ll9fYnVja2V0X2xpc3RfLmdldF9kZWxldGVyKCkuc2l6ZSgpOworICAgICAgICBfX3UuX19idWNrZXRfbGlzdF8uZ2V0X2RlbGV0ZXIoKS5zaXplKCkgPSAwOworICAgICAgICBpZiAoX191LnNpemUoKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fcDFfLmZpcnN0KCkuX19uZXh0XyA9IF9fdS5fX3AxXy5maXJzdCgpLl9fbmV4dF87CisgICAgICAgICAgICBfX3UuX19wMV8uZmlyc3QoKS5fX25leHRfID0gbnVsbHB0cjsKKyAgICAgICAgICAgIF9fYnVja2V0X2xpc3RfW19fY29uc3RyYWluX2hhc2goX19wMV8uZmlyc3QoKS5fX25leHRfLT5fX2hhc2goKSwgYnVja2V0X2NvdW50KCkpXSA9CisgICAgICAgICAgICAgICAgX19wMV8uZmlyc3QoKS5fX3B0cigpOworICAgICAgICAgICAgc2l6ZSgpID0gX191LnNpemUoKTsKKyAgICAgICAgICAgIF9fdS5zaXplKCkgPSAwOworICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+CitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+Ojp+X19oYXNoX3RhYmxlKCkKK3sKKyNpZiBkZWZpbmVkKF9MSUJDUFBfQ1hYMDNfTEFORykKKyAgICBzdGF0aWNfYXNzZXJ0KChpc19jb3B5X2NvbnN0cnVjdGlibGU8a2V5X2VxdWFsPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAiUHJlZGljYXRlIG11c3QgYmUgY29weS1jb25zdHJ1Y3RpYmxlLiIpOworICAgIHN0YXRpY19hc3NlcnQoKGlzX2NvcHlfY29uc3RydWN0aWJsZTxoYXNoZXI+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICJIYXNoZXIgbXVzdCBiZSBjb3B5LWNvbnN0cnVjdGlibGUuIik7CisjZW5kaWYKKworICAgIF9fZGVhbGxvY2F0ZV9ub2RlKF9fcDFfLmZpcnN0KCkuX19uZXh0Xyk7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19lcmFzZV9jKHRoaXMpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Ol9fY29weV9hc3NpZ25fYWxsb2MoCisgICAgICAgIGNvbnN0IF9faGFzaF90YWJsZSYgX191LCB0cnVlX3R5cGUpCit7CisgICAgaWYgKF9fbm9kZV9hbGxvYygpICE9IF9fdS5fX25vZGVfYWxsb2MoKSkKKyAgICB7CisgICAgICAgIGNsZWFyKCk7CisgICAgICAgIF9fYnVja2V0X2xpc3RfLnJlc2V0KCk7CisgICAgICAgIF9fYnVja2V0X2xpc3RfLmdldF9kZWxldGVyKCkuc2l6ZSgpID0gMDsKKyAgICB9CisgICAgX19idWNrZXRfbGlzdF8uZ2V0X2RlbGV0ZXIoKS5fX2FsbG9jKCkgPSBfX3UuX19idWNrZXRfbGlzdF8uZ2V0X2RlbGV0ZXIoKS5fX2FsbG9jKCk7CisgICAgX19ub2RlX2FsbG9jKCkgPSBfX3UuX19ub2RlX2FsbG9jKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz4mCitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpvcGVyYXRvcj0oY29uc3QgX19oYXNoX3RhYmxlJiBfX3UpCit7CisgICAgaWYgKHRoaXMgIT0gJl9fdSkKKyAgICB7CisgICAgICAgIF9fY29weV9hc3NpZ25fYWxsb2MoX191KTsKKyAgICAgICAgaGFzaF9mdW5jdGlvbigpID0gX191Lmhhc2hfZnVuY3Rpb24oKTsKKyAgICAgICAga2V5X2VxKCkgPSBfX3Uua2V5X2VxKCk7CisgICAgICAgIG1heF9sb2FkX2ZhY3RvcigpID0gX191Lm1heF9sb2FkX2ZhY3RvcigpOworICAgICAgICBfX2Fzc2lnbl9tdWx0aShfX3UuYmVnaW4oKSwgX191LmVuZCgpKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpfX2RlYWxsb2NhdGVfbm9kZShfX25leHRfcG9pbnRlciBfX25wKQorICAgIF9OT0VYQ0VQVAoreworICAgIF9fbm9kZV9hbGxvY2F0b3ImIF9fbmEgPSBfX25vZGVfYWxsb2MoKTsKKyAgICB3aGlsZSAoX19ucCAhPSBudWxscHRyKQorICAgIHsKKyAgICAgICAgX19uZXh0X3BvaW50ZXIgX19uZXh0ID0gX19ucC0+X19uZXh0XzsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgX19jX25vZGUqIF9fYyA9IF9fZ2V0X2RiKCktPl9fZmluZF9jX2FuZF9sb2NrKHRoaXMpOworICAgICAgICBmb3IgKF9faV9ub2RlKiogX19wID0gX19jLT5lbmRfOyBfX3AgIT0gX19jLT5iZWdfOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC0tX19wOworICAgICAgICAgICAgaXRlcmF0b3IqIF9faSA9IHN0YXRpY19jYXN0PGl0ZXJhdG9yKj4oKCpfX3ApLT5fX2lfKTsKKyAgICAgICAgICAgIGlmIChfX2ktPl9fbm9kZV8gPT0gX19ucCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKl9fcCktPl9fY18gPSBudWxscHRyOworICAgICAgICAgICAgICAgIGlmICgtLV9fYy0+ZW5kXyAhPSBfX3ApCisgICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoX19wLCBfX3ArMSwgKF9fYy0+ZW5kXyAtIF9fcCkqc2l6ZW9mKF9faV9ub2RlKikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fZ2V0X2RiKCktPnVubG9jaygpOworI2VuZGlmCisgICAgICAgIF9fbm9kZV9wb2ludGVyIF9fcmVhbF9ucCA9IF9fbnAtPl9fdXBjYXN0KCk7CisgICAgICAgIF9fbm9kZV90cmFpdHM6OmRlc3Ryb3koX19uYSwgX05vZGVUeXBlczo6X19nZXRfcHRyKF9fcmVhbF9ucC0+X192YWx1ZV8pKTsKKyAgICAgICAgX19ub2RlX3RyYWl0czo6ZGVhbGxvY2F0ZShfX25hLCBfX3JlYWxfbnAsIDEpOworICAgICAgICBfX25wID0gX19uZXh0OworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgordHlwZW5hbWUgX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6X19uZXh0X3BvaW50ZXIKK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Ol9fZGV0YWNoKCkgX05PRVhDRVBUCit7CisgICAgc2l6ZV90eXBlIF9fYmMgPSBidWNrZXRfY291bnQoKTsKKyAgICBmb3IgKHNpemVfdHlwZSBfX2kgPSAwOyBfX2kgPCBfX2JjOyArK19faSkKKyAgICAgICAgX19idWNrZXRfbGlzdF9bX19pXSA9IG51bGxwdHI7CisgICAgc2l6ZSgpID0gMDsKKyAgICBfX25leHRfcG9pbnRlciBfX2NhY2hlID0gX19wMV8uZmlyc3QoKS5fX25leHRfOworICAgIF9fcDFfLmZpcnN0KCkuX19uZXh0XyA9IG51bGxwdHI7CisgICAgcmV0dXJuIF9fY2FjaGU7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Ol9fbW92ZV9hc3NpZ24oCisgICAgICAgIF9faGFzaF90YWJsZSYgX191LCB0cnVlX3R5cGUpCisgICAgX05PRVhDRVBUXygKKyAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8X19ub2RlX2FsbG9jYXRvcj46OnZhbHVlICYmCisgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGhhc2hlcj46OnZhbHVlICYmCisgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGtleV9lcXVhbD46OnZhbHVlKQoreworICAgIGNsZWFyKCk7CisgICAgX19idWNrZXRfbGlzdF8ucmVzZXQoX191Ll9fYnVja2V0X2xpc3RfLnJlbGVhc2UoKSk7CisgICAgX19idWNrZXRfbGlzdF8uZ2V0X2RlbGV0ZXIoKS5zaXplKCkgPSBfX3UuX19idWNrZXRfbGlzdF8uZ2V0X2RlbGV0ZXIoKS5zaXplKCk7CisgICAgX191Ll9fYnVja2V0X2xpc3RfLmdldF9kZWxldGVyKCkuc2l6ZSgpID0gMDsKKyAgICBfX21vdmVfYXNzaWduX2FsbG9jKF9fdSk7CisgICAgc2l6ZSgpID0gX191LnNpemUoKTsKKyAgICBoYXNoX2Z1bmN0aW9uKCkgPSBfVlNURDo6bW92ZShfX3UuaGFzaF9mdW5jdGlvbigpKTsKKyAgICBtYXhfbG9hZF9mYWN0b3IoKSA9IF9fdS5tYXhfbG9hZF9mYWN0b3IoKTsKKyAgICBrZXlfZXEoKSA9IF9WU1REOjptb3ZlKF9fdS5rZXlfZXEoKSk7CisgICAgX19wMV8uZmlyc3QoKS5fX25leHRfID0gX191Ll9fcDFfLmZpcnN0KCkuX19uZXh0XzsKKyAgICBpZiAoc2l6ZSgpID4gMCkKKyAgICB7CisgICAgICAgIF9fYnVja2V0X2xpc3RfW19fY29uc3RyYWluX2hhc2goX19wMV8uZmlyc3QoKS5fX25leHRfLT5fX2hhc2goKSwgYnVja2V0X2NvdW50KCkpXSA9CisgICAgICAgICAgICBfX3AxXy5maXJzdCgpLl9fcHRyKCk7CisgICAgICAgIF9fdS5fX3AxXy5maXJzdCgpLl9fbmV4dF8gPSBudWxscHRyOworICAgICAgICBfX3Uuc2l6ZSgpID0gMDsKKyAgICB9CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+c3dhcCh0aGlzLCAmX191KTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpfX21vdmVfYXNzaWduKAorICAgICAgICBfX2hhc2hfdGFibGUmIF9fdSwgZmFsc2VfdHlwZSkKK3sKKyAgICBpZiAoX19ub2RlX2FsbG9jKCkgPT0gX191Ll9fbm9kZV9hbGxvYygpKQorICAgICAgICBfX21vdmVfYXNzaWduKF9fdSwgdHJ1ZV90eXBlKCkpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhhc2hfZnVuY3Rpb24oKSA9IF9WU1REOjptb3ZlKF9fdS5oYXNoX2Z1bmN0aW9uKCkpOworICAgICAgICBrZXlfZXEoKSA9IF9WU1REOjptb3ZlKF9fdS5rZXlfZXEoKSk7CisgICAgICAgIG1heF9sb2FkX2ZhY3RvcigpID0gX191Lm1heF9sb2FkX2ZhY3RvcigpOworICAgICAgICBpZiAoYnVja2V0X2NvdW50KCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgX19uZXh0X3BvaW50ZXIgX19jYWNoZSA9IF9fZGV0YWNoKCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9faSA9IF9fdS5iZWdpbigpOworICAgICAgICAgICAgICAgIHdoaWxlIChfX2NhY2hlICE9IG51bGxwdHIgJiYgX191LnNpemUoKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX19jYWNoZS0+X191cGNhc3QoKS0+X192YWx1ZV8gPQorICAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6Om1vdmUoX191LnJlbW92ZShfX2krKyktPl9fdmFsdWVfKTsKKyAgICAgICAgICAgICAgICAgICAgX19uZXh0X3BvaW50ZXIgX19uZXh0ID0gX19jYWNoZS0+X19uZXh0XzsKKyAgICAgICAgICAgICAgICAgICAgX19ub2RlX2luc2VydF9tdWx0aShfX2NhY2hlLT5fX3VwY2FzdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgX19jYWNoZSA9IF9fbmV4dDsKKyAgICAgICAgICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKC4uLikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX2RlYWxsb2NhdGVfbm9kZShfX2NhY2hlKTsKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgICAgICBfX2RlYWxsb2NhdGVfbm9kZShfX2NhY2hlKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdF9pdGVyYXRvciBfX2kgPSBfX3UuYmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKF9fdS5zaXplKCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgX19ub2RlX2hvbGRlciBfX2ggPSBfX2NvbnN0cnVjdF9ub2RlKF9Ob2RlVHlwZXM6Ol9fbW92ZShfX3UucmVtb3ZlKF9faSsrKS0+X192YWx1ZV8pKTsKKyAgICAgICAgICAgIF9fbm9kZV9pbnNlcnRfbXVsdGkoX19oLmdldCgpKTsKKyAgICAgICAgICAgIF9faC5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK2lubGluZQorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPiYKK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Om9wZXJhdG9yPShfX2hhc2hfdGFibGUmJiBfX3UpCisgICAgX05PRVhDRVBUXygKKyAgICAgICAgX19ub2RlX3RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ6OnZhbHVlICYmCisgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPF9fbm9kZV9hbGxvY2F0b3I+Ojp2YWx1ZSAmJgorICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxoYXNoZXI+Ojp2YWx1ZSAmJgorICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxrZXlfZXF1YWw+Ojp2YWx1ZSkKK3sKKyAgICBfX21vdmVfYXNzaWduKF9fdSwgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgICAgICAgIF9fbm9kZV90cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZT4oKSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Cit2b2lkCitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpfX2Fzc2lnbl91bmlxdWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+IF9JVHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lUcmFpdHM6OnZhbHVlX3R5cGUgX0l0VmFsdWVUeXBlOworICAgIHN0YXRpY19hc3NlcnQoKGlzX3NhbWU8X0l0VmFsdWVUeXBlLCBfX2NvbnRhaW5lcl92YWx1ZV90eXBlPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgIl9fYXNzaWduX3VuaXF1ZSBtYXkgb25seSBiZSBjYWxsZWQgd2l0aCB0aGUgY29udGFpbmVycyB2YWx1ZSB0eXBlIik7CisKKyAgICBpZiAoYnVja2V0X2NvdW50KCkgIT0gMCkKKyAgICB7CisgICAgICAgIF9fbmV4dF9wb2ludGVyIF9fY2FjaGUgPSBfX2RldGFjaCgpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgICAgICBmb3IgKDsgX19jYWNoZSAhPSBudWxscHRyICYmIF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19jYWNoZS0+X191cGNhc3QoKS0+X192YWx1ZV8gPSAqX19maXJzdDsKKyAgICAgICAgICAgICAgICBfX25leHRfcG9pbnRlciBfX25leHQgPSBfX2NhY2hlLT5fX25leHRfOworICAgICAgICAgICAgICAgIF9fbm9kZV9pbnNlcnRfdW5pcXVlKF9fY2FjaGUtPl9fdXBjYXN0KCkpOworICAgICAgICAgICAgICAgIF9fY2FjaGUgPSBfX25leHQ7CisgICAgICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB9CisgICAgICAgIGNhdGNoICguLi4pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fZGVhbGxvY2F0ZV9ub2RlKF9fY2FjaGUpOworICAgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIF9fZGVhbGxvY2F0ZV9ub2RlKF9fY2FjaGUpOworICAgIH0KKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgX19pbnNlcnRfdW5pcXVlKCpfX2ZpcnN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordm9pZAorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6X19hc3NpZ25fbXVsdGkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj4gX0lUcmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSVRyYWl0czo6dmFsdWVfdHlwZSBfSXRWYWx1ZVR5cGU7CisgICAgc3RhdGljX2Fzc2VydCgoaXNfc2FtZTxfSXRWYWx1ZVR5cGUsIF9fY29udGFpbmVyX3ZhbHVlX3R5cGU+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgaXNfc2FtZTxfSXRWYWx1ZVR5cGUsIF9fbm9kZV92YWx1ZV90eXBlPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgIl9fYXNzaWduX211bHRpIG1heSBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoZSBjb250YWluZXJzIHZhbHVlIHR5cGUiCisgICAgICAgICAgICAgICAgICAiIG9yIHRoZSBub2RlcyB2YWx1ZSB0eXBlIik7CisgICAgaWYgKGJ1Y2tldF9jb3VudCgpICE9IDApCisgICAgeworICAgICAgICBfX25leHRfcG9pbnRlciBfX2NhY2hlID0gX19kZXRhY2goKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHRyeQorICAgICAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgZm9yICg7IF9fY2FjaGUgIT0gbnVsbHB0ciAmJiBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fY2FjaGUtPl9fdXBjYXN0KCktPl9fdmFsdWVfID0gKl9fZmlyc3Q7CisgICAgICAgICAgICAgICAgX19uZXh0X3BvaW50ZXIgX19uZXh0ID0gX19jYWNoZS0+X19uZXh0XzsKKyAgICAgICAgICAgICAgICBfX25vZGVfaW5zZXJ0X211bHRpKF9fY2FjaGUtPl9fdXBjYXN0KCkpOworICAgICAgICAgICAgICAgIF9fY2FjaGUgPSBfX25leHQ7CisgICAgICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB9CisgICAgICAgIGNhdGNoICguLi4pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fZGVhbGxvY2F0ZV9ub2RlKF9fY2FjaGUpOworICAgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIF9fZGVhbGxvY2F0ZV9ub2RlKF9fY2FjaGUpOworICAgIH0KKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgX19pbnNlcnRfbXVsdGkoX05vZGVUeXBlczo6X19nZXRfdmFsdWUoKl9fZmlyc3QpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgoraW5saW5lCit0eXBlbmFtZSBfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjppdGVyYXRvcgorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6YmVnaW4oKSBfTk9FWENFUFQKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICByZXR1cm4gaXRlcmF0b3IoX19wMV8uZmlyc3QoKS5fX25leHRfLCB0aGlzKTsKKyNlbHNlCisgICAgcmV0dXJuIGl0ZXJhdG9yKF9fcDFfLmZpcnN0KCkuX19uZXh0Xyk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgoraW5saW5lCit0eXBlbmFtZSBfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjppdGVyYXRvcgorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6ZW5kKCkgX05PRVhDRVBUCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgcmV0dXJuIGl0ZXJhdG9yKG51bGxwdHIsIHRoaXMpOworI2Vsc2UKKyAgICByZXR1cm4gaXRlcmF0b3IobnVsbHB0cik7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgoraW5saW5lCit0eXBlbmFtZSBfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+Ojpjb25zdF9pdGVyYXRvcgorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6YmVnaW4oKSBjb25zdCBfTk9FWENFUFQKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX19wMV8uZmlyc3QoKS5fX25leHRfLCB0aGlzKTsKKyNlbHNlCisgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9fcDFfLmZpcnN0KCkuX19uZXh0Xyk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgoraW5saW5lCit0eXBlbmFtZSBfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+Ojpjb25zdF9pdGVyYXRvcgorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6ZW5kKCkgY29uc3QgX05PRVhDRVBUCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKG51bGxwdHIsIHRoaXMpOworI2Vsc2UKKyAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IobnVsbHB0cik7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgordm9pZAorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6Y2xlYXIoKSBfTk9FWENFUFQKK3sKKyAgICBpZiAoc2l6ZSgpID4gMCkKKyAgICB7CisgICAgICAgIF9fZGVhbGxvY2F0ZV9ub2RlKF9fcDFfLmZpcnN0KCkuX19uZXh0Xyk7CisgICAgICAgIF9fcDFfLmZpcnN0KCkuX19uZXh0XyA9IG51bGxwdHI7CisgICAgICAgIHNpemVfdHlwZSBfX2JjID0gYnVja2V0X2NvdW50KCk7CisgICAgICAgIGZvciAoc2l6ZV90eXBlIF9faSA9IDA7IF9faSA8IF9fYmM7ICsrX19pKQorICAgICAgICAgICAgX19idWNrZXRfbGlzdF9bX19pXSA9IG51bGxwdHI7CisgICAgICAgIHNpemUoKSA9IDA7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+CitwYWlyPHR5cGVuYW1lIF9faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Oml0ZXJhdG9yLCBib29sPgorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6X19ub2RlX2luc2VydF91bmlxdWUoX19ub2RlX3BvaW50ZXIgX19uZCkKK3sKKyAgICBfX25kLT5fX2hhc2hfID0gaGFzaF9mdW5jdGlvbigpKF9fbmQtPl9fdmFsdWVfKTsKKyAgICBzaXplX3R5cGUgX19iYyA9IGJ1Y2tldF9jb3VudCgpOworICAgIGJvb2wgX19pbnNlcnRlZCA9IGZhbHNlOworICAgIF9fbmV4dF9wb2ludGVyIF9fbmRwdHI7CisgICAgc2l6ZV90IF9fY2hhc2g7CisgICAgaWYgKF9fYmMgIT0gMCkKKyAgICB7CisgICAgICAgIF9fY2hhc2ggPSBfX2NvbnN0cmFpbl9oYXNoKF9fbmQtPl9faGFzaF8sIF9fYmMpOworICAgICAgICBfX25kcHRyID0gX19idWNrZXRfbGlzdF9bX19jaGFzaF07CisgICAgICAgIGlmIChfX25kcHRyICE9IG51bGxwdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoX19uZHB0ciA9IF9fbmRwdHItPl9fbmV4dF87IF9fbmRwdHIgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb25zdHJhaW5faGFzaChfX25kcHRyLT5fX2hhc2goKSwgX19iYykgPT0gX19jaGFzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uZHB0ciA9IF9fbmRwdHItPl9fbmV4dF8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGtleV9lcSgpKF9fbmRwdHItPl9fdXBjYXN0KCktPl9fdmFsdWVfLCBfX25kLT5fX3ZhbHVlXykpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gX19kb25lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgaWYgKHNpemUoKSsxID4gX19iYyAqIG1heF9sb2FkX2ZhY3RvcigpIHx8IF9fYmMgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVoYXNoKF9WU1REOjptYXg8c2l6ZV90eXBlPigyICogX19iYyArICFfX2lzX2hhc2hfcG93ZXIyKF9fYmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlKGNlaWwoZmxvYXQoc2l6ZSgpICsgMSkgLyBtYXhfbG9hZF9mYWN0b3IoKSkpKSk7CisgICAgICAgICAgICBfX2JjID0gYnVja2V0X2NvdW50KCk7CisgICAgICAgICAgICBfX2NoYXNoID0gX19jb25zdHJhaW5faGFzaChfX25kLT5fX2hhc2hfLCBfX2JjKTsKKyAgICAgICAgfQorICAgICAgICAvLyBpbnNlcnRfYWZ0ZXIgX19idWNrZXRfbGlzdF9bX19jaGFzaF0sIG9yIF9fZmlyc3Rfbm9kZSBpZiBidWNrZXQgaXMgbnVsbAorICAgICAgICBfX25leHRfcG9pbnRlciBfX3BuID0gX19idWNrZXRfbGlzdF9bX19jaGFzaF07CisgICAgICAgIGlmIChfX3BuID09IG51bGxwdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fcG4gPV9fcDFfLmZpcnN0KCkuX19wdHIoKTsKKyAgICAgICAgICAgIF9fbmQtPl9fbmV4dF8gPSBfX3BuLT5fX25leHRfOworICAgICAgICAgICAgX19wbi0+X19uZXh0XyA9IF9fbmQtPl9fcHRyKCk7CisgICAgICAgICAgICAvLyBmaXggdXAgX19idWNrZXRfbGlzdF8KKyAgICAgICAgICAgIF9fYnVja2V0X2xpc3RfW19fY2hhc2hdID0gX19wbjsKKyAgICAgICAgICAgIGlmIChfX25kLT5fX25leHRfICE9IG51bGxwdHIpCisgICAgICAgICAgICAgICAgX19idWNrZXRfbGlzdF9bX19jb25zdHJhaW5faGFzaChfX25kLT5fX25leHRfLT5fX2hhc2goKSwgX19iYyldID0gX19uZC0+X19wdHIoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fbmQtPl9fbmV4dF8gPSBfX3BuLT5fX25leHRfOworICAgICAgICAgICAgX19wbi0+X19uZXh0XyA9IF9fbmQtPl9fcHRyKCk7CisgICAgICAgIH0KKyAgICAgICAgX19uZHB0ciA9IF9fbmQtPl9fcHRyKCk7CisgICAgICAgIC8vIGluY3JlbWVudCBzaXplCisgICAgICAgICsrc2l6ZSgpOworICAgICAgICBfX2luc2VydGVkID0gdHJ1ZTsKKyAgICB9CitfX2RvbmU6CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fbmRwdHIsIHRoaXMpLCBfX2luc2VydGVkKTsKKyNlbHNlCisgICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fbmRwdHIpLCBfX2luc2VydGVkKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+Cit0eXBlbmFtZSBfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjppdGVyYXRvcgorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6X19ub2RlX2luc2VydF9tdWx0aShfX25vZGVfcG9pbnRlciBfX2NwKQoreworICAgIF9fY3AtPl9faGFzaF8gPSBoYXNoX2Z1bmN0aW9uKCkoX19jcC0+X192YWx1ZV8pOworICAgIHNpemVfdHlwZSBfX2JjID0gYnVja2V0X2NvdW50KCk7CisgICAgaWYgKHNpemUoKSsxID4gX19iYyAqIG1heF9sb2FkX2ZhY3RvcigpIHx8IF9fYmMgPT0gMCkKKyAgICB7CisgICAgICAgIHJlaGFzaChfVlNURDo6bWF4PHNpemVfdHlwZT4oMiAqIF9fYmMgKyAhX19pc19oYXNoX3Bvd2VyMihfX2JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlKGNlaWwoZmxvYXQoc2l6ZSgpICsgMSkgLyBtYXhfbG9hZF9mYWN0b3IoKSkpKSk7CisgICAgICAgIF9fYmMgPSBidWNrZXRfY291bnQoKTsKKyAgICB9CisgICAgc2l6ZV90IF9fY2hhc2ggPSBfX2NvbnN0cmFpbl9oYXNoKF9fY3AtPl9faGFzaF8sIF9fYmMpOworICAgIF9fbmV4dF9wb2ludGVyIF9fcG4gPSBfX2J1Y2tldF9saXN0X1tfX2NoYXNoXTsKKyAgICBpZiAoX19wbiA9PSBudWxscHRyKQorICAgIHsKKyAgICAgICAgX19wbiA9X19wMV8uZmlyc3QoKS5fX3B0cigpOworICAgICAgICBfX2NwLT5fX25leHRfID0gX19wbi0+X19uZXh0XzsKKyAgICAgICAgX19wbi0+X19uZXh0XyA9IF9fY3AtPl9fcHRyKCk7CisgICAgICAgIC8vIGZpeCB1cCBfX2J1Y2tldF9saXN0XworICAgICAgICBfX2J1Y2tldF9saXN0X1tfX2NoYXNoXSA9IF9fcG47CisgICAgICAgIGlmIChfX2NwLT5fX25leHRfICE9IG51bGxwdHIpCisgICAgICAgICAgICBfX2J1Y2tldF9saXN0X1tfX2NvbnN0cmFpbl9oYXNoKF9fY3AtPl9fbmV4dF8tPl9faGFzaCgpLCBfX2JjKV0KKyAgICAgICAgICAgICAgICA9IF9fY3AtPl9fcHRyKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoYm9vbCBfX2ZvdW5kID0gZmFsc2U7IF9fcG4tPl9fbmV4dF8gIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbnN0cmFpbl9oYXNoKF9fcG4tPl9fbmV4dF8tPl9faGFzaCgpLCBfX2JjKSA9PSBfX2NoYXNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3BuID0gX19wbi0+X19uZXh0XykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gICAgICBfX2ZvdW5kICAgIGtleV9lcSgpICAgICBhY3Rpb24KKyAgICAgICAgICAgIC8vICAgICAgZmFsc2UgICAgICAgZmFsc2UgICAgICAgbG9vcAorICAgICAgICAgICAgLy8gICAgICB0cnVlICAgICAgICB0cnVlICAgICAgICBsb29wCisgICAgICAgICAgICAvLyAgICAgIGZhbHNlICAgICAgIHRydWUgICAgICAgIHNldCBfX2ZvdW5kIHRvIHRydWUKKyAgICAgICAgICAgIC8vICAgICAgdHJ1ZSAgICAgICAgZmFsc2UgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIChfX2ZvdW5kICE9IChfX3BuLT5fX25leHRfLT5fX2hhc2goKSA9PSBfX2NwLT5fX2hhc2hfICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2VxKCkoX19wbi0+X19uZXh0Xy0+X191cGNhc3QoKS0+X192YWx1ZV8sIF9fY3AtPl9fdmFsdWVfKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFfX2ZvdW5kKQorICAgICAgICAgICAgICAgICAgICBfX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fY3AtPl9fbmV4dF8gPSBfX3BuLT5fX25leHRfOworICAgICAgICBfX3BuLT5fX25leHRfID0gX19jcC0+X19wdHIoKTsKKyAgICAgICAgaWYgKF9fY3AtPl9fbmV4dF8gIT0gbnVsbHB0cikKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IF9fbmhhc2ggPSBfX2NvbnN0cmFpbl9oYXNoKF9fY3AtPl9fbmV4dF8tPl9faGFzaCgpLCBfX2JjKTsKKyAgICAgICAgICAgIGlmIChfX25oYXNoICE9IF9fY2hhc2gpCisgICAgICAgICAgICAgICAgX19idWNrZXRfbGlzdF9bX19uaGFzaF0gPSBfX2NwLT5fX3B0cigpOworICAgICAgICB9CisgICAgfQorICAgICsrc2l6ZSgpOworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIHJldHVybiBpdGVyYXRvcihfX2NwLT5fX3B0cigpLCB0aGlzKTsKKyNlbHNlCisgICAgcmV0dXJuIGl0ZXJhdG9yKF9fY3AtPl9fcHRyKCkpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK3R5cGVuYW1lIF9faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Oml0ZXJhdG9yCitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpfX25vZGVfaW5zZXJ0X211bHRpKAorICAgICAgICBjb25zdF9pdGVyYXRvciBfX3AsIF9fbm9kZV9wb2ludGVyIF9fY3ApCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19maW5kX2NfZnJvbV9pKCZfX3ApID09IHRoaXMsCisgICAgICAgICJ1bm9yZGVyZWQgY29udGFpbmVyOjplbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IsIGFyZ3MuLi4pIGNhbGxlZCB3aXRoIGFuIGl0ZXJhdG9yIG5vdCIKKyAgICAgICAgIiByZWZlcnJpbmcgdG8gdGhpcyB1bm9yZGVyZWQgY29udGFpbmVyIik7CisjZW5kaWYKKyAgICBpZiAoX19wICE9IGVuZCgpICYmIGtleV9lcSgpKCpfX3AsIF9fY3AtPl9fdmFsdWVfKSkKKyAgICB7CisgICAgICAgIF9fbmV4dF9wb2ludGVyIF9fbnAgPSBfX3AuX19ub2RlXzsKKyAgICAgICAgX19jcC0+X19oYXNoXyA9IF9fbnAtPl9faGFzaCgpOworICAgICAgICBzaXplX3R5cGUgX19iYyA9IGJ1Y2tldF9jb3VudCgpOworICAgICAgICBpZiAoc2l6ZSgpKzEgPiBfX2JjICogbWF4X2xvYWRfZmFjdG9yKCkgfHwgX19iYyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZWhhc2goX1ZTVEQ6Om1heDxzaXplX3R5cGU+KDIgKiBfX2JjICsgIV9faXNfaGFzaF9wb3dlcjIoX19iYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUoY2VpbChmbG9hdChzaXplKCkgKyAxKSAvIG1heF9sb2FkX2ZhY3RvcigpKSkpKTsKKyAgICAgICAgICAgIF9fYmMgPSBidWNrZXRfY291bnQoKTsKKyAgICAgICAgfQorICAgICAgICBzaXplX3QgX19jaGFzaCA9IF9fY29uc3RyYWluX2hhc2goX19jcC0+X19oYXNoXywgX19iYyk7CisgICAgICAgIF9fbmV4dF9wb2ludGVyIF9fcHAgPSBfX2J1Y2tldF9saXN0X1tfX2NoYXNoXTsKKyAgICAgICAgd2hpbGUgKF9fcHAtPl9fbmV4dF8gIT0gX19ucCkKKyAgICAgICAgICAgIF9fcHAgPSBfX3BwLT5fX25leHRfOworICAgICAgICBfX2NwLT5fX25leHRfID0gX19ucDsKKyAgICAgICAgX19wcC0+X19uZXh0XyA9IHN0YXRpY19jYXN0PF9fbmV4dF9wb2ludGVyPihfX2NwKTsKKyAgICAgICAgKytzaXplKCk7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgIHJldHVybiBpdGVyYXRvcihzdGF0aWNfY2FzdDxfX25leHRfcG9pbnRlcj4oX19jcCksIHRoaXMpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKHN0YXRpY19jYXN0PF9fbmV4dF9wb2ludGVyPihfX2NwKSk7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIF9fbm9kZV9pbnNlcnRfbXVsdGkoX19jcCk7Cit9CisKKworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIC4uLl9BcmdzPgorcGFpcjx0eXBlbmFtZSBfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjppdGVyYXRvciwgYm9vbD4KK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Ol9fZW1wbGFjZV91bmlxdWVfa2V5X2FyZ3MoX0tleSBjb25zdCYgX19rLCBfQXJncyYmLi4uIF9fYXJncykKKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0FyZ3M+CitwYWlyPHR5cGVuYW1lIF9faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Oml0ZXJhdG9yLCBib29sPgorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6X19lbXBsYWNlX3VuaXF1ZV9rZXlfYXJncyhfS2V5IGNvbnN0JiBfX2ssIF9BcmdzJiBfX2FyZ3MpCisjZW5kaWYKK3sKKworICAgIHNpemVfdCBfX2hhc2ggPSBoYXNoX2Z1bmN0aW9uKCkoX19rKTsKKyAgICBzaXplX3R5cGUgX19iYyA9IGJ1Y2tldF9jb3VudCgpOworICAgIGJvb2wgX19pbnNlcnRlZCA9IGZhbHNlOworICAgIF9fbmV4dF9wb2ludGVyIF9fbmQ7CisgICAgc2l6ZV90IF9fY2hhc2g7CisgICAgaWYgKF9fYmMgIT0gMCkKKyAgICB7CisgICAgICAgIF9fY2hhc2ggPSBfX2NvbnN0cmFpbl9oYXNoKF9faGFzaCwgX19iYyk7CisgICAgICAgIF9fbmQgPSBfX2J1Y2tldF9saXN0X1tfX2NoYXNoXTsKKyAgICAgICAgaWYgKF9fbmQgIT0gbnVsbHB0cikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChfX25kID0gX19uZC0+X19uZXh0XzsgX19uZCAhPSBudWxscHRyICYmCisgICAgICAgICAgICAgICAgKF9fbmQtPl9faGFzaCgpID09IF9faGFzaCB8fCBfX2NvbnN0cmFpbl9oYXNoKF9fbmQtPl9faGFzaCgpLCBfX2JjKSA9PSBfX2NoYXNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uZCA9IF9fbmQtPl9fbmV4dF8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGtleV9lcSgpKF9fbmQtPl9fdXBjYXN0KCktPl9fdmFsdWVfLCBfX2spKQorICAgICAgICAgICAgICAgICAgICBnb3RvIF9fZG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgICAgICBfX25vZGVfaG9sZGVyIF9faCA9IF9fY29uc3RydWN0X25vZGVfaGFzaChfX2hhc2gsIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyNlbHNlCisgICAgICAgIF9fbm9kZV9ob2xkZXIgX19oID0gX19jb25zdHJ1Y3Rfbm9kZV9oYXNoKF9faGFzaCwgX19hcmdzKTsKKyNlbmRpZgorICAgICAgICBpZiAoc2l6ZSgpKzEgPiBfX2JjICogbWF4X2xvYWRfZmFjdG9yKCkgfHwgX19iYyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZWhhc2goX1ZTVEQ6Om1heDxzaXplX3R5cGU+KDIgKiBfX2JjICsgIV9faXNfaGFzaF9wb3dlcjIoX19iYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUoY2VpbChmbG9hdChzaXplKCkgKyAxKSAvIG1heF9sb2FkX2ZhY3RvcigpKSkpKTsKKyAgICAgICAgICAgIF9fYmMgPSBidWNrZXRfY291bnQoKTsKKyAgICAgICAgICAgIF9fY2hhc2ggPSBfX2NvbnN0cmFpbl9oYXNoKF9faGFzaCwgX19iYyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gaW5zZXJ0X2FmdGVyIF9fYnVja2V0X2xpc3RfW19fY2hhc2hdLCBvciBfX2ZpcnN0X25vZGUgaWYgYnVja2V0IGlzIG51bGwKKyAgICAgICAgX19uZXh0X3BvaW50ZXIgX19wbiA9IF9fYnVja2V0X2xpc3RfW19fY2hhc2hdOworICAgICAgICBpZiAoX19wbiA9PSBudWxscHRyKQorICAgICAgICB7CisgICAgICAgICAgICBfX3BuID0gX19wMV8uZmlyc3QoKS5fX3B0cigpOworICAgICAgICAgICAgX19oLT5fX25leHRfID0gX19wbi0+X19uZXh0XzsKKyAgICAgICAgICAgIF9fcG4tPl9fbmV4dF8gPSBfX2guZ2V0KCktPl9fcHRyKCk7CisgICAgICAgICAgICAvLyBmaXggdXAgX19idWNrZXRfbGlzdF8KKyAgICAgICAgICAgIF9fYnVja2V0X2xpc3RfW19fY2hhc2hdID0gX19wbjsKKyAgICAgICAgICAgIGlmIChfX2gtPl9fbmV4dF8gIT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICBfX2J1Y2tldF9saXN0X1tfX2NvbnN0cmFpbl9oYXNoKF9faC0+X19uZXh0Xy0+X19oYXNoKCksIF9fYmMpXQorICAgICAgICAgICAgICAgICAgICA9IF9faC5nZXQoKS0+X19wdHIoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9faC0+X19uZXh0XyA9IF9fcG4tPl9fbmV4dF87CisgICAgICAgICAgICBfX3BuLT5fX25leHRfID0gc3RhdGljX2Nhc3Q8X19uZXh0X3BvaW50ZXI+KF9faC5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgX19uZCA9IHN0YXRpY19jYXN0PF9fbmV4dF9wb2ludGVyPihfX2gucmVsZWFzZSgpKTsKKyAgICAgICAgLy8gaW5jcmVtZW50IHNpemUKKyAgICAgICAgKytzaXplKCk7CisgICAgICAgIF9faW5zZXJ0ZWQgPSB0cnVlOworICAgIH0KK19fZG9uZToKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICByZXR1cm4gcGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoX19uZCwgdGhpcyksIF9faW5zZXJ0ZWQpOworI2Vsc2UKKyAgICByZXR1cm4gcGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoX19uZCksIF9faW5zZXJ0ZWQpOworI2VuZGlmCit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KK3BhaXI8dHlwZW5hbWUgX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6aXRlcmF0b3IsIGJvb2w+CitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpfX2VtcGxhY2VfdW5pcXVlX2ltcGwoX0FyZ3MmJi4uLiBfX2FyZ3MpCit7CisgICAgX19ub2RlX2hvbGRlciBfX2ggPSBfX2NvbnN0cnVjdF9ub2RlKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBfX3IgPSBfX25vZGVfaW5zZXJ0X3VuaXF1ZShfX2guZ2V0KCkpOworICAgIGlmIChfX3Iuc2Vjb25kKQorICAgICAgICBfX2gucmVsZWFzZSgpOworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KK3R5cGVuYW1lIF9faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Oml0ZXJhdG9yCitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpfX2VtcGxhY2VfbXVsdGkoX0FyZ3MmJi4uLiBfX2FyZ3MpCit7CisgICAgX19ub2RlX2hvbGRlciBfX2ggPSBfX2NvbnN0cnVjdF9ub2RlKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICBpdGVyYXRvciBfX3IgPSBfX25vZGVfaW5zZXJ0X211bHRpKF9faC5nZXQoKSk7CisgICAgX19oLnJlbGVhc2UoKTsKKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+Cit0eXBlbmFtZSBfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjppdGVyYXRvcgorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6X19lbXBsYWNlX2hpbnRfbXVsdGkoCisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19maW5kX2NfZnJvbV9pKCZfX3ApID09IHRoaXMsCisgICAgICAgICJ1bm9yZGVyZWQgY29udGFpbmVyOjplbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IsIGFyZ3MuLi4pIGNhbGxlZCB3aXRoIGFuIGl0ZXJhdG9yIG5vdCIKKyAgICAgICAgIiByZWZlcnJpbmcgdG8gdGhpcyB1bm9yZGVyZWQgY29udGFpbmVyIik7CisjZW5kaWYKKyAgICBfX25vZGVfaG9sZGVyIF9faCA9IF9fY29uc3RydWN0X25vZGUoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIGl0ZXJhdG9yIF9fciA9IF9fbm9kZV9pbnNlcnRfbXVsdGkoX19wLCBfX2guZ2V0KCkpOworICAgIF9faC5yZWxlYXNlKCk7CisgICAgcmV0dXJuIF9fcjsKK30KKworI2Vsc2UgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK3R5cGVuYW1lIF9faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Oml0ZXJhdG9yCitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpfX2luc2VydF9tdWx0aShjb25zdCBfX2NvbnRhaW5lcl92YWx1ZV90eXBlJiBfX3gpCit7CisgICAgX19ub2RlX2hvbGRlciBfX2ggPSBfX2NvbnN0cnVjdF9ub2RlKF9feCk7CisgICAgaXRlcmF0b3IgX19yID0gX19ub2RlX2luc2VydF9tdWx0aShfX2guZ2V0KCkpOworICAgIF9faC5yZWxlYXNlKCk7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgordHlwZW5hbWUgX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6aXRlcmF0b3IKK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Ol9faW5zZXJ0X211bHRpKGNvbnN0X2l0ZXJhdG9yIF9fcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fY29udGFpbmVyX3ZhbHVlX3R5cGUmIF9feCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2ZpbmRfY19mcm9tX2koJl9fcCkgPT0gdGhpcywKKyAgICAgICAgInVub3JkZXJlZCBjb250YWluZXI6Omluc2VydChjb25zdF9pdGVyYXRvciwgbHZhbHVlKSBjYWxsZWQgd2l0aCBhbiBpdGVyYXRvciBub3QiCisgICAgICAgICIgcmVmZXJyaW5nIHRvIHRoaXMgdW5vcmRlcmVkIGNvbnRhaW5lciIpOworI2VuZGlmCisgICAgX19ub2RlX2hvbGRlciBfX2ggPSBfX2NvbnN0cnVjdF9ub2RlKF9feCk7CisgICAgaXRlcmF0b3IgX19yID0gX19ub2RlX2luc2VydF9tdWx0aShfX3AsIF9faC5nZXQoKSk7CisgICAgX19oLnJlbGVhc2UoKTsKKyAgICByZXR1cm4gX19yOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpyZWhhc2goc2l6ZV90eXBlIF9fbikKK3sKKyAgICBpZiAoX19uID09IDEpCisgICAgICAgIF9fbiA9IDI7CisgICAgZWxzZSBpZiAoX19uICYgKF9fbiAtIDEpKQorICAgICAgICBfX24gPSBfX25leHRfcHJpbWUoX19uKTsKKyAgICBzaXplX3R5cGUgX19iYyA9IGJ1Y2tldF9jb3VudCgpOworICAgIGlmIChfX24gPiBfX2JjKQorICAgICAgICBfX3JlaGFzaChfX24pOworICAgIGVsc2UgaWYgKF9fbiA8IF9fYmMpCisgICAgeworICAgICAgICBfX24gPSBfVlNURDo6bWF4PHNpemVfdHlwZT4KKyAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgX19uLAorICAgICAgICAgICAgICAgICAgX19pc19oYXNoX3Bvd2VyMihfX2JjKSA/IF9fbmV4dF9oYXNoX3BvdzIoc2l6ZV90KGNlaWwoZmxvYXQoc2l6ZSgpKSAvIG1heF9sb2FkX2ZhY3RvcigpKSkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25leHRfcHJpbWUoc2l6ZV90KGNlaWwoZmxvYXQoc2l6ZSgpKSAvIG1heF9sb2FkX2ZhY3RvcigpKSkpCisgICAgICAgICAgICAgICk7CisgICAgICAgIGlmIChfX24gPCBfX2JjKQorICAgICAgICAgICAgX19yZWhhc2goX19uKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Ol9fcmVoYXNoKHNpemVfdHlwZSBfX25iYykKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2ludmFsaWRhdGVfYWxsKHRoaXMpOworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX3BvaW50ZXJfYWxsb2NhdG9yJiBfX25wYSA9IF9fYnVja2V0X2xpc3RfLmdldF9kZWxldGVyKCkuX19hbGxvYygpOworICAgIF9fYnVja2V0X2xpc3RfLnJlc2V0KF9fbmJjID4gMCA/CisgICAgICAgICAgICAgICAgICAgICAgX19wb2ludGVyX2FsbG9jX3RyYWl0czo6YWxsb2NhdGUoX19ucGEsIF9fbmJjKSA6IG51bGxwdHIpOworICAgIF9fYnVja2V0X2xpc3RfLmdldF9kZWxldGVyKCkuc2l6ZSgpID0gX19uYmM7CisgICAgaWYgKF9fbmJjID4gMCkKKyAgICB7CisgICAgICAgIGZvciAoc2l6ZV90eXBlIF9faSA9IDA7IF9faSA8IF9fbmJjOyArK19faSkKKyAgICAgICAgICAgIF9fYnVja2V0X2xpc3RfW19faV0gPSBudWxscHRyOworICAgICAgICBfX25leHRfcG9pbnRlciBfX3BwID0gX19wMV8uZmlyc3QoKS5fX3B0cigpOworICAgICAgICBfX25leHRfcG9pbnRlciBfX2NwID0gX19wcC0+X19uZXh0XzsKKyAgICAgICAgaWYgKF9fY3AgIT0gbnVsbHB0cikKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90eXBlIF9fY2hhc2ggPSBfX2NvbnN0cmFpbl9oYXNoKF9fY3AtPl9faGFzaCgpLCBfX25iYyk7CisgICAgICAgICAgICBfX2J1Y2tldF9saXN0X1tfX2NoYXNoXSA9IF9fcHA7CisgICAgICAgICAgICBzaXplX3R5cGUgX19waGFzaCA9IF9fY2hhc2g7CisgICAgICAgICAgICBmb3IgKF9fcHAgPSBfX2NwLCBfX2NwID0gX19jcC0+X19uZXh0XzsgX19jcCAhPSBudWxscHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NwID0gX19wcC0+X19uZXh0XykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX2NoYXNoID0gX19jb25zdHJhaW5faGFzaChfX2NwLT5fX2hhc2goKSwgX19uYmMpOworICAgICAgICAgICAgICAgIGlmIChfX2NoYXNoID09IF9fcGhhc2gpCisgICAgICAgICAgICAgICAgICAgIF9fcHAgPSBfX2NwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2J1Y2tldF9saXN0X1tfX2NoYXNoXSA9PSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2J1Y2tldF9saXN0X1tfX2NoYXNoXSA9IF9fcHA7CisgICAgICAgICAgICAgICAgICAgICAgICBfX3BwID0gX19jcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fcGhhc2ggPSBfX2NoYXNoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX19uZXh0X3BvaW50ZXIgX19ucCA9IF9fY3A7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgX19ucC0+X19uZXh0XyAhPSBudWxscHRyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2VxKCkoX19jcC0+X191cGNhc3QoKS0+X192YWx1ZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ucC0+X19uZXh0Xy0+X191cGNhc3QoKS0+X192YWx1ZV8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25wID0gX19ucC0+X19uZXh0XykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgICAgICBfX3BwLT5fX25leHRfID0gX19ucC0+X19uZXh0XzsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fbnAtPl9fbmV4dF8gPSBfX2J1Y2tldF9saXN0X1tfX2NoYXNoXS0+X19uZXh0XzsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVja2V0X2xpc3RfW19fY2hhc2hdLT5fX25leHRfID0gX19jcDsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4KK3R5cGVuYW1lIF9faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Oml0ZXJhdG9yCitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpmaW5kKGNvbnN0IF9LZXkmIF9faykKK3sKKyAgICBzaXplX3QgX19oYXNoID0gaGFzaF9mdW5jdGlvbigpKF9fayk7CisgICAgc2l6ZV90eXBlIF9fYmMgPSBidWNrZXRfY291bnQoKTsKKyAgICBpZiAoX19iYyAhPSAwKQorICAgIHsKKyAgICAgICAgc2l6ZV90IF9fY2hhc2ggPSBfX2NvbnN0cmFpbl9oYXNoKF9faGFzaCwgX19iYyk7CisgICAgICAgIF9fbmV4dF9wb2ludGVyIF9fbmQgPSBfX2J1Y2tldF9saXN0X1tfX2NoYXNoXTsKKyAgICAgICAgaWYgKF9fbmQgIT0gbnVsbHB0cikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChfX25kID0gX19uZC0+X19uZXh0XzsgX19uZCAhPSBudWxscHRyICYmCisgICAgICAgICAgICAgICAgKF9fbmQtPl9faGFzaCgpID09IF9faGFzaAorICAgICAgICAgICAgICAgICAgfHwgX19jb25zdHJhaW5faGFzaChfX25kLT5fX2hhc2goKSwgX19iYykgPT0gX19jaGFzaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbmQgPSBfX25kLT5fX25leHRfKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoX19uZC0+X19oYXNoKCkgPT0gX19oYXNoKQorICAgICAgICAgICAgICAgICAgICAmJiBrZXlfZXEoKShfX25kLT5fX3VwY2FzdCgpLT5fX3ZhbHVlXywgX19rKSkKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9fbmQsIHRoaXMpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9fbmQpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVuZCgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4KK3R5cGVuYW1lIF9faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yCitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpmaW5kKGNvbnN0IF9LZXkmIF9faykgY29uc3QKK3sKKyAgICBzaXplX3QgX19oYXNoID0gaGFzaF9mdW5jdGlvbigpKF9fayk7CisgICAgc2l6ZV90eXBlIF9fYmMgPSBidWNrZXRfY291bnQoKTsKKyAgICBpZiAoX19iYyAhPSAwKQorICAgIHsKKyAgICAgICAgc2l6ZV90IF9fY2hhc2ggPSBfX2NvbnN0cmFpbl9oYXNoKF9faGFzaCwgX19iYyk7CisgICAgICAgIF9fbmV4dF9wb2ludGVyIF9fbmQgPSBfX2J1Y2tldF9saXN0X1tfX2NoYXNoXTsKKyAgICAgICAgaWYgKF9fbmQgIT0gbnVsbHB0cikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChfX25kID0gX19uZC0+X19uZXh0XzsgX19uZCAhPSBudWxscHRyICYmCisgICAgICAgICAgICAgICAgKF9faGFzaCA9PSBfX25kLT5fX2hhc2goKQorICAgICAgICAgICAgICAgICAgICB8fCBfX2NvbnN0cmFpbl9oYXNoKF9fbmQtPl9faGFzaCgpLCBfX2JjKSA9PSBfX2NoYXNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uZCA9IF9fbmQtPl9fbmV4dF8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChfX25kLT5fX2hhc2goKSA9PSBfX2hhc2gpCisgICAgICAgICAgICAgICAgICAgICYmIGtleV9lcSgpKF9fbmQtPl9fdXBjYXN0KCktPl9fdmFsdWVfLCBfX2spKQorI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX19uZCwgdGhpcyk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX19uZCk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorICAgIHJldHVybiBlbmQoKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIC4uLl9BcmdzPgordHlwZW5hbWUgX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6X19ub2RlX2hvbGRlcgorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6X19jb25zdHJ1Y3Rfbm9kZShfQXJncyYmIC4uLl9fYXJncykKK3sKKyAgICBzdGF0aWNfYXNzZXJ0KCFfX2lzX2hhc2hfdmFsdWVfdHlwZTxfQXJncy4uLj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIkNvbnN0cnVjdCBjYW5ub3QgYmUgY2FsbGVkIHdpdGggYSBoYXNoIHZhbHVlIHR5cGUiKTsKKyAgICBfX25vZGVfYWxsb2NhdG9yJiBfX25hID0gX19ub2RlX2FsbG9jKCk7CisgICAgX19ub2RlX2hvbGRlciBfX2goX19ub2RlX3RyYWl0czo6YWxsb2NhdGUoX19uYSwgMSksIF9EcChfX25hKSk7CisgICAgX19ub2RlX3RyYWl0czo6Y29uc3RydWN0KF9fbmEsIF9Ob2RlVHlwZXM6Ol9fZ2V0X3B0cihfX2gtPl9fdmFsdWVfKSwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIF9faC5nZXRfZGVsZXRlcigpLl9fdmFsdWVfY29uc3RydWN0ZWQgPSB0cnVlOworICAgIF9faC0+X19oYXNoXyA9IGhhc2hfZnVuY3Rpb24oKShfX2gtPl9fdmFsdWVfKTsKKyAgICBfX2gtPl9fbmV4dF8gPSBudWxscHRyOworICAgIHJldHVybiBfX2g7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfRmlyc3QsIGNsYXNzIC4uLl9SZXN0PgordHlwZW5hbWUgX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6X19ub2RlX2hvbGRlcgorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6X19jb25zdHJ1Y3Rfbm9kZV9oYXNoKAorICAgIHNpemVfdCBfX2hhc2gsIF9GaXJzdCYmIF9fZiwgX1Jlc3QmJiAuLi5fX3Jlc3QpCit7CisgICAgc3RhdGljX2Fzc2VydCghX19pc19oYXNoX3ZhbHVlX3R5cGU8X0ZpcnN0LCBfUmVzdC4uLj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIkNvbnN0cnVjdCBjYW5ub3QgYmUgY2FsbGVkIHdpdGggYSBoYXNoIHZhbHVlIHR5cGUiKTsKKyAgICBfX25vZGVfYWxsb2NhdG9yJiBfX25hID0gX19ub2RlX2FsbG9jKCk7CisgICAgX19ub2RlX2hvbGRlciBfX2goX19ub2RlX3RyYWl0czo6YWxsb2NhdGUoX19uYSwgMSksIF9EcChfX25hKSk7CisgICAgX19ub2RlX3RyYWl0czo6Y29uc3RydWN0KF9fbmEsIF9Ob2RlVHlwZXM6Ol9fZ2V0X3B0cihfX2gtPl9fdmFsdWVfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X0ZpcnN0PihfX2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZDxfUmVzdD4oX19yZXN0KS4uLik7CisgICAgX19oLmdldF9kZWxldGVyKCkuX192YWx1ZV9jb25zdHJ1Y3RlZCA9IHRydWU7CisgICAgX19oLT5fX2hhc2hfID0gX19oYXNoOworICAgIF9faC0+X19uZXh0XyA9IG51bGxwdHI7CisgICAgcmV0dXJuIF9faDsKK30KKworI2Vsc2UgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+Cit0eXBlbmFtZSBfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpfX25vZGVfaG9sZGVyCitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpfX2NvbnN0cnVjdF9ub2RlKGNvbnN0IF9fY29udGFpbmVyX3ZhbHVlX3R5cGUmIF9fdikKK3sKKyAgICBfX25vZGVfYWxsb2NhdG9yJiBfX25hID0gX19ub2RlX2FsbG9jKCk7CisgICAgX19ub2RlX2hvbGRlciBfX2goX19ub2RlX3RyYWl0czo6YWxsb2NhdGUoX19uYSwgMSksIF9EcChfX25hKSk7CisgICAgX19ub2RlX3RyYWl0czo6Y29uc3RydWN0KF9fbmEsIF9Ob2RlVHlwZXM6Ol9fZ2V0X3B0cihfX2gtPl9fdmFsdWVfKSwgX192KTsKKyAgICBfX2guZ2V0X2RlbGV0ZXIoKS5fX3ZhbHVlX2NvbnN0cnVjdGVkID0gdHJ1ZTsKKyAgICBfX2gtPl9faGFzaF8gPSBoYXNoX2Z1bmN0aW9uKCkoX19oLT5fX3ZhbHVlXyk7CisgICAgX19oLT5fX25leHRfID0gbnVsbHB0cjsKKyAgICByZXR1cm4gX0xJQkNQUF9FWFBMSUNJVF9NT1ZFKF9faCk7ICAvLyBleHBsaWNpdGx5IG1vdmVkIGZvciBDKyswMworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+Cit0eXBlbmFtZSBfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpfX25vZGVfaG9sZGVyCitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpfX2NvbnN0cnVjdF9ub2RlX2hhc2goc2l6ZV90IF9faGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2NvbnRhaW5lcl92YWx1ZV90eXBlJiBfX3YpCit7CisgICAgX19ub2RlX2FsbG9jYXRvciYgX19uYSA9IF9fbm9kZV9hbGxvYygpOworICAgIF9fbm9kZV9ob2xkZXIgX19oKF9fbm9kZV90cmFpdHM6OmFsbG9jYXRlKF9fbmEsIDEpLCBfRHAoX19uYSkpOworICAgIF9fbm9kZV90cmFpdHM6OmNvbnN0cnVjdChfX25hLCBfTm9kZVR5cGVzOjpfX2dldF9wdHIoX19oLT5fX3ZhbHVlXyksIF9fdik7CisgICAgX19oLmdldF9kZWxldGVyKCkuX192YWx1ZV9jb25zdHJ1Y3RlZCA9IHRydWU7CisgICAgX19oLT5fX2hhc2hfID0gX19oYXNoOworICAgIF9faC0+X19uZXh0XyA9IG51bGxwdHI7CisgICAgcmV0dXJuIF9MSUJDUFBfRVhQTElDSVRfTU9WRShfX2gpOyAgLy8gZXhwbGljaXRseSBtb3ZlZCBmb3IgQysrMDMKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgordHlwZW5hbWUgX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6aXRlcmF0b3IKK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46OmVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcCkKK3sKKyAgICBfX25leHRfcG9pbnRlciBfX25wID0gX19wLl9fbm9kZV87CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19maW5kX2NfZnJvbV9pKCZfX3ApID09IHRoaXMsCisgICAgICAgICJ1bm9yZGVyZWQgY29udGFpbmVyIGVyYXNlKGl0ZXJhdG9yKSBjYWxsZWQgd2l0aCBhbiBpdGVyYXRvciBub3QiCisgICAgICAgICIgcmVmZXJyaW5nIHRvIHRoaXMgY29udGFpbmVyIik7CisgICAgX0xJQkNQUF9BU1NFUlQoX19wICE9IGVuZCgpLAorICAgICAgICAidW5vcmRlcmVkIGNvbnRhaW5lciBlcmFzZShpdGVyYXRvcikgY2FsbGVkIHdpdGggYSBub24tZGVyZWZlcmVuY2VhYmxlIGl0ZXJhdG9yIik7CisgICAgaXRlcmF0b3IgX19yKF9fbnAsIHRoaXMpOworI2Vsc2UKKyAgICBpdGVyYXRvciBfX3IoX19ucCk7CisjZW5kaWYKKyAgICArK19fcjsKKyAgICByZW1vdmUoX19wKTsKKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+Cit0eXBlbmFtZSBfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjppdGVyYXRvcgorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6ZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2ZpbmRfY19mcm9tX2koJl9fZmlyc3QpID09IHRoaXMsCisgICAgICAgICJ1bm9kZXJlZCBjb250YWluZXI6OmVyYXNlKGl0ZXJhdG9yLCBpdGVyYXRvcikgY2FsbGVkIHdpdGggYW4gaXRlcmF0b3Igbm90IgorICAgICAgICAiIHJlZmVycmluZyB0byB0aGlzIHVub2RlcmVkIGNvbnRhaW5lciIpOworICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZmluZF9jX2Zyb21faSgmX19sYXN0KSA9PSB0aGlzLAorICAgICAgICAidW5vZGVyZWQgY29udGFpbmVyOjplcmFzZShpdGVyYXRvciwgaXRlcmF0b3IpIGNhbGxlZCB3aXRoIGFuIGl0ZXJhdG9yIG5vdCIKKyAgICAgICAgIiByZWZlcnJpbmcgdG8gdGhpcyB1bm9kZXJlZCBjb250YWluZXIiKTsKKyNlbmRpZgorICAgIGZvciAoY29uc3RfaXRlcmF0b3IgX19wID0gX19maXJzdDsgX19maXJzdCAhPSBfX2xhc3Q7IF9fcCA9IF9fZmlyc3QpCisgICAgeworICAgICAgICArK19fZmlyc3Q7CisgICAgICAgIGVyYXNlKF9fcCk7CisgICAgfQorICAgIF9fbmV4dF9wb2ludGVyIF9fbnAgPSBfX2xhc3QuX19ub2RlXzsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICByZXR1cm4gaXRlcmF0b3IgKF9fbnAsIHRoaXMpOworI2Vsc2UKKyAgICByZXR1cm4gaXRlcmF0b3IgKF9fbnApOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfS2V5PgordHlwZW5hbWUgX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6c2l6ZV90eXBlCitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpfX2VyYXNlX3VuaXF1ZShjb25zdCBfS2V5JiBfX2spCit7CisgICAgaXRlcmF0b3IgX19pID0gZmluZChfX2spOworICAgIGlmIChfX2kgPT0gZW5kKCkpCisgICAgICAgIHJldHVybiAwOworICAgIGVyYXNlKF9faSk7CisgICAgcmV0dXJuIDE7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfS2V5PgordHlwZW5hbWUgX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6c2l6ZV90eXBlCitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpfX2VyYXNlX211bHRpKGNvbnN0IF9LZXkmIF9faykKK3sKKyAgICBzaXplX3R5cGUgX19yID0gMDsKKyAgICBpdGVyYXRvciBfX2kgPSBmaW5kKF9fayk7CisgICAgaWYgKF9faSAhPSBlbmQoKSkKKyAgICB7CisgICAgICAgIGl0ZXJhdG9yIF9fZSA9IGVuZCgpOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBlcmFzZShfX2krKyk7CisgICAgICAgICAgICArK19fcjsKKyAgICAgICAgfSB3aGlsZSAoX19pICE9IF9fZSAmJiBrZXlfZXEoKSgqX19pLCBfX2spKTsKKyAgICB9CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgordHlwZW5hbWUgX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6X19ub2RlX2hvbGRlcgorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6cmVtb3ZlKGNvbnN0X2l0ZXJhdG9yIF9fcCkgX05PRVhDRVBUCit7CisgICAgLy8gY3VycmVudCBub2RlCisgICAgX19uZXh0X3BvaW50ZXIgX19jbiA9IF9fcC5fX25vZGVfOworICAgIHNpemVfdHlwZSBfX2JjID0gYnVja2V0X2NvdW50KCk7CisgICAgc2l6ZV90IF9fY2hhc2ggPSBfX2NvbnN0cmFpbl9oYXNoKF9fY24tPl9faGFzaCgpLCBfX2JjKTsKKyAgICAvLyBmaW5kIHByZXZpb3VzIG5vZGUKKyAgICBfX25leHRfcG9pbnRlciBfX3BuID0gX19idWNrZXRfbGlzdF9bX19jaGFzaF07CisgICAgZm9yICg7IF9fcG4tPl9fbmV4dF8gIT0gX19jbjsgX19wbiA9IF9fcG4tPl9fbmV4dF8pCisgICAgICAgIDsKKyAgICAvLyBGaXggdXAgX19idWNrZXRfbGlzdF8KKyAgICAgICAgLy8gaWYgX19wbiBpcyBub3QgaW4gc2FtZSBidWNrZXQgKGJlZm9yZSBiZWdpbiBpcyBub3QgaW4gc2FtZSBidWNrZXQpICYmCisgICAgICAgIC8vICAgIGlmIF9fY24tPl9fbmV4dF8gaXMgbm90IGluIHNhbWUgYnVja2V0IChudWxscHRyIGlzIG5vdCBpbiBzYW1lIGJ1Y2tldCkKKyAgICBpZiAoX19wbiA9PSBfX3AxXy5maXJzdCgpLl9fcHRyKCkKKyAgICAgICAgICAgIHx8IF9fY29uc3RyYWluX2hhc2goX19wbi0+X19oYXNoKCksIF9fYmMpICE9IF9fY2hhc2gpCisgICAgeworICAgICAgICBpZiAoX19jbi0+X19uZXh0XyA9PSBudWxscHRyCisgICAgICAgICAgICB8fCBfX2NvbnN0cmFpbl9oYXNoKF9fY24tPl9fbmV4dF8tPl9faGFzaCgpLCBfX2JjKSAhPSBfX2NoYXNoKQorICAgICAgICAgICAgX19idWNrZXRfbGlzdF9bX19jaGFzaF0gPSBudWxscHRyOworICAgIH0KKyAgICAgICAgLy8gaWYgX19jbi0+X19uZXh0XyBpcyBub3QgaW4gc2FtZSBidWNrZXQgKG51bGxwdHIgaXMgaW4gc2FtZSBidWNrZXQpCisgICAgaWYgKF9fY24tPl9fbmV4dF8gIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIHNpemVfdCBfX25oYXNoID0gX19jb25zdHJhaW5faGFzaChfX2NuLT5fX25leHRfLT5fX2hhc2goKSwgX19iYyk7CisgICAgICAgIGlmIChfX25oYXNoICE9IF9fY2hhc2gpCisgICAgICAgICAgICBfX2J1Y2tldF9saXN0X1tfX25oYXNoXSA9IF9fcG47CisgICAgfQorICAgIC8vIHJlbW92ZSBfX2NuCisgICAgX19wbi0+X19uZXh0XyA9IF9fY24tPl9fbmV4dF87CisgICAgX19jbi0+X19uZXh0XyA9IG51bGxwdHI7CisgICAgLS1zaXplKCk7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19jX25vZGUqIF9fYyA9IF9fZ2V0X2RiKCktPl9fZmluZF9jX2FuZF9sb2NrKHRoaXMpOworICAgIGZvciAoX19pX25vZGUqKiBfX2RwID0gX19jLT5lbmRfOyBfX2RwICE9IF9fYy0+YmVnXzsgKQorICAgIHsKKyAgICAgICAgLS1fX2RwOworICAgICAgICBpdGVyYXRvciogX19pID0gc3RhdGljX2Nhc3Q8aXRlcmF0b3IqPigoKl9fZHApLT5fX2lfKTsKKyAgICAgICAgaWYgKF9faS0+X19ub2RlXyA9PSBfX2NuKQorICAgICAgICB7CisgICAgICAgICAgICAoKl9fZHApLT5fX2NfID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGlmICgtLV9fYy0+ZW5kXyAhPSBfX2RwKQorICAgICAgICAgICAgICAgIG1lbW1vdmUoX19kcCwgX19kcCsxLCAoX19jLT5lbmRfIC0gX19kcCkqc2l6ZW9mKF9faV9ub2RlKikpOworICAgICAgICB9CisgICAgfQorICAgIF9fZ2V0X2RiKCktPnVubG9jaygpOworI2VuZGlmCisgICAgcmV0dXJuIF9fbm9kZV9ob2xkZXIoX19jbi0+X191cGNhc3QoKSwgX0RwKF9fbm9kZV9hbGxvYygpLCB0cnVlKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfS2V5PgoraW5saW5lCit0eXBlbmFtZSBfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpzaXplX3R5cGUKK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Ol9fY291bnRfdW5pcXVlKGNvbnN0IF9LZXkmIF9faykgY29uc3QKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihmaW5kKF9faykgIT0gZW5kKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4KK3R5cGVuYW1lIF9faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46OnNpemVfdHlwZQorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6X19jb3VudF9tdWx0aShjb25zdCBfS2V5JiBfX2spIGNvbnN0Cit7CisgICAgc2l6ZV90eXBlIF9fciA9IDA7CisgICAgY29uc3RfaXRlcmF0b3IgX19pID0gZmluZChfX2spOworICAgIGlmIChfX2kgIT0gZW5kKCkpCisgICAgeworICAgICAgICBjb25zdF9pdGVyYXRvciBfX2UgPSBlbmQoKTsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgKytfX2k7CisgICAgICAgICAgICArK19fcjsKKyAgICAgICAgfSB3aGlsZSAoX19pICE9IF9fZSAmJiBrZXlfZXEoKSgqX19pLCBfX2spKTsKKyAgICB9CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9LZXk+CitwYWlyPHR5cGVuYW1lIF9faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Oml0ZXJhdG9yLAorICAgICB0eXBlbmFtZSBfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjppdGVyYXRvcj4KK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Ol9fZXF1YWxfcmFuZ2VfdW5pcXVlKAorICAgICAgICBjb25zdCBfS2V5JiBfX2spCit7CisgICAgaXRlcmF0b3IgX19pID0gZmluZChfX2spOworICAgIGl0ZXJhdG9yIF9faiA9IF9faTsKKyAgICBpZiAoX19pICE9IGVuZCgpKQorICAgICAgICArK19fajsKKyAgICByZXR1cm4gcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+KF9faSwgX19qKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9LZXk+CitwYWlyPHR5cGVuYW1lIF9faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yLAorICAgICB0eXBlbmFtZSBfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+Ojpjb25zdF9pdGVyYXRvcj4KK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Ol9fZXF1YWxfcmFuZ2VfdW5pcXVlKAorICAgICAgICBjb25zdCBfS2V5JiBfX2spIGNvbnN0Cit7CisgICAgY29uc3RfaXRlcmF0b3IgX19pID0gZmluZChfX2spOworICAgIGNvbnN0X2l0ZXJhdG9yIF9faiA9IF9faTsKKyAgICBpZiAoX19pICE9IGVuZCgpKQorICAgICAgICArK19fajsKKyAgICByZXR1cm4gcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+KF9faSwgX19qKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9LZXk+CitwYWlyPHR5cGVuYW1lIF9faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Oml0ZXJhdG9yLAorICAgICB0eXBlbmFtZSBfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjppdGVyYXRvcj4KK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Ol9fZXF1YWxfcmFuZ2VfbXVsdGkoCisgICAgICAgIGNvbnN0IF9LZXkmIF9faykKK3sKKyAgICBpdGVyYXRvciBfX2kgPSBmaW5kKF9fayk7CisgICAgaXRlcmF0b3IgX19qID0gX19pOworICAgIGlmIChfX2kgIT0gZW5kKCkpCisgICAgeworICAgICAgICBpdGVyYXRvciBfX2UgPSBlbmQoKTsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgKytfX2o7CisgICAgICAgIH0gd2hpbGUgKF9faiAhPSBfX2UgJiYga2V5X2VxKCkoKl9faiwgX19rKSk7CisgICAgfQorICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4oX19pLCBfX2opOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4KK3BhaXI8dHlwZW5hbWUgX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6Y29uc3RfaXRlcmF0b3IsCisgICAgIHR5cGVuYW1lIF9faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yPgorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6X19lcXVhbF9yYW5nZV9tdWx0aSgKKyAgICAgICAgY29uc3QgX0tleSYgX19rKSBjb25zdAoreworICAgIGNvbnN0X2l0ZXJhdG9yIF9faSA9IGZpbmQoX19rKTsKKyAgICBjb25zdF9pdGVyYXRvciBfX2ogPSBfX2k7CisgICAgaWYgKF9faSAhPSBlbmQoKSkKKyAgICB7CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZSA9IGVuZCgpOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICArK19fajsKKyAgICAgICAgfSB3aGlsZSAoX19qICE9IF9fZSAmJiBrZXlfZXEoKSgqX19qLCBfX2spKTsKKyAgICB9CisgICAgcmV0dXJuIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPihfX2ksIF9faik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46OnN3YXAoX19oYXNoX3RhYmxlJiBfX3UpCisjaWYgX0xJQkNQUF9TVERfVkVSIDw9IDExCisgICAgX05PRVhDRVBUX0RFQlVHXygKKyAgICAgICAgX19pc19ub3Rocm93X3N3YXBwYWJsZTxoYXNoZXI+Ojp2YWx1ZSAmJiBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPGtleV9lcXVhbD46OnZhbHVlCisgICAgICAgICYmICghYWxsb2NhdG9yX3RyYWl0czxfX3BvaW50ZXJfYWxsb2NhdG9yPjo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwOjp2YWx1ZQorICAgICAgICAgICAgICB8fCBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPF9fcG9pbnRlcl9hbGxvY2F0b3I+Ojp2YWx1ZSkKKyAgICAgICAgJiYgKCFfX25vZGVfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXA6OnZhbHVlCisgICAgICAgICAgICAgIHx8IF9faXNfbm90aHJvd19zd2FwcGFibGU8X19ub2RlX2FsbG9jYXRvcj46OnZhbHVlKQorICAgICAgICAgICAgKQorI2Vsc2UKKyAgX05PRVhDRVBUX0RFQlVHXyhfX2lzX25vdGhyb3dfc3dhcHBhYmxlPGhhc2hlcj46OnZhbHVlICYmIF9faXNfbm90aHJvd19zd2FwcGFibGU8a2V5X2VxdWFsPjo6dmFsdWUpCisjZW5kaWYKK3sKKyAgICBfTElCQ1BQX0FTU0VSVChfX25vZGVfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXA6OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgdGhpcy0+X19ub2RlX2FsbG9jKCkgPT0gX191Ll9fbm9kZV9hbGxvYygpLAorICAgICAgICAgICAgICAgICAgICJsaXN0Ojpzd2FwOiBFaXRoZXIgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwIG11c3QgYmUgdHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAiIG9yIHRoZSBhbGxvY2F0b3JzIG11c3QgY29tcGFyZSBlcXVhbCIpOworICAgIHsKKyAgICBfX25vZGVfcG9pbnRlcl9wb2ludGVyIF9fbnBwID0gX19idWNrZXRfbGlzdF8ucmVsZWFzZSgpOworICAgIF9fYnVja2V0X2xpc3RfLnJlc2V0KF9fdS5fX2J1Y2tldF9saXN0Xy5yZWxlYXNlKCkpOworICAgIF9fdS5fX2J1Y2tldF9saXN0Xy5yZXNldChfX25wcCk7CisgICAgfQorICAgIF9WU1REOjpzd2FwKF9fYnVja2V0X2xpc3RfLmdldF9kZWxldGVyKCkuc2l6ZSgpLCBfX3UuX19idWNrZXRfbGlzdF8uZ2V0X2RlbGV0ZXIoKS5zaXplKCkpOworICAgIF9fc3dhcF9hbGxvY2F0b3IoX19idWNrZXRfbGlzdF8uZ2V0X2RlbGV0ZXIoKS5fX2FsbG9jKCksCisgICAgICAgICAgICAgX191Ll9fYnVja2V0X2xpc3RfLmdldF9kZWxldGVyKCkuX19hbGxvYygpKTsKKyAgICBfX3N3YXBfYWxsb2NhdG9yKF9fbm9kZV9hbGxvYygpLCBfX3UuX19ub2RlX2FsbG9jKCkpOworICAgIF9WU1REOjpzd2FwKF9fcDFfLmZpcnN0KCkuX19uZXh0XywgX191Ll9fcDFfLmZpcnN0KCkuX19uZXh0Xyk7CisgICAgX19wMl8uc3dhcChfX3UuX19wMl8pOworICAgIF9fcDNfLnN3YXAoX191Ll9fcDNfKTsKKyAgICBpZiAoc2l6ZSgpID4gMCkKKyAgICAgICAgX19idWNrZXRfbGlzdF9bX19jb25zdHJhaW5faGFzaChfX3AxXy5maXJzdCgpLl9fbmV4dF8tPl9faGFzaCgpLCBidWNrZXRfY291bnQoKSldID0KKyAgICAgICAgICAgIF9fcDFfLmZpcnN0KCkuX19wdHIoKTsKKyAgICBpZiAoX191LnNpemUoKSA+IDApCisgICAgICAgIF9fdS5fX2J1Y2tldF9saXN0X1tfX2NvbnN0cmFpbl9oYXNoKF9fdS5fX3AxXy5maXJzdCgpLl9fbmV4dF8tPl9faGFzaCgpLCBfX3UuYnVja2V0X2NvdW50KCkpXSA9CisgICAgICAgICAgICBfX3UuX19wMV8uZmlyc3QoKS5fX3B0cigpOworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPnN3YXAodGhpcywgJl9fdSk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgordHlwZW5hbWUgX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6c2l6ZV90eXBlCitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpidWNrZXRfc2l6ZShzaXplX3R5cGUgX19uKSBjb25zdAoreworICAgIF9MSUJDUFBfQVNTRVJUKF9fbiA8IGJ1Y2tldF9jb3VudCgpLAorICAgICAgICAidW5vcmRlcmVkIGNvbnRhaW5lcjo6YnVja2V0X3NpemUobikgY2FsbGVkIHdpdGggbiA+PSBidWNrZXRfY291bnQoKSIpOworICAgIF9fbmV4dF9wb2ludGVyIF9fbnAgPSBfX2J1Y2tldF9saXN0X1tfX25dOworICAgIHNpemVfdHlwZSBfX2JjID0gYnVja2V0X2NvdW50KCk7CisgICAgc2l6ZV90eXBlIF9fciA9IDA7CisgICAgaWYgKF9fbnAgIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIGZvciAoX19ucCA9IF9fbnAtPl9fbmV4dF87IF9fbnAgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbnN0cmFpbl9oYXNoKF9fbnAtPl9faGFzaCgpLCBfX2JjKSA9PSBfX247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ucCA9IF9fbnAtPl9fbmV4dF8sICsrX19yKQorICAgICAgICAgICAgOworICAgIH0KKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+JiBfX3gsCisgICAgIF9faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz4mIF9feSkKKyAgICBfTk9FWENFUFRfKF9OT0VYQ0VQVF8oX194LnN3YXAoX195KSkpCit7CisgICAgX194LnN3YXAoX195KTsKK30KKworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0VxdWFsLCBjbGFzcyBfQWxsb2M+Citib29sCitfX2hhc2hfdGFibGU8X1RwLCBfSGFzaCwgX0VxdWFsLCBfQWxsb2M+OjpfX2RlcmVmZXJlbmNlYWJsZShjb25zdCBjb25zdF9pdGVyYXRvciogX19pKSBjb25zdAoreworICAgIHJldHVybiBfX2ktPl9fbm9kZV8gIT0gbnVsbHB0cjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9FcXVhbCwgY2xhc3MgX0FsbG9jPgorYm9vbAorX19oYXNoX3RhYmxlPF9UcCwgX0hhc2gsIF9FcXVhbCwgX0FsbG9jPjo6X19kZWNyZW1lbnRhYmxlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yKikgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK2Jvb2wKK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Ol9fYWRkYWJsZShjb25zdCBjb25zdF9pdGVyYXRvciosIHB0cmRpZmZfdCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfRXF1YWwsIGNsYXNzIF9BbGxvYz4KK2Jvb2wKK19faGFzaF90YWJsZTxfVHAsIF9IYXNoLCBfRXF1YWwsIF9BbGxvYz46Ol9fc3Vic2NyaXB0YWJsZShjb25zdCBjb25zdF9pdGVyYXRvciosIHB0cmRpZmZfdCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworX0xJQkNQUF9QT1BfTUFDUk9TCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9fSEFTSF9UQUJMRQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fbGliY3BwX3ZlcnNpb24gYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX19saWJjcHBfdmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmRjNjUzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fbGliY3BwX3ZlcnNpb24KQEAgLTAsMCArMSBAQAorNzAwMApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fbG9jYWxlIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fbG9jYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMWYwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX19sb2NhbGUKQEAgLTAsMCArMSwxNTI3IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX19fTE9DQUxFCisjZGVmaW5lIF9MSUJDUFBfX19MT0NBTEUKKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNpZiBkZWZpbmVkKF9MSUJDUFBfTVNWQ1JUX0xJS0UpCisjIGluY2x1ZGUgPHN1cHBvcnQvd2luMzIvbG9jYWxlX3dpbjMyLmg+CisjZWxpZiBkZWZpbmVkKF9BSVgpCisjIGluY2x1ZGUgPHN1cHBvcnQvaWJtL3hsb2NhbGUuaD4KKyNlbGlmIGRlZmluZWQoX19BTkRST0lEX18pCisvLyBBbmRyb2lkIGdhaW5lZCB0aGUgbG9jYWxlIGF3YXJlIGZ1bmN0aW9ucyBpbiBMIChBUEkgbGV2ZWwgMjEpCisjIGluY2x1ZGUgPGFuZHJvaWQvYXBpLWxldmVsLmg+CisjIGlmIF9fQU5EUk9JRF9BUElfXyA8PSAyMAorIyAgaW5jbHVkZSA8c3VwcG9ydC9hbmRyb2lkL2xvY2FsZV9iaW9uaWMuaD4KKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQoX19zdW5fXykKKyMgaW5jbHVkZSA8eGxvY2FsZS5oPgorIyBpbmNsdWRlIDxzdXBwb3J0L3NvbGFyaXMveGxvY2FsZS5oPgorI2VsaWYgZGVmaW5lZChfTkVXTElCX1ZFUlNJT04pCisjIGluY2x1ZGUgPHN1cHBvcnQvbmV3bGliL3hsb2NhbGUuaD4KKyNlbGlmIChkZWZpbmVkKF9fQVBQTEVfXykgICAgICB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSBcCisgICAgfHwgZGVmaW5lZChfX0VNU0NSSVBURU5fXykgfHwgZGVmaW5lZChfX0lCTUNQUF9fKSkKKyMgaW5jbHVkZSA8eGxvY2FsZS5oPgorI2VsaWYgZGVmaW5lZChfX0Z1Y2hzaWFfXykKKyMgaW5jbHVkZSA8c3VwcG9ydC9mdWNoc2lhL3hsb2NhbGUuaD4KKyNlbGlmIGRlZmluZWQoX0xJQkNQUF9IQVNfTVVTTF9MSUJDKQorIyBpbmNsdWRlIDxzdXBwb3J0L211c2wveGxvY2FsZS5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKworI2lmICFkZWZpbmVkKF9MSUJDUFBfTE9DQUxFX19MX0VYVEVOU0lPTlMpCitzdHJ1Y3QgX19saWJjcHBfbG9jYWxlX2d1YXJkIHsKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBfX2xpYmNwcF9sb2NhbGVfZ3VhcmQobG9jYWxlX3QmIF9fbG9jKSA6IF9fb2xkX2xvY18odXNlbG9jYWxlKF9fbG9jKSkge30KKworICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIH5fX2xpYmNwcF9sb2NhbGVfZ3VhcmQoKSB7CisgICAgaWYgKF9fb2xkX2xvY18pCisgICAgICB1c2Vsb2NhbGUoX19vbGRfbG9jXyk7CisgIH0KKworICBsb2NhbGVfdCBfX29sZF9sb2NfOworcHJpdmF0ZToKKyAgX19saWJjcHBfbG9jYWxlX2d1YXJkKF9fbGliY3BwX2xvY2FsZV9ndWFyZCBjb25zdCYpOworICBfX2xpYmNwcF9sb2NhbGVfZ3VhcmQmIG9wZXJhdG9yPShfX2xpYmNwcF9sb2NhbGVfZ3VhcmQgY29uc3QmKTsKK307CisjZWxpZiBkZWZpbmVkKF9MSUJDUFBfTVNWQ1JUX0xJS0UpCitzdHJ1Y3QgX19saWJjcHBfbG9jYWxlX2d1YXJkIHsKKyAgICBfX2xpYmNwcF9sb2NhbGVfZ3VhcmQobG9jYWxlX3QgX19sKSA6CisgICAgICAgIF9fc3RhdHVzKF9jb25maWd0aHJlYWRsb2NhbGUoX0VOQUJMRV9QRVJfVEhSRUFEX0xPQ0FMRSkpLAorICAgICAgICBfX2xvY2FsZV9jb2xsYXRlKHNldGxvY2FsZShMQ19DT0xMQVRFLCBfX2wuX19nZXRfbG9jYWxlKCkpKSwKKyAgICAgICAgX19sb2NhbGVfY3R5cGUoc2V0bG9jYWxlKExDX0NUWVBFLCBfX2wuX19nZXRfbG9jYWxlKCkpKSwKKyAgICAgICAgX19sb2NhbGVfbW9uZXRhcnkoc2V0bG9jYWxlKExDX01PTkVUQVJZLCBfX2wuX19nZXRfbG9jYWxlKCkpKSwKKyAgICAgICAgX19sb2NhbGVfbnVtZXJpYyhzZXRsb2NhbGUoTENfTlVNRVJJQywgX19sLl9fZ2V0X2xvY2FsZSgpKSksCisgICAgICAgIF9fbG9jYWxlX3RpbWUoc2V0bG9jYWxlKExDX1RJTUUsIF9fbC5fX2dldF9sb2NhbGUoKSkpCisgICAgICAgIC8vIExDX01FU1NBR0VTIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4KKyAgICB7fQorICAgIH5fX2xpYmNwcF9sb2NhbGVfZ3VhcmQoKSB7CisgICAgICAgIHNldGxvY2FsZShMQ19DT0xMQVRFLCBfX2xvY2FsZV9jb2xsYXRlKTsKKyAgICAgICAgc2V0bG9jYWxlKExDX0NUWVBFLCBfX2xvY2FsZV9jdHlwZSk7CisgICAgICAgIHNldGxvY2FsZShMQ19NT05FVEFSWSwgX19sb2NhbGVfbW9uZXRhcnkpOworICAgICAgICBzZXRsb2NhbGUoTENfTlVNRVJJQywgX19sb2NhbGVfbnVtZXJpYyk7CisgICAgICAgIHNldGxvY2FsZShMQ19USU1FLCBfX2xvY2FsZV90aW1lKTsKKyAgICAgICAgX2NvbmZpZ3RocmVhZGxvY2FsZShfX3N0YXR1cyk7CisgICAgfQorICAgIGludCBfX3N0YXR1czsKKyAgICBjaGFyKiBfX2xvY2FsZV9jb2xsYXRlOworICAgIGNoYXIqIF9fbG9jYWxlX2N0eXBlOworICAgIGNoYXIqIF9fbG9jYWxlX21vbmV0YXJ5OworICAgIGNoYXIqIF9fbG9jYWxlX251bWVyaWM7CisgICAgY2hhciogX19sb2NhbGVfdGltZTsKK307CisjZW5kaWYKKworCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIGxvY2FsZTsKKwordGVtcGxhdGUgPGNsYXNzIF9GYWNldD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK2hhc19mYWNldChjb25zdCBsb2NhbGUmKSBfTk9FWENFUFQ7CisKK3RlbXBsYXRlIDxjbGFzcyBfRmFjZXQ+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdCBfRmFjZXQmCit1c2VfZmFjZXQoY29uc3QgbG9jYWxlJik7CisKK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgbG9jYWxlCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXM6CisgICAgY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBmYWNldDsKKyAgICBjbGFzcyBfTElCQ1BQX1RZUEVfVklTIGlkOworCisgICAgdHlwZWRlZiBpbnQgY2F0ZWdvcnk7CisgICAgX0xJQkNQUF9BVkFJTEFCSUxJVFlfTE9DQUxFX0NBVEVHT1JZCisgICAgc3RhdGljIGNvbnN0IGNhdGVnb3J5IC8vIHZhbHVlcyBhc3NpZ25lZCBoZXJlIGFyZSBmb3IgZXhwb3NpdGlvbiBvbmx5CisgICAgICAgIG5vbmUgICAgID0gMCwKKyAgICAgICAgY29sbGF0ZSAgPSBMQ19DT0xMQVRFX01BU0ssCisgICAgICAgIGN0eXBlICAgID0gTENfQ1RZUEVfTUFTSywKKyAgICAgICAgbW9uZXRhcnkgPSBMQ19NT05FVEFSWV9NQVNLLAorICAgICAgICBudW1lcmljICA9IExDX05VTUVSSUNfTUFTSywKKyAgICAgICAgdGltZSAgICAgPSBMQ19USU1FX01BU0ssCisgICAgICAgIG1lc3NhZ2VzID0gTENfTUVTU0FHRVNfTUFTSywKKyAgICAgICAgYWxsID0gY29sbGF0ZSB8IGN0eXBlIHwgbW9uZXRhcnkgfCBudW1lcmljIHwgdGltZSB8IG1lc3NhZ2VzOworCisgICAgLy8gY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICBsb2NhbGUoKSAgX05PRVhDRVBUOworICAgIGxvY2FsZShjb25zdCBsb2NhbGUmKSAgX05PRVhDRVBUOworICAgIGV4cGxpY2l0IGxvY2FsZShjb25zdCBjaGFyKik7CisgICAgZXhwbGljaXQgbG9jYWxlKGNvbnN0IHN0cmluZyYpOworICAgIGxvY2FsZShjb25zdCBsb2NhbGUmLCBjb25zdCBjaGFyKiwgY2F0ZWdvcnkpOworICAgIGxvY2FsZShjb25zdCBsb2NhbGUmLCBjb25zdCBzdHJpbmcmLCBjYXRlZ29yeSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9GYWNldD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb2NhbGUoY29uc3QgbG9jYWxlJiwgX0ZhY2V0Kik7CisgICAgbG9jYWxlKGNvbnN0IGxvY2FsZSYsIGNvbnN0IGxvY2FsZSYsIGNhdGVnb3J5KTsKKworICAgIH5sb2NhbGUoKTsKKworICAgIGNvbnN0IGxvY2FsZSYgb3BlcmF0b3I9KGNvbnN0IGxvY2FsZSYpICBfTk9FWENFUFQ7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PgorICAgICAgX0xJQkNQUF9NRVRIT0RfVEVNUExBVEVfSU1QTElDSVRfSU5TVEFOVElBVElPTl9WSVMKKyAgICAgIGxvY2FsZSBjb21iaW5lKGNvbnN0IGxvY2FsZSYpIGNvbnN0OworCisgICAgLy8gbG9jYWxlIG9wZXJhdGlvbnM6CisgICAgc3RyaW5nIG5hbWUoKSBjb25zdDsKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgbG9jYWxlJikgY29uc3Q7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGxvY2FsZSYgX195KSBjb25zdCB7cmV0dXJuICEoKnRoaXMgPT0gX195KTt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KKyAgICAgIF9MSUJDUFBfTUVUSE9EX1RFTVBMQVRFX0lNUExJQ0lUX0lOU1RBTlRJQVRJT05fVklTCisgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JikgY29uc3Q7CisKKyAgICAvLyBnbG9iYWwgbG9jYWxlIG9iamVjdHM6CisgICAgc3RhdGljIGxvY2FsZSBnbG9iYWwoY29uc3QgbG9jYWxlJik7CisgICAgc3RhdGljIGNvbnN0IGxvY2FsZSYgY2xhc3NpYygpOworCitwcml2YXRlOgorICAgIGNsYXNzIF9faW1wOworICAgIF9faW1wKiBfX2xvY2FsZV87CisKKyAgICB2b2lkIF9faW5zdGFsbF9jdG9yKGNvbnN0IGxvY2FsZSYsIGZhY2V0KiwgbG9uZyk7CisgICAgc3RhdGljIGxvY2FsZSYgX19nbG9iYWwoKTsKKyAgICBib29sIGhhc19mYWNldChpZCYpIGNvbnN0OworICAgIGNvbnN0IGZhY2V0KiB1c2VfZmFjZXQoaWQmKSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRmFjZXQ+IGZyaWVuZCBib29sIGhhc19mYWNldChjb25zdCBsb2NhbGUmKSAgX05PRVhDRVBUOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRmFjZXQ+IGZyaWVuZCBjb25zdCBfRmFjZXQmIHVzZV9mYWNldChjb25zdCBsb2NhbGUmKTsKK307CisKK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgbG9jYWxlOjpmYWNldAorICAgIDogcHVibGljIF9fc2hhcmVkX2NvdW50Cit7Citwcm90ZWN0ZWQ6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IGZhY2V0KHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgICA6IF9fc2hhcmVkX2NvdW50KHN0YXRpY19jYXN0PGxvbmc+KF9fcmVmcyktMSkge30KKworICAgIHZpcnR1YWwgfmZhY2V0KCk7CisKKy8vICAgIGZhY2V0KGNvbnN0IGZhY2V0JikgPSBkZWxldGU7ICAgICAvLyBlZmZlY3RpdmVseSBkb25lIGluIF9fc2hhcmVkX2NvdW50CisvLyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBmYWNldCYpID0gZGVsZXRlOworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIHZvaWQgX19vbl96ZXJvX3NoYXJlZCgpIF9OT0VYQ0VQVDsKK307CisKK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgbG9jYWxlOjppZAoreworICAgIG9uY2VfZmxhZyAgICAgIF9fZmxhZ187CisgICAgaW50MzJfdCAgICAgICAgX19pZF87CisKKyAgICBzdGF0aWMgaW50MzJfdCBfX25leHRfaWQ7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUiBpZCgpIDpfX2lkXygwKSB7fQorcHJpdmF0ZToKKyAgICB2b2lkIF9faW5pdCgpOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IGlkJik7IC8vID0gZGVsZXRlOworICAgIGlkKGNvbnN0IGlkJik7IC8vID0gZGVsZXRlOworcHVibGljOiAgLy8gb25seSBuZWVkZWQgZm9yIHRlc3RzCisgICAgbG9uZyBfX2dldCgpOworCisgICAgZnJpZW5kIGNsYXNzIGxvY2FsZTsKKyAgICBmcmllbmQgY2xhc3MgbG9jYWxlOjpfX2ltcDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfRmFjZXQ+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorbG9jYWxlOjpsb2NhbGUoY29uc3QgbG9jYWxlJiBfX290aGVyLCBfRmFjZXQqIF9fZikKK3sKKyAgICBfX2luc3RhbGxfY3RvcihfX290aGVyLCBfX2YsIF9fZiA/IF9fZi0+aWQuX19nZXQoKSA6IDApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PgorbG9jYWxlCitsb2NhbGU6OmNvbWJpbmUoY29uc3QgbG9jYWxlJiBfX290aGVyKSBjb25zdAoreworICAgIGlmICghX1ZTVEQ6Omhhc19mYWNldDxfRmFjZXQ+KF9fb3RoZXIpKQorICAgICAgICBfX3Rocm93X3J1bnRpbWVfZXJyb3IoImxvY2FsZTo6Y29tYmluZTogbG9jYWxlIG1pc3NpbmcgZmFjZXQiKTsKKworICAgIHJldHVybiBsb2NhbGUoKnRoaXMsICZjb25zdF9jYXN0PF9GYWNldCY+KF9WU1REOjp1c2VfZmFjZXQ8X0ZhY2V0PihfX290aGVyKSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK2hhc19mYWNldChjb25zdCBsb2NhbGUmIF9fbCkgIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX2wuaGFzX2ZhY2V0KF9GYWNldDo6aWQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZhY2V0PgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0IF9GYWNldCYKK3VzZV9mYWNldChjb25zdCBsb2NhbGUmIF9fbCkKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgX0ZhY2V0Jj4oKl9fbC51c2VfZmFjZXQoX0ZhY2V0OjppZCkpOworfQorCisvLyB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiBjbGFzcyBjb2xsYXRlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgY29sbGF0ZQorICAgIDogcHVibGljIGxvY2FsZTo6ZmFjZXQKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9DaGFyVCBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcl90eXBlPiBzdHJpbmdfdHlwZTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBjb2xsYXRlKHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgICA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGludCBjb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogX19sbzEsIGNvbnN0IGNoYXJfdHlwZSogX19oaTEsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhcl90eXBlKiBfX2xvMiwgY29uc3QgY2hhcl90eXBlKiBfX2hpMikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19jb21wYXJlKF9fbG8xLCBfX2hpMSwgX19sbzIsIF9faGkyKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RyaW5nX3R5cGUgdHJhbnNmb3JtKGNvbnN0IGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX3RyYW5zZm9ybShfX2xvLCBfX2hpKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgbG9uZyBoYXNoKGNvbnN0IGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX2hhc2goX19sbywgX19oaSk7CisgICAgfQorCisgICAgc3RhdGljIGxvY2FsZTo6aWQgaWQ7CisKK3Byb3RlY3RlZDoKKyAgICB+Y29sbGF0ZSgpOworICAgIHZpcnR1YWwgaW50IGRvX2NvbXBhcmUoY29uc3QgY2hhcl90eXBlKiBfX2xvMSwgY29uc3QgY2hhcl90eXBlKiBfX2hpMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19sbzIsIGNvbnN0IGNoYXJfdHlwZSogX19oaTIpIGNvbnN0OworICAgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fdHJhbnNmb3JtKGNvbnN0IGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdAorICAgICAgICB7cmV0dXJuIHN0cmluZ190eXBlKF9fbG8sIF9faGkpO30KKyAgICB2aXJ0dWFsIGxvbmcgZG9faGFzaChjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiBsb2NhbGU6OmlkIGNvbGxhdGU8X0NoYXJUPjo6aWQ7CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+Citjb2xsYXRlPF9DaGFyVD46On5jb2xsYXRlKCkKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2ludAorY29sbGF0ZTxfQ2hhclQ+Ojpkb19jb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogX19sbzEsIGNvbnN0IGNoYXJfdHlwZSogX19oaTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcl90eXBlKiBfX2xvMiwgY29uc3QgY2hhcl90eXBlKiBfX2hpMikgY29uc3QKK3sKKyAgICBmb3IgKDsgX19sbzIgIT0gX19oaTI7ICsrX19sbzEsICsrX19sbzIpCisgICAgeworICAgICAgICBpZiAoX19sbzEgPT0gX19oaTEgfHwgKl9fbG8xIDwgKl9fbG8yKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoKl9fbG8yIDwgKl9fbG8xKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBfX2xvMSAhPSBfX2hpMTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2xvbmcKK2NvbGxhdGU8X0NoYXJUPjo6ZG9faGFzaChjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3QKK3sKKyAgICBzaXplX3QgX19oID0gMDsKKyAgICBjb25zdCBzaXplX3QgX19zciA9IF9fQ0hBUl9CSVRfXyAqIHNpemVvZihzaXplX3QpIC0gODsKKyAgICBjb25zdCBzaXplX3QgX19tYXNrID0gc2l6ZV90KDB4RikgPDwgKF9fc3IgKyA0KTsKKyAgICBmb3IoY29uc3QgY2hhcl90eXBlKiBfX3AgPSBfX2xvOyBfX3AgIT0gX19oaTsgKytfX3ApCisgICAgeworICAgICAgICBfX2ggPSAoX19oIDw8IDQpICsgc3RhdGljX2Nhc3Q8c2l6ZV90PigqX19wKTsKKyAgICAgICAgc2l6ZV90IF9fZyA9IF9faCAmIF9fbWFzazsKKyAgICAgICAgX19oIF49IF9fZyB8IChfX2cgPj4gX19zcik7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxsb25nPihfX2gpOworfQorCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURTIoY2xhc3MgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfVFlQRV9WSVMgY29sbGF0ZTxjaGFyPikKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFMihjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBjb2xsYXRlPHdjaGFyX3Q+KQorCisvLyB0ZW1wbGF0ZSA8Y2xhc3MgQ2hhclQ+IGNsYXNzIGNvbGxhdGVfYnluYW1lOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBjb2xsYXRlX2J5bmFtZTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgY29sbGF0ZV9ieW5hbWU8Y2hhcj4KKyAgICA6IHB1YmxpYyBjb2xsYXRlPGNoYXI+Cit7CisgICAgbG9jYWxlX3QgX19sOworcHVibGljOgorICAgIHR5cGVkZWYgY2hhciBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcl90eXBlPiBzdHJpbmdfdHlwZTsKKworICAgIGV4cGxpY2l0IGNvbGxhdGVfYnluYW1lKGNvbnN0IGNoYXIqIF9fbiwgc2l6ZV90IF9fcmVmcyA9IDApOworICAgIGV4cGxpY2l0IGNvbGxhdGVfYnluYW1lKGNvbnN0IHN0cmluZyYgX19uLCBzaXplX3QgX19yZWZzID0gMCk7CisKK3Byb3RlY3RlZDoKKyAgICB+Y29sbGF0ZV9ieW5hbWUoKTsKKyAgICB2aXJ0dWFsIGludCBkb19jb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogX19sbzEsIGNvbnN0IGNoYXJfdHlwZSogX19oaTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyX3R5cGUqIF9fbG8yLCBjb25zdCBjaGFyX3R5cGUqIF9faGkyKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX3RyYW5zZm9ybShjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBjb2xsYXRlX2J5bmFtZTx3Y2hhcl90PgorICAgIDogcHVibGljIGNvbGxhdGU8d2NoYXJfdD4KK3sKKyAgICBsb2NhbGVfdCBfX2w7CitwdWJsaWM6CisgICAgdHlwZWRlZiB3Y2hhcl90IGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyX3R5cGU+IHN0cmluZ190eXBlOworCisgICAgZXhwbGljaXQgY29sbGF0ZV9ieW5hbWUoY29uc3QgY2hhciogX19uLCBzaXplX3QgX19yZWZzID0gMCk7CisgICAgZXhwbGljaXQgY29sbGF0ZV9ieW5hbWUoY29uc3Qgc3RyaW5nJiBfX24sIHNpemVfdCBfX3JlZnMgPSAwKTsKKworcHJvdGVjdGVkOgorICAgIH5jb2xsYXRlX2J5bmFtZSgpOworCisgICAgdmlydHVhbCBpbnQgZG9fY29tcGFyZShjb25zdCBjaGFyX3R5cGUqIF9fbG8xLCBjb25zdCBjaGFyX3R5cGUqIF9faGkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcl90eXBlKiBfX2xvMiwgY29uc3QgY2hhcl90eXBlKiBfX2hpMikgY29uc3Q7CisgICAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb190cmFuc2Zvcm0oY29uc3QgY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jvb2wKK2xvY2FsZTo6b3BlcmF0b3IoKShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX194LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3kpIGNvbnN0Cit7CisgICAgcmV0dXJuIF9WU1REOjp1c2VfZmFjZXQ8X1ZTVEQ6OmNvbGxhdGU8X0NoYXJUPiA+KCp0aGlzKS5jb21wYXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX194LmRhdGEoKSwgX194LmRhdGEoKSArIF9feC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3kuZGF0YSgpLCBfX3kuZGF0YSgpICsgX195LnNpemUoKSkgPCAwOworfQorCisvLyB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+IGNsYXNzIGN0eXBlCisKK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgY3R5cGVfYmFzZQoreworcHVibGljOgorI2lmIGRlZmluZWQoX19HTElCQ19fKQorICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgbWFzazsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBzcGFjZSAgPSBfSVNzcGFjZTsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBwcmludCAgPSBfSVNwcmludDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBjbnRybCAgPSBfSVNjbnRybDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayB1cHBlciAgPSBfSVN1cHBlcjsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBsb3dlciAgPSBfSVNsb3dlcjsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBhbHBoYSAgPSBfSVNhbHBoYTsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBkaWdpdCAgPSBfSVNkaWdpdDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBwdW5jdCAgPSBfSVNwdW5jdDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayB4ZGlnaXQgPSBfSVN4ZGlnaXQ7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgYmxhbmsgID0gX0lTYmxhbms7CisjZWxpZiBkZWZpbmVkKF9MSUJDUFBfTVNWQ1JUX0xJS0UpCisgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBtYXNrOworICAgIHN0YXRpYyBjb25zdCBtYXNrIHNwYWNlICA9IF9TUEFDRTsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBwcmludCAgPSBfQkxBTkt8X1BVTkNUfF9BTFBIQXxfRElHSVQ7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgY250cmwgID0gX0NPTlRST0w7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgdXBwZXIgID0gX1VQUEVSOworICAgIHN0YXRpYyBjb25zdCBtYXNrIGxvd2VyICA9IF9MT1dFUjsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBhbHBoYSAgPSBfQUxQSEE7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgZGlnaXQgID0gX0RJR0lUOworICAgIHN0YXRpYyBjb25zdCBtYXNrIHB1bmN0ICA9IF9QVU5DVDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayB4ZGlnaXQgPSBfSEVYOworICAgIHN0YXRpYyBjb25zdCBtYXNrIGJsYW5rICA9IF9CTEFOSzsKKyMgZGVmaW5lIF9MSUJDUFBfQ1RZUEVfTUFTS19JU19DT01QT1NJVEVfUFJJTlQKKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fRU1TQ1JJUFRFTl9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCisjIGlmZGVmIF9fQVBQTEVfXworICAgIHR5cGVkZWYgX191aW50MzJfdCBtYXNrOworIyBlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pCisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIG1hc2s7CisjIGVsaWYgZGVmaW5lZChfX0VNU0NSSVBURU5fXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQorICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgbWFzazsKKyMgZW5kaWYKKyAgICBzdGF0aWMgY29uc3QgbWFzayBzcGFjZSAgPSBfQ1RZUEVfUzsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBwcmludCAgPSBfQ1RZUEVfUjsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBjbnRybCAgPSBfQ1RZUEVfQzsKKyAgICBzdGF0aWMgY29uc3QgbWFzayB1cHBlciAgPSBfQ1RZUEVfVTsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBsb3dlciAgPSBfQ1RZUEVfTDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBhbHBoYSAgPSBfQ1RZUEVfQTsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBkaWdpdCAgPSBfQ1RZUEVfRDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBwdW5jdCAgPSBfQ1RZUEVfUDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayB4ZGlnaXQgPSBfQ1RZUEVfWDsKKworIyBpZiBkZWZpbmVkKF9fTmV0QlNEX18pCisgICAgc3RhdGljIGNvbnN0IG1hc2sgYmxhbmsgID0gX0NUWVBFX0JMOworIyBlbHNlCisgICAgc3RhdGljIGNvbnN0IG1hc2sgYmxhbmsgID0gX0NUWVBFX0I7CisjIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fc3VuX18pIHx8IGRlZmluZWQoX0FJWCkKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGludCBtYXNrOworICAgIHN0YXRpYyBjb25zdCBtYXNrIHNwYWNlICA9IF9JU1NQQUNFOworICAgIHN0YXRpYyBjb25zdCBtYXNrIHByaW50ICA9IF9JU1BSSU5UOworICAgIHN0YXRpYyBjb25zdCBtYXNrIGNudHJsICA9IF9JU0NOVFJMOworICAgIHN0YXRpYyBjb25zdCBtYXNrIHVwcGVyICA9IF9JU1VQUEVSOworICAgIHN0YXRpYyBjb25zdCBtYXNrIGxvd2VyICA9IF9JU0xPV0VSOworICAgIHN0YXRpYyBjb25zdCBtYXNrIGFscGhhICA9IF9JU0FMUEhBOworICAgIHN0YXRpYyBjb25zdCBtYXNrIGRpZ2l0ICA9IF9JU0RJR0lUOworICAgIHN0YXRpYyBjb25zdCBtYXNrIHB1bmN0ICA9IF9JU1BVTkNUOworICAgIHN0YXRpYyBjb25zdCBtYXNrIHhkaWdpdCA9IF9JU1hESUdJVDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBibGFuayAgPSBfSVNCTEFOSzsKKyNlbGlmIGRlZmluZWQoX05FV0xJQl9WRVJTSU9OKQorICAgIC8vIFNhbWUgdHlwZSBhcyBOZXdsaWIncyBfY3R5cGVfIGFycmF5IGluIG5ld2xpYi9saWJjL2luY2x1ZGUvY3R5cGUuaC4KKyAgICB0eXBlZGVmIGNoYXIgbWFzazsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBzcGFjZSAgPSBfUzsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBwcmludCAgPSBfUCB8IF9VIHwgX0wgfCBfTiB8IF9COworICAgIHN0YXRpYyBjb25zdCBtYXNrIGNudHJsICA9IF9DOworICAgIHN0YXRpYyBjb25zdCBtYXNrIHVwcGVyICA9IF9VOworICAgIHN0YXRpYyBjb25zdCBtYXNrIGxvd2VyICA9IF9MOworICAgIHN0YXRpYyBjb25zdCBtYXNrIGFscGhhICA9IF9VIHwgX0w7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgZGlnaXQgID0gX047CisgICAgc3RhdGljIGNvbnN0IG1hc2sgcHVuY3QgID0gX1A7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgeGRpZ2l0ID0gX1ggfCBfTjsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBibGFuayAgPSBfQjsKKyMgZGVmaW5lIF9MSUJDUFBfQ1RZUEVfTUFTS19JU19DT01QT1NJVEVfUFJJTlQKKyMgZGVmaW5lIF9MSUJDUFBfQ1RZUEVfTUFTS19JU19DT01QT1NJVEVfQUxQSEEKKyMgZGVmaW5lIF9MSUJDUFBfQ1RZUEVfTUFTS19JU19DT01QT1NJVEVfWERJR0lUCisjZWxzZQorICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBtYXNrOworICAgIHN0YXRpYyBjb25zdCBtYXNrIHNwYWNlICA9IDE8PDA7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgcHJpbnQgID0gMTw8MTsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBjbnRybCAgPSAxPDwyOworICAgIHN0YXRpYyBjb25zdCBtYXNrIHVwcGVyICA9IDE8PDM7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgbG93ZXIgID0gMTw8NDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBhbHBoYSAgPSAxPDw1OworICAgIHN0YXRpYyBjb25zdCBtYXNrIGRpZ2l0ICA9IDE8PDY7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgcHVuY3QgID0gMTw8NzsKKyAgICBzdGF0aWMgY29uc3QgbWFzayB4ZGlnaXQgPSAxPDw4OworICAgIHN0YXRpYyBjb25zdCBtYXNrIGJsYW5rICA9IDE8PDk7CisjZW5kaWYKKyAgICBzdGF0aWMgY29uc3QgbWFzayBhbG51bSAgPSBhbHBoYSB8IGRpZ2l0OworICAgIHN0YXRpYyBjb25zdCBtYXNrIGdyYXBoICA9IGFsbnVtIHwgcHVuY3Q7CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgY3R5cGVfYmFzZSgpIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBjdHlwZTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgY3R5cGU8d2NoYXJfdD4KKyAgICA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LAorICAgICAgcHVibGljIGN0eXBlX2Jhc2UKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHdjaGFyX3QgY2hhcl90eXBlOworCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgZXhwbGljaXQgY3R5cGUoc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICAgIDogbG9jYWxlOjpmYWNldChfX3JlZnMpIHt9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBib29sIGlzKG1hc2sgX19tLCBjaGFyX3R5cGUgX19jKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX2lzKF9fbSwgX19jKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBjb25zdCBjaGFyX3R5cGUqIGlzKGNvbnN0IGNoYXJfdHlwZSogX19sb3csIGNvbnN0IGNoYXJfdHlwZSogX19oaWdoLCBtYXNrKiBfX3ZlYykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19pcyhfX2xvdywgX19oaWdoLCBfX3ZlYyk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgY29uc3QgY2hhcl90eXBlKiBzY2FuX2lzKG1hc2sgX19tLCBjb25zdCBjaGFyX3R5cGUqIF9fbG93LCBjb25zdCBjaGFyX3R5cGUqIF9faGlnaCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19zY2FuX2lzKF9fbSwgX19sb3csIF9faGlnaCk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgY29uc3QgY2hhcl90eXBlKiBzY2FuX25vdChtYXNrIF9fbSwgY29uc3QgY2hhcl90eXBlKiBfX2xvdywgY29uc3QgY2hhcl90eXBlKiBfX2hpZ2gpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fc2Nhbl9ub3QoX19tLCBfX2xvdywgX19oaWdoKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBjaGFyX3R5cGUgdG91cHBlcihjaGFyX3R5cGUgX19jKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX3RvdXBwZXIoX19jKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBjb25zdCBjaGFyX3R5cGUqIHRvdXBwZXIoY2hhcl90eXBlKiBfX2xvdywgY29uc3QgY2hhcl90eXBlKiBfX2hpZ2gpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fdG91cHBlcihfX2xvdywgX19oaWdoKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBjaGFyX3R5cGUgdG9sb3dlcihjaGFyX3R5cGUgX19jKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX3RvbG93ZXIoX19jKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBjb25zdCBjaGFyX3R5cGUqIHRvbG93ZXIoY2hhcl90eXBlKiBfX2xvdywgY29uc3QgY2hhcl90eXBlKiBfX2hpZ2gpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fdG9sb3dlcihfX2xvdywgX19oaWdoKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBjaGFyX3R5cGUgd2lkZW4oY2hhciBfX2MpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fd2lkZW4oX19jKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBjb25zdCBjaGFyKiB3aWRlbihjb25zdCBjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoLCBjaGFyX3R5cGUqIF9fdG8pIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fd2lkZW4oX19sb3csIF9faGlnaCwgX190byk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgY2hhciBuYXJyb3coY2hhcl90eXBlIF9fYywgY2hhciBfX2RmYXVsdCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19uYXJyb3coX19jLCBfX2RmYXVsdCk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgY29uc3QgY2hhcl90eXBlKiBuYXJyb3coY29uc3QgY2hhcl90eXBlKiBfX2xvdywgY29uc3QgY2hhcl90eXBlKiBfX2hpZ2gsIGNoYXIgX19kZmF1bHQsIGNoYXIqIF9fdG8pIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fbmFycm93KF9fbG93LCBfX2hpZ2gsIF9fZGZhdWx0LCBfX3RvKTsKKyAgICB9CisKKyAgICBzdGF0aWMgbG9jYWxlOjppZCBpZDsKKworcHJvdGVjdGVkOgorICAgIH5jdHlwZSgpOworICAgIHZpcnR1YWwgYm9vbCBkb19pcyhtYXNrIF9fbSwgY2hhcl90eXBlIF9fYykgY29uc3Q7CisgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqIGRvX2lzKGNvbnN0IGNoYXJfdHlwZSogX19sb3csIGNvbnN0IGNoYXJfdHlwZSogX19oaWdoLCBtYXNrKiBfX3ZlYykgY29uc3Q7CisgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqIGRvX3NjYW5faXMobWFzayBfX20sIGNvbnN0IGNoYXJfdHlwZSogX19sb3csIGNvbnN0IGNoYXJfdHlwZSogX19oaWdoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSogZG9fc2Nhbl9ub3QobWFzayBfX20sIGNvbnN0IGNoYXJfdHlwZSogX19sb3csIGNvbnN0IGNoYXJfdHlwZSogX19oaWdoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGNoYXJfdHlwZSBkb190b3VwcGVyKGNoYXJfdHlwZSkgY29uc3Q7CisgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqIGRvX3RvdXBwZXIoY2hhcl90eXBlKiBfX2xvdywgY29uc3QgY2hhcl90eXBlKiBfX2hpZ2gpIGNvbnN0OworICAgIHZpcnR1YWwgY2hhcl90eXBlIGRvX3RvbG93ZXIoY2hhcl90eXBlKSBjb25zdDsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSogZG9fdG9sb3dlcihjaGFyX3R5cGUqIF9fbG93LCBjb25zdCBjaGFyX3R5cGUqIF9faGlnaCkgY29uc3Q7CisgICAgdmlydHVhbCBjaGFyX3R5cGUgZG9fd2lkZW4oY2hhcikgY29uc3Q7CisgICAgdmlydHVhbCBjb25zdCBjaGFyKiBkb193aWRlbihjb25zdCBjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoLCBjaGFyX3R5cGUqIF9fZGVzdCkgY29uc3Q7CisgICAgdmlydHVhbCBjaGFyIGRvX25hcnJvdyhjaGFyX3R5cGUsIGNoYXIgX19kZmF1bHQpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKiBkb19uYXJyb3coY29uc3QgY2hhcl90eXBlKiBfX2xvdywgY29uc3QgY2hhcl90eXBlKiBfX2hpZ2gsIGNoYXIgX19kZmF1bHQsIGNoYXIqIF9fZGVzdCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBjdHlwZTxjaGFyPgorICAgIDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyBjdHlwZV9iYXNlCit7CisgICAgY29uc3QgbWFzayogX190YWJfOworICAgIGJvb2wgICAgICAgIF9fZGVsXzsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGNoYXIgY2hhcl90eXBlOworCisgICAgZXhwbGljaXQgY3R5cGUoY29uc3QgbWFzayogX190YWIgPSAwLCBib29sIF9fZGVsID0gZmFsc2UsIHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGJvb2wgaXMobWFzayBfX20sIGNoYXJfdHlwZSBfX2MpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNhc2NpaShfX2MpID8gKF9fdGFiX1tzdGF0aWNfY2FzdDxpbnQ+KF9fYyldICYgX19tKSAhPTAgOiBmYWxzZTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBjb25zdCBjaGFyX3R5cGUqIGlzKGNvbnN0IGNoYXJfdHlwZSogX19sb3csIGNvbnN0IGNoYXJfdHlwZSogX19oaWdoLCBtYXNrKiBfX3ZlYykgY29uc3QKKyAgICB7CisgICAgICAgIGZvciAoOyBfX2xvdyAhPSBfX2hpZ2g7ICsrX19sb3csICsrX192ZWMpCisgICAgICAgICAgICAqX192ZWMgPSBpc2FzY2lpKCpfX2xvdykgPyBfX3RhYl9bc3RhdGljX2Nhc3Q8aW50PigqX19sb3cpXSA6IDA7CisgICAgICAgIHJldHVybiBfX2xvdzsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBjb25zdCBjaGFyX3R5cGUqIHNjYW5faXMgKG1hc2sgX19tLCBjb25zdCBjaGFyX3R5cGUqIF9fbG93LCBjb25zdCBjaGFyX3R5cGUqIF9faGlnaCkgY29uc3QKKyAgICB7CisgICAgICAgIGZvciAoOyBfX2xvdyAhPSBfX2hpZ2g7ICsrX19sb3cpCisgICAgICAgICAgICBpZiAoaXNhc2NpaSgqX19sb3cpICYmIChfX3RhYl9bc3RhdGljX2Nhc3Q8aW50PigqX19sb3cpXSAmIF9fbSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBfX2xvdzsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBjb25zdCBjaGFyX3R5cGUqIHNjYW5fbm90KG1hc2sgX19tLCBjb25zdCBjaGFyX3R5cGUqIF9fbG93LCBjb25zdCBjaGFyX3R5cGUqIF9faGlnaCkgY29uc3QKKyAgICB7CisgICAgICAgIGZvciAoOyBfX2xvdyAhPSBfX2hpZ2g7ICsrX19sb3cpCisgICAgICAgICAgICBpZiAoIShpc2FzY2lpKCpfX2xvdykgJiYgKF9fdGFiX1tzdGF0aWNfY2FzdDxpbnQ+KCpfX2xvdyldICYgX19tKSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBfX2xvdzsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBjaGFyX3R5cGUgdG91cHBlcihjaGFyX3R5cGUgX19jKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX3RvdXBwZXIoX19jKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBjb25zdCBjaGFyX3R5cGUqIHRvdXBwZXIoY2hhcl90eXBlKiBfX2xvdywgY29uc3QgY2hhcl90eXBlKiBfX2hpZ2gpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fdG91cHBlcihfX2xvdywgX19oaWdoKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBjaGFyX3R5cGUgdG9sb3dlcihjaGFyX3R5cGUgX19jKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX3RvbG93ZXIoX19jKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBjb25zdCBjaGFyX3R5cGUqIHRvbG93ZXIoY2hhcl90eXBlKiBfX2xvdywgY29uc3QgY2hhcl90eXBlKiBfX2hpZ2gpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fdG9sb3dlcihfX2xvdywgX19oaWdoKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBjaGFyX3R5cGUgd2lkZW4oY2hhciBfX2MpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fd2lkZW4oX19jKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBjb25zdCBjaGFyKiB3aWRlbihjb25zdCBjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoLCBjaGFyX3R5cGUqIF9fdG8pIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fd2lkZW4oX19sb3csIF9faGlnaCwgX190byk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgY2hhciBuYXJyb3coY2hhcl90eXBlIF9fYywgY2hhciBfX2RmYXVsdCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19uYXJyb3coX19jLCBfX2RmYXVsdCk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgY29uc3QgY2hhciogbmFycm93KGNvbnN0IGNoYXJfdHlwZSogX19sb3csIGNvbnN0IGNoYXJfdHlwZSogX19oaWdoLCBjaGFyIF9fZGZhdWx0LCBjaGFyKiBfX3RvKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX25hcnJvdyhfX2xvdywgX19oaWdoLCBfX2RmYXVsdCwgX190byk7CisgICAgfQorCisgICAgc3RhdGljIGxvY2FsZTo6aWQgaWQ7CisKKyNpZmRlZiBfQ0FDSEVEX1JVTkVTCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCB0YWJsZV9zaXplID0gX0NBQ0hFRF9SVU5FUzsKKyNlbHNlCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCB0YWJsZV9zaXplID0gMjU2OyAgLy8gRklYTUU6IERvbid0IGhhcmRjb2RlIHRoaXMuCisjZW5kaWYKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgY29uc3QgbWFzayogdGFibGUoKSBjb25zdCAgX05PRVhDRVBUIHtyZXR1cm4gX190YWJfO30KKyAgICBzdGF0aWMgY29uc3QgbWFzayogY2xhc3NpY190YWJsZSgpICBfTk9FWENFUFQ7CisjaWYgZGVmaW5lZChfX0dMSUJDX18pIHx8IGRlZmluZWQoX19FTVNDUklQVEVOX18pCisgICAgc3RhdGljIGNvbnN0IGludCogX19jbGFzc2ljX3VwcGVyX3RhYmxlKCkgX05PRVhDRVBUOworICAgIHN0YXRpYyBjb25zdCBpbnQqIF9fY2xhc3NpY19sb3dlcl90YWJsZSgpIF9OT0VYQ0VQVDsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19OZXRCU0RfXykKKyAgICBzdGF0aWMgY29uc3Qgc2hvcnQqIF9fY2xhc3NpY191cHBlcl90YWJsZSgpIF9OT0VYQ0VQVDsKKyAgICBzdGF0aWMgY29uc3Qgc2hvcnQqIF9fY2xhc3NpY19sb3dlcl90YWJsZSgpIF9OT0VYQ0VQVDsKKyNlbmRpZgorCitwcm90ZWN0ZWQ6CisgICAgfmN0eXBlKCk7CisgICAgdmlydHVhbCBjaGFyX3R5cGUgZG9fdG91cHBlcihjaGFyX3R5cGUgX19jKSBjb25zdDsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSogZG9fdG91cHBlcihjaGFyX3R5cGUqIF9fbG93LCBjb25zdCBjaGFyX3R5cGUqIF9faGlnaCkgY29uc3Q7CisgICAgdmlydHVhbCBjaGFyX3R5cGUgZG9fdG9sb3dlcihjaGFyX3R5cGUgX19jKSBjb25zdDsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSogZG9fdG9sb3dlcihjaGFyX3R5cGUqIF9fbG93LCBjb25zdCBjaGFyX3R5cGUqIF9faGlnaCkgY29uc3Q7CisgICAgdmlydHVhbCBjaGFyX3R5cGUgZG9fd2lkZW4oY2hhciBfX2MpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3QgY2hhciogZG9fd2lkZW4oY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCwgY2hhcl90eXBlKiBfX3RvKSBjb25zdDsKKyAgICB2aXJ0dWFsIGNoYXIgZG9fbmFycm93KGNoYXJfdHlwZSBfX2MsIGNoYXIgX19kZmF1bHQpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3QgY2hhciogZG9fbmFycm93KGNvbnN0IGNoYXJfdHlwZSogX19sb3csIGNvbnN0IGNoYXJfdHlwZSogX19oaWdoLCBjaGFyIF9fZGZhdWx0LCBjaGFyKiBfX3RvKSBjb25zdDsKK307CisKKy8vIHRlbXBsYXRlIDxjbGFzcyBDaGFyVD4gY2xhc3MgY3R5cGVfYnluYW1lOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBjdHlwZV9ieW5hbWU7CisKK3RlbXBsYXRlIDw+CitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIGN0eXBlX2J5bmFtZTxjaGFyPgorICAgIDogcHVibGljIGN0eXBlPGNoYXI+Cit7CisgICAgbG9jYWxlX3QgX19sOworCitwdWJsaWM6CisgICAgZXhwbGljaXQgY3R5cGVfYnluYW1lKGNvbnN0IGNoYXIqLCBzaXplX3QgPSAwKTsKKyAgICBleHBsaWNpdCBjdHlwZV9ieW5hbWUoY29uc3Qgc3RyaW5nJiwgc2l6ZV90ID0gMCk7CisKK3Byb3RlY3RlZDoKKyAgICB+Y3R5cGVfYnluYW1lKCk7CisgICAgdmlydHVhbCBjaGFyX3R5cGUgZG9fdG91cHBlcihjaGFyX3R5cGUpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKiBkb190b3VwcGVyKGNoYXJfdHlwZSogX19sb3csIGNvbnN0IGNoYXJfdHlwZSogX19oaWdoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGNoYXJfdHlwZSBkb190b2xvd2VyKGNoYXJfdHlwZSkgY29uc3Q7CisgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqIGRvX3RvbG93ZXIoY2hhcl90eXBlKiBfX2xvdywgY29uc3QgY2hhcl90eXBlKiBfX2hpZ2gpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgY3R5cGVfYnluYW1lPHdjaGFyX3Q+CisgICAgOiBwdWJsaWMgY3R5cGU8d2NoYXJfdD4KK3sKKyAgICBsb2NhbGVfdCBfX2w7CisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBjdHlwZV9ieW5hbWUoY29uc3QgY2hhciosIHNpemVfdCA9IDApOworICAgIGV4cGxpY2l0IGN0eXBlX2J5bmFtZShjb25zdCBzdHJpbmcmLCBzaXplX3QgPSAwKTsKKworcHJvdGVjdGVkOgorICAgIH5jdHlwZV9ieW5hbWUoKTsKKyAgICB2aXJ0dWFsIGJvb2wgZG9faXMobWFzayBfX20sIGNoYXJfdHlwZSBfX2MpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKiBkb19pcyhjb25zdCBjaGFyX3R5cGUqIF9fbG93LCBjb25zdCBjaGFyX3R5cGUqIF9faGlnaCwgbWFzayogX192ZWMpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKiBkb19zY2FuX2lzKG1hc2sgX19tLCBjb25zdCBjaGFyX3R5cGUqIF9fbG93LCBjb25zdCBjaGFyX3R5cGUqIF9faGlnaCkgY29uc3Q7CisgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqIGRvX3NjYW5fbm90KG1hc2sgX19tLCBjb25zdCBjaGFyX3R5cGUqIF9fbG93LCBjb25zdCBjaGFyX3R5cGUqIF9faGlnaCkgY29uc3Q7CisgICAgdmlydHVhbCBjaGFyX3R5cGUgZG9fdG91cHBlcihjaGFyX3R5cGUpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKiBkb190b3VwcGVyKGNoYXJfdHlwZSogX19sb3csIGNvbnN0IGNoYXJfdHlwZSogX19oaWdoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGNoYXJfdHlwZSBkb190b2xvd2VyKGNoYXJfdHlwZSkgY29uc3Q7CisgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqIGRvX3RvbG93ZXIoY2hhcl90eXBlKiBfX2xvdywgY29uc3QgY2hhcl90eXBlKiBfX2hpZ2gpIGNvbnN0OworICAgIHZpcnR1YWwgY2hhcl90eXBlIGRvX3dpZGVuKGNoYXIpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3QgY2hhciogZG9fd2lkZW4oY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCwgY2hhcl90eXBlKiBfX2Rlc3QpIGNvbnN0OworICAgIHZpcnR1YWwgY2hhciBkb19uYXJyb3coY2hhcl90eXBlLCBjaGFyIF9fZGZhdWx0KSBjb25zdDsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSogZG9fbmFycm93KGNvbnN0IGNoYXJfdHlwZSogX19sb3csIGNvbnN0IGNoYXJfdHlwZSogX19oaWdoLCBjaGFyIF9fZGZhdWx0LCBjaGFyKiBfX2Rlc3QpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitpc3NwYWNlKF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19sb2MpCit7CisgICAgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK2lzcHJpbnQoX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKK3sKKyAgICByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6cHJpbnQsIF9fYyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAoraXNjbnRybChfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQoreworICAgIHJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKS5pcyhjdHlwZV9iYXNlOjpjbnRybCwgX19jKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitpc3VwcGVyKF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19sb2MpCit7CisgICAgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OnVwcGVyLCBfX2MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK2lzbG93ZXIoX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKK3sKKyAgICByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6bG93ZXIsIF9fYyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAoraXNhbHBoYShfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQoreworICAgIHJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKS5pcyhjdHlwZV9iYXNlOjphbHBoYSwgX19jKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitpc2RpZ2l0KF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19sb2MpCit7CisgICAgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OmRpZ2l0LCBfX2MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK2lzcHVuY3QoX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKK3sKKyAgICByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6cHVuY3QsIF9fYyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAoraXN4ZGlnaXQoX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKK3sKKyAgICByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6eGRpZ2l0LCBfX2MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK2lzYWxudW0oX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKK3sKKyAgICByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6YWxudW0sIF9fYyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAoraXNncmFwaChfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQoreworICAgIHJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKS5pcyhjdHlwZV9iYXNlOjpncmFwaCwgX19jKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfQ2hhclQKK3RvdXBwZXIoX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKK3sKKyAgICByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykudG91cHBlcihfX2MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19DaGFyVAordG9sb3dlcihfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQoreworICAgIHJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKS50b2xvd2VyKF9fYyk7Cit9CisKKy8vIGNvZGVjdnRfYmFzZQorCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIGNvZGVjdnRfYmFzZQoreworcHVibGljOgorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBjb2RlY3Z0X2Jhc2UoKSB7fQorICAgIGVudW0gcmVzdWx0IHtvaywgcGFydGlhbCwgZXJyb3IsIG5vY29udn07Cit9OworCisvLyB0ZW1wbGF0ZSA8Y2xhc3MgaW50ZXJuVCwgY2xhc3MgZXh0ZXJuVCwgY2xhc3Mgc3RhdGVUPiBjbGFzcyBjb2RlY3Z0OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVyblQsIGNsYXNzIF9FeHRlcm5ULCBjbGFzcyBfU3RhdGVUPiBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBjb2RlY3Z0OworCisvLyB0ZW1wbGF0ZSA8PiBjbGFzcyBjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4KKwordGVtcGxhdGUgPD4KK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgY29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+CisgICAgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwKKyAgICAgIHB1YmxpYyBjb2RlY3Z0X2Jhc2UKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGNoYXIgICAgICBpbnRlcm5fdHlwZTsKKyAgICB0eXBlZGVmIGNoYXIgICAgICBleHRlcm5fdHlwZTsKKyAgICB0eXBlZGVmIG1ic3RhdGVfdCBzdGF0ZV90eXBlOworCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgZXhwbGljaXQgY29kZWN2dChzaXplX3QgX19yZWZzID0gMCkKKyAgICAgICAgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIHJlc3VsdCBvdXQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgIGNvbnN0IGludGVybl90eXBlKiBfX2ZybSwgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJtX2VuZCwgY29uc3QgaW50ZXJuX3R5cGUqJiBfX2ZybV9ueHQsCisgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLCBleHRlcm5fdHlwZSomIF9fdG9fbnh0KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX291dChfX3N0LCBfX2ZybSwgX19mcm1fZW5kLCBfX2ZybV9ueHQsIF9fdG8sIF9fdG9fZW5kLCBfX3RvX254dCk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgcmVzdWx0IHVuc2hpZnQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLCBleHRlcm5fdHlwZSomIF9fdG9fbnh0KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX3Vuc2hpZnQoX19zdCwgX190bywgX190b19lbmQsIF9fdG9fbnh0KTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICByZXN1bHQgaW4oc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwgaW50ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19pbihfX3N0LCBfX2ZybSwgX19mcm1fZW5kLCBfX2ZybV9ueHQsIF9fdG8sIF9fdG9fZW5kLCBfX3RvX254dCk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgaW50IGVuY29kaW5nKCkgY29uc3QgIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX2VuY29kaW5nKCk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgYm9vbCBhbHdheXNfbm9jb252KCkgY29uc3QgIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX2Fsd2F5c19ub2NvbnYoKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBpbnQgbGVuZ3RoKHN0YXRlX3R5cGUmIF9fc3QsIGNvbnN0IGV4dGVybl90eXBlKiBfX2ZybSwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZW5kLCBzaXplX3QgX19teCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19sZW5ndGgoX19zdCwgX19mcm0sIF9fZW5kLCBfX214KTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBpbnQgbWF4X2xlbmd0aCgpIGNvbnN0ICBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIHJldHVybiBkb19tYXhfbGVuZ3RoKCk7CisgICAgfQorCisgICAgc3RhdGljIGxvY2FsZTo6aWQgaWQ7CisKK3Byb3RlY3RlZDoKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBleHBsaWNpdCBjb2RlY3Z0KGNvbnN0IGNoYXIqLCBzaXplX3QgX19yZWZzID0gMCkKKyAgICAgICAgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKworICAgIH5jb2RlY3Z0KCk7CisKKyAgICB2aXJ0dWFsIHJlc3VsdCBkb19vdXQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBpbnRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBpbnRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQgZG9faW4oc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2ZybV9lbmQsIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm1fbnh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybl90eXBlKiBfX3RvLCBpbnRlcm5fdHlwZSogX190b19lbmQsIGludGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgcmVzdWx0IGRvX3Vuc2hpZnQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX2VuY29kaW5nKCkgY29uc3QgIF9OT0VYQ0VQVDsKKyAgICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0ICBfTk9FWENFUFQ7CisgICAgdmlydHVhbCBpbnQgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmIF9fc3QsIGNvbnN0IGV4dGVybl90eXBlKiBfX2ZybSwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZW5kLCBzaXplX3QgX19teCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgZG9fbWF4X2xlbmd0aCgpIGNvbnN0ICBfTk9FWENFUFQ7Cit9OworCisvLyB0ZW1wbGF0ZSA8PiBjbGFzcyBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4KKwordGVtcGxhdGUgPD4KK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+CisgICAgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwKKyAgICAgIHB1YmxpYyBjb2RlY3Z0X2Jhc2UKK3sKKyAgICBsb2NhbGVfdCBfX2w7CitwdWJsaWM6CisgICAgdHlwZWRlZiB3Y2hhcl90ICAgaW50ZXJuX3R5cGU7CisgICAgdHlwZWRlZiBjaGFyICAgICAgZXh0ZXJuX3R5cGU7CisgICAgdHlwZWRlZiBtYnN0YXRlX3Qgc3RhdGVfdHlwZTsKKworICAgIGV4cGxpY2l0IGNvZGVjdnQoc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgcmVzdWx0IG91dChzdGF0ZV90eXBlJiBfX3N0LAorICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBpbnRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBpbnRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fb3V0KF9fc3QsIF9fZnJtLCBfX2ZybV9lbmQsIF9fZnJtX254dCwgX190bywgX190b19lbmQsIF9fdG9fbnh0KTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICByZXN1bHQgdW5zaGlmdChzdGF0ZV90eXBlJiBfX3N0LAorICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fdW5zaGlmdChfX3N0LCBfX3RvLCBfX3RvX2VuZCwgX190b19ueHQpOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIHJlc3VsdCBpbihzdGF0ZV90eXBlJiBfX3N0LAorICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2ZybV9lbmQsIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm1fbnh0LAorICAgICAgICAgICAgICBpbnRlcm5fdHlwZSogX190bywgaW50ZXJuX3R5cGUqIF9fdG9fZW5kLCBpbnRlcm5fdHlwZSomIF9fdG9fbnh0KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX2luKF9fc3QsIF9fZnJtLCBfX2ZybV9lbmQsIF9fZnJtX254dCwgX190bywgX190b19lbmQsIF9fdG9fbnh0KTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBpbnQgZW5jb2RpbmcoKSBjb25zdCAgX05PRVhDRVBUCisgICAgeworICAgICAgICByZXR1cm4gZG9fZW5jb2RpbmcoKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBib29sIGFsd2F5c19ub2NvbnYoKSBjb25zdCAgX05PRVhDRVBUCisgICAgeworICAgICAgICByZXR1cm4gZG9fYWx3YXlzX25vY29udigpOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGludCBsZW5ndGgoc3RhdGVfdHlwZSYgX19zdCwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBleHRlcm5fdHlwZSogX19lbmQsIHNpemVfdCBfX214KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX2xlbmd0aChfX3N0LCBfX2ZybSwgX19lbmQsIF9fbXgpOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGludCBtYXhfbGVuZ3RoKCkgY29uc3QgIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX21heF9sZW5ndGgoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgbG9jYWxlOjppZCBpZDsKKworcHJvdGVjdGVkOgorICAgIGV4cGxpY2l0IGNvZGVjdnQoY29uc3QgY2hhciosIHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgIH5jb2RlY3Z0KCk7CisKKyAgICB2aXJ0dWFsIHJlc3VsdCBkb19vdXQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBpbnRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBpbnRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQgZG9faW4oc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2ZybV9lbmQsIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm1fbnh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybl90eXBlKiBfX3RvLCBpbnRlcm5fdHlwZSogX190b19lbmQsIGludGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgcmVzdWx0IGRvX3Vuc2hpZnQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX2VuY29kaW5nKCkgY29uc3QgIF9OT0VYQ0VQVDsKKyAgICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0ICBfTk9FWENFUFQ7CisgICAgdmlydHVhbCBpbnQgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwgc2l6ZV90IF9fbXgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCAgX05PRVhDRVBUOworfTsKKworLy8gdGVtcGxhdGUgPD4gY2xhc3MgY29kZWN2dDxjaGFyMTZfdCwgY2hhciwgbWJzdGF0ZV90PgorCit0ZW1wbGF0ZSA8PgorY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBjb2RlY3Z0PGNoYXIxNl90LCBjaGFyLCBtYnN0YXRlX3Q+CisgICAgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwKKyAgICAgIHB1YmxpYyBjb2RlY3Z0X2Jhc2UKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGNoYXIxNl90ICBpbnRlcm5fdHlwZTsKKyAgICB0eXBlZGVmIGNoYXIgICAgICBleHRlcm5fdHlwZTsKKyAgICB0eXBlZGVmIG1ic3RhdGVfdCBzdGF0ZV90eXBlOworCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgZXhwbGljaXQgY29kZWN2dChzaXplX3QgX19yZWZzID0gMCkKKyAgICAgICAgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIHJlc3VsdCBvdXQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgIGNvbnN0IGludGVybl90eXBlKiBfX2ZybSwgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJtX2VuZCwgY29uc3QgaW50ZXJuX3R5cGUqJiBfX2ZybV9ueHQsCisgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLCBleHRlcm5fdHlwZSomIF9fdG9fbnh0KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX291dChfX3N0LCBfX2ZybSwgX19mcm1fZW5kLCBfX2ZybV9ueHQsIF9fdG8sIF9fdG9fZW5kLCBfX3RvX254dCk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgcmVzdWx0IHVuc2hpZnQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLCBleHRlcm5fdHlwZSomIF9fdG9fbnh0KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX3Vuc2hpZnQoX19zdCwgX190bywgX190b19lbmQsIF9fdG9fbnh0KTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICByZXN1bHQgaW4oc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwgaW50ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19pbihfX3N0LCBfX2ZybSwgX19mcm1fZW5kLCBfX2ZybV9ueHQsIF9fdG8sIF9fdG9fZW5kLCBfX3RvX254dCk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgaW50IGVuY29kaW5nKCkgY29uc3QgIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX2VuY29kaW5nKCk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgYm9vbCBhbHdheXNfbm9jb252KCkgY29uc3QgIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX2Fsd2F5c19ub2NvbnYoKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBpbnQgbGVuZ3RoKHN0YXRlX3R5cGUmIF9fc3QsIGNvbnN0IGV4dGVybl90eXBlKiBfX2ZybSwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZW5kLCBzaXplX3QgX19teCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19sZW5ndGgoX19zdCwgX19mcm0sIF9fZW5kLCBfX214KTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBpbnQgbWF4X2xlbmd0aCgpIGNvbnN0ICBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIHJldHVybiBkb19tYXhfbGVuZ3RoKCk7CisgICAgfQorCisgICAgc3RhdGljIGxvY2FsZTo6aWQgaWQ7CisKK3Byb3RlY3RlZDoKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBleHBsaWNpdCBjb2RlY3Z0KGNvbnN0IGNoYXIqLCBzaXplX3QgX19yZWZzID0gMCkKKyAgICAgICAgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKworICAgIH5jb2RlY3Z0KCk7CisKKyAgICB2aXJ0dWFsIHJlc3VsdCBkb19vdXQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBpbnRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBpbnRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQgZG9faW4oc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2ZybV9lbmQsIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm1fbnh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybl90eXBlKiBfX3RvLCBpbnRlcm5fdHlwZSogX190b19lbmQsIGludGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgcmVzdWx0IGRvX3Vuc2hpZnQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX2VuY29kaW5nKCkgY29uc3QgIF9OT0VYQ0VQVDsKKyAgICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0ICBfTk9FWENFUFQ7CisgICAgdmlydHVhbCBpbnQgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwgc2l6ZV90IF9fbXgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCAgX05PRVhDRVBUOworfTsKKworLy8gdGVtcGxhdGUgPD4gY2xhc3MgY29kZWN2dDxjaGFyMzJfdCwgY2hhciwgbWJzdGF0ZV90PgorCit0ZW1wbGF0ZSA8PgorY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBjb2RlY3Z0PGNoYXIzMl90LCBjaGFyLCBtYnN0YXRlX3Q+CisgICAgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwKKyAgICAgIHB1YmxpYyBjb2RlY3Z0X2Jhc2UKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGNoYXIzMl90ICBpbnRlcm5fdHlwZTsKKyAgICB0eXBlZGVmIGNoYXIgICAgICBleHRlcm5fdHlwZTsKKyAgICB0eXBlZGVmIG1ic3RhdGVfdCBzdGF0ZV90eXBlOworCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgZXhwbGljaXQgY29kZWN2dChzaXplX3QgX19yZWZzID0gMCkKKyAgICAgICAgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIHJlc3VsdCBvdXQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgIGNvbnN0IGludGVybl90eXBlKiBfX2ZybSwgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJtX2VuZCwgY29uc3QgaW50ZXJuX3R5cGUqJiBfX2ZybV9ueHQsCisgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLCBleHRlcm5fdHlwZSomIF9fdG9fbnh0KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX291dChfX3N0LCBfX2ZybSwgX19mcm1fZW5kLCBfX2ZybV9ueHQsIF9fdG8sIF9fdG9fZW5kLCBfX3RvX254dCk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgcmVzdWx0IHVuc2hpZnQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLCBleHRlcm5fdHlwZSomIF9fdG9fbnh0KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX3Vuc2hpZnQoX19zdCwgX190bywgX190b19lbmQsIF9fdG9fbnh0KTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICByZXN1bHQgaW4oc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwgaW50ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19pbihfX3N0LCBfX2ZybSwgX19mcm1fZW5kLCBfX2ZybV9ueHQsIF9fdG8sIF9fdG9fZW5kLCBfX3RvX254dCk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgaW50IGVuY29kaW5nKCkgY29uc3QgIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX2VuY29kaW5nKCk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgYm9vbCBhbHdheXNfbm9jb252KCkgY29uc3QgIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX2Fsd2F5c19ub2NvbnYoKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBpbnQgbGVuZ3RoKHN0YXRlX3R5cGUmIF9fc3QsIGNvbnN0IGV4dGVybl90eXBlKiBfX2ZybSwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZW5kLCBzaXplX3QgX19teCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19sZW5ndGgoX19zdCwgX19mcm0sIF9fZW5kLCBfX214KTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBpbnQgbWF4X2xlbmd0aCgpIGNvbnN0ICBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIHJldHVybiBkb19tYXhfbGVuZ3RoKCk7CisgICAgfQorCisgICAgc3RhdGljIGxvY2FsZTo6aWQgaWQ7CisKK3Byb3RlY3RlZDoKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBleHBsaWNpdCBjb2RlY3Z0KGNvbnN0IGNoYXIqLCBzaXplX3QgX19yZWZzID0gMCkKKyAgICAgICAgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKworICAgIH5jb2RlY3Z0KCk7CisKKyAgICB2aXJ0dWFsIHJlc3VsdCBkb19vdXQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBpbnRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBpbnRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQgZG9faW4oc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2ZybV9lbmQsIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm1fbnh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybl90eXBlKiBfX3RvLCBpbnRlcm5fdHlwZSogX190b19lbmQsIGludGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgcmVzdWx0IGRvX3Vuc2hpZnQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX2VuY29kaW5nKCkgY29uc3QgIF9OT0VYQ0VQVDsKKyAgICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0ICBfTk9FWENFUFQ7CisgICAgdmlydHVhbCBpbnQgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwgc2l6ZV90IF9fbXgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCAgX05PRVhDRVBUOworfTsKKworLy8gdGVtcGxhdGUgPGNsYXNzIF9JbnRlcm5ULCBjbGFzcyBfRXh0ZXJuVCwgY2xhc3MgX1N0YXRlVD4gY2xhc3MgY29kZWN2dF9ieW5hbWUKKwordGVtcGxhdGUgPGNsYXNzIF9JbnRlcm5ULCBjbGFzcyBfRXh0ZXJuVCwgY2xhc3MgX1N0YXRlVD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGNvZGVjdnRfYnluYW1lCisgICAgOiBwdWJsaWMgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIF9TdGF0ZVQ+Cit7CitwdWJsaWM6CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgZXhwbGljaXQgY29kZWN2dF9ieW5hbWUoY29uc3QgY2hhciogX19ubSwgc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICAgIDogY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIF9TdGF0ZVQ+KF9fbm0sIF9fcmVmcykge30KKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBleHBsaWNpdCBjb2RlY3Z0X2J5bmFtZShjb25zdCBzdHJpbmcmIF9fbm0sIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgICA6IGNvZGVjdnQ8X0ludGVyblQsIF9FeHRlcm5ULCBfU3RhdGVUPihfX25tLmNfc3RyKCksIF9fcmVmcykge30KK3Byb3RlY3RlZDoKKyAgICB+Y29kZWN2dF9ieW5hbWUoKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfSW50ZXJuVCwgY2xhc3MgX0V4dGVyblQsIGNsYXNzIF9TdGF0ZVQ+Citjb2RlY3Z0X2J5bmFtZTxfSW50ZXJuVCwgX0V4dGVyblQsIF9TdGF0ZVQ+Ojp+Y29kZWN2dF9ieW5hbWUoKQoreworfQorCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURTIoY2xhc3MgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfVFlQRV9WSVMgY29kZWN2dF9ieW5hbWU8Y2hhciwgY2hhciwgbWJzdGF0ZV90PikKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFMihjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBjb2RlY3Z0X2J5bmFtZTx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+KQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUyKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIGNvZGVjdnRfYnluYW1lPGNoYXIxNl90LCBjaGFyLCBtYnN0YXRlX3Q+KQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUyKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIGNvZGVjdnRfYnluYW1lPGNoYXIzMl90LCBjaGFyLCBtYnN0YXRlX3Q+KQorCitfTElCQ1BQX05PUkVUVVJOIF9MSUJDUFBfRlVOQ19WSVMgdm9pZCBfX3Rocm93X3J1bnRpbWVfZXJyb3IoY29uc3QgY2hhciopOworCit0ZW1wbGF0ZSA8c2l6ZV90IF9OcD4KK3N0cnVjdCBfX25hcnJvd190b191dGY4Cit7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9PdXRwdXRJdGVyYXRvciwgY2xhc3MgX0NoYXJUPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIG9wZXJhdG9yKCkoX091dHB1dEl0ZXJhdG9yIF9fcywgY29uc3QgX0NoYXJUKiBfX3diLCBjb25zdCBfQ2hhclQqIF9fd2UpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfX25hcnJvd190b191dGY4PDg+Cit7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9PdXRwdXRJdGVyYXRvciwgY2xhc3MgX0NoYXJUPgorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIG9wZXJhdG9yKCkoX091dHB1dEl0ZXJhdG9yIF9fcywgY29uc3QgX0NoYXJUKiBfX3diLCBjb25zdCBfQ2hhclQqIF9fd2UpIGNvbnN0CisgICAgeworICAgICAgICBmb3IgKDsgX193YiA8IF9fd2U7ICsrX193YiwgKytfX3MpCisgICAgICAgICAgICAqX19zID0gKl9fd2I7CisgICAgICAgIHJldHVybiBfX3M7CisgICAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfX25hcnJvd190b191dGY4PDE2PgorICAgIDogcHVibGljIGNvZGVjdnQ8Y2hhcjE2X3QsIGNoYXIsIG1ic3RhdGVfdD4KK3sKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBfX25hcnJvd190b191dGY4KCkgOiBjb2RlY3Z0PGNoYXIxNl90LCBjaGFyLCBtYnN0YXRlX3Q+KDEpIHt9CisKKyAgICB+X19uYXJyb3dfdG9fdXRmOCgpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9PdXRwdXRJdGVyYXRvciwgY2xhc3MgX0NoYXJUPgorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIG9wZXJhdG9yKCkoX091dHB1dEl0ZXJhdG9yIF9fcywgY29uc3QgX0NoYXJUKiBfX3diLCBjb25zdCBfQ2hhclQqIF9fd2UpIGNvbnN0CisgICAgeworICAgICAgICByZXN1bHQgX19yID0gb2s7CisgICAgICAgIG1ic3RhdGVfdCBfX21iOworICAgICAgICB3aGlsZSAoX193YiA8IF9fd2UgJiYgX19yICE9IGVycm9yKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBpbnQgX19zeiA9IDMyOworICAgICAgICAgICAgY2hhciBfX2J1ZltfX3N6XTsKKyAgICAgICAgICAgIGNoYXIqIF9fYm47CisgICAgICAgICAgICBjb25zdCBjaGFyMTZfdCogX193biA9IChjb25zdCBjaGFyMTZfdCopX193YjsKKyAgICAgICAgICAgIF9fciA9IGRvX291dChfX21iLCAoY29uc3QgY2hhcjE2X3QqKV9fd2IsIChjb25zdCBjaGFyMTZfdCopX193ZSwgX193biwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2J1ZiwgX19idWYrX19zeiwgX19ibik7CisgICAgICAgICAgICBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6ZXJyb3IgfHwgX193biA9PSAoY29uc3QgY2hhcjE2X3QqKV9fd2IpCisgICAgICAgICAgICAgICAgX190aHJvd19ydW50aW1lX2Vycm9yKCJsb2NhbGUgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgZm9yIChjb25zdCBjaGFyKiBfX3AgPSBfX2J1ZjsgX19wIDwgX19ibjsgKytfX3AsICsrX19zKQorICAgICAgICAgICAgICAgICpfX3MgPSAqX19wOworICAgICAgICAgICAgX193YiA9IChjb25zdCBfQ2hhclQqKV9fd247CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fczsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9fbmFycm93X3RvX3V0Zjg8MzI+CisgICAgOiBwdWJsaWMgY29kZWN2dDxjaGFyMzJfdCwgY2hhciwgbWJzdGF0ZV90PgoreworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIF9fbmFycm93X3RvX3V0ZjgoKSA6IGNvZGVjdnQ8Y2hhcjMyX3QsIGNoYXIsIG1ic3RhdGVfdD4oMSkge30KKworICAgIH5fX25hcnJvd190b191dGY4KCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfQ2hhclQ+CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgb3BlcmF0b3IoKShfT3V0cHV0SXRlcmF0b3IgX19zLCBjb25zdCBfQ2hhclQqIF9fd2IsIGNvbnN0IF9DaGFyVCogX193ZSkgY29uc3QKKyAgICB7CisgICAgICAgIHJlc3VsdCBfX3IgPSBvazsKKyAgICAgICAgbWJzdGF0ZV90IF9fbWI7CisgICAgICAgIHdoaWxlIChfX3diIDwgX193ZSAmJiBfX3IgIT0gZXJyb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBfX3N6ID0gMzI7CisgICAgICAgICAgICBjaGFyIF9fYnVmW19fc3pdOworICAgICAgICAgICAgY2hhciogX19ibjsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIzMl90KiBfX3duID0gKGNvbnN0IGNoYXIzMl90KilfX3diOworICAgICAgICAgICAgX19yID0gZG9fb3V0KF9fbWIsIChjb25zdCBjaGFyMzJfdCopX193YiwgKGNvbnN0IGNoYXIzMl90KilfX3dlLCBfX3duLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVmLCBfX2J1ZitfX3N6LCBfX2JuKTsKKyAgICAgICAgICAgIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjplcnJvciB8fCBfX3duID09IChjb25zdCBjaGFyMzJfdCopX193YikKKyAgICAgICAgICAgICAgICBfX3Rocm93X3J1bnRpbWVfZXJyb3IoImxvY2FsZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGNoYXIqIF9fcCA9IF9fYnVmOyBfX3AgPCBfX2JuOyArK19fcCwgKytfX3MpCisgICAgICAgICAgICAgICAgKl9fcyA9ICpfX3A7CisgICAgICAgICAgICBfX3diID0gKGNvbnN0IF9DaGFyVCopX193bjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19zOworICAgIH0KK307CisKK3RlbXBsYXRlIDxzaXplX3QgX05wPgorc3RydWN0IF9fd2lkZW5fZnJvbV91dGY4Cit7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBvcGVyYXRvcigpKF9PdXRwdXRJdGVyYXRvciBfX3MsIGNvbnN0IGNoYXIqIF9fbmIsIGNvbnN0IGNoYXIqIF9fbmUpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfX3dpZGVuX2Zyb21fdXRmODw4PgoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgb3BlcmF0b3IoKShfT3V0cHV0SXRlcmF0b3IgX19zLCBjb25zdCBjaGFyKiBfX25iLCBjb25zdCBjaGFyKiBfX25lKSBjb25zdAorICAgIHsKKyAgICAgICAgZm9yICg7IF9fbmIgPCBfX25lOyArK19fbmIsICsrX19zKQorICAgICAgICAgICAgKl9fcyA9ICpfX25iOworICAgICAgICByZXR1cm4gX19zOworICAgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX193aWRlbl9mcm9tX3V0Zjg8MTY+CisgICAgOiBwdWJsaWMgY29kZWN2dDxjaGFyMTZfdCwgY2hhciwgbWJzdGF0ZV90PgoreworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIF9fd2lkZW5fZnJvbV91dGY4KCkgOiBjb2RlY3Z0PGNoYXIxNl90LCBjaGFyLCBtYnN0YXRlX3Q+KDEpIHt9CisKKyAgICB+X193aWRlbl9mcm9tX3V0ZjgoKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgb3BlcmF0b3IoKShfT3V0cHV0SXRlcmF0b3IgX19zLCBjb25zdCBjaGFyKiBfX25iLCBjb25zdCBjaGFyKiBfX25lKSBjb25zdAorICAgIHsKKyAgICAgICAgcmVzdWx0IF9fciA9IG9rOworICAgICAgICBtYnN0YXRlX3QgX19tYjsKKyAgICAgICAgd2hpbGUgKF9fbmIgPCBfX25lICYmIF9fciAhPSBlcnJvcikKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgaW50IF9fc3ogPSAzMjsKKyAgICAgICAgICAgIGNoYXIxNl90IF9fYnVmW19fc3pdOworICAgICAgICAgICAgY2hhcjE2X3QqIF9fYm47CisgICAgICAgICAgICBjb25zdCBjaGFyKiBfX25uID0gX19uYjsKKyAgICAgICAgICAgIF9fciA9IGRvX2luKF9fbWIsIF9fbmIsIF9fbmUgLSBfX25iID4gX19zeiA/IF9fbmIrX19zeiA6IF9fbmUsIF9fbm4sCisgICAgICAgICAgICAgICAgICAgICAgICBfX2J1ZiwgX19idWYrX19zeiwgX19ibik7CisgICAgICAgICAgICBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6ZXJyb3IgfHwgX19ubiA9PSBfX25iKQorICAgICAgICAgICAgICAgIF9fdGhyb3dfcnVudGltZV9lcnJvcigibG9jYWxlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgY2hhcjE2X3QqIF9fcCA9IF9fYnVmOyBfX3AgPCBfX2JuOyArK19fcCwgKytfX3MpCisgICAgICAgICAgICAgICAgKl9fcyA9ICh3Y2hhcl90KSpfX3A7CisgICAgICAgICAgICBfX25iID0gX19ubjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19zOworICAgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX193aWRlbl9mcm9tX3V0Zjg8MzI+CisgICAgOiBwdWJsaWMgY29kZWN2dDxjaGFyMzJfdCwgY2hhciwgbWJzdGF0ZV90PgoreworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIF9fd2lkZW5fZnJvbV91dGY4KCkgOiBjb2RlY3Z0PGNoYXIzMl90LCBjaGFyLCBtYnN0YXRlX3Q+KDEpIHt9CisKKyAgICB+X193aWRlbl9mcm9tX3V0ZjgoKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgb3BlcmF0b3IoKShfT3V0cHV0SXRlcmF0b3IgX19zLCBjb25zdCBjaGFyKiBfX25iLCBjb25zdCBjaGFyKiBfX25lKSBjb25zdAorICAgIHsKKyAgICAgICAgcmVzdWx0IF9fciA9IG9rOworICAgICAgICBtYnN0YXRlX3QgX19tYjsKKyAgICAgICAgd2hpbGUgKF9fbmIgPCBfX25lICYmIF9fciAhPSBlcnJvcikKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgaW50IF9fc3ogPSAzMjsKKyAgICAgICAgICAgIGNoYXIzMl90IF9fYnVmW19fc3pdOworICAgICAgICAgICAgY2hhcjMyX3QqIF9fYm47CisgICAgICAgICAgICBjb25zdCBjaGFyKiBfX25uID0gX19uYjsKKyAgICAgICAgICAgIF9fciA9IGRvX2luKF9fbWIsIF9fbmIsIF9fbmUgLSBfX25iID4gX19zeiA/IF9fbmIrX19zeiA6IF9fbmUsIF9fbm4sCisgICAgICAgICAgICAgICAgICAgICAgICBfX2J1ZiwgX19idWYrX19zeiwgX19ibik7CisgICAgICAgICAgICBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6ZXJyb3IgfHwgX19ubiA9PSBfX25iKQorICAgICAgICAgICAgICAgIF9fdGhyb3dfcnVudGltZV9lcnJvcigibG9jYWxlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgY2hhcjMyX3QqIF9fcCA9IF9fYnVmOyBfX3AgPCBfX2JuOyArK19fcCwgKytfX3MpCisgICAgICAgICAgICAgICAgKl9fcyA9ICh3Y2hhcl90KSpfX3A7CisgICAgICAgICAgICBfX25iID0gX19ubjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19zOworICAgIH0KK307CisKKy8vIHRlbXBsYXRlIDxjbGFzcyBjaGFyVD4gY2xhc3MgbnVtcHVuY3QKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgbnVtcHVuY3Q7CisKK3RlbXBsYXRlIDw+CitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIG51bXB1bmN0PGNoYXI+CisgICAgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAoreworcHVibGljOgorICAgIHR5cGVkZWYgY2hhciBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcl90eXBlPiBzdHJpbmdfdHlwZTsKKworICAgIGV4cGxpY2l0IG51bXB1bmN0KHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBjaGFyX3R5cGUgZGVjaW1hbF9wb2ludCgpIGNvbnN0IHtyZXR1cm4gZG9fZGVjaW1hbF9wb2ludCgpO30KKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgY2hhcl90eXBlIHRob3VzYW5kc19zZXAoKSBjb25zdCB7cmV0dXJuIGRvX3Rob3VzYW5kc19zZXAoKTt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIHN0cmluZyBncm91cGluZygpIGNvbnN0ICAgICAgICAge3JldHVybiBkb19ncm91cGluZygpO30KKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgc3RyaW5nX3R5cGUgdHJ1ZW5hbWUoKSBjb25zdCAgICB7cmV0dXJuIGRvX3RydWVuYW1lKCk7fQorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBzdHJpbmdfdHlwZSBmYWxzZW5hbWUoKSBjb25zdCAgIHtyZXR1cm4gZG9fZmFsc2VuYW1lKCk7fQorCisgICAgc3RhdGljIGxvY2FsZTo6aWQgaWQ7CisKK3Byb3RlY3RlZDoKKyAgICB+bnVtcHVuY3QoKTsKKyAgICB2aXJ0dWFsIGNoYXJfdHlwZSBkb19kZWNpbWFsX3BvaW50KCkgY29uc3Q7CisgICAgdmlydHVhbCBjaGFyX3R5cGUgZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0OworICAgIHZpcnR1YWwgc3RyaW5nIGRvX2dyb3VwaW5nKCkgY29uc3Q7CisgICAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb190cnVlbmFtZSgpIGNvbnN0OworICAgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fZmFsc2VuYW1lKCkgY29uc3Q7CisKKyAgICBjaGFyX3R5cGUgX19kZWNpbWFsX3BvaW50XzsKKyAgICBjaGFyX3R5cGUgX190aG91c2FuZHNfc2VwXzsKKyAgICBzdHJpbmcgX19ncm91cGluZ187Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBudW1wdW5jdDx3Y2hhcl90PgorICAgIDogcHVibGljIGxvY2FsZTo6ZmFjZXQKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHdjaGFyX3QgY2hhcl90eXBlOworICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZT4gc3RyaW5nX3R5cGU7CisKKyAgICBleHBsaWNpdCBudW1wdW5jdChzaXplX3QgX19yZWZzID0gMCk7CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgY2hhcl90eXBlIGRlY2ltYWxfcG9pbnQoKSBjb25zdCB7cmV0dXJuIGRvX2RlY2ltYWxfcG9pbnQoKTt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGNoYXJfdHlwZSB0aG91c2FuZHNfc2VwKCkgY29uc3Qge3JldHVybiBkb190aG91c2FuZHNfc2VwKCk7fQorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBzdHJpbmcgZ3JvdXBpbmcoKSBjb25zdCAgICAgICAgIHtyZXR1cm4gZG9fZ3JvdXBpbmcoKTt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIHN0cmluZ190eXBlIHRydWVuYW1lKCkgY29uc3QgICAge3JldHVybiBkb190cnVlbmFtZSgpO30KKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgc3RyaW5nX3R5cGUgZmFsc2VuYW1lKCkgY29uc3QgICB7cmV0dXJuIGRvX2ZhbHNlbmFtZSgpO30KKworICAgIHN0YXRpYyBsb2NhbGU6OmlkIGlkOworCitwcm90ZWN0ZWQ6CisgICAgfm51bXB1bmN0KCk7CisgICAgdmlydHVhbCBjaGFyX3R5cGUgZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0OworICAgIHZpcnR1YWwgY2hhcl90eXBlIGRvX3Rob3VzYW5kc19zZXAoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0cmluZyBkb19ncm91cGluZygpIGNvbnN0OworICAgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fdHJ1ZW5hbWUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX2ZhbHNlbmFtZSgpIGNvbnN0OworCisgICAgY2hhcl90eXBlIF9fZGVjaW1hbF9wb2ludF87CisgICAgY2hhcl90eXBlIF9fdGhvdXNhbmRzX3NlcF87CisgICAgc3RyaW5nIF9fZ3JvdXBpbmdfOworfTsKKworLy8gdGVtcGxhdGUgPGNsYXNzIGNoYXJUPiBjbGFzcyBudW1wdW5jdF9ieW5hbWUKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgbnVtcHVuY3RfYnluYW1lOworCit0ZW1wbGF0ZSA8PgorY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBudW1wdW5jdF9ieW5hbWU8Y2hhcj4KKzogcHVibGljIG51bXB1bmN0PGNoYXI+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBjaGFyIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyX3R5cGU+IHN0cmluZ190eXBlOworCisgICAgZXhwbGljaXQgbnVtcHVuY3RfYnluYW1lKGNvbnN0IGNoYXIqIF9fbm0sIHNpemVfdCBfX3JlZnMgPSAwKTsKKyAgICBleHBsaWNpdCBudW1wdW5jdF9ieW5hbWUoY29uc3Qgc3RyaW5nJiBfX25tLCBzaXplX3QgX19yZWZzID0gMCk7CisKK3Byb3RlY3RlZDoKKyAgICB+bnVtcHVuY3RfYnluYW1lKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBfX2luaXQoY29uc3QgY2hhciopOworfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgbnVtcHVuY3RfYnluYW1lPHdjaGFyX3Q+Cis6IHB1YmxpYyBudW1wdW5jdDx3Y2hhcl90PgoreworcHVibGljOgorICAgIHR5cGVkZWYgd2NoYXJfdCBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcl90eXBlPiBzdHJpbmdfdHlwZTsKKworICAgIGV4cGxpY2l0IG51bXB1bmN0X2J5bmFtZShjb25zdCBjaGFyKiBfX25tLCBzaXplX3QgX19yZWZzID0gMCk7CisgICAgZXhwbGljaXQgbnVtcHVuY3RfYnluYW1lKGNvbnN0IHN0cmluZyYgX19ubSwgc2l6ZV90IF9fcmVmcyA9IDApOworCitwcm90ZWN0ZWQ6CisgICAgfm51bXB1bmN0X2J5bmFtZSgpOworCitwcml2YXRlOgorICAgIHZvaWQgX19pbml0KGNvbnN0IGNoYXIqKTsKK307CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX19fTE9DQUxFCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX19tdXRleF9iYXNlIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fbXV0ZXhfYmFzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDJhNTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fbXV0ZXhfYmFzZQpAQCAtMCwwICsxLDQ0MCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9fX01VVEVYX0JBU0UKKyNkZWZpbmUgX0xJQkNQUF9fX01VVEVYX0JBU0UKKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisjaW5jbHVkZSA8X190aHJlYWRpbmdfc3VwcG9ydD4KKworCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9QVVNIX01BQ1JPUworI2luY2x1ZGUgPF9fdW5kZWZfbWFjcm9zPgorCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1RIUkVBRFMKKworI2lmbmRlZiBfTElCQ1BQX1RIUkVBRF9TQUZFVFlfQU5OT1RBVElPTgorIyAgaWZkZWYgX0xJQkNQUF9IQVNfVEhSRUFEX1NBRkVUWV9BTk5PVEFUSU9OUworIyAgICBkZWZpbmUgX0xJQkNQUF9USFJFQURfU0FGRVRZX0FOTk9UQVRJT04oeCkgX19hdHRyaWJ1dGVfXygoeCkpCisjICBlbHNlCisjICAgIGRlZmluZSBfTElCQ1BQX1RIUkVBRF9TQUZFVFlfQU5OT1RBVElPTih4KQorIyAgZW5kaWYKKyNlbmRpZiAgLy8gX0xJQkNQUF9USFJFQURfU0FGRVRZX0FOTk9UQVRJT04KKworY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBfTElCQ1BQX1RIUkVBRF9TQUZFVFlfQU5OT1RBVElPTihjYXBhYmlsaXR5KCJtdXRleCIpKSBtdXRleAoreworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfX2xpYmNwcF9tdXRleF90IF9fbV8gPSBfTElCQ1BQX01VVEVYX0lOSVRJQUxJWkVSOworI2Vsc2UKKyAgICBfX2xpYmNwcF9tdXRleF90IF9fbV87CisjZW5kaWYKKworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgY29uc3RleHByIG11dGV4KCkgPSBkZWZhdWx0OworI2Vsc2UKKyAgICBtdXRleCgpIF9OT0VYQ0VQVCB7X19tXyA9IChfX2xpYmNwcF9tdXRleF90KV9MSUJDUFBfTVVURVhfSU5JVElBTElaRVI7fQorI2VuZGlmCisgICAgfm11dGV4KCk7CisKK3ByaXZhdGU6CisgICAgbXV0ZXgoY29uc3QgbXV0ZXgmKTsvLyA9IGRlbGV0ZTsKKyAgICBtdXRleCYgb3BlcmF0b3I9KGNvbnN0IG11dGV4Jik7Ly8gPSBkZWxldGU7CisKK3B1YmxpYzoKKyAgICB2b2lkIGxvY2soKSBfTElCQ1BQX1RIUkVBRF9TQUZFVFlfQU5OT1RBVElPTihhY3F1aXJlX2NhcGFiaWxpdHkoKSk7CisgICAgYm9vbCB0cnlfbG9jaygpIF9OT0VYQ0VQVCBfTElCQ1BQX1RIUkVBRF9TQUZFVFlfQU5OT1RBVElPTih0cnlfYWNxdWlyZV9jYXBhYmlsaXR5KHRydWUpKTsKKyAgICB2b2lkIHVubG9jaygpIF9OT0VYQ0VQVCBfTElCQ1BQX1RIUkVBRF9TQUZFVFlfQU5OT1RBVElPTihyZWxlYXNlX2NhcGFiaWxpdHkoKSk7CisKKyAgICB0eXBlZGVmIF9fbGliY3BwX211dGV4X3QqIG5hdGl2ZV9oYW5kbGVfdHlwZTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIG5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlKCkge3JldHVybiAmX19tXzt9Cit9OworCitzdGF0aWNfYXNzZXJ0KGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPG11dGV4Pjo6dmFsdWUsCisgICAgICAgICAgICAgICJ0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb3Igc3RkOjptdXRleCBtdXN0IGJlIG5vdGhyb3ciKTsKKworc3RydWN0IF9MSUJDUFBfVFlQRV9WSVMgZGVmZXJfbG9ja190IHt9Oworc3RydWN0IF9MSUJDUFBfVFlQRV9WSVMgdHJ5X3RvX2xvY2tfdCB7fTsKK3N0cnVjdCBfTElCQ1BQX1RZUEVfVklTIGFkb3B0X2xvY2tfdCB7fTsKKworI2lmIGRlZmluZWQoX0xJQkNQUF9DWFgwM19MQU5HKSB8fCBkZWZpbmVkKF9MSUJDUFBfQlVJTERJTkdfTVVURVgpCisKK2V4dGVybiBjb25zdCBkZWZlcl9sb2NrX3QgIGRlZmVyX2xvY2s7CitleHRlcm4gY29uc3QgdHJ5X3RvX2xvY2tfdCB0cnlfdG9fbG9jazsKK2V4dGVybiBjb25zdCBhZG9wdF9sb2NrX3QgIGFkb3B0X2xvY2s7CisKKyNlbHNlCisKKy8qIF9MSUJDUFBfSU5MSU5FX1ZBUiAqLyBjb25zdGV4cHIgZGVmZXJfbG9ja190ICBkZWZlcl9sb2NrICA9IGRlZmVyX2xvY2tfdCgpOworLyogX0xJQkNQUF9JTkxJTkVfVkFSICovIGNvbnN0ZXhwciB0cnlfdG9fbG9ja190IHRyeV90b19sb2NrID0gdHJ5X3RvX2xvY2tfdCgpOworLyogX0xJQkNQUF9JTkxJTkVfVkFSICovIGNvbnN0ZXhwciBhZG9wdF9sb2NrX3QgIGFkb3B0X2xvY2sgID0gYWRvcHRfbG9ja190KCk7CisKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX011dGV4PgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX0xJQkNQUF9USFJFQURfU0FGRVRZX0FOTk9UQVRJT04oc2NvcGVkX2xvY2thYmxlKQorbG9ja19ndWFyZAoreworcHVibGljOgorICAgIHR5cGVkZWYgX011dGV4IG11dGV4X3R5cGU7CisKK3ByaXZhdGU6CisgICAgbXV0ZXhfdHlwZSYgX19tXzsKK3B1YmxpYzoKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBsb2NrX2d1YXJkKG11dGV4X3R5cGUmIF9fbSkgX0xJQkNQUF9USFJFQURfU0FGRVRZX0FOTk9UQVRJT04oYWNxdWlyZV9jYXBhYmlsaXR5KF9fbSkpCisgICAgICAgIDogX19tXyhfX20pIHtfX21fLmxvY2soKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGxvY2tfZ3VhcmQobXV0ZXhfdHlwZSYgX19tLCBhZG9wdF9sb2NrX3QpIF9MSUJDUFBfVEhSRUFEX1NBRkVUWV9BTk5PVEFUSU9OKHJlcXVpcmVzX2NhcGFiaWxpdHkoX19tKSkKKyAgICAgICAgOiBfX21fKF9fbSkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgfmxvY2tfZ3VhcmQoKSBfTElCQ1BQX1RIUkVBRF9TQUZFVFlfQU5OT1RBVElPTihyZWxlYXNlX2NhcGFiaWxpdHkoKSkge19fbV8udW5sb2NrKCk7fQorCitwcml2YXRlOgorICAgIGxvY2tfZ3VhcmQobG9ja19ndWFyZCBjb25zdCYpIF9MSUJDUFBfRVFVQUxfREVMRVRFOworICAgIGxvY2tfZ3VhcmQmIG9wZXJhdG9yPShsb2NrX2d1YXJkIGNvbnN0JikgX0xJQkNQUF9FUVVBTF9ERUxFVEU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX011dGV4PgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdW5pcXVlX2xvY2sKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9NdXRleCBtdXRleF90eXBlOworCitwcml2YXRlOgorICAgIG11dGV4X3R5cGUqIF9fbV87CisgICAgYm9vbCBfX293bnNfOworCitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVuaXF1ZV9sb2NrKCkgX05PRVhDRVBUIDogX19tXyhudWxscHRyKSwgX19vd25zXyhmYWxzZSkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgdW5pcXVlX2xvY2sobXV0ZXhfdHlwZSYgX19tKQorICAgICAgICA6IF9fbV8oX1ZTVEQ6OmFkZHJlc3NvZihfX20pKSwgX19vd25zXyh0cnVlKSB7X19tXy0+bG9jaygpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5pcXVlX2xvY2sobXV0ZXhfdHlwZSYgX19tLCBkZWZlcl9sb2NrX3QpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fbV8oX1ZTVEQ6OmFkZHJlc3NvZihfX20pKSwgX19vd25zXyhmYWxzZSkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5pcXVlX2xvY2sobXV0ZXhfdHlwZSYgX19tLCB0cnlfdG9fbG9ja190KQorICAgICAgICA6IF9fbV8oX1ZTVEQ6OmFkZHJlc3NvZihfX20pKSwgX19vd25zXyhfX20udHJ5X2xvY2soKSkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5pcXVlX2xvY2sobXV0ZXhfdHlwZSYgX19tLCBhZG9wdF9sb2NrX3QpCisgICAgICAgIDogX19tXyhfVlNURDo6YWRkcmVzc29mKF9fbSkpLCBfX293bnNfKHRydWUpIHt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdW5pcXVlX2xvY2sobXV0ZXhfdHlwZSYgX19tLCBjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX3QpCisgICAgICAgICAgICA6IF9fbV8oX1ZTVEQ6OmFkZHJlc3NvZihfX20pKSwgX19vd25zXyhfX20udHJ5X2xvY2tfdW50aWwoX190KSkge30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1JlcCwgY2xhc3MgX1BlcmlvZD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHVuaXF1ZV9sb2NrKG11dGV4X3R5cGUmIF9fbSwgY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19kKQorICAgICAgICAgICAgOiBfX21fKF9WU1REOjphZGRyZXNzb2YoX19tKSksIF9fb3duc18oX19tLnRyeV9sb2NrX2ZvcihfX2QpKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB+dW5pcXVlX2xvY2soKQorICAgIHsKKyAgICAgICAgaWYgKF9fb3duc18pCisgICAgICAgICAgICBfX21fLT51bmxvY2soKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdW5pcXVlX2xvY2sodW5pcXVlX2xvY2sgY29uc3QmKTsgLy8gPSBkZWxldGU7CisgICAgdW5pcXVlX2xvY2smIG9wZXJhdG9yPSh1bmlxdWVfbG9jayBjb25zdCYpOyAvLyA9IGRlbGV0ZTsKKworcHVibGljOgorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5pcXVlX2xvY2sodW5pcXVlX2xvY2smJiBfX3UpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fbV8oX191Ll9fbV8pLCBfX293bnNfKF9fdS5fX293bnNfKQorICAgICAgICB7X191Ll9fbV8gPSBudWxscHRyOyBfX3UuX19vd25zXyA9IGZhbHNlO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5pcXVlX2xvY2smIG9wZXJhdG9yPSh1bmlxdWVfbG9jayYmIF9fdSkgX05PRVhDRVBUCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX293bnNfKQorICAgICAgICAgICAgICAgIF9fbV8tPnVubG9jaygpOworICAgICAgICAgICAgX19tXyA9IF9fdS5fX21fOworICAgICAgICAgICAgX19vd25zXyA9IF9fdS5fX293bnNfOworICAgICAgICAgICAgX191Ll9fbV8gPSBudWxscHRyOworICAgICAgICAgICAgX191Ll9fb3duc18gPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgdm9pZCBsb2NrKCk7CisgICAgYm9vbCB0cnlfbG9jaygpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CisgICAgICAgIGJvb2wgdHJ5X2xvY2tfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fZCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgorICAgICAgICBib29sIHRyeV9sb2NrX3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fdCk7CisKKyAgICB2b2lkIHVubG9jaygpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc3dhcCh1bmlxdWVfbG9jayYgX191KSBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIF9WU1REOjpzd2FwKF9fbV8sIF9fdS5fX21fKTsKKyAgICAgICAgX1ZTVEQ6OnN3YXAoX19vd25zXywgX191Ll9fb3duc18pOworICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgbXV0ZXhfdHlwZSogcmVsZWFzZSgpIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgbXV0ZXhfdHlwZSogX19tID0gX19tXzsKKyAgICAgICAgX19tXyA9IG51bGxwdHI7CisgICAgICAgIF9fb3duc18gPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIF9fbTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvd25zX2xvY2soKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX293bnNfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX0xJQkNQUF9FWFBMSUNJVAorICAgICAgICBvcGVyYXRvciBib29sICgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fb3duc187fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBtdXRleF90eXBlKiBtdXRleCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fbV87fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9NdXRleD4KK3ZvaWQKK3VuaXF1ZV9sb2NrPF9NdXRleD46OmxvY2soKQoreworICAgIGlmIChfX21fID09IG51bGxwdHIpCisgICAgICAgIF9fdGhyb3dfc3lzdGVtX2Vycm9yKEVQRVJNLCAidW5pcXVlX2xvY2s6OmxvY2s6IHJlZmVyZW5jZXMgbnVsbCBtdXRleCIpOworICAgIGlmIChfX293bnNfKQorICAgICAgICBfX3Rocm93X3N5c3RlbV9lcnJvcihFREVBRExLLCAidW5pcXVlX2xvY2s6OmxvY2s6IGFscmVhZHkgbG9ja2VkIik7CisgICAgX19tXy0+bG9jaygpOworICAgIF9fb3duc18gPSB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX011dGV4PgorYm9vbAordW5pcXVlX2xvY2s8X011dGV4Pjo6dHJ5X2xvY2soKQoreworICAgIGlmIChfX21fID09IG51bGxwdHIpCisgICAgICAgIF9fdGhyb3dfc3lzdGVtX2Vycm9yKEVQRVJNLCAidW5pcXVlX2xvY2s6OnRyeV9sb2NrOiByZWZlcmVuY2VzIG51bGwgbXV0ZXgiKTsKKyAgICBpZiAoX19vd25zXykKKyAgICAgICAgX190aHJvd19zeXN0ZW1fZXJyb3IoRURFQURMSywgInVuaXF1ZV9sb2NrOjp0cnlfbG9jazogYWxyZWFkeSBsb2NrZWQiKTsKKyAgICBfX293bnNfID0gX19tXy0+dHJ5X2xvY2soKTsKKyAgICByZXR1cm4gX19vd25zXzsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9NdXRleD4KK3RlbXBsYXRlIDxjbGFzcyBfUmVwLCBjbGFzcyBfUGVyaW9kPgorYm9vbAordW5pcXVlX2xvY2s8X011dGV4Pjo6dHJ5X2xvY2tfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fZCkKK3sKKyAgICBpZiAoX19tXyA9PSBudWxscHRyKQorICAgICAgICBfX3Rocm93X3N5c3RlbV9lcnJvcihFUEVSTSwgInVuaXF1ZV9sb2NrOjp0cnlfbG9ja19mb3I6IHJlZmVyZW5jZXMgbnVsbCBtdXRleCIpOworICAgIGlmIChfX293bnNfKQorICAgICAgICBfX3Rocm93X3N5c3RlbV9lcnJvcihFREVBRExLLCAidW5pcXVlX2xvY2s6OnRyeV9sb2NrX2ZvcjogYWxyZWFkeSBsb2NrZWQiKTsKKyAgICBfX293bnNfID0gX19tXy0+dHJ5X2xvY2tfZm9yKF9fZCk7CisgICAgcmV0dXJuIF9fb3duc187Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfTXV0ZXg+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0Nsb2NrLCBjbGFzcyBfRHVyYXRpb24+Citib29sCit1bmlxdWVfbG9jazxfTXV0ZXg+Ojp0cnlfbG9ja191bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX3QpCit7CisgICAgaWYgKF9fbV8gPT0gbnVsbHB0cikKKyAgICAgICAgX190aHJvd19zeXN0ZW1fZXJyb3IoRVBFUk0sICJ1bmlxdWVfbG9jazo6dHJ5X2xvY2tfdW50aWw6IHJlZmVyZW5jZXMgbnVsbCBtdXRleCIpOworICAgIGlmIChfX293bnNfKQorICAgICAgICBfX3Rocm93X3N5c3RlbV9lcnJvcihFREVBRExLLCAidW5pcXVlX2xvY2s6OnRyeV9sb2NrX3VudGlsOiBhbHJlYWR5IGxvY2tlZCIpOworICAgIF9fb3duc18gPSBfX21fLT50cnlfbG9ja191bnRpbChfX3QpOworICAgIHJldHVybiBfX293bnNfOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX011dGV4Pgordm9pZAordW5pcXVlX2xvY2s8X011dGV4Pjo6dW5sb2NrKCkKK3sKKyAgICBpZiAoIV9fb3duc18pCisgICAgICAgIF9fdGhyb3dfc3lzdGVtX2Vycm9yKEVQRVJNLCAidW5pcXVlX2xvY2s6OnVubG9jazogbm90IGxvY2tlZCIpOworICAgIF9fbV8tPnVubG9jaygpOworICAgIF9fb3duc18gPSBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9NdXRleD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzd2FwKHVuaXF1ZV9sb2NrPF9NdXRleD4mIF9feCwgdW5pcXVlX2xvY2s8X011dGV4PiYgX195KSBfTk9FWENFUFQKKyAgICB7X194LnN3YXAoX195KTt9CisKKy8vZW51bSBjbGFzcyBjdl9zdGF0dXMKK19MSUJDUFBfREVDTEFSRV9TVFJPTkdfRU5VTShjdl9zdGF0dXMpCit7CisgICAgbm9fdGltZW91dCwKKyAgICB0aW1lb3V0Cit9OworX0xJQkNQUF9ERUNMQVJFX1NUUk9OR19FTlVNX0VQSUxPRyhjdl9zdGF0dXMpCisKK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgY29uZGl0aW9uX3ZhcmlhYmxlCit7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9fbGliY3BwX2NvbmR2YXJfdCBfX2N2XyA9IF9MSUJDUFBfQ09ORFZBUl9JTklUSUFMSVpFUjsKKyNlbHNlCisgICAgX19saWJjcHBfY29uZHZhcl90IF9fY3ZfOworI2VuZGlmCisKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIGNvbnN0ZXhwciBjb25kaXRpb25fdmFyaWFibGUoKSBfTk9FWENFUFQgPSBkZWZhdWx0OworI2Vsc2UKKyAgICBjb25kaXRpb25fdmFyaWFibGUoKSBfTk9FWENFUFQge19fY3ZfID0gKF9fbGliY3BwX2NvbmR2YXJfdClfTElCQ1BQX0NPTkRWQVJfSU5JVElBTElaRVI7fQorI2VuZGlmCisgICAgfmNvbmRpdGlvbl92YXJpYWJsZSgpOworCitwcml2YXRlOgorICAgIGNvbmRpdGlvbl92YXJpYWJsZShjb25zdCBjb25kaXRpb25fdmFyaWFibGUmKTsgLy8gPSBkZWxldGU7CisgICAgY29uZGl0aW9uX3ZhcmlhYmxlJiBvcGVyYXRvcj0oY29uc3QgY29uZGl0aW9uX3ZhcmlhYmxlJik7IC8vID0gZGVsZXRlOworCitwdWJsaWM6CisgICAgdm9pZCBub3RpZnlfb25lKCkgX05PRVhDRVBUOworICAgIHZvaWQgbm90aWZ5X2FsbCgpIF9OT0VYQ0VQVDsKKworICAgIHZvaWQgd2FpdCh1bmlxdWVfbG9jazxtdXRleD4mIF9fbGspIF9OT0VYQ0VQVDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4KKyAgICAgICAgX0xJQkNQUF9NRVRIT0RfVEVNUExBVEVfSU1QTElDSVRfSU5TVEFOVElBVElPTl9WSVMKKyAgICAgICAgdm9pZCB3YWl0KHVuaXF1ZV9sb2NrPG11dGV4PiYgX19saywgX1ByZWRpY2F0ZSBfX3ByZWQpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgorICAgICAgICBfTElCQ1BQX01FVEhPRF9URU1QTEFURV9JTVBMSUNJVF9JTlNUQU5USUFUSU9OX1ZJUworICAgICAgICBjdl9zdGF0dXMKKyAgICAgICAgd2FpdF91bnRpbCh1bmlxdWVfbG9jazxtdXRleD4mIF9fbGssCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX190KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2xvY2ssIGNsYXNzIF9EdXJhdGlvbiwgY2xhc3MgX1ByZWRpY2F0ZT4KKyAgICAgICAgX0xJQkNQUF9NRVRIT0RfVEVNUExBVEVfSU1QTElDSVRfSU5TVEFOVElBVElPTl9WSVMKKyAgICAgICAgYm9vbAorICAgICAgICB3YWl0X3VudGlsKHVuaXF1ZV9sb2NrPG11dGV4PiYgX19saywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX3QsCisgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CisgICAgICAgIF9MSUJDUFBfTUVUSE9EX1RFTVBMQVRFX0lNUExJQ0lUX0lOU1RBTlRJQVRJT05fVklTCisgICAgICAgIGN2X3N0YXR1cworICAgICAgICB3YWl0X2Zvcih1bmlxdWVfbG9jazxtdXRleD4mIF9fbGssCisgICAgICAgICAgICAgICAgIGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fZCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1JlcCwgY2xhc3MgX1BlcmlvZCwgY2xhc3MgX1ByZWRpY2F0ZT4KKyAgICAgICAgYm9vbAorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHdhaXRfZm9yKHVuaXF1ZV9sb2NrPG11dGV4PiYgX19saywKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19kLAorICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCk7CisKKyAgICB0eXBlZGVmIF9fbGliY3BwX2NvbmR2YXJfdCogbmF0aXZlX2hhbmRsZV90eXBlOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGUoKSB7cmV0dXJuICZfX2N2Xzt9CisKK3ByaXZhdGU6CisgICAgdm9pZCBfX2RvX3RpbWVkX3dhaXQodW5pcXVlX2xvY2s8bXV0ZXg+JiBfX2xrLAorICAgICAgIGNocm9ubzo6dGltZV9wb2ludDxjaHJvbm86OnN5c3RlbV9jbG9jaywgY2hyb25vOjpuYW5vc2Vjb25kcz4pIF9OT0VYQ0VQVDsKK307CisjZW5kaWYgLy8gIV9MSUJDUFBfSEFTX05PX1RIUkVBRFMKKwordGVtcGxhdGUgPGNsYXNzIF9UbywgY2xhc3MgX1JlcCwgY2xhc3MgX1BlcmlvZD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBjaHJvbm86Ol9faXNfZHVyYXRpb248X1RvPjo6dmFsdWUsCisgICAgX1RvCis+Ojp0eXBlCitfX2NlaWwoY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiBfX2QpCit7CisgICAgdXNpbmcgbmFtZXNwYWNlIGNocm9ubzsKKyAgICBfVG8gX19yID0gZHVyYXRpb25fY2FzdDxfVG8+KF9fZCk7CisgICAgaWYgKF9fciA8IF9fZCkKKyAgICAgICAgKytfX3I7CisgICAgcmV0dXJuIF9fcjsKK30KKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19USFJFQURTCit0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4KK3ZvaWQKK2NvbmRpdGlvbl92YXJpYWJsZTo6d2FpdCh1bmlxdWVfbG9jazxtdXRleD4mIF9fbGssIF9QcmVkaWNhdGUgX19wcmVkKQoreworICAgIHdoaWxlICghX19wcmVkKCkpCisgICAgICAgIHdhaXQoX19sayk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2xvY2ssIGNsYXNzIF9EdXJhdGlvbj4KK2N2X3N0YXR1cworY29uZGl0aW9uX3ZhcmlhYmxlOjp3YWl0X3VudGlsKHVuaXF1ZV9sb2NrPG11dGV4PiYgX19saywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX3QpCit7CisgICAgdXNpbmcgbmFtZXNwYWNlIGNocm9ubzsKKyAgICB3YWl0X2ZvcihfX2xrLCBfX3QgLSBfQ2xvY2s6Om5vdygpKTsKKyAgICByZXR1cm4gX0Nsb2NrOjpub3coKSA8IF9fdCA/IGN2X3N0YXR1czo6bm9fdGltZW91dCA6IGN2X3N0YXR1czo6dGltZW91dDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uLCBjbGFzcyBfUHJlZGljYXRlPgorYm9vbAorY29uZGl0aW9uX3ZhcmlhYmxlOjp3YWl0X3VudGlsKHVuaXF1ZV9sb2NrPG11dGV4PiYgX19saywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX3QsCisgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQpCit7CisgICAgd2hpbGUgKCFfX3ByZWQoKSkKKyAgICB7CisgICAgICAgIGlmICh3YWl0X3VudGlsKF9fbGssIF9fdCkgPT0gY3Zfc3RhdHVzOjp0aW1lb3V0KQorICAgICAgICAgICAgcmV0dXJuIF9fcHJlZCgpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+Citjdl9zdGF0dXMKK2NvbmRpdGlvbl92YXJpYWJsZTo6d2FpdF9mb3IodW5pcXVlX2xvY2s8bXV0ZXg+JiBfX2xrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaHJvbm86OmR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX2QpCit7CisgICAgdXNpbmcgbmFtZXNwYWNlIGNocm9ubzsKKyAgICBpZiAoX19kIDw9IF9fZC56ZXJvKCkpCisgICAgICAgIHJldHVybiBjdl9zdGF0dXM6OnRpbWVvdXQ7CisgICAgdHlwZWRlZiB0aW1lX3BvaW50PHN5c3RlbV9jbG9jaywgZHVyYXRpb248bG9uZyBkb3VibGUsIG5hbm8+ID4gX19zeXNfdHBmOworICAgIHR5cGVkZWYgdGltZV9wb2ludDxzeXN0ZW1fY2xvY2ssIG5hbm9zZWNvbmRzPiBfX3N5c190cGk7CisgICAgX19zeXNfdHBmIF9NYXggPSBfX3N5c190cGk6Om1heCgpOworICAgIHN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBfX2Nfbm93ID0gc3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICBzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgX19zX25vdyA9IHN5c3RlbV9jbG9jazo6bm93KCk7CisgICAgaWYgKF9NYXggLSBfX2QgPiBfX3Nfbm93KQorICAgICAgICBfX2RvX3RpbWVkX3dhaXQoX19saywgX19zX25vdyArIF9fY2VpbDxuYW5vc2Vjb25kcz4oX19kKSk7CisgICAgZWxzZQorICAgICAgICBfX2RvX3RpbWVkX3dhaXQoX19saywgX19zeXNfdHBpOjptYXgoKSk7CisgICAgcmV0dXJuIHN0ZWFkeV9jbG9jazo6bm93KCkgLSBfX2Nfbm93IDwgX19kID8gY3Zfc3RhdHVzOjpub190aW1lb3V0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdl9zdGF0dXM6OnRpbWVvdXQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVwLCBjbGFzcyBfUGVyaW9kLCBjbGFzcyBfUHJlZGljYXRlPgoraW5saW5lCitib29sCitjb25kaXRpb25fdmFyaWFibGU6OndhaXRfZm9yKHVuaXF1ZV9sb2NrPG11dGV4PiYgX19saywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCkKK3sKKyAgICByZXR1cm4gd2FpdF91bnRpbChfX2xrLCBjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgKyBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6Om1vdmUoX19wcmVkKSk7Cit9CisKKyNlbmRpZiAvLyAhX0xJQkNQUF9IQVNfTk9fVEhSRUFEUworCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKK19MSUJDUFBfUE9QX01BQ1JPUworCisjZW5kaWYgIC8vIF9MSUJDUFBfX19NVVRFWF9CQVNFCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX19udWxscHRyIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fbnVsbHB0cgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzQxMjM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fbnVsbHB0cgpAQCAtMCwwICsxLDYyIEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gX19udWxscHRyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX05VTExQVFIKKyNkZWZpbmUgX0xJQkNQUF9OVUxMUFRSCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKKyNpZmRlZiBfTElCQ1BQX0hBU19OT19OVUxMUFRSCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgbnVsbHB0cl90Cit7CisgICAgdm9pZCogX19seDsKKworICAgIHN0cnVjdCBfX25hdCB7aW50IF9fZm9yX2Jvb2xfO307CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgX0xJQkNQUF9DT05TVEVYUFIgbnVsbHB0cl90KCkgOiBfX2x4KDApIHt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIF9MSUJDUFBfQ09OU1RFWFBSIG51bGxwdHJfdChpbnQgX19uYXQ6OiopIDogX19seCgwKSB7fQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIF9MSUJDUFBfQ09OU1RFWFBSIG9wZXJhdG9yIGludCBfX25hdDo6KigpIGNvbnN0IHtyZXR1cm4gMDt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgICAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgX0xJQkNQUF9DT05TVEVYUFIKKyAgICAgICAgb3BlcmF0b3IgX1RwKiAoKSBjb25zdCB7cmV0dXJuIDA7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorICAgICAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICAgICAgb3BlcmF0b3IgX1RwIF9VcDo6KiAoKSBjb25zdCB7cmV0dXJuIDA7fQorCisgICAgZnJpZW5kIF9MSUJDUFBfQUxXQVlTX0lOTElORSBfTElCQ1BQX0NPTlNURVhQUiBib29sIG9wZXJhdG9yPT0obnVsbHB0cl90LCBudWxscHRyX3QpIHtyZXR1cm4gdHJ1ZTt9CisgICAgZnJpZW5kIF9MSUJDUFBfQUxXQVlTX0lOTElORSBfTElCQ1BQX0NPTlNURVhQUiBib29sIG9wZXJhdG9yIT0obnVsbHB0cl90LCBudWxscHRyX3QpIHtyZXR1cm4gZmFsc2U7fQorfTsKKworaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORSBfTElCQ1BQX0NPTlNURVhQUiBudWxscHRyX3QgX19nZXRfbnVsbHB0cl90KCkge3JldHVybiBudWxscHRyX3QoMCk7fQorCisjZGVmaW5lIG51bGxwdHIgX1ZTVEQ6Ol9fZ2V0X251bGxwdHJfdCgpCisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2Vsc2UgIC8vIF9MSUJDUFBfSEFTX05PX05VTExQVFIKKworbmFtZXNwYWNlIHN0ZAoreworICAgIHR5cGVkZWYgZGVjbHR5cGUobnVsbHB0cikgbnVsbHB0cl90OworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfSEFTX05PX05VTExQVFIKKworI2VuZGlmICAvLyBfTElCQ1BQX05VTExQVFIKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX3NwbGl0X2J1ZmZlciBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX3NwbGl0X2J1ZmZlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGFhNGU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fc3BsaXRfYnVmZmVyCkBAIC0wLDAgKzEsNjM3IEBACisvLyAtKi0gQysrIC0qLQorI2lmbmRlZiBfTElCQ1BQX1NQTElUX0JVRkZFUgorI2RlZmluZSBfTElCQ1BQX1NQTElUX0JVRkZFUgorCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9QVVNIX01BQ1JPUworI2luY2x1ZGUgPF9fdW5kZWZfbWFjcm9zPgorCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCit0ZW1wbGF0ZSA8Ym9vbD4KK2NsYXNzIF9fc3BsaXRfYnVmZmVyX2NvbW1vbgoreworcHJvdGVjdGVkOgorICAgIHZvaWQgX190aHJvd19sZW5ndGhfZXJyb3IoKSBjb25zdDsKKyAgICB2b2lkIF9fdGhyb3dfb3V0X29mX3JhbmdlKCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yID0gYWxsb2NhdG9yPF9UcD4gPgorc3RydWN0IF9fc3BsaXRfYnVmZmVyCisgICAgOiBwcml2YXRlIF9fc3BsaXRfYnVmZmVyX2NvbW1vbjx0cnVlPgoreworcHJpdmF0ZToKKyAgICBfX3NwbGl0X2J1ZmZlcihjb25zdCBfX3NwbGl0X2J1ZmZlciYpOworICAgIF9fc3BsaXRfYnVmZmVyJiBvcGVyYXRvcj0oY29uc3QgX19zcGxpdF9idWZmZXImKTsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8YWxsb2NhdG9yX3R5cGU+Ojp0eXBlIF9fYWxsb2NfcnI7CisgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPF9fYWxsb2NfcnI+ICAgICAgICAgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpzaXplX3R5cGUgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpwb2ludGVyICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2FsbG9jX3RyYWl0czo6Y29uc3RfcG9pbnRlciAgICAgICAgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiBjb25zdF9wb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKworICAgIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmlyc3RfOworICAgIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmVnaW5fOworICAgIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZW5kXzsKKyAgICBfX2NvbXByZXNzZWRfcGFpcjxwb2ludGVyLCBhbGxvY2F0b3JfdHlwZT4gX19lbmRfY2FwXzsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8YWxsb2NhdG9yX3R5cGU+Ojp0eXBlIF9fYWxsb2NfcmVmOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8YWxsb2NhdG9yX3R5cGU+Ojp0eXBlIF9fYWxsb2NfY29uc3RfcmVmOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX2FsbG9jX3JyJiAgICAgICAgICAgX19hbGxvYygpIF9OT0VYQ0VQVCAgICAgICAgIHtyZXR1cm4gX19lbmRfY2FwXy5zZWNvbmQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdCBfX2FsbG9jX3JyJiAgICAgX19hbGxvYygpIGNvbnN0IF9OT0VYQ0VQVCAgIHtyZXR1cm4gX19lbmRfY2FwXy5zZWNvbmQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBwb2ludGVyJiAgICAgICAgICAgICAgX19lbmRfY2FwKCkgX05PRVhDRVBUICAgICAgIHtyZXR1cm4gX19lbmRfY2FwXy5maXJzdCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0IHBvaW50ZXImICAgICAgICBfX2VuZF9jYXAoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX2VuZF9jYXBfLmZpcnN0KCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fc3BsaXRfYnVmZmVyKCkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19zcGxpdF9idWZmZXIoX19hbGxvY19yciYgX19hKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19zcGxpdF9idWZmZXIoY29uc3QgX19hbGxvY19yciYgX19hKTsKKyAgICBfX3NwbGl0X2J1ZmZlcihzaXplX3R5cGUgX19jYXAsIHNpemVfdHlwZSBfX3N0YXJ0LCBfX2FsbG9jX3JyJiBfX2EpOworICAgIH5fX3NwbGl0X2J1ZmZlcigpOworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9fc3BsaXRfYnVmZmVyKF9fc3BsaXRfYnVmZmVyJiYgX19jKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpOworICAgIF9fc3BsaXRfYnVmZmVyKF9fc3BsaXRfYnVmZmVyJiYgX19jLCBjb25zdCBfX2FsbG9jX3JyJiBfX2EpOworICAgIF9fc3BsaXRfYnVmZmVyJiBvcGVyYXRvcj0oX19zcGxpdF9idWZmZXImJiBfX2MpCisgICAgICAgIF9OT0VYQ0VQVF8oKF9fYWxsb2NfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKSB8fAorICAgICAgICAgICAgICAgIV9fYWxsb2NfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWUpOworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgICAgICAgaXRlcmF0b3IgYmVnaW4oKSBfTk9FWENFUFQgICAgICAge3JldHVybiBfX2JlZ2luXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fYmVnaW5fO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZICAgICAgIGl0ZXJhdG9yIGVuZCgpIF9OT0VYQ0VQVCAgICAgICAgIHtyZXR1cm4gX19lbmRfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IF9OT0VYQ0VQVCAgIHtyZXR1cm4gX19lbmRfO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGNsZWFyKCkgX05PRVhDRVBUCisgICAgICAgIHtfX2Rlc3RydWN0X2F0X2VuZChfX2JlZ2luXyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7cmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19lbmRfIC0gX19iZWdpbl8pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJvb2wgZW1wdHkoKSAgICAgY29uc3Qge3JldHVybiBfX2VuZF8gPT0gX19iZWdpbl87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc2l6ZV90eXBlIGNhcGFjaXR5KCkgY29uc3Qge3JldHVybiBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fZW5kX2NhcCgpIC0gX19maXJzdF8pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHNpemVfdHlwZSBfX2Zyb250X3NwYXJlKCkgY29uc3Qge3JldHVybiBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fYmVnaW5fIC0gX19maXJzdF8pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHNpemVfdHlwZSBfX2JhY2tfc3BhcmUoKSBjb25zdCB7cmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19lbmRfY2FwKCkgLSBfX2VuZF8pO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgICAgICAgcmVmZXJlbmNlIGZyb250KCkgICAgICAge3JldHVybiAqX19iZWdpbl87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3Qge3JldHVybiAqX19iZWdpbl87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgICAgICAgcmVmZXJlbmNlIGJhY2soKSAgICAgICAge3JldHVybiAqKF9fZW5kXyAtIDEpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgIHtyZXR1cm4gKihfX2VuZF8gLSAxKTt9CisKKyAgICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIF9fbik7CisgICAgdm9pZCBzaHJpbmtfdG9fZml0KCkgX05PRVhDRVBUOworICAgIHZvaWQgcHVzaF9mcm9udChjb25zdF9yZWZlcmVuY2UgX194KTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgcHVzaF9iYWNrKGNvbnN0X3JlZmVyZW5jZSBfX3gpOworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB2b2lkIHB1c2hfZnJvbnQodmFsdWVfdHlwZSYmIF9feCk7CisgICAgdm9pZCBwdXNoX2JhY2sodmFsdWVfdHlwZSYmIF9feCk7CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorICAgICAgICB2b2lkIGVtcGxhY2VfYmFjayhfQXJncyYmLi4uIF9fYXJncyk7CisjZW5kaWYgIC8vICFkZWZpbmVkKF9MSUJDUFBfQ1hYMDNfTEFORykKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCBwb3BfZnJvbnQoKSB7X19kZXN0cnVjdF9hdF9iZWdpbihfX2JlZ2luXysxKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIHBvcF9iYWNrKCkge19fZGVzdHJ1Y3RfYXRfZW5kKF9fZW5kXy0xKTt9CisKKyAgICB2b2lkIF9fY29uc3RydWN0X2F0X2VuZChzaXplX3R5cGUgX19uKTsKKyAgICB2b2lkIF9fY29uc3RydWN0X2F0X2VuZChzaXplX3R5cGUgX19uLCBjb25zdF9yZWZlcmVuY2UgX194KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIF9faXNfaW5wdXRfaXRlcmF0b3I8X0lucHV0SXRlcj46OnZhbHVlICYmCisgICAgICAgICAgICFfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0lucHV0SXRlcj46OnZhbHVlLAorICAgICAgICAgICAgdm9pZAorICAgICAgICA+Ojp0eXBlCisgICAgICAgIF9fY29uc3RydWN0X2F0X2VuZChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgICAgICAgICB2b2lkCisgICAgICAgID46OnR5cGUKKyAgICAgICAgX19jb25zdHJ1Y3RfYXRfZW5kKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIF9fZGVzdHJ1Y3RfYXRfYmVnaW4ocG9pbnRlciBfX25ld19iZWdpbikKKyAgICAgICAge19fZGVzdHJ1Y3RfYXRfYmVnaW4oX19uZXdfYmVnaW4sIGlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGU8dmFsdWVfdHlwZT4oKSk7fQorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQgX19kZXN0cnVjdF9hdF9iZWdpbihwb2ludGVyIF9fbmV3X2JlZ2luLCBmYWxzZV90eXBlKTsKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB2b2lkIF9fZGVzdHJ1Y3RfYXRfYmVnaW4ocG9pbnRlciBfX25ld19iZWdpbiwgdHJ1ZV90eXBlKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fZGVzdHJ1Y3RfYXRfZW5kKHBvaW50ZXIgX19uZXdfbGFzdCkgX05PRVhDRVBUCisgICAgICAgIHtfX2Rlc3RydWN0X2F0X2VuZChfX25ld19sYXN0LCBmYWxzZV90eXBlKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQgX19kZXN0cnVjdF9hdF9lbmQocG9pbnRlciBfX25ld19sYXN0LCBmYWxzZV90eXBlKSBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB2b2lkIF9fZGVzdHJ1Y3RfYXRfZW5kKHBvaW50ZXIgX19uZXdfbGFzdCwgdHJ1ZV90eXBlKSBfTk9FWENFUFQ7CisKKyAgICB2b2lkIHN3YXAoX19zcGxpdF9idWZmZXImIF9feCkKKyAgICAgICAgX05PRVhDRVBUXyghX19hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDo6dmFsdWV8fAorICAgICAgICAgICAgICAgICAgIF9faXNfbm90aHJvd19zd2FwcGFibGU8X19hbGxvY19ycj46OnZhbHVlKTsKKworICAgIGJvb2wgX19pbnZhcmlhbnRzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19tb3ZlX2Fzc2lnbl9hbGxvYyhfX3NwbGl0X2J1ZmZlciYgX19jLCB0cnVlX3R5cGUpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgX19hbGxvYygpID0gX1ZTVEQ6Om1vdmUoX19jLl9fYWxsb2MoKSk7CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fbW92ZV9hc3NpZ25fYWxsb2MoX19zcGxpdF9idWZmZXImLCBmYWxzZV90eXBlKSBfTk9FWENFUFQKKyAgICAgICAge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Citib29sCitfX3NwbGl0X2J1ZmZlcjxfVHAsIF9BbGxvY2F0b3I+OjpfX2ludmFyaWFudHMoKSBjb25zdAoreworICAgIGlmIChfX2ZpcnN0XyA9PSBudWxscHRyKQorICAgIHsKKyAgICAgICAgaWYgKF9fYmVnaW5fICE9IG51bGxwdHIpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChfX2VuZF8gIT0gbnVsbHB0cikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKF9fZW5kX2NhcCgpICE9IG51bGxwdHIpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChfX2JlZ2luXyA8IF9fZmlyc3RfKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoX19lbmRfIDwgX19iZWdpbl8pCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChfX2VuZF9jYXAoKSA8IF9fZW5kXykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vICBEZWZhdWx0IGNvbnN0cnVjdHMgX19uIG9iamVjdHMgc3RhcnRpbmcgYXQgX19lbmRfCisvLyAgdGhyb3dzIGlmIGNvbnN0cnVjdGlvbiB0aHJvd3MKKy8vICBQcmVjb25kaXRpb246ICBfX24gPiAwCisvLyAgUHJlY29uZGl0aW9uOiAgc2l6ZSgpICsgX19uIDw9IGNhcGFjaXR5KCkKKy8vICBQb3N0Y29uZGl0aW9uOiAgc2l6ZSgpID09IHNpemUoKSArIF9fbgordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK19fc3BsaXRfYnVmZmVyPF9UcCwgX0FsbG9jYXRvcj46Ol9fY29uc3RydWN0X2F0X2VuZChzaXplX3R5cGUgX19uKQoreworICAgIF9fYWxsb2NfcnImIF9fYSA9IHRoaXMtPl9fYWxsb2MoKTsKKyAgICBkbworICAgIHsKKyAgICAgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKHRoaXMtPl9fZW5kXykpOworICAgICAgICArK3RoaXMtPl9fZW5kXzsKKyAgICAgICAgLS1fX247CisgICAgfSB3aGlsZSAoX19uID4gMCk7Cit9CisKKy8vICBDb3B5IGNvbnN0cnVjdHMgX19uIG9iamVjdHMgc3RhcnRpbmcgYXQgX19lbmRfIGZyb20gX194CisvLyAgdGhyb3dzIGlmIGNvbnN0cnVjdGlvbiB0aHJvd3MKKy8vICBQcmVjb25kaXRpb246ICBfX24gPiAwCisvLyAgUHJlY29uZGl0aW9uOiAgc2l6ZSgpICsgX19uIDw9IGNhcGFjaXR5KCkKKy8vICBQb3N0Y29uZGl0aW9uOiAgc2l6ZSgpID09IG9sZCBzaXplKCkgKyBfX24KKy8vICBQb3N0Y29uZGl0aW9uOiAgW2ldID09IF9feCBmb3IgYWxsIGkgaW4gW3NpemUoKSAtIF9fbiwgX19uKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK19fc3BsaXRfYnVmZmVyPF9UcCwgX0FsbG9jYXRvcj46Ol9fY29uc3RydWN0X2F0X2VuZChzaXplX3R5cGUgX19uLCBjb25zdF9yZWZlcmVuY2UgX194KQoreworICAgIF9fYWxsb2NfcnImIF9fYSA9IHRoaXMtPl9fYWxsb2MoKTsKKyAgICBkbworICAgIHsKKyAgICAgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKHRoaXMtPl9fZW5kXyksIF9feCk7CisgICAgICAgICsrdGhpcy0+X19lbmRfOworICAgICAgICAtLV9fbjsKKyAgICB9IHdoaWxlIChfX24gPiAwKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgIF9faXNfaW5wdXRfaXRlcmF0b3I8X0lucHV0SXRlcj46OnZhbHVlICYmCisgICAgIV9faXNfZm9yd2FyZF9pdGVyYXRvcjxfSW5wdXRJdGVyPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQorX19zcGxpdF9idWZmZXI8X1RwLCBfQWxsb2NhdG9yPjo6X19jb25zdHJ1Y3RfYXRfZW5kKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QpCit7CisgICAgX19hbGxvY19yciYgX19hID0gdGhpcy0+X19hbGxvYygpOworICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgIHsKKyAgICAgICAgaWYgKF9fZW5kXyA9PSBfX2VuZF9jYXAoKSkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90eXBlIF9fb2xkX2NhcCA9IF9fZW5kX2NhcCgpIC0gX19maXJzdF87CisgICAgICAgICAgICBzaXplX3R5cGUgX19uZXdfY2FwID0gX1ZTVEQ6Om1heDxzaXplX3R5cGU+KDIgKiBfX29sZF9jYXAsIDgpOworICAgICAgICAgICAgX19zcGxpdF9idWZmZXIgX19idWYoX19uZXdfY2FwLCAwLCBfX2EpOworICAgICAgICAgICAgZm9yIChwb2ludGVyIF9fcCA9IF9fYmVnaW5fOyBfX3AgIT0gX19lbmRfOyArK19fcCwgKytfX2J1Zi5fX2VuZF8pCisgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2J1Zi5fX2FsbG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX2J1Zi5fX2VuZF8pLCBfVlNURDo6bW92ZSgqX19wKSk7CisgICAgICAgICAgICBzd2FwKF9fYnVmKTsKKyAgICAgICAgfQorICAgICAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6Ol9fdG9fcmF3X3BvaW50ZXIodGhpcy0+X19lbmRfKSwgKl9fZmlyc3QpOworICAgICAgICArK3RoaXMtPl9fZW5kXzsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQorX19zcGxpdF9idWZmZXI8X1RwLCBfQWxsb2NhdG9yPjo6X19jb25zdHJ1Y3RfYXRfZW5kKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgX19hbGxvY19yciYgX19hID0gdGhpcy0+X19hbGxvYygpOworICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgIHsKKyAgICAgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKHRoaXMtPl9fZW5kXyksICpfX2ZpcnN0KTsKKyAgICAgICAgKyt0aGlzLT5fX2VuZF87CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lCit2b2lkCitfX3NwbGl0X2J1ZmZlcjxfVHAsIF9BbGxvY2F0b3I+OjpfX2Rlc3RydWN0X2F0X2JlZ2luKHBvaW50ZXIgX19uZXdfYmVnaW4sIGZhbHNlX3R5cGUpCit7CisgICAgd2hpbGUgKF9fYmVnaW5fICE9IF9fbmV3X2JlZ2luKQorICAgICAgICBfX2FsbG9jX3RyYWl0czo6ZGVzdHJveShfX2FsbG9jKCksIF9fdG9fcmF3X3BvaW50ZXIoX19iZWdpbl8rKykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lCit2b2lkCitfX3NwbGl0X2J1ZmZlcjxfVHAsIF9BbGxvY2F0b3I+OjpfX2Rlc3RydWN0X2F0X2JlZ2luKHBvaW50ZXIgX19uZXdfYmVnaW4sIHRydWVfdHlwZSkKK3sKKyAgICBfX2JlZ2luXyA9IF9fbmV3X2JlZ2luOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK19fc3BsaXRfYnVmZmVyPF9UcCwgX0FsbG9jYXRvcj46Ol9fZGVzdHJ1Y3RfYXRfZW5kKHBvaW50ZXIgX19uZXdfbGFzdCwgZmFsc2VfdHlwZSkgX05PRVhDRVBUCit7CisgICAgd2hpbGUgKF9fbmV3X2xhc3QgIT0gX19lbmRfKQorICAgICAgICBfX2FsbG9jX3RyYWl0czo6ZGVzdHJveShfX2FsbG9jKCksIF9fdG9fcmF3X3BvaW50ZXIoLS1fX2VuZF8pKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitfX3NwbGl0X2J1ZmZlcjxfVHAsIF9BbGxvY2F0b3I+OjpfX2Rlc3RydWN0X2F0X2VuZChwb2ludGVyIF9fbmV3X2xhc3QsIHRydWVfdHlwZSkgX05PRVhDRVBUCit7CisgICAgX19lbmRfID0gX19uZXdfbGFzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK19fc3BsaXRfYnVmZmVyPF9UcCwgX0FsbG9jYXRvcj46Ol9fc3BsaXRfYnVmZmVyKHNpemVfdHlwZSBfX2NhcCwgc2l6ZV90eXBlIF9fc3RhcnQsIF9fYWxsb2NfcnImIF9fYSkKKyAgICA6IF9fZW5kX2NhcF8obnVsbHB0ciwgX19hKQoreworICAgIF9fZmlyc3RfID0gX19jYXAgIT0gMCA/IF9fYWxsb2NfdHJhaXRzOjphbGxvY2F0ZShfX2FsbG9jKCksIF9fY2FwKSA6IG51bGxwdHI7CisgICAgX19iZWdpbl8gPSBfX2VuZF8gPSBfX2ZpcnN0XyArIF9fc3RhcnQ7CisgICAgX19lbmRfY2FwKCkgPSBfX2ZpcnN0XyArIF9fY2FwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lCitfX3NwbGl0X2J1ZmZlcjxfVHAsIF9BbGxvY2F0b3I+OjpfX3NwbGl0X2J1ZmZlcigpCisgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKQorICAgIDogX19maXJzdF8obnVsbHB0ciksIF9fYmVnaW5fKG51bGxwdHIpLCBfX2VuZF8obnVsbHB0ciksIF9fZW5kX2NhcF8obnVsbHB0cikKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZQorX19zcGxpdF9idWZmZXI8X1RwLCBfQWxsb2NhdG9yPjo6X19zcGxpdF9idWZmZXIoX19hbGxvY19yciYgX19hKQorICAgIDogX19maXJzdF8obnVsbHB0ciksIF9fYmVnaW5fKG51bGxwdHIpLCBfX2VuZF8obnVsbHB0ciksIF9fZW5kX2NhcF8obnVsbHB0ciwgX19hKQoreworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lCitfX3NwbGl0X2J1ZmZlcjxfVHAsIF9BbGxvY2F0b3I+OjpfX3NwbGl0X2J1ZmZlcihjb25zdCBfX2FsbG9jX3JyJiBfX2EpCisgICAgOiBfX2ZpcnN0XyhudWxscHRyKSwgX19iZWdpbl8obnVsbHB0ciksIF9fZW5kXyhudWxscHRyKSwgX19lbmRfY2FwXyhudWxscHRyLCBfX2EpCit7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitfX3NwbGl0X2J1ZmZlcjxfVHAsIF9BbGxvY2F0b3I+Ojp+X19zcGxpdF9idWZmZXIoKQoreworICAgIGNsZWFyKCk7CisgICAgaWYgKF9fZmlyc3RfKQorICAgICAgICBfX2FsbG9jX3RyYWl0czo6ZGVhbGxvY2F0ZShfX2FsbG9jKCksIF9fZmlyc3RfLCBjYXBhY2l0eSgpKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK19fc3BsaXRfYnVmZmVyPF9UcCwgX0FsbG9jYXRvcj46Ol9fc3BsaXRfYnVmZmVyKF9fc3BsaXRfYnVmZmVyJiYgX19jKQorICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSkKKyAgICA6IF9fZmlyc3RfKF9WU1REOjptb3ZlKF9fYy5fX2ZpcnN0XykpLAorICAgICAgX19iZWdpbl8oX1ZTVEQ6Om1vdmUoX19jLl9fYmVnaW5fKSksCisgICAgICBfX2VuZF8oX1ZTVEQ6Om1vdmUoX19jLl9fZW5kXykpLAorICAgICAgX19lbmRfY2FwXyhfVlNURDo6bW92ZShfX2MuX19lbmRfY2FwXykpCit7CisgICAgX19jLl9fZmlyc3RfID0gbnVsbHB0cjsKKyAgICBfX2MuX19iZWdpbl8gPSBudWxscHRyOworICAgIF9fYy5fX2VuZF8gPSBudWxscHRyOworICAgIF9fYy5fX2VuZF9jYXAoKSA9IG51bGxwdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitfX3NwbGl0X2J1ZmZlcjxfVHAsIF9BbGxvY2F0b3I+OjpfX3NwbGl0X2J1ZmZlcihfX3NwbGl0X2J1ZmZlciYmIF9fYywgY29uc3QgX19hbGxvY19yciYgX19hKQorICAgIDogX19lbmRfY2FwXyhfX3NlY29uZF90YWcoKSwgX19hKQoreworICAgIGlmIChfX2EgPT0gX19jLl9fYWxsb2MoKSkKKyAgICB7CisgICAgICAgIF9fZmlyc3RfID0gX19jLl9fZmlyc3RfOworICAgICAgICBfX2JlZ2luXyA9IF9fYy5fX2JlZ2luXzsKKyAgICAgICAgX19lbmRfID0gX19jLl9fZW5kXzsKKyAgICAgICAgX19lbmRfY2FwKCkgPSBfX2MuX19lbmRfY2FwKCk7CisgICAgICAgIF9fYy5fX2ZpcnN0XyA9IG51bGxwdHI7CisgICAgICAgIF9fYy5fX2JlZ2luXyA9IG51bGxwdHI7CisgICAgICAgIF9fYy5fX2VuZF8gPSBudWxscHRyOworICAgICAgICBfX2MuX19lbmRfY2FwKCkgPSBudWxscHRyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzaXplX3R5cGUgX19jYXAgPSBfX2Muc2l6ZSgpOworICAgICAgICBfX2ZpcnN0XyA9IF9fYWxsb2NfdHJhaXRzOjphbGxvY2F0ZShfX2FsbG9jKCksIF9fY2FwKTsKKyAgICAgICAgX19iZWdpbl8gPSBfX2VuZF8gPSBfX2ZpcnN0XzsKKyAgICAgICAgX19lbmRfY2FwKCkgPSBfX2ZpcnN0XyArIF9fY2FwOworICAgICAgICB0eXBlZGVmIG1vdmVfaXRlcmF0b3I8aXRlcmF0b3I+IF9JcDsKKyAgICAgICAgX19jb25zdHJ1Y3RfYXRfZW5kKF9JcChfX2MuYmVnaW4oKSksIF9JcChfX2MuZW5kKCkpKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitfX3NwbGl0X2J1ZmZlcjxfVHAsIF9BbGxvY2F0b3I+JgorX19zcGxpdF9idWZmZXI8X1RwLCBfQWxsb2NhdG9yPjo6b3BlcmF0b3I9KF9fc3BsaXRfYnVmZmVyJiYgX19jKQorICAgIF9OT0VYQ0VQVF8oKF9fYWxsb2NfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKSB8fAorICAgICAgICAgICAgICAgIV9fYWxsb2NfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWUpCit7CisgICAgY2xlYXIoKTsKKyAgICBzaHJpbmtfdG9fZml0KCk7CisgICAgX19maXJzdF8gPSBfX2MuX19maXJzdF87CisgICAgX19iZWdpbl8gPSBfX2MuX19iZWdpbl87CisgICAgX19lbmRfID0gX19jLl9fZW5kXzsKKyAgICBfX2VuZF9jYXAoKSA9IF9fYy5fX2VuZF9jYXAoKTsKKyAgICBfX21vdmVfYXNzaWduX2FsbG9jKF9fYywKKyAgICAgICAgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZT4oKSk7CisgICAgX19jLl9fZmlyc3RfID0gX19jLl9fYmVnaW5fID0gX19jLl9fZW5kXyA9IF9fYy5fX2VuZF9jYXAoKSA9IG51bGxwdHI7CisgICAgcmV0dXJuICp0aGlzOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAorX19zcGxpdF9idWZmZXI8X1RwLCBfQWxsb2NhdG9yPjo6c3dhcChfX3NwbGl0X2J1ZmZlciYgX194KQorICAgICAgICBfTk9FWENFUFRfKCFfX2FsbG9jX3RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwOjp2YWx1ZXx8CisgICAgICAgICAgICAgICAgICAgX19pc19ub3Rocm93X3N3YXBwYWJsZTxfX2FsbG9jX3JyPjo6dmFsdWUpCit7CisgICAgX1ZTVEQ6OnN3YXAoX19maXJzdF8sIF9feC5fX2ZpcnN0Xyk7CisgICAgX1ZTVEQ6OnN3YXAoX19iZWdpbl8sIF9feC5fX2JlZ2luXyk7CisgICAgX1ZTVEQ6OnN3YXAoX19lbmRfLCBfX3guX19lbmRfKTsKKyAgICBfVlNURDo6c3dhcChfX2VuZF9jYXAoKSwgX194Ll9fZW5kX2NhcCgpKTsKKyAgICBfX3N3YXBfYWxsb2NhdG9yKF9fYWxsb2MoKSwgX194Ll9fYWxsb2MoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitfX3NwbGl0X2J1ZmZlcjxfVHAsIF9BbGxvY2F0b3I+OjpyZXNlcnZlKHNpemVfdHlwZSBfX24pCit7CisgICAgaWYgKF9fbiA8IGNhcGFjaXR5KCkpCisgICAgeworICAgICAgICBfX3NwbGl0X2J1ZmZlcjx2YWx1ZV90eXBlLCBfX2FsbG9jX3JyJj4gX190KF9fbiwgMCwgX19hbGxvYygpKTsKKyAgICAgICAgX190Ll9fY29uc3RydWN0X2F0X2VuZChtb3ZlX2l0ZXJhdG9yPHBvaW50ZXI+KF9fYmVnaW5fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlX2l0ZXJhdG9yPHBvaW50ZXI+KF9fZW5kXykpOworICAgICAgICBfVlNURDo6c3dhcChfX2ZpcnN0XywgX190Ll9fZmlyc3RfKTsKKyAgICAgICAgX1ZTVEQ6OnN3YXAoX19iZWdpbl8sIF9fdC5fX2JlZ2luXyk7CisgICAgICAgIF9WU1REOjpzd2FwKF9fZW5kXywgX190Ll9fZW5kXyk7CisgICAgICAgIF9WU1REOjpzd2FwKF9fZW5kX2NhcCgpLCBfX3QuX19lbmRfY2FwKCkpOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK19fc3BsaXRfYnVmZmVyPF9UcCwgX0FsbG9jYXRvcj46OnNocmlua190b19maXQoKSBfTk9FWENFUFQKK3sKKyAgICBpZiAoY2FwYWNpdHkoKSA+IHNpemUoKSkKKyAgICB7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0cnkKKyAgICAgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIF9fc3BsaXRfYnVmZmVyPHZhbHVlX3R5cGUsIF9fYWxsb2NfcnImPiBfX3Qoc2l6ZSgpLCAwLCBfX2FsbG9jKCkpOworICAgICAgICAgICAgX190Ll9fY29uc3RydWN0X2F0X2VuZChtb3ZlX2l0ZXJhdG9yPHBvaW50ZXI+KF9fYmVnaW5fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZV9pdGVyYXRvcjxwb2ludGVyPihfX2VuZF8pKTsKKyAgICAgICAgICAgIF9fdC5fX2VuZF8gPSBfX3QuX19iZWdpbl8gKyAoX19lbmRfIC0gX19iZWdpbl8pOworICAgICAgICAgICAgX1ZTVEQ6OnN3YXAoX19maXJzdF8sIF9fdC5fX2ZpcnN0Xyk7CisgICAgICAgICAgICBfVlNURDo6c3dhcChfX2JlZ2luXywgX190Ll9fYmVnaW5fKTsKKyAgICAgICAgICAgIF9WU1REOjpzd2FwKF9fZW5kXywgX190Ll9fZW5kXyk7CisgICAgICAgICAgICBfVlNURDo6c3dhcChfX2VuZF9jYXAoKSwgX190Ll9fZW5kX2NhcCgpKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKC4uLikKKyAgICAgICAgeworICAgICAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK19fc3BsaXRfYnVmZmVyPF9UcCwgX0FsbG9jYXRvcj46OnB1c2hfZnJvbnQoY29uc3RfcmVmZXJlbmNlIF9feCkKK3sKKyAgICBpZiAoX19iZWdpbl8gPT0gX19maXJzdF8pCisgICAgeworICAgICAgICBpZiAoX19lbmRfIDwgX19lbmRfY2FwKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2QgPSBfX2VuZF9jYXAoKSAtIF9fZW5kXzsKKyAgICAgICAgICAgIF9fZCA9IChfX2QgKyAxKSAvIDI7CisgICAgICAgICAgICBfX2JlZ2luXyA9IF9WU1REOjptb3ZlX2JhY2t3YXJkKF9fYmVnaW5fLCBfX2VuZF8sIF9fZW5kXyArIF9fZCk7CisgICAgICAgICAgICBfX2VuZF8gKz0gX19kOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90eXBlIF9fYyA9IG1heDxzaXplX3R5cGU+KDIgKiBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fZW5kX2NhcCgpIC0gX19maXJzdF8pLCAxKTsKKyAgICAgICAgICAgIF9fc3BsaXRfYnVmZmVyPHZhbHVlX3R5cGUsIF9fYWxsb2NfcnImPiBfX3QoX19jLCAoX19jICsgMykgLyA0LCBfX2FsbG9jKCkpOworICAgICAgICAgICAgX190Ll9fY29uc3RydWN0X2F0X2VuZChtb3ZlX2l0ZXJhdG9yPHBvaW50ZXI+KF9fYmVnaW5fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZV9pdGVyYXRvcjxwb2ludGVyPihfX2VuZF8pKTsKKyAgICAgICAgICAgIF9WU1REOjpzd2FwKF9fZmlyc3RfLCBfX3QuX19maXJzdF8pOworICAgICAgICAgICAgX1ZTVEQ6OnN3YXAoX19iZWdpbl8sIF9fdC5fX2JlZ2luXyk7CisgICAgICAgICAgICBfVlNURDo6c3dhcChfX2VuZF8sIF9fdC5fX2VuZF8pOworICAgICAgICAgICAgX1ZTVEQ6OnN3YXAoX19lbmRfY2FwKCksIF9fdC5fX2VuZF9jYXAoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2FsbG9jKCksIF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fYmVnaW5fLTEpLCBfX3gpOworICAgIC0tX19iZWdpbl87Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitfX3NwbGl0X2J1ZmZlcjxfVHAsIF9BbGxvY2F0b3I+OjpwdXNoX2Zyb250KHZhbHVlX3R5cGUmJiBfX3gpCit7CisgICAgaWYgKF9fYmVnaW5fID09IF9fZmlyc3RfKQorICAgIHsKKyAgICAgICAgaWYgKF9fZW5kXyA8IF9fZW5kX2NhcCgpKQorICAgICAgICB7CisgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19kID0gX19lbmRfY2FwKCkgLSBfX2VuZF87CisgICAgICAgICAgICBfX2QgPSAoX19kICsgMSkgLyAyOworICAgICAgICAgICAgX19iZWdpbl8gPSBfVlNURDo6bW92ZV9iYWNrd2FyZChfX2JlZ2luXywgX19lbmRfLCBfX2VuZF8gKyBfX2QpOworICAgICAgICAgICAgX19lbmRfICs9IF9fZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdHlwZSBfX2MgPSBtYXg8c2l6ZV90eXBlPigyICogc3RhdGljX2Nhc3Q8c2l6ZV90PihfX2VuZF9jYXAoKSAtIF9fZmlyc3RfKSwgMSk7CisgICAgICAgICAgICBfX3NwbGl0X2J1ZmZlcjx2YWx1ZV90eXBlLCBfX2FsbG9jX3JyJj4gX190KF9fYywgKF9fYyArIDMpIC8gNCwgX19hbGxvYygpKTsKKyAgICAgICAgICAgIF9fdC5fX2NvbnN0cnVjdF9hdF9lbmQobW92ZV9pdGVyYXRvcjxwb2ludGVyPihfX2JlZ2luXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVfaXRlcmF0b3I8cG9pbnRlcj4oX19lbmRfKSk7CisgICAgICAgICAgICBfVlNURDo6c3dhcChfX2ZpcnN0XywgX190Ll9fZmlyc3RfKTsKKyAgICAgICAgICAgIF9WU1REOjpzd2FwKF9fYmVnaW5fLCBfX3QuX19iZWdpbl8pOworICAgICAgICAgICAgX1ZTVEQ6OnN3YXAoX19lbmRfLCBfX3QuX19lbmRfKTsKKyAgICAgICAgICAgIF9WU1REOjpzd2FwKF9fZW5kX2NhcCgpLCBfX3QuX19lbmRfY2FwKCkpOworICAgICAgICB9CisgICAgfQorICAgIF9fYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19hbGxvYygpLCBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX2JlZ2luXy0xKSwKKyAgICAgICAgICAgIF9WU1REOjptb3ZlKF9feCkpOworICAgIC0tX19iZWdpbl87Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorX19zcGxpdF9idWZmZXI8X1RwLCBfQWxsb2NhdG9yPjo6cHVzaF9iYWNrKGNvbnN0X3JlZmVyZW5jZSBfX3gpCit7CisgICAgaWYgKF9fZW5kXyA9PSBfX2VuZF9jYXAoKSkKKyAgICB7CisgICAgICAgIGlmIChfX2JlZ2luXyA+IF9fZmlyc3RfKQorICAgICAgICB7CisgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19kID0gX19iZWdpbl8gLSBfX2ZpcnN0XzsKKyAgICAgICAgICAgIF9fZCA9IChfX2QgKyAxKSAvIDI7CisgICAgICAgICAgICBfX2VuZF8gPSBfVlNURDo6bW92ZShfX2JlZ2luXywgX19lbmRfLCBfX2JlZ2luXyAtIF9fZCk7CisgICAgICAgICAgICBfX2JlZ2luXyAtPSBfX2Q7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzaXplX3R5cGUgX19jID0gbWF4PHNpemVfdHlwZT4oMiAqIHN0YXRpY19jYXN0PHNpemVfdD4oX19lbmRfY2FwKCkgLSBfX2ZpcnN0XyksIDEpOworICAgICAgICAgICAgX19zcGxpdF9idWZmZXI8dmFsdWVfdHlwZSwgX19hbGxvY19yciY+IF9fdChfX2MsIF9fYyAvIDQsIF9fYWxsb2MoKSk7CisgICAgICAgICAgICBfX3QuX19jb25zdHJ1Y3RfYXRfZW5kKG1vdmVfaXRlcmF0b3I8cG9pbnRlcj4oX19iZWdpbl8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlX2l0ZXJhdG9yPHBvaW50ZXI+KF9fZW5kXykpOworICAgICAgICAgICAgX1ZTVEQ6OnN3YXAoX19maXJzdF8sIF9fdC5fX2ZpcnN0Xyk7CisgICAgICAgICAgICBfVlNURDo6c3dhcChfX2JlZ2luXywgX190Ll9fYmVnaW5fKTsKKyAgICAgICAgICAgIF9WU1REOjpzd2FwKF9fZW5kXywgX190Ll9fZW5kXyk7CisgICAgICAgICAgICBfVlNURDo6c3dhcChfX2VuZF9jYXAoKSwgX190Ll9fZW5kX2NhcCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYWxsb2MoKSwgX1ZTVEQ6Ol9fdG9fcmF3X3BvaW50ZXIoX19lbmRfKSwgX194KTsKKyAgICArK19fZW5kXzsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK19fc3BsaXRfYnVmZmVyPF9UcCwgX0FsbG9jYXRvcj46OnB1c2hfYmFjayh2YWx1ZV90eXBlJiYgX194KQoreworICAgIGlmIChfX2VuZF8gPT0gX19lbmRfY2FwKCkpCisgICAgeworICAgICAgICBpZiAoX19iZWdpbl8gPiBfX2ZpcnN0XykKKyAgICAgICAgeworICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fZCA9IF9fYmVnaW5fIC0gX19maXJzdF87CisgICAgICAgICAgICBfX2QgPSAoX19kICsgMSkgLyAyOworICAgICAgICAgICAgX19lbmRfID0gX1ZTVEQ6Om1vdmUoX19iZWdpbl8sIF9fZW5kXywgX19iZWdpbl8gLSBfX2QpOworICAgICAgICAgICAgX19iZWdpbl8gLT0gX19kOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90eXBlIF9fYyA9IG1heDxzaXplX3R5cGU+KDIgKiBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fZW5kX2NhcCgpIC0gX19maXJzdF8pLCAxKTsKKyAgICAgICAgICAgIF9fc3BsaXRfYnVmZmVyPHZhbHVlX3R5cGUsIF9fYWxsb2NfcnImPiBfX3QoX19jLCBfX2MgLyA0LCBfX2FsbG9jKCkpOworICAgICAgICAgICAgX190Ll9fY29uc3RydWN0X2F0X2VuZChtb3ZlX2l0ZXJhdG9yPHBvaW50ZXI+KF9fYmVnaW5fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZV9pdGVyYXRvcjxwb2ludGVyPihfX2VuZF8pKTsKKyAgICAgICAgICAgIF9WU1REOjpzd2FwKF9fZmlyc3RfLCBfX3QuX19maXJzdF8pOworICAgICAgICAgICAgX1ZTVEQ6OnN3YXAoX19iZWdpbl8sIF9fdC5fX2JlZ2luXyk7CisgICAgICAgICAgICBfVlNURDo6c3dhcChfX2VuZF8sIF9fdC5fX2VuZF8pOworICAgICAgICAgICAgX1ZTVEQ6OnN3YXAoX19lbmRfY2FwKCksIF9fdC5fX2VuZF9jYXAoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2FsbG9jKCksIF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fZW5kXyksCisgICAgICAgICAgICBfVlNURDo6bW92ZShfX3gpKTsKKyAgICArK19fZW5kXzsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KK3ZvaWQKK19fc3BsaXRfYnVmZmVyPF9UcCwgX0FsbG9jYXRvcj46OmVtcGxhY2VfYmFjayhfQXJncyYmLi4uIF9fYXJncykKK3sKKyAgICBpZiAoX19lbmRfID09IF9fZW5kX2NhcCgpKQorICAgIHsKKyAgICAgICAgaWYgKF9fYmVnaW5fID4gX19maXJzdF8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2QgPSBfX2JlZ2luXyAtIF9fZmlyc3RfOworICAgICAgICAgICAgX19kID0gKF9fZCArIDEpIC8gMjsKKyAgICAgICAgICAgIF9fZW5kXyA9IF9WU1REOjptb3ZlKF9fYmVnaW5fLCBfX2VuZF8sIF9fYmVnaW5fIC0gX19kKTsKKyAgICAgICAgICAgIF9fYmVnaW5fIC09IF9fZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdHlwZSBfX2MgPSBtYXg8c2l6ZV90eXBlPigyICogc3RhdGljX2Nhc3Q8c2l6ZV90PihfX2VuZF9jYXAoKSAtIF9fZmlyc3RfKSwgMSk7CisgICAgICAgICAgICBfX3NwbGl0X2J1ZmZlcjx2YWx1ZV90eXBlLCBfX2FsbG9jX3JyJj4gX190KF9fYywgX19jIC8gNCwgX19hbGxvYygpKTsKKyAgICAgICAgICAgIF9fdC5fX2NvbnN0cnVjdF9hdF9lbmQobW92ZV9pdGVyYXRvcjxwb2ludGVyPihfX2JlZ2luXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVfaXRlcmF0b3I8cG9pbnRlcj4oX19lbmRfKSk7CisgICAgICAgICAgICBfVlNURDo6c3dhcChfX2ZpcnN0XywgX190Ll9fZmlyc3RfKTsKKyAgICAgICAgICAgIF9WU1REOjpzd2FwKF9fYmVnaW5fLCBfX3QuX19iZWdpbl8pOworICAgICAgICAgICAgX1ZTVEQ6OnN3YXAoX19lbmRfLCBfX3QuX19lbmRfKTsKKyAgICAgICAgICAgIF9WU1REOjpzd2FwKF9fZW5kX2NhcCgpLCBfX3QuX19lbmRfY2FwKCkpOworICAgICAgICB9CisgICAgfQorICAgIF9fYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19hbGxvYygpLCBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX2VuZF8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICsrX19lbmRfOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3N3YXAoX19zcGxpdF9idWZmZXI8X1RwLCBfQWxsb2NhdG9yPiYgX194LCBfX3NwbGl0X2J1ZmZlcjxfVHAsIF9BbGxvY2F0b3I+JiBfX3kpCisgICAgICAgIF9OT0VYQ0VQVF8oX05PRVhDRVBUXyhfX3guc3dhcChfX3kpKSkKK3sKKyAgICBfX3guc3dhcChfX3kpOworfQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKK19MSUJDUFBfUE9QX01BQ1JPUworCisjZW5kaWYgIC8vIF9MSUJDUFBfU1BMSVRfQlVGRkVSCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX19zc29fYWxsb2NhdG9yIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fc3NvX2FsbG9jYXRvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDAyNzM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fc3NvX2FsbG9jYXRvcgpAQCAtMCwwICsxLDc3IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX19fU1NPX0FMTE9DQVRPUgorI2RlZmluZSBfTElCQ1BQX19fU1NPX0FMTE9DQVRPUgorCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8bmV3PgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfTnA+IGNsYXNzIF9MSUJDUFBfSElEREVOIF9fc3NvX2FsbG9jYXRvcjsKKwordGVtcGxhdGUgPHNpemVfdCBfTnA+CitjbGFzcyBfTElCQ1BQX0hJRERFTiBfX3Nzb19hbGxvY2F0b3I8dm9pZCwgX05wPgoreworcHVibGljOgorICAgIHR5cGVkZWYgY29uc3Qgdm9pZCogICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgIHZhbHVlX3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBzaXplX3QgX05wPgorY2xhc3MgX0xJQkNQUF9ISURERU4gX19zc29fYWxsb2NhdG9yCit7CisgICAgdHlwZW5hbWUgYWxpZ25lZF9zdG9yYWdlPHNpemVvZihfVHApICogX05wPjo6dHlwZSBidWZfOworICAgIGJvb2wgX19hbGxvY2F0ZWRfOworcHVibGljOgorICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgX1RwKiAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fc3NvX2FsbG9jYXRvcigpIHRocm93KCkgOiBfX2FsbG9jYXRlZF8oZmFsc2UpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX3Nzb19hbGxvY2F0b3IoY29uc3QgX19zc29fYWxsb2NhdG9yJikgdGhyb3coKSA6IF9fYWxsb2NhdGVkXyhmYWxzZSkge30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPiBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fc3NvX2FsbG9jYXRvcihjb25zdCBfX3Nzb19hbGxvY2F0b3I8X1VwLCBfTnA+JikgdGhyb3coKQorICAgICAgICAgOiBfX2FsbG9jYXRlZF8oZmFsc2UpIHt9Citwcml2YXRlOgorICAgIF9fc3NvX2FsbG9jYXRvciYgb3BlcmF0b3I9KGNvbnN0IF9fc3NvX2FsbG9jYXRvciYpOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcG9pbnRlciBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCB0eXBlbmFtZSBfX3Nzb19hbGxvY2F0b3I8dm9pZCwgX05wPjo6Y29uc3RfcG9pbnRlciA9IDApCisgICAgeworICAgICAgICBpZiAoIV9fYWxsb2NhdGVkXyAmJiBfX24gPD0gX05wKQorICAgICAgICB7CisgICAgICAgICAgICBfX2FsbG9jYXRlZF8gPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIChwb2ludGVyKSZidWZfOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxwb2ludGVyPihfVlNURDo6X19saWJjcHBfYWxsb2NhdGUoX19uICogc2l6ZW9mKF9UcCksIF9fYWxpZ25vZihfVHApKSk7CisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUpCisgICAgeworICAgICAgICBpZiAoX19wID09IChwb2ludGVyKSZidWZfKQorICAgICAgICAgICAgX19hbGxvY2F0ZWRfID0gZmFsc2U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9WU1REOjpfX2xpYmNwcF9kZWFsbG9jYXRlKF9fcCwgX19hbGlnbm9mKF9UcCkpOworICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHRocm93KCkge3JldHVybiBzaXplX3R5cGUofjApIC8gc2l6ZW9mKF9UcCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3I9PShfX3Nzb19hbGxvY2F0b3ImIF9fYSkgY29uc3Qge3JldHVybiAmYnVmXyA9PSAmX19hLmJ1Zl87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yIT0oX19zc29fYWxsb2NhdG9yJiBfX2EpIGNvbnN0IHtyZXR1cm4gJmJ1Zl8gIT0gJl9fYS5idWZfO30KK307CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX19fU1NPX0FMTE9DQVRPUgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fc3RkX3N0cmVhbSBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX3N0ZF9zdHJlYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5MDc5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX3N0ZF9zdHJlYW0KQEAgLTAsMCArMSwzNjIgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfX19TVERfU1RSRUFNCisjZGVmaW5lIF9MSUJDUFBfX19TVERfU1RSRUFNCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPGlzdHJlYW0+CisjaW5jbHVkZSA8X19sb2NhbGU+CisjaW5jbHVkZSA8Y3N0ZGlvPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9QVVNIX01BQ1JPUworI2luY2x1ZGUgPF9fdW5kZWZfbWFjcm9zPgorCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCitzdGF0aWMgY29uc3QgaW50IF9fbGltaXQgPSA4OworCisvLyBfX3N0ZGluYnVmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitjbGFzcyBfTElCQ1BQX0hJRERFTiBfX3N0ZGluYnVmCisgICAgOiBwdWJsaWMgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiA+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBjaGFyX3RyYWl0czxjaGFyX3R5cGU+ICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSAgIGludF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlICAgcG9zX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgICBvZmZfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpzdGF0ZV90eXBlIHN0YXRlX3R5cGU7CisKKyAgICBfX3N0ZGluYnVmKEZJTEUqIF9fZnAsIHN0YXRlX3R5cGUqIF9fc3QpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBpbnRfdHlwZSB1bmRlcmZsb3coKTsKKyAgICB2aXJ0dWFsIGludF90eXBlIHVmbG93KCk7CisgICAgdmlydHVhbCBpbnRfdHlwZSBwYmFja2ZhaWwoaW50X3R5cGUgX19jID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW1idWUoY29uc3QgbG9jYWxlJiBfX2xvYyk7CisKK3ByaXZhdGU6CisKKyAgICBGSUxFKiBfX2ZpbGVfOworICAgIGNvbnN0IGNvZGVjdnQ8Y2hhcl90eXBlLCBjaGFyLCBzdGF0ZV90eXBlPiogX19jdl87CisgICAgc3RhdGVfdHlwZSogX19zdF87CisgICAgaW50IF9fZW5jb2RpbmdfOworICAgIGludF90eXBlIF9fbGFzdF9jb25zdW1lZF87CisgICAgYm9vbCBfX2xhc3RfY29uc3VtZWRfaXNfbmV4dF87CisgICAgYm9vbCBfX2Fsd2F5c19ub2NvbnZfOworCisgICAgX19zdGRpbmJ1Zihjb25zdCBfX3N0ZGluYnVmJik7CisgICAgX19zdGRpbmJ1ZiYgb3BlcmF0b3I9KGNvbnN0IF9fc3RkaW5idWYmKTsKKworICAgIGludF90eXBlIF9fZ2V0Y2hhcihib29sIF9fY29uc3VtZSk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorX19zdGRpbmJ1ZjxfQ2hhclQ+OjpfX3N0ZGluYnVmKEZJTEUqIF9fZnAsIHN0YXRlX3R5cGUqIF9fc3QpCisgICAgOiBfX2ZpbGVfKF9fZnApLAorICAgICAgX19zdF8oX19zdCksCisgICAgICBfX2xhc3RfY29uc3VtZWRfKHRyYWl0c190eXBlOjplb2YoKSksCisgICAgICBfX2xhc3RfY29uc3VtZWRfaXNfbmV4dF8oZmFsc2UpCit7CisgICAgaW1idWUodGhpcy0+Z2V0bG9jKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordm9pZAorX19zdGRpbmJ1ZjxfQ2hhclQ+OjppbWJ1ZShjb25zdCBsb2NhbGUmIF9fbG9jKQoreworICAgIF9fY3ZfID0gJnVzZV9mYWNldDxjb2RlY3Z0PGNoYXJfdHlwZSwgY2hhciwgc3RhdGVfdHlwZT4gPihfX2xvYyk7CisgICAgX19lbmNvZGluZ18gPSBfX2N2Xy0+ZW5jb2RpbmcoKTsKKyAgICBfX2Fsd2F5c19ub2NvbnZfID0gX19jdl8tPmFsd2F5c19ub2NvbnYoKTsKKyAgICBpZiAoX19lbmNvZGluZ18gPiBfX2xpbWl0KQorICAgICAgICBfX3Rocm93X3J1bnRpbWVfZXJyb3IoInVuc3VwcG9ydGVkIGxvY2FsZSBmb3Igc3RhbmRhcmQgaW5wdXQiKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3R5cGVuYW1lIF9fc3RkaW5idWY8X0NoYXJUPjo6aW50X3R5cGUKK19fc3RkaW5idWY8X0NoYXJUPjo6dW5kZXJmbG93KCkKK3sKKyAgICByZXR1cm4gX19nZXRjaGFyKGZhbHNlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3R5cGVuYW1lIF9fc3RkaW5idWY8X0NoYXJUPjo6aW50X3R5cGUKK19fc3RkaW5idWY8X0NoYXJUPjo6dWZsb3coKQoreworICAgIHJldHVybiBfX2dldGNoYXIodHJ1ZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+Cit0eXBlbmFtZSBfX3N0ZGluYnVmPF9DaGFyVD46OmludF90eXBlCitfX3N0ZGluYnVmPF9DaGFyVD46Ol9fZ2V0Y2hhcihib29sIF9fY29uc3VtZSkKK3sKKyAgICBpZiAoX19sYXN0X2NvbnN1bWVkX2lzX25leHRfKQorICAgIHsKKyAgICAgICAgaW50X3R5cGUgX19yZXN1bHQgPSBfX2xhc3RfY29uc3VtZWRfOworICAgICAgICBpZiAoX19jb25zdW1lKQorICAgICAgICB7CisgICAgICAgICAgICBfX2xhc3RfY29uc3VtZWRfID0gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgICAgICAgX19sYXN0X2NvbnN1bWVkX2lzX25leHRfID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKyAgICBjaGFyIF9fZXh0YnVmW19fbGltaXRdOworICAgIGludCBfX25yZWFkID0gX1ZTVEQ6Om1heCgxLCBfX2VuY29kaW5nXyk7CisgICAgZm9yIChpbnQgX19pID0gMDsgX19pIDwgX19ucmVhZDsgKytfX2kpCisgICAgeworICAgICAgICBpbnQgX19jID0gZ2V0YyhfX2ZpbGVfKTsKKyAgICAgICAgaWYgKF9fYyA9PSBFT0YpCisgICAgICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgICBfX2V4dGJ1ZltfX2ldID0gc3RhdGljX2Nhc3Q8Y2hhcj4oX19jKTsKKyAgICB9CisgICAgY2hhcl90eXBlIF9fMWJ1ZjsKKyAgICBpZiAoX19hbHdheXNfbm9jb252XykKKyAgICAgICAgX18xYnVmID0gc3RhdGljX2Nhc3Q8Y2hhcl90eXBlPihfX2V4dGJ1ZlswXSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciogX19lbnh0OworICAgICAgICBjaGFyX3R5cGUqIF9faW54dDsKKyAgICAgICAgY29kZWN2dF9iYXNlOjpyZXN1bHQgX19yOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZV90eXBlIF9fc3Zfc3QgPSAqX19zdF87CisgICAgICAgICAgICBfX3IgPSBfX2N2Xy0+aW4oKl9fc3RfLCBfX2V4dGJ1ZiwgX19leHRidWYgKyBfX25yZWFkLCBfX2VueHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfXzFidWYsICZfXzFidWYgKyAxLCBfX2lueHQpOworICAgICAgICAgICAgc3dpdGNoIChfX3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIF9WU1REOjpjb2RlY3Z0X2Jhc2U6Om9rOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBjb2RlY3Z0X2Jhc2U6OnBhcnRpYWw6CisgICAgICAgICAgICAgICAgKl9fc3RfID0gX19zdl9zdDsKKyAgICAgICAgICAgICAgICBpZiAoX19ucmVhZCA9PSBzaXplb2YoX19leHRidWYpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IF9fYyA9IGdldGMoX19maWxlXyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2MgPT0gRU9GKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgICAgICAgICAgICAgICAgX19leHRidWZbX19ucmVhZF0gPSBzdGF0aWNfY2FzdDxjaGFyPihfX2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK19fbnJlYWQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGNvZGVjdnRfYmFzZTo6ZXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgICAgICAgIGNhc2UgX1ZTVEQ6OmNvZGVjdnRfYmFzZTo6bm9jb252OgorICAgICAgICAgICAgICAgIF9fMWJ1ZiA9IHN0YXRpY19jYXN0PGNoYXJfdHlwZT4oX19leHRidWZbMF0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChfX3IgPT0gX1ZTVEQ6OmNvZGVjdnRfYmFzZTo6cGFydGlhbCk7CisgICAgfQorICAgIGlmICghX19jb25zdW1lKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgX19pID0gX19ucmVhZDsgX19pID4gMDspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh1bmdldGModHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKF9fZXh0YnVmWy0tX19pXSksIF9fZmlsZV8pID09IEVPRikKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgX19sYXN0X2NvbnN1bWVkXyA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZShfXzFidWYpOworICAgIHJldHVybiB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoX18xYnVmKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3R5cGVuYW1lIF9fc3RkaW5idWY8X0NoYXJUPjo6aW50X3R5cGUKK19fc3RkaW5idWY8X0NoYXJUPjo6cGJhY2tmYWlsKGludF90eXBlIF9fYykKK3sKKyAgICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgdHJhaXRzX3R5cGU6OmVvZigpKSkKKyAgICB7CisgICAgICAgIGlmICghX19sYXN0X2NvbnN1bWVkX2lzX25leHRfKQorICAgICAgICB7CisgICAgICAgICAgICBfX2MgPSBfX2xhc3RfY29uc3VtZWRfOworICAgICAgICAgICAgX19sYXN0X2NvbnN1bWVkX2lzX25leHRfID0gIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2xhc3RfY29uc3VtZWRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTo6ZW9mKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfX2M7CisgICAgfQorICAgIGlmIChfX2xhc3RfY29uc3VtZWRfaXNfbmV4dF8pCisgICAgeworICAgICAgICBjaGFyIF9fZXh0YnVmW19fbGltaXRdOworICAgICAgICBjaGFyKiBfX2VueHQ7CisgICAgICAgIGNvbnN0IGNoYXJfdHlwZSBfX2NpID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2xhc3RfY29uc3VtZWRfKTsKKyAgICAgICAgY29uc3QgY2hhcl90eXBlKiBfX2lueHQ7CisgICAgICAgIHN3aXRjaCAoX19jdl8tPm91dCgqX19zdF8sICZfX2NpLCAmX19jaSArIDEsIF9faW54dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2V4dGJ1ZiwgX19leHRidWYgKyBzaXplb2YoX19leHRidWYpLCBfX2VueHQpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgX1ZTVEQ6OmNvZGVjdnRfYmFzZTo6b2s6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBfVlNURDo6Y29kZWN2dF9iYXNlOjpub2NvbnY6CisgICAgICAgICAgICBfX2V4dGJ1ZlswXSA9IHN0YXRpY19jYXN0PGNoYXI+KF9fbGFzdF9jb25zdW1lZF8pOworICAgICAgICAgICAgX19lbnh0ID0gX19leHRidWYgKyAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY29kZWN2dF9iYXNlOjpwYXJ0aWFsOgorICAgICAgICBjYXNlIGNvZGVjdnRfYmFzZTo6ZXJyb3I6CisgICAgICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChfX2VueHQgPiBfX2V4dGJ1ZikKKyAgICAgICAgICAgIGlmICh1bmdldGMoKi0tX19lbnh0LCBfX2ZpbGVfKSA9PSBFT0YpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKKyAgICB9CisgICAgX19sYXN0X2NvbnN1bWVkXyA9IF9fYzsKKyAgICBfX2xhc3RfY29uc3VtZWRfaXNfbmV4dF8gPSB0cnVlOworICAgIHJldHVybiBfX2M7Cit9CisKKy8vIF9fc3Rkb3V0YnVmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitjbGFzcyBfTElCQ1BQX0hJRERFTiBfX3N0ZG91dGJ1ZgorICAgIDogcHVibGljIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4gPgoreworcHVibGljOgorICAgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgIHR5cGVkZWYgY2hhcl90cmFpdHM8Y2hhcl90eXBlPiAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgICBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSAgIHBvc190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlICAgb2ZmX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6c3RhdGVfdHlwZSBzdGF0ZV90eXBlOworCisgICAgX19zdGRvdXRidWYoRklMRSogX19mcCwgc3RhdGVfdHlwZSogX19zdCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGludF90eXBlIG92ZXJmbG93IChpbnRfdHlwZSBfX2MgPSB0cmFpdHNfdHlwZTo6ZW9mKCkpOworICAgIHZpcnR1YWwgc3RyZWFtc2l6ZSB4c3B1dG4oY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKyAgICB2aXJ0dWFsIGludCBzeW5jKCk7CisgICAgdmlydHVhbCB2b2lkIGltYnVlKGNvbnN0IGxvY2FsZSYgX19sb2MpOworCitwcml2YXRlOgorICAgIEZJTEUqIF9fZmlsZV87CisgICAgY29uc3QgY29kZWN2dDxjaGFyX3R5cGUsIGNoYXIsIHN0YXRlX3R5cGU+KiBfX2N2XzsKKyAgICBzdGF0ZV90eXBlKiBfX3N0XzsKKyAgICBib29sIF9fYWx3YXlzX25vY29udl87CisKKyAgICBfX3N0ZG91dGJ1Zihjb25zdCBfX3N0ZG91dGJ1ZiYpOworICAgIF9fc3Rkb3V0YnVmJiBvcGVyYXRvcj0oY29uc3QgX19zdGRvdXRidWYmKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitfX3N0ZG91dGJ1ZjxfQ2hhclQ+OjpfX3N0ZG91dGJ1ZihGSUxFKiBfX2ZwLCBzdGF0ZV90eXBlKiBfX3N0KQorICAgIDogX19maWxlXyhfX2ZwKSwKKyAgICAgIF9fY3ZfKCZ1c2VfZmFjZXQ8Y29kZWN2dDxjaGFyX3R5cGUsIGNoYXIsIHN0YXRlX3R5cGU+ID4odGhpcy0+Z2V0bG9jKCkpKSwKKyAgICAgIF9fc3RfKF9fc3QpLAorICAgICAgX19hbHdheXNfbm9jb252XyhfX2N2Xy0+YWx3YXlzX25vY29udigpKQoreworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordHlwZW5hbWUgX19zdGRvdXRidWY8X0NoYXJUPjo6aW50X3R5cGUKK19fc3Rkb3V0YnVmPF9DaGFyVD46Om92ZXJmbG93KGludF90eXBlIF9fYykKK3sKKyAgICBjaGFyIF9fZXh0YnVmW19fbGltaXRdOworICAgIGNoYXJfdHlwZSBfXzFidWY7CisgICAgaWYgKCF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorICAgIHsKKyAgICAgICAgX18xYnVmID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpOworICAgICAgICBpZiAoX19hbHdheXNfbm9jb252XykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZ3cml0ZSgmX18xYnVmLCBzaXplb2YoY2hhcl90eXBlKSwgMSwgX19maWxlXykgIT0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciogX19leHRiZSA9IF9fZXh0YnVmOworICAgICAgICAgICAgY29kZWN2dF9iYXNlOjpyZXN1bHQgX19yOworICAgICAgICAgICAgY2hhcl90eXBlKiBwYmFzZSA9ICZfXzFidWY7CisgICAgICAgICAgICBjaGFyX3R5cGUqIHBwdHIgPSBwYmFzZSArIDE7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19lOworICAgICAgICAgICAgICAgIF9fciA9IF9fY3ZfLT5vdXQoKl9fc3RfLCBwYmFzZSwgcHB0ciwgX19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZXh0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZXh0YnVmICsgc2l6ZW9mKF9fZXh0YnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2V4dGJlKTsKKyAgICAgICAgICAgICAgICBpZiAoX19lID09IHBiYXNlKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgICAgICAgICAgIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjpub2NvbnYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZndyaXRlKHBiYXNlLCAxLCAxLCBfX2ZpbGVfKSAhPSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6b2sgfHwgX19yID09IGNvZGVjdnRfYmFzZTo6cGFydGlhbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX25tZW1iID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX2V4dGJlIC0gX19leHRidWYpOworICAgICAgICAgICAgICAgICAgICBpZiAoZndyaXRlKF9fZXh0YnVmLCAxLCBfX25tZW1iLCBfX2ZpbGVfKSAhPSBfX25tZW1iKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6OnBhcnRpYWwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBiYXNlID0gY29uc3RfY2FzdDxjaGFyX3R5cGUqPihfX2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6OnBhcnRpYWwpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cmFpdHNfdHlwZTo6bm90X2VvZihfX2MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorc3RyZWFtc2l6ZQorX19zdGRvdXRidWY8X0NoYXJUPjo6eHNwdXRuKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKK3sKKyAgICBpZiAoX19hbHdheXNfbm9jb252XykKKyAgICAgICAgcmV0dXJuIGZ3cml0ZShfX3MsIHNpemVvZihjaGFyX3R5cGUpLCBfX24sIF9fZmlsZV8pOworICAgIHN0cmVhbXNpemUgX19pID0gMDsKKyAgICBmb3IgKDsgX19pIDwgX19uOyArK19faSwgKytfX3MpCisgICAgICAgIGlmIChvdmVyZmxvdyh0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKl9fcykpID09IHRyYWl0c190eXBlOjplb2YoKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIHJldHVybiBfX2k7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitpbnQKK19fc3Rkb3V0YnVmPF9DaGFyVD46OnN5bmMoKQoreworICAgIGNoYXIgX19leHRidWZbX19saW1pdF07CisgICAgY29kZWN2dF9iYXNlOjpyZXN1bHQgX19yOworICAgIGRvCisgICAgeworICAgICAgICBjaGFyKiBfX2V4dGJlOworICAgICAgICBfX3IgPSBfX2N2Xy0+dW5zaGlmdCgqX19zdF8sIF9fZXh0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19leHRidWYgKyBzaXplb2YoX19leHRidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19leHRiZSk7CisgICAgICAgIHNpemVfdCBfX25tZW1iID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX2V4dGJlIC0gX19leHRidWYpOworICAgICAgICBpZiAoZndyaXRlKF9fZXh0YnVmLCAxLCBfX25tZW1iLCBfX2ZpbGVfKSAhPSBfX25tZW1iKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0gd2hpbGUgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6OnBhcnRpYWwpOworICAgIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjplcnJvcikKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChmZmx1c2goX19maWxlXykpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3ZvaWQKK19fc3Rkb3V0YnVmPF9DaGFyVD46OmltYnVlKGNvbnN0IGxvY2FsZSYgX19sb2MpCit7CisgICAgc3luYygpOworICAgIF9fY3ZfID0gJnVzZV9mYWNldDxjb2RlY3Z0PGNoYXJfdHlwZSwgY2hhciwgc3RhdGVfdHlwZT4gPihfX2xvYyk7CisgICAgX19hbHdheXNfbm9jb252XyA9IF9fY3ZfLT5hbHdheXNfbm9jb252KCk7Cit9CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworX0xJQkNQUF9QT1BfTUFDUk9TCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9fX1NURF9TVFJFQU0KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX3N0cmluZyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX3N0cmluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGM1NTk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fc3RyaW5nCkBAIC0wLDAgKzEsODc3IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBfX3N0cmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX19fU1RSSU5HCisjZGVmaW5lIF9MSUJDUFBfX19TVFJJTkcKKworLyoKKyAgICBzdHJpbmcgc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+CitzdHJ1Y3QgY2hhcl90cmFpdHMKK3sKKyAgICB0eXBlZGVmIGNoYXJUICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiAuLi4gICAgICAgaW50X3R5cGU7CisgICAgdHlwZWRlZiBzdHJlYW1vZmYgb2ZmX3R5cGU7CisgICAgdHlwZWRlZiBzdHJlYW1wb3MgcG9zX3R5cGU7CisgICAgdHlwZWRlZiBtYnN0YXRlX3Qgc3RhdGVfdHlwZTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgdm9pZCBhc3NpZ24oY2hhcl90eXBlJiBjMSwgY29uc3QgY2hhcl90eXBlJiBjMikgbm9leGNlcHQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGVxKGNoYXJfdHlwZSBjMSwgY2hhcl90eXBlIGMyKSBub2V4Y2VwdDsKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgbHQoY2hhcl90eXBlIGMxLCBjaGFyX3R5cGUgYzIpIG5vZXhjZXB0OworCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgICAgY29tcGFyZShjb25zdCBjaGFyX3R5cGUqIHMxLCBjb25zdCBjaGFyX3R5cGUqIHMyLCBzaXplX3Qgbik7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgbGVuZ3RoKGNvbnN0IGNoYXJfdHlwZSogcyk7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyX3R5cGUqIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmQoY29uc3QgY2hhcl90eXBlKiBzLCBzaXplX3QgbiwgY29uc3QgY2hhcl90eXBlJiBhKTsKKyAgICBzdGF0aWMgY2hhcl90eXBlKiAgICAgICBtb3ZlKGNoYXJfdHlwZSogczEsIGNvbnN0IGNoYXJfdHlwZSogczIsIHNpemVfdCBuKTsKKyAgICBzdGF0aWMgY2hhcl90eXBlKiAgICAgICBjb3B5KGNoYXJfdHlwZSogczEsIGNvbnN0IGNoYXJfdHlwZSogczIsIHNpemVfdCBuKTsKKyAgICBzdGF0aWMgY2hhcl90eXBlKiAgICAgICBhc3NpZ24oY2hhcl90eXBlKiBzLCBzaXplX3QgbiwgY2hhcl90eXBlIGEpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRfdHlwZSAgbm90X2VvZihpbnRfdHlwZSBjKSBub2V4Y2VwdDsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXJfdHlwZSB0b19jaGFyX3R5cGUoaW50X3R5cGUgYykgbm9leGNlcHQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRfdHlwZSAgdG9faW50X3R5cGUoY2hhcl90eXBlIGMpIG5vZXhjZXB0OworICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCAgICAgIGVxX2ludF90eXBlKGludF90eXBlIGMxLCBpbnRfdHlwZSBjMikgbm9leGNlcHQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRfdHlwZSAgZW9mKCkgbm9leGNlcHQ7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgY2hhcl90cmFpdHM8Y2hhcj47Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgY2hhcl90cmFpdHM8d2NoYXJfdD47CisKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8YWxnb3JpdGhtPiAgLy8gZm9yIHNlYXJjaCBhbmQgbWluCisjaW5jbHVkZSA8Y3N0ZGlvPiAgICAgLy8gRm9yIEVPRi4KKyNpbmNsdWRlIDxtZW1vcnk+ICAgICAvLyBmb3IgX19tdXJtdXIyX29yX2NpdHloYXNoCisKKyNpbmNsdWRlIDxfX2RlYnVnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9QVVNIX01BQ1JPUworI2luY2x1ZGUgPF9fdW5kZWZfbWFjcm9zPgorCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCisvLyBjaGFyX3RyYWl0cworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGNoYXJfdHJhaXRzCit7CisgICAgdHlwZWRlZiBfQ2hhclQgICAgY2hhcl90eXBlOworICAgIHR5cGVkZWYgaW50ICAgICAgIGludF90eXBlOworICAgIHR5cGVkZWYgc3RyZWFtb2ZmIG9mZl90eXBlOworICAgIHR5cGVkZWYgc3RyZWFtcG9zIHBvc190eXBlOworICAgIHR5cGVkZWYgbWJzdGF0ZV90IHN0YXRlX3R5cGU7CisKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICAgICAgYXNzaWduKGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKSBfTk9FWENFUFQge19fYzEgPSBfX2MyO30KKyAgICBzdGF0aWMgaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgZXEoY2hhcl90eXBlIF9fYzEsIGNoYXJfdHlwZSBfX2MyKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2MxID09IF9fYzI7fQorICAgIHN0YXRpYyBpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBsdChjaGFyX3R5cGUgX19jMSwgY2hhcl90eXBlIF9fYzIpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fYzEgPCBfX2MyO30KKworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIGludCBjb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIHNpemVfdCBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3MpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgICAgY29uc3QgY2hhcl90eXBlKiBmaW5kKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYSk7CisgICAgc3RhdGljIGNoYXJfdHlwZSogICAgICAgbW92ZShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbik7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBjaGFyX3R5cGUqICAgICAgIGNvcHkoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgY2hhcl90eXBlKiAgICAgICBhc3NpZ24oY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNoYXJfdHlwZSBfX2EpOworCisgICAgc3RhdGljIGlubGluZSBfTElCQ1BQX0NPTlNURVhQUiBpbnRfdHlwZSAgbm90X2VvZihpbnRfdHlwZSBfX2MpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGVxX2ludF90eXBlKF9fYywgZW9mKCkpID8gfmVvZigpIDogX19jO30KKyAgICBzdGF0aWMgaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIGNoYXJfdHlwZSB0b19jaGFyX3R5cGUoaW50X3R5cGUgX19jKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBjaGFyX3R5cGUoX19jKTt9CisgICAgc3RhdGljIGlubGluZSBfTElCQ1BQX0NPTlNURVhQUiBpbnRfdHlwZSAgdG9faW50X3R5cGUoY2hhcl90eXBlIF9fYykgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gaW50X3R5cGUoX19jKTt9CisgICAgc3RhdGljIGlubGluZSBfTElCQ1BQX0NPTlNURVhQUiBib29sICAgICAgZXFfaW50X3R5cGUoaW50X3R5cGUgX19jMSwgaW50X3R5cGUgX19jMikgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19jMSA9PSBfX2MyO30KKyAgICBzdGF0aWMgaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIGludF90eXBlICBlb2YoKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBpbnRfdHlwZShFT0YpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNCBpbnQKK2NoYXJfdHJhaXRzPF9DaGFyVD46OmNvbXBhcmUoY29uc3QgY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCit7CisgICAgZm9yICg7IF9fbjsgLS1fX24sICsrX19zMSwgKytfX3MyKQorICAgIHsKKyAgICAgICAgaWYgKGx0KCpfX3MxLCAqX19zMikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChsdCgqX19zMiwgKl9fczEpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgoraW5saW5lCitfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNCBzaXplX3QKK2NoYXJfdHJhaXRzPF9DaGFyVD46Omxlbmd0aChjb25zdCBjaGFyX3R5cGUqIF9fcykKK3sKKyAgICBzaXplX3QgX19sZW4gPSAwOworICAgIGZvciAoOyAhZXEoKl9fcywgY2hhcl90eXBlKDApKTsgKytfX3MpCisgICAgICAgICsrX19sZW47CisgICAgcmV0dXJuIF9fbGVuOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgoraW5saW5lCitfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNCBjb25zdCBfQ2hhclQqCitjaGFyX3RyYWl0czxfQ2hhclQ+OjpmaW5kKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYSkKK3sKKyAgICBmb3IgKDsgX19uOyAtLV9fbikKKyAgICB7CisgICAgICAgIGlmIChlcSgqX19zLCBfX2EpKQorICAgICAgICAgICAgcmV0dXJuIF9fczsKKyAgICAgICAgKytfX3M7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorX0NoYXJUKgorY2hhcl90cmFpdHM8X0NoYXJUPjo6bW92ZShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKK3sKKyAgICBjaGFyX3R5cGUqIF9fciA9IF9fczE7CisgICAgaWYgKF9fczEgPCBfX3MyKQorICAgIHsKKyAgICAgICAgZm9yICg7IF9fbjsgLS1fX24sICsrX19zMSwgKytfX3MyKQorICAgICAgICAgICAgYXNzaWduKCpfX3MxLCAqX19zMik7CisgICAgfQorICAgIGVsc2UgaWYgKF9fczIgPCBfX3MxKQorICAgIHsKKyAgICAgICAgX19zMSArPSBfX247CisgICAgICAgIF9fczIgKz0gX19uOworICAgICAgICBmb3IgKDsgX19uOyAtLV9fbikKKyAgICAgICAgICAgIGFzc2lnbigqLS1fX3MxLCAqLS1fX3MyKTsKKyAgICB9CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2lubGluZQorX0NoYXJUKgorY2hhcl90cmFpdHM8X0NoYXJUPjo6Y29weShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKK3sKKyAgICBfTElCQ1BQX0FTU0VSVChfX3MyIDwgX19zMSB8fCBfX3MyID49IF9fczErX19uLCAiY2hhcl90cmFpdHM6OmNvcHkgb3ZlcmxhcHBlZCByYW5nZSIpOworICAgIGNoYXJfdHlwZSogX19yID0gX19zMTsKKyAgICBmb3IgKDsgX19uOyAtLV9fbiwgKytfX3MxLCArK19fczIpCisgICAgICAgIGFzc2lnbigqX19zMSwgKl9fczIpOworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitpbmxpbmUKK19DaGFyVCoKK2NoYXJfdHJhaXRzPF9DaGFyVD46OmFzc2lnbihjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY2hhcl90eXBlIF9fYSkKK3sKKyAgICBjaGFyX3R5cGUqIF9fciA9IF9fczsKKyAgICBmb3IgKDsgX19uOyAtLV9fbiwgKytfX3MpCisgICAgICAgIGFzc2lnbigqX19zLCBfX2EpOworICAgIHJldHVybiBfX3I7Cit9CisKKy8vIGNoYXJfdHJhaXRzPGNoYXI+CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgY2hhcl90cmFpdHM8Y2hhcj4KK3sKKyAgICB0eXBlZGVmIGNoYXIgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBpbnQgICAgICAgaW50X3R5cGU7CisgICAgdHlwZWRlZiBzdHJlYW1vZmYgb2ZmX3R5cGU7CisgICAgdHlwZWRlZiBzdHJlYW1wb3MgcG9zX3R5cGU7CisgICAgdHlwZWRlZiBtYnN0YXRlX3Qgc3RhdGVfdHlwZTsKKworICAgIHN0YXRpYyBpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICB2b2lkIGFzc2lnbihjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikgX05PRVhDRVBUIHtfX2MxID0gX19jMjt9CisgICAgc3RhdGljIGlubGluZSBfTElCQ1BQX0NPTlNURVhQUiBib29sIGVxKGNoYXJfdHlwZSBfX2MxLCBjaGFyX3R5cGUgX19jMikgX05PRVhDRVBUCisgICAgICAgICAgICB7cmV0dXJuIF9fYzEgPT0gX19jMjt9CisgICAgc3RhdGljIGlubGluZSBfTElCQ1BQX0NPTlNURVhQUiBib29sIGx0KGNoYXJfdHlwZSBfX2MxLCBjaGFyX3R5cGUgX19jMikgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gKHVuc2lnbmVkIGNoYXIpX19jMSA8ICh1bnNpZ25lZCBjaGFyKV9fYzI7fQorCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgICAgaW50IGNvbXBhcmUoY29uc3QgY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pIF9OT0VYQ0VQVDsKKyAgICBzdGF0aWMgaW5saW5lIHNpemVfdCBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIGxlbmd0aChjb25zdCBjaGFyX3R5cGUqIF9fcykgIF9OT0VYQ0VQVCB7cmV0dXJuIF9fYnVpbHRpbl9zdHJsZW4oX19zKTt9CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgICAgY29uc3QgY2hhcl90eXBlKiBmaW5kKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYSkgX05PRVhDRVBUOworICAgIHN0YXRpYyBpbmxpbmUgY2hhcl90eXBlKiBtb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX24gPT0gMCA/IF9fczEgOiAoY2hhcl90eXBlKikgbWVtbW92ZShfX3MxLCBfX3MyLCBfX24pO30KKyAgICBzdGF0aWMgaW5saW5lIGNoYXJfdHlwZSogY29weShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikgX05PRVhDRVBUCisgICAgICAgIHsKKyAgICAgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fczIgPCBfX3MxIHx8IF9fczIgPj0gX19zMStfX24sICJjaGFyX3RyYWl0czo6Y29weSBvdmVybGFwcGVkIHJhbmdlIik7CisgICAgICAgICAgICByZXR1cm4gX19uID09IDAgPyBfX3MxIDogKGNoYXJfdHlwZSopbWVtY3B5KF9fczEsIF9fczIsIF9fbik7CisgICAgICAgIH0KKyAgICBzdGF0aWMgaW5saW5lIGNoYXJfdHlwZSogYXNzaWduKGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjaGFyX3R5cGUgX19hKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX24gPT0gMCA/IF9fcyA6IChjaGFyX3R5cGUqKW1lbXNldChfX3MsIHRvX2ludF90eXBlKF9fYSksIF9fbik7fQorCisgICAgc3RhdGljIGlubGluZSBfTElCQ1BQX0NPTlNURVhQUiBpbnRfdHlwZSAgbm90X2VvZihpbnRfdHlwZSBfX2MpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGVxX2ludF90eXBlKF9fYywgZW9mKCkpID8gfmVvZigpIDogX19jO30KKyAgICBzdGF0aWMgaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIGNoYXJfdHlwZSB0b19jaGFyX3R5cGUoaW50X3R5cGUgX19jKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBjaGFyX3R5cGUoX19jKTt9CisgICAgc3RhdGljIGlubGluZSBfTElCQ1BQX0NPTlNURVhQUiBpbnRfdHlwZSB0b19pbnRfdHlwZShjaGFyX3R5cGUgX19jKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBpbnRfdHlwZSgodW5zaWduZWQgY2hhcilfX2MpO30KKyAgICBzdGF0aWMgaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgZXFfaW50X3R5cGUoaW50X3R5cGUgX19jMSwgaW50X3R5cGUgX19jMikgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19jMSA9PSBfX2MyO30KKyAgICBzdGF0aWMgaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIGludF90eXBlICBlb2YoKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBpbnRfdHlwZShFT0YpO30KK307CisKK2lubGluZSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAoraW50CitjaGFyX3RyYWl0czxjaGFyPjo6Y29tcGFyZShjb25zdCBjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikgX05PRVhDRVBUCit7CisgICAgaWYgKF9fbiA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyNpZiBfX2hhc19mZWF0dXJlKGN4eF9jb25zdGV4cHJfc3RyaW5nX2J1aWx0aW5zKQorICAgIHJldHVybiBfX2J1aWx0aW5fbWVtY21wKF9fczEsIF9fczIsIF9fbik7CisjZWxpZiBfTElCQ1BQX1NURF9WRVIgPD0gMTQKKyAgICByZXR1cm4gbWVtY21wKF9fczEsIF9fczIsIF9fbik7CisjZWxzZQorICAgIGZvciAoOyBfX247IC0tX19uLCArK19fczEsICsrX19zMikKKyAgICB7CisgICAgICAgIGlmIChsdCgqX19zMSwgKl9fczIpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAobHQoKl9fczIsICpfX3MxKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCitpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK2NvbnN0IGNoYXIqCitjaGFyX3RyYWl0czxjaGFyPjo6ZmluZChjb25zdCBjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY29uc3QgY2hhcl90eXBlJiBfX2EpIF9OT0VYQ0VQVAoreworICAgIGlmIChfX24gPT0gMCkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisjaWYgX19oYXNfZmVhdHVyZShjeHhfY29uc3RleHByX3N0cmluZ19idWlsdGlucykKKyAgICByZXR1cm4gX19idWlsdGluX2NoYXJfbWVtY2hyKF9fcywgdG9faW50X3R5cGUoX19hKSwgX19uKTsKKyNlbGlmIF9MSUJDUFBfU1REX1ZFUiA8PSAxNAorICAgIHJldHVybiAoY29uc3QgY2hhcl90eXBlKikgbWVtY2hyKF9fcywgdG9faW50X3R5cGUoX19hKSwgX19uKTsKKyNlbHNlCisgICAgZm9yICg7IF9fbjsgLS1fX24pCisgICAgeworICAgICAgICBpZiAoZXEoKl9fcywgX19hKSkKKyAgICAgICAgICAgIHJldHVybiBfX3M7CisgICAgICAgICsrX19zOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKKyNlbmRpZgorfQorCisKKy8vIGNoYXJfdHJhaXRzPHdjaGFyX3Q+CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgY2hhcl90cmFpdHM8d2NoYXJfdD4KK3sKKyAgICB0eXBlZGVmIHdjaGFyX3QgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiB3aW50X3QgICAgaW50X3R5cGU7CisgICAgdHlwZWRlZiBzdHJlYW1vZmYgb2ZmX3R5cGU7CisgICAgdHlwZWRlZiBzdHJlYW1wb3MgcG9zX3R5cGU7CisgICAgdHlwZWRlZiBtYnN0YXRlX3Qgc3RhdGVfdHlwZTsKKworICAgIHN0YXRpYyBpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICB2b2lkIGFzc2lnbihjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikgX05PRVhDRVBUIHtfX2MxID0gX19jMjt9CisgICAgc3RhdGljIGlubGluZSBfTElCQ1BQX0NPTlNURVhQUiBib29sIGVxKGNoYXJfdHlwZSBfX2MxLCBjaGFyX3R5cGUgX19jMikgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19jMSA9PSBfX2MyO30KKyAgICBzdGF0aWMgaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgbHQoY2hhcl90eXBlIF9fYzEsIGNoYXJfdHlwZSBfX2MyKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2MxIDwgX19jMjt9CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICBpbnQgY29tcGFyZShjb25zdCBjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikgX05PRVhDRVBUOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIHNpemVfdCBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3MpIF9OT0VYQ0VQVDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICBjb25zdCBjaGFyX3R5cGUqIGZpbmQoY29uc3QgY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNvbnN0IGNoYXJfdHlwZSYgX19hKSBfTk9FWENFUFQ7CisgICAgc3RhdGljIGlubGluZSBjaGFyX3R5cGUqIG1vdmUoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fbiA9PSAwID8gX19zMSA6IChjaGFyX3R5cGUqKXdtZW1tb3ZlKF9fczEsIF9fczIsIF9fbik7fQorICAgIHN0YXRpYyBpbmxpbmUgY2hhcl90eXBlKiBjb3B5KGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKSBfTk9FWENFUFQKKyAgICAgICAgeworICAgICAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19zMiA8IF9fczEgfHwgX19zMiA+PSBfX3MxK19fbiwgImNoYXJfdHJhaXRzOjpjb3B5IG92ZXJsYXBwZWQgcmFuZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiBfX24gPT0gMCA/IF9fczEgOiAoY2hhcl90eXBlKil3bWVtY3B5KF9fczEsIF9fczIsIF9fbik7CisgICAgICAgIH0KKyAgICBzdGF0aWMgaW5saW5lIGNoYXJfdHlwZSogYXNzaWduKGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjaGFyX3R5cGUgX19hKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX24gPT0gMCA/IF9fcyA6IChjaGFyX3R5cGUqKXdtZW1zZXQoX19zLCBfX2EsIF9fbik7fQorCisgICAgc3RhdGljIGlubGluZSBfTElCQ1BQX0NPTlNURVhQUiBpbnRfdHlwZSAgbm90X2VvZihpbnRfdHlwZSBfX2MpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGVxX2ludF90eXBlKF9fYywgZW9mKCkpID8gfmVvZigpIDogX19jO30KKyAgICBzdGF0aWMgaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIGNoYXJfdHlwZSB0b19jaGFyX3R5cGUoaW50X3R5cGUgX19jKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBjaGFyX3R5cGUoX19jKTt9CisgICAgc3RhdGljIGlubGluZSBfTElCQ1BQX0NPTlNURVhQUiBpbnRfdHlwZSB0b19pbnRfdHlwZShjaGFyX3R5cGUgX19jKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBpbnRfdHlwZShfX2MpO30KKyAgICBzdGF0aWMgaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgZXFfaW50X3R5cGUoaW50X3R5cGUgX19jMSwgaW50X3R5cGUgX19jMikgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19jMSA9PSBfX2MyO30KKyAgICBzdGF0aWMgaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIGludF90eXBlIGVvZigpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGludF90eXBlKFdFT0YpO30KK307CisKK2lubGluZSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAoraW50CitjaGFyX3RyYWl0czx3Y2hhcl90Pjo6Y29tcGFyZShjb25zdCBjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikgX05PRVhDRVBUCit7CisgICAgaWYgKF9fbiA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyNpZiBfX2hhc19mZWF0dXJlKGN4eF9jb25zdGV4cHJfc3RyaW5nX2J1aWx0aW5zKQorICAgIHJldHVybiBfX2J1aWx0aW5fd21lbWNtcChfX3MxLCBfX3MyLCBfX24pOworI2VsaWYgX0xJQkNQUF9TVERfVkVSIDw9IDE0CisgICAgcmV0dXJuIHdtZW1jbXAoX19zMSwgX19zMiwgX19uKTsKKyNlbHNlCisgICAgZm9yICg7IF9fbjsgLS1fX24sICsrX19zMSwgKytfX3MyKQorICAgIHsKKyAgICAgICAgaWYgKGx0KCpfX3MxLCAqX19zMikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChsdCgqX19zMiwgKl9fczEpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK2lubGluZSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorc2l6ZV90CitjaGFyX3RyYWl0czx3Y2hhcl90Pjo6bGVuZ3RoKGNvbnN0IGNoYXJfdHlwZSogX19zKSBfTk9FWENFUFQKK3sKKyNpZiBfX2hhc19mZWF0dXJlKGN4eF9jb25zdGV4cHJfc3RyaW5nX2J1aWx0aW5zKQorICAgIHJldHVybiBfX2J1aWx0aW5fd2NzbGVuKF9fcyk7CisjZWxpZiBfTElCQ1BQX1NURF9WRVIgPD0gMTQKKyAgICByZXR1cm4gd2NzbGVuKF9fcyk7CisjZWxzZQorICAgIHNpemVfdCBfX2xlbiA9IDA7CisgICAgZm9yICg7ICFlcSgqX19zLCBjaGFyX3R5cGUoMCkpOyArK19fcykKKyAgICAgICAgKytfX2xlbjsKKyAgICByZXR1cm4gX19sZW47CisjZW5kaWYKK30KKworaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0Citjb25zdCB3Y2hhcl90KgorY2hhcl90cmFpdHM8d2NoYXJfdD46OmZpbmQoY29uc3QgY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNvbnN0IGNoYXJfdHlwZSYgX19hKSBfTk9FWENFUFQKK3sKKyAgICBpZiAoX19uID09IDApCisgICAgICAgIHJldHVybiBudWxscHRyOworI2lmIF9faGFzX2ZlYXR1cmUoY3h4X2NvbnN0ZXhwcl9zdHJpbmdfYnVpbHRpbnMpCisgICAgcmV0dXJuIF9fYnVpbHRpbl93bWVtY2hyKF9fcywgX19hLCBfX24pOworI2VsaWYgX0xJQkNQUF9TVERfVkVSIDw9IDE0CisgICAgcmV0dXJuIHdtZW1jaHIoX19zLCBfX2EsIF9fbik7CisjZWxzZQorICAgIGZvciAoOyBfX247IC0tX19uKQorICAgIHsKKyAgICAgICAgaWYgKGVxKCpfX3MsIF9fYSkpCisgICAgICAgICAgICByZXR1cm4gX19zOworICAgICAgICArK19fczsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7CisjZW5kaWYKK30KKworCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1VOSUNPREVfQ0hBUlMKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBjaGFyX3RyYWl0czxjaGFyMTZfdD4KK3sKKyAgICB0eXBlZGVmIGNoYXIxNl90ICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIHVpbnRfbGVhc3QxNl90IGludF90eXBlOworICAgIHR5cGVkZWYgc3RyZWFtb2ZmICAgICAgb2ZmX3R5cGU7CisgICAgdHlwZWRlZiB1MTZzdHJlYW1wb3MgICBwb3NfdHlwZTsKKyAgICB0eXBlZGVmIG1ic3RhdGVfdCAgICAgIHN0YXRlX3R5cGU7CisKKyAgICBzdGF0aWMgaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgICAgdm9pZCBhc3NpZ24oY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpIF9OT0VYQ0VQVCB7X19jMSA9IF9fYzI7fQorICAgIHN0YXRpYyBpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBlcShjaGFyX3R5cGUgX19jMSwgY2hhcl90eXBlIF9fYzIpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fYzEgPT0gX19jMjt9CisgICAgc3RhdGljIGlubGluZSBfTElCQ1BQX0NPTlNURVhQUiBib29sIGx0KGNoYXJfdHlwZSBfX2MxLCBjaGFyX3R5cGUgX19jMikgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19jMSA8IF9fYzI7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICBpbnQgICAgICAgICAgICAgIGNvbXBhcmUoY29uc3QgY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pIF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIHNpemVfdCAgICAgICAgICAgbGVuZ3RoKGNvbnN0IGNoYXJfdHlwZSogX19zKSBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICBjb25zdCBjaGFyX3R5cGUqIGZpbmQoY29uc3QgY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNvbnN0IGNoYXJfdHlwZSYgX19hKSBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBjaGFyX3R5cGUqICAgICAgIG1vdmUoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pIF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGljIGNoYXJfdHlwZSogICAgICAgY29weShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgY2hhcl90eXBlKiAgICAgICBhc3NpZ24oY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNoYXJfdHlwZSBfX2EpIF9OT0VYQ0VQVDsKKworICAgIHN0YXRpYyBpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFIgaW50X3R5cGUgIG5vdF9lb2YoaW50X3R5cGUgX19jKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBlcV9pbnRfdHlwZShfX2MsIGVvZigpKSA/IH5lb2YoKSA6IF9fYzt9CisgICAgc3RhdGljIGlubGluZSBfTElCQ1BQX0NPTlNURVhQUiBjaGFyX3R5cGUgdG9fY2hhcl90eXBlKGludF90eXBlIF9fYykgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY2hhcl90eXBlKF9fYyk7fQorICAgIHN0YXRpYyBpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFIgaW50X3R5cGUgdG9faW50X3R5cGUoY2hhcl90eXBlIF9fYykgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gaW50X3R5cGUoX19jKTt9CisgICAgc3RhdGljIGlubGluZSBfTElCQ1BQX0NPTlNURVhQUiBib29sIGVxX2ludF90eXBlKGludF90eXBlIF9fYzEsIGludF90eXBlIF9fYzIpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fYzEgPT0gX19jMjt9CisgICAgc3RhdGljIGlubGluZSBfTElCQ1BQX0NPTlNURVhQUiBpbnRfdHlwZSBlb2YoKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBpbnRfdHlwZSgweEZGRkYpO30KK307CisKK2lubGluZSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAoraW50CitjaGFyX3RyYWl0czxjaGFyMTZfdD46OmNvbXBhcmUoY29uc3QgY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pIF9OT0VYQ0VQVAoreworICAgIGZvciAoOyBfX247IC0tX19uLCArK19fczEsICsrX19zMikKKyAgICB7CisgICAgICAgIGlmIChsdCgqX19zMSwgKl9fczIpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAobHQoKl9fczIsICpfX3MxKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CitzaXplX3QKK2NoYXJfdHJhaXRzPGNoYXIxNl90Pjo6bGVuZ3RoKGNvbnN0IGNoYXJfdHlwZSogX19zKSBfTk9FWENFUFQKK3sKKyAgICBzaXplX3QgX19sZW4gPSAwOworICAgIGZvciAoOyAhZXEoKl9fcywgY2hhcl90eXBlKDApKTsgKytfX3MpCisgICAgICAgICsrX19sZW47CisgICAgcmV0dXJuIF9fbGVuOworfQorCitpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK2NvbnN0IGNoYXIxNl90KgorY2hhcl90cmFpdHM8Y2hhcjE2X3Q+OjpmaW5kKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYSkgX05PRVhDRVBUCit7CisgICAgZm9yICg7IF9fbjsgLS1fX24pCisgICAgeworICAgICAgICBpZiAoZXEoKl9fcywgX19hKSkKKyAgICAgICAgICAgIHJldHVybiBfX3M7CisgICAgICAgICsrX19zOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW5saW5lCitjaGFyMTZfdCoKK2NoYXJfdHJhaXRzPGNoYXIxNl90Pjo6bW92ZShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikgX05PRVhDRVBUCit7CisgICAgY2hhcl90eXBlKiBfX3IgPSBfX3MxOworICAgIGlmIChfX3MxIDwgX19zMikKKyAgICB7CisgICAgICAgIGZvciAoOyBfX247IC0tX19uLCArK19fczEsICsrX19zMikKKyAgICAgICAgICAgIGFzc2lnbigqX19zMSwgKl9fczIpOworICAgIH0KKyAgICBlbHNlIGlmIChfX3MyIDwgX19zMSkKKyAgICB7CisgICAgICAgIF9fczEgKz0gX19uOworICAgICAgICBfX3MyICs9IF9fbjsKKyAgICAgICAgZm9yICg7IF9fbjsgLS1fX24pCisgICAgICAgICAgICBhc3NpZ24oKi0tX19zMSwgKi0tX19zMik7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK2lubGluZQorY2hhcjE2X3QqCitjaGFyX3RyYWl0czxjaGFyMTZfdD46OmNvcHkoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pIF9OT0VYQ0VQVAoreworICAgIF9MSUJDUFBfQVNTRVJUKF9fczIgPCBfX3MxIHx8IF9fczIgPj0gX19zMStfX24sICJjaGFyX3RyYWl0czo6Y29weSBvdmVybGFwcGVkIHJhbmdlIik7CisgICAgY2hhcl90eXBlKiBfX3IgPSBfX3MxOworICAgIGZvciAoOyBfX247IC0tX19uLCArK19fczEsICsrX19zMikKKyAgICAgICAgYXNzaWduKCpfX3MxLCAqX19zMik7CisgICAgcmV0dXJuIF9fcjsKK30KKworaW5saW5lCitjaGFyMTZfdCoKK2NoYXJfdHJhaXRzPGNoYXIxNl90Pjo6YXNzaWduKGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjaGFyX3R5cGUgX19hKSBfTk9FWENFUFQKK3sKKyAgICBjaGFyX3R5cGUqIF9fciA9IF9fczsKKyAgICBmb3IgKDsgX19uOyAtLV9fbiwgKytfX3MpCisgICAgICAgIGFzc2lnbigqX19zLCBfX2EpOworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgY2hhcl90cmFpdHM8Y2hhcjMyX3Q+Cit7CisgICAgdHlwZWRlZiBjaGFyMzJfdCAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiB1aW50X2xlYXN0MzJfdCBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIHN0cmVhbW9mZiAgICAgIG9mZl90eXBlOworICAgIHR5cGVkZWYgdTMyc3RyZWFtcG9zICAgcG9zX3R5cGU7CisgICAgdHlwZWRlZiBtYnN0YXRlX3QgICAgICBzdGF0ZV90eXBlOworCisgICAgc3RhdGljIGlubGluZSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIHZvaWQgYXNzaWduKGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKSBfTk9FWENFUFQge19fYzEgPSBfX2MyO30KKyAgICBzdGF0aWMgaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgZXEoY2hhcl90eXBlIF9fYzEsIGNoYXJfdHlwZSBfX2MyKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2MxID09IF9fYzI7fQorICAgIHN0YXRpYyBpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBsdChjaGFyX3R5cGUgX19jMSwgY2hhcl90eXBlIF9fYzIpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fYzEgPCBfX2MyO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgICAgaW50ICAgICAgICAgICAgICBjb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKSBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICBzaXplX3QgICAgICAgICAgIGxlbmd0aChjb25zdCBjaGFyX3R5cGUqIF9fcykgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgICAgY29uc3QgY2hhcl90eXBlKiBmaW5kKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYSkgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgY2hhcl90eXBlKiAgICAgICBtb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKSBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBjaGFyX3R5cGUqICAgICAgIGNvcHkoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pIF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGljIGNoYXJfdHlwZSogICAgICAgYXNzaWduKGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjaGFyX3R5cGUgX19hKSBfTk9FWENFUFQ7CisKKyAgICBzdGF0aWMgaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIGludF90eXBlICBub3RfZW9mKGludF90eXBlIF9fYykgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gZXFfaW50X3R5cGUoX19jLCBlb2YoKSkgPyB+ZW9mKCkgOiBfX2M7fQorICAgIHN0YXRpYyBpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFIgY2hhcl90eXBlIHRvX2NoYXJfdHlwZShpbnRfdHlwZSBfX2MpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGNoYXJfdHlwZShfX2MpO30KKyAgICBzdGF0aWMgaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIGludF90eXBlIHRvX2ludF90eXBlKGNoYXJfdHlwZSBfX2MpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGludF90eXBlKF9fYyk7fQorICAgIHN0YXRpYyBpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBlcV9pbnRfdHlwZShpbnRfdHlwZSBfX2MxLCBpbnRfdHlwZSBfX2MyKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2MxID09IF9fYzI7fQorICAgIHN0YXRpYyBpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFIgaW50X3R5cGUgZW9mKCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gaW50X3R5cGUoMHhGRkZGRkZGRik7fQorfTsKKworaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CitpbnQKK2NoYXJfdHJhaXRzPGNoYXIzMl90Pjo6Y29tcGFyZShjb25zdCBjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikgX05PRVhDRVBUCit7CisgICAgZm9yICg7IF9fbjsgLS1fX24sICsrX19zMSwgKytfX3MyKQorICAgIHsKKyAgICAgICAgaWYgKGx0KCpfX3MxLCAqX19zMikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChsdCgqX19zMiwgKl9fczEpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK3NpemVfdAorY2hhcl90cmFpdHM8Y2hhcjMyX3Q+OjpsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3MpIF9OT0VYQ0VQVAoreworICAgIHNpemVfdCBfX2xlbiA9IDA7CisgICAgZm9yICg7ICFlcSgqX19zLCBjaGFyX3R5cGUoMCkpOyArK19fcykKKyAgICAgICAgKytfX2xlbjsKKyAgICByZXR1cm4gX19sZW47Cit9CisKK2lubGluZSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorY29uc3QgY2hhcjMyX3QqCitjaGFyX3RyYWl0czxjaGFyMzJfdD46OmZpbmQoY29uc3QgY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNvbnN0IGNoYXJfdHlwZSYgX19hKSBfTk9FWENFUFQKK3sKKyAgICBmb3IgKDsgX19uOyAtLV9fbikKKyAgICB7CisgICAgICAgIGlmIChlcSgqX19zLCBfX2EpKQorICAgICAgICAgICAgcmV0dXJuIF9fczsKKyAgICAgICAgKytfX3M7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbmxpbmUKK2NoYXIzMl90KgorY2hhcl90cmFpdHM8Y2hhcjMyX3Q+Ojptb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKSBfTk9FWENFUFQKK3sKKyAgICBjaGFyX3R5cGUqIF9fciA9IF9fczE7CisgICAgaWYgKF9fczEgPCBfX3MyKQorICAgIHsKKyAgICAgICAgZm9yICg7IF9fbjsgLS1fX24sICsrX19zMSwgKytfX3MyKQorICAgICAgICAgICAgYXNzaWduKCpfX3MxLCAqX19zMik7CisgICAgfQorICAgIGVsc2UgaWYgKF9fczIgPCBfX3MxKQorICAgIHsKKyAgICAgICAgX19zMSArPSBfX247CisgICAgICAgIF9fczIgKz0gX19uOworICAgICAgICBmb3IgKDsgX19uOyAtLV9fbikKKyAgICAgICAgICAgIGFzc2lnbigqLS1fX3MxLCAqLS1fX3MyKTsKKyAgICB9CisgICAgcmV0dXJuIF9fcjsKK30KKworaW5saW5lCitjaGFyMzJfdCoKK2NoYXJfdHJhaXRzPGNoYXIzMl90Pjo6Y29weShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikgX05PRVhDRVBUCit7CisgICAgX0xJQkNQUF9BU1NFUlQoX19zMiA8IF9fczEgfHwgX19zMiA+PSBfX3MxK19fbiwgImNoYXJfdHJhaXRzOjpjb3B5IG92ZXJsYXBwZWQgcmFuZ2UiKTsKKyAgICBjaGFyX3R5cGUqIF9fciA9IF9fczE7CisgICAgZm9yICg7IF9fbjsgLS1fX24sICsrX19zMSwgKytfX3MyKQorICAgICAgICBhc3NpZ24oKl9fczEsICpfX3MyKTsKKyAgICByZXR1cm4gX19yOworfQorCitpbmxpbmUKK2NoYXIzMl90KgorY2hhcl90cmFpdHM8Y2hhcjMyX3Q+Ojphc3NpZ24oY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNoYXJfdHlwZSBfX2EpIF9OT0VYQ0VQVAoreworICAgIGNoYXJfdHlwZSogX19yID0gX19zOworICAgIGZvciAoOyBfX247IC0tX19uLCArK19fcykKKyAgICAgICAgYXNzaWduKCpfX3MsIF9fYSk7CisgICAgcmV0dXJuIF9fcjsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19VTklDT0RFX0NIQVJTCisKKy8vIGhlbHBlciBmbnMgZm9yIGJhc2ljX3N0cmluZyBhbmQgc3RyaW5nX3ZpZXcKKworLy8gX19zdHJfZmluZAordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfU2l6ZVQsIGNsYXNzIF9UcmFpdHMsIF9TaXplVCBfX25wb3M+CitpbmxpbmUgX1NpemVUIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19fc3RyX2ZpbmQoY29uc3QgX0NoYXJUICpfX3AsIF9TaXplVCBfX3N6LCAKKyAgICAgICAgICAgICBfQ2hhclQgX19jLCBfU2l6ZVQgX19wb3MpIF9OT0VYQ0VQVAoreworICAgIGlmIChfX3BvcyA+PSBfX3N6KQorICAgICAgICByZXR1cm4gX19ucG9zOworICAgIGNvbnN0IF9DaGFyVCogX19yID0gX1RyYWl0czo6ZmluZChfX3AgKyBfX3BvcywgX19zeiAtIF9fcG9zLCBfX2MpOworICAgIGlmIChfX3IgPT0gMCkKKyAgICAgICAgcmV0dXJuIF9fbnBvczsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X1NpemVUPihfX3IgLSBfX3ApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIGNvbnN0IF9DaGFyVCAqCitfX3NlYXJjaF9zdWJzdHJpbmcoY29uc3QgX0NoYXJUICpfX2ZpcnN0MSwgY29uc3QgX0NoYXJUICpfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCAqX19maXJzdDIsIGNvbnN0IF9DaGFyVCAqX19sYXN0MikgeworICAvLyBUYWtlIGFkdmFudGFnZSBvZiBrbm93aW5nIHNvdXJjZSBhbmQgcGF0dGVybiBsZW5ndGhzLgorICAvLyBTdG9wIHNob3J0IHdoZW4gc291cmNlIGlzIHNtYWxsZXIgdGhhbiBwYXR0ZXJuLgorICBjb25zdCBwdHJkaWZmX3QgX19sZW4yID0gX19sYXN0MiAtIF9fZmlyc3QyOworICBpZiAoX19sZW4yID09IDApCisgICAgcmV0dXJuIF9fZmlyc3QxOworCisgIHB0cmRpZmZfdCBfX2xlbjEgPSBfX2xhc3QxIC0gX19maXJzdDE7CisgIGlmIChfX2xlbjEgPCBfX2xlbjIpCisgICAgcmV0dXJuIF9fbGFzdDE7CisKKyAgLy8gRmlyc3QgZWxlbWVudCBvZiBfX2ZpcnN0MiBpcyBsb29wIGludmFyaWFudC4KKyAgX0NoYXJUIF9fZjIgPSAqX19maXJzdDI7CisgIHdoaWxlICh0cnVlKSB7CisgICAgX19sZW4xID0gX19sYXN0MSAtIF9fZmlyc3QxOworICAgIC8vIENoZWNrIHdoZXRoZXIgX19maXJzdDEgc3RpbGwgaGFzIGF0IGxlYXN0IF9fbGVuMiBieXRlcy4KKyAgICBpZiAoX19sZW4xIDwgX19sZW4yKQorICAgICAgcmV0dXJuIF9fbGFzdDE7CisKKyAgICAvLyBGaW5kIF9fZjIgdGhlIGZpcnN0IGJ5dGUgbWF0Y2hpbmcgaW4gX19maXJzdDEuCisgICAgX19maXJzdDEgPSBfVHJhaXRzOjpmaW5kKF9fZmlyc3QxLCBfX2xlbjEgLSBfX2xlbjIgKyAxLCBfX2YyKTsKKyAgICBpZiAoX19maXJzdDEgPT0gMCkKKyAgICAgIHJldHVybiBfX2xhc3QxOworCisgICAgLy8gSXQgaXMgZmFzdGVyIHRvIGNvbXBhcmUgZnJvbSB0aGUgZmlyc3QgYnl0ZSBvZiBfX2ZpcnN0MSBldmVuIGlmIHdlCisgICAgLy8gYWxyZWFkeSBrbm93IHRoYXQgaXQgbWF0Y2hlcyB0aGUgZmlyc3QgYnl0ZSBvZiBfX2ZpcnN0MjogdGhpcyBpcyBiZWNhdXNlCisgICAgLy8gX19maXJzdDIgaXMgbW9zdCBsaWtlbHkgYWxpZ25lZCwgYXMgaXQgaXMgdXNlcidzICJwYXR0ZXJuIiBzdHJpbmcsIGFuZAorICAgIC8vIF9fZmlyc3QxICsgMSBpcyBtb3N0IGxpa2VseSBub3QgYWxpZ25lZCwgYXMgdGhlIG1hdGNoIGlzIGluIHRoZSBtaWRkbGUgb2YKKyAgICAvLyB0aGUgc3RyaW5nLgorICAgIGlmIChfVHJhaXRzOjpjb21wYXJlKF9fZmlyc3QxLCBfX2ZpcnN0MiwgX19sZW4yKSA9PSAwKQorICAgICAgcmV0dXJuIF9fZmlyc3QxOworCisgICAgKytfX2ZpcnN0MTsKKyAgfQorfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9TaXplVCwgY2xhc3MgX1RyYWl0cywgX1NpemVUIF9fbnBvcz4KK2lubGluZSBfU2l6ZVQgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX19zdHJfZmluZChjb25zdCBfQ2hhclQgKl9fcCwgX1NpemVUIF9fc3osIAorICAgICAgIGNvbnN0IF9DaGFyVCogX19zLCBfU2l6ZVQgX19wb3MsIF9TaXplVCBfX24pIF9OT0VYQ0VQVAoreworICAgIGlmIChfX3BvcyA+IF9fc3opCisgICAgICAgIHJldHVybiBfX25wb3M7CisKKyAgICBpZiAoX19uID09IDApIC8vIFRoZXJlIGlzIG5vdGhpbmcgdG8gc2VhcmNoLCBqdXN0IHJldHVybiBfX3Bvcy4KKyAgICAgICAgcmV0dXJuIF9fcG9zOworCisgICAgY29uc3QgX0NoYXJUICpfX3IgPSBfX3NlYXJjaF9zdWJzdHJpbmc8X0NoYXJULCBfVHJhaXRzPigKKyAgICAgICAgX19wICsgX19wb3MsIF9fcCArIF9fc3osIF9fcywgX19zICsgX19uKTsKKworICAgIGlmIChfX3IgPT0gX19wICsgX19zeikKKyAgICAgICAgcmV0dXJuIF9fbnBvczsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X1NpemVUPihfX3IgLSBfX3ApOworfQorCisKKy8vIF9fc3RyX3JmaW5kCisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1NpemVULCBjbGFzcyBfVHJhaXRzLCBfU2l6ZVQgX19ucG9zPgoraW5saW5lIF9TaXplVCBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfX3N0cl9yZmluZChjb25zdCBfQ2hhclQgKl9fcCwgX1NpemVUIF9fc3osIAorICAgICAgICAgICAgICBfQ2hhclQgX19jLCBfU2l6ZVQgX19wb3MpIF9OT0VYQ0VQVAoreworICAgIGlmIChfX3N6IDwgMSkKKyAgICAgICAgcmV0dXJuIF9fbnBvczsKKyAgICBpZiAoX19wb3MgPCBfX3N6KQorICAgICAgICArK19fcG9zOworICAgIGVsc2UKKyAgICAgICAgX19wb3MgPSBfX3N6OworICAgIGZvciAoY29uc3QgX0NoYXJUKiBfX3BzID0gX19wICsgX19wb3M7IF9fcHMgIT0gX19wOykKKyAgICB7CisgICAgICAgIGlmIChfVHJhaXRzOjplcSgqLS1fX3BzLCBfX2MpKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9TaXplVD4oX19wcyAtIF9fcCk7CisgICAgfQorICAgIHJldHVybiBfX25wb3M7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1NpemVULCBjbGFzcyBfVHJhaXRzLCBfU2l6ZVQgX19ucG9zPgoraW5saW5lIF9TaXplVCBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfX3N0cl9yZmluZChjb25zdCBfQ2hhclQgKl9fcCwgX1NpemVUIF9fc3osIAorICAgICAgICBjb25zdCBfQ2hhclQqIF9fcywgX1NpemVUIF9fcG9zLCBfU2l6ZVQgX19uKSBfTk9FWENFUFQKK3sKKyAgICBfX3BvcyA9IF9WU1REOjptaW4oX19wb3MsIF9fc3opOworICAgIGlmIChfX24gPCBfX3N6IC0gX19wb3MpCisgICAgICAgIF9fcG9zICs9IF9fbjsKKyAgICBlbHNlCisgICAgICAgIF9fcG9zID0gX19zejsKKyAgICBjb25zdCBfQ2hhclQqIF9fciA9IF9WU1REOjpfX2ZpbmRfZW5kKAorICAgICAgICAgICAgICAgICAgX19wLCBfX3AgKyBfX3BvcywgX19zLCBfX3MgKyBfX24sIF9UcmFpdHM6OmVxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCkpOworICAgIGlmIChfX24gPiAwICYmIF9fciA9PSBfX3AgKyBfX3BvcykKKyAgICAgICAgcmV0dXJuIF9fbnBvczsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X1NpemVUPihfX3IgLSBfX3ApOworfQorCisvLyBfX3N0cl9maW5kX2ZpcnN0X29mCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9TaXplVCwgY2xhc3MgX1RyYWl0cywgX1NpemVUIF9fbnBvcz4KK2lubGluZSBfU2l6ZVQgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX19zdHJfZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQgKl9fcCwgX1NpemVUIF9fc3osCisgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3MsIF9TaXplVCBfX3BvcywgX1NpemVUIF9fbikgX05PRVhDRVBUCit7CisgICAgaWYgKF9fcG9zID49IF9fc3ogfHwgX19uID09IDApCisgICAgICAgIHJldHVybiBfX25wb3M7CisgICAgY29uc3QgX0NoYXJUKiBfX3IgPSBfVlNURDo6X19maW5kX2ZpcnN0X29mX2NlCisgICAgICAgIChfX3AgKyBfX3BvcywgX19wICsgX19zeiwgX19zLCBfX3MgKyBfX24sIF9UcmFpdHM6OmVxICk7CisgICAgaWYgKF9fciA9PSBfX3AgKyBfX3N6KQorICAgICAgICByZXR1cm4gX19ucG9zOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxfU2l6ZVQ+KF9fciAtIF9fcCk7Cit9CisKKworLy8gX19zdHJfZmluZF9sYXN0X29mCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9TaXplVCwgY2xhc3MgX1RyYWl0cywgX1NpemVUIF9fbnBvcz4KK2lubGluZSBfU2l6ZVQgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX19zdHJfZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCAqX19wLCBfU2l6ZVQgX19zeiwKKyAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19zLCBfU2l6ZVQgX19wb3MsIF9TaXplVCBfX24pIF9OT0VYQ0VQVAorICAgIHsKKyAgICBpZiAoX19uICE9IDApCisgICAgeworICAgICAgICBpZiAoX19wb3MgPCBfX3N6KQorICAgICAgICAgICAgKytfX3BvczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX19wb3MgPSBfX3N6OworICAgICAgICBmb3IgKGNvbnN0IF9DaGFyVCogX19wcyA9IF9fcCArIF9fcG9zOyBfX3BzICE9IF9fcDspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19yID0gX1RyYWl0czo6ZmluZChfX3MsIF9fbiwgKi0tX19wcyk7CisgICAgICAgICAgICBpZiAoX19yKQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxfU2l6ZVQ+KF9fcHMgLSBfX3ApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX25wb3M7Cit9CisKKworLy8gX19zdHJfZmluZF9maXJzdF9ub3Rfb2YKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1NpemVULCBjbGFzcyBfVHJhaXRzLCBfU2l6ZVQgX19ucG9zPgoraW5saW5lIF9TaXplVCBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfX3N0cl9maW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQgKl9fcCwgX1NpemVUIF9fc3osCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19zLCBfU2l6ZVQgX19wb3MsIF9TaXplVCBfX24pIF9OT0VYQ0VQVAoreworICAgIGlmIChfX3BvcyA8IF9fc3opCisgICAgeworICAgICAgICBjb25zdCBfQ2hhclQqIF9fcGUgPSBfX3AgKyBfX3N6OworICAgICAgICBmb3IgKGNvbnN0IF9DaGFyVCogX19wcyA9IF9fcCArIF9fcG9zOyBfX3BzICE9IF9fcGU7ICsrX19wcykKKyAgICAgICAgICAgIGlmIChfVHJhaXRzOjpmaW5kKF9fcywgX19uLCAqX19wcykgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X1NpemVUPihfX3BzIC0gX19wKTsKKyAgICB9CisgICAgcmV0dXJuIF9fbnBvczsKK30KKworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9TaXplVCwgY2xhc3MgX1RyYWl0cywgX1NpemVUIF9fbnBvcz4KK2lubGluZSBfU2l6ZVQgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX19zdHJfZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0NoYXJUICpfX3AsIF9TaXplVCBfX3N6LAorICAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hhclQgX19jLCBfU2l6ZVQgX19wb3MpIF9OT0VYQ0VQVAoreworICAgIGlmIChfX3BvcyA8IF9fc3opCisgICAgeworICAgICAgICBjb25zdCBfQ2hhclQqIF9fcGUgPSBfX3AgKyBfX3N6OworICAgICAgICBmb3IgKGNvbnN0IF9DaGFyVCogX19wcyA9IF9fcCArIF9fcG9zOyBfX3BzICE9IF9fcGU7ICsrX19wcykKKyAgICAgICAgICAgIGlmICghX1RyYWl0czo6ZXEoKl9fcHMsIF9fYykpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9TaXplVD4oX19wcyAtIF9fcCk7CisgICAgfQorICAgIHJldHVybiBfX25wb3M7Cit9CisKKworLy8gX19zdHJfZmluZF9sYXN0X25vdF9vZgordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfU2l6ZVQsIGNsYXNzIF9UcmFpdHMsIF9TaXplVCBfX25wb3M+CitpbmxpbmUgX1NpemVUIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19fc3RyX2ZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUICpfX3AsIF9TaXplVCBfX3N6LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19zLCBfU2l6ZVQgX19wb3MsIF9TaXplVCBfX24pIF9OT0VYQ0VQVAoreworICAgIGlmIChfX3BvcyA8IF9fc3opCisgICAgICAgICsrX19wb3M7CisgICAgZWxzZQorICAgICAgICBfX3BvcyA9IF9fc3o7CisgICAgZm9yIChjb25zdCBfQ2hhclQqIF9fcHMgPSBfX3AgKyBfX3BvczsgX19wcyAhPSBfX3A7KQorICAgICAgICBpZiAoX1RyYWl0czo6ZmluZChfX3MsIF9fbiwgKi0tX19wcykgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxfU2l6ZVQ+KF9fcHMgLSBfX3ApOworICAgIHJldHVybiBfX25wb3M7Cit9CisKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfU2l6ZVQsIGNsYXNzIF9UcmFpdHMsIF9TaXplVCBfX25wb3M+CitpbmxpbmUgX1NpemVUIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19fc3RyX2ZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUICpfX3AsIF9TaXplVCBfX3N6LAorICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCBfX2MsIF9TaXplVCBfX3BvcykgX05PRVhDRVBUCit7CisgICAgaWYgKF9fcG9zIDwgX19zeikKKyAgICAgICAgKytfX3BvczsKKyAgICBlbHNlCisgICAgICAgIF9fcG9zID0gX19zejsKKyAgICBmb3IgKGNvbnN0IF9DaGFyVCogX19wcyA9IF9fcCArIF9fcG9zOyBfX3BzICE9IF9fcDspCisgICAgICAgIGlmICghX1RyYWl0czo6ZXEoKi0tX19wcywgX19jKSkKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxfU2l6ZVQ+KF9fcHMgLSBfX3ApOworICAgIHJldHVybiBfX25wb3M7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9QdHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorc2l6ZV90IF9fZG9fc3RyaW5nX2hhc2goX1B0ciBfX3AsIF9QdHIgX19lKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9QdHI+Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgcmV0dXJuIF9fbXVybXVyMl9vcl9jaXR5aGFzaDxzaXplX3Q+KCkoX19wLCAoX19lLV9fcCkqc2l6ZW9mKHZhbHVlX3R5cGUpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0l0ZXIsIGNsYXNzIF9UcmFpdHM9Y2hhcl90cmFpdHM8X0NoYXJUPiA+CitzdHJ1Y3QgX19xdW90ZWRfb3V0cHV0X3Byb3h5Cit7CisgICAgX0l0ZXIgIF9fZmlyc3Q7CisgICAgX0l0ZXIgIF9fbGFzdDsKKyAgICBfQ2hhclQgIF9fZGVsaW07CisgICAgX0NoYXJUICBfX2VzY2FwZTsKKworICAgIF9fcXVvdGVkX291dHB1dF9wcm94eShfSXRlciBfX2YsIF9JdGVyIF9fbCwgX0NoYXJUIF9fZCwgX0NoYXJUIF9fZSkKKyAgICA6IF9fZmlyc3QoX19mKSwgX19sYXN0KF9fbCksIF9fZGVsaW0oX19kKSwgX19lc2NhcGUoX19lKSB7fQorICAgIC8vICBUaGlzIHdvdWxkIGJlIGEgbmljZSBwbGFjZSBmb3IgYSBzdHJpbmdfcmVmIAorfTsKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCitfTElCQ1BQX1BPUF9NQUNST1MKKworI2VuZGlmICAvLyBfTElCQ1BQX19fU1RSSU5HCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX190aHJlYWRpbmdfc3VwcG9ydCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX3RocmVhZGluZ19zdXBwb3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMWVmZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX190aHJlYWRpbmdfc3VwcG9ydApAQCAtMCwwICsxLDQwMiBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9USFJFQURJTkdfU1VQUE9SVAorI2RlZmluZSBfTElCQ1BQX1RIUkVBRElOR19TVVBQT1JUCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUgorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfSEFTX1RIUkVBRF9BUElfRVhURVJOQUwpCisjIGluY2x1ZGUgPF9fZXh0ZXJuYWxfdGhyZWFkaW5nPgorI2VsaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVEhSRUFEUykKKworI2lmIGRlZmluZWQoX0xJQkNQUF9IQVNfVEhSRUFEX0FQSV9QVEhSRUFEKQorIyBpbmNsdWRlIDxwdGhyZWFkLmg+CisjIGluY2x1ZGUgPHNjaGVkLmg+CisjZW5kaWYKKworX0xJQkNQUF9QVVNIX01BQ1JPUworI2luY2x1ZGUgPF9fdW5kZWZfbWFjcm9zPgorCisjaWYgZGVmaW5lZChfTElCQ1BQX0hBU19USFJFQURfTElCUkFSWV9FWFRFUk5BTCkgfHwgXAorICAgIGRlZmluZWQoX0xJQkNQUF9CVUlMRElOR19USFJFQURfTElCUkFSWV9FWFRFUk5BTCkgfHwgXAorICAgIGRlZmluZWQoX0xJQkNQUF9IQVNfVEhSRUFEX0FQSV9XSU4zMikKKyNkZWZpbmUgX0xJQkNQUF9USFJFQURfQUJJX1ZJU0lCSUxJVFkgX0xJQkNQUF9GVU5DX1ZJUworI2Vsc2UKKyNkZWZpbmUgX0xJQkNQUF9USFJFQURfQUJJX1ZJU0lCSUxJVFkgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgZGVmaW5lZChfX2NsYW5nX18pICYmIF9faGFzX2F0dHJpYnV0ZShub190aHJlYWRfc2FmZXR5X2FuYWx5c2lzKQorI2RlZmluZSBfTElCQ1BQX05PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMgX19hdHRyaWJ1dGVfXygobm9fdGhyZWFkX3NhZmV0eV9hbmFseXNpcykpCisjZWxzZQorI2RlZmluZSBfTElCQ1BQX05PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMKKyNlbmRpZgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKworI2lmIGRlZmluZWQoX0xJQkNQUF9IQVNfVEhSRUFEX0FQSV9QVEhSRUFEKQorLy8gTXV0ZXgKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IF9fbGliY3BwX211dGV4X3Q7CisjZGVmaW5lIF9MSUJDUFBfTVVURVhfSU5JVElBTElaRVIgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUgorCit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBfX2xpYmNwcF9yZWN1cnNpdmVfbXV0ZXhfdDsKKworLy8gQ29uZGl0aW9uIFZhcmlhYmxlCit0eXBlZGVmIHB0aHJlYWRfY29uZF90IF9fbGliY3BwX2NvbmR2YXJfdDsKKyNkZWZpbmUgX0xJQkNQUF9DT05EVkFSX0lOSVRJQUxJWkVSIFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUgorCisvLyBFeGVjdXRlIG9uY2UKK3R5cGVkZWYgcHRocmVhZF9vbmNlX3QgX19saWJjcHBfZXhlY19vbmNlX2ZsYWc7CisjZGVmaW5lIF9MSUJDUFBfRVhFQ19PTkNFX0lOSVRJQUxJWkVSIFBUSFJFQURfT05DRV9JTklUCisKKy8vIFRocmVhZCBpZAordHlwZWRlZiBwdGhyZWFkX3QgX19saWJjcHBfdGhyZWFkX2lkOworCisvLyBUaHJlYWQKKyNkZWZpbmUgX0xJQkNQUF9OVUxMX1RIUkVBRCAwVQorCit0eXBlZGVmIHB0aHJlYWRfdCBfX2xpYmNwcF90aHJlYWRfdDsKKworLy8gVGhyYWQgTG9jYWwgU3RvcmFnZQordHlwZWRlZiBwdGhyZWFkX2tleV90IF9fbGliY3BwX3Rsc19rZXk7CisKKyNkZWZpbmUgX0xJQkNQUF9UTFNfREVTVFJVQ1RPUl9DQworI2Vsc2UKKy8vIE11dGV4Cit0eXBlZGVmIHZvaWQqIF9fbGliY3BwX211dGV4X3Q7CisjZGVmaW5lIF9MSUJDUFBfTVVURVhfSU5JVElBTElaRVIgMAorCisjaWYgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9NX0FSTSkgfHwgZGVmaW5lZChfX2FybV9fKQordHlwZWRlZiB2b2lkKiBfX2xpYmNwcF9yZWN1cnNpdmVfbXV0ZXhfdFs2XTsKKyNlbGlmIGRlZmluZWQoX01fQU1ENjQpIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfTV9BUk02NCkgfHwgZGVmaW5lZChfX2FhcmNoNjRfXykKK3R5cGVkZWYgdm9pZCogX19saWJjcHBfcmVjdXJzaXZlX211dGV4X3RbNV07CisjZWxzZQorIyBlcnJvciBVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUKKyNlbmRpZgorCisvLyBDb25kaXRpb24gVmFyaWFibGUKK3R5cGVkZWYgdm9pZCogX19saWJjcHBfY29uZHZhcl90OworI2RlZmluZSBfTElCQ1BQX0NPTkRWQVJfSU5JVElBTElaRVIgMAorCisvLyBFeGVjdXRlIE9uY2UKK3R5cGVkZWYgdm9pZCogX19saWJjcHBfZXhlY19vbmNlX2ZsYWc7CisjZGVmaW5lIF9MSUJDUFBfRVhFQ19PTkNFX0lOSVRJQUxJWkVSIDAKKworLy8gVGhyZWFkIElECit0eXBlZGVmIGxvbmcgX19saWJjcHBfdGhyZWFkX2lkOworCisvLyBUaHJlYWQKKyNkZWZpbmUgX0xJQkNQUF9OVUxMX1RIUkVBRCAwVQorCit0eXBlZGVmIHZvaWQqIF9fbGliY3BwX3RocmVhZF90OworCisvLyBUaHJlYWQgTG9jYWwgU3RvcmFnZQordHlwZWRlZiBsb25nIF9fbGliY3BwX3Rsc19rZXk7CisKKyNkZWZpbmUgX0xJQkNQUF9UTFNfREVTVFJVQ1RPUl9DQyBfX3N0ZGNhbGwKKyNlbmRpZgorCisvLyBNdXRleAorX0xJQkNQUF9USFJFQURfQUJJX1ZJU0lCSUxJVFkKK2ludCBfX2xpYmNwcF9yZWN1cnNpdmVfbXV0ZXhfaW5pdChfX2xpYmNwcF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tKTsKKworX0xJQkNQUF9USFJFQURfQUJJX1ZJU0lCSUxJVFkgX0xJQkNQUF9OT19USFJFQURfU0FGRVRZX0FOQUxZU0lTCitpbnQgX19saWJjcHBfcmVjdXJzaXZlX211dGV4X2xvY2soX19saWJjcHBfcmVjdXJzaXZlX211dGV4X3QgKl9fbSk7CisKK19MSUJDUFBfVEhSRUFEX0FCSV9WSVNJQklMSVRZIF9MSUJDUFBfTk9fVEhSRUFEX1NBRkVUWV9BTkFMWVNJUworYm9vbCBfX2xpYmNwcF9yZWN1cnNpdmVfbXV0ZXhfdHJ5bG9jayhfX2xpYmNwcF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tKTsKKworX0xJQkNQUF9USFJFQURfQUJJX1ZJU0lCSUxJVFkgX0xJQkNQUF9OT19USFJFQURfU0FGRVRZX0FOQUxZU0lTCitpbnQgX19saWJjcHBfcmVjdXJzaXZlX211dGV4X3VubG9jayhfX2xpYmNwcF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tKTsKKworX0xJQkNQUF9USFJFQURfQUJJX1ZJU0lCSUxJVFkKK2ludCBfX2xpYmNwcF9yZWN1cnNpdmVfbXV0ZXhfZGVzdHJveShfX2xpYmNwcF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tKTsKKworX0xJQkNQUF9USFJFQURfQUJJX1ZJU0lCSUxJVFkgX0xJQkNQUF9OT19USFJFQURfU0FGRVRZX0FOQUxZU0lTCitpbnQgX19saWJjcHBfbXV0ZXhfbG9jayhfX2xpYmNwcF9tdXRleF90ICpfX20pOworCitfTElCQ1BQX1RIUkVBRF9BQklfVklTSUJJTElUWSBfTElCQ1BQX05PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMKK2Jvb2wgX19saWJjcHBfbXV0ZXhfdHJ5bG9jayhfX2xpYmNwcF9tdXRleF90ICpfX20pOworCitfTElCQ1BQX1RIUkVBRF9BQklfVklTSUJJTElUWSBfTElCQ1BQX05PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMKK2ludCBfX2xpYmNwcF9tdXRleF91bmxvY2soX19saWJjcHBfbXV0ZXhfdCAqX19tKTsKKworX0xJQkNQUF9USFJFQURfQUJJX1ZJU0lCSUxJVFkKK2ludCBfX2xpYmNwcF9tdXRleF9kZXN0cm95KF9fbGliY3BwX211dGV4X3QgKl9fbSk7CisKKy8vIENvbmRpdGlvbiB2YXJpYWJsZQorX0xJQkNQUF9USFJFQURfQUJJX1ZJU0lCSUxJVFkKK2ludCBfX2xpYmNwcF9jb25kdmFyX3NpZ25hbChfX2xpYmNwcF9jb25kdmFyX3QqIF9fY3YpOworCitfTElCQ1BQX1RIUkVBRF9BQklfVklTSUJJTElUWQoraW50IF9fbGliY3BwX2NvbmR2YXJfYnJvYWRjYXN0KF9fbGliY3BwX2NvbmR2YXJfdCogX19jdik7CisKK19MSUJDUFBfVEhSRUFEX0FCSV9WSVNJQklMSVRZIF9MSUJDUFBfTk9fVEhSRUFEX1NBRkVUWV9BTkFMWVNJUworaW50IF9fbGliY3BwX2NvbmR2YXJfd2FpdChfX2xpYmNwcF9jb25kdmFyX3QqIF9fY3YsIF9fbGliY3BwX211dGV4X3QqIF9fbSk7CisKK19MSUJDUFBfVEhSRUFEX0FCSV9WSVNJQklMSVRZIF9MSUJDUFBfTk9fVEhSRUFEX1NBRkVUWV9BTkFMWVNJUworaW50IF9fbGliY3BwX2NvbmR2YXJfdGltZWR3YWl0KF9fbGliY3BwX2NvbmR2YXJfdCAqX19jdiwgX19saWJjcHBfbXV0ZXhfdCAqX19tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzcGVjICpfX3RzKTsKKworX0xJQkNQUF9USFJFQURfQUJJX1ZJU0lCSUxJVFkKK2ludCBfX2xpYmNwcF9jb25kdmFyX2Rlc3Ryb3koX19saWJjcHBfY29uZHZhcl90KiBfX2N2KTsKKworLy8gRXhlY3V0ZSBvbmNlCitfTElCQ1BQX1RIUkVBRF9BQklfVklTSUJJTElUWQoraW50IF9fbGliY3BwX2V4ZWN1dGVfb25jZShfX2xpYmNwcF9leGVjX29uY2VfZmxhZyAqZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmluaXRfcm91dGluZSkodm9pZCkpOworCisvLyBUaHJlYWQgaWQKK19MSUJDUFBfVEhSRUFEX0FCSV9WSVNJQklMSVRZCitib29sIF9fbGliY3BwX3RocmVhZF9pZF9lcXVhbChfX2xpYmNwcF90aHJlYWRfaWQgdDEsIF9fbGliY3BwX3RocmVhZF9pZCB0Mik7CisKK19MSUJDUFBfVEhSRUFEX0FCSV9WSVNJQklMSVRZCitib29sIF9fbGliY3BwX3RocmVhZF9pZF9sZXNzKF9fbGliY3BwX3RocmVhZF9pZCB0MSwgX19saWJjcHBfdGhyZWFkX2lkIHQyKTsKKworLy8gVGhyZWFkCitfTElCQ1BQX1RIUkVBRF9BQklfVklTSUJJTElUWQorYm9vbCBfX2xpYmNwcF90aHJlYWRfaXNudWxsKGNvbnN0IF9fbGliY3BwX3RocmVhZF90ICpfX3QpOworCitfTElCQ1BQX1RIUkVBRF9BQklfVklTSUJJTElUWQoraW50IF9fbGliY3BwX3RocmVhZF9jcmVhdGUoX19saWJjcHBfdGhyZWFkX3QgKl9fdCwgdm9pZCAqKCpfX2Z1bmMpKHZvaWQgKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpfX2FyZyk7CisKK19MSUJDUFBfVEhSRUFEX0FCSV9WSVNJQklMSVRZCitfX2xpYmNwcF90aHJlYWRfaWQgX19saWJjcHBfdGhyZWFkX2dldF9jdXJyZW50X2lkKCk7CisKK19MSUJDUFBfVEhSRUFEX0FCSV9WSVNJQklMSVRZCitfX2xpYmNwcF90aHJlYWRfaWQgX19saWJjcHBfdGhyZWFkX2dldF9pZChjb25zdCBfX2xpYmNwcF90aHJlYWRfdCAqX190KTsKKworX0xJQkNQUF9USFJFQURfQUJJX1ZJU0lCSUxJVFkKK2ludCBfX2xpYmNwcF90aHJlYWRfam9pbihfX2xpYmNwcF90aHJlYWRfdCAqX190KTsKKworX0xJQkNQUF9USFJFQURfQUJJX1ZJU0lCSUxJVFkKK2ludCBfX2xpYmNwcF90aHJlYWRfZGV0YWNoKF9fbGliY3BwX3RocmVhZF90ICpfX3QpOworCitfTElCQ1BQX1RIUkVBRF9BQklfVklTSUJJTElUWQordm9pZCBfX2xpYmNwcF90aHJlYWRfeWllbGQoKTsKKworX0xJQkNQUF9USFJFQURfQUJJX1ZJU0lCSUxJVFkKK3ZvaWQgX19saWJjcHBfdGhyZWFkX3NsZWVwX2Zvcihjb25zdCBjaHJvbm86Om5hbm9zZWNvbmRzJiBfX25zKTsKKworLy8gVGhyZWFkIGxvY2FsIHN0b3JhZ2UKK19MSUJDUFBfVEhSRUFEX0FCSV9WSVNJQklMSVRZCitpbnQgX19saWJjcHBfdGxzX2NyZWF0ZShfX2xpYmNwcF90bHNfa2V5KiBfX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQoX0xJQkNQUF9UTFNfREVTVFJVQ1RPUl9DQyogX19hdF9leGl0KSh2b2lkKikpOworCitfTElCQ1BQX1RIUkVBRF9BQklfVklTSUJJTElUWQordm9pZCAqX19saWJjcHBfdGxzX2dldChfX2xpYmNwcF90bHNfa2V5IF9fa2V5KTsKKworX0xJQkNQUF9USFJFQURfQUJJX1ZJU0lCSUxJVFkKK2ludCBfX2xpYmNwcF90bHNfc2V0KF9fbGliY3BwX3Rsc19rZXkgX19rZXksIHZvaWQgKl9fcCk7CisKKyNpZiAoIWRlZmluZWQoX0xJQkNQUF9IQVNfVEhSRUFEX0xJQlJBUllfRVhURVJOQUwpIHx8IFwKKyAgICAgZGVmaW5lZChfTElCQ1BQX0JVSUxESU5HX1RIUkVBRF9MSUJSQVJZX0VYVEVSTkFMKSkgJiYgXAorICAgIGRlZmluZWQoX0xJQkNQUF9IQVNfVEhSRUFEX0FQSV9QVEhSRUFEKQorCitpbnQgX19saWJjcHBfcmVjdXJzaXZlX211dGV4X2luaXQoX19saWJjcHBfcmVjdXJzaXZlX211dGV4X3QgKl9fbSkKK3sKKyAgcHRocmVhZF9tdXRleGF0dHJfdCBhdHRyOworICBpbnQgX19lYyA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJmF0dHIpOworICBpZiAoX19lYykKKyAgICByZXR1cm4gX19lYzsKKyAgX19lYyA9IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJmF0dHIsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFKTsKKyAgaWYgKF9fZWMpIHsKKyAgICBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZhdHRyKTsKKyAgICByZXR1cm4gX19lYzsKKyAgfQorICBfX2VjID0gcHRocmVhZF9tdXRleF9pbml0KF9fbSwgJmF0dHIpOworICBpZiAoX19lYykgeworICAgIHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJmF0dHIpOworICAgIHJldHVybiBfX2VjOworICB9CisgIF9fZWMgPSBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZhdHRyKTsKKyAgaWYgKF9fZWMpIHsKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koX19tKTsKKyAgICByZXR1cm4gX19lYzsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IF9fbGliY3BwX3JlY3Vyc2l2ZV9tdXRleF9sb2NrKF9fbGliY3BwX3JlY3Vyc2l2ZV9tdXRleF90ICpfX20pCit7CisgIHJldHVybiBwdGhyZWFkX211dGV4X2xvY2soX19tKTsKK30KKworYm9vbCBfX2xpYmNwcF9yZWN1cnNpdmVfbXV0ZXhfdHJ5bG9jayhfX2xpYmNwcF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tKQoreworICByZXR1cm4gcHRocmVhZF9tdXRleF90cnlsb2NrKF9fbSkgPT0gMDsKK30KKworaW50IF9fbGliY3BwX3JlY3Vyc2l2ZV9tdXRleF91bmxvY2soX19saWJjcHBfbXV0ZXhfdCAqX19tKQoreworICByZXR1cm4gcHRocmVhZF9tdXRleF91bmxvY2soX19tKTsKK30KKworaW50IF9fbGliY3BwX3JlY3Vyc2l2ZV9tdXRleF9kZXN0cm95KF9fbGliY3BwX3JlY3Vyc2l2ZV9tdXRleF90ICpfX20pCit7CisgIHJldHVybiBwdGhyZWFkX211dGV4X2Rlc3Ryb3koX19tKTsKK30KKworaW50IF9fbGliY3BwX211dGV4X2xvY2soX19saWJjcHBfbXV0ZXhfdCAqX19tKQoreworICByZXR1cm4gcHRocmVhZF9tdXRleF9sb2NrKF9fbSk7Cit9CisKK2Jvb2wgX19saWJjcHBfbXV0ZXhfdHJ5bG9jayhfX2xpYmNwcF9tdXRleF90ICpfX20pCit7CisgIHJldHVybiBwdGhyZWFkX211dGV4X3RyeWxvY2soX19tKSA9PSAwOworfQorCitpbnQgX19saWJjcHBfbXV0ZXhfdW5sb2NrKF9fbGliY3BwX211dGV4X3QgKl9fbSkKK3sKKyAgcmV0dXJuIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKF9fbSk7Cit9CisKK2ludCBfX2xpYmNwcF9tdXRleF9kZXN0cm95KF9fbGliY3BwX211dGV4X3QgKl9fbSkKK3sKKyAgcmV0dXJuIHB0aHJlYWRfbXV0ZXhfZGVzdHJveShfX20pOworfQorCisvLyBDb25kaXRpb24gVmFyaWFibGUKK2ludCBfX2xpYmNwcF9jb25kdmFyX3NpZ25hbChfX2xpYmNwcF9jb25kdmFyX3QgKl9fY3YpCit7CisgIHJldHVybiBwdGhyZWFkX2NvbmRfc2lnbmFsKF9fY3YpOworfQorCitpbnQgX19saWJjcHBfY29uZHZhcl9icm9hZGNhc3QoX19saWJjcHBfY29uZHZhcl90ICpfX2N2KQoreworICByZXR1cm4gcHRocmVhZF9jb25kX2Jyb2FkY2FzdChfX2N2KTsKK30KKworaW50IF9fbGliY3BwX2NvbmR2YXJfd2FpdChfX2xpYmNwcF9jb25kdmFyX3QgKl9fY3YsIF9fbGliY3BwX211dGV4X3QgKl9fbSkKK3sKKyAgcmV0dXJuIHB0aHJlYWRfY29uZF93YWl0KF9fY3YsIF9fbSk7Cit9CisKK2ludCBfX2xpYmNwcF9jb25kdmFyX3RpbWVkd2FpdChfX2xpYmNwcF9jb25kdmFyX3QgKl9fY3YsIF9fbGliY3BwX211dGV4X3QgKl9fbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3BlYyAqX190cykKK3sKKyAgcmV0dXJuIHB0aHJlYWRfY29uZF90aW1lZHdhaXQoX19jdiwgX19tLCBfX3RzKTsKK30KKworaW50IF9fbGliY3BwX2NvbmR2YXJfZGVzdHJveShfX2xpYmNwcF9jb25kdmFyX3QgKl9fY3YpCit7CisgIHJldHVybiBwdGhyZWFkX2NvbmRfZGVzdHJveShfX2N2KTsKK30KKworLy8gRXhlY3V0ZSBvbmNlCitpbnQgX19saWJjcHBfZXhlY3V0ZV9vbmNlKF9fbGliY3BwX2V4ZWNfb25jZV9mbGFnICpmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqaW5pdF9yb3V0aW5lKSh2b2lkKSkgeworICByZXR1cm4gcHRocmVhZF9vbmNlKGZsYWcsIGluaXRfcm91dGluZSk7Cit9CisKKy8vIFRocmVhZCBpZAorLy8gUmV0dXJucyBub24temVybyBpZiB0aGUgdGhyZWFkIGlkcyBhcmUgZXF1YWwsIG90aGVyd2lzZSAwCitib29sIF9fbGliY3BwX3RocmVhZF9pZF9lcXVhbChfX2xpYmNwcF90aHJlYWRfaWQgdDEsIF9fbGliY3BwX3RocmVhZF9pZCB0MikKK3sKKyAgcmV0dXJuIHB0aHJlYWRfZXF1YWwodDEsIHQyKSAhPSAwOworfQorCisvLyBSZXR1cm5zIG5vbi16ZXJvIGlmIHQxIDwgdDIsIG90aGVyd2lzZSAwCitib29sIF9fbGliY3BwX3RocmVhZF9pZF9sZXNzKF9fbGliY3BwX3RocmVhZF9pZCB0MSwgX19saWJjcHBfdGhyZWFkX2lkIHQyKQoreworICByZXR1cm4gdDEgPCB0MjsKK30KKworLy8gVGhyZWFkCitib29sIF9fbGliY3BwX3RocmVhZF9pc251bGwoY29uc3QgX19saWJjcHBfdGhyZWFkX3QgKl9fdCkgeworICByZXR1cm4gKl9fdCA9PSAwOworfQorCitpbnQgX19saWJjcHBfdGhyZWFkX2NyZWF0ZShfX2xpYmNwcF90aHJlYWRfdCAqX190LCB2b2lkICooKl9fZnVuYykodm9pZCAqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKl9fYXJnKQoreworICByZXR1cm4gcHRocmVhZF9jcmVhdGUoX190LCAwLCBfX2Z1bmMsIF9fYXJnKTsKK30KKworX19saWJjcHBfdGhyZWFkX2lkIF9fbGliY3BwX3RocmVhZF9nZXRfY3VycmVudF9pZCgpCit7CisgIHJldHVybiBwdGhyZWFkX3NlbGYoKTsKK30KKworX19saWJjcHBfdGhyZWFkX2lkIF9fbGliY3BwX3RocmVhZF9nZXRfaWQoY29uc3QgX19saWJjcHBfdGhyZWFkX3QgKl9fdCkKK3sKKyAgcmV0dXJuICpfX3Q7Cit9CisKK2ludCBfX2xpYmNwcF90aHJlYWRfam9pbihfX2xpYmNwcF90aHJlYWRfdCAqX190KQoreworICByZXR1cm4gcHRocmVhZF9qb2luKCpfX3QsIDApOworfQorCitpbnQgX19saWJjcHBfdGhyZWFkX2RldGFjaChfX2xpYmNwcF90aHJlYWRfdCAqX190KQoreworICByZXR1cm4gcHRocmVhZF9kZXRhY2goKl9fdCk7Cit9CisKK3ZvaWQgX19saWJjcHBfdGhyZWFkX3lpZWxkKCkKK3sKKyAgc2NoZWRfeWllbGQoKTsKK30KKwordm9pZCBfX2xpYmNwcF90aHJlYWRfc2xlZXBfZm9yKGNvbnN0IGNocm9ubzo6bmFub3NlY29uZHMmIF9fbnMpCit7CisgICB1c2luZyBuYW1lc3BhY2UgY2hyb25vOworICAgc2Vjb25kcyBfX3MgPSBkdXJhdGlvbl9jYXN0PHNlY29uZHM+KF9fbnMpOworICAgdGltZXNwZWMgX190czsKKyAgIHR5cGVkZWYgZGVjbHR5cGUoX190cy50dl9zZWMpIHRzX3NlYzsKKyAgIF9MSUJDUFBfQ09OU1RFWFBSIHRzX3NlYyBfX3RzX3NlY19tYXggPSBudW1lcmljX2xpbWl0czx0c19zZWM+OjptYXgoKTsKKworICAgaWYgKF9fcy5jb3VudCgpIDwgX190c19zZWNfbWF4KQorICAgeworICAgICBfX3RzLnR2X3NlYyA9IHN0YXRpY19jYXN0PHRzX3NlYz4oX19zLmNvdW50KCkpOworICAgICBfX3RzLnR2X25zZWMgPSBzdGF0aWNfY2FzdDxkZWNsdHlwZShfX3RzLnR2X25zZWMpPigoX19ucyAtIF9fcykuY291bnQoKSk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgIF9fdHMudHZfc2VjID0gX190c19zZWNfbWF4OworICAgICBfX3RzLnR2X25zZWMgPSA5OTk5OTk5OTk7IC8vICgxMF45IC0gMSkKKyAgIH0KKworICAgd2hpbGUgKG5hbm9zbGVlcCgmX190cywgJl9fdHMpID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKK30KKworLy8gVGhyZWFkIGxvY2FsIHN0b3JhZ2UKK2ludCBfX2xpYmNwcF90bHNfY3JlYXRlKF9fbGliY3BwX3Rsc19rZXkgKl9fa2V5LCB2b2lkICgqX19hdF9leGl0KSh2b2lkICopKQoreworICByZXR1cm4gcHRocmVhZF9rZXlfY3JlYXRlKF9fa2V5LCBfX2F0X2V4aXQpOworfQorCit2b2lkICpfX2xpYmNwcF90bHNfZ2V0KF9fbGliY3BwX3Rsc19rZXkgX19rZXkpCit7CisgIHJldHVybiBwdGhyZWFkX2dldHNwZWNpZmljKF9fa2V5KTsKK30KKworaW50IF9fbGliY3BwX3Rsc19zZXQoX19saWJjcHBfdGxzX2tleSBfX2tleSwgdm9pZCAqX19wKQoreworICAgIHJldHVybiBwdGhyZWFkX3NldHNwZWNpZmljKF9fa2V5LCBfX3ApOworfQorCisjZW5kaWYgLy8gIV9MSUJDUFBfSEFTX1RIUkVBRF9MSUJSQVJZX0VYVEVSTkFMIHx8IF9MSUJDUFBfQlVJTERJTkdfVEhSRUFEX0xJQlJBUllfRVhURVJOQUwKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCitfTElCQ1BQX1BPUF9NQUNST1MKKworI2VuZGlmIC8vICFfTElCQ1BQX0hBU19OT19USFJFQURTCisKKyNlbmRpZiAvLyBfTElCQ1BQX1RIUkVBRElOR19TVVBQT1JUCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX190cmVlIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fdHJlZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2NmY2I3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fdHJlZQpAQCAtMCwwICsxLDI2OTIgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfX19UUkVFCisjZGVmaW5lIF9MSUJDUFBfX19UUkVFCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfUFVTSF9NQUNST1MKKyNpbmNsdWRlIDxfX3VuZGVmX21hY3Jvcz4KKworCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+IGNsYXNzIF9fdHJlZTsKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Ob2RlUHRyLCBjbGFzcyBfRGlmZlR5cGU+CisgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX190cmVlX2l0ZXJhdG9yOwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnN0Tm9kZVB0ciwgY2xhc3MgX0RpZmZUeXBlPgorICAgIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9fdHJlZV9jb25zdF9pdGVyYXRvcjsKKwordGVtcGxhdGUgPGNsYXNzIF9Qb2ludGVyPiBjbGFzcyBfX3RyZWVfZW5kX25vZGU7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1ZvaWRQdHI+IGNsYXNzIF9fdHJlZV9ub2RlX2Jhc2U7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVm9pZFB0cj4gY2xhc3MgX190cmVlX25vZGU7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlPgordW5pb24gX192YWx1ZV90eXBlOworI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVmFsdWU+CitzdHJ1Y3QgX192YWx1ZV90eXBlOworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ1AsIGNsYXNzIF9Db21wYXJlLAorICAgIGJvb2wgPSBpc19lbXB0eTxfQ29tcGFyZT46OnZhbHVlICYmICFfX2xpYmNwcF9pc19maW5hbDxfQ29tcGFyZT46OnZhbHVlPgorY2xhc3MgX19tYXBfdmFsdWVfY29tcGFyZTsKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+IGNsYXNzIF9fbWFwX25vZGVfZGVzdHJ1Y3RvcjsKK3RlbXBsYXRlIDxjbGFzcyBfVHJlZUl0ZXJhdG9yPiBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX21hcF9pdGVyYXRvcjsKK3RlbXBsYXRlIDxjbGFzcyBfVHJlZUl0ZXJhdG9yPiBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX21hcF9jb25zdF9pdGVyYXRvcjsKKworLyoKKworX05vZGVQdHIgYWxnb3JpdGhtcworCitUaGUgYWxnb3JpdGhtcyB0YWtpbmcgX05vZGVQdHIgYXJlIHJlZCBibGFjayB0cmVlIGFsZ29yaXRobXMuICBUaG9zZQorYWxnb3JpdGhtcyB0YWtpbmcgYSBwYXJhbWV0ZXIgbmFtZWQgX19yb290IHNob3VsZCBhc3N1bWUgdGhhdCBfX3Jvb3QKK3BvaW50cyB0byBhIHByb3BlciByZWQgYmxhY2sgdHJlZSAodW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQpLgorCitFYWNoIGFsZ29yaXRobSBoZXJlaW4gYXNzdW1lcyB0aGF0IF9fcm9vdC0+X19wYXJlbnRfIHBvaW50cyB0byBhIG5vbi1udWxsCitzdHJ1Y3R1cmUgd2hpY2ggaGFzIGEgbWVtYmVyIF9fbGVmdF8gd2hpY2ggcG9pbnRzIGJhY2sgdG8gX19yb290LiAgTm8gb3RoZXIKK21lbWJlciBpcyByZWFkIG9yIHdyaXR0ZW4gdG8gYXQgX19yb290LT5fX3BhcmVudF8uCisKK19fcm9vdC0+X19wYXJlbnRfIHdpbGwgYmUgcmVmZXJyZWQgdG8gYmVsb3cgKGluIGNvbW1lbnRzIG9ubHkpIGFzIGVuZF9ub2RlLgorZW5kX25vZGUtPl9fbGVmdF8gaXMgYW4gZXh0ZXJuYWJseSBhY2Nlc3NpYmxlIGx2YWx1ZSBmb3IgX19yb290LCBhbmQgY2FuIGJlCitjaGFuZ2VkIGJ5IG5vZGUgaW5zZXJ0aW9uIGFuZCByZW1vdmFsICh3aXRob3V0IGV4cGxpY2l0IHJlZmVyZW5jZSB0byBlbmRfbm9kZSkuCisKK0FsbCBub2RlcyAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIGVuZF9ub2RlKSwgZXZlbiB0aGUgbm9kZSByZWZlcnJlZCB0byBhcworX19yb290LCBoYXZlIGEgbm9uLW51bGwgX19wYXJlbnRfIGZpZWxkLgorCisqLworCisvLyBSZXR1cm5zOiAgdHJ1ZSBpZiBfX3ggaXMgYSBsZWZ0IGNoaWxkIG9mIGl0cyBwYXJlbnQsIGVsc2UgZmFsc2UKKy8vIFByZWNvbmRpdGlvbjogIF9feCAhPSBudWxscHRyLgordGVtcGxhdGUgPGNsYXNzIF9Ob2RlUHRyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK19fdHJlZV9pc19sZWZ0X2NoaWxkKF9Ob2RlUHRyIF9feCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9feCA9PSBfX3gtPl9fcGFyZW50Xy0+X19sZWZ0XzsKK30KKworLy8gRGV0ZXJtaW5lcyBpZiB0aGUgc3VidHJlZSByb290ZWQgYXQgX194IGlzIGEgcHJvcGVyIHJlZCBibGFjayBzdWJ0cmVlLiAgSWYKKy8vICAgIF9feCBpcyBhIHByb3BlciBzdWJ0cmVlLCByZXR1cm5zIHRoZSBibGFjayBoZWlnaHQgKG51bGwgY291bnRzIGFzIDEpLiAgSWYKKy8vICAgIF9feCBpcyBhbiBpbXByb3BlciBzdWJ0cmVlLCByZXR1cm5zIDAuCit0ZW1wbGF0ZSA8Y2xhc3MgX05vZGVQdHI+Cit1bnNpZ25lZAorX190cmVlX3N1Yl9pbnZhcmlhbnQoX05vZGVQdHIgX194KQoreworICAgIGlmIChfX3ggPT0gbnVsbHB0cikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgLy8gcGFyZW50IGNvbnNpc3RlbmN5IGNoZWNrZWQgYnkgY2FsbGVyCisgICAgLy8gY2hlY2sgX194LT5fX2xlZnRfIGNvbnNpc3RlbmN5CisgICAgaWYgKF9feC0+X19sZWZ0XyAhPSBudWxscHRyICYmIF9feC0+X19sZWZ0Xy0+X19wYXJlbnRfICE9IF9feCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgLy8gY2hlY2sgX194LT5fX3JpZ2h0XyBjb25zaXN0ZW5jeQorICAgIGlmIChfX3gtPl9fcmlnaHRfICE9IG51bGxwdHIgJiYgX194LT5fX3JpZ2h0Xy0+X19wYXJlbnRfICE9IF9feCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgLy8gY2hlY2sgX194LT5fX2xlZnRfICE9IF9feC0+X19yaWdodF8gdW5sZXNzIGJvdGggYXJlIG51bGxwdHIKKyAgICBpZiAoX194LT5fX2xlZnRfID09IF9feC0+X19yaWdodF8gJiYgX194LT5fX2xlZnRfICE9IG51bGxwdHIpCisgICAgICAgIHJldHVybiAwOworICAgIC8vIElmIHRoaXMgaXMgcmVkLCBuZWl0aGVyIGNoaWxkIGNhbiBiZSByZWQKKyAgICBpZiAoIV9feC0+X19pc19ibGFja18pCisgICAgeworICAgICAgICBpZiAoX194LT5fX2xlZnRfICYmICFfX3gtPl9fbGVmdF8tPl9faXNfYmxhY2tfKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChfX3gtPl9fcmlnaHRfICYmICFfX3gtPl9fcmlnaHRfLT5fX2lzX2JsYWNrXykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB1bnNpZ25lZCBfX2ggPSBfX3RyZWVfc3ViX2ludmFyaWFudChfX3gtPl9fbGVmdF8pOworICAgIGlmIChfX2ggPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7ICAvLyBpbnZhbGlkIGxlZnQgc3VidHJlZQorICAgIGlmIChfX2ggIT0gX190cmVlX3N1Yl9pbnZhcmlhbnQoX194LT5fX3JpZ2h0XykpCisgICAgICAgIHJldHVybiAwOyAgLy8gaW52YWxpZCBvciBkaWZmZXJlbnQgaGVpZ2h0IHJpZ2h0IHN1YnRyZWUKKyAgICByZXR1cm4gX19oICsgX194LT5fX2lzX2JsYWNrXzsgIC8vIHJldHVybiBibGFjayBoZWlnaHQgb2YgdGhpcyBub2RlCit9CisKKy8vIERldGVybWluZXMgaWYgdGhlIHJlZCBibGFjayB0cmVlIHJvb3RlZCBhdCBfX3Jvb3QgaXMgYSBwcm9wZXIgcmVkIGJsYWNrIHRyZWUuCisvLyAgICBfX3Jvb3QgPT0gbnVsbHB0ciBpcyBhIHByb3BlciB0cmVlLiAgUmV0dXJucyB0cnVlIGlzIF9fcm9vdCBpcyBhIHByb3BlcgorLy8gICAgcmVkIGJsYWNrIHRyZWUsIGVsc2UgcmV0dXJucyBmYWxzZS4KK3RlbXBsYXRlIDxjbGFzcyBfTm9kZVB0cj4KK2Jvb2wKK19fdHJlZV9pbnZhcmlhbnQoX05vZGVQdHIgX19yb290KQoreworICAgIGlmIChfX3Jvb3QgPT0gbnVsbHB0cikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gY2hlY2sgX194LT5fX3BhcmVudF8gY29uc2lzdGVuY3kKKyAgICBpZiAoX19yb290LT5fX3BhcmVudF8gPT0gbnVsbHB0cikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghX190cmVlX2lzX2xlZnRfY2hpbGQoX19yb290KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIHJvb3QgbXVzdCBiZSBibGFjaworICAgIGlmICghX19yb290LT5fX2lzX2JsYWNrXykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIGRvIG5vcm1hbCBub2RlIGNoZWNrcworICAgIHJldHVybiBfX3RyZWVfc3ViX2ludmFyaWFudChfX3Jvb3QpICE9IDA7Cit9CisKKy8vIFJldHVybnM6ICBwb2ludGVyIHRvIHRoZSBsZWZ0LW1vc3Qgbm9kZSB1bmRlciBfX3guCisvLyBQcmVjb25kaXRpb246ICBfX3ggIT0gbnVsbHB0ci4KK3RlbXBsYXRlIDxjbGFzcyBfTm9kZVB0cj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTm9kZVB0cgorX190cmVlX21pbihfTm9kZVB0ciBfX3gpIF9OT0VYQ0VQVAoreworICAgIHdoaWxlIChfX3gtPl9fbGVmdF8gIT0gbnVsbHB0cikKKyAgICAgICAgX194ID0gX194LT5fX2xlZnRfOworICAgIHJldHVybiBfX3g7Cit9CisKKy8vIFJldHVybnM6ICBwb2ludGVyIHRvIHRoZSByaWdodC1tb3N0IG5vZGUgdW5kZXIgX194LgorLy8gUHJlY29uZGl0aW9uOiAgX194ICE9IG51bGxwdHIuCit0ZW1wbGF0ZSA8Y2xhc3MgX05vZGVQdHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX05vZGVQdHIKK19fdHJlZV9tYXgoX05vZGVQdHIgX194KSBfTk9FWENFUFQKK3sKKyAgICB3aGlsZSAoX194LT5fX3JpZ2h0XyAhPSBudWxscHRyKQorICAgICAgICBfX3ggPSBfX3gtPl9fcmlnaHRfOworICAgIHJldHVybiBfX3g7Cit9CisKKy8vIFJldHVybnM6ICBwb2ludGVyIHRvIHRoZSBuZXh0IGluLW9yZGVyIG5vZGUgYWZ0ZXIgX194LgorLy8gUHJlY29uZGl0aW9uOiAgX194ICE9IG51bGxwdHIuCit0ZW1wbGF0ZSA8Y2xhc3MgX05vZGVQdHI+CitfTm9kZVB0cgorX190cmVlX25leHQoX05vZGVQdHIgX194KSBfTk9FWENFUFQKK3sKKyAgICBpZiAoX194LT5fX3JpZ2h0XyAhPSBudWxscHRyKQorICAgICAgICByZXR1cm4gX190cmVlX21pbihfX3gtPl9fcmlnaHRfKTsKKyAgICB3aGlsZSAoIV9fdHJlZV9pc19sZWZ0X2NoaWxkKF9feCkpCisgICAgICAgIF9feCA9IF9feC0+X19wYXJlbnRfdW5zYWZlKCk7CisgICAgcmV0dXJuIF9feC0+X19wYXJlbnRfdW5zYWZlKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRW5kTm9kZVB0ciwgY2xhc3MgX05vZGVQdHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0VuZE5vZGVQdHIKK19fdHJlZV9uZXh0X2l0ZXIoX05vZGVQdHIgX194KSBfTk9FWENFUFQKK3sKKyAgICBpZiAoX194LT5fX3JpZ2h0XyAhPSBudWxscHRyKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X0VuZE5vZGVQdHI+KF9fdHJlZV9taW4oX194LT5fX3JpZ2h0XykpOworICAgIHdoaWxlICghX190cmVlX2lzX2xlZnRfY2hpbGQoX194KSkKKyAgICAgICAgX194ID0gX194LT5fX3BhcmVudF91bnNhZmUoKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X0VuZE5vZGVQdHI+KF9feC0+X19wYXJlbnRfKTsKK30KKworLy8gUmV0dXJuczogIHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzIGluLW9yZGVyIG5vZGUgYmVmb3JlIF9feC4KKy8vIFByZWNvbmRpdGlvbjogIF9feCAhPSBudWxscHRyLgorLy8gTm90ZTogX194IG1heSBiZSB0aGUgZW5kIG5vZGUuCit0ZW1wbGF0ZSA8Y2xhc3MgX05vZGVQdHIsIGNsYXNzIF9FbmROb2RlUHRyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19Ob2RlUHRyCitfX3RyZWVfcHJldl9pdGVyKF9FbmROb2RlUHRyIF9feCkgX05PRVhDRVBUCit7CisgICAgaWYgKF9feC0+X19sZWZ0XyAhPSBudWxscHRyKQorICAgICAgICByZXR1cm4gX190cmVlX21heChfX3gtPl9fbGVmdF8pOworICAgIF9Ob2RlUHRyIF9feHggPSBzdGF0aWNfY2FzdDxfTm9kZVB0cj4oX194KTsKKyAgICB3aGlsZSAoX190cmVlX2lzX2xlZnRfY2hpbGQoX194eCkpCisgICAgICAgIF9feHggPSBfX3h4LT5fX3BhcmVudF91bnNhZmUoKTsKKyAgICByZXR1cm4gX194eC0+X19wYXJlbnRfdW5zYWZlKCk7Cit9CisKKy8vIFJldHVybnM6ICBwb2ludGVyIHRvIGEgbm9kZSB3aGljaCBoYXMgbm8gY2hpbGRyZW4KKy8vIFByZWNvbmRpdGlvbjogIF9feCAhPSBudWxscHRyLgordGVtcGxhdGUgPGNsYXNzIF9Ob2RlUHRyPgorX05vZGVQdHIKK19fdHJlZV9sZWFmKF9Ob2RlUHRyIF9feCkgX05PRVhDRVBUCit7CisgICAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgICBpZiAoX194LT5fX2xlZnRfICE9IG51bGxwdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9feCA9IF9feC0+X19sZWZ0XzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChfX3gtPl9fcmlnaHRfICE9IG51bGxwdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9feCA9IF9feC0+X19yaWdodF87CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIF9feDsKK30KKworLy8gRWZmZWN0czogIE1ha2VzIF9feC0+X19yaWdodF8gdGhlIHN1YnRyZWUgcm9vdCB3aXRoIF9feCBhcyBpdHMgbGVmdCBjaGlsZAorLy8gICAgICAgICAgIHdoaWxlIHByZXNlcnZpbmcgaW4tb3JkZXIgb3JkZXIuCisvLyBQcmVjb25kaXRpb246ICBfX3gtPl9fcmlnaHRfICE9IG51bGxwdHIKK3RlbXBsYXRlIDxjbGFzcyBfTm9kZVB0cj4KK3ZvaWQKK19fdHJlZV9sZWZ0X3JvdGF0ZShfTm9kZVB0ciBfX3gpIF9OT0VYQ0VQVAoreworICAgIF9Ob2RlUHRyIF9feSA9IF9feC0+X19yaWdodF87CisgICAgX194LT5fX3JpZ2h0XyA9IF9feS0+X19sZWZ0XzsKKyAgICBpZiAoX194LT5fX3JpZ2h0XyAhPSBudWxscHRyKQorICAgICAgICBfX3gtPl9fcmlnaHRfLT5fX3NldF9wYXJlbnQoX194KTsKKyAgICBfX3ktPl9fcGFyZW50XyA9IF9feC0+X19wYXJlbnRfOworICAgIGlmIChfX3RyZWVfaXNfbGVmdF9jaGlsZChfX3gpKQorICAgICAgICBfX3gtPl9fcGFyZW50Xy0+X19sZWZ0XyA9IF9feTsKKyAgICBlbHNlCisgICAgICAgIF9feC0+X19wYXJlbnRfdW5zYWZlKCktPl9fcmlnaHRfID0gX195OworICAgIF9feS0+X19sZWZ0XyA9IF9feDsKKyAgICBfX3gtPl9fc2V0X3BhcmVudChfX3kpOworfQorCisvLyBFZmZlY3RzOiAgTWFrZXMgX194LT5fX2xlZnRfIHRoZSBzdWJ0cmVlIHJvb3Qgd2l0aCBfX3ggYXMgaXRzIHJpZ2h0IGNoaWxkCisvLyAgICAgICAgICAgd2hpbGUgcHJlc2VydmluZyBpbi1vcmRlciBvcmRlci4KKy8vIFByZWNvbmRpdGlvbjogIF9feC0+X19sZWZ0XyAhPSBudWxscHRyCit0ZW1wbGF0ZSA8Y2xhc3MgX05vZGVQdHI+Cit2b2lkCitfX3RyZWVfcmlnaHRfcm90YXRlKF9Ob2RlUHRyIF9feCkgX05PRVhDRVBUCit7CisgICAgX05vZGVQdHIgX195ID0gX194LT5fX2xlZnRfOworICAgIF9feC0+X19sZWZ0XyA9IF9feS0+X19yaWdodF87CisgICAgaWYgKF9feC0+X19sZWZ0XyAhPSBudWxscHRyKQorICAgICAgICBfX3gtPl9fbGVmdF8tPl9fc2V0X3BhcmVudChfX3gpOworICAgIF9feS0+X19wYXJlbnRfID0gX194LT5fX3BhcmVudF87CisgICAgaWYgKF9fdHJlZV9pc19sZWZ0X2NoaWxkKF9feCkpCisgICAgICAgIF9feC0+X19wYXJlbnRfLT5fX2xlZnRfID0gX195OworICAgIGVsc2UKKyAgICAgICAgX194LT5fX3BhcmVudF91bnNhZmUoKS0+X19yaWdodF8gPSBfX3k7CisgICAgX195LT5fX3JpZ2h0XyA9IF9feDsKKyAgICBfX3gtPl9fc2V0X3BhcmVudChfX3kpOworfQorCisvLyBFZmZlY3RzOiAgUmViYWxhbmNlcyBfX3Jvb3QgYWZ0ZXIgYXR0YWNoaW5nIF9feCB0byBhIGxlYWYuCisvLyBQcmVjb25kaXRpb246ICBfX3Jvb3QgIT0gbnVscHRyICYmIF9feCAhPSBudWxscHRyLgorLy8gICAgICAgICAgICAgICAgX194IGhhcyBubyBjaGlsZHJlbi4KKy8vICAgICAgICAgICAgICAgIF9feCA9PSBfX3Jvb3Qgb3IgPT0gYSBkaXJlY3Qgb3IgaW5kaXJlY3QgY2hpbGQgb2YgX19yb290LgorLy8gICAgICAgICAgICAgICAgSWYgX194IHdlcmUgdG8gYmUgdW5saW5rZWQgZnJvbSBfX3Jvb3QgKHNldHRpbmcgX19yb290IHRvCisvLyAgICAgICAgICAgICAgICAgIG51bGxwdHIgaWYgX19yb290ID09IF9feCksIF9fdHJlZV9pbnZhcmlhbnQoX19yb290KSA9PSB0cnVlLgorLy8gUG9zdGNvbmRpdGlvbjogX190cmVlX2ludmFyaWFudChlbmRfbm9kZS0+X19sZWZ0XykgPT0gdHJ1ZS4gIGVuZF9ub2RlLT5fX2xlZnRfCisvLyAgICAgICAgICAgICAgICBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIHZhbHVlIHBhc3NlZCBpbiBhcyBfX3Jvb3QuCit0ZW1wbGF0ZSA8Y2xhc3MgX05vZGVQdHI+Cit2b2lkCitfX3RyZWVfYmFsYW5jZV9hZnRlcl9pbnNlcnQoX05vZGVQdHIgX19yb290LCBfTm9kZVB0ciBfX3gpIF9OT0VYQ0VQVAoreworICAgIF9feC0+X19pc19ibGFja18gPSBfX3ggPT0gX19yb290OworICAgIHdoaWxlIChfX3ggIT0gX19yb290ICYmICFfX3gtPl9fcGFyZW50X3Vuc2FmZSgpLT5fX2lzX2JsYWNrXykKKyAgICB7CisgICAgICAgIC8vIF9feC0+X19wYXJlbnRfICE9IF9fcm9vdCBiZWNhdXNlIF9feC0+X19wYXJlbnRfLT5fX2lzX2JsYWNrID09IGZhbHNlCisgICAgICAgIGlmIChfX3RyZWVfaXNfbGVmdF9jaGlsZChfX3gtPl9fcGFyZW50X3Vuc2FmZSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgX05vZGVQdHIgX195ID0gX194LT5fX3BhcmVudF91bnNhZmUoKS0+X19wYXJlbnRfdW5zYWZlKCktPl9fcmlnaHRfOworICAgICAgICAgICAgaWYgKF9feSAhPSBudWxscHRyICYmICFfX3ktPl9faXNfYmxhY2tfKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9feCA9IF9feC0+X19wYXJlbnRfdW5zYWZlKCk7CisgICAgICAgICAgICAgICAgX194LT5fX2lzX2JsYWNrXyA9IHRydWU7CisgICAgICAgICAgICAgICAgX194ID0gX194LT5fX3BhcmVudF91bnNhZmUoKTsKKyAgICAgICAgICAgICAgICBfX3gtPl9faXNfYmxhY2tfID0gX194ID09IF9fcm9vdDsKKyAgICAgICAgICAgICAgICBfX3ktPl9faXNfYmxhY2tfID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIV9fdHJlZV9pc19sZWZ0X2NoaWxkKF9feCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX3ggPSBfX3gtPl9fcGFyZW50X3Vuc2FmZSgpOworICAgICAgICAgICAgICAgICAgICBfX3RyZWVfbGVmdF9yb3RhdGUoX194KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX194ID0gX194LT5fX3BhcmVudF91bnNhZmUoKTsKKyAgICAgICAgICAgICAgICBfX3gtPl9faXNfYmxhY2tfID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBfX3ggPSBfX3gtPl9fcGFyZW50X3Vuc2FmZSgpOworICAgICAgICAgICAgICAgIF9feC0+X19pc19ibGFja18gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBfX3RyZWVfcmlnaHRfcm90YXRlKF9feCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfTm9kZVB0ciBfX3kgPSBfX3gtPl9fcGFyZW50X3Vuc2FmZSgpLT5fX3BhcmVudF8tPl9fbGVmdF87CisgICAgICAgICAgICBpZiAoX195ICE9IG51bGxwdHIgJiYgIV9feS0+X19pc19ibGFja18pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX194ID0gX194LT5fX3BhcmVudF91bnNhZmUoKTsKKyAgICAgICAgICAgICAgICBfX3gtPl9faXNfYmxhY2tfID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBfX3ggPSBfX3gtPl9fcGFyZW50X3Vuc2FmZSgpOworICAgICAgICAgICAgICAgIF9feC0+X19pc19ibGFja18gPSBfX3ggPT0gX19yb290OworICAgICAgICAgICAgICAgIF9feS0+X19pc19ibGFja18gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfX3RyZWVfaXNfbGVmdF9jaGlsZChfX3gpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX194ID0gX194LT5fX3BhcmVudF91bnNhZmUoKTsKKyAgICAgICAgICAgICAgICAgICAgX190cmVlX3JpZ2h0X3JvdGF0ZShfX3gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX3ggPSBfX3gtPl9fcGFyZW50X3Vuc2FmZSgpOworICAgICAgICAgICAgICAgIF9feC0+X19pc19ibGFja18gPSB0cnVlOworICAgICAgICAgICAgICAgIF9feCA9IF9feC0+X19wYXJlbnRfdW5zYWZlKCk7CisgICAgICAgICAgICAgICAgX194LT5fX2lzX2JsYWNrXyA9IGZhbHNlOworICAgICAgICAgICAgICAgIF9fdHJlZV9sZWZ0X3JvdGF0ZShfX3gpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLyBQcmVjb25kaXRpb246ICBfX3Jvb3QgIT0gbnVsbHB0ciAmJiBfX3ogIT0gbnVsbHB0ci4KKy8vICAgICAgICAgICAgICAgIF9fdHJlZV9pbnZhcmlhbnQoX19yb290KSA9PSB0cnVlLgorLy8gICAgICAgICAgICAgICAgX196ID09IF9fcm9vdCBvciA9PSBhIGRpcmVjdCBvciBpbmRpcmVjdCBjaGlsZCBvZiBfX3Jvb3QuCisvLyBFZmZlY3RzOiAgdW5saW5rcyBfX3ogZnJvbSB0aGUgdHJlZSByb290ZWQgYXQgX19yb290LCByZWJhbGFuY2luZyBhcyBuZWVkZWQuCisvLyBQb3N0Y29uZGl0aW9uOiBfX3RyZWVfaW52YXJpYW50KGVuZF9ub2RlLT5fX2xlZnRfKSA9PSB0cnVlICYmIGVuZF9ub2RlLT5fX2xlZnRfCisvLyAgICAgICAgICAgICAgICBub3IgYW55IG9mIGl0cyBjaGlsZHJlbiByZWZlciB0byBfX3ouICBlbmRfbm9kZS0+X19sZWZ0XworLy8gICAgICAgICAgICAgICAgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSB2YWx1ZSBwYXNzZWQgaW4gYXMgX19yb290LgordGVtcGxhdGUgPGNsYXNzIF9Ob2RlUHRyPgordm9pZAorX190cmVlX3JlbW92ZShfTm9kZVB0ciBfX3Jvb3QsIF9Ob2RlUHRyIF9feikgX05PRVhDRVBUCit7CisgICAgLy8gX196IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlLiAgQ2xpZW50IHN0aWxsIG5lZWRzIHRvIGRlc3RydWN0L2RlYWxsb2NhdGUgaXQKKyAgICAvLyBfX3kgaXMgZWl0aGVyIF9feiwgb3IgaWYgX196IGhhcyB0d28gY2hpbGRyZW4sIF9fdHJlZV9uZXh0KF9feikuCisgICAgLy8gX195IHdpbGwgaGF2ZSBhdCBtb3N0IG9uZSBjaGlsZC4KKyAgICAvLyBfX3kgd2lsbCBiZSB0aGUgaW5pdGlhbCBob2xlIGluIHRoZSB0cmVlIChtYWtlIHRoZSBob2xlIGF0IGEgbGVhZikKKyAgICBfTm9kZVB0ciBfX3kgPSAoX196LT5fX2xlZnRfID09IG51bGxwdHIgfHwgX196LT5fX3JpZ2h0XyA9PSBudWxscHRyKSA/CisgICAgICAgICAgICAgICAgICAgIF9feiA6IF9fdHJlZV9uZXh0KF9feik7CisgICAgLy8gX194IGlzIF9feSdzIHBvc3NpYmx5IG51bGwgc2luZ2xlIGNoaWxkCisgICAgX05vZGVQdHIgX194ID0gX195LT5fX2xlZnRfICE9IG51bGxwdHIgPyBfX3ktPl9fbGVmdF8gOiBfX3ktPl9fcmlnaHRfOworICAgIC8vIF9fdyBpcyBfX3gncyBwb3NzaWJseSBudWxsIHVuY2xlICh3aWxsIGJlY29tZSBfX3gncyBzaWJsaW5nKQorICAgIF9Ob2RlUHRyIF9fdyA9IG51bGxwdHI7CisgICAgLy8gbGluayBfX3ggdG8gX195J3MgcGFyZW50LCBhbmQgZmluZCBfX3cKKyAgICBpZiAoX194ICE9IG51bGxwdHIpCisgICAgICAgIF9feC0+X19wYXJlbnRfID0gX195LT5fX3BhcmVudF87CisgICAgaWYgKF9fdHJlZV9pc19sZWZ0X2NoaWxkKF9feSkpCisgICAgeworICAgICAgICBfX3ktPl9fcGFyZW50Xy0+X19sZWZ0XyA9IF9feDsKKyAgICAgICAgaWYgKF9feSAhPSBfX3Jvb3QpCisgICAgICAgICAgICBfX3cgPSBfX3ktPl9fcGFyZW50X3Vuc2FmZSgpLT5fX3JpZ2h0XzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX19yb290ID0gX194OyAgLy8gX193ID09IG51bGxwdHIKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX195LT5fX3BhcmVudF91bnNhZmUoKS0+X19yaWdodF8gPSBfX3g7CisgICAgICAgIC8vIF9feSBjYW4ndCBiZSByb290IGlmIGl0IGlzIGEgcmlnaHQgY2hpbGQKKyAgICAgICAgX193ID0gX195LT5fX3BhcmVudF8tPl9fbGVmdF87CisgICAgfQorICAgIGJvb2wgX19yZW1vdmVkX2JsYWNrID0gX195LT5fX2lzX2JsYWNrXzsKKyAgICAvLyBJZiB3ZSBkaWRuJ3QgcmVtb3ZlIF9feiwgZG8gc28gbm93IGJ5IHNwbGljaW5nIGluIF9feSBmb3IgX196LAorICAgIC8vICAgIGJ1dCBjb3B5IF9feidzIGNvbG9yLiAgVGhpcyBkb2VzIG5vdCBpbXBhY3QgX194IG9yIF9fdy4KKyAgICBpZiAoX195ICE9IF9feikKKyAgICB7CisgICAgICAgIC8vIF9fei0+X19sZWZ0XyAhPSBudWxwdHIgYnV0IF9fei0+X19yaWdodF8gbWlnaHQgPT0gX194ID09IG51bGxwdHIKKyAgICAgICAgX195LT5fX3BhcmVudF8gPSBfX3otPl9fcGFyZW50XzsKKyAgICAgICAgaWYgKF9fdHJlZV9pc19sZWZ0X2NoaWxkKF9feikpCisgICAgICAgICAgICBfX3ktPl9fcGFyZW50Xy0+X19sZWZ0XyA9IF9feTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX195LT5fX3BhcmVudF91bnNhZmUoKS0+X19yaWdodF8gPSBfX3k7CisgICAgICAgIF9feS0+X19sZWZ0XyA9IF9fei0+X19sZWZ0XzsKKyAgICAgICAgX195LT5fX2xlZnRfLT5fX3NldF9wYXJlbnQoX195KTsKKyAgICAgICAgX195LT5fX3JpZ2h0XyA9IF9fei0+X19yaWdodF87CisgICAgICAgIGlmIChfX3ktPl9fcmlnaHRfICE9IG51bGxwdHIpCisgICAgICAgICAgICBfX3ktPl9fcmlnaHRfLT5fX3NldF9wYXJlbnQoX195KTsKKyAgICAgICAgX195LT5fX2lzX2JsYWNrXyA9IF9fei0+X19pc19ibGFja187CisgICAgICAgIGlmIChfX3Jvb3QgPT0gX196KQorICAgICAgICAgICAgX19yb290ID0gX195OworICAgIH0KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJlYmFsYW5jZSBpZiB3ZSByZW1vdmVkIGEgcmVkLCBvciBpZiB3ZSByZW1vdmVkCisgICAgLy8gICAgIHRoZSBsYXN0IG5vZGUuCisgICAgaWYgKF9fcmVtb3ZlZF9ibGFjayAmJiBfX3Jvb3QgIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIC8vIFJlYmFsYW5jZToKKyAgICAgICAgLy8gX194IGhhcyBhbiBpbXBsaWNpdCBibGFjayBjb2xvciAodHJhbnNmZXJyZWQgZnJvbSB0aGUgcmVtb3ZlZCBfX3kpCisgICAgICAgIC8vICAgIGFzc29jaWF0ZWQgd2l0aCBpdCwgbm8gbWF0dGVyIHdoYXQgaXRzIGNvbG9yIGlzLgorICAgICAgICAvLyBJZiBfX3ggaXMgX19yb290IChpbiB3aGljaCBjYXNlIGl0IGNhbid0IGJlIG51bGwpLCBpdCBpcyBzdXBwb3NlZAorICAgICAgICAvLyAgICB0byBiZSBibGFjayBhbnl3YXksIGFuZCBpZiBpdCBpcyBkb3VibHkgYmxhY2ssIHRoZW4gdGhlIGRvdWJsZQorICAgICAgICAvLyAgICBjYW4ganVzdCBiZSBpZ25vcmVkLgorICAgICAgICAvLyBJZiBfX3ggaXMgcmVkIChpbiB3aGljaCBjYXNlIGl0IGNhbid0IGJlIG51bGwpLCB0aGVuIGl0IGNhbiBhYnNvcmIKKyAgICAgICAgLy8gICAgdGhlIGltcGxpY2l0IGJsYWNrIGp1c3QgYnkgc2V0dGluZyBpdHMgY29sb3IgdG8gYmxhY2suCisgICAgICAgIC8vIFNpbmNlIF9feSB3YXMgYmxhY2sgYW5kIG9ubHkgaGFkIG9uZSBjaGlsZCAod2hpY2ggX194IHBvaW50cyB0byksIF9feAorICAgICAgICAvLyAgIGlzIGVpdGhlciByZWQgd2l0aCBubyBjaGlsZHJlbiwgZWxzZSBudWxsLCBvdGhlcndpc2UgX195IHdvdWxkIGhhdmUKKyAgICAgICAgLy8gICBkaWZmZXJlbnQgYmxhY2sgaGVpZ2h0cyB1bmRlciBsZWZ0IGFuZCByaWdodCBwb2ludGVycy4KKyAgICAgICAgLy8gaWYgKF9feCA9PSBfX3Jvb3QgfHwgX194ICE9IG51bGxwdHIgJiYgIV9feC0+X19pc19ibGFja18pCisgICAgICAgIGlmIChfX3ggIT0gbnVsbHB0cikKKyAgICAgICAgICAgIF9feC0+X19pc19ibGFja18gPSB0cnVlOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICBFbHNlIF9feCBpc24ndCByb290LCBhbmQgaXMgImRvdWJseSBibGFjayIsIGV2ZW4gdGhvdWdoIGl0IG1heQorICAgICAgICAgICAgLy8gICAgIGJlIG51bGwuICBfX3cgY2FuIG5vdCBiZSBudWxsIGhlcmUsIGVsc2UgdGhlIHBhcmVudCB3b3VsZAorICAgICAgICAgICAgLy8gICAgIHNlZSBhIGJsYWNrIGhlaWdodCA+PSAyIG9uIHRoZSBfX3ggc2lkZSBhbmQgYSBibGFjayBoZWlnaHQKKyAgICAgICAgICAgIC8vICAgICBvZiAxIG9uIHRoZSBfX3cgc2lkZSAoX193IG11c3QgYmUgYSBub24tbnVsbCBibGFjayBvciBhIHJlZAorICAgICAgICAgICAgLy8gICAgIHdpdGggYSBub24tbnVsbCBibGFjayBjaGlsZCkuCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIV9fdHJlZV9pc19sZWZ0X2NoaWxkKF9fdykpICAvLyBpZiB4IGlzIGxlZnQgY2hpbGQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghX193LT5fX2lzX2JsYWNrXykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX193LT5fX2lzX2JsYWNrXyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBfX3ctPl9fcGFyZW50X3Vuc2FmZSgpLT5fX2lzX2JsYWNrXyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgX190cmVlX2xlZnRfcm90YXRlKF9fdy0+X19wYXJlbnRfdW5zYWZlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gX194IGlzIHN0aWxsIHZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBfX3Jvb3Qgb25seSBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX3Jvb3QgPT0gX193LT5fX2xlZnRfKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcm9vdCA9IF9fdzsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHNpYmxpbmcsIGFuZCBpdCBzdGlsbCBjYW4ndCBiZSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICBfX3cgPSBfX3ctPl9fbGVmdF8tPl9fcmlnaHRfOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIF9fdy0+X19pc19ibGFja18gaXMgbm93IHRydWUsIF9fdyBtYXkgaGF2ZSBudWxsIGNoaWxkcmVuCisgICAgICAgICAgICAgICAgICAgIGlmICgoX193LT5fX2xlZnRfICA9PSBudWxscHRyIHx8IF9fdy0+X19sZWZ0Xy0+X19pc19ibGFja18pICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoX193LT5fX3JpZ2h0XyA9PSBudWxscHRyIHx8IF9fdy0+X19yaWdodF8tPl9faXNfYmxhY2tfKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX193LT5fX2lzX2JsYWNrXyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgX194ID0gX193LT5fX3BhcmVudF91bnNhZmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIF9feCBjYW4gbm8gbG9uZ2VyIGJlIG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX3ggPT0gX19yb290IHx8ICFfX3gtPl9faXNfYmxhY2tfKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9feC0+X19pc19ibGFja18gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgc2libGluZywgYW5kIGl0IHN0aWxsIGNhbid0IGJlIG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fdyA9IF9fdHJlZV9pc19sZWZ0X2NoaWxkKF9feCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX194LT5fX3BhcmVudF91bnNhZmUoKS0+X19yaWdodF8gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX194LT5fX3BhcmVudF8tPl9fbGVmdF87CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlICAvLyBfX3cgaGFzIGEgcmVkIGNoaWxkCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX3ctPl9fcmlnaHRfID09IG51bGxwdHIgfHwgX193LT5fX3JpZ2h0Xy0+X19pc19ibGFja18pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gX193IGxlZnQgY2hpbGQgaXMgbm9uLW51bGwgYW5kIHJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdy0+X19sZWZ0Xy0+X19pc19ibGFja18gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdy0+X19pc19ibGFja18gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RyZWVfcmlnaHRfcm90YXRlKF9fdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gX193IGlzIGtub3duIG5vdCB0byBiZSByb290LCBzbyByb290IGhhc24ndCBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgc2libGluZywgYW5kIGl0IHN0aWxsIGNhbid0IGJlIG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3cgPSBfX3ctPl9fcGFyZW50X3Vuc2FmZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gX193IGhhcyBhIHJpZ2h0IHJlZCBjaGlsZCwgbGVmdCBjaGlsZCBtYXkgYmUgbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgX193LT5fX2lzX2JsYWNrXyA9IF9fdy0+X19wYXJlbnRfdW5zYWZlKCktPl9faXNfYmxhY2tfOworICAgICAgICAgICAgICAgICAgICAgICAgX193LT5fX3BhcmVudF91bnNhZmUoKS0+X19pc19ibGFja18gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgX193LT5fX3JpZ2h0Xy0+X19pc19ibGFja18gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgX190cmVlX2xlZnRfcm90YXRlKF9fdy0+X19wYXJlbnRfdW5zYWZlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfX3ctPl9faXNfYmxhY2tfKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX3ctPl9faXNfYmxhY2tfID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fdy0+X19wYXJlbnRfdW5zYWZlKCktPl9faXNfYmxhY2tfID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBfX3RyZWVfcmlnaHRfcm90YXRlKF9fdy0+X19wYXJlbnRfdW5zYWZlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gX194IGlzIHN0aWxsIHZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBfX3Jvb3Qgb25seSBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX3Jvb3QgPT0gX193LT5fX3JpZ2h0XykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Jvb3QgPSBfX3c7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBzaWJsaW5nLCBhbmQgaXQgc3RpbGwgY2FuJ3QgYmUgbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgX193ID0gX193LT5fX3JpZ2h0Xy0+X19sZWZ0XzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBfX3ctPl9faXNfYmxhY2tfIGlzIG5vdyB0cnVlLCBfX3cgbWF5IGhhdmUgbnVsbCBjaGlsZHJlbgorICAgICAgICAgICAgICAgICAgICBpZiAoKF9fdy0+X19sZWZ0XyAgPT0gbnVsbHB0ciB8fCBfX3ctPl9fbGVmdF8tPl9faXNfYmxhY2tfKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKF9fdy0+X19yaWdodF8gPT0gbnVsbHB0ciB8fCBfX3ctPl9fcmlnaHRfLT5fX2lzX2JsYWNrXykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fdy0+X19pc19ibGFja18gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9feCA9IF9fdy0+X19wYXJlbnRfdW5zYWZlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBfX3ggY2FuIG5vIGxvbmdlciBiZSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9feC0+X19pc19ibGFja18gfHwgX194ID09IF9fcm9vdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3gtPl9faXNfYmxhY2tfID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHNpYmxpbmcsIGFuZCBpdCBzdGlsbCBjYW4ndCBiZSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICBfX3cgPSBfX3RyZWVfaXNfbGVmdF9jaGlsZChfX3gpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9feC0+X19wYXJlbnRfdW5zYWZlKCktPl9fcmlnaHRfIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9feC0+X19wYXJlbnRfLT5fX2xlZnRfOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAgLy8gX193IGhhcyBhIHJlZCBjaGlsZAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX193LT5fX2xlZnRfID09IG51bGxwdHIgfHwgX193LT5fX2xlZnRfLT5fX2lzX2JsYWNrXykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBfX3cgcmlnaHQgY2hpbGQgaXMgbm9uLW51bGwgYW5kIHJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdy0+X19yaWdodF8tPl9faXNfYmxhY2tfID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3ctPl9faXNfYmxhY2tfID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190cmVlX2xlZnRfcm90YXRlKF9fdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gX193IGlzIGtub3duIG5vdCB0byBiZSByb290LCBzbyByb290IGhhc24ndCBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgc2libGluZywgYW5kIGl0IHN0aWxsIGNhbid0IGJlIG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3cgPSBfX3ctPl9fcGFyZW50X3Vuc2FmZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gX193IGhhcyBhIGxlZnQgcmVkIGNoaWxkLCByaWdodCBjaGlsZCBtYXkgYmUgbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgX193LT5fX2lzX2JsYWNrXyA9IF9fdy0+X19wYXJlbnRfdW5zYWZlKCktPl9faXNfYmxhY2tfOworICAgICAgICAgICAgICAgICAgICAgICAgX193LT5fX3BhcmVudF91bnNhZmUoKS0+X19pc19ibGFja18gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgX193LT5fX2xlZnRfLT5fX2lzX2JsYWNrXyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBfX3RyZWVfcmlnaHRfcm90YXRlKF9fdy0+X19wYXJlbnRfdW5zYWZlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIG5vZGUgdHJhaXRzCisKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19pc190cmVlX3ZhbHVlX3R5cGVfaW1wIDogZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZT4KK3N0cnVjdCBfX2lzX3RyZWVfdmFsdWVfdHlwZV9pbXA8X192YWx1ZV90eXBlPF9LZXksIF9WYWx1ZT4+IDogdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FyZ3M+CitzdHJ1Y3QgX19pc190cmVlX3ZhbHVlX3R5cGUgOiBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX09uZT4KK3N0cnVjdCBfX2lzX3RyZWVfdmFsdWVfdHlwZTxfT25lPiA6IF9faXNfdHJlZV92YWx1ZV90eXBlX2ltcDx0eXBlbmFtZSBfX3VuY3ZyZWY8X09uZT46OnR5cGU+IHt9OworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX190cmVlX2tleV92YWx1ZV90eXBlcyB7CisgIHR5cGVkZWYgX1RwIGtleV90eXBlOworICB0eXBlZGVmIF9UcCBfX25vZGVfdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBfVHAgX19jb250YWluZXJfdmFsdWVfdHlwZTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgX19pc19tYXAgPSBmYWxzZTsKKworICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHN0YXRpYyBrZXlfdHlwZSBjb25zdCYgX19nZXRfa2V5KF9UcCBjb25zdCYgX192KSB7CisgICAgcmV0dXJuIF9fdjsKKyAgfQorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHN0YXRpYyBfX2NvbnRhaW5lcl92YWx1ZV90eXBlIGNvbnN0JiBfX2dldF92YWx1ZShfX25vZGVfdmFsdWVfdHlwZSBjb25zdCYgX192KSB7CisgICAgcmV0dXJuIF9fdjsKKyAgfQorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHN0YXRpYyBfX2NvbnRhaW5lcl92YWx1ZV90eXBlKiBfX2dldF9wdHIoX19ub2RlX3ZhbHVlX3R5cGUmIF9fbikgeworICAgIHJldHVybiBfVlNURDo6YWRkcmVzc29mKF9fbik7CisgIH0KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgIF9fY29udGFpbmVyX3ZhbHVlX3R5cGUmJiBfX21vdmUoX19ub2RlX3ZhbHVlX3R5cGUmIF9fdikgeworICAgIHJldHVybiBfVlNURDo6bW92ZShfX3YpOworICB9CisjZW5kaWYKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHA+CitzdHJ1Y3QgX190cmVlX2tleV92YWx1ZV90eXBlczxfX3ZhbHVlX3R5cGU8X0tleSwgX1RwPiA+IHsKKyAgdHlwZWRlZiBfS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRfdHlwZTsKKyAgdHlwZWRlZiBfX3ZhbHVlX3R5cGU8X0tleSwgX1RwPiAgICAgICAgICAgICAgICAgICAgICBfX25vZGVfdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBwYWlyPGNvbnN0IF9LZXksIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICBfX2NvbnRhaW5lcl92YWx1ZV90eXBlOworICB0eXBlZGVmIHBhaXI8X0tleSwgX1RwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbmNfdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBfX2NvbnRhaW5lcl92YWx1ZV90eXBlICAgICAgICAgICAgICAgICAgICAgICBfX21hcF92YWx1ZV90eXBlOworICBzdGF0aWMgY29uc3QgYm9vbCBfX2lzX21hcCA9IHRydWU7CisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMga2V5X3R5cGUgY29uc3QmCisgIF9fZ2V0X2tleShfX25vZGVfdmFsdWVfdHlwZSBjb25zdCYgX190KSB7CisgICAgcmV0dXJuIF9fdC5fX2NjLmZpcnN0OworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfc2FtZV91bmN2cmVmPF9VcCwgX19jb250YWluZXJfdmFsdWVfdHlwZT46OnZhbHVlLAorICAgICAga2V5X3R5cGUgY29uc3QmPjo6dHlwZQorICBfX2dldF9rZXkoX1VwJiBfX3QpIHsKKyAgICByZXR1cm4gX190LmZpcnN0OworICB9CisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgX19jb250YWluZXJfdmFsdWVfdHlwZSBjb25zdCYKKyAgX19nZXRfdmFsdWUoX19ub2RlX3ZhbHVlX3R5cGUgY29uc3QmIF9fdCkgeworICAgIHJldHVybiBfX3QuX19jYzsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVXA+CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgc3RhdGljIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3NhbWVfdW5jdnJlZjxfVXAsIF9fY29udGFpbmVyX3ZhbHVlX3R5cGU+Ojp2YWx1ZSwKKyAgICAgIF9fY29udGFpbmVyX3ZhbHVlX3R5cGUgY29uc3QmPjo6dHlwZQorICBfX2dldF92YWx1ZShfVXAmIF9fdCkgeworICAgIHJldHVybiBfX3Q7CisgIH0KKworICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHN0YXRpYyBfX2NvbnRhaW5lcl92YWx1ZV90eXBlKiBfX2dldF9wdHIoX19ub2RlX3ZhbHVlX3R5cGUmIF9fbikgeworICAgIHJldHVybiBfVlNURDo6YWRkcmVzc29mKF9fbi5fX2NjKTsKKyAgfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHN0YXRpYyAgX19uY192YWx1ZV90eXBlJiYgX19tb3ZlKF9fbm9kZV92YWx1ZV90eXBlJiBfX3YpIHsKKyAgICByZXR1cm4gX1ZTVEQ6Om1vdmUoX192Ll9fbmMpOworICB9CisjZW5kaWYKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVm9pZFB0cj4KK3N0cnVjdCBfX3RyZWVfbm9kZV9iYXNlX3R5cGVzIHsKKyAgdHlwZWRlZiBfVm9pZFB0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX192b2lkX3BvaW50ZXI7CisKKyAgdHlwZWRlZiBfX3RyZWVfbm9kZV9iYXNlPF9fdm9pZF9wb2ludGVyPiAgICAgICAgICAgICAgICAgICAgICBfX25vZGVfYmFzZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3BvaW50ZXI8X1ZvaWRQdHIsIF9fbm9kZV9iYXNlX3R5cGU+Ojp0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlX2Jhc2VfcG9pbnRlcjsKKworICB0eXBlZGVmIF9fdHJlZV9lbmRfbm9kZTxfX25vZGVfYmFzZV9wb2ludGVyPiAgICAgICAgICAgICAgICAgIF9fZW5kX25vZGVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9wb2ludGVyPF9Wb2lkUHRyLCBfX2VuZF9ub2RlX3R5cGU+Ojp0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19lbmRfbm9kZV9wb2ludGVyOworI2lmIGRlZmluZWQoX0xJQkNQUF9BQklfVFJFRV9SRU1PVkVfTk9ERV9QT0lOVEVSX1VCKQorICB0eXBlZGVmIF9fZW5kX25vZGVfcG9pbnRlciBfX3BhcmVudF9wb2ludGVyOworI2Vsc2UKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDwKKyAgICAgIGlzX3BvaW50ZXI8X19lbmRfbm9kZV9wb2ludGVyPjo6dmFsdWUsCisgICAgICAgIF9fZW5kX25vZGVfcG9pbnRlciwKKyAgICAgICAgX19ub2RlX2Jhc2VfcG9pbnRlcj46OnR5cGUgX19wYXJlbnRfcG9pbnRlcjsKKyNlbmRpZgorCitwcml2YXRlOgorICBzdGF0aWNfYXNzZXJ0KChpc19zYW1lPHR5cGVuYW1lIHBvaW50ZXJfdHJhaXRzPF9Wb2lkUHRyPjo6ZWxlbWVudF90eXBlLCB2b2lkPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgIl9Wb2lkUHRyIGRvZXMgbm90IHBvaW50IHRvIHVucXVhbGlmaWVkIHZvaWQgdHlwZSIpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jUHRyLCBjbGFzcyBfS1ZUeXBlcyA9IF9fdHJlZV9rZXlfdmFsdWVfdHlwZXM8X1RwPiwKKyAgICAgICAgIGJvb2wgPSBfS1ZUeXBlczo6X19pc19tYXA+CitzdHJ1Y3QgX190cmVlX21hcF9wb2ludGVyX3R5cGVzIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NQdHIsIGNsYXNzIF9LVlR5cGVzPgorc3RydWN0IF9fdHJlZV9tYXBfcG9pbnRlcl90eXBlczxfVHAsIF9BbGxvY1B0ciwgX0tWVHlwZXMsIHRydWU+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfS1ZUeXBlczo6X19tYXBfdmFsdWVfdHlwZSAgIF9NdjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9wb2ludGVyPF9BbGxvY1B0ciwgX012Pjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWFwX3ZhbHVlX3R5cGVfcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9wb2ludGVyPF9BbGxvY1B0ciwgY29uc3QgX012Pjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29uc3RfbWFwX3ZhbHVlX3R5cGVfcG9pbnRlcjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfTm9kZVB0ciwgY2xhc3MgX05vZGVUID0gdHlwZW5hbWUgcG9pbnRlcl90cmFpdHM8X05vZGVQdHI+OjplbGVtZW50X3R5cGU+CitzdHJ1Y3QgX190cmVlX25vZGVfdHlwZXM7CisKK3RlbXBsYXRlIDxjbGFzcyBfTm9kZVB0ciwgY2xhc3MgX1RwLCBjbGFzcyBfVm9pZFB0cj4KK3N0cnVjdCBfX3RyZWVfbm9kZV90eXBlczxfTm9kZVB0ciwgX190cmVlX25vZGU8X1RwLCBfVm9pZFB0cj4gPgorICAgIDogcHVibGljIF9fdHJlZV9ub2RlX2Jhc2VfdHlwZXM8X1ZvaWRQdHI+LAorICAgICAgICAgICAgIF9fdHJlZV9rZXlfdmFsdWVfdHlwZXM8X1RwPiwKKyAgICAgICAgICAgICBfX3RyZWVfbWFwX3BvaW50ZXJfdHlwZXM8X1RwLCBfVm9pZFB0cj4KK3sKKyAgdHlwZWRlZiBfX3RyZWVfbm9kZV9iYXNlX3R5cGVzPF9Wb2lkUHRyPiBfX2Jhc2U7CisgIHR5cGVkZWYgX190cmVlX2tleV92YWx1ZV90eXBlczxfVHA+ICAgICAgX19rZXlfYmFzZTsKKyAgdHlwZWRlZiBfX3RyZWVfbWFwX3BvaW50ZXJfdHlwZXM8X1RwLCBfVm9pZFB0cj4gX19tYXBfcG9pbnRlcl9iYXNlOworcHVibGljOgorCisgIHR5cGVkZWYgdHlwZW5hbWUgcG9pbnRlcl90cmFpdHM8X05vZGVQdHI+OjplbGVtZW50X3R5cGUgICAgICAgX19ub2RlX3R5cGU7CisgIHR5cGVkZWYgX05vZGVQdHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlX3BvaW50ZXI7CisKKyAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlX3ZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfcG9pbnRlcjxfVm9pZFB0ciwgX19ub2RlX3ZhbHVlX3R5cGU+Ojp0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25vZGVfdmFsdWVfdHlwZV9wb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3BvaW50ZXI8X1ZvaWRQdHIsIGNvbnN0IF9fbm9kZV92YWx1ZV90eXBlPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb25zdF9ub2RlX3ZhbHVlX3R5cGVfcG9pbnRlcjsKKyNpZiBkZWZpbmVkKF9MSUJDUFBfQUJJX1RSRUVfUkVNT1ZFX05PREVfUE9JTlRFUl9VQikKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6Ol9fZW5kX25vZGVfcG9pbnRlciBfX2l0ZXJfcG9pbnRlcjsKKyNlbHNlCisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8CisgICAgICBpc19wb2ludGVyPF9fbm9kZV9wb2ludGVyPjo6dmFsdWUsCisgICAgICAgIHR5cGVuYW1lIF9fYmFzZTo6X19lbmRfbm9kZV9wb2ludGVyLAorICAgICAgICBfX25vZGVfcG9pbnRlcj46OnR5cGUgX19pdGVyX3BvaW50ZXI7CisjZW5kaWYKK3ByaXZhdGU6CisgICAgc3RhdGljX2Fzc2VydCghaXNfY29uc3Q8X19ub2RlX3R5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiX05vZGVQdHIgc2hvdWxkIG5ldmVyIGJlIGEgcG9pbnRlciB0byBjb25zdCIpOworICAgIHN0YXRpY19hc3NlcnQoKGlzX3NhbWU8dHlwZW5hbWUgX19yZWJpbmRfcG9pbnRlcjxfVm9pZFB0ciwgX19ub2RlX3R5cGU+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfTm9kZVB0cj46OnZhbHVlKSwgIl9Wb2lkUHRyIGRvZXMgbm90IHJlYmluZCB0byBfTm9kZVB0ci4iKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWVUcCwgY2xhc3MgX1ZvaWRQdHI+CitzdHJ1Y3QgX19tYWtlX3RyZWVfbm9kZV90eXBlcyB7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfcG9pbnRlcjxfVm9pZFB0ciwgX190cmVlX25vZGU8X1ZhbHVlVHAsIF9Wb2lkUHRyPiA+Ojp0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTm9kZVB0cjsKKyAgdHlwZWRlZiBfX3RyZWVfbm9kZV90eXBlczxfTm9kZVB0cj4gdHlwZTsKK307CisKKy8vIG5vZGUKKwordGVtcGxhdGUgPGNsYXNzIF9Qb2ludGVyPgorY2xhc3MgX190cmVlX2VuZF9ub2RlCit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfUG9pbnRlciBwb2ludGVyOworICAgIHBvaW50ZXIgX19sZWZ0XzsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3RyZWVfZW5kX25vZGUoKSBfTk9FWENFUFQgOiBfX2xlZnRfKCkge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVm9pZFB0cj4KK2NsYXNzIF9fdHJlZV9ub2RlX2Jhc2UKKyAgICA6IHB1YmxpYyBfX3RyZWVfbm9kZV9iYXNlX3R5cGVzPF9Wb2lkUHRyPjo6X19lbmRfbm9kZV90eXBlCit7CisgICAgdHlwZWRlZiBfX3RyZWVfbm9kZV9iYXNlX3R5cGVzPF9Wb2lkUHRyPiBfTm9kZUJhc2VUeXBlczsKKworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVCYXNlVHlwZXM6Ol9fbm9kZV9iYXNlX3BvaW50ZXIgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlQmFzZVR5cGVzOjpfX3BhcmVudF9wb2ludGVyIF9fcGFyZW50X3BvaW50ZXI7CisKKyAgICBwb2ludGVyICAgICAgICAgIF9fcmlnaHRfOworICAgIF9fcGFyZW50X3BvaW50ZXIgX19wYXJlbnRfOworICAgIGJvb2wgX19pc19ibGFja187CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcG9pbnRlciBfX3BhcmVudF91bnNhZmUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxwb2ludGVyPihfX3BhcmVudF8pO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fc2V0X3BhcmVudChwb2ludGVyIF9fcCkgeworICAgICAgICBfX3BhcmVudF8gPSBzdGF0aWNfY2FzdDxfX3BhcmVudF9wb2ludGVyPihfX3ApOworICAgIH0KKworcHJpdmF0ZToKKyAgfl9fdHJlZV9ub2RlX2Jhc2UoKSBfTElCQ1BQX0VRVUFMX0RFTEVURTsKKyAgX190cmVlX25vZGVfYmFzZShfX3RyZWVfbm9kZV9iYXNlIGNvbnN0JikgX0xJQkNQUF9FUVVBTF9ERUxFVEU7CisgIF9fdHJlZV9ub2RlX2Jhc2UmIG9wZXJhdG9yPShfX3RyZWVfbm9kZV9iYXNlIGNvbnN0JikgX0xJQkNQUF9FUVVBTF9ERUxFVEU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVm9pZFB0cj4KK2NsYXNzIF9fdHJlZV9ub2RlCisgICAgOiBwdWJsaWMgX190cmVlX25vZGVfYmFzZTxfVm9pZFB0cj4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9UcCBfX25vZGVfdmFsdWVfdHlwZTsKKworICAgIF9fbm9kZV92YWx1ZV90eXBlIF9fdmFsdWVfOworCitwcml2YXRlOgorICB+X190cmVlX25vZGUoKSBfTElCQ1BQX0VRVUFMX0RFTEVURTsKKyAgX190cmVlX25vZGUoX190cmVlX25vZGUgY29uc3QmKSBfTElCQ1BQX0VRVUFMX0RFTEVURTsKKyAgX190cmVlX25vZGUmIG9wZXJhdG9yPShfX3RyZWVfbm9kZSBjb25zdCYpIF9MSUJDUFBfRVFVQUxfREVMRVRFOworfTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KK2NsYXNzIF9fdHJlZV9ub2RlX2Rlc3RydWN0b3IKK3sKKyAgICB0eXBlZGVmIF9BbGxvY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT4gICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM7CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpwb2ludGVyICAgICAgICAgICAgICAgIHBvaW50ZXI7Citwcml2YXRlOgorICAgIHR5cGVkZWYgX190cmVlX25vZGVfdHlwZXM8cG9pbnRlcj4gX05vZGVUeXBlczsKKyAgICBhbGxvY2F0b3JfdHlwZSYgX19uYV87CisKKyAgICBfX3RyZWVfbm9kZV9kZXN0cnVjdG9yJiBvcGVyYXRvcj0oY29uc3QgX190cmVlX25vZGVfZGVzdHJ1Y3RvciYpOworCitwdWJsaWM6CisgICAgYm9vbCBfX3ZhbHVlX2NvbnN0cnVjdGVkOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9fdHJlZV9ub2RlX2Rlc3RydWN0b3IoYWxsb2NhdG9yX3R5cGUmIF9fbmEsIGJvb2wgX192YWwgPSBmYWxzZSkgX05PRVhDRVBUCisgICAgICAgIDogX19uYV8oX19uYSksCisgICAgICAgICAgX192YWx1ZV9jb25zdHJ1Y3RlZChfX3ZhbCkKKyAgICAgICAge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIG9wZXJhdG9yKCkocG9pbnRlciBfX3ApIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgaWYgKF9fdmFsdWVfY29uc3RydWN0ZWQpCisgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6ZGVzdHJveShfX25hXywgX05vZGVUeXBlczo6X19nZXRfcHRyKF9fcC0+X192YWx1ZV8pKTsKKyAgICAgICAgaWYgKF9fcCkKKyAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKF9fbmFfLCBfX3AsIDEpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIF9fbWFwX25vZGVfZGVzdHJ1Y3RvcjsKK307CisKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX05vZGVQdHIsIGNsYXNzIF9EaWZmVHlwZT4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9fdHJlZV9pdGVyYXRvcgoreworICAgIHR5cGVkZWYgX190cmVlX25vZGVfdHlwZXM8X05vZGVQdHI+ICAgICAgICAgICAgICAgICAgICAgX05vZGVUeXBlczsKKyAgICB0eXBlZGVmIF9Ob2RlUHRyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbm9kZV9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X19ub2RlX2Jhc2VfcG9pbnRlciAgICAgICAgX19ub2RlX2Jhc2VfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6Ol9fZW5kX25vZGVfcG9pbnRlciAgICAgICAgIF9fZW5kX25vZGVfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6Ol9faXRlcl9wb2ludGVyICAgICAgICAgICAgIF9faXRlcl9wb2ludGVyOworICAgIHR5cGVkZWYgcG9pbnRlcl90cmFpdHM8X19ub2RlX3BvaW50ZXI+IF9fcG9pbnRlcl90cmFpdHM7CisKKyAgICBfX2l0ZXJfcG9pbnRlciBfX3B0cl87CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfRGlmZlR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X19ub2RlX3ZhbHVlX3R5cGVfcG9pbnRlciBwb2ludGVyOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX3RyZWVfaXRlcmF0b3IoKSBfTk9FWENFUFQKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorICAgIDogX19wdHJfKG51bGxwdHIpCisjZW5kaWYKKyAgICB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgICAge3JldHVybiBfX2dldF9ucCgpLT5fX3ZhbHVlXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgICB7cmV0dXJuIHBvaW50ZXJfdHJhaXRzPHBvaW50ZXI+Ojpwb2ludGVyX3RvKF9fZ2V0X25wKCktPl9fdmFsdWVfKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX190cmVlX2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeworICAgICAgX19wdHJfID0gc3RhdGljX2Nhc3Q8X19pdGVyX3BvaW50ZXI+KAorICAgICAgICAgIF9fdHJlZV9uZXh0X2l0ZXI8X19lbmRfbm9kZV9wb2ludGVyPihzdGF0aWNfY2FzdDxfX25vZGVfYmFzZV9wb2ludGVyPihfX3B0cl8pKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3RyZWVfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpCisgICAgICAgIHtfX3RyZWVfaXRlcmF0b3IgX190KCp0aGlzKTsgKysoKnRoaXMpOyByZXR1cm4gX190O30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3RyZWVfaXRlcmF0b3ImIG9wZXJhdG9yLS0oKSB7CisgICAgICBfX3B0cl8gPSBzdGF0aWNfY2FzdDxfX2l0ZXJfcG9pbnRlcj4oX190cmVlX3ByZXZfaXRlcjxfX25vZGVfYmFzZV9wb2ludGVyPigKKyAgICAgICAgICBzdGF0aWNfY2FzdDxfX2VuZF9ub2RlX3BvaW50ZXI+KF9fcHRyXykpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fdHJlZV9pdGVyYXRvciBvcGVyYXRvci0tKGludCkKKyAgICAgICAge19fdHJlZV9pdGVyYXRvciBfX3QoKnRoaXMpOyAtLSgqdGhpcyk7IHJldHVybiBfX3Q7fQorCisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfX3RyZWVfaXRlcmF0b3ImIF9feCwgY29uc3QgX190cmVlX2l0ZXJhdG9yJiBfX3kpCisgICAgICAgIHtyZXR1cm4gX194Ll9fcHRyXyA9PSBfX3kuX19wdHJfO30KKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgX190cmVlX2l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9fdHJlZV9pdGVyYXRvciYgX195KQorICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorCitwcml2YXRlOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX3RyZWVfaXRlcmF0b3IoX19ub2RlX3BvaW50ZXIgX19wKSBfTk9FWENFUFQgOiBfX3B0cl8oX19wKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX3RyZWVfaXRlcmF0b3IoX19lbmRfbm9kZV9wb2ludGVyIF9fcCkgX05PRVhDRVBUIDogX19wdHJfKF9fcCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19ub2RlX3BvaW50ZXIgX19nZXRfbnAoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19wdHJfKTsgfQorICAgIHRlbXBsYXRlIDxjbGFzcywgY2xhc3MsIGNsYXNzPiBmcmllbmQgY2xhc3MgX190cmVlOworICAgIHRlbXBsYXRlIDxjbGFzcywgY2xhc3MsIGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX190cmVlX2NvbnN0X2l0ZXJhdG9yOworICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9fbWFwX2l0ZXJhdG9yOworICAgIHRlbXBsYXRlIDxjbGFzcywgY2xhc3MsIGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIG1hcDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcywgY2xhc3M+IGZyaWVuZCBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBtdWx0aW1hcDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHNldDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIG11bHRpc2V0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX05vZGVQdHIsIGNsYXNzIF9EaWZmVHlwZT4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9fdHJlZV9jb25zdF9pdGVyYXRvcgoreworICAgIHR5cGVkZWYgX190cmVlX25vZGVfdHlwZXM8X05vZGVQdHI+ICAgICAgICAgICAgICAgICAgICAgX05vZGVUeXBlczsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6Ol9fbm9kZV9wb2ludGVyICAgICAgICAgICAgIF9fbm9kZV9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X19ub2RlX2Jhc2VfcG9pbnRlciAgICAgICAgX19ub2RlX2Jhc2VfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6Ol9fZW5kX25vZGVfcG9pbnRlciAgICAgICAgIF9fZW5kX25vZGVfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6Ol9faXRlcl9wb2ludGVyICAgICAgICAgICAgIF9faXRlcl9wb2ludGVyOworICAgIHR5cGVkZWYgcG9pbnRlcl90cmFpdHM8X19ub2RlX3BvaW50ZXI+IF9fcG9pbnRlcl90cmFpdHM7CisKKyAgICBfX2l0ZXJfcG9pbnRlciBfX3B0cl87CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfRGlmZlR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X19jb25zdF9ub2RlX3ZhbHVlX3R5cGVfcG9pbnRlciBwb2ludGVyOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX3RyZWVfY29uc3RfaXRlcmF0b3IoKSBfTk9FWENFUFQKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorICAgIDogX19wdHJfKG51bGxwdHIpCisjZW5kaWYKKyAgICB7fQorCitwcml2YXRlOgorICAgIHR5cGVkZWYgX190cmVlX2l0ZXJhdG9yPHZhbHVlX3R5cGUsIF9fbm9kZV9wb2ludGVyLCBkaWZmZXJlbmNlX3R5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbm9uX2NvbnN0X2l0ZXJhdG9yOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3RyZWVfY29uc3RfaXRlcmF0b3IoX19ub25fY29uc3RfaXRlcmF0b3IgX19wKSBfTk9FWENFUFQKKyAgICAgICAgOiBfX3B0cl8oX19wLl9fcHRyXykge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX19nZXRfbnAoKS0+X192YWx1ZV87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgICAge3JldHVybiBwb2ludGVyX3RyYWl0czxwb2ludGVyPjo6cG9pbnRlcl90byhfX2dldF9ucCgpLT5fX3ZhbHVlXyk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fdHJlZV9jb25zdF9pdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKKyAgICAgIF9fcHRyXyA9IHN0YXRpY19jYXN0PF9faXRlcl9wb2ludGVyPigKKyAgICAgICAgICBfX3RyZWVfbmV4dF9pdGVyPF9fZW5kX25vZGVfcG9pbnRlcj4oc3RhdGljX2Nhc3Q8X19ub2RlX2Jhc2VfcG9pbnRlcj4oX19wdHJfKSkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3RyZWVfY29uc3RfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpCisgICAgICAgIHtfX3RyZWVfY29uc3RfaXRlcmF0b3IgX190KCp0aGlzKTsgKysoKnRoaXMpOyByZXR1cm4gX190O30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3RyZWVfY29uc3RfaXRlcmF0b3ImIG9wZXJhdG9yLS0oKSB7CisgICAgICBfX3B0cl8gPSBzdGF0aWNfY2FzdDxfX2l0ZXJfcG9pbnRlcj4oX190cmVlX3ByZXZfaXRlcjxfX25vZGVfYmFzZV9wb2ludGVyPigKKyAgICAgICAgICBzdGF0aWNfY2FzdDxfX2VuZF9ub2RlX3BvaW50ZXI+KF9fcHRyXykpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX190cmVlX2NvbnN0X2l0ZXJhdG9yIG9wZXJhdG9yLS0oaW50KQorICAgICAgICB7X190cmVlX2NvbnN0X2l0ZXJhdG9yIF9fdCgqdGhpcyk7IC0tKCp0aGlzKTsgcmV0dXJuIF9fdDt9CisKKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgX190cmVlX2NvbnN0X2l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9fdHJlZV9jb25zdF9pdGVyYXRvciYgX195KQorICAgICAgICB7cmV0dXJuIF9feC5fX3B0cl8gPT0gX195Ll9fcHRyXzt9CisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF9fdHJlZV9jb25zdF9pdGVyYXRvciYgX194LCBjb25zdCBfX3RyZWVfY29uc3RfaXRlcmF0b3ImIF9feSkKKyAgICAgICAge3JldHVybiAhKF9feCA9PSBfX3kpO30KKworcHJpdmF0ZToKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX190cmVlX2NvbnN0X2l0ZXJhdG9yKF9fbm9kZV9wb2ludGVyIF9fcCkgX05PRVhDRVBUCisgICAgICAgIDogX19wdHJfKF9fcCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX190cmVlX2NvbnN0X2l0ZXJhdG9yKF9fZW5kX25vZGVfcG9pbnRlciBfX3ApIF9OT0VYQ0VQVAorICAgICAgICA6IF9fcHRyXyhfX3ApIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fbm9kZV9wb2ludGVyIF9fZ2V0X25wKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9fcHRyXyk7IH0KKworICAgIHRlbXBsYXRlIDxjbGFzcywgY2xhc3MsIGNsYXNzPiBmcmllbmQgY2xhc3MgX190cmVlOworICAgIHRlbXBsYXRlIDxjbGFzcywgY2xhc3MsIGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIG1hcDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcywgY2xhc3M+IGZyaWVuZCBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBtdWx0aW1hcDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHNldDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIG11bHRpc2V0OworICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9fbWFwX2NvbnN0X2l0ZXJhdG9yOworCit9OworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitzdHJ1Y3QgX19kaWFnbm9zZV90cmVlX2hlbHBlciB7CisgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfX3RyaWdnZXJfZGlhZ25vc3RpY3MoKQorICAgICAgX0xJQkNQUF9ESUFHTk9TRV9XQVJOSU5HKCFfX2ludm9rYWJsZTxfQ29tcGFyZSBjb25zdCYsIF9UcCBjb25zdCYsIF9UcCBjb25zdCY+Ojp2YWx1ZSwKKyAgICAgICAgICAgICJ0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3IgdHlwZSBkb2VzIG5vdCBwcm92aWRlIGEgY29uc3QgY2FsbCBvcGVyYXRvciIpCisgIHsgcmV0dXJuIHRydWU7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlDb21wLCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19kaWFnbm9zZV90cmVlX2hlbHBlcjwKKyAgICBfX3ZhbHVlX3R5cGU8X0tleSwgX1ZhbHVlPiwKKyAgICBfX21hcF92YWx1ZV9jb21wYXJlPF9LZXksIF9fdmFsdWVfdHlwZTxfS2V5LCBfVmFsdWU+LCBfS2V5Q29tcD4sCisgICAgX0FsbG9jCis+IDogX19kaWFnbm9zZV90cmVlX2hlbHBlcjxfS2V5LCBfS2V5Q29tcCwgX0FsbG9jPgoreworfTsKKyNlbmRpZiAvLyAhX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgorY2xhc3MgX190cmVlCit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQ29tcGFyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2NvbXBhcmU7CisgICAgdHlwZWRlZiBfQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT4gICAgICAgICBfX2FsbG9jX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbWFrZV90cmVlX25vZGVfdHlwZXM8dmFsdWVfdHlwZSwKKyAgICAgICAgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnZvaWRfcG9pbnRlcj46OnR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTm9kZVR5cGVzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6a2V5X3R5cGUgICAgICAgICAgIGtleV90eXBlOworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X19ub2RlX3ZhbHVlX3R5cGUgICAgICBfX25vZGVfdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6Ol9fY29udGFpbmVyX3ZhbHVlX3R5cGUgX19jb250YWluZXJfdmFsdWVfdHlwZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnBvaW50ZXIgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OmNvbnN0X3BvaW50ZXIgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2FsbG9jX3RyYWl0czo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X192b2lkX3BvaW50ZXIgICAgICAgIF9fdm9pZF9wb2ludGVyOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjpfX25vZGVfdHlwZSAgICAgICAgICAgX19ub2RlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X19ub2RlX3BvaW50ZXIgICAgICAgIF9fbm9kZV9wb2ludGVyOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjpfX25vZGVfYmFzZV90eXBlICAgICAgX19ub2RlX2Jhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjpfX25vZGVfYmFzZV9wb2ludGVyICAgX19ub2RlX2Jhc2VfcG9pbnRlcjsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X19lbmRfbm9kZV90eXBlICAgICAgIF9fZW5kX25vZGVfdDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6Ol9fZW5kX25vZGVfcG9pbnRlciAgICBfX2VuZF9ub2RlX3B0cjsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X19wYXJlbnRfcG9pbnRlciAgICAgIF9fcGFyZW50X3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjpfX2l0ZXJfcG9pbnRlciAgICAgICAgX19pdGVyX3BvaW50ZXI7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2FsbG9jX2hlbHBlcjxfX2FsbG9jX3RyYWl0cywgX19ub2RlPjo6dHlwZSBfX25vZGVfYWxsb2NhdG9yOworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfX25vZGVfYWxsb2NhdG9yPiAgICAgICAgIF9fbm9kZV90cmFpdHM7CisKK3ByaXZhdGU6CisgICAgLy8gY2hlY2sgZm9yIHNhbmUgYWxsb2NhdG9yIHBvaW50ZXIgcmViaW5kaW5nIHNlbWFudGljcy4gUmViaW5kaW5nIHRoZQorICAgIC8vIGFsbG9jYXRvciBmb3IgYSBuZXcgcG9pbnRlciB0eXBlIHNob3VsZCBiZSBleGFjdGx5IHRoZSBzYW1lIGFzIHJlYmluZGluZworICAgIC8vIHRoZSBwb2ludGVyIHVzaW5nICdwb2ludGVyX3RyYWl0cycuCisgICAgc3RhdGljX2Fzc2VydCgoaXNfc2FtZTxfX25vZGVfcG9pbnRlciwgdHlwZW5hbWUgX19ub2RlX3RyYWl0czo6cG9pbnRlcj46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICJBbGxvY2F0b3IgZG9lcyBub3QgcmViaW5kIHBvaW50ZXJzIGluIGEgc2FuZSBtYW5uZXIuIik7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9hbGxvY19oZWxwZXI8X19ub2RlX3RyYWl0cywgX19ub2RlX2Jhc2U+Ojp0eXBlCisgICAgICAgIF9fbm9kZV9iYXNlX2FsbG9jYXRvcjsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X19ub2RlX2Jhc2VfYWxsb2NhdG9yPiBfX25vZGVfYmFzZV90cmFpdHM7CisgICAgc3RhdGljX2Fzc2VydCgoaXNfc2FtZTxfX25vZGVfYmFzZV9wb2ludGVyLCB0eXBlbmFtZSBfX25vZGVfYmFzZV90cmFpdHM6OnBvaW50ZXI+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICJBbGxvY2F0b3IgZG9lcyBub3QgcmViaW5kIHBvaW50ZXJzIGluIGEgc2FuZSBtYW5uZXIuIik7CisKK3ByaXZhdGU6CisgICAgX19pdGVyX3BvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWdpbl9ub2RlXzsKKyAgICBfX2NvbXByZXNzZWRfcGFpcjxfX2VuZF9ub2RlX3QsIF9fbm9kZV9hbGxvY2F0b3I+ICBfX3BhaXIxXzsKKyAgICBfX2NvbXByZXNzZWRfcGFpcjxzaXplX3R5cGUsIHZhbHVlX2NvbXBhcmU+ICAgICAgICBfX3BhaXIzXzsKKworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2l0ZXJfcG9pbnRlciBfX2VuZF9ub2RlKCkgX05PRVhDRVBUCisgICAgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X19pdGVyX3BvaW50ZXI+KAorICAgICAgICAgICAgICAgIHBvaW50ZXJfdHJhaXRzPF9fZW5kX25vZGVfcHRyPjo6cG9pbnRlcl90byhfX3BhaXIxXy5maXJzdCgpKQorICAgICAgICApOworICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19pdGVyX3BvaW50ZXIgX19lbmRfbm9kZSgpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9faXRlcl9wb2ludGVyPigKKyAgICAgICAgICAgIHBvaW50ZXJfdHJhaXRzPF9fZW5kX25vZGVfcHRyPjo6cG9pbnRlcl90bygKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PF9fZW5kX25vZGVfdCY+KF9fcGFpcjFfLmZpcnN0KCkpCisgICAgICAgICAgICApCisgICAgICAgICk7CisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICBfX25vZGVfYWxsb2NhdG9yJiBfX25vZGVfYWxsb2MoKSBfTk9FWENFUFQge3JldHVybiBfX3BhaXIxXy5zZWNvbmQoKTt9Citwcml2YXRlOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdCBfX25vZGVfYWxsb2NhdG9yJiBfX25vZGVfYWxsb2MoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX3BhaXIxXy5zZWNvbmQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgIF9faXRlcl9wb2ludGVyJiBfX2JlZ2luX25vZGUoKSBfTk9FWENFUFQge3JldHVybiBfX2JlZ2luX25vZGVfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgX19pdGVyX3BvaW50ZXImIF9fYmVnaW5fbm9kZSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fYmVnaW5fbm9kZV87fQorcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBhbGxvY2F0b3JfdHlwZSBfX2FsbG9jKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gYWxsb2NhdG9yX3R5cGUoX19ub2RlX2FsbG9jKCkpO30KK3ByaXZhdGU6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgIHNpemVfdHlwZSYgc2l6ZSgpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fcGFpcjNfLmZpcnN0KCk7fQorcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdCBzaXplX3R5cGUmIHNpemUoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3BhaXIzXy5maXJzdCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgdmFsdWVfY29tcGFyZSYgdmFsdWVfY29tcCgpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fcGFpcjNfLnNlY29uZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgdmFsdWVfY29tcGFyZSYgdmFsdWVfY29tcCgpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fcGFpcjNfLnNlY29uZCgpO30KK3B1YmxpYzoKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX25vZGVfcG9pbnRlciBfX3Jvb3QoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19lbmRfbm9kZSgpLT5fX2xlZnRfKTt9CisKKyAgICBfX25vZGVfYmFzZV9wb2ludGVyKiBfX3Jvb3RfcHRyKCkgY29uc3QgX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuIF9WU1REOjphZGRyZXNzb2YoX19lbmRfbm9kZSgpLT5fX2xlZnRfKTsKKyAgICB9CisKKyAgICB0eXBlZGVmIF9fdHJlZV9pdGVyYXRvcjx2YWx1ZV90eXBlLCBfX25vZGVfcG9pbnRlciwgZGlmZmVyZW5jZV90eXBlPiAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9fdHJlZV9jb25zdF9pdGVyYXRvcjx2YWx1ZV90eXBlLCBfX25vZGVfcG9pbnRlciwgZGlmZmVyZW5jZV90eXBlPiBjb25zdF9pdGVyYXRvcjsKKworICAgIGV4cGxpY2l0IF9fdHJlZShjb25zdCB2YWx1ZV9jb21wYXJlJiBfX2NvbXApCisgICAgICAgIF9OT0VYQ0VQVF8oCisgICAgICAgICAgICBpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxfX25vZGVfYWxsb2NhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPHZhbHVlX2NvbXBhcmU+Ojp2YWx1ZSk7CisgICAgZXhwbGljaXQgX190cmVlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworICAgIF9fdHJlZShjb25zdCB2YWx1ZV9jb21wYXJlJiBfX2NvbXAsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworICAgIF9fdHJlZShjb25zdCBfX3RyZWUmIF9fdCk7CisgICAgX190cmVlJiBvcGVyYXRvcj0oY29uc3QgX190cmVlJiBfX3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZCBfX2Fzc2lnbl91bmlxdWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQgX19hc3NpZ25fbXVsdGkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX190cmVlKF9fdHJlZSYmIF9fdCkKKyAgICAgICAgX05PRVhDRVBUXygKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPF9fbm9kZV9hbGxvY2F0b3I+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8dmFsdWVfY29tcGFyZT46OnZhbHVlKTsKKyAgICBfX3RyZWUoX190cmVlJiYgX190LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyAgICBfX3RyZWUmIG9wZXJhdG9yPShfX3RyZWUmJiBfX3QpCisgICAgICAgIF9OT0VYQ0VQVF8oCisgICAgICAgICAgICBfX25vZGVfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPHZhbHVlX2NvbXBhcmU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8X19ub2RlX2FsbG9jYXRvcj46OnZhbHVlKTsKKyNlbmRpZiAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIH5fX3RyZWUoKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICBpdGVyYXRvciBiZWdpbigpICBfTk9FWENFUFQge3JldHVybiAgICAgICBpdGVyYXRvcihfX2JlZ2luX25vZGUoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9fYmVnaW5fbm9kZSgpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgIGl0ZXJhdG9yIGVuZCgpIF9OT0VYQ0VQVCB7cmV0dXJuICAgICAgIGl0ZXJhdG9yKF9fZW5kX25vZGUoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBjb25zdF9pdGVyYXRvcihfX2VuZF9ub2RlKCkpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBzdGQ6Om1pbjxzaXplX3R5cGU+KAorICAgICAgICAgICAgICAgIF9fbm9kZV90cmFpdHM6Om1heF9zaXplKF9fbm9kZV9hbGxvYygpKSwKKyAgICAgICAgICAgICAgICBudW1lcmljX2xpbWl0czxkaWZmZXJlbmNlX3R5cGUgPjo6bWF4KCkpO30KKworICAgIHZvaWQgY2xlYXIoKSBfTk9FWENFUFQ7CisKKyAgICB2b2lkIHN3YXAoX190cmVlJiBfX3QpCisjaWYgX0xJQkNQUF9TVERfVkVSIDw9IDExCisgICAgICAgIF9OT0VYQ0VQVF8oCisgICAgICAgICAgICBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPHZhbHVlX2NvbXBhcmU+Ojp2YWx1ZQorICAgICAgICAgICAgJiYgKCFfX25vZGVfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXA6OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgIF9faXNfbm90aHJvd19zd2FwcGFibGU8X19ub2RlX2FsbG9jYXRvcj46OnZhbHVlKQorICAgICAgICAgICAgKTsKKyNlbHNlCisgICAgICAgIF9OT0VYQ0VQVF8oX19pc19ub3Rocm93X3N3YXBwYWJsZTx2YWx1ZV9jb21wYXJlPjo6dmFsdWUpOworI2VuZGlmCisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIC4uLl9BcmdzPgorICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgX19lbXBsYWNlX3VuaXF1ZV9rZXlfYXJncyhfS2V5IGNvbnN0JiwgX0FyZ3MmJi4uLiBfX2FyZ3MpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyAuLi5fQXJncz4KKyAgICBpdGVyYXRvcgorICAgIF9fZW1wbGFjZV9oaW50X3VuaXF1ZV9rZXlfYXJncyhjb25zdF9pdGVyYXRvciwgX0tleSBjb25zdCYsIF9BcmdzJiYuLi4pOworCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IF9fZW1wbGFjZV91bmlxdWVfaW1wbChfQXJncyYmLi4uIF9fYXJncyk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICAgaXRlcmF0b3IgX19lbXBsYWNlX2hpbnRfdW5pcXVlX2ltcGwoY29uc3RfaXRlcmF0b3IgX19wLCBfQXJncyYmLi4uIF9fYXJncyk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICAgaXRlcmF0b3IgX19lbXBsYWNlX211bHRpKF9BcmdzJiYuLi4gX19hcmdzKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KKyAgICBpdGVyYXRvciBfX2VtcGxhY2VfaGludF9tdWx0aShjb25zdF9pdGVyYXRvciBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfUHA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IF9fZW1wbGFjZV91bmlxdWUoX1BwJiYgX194KSB7CisgICAgICAgIHJldHVybiBfX2VtcGxhY2VfdW5pcXVlX2V4dHJhY3Rfa2V5KF9WU1REOjpmb3J3YXJkPF9QcD4oX194KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jYW5fZXh0cmFjdF9rZXk8X1BwLCBrZXlfdHlwZT4oKSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9GaXJzdCwgY2xhc3MgX1NlY29uZD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgICBfX2Nhbl9leHRyYWN0X21hcF9rZXk8X0ZpcnN0LCBrZXlfdHlwZSwgX19jb250YWluZXJfdmFsdWVfdHlwZT46OnZhbHVlLAorICAgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgID46OnR5cGUgX19lbXBsYWNlX3VuaXF1ZShfRmlyc3QmJiBfX2YsIF9TZWNvbmQmJiBfX3MpIHsKKyAgICAgICAgcmV0dXJuIF9fZW1wbGFjZV91bmlxdWVfa2V5X2FyZ3MoX19mLCBfVlNURDo6Zm9yd2FyZDxfRmlyc3Q+KF9fZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X1NlY29uZD4oX19zKSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBfX2VtcGxhY2VfdW5pcXVlKF9BcmdzJiYuLi4gX19hcmdzKSB7CisgICAgICAgIHJldHVybiBfX2VtcGxhY2VfdW5pcXVlX2ltcGwoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfUHA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgX19lbXBsYWNlX3VuaXF1ZV9leHRyYWN0X2tleShfUHAmJiBfX3gsIF9fZXh0cmFjdF9rZXlfZmFpbF90YWcpIHsKKyAgICAgIHJldHVybiBfX2VtcGxhY2VfdW5pcXVlX2ltcGwoX1ZTVEQ6OmZvcndhcmQ8X1BwPihfX3gpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1BwPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgIF9fZW1wbGFjZV91bmlxdWVfZXh0cmFjdF9rZXkoX1BwJiYgX194LCBfX2V4dHJhY3Rfa2V5X3NlbGZfdGFnKSB7CisgICAgICByZXR1cm4gX19lbXBsYWNlX3VuaXF1ZV9rZXlfYXJncyhfX3gsIF9WU1REOjpmb3J3YXJkPF9QcD4oX194KSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9QcD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICBfX2VtcGxhY2VfdW5pcXVlX2V4dHJhY3Rfa2V5KF9QcCYmIF9feCwgX19leHRyYWN0X2tleV9maXJzdF90YWcpIHsKKyAgICAgIHJldHVybiBfX2VtcGxhY2VfdW5pcXVlX2tleV9hcmdzKF9feC5maXJzdCwgX1ZTVEQ6OmZvcndhcmQ8X1BwPihfX3gpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1BwPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBfX2VtcGxhY2VfaGludF91bmlxdWUoY29uc3RfaXRlcmF0b3IgX19wLCBfUHAmJiBfX3gpIHsKKyAgICAgICAgcmV0dXJuIF9fZW1wbGFjZV9oaW50X3VuaXF1ZV9leHRyYWN0X2tleShfX3AsIF9WU1REOjpmb3J3YXJkPF9QcD4oX194KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jYW5fZXh0cmFjdF9rZXk8X1BwLCBrZXlfdHlwZT4oKSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9GaXJzdCwgY2xhc3MgX1NlY29uZD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgICBfX2Nhbl9leHRyYWN0X21hcF9rZXk8X0ZpcnN0LCBrZXlfdHlwZSwgX19jb250YWluZXJfdmFsdWVfdHlwZT46OnZhbHVlLAorICAgICAgICBpdGVyYXRvcgorICAgID46OnR5cGUgX19lbXBsYWNlX2hpbnRfdW5pcXVlKGNvbnN0X2l0ZXJhdG9yIF9fcCwgX0ZpcnN0JiYgX19mLCBfU2Vjb25kJiYgX19zKSB7CisgICAgICAgIHJldHVybiBfX2VtcGxhY2VfaGludF91bmlxdWVfa2V5X2FyZ3MoX19wLCBfX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X0ZpcnN0PihfX2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkPF9TZWNvbmQ+KF9fcykpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgX19lbXBsYWNlX2hpbnRfdW5pcXVlKGNvbnN0X2l0ZXJhdG9yIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpIHsKKyAgICAgICAgcmV0dXJuIF9fZW1wbGFjZV9oaW50X3VuaXF1ZV9pbXBsKF9fcCwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfUHA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yCisgICAgX19lbXBsYWNlX2hpbnRfdW5pcXVlX2V4dHJhY3Rfa2V5KGNvbnN0X2l0ZXJhdG9yIF9fcCwgX1BwJiYgX194LCBfX2V4dHJhY3Rfa2V5X2ZhaWxfdGFnKSB7CisgICAgICByZXR1cm4gX19lbXBsYWNlX2hpbnRfdW5pcXVlX2ltcGwoX19wLCBfVlNURDo6Zm9yd2FyZDxfUHA+KF9feCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfUHA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yCisgICAgX19lbXBsYWNlX2hpbnRfdW5pcXVlX2V4dHJhY3Rfa2V5KGNvbnN0X2l0ZXJhdG9yIF9fcCwgX1BwJiYgX194LCBfX2V4dHJhY3Rfa2V5X3NlbGZfdGFnKSB7CisgICAgICByZXR1cm4gX19lbXBsYWNlX2hpbnRfdW5pcXVlX2tleV9hcmdzKF9fcCwgX194LCBfVlNURDo6Zm9yd2FyZDxfUHA+KF9feCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfUHA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yCisgICAgX19lbXBsYWNlX2hpbnRfdW5pcXVlX2V4dHJhY3Rfa2V5KGNvbnN0X2l0ZXJhdG9yIF9fcCwgX1BwJiYgX194LCBfX2V4dHJhY3Rfa2V5X2ZpcnN0X3RhZykgeworICAgICAgcmV0dXJuIF9fZW1wbGFjZV9oaW50X3VuaXF1ZV9rZXlfYXJncyhfX3AsIF9feC5maXJzdCwgX1ZTVEQ6OmZvcndhcmQ8X1BwPihfX3gpKTsKKyAgICB9CisKKyNlbHNlCisgICAgdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9BcmdzPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBfX2VtcGxhY2VfdW5pcXVlX2tleV9hcmdzKF9LZXkgY29uc3QmLCBfQXJncyYgX19hcmdzKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0FyZ3M+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIF9fZW1wbGFjZV9oaW50X3VuaXF1ZV9rZXlfYXJncyhjb25zdF9pdGVyYXRvciwgX0tleSBjb25zdCYsIF9BcmdzJik7CisjZW5kaWYKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBfX2luc2VydF91bmlxdWUoY29uc3QgX19jb250YWluZXJfdmFsdWVfdHlwZSYgX192KSB7CisgICAgICAgIHJldHVybiBfX2VtcGxhY2VfdW5pcXVlX2tleV9hcmdzKF9Ob2RlVHlwZXM6Ol9fZ2V0X2tleShfX3YpLCBfX3YpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBfX2luc2VydF91bmlxdWUoY29uc3RfaXRlcmF0b3IgX19wLCBjb25zdCBfX2NvbnRhaW5lcl92YWx1ZV90eXBlJiBfX3YpIHsKKyAgICAgICAgcmV0dXJuIF9fZW1wbGFjZV9oaW50X3VuaXF1ZV9rZXlfYXJncyhfX3AsIF9Ob2RlVHlwZXM6Ol9fZ2V0X2tleShfX3YpLCBfX3YpOworICAgIH0KKworI2lmZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBfX2luc2VydF9tdWx0aShjb25zdCBfX2NvbnRhaW5lcl92YWx1ZV90eXBlJiBfX3YpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBfX2luc2VydF9tdWx0aShjb25zdF9pdGVyYXRvciBfX3AsIGNvbnN0IF9fY29udGFpbmVyX3ZhbHVlX3R5cGUmIF9fdik7CisjZWxzZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBfX2luc2VydF91bmlxdWUoX19jb250YWluZXJfdmFsdWVfdHlwZSYmIF9fdikgeworICAgICAgICByZXR1cm4gX19lbXBsYWNlX3VuaXF1ZV9rZXlfYXJncyhfTm9kZVR5cGVzOjpfX2dldF9rZXkoX192KSwgX1ZTVEQ6Om1vdmUoX192KSk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIF9faW5zZXJ0X3VuaXF1ZShjb25zdF9pdGVyYXRvciBfX3AsIF9fY29udGFpbmVyX3ZhbHVlX3R5cGUmJiBfX3YpIHsKKyAgICAgICAgcmV0dXJuIF9fZW1wbGFjZV9oaW50X3VuaXF1ZV9rZXlfYXJncyhfX3AsIF9Ob2RlVHlwZXM6Ol9fZ2V0X2tleShfX3YpLCBfVlNURDo6bW92ZShfX3YpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1ZwLCBjbGFzcyA9IHR5cGVuYW1lIGVuYWJsZV9pZjwKKyAgICAgICAgICAgICFpc19zYW1lPHR5cGVuYW1lIF9fdW5jb25zdHJlZjxfVnA+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgX19jb250YWluZXJfdmFsdWVfdHlwZQorICAgICAgICAgICAgPjo6dmFsdWUKKyAgICAgICAgPjo6dHlwZT4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gX19pbnNlcnRfdW5pcXVlKF9WcCYmIF9fdikgeworICAgICAgICByZXR1cm4gX19lbXBsYWNlX3VuaXF1ZShfVlNURDo6Zm9yd2FyZDxfVnA+KF9fdikpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVnAsIGNsYXNzID0gdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgICAgICAgIWlzX3NhbWU8dHlwZW5hbWUgX191bmNvbnN0cmVmPF9WcD46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgICBfX2NvbnRhaW5lcl92YWx1ZV90eXBlCisgICAgICAgICAgICA+Ojp2YWx1ZQorICAgICAgICA+Ojp0eXBlPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBfX2luc2VydF91bmlxdWUoY29uc3RfaXRlcmF0b3IgX19wLCBfVnAmJiBfX3YpIHsKKyAgICAgICAgcmV0dXJuIF9fZW1wbGFjZV9oaW50X3VuaXF1ZShfX3AsIF9WU1REOjpmb3J3YXJkPF9WcD4oX192KSk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIF9faW5zZXJ0X211bHRpKF9fY29udGFpbmVyX3ZhbHVlX3R5cGUmJiBfX3YpIHsKKyAgICAgICAgcmV0dXJuIF9fZW1wbGFjZV9tdWx0aShfVlNURDo6bW92ZShfX3YpKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgX19pbnNlcnRfbXVsdGkoY29uc3RfaXRlcmF0b3IgX19wLCBfX2NvbnRhaW5lcl92YWx1ZV90eXBlJiYgX192KSB7CisgICAgICAgIHJldHVybiBfX2VtcGxhY2VfaGludF9tdWx0aShfX3AsIF9WU1REOjptb3ZlKF9fdikpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVnA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIF9faW5zZXJ0X211bHRpKF9WcCYmIF9fdikgeworICAgICAgICByZXR1cm4gX19lbXBsYWNlX211bHRpKF9WU1REOjpmb3J3YXJkPF9WcD4oX192KSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9WcD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgX19pbnNlcnRfbXVsdGkoY29uc3RfaXRlcmF0b3IgX19wLCBfVnAmJiBfX3YpIHsKKyAgICAgICAgcmV0dXJuIF9fZW1wbGFjZV9oaW50X211bHRpKF9fcCwgX1ZTVEQ6OmZvcndhcmQ8X1ZwPihfX3YpKTsKKyAgICB9CisKKyNlbmRpZiAvLyAhX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBfX25vZGVfaW5zZXJ0X3VuaXF1ZShfX25vZGVfcG9pbnRlciBfX25kKTsKKyAgICBpdGVyYXRvciAgICAgICAgICAgICBfX25vZGVfaW5zZXJ0X3VuaXF1ZShjb25zdF9pdGVyYXRvciBfX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlX3BvaW50ZXIgX19uZCk7CisKKyAgICBpdGVyYXRvciBfX25vZGVfaW5zZXJ0X211bHRpKF9fbm9kZV9wb2ludGVyIF9fbmQpOworICAgIGl0ZXJhdG9yIF9fbm9kZV9pbnNlcnRfbXVsdGkoY29uc3RfaXRlcmF0b3IgX19wLCBfX25vZGVfcG9pbnRlciBfX25kKTsKKworICAgIGl0ZXJhdG9yIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcCk7CisgICAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfS2V5PgorICAgICAgICBzaXplX3R5cGUgX19lcmFzZV91bmlxdWUoY29uc3QgX0tleSYgX19rKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4KKyAgICAgICAgc2l6ZV90eXBlIF9fZXJhc2VfbXVsdGkoY29uc3QgX0tleSYgX19rKTsKKworICAgIHZvaWQgX19pbnNlcnRfbm9kZV9hdChfX3BhcmVudF9wb2ludGVyICAgICBfX3BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlX2Jhc2VfcG9pbnRlciYgX19jaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlX2Jhc2VfcG9pbnRlciBfX25ld19ub2RlKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfS2V5PgorICAgICAgICBpdGVyYXRvciBmaW5kKGNvbnN0IF9LZXkmIF9fdik7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9LZXk+CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgX0tleSYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfS2V5PgorICAgICAgICBzaXplX3R5cGUgX19jb3VudF91bmlxdWUoY29uc3QgX0tleSYgX19rKSBjb25zdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4KKyAgICAgICAgc2l6ZV90eXBlIF9fY291bnRfbXVsdGkoY29uc3QgX0tleSYgX19rKSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfS2V5PgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGl0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IF9LZXkmIF9fdikKKyAgICAgICAgICAgIHtyZXR1cm4gX19sb3dlcl9ib3VuZChfX3YsIF9fcm9vdCgpLCBfX2VuZF9ub2RlKCkpO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4KKyAgICAgICAgaXRlcmF0b3IgX19sb3dlcl9ib3VuZChjb25zdCBfS2V5JiBfX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlX3BvaW50ZXIgX19yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXRlcl9wb2ludGVyIF9fcmVzdWx0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBjb25zdF9pdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBfS2V5JiBfX3YpIGNvbnN0CisgICAgICAgICAgICB7cmV0dXJuIF9fbG93ZXJfYm91bmQoX192LCBfX3Jvb3QoKSwgX19lbmRfbm9kZSgpKTt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9LZXk+CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fbG93ZXJfYm91bmQoY29uc3QgX0tleSYgX192LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbm9kZV9wb2ludGVyIF9fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0ZXJfcG9pbnRlciBfX3Jlc3VsdCkgY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9LZXk+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgX0tleSYgX192KQorICAgICAgICAgICAge3JldHVybiBfX3VwcGVyX2JvdW5kKF9fdiwgX19yb290KCksIF9fZW5kX25vZGUoKSk7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfS2V5PgorICAgICAgICBpdGVyYXRvciBfX3VwcGVyX2JvdW5kKGNvbnN0IF9LZXkmIF9fdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25vZGVfcG9pbnRlciBfX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdGVyX3BvaW50ZXIgX19yZXN1bHQpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfS2V5PgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IF9LZXkmIF9fdikgY29uc3QKKyAgICAgICAgICAgIHtyZXR1cm4gX191cHBlcl9ib3VuZChfX3YsIF9fcm9vdCgpLCBfX2VuZF9ub2RlKCkpO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4KKyAgICAgICAgY29uc3RfaXRlcmF0b3IgX191cHBlcl9ib3VuZChjb25zdCBfS2V5JiBfX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlX3BvaW50ZXIgX19yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXRlcl9wb2ludGVyIF9fcmVzdWx0KSBjb25zdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4KKyAgICAgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICAgIF9fZXF1YWxfcmFuZ2VfdW5pcXVlKGNvbnN0IF9LZXkmIF9fayk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9LZXk+CisgICAgICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgICBfX2VxdWFsX3JhbmdlX3VuaXF1ZShjb25zdCBfS2V5JiBfX2spIGNvbnN0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9LZXk+CisgICAgICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgICBfX2VxdWFsX3JhbmdlX211bHRpKGNvbnN0IF9LZXkmIF9fayk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9LZXk+CisgICAgICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgICBfX2VxdWFsX3JhbmdlX211bHRpKGNvbnN0IF9LZXkmIF9faykgY29uc3Q7CisKKyAgICB0eXBlZGVmIF9fdHJlZV9ub2RlX2Rlc3RydWN0b3I8X19ub2RlX2FsbG9jYXRvcj4gX0RwOworICAgIHR5cGVkZWYgdW5pcXVlX3B0cjxfX25vZGUsIF9EcD4gX19ub2RlX2hvbGRlcjsKKworICAgIF9fbm9kZV9ob2xkZXIgcmVtb3ZlKGNvbnN0X2l0ZXJhdG9yIF9fcCkgX05PRVhDRVBUOworcHJpdmF0ZToKKyAgICBfX25vZGVfYmFzZV9wb2ludGVyJgorICAgICAgICBfX2ZpbmRfbGVhZl9sb3coX19wYXJlbnRfcG9pbnRlciYgX19wYXJlbnQsIGNvbnN0IGtleV90eXBlJiBfX3YpOworICAgIF9fbm9kZV9iYXNlX3BvaW50ZXImCisgICAgICAgIF9fZmluZF9sZWFmX2hpZ2goX19wYXJlbnRfcG9pbnRlciYgX19wYXJlbnQsIGNvbnN0IGtleV90eXBlJiBfX3YpOworICAgIF9fbm9kZV9iYXNlX3BvaW50ZXImCisgICAgICAgIF9fZmluZF9sZWFmKGNvbnN0X2l0ZXJhdG9yIF9faGludCwKKyAgICAgICAgICAgICAgICAgICAgX19wYXJlbnRfcG9pbnRlciYgX19wYXJlbnQsIGNvbnN0IGtleV90eXBlJiBfX3YpOworICAgIC8vIEZJWE1FOiBNYWtlIHRoaXMgZnVuY3Rpb24gY29uc3QgcXVhbGlmaWVkLiBVbmZvcnR1bmV0bHkgZG9pbmcgc28KKyAgICAvLyBicmVha3MgZXhpc3RpbmcgY29kZSB3aGljaCB1c2VzIG5vbi1jb25zdCBjYWxsYWJsZSBjb21wYXJhdG9ycy4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4KKyAgICBfX25vZGVfYmFzZV9wb2ludGVyJgorICAgICAgICBfX2ZpbmRfZXF1YWwoX19wYXJlbnRfcG9pbnRlciYgX19wYXJlbnQsIGNvbnN0IF9LZXkmIF9fdik7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9LZXk+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX25vZGVfYmFzZV9wb2ludGVyJgorICAgIF9fZmluZF9lcXVhbChfX3BhcmVudF9wb2ludGVyJiBfX3BhcmVudCwgY29uc3QgX0tleSYgX192KSBjb25zdCB7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxfX3RyZWUqPih0aGlzKS0+X19maW5kX2VxdWFsKF9fcGFyZW50LCBfX3YpOworICAgIH0KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4KKyAgICBfX25vZGVfYmFzZV9wb2ludGVyJgorICAgICAgICBfX2ZpbmRfZXF1YWwoY29uc3RfaXRlcmF0b3IgX19oaW50LCBfX3BhcmVudF9wb2ludGVyJiBfX3BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgIF9fbm9kZV9iYXNlX3BvaW50ZXImIF9fZHVtbXksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBfS2V5JiBfX3YpOworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHRlbXBsYXRlIDxjbGFzcyAuLi5fQXJncz4KKyAgICBfX25vZGVfaG9sZGVyIF9fY29uc3RydWN0X25vZGUoX0FyZ3MmJiAuLi5fX2FyZ3MpOworI2Vsc2UKKyAgICBfX25vZGVfaG9sZGVyIF9fY29uc3RydWN0X25vZGUoY29uc3QgX19jb250YWluZXJfdmFsdWVfdHlwZSYgX192KTsKKyNlbmRpZgorCisgICAgdm9pZCBkZXN0cm95KF9fbm9kZV9wb2ludGVyIF9fbmQpIF9OT0VYQ0VQVDsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fY29weV9hc3NpZ25fYWxsb2MoY29uc3QgX190cmVlJiBfX3QpCisgICAgICAgIHtfX2NvcHlfYXNzaWduX2FsbG9jKF9fdCwgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgICBfX25vZGVfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX2NvcHlfYXNzaWdubWVudDo6dmFsdWU+KCkpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fY29weV9hc3NpZ25fYWxsb2MoY29uc3QgX190cmVlJiBfX3QsIHRydWVfdHlwZSkKKyAgICAgICAgeworICAgICAgICBpZiAoX19ub2RlX2FsbG9jKCkgIT0gX190Ll9fbm9kZV9hbGxvYygpKQorICAgICAgICAJY2xlYXIoKTsKKyAgICAgICAgX19ub2RlX2FsbG9jKCkgPSBfX3QuX19ub2RlX2FsbG9jKCk7CisgICAgICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX2NvcHlfYXNzaWduX2FsbG9jKGNvbnN0IF9fdHJlZSYsIGZhbHNlX3R5cGUpIHt9CisKKyAgICB2b2lkIF9fbW92ZV9hc3NpZ24oX190cmVlJiBfX3QsIGZhbHNlX3R5cGUpOworICAgIHZvaWQgX19tb3ZlX2Fzc2lnbihfX3RyZWUmIF9fdCwgdHJ1ZV90eXBlKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPHZhbHVlX2NvbXBhcmU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPF9fbm9kZV9hbGxvY2F0b3I+Ojp2YWx1ZSk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX21vdmVfYXNzaWduX2FsbG9jKF9fdHJlZSYgX190KQorICAgICAgICBfTk9FWENFUFRfKAorICAgICAgICAgICAgIV9fbm9kZV90cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZSB8fAorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8X19ub2RlX2FsbG9jYXRvcj46OnZhbHVlKQorICAgICAgICB7X19tb3ZlX2Fzc2lnbl9hbGxvYyhfX3QsIGludGVncmFsX2NvbnN0YW50PGJvb2wsCisgICAgICAgICAgICAgX19ub2RlX3RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ6OnZhbHVlPigpKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX21vdmVfYXNzaWduX2FsbG9jKF9fdHJlZSYgX190LCB0cnVlX3R5cGUpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8X19ub2RlX2FsbG9jYXRvcj46OnZhbHVlKQorICAgICAgICB7X19ub2RlX2FsbG9jKCkgPSBfVlNURDo6bW92ZShfX3QuX19ub2RlX2FsbG9jKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX21vdmVfYXNzaWduX2FsbG9jKF9fdHJlZSYsIGZhbHNlX3R5cGUpIF9OT0VYQ0VQVCB7fQorCisgICAgX19ub2RlX3BvaW50ZXIgX19kZXRhY2goKTsKKyAgICBzdGF0aWMgX19ub2RlX3BvaW50ZXIgX19kZXRhY2goX19ub2RlX3BvaW50ZXIpOworCisgICAgdGVtcGxhdGUgPGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgbWFwOworICAgIHRlbXBsYXRlIDxjbGFzcywgY2xhc3MsIGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIG11bHRpbWFwOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fdHJlZShjb25zdCB2YWx1ZV9jb21wYXJlJiBfX2NvbXApCisgICAgICAgIF9OT0VYQ0VQVF8oCisgICAgICAgICAgICBpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxfX25vZGVfYWxsb2NhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPHZhbHVlX2NvbXBhcmU+Ojp2YWx1ZSkKKyAgICA6IF9fcGFpcjNfKDAsIF9fY29tcCkKK3sKKyAgICBfX2JlZ2luX25vZGUoKSA9IF9fZW5kX25vZGUoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fdHJlZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX19iZWdpbl9ub2RlXyhfX2l0ZXJfcG9pbnRlcigpKSwKKyAgICAgIF9fcGFpcjFfKF9fc2Vjb25kX3RhZygpLCBfX25vZGVfYWxsb2NhdG9yKF9fYSkpLAorICAgICAgX19wYWlyM18oMCkKK3sKKyAgICBfX2JlZ2luX25vZGUoKSA9IF9fZW5kX25vZGUoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fdHJlZShjb25zdCB2YWx1ZV9jb21wYXJlJiBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fYmVnaW5fbm9kZV8oX19pdGVyX3BvaW50ZXIoKSksCisgICAgICBfX3BhaXIxXyhfX3NlY29uZF90YWcoKSwgX19ub2RlX2FsbG9jYXRvcihfX2EpKSwKKyAgICAgIF9fcGFpcjNfKDAsIF9fY29tcCkKK3sKKyAgICBfX2JlZ2luX25vZGUoKSA9IF9fZW5kX25vZGUoKTsKK30KKworLy8gUHJlY29uZGl0aW9uOiAgc2l6ZSgpICE9IDAKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX25vZGVfcG9pbnRlcgorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX2RldGFjaCgpCit7CisgICAgX19ub2RlX3BvaW50ZXIgX19jYWNoZSA9IHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX2JlZ2luX25vZGUoKSk7CisgICAgX19iZWdpbl9ub2RlKCkgPSBfX2VuZF9ub2RlKCk7CisgICAgX19lbmRfbm9kZSgpLT5fX2xlZnRfLT5fX3BhcmVudF8gPSBudWxscHRyOworICAgIF9fZW5kX25vZGUoKS0+X19sZWZ0XyA9IG51bGxwdHI7CisgICAgc2l6ZSgpID0gMDsKKyAgICAvLyBfX2NhY2hlLT5fX2xlZnRfID09IG51bGxwdHIKKyAgICBpZiAoX19jYWNoZS0+X19yaWdodF8gIT0gbnVsbHB0cikKKyAgICAgICAgX19jYWNoZSA9IHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX2NhY2hlLT5fX3JpZ2h0Xyk7CisgICAgLy8gX19jYWNoZS0+X19sZWZ0XyA9PSBudWxscHRyCisgICAgLy8gX19jYWNoZS0+X19yaWdodF8gPT0gbnVsbHB0cgorICAgIHJldHVybiBfX2NhY2hlOworfQorCisvLyBQcmVjb25kaXRpb246ICBfX2NhY2hlICE9IG51bGxwdHIKKy8vICAgIF9fY2FjaGUtPmxlZnRfID09IG51bGxwdHIKKy8vICAgIF9fY2FjaGUtPnJpZ2h0XyA9PSBudWxscHRyCisvLyAgICBUaGlzIGlzIG5vIGxvbmdlciBhIHJlZC1ibGFjayB0cmVlCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIF9fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6X19ub2RlX3BvaW50ZXIKK19fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6X19kZXRhY2goX19ub2RlX3BvaW50ZXIgX19jYWNoZSkKK3sKKyAgICBpZiAoX19jYWNoZS0+X19wYXJlbnRfID09IG51bGxwdHIpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIGlmIChfX3RyZWVfaXNfbGVmdF9jaGlsZChzdGF0aWNfY2FzdDxfX25vZGVfYmFzZV9wb2ludGVyPihfX2NhY2hlKSkpCisgICAgeworICAgICAgICBfX2NhY2hlLT5fX3BhcmVudF8tPl9fbGVmdF8gPSBudWxscHRyOworICAgICAgICBfX2NhY2hlID0gc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9fY2FjaGUtPl9fcGFyZW50Xyk7CisgICAgICAgIGlmIChfX2NhY2hlLT5fX3JpZ2h0XyA9PSBudWxscHRyKQorICAgICAgICAgICAgcmV0dXJuIF9fY2FjaGU7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX190cmVlX2xlYWYoX19jYWNoZS0+X19yaWdodF8pKTsKKyAgICB9CisgICAgLy8gX19jYWNoZSBpcyByaWdodCBjaGlsZAorICAgIF9fY2FjaGUtPl9fcGFyZW50X3Vuc2FmZSgpLT5fX3JpZ2h0XyA9IG51bGxwdHI7CisgICAgX19jYWNoZSA9IHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX2NhY2hlLT5fX3BhcmVudF8pOworICAgIGlmIChfX2NhY2hlLT5fX2xlZnRfID09IG51bGxwdHIpCisgICAgICAgIHJldHVybiBfX2NhY2hlOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX190cmVlX2xlYWYoX19jYWNoZS0+X19sZWZ0XykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KK19fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYKK19fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6b3BlcmF0b3I9KGNvbnN0IF9fdHJlZSYgX190KQoreworICAgIGlmICh0aGlzICE9ICZfX3QpCisgICAgeworICAgICAgICB2YWx1ZV9jb21wKCkgPSBfX3QudmFsdWVfY29tcCgpOworICAgICAgICBfX2NvcHlfYXNzaWduX2FsbG9jKF9fdCk7CisgICAgICAgIF9fYXNzaWduX211bHRpKF9fdC5iZWdpbigpLCBfX3QuZW5kKCkpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordm9pZAorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX2Fzc2lnbl91bmlxdWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQoreworICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPiBfSVRyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9JVHJhaXRzOjp2YWx1ZV90eXBlIF9JdFZhbHVlVHlwZTsKKyAgICBzdGF0aWNfYXNzZXJ0KChpc19zYW1lPF9JdFZhbHVlVHlwZSwgX19jb250YWluZXJfdmFsdWVfdHlwZT46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICJfX2Fzc2lnbl91bmlxdWUgbWF5IG9ubHkgYmUgY2FsbGVkIHdpdGggdGhlIGNvbnRhaW5lcnMgdmFsdWUgdHlwZSIpOworCisgICAgaWYgKHNpemUoKSAhPSAwKQorICAgIHsKKyAgICAgICAgX19ub2RlX3BvaW50ZXIgX19jYWNoZSA9IF9fZGV0YWNoKCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0cnkKKyAgICAgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIGZvciAoOyBfX2NhY2hlICE9IG51bGxwdHIgJiYgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX2NhY2hlLT5fX3ZhbHVlXyA9ICpfX2ZpcnN0OworICAgICAgICAgICAgICAgIF9fbm9kZV9wb2ludGVyIF9fbmV4dCA9IF9fZGV0YWNoKF9fY2FjaGUpOworICAgICAgICAgICAgICAgIF9fbm9kZV9pbnNlcnRfdW5pcXVlKF9fY2FjaGUpOworICAgICAgICAgICAgICAgIF9fY2FjaGUgPSBfX25leHQ7CisgICAgICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB9CisgICAgICAgIGNhdGNoICguLi4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChfX2NhY2hlLT5fX3BhcmVudF8gIT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICBfX2NhY2hlID0gc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9fY2FjaGUtPl9fcGFyZW50Xyk7CisgICAgICAgICAgICBkZXN0cm95KF9fY2FjaGUpOworICAgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIGlmIChfX2NhY2hlICE9IG51bGxwdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChfX2NhY2hlLT5fX3BhcmVudF8gIT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICBfX2NhY2hlID0gc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9fY2FjaGUtPl9fcGFyZW50Xyk7CisgICAgICAgICAgICBkZXN0cm95KF9fY2FjaGUpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICBfX2luc2VydF91bmlxdWUoKl9fZmlyc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3ZvaWQKK19fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6X19hc3NpZ25fbXVsdGkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQoreworICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPiBfSVRyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9JVHJhaXRzOjp2YWx1ZV90eXBlIF9JdFZhbHVlVHlwZTsKKyAgICBzdGF0aWNfYXNzZXJ0KChpc19zYW1lPF9JdFZhbHVlVHlwZSwgX19jb250YWluZXJfdmFsdWVfdHlwZT46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICBpc19zYW1lPF9JdFZhbHVlVHlwZSwgX19ub2RlX3ZhbHVlX3R5cGU+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAiX19hc3NpZ25fbXVsdGkgbWF5IG9ubHkgYmUgY2FsbGVkIHdpdGggdGhlIGNvbnRhaW5lcnMgdmFsdWUgdHlwZSIKKyAgICAgICAgICAgICAgICAgICIgb3IgdGhlIG5vZGVzIHZhbHVlIHR5cGUiKTsKKyAgICBpZiAoc2l6ZSgpICE9IDApCisgICAgeworICAgICAgICBfX25vZGVfcG9pbnRlciBfX2NhY2hlID0gX19kZXRhY2goKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHRyeQorICAgICAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgZm9yICg7IF9fY2FjaGUgIT0gbnVsbHB0ciAmJiBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fY2FjaGUtPl9fdmFsdWVfID0gKl9fZmlyc3Q7CisgICAgICAgICAgICAgICAgX19ub2RlX3BvaW50ZXIgX19uZXh0ID0gX19kZXRhY2goX19jYWNoZSk7CisgICAgICAgICAgICAgICAgX19ub2RlX2luc2VydF9tdWx0aShfX2NhY2hlKTsKKyAgICAgICAgICAgICAgICBfX2NhY2hlID0gX19uZXh0OworICAgICAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoLi4uKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoX19jYWNoZS0+X19wYXJlbnRfICE9IG51bGxwdHIpCisgICAgICAgICAgICAgICAgX19jYWNoZSA9IHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX2NhY2hlLT5fX3BhcmVudF8pOworICAgICAgICAgICAgZGVzdHJveShfX2NhY2hlKTsKKyAgICAgICAgICAgIHRocm93OworICAgICAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICBpZiAoX19jYWNoZSAhPSBudWxscHRyKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoX19jYWNoZS0+X19wYXJlbnRfICE9IG51bGxwdHIpCisgICAgICAgICAgICAgICAgX19jYWNoZSA9IHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX2NhY2hlLT5fX3BhcmVudF8pOworICAgICAgICAgICAgZGVzdHJveShfX2NhY2hlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgX19pbnNlcnRfbXVsdGkoX05vZGVUeXBlczo6X19nZXRfdmFsdWUoKl9fZmlyc3QpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fdHJlZShjb25zdCBfX3RyZWUmIF9fdCkKKyAgICA6IF9fYmVnaW5fbm9kZV8oX19pdGVyX3BvaW50ZXIoKSksCisgICAgICBfX3BhaXIxXyhfX3NlY29uZF90YWcoKSwgX19ub2RlX3RyYWl0czo6c2VsZWN0X29uX2NvbnRhaW5lcl9jb3B5X2NvbnN0cnVjdGlvbihfX3QuX19ub2RlX2FsbG9jKCkpKSwKKyAgICAgIF9fcGFpcjNfKDAsIF9fdC52YWx1ZV9jb21wKCkpCit7CisgICAgX19iZWdpbl9ub2RlKCkgPSBfX2VuZF9ub2RlKCk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX3RyZWUoX190cmVlJiYgX190KQorICAgIF9OT0VYQ0VQVF8oCisgICAgICAgIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPF9fbm9kZV9hbGxvY2F0b3I+Ojp2YWx1ZSAmJgorICAgICAgICBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTx2YWx1ZV9jb21wYXJlPjo6dmFsdWUpCisgICAgOiBfX2JlZ2luX25vZGVfKF9WU1REOjptb3ZlKF9fdC5fX2JlZ2luX25vZGVfKSksCisgICAgICBfX3BhaXIxXyhfVlNURDo6bW92ZShfX3QuX19wYWlyMV8pKSwKKyAgICAgIF9fcGFpcjNfKF9WU1REOjptb3ZlKF9fdC5fX3BhaXIzXykpCit7CisgICAgaWYgKHNpemUoKSA9PSAwKQorICAgICAgICBfX2JlZ2luX25vZGUoKSA9IF9fZW5kX25vZGUoKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBfX2VuZF9ub2RlKCktPl9fbGVmdF8tPl9fcGFyZW50XyA9IHN0YXRpY19jYXN0PF9fcGFyZW50X3BvaW50ZXI+KF9fZW5kX25vZGUoKSk7CisgICAgICAgIF9fdC5fX2JlZ2luX25vZGUoKSA9IF9fdC5fX2VuZF9ub2RlKCk7CisgICAgICAgIF9fdC5fX2VuZF9ub2RlKCktPl9fbGVmdF8gPSBudWxscHRyOworICAgICAgICBfX3Quc2l6ZSgpID0gMDsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX3RyZWUoX190cmVlJiYgX190LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX19wYWlyMV8oX19zZWNvbmRfdGFnKCksIF9fbm9kZV9hbGxvY2F0b3IoX19hKSksCisgICAgICBfX3BhaXIzXygwLCBfVlNURDo6bW92ZShfX3QudmFsdWVfY29tcCgpKSkKK3sKKyAgICBpZiAoX19hID09IF9fdC5fX2FsbG9jKCkpCisgICAgeworICAgICAgICBpZiAoX190LnNpemUoKSA9PSAwKQorICAgICAgICAgICAgX19iZWdpbl9ub2RlKCkgPSBfX2VuZF9ub2RlKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX19iZWdpbl9ub2RlKCkgPSBfX3QuX19iZWdpbl9ub2RlKCk7CisgICAgICAgICAgICBfX2VuZF9ub2RlKCktPl9fbGVmdF8gPSBfX3QuX19lbmRfbm9kZSgpLT5fX2xlZnRfOworICAgICAgICAgICAgX19lbmRfbm9kZSgpLT5fX2xlZnRfLT5fX3BhcmVudF8gPSBzdGF0aWNfY2FzdDxfX3BhcmVudF9wb2ludGVyPihfX2VuZF9ub2RlKCkpOworICAgICAgICAgICAgc2l6ZSgpID0gX190LnNpemUoKTsKKyAgICAgICAgICAgIF9fdC5fX2JlZ2luX25vZGUoKSA9IF9fdC5fX2VuZF9ub2RlKCk7CisgICAgICAgICAgICBfX3QuX19lbmRfbm9kZSgpLT5fX2xlZnRfID0gbnVsbHB0cjsKKyAgICAgICAgICAgIF9fdC5zaXplKCkgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIF9fYmVnaW5fbm9kZSgpID0gX19lbmRfbm9kZSgpOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fbW92ZV9hc3NpZ24oX190cmVlJiBfX3QsIHRydWVfdHlwZSkKKyAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPHZhbHVlX2NvbXBhcmU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8X19ub2RlX2FsbG9jYXRvcj46OnZhbHVlKQoreworICAgIGRlc3Ryb3koc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9fZW5kX25vZGUoKS0+X19sZWZ0XykpOworICAgIF9fYmVnaW5fbm9kZV8gPSBfX3QuX19iZWdpbl9ub2RlXzsKKyAgICBfX3BhaXIxXy5maXJzdCgpID0gX190Ll9fcGFpcjFfLmZpcnN0KCk7CisgICAgX19tb3ZlX2Fzc2lnbl9hbGxvYyhfX3QpOworICAgIF9fcGFpcjNfID0gX1ZTVEQ6Om1vdmUoX190Ll9fcGFpcjNfKTsKKyAgICBpZiAoc2l6ZSgpID09IDApCisgICAgICAgIF9fYmVnaW5fbm9kZSgpID0gX19lbmRfbm9kZSgpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIF9fZW5kX25vZGUoKS0+X19sZWZ0Xy0+X19wYXJlbnRfID0gc3RhdGljX2Nhc3Q8X19wYXJlbnRfcG9pbnRlcj4oX19lbmRfbm9kZSgpKTsKKyAgICAgICAgX190Ll9fYmVnaW5fbm9kZSgpID0gX190Ll9fZW5kX25vZGUoKTsKKyAgICAgICAgX190Ll9fZW5kX25vZGUoKS0+X19sZWZ0XyA9IG51bGxwdHI7CisgICAgICAgIF9fdC5zaXplKCkgPSAwOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fbW92ZV9hc3NpZ24oX190cmVlJiBfX3QsIGZhbHNlX3R5cGUpCit7CisgICAgaWYgKF9fbm9kZV9hbGxvYygpID09IF9fdC5fX25vZGVfYWxsb2MoKSkKKyAgICAgICAgX19tb3ZlX2Fzc2lnbihfX3QsIHRydWVfdHlwZSgpKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICB2YWx1ZV9jb21wKCkgPSBfVlNURDo6bW92ZShfX3QudmFsdWVfY29tcCgpKTsKKyAgICAgICAgY29uc3RfaXRlcmF0b3IgX19lID0gZW5kKCk7CisgICAgICAgIGlmIChzaXplKCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgX19ub2RlX3BvaW50ZXIgX19jYWNoZSA9IF9fZGV0YWNoKCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgICAgIHdoaWxlIChfX2NhY2hlICE9IG51bGxwdHIgJiYgX190LnNpemUoKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX19jYWNoZS0+X192YWx1ZV8gPSBfVlNURDo6bW92ZShfX3QucmVtb3ZlKF9fdC5iZWdpbigpKS0+X192YWx1ZV8pOworICAgICAgICAgICAgICAgICAgICBfX25vZGVfcG9pbnRlciBfX25leHQgPSBfX2RldGFjaChfX2NhY2hlKTsKKyAgICAgICAgICAgICAgICAgICAgX19ub2RlX2luc2VydF9tdWx0aShfX2NhY2hlKTsKKyAgICAgICAgICAgICAgICAgICAgX19jYWNoZSA9IF9fbmV4dDsKKyAgICAgICAgICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKC4uLikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoX19jYWNoZS0+X19wYXJlbnRfICE9IG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgIF9fY2FjaGUgPSBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19jYWNoZS0+X19wYXJlbnRfKTsKKyAgICAgICAgICAgICAgICBkZXN0cm95KF9fY2FjaGUpOworICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIGlmIChfX2NhY2hlICE9IG51bGxwdHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKF9fY2FjaGUtPl9fcGFyZW50XyAhPSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICBfX2NhY2hlID0gc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9fY2FjaGUtPl9fcGFyZW50Xyk7CisgICAgICAgICAgICAgICAgZGVzdHJveShfX2NhY2hlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoX190LnNpemUoKSAhPSAwKQorICAgICAgICAgICAgX19pbnNlcnRfbXVsdGkoX19lLCBfTm9kZVR5cGVzOjpfX21vdmUoX190LnJlbW92ZShfX3QuYmVnaW4oKSktPl9fdmFsdWVfKSk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KK19fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYKK19fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6b3BlcmF0b3I9KF9fdHJlZSYmIF9fdCkKKyAgICBfTk9FWENFUFRfKAorICAgICAgICBfX25vZGVfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWUgJiYKKyAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8dmFsdWVfY29tcGFyZT46OnZhbHVlICYmCisgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPF9fbm9kZV9hbGxvY2F0b3I+Ojp2YWx1ZSkKKyAgICAgICAgCit7CisgICAgX19tb3ZlX2Fzc2lnbihfX3QsIGludGVncmFsX2NvbnN0YW50PGJvb2wsCisgICAgICAgICAgICAgICAgICBfX25vZGVfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWU+KCkpOworICAgIHJldHVybiAqdGhpczsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46On5fX3RyZWUoKQoreworICAgIHN0YXRpY19hc3NlcnQoKGlzX2NvcHlfY29uc3RydWN0aWJsZTx2YWx1ZV9jb21wYXJlPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAiQ29tcGFyYXRvciBtdXN0IGJlIGNvcHktY29uc3RydWN0aWJsZS4iKTsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgc3RhdGljX2Fzc2VydCgoX19kaWFnbm9zZV90cmVlX2hlbHBlcjxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6CisgICAgICAgICAgICAgICAgICAgICBfX3RyaWdnZXJfZGlhZ25vc3RpY3MoKSksICIiKTsKKyNlbmRpZgorICBkZXN0cm95KF9fcm9vdCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46OmRlc3Ryb3koX19ub2RlX3BvaW50ZXIgX19uZCkgX05PRVhDRVBUCit7CisgICAgaWYgKF9fbmQgIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIGRlc3Ryb3koc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9fbmQtPl9fbGVmdF8pKTsKKyAgICAgICAgZGVzdHJveShzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19uZC0+X19yaWdodF8pKTsKKyAgICAgICAgX19ub2RlX2FsbG9jYXRvciYgX19uYSA9IF9fbm9kZV9hbGxvYygpOworICAgICAgICBfX25vZGVfdHJhaXRzOjpkZXN0cm95KF9fbmEsIF9Ob2RlVHlwZXM6Ol9fZ2V0X3B0cihfX25kLT5fX3ZhbHVlXykpOworICAgICAgICBfX25vZGVfdHJhaXRzOjpkZWFsbG9jYXRlKF9fbmEsIF9fbmQsIDEpOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46OnN3YXAoX190cmVlJiBfX3QpCisjaWYgX0xJQkNQUF9TVERfVkVSIDw9IDExCisgICAgICAgIF9OT0VYQ0VQVF8oCisgICAgICAgICAgICBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPHZhbHVlX2NvbXBhcmU+Ojp2YWx1ZQorICAgICAgICAgICAgJiYgKCFfX25vZGVfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXA6OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgIF9faXNfbm90aHJvd19zd2FwcGFibGU8X19ub2RlX2FsbG9jYXRvcj46OnZhbHVlKQorICAgICAgICAgICAgKQorI2Vsc2UKKyAgICAgICAgX05PRVhDRVBUXyhfX2lzX25vdGhyb3dfc3dhcHBhYmxlPHZhbHVlX2NvbXBhcmU+Ojp2YWx1ZSkKKyNlbmRpZgoreworICAgIHVzaW5nIF9WU1REOjpzd2FwOworICAgIHN3YXAoX19iZWdpbl9ub2RlXywgX190Ll9fYmVnaW5fbm9kZV8pOworICAgIHN3YXAoX19wYWlyMV8uZmlyc3QoKSwgX190Ll9fcGFpcjFfLmZpcnN0KCkpOworICAgIF9fc3dhcF9hbGxvY2F0b3IoX19ub2RlX2FsbG9jKCksIF9fdC5fX25vZGVfYWxsb2MoKSk7CisgICAgX19wYWlyM18uc3dhcChfX3QuX19wYWlyM18pOworICAgIGlmIChzaXplKCkgPT0gMCkKKyAgICAgICAgX19iZWdpbl9ub2RlKCkgPSBfX2VuZF9ub2RlKCk7CisgICAgZWxzZQorICAgICAgICBfX2VuZF9ub2RlKCktPl9fbGVmdF8tPl9fcGFyZW50XyA9IHN0YXRpY19jYXN0PF9fcGFyZW50X3BvaW50ZXI+KF9fZW5kX25vZGUoKSk7CisgICAgaWYgKF9fdC5zaXplKCkgPT0gMCkKKyAgICAgICAgX190Ll9fYmVnaW5fbm9kZSgpID0gX190Ll9fZW5kX25vZGUoKTsKKyAgICBlbHNlCisgICAgICAgIF9fdC5fX2VuZF9ub2RlKCktPl9fbGVmdF8tPl9fcGFyZW50XyA9IHN0YXRpY19jYXN0PF9fcGFyZW50X3BvaW50ZXI+KF9fdC5fX2VuZF9ub2RlKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK19fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6Y2xlYXIoKSBfTk9FWENFUFQKK3sKKyAgICBkZXN0cm95KF9fcm9vdCgpKTsKKyAgICBzaXplKCkgPSAwOworICAgIF9fYmVnaW5fbm9kZSgpID0gX19lbmRfbm9kZSgpOworICAgIF9fZW5kX25vZGUoKS0+X19sZWZ0XyA9IG51bGxwdHI7Cit9CisKKy8vIEZpbmQgbG93ZXJfYm91bmQgcGxhY2UgdG8gaW5zZXJ0CisvLyBTZXQgX19wYXJlbnQgdG8gcGFyZW50IG9mIG51bGwgbGVhZgorLy8gUmV0dXJuIHJlZmVyZW5jZSB0byBudWxsIGxlYWYKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX25vZGVfYmFzZV9wb2ludGVyJgorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX2ZpbmRfbGVhZl9sb3coX19wYXJlbnRfcG9pbnRlciYgX19wYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfdHlwZSYgX192KQoreworICAgIF9fbm9kZV9wb2ludGVyIF9fbmQgPSBfX3Jvb3QoKTsKKyAgICBpZiAoX19uZCAhPSBudWxscHRyKQorICAgIHsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZV9jb21wKCkoX19uZC0+X192YWx1ZV8sIF9fdikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9fbmQtPl9fcmlnaHRfICE9IG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgIF9fbmQgPSBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19uZC0+X19yaWdodF8pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9fcGFyZW50ID0gc3RhdGljX2Nhc3Q8X19wYXJlbnRfcG9pbnRlcj4oX19uZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX25kLT5fX3JpZ2h0XzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9fbmQtPl9fbGVmdF8gIT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgX19uZCA9IHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX25kLT5fX2xlZnRfKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX3BhcmVudCA9IHN0YXRpY19jYXN0PF9fcGFyZW50X3BvaW50ZXI+KF9fbmQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19wYXJlbnQtPl9fbGVmdF87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIF9fcGFyZW50ID0gc3RhdGljX2Nhc3Q8X19wYXJlbnRfcG9pbnRlcj4oX19lbmRfbm9kZSgpKTsKKyAgICByZXR1cm4gX19wYXJlbnQtPl9fbGVmdF87Cit9CisKKy8vIEZpbmQgdXBwZXJfYm91bmQgcGxhY2UgdG8gaW5zZXJ0CisvLyBTZXQgX19wYXJlbnQgdG8gcGFyZW50IG9mIG51bGwgbGVhZgorLy8gUmV0dXJuIHJlZmVyZW5jZSB0byBudWxsIGxlYWYKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX25vZGVfYmFzZV9wb2ludGVyJgorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX2ZpbmRfbGVhZl9oaWdoKF9fcGFyZW50X3BvaW50ZXImIF9fcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV90eXBlJiBfX3YpCit7CisgICAgX19ub2RlX3BvaW50ZXIgX19uZCA9IF9fcm9vdCgpOworICAgIGlmIChfX25kICE9IG51bGxwdHIpCisgICAgeworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZhbHVlX2NvbXAoKShfX3YsIF9fbmQtPl9fdmFsdWVfKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX19uZC0+X19sZWZ0XyAhPSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICBfX25kID0gc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9fbmQtPl9fbGVmdF8pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9fcGFyZW50ID0gc3RhdGljX2Nhc3Q8X19wYXJlbnRfcG9pbnRlcj4oX19uZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX3BhcmVudC0+X19sZWZ0XzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9fbmQtPl9fcmlnaHRfICE9IG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgIF9fbmQgPSBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19uZC0+X19yaWdodF8pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9fcGFyZW50ID0gc3RhdGljX2Nhc3Q8X19wYXJlbnRfcG9pbnRlcj4oX19uZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX25kLT5fX3JpZ2h0XzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgX19wYXJlbnQgPSBzdGF0aWNfY2FzdDxfX3BhcmVudF9wb2ludGVyPihfX2VuZF9ub2RlKCkpOworICAgIHJldHVybiBfX3BhcmVudC0+X19sZWZ0XzsKK30KKworLy8gRmluZCBsZWFmIHBsYWNlIHRvIGluc2VydCBjbG9zZXN0IHRvIF9faGludAorLy8gRmlyc3QgY2hlY2sgcHJpb3IgdG8gX19oaW50LgorLy8gTmV4dCBjaGVjayBhZnRlciBfX2hpbnQuCisvLyBOZXh0IGRvIE8obG9nIE4pIHNlYXJjaC4KKy8vIFNldCBfX3BhcmVudCB0byBwYXJlbnQgb2YgbnVsbCBsZWFmCisvLyBSZXR1cm4gcmVmZXJlbmNlIHRvIG51bGwgbGVhZgordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fbm9kZV9iYXNlX3BvaW50ZXImCitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fZmluZF9sZWFmKGNvbnN0X2l0ZXJhdG9yIF9faGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wYXJlbnRfcG9pbnRlciYgX19wYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV90eXBlJiBfX3YpCit7CisgICAgaWYgKF9faGludCA9PSBlbmQoKSB8fCAhdmFsdWVfY29tcCgpKCpfX2hpbnQsIF9fdikpICAvLyBjaGVjayBiZWZvcmUKKyAgICB7CisgICAgICAgIC8vIF9fdiA8PSAqX19oaW50CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fcHJpb3IgPSBfX2hpbnQ7CisgICAgICAgIGlmIChfX3ByaW9yID09IGJlZ2luKCkgfHwgIXZhbHVlX2NvbXAoKShfX3YsICotLV9fcHJpb3IpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyAqcHJldihfX2hpbnQpIDw9IF9fdiA8PSAqX19oaW50CisgICAgICAgICAgICBpZiAoX19oaW50Ll9fcHRyXy0+X19sZWZ0XyA9PSBudWxscHRyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fcGFyZW50ID0gc3RhdGljX2Nhc3Q8X19wYXJlbnRfcG9pbnRlcj4oX19oaW50Ll9fcHRyXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9fcGFyZW50LT5fX2xlZnRfOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fcGFyZW50ID0gc3RhdGljX2Nhc3Q8X19wYXJlbnRfcG9pbnRlcj4oX19wcmlvci5fX3B0cl8pOworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxfX25vZGVfYmFzZV9wb2ludGVyPihfX3ByaW9yLl9fcHRyXyktPl9fcmlnaHRfOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIF9fdiA8ICpwcmV2KF9faGludCkKKyAgICAgICAgcmV0dXJuIF9fZmluZF9sZWFmX2hpZ2goX19wYXJlbnQsIF9fdik7CisgICAgfQorICAgIC8vIGVsc2UgX192ID4gKl9faGludAorICAgIHJldHVybiBfX2ZpbmRfbGVhZl9sb3coX19wYXJlbnQsIF9fdik7Cit9CisKKy8vIEZpbmQgcGxhY2UgdG8gaW5zZXJ0IGlmIF9fdiBkb2Vzbid0IGV4aXN0CisvLyBTZXQgX19wYXJlbnQgdG8gcGFyZW50IG9mIG51bGwgbGVhZgorLy8gUmV0dXJuIHJlZmVyZW5jZSB0byBudWxsIGxlYWYKKy8vIElmIF9fdiBleGlzdHMsIHNldCBwYXJlbnQgdG8gbm9kZSBvZiBfX3YgYW5kIHJldHVybiByZWZlcmVuY2UgdG8gbm9kZSBvZiBfX3YKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9LZXk+Cit0eXBlbmFtZSBfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fbm9kZV9iYXNlX3BvaW50ZXImCitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fZmluZF9lcXVhbChfX3BhcmVudF9wb2ludGVyJiBfX3BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9LZXkmIF9fdikKK3sKKyAgICBfX25vZGVfcG9pbnRlciBfX25kID0gX19yb290KCk7CisgICAgX19ub2RlX2Jhc2VfcG9pbnRlciogX19uZF9wdHIgPSBfX3Jvb3RfcHRyKCk7CisgICAgaWYgKF9fbmQgIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmFsdWVfY29tcCgpKF9fdiwgX19uZC0+X192YWx1ZV8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfX25kLT5fX2xlZnRfICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgX19uZF9wdHIgPSBfVlNURDo6YWRkcmVzc29mKF9fbmQtPl9fbGVmdF8pOworICAgICAgICAgICAgICAgICAgICBfX25kID0gc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9fbmQtPl9fbGVmdF8pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIF9fcGFyZW50ID0gc3RhdGljX2Nhc3Q8X19wYXJlbnRfcG9pbnRlcj4oX19uZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX3BhcmVudC0+X19sZWZ0XzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZV9jb21wKCkoX19uZC0+X192YWx1ZV8sIF9fdikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9fbmQtPl9fcmlnaHRfICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgX19uZF9wdHIgPSBfVlNURDo6YWRkcmVzc29mKF9fbmQtPl9fcmlnaHRfKTsKKyAgICAgICAgICAgICAgICAgICAgX19uZCA9IHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX25kLT5fX3JpZ2h0Xyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgX19wYXJlbnQgPSBzdGF0aWNfY2FzdDxfX3BhcmVudF9wb2ludGVyPihfX25kKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fbmQtPl9fcmlnaHRfOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX3BhcmVudCA9IHN0YXRpY19jYXN0PF9fcGFyZW50X3BvaW50ZXI+KF9fbmQpOworICAgICAgICAgICAgICAgIHJldHVybiAqX19uZF9wdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgX19wYXJlbnQgPSBzdGF0aWNfY2FzdDxfX3BhcmVudF9wb2ludGVyPihfX2VuZF9ub2RlKCkpOworICAgIHJldHVybiBfX3BhcmVudC0+X19sZWZ0XzsKK30KKworLy8gRmluZCBwbGFjZSB0byBpbnNlcnQgaWYgX192IGRvZXNuJ3QgZXhpc3QKKy8vIEZpcnN0IGNoZWNrIHByaW9yIHRvIF9faGludC4KKy8vIE5leHQgY2hlY2sgYWZ0ZXIgX19oaW50LgorLy8gTmV4dCBkbyBPKGxvZyBOKSBzZWFyY2guCisvLyBTZXQgX19wYXJlbnQgdG8gcGFyZW50IG9mIG51bGwgbGVhZgorLy8gUmV0dXJuIHJlZmVyZW5jZSB0byBudWxsIGxlYWYKKy8vIElmIF9fdiBleGlzdHMsIHNldCBwYXJlbnQgdG8gbm9kZSBvZiBfX3YgYW5kIHJldHVybiByZWZlcmVuY2UgdG8gbm9kZSBvZiBfX3YKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9LZXk+Cit0eXBlbmFtZSBfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fbm9kZV9iYXNlX3BvaW50ZXImCitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fZmluZF9lcXVhbChjb25zdF9pdGVyYXRvciBfX2hpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3BhcmVudF9wb2ludGVyJiBfX3BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbm9kZV9iYXNlX3BvaW50ZXImIF9fZHVtbXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfS2V5JiBfX3YpCit7CisgICAgaWYgKF9faGludCA9PSBlbmQoKSB8fCB2YWx1ZV9jb21wKCkoX192LCAqX19oaW50KSkgIC8vIGNoZWNrIGJlZm9yZQorICAgIHsKKyAgICAgICAgLy8gX192IDwgKl9faGludAorICAgICAgICBjb25zdF9pdGVyYXRvciBfX3ByaW9yID0gX19oaW50OworICAgICAgICBpZiAoX19wcmlvciA9PSBiZWdpbigpIHx8IHZhbHVlX2NvbXAoKSgqLS1fX3ByaW9yLCBfX3YpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyAqcHJldihfX2hpbnQpIDwgX192IDwgKl9faGludAorICAgICAgICAgICAgaWYgKF9faGludC5fX3B0cl8tPl9fbGVmdF8gPT0gbnVsbHB0cikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX3BhcmVudCA9IHN0YXRpY19jYXN0PF9fcGFyZW50X3BvaW50ZXI+KF9faGludC5fX3B0cl8pOworICAgICAgICAgICAgICAgIHJldHVybiBfX3BhcmVudC0+X19sZWZ0XzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX3BhcmVudCA9IHN0YXRpY19jYXN0PF9fcGFyZW50X3BvaW50ZXI+KF9fcHJpb3IuX19wdHJfKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X19ub2RlX2Jhc2VfcG9pbnRlcj4oX19wcmlvci5fX3B0cl8pLT5fX3JpZ2h0XzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBfX3YgPD0gKnByZXYoX19oaW50KQorICAgICAgICByZXR1cm4gX19maW5kX2VxdWFsKF9fcGFyZW50LCBfX3YpOworICAgIH0KKyAgICBlbHNlIGlmICh2YWx1ZV9jb21wKCkoKl9faGludCwgX192KSkgIC8vIGNoZWNrIGFmdGVyCisgICAgeworICAgICAgICAvLyAqX19oaW50IDwgX192CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fbmV4dCA9IF9WU1REOjpuZXh0KF9faGludCk7CisgICAgICAgIGlmIChfX25leHQgPT0gZW5kKCkgfHwgdmFsdWVfY29tcCgpKF9fdiwgKl9fbmV4dCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICpfX2hpbnQgPCBfX3YgPCAqX1ZTVEQ6Om5leHQoX19oaW50KQorICAgICAgICAgICAgaWYgKF9faGludC5fX2dldF9ucCgpLT5fX3JpZ2h0XyA9PSBudWxscHRyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fcGFyZW50ID0gc3RhdGljX2Nhc3Q8X19wYXJlbnRfcG9pbnRlcj4oX19oaW50Ll9fcHRyXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9fbm9kZV9iYXNlX3BvaW50ZXI+KF9faGludC5fX3B0cl8pLT5fX3JpZ2h0XzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX3BhcmVudCA9IHN0YXRpY19jYXN0PF9fcGFyZW50X3BvaW50ZXI+KF9fbmV4dC5fX3B0cl8pOworICAgICAgICAgICAgICAgIHJldHVybiBfX3BhcmVudC0+X19sZWZ0XzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyAqbmV4dChfX2hpbnQpIDw9IF9fdgorICAgICAgICByZXR1cm4gX19maW5kX2VxdWFsKF9fcGFyZW50LCBfX3YpOworICAgIH0KKyAgICAvLyBlbHNlIF9fdiA9PSAqX19oaW50CisgICAgX19wYXJlbnQgPSBzdGF0aWNfY2FzdDxfX3BhcmVudF9wb2ludGVyPihfX2hpbnQuX19wdHJfKTsKKyAgICBfX2R1bW15ID0gc3RhdGljX2Nhc3Q8X19ub2RlX2Jhc2VfcG9pbnRlcj4oX19oaW50Ll9fcHRyXyk7CisgICAgcmV0dXJuIF9fZHVtbXk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX2luc2VydF9ub2RlX2F0KF9fcGFyZW50X3BvaW50ZXIgICAgIF9fcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbm9kZV9iYXNlX3BvaW50ZXImIF9fY2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlX2Jhc2VfcG9pbnRlciAgX19uZXdfbm9kZSkKK3sKKyAgICBfX25ld19ub2RlLT5fX2xlZnRfICAgPSBudWxscHRyOworICAgIF9fbmV3X25vZGUtPl9fcmlnaHRfICA9IG51bGxwdHI7CisgICAgX19uZXdfbm9kZS0+X19wYXJlbnRfID0gX19wYXJlbnQ7CisgICAgLy8gX19uZXdfbm9kZS0+X19pc19ibGFja18gaXMgaW5pdGlhbGl6ZWQgaW4gX190cmVlX2JhbGFuY2VfYWZ0ZXJfaW5zZXJ0CisgICAgX19jaGlsZCA9IF9fbmV3X25vZGU7CisgICAgaWYgKF9fYmVnaW5fbm9kZSgpLT5fX2xlZnRfICE9IG51bGxwdHIpCisgICAgICAgIF9fYmVnaW5fbm9kZSgpID0gc3RhdGljX2Nhc3Q8X19pdGVyX3BvaW50ZXI+KF9fYmVnaW5fbm9kZSgpLT5fX2xlZnRfKTsKKyAgICBfX3RyZWVfYmFsYW5jZV9hZnRlcl9pbnNlcnQoX19lbmRfbm9kZSgpLT5fX2xlZnRfLCBfX2NoaWxkKTsKKyAgICArK3NpemUoKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzLi4uIF9BcmdzPgorcGFpcjx0eXBlbmFtZSBfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Oml0ZXJhdG9yLCBib29sPgorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX2VtcGxhY2VfdW5pcXVlX2tleV9hcmdzKF9LZXkgY29uc3QmIF9faywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0FyZ3M+CitwYWlyPHR5cGVuYW1lIF9fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IsIGJvb2w+CitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fZW1wbGFjZV91bmlxdWVfa2V5X2FyZ3MoX0tleSBjb25zdCYgX19rLCBfQXJncyYgX19hcmdzKQorI2VuZGlmCit7CisgICAgX19wYXJlbnRfcG9pbnRlciBfX3BhcmVudDsKKyAgICBfX25vZGVfYmFzZV9wb2ludGVyJiBfX2NoaWxkID0gX19maW5kX2VxdWFsKF9fcGFyZW50LCBfX2spOworICAgIF9fbm9kZV9wb2ludGVyIF9fciA9IHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX2NoaWxkKTsKKyAgICBib29sIF9faW5zZXJ0ZWQgPSBmYWxzZTsKKyAgICBpZiAoX19jaGlsZCA9PSBudWxscHRyKQorICAgIHsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgICAgIF9fbm9kZV9ob2xkZXIgX19oID0gX19jb25zdHJ1Y3Rfbm9kZShfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisjZWxzZQorICAgICAgICBfX25vZGVfaG9sZGVyIF9faCA9IF9fY29uc3RydWN0X25vZGUoX19hcmdzKTsKKyNlbmRpZgorICAgICAgICBfX2luc2VydF9ub2RlX2F0KF9fcGFyZW50LCBfX2NoaWxkLCBzdGF0aWNfY2FzdDxfX25vZGVfYmFzZV9wb2ludGVyPihfX2guZ2V0KCkpKTsKKyAgICAgICAgX19yID0gX19oLnJlbGVhc2UoKTsKKyAgICAgICAgX19pbnNlcnRlZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcihfX3IpLCBfX2luc2VydGVkKTsKK30KKworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MuLi4gX0FyZ3M+Cit0eXBlbmFtZSBfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fZW1wbGFjZV9oaW50X3VuaXF1ZV9rZXlfYXJncygKKyAgICBjb25zdF9pdGVyYXRvciBfX3AsIF9LZXkgY29uc3QmIF9faywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0FyZ3M+Cit0eXBlbmFtZSBfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fZW1wbGFjZV9oaW50X3VuaXF1ZV9rZXlfYXJncygKKyAgICBjb25zdF9pdGVyYXRvciBfX3AsIF9LZXkgY29uc3QmIF9faywgX0FyZ3MmIF9fYXJncykKKyNlbmRpZgoreworICAgIF9fcGFyZW50X3BvaW50ZXIgX19wYXJlbnQ7CisgICAgX19ub2RlX2Jhc2VfcG9pbnRlciBfX2R1bW15OworICAgIF9fbm9kZV9iYXNlX3BvaW50ZXImIF9fY2hpbGQgPSBfX2ZpbmRfZXF1YWwoX19wLCBfX3BhcmVudCwgX19kdW1teSwgX19rKTsKKyAgICBfX25vZGVfcG9pbnRlciBfX3IgPSBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19jaGlsZCk7CisgICAgaWYgKF9fY2hpbGQgPT0gbnVsbHB0cikKKyAgICB7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgICAgICBfX25vZGVfaG9sZGVyIF9faCA9IF9fY29uc3RydWN0X25vZGUoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworI2Vsc2UKKyAgICAgICAgX19ub2RlX2hvbGRlciBfX2ggPSBfX2NvbnN0cnVjdF9ub2RlKF9fYXJncyk7CisjZW5kaWYKKyAgICAgICAgX19pbnNlcnRfbm9kZV9hdChfX3BhcmVudCwgX19jaGlsZCwgc3RhdGljX2Nhc3Q8X19ub2RlX2Jhc2VfcG9pbnRlcj4oX19oLmdldCgpKSk7CisgICAgICAgIF9fciA9IF9faC5yZWxlYXNlKCk7CisgICAgfQorICAgIHJldHVybiBpdGVyYXRvcihfX3IpOworfQorCisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIC4uLl9BcmdzPgordHlwZW5hbWUgX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX25vZGVfaG9sZGVyCitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fY29uc3RydWN0X25vZGUoX0FyZ3MmJiAuLi5fX2FyZ3MpCit7CisgICAgc3RhdGljX2Fzc2VydCghX19pc190cmVlX3ZhbHVlX3R5cGU8X0FyZ3MuLi4+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJDYW5ub3QgY29uc3RydWN0IGZyb20gX192YWx1ZV90eXBlIik7CisgICAgX19ub2RlX2FsbG9jYXRvciYgX19uYSA9IF9fbm9kZV9hbGxvYygpOworICAgIF9fbm9kZV9ob2xkZXIgX19oKF9fbm9kZV90cmFpdHM6OmFsbG9jYXRlKF9fbmEsIDEpLCBfRHAoX19uYSkpOworICAgIF9fbm9kZV90cmFpdHM6OmNvbnN0cnVjdChfX25hLCBfTm9kZVR5cGVzOjpfX2dldF9wdHIoX19oLT5fX3ZhbHVlXyksIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICBfX2guZ2V0X2RlbGV0ZXIoKS5fX3ZhbHVlX2NvbnN0cnVjdGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gX19oOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorcGFpcjx0eXBlbmFtZSBfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Oml0ZXJhdG9yLCBib29sPgorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX2VtcGxhY2VfdW5pcXVlX2ltcGwoX0FyZ3MmJi4uLiBfX2FyZ3MpCit7CisgICAgX19ub2RlX2hvbGRlciBfX2ggPSBfX2NvbnN0cnVjdF9ub2RlKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICBfX3BhcmVudF9wb2ludGVyIF9fcGFyZW50OworICAgIF9fbm9kZV9iYXNlX3BvaW50ZXImIF9fY2hpbGQgPSBfX2ZpbmRfZXF1YWwoX19wYXJlbnQsIF9faC0+X192YWx1ZV8pOworICAgIF9fbm9kZV9wb2ludGVyIF9fciA9IHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX2NoaWxkKTsKKyAgICBib29sIF9faW5zZXJ0ZWQgPSBmYWxzZTsKKyAgICBpZiAoX19jaGlsZCA9PSBudWxscHRyKQorICAgIHsKKyAgICAgICAgX19pbnNlcnRfbm9kZV9hdChfX3BhcmVudCwgX19jaGlsZCwgc3RhdGljX2Nhc3Q8X19ub2RlX2Jhc2VfcG9pbnRlcj4oX19oLmdldCgpKSk7CisgICAgICAgIF9fciA9IF9faC5yZWxlYXNlKCk7CisgICAgICAgIF9faW5zZXJ0ZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gcGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoX19yKSwgX19pbnNlcnRlZCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgordHlwZW5hbWUgX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX2VtcGxhY2VfaGludF91bmlxdWVfaW1wbChjb25zdF9pdGVyYXRvciBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQoreworICAgIF9fbm9kZV9ob2xkZXIgX19oID0gX19jb25zdHJ1Y3Rfbm9kZShfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgX19wYXJlbnRfcG9pbnRlciBfX3BhcmVudDsKKyAgICBfX25vZGVfYmFzZV9wb2ludGVyIF9fZHVtbXk7CisgICAgX19ub2RlX2Jhc2VfcG9pbnRlciYgX19jaGlsZCA9IF9fZmluZF9lcXVhbChfX3AsIF9fcGFyZW50LCBfX2R1bW15LCBfX2gtPl9fdmFsdWVfKTsKKyAgICBfX25vZGVfcG9pbnRlciBfX3IgPSBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19jaGlsZCk7CisgICAgaWYgKF9fY2hpbGQgPT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIF9faW5zZXJ0X25vZGVfYXQoX19wYXJlbnQsIF9fY2hpbGQsIHN0YXRpY19jYXN0PF9fbm9kZV9iYXNlX3BvaW50ZXI+KF9faC5nZXQoKSkpOworICAgICAgICBfX3IgPSBfX2gucmVsZWFzZSgpOworICAgIH0KKyAgICByZXR1cm4gaXRlcmF0b3IoX19yKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+Cit0eXBlbmFtZSBfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fZW1wbGFjZV9tdWx0aShfQXJncyYmLi4uIF9fYXJncykKK3sKKyAgICBfX25vZGVfaG9sZGVyIF9faCA9IF9fY29uc3RydWN0X25vZGUoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIF9fcGFyZW50X3BvaW50ZXIgX19wYXJlbnQ7CisgICAgX19ub2RlX2Jhc2VfcG9pbnRlciYgX19jaGlsZCA9IF9fZmluZF9sZWFmX2hpZ2goX19wYXJlbnQsIF9Ob2RlVHlwZXM6Ol9fZ2V0X2tleShfX2gtPl9fdmFsdWVfKSk7CisgICAgX19pbnNlcnRfbm9kZV9hdChfX3BhcmVudCwgX19jaGlsZCwgc3RhdGljX2Nhc3Q8X19ub2RlX2Jhc2VfcG9pbnRlcj4oX19oLmdldCgpKSk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX2gucmVsZWFzZSgpKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgordHlwZW5hbWUgX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX2VtcGxhY2VfaGludF9tdWx0aShjb25zdF9pdGVyYXRvciBfX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BcmdzJiYuLi4gX19hcmdzKQoreworICAgIF9fbm9kZV9ob2xkZXIgX19oID0gX19jb25zdHJ1Y3Rfbm9kZShfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgX19wYXJlbnRfcG9pbnRlciBfX3BhcmVudDsKKyAgICBfX25vZGVfYmFzZV9wb2ludGVyJiBfX2NoaWxkID0gX19maW5kX2xlYWYoX19wLCBfX3BhcmVudCwgX05vZGVUeXBlczo6X19nZXRfa2V5KF9faC0+X192YWx1ZV8pKTsKKyAgICBfX2luc2VydF9ub2RlX2F0KF9fcGFyZW50LCBfX2NoaWxkLCBzdGF0aWNfY2FzdDxfX25vZGVfYmFzZV9wb2ludGVyPihfX2guZ2V0KCkpKTsKKyAgICByZXR1cm4gaXRlcmF0b3Ioc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9faC5yZWxlYXNlKCkpKTsKK30KKworCisjZWxzZSAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX25vZGVfaG9sZGVyCitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fY29uc3RydWN0X25vZGUoY29uc3QgX19jb250YWluZXJfdmFsdWVfdHlwZSYgX192KQoreworICAgIF9fbm9kZV9hbGxvY2F0b3ImIF9fbmEgPSBfX25vZGVfYWxsb2MoKTsKKyAgICBfX25vZGVfaG9sZGVyIF9faChfX25vZGVfdHJhaXRzOjphbGxvY2F0ZShfX25hLCAxKSwgX0RwKF9fbmEpKTsKKyAgICBfX25vZGVfdHJhaXRzOjpjb25zdHJ1Y3QoX19uYSwgX05vZGVUeXBlczo6X19nZXRfcHRyKF9faC0+X192YWx1ZV8pLCBfX3YpOworICAgIF9faC5nZXRfZGVsZXRlcigpLl9fdmFsdWVfY29uc3RydWN0ZWQgPSB0cnVlOworICAgIHJldHVybiBfTElCQ1BQX0VYUExJQ0lUX01PVkUoX19oKTsgIC8vIGV4cGxpY2l0bHkgbW92ZWQgZm9yIEMrKzAzCit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyNpZmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX2luc2VydF9tdWx0aShjb25zdCBfX2NvbnRhaW5lcl92YWx1ZV90eXBlJiBfX3YpCit7CisgICAgX19wYXJlbnRfcG9pbnRlciBfX3BhcmVudDsKKyAgICBfX25vZGVfYmFzZV9wb2ludGVyJiBfX2NoaWxkID0gX19maW5kX2xlYWZfaGlnaChfX3BhcmVudCwgX05vZGVUeXBlczo6X19nZXRfa2V5KF9fdikpOworICAgIF9fbm9kZV9ob2xkZXIgX19oID0gX19jb25zdHJ1Y3Rfbm9kZShfX3YpOworICAgIF9faW5zZXJ0X25vZGVfYXQoX19wYXJlbnQsIF9fY2hpbGQsIHN0YXRpY19jYXN0PF9fbm9kZV9iYXNlX3BvaW50ZXI+KF9faC5nZXQoKSkpOworICAgIHJldHVybiBpdGVyYXRvcihfX2gucmVsZWFzZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9faW5zZXJ0X211bHRpKGNvbnN0X2l0ZXJhdG9yIF9fcCwgY29uc3QgX19jb250YWluZXJfdmFsdWVfdHlwZSYgX192KQoreworICAgIF9fcGFyZW50X3BvaW50ZXIgX19wYXJlbnQ7CisgICAgX19ub2RlX2Jhc2VfcG9pbnRlciYgX19jaGlsZCA9IF9fZmluZF9sZWFmKF9fcCwgX19wYXJlbnQsIF9Ob2RlVHlwZXM6Ol9fZ2V0X2tleShfX3YpKTsKKyAgICBfX25vZGVfaG9sZGVyIF9faCA9IF9fY29uc3RydWN0X25vZGUoX192KTsKKyAgICBfX2luc2VydF9ub2RlX2F0KF9fcGFyZW50LCBfX2NoaWxkLCBzdGF0aWNfY2FzdDxfX25vZGVfYmFzZV9wb2ludGVyPihfX2guZ2V0KCkpKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoX19oLnJlbGVhc2UoKSk7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitwYWlyPHR5cGVuYW1lIF9fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IsIGJvb2w+CitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fbm9kZV9pbnNlcnRfdW5pcXVlKF9fbm9kZV9wb2ludGVyIF9fbmQpCit7CisgICAgX19wYXJlbnRfcG9pbnRlciBfX3BhcmVudDsKKyAgICBfX25vZGVfYmFzZV9wb2ludGVyJiBfX2NoaWxkID0gX19maW5kX2VxdWFsKF9fcGFyZW50LCBfX25kLT5fX3ZhbHVlXyk7CisgICAgX19ub2RlX3BvaW50ZXIgX19yID0gc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9fY2hpbGQpOworICAgIGJvb2wgX19pbnNlcnRlZCA9IGZhbHNlOworICAgIGlmIChfX2NoaWxkID09IG51bGxwdHIpCisgICAgeworICAgICAgICBfX2luc2VydF9ub2RlX2F0KF9fcGFyZW50LCBfX2NoaWxkLCBzdGF0aWNfY2FzdDxfX25vZGVfYmFzZV9wb2ludGVyPihfX25kKSk7CisgICAgICAgIF9fciA9IF9fbmQ7CisgICAgICAgIF9faW5zZXJ0ZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gcGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoX19yKSwgX19pbnNlcnRlZCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX25vZGVfaW5zZXJ0X3VuaXF1ZShjb25zdF9pdGVyYXRvciBfX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbm9kZV9wb2ludGVyIF9fbmQpCit7CisgICAgX19wYXJlbnRfcG9pbnRlciBfX3BhcmVudDsKKyAgICBfX25vZGVfYmFzZV9wb2ludGVyIF9fZHVtbXk7CisgICAgX19ub2RlX2Jhc2VfcG9pbnRlciYgX19jaGlsZCA9IF9fZmluZF9lcXVhbChfX3AsIF9fcGFyZW50LCBfX25kLT5fX3ZhbHVlXyk7CisgICAgX19ub2RlX3BvaW50ZXIgX19yID0gc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9fY2hpbGQpOworICAgIGlmIChfX2NoaWxkID09IG51bGxwdHIpCisgICAgeworICAgICAgICBfX2luc2VydF9ub2RlX2F0KF9fcGFyZW50LCBfX2NoaWxkLCBzdGF0aWNfY2FzdDxfX25vZGVfYmFzZV9wb2ludGVyPihfX25kKSk7CisgICAgICAgIF9fciA9IF9fbmQ7CisgICAgfQorICAgIHJldHVybiBpdGVyYXRvcihfX3IpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIF9fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IKK19fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6X19ub2RlX2luc2VydF9tdWx0aShfX25vZGVfcG9pbnRlciBfX25kKQoreworICAgIF9fcGFyZW50X3BvaW50ZXIgX19wYXJlbnQ7CisgICAgX19ub2RlX2Jhc2VfcG9pbnRlciYgX19jaGlsZCA9IF9fZmluZF9sZWFmX2hpZ2goX19wYXJlbnQsIF9Ob2RlVHlwZXM6Ol9fZ2V0X2tleShfX25kLT5fX3ZhbHVlXykpOworICAgIF9faW5zZXJ0X25vZGVfYXQoX19wYXJlbnQsIF9fY2hpbGQsIHN0YXRpY19jYXN0PF9fbm9kZV9iYXNlX3BvaW50ZXI+KF9fbmQpKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoX19uZCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX25vZGVfaW5zZXJ0X211bHRpKGNvbnN0X2l0ZXJhdG9yIF9fcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25vZGVfcG9pbnRlciBfX25kKQoreworICAgIF9fcGFyZW50X3BvaW50ZXIgX19wYXJlbnQ7CisgICAgX19ub2RlX2Jhc2VfcG9pbnRlciYgX19jaGlsZCA9IF9fZmluZF9sZWFmKF9fcCwgX19wYXJlbnQsIF9Ob2RlVHlwZXM6Ol9fZ2V0X2tleShfX25kLT5fX3ZhbHVlXykpOworICAgIF9faW5zZXJ0X25vZGVfYXQoX19wYXJlbnQsIF9fY2hpbGQsIHN0YXRpY19jYXN0PF9fbm9kZV9iYXNlX3BvaW50ZXI+KF9fbmQpKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoX19uZCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjplcmFzZShjb25zdF9pdGVyYXRvciBfX3ApCit7CisgICAgX19ub2RlX3BvaW50ZXIgX19ucCA9IF9fcC5fX2dldF9ucCgpOworICAgIGl0ZXJhdG9yIF9fcihfX3AuX19wdHJfKTsKKyAgICArK19fcjsKKyAgICBpZiAoX19iZWdpbl9ub2RlKCkgPT0gX19wLl9fcHRyXykKKyAgICAgICAgX19iZWdpbl9ub2RlKCkgPSBfX3IuX19wdHJfOworICAgIC0tc2l6ZSgpOworICAgIF9fbm9kZV9hbGxvY2F0b3ImIF9fbmEgPSBfX25vZGVfYWxsb2MoKTsKKyAgICBfX3RyZWVfcmVtb3ZlKF9fZW5kX25vZGUoKS0+X19sZWZ0XywKKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fbm9kZV9iYXNlX3BvaW50ZXI+KF9fbnApKTsKKyAgICBfX25vZGVfdHJhaXRzOjpkZXN0cm95KF9fbmEsIF9Ob2RlVHlwZXM6Ol9fZ2V0X3B0cigKKyAgICAgICAgY29uc3RfY2FzdDxfX25vZGVfdmFsdWVfdHlwZSY+KCpfX3ApKSk7CisgICAgX19ub2RlX3RyYWl0czo6ZGVhbGxvY2F0ZShfX25hLCBfX25wLCAxKTsKKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIF9fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IKK19fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6ZXJhc2UoY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpCit7CisgICAgd2hpbGUgKF9fZiAhPSBfX2wpCisgICAgICAgIF9fZiA9IGVyYXNlKF9fZik7CisgICAgcmV0dXJuIGl0ZXJhdG9yKF9fbC5fX3B0cl8pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfS2V5PgordHlwZW5hbWUgX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK19fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6X19lcmFzZV91bmlxdWUoY29uc3QgX0tleSYgX19rKQoreworICAgIGl0ZXJhdG9yIF9faSA9IGZpbmQoX19rKTsKKyAgICBpZiAoX19pID09IGVuZCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBlcmFzZShfX2kpOworICAgIHJldHVybiAxOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfS2V5PgordHlwZW5hbWUgX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK19fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6X19lcmFzZV9tdWx0aShjb25zdCBfS2V5JiBfX2spCit7CisgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IF9fcCA9IF9fZXF1YWxfcmFuZ2VfbXVsdGkoX19rKTsKKyAgICBzaXplX3R5cGUgX19yID0gMDsKKyAgICBmb3IgKDsgX19wLmZpcnN0ICE9IF9fcC5zZWNvbmQ7ICsrX19yKQorICAgICAgICBfX3AuZmlyc3QgPSBlcmFzZShfX3AuZmlyc3QpOworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9LZXk+Cit0eXBlbmFtZSBfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46OmZpbmQoY29uc3QgX0tleSYgX192KQoreworICAgIGl0ZXJhdG9yIF9fcCA9IF9fbG93ZXJfYm91bmQoX192LCBfX3Jvb3QoKSwgX19lbmRfbm9kZSgpKTsKKyAgICBpZiAoX19wICE9IGVuZCgpICYmICF2YWx1ZV9jb21wKCkoX192LCAqX19wKSkKKyAgICAgICAgcmV0dXJuIF9fcDsKKyAgICByZXR1cm4gZW5kKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9LZXk+Cit0eXBlbmFtZSBfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46OmNvbnN0X2l0ZXJhdG9yCitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46OmZpbmQoY29uc3QgX0tleSYgX192KSBjb25zdAoreworICAgIGNvbnN0X2l0ZXJhdG9yIF9fcCA9IF9fbG93ZXJfYm91bmQoX192LCBfX3Jvb3QoKSwgX19lbmRfbm9kZSgpKTsKKyAgICBpZiAoX19wICE9IGVuZCgpICYmICF2YWx1ZV9jb21wKCkoX192LCAqX19wKSkKKyAgICAgICAgcmV0dXJuIF9fcDsKKyAgICByZXR1cm4gZW5kKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9LZXk+Cit0eXBlbmFtZSBfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46OnNpemVfdHlwZQorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX2NvdW50X3VuaXF1ZShjb25zdCBfS2V5JiBfX2spIGNvbnN0Cit7CisgICAgX19ub2RlX3BvaW50ZXIgX19ydCA9IF9fcm9vdCgpOworICAgIHdoaWxlIChfX3J0ICE9IG51bGxwdHIpCisgICAgeworICAgICAgICBpZiAodmFsdWVfY29tcCgpKF9faywgX19ydC0+X192YWx1ZV8pKQorICAgICAgICB7CisgICAgICAgICAgICBfX3J0ID0gc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9fcnQtPl9fbGVmdF8pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHZhbHVlX2NvbXAoKShfX3J0LT5fX3ZhbHVlXywgX19rKSkKKyAgICAgICAgICAgIF9fcnQgPSBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19ydC0+X19yaWdodF8pOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9LZXk+Cit0eXBlbmFtZSBfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46OnNpemVfdHlwZQorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX2NvdW50X211bHRpKGNvbnN0IF9LZXkmIF9faykgY29uc3QKK3sKKyAgICBfX2l0ZXJfcG9pbnRlciBfX3Jlc3VsdCA9IF9fZW5kX25vZGUoKTsKKyAgICBfX25vZGVfcG9pbnRlciBfX3J0ID0gX19yb290KCk7CisgICAgd2hpbGUgKF9fcnQgIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZV9jb21wKCkoX19rLCBfX3J0LT5fX3ZhbHVlXykpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fcmVzdWx0ID0gc3RhdGljX2Nhc3Q8X19pdGVyX3BvaW50ZXI+KF9fcnQpOworICAgICAgICAgICAgX19ydCA9IHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX3J0LT5fX2xlZnRfKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh2YWx1ZV9jb21wKCkoX19ydC0+X192YWx1ZV8sIF9faykpCisgICAgICAgICAgICBfX3J0ID0gc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9fcnQtPl9fcmlnaHRfKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIF9WU1REOjpkaXN0YW5jZSgKKyAgICAgICAgICAgICAgICBfX2xvd2VyX2JvdW5kKF9faywgc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9fcnQtPl9fbGVmdF8pLCBzdGF0aWNfY2FzdDxfX2l0ZXJfcG9pbnRlcj4oX19ydCkpLAorICAgICAgICAgICAgICAgIF9fdXBwZXJfYm91bmQoX19rLCBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19ydC0+X19yaWdodF8pLCBfX3Jlc3VsdCkKKyAgICAgICAgICAgICk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfS2V5PgordHlwZW5hbWUgX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX2xvd2VyX2JvdW5kKGNvbnN0IF9LZXkmIF9fdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25vZGVfcG9pbnRlciBfX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdGVyX3BvaW50ZXIgX19yZXN1bHQpCit7CisgICAgd2hpbGUgKF9fcm9vdCAhPSBudWxscHRyKQorICAgIHsKKyAgICAgICAgaWYgKCF2YWx1ZV9jb21wKCkoX19yb290LT5fX3ZhbHVlXywgX192KSkKKyAgICAgICAgeworICAgICAgICAgICAgX19yZXN1bHQgPSBzdGF0aWNfY2FzdDxfX2l0ZXJfcG9pbnRlcj4oX19yb290KTsKKyAgICAgICAgICAgIF9fcm9vdCA9IHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX3Jvb3QtPl9fbGVmdF8pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fcm9vdCA9IHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX3Jvb3QtPl9fcmlnaHRfKTsKKyAgICB9CisgICAgcmV0dXJuIGl0ZXJhdG9yKF9fcmVzdWx0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4KK3R5cGVuYW1lIF9fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6Y29uc3RfaXRlcmF0b3IKK19fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6X19sb3dlcl9ib3VuZChjb25zdCBfS2V5JiBfX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlX3BvaW50ZXIgX19yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXRlcl9wb2ludGVyIF9fcmVzdWx0KSBjb25zdAoreworICAgIHdoaWxlIChfX3Jvb3QgIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIGlmICghdmFsdWVfY29tcCgpKF9fcm9vdC0+X192YWx1ZV8sIF9fdikpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fcmVzdWx0ID0gc3RhdGljX2Nhc3Q8X19pdGVyX3BvaW50ZXI+KF9fcm9vdCk7CisgICAgICAgICAgICBfX3Jvb3QgPSBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19yb290LT5fX2xlZnRfKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3Jvb3QgPSBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19yb290LT5fX3JpZ2h0Xyk7CisgICAgfQorICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihfX3Jlc3VsdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9LZXk+Cit0eXBlbmFtZSBfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fdXBwZXJfYm91bmQoY29uc3QgX0tleSYgX192LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbm9kZV9wb2ludGVyIF9fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0ZXJfcG9pbnRlciBfX3Jlc3VsdCkKK3sKKyAgICB3aGlsZSAoX19yb290ICE9IG51bGxwdHIpCisgICAgeworICAgICAgICBpZiAodmFsdWVfY29tcCgpKF9fdiwgX19yb290LT5fX3ZhbHVlXykpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fcmVzdWx0ID0gc3RhdGljX2Nhc3Q8X19pdGVyX3BvaW50ZXI+KF9fcm9vdCk7CisgICAgICAgICAgICBfX3Jvb3QgPSBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19yb290LT5fX2xlZnRfKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3Jvb3QgPSBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19yb290LT5fX3JpZ2h0Xyk7CisgICAgfQorICAgIHJldHVybiBpdGVyYXRvcihfX3Jlc3VsdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9LZXk+Cit0eXBlbmFtZSBfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46OmNvbnN0X2l0ZXJhdG9yCitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fdXBwZXJfYm91bmQoY29uc3QgX0tleSYgX192LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbm9kZV9wb2ludGVyIF9fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0ZXJfcG9pbnRlciBfX3Jlc3VsdCkgY29uc3QKK3sKKyAgICB3aGlsZSAoX19yb290ICE9IG51bGxwdHIpCisgICAgeworICAgICAgICBpZiAodmFsdWVfY29tcCgpKF9fdiwgX19yb290LT5fX3ZhbHVlXykpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fcmVzdWx0ID0gc3RhdGljX2Nhc3Q8X19pdGVyX3BvaW50ZXI+KF9fcm9vdCk7CisgICAgICAgICAgICBfX3Jvb3QgPSBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19yb290LT5fX2xlZnRfKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3Jvb3QgPSBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19yb290LT5fX3JpZ2h0Xyk7CisgICAgfQorICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihfX3Jlc3VsdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9LZXk+CitwYWlyPHR5cGVuYW1lIF9fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IsCisgICAgIHR5cGVuYW1lIF9fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3I+CitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fZXF1YWxfcmFuZ2VfdW5pcXVlKGNvbnN0IF9LZXkmIF9faykKK3sKKyAgICB0eXBlZGVmIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBfUHA7CisgICAgX19pdGVyX3BvaW50ZXIgX19yZXN1bHQgPSBfX2VuZF9ub2RlKCk7CisgICAgX19ub2RlX3BvaW50ZXIgX19ydCA9IF9fcm9vdCgpOworICAgIHdoaWxlIChfX3J0ICE9IG51bGxwdHIpCisgICAgeworICAgICAgICBpZiAodmFsdWVfY29tcCgpKF9faywgX19ydC0+X192YWx1ZV8pKQorICAgICAgICB7CisgICAgICAgICAgICBfX3Jlc3VsdCA9IHN0YXRpY19jYXN0PF9faXRlcl9wb2ludGVyPihfX3J0KTsKKyAgICAgICAgICAgIF9fcnQgPSBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19ydC0+X19sZWZ0Xyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodmFsdWVfY29tcCgpKF9fcnQtPl9fdmFsdWVfLCBfX2spKQorICAgICAgICAgICAgX19ydCA9IHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX3J0LT5fX3JpZ2h0Xyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBfUHAoaXRlcmF0b3IoX19ydCksCisgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcnQtPl9fcmlnaHRfICE9IG51bGxwdHIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X19pdGVyX3BvaW50ZXI+KF9fdHJlZV9taW4oX19ydC0+X19yaWdodF8pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19yZXN1bHQpKTsKKyAgICB9CisgICAgcmV0dXJuIF9QcChpdGVyYXRvcihfX3Jlc3VsdCksIGl0ZXJhdG9yKF9fcmVzdWx0KSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9LZXk+CitwYWlyPHR5cGVuYW1lIF9fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6Y29uc3RfaXRlcmF0b3IsCisgICAgIHR5cGVuYW1lIF9fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6Y29uc3RfaXRlcmF0b3I+CitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fZXF1YWxfcmFuZ2VfdW5pcXVlKGNvbnN0IF9LZXkmIF9faykgY29uc3QKK3sKKyAgICB0eXBlZGVmIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBfUHA7CisgICAgX19pdGVyX3BvaW50ZXIgX19yZXN1bHQgPSBfX2VuZF9ub2RlKCk7CisgICAgX19ub2RlX3BvaW50ZXIgX19ydCA9IF9fcm9vdCgpOworICAgIHdoaWxlIChfX3J0ICE9IG51bGxwdHIpCisgICAgeworICAgICAgICBpZiAodmFsdWVfY29tcCgpKF9faywgX19ydC0+X192YWx1ZV8pKQorICAgICAgICB7CisgICAgICAgICAgICBfX3Jlc3VsdCA9IHN0YXRpY19jYXN0PF9faXRlcl9wb2ludGVyPihfX3J0KTsKKyAgICAgICAgICAgIF9fcnQgPSBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19ydC0+X19sZWZ0Xyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodmFsdWVfY29tcCgpKF9fcnQtPl9fdmFsdWVfLCBfX2spKQorICAgICAgICAgICAgX19ydCA9IHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX3J0LT5fX3JpZ2h0Xyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBfUHAoY29uc3RfaXRlcmF0b3IoX19ydCksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcnQtPl9fcmlnaHRfICE9IG51bGxwdHIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X19pdGVyX3BvaW50ZXI+KF9fdHJlZV9taW4oX19ydC0+X19yaWdodF8pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19yZXN1bHQpKTsKKyAgICB9CisgICAgcmV0dXJuIF9QcChjb25zdF9pdGVyYXRvcihfX3Jlc3VsdCksIGNvbnN0X2l0ZXJhdG9yKF9fcmVzdWx0KSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9LZXk+CitwYWlyPHR5cGVuYW1lIF9fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IsCisgICAgIHR5cGVuYW1lIF9fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3I+CitfX3RyZWU8X1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fZXF1YWxfcmFuZ2VfbXVsdGkoY29uc3QgX0tleSYgX19rKQoreworICAgIHR5cGVkZWYgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IF9QcDsKKyAgICBfX2l0ZXJfcG9pbnRlciBfX3Jlc3VsdCA9IF9fZW5kX25vZGUoKTsKKyAgICBfX25vZGVfcG9pbnRlciBfX3J0ID0gX19yb290KCk7CisgICAgd2hpbGUgKF9fcnQgIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZV9jb21wKCkoX19rLCBfX3J0LT5fX3ZhbHVlXykpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fcmVzdWx0ID0gc3RhdGljX2Nhc3Q8X19pdGVyX3BvaW50ZXI+KF9fcnQpOworICAgICAgICAgICAgX19ydCA9IHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX3J0LT5fX2xlZnRfKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh2YWx1ZV9jb21wKCkoX19ydC0+X192YWx1ZV8sIF9faykpCisgICAgICAgICAgICBfX3J0ID0gc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9fcnQtPl9fcmlnaHRfKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIF9QcChfX2xvd2VyX2JvdW5kKF9faywgc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9fcnQtPl9fbGVmdF8pLCBzdGF0aWNfY2FzdDxfX2l0ZXJfcG9pbnRlcj4oX19ydCkpLAorICAgICAgICAgICAgICAgICAgICAgIF9fdXBwZXJfYm91bmQoX19rLCBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19ydC0+X19yaWdodF8pLCBfX3Jlc3VsdCkpOworICAgIH0KKyAgICByZXR1cm4gX1BwKGl0ZXJhdG9yKF9fcmVzdWx0KSwgaXRlcmF0b3IoX19yZXN1bHQpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4KK3BhaXI8dHlwZW5hbWUgX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+Ojpjb25zdF9pdGVyYXRvciwKKyAgICAgdHlwZW5hbWUgX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+Ojpjb25zdF9pdGVyYXRvcj4KK19fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6X19lcXVhbF9yYW5nZV9tdWx0aShjb25zdCBfS2V5JiBfX2spIGNvbnN0Cit7CisgICAgdHlwZWRlZiBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gX1BwOworICAgIF9faXRlcl9wb2ludGVyIF9fcmVzdWx0ID0gX19lbmRfbm9kZSgpOworICAgIF9fbm9kZV9wb2ludGVyIF9fcnQgPSBfX3Jvb3QoKTsKKyAgICB3aGlsZSAoX19ydCAhPSBudWxscHRyKQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlX2NvbXAoKShfX2ssIF9fcnQtPl9fdmFsdWVfKSkKKyAgICAgICAgeworICAgICAgICAgICAgX19yZXN1bHQgPSBzdGF0aWNfY2FzdDxfX2l0ZXJfcG9pbnRlcj4oX19ydCk7CisgICAgICAgICAgICBfX3J0ID0gc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KF9fcnQtPl9fbGVmdF8pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHZhbHVlX2NvbXAoKShfX3J0LT5fX3ZhbHVlXywgX19rKSkKKyAgICAgICAgICAgIF9fcnQgPSBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19ydC0+X19yaWdodF8pOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gX1BwKF9fbG93ZXJfYm91bmQoX19rLCBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19ydC0+X19sZWZ0XyksIHN0YXRpY19jYXN0PF9faXRlcl9wb2ludGVyPihfX3J0KSksCisgICAgICAgICAgICAgICAgICAgICAgX191cHBlcl9ib3VuZChfX2ssIHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX3J0LT5fX3JpZ2h0XyksIF9fcmVzdWx0KSk7CisgICAgfQorICAgIHJldHVybiBfUHAoY29uc3RfaXRlcmF0b3IoX19yZXN1bHQpLCBjb25zdF9pdGVyYXRvcihfX3Jlc3VsdCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIF9fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6X19ub2RlX2hvbGRlcgorX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpyZW1vdmUoY29uc3RfaXRlcmF0b3IgX19wKSBfTk9FWENFUFQKK3sKKyAgICBfX25vZGVfcG9pbnRlciBfX25wID0gX19wLl9fZ2V0X25wKCk7CisgICAgaWYgKF9fYmVnaW5fbm9kZSgpID09IF9fcC5fX3B0cl8pCisgICAgeworICAgICAgICBpZiAoX19ucC0+X19yaWdodF8gIT0gbnVsbHB0cikKKyAgICAgICAgICAgIF9fYmVnaW5fbm9kZSgpID0gc3RhdGljX2Nhc3Q8X19pdGVyX3BvaW50ZXI+KF9fbnAtPl9fcmlnaHRfKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX19iZWdpbl9ub2RlKCkgPSBzdGF0aWNfY2FzdDxfX2l0ZXJfcG9pbnRlcj4oX19ucC0+X19wYXJlbnRfKTsKKyAgICB9CisgICAgLS1zaXplKCk7CisgICAgX190cmVlX3JlbW92ZShfX2VuZF9ub2RlKCktPl9fbGVmdF8sCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX25vZGVfYmFzZV9wb2ludGVyPihfX25wKSk7CisgICAgcmV0dXJuIF9fbm9kZV9ob2xkZXIoX19ucCwgX0RwKF9fbm9kZV9hbGxvYygpLCB0cnVlKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3N3YXAoX190cmVlPF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3gsCisgICAgIF9fdHJlZTxfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX195KQorICAgIF9OT0VYQ0VQVF8oX05PRVhDRVBUXyhfX3guc3dhcChfX3kpKSkKK3sKKyAgICBfX3guc3dhcChfX3kpOworfQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKK19MSUJDUFBfUE9QX01BQ1JPUworCisjZW5kaWYgIC8vIF9MSUJDUFBfX19UUkVFCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX190dXBsZSBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX3R1cGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZDZlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvX190dXBsZQpAQCAtMCwwICsxLDU1NiBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9fX1RVUExFCisjZGVmaW5lIF9MSUJDUFBfX19UVVBMRQorCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHR1cGxlX3NpemU7CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0NYWDAzX0xBTkcpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcy4uLj4KK3VzaW5nIF9fZW5hYmxlX2lmX3R1cGxlX3NpemVfaW1wID0gX1RwOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdHVwbGVfc2l6ZTxfX2VuYWJsZV9pZl90dXBsZV9zaXplX2ltcDwKKyAgICBjb25zdCBfVHAsCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmPCFpc192b2xhdGlsZTxfVHA+Ojp2YWx1ZT46OnR5cGUsCisgICAgaW50ZWdyYWxfY29uc3RhbnQ8c2l6ZV90LCBzaXplb2YodHVwbGVfc2l6ZTxfVHA+KT4+PgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHNpemVfdCwgdHVwbGVfc2l6ZTxfVHA+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB0dXBsZV9zaXplPF9fZW5hYmxlX2lmX3R1cGxlX3NpemVfaW1wPAorICAgIHZvbGF0aWxlIF9UcCwKKyAgICB0eXBlbmFtZSBlbmFibGVfaWY8IWlzX2NvbnN0PF9UcD46OnZhbHVlPjo6dHlwZSwKKyAgICBpbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIHNpemVvZih0dXBsZV9zaXplPF9UcD4pPj4+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c2l6ZV90LCB0dXBsZV9zaXplPF9UcD46OnZhbHVlPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHR1cGxlX3NpemU8X19lbmFibGVfaWZfdHVwbGVfc2l6ZV9pbXA8CisgICAgY29uc3Qgdm9sYXRpbGUgX1RwLAorICAgIGludGVncmFsX2NvbnN0YW50PHNpemVfdCwgc2l6ZW9mKHR1cGxlX3NpemU8X1RwPik+Pj4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIHR1cGxlX3NpemU8X1RwPjo6dmFsdWU+IHt9OworCisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9UcD4gY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdHVwbGVfc2l6ZTxjb25zdCBfVHA+IDogcHVibGljIHR1cGxlX3NpemU8X1RwPiB7fTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHR1cGxlX3NpemU8dm9sYXRpbGUgX1RwPiA6IHB1YmxpYyB0dXBsZV9zaXplPF9UcD4ge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB0dXBsZV9zaXplPGNvbnN0IHZvbGF0aWxlIF9UcD4gOiBwdWJsaWMgdHVwbGVfc2l6ZTxfVHA+IHt9OworI2VuZGlmCisKK3RlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcyBfVHA+IGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHR1cGxlX2VsZW1lbnQ7CisKK3RlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcyBfVHA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB0dXBsZV9lbGVtZW50PF9JcCwgY29uc3QgX1RwPgoreworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2NvbnN0PHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0lwLCBfVHA+Ojp0eXBlPjo6dHlwZSB0eXBlOworfTsKKwordGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIF9UcD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHR1cGxlX2VsZW1lbnQ8X0lwLCB2b2xhdGlsZSBfVHA+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfdm9sYXRpbGU8dHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSXAsIF9UcD46OnR5cGU+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1RwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdHVwbGVfZWxlbWVudDxfSXAsIGNvbnN0IHZvbGF0aWxlIF9UcD4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9jdjx0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9JcCwgX1RwPjo6dHlwZT46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfX3R1cGxlX2xpa2UgOiBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX190dXBsZV9saWtlPGNvbnN0IF9UcD4gOiBwdWJsaWMgX190dXBsZV9saWtlPF9UcD4ge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX190dXBsZV9saWtlPHZvbGF0aWxlIF9UcD4gOiBwdWJsaWMgX190dXBsZV9saWtlPF9UcD4ge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX190dXBsZV9saWtlPGNvbnN0IHZvbGF0aWxlIF9UcD4gOiBwdWJsaWMgX190dXBsZV9saWtlPF9UcD4ge307CisKKy8vIHR1cGxlIHNwZWNpYWxpemF0aW9ucworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8c2l6ZV90Li4uPiBzdHJ1Y3QgX190dXBsZV9pbmRpY2VzIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0lkeFR5cGUsIF9JZHhUeXBlLi4uIF9WYWx1ZXM+CitzdHJ1Y3QgX19pbnRlZ2VyX3NlcXVlbmNlIHsKKyAgdGVtcGxhdGUgPHRlbXBsYXRlIDxjbGFzcyBfT0lkeFR5cGUsIF9PSWR4VHlwZS4uLj4gY2xhc3MgX1RvSW5kZXhTZXEsIGNsYXNzIF9Ub0luZGV4VHlwZT4KKyAgdXNpbmcgX19jb252ZXJ0ID0gX1RvSW5kZXhTZXE8X1RvSW5kZXhUeXBlLCBfVmFsdWVzLi4uPjsKKworICB0ZW1wbGF0ZSA8c2l6ZV90IF9TcD4KKyAgdXNpbmcgX190b190dXBsZV9pbmRpY2VzID0gX190dXBsZV9pbmRpY2VzPChfVmFsdWVzICsgX1NwKS4uLj47Cit9OworCisjaWYgIV9faGFzX2J1aWx0aW4oX19tYWtlX2ludGVnZXJfc2VxKSB8fCBkZWZpbmVkKF9MSUJDUFBfVEVTVElOR19GQUxMQkFDS19NQUtFX0lOVEVHRVJfU0VRVUVOQ0UpCituYW1lc3BhY2UgX19kZXRhaWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHNpemVfdCAuLi5fRXh0cmE+IHN0cnVjdCBfX3JlcGVhdDsKK3RlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX1RwIC4uLl9OcCwgc2l6ZV90IC4uLl9FeHRyYT4gc3RydWN0IF9fcmVwZWF0PF9faW50ZWdlcl9zZXF1ZW5jZTxfVHAsIF9OcC4uLj4sIF9FeHRyYS4uLj4geworICB0eXBlZGVmIF9faW50ZWdlcl9zZXF1ZW5jZTxfVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfTnAuLi4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YuLi4oX05wKSArIF9OcC4uLiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBzaXplb2YuLi4oX05wKSArIF9OcC4uLiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgKiBzaXplb2YuLi4oX05wKSArIF9OcC4uLiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKiBzaXplb2YuLi4oX05wKSArIF9OcC4uLiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgKiBzaXplb2YuLi4oX05wKSArIF9OcC4uLiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgKiBzaXplb2YuLi4oX05wKSArIF9OcC4uLiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDcgKiBzaXplb2YuLi4oX05wKSArIF9OcC4uLiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9FeHRyYS4uLj4gdHlwZTsKK307CisKK3RlbXBsYXRlPHNpemVfdCBfTnA+IHN0cnVjdCBfX3Bhcml0eTsKK3RlbXBsYXRlPHNpemVfdCBfTnA+IHN0cnVjdCBfX21ha2UgOiBfX3Bhcml0eTxfTnAgJSA4Pjo6dGVtcGxhdGUgX19wbWFrZTxfTnA+IHt9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBfX21ha2U8MD4geyB0eXBlZGVmIF9faW50ZWdlcl9zZXF1ZW5jZTxzaXplX3Q+IHR5cGU7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBfX21ha2U8MT4geyB0eXBlZGVmIF9faW50ZWdlcl9zZXF1ZW5jZTxzaXplX3QsIDA+IHR5cGU7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBfX21ha2U8Mj4geyB0eXBlZGVmIF9faW50ZWdlcl9zZXF1ZW5jZTxzaXplX3QsIDAsIDE+IHR5cGU7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBfX21ha2U8Mz4geyB0eXBlZGVmIF9faW50ZWdlcl9zZXF1ZW5jZTxzaXplX3QsIDAsIDEsIDI+IHR5cGU7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBfX21ha2U8ND4geyB0eXBlZGVmIF9faW50ZWdlcl9zZXF1ZW5jZTxzaXplX3QsIDAsIDEsIDIsIDM+IHR5cGU7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBfX21ha2U8NT4geyB0eXBlZGVmIF9faW50ZWdlcl9zZXF1ZW5jZTxzaXplX3QsIDAsIDEsIDIsIDMsIDQ+IHR5cGU7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBfX21ha2U8Nj4geyB0eXBlZGVmIF9faW50ZWdlcl9zZXF1ZW5jZTxzaXplX3QsIDAsIDEsIDIsIDMsIDQsIDU+IHR5cGU7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBfX21ha2U8Nz4geyB0eXBlZGVmIF9faW50ZWdlcl9zZXF1ZW5jZTxzaXplX3QsIDAsIDEsIDIsIDMsIDQsIDUsIDY+IHR5cGU7IH07CisKK3RlbXBsYXRlPD4gc3RydWN0IF9fcGFyaXR5PDA+IHsgdGVtcGxhdGU8c2l6ZV90IF9OcD4gc3RydWN0IF9fcG1ha2UgOiBfX3JlcGVhdDx0eXBlbmFtZSBfX21ha2U8X05wIC8gOD46OnR5cGU+IHt9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgX19wYXJpdHk8MT4geyB0ZW1wbGF0ZTxzaXplX3QgX05wPiBzdHJ1Y3QgX19wbWFrZSA6IF9fcmVwZWF0PHR5cGVuYW1lIF9fbWFrZTxfTnAgLyA4Pjo6dHlwZSwgX05wIC0gMT4ge307IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBfX3Bhcml0eTwyPiB7IHRlbXBsYXRlPHNpemVfdCBfTnA+IHN0cnVjdCBfX3BtYWtlIDogX19yZXBlYXQ8dHlwZW5hbWUgX19tYWtlPF9OcCAvIDg+Ojp0eXBlLCBfTnAgLSAyLCBfTnAgLSAxPiB7fTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IF9fcGFyaXR5PDM+IHsgdGVtcGxhdGU8c2l6ZV90IF9OcD4gc3RydWN0IF9fcG1ha2UgOiBfX3JlcGVhdDx0eXBlbmFtZSBfX21ha2U8X05wIC8gOD46OnR5cGUsIF9OcCAtIDMsIF9OcCAtIDIsIF9OcCAtIDE+IHt9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgX19wYXJpdHk8ND4geyB0ZW1wbGF0ZTxzaXplX3QgX05wPiBzdHJ1Y3QgX19wbWFrZSA6IF9fcmVwZWF0PHR5cGVuYW1lIF9fbWFrZTxfTnAgLyA4Pjo6dHlwZSwgX05wIC0gNCwgX05wIC0gMywgX05wIC0gMiwgX05wIC0gMT4ge307IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBfX3Bhcml0eTw1PiB7IHRlbXBsYXRlPHNpemVfdCBfTnA+IHN0cnVjdCBfX3BtYWtlIDogX19yZXBlYXQ8dHlwZW5hbWUgX19tYWtlPF9OcCAvIDg+Ojp0eXBlLCBfTnAgLSA1LCBfTnAgLSA0LCBfTnAgLSAzLCBfTnAgLSAyLCBfTnAgLSAxPiB7fTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IF9fcGFyaXR5PDY+IHsgdGVtcGxhdGU8c2l6ZV90IF9OcD4gc3RydWN0IF9fcG1ha2UgOiBfX3JlcGVhdDx0eXBlbmFtZSBfX21ha2U8X05wIC8gOD46OnR5cGUsIF9OcCAtIDYsIF9OcCAtIDUsIF9OcCAtIDQsIF9OcCAtIDMsIF9OcCAtIDIsIF9OcCAtIDE+IHt9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgX19wYXJpdHk8Nz4geyB0ZW1wbGF0ZTxzaXplX3QgX05wPiBzdHJ1Y3QgX19wbWFrZSA6IF9fcmVwZWF0PHR5cGVuYW1lIF9fbWFrZTxfTnAgLyA4Pjo6dHlwZSwgX05wIC0gNywgX05wIC0gNiwgX05wIC0gNSwgX05wIC0gNCwgX05wIC0gMywgX05wIC0gMiwgX05wIC0gMT4ge307IH07CisKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorCisjZW5kaWYgIC8vICFfX2hhc19idWlsdGluKF9fbWFrZV9pbnRlZ2VyX3NlcSkgfHwgZGVmaW5lZChfTElCQ1BQX1RFU1RJTkdfRkFMTEJBQ0tfTUFLRV9JTlRFR0VSX1NFUVVFTkNFKQorCisjaWYgX19oYXNfYnVpbHRpbihfX21ha2VfaW50ZWdlcl9zZXEpCit0ZW1wbGF0ZSA8c2l6ZV90IF9FcCwgc2l6ZV90IF9TcD4KK3VzaW5nIF9fbWFrZV9pbmRpY2VzX2ltcCA9CisgICAgdHlwZW5hbWUgX19tYWtlX2ludGVnZXJfc2VxPF9faW50ZWdlcl9zZXF1ZW5jZSwgc2l6ZV90LCBfRXAgLSBfU3A+Ojp0ZW1wbGF0ZQorICAgIF9fdG9fdHVwbGVfaW5kaWNlczxfU3A+OworI2Vsc2UKK3RlbXBsYXRlIDxzaXplX3QgX0VwLCBzaXplX3QgX1NwPgordXNpbmcgX19tYWtlX2luZGljZXNfaW1wID0KKyAgICB0eXBlbmFtZSBfX2RldGFpbDo6X19tYWtlPF9FcCAtIF9TcD46OnR5cGU6OnRlbXBsYXRlIF9fdG9fdHVwbGVfaW5kaWNlczxfU3A+OworCisjZW5kaWYKKwordGVtcGxhdGUgPHNpemVfdCBfRXAsIHNpemVfdCBfU3AgPSAwPgorc3RydWN0IF9fbWFrZV90dXBsZV9pbmRpY2VzCit7CisgICAgc3RhdGljX2Fzc2VydChfU3AgPD0gX0VwLCAiX19tYWtlX3R1cGxlX2luZGljZXMgaW5wdXQgZXJyb3IiKTsKKyAgICB0eXBlZGVmIF9fbWFrZV9pbmRpY2VzX2ltcDxfRXAsIF9TcD4gdHlwZTsKK307CisKKwordGVtcGxhdGUgPGNsYXNzIC4uLl9UcD4gY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdHVwbGU7CisKK3RlbXBsYXRlIDxjbGFzcy4uLiBfVHA+IHN0cnVjdCBfX3R1cGxlX2xpa2U8dHVwbGU8X1RwLi4uPiA+IDogdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX1RwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdHVwbGVfc2l6ZTx0dXBsZTxfVHAuLi4+ID4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIHNpemVvZi4uLihfVHApPgoreworfTsKKwordGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIC4uLl9UcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK3R5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0lwLCB0dXBsZTxfVHAuLi4+ID46OnR5cGUmCitnZXQodHVwbGU8X1RwLi4uPiYpIF9OT0VYQ0VQVDsKKwordGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIC4uLl9UcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK2NvbnN0IHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0lwLCB0dXBsZTxfVHAuLi4+ID46OnR5cGUmCitnZXQoY29uc3QgdHVwbGU8X1RwLi4uPiYpIF9OT0VYQ0VQVDsKKwordGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIC4uLl9UcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK3R5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0lwLCB0dXBsZTxfVHAuLi4+ID46OnR5cGUmJgorZ2V0KHR1cGxlPF9UcC4uLj4mJikgX05PRVhDRVBUOworCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgLi4uX1RwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorY29uc3QgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSXAsIHR1cGxlPF9UcC4uLj4gPjo6dHlwZSYmCitnZXQoY29uc3QgdHVwbGU8X1RwLi4uPiYmKSBfTk9FWENFUFQ7CisKKyNlbmRpZiAvLyAhZGVmaW5lZChfTElCQ1BQX0NYWDAzX0xBTkcpCisKKy8vIHBhaXIgc3BlY2lhbGl6YXRpb25zCisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4gc3RydWN0IF9fdHVwbGVfbGlrZTxwYWlyPF9UMSwgX1QyPiA+IDogdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1QxLCBjbGFzcyBfVDI+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCit0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9JcCwgcGFpcjxfVDEsIF9UMj4gPjo6dHlwZSYKK2dldChwYWlyPF9UMSwgX1QyPiYpIF9OT0VYQ0VQVDsKKwordGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorY29uc3QgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSXAsIHBhaXI8X1QxLCBfVDI+ID46OnR5cGUmCitnZXQoY29uc3QgcGFpcjxfVDEsIF9UMj4mKSBfTk9FWENFUFQ7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1QxLCBjbGFzcyBfVDI+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCit0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9JcCwgcGFpcjxfVDEsIF9UMj4gPjo6dHlwZSYmCitnZXQocGFpcjxfVDEsIF9UMj4mJikgX05PRVhDRVBUOworCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1QxLCBjbGFzcyBfVDI+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitjb25zdCB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9JcCwgcGFpcjxfVDEsIF9UMj4gPjo6dHlwZSYmCitnZXQoY29uc3QgcGFpcjxfVDEsIF9UMj4mJikgX05PRVhDRVBUOworI2VuZGlmCisKKy8vIGFycmF5IHNwZWNpYWxpemF0aW9ucworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBzaXplX3QgX1NpemU+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBhcnJheTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPiBzdHJ1Y3QgX190dXBsZV9saWtlPGFycmF5PF9UcCwgX1NpemU+ID4gOiB0cnVlX3R5cGUge307CisKK3RlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcyBfVHAsIHNpemVfdCBfU2l6ZT4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK19UcCYKK2dldChhcnJheTxfVHAsIF9TaXplPiYpIF9OT0VYQ0VQVDsKKwordGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorY29uc3QgX1RwJgorZ2V0KGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JikgX05PRVhDRVBUOworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORwordGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorX1RwJiYKK2dldChhcnJheTxfVHAsIF9TaXplPiYmKSBfTk9FWENFUFQ7CisKK3RlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcyBfVHAsIHNpemVfdCBfU2l6ZT4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK2NvbnN0IF9UcCYmCitnZXQoY29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4mJikgX05PRVhDRVBUOworI2VuZGlmCisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKKy8vIF9fdHVwbGVfdHlwZXMKKwordGVtcGxhdGUgPGNsYXNzIC4uLl9UcD4gc3RydWN0IF9fdHVwbGVfdHlwZXMge307CisKKyNpZiAhX19oYXNfYnVpbHRpbihfX3R5cGVfcGFja19lbGVtZW50KQorCituYW1lc3BhY2UgX19pbmRleGVyX2RldGFpbCB7CisKK3RlbXBsYXRlIDxzaXplX3QgX0lkeCwgY2xhc3MgX1RwPgorc3RydWN0IF9faW5kZXhlZCB7IHVzaW5nIHR5cGUgPSBfVHA7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHlwZXMsIGNsYXNzIF9JbmRleGVzPiBzdHJ1Y3QgX19pbmRleGVyOworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX1R5cGVzLCBzaXplX3QgLi4uX0lkeD4KK3N0cnVjdCBfX2luZGV4ZXI8X190dXBsZV90eXBlczxfVHlwZXMuLi4+LCBfX3R1cGxlX2luZGljZXM8X0lkeC4uLj4+CisgICAgOiBfX2luZGV4ZWQ8X0lkeCwgX1R5cGVzPi4uLgore307CisKK3RlbXBsYXRlIDxzaXplX3QgX0lkeCwgY2xhc3MgX1RwPgorX19pbmRleGVkPF9JZHgsIF9UcD4gX19hdF9pbmRleChfX2luZGV4ZWQ8X0lkeCwgX1RwPiBjb25zdCYpOworCit9IC8vIG5hbWVzcGFjZSBfX2luZGV4ZXJfZGV0YWlsCisKK3RlbXBsYXRlIDxzaXplX3QgX0lkeCwgY2xhc3MgLi4uX1R5cGVzPgordXNpbmcgX190eXBlX3BhY2tfZWxlbWVudCA9IHR5cGVuYW1lIGRlY2x0eXBlKAorICAgIF9faW5kZXhlcl9kZXRhaWw6Ol9fYXRfaW5kZXg8X0lkeD4oCisgICAgICAgIF9faW5kZXhlcl9kZXRhaWw6Ol9faW5kZXhlcjwKKyAgICAgICAgICAgIF9fdHVwbGVfdHlwZXM8X1R5cGVzLi4uPiwKKyAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPHNpemVvZi4uLihfVHlwZXMpPjo6dHlwZQorICAgICAgICA+e30pCisgICk6OnR5cGU7CisjZW5kaWYKKwordGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIC4uLl9UeXBlcz4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHR1cGxlX2VsZW1lbnQ8X0lwLCBfX3R1cGxlX3R5cGVzPF9UeXBlcy4uLj4+Cit7CitwdWJsaWM6CisgICAgc3RhdGljX2Fzc2VydChfSXAgPCBzaXplb2YuLi4oX1R5cGVzKSwgInR1cGxlX2VsZW1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgdHlwZWRlZiBfX3R5cGVfcGFja19lbGVtZW50PF9JcCwgX1R5cGVzLi4uPiB0eXBlOworfTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX1RwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdHVwbGVfc2l6ZTxfX3R1cGxlX3R5cGVzPF9UcC4uLj4gPgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHNpemVfdCwgc2l6ZW9mLi4uKF9UcCk+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX1RwPiBzdHJ1Y3QgX190dXBsZV9saWtlPF9fdHVwbGVfdHlwZXM8X1RwLi4uPiA+IDogdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Ym9vbCBfQXBwbHlMViwgYm9vbCBfQXBwbHlDb25zdCwgYm9vbCBfQXBwbHlWb2xhdGlsZT4KK3N0cnVjdCBfX2FwcGx5X2N2X21mOwordGVtcGxhdGUgPD4KK3N0cnVjdCBfX2FwcGx5X2N2X21mPGZhbHNlLCBmYWxzZSwgZmFsc2U+IHsKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4gdXNpbmcgX19hcHBseSA9IF9UcDsKK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9fYXBwbHlfY3ZfbWY8ZmFsc2UsIHRydWUsIGZhbHNlPiB7CisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+IHVzaW5nIF9fYXBwbHkgPSBjb25zdCBfVHA7Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBfX2FwcGx5X2N2X21mPGZhbHNlLCBmYWxzZSwgdHJ1ZT4geworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiB1c2luZyBfX2FwcGx5ID0gdm9sYXRpbGUgX1RwOworfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX19hcHBseV9jdl9tZjxmYWxzZSwgdHJ1ZSwgdHJ1ZT4geworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiB1c2luZyBfX2FwcGx5ID0gY29uc3Qgdm9sYXRpbGUgX1RwOworfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX19hcHBseV9jdl9tZjx0cnVlLCBmYWxzZSwgZmFsc2U+IHsKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4gdXNpbmcgX19hcHBseSA9IF9UcCY7Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBfX2FwcGx5X2N2X21mPHRydWUsIHRydWUsIGZhbHNlPiB7CisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+IHVzaW5nIF9fYXBwbHkgPSBjb25zdCBfVHAmOworfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX19hcHBseV9jdl9tZjx0cnVlLCBmYWxzZSwgdHJ1ZT4geworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiB1c2luZyBfX2FwcGx5ID0gdm9sYXRpbGUgX1RwJjsKK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9fYXBwbHlfY3ZfbWY8dHJ1ZSwgdHJ1ZSwgdHJ1ZT4geworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiB1c2luZyBfX2FwcGx5ID0gY29uc3Qgdm9sYXRpbGUgX1RwJjsKK307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfUmF3VHAgPSB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGU+Cit1c2luZyBfX2FwcGx5X2N2X3QgPSBfX2FwcGx5X2N2X21mPAorICAgIGlzX2x2YWx1ZV9yZWZlcmVuY2U8X1RwPjo6dmFsdWUsCisgICAgaXNfY29uc3Q8X1Jhd1RwPjo6dmFsdWUsCisgICAgaXNfdm9sYXRpbGU8X1Jhd1RwPjo6dmFsdWU+OworCisvLyBfX21ha2VfdHVwbGVfdHlwZXMKKworLy8gX19tYWtlX3R1cGxlX3R5cGVzPF9UdXBsZTxfVHlwZXMuLi4+LCBfRXAsIF9TcD46OnR5cGUgaXMgYQorLy8gX190dXBsZV90eXBlczxfVHlwZXMuLi4+IHVzaW5nIG9ubHkgdGhvc2UgX1R5cGVzIGluIHRoZSByYW5nZSBbX1NwLCBfRXApLgorLy8gX1NwIGRlZmF1bHRzIHRvIDAgYW5kIF9FcCBkZWZhdWx0cyB0byB0dXBsZV9zaXplPF9UdXBsZT4uICBJZiBfVHVwbGUgaXMgYQorLy8gbHZhbHVlX3JlZmVyZW5jZSB0eXBlLCB0aGVuIF9fdHVwbGVfdHlwZXM8X1R5cGVzJi4uLj4gaXMgdGhlIHJlc3VsdC4KKwordGVtcGxhdGUgPGNsYXNzIF9UdXBsZVR5cGVzLCBjbGFzcyBfVHVwbGVJbmRpY2VzPgorc3RydWN0IF9fbWFrZV90dXBsZV90eXBlc19mbGF0OworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLi4uPiBjbGFzcyBfVHVwbGUsIGNsYXNzIC4uLl9UeXBlcywgc2l6ZV90IC4uLl9JZHg+CitzdHJ1Y3QgX19tYWtlX3R1cGxlX3R5cGVzX2ZsYXQ8X1R1cGxlPF9UeXBlcy4uLj4sIF9fdHVwbGVfaW5kaWNlczxfSWR4Li4uPj4geworICAvLyBTcGVjaWFsaXphdGlvbiBmb3IgcGFpciwgdHVwbGUsIGFuZCBfX3R1cGxlX3R5cGVzCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BcHBseUZuID0gX19hcHBseV9jdl90PF9UcD4+CisgIHVzaW5nIF9fYXBwbHlfcXVhbHMgPSBfX3R1cGxlX3R5cGVzPAorICAgICAgdHlwZW5hbWUgX0FwcGx5Rm46OnRlbXBsYXRlIF9fYXBwbHk8X190eXBlX3BhY2tfZWxlbWVudDxfSWR4LCBfVHlwZXMuLi4+Pi4uLgorICAgID47Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1Z0LCBzaXplX3QgX05wLCBzaXplX3QgLi4uX0lkeD4KK3N0cnVjdCBfX21ha2VfdHVwbGVfdHlwZXNfZmxhdDxhcnJheTxfVnQsIF9OcD4sIF9fdHVwbGVfaW5kaWNlczxfSWR4Li4uPj4geworICB0ZW1wbGF0ZSA8c2l6ZV90PgorICB1c2luZyBfX3ZhbHVlX3R5cGUgPSBfVnQ7CisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BcHBseUZuID0gX19hcHBseV9jdl90PF9UcD4+CisgIHVzaW5nIF9fYXBwbHlfcXVhbHMgPSBfX3R1cGxlX3R5cGVzPAorICAgICAgdHlwZW5hbWUgX0FwcGx5Rm46OnRlbXBsYXRlIF9fYXBwbHk8X192YWx1ZV90eXBlPF9JZHg+Pi4uLgorICAgID47Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBzaXplX3QgX0VwID0gdHVwbGVfc2l6ZTx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICBzaXplX3QgX1NwID0gMCwKKyAgICAgICAgICBib29sIF9TYW1lU2l6ZSA9IChfRXAgPT0gdHVwbGVfc2l6ZTx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGU+Ojp2YWx1ZSk+CitzdHJ1Y3QgX19tYWtlX3R1cGxlX3R5cGVzCit7CisgICAgc3RhdGljX2Fzc2VydChfU3AgPD0gX0VwLCAiX19tYWtlX3R1cGxlX3R5cGVzIGlucHV0IGVycm9yIik7CisgICAgdXNpbmcgX1Jhd1RwID0gdHlwZW5hbWUgcmVtb3ZlX2N2PHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZT46OnR5cGU7CisgICAgdXNpbmcgX01ha2VyID0gX19tYWtlX3R1cGxlX3R5cGVzX2ZsYXQ8X1Jhd1RwLCB0eXBlbmFtZSBfX21ha2VfdHVwbGVfaW5kaWNlczxfRXAsIF9TcD46OnR5cGU+OworICAgIHVzaW5nIHR5cGUgPSB0eXBlbmFtZSBfTWFrZXI6OnRlbXBsYXRlIF9fYXBwbHlfcXVhbHM8X1RwPjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyAuLi5fVHlwZXMsIHNpemVfdCBfRXA+CitzdHJ1Y3QgX19tYWtlX3R1cGxlX3R5cGVzPHR1cGxlPF9UeXBlcy4uLj4sIF9FcCwgMCwgdHJ1ZT4geworICB0eXBlZGVmIF9fdHVwbGVfdHlwZXM8X1R5cGVzLi4uPiB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIC4uLl9UeXBlcywgc2l6ZV90IF9FcD4KK3N0cnVjdCBfX21ha2VfdHVwbGVfdHlwZXM8X190dXBsZV90eXBlczxfVHlwZXMuLi4+LCBfRXAsIDAsIHRydWU+IHsKKyAgdHlwZWRlZiBfX3R1cGxlX3R5cGVzPF9UeXBlcy4uLj4gdHlwZTsKK307CisKK3RlbXBsYXRlIDxib29sIC4uLl9QcmVkcz4KK3N0cnVjdCBfX2FsbF9kdW1teTsKKwordGVtcGxhdGUgPGJvb2wgLi4uX1ByZWQ+Cit1c2luZyBfX2FsbCA9IGlzX3NhbWU8X19hbGxfZHVtbXk8X1ByZWQuLi4+LCBfX2FsbF9kdW1teTwoKHZvaWQpX1ByZWQsIHRydWUpLi4uPj47CisKK3N0cnVjdCBfX3R1cGxlX3NmaW5hZV9iYXNlIHsKKyAgdGVtcGxhdGUgPHRlbXBsYXRlIDxjbGFzcywgY2xhc3MuLi4+IGNsYXNzIF9UcmFpdCwKKyAgICAgICAgICAgIGNsYXNzIC4uLl9MQXJncywgY2xhc3MgLi4uX1JBcmdzPgorICBzdGF0aWMgYXV0byBfX2RvX3Rlc3QoX190dXBsZV90eXBlczxfTEFyZ3MuLi4+LCBfX3R1cGxlX3R5cGVzPF9SQXJncy4uLj4pCisgICAgLT4gX19hbGw8dHlwZW5hbWUgZW5hYmxlX2lmPF9UcmFpdDxfTEFyZ3MsIF9SQXJncz46OnZhbHVlLCBib29sPjo6dHlwZXt0cnVlfS4uLj47CisgIHRlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3MuLi4+IGNsYXNzPgorICBzdGF0aWMgYXV0byBfX2RvX3Rlc3QoLi4uKSAtPiBmYWxzZV90eXBlOworCisgIHRlbXBsYXRlIDxjbGFzcyBfRnJvbUFyZ3MsIGNsYXNzIF9Ub0FyZ3M+CisgIHVzaW5nIF9fY29uc3RydWN0aWJsZSA9IGRlY2x0eXBlKF9fZG9fdGVzdDxpc19jb25zdHJ1Y3RpYmxlPihfVG9Bcmdze30sIF9Gcm9tQXJnc3t9KSk7CisgIHRlbXBsYXRlIDxjbGFzcyBfRnJvbUFyZ3MsIGNsYXNzIF9Ub0FyZ3M+CisgIHVzaW5nIF9fY29udmVydGlibGUgPSBkZWNsdHlwZShfX2RvX3Rlc3Q8aXNfY29udmVydGlibGU+KF9Gcm9tQXJnc3t9LCBfVG9Bcmdze30pKTsKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gcm9tQXJncywgY2xhc3MgX1RvQXJncz4KKyAgdXNpbmcgX19hc3NpZ25hYmxlID0gZGVjbHR5cGUoX19kb190ZXN0PGlzX2Fzc2lnbmFibGU+KF9Ub0FyZ3N7fSwgX0Zyb21Bcmdze30pKTsKK307CisKKy8vIF9fdHVwbGVfY29udmVydGlibGUKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwLCBib29sID0gX190dXBsZV9saWtlPHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sID0gX190dXBsZV9saWtlPF9VcD46OnZhbHVlPgorc3RydWN0IF9fdHVwbGVfY29udmVydGlibGUKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitzdHJ1Y3QgX190dXBsZV9jb252ZXJ0aWJsZTxfVHAsIF9VcCwgdHJ1ZSwgdHJ1ZT4KKyAgICA6IHB1YmxpYyBfX3R1cGxlX3NmaW5hZV9iYXNlOjpfX2NvbnZlcnRpYmxlPAorICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPF9UcD46OnR5cGUKKyAgICAsIHR5cGVuYW1lIF9fbWFrZV90dXBsZV90eXBlczxfVXA+Ojp0eXBlCisgICAgPgore307CisKKy8vIF9fdHVwbGVfY29uc3RydWN0aWJsZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXAsIGJvb2wgPSBfX3R1cGxlX2xpa2U8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgPSBfX3R1cGxlX2xpa2U8X1VwPjo6dmFsdWU+CitzdHJ1Y3QgX190dXBsZV9jb25zdHJ1Y3RpYmxlCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorc3RydWN0IF9fdHVwbGVfY29uc3RydWN0aWJsZTxfVHAsIF9VcCwgdHJ1ZSwgdHJ1ZT4KKyAgICA6IHB1YmxpYyBfX3R1cGxlX3NmaW5hZV9iYXNlOjpfX2NvbnN0cnVjdGlibGU8CisgICAgICB0eXBlbmFtZSBfX21ha2VfdHVwbGVfdHlwZXM8X1RwPjo6dHlwZQorICAgICwgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPF9VcD46OnR5cGUKKyAgICA+Cit7fTsKKworLy8gX190dXBsZV9hc3NpZ25hYmxlCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcCwgYm9vbCA9IF9fdHVwbGVfbGlrZTx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCA9IF9fdHVwbGVfbGlrZTxfVXA+Ojp2YWx1ZT4KK3N0cnVjdCBfX3R1cGxlX2Fzc2lnbmFibGUKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitzdHJ1Y3QgX190dXBsZV9hc3NpZ25hYmxlPF9UcCwgX1VwLCB0cnVlLCB0cnVlPgorICAgIDogcHVibGljIF9fdHVwbGVfc2ZpbmFlX2Jhc2U6Ol9fYXNzaWduYWJsZTwKKyAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV90eXBlczxfVHA+Ojp0eXBlCisgICAgLCB0eXBlbmFtZSBfX21ha2VfdHVwbGVfdHlwZXM8X1VwJj46OnR5cGUKKyAgICA+Cit7fTsKKworCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgLi4uX1RwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdHVwbGVfZWxlbWVudDxfSXAsIHR1cGxlPF9UcC4uLj4gPgoreworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSXAsIF9fdHVwbGVfdHlwZXM8X1RwLi4uPiA+Ojp0eXBlIHR5cGU7Cit9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcyAuLi5fVHA+Cit1c2luZyB0dXBsZV9lbGVtZW50X3QgPSB0eXBlbmFtZSB0dXBsZV9lbGVtZW50IDxfSXAsIF9UcC4uLj46OnR5cGU7CisjZW5kaWYKKwordGVtcGxhdGUgPGJvb2wgX0lzVHVwbGUsIGNsYXNzIF9TaXplVHJhaXQsIHNpemVfdCBfRXhwZWN0ZWQ+CitzdHJ1Y3QgX190dXBsZV9saWtlX3dpdGhfc2l6ZV9pbXAgOiBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1NpemVUcmFpdCwgc2l6ZV90IF9FeHBlY3RlZD4KK3N0cnVjdCBfX3R1cGxlX2xpa2Vfd2l0aF9zaXplX2ltcDx0cnVlLCBfU2l6ZVRyYWl0LCBfRXhwZWN0ZWQ+CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfU2l6ZVRyYWl0Ojp2YWx1ZSA9PSBfRXhwZWN0ZWQ+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1R1cGxlLCBzaXplX3QgX0V4cGVjdGVkU2l6ZSwKKyAgICAgICAgICBjbGFzcyBfUmF3VHVwbGUgPSB0eXBlbmFtZSBfX3VuY3ZyZWY8X1R1cGxlPjo6dHlwZT4KK3VzaW5nIF9fdHVwbGVfbGlrZV93aXRoX3NpemUgPSBfX3R1cGxlX2xpa2Vfd2l0aF9zaXplX2ltcDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190dXBsZV9saWtlPF9SYXdUdXBsZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZV9zaXplPF9SYXdUdXBsZT4sIF9FeHBlY3RlZFNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID47CisKK3N0cnVjdCBfTElCQ1BQX1RZUEVfVklTIF9fY2hlY2tfdHVwbGVfY29uc3RydWN0b3JfZmFpbCB7CisgICAgdGVtcGxhdGUgPGNsYXNzIC4uLj4KKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgX19lbmFibGVfZGVmYXVsdCgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgdGVtcGxhdGUgPGNsYXNzIC4uLj4KKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgX19lbmFibGVfZXhwbGljaXQoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIHRlbXBsYXRlIDxjbGFzcyAuLi4+CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9fZW5hYmxlX2ltcGxpY2l0KCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgLi4uPgorICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfX2VuYWJsZV9hc3NpZ24oKSB7IHJldHVybiBmYWxzZTsgfQorfTsKKyNlbmRpZiAvLyAhZGVmaW5lZChfTElCQ1BQX0NYWDAzX0xBTkcpCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAorCit0ZW1wbGF0ZSA8Ym9vbCBfQ2FuQ29weSwgYm9vbCBfQ2FuTW92ZT4KK3N0cnVjdCBfX3NmaW5hZV9jdG9yX2Jhc2Uge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9fc2ZpbmFlX2N0b3JfYmFzZTxmYWxzZSwgZmFsc2U+IHsKKyAgX19zZmluYWVfY3Rvcl9iYXNlKCkgPSBkZWZhdWx0OworICBfX3NmaW5hZV9jdG9yX2Jhc2UoX19zZmluYWVfY3Rvcl9iYXNlIGNvbnN0JikgPSBkZWxldGU7CisgIF9fc2ZpbmFlX2N0b3JfYmFzZShfX3NmaW5hZV9jdG9yX2Jhc2UgJiYpID0gZGVsZXRlOworICBfX3NmaW5hZV9jdG9yX2Jhc2UmIG9wZXJhdG9yPShfX3NmaW5hZV9jdG9yX2Jhc2UgY29uc3QmKSA9IGRlZmF1bHQ7CisgIF9fc2ZpbmFlX2N0b3JfYmFzZSYgb3BlcmF0b3I9KF9fc2ZpbmFlX2N0b3JfYmFzZSYmKSA9IGRlZmF1bHQ7Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBfX3NmaW5hZV9jdG9yX2Jhc2U8dHJ1ZSwgZmFsc2U+IHsKKyAgX19zZmluYWVfY3Rvcl9iYXNlKCkgPSBkZWZhdWx0OworICBfX3NmaW5hZV9jdG9yX2Jhc2UoX19zZmluYWVfY3Rvcl9iYXNlIGNvbnN0JikgPSBkZWZhdWx0OworICBfX3NmaW5hZV9jdG9yX2Jhc2UoX19zZmluYWVfY3Rvcl9iYXNlICYmKSA9IGRlbGV0ZTsKKyAgX19zZmluYWVfY3Rvcl9iYXNlJiBvcGVyYXRvcj0oX19zZmluYWVfY3Rvcl9iYXNlIGNvbnN0JikgPSBkZWZhdWx0OworICBfX3NmaW5hZV9jdG9yX2Jhc2UmIG9wZXJhdG9yPShfX3NmaW5hZV9jdG9yX2Jhc2UmJikgPSBkZWZhdWx0OworfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX19zZmluYWVfY3Rvcl9iYXNlPGZhbHNlLCB0cnVlPiB7CisgIF9fc2ZpbmFlX2N0b3JfYmFzZSgpID0gZGVmYXVsdDsKKyAgX19zZmluYWVfY3Rvcl9iYXNlKF9fc2ZpbmFlX2N0b3JfYmFzZSBjb25zdCYpID0gZGVsZXRlOworICBfX3NmaW5hZV9jdG9yX2Jhc2UoX19zZmluYWVfY3Rvcl9iYXNlICYmKSA9IGRlZmF1bHQ7CisgIF9fc2ZpbmFlX2N0b3JfYmFzZSYgb3BlcmF0b3I9KF9fc2ZpbmFlX2N0b3JfYmFzZSBjb25zdCYpID0gZGVmYXVsdDsKKyAgX19zZmluYWVfY3Rvcl9iYXNlJiBvcGVyYXRvcj0oX19zZmluYWVfY3Rvcl9iYXNlJiYpID0gZGVmYXVsdDsKK307CisKK3RlbXBsYXRlIDxib29sIF9DYW5Db3B5LCBib29sIF9DYW5Nb3ZlPgorc3RydWN0IF9fc2ZpbmFlX2Fzc2lnbl9iYXNlIHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBfX3NmaW5hZV9hc3NpZ25fYmFzZTxmYWxzZSwgZmFsc2U+IHsKKyAgX19zZmluYWVfYXNzaWduX2Jhc2UoKSA9IGRlZmF1bHQ7CisgIF9fc2ZpbmFlX2Fzc2lnbl9iYXNlKF9fc2ZpbmFlX2Fzc2lnbl9iYXNlIGNvbnN0JikgPSBkZWZhdWx0OworICBfX3NmaW5hZV9hc3NpZ25fYmFzZShfX3NmaW5hZV9hc3NpZ25fYmFzZSAmJikgPSBkZWZhdWx0OworICBfX3NmaW5hZV9hc3NpZ25fYmFzZSYgb3BlcmF0b3I9KF9fc2ZpbmFlX2Fzc2lnbl9iYXNlIGNvbnN0JikgPSBkZWxldGU7CisgIF9fc2ZpbmFlX2Fzc2lnbl9iYXNlJiBvcGVyYXRvcj0oX19zZmluYWVfYXNzaWduX2Jhc2UmJikgPSBkZWxldGU7Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBfX3NmaW5hZV9hc3NpZ25fYmFzZTx0cnVlLCBmYWxzZT4geworICBfX3NmaW5hZV9hc3NpZ25fYmFzZSgpID0gZGVmYXVsdDsKKyAgX19zZmluYWVfYXNzaWduX2Jhc2UoX19zZmluYWVfYXNzaWduX2Jhc2UgY29uc3QmKSA9IGRlZmF1bHQ7CisgIF9fc2ZpbmFlX2Fzc2lnbl9iYXNlKF9fc2ZpbmFlX2Fzc2lnbl9iYXNlICYmKSA9IGRlZmF1bHQ7CisgIF9fc2ZpbmFlX2Fzc2lnbl9iYXNlJiBvcGVyYXRvcj0oX19zZmluYWVfYXNzaWduX2Jhc2UgY29uc3QmKSA9IGRlZmF1bHQ7CisgIF9fc2ZpbmFlX2Fzc2lnbl9iYXNlJiBvcGVyYXRvcj0oX19zZmluYWVfYXNzaWduX2Jhc2UmJikgPSBkZWxldGU7Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBfX3NmaW5hZV9hc3NpZ25fYmFzZTxmYWxzZSwgdHJ1ZT4geworICBfX3NmaW5hZV9hc3NpZ25fYmFzZSgpID0gZGVmYXVsdDsKKyAgX19zZmluYWVfYXNzaWduX2Jhc2UoX19zZmluYWVfYXNzaWduX2Jhc2UgY29uc3QmKSA9IGRlZmF1bHQ7CisgIF9fc2ZpbmFlX2Fzc2lnbl9iYXNlKF9fc2ZpbmFlX2Fzc2lnbl9iYXNlICYmKSA9IGRlZmF1bHQ7CisgIF9fc2ZpbmFlX2Fzc2lnbl9iYXNlJiBvcGVyYXRvcj0oX19zZmluYWVfYXNzaWduX2Jhc2UgY29uc3QmKSA9IGRlbGV0ZTsKKyAgX19zZmluYWVfYXNzaWduX2Jhc2UmIG9wZXJhdG9yPShfX3NmaW5hZV9hc3NpZ25fYmFzZSYmKSA9IGRlZmF1bHQ7Cit9OworI2VuZGlmIC8vIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX19fVFVQTEUKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX3VuZGVmX21hY3JvcyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9fX3VuZGVmX21hY3JvcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGFiMWRiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL19fdW5kZWZfbWFjcm9zCkBAIC0wLDAgKzEsMzQgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBfX3VuZGVmX21hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZmRlZiBtaW4KKyNpZiAhZGVmaW5lZChfTElCQ1BQX0RJU0FCTEVfTUFDUk9fQ09ORkxJQ1RfV0FSTklOR1MpCisjaWYgZGVmaW5lZChfTElCQ1BQX1dBUk5JTkcpCitfTElCQ1BQX1dBUk5JTkcoIm1hY3JvIG1pbiBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKysuICBUcnkgI2RlZmluZSBOT01JTk1BWCAiCisgICAgICAgICAgICAgICAgImJlZm9yZSBhbnkgV2luZG93cyBoZWFkZXIuICN1bmRlZmluZyBtaW4iKQorI2Vsc2UKKyN3YXJuaW5nOiBtYWNybyBtaW4gaXMgaW5jb21wYXRpYmxlIHdpdGggQysrLiAgI3VuZGVmaW5nIG1pbgorI2VuZGlmCisjZW5kaWYKKyN1bmRlZiBtaW4KKyNlbmRpZgorCisjaWZkZWYgbWF4CisjaWYgIWRlZmluZWQoX0xJQkNQUF9ESVNBQkxFX01BQ1JPX0NPTkZMSUNUX1dBUk5JTkdTKQorI2lmIGRlZmluZWQoX0xJQkNQUF9XQVJOSU5HKQorX0xJQkNQUF9XQVJOSU5HKCJtYWNybyBtYXggaXMgaW5jb21wYXRpYmxlIHdpdGggQysrLiAgVHJ5ICNkZWZpbmUgTk9NSU5NQVggIgorICAgICAgICAgICAgICAgICJiZWZvcmUgYW55IFdpbmRvd3MgaGVhZGVyLiAjdW5kZWZpbmcgbWF4IikKKyNlbHNlCisjd2FybmluZzogbWFjcm8gbWF4IGlzIGluY29tcGF0aWJsZSB3aXRoIEMrKy4gICN1bmRlZmluZyBtYXgKKyNlbmRpZgorI2VuZGlmCisjdW5kZWYgbWF4CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9hbGdvcml0aG0gYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvYWxnb3JpdGhtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NGIwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvYWxnb3JpdGhtCkBAIC0wLDAgKzEsNTgyMSBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYWxnb3JpdGhtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9BTEdPUklUSE0KKyNkZWZpbmUgX0xJQkNQUF9BTEdPUklUSE0KKworLyoKKyAgICBhbGdvcml0aG0gc3lub3BzaXMKKworI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisKK25hbWVzcGFjZSBzdGQKK3sKKwordGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIFByZWRpY2F0ZT4KKyAgICBjb25zdGV4cHIgYm9vbCAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgYWxsX29mKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwgUHJlZGljYXRlIHByZWQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvciwgY2xhc3MgUHJlZGljYXRlPgorICAgIGNvbnN0ZXhwciBib29sICAgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICBhbnlfb2YoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBQcmVkaWNhdGUgcHJlZCk7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yLCBjbGFzcyBQcmVkaWNhdGU+CisgICAgY29uc3RleHByIGJvb2wgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIG5vbmVfb2YoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBQcmVkaWNhdGUgcHJlZCk7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yLCBjbGFzcyBGdW5jdGlvbj4KKyAgICBjb25zdGV4cHIgRnVuY3Rpb24gICAgICAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgZm9yX2VhY2goSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBGdW5jdGlvbiBmKTsKKwordGVtcGxhdGU8Y2xhc3MgSW5wdXRJdGVyYXRvciwgY2xhc3MgU2l6ZSwgY2xhc3MgRnVuY3Rpb24+CisgICAgY29uc3RleHByIElucHV0SXRlcmF0b3IgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIGZvcl9lYWNoX24oSW5wdXRJdGVyYXRvciBmaXJzdCwgU2l6ZSBuLCBGdW5jdGlvbiBmKTsgLy8gQysrMTcKKwordGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIFQ+CisgICAgY29uc3RleHByIElucHV0SXRlcmF0b3IgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIGZpbmQoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBjb25zdCBUJiB2YWx1ZSk7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yLCBjbGFzcyBQcmVkaWNhdGU+CisgICAgY29uc3RleHByIElucHV0SXRlcmF0b3IgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIGZpbmRfaWYoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBQcmVkaWNhdGUgcHJlZCk7CisKK3RlbXBsYXRlPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIFByZWRpY2F0ZT4KKyAgICBJbnB1dEl0ZXJhdG9yICAgICAgICAgICAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgZmluZF9pZl9ub3QoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBQcmVkaWNhdGUgcHJlZCk7CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3IxLCBjbGFzcyBGb3J3YXJkSXRlcmF0b3IyPgorICAgIEZvcndhcmRJdGVyYXRvcjEgICAgICAgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICBmaW5kX2VuZChGb3J3YXJkSXRlcmF0b3IxIGZpcnN0MSwgRm9yd2FyZEl0ZXJhdG9yMSBsYXN0MSwKKyAgICAgICAgICAgICBGb3J3YXJkSXRlcmF0b3IyIGZpcnN0MiwgRm9yd2FyZEl0ZXJhdG9yMiBsYXN0Mik7CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3IxLCBjbGFzcyBGb3J3YXJkSXRlcmF0b3IyLCBjbGFzcyBCaW5hcnlQcmVkaWNhdGU+CisgICAgRm9yd2FyZEl0ZXJhdG9yMSAgICAgICAgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIGZpbmRfZW5kKEZvcndhcmRJdGVyYXRvcjEgZmlyc3QxLCBGb3J3YXJkSXRlcmF0b3IxIGxhc3QxLAorICAgICAgICAgICAgIEZvcndhcmRJdGVyYXRvcjIgZmlyc3QyLCBGb3J3YXJkSXRlcmF0b3IyIGxhc3QyLCBCaW5hcnlQcmVkaWNhdGUgcHJlZCk7CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3IxLCBjbGFzcyBGb3J3YXJkSXRlcmF0b3IyPgorICAgIGNvbnN0ZXhwciBGb3J3YXJkSXRlcmF0b3IxICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICBmaW5kX2ZpcnN0X29mKEZvcndhcmRJdGVyYXRvcjEgZmlyc3QxLCBGb3J3YXJkSXRlcmF0b3IxIGxhc3QxLAorICAgICAgICAgICAgICAgICAgRm9yd2FyZEl0ZXJhdG9yMiBmaXJzdDIsIEZvcndhcmRJdGVyYXRvcjIgbGFzdDIpOworCit0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yMSwgY2xhc3MgRm9yd2FyZEl0ZXJhdG9yMiwgY2xhc3MgQmluYXJ5UHJlZGljYXRlPgorICAgIGNvbnN0ZXhwciBGb3J3YXJkSXRlcmF0b3IxICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICBmaW5kX2ZpcnN0X29mKEZvcndhcmRJdGVyYXRvcjEgZmlyc3QxLCBGb3J3YXJkSXRlcmF0b3IxIGxhc3QxLAorICAgICAgICAgICAgICAgICAgRm9yd2FyZEl0ZXJhdG9yMiBmaXJzdDIsIEZvcndhcmRJdGVyYXRvcjIgbGFzdDIsIEJpbmFyeVByZWRpY2F0ZSBwcmVkKTsKKwordGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvcj4KKyAgICBjb25zdGV4cHIgRm9yd2FyZEl0ZXJhdG9yICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgYWRqYWNlbnRfZmluZChGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvciwgY2xhc3MgQmluYXJ5UHJlZGljYXRlPgorICAgIGNvbnN0ZXhwciBGb3J3YXJkSXRlcmF0b3IgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICBhZGphY2VudF9maW5kKEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QsIEJpbmFyeVByZWRpY2F0ZSBwcmVkKTsKKwordGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIFQ+CisgICAgY29uc3RleHByIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxJbnB1dEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICBjb3VudChJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIGNvbnN0IFQmIHZhbHVlKTsKKwordGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIFByZWRpY2F0ZT4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPElucHV0SXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgY291bnRfaWYoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBQcmVkaWNhdGUgcHJlZCk7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yMSwgY2xhc3MgSW5wdXRJdGVyYXRvcjI+CisgICAgY29uc3RleHByIHBhaXI8SW5wdXRJdGVyYXRvcjEsIElucHV0SXRlcmF0b3IyPiAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIG1pc21hdGNoKElucHV0SXRlcmF0b3IxIGZpcnN0MSwgSW5wdXRJdGVyYXRvcjEgbGFzdDEsIElucHV0SXRlcmF0b3IyIGZpcnN0Mik7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yMSwgY2xhc3MgSW5wdXRJdGVyYXRvcjI+CisgICAgY29uc3RleHByIHBhaXI8SW5wdXRJdGVyYXRvcjEsIElucHV0SXRlcmF0b3IyPiAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIG1pc21hdGNoKElucHV0SXRlcmF0b3IxIGZpcnN0MSwgSW5wdXRJdGVyYXRvcjEgbGFzdDEsCisgICAgICAgICAgICAgSW5wdXRJdGVyYXRvcjIgZmlyc3QyLCBJbnB1dEl0ZXJhdG9yMiBsYXN0Mik7IC8vICoqQysrMTQqKgorCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcjEsIGNsYXNzIElucHV0SXRlcmF0b3IyLCBjbGFzcyBCaW5hcnlQcmVkaWNhdGU+CisgICAgY29uc3RleHByIHBhaXI8SW5wdXRJdGVyYXRvcjEsIElucHV0SXRlcmF0b3IyPiAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIG1pc21hdGNoKElucHV0SXRlcmF0b3IxIGZpcnN0MSwgSW5wdXRJdGVyYXRvcjEgbGFzdDEsCisgICAgICAgICAgICAgSW5wdXRJdGVyYXRvcjIgZmlyc3QyLCBCaW5hcnlQcmVkaWNhdGUgcHJlZCk7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yMSwgY2xhc3MgSW5wdXRJdGVyYXRvcjIsIGNsYXNzIEJpbmFyeVByZWRpY2F0ZT4KKyAgICBjb25zdGV4cHIgcGFpcjxJbnB1dEl0ZXJhdG9yMSwgSW5wdXRJdGVyYXRvcjI+ICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgbWlzbWF0Y2goSW5wdXRJdGVyYXRvcjEgZmlyc3QxLCBJbnB1dEl0ZXJhdG9yMSBsYXN0MSwKKyAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yMiBmaXJzdDIsIElucHV0SXRlcmF0b3IyIGxhc3QyLAorICAgICAgICAgICAgIEJpbmFyeVByZWRpY2F0ZSBwcmVkKTsgLy8gKipDKysxNCoqCisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yMSwgY2xhc3MgSW5wdXRJdGVyYXRvcjI+CisgICAgY29uc3RleHByIGJvb2wgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICBlcXVhbChJbnB1dEl0ZXJhdG9yMSBmaXJzdDEsIElucHV0SXRlcmF0b3IxIGxhc3QxLCBJbnB1dEl0ZXJhdG9yMiBmaXJzdDIpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcjEsIGNsYXNzIElucHV0SXRlcmF0b3IyPgorICAgIGNvbnN0ZXhwciBib29sICAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgZXF1YWwoSW5wdXRJdGVyYXRvcjEgZmlyc3QxLCBJbnB1dEl0ZXJhdG9yMSBsYXN0MSwKKyAgICAgICAgICBJbnB1dEl0ZXJhdG9yMiBmaXJzdDIsIElucHV0SXRlcmF0b3IyIGxhc3QyKTsgLy8gKipDKysxNCoqCisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yMSwgY2xhc3MgSW5wdXRJdGVyYXRvcjIsIGNsYXNzIEJpbmFyeVByZWRpY2F0ZT4KKyAgICBjb25zdGV4cHIgYm9vbCAgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIGVxdWFsKElucHV0SXRlcmF0b3IxIGZpcnN0MSwgSW5wdXRJdGVyYXRvcjEgbGFzdDEsCisgICAgICAgICAgSW5wdXRJdGVyYXRvcjIgZmlyc3QyLCBCaW5hcnlQcmVkaWNhdGUgcHJlZCk7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yMSwgY2xhc3MgSW5wdXRJdGVyYXRvcjIsIGNsYXNzIEJpbmFyeVByZWRpY2F0ZT4KKyAgICBjb25zdGV4cHIgYm9vbCAgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIGVxdWFsKElucHV0SXRlcmF0b3IxIGZpcnN0MSwgSW5wdXRJdGVyYXRvcjEgbGFzdDEsCisgICAgICAgICAgSW5wdXRJdGVyYXRvcjIgZmlyc3QyLCBJbnB1dEl0ZXJhdG9yMiBsYXN0MiwKKyAgICAgICAgICBCaW5hcnlQcmVkaWNhdGUgcHJlZCk7IC8vICoqQysrMTQqKgorCit0ZW1wbGF0ZTxjbGFzcyBGb3J3YXJkSXRlcmF0b3IxLCBjbGFzcyBGb3J3YXJkSXRlcmF0b3IyPgorICAgIGNvbnN0ZXhwciBib29sICAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgaXNfcGVybXV0YXRpb24oRm9yd2FyZEl0ZXJhdG9yMSBmaXJzdDEsIEZvcndhcmRJdGVyYXRvcjEgbGFzdDEsCisgICAgICAgICAgICAgICAgICAgRm9yd2FyZEl0ZXJhdG9yMiBmaXJzdDIpOworCit0ZW1wbGF0ZTxjbGFzcyBGb3J3YXJkSXRlcmF0b3IxLCBjbGFzcyBGb3J3YXJkSXRlcmF0b3IyPgorICAgIGNvbnN0ZXhwciBib29sICAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgaXNfcGVybXV0YXRpb24oRm9yd2FyZEl0ZXJhdG9yMSBmaXJzdDEsIEZvcndhcmRJdGVyYXRvcjEgbGFzdDEsCisgICAgICAgICAgICAgICAgICAgRm9yd2FyZEl0ZXJhdG9yMiBmaXJzdDIsIEZvcndhcmRJdGVyYXRvcjIgbGFzdDIpOyAvLyAqKkMrKzE0KioKKwordGVtcGxhdGU8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yMSwgY2xhc3MgRm9yd2FyZEl0ZXJhdG9yMiwgY2xhc3MgQmluYXJ5UHJlZGljYXRlPgorICAgIGNvbnN0ZXhwciBib29sICAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgaXNfcGVybXV0YXRpb24oRm9yd2FyZEl0ZXJhdG9yMSBmaXJzdDEsIEZvcndhcmRJdGVyYXRvcjEgbGFzdDEsCisgICAgICAgICAgICAgICAgICAgRm9yd2FyZEl0ZXJhdG9yMiBmaXJzdDIsIEJpbmFyeVByZWRpY2F0ZSBwcmVkKTsKKwordGVtcGxhdGU8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yMSwgY2xhc3MgRm9yd2FyZEl0ZXJhdG9yMiwgY2xhc3MgQmluYXJ5UHJlZGljYXRlPgorICAgIGNvbnN0ZXhwciBib29sICAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgaXNfcGVybXV0YXRpb24oRm9yd2FyZEl0ZXJhdG9yMSBmaXJzdDEsIEZvcndhcmRJdGVyYXRvcjEgbGFzdDEsCisgICAgICAgICAgICAgICAgICAgRm9yd2FyZEl0ZXJhdG9yMiBmaXJzdDIsIEZvcndhcmRJdGVyYXRvcjIgbGFzdDIsCisgICAgICAgICAgICAgICAgICAgQmluYXJ5UHJlZGljYXRlIHByZWQpOyAgLy8gKipDKysxNCoqCisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3IxLCBjbGFzcyBGb3J3YXJkSXRlcmF0b3IyPgorICAgIGNvbnN0ZXhwciBGb3J3YXJkSXRlcmF0b3IxICAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgc2VhcmNoKEZvcndhcmRJdGVyYXRvcjEgZmlyc3QxLCBGb3J3YXJkSXRlcmF0b3IxIGxhc3QxLAorICAgICAgICAgICBGb3J3YXJkSXRlcmF0b3IyIGZpcnN0MiwgRm9yd2FyZEl0ZXJhdG9yMiBsYXN0Mik7CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3IxLCBjbGFzcyBGb3J3YXJkSXRlcmF0b3IyLCBjbGFzcyBCaW5hcnlQcmVkaWNhdGU+CisgICAgY29uc3RleHByIEZvcndhcmRJdGVyYXRvcjEgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICBzZWFyY2goRm9yd2FyZEl0ZXJhdG9yMSBmaXJzdDEsIEZvcndhcmRJdGVyYXRvcjEgbGFzdDEsCisgICAgICAgICAgIEZvcndhcmRJdGVyYXRvcjIgZmlyc3QyLCBGb3J3YXJkSXRlcmF0b3IyIGxhc3QyLCBCaW5hcnlQcmVkaWNhdGUgcHJlZCk7CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3IsIGNsYXNzIFNpemUsIGNsYXNzIFQ+CisgICAgY29uc3RleHByIEZvcndhcmRJdGVyYXRvciAgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICBzZWFyY2hfbihGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0LCBTaXplIGNvdW50LCBjb25zdCBUJiB2YWx1ZSk7CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3IsIGNsYXNzIFNpemUsIGNsYXNzIFQsIGNsYXNzIEJpbmFyeVByZWRpY2F0ZT4KKyAgICBjb25zdGV4cHIgRm9yd2FyZEl0ZXJhdG9yICAgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIHNlYXJjaF9uKEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICAgU2l6ZSBjb3VudCwgY29uc3QgVCYgdmFsdWUsIEJpbmFyeVByZWRpY2F0ZSBwcmVkKTsKKwordGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIE91dHB1dEl0ZXJhdG9yPgorICAgIE91dHB1dEl0ZXJhdG9yCisgICAgY29weShJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIE91dHB1dEl0ZXJhdG9yIHJlc3VsdCk7CisKK3RlbXBsYXRlPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIE91dHB1dEl0ZXJhdG9yLCBjbGFzcyBQcmVkaWNhdGU+CisgICAgT3V0cHV0SXRlcmF0b3IKKyAgICBjb3B5X2lmKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwKKyAgICAgICAgICAgIE91dHB1dEl0ZXJhdG9yIHJlc3VsdCwgUHJlZGljYXRlIHByZWQpOworCit0ZW1wbGF0ZTxjbGFzcyBJbnB1dEl0ZXJhdG9yLCBjbGFzcyBTaXplLCBjbGFzcyBPdXRwdXRJdGVyYXRvcj4KKyAgICBPdXRwdXRJdGVyYXRvcgorICAgIGNvcHlfbihJbnB1dEl0ZXJhdG9yIGZpcnN0LCBTaXplIG4sIE91dHB1dEl0ZXJhdG9yIHJlc3VsdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBCaWRpcmVjdGlvbmFsSXRlcmF0b3IxLCBjbGFzcyBCaWRpcmVjdGlvbmFsSXRlcmF0b3IyPgorICAgIEJpZGlyZWN0aW9uYWxJdGVyYXRvcjIKKyAgICBjb3B5X2JhY2t3YXJkKEJpZGlyZWN0aW9uYWxJdGVyYXRvcjEgZmlyc3QsIEJpZGlyZWN0aW9uYWxJdGVyYXRvcjEgbGFzdCwKKyAgICAgICAgICAgICAgICAgIEJpZGlyZWN0aW9uYWxJdGVyYXRvcjIgcmVzdWx0KTsKKwordGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvcjEsIGNsYXNzIEZvcndhcmRJdGVyYXRvcjI+CisgICAgRm9yd2FyZEl0ZXJhdG9yMgorICAgIHN3YXBfcmFuZ2VzKEZvcndhcmRJdGVyYXRvcjEgZmlyc3QxLCBGb3J3YXJkSXRlcmF0b3IxIGxhc3QxLCBGb3J3YXJkSXRlcmF0b3IyIGZpcnN0Mik7CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3IxLCBjbGFzcyBGb3J3YXJkSXRlcmF0b3IyPgorICAgIHZvaWQKKyAgICBpdGVyX3N3YXAoRm9yd2FyZEl0ZXJhdG9yMSBhLCBGb3J3YXJkSXRlcmF0b3IyIGIpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvciwgY2xhc3MgT3V0cHV0SXRlcmF0b3IsIGNsYXNzIFVuYXJ5T3BlcmF0aW9uPgorICAgIGNvbnN0ZXhwciBPdXRwdXRJdGVyYXRvciAgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIHRyYW5zZm9ybShJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIE91dHB1dEl0ZXJhdG9yIHJlc3VsdCwgVW5hcnlPcGVyYXRpb24gb3ApOworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcjEsIGNsYXNzIElucHV0SXRlcmF0b3IyLCBjbGFzcyBPdXRwdXRJdGVyYXRvciwgY2xhc3MgQmluYXJ5T3BlcmF0aW9uPgorICAgIGNvbnN0ZXhwciBPdXRwdXRJdGVyYXRvciAgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIHRyYW5zZm9ybShJbnB1dEl0ZXJhdG9yMSBmaXJzdDEsIElucHV0SXRlcmF0b3IxIGxhc3QxLCBJbnB1dEl0ZXJhdG9yMiBmaXJzdDIsCisgICAgICAgICAgICAgIE91dHB1dEl0ZXJhdG9yIHJlc3VsdCwgQmluYXJ5T3BlcmF0aW9uIGJpbmFyeV9vcCk7CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3IsIGNsYXNzIFQ+CisgICAgY29uc3RleHByIHZvaWQgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICByZXBsYWNlKEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QsIGNvbnN0IFQmIG9sZF92YWx1ZSwgY29uc3QgVCYgbmV3X3ZhbHVlKTsKKwordGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvciwgY2xhc3MgUHJlZGljYXRlLCBjbGFzcyBUPgorICAgIGNvbnN0ZXhwciB2b2lkICAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgcmVwbGFjZV9pZihGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0LCBQcmVkaWNhdGUgcHJlZCwgY29uc3QgVCYgbmV3X3ZhbHVlKTsKKwordGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIE91dHB1dEl0ZXJhdG9yLCBjbGFzcyBUPgorICAgIGNvbnN0ZXhwciBPdXRwdXRJdGVyYXRvciAgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIHJlcGxhY2VfY29weShJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIE91dHB1dEl0ZXJhdG9yIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgY29uc3QgVCYgb2xkX3ZhbHVlLCBjb25zdCBUJiBuZXdfdmFsdWUpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvciwgY2xhc3MgT3V0cHV0SXRlcmF0b3IsIGNsYXNzIFByZWRpY2F0ZSwgY2xhc3MgVD4KKyAgICBjb25zdGV4cHIgT3V0cHV0SXRlcmF0b3IgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICByZXBsYWNlX2NvcHlfaWYoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBPdXRwdXRJdGVyYXRvciByZXN1bHQsIFByZWRpY2F0ZSBwcmVkLCBjb25zdCBUJiBuZXdfdmFsdWUpOworCit0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBUPgorICAgIGNvbnN0ZXhwciB2b2lkICAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgZmlsbChGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0LCBjb25zdCBUJiB2YWx1ZSk7CisKK3RlbXBsYXRlIDxjbGFzcyBPdXRwdXRJdGVyYXRvciwgY2xhc3MgU2l6ZSwgY2xhc3MgVD4KKyAgICBjb25zdGV4cHIgT3V0cHV0SXRlcmF0b3IgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICBmaWxsX24oT3V0cHV0SXRlcmF0b3IgZmlyc3QsIFNpemUgbiwgY29uc3QgVCYgdmFsdWUpOworCit0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBHZW5lcmF0b3I+CisgICAgY29uc3RleHByIHZvaWQgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICBnZW5lcmF0ZShGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0LCBHZW5lcmF0b3IgZ2VuKTsKKwordGVtcGxhdGUgPGNsYXNzIE91dHB1dEl0ZXJhdG9yLCBjbGFzcyBTaXplLCBjbGFzcyBHZW5lcmF0b3I+CisgICAgY29uc3RleHByIE91dHB1dEl0ZXJhdG9yICAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgZ2VuZXJhdGVfbihPdXRwdXRJdGVyYXRvciBmaXJzdCwgU2l6ZSBuLCBHZW5lcmF0b3IgZ2VuKTsKKwordGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvciwgY2xhc3MgVD4KKyAgICBjb25zdGV4cHIgRm9yd2FyZEl0ZXJhdG9yICAgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICByZW1vdmUoRm9yd2FyZEl0ZXJhdG9yIGZpcnN0LCBGb3J3YXJkSXRlcmF0b3IgbGFzdCwgY29uc3QgVCYgdmFsdWUpOworCit0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBQcmVkaWNhdGU+CisgICAgY29uc3RleHByIEZvcndhcmRJdGVyYXRvciAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgcmVtb3ZlX2lmKEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QsIFByZWRpY2F0ZSBwcmVkKTsKKwordGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIE91dHB1dEl0ZXJhdG9yLCBjbGFzcyBUPgorICAgIGNvbnN0ZXhwciBPdXRwdXRJdGVyYXRvciAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgcmVtb3ZlX2NvcHkoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBPdXRwdXRJdGVyYXRvciByZXN1bHQsIGNvbnN0IFQmIHZhbHVlKTsKKwordGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIE91dHB1dEl0ZXJhdG9yLCBjbGFzcyBQcmVkaWNhdGU+CisgICAgY29uc3RleHByIE91dHB1dEl0ZXJhdG9yICAgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICByZW1vdmVfY29weV9pZihJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIE91dHB1dEl0ZXJhdG9yIHJlc3VsdCwgUHJlZGljYXRlIHByZWQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yPgorICAgIEZvcndhcmRJdGVyYXRvcgorICAgIHVuaXF1ZShGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvciwgY2xhc3MgQmluYXJ5UHJlZGljYXRlPgorICAgIEZvcndhcmRJdGVyYXRvcgorICAgIHVuaXF1ZShGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0LCBCaW5hcnlQcmVkaWNhdGUgcHJlZCk7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yLCBjbGFzcyBPdXRwdXRJdGVyYXRvcj4KKyAgICBPdXRwdXRJdGVyYXRvcgorICAgIHVuaXF1ZV9jb3B5KElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwgT3V0cHV0SXRlcmF0b3IgcmVzdWx0KTsKKwordGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIE91dHB1dEl0ZXJhdG9yLCBjbGFzcyBCaW5hcnlQcmVkaWNhdGU+CisgICAgT3V0cHV0SXRlcmF0b3IKKyAgICB1bmlxdWVfY29weShJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIE91dHB1dEl0ZXJhdG9yIHJlc3VsdCwgQmluYXJ5UHJlZGljYXRlIHByZWQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgorICAgIHZvaWQKKyAgICByZXZlcnNlKEJpZGlyZWN0aW9uYWxJdGVyYXRvciBmaXJzdCwgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGxhc3QpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBPdXRwdXRJdGVyYXRvcj4KKyAgICBjb25zdGV4cHIgT3V0cHV0SXRlcmF0b3IgICAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgcmV2ZXJzZV9jb3B5KEJpZGlyZWN0aW9uYWxJdGVyYXRvciBmaXJzdCwgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGxhc3QsIE91dHB1dEl0ZXJhdG9yIHJlc3VsdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3I+CisgICAgRm9yd2FyZEl0ZXJhdG9yCisgICAgcm90YXRlKEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIG1pZGRsZSwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QpOworCit0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBPdXRwdXRJdGVyYXRvcj4KKyAgICBPdXRwdXRJdGVyYXRvcgorICAgIHJvdGF0ZV9jb3B5KEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIG1pZGRsZSwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QsIE91dHB1dEl0ZXJhdG9yIHJlc3VsdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBSYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgcmFuZG9tX3NodWZmbGUoUmFuZG9tQWNjZXNzSXRlcmF0b3IgZmlyc3QsIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIGxhc3QpOyAvLyBkZXByZWNhdGVkIGluIEMrKzE0LCByZW1vdmVkIGluIEMrKzE3CisKK3RlbXBsYXRlIDxjbGFzcyBSYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgIHZvaWQKKyAgICByYW5kb21fc2h1ZmZsZShSYW5kb21BY2Nlc3NJdGVyYXRvciBmaXJzdCwgUmFuZG9tQWNjZXNzSXRlcmF0b3IgbGFzdCwKKyAgICAgICAgICAgICAgICAgICBSYW5kb21OdW1iZXJHZW5lcmF0b3ImIHJhbmQpOyAgLy8gZGVwcmVjYXRlZCBpbiBDKysxNCwgcmVtb3ZlZCBpbiBDKysxNworCit0ZW1wbGF0ZTxjbGFzcyBQb3B1bGF0aW9uSXRlcmF0b3IsIGNsYXNzIFNhbXBsZUl0ZXJhdG9yLAorICAgICAgICAgY2xhc3MgRGlzdGFuY2UsIGNsYXNzIFVuaWZvcm1SYW5kb21CaXRHZW5lcmF0b3I+CisgICAgU2FtcGxlSXRlcmF0b3Igc2FtcGxlKFBvcHVsYXRpb25JdGVyYXRvciBmaXJzdCwgUG9wdWxhdGlvbkl0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUl0ZXJhdG9yIG91dCwgRGlzdGFuY2UgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pZm9ybVJhbmRvbUJpdEdlbmVyYXRvciYmIGcpOyAvLyBDKysxNworCit0ZW1wbGF0ZTxjbGFzcyBSYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICB2b2lkIHNodWZmbGUoUmFuZG9tQWNjZXNzSXRlcmF0b3IgZmlyc3QsIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICAgICAgIFVuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImJiBnKTsKKwordGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIFByZWRpY2F0ZT4KKyAgICBjb25zdGV4cHIgYm9vbCAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgaXNfcGFydGl0aW9uZWQoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBQcmVkaWNhdGUgcHJlZCk7CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3IsIGNsYXNzIFByZWRpY2F0ZT4KKyAgICBGb3J3YXJkSXRlcmF0b3IKKyAgICBwYXJ0aXRpb24oRm9yd2FyZEl0ZXJhdG9yIGZpcnN0LCBGb3J3YXJkSXRlcmF0b3IgbGFzdCwgUHJlZGljYXRlIHByZWQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvciwgY2xhc3MgT3V0cHV0SXRlcmF0b3IxLAorICAgICAgICAgIGNsYXNzIE91dHB1dEl0ZXJhdG9yMiwgY2xhc3MgUHJlZGljYXRlPgorICAgIGNvbnN0ZXhwciBwYWlyPE91dHB1dEl0ZXJhdG9yMSwgT3V0cHV0SXRlcmF0b3IyPiAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIHBhcnRpdGlvbl9jb3B5KElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwKKyAgICAgICAgICAgICAgICAgICBPdXRwdXRJdGVyYXRvcjEgb3V0X3RydWUsIE91dHB1dEl0ZXJhdG9yMiBvdXRfZmFsc2UsCisgICAgICAgICAgICAgICAgICAgUHJlZGljYXRlIHByZWQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBQcmVkaWNhdGU+CisgICAgRm9yd2FyZEl0ZXJhdG9yCisgICAgc3RhYmxlX3BhcnRpdGlvbihGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0LCBQcmVkaWNhdGUgcHJlZCk7CisKK3RlbXBsYXRlPGNsYXNzIEZvcndhcmRJdGVyYXRvciwgY2xhc3MgUHJlZGljYXRlPgorICAgIGNvbnN0ZXhwciBGb3J3YXJkSXRlcmF0b3IgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIHBhcnRpdGlvbl9wb2ludChGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0LCBQcmVkaWNhdGUgcHJlZCk7CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3I+CisgICAgY29uc3RleHByIGJvb2wgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIGlzX3NvcnRlZChGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvciwgY2xhc3MgQ29tcGFyZT4KKyAgICBib29sCisgICAgaXNfc29ydGVkKEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QsIENvbXBhcmUgY29tcCk7CisKK3RlbXBsYXRlPGNsYXNzIEZvcndhcmRJdGVyYXRvcj4KKyAgICBjb25zdGV4cHIgRm9yd2FyZEl0ZXJhdG9yICAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIGlzX3NvcnRlZF91bnRpbChGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvciwgY2xhc3MgQ29tcGFyZT4KKyAgICBjb25zdGV4cHIgRm9yd2FyZEl0ZXJhdG9yICAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIGlzX3NvcnRlZF91bnRpbChGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0LCBDb21wYXJlIGNvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgdm9pZAorICAgIHNvcnQoUmFuZG9tQWNjZXNzSXRlcmF0b3IgZmlyc3QsIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIGxhc3QpOworCit0ZW1wbGF0ZSA8Y2xhc3MgUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIENvbXBhcmU+CisgICAgdm9pZAorICAgIHNvcnQoUmFuZG9tQWNjZXNzSXRlcmF0b3IgZmlyc3QsIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIGxhc3QsIENvbXBhcmUgY29tcCk7CisKK3RlbXBsYXRlIDxjbGFzcyBSYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgc3RhYmxlX3NvcnQoUmFuZG9tQWNjZXNzSXRlcmF0b3IgZmlyc3QsIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIGxhc3QpOworCit0ZW1wbGF0ZSA8Y2xhc3MgUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIENvbXBhcmU+CisgICAgdm9pZAorICAgIHN0YWJsZV9zb3J0KFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIGZpcnN0LCBSYW5kb21BY2Nlc3NJdGVyYXRvciBsYXN0LCBDb21wYXJlIGNvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgdm9pZAorICAgIHBhcnRpYWxfc29ydChSYW5kb21BY2Nlc3NJdGVyYXRvciBmaXJzdCwgUmFuZG9tQWNjZXNzSXRlcmF0b3IgbWlkZGxlLCBSYW5kb21BY2Nlc3NJdGVyYXRvciBsYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBDb21wYXJlPgorICAgIHZvaWQKKyAgICBwYXJ0aWFsX3NvcnQoUmFuZG9tQWNjZXNzSXRlcmF0b3IgZmlyc3QsIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIG1pZGRsZSwgUmFuZG9tQWNjZXNzSXRlcmF0b3IgbGFzdCwgQ29tcGFyZSBjb21wKTsKKwordGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yCisgICAgcGFydGlhbF9zb3J0X2NvcHkoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LAorICAgICAgICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIHJlc3VsdF9maXJzdCwgUmFuZG9tQWNjZXNzSXRlcmF0b3IgcmVzdWx0X2xhc3QpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvciwgY2xhc3MgUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIENvbXBhcmU+CisgICAgUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICBwYXJ0aWFsX3NvcnRfY29weShJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzSXRlcmF0b3IgcmVzdWx0X2ZpcnN0LCBSYW5kb21BY2Nlc3NJdGVyYXRvciByZXN1bHRfbGFzdCwgQ29tcGFyZSBjb21wKTsKKwordGVtcGxhdGUgPGNsYXNzIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBudGhfZWxlbWVudChSYW5kb21BY2Nlc3NJdGVyYXRvciBmaXJzdCwgUmFuZG9tQWNjZXNzSXRlcmF0b3IgbnRoLCBSYW5kb21BY2Nlc3NJdGVyYXRvciBsYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBDb21wYXJlPgorICAgIHZvaWQKKyAgICBudGhfZWxlbWVudChSYW5kb21BY2Nlc3NJdGVyYXRvciBmaXJzdCwgUmFuZG9tQWNjZXNzSXRlcmF0b3IgbnRoLCBSYW5kb21BY2Nlc3NJdGVyYXRvciBsYXN0LCBDb21wYXJlIGNvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBUPgorICAgIGNvbnN0ZXhwciBGb3J3YXJkSXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgbG93ZXJfYm91bmQoRm9yd2FyZEl0ZXJhdG9yIGZpcnN0LCBGb3J3YXJkSXRlcmF0b3IgbGFzdCwgY29uc3QgVCYgdmFsdWUpOworCit0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBULCBjbGFzcyBDb21wYXJlPgorICAgIGNvbnN0ZXhwciBGb3J3YXJkSXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgbG93ZXJfYm91bmQoRm9yd2FyZEl0ZXJhdG9yIGZpcnN0LCBGb3J3YXJkSXRlcmF0b3IgbGFzdCwgY29uc3QgVCYgdmFsdWUsIENvbXBhcmUgY29tcCk7CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3IsIGNsYXNzIFQ+CisgICAgY29uc3RleHByIEZvcndhcmRJdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICB1cHBlcl9ib3VuZChGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0LCBjb25zdCBUJiB2YWx1ZSk7CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3IsIGNsYXNzIFQsIGNsYXNzIENvbXBhcmU+CisgICAgY29uc3RleHByIEZvcndhcmRJdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICB1cHBlcl9ib3VuZChGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0LCBjb25zdCBUJiB2YWx1ZSwgQ29tcGFyZSBjb21wKTsKKwordGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvciwgY2xhc3MgVD4KKyAgICBjb25zdGV4cHIgcGFpcjxGb3J3YXJkSXRlcmF0b3IsIEZvcndhcmRJdGVyYXRvcj4gIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIGVxdWFsX3JhbmdlKEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QsIGNvbnN0IFQmIHZhbHVlKTsKKwordGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvciwgY2xhc3MgVCwgY2xhc3MgQ29tcGFyZT4KKyAgICBjb25zdGV4cHIgcGFpcjxGb3J3YXJkSXRlcmF0b3IsIEZvcndhcmRJdGVyYXRvcj4gIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIGVxdWFsX3JhbmdlKEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QsIGNvbnN0IFQmIHZhbHVlLCBDb21wYXJlIGNvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBUPgorICAgIGNvbnN0ZXhwciBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgYmluYXJ5X3NlYXJjaChGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0LCBjb25zdCBUJiB2YWx1ZSk7CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3IsIGNsYXNzIFQsIGNsYXNzIENvbXBhcmU+CisgICAgY29uc3RleHByIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICBiaW5hcnlfc2VhcmNoKEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QsIGNvbnN0IFQmIHZhbHVlLCBDb21wYXJlIGNvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcjEsIGNsYXNzIElucHV0SXRlcmF0b3IyLCBjbGFzcyBPdXRwdXRJdGVyYXRvcj4KKyAgICBPdXRwdXRJdGVyYXRvcgorICAgIG1lcmdlKElucHV0SXRlcmF0b3IxIGZpcnN0MSwgSW5wdXRJdGVyYXRvcjEgbGFzdDEsCisgICAgICAgICAgSW5wdXRJdGVyYXRvcjIgZmlyc3QyLCBJbnB1dEl0ZXJhdG9yMiBsYXN0MiwgT3V0cHV0SXRlcmF0b3IgcmVzdWx0KTsKKwordGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3IxLCBjbGFzcyBJbnB1dEl0ZXJhdG9yMiwgY2xhc3MgT3V0cHV0SXRlcmF0b3IsIGNsYXNzIENvbXBhcmU+CisgICAgT3V0cHV0SXRlcmF0b3IKKyAgICBtZXJnZShJbnB1dEl0ZXJhdG9yMSBmaXJzdDEsIElucHV0SXRlcmF0b3IxIGxhc3QxLAorICAgICAgICAgIElucHV0SXRlcmF0b3IyIGZpcnN0MiwgSW5wdXRJdGVyYXRvcjIgbGFzdDIsIE91dHB1dEl0ZXJhdG9yIHJlc3VsdCwgQ29tcGFyZSBjb21wKTsKKwordGVtcGxhdGUgPGNsYXNzIEJpZGlyZWN0aW9uYWxJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgaW5wbGFjZV9tZXJnZShCaWRpcmVjdGlvbmFsSXRlcmF0b3IgZmlyc3QsIEJpZGlyZWN0aW9uYWxJdGVyYXRvciBtaWRkbGUsIEJpZGlyZWN0aW9uYWxJdGVyYXRvciBsYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIEJpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgQ29tcGFyZT4KKyAgICB2b2lkCisgICAgaW5wbGFjZV9tZXJnZShCaWRpcmVjdGlvbmFsSXRlcmF0b3IgZmlyc3QsIEJpZGlyZWN0aW9uYWxJdGVyYXRvciBtaWRkbGUsIEJpZGlyZWN0aW9uYWxJdGVyYXRvciBsYXN0LCBDb21wYXJlIGNvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcjEsIGNsYXNzIElucHV0SXRlcmF0b3IyPgorICAgIGNvbnN0ZXhwciBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgaW5jbHVkZXMoSW5wdXRJdGVyYXRvcjEgZmlyc3QxLCBJbnB1dEl0ZXJhdG9yMSBsYXN0MSwgSW5wdXRJdGVyYXRvcjIgZmlyc3QyLCBJbnB1dEl0ZXJhdG9yMiBsYXN0Mik7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yMSwgY2xhc3MgSW5wdXRJdGVyYXRvcjIsIGNsYXNzIENvbXBhcmU+CisgICAgY29uc3RleHByIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICBpbmNsdWRlcyhJbnB1dEl0ZXJhdG9yMSBmaXJzdDEsIElucHV0SXRlcmF0b3IxIGxhc3QxLCBJbnB1dEl0ZXJhdG9yMiBmaXJzdDIsIElucHV0SXRlcmF0b3IyIGxhc3QyLCBDb21wYXJlIGNvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcjEsIGNsYXNzIElucHV0SXRlcmF0b3IyLCBjbGFzcyBPdXRwdXRJdGVyYXRvcj4KKyAgICBPdXRwdXRJdGVyYXRvcgorICAgIHNldF91bmlvbihJbnB1dEl0ZXJhdG9yMSBmaXJzdDEsIElucHV0SXRlcmF0b3IxIGxhc3QxLAorICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yMiBmaXJzdDIsIElucHV0SXRlcmF0b3IyIGxhc3QyLCBPdXRwdXRJdGVyYXRvciByZXN1bHQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcjEsIGNsYXNzIElucHV0SXRlcmF0b3IyLCBjbGFzcyBPdXRwdXRJdGVyYXRvciwgY2xhc3MgQ29tcGFyZT4KKyAgICBPdXRwdXRJdGVyYXRvcgorICAgIHNldF91bmlvbihJbnB1dEl0ZXJhdG9yMSBmaXJzdDEsIElucHV0SXRlcmF0b3IxIGxhc3QxLAorICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yMiBmaXJzdDIsIElucHV0SXRlcmF0b3IyIGxhc3QyLCBPdXRwdXRJdGVyYXRvciByZXN1bHQsIENvbXBhcmUgY29tcCk7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yMSwgY2xhc3MgSW5wdXRJdGVyYXRvcjIsIGNsYXNzIE91dHB1dEl0ZXJhdG9yPgorICAgIGNvbnN0ZXhwciBPdXRwdXRJdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICBzZXRfaW50ZXJzZWN0aW9uKElucHV0SXRlcmF0b3IxIGZpcnN0MSwgSW5wdXRJdGVyYXRvcjEgbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yMiBmaXJzdDIsIElucHV0SXRlcmF0b3IyIGxhc3QyLCBPdXRwdXRJdGVyYXRvciByZXN1bHQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcjEsIGNsYXNzIElucHV0SXRlcmF0b3IyLCBjbGFzcyBPdXRwdXRJdGVyYXRvciwgY2xhc3MgQ29tcGFyZT4KKyAgICBjb25zdGV4cHIgT3V0cHV0SXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgc2V0X2ludGVyc2VjdGlvbihJbnB1dEl0ZXJhdG9yMSBmaXJzdDEsIElucHV0SXRlcmF0b3IxIGxhc3QxLAorICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvcjIgZmlyc3QyLCBJbnB1dEl0ZXJhdG9yMiBsYXN0MiwgT3V0cHV0SXRlcmF0b3IgcmVzdWx0LCBDb21wYXJlIGNvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcjEsIGNsYXNzIElucHV0SXRlcmF0b3IyLCBjbGFzcyBPdXRwdXRJdGVyYXRvcj4KKyAgICBPdXRwdXRJdGVyYXRvcgorICAgIHNldF9kaWZmZXJlbmNlKElucHV0SXRlcmF0b3IxIGZpcnN0MSwgSW5wdXRJdGVyYXRvcjEgbGFzdDEsCisgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvcjIgZmlyc3QyLCBJbnB1dEl0ZXJhdG9yMiBsYXN0MiwgT3V0cHV0SXRlcmF0b3IgcmVzdWx0KTsKKwordGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3IxLCBjbGFzcyBJbnB1dEl0ZXJhdG9yMiwgY2xhc3MgT3V0cHV0SXRlcmF0b3IsIGNsYXNzIENvbXBhcmU+CisgICAgT3V0cHV0SXRlcmF0b3IKKyAgICBzZXRfZGlmZmVyZW5jZShJbnB1dEl0ZXJhdG9yMSBmaXJzdDEsIElucHV0SXRlcmF0b3IxIGxhc3QxLAorICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IyIGZpcnN0MiwgSW5wdXRJdGVyYXRvcjIgbGFzdDIsIE91dHB1dEl0ZXJhdG9yIHJlc3VsdCwgQ29tcGFyZSBjb21wKTsKKwordGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3IxLCBjbGFzcyBJbnB1dEl0ZXJhdG9yMiwgY2xhc3MgT3V0cHV0SXRlcmF0b3I+CisgICAgT3V0cHV0SXRlcmF0b3IKKyAgICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoSW5wdXRJdGVyYXRvcjEgZmlyc3QxLCBJbnB1dEl0ZXJhdG9yMSBsYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvcjIgZmlyc3QyLCBJbnB1dEl0ZXJhdG9yMiBsYXN0MiwgT3V0cHV0SXRlcmF0b3IgcmVzdWx0KTsKKwordGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3IxLCBjbGFzcyBJbnB1dEl0ZXJhdG9yMiwgY2xhc3MgT3V0cHV0SXRlcmF0b3IsIGNsYXNzIENvbXBhcmU+CisgICAgT3V0cHV0SXRlcmF0b3IKKyAgICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoSW5wdXRJdGVyYXRvcjEgZmlyc3QxLCBJbnB1dEl0ZXJhdG9yMSBsYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvcjIgZmlyc3QyLCBJbnB1dEl0ZXJhdG9yMiBsYXN0MiwgT3V0cHV0SXRlcmF0b3IgcmVzdWx0LCBDb21wYXJlIGNvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgdm9pZAorICAgIHB1c2hfaGVhcChSYW5kb21BY2Nlc3NJdGVyYXRvciBmaXJzdCwgUmFuZG9tQWNjZXNzSXRlcmF0b3IgbGFzdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBSYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgQ29tcGFyZT4KKyAgICB2b2lkCisgICAgcHVzaF9oZWFwKFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIGZpcnN0LCBSYW5kb21BY2Nlc3NJdGVyYXRvciBsYXN0LCBDb21wYXJlIGNvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgdm9pZAorICAgIHBvcF9oZWFwKFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIGZpcnN0LCBSYW5kb21BY2Nlc3NJdGVyYXRvciBsYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBDb21wYXJlPgorICAgIHZvaWQKKyAgICBwb3BfaGVhcChSYW5kb21BY2Nlc3NJdGVyYXRvciBmaXJzdCwgUmFuZG9tQWNjZXNzSXRlcmF0b3IgbGFzdCwgQ29tcGFyZSBjb21wKTsKKwordGVtcGxhdGUgPGNsYXNzIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBtYWtlX2hlYXAoUmFuZG9tQWNjZXNzSXRlcmF0b3IgZmlyc3QsIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIGxhc3QpOworCit0ZW1wbGF0ZSA8Y2xhc3MgUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIENvbXBhcmU+CisgICAgdm9pZAorICAgIG1ha2VfaGVhcChSYW5kb21BY2Nlc3NJdGVyYXRvciBmaXJzdCwgUmFuZG9tQWNjZXNzSXRlcmF0b3IgbGFzdCwgQ29tcGFyZSBjb21wKTsKKwordGVtcGxhdGUgPGNsYXNzIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBzb3J0X2hlYXAoUmFuZG9tQWNjZXNzSXRlcmF0b3IgZmlyc3QsIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIGxhc3QpOworCit0ZW1wbGF0ZSA8Y2xhc3MgUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIENvbXBhcmU+CisgICAgdm9pZAorICAgIHNvcnRfaGVhcChSYW5kb21BY2Nlc3NJdGVyYXRvciBmaXJzdCwgUmFuZG9tQWNjZXNzSXRlcmF0b3IgbGFzdCwgQ29tcGFyZSBjb21wKTsKKwordGVtcGxhdGUgPGNsYXNzIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGNvbnN0ZXhwciBib29sICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgaXNfaGVhcChSYW5kb21BY2Nlc3NJdGVyYXRvciBmaXJzdCwgUmFuZG9tQWNjZXNzaXRlcmF0b3IgbGFzdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBSYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgQ29tcGFyZT4KKyAgICBjb25zdGV4cHIgYm9vbCAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIGlzX2hlYXAoUmFuZG9tQWNjZXNzSXRlcmF0b3IgZmlyc3QsIFJhbmRvbUFjY2Vzc2l0ZXJhdG9yIGxhc3QsIENvbXBhcmUgY29tcCk7CisKK3RlbXBsYXRlIDxjbGFzcyBSYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBjb25zdGV4cHIgUmFuZG9tQWNjZXNzSXRlcmF0b3IgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICBpc19oZWFwX3VudGlsKFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIGZpcnN0LCBSYW5kb21BY2Nlc3NpdGVyYXRvciBsYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBDb21wYXJlPgorICAgIGNvbnN0ZXhwciBSYW5kb21BY2Nlc3NJdGVyYXRvciAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIGlzX2hlYXBfdW50aWwoUmFuZG9tQWNjZXNzSXRlcmF0b3IgZmlyc3QsIFJhbmRvbUFjY2Vzc2l0ZXJhdG9yIGxhc3QsIENvbXBhcmUgY29tcCk7CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3I+CisgICAgRm9yd2FyZEl0ZXJhdG9yCisgICAgbWluX2VsZW1lbnQoRm9yd2FyZEl0ZXJhdG9yIGZpcnN0LCBGb3J3YXJkSXRlcmF0b3IgbGFzdCk7ICAvLyBjb25zdGV4cHIgaW4gQysrMTQKKwordGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvciwgY2xhc3MgQ29tcGFyZT4KKyAgICBGb3J3YXJkSXRlcmF0b3IKKyAgICBtaW5fZWxlbWVudChGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0LCBDb21wYXJlIGNvbXApOyAgLy8gY29uc3RleHByIGluIEMrKzE0CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorICAgIGNvbnN0IFQmCisgICAgbWluKGNvbnN0IFQmIGEsIGNvbnN0IFQmIGIpOyAgLy8gY29uc3RleHByIGluIEMrKzE0CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDb21wYXJlPgorICAgIGNvbnN0IFQmCisgICAgbWluKGNvbnN0IFQmIGEsIGNvbnN0IFQmIGIsIENvbXBhcmUgY29tcCk7ICAvLyBjb25zdGV4cHIgaW4gQysrMTQKKwordGVtcGxhdGU8Y2xhc3MgVD4KKyAgICBUCisgICAgbWluKGluaXRpYWxpemVyX2xpc3Q8VD4gdCk7ICAvLyBjb25zdGV4cHIgaW4gQysrMTQKKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgQ29tcGFyZT4KKyAgICBUCisgICAgbWluKGluaXRpYWxpemVyX2xpc3Q8VD4gdCwgQ29tcGFyZSBjb21wKTsgIC8vIGNvbnN0ZXhwciBpbiBDKysxNAorCit0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIGNvbnN0ZXhwciBjb25zdCBUJiBjbGFtcCggY29uc3QgVCYgdiwgY29uc3QgVCYgbG8sIGNvbnN0IFQmIGhpICk7ICAgICAgICAgICAgICAgLy8gQysrMTcKKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgQ29tcGFyZT4KKyAgICBjb25zdGV4cHIgY29uc3QgVCYgY2xhbXAoIGNvbnN0IFQmIHYsIGNvbnN0IFQmIGxvLCBjb25zdCBUJiBoaSwgQ29tcGFyZSBjb21wICk7IC8vIEMrKzE3CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3I+CisgICAgRm9yd2FyZEl0ZXJhdG9yCisgICAgbWF4X2VsZW1lbnQoRm9yd2FyZEl0ZXJhdG9yIGZpcnN0LCBGb3J3YXJkSXRlcmF0b3IgbGFzdCk7ICAvLyBjb25zdGV4cHIgaW4gQysrMTQKKwordGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvciwgY2xhc3MgQ29tcGFyZT4KKyAgICBGb3J3YXJkSXRlcmF0b3IKKyAgICBtYXhfZWxlbWVudChGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0LCBDb21wYXJlIGNvbXApOyAgLy8gY29uc3RleHByIGluIEMrKzE0CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorICAgIGNvbnN0IFQmCisgICAgbWF4KGNvbnN0IFQmIGEsIGNvbnN0IFQmIGIpOyAvLyBjb25zdGV4cHIgaW4gQysrMTQKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENvbXBhcmU+CisgICAgY29uc3QgVCYKKyAgICBtYXgoY29uc3QgVCYgYSwgY29uc3QgVCYgYiwgQ29tcGFyZSBjb21wKTsgIC8vIGNvbnN0ZXhwciBpbiBDKysxNAorCit0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIFQKKyAgICBtYXgoaW5pdGlhbGl6ZXJfbGlzdDxUPiB0KTsgIC8vIGNvbnN0ZXhwciBpbiBDKysxNAorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBDb21wYXJlPgorICAgIFQKKyAgICBtYXgoaW5pdGlhbGl6ZXJfbGlzdDxUPiB0LCBDb21wYXJlIGNvbXApOyAgLy8gY29uc3RleHByIGluIEMrKzE0CisKK3RlbXBsYXRlPGNsYXNzIEZvcndhcmRJdGVyYXRvcj4KKyAgICBwYWlyPEZvcndhcmRJdGVyYXRvciwgRm9yd2FyZEl0ZXJhdG9yPgorICAgIG1pbm1heF9lbGVtZW50KEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QpOyAgIC8vIGNvbnN0ZXhwciBpbiBDKysxNAorCit0ZW1wbGF0ZTxjbGFzcyBGb3J3YXJkSXRlcmF0b3IsIGNsYXNzIENvbXBhcmU+CisgICAgcGFpcjxGb3J3YXJkSXRlcmF0b3IsIEZvcndhcmRJdGVyYXRvcj4KKyAgICBtaW5tYXhfZWxlbWVudChGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0LCBDb21wYXJlIGNvbXApOyAgIC8vIGNvbnN0ZXhwciBpbiBDKysxNAorCit0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIHBhaXI8Y29uc3QgVCYsIGNvbnN0IFQmPgorICAgIG1pbm1heChjb25zdCBUJiBhLCBjb25zdCBUJiBiKTsgIC8vIGNvbnN0ZXhwciBpbiBDKysxNAorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBDb21wYXJlPgorICAgIHBhaXI8Y29uc3QgVCYsIGNvbnN0IFQmPgorICAgIG1pbm1heChjb25zdCBUJiBhLCBjb25zdCBUJiBiLCBDb21wYXJlIGNvbXApOyAgLy8gY29uc3RleHByIGluIEMrKzE0CisKK3RlbXBsYXRlPGNsYXNzIFQ+CisgICAgcGFpcjxULCBUPgorICAgIG1pbm1heChpbml0aWFsaXplcl9saXN0PFQ+IHQpOyAgLy8gY29uc3RleHByIGluIEMrKzE0CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIENvbXBhcmU+CisgICAgcGFpcjxULCBUPgorICAgIG1pbm1heChpbml0aWFsaXplcl9saXN0PFQ+IHQsIENvbXBhcmUgY29tcCk7ICAvLyBjb25zdGV4cHIgaW4gQysrMTQKKwordGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3IxLCBjbGFzcyBJbnB1dEl0ZXJhdG9yMj4KKyAgICBjb25zdGV4cHIgYm9vbCAgICAgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoSW5wdXRJdGVyYXRvcjEgZmlyc3QxLCBJbnB1dEl0ZXJhdG9yMSBsYXN0MSwgSW5wdXRJdGVyYXRvcjIgZmlyc3QyLCBJbnB1dEl0ZXJhdG9yMiBsYXN0Mik7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yMSwgY2xhc3MgSW5wdXRJdGVyYXRvcjIsIGNsYXNzIENvbXBhcmU+CisgICAgY29uc3RleHByIGJvb2wgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKElucHV0SXRlcmF0b3IxIGZpcnN0MSwgSW5wdXRJdGVyYXRvcjEgbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvcjIgZmlyc3QyLCBJbnB1dEl0ZXJhdG9yMiBsYXN0MiwgQ29tcGFyZSBjb21wKTsKKwordGVtcGxhdGUgPGNsYXNzIEJpZGlyZWN0aW9uYWxJdGVyYXRvcj4KKyAgICBib29sCisgICAgbmV4dF9wZXJtdXRhdGlvbihCaWRpcmVjdGlvbmFsSXRlcmF0b3IgZmlyc3QsIEJpZGlyZWN0aW9uYWxJdGVyYXRvciBsYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIEJpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgQ29tcGFyZT4KKyAgICBib29sCisgICAgbmV4dF9wZXJtdXRhdGlvbihCaWRpcmVjdGlvbmFsSXRlcmF0b3IgZmlyc3QsIEJpZGlyZWN0aW9uYWxJdGVyYXRvciBsYXN0LCBDb21wYXJlIGNvbXApOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgorICAgIGJvb2wKKyAgICBwcmV2X3Blcm11dGF0aW9uKEJpZGlyZWN0aW9uYWxJdGVyYXRvciBmaXJzdCwgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGxhc3QpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBDb21wYXJlPgorICAgIGJvb2wKKyAgICBwcmV2X3Blcm11dGF0aW9uKEJpZGlyZWN0aW9uYWxJdGVyYXRvciBmaXJzdCwgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGxhc3QsIENvbXBhcmUgY29tcCk7CisKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+IC8vIG5lZWRlZCB0byBwcm92aWRlIHN3YXBfcmFuZ2VzLgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGNzdGRkZWY+CisKKyNpZiBkZWZpbmVkKF9fSUJNQ1BQX18pCisjaW5jbHVkZSAic3VwcG9ydC9pYm0vc3VwcG9ydC5oIgorI2VuZGlmCisjaWYgZGVmaW5lZChfTElCQ1BQX0NPTVBJTEVSX01TVkMpCisjaW5jbHVkZSA8aW50cmluLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPF9fZGVidWc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX1BVU0hfTUFDUk9TCisjaW5jbHVkZSA8X191bmRlZl9tYWNyb3M+CisKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKKy8vIEknZCBsaWtlIHRvIHJlcGxhY2UgdGhlc2Ugd2l0aCBfVlNURDo6ZXF1YWxfdG88dm9pZD4sIGJ1dCBjYW4ndCBiZWNhdXNlOgorLy8gICAqIFRoYXQgb25seSB3b3JrcyB3aXRoIEMrKzE0IGFuZCBsYXRlciwgYW5kCisvLyAgICogV2UgaGF2ZW4ndCBpbmNsdWRlZCA8ZnVuY3Rpb25hbD4gaGVyZS4KK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMiA9IF9UMT4KK3N0cnVjdCBfX2VxdWFsX3RvCit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBib29sIG9wZXJhdG9yKCkoY29uc3QgX1QxJiBfX3gsIGNvbnN0IF9UMSYgX195KSBjb25zdCB7cmV0dXJuIF9feCA9PSBfX3k7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UMSYgX194LCBjb25zdCBfVDImIF9feSkgY29uc3Qge3JldHVybiBfX3ggPT0gX195O30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVDImIF9feCwgY29uc3QgX1QxJiBfX3kpIGNvbnN0IHtyZXR1cm4gX194ID09IF9feTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBib29sIG9wZXJhdG9yKCkoY29uc3QgX1QyJiBfX3gsIGNvbnN0IF9UMiYgX195KSBjb25zdCB7cmV0dXJuIF9feCA9PSBfX3k7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UMT4KK3N0cnVjdCBfX2VxdWFsX3RvPF9UMSwgX1QxPgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1QxJiBfX3gsIGNvbnN0IF9UMSYgX195KSBjb25zdCB7cmV0dXJuIF9feCA9PSBfX3k7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UMT4KK3N0cnVjdCBfX2VxdWFsX3RvPGNvbnN0IF9UMSwgX1QxPgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1QxJiBfX3gsIGNvbnN0IF9UMSYgX195KSBjb25zdCB7cmV0dXJuIF9feCA9PSBfX3k7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UMT4KK3N0cnVjdCBfX2VxdWFsX3RvPF9UMSwgY29uc3QgX1QxPgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1QxJiBfX3gsIGNvbnN0IF9UMSYgX195KSBjb25zdCB7cmV0dXJuIF9feCA9PSBfX3k7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyID0gX1QxPgorc3RydWN0IF9fbGVzcworeworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1QxJiBfX3gsIGNvbnN0IF9UMSYgX195KSBjb25zdCB7cmV0dXJuIF9feCA8IF9feTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UMSYgX194LCBjb25zdCBfVDImIF9feSkgY29uc3Qge3JldHVybiBfX3ggPCBfX3k7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVDImIF9feCwgY29uc3QgX1QxJiBfX3kpIGNvbnN0IHtyZXR1cm4gX194IDwgX195O30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1QyJiBfX3gsIGNvbnN0IF9UMiYgX195KSBjb25zdCB7cmV0dXJuIF9feCA8IF9feTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxPgorc3RydWN0IF9fbGVzczxfVDEsIF9UMT4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UMSYgX194LCBjb25zdCBfVDEmIF9feSkgY29uc3Qge3JldHVybiBfX3ggPCBfX3k7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UMT4KK3N0cnVjdCBfX2xlc3M8Y29uc3QgX1QxLCBfVDE+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVDEmIF9feCwgY29uc3QgX1QxJiBfX3kpIGNvbnN0IHtyZXR1cm4gX194IDwgX195O30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVDE+CitzdHJ1Y3QgX19sZXNzPF9UMSwgY29uc3QgX1QxPgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1QxJiBfX3gsIGNvbnN0IF9UMSYgX195KSBjb25zdCB7cmV0dXJuIF9feCA8IF9feTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4KK2NsYXNzIF9faW52ZXJ0IC8vIGludmVydCB0aGUgc2Vuc2Ugb2YgYSBjb21wYXJpc29uCit7Citwcml2YXRlOgorICAgIF9QcmVkaWNhdGUgX19wXzsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9faW52ZXJ0KCkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2ludmVydChfUHJlZGljYXRlIF9fcCkgOiBfX3BfKF9fcCkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDE+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVDEmIF9feCkge3JldHVybiAhX19wXyhfX3gpO30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UMSYgX194LCBjb25zdCBfVDImIF9feSkge3JldHVybiBfX3BfKF9feSwgX194KTt9Cit9OworCisjaWZkZWYgX0xJQkNQUF9ERUJVRworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmU+CitzdHJ1Y3QgX19kZWJ1Z19sZXNzCit7CisgICAgX0NvbXBhcmUgX19jb21wXzsKKyAgICBfX2RlYnVnX2xlc3MoX0NvbXBhcmUmIF9fYykgOiBfX2NvbXBfKF9fYykge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9VcCYgX195KQorICAgIHsKKyAgICAgICAgYm9vbCBfX3IgPSBfX2NvbXBfKF9feCwgX195KTsKKyAgICAgICAgaWYgKF9fcikKKyAgICAgICAgICAgIF9fZG9fY29tcGFyZV9hc3NlcnQoMCwgX195LCBfX3gpOworICAgICAgICByZXR1cm4gX19yOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfTEhTLCBjbGFzcyBfUkhTPgorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZGVjbHR5cGUoKHZvaWQpX1ZTVEQ6OmRlY2x2YWw8X0NvbXBhcmUmPigpKAorICAgICAgICBfVlNURDo6ZGVjbHZhbDxfTEhTIGNvbnN0Jj4oKSwgX1ZTVEQ6OmRlY2x2YWw8X1JIUyBjb25zdCY+KCkpKQorICAgIF9fZG9fY29tcGFyZV9hc3NlcnQoaW50LCBfTEhTIGNvbnN0JiBfX2wsIF9SSFMgY29uc3QmIF9fcikgeworICAgICAgICBfTElCQ1BQX0FTU0VSVCghX19jb21wXyhfX2wsIF9fciksCisgICAgICAgICAgICAiQ29tcGFyYXRvciBkb2VzIG5vdCBpbmR1Y2UgYSBzdHJpY3Qgd2VhayBvcmRlcmluZyIpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfTEhTLCBjbGFzcyBfUkhTPgorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX2RvX2NvbXBhcmVfYXNzZXJ0KGxvbmcsIF9MSFMgY29uc3QmLCBfUkhTIGNvbnN0Jikge30KK307CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9ERUJVRworCisvLyBQcmVjb25kaXRpb246ICBfX3ggIT0gMAoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3Vuc2lnbmVkIF9fY3R6KHVuc2lnbmVkIF9feCkgeworI2lmbmRlZiBfTElCQ1BQX0NPTVBJTEVSX01TVkMKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KF9fYnVpbHRpbl9jdHooX194KSk7CisjZWxzZQorICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1bnNpZ25lZCkgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAiIik7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpID09IDQsICIiKTsKKyAgdW5zaWduZWQgbG9uZyB3aGVyZTsKKyAgLy8gU2VhcmNoIGZyb20gTFNCIHRvIE1TQiBmb3IgZmlyc3Qgc2V0IGJpdC4KKyAgLy8gUmV0dXJucyB6ZXJvIGlmIG5vIHNldCBiaXQgaXMgZm91bmQuCisgIGlmIChfQml0U2NhbkZvcndhcmQoJndoZXJlLCBfX3gpKQorICAgIHJldHVybiB3aGVyZTsKKyAgcmV0dXJuIDMyOworI2VuZGlmCit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit1bnNpZ25lZCBsb25nIF9fY3R6KHVuc2lnbmVkIGxvbmcgX194KSB7CisjaWZuZGVmIF9MSUJDUFBfQ09NUElMRVJfTVNWQworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihfX2J1aWx0aW5fY3R6bChfX3gpKTsKKyNlbHNlCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YodW5zaWduZWQgbG9uZykgPT0gc2l6ZW9mKHVuc2lnbmVkKSwgIiIpOworICAgIHJldHVybiBfX2N0eihzdGF0aWNfY2FzdDx1bnNpZ25lZD4oX194KSk7CisjZW5kaWYKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3Vuc2lnbmVkIGxvbmcgbG9uZyBfX2N0eih1bnNpZ25lZCBsb25nIGxvbmcgX194KSB7CisjaWZuZGVmIF9MSUJDUFBfQ09NUElMRVJfTVNWQworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KF9fYnVpbHRpbl9jdHpsbChfX3gpKTsKKyNlbHNlCisgICAgdW5zaWduZWQgbG9uZyB3aGVyZTsKKy8vIFNlYXJjaCBmcm9tIExTQiB0byBNU0IgZm9yIGZpcnN0IHNldCBiaXQuCisvLyBSZXR1cm5zIHplcm8gaWYgbm8gc2V0IGJpdCBpcyBmb3VuZC4KKyNpZiBkZWZpbmVkKF9MSUJDUFBfSEFTX0JJVFNDQU42NCkKKyAgICAoZGVmaW5lZChfTV9BTUQ2NCkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkKKyAgaWYgKF9CaXRTY2FuRm9yd2FyZDY0KCZ3aGVyZSwgX194KSkKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih3aGVyZSk7CisjZWxzZQorICAvLyBXaW4zMiBkb2Vzbid0IGhhdmUgX0JpdFNjYW5Gb3J3YXJkNjQgc28gZW11bGF0ZSBpdCB3aXRoIHR3byAzMiBiaXQgY2FsbHMuCisgIC8vIFNjYW4gdGhlIExvdyBXb3JkLgorICBpZiAoX0JpdFNjYW5Gb3J3YXJkKCZ3aGVyZSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oX194KSkpCisgICAgcmV0dXJuIHdoZXJlOworICAvLyBTY2FuIHRoZSBIaWdoIFdvcmQuCisgIGlmIChfQml0U2NhbkZvcndhcmQoJndoZXJlLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihfX3ggPj4gMzIpKSkKKyAgICByZXR1cm4gd2hlcmUgKyAzMjsgLy8gQ3JlYXRlIGEgYml0IG9mZnNldCBmcm9tIHRoZSBMU0IuCisjZW5kaWYKKyAgcmV0dXJuIDY0OworI2VuZGlmIC8vIF9MSUJDUFBfQ09NUElMRVJfTVNWQworfQorCisvLyBQcmVjb25kaXRpb246ICBfX3ggIT0gMAoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3Vuc2lnbmVkIF9fY2x6KHVuc2lnbmVkIF9feCkgeworI2lmbmRlZiBfTElCQ1BQX0NPTVBJTEVSX01TVkMKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KF9fYnVpbHRpbl9jbHooX194KSk7CisjZWxzZQorICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1bnNpZ25lZCkgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAiIik7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpID09IDQsICIiKTsKKyAgdW5zaWduZWQgbG9uZyB3aGVyZTsKKyAgLy8gU2VhcmNoIGZyb20gTFNCIHRvIE1TQiBmb3IgZmlyc3Qgc2V0IGJpdC4KKyAgLy8gUmV0dXJucyB6ZXJvIGlmIG5vIHNldCBiaXQgaXMgZm91bmQuCisgIGlmIChfQml0U2NhblJldmVyc2UoJndoZXJlLCBfX3gpKQorICAgIHJldHVybiAzMSAtIHdoZXJlOworICByZXR1cm4gMzI7IC8vIFVuZGVmaW5lZCBCZWhhdmlvci4KKyNlbmRpZgorfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordW5zaWduZWQgbG9uZyBfX2Nseih1bnNpZ25lZCBsb25nIF9feCkgeworI2lmbmRlZiBfTElCQ1BQX0NPTVBJTEVSX01TVkMKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oX19idWlsdGluX2NsemwgKF9feCkpOworI2Vsc2UKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1bnNpZ25lZCkgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAiIik7CisgICAgcmV0dXJuIF9fY2x6KHN0YXRpY19jYXN0PHVuc2lnbmVkPihfX3gpKTsKKyNlbmRpZgorfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordW5zaWduZWQgbG9uZyBsb25nIF9fY2x6KHVuc2lnbmVkIGxvbmcgbG9uZyBfX3gpIHsKKyNpZm5kZWYgX0xJQkNQUF9DT01QSUxFUl9NU1ZDCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oX19idWlsdGluX2NsemxsKF9feCkpOworI2Vsc2UKKyAgdW5zaWduZWQgbG9uZyB3aGVyZTsKKy8vIEJpdFNjYW5SZXZlcnNlIHNjYW5zIGZyb20gTVNCIHRvIExTQiBmb3IgZmlyc3Qgc2V0IGJpdC4KKy8vIFJldHVybnMgMCBpZiBubyBzZXQgYml0IGlzIGZvdW5kLgorI2lmIGRlZmluZWQoX0xJQkNQUF9IQVNfQklUU0NBTjY0KQorICBpZiAoX0JpdFNjYW5SZXZlcnNlNjQoJndoZXJlLCBfX3gpKQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KDYzIC0gd2hlcmUpOworI2Vsc2UKKyAgLy8gU2NhbiB0aGUgaGlnaCAzMiBiaXRzLgorICBpZiAoX0JpdFNjYW5SZXZlcnNlKCZ3aGVyZSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oX194ID4+IDMyKSkpCisgICAgcmV0dXJuIDYzIC0gKHdoZXJlICsgMzIpOyAvLyBDcmVhdGUgYSBiaXQgb2Zmc2V0IGZyb20gdGhlIE1TQi4KKyAgLy8gU2NhbiB0aGUgbG93IDMyIGJpdHMuCisgIGlmIChfQml0U2NhblJldmVyc2UoJndoZXJlLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihfX3gpKSkKKyAgICByZXR1cm4gNjMgLSB3aGVyZTsKKyNlbmRpZgorICByZXR1cm4gNjQ7IC8vIFVuZGVmaW5lZCBCZWhhdmlvci4KKyNlbmRpZiAvLyBfTElCQ1BQX0NPTVBJTEVSX01TVkMKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW50IF9fcG9wX2NvdW50KHVuc2lnbmVkIF9feCkgeworI2lmbmRlZiBfTElCQ1BQX0NPTVBJTEVSX01TVkMKKyAgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudCAgKF9feCk7CisjZWxzZQorICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1bnNpZ25lZCkgPT0gNCwgIiIpOworICByZXR1cm4gX19wb3BjbnQoX194KTsKKyNlbmRpZgorfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbnQgX19wb3BfY291bnQodW5zaWduZWQgbG9uZyBfX3gpIHsKKyNpZm5kZWYgX0xJQkNQUF9DT01QSUxFUl9NU1ZDCisgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnRsIChfX3gpOworI2Vsc2UKKyAgc3RhdGljX2Fzc2VydChzaXplb2YodW5zaWduZWQgbG9uZykgPT0gNCwgIiIpOworICByZXR1cm4gX19wb3BjbnQoX194KTsKKyNlbmRpZgorfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbnQgX19wb3BfY291bnQodW5zaWduZWQgbG9uZyBsb25nIF9feCkgeworI2lmbmRlZiBfTElCQ1BQX0NPTVBJTEVSX01TVkMKKyAgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudGxsKF9feCk7CisjZWxzZQorICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpID09IDgsICIiKTsKKyAgcmV0dXJuIF9fcG9wY250NjQoX194KTsKKyNlbmRpZgorfQorCisvLyBhbGxfb2YKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfUHJlZGljYXRlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK2Jvb2wKK2FsbF9vZihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIF9QcmVkaWNhdGUgX19wcmVkKQoreworICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICBpZiAoIV9fcHJlZCgqX19maXJzdCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIGFueV9vZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9QcmVkaWNhdGU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworYm9vbAorYW55X29mKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQpCit7CisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBub25lX29mCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX1ByZWRpY2F0ZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3Citib29sCitub25lX29mKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQpCit7CisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBmb3JfZWFjaAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9GdW5jdGlvbj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3CitfRnVuY3Rpb24KK2Zvcl9lYWNoKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX0Z1bmN0aW9uIF9fZikKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgX19mKCpfX2ZpcnN0KTsKKyAgICByZXR1cm4gX19mOworfQorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKy8vIGZvcl9lYWNoX24KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX0Z1bmN0aW9uPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK19JbnB1dEl0ZXJhdG9yCitmb3JfZWFjaF9uKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fb3JpZ19uLCBfRnVuY3Rpb24gX19mKQoreworICAgIHR5cGVkZWYgZGVjbHR5cGUoX19jb252ZXJ0X3RvX2ludGVncmFsKF9fb3JpZ19uKSkgX0ludGVncmFsU2l6ZTsKKyAgICBfSW50ZWdyYWxTaXplIF9fbiA9IF9fb3JpZ19uOworICAgIHdoaWxlIChfX24gPiAwKQorICAgIHsKKyAgICAgICAgIF9fZigqX19maXJzdCk7CisgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAtLV9fbjsKKyAgICB9CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisjZW5kaWYKKworLy8gZmluZAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3CitfSW5wdXRJdGVyYXRvcgorZmluZChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWx1ZV8pCit7CisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgIGlmICgqX19maXJzdCA9PSBfX3ZhbHVlXykKKyAgICAgICAgICAgIGJyZWFrOworICAgIHJldHVybiBfX2ZpcnN0OworfQorCisvLyBmaW5kX2lmCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX1ByZWRpY2F0ZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3CitfSW5wdXRJdGVyYXRvcgorZmluZF9pZihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIF9QcmVkaWNhdGUgX19wcmVkKQoreworICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIHJldHVybiBfX2ZpcnN0OworfQorCisvLyBmaW5kX2lmX25vdAorCit0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX1ByZWRpY2F0ZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3CitfSW5wdXRJdGVyYXRvcgorZmluZF9pZl9ub3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCkKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgaWYgKCFfX3ByZWQoKl9fZmlyc3QpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKKy8vIGZpbmRfZW5kCisKK3RlbXBsYXRlIDxjbGFzcyBfQmluYXJ5UHJlZGljYXRlLCBjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yMSwgY2xhc3MgX0ZvcndhcmRJdGVyYXRvcjI+CitfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNyBfRm9yd2FyZEl0ZXJhdG9yMQorX19maW5kX2VuZChfRm9yd2FyZEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcmF0b3IyIF9fbGFzdDIsIF9CaW5hcnlQcmVkaWNhdGUgX19wcmVkLAorICAgICAgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZywgZm9yd2FyZF9pdGVyYXRvcl90YWcpCit7CisgICAgLy8gbW9kZWxlZCBhZnRlciBzZWFyY2ggYWxnb3JpdGhtCisgICAgX0ZvcndhcmRJdGVyYXRvcjEgX19yID0gX19sYXN0MTsgIC8vIF9fbGFzdDEgaXMgdGhlICJkZWZhdWx0IiBhbnN3ZXIKKyAgICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKyAgICAgICAgcmV0dXJuIF9fcjsKKyAgICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkgICAgICAgICAvLyBpZiBzb3VyY2UgZXhoYXVzdGVkIHJldHVybiBsYXN0IGNvcnJlY3QgYW5zd2VyCisgICAgICAgICAgICAgICAgcmV0dXJuIF9fcjsgICAgICAgICAgICAgICAgICAvLyAgICAob3IgX19sYXN0MSBpZiBuZXZlciBmb3VuZCkKKyAgICAgICAgICAgIGlmIChfX3ByZWQoKl9fZmlyc3QxLCAqX19maXJzdDIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgKytfX2ZpcnN0MTsKKyAgICAgICAgfQorICAgICAgICAvLyAqX19maXJzdDEgbWF0Y2hlcyAqX19maXJzdDIsIG5vdyBtYXRjaCBlbGVtZW50cyBhZnRlciBoZXJlCisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbTEgPSBfX2ZpcnN0MTsKKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvcjIgX19tMiA9IF9fZmlyc3QyOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCsrX19tMiA9PSBfX2xhc3QyKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXR0ZXJuIGV4aGF1c2VkLCByZWNvcmQgYW5zd2VyIGFuZCBzZWFyY2ggZm9yIGFub3RoZXIgb25lCisgICAgICAgICAgICAgICAgX19yID0gX19maXJzdDE7CisgICAgICAgICAgICAgICAgKytfX2ZpcnN0MTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgrK19fbTEgPT0gX19sYXN0MSkgICAgIC8vIFNvdXJjZSBleGhhdXN0ZWQsIHJldHVybiBsYXN0IGFuc3dlcgorICAgICAgICAgICAgICAgIHJldHVybiBfX3I7CisgICAgICAgICAgICBpZiAoIV9fcHJlZCgqX19tMSwgKl9fbTIpKSAgLy8gbWlzbWF0Y2gsIHJlc3RhcnQgd2l0aCBhIG5ldyBfX2ZpcnN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytfX2ZpcnN0MTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gIC8vIGVsc2UgdGhlcmUgaXMgYSBtYXRjaCwgY2hlY2sgbmV4dCBlbGVtZW50cworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0ZSwgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyPgorX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEKK19fZmluZF9lbmQoX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEgX19maXJzdDEsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyIF9fZmlyc3QyLCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiBfX2xhc3QyLCBfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcsIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKQoreworICAgIC8vIG1vZGVsZWQgYWZ0ZXIgc2VhcmNoIGFsZ29yaXRobSAoaW4gcmV2ZXJzZSkKKyAgICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKyAgICAgICAgcmV0dXJuIF9fbGFzdDE7ICAvLyBFdmVyeXRoaW5nIG1hdGNoZXMgYW4gZW1wdHkgc2VxdWVuY2UKKyAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSBfX2wxID0gX19sYXN0MTsKKyAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiBfX2wyID0gX19sYXN0MjsKKyAgICAtLV9fbDI7CisgICAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgICAvLyBGaW5kIGxhc3QgZWxlbWVudCBpbiBzZXF1ZW5jZSAxIHRoYXQgbWF0Y2hzICooX19sYXN0Mi0xKSwgd2l0aCBhIG1pbmludW0gb2YgbG9vcCBjaGVja3MKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX2ZpcnN0MSA9PSBfX2wxKSAgLy8gcmV0dXJuIF9fbGFzdDEgaWYgbm8gZWxlbWVudCBtYXRjaGVzICpfX2ZpcnN0MgorICAgICAgICAgICAgICAgIHJldHVybiBfX2xhc3QxOworICAgICAgICAgICAgaWYgKF9fcHJlZCgqLS1fX2wxLCAqX19sMikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gKl9fbDEgbWF0Y2hlcyAqX19sMiwgbm93IG1hdGNoIGVsZW1lbnRzIGJlZm9yZSBoZXJlCisgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxIF9fbTEgPSBfX2wxOworICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiBfX20yID0gX19sMjsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX20yID09IF9fZmlyc3QyKSAgLy8gSWYgcGF0dGVybiBleGhhdXN0ZWQsIF9fbTEgaXMgdGhlIGFuc3dlciAod29ya3MgZm9yIDEgZWxlbWVudCBwYXR0ZXJuKQorICAgICAgICAgICAgICAgIHJldHVybiBfX20xOworICAgICAgICAgICAgaWYgKF9fbTEgPT0gX19maXJzdDEpICAvLyBPdGhlcndpc2UgaWYgc291cmNlIGV4aGF1c2VkLCBwYXR0ZXJuIG5vdCBmb3VuZAorICAgICAgICAgICAgICAgIHJldHVybiBfX2xhc3QxOworICAgICAgICAgICAgaWYgKCFfX3ByZWQoKi0tX19tMSwgKi0tX19tMikpICAvLyBpZiB0aGVyZSBpcyBhIG1pc21hdGNoLCByZXN0YXJ0IHdpdGggYSBuZXcgX19sMQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAgLy8gZWxzZSB0aGVyZSBpcyBhIG1hdGNoLCBjaGVjayBuZXh0IGVsZW1lbnRzCisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmluYXJ5UHJlZGljYXRlLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IxLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyPgorX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMQorX19maW5kX2VuZChfUmFuZG9tQWNjZXNzSXRlcmF0b3IxIF9fZmlyc3QxLCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIgX19maXJzdDIsIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIgX19sYXN0MiwgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQsCisgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKK3sKKyAgICAvLyBUYWtlIGFkdmFudGFnZSBvZiBrbm93aW5nIHNvdXJjZSBhbmQgcGF0dGVybiBsZW5ndGhzLiAgU3RvcCBzaG9ydCB3aGVuIHNvdXJjZSBpcyBzbWFsbGVyIHRoYW4gcGF0dGVybgorICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3IyPjo6ZGlmZmVyZW5jZV90eXBlIF9fbGVuMiA9IF9fbGFzdDIgLSBfX2ZpcnN0MjsKKyAgICBpZiAoX19sZW4yID09IDApCisgICAgICAgIHJldHVybiBfX2xhc3QxOworICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3IxPjo6ZGlmZmVyZW5jZV90eXBlIF9fbGVuMSA9IF9fbGFzdDEgLSBfX2ZpcnN0MTsKKyAgICBpZiAoX19sZW4xIDwgX19sZW4yKQorICAgICAgICByZXR1cm4gX19sYXN0MTsKKyAgICBjb25zdCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IxIF9fcyA9IF9fZmlyc3QxICsgKF9fbGVuMiAtIDEpOyAgLy8gRW5kIG9mIHBhdHRlcm4gbWF0Y2ggY2FuJ3QgZ28gYmVmb3JlIGhlcmUKKyAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IxIF9fbDEgPSBfX2xhc3QxOworICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIgX19sMiA9IF9fbGFzdDI7CisgICAgLS1fX2wyOworICAgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX3MgPT0gX19sMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gX19sYXN0MTsKKyAgICAgICAgICAgIGlmIChfX3ByZWQoKi0tX19sMSwgKl9fbDIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEgX19tMSA9IF9fbDE7CisgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIgX19tMiA9IF9fbDI7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX19tMiA9PSBfX2ZpcnN0MikKKyAgICAgICAgICAgICAgICByZXR1cm4gX19tMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gY2hlY2sgcmFuZ2Ugb24gX19tMSBiZWNhdXNlIF9fcyBndWFyYW50ZWVzIHdlIGhhdmUgZW5vdWdoIHNvdXJjZQorICAgICAgICAgICAgaWYgKCFfX3ByZWQoKi0tX19tMSwgKi0tX19tMikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yMSwgY2xhc3MgX0ZvcndhcmRJdGVyYXRvcjIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworX0ZvcndhcmRJdGVyYXRvcjEKK2ZpbmRfZW5kKF9Gb3J3YXJkSXRlcmF0b3IxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXJhdG9yMSBfX2xhc3QxLAorICAgICAgICAgX0ZvcndhcmRJdGVyYXRvcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcmF0b3IyIF9fbGFzdDIsIF9CaW5hcnlQcmVkaWNhdGUgX19wcmVkKQoreworICAgIHJldHVybiBfVlNURDo6X19maW5kX2VuZDx0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfQmluYXJ5UHJlZGljYXRlPjo6dHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMT46Oml0ZXJhdG9yX2NhdGVnb3J5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMj46Oml0ZXJhdG9yX2NhdGVnb3J5KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK19Gb3J3YXJkSXRlcmF0b3IxCitmaW5kX2VuZChfRm9yd2FyZEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXJhdG9yMiBfX2xhc3QyKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3IxPjo6dmFsdWVfdHlwZSBfX3YxOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3IyPjo6dmFsdWVfdHlwZSBfX3YyOworICAgIHJldHVybiBfVlNURDo6ZmluZF9lbmQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX2VxdWFsX3RvPF9fdjEsIF9fdjI+KCkpOworfQorCisvLyBmaW5kX2ZpcnN0X29mCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yMSwgY2xhc3MgX0ZvcndhcmRJdGVyYXRvcjIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CitfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfRm9yd2FyZEl0ZXJhdG9yMQorX19maW5kX2ZpcnN0X29mX2NlKF9Gb3J3YXJkSXRlcmF0b3IxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXJhdG9yMSBfX2xhc3QxLAorICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyYXRvcjIgX19sYXN0MiwgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQpCit7CisgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEpCisgICAgICAgIGZvciAoX0ZvcndhcmRJdGVyYXRvcjIgX19qID0gX19maXJzdDI7IF9faiAhPSBfX2xhc3QyOyArK19faikKKyAgICAgICAgICAgIGlmIChfX3ByZWQoKl9fZmlyc3QxLCAqX19qKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gX19maXJzdDE7CisgICAgcmV0dXJuIF9fbGFzdDE7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IxLCBjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yMiwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworX0ZvcndhcmRJdGVyYXRvcjEKK2ZpbmRfZmlyc3Rfb2YoX0ZvcndhcmRJdGVyYXRvcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXJhdG9yMiBfX2xhc3QyLCBfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6Ol9fZmluZF9maXJzdF9vZl9jZShfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fcHJlZCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yMSwgY2xhc3MgX0ZvcndhcmRJdGVyYXRvcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK19Gb3J3YXJkSXRlcmF0b3IxCitmaW5kX2ZpcnN0X29mKF9Gb3J3YXJkSXRlcmF0b3IxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXJhdG9yMSBfX2xhc3QxLAorICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyYXRvcjIgX19sYXN0MikKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUgX192MTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUgX192MjsKKyAgICByZXR1cm4gX1ZTVEQ6Ol9fZmluZF9maXJzdF9vZl9jZShfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fZXF1YWxfdG88X192MSwgX192Mj4oKSk7Cit9CisKKy8vIGFkamFjZW50X2ZpbmQKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworX0ZvcndhcmRJdGVyYXRvcgorYWRqYWNlbnRfZmluZChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCkKK3sKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisgICAgeworICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9faSA9IF9fZmlyc3Q7CisgICAgICAgIHdoaWxlICgrK19faSAhPSBfX2xhc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX3ByZWQoKl9fZmlyc3QsICpfX2kpKQorICAgICAgICAgICAgICAgIHJldHVybiBfX2ZpcnN0OworICAgICAgICAgICAgX19maXJzdCA9IF9faTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19sYXN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3CitfRm9yd2FyZEl0ZXJhdG9yCithZGphY2VudF9maW5kKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUgX192OworICAgIHJldHVybiBfVlNURDo6YWRqYWNlbnRfZmluZChfX2ZpcnN0LCBfX2xhc3QsIF9fZXF1YWxfdG88X192PigpKTsKK30KKworLy8gY291bnQKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNwordHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCitjb3VudChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWx1ZV8pCit7CisgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9fcigwKTsKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsdWVfKQorICAgICAgICAgICAgKytfX3I7CisgICAgcmV0dXJuIF9fcjsKK30KKworLy8gY291bnRfaWYKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfUHJlZGljYXRlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK3R5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorY291bnRfaWYoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCkKK3sKKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgX19yKDApOworICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKyAgICAgICAgICAgICsrX19yOworICAgIHJldHVybiBfX3I7Cit9CisKKy8vIG1pc21hdGNoCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcjEsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yMiwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3CitwYWlyPF9JbnB1dEl0ZXJhdG9yMSwgX0lucHV0SXRlcmF0b3IyPgorbWlzbWF0Y2goX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQpCit7CisgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEsICh2b2lkKSArK19fZmlyc3QyKQorICAgICAgICBpZiAoIV9fcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpCisgICAgICAgICAgICBicmVhazsKKyAgICByZXR1cm4gcGFpcjxfSW5wdXRJdGVyYXRvcjEsIF9JbnB1dEl0ZXJhdG9yMj4oX19maXJzdDEsIF9fZmlyc3QyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yMSwgY2xhc3MgX0lucHV0SXRlcmF0b3IyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK3BhaXI8X0lucHV0SXRlcmF0b3IxLCBfSW5wdXRJdGVyYXRvcjI+CittaXNtYXRjaChfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLCBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZSBfX3YxOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUgX192MjsKKyAgICByZXR1cm4gX1ZTVEQ6Om1pc21hdGNoKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19lcXVhbF90bzxfX3YxLCBfX3YyPigpKTsKK30KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IxLCBjbGFzcyBfSW5wdXRJdGVyYXRvcjIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworcGFpcjxfSW5wdXRJdGVyYXRvcjEsIF9JbnB1dEl0ZXJhdG9yMj4KK21pc21hdGNoKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQpCit7CisgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MjsgKytfX2ZpcnN0MSwgKHZvaWQpICsrX19maXJzdDIpCisgICAgICAgIGlmICghX19wcmVkKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIHJldHVybiBwYWlyPF9JbnB1dEl0ZXJhdG9yMSwgX0lucHV0SXRlcmF0b3IyPihfX2ZpcnN0MSwgX19maXJzdDIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IxLCBjbGFzcyBfSW5wdXRJdGVyYXRvcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworcGFpcjxfSW5wdXRJdGVyYXRvcjEsIF9JbnB1dEl0ZXJhdG9yMj4KK21pc21hdGNoKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUgX192MTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlIF9fdjI7CisgICAgcmV0dXJuIF9WU1REOjptaXNtYXRjaChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fZXF1YWxfdG88X192MSwgX192Mj4oKSk7Cit9CisjZW5kaWYKKworLy8gZXF1YWwKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yMSwgY2xhc3MgX0lucHV0SXRlcmF0b3IyLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK2Jvb2wKK2VxdWFsKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQpCit7CisgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEsICh2b2lkKSArK19fZmlyc3QyKQorICAgICAgICBpZiAoIV9fcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcjEsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3Citib29sCitlcXVhbChfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLCBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZSBfX3YxOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUgX192MjsKKyAgICByZXR1cm4gX1ZTVEQ6OmVxdWFsKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19lcXVhbF90bzxfX3YxLCBfX3YyPigpKTsKK30KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0ZSwgY2xhc3MgX0lucHV0SXRlcmF0b3IxLCBjbGFzcyBfSW5wdXRJdGVyYXRvcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworYm9vbAorX19lcXVhbChfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorICAgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLCBfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgaW5wdXRfaXRlcmF0b3JfdGFnLCBpbnB1dF9pdGVyYXRvcl90YWcgKQoreworICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDI7ICsrX19maXJzdDEsICh2b2lkKSArK19fZmlyc3QyKQorICAgICAgICBpZiAoIV9fcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIF9fZmlyc3QxID09IF9fbGFzdDEgJiYgX19maXJzdDIgPT0gX19sYXN0MjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaW5hcnlQcmVkaWNhdGUsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworYm9vbAorX19lcXVhbChfUmFuZG9tQWNjZXNzSXRlcmF0b3IxIF9fZmlyc3QxLCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIgX19maXJzdDIsIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIgX19sYXN0MiwgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQsCisgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgKQoreworICAgIGlmICggX1ZTVEQ6OmRpc3RhbmNlKF9fZmlyc3QxLCBfX2xhc3QxKSAhPSBfVlNURDo6ZGlzdGFuY2UoX19maXJzdDIsIF9fbGFzdDIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIF9WU1REOjplcXVhbDxfUmFuZG9tQWNjZXNzSXRlcmF0b3IxLCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X0JpbmFyeVByZWRpY2F0ZT46OnR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgIChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fcHJlZCApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IxLCBjbGFzcyBfSW5wdXRJdGVyYXRvcjIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworYm9vbAorZXF1YWwoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsIF9CaW5hcnlQcmVkaWNhdGUgX19wcmVkICkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6Ol9fZXF1YWw8dHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X0JpbmFyeVByZWRpY2F0ZT46OnR5cGU+CisgICAgICAgKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19wcmVkLAorICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6aXRlcmF0b3JfY2F0ZWdvcnkoKSwKKyAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46Oml0ZXJhdG9yX2NhdGVnb3J5KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IxLCBjbGFzcyBfSW5wdXRJdGVyYXRvcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworYm9vbAorZXF1YWwoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZSBfX3YxOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUgX192MjsKKyAgICByZXR1cm4gX1ZTVEQ6Ol9fZXF1YWwoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX2VxdWFsX3RvPF9fdjEsIF9fdjI+KCksCisgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+OjppdGVyYXRvcl9jYXRlZ29yeSgpLAorICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IyPjo6aXRlcmF0b3JfY2F0ZWdvcnkoKSk7Cit9CisjZW5kaWYKKworLy8gaXNfcGVybXV0YXRpb24KKwordGVtcGxhdGU8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IyLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcgYm9vbAoraXNfcGVybXV0YXRpb24oX0ZvcndhcmRJdGVyYXRvcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQpCit7CisvLyAgc2hvcnRlbiBzZXF1ZW5jZXMgYXMgbXVjaCBhcyBwb3NzaWJsZSBieSBsb3BwaW5nIG9mIGFueSBlcXVhbCBwcmVmaXgKKyAgICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKHZvaWQpICsrX19maXJzdDIpCisgICAgICAgIGlmICghX19wcmVkKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworLy8gIF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgKl9fZmlyc3QxICE9ICpfX2ZpcnN0MgorICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3IxPjo6ZGlmZmVyZW5jZV90eXBlIF9EMTsKKyAgICBfRDEgX19sMSA9IF9WU1REOjpkaXN0YW5jZShfX2ZpcnN0MSwgX19sYXN0MSk7CisgICAgaWYgKF9fbDEgPT0gX0QxKDEpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgX0ZvcndhcmRJdGVyYXRvcjIgX19sYXN0MiA9IF9WU1REOjpuZXh0KF9fZmlyc3QyLCBfX2wxKTsKKyAgICAvLyBGb3IgZWFjaCBlbGVtZW50IGluIFtmMSwgbDEpIHNlZSBpZiB0aGVyZSBhcmUgdGhlIHNhbWUgbnVtYmVyIG9mCisgICAgLy8gICAgZXF1YWwgZWxlbWVudHMgaW4gW2YyLCBsMikKKyAgICBmb3IgKF9Gb3J3YXJkSXRlcmF0b3IxIF9faSA9IF9fZmlyc3QxOyBfX2kgIT0gX19sYXN0MTsgKytfX2kpCisgICAgeworICAgIC8vICBIYXZlIHdlIGFscmVhZHkgY291bnRlZCB0aGUgbnVtYmVyIG9mICpfX2kgaW4gW2YxLCBsMSk/CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbWF0Y2ggPSBfX2ZpcnN0MTsKKyAgICAgICAgZm9yICg7IF9fbWF0Y2ggIT0gX19pOyArK19fbWF0Y2gpCisgICAgICAgICAgICBpZiAoX19wcmVkKCpfX21hdGNoLCAqX19pKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKF9fbWF0Y2ggPT0gX19pKSB7CisgICAgICAgICAgICAvLyBDb3VudCBudW1iZXIgb2YgKl9faSBpbiBbZjIsIGwyKQorICAgICAgICAgICAgX0QxIF9fYzIgPSAwOworICAgICAgICAgICAgZm9yIChfRm9yd2FyZEl0ZXJhdG9yMiBfX2ogPSBfX2ZpcnN0MjsgX19qICE9IF9fbGFzdDI7ICsrX19qKQorICAgICAgICAgICAgICAgIGlmIChfX3ByZWQoKl9faSwgKl9faikpCisgICAgICAgICAgICAgICAgICAgICsrX19jMjsKKyAgICAgICAgICAgIGlmIChfX2MyID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgLy8gQ291bnQgbnVtYmVyIG9mICpfX2kgaW4gW19faSwgbDEpICh3ZSBjYW4gc3RhcnQgd2l0aCAxKQorICAgICAgICAgICAgX0QxIF9fYzEgPSAxOworICAgICAgICAgICAgZm9yIChfRm9yd2FyZEl0ZXJhdG9yMSBfX2ogPSBfVlNURDo6bmV4dChfX2kpOyBfX2ogIT0gX19sYXN0MTsgKytfX2opCisgICAgICAgICAgICAgICAgaWYgKF9fcHJlZCgqX19pLCAqX19qKSkKKyAgICAgICAgICAgICAgICAgICAgKytfX2MxOworICAgICAgICAgICAgaWYgKF9fYzEgIT0gX19jMikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IxLCBjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3Citib29sCitpc19wZXJtdXRhdGlvbihfRm9yd2FyZEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fZmlyc3QyKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3IxPjo6dmFsdWVfdHlwZSBfX3YxOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3IyPjo6dmFsdWVfdHlwZSBfX3YyOworICAgIHJldHVybiBfVlNURDo6aXNfcGVybXV0YXRpb24oX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2VxdWFsX3RvPF9fdjEsIF9fdjI+KCkpOworfQorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlPGNsYXNzIF9CaW5hcnlQcmVkaWNhdGUsIGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IxLCBjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yMj4KK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3IGJvb2wKK19faXNfcGVybXV0YXRpb24oX0ZvcndhcmRJdGVyYXRvcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXJhdG9yMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcsIGZvcndhcmRfaXRlcmF0b3JfdGFnICkKK3sKKy8vICBzaG9ydGVuIHNlcXVlbmNlcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGJ5IGxvcHBpbmcgb2YgYW55IGVxdWFsIHByZWZpeAorICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDI7ICsrX19maXJzdDEsICh2b2lkKSArK19fZmlyc3QyKQorICAgICAgICBpZiAoIV9fcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkKKyAgICAgICAgcmV0dXJuIF9fZmlyc3QyID09IF9fbGFzdDI7CisgICAgZWxzZSBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcjE+OjpkaWZmZXJlbmNlX3R5cGUgX0QxOworICAgIF9EMSBfX2wxID0gX1ZTVEQ6OmRpc3RhbmNlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3IyPjo6ZGlmZmVyZW5jZV90eXBlIF9EMjsKKyAgICBfRDIgX19sMiA9IF9WU1REOjpkaXN0YW5jZShfX2ZpcnN0MiwgX19sYXN0Mik7CisgICAgaWYgKF9fbDEgIT0gX19sMikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRm9yIGVhY2ggZWxlbWVudCBpbiBbZjEsIGwxKSBzZWUgaWYgdGhlcmUgYXJlIHRoZSBzYW1lIG51bWJlciBvZgorICAgIC8vICAgIGVxdWFsIGVsZW1lbnRzIGluIFtmMiwgbDIpCisgICAgZm9yIChfRm9yd2FyZEl0ZXJhdG9yMSBfX2kgPSBfX2ZpcnN0MTsgX19pICE9IF9fbGFzdDE7ICsrX19pKQorICAgIHsKKyAgICAvLyAgSGF2ZSB3ZSBhbHJlYWR5IGNvdW50ZWQgdGhlIG51bWJlciBvZiAqX19pIGluIFtmMSwgbDEpPworICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yMSBfX21hdGNoID0gX19maXJzdDE7CisgICAgICAgIGZvciAoOyBfX21hdGNoICE9IF9faTsgKytfX21hdGNoKQorICAgICAgICAgICAgaWYgKF9fcHJlZCgqX19tYXRjaCwgKl9faSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChfX21hdGNoID09IF9faSkgeworICAgICAgICAgICAgLy8gQ291bnQgbnVtYmVyIG9mICpfX2kgaW4gW2YyLCBsMikKKyAgICAgICAgICAgIF9EMSBfX2MyID0gMDsKKyAgICAgICAgICAgIGZvciAoX0ZvcndhcmRJdGVyYXRvcjIgX19qID0gX19maXJzdDI7IF9faiAhPSBfX2xhc3QyOyArK19faikKKyAgICAgICAgICAgICAgICBpZiAoX19wcmVkKCpfX2ksICpfX2opKQorICAgICAgICAgICAgICAgICAgICArK19fYzI7CisgICAgICAgICAgICBpZiAoX19jMiA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIC8vIENvdW50IG51bWJlciBvZiAqX19pIGluIFtfX2ksIGwxKSAod2UgY2FuIHN0YXJ0IHdpdGggMSkKKyAgICAgICAgICAgIF9EMSBfX2MxID0gMTsKKyAgICAgICAgICAgIGZvciAoX0ZvcndhcmRJdGVyYXRvcjEgX19qID0gX1ZTVEQ6Om5leHQoX19pKTsgX19qICE9IF9fbGFzdDE7ICsrX19qKQorICAgICAgICAgICAgICAgIGlmIChfX3ByZWQoKl9faSwgKl9faikpCisgICAgICAgICAgICAgICAgICAgICsrX19jMTsKKyAgICAgICAgICAgIGlmIChfX2MxICE9IF9fYzIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQmluYXJ5UHJlZGljYXRlLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IxLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyPgorX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcgYm9vbAorX19pc19wZXJtdXRhdGlvbihfUmFuZG9tQWNjZXNzSXRlcmF0b3IxIF9fZmlyc3QxLCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyIF9fbGFzdDEsCisgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IxIF9fZmlyc3QyLCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyIF9fbGFzdDIsCisgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyApCit7CisgICAgaWYgKCBfVlNURDo6ZGlzdGFuY2UoX19maXJzdDEsIF9fbGFzdDEpICE9IF9WU1REOjpkaXN0YW5jZShfX2ZpcnN0MiwgX19sYXN0MikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gX1ZTVEQ6OmlzX3Blcm11dGF0aW9uPF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEsIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfQmluYXJ5UHJlZGljYXRlPjo6dHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19wcmVkICk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IxLCBjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yMiwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3Citib29sCitpc19wZXJtdXRhdGlvbihfRm9yd2FyZEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXJhdG9yMiBfX2xhc3QyLAorICAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQgKQoreworICAgIHJldHVybiBfVlNURDo6X19pc19wZXJtdXRhdGlvbjx0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfQmluYXJ5UHJlZGljYXRlPjo6dHlwZT4KKyAgICAgICAoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX3ByZWQsCisgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMT46Oml0ZXJhdG9yX2NhdGVnb3J5KCksCisgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMj46Oml0ZXJhdG9yX2NhdGVnb3J5KCkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yMSwgY2xhc3MgX0ZvcndhcmRJdGVyYXRvcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworYm9vbAoraXNfcGVybXV0YXRpb24oX0ZvcndhcmRJdGVyYXRvcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyYXRvcjIgX19sYXN0MikKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUgX192MTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUgX192MjsKKyAgICByZXR1cm4gX1ZTVEQ6Ol9faXNfcGVybXV0YXRpb24oX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLAorICAgICAgICBfX2VxdWFsX3RvPF9fdjEsIF9fdjI+KCksCisgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMT46Oml0ZXJhdG9yX2NhdGVnb3J5KCksCisgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMj46Oml0ZXJhdG9yX2NhdGVnb3J5KCkpOworfQorI2VuZGlmCisKKy8vIHNlYXJjaAorLy8gX19zZWFyY2ggaXMgaW4gPGZ1bmN0aW9uYWw+CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yMSwgY2xhc3MgX0ZvcndhcmRJdGVyYXRvcjIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworX0ZvcndhcmRJdGVyYXRvcjEKK3NlYXJjaChfRm9yd2FyZEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyYXRvcjIgX19sYXN0MiwgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQpCit7CisgICAgcmV0dXJuIF9WU1REOjpfX3NlYXJjaDx0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfQmluYXJ5UHJlZGljYXRlPjo6dHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMT46Oml0ZXJhdG9yX2NhdGVnb3J5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMj46Oml0ZXJhdG9yX2NhdGVnb3J5KCkpCisgICAgICAgICAgICAuZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yMSwgY2xhc3MgX0ZvcndhcmRJdGVyYXRvcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworX0ZvcndhcmRJdGVyYXRvcjEKK3NlYXJjaChfRm9yd2FyZEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyYXRvcjIgX19sYXN0MikKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUgX192MTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUgX192MjsKKyAgICByZXR1cm4gX1ZTVEQ6OnNlYXJjaChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fZXF1YWxfdG88X192MSwgX192Mj4oKSk7Cit9CisKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX1NlYXJjaGVyPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworX0ZvcndhcmRJdGVyYXRvciBzZWFyY2goX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX19sLCBjb25zdCBfU2VhcmNoZXIgJl9fcykKK3sgcmV0dXJuIF9fcyhfX2YsIF9fbCkuZmlyc3Q7IH0KKyNlbmRpZgorCisvLyBzZWFyY2hfbgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0ZSwgY2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX1NpemUsIGNsYXNzIF9UcD4KK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3IF9Gb3J3YXJkSXRlcmF0b3IKK19fc2VhcmNoX24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgX1NpemUgX19jb3VudCwgY29uc3QgX1RwJiBfX3ZhbHVlXywgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQsIGZvcndhcmRfaXRlcmF0b3JfdGFnKQoreworICAgIGlmIChfX2NvdW50IDw9IDApCisgICAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgICAgLy8gRmluZCBmaXJzdCBlbGVtZW50IGluIHNlcXVlbmNlIHRoYXQgbWF0Y2hzIF9fdmFsdWVfLCB3aXRoIGEgbWluaW51bSBvZiBsb29wIGNoZWNrcworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSAgLy8gcmV0dXJuIF9fbGFzdCBpZiBubyBlbGVtZW50IG1hdGNoZXMgX192YWx1ZV8KKyAgICAgICAgICAgICAgICByZXR1cm4gX19sYXN0OworICAgICAgICAgICAgaWYgKF9fcHJlZCgqX19maXJzdCwgX192YWx1ZV8pKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICB9CisgICAgICAgIC8vICpfX2ZpcnN0IG1hdGNoZXMgX192YWx1ZV8sIG5vdyBtYXRjaCBlbGVtZW50cyBhZnRlciBoZXJlCisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19tID0gX19maXJzdDsKKyAgICAgICAgX1NpemUgX19jKDApOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCsrX19jID09IF9fY291bnQpICAvLyBJZiBwYXR0ZXJuIGV4aGF1c3RlZCwgX19maXJzdCBpcyB0aGUgYW5zd2VyICh3b3JrcyBmb3IgMSBlbGVtZW50IHBhdHRlcm4pCisgICAgICAgICAgICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgICAgICAgICBpZiAoKytfX20gPT0gX19sYXN0KSAgLy8gT3RoZXJ3aXNlIGlmIHNvdXJjZSBleGhhdXNlZCwgcGF0dGVybiBub3QgZm91bmQKKyAgICAgICAgICAgICAgICByZXR1cm4gX19sYXN0OworICAgICAgICAgICAgaWYgKCFfX3ByZWQoKl9fbSwgX192YWx1ZV8pKSAgLy8gaWYgdGhlcmUgaXMgYSBtaXNtYXRjaCwgcmVzdGFydCB3aXRoIGEgbmV3IF9fZmlyc3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX2ZpcnN0ID0gX19tOworICAgICAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gIC8vIGVsc2UgdGhlcmUgaXMgYSBtYXRjaCwgY2hlY2sgbmV4dCBlbGVtZW50cworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0ZSwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgorX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCitfX3NlYXJjaF9uKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICBfU2l6ZSBfX2NvdW50LCBjb25zdCBfVHAmIF9fdmFsdWVfLCBfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCit7CisgICAgaWYgKF9fY291bnQgPD0gMCkKKyAgICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgX1NpemUgX19sZW4gPSBzdGF0aWNfY2FzdDxfU2l6ZT4oX19sYXN0IC0gX19maXJzdCk7CisgICAgaWYgKF9fbGVuIDwgX19jb3VudCkKKyAgICAgICAgcmV0dXJuIF9fbGFzdDsKKyAgICBjb25zdCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19zID0gX19sYXN0IC0gKF9fY291bnQgLSAxKTsgIC8vIFN0YXJ0IG9mIHBhdHRlcm4gbWF0Y2ggY2FuJ3QgZ28gYmV5b25kIGhlcmUKKyAgICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICAgIC8vIEZpbmQgZmlyc3QgZWxlbWVudCBpbiBzZXF1ZW5jZSB0aGF0IG1hdGNocyBfX3ZhbHVlXywgd2l0aCBhIG1pbmludW0gb2YgbG9vcCBjaGVja3MKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX2ZpcnN0ID49IF9fcykgIC8vIHJldHVybiBfX2xhc3QgaWYgbm8gZWxlbWVudCBtYXRjaGVzIF9fdmFsdWVfCisgICAgICAgICAgICAgICAgcmV0dXJuIF9fbGFzdDsKKyAgICAgICAgICAgIGlmIChfX3ByZWQoKl9fZmlyc3QsIF9fdmFsdWVfKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgfQorICAgICAgICAvLyAqX19maXJzdCBtYXRjaGVzIF9fdmFsdWVfLCBub3cgbWF0Y2ggZWxlbWVudHMgYWZ0ZXIgaGVyZQorICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19tID0gX19maXJzdDsKKyAgICAgICAgX1NpemUgX19jKDApOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCsrX19jID09IF9fY291bnQpICAvLyBJZiBwYXR0ZXJuIGV4aGF1c3RlZCwgX19maXJzdCBpcyB0aGUgYW5zd2VyICh3b3JrcyBmb3IgMSBlbGVtZW50IHBhdHRlcm4pCisgICAgICAgICAgICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgICAgICAgICAgKytfX207ICAgICAgICAgIC8vIG5vIG5lZWQgdG8gY2hlY2sgcmFuZ2Ugb24gX19tIGJlY2F1c2UgX19zIGd1YXJhbnRlZXMgd2UgaGF2ZSBlbm91Z2ggc291cmNlCisgICAgICAgICAgICBpZiAoIV9fcHJlZCgqX19tLCBfX3ZhbHVlXykpICAvLyBpZiB0aGVyZSBpcyBhIG1pc21hdGNoLCByZXN0YXJ0IHdpdGggYSBuZXcgX19maXJzdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fZmlyc3QgPSBfX207CisgICAgICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAgLy8gZWxzZSB0aGVyZSBpcyBhIG1hdGNoLCBjaGVjayBuZXh0IGVsZW1lbnRzCisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK19Gb3J3YXJkSXRlcmF0b3IKK3NlYXJjaF9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICBfU2l6ZSBfX2NvdW50LCBjb25zdCBfVHAmIF9fdmFsdWVfLCBfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6Ol9fc2VhcmNoX248dHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X0JpbmFyeVByZWRpY2F0ZT46OnR5cGU+CisgICAgICAgICAgIChfX2ZpcnN0LCBfX2xhc3QsIF9fY29udmVydF90b19pbnRlZ3JhbChfX2NvdW50KSwgX192YWx1ZV8sIF9fcHJlZCwKKyAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworX0ZvcndhcmRJdGVyYXRvcgorc2VhcmNoX24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgX1NpemUgX19jb3VudCwgY29uc3QgX1RwJiBfX3ZhbHVlXykKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBfX3Y7CisgICAgcmV0dXJuIF9WU1REOjpzZWFyY2hfbihfX2ZpcnN0LCBfX2xhc3QsIF9fY29udmVydF90b19pbnRlZ3JhbChfX2NvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdmFsdWVfLCBfX2VxdWFsX3RvPF9fdiwgX1RwPigpKTsKK30KKworLy8gY29weQordGVtcGxhdGUgPGNsYXNzIF9JdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19JdGVyCitfX3Vud3JhcF9pdGVyKF9JdGVyIF9faSkKK3sKKyAgICByZXR1cm4gX19pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX3RyaXZpYWxseV9jb3B5X2Fzc2lnbmFibGU8X1RwPjo6dmFsdWUsCisgICAgX1RwKgorPjo6dHlwZQorX191bndyYXBfaXRlcihtb3ZlX2l0ZXJhdG9yPF9UcCo+IF9faSkKK3sKKyAgICByZXR1cm4gX19pLmJhc2UoKTsKK30KKworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPCAyCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgaXNfdHJpdmlhbGx5X2NvcHlfYXNzaWduYWJsZTxfVHA+Ojp2YWx1ZSwKKyAgICBfVHAqCis+Ojp0eXBlCitfX3Vud3JhcF9pdGVyKF9fd3JhcF9pdGVyPF9UcCo+IF9faSkKK3sKKyAgICByZXR1cm4gX19pLmJhc2UoKTsKK30KKworI2Vsc2UKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBpc190cml2aWFsbHlfY29weV9hc3NpZ25hYmxlPF9UcD46OnZhbHVlLAorICAgIF9fd3JhcF9pdGVyPF9UcCo+Cis+Ojp0eXBlCitfX3Vud3JhcF9pdGVyKF9fd3JhcF9pdGVyPF9UcCo+IF9faSkKK3sKKyAgICByZXR1cm4gX19pOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfREVCVUdfTEVWRUwgPCAyCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19PdXRwdXRJdGVyYXRvcgorX19jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQoreworICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0LCAodm9pZCkgKytfX3Jlc3VsdCkKKyAgICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisgICAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgaXNfc2FtZTx0eXBlbmFtZSByZW1vdmVfY29uc3Q8X1RwPjo6dHlwZSwgX1VwPjo6dmFsdWUgJiYKKyAgICBpc190cml2aWFsbHlfY29weV9hc3NpZ25hYmxlPF9VcD46OnZhbHVlLAorICAgIF9VcCoKKz46OnR5cGUKK19fY29weShfVHAqIF9fZmlyc3QsIF9UcCogX19sYXN0LCBfVXAqIF9fcmVzdWx0KQoreworICAgIGNvbnN0IHNpemVfdCBfX24gPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fbGFzdCAtIF9fZmlyc3QpOworICAgIGlmIChfX24gPiAwKQorICAgICAgICBfVlNURDo6bWVtbW92ZShfX3Jlc3VsdCwgX19maXJzdCwgX19uICogc2l6ZW9mKF9VcCkpOworICAgIHJldHVybiBfX3Jlc3VsdCArIF9fbjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX091dHB1dEl0ZXJhdG9yCitjb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQoreworICAgIHJldHVybiBfVlNURDo6X19jb3B5KF9fdW53cmFwX2l0ZXIoX19maXJzdCksIF9fdW53cmFwX2l0ZXIoX19sYXN0KSwgX191bndyYXBfaXRlcihfX3Jlc3VsdCkpOworfQorCisvLyBjb3B5X2JhY2t3YXJkCisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX091dHB1dEl0ZXJhdG9yCitfX2NvcHlfYmFja3dhcmQoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQoreworICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICAgICAgKi0tX19yZXN1bHQgPSAqLS1fX2xhc3Q7CisgICAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgaXNfc2FtZTx0eXBlbmFtZSByZW1vdmVfY29uc3Q8X1RwPjo6dHlwZSwgX1VwPjo6dmFsdWUgJiYKKyAgICBpc190cml2aWFsbHlfY29weV9hc3NpZ25hYmxlPF9VcD46OnZhbHVlLAorICAgIF9VcCoKKz46OnR5cGUKK19fY29weV9iYWNrd2FyZChfVHAqIF9fZmlyc3QsIF9UcCogX19sYXN0LCBfVXAqIF9fcmVzdWx0KQoreworICAgIGNvbnN0IHNpemVfdCBfX24gPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fbGFzdCAtIF9fZmlyc3QpOworICAgIGlmIChfX24gPiAwKQorICAgIHsKKyAgICAgICAgX19yZXN1bHQgLT0gX19uOworICAgICAgICBfVlNURDo6bWVtbW92ZShfX3Jlc3VsdCwgX19maXJzdCwgX19uICogc2l6ZW9mKF9VcCkpOworICAgIH0KKyAgICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSwgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjIKK2NvcHlfYmFja3dhcmQoX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEgX19sYXN0LAorICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiBfX3Jlc3VsdCkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6Ol9fY29weV9iYWNrd2FyZChfX3Vud3JhcF9pdGVyKF9fZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdW53cmFwX2l0ZXIoX19sYXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Vud3JhcF9pdGVyKF9fcmVzdWx0KSk7Cit9CisKKy8vIGNvcHlfaWYKKwordGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9PdXRwdXRJdGVyYXRvciwgY2xhc3MgX1ByZWRpY2F0ZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfT3V0cHV0SXRlcmF0b3IKK2NvcHlfaWYoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9QcmVkaWNhdGUgX19wcmVkKQoreworICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgIHsKKyAgICAgICAgaWYgKF9fcHJlZCgqX19maXJzdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICAgICAgICAgICAgKytfX3Jlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19yZXN1bHQ7Cit9CisKKy8vIGNvcHlfbgorCit0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX1NpemUsIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX2lucHV0X2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICFfX2lzX3JhbmRvbV9hY2Nlc3NfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICBfT3V0cHV0SXRlcmF0b3IKKz46OnR5cGUKK2NvcHlfbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX29yaWdfbiwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQoreworICAgIHR5cGVkZWYgZGVjbHR5cGUoX19jb252ZXJ0X3RvX2ludGVncmFsKF9fb3JpZ19uKSkgX0ludGVncmFsU2l6ZTsKKyAgICBfSW50ZWdyYWxTaXplIF9fbiA9IF9fb3JpZ19uOworICAgIGlmIChfX24gPiAwKQorICAgIHsKKyAgICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisgICAgICAgICsrX19yZXN1bHQ7CisgICAgICAgIGZvciAoLS1fX247IF9fbiA+IDA7IC0tX19uKQorICAgICAgICB7CisgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKyAgICAgICAgICAgICsrX19yZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX1NpemUsIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3JhbmRvbV9hY2Nlc3NfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICBfT3V0cHV0SXRlcmF0b3IKKz46OnR5cGUKK2NvcHlfbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX29yaWdfbiwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQoreworICAgIHR5cGVkZWYgZGVjbHR5cGUoX19jb252ZXJ0X3RvX2ludGVncmFsKF9fb3JpZ19uKSkgX0ludGVncmFsU2l6ZTsKKyAgICBfSW50ZWdyYWxTaXplIF9fbiA9IF9fb3JpZ19uOworICAgIHJldHVybiBfVlNURDo6Y29weShfX2ZpcnN0LCBfX2ZpcnN0ICsgX19uLCBfX3Jlc3VsdCk7Cit9CisKKy8vIG1vdmUKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX091dHB1dEl0ZXJhdG9yCitfX21vdmUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCit7CisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICh2b2lkKSArK19fcmVzdWx0KQorICAgICAgICAqX19yZXN1bHQgPSBfVlNURDo6bW92ZSgqX19maXJzdCk7CisgICAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgaXNfc2FtZTx0eXBlbmFtZSByZW1vdmVfY29uc3Q8X1RwPjo6dHlwZSwgX1VwPjo6dmFsdWUgJiYKKyAgICBpc190cml2aWFsbHlfY29weV9hc3NpZ25hYmxlPF9VcD46OnZhbHVlLAorICAgIF9VcCoKKz46OnR5cGUKK19fbW92ZShfVHAqIF9fZmlyc3QsIF9UcCogX19sYXN0LCBfVXAqIF9fcmVzdWx0KQoreworICAgIGNvbnN0IHNpemVfdCBfX24gPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fbGFzdCAtIF9fZmlyc3QpOworICAgIGlmIChfX24gPiAwKQorICAgICAgICBfVlNURDo6bWVtbW92ZShfX3Jlc3VsdCwgX19maXJzdCwgX19uICogc2l6ZW9mKF9VcCkpOworICAgIHJldHVybiBfX3Jlc3VsdCArIF9fbjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX091dHB1dEl0ZXJhdG9yCittb3ZlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQoreworICAgIHJldHVybiBfVlNURDo6X19tb3ZlKF9fdW53cmFwX2l0ZXIoX19maXJzdCksIF9fdW53cmFwX2l0ZXIoX19sYXN0KSwgX191bndyYXBfaXRlcihfX3Jlc3VsdCkpOworfQorCisvLyBtb3ZlX2JhY2t3YXJkCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19PdXRwdXRJdGVyYXRvcgorX19tb3ZlX2JhY2t3YXJkKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQoreworICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICAgICAgKi0tX19yZXN1bHQgPSBfVlNURDo6bW92ZSgqLS1fX2xhc3QpOworICAgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX3NhbWU8dHlwZW5hbWUgcmVtb3ZlX2NvbnN0PF9UcD46OnR5cGUsIF9VcD46OnZhbHVlICYmCisgICAgaXNfdHJpdmlhbGx5X2NvcHlfYXNzaWduYWJsZTxfVXA+Ojp2YWx1ZSwKKyAgICBfVXAqCis+Ojp0eXBlCitfX21vdmVfYmFja3dhcmQoX1RwKiBfX2ZpcnN0LCBfVHAqIF9fbGFzdCwgX1VwKiBfX3Jlc3VsdCkKK3sKKyAgICBjb25zdCBzaXplX3QgX19uID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX2xhc3QgLSBfX2ZpcnN0KTsKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIF9fcmVzdWx0IC09IF9fbjsKKyAgICAgICAgX1ZTVEQ6Om1lbW1vdmUoX19yZXN1bHQsIF9fZmlyc3QsIF9fbiAqIHNpemVvZihfVXApKTsKKyAgICB9CisgICAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19CaWRpcmVjdGlvbmFsSXRlcmF0b3IyCittb3ZlX2JhY2t3YXJkKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxIF9fbGFzdCwKKyAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjIgX19yZXN1bHQpCit7CisgICAgcmV0dXJuIF9WU1REOjpfX21vdmVfYmFja3dhcmQoX191bndyYXBfaXRlcihfX2ZpcnN0KSwgX191bndyYXBfaXRlcihfX2xhc3QpLCBfX3Vud3JhcF9pdGVyKF9fcmVzdWx0KSk7Cit9CisKKy8vIGl0ZXJfc3dhcAorCisvLyBtb3ZlZCB0byA8dHlwZV90cmFpdHM+IGZvciBiZXR0ZXIgc3dhcCAvIG5vZXhjZXB0IHN1cHBvcnQKKworLy8gdHJhbnNmb3JtCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfVW5hcnlPcGVyYXRpb24+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworX091dHB1dEl0ZXJhdG9yCit0cmFuc2Zvcm0oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9VbmFyeU9wZXJhdGlvbiBfX29wKQoreworICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0LCAodm9pZCkgKytfX3Jlc3VsdCkKKyAgICAgICAgKl9fcmVzdWx0ID0gX19vcCgqX19maXJzdCk7CisgICAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IxLCBjbGFzcyBfSW5wdXRJdGVyYXRvcjIsIGNsYXNzIF9PdXRwdXRJdGVyYXRvciwgY2xhc3MgX0JpbmFyeU9wZXJhdGlvbj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3CitfT3V0cHV0SXRlcmF0b3IKK3RyYW5zZm9ybShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLCBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsCisgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5T3BlcmF0aW9uIF9fYmluYXJ5X29wKQoreworICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCAodm9pZCkgKytfX2ZpcnN0MiwgKytfX3Jlc3VsdCkKKyAgICAgICAgKl9fcmVzdWx0ID0gX19iaW5hcnlfb3AoKl9fZmlyc3QxLCAqX19maXJzdDIpOworICAgIHJldHVybiBfX3Jlc3VsdDsKK30KKworLy8gcmVwbGFjZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK3ZvaWQKK3JlcGxhY2UoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX29sZF92YWx1ZSwgY29uc3QgX1RwJiBfX25ld192YWx1ZSkKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgaWYgKCpfX2ZpcnN0ID09IF9fb2xkX3ZhbHVlKQorICAgICAgICAgICAgKl9fZmlyc3QgPSBfX25ld192YWx1ZTsKK30KKworLy8gcmVwbGFjZV9pZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX1ByZWRpY2F0ZSwgY2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK3ZvaWQKK3JlcGxhY2VfaWYoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQsIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUpCit7CisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorICAgICAgICAgICAgKl9fZmlyc3QgPSBfX25ld192YWx1ZTsKK30KKworLy8gcmVwbGFjZV9jb3B5CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworX091dHB1dEl0ZXJhdG9yCityZXBsYWNlX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisgICAgICAgICAgICAgY29uc3QgX1RwJiBfX29sZF92YWx1ZSwgY29uc3QgX1RwJiBfX25ld192YWx1ZSkKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKHZvaWQpICsrX19yZXN1bHQpCisgICAgICAgIGlmICgqX19maXJzdCA9PSBfX29sZF92YWx1ZSkKKyAgICAgICAgICAgICpfX3Jlc3VsdCA9IF9fbmV3X3ZhbHVlOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKyAgICByZXR1cm4gX19yZXN1bHQ7Cit9CisKKy8vIHJlcGxhY2VfY29weV9pZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9PdXRwdXRJdGVyYXRvciwgY2xhc3MgX1ByZWRpY2F0ZSwgY2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK19PdXRwdXRJdGVyYXRvcgorcmVwbGFjZV9jb3B5X2lmKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBjb25zdCBfVHAmIF9fbmV3X3ZhbHVlKQoreworICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0LCAodm9pZCkgKytfX3Jlc3VsdCkKKyAgICAgICAgaWYgKF9fcHJlZCgqX19maXJzdCkpCisgICAgICAgICAgICAqX19yZXN1bHQgPSBfX25ld192YWx1ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisgICAgcmV0dXJuIF9fcmVzdWx0OworfQorCisvLyBmaWxsX24KKwordGVtcGxhdGUgPGNsYXNzIF9PdXRwdXRJdGVyYXRvciwgY2xhc3MgX1NpemUsIGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3CitfT3V0cHV0SXRlcmF0b3IKK19fZmlsbF9uKF9PdXRwdXRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZV8pCit7CisgICAgZm9yICg7IF9fbiA+IDA7ICsrX19maXJzdCwgKHZvaWQpIC0tX19uKQorICAgICAgICAqX19maXJzdCA9IF9fdmFsdWVfOworICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK19PdXRwdXRJdGVyYXRvcgorZmlsbF9uKF9PdXRwdXRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZV8pCit7CisgICByZXR1cm4gX1ZTVEQ6Ol9fZmlsbF9uKF9fZmlyc3QsIF9fY29udmVydF90b19pbnRlZ3JhbChfX24pLCBfX3ZhbHVlXyk7Cit9CisKKy8vIGZpbGwKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3Cit2b2lkCitfX2ZpbGwoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlXywgZm9yd2FyZF9pdGVyYXRvcl90YWcpCit7CisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgICpfX2ZpcnN0ID0gX192YWx1ZV87Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3Cit2b2lkCitfX2ZpbGwoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWx1ZV8sIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQoreworICAgIF9WU1REOjpmaWxsX24oX19maXJzdCwgX19sYXN0IC0gX19maXJzdCwgX192YWx1ZV8pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK3ZvaWQKK2ZpbGwoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlXykKK3sKKyAgICBfVlNURDo6X19maWxsKF9fZmlyc3QsIF9fbGFzdCwgX192YWx1ZV8sIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnkoKSk7Cit9CisKKy8vIGdlbmVyYXRlCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfR2VuZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK3ZvaWQKK2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIF9HZW5lcmF0b3IgX19nZW4pCit7CisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgICpfX2ZpcnN0ID0gX19nZW4oKTsKK30KKworLy8gZ2VuZXJhdGVfbgorCit0ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX0dlbmVyYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworX091dHB1dEl0ZXJhdG9yCitnZW5lcmF0ZV9uKF9PdXRwdXRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX29yaWdfbiwgX0dlbmVyYXRvciBfX2dlbikKK3sKKyAgICB0eXBlZGVmIGRlY2x0eXBlKF9fY29udmVydF90b19pbnRlZ3JhbChfX29yaWdfbikpIF9JbnRlZ3JhbFNpemU7CisgICAgX0ludGVncmFsU2l6ZSBfX24gPSBfX29yaWdfbjsKKyAgICBmb3IgKDsgX19uID4gMDsgKytfX2ZpcnN0LCAodm9pZCkgLS1fX24pCisgICAgICAgICpfX2ZpcnN0ID0gX19nZW4oKTsKKyAgICByZXR1cm4gX19maXJzdDsKK30KKworLy8gcmVtb3ZlCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfVHA+CitfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNyBfRm9yd2FyZEl0ZXJhdG9yCityZW1vdmUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlXykKK3sKKyAgICBfX2ZpcnN0ID0gX1ZTVEQ6OmZpbmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbHVlXyk7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OworICAgICAgICB3aGlsZSAoKytfX2kgIT0gX19sYXN0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoISgqX19pID09IF9fdmFsdWVfKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqX19maXJzdCA9IF9WU1REOjptb3ZlKCpfX2kpOworICAgICAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19maXJzdDsKK30KKworLy8gcmVtb3ZlX2lmCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfUHJlZGljYXRlPgorX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcgX0ZvcndhcmRJdGVyYXRvcgorcmVtb3ZlX2lmKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIF9QcmVkaWNhdGUgX19wcmVkKQoreworICAgIF9fZmlyc3QgPSBfVlNURDo6ZmluZF9pZjxfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfUHJlZGljYXRlPjo6dHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCk7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OworICAgICAgICB3aGlsZSAoKytfX2kgIT0gX19sYXN0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9fcHJlZCgqX19pKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqX19maXJzdCA9IF9WU1REOjptb3ZlKCpfX2kpOworICAgICAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19maXJzdDsKK30KKworLy8gcmVtb3ZlX2NvcHkKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3IsIGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3CitfT3V0cHV0SXRlcmF0b3IKK3JlbW92ZV9jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBjb25zdCBfVHAmIF9fdmFsdWVfKQoreworICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgIHsKKyAgICAgICAgaWYgKCEoKl9fZmlyc3QgPT0gX192YWx1ZV8pKQorICAgICAgICB7CisgICAgICAgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKyAgICAgICAgICAgICsrX19yZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fcmVzdWx0OworfQorCisvLyByZW1vdmVfY29weV9pZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9PdXRwdXRJdGVyYXRvciwgY2xhc3MgX1ByZWRpY2F0ZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3CitfT3V0cHV0SXRlcmF0b3IKK3JlbW92ZV9jb3B5X2lmKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfUHJlZGljYXRlIF9fcHJlZCkKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICB7CisgICAgICAgIGlmICghX19wcmVkKCpfX2ZpcnN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisgICAgICAgICAgICArK19fcmVzdWx0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX3Jlc3VsdDsKK30KKworLy8gdW5pcXVlCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcgX0ZvcndhcmRJdGVyYXRvcgordW5pcXVlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIF9CaW5hcnlQcmVkaWNhdGUgX19wcmVkKQoreworICAgIF9fZmlyc3QgPSBfVlNURDo6YWRqYWNlbnRfZmluZDxfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfQmluYXJ5UHJlZGljYXRlPjo6dHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCk7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgLy8gLi4uICBhICBhICA/ICAuLi4KKyAgICAgICAgLy8gICAgICBmICAgICBpCisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19pID0gX19maXJzdDsKKyAgICAgICAgZm9yICgrK19faTsgKytfX2kgIT0gX19sYXN0OykKKyAgICAgICAgICAgIGlmICghX19wcmVkKCpfX2ZpcnN0LCAqX19pKSkKKyAgICAgICAgICAgICAgICAqKytfX2ZpcnN0ID0gX1ZTVEQ6Om1vdmUoKl9faSk7CisgICAgICAgICsrX19maXJzdDsKKyAgICB9CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK19Gb3J3YXJkSXRlcmF0b3IKK3VuaXF1ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlIF9fdjsKKyAgICByZXR1cm4gX1ZTVEQ6OnVuaXF1ZShfX2ZpcnN0LCBfX2xhc3QsIF9fZXF1YWxfdG88X192PigpKTsKK30KKworLy8gdW5pcXVlX2NvcHkKKwordGVtcGxhdGUgPGNsYXNzIF9CaW5hcnlQcmVkaWNhdGUsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNyBfT3V0cHV0SXRlcmF0b3IKK19fdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9CaW5hcnlQcmVkaWNhdGUgX19wcmVkLAorICAgICAgICAgICAgICBpbnB1dF9pdGVyYXRvcl90YWcsIG91dHB1dF9pdGVyYXRvcl90YWcpCit7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBfX3QoKl9fZmlyc3QpOworICAgICAgICAqX19yZXN1bHQgPSBfX3Q7CisgICAgICAgICsrX19yZXN1bHQ7CisgICAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9fcHJlZChfX3QsICpfX2ZpcnN0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX3QgPSAqX19maXJzdDsKKyAgICAgICAgICAgICAgICAqX19yZXN1bHQgPSBfX3Q7CisgICAgICAgICAgICAgICAgKytfX3Jlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmluYXJ5UHJlZGljYXRlLCBjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNyBfT3V0cHV0SXRlcmF0b3IKK19fdW5pcXVlX2NvcHkoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcsIG91dHB1dF9pdGVyYXRvcl90YWcpCit7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OworICAgICAgICAqX19yZXN1bHQgPSAqX19pOworICAgICAgICArK19fcmVzdWx0OworICAgICAgICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfX3ByZWQoKl9faSwgKl9fZmlyc3QpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICAgICAgICAgICAgICAgICsrX19yZXN1bHQ7CisgICAgICAgICAgICAgICAgX19pID0gX19maXJzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmluYXJ5UHJlZGljYXRlLCBjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3IF9Gb3J3YXJkSXRlcmF0b3IKK19fdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgaW5wdXRfaXRlcmF0b3JfdGFnLCBmb3J3YXJkX2l0ZXJhdG9yX3RhZykKK3sKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisgICAgeworICAgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKyAgICAgICAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisgICAgICAgICAgICBpZiAoIV9fcHJlZCgqX19yZXN1bHQsICpfX2ZpcnN0KSkKKyAgICAgICAgICAgICAgICAqKytfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICAgICAgICArK19fcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK19PdXRwdXRJdGVyYXRvcgordW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9CaW5hcnlQcmVkaWNhdGUgX19wcmVkKQoreworICAgIHJldHVybiBfVlNURDo6X191bmlxdWVfY29weTx0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfQmluYXJ5UHJlZGljYXRlPjo6dHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X091dHB1dEl0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnkoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK19PdXRwdXRJdGVyYXRvcgordW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlIF9fdjsKKyAgICByZXR1cm4gX1ZTVEQ6OnVuaXF1ZV9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9fZXF1YWxfdG88X192PigpKTsKK30KKworLy8gcmV2ZXJzZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitfX3JldmVyc2UoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcpCit7CisgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgaWYgKF9fZmlyc3QgPT0gLS1fX2xhc3QpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgX1ZTVEQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICArK19fZmlyc3Q7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK19fcmV2ZXJzZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCit7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgICAgICBmb3IgKDsgX19maXJzdCA8IC0tX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgICAgICBfVlNURDo6aXRlcl9zd2FwKF9fZmlyc3QsIF9fbGFzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3JldmVyc2UoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBfVlNURDo6X19yZXZlcnNlKF9fZmlyc3QsIF9fbGFzdCwgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSgpKTsKK30KKworLy8gcmV2ZXJzZV9jb3B5CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworX091dHB1dEl0ZXJhdG9yCityZXZlcnNlX2NvcHkoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQoreworICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX3Jlc3VsdCkKKyAgICAgICAgKl9fcmVzdWx0ID0gKi0tX19sYXN0OworICAgIHJldHVybiBfX3Jlc3VsdDsKK30KKworLy8gcm90YXRlCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorX0ZvcndhcmRJdGVyYXRvcgorX19yb3RhdGVfbGVmdChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdmFsdWVfdHlwZSBfX3RtcCA9IF9WU1REOjptb3ZlKCpfX2ZpcnN0KTsKKyAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbG0xID0gX1ZTVEQ6Om1vdmUoX1ZTVEQ6Om5leHQoX19maXJzdCksIF9fbGFzdCwgX19maXJzdCk7CisgICAgKl9fbG0xID0gX1ZTVEQ6Om1vdmUoX190bXApOworICAgIHJldHVybiBfX2xtMTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+CitfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yCitfX3JvdGF0ZV9yaWdodChfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xtMSA9IF9WU1REOjpwcmV2KF9fbGFzdCk7CisgICAgdmFsdWVfdHlwZSBfX3RtcCA9IF9WU1REOjptb3ZlKCpfX2xtMSk7CisgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZwMSA9IF9WU1REOjptb3ZlX2JhY2t3YXJkKF9fZmlyc3QsIF9fbG0xLCBfX2xhc3QpOworICAgICpfX2ZpcnN0ID0gX1ZTVEQ6Om1vdmUoX190bXApOworICAgIHJldHVybiBfX2ZwMTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitfX3JvdGF0ZV9mb3J3YXJkKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX21pZGRsZSwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgX0ZvcndhcmRJdGVyYXRvciBfX2kgPSBfX21pZGRsZTsKKyAgICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICAgIHN3YXAoKl9fZmlyc3QsICpfX2kpOworICAgICAgICArK19fZmlyc3Q7CisgICAgICAgIGlmICgrK19faSA9PSBfX2xhc3QpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKF9fZmlyc3QgPT0gX19taWRkbGUpCisgICAgICAgICAgICBfX21pZGRsZSA9IF9faTsKKyAgICB9CisgICAgX0ZvcndhcmRJdGVyYXRvciBfX3IgPSBfX2ZpcnN0OworICAgIGlmIChfX2ZpcnN0ICE9IF9fbWlkZGxlKQorICAgIHsKKyAgICAgICAgX19pID0gX19taWRkbGU7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2FwKCpfX2ZpcnN0LCAqX19pKTsKKyAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgIGlmICgrK19faSA9PSBfX2xhc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9fZmlyc3QgPT0gX19taWRkbGUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIF9faSA9IF9fbWlkZGxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX19maXJzdCA9PSBfX21pZGRsZSkKKyAgICAgICAgICAgICAgICBfX21pZGRsZSA9IF9faTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZWdyYWw+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0ludGVncmFsCitfX2FsZ29fZ2NkKF9JbnRlZ3JhbCBfX3gsIF9JbnRlZ3JhbCBfX3kpCit7CisgICAgZG8KKyAgICB7CisgICAgICAgIF9JbnRlZ3JhbCBfX3QgPSBfX3ggJSBfX3k7CisgICAgICAgIF9feCA9IF9feTsKKyAgICAgICAgX195ID0gX190OworICAgIH0gd2hpbGUgKF9feSk7CisgICAgcmV0dXJuIF9feDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCitfX3JvdGF0ZV9nY2QoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX21pZGRsZSwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKworICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX20xID0gX19taWRkbGUgLSBfX2ZpcnN0OworICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX20yID0gX19sYXN0IC0gX19taWRkbGU7CisgICAgaWYgKF9fbTEgPT0gX19tMikKKyAgICB7CisgICAgICAgIF9WU1REOjpzd2FwX3JhbmdlcyhfX2ZpcnN0LCBfX21pZGRsZSwgX19taWRkbGUpOworICAgICAgICByZXR1cm4gX19taWRkbGU7CisgICAgfQorICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2cgPSBfVlNURDo6X19hbGdvX2djZChfX20xLCBfX20yKTsKKyAgICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3AgPSBfX2ZpcnN0ICsgX19nOyBfX3AgIT0gX19maXJzdDspCisgICAgeworICAgICAgICB2YWx1ZV90eXBlIF9fdChfVlNURDo6bW92ZSgqLS1fX3ApKTsKKyAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcDEgPSBfX3A7CisgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3AyID0gX19wMSArIF9fbTE7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgICpfX3AxID0gX1ZTVEQ6Om1vdmUoKl9fcDIpOworICAgICAgICAgICAgX19wMSA9IF9fcDI7CisgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19kID0gX19sYXN0IC0gX19wMjsKKyAgICAgICAgICAgIGlmIChfX20xIDwgX19kKQorICAgICAgICAgICAgICAgIF9fcDIgKz0gX19tMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfX3AyID0gX19maXJzdCArIChfX20xIC0gX19kKTsKKyAgICAgICAgfSB3aGlsZSAoX19wMiAhPSBfX3ApOworICAgICAgICAqX19wMSA9IF9WU1REOjptb3ZlKF9fdCk7CisgICAgfQorICAgIHJldHVybiBfX2ZpcnN0ICsgX19tMjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0ZvcndhcmRJdGVyYXRvcgorX19yb3RhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkZGxlLCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgIF9WU1REOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9WU1REOjppdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICBpZiAoX1ZTVEQ6OmlzX3RyaXZpYWxseV9tb3ZlX2Fzc2lnbmFibGU8dmFsdWVfdHlwZT46OnZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKF9WU1REOjpuZXh0KF9fZmlyc3QpID09IF9fbWlkZGxlKQorICAgICAgICAgICAgcmV0dXJuIF9WU1REOjpfX3JvdGF0ZV9sZWZ0KF9fZmlyc3QsIF9fbGFzdCk7CisgICAgfQorICAgIHJldHVybiBfVlNURDo6X19yb3RhdGVfZm9yd2FyZChfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0JpZGlyZWN0aW9uYWxJdGVyYXRvcgorX19yb3RhdGUoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbWlkZGxlLCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgIF9WU1REOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZykKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9WU1REOjppdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICBpZiAoX1ZTVEQ6OmlzX3RyaXZpYWxseV9tb3ZlX2Fzc2lnbmFibGU8dmFsdWVfdHlwZT46OnZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKF9WU1REOjpuZXh0KF9fZmlyc3QpID09IF9fbWlkZGxlKQorICAgICAgICAgICAgcmV0dXJuIF9WU1REOjpfX3JvdGF0ZV9sZWZ0KF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIGlmIChfVlNURDo6bmV4dChfX21pZGRsZSkgPT0gX19sYXN0KQorICAgICAgICAgICAgcmV0dXJuIF9WU1REOjpfX3JvdGF0ZV9yaWdodChfX2ZpcnN0LCBfX2xhc3QpOworICAgIH0KKyAgICByZXR1cm4gX1ZTVEQ6Ol9fcm90YXRlX2ZvcndhcmQoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCitfX3JvdGF0ZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbWlkZGxlLCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgX1ZTVEQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1ZTVEQ6Oml0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgaWYgKF9WU1REOjppc190cml2aWFsbHlfbW92ZV9hc3NpZ25hYmxlPHZhbHVlX3R5cGU+Ojp2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmIChfVlNURDo6bmV4dChfX2ZpcnN0KSA9PSBfX21pZGRsZSkKKyAgICAgICAgICAgIHJldHVybiBfVlNURDo6X19yb3RhdGVfbGVmdChfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICBpZiAoX1ZTVEQ6Om5leHQoX19taWRkbGUpID09IF9fbGFzdCkKKyAgICAgICAgICAgIHJldHVybiBfVlNURDo6X19yb3RhdGVfcmlnaHQoX19maXJzdCwgX19sYXN0KTsKKyAgICAgICAgcmV0dXJuIF9WU1REOjpfX3JvdGF0ZV9nY2QoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCk7CisgICAgfQorICAgIHJldHVybiBfVlNURDo6X19yb3RhdGVfZm9yd2FyZChfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0ZvcndhcmRJdGVyYXRvcgorcm90YXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX21pZGRsZSwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgaWYgKF9fZmlyc3QgPT0gX19taWRkbGUpCisgICAgICAgIHJldHVybiBfX2xhc3Q7CisgICAgaWYgKF9fbWlkZGxlID09IF9fbGFzdCkKKyAgICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgcmV0dXJuIF9WU1REOjpfX3JvdGF0ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1ZTVEQ6Oml0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnkoKSk7Cit9CisKKy8vIHJvdGF0ZV9jb3B5CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX091dHB1dEl0ZXJhdG9yCityb3RhdGVfY29weShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19taWRkbGUsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCit7CisgICAgcmV0dXJuIF9WU1REOjpjb3B5KF9fZmlyc3QsIF9fbWlkZGxlLCBfVlNURDo6Y29weShfX21pZGRsZSwgX19sYXN0LCBfX3Jlc3VsdCkpOworfQorCisvLyBtaW5fZWxlbWVudAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorX0ZvcndhcmRJdGVyYXRvcgorbWluX2VsZW1lbnQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQoreworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICB7CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19pID0gX19maXJzdDsKKyAgICAgICAgd2hpbGUgKCsrX19pICE9IF9fbGFzdCkKKyAgICAgICAgICAgIGlmIChfX2NvbXAoKl9faSwgKl9fZmlyc3QpKQorICAgICAgICAgICAgICAgIF9fZmlyc3QgPSBfX2k7CisgICAgfQorICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitfRm9yd2FyZEl0ZXJhdG9yCittaW5fZWxlbWVudChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworICAgIHJldHVybiBfVlNURDo6bWluX2VsZW1lbnQoX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICBfX2xlc3M8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPigpKTsKK30KKworLy8gbWluCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK2NvbnN0IF9UcCYKK21pbihjb25zdCBfVHAmIF9fYSwgY29uc3QgX1RwJiBfX2IsIF9Db21wYXJlIF9fY29tcCkKK3sKKyAgICByZXR1cm4gX19jb21wKF9fYiwgX19hKSA/IF9fYiA6IF9fYTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitjb25zdCBfVHAmCittaW4oY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iKQoreworICAgIHJldHVybiBfVlNURDo6bWluKF9fYSwgX19iLCBfX2xlc3M8X1RwPigpKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitfVHAKK21pbihpbml0aWFsaXplcl9saXN0PF9UcD4gX190LCBfQ29tcGFyZSBfX2NvbXApCit7CisgICAgcmV0dXJuICpfVlNURDo6bWluX2VsZW1lbnQoX190LmJlZ2luKCksIF9fdC5lbmQoKSwgX19jb21wKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK19UcAorbWluKGluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX3QpCit7CisgICAgcmV0dXJuICpfVlNURDo6bWluX2VsZW1lbnQoX190LmJlZ2luKCksIF9fdC5lbmQoKSwgX19sZXNzPF9UcD4oKSk7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKy8vIG1heF9lbGVtZW50CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitfRm9yd2FyZEl0ZXJhdG9yCittYXhfZWxlbWVudChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCit7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OworICAgICAgICB3aGlsZSAoKytfX2kgIT0gX19sYXN0KQorICAgICAgICAgICAgaWYgKF9fY29tcCgqX19maXJzdCwgKl9faSkpCisgICAgICAgICAgICAgICAgX19maXJzdCA9IF9faTsKKyAgICB9CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorX0ZvcndhcmRJdGVyYXRvcgorbWF4X2VsZW1lbnQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6Om1heF9lbGVtZW50KF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgX19sZXNzPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4oKSk7Cit9CisKKy8vIG1heAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitjb25zdCBfVHAmCittYXgoY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iLCBfQ29tcGFyZSBfX2NvbXApCit7CisgICAgcmV0dXJuIF9fY29tcChfX2EsIF9fYikgPyBfX2IgOiBfX2E7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorY29uc3QgX1RwJgorbWF4KGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYikKK3sKKyAgICByZXR1cm4gX1ZTVEQ6Om1heChfX2EsIF9fYiwgX19sZXNzPF9UcD4oKSk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorX1RwCittYXgoaW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9fdCwgX0NvbXBhcmUgX19jb21wKQoreworICAgIHJldHVybiAqX1ZTVEQ6Om1heF9lbGVtZW50KF9fdC5iZWdpbigpLCBfX3QuZW5kKCksIF9fY29tcCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitfVHAKK21heChpbml0aWFsaXplcl9saXN0PF9UcD4gX190KQoreworICAgIHJldHVybiAqX1ZTVEQ6Om1heF9lbGVtZW50KF9fdC5iZWdpbigpLCBfX3QuZW5kKCksIF9fbGVzczxfVHA+KCkpOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKy8vIGNsYW1wCit0ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIKK2NvbnN0IF9UcCYKK2NsYW1wKGNvbnN0IF9UcCYgX192LCBjb25zdCBfVHAmIF9fbG8sIGNvbnN0IF9UcCYgX19oaSwgX0NvbXBhcmUgX19jb21wKQoreworICAgIF9MSUJDUFBfQVNTRVJUKCFfX2NvbXAoX19oaSwgX19sbyksICJCYWQgYm91bmRzIHBhc3NlZCB0byBzdGQ6OmNsYW1wIik7CisgICAgcmV0dXJuIF9fY29tcChfX3YsIF9fbG8pID8gX19sbyA6IF9fY29tcChfX2hpLCBfX3YpID8gX19oaSA6IF9fdjsKKworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgorY29uc3QgX1RwJgorY2xhbXAoY29uc3QgX1RwJiBfX3YsIGNvbnN0IF9UcCYgX19sbywgY29uc3QgX1RwJiBfX2hpKQoreworICAgIHJldHVybiBfVlNURDo6Y2xhbXAoX192LCBfX2xvLCBfX2hpLCBfX2xlc3M8X1RwPigpKTsKK30KKyNlbmRpZgorCisvLyBtaW5tYXhfZWxlbWVudAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX0NvbXBhcmU+CitfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorc3RkOjpwYWlyPF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3I+CittaW5tYXhfZWxlbWVudChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCit7CisgIHN0ZDo6cGFpcjxfRm9yd2FyZEl0ZXJhdG9yLCBfRm9yd2FyZEl0ZXJhdG9yPiBfX3Jlc3VsdChfX2ZpcnN0LCBfX2ZpcnN0KTsKKyAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICB7CisgICAgICBpZiAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICAgIHsKKyAgICAgICAgICBpZiAoX19jb21wKCpfX2ZpcnN0LCAqX19yZXN1bHQuZmlyc3QpKQorICAgICAgICAgICAgICBfX3Jlc3VsdC5maXJzdCA9IF9fZmlyc3Q7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBfX3Jlc3VsdC5zZWNvbmQgPSBfX2ZpcnN0OworICAgICAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OworICAgICAgICAgICAgICBpZiAoKytfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKF9fY29tcCgqX19pLCAqX19yZXN1bHQuZmlyc3QpKQorICAgICAgICAgICAgICAgICAgICAgIF9fcmVzdWx0LmZpcnN0ID0gX19pOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIV9fY29tcCgqX19pLCAqX19yZXN1bHQuc2Vjb25kKSkKKyAgICAgICAgICAgICAgICAgICAgICBfX3Jlc3VsdC5zZWNvbmQgPSBfX2k7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QsICpfX2kpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QsICpfX3Jlc3VsdC5maXJzdCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmVzdWx0LmZpcnN0ID0gX19maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9fY29tcCgqX19pLCAqX19yZXN1bHQuc2Vjb25kKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19yZXN1bHQuc2Vjb25kID0gX19pOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGlmIChfX2NvbXAoKl9faSwgKl9fcmVzdWx0LmZpcnN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19yZXN1bHQuZmlyc3QgPSBfX2k7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfX2NvbXAoKl9fZmlyc3QsICpfX3Jlc3VsdC5zZWNvbmQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Jlc3VsdC5zZWNvbmQgPSBfX2ZpcnN0OworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgfQorICB9CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorc3RkOjpwYWlyPF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3I+CittaW5tYXhfZWxlbWVudChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworICAgIHJldHVybiBfVlNURDo6bWlubWF4X2VsZW1lbnQoX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICBfX2xlc3M8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPigpKTsKK30KKworLy8gbWlubWF4CisKK3RlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorcGFpcjxjb25zdCBfVHAmLCBjb25zdCBfVHAmPgorbWlubWF4KGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYiwgX0NvbXBhcmUgX19jb21wKQoreworICAgIHJldHVybiBfX2NvbXAoX19iLCBfX2EpID8gcGFpcjxjb25zdCBfVHAmLCBjb25zdCBfVHAmPihfX2IsIF9fYSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxjb25zdCBfVHAmLCBjb25zdCBfVHAmPihfX2EsIF9fYik7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitwYWlyPGNvbnN0IF9UcCYsIGNvbnN0IF9UcCY+CittaW5tYXgoY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iKQoreworICAgIHJldHVybiBfVlNURDo6bWlubWF4KF9fYSwgX19iLCBfX2xlc3M8X1RwPigpKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitwYWlyPF9UcCwgX1RwPgorbWlubWF4KGluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX3QsIF9Db21wYXJlIF9fY29tcCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGluaXRpYWxpemVyX2xpc3Q8X1RwPjo6Y29uc3RfaXRlcmF0b3IgX0l0ZXI7CisgICAgX0l0ZXIgX19maXJzdCA9IF9fdC5iZWdpbigpOworICAgIF9JdGVyIF9fbGFzdCAgPSBfX3QuZW5kKCk7CisgICAgc3RkOjpwYWlyPF9UcCwgX1RwPiBfX3Jlc3VsdCgqX19maXJzdCwgKl9fZmlyc3QpOworCisgICAgKytfX2ZpcnN0OworICAgIGlmIChfX3Quc2l6ZSgpICUgMiA9PSAwKQorICAgIHsKKyAgICAgICAgaWYgKF9fY29tcCgqX19maXJzdCwgIF9fcmVzdWx0LmZpcnN0KSkKKyAgICAgICAgICAgIF9fcmVzdWx0LmZpcnN0ICA9ICpfX2ZpcnN0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3Jlc3VsdC5zZWNvbmQgPSAqX19maXJzdDsKKyAgICAgICAgKytfX2ZpcnN0OworICAgIH0KKworICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICB7CisgICAgICAgIF9UcCBfX3ByZXYgPSAqX19maXJzdCsrOworICAgICAgICBpZiAoX19jb21wKCpfX2ZpcnN0LCBfX3ByZXYpKSB7CisgICAgICAgICAgICBpZiAoIF9fY29tcCgqX19maXJzdCwgX19yZXN1bHQuZmlyc3QpKSBfX3Jlc3VsdC5maXJzdCAgPSAqX19maXJzdDsKKyAgICAgICAgICAgIGlmICghX19jb21wKF9fcHJldiwgX19yZXN1bHQuc2Vjb25kKSkgIF9fcmVzdWx0LnNlY29uZCA9IF9fcHJldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoIF9fY29tcChfX3ByZXYsIF9fcmVzdWx0LmZpcnN0KSkgICAgX19yZXN1bHQuZmlyc3QgID0gX19wcmV2OworICAgICAgICAgICAgaWYgKCFfX2NvbXAoKl9fZmlyc3QsIF9fcmVzdWx0LnNlY29uZCkpIF9fcmVzdWx0LnNlY29uZCA9ICpfX2ZpcnN0OworICAgICAgICAgICAgfQorCisgICAgICAgIF9fZmlyc3QrKzsKKyAgICB9CisgICAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorcGFpcjxfVHAsIF9UcD4KK21pbm1heChpbml0aWFsaXplcl9saXN0PF9UcD4gX190KQoreworICAgIHJldHVybiBfVlNURDo6bWlubWF4KF9fdCwgX19sZXNzPF9UcD4oKSk7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKy8vIHJhbmRvbV9zaHVmZmxlCisKKy8vIF9faW5kZXBlbmRlbnRfYml0c19lbmdpbmUKKwordGVtcGxhdGUgPHVuc2lnbmVkIGxvbmcgbG9uZyBfWHAsIHNpemVfdCBfUnA+CitzdHJ1Y3QgX19sb2cyX2ltcAoreworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgdmFsdWUgPSBfWHAgJiAoKHVuc2lnbmVkIGxvbmcgbG9uZykoMSkgPDwgX1JwKSA/IF9ScAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19sb2cyX2ltcDxfWHAsIF9ScCAtIDE+Ojp2YWx1ZTsKK307CisKK3RlbXBsYXRlIDx1bnNpZ25lZCBsb25nIGxvbmcgX1hwPgorc3RydWN0IF9fbG9nMl9pbXA8X1hwLCAwPgoreworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgdmFsdWUgPSAwOworfTsKKwordGVtcGxhdGUgPHNpemVfdCBfUnA+CitzdHJ1Y3QgX19sb2cyX2ltcDwwLCBfUnA+Cit7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCB2YWx1ZSA9IF9ScCArIDE7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1VJbnRUeXBlLCBfVUludFR5cGUgX1hwPgorc3RydWN0IF9fbG9nMgoreworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgdmFsdWUgPSBfX2xvZzJfaW1wPF9YcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKF9VSW50VHlwZSkgKiBfX0NIQVJfQklUX18gLSAxPjo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfRW5naW5lLCBjbGFzcyBfVUludFR5cGU+CitjbGFzcyBfX2luZGVwZW5kZW50X2JpdHNfZW5naW5lCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIF9VSW50VHlwZSByZXN1bHRfdHlwZTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FbmdpbmU6OnJlc3VsdF90eXBlIF9FbmdpbmVfcmVzdWx0X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbAorICAgICAgICA8CisgICAgICAgICAgICBzaXplb2YoX0VuZ2luZV9yZXN1bHRfdHlwZSkgPD0gc2l6ZW9mKHJlc3VsdF90eXBlKSwKKyAgICAgICAgICAgICAgICByZXN1bHRfdHlwZSwKKyAgICAgICAgICAgICAgICBfRW5naW5lX3Jlc3VsdF90eXBlCisgICAgICAgID46OnR5cGUgX1dvcmtpbmdfcmVzdWx0X3R5cGU7CisKKyAgICBfRW5naW5lJiBfX2VfOworICAgIHNpemVfdCBfX3dfOworICAgIHNpemVfdCBfX3cwXzsKKyAgICBzaXplX3QgX19uXzsKKyAgICBzaXplX3QgX19uMF87CisgICAgX1dvcmtpbmdfcmVzdWx0X3R5cGUgX195MF87CisgICAgX1dvcmtpbmdfcmVzdWx0X3R5cGUgX195MV87CisgICAgX0VuZ2luZV9yZXN1bHRfdHlwZSBfX21hc2swXzsKKyAgICBfRW5naW5lX3Jlc3VsdF90eXBlIF9fbWFzazFfOworCisjaWZkZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgc3RhdGljIGNvbnN0IF9Xb3JraW5nX3Jlc3VsdF90eXBlIF9ScCA9IF9FbmdpbmU6Ol9NYXggLSBfRW5naW5lOjpfTWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9Xb3JraW5nX3Jlc3VsdF90eXBlKDEpOworI2Vsc2UKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgX1dvcmtpbmdfcmVzdWx0X3R5cGUgX1JwID0gX0VuZ2luZTo6bWF4KCkgLSBfRW5naW5lOjptaW4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfV29ya2luZ19yZXN1bHRfdHlwZSgxKTsKKyNlbmRpZgorICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBzaXplX3QgX19tID0gX19sb2cyPF9Xb3JraW5nX3Jlc3VsdF90eXBlLCBfUnA+Ojp2YWx1ZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90IF9XRHQgPSBudW1lcmljX2xpbWl0czxfV29ya2luZ19yZXN1bHRfdHlwZT46OmRpZ2l0czsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90IF9FRHQgPSBudW1lcmljX2xpbWl0czxfRW5naW5lX3Jlc3VsdF90eXBlPjo6ZGlnaXRzOworCitwdWJsaWM6CisgICAgLy8gY29uc3RydWN0b3JzIGFuZCBzZWVkaW5nIGZ1bmN0aW9ucworICAgIF9faW5kZXBlbmRlbnRfYml0c19lbmdpbmUoX0VuZ2luZSYgX19lLCBzaXplX3QgX193KTsKKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSgpIHtyZXR1cm4gX19ldmFsKGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9ScCAhPSAwPigpKTt9CisKK3ByaXZhdGU6CisgICAgcmVzdWx0X3R5cGUgX19ldmFsKGZhbHNlX3R5cGUpOworICAgIHJlc3VsdF90eXBlIF9fZXZhbCh0cnVlX3R5cGUpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX0VuZ2luZSwgY2xhc3MgX1VJbnRUeXBlPgorX19pbmRlcGVuZGVudF9iaXRzX2VuZ2luZTxfRW5naW5lLCBfVUludFR5cGU+CisgICAgOjpfX2luZGVwZW5kZW50X2JpdHNfZW5naW5lKF9FbmdpbmUmIF9fZSwgc2l6ZV90IF9fdykKKyAgICAgICAgOiBfX2VfKF9fZSksCisgICAgICAgICAgX193XyhfX3cpCit7CisgICAgX19uXyA9IF9fd18gLyBfX20gKyAoX193XyAlIF9fbSAhPSAwKTsKKyAgICBfX3cwXyA9IF9fd18gLyBfX25fOworICAgIGlmIChfUnAgPT0gMCkKKyAgICAgICAgX195MF8gPSBfUnA7CisgICAgZWxzZSBpZiAoX193MF8gPCBfV0R0KQorICAgICAgICBfX3kwXyA9IChfUnAgPj4gX193MF8pIDw8IF9fdzBfOworICAgIGVsc2UKKyAgICAgICAgX195MF8gPSAwOworICAgIGlmIChfUnAgLSBfX3kwXyA+IF9feTBfIC8gX19uXykKKyAgICB7CisgICAgICAgICsrX19uXzsKKyAgICAgICAgX193MF8gPSBfX3dfIC8gX19uXzsKKyAgICAgICAgaWYgKF9fdzBfIDwgX1dEdCkKKyAgICAgICAgICAgIF9feTBfID0gKF9ScCA+PiBfX3cwXykgPDwgX193MF87CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9feTBfID0gMDsKKyAgICB9CisgICAgX19uMF8gPSBfX25fIC0gX193XyAlIF9fbl87CisgICAgaWYgKF9fdzBfIDwgX1dEdCAtIDEpCisgICAgICAgIF9feTFfID0gKF9ScCA+PiAoX193MF8gKyAxKSkgPDwgKF9fdzBfICsgMSk7CisgICAgZWxzZQorICAgICAgICBfX3kxXyA9IDA7CisgICAgX19tYXNrMF8gPSBfX3cwXyA+IDAgPyBfRW5naW5lX3Jlc3VsdF90eXBlKH4wKSA+PiAoX0VEdCAtIF9fdzBfKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIF9FbmdpbmVfcmVzdWx0X3R5cGUoMCk7CisgICAgX19tYXNrMV8gPSBfX3cwXyA8IF9FRHQgLSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRW5naW5lX3Jlc3VsdF90eXBlKH4wKSA+PiAoX0VEdCAtIChfX3cwXyArIDEpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0VuZ2luZV9yZXN1bHRfdHlwZSh+MCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9FbmdpbmUsIGNsYXNzIF9VSW50VHlwZT4KK2lubGluZQorX1VJbnRUeXBlCitfX2luZGVwZW5kZW50X2JpdHNfZW5naW5lPF9FbmdpbmUsIF9VSW50VHlwZT46Ol9fZXZhbChmYWxzZV90eXBlKQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxyZXN1bHRfdHlwZT4oX19lXygpICYgX19tYXNrMF8pOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRW5naW5lLCBjbGFzcyBfVUludFR5cGU+CitfVUludFR5cGUKK19faW5kZXBlbmRlbnRfYml0c19lbmdpbmU8X0VuZ2luZSwgX1VJbnRUeXBlPjo6X19ldmFsKHRydWVfdHlwZSkKK3sKKyAgICBjb25zdCBzaXplX3QgX1dSdCA9IG51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6ZGlnaXRzOworICAgIHJlc3VsdF90eXBlIF9TcCA9IDA7CisgICAgZm9yIChzaXplX3QgX19rID0gMDsgX19rIDwgX19uMF87ICsrX19rKQorICAgIHsKKyAgICAgICAgX0VuZ2luZV9yZXN1bHRfdHlwZSBfX3U7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fdSA9IF9fZV8oKSAtIF9FbmdpbmU6Om1pbigpOworICAgICAgICB9IHdoaWxlIChfX3UgPj0gX195MF8pOworICAgICAgICBpZiAoX193MF8gPCBfV1J0KQorICAgICAgICAgICAgX1NwIDw8PSBfX3cwXzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX1NwID0gMDsKKyAgICAgICAgX1NwICs9IF9fdSAmIF9fbWFzazBfOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBfX2sgPSBfX24wXzsgX19rIDwgX19uXzsgKytfX2spCisgICAgeworICAgICAgICBfRW5naW5lX3Jlc3VsdF90eXBlIF9fdTsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgX191ID0gX19lXygpIC0gX0VuZ2luZTo6bWluKCk7CisgICAgICAgIH0gd2hpbGUgKF9fdSA+PSBfX3kxXyk7CisgICAgICAgIGlmIChfX3cwXyA8IF9XUnQgLSAxKQorICAgICAgICAgICAgX1NwIDw8PSBfX3cwXyArIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9TcCA9IDA7CisgICAgICAgIF9TcCArPSBfX3UgJiBfX21hc2sxXzsKKyAgICB9CisgICAgcmV0dXJuIF9TcDsKK30KKworLy8gdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uCisKK3RlbXBsYXRlPGNsYXNzIF9JbnRUeXBlID0gaW50PgorY2xhc3MgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIF9JbnRUeXBlIHJlc3VsdF90eXBlOworCisgICAgY2xhc3MgcGFyYW1fdHlwZQorICAgIHsKKyAgICAgICAgcmVzdWx0X3R5cGUgX19hXzsKKyAgICAgICAgcmVzdWx0X3R5cGUgX19iXzsKKyAgICBwdWJsaWM6CisgICAgICAgIHR5cGVkZWYgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uIGRpc3RyaWJ1dGlvbl90eXBlOworCisgICAgICAgIGV4cGxpY2l0IHBhcmFtX3R5cGUocmVzdWx0X3R5cGUgX19hID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZSBfX2IgPSBudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpKQorICAgICAgICAgICAgOiBfX2FfKF9fYSksIF9fYl8oX19iKSB7fQorCisgICAgICAgIHJlc3VsdF90eXBlIGEoKSBjb25zdCB7cmV0dXJuIF9fYV87fQorICAgICAgICByZXN1bHRfdHlwZSBiKCkgY29uc3Qge3JldHVybiBfX2JfO30KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9feCwgY29uc3QgcGFyYW1fdHlwZSYgX195KQorICAgICAgICAgICAge3JldHVybiBfX3guX19hXyA9PSBfX3kuX19hXyAmJiBfX3guX19iXyA9PSBfX3kuX19iXzt9CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgcGFyYW1fdHlwZSYgX194LCBjb25zdCBwYXJhbV90eXBlJiBfX3kpCisgICAgICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorICAgIH07CisKK3ByaXZhdGU6CisgICAgcGFyYW1fdHlwZSBfX3BfOworCitwdWJsaWM6CisgICAgLy8gY29uc3RydWN0b3JzIGFuZCByZXNldCBmdW5jdGlvbnMKKyAgICBleHBsaWNpdCB1bmlmb3JtX2ludF9kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgX19hID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X3R5cGUgX19iID0gbnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKSkKKyAgICAgICAgOiBfX3BfKHBhcmFtX3R5cGUoX19hLCBfX2IpKSB7fQorICAgIGV4cGxpY2l0IHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApIDogX19wXyhfX3ApIHt9CisgICAgdm9pZCByZXNldCgpIHt9CisKKyAgICAvLyBnZW5lcmF0aW5nIGZ1bmN0aW9ucworICAgIHRlbXBsYXRlPGNsYXNzIF9VUk5HPiByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9VUk5HJiBfX2cpCisgICAgICAgIHtyZXR1cm4gKCp0aGlzKShfX2csIF9fcF8pO30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfVVJORyYgX19nLCBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgcmVzdWx0X3R5cGUgYSgpIGNvbnN0IHtyZXR1cm4gX19wXy5hKCk7fQorICAgIHJlc3VsdF90eXBlIGIoKSBjb25zdCB7cmV0dXJuIF9fcF8uYigpO30KKworICAgIHBhcmFtX3R5cGUgcGFyYW0oKSBjb25zdCB7cmV0dXJuIF9fcF87fQorICAgIHZvaWQgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wKSB7X19wXyA9IF9fcDt9CisKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdCB7cmV0dXJuIGEoKTt9CisgICAgcmVzdWx0X3R5cGUgbWF4KCkgY29uc3Qge3JldHVybiBiKCk7fQorCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCB1bmlmb3JtX2ludF9kaXN0cmlidXRpb24mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuIF9feC5fX3BfID09IF9feS5fX3BfO30KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uJiBfX3kpCisgICAgICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorfTsKKwordGVtcGxhdGU8Y2xhc3MgX0ludFR5cGU+Cit0ZW1wbGF0ZTxjbGFzcyBfVVJORz4KK3R5cGVuYW1lIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnJlc3VsdF90eXBlCit1bmlmb3JtX2ludF9kaXN0cmlidXRpb248X0ludFR5cGU+OjpvcGVyYXRvcigpKF9VUk5HJiBfX2csIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPHNpemVvZihyZXN1bHRfdHlwZSkgPD0gc2l6ZW9mKHVpbnQzMl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIHVpbnQ2NF90Pjo6dHlwZSBfVUludFR5cGU7CisgICAgY29uc3QgX1VJbnRUeXBlIF9ScCA9IF9fcC5iKCkgLSBfX3AuYSgpICsgX1VJbnRUeXBlKDEpOworICAgIGlmIChfUnAgPT0gMSkKKyAgICAgICAgcmV0dXJuIF9fcC5hKCk7CisgICAgY29uc3Qgc2l6ZV90IF9EdCA9IG51bWVyaWNfbGltaXRzPF9VSW50VHlwZT46OmRpZ2l0czsKKyAgICB0eXBlZGVmIF9faW5kZXBlbmRlbnRfYml0c19lbmdpbmU8X1VSTkcsIF9VSW50VHlwZT4gX0VuZzsKKyAgICBpZiAoX1JwID09IDApCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxyZXN1bHRfdHlwZT4oX0VuZyhfX2csIF9EdCkoKSk7CisgICAgc2l6ZV90IF9fdyA9IF9EdCAtIF9fY2x6KF9ScCkgLSAxOworICAgIGlmICgoX1JwICYgKHN0ZDo6bnVtZXJpY19saW1pdHM8X1VJbnRUeXBlPjo6bWF4KCkgPj4gKF9EdCAtIF9fdykpKSAhPSAwKQorICAgICAgICArK19fdzsKKyAgICBfRW5nIF9fZShfX2csIF9fdyk7CisgICAgX1VJbnRUeXBlIF9fdTsKKyAgICBkbworICAgIHsKKyAgICAgICAgX191ID0gX19lKCk7CisgICAgfSB3aGlsZSAoX191ID49IF9ScCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHJlc3VsdF90eXBlPihfX3UgKyBfX3AuYSgpKTsKK30KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA8PSAxNCB8fCBkZWZpbmVkKF9MSUJDUFBfRU5BQkxFX0NYWDE3X1JFTU9WRURfUkFORE9NX1NIVUZGTEUpIFwKKyAgfHwgZGVmaW5lZChfTElCQ1BQX0JVSUxESU5HX0xJQlJBUlkpCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIF9fcnNfZGVmYXVsdDsKKworX0xJQkNQUF9GVU5DX1ZJUyBfX3JzX2RlZmF1bHQgX19yc19nZXQoKTsKKworY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBfX3JzX2RlZmF1bHQKK3sKKyAgICBzdGF0aWMgdW5zaWduZWQgX19jXzsKKworICAgIF9fcnNfZGVmYXVsdCgpOworcHVibGljOgorICAgIHR5cGVkZWYgdWludF9mYXN0MzJfdCByZXN1bHRfdHlwZTsKKworICAgIHN0YXRpYyBjb25zdCByZXN1bHRfdHlwZSBfTWluID0gMDsKKyAgICBzdGF0aWMgY29uc3QgcmVzdWx0X3R5cGUgX01heCA9IDB4RkZGRkZGRkY7CisKKyAgICBfX3JzX2RlZmF1bHQoY29uc3QgX19yc19kZWZhdWx0Jik7CisgICAgfl9fcnNfZGVmYXVsdCgpOworCisgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSgpOworCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHJlc3VsdF90eXBlIG1pbigpIHtyZXR1cm4gX01pbjt9CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHJlc3VsdF90eXBlIG1heCgpIHtyZXR1cm4gX01heDt9CisKKyAgICBmcmllbmQgX0xJQkNQUF9GVU5DX1ZJUyBfX3JzX2RlZmF1bHQgX19yc19nZXQoKTsKK307CisKK19MSUJDUFBfRlVOQ19WSVMgX19yc19kZWZhdWx0IF9fcnNfZ2V0KCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Cit2b2lkCityYW5kb21fc2h1ZmZsZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPHB0cmRpZmZfdD4gX0RwOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RwOjpwYXJhbV90eXBlIF9QcDsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19kID0gX19sYXN0IC0gX19maXJzdDsKKyAgICBpZiAoX19kID4gMSkKKyAgICB7CisgICAgICAgIF9EcCBfX3VpZDsKKyAgICAgICAgX19yc19kZWZhdWx0IF9fZyA9IF9fcnNfZ2V0KCk7CisgICAgICAgIGZvciAoLS1fX2xhc3QsIC0tX19kOyBfX2ZpcnN0IDwgX19sYXN0OyArK19fZmlyc3QsIC0tX19kKQorICAgICAgICB7CisgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19pID0gX191aWQoX19nLCBfUHAoMCwgX19kKSk7CisgICAgICAgICAgICBpZiAoX19pICE9IGRpZmZlcmVuY2VfdHlwZSgwKSkKKyAgICAgICAgICAgICAgICBzd2FwKCpfX2ZpcnN0LCAqKF9fZmlyc3QgKyBfX2kpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KK3ZvaWQKK3JhbmRvbV9zaHVmZmxlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICAgICAgICAgICAgIF9SYW5kb21OdW1iZXJHZW5lcmF0b3ImJiBfX3JhbmQpCisjZWxzZQorICAgICAgICAgICAgICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19yYW5kKQorI2VuZGlmCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19kID0gX19sYXN0IC0gX19maXJzdDsKKyAgICBpZiAoX19kID4gMSkKKyAgICB7CisgICAgICAgIGZvciAoLS1fX2xhc3Q7IF9fZmlyc3QgPCBfX2xhc3Q7ICsrX19maXJzdCwgLS1fX2QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2kgPSBfX3JhbmQoX19kKTsKKyAgICAgICAgICAgIHN3YXAoKl9fZmlyc3QsICooX19maXJzdCArIF9faSkpOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfUG9wdWxhdGlvbkl0ZXJhdG9yLCBjbGFzcyBfU2FtcGxlSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZSwKKyAgICAgICAgICBjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19TYW1wbGVJdGVyYXRvciBfX3NhbXBsZShfUG9wdWxhdGlvbkl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgX1BvcHVsYXRpb25JdGVyYXRvciBfX2xhc3QsIF9TYW1wbGVJdGVyYXRvciBfX291dHB1dF9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IgJiBfX2csCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfaXRlcmF0b3JfdGFnKSB7CisKKyAgX0Rpc3RhbmNlIF9fayA9IDA7CisgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX2sgPCBfX247ICsrX19maXJzdCwgKHZvaWQpKytfX2spCisgICAgX19vdXRwdXRfaXRlcltfX2tdID0gKl9fZmlyc3Q7CisgIF9EaXN0YW5jZSBfX3N6ID0gX19rOworICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKHZvaWQpKytfX2spIHsKKyAgICBfRGlzdGFuY2UgX19yID0gX1ZTVEQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxfRGlzdGFuY2U+KDAsIF9faykoX19nKTsKKyAgICBpZiAoX19yIDwgX19zeikKKyAgICAgIF9fb3V0cHV0X2l0ZXJbX19yXSA9ICpfX2ZpcnN0OworICB9CisgIHJldHVybiBfX291dHB1dF9pdGVyICsgX1ZTVEQ6Om1pbihfX24sIF9fayk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUG9wdWxhdGlvbkl0ZXJhdG9yLCBjbGFzcyBfU2FtcGxlSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZSwKKyAgICAgICAgICBjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19TYW1wbGVJdGVyYXRvciBfX3NhbXBsZShfUG9wdWxhdGlvbkl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgX1BvcHVsYXRpb25JdGVyYXRvciBfX2xhc3QsIF9TYW1wbGVJdGVyYXRvciBfX291dHB1dF9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZykgeworICBfRGlzdGFuY2UgX191bnNhbXBsZWRfc3ogPSBfVlNURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgZm9yIChfX24gPSBfVlNURDo6bWluKF9fbiwgX191bnNhbXBsZWRfc3opOyBfX24gIT0gMDsgKytfX2ZpcnN0KSB7CisgICAgX0Rpc3RhbmNlIF9fciA9CisgICAgICAgIF9WU1REOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248X0Rpc3RhbmNlPigwLCAtLV9fdW5zYW1wbGVkX3N6KShfX2cpOworICAgIGlmIChfX3IgPCBfX24pIHsKKyAgICAgICpfX291dHB1dF9pdGVyKysgPSAqX19maXJzdDsKKyAgICAgIC0tX19uOworICAgIH0KKyAgfQorICByZXR1cm4gX19vdXRwdXRfaXRlcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Qb3B1bGF0aW9uSXRlcmF0b3IsIGNsYXNzIF9TYW1wbGVJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlLAorICAgICAgICAgIGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1NhbXBsZUl0ZXJhdG9yIF9fc2FtcGxlKF9Qb3B1bGF0aW9uSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfUG9wdWxhdGlvbkl0ZXJhdG9yIF9fbGFzdCwgX1NhbXBsZUl0ZXJhdG9yIF9fb3V0cHV0X2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fbiwgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fZykgeworICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUG9wdWxhdGlvbkl0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICAgICAgX1BvcENhdGVnb3J5OworICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUG9wdWxhdGlvbkl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgICAgIF9EaWZmZXJlbmNlOworICBzdGF0aWNfYXNzZXJ0KF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfUG9wdWxhdGlvbkl0ZXJhdG9yPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICBfX2lzX3JhbmRvbV9hY2Nlc3NfaXRlcmF0b3I8X1NhbXBsZUl0ZXJhdG9yPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIlNhbXBsZUl0ZXJhdG9yIG11c3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIG9mIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIik7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X0Rpc3RhbmNlLCBfRGlmZmVyZW5jZT46OnR5cGUgX0NvbW1vblR5cGU7CisgIF9MSUJDUFBfQVNTRVJUKF9fbiA+PSAwLCAiTiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLiIpOworICByZXR1cm4gX1ZTVEQ6Ol9fc2FtcGxlKAorICAgICAgX19maXJzdCwgX19sYXN0LCBfX291dHB1dF9pdGVyLCBfQ29tbW9uVHlwZShfX24pLAorICAgICAgX19nLCBfUG9wQ2F0ZWdvcnkoKSk7Cit9CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAordGVtcGxhdGUgPGNsYXNzIF9Qb3B1bGF0aW9uSXRlcmF0b3IsIGNsYXNzIF9TYW1wbGVJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlLAorICAgICAgICAgIGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19TYW1wbGVJdGVyYXRvciBzYW1wbGUoX1BvcHVsYXRpb25JdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICBfUG9wdWxhdGlvbkl0ZXJhdG9yIF9fbGFzdCwgX1NhbXBsZUl0ZXJhdG9yIF9fb3V0cHV0X2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX24sIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiYgX19nKSB7CisgICAgcmV0dXJuIF9WU1REOjpfX3NhbXBsZShfX2ZpcnN0LCBfX2xhc3QsIF9fb3V0cHV0X2l0ZXIsIF9fbiwgX19nKTsKK30KKyNlbmRpZiAvLyBfTElCQ1BQX1NURF9WRVIgPiAxNAorCit0ZW1wbGF0ZTxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgIHZvaWQgc2h1ZmZsZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgICAgICAgICAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiYgX19nKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fZykKKyNlbmRpZgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248cHRyZGlmZl90PiBfRHA7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRHA6OnBhcmFtX3R5cGUgX1BwOworICAgIGRpZmZlcmVuY2VfdHlwZSBfX2QgPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgIGlmIChfX2QgPiAxKQorICAgIHsKKyAgICAgICAgX0RwIF9fdWlkOworICAgICAgICBmb3IgKC0tX19sYXN0LCAtLV9fZDsgX19maXJzdCA8IF9fbGFzdDsgKytfX2ZpcnN0LCAtLV9fZCkKKyAgICAgICAgeworICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9faSA9IF9fdWlkKF9fZywgX1BwKDAsIF9fZCkpOworICAgICAgICAgICAgaWYgKF9faSAhPSBkaWZmZXJlbmNlX3R5cGUoMCkpCisgICAgICAgICAgICAgICAgc3dhcCgqX19maXJzdCwgKihfX2ZpcnN0ICsgX19pKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX1ByZWRpY2F0ZT4KK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3IGJvb2wKK2lzX3BhcnRpdGlvbmVkKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQpCit7CisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgIGlmICghX19wcmVkKCpfX2ZpcnN0KSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmICggX19maXJzdCA9PSBfX2xhc3QgKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICArK19fZmlyc3Q7CisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBwYXJ0aXRpb24KKwordGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGUsIGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitfX3BhcnRpdGlvbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCwgZm9yd2FyZF9pdGVyYXRvcl90YWcpCit7CisgICAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgICAgICAgICByZXR1cm4gX19maXJzdDsKKyAgICAgICAgaWYgKCFfX3ByZWQoKl9fZmlyc3QpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICsrX19maXJzdDsKKyAgICB9CisgICAgZm9yIChfRm9yd2FyZEl0ZXJhdG9yIF9fcCA9IF9fZmlyc3Q7ICsrX19wICE9IF9fbGFzdDspCisgICAgeworICAgICAgICBpZiAoX19wcmVkKCpfX3ApKQorICAgICAgICB7CisgICAgICAgICAgICBzd2FwKCpfX2ZpcnN0LCAqX19wKTsKKyAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19maXJzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGUsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+CitfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yCitfX3BhcnRpdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKQoreworICAgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gX19maXJzdDsKKyAgICAgICAgICAgIGlmICghX19wcmVkKCpfX2ZpcnN0KSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgfQorICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBpZiAoX19maXJzdCA9PSAtLV9fbGFzdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gX19maXJzdDsKKyAgICAgICAgfSB3aGlsZSAoIV9fcHJlZCgqX19sYXN0KSk7CisgICAgICAgIHN3YXAoKl9fZmlyc3QsICpfX2xhc3QpOworICAgICAgICArK19fZmlyc3Q7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX1ByZWRpY2F0ZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfRm9yd2FyZEl0ZXJhdG9yCitwYXJ0aXRpb24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQpCit7CisgICAgcmV0dXJuIF9WU1REOjpfX3BhcnRpdGlvbjx0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfUHJlZGljYXRlPjo6dHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19maXJzdCwgX19sYXN0LCBfX3ByZWQsIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnkoKSk7Cit9CisKKy8vIHBhcnRpdGlvbl9jb3B5CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yMSwKKyAgICAgICAgICBjbGFzcyBfT3V0cHV0SXRlcmF0b3IyLCBjbGFzcyBfUHJlZGljYXRlPgorX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcgcGFpcjxfT3V0cHV0SXRlcmF0b3IxLCBfT3V0cHV0SXRlcmF0b3IyPgorcGFydGl0aW9uX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yMSBfX291dF90cnVlLCBfT3V0cHV0SXRlcmF0b3IyIF9fb3V0X2ZhbHNlLAorICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQpCit7CisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgeworICAgICAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgKl9fb3V0X3RydWUgPSAqX19maXJzdDsKKyAgICAgICAgICAgICsrX19vdXRfdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpfX291dF9mYWxzZSA9ICpfX2ZpcnN0OworICAgICAgICAgICAgKytfX291dF9mYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcGFpcjxfT3V0cHV0SXRlcmF0b3IxLCBfT3V0cHV0SXRlcmF0b3IyPihfX291dF90cnVlLCBfX291dF9mYWxzZSk7Cit9CisKKy8vIHBhcnRpdGlvbl9wb2ludAorCit0ZW1wbGF0ZTxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfUHJlZGljYXRlPgorX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcgX0ZvcndhcmRJdGVyYXRvcgorcGFydGl0aW9uX3BvaW50KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIF9QcmVkaWNhdGUgX19wcmVkKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIGRpZmZlcmVuY2VfdHlwZSBfX2xlbiA9IF9WU1REOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgIHdoaWxlIChfX2xlbiAhPSAwKQorICAgIHsKKyAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fbDIgPSBfX2xlbiAvIDI7CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19tID0gX19maXJzdDsKKyAgICAgICAgX1ZTVEQ6OmFkdmFuY2UoX19tLCBfX2wyKTsKKyAgICAgICAgaWYgKF9fcHJlZCgqX19tKSkKKyAgICAgICAgeworICAgICAgICAgICAgX19maXJzdCA9ICsrX19tOworICAgICAgICAgICAgX19sZW4gLT0gX19sMiArIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX19sZW4gPSBfX2wyOworICAgIH0KKyAgICByZXR1cm4gX19maXJzdDsKK30KKworLy8gc3RhYmxlX3BhcnRpdGlvbgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZSwgY2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfUGFpcj4KK19Gb3J3YXJkSXRlcmF0b3IKK19fc3RhYmxlX3BhcnRpdGlvbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UgX19sZW4sIF9QYWlyIF9fcCwgZm9yd2FyZF9pdGVyYXRvcl90YWcgX19maXQpCit7CisgICAgLy8gKl9fZmlyc3QgaXMga25vd24gdG8gYmUgZmFsc2UKKyAgICAvLyBfX2xlbiA+PSAxCisgICAgaWYgKF9fbGVuID09IDEpCisgICAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIGlmIChfX2xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX20gPSBfX2ZpcnN0OworICAgICAgICBpZiAoX19wcmVkKCorK19fbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3YXAoKl9fZmlyc3QsICpfX20pOworICAgICAgICAgICAgcmV0dXJuIF9fbTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisgICAgaWYgKF9fbGVuIDw9IF9fcC5zZWNvbmQpCisgICAgeyAgIC8vIFRoZSBidWZmZXIgaXMgYmlnIGVub3VnaCB0byB1c2UKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgICAgX19kZXN0cnVjdF9uIF9fZCgwKTsKKyAgICAgICAgdW5pcXVlX3B0cjx2YWx1ZV90eXBlLCBfX2Rlc3RydWN0X24mPiBfX2goX19wLmZpcnN0LCBfX2QpOworICAgICAgICAvLyBNb3ZlIHRoZSBmYWxzZXMgaW50byB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciwgYW5kIHRoZSB0cnVlcyB0byB0aGUgZnJvbnQgb2YgdGhlIGxpbmUKKyAgICAgICAgLy8gVXBkYXRlIF9fZmlyc3QgdG8gYWx3YXlzIHBvaW50IHRvIHRoZSBlbmQgb2YgdGhlIHRydWVzCisgICAgICAgIHZhbHVlX3R5cGUqIF9fdCA9IF9fcC5maXJzdDsKKyAgICAgICAgOjpuZXcoX190KSB2YWx1ZV90eXBlKF9WU1REOjptb3ZlKCpfX2ZpcnN0KSk7CisgICAgICAgIF9fZC5fX2luY3IoKHZhbHVlX3R5cGUqKTApOworICAgICAgICArK19fdDsKKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OworICAgICAgICB3aGlsZSAoKytfX2kgIT0gX19sYXN0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX19wcmVkKCpfX2kpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpfX2ZpcnN0ID0gX1ZTVEQ6Om1vdmUoKl9faSk7CisgICAgICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDo6bmV3KF9fdCkgdmFsdWVfdHlwZShfVlNURDo6bW92ZSgqX19pKSk7CisgICAgICAgICAgICAgICAgX19kLl9faW5jcigodmFsdWVfdHlwZSopMCk7CisgICAgICAgICAgICAgICAgKytfX3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQWxsIHRydWVzIG5vdyBhdCBzdGFydCBvZiByYW5nZSwgYWxsIGZhbHNlcyBpbiBidWZmZXIKKyAgICAgICAgLy8gTW92ZSBmYWxzZXMgYmFjayBpbnRvIHJhbmdlLCBidXQgZG9uJ3QgbWVzcyB1cCBfX2ZpcnN0IHdoaWNoIHBvaW50cyB0byBmaXJzdCBmYWxzZQorICAgICAgICBfX2kgPSBfX2ZpcnN0OworICAgICAgICBmb3IgKHZhbHVlX3R5cGUqIF9fdDIgPSBfX3AuZmlyc3Q7IF9fdDIgPCBfX3Q7ICsrX190MiwgKytfX2kpCisgICAgICAgICAgICAqX19pID0gX1ZTVEQ6Om1vdmUoKl9fdDIpOworICAgICAgICAvLyBfX2ggZGVzdHJ1Y3RzIG1vdmVkLWZyb20gdmFsdWVzIG91dCBvZiB0aGUgdGVtcCBidWZmZXIsIGJ1dCBkb2Vzbid0IGRlYWxsb2NhdGUgYnVmZmVyCisgICAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKyAgICAvLyBFbHNlIG5vdCBlbm91Z2ggYnVmZmVyLCBkbyBpbiBwbGFjZQorICAgIC8vIF9fbGVuID49IDMKKyAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbSA9IF9fZmlyc3Q7CisgICAgX0Rpc3RhbmNlIF9fbGVuMiA9IF9fbGVuIC8gMjsgIC8vIF9fbGVuMiA+PSAyCisgICAgX1ZTVEQ6OmFkdmFuY2UoX19tLCBfX2xlbjIpOworICAgIC8vIHJlY3Vyc2Ugb24gW19fZmlyc3QsIF9fbSksICpfX2ZpcnN0IGtub3cgdG8gYmUgZmFsc2UKKyAgICAvLyBGPz8/Pz8/Pz8/Pz8/Pz8/Pz8KKyAgICAvLyBmICAgICAgIG0gICAgICAgICBsCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfUHJlZGljYXRlPjo6dHlwZSBfUHJlZFJlZjsKKyAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3RfZmFsc2UgPSBfX3N0YWJsZV9wYXJ0aXRpb248X1ByZWRSZWY+KF9fZmlyc3QsIF9fbSwgX19wcmVkLCBfX2xlbjIsIF9fcCwgX19maXQpOworICAgIC8vIFRUVEZGRkZGPz8/Pz8/Pz8/PworICAgIC8vIGYgIGZmICAgbSAgICAgICAgIGwKKyAgICAvLyByZWN1cnNlIG9uIFtfX20sIF9fbGFzdF0sIGV4Y2VwdCBpbmNyZWFzZSBfX20gdW50aWwgKihfX20pIGlzIGZhbHNlLCAqX19sYXN0IGtub3cgdG8gYmUgdHJ1ZQorICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19tMSA9IF9fbTsKKyAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fc2Vjb25kX2ZhbHNlID0gX19sYXN0OworICAgIF9EaXN0YW5jZSBfX2xlbl9oYWxmID0gX19sZW4gLSBfX2xlbjI7CisgICAgd2hpbGUgKF9fcHJlZCgqX19tMSkpCisgICAgeworICAgICAgICBpZiAoKytfX20xID09IF9fbGFzdCkKKyAgICAgICAgICAgIGdvdG8gX19zZWNvbmRfaGFsZl9kb25lOworICAgICAgICAtLV9fbGVuX2hhbGY7CisgICAgfQorICAgIC8vIFRUVEZGRkZGVFRURj8/Pz8/PworICAgIC8vIGYgIGZmICAgbSAgbTEgICAgIGwKKyAgICBfX3NlY29uZF9mYWxzZSA9IF9fc3RhYmxlX3BhcnRpdGlvbjxfUHJlZFJlZj4oX19tMSwgX19sYXN0LCBfX3ByZWQsIF9fbGVuX2hhbGYsIF9fcCwgX19maXQpOworX19zZWNvbmRfaGFsZl9kb25lOgorICAgIC8vIFRUVEZGRkZGVFRUVFRGRkZGRgorICAgIC8vIGYgIGZmICAgbSAgICBzZiAgIGwKKyAgICByZXR1cm4gX1ZTVEQ6OnJvdGF0ZShfX2ZpcnN0X2ZhbHNlLCBfX20sIF9fc2Vjb25kX2ZhbHNlKTsKKyAgICAvLyBUVFRUVFRUVEZGRkZGRkZGRkYKKyAgICAvLyAgICAgICAgIHwKK30KKworc3RydWN0IF9fcmV0dXJuX3RlbXBvcmFyeV9idWZmZXIKK3sKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCBvcGVyYXRvcigpKF9UcCogX19wKSBjb25zdCB7X1ZTVEQ6OnJldHVybl90ZW1wb3JhcnlfYnVmZmVyKF9fcCk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGUsIGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitfX3N0YWJsZV9wYXJ0aXRpb24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpCit7CisgICAgY29uc3QgdW5zaWduZWQgX19hbGxvY19saW1pdCA9IDM7ICAvLyBtaWdodCB3YW50IHRvIG1ha2UgdGhpcyBhIGZ1bmN0aW9uIG9mIHRyaXZpYWwgYXNzaWdubWVudAorICAgIC8vIEVpdGhlciBwcm92ZSBhbGwgdHJ1ZSBhbmQgcmV0dXJuIF9fZmlyc3Qgb3IgcG9pbnQgdG8gZmlyc3QgZmFsc2UKKyAgICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgICAgICAgIHJldHVybiBfX2ZpcnN0OworICAgICAgICBpZiAoIV9fcHJlZCgqX19maXJzdCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKytfX2ZpcnN0OworICAgIH0KKyAgICAvLyBXZSBub3cgaGF2ZSBhIHJlZHVjZWQgcmFuZ2UgW19fZmlyc3QsIF9fbGFzdCkKKyAgICAvLyAqX19maXJzdCBpcyBrbm93biB0byBiZSBmYWxzZQorICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbGVuID0gX1ZTVEQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgcGFpcjx2YWx1ZV90eXBlKiwgcHRyZGlmZl90PiBfX3AoMCwgMCk7CisgICAgdW5pcXVlX3B0cjx2YWx1ZV90eXBlLCBfX3JldHVybl90ZW1wb3JhcnlfYnVmZmVyPiBfX2g7CisgICAgaWYgKF9fbGVuID49IF9fYWxsb2NfbGltaXQpCisgICAgeworICAgICAgICBfX3AgPSBfVlNURDo6Z2V0X3RlbXBvcmFyeV9idWZmZXI8dmFsdWVfdHlwZT4oX19sZW4pOworICAgICAgICBfX2gucmVzZXQoX19wLmZpcnN0KTsKKyAgICB9CisgICAgcmV0dXJuIF9fc3RhYmxlX3BhcnRpdGlvbjx0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfUHJlZGljYXRlPjo6dHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLCBfX2xlbiwgX19wLCBmb3J3YXJkX2l0ZXJhdG9yX3RhZygpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGUsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX1BhaXI+CitfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yCitfX3N0YWJsZV9wYXJ0aXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fbGVuLCBfUGFpciBfX3AsIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIF9fYml0KQoreworICAgIC8vICpfX2ZpcnN0IGlzIGtub3duIHRvIGJlIGZhbHNlCisgICAgLy8gKl9fbGFzdCBpcyBrbm93biB0byBiZSB0cnVlCisgICAgLy8gX19sZW4gPj0gMgorICAgIGlmIChfX2xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgc3dhcCgqX19maXJzdCwgKl9fbGFzdCk7CisgICAgICAgIHJldHVybiBfX2xhc3Q7CisgICAgfQorICAgIGlmIChfX2xlbiA9PSAzKQorICAgIHsKKyAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX20gPSBfX2ZpcnN0OworICAgICAgICBpZiAoX19wcmVkKCorK19fbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3YXAoKl9fZmlyc3QsICpfX20pOworICAgICAgICAgICAgc3dhcCgqX19tLCAqX19sYXN0KTsKKyAgICAgICAgICAgIHJldHVybiBfX2xhc3Q7CisgICAgICAgIH0KKyAgICAgICAgc3dhcCgqX19tLCAqX19sYXN0KTsKKyAgICAgICAgc3dhcCgqX19maXJzdCwgKl9fbSk7CisgICAgICAgIHJldHVybiBfX207CisgICAgfQorICAgIGlmIChfX2xlbiA8PSBfX3Auc2Vjb25kKQorICAgIHsgICAvLyBUaGUgYnVmZmVyIGlzIGJpZyBlbm91Z2ggdG8gdXNlCisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICAgIF9fZGVzdHJ1Y3RfbiBfX2QoMCk7CisgICAgICAgIHVuaXF1ZV9wdHI8dmFsdWVfdHlwZSwgX19kZXN0cnVjdF9uJj4gX19oKF9fcC5maXJzdCwgX19kKTsKKyAgICAgICAgLy8gTW92ZSB0aGUgZmFsc2VzIGludG8gdGhlIHRlbXBvcmFyeSBidWZmZXIsIGFuZCB0aGUgdHJ1ZXMgdG8gdGhlIGZyb250IG9mIHRoZSBsaW5lCisgICAgICAgIC8vIFVwZGF0ZSBfX2ZpcnN0IHRvIGFsd2F5cyBwb2ludCB0byB0aGUgZW5kIG9mIHRoZSB0cnVlcworICAgICAgICB2YWx1ZV90eXBlKiBfX3QgPSBfX3AuZmlyc3Q7CisgICAgICAgIDo6bmV3KF9fdCkgdmFsdWVfdHlwZShfVlNURDo6bW92ZSgqX19maXJzdCkpOworICAgICAgICBfX2QuX19pbmNyKCh2YWx1ZV90eXBlKikwKTsKKyAgICAgICAgKytfX3Q7CisgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19pID0gX19maXJzdDsKKyAgICAgICAgd2hpbGUgKCsrX19pICE9IF9fbGFzdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9fcHJlZCgqX19pKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqX19maXJzdCA9IF9WU1REOjptb3ZlKCpfX2kpOworICAgICAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA6Om5ldyhfX3QpIHZhbHVlX3R5cGUoX1ZTVEQ6Om1vdmUoKl9faSkpOworICAgICAgICAgICAgICAgIF9fZC5fX2luY3IoKHZhbHVlX3R5cGUqKTApOworICAgICAgICAgICAgICAgICsrX190OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIG1vdmUgKl9fbGFzdCwga25vd24gdG8gYmUgdHJ1ZQorICAgICAgICAqX19maXJzdCA9IF9WU1REOjptb3ZlKCpfX2kpOworICAgICAgICBfX2kgPSArK19fZmlyc3Q7CisgICAgICAgIC8vIEFsbCB0cnVlcyBub3cgYXQgc3RhcnQgb2YgcmFuZ2UsIGFsbCBmYWxzZXMgaW4gYnVmZmVyCisgICAgICAgIC8vIE1vdmUgZmFsc2VzIGJhY2sgaW50byByYW5nZSwgYnV0IGRvbid0IG1lc3MgdXAgX19maXJzdCB3aGljaCBwb2ludHMgdG8gZmlyc3QgZmFsc2UKKyAgICAgICAgZm9yICh2YWx1ZV90eXBlKiBfX3QyID0gX19wLmZpcnN0OyBfX3QyIDwgX190OyArK19fdDIsICsrX19pKQorICAgICAgICAgICAgKl9faSA9IF9WU1REOjptb3ZlKCpfX3QyKTsKKyAgICAgICAgLy8gX19oIGRlc3RydWN0cyBtb3ZlZC1mcm9tIHZhbHVlcyBvdXQgb2YgdGhlIHRlbXAgYnVmZmVyLCBidXQgZG9lc24ndCBkZWFsbG9jYXRlIGJ1ZmZlcgorICAgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisgICAgLy8gRWxzZSBub3QgZW5vdWdoIGJ1ZmZlciwgZG8gaW4gcGxhY2UKKyAgICAvLyBfX2xlbiA+PSA0CisgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX20gPSBfX2ZpcnN0OworICAgIF9EaXN0YW5jZSBfX2xlbjIgPSBfX2xlbiAvIDI7ICAvLyBfX2xlbjIgPj0gMgorICAgIF9WU1REOjphZHZhbmNlKF9fbSwgX19sZW4yKTsKKyAgICAvLyByZWN1cnNlIG9uIFtfX2ZpcnN0LCBfX20tMV0sIGV4Y2VwdCByZWR1Y2UgX19tLTEgdW50aWwgKihfX20tMSkgaXMgdHJ1ZSwgKl9fZmlyc3Qga25vdyB0byBiZSBmYWxzZQorICAgIC8vIEY/Pz8/Pz8/Pz8/Pz8/Pz8/VAorICAgIC8vIGYgICAgICAgbSAgICAgICAgbAorICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19tMSA9IF9fbTsKKyAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3RfZmFsc2UgPSBfX2ZpcnN0OworICAgIF9EaXN0YW5jZSBfX2xlbl9oYWxmID0gX19sZW4yOworICAgIHdoaWxlICghX19wcmVkKCotLV9fbTEpKQorICAgIHsKKyAgICAgICAgaWYgKF9fbTEgPT0gX19maXJzdCkKKyAgICAgICAgICAgIGdvdG8gX19maXJzdF9oYWxmX2RvbmU7CisgICAgICAgIC0tX19sZW5faGFsZjsKKyAgICB9CisgICAgLy8gRj8/P1RGRkY/Pz8/Pz8/Pz9UCisgICAgLy8gZiAgIG0xICBtICAgICAgICBsCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfUHJlZGljYXRlPjo6dHlwZSBfUHJlZFJlZjsKKyAgICBfX2ZpcnN0X2ZhbHNlID0gX19zdGFibGVfcGFydGl0aW9uPF9QcmVkUmVmPihfX2ZpcnN0LCBfX20xLCBfX3ByZWQsIF9fbGVuX2hhbGYsIF9fcCwgX19iaXQpOworX19maXJzdF9oYWxmX2RvbmU6CisgICAgLy8gVFRURkZGRkY/Pz8/Pz8/Pz9UCisgICAgLy8gZiAgZmYgICBtICAgICAgICBsCisgICAgLy8gcmVjdXJzZSBvbiBbX19tLCBfX2xhc3RdLCBleGNlcHQgaW5jcmVhc2UgX19tIHVudGlsICooX19tKSBpcyBmYWxzZSwgKl9fbGFzdCBrbm93IHRvIGJlIHRydWUKKyAgICBfX20xID0gX19tOworICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19zZWNvbmRfZmFsc2UgPSBfX2xhc3Q7CisgICAgKytfX3NlY29uZF9mYWxzZTsKKyAgICBfX2xlbl9oYWxmID0gX19sZW4gLSBfX2xlbjI7CisgICAgd2hpbGUgKF9fcHJlZCgqX19tMSkpCisgICAgeworICAgICAgICBpZiAoKytfX20xID09IF9fbGFzdCkKKyAgICAgICAgICAgIGdvdG8gX19zZWNvbmRfaGFsZl9kb25lOworICAgICAgICAtLV9fbGVuX2hhbGY7CisgICAgfQorICAgIC8vIFRUVEZGRkZGVFRURj8/Pz8/VAorICAgIC8vIGYgIGZmICAgbSAgbTEgICAgbAorICAgIF9fc2Vjb25kX2ZhbHNlID0gX19zdGFibGVfcGFydGl0aW9uPF9QcmVkUmVmPihfX20xLCBfX2xhc3QsIF9fcHJlZCwgX19sZW5faGFsZiwgX19wLCBfX2JpdCk7CitfX3NlY29uZF9oYWxmX2RvbmU6CisgICAgLy8gVFRURkZGRkZUVFRUVEZGRkZGCisgICAgLy8gZiAgZmYgICBtICAgIHNmICBsCisgICAgcmV0dXJuIF9WU1REOjpyb3RhdGUoX19maXJzdF9mYWxzZSwgX19tLCBfX3NlY29uZF9mYWxzZSk7CisgICAgLy8gVFRUVFRUVFRGRkZGRkZGRkZGCisgICAgLy8gICAgICAgICB8Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlLCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgorX0JpZGlyZWN0aW9uYWxJdGVyYXRvcgorX19zdGFibGVfcGFydGl0aW9uKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QsIF9QcmVkaWNhdGUgX19wcmVkLAorICAgICAgICAgICAgICAgICAgIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fYWxsb2NfbGltaXQgPSA0OyAgLy8gbWlnaHQgd2FudCB0byBtYWtlIHRoaXMgYSBmdW5jdGlvbiBvZiB0cml2aWFsIGFzc2lnbm1lbnQKKyAgICAvLyBFaXRoZXIgcHJvdmUgYWxsIHRydWUgYW5kIHJldHVybiBfX2ZpcnN0IG9yIHBvaW50IHRvIGZpcnN0IGZhbHNlCisgICAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgICAgICAgICByZXR1cm4gX19maXJzdDsKKyAgICAgICAgaWYgKCFfX3ByZWQoKl9fZmlyc3QpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICsrX19maXJzdDsKKyAgICB9CisgICAgLy8gX19maXJzdCBwb2ludHMgdG8gZmlyc3QgZmFsc2UsIGV2ZXJ5dGhpbmcgcHJpb3IgdG8gX19maXJzdCBpcyBhbHJlYWR5IHNldC4KKyAgICAvLyBFaXRoZXIgcHJvdmUgW19fZmlyc3QsIF9fbGFzdCkgaXMgYWxsIGZhbHNlIGFuZCByZXR1cm4gX19maXJzdCwgb3IgcG9pbnQgX19sYXN0IHRvIGxhc3QgdHJ1ZQorICAgIGRvCisgICAgeworICAgICAgICBpZiAoX19maXJzdCA9PSAtLV9fbGFzdCkKKyAgICAgICAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0gd2hpbGUgKCFfX3ByZWQoKl9fbGFzdCkpOworICAgIC8vIFdlIG5vdyBoYXZlIGEgcmVkdWNlZCByYW5nZSBbX19maXJzdCwgX19sYXN0XQorICAgIC8vICpfX2ZpcnN0IGlzIGtub3duIHRvIGJlIGZhbHNlCisgICAgLy8gKl9fbGFzdCBpcyBrbm93biB0byBiZSB0cnVlCisgICAgLy8gX19sZW4gPj0gMgorICAgIGRpZmZlcmVuY2VfdHlwZSBfX2xlbiA9IF9WU1REOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpICsgMTsKKyAgICBwYWlyPHZhbHVlX3R5cGUqLCBwdHJkaWZmX3Q+IF9fcCgwLCAwKTsKKyAgICB1bmlxdWVfcHRyPHZhbHVlX3R5cGUsIF9fcmV0dXJuX3RlbXBvcmFyeV9idWZmZXI+IF9faDsKKyAgICBpZiAoX19sZW4gPj0gX19hbGxvY19saW1pdCkKKyAgICB7CisgICAgICAgIF9fcCA9IF9WU1REOjpnZXRfdGVtcG9yYXJ5X2J1ZmZlcjx2YWx1ZV90eXBlPihfX2xlbik7CisgICAgICAgIF9faC5yZXNldChfX3AuZmlyc3QpOworICAgIH0KKyAgICByZXR1cm4gX19zdGFibGVfcGFydGl0aW9uPHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9QcmVkaWNhdGU+Ojp0eXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19maXJzdCwgX19sYXN0LCBfX3ByZWQsIF9fbGVuLCBfX3AsIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX1ByZWRpY2F0ZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfRm9yd2FyZEl0ZXJhdG9yCitzdGFibGVfcGFydGl0aW9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIF9QcmVkaWNhdGUgX19wcmVkKQoreworICAgIHJldHVybiBfX3N0YWJsZV9wYXJ0aXRpb248dHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X1ByZWRpY2F0ZT46OnR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCwgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSgpKTsKK30KKworLy8gaXNfc29ydGVkX3VudGlsCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3IF9Gb3J3YXJkSXRlcmF0b3IKK2lzX3NvcnRlZF91bnRpbChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCit7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OworICAgICAgICB3aGlsZSAoKytfX2kgIT0gX19sYXN0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX19jb21wKCpfX2ksICpfX2ZpcnN0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gX19pOworICAgICAgICAgICAgX19maXJzdCA9IF9faTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19sYXN0OworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK19Gb3J3YXJkSXRlcmF0b3IKK2lzX3NvcnRlZF91bnRpbChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworICAgIHJldHVybiBfVlNURDo6aXNfc29ydGVkX3VudGlsKF9fZmlyc3QsIF9fbGFzdCwgX19sZXNzPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4oKSk7Cit9CisKKy8vIGlzX3NvcnRlZAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworYm9vbAoraXNfc29ydGVkKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OmlzX3NvcnRlZF91bnRpbChfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCkgPT0gX19sYXN0OworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK2Jvb2wKK2lzX3NvcnRlZChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworICAgIHJldHVybiBfVlNURDo6aXNfc29ydGVkKF9fZmlyc3QsIF9fbGFzdCwgX19sZXNzPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4oKSk7Cit9CisKKy8vIHNvcnQKKworLy8gc3RhYmxlLCAyLTMgY29tcGFyZXMsIDAtMiBzd2FwcworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Cit1bnNpZ25lZAorX19zb3J0MyhfRm9yd2FyZEl0ZXJhdG9yIF9feCwgX0ZvcndhcmRJdGVyYXRvciBfX3ksIF9Gb3J3YXJkSXRlcmF0b3IgX196LCBfQ29tcGFyZSBfX2MpCit7CisgICAgdW5zaWduZWQgX19yID0gMDsKKyAgICBpZiAoIV9fYygqX195LCAqX194KSkgICAgICAgICAgLy8gaWYgeCA8PSB5CisgICAgeworICAgICAgICBpZiAoIV9fYygqX196LCAqX195KSkgICAgICAvLyBpZiB5IDw9IHoKKyAgICAgICAgICAgIHJldHVybiBfX3I7ICAgICAgICAgICAgLy8geCA8PSB5ICYmIHkgPD0gegorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB4IDw9IHkgJiYgeSA+IHoKKyAgICAgICAgc3dhcCgqX195LCAqX196KTsgICAgICAgICAgLy8geCA8PSB6ICYmIHkgPCB6CisgICAgICAgIF9fciA9IDE7CisgICAgICAgIGlmIChfX2MoKl9feSwgKl9feCkpICAgICAgIC8vIGlmIHggPiB5CisgICAgICAgIHsKKyAgICAgICAgICAgIHN3YXAoKl9feCwgKl9feSk7ICAgICAgLy8geCA8IHkgJiYgeSA8PSB6CisgICAgICAgICAgICBfX3IgPSAyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfX3I7ICAgICAgICAgICAgICAgIC8vIHggPD0geSAmJiB5IDwgegorICAgIH0KKyAgICBpZiAoX19jKCpfX3osICpfX3kpKSAgICAgICAgICAgLy8geCA+IHksIGlmIHkgPiB6CisgICAgeworICAgICAgICBzd2FwKCpfX3gsICpfX3opOyAgICAgICAgICAvLyB4IDwgeSAmJiB5IDwgegorICAgICAgICBfX3IgPSAxOworICAgICAgICByZXR1cm4gX19yOworICAgIH0KKyAgICBzd2FwKCpfX3gsICpfX3kpOyAgICAgICAgICAgICAgLy8geCA+IHkgJiYgeSA8PSB6CisgICAgX19yID0gMTsgICAgICAgICAgICAgICAgICAgICAgIC8vIHggPCB5ICYmIHggPD0gegorICAgIGlmIChfX2MoKl9feiwgKl9feSkpICAgICAgICAgICAvLyBpZiB5ID4gegorICAgIHsKKyAgICAgICAgc3dhcCgqX195LCAqX196KTsgICAgICAgICAgLy8geCA8PSB5ICYmIHkgPCB6CisgICAgICAgIF9fciA9IDI7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHggPD0geSAmJiB5IDw9IHoKKworLy8gc3RhYmxlLCAzLTYgY29tcGFyZXMsIDAtNSBzd2FwcworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Cit1bnNpZ25lZAorX19zb3J0NChfRm9yd2FyZEl0ZXJhdG9yIF9feDEsIF9Gb3J3YXJkSXRlcmF0b3IgX194MiwgX0ZvcndhcmRJdGVyYXRvciBfX3gzLAorICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3g0LCBfQ29tcGFyZSBfX2MpCit7CisgICAgdW5zaWduZWQgX19yID0gX19zb3J0MzxfQ29tcGFyZT4oX194MSwgX194MiwgX194MywgX19jKTsKKyAgICBpZiAoX19jKCpfX3g0LCAqX194MykpCisgICAgeworICAgICAgICBzd2FwKCpfX3gzLCAqX194NCk7CisgICAgICAgICsrX19yOworICAgICAgICBpZiAoX19jKCpfX3gzLCAqX194MikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3YXAoKl9feDIsICpfX3gzKTsKKyAgICAgICAgICAgICsrX19yOworICAgICAgICAgICAgaWYgKF9fYygqX194MiwgKl9feDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3YXAoKl9feDEsICpfX3gyKTsKKyAgICAgICAgICAgICAgICArK19fcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19yOworfQorCisvLyBzdGFibGUsIDQtMTAgY29tcGFyZXMsIDAtOSBzd2FwcworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Cit1bnNpZ25lZAorX19zb3J0NShfRm9yd2FyZEl0ZXJhdG9yIF9feDEsIF9Gb3J3YXJkSXRlcmF0b3IgX194MiwgX0ZvcndhcmRJdGVyYXRvciBfX3gzLAorICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3g0LCBfRm9yd2FyZEl0ZXJhdG9yIF9feDUsIF9Db21wYXJlIF9fYykKK3sKKyAgICB1bnNpZ25lZCBfX3IgPSBfX3NvcnQ0PF9Db21wYXJlPihfX3gxLCBfX3gyLCBfX3gzLCBfX3g0LCBfX2MpOworICAgIGlmIChfX2MoKl9feDUsICpfX3g0KSkKKyAgICB7CisgICAgICAgIHN3YXAoKl9feDQsICpfX3g1KTsKKyAgICAgICAgKytfX3I7CisgICAgICAgIGlmIChfX2MoKl9feDQsICpfX3gzKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dhcCgqX194MywgKl9feDQpOworICAgICAgICAgICAgKytfX3I7CisgICAgICAgICAgICBpZiAoX19jKCpfX3gzLCAqX194MikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dhcCgqX194MiwgKl9feDMpOworICAgICAgICAgICAgICAgICsrX19yOworICAgICAgICAgICAgICAgIGlmIChfX2MoKl9feDIsICpfX3gxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN3YXAoKl9feDEsICpfX3gyKTsKKyAgICAgICAgICAgICAgICAgICAgKytfX3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKKy8vIEFzc3VtZXMgc2l6ZSA+IDAKK3RlbXBsYXRlIDxjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0JpcmRpcmVjdGlvbmFsSXRlcmF0b3I+Cit2b2lkCitfX3NlbGVjdGlvbl9zb3J0KF9CaXJkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsIF9CaXJkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQoreworICAgIF9CaXJkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbG0xID0gX19sYXN0OworICAgIGZvciAoLS1fX2xtMTsgX19maXJzdCAhPSBfX2xtMTsgKytfX2ZpcnN0KQorICAgIHsKKyAgICAgICAgX0JpcmRpcmVjdGlvbmFsSXRlcmF0b3IgX19pID0gX1ZTVEQ6Om1pbl9lbGVtZW50PF9CaXJkaXJlY3Rpb25hbEl0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfQ29tcGFyZT46OnR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsKKyAgICAgICAgaWYgKF9faSAhPSBfX2ZpcnN0KQorICAgICAgICAgICAgc3dhcCgqX19maXJzdCwgKl9faSk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9CaXJkaXJlY3Rpb25hbEl0ZXJhdG9yPgordm9pZAorX19pbnNlcnRpb25fc29ydChfQmlyZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LCBfQmlyZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlyZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisgICAgeworICAgICAgICBfQmlyZGlyZWN0aW9uYWxJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OworICAgICAgICBmb3IgKCsrX19pOyBfX2kgIT0gX19sYXN0OyArK19faSkKKyAgICAgICAgeworICAgICAgICAgICAgX0JpcmRpcmVjdGlvbmFsSXRlcmF0b3IgX19qID0gX19pOworICAgICAgICAgICAgdmFsdWVfdHlwZSBfX3QoX1ZTVEQ6Om1vdmUoKl9faikpOworICAgICAgICAgICAgZm9yIChfQmlyZGlyZWN0aW9uYWxJdGVyYXRvciBfX2sgPSBfX2k7IF9fayAhPSBfX2ZpcnN0ICYmIF9fY29tcChfX3QsICAqLS1fX2spOyAtLV9faikKKyAgICAgICAgICAgICAgICAqX19qID0gX1ZTVEQ6Om1vdmUoKl9fayk7CisgICAgICAgICAgICAqX19qID0gX1ZTVEQ6Om1vdmUoX190KTsKKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Cit2b2lkCitfX2luc2VydGlvbl9zb3J0XzMoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9faiA9IF9fZmlyc3QrMjsKKyAgICBfX3NvcnQzPF9Db21wYXJlPihfX2ZpcnN0LCBfX2ZpcnN0KzEsIF9faiwgX19jb21wKTsKKyAgICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2kgPSBfX2orMTsgX19pICE9IF9fbGFzdDsgKytfX2kpCisgICAgeworICAgICAgICBpZiAoX19jb21wKCpfX2ksICpfX2opKQorICAgICAgICB7CisgICAgICAgICAgICB2YWx1ZV90eXBlIF9fdChfVlNURDo6bW92ZSgqX19pKSk7CisgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19rID0gX19qOworICAgICAgICAgICAgX19qID0gX19pOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqX19qID0gX1ZTVEQ6Om1vdmUoKl9fayk7CisgICAgICAgICAgICAgICAgX19qID0gX19rOworICAgICAgICAgICAgfSB3aGlsZSAoX19qICE9IF9fZmlyc3QgJiYgX19jb21wKF9fdCwgKi0tX19rKSk7CisgICAgICAgICAgICAqX19qID0gX1ZTVEQ6Om1vdmUoX190KTsKKyAgICAgICAgfQorICAgICAgICBfX2ogPSBfX2k7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KK2Jvb2wKK19faW5zZXJ0aW9uX3NvcnRfaW5jb21wbGV0ZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQoreworICAgIHN3aXRjaCAoX19sYXN0IC0gX19maXJzdCkKKyAgICB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoX19jb21wKCotLV9fbGFzdCwgKl9fZmlyc3QpKQorICAgICAgICAgICAgc3dhcCgqX19maXJzdCwgKl9fbGFzdCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgMzoKKyAgICAgICAgX1ZTVEQ6Ol9fc29ydDM8X0NvbXBhcmU+KF9fZmlyc3QsIF9fZmlyc3QrMSwgLS1fX2xhc3QsIF9fY29tcCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgNDoKKyAgICAgICAgX1ZTVEQ6Ol9fc29ydDQ8X0NvbXBhcmU+KF9fZmlyc3QsIF9fZmlyc3QrMSwgX19maXJzdCsyLCAtLV9fbGFzdCwgX19jb21wKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSA1OgorICAgICAgICBfVlNURDo6X19zb3J0NTxfQ29tcGFyZT4oX19maXJzdCwgX19maXJzdCsxLCBfX2ZpcnN0KzIsIF9fZmlyc3QrMywgLS1fX2xhc3QsIF9fY29tcCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9faiA9IF9fZmlyc3QrMjsKKyAgICBfX3NvcnQzPF9Db21wYXJlPihfX2ZpcnN0LCBfX2ZpcnN0KzEsIF9faiwgX19jb21wKTsKKyAgICBjb25zdCB1bnNpZ25lZCBfX2xpbWl0ID0gODsKKyAgICB1bnNpZ25lZCBfX2NvdW50ID0gMDsKKyAgICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2kgPSBfX2orMTsgX19pICE9IF9fbGFzdDsgKytfX2kpCisgICAgeworICAgICAgICBpZiAoX19jb21wKCpfX2ksICpfX2opKQorICAgICAgICB7CisgICAgICAgICAgICB2YWx1ZV90eXBlIF9fdChfVlNURDo6bW92ZSgqX19pKSk7CisgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19rID0gX19qOworICAgICAgICAgICAgX19qID0gX19pOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqX19qID0gX1ZTVEQ6Om1vdmUoKl9fayk7CisgICAgICAgICAgICAgICAgX19qID0gX19rOworICAgICAgICAgICAgfSB3aGlsZSAoX19qICE9IF9fZmlyc3QgJiYgX19jb21wKF9fdCwgKi0tX19rKSk7CisgICAgICAgICAgICAqX19qID0gX1ZTVEQ6Om1vdmUoX190KTsKKyAgICAgICAgICAgIGlmICgrK19fY291bnQgPT0gX19saW1pdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKytfX2kgPT0gX19sYXN0OworICAgICAgICB9CisgICAgICAgIF9faiA9IF9faTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0JpcmRpcmVjdGlvbmFsSXRlcmF0b3I+Cit2b2lkCitfX2luc2VydGlvbl9zb3J0X21vdmUoX0JpcmRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdDEsIF9CaXJkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaXJkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSogX19maXJzdDIsIF9Db21wYXJlIF9fY29tcCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlyZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICBpZiAoX19maXJzdDEgIT0gX19sYXN0MSkKKyAgICB7CisgICAgICAgIF9fZGVzdHJ1Y3RfbiBfX2QoMCk7CisgICAgICAgIHVuaXF1ZV9wdHI8dmFsdWVfdHlwZSwgX19kZXN0cnVjdF9uJj4gX19oKF9fZmlyc3QyLCBfX2QpOworICAgICAgICB2YWx1ZV90eXBlKiBfX2xhc3QyID0gX19maXJzdDI7CisgICAgICAgIDo6bmV3KF9fbGFzdDIpIHZhbHVlX3R5cGUoX1ZTVEQ6Om1vdmUoKl9fZmlyc3QxKSk7CisgICAgICAgIF9fZC5fX2luY3IoKHZhbHVlX3R5cGUqKTApOworICAgICAgICBmb3IgKCsrX19sYXN0MjsgKytfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fbGFzdDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVlX3R5cGUqIF9fajIgPSBfX2xhc3QyOworICAgICAgICAgICAgdmFsdWVfdHlwZSogX19pMiA9IF9fajI7CisgICAgICAgICAgICBpZiAoX19jb21wKCpfX2ZpcnN0MSwgKi0tX19pMikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgOjpuZXcoX19qMikgdmFsdWVfdHlwZShfVlNURDo6bW92ZSgqX19pMikpOworICAgICAgICAgICAgICAgIF9fZC5fX2luY3IoKHZhbHVlX3R5cGUqKTApOworICAgICAgICAgICAgICAgIGZvciAoLS1fX2oyOyBfX2kyICE9IF9fZmlyc3QyICYmIF9fY29tcCgqX19maXJzdDEsICAqLS1fX2kyKTsgLS1fX2oyKQorICAgICAgICAgICAgICAgICAgICAqX19qMiA9IF9WU1REOjptb3ZlKCpfX2kyKTsKKyAgICAgICAgICAgICAgICAqX19qMiA9IF9WU1REOjptb3ZlKCpfX2ZpcnN0MSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgOjpuZXcoX19qMikgdmFsdWVfdHlwZShfVlNURDo6bW92ZSgqX19maXJzdDEpKTsKKyAgICAgICAgICAgICAgICBfX2QuX19pbmNyKCh2YWx1ZV90eXBlKikwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfX2gucmVsZWFzZSgpOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Cit2b2lkCitfX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKK3sKKyAgICAvLyBfQ29tcGFyZSBpcyBrbm93biB0byBiZSBhIHJlZmVyZW5jZSB0eXBlCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fbGltaXQgPSBpc190cml2aWFsbHlfY29weV9jb25zdHJ1Y3RpYmxlPHZhbHVlX3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfdHJpdmlhbGx5X2NvcHlfYXNzaWduYWJsZTx2YWx1ZV90eXBlPjo6dmFsdWUgPyAzMCA6IDY7CisgICAgd2hpbGUgKHRydWUpCisgICAgeworICAgIF9fcmVzdGFydDoKKyAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKKyAgICAgICAgc3dpdGNoIChfX2xlbikKKyAgICAgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKF9fY29tcCgqLS1fX2xhc3QsICpfX2ZpcnN0KSkKKyAgICAgICAgICAgICAgICBzd2FwKCpfX2ZpcnN0LCAqX19sYXN0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgX1ZTVEQ6Ol9fc29ydDM8X0NvbXBhcmU+KF9fZmlyc3QsIF9fZmlyc3QrMSwgLS1fX2xhc3QsIF9fY29tcCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIF9WU1REOjpfX3NvcnQ0PF9Db21wYXJlPihfX2ZpcnN0LCBfX2ZpcnN0KzEsIF9fZmlyc3QrMiwgLS1fX2xhc3QsIF9fY29tcCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIF9WU1REOjpfX3NvcnQ1PF9Db21wYXJlPihfX2ZpcnN0LCBfX2ZpcnN0KzEsIF9fZmlyc3QrMiwgX19maXJzdCszLCAtLV9fbGFzdCwgX19jb21wKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19sZW4gPD0gX19saW1pdCkKKyAgICAgICAgeworICAgICAgICAgICAgX1ZTVEQ6Ol9faW5zZXJ0aW9uX3NvcnRfMzxfQ29tcGFyZT4oX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIF9fbGVuID4gNQorICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19tID0gX19maXJzdDsKKyAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbG0xID0gX19sYXN0OworICAgICAgICAtLV9fbG0xOworICAgICAgICB1bnNpZ25lZCBfX25fc3dhcHM7CisgICAgICAgIHsKKyAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fZGVsdGE7CisgICAgICAgIGlmIChfX2xlbiA+PSAxMDAwKQorICAgICAgICB7CisgICAgICAgICAgICBfX2RlbHRhID0gX19sZW4vMjsKKyAgICAgICAgICAgIF9fbSArPSBfX2RlbHRhOworICAgICAgICAgICAgX19kZWx0YSAvPSAyOworICAgICAgICAgICAgX19uX3N3YXBzID0gX1ZTVEQ6Ol9fc29ydDU8X0NvbXBhcmU+KF9fZmlyc3QsIF9fZmlyc3QgKyBfX2RlbHRhLCBfX20sIF9fbStfX2RlbHRhLCBfX2xtMSwgX19jb21wKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fZGVsdGEgPSBfX2xlbi8yOworICAgICAgICAgICAgX19tICs9IF9fZGVsdGE7CisgICAgICAgICAgICBfX25fc3dhcHMgPSBfVlNURDo6X19zb3J0MzxfQ29tcGFyZT4oX19maXJzdCwgX19tLCBfX2xtMSwgX19jb21wKTsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vICpfX20gaXMgbWVkaWFuCisgICAgICAgIC8vIHBhcnRpdGlvbiBbX19maXJzdCwgX19tKSA8ICpfX20gYW5kICpfX20gPD0gW19fbSwgX19sYXN0KQorICAgICAgICAvLyAodGhpcyBpbmhpYml0cyB0b3NzaW5nIGVsZW1lbnRzIGVxdWl2YWxlbnQgdG8gX19tIGFyb3VuZCB1bm5lY2Vzc2FyaWx5KQorICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19pID0gX19maXJzdDsKKyAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9faiA9IF9fbG0xOworICAgICAgICAvLyBqIHBvaW50cyBiZXlvbmQgcmFuZ2UgdG8gYmUgdGVzdGVkLCAqX19tIGlzIGtub3duIHRvIGJlIDw9ICpfX2xtMQorICAgICAgICAvLyBUaGUgc2VhcmNoIGdvaW5nIHVwIGlzIGtub3duIHRvIGJlIGd1YXJkZWQgYnV0IHRoZSBzZWFyY2ggY29taW5nIGRvd24gaXNuJ3QuCisgICAgICAgIC8vIFByaW1lIHRoZSBkb3dud2FyZCBzZWFyY2ggd2l0aCBhIGd1YXJkLgorICAgICAgICBpZiAoIV9fY29tcCgqX19pLCAqX19tKSkgIC8vIGlmICpfX2ZpcnN0ID09ICpfX20KKyAgICAgICAgeworICAgICAgICAgICAgLy8gKl9fZmlyc3QgPT0gKl9fbSwgKl9fZmlyc3QgZG9lc24ndCBnbyBpbiBmaXJzdCBwYXJ0CisgICAgICAgICAgICAvLyBtYW51YWxseSBndWFyZCBkb3dud2FyZCBtb3ZpbmcgX19qIGFnYWluc3QgX19pCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX19pID09IC0tX19qKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gKl9fZmlyc3QgPT0gKl9fbSwgKl9fbSA8PSBhbGwgb3RoZXIgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgLy8gUGFyaXRpb24gaW5zdGVhZCBpbnRvIFtfX2ZpcnN0LCBfX2kpID09ICpfX2ZpcnN0IGFuZCAqX19maXJzdCA8IFtfX2ksIF9fbGFzdCkKKyAgICAgICAgICAgICAgICAgICAgKytfX2k7ICAvLyBfX2ZpcnN0ICsgMQorICAgICAgICAgICAgICAgICAgICBfX2ogPSBfX2xhc3Q7CisgICAgICAgICAgICAgICAgICAgIGlmICghX19jb21wKCpfX2ZpcnN0LCAqLS1fX2opKSAgLy8gd2UgbmVlZCBhIGd1YXJkIGlmICpfX2ZpcnN0ID09ICooX19sYXN0LTEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX2kgPT0gX19qKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47ICAvLyBbX19maXJzdCwgX19sYXN0KSBhbGwgZXF1aXZhbGVudCBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QsICpfX2kpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcCgqX19pLCAqX19qKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytfX25fc3dhcHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrX19pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytfX2k7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gW19fZmlyc3QsIF9faSkgPT0gKl9fZmlyc3QgYW5kICpfX2ZpcnN0IDwgW19faiwgX19sYXN0KSBhbmQgX19qID09IF9fbGFzdCAtIDEKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9faSA9PSBfX2opCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIV9fY29tcCgqX19maXJzdCwgKl9faSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytfX2k7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoX19jb21wKCpfX2ZpcnN0LCAqLS1fX2opKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX2kgPj0gX19qKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgc3dhcCgqX19pLCAqX19qKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrX19uX3N3YXBzOworICAgICAgICAgICAgICAgICAgICAgICAgKytfX2k7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gW19fZmlyc3QsIF9faSkgPT0gKl9fZmlyc3QgYW5kICpfX2ZpcnN0IDwgW19faSwgX19sYXN0KQorICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgcGFydCBpcyBzb3J0ZWQsIHNvcnQgdGhlIHNlY29kIHBhcnQKKyAgICAgICAgICAgICAgICAgICAgLy8gX1ZTVEQ6Ol9fc29ydDxfQ29tcGFyZT4oX19pLCBfX2xhc3QsIF9fY29tcCk7CisgICAgICAgICAgICAgICAgICAgIF9fZmlyc3QgPSBfX2k7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gX19yZXN0YXJ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoX19jb21wKCpfX2osICpfX20pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3dhcCgqX19pLCAqX19qKTsKKyAgICAgICAgICAgICAgICAgICAgKytfX25fc3dhcHM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gZm91bmQgZ3VhcmQgZm9yIGRvd253YXJkIG1vdmluZyBfX2osIG5vdyB1c2UgdW5ndWFyZGVkIHBhcnRpdGlvbgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBJdCBpcyBrbm93biB0aGF0ICpfX2kgPCAqX19tCisgICAgICAgICsrX19pOworICAgICAgICAvLyBqIHBvaW50cyBiZXlvbmQgcmFuZ2UgdG8gYmUgdGVzdGVkLCAqX19tIGlzIGtub3duIHRvIGJlIDw9ICpfX2xtMQorICAgICAgICAvLyBpZiBub3QgeWV0IHBhcnRpdGlvbmVkLi4uCisgICAgICAgIGlmIChfX2kgPCBfX2opCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGtub3duIHRoYXQgKihfX2kgLSAxKSA8ICpfX20KKyAgICAgICAgICAgIC8vIGtub3duIHRoYXQgX19pIDw9IF9fbQorICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gX19tIHN0aWxsIGd1YXJkcyB1cHdhcmQgbW92aW5nIF9faQorICAgICAgICAgICAgICAgIHdoaWxlIChfX2NvbXAoKl9faSwgKl9fbSkpCisgICAgICAgICAgICAgICAgICAgICsrX19pOworICAgICAgICAgICAgICAgIC8vIEl0IGlzIG5vdyBrbm93biB0aGF0IGEgZ3VhcmQgZXhpc3RzIGZvciBkb3dud2FyZCBtb3ZpbmcgX19qCisgICAgICAgICAgICAgICAgd2hpbGUgKCFfX2NvbXAoKi0tX19qLCAqX19tKSkKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIGlmIChfX2kgPiBfX2opCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHN3YXAoKl9faSwgKl9faik7CisgICAgICAgICAgICAgICAgKytfX25fc3dhcHM7CisgICAgICAgICAgICAgICAgLy8gSXQgaXMga25vd24gdGhhdCBfX20gIT0gX19qCisgICAgICAgICAgICAgICAgLy8gSWYgX19tIGp1c3QgbW92ZWQsIGZvbGxvdyBpdAorICAgICAgICAgICAgICAgIGlmIChfX20gPT0gX19pKQorICAgICAgICAgICAgICAgICAgICBfX20gPSBfX2o7CisgICAgICAgICAgICAgICAgKytfX2k7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gW19fZmlyc3QsIF9faSkgPCAqX19tIGFuZCAqX19tIDw9IFtfX2ksIF9fbGFzdCkKKyAgICAgICAgaWYgKF9faSAhPSBfX20gJiYgX19jb21wKCpfX20sICpfX2kpKQorICAgICAgICB7CisgICAgICAgICAgICBzd2FwKCpfX2ksICpfX20pOworICAgICAgICAgICAgKytfX25fc3dhcHM7CisgICAgICAgIH0KKyAgICAgICAgLy8gW19fZmlyc3QsIF9faSkgPCAqX19pIGFuZCAqX19pIDw9IFtfX2krMSwgX19sYXN0KQorICAgICAgICAvLyBJZiB3ZSB3ZXJlIGdpdmVuIGEgcGVyZmVjdCBwYXJ0aXRpb24sIHNlZSBpZiBpbnNlcnRpb24gc29ydCBpcyBxdWljay4uLgorICAgICAgICBpZiAoX19uX3N3YXBzID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgX19mcyA9IF9WU1REOjpfX2luc2VydGlvbl9zb3J0X2luY29tcGxldGU8X0NvbXBhcmU+KF9fZmlyc3QsIF9faSwgX19jb21wKTsKKyAgICAgICAgICAgIGlmIChfVlNURDo6X19pbnNlcnRpb25fc29ydF9pbmNvbXBsZXRlPF9Db21wYXJlPihfX2krMSwgX19sYXN0LCBfX2NvbXApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfX2ZzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgX19sYXN0ID0gX19pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfX2ZzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX19maXJzdCA9ICsrX19pOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gc29ydCBzbWFsbGVyIHJhbmdlIHdpdGggcmVjdXJzaXZlIGNhbGwgYW5kIGxhcmdlciB3aXRoIHRhaWwgcmVjdXJzaW9uIGVsaW1pbmF0aW9uCisgICAgICAgIGlmIChfX2kgLSBfX2ZpcnN0IDwgX19sYXN0IC0gX19pKQorICAgICAgICB7CisgICAgICAgICAgICBfVlNURDo6X19zb3J0PF9Db21wYXJlPihfX2ZpcnN0LCBfX2ksIF9fY29tcCk7CisgICAgICAgICAgICAvLyBfVlNURDo6X19zb3J0PF9Db21wYXJlPihfX2krMSwgX19sYXN0LCBfX2NvbXApOworICAgICAgICAgICAgX19maXJzdCA9ICsrX19pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX1ZTVEQ6Ol9fc29ydDxfQ29tcGFyZT4oX19pKzEsIF9fbGFzdCwgX19jb21wKTsKKyAgICAgICAgICAgIC8vIF9WU1REOjpfX3NvcnQ8X0NvbXBhcmU+KF9fZmlyc3QsIF9faSwgX19jb21wKTsKKyAgICAgICAgICAgIF9fbGFzdCA9IF9faTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gVGhpcyBmb3J3YXJkZXIga2VlcHMgdGhlIHRvcCBjYWxsIGFuZCB0aGUgcmVjdXJzaXZlIGNhbGxzIHVzaW5nIHRoZSBzYW1lIGluc3RhbnRpYXRpb24sIGZvcmNpbmcgYSByZWZlcmVuY2UgX0NvbXBhcmUKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9Db21wYXJlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfX2RlYnVnX2xlc3M8X0NvbXBhcmU+ID46OnR5cGUgX0NvbXBfcmVmOworICAgIF9fZGVidWdfbGVzczxfQ29tcGFyZT4gX19jKF9fY29tcCk7CisgICAgX19zb3J0PF9Db21wX3JlZj4oX19maXJzdCwgX19sYXN0LCBfX2MpOworI2Vsc2UgIC8vIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9Db21wYXJlPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgX19zb3J0PF9Db21wX3JlZj4oX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBfVlNURDo6c29ydChfX2ZpcnN0LCBfX2xhc3QsIF9fbGVzczx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZT4oKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc29ydChfVHAqKiBfX2ZpcnN0LCBfVHAqKiBfX2xhc3QpCit7CisgICAgX1ZTVEQ6OnNvcnQoKHNpemVfdCopX19maXJzdCwgKHNpemVfdCopX19sYXN0LCBfX2xlc3M8c2l6ZV90PigpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzb3J0KF9fd3JhcF9pdGVyPF9UcCo+IF9fZmlyc3QsIF9fd3JhcF9pdGVyPF9UcCo+IF9fbGFzdCkKK3sKKyAgICBfVlNURDo6c29ydChfX2ZpcnN0LmJhc2UoKSwgX19sYXN0LmJhc2UoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3NvcnQoX193cmFwX2l0ZXI8X1RwKj4gX19maXJzdCwgX193cmFwX2l0ZXI8X1RwKj4gX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfQ29tcGFyZT46OnR5cGUgX0NvbXBfcmVmOworICAgIF9WU1REOjpzb3J0PF9UcCosIF9Db21wX3JlZj4oX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCksIF9fY29tcCk7Cit9CisKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKF9MSUJDUFBfRlVOQ19WSVMgdm9pZCBfX3NvcnQ8X19sZXNzPGNoYXI+JiwgY2hhcio+KGNoYXIqLCBjaGFyKiwgX19sZXNzPGNoYXI+JikpCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURShfTElCQ1BQX0ZVTkNfVklTIHZvaWQgX19zb3J0PF9fbGVzczx3Y2hhcl90PiYsIHdjaGFyX3QqPih3Y2hhcl90Kiwgd2NoYXJfdCosIF9fbGVzczx3Y2hhcl90PiYpKQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoX0xJQkNQUF9GVU5DX1ZJUyB2b2lkIF9fc29ydDxfX2xlc3M8c2lnbmVkIGNoYXI+Jiwgc2lnbmVkIGNoYXIqPihzaWduZWQgY2hhciosIHNpZ25lZCBjaGFyKiwgX19sZXNzPHNpZ25lZCBjaGFyPiYpKQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoX0xJQkNQUF9GVU5DX1ZJUyB2b2lkIF9fc29ydDxfX2xlc3M8dW5zaWduZWQgY2hhcj4mLCB1bnNpZ25lZCBjaGFyKj4odW5zaWduZWQgY2hhciosIHVuc2lnbmVkIGNoYXIqLCBfX2xlc3M8dW5zaWduZWQgY2hhcj4mKSkKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKF9MSUJDUFBfRlVOQ19WSVMgdm9pZCBfX3NvcnQ8X19sZXNzPHNob3J0PiYsIHNob3J0Kj4oc2hvcnQqLCBzaG9ydCosIF9fbGVzczxzaG9ydD4mKSkKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKF9MSUJDUFBfRlVOQ19WSVMgdm9pZCBfX3NvcnQ8X19sZXNzPHVuc2lnbmVkIHNob3J0PiYsIHVuc2lnbmVkIHNob3J0Kj4odW5zaWduZWQgc2hvcnQqLCB1bnNpZ25lZCBzaG9ydCosIF9fbGVzczx1bnNpZ25lZCBzaG9ydD4mKSkKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKF9MSUJDUFBfRlVOQ19WSVMgdm9pZCBfX3NvcnQ8X19sZXNzPGludD4mLCBpbnQqPihpbnQqLCBpbnQqLCBfX2xlc3M8aW50PiYpKQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoX0xJQkNQUF9GVU5DX1ZJUyB2b2lkIF9fc29ydDxfX2xlc3M8dW5zaWduZWQ+JiwgdW5zaWduZWQqPih1bnNpZ25lZCosIHVuc2lnbmVkKiwgX19sZXNzPHVuc2lnbmVkPiYpKQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoX0xJQkNQUF9GVU5DX1ZJUyB2b2lkIF9fc29ydDxfX2xlc3M8bG9uZz4mLCBsb25nKj4obG9uZyosIGxvbmcqLCBfX2xlc3M8bG9uZz4mKSkKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKF9MSUJDUFBfRlVOQ19WSVMgdm9pZCBfX3NvcnQ8X19sZXNzPHVuc2lnbmVkIGxvbmc+JiwgdW5zaWduZWQgbG9uZyo+KHVuc2lnbmVkIGxvbmcqLCB1bnNpZ25lZCBsb25nKiwgX19sZXNzPHVuc2lnbmVkIGxvbmc+JikpCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURShfTElCQ1BQX0ZVTkNfVklTIHZvaWQgX19zb3J0PF9fbGVzczxsb25nIGxvbmc+JiwgbG9uZyBsb25nKj4obG9uZyBsb25nKiwgbG9uZyBsb25nKiwgX19sZXNzPGxvbmcgbG9uZz4mKSkKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKF9MSUJDUFBfRlVOQ19WSVMgdm9pZCBfX3NvcnQ8X19sZXNzPHVuc2lnbmVkIGxvbmcgbG9uZz4mLCB1bnNpZ25lZCBsb25nIGxvbmcqPih1bnNpZ25lZCBsb25nIGxvbmcqLCB1bnNpZ25lZCBsb25nIGxvbmcqLCBfX2xlc3M8dW5zaWduZWQgbG9uZyBsb25nPiYpKQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoX0xJQkNQUF9GVU5DX1ZJUyB2b2lkIF9fc29ydDxfX2xlc3M8ZmxvYXQ+JiwgZmxvYXQqPihmbG9hdCosIGZsb2F0KiwgX19sZXNzPGZsb2F0PiYpKQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoX0xJQkNQUF9GVU5DX1ZJUyB2b2lkIF9fc29ydDxfX2xlc3M8ZG91YmxlPiYsIGRvdWJsZSo+KGRvdWJsZSosIGRvdWJsZSosIF9fbGVzczxkb3VibGU+JikpCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURShfTElCQ1BQX0ZVTkNfVklTIHZvaWQgX19zb3J0PF9fbGVzczxsb25nIGRvdWJsZT4mLCBsb25nIGRvdWJsZSo+KGxvbmcgZG91YmxlKiwgbG9uZyBkb3VibGUqLCBfX2xlc3M8bG9uZyBkb3VibGU+JikpCisKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKF9MSUJDUFBfRlVOQ19WSVMgYm9vbCBfX2luc2VydGlvbl9zb3J0X2luY29tcGxldGU8X19sZXNzPGNoYXI+JiwgY2hhcio+KGNoYXIqLCBjaGFyKiwgX19sZXNzPGNoYXI+JikpCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURShfTElCQ1BQX0ZVTkNfVklTIGJvb2wgX19pbnNlcnRpb25fc29ydF9pbmNvbXBsZXRlPF9fbGVzczx3Y2hhcl90PiYsIHdjaGFyX3QqPih3Y2hhcl90Kiwgd2NoYXJfdCosIF9fbGVzczx3Y2hhcl90PiYpKQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoX0xJQkNQUF9GVU5DX1ZJUyBib29sIF9faW5zZXJ0aW9uX3NvcnRfaW5jb21wbGV0ZTxfX2xlc3M8c2lnbmVkIGNoYXI+Jiwgc2lnbmVkIGNoYXIqPihzaWduZWQgY2hhciosIHNpZ25lZCBjaGFyKiwgX19sZXNzPHNpZ25lZCBjaGFyPiYpKQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoX0xJQkNQUF9GVU5DX1ZJUyBib29sIF9faW5zZXJ0aW9uX3NvcnRfaW5jb21wbGV0ZTxfX2xlc3M8dW5zaWduZWQgY2hhcj4mLCB1bnNpZ25lZCBjaGFyKj4odW5zaWduZWQgY2hhciosIHVuc2lnbmVkIGNoYXIqLCBfX2xlc3M8dW5zaWduZWQgY2hhcj4mKSkKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKF9MSUJDUFBfRlVOQ19WSVMgYm9vbCBfX2luc2VydGlvbl9zb3J0X2luY29tcGxldGU8X19sZXNzPHNob3J0PiYsIHNob3J0Kj4oc2hvcnQqLCBzaG9ydCosIF9fbGVzczxzaG9ydD4mKSkKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKF9MSUJDUFBfRlVOQ19WSVMgYm9vbCBfX2luc2VydGlvbl9zb3J0X2luY29tcGxldGU8X19sZXNzPHVuc2lnbmVkIHNob3J0PiYsIHVuc2lnbmVkIHNob3J0Kj4odW5zaWduZWQgc2hvcnQqLCB1bnNpZ25lZCBzaG9ydCosIF9fbGVzczx1bnNpZ25lZCBzaG9ydD4mKSkKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKF9MSUJDUFBfRlVOQ19WSVMgYm9vbCBfX2luc2VydGlvbl9zb3J0X2luY29tcGxldGU8X19sZXNzPGludD4mLCBpbnQqPihpbnQqLCBpbnQqLCBfX2xlc3M8aW50PiYpKQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoX0xJQkNQUF9GVU5DX1ZJUyBib29sIF9faW5zZXJ0aW9uX3NvcnRfaW5jb21wbGV0ZTxfX2xlc3M8dW5zaWduZWQ+JiwgdW5zaWduZWQqPih1bnNpZ25lZCosIHVuc2lnbmVkKiwgX19sZXNzPHVuc2lnbmVkPiYpKQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoX0xJQkNQUF9GVU5DX1ZJUyBib29sIF9faW5zZXJ0aW9uX3NvcnRfaW5jb21wbGV0ZTxfX2xlc3M8bG9uZz4mLCBsb25nKj4obG9uZyosIGxvbmcqLCBfX2xlc3M8bG9uZz4mKSkKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKF9MSUJDUFBfRlVOQ19WSVMgYm9vbCBfX2luc2VydGlvbl9zb3J0X2luY29tcGxldGU8X19sZXNzPHVuc2lnbmVkIGxvbmc+JiwgdW5zaWduZWQgbG9uZyo+KHVuc2lnbmVkIGxvbmcqLCB1bnNpZ25lZCBsb25nKiwgX19sZXNzPHVuc2lnbmVkIGxvbmc+JikpCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURShfTElCQ1BQX0ZVTkNfVklTIGJvb2wgX19pbnNlcnRpb25fc29ydF9pbmNvbXBsZXRlPF9fbGVzczxsb25nIGxvbmc+JiwgbG9uZyBsb25nKj4obG9uZyBsb25nKiwgbG9uZyBsb25nKiwgX19sZXNzPGxvbmcgbG9uZz4mKSkKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKF9MSUJDUFBfRlVOQ19WSVMgYm9vbCBfX2luc2VydGlvbl9zb3J0X2luY29tcGxldGU8X19sZXNzPHVuc2lnbmVkIGxvbmcgbG9uZz4mLCB1bnNpZ25lZCBsb25nIGxvbmcqPih1bnNpZ25lZCBsb25nIGxvbmcqLCB1bnNpZ25lZCBsb25nIGxvbmcqLCBfX2xlc3M8dW5zaWduZWQgbG9uZyBsb25nPiYpKQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoX0xJQkNQUF9GVU5DX1ZJUyBib29sIF9faW5zZXJ0aW9uX3NvcnRfaW5jb21wbGV0ZTxfX2xlc3M8ZmxvYXQ+JiwgZmxvYXQqPihmbG9hdCosIGZsb2F0KiwgX19sZXNzPGZsb2F0PiYpKQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoX0xJQkNQUF9GVU5DX1ZJUyBib29sIF9faW5zZXJ0aW9uX3NvcnRfaW5jb21wbGV0ZTxfX2xlc3M8ZG91YmxlPiYsIGRvdWJsZSo+KGRvdWJsZSosIGRvdWJsZSosIF9fbGVzczxkb3VibGU+JikpCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURShfTElCQ1BQX0ZVTkNfVklTIGJvb2wgX19pbnNlcnRpb25fc29ydF9pbmNvbXBsZXRlPF9fbGVzczxsb25nIGRvdWJsZT4mLCBsb25nIGRvdWJsZSo+KGxvbmcgZG91YmxlKiwgbG9uZyBkb3VibGUqLCBfX2xlc3M8bG9uZyBkb3VibGU+JikpCisKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKF9MSUJDUFBfRlVOQ19WSVMgdW5zaWduZWQgX19zb3J0NTxfX2xlc3M8bG9uZyBkb3VibGU+JiwgbG9uZyBkb3VibGUqPihsb25nIGRvdWJsZSosIGxvbmcgZG91YmxlKiwgbG9uZyBkb3VibGUqLCBsb25nIGRvdWJsZSosIGxvbmcgZG91YmxlKiwgX19sZXNzPGxvbmcgZG91YmxlPiYpKQorCisvLyBsb3dlcl9ib3VuZAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcD4KK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3IF9Gb3J3YXJkSXRlcmF0b3IKK19fbG93ZXJfYm91bmQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlXywgX0NvbXBhcmUgX19jb21wKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIGRpZmZlcmVuY2VfdHlwZSBfX2xlbiA9IF9WU1REOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgIHdoaWxlIChfX2xlbiAhPSAwKQorICAgIHsKKyAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fbDIgPSBfX2xlbiAvIDI7CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19tID0gX19maXJzdDsKKyAgICAgICAgX1ZTVEQ6OmFkdmFuY2UoX19tLCBfX2wyKTsKKyAgICAgICAgaWYgKF9fY29tcCgqX19tLCBfX3ZhbHVlXykpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fZmlyc3QgPSArK19fbTsKKyAgICAgICAgICAgIF9fbGVuIC09IF9fbDIgKyAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fbGVuID0gX19sMjsKKyAgICB9CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK19Gb3J3YXJkSXRlcmF0b3IKK2xvd2VyX2JvdW5kKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWx1ZV8sIF9Db21wYXJlIF9fY29tcCkKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfX2RlYnVnX2xlc3M8X0NvbXBhcmU+ID46OnR5cGUgX0NvbXBfcmVmOworICAgIF9fZGVidWdfbGVzczxfQ29tcGFyZT4gX19jKF9fY29tcCk7CisgICAgcmV0dXJuIF9fbG93ZXJfYm91bmQ8X0NvbXBfcmVmPihfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsdWVfLCBfX2MpOworI2Vsc2UgIC8vIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9Db21wYXJlPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgcmV0dXJuIF9fbG93ZXJfYm91bmQ8X0NvbXBfcmVmPihfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsdWVfLCBfX2NvbXApOworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworX0ZvcndhcmRJdGVyYXRvcgorbG93ZXJfYm91bmQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlXykKK3sKKyAgICByZXR1cm4gX1ZTVEQ6Omxvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWx1ZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGVzczx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUsIF9UcD4oKSk7Cit9CisKKy8vIHVwcGVyX2JvdW5kCisKK3RlbXBsYXRlIDxjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX1RwPgorX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcgX0ZvcndhcmRJdGVyYXRvcgorX191cHBlcl9ib3VuZChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsdWVfLCBfQ29tcGFyZSBfX2NvbXApCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbGVuID0gX1ZTVEQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgd2hpbGUgKF9fbGVuICE9IDApCisgICAgeworICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19sMiA9IF9fbGVuIC8gMjsKKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX20gPSBfX2ZpcnN0OworICAgICAgICBfVlNURDo6YWR2YW5jZShfX20sIF9fbDIpOworICAgICAgICBpZiAoX19jb21wKF9fdmFsdWVfLCAqX19tKSkKKyAgICAgICAgICAgIF9fbGVuID0gX19sMjsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfX2ZpcnN0ID0gKytfX207CisgICAgICAgICAgICBfX2xlbiAtPSBfX2wyICsgMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19maXJzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworX0ZvcndhcmRJdGVyYXRvcgordXBwZXJfYm91bmQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlXywgX0NvbXBhcmUgX19jb21wKQoreworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9fZGVidWdfbGVzczxfQ29tcGFyZT4gPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgX19kZWJ1Z19sZXNzPF9Db21wYXJlPiBfX2MoX19jb21wKTsKKyAgICByZXR1cm4gX191cHBlcl9ib3VuZDxfQ29tcF9yZWY+KF9fZmlyc3QsIF9fbGFzdCwgX192YWx1ZV8sIF9fYyk7CisjZWxzZSAgLy8gX0xJQkNQUF9ERUJVRworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X0NvbXBhcmU+Ojp0eXBlIF9Db21wX3JlZjsKKyAgICByZXR1cm4gX191cHBlcl9ib3VuZDxfQ29tcF9yZWY+KF9fZmlyc3QsIF9fbGFzdCwgX192YWx1ZV8sIF9fY29tcCk7CisjZW5kaWYgIC8vIF9MSUJDUFBfREVCVUcKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3CitfRm9yd2FyZEl0ZXJhdG9yCit1cHBlcl9ib3VuZChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsdWVfKQoreworICAgIHJldHVybiBfVlNURDo6dXBwZXJfYm91bmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbHVlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19sZXNzPF9UcCwgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPigpKTsKK30KKworLy8gZXF1YWxfcmFuZ2UKKwordGVtcGxhdGUgPGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfVHA+CitfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNyBwYWlyPF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3I+CitfX2VxdWFsX3JhbmdlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWx1ZV8sIF9Db21wYXJlIF9fY29tcCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19sZW4gPSBfVlNURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICB3aGlsZSAoX19sZW4gIT0gMCkKKyAgICB7CisgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2wyID0gX19sZW4gLyAyOworICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbSA9IF9fZmlyc3Q7CisgICAgICAgIF9WU1REOjphZHZhbmNlKF9fbSwgX19sMik7CisgICAgICAgIGlmIChfX2NvbXAoKl9fbSwgX192YWx1ZV8pKQorICAgICAgICB7CisgICAgICAgICAgICBfX2ZpcnN0ID0gKytfX207CisgICAgICAgICAgICBfX2xlbiAtPSBfX2wyICsgMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChfX2NvbXAoX192YWx1ZV8sICpfX20pKQorICAgICAgICB7CisgICAgICAgICAgICBfX2xhc3QgPSBfX207CisgICAgICAgICAgICBfX2xlbiA9IF9fbDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbXAxID0gX19tOworICAgICAgICAgICAgcmV0dXJuIHBhaXI8X0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICAgX19sb3dlcl9ib3VuZDxfQ29tcGFyZT4oX19maXJzdCwgX19tLCBfX3ZhbHVlXywgX19jb21wKSwKKyAgICAgICAgICAgICAgICAgICAgICBfX3VwcGVyX2JvdW5kPF9Db21wYXJlPigrK19fbXAxLCBfX2xhc3QsIF9fdmFsdWVfLCBfX2NvbXApCisgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcGFpcjxfRm9yd2FyZEl0ZXJhdG9yLCBfRm9yd2FyZEl0ZXJhdG9yPihfX2ZpcnN0LCBfX2ZpcnN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworcGFpcjxfRm9yd2FyZEl0ZXJhdG9yLCBfRm9yd2FyZEl0ZXJhdG9yPgorZXF1YWxfcmFuZ2UoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlXywgX0NvbXBhcmUgX19jb21wKQoreworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9fZGVidWdfbGVzczxfQ29tcGFyZT4gPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgX19kZWJ1Z19sZXNzPF9Db21wYXJlPiBfX2MoX19jb21wKTsKKyAgICByZXR1cm4gX19lcXVhbF9yYW5nZTxfQ29tcF9yZWY+KF9fZmlyc3QsIF9fbGFzdCwgX192YWx1ZV8sIF9fYyk7CisjZWxzZSAgLy8gX0xJQkNQUF9ERUJVRworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X0NvbXBhcmU+Ojp0eXBlIF9Db21wX3JlZjsKKyAgICByZXR1cm4gX19lcXVhbF9yYW5nZTxfQ29tcF9yZWY+KF9fZmlyc3QsIF9fbGFzdCwgX192YWx1ZV8sIF9fY29tcCk7CisjZW5kaWYgIC8vIF9MSUJDUFBfREVCVUcKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3CitwYWlyPF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3I+CitlcXVhbF9yYW5nZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsdWVfKQoreworICAgIHJldHVybiBfVlNURDo6ZXF1YWxfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBfX3ZhbHVlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19sZXNzPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwgX1RwPigpKTsKK30KKworLy8gYmluYXJ5X3NlYXJjaAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3Citib29sCitfX2JpbmFyeV9zZWFyY2goX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlXywgX0NvbXBhcmUgX19jb21wKQoreworICAgIF9fZmlyc3QgPSBfX2xvd2VyX2JvdW5kPF9Db21wYXJlPihfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsdWVfLCBfX2NvbXApOworICAgIHJldHVybiBfX2ZpcnN0ICE9IF9fbGFzdCAmJiAhX19jb21wKF9fdmFsdWVfLCAqX19maXJzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK2Jvb2wKK2JpbmFyeV9zZWFyY2goX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlXywgX0NvbXBhcmUgX19jb21wKQoreworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9fZGVidWdfbGVzczxfQ29tcGFyZT4gPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgX19kZWJ1Z19sZXNzPF9Db21wYXJlPiBfX2MoX19jb21wKTsKKyAgICByZXR1cm4gX19iaW5hcnlfc2VhcmNoPF9Db21wX3JlZj4oX19maXJzdCwgX19sYXN0LCBfX3ZhbHVlXywgX19jKTsKKyNlbHNlICAvLyBfTElCQ1BQX0RFQlVHCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfQ29tcGFyZT46OnR5cGUgX0NvbXBfcmVmOworICAgIHJldHVybiBfX2JpbmFyeV9zZWFyY2g8X0NvbXBfcmVmPihfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsdWVfLCBfX2NvbXApOworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworYm9vbAorYmluYXJ5X3NlYXJjaChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsdWVfKQoreworICAgIHJldHVybiBfVlNURDo6YmluYXJ5X3NlYXJjaChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsdWVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2xlc3M8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLCBfVHA+KCkpOworfQorCisvLyBtZXJnZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yMSwgY2xhc3MgX0lucHV0SXRlcmF0b3IyLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitfT3V0cHV0SXRlcmF0b3IKK19fbWVyZ2UoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApCit7CisgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19yZXN1bHQpCisgICAgeworICAgICAgICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKyAgICAgICAgICAgIHJldHVybiBfVlNURDo6Y29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpOworICAgICAgICBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkKKyAgICAgICAgeworICAgICAgICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QyOworICAgICAgICAgICAgKytfX2ZpcnN0MjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKyAgICAgICAgICAgICsrX19maXJzdDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9WU1REOjpjb3B5KF9fZmlyc3QyLCBfX2xhc3QyLCBfX3Jlc3VsdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcjEsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yMiwgY2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfT3V0cHV0SXRlcmF0b3IKK21lcmdlKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfX2RlYnVnX2xlc3M8X0NvbXBhcmU+ID46OnR5cGUgX0NvbXBfcmVmOworICAgIF9fZGVidWdfbGVzczxfQ29tcGFyZT4gX19jKF9fY29tcCk7CisgICAgcmV0dXJuIF9WU1REOjpfX21lcmdlPF9Db21wX3JlZj4oX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX3Jlc3VsdCwgX19jKTsKKyNlbHNlICAvLyBfTElCQ1BQX0RFQlVHCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfQ29tcGFyZT46OnR5cGUgX0NvbXBfcmVmOworICAgIHJldHVybiBfVlNURDo6X19tZXJnZTxfQ29tcF9yZWY+KF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQsIF9fY29tcCk7CisjZW5kaWYgIC8vIF9MSUJDUFBfREVCVUcKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yMSwgY2xhc3MgX0lucHV0SXRlcmF0b3IyLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX091dHB1dEl0ZXJhdG9yCittZXJnZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorICAgICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUgX192MTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlIF9fdjI7CisgICAgcmV0dXJuIG1lcmdlKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQsIF9fbGVzczxfX3YxLCBfX3YyPigpKTsKK30KKworLy8gaW5wbGFjZV9tZXJnZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yMSwgY2xhc3MgX0lucHV0SXRlcmF0b3IyLAorICAgICAgICAgIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK3ZvaWQgX19oYWxmX2lucGxhY2VfbWVyZ2UoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApCit7CisgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19yZXN1bHQpCisgICAgeworICAgICAgICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKyAgICAgICAgeworICAgICAgICAgICAgX1ZTVEQ6Om1vdmUoX19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQorICAgICAgICB7CisgICAgICAgICAgICAqX19yZXN1bHQgPSBfVlNURDo6bW92ZSgqX19maXJzdDIpOworICAgICAgICAgICAgKytfX2ZpcnN0MjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpfX3Jlc3VsdCA9IF9WU1REOjptb3ZlKCpfX2ZpcnN0MSk7CisgICAgICAgICAgICArK19fZmlyc3QxOworICAgICAgICB9CisgICAgfQorICAgIC8vIF9fZmlyc3QyIHRocm91Z2ggX19sYXN0MiBhcmUgYWxyZWFkeSBpbiB0aGUgcmlnaHQgc3BvdC4KK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgordm9pZAorX19idWZmZXJlZF9pbnBsYWNlX21lcmdlKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX21pZGRsZSwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wLCB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBfX2xlbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBfX2xlbjIsCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+Ojp2YWx1ZV90eXBlKiBfX2J1ZmYpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICBfX2Rlc3RydWN0X24gX19kKDApOworICAgIHVuaXF1ZV9wdHI8dmFsdWVfdHlwZSwgX19kZXN0cnVjdF9uJj4gX19oMihfX2J1ZmYsIF9fZCk7CisgICAgaWYgKF9fbGVuMSA8PSBfX2xlbjIpCisgICAgeworICAgICAgICB2YWx1ZV90eXBlKiBfX3AgPSBfX2J1ZmY7CisgICAgICAgIGZvciAoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OyBfX2kgIT0gX19taWRkbGU7IF9fZC5fX2luY3IoKHZhbHVlX3R5cGUqKTApLCAodm9pZCkgKytfX2ksICsrX19wKQorICAgICAgICAgICAgOjpuZXcoX19wKSB2YWx1ZV90eXBlKF9WU1REOjptb3ZlKCpfX2kpKTsKKyAgICAgICAgX19oYWxmX2lucGxhY2VfbWVyZ2UoX19idWZmLCBfX3AsIF9fbWlkZGxlLCBfX2xhc3QsIF9fZmlyc3QsIF9fY29tcCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZhbHVlX3R5cGUqIF9fcCA9IF9fYnVmZjsKKyAgICAgICAgZm9yIChfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9faSA9IF9fbWlkZGxlOyBfX2kgIT0gX19sYXN0OyBfX2QuX19pbmNyKCh2YWx1ZV90eXBlKikwKSwgKHZvaWQpICsrX19pLCArK19fcCkKKyAgICAgICAgICAgIDo6bmV3KF9fcCkgdmFsdWVfdHlwZShfVlNURDo6bW92ZSgqX19pKSk7CisgICAgICAgIHR5cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPiBfUkJpOworICAgICAgICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8dmFsdWVfdHlwZSo+IF9SdjsKKyAgICAgICAgX19oYWxmX2lucGxhY2VfbWVyZ2UoX1J2KF9fcCksIF9SdihfX2J1ZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUkJpKF9fbWlkZGxlKSwgX1JCaShfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JCaShfX2xhc3QpLCBfX2ludmVydDxfQ29tcGFyZT4oX19jb21wKSk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+Cit2b2lkCitfX2lucGxhY2VfbWVyZ2UoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbWlkZGxlLCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXAsIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9fbGVuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9fbGVuMiwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGUqIF9fYnVmZiwgcHRyZGlmZl90IF9fYnVmZl9zaXplKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgICAgLy8gaWYgX19taWRkbGUgPT0gX19sYXN0LCB3ZSdyZSBkb25lCisgICAgICAgIGlmIChfX2xlbjIgPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKF9fbGVuMSA8PSBfX2J1ZmZfc2l6ZSB8fCBfX2xlbjIgPD0gX19idWZmX3NpemUpCisgICAgICAgICAgICByZXR1cm4gX19idWZmZXJlZF9pbnBsYWNlX21lcmdlPF9Db21wYXJlPgorICAgICAgICAgICAgICAgICAgIChfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LCBfX2NvbXAsIF9fbGVuMSwgX19sZW4yLCBfX2J1ZmYpOworICAgICAgICAvLyBzaHJpbmsgW19fZmlyc3QsIF9fbWlkZGxlKSBhcyBtdWNoIGFzIHBvc3NpYmxlICh3aXRoIG5vIG1vdmVzKSwgcmV0dXJuaW5nIGlmIGl0IHNocmlua3MgdG8gMAorICAgICAgICBmb3IgKDsgdHJ1ZTsgKytfX2ZpcnN0LCAodm9pZCkgLS1fX2xlbjEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX2xlbjEgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBpZiAoX19jb21wKCpfX21pZGRsZSwgKl9fZmlyc3QpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIF9fZmlyc3QgPCBfX21pZGRsZSA8IF9fbGFzdAorICAgICAgICAvLyAqX19maXJzdCA+ICpfX21pZGRsZQorICAgICAgICAvLyBwYXJ0aXRpb24gW19fZmlyc3QsIF9fbTEpIFtfX20xLCBfX21pZGRsZSkgW19fbWlkZGxlLCBfX20yKSBbX19tMiwgX19sYXN0KSBzdWNoIHRoYXQKKyAgICAgICAgLy8gICAgIGFsbCBlbGVtZW50cyBpbjoKKyAgICAgICAgLy8gICAgICAgICBbX19maXJzdCwgX19tMSkgIDw9IFtfX21pZGRsZSwgX19tMikKKyAgICAgICAgLy8gICAgICAgICBbX19taWRkbGUsIF9fbTIpIDwgIFtfX20xLCBfX21pZGRsZSkKKyAgICAgICAgLy8gICAgICAgICBbX19tMSwgX19taWRkbGUpIDw9IFtfX20yLCBfX2xhc3QpCisgICAgICAgIC8vICAgICBhbmQgX19tMSBvciBfX20yIGlzIGluIHRoZSBtaWRkbGUgb2YgaXRzIHJhbmdlCisgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19tMTsgIC8vICJtZWRpYW4iIG9mIFtfX2ZpcnN0LCBfX21pZGRsZSkKKyAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX20yOyAgLy8gIm1lZGlhbiIgb2YgW19fbWlkZGxlLCBfX2xhc3QpCisgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2xlbjExOyAgICAgIC8vIGRpc3RhbmNlKF9fZmlyc3QsIF9fbTEpCisgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2xlbjIxOyAgICAgIC8vIGRpc3RhbmNlKF9fbWlkZGxlLCBfX20yKQorICAgICAgICAvLyBiaW5hcnkgc2VhcmNoIHNtYWxsZXIgcmFuZ2UKKyAgICAgICAgaWYgKF9fbGVuMSA8IF9fbGVuMikKKyAgICAgICAgeyAgIC8vIF9fbGVuID49IDEsIF9fbGVuMiA+PSAyCisgICAgICAgICAgICBfX2xlbjIxID0gX19sZW4yIC8gMjsKKyAgICAgICAgICAgIF9fbTIgPSBfX21pZGRsZTsKKyAgICAgICAgICAgIF9WU1REOjphZHZhbmNlKF9fbTIsIF9fbGVuMjEpOworICAgICAgICAgICAgX19tMSA9IF9fdXBwZXJfYm91bmQ8X0NvbXBhcmU+KF9fZmlyc3QsIF9fbWlkZGxlLCAqX19tMiwgX19jb21wKTsKKyAgICAgICAgICAgIF9fbGVuMTEgPSBfVlNURDo6ZGlzdGFuY2UoX19maXJzdCwgX19tMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX19sZW4xID09IDEpCisgICAgICAgICAgICB7ICAgLy8gX19sZW4xID49IF9fbGVuMiAmJiBfX2xlbjIgPiAwLCB0aGVyZWZvcmUgX19sZW4yID09IDEKKyAgICAgICAgICAgICAgICAvLyBJdCBpcyBrbm93biAqX19maXJzdCA+ICpfX21pZGRsZQorICAgICAgICAgICAgICAgIHN3YXAoKl9fZmlyc3QsICpfX21pZGRsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gX19sZW4xID49IDIsIF9fbGVuMiA+PSAxCisgICAgICAgICAgICBfX2xlbjExID0gX19sZW4xIC8gMjsKKyAgICAgICAgICAgIF9fbTEgPSBfX2ZpcnN0OworICAgICAgICAgICAgX1ZTVEQ6OmFkdmFuY2UoX19tMSwgX19sZW4xMSk7CisgICAgICAgICAgICBfX20yID0gX19sb3dlcl9ib3VuZDxfQ29tcGFyZT4oX19taWRkbGUsIF9fbGFzdCwgKl9fbTEsIF9fY29tcCk7CisgICAgICAgICAgICBfX2xlbjIxID0gX1ZTVEQ6OmRpc3RhbmNlKF9fbWlkZGxlLCBfX20yKTsKKyAgICAgICAgfQorICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19sZW4xMiA9IF9fbGVuMSAtIF9fbGVuMTE7ICAvLyBkaXN0YW5jZShfX20xLCBfX21pZGRsZSkKKyAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fbGVuMjIgPSBfX2xlbjIgLSBfX2xlbjIxOyAgLy8gZGlzdGFuY2UoX19tMiwgX19sYXN0KQorICAgICAgICAvLyBbX19maXJzdCwgX19tMSkgW19fbTEsIF9fbWlkZGxlKSBbX19taWRkbGUsIF9fbTIpIFtfX20yLCBfX2xhc3QpCisgICAgICAgIC8vIHN3YXAgbWlkZGxlIHR3byBwYXJ0aXRpb25zCisgICAgICAgIF9fbWlkZGxlID0gX1ZTVEQ6OnJvdGF0ZShfX20xLCBfX21pZGRsZSwgX19tMik7CisgICAgICAgIC8vIF9fbGVuMTIgYW5kIF9fbGVuMjEgbm93IGhhdmUgc3dhcHBlZCBtZWFuaW5ncworICAgICAgICAvLyBtZXJnZSBzbWFsbGVyIHJhbmdlIHdpdGggcmVjdXJpc3ZlIGNhbGwgYW5kIGxhcmdlciB3aXRoIHRhaWwgcmVjdXJzaW9uIGVsaW1pbmF0aW9uCisgICAgICAgIGlmIChfX2xlbjExICsgX19sZW4yMSA8IF9fbGVuMTIgKyBfX2xlbjIyKQorICAgICAgICB7CisgICAgICAgICAgICBfX2lucGxhY2VfbWVyZ2U8X0NvbXBhcmU+KF9fZmlyc3QsIF9fbTEsIF9fbWlkZGxlLCBfX2NvbXAsIF9fbGVuMTEsIF9fbGVuMjEsIF9fYnVmZiwgX19idWZmX3NpemUpOworLy8gICAgICAgICAgX19pbnBsYWNlX21lcmdlPF9Db21wYXJlPihfX21pZGRsZSwgX19tMiwgX19sYXN0LCBfX2NvbXAsIF9fbGVuMTIsIF9fbGVuMjIsIF9fYnVmZiwgX19idWZmX3NpemUpOworICAgICAgICAgICAgX19maXJzdCA9IF9fbWlkZGxlOworICAgICAgICAgICAgX19taWRkbGUgPSBfX20yOworICAgICAgICAgICAgX19sZW4xID0gX19sZW4xMjsKKyAgICAgICAgICAgIF9fbGVuMiA9IF9fbGVuMjI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfX2lucGxhY2VfbWVyZ2U8X0NvbXBhcmU+KF9fbWlkZGxlLCBfX20yLCBfX2xhc3QsIF9fY29tcCwgX19sZW4xMiwgX19sZW4yMiwgX19idWZmLCBfX2J1ZmZfc2l6ZSk7CisvLyAgICAgICAgICBfX2lucGxhY2VfbWVyZ2U8X0NvbXBhcmU+KF9fZmlyc3QsIF9fbTEsIF9fbWlkZGxlLCBfX2NvbXAsIF9fbGVuMTEsIF9fbGVuMjEsIF9fYnVmZiwgX19idWZmX3NpemUpOworICAgICAgICAgICAgX19sYXN0ID0gX19taWRkbGU7CisgICAgICAgICAgICBfX21pZGRsZSA9IF9fbTE7CisgICAgICAgICAgICBfX2xlbjEgPSBfX2xlbjExOworICAgICAgICAgICAgX19sZW4yID0gX19sZW4yMTsKKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9Db21wYXJlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK2lucGxhY2VfbWVyZ2UoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbWlkZGxlLCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbGVuMSA9IF9WU1REOjpkaXN0YW5jZShfX2ZpcnN0LCBfX21pZGRsZSk7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbGVuMiA9IF9WU1REOjpkaXN0YW5jZShfX21pZGRsZSwgX19sYXN0KTsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19idWZfc2l6ZSA9IF9WU1REOjptaW4oX19sZW4xLCBfX2xlbjIpOworICAgIHBhaXI8dmFsdWVfdHlwZSosIHB0cmRpZmZfdD4gX19idWYgPSBfVlNURDo6Z2V0X3RlbXBvcmFyeV9idWZmZXI8dmFsdWVfdHlwZT4oX19idWZfc2l6ZSk7CisgICAgdW5pcXVlX3B0cjx2YWx1ZV90eXBlLCBfX3JldHVybl90ZW1wb3JhcnlfYnVmZmVyPiBfX2goX19idWYuZmlyc3QpOworCisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X19kZWJ1Z19sZXNzPF9Db21wYXJlPiA+Ojp0eXBlIF9Db21wX3JlZjsKKyAgICBfX2RlYnVnX2xlc3M8X0NvbXBhcmU+IF9fYyhfX2NvbXApOworICAgIHJldHVybiBfVlNURDo6X19pbnBsYWNlX21lcmdlPF9Db21wX3JlZj4oX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX19jLCBfX2xlbjEsIF9fbGVuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19idWYuZmlyc3QsIF9fYnVmLnNlY29uZCk7CisjZWxzZSAgLy8gX0xJQkNQUF9ERUJVRworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X0NvbXBhcmU+Ojp0eXBlIF9Db21wX3JlZjsKKyAgICByZXR1cm4gX1ZTVEQ6Ol9faW5wbGFjZV9tZXJnZTxfQ29tcF9yZWY+KF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsIF9fY29tcCwgX19sZW4xLCBfX2xlbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVmLmZpcnN0LCBfX2J1Zi5zZWNvbmQpOworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK2lucGxhY2VfbWVyZ2UoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbWlkZGxlLCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBfVlNURDo6aW5wbGFjZV9tZXJnZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgX19sZXNzPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4oKSk7Cit9CisKKy8vIHN0YWJsZV9zb3J0CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0lucHV0SXRlcmF0b3IxLCBjbGFzcyBfSW5wdXRJdGVyYXRvcjI+Cit2b2lkCitfX21lcmdlX21vdmVfY29uc3RydWN0KF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsCisgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlKiBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICBfX2Rlc3RydWN0X24gX19kKDApOworICAgIHVuaXF1ZV9wdHI8dmFsdWVfdHlwZSwgX19kZXN0cnVjdF9uJj4gX19oKF9fcmVzdWx0LCBfX2QpOworICAgIGZvciAoOyB0cnVlOyArK19fcmVzdWx0KQorICAgIHsKKyAgICAgICAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoOyBfX2ZpcnN0MiAhPSBfX2xhc3QyOyArK19fZmlyc3QyLCArK19fcmVzdWx0LCBfX2QuX19pbmNyKCh2YWx1ZV90eXBlKikwKSkKKyAgICAgICAgICAgICAgICA6Om5ldyAoX19yZXN1bHQpIHZhbHVlX3R5cGUoX1ZTVEQ6Om1vdmUoKl9fZmlyc3QyKSk7CisgICAgICAgICAgICBfX2gucmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX3Jlc3VsdCwgX19kLl9faW5jcigodmFsdWVfdHlwZSopMCkpCisgICAgICAgICAgICAgICAgOjpuZXcgKF9fcmVzdWx0KSB2YWx1ZV90eXBlKF9WU1REOjptb3ZlKCpfX2ZpcnN0MSkpOworICAgICAgICAgICAgX19oLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkKKyAgICAgICAgeworICAgICAgICAgICAgOjpuZXcgKF9fcmVzdWx0KSB2YWx1ZV90eXBlKF9WU1REOjptb3ZlKCpfX2ZpcnN0MikpOworICAgICAgICAgICAgX19kLl9faW5jcigodmFsdWVfdHlwZSopMCk7CisgICAgICAgICAgICArK19fZmlyc3QyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgOjpuZXcgKF9fcmVzdWx0KSB2YWx1ZV90eXBlKF9WU1REOjptb3ZlKCpfX2ZpcnN0MSkpOworICAgICAgICAgICAgX19kLl9faW5jcigodmFsdWVfdHlwZSopMCk7CisgICAgICAgICAgICArK19fZmlyc3QxOworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yMSwgY2xhc3MgX0lucHV0SXRlcmF0b3IyLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+Cit2b2lkCitfX21lcmdlX21vdmVfYXNzaWduKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsCisgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKQoreworICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fcmVzdWx0KQorICAgIHsKKyAgICAgICAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fcmVzdWx0KQorICAgICAgICAgICAgICAgICpfX3Jlc3VsdCA9IF9WU1REOjptb3ZlKCpfX2ZpcnN0MSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpfX3Jlc3VsdCA9IF9WU1REOjptb3ZlKCpfX2ZpcnN0Mik7CisgICAgICAgICAgICArK19fZmlyc3QyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKl9fcmVzdWx0ID0gX1ZTVEQ6Om1vdmUoKl9fZmlyc3QxKTsKKyAgICAgICAgICAgICsrX19maXJzdDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yICg7IF9fZmlyc3QyICE9IF9fbGFzdDI7ICsrX19maXJzdDIsICsrX19yZXN1bHQpCisgICAgICAgICpfX3Jlc3VsdCA9IF9WU1REOjptb3ZlKCpfX2ZpcnN0Mik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgordm9pZAorX19zdGFibGVfc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wLAorICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9fbGVuLAorICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZSogX19idWZmLCBwdHJkaWZmX3QgX19idWZmX3NpemUpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KK3ZvaWQKK19fc3RhYmxlX3NvcnRfbW92ZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdDEsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QxLCBfQ29tcGFyZSBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBfX2xlbiwKKyAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZSogX19maXJzdDIpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHN3aXRjaCAoX19sZW4pCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgMToKKyAgICAgICAgOjpuZXcoX19maXJzdDIpIHZhbHVlX3R5cGUoX1ZTVEQ6Om1vdmUoKl9fZmlyc3QxKSk7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIDI6CisgICAgICAgIF9fZGVzdHJ1Y3RfbiBfX2QoMCk7CisgICAgICAgIHVuaXF1ZV9wdHI8dmFsdWVfdHlwZSwgX19kZXN0cnVjdF9uJj4gX19oMihfX2ZpcnN0MiwgX19kKTsKKyAgICAgICAgaWYgKF9fY29tcCgqLS1fX2xhc3QxLCAqX19maXJzdDEpKQorICAgICAgICB7CisgICAgICAgICAgICA6Om5ldyhfX2ZpcnN0MikgdmFsdWVfdHlwZShfVlNURDo6bW92ZSgqX19sYXN0MSkpOworICAgICAgICAgICAgX19kLl9faW5jcigodmFsdWVfdHlwZSopMCk7CisgICAgICAgICAgICArK19fZmlyc3QyOworICAgICAgICAgICAgOjpuZXcoX19maXJzdDIpIHZhbHVlX3R5cGUoX1ZTVEQ6Om1vdmUoKl9fZmlyc3QxKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICA6Om5ldyhfX2ZpcnN0MikgdmFsdWVfdHlwZShfVlNURDo6bW92ZSgqX19maXJzdDEpKTsKKyAgICAgICAgICAgIF9fZC5fX2luY3IoKHZhbHVlX3R5cGUqKTApOworICAgICAgICAgICAgKytfX2ZpcnN0MjsKKyAgICAgICAgICAgIDo6bmV3KF9fZmlyc3QyKSB2YWx1ZV90eXBlKF9WU1REOjptb3ZlKCpfX2xhc3QxKSk7CisgICAgICAgIH0KKyAgICAgICAgX19oMi5yZWxlYXNlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKF9fbGVuIDw9IDgpCisgICAgeworICAgICAgICBfX2luc2VydGlvbl9zb3J0X21vdmU8X0NvbXBhcmU+KF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19jb21wKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9fbDIgPSBfX2xlbiAvIDI7CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbSA9IF9fZmlyc3QxICsgX19sMjsKKyAgICBfX3N0YWJsZV9zb3J0PF9Db21wYXJlPihfX2ZpcnN0MSwgX19tLCBfX2NvbXAsIF9fbDIsIF9fZmlyc3QyLCBfX2wyKTsKKyAgICBfX3N0YWJsZV9zb3J0PF9Db21wYXJlPihfX20sIF9fbGFzdDEsIF9fY29tcCwgX19sZW4gLSBfX2wyLCBfX2ZpcnN0MiArIF9fbDIsIF9fbGVuIC0gX19sMik7CisgICAgX19tZXJnZV9tb3ZlX2NvbnN0cnVjdDxfQ29tcGFyZT4oX19maXJzdDEsIF9fbSwgX19tLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19jb21wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX3N0YWJsZV9zb3J0X3N3aXRjaAoreworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCB2YWx1ZSA9IDEyOCppc190cml2aWFsbHlfY29weV9hc3NpZ25hYmxlPF9UcD46OnZhbHVlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Cit2b2lkCitfX3N0YWJsZV9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXAsCisgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgX19sZW4sCisgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlKiBfX2J1ZmYsIHB0cmRpZmZfdCBfX2J1ZmZfc2l6ZSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICBzd2l0Y2ggKF9fbGVuKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgY2FzZSAxOgorICAgICAgICByZXR1cm47CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoX19jb21wKCotLV9fbGFzdCwgKl9fZmlyc3QpKQorICAgICAgICAgICAgc3dhcCgqX19maXJzdCwgKl9fbGFzdCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKF9fbGVuIDw9IHN0YXRpY19jYXN0PGRpZmZlcmVuY2VfdHlwZT4oX19zdGFibGVfc29ydF9zd2l0Y2g8dmFsdWVfdHlwZT46OnZhbHVlKSkKKyAgICB7CisgICAgICAgIF9faW5zZXJ0aW9uX3NvcnQ8X0NvbXBhcmU+KF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9fbDIgPSBfX2xlbiAvIDI7CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbSA9IF9fZmlyc3QgKyBfX2wyOworICAgIGlmIChfX2xlbiA8PSBfX2J1ZmZfc2l6ZSkKKyAgICB7CisgICAgICAgIF9fZGVzdHJ1Y3RfbiBfX2QoMCk7CisgICAgICAgIHVuaXF1ZV9wdHI8dmFsdWVfdHlwZSwgX19kZXN0cnVjdF9uJj4gX19oMihfX2J1ZmYsIF9fZCk7CisgICAgICAgIF9fc3RhYmxlX3NvcnRfbW92ZTxfQ29tcGFyZT4oX19maXJzdCwgX19tLCBfX2NvbXAsIF9fbDIsIF9fYnVmZik7CisgICAgICAgIF9fZC5fX3NldChfX2wyLCAodmFsdWVfdHlwZSopMCk7CisgICAgICAgIF9fc3RhYmxlX3NvcnRfbW92ZTxfQ29tcGFyZT4oX19tLCBfX2xhc3QsIF9fY29tcCwgX19sZW4gLSBfX2wyLCBfX2J1ZmYgKyBfX2wyKTsKKyAgICAgICAgX19kLl9fc2V0KF9fbGVuLCAodmFsdWVfdHlwZSopMCk7CisgICAgICAgIF9fbWVyZ2VfbW92ZV9hc3NpZ248X0NvbXBhcmU+KF9fYnVmZiwgX19idWZmICsgX19sMiwgX19idWZmICsgX19sMiwgX19idWZmICsgX19sZW4sIF9fZmlyc3QsIF9fY29tcCk7CisvLyAgICAgICAgIF9fbWVyZ2U8X0NvbXBhcmU+KG1vdmVfaXRlcmF0b3I8dmFsdWVfdHlwZSo+KF9fYnVmZiksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVfaXRlcmF0b3I8dmFsdWVfdHlwZSo+KF9fYnVmZiArIF9fbDIpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlX2l0ZXJhdG9yPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4oX19idWZmICsgX19sMiksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPihfX2J1ZmYgKyBfX2xlbiksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmlyc3QsIF9fY29tcCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgX19zdGFibGVfc29ydDxfQ29tcGFyZT4oX19maXJzdCwgX19tLCBfX2NvbXAsIF9fbDIsIF9fYnVmZiwgX19idWZmX3NpemUpOworICAgIF9fc3RhYmxlX3NvcnQ8X0NvbXBhcmU+KF9fbSwgX19sYXN0LCBfX2NvbXAsIF9fbGVuIC0gX19sMiwgX19idWZmLCBfX2J1ZmZfc2l6ZSk7CisgICAgX19pbnBsYWNlX21lcmdlPF9Db21wYXJlPihfX2ZpcnN0LCBfX20sIF9fbGFzdCwgX19jb21wLCBfX2wyLCBfX2xlbiAtIF9fbDIsIF9fYnVmZiwgX19idWZmX3NpemUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzdGFibGVfc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIGRpZmZlcmVuY2VfdHlwZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgcGFpcjx2YWx1ZV90eXBlKiwgcHRyZGlmZl90PiBfX2J1ZigwLCAwKTsKKyAgICB1bmlxdWVfcHRyPHZhbHVlX3R5cGUsIF9fcmV0dXJuX3RlbXBvcmFyeV9idWZmZXI+IF9faDsKKyAgICBpZiAoX19sZW4gPiBzdGF0aWNfY2FzdDxkaWZmZXJlbmNlX3R5cGU+KF9fc3RhYmxlX3NvcnRfc3dpdGNoPHZhbHVlX3R5cGU+Ojp2YWx1ZSkpCisgICAgeworICAgICAgICBfX2J1ZiA9IF9WU1REOjpnZXRfdGVtcG9yYXJ5X2J1ZmZlcjx2YWx1ZV90eXBlPihfX2xlbik7CisgICAgICAgIF9faC5yZXNldChfX2J1Zi5maXJzdCk7CisgICAgfQorI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9fZGVidWdfbGVzczxfQ29tcGFyZT4gPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgX19kZWJ1Z19sZXNzPF9Db21wYXJlPiBfX2MoX19jb21wKTsKKyAgICBfX3N0YWJsZV9zb3J0PF9Db21wX3JlZj4oX19maXJzdCwgX19sYXN0LCBfX2MsIF9fbGVuLCBfX2J1Zi5maXJzdCwgX19idWYuc2Vjb25kKTsKKyNlbHNlICAvLyBfTElCQ1BQX0RFQlVHCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfQ29tcGFyZT46OnR5cGUgX0NvbXBfcmVmOworICAgIF9fc3RhYmxlX3NvcnQ8X0NvbXBfcmVmPihfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCwgX19sZW4sIF9fYnVmLmZpcnN0LCBfX2J1Zi5zZWNvbmQpOworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3RhYmxlX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCit7CisgICAgX1ZTVEQ6OnN0YWJsZV9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19sZXNzPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPigpKTsKK30KKworLy8gaXNfaGVhcF91bnRpbAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3IF9SYW5kb21BY2Nlc3NJdGVyYXRvcgoraXNfaGVhcF91bnRpbChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1ZTVEQ6Oml0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIGRpZmZlcmVuY2VfdHlwZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fcCA9IDA7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fYyA9IDE7CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcHAgPSBfX2ZpcnN0OworICAgIHdoaWxlIChfX2MgPCBfX2xlbikKKyAgICB7CisgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2NwID0gX19maXJzdCArIF9fYzsKKyAgICAgICAgaWYgKF9fY29tcCgqX19wcCwgKl9fY3ApKQorICAgICAgICAgICAgcmV0dXJuIF9fY3A7CisgICAgICAgICsrX19jOworICAgICAgICArK19fY3A7CisgICAgICAgIGlmIChfX2MgPT0gX19sZW4pCisgICAgICAgICAgICByZXR1cm4gX19sYXN0OworICAgICAgICBpZiAoX19jb21wKCpfX3BwLCAqX19jcCkpCisgICAgICAgICAgICByZXR1cm4gX19jcDsKKyAgICAgICAgKytfX3A7CisgICAgICAgICsrX19wcDsKKyAgICAgICAgX19jID0gMiAqIF9fcCArIDE7CisgICAgfQorICAgIHJldHVybiBfX2xhc3Q7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3CitfUmFuZG9tQWNjZXNzSXRlcmF0b3IKK2lzX2hlYXBfdW50aWwoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCit7CisgICAgcmV0dXJuIF9WU1REOjppc19oZWFwX3VudGlsKF9fZmlyc3QsIF9fbGFzdCwgX19sZXNzPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPigpKTsKK30KKworLy8gaXNfaGVhcAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3Citib29sCitpc19oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCit7CisgICAgcmV0dXJuIF9WU1REOjppc19oZWFwX3VudGlsKF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKSA9PSBfX2xhc3Q7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3Citib29sCitpc19oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQoreworICAgIHJldHVybiBfVlNURDo6aXNfaGVhcChfX2ZpcnN0LCBfX2xhc3QsIF9fbGVzczx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZT4oKSk7Cit9CisKKy8vIHB1c2hfaGVhcAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KK3ZvaWQKK19fc2lmdF91cChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wLAorICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgX19sZW4pCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIGlmIChfX2xlbiA+IDEpCisgICAgeworICAgICAgICBfX2xlbiA9IChfX2xlbiAtIDIpIC8gMjsKKyAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcHRyID0gX19maXJzdCArIF9fbGVuOworICAgICAgICBpZiAoX19jb21wKCpfX3B0ciwgKi0tX19sYXN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsdWVfdHlwZSBfX3QoX1ZTVEQ6Om1vdmUoKl9fbGFzdCkpOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqX19sYXN0ID0gX1ZTVEQ6Om1vdmUoKl9fcHRyKTsKKyAgICAgICAgICAgICAgICBfX2xhc3QgPSBfX3B0cjsKKyAgICAgICAgICAgICAgICBpZiAoX19sZW4gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgX19sZW4gPSAoX19sZW4gLSAxKSAvIDI7CisgICAgICAgICAgICAgICAgX19wdHIgPSBfX2ZpcnN0ICsgX19sZW47CisgICAgICAgICAgICB9IHdoaWxlIChfX2NvbXAoKl9fcHRyLCBfX3QpKTsKKyAgICAgICAgICAgICpfX2xhc3QgPSBfVlNURDo6bW92ZShfX3QpOworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitwdXNoX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfX2RlYnVnX2xlc3M8X0NvbXBhcmU+ID46OnR5cGUgX0NvbXBfcmVmOworICAgIF9fZGVidWdfbGVzczxfQ29tcGFyZT4gX19jKF9fY29tcCk7CisgICAgX19zaWZ0X3VwPF9Db21wX3JlZj4oX19maXJzdCwgX19sYXN0LCBfX2MsIF9fbGFzdCAtIF9fZmlyc3QpOworI2Vsc2UgIC8vIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9Db21wYXJlPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgX19zaWZ0X3VwPF9Db21wX3JlZj4oX19maXJzdCwgX19sYXN0LCBfX2NvbXAsIF9fbGFzdCAtIF9fZmlyc3QpOworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorcHVzaF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQoreworICAgIF9WU1REOjpwdXNoX2hlYXAoX19maXJzdCwgX19sYXN0LCBfX2xlc3M8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGU+KCkpOworfQorCisvLyBwb3BfaGVhcAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KK3ZvaWQKK19fc2lmdF9kb3duKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgLypfX2xhc3QqLywKKyAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCwKKyAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgX19sZW4sCisgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19zdGFydCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAvLyBsZWZ0LWNoaWxkIG9mIF9fc3RhcnQgaXMgYXQgMiAqIF9fc3RhcnQgKyAxCisgICAgLy8gcmlnaHQtY2hpbGQgb2YgX19zdGFydCBpcyBhdCAyICogX19zdGFydCArIDIKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19jaGlsZCA9IF9fc3RhcnQgLSBfX2ZpcnN0OworCisgICAgaWYgKF9fbGVuIDwgMiB8fCAoX19sZW4gLSAyKSAvIDIgPCBfX2NoaWxkKQorICAgICAgICByZXR1cm47CisKKyAgICBfX2NoaWxkID0gMiAqIF9fY2hpbGQgKyAxOworICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2NoaWxkX2kgPSBfX2ZpcnN0ICsgX19jaGlsZDsKKworICAgIGlmICgoX19jaGlsZCArIDEpIDwgX19sZW4gJiYgX19jb21wKCpfX2NoaWxkX2ksICooX19jaGlsZF9pICsgMSkpKSB7CisgICAgICAgIC8vIHJpZ2h0LWNoaWxkIGV4aXN0cyBhbmQgaXMgZ3JlYXRlciB0aGFuIGxlZnQtY2hpbGQKKyAgICAgICAgKytfX2NoaWxkX2k7CisgICAgICAgICsrX19jaGlsZDsKKyAgICB9CisKKyAgICAvLyBjaGVjayBpZiB3ZSBhcmUgaW4gaGVhcC1vcmRlcgorICAgIGlmIChfX2NvbXAoKl9fY2hpbGRfaSwgKl9fc3RhcnQpKQorICAgICAgICAvLyB3ZSBhcmUsIF9fc3RhcnQgaXMgbGFyZ2VyIHRoYW4gaXQncyBsYXJnZXN0IGNoaWxkCisgICAgICAgIHJldHVybjsKKworICAgIHZhbHVlX3R5cGUgX190b3AoX1ZTVEQ6Om1vdmUoKl9fc3RhcnQpKTsKKyAgICBkbworICAgIHsKKyAgICAgICAgLy8gd2UgYXJlIG5vdCBpbiBoZWFwLW9yZGVyLCBzd2FwIHRoZSBwYXJlbnQgd2l0aCBpdCdzIGxhcmdlc3QgY2hpbGQKKyAgICAgICAgKl9fc3RhcnQgPSBfVlNURDo6bW92ZSgqX19jaGlsZF9pKTsKKyAgICAgICAgX19zdGFydCA9IF9fY2hpbGRfaTsKKworICAgICAgICBpZiAoKF9fbGVuIC0gMikgLyAyIDwgX19jaGlsZCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vIHJlY29tcHV0ZSB0aGUgY2hpbGQgYmFzZWQgb2ZmIG9mIHRoZSB1cGRhdGVkIHBhcmVudAorICAgICAgICBfX2NoaWxkID0gMiAqIF9fY2hpbGQgKyAxOworICAgICAgICBfX2NoaWxkX2kgPSBfX2ZpcnN0ICsgX19jaGlsZDsKKworICAgICAgICBpZiAoKF9fY2hpbGQgKyAxKSA8IF9fbGVuICYmIF9fY29tcCgqX19jaGlsZF9pLCAqKF9fY2hpbGRfaSArIDEpKSkgeworICAgICAgICAgICAgLy8gcmlnaHQtY2hpbGQgZXhpc3RzIGFuZCBpcyBncmVhdGVyIHRoYW4gbGVmdC1jaGlsZAorICAgICAgICAgICAgKytfX2NoaWxkX2k7CisgICAgICAgICAgICArK19fY2hpbGQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBpZiB3ZSBhcmUgaW4gaGVhcC1vcmRlcgorICAgIH0gd2hpbGUgKCFfX2NvbXAoKl9fY2hpbGRfaSwgX190b3ApKTsKKyAgICAqX19zdGFydCA9IF9WU1REOjptb3ZlKF9fdG9wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorX19wb3BfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wLAorICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9fbGVuKQoreworICAgIGlmIChfX2xlbiA+IDEpCisgICAgeworICAgICAgICBzd2FwKCpfX2ZpcnN0LCAqLS1fX2xhc3QpOworICAgICAgICBfX3NpZnRfZG93bjxfQ29tcGFyZT4oX19maXJzdCwgX19sYXN0LCBfX2NvbXAsIF9fbGVuIC0gMSwgX19maXJzdCk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitwb3BfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQoreworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9fZGVidWdfbGVzczxfQ29tcGFyZT4gPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgX19kZWJ1Z19sZXNzPF9Db21wYXJlPiBfX2MoX19jb21wKTsKKyAgICBfX3BvcF9oZWFwPF9Db21wX3JlZj4oX19maXJzdCwgX19sYXN0LCBfX2MsIF9fbGFzdCAtIF9fZmlyc3QpOworI2Vsc2UgIC8vIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9Db21wYXJlPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgX19wb3BfaGVhcDxfQ29tcF9yZWY+KF9fZmlyc3QsIF9fbGFzdCwgX19jb21wLCBfX2xhc3QgLSBfX2ZpcnN0KTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9ERUJVRworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3BvcF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQoreworICAgIF9WU1REOjpwb3BfaGVhcChfX2ZpcnN0LCBfX2xhc3QsIF9fbGVzczx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZT4oKSk7Cit9CisKKy8vIG1ha2VfaGVhcAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KK3ZvaWQKK19fbWFrZV9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19sYXN0IC0gX19maXJzdDsKKyAgICBpZiAoX19uID4gMSkKKyAgICB7CisgICAgICAgIC8vIHN0YXJ0IGZyb20gdGhlIGZpcnN0IHBhcmVudCwgdGhlcmUgaXMgbm8gbmVlZCB0byBjb25zaWRlciBjaGlsZHJlbgorICAgICAgICBmb3IgKGRpZmZlcmVuY2VfdHlwZSBfX3N0YXJ0ID0gKF9fbiAtIDIpIC8gMjsgX19zdGFydCA+PSAwOyAtLV9fc3RhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fc2lmdF9kb3duPF9Db21wYXJlPihfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCwgX19uLCBfX2ZpcnN0ICsgX19zdGFydCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9Db21wYXJlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK21ha2VfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQoreworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9fZGVidWdfbGVzczxfQ29tcGFyZT4gPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgX19kZWJ1Z19sZXNzPF9Db21wYXJlPiBfX2MoX19jb21wKTsKKyAgICBfX21ha2VfaGVhcDxfQ29tcF9yZWY+KF9fZmlyc3QsIF9fbGFzdCwgX19jKTsKKyNlbHNlICAvLyBfTElCQ1BQX0RFQlVHCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfQ29tcGFyZT46OnR5cGUgX0NvbXBfcmVmOworICAgIF9fbWFrZV9oZWFwPF9Db21wX3JlZj4oX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorbWFrZV9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQoreworICAgIF9WU1REOjptYWtlX2hlYXAoX19maXJzdCwgX19sYXN0LCBfX2xlc3M8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGU+KCkpOworfQorCisvLyBzb3J0X2hlYXAKKwordGVtcGxhdGUgPGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Cit2b2lkCitfX3NvcnRfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgZm9yIChkaWZmZXJlbmNlX3R5cGUgX19uID0gX19sYXN0IC0gX19maXJzdDsgX19uID4gMTsgLS1fX2xhc3QsIC0tX19uKQorICAgICAgICBfX3BvcF9oZWFwPF9Db21wYXJlPihfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCwgX19uKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc29ydF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X19kZWJ1Z19sZXNzPF9Db21wYXJlPiA+Ojp0eXBlIF9Db21wX3JlZjsKKyAgICBfX2RlYnVnX2xlc3M8X0NvbXBhcmU+IF9fYyhfX2NvbXApOworICAgIF9fc29ydF9oZWFwPF9Db21wX3JlZj4oX19maXJzdCwgX19sYXN0LCBfX2MpOworI2Vsc2UgIC8vIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9Db21wYXJlPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgX19zb3J0X2hlYXA8X0NvbXBfcmVmPihfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCk7CisjZW5kaWYgIC8vIF9MSUJDUFBfREVCVUcKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzb3J0X2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCit7CisgICAgX1ZTVEQ6OnNvcnRfaGVhcChfX2ZpcnN0LCBfX2xhc3QsIF9fbGVzczx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZT4oKSk7Cit9CisKKy8vIHBhcnRpYWxfc29ydAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KK3ZvaWQKK19fcGFydGlhbF9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19taWRkbGUsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKQoreworICAgIF9fbWFrZV9oZWFwPF9Db21wYXJlPihfX2ZpcnN0LCBfX21pZGRsZSwgX19jb21wKTsKKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9fbGVuID0gX19taWRkbGUgLSBfX2ZpcnN0OworICAgIGZvciAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9faSA9IF9fbWlkZGxlOyBfX2kgIT0gX19sYXN0OyArK19faSkKKyAgICB7CisgICAgICAgIGlmIChfX2NvbXAoKl9faSwgKl9fZmlyc3QpKQorICAgICAgICB7CisgICAgICAgICAgICBzd2FwKCpfX2ksICpfX2ZpcnN0KTsKKyAgICAgICAgICAgIF9fc2lmdF9kb3duPF9Db21wYXJlPihfX2ZpcnN0LCBfX21pZGRsZSwgX19jb21wLCBfX2xlbiwgX19maXJzdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19zb3J0X2hlYXA8X0NvbXBhcmU+KF9fZmlyc3QsIF9fbWlkZGxlLCBfX2NvbXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitwYXJ0aWFsX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX21pZGRsZSwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApCit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X19kZWJ1Z19sZXNzPF9Db21wYXJlPiA+Ojp0eXBlIF9Db21wX3JlZjsKKyAgICBfX2RlYnVnX2xlc3M8X0NvbXBhcmU+IF9fYyhfX2NvbXApOworICAgIF9fcGFydGlhbF9zb3J0PF9Db21wX3JlZj4oX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX19jKTsKKyNlbHNlICAvLyBfTElCQ1BQX0RFQlVHCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfQ29tcGFyZT46OnR5cGUgX0NvbXBfcmVmOworICAgIF9fcGFydGlhbF9zb3J0PF9Db21wX3JlZj4oX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX19jb21wKTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9ERUJVRworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3BhcnRpYWxfc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbWlkZGxlLCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQoreworICAgIF9WU1REOjpwYXJ0aWFsX3NvcnQoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgX19sZXNzPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPigpKTsKK30KKworLy8gcGFydGlhbF9zb3J0X2NvcHkKKwordGVtcGxhdGUgPGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCitfX3BhcnRpYWxfc29ydF9jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcmVzdWx0X2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19yZXN1bHRfbGFzdCwgX0NvbXBhcmUgX19jb21wKQoreworICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3IgPSBfX3Jlc3VsdF9maXJzdDsKKyAgICBpZiAoX19yICE9IF9fcmVzdWx0X2xhc3QpCisgICAgeworICAgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19yICE9IF9fcmVzdWx0X2xhc3Q7ICh2b2lkKSArK19fZmlyc3QsICsrX19yKQorICAgICAgICAgICAgKl9fciA9ICpfX2ZpcnN0OworICAgICAgICBfX21ha2VfaGVhcDxfQ29tcGFyZT4oX19yZXN1bHRfZmlyc3QsIF9fciwgX19jb21wKTsKKyAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBfX2xlbiA9IF9fciAtIF9fcmVzdWx0X2ZpcnN0OworICAgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QsICpfX3Jlc3VsdF9maXJzdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKl9fcmVzdWx0X2ZpcnN0ID0gKl9fZmlyc3Q7CisgICAgICAgICAgICAgICAgX19zaWZ0X2Rvd248X0NvbXBhcmU+KF9fcmVzdWx0X2ZpcnN0LCBfX3IsIF9fY29tcCwgX19sZW4sIF9fcmVzdWx0X2ZpcnN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgX19zb3J0X2hlYXA8X0NvbXBhcmU+KF9fcmVzdWx0X2ZpcnN0LCBfX3IsIF9fY29tcCk7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfUmFuZG9tQWNjZXNzSXRlcmF0b3IKK3BhcnRpYWxfc29ydF9jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3Jlc3VsdF9maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcmVzdWx0X2xhc3QsIF9Db21wYXJlIF9fY29tcCkKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfX2RlYnVnX2xlc3M8X0NvbXBhcmU+ID46OnR5cGUgX0NvbXBfcmVmOworICAgIF9fZGVidWdfbGVzczxfQ29tcGFyZT4gX19jKF9fY29tcCk7CisgICAgcmV0dXJuIF9fcGFydGlhbF9zb3J0X2NvcHk8X0NvbXBfcmVmPihfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9sYXN0LCBfX2MpOworI2Vsc2UgIC8vIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9Db21wYXJlPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgcmV0dXJuIF9fcGFydGlhbF9zb3J0X2NvcHk8X0NvbXBfcmVmPihfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9sYXN0LCBfX2NvbXApOworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19SYW5kb21BY2Nlc3NJdGVyYXRvcgorcGFydGlhbF9zb3J0X2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcmVzdWx0X2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19yZXN1bHRfbGFzdCkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OnBhcnRpYWxfc29ydF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHRfZmlyc3QsIF9fcmVzdWx0X2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGVzczx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZT4oKSk7Cit9CisKKy8vIG50aF9lbGVtZW50CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgordm9pZAorX19udGhfZWxlbWVudChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbnRoLCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCit7CisgICAgLy8gX0NvbXBhcmUgaXMga25vd24gdG8gYmUgYSByZWZlcmVuY2UgdHlwZQorICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fbGltaXQgPSA3OworICAgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICBfX3Jlc3RhcnQ6CisgICAgICAgIGlmIChfX250aCA9PSBfX2xhc3QpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgICAgIHN3aXRjaCAoX19sZW4pCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmIChfX2NvbXAoKi0tX19sYXN0LCAqX19maXJzdCkpCisgICAgICAgICAgICAgICAgc3dhcCgqX19maXJzdCwgKl9fbGFzdCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX20gPSBfX2ZpcnN0OworICAgICAgICAgICAgX1ZTVEQ6Ol9fc29ydDM8X0NvbXBhcmU+KF9fZmlyc3QsICsrX19tLCAtLV9fbGFzdCwgX19jb21wKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoX19sZW4gPD0gX19saW1pdCkKKyAgICAgICAgeworICAgICAgICAgICAgX19zZWxlY3Rpb25fc29ydDxfQ29tcGFyZT4oX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIF9fbGVuID4gX19saW1pdCA+PSAzCisgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX20gPSBfX2ZpcnN0ICsgX19sZW4vMjsKKyAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbG0xID0gX19sYXN0OworICAgICAgICB1bnNpZ25lZCBfX25fc3dhcHMgPSBfVlNURDo6X19zb3J0MzxfQ29tcGFyZT4oX19maXJzdCwgX19tLCAtLV9fbG0xLCBfX2NvbXApOworICAgICAgICAvLyAqX19tIGlzIG1lZGlhbgorICAgICAgICAvLyBwYXJ0aXRpb24gW19fZmlyc3QsIF9fbSkgPCAqX19tIGFuZCAqX19tIDw9IFtfX20sIF9fbGFzdCkKKyAgICAgICAgLy8gKHRoaXMgaW5oaWJpdHMgdG9zc2luZyBlbGVtZW50cyBlcXVpdmFsZW50IHRvIF9fbSBhcm91bmQgdW5uZWNlc3NhcmlseSkKKyAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9faSA9IF9fZmlyc3Q7CisgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ogPSBfX2xtMTsKKyAgICAgICAgLy8gaiBwb2ludHMgYmV5b25kIHJhbmdlIHRvIGJlIHRlc3RlZCwgKl9fbG0xIGlzIGtub3duIHRvIGJlIDw9ICpfX20KKyAgICAgICAgLy8gVGhlIHNlYXJjaCBnb2luZyB1cCBpcyBrbm93biB0byBiZSBndWFyZGVkIGJ1dCB0aGUgc2VhcmNoIGNvbWluZyBkb3duIGlzbid0LgorICAgICAgICAvLyBQcmltZSB0aGUgZG93bndhcmQgc2VhcmNoIHdpdGggYSBndWFyZC4KKyAgICAgICAgaWYgKCFfX2NvbXAoKl9faSwgKl9fbSkpICAvLyBpZiAqX19maXJzdCA9PSAqX19tCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICpfX2ZpcnN0ID09ICpfX20sICpfX2ZpcnN0IGRvZXNuJ3QgZ28gaW4gZmlyc3QgcGFydAorICAgICAgICAgICAgLy8gbWFudWFsbHkgZ3VhcmQgZG93bndhcmQgbW92aW5nIF9faiBhZ2FpbnN0IF9faQorICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9faSA9PSAtLV9faikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vICpfX2ZpcnN0ID09ICpfX20sICpfX20gPD0gYWxsIG90aGVyIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgIC8vIFBhcml0aW9uIGluc3RlYWQgaW50byBbX19maXJzdCwgX19pKSA9PSAqX19maXJzdCBhbmQgKl9fZmlyc3QgPCBbX19pLCBfX2xhc3QpCisgICAgICAgICAgICAgICAgICAgICsrX19pOyAgLy8gX19maXJzdCArIDEKKyAgICAgICAgICAgICAgICAgICAgX19qID0gX19sYXN0OworICAgICAgICAgICAgICAgICAgICBpZiAoIV9fY29tcCgqX19maXJzdCwgKi0tX19qKSkgIC8vIHdlIG5lZWQgYSBndWFyZCBpZiAqX19maXJzdCA9PSAqKF9fbGFzdC0xKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX19pID09IF9faikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAgLy8gW19fZmlyc3QsIF9fbGFzdCkgYWxsIGVxdWl2YWxlbnQgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX19jb21wKCpfX2ZpcnN0LCAqX19pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXAoKl9faSwgKl9faik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrX19uX3N3YXBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK19faTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrX19pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFtfX2ZpcnN0LCBfX2kpID09ICpfX2ZpcnN0IGFuZCAqX19maXJzdCA8IFtfX2osIF9fbGFzdCkgYW5kIF9faiA9PSBfX2xhc3QgLSAxCisgICAgICAgICAgICAgICAgICAgIGlmIChfX2kgPT0gX19qKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFfX2NvbXAoKl9fZmlyc3QsICpfX2kpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrX19pOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKF9fY29tcCgqX19maXJzdCwgKi0tX19qKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX19pID49IF9faikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3YXAoKl9faSwgKl9faik7CisgICAgICAgICAgICAgICAgICAgICAgICArK19fbl9zd2FwczsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrX19pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFtfX2ZpcnN0LCBfX2kpID09ICpfX2ZpcnN0IGFuZCAqX19maXJzdCA8IFtfX2ksIF9fbGFzdCkKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IHBhcnQgaXMgc29ydGVkLAorICAgICAgICAgICAgICAgICAgICBpZiAoX19udGggPCBfX2kpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIC8vIF9fbnRoX2VsZW1lbnQgdGhlIHNlY29kIHBhcnQKKyAgICAgICAgICAgICAgICAgICAgLy8gX19udGhfZWxlbWVudDxfQ29tcGFyZT4oX19pLCBfX250aCwgX19sYXN0LCBfX2NvbXApOworICAgICAgICAgICAgICAgICAgICBfX2ZpcnN0ID0gX19pOworICAgICAgICAgICAgICAgICAgICBnb3RvIF9fcmVzdGFydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKF9fY29tcCgqX19qLCAqX19tKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN3YXAoKl9faSwgKl9faik7CisgICAgICAgICAgICAgICAgICAgICsrX19uX3N3YXBzOworICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8vIGZvdW5kIGd1YXJkIGZvciBkb3dud2FyZCBtb3ZpbmcgX19qLCBub3cgdXNlIHVuZ3VhcmRlZCBwYXJ0aXRpb24KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKytfX2k7CisgICAgICAgIC8vIGogcG9pbnRzIGJleW9uZCByYW5nZSB0byBiZSB0ZXN0ZWQsICpfX2xtMSBpcyBrbm93biB0byBiZSA8PSAqX19tCisgICAgICAgIC8vIGlmIG5vdCB5ZXQgcGFydGl0aW9uZWQuLi4KKyAgICAgICAgaWYgKF9faSA8IF9faikKKyAgICAgICAgeworICAgICAgICAgICAgLy8ga25vd24gdGhhdCAqKF9faSAtIDEpIDwgKl9fbQorICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gX19tIHN0aWxsIGd1YXJkcyB1cHdhcmQgbW92aW5nIF9faQorICAgICAgICAgICAgICAgIHdoaWxlIChfX2NvbXAoKl9faSwgKl9fbSkpCisgICAgICAgICAgICAgICAgICAgICsrX19pOworICAgICAgICAgICAgICAgIC8vIEl0IGlzIG5vdyBrbm93biB0aGF0IGEgZ3VhcmQgZXhpc3RzIGZvciBkb3dud2FyZCBtb3ZpbmcgX19qCisgICAgICAgICAgICAgICAgd2hpbGUgKCFfX2NvbXAoKi0tX19qLCAqX19tKSkKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIGlmIChfX2kgPj0gX19qKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBzd2FwKCpfX2ksICpfX2opOworICAgICAgICAgICAgICAgICsrX19uX3N3YXBzOworICAgICAgICAgICAgICAgIC8vIEl0IGlzIGtub3duIHRoYXQgX19tICE9IF9fagorICAgICAgICAgICAgICAgIC8vIElmIF9fbSBqdXN0IG1vdmVkLCBmb2xsb3cgaXQKKyAgICAgICAgICAgICAgICBpZiAoX19tID09IF9faSkKKyAgICAgICAgICAgICAgICAgICAgX19tID0gX19qOworICAgICAgICAgICAgICAgICsrX19pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFtfX2ZpcnN0LCBfX2kpIDwgKl9fbSBhbmQgKl9fbSA8PSBbX19pLCBfX2xhc3QpCisgICAgICAgIGlmIChfX2kgIT0gX19tICYmIF9fY29tcCgqX19tLCAqX19pKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dhcCgqX19pLCAqX19tKTsKKyAgICAgICAgICAgICsrX19uX3N3YXBzOworICAgICAgICB9CisgICAgICAgIC8vIFtfX2ZpcnN0LCBfX2kpIDwgKl9faSBhbmQgKl9faSA8PSBbX19pKzEsIF9fbGFzdCkKKyAgICAgICAgaWYgKF9fbnRoID09IF9faSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKF9fbl9zd2FwcyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXZSB3ZXJlIGdpdmVuIGEgcGVyZmVjdGx5IHBhcnRpdGlvbmVkIHNlcXVlbmNlLiAgQ29pbmNpZGVuY2U/CisgICAgICAgICAgICBpZiAoX19udGggPCBfX2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIFtfX2ZpcnN0LCBfX2kpIGFscmVhZHkgc29ydGVkCisgICAgICAgICAgICAgICAgX19qID0gX19tID0gX19maXJzdDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKytfX2ogIT0gX19pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fY29tcCgqX19qLCAqX19tKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCB5ZXQgc29ydGVkLCBzbyBzb3J0CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG5vdF9zb3J0ZWQ7CisgICAgICAgICAgICAgICAgICAgIF9fbSA9IF9fajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gW19fZmlyc3QsIF9faSkgc29ydGVkCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBbX19pLCBfX2xhc3QpIGFscmVhZHkgc29ydGVkCisgICAgICAgICAgICAgICAgX19qID0gX19tID0gX19pOworICAgICAgICAgICAgICAgIHdoaWxlICgrK19faiAhPSBfX2xhc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX19jb21wKCpfX2osICpfX20pKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IHlldCBzb3J0ZWQsIHNvIHNvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbm90X3NvcnRlZDsKKyAgICAgICAgICAgICAgICAgICAgX19tID0gX19qOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBbX19pLCBfX2xhc3QpIHNvcnRlZAorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorbm90X3NvcnRlZDoKKyAgICAgICAgLy8gX19udGhfZWxlbWVudCBvbiByYW5nZSBjb250YWluaW5nIF9fbnRoCisgICAgICAgIGlmIChfX250aCA8IF9faSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gX19udGhfZWxlbWVudDxfQ29tcGFyZT4oX19maXJzdCwgX19udGgsIF9faSwgX19jb21wKTsKKyAgICAgICAgICAgIF9fbGFzdCA9IF9faTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIF9fbnRoX2VsZW1lbnQ8X0NvbXBhcmU+KF9faSsxLCBfX250aCwgX19sYXN0LCBfX2NvbXApOworICAgICAgICAgICAgX19maXJzdCA9ICsrX19pOworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitudGhfZWxlbWVudChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbnRoLCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X19kZWJ1Z19sZXNzPF9Db21wYXJlPiA+Ojp0eXBlIF9Db21wX3JlZjsKKyAgICBfX2RlYnVnX2xlc3M8X0NvbXBhcmU+IF9fYyhfX2NvbXApOworICAgIF9fbnRoX2VsZW1lbnQ8X0NvbXBfcmVmPihfX2ZpcnN0LCBfX250aCwgX19sYXN0LCBfX2MpOworI2Vsc2UgIC8vIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9Db21wYXJlPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgX19udGhfZWxlbWVudDxfQ29tcF9yZWY+KF9fZmlyc3QsIF9fbnRoLCBfX2xhc3QsIF9fY29tcCk7CisjZW5kaWYgIC8vIF9MSUJDUFBfREVCVUcKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitudGhfZWxlbWVudChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbnRoLCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQoreworICAgIF9WU1REOjpudGhfZWxlbWVudChfX2ZpcnN0LCBfX250aCwgX19sYXN0LCBfX2xlc3M8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGU+KCkpOworfQorCisvLyBpbmNsdWRlcworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yMSwgY2xhc3MgX0lucHV0SXRlcmF0b3IyPgorX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcgYm9vbAorX19pbmNsdWRlcyhfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLCBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApCit7CisgICAgZm9yICg7IF9fZmlyc3QyICE9IF9fbGFzdDI7ICsrX19maXJzdDEpCisgICAgeworICAgICAgICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSB8fCBfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIV9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MikpCisgICAgICAgICAgICArK19fZmlyc3QyOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yMSwgY2xhc3MgX0lucHV0SXRlcmF0b3IyLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3Citib29sCitpbmNsdWRlcyhfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLCBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorICAgICAgICAgX0NvbXBhcmUgX19jb21wKQoreworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9fZGVidWdfbGVzczxfQ29tcGFyZT4gPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgX19kZWJ1Z19sZXNzPF9Db21wYXJlPiBfX2MoX19jb21wKTsKKyAgICByZXR1cm4gX19pbmNsdWRlczxfQ29tcF9yZWY+KF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19jKTsKKyNlbHNlICAvLyBfTElCQ1BQX0RFQlVHCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfQ29tcGFyZT46OnR5cGUgX0NvbXBfcmVmOworICAgIHJldHVybiBfX2luY2x1ZGVzPF9Db21wX3JlZj4oX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX2NvbXApOworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcjEsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3Citib29sCitpbmNsdWRlcyhfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLCBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyKQoreworICAgIHJldHVybiBfVlNURDo6aW5jbHVkZXMoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2xlc3M8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IyPjo6dmFsdWVfdHlwZT4oKSk7Cit9CisKKy8vIHNldF91bmlvbgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yMSwgY2xhc3MgX0lucHV0SXRlcmF0b3IyLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitfT3V0cHV0SXRlcmF0b3IKK19fc2V0X3VuaW9uKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkKK3sKKyAgICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX3Jlc3VsdCkKKyAgICB7CisgICAgICAgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQorICAgICAgICAgICAgcmV0dXJuIF9WU1REOjpjb3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3VsdCk7CisgICAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQorICAgICAgICB7CisgICAgICAgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDI7CisgICAgICAgICAgICArK19fZmlyc3QyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKQorICAgICAgICAgICAgICAgICsrX19maXJzdDI7CisgICAgICAgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CisgICAgICAgICAgICArK19fZmlyc3QxOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfVlNURDo6Y29weShfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IxLCBjbGFzcyBfSW5wdXRJdGVyYXRvcjIsIGNsYXNzIF9PdXRwdXRJdGVyYXRvciwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX091dHB1dEl0ZXJhdG9yCitzZXRfdW5pb24oX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfX2RlYnVnX2xlc3M8X0NvbXBhcmU+ID46OnR5cGUgX0NvbXBfcmVmOworICAgIF9fZGVidWdfbGVzczxfQ29tcGFyZT4gX19jKF9fY29tcCk7CisgICAgcmV0dXJuIF9fc2V0X3VuaW9uPF9Db21wX3JlZj4oX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX3Jlc3VsdCwgX19jKTsKKyNlbHNlICAvLyBfTElCQ1BQX0RFQlVHCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfQ29tcGFyZT46OnR5cGUgX0NvbXBfcmVmOworICAgIHJldHVybiBfX3NldF91bmlvbjxfQ29tcF9yZWY+KF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQsIF9fY29tcCk7CisjZW5kaWYgIC8vIF9MSUJDUFBfREVCVUcKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yMSwgY2xhc3MgX0lucHV0SXRlcmF0b3IyLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX091dHB1dEl0ZXJhdG9yCitzZXRfdW5pb24oX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCit7CisgICAgcmV0dXJuIF9WU1REOjpzZXRfdW5pb24oX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19sZXNzPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGU+KCkpOworfQorCisvLyBzZXRfaW50ZXJzZWN0aW9uCisKK3RlbXBsYXRlIDxjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0lucHV0SXRlcmF0b3IxLCBjbGFzcyBfSW5wdXRJdGVyYXRvcjIsIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3IF9PdXRwdXRJdGVyYXRvcgorX19zZXRfaW50ZXJzZWN0aW9uKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApCit7CisgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKyAgICB7CisgICAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKQorICAgICAgICAgICAgKytfX2ZpcnN0MTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOworICAgICAgICAgICAgICAgICsrX19yZXN1bHQ7CisgICAgICAgICAgICAgICAgKytfX2ZpcnN0MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrX19maXJzdDI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IxLCBjbGFzcyBfSW5wdXRJdGVyYXRvcjIsIGNsYXNzIF9PdXRwdXRJdGVyYXRvciwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworX091dHB1dEl0ZXJhdG9yCitzZXRfaW50ZXJzZWN0aW9uKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKQoreworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9fZGVidWdfbGVzczxfQ29tcGFyZT4gPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgX19kZWJ1Z19sZXNzPF9Db21wYXJlPiBfX2MoX19jb21wKTsKKyAgICByZXR1cm4gX19zZXRfaW50ZXJzZWN0aW9uPF9Db21wX3JlZj4oX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX3Jlc3VsdCwgX19jKTsKKyNlbHNlICAvLyBfTElCQ1BQX0RFQlVHCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfQ29tcGFyZT46OnR5cGUgX0NvbXBfcmVmOworICAgIHJldHVybiBfX3NldF9pbnRlcnNlY3Rpb248X0NvbXBfcmVmPihfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0LCBfX2NvbXApOworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcjEsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yMiwgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKK19PdXRwdXRJdGVyYXRvcgorc2V0X2ludGVyc2VjdGlvbihfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCit7CisgICAgcmV0dXJuIF9WU1REOjpzZXRfaW50ZXJzZWN0aW9uKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19sZXNzPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IyPjo6dmFsdWVfdHlwZT4oKSk7Cit9CisKKy8vIHNldF9kaWZmZXJlbmNlCisKK3RlbXBsYXRlIDxjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0lucHV0SXRlcmF0b3IxLCBjbGFzcyBfSW5wdXRJdGVyYXRvcjIsIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK19PdXRwdXRJdGVyYXRvcgorX19zZXRfZGlmZmVyZW5jZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkKK3sKKyAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSkKKyAgICB7CisgICAgICAgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQorICAgICAgICAgICAgcmV0dXJuIF9WU1REOjpjb3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3VsdCk7CisgICAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKQorICAgICAgICB7CisgICAgICAgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CisgICAgICAgICAgICArK19fcmVzdWx0OworICAgICAgICAgICAgKytfX2ZpcnN0MTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkKKyAgICAgICAgICAgICAgICArK19fZmlyc3QxOworICAgICAgICAgICAgKytfX2ZpcnN0MjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcjEsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yMiwgY2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfT3V0cHV0SXRlcmF0b3IKK3NldF9kaWZmZXJlbmNlKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfX2RlYnVnX2xlc3M8X0NvbXBhcmU+ID46OnR5cGUgX0NvbXBfcmVmOworICAgIF9fZGVidWdfbGVzczxfQ29tcGFyZT4gX19jKF9fY29tcCk7CisgICAgcmV0dXJuIF9fc2V0X2RpZmZlcmVuY2U8X0NvbXBfcmVmPihfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0LCBfX2MpOworI2Vsc2UgIC8vIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9Db21wYXJlPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgcmV0dXJuIF9fc2V0X2RpZmZlcmVuY2U8X0NvbXBfcmVmPihfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0LCBfX2NvbXApOworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcjEsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yMiwgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19PdXRwdXRJdGVyYXRvcgorc2V0X2RpZmZlcmVuY2UoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OnNldF9kaWZmZXJlbmNlKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGVzczx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlPigpKTsKK30KKworLy8gc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlCisKK3RlbXBsYXRlIDxjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0lucHV0SXRlcmF0b3IxLCBjbGFzcyBfSW5wdXRJdGVyYXRvcjIsIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK19PdXRwdXRJdGVyYXRvcgorX19zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKQoreworICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxKQorICAgIHsKKyAgICAgICAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCisgICAgICAgICAgICByZXR1cm4gX1ZTVEQ6OmNvcHkoX19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0KTsKKyAgICAgICAgaWYgKF9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKyAgICAgICAgICAgICsrX19yZXN1bHQ7CisgICAgICAgICAgICArK19fZmlyc3QxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QyOworICAgICAgICAgICAgICAgICsrX19yZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKytfX2ZpcnN0MTsKKyAgICAgICAgICAgICsrX19maXJzdDI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9WU1REOjpjb3B5KF9fZmlyc3QyLCBfX2xhc3QyLCBfX3Jlc3VsdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcjEsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yMiwgY2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfT3V0cHV0SXRlcmF0b3IKK3NldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKQoreworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9fZGVidWdfbGVzczxfQ29tcGFyZT4gPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgX19kZWJ1Z19sZXNzPF9Db21wYXJlPiBfX2MoX19jb21wKTsKKyAgICByZXR1cm4gX19zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2U8X0NvbXBfcmVmPihfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0LCBfX2MpOworI2Vsc2UgIC8vIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9Db21wYXJlPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgcmV0dXJuIF9fc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlPF9Db21wX3JlZj4oX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX3Jlc3VsdCwgX19jb21wKTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9ERUJVRworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IxLCBjbGFzcyBfSW5wdXRJdGVyYXRvcjIsIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfT3V0cHV0SXRlcmF0b3IKK3NldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OnNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19sZXNzPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlPigpKTsKK30KKworLy8gbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUKKwordGVtcGxhdGUgPGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfSW5wdXRJdGVyYXRvcjEsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yMj4KK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3IGJvb2wKK19fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwgX0NvbXBhcmUgX19jb21wKQoreworICAgIGZvciAoOyBfX2ZpcnN0MiAhPSBfX2xhc3QyOyArK19fZmlyc3QxLCAodm9pZCkgKytfX2ZpcnN0MikKKyAgICB7CisgICAgICAgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxIHx8IF9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MikpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yMSwgY2xhc3MgX0lucHV0SXRlcmF0b3IyLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3Citib29sCitsZXhpY29ncmFwaGljYWxfY29tcGFyZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwgX0NvbXBhcmUgX19jb21wKQoreworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9fZGVidWdfbGVzczxfQ29tcGFyZT4gPjo6dHlwZSBfQ29tcF9yZWY7CisgICAgX19kZWJ1Z19sZXNzPF9Db21wYXJlPiBfX2MoX19jb21wKTsKKyAgICByZXR1cm4gX19sZXhpY29ncmFwaGljYWxfY29tcGFyZTxfQ29tcF9yZWY+KF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwgX19jKTsKKyNlbHNlICAvLyBfTElCQ1BQX0RFQlVHCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfQ29tcGFyZT46OnR5cGUgX0NvbXBfcmVmOworICAgIHJldHVybiBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlPF9Db21wX3JlZj4oX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX2NvbXApOworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcjEsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3Citib29sCitsZXhpY29ncmFwaGljYWxfY29tcGFyZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MikKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19sZXNzPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGU+KCkpOworfQorCisvLyBuZXh0X3Blcm11dGF0aW9uCisKK3RlbXBsYXRlIDxjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4KK2Jvb2wKK19fbmV4dF9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCit7CisgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2kgPSBfX2xhc3Q7CisgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0IHx8IF9fZmlyc3QgPT0gLS1fX2kpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19pcDEgPSBfX2k7CisgICAgICAgIGlmIChfX2NvbXAoKi0tX19pLCAqX19pcDEpKQorICAgICAgICB7CisgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9faiA9IF9fbGFzdDsKKyAgICAgICAgICAgIHdoaWxlICghX19jb21wKCpfX2ksICotLV9faikpCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgc3dhcCgqX19pLCAqX19qKTsKKyAgICAgICAgICAgIF9WU1REOjpyZXZlcnNlKF9faXAxLCBfX2xhc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9faSA9PSBfX2ZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBfVlNURDo6cmV2ZXJzZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorbmV4dF9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X19kZWJ1Z19sZXNzPF9Db21wYXJlPiA+Ojp0eXBlIF9Db21wX3JlZjsKKyAgICBfX2RlYnVnX2xlc3M8X0NvbXBhcmU+IF9fYyhfX2NvbXApOworICAgIHJldHVybiBfX25leHRfcGVybXV0YXRpb248X0NvbXBfcmVmPihfX2ZpcnN0LCBfX2xhc3QsIF9fYyk7CisjZWxzZSAgLy8gX0xJQkNQUF9ERUJVRworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X0NvbXBhcmU+Ojp0eXBlIF9Db21wX3JlZjsKKyAgICByZXR1cm4gX19uZXh0X3Blcm11dGF0aW9uPF9Db21wX3JlZj4oX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK25leHRfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6Om5leHRfcGVybXV0YXRpb24oX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGVzczx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGU+KCkpOworfQorCisvLyBwcmV2X3Blcm11dGF0aW9uCisKK3RlbXBsYXRlIDxjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4KK2Jvb2wKK19fcHJldl9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCit7CisgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2kgPSBfX2xhc3Q7CisgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0IHx8IF9fZmlyc3QgPT0gLS1fX2kpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19pcDEgPSBfX2k7CisgICAgICAgIGlmIChfX2NvbXAoKl9faXAxLCAqLS1fX2kpKQorICAgICAgICB7CisgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9faiA9IF9fbGFzdDsKKyAgICAgICAgICAgIHdoaWxlICghX19jb21wKCotLV9faiwgKl9faSkpCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgc3dhcCgqX19pLCAqX19qKTsKKyAgICAgICAgICAgIF9WU1REOjpyZXZlcnNlKF9faXAxLCBfX2xhc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9faSA9PSBfX2ZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBfVlNURDo6cmV2ZXJzZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorcHJldl9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X19kZWJ1Z19sZXNzPF9Db21wYXJlPiA+Ojp0eXBlIF9Db21wX3JlZjsKKyAgICBfX2RlYnVnX2xlc3M8X0NvbXBhcmU+IF9fYyhfX2NvbXApOworICAgIHJldHVybiBfX3ByZXZfcGVybXV0YXRpb248X0NvbXBfcmVmPihfX2ZpcnN0LCBfX2xhc3QsIF9fYyk7CisjZWxzZSAgLy8gX0xJQkNQUF9ERUJVRworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X0NvbXBhcmU+Ojp0eXBlIF9Db21wX3JlZjsKKyAgICByZXR1cm4gX19wcmV2X3Blcm11dGF0aW9uPF9Db21wX3JlZj4oX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK3ByZXZfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OnByZXZfcGVybXV0YXRpb24oX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGVzczx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGU+KCkpOworfQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKK19MSUJDUFBfUE9QX01BQ1JPUworCisjZW5kaWYgIC8vIF9MSUJDUFBfQUxHT1JJVEhNCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvYW55IGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2FueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzE2MWIwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2FueQpAQCAtMCwwICsxLDY2NyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFueSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9BTlkKKyNkZWZpbmUgX0xJQkNQUF9BTlkKKworLyoKKyAgIGFueSBzeW5vcHNpcworCituYW1lc3BhY2Ugc3RkIHsKKworICBjbGFzcyBiYWRfYW55X2Nhc3QgOiBwdWJsaWMgYmFkX2Nhc3QKKyAgeworICBwdWJsaWM6CisgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQ7CisgIH07CisKKyAgY2xhc3MgYW55CisgIHsKKyAgcHVibGljOgorCisgICAgLy8gNi4zLjEgYW55IGNvbnN0cnVjdC9kZXN0cnVjdAorICAgIGFueSgpIG5vZXhjZXB0OworCisgICAgYW55KGNvbnN0IGFueSYgb3RoZXIpOworICAgIGFueShhbnkmJiBvdGhlcikgbm9leGNlcHQ7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVmFsdWVUeXBlPgorICAgICAgYW55KFZhbHVlVHlwZSYmIHZhbHVlKTsKKworICAgIH5hbnkoKTsKKworICAgIC8vIDYuMy4yIGFueSBhc3NpZ25tZW50cworICAgIGFueSYgb3BlcmF0b3I9KGNvbnN0IGFueSYgcmhzKTsKKyAgICBhbnkmIG9wZXJhdG9yPShhbnkmJiByaHMpIG5vZXhjZXB0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIFZhbHVlVHlwZT4KKyAgICAgIGFueSYgb3BlcmF0b3I9KFZhbHVlVHlwZSYmIHJocyk7CisKKyAgICAvLyA2LjMuMyBhbnkgbW9kaWZpZXJzCisgICAgdGVtcGxhdGUgPGNsYXNzIFZhbHVlVHlwZSwgY2xhc3MuLi4gQXJncz4KKyAgICAgIGRlY2F5X3Q8VmFsdWVUeXBlPiYgZW1wbGFjZShBcmdzJiYuLi4gYXJncyk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFZhbHVlVHlwZSwgY2xhc3MgVSwgY2xhc3MuLi4gQXJncz4KKyAgICAgIGRlY2F5X3Q8VmFsdWVUeXBlPiYgZW1wbGFjZShpbml0aWFsaXplcl9saXN0PFU+LCBBcmdzJiYuLi4pOworICAgIHZvaWQgcmVzZXQoKSBub2V4Y2VwdDsKKyAgICB2b2lkIHN3YXAoYW55JiByaHMpIG5vZXhjZXB0OworCisgICAgLy8gNi4zLjQgYW55IG9ic2VydmVycworICAgIGJvb2wgaGFzX3ZhbHVlKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3QgdHlwZV9pbmZvJiB0eXBlKCkgY29uc3Qgbm9leGNlcHQ7CisgIH07CisKKyAgIC8vIDYuNCBOb24tbWVtYmVyIGZ1bmN0aW9ucworICB2b2lkIHN3YXAoYW55JiB4LCBhbnkmIHkpIG5vZXhjZXB0OworCisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyAuLi5BcmdzPgorICAgIGFueSBtYWtlX2FueShBcmdzJiYgLi4uYXJncyk7CisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyAuLi5BcmdzPgorICAgIGFueSBtYWtlX2FueShpbml0aWFsaXplcl9saXN0PFU+LCBBcmdzJiYgLi4uYXJncyk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgVmFsdWVUeXBlPgorICAgIFZhbHVlVHlwZSBhbnlfY2FzdChjb25zdCBhbnkmIG9wZXJhbmQpOworICB0ZW1wbGF0ZTxjbGFzcyBWYWx1ZVR5cGU+CisgICAgVmFsdWVUeXBlIGFueV9jYXN0KGFueSYgb3BlcmFuZCk7CisgIHRlbXBsYXRlPGNsYXNzIFZhbHVlVHlwZT4KKyAgICBWYWx1ZVR5cGUgYW55X2Nhc3QoYW55JiYgb3BlcmFuZCk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgVmFsdWVUeXBlPgorICAgIGNvbnN0IFZhbHVlVHlwZSogYW55X2Nhc3QoY29uc3QgYW55KiBvcGVyYW5kKSBub2V4Y2VwdDsKKyAgdGVtcGxhdGU8Y2xhc3MgVmFsdWVUeXBlPgorICAgIFZhbHVlVHlwZSogYW55X2Nhc3QoYW55KiBvcGVyYW5kKSBub2V4Y2VwdDsKKworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyovCisKKyNpbmNsdWRlIDxleHBlcmltZW50YWwvX19jb25maWc+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDx0eXBlaW5mbz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxjc3RkbGliPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCB7CitjbGFzcyBfTElCQ1BQX0VYQ0VQVElPTl9BQkkgYmFkX2FueV9jYXN0IDogcHVibGljIGJhZF9jYXN0Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgX05PRVhDRVBUOworfTsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisKK19MSUJDUFBfTk9SRVRVUk4gaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORQordm9pZCBfX3Rocm93X2JhZF9hbnlfY2FzdCgpCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRocm93IGJhZF9hbnlfY2FzdCgpOworI2Vsc2UKKwlfVlNURDo6YWJvcnQoKTsKKyNlbmRpZgorfQorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucworY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYW55OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlVHlwZT4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2FkZF9wb2ludGVyX3Q8YWRkX2NvbnN0X3Q8X1ZhbHVlVHlwZT4+CithbnlfY2FzdChhbnkgY29uc3QgKikgX05PRVhDRVBUOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlVHlwZT4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2FkZF9wb2ludGVyX3Q8X1ZhbHVlVHlwZT4gYW55X2Nhc3QoYW55ICopIF9OT0VYQ0VQVDsKKworbmFtZXNwYWNlIF9fYW55X2ltcAoreworICB1c2luZyBfQnVmZmVyID0gYWxpZ25lZF9zdG9yYWdlX3Q8MypzaXplb2Yodm9pZCopLCBhbGlnbm1lbnRfb2Y8dm9pZCo+Ojp2YWx1ZT47CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgdXNpbmcgX0lzU21hbGxPYmplY3QgPSBpbnRlZ3JhbF9jb25zdGFudDxib29sCisgICAgICAgICwgc2l6ZW9mKF9UcCkgPD0gc2l6ZW9mKF9CdWZmZXIpCisgICAgICAgICAgJiYgYWxpZ25tZW50X29mPF9CdWZmZXI+Ojp2YWx1ZQorICAgICAgICAgICAgICUgYWxpZ25tZW50X29mPF9UcD46OnZhbHVlID09IDAKKyAgICAgICAgICAmJiBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZQorICAgICAgICA+OworCisgIGVudW0gY2xhc3MgX0FjdGlvbiB7CisgICAgX0Rlc3Ryb3ksCisgICAgX0NvcHksCisgICAgX01vdmUsCisgICAgX0dldCwKKyAgICBfVHlwZUluZm8KKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX1NtYWxsSGFuZGxlcjsKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MYXJnZUhhbmRsZXI7CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0ICBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX3VuaXF1ZV90eXBlaW5mbyB7IHN0YXRpYyBjb25zdGV4cHIgaW50IF9faWQgPSAwOyB9OworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBjb25zdGV4cHIgaW50IF9fdW5pcXVlX3R5cGVpbmZvPF9UcD46Ol9faWQ7CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgY29uc3RleHByIGNvbnN0IHZvaWQqIF9fZ2V0X2ZhbGxiYWNrX3R5cGVpZCgpIHsKKyAgICAgIHJldHVybiAmX191bmlxdWVfdHlwZWluZm88ZGVjYXlfdDxfVHA+Pjo6X19pZDsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGJvb2wgX19jb21wYXJlX3R5cGVpZCh0eXBlX2luZm8gY29uc3QqIF9faWQsIGNvbnN0IHZvaWQqIF9fZmFsbGJhY2tfaWQpCisgIHsKKyNpZiAhZGVmaW5lZChfTElCQ1BQX05PX1JUVEkpCisgICAgICBpZiAoX19pZCAmJiAqX19pZCA9PSB0eXBlaWQoX1RwKSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorICAgICAgaWYgKCFfX2lkICYmIF9fZmFsbGJhY2tfaWQgPT0gX19hbnlfaW1wOjpfX2dldF9mYWxsYmFja190eXBlaWQ8X1RwPigpKQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgdXNpbmcgX0hhbmRsZXIgPSBjb25kaXRpb25hbF90PAorICAgIF9Jc1NtYWxsT2JqZWN0PF9UcD46OnZhbHVlLCBfU21hbGxIYW5kbGVyPF9UcD4sIF9MYXJnZUhhbmRsZXI8X1RwPj47CisKK30gLy8gbmFtZXNwYWNlIF9fYW55X2ltcAorCitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBhbnkKK3sKK3B1YmxpYzoKKyAgLy8gY29uc3RydWN0L2Rlc3RydWN0CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgY29uc3RleHByIGFueSgpIF9OT0VYQ0VQVCA6IF9faChudWxscHRyKSB7fQorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgYW55KGFueSBjb25zdCAmIF9fb3RoZXIpIDogX19oKG51bGxwdHIpCisgIHsKKyAgICBpZiAoX19vdGhlci5fX2gpIF9fb3RoZXIuX19jYWxsKF9BY3Rpb246Ol9Db3B5LCB0aGlzKTsKKyAgfQorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgYW55KGFueSAmJiBfX290aGVyKSBfTk9FWENFUFQgOiBfX2gobnVsbHB0cikKKyAgeworICAgIGlmIChfX290aGVyLl9faCkgX19vdGhlci5fX2NhbGwoX0FjdGlvbjo6X01vdmUsIHRoaXMpOworICB9CisKKyAgdGVtcGxhdGUgPAorICAgICAgY2xhc3MgX1ZhbHVlVHlwZQorICAgICwgY2xhc3MgX1RwID0gZGVjYXlfdDxfVmFsdWVUeXBlPgorICAgICwgY2xhc3MgPSBlbmFibGVfaWZfdDwKKyAgICAgICAgIWlzX3NhbWU8X1RwLCBhbnk+Ojp2YWx1ZSAmJgorICAgICAgICAhX19pc19pbnBsYWNlX3R5cGU8X1ZhbHVlVHlwZT46OnZhbHVlICYmCisgICAgICAgIGlzX2NvcHlfY29uc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZT4KKyAgICA+CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgYW55KF9WYWx1ZVR5cGUgJiYgX192YWx1ZSk7CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9WYWx1ZVR5cGUsIGNsYXNzIC4uLl9BcmdzLAorICAgIGNsYXNzIF9UcCA9IGRlY2F5X3Q8X1ZhbHVlVHlwZT4sCisgICAgY2xhc3MgPSBlbmFibGVfaWZfdDwKKyAgICAgICAgaXNfY29uc3RydWN0aWJsZTxfVHAsIF9BcmdzLi4uPjo6dmFsdWUgJiYKKyAgICAgICAgaXNfY29weV9jb25zdHJ1Y3RpYmxlPF9UcD46OnZhbHVlCisgICAgPgorICA+CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgZXhwbGljaXQgYW55KGluX3BsYWNlX3R5cGVfdDxfVmFsdWVUeXBlPiwgX0FyZ3MmJi4uLiBfX2FyZ3MpOworCisgIHRlbXBsYXRlIDxjbGFzcyBfVmFsdWVUeXBlLCBjbGFzcyBfVXAsIGNsYXNzIC4uLl9BcmdzLAorICAgIGNsYXNzIF9UcCA9IGRlY2F5X3Q8X1ZhbHVlVHlwZT4sCisgICAgY2xhc3MgPSBlbmFibGVfaWZfdDwKKyAgICAgICAgaXNfY29uc3RydWN0aWJsZTxfVHAsIGluaXRpYWxpemVyX2xpc3Q8X1VwPiYsIF9BcmdzLi4uPjo6dmFsdWUgJiYKKyAgICAgICAgaXNfY29weV9jb25zdHJ1Y3RpYmxlPF9UcD46OnZhbHVlPgorICA+CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgZXhwbGljaXQgYW55KGluX3BsYWNlX3R5cGVfdDxfVmFsdWVUeXBlPiwgaW5pdGlhbGl6ZXJfbGlzdDxfVXA+LCBfQXJncyYmLi4uIF9fYXJncyk7CisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB+YW55KCkgeyB0aGlzLT5yZXNldCgpOyB9CisKKyAgLy8gYXNzaWdubWVudHMKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBhbnkgJiBvcGVyYXRvcj0oYW55IGNvbnN0ICYgX19yaHMpIHsKKyAgICBhbnkoX19yaHMpLnN3YXAoKnRoaXMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgYW55ICYgb3BlcmF0b3I9KGFueSAmJiBfX3JocykgX05PRVhDRVBUIHsKKyAgICBhbnkoX1ZTVEQ6Om1vdmUoX19yaHMpKS5zd2FwKCp0aGlzKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8CisgICAgICBjbGFzcyBfVmFsdWVUeXBlCisgICAgLCBjbGFzcyBfVHAgPSBkZWNheV90PF9WYWx1ZVR5cGU+CisgICAgLCBjbGFzcyA9IGVuYWJsZV9pZl90PAorICAgICAgICAgICFpc19zYW1lPF9UcCwgYW55Pjo6dmFsdWUKKyAgICAgICAgICAmJiBpc19jb3B5X2NvbnN0cnVjdGlibGU8X1RwPjo6dmFsdWU+CisgICAgPgorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGFueSAmIG9wZXJhdG9yPShfVmFsdWVUeXBlICYmIF9fcmhzKTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlVHlwZSwgY2xhc3MgLi4uX0FyZ3MsCisgICAgY2xhc3MgX1RwID0gZGVjYXlfdDxfVmFsdWVUeXBlPiwKKyAgICBjbGFzcyA9IGVuYWJsZV9pZl90PAorICAgICAgICBpc19jb25zdHJ1Y3RpYmxlPF9UcCwgX0FyZ3MuLi4+Ojp2YWx1ZSAmJgorICAgICAgICBpc19jb3B5X2NvbnN0cnVjdGlibGU8X1RwPjo6dmFsdWU+CisgICAgPgorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIF9UcCYgZW1wbGFjZShfQXJncyYmLi4uIGFyZ3MpOworCisgIHRlbXBsYXRlIDxjbGFzcyBfVmFsdWVUeXBlLCBjbGFzcyBfVXAsIGNsYXNzIC4uLl9BcmdzLAorICAgIGNsYXNzIF9UcCA9IGRlY2F5X3Q8X1ZhbHVlVHlwZT4sCisgICAgY2xhc3MgPSBlbmFibGVfaWZfdDwKKyAgICAgICAgaXNfY29uc3RydWN0aWJsZTxfVHAsIGluaXRpYWxpemVyX2xpc3Q8X1VwPiYsIF9BcmdzLi4uPjo6dmFsdWUgJiYKKyAgICAgICAgaXNfY29weV9jb25zdHJ1Y3RpYmxlPF9UcD46OnZhbHVlPgorICA+CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgX1RwJiBlbXBsYWNlKGluaXRpYWxpemVyX2xpc3Q8X1VwPiwgX0FyZ3MmJi4uLik7CisKKyAgLy8gNi4zLjMgYW55IG1vZGlmaWVycworICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHZvaWQgcmVzZXQoKSBfTk9FWENFUFQgeyBpZiAoX19oKSB0aGlzLT5fX2NhbGwoX0FjdGlvbjo6X0Rlc3Ryb3kpOyB9CisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB2b2lkIHN3YXAoYW55ICYgX19yaHMpIF9OT0VYQ0VQVDsKKworICAvLyA2LjMuNCBhbnkgb2JzZXJ2ZXJzCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgYm9vbCBoYXNfdmFsdWUoKSBjb25zdCBfTk9FWENFUFQgeyByZXR1cm4gX19oICE9IG51bGxwdHI7IH0KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfTk9fUlRUSSkKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBjb25zdCB0eXBlX2luZm8gJiB0eXBlKCkgY29uc3QgX05PRVhDRVBUIHsKKyAgICBpZiAoX19oKSB7CisgICAgICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8dHlwZV9pbmZvIGNvbnN0ICo+KHRoaXMtPl9fY2FsbChfQWN0aW9uOjpfVHlwZUluZm8pKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdHlwZWlkKHZvaWQpOworICAgIH0KKyAgfQorI2VuZGlmCisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBfX2FueV9pbXA6Ol9BY3Rpb24gX0FjdGlvbjsKKyAgICB1c2luZyBfSGFuZGxlRnVuY1B0ciA9ICB2b2lkKiAoKikoX0FjdGlvbiwgYW55IGNvbnN0ICosIGFueSAqLCBjb25zdCB0eXBlX2luZm8gKiwKKyAgICAgIGNvbnN0IHZvaWQqIF9fZmFsbGJhY2tfaW5mbyk7CisKKyAgICB1bmlvbiBfU3RvcmFnZSB7CisgICAgICAgIGNvbnN0ZXhwciBfU3RvcmFnZSgpIDogX19wdHIobnVsbHB0cikge30KKyAgICAgICAgdm9pZCAqICBfX3B0cjsKKyAgICAgICAgX19hbnlfaW1wOjpfQnVmZmVyIF9fYnVmOworICAgIH07CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICB2b2lkICogX19jYWxsKF9BY3Rpb24gX19hLCBhbnkgKiBfX290aGVyID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgIHR5cGVfaW5mbyBjb25zdCAqIF9faW5mbyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogX19mYWxsYmFja19pbmZvID0gbnVsbHB0cikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBfX2goX19hLCB0aGlzLCBfX290aGVyLCBfX2luZm8sIF9fZmFsbGJhY2tfaW5mbyk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgdm9pZCAqIF9fY2FsbChfQWN0aW9uIF9fYSwgYW55ICogX19vdGhlciA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICB0eXBlX2luZm8gY29uc3QgKiBfX2luZm8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogX19mYWxsYmFja19pbmZvID0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIHJldHVybiBfX2goX19hLCB0aGlzLCBfX290aGVyLCBfX2luZm8sIF9fZmFsbGJhY2tfaW5mbyk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzPgorICAgIGZyaWVuZCBzdHJ1Y3QgX19hbnlfaW1wOjpfU21hbGxIYW5kbGVyOworICAgIHRlbXBsYXRlIDxjbGFzcz4KKyAgICBmcmllbmQgc3RydWN0IF9fYW55X2ltcDo6X0xhcmdlSGFuZGxlcjsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVmFsdWVUeXBlPgorICAgIGZyaWVuZCBhZGRfcG9pbnRlcl90PGFkZF9jb25zdF90PF9WYWx1ZVR5cGU+PgorICAgIGFueV9jYXN0KGFueSBjb25zdCAqKSBfTk9FWENFUFQ7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlVHlwZT4KKyAgICBmcmllbmQgYWRkX3BvaW50ZXJfdDxfVmFsdWVUeXBlPgorICAgIGFueV9jYXN0KGFueSAqKSBfTk9FWENFUFQ7CisKKyAgICBfSGFuZGxlRnVuY1B0ciBfX2ggPSBudWxscHRyOworICAgIF9TdG9yYWdlIF9fczsKK307CisKK25hbWVzcGFjZSBfX2FueV9pbXAKK3sKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIF9TbWFsbEhhbmRsZXIKKyAgeworICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgIHN0YXRpYyB2b2lkKiBfX2hhbmRsZShfQWN0aW9uIF9fYWN0LCBhbnkgY29uc3QgKiBfX3RoaXMsIGFueSAqIF9fb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX2luZm8gY29uc3QgKiBfX2luZm8sIGNvbnN0IHZvaWQqIF9fZmFsbGJhY2tfaW5mbykKKyAgICAgeworICAgICAgICBzd2l0Y2ggKF9fYWN0KQorICAgICAgICB7CisgICAgICAgIGNhc2UgX0FjdGlvbjo6X0Rlc3Ryb3k6CisgICAgICAgICAgX19kZXN0cm95KGNvbnN0X2Nhc3Q8YW55ICY+KCpfX3RoaXMpKTsKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgY2FzZSBfQWN0aW9uOjpfQ29weToKKyAgICAgICAgICAgIF9fY29weSgqX190aGlzLCAqX19vdGhlcik7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgY2FzZSBfQWN0aW9uOjpfTW92ZToKKyAgICAgICAgICBfX21vdmUoY29uc3RfY2FzdDxhbnkgJj4oKl9fdGhpcyksICpfX290aGVyKTsKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgY2FzZSBfQWN0aW9uOjpfR2V0OgorICAgICAgICAgICAgcmV0dXJuIF9fZ2V0KGNvbnN0X2Nhc3Q8YW55ICY+KCpfX3RoaXMpLCBfX2luZm8sIF9fZmFsbGJhY2tfaW5mbyk7CisgICAgICAgIGNhc2UgX0FjdGlvbjo6X1R5cGVJbmZvOgorICAgICAgICAgIHJldHVybiBfX3R5cGVfaW5mbygpOworICAgICAgICB9CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIC4uLl9BcmdzPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgX1RwJiBfX2NyZWF0ZShhbnkgJiBfX2Rlc3QsIF9BcmdzJiYuLi4gX19hcmdzKSB7CisgICAgICAgIF9UcCogX19yZXQgPSA6Om5ldyAoc3RhdGljX2Nhc3Q8dm9pZCo+KCZfX2Rlc3QuX19zLl9fYnVmKSkgX1RwKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICAgICAgX19kZXN0Ll9faCA9ICZfU21hbGxIYW5kbGVyOjpfX2hhbmRsZTsKKyAgICAgICAgcmV0dXJuICpfX3JldDsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGljIHZvaWQgX19kZXN0cm95KGFueSAmIF9fdGhpcykgeworICAgICAgICBfVHAgJiBfX3ZhbHVlID0gKnN0YXRpY19jYXN0PF9UcCAqPihzdGF0aWNfY2FzdDx2b2lkKj4oJl9fdGhpcy5fX3MuX19idWYpKTsKKyAgICAgICAgX192YWx1ZS5+X1RwKCk7CisgICAgICAgIF9fdGhpcy5fX2ggPSBudWxscHRyOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgdm9pZCBfX2NvcHkoYW55IGNvbnN0ICYgX190aGlzLCBhbnkgJiBfX2Rlc3QpIHsKKyAgICAgICAgX1NtYWxsSGFuZGxlcjo6X19jcmVhdGUoX19kZXN0LCAqc3RhdGljX2Nhc3Q8X1RwIGNvbnN0ICo+KAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCAqPigmX190aGlzLl9fcy5fX2J1ZikpKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGljIHZvaWQgX19tb3ZlKGFueSAmIF9fdGhpcywgYW55ICYgX19kZXN0KSB7CisgICAgICAgIF9TbWFsbEhhbmRsZXI6Ol9fY3JlYXRlKF9fZGVzdCwgX1ZTVEQ6Om1vdmUoCisgICAgICAgICAgICAqc3RhdGljX2Nhc3Q8X1RwKj4oc3RhdGljX2Nhc3Q8dm9pZCo+KCZfX3RoaXMuX19zLl9fYnVmKSkpKTsKKyAgICAgICAgX19kZXN0cm95KF9fdGhpcyk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyB2b2lkKiBfX2dldChhbnkgJiBfX3RoaXMsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfaW5mbyBjb25zdCAqIF9faW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogX19mYWxsYmFja19pZCkKKyAgICB7CisgICAgICAgIGlmIChfX2FueV9pbXA6Ol9fY29tcGFyZV90eXBlaWQ8X1RwPihfX2luZm8sIF9fZmFsbGJhY2tfaWQpKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHZvaWQqPigmX190aGlzLl9fcy5fX2J1Zik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgdm9pZCogX190eXBlX2luZm8oKQorICAgIHsKKyNpZiAhZGVmaW5lZChfTElCQ1BQX05PX1JUVEkpCisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PHZvaWQqPihzdGF0aWNfY2FzdDx2b2lkIGNvbnN0ICo+KCZ0eXBlaWQoX1RwKSkpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisjZW5kaWYKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIF9MYXJnZUhhbmRsZXIKKyAgeworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgdm9pZCogX19oYW5kbGUoX0FjdGlvbiBfX2FjdCwgYW55IGNvbnN0ICogX190aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkgKiBfX290aGVyLCB0eXBlX2luZm8gY29uc3QgKiBfX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgY29uc3QqIF9fZmFsbGJhY2tfaW5mbykKKyAgICB7CisgICAgICAgIHN3aXRjaCAoX19hY3QpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBfQWN0aW9uOjpfRGVzdHJveToKKyAgICAgICAgICBfX2Rlc3Ryb3koY29uc3RfY2FzdDxhbnkgJj4oKl9fdGhpcykpOworICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICBjYXNlIF9BY3Rpb246Ol9Db3B5OgorICAgICAgICAgIF9fY29weSgqX190aGlzLCAqX19vdGhlcik7CisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIGNhc2UgX0FjdGlvbjo6X01vdmU6CisgICAgICAgICAgX19tb3ZlKGNvbnN0X2Nhc3Q8YW55ICY+KCpfX3RoaXMpLCAqX19vdGhlcik7CisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIGNhc2UgX0FjdGlvbjo6X0dldDoKKyAgICAgICAgICAgIHJldHVybiBfX2dldChjb25zdF9jYXN0PGFueSAmPigqX190aGlzKSwgX19pbmZvLCBfX2ZhbGxiYWNrX2luZm8pOworICAgICAgICBjYXNlIF9BY3Rpb246Ol9UeXBlSW5mbzoKKyAgICAgICAgICByZXR1cm4gX190eXBlX2luZm8oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyAuLi5fQXJncz4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGljIF9UcCYgX19jcmVhdGUoYW55ICYgX19kZXN0LCBfQXJncyYmLi4uIF9fYXJncykgeworICAgICAgICB0eXBlZGVmIGFsbG9jYXRvcjxfVHA+IF9BbGxvYzsKKyAgICAgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9BbGxvYz4gX0RwOworICAgICAgICBfQWxsb2MgX19hOworICAgICAgICB1bmlxdWVfcHRyPF9UcCwgX0RwPiBfX2hvbGQoX19hLmFsbG9jYXRlKDEpLCBfRHAoX19hLCAxKSk7CisgICAgICAgIF9UcCogX19yZXQgPSA6Om5ldyAoKHZvaWQqKV9faG9sZC5nZXQoKSkgX1RwKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICAgICAgX19kZXN0Ll9fcy5fX3B0ciA9IF9faG9sZC5yZWxlYXNlKCk7CisgICAgICAgIF9fZGVzdC5fX2ggPSAmX0xhcmdlSGFuZGxlcjo6X19oYW5kbGU7CisgICAgICAgIHJldHVybiAqX19yZXQ7CisgICAgfQorCisgIHByaXZhdGU6CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGljIHZvaWQgX19kZXN0cm95KGFueSAmIF9fdGhpcyl7CisgICAgICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxfVHAqPihfX3RoaXMuX19zLl9fcHRyKTsKKyAgICAgICAgX190aGlzLl9faCA9IG51bGxwdHI7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyB2b2lkIF9fY29weShhbnkgY29uc3QgJiBfX3RoaXMsIGFueSAmIF9fZGVzdCkgeworICAgICAgICBfTGFyZ2VIYW5kbGVyOjpfX2NyZWF0ZShfX2Rlc3QsICpzdGF0aWNfY2FzdDxfVHAgY29uc3QgKj4oX190aGlzLl9fcy5fX3B0cikpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgdm9pZCBfX21vdmUoYW55ICYgX190aGlzLCBhbnkgJiBfX2Rlc3QpIHsKKyAgICAgIF9fZGVzdC5fX3MuX19wdHIgPSBfX3RoaXMuX19zLl9fcHRyOworICAgICAgX19kZXN0Ll9faCA9ICZfTGFyZ2VIYW5kbGVyOjpfX2hhbmRsZTsKKyAgICAgIF9fdGhpcy5fX2ggPSBudWxscHRyOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgdm9pZCogX19nZXQoYW55ICYgX190aGlzLCB0eXBlX2luZm8gY29uc3QgKiBfX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgY29uc3QqIF9fZmFsbGJhY2tfaW5mbykKKyAgICB7CisgICAgICAgIGlmIChfX2FueV9pbXA6Ol9fY29tcGFyZV90eXBlaWQ8X1RwPihfX2luZm8sIF9fZmFsbGJhY2tfaW5mbykpCisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dm9pZCo+KF9fdGhpcy5fX3MuX19wdHIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgdm9pZCogX190eXBlX2luZm8oKQorICAgIHsKKyNpZiAhZGVmaW5lZChfTElCQ1BQX05PX1JUVEkpCisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PHZvaWQqPihzdGF0aWNfY2FzdDx2b2lkIGNvbnN0ICo+KCZ0eXBlaWQoX1RwKSkpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisjZW5kaWYKKyAgICB9CisgIH07CisKK30gLy8gbmFtZXNwYWNlIF9fYW55X2ltcAorCisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWVUeXBlLCBjbGFzcyBfVHAsIGNsYXNzPgorYW55OjphbnkoX1ZhbHVlVHlwZSAmJiBfX3YpIDogX19oKG51bGxwdHIpCit7CisgIF9fYW55X2ltcDo6X0hhbmRsZXI8X1RwPjo6X19jcmVhdGUoKnRoaXMsIF9WU1REOjpmb3J3YXJkPF9WYWx1ZVR5cGU+KF9fdikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlVHlwZSwgY2xhc3MgLi4uX0FyZ3MsIGNsYXNzIF9UcCwgY2xhc3M+Cithbnk6OmFueShpbl9wbGFjZV90eXBlX3Q8X1ZhbHVlVHlwZT4sIF9BcmdzJiYuLi4gX19hcmdzKSB7CisgIF9fYW55X2ltcDo6X0hhbmRsZXI8X1RwPjo6X19jcmVhdGUoKnRoaXMsIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWVUeXBlLCBjbGFzcyBfVXAsIGNsYXNzIC4uLl9BcmdzLCBjbGFzcyBfVHAsIGNsYXNzPgorYW55OjphbnkoaW5fcGxhY2VfdHlwZV90PF9WYWx1ZVR5cGU+LCBpbml0aWFsaXplcl9saXN0PF9VcD4gX19pbCwgX0FyZ3MmJi4uLiBfX2FyZ3MpIHsKKyAgX19hbnlfaW1wOjpfSGFuZGxlcjxfVHA+OjpfX2NyZWF0ZSgqdGhpcywgX19pbCwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlVHlwZSwgY2xhc3MsIGNsYXNzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2FueSAmIGFueTo6b3BlcmF0b3I9KF9WYWx1ZVR5cGUgJiYgX192KQoreworICBhbnkoX1ZTVEQ6OmZvcndhcmQ8X1ZhbHVlVHlwZT4oX192KSkuc3dhcCgqdGhpcyk7CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZVR5cGUsIGNsYXNzIC4uLl9BcmdzLCBjbGFzcyBfVHAsIGNsYXNzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19UcCYgYW55OjplbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKSB7CisgIHJlc2V0KCk7CisgIHJldHVybiBfX2FueV9pbXA6Ol9IYW5kbGVyPF9UcD46Ol9fY3JlYXRlKCp0aGlzLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWVUeXBlLCBjbGFzcyBfVXAsIGNsYXNzIC4uLl9BcmdzLCBjbGFzcyBfVHAsIGNsYXNzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19UcCYgYW55OjplbXBsYWNlKGluaXRpYWxpemVyX2xpc3Q8X1VwPiBfX2lsLCBfQXJncyYmLi4uIF9fYXJncykgeworICByZXNldCgpOworICByZXR1cm4gX19hbnlfaW1wOjpfSGFuZGxlcjxfVHA+OjpfX2NyZWF0ZSgqdGhpcywgX19pbCwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCBhbnk6OnN3YXAoYW55ICYgX19yaHMpIF9OT0VYQ0VQVAoreworICAgIGlmICh0aGlzID09ICZfX3JocykKKyAgICAgIHJldHVybjsKKyAgICBpZiAoX19oICYmIF9fcmhzLl9faCkgeworICAgICAgICBhbnkgX190bXA7CisgICAgICAgIF9fcmhzLl9fY2FsbChfQWN0aW9uOjpfTW92ZSwgJl9fdG1wKTsKKyAgICAgICAgdGhpcy0+X19jYWxsKF9BY3Rpb246Ol9Nb3ZlLCAmX19yaHMpOworICAgICAgICBfX3RtcC5fX2NhbGwoX0FjdGlvbjo6X01vdmUsIHRoaXMpOworICAgIH0KKyAgICBlbHNlIGlmIChfX2gpIHsKKyAgICAgICAgdGhpcy0+X19jYWxsKF9BY3Rpb246Ol9Nb3ZlLCAmX19yaHMpOworICAgIH0KKyAgICBlbHNlIGlmIChfX3Jocy5fX2gpIHsKKyAgICAgICAgX19yaHMuX19jYWxsKF9BY3Rpb246Ol9Nb3ZlLCB0aGlzKTsKKyAgICB9Cit9CisKKy8vIDYuNCBOb24tbWVtYmVyIGZ1bmN0aW9ucworCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCBzd2FwKGFueSAmIF9fbGhzLCBhbnkgJiBfX3JocykgX05PRVhDRVBUCit7CisgICAgX19saHMuc3dhcChfX3Jocyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIC4uLl9BcmdzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2FueSBtYWtlX2FueShfQXJncyYmLi4uIF9fYXJncykgeworICAgIHJldHVybiBhbnkoaW5fcGxhY2VfdHlwZTxfVHA+LCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcCwgY2xhc3MgLi4uX0FyZ3M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYW55IG1ha2VfYW55KGluaXRpYWxpemVyX2xpc3Q8X1VwPiBfX2lsLCBfQXJncyYmLi4uIF9fYXJncykgeworICAgIHJldHVybiBhbnkoaW5fcGxhY2VfdHlwZTxfVHA+LCBfX2lsLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWVUeXBlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19WYWx1ZVR5cGUgYW55X2Nhc3QoYW55IGNvbnN0ICYgX192KQoreworICAgIHVzaW5nIF9SYXdWYWx1ZVR5cGUgPSBfX3VuY3ZyZWZfdDxfVmFsdWVUeXBlPjsKKyAgICBzdGF0aWNfYXNzZXJ0KGlzX2NvbnN0cnVjdGlibGU8X1ZhbHVlVHlwZSwgX1Jhd1ZhbHVlVHlwZSBjb25zdCAmPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiVmFsdWVUeXBlIGlzIHJlcXVpcmVkIHRvIGJlIGEgY29uc3QgbHZhbHVlIHJlZmVyZW5jZSAiCisgICAgICAgICAgICAgICAgICAib3IgYSBDb3B5Q29uc3RydWN0aWJsZSB0eXBlIik7CisgICAgYXV0byBfX3RtcCA9IF9WU1REOjphbnlfY2FzdDxhZGRfY29uc3RfdDxfUmF3VmFsdWVUeXBlPj4oJl9fdik7CisgICAgaWYgKF9fdG1wID09IG51bGxwdHIpCisgICAgICAgIF9fdGhyb3dfYmFkX2FueV9jYXN0KCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9WYWx1ZVR5cGU+KCpfX3RtcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWVUeXBlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19WYWx1ZVR5cGUgYW55X2Nhc3QoYW55ICYgX192KQoreworICAgIHVzaW5nIF9SYXdWYWx1ZVR5cGUgPSBfX3VuY3ZyZWZfdDxfVmFsdWVUeXBlPjsKKyAgICBzdGF0aWNfYXNzZXJ0KGlzX2NvbnN0cnVjdGlibGU8X1ZhbHVlVHlwZSwgX1Jhd1ZhbHVlVHlwZSAmPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiVmFsdWVUeXBlIGlzIHJlcXVpcmVkIHRvIGJlIGFuIGx2YWx1ZSByZWZlcmVuY2UgIgorICAgICAgICAgICAgICAgICAgIm9yIGEgQ29weUNvbnN0cnVjdGlibGUgdHlwZSIpOworICAgIGF1dG8gX190bXAgPSBfVlNURDo6YW55X2Nhc3Q8X1Jhd1ZhbHVlVHlwZT4oJl9fdik7CisgICAgaWYgKF9fdG1wID09IG51bGxwdHIpCisgICAgICAgIF9fdGhyb3dfYmFkX2FueV9jYXN0KCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9WYWx1ZVR5cGU+KCpfX3RtcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWVUeXBlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19WYWx1ZVR5cGUgYW55X2Nhc3QoYW55ICYmIF9fdikKK3sKKyAgICB1c2luZyBfUmF3VmFsdWVUeXBlID0gX191bmN2cmVmX3Q8X1ZhbHVlVHlwZT47CisgICAgc3RhdGljX2Fzc2VydChpc19jb25zdHJ1Y3RpYmxlPF9WYWx1ZVR5cGUsIF9SYXdWYWx1ZVR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJWYWx1ZVR5cGUgaXMgcmVxdWlyZWQgdG8gYmUgYW4gcnZhbHVlIHJlZmVyZW5jZSAiCisgICAgICAgICAgICAgICAgICAib3IgYSBDb3B5Q29uc3RydWN0aWJsZSB0eXBlIik7CisgICAgYXV0byBfX3RtcCA9IF9WU1REOjphbnlfY2FzdDxfUmF3VmFsdWVUeXBlPigmX192KTsKKyAgICBpZiAoX190bXAgPT0gbnVsbHB0cikKKyAgICAgICAgX190aHJvd19iYWRfYW55X2Nhc3QoKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X1ZhbHVlVHlwZT4oX1ZTVEQ6Om1vdmUoKl9fdG1wKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWVUeXBlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2FkZF9wb2ludGVyX3Q8YWRkX2NvbnN0X3Q8X1ZhbHVlVHlwZT4+CithbnlfY2FzdChhbnkgY29uc3QgKiBfX2FueSkgX05PRVhDRVBUCit7CisgICAgc3RhdGljX2Fzc2VydCghaXNfcmVmZXJlbmNlPF9WYWx1ZVR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJfVmFsdWVUeXBlIG1heSBub3QgYmUgYSByZWZlcmVuY2UuIik7CisgICAgcmV0dXJuIF9WU1REOjphbnlfY2FzdDxfVmFsdWVUeXBlPihjb25zdF9jYXN0PGFueSAqPihfX2FueSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JldFR5cGU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1JldFR5cGUgX19wb2ludGVyX29yX2Z1bmNfY2FzdCh2b2lkKiBfX3AsIC8qSXNGdW5jdGlvbiovZmFsc2VfdHlwZSkgbm9leGNlcHQgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8X1JldFR5cGU+KF9fcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmV0VHlwZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfUmV0VHlwZSBfX3BvaW50ZXJfb3JfZnVuY19jYXN0KHZvaWQqLCAvKklzRnVuY3Rpb24qL3RydWVfdHlwZSkgbm9leGNlcHQgeworICByZXR1cm4gbnVsbHB0cjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZVR5cGU+CithZGRfcG9pbnRlcl90PF9WYWx1ZVR5cGU+CithbnlfY2FzdChhbnkgKiBfX2FueSkgX05PRVhDRVBUCit7CisgICAgdXNpbmcgX19hbnlfaW1wOjpfQWN0aW9uOworICAgIHN0YXRpY19hc3NlcnQoIWlzX3JlZmVyZW5jZTxfVmFsdWVUeXBlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiX1ZhbHVlVHlwZSBtYXkgbm90IGJlIGEgcmVmZXJlbmNlLiIpOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX3BvaW50ZXI8X1ZhbHVlVHlwZT46OnR5cGUgX1JldHVyblR5cGU7CisgICAgaWYgKF9fYW55ICYmIF9fYW55LT5fX2gpIHsKKyAgICAgIHZvaWQgKl9fcCA9IF9fYW55LT5fX2NhbGwoX0FjdGlvbjo6X0dldCwgbnVsbHB0ciwKKyNpZiAhZGVmaW5lZChfTElCQ1BQX05PX1JUVEkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlaWQoX1ZhbHVlVHlwZSksCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYW55X2ltcDo6X19nZXRfZmFsbGJhY2tfdHlwZWlkPF9WYWx1ZVR5cGU+KCkpOworICAgICAgICByZXR1cm4gX1ZTVEQ6Ol9fcG9pbnRlcl9vcl9mdW5jX2Nhc3Q8X1JldHVyblR5cGU+KAorICAgICAgICAgICAgX19wLCBpc19mdW5jdGlvbjxfVmFsdWVUeXBlPnt9KTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKKyNlbmRpZiAvLyBfTElCQ1BQX1NURF9WRVIgPiAxNAorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKKyNlbmRpZiAvLyBfTElCQ1BQX0FOWQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2FycmF5IGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2FycmF5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYjFmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvYXJyYXkKQEAgLTAsMCArMSw0NzQgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYXJyYXkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfQVJSQVkKKyNkZWZpbmUgX0xJQkNQUF9BUlJBWQorCisvKgorICAgIGFycmF5IHN5bm9wc2lzCisKK25hbWVzcGFjZSBzdGQKK3sKK3RlbXBsYXRlIDxjbGFzcyBULCBzaXplX3QgTiA+CitzdHJ1Y3QgYXJyYXkKK3sKKyAgICAvLyB0eXBlczoKKyAgICB0eXBlZGVmIFQgJiByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBjb25zdCBUICYgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIGltcGxlbWVudGF0aW9uIGRlZmluZWQgY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIFQqIHBvaW50ZXI7CisgICAgdHlwZWRlZiBjb25zdCBUKiBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yOworICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgLy8gTm8gZXhwbGljaXQgY29uc3RydWN0L2NvcHkvZGVzdHJveSBmb3IgYWdncmVnYXRlIHR5cGUKKyAgICB2b2lkIGZpbGwoY29uc3QgVCYgdSk7CisgICAgdm9pZCBzd2FwKGFycmF5JiBhKSBub2V4Y2VwdChpc19ub3Rocm93X3N3YXBwYWJsZV92PFQ+KTsKKworICAgIC8vIGl0ZXJhdG9yczoKKyAgICBpdGVyYXRvciBiZWdpbigpIG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgaXRlcmF0b3IgZW5kKCkgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIG5vZXhjZXB0OworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICBjb25zdF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdDsKKyAgICBjb25zdF9pdGVyYXRvciBjZW5kKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0OworCisgICAgLy8gY2FwYWNpdHk6CisgICAgY29uc3RleHByIHNpemVfdHlwZSBzaXplKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RleHByIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IG5vZXhjZXB0OworICAgIGNvbnN0ZXhwciBib29sIGVtcHR5KCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICAvLyBlbGVtZW50IGFjY2VzczoKKyAgICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgbik7CisgICAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIG4pIGNvbnN0OyAvLyBjb25zdGV4cHIgaW4gQysrMTQKKyAgICBjb25zdF9yZWZlcmVuY2UgYXQoc2l6ZV90eXBlIG4pIGNvbnN0OyAvLyBjb25zdGV4cHIgaW4gQysrMTQKKyAgICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIG4pOworCisgICAgcmVmZXJlbmNlIGZyb250KCk7CisgICAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3Q7IC8vIGNvbnN0ZXhwciBpbiBDKysxNAorICAgIHJlZmVyZW5jZSBiYWNrKCk7CisgICAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdDsgLy8gY29uc3RleHByIGluIEMrKzE0CisKKyAgICBUKiBkYXRhKCkgbm9leGNlcHQ7CisgICAgY29uc3QgVCogZGF0YSgpIGNvbnN0IG5vZXhjZXB0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBOPgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgYXJyYXk8VCxOPiYgeCwgY29uc3QgYXJyYXk8VCxOPiYgeSk7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgc2l6ZV90IE4+CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBhcnJheTxULE4+JiB4LCBjb25zdCBhcnJheTxULE4+JiB5KTsKK3RlbXBsYXRlIDxjbGFzcyBULCBzaXplX3QgTj4KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgYXJyYXk8VCxOPiYgeCwgY29uc3QgYXJyYXk8VCxOPiYgeSk7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgc2l6ZV90IE4+CisgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGFycmF5PFQsTj4mIHgsIGNvbnN0IGFycmF5PFQsTj4mIHkpOwordGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBOPgorICBib29sIG9wZXJhdG9yPD0oY29uc3QgYXJyYXk8VCxOPiYgeCwgY29uc3QgYXJyYXk8VCxOPiYgeSk7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgc2l6ZV90IE4+CisgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBhcnJheTxULE4+JiB4LCBjb25zdCBhcnJheTxULE4+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBOID4KKyAgdm9pZCBzd2FwKGFycmF5PFQsTj4mIHgsIGFycmF5PFQsTj4mIHkpIG5vZXhjZXB0KG5vZXhjZXB0KHguc3dhcCh5KSkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgdHVwbGVfc2l6ZTsKK3RlbXBsYXRlIDxzaXplX3QgSSwgY2xhc3MgVD4gY2xhc3MgdHVwbGVfZWxlbWVudDsKK3RlbXBsYXRlIDxjbGFzcyBULCBzaXplX3QgTj4gc3RydWN0IHR1cGxlX3NpemU8YXJyYXk8VCwgTj4+OwordGVtcGxhdGUgPHNpemVfdCBJLCBjbGFzcyBULCBzaXplX3QgTj4gc3RydWN0IHR1cGxlX2VsZW1lbnQ8SSwgYXJyYXk8VCwgTj4+OwordGVtcGxhdGUgPHNpemVfdCBJLCBjbGFzcyBULCBzaXplX3QgTj4gVCYgZ2V0KGFycmF5PFQsIE4+Jikgbm9leGNlcHQ7IC8vIGNvbnN0ZXhwciBpbiBDKysxNAordGVtcGxhdGUgPHNpemVfdCBJLCBjbGFzcyBULCBzaXplX3QgTj4gY29uc3QgVCYgZ2V0KGNvbnN0IGFycmF5PFQsIE4+Jikgbm9leGNlcHQ7IC8vIGNvbnN0ZXhwciBpbiBDKysxNAordGVtcGxhdGUgPHNpemVfdCBJLCBjbGFzcyBULCBzaXplX3QgTj4gVCYmIGdldChhcnJheTxULCBOPiYmKSBub2V4Y2VwdDsgLy8gY29uc3RleHByIGluIEMrKzE0Cit0ZW1wbGF0ZSA8c2l6ZV90IEksIGNsYXNzIFQsIHNpemVfdCBOPiBjb25zdCBUJiYgZ2V0KGNvbnN0IGFycmF5PFQsIE4+JiYpIG5vZXhjZXB0OyAvLyBjb25zdGV4cHIgaW4gQysrMTQKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxfX3R1cGxlPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxjc3RkbGliPiAvLyBmb3IgX0xJQkNQUF9VTlJFQUNIQUJMRQorI2luY2x1ZGUgPF9fZGVidWc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCisKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGFycmF5Cit7CisgICAgLy8gdHlwZXM6CisgICAgdHlwZWRlZiBhcnJheSBfX3NlbGY7CisgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgX1RwIF9fZWxlbXNfW19TaXplXTsKKworICAgIC8vIE5vIGV4cGxpY2l0IGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3kgZm9yIGFnZ3JlZ2F0ZSB0eXBlCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIGZpbGwoY29uc3QgdmFsdWVfdHlwZSYgX191KSB7CisgICAgICBfVlNURDo6ZmlsbF9uKF9fZWxlbXNfLCBfU2l6ZSwgX191KTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKGFycmF5JiBfX2EpIF9OT0VYQ0VQVF8oX19pc19ub3Rocm93X3N3YXBwYWJsZTxfVHA+Ojp2YWx1ZSkgeworICAgICAgc3RkOjpzd2FwX3JhbmdlcyhfX2VsZW1zXywgX19lbGVtc18gKyBfU2l6ZSwgX19hLl9fZWxlbXNfKTsKKyAgICB9CisKKyAgICAvLyBpdGVyYXRvcnM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIGl0ZXJhdG9yIGJlZ2luKCkgX05PRVhDRVBUIHtyZXR1cm4gaXRlcmF0b3IoZGF0YSgpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gY29uc3RfaXRlcmF0b3IoZGF0YSgpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIGl0ZXJhdG9yIGVuZCgpIF9OT0VYQ0VQVCB7cmV0dXJuIGl0ZXJhdG9yKGRhdGEoKSArIF9TaXplKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIGNvbnN0X2l0ZXJhdG9yKGRhdGEoKSArIF9TaXplKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgICAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBfTk9FWENFUFQge3JldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBfTk9FWENFUFQge3JldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgICAgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gYmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIGNvbnN0X2l0ZXJhdG9yIGNlbmQoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBlbmQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY3JiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIHJiZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmVuZCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIHJlbmQoKTt9CisKKyAgICAvLyBjYXBhY2l0eToKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX0xJQkNQUF9DT05TVEVYUFIgc2l6ZV90eXBlIHNpemUoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfU2l6ZTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9MSUJDUFBfQ09OU1RFWFBSIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9TaXplO30KKyAgICBfTElCQ1BQX05PRElTQ0FSRF9BRlRFUl9DWFgxNyBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBlbXB0eSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIGZhbHNlOyB9CisKKyAgICAvLyBlbGVtZW50IGFjY2VzczoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgICAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgICAgICAgICAgICAge3JldHVybiBfX2VsZW1zX1tfX25dO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3Qge3JldHVybiBfX2VsZW1zX1tfX25dO30KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0ICAgICAgIHJlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKTsKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBjb25zdF9yZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikgY29uc3Q7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0IHJlZmVyZW5jZSBmcm9udCgpICAgICAgICAgICAgIHtyZXR1cm4gX19lbGVtc19bMF07fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3Qge3JldHVybiBfX2VsZW1zX1swXTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNCByZWZlcmVuY2UgYmFjaygpICAgICAgICAgICAgICB7cmV0dXJuIF9fZWxlbXNfW19TaXplIC0gMV07fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCAge3JldHVybiBfX2VsZW1zX1tfU2l6ZSAtIDFdO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICB2YWx1ZV90eXBlKiBkYXRhKCkgX05PRVhDRVBUIHtyZXR1cm4gX19lbGVtc187fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICBjb25zdCB2YWx1ZV90eXBlKiBkYXRhKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX19lbGVtc187fQorfTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBzaXplX3QgX1NpemU+CitfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAordHlwZW5hbWUgYXJyYXk8X1RwLCBfU2l6ZT46OnJlZmVyZW5jZQorYXJyYXk8X1RwLCBfU2l6ZT46OmF0KHNpemVfdHlwZSBfX24pCit7CisgICAgaWYgKF9fbiA+PSBfU2l6ZSkKKyAgICAgICAgX190aHJvd19vdXRfb2ZfcmFuZ2UoImFycmF5OjphdCIpOworCisgICAgcmV0dXJuIF9fZWxlbXNfW19fbl07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfU2l6ZT4KK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCit0eXBlbmFtZSBhcnJheTxfVHAsIF9TaXplPjo6Y29uc3RfcmVmZXJlbmNlCithcnJheTxfVHAsIF9TaXplPjo6YXQoc2l6ZV90eXBlIF9fbikgY29uc3QKK3sKKyAgICBpZiAoX19uID49IF9TaXplKQorICAgICAgICBfX3Rocm93X291dF9vZl9yYW5nZSgiYXJyYXk6OmF0Iik7CisgICAgcmV0dXJuIF9fZWxlbXNfW19fbl07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgYXJyYXk8X1RwLCAwPgoreworICAgIC8vIHR5cGVzOgorICAgIHR5cGVkZWYgYXJyYXkgX19zZWxmOworICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgICAgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8aXNfY29uc3Q8X1RwPjo6dmFsdWUsIGNvbnN0IGNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXI+Ojp0eXBlIF9DaGFyVHlwZTsKKworICAgIHN0cnVjdCAgX0FycmF5SW5TdHJ1Y3RUIHsgX1RwIF9fZGF0YV9bMV07IH07CisgICAgX0FMSUdOQVNfVFlQRShfQXJyYXlJblN0cnVjdFQpIF9DaGFyVHlwZSBfX2VsZW1zX1tzaXplb2YoX0FycmF5SW5TdHJ1Y3RUKV07CisKKyAgICAvLyBObyBleHBsaWNpdCBjb25zdHJ1Y3QvY29weS9kZXN0cm95IGZvciBhZ2dyZWdhdGUgdHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCBmaWxsKGNvbnN0IHZhbHVlX3R5cGUmKSB7CisgICAgICBzdGF0aWNfYXNzZXJ0KCFpc19jb25zdDxfVHA+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBmaWxsIHplcm8tc2l6ZWQgYXJyYXkgb2YgdHlwZSAnY29uc3QgVCciKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKGFycmF5JikgX05PRVhDRVBUIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoIWlzX2NvbnN0PF9UcD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHN3YXAgemVyby1zaXplZCBhcnJheSBvZiB0eXBlICdjb25zdCBUJyIpOworICAgIH0KKworICAgIC8vIGl0ZXJhdG9yczoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgYmVnaW4oKSBfTk9FWENFUFQge3JldHVybiBpdGVyYXRvcihkYXRhKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBjb25zdF9pdGVyYXRvcihkYXRhKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgZW5kKCkgX05PRVhDRVBUIHtyZXR1cm4gaXRlcmF0b3IoZGF0YSgpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIGNvbnN0X2l0ZXJhdG9yKGRhdGEoKSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgX05PRVhDRVBUIHtyZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgX05PRVhDRVBUIHtyZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIGJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBjZW5kKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gZW5kKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyYmVnaW4oKSBjb25zdCBfTk9FWENFUFQge3JldHVybiByYmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY3JlbmQoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiByZW5kKCk7fQorCisgICAgLy8gY2FwYWNpdHk6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9MSUJDUFBfQ09OU1RFWFBSIHNpemVfdHlwZSBzaXplKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gMDsgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfTElCQ1BQX0NPTlNURVhQUiBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiAwO30KKyAgICBfTElCQ1BQX05PRElTQ0FSRF9BRlRFUl9DWFgxNyBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBlbXB0eSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIHRydWU7fQorCisgICAgLy8gZWxlbWVudCBhY2Nlc3M6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSkgeworICAgICAgX0xJQkNQUF9BU1NFUlQoZmFsc2UsICJjYW5ub3QgY2FsbCBhcnJheTxULCAwPjo6b3BlcmF0b3JbXSBvbiBhIHplcm8tc2l6ZWQgYXJyYXkiKTsKKyAgICAgIF9MSUJDUFBfVU5SRUFDSEFCTEUoKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlKSBjb25zdCB7CisgICAgICBfTElCQ1BQX0FTU0VSVChmYWxzZSwgImNhbm5vdCBjYWxsIGFycmF5PFQsIDA+OjpvcGVyYXRvcltdIG9uIGEgemVyby1zaXplZCBhcnJheSIpOworICAgICAgX0xJQkNQUF9VTlJFQUNIQUJMRSgpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlKSB7CisgICAgICBfX3Rocm93X291dF9vZl9yYW5nZSgiYXJyYXk8VCwgMD46OmF0Iik7CisgICAgICBfTElCQ1BQX1VOUkVBQ0hBQkxFKCk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUpIGNvbnN0IHsKKyAgICAgIF9fdGhyb3dfb3V0X29mX3JhbmdlKCJhcnJheTxULCAwPjo6YXQiKTsKKyAgICAgIF9MSUJDUFBfVU5SRUFDSEFCTEUoKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVmZXJlbmNlIGZyb250KCkgeworICAgICAgX0xJQkNQUF9BU1NFUlQoZmFsc2UsICJjYW5ub3QgY2FsbCBhcnJheTxULCAwPjo6ZnJvbnQoKSBvbiBhIHplcm8tc2l6ZWQgYXJyYXkiKTsKKyAgICAgIF9MSUJDUFBfVU5SRUFDSEFCTEUoKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeworICAgICAgX0xJQkNQUF9BU1NFUlQoZmFsc2UsICJjYW5ub3QgY2FsbCBhcnJheTxULCAwPjo6ZnJvbnQoKSBvbiBhIHplcm8tc2l6ZWQgYXJyYXkiKTsKKyAgICAgIF9MSUJDUFBfVU5SRUFDSEFCTEUoKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVmZXJlbmNlIGJhY2soKSB7CisgICAgICBfTElCQ1BQX0FTU0VSVChmYWxzZSwgImNhbm5vdCBjYWxsIGFycmF5PFQsIDA+OjpiYWNrKCkgb24gYSB6ZXJvLXNpemVkIGFycmF5Iik7CisgICAgICBfTElCQ1BQX1VOUkVBQ0hBQkxFKCk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgeworICAgICAgX0xJQkNQUF9BU1NFUlQoZmFsc2UsICJjYW5ub3QgY2FsbCBhcnJheTxULCAwPjo6YmFjaygpIG9uIGEgemVyby1zaXplZCBhcnJheSIpOworICAgICAgX0xJQkNQUF9VTlJFQUNIQUJMRSgpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2YWx1ZV90eXBlKiBkYXRhKCkgX05PRVhDRVBUIHtyZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2YWx1ZV90eXBlKj4oX19lbGVtc18pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgdmFsdWVfdHlwZSogZGF0YSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmFsdWVfdHlwZSo+KF9fZWxlbXNfKTt9Cit9OworCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfU2l6ZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj09KGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX3gsIGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX3kpCit7CisgICAgcmV0dXJuIF9WU1REOjplcXVhbChfX3guYmVnaW4oKSwgX194LmVuZCgpLCBfX3kuYmVnaW4oKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfU2l6ZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX3gsIGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194ID09IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfU2l6ZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjwoY29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4mIF9feCwgY29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4mIF9feSkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9feC5iZWdpbigpLCBfX3guZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3kuYmVnaW4oKSwgX195LmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPihjb25zdCBhcnJheTxfVHAsIF9TaXplPiYgX194LCBjb25zdCBhcnJheTxfVHAsIF9TaXplPiYgX195KQoreworICAgIHJldHVybiBfX3kgPCBfX3g7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfU2l6ZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjw9KGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX3gsIGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX195IDwgX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPj0oY29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4mIF9feCwgY29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPCBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBzaXplX3QgX1NpemU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX1NpemUgPT0gMCB8fAorICAgIF9faXNfc3dhcHBhYmxlPF9UcD46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3N3YXAoYXJyYXk8X1RwLCBfU2l6ZT4mIF9feCwgYXJyYXk8X1RwLCBfU2l6ZT4mIF9feSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTk9FWENFUFRfKG5vZXhjZXB0KF9feC5zd2FwKF9feSkpKQoreworICAgIF9feC5zd2FwKF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfU2l6ZT4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHR1cGxlX3NpemU8YXJyYXk8X1RwLCBfU2l6ZT4gPgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHNpemVfdCwgX1NpemU+IHt9OworCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1RwLCBzaXplX3QgX1NpemU+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB0dXBsZV9lbGVtZW50PF9JcCwgYXJyYXk8X1RwLCBfU2l6ZT4gPgoreworICAgIHN0YXRpY19hc3NlcnQoX0lwIDwgX1NpemUsICJJbmRleCBvdXQgb2YgYm91bmRzIGluIHN0ZDo6dHVwbGVfZWxlbWVudDw+IChzdGQ6OmFycmF5KSIpOworcHVibGljOgorICAgIHR5cGVkZWYgX1RwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1RwLCBzaXplX3QgX1NpemU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorX1RwJgorZ2V0KGFycmF5PF9UcCwgX1NpemU+JiBfX2EpIF9OT0VYQ0VQVAoreworICAgIHN0YXRpY19hc3NlcnQoX0lwIDwgX1NpemUsICJJbmRleCBvdXQgb2YgYm91bmRzIGluIHN0ZDo6Z2V0PD4gKHN0ZDo6YXJyYXkpIik7CisgICAgcmV0dXJuIF9fYS5fX2VsZW1zX1tfSXBdOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1RwLCBzaXplX3QgX1NpemU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorY29uc3QgX1RwJgorZ2V0KGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX2EpIF9OT0VYQ0VQVAoreworICAgIHN0YXRpY19hc3NlcnQoX0lwIDwgX1NpemUsICJJbmRleCBvdXQgb2YgYm91bmRzIGluIHN0ZDo6Z2V0PD4gKGNvbnN0IHN0ZDo6YXJyYXkpIik7CisgICAgcmV0dXJuIF9fYS5fX2VsZW1zX1tfSXBdOworfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1RwLCBzaXplX3QgX1NpemU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorX1RwJiYKK2dldChhcnJheTxfVHAsIF9TaXplPiYmIF9fYSkgX05PRVhDRVBUCit7CisgICAgc3RhdGljX2Fzc2VydChfSXAgPCBfU2l6ZSwgIkluZGV4IG91dCBvZiBib3VuZHMgaW4gc3RkOjpnZXQ8PiAoc3RkOjphcnJheSAmJikiKTsKKyAgICByZXR1cm4gX1ZTVEQ6Om1vdmUoX19hLl9fZWxlbXNfW19JcF0pOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1RwLCBzaXplX3QgX1NpemU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorY29uc3QgX1RwJiYKK2dldChjb25zdCBhcnJheTxfVHAsIF9TaXplPiYmIF9fYSkgX05PRVhDRVBUCit7CisgICAgc3RhdGljX2Fzc2VydChfSXAgPCBfU2l6ZSwgIkluZGV4IG91dCBvZiBib3VuZHMgaW4gc3RkOjpnZXQ8PiAoY29uc3Qgc3RkOjphcnJheSAmJikiKTsKKyAgICByZXR1cm4gX1ZTVEQ6Om1vdmUoX19hLl9fZWxlbXNfW19JcF0pOworfQorCisjZW5kaWYgIC8vICFfTElCQ1BQX0NYWDAzX0xBTkcKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCisjZW5kaWYgIC8vIF9MSUJDUFBfQVJSQVkKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9hdG9taWMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvYXRvbWljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NWUyOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvYXRvbWljCkBAIC0wLDAgKzEsMTg4OCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGF0b21pYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9BVE9NSUMKKyNkZWZpbmUgX0xJQkNQUF9BVE9NSUMKKworLyoKKyAgICBhdG9taWMgc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCisvLyBmZWF0dXJlIHRlc3QgbWFjcm8KKworI2RlZmluZSBfX2NwcF9saWJfYXRvbWljX2lzX2Fsd2F5c19sb2NrX2ZyZWUgLy8gYXMgc3BlY2lmaWVkIGJ5IFNHMTAKKworLy8gb3JkZXIgYW5kIGNvbnNpc3RlbmN5CisKK3R5cGVkZWYgZW51bSBtZW1vcnlfb3JkZXIKK3sKKyAgICBtZW1vcnlfb3JkZXJfcmVsYXhlZCwKKyAgICBtZW1vcnlfb3JkZXJfY29uc3VtZSwgIC8vIGxvYWQtY29uc3VtZQorICAgIG1lbW9yeV9vcmRlcl9hY3F1aXJlLCAgLy8gbG9hZC1hY3F1aXJlCisgICAgbWVtb3J5X29yZGVyX3JlbGVhc2UsICAvLyBzdG9yZS1yZWxlYXNlCisgICAgbWVtb3J5X29yZGVyX2FjcV9yZWwsICAvLyBzdG9yZS1yZWxlYXNlIGxvYWQtYWNxdWlyZQorICAgIG1lbW9yeV9vcmRlcl9zZXFfY3N0ICAgLy8gc3RvcmUtcmVsZWFzZSBsb2FkLWFjcXVpcmUKK30gbWVtb3J5X29yZGVyOworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gVCBraWxsX2RlcGVuZGVuY3koVCB5KSBub2V4Y2VwdDsKKworLy8gbG9jay1mcmVlIHByb3BlcnR5CisKKyNkZWZpbmUgQVRPTUlDX0JPT0xfTE9DS19GUkVFIHVuc3BlY2lmaWVkCisjZGVmaW5lIEFUT01JQ19DSEFSX0xPQ0tfRlJFRSB1bnNwZWNpZmllZAorI2RlZmluZSBBVE9NSUNfQ0hBUjE2X1RfTE9DS19GUkVFIHVuc3BlY2lmaWVkCisjZGVmaW5lIEFUT01JQ19DSEFSMzJfVF9MT0NLX0ZSRUUgdW5zcGVjaWZpZWQKKyNkZWZpbmUgQVRPTUlDX1dDSEFSX1RfTE9DS19GUkVFIHVuc3BlY2lmaWVkCisjZGVmaW5lIEFUT01JQ19TSE9SVF9MT0NLX0ZSRUUgdW5zcGVjaWZpZWQKKyNkZWZpbmUgQVRPTUlDX0lOVF9MT0NLX0ZSRUUgdW5zcGVjaWZpZWQKKyNkZWZpbmUgQVRPTUlDX0xPTkdfTE9DS19GUkVFIHVuc3BlY2lmaWVkCisjZGVmaW5lIEFUT01JQ19MTE9OR19MT0NLX0ZSRUUgdW5zcGVjaWZpZWQKKyNkZWZpbmUgQVRPTUlDX1BPSU5URVJfTE9DS19GUkVFIHVuc3BlY2lmaWVkCisKKy8vIGZsYWcgdHlwZSBhbmQgb3BlcmF0aW9ucworCit0eXBlZGVmIHN0cnVjdCBhdG9taWNfZmxhZworeworICAgIGJvb2wgdGVzdF9hbmRfc2V0KG1lbW9yeV9vcmRlciBtID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0OworICAgIGJvb2wgdGVzdF9hbmRfc2V0KG1lbW9yeV9vcmRlciBtID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0OworICAgIHZvaWQgY2xlYXIobWVtb3J5X29yZGVyIG0gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgdm9pZCBjbGVhcihtZW1vcnlfb3JkZXIgbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdDsKKyAgICBhdG9taWNfZmxhZygpICBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgYXRvbWljX2ZsYWcoY29uc3QgYXRvbWljX2ZsYWcmKSA9IGRlbGV0ZTsKKyAgICBhdG9taWNfZmxhZyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pY19mbGFnJikgPSBkZWxldGU7CisgICAgYXRvbWljX2ZsYWcmIG9wZXJhdG9yPShjb25zdCBhdG9taWNfZmxhZyYpIHZvbGF0aWxlID0gZGVsZXRlOworfSBhdG9taWNfZmxhZzsKKworYm9vbAorICAgIGF0b21pY19mbGFnX3Rlc3RfYW5kX3NldCh2b2xhdGlsZSBhdG9taWNfZmxhZyogb2JqKSBub2V4Y2VwdDsKKworYm9vbAorICAgIGF0b21pY19mbGFnX3Rlc3RfYW5kX3NldChhdG9taWNfZmxhZyogb2JqKSBub2V4Y2VwdDsKKworYm9vbAorICAgIGF0b21pY19mbGFnX3Rlc3RfYW5kX3NldF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfZmxhZyogb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgbSkgbm9leGNlcHQ7CisKK2Jvb2wKKyAgICBhdG9taWNfZmxhZ190ZXN0X2FuZF9zZXRfZXhwbGljaXQoYXRvbWljX2ZsYWcqIG9iaiwgbWVtb3J5X29yZGVyIG0pIG5vZXhjZXB0OworCit2b2lkCisgICAgYXRvbWljX2ZsYWdfY2xlYXIodm9sYXRpbGUgYXRvbWljX2ZsYWcqIG9iaikgbm9leGNlcHQ7CisKK3ZvaWQKKyAgICBhdG9taWNfZmxhZ19jbGVhcihhdG9taWNfZmxhZyogb2JqKSBub2V4Y2VwdDsKKwordm9pZAorICAgIGF0b21pY19mbGFnX2NsZWFyX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19mbGFnKiBvYmosIG1lbW9yeV9vcmRlciBtKSBub2V4Y2VwdDsKKwordm9pZAorICAgIGF0b21pY19mbGFnX2NsZWFyX2V4cGxpY2l0KGF0b21pY19mbGFnKiBvYmosIG1lbW9yeV9vcmRlciBtKSBub2V4Y2VwdDsKKworI2RlZmluZSBBVE9NSUNfRkxBR19JTklUIHNlZSBiZWxvdworI2RlZmluZSBBVE9NSUNfVkFSX0lOSVQodmFsdWUpIHNlZSBiZWxvdworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBhdG9taWMKK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfYWx3YXlzX2xvY2tfZnJlZTsKKyAgICBib29sIGlzX2xvY2tfZnJlZSgpIGNvbnN0IHZvbGF0aWxlIG5vZXhjZXB0OworICAgIGJvb2wgaXNfbG9ja19mcmVlKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgdm9pZCBzdG9yZShUIGRlc3IsIG1lbW9yeV9vcmRlciBtID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0OworICAgIHZvaWQgc3RvcmUoVCBkZXNyLCBtZW1vcnlfb3JkZXIgbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdDsKKyAgICBUIGxvYWQobWVtb3J5X29yZGVyIG0gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3Qgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgVCBsb2FkKG1lbW9yeV9vcmRlciBtID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIGNvbnN0IG5vZXhjZXB0OworICAgIG9wZXJhdG9yIFQoKSBjb25zdCB2b2xhdGlsZSBub2V4Y2VwdDsKKyAgICBvcGVyYXRvciBUKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgVCBleGNoYW5nZShUIGRlc3IsIG1lbW9yeV9vcmRlciBtID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0OworICAgIFQgZXhjaGFuZ2UoVCBkZXNyLCBtZW1vcnlfb3JkZXIgbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdDsKKyAgICBib29sIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhUJiBleHBjLCBUIGRlc3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIHMsIG1lbW9yeV9vcmRlciBmKSB2b2xhdGlsZSBub2V4Y2VwdDsKKyAgICBib29sIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhUJiBleHBjLCBUIGRlc3IsIG1lbW9yeV9vcmRlciBzLCBtZW1vcnlfb3JkZXIgZikgbm9leGNlcHQ7CisgICAgYm9vbCBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhUJiBleHBjLCBUIGRlc3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgcywgbWVtb3J5X29yZGVyIGYpIHZvbGF0aWxlIG5vZXhjZXB0OworICAgIGJvb2wgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoVCYgZXhwYywgVCBkZXNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIHMsIG1lbW9yeV9vcmRlciBmKSBub2V4Y2VwdDsKKyAgICBib29sIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhUJiBleHBjLCBUIGRlc3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIG0gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgYm9vbCBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoVCYgZXhwYywgVCBkZXNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBtID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0OworICAgIGJvb2wgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoVCYgZXhwYywgVCBkZXNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdDsKKyAgICBib29sIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKFQmIGV4cGMsIFQgZGVzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBtID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0OworCisgICAgYXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgIGNvbnN0ZXhwciBhdG9taWMoVCBkZXNyKSBub2V4Y2VwdDsKKyAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisgICAgVCBvcGVyYXRvcj0oVCkgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgVCBvcGVyYXRvcj0oVCkgbm9leGNlcHQ7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGF0b21pYzxpbnRlZ3JhbD4KK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfYWx3YXlzX2xvY2tfZnJlZTsKKyAgICBib29sIGlzX2xvY2tfZnJlZSgpIGNvbnN0IHZvbGF0aWxlIG5vZXhjZXB0OworICAgIGJvb2wgaXNfbG9ja19mcmVlKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgdm9pZCBzdG9yZShpbnRlZ3JhbCBkZXNyLCBtZW1vcnlfb3JkZXIgbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdDsKKyAgICB2b2lkIHN0b3JlKGludGVncmFsIGRlc3IsIG1lbW9yeV9vcmRlciBtID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0OworICAgIGludGVncmFsIGxvYWQobWVtb3J5X29yZGVyIG0gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3Qgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgaW50ZWdyYWwgbG9hZChtZW1vcnlfb3JkZXIgbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBjb25zdCBub2V4Y2VwdDsKKyAgICBvcGVyYXRvciBpbnRlZ3JhbCgpIGNvbnN0IHZvbGF0aWxlIG5vZXhjZXB0OworICAgIG9wZXJhdG9yIGludGVncmFsKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgaW50ZWdyYWwgZXhjaGFuZ2UoaW50ZWdyYWwgZGVzciwKKyAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdDsKKyAgICBpbnRlZ3JhbCBleGNoYW5nZShpbnRlZ3JhbCBkZXNyLCBtZW1vcnlfb3JkZXIgbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdDsKKyAgICBib29sIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhpbnRlZ3JhbCYgZXhwYywgaW50ZWdyYWwgZGVzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgcywgbWVtb3J5X29yZGVyIGYpIHZvbGF0aWxlIG5vZXhjZXB0OworICAgIGJvb2wgY29tcGFyZV9leGNoYW5nZV93ZWFrKGludGVncmFsJiBleHBjLCBpbnRlZ3JhbCBkZXNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBzLCBtZW1vcnlfb3JkZXIgZikgbm9leGNlcHQ7CisgICAgYm9vbCBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhpbnRlZ3JhbCYgZXhwYywgaW50ZWdyYWwgZGVzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBzLCBtZW1vcnlfb3JkZXIgZikgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgYm9vbCBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhpbnRlZ3JhbCYgZXhwYywgaW50ZWdyYWwgZGVzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBzLCBtZW1vcnlfb3JkZXIgZikgbm9leGNlcHQ7CisgICAgYm9vbCBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoaW50ZWdyYWwmIGV4cGMsIGludGVncmFsIGRlc3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIG0gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgYm9vbCBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoaW50ZWdyYWwmIGV4cGMsIGludGVncmFsIGRlc3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIG0gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQ7CisgICAgYm9vbCBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhpbnRlZ3JhbCYgZXhwYywgaW50ZWdyYWwgZGVzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIG0gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgYm9vbCBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhpbnRlZ3JhbCYgZXhwYywgaW50ZWdyYWwgZGVzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBtID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0OworCisgICAgaW50ZWdyYWwKKyAgICAgICAgZmV0Y2hfYWRkKGludGVncmFsIG9wLCBtZW1vcnlfb3JkZXIgbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdDsKKyAgICBpbnRlZ3JhbCBmZXRjaF9hZGQoaW50ZWdyYWwgb3AsIG1lbW9yeV9vcmRlciBtID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0OworICAgIGludGVncmFsCisgICAgICAgIGZldGNoX3N1YihpbnRlZ3JhbCBvcCwgbWVtb3J5X29yZGVyIG0gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgaW50ZWdyYWwgZmV0Y2hfc3ViKGludGVncmFsIG9wLCBtZW1vcnlfb3JkZXIgbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdDsKKyAgICBpbnRlZ3JhbAorICAgICAgICBmZXRjaF9hbmQoaW50ZWdyYWwgb3AsIG1lbW9yeV9vcmRlciBtID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0OworICAgIGludGVncmFsIGZldGNoX2FuZChpbnRlZ3JhbCBvcCwgbWVtb3J5X29yZGVyIG0gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQ7CisgICAgaW50ZWdyYWwKKyAgICAgICAgZmV0Y2hfb3IoaW50ZWdyYWwgb3AsIG1lbW9yeV9vcmRlciBtID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0OworICAgIGludGVncmFsIGZldGNoX29yKGludGVncmFsIG9wLCBtZW1vcnlfb3JkZXIgbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdDsKKyAgICBpbnRlZ3JhbAorICAgICAgICBmZXRjaF94b3IoaW50ZWdyYWwgb3AsIG1lbW9yeV9vcmRlciBtID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0OworICAgIGludGVncmFsIGZldGNoX3hvcihpbnRlZ3JhbCBvcCwgbWVtb3J5X29yZGVyIG0gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQ7CisKKyAgICBhdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgY29uc3RleHByIGF0b21pYyhpbnRlZ3JhbCBkZXNyKSBub2V4Y2VwdDsKKyAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisgICAgaW50ZWdyYWwgb3BlcmF0b3I9KGludGVncmFsIGRlc3IpIHZvbGF0aWxlIG5vZXhjZXB0OworICAgIGludGVncmFsIG9wZXJhdG9yPShpbnRlZ3JhbCBkZXNyKSBub2V4Y2VwdDsKKworICAgIGludGVncmFsIG9wZXJhdG9yKysoaW50KSB2b2xhdGlsZSBub2V4Y2VwdDsKKyAgICBpbnRlZ3JhbCBvcGVyYXRvcisrKGludCkgbm9leGNlcHQ7CisgICAgaW50ZWdyYWwgb3BlcmF0b3ItLShpbnQpIHZvbGF0aWxlIG5vZXhjZXB0OworICAgIGludGVncmFsIG9wZXJhdG9yLS0oaW50KSBub2V4Y2VwdDsKKyAgICBpbnRlZ3JhbCBvcGVyYXRvcisrKCkgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgaW50ZWdyYWwgb3BlcmF0b3IrKygpIG5vZXhjZXB0OworICAgIGludGVncmFsIG9wZXJhdG9yLS0oKSB2b2xhdGlsZSBub2V4Y2VwdDsKKyAgICBpbnRlZ3JhbCBvcGVyYXRvci0tKCkgbm9leGNlcHQ7CisgICAgaW50ZWdyYWwgb3BlcmF0b3IrPShpbnRlZ3JhbCBvcCkgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgaW50ZWdyYWwgb3BlcmF0b3IrPShpbnRlZ3JhbCBvcCkgbm9leGNlcHQ7CisgICAgaW50ZWdyYWwgb3BlcmF0b3ItPShpbnRlZ3JhbCBvcCkgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgaW50ZWdyYWwgb3BlcmF0b3ItPShpbnRlZ3JhbCBvcCkgbm9leGNlcHQ7CisgICAgaW50ZWdyYWwgb3BlcmF0b3ImPShpbnRlZ3JhbCBvcCkgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgaW50ZWdyYWwgb3BlcmF0b3ImPShpbnRlZ3JhbCBvcCkgbm9leGNlcHQ7CisgICAgaW50ZWdyYWwgb3BlcmF0b3J8PShpbnRlZ3JhbCBvcCkgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgaW50ZWdyYWwgb3BlcmF0b3J8PShpbnRlZ3JhbCBvcCkgbm9leGNlcHQ7CisgICAgaW50ZWdyYWwgb3BlcmF0b3JePShpbnRlZ3JhbCBvcCkgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgaW50ZWdyYWwgb3BlcmF0b3JePShpbnRlZ3JhbCBvcCkgbm9leGNlcHQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBhdG9taWM8VCo+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX2Fsd2F5c19sb2NrX2ZyZWU7CisgICAgYm9vbCBpc19sb2NrX2ZyZWUoKSBjb25zdCB2b2xhdGlsZSBub2V4Y2VwdDsKKyAgICBib29sIGlzX2xvY2tfZnJlZSgpIGNvbnN0IG5vZXhjZXB0OworICAgIHZvaWQgc3RvcmUoVCogZGVzciwgbWVtb3J5X29yZGVyIG0gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgdm9pZCBzdG9yZShUKiBkZXNyLCBtZW1vcnlfb3JkZXIgbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdDsKKyAgICBUKiBsb2FkKG1lbW9yeV9vcmRlciBtID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIGNvbnN0IHZvbGF0aWxlIG5vZXhjZXB0OworICAgIFQqIGxvYWQobWVtb3J5X29yZGVyIG0gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3Qgbm9leGNlcHQ7CisgICAgb3BlcmF0b3IgVCooKSBjb25zdCB2b2xhdGlsZSBub2V4Y2VwdDsKKyAgICBvcGVyYXRvciBUKigpIGNvbnN0IG5vZXhjZXB0OworICAgIFQqIGV4Y2hhbmdlKFQqIGRlc3IsIG1lbW9yeV9vcmRlciBtID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0OworICAgIFQqIGV4Y2hhbmdlKFQqIGRlc3IsIG1lbW9yeV9vcmRlciBtID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0OworICAgIGJvb2wgY29tcGFyZV9leGNoYW5nZV93ZWFrKFQqJiBleHBjLCBUKiBkZXNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBzLCBtZW1vcnlfb3JkZXIgZikgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgYm9vbCBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoVComIGV4cGMsIFQqIGRlc3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIHMsIG1lbW9yeV9vcmRlciBmKSBub2V4Y2VwdDsKKyAgICBib29sIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKFQqJiBleHBjLCBUKiBkZXNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIHMsIG1lbW9yeV9vcmRlciBmKSB2b2xhdGlsZSBub2V4Y2VwdDsKKyAgICBib29sIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKFQqJiBleHBjLCBUKiBkZXNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIHMsIG1lbW9yeV9vcmRlciBmKSBub2V4Y2VwdDsKKyAgICBib29sIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhUKiYgZXhwYywgVCogZGVzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdDsKKyAgICBib29sIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhUKiYgZXhwYywgVCogZGVzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdDsKKyAgICBib29sIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKFQqJiBleHBjLCBUKiBkZXNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdDsKKyAgICBib29sIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKFQqJiBleHBjLCBUKiBkZXNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIG0gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQ7CisgICAgVCogZmV0Y2hfYWRkKHB0cmRpZmZfdCBvcCwgbWVtb3J5X29yZGVyIG0gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgVCogZmV0Y2hfYWRkKHB0cmRpZmZfdCBvcCwgbWVtb3J5X29yZGVyIG0gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQ7CisgICAgVCogZmV0Y2hfc3ViKHB0cmRpZmZfdCBvcCwgbWVtb3J5X29yZGVyIG0gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgVCogZmV0Y2hfc3ViKHB0cmRpZmZfdCBvcCwgbWVtb3J5X29yZGVyIG0gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQ7CisKKyAgICBhdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgY29uc3RleHByIGF0b21pYyhUKiBkZXNyKSBub2V4Y2VwdDsKKyAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICBUKiBvcGVyYXRvcj0oVCopIHZvbGF0aWxlIG5vZXhjZXB0OworICAgIFQqIG9wZXJhdG9yPShUKikgbm9leGNlcHQ7CisgICAgVCogb3BlcmF0b3IrKyhpbnQpIHZvbGF0aWxlIG5vZXhjZXB0OworICAgIFQqIG9wZXJhdG9yKysoaW50KSBub2V4Y2VwdDsKKyAgICBUKiBvcGVyYXRvci0tKGludCkgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgVCogb3BlcmF0b3ItLShpbnQpIG5vZXhjZXB0OworICAgIFQqIG9wZXJhdG9yKysoKSB2b2xhdGlsZSBub2V4Y2VwdDsKKyAgICBUKiBvcGVyYXRvcisrKCkgbm9leGNlcHQ7CisgICAgVCogb3BlcmF0b3ItLSgpIHZvbGF0aWxlIG5vZXhjZXB0OworICAgIFQqIG9wZXJhdG9yLS0oKSBub2V4Y2VwdDsKKyAgICBUKiBvcGVyYXRvcis9KHB0cmRpZmZfdCBvcCkgdm9sYXRpbGUgbm9leGNlcHQ7CisgICAgVCogb3BlcmF0b3IrPShwdHJkaWZmX3Qgb3ApIG5vZXhjZXB0OworICAgIFQqIG9wZXJhdG9yLT0ocHRyZGlmZl90IG9wKSB2b2xhdGlsZSBub2V4Y2VwdDsKKyAgICBUKiBvcGVyYXRvci09KHB0cmRpZmZfdCBvcCkgbm9leGNlcHQ7Cit9OworCisKK3RlbXBsYXRlIDxjbGFzcyBUPgorICAgIGJvb2wKKyAgICBhdG9taWNfaXNfbG9ja19mcmVlKGNvbnN0IHZvbGF0aWxlIGF0b21pYzxUPiogb2JqKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgYm9vbAorICAgIGF0b21pY19pc19sb2NrX2ZyZWUoY29uc3QgYXRvbWljPFQ+KiBvYmopIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICB2b2lkCisgICAgYXRvbWljX2luaXQodm9sYXRpbGUgYXRvbWljPFQ+KiBvYmosIFQgZGVzcikgbm9leGNlcHQ7CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorICAgIHZvaWQKKyAgICBhdG9taWNfaW5pdChhdG9taWM8VD4qIG9iaiwgVCBkZXNyKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgdm9pZAorICAgIGF0b21pY19zdG9yZSh2b2xhdGlsZSBhdG9taWM8VD4qIG9iaiwgVCBkZXNyKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgdm9pZAorICAgIGF0b21pY19zdG9yZShhdG9taWM8VD4qIG9iaiwgVCBkZXNyKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgdm9pZAorICAgIGF0b21pY19zdG9yZV9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWM8VD4qIG9iaiwgVCBkZXNyLCBtZW1vcnlfb3JkZXIgbSkgbm9leGNlcHQ7CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorICAgIHZvaWQKKyAgICBhdG9taWNfc3RvcmVfZXhwbGljaXQoYXRvbWljPFQ+KiBvYmosIFQgZGVzciwgbWVtb3J5X29yZGVyIG0pIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBUCisgICAgYXRvbWljX2xvYWQoY29uc3Qgdm9sYXRpbGUgYXRvbWljPFQ+KiBvYmopIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBUCisgICAgYXRvbWljX2xvYWQoY29uc3QgYXRvbWljPFQ+KiBvYmopIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBUCisgICAgYXRvbWljX2xvYWRfZXhwbGljaXQoY29uc3Qgdm9sYXRpbGUgYXRvbWljPFQ+KiBvYmosIG1lbW9yeV9vcmRlciBtKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgVAorICAgIGF0b21pY19sb2FkX2V4cGxpY2l0KGNvbnN0IGF0b21pYzxUPiogb2JqLCBtZW1vcnlfb3JkZXIgbSkgbm9leGNlcHQ7CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorICAgIFQKKyAgICBhdG9taWNfZXhjaGFuZ2Uodm9sYXRpbGUgYXRvbWljPFQ+KiBvYmosIFQgZGVzcikgbm9leGNlcHQ7CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorICAgIFQKKyAgICBhdG9taWNfZXhjaGFuZ2UoYXRvbWljPFQ+KiBvYmosIFQgZGVzcikgbm9leGNlcHQ7CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorICAgIFQKKyAgICBhdG9taWNfZXhjaGFuZ2VfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljPFQ+KiBvYmosIFQgZGVzciwgbWVtb3J5X29yZGVyIG0pIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBUCisgICAgYXRvbWljX2V4Y2hhbmdlX2V4cGxpY2l0KGF0b21pYzxUPiogb2JqLCBUIGRlc3IsIG1lbW9yeV9vcmRlciBtKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgYm9vbAorICAgIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWsodm9sYXRpbGUgYXRvbWljPFQ+KiBvYmosIFQqIGV4cGMsIFQgZGVzcikgbm9leGNlcHQ7CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorICAgIGJvb2wKKyAgICBhdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrKGF0b21pYzxUPiogb2JqLCBUKiBleHBjLCBUIGRlc3IpIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBib29sCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKHZvbGF0aWxlIGF0b21pYzxUPiogb2JqLCBUKiBleHBjLCBUIGRlc3IpIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBib29sCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKGF0b21pYzxUPiogb2JqLCBUKiBleHBjLCBUIGRlc3IpIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBib29sCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vha19leHBsaWNpdCh2b2xhdGlsZSBhdG9taWM8VD4qIG9iaiwgVCogZXhwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgZGVzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBzLCBtZW1vcnlfb3JkZXIgZikgbm9leGNlcHQ7CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorICAgIGJvb2wKKyAgICBhdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrX2V4cGxpY2l0KGF0b21pYzxUPiogb2JqLCBUKiBleHBjLCBUIGRlc3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgcywgbWVtb3J5X29yZGVyIGYpIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBib29sCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pYzxUPiogb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUKiBleHBjLCBUIGRlc3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBzLCBtZW1vcnlfb3JkZXIgZikgbm9leGNlcHQ7CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorICAgIGJvb2wKKyAgICBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmdfZXhwbGljaXQoYXRvbWljPFQ+KiBvYmosIFQqIGV4cGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgZGVzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIHMsIG1lbW9yeV9vcmRlciBmKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIEludGVncmFsPgorICAgIEludGVncmFsCisgICAgYXRvbWljX2ZldGNoX2FkZCh2b2xhdGlsZSBhdG9taWM8SW50ZWdyYWw+KiBvYmosIEludGVncmFsIG9wKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIEludGVncmFsPgorICAgIEludGVncmFsCisgICAgYXRvbWljX2ZldGNoX2FkZChhdG9taWM8SW50ZWdyYWw+KiBvYmosIEludGVncmFsIG9wKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIEludGVncmFsPgorICAgIEludGVncmFsCisgICAgYXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWM8SW50ZWdyYWw+KiBvYmosIEludGVncmFsIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIG0pIG5vZXhjZXB0OwordGVtcGxhdGUgPGNsYXNzIEludGVncmFsPgorICAgIEludGVncmFsCisgICAgYXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdChhdG9taWM8SW50ZWdyYWw+KiBvYmosIEludGVncmFsIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIG0pIG5vZXhjZXB0OwordGVtcGxhdGUgPGNsYXNzIEludGVncmFsPgorICAgIEludGVncmFsCisgICAgYXRvbWljX2ZldGNoX3N1Yih2b2xhdGlsZSBhdG9taWM8SW50ZWdyYWw+KiBvYmosIEludGVncmFsIG9wKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIEludGVncmFsPgorICAgIEludGVncmFsCisgICAgYXRvbWljX2ZldGNoX3N1YihhdG9taWM8SW50ZWdyYWw+KiBvYmosIEludGVncmFsIG9wKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIEludGVncmFsPgorICAgIEludGVncmFsCisgICAgYXRvbWljX2ZldGNoX3N1Yl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWM8SW50ZWdyYWw+KiBvYmosIEludGVncmFsIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIG0pIG5vZXhjZXB0OwordGVtcGxhdGUgPGNsYXNzIEludGVncmFsPgorICAgIEludGVncmFsCisgICAgYXRvbWljX2ZldGNoX3N1Yl9leHBsaWNpdChhdG9taWM8SW50ZWdyYWw+KiBvYmosIEludGVncmFsIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIG0pIG5vZXhjZXB0OwordGVtcGxhdGUgPGNsYXNzIEludGVncmFsPgorICAgIEludGVncmFsCisgICAgYXRvbWljX2ZldGNoX2FuZCh2b2xhdGlsZSBhdG9taWM8SW50ZWdyYWw+KiBvYmosIEludGVncmFsIG9wKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIEludGVncmFsPgorICAgIEludGVncmFsCisgICAgYXRvbWljX2ZldGNoX2FuZChhdG9taWM8SW50ZWdyYWw+KiBvYmosIEludGVncmFsIG9wKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIEludGVncmFsPgorICAgIEludGVncmFsCisgICAgYXRvbWljX2ZldGNoX2FuZF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWM8SW50ZWdyYWw+KiBvYmosIEludGVncmFsIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIG0pIG5vZXhjZXB0OwordGVtcGxhdGUgPGNsYXNzIEludGVncmFsPgorICAgIEludGVncmFsCisgICAgYXRvbWljX2ZldGNoX2FuZF9leHBsaWNpdChhdG9taWM8SW50ZWdyYWw+KiBvYmosIEludGVncmFsIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIG0pIG5vZXhjZXB0OwordGVtcGxhdGUgPGNsYXNzIEludGVncmFsPgorICAgIEludGVncmFsCisgICAgYXRvbWljX2ZldGNoX29yKHZvbGF0aWxlIGF0b21pYzxJbnRlZ3JhbD4qIG9iaiwgSW50ZWdyYWwgb3ApIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgSW50ZWdyYWw+CisgICAgSW50ZWdyYWwKKyAgICBhdG9taWNfZmV0Y2hfb3IoYXRvbWljPEludGVncmFsPiogb2JqLCBJbnRlZ3JhbCBvcCkgbm9leGNlcHQ7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnRlZ3JhbD4KKyAgICBJbnRlZ3JhbAorICAgIGF0b21pY19mZXRjaF9vcl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWM8SW50ZWdyYWw+KiBvYmosIEludGVncmFsIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgbSkgbm9leGNlcHQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgSW50ZWdyYWw+CisgICAgSW50ZWdyYWwKKyAgICBhdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQoYXRvbWljPEludGVncmFsPiogb2JqLCBJbnRlZ3JhbCBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIG0pIG5vZXhjZXB0OwordGVtcGxhdGUgPGNsYXNzIEludGVncmFsPgorICAgIEludGVncmFsCisgICAgYXRvbWljX2ZldGNoX3hvcih2b2xhdGlsZSBhdG9taWM8SW50ZWdyYWw+KiBvYmosIEludGVncmFsIG9wKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIEludGVncmFsPgorICAgIEludGVncmFsCisgICAgYXRvbWljX2ZldGNoX3hvcihhdG9taWM8SW50ZWdyYWw+KiBvYmosIEludGVncmFsIG9wKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIEludGVncmFsPgorICAgIEludGVncmFsCisgICAgYXRvbWljX2ZldGNoX3hvcl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWM8SW50ZWdyYWw+KiBvYmosIEludGVncmFsIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIG0pIG5vZXhjZXB0OwordGVtcGxhdGUgPGNsYXNzIEludGVncmFsPgorICAgIEludGVncmFsCisgICAgYXRvbWljX2ZldGNoX3hvcl9leHBsaWNpdChhdG9taWM8SW50ZWdyYWw+KiBvYmosIEludGVncmFsIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIG0pIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBUKgorICAgIGF0b21pY19mZXRjaF9hZGQodm9sYXRpbGUgYXRvbWljPFQqPiogb2JqLCBwdHJkaWZmX3Qgb3ApIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBUKgorICAgIGF0b21pY19mZXRjaF9hZGQoYXRvbWljPFQqPiogb2JqLCBwdHJkaWZmX3Qgb3ApIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBUKgorICAgIGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljPFQqPiogb2JqLCBwdHJkaWZmX3Qgb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgbSkgbm9leGNlcHQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBUKgorICAgIGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoYXRvbWljPFQqPiogb2JqLCBwdHJkaWZmX3Qgb3AsIG1lbW9yeV9vcmRlciBtKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgVCoKKyAgICBhdG9taWNfZmV0Y2hfc3ViKHZvbGF0aWxlIGF0b21pYzxUKj4qIG9iaiwgcHRyZGlmZl90IG9wKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgVCoKKyAgICBhdG9taWNfZmV0Y2hfc3ViKGF0b21pYzxUKj4qIG9iaiwgcHRyZGlmZl90IG9wKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgVCoKKyAgICBhdG9taWNfZmV0Y2hfc3ViX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pYzxUKj4qIG9iaiwgcHRyZGlmZl90IG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIG0pIG5vZXhjZXB0OwordGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgVCoKKyAgICBhdG9taWNfZmV0Y2hfc3ViX2V4cGxpY2l0KGF0b21pYzxUKj4qIG9iaiwgcHRyZGlmZl90IG9wLCBtZW1vcnlfb3JkZXIgbSkgbm9leGNlcHQ7CisKKy8vIEF0b21pY3MgZm9yIHN0YW5kYXJkIHR5cGVkZWYgdHlwZXMKKwordHlwZWRlZiBhdG9taWM8Ym9vbD4gICAgICAgICAgICAgICBhdG9taWNfYm9vbDsKK3R5cGVkZWYgYXRvbWljPGNoYXI+ICAgICAgICAgICAgICAgYXRvbWljX2NoYXI7Cit0eXBlZGVmIGF0b21pYzxzaWduZWQgY2hhcj4gICAgICAgIGF0b21pY19zY2hhcjsKK3R5cGVkZWYgYXRvbWljPHVuc2lnbmVkIGNoYXI+ICAgICAgYXRvbWljX3VjaGFyOwordHlwZWRlZiBhdG9taWM8c2hvcnQ+ICAgICAgICAgICAgICBhdG9taWNfc2hvcnQ7Cit0eXBlZGVmIGF0b21pYzx1bnNpZ25lZCBzaG9ydD4gICAgIGF0b21pY191c2hvcnQ7Cit0eXBlZGVmIGF0b21pYzxpbnQ+ICAgICAgICAgICAgICAgIGF0b21pY19pbnQ7Cit0eXBlZGVmIGF0b21pYzx1bnNpZ25lZCBpbnQ+ICAgICAgIGF0b21pY191aW50OwordHlwZWRlZiBhdG9taWM8bG9uZz4gICAgICAgICAgICAgICBhdG9taWNfbG9uZzsKK3R5cGVkZWYgYXRvbWljPHVuc2lnbmVkIGxvbmc+ICAgICAgYXRvbWljX3Vsb25nOwordHlwZWRlZiBhdG9taWM8bG9uZyBsb25nPiAgICAgICAgICBhdG9taWNfbGxvbmc7Cit0eXBlZGVmIGF0b21pYzx1bnNpZ25lZCBsb25nIGxvbmc+IGF0b21pY191bGxvbmc7Cit0eXBlZGVmIGF0b21pYzxjaGFyMTZfdD4gICAgICAgICAgIGF0b21pY19jaGFyMTZfdDsKK3R5cGVkZWYgYXRvbWljPGNoYXIzMl90PiAgICAgICAgICAgYXRvbWljX2NoYXIzMl90OwordHlwZWRlZiBhdG9taWM8d2NoYXJfdD4gICAgICAgICAgICBhdG9taWNfd2NoYXJfdDsKKwordHlwZWRlZiBhdG9taWM8aW50X2xlYXN0OF90PiAgIGF0b21pY19pbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmIGF0b21pYzx1aW50X2xlYXN0OF90PiAgYXRvbWljX3VpbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmIGF0b21pYzxpbnRfbGVhc3QxNl90PiAgYXRvbWljX2ludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIGF0b21pYzx1aW50X2xlYXN0MTZfdD4gYXRvbWljX3VpbnRfbGVhc3QxNl90OwordHlwZWRlZiBhdG9taWM8aW50X2xlYXN0MzJfdD4gIGF0b21pY19pbnRfbGVhc3QzMl90OwordHlwZWRlZiBhdG9taWM8dWludF9sZWFzdDMyX3Q+IGF0b21pY191aW50X2xlYXN0MzJfdDsKK3R5cGVkZWYgYXRvbWljPGludF9sZWFzdDY0X3Q+ICBhdG9taWNfaW50X2xlYXN0NjRfdDsKK3R5cGVkZWYgYXRvbWljPHVpbnRfbGVhc3Q2NF90PiBhdG9taWNfdWludF9sZWFzdDY0X3Q7CisKK3R5cGVkZWYgYXRvbWljPGludF9mYXN0OF90PiAgIGF0b21pY19pbnRfZmFzdDhfdDsKK3R5cGVkZWYgYXRvbWljPHVpbnRfZmFzdDhfdD4gIGF0b21pY191aW50X2Zhc3Q4X3Q7Cit0eXBlZGVmIGF0b21pYzxpbnRfZmFzdDE2X3Q+ICBhdG9taWNfaW50X2Zhc3QxNl90OwordHlwZWRlZiBhdG9taWM8dWludF9mYXN0MTZfdD4gYXRvbWljX3VpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIGF0b21pYzxpbnRfZmFzdDMyX3Q+ICBhdG9taWNfaW50X2Zhc3QzMl90OwordHlwZWRlZiBhdG9taWM8dWludF9mYXN0MzJfdD4gYXRvbWljX3VpbnRfZmFzdDMyX3Q7Cit0eXBlZGVmIGF0b21pYzxpbnRfZmFzdDY0X3Q+ICBhdG9taWNfaW50X2Zhc3Q2NF90OwordHlwZWRlZiBhdG9taWM8dWludF9mYXN0NjRfdD4gYXRvbWljX3VpbnRfZmFzdDY0X3Q7CisKK3R5cGVkZWYgYXRvbWljPGludDhfdD4gICBhdG9taWNfaW50OF90OwordHlwZWRlZiBhdG9taWM8dWludDhfdD4gIGF0b21pY191aW50OF90OwordHlwZWRlZiBhdG9taWM8aW50MTZfdD4gIGF0b21pY19pbnQxNl90OwordHlwZWRlZiBhdG9taWM8dWludDE2X3Q+IGF0b21pY191aW50MTZfdDsKK3R5cGVkZWYgYXRvbWljPGludDMyX3Q+ICBhdG9taWNfaW50MzJfdDsKK3R5cGVkZWYgYXRvbWljPHVpbnQzMl90PiBhdG9taWNfdWludDMyX3Q7Cit0eXBlZGVmIGF0b21pYzxpbnQ2NF90PiAgYXRvbWljX2ludDY0X3Q7Cit0eXBlZGVmIGF0b21pYzx1aW50NjRfdD4gYXRvbWljX3VpbnQ2NF90OworCit0eXBlZGVmIGF0b21pYzxpbnRwdHJfdD4gIGF0b21pY19pbnRwdHJfdDsKK3R5cGVkZWYgYXRvbWljPHVpbnRwdHJfdD4gYXRvbWljX3VpbnRwdHJfdDsKK3R5cGVkZWYgYXRvbWljPHNpemVfdD4gICAgYXRvbWljX3NpemVfdDsKK3R5cGVkZWYgYXRvbWljPHB0cmRpZmZfdD4gYXRvbWljX3B0cmRpZmZfdDsKK3R5cGVkZWYgYXRvbWljPGludG1heF90PiAgYXRvbWljX2ludG1heF90OwordHlwZWRlZiBhdG9taWM8dWludG1heF90PiBhdG9taWNfdWludG1heF90OworCisvLyBmZW5jZXMKKwordm9pZCBhdG9taWNfdGhyZWFkX2ZlbmNlKG1lbW9yeV9vcmRlciBtKSBub2V4Y2VwdDsKK3ZvaWQgYXRvbWljX3NpZ25hbF9mZW5jZShtZW1vcnlfb3JkZXIgbSkgbm9leGNlcHQ7CisKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2lmZGVmIF9MSUJDUFBfSEFTX05PX1RIUkVBRFMKKyNlcnJvciA8YXRvbWljPiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgc2luZ2xlIHRocmVhZGVkIHN5c3RlbQorI2VuZGlmCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfQ19BVE9NSUNfSU1QKSAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19HQ0NfQVRPTUlDX0lNUCkKKyNlcnJvciA8YXRvbWljPiBpcyBub3QgaW1wbGVtZW50ZWQKKyNlbmRpZgorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKyMgZGVmaW5lIF9fY3BwX2xpYl9hdG9taWNfaXNfYWx3YXlzX2xvY2tfZnJlZSAyMDE2MDNMCisjZW5kaWYKKworI2RlZmluZSBfTElCQ1BQX0NIRUNLX1NUT1JFX01FTU9SWV9PUkRFUihfX20pIFwKKyAgX0xJQkNQUF9ESUFHTk9TRV9XQVJOSU5HKF9fbSA9PSBtZW1vcnlfb3JkZXJfY29uc3VtZSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20gPT0gbWVtb3J5X29yZGVyX2FjcXVpcmUgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tID09IG1lbW9yeV9vcmRlcl9hY3FfcmVsLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtZW1vcnkgb3JkZXIgYXJndW1lbnQgdG8gYXRvbWljIG9wZXJhdGlvbiBpcyBpbnZhbGlkIikKKworI2RlZmluZSBfTElCQ1BQX0NIRUNLX0xPQURfTUVNT1JZX09SREVSKF9fbSkgXAorICBfTElCQ1BQX0RJQUdOT1NFX1dBUk5JTkcoX19tID09IG1lbW9yeV9vcmRlcl9yZWxlYXNlIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbSA9PSBtZW1vcnlfb3JkZXJfYWNxX3JlbCwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAibWVtb3J5IG9yZGVyIGFyZ3VtZW50IHRvIGF0b21pYyBvcGVyYXRpb24gaXMgaW52YWxpZCIpCisKKyNkZWZpbmUgX0xJQkNQUF9DSEVDS19FWENIQU5HRV9NRU1PUllfT1JERVIoX19tLCBfX2YpIFwKKyAgX0xJQkNQUF9ESUFHTk9TRV9XQVJOSU5HKF9fZiA9PSBtZW1vcnlfb3JkZXJfcmVsZWFzZSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2YgPT0gbWVtb3J5X29yZGVyX2FjcV9yZWwsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIm1lbW9yeSBvcmRlciBhcmd1bWVudCB0byBhdG9taWMgb3BlcmF0aW9uIGlzIGludmFsaWQiKQorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKwordHlwZWRlZiBlbnVtIG1lbW9yeV9vcmRlcgoreworICAgIG1lbW9yeV9vcmRlcl9yZWxheGVkLCBtZW1vcnlfb3JkZXJfY29uc3VtZSwgbWVtb3J5X29yZGVyX2FjcXVpcmUsCisgICAgbWVtb3J5X29yZGVyX3JlbGVhc2UsIG1lbW9yeV9vcmRlcl9hY3FfcmVsLCBtZW1vcnlfb3JkZXJfc2VxX2NzdAorfSBtZW1vcnlfb3JkZXI7CisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfSEFTX0dDQ19BVE9NSUNfSU1QKQorbmFtZXNwYWNlIF9fZ2NjX2F0b21pYyB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorc3RydWN0IF9fZ2NjX2F0b21pY190IHsKKworI2lmIF9HTlVDX1ZFUiA+PSA1MDEKKyAgICBzdGF0aWNfYXNzZXJ0KGlzX3RyaXZpYWxseV9jb3B5YWJsZTxfVHA+Ojp2YWx1ZSwKKyAgICAgICJzdGQ6OmF0b21pYzxUcD4gcmVxdWlyZXMgdGhhdCAnVHAnIGJlIGEgdHJpdmlhbGx5IGNvcHlhYmxlIHR5cGUiKTsKKyNlbmRpZgorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX19nY2NfYXRvbWljX3QoKSBfTk9FWENFUFQgPSBkZWZhdWx0OworI2Vsc2UKKyAgICBfX2djY19hdG9taWNfdCgpIF9OT0VYQ0VQVCA6IF9fYV92YWx1ZSgpIHt9CisjZW5kaWYgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisgIF9MSUJDUFBfQ09OU1RFWFBSIGV4cGxpY2l0IF9fZ2NjX2F0b21pY190KF9UcCB2YWx1ZSkgX05PRVhDRVBUCisgICAgOiBfX2FfdmFsdWUodmFsdWUpIHt9CisgIF9UcCBfX2FfdmFsdWU7Cit9OworI2RlZmluZSBfQXRvbWljKHgpIF9fZ2NjX2F0b21pYzo6X19nY2NfYXRvbWljX3Q8eD4KKwordGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4gX1RwIF9fY3JlYXRlKCk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UZD4KK3R5cGVuYW1lIGVuYWJsZV9pZjxzaXplb2YoX1RwKCktPl9fYV92YWx1ZSA9IF9fY3JlYXRlPF9UZD4oKSksIGNoYXI+Ojp0eXBlCisgICAgX190ZXN0X2F0b21pY19hc3NpZ25hYmxlKGludCk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CitfX3R3byBfX3Rlc3RfYXRvbWljX2Fzc2lnbmFibGUoLi4uKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RkPgorc3RydWN0IF9fY2FuX2Fzc2lnbiB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0KKyAgICAgIHNpemVvZihfX3Rlc3RfYXRvbWljX2Fzc2lnbmFibGU8X1RwLCBfVGQ+KDEpKSA9PSBzaXplb2YoY2hhcik7Cit9OworCitzdGF0aWMgaW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIGludCBfX3RvX2djY19vcmRlcihtZW1vcnlfb3JkZXIgX19vcmRlcikgeworICAvLyBBdm9pZCBzd2l0Y2ggc3RhdGVtZW50IHRvIG1ha2UgdGhpcyBhIGNvbnN0ZXhwci4KKyAgcmV0dXJuIF9fb3JkZXIgPT0gbWVtb3J5X29yZGVyX3JlbGF4ZWQgPyBfX0FUT01JQ19SRUxBWEVEOgorICAgICAgICAgKF9fb3JkZXIgPT0gbWVtb3J5X29yZGVyX2FjcXVpcmUgPyBfX0FUT01JQ19BQ1FVSVJFOgorICAgICAgICAgIChfX29yZGVyID09IG1lbW9yeV9vcmRlcl9yZWxlYXNlID8gX19BVE9NSUNfUkVMRUFTRToKKyAgICAgICAgICAgKF9fb3JkZXIgPT0gbWVtb3J5X29yZGVyX3NlcV9jc3QgPyBfX0FUT01JQ19TRVFfQ1NUOgorICAgICAgICAgICAgKF9fb3JkZXIgPT0gbWVtb3J5X29yZGVyX2FjcV9yZWwgPyBfX0FUT01JQ19BQ1FfUkVMOgorICAgICAgICAgICAgICBfX0FUT01JQ19DT05TVU1FKSkpKTsKK30KKworc3RhdGljIGlubGluZSBfTElCQ1BQX0NPTlNURVhQUiBpbnQgX190b19nY2NfZmFpbHVyZV9vcmRlcihtZW1vcnlfb3JkZXIgX19vcmRlcikgeworICAvLyBBdm9pZCBzd2l0Y2ggc3RhdGVtZW50IHRvIG1ha2UgdGhpcyBhIGNvbnN0ZXhwci4KKyAgcmV0dXJuIF9fb3JkZXIgPT0gbWVtb3J5X29yZGVyX3JlbGF4ZWQgPyBfX0FUT01JQ19SRUxBWEVEOgorICAgICAgICAgKF9fb3JkZXIgPT0gbWVtb3J5X29yZGVyX2FjcXVpcmUgPyBfX0FUT01JQ19BQ1FVSVJFOgorICAgICAgICAgIChfX29yZGVyID09IG1lbW9yeV9vcmRlcl9yZWxlYXNlID8gX19BVE9NSUNfUkVMQVhFRDoKKyAgICAgICAgICAgKF9fb3JkZXIgPT0gbWVtb3J5X29yZGVyX3NlcV9jc3QgPyBfX0FUT01JQ19TRVFfQ1NUOgorICAgICAgICAgICAgKF9fb3JkZXIgPT0gbWVtb3J5X29yZGVyX2FjcV9yZWwgPyBfX0FUT01JQ19BQ1FVSVJFOgorICAgICAgICAgICAgICBfX0FUT01JQ19DT05TVU1FKSkpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgX19nY2NfYXRvbWljCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CitzdGF0aWMgaW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgX19nY2NfYXRvbWljOjpfX2Nhbl9hc3NpZ248dm9sYXRpbGUgX0F0b21pYyhfVHApKiwgX1RwPjo6dmFsdWU+Ojp0eXBlCitfX2MxMV9hdG9taWNfaW5pdCh2b2xhdGlsZSBfQXRvbWljKF9UcCkqIF9fYSwgIF9UcCBfX3ZhbCkgeworICBfX2EtPl9fYV92YWx1ZSA9IF9fdmFsOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorc3RhdGljIGlubGluZQordHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICFfX2djY19hdG9taWM6Ol9fY2FuX2Fzc2lnbjx2b2xhdGlsZSBfQXRvbWljKF9UcCkqLCBfVHA+Ojp2YWx1ZSAmJgorICAgICBfX2djY19hdG9taWM6Ol9fY2FuX2Fzc2lnbjwgICAgICAgICBfQXRvbWljKF9UcCkqLCBfVHA+Ojp2YWx1ZT46OnR5cGUKK19fYzExX2F0b21pY19pbml0KHZvbGF0aWxlIF9BdG9taWMoX1RwKSogX19hLCAgX1RwIF9fdmFsKSB7CisgIC8vIFthdG9taWNzLnR5cGVzLmdlbmVyaWNdcDEgZ3VhcmFudGVlcyBfVHAgaXMgdHJpdmlhbGx5IGNvcHlhYmxlLiBCZWNhdXNlCisgIC8vIHRoZSBkZWZhdWx0IG9wZXJhdG9yPSBpbiBhbiBvYmplY3QgaXMgbm90IHZvbGF0aWxlLCBhIGJ5dGUtYnktYnl0ZSBjb3B5CisgIC8vIGlzIHJlcXVpcmVkLgorICB2b2xhdGlsZSBjaGFyKiB0byA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgY2hhcio+KCZfX2EtPl9fYV92YWx1ZSk7CisgIHZvbGF0aWxlIGNoYXIqIGVuZCA9IHRvICsgc2l6ZW9mKF9UcCk7CisgIGNoYXIqIGZyb20gPSByZWludGVycHJldF9jYXN0PGNoYXIqPigmX192YWwpOworICB3aGlsZSAodG8gIT0gZW5kKSB7CisgICAgKnRvKysgPSAqZnJvbSsrOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CitzdGF0aWMgaW5saW5lIHZvaWQgX19jMTFfYXRvbWljX2luaXQoX0F0b21pYyhfVHApKiBfX2EsICBfVHAgX192YWwpIHsKKyAgX19hLT5fX2FfdmFsdWUgPSBfX3ZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fYzExX2F0b21pY190aHJlYWRfZmVuY2UobWVtb3J5X29yZGVyIF9fb3JkZXIpIHsKKyAgX19hdG9taWNfdGhyZWFkX2ZlbmNlKF9fZ2NjX2F0b21pYzo6X190b19nY2Nfb3JkZXIoX19vcmRlcikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19jMTFfYXRvbWljX3NpZ25hbF9mZW5jZShtZW1vcnlfb3JkZXIgX19vcmRlcikgeworICBfX2F0b21pY19zaWduYWxfZmVuY2UoX19nY2NfYXRvbWljOjpfX3RvX2djY19vcmRlcihfX29yZGVyKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CitzdGF0aWMgaW5saW5lIHZvaWQgX19jMTFfYXRvbWljX3N0b3JlKHZvbGF0aWxlIF9BdG9taWMoX1RwKSogX19hLCAgX1RwIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgX19vcmRlcikgeworICByZXR1cm4gX19hdG9taWNfc3RvcmUoJl9fYS0+X19hX3ZhbHVlLCAmX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2djY19hdG9taWM6Ol9fdG9fZ2NjX29yZGVyKF9fb3JkZXIpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2MxMV9hdG9taWNfc3RvcmUoX0F0b21pYyhfVHApKiBfX2EsICBfVHAgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBfX29yZGVyKSB7CisgIF9fYXRvbWljX3N0b3JlKCZfX2EtPl9fYV92YWx1ZSwgJl9fdmFsLAorICAgICAgICAgICAgICAgICBfX2djY19hdG9taWM6Ol9fdG9fZ2NjX29yZGVyKF9fb3JkZXIpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KK3N0YXRpYyBpbmxpbmUgX1RwIF9fYzExX2F0b21pY19sb2FkKHZvbGF0aWxlIF9BdG9taWMoX1RwKSogX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIF9fb3JkZXIpIHsKKyAgX1RwIF9fcmV0OworICBfX2F0b21pY19sb2FkKCZfX2EtPl9fYV92YWx1ZSwgJl9fcmV0LAorICAgICAgICAgICAgICAgIF9fZ2NjX2F0b21pYzo6X190b19nY2Nfb3JkZXIoX19vcmRlcikpOworICByZXR1cm4gX19yZXQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CitzdGF0aWMgaW5saW5lIF9UcCBfX2MxMV9hdG9taWNfbG9hZChfQXRvbWljKF9UcCkqIF9fYSwgbWVtb3J5X29yZGVyIF9fb3JkZXIpIHsKKyAgX1RwIF9fcmV0OworICBfX2F0b21pY19sb2FkKCZfX2EtPl9fYV92YWx1ZSwgJl9fcmV0LAorICAgICAgICAgICAgICAgIF9fZ2NjX2F0b21pYzo6X190b19nY2Nfb3JkZXIoX19vcmRlcikpOworICByZXR1cm4gX19yZXQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CitzdGF0aWMgaW5saW5lIF9UcCBfX2MxMV9hdG9taWNfZXhjaGFuZ2Uodm9sYXRpbGUgX0F0b21pYyhfVHApKiBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwIF9fdmFsdWUsIG1lbW9yeV9vcmRlciBfX29yZGVyKSB7CisgIF9UcCBfX3JldDsKKyAgX19hdG9taWNfZXhjaGFuZ2UoJl9fYS0+X19hX3ZhbHVlLCAmX192YWx1ZSwgJl9fcmV0LAorICAgICAgICAgICAgICAgICAgICBfX2djY19hdG9taWM6Ol9fdG9fZ2NjX29yZGVyKF9fb3JkZXIpKTsKKyAgcmV0dXJuIF9fcmV0OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorc3RhdGljIGlubGluZSBfVHAgX19jMTFfYXRvbWljX2V4Y2hhbmdlKF9BdG9taWMoX1RwKSogX19hLCBfVHAgX192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgX19vcmRlcikgeworICBfVHAgX19yZXQ7CisgIF9fYXRvbWljX2V4Y2hhbmdlKCZfX2EtPl9fYV92YWx1ZSwgJl9fdmFsdWUsICZfX3JldCwKKyAgICAgICAgICAgICAgICAgICAgX19nY2NfYXRvbWljOjpfX3RvX2djY19vcmRlcihfX29yZGVyKSk7CisgIHJldHVybiBfX3JldDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2MxMV9hdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoCisgICAgdm9sYXRpbGUgX0F0b21pYyhfVHApKiBfX2EsIF9UcCogX19leHBlY3RlZCwgX1RwIF9fdmFsdWUsCisgICAgbWVtb3J5X29yZGVyIF9fc3VjY2VzcywgbWVtb3J5X29yZGVyIF9fZmFpbHVyZSkgeworICByZXR1cm4gX19hdG9taWNfY29tcGFyZV9leGNoYW5nZSgmX19hLT5fX2FfdmFsdWUsIF9fZXhwZWN0ZWQsICZfX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nY2NfYXRvbWljOjpfX3RvX2djY19vcmRlcihfX3N1Y2Nlc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2djY19hdG9taWM6Ol9fdG9fZ2NjX2ZhaWx1cmVfb3JkZXIoX19mYWlsdXJlKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CitzdGF0aWMgaW5saW5lIGJvb2wgX19jMTFfYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKAorICAgIF9BdG9taWMoX1RwKSogX19hLCBfVHAqIF9fZXhwZWN0ZWQsIF9UcCBfX3ZhbHVlLCBtZW1vcnlfb3JkZXIgX19zdWNjZXNzLAorICAgIG1lbW9yeV9vcmRlciBfX2ZhaWx1cmUpIHsKKyAgcmV0dXJuIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2UoJl9fYS0+X19hX3ZhbHVlLCBfX2V4cGVjdGVkLCAmX192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ2NjX2F0b21pYzo6X190b19nY2Nfb3JkZXIoX19zdWNjZXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nY2NfYXRvbWljOjpfX3RvX2djY19mYWlsdXJlX29yZGVyKF9fZmFpbHVyZSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorc3RhdGljIGlubGluZSBib29sIF9fYzExX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWsoCisgICAgdm9sYXRpbGUgX0F0b21pYyhfVHApKiBfX2EsIF9UcCogX19leHBlY3RlZCwgX1RwIF9fdmFsdWUsCisgICAgbWVtb3J5X29yZGVyIF9fc3VjY2VzcywgbWVtb3J5X29yZGVyIF9fZmFpbHVyZSkgeworICByZXR1cm4gX19hdG9taWNfY29tcGFyZV9leGNoYW5nZSgmX19hLT5fX2FfdmFsdWUsIF9fZXhwZWN0ZWQsICZfX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2djY19hdG9taWM6Ol9fdG9fZ2NjX29yZGVyKF9fc3VjY2VzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ2NjX2F0b21pYzo6X190b19nY2NfZmFpbHVyZV9vcmRlcihfX2ZhaWx1cmUpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2MxMV9hdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrKAorICAgIF9BdG9taWMoX1RwKSogX19hLCBfVHAqIF9fZXhwZWN0ZWQsIF9UcCBfX3ZhbHVlLCBtZW1vcnlfb3JkZXIgX19zdWNjZXNzLAorICAgIG1lbW9yeV9vcmRlciBfX2ZhaWx1cmUpIHsKKyAgcmV0dXJuIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2UoJl9fYS0+X19hX3ZhbHVlLCBfX2V4cGVjdGVkLCAmX192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nY2NfYXRvbWljOjpfX3RvX2djY19vcmRlcihfX3N1Y2Nlc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2djY19hdG9taWM6Ol9fdG9fZ2NjX2ZhaWx1cmVfb3JkZXIoX19mYWlsdXJlKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CitzdHJ1Y3QgX19za2lwX2FtdCB7IGVudW0ge3ZhbHVlID0gMX07IH07CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CitzdHJ1Y3QgX19za2lwX2FtdDxfVHAqPiB7IGVudW0ge3ZhbHVlID0gc2l6ZW9mKF9UcCl9OyB9OworCisvLyBGSVhNRTogSGF2ZW4ndCBmaWd1cmVkIG91dCB3aGF0IHRoZSBzcGVjIHNheXMgYWJvdXQgdXNpbmcgYXJyYXlzIHdpdGgKKy8vIGF0b21pY19mZXRjaF9hZGQuIEZvcmNlIGEgZmFpbHVyZSByYXRoZXIgdGhhbiBjcmVhdGluZyBiYWQgYmVoYXZpb3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorc3RydWN0IF9fc2tpcF9hbXQ8X1RwW10+IHsgfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIGludCBuPgorc3RydWN0IF9fc2tpcF9hbXQ8X1RwW25dPiB7IH07CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UZD4KK3N0YXRpYyBpbmxpbmUgX1RwIF9fYzExX2F0b21pY19mZXRjaF9hZGQodm9sYXRpbGUgX0F0b21pYyhfVHApKiBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UZCBfX2RlbHRhLCBtZW1vcnlfb3JkZXIgX19vcmRlcikgeworICByZXR1cm4gX19hdG9taWNfZmV0Y2hfYWRkKCZfX2EtPl9fYV92YWx1ZSwgX19kZWx0YSAqIF9fc2tpcF9hbXQ8X1RwPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nY2NfYXRvbWljOjpfX3RvX2djY19vcmRlcihfX29yZGVyKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UZD4KK3N0YXRpYyBpbmxpbmUgX1RwIF9fYzExX2F0b21pY19mZXRjaF9hZGQoX0F0b21pYyhfVHApKiBfX2EsIF9UZCBfX2RlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgX19vcmRlcikgeworICByZXR1cm4gX19hdG9taWNfZmV0Y2hfYWRkKCZfX2EtPl9fYV92YWx1ZSwgX19kZWx0YSAqIF9fc2tpcF9hbXQ8X1RwPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nY2NfYXRvbWljOjpfX3RvX2djY19vcmRlcihfX29yZGVyKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UZD4KK3N0YXRpYyBpbmxpbmUgX1RwIF9fYzExX2F0b21pY19mZXRjaF9zdWIodm9sYXRpbGUgX0F0b21pYyhfVHApKiBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UZCBfX2RlbHRhLCBtZW1vcnlfb3JkZXIgX19vcmRlcikgeworICByZXR1cm4gX19hdG9taWNfZmV0Y2hfc3ViKCZfX2EtPl9fYV92YWx1ZSwgX19kZWx0YSAqIF9fc2tpcF9hbXQ8X1RwPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nY2NfYXRvbWljOjpfX3RvX2djY19vcmRlcihfX29yZGVyKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UZD4KK3N0YXRpYyBpbmxpbmUgX1RwIF9fYzExX2F0b21pY19mZXRjaF9zdWIoX0F0b21pYyhfVHApKiBfX2EsIF9UZCBfX2RlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgX19vcmRlcikgeworICByZXR1cm4gX19hdG9taWNfZmV0Y2hfc3ViKCZfX2EtPl9fYV92YWx1ZSwgX19kZWx0YSAqIF9fc2tpcF9hbXQ8X1RwPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nY2NfYXRvbWljOjpfX3RvX2djY19vcmRlcihfX29yZGVyKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CitzdGF0aWMgaW5saW5lIF9UcCBfX2MxMV9hdG9taWNfZmV0Y2hfYW5kKHZvbGF0aWxlIF9BdG9taWMoX1RwKSogX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAgX19wYXR0ZXJuLCBtZW1vcnlfb3JkZXIgX19vcmRlcikgeworICByZXR1cm4gX19hdG9taWNfZmV0Y2hfYW5kKCZfX2EtPl9fYV92YWx1ZSwgX19wYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ2NjX2F0b21pYzo6X190b19nY2Nfb3JkZXIoX19vcmRlcikpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorc3RhdGljIGlubGluZSBfVHAgX19jMTFfYXRvbWljX2ZldGNoX2FuZChfQXRvbWljKF9UcCkqIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwIF9fcGF0dGVybiwgbWVtb3J5X29yZGVyIF9fb3JkZXIpIHsKKyAgcmV0dXJuIF9fYXRvbWljX2ZldGNoX2FuZCgmX19hLT5fX2FfdmFsdWUsIF9fcGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2djY19hdG9taWM6Ol9fdG9fZ2NjX29yZGVyKF9fb3JkZXIpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KK3N0YXRpYyBpbmxpbmUgX1RwIF9fYzExX2F0b21pY19mZXRjaF9vcih2b2xhdGlsZSBfQXRvbWljKF9UcCkqIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAgX19wYXR0ZXJuLCBtZW1vcnlfb3JkZXIgX19vcmRlcikgeworICByZXR1cm4gX19hdG9taWNfZmV0Y2hfb3IoJl9fYS0+X19hX3ZhbHVlLCBfX3BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2djY19hdG9taWM6Ol9fdG9fZ2NjX29yZGVyKF9fb3JkZXIpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KK3N0YXRpYyBpbmxpbmUgX1RwIF9fYzExX2F0b21pY19mZXRjaF9vcihfQXRvbWljKF9UcCkqIF9fYSwgX1RwIF9fcGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgX19vcmRlcikgeworICByZXR1cm4gX19hdG9taWNfZmV0Y2hfb3IoJl9fYS0+X19hX3ZhbHVlLCBfX3BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2djY19hdG9taWM6Ol9fdG9fZ2NjX29yZGVyKF9fb3JkZXIpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KK3N0YXRpYyBpbmxpbmUgX1RwIF9fYzExX2F0b21pY19mZXRjaF94b3Iodm9sYXRpbGUgX0F0b21pYyhfVHApKiBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcCBfX3BhdHRlcm4sIG1lbW9yeV9vcmRlciBfX29yZGVyKSB7CisgIHJldHVybiBfX2F0b21pY19mZXRjaF94b3IoJl9fYS0+X19hX3ZhbHVlLCBfX3BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nY2NfYXRvbWljOjpfX3RvX2djY19vcmRlcihfX29yZGVyKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CitzdGF0aWMgaW5saW5lIF9UcCBfX2MxMV9hdG9taWNfZmV0Y2hfeG9yKF9BdG9taWMoX1RwKSogX19hLCBfVHAgX19wYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgX19vcmRlcikgeworICByZXR1cm4gX19hdG9taWNfZmV0Y2hfeG9yKCZfX2EtPl9fYV92YWx1ZSwgX19wYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ2NjX2F0b21pYzo6X190b19nY2Nfb3JkZXIoX19vcmRlcikpOworfQorI2VuZGlmIC8vIF9MSUJDUFBfSEFTX0dDQ19BVE9NSUNfSU1QCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwCitraWxsX2RlcGVuZGVuY3koX1RwIF9feSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9feTsKK30KKworI2lmIGRlZmluZWQoX19DTEFOR19BVE9NSUNfQk9PTF9MT0NLX0ZSRUUpCisjIGRlZmluZSBBVE9NSUNfQk9PTF9MT0NLX0ZSRUUgICAgICBfX0NMQU5HX0FUT01JQ19CT09MX0xPQ0tfRlJFRQorIyBkZWZpbmUgQVRPTUlDX0NIQVJfTE9DS19GUkVFICAgICAgX19DTEFOR19BVE9NSUNfQ0hBUl9MT0NLX0ZSRUUKKyMgZGVmaW5lIEFUT01JQ19DSEFSMTZfVF9MT0NLX0ZSRUUgIF9fQ0xBTkdfQVRPTUlDX0NIQVIxNl9UX0xPQ0tfRlJFRQorIyBkZWZpbmUgQVRPTUlDX0NIQVIzMl9UX0xPQ0tfRlJFRSAgX19DTEFOR19BVE9NSUNfQ0hBUjMyX1RfTE9DS19GUkVFCisjIGRlZmluZSBBVE9NSUNfV0NIQVJfVF9MT0NLX0ZSRUUgICBfX0NMQU5HX0FUT01JQ19XQ0hBUl9UX0xPQ0tfRlJFRQorIyBkZWZpbmUgQVRPTUlDX1NIT1JUX0xPQ0tfRlJFRSAgICAgX19DTEFOR19BVE9NSUNfU0hPUlRfTE9DS19GUkVFCisjIGRlZmluZSBBVE9NSUNfSU5UX0xPQ0tfRlJFRSAgICAgICBfX0NMQU5HX0FUT01JQ19JTlRfTE9DS19GUkVFCisjIGRlZmluZSBBVE9NSUNfTE9OR19MT0NLX0ZSRUUgICAgICBfX0NMQU5HX0FUT01JQ19MT05HX0xPQ0tfRlJFRQorIyBkZWZpbmUgQVRPTUlDX0xMT05HX0xPQ0tfRlJFRSAgICAgX19DTEFOR19BVE9NSUNfTExPTkdfTE9DS19GUkVFCisjIGRlZmluZSBBVE9NSUNfUE9JTlRFUl9MT0NLX0ZSRUUgICBfX0NMQU5HX0FUT01JQ19QT0lOVEVSX0xPQ0tfRlJFRQorI2Vsc2UKKyMgZGVmaW5lIEFUT01JQ19CT09MX0xPQ0tfRlJFRSAgICAgIF9fR0NDX0FUT01JQ19CT09MX0xPQ0tfRlJFRQorIyBkZWZpbmUgQVRPTUlDX0NIQVJfTE9DS19GUkVFICAgICAgX19HQ0NfQVRPTUlDX0NIQVJfTE9DS19GUkVFCisjIGRlZmluZSBBVE9NSUNfQ0hBUjE2X1RfTE9DS19GUkVFICBfX0dDQ19BVE9NSUNfQ0hBUjE2X1RfTE9DS19GUkVFCisjIGRlZmluZSBBVE9NSUNfQ0hBUjMyX1RfTE9DS19GUkVFICBfX0dDQ19BVE9NSUNfQ0hBUjMyX1RfTE9DS19GUkVFCisjIGRlZmluZSBBVE9NSUNfV0NIQVJfVF9MT0NLX0ZSRUUgICBfX0dDQ19BVE9NSUNfV0NIQVJfVF9MT0NLX0ZSRUUKKyMgZGVmaW5lIEFUT01JQ19TSE9SVF9MT0NLX0ZSRUUgICAgIF9fR0NDX0FUT01JQ19TSE9SVF9MT0NLX0ZSRUUKKyMgZGVmaW5lIEFUT01JQ19JTlRfTE9DS19GUkVFICAgICAgIF9fR0NDX0FUT01JQ19JTlRfTE9DS19GUkVFCisjIGRlZmluZSBBVE9NSUNfTE9OR19MT0NLX0ZSRUUgICAgICBfX0dDQ19BVE9NSUNfTE9OR19MT0NLX0ZSRUUKKyMgZGVmaW5lIEFUT01JQ19MTE9OR19MT0NLX0ZSRUUgICAgIF9fR0NDX0FUT01JQ19MTE9OR19MT0NLX0ZSRUUKKyMgZGVmaW5lIEFUT01JQ19QT0lOVEVSX0xPQ0tfRlJFRSAgIF9fR0NDX0FUT01JQ19QT0lOVEVSX0xPQ0tfRlJFRQorI2VuZGlmCisKKy8vIGdlbmVyYWwgYXRvbWljPFQ+CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGJvb2wgPSBpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZSAmJiAhaXNfc2FtZTxfVHAsIGJvb2w+Ojp2YWx1ZT4KK3N0cnVjdCBfX2F0b21pY19iYXNlICAvLyBmYWxzZQoreworICAgIG11dGFibGUgX0F0b21pYyhfVHApIF9fYV87CisKKyNpZiBkZWZpbmVkKF9fY3BwX2xpYl9hdG9taWNfaXNfYWx3YXlzX2xvY2tfZnJlZSkKKyAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfYWx3YXlzX2xvY2tfZnJlZSA9IF9fYXRvbWljX2Fsd2F5c19sb2NrX2ZyZWUoc2l6ZW9mKF9fYV8pLCAwKTsKKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgaXNfbG9ja19mcmVlKCkgY29uc3Qgdm9sYXRpbGUgX05PRVhDRVBUCisgICAgeworI2lmIGRlZmluZWQoX0xJQkNQUF9IQVNfQ19BVE9NSUNfSU1QKQorICAgIHJldHVybiBfX2MxMV9hdG9taWNfaXNfbG9ja19mcmVlKHNpemVvZihfVHApKTsKKyNlbHNlCisgICAgcmV0dXJuIF9fYXRvbWljX2lzX2xvY2tfZnJlZShzaXplb2YoX1RwKSwgMCk7CisjZW5kaWYKKyAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgaXNfbG9ja19mcmVlKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gc3RhdGljX2Nhc3Q8X19hdG9taWNfYmFzZSBjb25zdCB2b2xhdGlsZSo+KHRoaXMpLT5pc19sb2NrX2ZyZWUoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc3RvcmUoX1RwIF9fZCwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBfTk9FWENFUFQKKyAgICAgIF9MSUJDUFBfQ0hFQ0tfU1RPUkVfTUVNT1JZX09SREVSKF9fbSkKKyAgICAgICAge19fYzExX2F0b21pY19zdG9yZSgmX19hXywgX19kLCBfX20pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzdG9yZShfVHAgX19kLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIF9OT0VYQ0VQVAorICAgICAgX0xJQkNQUF9DSEVDS19TVE9SRV9NRU1PUllfT1JERVIoX19tKQorICAgICAgICB7X19jMTFfYXRvbWljX3N0b3JlKCZfX2FfLCBfX2QsIF9fbSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAgbG9hZChtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIGNvbnN0IHZvbGF0aWxlIF9OT0VYQ0VQVAorICAgICAgX0xJQkNQUF9DSEVDS19MT0FEX01FTU9SWV9PUkRFUihfX20pCisgICAgICAgIHtyZXR1cm4gX19jMTFfYXRvbWljX2xvYWQoJl9fYV8sIF9fbSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAgbG9hZChtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgX0xJQkNQUF9DSEVDS19MT0FEX01FTU9SWV9PUkRFUihfX20pCisgICAgICAgIHtyZXR1cm4gX19jMTFfYXRvbWljX2xvYWQoJl9fYV8sIF9fbSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvciBfVHAoKSBjb25zdCB2b2xhdGlsZSBfTk9FWENFUFQge3JldHVybiBsb2FkKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvciBfVHAoKSBjb25zdCBfTk9FWENFUFQgICAgICAgICAge3JldHVybiBsb2FkKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAgZXhjaGFuZ2UoX1RwIF9fZCwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2MxMV9hdG9taWNfZXhjaGFuZ2UoJl9fYV8sIF9fZCwgX19tKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBleGNoYW5nZShfVHAgX19kLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fYzExX2F0b21pY19leGNoYW5nZSgmX19hXywgX19kLCBfX20pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoX1RwJiBfX2UsIF9UcCBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIF9fcywgbWVtb3J5X29yZGVyIF9fZikgdm9sYXRpbGUgX05PRVhDRVBUCisgICAgICBfTElCQ1BQX0NIRUNLX0VYQ0hBTkdFX01FTU9SWV9PUkRFUihfX3MsIF9fZikKKyAgICAgICAge3JldHVybiBfX2MxMV9hdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrKCZfX2FfLCAmX19lLCBfX2QsIF9fcywgX19mKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgY29tcGFyZV9leGNoYW5nZV93ZWFrKF9UcCYgX19lLCBfVHAgX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBfX3MsIG1lbW9yeV9vcmRlciBfX2YpIF9OT0VYQ0VQVAorICAgICAgX0xJQkNQUF9DSEVDS19FWENIQU5HRV9NRU1PUllfT1JERVIoX19zLCBfX2YpCisgICAgICAgIHtyZXR1cm4gX19jMTFfYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhaygmX19hXywgJl9fZSwgX19kLCBfX3MsIF9fZik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9UcCYgX19lLCBfVHAgX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIF9fcywgbWVtb3J5X29yZGVyIF9fZikgdm9sYXRpbGUgX05PRVhDRVBUCisgICAgICBfTElCQ1BQX0NIRUNLX0VYQ0hBTkdFX01FTU9SWV9PUkRFUihfX3MsIF9fZikKKyAgICAgICAge3JldHVybiBfX2MxMV9hdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoJl9fYV8sICZfX2UsIF9fZCwgX19zLCBfX2YpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfVHAmIF9fZSwgX1RwIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBfX3MsIG1lbW9yeV9vcmRlciBfX2YpIF9OT0VYQ0VQVAorICAgICAgX0xJQkNQUF9DSEVDS19FWENIQU5HRV9NRU1PUllfT1JERVIoX19zLCBfX2YpCisgICAgICAgIHtyZXR1cm4gX19jMTFfYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKCZfX2FfLCAmX19lLCBfX2QsIF9fcywgX19mKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgY29tcGFyZV9leGNoYW5nZV93ZWFrKF9UcCYgX19lLCBfVHAgX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2MxMV9hdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrKCZfX2FfLCAmX19lLCBfX2QsIF9fbSwgX19tKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgY29tcGFyZV9leGNoYW5nZV93ZWFrKF9UcCYgX19lLCBfVHAgX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19jMTFfYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhaygmX19hXywgJl9fZSwgX19kLCBfX20sIF9fbSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9UcCYgX19lLCBfVHAgX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2MxMV9hdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoJl9fYV8sICZfX2UsIF9fZCwgX19tLCBfX20pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfVHAmIF9fZSwgX1RwIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19jMTFfYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKCZfX2FfLCAmX19lLCBfX2QsIF9fbSwgX19tKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9fYXRvbWljX2Jhc2UoKSBfTk9FWENFUFQgPSBkZWZhdWx0OworI2Vsc2UKKyAgICBfX2F0b21pY19iYXNlKCkgX05PRVhDRVBUIDogX19hXygpIHt9CisjZW5kaWYgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX0xJQkNQUF9DT05TVEVYUFIgX19hdG9taWNfYmFzZShfVHAgX19kKSBfTk9FWENFUFQgOiBfX2FfKF9fZCkge30KKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX19hdG9taWNfYmFzZShjb25zdCBfX2F0b21pY19iYXNlJikgPSBkZWxldGU7CisgICAgX19hdG9taWNfYmFzZSYgb3BlcmF0b3I9KGNvbnN0IF9fYXRvbWljX2Jhc2UmKSA9IGRlbGV0ZTsKKyAgICBfX2F0b21pY19iYXNlJiBvcGVyYXRvcj0oY29uc3QgX19hdG9taWNfYmFzZSYpIHZvbGF0aWxlID0gZGVsZXRlOworI2Vsc2UKK3ByaXZhdGU6CisgICAgX19hdG9taWNfYmFzZShjb25zdCBfX2F0b21pY19iYXNlJik7CisgICAgX19hdG9taWNfYmFzZSYgb3BlcmF0b3I9KGNvbnN0IF9fYXRvbWljX2Jhc2UmKTsKKyAgICBfX2F0b21pY19iYXNlJiBvcGVyYXRvcj0oY29uc3QgX19hdG9taWNfYmFzZSYpIHZvbGF0aWxlOworI2VuZGlmCit9OworCisjaWYgZGVmaW5lZChfX2NwcF9saWJfYXRvbWljX2lzX2Fsd2F5c19sb2NrX2ZyZWUpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBib29sIF9fYj4KK19MSUJDUFBfQ09OU1RFWFBSIGJvb2wgX19hdG9taWNfYmFzZTxfVHAsIF9fYj46OmlzX2Fsd2F5c19sb2NrX2ZyZWU7CisjZW5kaWYKKworLy8gYXRvbWljPEludGVncmFsPgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fYXRvbWljX2Jhc2U8X1RwLCB0cnVlPgorICAgIDogcHVibGljIF9fYXRvbWljX2Jhc2U8X1RwLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8X1RwLCBmYWxzZT4gX19iYXNlOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2F0b21pY19iYXNlKCkgX05PRVhDRVBUIF9MSUJDUFBfREVGQVVMVAorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfTElCQ1BQX0NPTlNURVhQUiBfX2F0b21pY19iYXNlKF9UcCBfX2QpIF9OT0VYQ0VQVCA6IF9fYmFzZShfX2QpIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIGZldGNoX2FkZChfVHAgX19vcCwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2MxMV9hdG9taWNfZmV0Y2hfYWRkKCZ0aGlzLT5fX2FfLCBfX29wLCBfX20pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIGZldGNoX2FkZChfVHAgX19vcCwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2MxMV9hdG9taWNfZmV0Y2hfYWRkKCZ0aGlzLT5fX2FfLCBfX29wLCBfX20pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIGZldGNoX3N1YihfVHAgX19vcCwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2MxMV9hdG9taWNfZmV0Y2hfc3ViKCZ0aGlzLT5fX2FfLCBfX29wLCBfX20pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIGZldGNoX3N1YihfVHAgX19vcCwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2MxMV9hdG9taWNfZmV0Y2hfc3ViKCZ0aGlzLT5fX2FfLCBfX29wLCBfX20pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIGZldGNoX2FuZChfVHAgX19vcCwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2MxMV9hdG9taWNfZmV0Y2hfYW5kKCZ0aGlzLT5fX2FfLCBfX29wLCBfX20pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIGZldGNoX2FuZChfVHAgX19vcCwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2MxMV9hdG9taWNfZmV0Y2hfYW5kKCZ0aGlzLT5fX2FfLCBfX29wLCBfX20pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIGZldGNoX29yKF9UcCBfX29wLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fYzExX2F0b21pY19mZXRjaF9vcigmdGhpcy0+X19hXywgX19vcCwgX19tKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBmZXRjaF9vcihfVHAgX19vcCwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2MxMV9hdG9taWNfZmV0Y2hfb3IoJnRoaXMtPl9fYV8sIF9fb3AsIF9fbSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAgZmV0Y2hfeG9yKF9UcCBfX29wLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fYzExX2F0b21pY19mZXRjaF94b3IoJnRoaXMtPl9fYV8sIF9fb3AsIF9fbSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAgZmV0Y2hfeG9yKF9UcCBfX29wLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fYzExX2F0b21pY19mZXRjaF94b3IoJnRoaXMtPl9fYV8sIF9fb3AsIF9fbSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvcisrKGludCkgdm9sYXRpbGUgX05PRVhDRVBUICAgICAge3JldHVybiBmZXRjaF9hZGQoX1RwKDEpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvcisrKGludCkgX05PRVhDRVBUICAgICAgICAgICAgICAge3JldHVybiBmZXRjaF9hZGQoX1RwKDEpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvci0tKGludCkgdm9sYXRpbGUgX05PRVhDRVBUICAgICAge3JldHVybiBmZXRjaF9zdWIoX1RwKDEpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvci0tKGludCkgX05PRVhDRVBUICAgICAgICAgICAgICAge3JldHVybiBmZXRjaF9zdWIoX1RwKDEpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvcisrKCkgdm9sYXRpbGUgX05PRVhDRVBUICAgICAgICAge3JldHVybiBmZXRjaF9hZGQoX1RwKDEpKSArIF9UcCgxKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvcisrKCkgX05PRVhDRVBUICAgICAgICAgICAgICAgICAge3JldHVybiBmZXRjaF9hZGQoX1RwKDEpKSArIF9UcCgxKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvci0tKCkgdm9sYXRpbGUgX05PRVhDRVBUICAgICAgICAge3JldHVybiBmZXRjaF9zdWIoX1RwKDEpKSAtIF9UcCgxKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvci0tKCkgX05PRVhDRVBUICAgICAgICAgICAgICAgICAge3JldHVybiBmZXRjaF9zdWIoX1RwKDEpKSAtIF9UcCgxKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvcis9KF9UcCBfX29wKSB2b2xhdGlsZSBfTk9FWENFUFQge3JldHVybiBmZXRjaF9hZGQoX19vcCkgKyBfX29wO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKz0oX1RwIF9fb3ApIF9OT0VYQ0VQVCAgICAgICAgICB7cmV0dXJuIGZldGNoX2FkZChfX29wKSArIF9fb3A7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAgb3BlcmF0b3ItPShfVHAgX19vcCkgdm9sYXRpbGUgX05PRVhDRVBUIHtyZXR1cm4gZmV0Y2hfc3ViKF9fb3ApIC0gX19vcDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvci09KF9UcCBfX29wKSBfTk9FWENFUFQgICAgICAgICAge3JldHVybiBmZXRjaF9zdWIoX19vcCkgLSBfX29wO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yJj0oX1RwIF9fb3ApIHZvbGF0aWxlIF9OT0VYQ0VQVCB7cmV0dXJuIGZldGNoX2FuZChfX29wKSAmIF9fb3A7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAgb3BlcmF0b3ImPShfVHAgX19vcCkgX05PRVhDRVBUICAgICAgICAgIHtyZXR1cm4gZmV0Y2hfYW5kKF9fb3ApICYgX19vcDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvcnw9KF9UcCBfX29wKSB2b2xhdGlsZSBfTk9FWENFUFQge3JldHVybiBmZXRjaF9vcihfX29wKSB8IF9fb3A7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAgb3BlcmF0b3J8PShfVHAgX19vcCkgX05PRVhDRVBUICAgICAgICAgIHtyZXR1cm4gZmV0Y2hfb3IoX19vcCkgfCBfX29wO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yXj0oX1RwIF9fb3ApIHZvbGF0aWxlIF9OT0VYQ0VQVCB7cmV0dXJuIGZldGNoX3hvcihfX29wKSBeIF9fb3A7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAgb3BlcmF0b3JePShfVHAgX19vcCkgX05PRVhDRVBUICAgICAgICAgIHtyZXR1cm4gZmV0Y2hfeG9yKF9fb3ApIF4gX19vcDt9Cit9OworCisvLyBhdG9taWM8VD4KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBhdG9taWMKKyAgICA6IHB1YmxpYyBfX2F0b21pY19iYXNlPF9UcD4KK3sKKyAgICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8X1RwPiBfX2Jhc2U7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGF0b21pYygpIF9OT0VYQ0VQVCBfTElCQ1BQX0RFRkFVTFQKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX0xJQkNQUF9DT05TVEVYUFIgYXRvbWljKF9UcCBfX2QpIF9OT0VYQ0VQVCA6IF9fYmFzZShfX2QpIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yPShfVHAgX19kKSB2b2xhdGlsZSBfTk9FWENFUFQKKyAgICAgICAge19fYmFzZTo6c3RvcmUoX19kKTsgcmV0dXJuIF9fZDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvcj0oX1RwIF9fZCkgX05PRVhDRVBUCisgICAgICAgIHtfX2Jhc2U6OnN0b3JlKF9fZCk7IHJldHVybiBfX2Q7fQorfTsKKworLy8gYXRvbWljPFQqPgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGF0b21pYzxfVHAqPgorICAgIDogcHVibGljIF9fYXRvbWljX2Jhc2U8X1RwKj4KK3sKKyAgICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8X1RwKj4gX19iYXNlOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBhdG9taWMoKSBfTk9FWENFUFQgX0xJQkNQUF9ERUZBVUxUCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGF0b21pYyhfVHAqIF9fZCkgX05PRVhDRVBUIDogX19iYXNlKF9fZCkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAqIG9wZXJhdG9yPShfVHAqIF9fZCkgdm9sYXRpbGUgX05PRVhDRVBUCisgICAgICAgIHtfX2Jhc2U6OnN0b3JlKF9fZCk7IHJldHVybiBfX2Q7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAqIG9wZXJhdG9yPShfVHAqIF9fZCkgX05PRVhDRVBUCisgICAgICAgIHtfX2Jhc2U6OnN0b3JlKF9fZCk7IHJldHVybiBfX2Q7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCogZmV0Y2hfYWRkKHB0cmRpZmZfdCBfX29wLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2MxMV9hdG9taWNfZmV0Y2hfYWRkKCZ0aGlzLT5fX2FfLCBfX29wLCBfX20pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwKiBmZXRjaF9hZGQocHRyZGlmZl90IF9fb3AsIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19jMTFfYXRvbWljX2ZldGNoX2FkZCgmdGhpcy0+X19hXywgX19vcCwgX19tKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCogZmV0Y2hfc3ViKHB0cmRpZmZfdCBfX29wLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2MxMV9hdG9taWNfZmV0Y2hfc3ViKCZ0aGlzLT5fX2FfLCBfX29wLCBfX20pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwKiBmZXRjaF9zdWIocHRyZGlmZl90IF9fb3AsIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19jMTFfYXRvbWljX2ZldGNoX3N1YigmdGhpcy0+X19hXywgX19vcCwgX19tKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwKiBvcGVyYXRvcisrKGludCkgdm9sYXRpbGUgX05PRVhDRVBUICAgICAgICAgICAge3JldHVybiBmZXRjaF9hZGQoMSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAqIG9wZXJhdG9yKysoaW50KSBfTk9FWENFUFQgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIGZldGNoX2FkZCgxKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCogb3BlcmF0b3ItLShpbnQpIHZvbGF0aWxlIF9OT0VYQ0VQVCAgICAgICAgICAgIHtyZXR1cm4gZmV0Y2hfc3ViKDEpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwKiBvcGVyYXRvci0tKGludCkgX05PRVhDRVBUICAgICAgICAgICAgICAgICAgICAge3JldHVybiBmZXRjaF9zdWIoMSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAqIG9wZXJhdG9yKysoKSB2b2xhdGlsZSBfTk9FWENFUFQgICAgICAgICAgICAgICB7cmV0dXJuIGZldGNoX2FkZCgxKSArIDE7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAqIG9wZXJhdG9yKysoKSBfTk9FWENFUFQgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIGZldGNoX2FkZCgxKSArIDE7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAqIG9wZXJhdG9yLS0oKSB2b2xhdGlsZSBfTk9FWENFUFQgICAgICAgICAgICAgICB7cmV0dXJuIGZldGNoX3N1YigxKSAtIDE7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAqIG9wZXJhdG9yLS0oKSBfTk9FWENFUFQgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIGZldGNoX3N1YigxKSAtIDE7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAqIG9wZXJhdG9yKz0ocHRyZGlmZl90IF9fb3ApIHZvbGF0aWxlIF9OT0VYQ0VQVCB7cmV0dXJuIGZldGNoX2FkZChfX29wKSArIF9fb3A7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAqIG9wZXJhdG9yKz0ocHRyZGlmZl90IF9fb3ApIF9OT0VYQ0VQVCAgICAgICAgICB7cmV0dXJuIGZldGNoX2FkZChfX29wKSArIF9fb3A7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAqIG9wZXJhdG9yLT0ocHRyZGlmZl90IF9fb3ApIHZvbGF0aWxlIF9OT0VYQ0VQVCB7cmV0dXJuIGZldGNoX3N1YihfX29wKSAtIF9fb3A7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAqIG9wZXJhdG9yLT0ocHRyZGlmZl90IF9fb3ApIF9OT0VYQ0VQVCAgICAgICAgICB7cmV0dXJuIGZldGNoX3N1YihfX29wKSAtIF9fb3A7fQorfTsKKworLy8gYXRvbWljX2lzX2xvY2tfZnJlZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK2F0b21pY19pc19sb2NrX2ZyZWUoY29uc3Qgdm9sYXRpbGUgYXRvbWljPF9UcD4qIF9fbykgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+aXNfbG9ja19mcmVlKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorYXRvbWljX2lzX2xvY2tfZnJlZShjb25zdCBhdG9taWM8X1RwPiogX19vKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19vLT5pc19sb2NrX2ZyZWUoKTsKK30KKworLy8gYXRvbWljX2luaXQKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCithdG9taWNfaW5pdCh2b2xhdGlsZSBhdG9taWM8X1RwPiogX19vLCBfVHAgX19kKSBfTk9FWENFUFQKK3sKKyAgICBfX2MxMV9hdG9taWNfaW5pdCgmX19vLT5fX2FfLCBfX2QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK2F0b21pY19pbml0KGF0b21pYzxfVHA+KiBfX28sIF9UcCBfX2QpIF9OT0VYQ0VQVAoreworICAgIF9fYzExX2F0b21pY19pbml0KCZfX28tPl9fYV8sIF9fZCk7Cit9CisKKy8vIGF0b21pY19zdG9yZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK2F0b21pY19zdG9yZSh2b2xhdGlsZSBhdG9taWM8X1RwPiogX19vLCBfVHAgX19kKSBfTk9FWENFUFQKK3sKKyAgICBfX28tPnN0b3JlKF9fZCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorYXRvbWljX3N0b3JlKGF0b21pYzxfVHA+KiBfX28sIF9UcCBfX2QpIF9OT0VYQ0VQVAoreworICAgIF9fby0+c3RvcmUoX19kKTsKK30KKworLy8gYXRvbWljX3N0b3JlX2V4cGxpY2l0CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorYXRvbWljX3N0b3JlX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pYzxfVHA+KiBfX28sIF9UcCBfX2QsIG1lbW9yeV9vcmRlciBfX20pIF9OT0VYQ0VQVAorICBfTElCQ1BQX0NIRUNLX1NUT1JFX01FTU9SWV9PUkRFUihfX20pCit7CisgICAgX19vLT5zdG9yZShfX2QsIF9fbSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorYXRvbWljX3N0b3JlX2V4cGxpY2l0KGF0b21pYzxfVHA+KiBfX28sIF9UcCBfX2QsIG1lbW9yeV9vcmRlciBfX20pIF9OT0VYQ0VQVAorICBfTElCQ1BQX0NIRUNLX1NUT1JFX01FTU9SWV9PUkRFUihfX20pCit7CisgICAgX19vLT5zdG9yZShfX2QsIF9fbSk7Cit9CisKKy8vIGF0b21pY19sb2FkCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwCithdG9taWNfbG9hZChjb25zdCB2b2xhdGlsZSBhdG9taWM8X1RwPiogX19vKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19vLT5sb2FkKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwCithdG9taWNfbG9hZChjb25zdCBhdG9taWM8X1RwPiogX19vKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19vLT5sb2FkKCk7Cit9CisKKy8vIGF0b21pY19sb2FkX2V4cGxpY2l0CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwCithdG9taWNfbG9hZF9leHBsaWNpdChjb25zdCB2b2xhdGlsZSBhdG9taWM8X1RwPiogX19vLCBtZW1vcnlfb3JkZXIgX19tKSBfTk9FWENFUFQKKyAgX0xJQkNQUF9DSEVDS19MT0FEX01FTU9SWV9PUkRFUihfX20pCit7CisgICAgcmV0dXJuIF9fby0+bG9hZChfX20pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19UcAorYXRvbWljX2xvYWRfZXhwbGljaXQoY29uc3QgYXRvbWljPF9UcD4qIF9fbywgbWVtb3J5X29yZGVyIF9fbSkgX05PRVhDRVBUCisgIF9MSUJDUFBfQ0hFQ0tfTE9BRF9NRU1PUllfT1JERVIoX19tKQoreworICAgIHJldHVybiBfX28tPmxvYWQoX19tKTsKK30KKworLy8gYXRvbWljX2V4Y2hhbmdlCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwCithdG9taWNfZXhjaGFuZ2Uodm9sYXRpbGUgYXRvbWljPF9UcD4qIF9fbywgX1RwIF9fZCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+ZXhjaGFuZ2UoX19kKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfVHAKK2F0b21pY19leGNoYW5nZShhdG9taWM8X1RwPiogX19vLCBfVHAgX19kKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19vLT5leGNoYW5nZShfX2QpOworfQorCisvLyBhdG9taWNfZXhjaGFuZ2VfZXhwbGljaXQKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfVHAKK2F0b21pY19leGNoYW5nZV9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWM8X1RwPiogX19vLCBfVHAgX19kLCBtZW1vcnlfb3JkZXIgX19tKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19vLT5leGNoYW5nZShfX2QsIF9fbSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwCithdG9taWNfZXhjaGFuZ2VfZXhwbGljaXQoYXRvbWljPF9UcD4qIF9fbywgX1RwIF9fZCwgbWVtb3J5X29yZGVyIF9fbSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+ZXhjaGFuZ2UoX19kLCBfX20pOworfQorCisvLyBhdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vhayh2b2xhdGlsZSBhdG9taWM8X1RwPiogX19vLCBfVHAqIF9fZSwgX1RwIF9fZCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+Y29tcGFyZV9leGNoYW5nZV93ZWFrKCpfX2UsIF9fZCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhayhhdG9taWM8X1RwPiogX19vLCBfVHAqIF9fZSwgX1RwIF9fZCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+Y29tcGFyZV9leGNoYW5nZV93ZWFrKCpfX2UsIF9fZCk7Cit9CisKKy8vIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyh2b2xhdGlsZSBhdG9taWM8X1RwPiogX19vLCBfVHAqIF9fZSwgX1RwIF9fZCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+Y29tcGFyZV9leGNoYW5nZV9zdHJvbmcoKl9fZSwgX19kKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCithdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoYXRvbWljPF9UcD4qIF9fbywgX1RwKiBfX2UsIF9UcCBfX2QpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX28tPmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKCpfX2UsIF9fZCk7Cit9CisKKy8vIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWtfZXhwbGljaXQKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCithdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pYzxfVHA+KiBfX28sIF9UcCogX19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAgX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgX19zLCBtZW1vcnlfb3JkZXIgX19mKSBfTk9FWENFUFQKKyAgX0xJQkNQUF9DSEVDS19FWENIQU5HRV9NRU1PUllfT1JERVIoX19zLCBfX2YpCit7CisgICAgcmV0dXJuIF9fby0+Y29tcGFyZV9leGNoYW5nZV93ZWFrKCpfX2UsIF9fZCwgX19zLCBfX2YpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWtfZXhwbGljaXQoYXRvbWljPF9UcD4qIF9fbywgX1RwKiBfX2UsIF9UcCBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBfX3MsIG1lbW9yeV9vcmRlciBfX2YpIF9OT0VYQ0VQVAorICBfTElCQ1BQX0NIRUNLX0VYQ0hBTkdFX01FTU9SWV9PUkRFUihfX3MsIF9fZikKK3sKKyAgICByZXR1cm4gX19vLT5jb21wYXJlX2V4Y2hhbmdlX3dlYWsoKl9fZSwgX19kLCBfX3MsIF9fZik7Cit9CisKKy8vIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdCh2b2xhdGlsZSBhdG9taWM8X1RwPiogX19vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcCogX19lLCBfVHAgX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBfX3MsIG1lbW9yeV9vcmRlciBfX2YpIF9OT0VYQ0VQVAorICBfTElCQ1BQX0NIRUNLX0VYQ0hBTkdFX01FTU9SWV9PUkRFUihfX3MsIF9fZikKK3sKKyAgICByZXR1cm4gX19vLT5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZygqX19lLCBfX2QsIF9fcywgX19mKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCithdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmdfZXhwbGljaXQoYXRvbWljPF9UcD4qIF9fbywgX1RwKiBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgX19zLCBtZW1vcnlfb3JkZXIgX19mKSBfTk9FWENFUFQKKyAgX0xJQkNQUF9DSEVDS19FWENIQU5HRV9NRU1PUllfT1JERVIoX19zLCBfX2YpCit7CisgICAgcmV0dXJuIF9fby0+Y29tcGFyZV9leGNoYW5nZV9zdHJvbmcoKl9fZSwgX19kLCBfX3MsIF9fZik7Cit9CisKKy8vIGF0b21pY19mZXRjaF9hZGQKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZSAmJiAhaXNfc2FtZTxfVHAsIGJvb2w+Ojp2YWx1ZSwKKyAgICBfVHAKKz46OnR5cGUKK2F0b21pY19mZXRjaF9hZGQodm9sYXRpbGUgYXRvbWljPF9UcD4qIF9fbywgX1RwIF9fb3ApIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX28tPmZldGNoX2FkZChfX29wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZSAmJiAhaXNfc2FtZTxfVHAsIGJvb2w+Ojp2YWx1ZSwKKyAgICBfVHAKKz46OnR5cGUKK2F0b21pY19mZXRjaF9hZGQoYXRvbWljPF9UcD4qIF9fbywgX1RwIF9fb3ApIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX28tPmZldGNoX2FkZChfX29wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfVHAqCithdG9taWNfZmV0Y2hfYWRkKHZvbGF0aWxlIGF0b21pYzxfVHAqPiogX19vLCBwdHJkaWZmX3QgX19vcCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+ZmV0Y2hfYWRkKF9fb3ApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19UcCoKK2F0b21pY19mZXRjaF9hZGQoYXRvbWljPF9UcCo+KiBfX28sIHB0cmRpZmZfdCBfX29wKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19vLT5mZXRjaF9hZGQoX19vcCk7Cit9CisKKy8vIGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZSAmJiAhaXNfc2FtZTxfVHAsIGJvb2w+Ojp2YWx1ZSwKKyAgICBfVHAKKz46OnR5cGUKK2F0b21pY19mZXRjaF9hZGRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljPF9UcD4qIF9fbywgX1RwIF9fb3AsIG1lbW9yeV9vcmRlciBfX20pIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX28tPmZldGNoX2FkZChfX29wLCBfX20pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX2ludGVncmFsPF9UcD46OnZhbHVlICYmICFpc19zYW1lPF9UcCwgYm9vbD46OnZhbHVlLAorICAgIF9UcAorPjo6dHlwZQorYXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdChhdG9taWM8X1RwPiogX19vLCBfVHAgX19vcCwgbWVtb3J5X29yZGVyIF9fbSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+ZmV0Y2hfYWRkKF9fb3AsIF9fbSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwKgorYXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWM8X1RwKj4qIF9fbywgcHRyZGlmZl90IF9fb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBfX20pIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX28tPmZldGNoX2FkZChfX29wLCBfX20pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19UcCoKK2F0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoYXRvbWljPF9UcCo+KiBfX28sIHB0cmRpZmZfdCBfX29wLCBtZW1vcnlfb3JkZXIgX19tKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19vLT5mZXRjaF9hZGQoX19vcCwgX19tKTsKK30KKworLy8gYXRvbWljX2ZldGNoX3N1YgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX2ludGVncmFsPF9UcD46OnZhbHVlICYmICFpc19zYW1lPF9UcCwgYm9vbD46OnZhbHVlLAorICAgIF9UcAorPjo6dHlwZQorYXRvbWljX2ZldGNoX3N1Yih2b2xhdGlsZSBhdG9taWM8X1RwPiogX19vLCBfVHAgX19vcCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+ZmV0Y2hfc3ViKF9fb3ApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX2ludGVncmFsPF9UcD46OnZhbHVlICYmICFpc19zYW1lPF9UcCwgYm9vbD46OnZhbHVlLAorICAgIF9UcAorPjo6dHlwZQorYXRvbWljX2ZldGNoX3N1YihhdG9taWM8X1RwPiogX19vLCBfVHAgX19vcCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+ZmV0Y2hfc3ViKF9fb3ApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19UcCoKK2F0b21pY19mZXRjaF9zdWIodm9sYXRpbGUgYXRvbWljPF9UcCo+KiBfX28sIHB0cmRpZmZfdCBfX29wKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19vLT5mZXRjaF9zdWIoX19vcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwKgorYXRvbWljX2ZldGNoX3N1YihhdG9taWM8X1RwKj4qIF9fbywgcHRyZGlmZl90IF9fb3ApIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX28tPmZldGNoX3N1YihfX29wKTsKK30KKworLy8gYXRvbWljX2ZldGNoX3N1Yl9leHBsaWNpdAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX2ludGVncmFsPF9UcD46OnZhbHVlICYmICFpc19zYW1lPF9UcCwgYm9vbD46OnZhbHVlLAorICAgIF9UcAorPjo6dHlwZQorYXRvbWljX2ZldGNoX3N1Yl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWM8X1RwPiogX19vLCBfVHAgX19vcCwgbWVtb3J5X29yZGVyIF9fbSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+ZmV0Y2hfc3ViKF9fb3AsIF9fbSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgaXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUgJiYgIWlzX3NhbWU8X1RwLCBib29sPjo6dmFsdWUsCisgICAgX1RwCis+Ojp0eXBlCithdG9taWNfZmV0Y2hfc3ViX2V4cGxpY2l0KGF0b21pYzxfVHA+KiBfX28sIF9UcCBfX29wLCBtZW1vcnlfb3JkZXIgX19tKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19vLT5mZXRjaF9zdWIoX19vcCwgX19tKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfVHAqCithdG9taWNfZmV0Y2hfc3ViX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pYzxfVHAqPiogX19vLCBwdHJkaWZmX3QgX19vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X29yZGVyIF9fbSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+ZmV0Y2hfc3ViKF9fb3AsIF9fbSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwKgorYXRvbWljX2ZldGNoX3N1Yl9leHBsaWNpdChhdG9taWM8X1RwKj4qIF9fbywgcHRyZGlmZl90IF9fb3AsIG1lbW9yeV9vcmRlciBfX20pIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX28tPmZldGNoX3N1YihfX29wLCBfX20pOworfQorCisvLyBhdG9taWNfZmV0Y2hfYW5kCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgaXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUgJiYgIWlzX3NhbWU8X1RwLCBib29sPjo6dmFsdWUsCisgICAgX1RwCis+Ojp0eXBlCithdG9taWNfZmV0Y2hfYW5kKHZvbGF0aWxlIGF0b21pYzxfVHA+KiBfX28sIF9UcCBfX29wKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19vLT5mZXRjaF9hbmQoX19vcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgaXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUgJiYgIWlzX3NhbWU8X1RwLCBib29sPjo6dmFsdWUsCisgICAgX1RwCis+Ojp0eXBlCithdG9taWNfZmV0Y2hfYW5kKGF0b21pYzxfVHA+KiBfX28sIF9UcCBfX29wKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19vLT5mZXRjaF9hbmQoX19vcCk7Cit9CisKKy8vIGF0b21pY19mZXRjaF9hbmRfZXhwbGljaXQKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZSAmJiAhaXNfc2FtZTxfVHAsIGJvb2w+Ojp2YWx1ZSwKKyAgICBfVHAKKz46OnR5cGUKK2F0b21pY19mZXRjaF9hbmRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljPF9UcD4qIF9fbywgX1RwIF9fb3AsIG1lbW9yeV9vcmRlciBfX20pIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX28tPmZldGNoX2FuZChfX29wLCBfX20pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX2ludGVncmFsPF9UcD46OnZhbHVlICYmICFpc19zYW1lPF9UcCwgYm9vbD46OnZhbHVlLAorICAgIF9UcAorPjo6dHlwZQorYXRvbWljX2ZldGNoX2FuZF9leHBsaWNpdChhdG9taWM8X1RwPiogX19vLCBfVHAgX19vcCwgbWVtb3J5X29yZGVyIF9fbSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+ZmV0Y2hfYW5kKF9fb3AsIF9fbSk7Cit9CisKKy8vIGF0b21pY19mZXRjaF9vcgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX2ludGVncmFsPF9UcD46OnZhbHVlICYmICFpc19zYW1lPF9UcCwgYm9vbD46OnZhbHVlLAorICAgIF9UcAorPjo6dHlwZQorYXRvbWljX2ZldGNoX29yKHZvbGF0aWxlIGF0b21pYzxfVHA+KiBfX28sIF9UcCBfX29wKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19vLT5mZXRjaF9vcihfX29wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZSAmJiAhaXNfc2FtZTxfVHAsIGJvb2w+Ojp2YWx1ZSwKKyAgICBfVHAKKz46OnR5cGUKK2F0b21pY19mZXRjaF9vcihhdG9taWM8X1RwPiogX19vLCBfVHAgX19vcCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+ZmV0Y2hfb3IoX19vcCk7Cit9CisKKy8vIGF0b21pY19mZXRjaF9vcl9leHBsaWNpdAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX2ludGVncmFsPF9UcD46OnZhbHVlICYmICFpc19zYW1lPF9UcCwgYm9vbD46OnZhbHVlLAorICAgIF9UcAorPjo6dHlwZQorYXRvbWljX2ZldGNoX29yX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pYzxfVHA+KiBfX28sIF9UcCBfX29wLCBtZW1vcnlfb3JkZXIgX19tKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19vLT5mZXRjaF9vcihfX29wLCBfX20pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX2ludGVncmFsPF9UcD46OnZhbHVlICYmICFpc19zYW1lPF9UcCwgYm9vbD46OnZhbHVlLAorICAgIF9UcAorPjo6dHlwZQorYXRvbWljX2ZldGNoX29yX2V4cGxpY2l0KGF0b21pYzxfVHA+KiBfX28sIF9UcCBfX29wLCBtZW1vcnlfb3JkZXIgX19tKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19vLT5mZXRjaF9vcihfX29wLCBfX20pOworfQorCisvLyBhdG9taWNfZmV0Y2hfeG9yCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgaXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUgJiYgIWlzX3NhbWU8X1RwLCBib29sPjo6dmFsdWUsCisgICAgX1RwCis+Ojp0eXBlCithdG9taWNfZmV0Y2hfeG9yKHZvbGF0aWxlIGF0b21pYzxfVHA+KiBfX28sIF9UcCBfX29wKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19vLT5mZXRjaF94b3IoX19vcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgaXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUgJiYgIWlzX3NhbWU8X1RwLCBib29sPjo6dmFsdWUsCisgICAgX1RwCis+Ojp0eXBlCithdG9taWNfZmV0Y2hfeG9yKGF0b21pYzxfVHA+KiBfX28sIF9UcCBfX29wKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19vLT5mZXRjaF94b3IoX19vcCk7Cit9CisKKy8vIGF0b21pY19mZXRjaF94b3JfZXhwbGljaXQKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZSAmJiAhaXNfc2FtZTxfVHAsIGJvb2w+Ojp2YWx1ZSwKKyAgICBfVHAKKz46OnR5cGUKK2F0b21pY19mZXRjaF94b3JfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljPF9UcD4qIF9fbywgX1RwIF9fb3AsIG1lbW9yeV9vcmRlciBfX20pIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX28tPmZldGNoX3hvcihfX29wLCBfX20pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX2ludGVncmFsPF9UcD46OnZhbHVlICYmICFpc19zYW1lPF9UcCwgYm9vbD46OnZhbHVlLAorICAgIF9UcAorPjo6dHlwZQorYXRvbWljX2ZldGNoX3hvcl9leHBsaWNpdChhdG9taWM8X1RwPiogX19vLCBfVHAgX19vcCwgbWVtb3J5X29yZGVyIF9fbSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+ZmV0Y2hfeG9yKF9fb3AsIF9fbSk7Cit9CisKKy8vIGZsYWcgdHlwZSBhbmQgb3BlcmF0aW9ucworCit0eXBlZGVmIHN0cnVjdCBhdG9taWNfZmxhZworeworICAgIF9BdG9taWMoYm9vbCkgX19hXzsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIHRlc3RfYW5kX3NldChtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fYzExX2F0b21pY19leGNoYW5nZSgmX19hXywgdHJ1ZSwgX19tKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgdGVzdF9hbmRfc2V0KG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19jMTFfYXRvbWljX2V4Y2hhbmdlKCZfX2FfLCB0cnVlLCBfX20pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBjbGVhcihtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIF9OT0VYQ0VQVAorICAgICAgICB7X19jMTFfYXRvbWljX3N0b3JlKCZfX2FfLCBmYWxzZSwgX19tKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgY2xlYXIobWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBfTk9FWENFUFQKKyAgICAgICAge19fYzExX2F0b21pY19zdG9yZSgmX19hXywgZmFsc2UsIF9fbSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBhdG9taWNfZmxhZygpIF9OT0VYQ0VQVCA9IGRlZmF1bHQ7CisjZWxzZQorICAgIGF0b21pY19mbGFnKCkgX05PRVhDRVBUIDogX19hXygpIHt9CisjZW5kaWYgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYXRvbWljX2ZsYWcoYm9vbCBfX2IpIF9OT0VYQ0VQVCA6IF9fYV8oX19iKSB7fSAvLyBFWFRFTlNJT04KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBhdG9taWNfZmxhZyhjb25zdCBhdG9taWNfZmxhZyYpID0gZGVsZXRlOworICAgIGF0b21pY19mbGFnJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljX2ZsYWcmKSA9IGRlbGV0ZTsKKyAgICBhdG9taWNfZmxhZyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pY19mbGFnJikgdm9sYXRpbGUgPSBkZWxldGU7CisjZWxzZQorcHJpdmF0ZToKKyAgICBhdG9taWNfZmxhZyhjb25zdCBhdG9taWNfZmxhZyYpOworICAgIGF0b21pY19mbGFnJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljX2ZsYWcmKTsKKyAgICBhdG9taWNfZmxhZyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pY19mbGFnJikgdm9sYXRpbGU7CisjZW5kaWYKK30gYXRvbWljX2ZsYWc7CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCithdG9taWNfZmxhZ190ZXN0X2FuZF9zZXQodm9sYXRpbGUgYXRvbWljX2ZsYWcqIF9fbykgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+dGVzdF9hbmRfc2V0KCk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCithdG9taWNfZmxhZ190ZXN0X2FuZF9zZXQoYXRvbWljX2ZsYWcqIF9fbykgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+dGVzdF9hbmRfc2V0KCk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCithdG9taWNfZmxhZ190ZXN0X2FuZF9zZXRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2ZsYWcqIF9fbywgbWVtb3J5X29yZGVyIF9fbSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+dGVzdF9hbmRfc2V0KF9fbSk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCithdG9taWNfZmxhZ190ZXN0X2FuZF9zZXRfZXhwbGljaXQoYXRvbWljX2ZsYWcqIF9fbywgbWVtb3J5X29yZGVyIF9fbSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fby0+dGVzdF9hbmRfc2V0KF9fbSk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCithdG9taWNfZmxhZ19jbGVhcih2b2xhdGlsZSBhdG9taWNfZmxhZyogX19vKSBfTk9FWENFUFQKK3sKKyAgICBfX28tPmNsZWFyKCk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCithdG9taWNfZmxhZ19jbGVhcihhdG9taWNfZmxhZyogX19vKSBfTk9FWENFUFQKK3sKKyAgICBfX28tPmNsZWFyKCk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCithdG9taWNfZmxhZ19jbGVhcl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfZmxhZyogX19vLCBtZW1vcnlfb3JkZXIgX19tKSBfTk9FWENFUFQKK3sKKyAgICBfX28tPmNsZWFyKF9fbSk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCithdG9taWNfZmxhZ19jbGVhcl9leHBsaWNpdChhdG9taWNfZmxhZyogX19vLCBtZW1vcnlfb3JkZXIgX19tKSBfTk9FWENFUFQKK3sKKyAgICBfX28tPmNsZWFyKF9fbSk7Cit9CisKKy8vIGZlbmNlcworCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorYXRvbWljX3RocmVhZF9mZW5jZShtZW1vcnlfb3JkZXIgX19tKSBfTk9FWENFUFQKK3sKKyAgICBfX2MxMV9hdG9taWNfdGhyZWFkX2ZlbmNlKF9fbSk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCithdG9taWNfc2lnbmFsX2ZlbmNlKG1lbW9yeV9vcmRlciBfX20pIF9OT0VYQ0VQVAoreworICAgIF9fYzExX2F0b21pY19zaWduYWxfZmVuY2UoX19tKTsKK30KKworLy8gQXRvbWljcyBmb3Igc3RhbmRhcmQgdHlwZWRlZiB0eXBlcworCit0eXBlZGVmIGF0b21pYzxib29sPiAgICAgICAgICAgICAgIGF0b21pY19ib29sOwordHlwZWRlZiBhdG9taWM8Y2hhcj4gICAgICAgICAgICAgICBhdG9taWNfY2hhcjsKK3R5cGVkZWYgYXRvbWljPHNpZ25lZCBjaGFyPiAgICAgICAgYXRvbWljX3NjaGFyOwordHlwZWRlZiBhdG9taWM8dW5zaWduZWQgY2hhcj4gICAgICBhdG9taWNfdWNoYXI7Cit0eXBlZGVmIGF0b21pYzxzaG9ydD4gICAgICAgICAgICAgIGF0b21pY19zaG9ydDsKK3R5cGVkZWYgYXRvbWljPHVuc2lnbmVkIHNob3J0PiAgICAgYXRvbWljX3VzaG9ydDsKK3R5cGVkZWYgYXRvbWljPGludD4gICAgICAgICAgICAgICAgYXRvbWljX2ludDsKK3R5cGVkZWYgYXRvbWljPHVuc2lnbmVkIGludD4gICAgICAgYXRvbWljX3VpbnQ7Cit0eXBlZGVmIGF0b21pYzxsb25nPiAgICAgICAgICAgICAgIGF0b21pY19sb25nOwordHlwZWRlZiBhdG9taWM8dW5zaWduZWQgbG9uZz4gICAgICBhdG9taWNfdWxvbmc7Cit0eXBlZGVmIGF0b21pYzxsb25nIGxvbmc+ICAgICAgICAgIGF0b21pY19sbG9uZzsKK3R5cGVkZWYgYXRvbWljPHVuc2lnbmVkIGxvbmcgbG9uZz4gYXRvbWljX3VsbG9uZzsKK3R5cGVkZWYgYXRvbWljPGNoYXIxNl90PiAgICAgICAgICAgYXRvbWljX2NoYXIxNl90OwordHlwZWRlZiBhdG9taWM8Y2hhcjMyX3Q+ICAgICAgICAgICBhdG9taWNfY2hhcjMyX3Q7Cit0eXBlZGVmIGF0b21pYzx3Y2hhcl90PiAgICAgICAgICAgIGF0b21pY193Y2hhcl90OworCit0eXBlZGVmIGF0b21pYzxpbnRfbGVhc3Q4X3Q+ICAgYXRvbWljX2ludF9sZWFzdDhfdDsKK3R5cGVkZWYgYXRvbWljPHVpbnRfbGVhc3Q4X3Q+ICBhdG9taWNfdWludF9sZWFzdDhfdDsKK3R5cGVkZWYgYXRvbWljPGludF9sZWFzdDE2X3Q+ICBhdG9taWNfaW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgYXRvbWljPHVpbnRfbGVhc3QxNl90PiBhdG9taWNfdWludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIGF0b21pYzxpbnRfbGVhc3QzMl90PiAgYXRvbWljX2ludF9sZWFzdDMyX3Q7Cit0eXBlZGVmIGF0b21pYzx1aW50X2xlYXN0MzJfdD4gYXRvbWljX3VpbnRfbGVhc3QzMl90OwordHlwZWRlZiBhdG9taWM8aW50X2xlYXN0NjRfdD4gIGF0b21pY19pbnRfbGVhc3Q2NF90OwordHlwZWRlZiBhdG9taWM8dWludF9sZWFzdDY0X3Q+IGF0b21pY191aW50X2xlYXN0NjRfdDsKKwordHlwZWRlZiBhdG9taWM8aW50X2Zhc3Q4X3Q+ICAgYXRvbWljX2ludF9mYXN0OF90OwordHlwZWRlZiBhdG9taWM8dWludF9mYXN0OF90PiAgYXRvbWljX3VpbnRfZmFzdDhfdDsKK3R5cGVkZWYgYXRvbWljPGludF9mYXN0MTZfdD4gIGF0b21pY19pbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIGF0b21pYzx1aW50X2Zhc3QxNl90PiBhdG9taWNfdWludF9mYXN0MTZfdDsKK3R5cGVkZWYgYXRvbWljPGludF9mYXN0MzJfdD4gIGF0b21pY19pbnRfZmFzdDMyX3Q7Cit0eXBlZGVmIGF0b21pYzx1aW50X2Zhc3QzMl90PiBhdG9taWNfdWludF9mYXN0MzJfdDsKK3R5cGVkZWYgYXRvbWljPGludF9mYXN0NjRfdD4gIGF0b21pY19pbnRfZmFzdDY0X3Q7Cit0eXBlZGVmIGF0b21pYzx1aW50X2Zhc3Q2NF90PiBhdG9taWNfdWludF9mYXN0NjRfdDsKKwordHlwZWRlZiBhdG9taWM8IGludDhfdD4gIGF0b21pY19pbnQ4X3Q7Cit0eXBlZGVmIGF0b21pYzx1aW50OF90PiAgYXRvbWljX3VpbnQ4X3Q7Cit0eXBlZGVmIGF0b21pYzwgaW50MTZfdD4gYXRvbWljX2ludDE2X3Q7Cit0eXBlZGVmIGF0b21pYzx1aW50MTZfdD4gYXRvbWljX3VpbnQxNl90OwordHlwZWRlZiBhdG9taWM8IGludDMyX3Q+IGF0b21pY19pbnQzMl90OwordHlwZWRlZiBhdG9taWM8dWludDMyX3Q+IGF0b21pY191aW50MzJfdDsKK3R5cGVkZWYgYXRvbWljPCBpbnQ2NF90PiBhdG9taWNfaW50NjRfdDsKK3R5cGVkZWYgYXRvbWljPHVpbnQ2NF90PiBhdG9taWNfdWludDY0X3Q7CisKK3R5cGVkZWYgYXRvbWljPGludHB0cl90PiAgYXRvbWljX2ludHB0cl90OwordHlwZWRlZiBhdG9taWM8dWludHB0cl90PiBhdG9taWNfdWludHB0cl90OwordHlwZWRlZiBhdG9taWM8c2l6ZV90PiAgICBhdG9taWNfc2l6ZV90OwordHlwZWRlZiBhdG9taWM8cHRyZGlmZl90PiBhdG9taWNfcHRyZGlmZl90OwordHlwZWRlZiBhdG9taWM8aW50bWF4X3Q+ICBhdG9taWNfaW50bWF4X3Q7Cit0eXBlZGVmIGF0b21pYzx1aW50bWF4X3Q+IGF0b21pY191aW50bWF4X3Q7CisKKyNkZWZpbmUgQVRPTUlDX0ZMQUdfSU5JVCB7ZmFsc2V9CisjZGVmaW5lIEFUT01JQ19WQVJfSU5JVChfX3YpIHtfX3Z9CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX0FUT01JQwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2JpdHNldCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9iaXRzZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2YzI4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9iaXRzZXQKQEAgLTAsMCArMSwxMTEwIEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGJpdHNldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0JJVFNFVAorI2RlZmluZSBfTElCQ1BQX0JJVFNFVAorCisvKgorICAgIGJpdHNldCBzeW5vcHNpcworCituYW1lc3BhY2Ugc3RkCit7CisKK25hbWVzcGFjZSBzdGQgeworCit0ZW1wbGF0ZSA8c2l6ZV90IE4+CitjbGFzcyBiaXRzZXQKK3sKK3B1YmxpYzoKKyAgICAvLyBiaXQgcmVmZXJlbmNlOgorICAgIGNsYXNzIHJlZmVyZW5jZQorICAgIHsKKyAgICAgICAgZnJpZW5kIGNsYXNzIGJpdHNldDsKKyAgICAgICAgcmVmZXJlbmNlKCkgbm9leGNlcHQ7CisgICAgcHVibGljOgorICAgICAgICB+cmVmZXJlbmNlKCkgbm9leGNlcHQ7CisgICAgICAgIHJlZmVyZW5jZSYgb3BlcmF0b3I9KGJvb2wgeCkgbm9leGNlcHQ7ICAgICAgICAgICAvLyBmb3IgYltpXSA9IHg7CisgICAgICAgIHJlZmVyZW5jZSYgb3BlcmF0b3I9KGNvbnN0IHJlZmVyZW5jZSYpIG5vZXhjZXB0OyAvLyBmb3IgYltpXSA9IGJbal07CisgICAgICAgIGJvb2wgb3BlcmF0b3J+KCkgY29uc3Qgbm9leGNlcHQ7ICAgICAgICAgICAgICAgICAvLyBmbGlwcyB0aGUgYml0CisgICAgICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCBub2V4Y2VwdDsgICAgICAgICAgICAgICAgICAvLyBmb3IgeCA9IGJbaV07CisgICAgICAgIHJlZmVyZW5jZSYgZmxpcCgpIG5vZXhjZXB0OyAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYltpXS5mbGlwKCk7CisgICAgfTsKKworICAgIC8vIDIzLjMuNS4xIGNvbnN0cnVjdG9yczoKKyAgICBjb25zdGV4cHIgYml0c2V0KCkgbm9leGNlcHQ7CisgICAgY29uc3RleHByIGJpdHNldCh1bnNpZ25lZCBsb25nIGxvbmcgdmFsKSBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+CisgICAgICAgIGV4cGxpY2l0IGJpdHNldChjb25zdCBjaGFyVCogc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPGNoYXJUPjo6c2l6ZV90eXBlIG4gPSBiYXNpY19zdHJpbmc8Y2hhclQ+OjpucG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhclQgemVybyA9IGNoYXJUKCcwJyksIGNoYXJUIG9uZSA9IGNoYXJUKCcxJykpOworICAgIHRlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICAgICAgZXhwbGljaXQgYml0c2V0KGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCx0cmFpdHMsQWxsb2NhdG9yPiYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPGNoYXJULHRyYWl0cyxBbGxvY2F0b3I+OjpzaXplX3R5cGUgcG9zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxjaGFyVCx0cmFpdHMsQWxsb2NhdG9yPjo6c2l6ZV90eXBlIG4gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfc3RyaW5nPGNoYXJULHRyYWl0cyxBbGxvY2F0b3I+OjpucG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhclQgemVybyA9IGNoYXJUKCcwJyksIGNoYXJUIG9uZSA9IGNoYXJUKCcxJykpOworCisgICAgLy8gMjMuMy41LjIgYml0c2V0IG9wZXJhdGlvbnM6CisgICAgYml0c2V0JiBvcGVyYXRvciY9KGNvbnN0IGJpdHNldCYgcmhzKSBub2V4Y2VwdDsKKyAgICBiaXRzZXQmIG9wZXJhdG9yfD0oY29uc3QgYml0c2V0JiByaHMpIG5vZXhjZXB0OworICAgIGJpdHNldCYgb3BlcmF0b3JePShjb25zdCBiaXRzZXQmIHJocykgbm9leGNlcHQ7CisgICAgYml0c2V0JiBvcGVyYXRvcjw8PShzaXplX3QgcG9zKSBub2V4Y2VwdDsKKyAgICBiaXRzZXQmIG9wZXJhdG9yPj49KHNpemVfdCBwb3MpIG5vZXhjZXB0OworICAgIGJpdHNldCYgc2V0KCkgbm9leGNlcHQ7CisgICAgYml0c2V0JiBzZXQoc2l6ZV90IHBvcywgYm9vbCB2YWwgPSB0cnVlKTsKKyAgICBiaXRzZXQmIHJlc2V0KCkgbm9leGNlcHQ7CisgICAgYml0c2V0JiByZXNldChzaXplX3QgcG9zKTsKKyAgICBiaXRzZXQgb3BlcmF0b3J+KCkgY29uc3Qgbm9leGNlcHQ7CisgICAgYml0c2V0JiBmbGlwKCkgbm9leGNlcHQ7CisgICAgYml0c2V0JiBmbGlwKHNpemVfdCBwb3MpOworCisgICAgLy8gZWxlbWVudCBhY2Nlc3M6CisgICAgY29uc3RleHByIGJvb2wgb3BlcmF0b3JbXShzaXplX3QgcG9zKSBjb25zdDsgLy8gZm9yIGJbaV07CisgICAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90IHBvcyk7ICAgICAgICAgICAgLy8gZm9yIGJbaV07CisgICAgdW5zaWduZWQgbG9uZyB0b191bG9uZygpIGNvbnN0OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB0b191bGxvbmcoKSBjb25zdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorICAgICAgICBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiB0b19zdHJpbmcoY2hhclQgemVybyA9IGNoYXJUKCcwJyksIGNoYXJUIG9uZSA9IGNoYXJUKCcxJykpIGNvbnN0OworICAgIHRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgICAgICBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgYWxsb2NhdG9yPGNoYXJUPiA+IHRvX3N0cmluZyhjaGFyVCB6ZXJvID0gY2hhclQoJzAnKSwgY2hhclQgb25lID0gY2hhclQoJzEnKSkgY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIGNoYXJUPgorICAgICAgICBiYXNpY19zdHJpbmc8Y2hhclQsIGNoYXJfdHJhaXRzPGNoYXJUPiwgYWxsb2NhdG9yPGNoYXJUPiA+IHRvX3N0cmluZyhjaGFyVCB6ZXJvID0gY2hhclQoJzAnKSwgY2hhclQgb25lID0gY2hhclQoJzEnKSkgY29uc3Q7CisgICAgYmFzaWNfc3RyaW5nPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPiB0b19zdHJpbmcoY2hhciB6ZXJvID0gJzAnLCBjaGFyIG9uZSA9ICcxJykgY29uc3Q7CisgICAgc2l6ZV90IGNvdW50KCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RleHByIHNpemVfdCBzaXplKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGJpdHNldCYgcmhzKSBjb25zdCBub2V4Y2VwdDsKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgYml0c2V0JiByaHMpIGNvbnN0IG5vZXhjZXB0OworICAgIGJvb2wgdGVzdChzaXplX3QgcG9zKSBjb25zdDsKKyAgICBib29sIGFsbCgpIGNvbnN0IG5vZXhjZXB0OworICAgIGJvb2wgYW55KCkgY29uc3Qgbm9leGNlcHQ7CisgICAgYm9vbCBub25lKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgYml0c2V0IG9wZXJhdG9yPDwoc2l6ZV90IHBvcykgY29uc3Qgbm9leGNlcHQ7CisgICAgYml0c2V0IG9wZXJhdG9yPj4oc2l6ZV90IHBvcykgY29uc3Qgbm9leGNlcHQ7Cit9OworCisvLyAyMy4zLjUuMyBiaXRzZXQgb3BlcmF0b3JzOgordGVtcGxhdGUgPHNpemVfdCBOPgorYml0c2V0PE4+IG9wZXJhdG9yJihjb25zdCBiaXRzZXQ8Tj4mLCBjb25zdCBiaXRzZXQ8Tj4mKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPHNpemVfdCBOPgorYml0c2V0PE4+IG9wZXJhdG9yfChjb25zdCBiaXRzZXQ8Tj4mLCBjb25zdCBiaXRzZXQ8Tj4mKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPHNpemVfdCBOPgorYml0c2V0PE4+IG9wZXJhdG9yXihjb25zdCBiaXRzZXQ8Tj4mLCBjb25zdCBiaXRzZXQ8Tj4mKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIHNpemVfdCBOPgorYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYgaXMsIGJpdHNldDxOPiYgeCk7CisKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBzaXplX3QgTj4KK2Jhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mIG9zLCBjb25zdCBiaXRzZXQ8Tj4mIHgpOworCit0ZW1wbGF0ZSA8c2l6ZV90IE4+IHN0cnVjdCBoYXNoPHN0ZDo6Yml0c2V0PE4+PjsKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxfX2JpdF9yZWZlcmVuY2U+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPF9fZnVuY3Rpb25hbF9iYXNlPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9QVVNIX01BQ1JPUworI2luY2x1ZGUgPF9fdW5kZWZfbWFjcm9zPgorCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCit0ZW1wbGF0ZSA8c2l6ZV90IF9OX3dvcmRzLCBzaXplX3QgX1NpemU+CitjbGFzcyBfX2JpdHNldDsKKwordGVtcGxhdGUgPHNpemVfdCBfTl93b3Jkcywgc2l6ZV90IF9TaXplPgorc3RydWN0IF9faGFzX3N0b3JhZ2VfdHlwZTxfX2JpdHNldDxfTl93b3JkcywgX1NpemU+ID4KK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworCit0ZW1wbGF0ZSA8c2l6ZV90IF9OX3dvcmRzLCBzaXplX3QgX1NpemU+CitjbGFzcyBfX2JpdHNldAoreworcHVibGljOgorICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiBzaXplX3QgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHNpemVfdHlwZSAgICAgICAgICAgICAgX19zdG9yYWdlX3R5cGU7Citwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiBfX2JpdHNldCBfX3NlbGY7CisgICAgdHlwZWRlZiAgICAgICBfX3N0b3JhZ2VfdHlwZSogIF9fc3RvcmFnZV9wb2ludGVyOworICAgIHR5cGVkZWYgY29uc3QgX19zdG9yYWdlX3R5cGUqICBfX2NvbnN0X3N0b3JhZ2VfcG9pbnRlcjsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgX19iaXRzX3Blcl93b3JkID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHNpemVvZihfX3N0b3JhZ2VfdHlwZSkgKiBDSEFSX0JJVCk7CisKKyAgICBmcmllbmQgY2xhc3MgX19iaXRfcmVmZXJlbmNlPF9fYml0c2V0PjsKKyAgICBmcmllbmQgY2xhc3MgX19iaXRfY29uc3RfcmVmZXJlbmNlPF9fYml0c2V0PjsKKyAgICBmcmllbmQgY2xhc3MgX19iaXRfaXRlcmF0b3I8X19iaXRzZXQsIGZhbHNlPjsKKyAgICBmcmllbmQgY2xhc3MgX19iaXRfaXRlcmF0b3I8X19iaXRzZXQsIHRydWU+OworICAgIGZyaWVuZCBzdHJ1Y3QgX19iaXRfYXJyYXk8X19iaXRzZXQ+OworCisgICAgX19zdG9yYWdlX3R5cGUgX19maXJzdF9bX05fd29yZHNdOworCisgICAgdHlwZWRlZiBfX2JpdF9yZWZlcmVuY2U8X19iaXRzZXQ+ICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgX19iaXRfY29uc3RfcmVmZXJlbmNlPF9fYml0c2V0PiAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIF9fYml0X2l0ZXJhdG9yPF9fYml0c2V0LCBmYWxzZT4gICAgICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9fYml0X2l0ZXJhdG9yPF9fYml0c2V0LCB0cnVlPiAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfTElCQ1BQX0NPTlNURVhQUiBfX2JpdHNldCgpIF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX0xJQkNQUF9DT05TVEVYUFIgX19iaXRzZXQodW5zaWduZWQgbG9uZyBsb25nIF9fdikgX05PRVhDRVBUOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByZWZlcmVuY2UgX19tYWtlX3JlZihzaXplX3QgX19wb3MpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIHJlZmVyZW5jZShfX2ZpcnN0XyArIF9fcG9zIC8gX19iaXRzX3Blcl93b3JkLCBfX3N0b3JhZ2VfdHlwZSgxKSA8PCBfX3BvcyAlIF9fYml0c19wZXJfd29yZCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIgY29uc3RfcmVmZXJlbmNlIF9fbWFrZV9yZWYoc2l6ZV90IF9fcG9zKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBjb25zdF9yZWZlcmVuY2UoX19maXJzdF8gKyBfX3BvcyAvIF9fYml0c19wZXJfd29yZCwgX19zdG9yYWdlX3R5cGUoMSkgPDwgX19wb3MgJSBfX2JpdHNfcGVyX3dvcmQpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGl0ZXJhdG9yIF9fbWFrZV9pdGVyKHNpemVfdCBfX3BvcykgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gaXRlcmF0b3IoX19maXJzdF8gKyBfX3BvcyAvIF9fYml0c19wZXJfd29yZCwgX19wb3MgJSBfX2JpdHNfcGVyX3dvcmQpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0X2l0ZXJhdG9yIF9fbWFrZV9pdGVyKHNpemVfdCBfX3BvcykgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfaXRlcmF0b3IoX19maXJzdF8gKyBfX3BvcyAvIF9fYml0c19wZXJfd29yZCwgX19wb3MgJSBfX2JpdHNfcGVyX3dvcmQpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIG9wZXJhdG9yJj0oY29uc3QgX19iaXRzZXQmIF9fdikgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIG9wZXJhdG9yfD0oY29uc3QgX19iaXRzZXQmIF9fdikgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIG9wZXJhdG9yXj0oY29uc3QgX19iaXRzZXQmIF9fdikgX05PRVhDRVBUOworCisgICAgdm9pZCBmbGlwKCkgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdW5zaWduZWQgbG9uZyB0b191bG9uZygpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gdG9fdWxvbmcoaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX1NpemUgPCBzaXplb2YodW5zaWduZWQgbG9uZykgKiBDSEFSX0JJVD4oKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdW5zaWduZWQgbG9uZyBsb25nIHRvX3VsbG9uZygpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gdG9fdWxsb25nKGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9TaXplIDwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykgKiBDSEFSX0JJVD4oKSk7fQorCisgICAgYm9vbCBhbGwoKSBjb25zdCBfTk9FWENFUFQ7CisgICAgYm9vbCBhbnkoKSBjb25zdCBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBfX2hhc2hfY29kZSgpIGNvbnN0IF9OT0VYQ0VQVDsKK3ByaXZhdGU6CisjaWZkZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdm9pZCBfX2luaXQodW5zaWduZWQgbG9uZyBsb25nIF9fdiwgZmFsc2VfdHlwZSkgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9faW5pdCh1bnNpZ25lZCBsb25nIGxvbmcgX192LCB0cnVlX3R5cGUpIF9OT0VYQ0VQVDsKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdW5zaWduZWQgbG9uZyB0b191bG9uZyhmYWxzZV90eXBlKSBjb25zdDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5zaWduZWQgbG9uZyB0b191bG9uZyh0cnVlX3R5cGUpIGNvbnN0OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB0b191bGxvbmcoZmFsc2VfdHlwZSkgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB0b191bGxvbmcodHJ1ZV90eXBlKSBjb25zdDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5zaWduZWQgbG9uZyBsb25nIHRvX3VsbG9uZyh0cnVlX3R5cGUsIGZhbHNlX3R5cGUpIGNvbnN0OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB0b191bGxvbmcodHJ1ZV90eXBlLCB0cnVlX3R5cGUpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPHNpemVfdCBfTl93b3Jkcywgc2l6ZV90IF9TaXplPgoraW5saW5lCitfTElCQ1BQX0NPTlNURVhQUgorX19iaXRzZXQ8X05fd29yZHMsIF9TaXplPjo6X19iaXRzZXQoKSBfTk9FWENFUFQKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgOiBfX2ZpcnN0X3swfQorI2VuZGlmCit7CisjaWZkZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX1ZTVEQ6OmZpbGxfbihfX2ZpcnN0XywgX05fd29yZHMsIF9fc3RvcmFnZV90eXBlKDApKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxzaXplX3QgX05fd29yZHMsIHNpemVfdCBfU2l6ZT4KK3ZvaWQKK19fYml0c2V0PF9OX3dvcmRzLCBfU2l6ZT46Ol9faW5pdCh1bnNpZ25lZCBsb25nIGxvbmcgX192LCBmYWxzZV90eXBlKSBfTk9FWENFUFQKK3sKKyAgICBfX3N0b3JhZ2VfdHlwZSBfX3Rbc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykgLyBzaXplb2YoX19zdG9yYWdlX3R5cGUpXTsKKyAgICBzaXplX3QgX19zeiA9IF9TaXplOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHNpemVvZihfX3QpL3NpemVvZihfX3RbMF0pOyArK19faSwgX192ID4+PSBfX2JpdHNfcGVyX3dvcmQsIF9fc3ogLT0gX19iaXRzX3Blcl93b3JkICkKKyAgICAgICAgaWYgKCBfX3N6IDwgX19iaXRzX3Blcl93b3JkKQorICAgICAgICAJX190W19faV0gPSBzdGF0aWNfY2FzdDxfX3N0b3JhZ2VfdHlwZT4oX192KSAmICggMVVMTCA8PCBfX3N6ICkgLSAxOworICAgICAgICBlbHNlCisgICAgICAgIAlfX3RbX19pXSA9IHN0YXRpY19jYXN0PF9fc3RvcmFnZV90eXBlPihfX3YpOworCisgICAgX1ZTVEQ6OmNvcHkoX190LCBfX3QgKyBzaXplb2YoX190KS9zaXplb2YoX190WzBdKSwgX19maXJzdF8pOworICAgIF9WU1REOjpmaWxsKF9fZmlyc3RfICsgc2l6ZW9mKF9fdCkvc2l6ZW9mKF9fdFswXSksIF9fZmlyc3RfICsgc2l6ZW9mKF9fZmlyc3RfKS9zaXplb2YoX19maXJzdF9bMF0pLAorICAgICAgICAgICAgICAgX19zdG9yYWdlX3R5cGUoMCkpOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9OX3dvcmRzLCBzaXplX3QgX1NpemU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorX19iaXRzZXQ8X05fd29yZHMsIF9TaXplPjo6X19pbml0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX3YsIHRydWVfdHlwZSkgX05PRVhDRVBUCit7CisgICAgX19maXJzdF9bMF0gPSBfX3Y7CisgICAgaWYgKF9TaXplIDwgX19iaXRzX3Blcl93b3JkKQorICAgIAlfX2ZpcnN0X1swXSAmPSAoIDFVTEwgPDwgX1NpemUgKSAtIDE7CisKKyAgICBfVlNURDo6ZmlsbChfX2ZpcnN0XyArIDEsIF9fZmlyc3RfICsgc2l6ZW9mKF9fZmlyc3RfKS9zaXplb2YoX19maXJzdF9bMF0pLCBfX3N0b3JhZ2VfdHlwZSgwKSk7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxzaXplX3QgX05fd29yZHMsIHNpemVfdCBfU2l6ZT4KK2lubGluZQorX0xJQkNQUF9DT05TVEVYUFIKK19fYml0c2V0PF9OX3dvcmRzLCBfU2l6ZT46Ol9fYml0c2V0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX3YpIF9OT0VYQ0VQVAorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyNpZiBfX1NJWkVPRl9TSVpFX1RfXyA9PSA4CisgICAgOiBfX2ZpcnN0X3tfX3Z9CisjZWxpZiBfX1NJWkVPRl9TSVpFX1RfXyA9PSA0CisgICAgOiBfX2ZpcnN0X3tzdGF0aWNfY2FzdDxfX3N0b3JhZ2VfdHlwZT4oX192KSwgCisgICAgCQkJX1NpemUgPj0gMiAqIF9fYml0c19wZXJfd29yZCA/IHN0YXRpY19jYXN0PF9fc3RvcmFnZV90eXBlPihfX3YgPj4gX19iaXRzX3Blcl93b3JkKQorICAgIAkJCTogc3RhdGljX2Nhc3Q8X19zdG9yYWdlX3R5cGU+KChfX3YgPj4gX19iaXRzX3Blcl93b3JkKSAmIChfX3N0b3JhZ2VfdHlwZSgxKSA8PCAoX1NpemUgLSBfX2JpdHNfcGVyX3dvcmQpKSAtIDEpfQorI2Vsc2UKKyNlcnJvciBUaGlzIGNvbnN0cnVjdG9yIGhhcyBub3QgYmVlbiBwb3J0ZWQgdG8gdGhpcyBwbGF0Zm9ybQorI2VuZGlmCisjZW5kaWYKK3sKKyNpZmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfX2luaXQoX192LCBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSA9PSBzaXplb2YoX19zdG9yYWdlX3R5cGUpPigpKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9OX3dvcmRzLCBzaXplX3QgX1NpemU+CitpbmxpbmUKK3ZvaWQKK19fYml0c2V0PF9OX3dvcmRzLCBfU2l6ZT46Om9wZXJhdG9yJj0oY29uc3QgX19iaXRzZXQmIF9fdikgX05PRVhDRVBUCit7CisgICAgZm9yIChzaXplX3R5cGUgX19pID0gMDsgX19pIDwgX05fd29yZHM7ICsrX19pKQorICAgICAgICBfX2ZpcnN0X1tfX2ldICY9IF9fdi5fX2ZpcnN0X1tfX2ldOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9OX3dvcmRzLCBzaXplX3QgX1NpemU+CitpbmxpbmUKK3ZvaWQKK19fYml0c2V0PF9OX3dvcmRzLCBfU2l6ZT46Om9wZXJhdG9yfD0oY29uc3QgX19iaXRzZXQmIF9fdikgX05PRVhDRVBUCit7CisgICAgZm9yIChzaXplX3R5cGUgX19pID0gMDsgX19pIDwgX05fd29yZHM7ICsrX19pKQorICAgICAgICBfX2ZpcnN0X1tfX2ldIHw9IF9fdi5fX2ZpcnN0X1tfX2ldOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9OX3dvcmRzLCBzaXplX3QgX1NpemU+CitpbmxpbmUKK3ZvaWQKK19fYml0c2V0PF9OX3dvcmRzLCBfU2l6ZT46Om9wZXJhdG9yXj0oY29uc3QgX19iaXRzZXQmIF9fdikgX05PRVhDRVBUCit7CisgICAgZm9yIChzaXplX3R5cGUgX19pID0gMDsgX19pIDwgX05fd29yZHM7ICsrX19pKQorICAgICAgICBfX2ZpcnN0X1tfX2ldIF49IF9fdi5fX2ZpcnN0X1tfX2ldOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9OX3dvcmRzLCBzaXplX3QgX1NpemU+Cit2b2lkCitfX2JpdHNldDxfTl93b3JkcywgX1NpemU+OjpmbGlwKCkgX05PRVhDRVBUCit7CisgICAgLy8gZG8gbWlkZGxlIHdob2xlIHdvcmRzCisgICAgc2l6ZV90eXBlIF9fbiA9IF9TaXplOworICAgIF9fc3RvcmFnZV9wb2ludGVyIF9fcCA9IF9fZmlyc3RfOworICAgIGZvciAoOyBfX24gPj0gX19iaXRzX3Blcl93b3JkOyArK19fcCwgX19uIC09IF9fYml0c19wZXJfd29yZCkKKyAgICAgICAgKl9fcCA9IH4qX19wOworICAgIC8vIGRvIGxhc3QgcGFydGlhbCB3b3JkCisgICAgaWYgKF9fbiA+IDApCisgICAgeworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX20gPSB+X19zdG9yYWdlX3R5cGUoMCkgPj4gKF9fYml0c19wZXJfd29yZCAtIF9fbik7CisgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fYiA9ICpfX3AgJiBfX207CisgICAgICAgICpfX3AgJj0gfl9fbTsKKyAgICAgICAgKl9fcCB8PSB+X19iICYgX19tOworICAgIH0KK30KKwordGVtcGxhdGUgPHNpemVfdCBfTl93b3Jkcywgc2l6ZV90IF9TaXplPgordW5zaWduZWQgbG9uZworX19iaXRzZXQ8X05fd29yZHMsIF9TaXplPjo6dG9fdWxvbmcoZmFsc2VfdHlwZSkgY29uc3QKK3sKKyAgICBjb25zdF9pdGVyYXRvciBfX2UgPSBfX21ha2VfaXRlcihfU2l6ZSk7CisgICAgY29uc3RfaXRlcmF0b3IgX19pID0gX1ZTVEQ6OmZpbmQoX19tYWtlX2l0ZXIoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogQ0hBUl9CSVQpLCBfX2UsIHRydWUpOworICAgIGlmIChfX2kgIT0gX19lKQorICAgICAgICBfX3Rocm93X292ZXJmbG93X2Vycm9yKCJiaXRzZXQgdG9fdWxvbmcgb3ZlcmZsb3cgZXJyb3IiKTsKKworICAgIHJldHVybiBfX2ZpcnN0X1swXTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfTl93b3Jkcywgc2l6ZV90IF9TaXplPgoraW5saW5lCit1bnNpZ25lZCBsb25nCitfX2JpdHNldDxfTl93b3JkcywgX1NpemU+Ojp0b191bG9uZyh0cnVlX3R5cGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIF9fZmlyc3RfWzBdOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9OX3dvcmRzLCBzaXplX3QgX1NpemU+Cit1bnNpZ25lZCBsb25nIGxvbmcKK19fYml0c2V0PF9OX3dvcmRzLCBfU2l6ZT46OnRvX3VsbG9uZyhmYWxzZV90eXBlKSBjb25zdAoreworICAgIGNvbnN0X2l0ZXJhdG9yIF9fZSA9IF9fbWFrZV9pdGVyKF9TaXplKTsKKyAgICBjb25zdF9pdGVyYXRvciBfX2kgPSBfVlNURDo6ZmluZChfX21ha2VfaXRlcihzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSAqIENIQVJfQklUKSwgX19lLCB0cnVlKTsKKyAgICBpZiAoX19pICE9IF9fZSkKKyAgICAgICAgX190aHJvd19vdmVyZmxvd19lcnJvcigiYml0c2V0IHRvX3VsbG9uZyBvdmVyZmxvdyBlcnJvciIpOworCisgICAgcmV0dXJuIHRvX3VsbG9uZyh0cnVlX3R5cGUoKSk7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX05fd29yZHMsIHNpemVfdCBfU2l6ZT4KK2lubGluZQordW5zaWduZWQgbG9uZyBsb25nCitfX2JpdHNldDxfTl93b3JkcywgX1NpemU+Ojp0b191bGxvbmcodHJ1ZV90eXBlKSBjb25zdAoreworICAgIHJldHVybiB0b191bGxvbmcodHJ1ZV90eXBlKCksIGludGVncmFsX2NvbnN0YW50PGJvb2wsIHNpemVvZihfX3N0b3JhZ2VfdHlwZSkgPCBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKT4oKSk7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX05fd29yZHMsIHNpemVfdCBfU2l6ZT4KK2lubGluZQordW5zaWduZWQgbG9uZyBsb25nCitfX2JpdHNldDxfTl93b3JkcywgX1NpemU+Ojp0b191bGxvbmcodHJ1ZV90eXBlLCBmYWxzZV90eXBlKSBjb25zdAoreworICAgIHJldHVybiBfX2ZpcnN0X1swXTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfTl93b3Jkcywgc2l6ZV90IF9TaXplPgordW5zaWduZWQgbG9uZyBsb25nCitfX2JpdHNldDxfTl93b3JkcywgX1NpemU+Ojp0b191bGxvbmcodHJ1ZV90eXBlLCB0cnVlX3R5cGUpIGNvbnN0Cit7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIF9fciA9IF9fZmlyc3RfWzBdOworICAgIGZvciAoc3RkOjpzaXplX3QgX19pID0gMTsgX19pIDwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykgLyBzaXplb2YoX19zdG9yYWdlX3R5cGUpOyArK19faSkKKyAgICAgICAgX19yIHw9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oX19maXJzdF9bX19pXSkgPDwgKHNpemVvZihfX3N0b3JhZ2VfdHlwZSkgKiBDSEFSX0JJVCk7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfTl93b3Jkcywgc2l6ZV90IF9TaXplPgorYm9vbAorX19iaXRzZXQ8X05fd29yZHMsIF9TaXplPjo6YWxsKCkgY29uc3QgX05PRVhDRVBUCit7CisgICAgLy8gZG8gbWlkZGxlIHdob2xlIHdvcmRzCisgICAgc2l6ZV90eXBlIF9fbiA9IF9TaXplOworICAgIF9fY29uc3Rfc3RvcmFnZV9wb2ludGVyIF9fcCA9IF9fZmlyc3RfOworICAgIGZvciAoOyBfX24gPj0gX19iaXRzX3Blcl93b3JkOyArK19fcCwgX19uIC09IF9fYml0c19wZXJfd29yZCkKKyAgICAgICAgaWYgKH4qX19wKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIGRvIGxhc3QgcGFydGlhbCB3b3JkCisgICAgaWYgKF9fbiA+IDApCisgICAgeworICAgICAgICBfX3N0b3JhZ2VfdHlwZSBfX20gPSB+X19zdG9yYWdlX3R5cGUoMCkgPj4gKF9fYml0c19wZXJfd29yZCAtIF9fbik7CisgICAgICAgIGlmICh+Kl9fcCAmIF9fbSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX05fd29yZHMsIHNpemVfdCBfU2l6ZT4KK2Jvb2wKK19fYml0c2V0PF9OX3dvcmRzLCBfU2l6ZT46OmFueSgpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIC8vIGRvIG1pZGRsZSB3aG9sZSB3b3JkcworICAgIHNpemVfdHlwZSBfX24gPSBfU2l6ZTsKKyAgICBfX2NvbnN0X3N0b3JhZ2VfcG9pbnRlciBfX3AgPSBfX2ZpcnN0XzsKKyAgICBmb3IgKDsgX19uID49IF9fYml0c19wZXJfd29yZDsgKytfX3AsIF9fbiAtPSBfX2JpdHNfcGVyX3dvcmQpCisgICAgICAgIGlmICgqX19wKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gZG8gbGFzdCBwYXJ0aWFsIHdvcmQKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fbSA9IH5fX3N0b3JhZ2VfdHlwZSgwKSA+PiAoX19iaXRzX3Blcl93b3JkIC0gX19uKTsKKyAgICAgICAgaWYgKCpfX3AgJiBfX20pCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9OX3dvcmRzLCBzaXplX3QgX1NpemU+CitpbmxpbmUKK3NpemVfdAorX19iaXRzZXQ8X05fd29yZHMsIF9TaXplPjo6X19oYXNoX2NvZGUoKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICBzaXplX3QgX19oID0gMDsKKyAgICBmb3IgKHNpemVfdHlwZSBfX2kgPSAwOyBfX2kgPCBfTl93b3JkczsgKytfX2kpCisgICAgICAgIF9faCBePSBfX2ZpcnN0X1tfX2ldOworICAgIHJldHVybiBfX2g7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+CitjbGFzcyBfX2JpdHNldDwxLCBfU2l6ZT4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiBzaXplX3R5cGUgICAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlOworcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgX19iaXRzZXQgX19zZWxmOworICAgIHR5cGVkZWYgICAgICAgX19zdG9yYWdlX3R5cGUqICBfX3N0b3JhZ2VfcG9pbnRlcjsKKyAgICB0eXBlZGVmIGNvbnN0IF9fc3RvcmFnZV90eXBlKiAgX19jb25zdF9zdG9yYWdlX3BvaW50ZXI7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIF9fYml0c19wZXJfd29yZCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihzaXplb2YoX19zdG9yYWdlX3R5cGUpICogQ0hBUl9CSVQpOworCisgICAgZnJpZW5kIGNsYXNzIF9fYml0X3JlZmVyZW5jZTxfX2JpdHNldD47CisgICAgZnJpZW5kIGNsYXNzIF9fYml0X2NvbnN0X3JlZmVyZW5jZTxfX2JpdHNldD47CisgICAgZnJpZW5kIGNsYXNzIF9fYml0X2l0ZXJhdG9yPF9fYml0c2V0LCBmYWxzZT47CisgICAgZnJpZW5kIGNsYXNzIF9fYml0X2l0ZXJhdG9yPF9fYml0c2V0LCB0cnVlPjsKKyAgICBmcmllbmQgc3RydWN0IF9fYml0X2FycmF5PF9fYml0c2V0PjsKKworICAgIF9fc3RvcmFnZV90eXBlIF9fZmlyc3RfOworCisgICAgdHlwZWRlZiBfX2JpdF9yZWZlcmVuY2U8X19iaXRzZXQ+ICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgX19iaXRfY29uc3RfcmVmZXJlbmNlPF9fYml0c2V0PiAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIF9fYml0X2l0ZXJhdG9yPF9fYml0c2V0LCBmYWxzZT4gICAgICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9fYml0X2l0ZXJhdG9yPF9fYml0c2V0LCB0cnVlPiAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfTElCQ1BQX0NPTlNURVhQUiBfX2JpdHNldCgpIF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX0xJQkNQUF9DT05TVEVYUFIgX19iaXRzZXQodW5zaWduZWQgbG9uZyBsb25nIF9fdikgX05PRVhDRVBUOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByZWZlcmVuY2UgX19tYWtlX3JlZihzaXplX3QgX19wb3MpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIHJlZmVyZW5jZSgmX19maXJzdF8sIF9fc3RvcmFnZV90eXBlKDEpIDw8IF9fcG9zKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUiBjb25zdF9yZWZlcmVuY2UgX19tYWtlX3JlZihzaXplX3QgX19wb3MpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGNvbnN0X3JlZmVyZW5jZSgmX19maXJzdF8sIF9fc3RvcmFnZV90eXBlKDEpIDw8IF9fcG9zKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpdGVyYXRvciBfX21ha2VfaXRlcihzaXplX3QgX19wb3MpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGl0ZXJhdG9yKCZfX2ZpcnN0XyArIF9fcG9zIC8gX19iaXRzX3Blcl93b3JkLCBfX3BvcyAlIF9fYml0c19wZXJfd29yZCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfaXRlcmF0b3IgX19tYWtlX2l0ZXIoc2l6ZV90IF9fcG9zKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBjb25zdF9pdGVyYXRvcigmX19maXJzdF8gKyBfX3BvcyAvIF9fYml0c19wZXJfd29yZCwgX19wb3MgJSBfX2JpdHNfcGVyX3dvcmQpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIG9wZXJhdG9yJj0oY29uc3QgX19iaXRzZXQmIF9fdikgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIG9wZXJhdG9yfD0oY29uc3QgX19iaXRzZXQmIF9fdikgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIG9wZXJhdG9yXj0oY29uc3QgX19iaXRzZXQmIF9fdikgX05PRVhDRVBUOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgZmxpcCgpIF9OT0VYQ0VQVDsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB1bnNpZ25lZCBsb25nIHRvX3Vsb25nKCkgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB0b191bGxvbmcoKSBjb25zdDsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIGFsbCgpIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBhbnkoKSBjb25zdCBfTk9FWENFUFQ7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IF9faGFzaF9jb2RlKCkgY29uc3QgX05PRVhDRVBUOworfTsKKwordGVtcGxhdGUgPHNpemVfdCBfU2l6ZT4KK2lubGluZQorX0xJQkNQUF9DT05TVEVYUFIKK19fYml0c2V0PDEsIF9TaXplPjo6X19iaXRzZXQoKSBfTk9FWENFUFQKKyAgICA6IF9fZmlyc3RfKDApCit7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+CitpbmxpbmUKK19MSUJDUFBfQ09OU1RFWFBSCitfX2JpdHNldDwxLCBfU2l6ZT46Ol9fYml0c2V0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX3YpIF9OT0VYQ0VQVAorICAgIDogX19maXJzdF8oCisgICAgICAgIF9TaXplID09IF9fYml0c19wZXJfd29yZCA/IHN0YXRpY19jYXN0PF9fc3RvcmFnZV90eXBlPihfX3YpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN0YXRpY19jYXN0PF9fc3RvcmFnZV90eXBlPihfX3YpICYgKChfX3N0b3JhZ2VfdHlwZSgxKSA8PCBfU2l6ZSkgLSAxKQorICAgICkKK3sKK30KKwordGVtcGxhdGUgPHNpemVfdCBfU2l6ZT4KK2lubGluZQordm9pZAorX19iaXRzZXQ8MSwgX1NpemU+OjpvcGVyYXRvciY9KGNvbnN0IF9fYml0c2V0JiBfX3YpIF9OT0VYQ0VQVAoreworICAgIF9fZmlyc3RfICY9IF9fdi5fX2ZpcnN0XzsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfU2l6ZT4KK2lubGluZQordm9pZAorX19iaXRzZXQ8MSwgX1NpemU+OjpvcGVyYXRvcnw9KGNvbnN0IF9fYml0c2V0JiBfX3YpIF9OT0VYQ0VQVAoreworICAgIF9fZmlyc3RfIHw9IF9fdi5fX2ZpcnN0XzsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfU2l6ZT4KK2lubGluZQordm9pZAorX19iaXRzZXQ8MSwgX1NpemU+OjpvcGVyYXRvcl49KGNvbnN0IF9fYml0c2V0JiBfX3YpIF9OT0VYQ0VQVAoreworICAgIF9fZmlyc3RfIF49IF9fdi5fX2ZpcnN0XzsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfU2l6ZT4KK2lubGluZQordm9pZAorX19iaXRzZXQ8MSwgX1NpemU+OjpmbGlwKCkgX05PRVhDRVBUCit7CisgICAgX19zdG9yYWdlX3R5cGUgX19tID0gfl9fc3RvcmFnZV90eXBlKDApID4+IChfX2JpdHNfcGVyX3dvcmQgLSBfU2l6ZSk7CisgICAgX19maXJzdF8gPSB+X19maXJzdF87CisgICAgX19maXJzdF8gJj0gX19tOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9TaXplPgoraW5saW5lCit1bnNpZ25lZCBsb25nCitfX2JpdHNldDwxLCBfU2l6ZT46OnRvX3Vsb25nKCkgY29uc3QKK3sKKyAgICByZXR1cm4gX19maXJzdF87Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+CitpbmxpbmUKK3Vuc2lnbmVkIGxvbmcgbG9uZworX19iaXRzZXQ8MSwgX1NpemU+Ojp0b191bGxvbmcoKSBjb25zdAoreworICAgIHJldHVybiBfX2ZpcnN0XzsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfU2l6ZT4KK2lubGluZQorYm9vbAorX19iaXRzZXQ8MSwgX1NpemU+OjphbGwoKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICBfX3N0b3JhZ2VfdHlwZSBfX20gPSB+X19zdG9yYWdlX3R5cGUoMCkgPj4gKF9fYml0c19wZXJfd29yZCAtIF9TaXplKTsKKyAgICByZXR1cm4gISh+X19maXJzdF8gJiBfX20pOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9TaXplPgoraW5saW5lCitib29sCitfX2JpdHNldDwxLCBfU2l6ZT46OmFueSgpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIF9fc3RvcmFnZV90eXBlIF9fbSA9IH5fX3N0b3JhZ2VfdHlwZSgwKSA+PiAoX19iaXRzX3Blcl93b3JkIC0gX1NpemUpOworICAgIHJldHVybiBfX2ZpcnN0XyAmIF9fbTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfU2l6ZT4KK2lubGluZQorc2l6ZV90CitfX2JpdHNldDwxLCBfU2l6ZT46Ol9faGFzaF9jb2RlKCkgY29uc3QgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fZmlyc3RfOworfQorCit0ZW1wbGF0ZSA8PgorY2xhc3MgX19iaXRzZXQ8MCwgMD4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiBzaXplX3R5cGUgICAgICAgICAgICAgIF9fc3RvcmFnZV90eXBlOworcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgX19iaXRzZXQgX19zZWxmOworICAgIHR5cGVkZWYgICAgICAgX19zdG9yYWdlX3R5cGUqICBfX3N0b3JhZ2VfcG9pbnRlcjsKKyAgICB0eXBlZGVmIGNvbnN0IF9fc3RvcmFnZV90eXBlKiAgX19jb25zdF9zdG9yYWdlX3BvaW50ZXI7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIF9fYml0c19wZXJfd29yZCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihzaXplb2YoX19zdG9yYWdlX3R5cGUpICogQ0hBUl9CSVQpOworCisgICAgZnJpZW5kIGNsYXNzIF9fYml0X3JlZmVyZW5jZTxfX2JpdHNldD47CisgICAgZnJpZW5kIGNsYXNzIF9fYml0X2NvbnN0X3JlZmVyZW5jZTxfX2JpdHNldD47CisgICAgZnJpZW5kIGNsYXNzIF9fYml0X2l0ZXJhdG9yPF9fYml0c2V0LCBmYWxzZT47CisgICAgZnJpZW5kIGNsYXNzIF9fYml0X2l0ZXJhdG9yPF9fYml0c2V0LCB0cnVlPjsKKyAgICBmcmllbmQgc3RydWN0IF9fYml0X2FycmF5PF9fYml0c2V0PjsKKworICAgIHR5cGVkZWYgX19iaXRfcmVmZXJlbmNlPF9fYml0c2V0PiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIF9fYml0X2NvbnN0X3JlZmVyZW5jZTxfX2JpdHNldD4gICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiBfX2JpdF9pdGVyYXRvcjxfX2JpdHNldCwgZmFsc2U+ICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfX2JpdF9pdGVyYXRvcjxfX2JpdHNldCwgdHJ1ZT4gICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX0xJQkNQUF9DT05TVEVYUFIgX19iaXRzZXQoKSBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9MSUJDUFBfQ09OU1RFWFBSIF9fYml0c2V0KHVuc2lnbmVkIGxvbmcgbG9uZykgX05PRVhDRVBUOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByZWZlcmVuY2UgX19tYWtlX3JlZihzaXplX3QpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIHJlZmVyZW5jZSgwLCAxKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUiBjb25zdF9yZWZlcmVuY2UgX19tYWtlX3JlZihzaXplX3QpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGNvbnN0X3JlZmVyZW5jZSgwLCAxKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpdGVyYXRvciBfX21ha2VfaXRlcihzaXplX3QpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGl0ZXJhdG9yKDAsIDApO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0X2l0ZXJhdG9yIF9fbWFrZV9pdGVyKHNpemVfdCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfaXRlcmF0b3IoMCwgMCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIG9wZXJhdG9yJj0oY29uc3QgX19iaXRzZXQmKSBfTk9FWENFUFQge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgb3BlcmF0b3J8PShjb25zdCBfX2JpdHNldCYpIF9OT0VYQ0VQVCB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCBvcGVyYXRvcl49KGNvbnN0IF9fYml0c2V0JikgX05PRVhDRVBUIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgZmxpcCgpIF9OT0VYQ0VQVCB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB1bnNpZ25lZCBsb25nIHRvX3Vsb25nKCkgY29uc3Qge3JldHVybiAwO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHVuc2lnbmVkIGxvbmcgbG9uZyB0b191bGxvbmcoKSBjb25zdCB7cmV0dXJuIDA7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBib29sIGFsbCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIHRydWU7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYm9vbCBhbnkoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBmYWxzZTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHNpemVfdCBfX2hhc2hfY29kZSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIDA7fQorfTsKKworaW5saW5lCitfTElCQ1BQX0NPTlNURVhQUgorX19iaXRzZXQ8MCwgMD46Ol9fYml0c2V0KCkgX05PRVhDRVBUCit7Cit9CisKK2lubGluZQorX0xJQkNQUF9DT05TVEVYUFIKK19fYml0c2V0PDAsIDA+OjpfX2JpdHNldCh1bnNpZ25lZCBsb25nIGxvbmcpIF9OT0VYQ0VQVAoreworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9TaXplPiBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBiaXRzZXQ7Cit0ZW1wbGF0ZSA8c2l6ZV90IF9TaXplPiBzdHJ1Y3QgaGFzaDxiaXRzZXQ8X1NpemU+ID47CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBiaXRzZXQKKyAgICA6IHByaXZhdGUgX19iaXRzZXQ8X1NpemUgPT0gMCA/IDAgOiAoX1NpemUgLSAxKSAvIChzaXplb2Yoc2l6ZV90KSAqIENIQVJfQklUKSArIDEsIF9TaXplPgoreworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBfX25fd29yZHMgPSBfU2l6ZSA9PSAwID8gMCA6IChfU2l6ZSAtIDEpIC8gKHNpemVvZihzaXplX3QpICogQ0hBUl9CSVQpICsgMTsKKyAgICB0eXBlZGVmIF9fYml0c2V0PF9fbl93b3JkcywgX1NpemU+IGJhc2U7CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2U6OnJlZmVyZW5jZSAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisgICAgLy8gMjMuMy41LjEgY29uc3RydWN0b3JzOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIgYml0c2V0KCkgX05PRVhDRVBUIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgorICAgICAgICBiaXRzZXQodW5zaWduZWQgbG9uZyBsb25nIF9fdikgX05PRVhDRVBUIDogYmFzZShfX3YpIHt9CisgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUPgorICAgICAgICBleHBsaWNpdCBiaXRzZXQoY29uc3QgX0NoYXJUKiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQ+OjpzaXplX3R5cGUgX19uID0gYmFzaWNfc3RyaW5nPF9DaGFyVD46Om5wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICBfQ2hhclQgX196ZXJvID0gX0NoYXJUKCcwJyksIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CisgICAgICAgIGV4cGxpY2l0IGJpdHNldChjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+OjpzaXplX3R5cGUgX19wb3MgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+OjpzaXplX3R5cGUgX19uID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPjo6bnBvcyksCisgICAgICAgICAgICAgICAgICAgICAgICBfQ2hhclQgX196ZXJvID0gX0NoYXJUKCcwJyksIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKTsKKworICAgIC8vIDIzLjMuNS4yIGJpdHNldCBvcGVyYXRpb25zOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiaXRzZXQmIG9wZXJhdG9yJj0oY29uc3QgYml0c2V0JiBfX3JocykgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiaXRzZXQmIG9wZXJhdG9yfD0oY29uc3QgYml0c2V0JiBfX3JocykgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiaXRzZXQmIG9wZXJhdG9yXj0oY29uc3QgYml0c2V0JiBfX3JocykgX05PRVhDRVBUOworICAgIGJpdHNldCYgb3BlcmF0b3I8PD0oc2l6ZV90IF9fcG9zKSBfTk9FWENFUFQ7CisgICAgYml0c2V0JiBvcGVyYXRvcj4+PShzaXplX3QgX19wb3MpIF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYml0c2V0JiBzZXQoKSBfTk9FWENFUFQ7CisgICAgYml0c2V0JiBzZXQoc2l6ZV90IF9fcG9zLCBib29sIF9fdmFsID0gdHJ1ZSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJpdHNldCYgcmVzZXQoKSBfTk9FWENFUFQ7CisgICAgYml0c2V0JiByZXNldChzaXplX3QgX19wb3MpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiaXRzZXQgIG9wZXJhdG9yfigpIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYml0c2V0JiBmbGlwKCkgX05PRVhDRVBUOworICAgIGJpdHNldCYgZmxpcChzaXplX3QgX19wb3MpOworCisgICAgLy8gZWxlbWVudCBhY2Nlc3M6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90IF9fcCkgY29uc3Qge3JldHVybiBiYXNlOjpfX21ha2VfcmVmKF9fcCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgICAgICAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90IF9fcCkgICAgICAge3JldHVybiBiYXNlOjpfX21ha2VfcmVmKF9fcCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB1bnNpZ25lZCBsb25nIHRvX3Vsb25nKCkgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB0b191bGxvbmcoKSBjb25zdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiB0b19zdHJpbmcoX0NoYXJUIF9femVybyA9IF9DaGFyVCgnMCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUIF9fb25lID0gX0NoYXJUKCcxJykpIGNvbnN0OworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgYWxsb2NhdG9yPF9DaGFyVD4gPiB0b19zdHJpbmcoX0NoYXJUIF9femVybyA9IF9DaGFyVCgnMCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkgY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBjaGFyX3RyYWl0czxfQ2hhclQ+LCBhbGxvY2F0b3I8X0NoYXJUPiA+IHRvX3N0cmluZyhfQ2hhclQgX196ZXJvID0gX0NoYXJUKCcwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKSBjb25zdDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfc3RyaW5nPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPiB0b19zdHJpbmcoY2hhciBfX3plcm8gPSAnMCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBfX29uZSA9ICcxJykgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBjb3VudCgpIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSIHNpemVfdCBzaXplKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX1NpemU7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgYml0c2V0JiBfX3JocykgY29uc3QgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgYml0c2V0JiBfX3JocykgY29uc3QgX05PRVhDRVBUOworICAgIGJvb2wgdGVzdChzaXplX3QgX19wb3MpIGNvbnN0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIGFsbCgpIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBhbnkoKSBjb25zdCBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBib29sIG5vbmUoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiAhYW55KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiaXRzZXQgb3BlcmF0b3I8PChzaXplX3QgX19wb3MpIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYml0c2V0IG9wZXJhdG9yPj4oc2l6ZV90IF9fcG9zKSBjb25zdCBfTk9FWENFUFQ7CisKK3ByaXZhdGU6CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IF9faGFzaF9jb2RlKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gYmFzZTo6X19oYXNoX2NvZGUoKTt9CisKKyAgICBmcmllbmQgc3RydWN0IGhhc2g8Yml0c2V0PjsKK307CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+Cit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CitiaXRzZXQ8X1NpemU+OjpiaXRzZXQoY29uc3QgX0NoYXJUKiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJUPjo6c2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgICBfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUpCit7CisgICAgc2l6ZV90IF9fcmxlbiA9IF9WU1REOjptaW4oX19uLCBjaGFyX3RyYWl0czxfQ2hhclQ+OjpsZW5ndGgoX19zdHIpKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3JsZW47ICsrX19pKQorICAgICAgICBpZiAoX19zdHJbX19pXSAhPSBfX3plcm8gJiYgX19zdHJbX19pXSAhPSBfX29uZSkKKyAgICAgICAgICAgIF9fdGhyb3dfaW52YWxpZF9hcmd1bWVudCgiYml0c2V0IHN0cmluZyBjdG9yIGhhcyBpbnZhbGlkIGFyZ3VtZW50Iik7CisKKyAgICBzaXplX3QgX01wID0gX1ZTVEQ6Om1pbihfX3JsZW4sIF9TaXplKTsKKyAgICBzaXplX3QgX19pID0gMDsKKyAgICBmb3IgKDsgX19pIDwgX01wOyArK19faSkKKyAgICB7CisgICAgICAgIF9DaGFyVCBfX2MgPSBfX3N0cltfTXAgLSAxIC0gX19pXTsKKyAgICAgICAgaWYgKF9fYyA9PSBfX3plcm8pCisgICAgICAgICAgICAoKnRoaXMpW19faV0gPSBmYWxzZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKCp0aGlzKVtfX2ldID0gdHJ1ZTsKKyAgICB9CisgICAgX1ZTVEQ6OmZpbGwoYmFzZTo6X19tYWtlX2l0ZXIoX19pKSwgYmFzZTo6X19tYWtlX2l0ZXIoX1NpemUpLCBmYWxzZSk7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+Cit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiaXRzZXQ8X1NpemU+OjpiaXRzZXQoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3N0ciwKKyAgICAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj46OnNpemVfdHlwZSBfX3BvcywKKyAgICAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj46OnNpemVfdHlwZSBfX24sCisgICAgICAgX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lKQoreworICAgIGlmIChfX3BvcyA+IF9fc3RyLnNpemUoKSkKKyAgICAgICAgX190aHJvd19vdXRfb2ZfcmFuZ2UoImJpdHNldCBzdHJpbmcgcG9zIG91dCBvZiByYW5nZSIpOworCisgICAgc2l6ZV90IF9fcmxlbiA9IF9WU1REOjptaW4oX19uLCBfX3N0ci5zaXplKCkgLSBfX3Bvcyk7CisgICAgZm9yIChzaXplX3QgX19pID0gX19wb3M7IF9faSA8IF9fcG9zICsgX19ybGVuOyArK19faSkKKyAgICAgICAgaWYgKCFfVHJhaXRzOjplcShfX3N0cltfX2ldLCBfX3plcm8pICYmICFfVHJhaXRzOjplcShfX3N0cltfX2ldLCBfX29uZSkpCisgICAgICAgICAgICBfX3Rocm93X2ludmFsaWRfYXJndW1lbnQoImJpdHNldCBzdHJpbmcgY3RvciBoYXMgaW52YWxpZCBhcmd1bWVudCIpOworCisgICAgc2l6ZV90IF9NcCA9IF9WU1REOjptaW4oX19ybGVuLCBfU2l6ZSk7CisgICAgc2l6ZV90IF9faSA9IDA7CisgICAgZm9yICg7IF9faSA8IF9NcDsgKytfX2kpCisgICAgeworICAgICAgICBfQ2hhclQgX19jID0gX19zdHJbX19wb3MgKyBfTXAgLSAxIC0gX19pXTsKKyAgICAgICAgaWYgKF9UcmFpdHM6OmVxKF9fYywgX196ZXJvKSkKKyAgICAgICAgICAgICgqdGhpcylbX19pXSA9IGZhbHNlOworICAgICAgICBlbHNlCisgICAgICAgICAgICAoKnRoaXMpW19faV0gPSB0cnVlOworICAgIH0KKyAgICBfVlNURDo6ZmlsbChiYXNlOjpfX21ha2VfaXRlcihfX2kpLCBiYXNlOjpfX21ha2VfaXRlcihfU2l6ZSksIGZhbHNlKTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfU2l6ZT4KK2lubGluZQorYml0c2V0PF9TaXplPiYKK2JpdHNldDxfU2l6ZT46Om9wZXJhdG9yJj0oY29uc3QgYml0c2V0JiBfX3JocykgX05PRVhDRVBUCit7CisgICAgYmFzZTo6b3BlcmF0b3ImPShfX3Jocyk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9TaXplPgoraW5saW5lCitiaXRzZXQ8X1NpemU+JgorYml0c2V0PF9TaXplPjo6b3BlcmF0b3J8PShjb25zdCBiaXRzZXQmIF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICBiYXNlOjpvcGVyYXRvcnw9KF9fcmhzKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+CitpbmxpbmUKK2JpdHNldDxfU2l6ZT4mCitiaXRzZXQ8X1NpemU+OjpvcGVyYXRvcl49KGNvbnN0IGJpdHNldCYgX19yaHMpIF9OT0VYQ0VQVAoreworICAgIGJhc2U6Om9wZXJhdG9yXj0oX19yaHMpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfU2l6ZT4KK2JpdHNldDxfU2l6ZT4mCitiaXRzZXQ8X1NpemU+OjpvcGVyYXRvcjw8PShzaXplX3QgX19wb3MpIF9OT0VYQ0VQVAoreworICAgIF9fcG9zID0gX1ZTVEQ6Om1pbihfX3BvcywgX1NpemUpOworICAgIF9WU1REOjpjb3B5X2JhY2t3YXJkKGJhc2U6Ol9fbWFrZV9pdGVyKDApLCBiYXNlOjpfX21ha2VfaXRlcihfU2l6ZSAtIF9fcG9zKSwgYmFzZTo6X19tYWtlX2l0ZXIoX1NpemUpKTsKKyAgICBfVlNURDo6ZmlsbF9uKGJhc2U6Ol9fbWFrZV9pdGVyKDApLCBfX3BvcywgZmFsc2UpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfU2l6ZT4KK2JpdHNldDxfU2l6ZT4mCitiaXRzZXQ8X1NpemU+OjpvcGVyYXRvcj4+PShzaXplX3QgX19wb3MpIF9OT0VYQ0VQVAoreworICAgIF9fcG9zID0gX1ZTVEQ6Om1pbihfX3BvcywgX1NpemUpOworICAgIF9WU1REOjpjb3B5KGJhc2U6Ol9fbWFrZV9pdGVyKF9fcG9zKSwgYmFzZTo6X19tYWtlX2l0ZXIoX1NpemUpLCBiYXNlOjpfX21ha2VfaXRlcigwKSk7CisgICAgX1ZTVEQ6OmZpbGxfbihiYXNlOjpfX21ha2VfaXRlcihfU2l6ZSAtIF9fcG9zKSwgX19wb3MsIGZhbHNlKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+CitpbmxpbmUKK2JpdHNldDxfU2l6ZT4mCitiaXRzZXQ8X1NpemU+OjpzZXQoKSBfTk9FWENFUFQKK3sKKyAgICBfVlNURDo6ZmlsbF9uKGJhc2U6Ol9fbWFrZV9pdGVyKDApLCBfU2l6ZSwgdHJ1ZSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9TaXplPgorYml0c2V0PF9TaXplPiYKK2JpdHNldDxfU2l6ZT46OnNldChzaXplX3QgX19wb3MsIGJvb2wgX192YWwpCit7CisgICAgaWYgKF9fcG9zID49IF9TaXplKQorICAgICAgICBfX3Rocm93X291dF9vZl9yYW5nZSgiYml0c2V0IHNldCBhcmd1bWVudCBvdXQgb2YgcmFuZ2UiKTsKKworICAgICgqdGhpcylbX19wb3NdID0gX192YWw7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9TaXplPgoraW5saW5lCitiaXRzZXQ8X1NpemU+JgorYml0c2V0PF9TaXplPjo6cmVzZXQoKSBfTk9FWENFUFQKK3sKKyAgICBfVlNURDo6ZmlsbF9uKGJhc2U6Ol9fbWFrZV9pdGVyKDApLCBfU2l6ZSwgZmFsc2UpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfU2l6ZT4KK2JpdHNldDxfU2l6ZT4mCitiaXRzZXQ8X1NpemU+OjpyZXNldChzaXplX3QgX19wb3MpCit7CisgICAgaWYgKF9fcG9zID49IF9TaXplKQorICAgICAgICBfX3Rocm93X291dF9vZl9yYW5nZSgiYml0c2V0IHJlc2V0IGFyZ3VtZW50IG91dCBvZiByYW5nZSIpOworCisgICAgKCp0aGlzKVtfX3Bvc10gPSBmYWxzZTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+CitpbmxpbmUKK2JpdHNldDxfU2l6ZT4KK2JpdHNldDxfU2l6ZT46Om9wZXJhdG9yfigpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIGJpdHNldCBfX3goKnRoaXMpOworICAgIF9feC5mbGlwKCk7CisgICAgcmV0dXJuIF9feDsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfU2l6ZT4KK2lubGluZQorYml0c2V0PF9TaXplPiYKK2JpdHNldDxfU2l6ZT46OmZsaXAoKSBfTk9FWENFUFQKK3sKKyAgICBiYXNlOjpmbGlwKCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9TaXplPgorYml0c2V0PF9TaXplPiYKK2JpdHNldDxfU2l6ZT46OmZsaXAoc2l6ZV90IF9fcG9zKQoreworICAgIGlmIChfX3BvcyA+PSBfU2l6ZSkKKyAgICAgICAgX190aHJvd19vdXRfb2ZfcmFuZ2UoImJpdHNldCBmbGlwIGFyZ3VtZW50IG91dCBvZiByYW5nZSIpOworCisgICAgcmVmZXJlbmNlIHIgPSBiYXNlOjpfX21ha2VfcmVmKF9fcG9zKTsKKyAgICByID0gfnI7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9TaXplPgoraW5saW5lCit1bnNpZ25lZCBsb25nCitiaXRzZXQ8X1NpemU+Ojp0b191bG9uZygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGJhc2U6OnRvX3Vsb25nKCk7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+CitpbmxpbmUKK3Vuc2lnbmVkIGxvbmcgbG9uZworYml0c2V0PF9TaXplPjo6dG9fdWxsb25nKCkgY29uc3QKK3sKKyAgICByZXR1cm4gYmFzZTo6dG9fdWxsb25nKCk7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK2JpdHNldDxfU2l6ZT46OnRvX3N0cmluZyhfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUpIGNvbnN0Cit7CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4gX19yKF9TaXplLCBfX3plcm8pOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9TaXplOyArK19faSkKKyAgICB7CisgICAgICAgIGlmICgoKnRoaXMpW19faV0pCisgICAgICAgICAgICBfX3JbX1NpemUgLSAxIC0gX19pXSA9IF9fb25lOworICAgIH0KKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9TaXplPgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgYWxsb2NhdG9yPF9DaGFyVD4gPgorYml0c2V0PF9TaXplPjo6dG9fc3RyaW5nKF9DaGFyVCBfX3plcm8sIF9DaGFyVCBfX29uZSkgY29uc3QKK3sKKyAgICByZXR1cm4gdG9fc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgYWxsb2NhdG9yPF9DaGFyVD4gPihfX3plcm8sIF9fb25lKTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfU2l6ZT4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitpbmxpbmUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4sIGFsbG9jYXRvcjxfQ2hhclQ+ID4KK2JpdHNldDxfU2l6ZT46OnRvX3N0cmluZyhfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUpIGNvbnN0Cit7CisgICAgcmV0dXJuIHRvX3N0cmluZzxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4sIGFsbG9jYXRvcjxfQ2hhclQ+ID4oX196ZXJvLCBfX29uZSk7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+CitpbmxpbmUKK2Jhc2ljX3N0cmluZzxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID4KK2JpdHNldDxfU2l6ZT46OnRvX3N0cmluZyhjaGFyIF9femVybywgY2hhciBfX29uZSkgY29uc3QKK3sKKyAgICByZXR1cm4gdG9fc3RyaW5nPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPihfX3plcm8sIF9fb25lKTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfU2l6ZT4KK2lubGluZQorc2l6ZV90CitiaXRzZXQ8X1NpemU+Ojpjb3VudCgpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KF9WU1REOjpjb3VudChiYXNlOjpfX21ha2VfaXRlcigwKSwgYmFzZTo6X19tYWtlX2l0ZXIoX1NpemUpLCB0cnVlKSk7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+CitpbmxpbmUKK2Jvb2wKK2JpdHNldDxfU2l6ZT46Om9wZXJhdG9yPT0oY29uc3QgYml0c2V0JiBfX3JocykgY29uc3QgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9WU1REOjplcXVhbChiYXNlOjpfX21ha2VfaXRlcigwKSwgYmFzZTo6X19tYWtlX2l0ZXIoX1NpemUpLCBfX3Jocy5fX21ha2VfaXRlcigwKSk7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+CitpbmxpbmUKK2Jvb2wKK2JpdHNldDxfU2l6ZT46Om9wZXJhdG9yIT0oY29uc3QgYml0c2V0JiBfX3JocykgY29uc3QgX05PRVhDRVBUCit7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gX19yaHMpOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9TaXplPgorYm9vbAorYml0c2V0PF9TaXplPjo6dGVzdChzaXplX3QgX19wb3MpIGNvbnN0Cit7CisgICAgaWYgKF9fcG9zID49IF9TaXplKQorICAgICAgICBfX3Rocm93X291dF9vZl9yYW5nZSgiYml0c2V0IHRlc3QgYXJndW1lbnQgb3V0IG9mIHJhbmdlIik7CisKKyAgICByZXR1cm4gKCp0aGlzKVtfX3Bvc107Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+CitpbmxpbmUKK2Jvb2wKK2JpdHNldDxfU2l6ZT46OmFsbCgpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIHJldHVybiBiYXNlOjphbGwoKTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfU2l6ZT4KK2lubGluZQorYm9vbAorYml0c2V0PF9TaXplPjo6YW55KCkgY29uc3QgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIGJhc2U6OmFueSgpOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9TaXplPgoraW5saW5lCitiaXRzZXQ8X1NpemU+CitiaXRzZXQ8X1NpemU+OjpvcGVyYXRvcjw8KHNpemVfdCBfX3BvcykgY29uc3QgX05PRVhDRVBUCit7CisgICAgYml0c2V0IF9fciA9ICp0aGlzOworICAgIF9fciA8PD0gX19wb3M7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfU2l6ZT4KK2lubGluZQorYml0c2V0PF9TaXplPgorYml0c2V0PF9TaXplPjo6b3BlcmF0b3I+PihzaXplX3QgX19wb3MpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIGJpdHNldCBfX3IgPSAqdGhpczsKKyAgICBfX3IgPj49IF9fcG9zOworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYml0c2V0PF9TaXplPgorb3BlcmF0b3ImKGNvbnN0IGJpdHNldDxfU2l6ZT4mIF9feCwgY29uc3QgYml0c2V0PF9TaXplPiYgX195KSBfTk9FWENFUFQKK3sKKyAgICBiaXRzZXQ8X1NpemU+IF9fciA9IF9feDsKKyAgICBfX3IgJj0gX195OworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYml0c2V0PF9TaXplPgorb3BlcmF0b3J8KGNvbnN0IGJpdHNldDxfU2l6ZT4mIF9feCwgY29uc3QgYml0c2V0PF9TaXplPiYgX195KSBfTk9FWENFUFQKK3sKKyAgICBiaXRzZXQ8X1NpemU+IF9fciA9IF9feDsKKyAgICBfX3IgfD0gX195OworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYml0c2V0PF9TaXplPgorb3BlcmF0b3JeKGNvbnN0IGJpdHNldDxfU2l6ZT4mIF9feCwgY29uc3QgYml0c2V0PF9TaXplPiYgX195KSBfTk9FWENFUFQKK3sKKyAgICBiaXRzZXQ8X1NpemU+IF9fciA9IF9feDsKKyAgICBfX3IgXj0gX195OworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX1NpemU+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDxiaXRzZXQ8X1NpemU+ID4KKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxiaXRzZXQ8X1NpemU+LCBzaXplX3Q+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IGJpdHNldDxfU2l6ZT4mIF9fYnMpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fYnMuX19oYXNoX2NvZGUoKTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBzaXplX3QgX1NpemU+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgYml0c2V0PF9TaXplPiYgX194KTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgc2l6ZV90IF9TaXplPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIGNvbnN0IGJpdHNldDxfU2l6ZT4mIF9feCk7CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworX0xJQkNQUF9QT1BfTUFDUk9TCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9CSVRTRVQKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jYXNzZXJ0IGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2Nhc3NlcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3NTk5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jYXNzZXJ0CkBAIC0wLDAgKzEsMjUgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNhc3NlcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvKgorICAgIGNhc3NlcnQgc3lub3BzaXMKKworTWFjcm9zOgorCisgICAgYXNzZXJ0CisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY2NvbXBsZXggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY2NvbXBsZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkMTE2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jY29tcGxleApAQCAtMCwwICsxLDI5IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY2NvbXBsZXggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0NDT01QTEVYCisjZGVmaW5lIF9MSUJDUFBfQ0NPTVBMRVgKKworLyoKKyAgICBjY29tcGxleCBzeW5vcHNpcworCisjaW5jbHVkZSA8Y29tcGxleD4KKworKi8KKworI2luY2x1ZGUgPGNvbXBsZXg+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCisvLyBoaCAwODA2MjMgQ3JlYXRlZAorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ0NPTVBMRVgKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jY3R5cGUgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY2N0eXBlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYzgxMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY2N0eXBlCkBAIC0wLDAgKzEsMTIxIEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNjdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0NDVFlQRQorI2RlZmluZSBfTElCQ1BQX0NDVFlQRQorCisvKgorICAgIGNjdHlwZSBzeW5vcHNpcworCituYW1lc3BhY2Ugc3RkCit7CisKK2ludCBpc2FsbnVtKGludCBjKTsKK2ludCBpc2FscGhhKGludCBjKTsKK2ludCBpc2JsYW5rKGludCBjKTsgIC8vIEM5OQoraW50IGlzY250cmwoaW50IGMpOworaW50IGlzZGlnaXQoaW50IGMpOworaW50IGlzZ3JhcGgoaW50IGMpOworaW50IGlzbG93ZXIoaW50IGMpOworaW50IGlzcHJpbnQoaW50IGMpOworaW50IGlzcHVuY3QoaW50IGMpOworaW50IGlzc3BhY2UoaW50IGMpOworaW50IGlzdXBwZXIoaW50IGMpOworaW50IGlzeGRpZ2l0KGludCBjKTsKK2ludCB0b2xvd2VyKGludCBjKTsKK2ludCB0b3VwcGVyKGludCBjKTsKKworfSAgLy8gc3RkCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCisjaWZkZWYgaXNhbG51bQorI3VuZGVmIGlzYWxudW0KKyNlbmRpZgorCisjaWZkZWYgaXNhbHBoYQorI3VuZGVmIGlzYWxwaGEKKyNlbmRpZgorCisjaWZkZWYgaXNibGFuaworI3VuZGVmIGlzYmxhbmsKKyNlbmRpZgorCisjaWZkZWYgaXNjbnRybAorI3VuZGVmIGlzY250cmwKKyNlbmRpZgorCisjaWZkZWYgaXNkaWdpdAorI3VuZGVmIGlzZGlnaXQKKyNlbmRpZgorCisjaWZkZWYgaXNncmFwaAorI3VuZGVmIGlzZ3JhcGgKKyNlbmRpZgorCisjaWZkZWYgaXNsb3dlcgorI3VuZGVmIGlzbG93ZXIKKyNlbmRpZgorCisjaWZkZWYgaXNwcmludAorI3VuZGVmIGlzcHJpbnQKKyNlbmRpZgorCisjaWZkZWYgaXNwdW5jdAorI3VuZGVmIGlzcHVuY3QKKyNlbmRpZgorCisjaWZkZWYgaXNzcGFjZQorI3VuZGVmIGlzc3BhY2UKKyNlbmRpZgorCisjaWZkZWYgaXN1cHBlcgorI3VuZGVmIGlzdXBwZXIKKyNlbmRpZgorCisjaWZkZWYgaXN4ZGlnaXQKKyN1bmRlZiBpc3hkaWdpdAorI2VuZGlmCisKKyNpZmRlZiB0b2xvd2VyCisjdW5kZWYgdG9sb3dlcgorI2VuZGlmCisKKyNpZmRlZiB0b3VwcGVyCisjdW5kZWYgdG91cHBlcgorI2VuZGlmCisKKwordXNpbmcgOjppc2FsbnVtOwordXNpbmcgOjppc2FscGhhOwordXNpbmcgOjppc2JsYW5rOwordXNpbmcgOjppc2NudHJsOwordXNpbmcgOjppc2RpZ2l0OwordXNpbmcgOjppc2dyYXBoOwordXNpbmcgOjppc2xvd2VyOwordXNpbmcgOjppc3ByaW50OwordXNpbmcgOjppc3B1bmN0OwordXNpbmcgOjppc3NwYWNlOwordXNpbmcgOjppc3VwcGVyOwordXNpbmcgOjppc3hkaWdpdDsKK3VzaW5nIDo6dG9sb3dlcjsKK3VzaW5nIDo6dG91cHBlcjsKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ0NUWVBFCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY2Vycm5vIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NlcnJubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWIxM2I4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NlcnJubwpAQCAtMCwwICsxLDMzIEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjZXJybm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0NFUlJOTworI2RlZmluZSBfTElCQ1BQX0NFUlJOTworCisvKgorICAgIGNlcnJubyBzeW5vcHNpcworCitNYWNyb3M6CisKKyAgICBFRE9NCisgICAgRUlMU0VRICAvLyBDOTkKKyAgICBFUkFOR0UKKyAgICBlcnJubworCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DRVJSTk8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jZmVudiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jZmVudgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmM2MzA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NmZW52CkBAIC0wLDAgKzEsODIgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY2ZlbnYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfQ0ZFTlYKKyNkZWZpbmUgX0xJQkNQUF9DRkVOVgorCisvKgorICAgIGNmZW52IHN5bm9wc2lzCisKK1RoaXMgZW50aXJlIGhlYWRlciBpcyBDOTkgLyBDKyswWAorCitNYWNyb3M6CisKKyAgICBGRV9ESVZCWVpFUk8KKyAgICBGRV9JTkVYQUNUCisgICAgRkVfSU5WQUxJRAorICAgIEZFX09WRVJGTE9XCisgICAgRkVfVU5ERVJGTE9XCisgICAgRkVfQUxMX0VYQ0VQVAorICAgIEZFX0RPV05XQVJECisgICAgRkVfVE9ORUFSRVNUCisgICAgRkVfVE9XQVJEWkVSTworICAgIEZFX1VQV0FSRAorICAgIEZFX0RGTF9FTlYKKworbmFtZXNwYWNlIHN0ZAoreworCitUeXBlczoKKworICAgIGZlbnZfdAorICAgIGZleGNlcHRfdAorCitpbnQgZmVjbGVhcmV4Y2VwdChpbnQgZXhjZXB0cyk7CitpbnQgZmVnZXRleGNlcHRmbGFnKGZleGNlcHRfdCogZmxhZ3AsIGludCBleGNlcHRzKTsKK2ludCBmZXJhaXNlZXhjZXB0KGludCBleGNlcHRzKTsKK2ludCBmZXNldGV4Y2VwdGZsYWcoY29uc3QgZmV4Y2VwdF90KiBmbGFncCwgaW50IGV4Y2VwdHMpOworaW50IGZldGVzdGV4Y2VwdChpbnQgZXhjZXB0cyk7CitpbnQgZmVnZXRyb3VuZCgpOworaW50IGZlc2V0cm91bmQoaW50IHJvdW5kKTsKK2ludCBmZWdldGVudihmZW52X3QqIGVudnApOworaW50IGZlaG9sZGV4Y2VwdChmZW52X3QqIGVudnApOworaW50IGZlc2V0ZW52KGNvbnN0IGZlbnZfdCogZW52cCk7CitpbnQgZmV1cGRhdGVlbnYoY29uc3QgZmVudl90KiBlbnZwKTsKKworfSAgLy8gc3RkCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8ZmVudi5oPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3VzaW5nIDo6ZmVudl90OwordXNpbmcgOjpmZXhjZXB0X3Q7CisKK3VzaW5nIDo6ZmVjbGVhcmV4Y2VwdDsKK3VzaW5nIDo6ZmVnZXRleGNlcHRmbGFnOwordXNpbmcgOjpmZXJhaXNlZXhjZXB0OwordXNpbmcgOjpmZXNldGV4Y2VwdGZsYWc7Cit1c2luZyA6OmZldGVzdGV4Y2VwdDsKK3VzaW5nIDo6ZmVnZXRyb3VuZDsKK3VzaW5nIDo6ZmVzZXRyb3VuZDsKK3VzaW5nIDo6ZmVnZXRlbnY7Cit1c2luZyA6OmZlaG9sZGV4Y2VwdDsKK3VzaW5nIDo6ZmVzZXRlbnY7Cit1c2luZyA6OmZldXBkYXRlZW52OworCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DRkVOVgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NmbG9hdCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jZmxvYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2ZmE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jZmxvYXQKQEAgLTAsMCArMSw3MCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNmbG9hdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9DRkxPQVQKKyNkZWZpbmUgX0xJQkNQUF9DRkxPQVQKKworLyoKKyAgICBjZmxvYXQgc3lub3BzaXMKKworTWFjcm9zOgorCisgICAgRkxUX1JPVU5EUworICAgIEZMVF9FVkFMX01FVEhPRCAgICAgLy8gQzk5CisgICAgRkxUX1JBRElYCisKKyAgICBGTFRfTUFOVF9ESUcKKyAgICBEQkxfTUFOVF9ESUcKKyAgICBMREJMX01BTlRfRElHCisKKyAgICBERUNJTUFMX0RJRyAgICAgICAgIC8vIEM5OQorCisgICAgRkxUX0RJRworICAgIERCTF9ESUcKKyAgICBMREJMX0RJRworCisgICAgRkxUX01JTl9FWFAKKyAgICBEQkxfTUlOX0VYUAorICAgIExEQkxfTUlOX0VYUAorCisgICAgRkxUX01JTl8xMF9FWFAKKyAgICBEQkxfTUlOXzEwX0VYUAorICAgIExEQkxfTUlOXzEwX0VYUAorCisgICAgRkxUX01BWF9FWFAKKyAgICBEQkxfTUFYX0VYUAorICAgIExEQkxfTUFYX0VYUAorCisgICAgRkxUX01BWF8xMF9FWFAKKyAgICBEQkxfTUFYXzEwX0VYUAorICAgIExEQkxfTUFYXzEwX0VYUAorCisgICAgRkxUX01BWAorICAgIERCTF9NQVgKKyAgICBMREJMX01BWAorCisgICAgRkxUX0VQU0lMT04KKyAgICBEQkxfRVBTSUxPTgorICAgIExEQkxfRVBTSUxPTgorCisgICAgRkxUX01JTgorICAgIERCTF9NSU4KKyAgICBMREJMX01JTgorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DRkxPQVQKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jaHJvbm8gYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY2hyb25vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOWY3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY2hyb25vCkBAIC0wLDAgKzEsMTE2OCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjaHJvbm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9DSFJPTk8KKyNkZWZpbmUgX0xJQkNQUF9DSFJPTk8KKworLyoKKyAgICBjaHJvbm8gc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworbmFtZXNwYWNlIGNocm9ubworeworCit0ZW1wbGF0ZSA8Y2xhc3MgVG9EdXJhdGlvbiwgY2xhc3MgUmVwLCBjbGFzcyBQZXJpb2Q+Citjb25zdGV4cHIKK1RvRHVyYXRpb24KK2R1cmF0aW9uX2Nhc3QoY29uc3QgZHVyYXRpb248UmVwLCBQZXJpb2Q+JiBmZCk7CisKK3RlbXBsYXRlIDxjbGFzcyBSZXA+IHN0cnVjdCB0cmVhdF9hc19mbG9hdGluZ19wb2ludCA6IGlzX2Zsb2F0aW5nX3BvaW50PFJlcD4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBSZXA+IGlubGluZSBjb25zdGV4cHIgYm9vbCB0cmVhdF9hc19mbG9hdGluZ19wb2ludF92CisgICAgPSB0cmVhdF9hc19mbG9hdGluZ19wb2ludDxSZXA+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisKK3RlbXBsYXRlIDxjbGFzcyBSZXA+CitzdHJ1Y3QgZHVyYXRpb25fdmFsdWVzCit7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0ZXhwciBSZXAgemVybygpOworICAgIHN0YXRpYyBjb25zdGV4cHIgUmVwIG1heCgpOworICAgIHN0YXRpYyBjb25zdGV4cHIgUmVwIG1pbigpOworfTsKKworLy8gZHVyYXRpb24KKwordGVtcGxhdGUgPGNsYXNzIFJlcCwgY2xhc3MgUGVyaW9kID0gcmF0aW88MT4+CitjbGFzcyBkdXJhdGlvbgoreworICAgIHN0YXRpY19hc3NlcnQoIV9faXNfZHVyYXRpb248UmVwPjo6dmFsdWUsICJBIGR1cmF0aW9uIHJlcHJlc2VudGF0aW9uIGNhbiBub3QgYmUgYSBkdXJhdGlvbiIpOworICAgIHN0YXRpY19hc3NlcnQoX19pc19yYXRpbzxQZXJpb2Q+Ojp2YWx1ZSwgIlNlY29uZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YgZHVyYXRpb24gbXVzdCBiZSBhIHN0ZDo6cmF0aW8iKTsKKyAgICBzdGF0aWNfYXNzZXJ0KFBlcmlvZDo6bnVtID4gMCwgImR1cmF0aW9uIHBlcmlvZCBtdXN0IGJlIHBvc2l0aXZlIik7CitwdWJsaWM6CisgICAgdHlwZWRlZiBSZXAgcmVwOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1BlcmlvZDo6dHlwZSBwZXJpb2Q7CisKKyAgICBjb25zdGV4cHIgZHVyYXRpb24oKSA9IGRlZmF1bHQ7CisgICAgdGVtcGxhdGUgPGNsYXNzIFJlcDI+CisgICAgICAgIGNvbnN0ZXhwciBleHBsaWNpdCBkdXJhdGlvbihjb25zdCBSZXAyJiByLAorICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICA8CisgICAgICAgICAgICAgICBpc19jb252ZXJ0aWJsZTxSZXAyLCByZXA+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgKHRyZWF0X2FzX2Zsb2F0aW5nX3BvaW50PHJlcD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAhdHJlYXRfYXNfZmxvYXRpbmdfcG9pbnQ8cmVwPjo6dmFsdWUgJiYgIXRyZWF0X2FzX2Zsb2F0aW5nX3BvaW50PFJlcDI+Ojp2YWx1ZSkKKyAgICAgICAgICAgID46OnR5cGUqID0gMCk7CisKKyAgICAvLyBjb252ZXJzaW9ucworICAgIHRlbXBsYXRlIDxjbGFzcyBSZXAyLCBjbGFzcyBQZXJpb2QyPgorICAgICAgICBjb25zdGV4cHIgZHVyYXRpb24oY29uc3QgZHVyYXRpb248UmVwMiwgUGVyaW9kMj4mIGQsCisgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICB0cmVhdF9hc19mbG9hdGluZ19wb2ludDxyZXA+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgIHJhdGlvX2RpdmlkZTxQZXJpb2QyLCBwZXJpb2Q+Ojp0eXBlOjpkZW4gPT0gMQorICAgICAgICAgICAgPjo6dHlwZSogPSAwKTsKKworICAgIC8vIG9ic2VydmVyCisKKyAgICBjb25zdGV4cHIgcmVwIGNvdW50KCkgY29uc3Q7CisKKyAgICAvLyBhcml0aG1ldGljCisKKyAgICBjb25zdGV4cHIgY29tbW9uX3R5cGU8ZHVyYXRpb24+Ojp0eXBlICBvcGVyYXRvcisoKSBjb25zdDsKKyAgICBjb25zdGV4cHIgY29tbW9uX3R5cGU8ZHVyYXRpb24+Ojp0eXBlICBvcGVyYXRvci0oKSBjb25zdDsKKyAgICBjb25zdGV4cHIgZHVyYXRpb24mIG9wZXJhdG9yKysoKTsKKyAgICBjb25zdGV4cHIgZHVyYXRpb24gIG9wZXJhdG9yKysoaW50KTsKKyAgICBjb25zdGV4cHIgZHVyYXRpb24mIG9wZXJhdG9yLS0oKTsKKyAgICBjb25zdGV4cHIgZHVyYXRpb24gIG9wZXJhdG9yLS0oaW50KTsKKworICAgIGNvbnN0ZXhwciBkdXJhdGlvbiYgb3BlcmF0b3IrPShjb25zdCBkdXJhdGlvbiYgZCk7CisgICAgY29uc3RleHByIGR1cmF0aW9uJiBvcGVyYXRvci09KGNvbnN0IGR1cmF0aW9uJiBkKTsKKworICAgIGR1cmF0aW9uJiBvcGVyYXRvcio9KGNvbnN0IHJlcCYgcmhzKTsKKyAgICBkdXJhdGlvbiYgb3BlcmF0b3IvPShjb25zdCByZXAmIHJocyk7CisKKyAgICAvLyBzcGVjaWFsIHZhbHVlcworCisgICAgc3RhdGljIGNvbnN0ZXhwciBkdXJhdGlvbiB6ZXJvKCk7CisgICAgc3RhdGljIGNvbnN0ZXhwciBkdXJhdGlvbiBtaW4oKTsKKyAgICBzdGF0aWMgY29uc3RleHByIGR1cmF0aW9uIG1heCgpOworfTsKKwordHlwZWRlZiBkdXJhdGlvbjxsb25nIGxvbmcsICAgICAgICAgbmFubz4gbmFub3NlY29uZHM7Cit0eXBlZGVmIGR1cmF0aW9uPGxvbmcgbG9uZywgICAgICAgIG1pY3JvPiBtaWNyb3NlY29uZHM7Cit0eXBlZGVmIGR1cmF0aW9uPGxvbmcgbG9uZywgICAgICAgIG1pbGxpPiBtaWxsaXNlY29uZHM7Cit0eXBlZGVmIGR1cmF0aW9uPGxvbmcgbG9uZyAgICAgICAgICAgICAgPiBzZWNvbmRzOwordHlwZWRlZiBkdXJhdGlvbjwgICAgIGxvbmcsIHJhdGlvPCAgNjA+ID4gbWludXRlczsKK3R5cGVkZWYgZHVyYXRpb248ICAgICBsb25nLCByYXRpbzwzNjAwPiA+IGhvdXJzOworCit0ZW1wbGF0ZSA8Y2xhc3MgQ2xvY2ssIGNsYXNzIER1cmF0aW9uID0gdHlwZW5hbWUgQ2xvY2s6OmR1cmF0aW9uPgorY2xhc3MgdGltZV9wb2ludAoreworcHVibGljOgorICAgIHR5cGVkZWYgQ2xvY2sgICAgICAgICAgICAgICAgICAgICBjbG9jazsKKyAgICB0eXBlZGVmIER1cmF0aW9uICAgICAgICAgICAgICAgICAgZHVyYXRpb247CisgICAgdHlwZWRlZiB0eXBlbmFtZSBkdXJhdGlvbjo6cmVwICAgIHJlcDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGR1cmF0aW9uOjpwZXJpb2QgcGVyaW9kOworcHJpdmF0ZToKKyAgICBkdXJhdGlvbiBkXzsgIC8vIGV4cG9zaXRpb24gb25seQorCitwdWJsaWM6CisgICAgdGltZV9wb2ludCgpOyAgLy8gaGFzIHZhbHVlICJlcG9jaCIgLy8gY29uc3RleHByIGluIEMrKzE0CisgICAgZXhwbGljaXQgdGltZV9wb2ludChjb25zdCBkdXJhdGlvbiYgZCk7ICAvLyBzYW1lIGFzIHRpbWVfcG9pbnQoKSArIGQgLy8gY29uc3RleHByIGluIEMrKzE0CisKKyAgICAvLyBjb252ZXJzaW9ucworICAgIHRlbXBsYXRlIDxjbGFzcyBEdXJhdGlvbjI+CisgICAgICAgdGltZV9wb2ludChjb25zdCB0aW1lX3BvaW50PGNsb2NrLCBEdXJhdGlvbjI+JiB0KTsgLy8gY29uc3RleHByIGluIEMrKzE0CisKKyAgICAvLyBvYnNlcnZlcgorCisgICAgZHVyYXRpb24gdGltZV9zaW5jZV9lcG9jaCgpIGNvbnN0OyAvLyBjb25zdGV4cHIgaW4gQysrMTQKKworICAgIC8vIGFyaXRobWV0aWMKKworICAgIHRpbWVfcG9pbnQmIG9wZXJhdG9yKz0oY29uc3QgZHVyYXRpb24mIGQpOworICAgIHRpbWVfcG9pbnQmIG9wZXJhdG9yLT0oY29uc3QgZHVyYXRpb24mIGQpOworCisgICAgLy8gc3BlY2lhbCB2YWx1ZXMKKworICAgIHN0YXRpYyBjb25zdGV4cHIgdGltZV9wb2ludCBtaW4oKTsKKyAgICBzdGF0aWMgY29uc3RleHByIHRpbWVfcG9pbnQgbWF4KCk7Cit9OworCit9IC8vIGNocm9ubworCisvLyBjb21tb25fdHlwZSB0cmFpdHMKK3RlbXBsYXRlIDxjbGFzcyBSZXAxLCBjbGFzcyBQZXJpb2QxLCBjbGFzcyBSZXAyLCBjbGFzcyBQZXJpb2QyPgorICBzdHJ1Y3QgY29tbW9uX3R5cGU8Y2hyb25vOjpkdXJhdGlvbjxSZXAxLCBQZXJpb2QxPiwgY2hyb25vOjpkdXJhdGlvbjxSZXAyLCBQZXJpb2QyPj47CisKK3RlbXBsYXRlIDxjbGFzcyBDbG9jaywgY2xhc3MgRHVyYXRpb24xLCBjbGFzcyBEdXJhdGlvbjI+CisgIHN0cnVjdCBjb21tb25fdHlwZTxjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uMT4sIGNocm9ubzo6dGltZV9wb2ludDxDbG9jaywgRHVyYXRpb24yPj47CisKK25hbWVzcGFjZSBjaHJvbm8geworCisvLyBkdXJhdGlvbiBhcml0aG1ldGljCit0ZW1wbGF0ZSA8Y2xhc3MgUmVwMSwgY2xhc3MgUGVyaW9kMSwgY2xhc3MgUmVwMiwgY2xhc3MgUGVyaW9kMj4KKyAgY29uc3RleHByCisgIHR5cGVuYW1lIGNvbW1vbl90eXBlPGR1cmF0aW9uPFJlcDEsIFBlcmlvZDE+LCBkdXJhdGlvbjxSZXAyLCBQZXJpb2QyPj46OnR5cGUKKyAgb3BlcmF0b3IrKGNvbnN0IGR1cmF0aW9uPFJlcDEsIFBlcmlvZDE+JiBsaHMsIGNvbnN0IGR1cmF0aW9uPFJlcDIsIFBlcmlvZDI+JiByaHMpOwordGVtcGxhdGUgPGNsYXNzIFJlcDEsIGNsYXNzIFBlcmlvZDEsIGNsYXNzIFJlcDIsIGNsYXNzIFBlcmlvZDI+CisgIGNvbnN0ZXhwcgorICB0eXBlbmFtZSBjb21tb25fdHlwZTxkdXJhdGlvbjxSZXAxLCBQZXJpb2QxPiwgZHVyYXRpb248UmVwMiwgUGVyaW9kMj4+Ojp0eXBlCisgIG9wZXJhdG9yLShjb25zdCBkdXJhdGlvbjxSZXAxLCBQZXJpb2QxPiYgbGhzLCBjb25zdCBkdXJhdGlvbjxSZXAyLCBQZXJpb2QyPiYgcmhzKTsKK3RlbXBsYXRlIDxjbGFzcyBSZXAxLCBjbGFzcyBQZXJpb2QsIGNsYXNzIFJlcDI+CisgIGNvbnN0ZXhwcgorICBkdXJhdGlvbjx0eXBlbmFtZSBjb21tb25fdHlwZTxSZXAxLCBSZXAyPjo6dHlwZSwgUGVyaW9kPgorICBvcGVyYXRvciooY29uc3QgZHVyYXRpb248UmVwMSwgUGVyaW9kPiYgZCwgY29uc3QgUmVwMiYgcyk7Cit0ZW1wbGF0ZSA8Y2xhc3MgUmVwMSwgY2xhc3MgUGVyaW9kLCBjbGFzcyBSZXAyPgorICBjb25zdGV4cHIKKyAgZHVyYXRpb248dHlwZW5hbWUgY29tbW9uX3R5cGU8UmVwMSwgUmVwMj46OnR5cGUsIFBlcmlvZD4KKyAgb3BlcmF0b3IqKGNvbnN0IFJlcDEmIHMsIGNvbnN0IGR1cmF0aW9uPFJlcDIsIFBlcmlvZD4mIGQpOwordGVtcGxhdGUgPGNsYXNzIFJlcDEsIGNsYXNzIFBlcmlvZCwgY2xhc3MgUmVwMj4KKyAgY29uc3RleHByCisgIGR1cmF0aW9uPHR5cGVuYW1lIGNvbW1vbl90eXBlPFJlcDEsIFJlcDI+Ojp0eXBlLCBQZXJpb2Q+CisgIG9wZXJhdG9yLyhjb25zdCBkdXJhdGlvbjxSZXAxLCBQZXJpb2Q+JiBkLCBjb25zdCBSZXAyJiBzKTsKK3RlbXBsYXRlIDxjbGFzcyBSZXAxLCBjbGFzcyBQZXJpb2QxLCBjbGFzcyBSZXAyLCBjbGFzcyBQZXJpb2QyPgorICBjb25zdGV4cHIKKyAgdHlwZW5hbWUgY29tbW9uX3R5cGU8UmVwMSwgUmVwMj46OnR5cGUKKyAgb3BlcmF0b3IvKGNvbnN0IGR1cmF0aW9uPFJlcDEsIFBlcmlvZDE+JiBsaHMsIGNvbnN0IGR1cmF0aW9uPFJlcDIsIFBlcmlvZDI+JiByaHMpOworCisvLyBkdXJhdGlvbiBjb21wYXJpc29ucwordGVtcGxhdGUgPGNsYXNzIFJlcDEsIGNsYXNzIFBlcmlvZDEsIGNsYXNzIFJlcDIsIGNsYXNzIFBlcmlvZDI+CisgICBjb25zdGV4cHIKKyAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBkdXJhdGlvbjxSZXAxLCBQZXJpb2QxPiYgbGhzLCBjb25zdCBkdXJhdGlvbjxSZXAyLCBQZXJpb2QyPiYgcmhzKTsKK3RlbXBsYXRlIDxjbGFzcyBSZXAxLCBjbGFzcyBQZXJpb2QxLCBjbGFzcyBSZXAyLCBjbGFzcyBQZXJpb2QyPgorICAgY29uc3RleHByCisgICBib29sIG9wZXJhdG9yIT0oY29uc3QgZHVyYXRpb248UmVwMSwgUGVyaW9kMT4mIGxocywgY29uc3QgZHVyYXRpb248UmVwMiwgUGVyaW9kMj4mIHJocyk7Cit0ZW1wbGF0ZSA8Y2xhc3MgUmVwMSwgY2xhc3MgUGVyaW9kMSwgY2xhc3MgUmVwMiwgY2xhc3MgUGVyaW9kMj4KKyAgIGNvbnN0ZXhwcgorICAgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IGR1cmF0aW9uPFJlcDEsIFBlcmlvZDE+JiBsaHMsIGNvbnN0IGR1cmF0aW9uPFJlcDIsIFBlcmlvZDI+JiByaHMpOwordGVtcGxhdGUgPGNsYXNzIFJlcDEsIGNsYXNzIFBlcmlvZDEsIGNsYXNzIFJlcDIsIGNsYXNzIFBlcmlvZDI+CisgICBjb25zdGV4cHIKKyAgIGJvb2wgb3BlcmF0b3I8PShjb25zdCBkdXJhdGlvbjxSZXAxLCBQZXJpb2QxPiYgbGhzLCBjb25zdCBkdXJhdGlvbjxSZXAyLCBQZXJpb2QyPiYgcmhzKTsKK3RlbXBsYXRlIDxjbGFzcyBSZXAxLCBjbGFzcyBQZXJpb2QxLCBjbGFzcyBSZXAyLCBjbGFzcyBQZXJpb2QyPgorICAgY29uc3RleHByCisgICBib29sIG9wZXJhdG9yPiAoY29uc3QgZHVyYXRpb248UmVwMSwgUGVyaW9kMT4mIGxocywgY29uc3QgZHVyYXRpb248UmVwMiwgUGVyaW9kMj4mIHJocyk7Cit0ZW1wbGF0ZSA8Y2xhc3MgUmVwMSwgY2xhc3MgUGVyaW9kMSwgY2xhc3MgUmVwMiwgY2xhc3MgUGVyaW9kMj4KKyAgIGNvbnN0ZXhwcgorICAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IGR1cmF0aW9uPFJlcDEsIFBlcmlvZDE+JiBsaHMsIGNvbnN0IGR1cmF0aW9uPFJlcDIsIFBlcmlvZDI+JiByaHMpOworCisvLyBkdXJhdGlvbl9jYXN0Cit0ZW1wbGF0ZSA8Y2xhc3MgVG9EdXJhdGlvbiwgY2xhc3MgUmVwLCBjbGFzcyBQZXJpb2Q+CisgIFRvRHVyYXRpb24gZHVyYXRpb25fY2FzdChjb25zdCBkdXJhdGlvbjxSZXAsIFBlcmlvZD4mIGQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVG9EdXJhdGlvbiwgY2xhc3MgUmVwLCBjbGFzcyBQZXJpb2Q+CisgICAgY29uc3RleHByIFRvRHVyYXRpb24gZmxvb3IoY29uc3QgZHVyYXRpb248UmVwLCBQZXJpb2Q+JiBkKTsgICAgLy8gQysrMTcKK3RlbXBsYXRlIDxjbGFzcyBUb0R1cmF0aW9uLCBjbGFzcyBSZXAsIGNsYXNzIFBlcmlvZD4KKyAgICBjb25zdGV4cHIgVG9EdXJhdGlvbiBjZWlsKGNvbnN0IGR1cmF0aW9uPFJlcCwgUGVyaW9kPiYgZCk7ICAgICAvLyBDKysxNwordGVtcGxhdGUgPGNsYXNzIFRvRHVyYXRpb24sIGNsYXNzIFJlcCwgY2xhc3MgUGVyaW9kPgorICAgIGNvbnN0ZXhwciBUb0R1cmF0aW9uIHJvdW5kKGNvbnN0IGR1cmF0aW9uPFJlcCwgUGVyaW9kPiYgZCk7ICAgIC8vIEMrKzE3CisKKy8vIHRpbWVfcG9pbnQgYXJpdGhtZXRpYyAoYWxsIGNvbnN0ZXhwciBpbiBDKysxNCkKK3RlbXBsYXRlIDxjbGFzcyBDbG9jaywgY2xhc3MgRHVyYXRpb24xLCBjbGFzcyBSZXAyLCBjbGFzcyBQZXJpb2QyPgorICB0aW1lX3BvaW50PENsb2NrLCB0eXBlbmFtZSBjb21tb25fdHlwZTxEdXJhdGlvbjEsIGR1cmF0aW9uPFJlcDIsIFBlcmlvZDI+Pjo6dHlwZT4KKyAgb3BlcmF0b3IrKGNvbnN0IHRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uMT4mIGxocywgY29uc3QgZHVyYXRpb248UmVwMiwgUGVyaW9kMj4mIHJocyk7Cit0ZW1wbGF0ZSA8Y2xhc3MgUmVwMSwgY2xhc3MgUGVyaW9kMSwgY2xhc3MgQ2xvY2ssIGNsYXNzIER1cmF0aW9uMj4KKyAgdGltZV9wb2ludDxDbG9jaywgdHlwZW5hbWUgY29tbW9uX3R5cGU8ZHVyYXRpb248UmVwMSwgUGVyaW9kMT4sIER1cmF0aW9uMj46OnR5cGU+CisgIG9wZXJhdG9yKyhjb25zdCBkdXJhdGlvbjxSZXAxLCBQZXJpb2QxPiYgbGhzLCBjb25zdCB0aW1lX3BvaW50PENsb2NrLCBEdXJhdGlvbjI+JiByaHMpOwordGVtcGxhdGUgPGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbjEsIGNsYXNzIFJlcDIsIGNsYXNzIFBlcmlvZDI+CisgIHRpbWVfcG9pbnQ8Q2xvY2ssIHR5cGVuYW1lIGNvbW1vbl90eXBlPER1cmF0aW9uMSwgZHVyYXRpb248UmVwMiwgUGVyaW9kMj4+Ojp0eXBlPgorICBvcGVyYXRvci0oY29uc3QgdGltZV9wb2ludDxDbG9jaywgRHVyYXRpb24xPiYgbGhzLCBjb25zdCBkdXJhdGlvbjxSZXAyLCBQZXJpb2QyPiYgcmhzKTsKK3RlbXBsYXRlIDxjbGFzcyBDbG9jaywgY2xhc3MgRHVyYXRpb24xLCBjbGFzcyBEdXJhdGlvbjI+CisgIHR5cGVuYW1lIGNvbW1vbl90eXBlPER1cmF0aW9uMSwgRHVyYXRpb24yPjo6dHlwZQorICBvcGVyYXRvci0oY29uc3QgdGltZV9wb2ludDxDbG9jaywgRHVyYXRpb24xPiYgbGhzLCBjb25zdCB0aW1lX3BvaW50PENsb2NrLCBEdXJhdGlvbjI+JiByaHMpOworCisvLyB0aW1lX3BvaW50IGNvbXBhcmlzb25zIChhbGwgY29uc3RleHByIGluIEMrKzE0KQordGVtcGxhdGUgPGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbjEsIGNsYXNzIER1cmF0aW9uMj4KKyAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCB0aW1lX3BvaW50PENsb2NrLCBEdXJhdGlvbjE+JiBsaHMsIGNvbnN0IHRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uMj4mIHJocyk7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2xvY2ssIGNsYXNzIER1cmF0aW9uMSwgY2xhc3MgRHVyYXRpb24yPgorICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uMT4mIGxocywgY29uc3QgdGltZV9wb2ludDxDbG9jaywgRHVyYXRpb24yPiYgcmhzKTsKK3RlbXBsYXRlIDxjbGFzcyBDbG9jaywgY2xhc3MgRHVyYXRpb24xLCBjbGFzcyBEdXJhdGlvbjI+CisgICBib29sIG9wZXJhdG9yPCAoY29uc3QgdGltZV9wb2ludDxDbG9jaywgRHVyYXRpb24xPiYgbGhzLCBjb25zdCB0aW1lX3BvaW50PENsb2NrLCBEdXJhdGlvbjI+JiByaHMpOwordGVtcGxhdGUgPGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbjEsIGNsYXNzIER1cmF0aW9uMj4KKyAgIGJvb2wgb3BlcmF0b3I8PShjb25zdCB0aW1lX3BvaW50PENsb2NrLCBEdXJhdGlvbjE+JiBsaHMsIGNvbnN0IHRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uMj4mIHJocyk7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2xvY2ssIGNsYXNzIER1cmF0aW9uMSwgY2xhc3MgRHVyYXRpb24yPgorICAgYm9vbCBvcGVyYXRvcj4gKGNvbnN0IHRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uMT4mIGxocywgY29uc3QgdGltZV9wb2ludDxDbG9jaywgRHVyYXRpb24yPiYgcmhzKTsKK3RlbXBsYXRlIDxjbGFzcyBDbG9jaywgY2xhc3MgRHVyYXRpb24xLCBjbGFzcyBEdXJhdGlvbjI+CisgICBib29sIG9wZXJhdG9yPj0oY29uc3QgdGltZV9wb2ludDxDbG9jaywgRHVyYXRpb24xPiYgbGhzLCBjb25zdCB0aW1lX3BvaW50PENsb2NrLCBEdXJhdGlvbjI+JiByaHMpOworCisvLyB0aW1lX3BvaW50X2Nhc3QgKGNvbnN0ZXhwciBpbiBDKysxNCkKKwordGVtcGxhdGUgPGNsYXNzIFRvRHVyYXRpb24sIGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbj4KKyAgdGltZV9wb2ludDxDbG9jaywgVG9EdXJhdGlvbj4gdGltZV9wb2ludF9jYXN0KGNvbnN0IHRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBUb0R1cmF0aW9uLCBjbGFzcyBDbG9jaywgY2xhc3MgRHVyYXRpb24+CisgICAgY29uc3RleHByIHRpbWVfcG9pbnQ8Q2xvY2ssIFRvRHVyYXRpb24+CisgICAgZmxvb3IoY29uc3QgdGltZV9wb2ludDxDbG9jaywgRHVyYXRpb24+JiB0cCk7ICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKwordGVtcGxhdGUgPGNsYXNzIFRvRHVyYXRpb24sIGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbj4KKyAgICBjb25zdGV4cHIgdGltZV9wb2ludDxDbG9jaywgVG9EdXJhdGlvbj4KKyAgICBjZWlsKGNvbnN0IHRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgdHApOyAgICAgICAgICAgICAgICAgICAvLyBDKysxNworCit0ZW1wbGF0ZSA8Y2xhc3MgVG9EdXJhdGlvbiwgY2xhc3MgQ2xvY2ssIGNsYXNzIER1cmF0aW9uPgorICAgIGNvbnN0ZXhwciB0aW1lX3BvaW50PENsb2NrLCBUb0R1cmF0aW9uPgorICAgIHJvdW5kKGNvbnN0IHRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgdHApOyAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisKK3RlbXBsYXRlIDxjbGFzcyBSZXAsIGNsYXNzIFBlcmlvZD4KKyAgICBjb25zdGV4cHIgZHVyYXRpb248UmVwLCBQZXJpb2Q+IGFicyhkdXJhdGlvbjxSZXAsIFBlcmlvZD4gZCk7ICAvLyBDKysxNworLy8gQ2xvY2tzCisKK2NsYXNzIHN5c3RlbV9jbG9jaworeworcHVibGljOgorICAgIHR5cGVkZWYgbWljcm9zZWNvbmRzICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb247CisgICAgdHlwZWRlZiBkdXJhdGlvbjo6cmVwICAgICAgICAgICAgICAgICAgICByZXA7CisgICAgdHlwZWRlZiBkdXJhdGlvbjo6cGVyaW9kICAgICAgICAgICAgICAgICBwZXJpb2Q7CisgICAgdHlwZWRlZiBjaHJvbm86OnRpbWVfcG9pbnQ8c3lzdGVtX2Nsb2NrPiB0aW1lX3BvaW50OworICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3N0ZWFkeSA9ICAgICAgICAgICAgZmFsc2U7IC8vIGNvbnN0ZXhwciBpbiBDKysxNAorCisgICAgc3RhdGljIHRpbWVfcG9pbnQgbm93KCkgbm9leGNlcHQ7CisgICAgc3RhdGljIHRpbWVfdCAgICAgdG9fdGltZV90ICAoY29uc3QgdGltZV9wb2ludCYgX190KSBub2V4Y2VwdDsKKyAgICBzdGF0aWMgdGltZV9wb2ludCBmcm9tX3RpbWVfdCh0aW1lX3QgX190KSBub2V4Y2VwdDsKK307CisKK2NsYXNzIHN0ZWFkeV9jbG9jaworeworcHVibGljOgorICAgIHR5cGVkZWYgbmFub3NlY29uZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOworICAgIHR5cGVkZWYgZHVyYXRpb246OnJlcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcDsKKyAgICB0eXBlZGVmIGR1cmF0aW9uOjpwZXJpb2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2Q7CisgICAgdHlwZWRlZiBjaHJvbm86OnRpbWVfcG9pbnQ8c3RlYWR5X2Nsb2NrLCBkdXJhdGlvbj4gICAgdGltZV9wb2ludDsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19zdGVhZHkgPSAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlOyAvLyBjb25zdGV4cHIgaW4gQysrMTQKKworICAgIHN0YXRpYyB0aW1lX3BvaW50IG5vdygpIG5vZXhjZXB0OworfTsKKwordHlwZWRlZiBzdGVhZHlfY2xvY2sgaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOworCit9ICAvLyBjaHJvbm8KKworY29uc3RleHByIGNocm9ubzo6aG91cnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciAiImgodW5zaWduZWQgbG9uZyBsb25nKTsgLy8gQysrMTQKK2NvbnN0ZXhwciBjaHJvbm86OmR1cmF0aW9uPHVuc3BlY2lmaWVkICwgcmF0aW88MzYwMCwxPj4gb3BlcmF0b3IgIiJoKGxvbmcgZG91YmxlKTsgLy8gQysrMTQKK2NvbnN0ZXhwciBjaHJvbm86Om1pbnV0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgIiJtaW4odW5zaWduZWQgbG9uZyBsb25nKTsgLy8gQysrMTQKK2NvbnN0ZXhwciBjaHJvbm86OmR1cmF0aW9uPHVuc3BlY2lmaWVkICwgcmF0aW88NjAsMT4+ICAgb3BlcmF0b3IgIiJtaW4obG9uZyBkb3VibGUpOyAvLyBDKysxNAorY29uc3RleHByIGNocm9ubzo6c2Vjb25kcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciAiInModW5zaWduZWQgbG9uZyBsb25nKTsgLy8gQysrMTQKK2NvbnN0ZXhwciBjaHJvbm86OmR1cmF0aW9uPHVuc3BlY2lmaWVkID4gICAgICAgICAgICAgICAgb3BlcmF0b3IgIiJzKGxvbmcgZG91YmxlKTsgLy8gQysrMTQKK2NvbnN0ZXhwciBjaHJvbm86Om1pbGxpc2Vjb25kcyAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgIiJtcyh1bnNpZ25lZCBsb25nIGxvbmcpOyAvLyBDKysxNAorY29uc3RleHByIGNocm9ubzo6ZHVyYXRpb248dW5zcGVjaWZpZWQgLCBtaWxsaT4gICAgICAgICBvcGVyYXRvciAiIm1zKGxvbmcgZG91YmxlKTsgLy8gQysrMTQKK2NvbnN0ZXhwciBjaHJvbm86Om1pY3Jvc2Vjb25kcyAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgIiJ1cyh1bnNpZ25lZCBsb25nIGxvbmcpOyAvLyBDKysxNAorY29uc3RleHByIGNocm9ubzo6ZHVyYXRpb248dW5zcGVjaWZpZWQgLCBtaWNybz4gICAgICAgICBvcGVyYXRvciAiInVzKGxvbmcgZG91YmxlKTsgLy8gQysrMTQKK2NvbnN0ZXhwciBjaHJvbm86Om5hbm9zZWNvbmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgIiJucyh1bnNpZ25lZCBsb25nIGxvbmcpOyAvLyBDKysxNAorY29uc3RleHByIGNocm9ubzo6ZHVyYXRpb248dW5zcGVjaWZpZWQgLCBuYW5vPiAgICAgICAgICBvcGVyYXRvciAiIm5zKGxvbmcgZG91YmxlKTsgLy8gQysrMTQKKworfSAgLy8gc3RkCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8Y3RpbWU+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8cmF0aW8+CisjaW5jbHVkZSA8bGltaXRzPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9QVVNIX01BQ1JPUworI2luY2x1ZGUgPF9fdW5kZWZfbWFjcm9zPgorCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCituYW1lc3BhY2UgY2hyb25vCit7CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVwLCBjbGFzcyBfUGVyaW9kID0gcmF0aW88MT4gPiBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBkdXJhdGlvbjsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2lzX2R1cmF0aW9uIDogZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CitzdHJ1Y3QgX19pc19kdXJhdGlvbjxkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiA+IDogdHJ1ZV90eXBlICB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CitzdHJ1Y3QgX19pc19kdXJhdGlvbjxjb25zdCBkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiA+IDogdHJ1ZV90eXBlICB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CitzdHJ1Y3QgX19pc19kdXJhdGlvbjx2b2xhdGlsZSBkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiA+IDogdHJ1ZV90eXBlICB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CitzdHJ1Y3QgX19pc19kdXJhdGlvbjxjb25zdCB2b2xhdGlsZSBkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiA+IDogdHJ1ZV90eXBlICB7fTsKKworfSAvLyBjaHJvbm8KKwordGVtcGxhdGUgPGNsYXNzIF9SZXAxLCBjbGFzcyBfUGVyaW9kMSwgY2xhc3MgX1JlcDIsIGNsYXNzIF9QZXJpb2QyPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGNvbW1vbl90eXBlPGNocm9ubzo6ZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hyb25vOjpkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+ID4KK3sKKyAgICB0eXBlZGVmIGNocm9ubzo6ZHVyYXRpb248dHlwZW5hbWUgY29tbW9uX3R5cGU8X1JlcDEsIF9SZXAyPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19yYXRpb19nY2Q8X1BlcmlvZDEsIF9QZXJpb2QyPjo6dHlwZT4gdHlwZTsKK307CisKK25hbWVzcGFjZSBjaHJvbm8geworCisvLyBkdXJhdGlvbl9jYXN0CisKK3RlbXBsYXRlIDxjbGFzcyBfRnJvbUR1cmF0aW9uLCBjbGFzcyBfVG9EdXJhdGlvbiwKKyAgICAgICAgICBjbGFzcyBfUGVyaW9kID0gdHlwZW5hbWUgcmF0aW9fZGl2aWRlPHR5cGVuYW1lIF9Gcm9tRHVyYXRpb246OnBlcmlvZCwgdHlwZW5hbWUgX1RvRHVyYXRpb246OnBlcmlvZD46OnR5cGUsCisgICAgICAgICAgYm9vbCA9IF9QZXJpb2Q6Om51bSA9PSAxLAorICAgICAgICAgIGJvb2wgPSBfUGVyaW9kOjpkZW4gPT0gMT4KK3N0cnVjdCBfX2R1cmF0aW9uX2Nhc3Q7CisKK3RlbXBsYXRlIDxjbGFzcyBfRnJvbUR1cmF0aW9uLCBjbGFzcyBfVG9EdXJhdGlvbiwgY2xhc3MgX1BlcmlvZD4KK3N0cnVjdCBfX2R1cmF0aW9uX2Nhc3Q8X0Zyb21EdXJhdGlvbiwgX1RvRHVyYXRpb24sIF9QZXJpb2QsIHRydWUsIHRydWU+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgorICAgIF9Ub0R1cmF0aW9uIG9wZXJhdG9yKCkoY29uc3QgX0Zyb21EdXJhdGlvbiYgX19mZCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBfVG9EdXJhdGlvbihzdGF0aWNfY2FzdDx0eXBlbmFtZSBfVG9EdXJhdGlvbjo6cmVwPihfX2ZkLmNvdW50KCkpKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0Zyb21EdXJhdGlvbiwgY2xhc3MgX1RvRHVyYXRpb24sIGNsYXNzIF9QZXJpb2Q+CitzdHJ1Y3QgX19kdXJhdGlvbl9jYXN0PF9Gcm9tRHVyYXRpb24sIF9Ub0R1cmF0aW9uLCBfUGVyaW9kLCB0cnVlLCBmYWxzZT4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSCisgICAgX1RvRHVyYXRpb24gb3BlcmF0b3IoKShjb25zdCBfRnJvbUR1cmF0aW9uJiBfX2ZkKSBjb25zdAorICAgIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjb21tb25fdHlwZTx0eXBlbmFtZSBfVG9EdXJhdGlvbjo6cmVwLCB0eXBlbmFtZSBfRnJvbUR1cmF0aW9uOjpyZXAsIGludG1heF90Pjo6dHlwZSBfQ3Q7CisgICAgICAgIHJldHVybiBfVG9EdXJhdGlvbihzdGF0aWNfY2FzdDx0eXBlbmFtZSBfVG9EdXJhdGlvbjo6cmVwPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PF9DdD4oX19mZC5jb3VudCgpKSAvIHN0YXRpY19jYXN0PF9DdD4oX1BlcmlvZDo6ZGVuKSkpOworICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfRnJvbUR1cmF0aW9uLCBjbGFzcyBfVG9EdXJhdGlvbiwgY2xhc3MgX1BlcmlvZD4KK3N0cnVjdCBfX2R1cmF0aW9uX2Nhc3Q8X0Zyb21EdXJhdGlvbiwgX1RvRHVyYXRpb24sIF9QZXJpb2QsIGZhbHNlLCB0cnVlPgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIKKyAgICBfVG9EdXJhdGlvbiBvcGVyYXRvcigpKGNvbnN0IF9Gcm9tRHVyYXRpb24mIF9fZmQpIGNvbnN0CisgICAgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPHR5cGVuYW1lIF9Ub0R1cmF0aW9uOjpyZXAsIHR5cGVuYW1lIF9Gcm9tRHVyYXRpb246OnJlcCwgaW50bWF4X3Q+Ojp0eXBlIF9DdDsKKyAgICAgICAgcmV0dXJuIF9Ub0R1cmF0aW9uKHN0YXRpY19jYXN0PHR5cGVuYW1lIF9Ub0R1cmF0aW9uOjpyZXA+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X0N0PihfX2ZkLmNvdW50KCkpICogc3RhdGljX2Nhc3Q8X0N0PihfUGVyaW9kOjpudW0pKSk7CisgICAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Gcm9tRHVyYXRpb24sIGNsYXNzIF9Ub0R1cmF0aW9uLCBjbGFzcyBfUGVyaW9kPgorc3RydWN0IF9fZHVyYXRpb25fY2FzdDxfRnJvbUR1cmF0aW9uLCBfVG9EdXJhdGlvbiwgX1BlcmlvZCwgZmFsc2UsIGZhbHNlPgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIKKyAgICBfVG9EdXJhdGlvbiBvcGVyYXRvcigpKGNvbnN0IF9Gcm9tRHVyYXRpb24mIF9fZmQpIGNvbnN0CisgICAgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPHR5cGVuYW1lIF9Ub0R1cmF0aW9uOjpyZXAsIHR5cGVuYW1lIF9Gcm9tRHVyYXRpb246OnJlcCwgaW50bWF4X3Q+Ojp0eXBlIF9DdDsKKyAgICAgICAgcmV0dXJuIF9Ub0R1cmF0aW9uKHN0YXRpY19jYXN0PHR5cGVuYW1lIF9Ub0R1cmF0aW9uOjpyZXA+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X0N0PihfX2ZkLmNvdW50KCkpICogc3RhdGljX2Nhc3Q8X0N0PihfUGVyaW9kOjpudW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBzdGF0aWNfY2FzdDxfQ3Q+KF9QZXJpb2Q6OmRlbikpKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RvRHVyYXRpb24sIGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfZHVyYXRpb248X1RvRHVyYXRpb24+Ojp2YWx1ZSwKKyAgICBfVG9EdXJhdGlvbgorPjo6dHlwZQorZHVyYXRpb25fY2FzdChjb25zdCBkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19mZCkKK3sKKyAgICByZXR1cm4gX19kdXJhdGlvbl9jYXN0PGR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+LCBfVG9EdXJhdGlvbj4oKShfX2ZkKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SZXA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgdHJlYXRfYXNfZmxvYXRpbmdfcG9pbnQgOiBpc19mbG9hdGluZ19wb2ludDxfUmVwPiB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfUmVwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgdHJlYXRfYXNfZmxvYXRpbmdfcG9pbnRfdgorICAgID0gdHJlYXRfYXNfZmxvYXRpbmdfcG9pbnQ8X1JlcD46OnZhbHVlOworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfUmVwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGR1cmF0aW9uX3ZhbHVlcworeworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIF9SZXAgemVybygpIHtyZXR1cm4gX1JlcCgwKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgX1JlcCBtYXgoKSAge3JldHVybiBudW1lcmljX2xpbWl0czxfUmVwPjo6bWF4KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIF9SZXAgbWluKCkgIHtyZXR1cm4gbnVtZXJpY19saW1pdHM8X1JlcD46Omxvd2VzdCgpO30KK307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAordGVtcGxhdGUgPGNsYXNzIF9Ub0R1cmF0aW9uLCBjbGFzcyBfUmVwLCBjbGFzcyBfUGVyaW9kPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfZHVyYXRpb248X1RvRHVyYXRpb24+Ojp2YWx1ZSwKKyAgICBfVG9EdXJhdGlvbgorPjo6dHlwZQorZmxvb3IoY29uc3QgZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fZCkKK3sKKyAgICBfVG9EdXJhdGlvbiBfX3QgPSBkdXJhdGlvbl9jYXN0PF9Ub0R1cmF0aW9uPihfX2QpOworICAgIGlmIChfX3QgPiBfX2QpCisgICAgICAgIF9fdCA9IF9fdCAtIF9Ub0R1cmF0aW9uezF9OworICAgIHJldHVybiBfX3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVG9EdXJhdGlvbiwgY2xhc3MgX1JlcCwgY2xhc3MgX1BlcmlvZD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX2R1cmF0aW9uPF9Ub0R1cmF0aW9uPjo6dmFsdWUsCisgICAgX1RvRHVyYXRpb24KKz46OnR5cGUKK2NlaWwoY29uc3QgZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fZCkKK3sKKyAgICBfVG9EdXJhdGlvbiBfX3QgPSBkdXJhdGlvbl9jYXN0PF9Ub0R1cmF0aW9uPihfX2QpOworICAgIGlmIChfX3QgPCBfX2QpCisgICAgICAgIF9fdCA9IF9fdCArIF9Ub0R1cmF0aW9uezF9OworICAgIHJldHVybiBfX3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVG9EdXJhdGlvbiwgY2xhc3MgX1JlcCwgY2xhc3MgX1BlcmlvZD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX2R1cmF0aW9uPF9Ub0R1cmF0aW9uPjo6dmFsdWUsCisgICAgX1RvRHVyYXRpb24KKz46OnR5cGUKK3JvdW5kKGNvbnN0IGR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX2QpCit7CisgICAgX1RvRHVyYXRpb24gX19sb3dlciA9IGZsb29yPF9Ub0R1cmF0aW9uPihfX2QpOworICAgIF9Ub0R1cmF0aW9uIF9fdXBwZXIgPSBfX2xvd2VyICsgX1RvRHVyYXRpb257MX07CisgICAgYXV0byBfX2xvd2VyRGlmZiA9IF9fZCAtIF9fbG93ZXI7CisgICAgYXV0byBfX3VwcGVyRGlmZiA9IF9fdXBwZXIgLSBfX2Q7CisgICAgaWYgKF9fbG93ZXJEaWZmIDwgX191cHBlckRpZmYpCisgICAgICAgIHJldHVybiBfX2xvd2VyOworICAgIGlmIChfX2xvd2VyRGlmZiA+IF9fdXBwZXJEaWZmKQorICAgICAgICByZXR1cm4gX191cHBlcjsKKyAgICByZXR1cm4gX19sb3dlci5jb3VudCgpICYgMSA/IF9fdXBwZXIgOiBfX2xvd2VyOworfQorI2VuZGlmCisKKy8vIGR1cmF0aW9uCisKK3RlbXBsYXRlIDxjbGFzcyBfUmVwLCBjbGFzcyBfUGVyaW9kPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgZHVyYXRpb24KK3sKKyAgICBzdGF0aWNfYXNzZXJ0KCFfX2lzX2R1cmF0aW9uPF9SZXA+Ojp2YWx1ZSwgIkEgZHVyYXRpb24gcmVwcmVzZW50YXRpb24gY2FuIG5vdCBiZSBhIGR1cmF0aW9uIik7CisgICAgc3RhdGljX2Fzc2VydChfX2lzX3JhdGlvPF9QZXJpb2Q+Ojp2YWx1ZSwgIlNlY29uZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YgZHVyYXRpb24gbXVzdCBiZSBhIHN0ZDo6cmF0aW8iKTsKKyAgICBzdGF0aWNfYXNzZXJ0KF9QZXJpb2Q6Om51bSA+IDAsICJkdXJhdGlvbiBwZXJpb2QgbXVzdCBiZSBwb3NpdGl2ZSIpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyPgorICAgIHN0cnVjdCBfX25vX292ZXJmbG93CisgICAgeworICAgIHByaXZhdGU6CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBfX2djZF9uMV9uMiA9IF9fc3RhdGljX2djZDxfUjE6Om51bSwgX1IyOjpudW0+Ojp2YWx1ZTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGludG1heF90IF9fZ2NkX2QxX2QyID0gX19zdGF0aWNfZ2NkPF9SMTo6ZGVuLCBfUjI6OmRlbj46OnZhbHVlOworICAgICAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgX19uMSA9IF9SMTo6bnVtIC8gX19nY2RfbjFfbjI7CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBfX2QxID0gX1IxOjpkZW4gLyBfX2djZF9kMV9kMjsKKyAgICAgICAgc3RhdGljIGNvbnN0IGludG1heF90IF9fbjIgPSBfUjI6Om51bSAvIF9fZ2NkX24xX24yOworICAgICAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgX19kMiA9IF9SMjo6ZGVuIC8gX19nY2RfZDFfZDI7CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBtYXggPSAtKChpbnRtYXhfdCgxKSA8PCAoc2l6ZW9mKGludG1heF90KSAqIENIQVJfQklUIC0gMSkpICsgMSk7CisKKyAgICAgICAgdGVtcGxhdGUgPGludG1heF90IF9YcCwgaW50bWF4X3QgX1lwLCBib29sIF9fb3ZlcmZsb3c+CisgICAgICAgIHN0cnVjdCBfX211bCAgICAvLyBfX292ZXJmbG93ID09IGZhbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCB2YWx1ZSA9IF9YcCAqIF9ZcDsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZSA8aW50bWF4X3QgX1hwLCBpbnRtYXhfdCBfWXA+CisgICAgICAgIHN0cnVjdCBfX211bDxfWHAsIF9ZcCwgdHJ1ZT4KKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludG1heF90IHZhbHVlID0gMTsKKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSAoX19uMSA8PSBtYXggLyBfX2QyKSAmJiAoX19uMiA8PSBtYXggLyBfX2QxKTsKKyAgICAgICAgdHlwZWRlZiByYXRpbzxfX211bDxfX24xLCBfX2QyLCAhdmFsdWU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBfX211bDxfX24yLCBfX2QxLCAhdmFsdWU+Ojp2YWx1ZT4gdHlwZTsKKyAgICB9OworICAgIAorcHVibGljOgorICAgIHR5cGVkZWYgX1JlcCByZXA7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfUGVyaW9kOjp0eXBlIHBlcmlvZDsKK3ByaXZhdGU6CisgICAgcmVwIF9fcmVwXzsKK3B1YmxpYzoKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgICAgIGR1cmF0aW9uKCkgPSBkZWZhdWx0OworI2Vsc2UKKyAgICAgICAgZHVyYXRpb24oKSB7fQorI2VuZGlmCisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1JlcDI+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIKKyAgICAgICAgZXhwbGljaXQgZHVyYXRpb24oY29uc3QgX1JlcDImIF9fciwKKyAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgaXNfY29udmVydGlibGU8X1JlcDIsIHJlcD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAodHJlYXRfYXNfZmxvYXRpbmdfcG9pbnQ8cmVwPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICF0cmVhdF9hc19mbG9hdGluZ19wb2ludDxfUmVwMj46OnZhbHVlKQorICAgICAgICAgICAgPjo6dHlwZSogPSAwKQorICAgICAgICAgICAgICAgIDogX19yZXBfKF9fcikge30KKworICAgIC8vIGNvbnZlcnNpb25zCisgICAgdGVtcGxhdGUgPGNsYXNzIF9SZXAyLCBjbGFzcyBfUGVyaW9kMj4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgorICAgICAgICBkdXJhdGlvbihjb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX2QsCisgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICBfX25vX292ZXJmbG93PF9QZXJpb2QyLCBwZXJpb2Q+Ojp2YWx1ZSAmJiAoCisgICAgICAgICAgICAgICAgdHJlYXRfYXNfZmxvYXRpbmdfcG9pbnQ8cmVwPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAoX19ub19vdmVyZmxvdzxfUGVyaW9kMiwgcGVyaW9kPjo6dHlwZTo6ZGVuID09IDEgJiYKKyAgICAgICAgICAgICAgICAgIXRyZWF0X2FzX2Zsb2F0aW5nX3BvaW50PF9SZXAyPjo6dmFsdWUpKQorICAgICAgICAgICAgPjo6dHlwZSogPSAwKQorICAgICAgICAgICAgICAgIDogX19yZXBfKF9WU1REOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8ZHVyYXRpb24+KF9fZCkuY291bnQoKSkge30KKworICAgIC8vIG9ic2VydmVyCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSIHJlcCBjb3VudCgpIGNvbnN0IHtyZXR1cm4gX19yZXBfO30KKworICAgIC8vIGFyaXRobWV0aWMKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIgdHlwZW5hbWUgY29tbW9uX3R5cGU8ZHVyYXRpb24+Ojp0eXBlIG9wZXJhdG9yKygpIGNvbnN0IHtyZXR1cm4gdHlwZW5hbWUgY29tbW9uX3R5cGU8ZHVyYXRpb24+Ojp0eXBlKCp0aGlzKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUiB0eXBlbmFtZSBjb21tb25fdHlwZTxkdXJhdGlvbj46OnR5cGUgb3BlcmF0b3ItKCkgY29uc3Qge3JldHVybiB0eXBlbmFtZSBjb21tb25fdHlwZTxkdXJhdGlvbj46OnR5cGUoLV9fcmVwXyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQgZHVyYXRpb24mIG9wZXJhdG9yKysoKSAgICAgIHsrK19fcmVwXzsgcmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0IGR1cmF0aW9uICBvcGVyYXRvcisrKGludCkgICB7cmV0dXJuIGR1cmF0aW9uKF9fcmVwXysrKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNCBkdXJhdGlvbiYgb3BlcmF0b3ItLSgpICAgICAgey0tX19yZXBfOyByZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQgZHVyYXRpb24gIG9wZXJhdG9yLS0oaW50KSAgIHtyZXR1cm4gZHVyYXRpb24oX19yZXBfLS0pO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQgZHVyYXRpb24mIG9wZXJhdG9yKz0oY29uc3QgZHVyYXRpb24mIF9fZCkge19fcmVwXyArPSBfX2QuY291bnQoKTsgcmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0IGR1cmF0aW9uJiBvcGVyYXRvci09KGNvbnN0IGR1cmF0aW9uJiBfX2QpIHtfX3JlcF8gLT0gX19kLmNvdW50KCk7IHJldHVybiAqdGhpczt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0IGR1cmF0aW9uJiBvcGVyYXRvcio9KGNvbnN0IHJlcCYgcmhzKSB7X19yZXBfICo9IHJoczsgcmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0IGR1cmF0aW9uJiBvcGVyYXRvci89KGNvbnN0IHJlcCYgcmhzKSB7X19yZXBfIC89IHJoczsgcmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0IGR1cmF0aW9uJiBvcGVyYXRvciU9KGNvbnN0IHJlcCYgcmhzKSB7X19yZXBfICU9IHJoczsgcmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0IGR1cmF0aW9uJiBvcGVyYXRvciU9KGNvbnN0IGR1cmF0aW9uJiByaHMpIHtfX3JlcF8gJT0gcmhzLmNvdW50KCk7IHJldHVybiAqdGhpczt9CisKKyAgICAvLyBzcGVjaWFsIHZhbHVlcworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgZHVyYXRpb24gemVybygpIHtyZXR1cm4gZHVyYXRpb24oZHVyYXRpb25fdmFsdWVzPHJlcD46Onplcm8oKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGR1cmF0aW9uIG1pbigpICB7cmV0dXJuIGR1cmF0aW9uKGR1cmF0aW9uX3ZhbHVlczxyZXA+OjptaW4oKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGR1cmF0aW9uIG1heCgpICB7cmV0dXJuIGR1cmF0aW9uKGR1cmF0aW9uX3ZhbHVlczxyZXA+OjptYXgoKSk7fQorfTsKKwordHlwZWRlZiBkdXJhdGlvbjxsb25nIGxvbmcsICAgICAgICAgbmFubz4gbmFub3NlY29uZHM7Cit0eXBlZGVmIGR1cmF0aW9uPGxvbmcgbG9uZywgICAgICAgIG1pY3JvPiBtaWNyb3NlY29uZHM7Cit0eXBlZGVmIGR1cmF0aW9uPGxvbmcgbG9uZywgICAgICAgIG1pbGxpPiBtaWxsaXNlY29uZHM7Cit0eXBlZGVmIGR1cmF0aW9uPGxvbmcgbG9uZyAgICAgICAgICAgICAgPiBzZWNvbmRzOwordHlwZWRlZiBkdXJhdGlvbjwgICAgIGxvbmcsIHJhdGlvPCAgNjA+ID4gbWludXRlczsKK3R5cGVkZWYgZHVyYXRpb248ICAgICBsb25nLCByYXRpbzwzNjAwPiA+IGhvdXJzOworCisvLyBEdXJhdGlvbiA9PQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0xoc0R1cmF0aW9uLCBjbGFzcyBfUmhzRHVyYXRpb24+CitzdHJ1Y3QgX19kdXJhdGlvbl9lcQoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX0xoc0R1cmF0aW9uJiBfX2xocywgY29uc3QgX1Joc0R1cmF0aW9uJiBfX3JocykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjb21tb25fdHlwZTxfTGhzRHVyYXRpb24sIF9SaHNEdXJhdGlvbj46OnR5cGUgX0N0OworICAgICAgICAgICAgcmV0dXJuIF9DdChfX2xocykuY291bnQoKSA9PSBfQ3QoX19yaHMpLmNvdW50KCk7CisgICAgICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfTGhzRHVyYXRpb24+CitzdHJ1Y3QgX19kdXJhdGlvbl9lcTxfTGhzRHVyYXRpb24sIF9MaHNEdXJhdGlvbj4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9MaHNEdXJhdGlvbiYgX19saHMsIGNvbnN0IF9MaHNEdXJhdGlvbiYgX19yaHMpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX19saHMuY291bnQoKSA9PSBfX3Jocy5jb3VudCgpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVwMSwgY2xhc3MgX1BlcmlvZDEsIGNsYXNzIF9SZXAyLCBjbGFzcyBfUGVyaW9kMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0NPTlNURVhQUgorYm9vbAorb3BlcmF0b3I9PShjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+JiBfX2xocywgY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCit7CisgICAgcmV0dXJuIF9fZHVyYXRpb25fZXE8ZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiwgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiA+KCkoX19saHMsIF9fcmhzKTsKK30KKworLy8gRHVyYXRpb24gIT0KKwordGVtcGxhdGUgPGNsYXNzIF9SZXAxLCBjbGFzcyBfUGVyaW9kMSwgY2xhc3MgX1JlcDIsIGNsYXNzIF9QZXJpb2QyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSCitib29sCitvcGVyYXRvciE9KGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4mIF9fbGhzLCBjb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX3JocykKK3sKKyAgICByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7Cit9CisKKy8vIER1cmF0aW9uIDwKKwordGVtcGxhdGUgPGNsYXNzIF9MaHNEdXJhdGlvbiwgY2xhc3MgX1Joc0R1cmF0aW9uPgorc3RydWN0IF9fZHVyYXRpb25fbHQKK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9MaHNEdXJhdGlvbiYgX19saHMsIGNvbnN0IF9SaHNEdXJhdGlvbiYgX19yaHMpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X0xoc0R1cmF0aW9uLCBfUmhzRHVyYXRpb24+Ojp0eXBlIF9DdDsKKyAgICAgICAgICAgIHJldHVybiBfQ3QoX19saHMpLmNvdW50KCkgPCBfQ3QoX19yaHMpLmNvdW50KCk7CisgICAgICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfTGhzRHVyYXRpb24+CitzdHJ1Y3QgX19kdXJhdGlvbl9sdDxfTGhzRHVyYXRpb24sIF9MaHNEdXJhdGlvbj4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9MaHNEdXJhdGlvbiYgX19saHMsIGNvbnN0IF9MaHNEdXJhdGlvbiYgX19yaHMpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX19saHMuY291bnQoKSA8IF9fcmhzLmNvdW50KCk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXAxLCBjbGFzcyBfUGVyaW9kMSwgY2xhc3MgX1JlcDIsIGNsYXNzIF9QZXJpb2QyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSCitib29sCitvcGVyYXRvcjwgKGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4mIF9fbGhzLCBjb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX3JocykKK3sKKyAgICByZXR1cm4gX19kdXJhdGlvbl9sdDxkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+LCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+ID4oKShfX2xocywgX19yaHMpOworfQorCisvLyBEdXJhdGlvbiA+CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVwMSwgY2xhc3MgX1BlcmlvZDEsIGNsYXNzIF9SZXAyLCBjbGFzcyBfUGVyaW9kMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0NPTlNURVhQUgorYm9vbAorb3BlcmF0b3I+IChjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+JiBfX2xocywgY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCit7CisgICAgcmV0dXJuIF9fcmhzIDwgX19saHM7Cit9CisKKy8vIER1cmF0aW9uIDw9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVwMSwgY2xhc3MgX1BlcmlvZDEsIGNsYXNzIF9SZXAyLCBjbGFzcyBfUGVyaW9kMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0NPTlNURVhQUgorYm9vbAorb3BlcmF0b3I8PShjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+JiBfX2xocywgY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCit7CisgICAgcmV0dXJuICEoX19yaHMgPCBfX2xocyk7Cit9CisKKy8vIER1cmF0aW9uID49CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVwMSwgY2xhc3MgX1BlcmlvZDEsIGNsYXNzIF9SZXAyLCBjbGFzcyBfUGVyaW9kMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0NPTlNURVhQUgorYm9vbAorb3BlcmF0b3I+PShjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+JiBfX2xocywgY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCit7CisgICAgcmV0dXJuICEoX19saHMgPCBfX3Jocyk7Cit9CisKKy8vIER1cmF0aW9uICsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXAxLCBjbGFzcyBfUGVyaW9kMSwgY2xhc3MgX1JlcDIsIGNsYXNzIF9QZXJpb2QyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSCit0eXBlbmFtZSBjb21tb25fdHlwZTxkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+LCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+ID46OnR5cGUKK29wZXJhdG9yKyhjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+JiBfX2xocywgY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb21tb25fdHlwZTxkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+LCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+ID46OnR5cGUgX0NkOworICAgIHJldHVybiBfQ2QoX0NkKF9fbGhzKS5jb3VudCgpICsgX0NkKF9fcmhzKS5jb3VudCgpKTsKK30KKworLy8gRHVyYXRpb24gLQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JlcDEsIGNsYXNzIF9QZXJpb2QxLCBjbGFzcyBfUmVwMiwgY2xhc3MgX1BlcmlvZDI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIKK3R5cGVuYW1lIGNvbW1vbl90eXBlPGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4sIGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4gPjo6dHlwZQorb3BlcmF0b3ItKGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4mIF9fbGhzLCBjb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX3JocykKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4sIGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4gPjo6dHlwZSBfQ2Q7CisgICAgcmV0dXJuIF9DZChfQ2QoX19saHMpLmNvdW50KCkgLSBfQ2QoX19yaHMpLmNvdW50KCkpOworfQorCisvLyBEdXJhdGlvbiAqCisKK3RlbXBsYXRlIDxjbGFzcyBfUmVwMSwgY2xhc3MgX1BlcmlvZCwgY2xhc3MgX1JlcDI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX2NvbnZlcnRpYmxlPF9SZXAyLCB0eXBlbmFtZSBjb21tb25fdHlwZTxfUmVwMSwgX1JlcDI+Ojp0eXBlPjo6dmFsdWUsCisgICAgZHVyYXRpb248dHlwZW5hbWUgY29tbW9uX3R5cGU8X1JlcDEsIF9SZXAyPjo6dHlwZSwgX1BlcmlvZD4KKz46OnR5cGUKK29wZXJhdG9yKihjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZD4mIF9fZCwgY29uc3QgX1JlcDImIF9fcykKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9SZXAxLCBfUmVwMj46OnR5cGUgX0NyOworICAgIHR5cGVkZWYgZHVyYXRpb248X0NyLCBfUGVyaW9kPiBfQ2Q7CisgICAgcmV0dXJuIF9DZChfQ2QoX19kKS5jb3VudCgpICogc3RhdGljX2Nhc3Q8X0NyPihfX3MpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SZXAxLCBjbGFzcyBfUGVyaW9kLCBjbGFzcyBfUmVwMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0NPTlNURVhQUgordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgaXNfY29udmVydGlibGU8X1JlcDEsIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9SZXAxLCBfUmVwMj46OnR5cGU+Ojp2YWx1ZSwKKyAgICBkdXJhdGlvbjx0eXBlbmFtZSBjb21tb25fdHlwZTxfUmVwMSwgX1JlcDI+Ojp0eXBlLCBfUGVyaW9kPgorPjo6dHlwZQorb3BlcmF0b3IqKGNvbnN0IF9SZXAxJiBfX3MsIGNvbnN0IGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kPiYgX19kKQoreworICAgIHJldHVybiBfX2QgKiBfX3M7Cit9CisKKy8vIER1cmF0aW9uIC8KKwordGVtcGxhdGUgPGNsYXNzIF9EdXJhdGlvbiwgY2xhc3MgX1JlcCwgYm9vbCA9IF9faXNfZHVyYXRpb248X1JlcD46OnZhbHVlPgorc3RydWN0IF9fZHVyYXRpb25fZGl2aWRlX3Jlc3VsdAoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9EdXJhdGlvbiwgY2xhc3MgX1JlcDIsCisgICAgYm9vbCA9IGlzX2NvbnZlcnRpYmxlPF9SZXAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBjb21tb25fdHlwZTx0eXBlbmFtZSBfRHVyYXRpb246OnJlcCwgX1JlcDI+Ojp0eXBlPjo6dmFsdWU+CitzdHJ1Y3QgX19kdXJhdGlvbl9kaXZpZGVfaW1wCit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JlcDEsIGNsYXNzIF9QZXJpb2QsIGNsYXNzIF9SZXAyPgorc3RydWN0IF9fZHVyYXRpb25fZGl2aWRlX2ltcDxkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZD4sIF9SZXAyLCB0cnVlPgoreworICAgIHR5cGVkZWYgZHVyYXRpb248dHlwZW5hbWUgY29tbW9uX3R5cGU8X1JlcDEsIF9SZXAyPjo6dHlwZSwgX1BlcmlvZD4gdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVwMSwgY2xhc3MgX1BlcmlvZCwgY2xhc3MgX1JlcDI+CitzdHJ1Y3QgX19kdXJhdGlvbl9kaXZpZGVfcmVzdWx0PGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kPiwgX1JlcDIsIGZhbHNlPgorICAgIDogX19kdXJhdGlvbl9kaXZpZGVfaW1wPGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kPiwgX1JlcDI+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JlcDEsIGNsYXNzIF9QZXJpb2QsIGNsYXNzIF9SZXAyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSCit0eXBlbmFtZSBfX2R1cmF0aW9uX2RpdmlkZV9yZXN1bHQ8ZHVyYXRpb248X1JlcDEsIF9QZXJpb2Q+LCBfUmVwMj46OnR5cGUKK29wZXJhdG9yLyhjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZD4mIF9fZCwgY29uc3QgX1JlcDImIF9fcykKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9SZXAxLCBfUmVwMj46OnR5cGUgX0NyOworICAgIHR5cGVkZWYgZHVyYXRpb248X0NyLCBfUGVyaW9kPiBfQ2Q7CisgICAgcmV0dXJuIF9DZChfQ2QoX19kKS5jb3VudCgpIC8gc3RhdGljX2Nhc3Q8X0NyPihfX3MpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SZXAxLCBjbGFzcyBfUGVyaW9kMSwgY2xhc3MgX1JlcDIsIGNsYXNzIF9QZXJpb2QyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSCit0eXBlbmFtZSBjb21tb25fdHlwZTxfUmVwMSwgX1JlcDI+Ojp0eXBlCitvcGVyYXRvci8oY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiYgX19saHMsIGNvbnN0IGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4mIF9fcmhzKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8ZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiwgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiA+Ojp0eXBlIF9DdDsKKyAgICByZXR1cm4gX0N0KF9fbGhzKS5jb3VudCgpIC8gX0N0KF9fcmhzKS5jb3VudCgpOworfQorCisvLyBEdXJhdGlvbiAlCisKK3RlbXBsYXRlIDxjbGFzcyBfUmVwMSwgY2xhc3MgX1BlcmlvZCwgY2xhc3MgX1JlcDI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIKK3R5cGVuYW1lIF9fZHVyYXRpb25fZGl2aWRlX3Jlc3VsdDxkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZD4sIF9SZXAyPjo6dHlwZQorb3BlcmF0b3IlKGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kPiYgX19kLCBjb25zdCBfUmVwMiYgX19zKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X1JlcDEsIF9SZXAyPjo6dHlwZSBfQ3I7CisgICAgdHlwZWRlZiBkdXJhdGlvbjxfQ3IsIF9QZXJpb2Q+IF9DZDsKKyAgICByZXR1cm4gX0NkKF9DZChfX2QpLmNvdW50KCkgJSBzdGF0aWNfY2FzdDxfQ3I+KF9fcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JlcDEsIGNsYXNzIF9QZXJpb2QxLCBjbGFzcyBfUmVwMiwgY2xhc3MgX1BlcmlvZDI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIKK3R5cGVuYW1lIGNvbW1vbl90eXBlPGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4sIGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4gPjo6dHlwZQorb3BlcmF0b3IlKGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4mIF9fbGhzLCBjb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX3JocykKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9SZXAxLCBfUmVwMj46OnR5cGUgX0NyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8ZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiwgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiA+Ojp0eXBlIF9DZDsKKyAgICByZXR1cm4gX0NkKHN0YXRpY19jYXN0PF9Dcj4oX0NkKF9fbGhzKS5jb3VudCgpKSAlIHN0YXRpY19jYXN0PF9Dcj4oX0NkKF9fcmhzKS5jb3VudCgpKSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLyB0aW1lX3BvaW50IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uID0gdHlwZW5hbWUgX0Nsb2NrOjpkdXJhdGlvbj4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHRpbWVfcG9pbnQKK3sKKyAgICBzdGF0aWNfYXNzZXJ0KF9faXNfZHVyYXRpb248X0R1cmF0aW9uPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiU2Vjb25kIHRlbXBsYXRlIHBhcmFtZXRlciBvZiB0aW1lX3BvaW50IG11c3QgYmUgYSBzdGQ6OmNocm9ubzo6ZHVyYXRpb24iKTsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9DbG9jayAgICAgICAgICAgICAgICAgICAgY2xvY2s7CisgICAgdHlwZWRlZiBfRHVyYXRpb24gICAgICAgICAgICAgICAgIGR1cmF0aW9uOworICAgIHR5cGVkZWYgdHlwZW5hbWUgZHVyYXRpb246OnJlcCAgICByZXA7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBkdXJhdGlvbjo6cGVyaW9kIHBlcmlvZDsKK3ByaXZhdGU6CisgICAgZHVyYXRpb24gX19kXzsKKworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgdGltZV9wb2ludCgpIDogX19kXyhkdXJhdGlvbjo6emVybygpKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgZXhwbGljaXQgdGltZV9wb2ludChjb25zdCBkdXJhdGlvbiYgX19kKSA6IF9fZF8oX19kKSB7fQorCisgICAgLy8gY29udmVyc2lvbnMKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0R1cmF0aW9uMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgdGltZV9wb2ludChjb25zdCB0aW1lX3BvaW50PGNsb2NrLCBfRHVyYXRpb24yPiYgdCwKKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIGlzX2NvbnZlcnRpYmxlPF9EdXJhdGlvbjIsIGR1cmF0aW9uPjo6dmFsdWUKKyAgICAgICAgPjo6dHlwZSogPSAwKQorICAgICAgICAgICAgOiBfX2RfKHQudGltZV9zaW5jZV9lcG9jaCgpKSB7fQorCisgICAgLy8gb2JzZXJ2ZXIKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgZHVyYXRpb24gdGltZV9zaW5jZV9lcG9jaCgpIGNvbnN0IHtyZXR1cm4gX19kXzt9CisKKyAgICAvLyBhcml0aG1ldGljCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHRpbWVfcG9pbnQmIG9wZXJhdG9yKz0oY29uc3QgZHVyYXRpb24mIF9fZCkge19fZF8gKz0gX19kOyByZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdGltZV9wb2ludCYgb3BlcmF0b3ItPShjb25zdCBkdXJhdGlvbiYgX19kKSB7X19kXyAtPSBfX2Q7IHJldHVybiAqdGhpczt9CisKKyAgICAvLyBzcGVjaWFsIHZhbHVlcworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdGltZV9wb2ludCBtaW4oKSB7cmV0dXJuIHRpbWVfcG9pbnQoZHVyYXRpb246Om1pbigpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdGltZV9wb2ludCBtYXgoKSB7cmV0dXJuIHRpbWVfcG9pbnQoZHVyYXRpb246Om1heCgpKTt9Cit9OworCit9IC8vIGNocm9ubworCit0ZW1wbGF0ZSA8Y2xhc3MgX0Nsb2NrLCBjbGFzcyBfRHVyYXRpb24xLCBjbGFzcyBfRHVyYXRpb24yPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGNvbW1vbl90eXBlPGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbjE+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24yPiA+Cit7CisgICAgdHlwZWRlZiBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCB0eXBlbmFtZSBjb21tb25fdHlwZTxfRHVyYXRpb24xLCBfRHVyYXRpb24yPjo6dHlwZT4gdHlwZTsKK307CisKK25hbWVzcGFjZSBjaHJvbm8geworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RvRHVyYXRpb24sIGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK3RpbWVfcG9pbnQ8X0Nsb2NrLCBfVG9EdXJhdGlvbj4KK3RpbWVfcG9pbnRfY2FzdChjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX190KQoreworICAgIHJldHVybiB0aW1lX3BvaW50PF9DbG9jaywgX1RvRHVyYXRpb24+KF9WU1REOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8X1RvRHVyYXRpb24+KF9fdC50aW1lX3NpbmNlX2Vwb2NoKCkpKTsKK30KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RvRHVyYXRpb24sIGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfZHVyYXRpb248X1RvRHVyYXRpb24+Ojp2YWx1ZSwKKyAgICB0aW1lX3BvaW50PF9DbG9jaywgX1RvRHVyYXRpb24+Cis+Ojp0eXBlCitmbG9vcihjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX190KQoreworICAgIHJldHVybiB0aW1lX3BvaW50PF9DbG9jaywgX1RvRHVyYXRpb24+e2Zsb29yPF9Ub0R1cmF0aW9uPihfX3QudGltZV9zaW5jZV9lcG9jaCgpKX07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVG9EdXJhdGlvbiwgY2xhc3MgX0Nsb2NrLCBjbGFzcyBfRHVyYXRpb24+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc19kdXJhdGlvbjxfVG9EdXJhdGlvbj46OnZhbHVlLAorICAgIHRpbWVfcG9pbnQ8X0Nsb2NrLCBfVG9EdXJhdGlvbj4KKz46OnR5cGUKK2NlaWwoY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fdCkKK3sKKyAgICByZXR1cm4gdGltZV9wb2ludDxfQ2xvY2ssIF9Ub0R1cmF0aW9uPntjZWlsPF9Ub0R1cmF0aW9uPihfX3QudGltZV9zaW5jZV9lcG9jaCgpKX07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVG9EdXJhdGlvbiwgY2xhc3MgX0Nsb2NrLCBjbGFzcyBfRHVyYXRpb24+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc19kdXJhdGlvbjxfVG9EdXJhdGlvbj46OnZhbHVlLAorICAgIHRpbWVfcG9pbnQ8X0Nsb2NrLCBfVG9EdXJhdGlvbj4KKz46OnR5cGUKK3JvdW5kKGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX3QpCit7CisgICAgcmV0dXJuIHRpbWVfcG9pbnQ8X0Nsb2NrLCBfVG9EdXJhdGlvbj57cm91bmQ8X1RvRHVyYXRpb24+KF9fdC50aW1lX3NpbmNlX2Vwb2NoKCkpfTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgbnVtZXJpY19saW1pdHM8X1JlcD46OmlzX3NpZ25lZCwKKyAgICBkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPgorPjo6dHlwZQorYWJzKGR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+IF9fZCkKK3sKKyAgICByZXR1cm4gX19kID49IF9fZC56ZXJvKCkgPyBfX2QgOiAtX19kOworfQorI2VuZGlmCisKKy8vIHRpbWVfcG9pbnQgPT0KKwordGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uMSwgY2xhc3MgX0R1cmF0aW9uMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitib29sCitvcGVyYXRvcj09KGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24xPiYgX19saHMsIGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24yPiYgX19yaHMpCit7CisgICAgcmV0dXJuIF9fbGhzLnRpbWVfc2luY2VfZXBvY2goKSA9PSBfX3Jocy50aW1lX3NpbmNlX2Vwb2NoKCk7Cit9CisKKy8vIHRpbWVfcG9pbnQgIT0KKwordGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uMSwgY2xhc3MgX0R1cmF0aW9uMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitib29sCitvcGVyYXRvciE9KGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24xPiYgX19saHMsIGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24yPiYgX19yaHMpCit7CisgICAgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOworfQorCisvLyB0aW1lX3BvaW50IDwKKwordGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uMSwgY2xhc3MgX0R1cmF0aW9uMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitib29sCitvcGVyYXRvcjwoY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbjE+JiBfX2xocywgY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbjI+JiBfX3JocykKK3sKKyAgICByZXR1cm4gX19saHMudGltZV9zaW5jZV9lcG9jaCgpIDwgX19yaHMudGltZV9zaW5jZV9lcG9jaCgpOworfQorCisvLyB0aW1lX3BvaW50ID4KKwordGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uMSwgY2xhc3MgX0R1cmF0aW9uMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitib29sCitvcGVyYXRvcj4oY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbjE+JiBfX2xocywgY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbjI+JiBfX3JocykKK3sKKyAgICByZXR1cm4gX19yaHMgPCBfX2xoczsKK30KKworLy8gdGltZV9wb2ludCA8PQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0Nsb2NrLCBjbGFzcyBfRHVyYXRpb24xLCBjbGFzcyBfRHVyYXRpb24yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK2Jvb2wKK29wZXJhdG9yPD0oY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbjE+JiBfX2xocywgY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbjI+JiBfX3JocykKK3sKKyAgICByZXR1cm4gIShfX3JocyA8IF9fbGhzKTsKK30KKworLy8gdGltZV9wb2ludCA+PQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0Nsb2NrLCBjbGFzcyBfRHVyYXRpb24xLCBjbGFzcyBfRHVyYXRpb24yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK2Jvb2wKK29wZXJhdG9yPj0oY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbjE+JiBfX2xocywgY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbjI+JiBfX3JocykKK3sKKyAgICByZXR1cm4gIShfX2xocyA8IF9fcmhzKTsKK30KKworLy8gdGltZV9wb2ludCBvcGVyYXRvcisodGltZV9wb2ludCB4LCBkdXJhdGlvbiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uMSwgY2xhc3MgX1JlcDIsIGNsYXNzIF9QZXJpb2QyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK3RpbWVfcG9pbnQ8X0Nsb2NrLCB0eXBlbmFtZSBjb21tb25fdHlwZTxfRHVyYXRpb24xLCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+ID46OnR5cGU+CitvcGVyYXRvcisoY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbjE+JiBfX2xocywgY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCit7CisgICAgdHlwZWRlZiB0aW1lX3BvaW50PF9DbG9jaywgdHlwZW5hbWUgY29tbW9uX3R5cGU8X0R1cmF0aW9uMSwgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiA+Ojp0eXBlPiBfVHI7CisgICAgcmV0dXJuIF9UciAoX19saHMudGltZV9zaW5jZV9lcG9jaCgpICsgX19yaHMpOworfQorCisvLyB0aW1lX3BvaW50IG9wZXJhdG9yKyhkdXJhdGlvbiB4LCB0aW1lX3BvaW50IHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JlcDEsIGNsYXNzIF9QZXJpb2QxLCBjbGFzcyBfQ2xvY2ssIGNsYXNzIF9EdXJhdGlvbjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQordGltZV9wb2ludDxfQ2xvY2ssIHR5cGVuYW1lIGNvbW1vbl90eXBlPGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4sIF9EdXJhdGlvbjI+Ojp0eXBlPgorb3BlcmF0b3IrKGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4mIF9fbGhzLCBjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uMj4mIF9fcmhzKQoreworICAgIHJldHVybiBfX3JocyArIF9fbGhzOworfQorCisvLyB0aW1lX3BvaW50IG9wZXJhdG9yLSh0aW1lX3BvaW50IHgsIGR1cmF0aW9uIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0Nsb2NrLCBjbGFzcyBfRHVyYXRpb24xLCBjbGFzcyBfUmVwMiwgY2xhc3MgX1BlcmlvZDI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQordGltZV9wb2ludDxfQ2xvY2ssIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9EdXJhdGlvbjEsIGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4gPjo6dHlwZT4KK29wZXJhdG9yLShjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uMT4mIF9fbGhzLCBjb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX3JocykKK3sKKyAgICB0eXBlZGVmIHRpbWVfcG9pbnQ8X0Nsb2NrLCB0eXBlbmFtZSBjb21tb25fdHlwZTxfRHVyYXRpb24xLCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+ID46OnR5cGU+IF9SZXQ7CisgICAgcmV0dXJuIF9SZXQoX19saHMudGltZV9zaW5jZV9lcG9jaCgpIC1fX3Jocyk7Cit9CisKKy8vIGR1cmF0aW9uIG9wZXJhdG9yLSh0aW1lX3BvaW50IHgsIHRpbWVfcG9pbnQgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2xvY2ssIGNsYXNzIF9EdXJhdGlvbjEsIGNsYXNzIF9EdXJhdGlvbjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQordHlwZW5hbWUgY29tbW9uX3R5cGU8X0R1cmF0aW9uMSwgX0R1cmF0aW9uMj46OnR5cGUKK29wZXJhdG9yLShjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uMT4mIF9fbGhzLCBjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uMj4mIF9fcmhzKQoreworICAgIHJldHVybiBfX2xocy50aW1lX3NpbmNlX2Vwb2NoKCkgLSBfX3Jocy50aW1lX3NpbmNlX2Vwb2NoKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGNsb2NrcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBzeXN0ZW1fY2xvY2sKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIG1pY3Jvc2Vjb25kcyAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOworICAgIHR5cGVkZWYgZHVyYXRpb246OnJlcCAgICAgICAgICAgICAgICAgICAgcmVwOworICAgIHR5cGVkZWYgZHVyYXRpb246OnBlcmlvZCAgICAgICAgICAgICAgICAgcGVyaW9kOworICAgIHR5cGVkZWYgY2hyb25vOjp0aW1lX3BvaW50PHN5c3RlbV9jbG9jaz4gdGltZV9wb2ludDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgY29uc3QgYm9vbCBpc19zdGVhZHkgPSBmYWxzZTsKKworICAgIHN0YXRpYyB0aW1lX3BvaW50IG5vdygpIF9OT0VYQ0VQVDsKKyAgICBzdGF0aWMgdGltZV90ICAgICB0b190aW1lX3QgIChjb25zdCB0aW1lX3BvaW50JiBfX3QpIF9OT0VYQ0VQVDsKKyAgICBzdGF0aWMgdGltZV9wb2ludCBmcm9tX3RpbWVfdCh0aW1lX3QgX190KSBfTk9FWENFUFQ7Cit9OworCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX01PTk9UT05JQ19DTE9DSworY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBzdGVhZHlfY2xvY2sKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIG5hbm9zZWNvbmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjsKKyAgICB0eXBlZGVmIGR1cmF0aW9uOjpyZXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXA7CisgICAgdHlwZWRlZiBkdXJhdGlvbjo6cGVyaW9kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kOworICAgIHR5cGVkZWYgY2hyb25vOjp0aW1lX3BvaW50PHN0ZWFkeV9jbG9jaywgZHVyYXRpb24+ICAgIHRpbWVfcG9pbnQ7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIGNvbnN0IGJvb2wgaXNfc3RlYWR5ID0gdHJ1ZTsKKworICAgIHN0YXRpYyB0aW1lX3BvaW50IG5vdygpIF9OT0VYQ0VQVDsKK307CisKK3R5cGVkZWYgc3RlYWR5X2Nsb2NrIGhpZ2hfcmVzb2x1dGlvbl9jbG9jazsKKyNlbHNlCit0eXBlZGVmIHN5c3RlbV9jbG9jayBoaWdoX3Jlc29sdXRpb25fY2xvY2s7CisjZW5kaWYKKworfSAvLyBjaHJvbm8KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisvLyBTdWZmaXhlcyBmb3IgZHVyYXRpb24gbGl0ZXJhbHMgW3RpbWUuZHVyYXRpb24ubGl0ZXJhbHNdCitpbmxpbmUgbmFtZXNwYWNlIGxpdGVyYWxzCit7IAorICBpbmxpbmUgbmFtZXNwYWNlIGNocm9ub19saXRlcmFscworICB7CisKKyAgICBjb25zdGV4cHIgY2hyb25vOjpob3VycyBvcGVyYXRvciIiaCh1bnNpZ25lZCBsb25nIGxvbmcgX19oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNocm9ubzo6aG91cnMoc3RhdGljX2Nhc3Q8Y2hyb25vOjpob3Vyczo6cmVwPihfX2gpKTsKKyAgICB9CisKKyAgICBjb25zdGV4cHIgY2hyb25vOjpkdXJhdGlvbjxsb25nIGRvdWJsZSwgcmF0aW88MzYwMCwxPj4gb3BlcmF0b3IiImgobG9uZyBkb3VibGUgX19oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNocm9ubzo6ZHVyYXRpb248bG9uZyBkb3VibGUsIHJhdGlvPDM2MDAsMT4+KF9faCk7CisgICAgfQorCisKKyAgICBjb25zdGV4cHIgY2hyb25vOjptaW51dGVzIG9wZXJhdG9yIiJtaW4odW5zaWduZWQgbG9uZyBsb25nIF9fbSkKKyAgICB7CisgICAgICAgIHJldHVybiBjaHJvbm86Om1pbnV0ZXMoc3RhdGljX2Nhc3Q8Y2hyb25vOjptaW51dGVzOjpyZXA+KF9fbSkpOworICAgIH0KKworICAgIGNvbnN0ZXhwciBjaHJvbm86OmR1cmF0aW9uPGxvbmcgZG91YmxlLCByYXRpbzw2MCwxPj4gb3BlcmF0b3IiIm1pbihsb25nIGRvdWJsZSBfX20pCisgICAgeworICAgICAgICByZXR1cm4gY2hyb25vOjpkdXJhdGlvbjxsb25nIGRvdWJsZSwgcmF0aW88NjAsMT4+IChfX20pOworICAgIH0KKworCisgICAgY29uc3RleHByIGNocm9ubzo6c2Vjb25kcyBvcGVyYXRvciIicyh1bnNpZ25lZCBsb25nIGxvbmcgX19zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNocm9ubzo6c2Vjb25kcyhzdGF0aWNfY2FzdDxjaHJvbm86OnNlY29uZHM6OnJlcD4oX19zKSk7CisgICAgfQorCisgICAgY29uc3RleHByIGNocm9ubzo6ZHVyYXRpb248bG9uZyBkb3VibGU+IG9wZXJhdG9yIiJzKGxvbmcgZG91YmxlIF9fcykKKyAgICB7CisgICAgICAgIHJldHVybiBjaHJvbm86OmR1cmF0aW9uPGxvbmcgZG91YmxlPiAoX19zKTsKKyAgICB9CisKKworICAgIGNvbnN0ZXhwciBjaHJvbm86Om1pbGxpc2Vjb25kcyBvcGVyYXRvciIibXModW5zaWduZWQgbG9uZyBsb25nIF9fbXMpCisgICAgeworICAgICAgICByZXR1cm4gY2hyb25vOjptaWxsaXNlY29uZHMoc3RhdGljX2Nhc3Q8Y2hyb25vOjptaWxsaXNlY29uZHM6OnJlcD4oX19tcykpOworICAgIH0KKworICAgIGNvbnN0ZXhwciBjaHJvbm86OmR1cmF0aW9uPGxvbmcgZG91YmxlLCBtaWxsaT4gb3BlcmF0b3IiIm1zKGxvbmcgZG91YmxlIF9fbXMpCisgICAgeworICAgICAgICByZXR1cm4gY2hyb25vOjpkdXJhdGlvbjxsb25nIGRvdWJsZSwgbWlsbGk+KF9fbXMpOworICAgIH0KKworCisgICAgY29uc3RleHByIGNocm9ubzo6bWljcm9zZWNvbmRzIG9wZXJhdG9yIiJ1cyh1bnNpZ25lZCBsb25nIGxvbmcgX191cykKKyAgICB7CisgICAgICAgIHJldHVybiBjaHJvbm86Om1pY3Jvc2Vjb25kcyhzdGF0aWNfY2FzdDxjaHJvbm86Om1pY3Jvc2Vjb25kczo6cmVwPihfX3VzKSk7CisgICAgfQorCisgICAgY29uc3RleHByIGNocm9ubzo6ZHVyYXRpb248bG9uZyBkb3VibGUsIG1pY3JvPiBvcGVyYXRvciIidXMobG9uZyBkb3VibGUgX191cykKKyAgICB7CisgICAgICAgIHJldHVybiBjaHJvbm86OmR1cmF0aW9uPGxvbmcgZG91YmxlLCBtaWNybz4gKF9fdXMpOworICAgIH0KKyAgICAKKworICAgIGNvbnN0ZXhwciBjaHJvbm86Om5hbm9zZWNvbmRzIG9wZXJhdG9yIiJucyh1bnNpZ25lZCBsb25nIGxvbmcgX19ucykKKyAgICB7CisgICAgICAgIHJldHVybiBjaHJvbm86Om5hbm9zZWNvbmRzKHN0YXRpY19jYXN0PGNocm9ubzo6bmFub3NlY29uZHM6OnJlcD4oX19ucykpOworICAgIH0KKworICAgIGNvbnN0ZXhwciBjaHJvbm86OmR1cmF0aW9uPGxvbmcgZG91YmxlLCBuYW5vPiBvcGVyYXRvciIibnMobG9uZyBkb3VibGUgX19ucykKKyAgICB7CisgICAgICAgIHJldHVybiBjaHJvbm86OmR1cmF0aW9uPGxvbmcgZG91YmxlLCBuYW5vPiAoX19ucyk7CisgICAgfQorCit9fQorCituYW1lc3BhY2UgY2hyb25vIHsgLy8gaG9pc3QgdGhlIGxpdGVyYWxzIGludG8gbmFtZXNwYWNlIHN0ZDo6Y2hyb25vCisgICB1c2luZyBuYW1lc3BhY2UgbGl0ZXJhbHM6OmNocm9ub19saXRlcmFsczsKK30KKworI2VuZGlmCisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworX0xJQkNQUF9QT1BfTUFDUk9TCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DSFJPTk8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jaW50dHlwZXMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY2ludHR5cGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNjFiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY2ludHR5cGVzCkBAIC0wLDAgKzEsMjU4IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY2ludHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0NJTlRUWVBFUworI2RlZmluZSBfTElCQ1BQX0NJTlRUWVBFUworCisvKgorICAgIGNpbnR0eXBlcyBzeW5vcHNpcworCitUaGlzIGVudGlyZSBoZWFkZXIgaXMgQzk5IC8gQysrMFgKKworI2luY2x1ZGUgPGNzdGRpbnQ+ICAvLyA8Y2ludHR5cGVzPiBpbmNsdWRlcyA8Y3N0ZGludD4KKworTWFjcm9zOgorCisgICAgUFJJZDgKKyAgICBQUklkMTYKKyAgICBQUklkMzIKKyAgICBQUklkNjQKKworICAgIFBSSWRMRUFTVDgKKyAgICBQUklkTEVBU1QxNgorICAgIFBSSWRMRUFTVDMyCisgICAgUFJJZExFQVNUNjQKKworICAgIFBSSWRGQVNUOAorICAgIFBSSWRGQVNUMTYKKyAgICBQUklkRkFTVDMyCisgICAgUFJJZEZBU1Q2NAorCisgICAgUFJJZE1BWAorICAgIFBSSWRQVFIKKworICAgIFBSSWk4CisgICAgUFJJaTE2CisgICAgUFJJaTMyCisgICAgUFJJaTY0CisKKyAgICBQUklpTEVBU1Q4CisgICAgUFJJaUxFQVNUMTYKKyAgICBQUklpTEVBU1QzMgorICAgIFBSSWlMRUFTVDY0CisKKyAgICBQUklpRkFTVDgKKyAgICBQUklpRkFTVDE2CisgICAgUFJJaUZBU1QzMgorICAgIFBSSWlGQVNUNjQKKworICAgIFBSSWlNQVgKKyAgICBQUklpUFRSCisKKyAgICBQUklvOAorICAgIFBSSW8xNgorICAgIFBSSW8zMgorICAgIFBSSW82NAorCisgICAgUFJJb0xFQVNUOAorICAgIFBSSW9MRUFTVDE2CisgICAgUFJJb0xFQVNUMzIKKyAgICBQUklvTEVBU1Q2NAorCisgICAgUFJJb0ZBU1Q4CisgICAgUFJJb0ZBU1QxNgorICAgIFBSSW9GQVNUMzIKKyAgICBQUklvRkFTVDY0CisKKyAgICBQUklvTUFYCisgICAgUFJJb1BUUgorCisgICAgUFJJdTgKKyAgICBQUkl1MTYKKyAgICBQUkl1MzIKKyAgICBQUkl1NjQKKworICAgIFBSSXVMRUFTVDgKKyAgICBQUkl1TEVBU1QxNgorICAgIFBSSXVMRUFTVDMyCisgICAgUFJJdUxFQVNUNjQKKworICAgIFBSSXVGQVNUOAorICAgIFBSSXVGQVNUMTYKKyAgICBQUkl1RkFTVDMyCisgICAgUFJJdUZBU1Q2NAorCisgICAgUFJJdU1BWAorICAgIFBSSXVQVFIKKworICAgIFBSSXg4CisgICAgUFJJeDE2CisgICAgUFJJeDMyCisgICAgUFJJeDY0CisKKyAgICBQUkl4TEVBU1Q4CisgICAgUFJJeExFQVNUMTYKKyAgICBQUkl4TEVBU1QzMgorICAgIFBSSXhMRUFTVDY0CisKKyAgICBQUkl4RkFTVDgKKyAgICBQUkl4RkFTVDE2CisgICAgUFJJeEZBU1QzMgorICAgIFBSSXhGQVNUNjQKKworICAgIFBSSXhNQVgKKyAgICBQUkl4UFRSCisKKyAgICBQUklYOAorICAgIFBSSVgxNgorICAgIFBSSVgzMgorICAgIFBSSVg2NAorCisgICAgUFJJWExFQVNUOAorICAgIFBSSVhMRUFTVDE2CisgICAgUFJJWExFQVNUMzIKKyAgICBQUklYTEVBU1Q2NAorCisgICAgUFJJWEZBU1Q4CisgICAgUFJJWEZBU1QxNgorICAgIFBSSVhGQVNUMzIKKyAgICBQUklYRkFTVDY0CisKKyAgICBQUklYTUFYCisgICAgUFJJWFBUUgorCisgICAgU0NOZDgKKyAgICBTQ05kMTYKKyAgICBTQ05kMzIKKyAgICBTQ05kNjQKKworICAgIFNDTmRMRUFTVDgKKyAgICBTQ05kTEVBU1QxNgorICAgIFNDTmRMRUFTVDMyCisgICAgU0NOZExFQVNUNjQKKworICAgIFNDTmRGQVNUOAorICAgIFNDTmRGQVNUMTYKKyAgICBTQ05kRkFTVDMyCisgICAgU0NOZEZBU1Q2NAorCisgICAgU0NOZE1BWAorICAgIFNDTmRQVFIKKworICAgIFNDTmk4CisgICAgU0NOaTE2CisgICAgU0NOaTMyCisgICAgU0NOaTY0CisKKyAgICBTQ05pTEVBU1Q4CisgICAgU0NOaUxFQVNUMTYKKyAgICBTQ05pTEVBU1QzMgorICAgIFNDTmlMRUFTVDY0CisKKyAgICBTQ05pRkFTVDgKKyAgICBTQ05pRkFTVDE2CisgICAgU0NOaUZBU1QzMgorICAgIFNDTmlGQVNUNjQKKworICAgIFNDTmlNQVgKKyAgICBTQ05pUFRSCisKKyAgICBTQ05vOAorICAgIFNDTm8xNgorICAgIFNDTm8zMgorICAgIFNDTm82NAorCisgICAgU0NOb0xFQVNUOAorICAgIFNDTm9MRUFTVDE2CisgICAgU0NOb0xFQVNUMzIKKyAgICBTQ05vTEVBU1Q2NAorCisgICAgU0NOb0ZBU1Q4CisgICAgU0NOb0ZBU1QxNgorICAgIFNDTm9GQVNUMzIKKyAgICBTQ05vRkFTVDY0CisKKyAgICBTQ05vTUFYCisgICAgU0NOb1BUUgorCisgICAgU0NOdTgKKyAgICBTQ051MTYKKyAgICBTQ051MzIKKyAgICBTQ051NjQKKworICAgIFNDTnVMRUFTVDgKKyAgICBTQ051TEVBU1QxNgorICAgIFNDTnVMRUFTVDMyCisgICAgU0NOdUxFQVNUNjQKKworICAgIFNDTnVGQVNUOAorICAgIFNDTnVGQVNUMTYKKyAgICBTQ051RkFTVDMyCisgICAgU0NOdUZBU1Q2NAorCisgICAgU0NOdU1BWAorICAgIFNDTnVQVFIKKworICAgIFNDTng4CisgICAgU0NOeDE2CisgICAgU0NOeDMyCisgICAgU0NOeDY0CisKKyAgICBTQ054TEVBU1Q4CisgICAgU0NOeExFQVNUMTYKKyAgICBTQ054TEVBU1QzMgorICAgIFNDTnhMRUFTVDY0CisKKyAgICBTQ054RkFTVDgKKyAgICBTQ054RkFTVDE2CisgICAgU0NOeEZBU1QzMgorICAgIFNDTnhGQVNUNjQKKworICAgIFNDTnhNQVgKKyAgICBTQ054UFRSCisKK25hbWVzcGFjZSBzdGQKK3sKKworVHlwZXM6CisKKyAgICBpbWF4ZGl2X3QKKworaW50bWF4X3QgIGltYXhhYnMoaW50bWF4X3Qgaik7CitpbWF4ZGl2X3QgaW1heGRpdihpbnRtYXhfdCBudW1lciwgaW50bWF4X3QgZGVub20pOworaW50bWF4X3QgIHN0cnRvaW1heChjb25zdCBjaGFyKiByZXN0cmljdCBucHRyLCBjaGFyKiogcmVzdHJpY3QgZW5kcHRyLCBpbnQgYmFzZSk7Cit1aW50bWF4X3Qgc3RydG91bWF4KGNvbnN0IGNoYXIqIHJlc3RyaWN0IG5wdHIsIGNoYXIqKiByZXN0cmljdCBlbmRwdHIsIGludCBiYXNlKTsKK2ludG1heF90ICB3Y3N0b2ltYXgoY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgbnB0ciwgd2NoYXJfdCoqIHJlc3RyaWN0IGVuZHB0ciwgaW50IGJhc2UpOwordWludG1heF90IHdjc3RvdW1heChjb25zdCB3Y2hhcl90KiByZXN0cmljdCBucHRyLCB3Y2hhcl90KiogcmVzdHJpY3QgZW5kcHRyLCBpbnQgYmFzZSk7CisKK30gIC8vIHN0ZAorKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCit1c2luZzo6aW1heGRpdl90OwordXNpbmc6OmltYXhhYnM7Cit1c2luZzo6aW1heGRpdjsKK3VzaW5nOjpzdHJ0b2ltYXg7Cit1c2luZzo6c3RydG91bWF4OwordXNpbmc6Ondjc3RvaW1heDsKK3VzaW5nOjp3Y3N0b3VtYXg7CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX0NJTlRUWVBFUwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2Npc282NDYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY2lzbzY0NgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmVmYzcyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2Npc282NDYKQEAgLTAsMCArMSwyNSBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNpc282NDYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9DSVNPNjQ2CisjZGVmaW5lIF9MSUJDUFBfQ0lTTzY0NgorCisvKgorICAgIGNpc282NDYgc3lub3BzaXMKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2VuZGlmICAvLyBfTElCQ1BQX0NJU082NDYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jbGltaXRzIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NsaW1pdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmZmVjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jbGltaXRzCkBAIC0wLDAgKzEsNDggQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjbGltaXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfQ0xJTUlUUworI2RlZmluZSBfTElCQ1BQX0NMSU1JVFMKKworLyoKKyAgICBjbGltaXRzIHN5bm9wc2lzCisKK01hY3JvczoKKworICAgIENIQVJfQklUCisgICAgU0NIQVJfTUlOCisgICAgU0NIQVJfTUFYCisgICAgVUNIQVJfTUFYCisgICAgQ0hBUl9NSU4KKyAgICBDSEFSX01BWAorICAgIE1CX0xFTl9NQVgKKyAgICBTSFJUX01JTgorICAgIFNIUlRfTUFYCisgICAgVVNIUlRfTUFYCisgICAgSU5UX01JTgorICAgIElOVF9NQVgKKyAgICBVSU5UX01BWAorICAgIExPTkdfTUlOCisgICAgTE9OR19NQVgKKyAgICBVTE9OR19NQVgKKyAgICBMTE9OR19NSU4gICAvLyBDOTkKKyAgICBMTE9OR19NQVggICAvLyBDOTkKKyAgICBVTExPTkdfTUFYICAvLyBDOTkKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2VuZGlmICAvLyBfTElCQ1BQX0NMSU1JVFMKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jbG9jYWxlIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2Nsb2NhbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVmYTljNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jbG9jYWxlCkBAIC0wLDAgKzEsNTUgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjbG9jYWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfQ0xPQ0FMRQorI2RlZmluZSBfTElCQ1BQX0NMT0NBTEUKKworLyoKKyAgICBjbG9jYWxlIHN5bm9wc2lzCisKK01hY3JvczoKKworICAgIExDX0FMTAorICAgIExDX0NPTExBVEUKKyAgICBMQ19DVFlQRQorICAgIExDX01PTkVUQVJZCisgICAgTENfTlVNRVJJQworICAgIExDX1RJTUUKKyAgICBOVUxMCisKK25hbWVzcGFjZSBzdGQKK3sKKworc3RydWN0IGxjb252OworY2hhciogc2V0bG9jYWxlKGludCBjYXRlZ29yeSwgY29uc3QgY2hhciogbG9jYWxlKTsKK2xjb252KiBsb2NhbGVjb252KCk7CisKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKwordXNpbmcgOjpsY29udjsKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fVEhSRUFEX1VOU0FGRV9DX0ZVTkNUSU9OUwordXNpbmcgOjpzZXRsb2NhbGU7CisjZW5kaWYKK3VzaW5nIDo6bG9jYWxlY29udjsKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ0xPQ0FMRQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NtYXRoIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NtYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNzkyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY21hdGgKQEAgLTAsMCArMSw2MTEgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY21hdGggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfQ01BVEgKKyNkZWZpbmUgX0xJQkNQUF9DTUFUSAorCisvKgorICAgIGNtYXRoIHN5bm9wc2lzCisKK01hY3JvczoKKworICAgIEhVR0VfVkFMCisgICAgSFVHRV9WQUxGICAgICAgICAgICAgICAgLy8gQzk5CisgICAgSFVHRV9WQUxMICAgICAgICAgICAgICAgLy8gQzk5CisgICAgSU5GSU5JVFkgICAgICAgICAgICAgICAgLy8gQzk5CisgICAgTkFOICAgICAgICAgICAgICAgICAgICAgLy8gQzk5CisgICAgRlBfSU5GSU5JVEUgICAgICAgICAgICAgLy8gQzk5CisgICAgRlBfTkFOICAgICAgICAgICAgICAgICAgLy8gQzk5CisgICAgRlBfTk9STUFMICAgICAgICAgICAgICAgLy8gQzk5CisgICAgRlBfU1VCTk9STUFMICAgICAgICAgICAgLy8gQzk5CisgICAgRlBfWkVSTyAgICAgICAgICAgICAgICAgLy8gQzk5CisgICAgRlBfRkFTVF9GTUEgICAgICAgICAgICAgLy8gQzk5CisgICAgRlBfRkFTVF9GTUFGICAgICAgICAgICAgLy8gQzk5CisgICAgRlBfRkFTVF9GTUFMICAgICAgICAgICAgLy8gQzk5CisgICAgRlBfSUxPR0IwICAgICAgICAgICAgICAgLy8gQzk5CisgICAgRlBfSUxPR0JOQU4gICAgICAgICAgICAgLy8gQzk5CisgICAgTUFUSF9FUlJOTyAgICAgICAgICAgICAgLy8gQzk5CisgICAgTUFUSF9FUlJFWENFUFQgICAgICAgICAgLy8gQzk5CisgICAgbWF0aF9lcnJoYW5kbGluZyAgICAgICAgLy8gQzk5CisKK25hbWVzcGFjZSBzdGQKK3sKKworVHlwZXM6CisKKyAgICBmbG9hdF90ICAgICAgICAgICAgICAgICAvLyBDOTkKKyAgICBkb3VibGVfdCAgICAgICAgICAgICAgICAvLyBDOTkKKworLy8gQzkwCisKK2Zsb2F0aW5nX3BvaW50IGFicyhmbG9hdGluZ19wb2ludCB4KTsKKworZmxvYXRpbmdfcG9pbnQgYWNvcyAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGFjb3NmKGZsb2F0IHgpOworbG9uZyBkb3VibGUgICAgYWNvc2wobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IGFzaW4gKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBhc2luZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGFzaW5sKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBhdGFuIChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgYXRhbmYoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICBhdGFubChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgYXRhbjIgKGFyaXRobWV0aWMgeSwgYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGF0YW4yZihmbG9hdCB5LCBmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGF0YW4ybChsb25nIGRvdWJsZSB5LCBsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgY2VpbCAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGNlaWxmKGZsb2F0IHgpOworbG9uZyBkb3VibGUgICAgY2VpbGwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IGNvcyAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGNvc2YoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICBjb3NsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBjb3NoIChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgY29zaGYoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICBjb3NobChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgZXhwIChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgZXhwZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGV4cGwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IGZhYnMgKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBmYWJzZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGZhYnNsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBmbG9vciAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGZsb29yZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGZsb29ybChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgZm1vZCAoYXJpdGhtZXRpYyB4LCBhcml0aG1ldGljIHkpOworZmxvYXQgICAgICAgICAgZm1vZGYoZmxvYXQgeCwgZmxvYXQgeSk7Citsb25nIGRvdWJsZSAgICBmbW9kbChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KTsKKworZmxvYXRpbmdfcG9pbnQgZnJleHAgKGFyaXRobWV0aWMgdmFsdWUsIGludCogZXhwKTsKK2Zsb2F0ICAgICAgICAgIGZyZXhwZihmbG9hdCB2YWx1ZSwgaW50KiBleHApOworbG9uZyBkb3VibGUgICAgZnJleHBsKGxvbmcgZG91YmxlIHZhbHVlLCBpbnQqIGV4cCk7CisKK2Zsb2F0aW5nX3BvaW50IGxkZXhwIChhcml0aG1ldGljIHZhbHVlLCBpbnQgZXhwKTsKK2Zsb2F0ICAgICAgICAgIGxkZXhwZihmbG9hdCB2YWx1ZSwgaW50IGV4cCk7Citsb25nIGRvdWJsZSAgICBsZGV4cGwobG9uZyBkb3VibGUgdmFsdWUsIGludCBleHApOworCitmbG9hdGluZ19wb2ludCBsb2cgKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBsb2dmKGZsb2F0IHgpOworbG9uZyBkb3VibGUgICAgbG9nbChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgbG9nMTAgKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBsb2cxMGYoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICBsb2cxMGwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IG1vZGYgKGZsb2F0aW5nX3BvaW50IHZhbHVlLCBmbG9hdGluZ19wb2ludCogaXB0cik7CitmbG9hdCAgICAgICAgICBtb2RmZihmbG9hdCB2YWx1ZSwgZmxvYXQqIGlwdHIpOworbG9uZyBkb3VibGUgICAgbW9kZmwobG9uZyBkb3VibGUgdmFsdWUsIGxvbmcgZG91YmxlKiBpcHRyKTsKKworZmxvYXRpbmdfcG9pbnQgcG93IChhcml0aG1ldGljIHgsIGFyaXRobWV0aWMgeSk7CitmbG9hdCAgICAgICAgICBwb3dmKGZsb2F0IHgsIGZsb2F0IHkpOworbG9uZyBkb3VibGUgICAgcG93bChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KTsKKworZmxvYXRpbmdfcG9pbnQgc2luIChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgc2luZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIHNpbmwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IHNpbmggKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBzaW5oZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIHNpbmhsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBzcXJ0IChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgc3FydGYoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICBzcXJ0bChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgdGFuIChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgdGFuZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIHRhbmwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IHRhbmggKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICB0YW5oZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIHRhbmhsKGxvbmcgZG91YmxlIHgpOworCisvLyAgQzk5CisKK2Jvb2wgc2lnbmJpdChhcml0aG1ldGljIHgpOworCitpbnQgZnBjbGFzc2lmeShhcml0aG1ldGljIHgpOworCitib29sIGlzZmluaXRlKGFyaXRobWV0aWMgeCk7Citib29sIGlzaW5mKGFyaXRobWV0aWMgeCk7Citib29sIGlzbmFuKGFyaXRobWV0aWMgeCk7Citib29sIGlzbm9ybWFsKGFyaXRobWV0aWMgeCk7CisKK2Jvb2wgaXNncmVhdGVyKGFyaXRobWV0aWMgeCwgYXJpdGhtZXRpYyB5KTsKK2Jvb2wgaXNncmVhdGVyZXF1YWwoYXJpdGhtZXRpYyB4LCBhcml0aG1ldGljIHkpOworYm9vbCBpc2xlc3MoYXJpdGhtZXRpYyB4LCBhcml0aG1ldGljIHkpOworYm9vbCBpc2xlc3NlcXVhbChhcml0aG1ldGljIHgsIGFyaXRobWV0aWMgeSk7Citib29sIGlzbGVzc2dyZWF0ZXIoYXJpdGhtZXRpYyB4LCBhcml0aG1ldGljIHkpOworYm9vbCBpc3Vub3JkZXJlZChhcml0aG1ldGljIHgsIGFyaXRobWV0aWMgeSk7CisKK2Zsb2F0aW5nX3BvaW50IGFjb3NoIChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgYWNvc2hmKGZsb2F0IHgpOworbG9uZyBkb3VibGUgICAgYWNvc2hsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBhc2luaCAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGFzaW5oZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGFzaW5obChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgYXRhbmggKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBhdGFuaGYoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICBhdGFuaGwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IGNicnQgKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBjYnJ0ZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGNicnRsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBjb3B5c2lnbiAoYXJpdGhtZXRpYyB4LCBhcml0aG1ldGljIHkpOworZmxvYXQgICAgICAgICAgY29weXNpZ25mKGZsb2F0IHgsIGZsb2F0IHkpOworbG9uZyBkb3VibGUgICAgY29weXNpZ25sKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpOworCitmbG9hdGluZ19wb2ludCBlcmYgKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBlcmZmKGZsb2F0IHgpOworbG9uZyBkb3VibGUgICAgZXJmbChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgZXJmYyAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGVyZmNmKGZsb2F0IHgpOworbG9uZyBkb3VibGUgICAgZXJmY2wobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IGV4cDIgKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBleHAyZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGV4cDJsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBleHBtMSAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGV4cG0xZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGV4cG0xbChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgZmRpbSAoYXJpdGhtZXRpYyB4LCBhcml0aG1ldGljIHkpOworZmxvYXQgICAgICAgICAgZmRpbWYoZmxvYXQgeCwgZmxvYXQgeSk7Citsb25nIGRvdWJsZSAgICBmZGltbChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KTsKKworZmxvYXRpbmdfcG9pbnQgZm1hIChhcml0aG1ldGljIHgsIGFyaXRobWV0aWMgeSwgYXJpdGhtZXRpYyB6KTsKK2Zsb2F0ICAgICAgICAgIGZtYWYoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7Citsb25nIGRvdWJsZSAgICBmbWFsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHksIGxvbmcgZG91YmxlIHopOworCitmbG9hdGluZ19wb2ludCBmbWF4IChhcml0aG1ldGljIHgsIGFyaXRobWV0aWMgeSk7CitmbG9hdCAgICAgICAgICBmbWF4ZihmbG9hdCB4LCBmbG9hdCB5KTsKK2xvbmcgZG91YmxlICAgIGZtYXhsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpOworCitmbG9hdGluZ19wb2ludCBmbWluIChhcml0aG1ldGljIHgsIGFyaXRobWV0aWMgeSk7CitmbG9hdCAgICAgICAgICBmbWluZihmbG9hdCB4LCBmbG9hdCB5KTsKK2xvbmcgZG91YmxlICAgIGZtaW5sKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpOworCitmbG9hdGluZ19wb2ludCBoeXBvdCAoYXJpdGhtZXRpYyB4LCBhcml0aG1ldGljIHkpOworZmxvYXQgICAgICAgICAgaHlwb3RmKGZsb2F0IHgsIGZsb2F0IHkpOworbG9uZyBkb3VibGUgICAgaHlwb3RsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpOworCitkb3VibGUgICAgICAgaHlwb3QoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeik7ICAgICAgICAgICAgICAgIC8vIEMrKzE3CitmbG9hdCAgICAgICAgaHlwb3QoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7ICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3Citsb25nIGRvdWJsZSAgaHlwb3QobG9uZyBkb3VibGUgeCwgbG9uZyBkb3VibGUgeSwgbG9uZyBkb3VibGUgeik7IC8vIEMrKzE3CisKK2ludCBpbG9nYiAoYXJpdGhtZXRpYyB4KTsKK2ludCBpbG9nYmYoZmxvYXQgeCk7CitpbnQgaWxvZ2JsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBsZ2FtbWEgKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBsZ2FtbWFmKGZsb2F0IHgpOworbG9uZyBkb3VibGUgICAgbGdhbW1hbChsb25nIGRvdWJsZSB4KTsKKworbG9uZyBsb25nIGxscmludCAoYXJpdGhtZXRpYyB4KTsKK2xvbmcgbG9uZyBsbHJpbnRmKGZsb2F0IHgpOworbG9uZyBsb25nIGxscmludGwobG9uZyBkb3VibGUgeCk7CisKK2xvbmcgbG9uZyBsbHJvdW5kIChhcml0aG1ldGljIHgpOworbG9uZyBsb25nIGxscm91bmRmKGZsb2F0IHgpOworbG9uZyBsb25nIGxscm91bmRsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBsb2cxcCAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGxvZzFwZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGxvZzFwbChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgbG9nMiAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGxvZzJmKGZsb2F0IHgpOworbG9uZyBkb3VibGUgICAgbG9nMmwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IGxvZ2IgKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBsb2diZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGxvZ2JsKGxvbmcgZG91YmxlIHgpOworCitsb25nIGxyaW50IChhcml0aG1ldGljIHgpOworbG9uZyBscmludGYoZmxvYXQgeCk7Citsb25nIGxyaW50bChsb25nIGRvdWJsZSB4KTsKKworbG9uZyBscm91bmQgKGFyaXRobWV0aWMgeCk7Citsb25nIGxyb3VuZGYoZmxvYXQgeCk7Citsb25nIGxyb3VuZGwobG9uZyBkb3VibGUgeCk7CisKK2RvdWJsZSAgICAgIG5hbiAoY29uc3QgY2hhciogc3RyKTsKK2Zsb2F0ICAgICAgIG5hbmYoY29uc3QgY2hhciogc3RyKTsKK2xvbmcgZG91YmxlIG5hbmwoY29uc3QgY2hhciogc3RyKTsKKworZmxvYXRpbmdfcG9pbnQgbmVhcmJ5aW50IChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgbmVhcmJ5aW50ZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIG5lYXJieWludGwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IG5leHRhZnRlciAoYXJpdGhtZXRpYyB4LCBhcml0aG1ldGljIHkpOworZmxvYXQgICAgICAgICAgbmV4dGFmdGVyZihmbG9hdCB4LCBmbG9hdCB5KTsKK2xvbmcgZG91YmxlICAgIG5leHRhZnRlcmwobG9uZyBkb3VibGUgeCwgbG9uZyBkb3VibGUgeSk7CisKK2Zsb2F0aW5nX3BvaW50IG5leHR0b3dhcmQgKGFyaXRobWV0aWMgeCwgbG9uZyBkb3VibGUgeSk7CitmbG9hdCAgICAgICAgICBuZXh0dG93YXJkZihmbG9hdCB4LCBsb25nIGRvdWJsZSB5KTsKK2xvbmcgZG91YmxlICAgIG5leHR0b3dhcmRsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpOworCitmbG9hdGluZ19wb2ludCByZW1haW5kZXIgKGFyaXRobWV0aWMgeCwgYXJpdGhtZXRpYyB5KTsKK2Zsb2F0ICAgICAgICAgIHJlbWFpbmRlcmYoZmxvYXQgeCwgZmxvYXQgeSk7Citsb25nIGRvdWJsZSAgICByZW1haW5kZXJsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpOworCitmbG9hdGluZ19wb2ludCByZW1xdW8gKGFyaXRobWV0aWMgeCwgYXJpdGhtZXRpYyB5LCBpbnQqIHBxdW8pOworZmxvYXQgICAgICAgICAgcmVtcXVvZihmbG9hdCB4LCBmbG9hdCB5LCBpbnQqIHBxdW8pOworbG9uZyBkb3VibGUgICAgcmVtcXVvbChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5LCBpbnQqIHBxdW8pOworCitmbG9hdGluZ19wb2ludCByaW50IChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgcmludGYoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICByaW50bChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgcm91bmQgKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICByb3VuZGYoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICByb3VuZGwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IHNjYWxibG4gKGFyaXRobWV0aWMgeCwgbG9uZyBleCk7CitmbG9hdCAgICAgICAgICBzY2FsYmxuZihmbG9hdCB4LCBsb25nIGV4KTsKK2xvbmcgZG91YmxlICAgIHNjYWxibG5sKGxvbmcgZG91YmxlIHgsIGxvbmcgZXgpOworCitmbG9hdGluZ19wb2ludCBzY2FsYm4gKGFyaXRobWV0aWMgeCwgaW50IGV4KTsKK2Zsb2F0ICAgICAgICAgIHNjYWxibmYoZmxvYXQgeCwgaW50IGV4KTsKK2xvbmcgZG91YmxlICAgIHNjYWxibmwobG9uZyBkb3VibGUgeCwgaW50IGV4KTsKKworZmxvYXRpbmdfcG9pbnQgdGdhbW1hIChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgdGdhbW1hZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIHRnYW1tYWwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IHRydW5jIChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgdHJ1bmNmKGZsb2F0IHgpOworbG9uZyBkb3VibGUgICAgdHJ1bmNsKGxvbmcgZG91YmxlIHgpOworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCit1c2luZyA6OnNpZ25iaXQ7Cit1c2luZyA6OmZwY2xhc3NpZnk7Cit1c2luZyA6OmlzZmluaXRlOwordXNpbmcgOjppc2luZjsKK3VzaW5nIDo6aXNuYW47Cit1c2luZyA6Omlzbm9ybWFsOwordXNpbmcgOjppc2dyZWF0ZXI7Cit1c2luZyA6OmlzZ3JlYXRlcmVxdWFsOwordXNpbmcgOjppc2xlc3M7Cit1c2luZyA6OmlzbGVzc2VxdWFsOwordXNpbmcgOjppc2xlc3NncmVhdGVyOwordXNpbmcgOjppc3Vub3JkZXJlZDsKK3VzaW5nIDo6aXN1bm9yZGVyZWQ7CisKK3VzaW5nIDo6ZmxvYXRfdDsKK3VzaW5nIDo6ZG91YmxlX3Q7CisKKyNpZm5kZWYgX0FJWAordXNpbmcgOjphYnM7CisjZW5kaWYKKwordXNpbmcgOjphY29zOwordXNpbmcgOjphY29zZjsKK3VzaW5nIDo6YXNpbjsKK3VzaW5nIDo6YXNpbmY7Cit1c2luZyA6OmF0YW47Cit1c2luZyA6OmF0YW5mOwordXNpbmcgOjphdGFuMjsKK3VzaW5nIDo6YXRhbjJmOwordXNpbmcgOjpjZWlsOwordXNpbmcgOjpjZWlsZjsKK3VzaW5nIDo6Y29zOwordXNpbmcgOjpjb3NmOwordXNpbmcgOjpjb3NoOwordXNpbmcgOjpjb3NoZjsKKwordXNpbmcgOjpleHA7Cit1c2luZyA6OmV4cGY7CisKK3VzaW5nIDo6ZmFiczsKK3VzaW5nIDo6ZmFic2Y7Cit1c2luZyA6OmZsb29yOwordXNpbmcgOjpmbG9vcmY7CisKK3VzaW5nIDo6Zm1vZDsKK3VzaW5nIDo6Zm1vZGY7CisKK3VzaW5nIDo6ZnJleHA7Cit1c2luZyA6OmZyZXhwZjsKK3VzaW5nIDo6bGRleHA7Cit1c2luZyA6OmxkZXhwZjsKKwordXNpbmcgOjpsb2c7Cit1c2luZyA6OmxvZ2Y7CisKK3VzaW5nIDo6bG9nMTA7Cit1c2luZyA6OmxvZzEwZjsKK3VzaW5nIDo6bW9kZjsKK3VzaW5nIDo6bW9kZmY7CisKK3VzaW5nIDo6cG93OwordXNpbmcgOjpwb3dmOworCit1c2luZyA6OnNpbjsKK3VzaW5nIDo6c2luZjsKK3VzaW5nIDo6c2luaDsKK3VzaW5nIDo6c2luaGY7CisKK3VzaW5nIDo6c3FydDsKK3VzaW5nIDo6c3FydGY7Cit1c2luZyA6OnRhbjsKK3VzaW5nIDo6dGFuZjsKKwordXNpbmcgOjp0YW5oOwordXNpbmcgOjp0YW5oZjsKKwordXNpbmcgOjphY29zaDsKK3VzaW5nIDo6YWNvc2hmOwordXNpbmcgOjphc2luaDsKK3VzaW5nIDo6YXNpbmhmOwordXNpbmcgOjphdGFuaDsKK3VzaW5nIDo6YXRhbmhmOwordXNpbmcgOjpjYnJ0OwordXNpbmcgOjpjYnJ0ZjsKKwordXNpbmcgOjpjb3B5c2lnbjsKK3VzaW5nIDo6Y29weXNpZ25mOworCit1c2luZyA6OmVyZjsKK3VzaW5nIDo6ZXJmZjsKK3VzaW5nIDo6ZXJmYzsKK3VzaW5nIDo6ZXJmY2Y7Cit1c2luZyA6OmV4cDI7Cit1c2luZyA6OmV4cDJmOwordXNpbmcgOjpleHBtMTsKK3VzaW5nIDo6ZXhwbTFmOwordXNpbmcgOjpmZGltOwordXNpbmcgOjpmZGltZjsKK3VzaW5nIDo6Zm1hZjsKK3VzaW5nIDo6Zm1hOwordXNpbmcgOjpmbWF4OwordXNpbmcgOjpmbWF4ZjsKK3VzaW5nIDo6Zm1pbjsKK3VzaW5nIDo6Zm1pbmY7Cit1c2luZyA6Omh5cG90OwordXNpbmcgOjpoeXBvdGY7Cit1c2luZyA6Omlsb2diOwordXNpbmcgOjppbG9nYmY7Cit1c2luZyA6OmxnYW1tYTsKK3VzaW5nIDo6bGdhbW1hZjsKK3VzaW5nIDo6bGxyaW50OwordXNpbmcgOjpsbHJpbnRmOwordXNpbmcgOjpsbHJvdW5kOwordXNpbmcgOjpsbHJvdW5kZjsKK3VzaW5nIDo6bG9nMXA7Cit1c2luZyA6OmxvZzFwZjsKK3VzaW5nIDo6bG9nMjsKK3VzaW5nIDo6bG9nMmY7Cit1c2luZyA6OmxvZ2I7Cit1c2luZyA6OmxvZ2JmOwordXNpbmcgOjpscmludDsKK3VzaW5nIDo6bHJpbnRmOwordXNpbmcgOjpscm91bmQ7Cit1c2luZyA6Omxyb3VuZGY7CisKK3VzaW5nIDo6bmFuOwordXNpbmcgOjpuYW5mOworCit1c2luZyA6Om5lYXJieWludDsKK3VzaW5nIDo6bmVhcmJ5aW50ZjsKK3VzaW5nIDo6bmV4dGFmdGVyOwordXNpbmcgOjpuZXh0YWZ0ZXJmOwordXNpbmcgOjpuZXh0dG93YXJkOwordXNpbmcgOjpuZXh0dG93YXJkZjsKK3VzaW5nIDo6cmVtYWluZGVyOwordXNpbmcgOjpyZW1haW5kZXJmOwordXNpbmcgOjpyZW1xdW87Cit1c2luZyA6OnJlbXF1b2Y7Cit1c2luZyA6OnJpbnQ7Cit1c2luZyA6OnJpbnRmOwordXNpbmcgOjpyb3VuZDsKK3VzaW5nIDo6cm91bmRmOwordXNpbmcgOjpzY2FsYmxuOwordXNpbmcgOjpzY2FsYmxuZjsKK3VzaW5nIDo6c2NhbGJuOwordXNpbmcgOjpzY2FsYm5mOwordXNpbmcgOjp0Z2FtbWE7Cit1c2luZyA6OnRnYW1tYWY7Cit1c2luZyA6OnRydW5jOwordXNpbmcgOjp0cnVuY2Y7CisKK3VzaW5nIDo6YWNvc2w7Cit1c2luZyA6OmFzaW5sOwordXNpbmcgOjphdGFubDsKK3VzaW5nIDo6YXRhbjJsOwordXNpbmcgOjpjZWlsbDsKK3VzaW5nIDo6Y29zbDsKK3VzaW5nIDo6Y29zaGw7Cit1c2luZyA6OmV4cGw7Cit1c2luZyA6OmZhYnNsOwordXNpbmcgOjpmbG9vcmw7Cit1c2luZyA6OmZtb2RsOwordXNpbmcgOjpmcmV4cGw7Cit1c2luZyA6OmxkZXhwbDsKK3VzaW5nIDo6bG9nbDsKK3VzaW5nIDo6bG9nMTBsOwordXNpbmcgOjptb2RmbDsKK3VzaW5nIDo6cG93bDsKK3VzaW5nIDo6c2lubDsKK3VzaW5nIDo6c2luaGw7Cit1c2luZyA6OnNxcnRsOwordXNpbmcgOjp0YW5sOworCit1c2luZyA6OnRhbmhsOwordXNpbmcgOjphY29zaGw7Cit1c2luZyA6OmFzaW5obDsKK3VzaW5nIDo6YXRhbmhsOwordXNpbmcgOjpjYnJ0bDsKKwordXNpbmcgOjpjb3B5c2lnbmw7CisKK3VzaW5nIDo6ZXJmbDsKK3VzaW5nIDo6ZXJmY2w7Cit1c2luZyA6OmV4cDJsOwordXNpbmcgOjpleHBtMWw7Cit1c2luZyA6OmZkaW1sOwordXNpbmcgOjpmbWFsOwordXNpbmcgOjpmbWF4bDsKK3VzaW5nIDo6Zm1pbmw7Cit1c2luZyA6Omh5cG90bDsKK3VzaW5nIDo6aWxvZ2JsOwordXNpbmcgOjpsZ2FtbWFsOwordXNpbmcgOjpsbHJpbnRsOwordXNpbmcgOjpsbHJvdW5kbDsKK3VzaW5nIDo6bG9nMXBsOwordXNpbmcgOjpsb2cybDsKK3VzaW5nIDo6bG9nYmw7Cit1c2luZyA6OmxyaW50bDsKK3VzaW5nIDo6bHJvdW5kbDsKK3VzaW5nIDo6bmFubDsKK3VzaW5nIDo6bmVhcmJ5aW50bDsKK3VzaW5nIDo6bmV4dGFmdGVybDsKK3VzaW5nIDo6bmV4dHRvd2FyZGw7Cit1c2luZyA6OnJlbWFpbmRlcmw7Cit1c2luZyA6OnJlbXF1b2w7Cit1c2luZyA6OnJpbnRsOwordXNpbmcgOjpyb3VuZGw7Cit1c2luZyA6OnNjYWxibG5sOwordXNpbmcgOjpzY2FsYm5sOwordXNpbmcgOjp0Z2FtbWFsOwordXNpbmcgOjp0cnVuY2w7CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZmxvYXQgICAgICAgaHlwb3QoICAgICAgIGZsb2F0IHgsICAgICAgIGZsb2F0IHksICAgICAgIGZsb2F0IHogKSB7IHJldHVybiBzcXJ0KHgqeCArIHkqeSArIHoqeik7IH0KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGRvdWJsZSAgICAgIGh5cG90KCAgICAgIGRvdWJsZSB4LCAgICAgIGRvdWJsZSB5LCAgICAgIGRvdWJsZSB6ICkgeyByZXR1cm4gc3FydCh4KnggKyB5KnkgKyB6KnopOyB9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSBoeXBvdCggbG9uZyBkb3VibGUgeCwgbG9uZyBkb3VibGUgeSwgbG9uZyBkb3VibGUgeiApIHsgcmV0dXJuIHNxcnQoeCp4ICsgeSp5ICsgeip6KTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExLCBjbGFzcyBfQTIsIGNsYXNzIF9BMz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBfX2xhenlfZW5hYmxlX2lmCis8CisgICAgaXNfYXJpdGhtZXRpYzxfQTE+Ojp2YWx1ZSAmJgorICAgIGlzX2FyaXRobWV0aWM8X0EyPjo6dmFsdWUgJiYKKyAgICBpc19hcml0aG1ldGljPF9BMz46OnZhbHVlLAorICAgIF9fcHJvbW90ZTxfQTEsIF9BMiwgX0EzPgorPjo6dHlwZQoraHlwb3QoX0ExIF9fbGNwcF94LCBfQTIgX19sY3BwX3ksIF9BMyBfX2xjcHBfeikgX05PRVhDRVBUCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3Byb21vdGU8X0ExLCBfQTIsIF9BMz46OnR5cGUgX19yZXN1bHRfdHlwZTsKKyAgICBzdGF0aWNfYXNzZXJ0KCghKGlzX3NhbWU8X0ExLCBfX3Jlc3VsdF90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgIGlzX3NhbWU8X0EyLCBfX3Jlc3VsdF90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgIGlzX3NhbWU8X0EzLCBfX3Jlc3VsdF90eXBlPjo6dmFsdWUpKSwgIiIpOworICAgIHJldHVybiBoeXBvdCgoX19yZXN1bHRfdHlwZSlfX2xjcHBfeCwgKF9fcmVzdWx0X3R5cGUpX19sY3BwX3ksIChfX3Jlc3VsdF90eXBlKV9fbGNwcF96KTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgorX0xJQkNQUF9BTFdBWVNfSU5MSU5FCitfTElCQ1BQX0NPTlNURVhQUiB0eXBlbmFtZSBlbmFibGVfaWY8aXNfZmxvYXRpbmdfcG9pbnQ8X0ExPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCitfX2xpYmNwcF9pc25hbl9vcl9idWlsdGluKF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUCit7CisjaWYgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5faXNuYW4pCisgICAgcmV0dXJuIF9fYnVpbHRpbl9pc25hbihfX2xjcHBfeCk7CisjZWxzZQorICAgIHJldHVybiBpc25hbihfX2xjcHBfeCk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK19MSUJDUFBfQUxXQVlTX0lOTElORQorX0xJQkNQUF9DT05TVEVYUFIgdHlwZW5hbWUgZW5hYmxlX2lmPCFpc19mbG9hdGluZ19wb2ludDxfQTE+Ojp2YWx1ZSwgYm9vbD46OnR5cGUKK19fbGliY3BwX2lzbmFuX29yX2J1aWx0aW4oX0ExIF9fbGNwcF94KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gaXNuYW4oX19sY3BwX3gpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgorX0xJQkNQUF9BTFdBWVNfSU5MSU5FCitfTElCQ1BQX0NPTlNURVhQUiB0eXBlbmFtZSBlbmFibGVfaWY8aXNfZmxvYXRpbmdfcG9pbnQ8X0ExPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCitfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUCit7CisjaWYgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5faXNpbmYpCisgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2luZihfX2xjcHBfeCk7CisjZWxzZQorICAgIHJldHVybiBpc2luZihfX2xjcHBfeCk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK19MSUJDUFBfQUxXQVlTX0lOTElORQorX0xJQkNQUF9DT05TVEVYUFIgdHlwZW5hbWUgZW5hYmxlX2lmPCFpc19mbG9hdGluZ19wb2ludDxfQTE+Ojp2YWx1ZSwgYm9vbD46OnR5cGUKK19fbGliY3BwX2lzaW5mX29yX2J1aWx0aW4oX0ExIF9fbGNwcF94KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gaXNpbmYoX19sY3BwX3gpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgorX0xJQkNQUF9BTFdBWVNfSU5MSU5FCitfTElCQ1BQX0NPTlNURVhQUiB0eXBlbmFtZSBlbmFibGVfaWY8aXNfZmxvYXRpbmdfcG9pbnQ8X0ExPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCitfX2xpYmNwcF9pc2Zpbml0ZV9vcl9idWlsdGluKF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUCit7CisjaWYgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5faXNmaW5pdGUpCisgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2Zpbml0ZShfX2xjcHBfeCk7CisjZWxzZQorICAgIHJldHVybiBpc2Zpbml0ZShfX2xjcHBfeCk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK19MSUJDUFBfQUxXQVlTX0lOTElORQorX0xJQkNQUF9DT05TVEVYUFIgdHlwZW5hbWUgZW5hYmxlX2lmPCFpc19mbG9hdGluZ19wb2ludDxfQTE+Ojp2YWx1ZSwgYm9vbD46OnR5cGUKK19fbGliY3BwX2lzZmluaXRlX29yX2J1aWx0aW4oX0ExIF9fbGNwcF94KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gaXNmaW5pdGUoX19sY3BwX3gpOworfQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DTUFUSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NvZGVjdnQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY29kZWN2dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmY1NmFjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NvZGVjdnQKQEAgLTAsMCArMSw1NTAgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvZGVjdnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfQ09ERUNWVAorI2RlZmluZSBfTElCQ1BQX0NPREVDVlQKKworLyoKKyAgICBjb2RlY3Z0IHN5bm9wc2lzCisKK25hbWVzcGFjZSBzdGQKK3sKKworZW51bSBjb2RlY3Z0X21vZGUKK3sKKyAgICBjb25zdW1lX2hlYWRlciA9IDQsCisgICAgZ2VuZXJhdGVfaGVhZGVyID0gMiwKKyAgICBsaXR0bGVfZW5kaWFuID0gMQorfTsKKwordGVtcGxhdGUgPGNsYXNzIEVsZW0sIHVuc2lnbmVkIGxvbmcgTWF4Y29kZSA9IDB4MTBmZmZmLAorICAgICAgICAgIGNvZGVjdnRfbW9kZSBNb2RlID0gKGNvZGVjdnRfbW9kZSkwPgorY2xhc3MgY29kZWN2dF91dGY4CisgICAgOiBwdWJsaWMgY29kZWN2dDxFbGVtLCBjaGFyLCBtYnN0YXRlX3Q+Cit7CisgICAgZXhwbGljaXQgY29kZWN2dF91dGY4KHNpemVfdCByZWZzID0gMCk7CisgICAgfmNvZGVjdnRfdXRmOCgpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIEVsZW0sIHVuc2lnbmVkIGxvbmcgTWF4Y29kZSA9IDB4MTBmZmZmLAorICAgICAgICAgIGNvZGVjdnRfbW9kZSBNb2RlID0gKGNvZGVjdnRfbW9kZSkwPgorY2xhc3MgY29kZWN2dF91dGYxNgorICAgIDogcHVibGljIGNvZGVjdnQ8RWxlbSwgY2hhciwgbWJzdGF0ZV90PgoreworICAgIGV4cGxpY2l0IGNvZGVjdnRfdXRmMTYoc2l6ZV90IHJlZnMgPSAwKTsKKyAgICB+Y29kZWN2dF91dGYxNigpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIEVsZW0sIHVuc2lnbmVkIGxvbmcgTWF4Y29kZSA9IDB4MTBmZmZmLAorICAgICAgICAgIGNvZGVjdnRfbW9kZSBNb2RlID0gKGNvZGVjdnRfbW9kZSkwPgorY2xhc3MgY29kZWN2dF91dGY4X3V0ZjE2CisgICAgOiBwdWJsaWMgY29kZWN2dDxFbGVtLCBjaGFyLCBtYnN0YXRlX3Q+Cit7CisgICAgZXhwbGljaXQgY29kZWN2dF91dGY4X3V0ZjE2KHNpemVfdCByZWZzID0gMCk7CisgICAgfmNvZGVjdnRfdXRmOF91dGYxNigpOworfTsKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxfX2xvY2FsZT4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCitlbnVtIGNvZGVjdnRfbW9kZQoreworICAgIGNvbnN1bWVfaGVhZGVyID0gNCwKKyAgICBnZW5lcmF0ZV9oZWFkZXIgPSAyLAorICAgIGxpdHRsZV9lbmRpYW4gPSAxCit9OworCisvLyBjb2RlY3Z0X3V0ZjgKKwordGVtcGxhdGUgPGNsYXNzIF9FbGVtPiBjbGFzcyBfX2NvZGVjdnRfdXRmODsKKwordGVtcGxhdGUgPD4KK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgX19jb2RlY3Z0X3V0Zjg8d2NoYXJfdD4KKyAgICA6IHB1YmxpYyBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4KK3sKKyAgICB1bnNpZ25lZCBsb25nIF9NYXhjb2RlXzsKKyAgICBjb2RlY3Z0X21vZGUgX01vZGVfOworcHVibGljOgorICAgIHR5cGVkZWYgd2NoYXJfdCAgIGludGVybl90eXBlOworICAgIHR5cGVkZWYgY2hhciAgICAgIGV4dGVybl90eXBlOworICAgIHR5cGVkZWYgbWJzdGF0ZV90IHN0YXRlX3R5cGU7CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBleHBsaWNpdCBfX2NvZGVjdnRfdXRmOChzaXplX3QgX19yZWZzLCB1bnNpZ25lZCBsb25nIF9NYXhjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjdnRfbW9kZSBfTW9kZSkKKyAgICAgICAgOiBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4oX19yZWZzKSwgX01heGNvZGVfKF9NYXhjb2RlKSwKKyAgICAgICAgICBfTW9kZV8oX01vZGUpIHt9Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9fb3V0KHN0YXRlX3R5cGUmIF9fc3QsCisgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGludGVybl90eXBlKiBfX2ZybV9lbmQsIGNvbnN0IGludGVybl90eXBlKiYgX19mcm1fbnh0LAorICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9faW4oc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwgaW50ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9fdW5zaGlmdChzdGF0ZV90eXBlJiBfX3N0LAorICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX2VuY29kaW5nKCkgY29uc3QgdGhyb3coKTsKKyAgICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCk7CisgICAgdmlydHVhbCBpbnQgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbXgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpOworfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgX19jb2RlY3Z0X3V0Zjg8Y2hhcjE2X3Q+CisgICAgOiBwdWJsaWMgY29kZWN2dDxjaGFyMTZfdCwgY2hhciwgbWJzdGF0ZV90PgoreworICAgIHVuc2lnbmVkIGxvbmcgX01heGNvZGVfOworICAgIGNvZGVjdnRfbW9kZSBfTW9kZV87CitwdWJsaWM6CisgICAgdHlwZWRlZiBjaGFyMTZfdCAgaW50ZXJuX3R5cGU7CisgICAgdHlwZWRlZiBjaGFyICAgICAgZXh0ZXJuX3R5cGU7CisgICAgdHlwZWRlZiBtYnN0YXRlX3Qgc3RhdGVfdHlwZTsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGV4cGxpY2l0IF9fY29kZWN2dF91dGY4KHNpemVfdCBfX3JlZnMsIHVuc2lnbmVkIGxvbmcgX01heGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWN2dF9tb2RlIF9Nb2RlKQorICAgICAgICA6IGNvZGVjdnQ8Y2hhcjE2X3QsIGNoYXIsIG1ic3RhdGVfdD4oX19yZWZzKSwgX01heGNvZGVfKF9NYXhjb2RlKSwKKyAgICAgICAgICBfTW9kZV8oX01vZGUpIHt9Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9fb3V0KHN0YXRlX3R5cGUmIF9fc3QsCisgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGludGVybl90eXBlKiBfX2ZybV9lbmQsIGNvbnN0IGludGVybl90eXBlKiYgX19mcm1fbnh0LAorICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9faW4oc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwgaW50ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9fdW5zaGlmdChzdGF0ZV90eXBlJiBfX3N0LAorICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX2VuY29kaW5nKCkgY29uc3QgdGhyb3coKTsKKyAgICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCk7CisgICAgdmlydHVhbCBpbnQgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbXgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpOworfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgX19jb2RlY3Z0X3V0Zjg8Y2hhcjMyX3Q+CisgICAgOiBwdWJsaWMgY29kZWN2dDxjaGFyMzJfdCwgY2hhciwgbWJzdGF0ZV90PgoreworICAgIHVuc2lnbmVkIGxvbmcgX01heGNvZGVfOworICAgIGNvZGVjdnRfbW9kZSBfTW9kZV87CitwdWJsaWM6CisgICAgdHlwZWRlZiBjaGFyMzJfdCAgaW50ZXJuX3R5cGU7CisgICAgdHlwZWRlZiBjaGFyICAgICAgZXh0ZXJuX3R5cGU7CisgICAgdHlwZWRlZiBtYnN0YXRlX3Qgc3RhdGVfdHlwZTsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGV4cGxpY2l0IF9fY29kZWN2dF91dGY4KHNpemVfdCBfX3JlZnMsIHVuc2lnbmVkIGxvbmcgX01heGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWN2dF9tb2RlIF9Nb2RlKQorICAgICAgICA6IGNvZGVjdnQ8Y2hhcjMyX3QsIGNoYXIsIG1ic3RhdGVfdD4oX19yZWZzKSwgX01heGNvZGVfKF9NYXhjb2RlKSwKKyAgICAgICAgICBfTW9kZV8oX01vZGUpIHt9Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9fb3V0KHN0YXRlX3R5cGUmIF9fc3QsCisgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGludGVybl90eXBlKiBfX2ZybV9lbmQsIGNvbnN0IGludGVybl90eXBlKiYgX19mcm1fbnh0LAorICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9faW4oc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwgaW50ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9fdW5zaGlmdChzdGF0ZV90eXBlJiBfX3N0LAorICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX2VuY29kaW5nKCkgY29uc3QgdGhyb3coKTsKKyAgICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCk7CisgICAgdmlydHVhbCBpbnQgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbXgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9FbGVtLCB1bnNpZ25lZCBsb25nIF9NYXhjb2RlID0gMHgxMGZmZmYsCisgICAgICAgICAgY29kZWN2dF9tb2RlIF9Nb2RlID0gKGNvZGVjdnRfbW9kZSkwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgY29kZWN2dF91dGY4CisgICAgOiBwdWJsaWMgX19jb2RlY3Z0X3V0Zjg8X0VsZW0+Cit7CitwdWJsaWM6CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgZXhwbGljaXQgY29kZWN2dF91dGY4KHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgICA6IF9fY29kZWN2dF91dGY4PF9FbGVtPihfX3JlZnMsIF9NYXhjb2RlLCBfTW9kZSkge30KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIH5jb2RlY3Z0X3V0ZjgoKSB7fQorfTsKKworLy8gY29kZWN2dF91dGYxNgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0VsZW0sIGJvb2wgX0xpdHRsZUVuZGlhbj4gY2xhc3MgX19jb2RlY3Z0X3V0ZjE2OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBfX2NvZGVjdnRfdXRmMTY8d2NoYXJfdCwgZmFsc2U+CisgICAgOiBwdWJsaWMgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+Cit7CisgICAgdW5zaWduZWQgbG9uZyBfTWF4Y29kZV87CisgICAgY29kZWN2dF9tb2RlIF9Nb2RlXzsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHdjaGFyX3QgICBpbnRlcm5fdHlwZTsKKyAgICB0eXBlZGVmIGNoYXIgICAgICBleHRlcm5fdHlwZTsKKyAgICB0eXBlZGVmIG1ic3RhdGVfdCBzdGF0ZV90eXBlOworCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgZXhwbGljaXQgX19jb2RlY3Z0X3V0ZjE2KHNpemVfdCBfX3JlZnMsIHVuc2lnbmVkIGxvbmcgX01heGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWN2dF9tb2RlIF9Nb2RlKQorICAgICAgICA6IGNvZGVjdnQ8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PihfX3JlZnMpLCBfTWF4Y29kZV8oX01heGNvZGUpLAorICAgICAgICAgIF9Nb2RlXyhfTW9kZSkge30KK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgICBkb19vdXQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgIGNvbnN0IGludGVybl90eXBlKiBfX2ZybSwgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJtX2VuZCwgY29uc3QgaW50ZXJuX3R5cGUqJiBfX2ZybV9ueHQsCisgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLCBleHRlcm5fdHlwZSomIF9fdG9fbnh0KSBjb25zdDsKKyAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgICBkb19pbihzdGF0ZV90eXBlJiBfX3N0LAorICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2ZybV9lbmQsIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm1fbnh0LAorICAgICAgICAgICAgICBpbnRlcm5fdHlwZSogX190bywgaW50ZXJuX3R5cGUqIF9fdG9fZW5kLCBpbnRlcm5fdHlwZSomIF9fdG9fbnh0KSBjb25zdDsKKyAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgICBkb191bnNoaWZ0KHN0YXRlX3R5cGUmIF9fc3QsCisgICAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgZG9fZW5jb2RpbmcoKSBjb25zdCB0aHJvdygpOworICAgIHZpcnR1YWwgYm9vbCBkb19hbHdheXNfbm9jb252KCkgY29uc3QgdGhyb3coKTsKKyAgICB2aXJ0dWFsIGludCBkb19sZW5ndGgoc3RhdGVfdHlwZSYsIGNvbnN0IGV4dGVybl90eXBlKiBfX2ZybSwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19teCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgZG9fbWF4X2xlbmd0aCgpIGNvbnN0IHRocm93KCk7Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBfX2NvZGVjdnRfdXRmMTY8d2NoYXJfdCwgdHJ1ZT4KKyAgICA6IHB1YmxpYyBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4KK3sKKyAgICB1bnNpZ25lZCBsb25nIF9NYXhjb2RlXzsKKyAgICBjb2RlY3Z0X21vZGUgX01vZGVfOworcHVibGljOgorICAgIHR5cGVkZWYgd2NoYXJfdCAgIGludGVybl90eXBlOworICAgIHR5cGVkZWYgY2hhciAgICAgIGV4dGVybl90eXBlOworICAgIHR5cGVkZWYgbWJzdGF0ZV90IHN0YXRlX3R5cGU7CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBleHBsaWNpdCBfX2NvZGVjdnRfdXRmMTYoc2l6ZV90IF9fcmVmcywgdW5zaWduZWQgbG9uZyBfTWF4Y29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3Z0X21vZGUgX01vZGUpCisgICAgICAgIDogY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+KF9fcmVmcyksIF9NYXhjb2RlXyhfTWF4Y29kZSksCisgICAgICAgICAgX01vZGVfKF9Nb2RlKSB7fQorcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICAgIGRvX291dChzdGF0ZV90eXBlJiBfX3N0LAorICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBpbnRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBpbnRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICAgIGRvX2luKHN0YXRlX3R5cGUmIF9fc3QsCisgICAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2ZybSwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJtX2VuZCwgY29uc3QgZXh0ZXJuX3R5cGUqJiBfX2ZybV9ueHQsCisgICAgICAgICAgICAgIGludGVybl90eXBlKiBfX3RvLCBpbnRlcm5fdHlwZSogX190b19lbmQsIGludGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICAgIGRvX3Vuc2hpZnQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLCBleHRlcm5fdHlwZSomIF9fdG9fbnh0KSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBkb19lbmNvZGluZygpIGNvbnN0IHRocm93KCk7CisgICAgdmlydHVhbCBib29sIGRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCB0aHJvdygpOworICAgIHZpcnR1YWwgaW50IGRvX2xlbmd0aChzdGF0ZV90eXBlJiwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBleHRlcm5fdHlwZSogX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX214KSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBkb19tYXhfbGVuZ3RoKCkgY29uc3QgdGhyb3coKTsKK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIF9fY29kZWN2dF91dGYxNjxjaGFyMTZfdCwgZmFsc2U+CisgICAgOiBwdWJsaWMgY29kZWN2dDxjaGFyMTZfdCwgY2hhciwgbWJzdGF0ZV90PgoreworICAgIHVuc2lnbmVkIGxvbmcgX01heGNvZGVfOworICAgIGNvZGVjdnRfbW9kZSBfTW9kZV87CitwdWJsaWM6CisgICAgdHlwZWRlZiBjaGFyMTZfdCAgaW50ZXJuX3R5cGU7CisgICAgdHlwZWRlZiBjaGFyICAgICAgZXh0ZXJuX3R5cGU7CisgICAgdHlwZWRlZiBtYnN0YXRlX3Qgc3RhdGVfdHlwZTsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGV4cGxpY2l0IF9fY29kZWN2dF91dGYxNihzaXplX3QgX19yZWZzLCB1bnNpZ25lZCBsb25nIF9NYXhjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjdnRfbW9kZSBfTW9kZSkKKyAgICAgICAgOiBjb2RlY3Z0PGNoYXIxNl90LCBjaGFyLCBtYnN0YXRlX3Q+KF9fcmVmcyksIF9NYXhjb2RlXyhfTWF4Y29kZSksCisgICAgICAgICAgX01vZGVfKF9Nb2RlKSB7fQorcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICAgIGRvX291dChzdGF0ZV90eXBlJiBfX3N0LAorICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBpbnRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBpbnRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICAgIGRvX2luKHN0YXRlX3R5cGUmIF9fc3QsCisgICAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2ZybSwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJtX2VuZCwgY29uc3QgZXh0ZXJuX3R5cGUqJiBfX2ZybV9ueHQsCisgICAgICAgICAgICAgIGludGVybl90eXBlKiBfX3RvLCBpbnRlcm5fdHlwZSogX190b19lbmQsIGludGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICAgIGRvX3Vuc2hpZnQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLCBleHRlcm5fdHlwZSomIF9fdG9fbnh0KSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBkb19lbmNvZGluZygpIGNvbnN0IHRocm93KCk7CisgICAgdmlydHVhbCBib29sIGRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCB0aHJvdygpOworICAgIHZpcnR1YWwgaW50IGRvX2xlbmd0aChzdGF0ZV90eXBlJiwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBleHRlcm5fdHlwZSogX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX214KSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBkb19tYXhfbGVuZ3RoKCkgY29uc3QgdGhyb3coKTsKK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIF9fY29kZWN2dF91dGYxNjxjaGFyMTZfdCwgdHJ1ZT4KKyAgICA6IHB1YmxpYyBjb2RlY3Z0PGNoYXIxNl90LCBjaGFyLCBtYnN0YXRlX3Q+Cit7CisgICAgdW5zaWduZWQgbG9uZyBfTWF4Y29kZV87CisgICAgY29kZWN2dF9tb2RlIF9Nb2RlXzsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGNoYXIxNl90ICBpbnRlcm5fdHlwZTsKKyAgICB0eXBlZGVmIGNoYXIgICAgICBleHRlcm5fdHlwZTsKKyAgICB0eXBlZGVmIG1ic3RhdGVfdCBzdGF0ZV90eXBlOworCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgZXhwbGljaXQgX19jb2RlY3Z0X3V0ZjE2KHNpemVfdCBfX3JlZnMsIHVuc2lnbmVkIGxvbmcgX01heGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWN2dF9tb2RlIF9Nb2RlKQorICAgICAgICA6IGNvZGVjdnQ8Y2hhcjE2X3QsIGNoYXIsIG1ic3RhdGVfdD4oX19yZWZzKSwgX01heGNvZGVfKF9NYXhjb2RlKSwKKyAgICAgICAgICBfTW9kZV8oX01vZGUpIHt9Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9fb3V0KHN0YXRlX3R5cGUmIF9fc3QsCisgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGludGVybl90eXBlKiBfX2ZybV9lbmQsIGNvbnN0IGludGVybl90eXBlKiYgX19mcm1fbnh0LAorICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9faW4oc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwgaW50ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9fdW5zaGlmdChzdGF0ZV90eXBlJiBfX3N0LAorICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX2VuY29kaW5nKCkgY29uc3QgdGhyb3coKTsKKyAgICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCk7CisgICAgdmlydHVhbCBpbnQgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbXgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpOworfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgX19jb2RlY3Z0X3V0ZjE2PGNoYXIzMl90LCBmYWxzZT4KKyAgICA6IHB1YmxpYyBjb2RlY3Z0PGNoYXIzMl90LCBjaGFyLCBtYnN0YXRlX3Q+Cit7CisgICAgdW5zaWduZWQgbG9uZyBfTWF4Y29kZV87CisgICAgY29kZWN2dF9tb2RlIF9Nb2RlXzsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGNoYXIzMl90ICBpbnRlcm5fdHlwZTsKKyAgICB0eXBlZGVmIGNoYXIgICAgICBleHRlcm5fdHlwZTsKKyAgICB0eXBlZGVmIG1ic3RhdGVfdCBzdGF0ZV90eXBlOworCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgZXhwbGljaXQgX19jb2RlY3Z0X3V0ZjE2KHNpemVfdCBfX3JlZnMsIHVuc2lnbmVkIGxvbmcgX01heGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWN2dF9tb2RlIF9Nb2RlKQorICAgICAgICA6IGNvZGVjdnQ8Y2hhcjMyX3QsIGNoYXIsIG1ic3RhdGVfdD4oX19yZWZzKSwgX01heGNvZGVfKF9NYXhjb2RlKSwKKyAgICAgICAgICBfTW9kZV8oX01vZGUpIHt9Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9fb3V0KHN0YXRlX3R5cGUmIF9fc3QsCisgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGludGVybl90eXBlKiBfX2ZybV9lbmQsIGNvbnN0IGludGVybl90eXBlKiYgX19mcm1fbnh0LAorICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9faW4oc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwgaW50ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9fdW5zaGlmdChzdGF0ZV90eXBlJiBfX3N0LAorICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX2VuY29kaW5nKCkgY29uc3QgdGhyb3coKTsKKyAgICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCk7CisgICAgdmlydHVhbCBpbnQgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbXgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpOworfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgX19jb2RlY3Z0X3V0ZjE2PGNoYXIzMl90LCB0cnVlPgorICAgIDogcHVibGljIGNvZGVjdnQ8Y2hhcjMyX3QsIGNoYXIsIG1ic3RhdGVfdD4KK3sKKyAgICB1bnNpZ25lZCBsb25nIF9NYXhjb2RlXzsKKyAgICBjb2RlY3Z0X21vZGUgX01vZGVfOworcHVibGljOgorICAgIHR5cGVkZWYgY2hhcjMyX3QgIGludGVybl90eXBlOworICAgIHR5cGVkZWYgY2hhciAgICAgIGV4dGVybl90eXBlOworICAgIHR5cGVkZWYgbWJzdGF0ZV90IHN0YXRlX3R5cGU7CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBleHBsaWNpdCBfX2NvZGVjdnRfdXRmMTYoc2l6ZV90IF9fcmVmcywgdW5zaWduZWQgbG9uZyBfTWF4Y29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3Z0X21vZGUgX01vZGUpCisgICAgICAgIDogY29kZWN2dDxjaGFyMzJfdCwgY2hhciwgbWJzdGF0ZV90PihfX3JlZnMpLCBfTWF4Y29kZV8oX01heGNvZGUpLAorICAgICAgICAgIF9Nb2RlXyhfTW9kZSkge30KK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgICBkb19vdXQoc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgIGNvbnN0IGludGVybl90eXBlKiBfX2ZybSwgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJtX2VuZCwgY29uc3QgaW50ZXJuX3R5cGUqJiBfX2ZybV9ueHQsCisgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLCBleHRlcm5fdHlwZSomIF9fdG9fbnh0KSBjb25zdDsKKyAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgICBkb19pbihzdGF0ZV90eXBlJiBfX3N0LAorICAgICAgICAgICAgICBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2ZybV9lbmQsIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm1fbnh0LAorICAgICAgICAgICAgICBpbnRlcm5fdHlwZSogX190bywgaW50ZXJuX3R5cGUqIF9fdG9fZW5kLCBpbnRlcm5fdHlwZSomIF9fdG9fbnh0KSBjb25zdDsKKyAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgICBkb191bnNoaWZ0KHN0YXRlX3R5cGUmIF9fc3QsCisgICAgICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgZG9fZW5jb2RpbmcoKSBjb25zdCB0aHJvdygpOworICAgIHZpcnR1YWwgYm9vbCBkb19hbHdheXNfbm9jb252KCkgY29uc3QgdGhyb3coKTsKKyAgICB2aXJ0dWFsIGludCBkb19sZW5ndGgoc3RhdGVfdHlwZSYsIGNvbnN0IGV4dGVybl90eXBlKiBfX2ZybSwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19teCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgZG9fbWF4X2xlbmd0aCgpIGNvbnN0IHRocm93KCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0VsZW0sIHVuc2lnbmVkIGxvbmcgX01heGNvZGUgPSAweDEwZmZmZiwKKyAgICAgICAgICBjb2RlY3Z0X21vZGUgX01vZGUgPSAoY29kZWN2dF9tb2RlKTA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBjb2RlY3Z0X3V0ZjE2CisgICAgOiBwdWJsaWMgX19jb2RlY3Z0X3V0ZjE2PF9FbGVtLCBfTW9kZSAmIGxpdHRsZV9lbmRpYW4+Cit7CitwdWJsaWM6CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgZXhwbGljaXQgY29kZWN2dF91dGYxNihzaXplX3QgX19yZWZzID0gMCkKKyAgICAgICAgOiBfX2NvZGVjdnRfdXRmMTY8X0VsZW0sIF9Nb2RlICYgbGl0dGxlX2VuZGlhbj4oX19yZWZzLCBfTWF4Y29kZSwgX01vZGUpIHt9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICB+Y29kZWN2dF91dGYxNigpIHt9Cit9OworCisvLyBjb2RlY3Z0X3V0ZjhfdXRmMTYKKwordGVtcGxhdGUgPGNsYXNzIF9FbGVtPiBjbGFzcyBfX2NvZGVjdnRfdXRmOF91dGYxNjsKKwordGVtcGxhdGUgPD4KK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgX19jb2RlY3Z0X3V0ZjhfdXRmMTY8d2NoYXJfdD4KKyAgICA6IHB1YmxpYyBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4KK3sKKyAgICB1bnNpZ25lZCBsb25nIF9NYXhjb2RlXzsKKyAgICBjb2RlY3Z0X21vZGUgX01vZGVfOworcHVibGljOgorICAgIHR5cGVkZWYgd2NoYXJfdCAgIGludGVybl90eXBlOworICAgIHR5cGVkZWYgY2hhciAgICAgIGV4dGVybl90eXBlOworICAgIHR5cGVkZWYgbWJzdGF0ZV90IHN0YXRlX3R5cGU7CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBleHBsaWNpdCBfX2NvZGVjdnRfdXRmOF91dGYxNihzaXplX3QgX19yZWZzLCB1bnNpZ25lZCBsb25nIF9NYXhjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjdnRfbW9kZSBfTW9kZSkKKyAgICAgICAgOiBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4oX19yZWZzKSwgX01heGNvZGVfKF9NYXhjb2RlKSwKKyAgICAgICAgICBfTW9kZV8oX01vZGUpIHt9Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9fb3V0KHN0YXRlX3R5cGUmIF9fc3QsCisgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGludGVybl90eXBlKiBfX2ZybV9lbmQsIGNvbnN0IGludGVybl90eXBlKiYgX19mcm1fbnh0LAorICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9faW4oc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwgaW50ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9fdW5zaGlmdChzdGF0ZV90eXBlJiBfX3N0LAorICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX2VuY29kaW5nKCkgY29uc3QgdGhyb3coKTsKKyAgICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCk7CisgICAgdmlydHVhbCBpbnQgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbXgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpOworfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgX19jb2RlY3Z0X3V0ZjhfdXRmMTY8Y2hhcjMyX3Q+CisgICAgOiBwdWJsaWMgY29kZWN2dDxjaGFyMzJfdCwgY2hhciwgbWJzdGF0ZV90PgoreworICAgIHVuc2lnbmVkIGxvbmcgX01heGNvZGVfOworICAgIGNvZGVjdnRfbW9kZSBfTW9kZV87CitwdWJsaWM6CisgICAgdHlwZWRlZiBjaGFyMzJfdCAgaW50ZXJuX3R5cGU7CisgICAgdHlwZWRlZiBjaGFyICAgICAgZXh0ZXJuX3R5cGU7CisgICAgdHlwZWRlZiBtYnN0YXRlX3Qgc3RhdGVfdHlwZTsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGV4cGxpY2l0IF9fY29kZWN2dF91dGY4X3V0ZjE2KHNpemVfdCBfX3JlZnMsIHVuc2lnbmVkIGxvbmcgX01heGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWN2dF9tb2RlIF9Nb2RlKQorICAgICAgICA6IGNvZGVjdnQ8Y2hhcjMyX3QsIGNoYXIsIG1ic3RhdGVfdD4oX19yZWZzKSwgX01heGNvZGVfKF9NYXhjb2RlKSwKKyAgICAgICAgICBfTW9kZV8oX01vZGUpIHt9Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9fb3V0KHN0YXRlX3R5cGUmIF9fc3QsCisgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGludGVybl90eXBlKiBfX2ZybV9lbmQsIGNvbnN0IGludGVybl90eXBlKiYgX19mcm1fbnh0LAorICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9faW4oc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwgaW50ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9fdW5zaGlmdChzdGF0ZV90eXBlJiBfX3N0LAorICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX2VuY29kaW5nKCkgY29uc3QgdGhyb3coKTsKKyAgICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCk7CisgICAgdmlydHVhbCBpbnQgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbXgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpOworfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgX19jb2RlY3Z0X3V0ZjhfdXRmMTY8Y2hhcjE2X3Q+CisgICAgOiBwdWJsaWMgY29kZWN2dDxjaGFyMTZfdCwgY2hhciwgbWJzdGF0ZV90PgoreworICAgIHVuc2lnbmVkIGxvbmcgX01heGNvZGVfOworICAgIGNvZGVjdnRfbW9kZSBfTW9kZV87CitwdWJsaWM6CisgICAgdHlwZWRlZiBjaGFyMTZfdCAgaW50ZXJuX3R5cGU7CisgICAgdHlwZWRlZiBjaGFyICAgICAgZXh0ZXJuX3R5cGU7CisgICAgdHlwZWRlZiBtYnN0YXRlX3Qgc3RhdGVfdHlwZTsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGV4cGxpY2l0IF9fY29kZWN2dF91dGY4X3V0ZjE2KHNpemVfdCBfX3JlZnMsIHVuc2lnbmVkIGxvbmcgX01heGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWN2dF9tb2RlIF9Nb2RlKQorICAgICAgICA6IGNvZGVjdnQ8Y2hhcjE2X3QsIGNoYXIsIG1ic3RhdGVfdD4oX19yZWZzKSwgX01heGNvZGVfKF9NYXhjb2RlKSwKKyAgICAgICAgICBfTW9kZV8oX01vZGUpIHt9Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9fb3V0KHN0YXRlX3R5cGUmIF9fc3QsCisgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGludGVybl90eXBlKiBfX2ZybV9lbmQsIGNvbnN0IGludGVybl90eXBlKiYgX19mcm1fbnh0LAorICAgICAgICAgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9faW4oc3RhdGVfdHlwZSYgX19zdCwKKyAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJtLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm1fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJtX254dCwKKyAgICAgICAgICAgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwgaW50ZXJuX3R5cGUqJiBfX3RvX254dCkgY29uc3Q7CisgICAgdmlydHVhbCByZXN1bHQKKyAgICAgICAgZG9fdW5zaGlmdChzdGF0ZV90eXBlJiBfX3N0LAorICAgICAgICAgICAgICAgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19ueHQpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX2VuY29kaW5nKCkgY29uc3QgdGhyb3coKTsKKyAgICB2aXJ0dWFsIGJvb2wgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCk7CisgICAgdmlydHVhbCBpbnQgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm0sIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbXgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9FbGVtLCB1bnNpZ25lZCBsb25nIF9NYXhjb2RlID0gMHgxMGZmZmYsCisgICAgICAgICAgY29kZWN2dF9tb2RlIF9Nb2RlID0gKGNvZGVjdnRfbW9kZSkwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgY29kZWN2dF91dGY4X3V0ZjE2CisgICAgOiBwdWJsaWMgX19jb2RlY3Z0X3V0ZjhfdXRmMTY8X0VsZW0+Cit7CitwdWJsaWM6CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgZXhwbGljaXQgY29kZWN2dF91dGY4X3V0ZjE2KHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgICA6IF9fY29kZWN2dF91dGY4X3V0ZjE2PF9FbGVtPihfX3JlZnMsIF9NYXhjb2RlLCBfTW9kZSkge30KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIH5jb2RlY3Z0X3V0ZjhfdXRmMTYoKSB7fQorfTsKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ09ERUNWVApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NvbXBsZXggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY29tcGxleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjkyZWUzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NvbXBsZXgKQEAgLTAsMCArMSwxNDk1IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29tcGxleCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0NPTVBMRVgKKyNkZWZpbmUgX0xJQkNQUF9DT01QTEVYCisKKy8qCisgICAgY29tcGxleCBzeW5vcHNpcworCituYW1lc3BhY2Ugc3RkCit7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjbGFzcyBjb21wbGV4Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CisKKyAgICBjb21wbGV4KGNvbnN0IFQmIHJlID0gVCgpLCBjb25zdCBUJiBpbSA9IFQoKSk7IC8vIGNvbnN0ZXhwciBpbiBDKysxNAorICAgIGNvbXBsZXgoY29uc3QgY29tcGxleCYpOyAgLy8gY29uc3RleHByIGluIEMrKzE0CisgICAgdGVtcGxhdGU8Y2xhc3MgWD4gY29tcGxleChjb25zdCBjb21wbGV4PFg+Jik7ICAvLyBjb25zdGV4cHIgaW4gQysrMTQKKworICAgIFQgcmVhbCgpIGNvbnN0OyAvLyBjb25zdGV4cHIgaW4gQysrMTQKKyAgICBUIGltYWcoKSBjb25zdDsgLy8gY29uc3RleHByIGluIEMrKzE0CisKKyAgICB2b2lkIHJlYWwoVCk7CisgICAgdm9pZCBpbWFnKFQpOworCisgICAgY29tcGxleDxUPiYgb3BlcmF0b3I9IChjb25zdCBUJik7CisgICAgY29tcGxleDxUPiYgb3BlcmF0b3IrPShjb25zdCBUJik7CisgICAgY29tcGxleDxUPiYgb3BlcmF0b3ItPShjb25zdCBUJik7CisgICAgY29tcGxleDxUPiYgb3BlcmF0b3IqPShjb25zdCBUJik7CisgICAgY29tcGxleDxUPiYgb3BlcmF0b3IvPShjb25zdCBUJik7CisKKyAgICBjb21wbGV4JiBvcGVyYXRvcj0oY29uc3QgY29tcGxleCYpOworICAgIHRlbXBsYXRlPGNsYXNzIFg+IGNvbXBsZXg8VD4mIG9wZXJhdG9yPSAoY29uc3QgY29tcGxleDxYPiYpOworICAgIHRlbXBsYXRlPGNsYXNzIFg+IGNvbXBsZXg8VD4mIG9wZXJhdG9yKz0oY29uc3QgY29tcGxleDxYPiYpOworICAgIHRlbXBsYXRlPGNsYXNzIFg+IGNvbXBsZXg8VD4mIG9wZXJhdG9yLT0oY29uc3QgY29tcGxleDxYPiYpOworICAgIHRlbXBsYXRlPGNsYXNzIFg+IGNvbXBsZXg8VD4mIG9wZXJhdG9yKj0oY29uc3QgY29tcGxleDxYPiYpOworICAgIHRlbXBsYXRlPGNsYXNzIFg+IGNvbXBsZXg8VD4mIG9wZXJhdG9yLz0oY29uc3QgY29tcGxleDxYPiYpOworfTsKKwordGVtcGxhdGU8PgorY2xhc3MgY29tcGxleDxmbG9hdD4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGZsb2F0IHZhbHVlX3R5cGU7CisKKyAgICBjb25zdGV4cHIgY29tcGxleChmbG9hdCByZSA9IDAuMGYsIGZsb2F0IGltID0gMC4wZik7CisgICAgZXhwbGljaXQgY29uc3RleHByIGNvbXBsZXgoY29uc3QgY29tcGxleDxkb3VibGU+Jik7CisgICAgZXhwbGljaXQgY29uc3RleHByIGNvbXBsZXgoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKKworICAgIGNvbnN0ZXhwciBmbG9hdCByZWFsKCkgY29uc3Q7CisgICAgdm9pZCByZWFsKGZsb2F0KTsKKyAgICBjb25zdGV4cHIgZmxvYXQgaW1hZygpIGNvbnN0OworICAgIHZvaWQgaW1hZyhmbG9hdCk7CisKKyAgICBjb21wbGV4PGZsb2F0PiYgb3BlcmF0b3I9IChmbG9hdCk7CisgICAgY29tcGxleDxmbG9hdD4mIG9wZXJhdG9yKz0oZmxvYXQpOworICAgIGNvbXBsZXg8ZmxvYXQ+JiBvcGVyYXRvci09KGZsb2F0KTsKKyAgICBjb21wbGV4PGZsb2F0PiYgb3BlcmF0b3IqPShmbG9hdCk7CisgICAgY29tcGxleDxmbG9hdD4mIG9wZXJhdG9yLz0oZmxvYXQpOworCisgICAgY29tcGxleDxmbG9hdD4mIG9wZXJhdG9yPShjb25zdCBjb21wbGV4PGZsb2F0PiYpOworICAgIHRlbXBsYXRlPGNsYXNzIFg+IGNvbXBsZXg8ZmxvYXQ+JiBvcGVyYXRvcj0gKGNvbnN0IGNvbXBsZXg8WD4mKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBYPiBjb21wbGV4PGZsb2F0PiYgb3BlcmF0b3IrPShjb25zdCBjb21wbGV4PFg+Jik7CisgICAgdGVtcGxhdGU8Y2xhc3MgWD4gY29tcGxleDxmbG9hdD4mIG9wZXJhdG9yLT0oY29uc3QgY29tcGxleDxYPiYpOworICAgIHRlbXBsYXRlPGNsYXNzIFg+IGNvbXBsZXg8ZmxvYXQ+JiBvcGVyYXRvcio9KGNvbnN0IGNvbXBsZXg8WD4mKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBYPiBjb21wbGV4PGZsb2F0PiYgb3BlcmF0b3IvPShjb25zdCBjb21wbGV4PFg+Jik7Cit9OworCit0ZW1wbGF0ZTw+CitjbGFzcyBjb21wbGV4PGRvdWJsZT4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGRvdWJsZSB2YWx1ZV90eXBlOworCisgICAgY29uc3RleHByIGNvbXBsZXgoZG91YmxlIHJlID0gMC4wLCBkb3VibGUgaW0gPSAwLjApOworICAgIGNvbnN0ZXhwciBjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZmxvYXQ+Jik7CisgICAgZXhwbGljaXQgY29uc3RleHByIGNvbXBsZXgoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKKworICAgIGNvbnN0ZXhwciBkb3VibGUgcmVhbCgpIGNvbnN0OworICAgIHZvaWQgcmVhbChkb3VibGUpOworICAgIGNvbnN0ZXhwciBkb3VibGUgaW1hZygpIGNvbnN0OworICAgIHZvaWQgaW1hZyhkb3VibGUpOworCisgICAgY29tcGxleDxkb3VibGU+JiBvcGVyYXRvcj0gKGRvdWJsZSk7CisgICAgY29tcGxleDxkb3VibGU+JiBvcGVyYXRvcis9KGRvdWJsZSk7CisgICAgY29tcGxleDxkb3VibGU+JiBvcGVyYXRvci09KGRvdWJsZSk7CisgICAgY29tcGxleDxkb3VibGU+JiBvcGVyYXRvcio9KGRvdWJsZSk7CisgICAgY29tcGxleDxkb3VibGU+JiBvcGVyYXRvci89KGRvdWJsZSk7CisgICAgY29tcGxleDxkb3VibGU+JiBvcGVyYXRvcj0oY29uc3QgY29tcGxleDxkb3VibGU+Jik7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBYPiBjb21wbGV4PGRvdWJsZT4mIG9wZXJhdG9yPSAoY29uc3QgY29tcGxleDxYPiYpOworICAgIHRlbXBsYXRlPGNsYXNzIFg+IGNvbXBsZXg8ZG91YmxlPiYgb3BlcmF0b3IrPShjb25zdCBjb21wbGV4PFg+Jik7CisgICAgdGVtcGxhdGU8Y2xhc3MgWD4gY29tcGxleDxkb3VibGU+JiBvcGVyYXRvci09KGNvbnN0IGNvbXBsZXg8WD4mKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBYPiBjb21wbGV4PGRvdWJsZT4mIG9wZXJhdG9yKj0oY29uc3QgY29tcGxleDxYPiYpOworICAgIHRlbXBsYXRlPGNsYXNzIFg+IGNvbXBsZXg8ZG91YmxlPiYgb3BlcmF0b3IvPShjb25zdCBjb21wbGV4PFg+Jik7Cit9OworCit0ZW1wbGF0ZTw+CitjbGFzcyBjb21wbGV4PGxvbmcgZG91YmxlPgoreworcHVibGljOgorICAgIHR5cGVkZWYgbG9uZyBkb3VibGUgdmFsdWVfdHlwZTsKKworICAgIGNvbnN0ZXhwciBjb21wbGV4KGxvbmcgZG91YmxlIHJlID0gMC4wTCwgbG9uZyBkb3VibGUgaW0gPSAwLjBMKTsKKyAgICBjb25zdGV4cHIgY29tcGxleChjb25zdCBjb21wbGV4PGZsb2F0PiYpOworICAgIGNvbnN0ZXhwciBjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOworCisgICAgY29uc3RleHByIGxvbmcgZG91YmxlIHJlYWwoKSBjb25zdDsKKyAgICB2b2lkIHJlYWwobG9uZyBkb3VibGUpOworICAgIGNvbnN0ZXhwciBsb25nIGRvdWJsZSBpbWFnKCkgY29uc3Q7CisgICAgdm9pZCBpbWFnKGxvbmcgZG91YmxlKTsKKworICAgIGNvbXBsZXg8bG9uZyBkb3VibGU+JiBvcGVyYXRvcj0oY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKKyAgICBjb21wbGV4PGxvbmcgZG91YmxlPiYgb3BlcmF0b3I9IChsb25nIGRvdWJsZSk7CisgICAgY29tcGxleDxsb25nIGRvdWJsZT4mIG9wZXJhdG9yKz0obG9uZyBkb3VibGUpOworICAgIGNvbXBsZXg8bG9uZyBkb3VibGU+JiBvcGVyYXRvci09KGxvbmcgZG91YmxlKTsKKyAgICBjb21wbGV4PGxvbmcgZG91YmxlPiYgb3BlcmF0b3IqPShsb25nIGRvdWJsZSk7CisgICAgY29tcGxleDxsb25nIGRvdWJsZT4mIG9wZXJhdG9yLz0obG9uZyBkb3VibGUpOworCisgICAgdGVtcGxhdGU8Y2xhc3MgWD4gY29tcGxleDxsb25nIGRvdWJsZT4mIG9wZXJhdG9yPSAoY29uc3QgY29tcGxleDxYPiYpOworICAgIHRlbXBsYXRlPGNsYXNzIFg+IGNvbXBsZXg8bG9uZyBkb3VibGU+JiBvcGVyYXRvcis9KGNvbnN0IGNvbXBsZXg8WD4mKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBYPiBjb21wbGV4PGxvbmcgZG91YmxlPiYgb3BlcmF0b3ItPShjb25zdCBjb21wbGV4PFg+Jik7CisgICAgdGVtcGxhdGU8Y2xhc3MgWD4gY29tcGxleDxsb25nIGRvdWJsZT4mIG9wZXJhdG9yKj0oY29uc3QgY29tcGxleDxYPiYpOworICAgIHRlbXBsYXRlPGNsYXNzIFg+IGNvbXBsZXg8bG9uZyBkb3VibGU+JiBvcGVyYXRvci89KGNvbnN0IGNvbXBsZXg8WD4mKTsKK307CisKKy8vIDI2LjMuNiBvcGVyYXRvcnM6Cit0ZW1wbGF0ZTxjbGFzcyBUPiBjb21wbGV4PFQ+IG9wZXJhdG9yKyhjb25zdCBjb21wbGV4PFQ+JiwgY29uc3QgY29tcGxleDxUPiYpOwordGVtcGxhdGU8Y2xhc3MgVD4gY29tcGxleDxUPiBvcGVyYXRvcisoY29uc3QgY29tcGxleDxUPiYsIGNvbnN0IFQmKTsKK3RlbXBsYXRlPGNsYXNzIFQ+IGNvbXBsZXg8VD4gb3BlcmF0b3IrKGNvbnN0IFQmLCBjb25zdCBjb21wbGV4PFQ+Jik7Cit0ZW1wbGF0ZTxjbGFzcyBUPiBjb21wbGV4PFQ+IG9wZXJhdG9yLShjb25zdCBjb21wbGV4PFQ+JiwgY29uc3QgY29tcGxleDxUPiYpOwordGVtcGxhdGU8Y2xhc3MgVD4gY29tcGxleDxUPiBvcGVyYXRvci0oY29uc3QgY29tcGxleDxUPiYsIGNvbnN0IFQmKTsKK3RlbXBsYXRlPGNsYXNzIFQ+IGNvbXBsZXg8VD4gb3BlcmF0b3ItKGNvbnN0IFQmLCBjb25zdCBjb21wbGV4PFQ+Jik7Cit0ZW1wbGF0ZTxjbGFzcyBUPiBjb21wbGV4PFQ+IG9wZXJhdG9yKihjb25zdCBjb21wbGV4PFQ+JiwgY29uc3QgY29tcGxleDxUPiYpOwordGVtcGxhdGU8Y2xhc3MgVD4gY29tcGxleDxUPiBvcGVyYXRvciooY29uc3QgY29tcGxleDxUPiYsIGNvbnN0IFQmKTsKK3RlbXBsYXRlPGNsYXNzIFQ+IGNvbXBsZXg8VD4gb3BlcmF0b3IqKGNvbnN0IFQmLCBjb25zdCBjb21wbGV4PFQ+Jik7Cit0ZW1wbGF0ZTxjbGFzcyBUPiBjb21wbGV4PFQ+IG9wZXJhdG9yLyhjb25zdCBjb21wbGV4PFQ+JiwgY29uc3QgY29tcGxleDxUPiYpOwordGVtcGxhdGU8Y2xhc3MgVD4gY29tcGxleDxUPiBvcGVyYXRvci8oY29uc3QgY29tcGxleDxUPiYsIGNvbnN0IFQmKTsKK3RlbXBsYXRlPGNsYXNzIFQ+IGNvbXBsZXg8VD4gb3BlcmF0b3IvKGNvbnN0IFQmLCBjb25zdCBjb21wbGV4PFQ+Jik7Cit0ZW1wbGF0ZTxjbGFzcyBUPiBjb21wbGV4PFQ+IG9wZXJhdG9yKyhjb25zdCBjb21wbGV4PFQ+Jik7Cit0ZW1wbGF0ZTxjbGFzcyBUPiBjb21wbGV4PFQ+IG9wZXJhdG9yLShjb25zdCBjb21wbGV4PFQ+Jik7Cit0ZW1wbGF0ZTxjbGFzcyBUPiBib29sIG9wZXJhdG9yPT0oY29uc3QgY29tcGxleDxUPiYsIGNvbnN0IGNvbXBsZXg8VD4mKTsgLy8gY29uc3RleHByIGluIEMrKzE0Cit0ZW1wbGF0ZTxjbGFzcyBUPiBib29sIG9wZXJhdG9yPT0oY29uc3QgY29tcGxleDxUPiYsIGNvbnN0IFQmKTsgLy8gY29uc3RleHByIGluIEMrKzE0Cit0ZW1wbGF0ZTxjbGFzcyBUPiBib29sIG9wZXJhdG9yPT0oY29uc3QgVCYsIGNvbnN0IGNvbXBsZXg8VD4mKTsgLy8gY29uc3RleHByIGluIEMrKzE0Cit0ZW1wbGF0ZTxjbGFzcyBUPiBib29sIG9wZXJhdG9yIT0oY29uc3QgY29tcGxleDxUPiYsIGNvbnN0IGNvbXBsZXg8VD4mKTsgLy8gY29uc3RleHByIGluIEMrKzE0Cit0ZW1wbGF0ZTxjbGFzcyBUPiBib29sIG9wZXJhdG9yIT0oY29uc3QgY29tcGxleDxUPiYsIGNvbnN0IFQmKTsgLy8gY29uc3RleHByIGluIEMrKzE0Cit0ZW1wbGF0ZTxjbGFzcyBUPiBib29sIG9wZXJhdG9yIT0oY29uc3QgVCYsIGNvbnN0IGNvbXBsZXg8VD4mKTsgLy8gY29uc3RleHByIGluIEMrKzE0CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgIGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYsIGNvbXBsZXg8VD4mKTsKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgIGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYsIGNvbnN0IGNvbXBsZXg8VD4mKTsKKworLy8gMjYuMy43IHZhbHVlczoKKwordGVtcGxhdGU8Y2xhc3MgVD4gICAgICAgICAgICAgIFQgcmVhbChjb25zdCBjb21wbGV4PFQ+Jik7IC8vIGNvbnN0ZXhwciBpbiBDKysxNAorICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgcmVhbChsb25nIGRvdWJsZSk7ICAgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysxNAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmVhbChkb3VibGUpOyAgICAgICAgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysxNAordGVtcGxhdGU8SW50ZWdyYWwgVD4gICAgICBkb3VibGUgcmVhbChUKTsgICAgICAgICAgICAgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysxNAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAgcmVhbChmbG9hdCk7ICAgICAgICAgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysxNAorCit0ZW1wbGF0ZTxjbGFzcyBUPiAgICAgICAgICAgICAgVCBpbWFnKGNvbnN0IGNvbXBsZXg8VD4mKTsgLy8gY29uc3RleHByIGluIEMrKzE0CisgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSBpbWFnKGxvbmcgZG91YmxlKTsgICAgICAgLy8gY29uc3RleHByIGluIEMrKzE0CisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBpbWFnKGRvdWJsZSk7ICAgICAgICAgICAgLy8gY29uc3RleHByIGluIEMrKzE0Cit0ZW1wbGF0ZTxJbnRlZ3JhbCBUPiAgICAgIGRvdWJsZSBpbWFnKFQpOyAgICAgICAgICAgICAgICAgLy8gY29uc3RleHByIGluIEMrKzE0CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICBpbWFnKGZsb2F0KTsgICAgICAgICAgICAgLy8gY29uc3RleHByIGluIEMrKzE0CisKK3RlbXBsYXRlPGNsYXNzIFQ+IFQgYWJzKGNvbnN0IGNvbXBsZXg8VD4mKTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gICAgICAgICAgICAgIFQgYXJnKGNvbnN0IGNvbXBsZXg8VD4mKTsKKyAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlIGFyZyhsb25nIGRvdWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhcmcoZG91YmxlKTsKK3RlbXBsYXRlPEludGVncmFsIFQ+ICAgICAgZG91YmxlIGFyZyhUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgIGFyZyhmbG9hdCk7CisKK3RlbXBsYXRlPGNsYXNzIFQ+ICAgICAgICAgICAgICBUIG5vcm0oY29uc3QgY29tcGxleDxUPiYpOworICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgbm9ybShsb25nIGRvdWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBub3JtKGRvdWJsZSk7Cit0ZW1wbGF0ZTxJbnRlZ3JhbCBUPiAgICAgIGRvdWJsZSBub3JtKFQpOworICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAgbm9ybShmbG9hdCk7CisKK3RlbXBsYXRlPGNsYXNzIFQ+ICAgICAgY29tcGxleDxUPiAgICAgICAgICAgY29uaihjb25zdCBjb21wbGV4PFQ+Jik7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXg8bG9uZyBkb3VibGU+IGNvbmoobG9uZyBkb3VibGUpOworICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4PGRvdWJsZT4gICAgICBjb25qKGRvdWJsZSk7Cit0ZW1wbGF0ZTxJbnRlZ3JhbCBUPiAgIGNvbXBsZXg8ZG91YmxlPiAgICAgIGNvbmooVCk7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXg8ZmxvYXQ+ICAgICAgIGNvbmooZmxvYXQpOworCit0ZW1wbGF0ZTxjbGFzcyBUPiAgICBjb21wbGV4PFQ+ICAgICAgICAgICBwcm9qKGNvbnN0IGNvbXBsZXg8VD4mKTsKKyAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXg8bG9uZyBkb3VibGU+IHByb2oobG9uZyBkb3VibGUpOworICAgICAgICAgICAgICAgICAgICAgY29tcGxleDxkb3VibGU+ICAgICAgcHJvaihkb3VibGUpOwordGVtcGxhdGU8SW50ZWdyYWwgVD4gY29tcGxleDxkb3VibGU+ICAgICAgcHJvaihUKTsKKyAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXg8ZmxvYXQ+ICAgICAgIHByb2ooZmxvYXQpOworCit0ZW1wbGF0ZTxjbGFzcyBUPiBjb21wbGV4PFQ+IHBvbGFyKGNvbnN0IFQmLCBjb25zdCBUJiA9IFQoKSk7CisKKy8vIDI2LjMuOCB0cmFuc2NlbmRlbnRhbHM6Cit0ZW1wbGF0ZTxjbGFzcyBUPiBjb21wbGV4PFQ+IGFjb3MoY29uc3QgY29tcGxleDxUPiYpOwordGVtcGxhdGU8Y2xhc3MgVD4gY29tcGxleDxUPiBhc2luKGNvbnN0IGNvbXBsZXg8VD4mKTsKK3RlbXBsYXRlPGNsYXNzIFQ+IGNvbXBsZXg8VD4gYXRhbihjb25zdCBjb21wbGV4PFQ+Jik7Cit0ZW1wbGF0ZTxjbGFzcyBUPiBjb21wbGV4PFQ+IGFjb3NoKGNvbnN0IGNvbXBsZXg8VD4mKTsKK3RlbXBsYXRlPGNsYXNzIFQ+IGNvbXBsZXg8VD4gYXNpbmgoY29uc3QgY29tcGxleDxUPiYpOwordGVtcGxhdGU8Y2xhc3MgVD4gY29tcGxleDxUPiBhdGFuaChjb25zdCBjb21wbGV4PFQ+Jik7Cit0ZW1wbGF0ZTxjbGFzcyBUPiBjb21wbGV4PFQ+IGNvcyAoY29uc3QgY29tcGxleDxUPiYpOwordGVtcGxhdGU8Y2xhc3MgVD4gY29tcGxleDxUPiBjb3NoIChjb25zdCBjb21wbGV4PFQ+Jik7Cit0ZW1wbGF0ZTxjbGFzcyBUPiBjb21wbGV4PFQ+IGV4cCAoY29uc3QgY29tcGxleDxUPiYpOwordGVtcGxhdGU8Y2xhc3MgVD4gY29tcGxleDxUPiBsb2cgKGNvbnN0IGNvbXBsZXg8VD4mKTsKK3RlbXBsYXRlPGNsYXNzIFQ+IGNvbXBsZXg8VD4gbG9nMTAoY29uc3QgY29tcGxleDxUPiYpOworCit0ZW1wbGF0ZTxjbGFzcyBUPiBjb21wbGV4PFQ+IHBvdyhjb25zdCBjb21wbGV4PFQ+JiwgY29uc3QgVCYpOwordGVtcGxhdGU8Y2xhc3MgVD4gY29tcGxleDxUPiBwb3coY29uc3QgY29tcGxleDxUPiYsIGNvbnN0IGNvbXBsZXg8VD4mKTsKK3RlbXBsYXRlPGNsYXNzIFQ+IGNvbXBsZXg8VD4gcG93KGNvbnN0IFQmLCBjb25zdCBjb21wbGV4PFQ+Jik7CisKK3RlbXBsYXRlPGNsYXNzIFQ+IGNvbXBsZXg8VD4gc2luIChjb25zdCBjb21wbGV4PFQ+Jik7Cit0ZW1wbGF0ZTxjbGFzcyBUPiBjb21wbGV4PFQ+IHNpbmggKGNvbnN0IGNvbXBsZXg8VD4mKTsKK3RlbXBsYXRlPGNsYXNzIFQ+IGNvbXBsZXg8VD4gc3FydCAoY29uc3QgY29tcGxleDxUPiYpOwordGVtcGxhdGU8Y2xhc3MgVD4gY29tcGxleDxUPiB0YW4gKGNvbnN0IGNvbXBsZXg8VD4mKTsKK3RlbXBsYXRlPGNsYXNzIFQ+IGNvbXBsZXg8VD4gdGFuaCAoY29uc3QgY29tcGxleDxUPiYpOworCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICBiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mIGlzLCBjb21wbGV4PFQ+JiB4KTsKKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYKKyAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBvLCBjb25zdCBjb21wbGV4PFQ+JiB4KTsKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+IGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGNvbXBsZXg7CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4gY29tcGxleDxfVHA+IG9wZXJhdG9yKihjb25zdCBjb21wbGV4PF9UcD4mIF9feiwgY29uc3QgY29tcGxleDxfVHA+JiBfX3cpOwordGVtcGxhdGU8Y2xhc3MgX1RwPiBjb21wbGV4PF9UcD4gb3BlcmF0b3IvKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSk7CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGNvbXBsZXgKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworcHJpdmF0ZToKKyAgICB2YWx1ZV90eXBlIF9fcmVfOworICAgIHZhbHVlX3R5cGUgX19pbV87CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorICAgIGNvbXBsZXgoY29uc3QgdmFsdWVfdHlwZSYgX19yZSA9IHZhbHVlX3R5cGUoKSwgY29uc3QgdmFsdWVfdHlwZSYgX19pbSA9IHZhbHVlX3R5cGUoKSkKKyAgICAgICAgOiBfX3JlXyhfX3JlKSwgX19pbV8oX19pbSkge30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWHA+IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICBjb21wbGV4KGNvbnN0IGNvbXBsZXg8X1hwPiYgX19jKQorICAgICAgICA6IF9fcmVfKF9fYy5yZWFsKCkpLCBfX2ltXyhfX2MuaW1hZygpKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSB2YWx1ZV90eXBlIHJlYWwoKSBjb25zdCB7cmV0dXJuIF9fcmVfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIHZhbHVlX3R5cGUgaW1hZygpIGNvbnN0IHtyZXR1cm4gX19pbV87fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIHJlYWwodmFsdWVfdHlwZSBfX3JlKSB7X19yZV8gPSBfX3JlO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgaW1hZyh2YWx1ZV90eXBlIF9faW0pIHtfX2ltXyA9IF9faW07fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb21wbGV4JiBvcGVyYXRvcj0gKGNvbnN0IHZhbHVlX3R5cGUmIF9fcmUpCisgICAgICAgIHtfX3JlXyA9IF9fcmU7IF9faW1fID0gdmFsdWVfdHlwZSgpOyByZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3IrPShjb25zdCB2YWx1ZV90eXBlJiBfX3JlKSB7X19yZV8gKz0gX19yZTsgcmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbXBsZXgmIG9wZXJhdG9yLT0oY29uc3QgdmFsdWVfdHlwZSYgX19yZSkge19fcmVfIC09IF9fcmU7IHJldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb21wbGV4JiBvcGVyYXRvcio9KGNvbnN0IHZhbHVlX3R5cGUmIF9fcmUpIHtfX3JlXyAqPSBfX3JlOyBfX2ltXyAqPSBfX3JlOyByZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3IvPShjb25zdCB2YWx1ZV90eXBlJiBfX3JlKSB7X19yZV8gLz0gX19yZTsgX19pbV8gLz0gX19yZTsgcmV0dXJuICp0aGlzO30KKworICAgIHRlbXBsYXRlPGNsYXNzIF9YcD4gX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb21wbGV4JiBvcGVyYXRvcj0gKGNvbnN0IGNvbXBsZXg8X1hwPiYgX19jKQorICAgICAgICB7CisgICAgICAgICAgICBfX3JlXyA9IF9fYy5yZWFsKCk7CisgICAgICAgICAgICBfX2ltXyA9IF9fYy5pbWFnKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWHA+IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3IrPShjb25zdCBjb21wbGV4PF9YcD4mIF9fYykKKyAgICAgICAgeworICAgICAgICAgICAgX19yZV8gKz0gX19jLnJlYWwoKTsKKyAgICAgICAgICAgIF9faW1fICs9IF9fYy5pbWFnKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWHA+IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3ItPShjb25zdCBjb21wbGV4PF9YcD4mIF9fYykKKyAgICAgICAgeworICAgICAgICAgICAgX19yZV8gLT0gX19jLnJlYWwoKTsKKyAgICAgICAgICAgIF9faW1fIC09IF9fYy5pbWFnKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWHA+IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3IqPShjb25zdCBjb21wbGV4PF9YcD4mIF9fYykKKyAgICAgICAgeworICAgICAgICAgICAgKnRoaXMgPSAqdGhpcyAqIGNvbXBsZXgoX19jLnJlYWwoKSwgX19jLmltYWcoKSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWHA+IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3IvPShjb25zdCBjb21wbGV4PF9YcD4mIF9fYykKKyAgICAgICAgeworICAgICAgICAgICAgKnRoaXMgPSAqdGhpcyAvIGNvbXBsZXgoX19jLnJlYWwoKSwgX19jLmltYWcoKSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KK307CisKK3RlbXBsYXRlPD4gY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgY29tcGxleDxkb3VibGU+OwordGVtcGxhdGU8PiBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBjb21wbGV4PGxvbmcgZG91YmxlPjsKKwordGVtcGxhdGU8PgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgY29tcGxleDxmbG9hdD4KK3sKKyAgICBmbG9hdCBfX3JlXzsKKyAgICBmbG9hdCBfX2ltXzsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGZsb2F0IHZhbHVlX3R5cGU7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSIGNvbXBsZXgoZmxvYXQgX19yZSA9IDAuMGYsIGZsb2F0IF9faW0gPSAwLjBmKQorICAgICAgICA6IF9fcmVfKF9fcmUpLCBfX2ltXyhfX2ltKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfTElCQ1BQX0NPTlNURVhQUiBjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYgX19jKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX0xJQkNQUF9DT05TVEVYUFIgY29tcGxleChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgX19jKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIgZmxvYXQgcmVhbCgpIGNvbnN0IHtyZXR1cm4gX19yZV87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIgZmxvYXQgaW1hZygpIGNvbnN0IHtyZXR1cm4gX19pbV87fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIHJlYWwodmFsdWVfdHlwZSBfX3JlKSB7X19yZV8gPSBfX3JlO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgaW1hZyh2YWx1ZV90eXBlIF9faW0pIHtfX2ltXyA9IF9faW07fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb21wbGV4JiBvcGVyYXRvcj0gKGZsb2F0IF9fcmUpCisgICAgICAgIHtfX3JlXyA9IF9fcmU7IF9faW1fID0gdmFsdWVfdHlwZSgpOyByZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3IrPShmbG9hdCBfX3JlKSB7X19yZV8gKz0gX19yZTsgcmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbXBsZXgmIG9wZXJhdG9yLT0oZmxvYXQgX19yZSkge19fcmVfIC09IF9fcmU7IHJldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb21wbGV4JiBvcGVyYXRvcio9KGZsb2F0IF9fcmUpIHtfX3JlXyAqPSBfX3JlOyBfX2ltXyAqPSBfX3JlOyByZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3IvPShmbG9hdCBfX3JlKSB7X19yZV8gLz0gX19yZTsgX19pbV8gLz0gX19yZTsgcmV0dXJuICp0aGlzO30KKworICAgIHRlbXBsYXRlPGNsYXNzIF9YcD4gX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb21wbGV4JiBvcGVyYXRvcj0gKGNvbnN0IGNvbXBsZXg8X1hwPiYgX19jKQorICAgICAgICB7CisgICAgICAgICAgICBfX3JlXyA9IF9fYy5yZWFsKCk7CisgICAgICAgICAgICBfX2ltXyA9IF9fYy5pbWFnKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWHA+IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3IrPShjb25zdCBjb21wbGV4PF9YcD4mIF9fYykKKyAgICAgICAgeworICAgICAgICAgICAgX19yZV8gKz0gX19jLnJlYWwoKTsKKyAgICAgICAgICAgIF9faW1fICs9IF9fYy5pbWFnKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWHA+IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3ItPShjb25zdCBjb21wbGV4PF9YcD4mIF9fYykKKyAgICAgICAgeworICAgICAgICAgICAgX19yZV8gLT0gX19jLnJlYWwoKTsKKyAgICAgICAgICAgIF9faW1fIC09IF9fYy5pbWFnKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWHA+IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3IqPShjb25zdCBjb21wbGV4PF9YcD4mIF9fYykKKyAgICAgICAgeworICAgICAgICAgICAgKnRoaXMgPSAqdGhpcyAqIGNvbXBsZXgoX19jLnJlYWwoKSwgX19jLmltYWcoKSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWHA+IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3IvPShjb25zdCBjb21wbGV4PF9YcD4mIF9fYykKKyAgICAgICAgeworICAgICAgICAgICAgKnRoaXMgPSAqdGhpcyAvIGNvbXBsZXgoX19jLnJlYWwoKSwgX19jLmltYWcoKSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KK307CisKK3RlbXBsYXRlPD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGNvbXBsZXg8ZG91YmxlPgoreworICAgIGRvdWJsZSBfX3JlXzsKKyAgICBkb3VibGUgX19pbV87CitwdWJsaWM6CisgICAgdHlwZWRlZiBkb3VibGUgdmFsdWVfdHlwZTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIgY29tcGxleChkb3VibGUgX19yZSA9IDAuMCwgZG91YmxlIF9faW0gPSAwLjApCisgICAgICAgIDogX19yZV8oX19yZSksIF9faW1fKF9faW0pIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbXBsZXgoY29uc3QgY29tcGxleDxmbG9hdD4mIF9fYyk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9MSUJDUFBfQ09OU1RFWFBSIGNvbXBsZXgoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mIF9fYyk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSIGRvdWJsZSByZWFsKCkgY29uc3Qge3JldHVybiBfX3JlXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUiBkb3VibGUgaW1hZygpIGNvbnN0IHtyZXR1cm4gX19pbV87fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIHJlYWwodmFsdWVfdHlwZSBfX3JlKSB7X19yZV8gPSBfX3JlO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgaW1hZyh2YWx1ZV90eXBlIF9faW0pIHtfX2ltXyA9IF9faW07fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb21wbGV4JiBvcGVyYXRvcj0gKGRvdWJsZSBfX3JlKQorICAgICAgICB7X19yZV8gPSBfX3JlOyBfX2ltXyA9IHZhbHVlX3R5cGUoKTsgcmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbXBsZXgmIG9wZXJhdG9yKz0oZG91YmxlIF9fcmUpIHtfX3JlXyArPSBfX3JlOyByZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3ItPShkb3VibGUgX19yZSkge19fcmVfIC09IF9fcmU7IHJldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb21wbGV4JiBvcGVyYXRvcio9KGRvdWJsZSBfX3JlKSB7X19yZV8gKj0gX19yZTsgX19pbV8gKj0gX19yZTsgcmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbXBsZXgmIG9wZXJhdG9yLz0oZG91YmxlIF9fcmUpIHtfX3JlXyAvPSBfX3JlOyBfX2ltXyAvPSBfX3JlOyByZXR1cm4gKnRoaXM7fQorCisgICAgdGVtcGxhdGU8Y2xhc3MgX1hwPiBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbXBsZXgmIG9wZXJhdG9yPSAoY29uc3QgY29tcGxleDxfWHA+JiBfX2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fcmVfID0gX19jLnJlYWwoKTsKKyAgICAgICAgICAgIF9faW1fID0gX19jLmltYWcoKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgIHRlbXBsYXRlPGNsYXNzIF9YcD4gX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb21wbGV4JiBvcGVyYXRvcis9KGNvbnN0IGNvbXBsZXg8X1hwPiYgX19jKQorICAgICAgICB7CisgICAgICAgICAgICBfX3JlXyArPSBfX2MucmVhbCgpOworICAgICAgICAgICAgX19pbV8gKz0gX19jLmltYWcoKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgIHRlbXBsYXRlPGNsYXNzIF9YcD4gX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb21wbGV4JiBvcGVyYXRvci09KGNvbnN0IGNvbXBsZXg8X1hwPiYgX19jKQorICAgICAgICB7CisgICAgICAgICAgICBfX3JlXyAtPSBfX2MucmVhbCgpOworICAgICAgICAgICAgX19pbV8gLT0gX19jLmltYWcoKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgIHRlbXBsYXRlPGNsYXNzIF9YcD4gX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb21wbGV4JiBvcGVyYXRvcio9KGNvbnN0IGNvbXBsZXg8X1hwPiYgX19jKQorICAgICAgICB7CisgICAgICAgICAgICAqdGhpcyA9ICp0aGlzICogY29tcGxleChfX2MucmVhbCgpLCBfX2MuaW1hZygpKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgIHRlbXBsYXRlPGNsYXNzIF9YcD4gX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb21wbGV4JiBvcGVyYXRvci89KGNvbnN0IGNvbXBsZXg8X1hwPiYgX19jKQorICAgICAgICB7CisgICAgICAgICAgICAqdGhpcyA9ICp0aGlzIC8gY29tcGxleChfX2MucmVhbCgpLCBfX2MuaW1hZygpKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorfTsKKwordGVtcGxhdGU8PgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgY29tcGxleDxsb25nIGRvdWJsZT4KK3sKKyAgICBsb25nIGRvdWJsZSBfX3JlXzsKKyAgICBsb25nIGRvdWJsZSBfX2ltXzsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGxvbmcgZG91YmxlIHZhbHVlX3R5cGU7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSIGNvbXBsZXgobG9uZyBkb3VibGUgX19yZSA9IDAuMEwsIGxvbmcgZG91YmxlIF9faW0gPSAwLjBMKQorICAgICAgICA6IF9fcmVfKF9fcmUpLCBfX2ltXyhfX2ltKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiBfX2MpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYgX19jKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIgbG9uZyBkb3VibGUgcmVhbCgpIGNvbnN0IHtyZXR1cm4gX19yZV87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIgbG9uZyBkb3VibGUgaW1hZygpIGNvbnN0IHtyZXR1cm4gX19pbV87fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIHJlYWwodmFsdWVfdHlwZSBfX3JlKSB7X19yZV8gPSBfX3JlO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgaW1hZyh2YWx1ZV90eXBlIF9faW0pIHtfX2ltXyA9IF9faW07fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb21wbGV4JiBvcGVyYXRvcj0gKGxvbmcgZG91YmxlIF9fcmUpCisgICAgICAgIHtfX3JlXyA9IF9fcmU7IF9faW1fID0gdmFsdWVfdHlwZSgpOyByZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3IrPShsb25nIGRvdWJsZSBfX3JlKSB7X19yZV8gKz0gX19yZTsgcmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbXBsZXgmIG9wZXJhdG9yLT0obG9uZyBkb3VibGUgX19yZSkge19fcmVfIC09IF9fcmU7IHJldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb21wbGV4JiBvcGVyYXRvcio9KGxvbmcgZG91YmxlIF9fcmUpIHtfX3JlXyAqPSBfX3JlOyBfX2ltXyAqPSBfX3JlOyByZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3IvPShsb25nIGRvdWJsZSBfX3JlKSB7X19yZV8gLz0gX19yZTsgX19pbV8gLz0gX19yZTsgcmV0dXJuICp0aGlzO30KKworICAgIHRlbXBsYXRlPGNsYXNzIF9YcD4gX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb21wbGV4JiBvcGVyYXRvcj0gKGNvbnN0IGNvbXBsZXg8X1hwPiYgX19jKQorICAgICAgICB7CisgICAgICAgICAgICBfX3JlXyA9IF9fYy5yZWFsKCk7CisgICAgICAgICAgICBfX2ltXyA9IF9fYy5pbWFnKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWHA+IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3IrPShjb25zdCBjb21wbGV4PF9YcD4mIF9fYykKKyAgICAgICAgeworICAgICAgICAgICAgX19yZV8gKz0gX19jLnJlYWwoKTsKKyAgICAgICAgICAgIF9faW1fICs9IF9fYy5pbWFnKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWHA+IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3ItPShjb25zdCBjb21wbGV4PF9YcD4mIF9fYykKKyAgICAgICAgeworICAgICAgICAgICAgX19yZV8gLT0gX19jLnJlYWwoKTsKKyAgICAgICAgICAgIF9faW1fIC09IF9fYy5pbWFnKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWHA+IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3IqPShjb25zdCBjb21wbGV4PF9YcD4mIF9fYykKKyAgICAgICAgeworICAgICAgICAgICAgKnRoaXMgPSAqdGhpcyAqIGNvbXBsZXgoX19jLnJlYWwoKSwgX19jLmltYWcoKSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWHA+IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29tcGxleCYgb3BlcmF0b3IvPShjb25zdCBjb21wbGV4PF9YcD4mIF9fYykKKyAgICAgICAgeworICAgICAgICAgICAgKnRoaXMgPSAqdGhpcyAvIGNvbXBsZXgoX19jLnJlYWwoKSwgX19jLmltYWcoKSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KK307CisKK2lubGluZQorX0xJQkNQUF9DT05TVEVYUFIKK2NvbXBsZXg8ZmxvYXQ+Ojpjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYgX19jKQorICAgIDogX19yZV8oX19jLnJlYWwoKSksIF9faW1fKF9fYy5pbWFnKCkpIHt9CisKK2lubGluZQorX0xJQkNQUF9DT05TVEVYUFIKK2NvbXBsZXg8ZmxvYXQ+Ojpjb21wbGV4KGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+JiBfX2MpCisgICAgOiBfX3JlXyhfX2MucmVhbCgpKSwgX19pbV8oX19jLmltYWcoKSkge30KKworaW5saW5lCitfTElCQ1BQX0NPTlNURVhQUgorY29tcGxleDxkb3VibGU+Ojpjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiBfX2MpCisgICAgOiBfX3JlXyhfX2MucmVhbCgpKSwgX19pbV8oX19jLmltYWcoKSkge30KKworaW5saW5lCitfTElCQ1BQX0NPTlNURVhQUgorY29tcGxleDxkb3VibGU+Ojpjb21wbGV4KGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+JiBfX2MpCisgICAgOiBfX3JlXyhfX2MucmVhbCgpKSwgX19pbV8oX19jLmltYWcoKSkge30KKworaW5saW5lCitfTElCQ1BQX0NPTlNURVhQUgorY29tcGxleDxsb25nIGRvdWJsZT46OmNvbXBsZXgoY29uc3QgY29tcGxleDxmbG9hdD4mIF9fYykKKyAgICA6IF9fcmVfKF9fYy5yZWFsKCkpLCBfX2ltXyhfX2MuaW1hZygpKSB7fQorCitpbmxpbmUKK19MSUJDUFBfQ09OU1RFWFBSCitjb21wbGV4PGxvbmcgZG91YmxlPjo6Y29tcGxleChjb25zdCBjb21wbGV4PGRvdWJsZT4mIF9fYykKKyAgICA6IF9fcmVfKF9fYy5yZWFsKCkpLCBfX2ltXyhfX2MuaW1hZygpKSB7fQorCisvLyAyNi4zLjYgb3BlcmF0b3JzOgorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29tcGxleDxfVHA+CitvcGVyYXRvcisoY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQoreworICAgIGNvbXBsZXg8X1RwPiBfX3QoX194KTsKKyAgICBfX3QgKz0gX195OworICAgIHJldHVybiBfX3Q7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb21wbGV4PF9UcD4KK29wZXJhdG9yKyhjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX3kpCit7CisgICAgY29tcGxleDxfVHA+IF9fdChfX3gpOworICAgIF9fdCArPSBfX3k7CisgICAgcmV0dXJuIF9fdDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbXBsZXg8X1RwPgorb3BlcmF0b3IrKGNvbnN0IF9UcCYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKK3sKKyAgICBjb21wbGV4PF9UcD4gX190KF9feSk7CisgICAgX190ICs9IF9feDsKKyAgICByZXR1cm4gX190OworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29tcGxleDxfVHA+CitvcGVyYXRvci0oY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQoreworICAgIGNvbXBsZXg8X1RwPiBfX3QoX194KTsKKyAgICBfX3QgLT0gX195OworICAgIHJldHVybiBfX3Q7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb21wbGV4PF9UcD4KK29wZXJhdG9yLShjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX3kpCit7CisgICAgY29tcGxleDxfVHA+IF9fdChfX3gpOworICAgIF9fdCAtPSBfX3k7CisgICAgcmV0dXJuIF9fdDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbXBsZXg8X1RwPgorb3BlcmF0b3ItKGNvbnN0IF9UcCYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKK3sKKyAgICBjb21wbGV4PF9UcD4gX190KC1fX3kpOworICAgIF9fdCArPSBfX3g7CisgICAgcmV0dXJuIF9fdDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgorY29tcGxleDxfVHA+CitvcGVyYXRvciooY29uc3QgY29tcGxleDxfVHA+JiBfX3osIGNvbnN0IGNvbXBsZXg8X1RwPiYgX193KQoreworICAgIF9UcCBfX2EgPSBfX3oucmVhbCgpOworICAgIF9UcCBfX2IgPSBfX3ouaW1hZygpOworICAgIF9UcCBfX2MgPSBfX3cucmVhbCgpOworICAgIF9UcCBfX2QgPSBfX3cuaW1hZygpOworICAgIF9UcCBfX2FjID0gX19hICogX19jOworICAgIF9UcCBfX2JkID0gX19iICogX19kOworICAgIF9UcCBfX2FkID0gX19hICogX19kOworICAgIF9UcCBfX2JjID0gX19iICogX19jOworICAgIF9UcCBfX3ggPSBfX2FjIC0gX19iZDsKKyAgICBfVHAgX195ID0gX19hZCArIF9fYmM7CisgICAgaWYgKF9fbGliY3BwX2lzbmFuX29yX2J1aWx0aW4oX194KSAmJiBfX2xpYmNwcF9pc25hbl9vcl9idWlsdGluKF9feSkpCisgICAgeworICAgICAgICBib29sIF9fcmVjYWxjID0gZmFsc2U7CisgICAgICAgIGlmIChfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9fYSkgfHwgX19saWJjcHBfaXNpbmZfb3JfYnVpbHRpbihfX2IpKQorICAgICAgICB7CisgICAgICAgICAgICBfX2EgPSBjb3B5c2lnbihfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9fYSkgPyBfVHAoMSkgOiBfVHAoMCksIF9fYSk7CisgICAgICAgICAgICBfX2IgPSBjb3B5c2lnbihfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9fYikgPyBfVHAoMSkgOiBfVHAoMCksIF9fYik7CisgICAgICAgICAgICBpZiAoX19saWJjcHBfaXNuYW5fb3JfYnVpbHRpbihfX2MpKQorICAgICAgICAgICAgICAgIF9fYyA9IGNvcHlzaWduKF9UcCgwKSwgX19jKTsKKyAgICAgICAgICAgIGlmIChfX2xpYmNwcF9pc25hbl9vcl9idWlsdGluKF9fZCkpCisgICAgICAgICAgICAgICAgX19kID0gY29weXNpZ24oX1RwKDApLCBfX2QpOworICAgICAgICAgICAgX19yZWNhbGMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9fYykgfHwgX19saWJjcHBfaXNpbmZfb3JfYnVpbHRpbihfX2QpKQorICAgICAgICB7CisgICAgICAgICAgICBfX2MgPSBjb3B5c2lnbihfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9fYykgPyBfVHAoMSkgOiBfVHAoMCksIF9fYyk7CisgICAgICAgICAgICBfX2QgPSBjb3B5c2lnbihfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9fZCkgPyBfVHAoMSkgOiBfVHAoMCksIF9fZCk7CisgICAgICAgICAgICBpZiAoX19saWJjcHBfaXNuYW5fb3JfYnVpbHRpbihfX2EpKQorICAgICAgICAgICAgICAgIF9fYSA9IGNvcHlzaWduKF9UcCgwKSwgX19hKTsKKyAgICAgICAgICAgIGlmIChfX2xpYmNwcF9pc25hbl9vcl9idWlsdGluKF9fYikpCisgICAgICAgICAgICAgICAgX19iID0gY29weXNpZ24oX1RwKDApLCBfX2IpOworICAgICAgICAgICAgX19yZWNhbGMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICghX19yZWNhbGMgJiYgKF9fbGliY3BwX2lzaW5mX29yX2J1aWx0aW4oX19hYykgfHwgX19saWJjcHBfaXNpbmZfb3JfYnVpbHRpbihfX2JkKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9fYWQpIHx8IF9fbGliY3BwX2lzaW5mX29yX2J1aWx0aW4oX19iYykpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX19saWJjcHBfaXNuYW5fb3JfYnVpbHRpbihfX2EpKQorICAgICAgICAgICAgICAgIF9fYSA9IGNvcHlzaWduKF9UcCgwKSwgX19hKTsKKyAgICAgICAgICAgIGlmIChfX2xpYmNwcF9pc25hbl9vcl9idWlsdGluKF9fYikpCisgICAgICAgICAgICAgICAgX19iID0gY29weXNpZ24oX1RwKDApLCBfX2IpOworICAgICAgICAgICAgaWYgKF9fbGliY3BwX2lzbmFuX29yX2J1aWx0aW4oX19jKSkKKyAgICAgICAgICAgICAgICBfX2MgPSBjb3B5c2lnbihfVHAoMCksIF9fYyk7CisgICAgICAgICAgICBpZiAoX19saWJjcHBfaXNuYW5fb3JfYnVpbHRpbihfX2QpKQorICAgICAgICAgICAgICAgIF9fZCA9IGNvcHlzaWduKF9UcCgwKSwgX19kKTsKKyAgICAgICAgICAgIF9fcmVjYWxjID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19yZWNhbGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9feCA9IF9UcChJTkZJTklUWSkgKiAoX19hICogX19jIC0gX19iICogX19kKTsKKyAgICAgICAgICAgIF9feSA9IF9UcChJTkZJTklUWSkgKiAoX19hICogX19kICsgX19iICogX19jKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY29tcGxleDxfVHA+KF9feCwgX195KTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbXBsZXg8X1RwPgorb3BlcmF0b3IqKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBfVHAmIF9feSkKK3sKKyAgICBjb21wbGV4PF9UcD4gX190KF9feCk7CisgICAgX190ICo9IF9feTsKKyAgICByZXR1cm4gX190OworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29tcGxleDxfVHA+CitvcGVyYXRvciooY29uc3QgX1RwJiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQoreworICAgIGNvbXBsZXg8X1RwPiBfX3QoX195KTsKKyAgICBfX3QgKj0gX194OworICAgIHJldHVybiBfX3Q7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2NvbXBsZXg8X1RwPgorb3BlcmF0b3IvKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196LCBjb25zdCBjb21wbGV4PF9UcD4mIF9fdykKK3sKKyAgICBpbnQgX19pbG9nYncgPSAwOworICAgIF9UcCBfX2EgPSBfX3oucmVhbCgpOworICAgIF9UcCBfX2IgPSBfX3ouaW1hZygpOworICAgIF9UcCBfX2MgPSBfX3cucmVhbCgpOworICAgIF9UcCBfX2QgPSBfX3cuaW1hZygpOworICAgIF9UcCBfX2xvZ2J3ID0gbG9nYihmbWF4KGZhYnMoX19jKSwgZmFicyhfX2QpKSk7CisgICAgaWYgKF9fbGliY3BwX2lzZmluaXRlX29yX2J1aWx0aW4oX19sb2didykpCisgICAgeworICAgICAgICBfX2lsb2didyA9IHN0YXRpY19jYXN0PGludD4oX19sb2didyk7CisgICAgICAgIF9fYyA9IHNjYWxibihfX2MsIC1fX2lsb2didyk7CisgICAgICAgIF9fZCA9IHNjYWxibihfX2QsIC1fX2lsb2didyk7CisgICAgfQorICAgIF9UcCBfX2Rlbm9tID0gX19jICogX19jICsgX19kICogX19kOworICAgIF9UcCBfX3ggPSBzY2FsYm4oKF9fYSAqIF9fYyArIF9fYiAqIF9fZCkgLyBfX2Rlbm9tLCAtX19pbG9nYncpOworICAgIF9UcCBfX3kgPSBzY2FsYm4oKF9fYiAqIF9fYyAtIF9fYSAqIF9fZCkgLyBfX2Rlbm9tLCAtX19pbG9nYncpOworICAgIGlmIChfX2xpYmNwcF9pc25hbl9vcl9idWlsdGluKF9feCkgJiYgX19saWJjcHBfaXNuYW5fb3JfYnVpbHRpbihfX3kpKQorICAgIHsKKyAgICAgICAgaWYgKChfX2Rlbm9tID09IF9UcCgwKSkgJiYgKCFfX2xpYmNwcF9pc25hbl9vcl9idWlsdGluKF9fYSkgfHwgIV9fbGliY3BwX2lzbmFuX29yX2J1aWx0aW4oX19iKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9feCA9IGNvcHlzaWduKF9UcChJTkZJTklUWSksIF9fYykgKiBfX2E7CisgICAgICAgICAgICBfX3kgPSBjb3B5c2lnbihfVHAoSU5GSU5JVFkpLCBfX2MpICogX19iOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9fYSkgfHwgX19saWJjcHBfaXNpbmZfb3JfYnVpbHRpbihfX2IpKSAmJiBfX2xpYmNwcF9pc2Zpbml0ZV9vcl9idWlsdGluKF9fYykgJiYgX19saWJjcHBfaXNmaW5pdGVfb3JfYnVpbHRpbihfX2QpKQorICAgICAgICB7CisgICAgICAgICAgICBfX2EgPSBjb3B5c2lnbihfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9fYSkgPyBfVHAoMSkgOiBfVHAoMCksIF9fYSk7CisgICAgICAgICAgICBfX2IgPSBjb3B5c2lnbihfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9fYikgPyBfVHAoMSkgOiBfVHAoMCksIF9fYik7CisgICAgICAgICAgICBfX3ggPSBfVHAoSU5GSU5JVFkpICogKF9fYSAqIF9fYyArIF9fYiAqIF9fZCk7CisgICAgICAgICAgICBfX3kgPSBfVHAoSU5GSU5JVFkpICogKF9fYiAqIF9fYyAtIF9fYSAqIF9fZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoX19saWJjcHBfaXNpbmZfb3JfYnVpbHRpbihfX2xvZ2J3KSAmJiBfX2xvZ2J3ID4gX1RwKDApICYmIF9fbGliY3BwX2lzZmluaXRlX29yX2J1aWx0aW4oX19hKSAmJiBfX2xpYmNwcF9pc2Zpbml0ZV9vcl9idWlsdGluKF9fYikpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fYyA9IGNvcHlzaWduKF9fbGliY3BwX2lzaW5mX29yX2J1aWx0aW4oX19jKSA/IF9UcCgxKSA6IF9UcCgwKSwgX19jKTsKKyAgICAgICAgICAgIF9fZCA9IGNvcHlzaWduKF9fbGliY3BwX2lzaW5mX29yX2J1aWx0aW4oX19kKSA/IF9UcCgxKSA6IF9UcCgwKSwgX19kKTsKKyAgICAgICAgICAgIF9feCA9IF9UcCgwKSAqIChfX2EgKiBfX2MgKyBfX2IgKiBfX2QpOworICAgICAgICAgICAgX195ID0gX1RwKDApICogKF9fYiAqIF9fYyAtIF9fYSAqIF9fZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3gsIF9feSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb21wbGV4PF9UcD4KK29wZXJhdG9yLyhjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX3kpCit7CisgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3gucmVhbCgpIC8gX195LCBfX3guaW1hZygpIC8gX195KTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbXBsZXg8X1RwPgorb3BlcmF0b3IvKGNvbnN0IF9UcCYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKK3sKKyAgICBjb21wbGV4PF9UcD4gX190KF9feCk7CisgICAgX190IC89IF9feTsKKyAgICByZXR1cm4gX190OworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29tcGxleDxfVHA+CitvcGVyYXRvcisoY29uc3QgY29tcGxleDxfVHA+JiBfX3gpCit7CisgICAgcmV0dXJuIF9feDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbXBsZXg8X1RwPgorb3BlcmF0b3ItKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194KQoreworICAgIHJldHVybiBjb21wbGV4PF9UcD4oLV9feC5yZWFsKCksIC1fX3guaW1hZygpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQoreworICAgIHJldHVybiBfX3gucmVhbCgpID09IF9feS5yZWFsKCkgJiYgX194LmltYWcoKSA9PSBfX3kuaW1hZygpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5yZWFsKCkgPT0gX195ICYmIF9feC5pbWFnKCkgPT0gMDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgX1RwJiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQoreworICAgIHJldHVybiBfX3ggPT0gX195LnJlYWwoKSAmJiAwID09IF9feS5pbWFnKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitib29sCitvcGVyYXRvciE9KGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPT0gX195KTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK2Jvb2wKK29wZXJhdG9yIT0oY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX195KQoreworICAgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBfVHAmIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194ID09IF9feSk7Cit9CisKKy8vIDI2LjMuNyB2YWx1ZXM6CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGJvb2wgPSBpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgPSBpc19mbG9hdGluZ19wb2ludDxfVHA+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgPgorc3RydWN0IF9fbGliY3BwX2NvbXBsZXhfb3ZlcmxvYWRfdHJhaXRzIHt9OworCisvLyBJbnRlZ3JhbCBUeXBlcwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2xpYmNwcF9jb21wbGV4X292ZXJsb2FkX3RyYWl0czxfVHAsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgZG91YmxlIF9WYWx1ZVR5cGU7CisgICAgdHlwZWRlZiBjb21wbGV4PGRvdWJsZT4gX0NvbXBsZXhUeXBlOworfTsKKworLy8gRmxvYXRpbmcgcG9pbnQgdHlwZXMKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19saWJjcHBfY29tcGxleF9vdmVybG9hZF90cmFpdHM8X1RwLCBmYWxzZSwgdHJ1ZT4KK3sKKyAgICB0eXBlZGVmIF9UcCBfVmFsdWVUeXBlOworICAgIHR5cGVkZWYgY29tcGxleDxfVHA+IF9Db21wbGV4VHlwZTsKK307CisKKy8vIHJlYWwKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK19UcAorcmVhbChjb25zdCBjb21wbGV4PF9UcD4mIF9fYykKK3sKKyAgICByZXR1cm4gX19jLnJlYWwoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCit0eXBlbmFtZSBfX2xpYmNwcF9jb21wbGV4X292ZXJsb2FkX3RyYWl0czxfVHA+OjpfVmFsdWVUeXBlCityZWFsKF9UcCBfX3JlKQoreworICAgIHJldHVybiBfX3JlOworfQorCisvLyBpbWFnCisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitfVHAKK2ltYWcoY29uc3QgY29tcGxleDxfVHA+JiBfX2MpCit7CisgICAgcmV0dXJuIF9fYy5pbWFnKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQordHlwZW5hbWUgX19saWJjcHBfY29tcGxleF9vdmVybG9hZF90cmFpdHM8X1RwPjo6X1ZhbHVlVHlwZQoraW1hZyhfVHApCit7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIGFicworCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwCithYnMoY29uc3QgY29tcGxleDxfVHA+JiBfX2MpCit7CisgICAgcmV0dXJuIGh5cG90KF9fYy5yZWFsKCksIF9fYy5pbWFnKCkpOworfQorCisvLyBhcmcKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19UcAorYXJnKGNvbnN0IGNvbXBsZXg8X1RwPiYgX19jKQoreworICAgIHJldHVybiBhdGFuMihfX2MuaW1hZygpLCBfX2MucmVhbCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgaXNfc2FtZTxfVHAsIGxvbmcgZG91YmxlPjo6dmFsdWUsCisgICAgbG9uZyBkb3VibGUKKz46OnR5cGUKK2FyZyhfVHAgX19yZSkKK3sKKyAgICByZXR1cm4gYXRhbjJsKDAuTCwgX19yZSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZSB8fCBpc19zYW1lPF9UcCwgZG91YmxlPjo6dmFsdWUsCisgICAgZG91YmxlCis+Ojp0eXBlCithcmcoX1RwIF9fcmUpCit7CisgICAgcmV0dXJuIGF0YW4yKDAuLCBfX3JlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgaXNfc2FtZTxfVHAsIGZsb2F0Pjo6dmFsdWUsCisgICAgZmxvYXQKKz46OnR5cGUKK2FyZyhfVHAgX19yZSkKK3sKKyAgICByZXR1cm4gYXRhbjJmKDAuRiwgX19yZSk7Cit9CisKKy8vIG5vcm0KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19UcAorbm9ybShjb25zdCBjb21wbGV4PF9UcD4mIF9fYykKK3sKKyAgICBpZiAoX19saWJjcHBfaXNpbmZfb3JfYnVpbHRpbihfX2MucmVhbCgpKSkKKyAgICAgICAgcmV0dXJuIGFicyhfX2MucmVhbCgpKTsKKyAgICBpZiAoX19saWJjcHBfaXNpbmZfb3JfYnVpbHRpbihfX2MuaW1hZygpKSkKKyAgICAgICAgcmV0dXJuIGFicyhfX2MuaW1hZygpKTsKKyAgICByZXR1cm4gX19jLnJlYWwoKSAqIF9fYy5yZWFsKCkgKyBfX2MuaW1hZygpICogX19jLmltYWcoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBfX2xpYmNwcF9jb21wbGV4X292ZXJsb2FkX3RyYWl0czxfVHA+OjpfVmFsdWVUeXBlCitub3JtKF9UcCBfX3JlKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19saWJjcHBfY29tcGxleF9vdmVybG9hZF90cmFpdHM8X1RwPjo6X1ZhbHVlVHlwZSBfVmFsdWVUeXBlOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxfVmFsdWVUeXBlPihfX3JlKSAqIF9fcmU7Cit9CisKKy8vIGNvbmoKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbXBsZXg8X1RwPgorY29uaihjb25zdCBjb21wbGV4PF9UcD4mIF9fYykKK3sKKyAgICByZXR1cm4gY29tcGxleDxfVHA+KF9fYy5yZWFsKCksIC1fX2MuaW1hZygpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBfX2xpYmNwcF9jb21wbGV4X292ZXJsb2FkX3RyYWl0czxfVHA+OjpfQ29tcGxleFR5cGUKK2NvbmooX1RwIF9fcmUpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2xpYmNwcF9jb21wbGV4X292ZXJsb2FkX3RyYWl0czxfVHA+OjpfQ29tcGxleFR5cGUgX0NvbXBsZXhUeXBlOworICAgIHJldHVybiBfQ29tcGxleFR5cGUoX19yZSk7Cit9CisKKworCisvLyBwcm9qCisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb21wbGV4PF9UcD4KK3Byb2ooY29uc3QgY29tcGxleDxfVHA+JiBfX2MpCit7CisgICAgc3RkOjpjb21wbGV4PF9UcD4gX19yID0gX19jOworICAgIGlmIChfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9fYy5yZWFsKCkpIHx8IF9fbGliY3BwX2lzaW5mX29yX2J1aWx0aW4oX19jLmltYWcoKSkpCisgICAgICAgIF9fciA9IGNvbXBsZXg8X1RwPihJTkZJTklUWSwgY29weXNpZ24oX1RwKDApLCBfX2MuaW1hZygpKSk7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBpc19mbG9hdGluZ19wb2ludDxfVHA+Ojp2YWx1ZSwKKyAgICB0eXBlbmFtZSBfX2xpYmNwcF9jb21wbGV4X292ZXJsb2FkX3RyYWl0czxfVHA+OjpfQ29tcGxleFR5cGUKKz46OnR5cGUKK3Byb2ooX1RwIF9fcmUpCit7CisgICAgaWYgKF9fbGliY3BwX2lzaW5mX29yX2J1aWx0aW4oX19yZSkpCisgICAgICAgIF9fcmUgPSBhYnMoX19yZSk7CisgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3JlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZSwKKyAgICB0eXBlbmFtZSBfX2xpYmNwcF9jb21wbGV4X292ZXJsb2FkX3RyYWl0czxfVHA+OjpfQ29tcGxleFR5cGUKKz46OnR5cGUKK3Byb2ooX1RwIF9fcmUpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2xpYmNwcF9jb21wbGV4X292ZXJsb2FkX3RyYWl0czxfVHA+OjpfQ29tcGxleFR5cGUgX0NvbXBsZXhUeXBlOworICAgIHJldHVybiBfQ29tcGxleFR5cGUoX19yZSk7Cit9CisKKy8vIHBvbGFyCisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2NvbXBsZXg8X1RwPgorcG9sYXIoY29uc3QgX1RwJiBfX3JobywgY29uc3QgX1RwJiBfX3RoZXRhID0gX1RwKCkpCit7CisgICAgaWYgKF9fbGliY3BwX2lzbmFuX29yX2J1aWx0aW4oX19yaG8pIHx8IHNpZ25iaXQoX19yaG8pKQorICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KF9UcChOQU4pLCBfVHAoTkFOKSk7CisgICAgaWYgKF9fbGliY3BwX2lzbmFuX29yX2J1aWx0aW4oX190aGV0YSkpCisgICAgeworICAgICAgICBpZiAoX19saWJjcHBfaXNpbmZfb3JfYnVpbHRpbihfX3JobykpCisgICAgICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KF9fcmhvLCBfX3RoZXRhKTsKKyAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3RoZXRhLCBfX3RoZXRhKTsKKyAgICB9CisgICAgaWYgKF9fbGliY3BwX2lzaW5mX29yX2J1aWx0aW4oX190aGV0YSkpCisgICAgeworICAgICAgICBpZiAoX19saWJjcHBfaXNpbmZfb3JfYnVpbHRpbihfX3JobykpCisgICAgICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KF9fcmhvLCBfVHAoTkFOKSk7CisgICAgICAgIHJldHVybiBjb21wbGV4PF9UcD4oX1RwKE5BTiksIF9UcChOQU4pKTsKKyAgICB9CisgICAgX1RwIF9feCA9IF9fcmhvICogY29zKF9fdGhldGEpOworICAgIGlmIChfX2xpYmNwcF9pc25hbl9vcl9idWlsdGluKF9feCkpCisgICAgICAgIF9feCA9IDA7CisgICAgX1RwIF9feSA9IF9fcmhvICogc2luKF9fdGhldGEpOworICAgIGlmIChfX2xpYmNwcF9pc25hbl9vcl9idWlsdGluKF9feSkpCisgICAgICAgIF9feSA9IDA7CisgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3gsIF9feSk7Cit9CisKKy8vIGxvZworCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29tcGxleDxfVHA+Citsb2coY29uc3QgY29tcGxleDxfVHA+JiBfX3gpCit7CisgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihsb2coYWJzKF9feCkpLCBhcmcoX194KSk7Cit9CisKKy8vIGxvZzEwCisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb21wbGV4PF9UcD4KK2xvZzEwKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194KQoreworICAgIHJldHVybiBsb2coX194KSAvIGxvZyhfVHAoMTApKTsKK30KKworLy8gc3FydAorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+Citjb21wbGV4PF9UcD4KK3NxcnQoY29uc3QgY29tcGxleDxfVHA+JiBfX3gpCit7CisgICAgaWYgKF9fbGliY3BwX2lzaW5mX29yX2J1aWx0aW4oX194LmltYWcoKSkpCisgICAgICAgIHJldHVybiBjb21wbGV4PF9UcD4oX1RwKElORklOSVRZKSwgX194LmltYWcoKSk7CisgICAgaWYgKF9fbGliY3BwX2lzaW5mX29yX2J1aWx0aW4oX194LnJlYWwoKSkpCisgICAgeworICAgICAgICBpZiAoX194LnJlYWwoKSA+IF9UcCgwKSkKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV4PF9UcD4oX194LnJlYWwoKSwgX19saWJjcHBfaXNuYW5fb3JfYnVpbHRpbihfX3guaW1hZygpKSA/IF9feC5pbWFnKCkgOiBjb3B5c2lnbihfVHAoMCksIF9feC5pbWFnKCkpKTsKKyAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfX2xpYmNwcF9pc25hbl9vcl9idWlsdGluKF9feC5pbWFnKCkpID8gX194LmltYWcoKSA6IF9UcCgwKSwgY29weXNpZ24oX194LnJlYWwoKSwgX194LmltYWcoKSkpOworICAgIH0KKyAgICByZXR1cm4gcG9sYXIoc3FydChhYnMoX194KSksIGFyZyhfX3gpIC8gX1RwKDIpKTsKK30KKworLy8gZXhwCisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2NvbXBsZXg8X1RwPgorZXhwKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194KQoreworICAgIF9UcCBfX2kgPSBfX3guaW1hZygpOworICAgIGlmIChfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9feC5yZWFsKCkpKQorICAgIHsKKyAgICAgICAgaWYgKF9feC5yZWFsKCkgPCBfVHAoMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX19saWJjcHBfaXNmaW5pdGVfb3JfYnVpbHRpbihfX2kpKQorICAgICAgICAgICAgICAgIF9faSA9IF9UcCgxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChfX2kgPT0gMCB8fCAhX19saWJjcHBfaXNmaW5pdGVfb3JfYnVpbHRpbihfX2kpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX19saWJjcHBfaXNpbmZfb3JfYnVpbHRpbihfX2kpKQorICAgICAgICAgICAgICAgIF9faSA9IF9UcChOQU4pOworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3gucmVhbCgpLCBfX2kpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKF9fbGliY3BwX2lzbmFuX29yX2J1aWx0aW4oX194LnJlYWwoKSkgJiYgX194LmltYWcoKSA9PSAwKQorICAgICAgICByZXR1cm4gX194OworICAgIF9UcCBfX2UgPSBleHAoX194LnJlYWwoKSk7CisgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfX2UgKiBjb3MoX19pKSwgX19lICogc2luKF9faSkpOworfQorCisvLyBwb3cKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbXBsZXg8X1RwPgorcG93KGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKK3sKKyAgICByZXR1cm4gZXhwKF9feSAqIGxvZyhfX3gpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29tcGxleDx0eXBlbmFtZSBfX3Byb21vdGU8X1RwLCBfVXA+Ojp0eXBlPgorcG93KGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBjb21wbGV4PF9VcD4mIF9feSkKK3sKKyAgICB0eXBlZGVmIGNvbXBsZXg8dHlwZW5hbWUgX19wcm9tb3RlPF9UcCwgX1VwPjo6dHlwZT4gcmVzdWx0X3R5cGU7CisgICAgcmV0dXJuIF9WU1REOjpwb3cocmVzdWx0X3R5cGUoX194KSwgcmVzdWx0X3R5cGUoX195KSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX2FyaXRobWV0aWM8X1VwPjo6dmFsdWUsCisgICAgY29tcGxleDx0eXBlbmFtZSBfX3Byb21vdGU8X1RwLCBfVXA+Ojp0eXBlPgorPjo6dHlwZQorcG93KGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBfVXAmIF9feSkKK3sKKyAgICB0eXBlZGVmIGNvbXBsZXg8dHlwZW5hbWUgX19wcm9tb3RlPF9UcCwgX1VwPjo6dHlwZT4gcmVzdWx0X3R5cGU7CisgICAgcmV0dXJuIF9WU1REOjpwb3cocmVzdWx0X3R5cGUoX194KSwgcmVzdWx0X3R5cGUoX195KSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX2FyaXRobWV0aWM8X1RwPjo6dmFsdWUsCisgICAgY29tcGxleDx0eXBlbmFtZSBfX3Byb21vdGU8X1RwLCBfVXA+Ojp0eXBlPgorPjo6dHlwZQorcG93KGNvbnN0IF9UcCYgX194LCBjb25zdCBjb21wbGV4PF9VcD4mIF9feSkKK3sKKyAgICB0eXBlZGVmIGNvbXBsZXg8dHlwZW5hbWUgX19wcm9tb3RlPF9UcCwgX1VwPjo6dHlwZT4gcmVzdWx0X3R5cGU7CisgICAgcmV0dXJuIF9WU1REOjpwb3cocmVzdWx0X3R5cGUoX194KSwgcmVzdWx0X3R5cGUoX195KSk7Cit9CisKKy8vIF9fc3FyLCBjb21wdXRlcyBwb3coeCwgMikKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbXBsZXg8X1RwPgorX19zcXIoY29uc3QgY29tcGxleDxfVHA+JiBfX3gpCit7CisgICAgcmV0dXJuIGNvbXBsZXg8X1RwPigoX194LnJlYWwoKSAtIF9feC5pbWFnKCkpICogKF9feC5yZWFsKCkgKyBfX3guaW1hZygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9UcCgyKSAqIF9feC5yZWFsKCkgKiBfX3guaW1hZygpKTsKK30KKworLy8gYXNpbmgKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgorY29tcGxleDxfVHA+Cithc2luaChjb25zdCBjb21wbGV4PF9UcD4mIF9feCkKK3sKKyAgICBjb25zdCBfVHAgX19waShhdGFuMigrMC4sIC0wLikpOworICAgIGlmIChfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9feC5yZWFsKCkpKQorICAgIHsKKyAgICAgICAgaWYgKF9fbGliY3BwX2lzbmFuX29yX2J1aWx0aW4oX194LmltYWcoKSkpCisgICAgICAgICAgICByZXR1cm4gX194OworICAgICAgICBpZiAoX19saWJjcHBfaXNpbmZfb3JfYnVpbHRpbihfX3guaW1hZygpKSkKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV4PF9UcD4oX194LnJlYWwoKSwgY29weXNpZ24oX19waSAqIF9UcCgwLjI1KSwgX194LmltYWcoKSkpOworICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KF9feC5yZWFsKCksIGNvcHlzaWduKF9UcCgwKSwgX194LmltYWcoKSkpOworICAgIH0KKyAgICBpZiAoX19saWJjcHBfaXNuYW5fb3JfYnVpbHRpbihfX3gucmVhbCgpKSkKKyAgICB7CisgICAgICAgIGlmIChfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9feC5pbWFnKCkpKQorICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3guaW1hZygpLCBfX3gucmVhbCgpKTsKKyAgICAgICAgaWYgKF9feC5pbWFnKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBfX3g7CisgICAgICAgIHJldHVybiBjb21wbGV4PF9UcD4oX194LnJlYWwoKSwgX194LnJlYWwoKSk7CisgICAgfQorICAgIGlmIChfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9feC5pbWFnKCkpKQorICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KGNvcHlzaWduKF9feC5pbWFnKCksIF9feC5yZWFsKCkpLCBjb3B5c2lnbihfX3BpL19UcCgyKSwgX194LmltYWcoKSkpOworICAgIGNvbXBsZXg8X1RwPiBfX3ogPSBsb2coX194ICsgc3FydChfX3NxcihfX3gpICsgX1RwKDEpKSk7CisgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihjb3B5c2lnbihfX3oucmVhbCgpLCBfX3gucmVhbCgpKSwgY29weXNpZ24oX196LmltYWcoKSwgX194LmltYWcoKSkpOworfQorCisvLyBhY29zaAorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+Citjb21wbGV4PF9UcD4KK2Fjb3NoKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194KQoreworICAgIGNvbnN0IF9UcCBfX3BpKGF0YW4yKCswLiwgLTAuKSk7CisgICAgaWYgKF9fbGliY3BwX2lzaW5mX29yX2J1aWx0aW4oX194LnJlYWwoKSkpCisgICAgeworICAgICAgICBpZiAoX19saWJjcHBfaXNuYW5fb3JfYnVpbHRpbihfX3guaW1hZygpKSkKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV4PF9UcD4oYWJzKF9feC5yZWFsKCkpLCBfX3guaW1hZygpKTsKKyAgICAgICAgaWYgKF9fbGliY3BwX2lzaW5mX29yX2J1aWx0aW4oX194LmltYWcoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX3gucmVhbCgpID4gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KF9feC5yZWFsKCksIGNvcHlzaWduKF9fcGkgKiBfVHAoMC4yNSksIF9feC5pbWFnKCkpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KC1fX3gucmVhbCgpLCBjb3B5c2lnbihfX3BpICogX1RwKDAuNzUpLCBfX3guaW1hZygpKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9feC5yZWFsKCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPigtX194LnJlYWwoKSwgY29weXNpZ24oX19waSwgX194LmltYWcoKSkpOworICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KF9feC5yZWFsKCksIGNvcHlzaWduKF9UcCgwKSwgX194LmltYWcoKSkpOworICAgIH0KKyAgICBpZiAoX19saWJjcHBfaXNuYW5fb3JfYnVpbHRpbihfX3gucmVhbCgpKSkKKyAgICB7CisgICAgICAgIGlmIChfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9feC5pbWFnKCkpKQorICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihhYnMoX194LmltYWcoKSksIF9feC5yZWFsKCkpOworICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KF9feC5yZWFsKCksIF9feC5yZWFsKCkpOworICAgIH0KKyAgICBpZiAoX19saWJjcHBfaXNpbmZfb3JfYnVpbHRpbihfX3guaW1hZygpKSkKKyAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihhYnMoX194LmltYWcoKSksIGNvcHlzaWduKF9fcGkvX1RwKDIpLCBfX3guaW1hZygpKSk7CisgICAgY29tcGxleDxfVHA+IF9feiA9IGxvZyhfX3ggKyBzcXJ0KF9fc3FyKF9feCkgLSBfVHAoMSkpKTsKKyAgICByZXR1cm4gY29tcGxleDxfVHA+KGNvcHlzaWduKF9fei5yZWFsKCksIF9UcCgwKSksIGNvcHlzaWduKF9fei5pbWFnKCksIF9feC5pbWFnKCkpKTsKK30KKworLy8gYXRhbmgKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgorY29tcGxleDxfVHA+CithdGFuaChjb25zdCBjb21wbGV4PF9UcD4mIF9feCkKK3sKKyAgICBjb25zdCBfVHAgX19waShhdGFuMigrMC4sIC0wLikpOworICAgIGlmIChfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9feC5pbWFnKCkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihjb3B5c2lnbihfVHAoMCksIF9feC5yZWFsKCkpLCBjb3B5c2lnbihfX3BpL19UcCgyKSwgX194LmltYWcoKSkpOworICAgIH0KKyAgICBpZiAoX19saWJjcHBfaXNuYW5fb3JfYnVpbHRpbihfX3guaW1hZygpKSkKKyAgICB7CisgICAgICAgIGlmIChfX2xpYmNwcF9pc2luZl9vcl9idWlsdGluKF9feC5yZWFsKCkpIHx8IF9feC5yZWFsKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV4PF9UcD4oY29weXNpZ24oX1RwKDApLCBfX3gucmVhbCgpKSwgX194LmltYWcoKSk7CisgICAgICAgIHJldHVybiBjb21wbGV4PF9UcD4oX194LmltYWcoKSwgX194LmltYWcoKSk7CisgICAgfQorICAgIGlmIChfX2xpYmNwcF9pc25hbl9vcl9idWlsdGluKF9feC5yZWFsKCkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3gucmVhbCgpLCBfX3gucmVhbCgpKTsKKyAgICB9CisgICAgaWYgKF9fbGliY3BwX2lzaW5mX29yX2J1aWx0aW4oX194LnJlYWwoKSkpCisgICAgeworICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KGNvcHlzaWduKF9UcCgwKSwgX194LnJlYWwoKSksIGNvcHlzaWduKF9fcGkvX1RwKDIpLCBfX3guaW1hZygpKSk7CisgICAgfQorICAgIGlmIChhYnMoX194LnJlYWwoKSkgPT0gX1RwKDEpICYmIF9feC5pbWFnKCkgPT0gX1RwKDApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihjb3B5c2lnbihfVHAoSU5GSU5JVFkpLCBfX3gucmVhbCgpKSwgY29weXNpZ24oX1RwKDApLCBfX3guaW1hZygpKSk7CisgICAgfQorICAgIGNvbXBsZXg8X1RwPiBfX3ogPSBsb2coKF9UcCgxKSArIF9feCkgLyAoX1RwKDEpIC0gX194KSkgLyBfVHAoMik7CisgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihjb3B5c2lnbihfX3oucmVhbCgpLCBfX3gucmVhbCgpKSwgY29weXNpZ24oX196LmltYWcoKSwgX194LmltYWcoKSkpOworfQorCisvLyBzaW5oCisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2NvbXBsZXg8X1RwPgorc2luaChjb25zdCBjb21wbGV4PF9UcD4mIF9feCkKK3sKKyAgICBpZiAoX19saWJjcHBfaXNpbmZfb3JfYnVpbHRpbihfX3gucmVhbCgpKSAmJiAhX19saWJjcHBfaXNmaW5pdGVfb3JfYnVpbHRpbihfX3guaW1hZygpKSkKKyAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3gucmVhbCgpLCBfVHAoTkFOKSk7CisgICAgaWYgKF9feC5yZWFsKCkgPT0gMCAmJiAhX19saWJjcHBfaXNmaW5pdGVfb3JfYnVpbHRpbihfX3guaW1hZygpKSkKKyAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3gucmVhbCgpLCBfVHAoTkFOKSk7CisgICAgaWYgKF9feC5pbWFnKCkgPT0gMCAmJiAhX19saWJjcHBfaXNmaW5pdGVfb3JfYnVpbHRpbihfX3gucmVhbCgpKSkKKyAgICAgICAgcmV0dXJuIF9feDsKKyAgICByZXR1cm4gY29tcGxleDxfVHA+KHNpbmgoX194LnJlYWwoKSkgKiBjb3MoX194LmltYWcoKSksIGNvc2goX194LnJlYWwoKSkgKiBzaW4oX194LmltYWcoKSkpOworfQorCisvLyBjb3NoCisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2NvbXBsZXg8X1RwPgorY29zaChjb25zdCBjb21wbGV4PF9UcD4mIF9feCkKK3sKKyAgICBpZiAoX19saWJjcHBfaXNpbmZfb3JfYnVpbHRpbihfX3gucmVhbCgpKSAmJiAhX19saWJjcHBfaXNmaW5pdGVfb3JfYnVpbHRpbihfX3guaW1hZygpKSkKKyAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihhYnMoX194LnJlYWwoKSksIF9UcChOQU4pKTsKKyAgICBpZiAoX194LnJlYWwoKSA9PSAwICYmICFfX2xpYmNwcF9pc2Zpbml0ZV9vcl9idWlsdGluKF9feC5pbWFnKCkpKQorICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KF9UcChOQU4pLCBfX3gucmVhbCgpKTsKKyAgICBpZiAoX194LnJlYWwoKSA9PSAwICYmIF9feC5pbWFnKCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfVHAoMSksIF9feC5pbWFnKCkpOworICAgIGlmIChfX3guaW1hZygpID09IDAgJiYgIV9fbGliY3BwX2lzZmluaXRlX29yX2J1aWx0aW4oX194LnJlYWwoKSkpCisgICAgICAgIHJldHVybiBjb21wbGV4PF9UcD4oYWJzKF9feC5yZWFsKCkpLCBfX3guaW1hZygpKTsKKyAgICByZXR1cm4gY29tcGxleDxfVHA+KGNvc2goX194LnJlYWwoKSkgKiBjb3MoX194LmltYWcoKSksIHNpbmgoX194LnJlYWwoKSkgKiBzaW4oX194LmltYWcoKSkpOworfQorCisvLyB0YW5oCisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2NvbXBsZXg8X1RwPgordGFuaChjb25zdCBjb21wbGV4PF9UcD4mIF9feCkKK3sKKyAgICBpZiAoX19saWJjcHBfaXNpbmZfb3JfYnVpbHRpbihfX3gucmVhbCgpKSkKKyAgICB7CisgICAgICAgIGlmICghX19saWJjcHBfaXNmaW5pdGVfb3JfYnVpbHRpbihfX3guaW1hZygpKSkKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV4PF9UcD4oX1RwKDEpLCBfVHAoMCkpOworICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KF9UcCgxKSwgY29weXNpZ24oX1RwKDApLCBzaW4oX1RwKDIpICogX194LmltYWcoKSkpKTsKKyAgICB9CisgICAgaWYgKF9fbGliY3BwX2lzbmFuX29yX2J1aWx0aW4oX194LnJlYWwoKSkgJiYgX194LmltYWcoKSA9PSAwKQorICAgICAgICByZXR1cm4gX194OworICAgIF9UcCBfXzJyKF9UcCgyKSAqIF9feC5yZWFsKCkpOworICAgIF9UcCBfXzJpKF9UcCgyKSAqIF9feC5pbWFnKCkpOworICAgIF9UcCBfX2QoY29zaChfXzJyKSArIGNvcyhfXzJpKSk7CisgICAgX1RwIF9fMnJzaChzaW5oKF9fMnIpKTsKKyAgICBpZiAoX19saWJjcHBfaXNpbmZfb3JfYnVpbHRpbihfXzJyc2gpICYmIF9fbGliY3BwX2lzaW5mX29yX2J1aWx0aW4oX19kKSkKKyAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfXzJyc2ggPiBfVHAoMCkgPyBfVHAoMSkgOiBfVHAoLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fMmkgPiBfVHAoMCkgPyBfVHAoMCkgOiBfVHAoLTAuKSk7CisgICAgcmV0dXJuICBjb21wbGV4PF9UcD4oX18ycnNoL19fZCwgc2luKF9fMmkpL19fZCk7Cit9CisKKy8vIGFzaW4KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgorY29tcGxleDxfVHA+Cithc2luKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194KQoreworICAgIGNvbXBsZXg8X1RwPiBfX3ogPSBhc2luaChjb21wbGV4PF9UcD4oLV9feC5pbWFnKCksIF9feC5yZWFsKCkpKTsKKyAgICByZXR1cm4gY29tcGxleDxfVHA+KF9fei5pbWFnKCksIC1fX3oucmVhbCgpKTsKK30KKworLy8gYWNvcworCit0ZW1wbGF0ZTxjbGFzcyBfVHA+Citjb21wbGV4PF9UcD4KK2Fjb3MoY29uc3QgY29tcGxleDxfVHA+JiBfX3gpCit7CisgICAgY29uc3QgX1RwIF9fcGkoYXRhbjIoKzAuLCAtMC4pKTsKKyAgICBpZiAoX19saWJjcHBfaXNpbmZfb3JfYnVpbHRpbihfX3gucmVhbCgpKSkKKyAgICB7CisgICAgICAgIGlmIChfX2xpYmNwcF9pc25hbl9vcl9idWlsdGluKF9feC5pbWFnKCkpKQorICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3guaW1hZygpLCBfX3gucmVhbCgpKTsKKyAgICAgICAgaWYgKF9fbGliY3BwX2lzaW5mX29yX2J1aWx0aW4oX194LmltYWcoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX3gucmVhbCgpIDwgX1RwKDApKQorICAgICAgICAgICAgICAgIHJldHVybiBjb21wbGV4PF9UcD4oX1RwKDAuNzUpICogX19waSwgLV9feC5pbWFnKCkpOworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfVHAoMC4yNSkgKiBfX3BpLCAtX194LmltYWcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9feC5yZWFsKCkgPCBfVHAoMCkpCisgICAgICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KF9fcGksIHNpZ25iaXQoX194LmltYWcoKSkgPyAtX194LnJlYWwoKSA6IF9feC5yZWFsKCkpOworICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KF9UcCgwKSwgc2lnbmJpdChfX3guaW1hZygpKSA/IF9feC5yZWFsKCkgOiAtX194LnJlYWwoKSk7CisgICAgfQorICAgIGlmIChfX2xpYmNwcF9pc25hbl9vcl9idWlsdGluKF9feC5yZWFsKCkpKQorICAgIHsKKyAgICAgICAgaWYgKF9fbGliY3BwX2lzaW5mX29yX2J1aWx0aW4oX194LmltYWcoKSkpCisgICAgICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KF9feC5yZWFsKCksIC1fX3guaW1hZygpKTsKKyAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3gucmVhbCgpLCBfX3gucmVhbCgpKTsKKyAgICB9CisgICAgaWYgKF9fbGliY3BwX2lzaW5mX29yX2J1aWx0aW4oX194LmltYWcoKSkpCisgICAgICAgIHJldHVybiBjb21wbGV4PF9UcD4oX19waS9fVHAoMiksIC1fX3guaW1hZygpKTsKKyAgICBpZiAoX194LnJlYWwoKSA9PSAwICYmIChfX3guaW1hZygpID09IDAgfHwgaXNuYW4oX194LmltYWcoKSkpKQorICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KF9fcGkvX1RwKDIpLCAtX194LmltYWcoKSk7CisgICAgY29tcGxleDxfVHA+IF9feiA9IGxvZyhfX3ggKyBzcXJ0KF9fc3FyKF9feCkgLSBfVHAoMSkpKTsKKyAgICBpZiAoc2lnbmJpdChfX3guaW1hZygpKSkKKyAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihhYnMoX196LmltYWcoKSksIGFicyhfX3oucmVhbCgpKSk7CisgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihhYnMoX196LmltYWcoKSksIC1hYnMoX196LnJlYWwoKSkpOworfQorCisvLyBhdGFuCisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2NvbXBsZXg8X1RwPgorYXRhbihjb25zdCBjb21wbGV4PF9UcD4mIF9feCkKK3sKKyAgICBjb21wbGV4PF9UcD4gX196ID0gYXRhbmgoY29tcGxleDxfVHA+KC1fX3guaW1hZygpLCBfX3gucmVhbCgpKSk7CisgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3ouaW1hZygpLCAtX196LnJlYWwoKSk7Cit9CisKKy8vIHNpbgorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+Citjb21wbGV4PF9UcD4KK3Npbihjb25zdCBjb21wbGV4PF9UcD4mIF9feCkKK3sKKyAgICBjb21wbGV4PF9UcD4gX196ID0gc2luaChjb21wbGV4PF9UcD4oLV9feC5pbWFnKCksIF9feC5yZWFsKCkpKTsKKyAgICByZXR1cm4gY29tcGxleDxfVHA+KF9fei5pbWFnKCksIC1fX3oucmVhbCgpKTsKK30KKworLy8gY29zCisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb21wbGV4PF9UcD4KK2Nvcyhjb25zdCBjb21wbGV4PF9UcD4mIF9feCkKK3sKKyAgICByZXR1cm4gY29zaChjb21wbGV4PF9UcD4oLV9feC5pbWFnKCksIF9feC5yZWFsKCkpKTsKK30KKworLy8gdGFuCisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2NvbXBsZXg8X1RwPgordGFuKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194KQoreworICAgIGNvbXBsZXg8X1RwPiBfX3ogPSB0YW5oKGNvbXBsZXg8X1RwPigtX194LmltYWcoKSwgX194LnJlYWwoKSkpOworICAgIHJldHVybiBjb21wbGV4PF9UcD4oX196LmltYWcoKSwgLV9fei5yZWFsKCkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCBjb21wbGV4PF9UcD4mIF9feCkKK3sKKyAgICBpZiAoX19pcy5nb29kKCkpCisgICAgeworICAgICAgICB3cyhfX2lzKTsKKyAgICAgICAgaWYgKF9faXMucGVlaygpID09IF9DaGFyVCgnKCcpKQorICAgICAgICB7CisgICAgICAgICAgICBfX2lzLmdldCgpOworICAgICAgICAgICAgX1RwIF9fcjsKKyAgICAgICAgICAgIF9faXMgPj4gX19yOworICAgICAgICAgICAgaWYgKCFfX2lzLmZhaWwoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cyhfX2lzKTsKKyAgICAgICAgICAgICAgICBfQ2hhclQgX19jID0gX19pcy5wZWVrKCk7CisgICAgICAgICAgICAgICAgaWYgKF9fYyA9PSBfQ2hhclQoJywnKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9faXMuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIF9UcCBfX2k7CisgICAgICAgICAgICAgICAgICAgIF9faXMgPj4gX19pOworICAgICAgICAgICAgICAgICAgICBpZiAoIV9faXMuZmFpbCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cyhfX2lzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYyA9IF9faXMucGVlaygpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fYyA9PSBfQ2hhclQoJyknKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2lzLmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9feCA9IGNvbXBsZXg8X1RwPihfX3IsIF9faSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pcy5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgX19pcy5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9fYyA9PSBfQ2hhclQoJyknKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9faXMuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIF9feCA9IGNvbXBsZXg8X1RwPihfX3IsIF9UcCgwKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgX19pcy5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX19pcy5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfVHAgX19yOworICAgICAgICAgICAgX19pcyA+PiBfX3I7CisgICAgICAgICAgICBpZiAoIV9faXMuZmFpbCgpKQorICAgICAgICAgICAgICAgIF9feCA9IGNvbXBsZXg8X1RwPihfX3IsIF9UcCgwKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX19pcy5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBfX2lzLnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgICByZXR1cm4gX19pczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgY29uc3QgY29tcGxleDxfVHA+JiBfX3gpCit7CisgICAgYmFzaWNfb3N0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IF9fczsKKyAgICBfX3MuZmxhZ3MoX19vcy5mbGFncygpKTsKKyAgICBfX3MuaW1idWUoX19vcy5nZXRsb2MoKSk7CisgICAgX19zLnByZWNpc2lvbihfX29zLnByZWNpc2lvbigpKTsKKyAgICBfX3MgPDwgJygnIDw8IF9feC5yZWFsKCkgPDwgJywnIDw8IF9feC5pbWFnKCkgPDwgJyknOworICAgIHJldHVybiBfX29zIDw8IF9fcy5zdHIoKTsKK30KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExIAorLy8gTGl0ZXJhbCBzdWZmaXggZm9yIGNvbXBsZXggbnVtYmVyIGxpdGVyYWxzIFtjb21wbGV4LmxpdGVyYWxzXQoraW5saW5lIG5hbWVzcGFjZSBsaXRlcmFscworeyAKKyAgaW5saW5lIG5hbWVzcGFjZSBjb21wbGV4X2xpdGVyYWxzCisgIHsKKyAgICBjb25zdGV4cHIgY29tcGxleDxsb25nIGRvdWJsZT4gb3BlcmF0b3IiImlsKGxvbmcgZG91YmxlIF9faW0pCisgICAgeworICAgICAgICByZXR1cm4geyAwLjBsLCBfX2ltIH07CisgICAgfQorCisgICAgY29uc3RleHByIGNvbXBsZXg8bG9uZyBkb3VibGU+IG9wZXJhdG9yIiJpbCh1bnNpZ25lZCBsb25nIGxvbmcgX19pbSkKKyAgICB7CisgICAgICAgIHJldHVybiB7IDAuMGwsIHN0YXRpY19jYXN0PGxvbmcgZG91YmxlPihfX2ltKSB9OworICAgIH0KKworCisgICAgY29uc3RleHByIGNvbXBsZXg8ZG91YmxlPiBvcGVyYXRvciIiaShsb25nIGRvdWJsZSBfX2ltKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHsgMC4wLCBzdGF0aWNfY2FzdDxkb3VibGU+KF9faW0pIH07CisgICAgfQorCisgICAgY29uc3RleHByIGNvbXBsZXg8ZG91YmxlPiBvcGVyYXRvciIiaSh1bnNpZ25lZCBsb25nIGxvbmcgX19pbSkKKyAgICB7CisgICAgICAgIHJldHVybiB7IDAuMCwgc3RhdGljX2Nhc3Q8ZG91YmxlPihfX2ltKSB9OworICAgIH0KKworCisgICAgY29uc3RleHByIGNvbXBsZXg8ZmxvYXQ+IG9wZXJhdG9yIiJpZihsb25nIGRvdWJsZSBfX2ltKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHsgMC4wZiwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KF9faW0pIH07CisgICAgfQorCisgICAgY29uc3RleHByIGNvbXBsZXg8ZmxvYXQ+IG9wZXJhdG9yIiJpZih1bnNpZ25lZCBsb25nIGxvbmcgX19pbSkKKyAgICB7CisgICAgICAgIHJldHVybiB7IDAuMGYsIHN0YXRpY19jYXN0PGZsb2F0PihfX2ltKSB9OworICAgIH0KKyAgfQorfQorI2VuZGlmCisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX0NPTVBMRVgKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jb21wbGV4LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY29tcGxleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMzU5NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY29tcGxleC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb21wbGV4LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfQ09NUExFWF9ICisjZGVmaW5lIF9MSUJDUFBfQ09NUExFWF9ICisKKy8qCisgICAgY29tcGxleC5oIHN5bm9wc2lzCisKKyNpbmNsdWRlIDxjY29tcGxleD4KKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKyNpbmNsdWRlIDxjY29tcGxleD4KKworI2Vsc2UgIC8vIF9fY3BsdXNwbHVzCisKKyNpbmNsdWRlX25leHQgPGNvbXBsZXguaD4KKworI2VuZGlmICAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgIC8vIF9MSUJDUFBfQ09NUExFWF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY29uZGl0aW9uX3ZhcmlhYmxlIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NvbmRpdGlvbl92YXJpYWJsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDVhMzI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NvbmRpdGlvbl92YXJpYWJsZQpAQCAtMCwwICsxLDI2OSBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25kaXRpb25fdmFyaWFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9DT05ESVRJT05fVkFSSUFCTEUKKyNkZWZpbmUgX0xJQkNQUF9DT05ESVRJT05fVkFSSUFCTEUKKworLyoKKyAgICBjb25kaXRpb25fdmFyaWFibGUgc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCitlbnVtIGNsYXNzIGN2X3N0YXR1cyB7IG5vX3RpbWVvdXQsIHRpbWVvdXQgfTsKKworY2xhc3MgY29uZGl0aW9uX3ZhcmlhYmxlCit7CitwdWJsaWM6CisgICAgY29uZGl0aW9uX3ZhcmlhYmxlKCk7CisgICAgfmNvbmRpdGlvbl92YXJpYWJsZSgpOworCisgICAgY29uZGl0aW9uX3ZhcmlhYmxlKGNvbnN0IGNvbmRpdGlvbl92YXJpYWJsZSYpID0gZGVsZXRlOworICAgIGNvbmRpdGlvbl92YXJpYWJsZSYgb3BlcmF0b3I9KGNvbnN0IGNvbmRpdGlvbl92YXJpYWJsZSYpID0gZGVsZXRlOworCisgICAgdm9pZCBub3RpZnlfb25lKCkgbm9leGNlcHQ7CisgICAgdm9pZCBub3RpZnlfYWxsKCkgbm9leGNlcHQ7CisKKyAgICB2b2lkIHdhaXQodW5pcXVlX2xvY2s8bXV0ZXg+JiBsb2NrKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUHJlZGljYXRlPgorICAgICAgICB2b2lkIHdhaXQodW5pcXVlX2xvY2s8bXV0ZXg+JiBsb2NrLCBQcmVkaWNhdGUgcHJlZCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xvY2ssIGNsYXNzIER1cmF0aW9uPgorICAgICAgICBjdl9zdGF0dXMKKyAgICAgICAgd2FpdF91bnRpbCh1bmlxdWVfbG9jazxtdXRleD4mIGxvY2ssCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PENsb2NrLCBEdXJhdGlvbj4mIGFic190aW1lKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBDbG9jaywgY2xhc3MgRHVyYXRpb24sIGNsYXNzIFByZWRpY2F0ZT4KKyAgICAgICAgYm9vbAorICAgICAgICB3YWl0X3VudGlsKHVuaXF1ZV9sb2NrPG11dGV4PiYgbG9jaywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUsCisgICAgICAgICAgICAgICAgICAgUHJlZGljYXRlIHByZWQpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIFJlcCwgY2xhc3MgUGVyaW9kPgorICAgICAgICBjdl9zdGF0dXMKKyAgICAgICAgd2FpdF9mb3IodW5pcXVlX2xvY2s8bXV0ZXg+JiBsb2NrLAorICAgICAgICAgICAgICAgICBjb25zdCBjaHJvbm86OmR1cmF0aW9uPFJlcCwgUGVyaW9kPiYgcmVsX3RpbWUpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIFJlcCwgY2xhc3MgUGVyaW9kLCBjbGFzcyBQcmVkaWNhdGU+CisgICAgICAgIGJvb2wKKyAgICAgICAgd2FpdF9mb3IodW5pcXVlX2xvY2s8bXV0ZXg+JiBsb2NrLAorICAgICAgICAgICAgICAgICBjb25zdCBjaHJvbm86OmR1cmF0aW9uPFJlcCwgUGVyaW9kPiYgcmVsX3RpbWUsCisgICAgICAgICAgICAgICAgIFByZWRpY2F0ZSBwcmVkKTsKKworICAgIHR5cGVkZWYgcHRocmVhZF9jb25kX3QqIG5hdGl2ZV9oYW5kbGVfdHlwZTsKKyAgICBuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZSgpOworfTsKKwordm9pZCBub3RpZnlfYWxsX2F0X3RocmVhZF9leGl0KGNvbmRpdGlvbl92YXJpYWJsZSYgY29uZCwgdW5pcXVlX2xvY2s8bXV0ZXg+IGxrKTsKKworY2xhc3MgY29uZGl0aW9uX3ZhcmlhYmxlX2FueQoreworcHVibGljOgorICAgIGNvbmRpdGlvbl92YXJpYWJsZV9hbnkoKTsKKyAgICB+Y29uZGl0aW9uX3ZhcmlhYmxlX2FueSgpOworCisgICAgY29uZGl0aW9uX3ZhcmlhYmxlX2FueShjb25zdCBjb25kaXRpb25fdmFyaWFibGVfYW55JikgPSBkZWxldGU7CisgICAgY29uZGl0aW9uX3ZhcmlhYmxlX2FueSYgb3BlcmF0b3I9KGNvbnN0IGNvbmRpdGlvbl92YXJpYWJsZV9hbnkmKSA9IGRlbGV0ZTsKKworICAgIHZvaWQgbm90aWZ5X29uZSgpIG5vZXhjZXB0OworICAgIHZvaWQgbm90aWZ5X2FsbCgpIG5vZXhjZXB0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIExvY2s+CisgICAgICAgIHZvaWQgd2FpdChMb2NrJiBsb2NrKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgTG9jaywgY2xhc3MgUHJlZGljYXRlPgorICAgICAgICB2b2lkIHdhaXQoTG9jayYgbG9jaywgUHJlZGljYXRlIHByZWQpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIExvY2ssIGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbj4KKyAgICAgICAgY3Zfc3RhdHVzCisgICAgICAgIHdhaXRfdW50aWwoTG9jayYgbG9jaywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIExvY2ssIGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbiwgY2xhc3MgUHJlZGljYXRlPgorICAgICAgICBib29sCisgICAgICAgIHdhaXRfdW50aWwoTG9jayYgbG9jaywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUsCisgICAgICAgICAgICAgICAgICAgUHJlZGljYXRlIHByZWQpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIExvY2ssIGNsYXNzIFJlcCwgY2xhc3MgUGVyaW9kPgorICAgICAgICBjdl9zdGF0dXMKKyAgICAgICAgd2FpdF9mb3IoTG9jayYgbG9jaywKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hyb25vOjpkdXJhdGlvbjxSZXAsIFBlcmlvZD4mIHJlbF90aW1lKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBMb2NrLCBjbGFzcyBSZXAsIGNsYXNzIFBlcmlvZCwgY2xhc3MgUHJlZGljYXRlPgorICAgICAgICBib29sCisgICAgICAgIHdhaXRfZm9yKExvY2smIGxvY2ssCisgICAgICAgICAgICAgICAgIGNvbnN0IGNocm9ubzo6ZHVyYXRpb248UmVwLCBQZXJpb2Q+JiByZWxfdGltZSwKKyAgICAgICAgICAgICAgICAgUHJlZGljYXRlIHByZWQpOworfTsKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxfX211dGV4X2Jhc2U+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19USFJFQURTCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIGNvbmRpdGlvbl92YXJpYWJsZV9hbnkKK3sKKyAgICBjb25kaXRpb25fdmFyaWFibGUgX19jdl87CisgICAgc2hhcmVkX3B0cjxtdXRleD4gIF9fbXV0XzsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uZGl0aW9uX3ZhcmlhYmxlX2FueSgpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgbm90aWZ5X29uZSgpIF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBub3RpZnlfYWxsKCkgX05PRVhDRVBUOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9Mb2NrPgorICAgICAgICBfTElCQ1BQX01FVEhPRF9URU1QTEFURV9JTVBMSUNJVF9JTlNUQU5USUFUSU9OX1ZJUworICAgICAgICB2b2lkIHdhaXQoX0xvY2smIF9fbG9jayk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Mb2NrLCBjbGFzcyBfUHJlZGljYXRlPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQgd2FpdChfTG9jayYgX19sb2NrLCBfUHJlZGljYXRlIF9fcHJlZCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0xvY2ssIGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgorICAgICAgICBfTElCQ1BQX01FVEhPRF9URU1QTEFURV9JTVBMSUNJVF9JTlNUQU5USUFUSU9OX1ZJUworICAgICAgICBjdl9zdGF0dXMKKyAgICAgICAgd2FpdF91bnRpbChfTG9jayYgX19sb2NrLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fdCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0xvY2ssIGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uLCBjbGFzcyBfUHJlZGljYXRlPgorICAgICAgICBib29sCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgd2FpdF91bnRpbChfTG9jayYgX19sb2NrLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fdCwKKyAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0xvY2ssIGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CisgICAgICAgIGN2X3N0YXR1cworICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHdhaXRfZm9yKF9Mb2NrJiBfX2xvY2ssCisgICAgICAgICAgICAgICAgIGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fZCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0xvY2ssIGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2QsIGNsYXNzIF9QcmVkaWNhdGU+CisgICAgICAgIGJvb2wKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB3YWl0X2ZvcihfTG9jayYgX19sb2NrLAorICAgICAgICAgICAgICAgICBjb25zdCBjaHJvbm86OmR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX2QsCisgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkKTsKK307CisKK2lubGluZQorY29uZGl0aW9uX3ZhcmlhYmxlX2FueTo6Y29uZGl0aW9uX3ZhcmlhYmxlX2FueSgpCisgICAgOiBfX211dF8obWFrZV9zaGFyZWQ8bXV0ZXg+KCkpIHt9CisKK2lubGluZQordm9pZAorY29uZGl0aW9uX3ZhcmlhYmxlX2FueTo6bm90aWZ5X29uZSgpIF9OT0VYQ0VQVAoreworICAgIHtsb2NrX2d1YXJkPG11dGV4PiBfX2x4KCpfX211dF8pO30KKyAgICBfX2N2Xy5ub3RpZnlfb25lKCk7Cit9CisKK2lubGluZQordm9pZAorY29uZGl0aW9uX3ZhcmlhYmxlX2FueTo6bm90aWZ5X2FsbCgpIF9OT0VYQ0VQVAoreworICAgIHtsb2NrX2d1YXJkPG11dGV4PiBfX2x4KCpfX211dF8pO30KKyAgICBfX2N2Xy5ub3RpZnlfYWxsKCk7Cit9CisKK3N0cnVjdCBfX2xvY2tfZXh0ZXJuYWwKK3sKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0xvY2s+CisgICAgdm9pZCBvcGVyYXRvcigpKF9Mb2NrKiBfX20pIHtfX20tPmxvY2soKTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0xvY2s+Cit2b2lkCitjb25kaXRpb25fdmFyaWFibGVfYW55Ojp3YWl0KF9Mb2NrJiBfX2xvY2spCit7CisgICAgc2hhcmVkX3B0cjxtdXRleD4gX19tdXQgPSBfX211dF87CisgICAgdW5pcXVlX2xvY2s8bXV0ZXg+IF9fbGsoKl9fbXV0KTsKKyAgICBfX2xvY2sudW5sb2NrKCk7CisgICAgdW5pcXVlX3B0cjxfTG9jaywgX19sb2NrX2V4dGVybmFsPiBfX2x4eCgmX19sb2NrKTsKKyAgICBsb2NrX2d1YXJkPHVuaXF1ZV9sb2NrPG11dGV4PiA+IF9fbHgoX19saywgYWRvcHRfbG9jayk7CisgICAgX19jdl8ud2FpdChfX2xrKTsKK30gIC8vIF9fbXV0Xy51bmxvY2soKSwgX19sb2NrLmxvY2soKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0xvY2ssIGNsYXNzIF9QcmVkaWNhdGU+CitpbmxpbmUKK3ZvaWQKK2NvbmRpdGlvbl92YXJpYWJsZV9hbnk6OndhaXQoX0xvY2smIF9fbG9jaywgX1ByZWRpY2F0ZSBfX3ByZWQpCit7CisgICAgd2hpbGUgKCFfX3ByZWQoKSkKKyAgICAgICAgd2FpdChfX2xvY2spOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0xvY2ssIGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgorY3Zfc3RhdHVzCitjb25kaXRpb25fdmFyaWFibGVfYW55Ojp3YWl0X3VudGlsKF9Mb2NrJiBfX2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fdCkKK3sKKyAgICBzaGFyZWRfcHRyPG11dGV4PiBfX211dCA9IF9fbXV0XzsKKyAgICB1bmlxdWVfbG9jazxtdXRleD4gX19saygqX19tdXQpOworICAgIF9fbG9jay51bmxvY2soKTsKKyAgICB1bmlxdWVfcHRyPF9Mb2NrLCBfX2xvY2tfZXh0ZXJuYWw+IF9fbHh4KCZfX2xvY2spOworICAgIGxvY2tfZ3VhcmQ8dW5pcXVlX2xvY2s8bXV0ZXg+ID4gX19seChfX2xrLCBhZG9wdF9sb2NrKTsKKyAgICByZXR1cm4gX19jdl8ud2FpdF91bnRpbChfX2xrLCBfX3QpOworfSAgLy8gX19tdXRfLnVubG9jaygpLCBfX2xvY2subG9jaygpCisKK3RlbXBsYXRlIDxjbGFzcyBfTG9jaywgY2xhc3MgX0Nsb2NrLCBjbGFzcyBfRHVyYXRpb24sIGNsYXNzIF9QcmVkaWNhdGU+CitpbmxpbmUKK2Jvb2wKK2NvbmRpdGlvbl92YXJpYWJsZV9hbnk6OndhaXRfdW50aWwoX0xvY2smIF9fbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX190LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCkKK3sKKyAgICB3aGlsZSAoIV9fcHJlZCgpKQorICAgICAgICBpZiAod2FpdF91bnRpbChfX2xvY2ssIF9fdCkgPT0gY3Zfc3RhdHVzOjp0aW1lb3V0KQorICAgICAgICAgICAgcmV0dXJuIF9fcHJlZCgpOworICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0xvY2ssIGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CitpbmxpbmUKK2N2X3N0YXR1cworY29uZGl0aW9uX3ZhcmlhYmxlX2FueTo6d2FpdF9mb3IoX0xvY2smIF9fbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fZCkKK3sKKyAgICByZXR1cm4gd2FpdF91bnRpbChfX2xvY2ssIGNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSArIF9fZCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfTG9jaywgY2xhc3MgX1JlcCwgY2xhc3MgX1BlcmlvZCwgY2xhc3MgX1ByZWRpY2F0ZT4KK2lubGluZQorYm9vbAorY29uZGl0aW9uX3ZhcmlhYmxlX2FueTo6d2FpdF9mb3IoX0xvY2smIF9fbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkKQoreworICAgIHJldHVybiB3YWl0X3VudGlsKF9fbG9jaywgY2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgX19kLAorICAgICAgICAgICAgICAgICAgICAgIF9WU1REOjptb3ZlKF9fcHJlZCkpOworfQorCitfTElCQ1BQX0ZVTkNfVklTCit2b2lkIG5vdGlmeV9hbGxfYXRfdGhyZWFkX2V4aXQoY29uZGl0aW9uX3ZhcmlhYmxlJiBjb25kLCB1bmlxdWVfbG9jazxtdXRleD4gbGspOworCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKKyNlbmRpZiAvLyAhX0xJQkNQUF9IQVNfTk9fVEhSRUFEUworCisjZW5kaWYgIC8vIF9MSUJDUFBfQ09ORElUSU9OX1ZBUklBQkxFCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY3NldGptcCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jc2V0am1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YTljNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY3NldGptcApAQCAtMCwwICsxLDQ4IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY3NldGptcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0NTRVRKTVAKKyNkZWZpbmUgX0xJQkNQUF9DU0VUSk1QCisKKy8qCisgICAgY3NldGptcCBzeW5vcHNpcworCitNYWNyb3M6CisKKyAgICBzZXRqbXAKKworbmFtZXNwYWNlIHN0ZAoreworCitUeXBlczoKKworICAgIGptcF9idWYKKwordm9pZCBsb25nam1wKGptcF9idWYgZW52LCBpbnQgdmFsKTsKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCit1c2luZyA6OmptcF9idWY7Cit1c2luZyA6OmxvbmdqbXA7CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX0NTRVRKTVAKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jc2lnbmFsIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NzaWduYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyODI2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jc2lnbmFsCkBAIC0wLDAgKzEsNTggQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjc2lnbmFsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfQ1NJR05BTAorI2RlZmluZSBfTElCQ1BQX0NTSUdOQUwKKworLyoKKyAgICBjc2lnbmFsIHN5bm9wc2lzCisKK01hY3JvczoKKworICAgIFNJR19ERkwKKyAgICBTSUdfRVJSCisgICAgU0lHX0lHTgorICAgIFNJR0FCUlQKKyAgICBTSUdGUEUKKyAgICBTSUdJTEwKKyAgICBTSUdJTlQKKyAgICBTSUdTRUdWCisgICAgU0lHVEVSTQorCituYW1lc3BhY2Ugc3RkCit7CisKK1R5cGVzOgorCisgICAgc2lnX2F0b21pY190CisKK3ZvaWQgKCpzaWduYWwoaW50IHNpZywgdm9pZCAoKmZ1bmMpKGludCkpKShpbnQpOworaW50IHJhaXNlKGludCBzaWcpOworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3VzaW5nIDo6c2lnX2F0b21pY190OwordXNpbmcgOjpzaWduYWw7Cit1c2luZyA6OnJhaXNlOworCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DU0lHTkFMCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY3N0ZGFyZyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jc3RkYXJnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YjY5OTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY3N0ZGFyZwpAQCAtMCwwICsxLDQ4IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY3N0ZGFyZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0NTVERBUkcKKyNkZWZpbmUgX0xJQkNQUF9DU1REQVJHCisKKy8qCisgICAgY3N0ZGFyZyBzeW5vcHNpcworCitNYWNyb3M6CisKKyAgICB0eXBlIHZhX2FyZyh2YV9saXN0IGFwLCB0eXBlKTsKKyAgICB2b2lkIHZhX2NvcHkodmFfbGlzdCBkZXN0LCB2YV9saXN0IHNyYyk7ICAvLyBDOTkKKyAgICB2b2lkIHZhX2VuZCh2YV9saXN0IGFwKTsKKyAgICB2b2lkIHZhX3N0YXJ0KHZhX2xpc3QgYXAsIHBhcm1OKTsKKworbmFtZXNwYWNlIHN0ZAoreworCitUeXBlczoKKworICAgIHZhX2xpc3QKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCit1c2luZyA6OnZhX2xpc3Q7CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX0NTVERBUkcKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jc3RkYm9vbCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jc3RkYm9vbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzc2NGE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NzdGRib29sCkBAIC0wLDAgKzEsMzIgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjc3RkYm9vbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfQ1NUREJPT0wKKyNkZWZpbmUgX0xJQkNQUF9DU1REQk9PTAorCisvKgorICAgIGNzdGRib29sIHN5bm9wc2lzCisKK01hY3JvczoKKworICAgIF9fYm9vbF90cnVlX2ZhbHNlX2FyZV9kZWZpbmVkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKKyN1bmRlZiBfX2Jvb2xfdHJ1ZV9mYWxzZV9hcmVfZGVmaW5lZAorI2RlZmluZSBfX2Jvb2xfdHJ1ZV9mYWxzZV9hcmVfZGVmaW5lZCAxCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DU1REQk9PTApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NzdGRkZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY3N0ZGRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGVlZmRhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NzdGRkZWYKQEAgLTAsMCArMSwxMTMgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjc3RkZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfQ1NURERFRgorI2RlZmluZSBfTElCQ1BQX0NTVERERUYKKworLyoKKyAgICBjc3RkZGVmIHN5bm9wc2lzCisKK01hY3JvczoKKworICAgIG9mZnNldG9mKHR5cGUsbWVtYmVyLWRlc2lnbmF0b3IpCisgICAgTlVMTAorCituYW1lc3BhY2Ugc3RkCit7CisKK1R5cGVzOgorCisgICAgcHRyZGlmZl90CisgICAgc2l6ZV90CisgICAgbWF4X2FsaWduX3QKKyAgICBudWxscHRyX3QKKyAgICBieXRlIC8vIEMrKzE3CisKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCisvLyBEb24ndCBpbmNsdWRlIG91ciBvd24gPHN0ZGRlZi5oPjsgd2UgZG9uJ3Qgd2FudCB0byBkZWNsYXJlIDo6bnVsbHB0cl90LgorI2luY2x1ZGVfbmV4dCA8c3RkZGVmLmg+CisjaW5jbHVkZSA8X19udWxscHRyPgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKwordXNpbmcgOjpwdHJkaWZmX3Q7Cit1c2luZyA6OnNpemVfdDsKKworI2lmIGRlZmluZWQoX19DTEFOR19NQVhfQUxJR05fVF9ERUZJTkVEKSB8fCBkZWZpbmVkKF9HQ0NfTUFYX0FMSUdOX1QpIHx8IFwKKyAgICBkZWZpbmVkKF9fREVGSU5FRF9tYXhfYWxpZ25fdCkKKy8vIFJlLXVzZSB0aGUgY29tcGlsZXIncyA8c3RkZGVmLmg+IG1heF9hbGlnbl90IHdoZXJlIHBvc3NpYmxlLgordXNpbmcgOjptYXhfYWxpZ25fdDsKKyNlbHNlCit0eXBlZGVmIGxvbmcgZG91YmxlIG1heF9hbGlnbl90OworI2VuZGlmCisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0CituYW1lc3BhY2Ugc3RkICAvLyBwdXJwb3NlZnVsbHkgbm90IHZlcnNpb25lZAoreworZW51bSBjbGFzcyBieXRlIDogdW5zaWduZWQgY2hhciB7fTsKKworY29uc3RleHByIGJ5dGUgIG9wZXJhdG9yfCAoYnl0ZSAgX19saHMsIGJ5dGUgX19yaHMpIG5vZXhjZXB0Cit7CisJcmV0dXJuIHN0YXRpY19jYXN0PGJ5dGU+KAorCSAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oCisJICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KF9fbGhzKSB8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oX19yaHMpCisJKSk7Cit9CisKK2NvbnN0ZXhwciBieXRlJiBvcGVyYXRvcnw9KGJ5dGUmIF9fbGhzLCBieXRlIF9fcmhzKSBub2V4Y2VwdAoreyByZXR1cm4gX19saHMgPSBfX2xocyB8IF9fcmhzOyB9CisKK2NvbnN0ZXhwciBieXRlICBvcGVyYXRvciYgKGJ5dGUgIF9fbGhzLCBieXRlIF9fcmhzKSBub2V4Y2VwdAoreworCXJldHVybiBzdGF0aWNfY2FzdDxieXRlPigKKwkgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KAorCSAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihfX2xocykgJiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KF9fcmhzKQorCSkpOworfQorCitjb25zdGV4cHIgYnl0ZSYgb3BlcmF0b3ImPShieXRlJiBfX2xocywgYnl0ZSBfX3Jocykgbm9leGNlcHQKK3sgcmV0dXJuIF9fbGhzID0gX19saHMgJiBfX3JoczsgfQorCitjb25zdGV4cHIgYnl0ZSAgb3BlcmF0b3JeIChieXRlICBfX2xocywgYnl0ZSBfX3Jocykgbm9leGNlcHQKK3sKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8Ynl0ZT4oCisJICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigKKwkgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oX19saHMpIF4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihfX3JocykKKwkpKTsKK30KKworY29uc3RleHByIGJ5dGUmIG9wZXJhdG9yXj0oYnl0ZSYgX19saHMsIGJ5dGUgX19yaHMpIG5vZXhjZXB0IAoreyByZXR1cm4gX19saHMgPSBfX2xocyBeIF9fcmhzOyB9CisKK2NvbnN0ZXhwciBieXRlICBvcGVyYXRvcn4gKGJ5dGUgX19iKSBub2V4Y2VwdAoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxieXRlPigKKyAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KAorICAgICAgICB+c3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihfX2IpCisgICAgKSk7Cit9CisKK30KKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPiAgLy8gcmVzdCBvZiBieXRlCisjZW5kaWYKKworI2VuZGlmICAvLyBfTElCQ1BQX0NTVERERUYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jc3RkaW50IGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NzdGRpbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExODdkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jc3RkaW50CkBAIC0wLDAgKzEsMTkxIEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY3N0ZGludCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0NTVERJTlQKKyNkZWZpbmUgX0xJQkNQUF9DU1RESU5UCisKKy8qCisgICAgY3N0ZGludCBzeW5vcHNpcworCitNYWNyb3M6CisKKyAgICBJTlQ4X01JTgorICAgIElOVDE2X01JTgorICAgIElOVDMyX01JTgorICAgIElOVDY0X01JTgorCisgICAgSU5UOF9NQVgKKyAgICBJTlQxNl9NQVgKKyAgICBJTlQzMl9NQVgKKyAgICBJTlQ2NF9NQVgKKworICAgIFVJTlQ4X01BWAorICAgIFVJTlQxNl9NQVgKKyAgICBVSU5UMzJfTUFYCisgICAgVUlOVDY0X01BWAorCisgICAgSU5UX0xFQVNUOF9NSU4KKyAgICBJTlRfTEVBU1QxNl9NSU4KKyAgICBJTlRfTEVBU1QzMl9NSU4KKyAgICBJTlRfTEVBU1Q2NF9NSU4KKworICAgIElOVF9MRUFTVDhfTUFYCisgICAgSU5UX0xFQVNUMTZfTUFYCisgICAgSU5UX0xFQVNUMzJfTUFYCisgICAgSU5UX0xFQVNUNjRfTUFYCisKKyAgICBVSU5UX0xFQVNUOF9NQVgKKyAgICBVSU5UX0xFQVNUMTZfTUFYCisgICAgVUlOVF9MRUFTVDMyX01BWAorICAgIFVJTlRfTEVBU1Q2NF9NQVgKKworICAgIElOVF9GQVNUOF9NSU4KKyAgICBJTlRfRkFTVDE2X01JTgorICAgIElOVF9GQVNUMzJfTUlOCisgICAgSU5UX0ZBU1Q2NF9NSU4KKworICAgIElOVF9GQVNUOF9NQVgKKyAgICBJTlRfRkFTVDE2X01BWAorICAgIElOVF9GQVNUMzJfTUFYCisgICAgSU5UX0ZBU1Q2NF9NQVgKKworICAgIFVJTlRfRkFTVDhfTUFYCisgICAgVUlOVF9GQVNUMTZfTUFYCisgICAgVUlOVF9GQVNUMzJfTUFYCisgICAgVUlOVF9GQVNUNjRfTUFYCisKKyAgICBJTlRQVFJfTUlOCisgICAgSU5UUFRSX01BWAorICAgIFVJTlRQVFJfTUFYCisKKyAgICBJTlRNQVhfTUlOCisgICAgSU5UTUFYX01BWAorCisgICAgVUlOVE1BWF9NQVgKKworICAgIFBUUkRJRkZfTUlOCisgICAgUFRSRElGRl9NQVgKKworICAgIFNJR19BVE9NSUNfTUlOCisgICAgU0lHX0FUT01JQ19NQVgKKworICAgIFNJWkVfTUFYCisKKyAgICBXQ0hBUl9NSU4KKyAgICBXQ0hBUl9NQVgKKworICAgIFdJTlRfTUlOCisgICAgV0lOVF9NQVgKKworICAgIElOVDhfQyh2YWx1ZSkKKyAgICBJTlQxNl9DKHZhbHVlKQorICAgIElOVDMyX0ModmFsdWUpCisgICAgSU5UNjRfQyh2YWx1ZSkKKworICAgIFVJTlQ4X0ModmFsdWUpCisgICAgVUlOVDE2X0ModmFsdWUpCisgICAgVUlOVDMyX0ModmFsdWUpCisgICAgVUlOVDY0X0ModmFsdWUpCisKKyAgICBJTlRNQVhfQyh2YWx1ZSkKKyAgICBVSU5UTUFYX0ModmFsdWUpCisKK25hbWVzcGFjZSBzdGQKK3sKKworVHlwZXM6CisKKyAgICBpbnQ4X3QKKyAgICBpbnQxNl90CisgICAgaW50MzJfdAorICAgIGludDY0X3QKKworICAgIHVpbnQ4X3QKKyAgICB1aW50MTZfdAorICAgIHVpbnQzMl90CisgICAgdWludDY0X3QKKworICAgIGludF9sZWFzdDhfdAorICAgIGludF9sZWFzdDE2X3QKKyAgICBpbnRfbGVhc3QzMl90CisgICAgaW50X2xlYXN0NjRfdAorCisgICAgdWludF9sZWFzdDhfdAorICAgIHVpbnRfbGVhc3QxNl90CisgICAgdWludF9sZWFzdDMyX3QKKyAgICB1aW50X2xlYXN0NjRfdAorCisgICAgaW50X2Zhc3Q4X3QKKyAgICBpbnRfZmFzdDE2X3QKKyAgICBpbnRfZmFzdDMyX3QKKyAgICBpbnRfZmFzdDY0X3QKKworICAgIHVpbnRfZmFzdDhfdAorICAgIHVpbnRfZmFzdDE2X3QKKyAgICB1aW50X2Zhc3QzMl90CisgICAgdWludF9mYXN0NjRfdAorCisgICAgaW50cHRyX3QKKyAgICB1aW50cHRyX3QKKworICAgIGludG1heF90CisgICAgdWludG1heF90CisKK30gIC8vIHN0ZAorKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3VzaW5nOjppbnQ4X3Q7Cit1c2luZzo6aW50MTZfdDsKK3VzaW5nOjppbnQzMl90OwordXNpbmc6OmludDY0X3Q7CisKK3VzaW5nOjp1aW50OF90OwordXNpbmc6OnVpbnQxNl90OwordXNpbmc6OnVpbnQzMl90OwordXNpbmc6OnVpbnQ2NF90OworCit1c2luZzo6aW50X2xlYXN0OF90OwordXNpbmc6OmludF9sZWFzdDE2X3Q7Cit1c2luZzo6aW50X2xlYXN0MzJfdDsKK3VzaW5nOjppbnRfbGVhc3Q2NF90OworCit1c2luZzo6dWludF9sZWFzdDhfdDsKK3VzaW5nOjp1aW50X2xlYXN0MTZfdDsKK3VzaW5nOjp1aW50X2xlYXN0MzJfdDsKK3VzaW5nOjp1aW50X2xlYXN0NjRfdDsKKwordXNpbmc6OmludF9mYXN0OF90OwordXNpbmc6OmludF9mYXN0MTZfdDsKK3VzaW5nOjppbnRfZmFzdDMyX3Q7Cit1c2luZzo6aW50X2Zhc3Q2NF90OworCit1c2luZzo6dWludF9mYXN0OF90OwordXNpbmc6OnVpbnRfZmFzdDE2X3Q7Cit1c2luZzo6dWludF9mYXN0MzJfdDsKK3VzaW5nOjp1aW50X2Zhc3Q2NF90OworCit1c2luZzo6aW50cHRyX3Q7Cit1c2luZzo6dWludHB0cl90OworCit1c2luZzo6aW50bWF4X3Q7Cit1c2luZzo6dWludG1heF90OworCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DU1RESU5UCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY3N0ZGlvIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NzdGRpbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGI5ODlmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NzdGRpbwpAQCAtMCwwICsxLDE3MiBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjc3RkaW8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9DU1RESU8KKyNkZWZpbmUgX0xJQkNQUF9DU1RESU8KKworLyoKKyAgICBjc3RkaW8gc3lub3BzaXMKKworTWFjcm9zOgorCisgICAgQlVGU0laCisgICAgRU9GCisgICAgRklMRU5BTUVfTUFYCisgICAgRk9QRU5fTUFYCisgICAgTF90bXBuYW0KKyAgICBOVUxMCisgICAgU0VFS19DVVIKKyAgICBTRUVLX0VORAorICAgIFNFRUtfU0VUCisgICAgVE1QX01BWAorICAgIF9JT0ZCRgorICAgIF9JT0xCRgorICAgIF9JT05CRgorICAgIHN0ZGVycgorICAgIHN0ZGluCisgICAgc3Rkb3V0CisKK25hbWVzcGFjZSBzdGQKK3sKKworVHlwZXM6CisKK0ZJTEUKK2Zwb3NfdAorc2l6ZV90CisKK2ludCByZW1vdmUoY29uc3QgY2hhciogZmlsZW5hbWUpOworaW50IHJlbmFtZShjb25zdCBjaGFyKiBvbGQsIGNvbnN0IGNoYXIqIG5ldyk7CitGSUxFKiB0bXBmaWxlKHZvaWQpOworY2hhciogdG1wbmFtKGNoYXIqIHMpOworaW50IGZjbG9zZShGSUxFKiBzdHJlYW0pOworaW50IGZmbHVzaChGSUxFKiBzdHJlYW0pOworRklMRSogZm9wZW4oY29uc3QgY2hhciogcmVzdHJpY3QgZmlsZW5hbWUsIGNvbnN0IGNoYXIqIHJlc3RyaWN0IG1vZGUpOworRklMRSogZnJlb3Blbihjb25zdCBjaGFyKiByZXN0cmljdCBmaWxlbmFtZSwgY29uc3QgY2hhciAqIHJlc3RyaWN0IG1vZGUsCisgICAgICAgICAgICAgIEZJTEUgKiByZXN0cmljdCBzdHJlYW0pOwordm9pZCBzZXRidWYoRklMRSogcmVzdHJpY3Qgc3RyZWFtLCBjaGFyKiByZXN0cmljdCBidWYpOworaW50IHNldHZidWYoRklMRSogcmVzdHJpY3Qgc3RyZWFtLCBjaGFyKiByZXN0cmljdCBidWYsIGludCBtb2RlLCBzaXplX3Qgc2l6ZSk7CitpbnQgZnByaW50ZihGSUxFKiByZXN0cmljdCBzdHJlYW0sIGNvbnN0IGNoYXIqIHJlc3RyaWN0IGZvcm1hdCwgLi4uKTsKK2ludCBmc2NhbmYoRklMRSogcmVzdHJpY3Qgc3RyZWFtLCBjb25zdCBjaGFyICogcmVzdHJpY3QgZm9ybWF0LCAuLi4pOworaW50IHByaW50Zihjb25zdCBjaGFyKiByZXN0cmljdCBmb3JtYXQsIC4uLik7CitpbnQgc2NhbmYoY29uc3QgY2hhciogcmVzdHJpY3QgZm9ybWF0LCAuLi4pOworaW50IHNucHJpbnRmKGNoYXIqIHJlc3RyaWN0IHMsIHNpemVfdCBuLCBjb25zdCBjaGFyKiByZXN0cmljdCBmb3JtYXQsIC4uLik7ICAgIC8vIEM5OQoraW50IHNwcmludGYoY2hhciogcmVzdHJpY3QgcywgY29uc3QgY2hhciogcmVzdHJpY3QgZm9ybWF0LCAuLi4pOworaW50IHNzY2FuZihjb25zdCBjaGFyKiByZXN0cmljdCBzLCBjb25zdCBjaGFyKiByZXN0cmljdCBmb3JtYXQsIC4uLik7CitpbnQgdmZwcmludGYoRklMRSogcmVzdHJpY3Qgc3RyZWFtLCBjb25zdCBjaGFyKiByZXN0cmljdCBmb3JtYXQsIHZhX2xpc3QgYXJnKTsKK2ludCB2ZnNjYW5mKEZJTEUqIHJlc3RyaWN0IHN0cmVhbSwgY29uc3QgY2hhciogcmVzdHJpY3QgZm9ybWF0LCB2YV9saXN0IGFyZyk7ICAvLyBDOTkKK2ludCB2cHJpbnRmKGNvbnN0IGNoYXIqIHJlc3RyaWN0IGZvcm1hdCwgdmFfbGlzdCBhcmcpOworaW50IHZzY2FuZihjb25zdCBjaGFyKiByZXN0cmljdCBmb3JtYXQsIHZhX2xpc3QgYXJnKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEM5OQoraW50IHZzbnByaW50ZihjaGFyKiByZXN0cmljdCBzLCBzaXplX3QgbiwgY29uc3QgY2hhciogcmVzdHJpY3QgZm9ybWF0LCAgICAgICAgIC8vIEM5OQorICAgICAgICAgICAgICB2YV9saXN0IGFyZyk7CitpbnQgdnNwcmludGYoY2hhciogcmVzdHJpY3QgcywgY29uc3QgY2hhciogcmVzdHJpY3QgZm9ybWF0LCB2YV9saXN0IGFyZyk7CitpbnQgdnNzY2FuZihjb25zdCBjaGFyKiByZXN0cmljdCBzLCBjb25zdCBjaGFyKiByZXN0cmljdCBmb3JtYXQsIHZhX2xpc3QgYXJnKTsgLy8gQzk5CitpbnQgZmdldGMoRklMRSogc3RyZWFtKTsKK2NoYXIqIGZnZXRzKGNoYXIqIHJlc3RyaWN0IHMsIGludCBuLCBGSUxFKiByZXN0cmljdCBzdHJlYW0pOworaW50IGZwdXRjKGludCBjLCBGSUxFKiBzdHJlYW0pOworaW50IGZwdXRzKGNvbnN0IGNoYXIqIHJlc3RyaWN0IHMsIEZJTEUqIHJlc3RyaWN0IHN0cmVhbSk7CitpbnQgZ2V0YyhGSUxFKiBzdHJlYW0pOworaW50IGdldGNoYXIodm9pZCk7CitjaGFyKiBnZXRzKGNoYXIqIHMpOyAgLy8gcmVtb3ZlZCBpbiBDKysxNAoraW50IHB1dGMoaW50IGMsIEZJTEUqIHN0cmVhbSk7CitpbnQgcHV0Y2hhcihpbnQgYyk7CitpbnQgcHV0cyhjb25zdCBjaGFyKiBzKTsKK2ludCB1bmdldGMoaW50IGMsIEZJTEUqIHN0cmVhbSk7CitzaXplX3QgZnJlYWQodm9pZCogcmVzdHJpY3QgcHRyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5tZW1iLAorICAgICAgICAgICAgIEZJTEUqIHJlc3RyaWN0IHN0cmVhbSk7CitzaXplX3QgZndyaXRlKGNvbnN0IHZvaWQqIHJlc3RyaWN0IHB0ciwgc2l6ZV90IHNpemUsIHNpemVfdCBubWVtYiwKKyAgICAgICAgICAgICAgRklMRSogcmVzdHJpY3Qgc3RyZWFtKTsKK2ludCBmZ2V0cG9zKEZJTEUqIHJlc3RyaWN0IHN0cmVhbSwgZnBvc190KiByZXN0cmljdCBwb3MpOworaW50IGZzZWVrKEZJTEUqIHN0cmVhbSwgbG9uZyBvZmZzZXQsIGludCB3aGVuY2UpOworaW50IGZzZXRwb3MoRklMRSpzdHJlYW0sIGNvbnN0IGZwb3NfdCogcG9zKTsKK2xvbmcgZnRlbGwoRklMRSogc3RyZWFtKTsKK3ZvaWQgcmV3aW5kKEZJTEUqIHN0cmVhbSk7Cit2b2lkIGNsZWFyZXJyKEZJTEUqIHN0cmVhbSk7CitpbnQgZmVvZihGSUxFKiBzdHJlYW0pOworaW50IGZlcnJvcihGSUxFKiBzdHJlYW0pOwordm9pZCBwZXJyb3IoY29uc3QgY2hhciogcyk7CisKK30gIC8vIHN0ZAorKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKwordXNpbmcgOjpGSUxFOwordXNpbmcgOjpmcG9zX3Q7Cit1c2luZyA6OnNpemVfdDsKKwordXNpbmcgOjpmY2xvc2U7Cit1c2luZyA6OmZmbHVzaDsKK3VzaW5nIDo6c2V0YnVmOwordXNpbmcgOjpzZXR2YnVmOwordXNpbmcgOjpmcHJpbnRmOwordXNpbmcgOjpmc2NhbmY7Cit1c2luZyA6OnNucHJpbnRmOwordXNpbmcgOjpzcHJpbnRmOwordXNpbmcgOjpzc2NhbmY7Cit1c2luZyA6OnZmcHJpbnRmOwordXNpbmcgOjp2ZnNjYW5mOwordXNpbmcgOjp2c3NjYW5mOwordXNpbmcgOjp2c25wcmludGY7Cit1c2luZyA6OnZzcHJpbnRmOwordXNpbmcgOjpmZ2V0YzsKK3VzaW5nIDo6ZmdldHM7Cit1c2luZyA6OmZwdXRjOwordXNpbmcgOjpmcHV0czsKK3VzaW5nIDo6Z2V0YzsKK3VzaW5nIDo6cHV0YzsKK3VzaW5nIDo6dW5nZXRjOwordXNpbmcgOjpmcmVhZDsKK3VzaW5nIDo6ZndyaXRlOwordXNpbmcgOjpmZ2V0cG9zOwordXNpbmcgOjpmc2VlazsKK3VzaW5nIDo6ZnNldHBvczsKK3VzaW5nIDo6ZnRlbGw7Cit1c2luZyA6OnJld2luZDsKK3VzaW5nIDo6Y2xlYXJlcnI7Cit1c2luZyA6OmZlb2Y7Cit1c2luZyA6OmZlcnJvcjsKK3VzaW5nIDo6cGVycm9yOworCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0dMT0JBTF9GSUxFU1lTVEVNX05BTUVTUEFDRQordXNpbmcgOjpmb3BlbjsKK3VzaW5nIDo6ZnJlb3BlbjsKK3VzaW5nIDo6cmVtb3ZlOwordXNpbmcgOjpyZW5hbWU7Cit1c2luZyA6OnRtcGZpbGU7Cit1c2luZyA6OnRtcG5hbTsKKyNlbmRpZgorCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1NURElOCit1c2luZyA6OmdldGNoYXI7CisjaWYgX0xJQkNQUF9TVERfVkVSIDw9IDExICYmICFkZWZpbmVkKF9MSUJDUFBfTVNWQ1JUKQordXNpbmcgOjpnZXRzOworI2VuZGlmCit1c2luZyA6OnNjYW5mOwordXNpbmcgOjp2c2NhbmY7CisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19TVERPVVQKK3VzaW5nIDo6cHJpbnRmOwordXNpbmcgOjpwdXRjaGFyOwordXNpbmcgOjpwdXRzOwordXNpbmcgOjp2cHJpbnRmOworI2VuZGlmCisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX0NTVERJTwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NzdGRsaWIgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY3N0ZGxpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGM0Mjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NzdGRsaWIKQEAgLTAsMCArMSwxNjQgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjc3RkbGliIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfQ1NURExJQgorI2RlZmluZSBfTElCQ1BQX0NTVERMSUIKKworLyoKKyAgICBjc3RkbGliIHN5bm9wc2lzCisKK01hY3JvczoKKworICAgIEVYSVRfRkFJTFVSRQorICAgIEVYSVRfU1VDQ0VTUworICAgIE1CX0NVUl9NQVgKKyAgICBOVUxMCisgICAgUkFORF9NQVgKKworbmFtZXNwYWNlIHN0ZAoreworCitUeXBlczoKKworICAgIHNpemVfdAorICAgIGRpdl90CisgICAgbGRpdl90CisgICAgbGxkaXZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEM5OQorCitkb3VibGUgICAgYXRvZiAoY29uc3QgY2hhciogbnB0cik7CitpbnQgICAgICAgYXRvaSAoY29uc3QgY2hhciogbnB0cik7Citsb25nICAgICAgYXRvbCAoY29uc3QgY2hhciogbnB0cik7Citsb25nIGxvbmcgYXRvbGwoY29uc3QgY2hhciogbnB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEM5OQorZG91YmxlICAgICAgICAgICAgIHN0cnRvZCAgKGNvbnN0IGNoYXIqIHJlc3RyaWN0IG5wdHIsIGNoYXIqKiByZXN0cmljdCBlbmRwdHIpOworZmxvYXQgICAgICAgICAgICAgIHN0cnRvZiAgKGNvbnN0IGNoYXIqIHJlc3RyaWN0IG5wdHIsIGNoYXIqKiByZXN0cmljdCBlbmRwdHIpOyAvLyBDOTkKK2xvbmcgZG91YmxlICAgICAgICBzdHJ0b2xkIChjb25zdCBjaGFyKiByZXN0cmljdCBucHRyLCBjaGFyKiogcmVzdHJpY3QgZW5kcHRyKTsgLy8gQzk5Citsb25nICAgICAgICAgICAgICAgc3RydG9sICAoY29uc3QgY2hhciogcmVzdHJpY3QgbnB0ciwgY2hhcioqIHJlc3RyaWN0IGVuZHB0ciwgaW50IGJhc2UpOworbG9uZyBsb25nICAgICAgICAgIHN0cnRvbGwgKGNvbnN0IGNoYXIqIHJlc3RyaWN0IG5wdHIsIGNoYXIqKiByZXN0cmljdCBlbmRwdHIsIGludCBiYXNlKTsgLy8gQzk5Cit1bnNpZ25lZCBsb25nICAgICAgc3RydG91bCAoY29uc3QgY2hhciogcmVzdHJpY3QgbnB0ciwgY2hhcioqIHJlc3RyaWN0IGVuZHB0ciwgaW50IGJhc2UpOwordW5zaWduZWQgbG9uZyBsb25nIHN0cnRvdWxsKGNvbnN0IGNoYXIqIHJlc3RyaWN0IG5wdHIsIGNoYXIqKiByZXN0cmljdCBlbmRwdHIsIGludCBiYXNlKTsgLy8gQzk5CitpbnQgcmFuZCh2b2lkKTsKK3ZvaWQgc3JhbmQodW5zaWduZWQgaW50IHNlZWQpOwordm9pZCogY2FsbG9jKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpOwordm9pZCBmcmVlKHZvaWQqIHB0cik7Cit2b2lkKiBtYWxsb2Moc2l6ZV90IHNpemUpOwordm9pZCogcmVhbGxvYyh2b2lkKiBwdHIsIHNpemVfdCBzaXplKTsKK3ZvaWQgYWJvcnQodm9pZCk7CitpbnQgYXRleGl0KHZvaWQgKCpmdW5jKSh2b2lkKSk7Cit2b2lkIGV4aXQoaW50IHN0YXR1cyk7Cit2b2lkIF9FeGl0KGludCBzdGF0dXMpOworY2hhciogZ2V0ZW52KGNvbnN0IGNoYXIqIG5hbWUpOworaW50IHN5c3RlbShjb25zdCBjaGFyKiBzdHJpbmcpOwordm9pZCogYnNlYXJjaChjb25zdCB2b2lkKiBrZXksIGNvbnN0IHZvaWQqIGJhc2UsIHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgIGludCAoKmNvbXBhcikoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKK3ZvaWQgcXNvcnQodm9pZCogYmFzZSwgc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgaW50ICgqY29tcGFyKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOworaW50ICAgICAgICAgYWJzKCAgICAgIGludCBqKTsKK2xvbmcgICAgICAgIGFicyggICAgIGxvbmcgaik7Citsb25nIGxvbmcgICBhYnMobG9uZyBsb25nIGopOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzBYCitsb25nICAgICAgIGxhYnMoICAgICBsb25nIGopOworbG9uZyBsb25nIGxsYWJzKGxvbmcgbG9uZyBqKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDOTkKK2Rpdl90ICAgICBkaXYoICAgICAgaW50IG51bWVyLCAgICAgICBpbnQgZGVub20pOworbGRpdl90ICAgIGRpdiggICAgIGxvbmcgbnVtZXIsICAgICAgbG9uZyBkZW5vbSk7CitsbGRpdl90ICAgZGl2KGxvbmcgbG9uZyBudW1lciwgbG9uZyBsb25nIGRlbm9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzBYCitsZGl2X3QgICBsZGl2KCAgICAgbG9uZyBudW1lciwgICAgICBsb25nIGRlbm9tKTsKK2xsZGl2X3QgbGxkaXYobG9uZyBsb25nIG51bWVyLCBsb25nIGxvbmcgZGVub20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQzk5CitpbnQgbWJsZW4oY29uc3QgY2hhciogcywgc2l6ZV90IG4pOworaW50IG1idG93Yyh3Y2hhcl90KiByZXN0cmljdCBwd2MsIGNvbnN0IGNoYXIqIHJlc3RyaWN0IHMsIHNpemVfdCBuKTsKK2ludCB3Y3RvbWIoY2hhciogcywgd2NoYXJfdCB3Y2hhcik7CitzaXplX3QgbWJzdG93Y3Mod2NoYXJfdCogcmVzdHJpY3QgcHdjcywgY29uc3QgY2hhciogcmVzdHJpY3Qgcywgc2l6ZV90IG4pOworc2l6ZV90IHdjc3RvbWJzKGNoYXIqIHJlc3RyaWN0IHMsIGNvbnN0IHdjaGFyX3QqIHJlc3RyaWN0IHB3Y3MsIHNpemVfdCBuKTsKK2ludCBhdF9xdWlja19leGl0KHZvaWQgKCpmdW5jKSh2b2lkKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTEKK3ZvaWQgcXVpY2tfZXhpdChpbnQgc3RhdHVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTEKK3ZvaWQgKmFsaWduZWRfYWxsb2Moc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IHNpemUpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gQzExCisKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgX0xJQkNQUF9VTlJFQUNIQUJMRSgpIF9fYnVpbHRpbl91bnJlYWNoYWJsZSgpCisjZWxzZQorI2RlZmluZSBfTElCQ1BQX1VOUkVBQ0hBQkxFKCkgX1ZTVEQ6OmFib3J0KCkKKyNlbmRpZgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKwordXNpbmcgOjpzaXplX3Q7Cit1c2luZyA6OmRpdl90OwordXNpbmcgOjpsZGl2X3Q7CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0xPTkdfTE9ORwordXNpbmcgOjpsbGRpdl90OworI2VuZGlmIC8vIF9MSUJDUFBfSEFTX05PX0xPTkdfTE9ORwordXNpbmcgOjphdG9mOwordXNpbmcgOjphdG9pOwordXNpbmcgOjphdG9sOworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19MT05HX0xPTkcKK3VzaW5nIDo6YXRvbGw7CisjZW5kaWYgLy8gX0xJQkNQUF9IQVNfTk9fTE9OR19MT05HCit1c2luZyA6OnN0cnRvZDsKK3VzaW5nIDo6c3RydG9mOwordXNpbmcgOjpzdHJ0b2xkOwordXNpbmcgOjpzdHJ0b2w7CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0xPTkdfTE9ORwordXNpbmcgOjpzdHJ0b2xsOworI2VuZGlmIC8vIF9MSUJDUFBfSEFTX05PX0xPTkdfTE9ORwordXNpbmcgOjpzdHJ0b3VsOworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19MT05HX0xPTkcKK3VzaW5nIDo6c3RydG91bGw7CisjZW5kaWYgLy8gX0xJQkNQUF9IQVNfTk9fTE9OR19MT05HCit1c2luZyA6OnJhbmQ7Cit1c2luZyA6OnNyYW5kOwordXNpbmcgOjpjYWxsb2M7Cit1c2luZyA6OmZyZWU7Cit1c2luZyA6Om1hbGxvYzsKK3VzaW5nIDo6cmVhbGxvYzsKK3VzaW5nIDo6YWJvcnQ7Cit1c2luZyA6OmF0ZXhpdDsKK3VzaW5nIDo6ZXhpdDsKK3VzaW5nIDo6X0V4aXQ7CisjaWZuZGVmIF9MSUJDUFBfV0lORE9XU19TVE9SRV9BUFAKK3VzaW5nIDo6Z2V0ZW52OwordXNpbmcgOjpzeXN0ZW07CisjZW5kaWYKK3VzaW5nIDo6YnNlYXJjaDsKK3VzaW5nIDo6cXNvcnQ7Cit1c2luZyA6OmFiczsKK3VzaW5nIDo6bGFiczsKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fTE9OR19MT05HCit1c2luZyA6OmxsYWJzOworI2VuZGlmIC8vIF9MSUJDUFBfSEFTX05PX0xPTkdfTE9ORwordXNpbmcgOjpkaXY7Cit1c2luZyA6OmxkaXY7CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0xPTkdfTE9ORwordXNpbmcgOjpsbGRpdjsKKyNlbmRpZiAvLyBfTElCQ1BQX0hBU19OT19MT05HX0xPTkcKK3VzaW5nIDo6bWJsZW47Cit1c2luZyA6Om1idG93YzsKK3VzaW5nIDo6d2N0b21iOwordXNpbmcgOjptYnN0b3djczsKK3VzaW5nIDo6d2NzdG9tYnM7CisjaWZkZWYgX0xJQkNQUF9IQVNfUVVJQ0tfRVhJVAordXNpbmcgOjphdF9xdWlja19leGl0OwordXNpbmcgOjpxdWlja19leGl0OworI2VuZGlmCisjaWZkZWYgX0xJQkNQUF9IQVNfQzExX0ZFQVRVUkVTCit1c2luZyA6OmFsaWduZWRfYWxsb2M7CisjZW5kaWYKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1NURExJQgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NzdHJpbmcgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY3N0cmluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTUwNjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2NzdHJpbmcKQEAgLTAsMCArMSw5NyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNzdHJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9DU1RSSU5HCisjZGVmaW5lIF9MSUJDUFBfQ1NUUklORworCisvKgorICAgIGNzdHJpbmcgc3lub3BzaXMKKworTWFjcm9zOgorCisgICAgTlVMTAorCituYW1lc3BhY2Ugc3RkCit7CisKK1R5cGVzOgorCisgICAgc2l6ZV90CisKK3ZvaWQqIG1lbWNweSh2b2lkKiByZXN0cmljdCBzMSwgY29uc3Qgdm9pZCogcmVzdHJpY3QgczIsIHNpemVfdCBuKTsKK3ZvaWQqIG1lbW1vdmUodm9pZCogczEsIGNvbnN0IHZvaWQqIHMyLCBzaXplX3Qgbik7CitjaGFyKiBzdHJjcHkgKGNoYXIqIHJlc3RyaWN0IHMxLCBjb25zdCBjaGFyKiByZXN0cmljdCBzMik7CitjaGFyKiBzdHJuY3B5KGNoYXIqIHJlc3RyaWN0IHMxLCBjb25zdCBjaGFyKiByZXN0cmljdCBzMiwgc2l6ZV90IG4pOworY2hhciogc3RyY2F0IChjaGFyKiByZXN0cmljdCBzMSwgY29uc3QgY2hhciogcmVzdHJpY3QgczIpOworY2hhciogc3RybmNhdChjaGFyKiByZXN0cmljdCBzMSwgY29uc3QgY2hhciogcmVzdHJpY3QgczIsIHNpemVfdCBuKTsKK2ludCBtZW1jbXAoY29uc3Qgdm9pZCogczEsIGNvbnN0IHZvaWQqIHMyLCBzaXplX3Qgbik7CitpbnQgc3RyY21wIChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpOworaW50IHN0cm5jbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyLCBzaXplX3Qgbik7CitpbnQgc3RyY29sbChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpOworc2l6ZV90IHN0cnhmcm0oY2hhciogcmVzdHJpY3QgczEsIGNvbnN0IGNoYXIqIHJlc3RyaWN0IHMyLCBzaXplX3Qgbik7Citjb25zdCB2b2lkKiBtZW1jaHIoY29uc3Qgdm9pZCogcywgaW50IGMsIHNpemVfdCBuKTsKKyAgICAgIHZvaWQqIG1lbWNociggICAgICB2b2lkKiBzLCBpbnQgYywgc2l6ZV90IG4pOworY29uc3QgY2hhciogc3RyY2hyKGNvbnN0IGNoYXIqIHMsIGludCBjKTsKKyAgICAgIGNoYXIqIHN0cmNociggICAgICBjaGFyKiBzLCBpbnQgYyk7CitzaXplX3Qgc3RyY3Nwbihjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpOworY29uc3QgY2hhciogc3RycGJyayhjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpOworICAgICAgY2hhciogc3RycGJyayggICAgICBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpOworY29uc3QgY2hhciogc3RycmNocihjb25zdCBjaGFyKiBzLCBpbnQgYyk7CisgICAgICBjaGFyKiBzdHJyY2hyKCAgICAgIGNoYXIqIHMsIGludCBjKTsKK3NpemVfdCBzdHJzcG4oY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKTsKK2NvbnN0IGNoYXIqIHN0cnN0cihjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpOworICAgICAgY2hhciogc3Ryc3RyKCAgICAgIGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMik7CitjaGFyKiBzdHJ0b2soY2hhciogcmVzdHJpY3QgczEsIGNvbnN0IGNoYXIqIHJlc3RyaWN0IHMyKTsKK3ZvaWQqIG1lbXNldCh2b2lkKiBzLCBpbnQgYywgc2l6ZV90IG4pOworY2hhciogc3RyZXJyb3IoaW50IGVycm51bSk7CitzaXplX3Qgc3RybGVuKGNvbnN0IGNoYXIqIHMpOworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3VzaW5nIDo6c2l6ZV90OwordXNpbmcgOjptZW1jcHk7Cit1c2luZyA6Om1lbW1vdmU7Cit1c2luZyA6OnN0cmNweTsKK3VzaW5nIDo6c3RybmNweTsKK3VzaW5nIDo6c3RyY2F0OwordXNpbmcgOjpzdHJuY2F0OwordXNpbmcgOjptZW1jbXA7Cit1c2luZyA6OnN0cmNtcDsKK3VzaW5nIDo6c3RybmNtcDsKK3VzaW5nIDo6c3RyY29sbDsKK3VzaW5nIDo6c3RyeGZybTsKK3VzaW5nIDo6bWVtY2hyOwordXNpbmcgOjpzdHJjaHI7Cit1c2luZyA6OnN0cmNzcG47Cit1c2luZyA6OnN0cnBicms7Cit1c2luZyA6OnN0cnJjaHI7Cit1c2luZyA6OnN0cnNwbjsKK3VzaW5nIDo6c3Ryc3RyOworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19USFJFQURfVU5TQUZFX0NfRlVOQ1RJT05TCit1c2luZyA6OnN0cnRvazsKKyNlbmRpZgordXNpbmcgOjptZW1zZXQ7Cit1c2luZyA6OnN0cmVycm9yOwordXNpbmcgOjpzdHJsZW47CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX0NTVFJJTkcKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jdGdtYXRoIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2N0Z21hdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1ZWI3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jdGdtYXRoCkBAIC0wLDAgKzEsMjkgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGN0Z21hdGggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfQ1RHTUFUSAorI2RlZmluZSBfTElCQ1BQX0NUR01BVEgKKworLyoKKyAgICBjdGdtYXRoIHN5bm9wc2lzCisKKyNpbmNsdWRlIDxjY29tcGxleD4KKyNpbmNsdWRlIDxjbWF0aD4KKworKi8KKworI2luY2x1ZGUgPGNjb21wbGV4PgorI2luY2x1ZGUgPGNtYXRoPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2VuZGlmICAvLyBfTElCQ1BQX0NUR01BVEgKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jdGltZSBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jdGltZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTllMzI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2N0aW1lCkBAIC0wLDAgKzEsNzQgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY3RpbWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfQ1RJTUUKKyNkZWZpbmUgX0xJQkNQUF9DVElNRQorCisvKgorICAgIGN0aW1lIHN5bm9wc2lzCisKK01hY3JvczoKKworICAgIE5VTEwKKyAgICBDTE9DS1NfUEVSX1NFQworCituYW1lc3BhY2Ugc3RkCit7CisKK1R5cGVzOgorCisgICAgY2xvY2tfdAorICAgIHNpemVfdAorICAgIHRpbWVfdAorICAgIHRtCisKK2Nsb2NrX3QgY2xvY2soKTsKK2RvdWJsZSBkaWZmdGltZSh0aW1lX3QgdGltZTEsIHRpbWVfdCB0aW1lMCk7Cit0aW1lX3QgbWt0aW1lKHRtKiB0aW1lcHRyKTsKK3RpbWVfdCB0aW1lKHRpbWVfdCogdGltZXIpOworY2hhciogYXNjdGltZShjb25zdCB0bSogdGltZXB0cik7CitjaGFyKiBjdGltZShjb25zdCB0aW1lX3QqIHRpbWVyKTsKK3RtKiAgICBnbXRpbWUoY29uc3QgdGltZV90KiB0aW1lcik7Cit0bSogbG9jYWx0aW1lKGNvbnN0IHRpbWVfdCogdGltZXIpOworc2l6ZV90IHN0cmZ0aW1lKGNoYXIqIHJlc3RyaWN0IHMsIHNpemVfdCBtYXhzaXplLCBjb25zdCBjaGFyKiByZXN0cmljdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgY29uc3QgdG0qIHJlc3RyaWN0IHRpbWVwdHIpOworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCit1c2luZyA6OmNsb2NrX3Q7Cit1c2luZyA6OnNpemVfdDsKK3VzaW5nIDo6dGltZV90OwordXNpbmcgOjp0bTsKK3VzaW5nIDo6Y2xvY2s7Cit1c2luZyA6OmRpZmZ0aW1lOwordXNpbmcgOjpta3RpbWU7Cit1c2luZyA6OnRpbWU7CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1RIUkVBRF9VTlNBRkVfQ19GVU5DVElPTlMKK3VzaW5nIDo6YXNjdGltZTsKK3VzaW5nIDo6Y3RpbWU7Cit1c2luZyA6OmdtdGltZTsKK3VzaW5nIDo6bG9jYWx0aW1lOworI2VuZGlmCit1c2luZyA6OnN0cmZ0aW1lOworCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DVElNRQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2N0eXBlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTdmZjNjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2N0eXBlLmgKQEAgLTAsMCArMSw2MCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjdHlwZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9DVFlQRV9ICisjZGVmaW5lIF9MSUJDUFBfQ1RZUEVfSAorCisvKgorICAgIGN0eXBlLmggc3lub3BzaXMKKworaW50IGlzYWxudW0oaW50IGMpOworaW50IGlzYWxwaGEoaW50IGMpOworaW50IGlzYmxhbmsoaW50IGMpOyAgLy8gQzk5CitpbnQgaXNjbnRybChpbnQgYyk7CitpbnQgaXNkaWdpdChpbnQgYyk7CitpbnQgaXNncmFwaChpbnQgYyk7CitpbnQgaXNsb3dlcihpbnQgYyk7CitpbnQgaXNwcmludChpbnQgYyk7CitpbnQgaXNwdW5jdChpbnQgYyk7CitpbnQgaXNzcGFjZShpbnQgYyk7CitpbnQgaXN1cHBlcihpbnQgYyk7CitpbnQgaXN4ZGlnaXQoaW50IGMpOworaW50IHRvbG93ZXIoaW50IGMpOworaW50IHRvdXBwZXIoaW50IGMpOworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2luY2x1ZGVfbmV4dCA8Y3R5cGUuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKyN1bmRlZiBpc2FsbnVtCisjdW5kZWYgaXNhbHBoYQorI3VuZGVmIGlzYmxhbmsKKyN1bmRlZiBpc2NudHJsCisjdW5kZWYgaXNkaWdpdAorI3VuZGVmIGlzZ3JhcGgKKyN1bmRlZiBpc2xvd2VyCisjdW5kZWYgaXNwcmludAorI3VuZGVmIGlzcHVuY3QKKyN1bmRlZiBpc3NwYWNlCisjdW5kZWYgaXN1cHBlcgorI3VuZGVmIGlzeGRpZ2l0CisjdW5kZWYgdG9sb3dlcgorI3VuZGVmIHRvdXBwZXIKKworI2VuZGlmCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DVFlQRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY3djaGFyIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2N3Y2hhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjY4ZThiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2N3Y2hhcgpAQCAtMCwwICsxLDE5MyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGN3Y2hhciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9DV0NIQVIKKyNkZWZpbmUgX0xJQkNQUF9DV0NIQVIKKworLyoKKyAgICBjd2NoYXIgc3lub3BzaXMKKworTWFjcm9zOgorCisgICAgTlVMTAorICAgIFdDSEFSX01BWAorICAgIFdDSEFSX01JTgorICAgIFdFT0YKKworbmFtZXNwYWNlIHN0ZAoreworCitUeXBlczoKKworICAgIG1ic3RhdGVfdAorICAgIHNpemVfdAorICAgIHRtCisgICAgd2ludF90CisKK2ludCBmd3ByaW50ZihGSUxFKiByZXN0cmljdCBzdHJlYW0sIGNvbnN0IHdjaGFyX3QqIHJlc3RyaWN0IGZvcm1hdCwgLi4uKTsKK2ludCBmd3NjYW5mKEZJTEUqIHJlc3RyaWN0IHN0cmVhbSwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgZm9ybWF0LCAuLi4pOworaW50IHN3cHJpbnRmKHdjaGFyX3QqIHJlc3RyaWN0IHMsIHNpemVfdCBuLCBjb25zdCB3Y2hhcl90KiByZXN0cmljdCBmb3JtYXQsIC4uLik7CitpbnQgc3dzY2FuZihjb25zdCB3Y2hhcl90KiByZXN0cmljdCBzLCBjb25zdCB3Y2hhcl90KiByZXN0cmljdCBmb3JtYXQsIC4uLik7CitpbnQgdmZ3cHJpbnRmKEZJTEUqIHJlc3RyaWN0IHN0cmVhbSwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgZm9ybWF0LCB2YV9saXN0IGFyZyk7CitpbnQgdmZ3c2NhbmYoRklMRSogcmVzdHJpY3Qgc3RyZWFtLCBjb25zdCB3Y2hhcl90KiByZXN0cmljdCBmb3JtYXQsIHZhX2xpc3QgYXJnKTsgIC8vIEM5OQoraW50IHZzd3ByaW50Zih3Y2hhcl90KiByZXN0cmljdCBzLCBzaXplX3QgbiwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgZm9ybWF0LCB2YV9saXN0IGFyZyk7CitpbnQgdnN3c2NhbmYoY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgcywgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgZm9ybWF0LCB2YV9saXN0IGFyZyk7ICAvLyBDOTkKK2ludCB2d3ByaW50Zihjb25zdCB3Y2hhcl90KiByZXN0cmljdCBmb3JtYXQsIHZhX2xpc3QgYXJnKTsKK2ludCB2d3NjYW5mKGNvbnN0IHdjaGFyX3QqIHJlc3RyaWN0IGZvcm1hdCwgdmFfbGlzdCBhcmcpOyAgLy8gQzk5CitpbnQgd3ByaW50Zihjb25zdCB3Y2hhcl90KiByZXN0cmljdCBmb3JtYXQsIC4uLik7CitpbnQgd3NjYW5mKGNvbnN0IHdjaGFyX3QqIHJlc3RyaWN0IGZvcm1hdCwgLi4uKTsKK3dpbnRfdCBmZ2V0d2MoRklMRSogc3RyZWFtKTsKK3djaGFyX3QqIGZnZXR3cyh3Y2hhcl90KiByZXN0cmljdCBzLCBpbnQgbiwgRklMRSogcmVzdHJpY3Qgc3RyZWFtKTsKK3dpbnRfdCBmcHV0d2Mod2NoYXJfdCBjLCBGSUxFKiBzdHJlYW0pOworaW50IGZwdXR3cyhjb25zdCB3Y2hhcl90KiByZXN0cmljdCBzLCBGSUxFKiByZXN0cmljdCBzdHJlYW0pOworaW50IGZ3aWRlKEZJTEUqIHN0cmVhbSwgaW50IG1vZGUpOword2ludF90IGdldHdjKEZJTEUqIHN0cmVhbSk7Cit3aW50X3QgZ2V0d2NoYXIoKTsKK3dpbnRfdCBwdXR3Yyh3Y2hhcl90IGMsIEZJTEUqIHN0cmVhbSk7Cit3aW50X3QgcHV0d2NoYXIod2NoYXJfdCBjKTsKK3dpbnRfdCB1bmdldHdjKHdpbnRfdCBjLCBGSUxFKiBzdHJlYW0pOworZG91YmxlIHdjc3RvZChjb25zdCB3Y2hhcl90KiByZXN0cmljdCBucHRyLCB3Y2hhcl90KiogcmVzdHJpY3QgZW5kcHRyKTsKK2Zsb2F0IHdjc3RvZihjb25zdCB3Y2hhcl90KiByZXN0cmljdCBucHRyLCB3Y2hhcl90KiogcmVzdHJpY3QgZW5kcHRyKTsgICAgICAgICAvLyBDOTkKK2xvbmcgZG91YmxlIHdjc3RvbGQoY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgbnB0ciwgd2NoYXJfdCoqIHJlc3RyaWN0IGVuZHB0cik7ICAvLyBDOTkKK2xvbmcgd2NzdG9sKGNvbnN0IHdjaGFyX3QqIHJlc3RyaWN0IG5wdHIsIHdjaGFyX3QqKiByZXN0cmljdCBlbmRwdHIsIGludCBiYXNlKTsKK2xvbmcgbG9uZyB3Y3N0b2xsKGNvbnN0IHdjaGFyX3QqIHJlc3RyaWN0IG5wdHIsIHdjaGFyX3QqKiByZXN0cmljdCBlbmRwdHIsIGludCBiYXNlKTsgIC8vIEM5OQordW5zaWduZWQgbG9uZyB3Y3N0b3VsKGNvbnN0IHdjaGFyX3QqIHJlc3RyaWN0IG5wdHIsIHdjaGFyX3QqKiByZXN0cmljdCBlbmRwdHIsIGludCBiYXNlKTsKK3Vuc2lnbmVkIGxvbmcgbG9uZyB3Y3N0b3VsbChjb25zdCB3Y2hhcl90KiByZXN0cmljdCBucHRyLCB3Y2hhcl90KiogcmVzdHJpY3QgZW5kcHRyLCBpbnQgYmFzZSk7ICAvLyBDOTkKK3djaGFyX3QqIHdjc2NweSh3Y2hhcl90KiByZXN0cmljdCBzMSwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgczIpOword2NoYXJfdCogd2NzbmNweSh3Y2hhcl90KiByZXN0cmljdCBzMSwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgczIsIHNpemVfdCBuKTsKK3djaGFyX3QqIHdjc2NhdCh3Y2hhcl90KiByZXN0cmljdCBzMSwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgczIpOword2NoYXJfdCogd2NzbmNhdCh3Y2hhcl90KiByZXN0cmljdCBzMSwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgczIsIHNpemVfdCBuKTsKK2ludCB3Y3NjbXAoY29uc3Qgd2NoYXJfdCogczEsIGNvbnN0IHdjaGFyX3QqIHMyKTsKK2ludCB3Y3Njb2xsKGNvbnN0IHdjaGFyX3QqIHMxLCBjb25zdCB3Y2hhcl90KiBzMik7CitpbnQgd2NzbmNtcChjb25zdCB3Y2hhcl90KiBzMSwgY29uc3Qgd2NoYXJfdCogczIsIHNpemVfdCBuKTsKK3NpemVfdCB3Y3N4ZnJtKHdjaGFyX3QqIHJlc3RyaWN0IHMxLCBjb25zdCB3Y2hhcl90KiByZXN0cmljdCBzMiwgc2l6ZV90IG4pOworY29uc3Qgd2NoYXJfdCogd2NzY2hyKGNvbnN0IHdjaGFyX3QqIHMsIHdjaGFyX3QgYyk7CisgICAgICB3Y2hhcl90KiB3Y3NjaHIoICAgICAgd2NoYXJfdCogcywgd2NoYXJfdCBjKTsKK3NpemVfdCB3Y3Njc3BuKGNvbnN0IHdjaGFyX3QqIHMxLCBjb25zdCB3Y2hhcl90KiBzMik7CitzaXplX3Qgd2NzbGVuKGNvbnN0IHdjaGFyX3QqIHMpOworY29uc3Qgd2NoYXJfdCogd2NzcGJyayhjb25zdCB3Y2hhcl90KiBzMSwgY29uc3Qgd2NoYXJfdCogczIpOworICAgICAgd2NoYXJfdCogd2NzcGJyayggICAgICB3Y2hhcl90KiBzMSwgY29uc3Qgd2NoYXJfdCogczIpOworY29uc3Qgd2NoYXJfdCogd2NzcmNocihjb25zdCB3Y2hhcl90KiBzLCB3Y2hhcl90IGMpOworICAgICAgd2NoYXJfdCogd2NzcmNociggICAgICB3Y2hhcl90KiBzLCB3Y2hhcl90IGMpOworc2l6ZV90IHdjc3Nwbihjb25zdCB3Y2hhcl90KiBzMSwgY29uc3Qgd2NoYXJfdCogczIpOworY29uc3Qgd2NoYXJfdCogd2Nzc3RyKGNvbnN0IHdjaGFyX3QqIHMxLCBjb25zdCB3Y2hhcl90KiBzMik7CisgICAgICB3Y2hhcl90KiB3Y3NzdHIoICAgICAgd2NoYXJfdCogczEsIGNvbnN0IHdjaGFyX3QqIHMyKTsKK3djaGFyX3QqIHdjc3Rvayh3Y2hhcl90KiByZXN0cmljdCBzMSwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgczIsIHdjaGFyX3QqKiByZXN0cmljdCBwdHIpOworY29uc3Qgd2NoYXJfdCogd21lbWNocihjb25zdCB3Y2hhcl90KiBzLCB3Y2hhcl90IGMsIHNpemVfdCBuKTsKKyAgICAgIHdjaGFyX3QqIHdtZW1jaHIoICAgICAgd2NoYXJfdCogcywgd2NoYXJfdCBjLCBzaXplX3Qgbik7CitpbnQgd21lbWNtcCh3Y2hhcl90KiByZXN0cmljdCBzMSwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgczIsIHNpemVfdCBuKTsKK3djaGFyX3QqIHdtZW1jcHkod2NoYXJfdCogcmVzdHJpY3QgczEsIGNvbnN0IHdjaGFyX3QqIHJlc3RyaWN0IHMyLCBzaXplX3Qgbik7Cit3Y2hhcl90KiB3bWVtbW92ZSh3Y2hhcl90KiBzMSwgY29uc3Qgd2NoYXJfdCogczIsIHNpemVfdCBuKTsKK3djaGFyX3QqIHdtZW1zZXQod2NoYXJfdCogcywgd2NoYXJfdCBjLCBzaXplX3Qgbik7CitzaXplX3Qgd2NzZnRpbWUod2NoYXJfdCogcmVzdHJpY3Qgcywgc2l6ZV90IG1heHNpemUsIGNvbnN0IHdjaGFyX3QqIHJlc3RyaWN0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICBjb25zdCB0bSogcmVzdHJpY3QgdGltZXB0cik7Cit3aW50X3QgYnRvd2MoaW50IGMpOworaW50IHdjdG9iKHdpbnRfdCBjKTsKK2ludCBtYnNpbml0KGNvbnN0IG1ic3RhdGVfdCogcHMpOworc2l6ZV90IG1icmxlbihjb25zdCBjaGFyKiByZXN0cmljdCBzLCBzaXplX3QgbiwgbWJzdGF0ZV90KiByZXN0cmljdCBwcyk7CitzaXplX3QgbWJydG93Yyh3Y2hhcl90KiByZXN0cmljdCBwd2MsIGNvbnN0IGNoYXIqIHJlc3RyaWN0IHMsIHNpemVfdCBuLCBtYnN0YXRlX3QqIHJlc3RyaWN0IHBzKTsKK3NpemVfdCB3Y3J0b21iKGNoYXIqIHJlc3RyaWN0IHMsIHdjaGFyX3Qgd2MsIG1ic3RhdGVfdCogcmVzdHJpY3QgcHMpOworc2l6ZV90IG1ic3J0b3djcyh3Y2hhcl90KiByZXN0cmljdCBkc3QsIGNvbnN0IGNoYXIqKiByZXN0cmljdCBzcmMsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgIG1ic3RhdGVfdCogcmVzdHJpY3QgcHMpOworc2l6ZV90IHdjc3J0b21icyhjaGFyKiByZXN0cmljdCBkc3QsIGNvbnN0IHdjaGFyX3QqKiByZXN0cmljdCBzcmMsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgIG1ic3RhdGVfdCogcmVzdHJpY3QgcHMpOworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPGN3Y3R5cGU+CisjaW5jbHVkZSA8d2NoYXIuaD4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCit1c2luZyA6Om1ic3RhdGVfdDsKK3VzaW5nIDo6c2l6ZV90OwordXNpbmcgOjp0bTsKK3VzaW5nIDo6d2ludF90OwordXNpbmcgOjpGSUxFOwordXNpbmcgOjpmd3ByaW50ZjsKK3VzaW5nIDo6ZndzY2FuZjsKK3VzaW5nIDo6c3dwcmludGY7Cit1c2luZyA6OnZmd3ByaW50ZjsKK3VzaW5nIDo6dnN3cHJpbnRmOwordXNpbmcgOjpzd3NjYW5mOwordXNpbmcgOjp2ZndzY2FuZjsKK3VzaW5nIDo6dnN3c2NhbmY7Cit1c2luZyA6OmZnZXR3YzsKK3VzaW5nIDo6ZmdldHdzOwordXNpbmcgOjpmcHV0d2M7Cit1c2luZyA6OmZwdXR3czsKK3VzaW5nIDo6ZndpZGU7Cit1c2luZyA6OmdldHdjOwordXNpbmcgOjpwdXR3YzsKK3VzaW5nIDo6dW5nZXR3YzsKK3VzaW5nIDo6d2NzdG9kOwordXNpbmcgOjp3Y3N0b2Y7Cit1c2luZyA6Ondjc3RvbGQ7Cit1c2luZyA6Ondjc3RvbDsKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fTE9OR19MT05HCit1c2luZyA6Ondjc3RvbGw7CisjZW5kaWYgLy8gX0xJQkNQUF9IQVNfTk9fTE9OR19MT05HCit1c2luZyA6Ondjc3RvdWw7CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0xPTkdfTE9ORwordXNpbmcgOjp3Y3N0b3VsbDsKKyNlbmRpZiAvLyBfTElCQ1BQX0hBU19OT19MT05HX0xPTkcKK3VzaW5nIDo6d2NzY3B5OwordXNpbmcgOjp3Y3NuY3B5OwordXNpbmcgOjp3Y3NjYXQ7Cit1c2luZyA6Ondjc25jYXQ7Cit1c2luZyA6Ondjc2NtcDsKK3VzaW5nIDo6d2NzY29sbDsKK3VzaW5nIDo6d2NzbmNtcDsKK3VzaW5nIDo6d2NzeGZybTsKK3VzaW5nIDo6d2NzY2hyOwordXNpbmcgOjp3Y3NwYnJrOwordXNpbmcgOjp3Y3NyY2hyOwordXNpbmcgOjp3Y3NzdHI7Cit1c2luZyA6OndtZW1jaHI7Cit1c2luZyA6Ondjc2NzcG47Cit1c2luZyA6Ondjc2xlbjsKK3VzaW5nIDo6d2Nzc3BuOwordXNpbmcgOjp3Y3N0b2s7Cit1c2luZyA6OndtZW1jbXA7Cit1c2luZyA6OndtZW1jcHk7Cit1c2luZyA6OndtZW1tb3ZlOwordXNpbmcgOjp3bWVtc2V0OwordXNpbmcgOjp3Y3NmdGltZTsKK3VzaW5nIDo6YnRvd2M7Cit1c2luZyA6OndjdG9iOwordXNpbmcgOjptYnNpbml0OwordXNpbmcgOjptYnJsZW47Cit1c2luZyA6Om1icnRvd2M7Cit1c2luZyA6OndjcnRvbWI7Cit1c2luZyA6Om1ic3J0b3djczsKK3VzaW5nIDo6d2NzcnRvbWJzOworCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1NURElOCit1c2luZyA6OmdldHdjaGFyOwordXNpbmcgOjp2d3NjYW5mOwordXNpbmcgOjp3c2NhbmY7CisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19TVERPVVQKK3VzaW5nIDo6cHV0d2NoYXI7Cit1c2luZyA6OnZ3cHJpbnRmOwordXNpbmcgOjp3cHJpbnRmOworI2VuZGlmCisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX0NXQ0hBUgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2N3Y3R5cGUgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvY3djdHlwZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWIyNDg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2N3Y3R5cGUKQEAgLTAsMCArMSw4NyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGN3Y3R5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9DV0NUWVBFCisjZGVmaW5lIF9MSUJDUFBfQ1dDVFlQRQorCisvKgorICAgIGN3Y3R5cGUgc3lub3BzaXMKKworTWFjcm9zOgorCisgICAgV0VPRgorCituYW1lc3BhY2Ugc3RkCit7CisKK1R5cGVzOgorCisgICAgd2ludF90CisgICAgd2N0cmFuc190CisgICAgd2N0eXBlX3QKKworaW50IGlzd2FsbnVtKHdpbnRfdCB3Yyk7CitpbnQgaXN3YWxwaGEod2ludF90IHdjKTsKK2ludCBpc3dibGFuayh3aW50X3Qgd2MpOyAgLy8gQzk5CitpbnQgaXN3Y250cmwod2ludF90IHdjKTsKK2ludCBpc3dkaWdpdCh3aW50X3Qgd2MpOworaW50IGlzd2dyYXBoKHdpbnRfdCB3Yyk7CitpbnQgaXN3bG93ZXIod2ludF90IHdjKTsKK2ludCBpc3dwcmludCh3aW50X3Qgd2MpOworaW50IGlzd3B1bmN0KHdpbnRfdCB3Yyk7CitpbnQgaXN3c3BhY2Uod2ludF90IHdjKTsKK2ludCBpc3d1cHBlcih3aW50X3Qgd2MpOworaW50IGlzd3hkaWdpdCh3aW50X3Qgd2MpOworaW50IGlzd2N0eXBlKHdpbnRfdCB3Yywgd2N0eXBlX3QgZGVzYyk7Cit3Y3R5cGVfdCB3Y3R5cGUoY29uc3QgY2hhciogcHJvcGVydHkpOword2ludF90IHRvd2xvd2VyKHdpbnRfdCB3Yyk7Cit3aW50X3QgdG93dXBwZXIod2ludF90IHdjKTsKK3dpbnRfdCB0b3djdHJhbnMod2ludF90IHdjLCB3Y3RyYW5zX3QgZGVzYyk7Cit3Y3RyYW5zX3Qgd2N0cmFucyhjb25zdCBjaGFyKiBwcm9wZXJ0eSk7CisKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPHdjdHlwZS5oPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3VzaW5nIDo6d2ludF90OwordXNpbmcgOjp3Y3RyYW5zX3Q7Cit1c2luZyA6OndjdHlwZV90OwordXNpbmcgOjppc3dhbG51bTsKK3VzaW5nIDo6aXN3YWxwaGE7Cit1c2luZyA6Omlzd2JsYW5rOwordXNpbmcgOjppc3djbnRybDsKK3VzaW5nIDo6aXN3ZGlnaXQ7Cit1c2luZyA6Omlzd2dyYXBoOwordXNpbmcgOjppc3dsb3dlcjsKK3VzaW5nIDo6aXN3cHJpbnQ7Cit1c2luZyA6Omlzd3B1bmN0OwordXNpbmcgOjppc3dzcGFjZTsKK3VzaW5nIDo6aXN3dXBwZXI7Cit1c2luZyA6Omlzd3hkaWdpdDsKK3VzaW5nIDo6aXN3Y3R5cGU7Cit1c2luZyA6OndjdHlwZTsKK3VzaW5nIDo6dG93bG93ZXI7Cit1c2luZyA6OnRvd3VwcGVyOwordXNpbmcgOjp0b3djdHJhbnM7Cit1c2luZyA6OndjdHJhbnM7CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX0NXQ1RZUEUKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jeHhhYmkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9jeHhhYmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTk2NTYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2N4eGFiaS5oCkBAIC0wLDAgKzEsMTc3IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjeHhhYmkuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9fQ1hYQUJJX0gKKyNkZWZpbmUgX19DWFhBQklfSAorCisvKgorICogVGhpcyBoZWFkZXIgcHJvdmlkZXMgdGhlIGludGVyZmFjZSB0byB0aGUgQysrIEFCSSBhcyBkZWZpbmVkIGF0OgorICogICAgICAgaHR0cDovL3d3dy5jb2Rlc291cmNlcnkuY29tL2N4eC1hYmkvCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8X19jeHhhYmlfY29uZmlnLmg+CisKKyNkZWZpbmUgX0xJQkNQUEFCSV9WRVJTSU9OIDEwMDIKKyNkZWZpbmUgX0xJQkNYWEFCSV9OT1JFVFVSTiAgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKQorCisjaWZkZWYgX19jcGx1c3BsdXMKKworbmFtZXNwYWNlIHN0ZCB7CisjaWYgZGVmaW5lZChfV0lOMzIpCitjbGFzcyBfTElCQ1hYQUJJX1RZUEVfVklTIHR5cGVfaW5mbzsgLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgorI2Vsc2UKK2NsYXNzIHR5cGVfaW5mbzsgLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgorI2VuZGlmCit9CisKKworLy8gcnVudGltZSByb3V0aW5lcyB1c2UgQyBjYWxsaW5nIGNvbnZlbnRpb25zLCBidXQgYXJlIGluIF9fY3h4YWJpdjEgbmFtZXNwYWNlCituYW1lc3BhY2UgX19jeHhhYml2MSB7CitleHRlcm4gIkMiICB7CisKKy8vIDIuNC4yIEFsbG9jYXRpbmcgdGhlIEV4Y2VwdGlvbiBPYmplY3QKK2V4dGVybiBfTElCQ1hYQUJJX0ZVTkNfVklTIHZvaWQgKgorX19jeGFfYWxsb2NhdGVfZXhjZXB0aW9uKHNpemVfdCB0aHJvd25fc2l6ZSkgdGhyb3coKTsKK2V4dGVybiBfTElCQ1hYQUJJX0ZVTkNfVklTIHZvaWQKK19fY3hhX2ZyZWVfZXhjZXB0aW9uKHZvaWQgKnRocm93bl9leGNlcHRpb24pIHRocm93KCk7CisKKy8vIDIuNC4zIFRocm93aW5nIHRoZSBFeGNlcHRpb24gT2JqZWN0CitleHRlcm4gX0xJQkNYWEFCSV9GVU5DX1ZJUyBfTElCQ1hYQUJJX05PUkVUVVJOIHZvaWQKK19fY3hhX3Rocm93KHZvaWQgKnRocm93bl9leGNlcHRpb24sIHN0ZDo6dHlwZV9pbmZvICp0aW5mbywKKyAgICAgICAgICAgIHZvaWQgKCpkZXN0KSh2b2lkICopKTsKKworLy8gMi41LjMgRXhjZXB0aW9uIEhhbmRsZXJzCitleHRlcm4gX0xJQkNYWEFCSV9GVU5DX1ZJUyB2b2lkICoKK19fY3hhX2dldF9leGNlcHRpb25fcHRyKHZvaWQgKmV4Y2VwdGlvbk9iamVjdCkgdGhyb3coKTsKK2V4dGVybiBfTElCQ1hYQUJJX0ZVTkNfVklTIHZvaWQgKgorX19jeGFfYmVnaW5fY2F0Y2godm9pZCAqZXhjZXB0aW9uT2JqZWN0KSB0aHJvdygpOworZXh0ZXJuIF9MSUJDWFhBQklfRlVOQ19WSVMgdm9pZCBfX2N4YV9lbmRfY2F0Y2goKTsKKyNpZiBkZWZpbmVkKF9MSUJDWFhBQklfQVJNX0VIQUJJKQorZXh0ZXJuIF9MSUJDWFhBQklfRlVOQ19WSVMgYm9vbAorX19jeGFfYmVnaW5fY2xlYW51cCh2b2lkICpleGNlcHRpb25PYmplY3QpIHRocm93KCk7CitleHRlcm4gX0xJQkNYWEFCSV9GVU5DX1ZJUyB2b2lkIF9fY3hhX2VuZF9jbGVhbnVwKCk7CisjZW5kaWYKK2V4dGVybiBfTElCQ1hYQUJJX0ZVTkNfVklTIHN0ZDo6dHlwZV9pbmZvICpfX2N4YV9jdXJyZW50X2V4Y2VwdGlvbl90eXBlKCk7CisKKy8vIDIuNS40IFJldGhyb3dpbmcgRXhjZXB0aW9ucworZXh0ZXJuIF9MSUJDWFhBQklfRlVOQ19WSVMgX0xJQkNYWEFCSV9OT1JFVFVSTiB2b2lkIF9fY3hhX3JldGhyb3coKTsKKworLy8gMi42IEF1eGlsaWFyeSBSdW50aW1lIEFQSXMKK2V4dGVybiBfTElCQ1hYQUJJX0ZVTkNfVklTIF9MSUJDWFhBQklfTk9SRVRVUk4gdm9pZCBfX2N4YV9iYWRfY2FzdCh2b2lkKTsKK2V4dGVybiBfTElCQ1hYQUJJX0ZVTkNfVklTIF9MSUJDWFhBQklfTk9SRVRVUk4gdm9pZCBfX2N4YV9iYWRfdHlwZWlkKHZvaWQpOworZXh0ZXJuIF9MSUJDWFhBQklfRlVOQ19WSVMgX0xJQkNYWEFCSV9OT1JFVFVSTiB2b2lkCitfX2N4YV90aHJvd19iYWRfYXJyYXlfbmV3X2xlbmd0aCh2b2lkKTsKKworLy8gMy4yLjYgUHVyZSBWaXJ0dWFsIEZ1bmN0aW9uIEFQSQorZXh0ZXJuIF9MSUJDWFhBQklfRlVOQ19WSVMgX0xJQkNYWEFCSV9OT1JFVFVSTiB2b2lkIF9fY3hhX3B1cmVfdmlydHVhbCh2b2lkKTsKKworLy8gMy4yLjcgRGVsZXRlZCBWaXJ0dWFsIEZ1bmN0aW9uIEFQSQorZXh0ZXJuIF9MSUJDWFhBQklfRlVOQ19WSVMgX0xJQkNYWEFCSV9OT1JFVFVSTiB2b2lkIF9fY3hhX2RlbGV0ZWRfdmlydHVhbCh2b2lkKTsKKworLy8gMy4zLjIgT25lLXRpbWUgQ29uc3RydWN0aW9uIEFQSQorI2lmZGVmIF9fYXJtX18KK2V4dGVybiBfTElCQ1hYQUJJX0ZVTkNfVklTIGludCBfX2N4YV9ndWFyZF9hY3F1aXJlKHVpbnQzMl90ICopOworZXh0ZXJuIF9MSUJDWFhBQklfRlVOQ19WSVMgdm9pZCBfX2N4YV9ndWFyZF9yZWxlYXNlKHVpbnQzMl90ICopOworZXh0ZXJuIF9MSUJDWFhBQklfRlVOQ19WSVMgdm9pZCBfX2N4YV9ndWFyZF9hYm9ydCh1aW50MzJfdCAqKTsKKyNlbHNlCitleHRlcm4gX0xJQkNYWEFCSV9GVU5DX1ZJUyBpbnQgX19jeGFfZ3VhcmRfYWNxdWlyZSh1aW50NjRfdCAqKTsKK2V4dGVybiBfTElCQ1hYQUJJX0ZVTkNfVklTIHZvaWQgX19jeGFfZ3VhcmRfcmVsZWFzZSh1aW50NjRfdCAqKTsKK2V4dGVybiBfTElCQ1hYQUJJX0ZVTkNfVklTIHZvaWQgX19jeGFfZ3VhcmRfYWJvcnQodWludDY0X3QgKik7CisjZW5kaWYKKworLy8gMy4zLjMgQXJyYXkgQ29uc3RydWN0aW9uIGFuZCBEZXN0cnVjdGlvbiBBUEkKK2V4dGVybiBfTElCQ1hYQUJJX0ZVTkNfVklTIHZvaWQgKgorX19jeGFfdmVjX25ldyhzaXplX3QgZWxlbWVudF9jb3VudCwgc2l6ZV90IGVsZW1lbnRfc2l6ZSwgc2l6ZV90IHBhZGRpbmdfc2l6ZSwKKyAgICAgICAgICAgICAgdm9pZCAoKmNvbnN0cnVjdG9yKSh2b2lkICopLCB2b2lkICgqZGVzdHJ1Y3Rvcikodm9pZCAqKSk7CisKK2V4dGVybiBfTElCQ1hYQUJJX0ZVTkNfVklTIHZvaWQgKgorX19jeGFfdmVjX25ldzIoc2l6ZV90IGVsZW1lbnRfY291bnQsIHNpemVfdCBlbGVtZW50X3NpemUsIHNpemVfdCBwYWRkaW5nX3NpemUsCisgICAgICAgICAgICAgICB2b2lkICgqY29uc3RydWN0b3IpKHZvaWQgKiksIHZvaWQgKCpkZXN0cnVjdG9yKSh2b2lkICopLAorICAgICAgICAgICAgICAgdm9pZCAqKCphbGxvYykoc2l6ZV90KSwgdm9pZCAoKmRlYWxsb2MpKHZvaWQgKikpOworCitleHRlcm4gX0xJQkNYWEFCSV9GVU5DX1ZJUyB2b2lkICoKK19fY3hhX3ZlY19uZXczKHNpemVfdCBlbGVtZW50X2NvdW50LCBzaXplX3QgZWxlbWVudF9zaXplLCBzaXplX3QgcGFkZGluZ19zaXplLAorICAgICAgICAgICAgICAgdm9pZCAoKmNvbnN0cnVjdG9yKSh2b2lkICopLCB2b2lkICgqZGVzdHJ1Y3Rvcikodm9pZCAqKSwKKyAgICAgICAgICAgICAgIHZvaWQgKigqYWxsb2MpKHNpemVfdCksIHZvaWQgKCpkZWFsbG9jKSh2b2lkICosIHNpemVfdCkpOworCitleHRlcm4gX0xJQkNYWEFCSV9GVU5DX1ZJUyB2b2lkCitfX2N4YV92ZWNfY3Rvcih2b2lkICphcnJheV9hZGRyZXNzLCBzaXplX3QgZWxlbWVudF9jb3VudCwgc2l6ZV90IGVsZW1lbnRfc2l6ZSwKKyAgICAgICAgICAgICAgIHZvaWQgKCpjb25zdHJ1Y3Rvcikodm9pZCAqKSwgdm9pZCAoKmRlc3RydWN0b3IpKHZvaWQgKikpOworCitleHRlcm4gX0xJQkNYWEFCSV9GVU5DX1ZJUyB2b2lkIF9fY3hhX3ZlY19kdG9yKHZvaWQgKmFycmF5X2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlbGVtZW50X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZWxlbWVudF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZGVzdHJ1Y3Rvcikodm9pZCAqKSk7CisKK2V4dGVybiBfTElCQ1hYQUJJX0ZVTkNfVklTIHZvaWQgX19jeGFfdmVjX2NsZWFudXAodm9pZCAqYXJyYXlfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVsZW1lbnRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlbGVtZW50X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpkZXN0cnVjdG9yKSh2b2lkICopKTsKKworZXh0ZXJuIF9MSUJDWFhBQklfRlVOQ19WSVMgdm9pZCBfX2N4YV92ZWNfZGVsZXRlKHZvaWQgKmFycmF5X2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVsZW1lbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGFkZGluZ19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpkZXN0cnVjdG9yKSh2b2lkICopKTsKKworZXh0ZXJuIF9MSUJDWFhBQklfRlVOQ19WSVMgdm9pZAorX19jeGFfdmVjX2RlbGV0ZTIodm9pZCAqYXJyYXlfYWRkcmVzcywgc2l6ZV90IGVsZW1lbnRfc2l6ZSwgc2l6ZV90IHBhZGRpbmdfc2l6ZSwKKyAgICAgICAgICAgICAgICAgIHZvaWQgKCpkZXN0cnVjdG9yKSh2b2lkICopLCB2b2lkICgqZGVhbGxvYykodm9pZCAqKSk7CisKK2V4dGVybiBfTElCQ1hYQUJJX0ZVTkNfVklTIHZvaWQKK19fY3hhX3ZlY19kZWxldGUzKHZvaWQgKl9fYXJyYXlfYWRkcmVzcywgc2l6ZV90IGVsZW1lbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBwYWRkaW5nX3NpemUsIHZvaWQgKCpkZXN0cnVjdG9yKSh2b2lkICopLAorICAgICAgICAgICAgICAgICAgdm9pZCAoKmRlYWxsb2MpKHZvaWQgKiwgc2l6ZV90KSk7CisKK2V4dGVybiBfTElCQ1hYQUJJX0ZVTkNfVklTIHZvaWQKK19fY3hhX3ZlY19jY3Rvcih2b2lkICpkZXN0X2FycmF5LCB2b2lkICpzcmNfYXJyYXksIHNpemVfdCBlbGVtZW50X2NvdW50LAorICAgICAgICAgICAgICAgIHNpemVfdCBlbGVtZW50X3NpemUsIHZvaWQgKCpjb25zdHJ1Y3Rvcikodm9pZCAqLCB2b2lkICopLAorICAgICAgICAgICAgICAgIHZvaWQgKCpkZXN0cnVjdG9yKSh2b2lkICopKTsKKworLy8gMy4zLjUuMyBSdW50aW1lIEFQSQorZXh0ZXJuIF9MSUJDWFhBQklfRlVOQ19WSVMgaW50IF9fY3hhX2F0ZXhpdCh2b2lkICgqZikodm9pZCAqKSwgdm9pZCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZCk7CitleHRlcm4gX0xJQkNYWEFCSV9GVU5DX1ZJUyBpbnQgX19jeGFfZmluYWxpemUodm9pZCAqKTsKKworLy8gMy40IERlbWFuZ2xlciBBUEkKK2V4dGVybiBfTElCQ1hYQUJJX0ZVTkNfVklTIGNoYXIgKl9fY3hhX2RlbWFuZ2xlKGNvbnN0IGNoYXIgKm1hbmdsZWRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm91dHB1dF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmxlbmd0aCwgaW50ICpzdGF0dXMpOworCisvLyBBcHBsZSBhZGRpdGlvbnMgdG8gc3VwcG9ydCBDKysgMHggZXhjZXB0aW9uX3B0ciBjbGFzcworLy8gVGhlc2UgYXJlIHByaW1pdGl2ZXMgdG8gd3JhcCBhIHNtYXJ0IHBvaW50ZXIgYXJvdW5kIGFuIGV4Y2VwdGlvbiBvYmplY3QKK2V4dGVybiBfTElCQ1hYQUJJX0ZVTkNfVklTIHZvaWQgKl9fY3hhX2N1cnJlbnRfcHJpbWFyeV9leGNlcHRpb24oKSB0aHJvdygpOworZXh0ZXJuIF9MSUJDWFhBQklfRlVOQ19WSVMgdm9pZAorX19jeGFfcmV0aHJvd19wcmltYXJ5X2V4Y2VwdGlvbih2b2lkICpwcmltYXJ5X2V4Y2VwdGlvbik7CitleHRlcm4gX0xJQkNYWEFCSV9GVU5DX1ZJUyB2b2lkCitfX2N4YV9pbmNyZW1lbnRfZXhjZXB0aW9uX3JlZmNvdW50KHZvaWQgKnByaW1hcnlfZXhjZXB0aW9uKSB0aHJvdygpOworZXh0ZXJuIF9MSUJDWFhBQklfRlVOQ19WSVMgdm9pZAorX19jeGFfZGVjcmVtZW50X2V4Y2VwdGlvbl9yZWZjb3VudCh2b2lkICpwcmltYXJ5X2V4Y2VwdGlvbikgdGhyb3coKTsKKworLy8gQXBwbGUgZXh0ZW5zaW9uIHRvIHN1cHBvcnQgc3RkOjp1bmNhdWdodF9leGNlcHRpb24oKQorZXh0ZXJuIF9MSUJDWFhBQklfRlVOQ19WSVMgYm9vbCBfX2N4YV91bmNhdWdodF9leGNlcHRpb24oKSB0aHJvdygpOworZXh0ZXJuIF9MSUJDWFhBQklfRlVOQ19WSVMgdW5zaWduZWQgaW50IF9fY3hhX3VuY2F1Z2h0X2V4Y2VwdGlvbnMoKSB0aHJvdygpOworCisjaWZkZWYgX19saW51eF9fCisvLyBMaW51eCBUTFMgc3VwcG9ydC4gTm90IHlldCBhbiBvZmZpY2lhbCBwYXJ0IG9mIHRoZSBJdGFuaXVtIEFCSS4KKy8vIGh0dHBzOi8vc291cmNld2FyZS5vcmcvZ2xpYmMvd2lraS9EZXN0cnVjdG9yJTIwc3VwcG9ydCUyMGZvciUyMHRocmVhZF9sb2NhbCUyMHZhcmlhYmxlcworZXh0ZXJuIF9MSUJDWFhBQklfRlVOQ19WSVMgaW50IF9fY3hhX3RocmVhZF9hdGV4aXQodm9pZCAoKikodm9pZCAqKSwgdm9pZCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSB0aHJvdygpOworI2VuZGlmCisKK30gLy8gZXh0ZXJuICJDIgorfSAvLyBuYW1lc3BhY2UgX19jeHhhYml2MQorCituYW1lc3BhY2UgYWJpID0gX19jeHhhYml2MTsKKworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvLyBfX0NYWEFCSV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZGVxdWUgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZGVxdWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhjYjI5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9kZXF1ZQpAQCAtMCwwICsxLDI5MTAgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVxdWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfREVRVUUKKyNkZWZpbmUgX0xJQkNQUF9ERVFVRQorCisvKgorICAgIGRlcXVlIHN5bm9wc2lzCisKK25hbWVzcGFjZSBzdGQKK3sKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jYXRvciA9IGFsbG9jYXRvcjxUPiA+CitjbGFzcyBkZXF1ZQoreworcHVibGljOgorICAgIC8vIHR5cGVzOgorICAgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgQWxsb2NhdG9yIGFsbG9jYXRvcl90eXBlOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgaW1wbGVtZW50YXRpb24tZGVmaW5lZCAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIGltcGxlbWVudGF0aW9uLWRlZmluZWQgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6cG9pbnRlciAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6Y29uc3RfcG9pbnRlciAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAvLyBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgIGRlcXVlKCkgbm9leGNlcHQoaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisgICAgZXhwbGljaXQgZGVxdWUoY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOworICAgIGV4cGxpY2l0IGRlcXVlKHNpemVfdHlwZSBuKTsKKyAgICBleHBsaWNpdCBkZXF1ZShzaXplX3R5cGUgbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOyAvLyBDKysxNAorICAgIGRlcXVlKHNpemVfdHlwZSBuLCBjb25zdCB2YWx1ZV90eXBlJiB2KTsKKyAgICBkZXF1ZShzaXplX3R5cGUgbiwgY29uc3QgdmFsdWVfdHlwZSYgdiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOworICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICBkZXF1ZShJbnB1dEl0ZXJhdG9yIGYsIElucHV0SXRlcmF0b3IgbCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIGRlcXVlKElucHV0SXRlcmF0b3IgZiwgSW5wdXRJdGVyYXRvciBsLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7CisgICAgZGVxdWUoY29uc3QgZGVxdWUmIGMpOworICAgIGRlcXVlKGRlcXVlJiYgYykKKyAgICAgICAgbm9leGNlcHQoaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisgICAgZGVxdWUoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBpbCwgY29uc3QgQWxsb2NhdG9yJiBhID0gYWxsb2NhdG9yX3R5cGUoKSk7CisgICAgZGVxdWUoY29uc3QgZGVxdWUmIGMsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsKKyAgICBkZXF1ZShkZXF1ZSYmIGMsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsKKyAgICB+ZGVxdWUoKTsKKworICAgIGRlcXVlJiBvcGVyYXRvcj0oY29uc3QgZGVxdWUmIGMpOworICAgIGRlcXVlJiBvcGVyYXRvcj0oZGVxdWUmJiBjKQorICAgICAgICBub2V4Y2VwdCgKKyAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ6OnZhbHVlICYmCisgICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisgICAgZGVxdWUmIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IGlsKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkIGFzc2lnbihJbnB1dEl0ZXJhdG9yIGYsIElucHV0SXRlcmF0b3IgbCk7CisgICAgdm9pZCBhc3NpZ24oc2l6ZV90eXBlIG4sIGNvbnN0IHZhbHVlX3R5cGUmIHYpOworICAgIHZvaWQgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwpOworCisgICAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IG5vZXhjZXB0OworCisgICAgLy8gaXRlcmF0b3JzOgorCisgICAgaXRlcmF0b3IgICAgICAgYmVnaW4oKSBub2V4Y2VwdDsKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IG5vZXhjZXB0OworICAgIGl0ZXJhdG9yICAgICAgIGVuZCgpIG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IG5vZXhjZXB0OworCisgICAgcmV2ZXJzZV9pdGVyYXRvciAgICAgICByYmVnaW4oKSBub2V4Y2VwdDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IG5vZXhjZXB0OworICAgIHJldmVyc2VfaXRlcmF0b3IgICAgICAgcmVuZCgpIG5vZXhjZXB0OworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IG5vZXhjZXB0OworCisgICAgY29uc3RfaXRlcmF0b3IgICAgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdDsKKyAgICBjb25zdF9pdGVyYXRvciAgICAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyZW5kKCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICAvLyBjYXBhY2l0eToKKyAgICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IG5vZXhjZXB0OworICAgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IG5vZXhjZXB0OworICAgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuKTsKKyAgICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbiwgY29uc3QgdmFsdWVfdHlwZSYgdik7CisgICAgdm9pZCBzaHJpbmtfdG9fZml0KCk7CisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IG5vZXhjZXB0OworCisgICAgLy8gZWxlbWVudCBhY2Nlc3M6CisgICAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIGkpOworICAgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBpKSBjb25zdDsKKyAgICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIGkpOworICAgIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgaSkgY29uc3Q7CisgICAgcmVmZXJlbmNlIGZyb250KCk7CisgICAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3Q7CisgICAgcmVmZXJlbmNlIGJhY2soKTsKKyAgICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0OworCisgICAgLy8gbW9kaWZpZXJzOgorICAgIHZvaWQgcHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiB2KTsKKyAgICB2b2lkIHB1c2hfZnJvbnQodmFsdWVfdHlwZSYmIHYpOworICAgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIHYpOworICAgIHZvaWQgcHVzaF9iYWNrKHZhbHVlX3R5cGUmJiB2KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4gcmVmZXJlbmNlIGVtcGxhY2VfZnJvbnQoQXJncyYmLi4uIGFyZ3MpOyAgLy8gcmVmZXJlbmNlIGluIEMrKzE3CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+IHJlZmVyZW5jZSBlbXBsYWNlX2JhY2soQXJncyYmLi4uIGFyZ3MpOyAgIC8vIHJlZmVyZW5jZSBpbiBDKysxNworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPiBpdGVyYXRvciBlbXBsYWNlKGNvbnN0X2l0ZXJhdG9yIHAsIEFyZ3MmJi4uLiBhcmdzKTsKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcCwgY29uc3QgdmFsdWVfdHlwZSYgdik7CisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHAsIHZhbHVlX3R5cGUmJiB2KTsKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcCwgc2l6ZV90eXBlIG4sIGNvbnN0IHZhbHVlX3R5cGUmIHYpOworICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcCwgSW5wdXRJdGVyYXRvciBmLCBJbnB1dEl0ZXJhdG9yIGwpOworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwLCBpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IGlsKTsKKyAgICB2b2lkIHBvcF9mcm9udCgpOworICAgIHZvaWQgcG9wX2JhY2soKTsKKyAgICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBwKTsKKyAgICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBmLCBjb25zdF9pdGVyYXRvciBsKTsKKyAgICB2b2lkIHN3YXAoZGVxdWUmIGMpCisgICAgICAgIG5vZXhjZXB0KGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+Ojppc19hbHdheXNfZXF1YWw6OnZhbHVlKTsgIC8vIEMrKzE3CisgICAgdm9pZCBjbGVhcigpIG5vZXhjZXB0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgZGVxdWU8VCxBbGxvY2F0b3I+JiB4LCBjb25zdCBkZXF1ZTxULEFsbG9jYXRvcj4mIHkpOwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBib29sIG9wZXJhdG9yPCAoY29uc3QgZGVxdWU8VCxBbGxvY2F0b3I+JiB4LCBjb25zdCBkZXF1ZTxULEFsbG9jYXRvcj4mIHkpOwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgZGVxdWU8VCxBbGxvY2F0b3I+JiB4LCBjb25zdCBkZXF1ZTxULEFsbG9jYXRvcj4mIHkpOwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBib29sIG9wZXJhdG9yPiAoY29uc3QgZGVxdWU8VCxBbGxvY2F0b3I+JiB4LCBjb25zdCBkZXF1ZTxULEFsbG9jYXRvcj4mIHkpOwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBib29sIG9wZXJhdG9yPj0oY29uc3QgZGVxdWU8VCxBbGxvY2F0b3I+JiB4LCBjb25zdCBkZXF1ZTxULEFsbG9jYXRvcj4mIHkpOwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBib29sIG9wZXJhdG9yPD0oY29uc3QgZGVxdWU8VCxBbGxvY2F0b3I+JiB4LCBjb25zdCBkZXF1ZTxULEFsbG9jYXRvcj4mIHkpOworCisvLyBzcGVjaWFsaXplZCBhbGdvcml0aG1zOgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICB2b2lkIHN3YXAoZGVxdWU8VCxBbGxvY2F0b3I+JiB4LCBkZXF1ZTxULEFsbG9jYXRvcj4mIHkpCisgICAgICAgICBub2V4Y2VwdChub2V4Y2VwdCh4LnN3YXAoeSkpKTsKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxfX3NwbGl0X2J1ZmZlcj4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX1BVU0hfTUFDUk9TCisjaW5jbHVkZSA8X191bmRlZl9tYWNyb3M+CisKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+IGNsYXNzIF9fZGVxdWVfYmFzZTsKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3IgPSBhbGxvY2F0b3I8X1RwPiA+IGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGRlcXVlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlVHlwZSwgY2xhc3MgX1BvaW50ZXIsIGNsYXNzIF9SZWZlcmVuY2UsIGNsYXNzIF9NYXBQb2ludGVyLAorICAgICAgICAgIGNsYXNzIF9EaWZmVHlwZSwgX0RpZmZUeXBlIF9CbG9ja1NpemU+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2RlcXVlX2l0ZXJhdG9yOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JBSXRlciwKKyAgICAgICAgICBjbGFzcyBfVjIsIGNsYXNzIF9QMiwgY2xhc3MgX1IyLCBjbGFzcyBfTTIsIGNsYXNzIF9EMiwgX0QyIF9CMj4KK19fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj4KK2NvcHkoX1JBSXRlciBfX2YsCisgICAgIF9SQUl0ZXIgX19sLAorICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+IF9fciwKKyAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfcmFuZG9tX2FjY2Vzc19pdGVyYXRvcjxfUkFJdGVyPjo6dmFsdWU+Ojp0eXBlKiA9IDApOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1YxLCBjbGFzcyBfUDEsIGNsYXNzIF9SMSwgY2xhc3MgX00xLCBjbGFzcyBfRDEsIF9EMSBfQjEsCisgICAgICAgICAgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgorX091dHB1dEl0ZXJhdG9yCitjb3B5KF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19mLAorICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+IF9fbCwKKyAgICAgX091dHB1dEl0ZXJhdG9yIF9fcik7CisKK3RlbXBsYXRlIDxjbGFzcyBfVjEsIGNsYXNzIF9QMSwgY2xhc3MgX1IxLCBjbGFzcyBfTTEsIGNsYXNzIF9EMSwgX0QxIF9CMSwKKyAgICAgICAgICBjbGFzcyBfVjIsIGNsYXNzIF9QMiwgY2xhc3MgX1IyLCBjbGFzcyBfTTIsIGNsYXNzIF9EMiwgX0QyIF9CMj4KK19fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj4KK2NvcHkoX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPiBfX2YsCisgICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19sLAorICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+IF9fcik7CisKK3RlbXBsYXRlIDxjbGFzcyBfUkFJdGVyLAorICAgICAgICAgIGNsYXNzIF9WMiwgY2xhc3MgX1AyLCBjbGFzcyBfUjIsIGNsYXNzIF9NMiwgY2xhc3MgX0QyLCBfRDIgX0IyPgorX19kZXF1ZV9pdGVyYXRvcjxfVjIsIF9QMiwgX1IyLCBfTTIsIF9EMiwgX0IyPgorY29weV9iYWNrd2FyZChfUkFJdGVyIF9fZiwKKyAgICAgICAgICAgICAgX1JBSXRlciBfX2wsCisgICAgICAgICAgICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj4gX19yLAorICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19yYW5kb21fYWNjZXNzX2l0ZXJhdG9yPF9SQUl0ZXI+Ojp2YWx1ZT46OnR5cGUqID0gMCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfVjEsIGNsYXNzIF9QMSwgY2xhc3MgX1IxLCBjbGFzcyBfTTEsIGNsYXNzIF9EMSwgX0QxIF9CMSwKKyAgICAgICAgICBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitfT3V0cHV0SXRlcmF0b3IKK2NvcHlfYmFja3dhcmQoX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPiBfX2YsCisgICAgICAgICAgICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19sLAorICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19yKTsKKwordGVtcGxhdGUgPGNsYXNzIF9WMSwgY2xhc3MgX1AxLCBjbGFzcyBfUjEsIGNsYXNzIF9NMSwgY2xhc3MgX0QxLCBfRDEgX0IxLAorICAgICAgICAgIGNsYXNzIF9WMiwgY2xhc3MgX1AyLCBjbGFzcyBfUjIsIGNsYXNzIF9NMiwgY2xhc3MgX0QyLCBfRDIgX0IyPgorX19kZXF1ZV9pdGVyYXRvcjxfVjIsIF9QMiwgX1IyLCBfTTIsIF9EMiwgX0IyPgorY29weV9iYWNrd2FyZChfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+IF9fZiwKKyAgICAgICAgICAgICAgX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPiBfX2wsCisgICAgICAgICAgICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj4gX19yKTsKKwordGVtcGxhdGUgPGNsYXNzIF9SQUl0ZXIsCisgICAgICAgICAgY2xhc3MgX1YyLCBjbGFzcyBfUDIsIGNsYXNzIF9SMiwgY2xhc3MgX00yLCBjbGFzcyBfRDIsIF9EMiBfQjI+CitfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+Cittb3ZlKF9SQUl0ZXIgX19mLAorICAgICBfUkFJdGVyIF9fbCwKKyAgICAgX19kZXF1ZV9pdGVyYXRvcjxfVjIsIF9QMiwgX1IyLCBfTTIsIF9EMiwgX0IyPiBfX3IsCisgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3JhbmRvbV9hY2Nlc3NfaXRlcmF0b3I8X1JBSXRlcj46OnZhbHVlPjo6dHlwZSogPSAwKTsKKwordGVtcGxhdGUgPGNsYXNzIF9WMSwgY2xhc3MgX1AxLCBjbGFzcyBfUjEsIGNsYXNzIF9NMSwgY2xhc3MgX0QxLCBfRDEgX0IxLAorICAgICAgICAgIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK19PdXRwdXRJdGVyYXRvcgorbW92ZShfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+IF9fZiwKKyAgICAgX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPiBfX2wsCisgICAgIF9PdXRwdXRJdGVyYXRvciBfX3IpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1YxLCBjbGFzcyBfUDEsIGNsYXNzIF9SMSwgY2xhc3MgX00xLCBjbGFzcyBfRDEsIF9EMSBfQjEsCisgICAgICAgICAgY2xhc3MgX1YyLCBjbGFzcyBfUDIsIGNsYXNzIF9SMiwgY2xhc3MgX00yLCBjbGFzcyBfRDIsIF9EMiBfQjI+CitfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+Cittb3ZlKF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19mLAorICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+IF9fbCwKKyAgICAgX19kZXF1ZV9pdGVyYXRvcjxfVjIsIF9QMiwgX1IyLCBfTTIsIF9EMiwgX0IyPiBfX3IpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JBSXRlciwKKyAgICAgICAgICBjbGFzcyBfVjIsIGNsYXNzIF9QMiwgY2xhc3MgX1IyLCBjbGFzcyBfTTIsIGNsYXNzIF9EMiwgX0QyIF9CMj4KK19fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj4KK21vdmVfYmFja3dhcmQoX1JBSXRlciBfX2YsCisgICAgICAgICAgICAgIF9SQUl0ZXIgX19sLAorICAgICAgICAgICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+IF9fciwKKyAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfcmFuZG9tX2FjY2Vzc19pdGVyYXRvcjxfUkFJdGVyPjo6dmFsdWU+Ojp0eXBlKiA9IDApOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1YxLCBjbGFzcyBfUDEsIGNsYXNzIF9SMSwgY2xhc3MgX00xLCBjbGFzcyBfRDEsIF9EMSBfQjEsCisgICAgICAgICAgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgorX091dHB1dEl0ZXJhdG9yCittb3ZlX2JhY2t3YXJkKF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19mLAorICAgICAgICAgICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+IF9fbCwKKyAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcik7CisKK3RlbXBsYXRlIDxjbGFzcyBfVjEsIGNsYXNzIF9QMSwgY2xhc3MgX1IxLCBjbGFzcyBfTTEsIGNsYXNzIF9EMSwgX0QxIF9CMSwKKyAgICAgICAgICBjbGFzcyBfVjIsIGNsYXNzIF9QMiwgY2xhc3MgX1IyLCBjbGFzcyBfTTIsIGNsYXNzIF9EMiwgX0QyIF9CMj4KK19fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj4KK21vdmVfYmFja3dhcmQoX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPiBfX2YsCisgICAgICAgICAgICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19sLAorICAgICAgICAgICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+IF9fcik7CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWVUeXBlLCBjbGFzcyBfRGlmZlR5cGU+CitzdHJ1Y3QgX19kZXF1ZV9ibG9ja19zaXplIHsKKyAgc3RhdGljIGNvbnN0IF9EaWZmVHlwZSB2YWx1ZSA9IHNpemVvZihfVmFsdWVUeXBlKSA8IDI1NiA/IDQwOTYgLyBzaXplb2YoX1ZhbHVlVHlwZSkgOiAxNjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWVUeXBlLCBjbGFzcyBfUG9pbnRlciwgY2xhc3MgX1JlZmVyZW5jZSwgY2xhc3MgX01hcFBvaW50ZXIsCisgICAgICAgICAgY2xhc3MgX0RpZmZUeXBlLCBfRGlmZlR5cGUgX0JTID0KKyNpZmRlZiBfTElCQ1BQX0FCSV9JTkNPTVBMRVRFX1RZUEVTX0lOX0RFUVVFCisvLyBLZWVwIHRlbXBsYXRlIHBhcmFtZXRlciB0byBhdm9pZCBjaGFuZ2luZyBhbGwgdGVtcGxhdGUgZGVjbGFyYXRpb25zIHRob3VnaG91dAorLy8gdGhpcyBmaWxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kZXF1ZV9ibG9ja19zaXplPF9WYWx1ZVR5cGUsIF9EaWZmVHlwZT46OnZhbHVlCisjZW5kaWYKKyAgICAgICAgICA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2RlcXVlX2l0ZXJhdG9yCit7CisgICAgdHlwZWRlZiBfTWFwUG9pbnRlciBfX21hcF9pdGVyYXRvcjsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9Qb2ludGVyICBwb2ludGVyOworICAgIHR5cGVkZWYgX0RpZmZUeXBlIGRpZmZlcmVuY2VfdHlwZTsKK3ByaXZhdGU6CisgICAgX19tYXBfaXRlcmF0b3IgX19tX2l0ZXJfOworICAgIHBvaW50ZXIgICAgICAgIF9fcHRyXzsKKworICAgIHN0YXRpYyBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19ibG9ja19zaXplOworcHVibGljOgorICAgIHR5cGVkZWYgX1ZhbHVlVHlwZSAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBfUmVmZXJlbmNlICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX2RlcXVlX2l0ZXJhdG9yKCkgX05PRVhDRVBUCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICAgOiBfX21faXRlcl8obnVsbHB0ciksIF9fcHRyXyhudWxscHRyKQorI2VuZGlmCisgICAgIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1BwLCBjbGFzcyBfUnAsIGNsYXNzIF9NUD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19kZXF1ZV9pdGVyYXRvcihjb25zdCBfX2RlcXVlX2l0ZXJhdG9yPHZhbHVlX3R5cGUsIF9QcCwgX1JwLCBfTVAsIGRpZmZlcmVuY2VfdHlwZSwgX0JTPiYgX19pdCwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8X1BwLCBwb2ludGVyPjo6dmFsdWU+Ojp0eXBlKiA9IDApIF9OT0VYQ0VQVAorICAgICAgICA6IF9fbV9pdGVyXyhfX2l0Ll9fbV9pdGVyXyksIF9fcHRyXyhfX2l0Ll9fcHRyXykge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHtyZXR1cm4gKl9fcHRyXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7cmV0dXJuIF9fcHRyXzt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fZGVxdWVfaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgIHsKKyAgICAgICAgaWYgKCsrX19wdHJfIC0gKl9fbV9pdGVyXyA9PSBfX2Jsb2NrX3NpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgICsrX19tX2l0ZXJfOworICAgICAgICAgICAgX19wdHJfID0gKl9fbV9pdGVyXzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX2RlcXVlX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KQorICAgIHsKKyAgICAgICAgX19kZXF1ZV9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOworICAgICAgICArKygqdGhpcyk7CisgICAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fZGVxdWVfaXRlcmF0b3ImIG9wZXJhdG9yLS0oKQorICAgIHsKKyAgICAgICAgaWYgKF9fcHRyXyA9PSAqX19tX2l0ZXJfKQorICAgICAgICB7CisgICAgICAgICAgICAtLV9fbV9pdGVyXzsKKyAgICAgICAgICAgIF9fcHRyXyA9ICpfX21faXRlcl8gKyBfX2Jsb2NrX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgLS1fX3B0cl87CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fZGVxdWVfaXRlcmF0b3Igb3BlcmF0b3ItLShpbnQpCisgICAgeworICAgICAgICBfX2RlcXVlX2l0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CisgICAgICAgIC0tKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuIF9fdG1wOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX19kZXF1ZV9pdGVyYXRvciYgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19uKQorICAgIHsKKyAgICAgICAgaWYgKF9fbiAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBfX24gKz0gX19wdHJfIC0gKl9fbV9pdGVyXzsKKyAgICAgICAgICAgIGlmIChfX24gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fbV9pdGVyXyArPSBfX24gLyBfX2Jsb2NrX3NpemU7CisgICAgICAgICAgICAgICAgX19wdHJfID0gKl9fbV9pdGVyXyArIF9fbiAlIF9fYmxvY2tfc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLy8gKF9fbiA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9feiA9IF9fYmxvY2tfc2l6ZSAtIDEgLSBfX247CisgICAgICAgICAgICAgICAgX19tX2l0ZXJfIC09IF9feiAvIF9fYmxvY2tfc2l6ZTsKKyAgICAgICAgICAgICAgICBfX3B0cl8gPSAqX19tX2l0ZXJfICsgKF9fYmxvY2tfc2l6ZSAtIDEgLSBfX3ogJSBfX2Jsb2NrX3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fZGVxdWVfaXRlcmF0b3ImIG9wZXJhdG9yLT0oZGlmZmVyZW5jZV90eXBlIF9fbikKKyAgICB7CisgICAgICAgIHJldHVybiAqdGhpcyArPSAtX19uOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX19kZXF1ZV9pdGVyYXRvciBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICAgIF9fZGVxdWVfaXRlcmF0b3IgX190KCp0aGlzKTsKKyAgICAgICAgX190ICs9IF9fbjsKKyAgICAgICAgcmV0dXJuIF9fdDsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fZGVxdWVfaXRlcmF0b3Igb3BlcmF0b3ItKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgICBfX2RlcXVlX2l0ZXJhdG9yIF9fdCgqdGhpcyk7CisgICAgICAgIF9fdCAtPSBfX247CisgICAgICAgIHJldHVybiBfX3Q7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGZyaWVuZCBfX2RlcXVlX2l0ZXJhdG9yIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgX19uLCBjb25zdCBfX2RlcXVlX2l0ZXJhdG9yJiBfX2l0KQorICAgICAgICB7cmV0dXJuIF9faXQgKyBfX247fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGZyaWVuZCBkaWZmZXJlbmNlX3R5cGUgb3BlcmF0b3ItKGNvbnN0IF9fZGVxdWVfaXRlcmF0b3ImIF9feCwgY29uc3QgX19kZXF1ZV9pdGVyYXRvciYgX195KQorICAgIHsKKyAgICAgICAgaWYgKF9feCAhPSBfX3kpCisgICAgICAgICAgICByZXR1cm4gKF9feC5fX21faXRlcl8gLSBfX3kuX19tX2l0ZXJfKSAqIF9fYmxvY2tfc2l6ZQorICAgICAgICAgICAgICAgICArIChfX3guX19wdHJfIC0gKl9feC5fX21faXRlcl8pCisgICAgICAgICAgICAgICAgIC0gKF9feS5fX3B0cl8gLSAqX195Ll9fbV9pdGVyXyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmVmZXJlbmNlIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QKKyAgICAgICAge3JldHVybiAqKCp0aGlzICsgX19uKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZyaWVuZAorICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgX19kZXF1ZV9pdGVyYXRvciYgX194LCBjb25zdCBfX2RlcXVlX2l0ZXJhdG9yJiBfX3kpCisgICAgICAgIHtyZXR1cm4gX194Ll9fcHRyXyA9PSBfX3kuX19wdHJfO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZnJpZW5kCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfX2RlcXVlX2l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9fZGVxdWVfaXRlcmF0b3ImIF9feSkKKyAgICAgICAge3JldHVybiAhKF9feCA9PSBfX3kpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZnJpZW5kCisgICAgICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IF9fZGVxdWVfaXRlcmF0b3ImIF9feCwgY29uc3QgX19kZXF1ZV9pdGVyYXRvciYgX195KQorICAgICAgICB7cmV0dXJuIF9feC5fX21faXRlcl8gPCBfX3kuX19tX2l0ZXJfIHx8CisgICAgICAgICAgICAgICAoX194Ll9fbV9pdGVyXyA9PSBfX3kuX19tX2l0ZXJfICYmIF9feC5fX3B0cl8gPCBfX3kuX19wdHJfKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZyaWVuZAorICAgICAgICBib29sIG9wZXJhdG9yPihjb25zdCBfX2RlcXVlX2l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9fZGVxdWVfaXRlcmF0b3ImIF9feSkKKyAgICAgICAge3JldHVybiBfX3kgPCBfX3g7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmcmllbmQKKyAgICAgICAgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IF9fZGVxdWVfaXRlcmF0b3ImIF9feCwgY29uc3QgX19kZXF1ZV9pdGVyYXRvciYgX195KQorICAgICAgICB7cmV0dXJuICEoX195IDwgX194KTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZyaWVuZAorICAgICAgICBib29sIG9wZXJhdG9yPj0oY29uc3QgX19kZXF1ZV9pdGVyYXRvciYgX194LCBjb25zdCBfX2RlcXVlX2l0ZXJhdG9yJiBfX3kpCisgICAgICAgIHtyZXR1cm4gIShfX3ggPCBfX3kpO30KKworcHJpdmF0ZToKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fZGVxdWVfaXRlcmF0b3IoX19tYXBfaXRlcmF0b3IgX19tLCBwb2ludGVyIF9fcCkgX05PRVhDRVBUCisgICAgICAgIDogX19tX2l0ZXJfKF9fbSksIF9fcHRyXyhfX3ApIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXA+IGZyaWVuZCBjbGFzcyBfX2RlcXVlX2Jhc2U7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FwPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgZGVxdWU7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9WcCwgY2xhc3MgX1BwLCBjbGFzcyBfUnAsIGNsYXNzIF9NUCwgY2xhc3MgX0RwLCBfRHA+CisgICAgICAgIGZyaWVuZCBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2RlcXVlX2l0ZXJhdG9yOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9SQUl0ZXIsCisgICAgICAgICAgICAgIGNsYXNzIF9WMiwgY2xhc3MgX1AyLCBjbGFzcyBfUjIsIGNsYXNzIF9NMiwgY2xhc3MgX0QyLCBfRDIgX0IyPgorICAgIGZyaWVuZAorICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj4KKyAgICBjb3B5KF9SQUl0ZXIgX19mLAorICAgICAgICAgX1JBSXRlciBfX2wsCisgICAgICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+IF9fciwKKyAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3JhbmRvbV9hY2Nlc3NfaXRlcmF0b3I8X1JBSXRlcj46OnZhbHVlPjo6dHlwZSopOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9WMSwgY2xhc3MgX1AxLCBjbGFzcyBfUjEsIGNsYXNzIF9NMSwgY2xhc3MgX0QxLCBfRDEgX0IxLAorICAgICAgICAgICAgICBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CisgICAgZnJpZW5kCisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgY29weShfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+IF9fZiwKKyAgICAgICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19sLAorICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcik7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1YxLCBjbGFzcyBfUDEsIGNsYXNzIF9SMSwgY2xhc3MgX00xLCBjbGFzcyBfRDEsIF9EMSBfQjEsCisgICAgICAgICAgICAgIGNsYXNzIF9WMiwgY2xhc3MgX1AyLCBjbGFzcyBfUjIsIGNsYXNzIF9NMiwgY2xhc3MgX0QyLCBfRDIgX0IyPgorICAgIGZyaWVuZAorICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj4KKyAgICBjb3B5KF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19mLAorICAgICAgICAgX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPiBfX2wsCisgICAgICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+IF9fcik7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1JBSXRlciwKKyAgICAgICAgICAgICAgY2xhc3MgX1YyLCBjbGFzcyBfUDIsIGNsYXNzIF9SMiwgY2xhc3MgX00yLCBjbGFzcyBfRDIsIF9EMiBfQjI+CisgICAgZnJpZW5kCisgICAgX19kZXF1ZV9pdGVyYXRvcjxfVjIsIF9QMiwgX1IyLCBfTTIsIF9EMiwgX0IyPgorICAgIGNvcHlfYmFja3dhcmQoX1JBSXRlciBfX2YsCisgICAgICAgICAgICAgICAgICBfUkFJdGVyIF9fbCwKKyAgICAgICAgICAgICAgICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj4gX19yLAorICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfcmFuZG9tX2FjY2Vzc19pdGVyYXRvcjxfUkFJdGVyPjo6dmFsdWU+Ojp0eXBlKik7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1YxLCBjbGFzcyBfUDEsIGNsYXNzIF9SMSwgY2xhc3MgX00xLCBjbGFzcyBfRDEsIF9EMSBfQjEsCisgICAgICAgICAgICAgIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBmcmllbmQKKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBjb3B5X2JhY2t3YXJkKF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19mLAorICAgICAgICAgICAgICAgICAgX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPiBfX2wsCisgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19yKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVjEsIGNsYXNzIF9QMSwgY2xhc3MgX1IxLCBjbGFzcyBfTTEsIGNsYXNzIF9EMSwgX0QxIF9CMSwKKyAgICAgICAgICAgICAgY2xhc3MgX1YyLCBjbGFzcyBfUDIsIGNsYXNzIF9SMiwgY2xhc3MgX00yLCBjbGFzcyBfRDIsIF9EMiBfQjI+CisgICAgZnJpZW5kCisgICAgX19kZXF1ZV9pdGVyYXRvcjxfVjIsIF9QMiwgX1IyLCBfTTIsIF9EMiwgX0IyPgorICAgIGNvcHlfYmFja3dhcmQoX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPiBfX2YsCisgICAgICAgICAgICAgICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+IF9fbCwKKyAgICAgICAgICAgICAgICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj4gX19yKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfUkFJdGVyLAorICAgICAgICAgICAgICBjbGFzcyBfVjIsIGNsYXNzIF9QMiwgY2xhc3MgX1IyLCBjbGFzcyBfTTIsIGNsYXNzIF9EMiwgX0QyIF9CMj4KKyAgICBmcmllbmQKKyAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+CisgICAgbW92ZShfUkFJdGVyIF9fZiwKKyAgICAgICAgIF9SQUl0ZXIgX19sLAorICAgICAgICAgX19kZXF1ZV9pdGVyYXRvcjxfVjIsIF9QMiwgX1IyLCBfTTIsIF9EMiwgX0IyPiBfX3IsCisgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19yYW5kb21fYWNjZXNzX2l0ZXJhdG9yPF9SQUl0ZXI+Ojp2YWx1ZT46OnR5cGUqKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVjEsIGNsYXNzIF9QMSwgY2xhc3MgX1IxLCBjbGFzcyBfTTEsIGNsYXNzIF9EMSwgX0QxIF9CMSwKKyAgICAgICAgICAgICAgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgorICAgIGZyaWVuZAorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIG1vdmUoX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPiBfX2YsCisgICAgICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+IF9fbCwKKyAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3IpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9WMSwgY2xhc3MgX1AxLCBjbGFzcyBfUjEsIGNsYXNzIF9NMSwgY2xhc3MgX0QxLCBfRDEgX0IxLAorICAgICAgICAgICAgICBjbGFzcyBfVjIsIGNsYXNzIF9QMiwgY2xhc3MgX1IyLCBjbGFzcyBfTTIsIGNsYXNzIF9EMiwgX0QyIF9CMj4KKyAgICBmcmllbmQKKyAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+CisgICAgbW92ZShfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+IF9fZiwKKyAgICAgICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19sLAorICAgICAgICAgX19kZXF1ZV9pdGVyYXRvcjxfVjIsIF9QMiwgX1IyLCBfTTIsIF9EMiwgX0IyPiBfX3IpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9SQUl0ZXIsCisgICAgICAgICAgICAgIGNsYXNzIF9WMiwgY2xhc3MgX1AyLCBjbGFzcyBfUjIsIGNsYXNzIF9NMiwgY2xhc3MgX0QyLCBfRDIgX0IyPgorICAgIGZyaWVuZAorICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj4KKyAgICBtb3ZlX2JhY2t3YXJkKF9SQUl0ZXIgX19mLAorICAgICAgICAgICAgICAgICAgX1JBSXRlciBfX2wsCisgICAgICAgICAgICAgICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+IF9fciwKKyAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3JhbmRvbV9hY2Nlc3NfaXRlcmF0b3I8X1JBSXRlcj46OnZhbHVlPjo6dHlwZSopOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9WMSwgY2xhc3MgX1AxLCBjbGFzcyBfUjEsIGNsYXNzIF9NMSwgY2xhc3MgX0QxLCBfRDEgX0IxLAorICAgICAgICAgICAgICBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CisgICAgZnJpZW5kCisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgbW92ZV9iYWNrd2FyZChfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+IF9fZiwKKyAgICAgICAgICAgICAgICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19sLAorICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcik7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1YxLCBjbGFzcyBfUDEsIGNsYXNzIF9SMSwgY2xhc3MgX00xLCBjbGFzcyBfRDEsIF9EMSBfQjEsCisgICAgICAgICAgICAgIGNsYXNzIF9WMiwgY2xhc3MgX1AyLCBjbGFzcyBfUjIsIGNsYXNzIF9NMiwgY2xhc3MgX0QyLCBfRDIgX0IyPgorICAgIGZyaWVuZAorICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj4KKyAgICBtb3ZlX2JhY2t3YXJkKF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19mLAorICAgICAgICAgICAgICAgICAgX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPiBfX2wsCisgICAgICAgICAgICAgICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+IF9fcik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlVHlwZSwgY2xhc3MgX1BvaW50ZXIsIGNsYXNzIF9SZWZlcmVuY2UsIGNsYXNzIF9NYXBQb2ludGVyLAorICAgICAgICAgIGNsYXNzIF9EaWZmVHlwZSwgX0RpZmZUeXBlIF9CbG9ja1NpemU+Citjb25zdCBfRGlmZlR5cGUgX19kZXF1ZV9pdGVyYXRvcjxfVmFsdWVUeXBlLCBfUG9pbnRlciwgX1JlZmVyZW5jZSwgX01hcFBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlmZlR5cGUsIF9CbG9ja1NpemU+OjpfX2Jsb2NrX3NpemUgPQorICAgIF9fZGVxdWVfYmxvY2tfc2l6ZTxfVmFsdWVUeXBlLCBfRGlmZlR5cGU+Ojp2YWx1ZTsKKworLy8gY29weQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JBSXRlciwKKyAgICAgICAgICBjbGFzcyBfVjIsIGNsYXNzIF9QMiwgY2xhc3MgX1IyLCBjbGFzcyBfTTIsIGNsYXNzIF9EMiwgX0QyIF9CMj4KK19fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj4KK2NvcHkoX1JBSXRlciBfX2YsCisgICAgIF9SQUl0ZXIgX19sLAorICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+IF9fciwKKyAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfcmFuZG9tX2FjY2Vzc19pdGVyYXRvcjxfUkFJdGVyPjo6dmFsdWU+Ojp0eXBlKikKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+Ojpwb2ludGVyIHBvaW50ZXI7CisgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fYmxvY2tfc2l6ZSA9IF9fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj46Ol9fYmxvY2tfc2l6ZTsKKyAgICB3aGlsZSAoX19mICE9IF9fbCkKKyAgICB7CisgICAgICAgIHBvaW50ZXIgX19yYiA9IF9fci5fX3B0cl87CisgICAgICAgIHBvaW50ZXIgX19yZSA9ICpfX3IuX19tX2l0ZXJfICsgX19ibG9ja19zaXplOworICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19icyA9IF9fcmUgLSBfX3JiOworICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19sIC0gX19mOworICAgICAgICBfUkFJdGVyIF9fbSA9IF9fbDsKKyAgICAgICAgaWYgKF9fbiA+IF9fYnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fbiA9IF9fYnM7CisgICAgICAgICAgICBfX20gPSBfX2YgKyBfX247CisgICAgICAgIH0KKyAgICAgICAgX1ZTVEQ6OmNvcHkoX19mLCBfX20sIF9fcmIpOworICAgICAgICBfX2YgPSBfX207CisgICAgICAgIF9fciArPSBfX247CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVjEsIGNsYXNzIF9QMSwgY2xhc3MgX1IxLCBjbGFzcyBfTTEsIGNsYXNzIF9EMSwgX0QxIF9CMSwKKyAgICAgICAgICBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitfT3V0cHV0SXRlcmF0b3IKK2NvcHkoX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPiBfX2YsCisgICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19sLAorICAgICBfT3V0cHV0SXRlcmF0b3IgX19yKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT46OnBvaW50ZXIgcG9pbnRlcjsKKyAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19ibG9ja19zaXplID0gX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPjo6X19ibG9ja19zaXplOworICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX2wgLSBfX2Y7CisgICAgd2hpbGUgKF9fbiA+IDApCisgICAgeworICAgICAgICBwb2ludGVyIF9fZmIgPSBfX2YuX19wdHJfOworICAgICAgICBwb2ludGVyIF9fZmUgPSAqX19mLl9fbV9pdGVyXyArIF9fYmxvY2tfc2l6ZTsKKyAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fYnMgPSBfX2ZlIC0gX19mYjsKKyAgICAgICAgaWYgKF9fYnMgPiBfX24pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fYnMgPSBfX247CisgICAgICAgICAgICBfX2ZlID0gX19mYiArIF9fYnM7CisgICAgICAgIH0KKyAgICAgICAgX19yID0gX1ZTVEQ6OmNvcHkoX19mYiwgX19mZSwgX19yKTsKKyAgICAgICAgX19uIC09IF9fYnM7CisgICAgICAgIF9fZiArPSBfX2JzOworICAgIH0KKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1YxLCBjbGFzcyBfUDEsIGNsYXNzIF9SMSwgY2xhc3MgX00xLCBjbGFzcyBfRDEsIF9EMSBfQjEsCisgICAgICAgICAgY2xhc3MgX1YyLCBjbGFzcyBfUDIsIGNsYXNzIF9SMiwgY2xhc3MgX00yLCBjbGFzcyBfRDIsIF9EMiBfQjI+CitfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+Citjb3B5KF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19mLAorICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+IF9fbCwKKyAgICAgX19kZXF1ZV9pdGVyYXRvcjxfVjIsIF9QMiwgX1IyLCBfTTIsIF9EMiwgX0IyPiBfX3IpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPjo6cG9pbnRlciBwb2ludGVyOworICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2Jsb2NrX3NpemUgPSBfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+OjpfX2Jsb2NrX3NpemU7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9fbCAtIF9fZjsKKyAgICB3aGlsZSAoX19uID4gMCkKKyAgICB7CisgICAgICAgIHBvaW50ZXIgX19mYiA9IF9fZi5fX3B0cl87CisgICAgICAgIHBvaW50ZXIgX19mZSA9ICpfX2YuX19tX2l0ZXJfICsgX19ibG9ja19zaXplOworICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19icyA9IF9fZmUgLSBfX2ZiOworICAgICAgICBpZiAoX19icyA+IF9fbikKKyAgICAgICAgeworICAgICAgICAgICAgX19icyA9IF9fbjsKKyAgICAgICAgICAgIF9fZmUgPSBfX2ZiICsgX19iczsKKyAgICAgICAgfQorICAgICAgICBfX3IgPSBfVlNURDo6Y29weShfX2ZiLCBfX2ZlLCBfX3IpOworICAgICAgICBfX24gLT0gX19iczsKKyAgICAgICAgX19mICs9IF9fYnM7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKKy8vIGNvcHlfYmFja3dhcmQKKwordGVtcGxhdGUgPGNsYXNzIF9SQUl0ZXIsCisgICAgICAgICAgY2xhc3MgX1YyLCBjbGFzcyBfUDIsIGNsYXNzIF9SMiwgY2xhc3MgX00yLCBjbGFzcyBfRDIsIF9EMiBfQjI+CitfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+Citjb3B5X2JhY2t3YXJkKF9SQUl0ZXIgX19mLAorICAgICAgICAgICAgICBfUkFJdGVyIF9fbCwKKyAgICAgICAgICAgICAgX19kZXF1ZV9pdGVyYXRvcjxfVjIsIF9QMiwgX1IyLCBfTTIsIF9EMiwgX0IyPiBfX3IsCisgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3JhbmRvbV9hY2Nlc3NfaXRlcmF0b3I8X1JBSXRlcj46OnZhbHVlPjo6dHlwZSopCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19kZXF1ZV9pdGVyYXRvcjxfVjIsIF9QMiwgX1IyLCBfTTIsIF9EMiwgX0IyPjo6cG9pbnRlciBwb2ludGVyOworICAgIHdoaWxlIChfX2YgIT0gX19sKQorICAgIHsKKyAgICAgICAgX19kZXF1ZV9pdGVyYXRvcjxfVjIsIF9QMiwgX1IyLCBfTTIsIF9EMiwgX0IyPiBfX3JwID0gX1ZTVEQ6OnByZXYoX19yKTsKKyAgICAgICAgcG9pbnRlciBfX3JiID0gKl9fcnAuX19tX2l0ZXJfOworICAgICAgICBwb2ludGVyIF9fcmUgPSBfX3JwLl9fcHRyXyArIDE7CisgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2JzID0gX19yZSAtIF9fcmI7CisgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX2wgLSBfX2Y7CisgICAgICAgIF9SQUl0ZXIgX19tID0gX19mOworICAgICAgICBpZiAoX19uID4gX19icykKKyAgICAgICAgeworICAgICAgICAgICAgX19uID0gX19iczsKKyAgICAgICAgICAgIF9fbSA9IF9fbCAtIF9fbjsKKyAgICAgICAgfQorICAgICAgICBfVlNURDo6Y29weV9iYWNrd2FyZChfX20sIF9fbCwgX19yZSk7CisgICAgICAgIF9fbCA9IF9fbTsKKyAgICAgICAgX19yIC09IF9fbjsKKyAgICB9CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WMSwgY2xhc3MgX1AxLCBjbGFzcyBfUjEsIGNsYXNzIF9NMSwgY2xhc3MgX0QxLCBfRDEgX0IxLAorICAgICAgICAgIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK19PdXRwdXRJdGVyYXRvcgorY29weV9iYWNrd2FyZChfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+IF9fZiwKKyAgICAgICAgICAgICAgX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPiBfX2wsCisgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3IpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPjo6cG9pbnRlciBwb2ludGVyOworICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX2wgLSBfX2Y7CisgICAgd2hpbGUgKF9fbiA+IDApCisgICAgeworICAgICAgICAtLV9fbDsKKyAgICAgICAgcG9pbnRlciBfX2xiID0gKl9fbC5fX21faXRlcl87CisgICAgICAgIHBvaW50ZXIgX19sZSA9IF9fbC5fX3B0cl8gKyAxOworICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19icyA9IF9fbGUgLSBfX2xiOworICAgICAgICBpZiAoX19icyA+IF9fbikKKyAgICAgICAgeworICAgICAgICAgICAgX19icyA9IF9fbjsKKyAgICAgICAgICAgIF9fbGIgPSBfX2xlIC0gX19iczsKKyAgICAgICAgfQorICAgICAgICBfX3IgPSBfVlNURDo6Y29weV9iYWNrd2FyZChfX2xiLCBfX2xlLCBfX3IpOworICAgICAgICBfX24gLT0gX19iczsKKyAgICAgICAgX19sIC09IF9fYnMgLSAxOworICAgIH0KKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1YxLCBjbGFzcyBfUDEsIGNsYXNzIF9SMSwgY2xhc3MgX00xLCBjbGFzcyBfRDEsIF9EMSBfQjEsCisgICAgICAgICAgY2xhc3MgX1YyLCBjbGFzcyBfUDIsIGNsYXNzIF9SMiwgY2xhc3MgX00yLCBjbGFzcyBfRDIsIF9EMiBfQjI+CitfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+Citjb3B5X2JhY2t3YXJkKF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19mLAorICAgICAgICAgICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+IF9fbCwKKyAgICAgICAgICAgICAgX19kZXF1ZV9pdGVyYXRvcjxfVjIsIF9QMiwgX1IyLCBfTTIsIF9EMiwgX0IyPiBfX3IpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPjo6cG9pbnRlciBwb2ludGVyOworICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX2wgLSBfX2Y7CisgICAgd2hpbGUgKF9fbiA+IDApCisgICAgeworICAgICAgICAtLV9fbDsKKyAgICAgICAgcG9pbnRlciBfX2xiID0gKl9fbC5fX21faXRlcl87CisgICAgICAgIHBvaW50ZXIgX19sZSA9IF9fbC5fX3B0cl8gKyAxOworICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19icyA9IF9fbGUgLSBfX2xiOworICAgICAgICBpZiAoX19icyA+IF9fbikKKyAgICAgICAgeworICAgICAgICAgICAgX19icyA9IF9fbjsKKyAgICAgICAgICAgIF9fbGIgPSBfX2xlIC0gX19iczsKKyAgICAgICAgfQorICAgICAgICBfX3IgPSBfVlNURDo6Y29weV9iYWNrd2FyZChfX2xiLCBfX2xlLCBfX3IpOworICAgICAgICBfX24gLT0gX19iczsKKyAgICAgICAgX19sIC09IF9fYnMgLSAxOworICAgIH0KKyAgICByZXR1cm4gX19yOworfQorCisvLyBtb3ZlCisKK3RlbXBsYXRlIDxjbGFzcyBfUkFJdGVyLAorICAgICAgICAgIGNsYXNzIF9WMiwgY2xhc3MgX1AyLCBjbGFzcyBfUjIsIGNsYXNzIF9NMiwgY2xhc3MgX0QyLCBfRDIgX0IyPgorX19kZXF1ZV9pdGVyYXRvcjxfVjIsIF9QMiwgX1IyLCBfTTIsIF9EMiwgX0IyPgorbW92ZShfUkFJdGVyIF9fZiwKKyAgICAgX1JBSXRlciBfX2wsCisgICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj4gX19yLAorICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19yYW5kb21fYWNjZXNzX2l0ZXJhdG9yPF9SQUl0ZXI+Ojp2YWx1ZT46OnR5cGUqKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19kZXF1ZV9pdGVyYXRvcjxfVjIsIF9QMiwgX1IyLCBfTTIsIF9EMiwgX0IyPjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj46OnBvaW50ZXIgcG9pbnRlcjsKKyAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19ibG9ja19zaXplID0gX19kZXF1ZV9pdGVyYXRvcjxfVjIsIF9QMiwgX1IyLCBfTTIsIF9EMiwgX0IyPjo6X19ibG9ja19zaXplOworICAgIHdoaWxlIChfX2YgIT0gX19sKQorICAgIHsKKyAgICAgICAgcG9pbnRlciBfX3JiID0gX19yLl9fcHRyXzsKKyAgICAgICAgcG9pbnRlciBfX3JlID0gKl9fci5fX21faXRlcl8gKyBfX2Jsb2NrX3NpemU7CisgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2JzID0gX19yZSAtIF9fcmI7CisgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX2wgLSBfX2Y7CisgICAgICAgIF9SQUl0ZXIgX19tID0gX19sOworICAgICAgICBpZiAoX19uID4gX19icykKKyAgICAgICAgeworICAgICAgICAgICAgX19uID0gX19iczsKKyAgICAgICAgICAgIF9fbSA9IF9fZiArIF9fbjsKKyAgICAgICAgfQorICAgICAgICBfVlNURDo6bW92ZShfX2YsIF9fbSwgX19yYik7CisgICAgICAgIF9fZiA9IF9fbTsKKyAgICAgICAgX19yICs9IF9fbjsKKyAgICB9CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WMSwgY2xhc3MgX1AxLCBjbGFzcyBfUjEsIGNsYXNzIF9NMSwgY2xhc3MgX0QxLCBfRDEgX0IxLAorICAgICAgICAgIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK19PdXRwdXRJdGVyYXRvcgorbW92ZShfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+IF9fZiwKKyAgICAgX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPiBfX2wsCisgICAgIF9PdXRwdXRJdGVyYXRvciBfX3IpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPjo6cG9pbnRlciBwb2ludGVyOworICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2Jsb2NrX3NpemUgPSBfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+OjpfX2Jsb2NrX3NpemU7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9fbCAtIF9fZjsKKyAgICB3aGlsZSAoX19uID4gMCkKKyAgICB7CisgICAgICAgIHBvaW50ZXIgX19mYiA9IF9fZi5fX3B0cl87CisgICAgICAgIHBvaW50ZXIgX19mZSA9ICpfX2YuX19tX2l0ZXJfICsgX19ibG9ja19zaXplOworICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19icyA9IF9fZmUgLSBfX2ZiOworICAgICAgICBpZiAoX19icyA+IF9fbikKKyAgICAgICAgeworICAgICAgICAgICAgX19icyA9IF9fbjsKKyAgICAgICAgICAgIF9fZmUgPSBfX2ZiICsgX19iczsKKyAgICAgICAgfQorICAgICAgICBfX3IgPSBfVlNURDo6bW92ZShfX2ZiLCBfX2ZlLCBfX3IpOworICAgICAgICBfX24gLT0gX19iczsKKyAgICAgICAgX19mICs9IF9fYnM7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVjEsIGNsYXNzIF9QMSwgY2xhc3MgX1IxLCBjbGFzcyBfTTEsIGNsYXNzIF9EMSwgX0QxIF9CMSwKKyAgICAgICAgICBjbGFzcyBfVjIsIGNsYXNzIF9QMiwgY2xhc3MgX1IyLCBjbGFzcyBfTTIsIGNsYXNzIF9EMiwgX0QyIF9CMj4KK19fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj4KK21vdmUoX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPiBfX2YsCisgICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19sLAorICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+IF9fcikKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+Ojpwb2ludGVyIHBvaW50ZXI7CisgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fYmxvY2tfc2l6ZSA9IF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT46Ol9fYmxvY2tfc2l6ZTsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19sIC0gX19mOworICAgIHdoaWxlIChfX24gPiAwKQorICAgIHsKKyAgICAgICAgcG9pbnRlciBfX2ZiID0gX19mLl9fcHRyXzsKKyAgICAgICAgcG9pbnRlciBfX2ZlID0gKl9fZi5fX21faXRlcl8gKyBfX2Jsb2NrX3NpemU7CisgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2JzID0gX19mZSAtIF9fZmI7CisgICAgICAgIGlmIChfX2JzID4gX19uKQorICAgICAgICB7CisgICAgICAgICAgICBfX2JzID0gX19uOworICAgICAgICAgICAgX19mZSA9IF9fZmIgKyBfX2JzOworICAgICAgICB9CisgICAgICAgIF9fciA9IF9WU1REOjptb3ZlKF9fZmIsIF9fZmUsIF9fcik7CisgICAgICAgIF9fbiAtPSBfX2JzOworICAgICAgICBfX2YgKz0gX19iczsKKyAgICB9CisgICAgcmV0dXJuIF9fcjsKK30KKworLy8gbW92ZV9iYWNrd2FyZAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JBSXRlciwKKyAgICAgICAgICBjbGFzcyBfVjIsIGNsYXNzIF9QMiwgY2xhc3MgX1IyLCBjbGFzcyBfTTIsIGNsYXNzIF9EMiwgX0QyIF9CMj4KK19fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj4KK21vdmVfYmFja3dhcmQoX1JBSXRlciBfX2YsCisgICAgICAgICAgICAgIF9SQUl0ZXIgX19sLAorICAgICAgICAgICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+IF9fciwKKyAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfcmFuZG9tX2FjY2Vzc19pdGVyYXRvcjxfUkFJdGVyPjo6dmFsdWU+Ojp0eXBlKikKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+Ojpwb2ludGVyIHBvaW50ZXI7CisgICAgd2hpbGUgKF9fZiAhPSBfX2wpCisgICAgeworICAgICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+IF9fcnAgPSBfVlNURDo6cHJldihfX3IpOworICAgICAgICBwb2ludGVyIF9fcmIgPSAqX19ycC5fX21faXRlcl87CisgICAgICAgIHBvaW50ZXIgX19yZSA9IF9fcnAuX19wdHJfICsgMTsKKyAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fYnMgPSBfX3JlIC0gX19yYjsKKyAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9fbCAtIF9fZjsKKyAgICAgICAgX1JBSXRlciBfX20gPSBfX2Y7CisgICAgICAgIGlmIChfX24gPiBfX2JzKQorICAgICAgICB7CisgICAgICAgICAgICBfX24gPSBfX2JzOworICAgICAgICAgICAgX19tID0gX19sIC0gX19uOworICAgICAgICB9CisgICAgICAgIF9WU1REOjptb3ZlX2JhY2t3YXJkKF9fbSwgX19sLCBfX3JlKTsKKyAgICAgICAgX19sID0gX19tOworICAgICAgICBfX3IgLT0gX19uOworICAgIH0KKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1YxLCBjbGFzcyBfUDEsIGNsYXNzIF9SMSwgY2xhc3MgX00xLCBjbGFzcyBfRDEsIF9EMSBfQjEsCisgICAgICAgICAgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgorX091dHB1dEl0ZXJhdG9yCittb3ZlX2JhY2t3YXJkKF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19mLAorICAgICAgICAgICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+IF9fbCwKKyAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcikKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+Ojpwb2ludGVyIHBvaW50ZXI7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9fbCAtIF9fZjsKKyAgICB3aGlsZSAoX19uID4gMCkKKyAgICB7CisgICAgICAgIC0tX19sOworICAgICAgICBwb2ludGVyIF9fbGIgPSAqX19sLl9fbV9pdGVyXzsKKyAgICAgICAgcG9pbnRlciBfX2xlID0gX19sLl9fcHRyXyArIDE7CisgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2JzID0gX19sZSAtIF9fbGI7CisgICAgICAgIGlmIChfX2JzID4gX19uKQorICAgICAgICB7CisgICAgICAgICAgICBfX2JzID0gX19uOworICAgICAgICAgICAgX19sYiA9IF9fbGUgLSBfX2JzOworICAgICAgICB9CisgICAgICAgIF9fciA9IF9WU1REOjptb3ZlX2JhY2t3YXJkKF9fbGIsIF9fbGUsIF9fcik7CisgICAgICAgIF9fbiAtPSBfX2JzOworICAgICAgICBfX2wgLT0gX19icyAtIDE7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVjEsIGNsYXNzIF9QMSwgY2xhc3MgX1IxLCBjbGFzcyBfTTEsIGNsYXNzIF9EMSwgX0QxIF9CMSwKKyAgICAgICAgICBjbGFzcyBfVjIsIGNsYXNzIF9QMiwgY2xhc3MgX1IyLCBjbGFzcyBfTTIsIGNsYXNzIF9EMiwgX0QyIF9CMj4KK19fZGVxdWVfaXRlcmF0b3I8X1YyLCBfUDIsIF9SMiwgX00yLCBfRDIsIF9CMj4KK21vdmVfYmFja3dhcmQoX19kZXF1ZV9pdGVyYXRvcjxfVjEsIF9QMSwgX1IxLCBfTTEsIF9EMSwgX0IxPiBfX2YsCisgICAgICAgICAgICAgIF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT4gX19sLAorICAgICAgICAgICAgICBfX2RlcXVlX2l0ZXJhdG9yPF9WMiwgX1AyLCBfUjIsIF9NMiwgX0QyLCBfQjI+IF9fcikKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZGVxdWVfaXRlcmF0b3I8X1YxLCBfUDEsIF9SMSwgX00xLCBfRDEsIF9CMT46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2RlcXVlX2l0ZXJhdG9yPF9WMSwgX1AxLCBfUjEsIF9NMSwgX0QxLCBfQjE+Ojpwb2ludGVyIHBvaW50ZXI7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9fbCAtIF9fZjsKKyAgICB3aGlsZSAoX19uID4gMCkKKyAgICB7CisgICAgICAgIC0tX19sOworICAgICAgICBwb2ludGVyIF9fbGIgPSAqX19sLl9fbV9pdGVyXzsKKyAgICAgICAgcG9pbnRlciBfX2xlID0gX19sLl9fcHRyXyArIDE7CisgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2JzID0gX19sZSAtIF9fbGI7CisgICAgICAgIGlmIChfX2JzID4gX19uKQorICAgICAgICB7CisgICAgICAgICAgICBfX2JzID0gX19uOworICAgICAgICAgICAgX19sYiA9IF9fbGUgLSBfX2JzOworICAgICAgICB9CisgICAgICAgIF9fciA9IF9WU1REOjptb3ZlX2JhY2t3YXJkKF9fbGIsIF9fbGUsIF9fcik7CisgICAgICAgIF9fbiAtPSBfX2JzOworICAgICAgICBfX2wgLT0gX19icyAtIDE7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxib29sPgorY2xhc3MgX19kZXF1ZV9iYXNlX2NvbW1vbgoreworcHJvdGVjdGVkOgorICAgIF9MSUJDUFBfTk9SRVRVUk4gdm9pZCBfX3Rocm93X2xlbmd0aF9lcnJvcigpIGNvbnN0OworICAgIF9MSUJDUFBfTk9SRVRVUk4gdm9pZCBfX3Rocm93X291dF9vZl9yYW5nZSgpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGJvb2wgX19iPgordm9pZAorX19kZXF1ZV9iYXNlX2NvbW1vbjxfX2I+OjpfX3Rocm93X2xlbmd0aF9lcnJvcigpIGNvbnN0Cit7CisgICAgX1ZTVEQ6Ol9fdGhyb3dfbGVuZ3RoX2Vycm9yKCJkZXF1ZSIpOworfQorCit0ZW1wbGF0ZSA8Ym9vbCBfX2I+Cit2b2lkCitfX2RlcXVlX2Jhc2VfY29tbW9uPF9fYj46Ol9fdGhyb3dfb3V0X29mX3JhbmdlKCkgY29uc3QKK3sKKyAgICBfVlNURDo6X190aHJvd19vdXRfb2ZfcmFuZ2UoImRlcXVlIik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitjbGFzcyBfX2RlcXVlX2Jhc2UKKyAgICA6IHByb3RlY3RlZCBfX2RlcXVlX2Jhc2VfY29tbW9uPHRydWU+Cit7CisgICAgX19kZXF1ZV9iYXNlKGNvbnN0IF9fZGVxdWVfYmFzZSYgX19jKTsKKyAgICBfX2RlcXVlX2Jhc2UmIG9wZXJhdG9yPShjb25zdCBfX2RlcXVlX2Jhc2UmIF9fYyk7Citwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT4gICAgICAgICBfX2FsbG9jX3RyYWl0czsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2FsbG9jX3RyYWl0czo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnBvaW50ZXIgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OmNvbnN0X3BvaW50ZXIgICBjb25zdF9wb2ludGVyOworCisgICAgc3RhdGljIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2Jsb2NrX3NpemU7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2FsbG9jX2hlbHBlcjxfX2FsbG9jX3RyYWl0cywgcG9pbnRlcj46OnR5cGUgX19wb2ludGVyX2FsbG9jYXRvcjsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X19wb2ludGVyX2FsbG9jYXRvcj4gICAgICAgIF9fbWFwX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbWFwX3RyYWl0czo6cG9pbnRlciAgICAgICAgICAgICAgIF9fbWFwX3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9hbGxvY19oZWxwZXI8X19hbGxvY190cmFpdHMsIGNvbnN0X3BvaW50ZXI+Ojp0eXBlIF9fY29uc3RfcG9pbnRlcl9hbGxvY2F0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPF9fY29uc3RfcG9pbnRlcl9hbGxvY2F0b3I+Ojpjb25zdF9wb2ludGVyIF9fbWFwX2NvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiBfX3NwbGl0X2J1ZmZlcjxwb2ludGVyLCBfX3BvaW50ZXJfYWxsb2NhdG9yPiBfX21hcDsKKworICAgIHR5cGVkZWYgX19kZXF1ZV9pdGVyYXRvcjx2YWx1ZV90eXBlLCBwb2ludGVyLCByZWZlcmVuY2UsIF9fbWFwX3BvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZT4gICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfX2RlcXVlX2l0ZXJhdG9yPHZhbHVlX3R5cGUsIGNvbnN0X3BvaW50ZXIsIGNvbnN0X3JlZmVyZW5jZSwgX19tYXBfY29uc3RfcG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlPiAgICBjb25zdF9pdGVyYXRvcjsKKworICAgIF9fbWFwIF9fbWFwXzsKKyAgICBzaXplX3R5cGUgX19zdGFydF87CisgICAgX19jb21wcmVzc2VkX3BhaXI8c2l6ZV90eXBlLCBhbGxvY2F0b3JfdHlwZT4gX19zaXplXzsKKworICAgIGl0ZXJhdG9yICAgICAgIGJlZ2luKCkgX05PRVhDRVBUOworICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgX05PRVhDRVBUOworICAgIGl0ZXJhdG9yICAgICAgIGVuZCgpIF9OT0VYQ0VQVDsKKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCBfTk9FWENFUFQ7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHNpemVfdHlwZSYgICAgICAgICAgICBzaXplKCkgICAgICAgICAge3JldHVybiBfX3NpemVfLmZpcnN0KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdCBzaXplX3R5cGUmIHNpemUoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3NpemVfLmZpcnN0KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYWxsb2NhdG9yX3R5cGUmICAgICAgIF9fYWxsb2MoKSAgICAgICB7cmV0dXJuIF9fc2l6ZV8uc2Vjb25kKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hbGxvYygpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fc2l6ZV8uc2Vjb25kKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fZGVxdWVfYmFzZSgpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9fZGVxdWVfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKK3B1YmxpYzoKKyAgICB+X19kZXF1ZV9iYXNlKCk7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX19kZXF1ZV9iYXNlKF9fZGVxdWVfYmFzZSYmIF9fYykKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKTsKKyAgICBfX2RlcXVlX2Jhc2UoX19kZXF1ZV9iYXNlJiYgX19jLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICB2b2lkIHN3YXAoX19kZXF1ZV9iYXNlJiBfX2MpCisjaWYgX0xJQkNQUF9TVERfVkVSID49IDE0CisgICAgICAgIF9OT0VYQ0VQVDsKKyNlbHNlCisgICAgICAgIF9OT0VYQ0VQVF8oIV9fYWxsb2NfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXA6OnZhbHVlIHx8IAorICAgICAgICAgICAgICAgICAgICBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpOworI2VuZGlmCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBjbGVhcigpIF9OT0VYQ0VQVDsKKworICAgIGJvb2wgX19pbnZhcmlhbnRzKCkgY29uc3Q7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX21vdmVfYXNzaWduKF9fZGVxdWVfYmFzZSYgX19jKQorICAgICAgICBfTk9FWENFUFRfKF9fYWxsb2NfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKQorICAgIHsKKyAgICAgICAgX19tYXBfID0gX1ZTVEQ6Om1vdmUoX19jLl9fbWFwXyk7CisgICAgICAgIF9fc3RhcnRfID0gX19jLl9fc3RhcnRfOworICAgICAgICBzaXplKCkgPSBfX2Muc2l6ZSgpOworICAgICAgICBfX21vdmVfYXNzaWduX2FsbG9jKF9fYyk7CisgICAgICAgIF9fYy5fX3N0YXJ0XyA9IF9fYy5zaXplKCkgPSAwOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fbW92ZV9hc3NpZ25fYWxsb2MoX19kZXF1ZV9iYXNlJiBfX2MpCisgICAgICAgIF9OT0VYQ0VQVF8oIV9fYWxsb2NfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKQorICAgICAgICB7X19tb3ZlX2Fzc2lnbl9hbGxvYyhfX2MsIGludGVncmFsX2NvbnN0YW50PGJvb2wsCisgICAgICAgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZT4oKSk7fQorCitwcml2YXRlOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fbW92ZV9hc3NpZ25fYWxsb2MoX19kZXF1ZV9iYXNlJiBfX2MsIHRydWVfdHlwZSkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBfX2FsbG9jKCkgPSBfVlNURDo6bW92ZShfX2MuX19hbGxvYygpKTsKKyAgICAgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19tb3ZlX2Fzc2lnbl9hbGxvYyhfX2RlcXVlX2Jhc2UmLCBmYWxzZV90eXBlKSBfTk9FWENFUFQKKyAgICAgICAge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Citjb25zdCB0eXBlbmFtZSBfX2RlcXVlX2Jhc2U8X1RwLCBfQWxsb2NhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19kZXF1ZV9iYXNlPF9UcCwgX0FsbG9jYXRvcj46Ol9fYmxvY2tfc2l6ZSA9CisgICAgICAgIF9fZGVxdWVfYmxvY2tfc2l6ZTx2YWx1ZV90eXBlLCBkaWZmZXJlbmNlX3R5cGU+Ojp2YWx1ZTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2Jvb2wKK19fZGVxdWVfYmFzZTxfVHAsIF9BbGxvY2F0b3I+OjpfX2ludmFyaWFudHMoKSBjb25zdAoreworICAgIGlmICghX19tYXBfLl9faW52YXJpYW50cygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKF9fbWFwXy5zaXplKCkgPj0gc2l6ZV90eXBlKC0xKSAvIF9fYmxvY2tfc2l6ZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGZvciAodHlwZW5hbWUgX19tYXA6OmNvbnN0X2l0ZXJhdG9yIF9faSA9IF9fbWFwXy5iZWdpbigpLCBfX2UgPSBfX21hcF8uZW5kKCk7CisgICAgICAgICBfX2kgIT0gX19lOyArK19faSkKKyAgICAgICAgaWYgKCpfX2kgPT0gbnVsbHB0cikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoX19tYXBfLnNpemUoKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHNpemUoKSA+PSBfX21hcF8uc2l6ZSgpICogX19ibG9ja19zaXplKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoX19zdGFydF8gPj0gX19tYXBfLnNpemUoKSAqIF9fYmxvY2tfc2l6ZSAtIHNpemUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHNpemUoKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoX19zdGFydF8gIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBfX2RlcXVlX2Jhc2U8X1RwLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IKK19fZGVxdWVfYmFzZTxfVHAsIF9BbGxvY2F0b3I+OjpiZWdpbigpIF9OT0VYQ0VQVAoreworICAgIF9fbWFwX3BvaW50ZXIgX19tcCA9IF9fbWFwXy5iZWdpbigpICsgX19zdGFydF8gLyBfX2Jsb2NrX3NpemU7CisgICAgcmV0dXJuIGl0ZXJhdG9yKF9fbXAsIF9fbWFwXy5lbXB0eSgpID8gMCA6ICpfX21wICsgX19zdGFydF8gJSBfX2Jsb2NrX3NpemUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgX19kZXF1ZV9iYXNlPF9UcCwgX0FsbG9jYXRvcj46OmNvbnN0X2l0ZXJhdG9yCitfX2RlcXVlX2Jhc2U8X1RwLCBfQWxsb2NhdG9yPjo6YmVnaW4oKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICBfX21hcF9jb25zdF9wb2ludGVyIF9fbXAgPSBzdGF0aWNfY2FzdDxfX21hcF9jb25zdF9wb2ludGVyPihfX21hcF8uYmVnaW4oKSArIF9fc3RhcnRfIC8gX19ibG9ja19zaXplKTsKKyAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX19tcCwgX19tYXBfLmVtcHR5KCkgPyAwIDogKl9fbXAgKyBfX3N0YXJ0XyAlIF9fYmxvY2tfc2l6ZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBfX2RlcXVlX2Jhc2U8X1RwLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IKK19fZGVxdWVfYmFzZTxfVHAsIF9BbGxvY2F0b3I+OjplbmQoKSBfTk9FWENFUFQKK3sKKyAgICBzaXplX3R5cGUgX19wID0gc2l6ZSgpICsgX19zdGFydF87CisgICAgX19tYXBfcG9pbnRlciBfX21wID0gX19tYXBfLmJlZ2luKCkgKyBfX3AgLyBfX2Jsb2NrX3NpemU7CisgICAgcmV0dXJuIGl0ZXJhdG9yKF9fbXAsIF9fbWFwXy5lbXB0eSgpID8gMCA6ICpfX21wICsgX19wICUgX19ibG9ja19zaXplKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIF9fZGVxdWVfYmFzZTxfVHAsIF9BbGxvY2F0b3I+Ojpjb25zdF9pdGVyYXRvcgorX19kZXF1ZV9iYXNlPF9UcCwgX0FsbG9jYXRvcj46OmVuZCgpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIHNpemVfdHlwZSBfX3AgPSBzaXplKCkgKyBfX3N0YXJ0XzsKKyAgICBfX21hcF9jb25zdF9wb2ludGVyIF9fbXAgPSBzdGF0aWNfY2FzdDxfX21hcF9jb25zdF9wb2ludGVyPihfX21hcF8uYmVnaW4oKSArIF9fcCAvIF9fYmxvY2tfc2l6ZSk7CisgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9fbXAsIF9fbWFwXy5lbXB0eSgpID8gMCA6ICpfX21wICsgX19wICUgX19ibG9ja19zaXplKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZQorX19kZXF1ZV9iYXNlPF9UcCwgX0FsbG9jYXRvcj46Ol9fZGVxdWVfYmFzZSgpCisgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKQorICAgIDogX19zdGFydF8oMCksIF9fc2l6ZV8oMCkge30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZQorX19kZXF1ZV9iYXNlPF9UcCwgX0FsbG9jYXRvcj46Ol9fZGVxdWVfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX19tYXBfKF9fcG9pbnRlcl9hbGxvY2F0b3IoX19hKSksIF9fc3RhcnRfKDApLCBfX3NpemVfKDAsIF9fYSkge30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK19fZGVxdWVfYmFzZTxfVHAsIF9BbGxvY2F0b3I+Ojp+X19kZXF1ZV9iYXNlKCkKK3sKKyAgICBjbGVhcigpOworICAgIHR5cGVuYW1lIF9fbWFwOjppdGVyYXRvciBfX2kgPSBfX21hcF8uYmVnaW4oKTsKKyAgICB0eXBlbmFtZSBfX21hcDo6aXRlcmF0b3IgX19lID0gX19tYXBfLmVuZCgpOworICAgIGZvciAoOyBfX2kgIT0gX19lOyArK19faSkKKyAgICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hbGxvYygpLCAqX19pLCBfX2Jsb2NrX3NpemUpOworfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgorX19kZXF1ZV9iYXNlPF9UcCwgX0FsbG9jYXRvcj46Ol9fZGVxdWVfYmFzZShfX2RlcXVlX2Jhc2UmJiBfX2MpCisgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKQorICAgIDogX19tYXBfKF9WU1REOjptb3ZlKF9fYy5fX21hcF8pKSwKKyAgICAgIF9fc3RhcnRfKF9WU1REOjptb3ZlKF9fYy5fX3N0YXJ0XykpLAorICAgICAgX19zaXplXyhfVlNURDo6bW92ZShfX2MuX19zaXplXykpCit7CisgICAgX19jLl9fc3RhcnRfID0gMDsKKyAgICBfX2Muc2l6ZSgpID0gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK19fZGVxdWVfYmFzZTxfVHAsIF9BbGxvY2F0b3I+OjpfX2RlcXVlX2Jhc2UoX19kZXF1ZV9iYXNlJiYgX19jLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX19tYXBfKF9WU1REOjptb3ZlKF9fYy5fX21hcF8pLCBfX3BvaW50ZXJfYWxsb2NhdG9yKF9fYSkpLAorICAgICAgX19zdGFydF8oX1ZTVEQ6Om1vdmUoX19jLl9fc3RhcnRfKSksCisgICAgICBfX3NpemVfKF9WU1REOjptb3ZlKF9fYy5zaXplKCkpLCBfX2EpCit7CisgICAgaWYgKF9fYSA9PSBfX2MuX19hbGxvYygpKQorICAgIHsKKyAgICAgICAgX19jLl9fc3RhcnRfID0gMDsKKyAgICAgICAgX19jLnNpemUoKSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIF9fbWFwXy5jbGVhcigpOworICAgICAgICBfX3N0YXJ0XyA9IDA7CisgICAgICAgIHNpemUoKSA9IDA7CisgICAgfQorfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAorX19kZXF1ZV9iYXNlPF9UcCwgX0FsbG9jYXRvcj46OnN3YXAoX19kZXF1ZV9iYXNlJiBfX2MpCisjaWYgX0xJQkNQUF9TVERfVkVSID49IDE0CisgICAgICAgIF9OT0VYQ0VQVAorI2Vsc2UKKyAgICAgICAgX05PRVhDRVBUXyghX19hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDo6dmFsdWUgfHwgCisgICAgICAgICAgICAgICAgICAgIF9faXNfbm90aHJvd19zd2FwcGFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSkKKyNlbmRpZgoreworICAgIF9fbWFwXy5zd2FwKF9fYy5fX21hcF8pOworICAgIF9WU1REOjpzd2FwKF9fc3RhcnRfLCBfX2MuX19zdGFydF8pOworICAgIF9WU1REOjpzd2FwKHNpemUoKSwgX19jLnNpemUoKSk7CisgICAgX19zd2FwX2FsbG9jYXRvcihfX2FsbG9jKCksIF9fYy5fX2FsbG9jKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAorX19kZXF1ZV9iYXNlPF9UcCwgX0FsbG9jYXRvcj46OmNsZWFyKCkgX05PRVhDRVBUCit7CisgICAgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IF9fYWxsb2MoKTsKKyAgICBmb3IgKGl0ZXJhdG9yIF9faSA9IGJlZ2luKCksIF9fZSA9IGVuZCgpOyBfX2kgIT0gX19lOyArK19faSkKKyAgICAgICAgX19hbGxvY190cmFpdHM6OmRlc3Ryb3koX19hLCBfVlNURDo6YWRkcmVzc29mKCpfX2kpKTsKKyAgICBzaXplKCkgPSAwOworICAgIHdoaWxlIChfX21hcF8uc2l6ZSgpID4gMikKKyAgICB7CisgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKF9fYSwgX19tYXBfLmZyb250KCksIF9fYmxvY2tfc2l6ZSk7CisgICAgICAgIF9fbWFwXy5wb3BfZnJvbnQoKTsKKyAgICB9CisgICAgc3dpdGNoIChfX21hcF8uc2l6ZSgpKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICAgIF9fc3RhcnRfID0gX19ibG9ja19zaXplIC8gMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBfX3N0YXJ0XyA9IF9fYmxvY2tfc2l6ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yIC8qPSBhbGxvY2F0b3I8X1RwPiovPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgZGVxdWUKKyAgICA6IHByaXZhdGUgX19kZXF1ZV9iYXNlPF9UcCwgX0FsbG9jYXRvcj4KK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlczoKKworICAgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQWxsb2NhdG9yIGFsbG9jYXRvcl90eXBlOworCisgICAgc3RhdGljX2Fzc2VydCgoaXNfc2FtZTx0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6dmFsdWVfdHlwZSwgdmFsdWVfdHlwZT46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICJBbGxvY2F0b3I6OnZhbHVlX3R5cGUgbXVzdCBiZSBzYW1lIHR5cGUgYXMgdmFsdWVfdHlwZSIpOworCisgICAgdHlwZWRlZiBfX2RlcXVlX2Jhc2U8dmFsdWVfdHlwZSwgYWxsb2NhdG9yX3R5cGU+IF9fYmFzZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19iYXNlOjpfX2FsbG9jX3RyYWl0cyAgICAgICAgX19hbGxvY190cmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6OnJlZmVyZW5jZSAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6Oml0ZXJhdG9yICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYmFzZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19iYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19iYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgZGlmZmVyZW5jZV90eXBlOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6OnBvaW50ZXIgICAgICAgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19iYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIF9WU1REOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgIHR5cGVkZWYgX1ZTVEQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAvLyBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBkZXF1ZSgpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSkKKyAgICAgICAge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IGRlcXVlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpIDogX19iYXNlKF9fYSkge30KKyAgICBleHBsaWNpdCBkZXF1ZShzaXplX3R5cGUgX19uKTsKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorICAgIGV4cGxpY2l0IGRlcXVlKHNpemVfdHlwZSBfX24sIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSk7CisjZW5kaWYKKyAgICBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpOworICAgIGRlcXVlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CisgICAgICAgIGRlcXVlKF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwKKyAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfaW5wdXRfaXRlcmF0b3I8X0lucHV0SXRlcj46OnZhbHVlPjo6dHlwZSogPSAwKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgICAgICAgZGVxdWUoX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hLAorICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19pbnB1dF9pdGVyYXRvcjxfSW5wdXRJdGVyPjo6dmFsdWU+Ojp0eXBlKiA9IDApOworICAgIGRlcXVlKGNvbnN0IGRlcXVlJiBfX2MpOworICAgIGRlcXVlKGNvbnN0IGRlcXVlJiBfX2MsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworCisgICAgZGVxdWUmIG9wZXJhdG9yPShjb25zdCBkZXF1ZSYgX19jKTsKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBkZXF1ZShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpOworICAgIGRlcXVlKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZGVxdWUmIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpIHthc3NpZ24oX19pbCk7IHJldHVybiAqdGhpczt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZGVxdWUoZGVxdWUmJiBfX2MpIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8X19iYXNlPjo6dmFsdWUpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBkZXF1ZShkZXF1ZSYmIF9fYywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGRlcXVlJiBvcGVyYXRvcj0oZGVxdWUmJiBfX2MpCisgICAgICAgIF9OT0VYQ0VQVF8oX19hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkge2Fzc2lnbihfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpO30KKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgICAgICAgdm9pZCBhc3NpZ24oX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sLAorICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19pbnB1dF9pdGVyYXRvcjxfSW5wdXRJdGVyPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIV9faXNfcmFuZG9tX2FjY2Vzc19pdGVyYXRvcjxfSW5wdXRJdGVyPjo6dmFsdWU+Ojp0eXBlKiA9IDApOworICAgIHRlbXBsYXRlIDxjbGFzcyBfUkFJdGVyPgorICAgICAgICB2b2lkIGFzc2lnbihfUkFJdGVyIF9fZiwgX1JBSXRlciBfX2wsCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3JhbmRvbV9hY2Nlc3NfaXRlcmF0b3I8X1JBSXRlcj46OnZhbHVlPjo6dHlwZSogPSAwKTsKKyAgICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCBfTk9FWENFUFQ7CisKKyAgICAvLyBpdGVyYXRvcnM6CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgICAgICAgYmVnaW4oKSBfTk9FWENFUFQgICAgICAge3JldHVybiBfX2Jhc2U6OmJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fYmFzZTo6YmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yICAgICAgIGVuZCgpIF9OT0VYQ0VQVCAgICAgICAgIHtyZXR1cm4gX19iYXNlOjplbmQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpICAgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX19iYXNlOjplbmQoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmV2ZXJzZV9pdGVyYXRvciAgICAgICByYmVnaW4oKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiAgICAgICByZXZlcnNlX2l0ZXJhdG9yKF9fYmFzZTo6ZW5kKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKF9fYmFzZTo6ZW5kKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmV2ZXJzZV9pdGVyYXRvciAgICAgICByZW5kKCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcihfX2Jhc2U6OmJlZ2luKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgICBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKF9fYmFzZTo6YmVnaW4oKSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgY2JlZ2luKCkgIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fYmFzZTo6YmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgY2VuZCgpICAgIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fYmFzZTo6ZW5kKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyYmVnaW4oKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKF9fYmFzZTo6ZW5kKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmVuZCgpICAgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihfX2Jhc2U6OmJlZ2luKCkpO30KKworICAgIC8vIGNhcGFjaXR5OgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fYmFzZTo6c2l6ZSgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gc3RkOjptaW48c2l6ZV90eXBlPigKKyAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjptYXhfc2l6ZShfX2Jhc2U6Ol9fYWxsb2MoKSksCisgICAgICAgICAgICBudW1lcmljX2xpbWl0czxkaWZmZXJlbmNlX3R5cGU+OjptYXgoKSk7fQorICAgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX24pOworICAgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdik7CisgICAgdm9pZCBzaHJpbmtfdG9fZml0KCkgX05PRVhDRVBUOworICAgIF9MSUJDUFBfTk9ESVNDQVJEX0FGVEVSX0NYWDE3IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIGVtcHR5KCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX19iYXNlOjpzaXplKCkgPT0gMDt9CisKKyAgICAvLyBlbGVtZW50IGFjY2VzczoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9faSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX2kpIGNvbnN0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9faSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgX19pKSBjb25zdDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVmZXJlbmNlIGZyb250KCk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZWZlcmVuY2UgYmFjaygpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0OworCisgICAgLy8gMjMuMi4yLjMgbW9kaWZpZXJzOgorICAgIHZvaWQgcHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiBfX3YpOworICAgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIF9fdik7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPiByZWZlcmVuY2UgZW1wbGFjZV9mcm9udChfQXJncyYmLi4uIF9fYXJncyk7CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPiByZWZlcmVuY2UgZW1wbGFjZV9iYWNrIChfQXJncyYmLi4uIF9fYXJncyk7CisjZWxzZQorICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4gdm9pZCAgICAgIGVtcGxhY2VfZnJvbnQoX0FyZ3MmJi4uLiBfX2FyZ3MpOworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4gdm9pZCAgICAgIGVtcGxhY2VfYmFjayAoX0FyZ3MmJi4uLiBfX2FyZ3MpOworI2VuZGlmCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPiBpdGVyYXRvciBlbXBsYWNlKGNvbnN0X2l0ZXJhdG9yIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpOworCisgICAgdm9pZCBwdXNoX2Zyb250KHZhbHVlX3R5cGUmJiBfX3YpOworICAgIHZvaWQgcHVzaF9iYWNrKHZhbHVlX3R5cGUmJiBfX3YpOworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3AsIHZhbHVlX3R5cGUmJiBfX3YpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3AsIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkKKyAgICAgICAge3JldHVybiBpbnNlcnQoX19wLCBfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpO30KKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcCwgY29uc3QgdmFsdWVfdHlwZSYgX192KTsKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICAgICAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wLCBfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfaW5wdXRfaXRlcmF0b3I8X0lucHV0SXRlcj46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIV9faXNfZm9yd2FyZF9pdGVyYXRvcjxfSW5wdXRJdGVyPjo6dmFsdWU+Ojp0eXBlKiA9IDApOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wLCBfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYhX19pc19iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZT46OnR5cGUqID0gMCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9CaUl0ZXI+CisgICAgICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3AsIF9CaUl0ZXIgX19mLCBfQmlJdGVyIF9fbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaUl0ZXI+Ojp2YWx1ZT46OnR5cGUqID0gMCk7CisKKyAgICB2b2lkIHBvcF9mcm9udCgpOworICAgIHZvaWQgcG9wX2JhY2soKTsKKyAgICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBfX3ApOworICAgIGl0ZXJhdG9yIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAoZGVxdWUmIF9fYykKKyNpZiBfTElCQ1BQX1NURF9WRVIgPj0gMTQKKyAgICAgICAgX05PRVhDRVBUOworI2Vsc2UKKyAgICAgICAgX05PRVhDRVBUXyghX19hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpOworI2VuZGlmCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgY2xlYXIoKSBfTk9FWENFUFQ7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBfX2ludmFyaWFudHMoKSBjb25zdCB7cmV0dXJuIF9fYmFzZTo6X19pbnZhcmlhbnRzKCk7fQorcHJpdmF0ZToKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYmFzZTo6X19tYXBfY29uc3RfcG9pbnRlciBfX21hcF9jb25zdF9wb2ludGVyOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBzaXplX3R5cGUgX19yZWNvbW1lbmRfYmxvY2tzKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgICByZXR1cm4gX19uIC8gX19iYXNlOjpfX2Jsb2NrX3NpemUgKyAoX19uICUgX19iYXNlOjpfX2Jsb2NrX3NpemUgIT0gMCk7CisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgX19jYXBhY2l0eSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gX19iYXNlOjpfX21hcF8uc2l6ZSgpID09IDAgPyAwIDogX19iYXNlOjpfX21hcF8uc2l6ZSgpICogX19iYXNlOjpfX2Jsb2NrX3NpemUgLSAxOworICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIF9fZnJvbnRfc3BhcmUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIF9fYmFzZTo6X19zdGFydF87CisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgX19iYWNrX3NwYXJlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBfX2NhcGFjaXR5KCkgLSAoX19iYXNlOjpfX3N0YXJ0XyArIF9fYmFzZTo6c2l6ZSgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucEl0ZXI+CisgICAgICAgIHZvaWQgX19hcHBlbmQoX0lucEl0ZXIgX19mLCBfSW5wSXRlciBfX2wsCisgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX2lucHV0X2l0ZXJhdG9yPF9JbnBJdGVyPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIV9faXNfZm9yd2FyZF9pdGVyYXRvcjxfSW5wSXRlcj46OnZhbHVlPjo6dHlwZSogPSAwKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0Zvckl0ZXI+CisgICAgICAgIHZvaWQgX19hcHBlbmQoX0Zvckl0ZXIgX19mLCBfRm9ySXRlciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9ySXRlcj46OnZhbHVlPjo6dHlwZSogPSAwKTsKKyAgICB2b2lkIF9fYXBwZW5kKHNpemVfdHlwZSBfX24pOworICAgIHZvaWQgX19hcHBlbmQoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192KTsKKyAgICB2b2lkIF9fZXJhc2VfdG9fZW5kKGNvbnN0X2l0ZXJhdG9yIF9fZik7CisgICAgdm9pZCBfX2FkZF9mcm9udF9jYXBhY2l0eSgpOworICAgIHZvaWQgX19hZGRfZnJvbnRfY2FwYWNpdHkoc2l6ZV90eXBlIF9fbik7CisgICAgdm9pZCBfX2FkZF9iYWNrX2NhcGFjaXR5KCk7CisgICAgdm9pZCBfX2FkZF9iYWNrX2NhcGFjaXR5KHNpemVfdHlwZSBfX24pOworICAgIGl0ZXJhdG9yIF9fbW92ZV9hbmRfY2hlY2soaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wsIGl0ZXJhdG9yIF9fciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXImIF9fdnQpOworICAgIGl0ZXJhdG9yIF9fbW92ZV9iYWNrd2FyZF9hbmRfY2hlY2soaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wsIGl0ZXJhdG9yIF9fciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXImIF9fdnQpOworICAgIHZvaWQgX19tb3ZlX2NvbnN0cnVjdF9hbmRfY2hlY2soaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvciBfX3IsIGNvbnN0X3BvaW50ZXImIF9fdnQpOworICAgIHZvaWQgX19tb3ZlX2NvbnN0cnVjdF9iYWNrd2FyZF9hbmRfY2hlY2soaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvciBfX3IsIGNvbnN0X3BvaW50ZXImIF9fdnQpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19jb3B5X2Fzc2lnbl9hbGxvYyhjb25zdCBkZXF1ZSYgX19jKQorICAgICAgICB7X19jb3B5X2Fzc2lnbl9hbGxvYyhfX2MsIGludGVncmFsX2NvbnN0YW50PGJvb2wsCisgICAgICAgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfY29weV9hc3NpZ25tZW50Ojp2YWx1ZT4oKSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19jb3B5X2Fzc2lnbl9hbGxvYyhjb25zdCBkZXF1ZSYgX19jLCB0cnVlX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX2Jhc2U6Ol9fYWxsb2MoKSAhPSBfX2MuX19hbGxvYygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsZWFyKCk7CisgICAgICAgICAgICAgICAgc2hyaW5rX3RvX2ZpdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19iYXNlOjpfX2FsbG9jKCkgPSBfX2MuX19hbGxvYygpOworICAgICAgICAgICAgX19iYXNlOjpfX21hcF8uX19hbGxvYygpID0gX19jLl9fbWFwXy5fX2FsbG9jKCk7CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fY29weV9hc3NpZ25fYWxsb2MoY29uc3QgZGVxdWUmLCBmYWxzZV90eXBlKQorICAgICAgICB7fQorCisgICAgdm9pZCBfX21vdmVfYXNzaWduKGRlcXVlJiBfX2MsIHRydWVfdHlwZSkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKTsKKyAgICB2b2lkIF9fbW92ZV9hc3NpZ24oZGVxdWUmIF9fYywgZmFsc2VfdHlwZSk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6ZGVxdWUoc2l6ZV90eXBlIF9fbikKK3sKKyAgICBpZiAoX19uID4gMCkKKyAgICAgICAgX19hcHBlbmQoX19uKTsKK30KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6ZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgX0FsbG9jYXRvciYgX19hKQorICAgIDogX19iYXNlKF9fYSkKK3sKKyAgICBpZiAoX19uID4gMCkKKyAgICAgICAgX19hcHBlbmQoX19uKTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6ZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192KQoreworICAgIGlmIChfX24gPiAwKQorICAgICAgICBfX2FwcGVuZChfX24sIF9fdik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX2Jhc2UoX19hKQoreworICAgIGlmIChfX24gPiAwKQorICAgICAgICBfX2FwcGVuZChfX24sIF9fdik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KK2RlcXVlPF9UcCwgX0FsbG9jYXRvcj46OmRlcXVlKF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwKKyAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfaW5wdXRfaXRlcmF0b3I8X0lucHV0SXRlcj46OnZhbHVlPjo6dHlwZSopCit7CisgICAgX19hcHBlbmQoX19mLCBfX2wpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpkZXF1ZShfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EsCisgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX2lucHV0X2l0ZXJhdG9yPF9JbnB1dEl0ZXI+Ojp2YWx1ZT46OnR5cGUqKQorICAgIDogX19iYXNlKF9fYSkKK3sKKyAgICBfX2FwcGVuZChfX2YsIF9fbCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpkZXF1ZShjb25zdCBkZXF1ZSYgX19jKQorICAgIDogX19iYXNlKF9fYWxsb2NfdHJhaXRzOjpzZWxlY3Rfb25fY29udGFpbmVyX2NvcHlfY29uc3RydWN0aW9uKF9fYy5fX2FsbG9jKCkpKQoreworICAgIF9fYXBwZW5kKF9fYy5iZWdpbigpLCBfX2MuZW5kKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6ZGVxdWUoY29uc3QgZGVxdWUmIF9fYywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fYmFzZShfX2EpCit7CisgICAgX19hcHBlbmQoX19jLmJlZ2luKCksIF9fYy5lbmQoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+JgorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6b3BlcmF0b3I9KGNvbnN0IGRlcXVlJiBfX2MpCit7CisgICAgaWYgKHRoaXMgIT0gJl9fYykKKyAgICB7CisgICAgICAgIF9fY29weV9hc3NpZ25fYWxsb2MoX19jKTsKKyAgICAgICAgYXNzaWduKF9fYy5iZWdpbigpLCBfX2MuZW5kKCkpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpkZXF1ZShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpCit7CisgICAgX19hcHBlbmQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2RlcXVlPF9UcCwgX0FsbG9jYXRvcj46OmRlcXVlKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fYmFzZShfX2EpCit7CisgICAgX19hcHBlbmQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZQorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6ZGVxdWUoZGVxdWUmJiBfX2MpCisgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxfX2Jhc2U+Ojp2YWx1ZSkKKyAgICA6IF9fYmFzZShfVlNURDo6bW92ZShfX2MpKQoreworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpkZXF1ZShkZXF1ZSYmIF9fYywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fYmFzZShfVlNURDo6bW92ZShfX2MpLCBfX2EpCit7CisgICAgaWYgKF9fYSAhPSBfX2MuX19hbGxvYygpKQorICAgIHsKKyAgICAgICAgdHlwZWRlZiBtb3ZlX2l0ZXJhdG9yPGl0ZXJhdG9yPiBfSXA7CisgICAgICAgIGFzc2lnbihfSXAoX19jLmJlZ2luKCkpLCBfSXAoX19jLmVuZCgpKSk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+JgorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6b3BlcmF0b3I9KGRlcXVlJiYgX19jKQorICAgICAgICBfTk9FWENFUFRfKF9fYWxsb2NfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKQoreworICAgIF9fbW92ZV9hc3NpZ24oX19jLCBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWU+KCkpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK2RlcXVlPF9UcCwgX0FsbG9jYXRvcj46Ol9fbW92ZV9hc3NpZ24oZGVxdWUmIF9fYywgZmFsc2VfdHlwZSkKK3sKKyAgICBpZiAoX19iYXNlOjpfX2FsbG9jKCkgIT0gX19jLl9fYWxsb2MoKSkKKyAgICB7CisgICAgICAgIHR5cGVkZWYgbW92ZV9pdGVyYXRvcjxpdGVyYXRvcj4gX0lwOworICAgICAgICBhc3NpZ24oX0lwKF9fYy5iZWdpbigpKSwgX0lwKF9fYy5lbmQoKSkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIF9fbW92ZV9hc3NpZ24oX19jLCB0cnVlX3R5cGUoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpfX21vdmVfYXNzaWduKGRlcXVlJiBfX2MsIHRydWVfdHlwZSkKKyAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpCit7CisgICAgY2xlYXIoKTsKKyAgICBzaHJpbmtfdG9fZml0KCk7CisgICAgX19iYXNlOjpfX21vdmVfYXNzaWduKF9fYyk7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KK3ZvaWQKK2RlcXVlPF9UcCwgX0FsbG9jYXRvcj46OmFzc2lnbihfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfaW5wdXRfaXRlcmF0b3I8X0lucHV0SXRlcj46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIV9faXNfcmFuZG9tX2FjY2Vzc19pdGVyYXRvcjxfSW5wdXRJdGVyPjo6dmFsdWU+Ojp0eXBlKikKK3sKKyAgICBpdGVyYXRvciBfX2kgPSBfX2Jhc2U6OmJlZ2luKCk7CisgICAgaXRlcmF0b3IgX19lID0gX19iYXNlOjplbmQoKTsKKyAgICBmb3IgKDsgX19mICE9IF9fbCAmJiBfX2kgIT0gX19lOyArK19fZiwgKHZvaWQpICsrX19pKQorICAgICAgICAqX19pID0gKl9fZjsKKyAgICBpZiAoX19mICE9IF9fbCkKKyAgICAgICAgX19hcHBlbmQoX19mLCBfX2wpOworICAgIGVsc2UKKyAgICAgICAgX19lcmFzZV90b19lbmQoX19pKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfUkFJdGVyPgordm9pZAorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6YXNzaWduKF9SQUl0ZXIgX19mLCBfUkFJdGVyIF9fbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19yYW5kb21fYWNjZXNzX2l0ZXJhdG9yPF9SQUl0ZXI+Ojp2YWx1ZT46OnR5cGUqKQoreworICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fbCAtIF9fZikgPiBfX2Jhc2U6OnNpemUoKSkKKyAgICB7CisgICAgICAgIF9SQUl0ZXIgX19tID0gX19mICsgX19iYXNlOjpzaXplKCk7CisgICAgICAgIF9WU1REOjpjb3B5KF9fZiwgX19tLCBfX2Jhc2U6OmJlZ2luKCkpOworICAgICAgICBfX2FwcGVuZChfX20sIF9fbCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgX19lcmFzZV90b19lbmQoX1ZTVEQ6OmNvcHkoX19mLCBfX2wsIF9fYmFzZTo6YmVnaW4oKSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6YXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdikKK3sKKyAgICBpZiAoX19uID4gX19iYXNlOjpzaXplKCkpCisgICAgeworICAgICAgICBfVlNURDo6ZmlsbF9uKF9fYmFzZTo6YmVnaW4oKSwgX19iYXNlOjpzaXplKCksIF9fdik7CisgICAgICAgIF9fbiAtPSBfX2Jhc2U6OnNpemUoKTsKKyAgICAgICAgX19hcHBlbmQoX19uLCBfX3YpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIF9fZXJhc2VfdG9fZW5kKF9WU1REOjpmaWxsX24oX19iYXNlOjpiZWdpbigpLCBfX24sIF9fdikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lCitfQWxsb2NhdG9yCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpnZXRfYWxsb2NhdG9yKCkgY29uc3QgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fYmFzZTo6X19hbGxvYygpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6cmVzaXplKHNpemVfdHlwZSBfX24pCit7CisgICAgaWYgKF9fbiA+IF9fYmFzZTo6c2l6ZSgpKQorICAgICAgICBfX2FwcGVuZChfX24gLSBfX2Jhc2U6OnNpemUoKSk7CisgICAgZWxzZSBpZiAoX19uIDwgX19iYXNlOjpzaXplKCkpCisgICAgICAgIF9fZXJhc2VfdG9fZW5kKF9fYmFzZTo6YmVnaW4oKSArIF9fbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpyZXNpemUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192KQoreworICAgIGlmIChfX24gPiBfX2Jhc2U6OnNpemUoKSkKKyAgICAgICAgX19hcHBlbmQoX19uIC0gX19iYXNlOjpzaXplKCksIF9fdik7CisgICAgZWxzZSBpZiAoX19uIDwgX19iYXNlOjpzaXplKCkpCisgICAgICAgIF9fZXJhc2VfdG9fZW5kKF9fYmFzZTo6YmVnaW4oKSArIF9fbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpzaHJpbmtfdG9fZml0KCkgX05PRVhDRVBUCit7CisgICAgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IF9fYmFzZTo6X19hbGxvYygpOworICAgIGlmIChlbXB0eSgpKQorICAgIHsKKyAgICAgICAgd2hpbGUgKF9fYmFzZTo6X19tYXBfLnNpemUoKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKF9fYSwgX19iYXNlOjpfX21hcF8uYmFjaygpLCBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSk7CisgICAgICAgICAgICBfX2Jhc2U6Ol9fbWFwXy5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgICAgIF9fYmFzZTo6X19zdGFydF8gPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoX19mcm9udF9zcGFyZSgpID49IF9fYmFzZTo6X19ibG9ja19zaXplKQorICAgICAgICB7CisgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6ZGVhbGxvY2F0ZShfX2EsIF9fYmFzZTo6X19tYXBfLmZyb250KCksIF9fYmFzZTo6X19ibG9ja19zaXplKTsKKyAgICAgICAgICAgIF9fYmFzZTo6X19tYXBfLnBvcF9mcm9udCgpOworICAgICAgICAgICAgX19iYXNlOjpfX3N0YXJ0XyAtPSBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19iYWNrX3NwYXJlKCkgPj0gX19iYXNlOjpfX2Jsb2NrX3NpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKF9fYSwgX19iYXNlOjpfX21hcF8uYmFjaygpLCBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSk7CisgICAgICAgICAgICBfX2Jhc2U6Ol9fbWFwXy5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgfQorICAgIF9fYmFzZTo6X19tYXBfLnNocmlua190b19maXQoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZQordHlwZW5hbWUgZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6cmVmZXJlbmNlCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpvcGVyYXRvcltdKHNpemVfdHlwZSBfX2kpCit7CisgICAgc2l6ZV90eXBlIF9fcCA9IF9fYmFzZTo6X19zdGFydF8gKyBfX2k7CisgICAgcmV0dXJuICooKihfX2Jhc2U6Ol9fbWFwXy5iZWdpbigpICsgX19wIC8gX19iYXNlOjpfX2Jsb2NrX3NpemUpICsgX19wICUgX19iYXNlOjpfX2Jsb2NrX3NpemUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lCit0eXBlbmFtZSBkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+Ojpjb25zdF9yZWZlcmVuY2UKK2RlcXVlPF9UcCwgX0FsbG9jYXRvcj46Om9wZXJhdG9yW10oc2l6ZV90eXBlIF9faSkgY29uc3QKK3sKKyAgICBzaXplX3R5cGUgX19wID0gX19iYXNlOjpfX3N0YXJ0XyArIF9faTsKKyAgICByZXR1cm4gKigqKF9fYmFzZTo6X19tYXBfLmJlZ2luKCkgKyBfX3AgLyBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSkgKyBfX3AgJSBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUKK3R5cGVuYW1lIGRlcXVlPF9UcCwgX0FsbG9jYXRvcj46OnJlZmVyZW5jZQorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6YXQoc2l6ZV90eXBlIF9faSkKK3sKKyAgICBpZiAoX19pID49IF9fYmFzZTo6c2l6ZSgpKQorICAgICAgICBfX2Jhc2U6Ol9fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgc2l6ZV90eXBlIF9fcCA9IF9fYmFzZTo6X19zdGFydF8gKyBfX2k7CisgICAgcmV0dXJuICooKihfX2Jhc2U6Ol9fbWFwXy5iZWdpbigpICsgX19wIC8gX19iYXNlOjpfX2Jsb2NrX3NpemUpICsgX19wICUgX19iYXNlOjpfX2Jsb2NrX3NpemUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lCit0eXBlbmFtZSBkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+Ojpjb25zdF9yZWZlcmVuY2UKK2RlcXVlPF9UcCwgX0FsbG9jYXRvcj46OmF0KHNpemVfdHlwZSBfX2kpIGNvbnN0Cit7CisgICAgaWYgKF9faSA+PSBfX2Jhc2U6OnNpemUoKSkKKyAgICAgICAgX19iYXNlOjpfX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHNpemVfdHlwZSBfX3AgPSBfX2Jhc2U6Ol9fc3RhcnRfICsgX19pOworICAgIHJldHVybiAqKCooX19iYXNlOjpfX21hcF8uYmVnaW4oKSArIF9fcCAvIF9fYmFzZTo6X19ibG9ja19zaXplKSArIF9fcCAlIF9fYmFzZTo6X19ibG9ja19zaXplKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZQordHlwZW5hbWUgZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6cmVmZXJlbmNlCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+Ojpmcm9udCgpCit7CisgICAgcmV0dXJuICooKihfX2Jhc2U6Ol9fbWFwXy5iZWdpbigpICsgX19iYXNlOjpfX3N0YXJ0XyAvIF9fYmFzZTo6X19ibG9ja19zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9fYmFzZTo6X19zdGFydF8gJSBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUKK3R5cGVuYW1lIGRlcXVlPF9UcCwgX0FsbG9jYXRvcj46OmNvbnN0X3JlZmVyZW5jZQorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6ZnJvbnQoKSBjb25zdAoreworICAgIHJldHVybiAqKCooX19iYXNlOjpfX21hcF8uYmVnaW4oKSArIF9fYmFzZTo6X19zdGFydF8gLyBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfX2Jhc2U6Ol9fc3RhcnRfICUgX19iYXNlOjpfX2Jsb2NrX3NpemUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lCit0eXBlbmFtZSBkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpyZWZlcmVuY2UKK2RlcXVlPF9UcCwgX0FsbG9jYXRvcj46OmJhY2soKQoreworICAgIHNpemVfdHlwZSBfX3AgPSBfX2Jhc2U6OnNpemUoKSArIF9fYmFzZTo6X19zdGFydF8gLSAxOworICAgIHJldHVybiAqKCooX19iYXNlOjpfX21hcF8uYmVnaW4oKSArIF9fcCAvIF9fYmFzZTo6X19ibG9ja19zaXplKSArIF9fcCAlIF9fYmFzZTo6X19ibG9ja19zaXplKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZQordHlwZW5hbWUgZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6Y29uc3RfcmVmZXJlbmNlCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpiYWNrKCkgY29uc3QKK3sKKyAgICBzaXplX3R5cGUgX19wID0gX19iYXNlOjpzaXplKCkgKyBfX2Jhc2U6Ol9fc3RhcnRfIC0gMTsKKyAgICByZXR1cm4gKigqKF9fYmFzZTo6X19tYXBfLmJlZ2luKCkgKyBfX3AgLyBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSkgKyBfX3AgJSBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgX192KQoreworICAgIGFsbG9jYXRvcl90eXBlJiBfX2EgPSBfX2Jhc2U6Ol9fYWxsb2MoKTsKKyAgICBpZiAoX19iYWNrX3NwYXJlKCkgPT0gMCkKKyAgICAgICAgX19hZGRfYmFja19jYXBhY2l0eSgpOworICAgIC8vIF9fYmFja19zcGFyZSgpID49IDEKKyAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZigqX19iYXNlOjplbmQoKSksIF9fdik7CisgICAgKytfX2Jhc2U6OnNpemUoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK2RlcXVlPF9UcCwgX0FsbG9jYXRvcj46OnB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX192KQoreworICAgIGFsbG9jYXRvcl90eXBlJiBfX2EgPSBfX2Jhc2U6Ol9fYWxsb2MoKTsKKyAgICBpZiAoX19mcm9udF9zcGFyZSgpID09IDApCisgICAgICAgIF9fYWRkX2Zyb250X2NhcGFjaXR5KCk7CisgICAgLy8gX19mcm9udF9zcGFyZSgpID49IDEKKyAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZigqLS1fX2Jhc2U6OmJlZ2luKCkpLCBfX3YpOworICAgIC0tX19iYXNlOjpfX3N0YXJ0XzsKKyAgICArK19fYmFzZTo6c2l6ZSgpOworfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK2RlcXVlPF9UcCwgX0FsbG9jYXRvcj46OnB1c2hfYmFjayh2YWx1ZV90eXBlJiYgX192KQoreworICAgIGFsbG9jYXRvcl90eXBlJiBfX2EgPSBfX2Jhc2U6Ol9fYWxsb2MoKTsKKyAgICBpZiAoX19iYWNrX3NwYXJlKCkgPT0gMCkKKyAgICAgICAgX19hZGRfYmFja19jYXBhY2l0eSgpOworICAgIC8vIF9fYmFja19zcGFyZSgpID49IDEKKyAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZigqX19iYXNlOjplbmQoKSksIF9WU1REOjptb3ZlKF9fdikpOworICAgICsrX19iYXNlOjpzaXplKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKK3R5cGVuYW1lIGRlcXVlPF9UcCwgX0FsbG9jYXRvcj46OnJlZmVyZW5jZQorI2Vsc2UKK3ZvaWQKKyNlbmRpZgorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6ZW1wbGFjZV9iYWNrKF9BcmdzJiYuLi4gX19hcmdzKQoreworICAgIGFsbG9jYXRvcl90eXBlJiBfX2EgPSBfX2Jhc2U6Ol9fYWxsb2MoKTsKKyAgICBpZiAoX19iYWNrX3NwYXJlKCkgPT0gMCkKKyAgICAgICAgX19hZGRfYmFja19jYXBhY2l0eSgpOworICAgIC8vIF9fYmFja19zcGFyZSgpID49IDEKKyAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZigqX19iYXNlOjplbmQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgKytfX2Jhc2U6OnNpemUoKTsKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAorICAgIHJldHVybiAqLS1fX2Jhc2U6OmVuZCgpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpwdXNoX2Zyb250KHZhbHVlX3R5cGUmJiBfX3YpCit7CisgICAgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IF9fYmFzZTo6X19hbGxvYygpOworICAgIGlmIChfX2Zyb250X3NwYXJlKCkgPT0gMCkKKyAgICAgICAgX19hZGRfZnJvbnRfY2FwYWNpdHkoKTsKKyAgICAvLyBfX2Zyb250X3NwYXJlKCkgPj0gMQorICAgIF9fYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19hLCBfVlNURDo6YWRkcmVzc29mKCotLV9fYmFzZTo6YmVnaW4oKSksIF9WU1REOjptb3ZlKF9fdikpOworICAgIC0tX19iYXNlOjpfX3N0YXJ0XzsKKyAgICArK19fYmFzZTo6c2l6ZSgpOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKK3R5cGVuYW1lIGRlcXVlPF9UcCwgX0FsbG9jYXRvcj46OnJlZmVyZW5jZQorI2Vsc2UKK3ZvaWQKKyNlbmRpZgorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6ZW1wbGFjZV9mcm9udChfQXJncyYmLi4uIF9fYXJncykKK3sKKyAgICBhbGxvY2F0b3JfdHlwZSYgX19hID0gX19iYXNlOjpfX2FsbG9jKCk7CisgICAgaWYgKF9fZnJvbnRfc3BhcmUoKSA9PSAwKQorICAgICAgICBfX2FkZF9mcm9udF9jYXBhY2l0eSgpOworICAgIC8vIF9fZnJvbnRfc3BhcmUoKSA+PSAxCisgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjphZGRyZXNzb2YoKi0tX19iYXNlOjpiZWdpbigpKSwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIC0tX19iYXNlOjpfX3N0YXJ0XzsKKyAgICArK19fYmFzZTo6c2l6ZSgpOworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisgICAgcmV0dXJuICpfX2Jhc2U6OmJlZ2luKCk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIGRlcXVlPF9UcCwgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjppbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wLCB2YWx1ZV90eXBlJiYgX192KQoreworICAgIHNpemVfdHlwZSBfX3BvcyA9IF9fcCAtIF9fYmFzZTo6YmVnaW4oKTsKKyAgICBzaXplX3R5cGUgX190b19lbmQgPSBfX2Jhc2U6OnNpemUoKSAtIF9fcG9zOworICAgIGFsbG9jYXRvcl90eXBlJiBfX2EgPSBfX2Jhc2U6Ol9fYWxsb2MoKTsKKyAgICBpZiAoX19wb3MgPCBfX3RvX2VuZCkKKyAgICB7ICAgLy8gaW5zZXJ0IGJ5IHNoaWZ0aW5nIHRoaW5ncyBiYWNrd2FyZAorICAgICAgICBpZiAoX19mcm9udF9zcGFyZSgpID09IDApCisgICAgICAgICAgICBfX2FkZF9mcm9udF9jYXBhY2l0eSgpOworICAgICAgICAvLyBfX2Zyb250X3NwYXJlKCkgPj0gMQorICAgICAgICBpZiAoX19wb3MgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjphZGRyZXNzb2YoKi0tX19iYXNlOjpiZWdpbigpKSwgX1ZTVEQ6Om1vdmUoX192KSk7CisgICAgICAgICAgICAtLV9fYmFzZTo6X19zdGFydF87CisgICAgICAgICAgICArK19fYmFzZTo6c2l6ZSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaXRlcmF0b3IgX19iID0gX19iYXNlOjpiZWdpbigpOworICAgICAgICAgICAgaXRlcmF0b3IgX19ibTEgPSBfVlNURDo6cHJldihfX2IpOworICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjphZGRyZXNzb2YoKl9fYm0xKSwgX1ZTVEQ6Om1vdmUoKl9fYikpOworICAgICAgICAgICAgLS1fX2Jhc2U6Ol9fc3RhcnRfOworICAgICAgICAgICAgKytfX2Jhc2U6OnNpemUoKTsKKyAgICAgICAgICAgIGlmIChfX3BvcyA+IDEpCisgICAgICAgICAgICAgICAgX19iID0gX1ZTVEQ6Om1vdmUoX1ZTVEQ6Om5leHQoX19iKSwgX19iICsgX19wb3MsIF9fYik7CisgICAgICAgICAgICAqX19iID0gX1ZTVEQ6Om1vdmUoX192KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyAgIC8vIGluc2VydCBieSBzaGlmdGluZyB0aGluZ3MgZm9yd2FyZAorICAgICAgICBpZiAoX19iYWNrX3NwYXJlKCkgPT0gMCkKKyAgICAgICAgICAgIF9fYWRkX2JhY2tfY2FwYWNpdHkoKTsKKyAgICAgICAgLy8gX19iYWNrX2NhcGFjaXR5ID49IDEKKyAgICAgICAgc2l6ZV90eXBlIF9fZGUgPSBfX2Jhc2U6OnNpemUoKSAtIF9fcG9zOworICAgICAgICBpZiAoX19kZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZigqX19iYXNlOjplbmQoKSksIF9WU1REOjptb3ZlKF9fdikpOworICAgICAgICAgICAgKytfX2Jhc2U6OnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGl0ZXJhdG9yIF9fZSA9IF9fYmFzZTo6ZW5kKCk7CisgICAgICAgICAgICBpdGVyYXRvciBfX2VtMSA9IF9WU1REOjpwcmV2KF9fZSk7CisgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZigqX19lKSwgX1ZTVEQ6Om1vdmUoKl9fZW0xKSk7CisgICAgICAgICAgICArK19fYmFzZTo6c2l6ZSgpOworICAgICAgICAgICAgaWYgKF9fZGUgPiAxKQorICAgICAgICAgICAgICAgIF9fZSA9IF9WU1REOjptb3ZlX2JhY2t3YXJkKF9fZSAtIF9fZGUsIF9fZW0xLCBfX2UpOworICAgICAgICAgICAgKi0tX19lID0gX1ZTVEQ6Om1vdmUoX192KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19iYXNlOjpiZWdpbigpICsgX19wb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+Cit0eXBlbmFtZSBkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6ZW1wbGFjZShjb25zdF9pdGVyYXRvciBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQoreworICAgIHNpemVfdHlwZSBfX3BvcyA9IF9fcCAtIF9fYmFzZTo6YmVnaW4oKTsKKyAgICBzaXplX3R5cGUgX190b19lbmQgPSBfX2Jhc2U6OnNpemUoKSAtIF9fcG9zOworICAgIGFsbG9jYXRvcl90eXBlJiBfX2EgPSBfX2Jhc2U6Ol9fYWxsb2MoKTsKKyAgICBpZiAoX19wb3MgPCBfX3RvX2VuZCkKKyAgICB7ICAgLy8gaW5zZXJ0IGJ5IHNoaWZ0aW5nIHRoaW5ncyBiYWNrd2FyZAorICAgICAgICBpZiAoX19mcm9udF9zcGFyZSgpID09IDApCisgICAgICAgICAgICBfX2FkZF9mcm9udF9jYXBhY2l0eSgpOworICAgICAgICAvLyBfX2Zyb250X3NwYXJlKCkgPj0gMQorICAgICAgICBpZiAoX19wb3MgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjphZGRyZXNzb2YoKi0tX19iYXNlOjpiZWdpbigpKSwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICAgICAgICAgLS1fX2Jhc2U6Ol9fc3RhcnRfOworICAgICAgICAgICAgKytfX2Jhc2U6OnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fdGVtcF92YWx1ZTx2YWx1ZV90eXBlLCBfQWxsb2NhdG9yPiBfX3RtcCh0aGlzLT5fX2FsbG9jKCksIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICAgICAgICAgIGl0ZXJhdG9yIF9fYiA9IF9fYmFzZTo6YmVnaW4oKTsKKyAgICAgICAgICAgIGl0ZXJhdG9yIF9fYm0xID0gX1ZTVEQ6OnByZXYoX19iKTsKKyAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19hLCBfVlNURDo6YWRkcmVzc29mKCpfX2JtMSksIF9WU1REOjptb3ZlKCpfX2IpKTsKKyAgICAgICAgICAgIC0tX19iYXNlOjpfX3N0YXJ0XzsKKyAgICAgICAgICAgICsrX19iYXNlOjpzaXplKCk7CisgICAgICAgICAgICBpZiAoX19wb3MgPiAxKQorICAgICAgICAgICAgICAgIF9fYiA9IF9WU1REOjptb3ZlKF9WU1REOjpuZXh0KF9fYiksIF9fYiArIF9fcG9zLCBfX2IpOworICAgICAgICAgICAgKl9fYiA9IF9WU1REOjptb3ZlKF9fdG1wLmdldCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyAgIC8vIGluc2VydCBieSBzaGlmdGluZyB0aGluZ3MgZm9yd2FyZAorICAgICAgICBpZiAoX19iYWNrX3NwYXJlKCkgPT0gMCkKKyAgICAgICAgICAgIF9fYWRkX2JhY2tfY2FwYWNpdHkoKTsKKyAgICAgICAgLy8gX19iYWNrX2NhcGFjaXR5ID49IDEKKyAgICAgICAgc2l6ZV90eXBlIF9fZGUgPSBfX2Jhc2U6OnNpemUoKSAtIF9fcG9zOworICAgICAgICBpZiAoX19kZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZigqX19iYXNlOjplbmQoKSksIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICAgICAgICAgICsrX19iYXNlOjpzaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfX3RlbXBfdmFsdWU8dmFsdWVfdHlwZSwgX0FsbG9jYXRvcj4gX190bXAodGhpcy0+X19hbGxvYygpLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICAgICAgICBpdGVyYXRvciBfX2UgPSBfX2Jhc2U6OmVuZCgpOworICAgICAgICAgICAgaXRlcmF0b3IgX19lbTEgPSBfVlNURDo6cHJldihfX2UpOworICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjphZGRyZXNzb2YoKl9fZSksIF9WU1REOjptb3ZlKCpfX2VtMSkpOworICAgICAgICAgICAgKytfX2Jhc2U6OnNpemUoKTsKKyAgICAgICAgICAgIGlmIChfX2RlID4gMSkKKyAgICAgICAgICAgICAgICBfX2UgPSBfVlNURDo6bW92ZV9iYWNrd2FyZChfX2UgLSBfX2RlLCBfX2VtMSwgX19lKTsKKyAgICAgICAgICAgICotLV9fZSA9IF9WU1REOjptb3ZlKF9fdG1wLmdldCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19iYXNlOjpiZWdpbigpICsgX19wb3M7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIGRlcXVlPF9UcCwgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjppbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpCit7CisgICAgc2l6ZV90eXBlIF9fcG9zID0gX19wIC0gX19iYXNlOjpiZWdpbigpOworICAgIHNpemVfdHlwZSBfX3RvX2VuZCA9IF9fYmFzZTo6c2l6ZSgpIC0gX19wb3M7CisgICAgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IF9fYmFzZTo6X19hbGxvYygpOworICAgIGlmIChfX3BvcyA8IF9fdG9fZW5kKQorICAgIHsgICAvLyBpbnNlcnQgYnkgc2hpZnRpbmcgdGhpbmdzIGJhY2t3YXJkCisgICAgICAgIGlmIChfX2Zyb250X3NwYXJlKCkgPT0gMCkKKyAgICAgICAgICAgIF9fYWRkX2Zyb250X2NhcGFjaXR5KCk7CisgICAgICAgIC8vIF9fZnJvbnRfc3BhcmUoKSA+PSAxCisgICAgICAgIGlmIChfX3BvcyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZigqLS1fX2Jhc2U6OmJlZ2luKCkpLCBfX3YpOworICAgICAgICAgICAgLS1fX2Jhc2U6Ol9fc3RhcnRfOworICAgICAgICAgICAgKytfX2Jhc2U6OnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0X3BvaW50ZXIgX192dCA9IHBvaW50ZXJfdHJhaXRzPGNvbnN0X3BvaW50ZXI+Ojpwb2ludGVyX3RvKF9fdik7CisgICAgICAgICAgICBpdGVyYXRvciBfX2IgPSBfX2Jhc2U6OmJlZ2luKCk7CisgICAgICAgICAgICBpdGVyYXRvciBfX2JtMSA9IF9WU1REOjpwcmV2KF9fYik7CisgICAgICAgICAgICBpZiAoX192dCA9PSBwb2ludGVyX3RyYWl0czxjb25zdF9wb2ludGVyPjo6cG9pbnRlcl90bygqX19iKSkKKyAgICAgICAgICAgICAgICBfX3Z0ID0gcG9pbnRlcl90cmFpdHM8Y29uc3RfcG9pbnRlcj46OnBvaW50ZXJfdG8oKl9fYm0xKTsKKyAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19hLCBfVlNURDo6YWRkcmVzc29mKCpfX2JtMSksIF9WU1REOjptb3ZlKCpfX2IpKTsKKyAgICAgICAgICAgIC0tX19iYXNlOjpfX3N0YXJ0XzsKKyAgICAgICAgICAgICsrX19iYXNlOjpzaXplKCk7CisgICAgICAgICAgICBpZiAoX19wb3MgPiAxKQorICAgICAgICAgICAgICAgIF9fYiA9IF9fbW92ZV9hbmRfY2hlY2soX1ZTVEQ6Om5leHQoX19iKSwgX19iICsgX19wb3MsIF9fYiwgX192dCk7CisgICAgICAgICAgICAqX19iID0gKl9fdnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvLyBpbnNlcnQgYnkgc2hpZnRpbmcgdGhpbmdzIGZvcndhcmQKKyAgICAgICAgaWYgKF9fYmFja19zcGFyZSgpID09IDApCisgICAgICAgICAgICBfX2FkZF9iYWNrX2NhcGFjaXR5KCk7CisgICAgICAgIC8vIF9fYmFja19jYXBhY2l0eSA+PSAxCisgICAgICAgIHNpemVfdHlwZSBfX2RlID0gX19iYXNlOjpzaXplKCkgLSBfX3BvczsKKyAgICAgICAgaWYgKF9fZGUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjphZGRyZXNzb2YoKl9fYmFzZTo6ZW5kKCkpLCBfX3YpOworICAgICAgICAgICAgKytfX2Jhc2U6OnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0X3BvaW50ZXIgX192dCA9IHBvaW50ZXJfdHJhaXRzPGNvbnN0X3BvaW50ZXI+Ojpwb2ludGVyX3RvKF9fdik7CisgICAgICAgICAgICBpdGVyYXRvciBfX2UgPSBfX2Jhc2U6OmVuZCgpOworICAgICAgICAgICAgaXRlcmF0b3IgX19lbTEgPSBfVlNURDo6cHJldihfX2UpOworICAgICAgICAgICAgaWYgKF9fdnQgPT0gcG9pbnRlcl90cmFpdHM8Y29uc3RfcG9pbnRlcj46OnBvaW50ZXJfdG8oKl9fZW0xKSkKKyAgICAgICAgICAgICAgICBfX3Z0ID0gcG9pbnRlcl90cmFpdHM8Y29uc3RfcG9pbnRlcj46OnBvaW50ZXJfdG8oKl9fZSk7CisgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZigqX19lKSwgX1ZTVEQ6Om1vdmUoKl9fZW0xKSk7CisgICAgICAgICAgICArK19fYmFzZTo6c2l6ZSgpOworICAgICAgICAgICAgaWYgKF9fZGUgPiAxKQorICAgICAgICAgICAgICAgIF9fZSA9IF9fbW92ZV9iYWNrd2FyZF9hbmRfY2hlY2soX19lIC0gX19kZSwgX19lbTEsIF9fZSwgX192dCk7CisgICAgICAgICAgICAqLS1fX2UgPSAqX192dDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19iYXNlOjpiZWdpbigpICsgX19wb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6aW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcCwgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192KQoreworICAgIHNpemVfdHlwZSBfX3BvcyA9IF9fcCAtIF9fYmFzZTo6YmVnaW4oKTsKKyAgICBzaXplX3R5cGUgX190b19lbmQgPSBfX2Jhc2U6OnNpemUoKSAtIF9fcG9zOworICAgIGFsbG9jYXRvcl90eXBlJiBfX2EgPSBfX2Jhc2U6Ol9fYWxsb2MoKTsKKyAgICBpZiAoX19wb3MgPCBfX3RvX2VuZCkKKyAgICB7ICAgLy8gaW5zZXJ0IGJ5IHNoaWZ0aW5nIHRoaW5ncyBiYWNrd2FyZAorICAgICAgICBpZiAoX19uID4gX19mcm9udF9zcGFyZSgpKQorICAgICAgICAgICAgX19hZGRfZnJvbnRfY2FwYWNpdHkoX19uIC0gX19mcm9udF9zcGFyZSgpKTsKKyAgICAgICAgLy8gX19uIDw9IF9fZnJvbnRfc3BhcmUoKQorICAgICAgICBpdGVyYXRvciBfX29sZF9iZWdpbiA9IF9fYmFzZTo6YmVnaW4oKTsKKyAgICAgICAgaXRlcmF0b3IgX19pID0gX19vbGRfYmVnaW47CisgICAgICAgIGlmIChfX24gPiBfX3BvcykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChzaXplX3R5cGUgX19tID0gX19uIC0gX19wb3M7IF9fbTsgLS1fX20sIC0tX19iYXNlOjpfX3N0YXJ0XywgKytfX2Jhc2U6OnNpemUoKSkKKyAgICAgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZigqLS1fX2kpLCBfX3YpOworICAgICAgICAgICAgX19uID0gX19wb3M7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fbiA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0X3BvaW50ZXIgX192dCA9IHBvaW50ZXJfdHJhaXRzPGNvbnN0X3BvaW50ZXI+Ojpwb2ludGVyX3RvKF9fdik7CisgICAgICAgICAgICBpdGVyYXRvciBfX29ibiA9IF9fb2xkX2JlZ2luICsgX19uOworICAgICAgICAgICAgX19tb3ZlX2NvbnN0cnVjdF9iYWNrd2FyZF9hbmRfY2hlY2soX19vbGRfYmVnaW4sIF9fb2JuLCBfX2ksIF9fdnQpOworICAgICAgICAgICAgaWYgKF9fbiA8IF9fcG9zKQorICAgICAgICAgICAgICAgIF9fb2xkX2JlZ2luID0gX19tb3ZlX2FuZF9jaGVjayhfX29ibiwgX19vbGRfYmVnaW4gKyBfX3BvcywgX19vbGRfYmVnaW4sIF9fdnQpOworICAgICAgICAgICAgX1ZTVEQ6OmZpbGxfbihfX29sZF9iZWdpbiwgX19uLCAqX192dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvLyBpbnNlcnQgYnkgc2hpZnRpbmcgdGhpbmdzIGZvcndhcmQKKyAgICAgICAgc2l6ZV90eXBlIF9fYmFja19jYXBhY2l0eSA9IF9fYmFja19zcGFyZSgpOworICAgICAgICBpZiAoX19uID4gX19iYWNrX2NhcGFjaXR5KQorICAgICAgICAgICAgX19hZGRfYmFja19jYXBhY2l0eShfX24gLSBfX2JhY2tfY2FwYWNpdHkpOworICAgICAgICAvLyBfX24gPD0gX19iYWNrX2NhcGFjaXR5CisgICAgICAgIGl0ZXJhdG9yIF9fb2xkX2VuZCA9IF9fYmFzZTo6ZW5kKCk7CisgICAgICAgIGl0ZXJhdG9yIF9faSA9IF9fb2xkX2VuZDsKKyAgICAgICAgc2l6ZV90eXBlIF9fZGUgPSBfX2Jhc2U6OnNpemUoKSAtIF9fcG9zOworICAgICAgICBpZiAoX19uID4gX19kZSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChzaXplX3R5cGUgX19tID0gX19uIC0gX19kZTsgX19tOyAtLV9fbSwgKytfX2ksICsrX19iYXNlOjpzaXplKCkpCisgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjphZGRyZXNzb2YoKl9faSksIF9fdik7CisgICAgICAgICAgICBfX24gPSBfX2RlOworICAgICAgICB9CisgICAgICAgIGlmIChfX24gPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdF9wb2ludGVyIF9fdnQgPSBwb2ludGVyX3RyYWl0czxjb25zdF9wb2ludGVyPjo6cG9pbnRlcl90byhfX3YpOworICAgICAgICAgICAgaXRlcmF0b3IgX19vZW4gPSBfX29sZF9lbmQgLSBfX247CisgICAgICAgICAgICBfX21vdmVfY29uc3RydWN0X2FuZF9jaGVjayhfX29lbiwgX19vbGRfZW5kLCBfX2ksIF9fdnQpOworICAgICAgICAgICAgaWYgKF9fbiA8IF9fZGUpCisgICAgICAgICAgICAgICAgX19vbGRfZW5kID0gX19tb3ZlX2JhY2t3YXJkX2FuZF9jaGVjayhfX29sZF9lbmQgLSBfX2RlLCBfX29lbiwgX19vbGRfZW5kLCBfX3Z0KTsKKyAgICAgICAgICAgIF9WU1REOjpmaWxsX24oX19vbGRfZW5kIC0gX19uLCBfX24sICpfX3Z0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19iYXNlOjpiZWdpbigpICsgX19wb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KK3R5cGVuYW1lIGRlcXVlPF9UcCwgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjppbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wLCBfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfaW5wdXRfaXRlcmF0b3I8X0lucHV0SXRlcj46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIV9faXNfZm9yd2FyZF9pdGVyYXRvcjxfSW5wdXRJdGVyPjo6dmFsdWU+Ojp0eXBlKikKK3sKKyAgICBfX3NwbGl0X2J1ZmZlcjx2YWx1ZV90eXBlLCBhbGxvY2F0b3JfdHlwZSY+IF9fYnVmKF9fYmFzZTo6X19hbGxvYygpKTsKKyAgICBfX2J1Zi5fX2NvbnN0cnVjdF9hdF9lbmQoX19mLCBfX2wpOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19zcGxpdF9idWZmZXI8dmFsdWVfdHlwZSwgYWxsb2NhdG9yX3R5cGUmPjo6aXRlcmF0b3IgX19iaTsKKyAgICByZXR1cm4gaW5zZXJ0KF9fcCwgbW92ZV9pdGVyYXRvcjxfX2JpPihfX2J1Zi5iZWdpbigpKSwgbW92ZV9pdGVyYXRvcjxfX2JpPihfX2J1Zi5lbmQoKSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Cit0eXBlbmFtZSBkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6aW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcCwgX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIV9faXNfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWU+Ojp0eXBlKikKK3sKKyAgICBzaXplX3R5cGUgX19uID0gX1ZTVEQ6OmRpc3RhbmNlKF9fZiwgX19sKTsKKyAgICBfX3NwbGl0X2J1ZmZlcjx2YWx1ZV90eXBlLCBhbGxvY2F0b3JfdHlwZSY+IF9fYnVmKF9fbiwgMCwgX19iYXNlOjpfX2FsbG9jKCkpOworICAgIF9fYnVmLl9fY29uc3RydWN0X2F0X2VuZChfX2YsIF9fbCk7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3NwbGl0X2J1ZmZlcjx2YWx1ZV90eXBlLCBhbGxvY2F0b3JfdHlwZSY+OjppdGVyYXRvciBfX2Z3ZDsKKyAgICByZXR1cm4gaW5zZXJ0KF9fcCwgbW92ZV9pdGVyYXRvcjxfX2Z3ZD4oX19idWYuYmVnaW4oKSksIG1vdmVfaXRlcmF0b3I8X19md2Q+KF9fYnVmLmVuZCgpKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlcj4KK3R5cGVuYW1lIGRlcXVlPF9UcCwgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjppbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wLCBfQmlJdGVyIF9fZiwgX0JpSXRlciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxfQmlJdGVyPjo6dmFsdWU+Ojp0eXBlKikKK3sKKyAgICBzaXplX3R5cGUgX19uID0gX1ZTVEQ6OmRpc3RhbmNlKF9fZiwgX19sKTsKKyAgICBzaXplX3R5cGUgX19wb3MgPSBfX3AgLSBfX2Jhc2U6OmJlZ2luKCk7CisgICAgc2l6ZV90eXBlIF9fdG9fZW5kID0gX19iYXNlOjpzaXplKCkgLSBfX3BvczsKKyAgICBhbGxvY2F0b3JfdHlwZSYgX19hID0gX19iYXNlOjpfX2FsbG9jKCk7CisgICAgaWYgKF9fcG9zIDwgX190b19lbmQpCisgICAgeyAgIC8vIGluc2VydCBieSBzaGlmdGluZyB0aGluZ3MgYmFja3dhcmQKKyAgICAgICAgaWYgKF9fbiA+IF9fZnJvbnRfc3BhcmUoKSkKKyAgICAgICAgICAgIF9fYWRkX2Zyb250X2NhcGFjaXR5KF9fbiAtIF9fZnJvbnRfc3BhcmUoKSk7CisgICAgICAgIC8vIF9fbiA8PSBfX2Zyb250X3NwYXJlKCkKKyAgICAgICAgaXRlcmF0b3IgX19vbGRfYmVnaW4gPSBfX2Jhc2U6OmJlZ2luKCk7CisgICAgICAgIGl0ZXJhdG9yIF9faSA9IF9fb2xkX2JlZ2luOworICAgICAgICBfQmlJdGVyIF9fbSA9IF9fZjsKKyAgICAgICAgaWYgKF9fbiA+IF9fcG9zKQorICAgICAgICB7CisgICAgICAgICAgICBfX20gPSBfX3BvcyA8IF9fbiAvIDIgPyBfVlNURDo6cHJldihfX2wsIF9fcG9zKSA6IF9WU1REOjpuZXh0KF9fZiwgX19uIC0gX19wb3MpOworICAgICAgICAgICAgZm9yIChfQmlJdGVyIF9faiA9IF9fbTsgX19qICE9IF9fZjsgLS1fX2Jhc2U6Ol9fc3RhcnRfLCArK19fYmFzZTo6c2l6ZSgpKQorICAgICAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19hLCBfVlNURDo6YWRkcmVzc29mKCotLV9faSksICotLV9faik7CisgICAgICAgICAgICBfX24gPSBfX3BvczsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19uID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaXRlcmF0b3IgX19vYm4gPSBfX29sZF9iZWdpbiArIF9fbjsKKyAgICAgICAgICAgIGZvciAoaXRlcmF0b3IgX19qID0gX19vYm47IF9faiAhPSBfX29sZF9iZWdpbjspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjphZGRyZXNzb2YoKi0tX19pKSwgX1ZTVEQ6Om1vdmUoKi0tX19qKSk7CisgICAgICAgICAgICAgICAgLS1fX2Jhc2U6Ol9fc3RhcnRfOworICAgICAgICAgICAgICAgICsrX19iYXNlOjpzaXplKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX19uIDwgX19wb3MpCisgICAgICAgICAgICAgICAgX19vbGRfYmVnaW4gPSBfVlNURDo6bW92ZShfX29ibiwgX19vbGRfYmVnaW4gKyBfX3BvcywgX19vbGRfYmVnaW4pOworICAgICAgICAgICAgX1ZTVEQ6OmNvcHkoX19tLCBfX2wsIF9fb2xkX2JlZ2luKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyAgIC8vIGluc2VydCBieSBzaGlmdGluZyB0aGluZ3MgZm9yd2FyZAorICAgICAgICBzaXplX3R5cGUgX19iYWNrX2NhcGFjaXR5ID0gX19iYWNrX3NwYXJlKCk7CisgICAgICAgIGlmIChfX24gPiBfX2JhY2tfY2FwYWNpdHkpCisgICAgICAgICAgICBfX2FkZF9iYWNrX2NhcGFjaXR5KF9fbiAtIF9fYmFja19jYXBhY2l0eSk7CisgICAgICAgIC8vIF9fbiA8PSBfX2JhY2tfY2FwYWNpdHkKKyAgICAgICAgaXRlcmF0b3IgX19vbGRfZW5kID0gX19iYXNlOjplbmQoKTsKKyAgICAgICAgaXRlcmF0b3IgX19pID0gX19vbGRfZW5kOworICAgICAgICBfQmlJdGVyIF9fbSA9IF9fbDsKKyAgICAgICAgc2l6ZV90eXBlIF9fZGUgPSBfX2Jhc2U6OnNpemUoKSAtIF9fcG9zOworICAgICAgICBpZiAoX19uID4gX19kZSkKKyAgICAgICAgeworICAgICAgICAgICAgX19tID0gX19kZSA8IF9fbiAvIDIgPyBfVlNURDo6bmV4dChfX2YsIF9fZGUpIDogX1ZTVEQ6OnByZXYoX19sLCBfX24gLSBfX2RlKTsKKyAgICAgICAgICAgIGZvciAoX0JpSXRlciBfX2ogPSBfX207IF9faiAhPSBfX2w7ICsrX19pLCAodm9pZCkgKytfX2osICsrX19iYXNlOjpzaXplKCkpCisgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjphZGRyZXNzb2YoKl9faSksICpfX2opOworICAgICAgICAgICAgX19uID0gX19kZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19uID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaXRlcmF0b3IgX19vZW4gPSBfX29sZF9lbmQgLSBfX247CisgICAgICAgICAgICBmb3IgKGl0ZXJhdG9yIF9faiA9IF9fb2VuOyBfX2ogIT0gX19vbGRfZW5kOyArK19faSwgKytfX2osICsrX19iYXNlOjpzaXplKCkpCisgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjphZGRyZXNzb2YoKl9faSksIF9WU1REOjptb3ZlKCpfX2opKTsKKyAgICAgICAgICAgIGlmIChfX24gPCBfX2RlKQorICAgICAgICAgICAgICAgIF9fb2xkX2VuZCA9IF9WU1REOjptb3ZlX2JhY2t3YXJkKF9fb2xkX2VuZCAtIF9fZGUsIF9fb2VuLCBfX29sZF9lbmQpOworICAgICAgICAgICAgX1ZTVEQ6OmNvcHlfYmFja3dhcmQoX19mLCBfX20sIF9fb2xkX2VuZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fYmFzZTo6YmVnaW4oKSArIF9fcG9zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9JbnBJdGVyPgordm9pZAorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6X19hcHBlbmQoX0lucEl0ZXIgX19mLCBfSW5wSXRlciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19pbnB1dF9pdGVyYXRvcjxfSW5wSXRlcj46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9JbnBJdGVyPjo6dmFsdWU+Ojp0eXBlKikKK3sKKyAgICBmb3IgKDsgX19mICE9IF9fbDsgKytfX2YpCisjaWZkZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgICAgIHB1c2hfYmFjaygqX19mKTsKKyNlbHNlCisgICAgICAgIGVtcGxhY2VfYmFjaygqX19mKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9Gb3JJdGVyPgordm9pZAorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6X19hcHBlbmQoX0Zvckl0ZXIgX19mLCBfRm9ySXRlciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19mb3J3YXJkX2l0ZXJhdG9yPF9Gb3JJdGVyPjo6dmFsdWU+Ojp0eXBlKikKK3sKKyAgICBzaXplX3R5cGUgX19uID0gX1ZTVEQ6OmRpc3RhbmNlKF9fZiwgX19sKTsKKyAgICBhbGxvY2F0b3JfdHlwZSYgX19hID0gX19iYXNlOjpfX2FsbG9jKCk7CisgICAgc2l6ZV90eXBlIF9fYmFja19jYXBhY2l0eSA9IF9fYmFja19zcGFyZSgpOworICAgIGlmIChfX24gPiBfX2JhY2tfY2FwYWNpdHkpCisgICAgICAgIF9fYWRkX2JhY2tfY2FwYWNpdHkoX19uIC0gX19iYWNrX2NhcGFjaXR5KTsKKyAgICAvLyBfX24gPD0gX19iYWNrX2NhcGFjaXR5CisgICAgZm9yIChpdGVyYXRvciBfX2kgPSBfX2Jhc2U6OmVuZCgpOyBfX2YgIT0gX19sOyArK19faSwgKHZvaWQpICsrX19mLCArK19fYmFzZTo6c2l6ZSgpKQorICAgICAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZigqX19pKSwgKl9fZik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpfX2FwcGVuZChzaXplX3R5cGUgX19uKQoreworICAgIGFsbG9jYXRvcl90eXBlJiBfX2EgPSBfX2Jhc2U6Ol9fYWxsb2MoKTsKKyAgICBzaXplX3R5cGUgX19iYWNrX2NhcGFjaXR5ID0gX19iYWNrX3NwYXJlKCk7CisgICAgaWYgKF9fbiA+IF9fYmFja19jYXBhY2l0eSkKKyAgICAgICAgX19hZGRfYmFja19jYXBhY2l0eShfX24gLSBfX2JhY2tfY2FwYWNpdHkpOworICAgIC8vIF9fbiA8PSBfX2JhY2tfY2FwYWNpdHkKKyAgICBmb3IgKGl0ZXJhdG9yIF9faSA9IF9fYmFzZTo6ZW5kKCk7IF9fbjsgLS1fX24sICsrX19pLCArK19fYmFzZTo6c2l6ZSgpKQorICAgICAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZigqX19pKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpfX2FwcGVuZChzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpCit7CisgICAgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IF9fYmFzZTo6X19hbGxvYygpOworICAgIHNpemVfdHlwZSBfX2JhY2tfY2FwYWNpdHkgPSBfX2JhY2tfc3BhcmUoKTsKKyAgICBpZiAoX19uID4gX19iYWNrX2NhcGFjaXR5KQorICAgICAgICBfX2FkZF9iYWNrX2NhcGFjaXR5KF9fbiAtIF9fYmFja19jYXBhY2l0eSk7CisgICAgLy8gX19uIDw9IF9fYmFja19jYXBhY2l0eQorICAgIGZvciAoaXRlcmF0b3IgX19pID0gX19iYXNlOjplbmQoKTsgX19uOyAtLV9fbiwgKytfX2ksICsrX19iYXNlOjpzaXplKCkpCisgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19hLCBfVlNURDo6YWRkcmVzc29mKCpfX2kpLCBfX3YpOworfQorCisvLyBDcmVhdGUgZnJvbnQgY2FwYWNpdHkgZm9yIG9uZSBibG9jayBvZiBlbGVtZW50cy4KKy8vIFN0cm9uZyBndWFyYW50ZWUuICBFaXRoZXIgZG8gaXQgb3IgZG9uJ3QgdG91Y2ggYW55dGhpbmcuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6X19hZGRfZnJvbnRfY2FwYWNpdHkoKQoreworICAgIGFsbG9jYXRvcl90eXBlJiBfX2EgPSBfX2Jhc2U6Ol9fYWxsb2MoKTsKKyAgICBpZiAoX19iYWNrX3NwYXJlKCkgPj0gX19iYXNlOjpfX2Jsb2NrX3NpemUpCisgICAgeworICAgICAgICBfX2Jhc2U6Ol9fc3RhcnRfICs9IF9fYmFzZTo6X19ibG9ja19zaXplOworICAgICAgICBwb2ludGVyIF9fcHQgPSBfX2Jhc2U6Ol9fbWFwXy5iYWNrKCk7CisgICAgICAgIF9fYmFzZTo6X19tYXBfLnBvcF9iYWNrKCk7CisgICAgICAgIF9fYmFzZTo6X19tYXBfLnB1c2hfZnJvbnQoX19wdCk7CisgICAgfQorICAgIC8vIEVsc2UgaWYgX19iYXNlOjpfX21hcF8uc2l6ZSgpIDwgX19iYXNlOjpfX21hcF8uY2FwYWNpdHkoKSB0aGVuIHdlIG5lZWQgdG8gYWxsb2NhdGUgMSBidWZmZXIKKyAgICBlbHNlIGlmIChfX2Jhc2U6Ol9fbWFwXy5zaXplKCkgPCBfX2Jhc2U6Ol9fbWFwXy5jYXBhY2l0eSgpKQorICAgIHsgICAvLyB3ZSBjYW4gcHV0IHRoZSBuZXcgYnVmZmVyIGludG8gdGhlIG1hcCwgYnV0IGRvbid0IHNoaWZ0IHRoaW5ncyBhcm91bmQKKyAgICAgICAgLy8gdW50aWwgYWxsIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZC4gIElmIHdlIHRocm93LCB3ZSBkb24ndCBuZWVkIHRvIGZpeAorICAgICAgICAvLyBhbnl0aGluZyB1cCAoYW55IGFkZGVkIGJ1ZmZlcnMgYXJlIHVuZGV0ZWN0aWJsZSkKKyAgICAgICAgaWYgKF9fYmFzZTo6X19tYXBfLl9fZnJvbnRfc3BhcmUoKSA+IDApCisgICAgICAgICAgICBfX2Jhc2U6Ol9fbWFwXy5wdXNoX2Zyb250KF9fYWxsb2NfdHJhaXRzOjphbGxvY2F0ZShfX2EsIF9fYmFzZTo6X19ibG9ja19zaXplKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX19iYXNlOjpfX21hcF8ucHVzaF9iYWNrKF9fYWxsb2NfdHJhaXRzOjphbGxvY2F0ZShfX2EsIF9fYmFzZTo6X19ibG9ja19zaXplKSk7CisgICAgICAgICAgICAvLyBEb25lIGFsbG9jYXRpbmcsIHJlb3JkZXIgY2FwYWNpdHkKKyAgICAgICAgICAgIHBvaW50ZXIgX19wdCA9IF9fYmFzZTo6X19tYXBfLmJhY2soKTsKKyAgICAgICAgICAgIF9fYmFzZTo6X19tYXBfLnBvcF9iYWNrKCk7CisgICAgICAgICAgICBfX2Jhc2U6Ol9fbWFwXy5wdXNoX2Zyb250KF9fcHQpOworICAgICAgICB9CisgICAgICAgIF9fYmFzZTo6X19zdGFydF8gPSBfX2Jhc2U6Ol9fbWFwXy5zaXplKCkgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iYXNlOjpfX2Jsb2NrX3NpemUgLyAyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Jhc2U6Ol9fc3RhcnRfICsgX19iYXNlOjpfX2Jsb2NrX3NpemU7CisgICAgfQorICAgIC8vIEVsc2UgbmVlZCB0byBhbGxvY2F0ZSAxIGJ1ZmZlciwgKmFuZCogd2UgbmVlZCB0byByZWFsbG9jYXRlIF9fbWFwXy4KKyAgICBlbHNlCisgICAgeworICAgICAgICBfX3NwbGl0X2J1ZmZlcjxwb2ludGVyLCB0eXBlbmFtZSBfX2Jhc2U6Ol9fcG9pbnRlcl9hbGxvY2F0b3ImPgorICAgICAgICAgICAgX19idWYobWF4PHNpemVfdHlwZT4oMiAqIF9fYmFzZTo6X19tYXBfLmNhcGFjaXR5KCksIDEpLAorICAgICAgICAgICAgICAgICAgMCwgX19iYXNlOjpfX21hcF8uX19hbGxvYygpKTsKKworICAgICAgICB0eXBlZGVmIF9fYWxsb2NhdG9yX2Rlc3RydWN0b3I8X0FsbG9jYXRvcj4gX0RwOworICAgICAgICB1bmlxdWVfcHRyPHBvaW50ZXIsIF9EcD4gX19ob2xkKAorICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmFsbG9jYXRlKF9fYSwgX19iYXNlOjpfX2Jsb2NrX3NpemUpLAorICAgICAgICAgICAgICAgIF9EcChfX2EsIF9fYmFzZTo6X19ibG9ja19zaXplKSk7CisgICAgICAgIF9fYnVmLnB1c2hfYmFjayhfX2hvbGQuZ2V0KCkpOworICAgICAgICBfX2hvbGQucmVsZWFzZSgpOworICAgIAorICAgICAgICBmb3IgKHR5cGVuYW1lIF9fYmFzZTo6X19tYXBfcG9pbnRlciBfX2kgPSBfX2Jhc2U6Ol9fbWFwXy5iZWdpbigpOworICAgICAgICAgICAgICAgIF9faSAhPSBfX2Jhc2U6Ol9fbWFwXy5lbmQoKTsgKytfX2kpCisgICAgICAgICAgICBfX2J1Zi5wdXNoX2JhY2soKl9faSk7CisgICAgICAgIF9WU1REOjpzd2FwKF9fYmFzZTo6X19tYXBfLl9fZmlyc3RfLCBfX2J1Zi5fX2ZpcnN0Xyk7CisgICAgICAgIF9WU1REOjpzd2FwKF9fYmFzZTo6X19tYXBfLl9fYmVnaW5fLCBfX2J1Zi5fX2JlZ2luXyk7CisgICAgICAgIF9WU1REOjpzd2FwKF9fYmFzZTo6X19tYXBfLl9fZW5kXywgX19idWYuX19lbmRfKTsKKyAgICAgICAgX1ZTVEQ6OnN3YXAoX19iYXNlOjpfX21hcF8uX19lbmRfY2FwKCksIF9fYnVmLl9fZW5kX2NhcCgpKTsKKyAgICAgICAgX19iYXNlOjpfX3N0YXJ0XyA9IF9fYmFzZTo6X19tYXBfLnNpemUoKSA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSAvIDIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmFzZTo6X19zdGFydF8gKyBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZTsKKyAgICB9Cit9CisKKy8vIENyZWF0ZSBmcm9udCBjYXBhY2l0eSBmb3IgX19uIGVsZW1lbnRzLgorLy8gU3Ryb25nIGd1YXJhbnRlZS4gIEVpdGhlciBkbyBpdCBvciBkb24ndCB0b3VjaCBhbnl0aGluZy4KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpfX2FkZF9mcm9udF9jYXBhY2l0eShzaXplX3R5cGUgX19uKQoreworICAgIGFsbG9jYXRvcl90eXBlJiBfX2EgPSBfX2Jhc2U6Ol9fYWxsb2MoKTsKKyAgICBzaXplX3R5cGUgX19uYiA9IF9fcmVjb21tZW5kX2Jsb2NrcyhfX24gKyBfX2Jhc2U6Ol9fbWFwXy5lbXB0eSgpKTsKKyAgICAvLyBOdW1iZXIgb2YgdW51c2VkIGJsb2NrcyBhdCBiYWNrOgorICAgIHNpemVfdHlwZSBfX2JhY2tfY2FwYWNpdHkgPSBfX2JhY2tfc3BhcmUoKSAvIF9fYmFzZTo6X19ibG9ja19zaXplOworICAgIF9fYmFja19jYXBhY2l0eSA9IF9WU1REOjptaW4oX19iYWNrX2NhcGFjaXR5LCBfX25iKTsgIC8vIGRvbid0IHRha2UgbW9yZSB0aGFuIHlvdSBuZWVkCisgICAgX19uYiAtPSBfX2JhY2tfY2FwYWNpdHk7ICAvLyBudW1iZXIgb2YgYmxvY2tzIG5lZWQgdG8gYWxsb2NhdGUKKyAgICAvLyBJZiBfX25iID09IDAsIHRoZW4gd2UgaGF2ZSBzdWZmaWNpZW50IGNhcGFjaXR5LgorICAgIGlmIChfX25iID09IDApCisgICAgeworICAgICAgICBfX2Jhc2U6Ol9fc3RhcnRfICs9IF9fYmFzZTo6X19ibG9ja19zaXplICogX19iYWNrX2NhcGFjaXR5OworICAgICAgICBmb3IgKDsgX19iYWNrX2NhcGFjaXR5ID4gMDsgLS1fX2JhY2tfY2FwYWNpdHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvaW50ZXIgX19wdCA9IF9fYmFzZTo6X19tYXBfLmJhY2soKTsKKyAgICAgICAgICAgIF9fYmFzZTo6X19tYXBfLnBvcF9iYWNrKCk7CisgICAgICAgICAgICBfX2Jhc2U6Ol9fbWFwXy5wdXNoX2Zyb250KF9fcHQpOworICAgICAgICB9CisgICAgfQorICAgIC8vIEVsc2UgaWYgX19uYiA8PSBfX21hcF8uY2FwYWNpdHkoKSAtIF9fbWFwXy5zaXplKCkgdGhlbiB3ZSBuZWVkIHRvIGFsbG9jYXRlIF9fbmIgYnVmZmVycworICAgIGVsc2UgaWYgKF9fbmIgPD0gX19iYXNlOjpfX21hcF8uY2FwYWNpdHkoKSAtIF9fYmFzZTo6X19tYXBfLnNpemUoKSkKKyAgICB7ICAgLy8gd2UgY2FuIHB1dCB0aGUgbmV3IGJ1ZmZlcnMgaW50byB0aGUgbWFwLCBidXQgZG9uJ3Qgc2hpZnQgdGhpbmdzIGFyb3VuZAorICAgICAgICAvLyB1bnRpbCBhbGwgYnVmZmVycyBhcmUgYWxsb2NhdGVkLiAgSWYgd2UgdGhyb3csIHdlIGRvbid0IG5lZWQgdG8gZml4CisgICAgICAgIC8vIGFueXRoaW5nIHVwIChhbnkgYWRkZWQgYnVmZmVycyBhcmUgdW5kZXRlY3RpYmxlKQorICAgICAgICBmb3IgKDsgX19uYiA+IDA7IC0tX19uYiwgX19iYXNlOjpfX3N0YXJ0XyArPSBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSAtIChfX2Jhc2U6Ol9fbWFwXy5zaXplKCkgPT0gMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX2Jhc2U6Ol9fbWFwXy5fX2Zyb250X3NwYXJlKCkgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIF9fYmFzZTo6X19tYXBfLnB1c2hfZnJvbnQoX19hbGxvY190cmFpdHM6OmFsbG9jYXRlKF9fYSwgX19iYXNlOjpfX2Jsb2NrX3NpemUpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgX19uYiA+IDA7IC0tX19uYiwgKytfX2JhY2tfY2FwYWNpdHkpCisgICAgICAgICAgICBfX2Jhc2U6Ol9fbWFwXy5wdXNoX2JhY2soX19hbGxvY190cmFpdHM6OmFsbG9jYXRlKF9fYSwgX19iYXNlOjpfX2Jsb2NrX3NpemUpKTsKKyAgICAgICAgLy8gRG9uZSBhbGxvY2F0aW5nLCByZW9yZGVyIGNhcGFjaXR5CisgICAgICAgIF9fYmFzZTo6X19zdGFydF8gKz0gX19iYWNrX2NhcGFjaXR5ICogX19iYXNlOjpfX2Jsb2NrX3NpemU7CisgICAgICAgIGZvciAoOyBfX2JhY2tfY2FwYWNpdHkgPiAwOyAtLV9fYmFja19jYXBhY2l0eSkKKyAgICAgICAgeworICAgICAgICAgICAgcG9pbnRlciBfX3B0ID0gX19iYXNlOjpfX21hcF8uYmFjaygpOworICAgICAgICAgICAgX19iYXNlOjpfX21hcF8ucG9wX2JhY2soKTsKKyAgICAgICAgICAgIF9fYmFzZTo6X19tYXBfLnB1c2hfZnJvbnQoX19wdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gRWxzZSBuZWVkIHRvIGFsbG9jYXRlIF9fbmIgYnVmZmVycywgKmFuZCogd2UgbmVlZCB0byByZWFsbG9jYXRlIF9fbWFwXy4KKyAgICBlbHNlCisgICAgeworICAgICAgICBzaXplX3R5cGUgX19kcyA9IChfX25iICsgX19iYWNrX2NhcGFjaXR5KSAqIF9fYmFzZTo6X19ibG9ja19zaXplIC0gX19iYXNlOjpfX21hcF8uZW1wdHkoKTsKKyAgICAgICAgX19zcGxpdF9idWZmZXI8cG9pbnRlciwgdHlwZW5hbWUgX19iYXNlOjpfX3BvaW50ZXJfYWxsb2NhdG9yJj4KKyAgICAgICAgICAgIF9fYnVmKG1heDxzaXplX3R5cGU+KDIqIF9fYmFzZTo6X19tYXBfLmNhcGFjaXR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25iICsgX19iYXNlOjpfX21hcF8uc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgIDAsIF9fYmFzZTo6X19tYXBfLl9fYWxsb2MoKSk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0cnkKKyAgICAgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIGZvciAoOyBfX25iID4gMDsgLS1fX25iKQorICAgICAgICAgICAgICAgIF9fYnVmLnB1c2hfYmFjayhfX2FsbG9jX3RyYWl0czo6YWxsb2NhdGUoX19hLCBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSkpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoLi4uKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHR5cGVuYW1lIF9fYmFzZTo6X19tYXBfcG9pbnRlciBfX2kgPSBfX2J1Zi5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICBfX2kgIT0gX19idWYuZW5kKCk7ICsrX19pKQorICAgICAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKF9fYSwgKl9faSwgX19iYXNlOjpfX2Jsb2NrX3NpemUpOworICAgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIGZvciAoOyBfX2JhY2tfY2FwYWNpdHkgPiAwOyAtLV9fYmFja19jYXBhY2l0eSkKKyAgICAgICAgeworICAgICAgICAgICAgX19idWYucHVzaF9iYWNrKF9fYmFzZTo6X19tYXBfLmJhY2soKSk7CisgICAgICAgICAgICBfX2Jhc2U6Ol9fbWFwXy5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgICAgIGZvciAodHlwZW5hbWUgX19iYXNlOjpfX21hcF9wb2ludGVyIF9faSA9IF9fYmFzZTo6X19tYXBfLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgX19pICE9IF9fYmFzZTo6X19tYXBfLmVuZCgpOyArK19faSkKKyAgICAgICAgICAgIF9fYnVmLnB1c2hfYmFjaygqX19pKTsKKyAgICAgICAgX1ZTVEQ6OnN3YXAoX19iYXNlOjpfX21hcF8uX19maXJzdF8sIF9fYnVmLl9fZmlyc3RfKTsKKyAgICAgICAgX1ZTVEQ6OnN3YXAoX19iYXNlOjpfX21hcF8uX19iZWdpbl8sIF9fYnVmLl9fYmVnaW5fKTsKKyAgICAgICAgX1ZTVEQ6OnN3YXAoX19iYXNlOjpfX21hcF8uX19lbmRfLCBfX2J1Zi5fX2VuZF8pOworICAgICAgICBfVlNURDo6c3dhcChfX2Jhc2U6Ol9fbWFwXy5fX2VuZF9jYXAoKSwgX19idWYuX19lbmRfY2FwKCkpOworICAgICAgICBfX2Jhc2U6Ol9fc3RhcnRfICs9IF9fZHM7CisgICAgfQorfQorCisvLyBDcmVhdGUgYmFjayBjYXBhY2l0eSBmb3Igb25lIGJsb2NrIG9mIGVsZW1lbnRzLgorLy8gU3Ryb25nIGd1YXJhbnRlZS4gIEVpdGhlciBkbyBpdCBvciBkb24ndCB0b3VjaCBhbnl0aGluZy4KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjpfX2FkZF9iYWNrX2NhcGFjaXR5KCkKK3sKKyAgICBhbGxvY2F0b3JfdHlwZSYgX19hID0gX19iYXNlOjpfX2FsbG9jKCk7CisgICAgaWYgKF9fZnJvbnRfc3BhcmUoKSA+PSBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSkKKyAgICB7CisgICAgICAgIF9fYmFzZTo6X19zdGFydF8gLT0gX19iYXNlOjpfX2Jsb2NrX3NpemU7CisgICAgICAgIHBvaW50ZXIgX19wdCA9IF9fYmFzZTo6X19tYXBfLmZyb250KCk7CisgICAgICAgIF9fYmFzZTo6X19tYXBfLnBvcF9mcm9udCgpOworICAgICAgICBfX2Jhc2U6Ol9fbWFwXy5wdXNoX2JhY2soX19wdCk7CisgICAgfQorICAgIC8vIEVsc2UgaWYgX19uYiA8PSBfX21hcF8uY2FwYWNpdHkoKSAtIF9fbWFwXy5zaXplKCkgdGhlbiB3ZSBuZWVkIHRvIGFsbG9jYXRlIF9fbmIgYnVmZmVycworICAgIGVsc2UgaWYgKF9fYmFzZTo6X19tYXBfLnNpemUoKSA8IF9fYmFzZTo6X19tYXBfLmNhcGFjaXR5KCkpCisgICAgeyAgIC8vIHdlIGNhbiBwdXQgdGhlIG5ldyBidWZmZXIgaW50byB0aGUgbWFwLCBidXQgZG9uJ3Qgc2hpZnQgdGhpbmdzIGFyb3VuZAorICAgICAgICAvLyB1bnRpbCBpdCBpcyBhbGxvY2F0ZWQuICBJZiB3ZSB0aHJvdywgd2UgZG9uJ3QgbmVlZCB0byBmaXgKKyAgICAgICAgLy8gYW55dGhpbmcgdXAgKGFueSBhZGRlZCBidWZmZXJzIGFyZSB1bmRldGVjdGlibGUpCisgICAgICAgIGlmIChfX2Jhc2U6Ol9fbWFwXy5fX2JhY2tfc3BhcmUoKSAhPSAwKQorICAgICAgICAgICAgX19iYXNlOjpfX21hcF8ucHVzaF9iYWNrKF9fYWxsb2NfdHJhaXRzOjphbGxvY2F0ZShfX2EsIF9fYmFzZTo6X19ibG9ja19zaXplKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX19iYXNlOjpfX21hcF8ucHVzaF9mcm9udChfX2FsbG9jX3RyYWl0czo6YWxsb2NhdGUoX19hLCBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSkpOworICAgICAgICAgICAgLy8gRG9uZSBhbGxvY2F0aW5nLCByZW9yZGVyIGNhcGFjaXR5CisgICAgICAgICAgICBwb2ludGVyIF9fcHQgPSBfX2Jhc2U6Ol9fbWFwXy5mcm9udCgpOworICAgICAgICAgICAgX19iYXNlOjpfX21hcF8ucG9wX2Zyb250KCk7CisgICAgICAgICAgICBfX2Jhc2U6Ol9fbWFwXy5wdXNoX2JhY2soX19wdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gRWxzZSBuZWVkIHRvIGFsbG9jYXRlIDEgYnVmZmVyLCAqYW5kKiB3ZSBuZWVkIHRvIHJlYWxsb2NhdGUgX19tYXBfLgorICAgIGVsc2UKKyAgICB7CisgICAgICAgIF9fc3BsaXRfYnVmZmVyPHBvaW50ZXIsIHR5cGVuYW1lIF9fYmFzZTo6X19wb2ludGVyX2FsbG9jYXRvciY+CisgICAgICAgICAgICBfX2J1ZihtYXg8c2l6ZV90eXBlPigyKiBfX2Jhc2U6Ol9fbWFwXy5jYXBhY2l0eSgpLCAxKSwKKyAgICAgICAgICAgICAgICAgIF9fYmFzZTo6X19tYXBfLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgIF9fYmFzZTo6X19tYXBfLl9fYWxsb2MoKSk7CisKKyAgICAgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9BbGxvY2F0b3I+IF9EcDsKKyAgICAgICAgdW5pcXVlX3B0cjxwb2ludGVyLCBfRHA+IF9faG9sZCgKKyAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjphbGxvY2F0ZShfX2EsIF9fYmFzZTo6X19ibG9ja19zaXplKSwKKyAgICAgICAgICAgICAgICBfRHAoX19hLCBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSkpOworICAgICAgICBfX2J1Zi5wdXNoX2JhY2soX19ob2xkLmdldCgpKTsKKyAgICAgICAgX19ob2xkLnJlbGVhc2UoKTsKKworICAgICAgICBmb3IgKHR5cGVuYW1lIF9fYmFzZTo6X19tYXBfcG9pbnRlciBfX2kgPSBfX2Jhc2U6Ol9fbWFwXy5lbmQoKTsKKyAgICAgICAgICAgICAgICBfX2kgIT0gX19iYXNlOjpfX21hcF8uYmVnaW4oKTspCisgICAgICAgICAgICBfX2J1Zi5wdXNoX2Zyb250KCotLV9faSk7CisgICAgICAgIF9WU1REOjpzd2FwKF9fYmFzZTo6X19tYXBfLl9fZmlyc3RfLCBfX2J1Zi5fX2ZpcnN0Xyk7CisgICAgICAgIF9WU1REOjpzd2FwKF9fYmFzZTo6X19tYXBfLl9fYmVnaW5fLCBfX2J1Zi5fX2JlZ2luXyk7CisgICAgICAgIF9WU1REOjpzd2FwKF9fYmFzZTo6X19tYXBfLl9fZW5kXywgX19idWYuX19lbmRfKTsKKyAgICAgICAgX1ZTVEQ6OnN3YXAoX19iYXNlOjpfX21hcF8uX19lbmRfY2FwKCksIF9fYnVmLl9fZW5kX2NhcCgpKTsKKyAgICB9Cit9CisKKy8vIENyZWF0ZSBiYWNrIGNhcGFjaXR5IGZvciBfX24gZWxlbWVudHMuCisvLyBTdHJvbmcgZ3VhcmFudGVlLiAgRWl0aGVyIGRvIGl0IG9yIGRvbid0IHRvdWNoIGFueXRoaW5nLgordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK2RlcXVlPF9UcCwgX0FsbG9jYXRvcj46Ol9fYWRkX2JhY2tfY2FwYWNpdHkoc2l6ZV90eXBlIF9fbikKK3sKKyAgICBhbGxvY2F0b3JfdHlwZSYgX19hID0gX19iYXNlOjpfX2FsbG9jKCk7CisgICAgc2l6ZV90eXBlIF9fbmIgPSBfX3JlY29tbWVuZF9ibG9ja3MoX19uICsgX19iYXNlOjpfX21hcF8uZW1wdHkoKSk7CisgICAgLy8gTnVtYmVyIG9mIHVudXNlZCBibG9ja3MgYXQgZnJvbnQ6CisgICAgc2l6ZV90eXBlIF9fZnJvbnRfY2FwYWNpdHkgPSBfX2Zyb250X3NwYXJlKCkgLyBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZTsKKyAgICBfX2Zyb250X2NhcGFjaXR5ID0gX1ZTVEQ6Om1pbihfX2Zyb250X2NhcGFjaXR5LCBfX25iKTsgIC8vIGRvbid0IHRha2UgbW9yZSB0aGFuIHlvdSBuZWVkCisgICAgX19uYiAtPSBfX2Zyb250X2NhcGFjaXR5OyAgLy8gbnVtYmVyIG9mIGJsb2NrcyBuZWVkIHRvIGFsbG9jYXRlCisgICAgLy8gSWYgX19uYiA9PSAwLCB0aGVuIHdlIGhhdmUgc3VmZmljaWVudCBjYXBhY2l0eS4KKyAgICBpZiAoX19uYiA9PSAwKQorICAgIHsKKyAgICAgICAgX19iYXNlOjpfX3N0YXJ0XyAtPSBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSAqIF9fZnJvbnRfY2FwYWNpdHk7CisgICAgICAgIGZvciAoOyBfX2Zyb250X2NhcGFjaXR5ID4gMDsgLS1fX2Zyb250X2NhcGFjaXR5KQorICAgICAgICB7CisgICAgICAgICAgICBwb2ludGVyIF9fcHQgPSBfX2Jhc2U6Ol9fbWFwXy5mcm9udCgpOworICAgICAgICAgICAgX19iYXNlOjpfX21hcF8ucG9wX2Zyb250KCk7CisgICAgICAgICAgICBfX2Jhc2U6Ol9fbWFwXy5wdXNoX2JhY2soX19wdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gRWxzZSBpZiBfX25iIDw9IF9fbWFwXy5jYXBhY2l0eSgpIC0gX19tYXBfLnNpemUoKSB0aGVuIHdlIG5lZWQgdG8gYWxsb2NhdGUgX19uYiBidWZmZXJzCisgICAgZWxzZSBpZiAoX19uYiA8PSBfX2Jhc2U6Ol9fbWFwXy5jYXBhY2l0eSgpIC0gX19iYXNlOjpfX21hcF8uc2l6ZSgpKQorICAgIHsgICAvLyB3ZSBjYW4gcHV0IHRoZSBuZXcgYnVmZmVycyBpbnRvIHRoZSBtYXAsIGJ1dCBkb24ndCBzaGlmdCB0aGluZ3MgYXJvdW5kCisgICAgICAgIC8vIHVudGlsIGFsbCBidWZmZXJzIGFyZSBhbGxvY2F0ZWQuICBJZiB3ZSB0aHJvdywgd2UgZG9uJ3QgbmVlZCB0byBmaXgKKyAgICAgICAgLy8gYW55dGhpbmcgdXAgKGFueSBhZGRlZCBidWZmZXJzIGFyZSB1bmRldGVjdGlibGUpCisgICAgICAgIGZvciAoOyBfX25iID4gMDsgLS1fX25iKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX19iYXNlOjpfX21hcF8uX19iYWNrX3NwYXJlKCkgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIF9fYmFzZTo6X19tYXBfLnB1c2hfYmFjayhfX2FsbG9jX3RyYWl0czo6YWxsb2NhdGUoX19hLCBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoOyBfX25iID4gMDsgLS1fX25iLCArK19fZnJvbnRfY2FwYWNpdHksIF9fYmFzZTo6X19zdGFydF8gKz0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmFzZTo6X19ibG9ja19zaXplIC0gKF9fYmFzZTo6X19tYXBfLnNpemUoKSA9PSAxKSkKKyAgICAgICAgICAgIF9fYmFzZTo6X19tYXBfLnB1c2hfZnJvbnQoX19hbGxvY190cmFpdHM6OmFsbG9jYXRlKF9fYSwgX19iYXNlOjpfX2Jsb2NrX3NpemUpKTsKKyAgICAgICAgLy8gRG9uZSBhbGxvY2F0aW5nLCByZW9yZGVyIGNhcGFjaXR5CisgICAgICAgIF9fYmFzZTo6X19zdGFydF8gLT0gX19iYXNlOjpfX2Jsb2NrX3NpemUgKiBfX2Zyb250X2NhcGFjaXR5OworICAgICAgICBmb3IgKDsgX19mcm9udF9jYXBhY2l0eSA+IDA7IC0tX19mcm9udF9jYXBhY2l0eSkKKyAgICAgICAgeworICAgICAgICAgICAgcG9pbnRlciBfX3B0ID0gX19iYXNlOjpfX21hcF8uZnJvbnQoKTsKKyAgICAgICAgICAgIF9fYmFzZTo6X19tYXBfLnBvcF9mcm9udCgpOworICAgICAgICAgICAgX19iYXNlOjpfX21hcF8ucHVzaF9iYWNrKF9fcHQpOworICAgICAgICB9CisgICAgfQorICAgIC8vIEVsc2UgbmVlZCB0byBhbGxvY2F0ZSBfX25iIGJ1ZmZlcnMsICphbmQqIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSBfX21hcF8uCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fZHMgPSBfX2Zyb250X2NhcGFjaXR5ICogX19iYXNlOjpfX2Jsb2NrX3NpemU7CisgICAgICAgIF9fc3BsaXRfYnVmZmVyPHBvaW50ZXIsIHR5cGVuYW1lIF9fYmFzZTo6X19wb2ludGVyX2FsbG9jYXRvciY+CisgICAgICAgICAgICBfX2J1ZihtYXg8c2l6ZV90eXBlPigyKiBfX2Jhc2U6Ol9fbWFwXy5jYXBhY2l0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uYiArIF9fYmFzZTo6X19tYXBfLnNpemUoKSksCisgICAgICAgICAgICAgICAgICBfX2Jhc2U6Ol9fbWFwXy5zaXplKCkgLSBfX2Zyb250X2NhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgX19iYXNlOjpfX21hcF8uX19hbGxvYygpKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHRyeQorICAgICAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgZm9yICg7IF9fbmIgPiAwOyAtLV9fbmIpCisgICAgICAgICAgICAgICAgX19idWYucHVzaF9iYWNrKF9fYWxsb2NfdHJhaXRzOjphbGxvY2F0ZShfX2EsIF9fYmFzZTo6X19ibG9ja19zaXplKSk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB9CisgICAgICAgIGNhdGNoICguLi4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodHlwZW5hbWUgX19iYXNlOjpfX21hcF9wb2ludGVyIF9faSA9IF9fYnVmLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIF9faSAhPSBfX2J1Zi5lbmQoKTsgKytfX2kpCisgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hLCAqX19pLCBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSk7CisgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgZm9yICg7IF9fZnJvbnRfY2FwYWNpdHkgPiAwOyAtLV9fZnJvbnRfY2FwYWNpdHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fYnVmLnB1c2hfYmFjayhfX2Jhc2U6Ol9fbWFwXy5mcm9udCgpKTsKKyAgICAgICAgICAgIF9fYmFzZTo6X19tYXBfLnBvcF9mcm9udCgpOworICAgICAgICB9CisgICAgICAgIGZvciAodHlwZW5hbWUgX19iYXNlOjpfX21hcF9wb2ludGVyIF9faSA9IF9fYmFzZTo6X19tYXBfLmVuZCgpOworICAgICAgICAgICAgICAgIF9faSAhPSBfX2Jhc2U6Ol9fbWFwXy5iZWdpbigpOykKKyAgICAgICAgICAgIF9fYnVmLnB1c2hfZnJvbnQoKi0tX19pKTsKKyAgICAgICAgX1ZTVEQ6OnN3YXAoX19iYXNlOjpfX21hcF8uX19maXJzdF8sIF9fYnVmLl9fZmlyc3RfKTsKKyAgICAgICAgX1ZTVEQ6OnN3YXAoX19iYXNlOjpfX21hcF8uX19iZWdpbl8sIF9fYnVmLl9fYmVnaW5fKTsKKyAgICAgICAgX1ZTVEQ6OnN3YXAoX19iYXNlOjpfX21hcF8uX19lbmRfLCBfX2J1Zi5fX2VuZF8pOworICAgICAgICBfVlNURDo6c3dhcChfX2Jhc2U6Ol9fbWFwXy5fX2VuZF9jYXAoKSwgX19idWYuX19lbmRfY2FwKCkpOworICAgICAgICBfX2Jhc2U6Ol9fc3RhcnRfIC09IF9fZHM7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6cG9wX2Zyb250KCkKK3sKKyAgICBhbGxvY2F0b3JfdHlwZSYgX19hID0gX19iYXNlOjpfX2FsbG9jKCk7CisgICAgX19hbGxvY190cmFpdHM6OmRlc3Ryb3koX19hLCBfX3RvX3Jhd19wb2ludGVyKCooX19iYXNlOjpfX21hcF8uYmVnaW4oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iYXNlOjpfX3N0YXJ0XyAvIF9fYmFzZTo6X19ibG9ja19zaXplKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iYXNlOjpfX3N0YXJ0XyAlIF9fYmFzZTo6X19ibG9ja19zaXplKSk7CisgICAgLS1fX2Jhc2U6OnNpemUoKTsKKyAgICBpZiAoKytfX2Jhc2U6Ol9fc3RhcnRfID49IDIgKiBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSkKKyAgICB7CisgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKF9fYSwgX19iYXNlOjpfX21hcF8uZnJvbnQoKSwgX19iYXNlOjpfX2Jsb2NrX3NpemUpOworICAgICAgICBfX2Jhc2U6Ol9fbWFwXy5wb3BfZnJvbnQoKTsKKyAgICAgICAgX19iYXNlOjpfX3N0YXJ0XyAtPSBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+Ojpwb3BfYmFjaygpCit7CisgICAgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IF9fYmFzZTo6X19hbGxvYygpOworICAgIHNpemVfdHlwZSBfX3AgPSBfX2Jhc2U6OnNpemUoKSArIF9fYmFzZTo6X19zdGFydF8gLSAxOworICAgIF9fYWxsb2NfdHJhaXRzOjpkZXN0cm95KF9fYSwgX190b19yYXdfcG9pbnRlcigqKF9fYmFzZTo6X19tYXBfLmJlZ2luKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcCAvIF9fYmFzZTo6X19ibG9ja19zaXplKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wICUgX19iYXNlOjpfX2Jsb2NrX3NpemUpKTsKKyAgICAtLV9fYmFzZTo6c2l6ZSgpOworICAgIGlmIChfX2JhY2tfc3BhcmUoKSA+PSAyICogX19iYXNlOjpfX2Jsb2NrX3NpemUpCisgICAgeworICAgICAgICBfX2FsbG9jX3RyYWl0czo6ZGVhbGxvY2F0ZShfX2EsIF9fYmFzZTo6X19tYXBfLmJhY2soKSwgX19iYXNlOjpfX2Jsb2NrX3NpemUpOworICAgICAgICBfX2Jhc2U6Ol9fbWFwXy5wb3BfYmFjaygpOworICAgIH0KK30KKworLy8gbW92ZSBhc3NpZ24gW19fZiwgX19sKSB0byBbX19yLCBfX3IgKyAoX19sLV9fZikpLgorLy8gSWYgX192dCBwb2ludHMgaW50byBbX19mLCBfX2wpLCB0aGVuIHN1YnRyYWN0IChfX2YgLSBfX3IpIGZyb20gX192dC4KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6X19tb3ZlX2FuZF9jaGVjayhpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCwgaXRlcmF0b3IgX19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9wb2ludGVyJiBfX3Z0KQoreworICAgIC8vIGFzIGlmCisgICAgLy8gICBmb3IgKDsgX19mICE9IF9fbDsgKytfX2YsICsrX19yKQorICAgIC8vICAgICAgICpfX3IgPSBfVlNURDo6bW92ZSgqX19mKTsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19sIC0gX19mOworICAgIHdoaWxlIChfX24gPiAwKQorICAgIHsKKyAgICAgICAgcG9pbnRlciBfX2ZiID0gX19mLl9fcHRyXzsKKyAgICAgICAgcG9pbnRlciBfX2ZlID0gKl9fZi5fX21faXRlcl8gKyBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZTsKKyAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fYnMgPSBfX2ZlIC0gX19mYjsKKyAgICAgICAgaWYgKF9fYnMgPiBfX24pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fYnMgPSBfX247CisgICAgICAgICAgICBfX2ZlID0gX19mYiArIF9fYnM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fZmIgPD0gX192dCAmJiBfX3Z0IDwgX19mZSkKKyAgICAgICAgICAgIF9fdnQgPSAoY29uc3RfaXRlcmF0b3Ioc3RhdGljX2Nhc3Q8X19tYXBfY29uc3RfcG9pbnRlcj4oX19mLl9fbV9pdGVyXyksIF9fdnQpIC09IF9fZiAtIF9fcikuX19wdHJfOworICAgICAgICBfX3IgPSBfVlNURDo6bW92ZShfX2ZiLCBfX2ZlLCBfX3IpOworICAgICAgICBfX24gLT0gX19iczsKKyAgICAgICAgX19mICs9IF9fYnM7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKKy8vIG1vdmUgYXNzaWduIFtfX2YsIF9fbCkgdG8gW19fciAtIChfX2wtX19mKSwgX19yKSBiYWNrd2FyZHMuCisvLyBJZiBfX3Z0IHBvaW50cyBpbnRvIFtfX2YsIF9fbCksIHRoZW4gYWRkIChfX3IgLSBfX2wpIHRvIF9fdnQuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IKK2RlcXVlPF9UcCwgX0FsbG9jYXRvcj46Ol9fbW92ZV9iYWNrd2FyZF9hbmRfY2hlY2soaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wsIGl0ZXJhdG9yIF9fciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcG9pbnRlciYgX192dCkKK3sKKyAgICAvLyBhcyBpZgorICAgIC8vICAgd2hpbGUgKF9fZiAhPSBfX2wpCisgICAgLy8gICAgICAgKi0tX19yID0gX1ZTVEQ6Om1vdmUoKi0tX19sKTsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19sIC0gX19mOworICAgIHdoaWxlIChfX24gPiAwKQorICAgIHsKKyAgICAgICAgLS1fX2w7CisgICAgICAgIHBvaW50ZXIgX19sYiA9ICpfX2wuX19tX2l0ZXJfOworICAgICAgICBwb2ludGVyIF9fbGUgPSBfX2wuX19wdHJfICsgMTsKKyAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fYnMgPSBfX2xlIC0gX19sYjsKKyAgICAgICAgaWYgKF9fYnMgPiBfX24pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fYnMgPSBfX247CisgICAgICAgICAgICBfX2xiID0gX19sZSAtIF9fYnM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fbGIgPD0gX192dCAmJiBfX3Z0IDwgX19sZSkKKyAgICAgICAgICAgIF9fdnQgPSAoY29uc3RfaXRlcmF0b3Ioc3RhdGljX2Nhc3Q8X19tYXBfY29uc3RfcG9pbnRlcj4oX19sLl9fbV9pdGVyXyksIF9fdnQpICs9IF9fciAtIF9fbCAtIDEpLl9fcHRyXzsKKyAgICAgICAgX19yID0gX1ZTVEQ6Om1vdmVfYmFja3dhcmQoX19sYiwgX19sZSwgX19yKTsKKyAgICAgICAgX19uIC09IF9fYnM7CisgICAgICAgIF9fbCAtPSBfX2JzIC0gMTsKKyAgICB9CisgICAgcmV0dXJuIF9fcjsKK30KKworLy8gbW92ZSBjb25zdHJ1Y3QgW19fZiwgX19sKSB0byBbX19yLCBfX3IgKyAoX19sLV9fZikpLgorLy8gSWYgX192dCBwb2ludHMgaW50byBbX19mLCBfX2wpLCB0aGVuIGFkZCAoX19yIC0gX19mKSB0byBfX3Z0LgordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK2RlcXVlPF9UcCwgX0FsbG9jYXRvcj46Ol9fbW92ZV9jb25zdHJ1Y3RfYW5kX2NoZWNrKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IgX19yLCBjb25zdF9wb2ludGVyJiBfX3Z0KQoreworICAgIGFsbG9jYXRvcl90eXBlJiBfX2EgPSBfX2Jhc2U6Ol9fYWxsb2MoKTsKKyAgICAvLyBhcyBpZgorICAgIC8vICAgZm9yICg7IF9fZiAhPSBfX2w7ICsrX19yLCArK19fZiwgKytfX2Jhc2U6OnNpemUoKSkKKyAgICAvLyAgICAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZigqX19yKSwgX1ZTVEQ6Om1vdmUoKl9fZikpOworICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX2wgLSBfX2Y7CisgICAgd2hpbGUgKF9fbiA+IDApCisgICAgeworICAgICAgICBwb2ludGVyIF9fZmIgPSBfX2YuX19wdHJfOworICAgICAgICBwb2ludGVyIF9fZmUgPSAqX19mLl9fbV9pdGVyXyArIF9fYmFzZTo6X19ibG9ja19zaXplOworICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19icyA9IF9fZmUgLSBfX2ZiOworICAgICAgICBpZiAoX19icyA+IF9fbikKKyAgICAgICAgeworICAgICAgICAgICAgX19icyA9IF9fbjsKKyAgICAgICAgICAgIF9fZmUgPSBfX2ZiICsgX19iczsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19mYiA8PSBfX3Z0ICYmIF9fdnQgPCBfX2ZlKQorICAgICAgICAgICAgX192dCA9IChjb25zdF9pdGVyYXRvcihzdGF0aWNfY2FzdDxfX21hcF9jb25zdF9wb2ludGVyPihfX2YuX19tX2l0ZXJfKSwgX192dCkgKz0gX19yIC0gX19mKS5fX3B0cl87CisgICAgICAgIGZvciAoOyBfX2ZiICE9IF9fZmU7ICsrX19mYiwgKytfX3IsICsrX19iYXNlOjpzaXplKCkpCisgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZigqX19yKSwgX1ZTVEQ6Om1vdmUoKl9fZmIpKTsKKyAgICAgICAgX19uIC09IF9fYnM7CisgICAgICAgIF9fZiArPSBfX2JzOworICAgIH0KK30KKworLy8gbW92ZSBjb25zdHJ1Y3QgW19fZiwgX19sKSB0byBbX19yIC0gKF9fbC1fX2YpLCBfX3IpIGJhY2t3YXJkcy4KKy8vIElmIF9fdnQgcG9pbnRzIGludG8gW19fZiwgX19sKSwgdGhlbiBzdWJ0cmFjdCAoX19sIC0gX19yKSBmcm9tIF9fdnQuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAorZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6X19tb3ZlX2NvbnN0cnVjdF9iYWNrd2FyZF9hbmRfY2hlY2soaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvciBfX3IsIGNvbnN0X3BvaW50ZXImIF9fdnQpCit7CisgICAgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IF9fYmFzZTo6X19hbGxvYygpOworICAgIC8vIGFzIGlmCisgICAgLy8gICBmb3IgKGl0ZXJhdG9yIF9faiA9IF9fbDsgX19qICE9IF9fZjspCisgICAgLy8gICB7CisgICAgLy8gICAgICAgX19hbGxvY190cmFpdHNjb25zdHJ1Y3QoX19hLCBfVlNURDo6YWRkcmVzc29mKCotLV9fciksIF9WU1REOjptb3ZlKCotLV9faikpOworICAgIC8vICAgICAgIC0tX19iYXNlOjpfX3N0YXJ0XzsKKyAgICAvLyAgICAgICArK19fYmFzZTo6c2l6ZSgpOworICAgIC8vICAgfQorICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX2wgLSBfX2Y7CisgICAgd2hpbGUgKF9fbiA+IDApCisgICAgeworICAgICAgICAtLV9fbDsKKyAgICAgICAgcG9pbnRlciBfX2xiID0gKl9fbC5fX21faXRlcl87CisgICAgICAgIHBvaW50ZXIgX19sZSA9IF9fbC5fX3B0cl8gKyAxOworICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19icyA9IF9fbGUgLSBfX2xiOworICAgICAgICBpZiAoX19icyA+IF9fbikKKyAgICAgICAgeworICAgICAgICAgICAgX19icyA9IF9fbjsKKyAgICAgICAgICAgIF9fbGIgPSBfX2xlIC0gX19iczsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19sYiA8PSBfX3Z0ICYmIF9fdnQgPCBfX2xlKQorICAgICAgICAgICAgX192dCA9IChjb25zdF9pdGVyYXRvcihzdGF0aWNfY2FzdDxfX21hcF9jb25zdF9wb2ludGVyPihfX2wuX19tX2l0ZXJfKSwgX192dCkgLT0gX19sIC0gX19yICsgMSkuX19wdHJfOworICAgICAgICB3aGlsZSAoX19sZSAhPSBfX2xiKQorICAgICAgICB7CisgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZigqLS1fX3IpLCBfVlNURDo6bW92ZSgqLS1fX2xlKSk7CisgICAgICAgICAgICAtLV9fYmFzZTo6X19zdGFydF87CisgICAgICAgICAgICArK19fYmFzZTo6c2l6ZSgpOworICAgICAgICB9CisgICAgICAgIF9fbiAtPSBfX2JzOworICAgICAgICBfX2wgLT0gX19icyAtIDE7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IKK2RlcXVlPF9UcCwgX0FsbG9jYXRvcj46OmVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZikKK3sKKyAgICBpdGVyYXRvciBfX2IgPSBfX2Jhc2U6OmJlZ2luKCk7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fcG9zID0gX19mIC0gX19iOworICAgIGl0ZXJhdG9yIF9fcCA9IF9fYiArIF9fcG9zOworICAgIGFsbG9jYXRvcl90eXBlJiBfX2EgPSBfX2Jhc2U6Ol9fYWxsb2MoKTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihfX3BvcykgPD0gKF9fYmFzZTo6c2l6ZSgpIC0gMSkgLyAyKQorICAgIHsgICAvLyBlcmFzZSBmcm9tIGZyb250CisgICAgICAgIF9WU1REOjptb3ZlX2JhY2t3YXJkKF9fYiwgX19wLCBfVlNURDo6bmV4dChfX3ApKTsKKyAgICAgICAgX19hbGxvY190cmFpdHM6OmRlc3Ryb3koX19hLCBfVlNURDo6YWRkcmVzc29mKCpfX2IpKTsKKyAgICAgICAgLS1fX2Jhc2U6OnNpemUoKTsKKyAgICAgICAgKytfX2Jhc2U6Ol9fc3RhcnRfOworICAgICAgICBpZiAoX19mcm9udF9zcGFyZSgpID49IDIgKiBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hLCBfX2Jhc2U6Ol9fbWFwXy5mcm9udCgpLCBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSk7CisgICAgICAgICAgICBfX2Jhc2U6Ol9fbWFwXy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIF9fYmFzZTo6X19zdGFydF8gLT0gX19iYXNlOjpfX2Jsb2NrX3NpemU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvLyBlcmFzZSBmcm9tIGJhY2sKKyAgICAgICAgaXRlcmF0b3IgX19pID0gX1ZTVEQ6Om1vdmUoX1ZTVEQ6Om5leHQoX19wKSwgX19iYXNlOjplbmQoKSwgX19wKTsKKyAgICAgICAgX19hbGxvY190cmFpdHM6OmRlc3Ryb3koX19hLCBfVlNURDo6YWRkcmVzc29mKCpfX2kpKTsKKyAgICAgICAgLS1fX2Jhc2U6OnNpemUoKTsKKyAgICAgICAgaWYgKF9fYmFja19zcGFyZSgpID49IDIgKiBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hLCBfX2Jhc2U6Ol9fbWFwXy5iYWNrKCksIF9fYmFzZTo6X19ibG9ja19zaXplKTsKKyAgICAgICAgICAgIF9fYmFzZTo6X19tYXBfLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fYmFzZTo6YmVnaW4oKSArIF9fcG9zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IKK2RlcXVlPF9UcCwgX0FsbG9jYXRvcj46OmVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQoreworICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX2wgLSBfX2Y7CisgICAgaXRlcmF0b3IgX19iID0gX19iYXNlOjpiZWdpbigpOworICAgIGRpZmZlcmVuY2VfdHlwZSBfX3BvcyA9IF9fZiAtIF9fYjsKKyAgICBpdGVyYXRvciBfX3AgPSBfX2IgKyBfX3BvczsKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRvcl90eXBlJiBfX2EgPSBfX2Jhc2U6Ol9fYWxsb2MoKTsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4oX19wb3MpIDw9IChfX2Jhc2U6OnNpemUoKSAtIF9fbikgLyAyKQorICAgICAgICB7ICAgLy8gZXJhc2UgZnJvbSBmcm9udAorICAgICAgICAgICAgaXRlcmF0b3IgX19pID0gX1ZTVEQ6Om1vdmVfYmFja3dhcmQoX19iLCBfX3AsIF9fcCArIF9fbik7CisgICAgICAgICAgICBmb3IgKDsgX19iICE9IF9faTsgKytfX2IpCisgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmRlc3Ryb3koX19hLCBfVlNURDo6YWRkcmVzc29mKCpfX2IpKTsKKyAgICAgICAgICAgIF9fYmFzZTo6c2l6ZSgpIC09IF9fbjsKKyAgICAgICAgICAgIF9fYmFzZTo6X19zdGFydF8gKz0gX19uOworICAgICAgICAgICAgd2hpbGUgKF9fZnJvbnRfc3BhcmUoKSA+PSAyICogX19iYXNlOjpfX2Jsb2NrX3NpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hLCBfX2Jhc2U6Ol9fbWFwXy5mcm9udCgpLCBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSk7CisgICAgICAgICAgICAgICAgX19iYXNlOjpfX21hcF8ucG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgX19iYXNlOjpfX3N0YXJ0XyAtPSBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgICAvLyBlcmFzZSBmcm9tIGJhY2sKKyAgICAgICAgICAgIGl0ZXJhdG9yIF9faSA9IF9WU1REOjptb3ZlKF9fcCArIF9fbiwgX19iYXNlOjplbmQoKSwgX19wKTsKKyAgICAgICAgICAgIGZvciAoaXRlcmF0b3IgX19lID0gX19iYXNlOjplbmQoKTsgX19pICE9IF9fZTsgKytfX2kpCisgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmRlc3Ryb3koX19hLCBfVlNURDo6YWRkcmVzc29mKCpfX2kpKTsKKyAgICAgICAgICAgIF9fYmFzZTo6c2l6ZSgpIC09IF9fbjsKKyAgICAgICAgICAgIHdoaWxlIChfX2JhY2tfc3BhcmUoKSA+PSAyICogX19iYXNlOjpfX2Jsb2NrX3NpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hLCBfX2Jhc2U6Ol9fbWFwXy5iYWNrKCksIF9fYmFzZTo6X19ibG9ja19zaXplKTsKKyAgICAgICAgICAgICAgICBfX2Jhc2U6Ol9fbWFwXy5wb3BfYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX2Jhc2U6OmJlZ2luKCkgKyBfX3BvczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK2RlcXVlPF9UcCwgX0FsbG9jYXRvcj46Ol9fZXJhc2VfdG9fZW5kKGNvbnN0X2l0ZXJhdG9yIF9fZikKK3sKKyAgICBpdGVyYXRvciBfX2UgPSBfX2Jhc2U6OmVuZCgpOworICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX2UgLSBfX2Y7CisgICAgaWYgKF9fbiA+IDApCisgICAgeworICAgICAgICBhbGxvY2F0b3JfdHlwZSYgX19hID0gX19iYXNlOjpfX2FsbG9jKCk7CisgICAgICAgIGl0ZXJhdG9yIF9fYiA9IF9fYmFzZTo6YmVnaW4oKTsKKyAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fcG9zID0gX19mIC0gX19iOworICAgICAgICBmb3IgKGl0ZXJhdG9yIF9fcCA9IF9fYiArIF9fcG9zOyBfX3AgIT0gX19lOyArK19fcCkKKyAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpkZXN0cm95KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZigqX19wKSk7CisgICAgICAgIF9fYmFzZTo6c2l6ZSgpIC09IF9fbjsKKyAgICAgICAgd2hpbGUgKF9fYmFja19zcGFyZSgpID49IDIgKiBfX2Jhc2U6Ol9fYmxvY2tfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hLCBfX2Jhc2U6Ol9fbWFwXy5iYWNrKCksIF9fYmFzZTo6X19ibG9ja19zaXplKTsKKyAgICAgICAgICAgIF9fYmFzZTo6X19tYXBfLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUKK3ZvaWQKK2RlcXVlPF9UcCwgX0FsbG9jYXRvcj46OnN3YXAoZGVxdWUmIF9fYykKKyNpZiBfTElCQ1BQX1NURF9WRVIgPj0gMTQKKyAgICAgICAgX05PRVhDRVBUCisjZWxzZQorICAgICAgICBfTk9FWENFUFRfKCFfX2FsbG9jX3RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwOjp2YWx1ZSB8fCAKKyAgICAgICAgICAgICAgICAgICAgX19pc19ub3Rocm93X3N3YXBwYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKQorI2VuZGlmCit7CisgICAgX19iYXNlOjpzd2FwKF9fYyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUKK3ZvaWQKK2RlcXVlPF9UcCwgX0FsbG9jYXRvcj46OmNsZWFyKCkgX05PRVhDRVBUCit7CisgICAgX19iYXNlOjpjbGVhcigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgZGVxdWU8X1RwLCBfQWxsb2NhdG9yPiYgX194LCBjb25zdCBkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+JiBfX3kpCit7CisgICAgY29uc3QgdHlwZW5hbWUgZGVxdWU8X1RwLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlIF9fc3ogPSBfX3guc2l6ZSgpOworICAgIHJldHVybiBfX3N6ID09IF9feS5zaXplKCkgJiYgX1ZTVEQ6OmVxdWFsKF9feC5iZWdpbigpLCBfX3guZW5kKCksIF9feS5iZWdpbigpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jYXRvcj4mIF9feCwgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2NhdG9yPiYgX195KQoreworICAgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPCAoY29uc3QgZGVxdWU8X1RwLCBfQWxsb2NhdG9yPiYgX194LCBjb25zdCBkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+JiBfX3kpCit7CisgICAgcmV0dXJuIF9WU1REOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZShfX3guYmVnaW4oKSwgX194LmVuZCgpLCBfX3kuYmVnaW4oKSwgX195LmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj4gKGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jYXRvcj4mIF9feCwgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2NhdG9yPiYgX195KQoreworICAgIHJldHVybiBfX3kgPCBfX3g7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+PShjb25zdCBkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+JiBfX3gsIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jYXRvcj4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPCBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPD0oY29uc3QgZGVxdWU8X1RwLCBfQWxsb2NhdG9yPiYgX194LCBjb25zdCBkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX195IDwgX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzd2FwKGRlcXVlPF9UcCwgX0FsbG9jYXRvcj4mIF9feCwgZGVxdWU8X1RwLCBfQWxsb2NhdG9yPiYgX195KQorICAgIF9OT0VYQ0VQVF8oX05PRVhDRVBUXyhfX3guc3dhcChfX3kpKSkKK3sKKyAgICBfX3guc3dhcChfX3kpOworfQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKK19MSUJDUFBfUE9QX01BQ1JPUworCisjZW5kaWYgIC8vIF9MSUJDUFBfREVRVUUKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9lcnJuby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2Vycm5vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2NDI5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9lcnJuby5oCkBAIC0wLDAgKzEsMzk4IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlcnJuby5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0VSUk5PX0gKKyNkZWZpbmUgX0xJQkNQUF9FUlJOT19ICisKKy8qCisgICAgZXJybm8uaCBzeW5vcHNpcworCitNYWNyb3M6CisKKyAgICBFRE9NCisgICAgRUlMU0VRICAvLyBDOTkKKyAgICBFUkFOR0UKKyAgICBlcnJubworCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCisjaW5jbHVkZV9uZXh0IDxlcnJuby5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKKworI2lmICFkZWZpbmVkKEVPV05FUkRFQUQpIHx8ICFkZWZpbmVkKEVOT1RSRUNPVkVSQUJMRSkKKworI2lmZGVmIEVMQVNUCisKK3N0YXRpYyBjb25zdCBpbnQgX19lbGFzdDEgPSBFTEFTVCsxOworc3RhdGljIGNvbnN0IGludCBfX2VsYXN0MiA9IEVMQVNUKzI7CisKKyNlbHNlCisKK3N0YXRpYyBjb25zdCBpbnQgX19lbGFzdDEgPSAxMDQ7CitzdGF0aWMgY29uc3QgaW50IF9fZWxhc3QyID0gMTA1OworCisjZW5kaWYKKworI2lmZGVmIEVOT1RSRUNPVkVSQUJMRQorCisjZGVmaW5lIEVPV05FUkRFQUQgX19lbGFzdDEKKworI2lmZGVmIEVMQVNUCisjdW5kZWYgRUxBU1QKKyNkZWZpbmUgRUxBU1QgRU9XTkVSREVBRAorI2VuZGlmCisKKyNlbGlmIGRlZmluZWQoRU9XTkVSREVBRCkKKworI2RlZmluZSBFTk9UUkVDT1ZFUkFCTEUgX19lbGFzdDEKKyNpZmRlZiBFTEFTVAorI3VuZGVmIEVMQVNUCisjZGVmaW5lIEVMQVNUIEVOT1RSRUNPVkVSQUJMRQorI2VuZGlmCisKKyNlbHNlICAvLyBkZWZpbmVkKEVPV05FUkRFQUQpCisKKyNkZWZpbmUgRU9XTkVSREVBRCBfX2VsYXN0MQorI2RlZmluZSBFTk9UUkVDT1ZFUkFCTEUgX19lbGFzdDIKKyNpZmRlZiBFTEFTVAorI3VuZGVmIEVMQVNUCisjZGVmaW5lIEVMQVNUIEVOT1RSRUNPVkVSQUJMRQorI2VuZGlmCisKKyNlbmRpZiAgLy8gZGVmaW5lZChFT1dORVJERUFEKQorCisjZW5kaWYgIC8vICFkZWZpbmVkKEVPV05FUkRFQUQpIHx8ICFkZWZpbmVkKEVOT1RSRUNPVkVSQUJMRSkKKworLy8gIHN1cHBseSBlcnJubyB2YWx1ZXMgbGlrZWx5IHRvIGJlIG1pc3NpbmcsIHBhcnRpY3VsYXJseSBvbiBXaW5kb3dzCisKKyNpZm5kZWYgRUFGTk9TVVBQT1JUCisjZGVmaW5lIEVBRk5PU1VQUE9SVCA5OTAxCisjZW5kaWYKKworI2lmbmRlZiBFQUREUklOVVNFCisjZGVmaW5lIEVBRERSSU5VU0UgOTkwMgorI2VuZGlmCisKKyNpZm5kZWYgRUFERFJOT1RBVkFJTAorI2RlZmluZSBFQUREUk5PVEFWQUlMIDk5MDMKKyNlbmRpZgorCisjaWZuZGVmIEVJU0NPTk4KKyNkZWZpbmUgRUlTQ09OTiA5OTA0CisjZW5kaWYKKworI2lmbmRlZiBFQkFETVNHCisjZGVmaW5lIEVCQURNU0cgOTkwNQorI2VuZGlmCisKKyNpZm5kZWYgRUNPTk5BQk9SVEVECisjZGVmaW5lIEVDT05OQUJPUlRFRCA5OTA2CisjZW5kaWYKKworI2lmbmRlZiBFQUxSRUFEWQorI2RlZmluZSBFQUxSRUFEWSA5OTA3CisjZW5kaWYKKworI2lmbmRlZiBFQ09OTlJFRlVTRUQKKyNkZWZpbmUgRUNPTk5SRUZVU0VEIDk5MDgKKyNlbmRpZgorCisjaWZuZGVmIEVDT05OUkVTRVQKKyNkZWZpbmUgRUNPTk5SRVNFVCA5OTA5CisjZW5kaWYKKworI2lmbmRlZiBFREVTVEFERFJSRVEKKyNkZWZpbmUgRURFU1RBRERSUkVRIDk5MTAKKyNlbmRpZgorCisjaWZuZGVmIEVIT1NUVU5SRUFDSAorI2RlZmluZSBFSE9TVFVOUkVBQ0ggOTkxMQorI2VuZGlmCisKKyNpZm5kZWYgRUlEUk0KKyNkZWZpbmUgRUlEUk0gOTkxMgorI2VuZGlmCisKKyNpZm5kZWYgRU1TR1NJWkUKKyNkZWZpbmUgRU1TR1NJWkUgOTkxMworI2VuZGlmCisKKyNpZm5kZWYgRU5FVERPV04KKyNkZWZpbmUgRU5FVERPV04gOTkxNAorI2VuZGlmCisKKyNpZm5kZWYgRU5FVFJFU0VUCisjZGVmaW5lIEVORVRSRVNFVCA5OTE1CisjZW5kaWYKKworI2lmbmRlZiBFTkVUVU5SRUFDSAorI2RlZmluZSBFTkVUVU5SRUFDSCA5OTE2CisjZW5kaWYKKworI2lmbmRlZiBFTk9CVUZTCisjZGVmaW5lIEVOT0JVRlMgOTkxNworI2VuZGlmCisKKyNpZm5kZWYgRU5PTElOSworI2RlZmluZSBFTk9MSU5LIDk5MTgKKyNlbmRpZgorCisjaWZuZGVmIEVOT0RBVEEKKyNkZWZpbmUgRU5PREFUQSA5OTE5CisjZW5kaWYKKworI2lmbmRlZiBFTk9NU0cKKyNkZWZpbmUgRU5PTVNHIDk5MjAKKyNlbmRpZgorCisjaWZuZGVmIEVOT1BST1RPT1BUCisjZGVmaW5lIEVOT1BST1RPT1BUIDk5MjEKKyNlbmRpZgorCisjaWZuZGVmIEVOT1NSCisjZGVmaW5lIEVOT1NSIDk5MjIKKyNlbmRpZgorCisjaWZuZGVmIEVOT1RTT0NLCisjZGVmaW5lIEVOT1RTT0NLIDk5MjMKKyNlbmRpZgorCisjaWZuZGVmIEVOT1NUUgorI2RlZmluZSBFTk9TVFIgOTkyNAorI2VuZGlmCisKKyNpZm5kZWYgRU5PVENPTk4KKyNkZWZpbmUgRU5PVENPTk4gOTkyNQorI2VuZGlmCisKKyNpZm5kZWYgRU5PVFNVUAorI2RlZmluZSBFTk9UU1VQIDk5MjYKKyNlbmRpZgorCisjaWZuZGVmIEVDQU5DRUxFRAorI2RlZmluZSBFQ0FOQ0VMRUQgOTkyNworI2VuZGlmCisKKyNpZm5kZWYgRUlOUFJPR1JFU1MKKyNkZWZpbmUgRUlOUFJPR1JFU1MgOTkyOAorI2VuZGlmCisKKyNpZm5kZWYgRU9QTk9UU1VQUAorI2RlZmluZSBFT1BOT1RTVVBQIDk5MjkKKyNlbmRpZgorCisjaWZuZGVmIEVXT1VMREJMT0NLCisjZGVmaW5lIEVXT1VMREJMT0NLIDk5MzAKKyNlbmRpZgorCisjaWZuZGVmIEVPV05FUkRFQUQKKyNkZWZpbmUgRU9XTkVSREVBRCAgOTkzMQorI2VuZGlmCisKKyNpZm5kZWYgRVBST1RPCisjZGVmaW5lIEVQUk9UTyA5OTMyCisjZW5kaWYKKworI2lmbmRlZiBFUFJPVE9OT1NVUFBPUlQKKyNkZWZpbmUgRVBST1RPTk9TVVBQT1JUIDk5MzMKKyNlbmRpZgorCisjaWZuZGVmIEVOT1RSRUNPVkVSQUJMRQorI2RlZmluZSBFTk9UUkVDT1ZFUkFCTEUgOTkzNAorI2VuZGlmCisKKyNpZm5kZWYgRVRJTUUKKyNkZWZpbmUgRVRJTUUgOTkzNQorI2VuZGlmCisKKyNpZm5kZWYgRVRYVEJTWQorI2RlZmluZSBFVFhUQlNZIDk5MzYKKyNlbmRpZgorCisjaWZuZGVmIEVUSU1FRE9VVAorI2RlZmluZSBFVElNRURPVVQgOTkzOAorI2VuZGlmCisKKyNpZm5kZWYgRUxPT1AKKyNkZWZpbmUgRUxPT1AgOTkzOQorI2VuZGlmCisKKyNpZm5kZWYgRU9WRVJGTE9XCisjZGVmaW5lIEVPVkVSRkxPVyA5OTQwCisjZW5kaWYKKworI2lmbmRlZiBFUFJPVE9UWVBFCisjZGVmaW5lIEVQUk9UT1RZUEUgOTk0MQorI2VuZGlmCisKKyNpZm5kZWYgRU5PU1lTCisjZGVmaW5lIEVOT1NZUyA5OTQyCisjZW5kaWYKKworI2lmbmRlZiBFSU5WQUwKKyNkZWZpbmUgRUlOVkFMIDk5NDMKKyNlbmRpZgorCisjaWZuZGVmIEVSQU5HRQorI2RlZmluZSBFUkFOR0UgOTk0NAorI2VuZGlmCisKKyNpZm5kZWYgRUlMU0VRCisjZGVmaW5lIEVJTFNFUSA5OTQ1CisjZW5kaWYKKworLy8gIFdpbmRvd3MgTW9iaWxlIGRvZXNuJ3QgYXBwZWFyIHRvIGRlZmluZSB0aGVzZToKKworI2lmbmRlZiBFMkJJRworI2RlZmluZSBFMkJJRyA5OTQ2CisjZW5kaWYKKworI2lmbmRlZiBFRE9NCisjZGVmaW5lIEVET00gOTk0NworI2VuZGlmCisKKyNpZm5kZWYgRUZBVUxUCisjZGVmaW5lIEVGQVVMVCA5OTQ4CisjZW5kaWYKKworI2lmbmRlZiBFQkFERgorI2RlZmluZSBFQkFERiA5OTQ5CisjZW5kaWYKKworI2lmbmRlZiBFUElQRQorI2RlZmluZSBFUElQRSA5OTUwCisjZW5kaWYKKworI2lmbmRlZiBFWERFVgorI2RlZmluZSBFWERFViA5OTUxCisjZW5kaWYKKworI2lmbmRlZiBFQlVTWQorI2RlZmluZSBFQlVTWSA5OTUyCisjZW5kaWYKKworI2lmbmRlZiBFTk9URU1QVFkKKyNkZWZpbmUgRU5PVEVNUFRZIDk5NTMKKyNlbmRpZgorCisjaWZuZGVmIEVOT0VYRUMKKyNkZWZpbmUgRU5PRVhFQyA5OTU0CisjZW5kaWYKKworI2lmbmRlZiBFRVhJU1QKKyNkZWZpbmUgRUVYSVNUIDk5NTUKKyNlbmRpZgorCisjaWZuZGVmIEVGQklHCisjZGVmaW5lIEVGQklHIDk5NTYKKyNlbmRpZgorCisjaWZuZGVmIEVOQU1FVE9PTE9ORworI2RlZmluZSBFTkFNRVRPT0xPTkcgOTk1NworI2VuZGlmCisKKyNpZm5kZWYgRU5PVFRZCisjZGVmaW5lIEVOT1RUWSA5OTU4CisjZW5kaWYKKworI2lmbmRlZiBFSU5UUgorI2RlZmluZSBFSU5UUiA5OTU5CisjZW5kaWYKKworI2lmbmRlZiBFU1BJUEUKKyNkZWZpbmUgRVNQSVBFIDk5NjAKKyNlbmRpZgorCisjaWZuZGVmIEVJTworI2RlZmluZSBFSU8gOTk2MQorI2VuZGlmCisKKyNpZm5kZWYgRUlTRElSCisjZGVmaW5lIEVJU0RJUiA5OTYyCisjZW5kaWYKKworI2lmbmRlZiBFQ0hJTEQKKyNkZWZpbmUgRUNISUxEIDk5NjMKKyNlbmRpZgorCisjaWZuZGVmIEVOT0xDSworI2RlZmluZSBFTk9MQ0sgOTk2NAorI2VuZGlmCisKKyNpZm5kZWYgRU5PU1BDCisjZGVmaW5lIEVOT1NQQyA5OTY1CisjZW5kaWYKKworI2lmbmRlZiBFTlhJTworI2RlZmluZSBFTlhJTyA5OTY2CisjZW5kaWYKKworI2lmbmRlZiBFTk9ERVYKKyNkZWZpbmUgRU5PREVWIDk5NjcKKyNlbmRpZgorCisjaWZuZGVmIEVOT0VOVAorI2RlZmluZSBFTk9FTlQgOTk2OAorI2VuZGlmCisKKyNpZm5kZWYgRVNSQ0gKKyNkZWZpbmUgRVNSQ0ggOTk2OQorI2VuZGlmCisKKyNpZm5kZWYgRU5PVERJUgorI2RlZmluZSBFTk9URElSIDk5NzAKKyNlbmRpZgorCisjaWZuZGVmIEVOT01FTQorI2RlZmluZSBFTk9NRU0gOTk3MQorI2VuZGlmCisKKyNpZm5kZWYgRVBFUk0KKyNkZWZpbmUgRVBFUk0gOTk3MgorI2VuZGlmCisKKyNpZm5kZWYgRUFDQ0VTCisjZGVmaW5lIEVBQ0NFUyA5OTczCisjZW5kaWYKKworI2lmbmRlZiBFUk9GUworI2RlZmluZSBFUk9GUyA5OTc0CisjZW5kaWYKKworI2lmbmRlZiBFREVBRExLCisjZGVmaW5lIEVERUFETEsgOTk3NQorI2VuZGlmCisKKyNpZm5kZWYgRUFHQUlOCisjZGVmaW5lIEVBR0FJTiA5OTc2CisjZW5kaWYKKworI2lmbmRlZiBFTkZJTEUKKyNkZWZpbmUgRU5GSUxFIDk5NzcKKyNlbmRpZgorCisjaWZuZGVmIEVNRklMRQorI2RlZmluZSBFTUZJTEUgOTk3OAorI2VuZGlmCisKKyNpZm5kZWYgRU1MSU5LCisjZGVmaW5lIEVNTElOSyA5OTc5CisjZW5kaWYKKworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9FUlJOT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhjZXB0aW9uIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4Y2VwdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWJkNmFjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4Y2VwdGlvbgpAQCAtMCwwICsxLDMzNyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZXhjZXB0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9FWENFUFRJT04KKyNkZWZpbmUgX0xJQkNQUF9FWENFUFRJT04KKworLyoKKyAgICBleGNlcHRpb24gc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCitjbGFzcyBleGNlcHRpb24KK3sKK3B1YmxpYzoKKyAgICBleGNlcHRpb24oKSBub2V4Y2VwdDsKKyAgICBleGNlcHRpb24oY29uc3QgZXhjZXB0aW9uJikgbm9leGNlcHQ7CisgICAgZXhjZXB0aW9uJiBvcGVyYXRvcj0oY29uc3QgZXhjZXB0aW9uJikgbm9leGNlcHQ7CisgICAgdmlydHVhbCB+ZXhjZXB0aW9uKCkgbm9leGNlcHQ7CisgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQ7Cit9OworCitjbGFzcyBiYWRfZXhjZXB0aW9uCisgICAgOiBwdWJsaWMgZXhjZXB0aW9uCit7CitwdWJsaWM6CisgICAgYmFkX2V4Y2VwdGlvbigpIG5vZXhjZXB0OworICAgIGJhZF9leGNlcHRpb24oY29uc3QgYmFkX2V4Y2VwdGlvbiYpIG5vZXhjZXB0OworICAgIGJhZF9leGNlcHRpb24mIG9wZXJhdG9yPShjb25zdCBiYWRfZXhjZXB0aW9uJikgbm9leGNlcHQ7CisgICAgdmlydHVhbCB+YmFkX2V4Y2VwdGlvbigpIG5vZXhjZXB0OworICAgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0OworfTsKKwordHlwZWRlZiB2b2lkICgqdW5leHBlY3RlZF9oYW5kbGVyKSgpOwordW5leHBlY3RlZF9oYW5kbGVyIHNldF91bmV4cGVjdGVkKHVuZXhwZWN0ZWRfaGFuZGxlciAgZiApIG5vZXhjZXB0OwordW5leHBlY3RlZF9oYW5kbGVyIGdldF91bmV4cGVjdGVkKCkgbm9leGNlcHQ7CitbW25vcmV0dXJuXV0gdm9pZCB1bmV4cGVjdGVkKCk7CisKK3R5cGVkZWYgdm9pZCAoKnRlcm1pbmF0ZV9oYW5kbGVyKSgpOwordGVybWluYXRlX2hhbmRsZXIgc2V0X3Rlcm1pbmF0ZSh0ZXJtaW5hdGVfaGFuZGxlciAgZiApIG5vZXhjZXB0OwordGVybWluYXRlX2hhbmRsZXIgZ2V0X3Rlcm1pbmF0ZSgpIG5vZXhjZXB0OworW1tub3JldHVybl1dIHZvaWQgdGVybWluYXRlKCkgbm9leGNlcHQ7CisKK2Jvb2wgdW5jYXVnaHRfZXhjZXB0aW9uKCkgIG5vZXhjZXB0OworaW50ICB1bmNhdWdodF9leGNlcHRpb25zKCkgbm9leGNlcHQ7ICAvLyBDKysxNworCit0eXBlZGVmIHVuc3BlY2lmaWVkIGV4Y2VwdGlvbl9wdHI7CisKK2V4Y2VwdGlvbl9wdHIgY3VycmVudF9leGNlcHRpb24oKSBub2V4Y2VwdDsKK3ZvaWQgcmV0aHJvd19leGNlcHRpb24gW1tub3JldHVybl1dIChleGNlcHRpb25fcHRyIHApOwordGVtcGxhdGU8Y2xhc3MgRT4gZXhjZXB0aW9uX3B0ciBtYWtlX2V4Y2VwdGlvbl9wdHIoRSBlKSBub2V4Y2VwdDsKKworY2xhc3MgbmVzdGVkX2V4Y2VwdGlvbgoreworcHVibGljOgorICAgIG5lc3RlZF9leGNlcHRpb24oKSBub2V4Y2VwdDsKKyAgICBuZXN0ZWRfZXhjZXB0aW9uKGNvbnN0IG5lc3RlZF9leGNlcHRpb24mKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgbmVzdGVkX2V4Y2VwdGlvbiYgb3BlcmF0b3I9KGNvbnN0IG5lc3RlZF9leGNlcHRpb24mKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB+bmVzdGVkX2V4Y2VwdGlvbigpID0gZGVmYXVsdDsKKworICAgIC8vIGFjY2VzcyBmdW5jdGlvbnMKKyAgICBbW25vcmV0dXJuXV0gdm9pZCByZXRocm93X25lc3RlZCgpIGNvbnN0OworICAgIGV4Y2VwdGlvbl9wdHIgbmVzdGVkX3B0cigpIGNvbnN0IG5vZXhjZXB0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IFtbbm9yZXR1cm5dXSB2b2lkIHRocm93X3dpdGhfbmVzdGVkKFQmJiB0KTsKK3RlbXBsYXRlIDxjbGFzcyBFPiB2b2lkIHJldGhyb3dfaWZfbmVzdGVkKGNvbnN0IEUmIGUpOworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2lmIGRlZmluZWQoX0xJQkNQUF9BQklfTUlDUk9TT0ZUKSAmJiAhZGVmaW5lZChfTElCQ1BQX05PX1ZDUlVOVElNRSkKKyNpbmNsdWRlIDx2Y3J1bnRpbWVfZXhjZXB0aW9uLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgIC8vIHB1cnBvc2VmdWxseSBub3QgdXNpbmcgdmVyc2lvbmluZyBuYW1lc3BhY2UKK3sKKworI2lmICFkZWZpbmVkKF9MSUJDUFBfQUJJX01JQ1JPU09GVCkgfHwgZGVmaW5lZChfTElCQ1BQX05PX1ZDUlVOVElNRSkKK2NsYXNzIF9MSUJDUFBfRVhDRVBUSU9OX0FCSSBleGNlcHRpb24KK3sKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4Y2VwdGlvbigpIF9OT0VYQ0VQVCB7fQorICAgIHZpcnR1YWwgfmV4Y2VwdGlvbigpIF9OT0VYQ0VQVDsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBfTk9FWENFUFQ7Cit9OworCitjbGFzcyBfTElCQ1BQX0VYQ0VQVElPTl9BQkkgYmFkX2V4Y2VwdGlvbgorICAgIDogcHVibGljIGV4Y2VwdGlvbgoreworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYmFkX2V4Y2VwdGlvbigpIF9OT0VYQ0VQVCB7fQorICAgIHZpcnR1YWwgfmJhZF9leGNlcHRpb24oKSBfTk9FWENFUFQ7CisgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgX05PRVhDRVBUOworfTsKKyNlbmRpZiAvLyAhX0xJQkNQUF9BQklfTUlDUk9TT0ZUIHx8IF9MSUJDUFBfTk9fVkNSVU5USU1FCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPD0gMTQgXAorICAgIHx8IGRlZmluZWQoX0xJQkNQUF9FTkFCTEVfQ1hYMTdfUkVNT1ZFRF9VTkVYUEVDVEVEX0ZVTkNUSU9OUykgXAorICAgIHx8IGRlZmluZWQoX0xJQkNQUF9CVUlMRElOR19MSUJSQVJZKQordHlwZWRlZiB2b2lkICgqdW5leHBlY3RlZF9oYW5kbGVyKSgpOworX0xJQkNQUF9GVU5DX1ZJUyB1bmV4cGVjdGVkX2hhbmRsZXIgc2V0X3VuZXhwZWN0ZWQodW5leHBlY3RlZF9oYW5kbGVyKSBfTk9FWENFUFQ7CitfTElCQ1BQX0ZVTkNfVklTIHVuZXhwZWN0ZWRfaGFuZGxlciBnZXRfdW5leHBlY3RlZCgpIF9OT0VYQ0VQVDsKK19MSUJDUFBfTk9SRVRVUk4gX0xJQkNQUF9GVU5DX1ZJUyB2b2lkIHVuZXhwZWN0ZWQoKTsKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgKCp0ZXJtaW5hdGVfaGFuZGxlcikoKTsKK19MSUJDUFBfRlVOQ19WSVMgdGVybWluYXRlX2hhbmRsZXIgc2V0X3Rlcm1pbmF0ZSh0ZXJtaW5hdGVfaGFuZGxlcikgX05PRVhDRVBUOworX0xJQkNQUF9GVU5DX1ZJUyB0ZXJtaW5hdGVfaGFuZGxlciBnZXRfdGVybWluYXRlKCkgX05PRVhDRVBUOworX0xJQkNQUF9OT1JFVFVSTiBfTElCQ1BQX0ZVTkNfVklTIHZvaWQgdGVybWluYXRlKCkgX05PRVhDRVBUOworCitfTElCQ1BQX0ZVTkNfVklTIGJvb2wgdW5jYXVnaHRfZXhjZXB0aW9uKCkgX05PRVhDRVBUOworX0xJQkNQUF9GVU5DX1ZJUyBfTElCQ1BQX0FWQUlMQUJJTElUWV9VTkNBVUdIVF9FWENFUFRJT05TIGludCB1bmNhdWdodF9leGNlcHRpb25zKCkgX05PRVhDRVBUOworCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIGV4Y2VwdGlvbl9wdHI7CisKK19MSUJDUFBfRlVOQ19WSVMgZXhjZXB0aW9uX3B0ciBjdXJyZW50X2V4Y2VwdGlvbigpIF9OT0VYQ0VQVDsKK19MSUJDUFBfTk9SRVRVUk4gX0xJQkNQUF9GVU5DX1ZJUyB2b2lkIHJldGhyb3dfZXhjZXB0aW9uKGV4Y2VwdGlvbl9wdHIpOworCisjaWZuZGVmIF9MSUJDUFBfQUJJX01JQ1JPU09GVAorCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIGV4Y2VwdGlvbl9wdHIKK3sKKyAgICB2b2lkKiBfX3B0cl87CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBleGNlcHRpb25fcHRyKCkgX05PRVhDRVBUIDogX19wdHJfKCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4Y2VwdGlvbl9wdHIobnVsbHB0cl90KSBfTk9FWENFUFQgOiBfX3B0cl8oKSB7fQorCisgICAgZXhjZXB0aW9uX3B0cihjb25zdCBleGNlcHRpb25fcHRyJikgX05PRVhDRVBUOworICAgIGV4Y2VwdGlvbl9wdHImIG9wZXJhdG9yPShjb25zdCBleGNlcHRpb25fcHRyJikgX05PRVhDRVBUOworICAgIH5leGNlcHRpb25fcHRyKCkgX05PRVhDRVBUOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0VYUExJQ0lUIG9wZXJhdG9yIGJvb2woKSBjb25zdCBfTk9FWENFUFQKKyAgICB7cmV0dXJuIF9fcHRyXyAhPSBudWxscHRyO30KKworICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGV4Y2VwdGlvbl9wdHImIF9feCwgY29uc3QgZXhjZXB0aW9uX3B0ciYgX195KSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX3guX19wdHJfID09IF9feS5fX3B0cl87fQorCisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgZXhjZXB0aW9uX3B0ciYgX194LCBjb25zdCBleGNlcHRpb25fcHRyJiBfX3kpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorCisgICAgZnJpZW5kIF9MSUJDUFBfRlVOQ19WSVMgZXhjZXB0aW9uX3B0ciBjdXJyZW50X2V4Y2VwdGlvbigpIF9OT0VYQ0VQVDsKKyAgICBmcmllbmQgX0xJQkNQUF9GVU5DX1ZJUyB2b2lkIHJldGhyb3dfZXhjZXB0aW9uKGV4Y2VwdGlvbl9wdHIpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX0VwPgorZXhjZXB0aW9uX3B0cgorbWFrZV9leGNlcHRpb25fcHRyKF9FcCBfX2UpIF9OT0VYQ0VQVAoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisgICAgICAgIHRocm93IF9fZTsKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHJldHVybiBjdXJyZW50X2V4Y2VwdGlvbigpOworICAgIH0KKyNlbHNlCisgICAgKCh2b2lkKV9fZSk7CisgICAgX1ZTVEQ6OmFib3J0KCk7CisjZW5kaWYKK30KKworI2Vsc2UgLy8gX0xJQkNQUF9BQklfTUlDUk9TT0ZUCisKK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgZXhjZXB0aW9uX3B0cgoreworI2lmIGRlZmluZWQoX19jbGFuZ19fKQorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1wcml2YXRlLWZpZWxkIgorI2VuZGlmCisgICAgdm9pZCogX19wdHIxXzsKKyAgICB2b2lkKiBfX3B0cjJfOworI2lmIGRlZmluZWQoX19jbGFuZ19fKQorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCitwdWJsaWM6CisgICAgZXhjZXB0aW9uX3B0cigpIF9OT0VYQ0VQVDsKKyAgICBleGNlcHRpb25fcHRyKG51bGxwdHJfdCkgX05PRVhDRVBUOworICAgIGV4Y2VwdGlvbl9wdHIoY29uc3QgZXhjZXB0aW9uX3B0ciYgX19vdGhlcikgX05PRVhDRVBUOworICAgIGV4Y2VwdGlvbl9wdHImIG9wZXJhdG9yPShjb25zdCBleGNlcHRpb25fcHRyJiBfX290aGVyKSBfTk9FWENFUFQ7CisgICAgZXhjZXB0aW9uX3B0ciYgb3BlcmF0b3I9KG51bGxwdHJfdCkgX05PRVhDRVBUOworICAgIH5leGNlcHRpb25fcHRyKCkgX05PRVhDRVBUOworICAgIF9MSUJDUFBfRVhQTElDSVQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IF9OT0VYQ0VQVDsKK307CisKK19MSUJDUFBfRlVOQ19WSVMKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBleGNlcHRpb25fcHRyJiBfX3gsIGNvbnN0IGV4Y2VwdGlvbl9wdHImIF9feSkgX05PRVhDRVBUOworCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBvcGVyYXRvciE9KGNvbnN0IGV4Y2VwdGlvbl9wdHImIF9feCwgY29uc3QgZXhjZXB0aW9uX3B0ciYgX195KSBfTk9FWENFUFQKKyAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorCitfTElCQ1BQX0ZVTkNfVklTIHZvaWQgc3dhcChleGNlcHRpb25fcHRyJiwgZXhjZXB0aW9uX3B0ciYpIF9OT0VYQ0VQVDsKKworX0xJQkNQUF9GVU5DX1ZJUyBleGNlcHRpb25fcHRyIF9fY29weV9leGNlcHRpb25fcHRyKHZvaWQgKl9fZXhjZXB0LCBjb25zdCB2b2lkKiBfX3B0cik7CitfTElCQ1BQX0ZVTkNfVklTIGV4Y2VwdGlvbl9wdHIgY3VycmVudF9leGNlcHRpb24oKSBfTk9FWENFUFQ7CitfTElCQ1BQX05PUkVUVVJOIF9MSUJDUFBfRlVOQ19WSVMgdm9pZCByZXRocm93X2V4Y2VwdGlvbihleGNlcHRpb25fcHRyIHApOworCisvLyBUaGlzIGlzIGEgYnVpbHQtaW4gdGVtcGxhdGUgZnVuY3Rpb24gd2hpY2ggYXV0b21hZ2ljYWxseSBleHRyYWN0cyB0aGUgcmVxdWlyZWQKKy8vIGluZm9ybWF0aW9uLgordGVtcGxhdGUgPGNsYXNzIF9FPiB2b2lkICpfX0dldEV4Y2VwdGlvbkluZm8oX0UpOworCit0ZW1wbGF0ZTxjbGFzcyBfRXA+CitleGNlcHRpb25fcHRyCittYWtlX2V4Y2VwdGlvbl9wdHIoX0VwIF9fZSkgX05PRVhDRVBUCit7CisgIHJldHVybiBfX2NvcHlfZXhjZXB0aW9uX3B0cihfVlNURDo6YWRkcmVzc29mKF9fZSksIF9fR2V0RXhjZXB0aW9uSW5mbyhfX2UpKTsKK30KKworI2VuZGlmIC8vIF9MSUJDUFBfQUJJX01JQ1JPU09GVAorLy8gbmVzdGVkX2V4Y2VwdGlvbgorCitjbGFzcyBfTElCQ1BQX0VYQ0VQVElPTl9BQkkgbmVzdGVkX2V4Y2VwdGlvbgoreworICAgIGV4Y2VwdGlvbl9wdHIgX19wdHJfOworcHVibGljOgorICAgIG5lc3RlZF9leGNlcHRpb24oKSBfTk9FWENFUFQ7CisvLyAgICAgbmVzdGVkX2V4Y2VwdGlvbihjb25zdCBuZXN0ZWRfZXhjZXB0aW9uJikgbm9leGNlcHQgPSBkZWZhdWx0OworLy8gICAgIG5lc3RlZF9leGNlcHRpb24mIG9wZXJhdG9yPShjb25zdCBuZXN0ZWRfZXhjZXB0aW9uJikgbm9leGNlcHQgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgfm5lc3RlZF9leGNlcHRpb24oKSBfTk9FWENFUFQ7CisKKyAgICAvLyBhY2Nlc3MgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9OT1JFVFVSTiB2b2lkIHJldGhyb3dfbmVzdGVkKCkgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBleGNlcHRpb25fcHRyIG5lc3RlZF9wdHIoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3B0cl87fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX25lc3RlZAorICAgIDogcHVibGljIF9UcCwKKyAgICAgIHB1YmxpYyBuZXN0ZWRfZXhjZXB0aW9uCit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBleHBsaWNpdCBfX25lc3RlZChjb25zdCBfVHAmIF9fdCkgOiBfVHAoX190KSB7fQorfTsKKworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcCwgYm9vbD4KK3N0cnVjdCBfX3Rocm93X3dpdGhfbmVzdGVkOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitzdHJ1Y3QgX190aHJvd193aXRoX25lc3RlZDxfVHAsIF9VcCwgdHJ1ZT4geworICAgIF9MSUJDUFBfTk9SRVRVUk4gc3RhdGljIGlubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgdm9pZAorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfX2RvX3Rocm93KF9UcCYmIF9fdCkKKyNlbHNlCisgICAgX19kb190aHJvdyAoX1RwJiBfX3QpCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHsKKyAgICAgICAgdGhyb3cgX19uZXN0ZWQ8X1VwPihfVlNURDo6Zm9yd2FyZDxfVHA+KF9fdCkpOworICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK3N0cnVjdCBfX3Rocm93X3dpdGhfbmVzdGVkPF9UcCwgX1VwLCBmYWxzZT4geworICAgIF9MSUJDUFBfTk9SRVRVUk4gc3RhdGljIGlubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgdm9pZAorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfX2RvX3Rocm93KF9UcCYmIF9fdCkKKyNlbHNlCisgICAgX19kb190aHJvdyAoX1RwJiBfX3QpCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHsKKyAgICAgICAgdGhyb3cgX1ZTVEQ6OmZvcndhcmQ8X1RwPihfX3QpOworICAgIH0KK307CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfTk9SRVRVUk4KK3ZvaWQKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCit0aHJvd193aXRoX25lc3RlZChfVHAmJiBfX3QpCisjZWxzZQordGhyb3dfd2l0aF9uZXN0ZWQgKF9UcCYgX190KQorI2VuZGlmIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworeworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGRlY2F5PF9UcD46OnR5cGUgX1VwOworICAgIHN0YXRpY19hc3NlcnQoIGlzX2NvcHlfY29uc3RydWN0aWJsZTxfVXA+Ojp2YWx1ZSwgInR5cGUgdGhyb3duIG11c3QgYmUgQ29weUNvbnN0cnVjdGlibGUiKTsKKyAgICBfX3Rocm93X3dpdGhfbmVzdGVkPF9UcCwgX1VwLAorICAgICAgICBpc19jbGFzczxfVXA+Ojp2YWx1ZSAmJgorICAgICAgICAhaXNfYmFzZV9vZjxuZXN0ZWRfZXhjZXB0aW9uLCBfVXA+Ojp2YWx1ZSAmJgorICAgICAgICAhX19saWJjcHBfaXNfZmluYWw8X1VwPjo6dmFsdWU+OjoKKyAgICAgICAgICAgIF9fZG9fdGhyb3coX1ZTVEQ6OmZvcndhcmQ8X1RwPihfX3QpKTsKKyNlbHNlCisgICAgKCh2b2lkKV9fdCk7CisgICAgLy8gRklYTUU6IE1ha2UgdGhpcyBhYm9ydAorI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRnJvbSwgY2xhc3MgX1RvPgorc3RydWN0IF9fY2FuX2R5bmFtaWNfY2FzdCA6IHB1YmxpYyBfTElCQ1BQX0JPT0xfQ09OU1RBTlQoCisgICAgICAgICAgICAgIGlzX3BvbHltb3JwaGljPF9Gcm9tPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgKCFpc19iYXNlX29mPF9UbywgX0Zyb20+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgIGlzX2NvbnZlcnRpYmxlPGNvbnN0IF9Gcm9tKiwgY29uc3QgX1RvKj46OnZhbHVlKSkge307CisKK3RlbXBsYXRlIDxjbGFzcyBfRXA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorcmV0aHJvd19pZl9uZXN0ZWQoY29uc3QgX0VwJiBfX2UsCisgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8IF9fY2FuX2R5bmFtaWNfY2FzdDxfRXAsIG5lc3RlZF9leGNlcHRpb24+Ojp2YWx1ZT46OnR5cGUqID0gMCkKK3sKKyAgICBjb25zdCBuZXN0ZWRfZXhjZXB0aW9uKiBfX25lcCA9IGR5bmFtaWNfY2FzdDxjb25zdCBuZXN0ZWRfZXhjZXB0aW9uKj4oX1ZTVEQ6OmFkZHJlc3NvZihfX2UpKTsKKyAgICBpZiAoX19uZXApCisgICAgICAgIF9fbmVwLT5yZXRocm93X25lc3RlZCgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0VwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3JldGhyb3dfaWZfbmVzdGVkKGNvbnN0IF9FcCYsCisgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8IV9fY2FuX2R5bmFtaWNfY2FzdDxfRXAsIG5lc3RlZF9leGNlcHRpb24+Ojp2YWx1ZT46OnR5cGUqID0gMCkKK3sKK30KKworfSAgLy8gc3RkCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9FWENFUFRJT04KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvX19jb25maWcgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL19fY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3Zjg4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL19fY29uZmlnCkBAIC0wLDAgKzEsNTcgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBfX2NvbmZpZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfRVhQRVJJTUVOVEFMX0NPTkZJRworI2RlZmluZSBfTElCQ1BQX0VYUEVSSU1FTlRBTF9DT05GSUcKKworI2luY2x1ZGUgPF9fY29uZmlnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2RlZmluZSBfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9FWFBFUklNRU5UQUwgbmFtZXNwYWNlIHN0ZCB7IG5hbWVzcGFjZSBleHBlcmltZW50YWwgeworI2RlZmluZSBfTElCQ1BQX0VORF9OQU1FU1BBQ0VfRVhQRVJJTUVOVEFMICB9IH0KKyNkZWZpbmUgX1ZTVERfRVhQRVJJTUVOVEFMIHN0ZDo6ZXhwZXJpbWVudGFsCisKKyNkZWZpbmUgX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfTEZUUyBfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9FWFBFUklNRU5UQUwgaW5saW5lIG5hbWVzcGFjZSBmdW5kYW1lbnRhbHNfdjEgeworI2RlZmluZSBfTElCQ1BQX0VORF9OQU1FU1BBQ0VfTEZUUyAgfSB9IH0KKyNkZWZpbmUgX1ZTVERfTEZUUyBfVlNURF9FWFBFUklNRU5UQUw6OmZ1bmRhbWVudGFsc192MQorCisjZGVmaW5lIF9MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX0xGVFNfVjIgX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfRVhQRVJJTUVOVEFMIGlubGluZSBuYW1lc3BhY2UgZnVuZGFtZW50YWxzX3YyIHsKKyNkZWZpbmUgX0xJQkNQUF9FTkRfTkFNRVNQQUNFX0xGVFNfVjIgIH0gfSB9CisjZGVmaW5lIF9WU1REX0xGVFNfVjIgX1ZTVERfRVhQRVJJTUVOVEFMOjpmdW5kYW1lbnRhbHNfdjIKKworI2RlZmluZSBfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9MRlRTX1BNUiBfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9MRlRTIG5hbWVzcGFjZSBwbXIgeworI2RlZmluZSBfTElCQ1BQX0VORF9OQU1FU1BBQ0VfTEZUU19QTVIgX0xJQkNQUF9FTkRfTkFNRVNQQUNFX0xGVFMgfQorI2RlZmluZSBfVlNURF9MRlRTX1BNUiBfVlNURF9MRlRTOjpwbXIKKworI2RlZmluZSBfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9DSFJPTk9fTEZUUyBfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQgICAgICAgIFwKKyAgbmFtZXNwYWNlIGNocm9ubyB7IG5hbWVzcGFjZSBleHBlcmltZW50YWwgeyBpbmxpbmUgbmFtZXNwYWNlIGZ1bmRhbWVudGFsc192MSB7CisjZGVmaW5lIF9MSUJDUFBfRU5EX05BTUVTUEFDRV9DSFJPTk9fTEZUUyBfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1REIH0gfSB9CisKKyNkZWZpbmUgX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfRVhQRVJJTUVOVEFMX0ZJTEVTWVNURU0gXAorICAgIF9MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX0VYUEVSSU1FTlRBTCBuYW1lc3BhY2UgZmlsZXN5c3RlbSB7IFwKKyAgICBpbmxpbmUgbmFtZXNwYWNlIHYxIHsKKworI2RlZmluZSBfTElCQ1BQX0VORF9OQU1FU1BBQ0VfRVhQRVJJTUVOVEFMX0ZJTEVTWVNURU0gXAorICAgIH0gfSBfTElCQ1BQX0VORF9OQU1FU1BBQ0VfRVhQRVJJTUVOVEFMCisKKyNkZWZpbmUgX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfRVhQRVJJTUVOVEFMX0NPUk9VVElORVMgXAorICBfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9FWFBFUklNRU5UQUwgaW5saW5lIG5hbWVzcGFjZSBjb3JvdXRpbmVzX3YxIHsKKworI2RlZmluZSBfTElCQ1BQX0VORF9OQU1FU1BBQ0VfRVhQRVJJTUVOVEFMX0NPUk9VVElORVMgXAorICB9IF9MSUJDUFBfRU5EX05BTUVTUEFDRV9FWFBFUklNRU5UQUwKKworI2RlZmluZSBfVlNURF9DT1JPIF9WU1REX0VYUEVSSU1FTlRBTDo6Y29yb3V0aW5lc192MQorCisjZGVmaW5lIF9WU1REX0ZTIDo6c3RkOjpleHBlcmltZW50YWw6OmZpbGVzeXN0ZW06OnYxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9fX21lbW9yeSBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvX19tZW1vcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5ZmVhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvX19tZW1vcnkKQEAgLTAsMCArMSw5MCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9FWFBFUklNRU5UQUxfX19NRU1PUlkKKyNkZWZpbmUgX0xJQkNQUF9FWFBFUklNRU5UQUxfX19NRU1PUlkKKworI2luY2x1ZGUgPGV4cGVyaW1lbnRhbC9fX2NvbmZpZz4KKyNpbmNsdWRlIDxleHBlcmltZW50YWwvdXRpbGl0eT4gLy8gZm9yIGVyYXNlZF90eXBlCisjaW5jbHVkZSA8X19mdW5jdGlvbmFsX2Jhc2U+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX0xGVFMKKwordGVtcGxhdGUgPAorICAgIGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jCisgICwgYm9vbCA9IHVzZXNfYWxsb2NhdG9yPF9UcCwgX0FsbG9jPjo6dmFsdWUKKyAgLCBib29sID0gX19oYXNfYWxsb2NhdG9yX3R5cGU8X1RwPjo6dmFsdWUKKyAgPgorc3RydWN0IF9fbGZ0c191c2VzX2FsbG9jYXRvciA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19sZnRzX3VzZXNfYWxsb2NhdG9yPF9UcCwgX0FsbG9jLCBmYWxzZSwgZmFsc2U+IDogcHVibGljIGZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYywgYm9vbCBIYXNBbGxvYz4KK3N0cnVjdCBfX2xmdHNfdXNlc19hbGxvY2F0b3I8X1RwLCBfQWxsb2MsIHRydWUsIEhhc0FsbG9jPiA6IHB1YmxpYyB0cnVlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX2xmdHNfdXNlc19hbGxvY2F0b3I8X1RwLCBfQWxsb2MsIGZhbHNlLCB0cnVlPgorICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sCisgICAgLCBpc19jb252ZXJ0aWJsZTxfQWxsb2MsIHR5cGVuYW1lIF9UcDo6YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZQorICAgICAgfHwgaXNfc2FtZTxlcmFzZWRfdHlwZSwgdHlwZW5hbWUgX1RwOjphbGxvY2F0b3JfdHlwZT46OnZhbHVlCisgICAgPgore307CisKK3RlbXBsYXRlIDxib29sIF9Vc2VzQWxsb2MsIGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyAuLi5fQXJncz4KK3N0cnVjdCBfX2xmdHNfdXNlc19hbGxvY19jdG9yX2ltcAoreworICAgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAwOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyAuLi5fQXJncz4KK3N0cnVjdCBfX2xmdHNfdXNlc19hbGxvY19jdG9yX2ltcDx0cnVlLCBfVHAsIF9BbGxvYywgX0FyZ3MuLi4+Cit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgX19pY19maXJzdAorICAgICAgICA9IGlzX2NvbnN0cnVjdGlibGU8X1RwLCBhbGxvY2F0b3JfYXJnX3QsIF9BbGxvYywgX0FyZ3MuLi4+Ojp2YWx1ZTsKKworICAgIHN0YXRpYyBjb25zdCBib29sIF9faWNfc2Vjb25kID0KKyAgICAgICAgY29uZGl0aW9uYWw8CisgICAgICAgICAgICBfX2ljX2ZpcnN0LAorICAgICAgICAgICAgZmFsc2VfdHlwZSwKKyAgICAgICAgICAgIGlzX2NvbnN0cnVjdGlibGU8X1RwLCBfQXJncy4uLiwgX0FsbG9jPgorICAgICAgICA+Ojp0eXBlOjp2YWx1ZTsKKworICAgIHN0YXRpY19hc3NlcnQoX19pY19maXJzdCB8fCBfX2ljX3NlY29uZCwKKyAgICAgICAgICAgICAgICAgICJSZXF1ZXN0IGZvciB1c2VzIGFsbG9jYXRvciBjb25zdHJ1Y3Rpb24gaXMgaWxsLWZvcm1lZCIpOworCisgICAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IF9faWNfZmlyc3QgPyAxIDogMjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYywgY2xhc3MgLi4uX0FyZ3M+CitzdHJ1Y3QgX19sZnRzX3VzZXNfYWxsb2NfY3RvcgorICA6IGludGVncmFsX2NvbnN0YW50PGludCwKKyAgICAgICAgX19sZnRzX3VzZXNfYWxsb2NfY3Rvcl9pbXA8CisgICAgICAgICAgICBfX2xmdHNfdXNlc19hbGxvY2F0b3I8X1RwLCBfQWxsb2M+Ojp2YWx1ZQorICAgICAgICAgICwgX1RwLCBfQWxsb2MsIF9BcmdzLi4uCisgICAgICAgID46OnZhbHVlCisgICAgPgore307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYywgY2xhc3MgLi4uX0FyZ3M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCBfX2xmdHNfdXNlcl9hbGxvY19jb25zdHJ1Y3QoCisgICAgX1RwICogX19zdG9yZSwgY29uc3QgX0FsbG9jICYgX19hLCBfQXJncyAmJi4uLiBfX2FyZ3MpCit7CisgICAgX1ZTVEQ6Ol9fdXNlcl9hbGxvY19jb25zdHJ1Y3RfaW1wbCgKKyAgICAgICAgdHlwZW5hbWUgX19sZnRzX3VzZXNfYWxsb2NfY3RvcjxfVHAsIF9BbGxvYywgX0FyZ3MuLi4+Ojp0eXBlKCkKKyAgICAgICAsIF9fc3RvcmUsIF9fYSwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4KKyAgICAgICApOworfQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfTEZUUworCisjZW5kaWYgLyogX0xJQkNQUF9FWFBFUklNRU5UQUxfX19NRU1PUlkgKi8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvYWxnb3JpdGhtIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9hbGdvcml0aG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzYmFkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvYWxnb3JpdGhtCkBAIC0wLDAgKzEsNjAgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFsZ29yaXRobSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfRVhQRVJJTUVOVEFMX0FMR09SSVRITQorI2RlZmluZSBfTElCQ1BQX0VYUEVSSU1FTlRBTF9BTEdPUklUSE0KKworLyoKKyAgIGV4cGVyaW1lbnRhbC9hbGdvcml0aG0gc3lub3BzaXMKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIHN0ZCB7CituYW1lc3BhY2UgZXhwZXJpbWVudGFsIHsKK2lubGluZSBuYW1lc3BhY2UgZnVuZGFtZW50YWxzX3YxIHsKKwordGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvciwgY2xhc3MgU2VhcmNoZXI+CitGb3J3YXJkSXRlcmF0b3Igc2VhcmNoKEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlYXJjaGVyICZzZWFyY2hlcik7CisKKy8vIHNhbXBsZSByZW1vdmVkIGJlY2F1c2UgaXQncyBub3cgcGFydCBvZiBDKysxNworCit9IC8vIG5hbWVzcGFjZSBmdW5kYW1lbnRhbHNfdjEKK30gLy8gbmFtZXNwYWNlIGV4cGVyaW1lbnRhbAorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyovCisKKyNpbmNsdWRlIDxleHBlcmltZW50YWwvX19jb25maWc+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSA8X19kZWJ1Zz4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfUFVTSF9NQUNST1MKKyNpbmNsdWRlIDxfX3VuZGVmX21hY3Jvcz4KKworCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9MRlRTCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfU2VhcmNoZXI+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfRm9yd2FyZEl0ZXJhdG9yIHNlYXJjaChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX2wsIGNvbnN0IF9TZWFyY2hlciAmX19zKQoreyByZXR1cm4gX19zKF9fZiwgX19sKS5maXJzdDsgfQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfTEZUUworCitfTElCQ1BQX1BPUF9NQUNST1MKKworI2VuZGlmIC8qIF9MSUJDUFBfRVhQRVJJTUVOVEFMX0FMR09SSVRITSAqLwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9hbnkgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL2FueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGNkZDBmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9hbnkKQEAgLTAsMCArMSwxMSBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFueSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNlcnJvciAiPGV4cGVyaW1lbnRhbC9hbnk+IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSA8YW55PiBpbnN0ZWFkLiIKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvY2hyb25vIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9jaHJvbm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxY2Y3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvY2hyb25vCkBAIC0wLDAgKzEsMTEgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjaHJvbm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2Vycm9yICI8ZXhwZXJpbWVudGFsL2Nocm9ubz4gaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIDxjaHJvbm8+IGluc3RlYWQuIgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9jb3JvdXRpbmUgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL2Nvcm91dGluZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTc5NWFkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9jb3JvdXRpbmUKQEAgLTAsMCArMSwyOTYgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvcm91dGluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9FWFBFUklNRU5UQUxfQ09ST1VUSU5FCisjZGVmaW5lIF9MSUJDUFBfRVhQRVJJTUVOVEFMX0NPUk9VVElORQorCisvKioKKyAgICBleHBlcmltZW50YWwvY29yb3V0aW5lIHN5bm9wc2lzCisKKy8vIEMrK25leHQKKworbmFtZXNwYWNlIHN0ZCB7CituYW1lc3BhY2UgZXhwZXJpbWVudGFsIHsKK2lubGluZSBuYW1lc3BhY2UgY29yb3V0aW5lc192MSB7CisKKyAgLy8gMTguMTEuMSBjb3JvdXRpbmUgdHJhaXRzCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUuLi4gQXJnVHlwZXM+CitjbGFzcyBjb3JvdXRpbmVfdHJhaXRzOworLy8gMTguMTEuMiBjb3JvdXRpbmUgaGFuZGxlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvbWlzZSA9IHZvaWQ+CitjbGFzcyBjb3JvdXRpbmVfaGFuZGxlOworLy8gMTguMTEuMi43IGNvbXBhcmlzb24gb3BlcmF0b3JzOgorYm9vbCBvcGVyYXRvcj09KGNvcm91dGluZV9oYW5kbGU8PiB4LCBjb3JvdXRpbmVfaGFuZGxlPD4geSkgX05PRVhDRVBUOworYm9vbCBvcGVyYXRvciE9KGNvcm91dGluZV9oYW5kbGU8PiB4LCBjb3JvdXRpbmVfaGFuZGxlPD4geSkgX05PRVhDRVBUOworYm9vbCBvcGVyYXRvcjwoY29yb3V0aW5lX2hhbmRsZTw+IHgsIGNvcm91dGluZV9oYW5kbGU8PiB5KSBfTk9FWENFUFQ7Citib29sIG9wZXJhdG9yPD0oY29yb3V0aW5lX2hhbmRsZTw+IHgsIGNvcm91dGluZV9oYW5kbGU8PiB5KSBfTk9FWENFUFQ7Citib29sIG9wZXJhdG9yPj0oY29yb3V0aW5lX2hhbmRsZTw+IHgsIGNvcm91dGluZV9oYW5kbGU8PiB5KSBfTk9FWENFUFQ7Citib29sIG9wZXJhdG9yPihjb3JvdXRpbmVfaGFuZGxlPD4geCwgY29yb3V0aW5lX2hhbmRsZTw+IHkpIF9OT0VYQ0VQVDsKKy8vIDE4LjExLjMgdHJpdmlhbCBhd2FpdGFibGVzCitzdHJ1Y3Qgc3VzcGVuZF9uZXZlcjsKK3N0cnVjdCBzdXNwZW5kX2Fsd2F5czsKKy8vIDE4LjExLjIuOCBoYXNoIHN1cHBvcnQ6Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGhhc2g7Cit0ZW1wbGF0ZSA8Y2xhc3MgUD4gc3RydWN0IGhhc2g8Y29yb3V0aW5lX2hhbmRsZTxQPj47CisKK30gLy8gbmFtZXNwYWNlIGNvcm91dGluZXNfdjEKK30gLy8gbmFtZXNwYWNlIGV4cGVyaW1lbnRhbAorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyAqLworCisjaW5jbHVkZSA8ZXhwZXJpbWVudGFsL19fY29uZmlnPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4gLy8gZm9yIGhhc2g8VCo+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPF9fZGVidWc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCisjaWZkZWYgX0xJQkNQUF9IQVNfTk9fQ09ST1VUSU5FUworIyBpZiBkZWZpbmVkKF9MSUJDUFBfV0FSTklORykKKyAgICBfTElCQ1BQX1dBUk5JTkcoIjxleHBlcmltZW50YWwvY29yb3V0aW5lPiBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoaXMgY29tcGlsZXIiKQorIyBlbHNlCisjICAgd2FybmluZyA8ZXhwZXJpbWVudGFsL2Nvcm91dGluZT4gY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIGNvbXBpbGVyCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19DT1JPVVRJTkVTCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX0VYUEVSSU1FTlRBTF9DT1JPVVRJTkVTCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzID0gdm9pZD4KK3N0cnVjdCBfX2Nvcm91dGluZV90cmFpdHNfc2ZpbmFlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fY29yb3V0aW5lX3RyYWl0c19zZmluYWU8CisgICAgX1RwLCB0eXBlbmFtZSBfX3ZvaWRfdDx0eXBlbmFtZSBfVHA6OnByb21pc2VfdHlwZT46OnR5cGU+Cit7CisgIHVzaW5nIHByb21pc2VfdHlwZSA9IHR5cGVuYW1lIF9UcDo6cHJvbWlzZV90eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lLi4uIF9BcmdzPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGNvcm91dGluZV90cmFpdHMKKyAgICA6IHB1YmxpYyBfX2Nvcm91dGluZV90cmFpdHNfc2ZpbmFlPF9SZXQ+Cit7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1Byb21pc2UgPSB2b2lkPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgY29yb3V0aW5lX2hhbmRsZTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGNvcm91dGluZV9oYW5kbGU8dm9pZD4geworcHVibGljOgorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvcm91dGluZV9oYW5kbGUoKSBfTk9FWENFUFQgOiBfX2hhbmRsZV8obnVsbHB0cikge30KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvcm91dGluZV9oYW5kbGUobnVsbHB0cl90KSBfTk9FWENFUFQgOiBfX2hhbmRsZV8obnVsbHB0cikge30KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGNvcm91dGluZV9oYW5kbGUmIG9wZXJhdG9yPShudWxscHRyX3QpIF9OT0VYQ0VQVCB7CisgICAgICAgIF9faGFuZGxlXyA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBfTElCQ1BQX0NPTlNURVhQUiB2b2lkKiBhZGRyZXNzKCkgY29uc3QgX05PRVhDRVBUIHsgcmV0dXJuIF9faGFuZGxlXzsgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgX0xJQkNQUF9DT05TVEVYUFIgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IF9OT0VYQ0VQVCB7IHJldHVybiBfX2hhbmRsZV87IH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIHZvaWQgb3BlcmF0b3IoKSgpIHsgcmVzdW1lKCk7IH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIHZvaWQgcmVzdW1lKCkgeworICAgICAgX0xJQkNQUF9BU1NFUlQoX19pc19zdXNwZW5kZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICJyZXN1bWUoKSBjYW4gb25seSBiZSBjYWxsZWQgb24gc3VzcGVuZGVkIGNvcm91dGluZXMiKTsKKyAgICAgIF9MSUJDUFBfQVNTRVJUKCFkb25lKCksCisgICAgICAgICAgICAgICAgInJlc3VtZSgpIGhhcyB1bmRlZmluZWQgYmVoYXZpb3Igd2hlbiB0aGUgY29yb3V0aW5lIGlzIGRvbmUiKTsKKyAgICAgIF9fYnVpbHRpbl9jb3JvX3Jlc3VtZShfX2hhbmRsZV8pOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgIF9MSUJDUFBfQVNTRVJUKF9faXNfc3VzcGVuZGVkKCksCisgICAgICAgICAgICAgICAgICAgICAiZGVzdHJveSgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBzdXNwZW5kZWQgY29yb3V0aW5lcyIpOworICAgICAgX19idWlsdGluX2Nvcm9fZGVzdHJveShfX2hhbmRsZV8pOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGJvb2wgZG9uZSgpIGNvbnN0IHsKKyAgICAgIF9MSUJDUFBfQVNTRVJUKF9faXNfc3VzcGVuZGVkKCksCisgICAgICAgICAgICAgICAgICAgICAiZG9uZSgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBzdXNwZW5kZWQgY29yb3V0aW5lcyIpOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9jb3JvX2RvbmUoX19oYW5kbGVfKTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBzdGF0aWMgY29yb3V0aW5lX2hhbmRsZSBmcm9tX2FkZHJlc3Modm9pZCogX19hZGRyKSBfTk9FWENFUFQgeworICAgICAgICBjb3JvdXRpbmVfaGFuZGxlIF9fdG1wOworICAgICAgICBfX3RtcC5fX2hhbmRsZV8gPSBfX2FkZHI7CisgICAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogU2hvdWxkIGZyb21fYWRkcmVzcyhudWxscHRyKSBiZSBhbGxvd2VkPworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIHN0YXRpYyBjb3JvdXRpbmVfaGFuZGxlIGZyb21fYWRkcmVzcyhudWxscHRyX3QpIF9OT0VYQ0VQVCB7CisgICAgICByZXR1cm4gY29yb3V0aW5lX2hhbmRsZShudWxscHRyKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBib29sIF9DYWxsSXNWYWxpZCA9IGZhbHNlPgorICAgIHN0YXRpYyBjb3JvdXRpbmVfaGFuZGxlIGZyb21fYWRkcmVzcyhfVHAqKSB7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9DYWxsSXNWYWxpZCwKKyAgICAgICAiY29yb3V0aW5lX2hhbmRsZTx2b2lkPjo6ZnJvbV9hZGRyZXNzIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCAiCisgICAgICAgICJub24tdm9pZCBwb2ludGVycyIpOworICAgIH0KKworcHJpdmF0ZToKKyAgYm9vbCBfX2lzX3N1c3BlbmRlZCgpIGNvbnN0IF9OT0VYQ0VQVCAgeworICAgIC8vIEZJWE1FIGFjdHVhbGx5IGltcGxlbWVudCBhIGNoZWNrIGZvciBpZiB0aGUgY29ybyBpcyBzdXNwZW5kZWQuCisgICAgcmV0dXJuIF9faGFuZGxlXzsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfUHJvbWlzZVQ+IGZyaWVuZCBjbGFzcyBjb3JvdXRpbmVfaGFuZGxlOworICB2b2lkKiBfX2hhbmRsZV87Cit9OworCisvLyAxOC4xMS4yLjcgY29tcGFyaXNvbiBvcGVyYXRvcnM6CitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCitib29sIG9wZXJhdG9yPT0oY29yb3V0aW5lX2hhbmRsZTw+IF9feCwgY29yb3V0aW5lX2hhbmRsZTw+IF9feSkgX05PRVhDRVBUIHsKKyAgICByZXR1cm4gX194LmFkZHJlc3MoKSA9PSBfX3kuYWRkcmVzcygpOworfQoraW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORQorYm9vbCBvcGVyYXRvciE9KGNvcm91dGluZV9oYW5kbGU8PiBfX3gsIGNvcm91dGluZV9oYW5kbGU8PiBfX3kpIF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuICEoX194ID09IF9feSk7Cit9CitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCitib29sIG9wZXJhdG9yPChjb3JvdXRpbmVfaGFuZGxlPD4gX194LCBjb3JvdXRpbmVfaGFuZGxlPD4gX195KSBfTk9FWENFUFQgeworICAgIHJldHVybiBsZXNzPHZvaWQqPigpKF9feC5hZGRyZXNzKCksIF9feS5hZGRyZXNzKCkpOworfQoraW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORQorYm9vbCBvcGVyYXRvcj4oY29yb3V0aW5lX2hhbmRsZTw+IF9feCwgY29yb3V0aW5lX2hhbmRsZTw+IF9feSkgX05PRVhDRVBUIHsKKyAgICByZXR1cm4gX195IDwgX194OworfQoraW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORQorYm9vbCBvcGVyYXRvcjw9KGNvcm91dGluZV9oYW5kbGU8PiBfX3gsIGNvcm91dGluZV9oYW5kbGU8PiBfX3kpIF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuICEoX194ID4gX195KTsKK30KK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUKK2Jvb2wgb3BlcmF0b3I+PShjb3JvdXRpbmVfaGFuZGxlPD4gX194LCBjb3JvdXRpbmVfaGFuZGxlPD4gX195KSBfTk9FWENFUFQgeworICAgIHJldHVybiAhKF9feCA8IF9feSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfUHJvbWlzZT4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGNvcm91dGluZV9oYW5kbGUgOiBwdWJsaWMgY29yb3V0aW5lX2hhbmRsZTw+IHsKKyAgICB1c2luZyBfQmFzZSA9IGNvcm91dGluZV9oYW5kbGU8PjsKK3B1YmxpYzoKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgLy8gMTguMTEuMi4xIGNvbnN0cnVjdC9yZXNldAorICAgIHVzaW5nIGNvcm91dGluZV9oYW5kbGU8Pjo6Y29yb3V0aW5lX2hhbmRsZTsKKyNlbHNlCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGNvcm91dGluZV9oYW5kbGUoKSBfTk9FWENFUFQgOiBfQmFzZSgpIHt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGNvcm91dGluZV9oYW5kbGUobnVsbHB0cl90KSBfTk9FWENFUFQgOiBfQmFzZShudWxscHRyKSB7fQorI2VuZGlmCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvcm91dGluZV9oYW5kbGUmIG9wZXJhdG9yPShudWxscHRyX3QpIF9OT0VYQ0VQVCB7CisgICAgICAgIF9CYXNlOjpvcGVyYXRvcj0obnVsbHB0cik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1Byb21pc2UmIHByb21pc2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxfUHJvbWlzZSo+KAorICAgICAgICAgICAgX19idWlsdGluX2Nvcm9fcHJvbWlzZSh0aGlzLT5fX2hhbmRsZV8sIF9fYWxpZ25vZihfUHJvbWlzZSksIGZhbHNlKSk7CisgICAgfQorCitwdWJsaWM6CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgc3RhdGljIGNvcm91dGluZV9oYW5kbGUgZnJvbV9hZGRyZXNzKHZvaWQqIF9fYWRkcikgX05PRVhDRVBUIHsKKyAgICAgICAgY29yb3V0aW5lX2hhbmRsZSBfX3RtcDsKKyAgICAgICAgX190bXAuX19oYW5kbGVfID0gX19hZGRyOworICAgICAgICByZXR1cm4gX190bXA7CisgICAgfQorCisgICAgLy8gTk9URTogdGhpcyBvdmVybG9hZCBpc24ndCByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQgYnV0IGlzIG5lZWRlZCBzbworICAgIC8vIHRoZSBkZWxldGVkIF9Qcm9taXNlKiBvdmVybG9hZCBkb2Vzbid0IG1ha2UgZnJvbV9hZGRyZXNzKG51bGxwdHIpCisgICAgLy8gYW1iaWd1b3VzLgorICAgIC8vIEZJWE1FOiBzaG91bGQgZnJvbV9hZGRyZXNzIHdvcmsgd2l0aCBudWxscHRyPworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIHN0YXRpYyBjb3JvdXRpbmVfaGFuZGxlIGZyb21fYWRkcmVzcyhudWxscHRyX3QpIF9OT0VYQ0VQVCB7CisgICAgICByZXR1cm4gY29yb3V0aW5lX2hhbmRsZShudWxscHRyKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBib29sIF9DYWxsSXNWYWxpZCA9IGZhbHNlPgorICAgIHN0YXRpYyBjb3JvdXRpbmVfaGFuZGxlIGZyb21fYWRkcmVzcyhfVHAqKSB7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9DYWxsSXNWYWxpZCwKKyAgICAgICAiY29yb3V0aW5lX2hhbmRsZTxwcm9taXNlX3R5cGU+Ojpmcm9tX2FkZHJlc3MgY2Fubm90IGJlIGNhbGxlZCB3aXRoICIKKyAgICAgICAgIm5vbi12b2lkIHBvaW50ZXJzIik7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGJvb2wgX0NhbGxJc1ZhbGlkID0gZmFsc2U+CisgICAgc3RhdGljIGNvcm91dGluZV9oYW5kbGUgZnJvbV9hZGRyZXNzKF9Qcm9taXNlKikgeworICAgICAgc3RhdGljX2Fzc2VydChfQ2FsbElzVmFsaWQsCisgICAgICAgImNvcm91dGluZV9oYW5kbGU8cHJvbWlzZV90eXBlPjo6ZnJvbV9hZGRyZXNzIGNhbm5vdCBiZSB1c2VkIHdpdGggIgorICAgICAgICAicG9pbnRlcnMgdG8gdGhlIGNvcm91dGluZSdzIHByb21pc2UgdHlwZTsgdXNlICdmcm9tX3Byb21pc2UnIGluc3RlYWQiKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBzdGF0aWMgY29yb3V0aW5lX2hhbmRsZSBmcm9tX3Byb21pc2UoX1Byb21pc2UmIF9fcHJvbWlzZSkgX05PRVhDRVBUIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY3Y8X1Byb21pc2U+Ojp0eXBlIF9SYXdQcm9taXNlOworICAgICAgICBjb3JvdXRpbmVfaGFuZGxlIF9fdG1wOworICAgICAgICBfX3RtcC5fX2hhbmRsZV8gPSBfX2J1aWx0aW5fY29yb19wcm9taXNlKAorICAgICAgICAgICAgX1ZTVEQ6OmFkZHJlc3NvZihjb25zdF9jYXN0PF9SYXdQcm9taXNlJj4oX19wcm9taXNlKSksCisgICAgICAgICAgICAgX19hbGlnbm9mKF9Qcm9taXNlKSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9Cit9OworCitzdHJ1Y3QgX0xJQkNQUF9UWVBFX1ZJUyBzdXNwZW5kX25ldmVyIHsKKyAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgIGJvb2wgYXdhaXRfcmVhZHkoKSBjb25zdCBfTk9FWENFUFQgeyByZXR1cm4gdHJ1ZTsgfQorICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgdm9pZCBhd2FpdF9zdXNwZW5kKGNvcm91dGluZV9oYW5kbGU8PikgY29uc3QgX05PRVhDRVBUIHt9CisgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICB2b2lkIGF3YWl0X3Jlc3VtZSgpIGNvbnN0IF9OT0VYQ0VQVCB7fQorfTsKKworc3RydWN0IF9MSUJDUFBfVFlQRV9WSVMgc3VzcGVuZF9hbHdheXMgeworICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgYm9vbCBhd2FpdF9yZWFkeSgpIGNvbnN0IF9OT0VYQ0VQVCB7IHJldHVybiBmYWxzZTsgfQorICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgdm9pZCBhd2FpdF9zdXNwZW5kKGNvcm91dGluZV9oYW5kbGU8PikgY29uc3QgX05PRVhDRVBUIHt9CisgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICB2b2lkIGF3YWl0X3Jlc3VtZSgpIGNvbnN0IF9OT0VYQ0VQVCB7fQorfTsKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX0VYUEVSSU1FTlRBTF9DT1JPVVRJTkVTCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGhhc2g8X1ZTVERfQ09STzo6Y29yb3V0aW5lX2hhbmRsZTxfVHA+ID4geworICAgIHVzaW5nIF9fYXJnX3R5cGUgPSBfVlNURF9DT1JPOjpjb3JvdXRpbmVfaGFuZGxlPF9UcD47CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBvcGVyYXRvcigpKF9fYXJnX3R5cGUgY29uc3QmIF9fdikgY29uc3QgX05PRVhDRVBUCisgICAge3JldHVybiBoYXNoPHZvaWQqPigpKF9fdi5hZGRyZXNzKCkpO30KK307CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmIC8vICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX0NPUk9VVElORVMpCisKKyNlbmRpZiAvKiBfTElCQ1BQX0VYUEVSSU1FTlRBTF9DT1JPVVRJTkUgKi8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvZGVxdWUgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL2RlcXVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NDk1NzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL2RlcXVlCkBAIC0wLDAgKzEsNDcgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZXF1ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfRVhQRVJJTUVOVEFMX0RFUVVFCisjZGVmaW5lIF9MSUJDUFBfRVhQRVJJTUVOVEFMX0RFUVVFCisvKgorICAgIGV4cGVyaW1lbnRhbC9kZXF1ZSBzeW5vcHNpcworCisvLyBDKysxegorbmFtZXNwYWNlIHN0ZCB7CituYW1lc3BhY2UgZXhwZXJpbWVudGFsIHsKK2lubGluZSBuYW1lc3BhY2UgZnVuZGFtZW50YWxzX3YxIHsKK25hbWVzcGFjZSBwbXIgeworCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICB1c2luZyBkZXF1ZSA9IHN0ZDo6ZGVxdWU8VCxwb2x5bW9ycGhpY19hbGxvY2F0b3I8VD4+OworCit9IC8vIG5hbWVzcGFjZSBwbXIKK30gLy8gbmFtZXNwYWNlIGZ1bmRhbWVudGFsc192MQorfSAvLyBuYW1lc3BhY2UgZXhwZXJpbWVudGFsCit9IC8vIG5hbWVzcGFjZSBzdGQKKworICovCisKKyNpbmNsdWRlIDxleHBlcmltZW50YWwvX19jb25maWc+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8ZXhwZXJpbWVudGFsL21lbW9yeV9yZXNvdXJjZT4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX0xGVFNfUE1SCisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWVUPgordXNpbmcgZGVxdWUgPSBfVlNURDo6ZGVxdWU8X1ZhbHVlVCwgcG9seW1vcnBoaWNfYWxsb2NhdG9yPF9WYWx1ZVQ+PjsKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX0xGVFNfUE1SCisKKyNlbmRpZiAvKiBfTElCQ1BQX0VYUEVSSU1FTlRBTF9ERVFVRSAqLwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9keW5hcnJheSBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvZHluYXJyYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ViZmMyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvZHluYXJyYXkKQEAgLTAsMCArMSwzMDUgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGR5bmFycmF5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfRFlOQVJSQVkKKyNkZWZpbmUgX0xJQkNQUF9EWU5BUlJBWQorCisvKgorICAgIGR5bmFycmF5IHN5bm9wc2lzCisKK25hbWVzcGFjZSBzdGQgeyBuYW1lc3BhY2UgZXhwZXJpbWVudGFsIHsKKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorY2xhc3MgZHluYXJyYXkKK3sKKyAgICAvLyB0eXBlczoKKyAgICB0eXBlZGVmICAgICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmICAgICAgIFQmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgVCYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiAgICAgICBUKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiBjb25zdCBUKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiAgICAgICBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkICAgICAgICAgIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgICAgICAgaW1wbGVtZW50YXRpb24tZGVmaW5lZCAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisKK3B1YmxpYzoKKyAgICAvLyBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgIGV4cGxpY2l0IGR5bmFycmF5KHNpemVfdHlwZSBjKTsKKyAgICBkeW5hcnJheShzaXplX3R5cGUgYywgY29uc3QgVCYgdik7CisgICAgZHluYXJyYXkoY29uc3QgZHluYXJyYXkmIGQpOworICAgIGR5bmFycmF5KGluaXRpYWxpemVyX2xpc3Q8VD4pOworCisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jPgorICAgICAgZHluYXJyYXkoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBBbGxvYyYgYSwgc2l6ZV90eXBlIGMsIGNvbnN0IEFsbG9jJiBhbGxvYyk7CisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jPgorICAgICAgZHluYXJyYXkoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBBbGxvYyYgYSwgc2l6ZV90eXBlIGMsIGNvbnN0IFQmIHYsIGNvbnN0IEFsbG9jJiBhbGxvYyk7CisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jPgorICAgICAgZHluYXJyYXkoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBBbGxvYyYgYSwgY29uc3QgZHluYXJyYXkmIGQsIGNvbnN0IEFsbG9jJiBhbGxvYyk7CisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jPgorICAgICAgZHluYXJyYXkoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBBbGxvYyYgYSwgaW5pdGlhbGl6ZXJfbGlzdDxUPiwgY29uc3QgQWxsb2MmIGFsbG9jKTsKKyAgICBkeW5hcnJheSYgb3BlcmF0b3I9KGNvbnN0IGR5bmFycmF5JikgPSBkZWxldGU7CisgICAgfmR5bmFycmF5KCk7CisKKyAgICAvLyBpdGVyYXRvcnM6CisgICAgaXRlcmF0b3IgICAgICAgYmVnaW4oKSAgICAgICAgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSAgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgaXRlcmF0b3IgICAgICAgZW5kKCkgICAgICAgICAgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICAgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgY2VuZCgpICAgY29uc3Qgbm9leGNlcHQ7CisKKyAgICByZXZlcnNlX2l0ZXJhdG9yICAgICAgIHJiZWdpbigpICAgICAgICBub2V4Y2VwdDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpICBjb25zdCBub2V4Y2VwdDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdDsKKyAgICByZXZlcnNlX2l0ZXJhdG9yICAgICAgIHJlbmQoKSAgICAgICAgICBub2V4Y2VwdDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSAgICBjb25zdCBub2V4Y2VwdDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyZW5kKCkgICBjb25zdCBub2V4Y2VwdDsKKworICAgIC8vIGNhcGFjaXR5OgorICAgIHNpemVfdHlwZSBzaXplKCkgICAgIGNvbnN0IG5vZXhjZXB0OworICAgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IG5vZXhjZXB0OworICAgIGJvb2wgICAgICBlbXB0eSgpICAgIGNvbnN0IG5vZXhjZXB0OworCisgICAgLy8gZWxlbWVudCBhY2Nlc3M6CisgICAgcmVmZXJlbmNlICAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIG4pOworICAgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBuKSBjb25zdDsKKworICAgIHJlZmVyZW5jZSAgICAgICBmcm9udCgpOworICAgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0OworICAgIHJlZmVyZW5jZSAgICAgICBiYWNrKCk7CisgICAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSAgY29uc3Q7CisKKyAgICBjb25zdF9yZWZlcmVuY2UgYXQoc2l6ZV90eXBlIG4pIGNvbnN0OworICAgIHJlZmVyZW5jZSAgICAgICBhdChzaXplX3R5cGUgbik7CisKKyAgICAvLyBkYXRhIGFjY2VzczoKKyAgICBUKiAgICAgICBkYXRhKCkgICAgICAgbm9leGNlcHQ7CisgICAgY29uc3QgVCogZGF0YSgpIGNvbnN0IG5vZXhjZXB0OworCisgICAgLy8gbXV0YXRpbmcgbWVtYmVyIGZ1bmN0aW9uczoKKyAgICB2b2lkIGZpbGwoY29uc3QgVCYgdik7Cit9OworCit9fSAgLy8gc3RkOjpleHBlcmltZW50YWwKKworKi8KKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorCisjaW5jbHVkZSA8X19mdW5jdGlvbmFsX2Jhc2U+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfUFVTSF9NQUNST1MKKyNpbmNsdWRlIDxfX3VuZGVmX21hY3Jvcz4KKworbmFtZXNwYWNlIHN0ZCB7IG5hbWVzcGFjZSBleHBlcmltZW50YWwgeyBpbmxpbmUgbmFtZXNwYWNlIF9fYXJyYXlfZXh0ZW5zaW9uc192MSB7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgX0xJQkNQUF9BVkFJTEFCSUxJVFlfRFlOQVJSQVkgZHluYXJyYXkKK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlczoKKyAgICB0eXBlZGVmIGR5bmFycmF5IF9fc2VsZjsKKyAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqICAgICAgICAgICAgICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKK3ByaXZhdGU6CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgX19zaXplXzsKKyAgICB2YWx1ZV90eXBlICogICAgICAgICAgICBfX2Jhc2VfOworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBkeW5hcnJheSAoKSBub2V4Y2VwdCA6ICBfX3NpemVfKDApLCBfX2Jhc2VfKG51bGxwdHIpIHt9CisgICAgCisgICAgc3RhdGljIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmFsdWVfdHlwZSogX19hbGxvY2F0ZShzaXplX3QgX19jb3VudCkgeworICAgICAgICBpZiAobnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkgLyBzaXplb2YgKHZhbHVlX3R5cGUpIDw9IF9fY291bnQpCisgICAgICAgICAgICBfX3Rocm93X2JhZF9hcnJheV9sZW5ndGgoKTsKKworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dmFsdWVfdHlwZSAqPigKKyAgICAgICAgICAgIF9WU1REOjpfX2xpYmNwcF9hbGxvY2F0ZShzaXplb2YodmFsdWVfdHlwZSkgKiBfX2NvdW50LCBfX2FsaWdub2YodmFsdWVfdHlwZSkpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fZGVhbGxvY2F0ZV92YWx1ZSh2YWx1ZV90eXBlKiBfX3B0ciApIG5vZXhjZXB0IHsKKyAgICAgICAgX1ZTVEQ6Ol9fbGliY3BwX2RlYWxsb2NhdGUoc3RhdGljX2Nhc3Q8dm9pZCAqPihfX3B0ciksIF9fYWxpZ25vZih2YWx1ZV90eXBlKSk7CisgICAgfQorCitwdWJsaWM6CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgZHluYXJyYXkoc2l6ZV90eXBlIF9fYyk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGR5bmFycmF5KHNpemVfdHlwZSBfX2MsIGNvbnN0IHZhbHVlX3R5cGUmIF9fdik7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGR5bmFycmF5KGNvbnN0IGR5bmFycmF5JiBfX2QpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBkeW5hcnJheShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+KTsKKworLy8gIFdlJ3JlIG5vdCBpbXBsZW1lbnRpbmcgdGhlc2UgcmlnaHQgbm93LgorLy8gIFVwZGF0ZWQgd2l0aCB0aGUgcmVzb2x1dGlvbiBvZiBMV0cgaXNzdWUgIzIyNTUKKy8vICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0FsbG9jPgorLy8gICAgICAgZHluYXJyYXkoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2MmIF9fYWxsb2MsIHNpemVfdHlwZSBfX2MpOworLy8gICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfQWxsb2M+CisvLyAgICAgICBkeW5hcnJheShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYgX19hbGxvYywgc2l6ZV90eXBlIF9fYywgY29uc3QgdmFsdWVfdHlwZSYgX192KTsKKy8vICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0FsbG9jPgorLy8gICAgICAgZHluYXJyYXkoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2MmIF9fYWxsb2MsIGNvbnN0IGR5bmFycmF5JiBfX2QpOworLy8gICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfQWxsb2M+CisvLyAgICAgICBkeW5hcnJheShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYgX19hbGxvYywgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPik7CisKKyAgICBkeW5hcnJheSYgb3BlcmF0b3I9KGNvbnN0IGR5bmFycmF5JikgPSBkZWxldGU7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIH5keW5hcnJheSgpOworCisgICAgLy8gaXRlcmF0b3JzOgorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGl0ZXJhdG9yICAgICAgIGJlZ2luKCkgICAgICAgIG5vZXhjZXB0IHsgcmV0dXJuIGl0ZXJhdG9yKGRhdGEoKSk7IH0KKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9pdGVyYXRvciBiZWdpbigpICBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihkYXRhKCkpOyB9CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoZGF0YSgpKTsgfQorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGl0ZXJhdG9yICAgICAgIGVuZCgpICAgICAgICAgIG5vZXhjZXB0IHsgcmV0dXJuIGl0ZXJhdG9yKGRhdGEoKSArIF9fc2l6ZV8pOyB9CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfaXRlcmF0b3IgZW5kKCkgICAgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoZGF0YSgpICsgX19zaXplXyk7IH0KKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9pdGVyYXRvciBjZW5kKCkgICBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihkYXRhKCkgKyBfX3NpemVfKTsgfQorCisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmV2ZXJzZV9pdGVyYXRvciAgICAgICByYmVnaW4oKSAgICAgICAgbm9leGNlcHQgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpICBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmV2ZXJzZV9pdGVyYXRvciAgICAgICByZW5kKCkgICAgICAgICAgbm9leGNlcHQgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyZW5kKCkgICBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAvLyBjYXBhY2l0eToKKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzaXplX3R5cGUgc2l6ZSgpICAgICBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBfX3NpemVfOyB9CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gX19zaXplXzsgfQorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJvb2wgICAgICBlbXB0eSgpICAgIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuIF9fc2l6ZV8gPT0gMDsgfQorCisgICAgLy8gZWxlbWVudCBhY2Nlc3M6CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmVmZXJlbmNlICAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgICAgICAgeyByZXR1cm4gZGF0YSgpW19fbl07IH0KKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBkYXRhKClbX19uXTsgfQorCisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmVmZXJlbmNlICAgICAgIGZyb250KCkgICAgICAgeyByZXR1cm4gZGF0YSgpWzBdOyB9CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4gZGF0YSgpWzBdOyB9CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmVmZXJlbmNlICAgICAgIGJhY2soKSAgICAgICAgeyByZXR1cm4gZGF0YSgpW19fc2l6ZV8tMV07IH0KKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9yZWZlcmVuY2UgYmFjaygpICBjb25zdCB7IHJldHVybiBkYXRhKClbX19zaXplXy0xXTsgfQorCisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0OworICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHJlZmVyZW5jZSAgICAgICBhdChzaXplX3R5cGUgX19uKTsKKworICAgIC8vIGRhdGEgYWNjZXNzOgorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9UcCogICAgICAgZGF0YSgpICAgICAgIG5vZXhjZXB0IHsgcmV0dXJuIF9fYmFzZV87IH0KKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdCBfVHAqIGRhdGEoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBfX2Jhc2VfOyB9CisKKyAgICAvLyBtdXRhdGluZyBtZW1iZXIgZnVuY3Rpb25zOgorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgZmlsbChjb25zdCB2YWx1ZV90eXBlJiBfX3YpIHsgZmlsbF9uKGJlZ2luKCksIF9fc2l6ZV8sIF9fdik7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK2R5bmFycmF5PF9UcD46OmR5bmFycmF5KHNpemVfdHlwZSBfX2MpIDogZHluYXJyYXkgKCkKK3sKKyAgICBfX2Jhc2VfID0gX19hbGxvY2F0ZSAoX19jKTsKKyAgICB2YWx1ZV90eXBlICpfX2RhdGEgPSBkYXRhICgpOworICAgIGZvciAoIF9fc2l6ZV8gPSAwOyBfX3NpemVfIDwgX19jOyArK19fc2l6ZV8sICsrX19kYXRhICkKKyAgICAgICAgOjpuZXcgKF9fZGF0YSkgdmFsdWVfdHlwZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZQorZHluYXJyYXk8X1RwPjo6ZHluYXJyYXkoc2l6ZV90eXBlIF9fYywgY29uc3QgdmFsdWVfdHlwZSYgX192KSA6IGR5bmFycmF5ICgpCit7CisgICAgX19iYXNlXyA9IF9fYWxsb2NhdGUgKF9fYyk7CisgICAgdmFsdWVfdHlwZSAqX19kYXRhID0gZGF0YSAoKTsKKyAgICBmb3IgKCBfX3NpemVfID0gMDsgX19zaXplXyA8IF9fYzsgKytfX3NpemVfLCArK19fZGF0YSApCisgICAgICAgIDo6bmV3IChfX2RhdGEpIHZhbHVlX3R5cGUgKF9fdik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK2R5bmFycmF5PF9UcD46OmR5bmFycmF5KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkgOiBkeW5hcnJheSAoKQoreworICAgIHNpemVfdCBzeiA9IF9faWwuc2l6ZSgpOworICAgIF9fYmFzZV8gPSBfX2FsbG9jYXRlIChzeik7CisgICAgdmFsdWVfdHlwZSAqX19kYXRhID0gZGF0YSAoKTsKKyAgICBhdXRvIHNyYyA9IF9faWwuYmVnaW4oKTsKKyAgICBmb3IgKCBfX3NpemVfID0gMDsgX19zaXplXyA8IHN6OyArK19fc2l6ZV8sICsrX19kYXRhLCArK3NyYyApCisgICAgICAgIDo6bmV3IChfX2RhdGEpIHZhbHVlX3R5cGUgKCpzcmMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCitkeW5hcnJheTxfVHA+OjpkeW5hcnJheShjb25zdCBkeW5hcnJheSYgX19kKSA6IGR5bmFycmF5ICgpCit7CisgICAgc2l6ZV90IHN6ID0gX19kLnNpemUoKTsKKyAgICBfX2Jhc2VfID0gX19hbGxvY2F0ZSAoc3opOworICAgIHZhbHVlX3R5cGUgKl9fZGF0YSA9IGRhdGEgKCk7CisgICAgYXV0byBzcmMgPSBfX2QuYmVnaW4oKTsKKyAgICBmb3IgKCBfX3NpemVfID0gMDsgX19zaXplXyA8IHN6OyArK19fc2l6ZV8sICsrX19kYXRhLCArK3NyYyApCisgICAgICAgIDo6bmV3IChfX2RhdGEpIHZhbHVlX3R5cGUgKCpzcmMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCitkeW5hcnJheTxfVHA+Ojp+ZHluYXJyYXkoKQoreyAKKyAgICB2YWx1ZV90eXBlICpfX2RhdGEgPSBkYXRhICgpICsgX19zaXplXzsKKyAgICBmb3IgKCBzaXplX3QgaSA9IDA7IGkgPCBfX3NpemVfOyArK2kgKQorICAgICAgICAoLS1fX2RhdGEpLT52YWx1ZV90eXBlOjp+dmFsdWVfdHlwZSgpOworICAgIF9fZGVhbGxvY2F0ZV92YWx1ZSggX19iYXNlXyApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGR5bmFycmF5PF9UcD46OnJlZmVyZW5jZQorZHluYXJyYXk8X1RwPjo6YXQoc2l6ZV90eXBlIF9fbikKK3sKKyAgICBpZiAoX19uID49IF9fc2l6ZV8pCisgICAgICAgIF9fdGhyb3dfb3V0X29mX3JhbmdlKCJkeW5hcnJheTo6YXQiKTsKKworICAgIHJldHVybiBkYXRhKClbX19uXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBkeW5hcnJheTxfVHA+Ojpjb25zdF9yZWZlcmVuY2UKK2R5bmFycmF5PF9UcD46OmF0KHNpemVfdHlwZSBfX24pIGNvbnN0Cit7CisgICAgaWYgKF9fbiA+PSBfX3NpemVfKQorICAgICAgICBfX3Rocm93X291dF9vZl9yYW5nZSgiZHluYXJyYXk6OmF0Iik7CisKKyAgICByZXR1cm4gZGF0YSgpW19fbl07Cit9CisKK319fQorCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHVzZXNfYWxsb2NhdG9yPHN0ZDo6ZXhwZXJpbWVudGFsOjpkeW5hcnJheTxfVHA+LCBfQWxsb2M+IDogdHJ1ZV90eXBlIHt9OworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCitfTElCQ1BQX1BPUF9NQUNST1MKKworI2VuZGlmICAvLyBpZiBfTElCQ1BQX1NURF9WRVIgPiAxMSAKKyNlbmRpZiAgLy8gX0xJQkNQUF9EWU5BUlJBWQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9maWxlc3lzdGVtIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9maWxlc3lzdGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3Y2MwYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL2ZpbGVzeXN0ZW0KQEAgLTAsMCArMSwyMTg0IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZmlsZXN5c3RlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgX0xJQkNQUF9FWFBFUklNRU5UQUxfRklMRVNZU1RFTQorI2RlZmluZSBfTElCQ1BQX0VYUEVSSU1FTlRBTF9GSUxFU1lTVEVNCisvKgorICAgIGZpbGVzeXN0ZW0gc3lub3BzaXMKKworICAgIG5hbWVzcGFjZSBzdGQgeyBuYW1lc3BhY2UgZXhwZXJpbWVudGFsIHsgbmFtZXNwYWNlIGZpbGVzeXN0ZW0geyBpbmxpbmUgbmFtZXNwYWNlIHYxIHsKKworICAgIGNsYXNzIHBhdGg7CisKKyAgICB2b2lkIHN3YXAocGF0aCYgbGhzLCBwYXRoJiByaHMpIF9OT0VYQ0VQVDsKKyAgICBzaXplX3QgaGFzaF92YWx1ZShjb25zdCBwYXRoJiBwKSBfTk9FWENFUFQ7CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgcGF0aCYgbGhzLCBjb25zdCBwYXRoJiByaHMpIF9OT0VYQ0VQVDsKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgcGF0aCYgbGhzLCBjb25zdCBwYXRoJiByaHMpIF9OT0VYQ0VQVDsKKyAgICBib29sIG9wZXJhdG9yPCAoY29uc3QgcGF0aCYgbGhzLCBjb25zdCBwYXRoJiByaHMpIF9OT0VYQ0VQVDsKKyAgICBib29sIG9wZXJhdG9yPD0oY29uc3QgcGF0aCYgbGhzLCBjb25zdCBwYXRoJiByaHMpIF9OT0VYQ0VQVDsKKyAgICBib29sIG9wZXJhdG9yPiAoY29uc3QgcGF0aCYgbGhzLCBjb25zdCBwYXRoJiByaHMpIF9OT0VYQ0VQVDsKKyAgICBib29sIG9wZXJhdG9yPj0oY29uc3QgcGF0aCYgbGhzLCBjb25zdCBwYXRoJiByaHMpIF9OT0VYQ0VQVDsKKworICAgIHBhdGggb3BlcmF0b3IvIChjb25zdCBwYXRoJiBsaHMsIGNvbnN0IHBhdGgmIHJocyk7CisKKyAgICAvLyBmcy5wYXRoLmlvIG9wZXJhdG9ycyBhcmUgZnJpZW5kcyBvZiBwYXRoLgorICAgIHRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGZyaWVuZCBiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYgb3MsIGNvbnN0IHBhdGgmIHApOworCisgICAgdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgZnJpZW5kIGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBpcywgcGF0aCYgcCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgU291cmNlPgorICAgICAgcGF0aCB1OHBhdGgoY29uc3QgU291cmNlJiBzb3VyY2UpOworICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgcGF0aCB1OHBhdGgoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0KTsKKworICAgIGNsYXNzIGZpbGVzeXN0ZW1fZXJyb3I7CisgICAgY2xhc3MgZGlyZWN0b3J5X2VudHJ5OworCisgICAgY2xhc3MgZGlyZWN0b3J5X2l0ZXJhdG9yOworCisgICAgLy8gZW5hYmxlIGRpcmVjdG9yeV9pdGVyYXRvciByYW5nZS1iYXNlZCBmb3Igc3RhdGVtZW50cworICAgIGRpcmVjdG9yeV9pdGVyYXRvciBiZWdpbihkaXJlY3RvcnlfaXRlcmF0b3IgaXRlcikgbm9leGNlcHQ7CisgICAgZGlyZWN0b3J5X2l0ZXJhdG9yIGVuZChjb25zdCBkaXJlY3RvcnlfaXRlcmF0b3ImKSBub2V4Y2VwdDsKKworICAgIGNsYXNzIHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3I7CisKKyAgICAvLyBlbmFibGUgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvciByYW5nZS1iYXNlZCBmb3Igc3RhdGVtZW50cworICAgIHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IgYmVnaW4ocmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvciBpdGVyKSBub2V4Y2VwdDsKKyAgICByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yIGVuZChjb25zdCByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yJikgbm9leGNlcHQ7CisKKyAgICBjbGFzcyBmaWxlX3N0YXR1czsKKworICAgIHN0cnVjdCBzcGFjZV9pbmZvCisgICAgeworICAgICAgdWludG1heF90IGNhcGFjaXR5OworICAgICAgdWludG1heF90IGZyZWU7CisgICAgICB1aW50bWF4X3QgYXZhaWxhYmxlOworICAgIH07CisKKyAgICBlbnVtIGNsYXNzIGZpbGVfdHlwZTsKKyAgICBlbnVtIGNsYXNzIHBlcm1zOworICAgIGVudW0gY2xhc3MgcGVybV9vcHRpb25zOworICAgIGVudW0gY2xhc3MgY29weV9vcHRpb25zOworICAgIGVudW0gY2xhc3MgZGlyZWN0b3J5X29wdGlvbnM7CisKKyAgICB0eXBlZGVmIGNocm9ubzo6dGltZV9wb2ludDx0cml2aWFsLWNsb2NrPiAgZmlsZV90aW1lX3R5cGU7CisKKyAgICAvLyBvcGVyYXRpb25hbCBmdW5jdGlvbnMKKworICAgIHBhdGggYWJzb2x1dGUoY29uc3QgcGF0aCYgcCwgY29uc3QgcGF0aCYgYmFzZT1jdXJyZW50X3BhdGgoKSk7CisKKyAgICBwYXRoIGNhbm9uaWNhbChjb25zdCBwYXRoJiBwLCBjb25zdCBwYXRoJiBiYXNlID0gY3VycmVudF9wYXRoKCkpOworICAgIHBhdGggY2Fub25pY2FsKGNvbnN0IHBhdGgmIHAsIGVycm9yX2NvZGUmIGVjKTsKKyAgICBwYXRoIGNhbm9uaWNhbChjb25zdCBwYXRoJiBwLCBjb25zdCBwYXRoJiBiYXNlLCBlcnJvcl9jb2RlJiBlYyk7CisKKyAgICB2b2lkIGNvcHkoY29uc3QgcGF0aCYgZnJvbSwgY29uc3QgcGF0aCYgdG8pOworICAgIHZvaWQgY29weShjb25zdCBwYXRoJiBmcm9tLCBjb25zdCBwYXRoJiB0bywgZXJyb3JfY29kZSYgZWMpOworICAgIHZvaWQgY29weShjb25zdCBwYXRoJiBmcm9tLCBjb25zdCBwYXRoJiB0bywgY29weV9vcHRpb25zIG9wdGlvbnMpOworICAgIHZvaWQgY29weShjb25zdCBwYXRoJiBmcm9tLCBjb25zdCBwYXRoJiB0bywgY29weV9vcHRpb25zIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSYgZWMpOworCisgICAgYm9vbCBjb3B5X2ZpbGUoY29uc3QgcGF0aCYgZnJvbSwgY29uc3QgcGF0aCYgdG8pOworICAgIGJvb2wgY29weV9maWxlKGNvbnN0IHBhdGgmIGZyb20sIGNvbnN0IHBhdGgmIHRvLCBlcnJvcl9jb2RlJiBlYyk7CisgICAgYm9vbCBjb3B5X2ZpbGUoY29uc3QgcGF0aCYgZnJvbSwgY29uc3QgcGF0aCYgdG8sIGNvcHlfb3B0aW9ucyBvcHRpb24pOworICAgIGJvb2wgY29weV9maWxlKGNvbnN0IHBhdGgmIGZyb20sIGNvbnN0IHBhdGgmIHRvLCBjb3B5X29wdGlvbnMgb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSYgZWMpOworCisgICAgdm9pZCBjb3B5X3N5bWxpbmsoY29uc3QgcGF0aCYgZXhpc3Rpbmdfc3ltbGluaywgY29uc3QgcGF0aCYgbmV3X3N5bWxpbmspOworICAgIHZvaWQgY29weV9zeW1saW5rKGNvbnN0IHBhdGgmIGV4aXN0aW5nX3N5bWxpbmssIGNvbnN0IHBhdGgmIG5ld19zeW1saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSYgZWMpIF9OT0VYQ0VQVDsKKworICAgIGJvb2wgY3JlYXRlX2RpcmVjdG9yaWVzKGNvbnN0IHBhdGgmIHApOworICAgIGJvb2wgY3JlYXRlX2RpcmVjdG9yaWVzKGNvbnN0IHBhdGgmIHAsIGVycm9yX2NvZGUmIGVjKTsKKworICAgIGJvb2wgY3JlYXRlX2RpcmVjdG9yeShjb25zdCBwYXRoJiBwKTsKKyAgICBib29sIGNyZWF0ZV9kaXJlY3RvcnkoY29uc3QgcGF0aCYgcCwgZXJyb3JfY29kZSYgZWMpIF9OT0VYQ0VQVDsKKworICAgIGJvb2wgY3JlYXRlX2RpcmVjdG9yeShjb25zdCBwYXRoJiBwLCBjb25zdCBwYXRoJiBhdHRyaWJ1dGVzKTsKKyAgICBib29sIGNyZWF0ZV9kaXJlY3RvcnkoY29uc3QgcGF0aCYgcCwgY29uc3QgcGF0aCYgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlJiBlYykgX05PRVhDRVBUOworCisgICAgdm9pZCBjcmVhdGVfZGlyZWN0b3J5X3N5bWxpbmsoY29uc3QgcGF0aCYgdG8sIGNvbnN0IHBhdGgmIG5ld19zeW1saW5rKTsKKyAgICB2b2lkIGNyZWF0ZV9kaXJlY3Rvcnlfc3ltbGluayhjb25zdCBwYXRoJiB0bywgY29uc3QgcGF0aCYgbmV3X3N5bWxpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlJiBlYykgX05PRVhDRVBUOworCisgICAgdm9pZCBjcmVhdGVfaGFyZF9saW5rKGNvbnN0IHBhdGgmIHRvLCBjb25zdCBwYXRoJiBuZXdfaGFyZF9saW5rKTsKKyAgICB2b2lkIGNyZWF0ZV9oYXJkX2xpbmsoY29uc3QgcGF0aCYgdG8sIGNvbnN0IHBhdGgmIG5ld19oYXJkX2xpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSYgZWMpIF9OT0VYQ0VQVDsKKworICAgIHZvaWQgY3JlYXRlX3N5bWxpbmsoY29uc3QgcGF0aCYgdG8sIGNvbnN0IHBhdGgmIG5ld19zeW1saW5rKTsKKyAgICB2b2lkIGNyZWF0ZV9zeW1saW5rKGNvbnN0IHBhdGgmIHRvLCBjb25zdCBwYXRoJiBuZXdfc3ltbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSYgZWMpIF9OT0VYQ0VQVDsKKworICAgIHBhdGggY3VycmVudF9wYXRoKCk7CisgICAgcGF0aCBjdXJyZW50X3BhdGgoZXJyb3JfY29kZSYgZWMpOworICAgIHZvaWQgY3VycmVudF9wYXRoKGNvbnN0IHBhdGgmIHApOworICAgIHZvaWQgY3VycmVudF9wYXRoKGNvbnN0IHBhdGgmIHAsIGVycm9yX2NvZGUmIGVjKSBfTk9FWENFUFQ7CisKKyAgICBib29sIGV4aXN0cyhmaWxlX3N0YXR1cyBzKSBfTk9FWENFUFQ7CisgICAgYm9vbCBleGlzdHMoY29uc3QgcGF0aCYgcCk7CisgICAgYm9vbCBleGlzdHMoY29uc3QgcGF0aCYgcCwgZXJyb3JfY29kZSYgZWMpIF9OT0VYQ0VQVDsKKworICAgIGJvb2wgZXF1aXZhbGVudChjb25zdCBwYXRoJiBwMSwgY29uc3QgcGF0aCYgcDIpOworICAgIGJvb2wgZXF1aXZhbGVudChjb25zdCBwYXRoJiBwMSwgY29uc3QgcGF0aCYgcDIsIGVycm9yX2NvZGUmIGVjKSBfTk9FWENFUFQ7CisKKyAgICB1aW50bWF4X3QgICAgZmlsZV9zaXplKGNvbnN0IHBhdGgmIHApOworICAgIHVpbnRtYXhfdCAgICBmaWxlX3NpemUoY29uc3QgcGF0aCYgcCwgZXJyb3JfY29kZSYgZWMpIF9OT0VYQ0VQVDsKKworICAgIHVpbnRtYXhfdCAgICBoYXJkX2xpbmtfY291bnQoY29uc3QgcGF0aCYgcCk7CisgICAgdWludG1heF90ICAgIGhhcmRfbGlua19jb3VudChjb25zdCBwYXRoJiBwLCBlcnJvcl9jb2RlJiBlYykgX05PRVhDRVBUOworCisgICAgYm9vbCBpc19ibG9ja19maWxlKGZpbGVfc3RhdHVzIHMpIF9OT0VYQ0VQVDsKKyAgICBib29sIGlzX2Jsb2NrX2ZpbGUoY29uc3QgcGF0aCYgcCk7CisgICAgYm9vbCBpc19ibG9ja19maWxlKGNvbnN0IHBhdGgmIHAsIGVycm9yX2NvZGUmIGVjKSBfTk9FWENFUFQ7CisKKyAgICBib29sIGlzX2NoYXJhY3Rlcl9maWxlKGZpbGVfc3RhdHVzIHMpIF9OT0VYQ0VQVDsKKyAgICBib29sIGlzX2NoYXJhY3Rlcl9maWxlKGNvbnN0IHBhdGgmIHApOworICAgIGJvb2wgaXNfY2hhcmFjdGVyX2ZpbGUoY29uc3QgcGF0aCYgcCwgZXJyb3JfY29kZSYgZWMpIF9OT0VYQ0VQVDsKKworICAgIGJvb2wgaXNfZGlyZWN0b3J5KGZpbGVfc3RhdHVzIHMpIF9OT0VYQ0VQVDsKKyAgICBib29sIGlzX2RpcmVjdG9yeShjb25zdCBwYXRoJiBwKTsKKyAgICBib29sIGlzX2RpcmVjdG9yeShjb25zdCBwYXRoJiBwLCBlcnJvcl9jb2RlJiBlYykgX05PRVhDRVBUOworCisgICAgYm9vbCBpc19lbXB0eShjb25zdCBwYXRoJiBwKTsKKyAgICBib29sIGlzX2VtcHR5KGNvbnN0IHBhdGgmIHAsIGVycm9yX2NvZGUmIGVjKSBfTk9FWENFUFQ7CisKKyAgICBib29sIGlzX2ZpZm8oZmlsZV9zdGF0dXMgcykgX05PRVhDRVBUOworICAgIGJvb2wgaXNfZmlmbyhjb25zdCBwYXRoJiBwKTsKKyAgICBib29sIGlzX2ZpZm8oY29uc3QgcGF0aCYgcCwgZXJyb3JfY29kZSYgZWMpIF9OT0VYQ0VQVDsKKworICAgIGJvb2wgaXNfb3RoZXIoZmlsZV9zdGF0dXMgcykgX05PRVhDRVBUOworICAgIGJvb2wgaXNfb3RoZXIoY29uc3QgcGF0aCYgcCk7CisgICAgYm9vbCBpc19vdGhlcihjb25zdCBwYXRoJiBwLCBlcnJvcl9jb2RlJiBlYykgX05PRVhDRVBUOworCisgICAgYm9vbCBpc19yZWd1bGFyX2ZpbGUoZmlsZV9zdGF0dXMgcykgX05PRVhDRVBUOworICAgIGJvb2wgaXNfcmVndWxhcl9maWxlKGNvbnN0IHBhdGgmIHApOworICAgIGJvb2wgaXNfcmVndWxhcl9maWxlKGNvbnN0IHBhdGgmIHAsIGVycm9yX2NvZGUmIGVjKSBfTk9FWENFUFQ7CisKKyAgICBib29sIGlzX3NvY2tldChmaWxlX3N0YXR1cyBzKSBfTk9FWENFUFQ7CisgICAgYm9vbCBpc19zb2NrZXQoY29uc3QgcGF0aCYgcCk7CisgICAgYm9vbCBpc19zb2NrZXQoY29uc3QgcGF0aCYgcCwgZXJyb3JfY29kZSYgZWMpIF9OT0VYQ0VQVDsKKworICAgIGJvb2wgaXNfc3ltbGluayhmaWxlX3N0YXR1cyBzKSBfTk9FWENFUFQ7CisgICAgYm9vbCBpc19zeW1saW5rKGNvbnN0IHBhdGgmIHApOworICAgIGJvb2wgaXNfc3ltbGluayhjb25zdCBwYXRoJiBwLCBlcnJvcl9jb2RlJiBlYykgX05PRVhDRVBUOworCisgICAgZmlsZV90aW1lX3R5cGUgIGxhc3Rfd3JpdGVfdGltZShjb25zdCBwYXRoJiBwKTsKKyAgICBmaWxlX3RpbWVfdHlwZSAgbGFzdF93cml0ZV90aW1lKGNvbnN0IHBhdGgmIHAsIGVycm9yX2NvZGUmIGVjKSBfTk9FWENFUFQ7CisgICAgdm9pZCBsYXN0X3dyaXRlX3RpbWUoY29uc3QgcGF0aCYgcCwgZmlsZV90aW1lX3R5cGUgbmV3X3RpbWUpOworICAgIHZvaWQgbGFzdF93cml0ZV90aW1lKGNvbnN0IHBhdGgmIHAsIGZpbGVfdGltZV90eXBlIG5ld190aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSYgZWMpIF9OT0VYQ0VQVDsKKworICAgIHZvaWQgcGVybWlzc2lvbnMoY29uc3QgcGF0aCYgcCwgcGVybXMgcHJtcywKKyAgICAgICAgICAgICAgICAgICAgIHBlcm1fb3B0aW9ucyBvcHRzPXBlcm1fb3B0aW9uczo6cmVwbGFjZSk7CisgICAgdm9pZCBwZXJtaXNzaW9ucyhjb25zdCBwYXRoJiBwLCBwZXJtcyBwcm1zLCBlcnJvcl9jb2RlJiBlYykgbm9leGNlcHQ7CisgICAgdm9pZCBwZXJtaXNzaW9ucyhjb25zdCBwYXRoJiBwLCBwZXJtcyBwcm1zLCBwZXJtX29wdGlvbnMgb3B0cywKKyAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUmIGVjKTsKKworICAgIHBhdGggcmVhZF9zeW1saW5rKGNvbnN0IHBhdGgmIHApOworICAgIHBhdGggcmVhZF9zeW1saW5rKGNvbnN0IHBhdGgmIHAsIGVycm9yX2NvZGUmIGVjKTsKKworICAgIGJvb2wgcmVtb3ZlKGNvbnN0IHBhdGgmIHApOworICAgIGJvb2wgcmVtb3ZlKGNvbnN0IHBhdGgmIHAsIGVycm9yX2NvZGUmIGVjKSBfTk9FWENFUFQ7CisKKyAgICB1aW50bWF4X3QgICAgcmVtb3ZlX2FsbChjb25zdCBwYXRoJiBwKTsKKyAgICB1aW50bWF4X3QgICAgcmVtb3ZlX2FsbChjb25zdCBwYXRoJiBwLCBlcnJvcl9jb2RlJiBlYyk7CisKKyAgICB2b2lkIHJlbmFtZShjb25zdCBwYXRoJiBmcm9tLCBjb25zdCBwYXRoJiB0byk7CisgICAgdm9pZCByZW5hbWUoY29uc3QgcGF0aCYgZnJvbSwgY29uc3QgcGF0aCYgdG8sIGVycm9yX2NvZGUmIGVjKSBfTk9FWENFUFQ7CisKKyAgICB2b2lkIHJlc2l6ZV9maWxlKGNvbnN0IHBhdGgmIHAsIHVpbnRtYXhfdCBzaXplKTsKKyAgICB2b2lkIHJlc2l6ZV9maWxlKGNvbnN0IHBhdGgmIHAsIHVpbnRtYXhfdCBzaXplLCBlcnJvcl9jb2RlJiBlYykgX05PRVhDRVBUOworCisgICAgc3BhY2VfaW5mbyAgIHNwYWNlKGNvbnN0IHBhdGgmIHApOworICAgIHNwYWNlX2luZm8gICBzcGFjZShjb25zdCBwYXRoJiBwLCBlcnJvcl9jb2RlJiBlYykgX05PRVhDRVBUOworCisgICAgZmlsZV9zdGF0dXMgIHN0YXR1cyhjb25zdCBwYXRoJiBwKTsKKyAgICBmaWxlX3N0YXR1cyAgc3RhdHVzKGNvbnN0IHBhdGgmIHAsIGVycm9yX2NvZGUmIGVjKSBfTk9FWENFUFQ7CisKKyAgICBib29sIHN0YXR1c19rbm93bihmaWxlX3N0YXR1cyBzKSBfTk9FWENFUFQ7CisKKyAgICBmaWxlX3N0YXR1cyAgc3ltbGlua19zdGF0dXMoY29uc3QgcGF0aCYgcCk7CisgICAgZmlsZV9zdGF0dXMgIHN5bWxpbmtfc3RhdHVzKGNvbnN0IHBhdGgmIHAsIGVycm9yX2NvZGUmIGVjKSBfTk9FWENFUFQ7CisKKyAgICBwYXRoIHN5c3RlbV9jb21wbGV0ZShjb25zdCBwYXRoJiBwKTsKKyAgICBwYXRoIHN5c3RlbV9jb21wbGV0ZShjb25zdCBwYXRoJiBwLCBlcnJvcl9jb2RlJiBlYyk7CisKKyAgICBwYXRoIHRlbXBfZGlyZWN0b3J5X3BhdGgoKTsKKyAgICBwYXRoIHRlbXBfZGlyZWN0b3J5X3BhdGgoZXJyb3JfY29kZSYgZWMpOworCit9IH0gfSB9ICAvLyBuYW1lc3BhY2VzIHN0ZDo6ZXhwZXJpbWVudGFsOjpmaWxlc3lzdGVtOjp2MQorCisqLworCisjaW5jbHVkZSA8ZXhwZXJpbWVudGFsL19fY29uZmlnPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxpb21hbmlwPiAvLyBmb3IgcXVvdGVkCisjaW5jbHVkZSA8c3RyaW5nX3ZpZXc+CisKKyNpbmNsdWRlIDxfX2RlYnVnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2RlZmluZSBfX2NwcF9saWJfZXhwZXJpbWVudGFsX2ZpbGVzeXN0ZW0gMjAxNDA2CisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX0VYUEVSSU1FTlRBTF9GSUxFU1lTVEVNCisKK3R5cGVkZWYgY2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s+ICBmaWxlX3RpbWVfdHlwZTsKKworc3RydWN0IF9MSUJDUFBfVFlQRV9WSVMgc3BhY2VfaW5mbworeworICB1aW50bWF4X3QgY2FwYWNpdHk7CisgIHVpbnRtYXhfdCBmcmVlOworICB1aW50bWF4X3QgYXZhaWxhYmxlOworfTsKKworZW51bSBjbGFzcyBfTElCQ1BQX0VOVU1fVklTIGZpbGVfdHlwZSA6IHNpZ25lZCBjaGFyCit7CisgICAgbm9uZSAgICAgICA9IDAsCisgICAgbm90X2ZvdW5kICA9IC0xLAorICAgIHJlZ3VsYXIgICAgPSAxLAorICAgIGRpcmVjdG9yeSAgPSAyLAorICAgIHN5bWxpbmsgICAgPSAzLAorICAgIGJsb2NrICAgICAgPSA0LAorICAgIGNoYXJhY3RlciAgPSA1LAorICAgIGZpZm8gICAgICAgPSA2LAorICAgIHNvY2tldCAgICAgPSA3LAorICAgIHVua25vd24gICAgPSA4Cit9OworCitlbnVtIGNsYXNzIF9MSUJDUFBfRU5VTV9WSVMgcGVybXMgOiB1bnNpZ25lZAoreworICAgIG5vbmUgICAgICAgICA9IDAsCisKKyAgICBvd25lcl9yZWFkICAgPSAwNDAwLAorICAgIG93bmVyX3dyaXRlICA9IDAyMDAsCisgICAgb3duZXJfZXhlYyAgID0gMDEwMCwKKyAgICBvd25lcl9hbGwgICAgPSAwNzAwLAorCisgICAgZ3JvdXBfcmVhZCAgID0gMDQwLAorICAgIGdyb3VwX3dyaXRlICA9IDAyMCwKKyAgICBncm91cF9leGVjICAgPSAwMTAsCisgICAgZ3JvdXBfYWxsICAgID0gMDcwLAorCisgICAgb3RoZXJzX3JlYWQgID0gMDQsCisgICAgb3RoZXJzX3dyaXRlID0gMDIsCisgICAgb3RoZXJzX2V4ZWMgID0gMDEsCisgICAgb3RoZXJzX2FsbCAgID0gMDcsCisKKyAgICBhbGwgICAgICAgICAgPSAwNzc3LAorCisgICAgc2V0X3VpZCAgICAgID0gMDQwMDAsCisgICAgc2V0X2dpZCAgICAgID0gMDIwMDAsCisgICAgc3RpY2t5X2JpdCAgID0gMDEwMDAsCisgICAgbWFzayAgICAgICAgID0gMDc3NzcsCisgICAgdW5rbm93biAgICAgID0gMHhGRkZGLAorfTsKKworX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIHBlcm1zIG9wZXJhdG9yJihwZXJtcyBfTEhTLCBwZXJtcyBfUkhTKQoreyByZXR1cm4gc3RhdGljX2Nhc3Q8cGVybXM+KHN0YXRpY19jYXN0PHVuc2lnbmVkPihfTEhTKSAmIHN0YXRpY19jYXN0PHVuc2lnbmVkPihfUkhTKSk7IH0KKworX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIHBlcm1zIG9wZXJhdG9yfChwZXJtcyBfTEhTLCBwZXJtcyBfUkhTKQoreyByZXR1cm4gc3RhdGljX2Nhc3Q8cGVybXM+KHN0YXRpY19jYXN0PHVuc2lnbmVkPihfTEhTKSB8IHN0YXRpY19jYXN0PHVuc2lnbmVkPihfUkhTKSk7IH0KKworX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIHBlcm1zIG9wZXJhdG9yXihwZXJtcyBfTEhTLCBwZXJtcyBfUkhTKQoreyByZXR1cm4gc3RhdGljX2Nhc3Q8cGVybXM+KHN0YXRpY19jYXN0PHVuc2lnbmVkPihfTEhTKSBeIHN0YXRpY19jYXN0PHVuc2lnbmVkPihfUkhTKSk7IH0KKworX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIHBlcm1zIG9wZXJhdG9yfihwZXJtcyBfTEhTKQoreyByZXR1cm4gc3RhdGljX2Nhc3Q8cGVybXM+KH5zdGF0aWNfY2FzdDx1bnNpZ25lZD4oX0xIUykpOyB9CisKK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lubGluZSBwZXJtcyYgb3BlcmF0b3ImPShwZXJtcyYgX0xIUywgcGVybXMgX1JIUykKK3sgcmV0dXJuIF9MSFMgPSBfTEhTICYgX1JIUzsgfQorCitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpbmxpbmUgcGVybXMmIG9wZXJhdG9yfD0ocGVybXMmIF9MSFMsIHBlcm1zIF9SSFMpCit7IHJldHVybiBfTEhTID0gX0xIUyB8IF9SSFM7IH0KKworX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW5saW5lIHBlcm1zJiBvcGVyYXRvcl49KHBlcm1zJiBfTEhTLCBwZXJtcyBfUkhTKQoreyByZXR1cm4gX0xIUyA9IF9MSFMgXiBfUkhTOyB9CisKK2VudW0gY2xhc3MgX0xJQkNQUF9FTlVNX1ZJUyBwZXJtX29wdGlvbnMgOiB1bnNpZ25lZCBjaGFyIHsKKyAgcmVwbGFjZSAgPSAxLAorICBhZGQgICAgICA9IDIsCisgIHJlbW92ZSAgID0gNCwKKyAgbm9mb2xsb3cgPSA4Cit9OworCitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFIgcGVybV9vcHRpb25zIG9wZXJhdG9yJihwZXJtX29wdGlvbnMgX0xIUywgcGVybV9vcHRpb25zIF9SSFMpCit7IHJldHVybiBzdGF0aWNfY2FzdDxwZXJtX29wdGlvbnM+KHN0YXRpY19jYXN0PHVuc2lnbmVkPihfTEhTKSAmIHN0YXRpY19jYXN0PHVuc2lnbmVkPihfUkhTKSk7IH0KKworX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIHBlcm1fb3B0aW9ucyBvcGVyYXRvcnwocGVybV9vcHRpb25zIF9MSFMsIHBlcm1fb3B0aW9ucyBfUkhTKQoreyByZXR1cm4gc3RhdGljX2Nhc3Q8cGVybV9vcHRpb25zPihzdGF0aWNfY2FzdDx1bnNpZ25lZD4oX0xIUykgfCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oX1JIUykpOyB9CisKK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lubGluZSBfTElCQ1BQX0NPTlNURVhQUiBwZXJtX29wdGlvbnMgb3BlcmF0b3JeKHBlcm1fb3B0aW9ucyBfTEhTLCBwZXJtX29wdGlvbnMgX1JIUykKK3sgcmV0dXJuIHN0YXRpY19jYXN0PHBlcm1fb3B0aW9ucz4oc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KF9MSFMpIF4gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KF9SSFMpKTsgfQorCitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFIgcGVybV9vcHRpb25zIG9wZXJhdG9yfihwZXJtX29wdGlvbnMgX0xIUykKK3sgcmV0dXJuIHN0YXRpY19jYXN0PHBlcm1fb3B0aW9ucz4ofnN0YXRpY19jYXN0PHVuc2lnbmVkPihfTEhTKSk7IH0KKworX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW5saW5lIHBlcm1fb3B0aW9ucyYgb3BlcmF0b3ImPShwZXJtX29wdGlvbnMmIF9MSFMsIHBlcm1fb3B0aW9ucyBfUkhTKQoreyByZXR1cm4gX0xIUyA9IF9MSFMgJiBfUkhTOyB9CisKK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lubGluZSBwZXJtX29wdGlvbnMmIG9wZXJhdG9yfD0ocGVybV9vcHRpb25zJiBfTEhTLCBwZXJtX29wdGlvbnMgX1JIUykKK3sgcmV0dXJuIF9MSFMgPSBfTEhTIHwgX1JIUzsgfQorCitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpbmxpbmUgcGVybV9vcHRpb25zJiBvcGVyYXRvcl49KHBlcm1fb3B0aW9ucyYgX0xIUywgcGVybV9vcHRpb25zIF9SSFMpCit7IHJldHVybiBfTEhTID0gX0xIUyBeIF9SSFM7IH0KKworZW51bSBjbGFzcyBfTElCQ1BQX0VOVU1fVklTIGNvcHlfb3B0aW9ucyA6IHVuc2lnbmVkIHNob3J0Cit7CisgICAgbm9uZSAgICAgICAgICAgICAgID0gMCwKKyAgICBza2lwX2V4aXN0aW5nICAgICAgPSAxLAorICAgIG92ZXJ3cml0ZV9leGlzdGluZyA9IDIsCisgICAgdXBkYXRlX2V4aXN0aW5nICAgID0gNCwKKyAgICByZWN1cnNpdmUgICAgICAgICAgPSA4LAorICAgIGNvcHlfc3ltbGlua3MgICAgICA9IDE2LAorICAgIHNraXBfc3ltbGlua3MgICAgICA9IDMyLAorICAgIGRpcmVjdG9yaWVzX29ubHkgICA9IDY0LAorICAgIGNyZWF0ZV9zeW1saW5rcyAgICA9IDEyOCwKKyAgICBjcmVhdGVfaGFyZF9saW5rcyAgPSAyNTYsCisgICAgX19pbl9yZWN1cnNpdmVfY29weSA9IDUxMiwKK307CisKK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lubGluZSBfTElCQ1BQX0NPTlNURVhQUiBjb3B5X29wdGlvbnMgb3BlcmF0b3ImKGNvcHlfb3B0aW9ucyBfTEhTLCBjb3B5X29wdGlvbnMgX1JIUykKK3sgcmV0dXJuIHN0YXRpY19jYXN0PGNvcHlfb3B0aW9ucz4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KF9MSFMpICYgc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KF9SSFMpKTsgfQorCitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFIgY29weV9vcHRpb25zIG9wZXJhdG9yfChjb3B5X29wdGlvbnMgX0xIUywgY29weV9vcHRpb25zIF9SSFMpCit7IHJldHVybiBzdGF0aWNfY2FzdDxjb3B5X29wdGlvbnM+KHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihfTEhTKSB8IHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihfUkhTKSk7IH0KKworX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIGNvcHlfb3B0aW9ucyBvcGVyYXRvcl4oY29weV9vcHRpb25zIF9MSFMsIGNvcHlfb3B0aW9ucyBfUkhTKQoreyByZXR1cm4gc3RhdGljX2Nhc3Q8Y29weV9vcHRpb25zPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oX0xIUykgXiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oX1JIUykpOyB9CisKK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lubGluZSBfTElCQ1BQX0NPTlNURVhQUiBjb3B5X29wdGlvbnMgb3BlcmF0b3J+KGNvcHlfb3B0aW9ucyBfTEhTKQoreyByZXR1cm4gc3RhdGljX2Nhc3Q8Y29weV9vcHRpb25zPih+c3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KF9MSFMpKTsgfQorCitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpbmxpbmUgY29weV9vcHRpb25zJiBvcGVyYXRvciY9KGNvcHlfb3B0aW9ucyYgX0xIUywgY29weV9vcHRpb25zIF9SSFMpCit7IHJldHVybiBfTEhTID0gX0xIUyAmIF9SSFM7IH0KKworX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW5saW5lIGNvcHlfb3B0aW9ucyYgb3BlcmF0b3J8PShjb3B5X29wdGlvbnMmIF9MSFMsIGNvcHlfb3B0aW9ucyBfUkhTKQoreyByZXR1cm4gX0xIUyA9IF9MSFMgfCBfUkhTOyB9CisKK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lubGluZSBjb3B5X29wdGlvbnMmIG9wZXJhdG9yXj0oY29weV9vcHRpb25zJiBfTEhTLCBjb3B5X29wdGlvbnMgX1JIUykKK3sgcmV0dXJuIF9MSFMgPSBfTEhTIF4gX1JIUzsgfQorCisKK2VudW0gY2xhc3MgX0xJQkNQUF9FTlVNX1ZJUyBkaXJlY3Rvcnlfb3B0aW9ucyA6IHVuc2lnbmVkIGNoYXIKK3sKKyAgICBub25lICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIGZvbGxvd19kaXJlY3Rvcnlfc3ltbGluayA9IDEsCisgICAgc2tpcF9wZXJtaXNzaW9uX2RlbmllZCAgID0gMgorfTsKKworX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIGRpcmVjdG9yeV9vcHRpb25zIG9wZXJhdG9yJihkaXJlY3Rvcnlfb3B0aW9ucyBfTEhTLCBkaXJlY3Rvcnlfb3B0aW9ucyBfUkhTKQoreyByZXR1cm4gc3RhdGljX2Nhc3Q8ZGlyZWN0b3J5X29wdGlvbnM+KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KF9MSFMpICYgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oX1JIUykpOyB9CisKK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lubGluZSBfTElCQ1BQX0NPTlNURVhQUiBkaXJlY3Rvcnlfb3B0aW9ucyBvcGVyYXRvcnwoZGlyZWN0b3J5X29wdGlvbnMgX0xIUywgZGlyZWN0b3J5X29wdGlvbnMgX1JIUykKK3sgcmV0dXJuIHN0YXRpY19jYXN0PGRpcmVjdG9yeV9vcHRpb25zPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihfTEhTKSB8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KF9SSFMpKTsgfQorCitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFIgZGlyZWN0b3J5X29wdGlvbnMgb3BlcmF0b3JeKGRpcmVjdG9yeV9vcHRpb25zIF9MSFMsIGRpcmVjdG9yeV9vcHRpb25zIF9SSFMpCit7IHJldHVybiBzdGF0aWNfY2FzdDxkaXJlY3Rvcnlfb3B0aW9ucz4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oX0xIUykgXiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihfUkhTKSk7IH0KKworX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSIGRpcmVjdG9yeV9vcHRpb25zIG9wZXJhdG9yfihkaXJlY3Rvcnlfb3B0aW9ucyBfTEhTKQoreyByZXR1cm4gc3RhdGljX2Nhc3Q8ZGlyZWN0b3J5X29wdGlvbnM+KH5zdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihfTEhTKSk7IH0KKworX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW5saW5lIGRpcmVjdG9yeV9vcHRpb25zJiBvcGVyYXRvciY9KGRpcmVjdG9yeV9vcHRpb25zJiBfTEhTLCBkaXJlY3Rvcnlfb3B0aW9ucyBfUkhTKQoreyByZXR1cm4gX0xIUyA9IF9MSFMgJiBfUkhTOyB9CisKK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lubGluZSBkaXJlY3Rvcnlfb3B0aW9ucyYgb3BlcmF0b3J8PShkaXJlY3Rvcnlfb3B0aW9ucyYgX0xIUywgZGlyZWN0b3J5X29wdGlvbnMgX1JIUykKK3sgcmV0dXJuIF9MSFMgPSBfTEhTIHwgX1JIUzsgfQorCitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpbmxpbmUgZGlyZWN0b3J5X29wdGlvbnMmIG9wZXJhdG9yXj0oZGlyZWN0b3J5X29wdGlvbnMmIF9MSFMsIGRpcmVjdG9yeV9vcHRpb25zIF9SSFMpCit7IHJldHVybiBfTEhTID0gX0xIUyBeIF9SSFM7IH0KKworCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIGZpbGVfc3RhdHVzCit7CitwdWJsaWM6CisgICAgLy8gY29uc3RydWN0b3JzCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGZpbGVfc3RhdHVzKCkgX05PRVhDRVBUIDogZmlsZV9zdGF0dXMoZmlsZV90eXBlOjpub25lKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBmaWxlX3N0YXR1cyhmaWxlX3R5cGUgX19mdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtcyBfX3BybXMgPSBwZXJtczo6dW5rbm93bikgX05PRVhDRVBUCisgICAgICA6IF9fZnRfKF9fZnQpLCBfX3BybXNfKF9fcHJtcykKKyAgICB7fQorCisgICAgZmlsZV9zdGF0dXMoY29uc3QgZmlsZV9zdGF0dXMmKSBfTk9FWENFUFQgPSBkZWZhdWx0OworICAgIGZpbGVfc3RhdHVzKGZpbGVfc3RhdHVzJiYpIF9OT0VYQ0VQVCA9IGRlZmF1bHQ7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgfmZpbGVfc3RhdHVzKCkge30KKworICAgIGZpbGVfc3RhdHVzJiBvcGVyYXRvcj0oY29uc3QgZmlsZV9zdGF0dXMmKSBfTk9FWENFUFQgPSBkZWZhdWx0OworICAgIGZpbGVfc3RhdHVzJiBvcGVyYXRvcj0oZmlsZV9zdGF0dXMmJikgX05PRVhDRVBUID0gZGVmYXVsdDsKKworICAgIC8vIG9ic2VydmVycworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGZpbGVfdHlwZSB0eXBlKCkgY29uc3QgX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuIF9fZnRfOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIHBlcm1zIHBlcm1pc3Npb25zKCkgY29uc3QgX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuIF9fcHJtc187CisgICAgfQorCisgICAgLy8gbW9kaWZpZXJzCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgdm9pZCB0eXBlKGZpbGVfdHlwZSBfX2Z0KSBfTk9FWENFUFQgeworICAgICAgICBfX2Z0XyA9IF9fZnQ7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgdm9pZCBwZXJtaXNzaW9ucyhwZXJtcyBfX3ApIF9OT0VYQ0VQVCB7CisgICAgICAgIF9fcHJtc18gPSBfX3A7CisgICAgfQorcHJpdmF0ZToKKyAgICBmaWxlX3R5cGUgX19mdF87CisgICAgcGVybXMgX19wcm1zXzsKK307CisKK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgZGlyZWN0b3J5X2VudHJ5OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX19jYW5fY29udmVydF9jaGFyIHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKK307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX19jYW5fY29udmVydF9jaGFyPGNvbnN0IF9UcD4KKyAgICA6IHB1YmxpYyBfX2Nhbl9jb252ZXJ0X2NoYXI8X1RwPiB7Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IF9fY2FuX2NvbnZlcnRfY2hhcjxjaGFyPiB7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworICAgIHVzaW5nIF9fY2hhcl90eXBlID0gY2hhcjsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX19jYW5fY29udmVydF9jaGFyPHdjaGFyX3Q+ICB7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworICAgIHVzaW5nIF9fY2hhcl90eXBlID0gd2NoYXJfdDsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX19jYW5fY29udmVydF9jaGFyPGNoYXIxNl90PiB7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworICAgIHVzaW5nIF9fY2hhcl90eXBlID0gY2hhcjE2X3Q7Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IF9fY2FuX2NvbnZlcnRfY2hhcjxjaGFyMzJfdD4geworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKKyAgICB1c2luZyBfX2NoYXJfdHlwZSA9IGNoYXIzMl90OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9FQ2hhclQ+Cit0eXBlbmFtZSBlbmFibGVfaWY8X19jYW5fY29udmVydF9jaGFyPF9FQ2hhclQ+Ojp2YWx1ZSwgYm9vbD46OnR5cGUKK19faXNfc2VwYXJhdG9yKF9FQ2hhclQgX19lKSB7CisgICAgcmV0dXJuIF9fZSA9PSBfRUNoYXJUKCcvJyk7Cit9OworCitzdHJ1Y3QgX051bGxTZW50aW5hbCB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3VzaW5nIF9Wb2lkID0gdm9pZDsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgPSB2b2lkPgorc3RydWN0IF9faXNfcGF0aGFibGVfc3RyaW5nIDogcHVibGljIGZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfRUNoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19pc19wYXRoYWJsZV9zdHJpbmc8YmFzaWNfc3RyaW5nPF9FQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZvaWQ8dHlwZW5hbWUgX19jYW5fY29udmVydF9jaGFyPF9FQ2hhclQ+OjpfX2NoYXJfdHlwZT4+Cis6IHB1YmxpYyBfX2Nhbl9jb252ZXJ0X2NoYXI8X0VDaGFyVD4KK3sKKyAgICB1c2luZyBfU3RyID0gYmFzaWNfc3RyaW5nPF9FQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz47CisgICAgdXNpbmcgX0Jhc2UgPSBfX2Nhbl9jb252ZXJ0X2NoYXI8X0VDaGFyVD47CisgICAgc3RhdGljIF9FQ2hhclQgY29uc3QqIF9fcmFuZ2VfYmVnaW4oX1N0ciBjb25zdCYgX19zKSB7IHJldHVybiBfX3MuZGF0YSgpOyB9CisgICAgc3RhdGljIF9FQ2hhclQgY29uc3QqIF9fcmFuZ2VfZW5kKF9TdHIgY29uc3QmIF9fcykgeyByZXR1cm4gX19zLmRhdGEoKSArIF9fcy5sZW5ndGgoKTsgfQorICAgIHN0YXRpYyBfRUNoYXJUIF9fZmlyc3Rfb3JfbnVsbChfU3RyIGNvbnN0JiBfX3MpIHsKKyAgICAgICAgcmV0dXJuIF9fcy5lbXB0eSgpID8gX0VDaGFyVHt9IDogX19zWzBdOworICAgIH0KK307CisKKwordGVtcGxhdGUgPGNsYXNzIF9FQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitzdHJ1Y3QgX19pc19wYXRoYWJsZV9zdHJpbmc8YmFzaWNfc3RyaW5nX3ZpZXc8X0VDaGFyVCwgX1RyYWl0cz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZvaWQ8dHlwZW5hbWUgX19jYW5fY29udmVydF9jaGFyPF9FQ2hhclQ+OjpfX2NoYXJfdHlwZT4+Cis6IHB1YmxpYyBfX2Nhbl9jb252ZXJ0X2NoYXI8X0VDaGFyVD4KK3sKKyAgICB1c2luZyBfU3RyID0gYmFzaWNfc3RyaW5nX3ZpZXc8X0VDaGFyVCwgX1RyYWl0cz47CisgICAgdXNpbmcgX0Jhc2UgPSBfX2Nhbl9jb252ZXJ0X2NoYXI8X0VDaGFyVD47CisgICAgc3RhdGljIF9FQ2hhclQgY29uc3QqIF9fcmFuZ2VfYmVnaW4oX1N0ciBjb25zdCYgX19zKSB7IHJldHVybiBfX3MuZGF0YSgpOyB9CisgICAgc3RhdGljIF9FQ2hhclQgY29uc3QqIF9fcmFuZ2VfZW5kKF9TdHIgY29uc3QmIF9fcykgeyByZXR1cm4gX19zLmRhdGEoKSArIF9fcy5sZW5ndGgoKTsgfQorICAgIHN0YXRpYyBfRUNoYXJUIF9fZmlyc3Rfb3JfbnVsbChfU3RyIGNvbnN0JiBfX3MpIHsKKyAgICAgICAgcmV0dXJuIF9fcy5lbXB0eSgpID8gX0VDaGFyVHt9IDogX19zWzBdOworICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfU291cmNlLAorICAgICAgICAgIGNsYXNzIF9EUyA9IHR5cGVuYW1lIGRlY2F5PF9Tb3VyY2U+Ojp0eXBlLAorICAgICAgICAgIGNsYXNzIF9VbnF1YWxQdHJUeXBlID0gdHlwZW5hbWUgcmVtb3ZlX2NvbnN0PAorICAgICAgICAgICAgICB0eXBlbmFtZSByZW1vdmVfcG9pbnRlcjxfRFM+Ojp0eXBlPjo6dHlwZSwKKyAgICAgICAgICBib29sIF9Jc0NoYXJQdHIgPSBpc19wb2ludGVyPF9EUz46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jYW5fY29udmVydF9jaGFyPF9VbnF1YWxQdHJUeXBlPjo6dmFsdWUKKyAgICAgICAgPgorc3RydWN0IF9faXNfcGF0aGFibGVfY2hhcl9hcnJheSA6IGZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfU291cmNlLCBjbGFzcyBfRUNoYXJULCBjbGFzcyBfVVB0cj4KK3N0cnVjdCBfX2lzX3BhdGhhYmxlX2NoYXJfYXJyYXk8X1NvdXJjZSwgX0VDaGFyVCosIF9VUHRyLCB0cnVlPgorICAgICAgICA6IF9fY2FuX2NvbnZlcnRfY2hhcjx0eXBlbmFtZSByZW1vdmVfY29uc3Q8X0VDaGFyVD46OnR5cGU+Cit7CisgIHVzaW5nIF9CYXNlID0gX19jYW5fY29udmVydF9jaGFyPHR5cGVuYW1lIHJlbW92ZV9jb25zdDxfRUNoYXJUPjo6dHlwZT47CisKKyAgc3RhdGljIF9FQ2hhclQgY29uc3QqIF9fcmFuZ2VfYmVnaW4oY29uc3QgX0VDaGFyVCogX19iKSB7IHJldHVybiBfX2I7IH0KKyAgc3RhdGljIF9FQ2hhclQgY29uc3QqIF9fcmFuZ2VfZW5kKGNvbnN0IF9FQ2hhclQqIF9fYikKKyAgeworICAgICAgdXNpbmcgX0l0ZXIgPSBjb25zdCBfRUNoYXJUKjsKKyAgICAgIGNvbnN0IF9FQ2hhclQgX19zZW50aW5hbCA9IF9FQ2hhclR7fTsKKyAgICAgIF9JdGVyIF9fZSA9IF9fYjsKKyAgICAgIGZvciAoOyAqX19lICE9IF9fc2VudGluYWw7ICsrX19lKQorICAgICAgICAgIDsKKyAgICAgIHJldHVybiBfX2U7CisgIH0KKworICBzdGF0aWMgX0VDaGFyVCBfX2ZpcnN0X29yX251bGwoY29uc3QgX0VDaGFyVCogX19iKSB7IHJldHVybiAqX19iOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIsIGJvb2wgX0lzSXQgPSBfX2lzX2lucHV0X2l0ZXJhdG9yPF9JdGVyPjo6dmFsdWUsIGNsYXNzID0gdm9pZD4KK3N0cnVjdCBfX2lzX3BhdGhhYmxlX2l0ZXIgOiBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CitzdHJ1Y3QgX19pc19wYXRoYWJsZV9pdGVyPF9JdGVyLCB0cnVlLAorICAgICAgICBfVm9pZDx0eXBlbmFtZSBfX2Nhbl9jb252ZXJ0X2NoYXI8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6dmFsdWVfdHlwZT46Ol9fY2hhcl90eXBlPj4KKyAgICAgICAgOiBfX2Nhbl9jb252ZXJ0X2NoYXI8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6dmFsdWVfdHlwZT4KK3sKKyAgdXNpbmcgX0VDaGFyVCA9IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46OnZhbHVlX3R5cGU7CisgIHVzaW5nIF9CYXNlID0gX19jYW5fY29udmVydF9jaGFyPF9FQ2hhclQ+OworCisgIHN0YXRpYyBfSXRlciAgICAgICAgIF9fcmFuZ2VfYmVnaW4oX0l0ZXIgX19iKSB7IHJldHVybiBfX2I7IH0KKyAgc3RhdGljIF9OdWxsU2VudGluYWwgX19yYW5nZV9lbmQoX0l0ZXIpICAgICAgIHsgcmV0dXJuIF9OdWxsU2VudGluYWx7fTsgfQorCisgIHN0YXRpYyBfRUNoYXJUIF9fZmlyc3Rfb3JfbnVsbChfSXRlciBfX2IpIHsgcmV0dXJuICpfX2I7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGJvb2wgX0lzU3RyaW5nVCA9ICBfX2lzX3BhdGhhYmxlX3N0cmluZzxfVHA+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgX0lzQ2hhckl0ZXJUID0gX19pc19wYXRoYWJsZV9jaGFyX2FycmF5PF9UcD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBfSXNJdGVyVCA9ICFfSXNDaGFySXRlclQgJiYgX19pc19wYXRoYWJsZV9pdGVyPF9UcD46OnZhbHVlCisgICAgICAgICA+CitzdHJ1Y3QgX19pc19wYXRoYWJsZSA6IGZhbHNlX3R5cGUgeworICBzdGF0aWNfYXNzZXJ0KCFfSXNTdHJpbmdUICYmICFfSXNDaGFySXRlclQgJiYgIV9Jc0l0ZXJULCAiTXVzdCBhbGwgYmUgZmFsc2UiKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19pc19wYXRoYWJsZTxfVHAsIHRydWUsIGZhbHNlLCBmYWxzZT4gOiBfX2lzX3BhdGhhYmxlX3N0cmluZzxfVHA+IHt9OworCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19pc19wYXRoYWJsZTxfVHAsIGZhbHNlLCB0cnVlLCBmYWxzZT4gOiBfX2lzX3BhdGhhYmxlX2NoYXJfYXJyYXk8X1RwPiB7fTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9faXNfcGF0aGFibGU8X1RwLCBmYWxzZSwgZmFsc2UsIHRydWU+IDogX19pc19wYXRoYWJsZV9pdGVyPF9UcD4ge307CisKKwordGVtcGxhdGUgPGNsYXNzIF9FQ2hhclQ+CitzdHJ1Y3QgX1BhdGhDVlQgeworICAgIHN0YXRpY19hc3NlcnQoX19jYW5fY29udmVydF9jaGFyPF9FQ2hhclQ+Ojp2YWx1ZSwgIkNoYXIgdHlwZSBub3QgY29udmVydGlibGUiKTsKKworICAgIHR5cGVkZWYgX19uYXJyb3dfdG9fdXRmODxzaXplb2YoX0VDaGFyVCkqX19DSEFSX0JJVF9fPiBfTmFycm93ZXI7CisKKyAgICBzdGF0aWMgdm9pZCBfX2FwcGVuZF9yYW5nZShzdHJpbmcmIF9fZGVzdCwgX0VDaGFyVCBjb25zdCogX19iLCBfRUNoYXJUIGNvbnN0KiBfX2UpICB7CisgICAgICAgIF9OYXJyb3dlcigpKGJhY2tfaW5zZXJ0ZXIoX19kZXN0KSwgX19iLCBfX2UpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfSXRlcj4KKyAgICBzdGF0aWMgdm9pZCBfX2FwcGVuZF9yYW5nZShzdHJpbmcmIF9fZGVzdCwgX0l0ZXIgX19iLCBfSXRlciBfX2UpIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghaXNfc2FtZTxfSXRlciwgX0VDaGFyVCo+Ojp2YWx1ZSwgIkNhbGwgY29uc3Qgb3ZlcmxvYWQiKTsKKyAgICAgICAgaWYgKF9fYiA9PSBfX2UpIHJldHVybjsKKyAgICAgICAgYmFzaWNfc3RyaW5nPF9FQ2hhclQ+IF9fdG1wKF9fYiwgX19lKTsKKyAgICAgICAgX05hcnJvd2VyKCkoYmFja19pbnNlcnRlcihfX2Rlc3QpLCBfX3RtcC5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIF9fdG1wLmRhdGEoKSArIF9fdG1wLmxlbmd0aCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CisgICAgc3RhdGljIHZvaWQgX19hcHBlbmRfcmFuZ2Uoc3RyaW5nJiBfX2Rlc3QsIF9JdGVyIF9fYiwgX051bGxTZW50aW5hbCkgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFpc19zYW1lPF9JdGVyLCBfRUNoYXJUKj46OnZhbHVlLCAiQ2FsbCBjb25zdCBvdmVybG9hZCIpOworICAgICAgICBjb25zdCBfRUNoYXJUIF9fc2VudGluYWwgPSBfRUNoYXJUe307CisgICAgICAgIGlmICgqX19iID09IF9fc2VudGluYWwpIHJldHVybjsKKyAgICAgICAgYmFzaWNfc3RyaW5nPF9FQ2hhclQ+IF9fdG1wOworICAgICAgICBmb3IgKDsgKl9fYiAhPSBfX3NlbnRpbmFsOyArK19fYikKKyAgICAgICAgICAgIF9fdG1wLnB1c2hfYmFjaygqX19iKTsKKyAgICAgICAgX05hcnJvd2VyKCkoYmFja19pbnNlcnRlcihfX2Rlc3QpLCBfX3RtcC5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIF9fdG1wLmRhdGEoKSArIF9fdG1wLmxlbmd0aCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1NvdXJjZT4KKyAgICBzdGF0aWMgdm9pZCBfX2FwcGVuZF9zb3VyY2Uoc3RyaW5nJiBfX2Rlc3QsIF9Tb3VyY2UgY29uc3QmIF9fcykKKyAgICB7CisgICAgICAgIHVzaW5nIF9UcmFpdHMgPSBfX2lzX3BhdGhhYmxlPF9Tb3VyY2U+OworICAgICAgICBfX2FwcGVuZF9yYW5nZShfX2Rlc3QsIF9UcmFpdHM6Ol9fcmFuZ2VfYmVnaW4oX19zKSwgX1RyYWl0czo6X19yYW5nZV9lbmQoX19zKSk7CisgICAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfUGF0aENWVDxjaGFyPiB7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CisgICAgc3RhdGljIHR5cGVuYW1lIGVuYWJsZV9pZjwKKyAgICAgICAgX19pc19leGFjdGx5X2lucHV0X2l0ZXJhdG9yPF9JdGVyPjo6dmFsdWUKKyAgICA+Ojp0eXBlIF9fYXBwZW5kX3JhbmdlKHN0cmluZyYgX19kZXN0LCBfSXRlciBfX2IsIF9JdGVyIF9fZSkgeworICAgICAgICBmb3IgKDsgX19iICE9IF9fZTsgKytfX2IpCisgICAgICAgICAgICBfX2Rlc3QucHVzaF9iYWNrKCpfX2IpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfSXRlcj4KKyAgICBzdGF0aWMgdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgICBfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0l0ZXI+Ojp2YWx1ZQorICAgID46OnR5cGUgX19hcHBlbmRfcmFuZ2Uoc3RyaW5nJiBfX2Rlc3QsIF9JdGVyIF9fYiwgX0l0ZXIgX19lKSB7CisgICAgICAgIF9fZGVzdC5fX2FwcGVuZF9mb3J3YXJkX3Vuc2FmZShfX2IsIF9fZSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JdGVyPgorICAgIHN0YXRpYyB2b2lkIF9fYXBwZW5kX3JhbmdlKHN0cmluZyYgX19kZXN0LCBfSXRlciBfX2IsIF9OdWxsU2VudGluYWwpIHsKKyAgICAgICAgY29uc3QgY2hhciBfX3NlbnRpbmFsID0gY2hhcnt9OworICAgICAgICBmb3IgKDsgKl9fYiAhPSBfX3NlbnRpbmFsOyArK19fYikKKyAgICAgICAgICAgIF9fZGVzdC5wdXNoX2JhY2soKl9fYik7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9Tb3VyY2U+CisgICAgc3RhdGljIHZvaWQgX19hcHBlbmRfc291cmNlKHN0cmluZyYgX19kZXN0LCBfU291cmNlIGNvbnN0JiBfX3MpCisgICAgeworICAgICAgICB1c2luZyBfVHJhaXRzID0gX19pc19wYXRoYWJsZTxfU291cmNlPjsKKyAgICAgICAgX19hcHBlbmRfcmFuZ2UoX19kZXN0LCBfVHJhaXRzOjpfX3JhbmdlX2JlZ2luKF9fcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RyYWl0czo6X19yYW5nZV9lbmQoX19zKSk7CisgICAgfQorfTsKKworCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIHBhdGgKK3sKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1NvdXJjZU9ySXRlciwgY2xhc3MgX1RwID0gcGF0aCY+CisgICAgdXNpbmcgX0VuYWJsZUlmUGF0aGFibGUgPSB0eXBlbmFtZQorICAgICAgICBlbmFibGVfaWY8X19pc19wYXRoYWJsZTxfU291cmNlT3JJdGVyPjo6dmFsdWUsIF9UcD46OnR5cGU7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIHVzaW5nIF9Tb3VyY2VDaGFyID0gdHlwZW5hbWUgX19pc19wYXRoYWJsZTxfVHA+OjpfX2NoYXJfdHlwZTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgdXNpbmcgX1NvdXJjZUNWVCA9IF9QYXRoQ1ZUPF9Tb3VyY2VDaGFyPF9UcD4+OworCitwdWJsaWM6CisgICAgdHlwZWRlZiBjaGFyIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8dmFsdWVfdHlwZT4gc3RyaW5nX3R5cGU7CisgICAgdHlwZWRlZiBfVlNURDo6c3RyaW5nX3ZpZXcgX19zdHJpbmdfdmlldzsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdmFsdWVfdHlwZSBwcmVmZXJyZWRfc2VwYXJhdG9yID0gJy8nOworCisgICAgLy8gY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9yCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBwYXRoKCkgX05PRVhDRVBUIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBwYXRoKGNvbnN0IHBhdGgmIF9fcCkgICAgICA6IF9fcG5fKF9fcC5fX3BuXykge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHBhdGgocGF0aCYmIF9fcCkgX05PRVhDRVBUIDogX19wbl8oX1ZTVEQ6Om1vdmUoX19wLl9fcG5fKSkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYXRoKHN0cmluZ190eXBlJiYgX19zKSBfTk9FWENFUFQgOiBfX3BuXyhfVlNURDo6bW92ZShfX3MpKSB7fQorCisgICAgdGVtcGxhdGUgPAorICAgICAgICBjbGFzcyBfU291cmNlLAorICAgICAgICBjbGFzcyA9IF9FbmFibGVJZlBhdGhhYmxlPF9Tb3VyY2UsIHZvaWQ+CisgICAgICAgID4KKyAgICBwYXRoKGNvbnN0IF9Tb3VyY2UmIF9fc3JjKSB7CisgICAgICAgIF9Tb3VyY2VDVlQ8X1NvdXJjZT46Ol9fYXBwZW5kX3NvdXJjZShfX3BuXywgX19zcmMpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdD4KKyAgICBwYXRoKF9JbnB1dEl0IF9fZmlyc3QsIF9JbnB1dEl0IF9fbGFzdCkgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdD46OnZhbHVlX3R5cGUgX0l0VmFsOworICAgICAgICBfUGF0aENWVDxfSXRWYWw+OjpfX2FwcGVuZF9yYW5nZShfX3BuXywgX19maXJzdCwgX19sYXN0KTsKKyAgICB9CisKKyAgICAvLyBUT0RPIEltcGxlbWVudCBsb2NhbGUgY29udmVyc2lvbnMuCisgICAgdGVtcGxhdGUgPGNsYXNzIF9Tb3VyY2UsCisgICAgICAgICAgICAgIGNsYXNzID0gX0VuYWJsZUlmUGF0aGFibGU8X1NvdXJjZSwgdm9pZD4KKyAgICAgICAgICAgICA+CisgICAgICAgIHBhdGgoY29uc3QgX1NvdXJjZSYgX19zcmMsIGNvbnN0IGxvY2FsZSYgX19sb2MpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdD4KKyAgICAgICAgcGF0aChfSW5wdXRJdCBfX2ZpcnN0LCBfSW5wdXRJdCBfbGFzdCwgY29uc3QgbG9jYWxlJiBfX2xvYyk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgfnBhdGgoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBhc3NpZ25tZW50cworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYXRoJiBvcGVyYXRvcj0oY29uc3QgcGF0aCYgX19wKSB7CisgICAgICAgIF9fcG5fID0gX19wLl9fcG5fOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhdGgmIG9wZXJhdG9yPShwYXRoJiYgX19wKSBfTk9FWENFUFQgeworICAgICAgICBfX3BuXyA9IF9WU1REOjptb3ZlKF9fcC5fX3BuXyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgPSB2b2lkPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYXRoJiBvcGVyYXRvcj0oc3RyaW5nX3R5cGUmJiBfX3MpIF9OT0VYQ0VQVCB7CisgICAgICAgIF9fcG5fID0gX1ZTVEQ6Om1vdmUoX19zKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYXRoJiBhc3NpZ24oc3RyaW5nX3R5cGUmJiBfX3MpIF9OT0VYQ0VQVCB7CisgICAgICAgIF9fcG5fID0gX1ZTVEQ6Om1vdmUoX19zKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfU291cmNlPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfRW5hYmxlSWZQYXRoYWJsZTxfU291cmNlPgorICAgIG9wZXJhdG9yPShjb25zdCBfU291cmNlJiBfX3NyYykKKyAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oX19zcmMpOyB9CisKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfU291cmNlPgorICAgIF9FbmFibGVJZlBhdGhhYmxlPF9Tb3VyY2U+CisgICAgYXNzaWduKGNvbnN0IF9Tb3VyY2UmIF9fc3JjKSB7CisgICAgICAgIF9fcG5fLmNsZWFyKCk7CisgICAgICAgIF9Tb3VyY2VDVlQ8X1NvdXJjZT46Ol9fYXBwZW5kX3NvdXJjZShfX3BuXywgX19zcmMpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0PgorICAgIHBhdGgmIGFzc2lnbihfSW5wdXRJdCBfX2ZpcnN0LCBfSW5wdXRJdCBfX2xhc3QpIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXQ+Ojp2YWx1ZV90eXBlIF9JdFZhbDsKKyAgICAgICAgX19wbl8uY2xlYXIoKTsKKyAgICAgICAgX1BhdGhDVlQ8X0l0VmFsPjo6X19hcHBlbmRfcmFuZ2UoX19wbl8sIF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdGVtcGxhdGUgPGNsYXNzIF9FQ2hhclQ+CisgICAgdm9pZCBfX2FwcGVuZF9zZXBfaWZfbmVlZGVkKF9FQ2hhclQgX19maXJzdF9vcl9udWxsKSB7CisgICAgICAgIGNvbnN0IF9FQ2hhclQgX19udWxsX3ZhbCA9IHt9OworICAgICAgICBib29sIF9fYXBwZW5kX3NlcCA9ICFlbXB0eSgpICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFfX2lzX3NlcGFyYXRvcihfX3BuXy5iYWNrKCkpICAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmlyc3Rfb3JfbnVsbCAhPSBfX251bGxfdmFsICAmJiAvLyBub24tZW1wdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhX19pc19zZXBhcmF0b3IoX19maXJzdF9vcl9udWxsKTsKKyAgICAgICAgaWYgKF9fYXBwZW5kX3NlcCkKKyAgICAgICAgICAgIF9fcG5fICs9IHByZWZlcnJlZF9zZXBhcmF0b3I7CisgICAgfQorCitwdWJsaWM6CisgICAgLy8gYXBwZW5kcworICAgIHBhdGgmIG9wZXJhdG9yLz0oY29uc3QgcGF0aCYgX19wKSB7CisgICAgICAgIF9MSUJDUFBfQVNTRVJUKCFfX3AuaGFzX3Jvb3RfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYXBwZW5kIHRvIGEgcGF0aCB3aXRoIGEgcm9vdCBuYW1lIik7CisgICAgICAgIF9fYXBwZW5kX3NlcF9pZl9uZWVkZWQoX19wLmVtcHR5KCkgPyBjaGFye30gOiBfX3AuX19wbl9bMF0pOworICAgICAgICBfX3BuXyArPSBfX3AubmF0aXZlKCk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1NvdXJjZT4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX0VuYWJsZUlmUGF0aGFibGU8X1NvdXJjZT4KKyAgICBvcGVyYXRvci89KGNvbnN0IF9Tb3VyY2UmIF9fc3JjKSB7CisgICAgICAgIHJldHVybiB0aGlzLT5hcHBlbmQoX19zcmMpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfU291cmNlPgorICAgIF9FbmFibGVJZlBhdGhhYmxlPF9Tb3VyY2U+CisgICAgYXBwZW5kKGNvbnN0IF9Tb3VyY2UmIF9fc3JjKSB7CisgICAgICAgIHVzaW5nIF9UcmFpdHMgPSBfX2lzX3BhdGhhYmxlPF9Tb3VyY2U+OworICAgICAgICB1c2luZyBfQ1ZUID0gX1BhdGhDVlQ8X1NvdXJjZUNoYXI8X1NvdXJjZT4+OworICAgICAgICBfX2FwcGVuZF9zZXBfaWZfbmVlZGVkKF9UcmFpdHM6Ol9fZmlyc3Rfb3JfbnVsbChfX3NyYykpOworICAgICAgICBfQ1ZUOjpfX2FwcGVuZF9zb3VyY2UoX19wbl8sIF9fc3JjKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdD4KKyAgICBwYXRoJiBhcHBlbmQoX0lucHV0SXQgX19maXJzdCwgX0lucHV0SXQgX19sYXN0KSB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0Pjo6dmFsdWVfdHlwZSBfSXRWYWw7CisgICAgICAgIHN0YXRpY19hc3NlcnQoX19jYW5fY29udmVydF9jaGFyPF9JdFZhbD46OnZhbHVlLCAiTXVzdCBjb252ZXJ0aWJsZSIpOworICAgICAgICB1c2luZyBfQ1ZUID0gX1BhdGhDVlQ8X0l0VmFsPjsKKyAgICAgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSB7CisgICAgICAgICAgICBfX2FwcGVuZF9zZXBfaWZfbmVlZGVkKCpfX2ZpcnN0KTsKKyAgICAgICAgICAgIF9DVlQ6Ol9fYXBwZW5kX3JhbmdlKF9fcG5fLCBfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLyBjb25jYXRlbmF0aW9uCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhdGgmIG9wZXJhdG9yKz0oY29uc3QgcGF0aCYgX194KSB7CisgICAgICAgIF9fcG5fICs9IF9feC5fX3BuXzsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYXRoJiBvcGVyYXRvcis9KGNvbnN0IHN0cmluZ190eXBlJiBfX3gpIHsKKyAgICAgICAgX19wbl8gKz0gX194OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhdGgmIG9wZXJhdG9yKz0oX19zdHJpbmdfdmlldyBfX3gpIHsKKyAgICAgICAgX19wbl8gKz0gX194OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhdGgmIG9wZXJhdG9yKz0oY29uc3QgdmFsdWVfdHlwZSogX194KSB7CisgICAgICAgIF9fcG5fICs9IF9feDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYXRoJiBvcGVyYXRvcis9KHZhbHVlX3R5cGUgX194KSB7CisgICAgICAgIF9fcG5fICs9IF9feDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRUNoYXJUPgorICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2Nhbl9jb252ZXJ0X2NoYXI8X0VDaGFyVD46OnZhbHVlLCBwYXRoJj46OnR5cGUKKyAgICBvcGVyYXRvcis9KF9FQ2hhclQgX194KQorICAgIHsKKyAgICAgICAgYmFzaWNfc3RyaW5nPF9FQ2hhclQ+IF9fdG1wOworICAgICAgICBfX3RtcCArPSBfX3g7CisgICAgICAgIF9QYXRoQ1ZUPF9FQ2hhclQ+OjpfX2FwcGVuZF9zb3VyY2UoX19wbl8sIF9fdG1wKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfU291cmNlPgorICAgIF9FbmFibGVJZlBhdGhhYmxlPF9Tb3VyY2U+CisgICAgb3BlcmF0b3IrPShjb25zdCBfU291cmNlJiBfX3gpIHsKKyAgICAgICByZXR1cm4gdGhpcy0+Y29uY2F0KF9feCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9Tb3VyY2U+CisgICAgX0VuYWJsZUlmUGF0aGFibGU8X1NvdXJjZT4KKyAgICBjb25jYXQoY29uc3QgX1NvdXJjZSYgX194KSB7CisgICAgICAgICBfU291cmNlQ1ZUPF9Tb3VyY2U+OjpfX2FwcGVuZF9zb3VyY2UoX19wbl8sIF9feCk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXQ+CisgICAgcGF0aCYgY29uY2F0KF9JbnB1dEl0IF9fZmlyc3QsIF9JbnB1dEl0IF9fbGFzdCkgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdD46OnZhbHVlX3R5cGUgX0l0VmFsOworICAgICAgICBfUGF0aENWVDxfSXRWYWw+OjpfX2FwcGVuZF9yYW5nZShfX3BuXywgX19maXJzdCwgX19sYXN0KTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vIG1vZGlmaWVycworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGNsZWFyKCkgX05PRVhDRVBUIHsKKyAgICAgICAgX19wbl8uY2xlYXIoKTsKKyAgICB9CisKKyAgICBwYXRoJiBtYWtlX3ByZWZlcnJlZCgpIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGF0aCYgcmVtb3ZlX2ZpbGVuYW1lKCkgeworICAgICAgaWYgKF9fcG5fLnNpemUoKSA9PSBfX3Jvb3RfcGF0aF9yYXcoKS5zaXplKCkpCisgICAgICAgIGNsZWFyKCk7CisgICAgICBlbHNlCisgICAgICAgIF9fcG5fID0gX19wYXJlbnRfcGF0aCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHBhdGgmIHJlcGxhY2VfZmlsZW5hbWUoY29uc3QgcGF0aCYgX19yZXBsYWNlbWVudCkgeworICAgICAgICByZW1vdmVfZmlsZW5hbWUoKTsKKyAgICAgICAgcmV0dXJuICgqdGhpcyAvPSBfX3JlcGxhY2VtZW50KTsKKyAgICB9CisKKyAgICBwYXRoJiByZXBsYWNlX2V4dGVuc2lvbihjb25zdCBwYXRoJiBfX3JlcGxhY2VtZW50ID0gcGF0aCgpKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkICBzd2FwKHBhdGgmIF9fcmhzKSBfTk9FWENFUFQgeworICAgICAgICBfX3BuXy5zd2FwKF9fcmhzLl9fcG5fKTsKKyAgICB9CisKKyAgICAvLyBuYXRpdmUgZm9ybWF0IG9ic2VydmVycworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdCBzdHJpbmdfdHlwZSYgbmF0aXZlKCkgY29uc3QgX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuIF9fcG5fOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdCB2YWx1ZV90eXBlKiBjX3N0cigpIGNvbnN0IF9OT0VYQ0VQVCB7IHJldHVybiBfX3BuXy5jX3N0cigpOyB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIG9wZXJhdG9yIHN0cmluZ190eXBlKCkgY29uc3QgeyByZXR1cm4gX19wbl87ICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0VDaGFyVCwgY2xhc3MgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9FQ2hhclQ+LAorICAgICAgICAgICAgICBjbGFzcyBfQWxsb2NhdG9yID0gYWxsb2NhdG9yPF9FQ2hhclQ+ID4KKyAgICBiYXNpY19zdHJpbmc8X0VDaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KKyAgICBzdHJpbmcoY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKSBjb25zdCB7CisgICAgICAgIHVzaW5nIF9DVlQgPSBfX3dpZGVuX2Zyb21fdXRmODxzaXplb2YoX0VDaGFyVCkqX19DSEFSX0JJVF9fPjsKKyAgICAgICAgdXNpbmcgX1N0ciA9IGJhc2ljX3N0cmluZzxfRUNoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjsKKyAgICAgICAgX1N0ciBfX3MoX19hKTsKKyAgICAgICAgX19zLnJlc2VydmUoX19wbl8uc2l6ZSgpKTsKKyAgICAgICAgX0NWVCgpKGJhY2tfaW5zZXJ0ZXIoX19zKSwgX19wbl8uZGF0YSgpLCBfX3BuXy5kYXRhKCkgKyBfX3BuXy5zaXplKCkpOworICAgICAgICByZXR1cm4gX19zOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RkOjpzdHJpbmcgICAgc3RyaW5nKCkgICAgY29uc3QgeyByZXR1cm4gX19wbl87IH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0ZDo6d3N0cmluZyAgIHdzdHJpbmcoKSAgIGNvbnN0IHsgcmV0dXJuIHN0cmluZzx3Y2hhcl90PigpOyB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGQ6OnN0cmluZyAgICB1OHN0cmluZygpICBjb25zdCB7IHJldHVybiBfX3BuXzsgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RkOjp1MTZzdHJpbmcgdTE2c3RyaW5nKCkgY29uc3QgeyByZXR1cm4gc3RyaW5nPGNoYXIxNl90PigpOyB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGQ6OnUzMnN0cmluZyB1MzJzdHJpbmcoKSBjb25zdCB7IHJldHVybiBzdHJpbmc8Y2hhcjMyX3Q+KCk7IH0KKworICAgIC8vIGdlbmVyaWMgZm9ybWF0IG9ic2VydmVycworICAgIHRlbXBsYXRlIDxjbGFzcyBfRUNoYXJULCBjbGFzcyBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0VDaGFyVD4sCisgICAgICAgICAgICAgIGNsYXNzIF9BbGxvY2F0b3IgPSBhbGxvY2F0b3I8X0VDaGFyVD4KKyAgICA+CisgICAgYmFzaWNfc3RyaW5nPF9FQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+CisgICAgZ2VuZXJpY19zdHJpbmcoY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdHJpbmc8X0VDaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4oX19hKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyAgICBnZW5lcmljX3N0cmluZygpICAgIGNvbnN0IHsgcmV0dXJuIF9fcG5fOyB9CisgICAgc3RkOjp3c3RyaW5nICAgZ2VuZXJpY193c3RyaW5nKCkgICBjb25zdCB7IHJldHVybiBzdHJpbmc8d2NoYXJfdD4oKTsgfQorICAgIHN0ZDo6c3RyaW5nICAgIGdlbmVyaWNfdThzdHJpbmcoKSAgY29uc3QgeyByZXR1cm4gX19wbl87IH0KKyAgICBzdGQ6OnUxNnN0cmluZyBnZW5lcmljX3UxNnN0cmluZygpIGNvbnN0IHsgcmV0dXJuIHN0cmluZzxjaGFyMTZfdD4oKTsgfQorICAgIHN0ZDo6dTMyc3RyaW5nIGdlbmVyaWNfdTMyc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gc3RyaW5nPGNoYXIzMl90PigpOyB9CisKK3ByaXZhdGU6CisgICAgaW50IF9fY29tcGFyZShfX3N0cmluZ192aWV3KSBjb25zdDsKKyAgICBfX3N0cmluZ192aWV3IF9fcm9vdF9uYW1lKCkgY29uc3Q7CisgICAgX19zdHJpbmdfdmlldyBfX3Jvb3RfZGlyZWN0b3J5KCkgY29uc3Q7CisgICAgX19zdHJpbmdfdmlldyBfX3Jvb3RfcGF0aF9yYXcoKSBjb25zdDsKKyAgICBfX3N0cmluZ192aWV3IF9fcmVsYXRpdmVfcGF0aCgpIGNvbnN0OworICAgIF9fc3RyaW5nX3ZpZXcgX19wYXJlbnRfcGF0aCgpIGNvbnN0OworICAgIF9fc3RyaW5nX3ZpZXcgX19maWxlbmFtZSgpIGNvbnN0OworICAgIF9fc3RyaW5nX3ZpZXcgX19zdGVtKCkgY29uc3Q7CisgICAgX19zdHJpbmdfdmlldyBfX2V4dGVuc2lvbigpIGNvbnN0OworCitwdWJsaWM6CisgICAgLy8gY29tcGFyZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW50IGNvbXBhcmUoY29uc3QgcGF0aCYgX19wKSBjb25zdCBfTk9FWENFUFQgeyByZXR1cm4gX19jb21wYXJlKF9fcC5fX3BuXyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW50IGNvbXBhcmUoY29uc3Qgc3RyaW5nX3R5cGUmIF9fcykgY29uc3QgeyByZXR1cm4gX19jb21wYXJlKF9fcyk7IH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGludCBjb21wYXJlKF9fc3RyaW5nX3ZpZXcgX19zKSBjb25zdCB7IHJldHVybiBfX2NvbXBhcmUoX19zKTsgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW50IGNvbXBhcmUoY29uc3QgdmFsdWVfdHlwZSogX19zKSBjb25zdCAgeyByZXR1cm4gX19jb21wYXJlKF9fcyk7IH0KKworICAgIC8vIGRlY29tcG9zaXRpb24KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHBhdGggcm9vdF9uYW1lKCkgICAgICBjb25zdCB7IHJldHVybiAgc3RyaW5nX3R5cGUoX19yb290X25hbWUoKSk7IH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHBhdGggcm9vdF9kaXJlY3RvcnkoKSBjb25zdCB7IHJldHVybiAgc3RyaW5nX3R5cGUoX19yb290X2RpcmVjdG9yeSgpKTsgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcGF0aCByb290X3BhdGgoKSAgICAgIGNvbnN0IHsgcmV0dXJuIHJvb3RfbmFtZSgpLmFwcGVuZChzdHJpbmdfdHlwZShfX3Jvb3RfZGlyZWN0b3J5KCkpKTsgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcGF0aCByZWxhdGl2ZV9wYXRoKCkgIGNvbnN0IHsgcmV0dXJuIHN0cmluZ190eXBlKF9fcmVsYXRpdmVfcGF0aCgpKTsgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcGF0aCBwYXJlbnRfcGF0aCgpICAgIGNvbnN0IHsgcmV0dXJuIHN0cmluZ190eXBlKF9fcGFyZW50X3BhdGgoKSk7IH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHBhdGggZmlsZW5hbWUoKSAgICAgICBjb25zdCB7IHJldHVybiBzdHJpbmdfdHlwZShfX2ZpbGVuYW1lKCkpOyB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBwYXRoIHN0ZW0oKSAgICAgICAgICAgY29uc3QgeyByZXR1cm4gc3RyaW5nX3R5cGUoX19zdGVtKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHBhdGggZXh0ZW5zaW9uKCkgICAgICBjb25zdCB7IHJldHVybiBzdHJpbmdfdHlwZShfX2V4dGVuc2lvbigpKTsgfQorCisgICAgLy8gcXVlcnkKKyAgICBfTElCQ1BQX05PRElTQ0FSRF9BRlRFUl9DWFgxNyBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIAorICAgIGJvb2wgZW1wdHkoKSBjb25zdCBfTk9FWENFUFQgeyByZXR1cm4gX19wbl8uZW1wdHkoKTsgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBib29sIGhhc19yb290X25hbWUoKSAgICAgIGNvbnN0IHsgcmV0dXJuICFfX3Jvb3RfbmFtZSgpLmVtcHR5KCk7IH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJvb2wgaGFzX3Jvb3RfZGlyZWN0b3J5KCkgY29uc3QgeyByZXR1cm4gIV9fcm9vdF9kaXJlY3RvcnkoKS5lbXB0eSgpOyB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBib29sIGhhc19yb290X3BhdGgoKSAgICAgIGNvbnN0IHsgcmV0dXJuICFfX3Jvb3RfcGF0aF9yYXcoKS5lbXB0eSgpOyB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBib29sIGhhc19yZWxhdGl2ZV9wYXRoKCkgIGNvbnN0IHsgcmV0dXJuICFfX3JlbGF0aXZlX3BhdGgoKS5lbXB0eSgpOyB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBib29sIGhhc19wYXJlbnRfcGF0aCgpICAgIGNvbnN0IHsgcmV0dXJuICFfX3BhcmVudF9wYXRoKCkuZW1wdHkoKTsgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYm9vbCBoYXNfZmlsZW5hbWUoKSAgICAgICBjb25zdCB7IHJldHVybiAhX19maWxlbmFtZSgpLmVtcHR5KCk7IH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJvb2wgaGFzX3N0ZW0oKSAgICAgICAgICAgY29uc3QgeyByZXR1cm4gIV9fc3RlbSgpLmVtcHR5KCk7IH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJvb2wgaGFzX2V4dGVuc2lvbigpICAgICAgY29uc3QgeyByZXR1cm4gIV9fZXh0ZW5zaW9uKCkuZW1wdHkoKTsgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBib29sIGlzX2Fic29sdXRlKCkgICAgICAgIGNvbnN0IHsgcmV0dXJuIGhhc19yb290X2RpcmVjdG9yeSgpOyB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBib29sIGlzX3JlbGF0aXZlKCkgICAgICAgIGNvbnN0IHsgcmV0dXJuICFpc19hYnNvbHV0ZSgpOyB9CisKKyAgICAvLyBpdGVyYXRvcnMKKyAgICBjbGFzcyBfTElCQ1BQX1RZUEVfVklTIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0OworICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0OworCisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBmcmllbmQgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX3NhbWU8X0NoYXJULCBjaGFyPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgaXNfc2FtZTxfVHJhaXRzLCBjaGFyX3RyYWl0czxjaGFyPj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgPjo6dHlwZQorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBwYXRoJiBfX3ApIHsKKyAgICAgICAgX19vcyA8PCBzdGQ6Ol9fcXVvdGVkKF9fcC5uYXRpdmUoKSk7CisgICAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGZyaWVuZCB0eXBlbmFtZSBlbmFibGVfaWY8IWlzX3NhbWU8X0NoYXJULCBjaGFyPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIWlzX3NhbWU8X1RyYWl0cywgY2hhcl90cmFpdHM8Y2hhcj4+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgID46OnR5cGUKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgY29uc3QgcGF0aCYgX19wKSB7CisgICAgICAgIF9fb3MgPDwgc3RkOjpfX3F1b3RlZChfX3Auc3RyaW5nPF9DaGFyVCwgX1RyYWl0cz4oKSk7CisgICAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGZyaWVuZCBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIHBhdGgmIF9fcCkKKyAgICB7CisgICAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHM+IF9fdG1wOworICAgICAgICBfX2lzID4+IF9fcXVvdGVkKF9fdG1wKTsKKyAgICAgICAgX19wID0gX190bXA7CisgICAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhdGgmIF9fYXNzaWduX3ZpZXcoX19zdHJpbmdfdmlldyBjb25zdCYgX19zKSBub2V4Y2VwdCB7IF9fcG5fID0gc3RyaW5nX3R5cGUoX19zKTsgcmV0dXJuICp0aGlzOyB9CisgICAgc3RyaW5nX3R5cGUgX19wbl87Cit9OworCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCit2b2lkIHN3YXAocGF0aCYgX19saHMsIHBhdGgmIF9fcmhzKSBfTk9FWENFUFQgeworICAgIF9fbGhzLnN3YXAoX19yaHMpOworfQorCitfTElCQ1BQX0ZVTkNfVklTCitzaXplX3QgaGFzaF92YWx1ZShjb25zdCBwYXRoJiBfX3ApIF9OT0VYQ0VQVDsKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBwYXRoJiBfX2xocywgY29uc3QgcGF0aCYgX19yaHMpIF9OT0VYQ0VQVAoreyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPT0gMDsgfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBvcGVyYXRvciE9KGNvbnN0IHBhdGgmIF9fbGhzLCBjb25zdCBwYXRoJiBfX3JocykgX05PRVhDRVBUCit7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSAhPSAwOyB9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIG9wZXJhdG9yPChjb25zdCBwYXRoJiBfX2xocywgY29uc3QgcGF0aCYgX19yaHMpIF9OT0VYQ0VQVAoreyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPCAwOyB9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIG9wZXJhdG9yPD0oY29uc3QgcGF0aCYgX19saHMsIGNvbnN0IHBhdGgmIF9fcmhzKSBfTk9FWENFUFQKK3sgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpIDw9IDA7IH0KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3I+KGNvbnN0IHBhdGgmIF9fbGhzLCBjb25zdCBwYXRoJiBfX3JocykgX05PRVhDRVBUCit7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+IDA7IH0KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3I+PShjb25zdCBwYXRoJiBfX2xocywgY29uc3QgcGF0aCYgX19yaHMpIF9OT0VYQ0VQVAoreyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPj0gMDsgfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorcGF0aCBvcGVyYXRvci8oY29uc3QgcGF0aCYgX19saHMsIGNvbnN0IHBhdGgmIF9fcmhzKSB7CisgICAgcmV0dXJuIHBhdGgoX19saHMpIC89IF9fcmhzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1NvdXJjZT4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3BhdGhhYmxlPF9Tb3VyY2U+Ojp2YWx1ZSwgcGF0aD46OnR5cGUKK3U4cGF0aChjb25zdCBfU291cmNlJiBfX3MpeworICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTx0eXBlbmFtZSBfX2lzX3BhdGhhYmxlPF9Tb3VyY2U+OjpfX2NoYXJfdHlwZSwgY2hhcj46OnZhbHVlLAorICAgICAgICAidThwYXRoKFNvdXJjZSBjb25zdCYpIHJlcXVpcmVzIFNvdXJjZSBoYXZlIGEgY2hhcmFjdGVyIHR5cGUgb2YgdHlwZSAnY2hhciciKTsKKyAgICByZXR1cm4gcGF0aChfX3MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXQ+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWY8X19pc19wYXRoYWJsZTxfSW5wdXRJdD46OnZhbHVlLCBwYXRoPjo6dHlwZQordThwYXRoKF9JbnB1dEl0IF9fZiwgX0lucHV0SXQgX19sKSB7CisgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPHR5cGVuYW1lIF9faXNfcGF0aGFibGU8X0lucHV0SXQ+OjpfX2NoYXJfdHlwZSwgY2hhcj46OnZhbHVlLAorICAgICAgICAidThwYXRoKEl0ZXIsIEl0ZXIpIHJlcXVpcmVzIEl0ZXIgaGF2ZSBhIHZhbHVlX3R5cGUgb2YgdHlwZSAnY2hhciciKTsKKyAgICByZXR1cm4gcGF0aChfX2YsIF9fbCk7Cit9CisKK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgcGF0aDo6aXRlcmF0b3IKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgdHlwZWRlZiBwYXRoICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgY29uc3QgcGF0aCogICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIGNvbnN0IHBhdGgmICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKworICAgIHR5cGVkZWYgdm9pZCBfX3N0YXNoaW5nX2l0ZXJhdG9yX3RhZzsgLy8gU2VlIHJldmVyc2VfaXRlcmF0b3IgYW5kIF9faXNfc3Rhc2hpbmdfaXRlcmF0b3IKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IoKSA6IF9fc3Rhc2hlZF9lbGVtXygpLCBfX3BhdGhfcHRyXyhudWxscHRyKSwKKyAgICAgICAgICAgICAgICAgX19lbnRyeV8oKSwgX19zdGF0ZV8oX19zaW5ndWxhcikge30KKworICAgIGl0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJikgPSBkZWZhdWx0OworICAgIH5pdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgIGl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgaXRlcmF0b3ImKSA9IGRlZmF1bHQ7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9fc3Rhc2hlZF9lbGVtXzsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeworICAgICAgICByZXR1cm4gJl9fc3Rhc2hlZF9lbGVtXzsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fc3RhdGVfICE9IF9fc2luZ3VsYXIsCisgICAgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0aW5nIHRvIGluY3JlbWVudCBhIHNpbmd1bGFyIGl0ZXJhdG9yIik7CisgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fc3RhdGVfICE9IF9fYXRfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0aW5nIHRvIGluY3JlbWVudCB0aGUgZW5kIGl0ZXJhdG9yIik7CisgICAgICAgIHJldHVybiBfX2luY3JlbWVudCgpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgICAgICBpdGVyYXRvciBfX2l0KCp0aGlzKTsKKyAgICAgICAgdGhpcy0+b3BlcmF0b3IrKygpOworICAgICAgICByZXR1cm4gX19pdDsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3ImIG9wZXJhdG9yLS0oKSB7CisgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fc3RhdGVfICE9IF9fc2luZ3VsYXIsCisgICAgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0aW5nIHRvIGRlY3JlbWVudCBhIHNpbmd1bGFyIGl0ZXJhdG9yIik7CisgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fZW50cnlfLmRhdGEoKSAhPSBfX3BhdGhfcHRyXy0+bmF0aXZlKCkuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdGluZyB0byBkZWNyZW1lbnQgdGhlIGJlZ2luIGl0ZXJhdG9yIik7CisgICAgICAgIHJldHVybiBfX2RlY3JlbWVudCgpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBvcGVyYXRvci0tKGludCkgeworICAgICAgICBpdGVyYXRvciBfX2l0KCp0aGlzKTsKKyAgICAgICAgdGhpcy0+b3BlcmF0b3ItLSgpOworICAgICAgICByZXR1cm4gX19pdDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIHBhdGg7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGNoYXIgX19zaW5ndWxhciA9IDA7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBjaGFyIF9fYXRfZW5kID0gNjsKKworICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYsIGNvbnN0IGl0ZXJhdG9yJik7CisKKyAgICBpdGVyYXRvciYgX19pbmNyZW1lbnQoKTsKKyAgICBpdGVyYXRvciYgX19kZWNyZW1lbnQoKTsKKworICAgIHBhdGggX19zdGFzaGVkX2VsZW1fOworICAgIGNvbnN0IHBhdGgqIF9fcGF0aF9wdHJfOworICAgIHBhdGg6Ol9fc3RyaW5nX3ZpZXcgX19lbnRyeV87CisgICAgdW5zaWduZWQgY2hhciBfX3N0YXRlXzsKK307CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIG9wZXJhdG9yPT0oY29uc3QgcGF0aDo6aXRlcmF0b3ImIF9fbGhzLCBjb25zdCBwYXRoOjppdGVyYXRvciYgX19yaHMpIHsKKyAgICByZXR1cm4gX19saHMuX19wYXRoX3B0cl8gPT0gX19yaHMuX19wYXRoX3B0cl8gJiYKKyAgICAgICAgICAgX19saHMuX19lbnRyeV8uZGF0YSgpID09IF9fcmhzLl9fZW50cnlfLmRhdGEoKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBwYXRoOjppdGVyYXRvciYgX19saHMsIGNvbnN0IHBhdGg6Oml0ZXJhdG9yJiBfX3JocykgeworICAgIHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsKK30KKworY2xhc3MgX0xJQkNQUF9FWENFUFRJT05fQUJJIGZpbGVzeXN0ZW1fZXJyb3IgOiBwdWJsaWMgc3lzdGVtX2Vycm9yCit7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGZpbGVzeXN0ZW1fZXJyb3IoY29uc3Qgc3RyaW5nJiBfX3doYXQsIGVycm9yX2NvZGUgX19lYykKKyAgICAgICAgOiBzeXN0ZW1fZXJyb3IoX19lYywgX193aGF0KSwKKyAgICAgICAgICBfX3BhdGhzXyhtYWtlX3NoYXJlZDxfU3RvcmFnZT4ocGF0aCgpLCBwYXRoKCkpKQorICAgIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZmlsZXN5c3RlbV9lcnJvcihjb25zdCBzdHJpbmcmIF9fd2hhdCwgY29uc3QgcGF0aCYgX19wMSwgZXJyb3JfY29kZSBfX2VjKQorICAgICAgICA6IHN5c3RlbV9lcnJvcihfX2VjLCBfX3doYXQpLAorICAgICAgICBfX3BhdGhzXyhtYWtlX3NoYXJlZDxfU3RvcmFnZT4oX19wMSwgcGF0aCgpKSkKKyAgICB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGZpbGVzeXN0ZW1fZXJyb3IoY29uc3Qgc3RyaW5nJiBfX3doYXQsIGNvbnN0IHBhdGgmIF9fcDEsIGNvbnN0IHBhdGgmIF9fcDIsCisgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlIF9fZWMpCisgICAgICAgIDogc3lzdGVtX2Vycm9yKF9fZWMsIF9fd2hhdCksCisgICAgICAgICAgX19wYXRoc18obWFrZV9zaGFyZWQ8X1N0b3JhZ2U+KF9fcDEsIF9fcDIpKQorICAgIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgcGF0aCYgcGF0aDEoKSBjb25zdCBfTk9FWENFUFQgeworICAgICAgICByZXR1cm4gX19wYXRoc18tPmZpcnN0OworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdCBwYXRoJiBwYXRoMigpIGNvbnN0IF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBfX3BhdGhzXy0+c2Vjb25kOworICAgIH0KKworICAgIH5maWxlc3lzdGVtX2Vycm9yKCkgb3ZlcnJpZGU7IC8vIGtleSBmdW5jdGlvbgorCisgICAgLy8gVE9ETyhlcmljd2YpOiBDcmVhdGUgYSBjdXN0b20gZXJyb3IgbWVzc2FnZS4KKyAgICAvL2NvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBfTk9FWENFUFQ7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBwYWlyPHBhdGgsIHBhdGg+IF9TdG9yYWdlOworICAgIHNoYXJlZF9wdHI8X1N0b3JhZ2U+IF9fcGF0aHNfOworfTsKKwordGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorX0xJQkNQUF9OT1JFVFVSTiBpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUwordm9pZCBfX3Rocm93X2ZpbGVzeXN0ZW1fZXJyb3IoX0FyZ3MgJiYgLi4uX19hcmdzKQoreworICAgIHRocm93IGZpbGVzeXN0ZW1fZXJyb3Ioc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKK30KKyNlbHNlCit2b2lkIF9fdGhyb3dfZmlsZXN5c3RlbV9lcnJvcihfQXJncyYmLi4uKQoreworICAgIF9WU1REOjphYm9ydCgpOworfQorI2VuZGlmCisKKworLy8gb3BlcmF0aW9uYWwgZnVuY3Rpb25zCisKK19MSUJDUFBfRlVOQ19WSVMKK3BhdGggX19jYW5vbmljYWwoY29uc3QgcGF0aCYsIGNvbnN0IHBhdGgmLCBlcnJvcl9jb2RlICpfX2VjPW51bGxwdHIpOworX0xJQkNQUF9GVU5DX1ZJUwordm9pZCBfX2NvcHkoY29uc3QgcGF0aCYgX19mcm9tLCBjb25zdCBwYXRoJiBfX3RvLCBjb3B5X29wdGlvbnMgX19vcHQsCisgICAgICAgIGVycm9yX2NvZGUgKl9fZWM9bnVsbHB0cik7CitfTElCQ1BQX0ZVTkNfVklTCitib29sIF9fY29weV9maWxlKGNvbnN0IHBhdGgmIF9fZnJvbSwgY29uc3QgcGF0aCYgX190bywgY29weV9vcHRpb25zIF9fb3B0LAorICAgICAgICBlcnJvcl9jb2RlICpfX2VjPW51bGxwdHIpOworX0xJQkNQUF9GVU5DX1ZJUwordm9pZCBfX2NvcHlfc3ltbGluayhjb25zdCBwYXRoJiBfX2V4aXN0aW5nX3N5bWxpbmssIGNvbnN0IHBhdGgmIF9fbmV3X3N5bWxpbmssCisgICAgICAgIGVycm9yX2NvZGUgKl9fZWM9bnVsbHB0cik7CitfTElCQ1BQX0ZVTkNfVklTCitib29sIF9fY3JlYXRlX2RpcmVjdG9yaWVzKGNvbnN0IHBhdGgmIHAsIGVycm9yX2NvZGUgKmVjPW51bGxwdHIpOworX0xJQkNQUF9GVU5DX1ZJUworYm9vbCBfX2NyZWF0ZV9kaXJlY3RvcnkoY29uc3QgcGF0aCYgcCwgZXJyb3JfY29kZSAqZWM9bnVsbHB0cik7CitfTElCQ1BQX0ZVTkNfVklTCitib29sIF9fY3JlYXRlX2RpcmVjdG9yeShjb25zdCBwYXRoJiBwLCBjb25zdCBwYXRoICYgYXR0cmlidXRlcywKKyAgICAgICAgZXJyb3JfY29kZSAqZWM9bnVsbHB0cik7CitfTElCQ1BQX0ZVTkNfVklTCit2b2lkIF9fY3JlYXRlX2RpcmVjdG9yeV9zeW1saW5rKGNvbnN0IHBhdGgmIF9fdG8sIGNvbnN0IHBhdGgmIF9fbmV3X3N5bWxpbmssCisgICAgICAgIGVycm9yX2NvZGUgKl9fZWM9bnVsbHB0cik7CitfTElCQ1BQX0ZVTkNfVklTCit2b2lkIF9fY3JlYXRlX2hhcmRfbGluayhjb25zdCBwYXRoJiBfX3RvLCBjb25zdCBwYXRoJiBfX25ld19oYXJkX2xpbmssCisgICAgICAgIGVycm9yX2NvZGUgKl9fZWM9bnVsbHB0cik7CitfTElCQ1BQX0ZVTkNfVklTCit2b2lkIF9fY3JlYXRlX3N5bWxpbmsoY29uc3QgcGF0aCYgX190bywgY29uc3QgcGF0aCYgX19uZXdfc3ltbGluaywKKyAgICAgICAgZXJyb3JfY29kZSAqX19lYz1udWxscHRyKTsKK19MSUJDUFBfRlVOQ19WSVMKK3BhdGggX19jdXJyZW50X3BhdGgoZXJyb3JfY29kZSAqX19lYz1udWxscHRyKTsKK19MSUJDUFBfRlVOQ19WSVMKK3ZvaWQgX19jdXJyZW50X3BhdGgoY29uc3QgcGF0aCYsIGVycm9yX2NvZGUgKl9fZWM9bnVsbHB0cik7CitfTElCQ1BQX0ZVTkNfVklTCitib29sIF9fZXF1aXZhbGVudChjb25zdCBwYXRoJiwgY29uc3QgcGF0aCYsIGVycm9yX2NvZGUgKl9fZWM9bnVsbHB0cik7CitfTElCQ1BQX0ZVTkNfVklTCit1aW50bWF4X3QgX19maWxlX3NpemUoY29uc3QgcGF0aCYsIGVycm9yX2NvZGUgKl9fZWM9bnVsbHB0cik7CitfTElCQ1BQX0ZVTkNfVklTCit1aW50bWF4X3QgX19oYXJkX2xpbmtfY291bnQoY29uc3QgcGF0aCYsIGVycm9yX2NvZGUgKl9fZWM9bnVsbHB0cik7CitfTElCQ1BQX0ZVTkNfVklTCitib29sIF9fZnNfaXNfZW1wdHkoY29uc3QgcGF0aCYgcCwgZXJyb3JfY29kZSAqZWM9bnVsbHB0cik7CitfTElCQ1BQX0ZVTkNfVklTCitmaWxlX3RpbWVfdHlwZSBfX2xhc3Rfd3JpdGVfdGltZShjb25zdCBwYXRoJiBwLCBlcnJvcl9jb2RlICplYz1udWxscHRyKTsKK19MSUJDUFBfRlVOQ19WSVMKK3ZvaWQgX19sYXN0X3dyaXRlX3RpbWUoY29uc3QgcGF0aCYgcCwgZmlsZV90aW1lX3R5cGUgbmV3X3RpbWUsCisgICAgICAgIGVycm9yX2NvZGUgKmVjPW51bGxwdHIpOworX0xJQkNQUF9GVU5DX1ZJUwordm9pZCBfX3Blcm1pc3Npb25zKGNvbnN0IHBhdGgmLCBwZXJtcywgcGVybV9vcHRpb25zLCBlcnJvcl9jb2RlKiA9IG51bGxwdHIpOworX0xJQkNQUF9GVU5DX1ZJUworcGF0aCBfX3JlYWRfc3ltbGluayhjb25zdCBwYXRoJiBwLCBlcnJvcl9jb2RlICplYz1udWxscHRyKTsKK19MSUJDUFBfRlVOQ19WSVMKK2Jvb2wgX19yZW1vdmUoY29uc3QgcGF0aCYgcCwgZXJyb3JfY29kZSAqZWM9bnVsbHB0cik7CitfTElCQ1BQX0ZVTkNfVklTCit1aW50bWF4X3QgX19yZW1vdmVfYWxsKGNvbnN0IHBhdGgmIHAsIGVycm9yX2NvZGUgKmVjPW51bGxwdHIpOworX0xJQkNQUF9GVU5DX1ZJUwordm9pZCBfX3JlbmFtZShjb25zdCBwYXRoJiBmcm9tLCBjb25zdCBwYXRoJiB0bywgZXJyb3JfY29kZSAqZWM9bnVsbHB0cik7CitfTElCQ1BQX0ZVTkNfVklTCit2b2lkIF9fcmVzaXplX2ZpbGUoY29uc3QgcGF0aCYgcCwgdWludG1heF90IHNpemUsIGVycm9yX2NvZGUgKmVjPW51bGxwdHIpOworX0xJQkNQUF9GVU5DX1ZJUworc3BhY2VfaW5mbyBfX3NwYWNlKGNvbnN0IHBhdGgmLCBlcnJvcl9jb2RlICpfX2VjPW51bGxwdHIpOworX0xJQkNQUF9GVU5DX1ZJUworZmlsZV9zdGF0dXMgX19zdGF0dXMoY29uc3QgcGF0aCYsIGVycm9yX2NvZGUgKl9fZWM9bnVsbHB0cik7CitfTElCQ1BQX0ZVTkNfVklTCitmaWxlX3N0YXR1cyBfX3N5bWxpbmtfc3RhdHVzKGNvbnN0IHBhdGgmLCBlcnJvcl9jb2RlICpfX2VjPW51bGxwdHIpOworX0xJQkNQUF9GVU5DX1ZJUworcGF0aCBfX3N5c3RlbV9jb21wbGV0ZShjb25zdCBwYXRoJiwgZXJyb3JfY29kZSAqX19lYz1udWxscHRyKTsKK19MSUJDUFBfRlVOQ19WSVMKK3BhdGggX190ZW1wX2RpcmVjdG9yeV9wYXRoKGVycm9yX2NvZGUgKl9fZWM9bnVsbHB0cik7CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitwYXRoIGN1cnJlbnRfcGF0aCgpIHsKKyAgICByZXR1cm4gX19jdXJyZW50X3BhdGgoKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3BhdGggY3VycmVudF9wYXRoKGVycm9yX2NvZGUmIF9fZWMpIHsKKyAgICByZXR1cm4gX19jdXJyZW50X3BhdGgoJl9fZWMpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCBjdXJyZW50X3BhdGgoY29uc3QgcGF0aCYgX19wKSB7CisgICAgX19jdXJyZW50X3BhdGgoX19wKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQgY3VycmVudF9wYXRoKGNvbnN0IHBhdGgmIF9fcCwgZXJyb3JfY29kZSYgX19lYykgX05PRVhDRVBUIHsKKyAgICBfX2N1cnJlbnRfcGF0aChfX3AsICZfX2VjKTsKK30KKworX0xJQkNQUF9GVU5DX1ZJUworcGF0aCBhYnNvbHV0ZShjb25zdCBwYXRoJiwgY29uc3QgcGF0aCYgX19wMiA9IGN1cnJlbnRfcGF0aCgpKTsKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3BhdGggY2Fub25pY2FsKGNvbnN0IHBhdGgmIF9fcCwgY29uc3QgcGF0aCYgX19iYXNlID0gY3VycmVudF9wYXRoKCkpIHsKKyAgICByZXR1cm4gX19jYW5vbmljYWwoX19wLCBfX2Jhc2UpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorcGF0aCBjYW5vbmljYWwoY29uc3QgcGF0aCYgX19wLCBlcnJvcl9jb2RlJiBfX2VjKSB7CisgICAgcGF0aCBfX2Jhc2UgPSBfX2N1cnJlbnRfcGF0aCgmX19lYyk7CisgICAgaWYgKF9fZWMpIHJldHVybiB7fTsKKyAgICByZXR1cm4gX19jYW5vbmljYWwoX19wLCBfX2Jhc2UsICZfX2VjKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3BhdGggY2Fub25pY2FsKGNvbnN0IHBhdGgmIF9fcCwgY29uc3QgcGF0aCYgX19iYXNlLCBlcnJvcl9jb2RlJiBfX2VjKSB7CisgICAgcmV0dXJuIF9fY2Fub25pY2FsKF9fcCwgX19iYXNlLCAmX19lYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIGNvcHkoY29uc3QgcGF0aCYgX19mcm9tLCBjb25zdCBwYXRoJiBfX3RvKSB7CisgICAgX19jb3B5KF9fZnJvbSwgX190bywgY29weV9vcHRpb25zOjpub25lKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQgY29weShjb25zdCBwYXRoJiBfX2Zyb20sIGNvbnN0IHBhdGgmIF9fdG8sIGVycm9yX2NvZGUmIF9fZWMpIHsKKyAgICBfX2NvcHkoX19mcm9tLCBfX3RvLCBjb3B5X29wdGlvbnM6Om5vbmUsICZfX2VjKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQgY29weShjb25zdCBwYXRoJiBfX2Zyb20sIGNvbnN0IHBhdGgmIF9fdG8sIGNvcHlfb3B0aW9ucyBfX29wdCkgeworICAgIF9fY29weShfX2Zyb20sIF9fdG8sIF9fb3B0KTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQgY29weShjb25zdCBwYXRoJiBfX2Zyb20sIGNvbnN0IHBhdGgmIF9fdG8sCisgICAgICAgICAgY29weV9vcHRpb25zIF9fb3B0LCBlcnJvcl9jb2RlJiBfX2VjKSB7CisgICAgX19jb3B5KF9fZnJvbSwgX190bywgX19vcHQsICZfX2VjKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgY29weV9maWxlKGNvbnN0IHBhdGgmIF9fZnJvbSwgY29uc3QgcGF0aCYgX190bykgeworICAgIHJldHVybiBfX2NvcHlfZmlsZShfX2Zyb20sIF9fdG8sIGNvcHlfb3B0aW9uczo6bm9uZSk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIGNvcHlfZmlsZShjb25zdCBwYXRoJiBfX2Zyb20sIGNvbnN0IHBhdGgmIF9fdG8sIGVycm9yX2NvZGUmIF9fZWMpIHsKKyAgICByZXR1cm4gX19jb3B5X2ZpbGUoX19mcm9tLCBfX3RvLCBjb3B5X29wdGlvbnM6Om5vbmUsICZfX2VjKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgY29weV9maWxlKGNvbnN0IHBhdGgmIF9fZnJvbSwgY29uc3QgcGF0aCYgX190bywgY29weV9vcHRpb25zIF9fb3B0KSB7CisgICAgcmV0dXJuIF9fY29weV9maWxlKF9fZnJvbSwgX190bywgX19vcHQpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBjb3B5X2ZpbGUoY29uc3QgcGF0aCYgX19mcm9tLCBjb25zdCBwYXRoJiBfX3RvLAorICAgICAgICAgICAgICAgY29weV9vcHRpb25zIF9fb3B0LCBlcnJvcl9jb2RlJiBfX2VjKXsKKyAgICByZXR1cm4gX19jb3B5X2ZpbGUoX19mcm9tLCBfX3RvLCBfX29wdCwgJl9fZWMpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCBjb3B5X3N5bWxpbmsoY29uc3QgcGF0aCYgX19leGlzdGluZywgY29uc3QgcGF0aCYgX19uZXcpIHsKKyAgICBfX2NvcHlfc3ltbGluayhfX2V4aXN0aW5nLCBfX25ldyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIGNvcHlfc3ltbGluayhjb25zdCBwYXRoJiBfX2V4dCwgY29uc3QgcGF0aCYgX19uZXcsIGVycm9yX2NvZGUmIF9fZWMpIF9OT0VYQ0VQVCB7CisgICAgX19jb3B5X3N5bWxpbmsoX19leHQsIF9fbmV3LCAmX19lYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIGNyZWF0ZV9kaXJlY3Rvcmllcyhjb25zdCBwYXRoJiBfX3ApIHsKKyAgICByZXR1cm4gX19jcmVhdGVfZGlyZWN0b3JpZXMoX19wKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgY3JlYXRlX2RpcmVjdG9yaWVzKGNvbnN0IHBhdGgmIF9fcCwgZXJyb3JfY29kZSYgX19lYykgeworICAgIHJldHVybiBfX2NyZWF0ZV9kaXJlY3RvcmllcyhfX3AsICZfX2VjKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgY3JlYXRlX2RpcmVjdG9yeShjb25zdCBwYXRoJiBfX3ApIHsKKyAgICByZXR1cm4gX19jcmVhdGVfZGlyZWN0b3J5KF9fcCk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIGNyZWF0ZV9kaXJlY3RvcnkoY29uc3QgcGF0aCYgX19wLCBlcnJvcl9jb2RlJiBfX2VjKSBfTk9FWENFUFQgeworICAgIHJldHVybiBfX2NyZWF0ZV9kaXJlY3RvcnkoX19wLCAmX19lYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIGNyZWF0ZV9kaXJlY3RvcnkoY29uc3QgcGF0aCYgX19wLCBjb25zdCBwYXRoJiBfX2F0dHJzKSB7CisgICAgcmV0dXJuIF9fY3JlYXRlX2RpcmVjdG9yeShfX3AsIF9fYXR0cnMpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBjcmVhdGVfZGlyZWN0b3J5KGNvbnN0IHBhdGgmIF9fcCwgY29uc3QgcGF0aCYgX19hdHRycywgZXJyb3JfY29kZSYgX19lYykgX05PRVhDRVBUIHsKKyAgICByZXR1cm4gX19jcmVhdGVfZGlyZWN0b3J5KF9fcCwgX19hdHRycywgJl9fZWMpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCBjcmVhdGVfZGlyZWN0b3J5X3N5bWxpbmsoY29uc3QgcGF0aCYgX190bywgY29uc3QgcGF0aCYgX19uZXcpIHsKKyAgICBfX2NyZWF0ZV9kaXJlY3Rvcnlfc3ltbGluayhfX3RvLCBfX25ldyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIGNyZWF0ZV9kaXJlY3Rvcnlfc3ltbGluayhjb25zdCBwYXRoJiBfX3RvLCBjb25zdCBwYXRoJiBfX25ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUmIF9fZWMpIF9OT0VYQ0VQVCB7CisgICAgX19jcmVhdGVfZGlyZWN0b3J5X3N5bWxpbmsoX190bywgX19uZXcsICZfX2VjKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQgY3JlYXRlX2hhcmRfbGluayhjb25zdCBwYXRoJiBfX3RvLCBjb25zdCBwYXRoJiBfX25ldykgeworICAgIF9fY3JlYXRlX2hhcmRfbGluayhfX3RvLCBfX25ldyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIGNyZWF0ZV9oYXJkX2xpbmsoY29uc3QgcGF0aCYgX190bywgY29uc3QgcGF0aCYgX19uZXcsIGVycm9yX2NvZGUmIF9fZWMpIF9OT0VYQ0VQVCB7CisgICAgX19jcmVhdGVfaGFyZF9saW5rKF9fdG8sIF9fbmV3LCAmX19lYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIGNyZWF0ZV9zeW1saW5rKGNvbnN0IHBhdGgmIF9fdG8sIGNvbnN0IHBhdGgmIF9fbmV3KSB7CisgICAgX19jcmVhdGVfc3ltbGluayhfX3RvLCBfX25ldyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIGNyZWF0ZV9zeW1saW5rKGNvbnN0IHBhdGgmIF9fdG8sIGNvbnN0IHBhdGgmIF9fbmV3LCBlcnJvcl9jb2RlJiBfX2VjKSBfTk9FWENFUFQgeworICAgIHJldHVybiBfX2NyZWF0ZV9zeW1saW5rKF9fdG8sIF9fbmV3LCAmX19lYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIHN0YXR1c19rbm93bihmaWxlX3N0YXR1cyBfX3MpIF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuIF9fcy50eXBlKCkgIT0gZmlsZV90eXBlOjpub25lOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBleGlzdHMoZmlsZV9zdGF0dXMgX19zKSBfTk9FWENFUFQgeworICAgIHJldHVybiBzdGF0dXNfa25vd24oX19zKSAmJiBfX3MudHlwZSgpICE9IGZpbGVfdHlwZTo6bm90X2ZvdW5kOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBleGlzdHMoY29uc3QgcGF0aCYgX19wKSB7CisgICAgcmV0dXJuIGV4aXN0cyhfX3N0YXR1cyhfX3ApKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgZXhpc3RzKGNvbnN0IHBhdGgmIF9fcCwgZXJyb3JfY29kZSYgX19lYykgX05PRVhDRVBUIHsKKyAgICBhdXRvIF9fcyA9IF9fc3RhdHVzKF9fcCwgJl9fZWMpOworICAgIGlmIChzdGF0dXNfa25vd24oX19zKSkgX19lYy5jbGVhcigpOworICAgIHJldHVybiBleGlzdHMoX19zKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgZXF1aXZhbGVudChjb25zdCBwYXRoJiBfX3AxLCBjb25zdCBwYXRoJiBfX3AyKSB7CisgICAgcmV0dXJuIF9fZXF1aXZhbGVudChfX3AxLCBfX3AyKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgZXF1aXZhbGVudChjb25zdCBwYXRoJiBfX3AxLCBjb25zdCBwYXRoJiBfX3AyLCBlcnJvcl9jb2RlJiBfX2VjKSBfTk9FWENFUFQgeworICAgIHJldHVybiBfX2VxdWl2YWxlbnQoX19wMSwgX19wMiwgJl9fZWMpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordWludG1heF90IGZpbGVfc2l6ZShjb25zdCBwYXRoJiBfX3ApIHsKKyAgICByZXR1cm4gX19maWxlX3NpemUoX19wKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3VpbnRtYXhfdCBmaWxlX3NpemUoY29uc3QgcGF0aCYgX19wLCBlcnJvcl9jb2RlJiBfX2VjKSBfTk9FWENFUFQgeworICAgIHJldHVybiBfX2ZpbGVfc2l6ZShfX3AsICZfX2VjKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3VpbnRtYXhfdCBoYXJkX2xpbmtfY291bnQoY29uc3QgcGF0aCYgX19wKSB7CisgICAgcmV0dXJuIF9faGFyZF9saW5rX2NvdW50KF9fcCk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit1aW50bWF4X3QgaGFyZF9saW5rX2NvdW50KGNvbnN0IHBhdGgmIF9fcCwgZXJyb3JfY29kZSYgX19lYykgX05PRVhDRVBUIHsKKyAgICByZXR1cm4gX19oYXJkX2xpbmtfY291bnQoX19wLCAmX19lYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIGlzX2Jsb2NrX2ZpbGUoZmlsZV9zdGF0dXMgX19zKSBfTk9FWENFUFQgeworICAgIHJldHVybiBfX3MudHlwZSgpID09IGZpbGVfdHlwZTo6YmxvY2s7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIGlzX2Jsb2NrX2ZpbGUoY29uc3QgcGF0aCYgX19wKSB7CisgICAgcmV0dXJuIGlzX2Jsb2NrX2ZpbGUoX19zdGF0dXMoX19wKSk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIGlzX2Jsb2NrX2ZpbGUoY29uc3QgcGF0aCYgX19wLCBlcnJvcl9jb2RlJiBfX2VjKSBfTk9FWENFUFQgeworICAgIHJldHVybiBpc19ibG9ja19maWxlKF9fc3RhdHVzKF9fcCwgJl9fZWMpKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgaXNfY2hhcmFjdGVyX2ZpbGUoZmlsZV9zdGF0dXMgX19zKSBfTk9FWENFUFQgeworICAgIHJldHVybiBfX3MudHlwZSgpID09IGZpbGVfdHlwZTo6Y2hhcmFjdGVyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBpc19jaGFyYWN0ZXJfZmlsZShjb25zdCBwYXRoJiBfX3ApIHsKKyAgICByZXR1cm4gaXNfY2hhcmFjdGVyX2ZpbGUoX19zdGF0dXMoX19wKSk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIGlzX2NoYXJhY3Rlcl9maWxlKGNvbnN0IHBhdGgmIF9fcCwgZXJyb3JfY29kZSYgX19lYykgX05PRVhDRVBUIHsKKyAgICByZXR1cm4gaXNfY2hhcmFjdGVyX2ZpbGUoX19zdGF0dXMoX19wLCAmX19lYykpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBpc19kaXJlY3RvcnkoZmlsZV9zdGF0dXMgX19zKSBfTk9FWENFUFQgeworICAgIHJldHVybiBfX3MudHlwZSgpID09IGZpbGVfdHlwZTo6ZGlyZWN0b3J5OworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBpc19kaXJlY3RvcnkoY29uc3QgcGF0aCYgX19wKSB7CisgICAgcmV0dXJuIGlzX2RpcmVjdG9yeShfX3N0YXR1cyhfX3ApKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgaXNfZGlyZWN0b3J5KGNvbnN0IHBhdGgmIF9fcCwgZXJyb3JfY29kZSYgX19lYykgX05PRVhDRVBUIHsKKyAgICByZXR1cm4gaXNfZGlyZWN0b3J5KF9fc3RhdHVzKF9fcCwgJl9fZWMpKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgaXNfZW1wdHkoY29uc3QgcGF0aCYgX19wKSB7CisgICAgcmV0dXJuIF9fZnNfaXNfZW1wdHkoX19wKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgaXNfZW1wdHkoY29uc3QgcGF0aCYgX19wLCBlcnJvcl9jb2RlJiBfX2VjKSB7CisgICAgcmV0dXJuIF9fZnNfaXNfZW1wdHkoX19wLCAmX19lYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIGlzX2ZpZm8oZmlsZV9zdGF0dXMgX19zKSBfTk9FWENFUFQgeworICAgIHJldHVybiBfX3MudHlwZSgpID09IGZpbGVfdHlwZTo6ZmlmbzsKK30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIGlzX2ZpZm8oY29uc3QgcGF0aCYgX19wKSB7CisgICAgcmV0dXJuIGlzX2ZpZm8oX19zdGF0dXMoX19wKSk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIGlzX2ZpZm8oY29uc3QgcGF0aCYgX19wLCBlcnJvcl9jb2RlJiBfX2VjKSBfTk9FWENFUFQgeworICAgIHJldHVybiBpc19maWZvKF9fc3RhdHVzKF9fcCwgJl9fZWMpKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgaXNfcmVndWxhcl9maWxlKGZpbGVfc3RhdHVzIF9fcykgX05PRVhDRVBUIHsKKyAgICByZXR1cm4gX19zLnR5cGUoKSA9PSBmaWxlX3R5cGU6OnJlZ3VsYXI7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIGlzX3JlZ3VsYXJfZmlsZShjb25zdCBwYXRoJiBfX3ApIHsKKyAgICByZXR1cm4gaXNfcmVndWxhcl9maWxlKF9fc3RhdHVzKF9fcCkpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBpc19yZWd1bGFyX2ZpbGUoY29uc3QgcGF0aCYgX19wLCBlcnJvcl9jb2RlJiBfX2VjKSBfTk9FWENFUFQgeworICAgIHJldHVybiBpc19yZWd1bGFyX2ZpbGUoX19zdGF0dXMoX19wLCAmX19lYykpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBpc19zb2NrZXQoZmlsZV9zdGF0dXMgX19zKSBfTk9FWENFUFQgeworICAgIHJldHVybiBfX3MudHlwZSgpID09IGZpbGVfdHlwZTo6c29ja2V0OworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBpc19zb2NrZXQoY29uc3QgcGF0aCYgX19wKSB7CisgICAgcmV0dXJuIGlzX3NvY2tldChfX3N0YXR1cyhfX3ApKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgaXNfc29ja2V0KGNvbnN0IHBhdGgmIF9fcCwgZXJyb3JfY29kZSYgX19lYykgX05PRVhDRVBUIHsKKyAgICByZXR1cm4gaXNfc29ja2V0KF9fc3RhdHVzKF9fcCwgJl9fZWMpKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgaXNfc3ltbGluayhmaWxlX3N0YXR1cyBfX3MpIF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuIF9fcy50eXBlKCkgPT0gZmlsZV90eXBlOjpzeW1saW5rOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBpc19zeW1saW5rKGNvbnN0IHBhdGgmIF9fcCkgeworICAgIHJldHVybiBpc19zeW1saW5rKF9fc3ltbGlua19zdGF0dXMoX19wKSk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIGlzX3N5bWxpbmsoY29uc3QgcGF0aCYgX19wLCBlcnJvcl9jb2RlJiBfX2VjKSBfTk9FWENFUFQgeworICAgIHJldHVybiBpc19zeW1saW5rKF9fc3ltbGlua19zdGF0dXMoX19wLCAmX19lYykpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBpc19vdGhlcihmaWxlX3N0YXR1cyBfX3MpIF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuIGV4aXN0cyhfX3MpCisgICAgICAgICYmICFpc19yZWd1bGFyX2ZpbGUoX19zKSAmJiAhaXNfZGlyZWN0b3J5KF9fcykgJiYgIWlzX3N5bWxpbmsoX19zKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgaXNfb3RoZXIoY29uc3QgcGF0aCYgX19wKSB7CisgICAgcmV0dXJuIGlzX290aGVyKF9fc3RhdHVzKF9fcCkpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBpc19vdGhlcihjb25zdCBwYXRoJiBfX3AsIGVycm9yX2NvZGUmIF9fZWMpIF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuIGlzX290aGVyKF9fc3RhdHVzKF9fcCwgJl9fZWMpKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2ZpbGVfdGltZV90eXBlIGxhc3Rfd3JpdGVfdGltZShjb25zdCBwYXRoJiBfX3ApIHsKKyAgICByZXR1cm4gX19sYXN0X3dyaXRlX3RpbWUoX19wKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2ZpbGVfdGltZV90eXBlIGxhc3Rfd3JpdGVfdGltZShjb25zdCBwYXRoJiBfX3AsIGVycm9yX2NvZGUmIF9fZWMpIF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuIF9fbGFzdF93cml0ZV90aW1lKF9fcCwgJl9fZWMpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCBsYXN0X3dyaXRlX3RpbWUoY29uc3QgcGF0aCYgX19wLCBmaWxlX3RpbWVfdHlwZSBfX3QpIHsKKyAgICBfX2xhc3Rfd3JpdGVfdGltZShfX3AsIF9fdCk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIGxhc3Rfd3JpdGVfdGltZShjb25zdCBwYXRoJiBfX3AsIGZpbGVfdGltZV90eXBlIF9fdCwgZXJyb3JfY29kZSYgX19lYykgX05PRVhDRVBUIHsKKyAgICBfX2xhc3Rfd3JpdGVfdGltZShfX3AsIF9fdCwgJl9fZWMpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCBwZXJtaXNzaW9ucyhjb25zdCBwYXRoJiBfX3AsIHBlcm1zIF9fcHJtcywKKyAgICAgICAgICAgICAgICAgcGVybV9vcHRpb25zIF9fb3B0cyA9IHBlcm1fb3B0aW9uczo6cmVwbGFjZSkgeworICAgIF9fcGVybWlzc2lvbnMoX19wLCBfX3BybXMsIF9fb3B0cyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIHBlcm1pc3Npb25zKGNvbnN0IHBhdGgmIF9fcCwgcGVybXMgX19wcm1zLCBlcnJvcl9jb2RlJiBfX2VjKSBfTk9FWENFUFQgeworICAgIF9fcGVybWlzc2lvbnMoX19wLCBfX3BybXMsIHBlcm1fb3B0aW9uczo6cmVwbGFjZSwgJl9fZWMpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCBwZXJtaXNzaW9ucyhjb25zdCBwYXRoJiBfX3AsIHBlcm1zIF9fcHJtcywgcGVybV9vcHRpb25zIF9fb3B0cywKKyAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSYgX19lYykgIHsKKyAgICBfX3Blcm1pc3Npb25zKF9fcCwgX19wcm1zLCBfX29wdHMsICZfX2VjKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3BhdGggcmVhZF9zeW1saW5rKGNvbnN0IHBhdGgmIF9fcCkgeworICAgIHJldHVybiBfX3JlYWRfc3ltbGluayhfX3ApOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorcGF0aCByZWFkX3N5bWxpbmsoY29uc3QgcGF0aCYgX19wLCBlcnJvcl9jb2RlJiBfX2VjKSB7CisgICAgcmV0dXJuIF9fcmVhZF9zeW1saW5rKF9fcCwgJl9fZWMpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCByZW1vdmUoY29uc3QgcGF0aCYgX19wKSB7CisgICAgcmV0dXJuIF9fcmVtb3ZlKF9fcCk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIHJlbW92ZShjb25zdCBwYXRoJiBfX3AsIGVycm9yX2NvZGUmIF9fZWMpIF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuIF9fcmVtb3ZlKF9fcCwgJl9fZWMpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordWludG1heF90IHJlbW92ZV9hbGwoY29uc3QgcGF0aCYgX19wKSB7CisgICAgcmV0dXJuIF9fcmVtb3ZlX2FsbChfX3ApOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordWludG1heF90IHJlbW92ZV9hbGwoY29uc3QgcGF0aCYgX19wLCBlcnJvcl9jb2RlJiBfX2VjKSB7CisgICAgcmV0dXJuIF9fcmVtb3ZlX2FsbChfX3AsICZfX2VjKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQgcmVuYW1lKGNvbnN0IHBhdGgmIF9fZnJvbSwgY29uc3QgcGF0aCYgX190bykgeworICAgIHJldHVybiBfX3JlbmFtZShfX2Zyb20sIF9fdG8pOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCByZW5hbWUoY29uc3QgcGF0aCYgX19mcm9tLCBjb25zdCBwYXRoJiBfX3RvLCBlcnJvcl9jb2RlJiBfX2VjKSBfTk9FWENFUFQgeworICAgIHJldHVybiBfX3JlbmFtZShfX2Zyb20sIF9fdG8sICZfX2VjKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQgcmVzaXplX2ZpbGUoY29uc3QgcGF0aCYgX19wLCB1aW50bWF4X3QgX19ucykgeworICAgIHJldHVybiBfX3Jlc2l6ZV9maWxlKF9fcCwgX19ucyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIHJlc2l6ZV9maWxlKGNvbnN0IHBhdGgmIF9fcCwgdWludG1heF90IF9fbnMsIGVycm9yX2NvZGUmIF9fZWMpIF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuIF9fcmVzaXplX2ZpbGUoX19wLCBfX25zLCAmX19lYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitzcGFjZV9pbmZvIHNwYWNlKGNvbnN0IHBhdGgmIF9fcCkgeworICAgIHJldHVybiBfX3NwYWNlKF9fcCk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitzcGFjZV9pbmZvIHNwYWNlKGNvbnN0IHBhdGgmIF9fcCwgZXJyb3JfY29kZSYgX19lYykgX05PRVhDRVBUIHsKKyAgICByZXR1cm4gX19zcGFjZShfX3AsICZfX2VjKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2ZpbGVfc3RhdHVzIHN0YXR1cyhjb25zdCBwYXRoJiBfX3ApIHsKKyAgICByZXR1cm4gX19zdGF0dXMoX19wKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2ZpbGVfc3RhdHVzIHN0YXR1cyhjb25zdCBwYXRoJiBfX3AsIGVycm9yX2NvZGUmIF9fZWMpIF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuIF9fc3RhdHVzKF9fcCwgJl9fZWMpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorZmlsZV9zdGF0dXMgc3ltbGlua19zdGF0dXMoY29uc3QgcGF0aCYgX19wKSB7CisgICAgcmV0dXJuIF9fc3ltbGlua19zdGF0dXMoX19wKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2ZpbGVfc3RhdHVzIHN5bWxpbmtfc3RhdHVzKGNvbnN0IHBhdGgmIF9fcCwgZXJyb3JfY29kZSYgX19lYykgX05PRVhDRVBUIHsKKyAgICByZXR1cm4gX19zeW1saW5rX3N0YXR1cyhfX3AsICZfX2VjKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3BhdGggc3lzdGVtX2NvbXBsZXRlKGNvbnN0IHBhdGgmIF9fcCkgeworICAgIHJldHVybiBfX3N5c3RlbV9jb21wbGV0ZShfX3ApOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorcGF0aCBzeXN0ZW1fY29tcGxldGUoY29uc3QgcGF0aCYgX19wLCBlcnJvcl9jb2RlJiBfX2VjKSB7CisgICAgcmV0dXJuIF9fc3lzdGVtX2NvbXBsZXRlKF9fcCwgJl9fZWMpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorcGF0aCB0ZW1wX2RpcmVjdG9yeV9wYXRoKCkgeworICAgIHJldHVybiBfX3RlbXBfZGlyZWN0b3J5X3BhdGgoKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3BhdGggdGVtcF9kaXJlY3RvcnlfcGF0aChlcnJvcl9jb2RlJiBfX2VjKSB7CisgICAgcmV0dXJuIF9fdGVtcF9kaXJlY3RvcnlfcGF0aCgmX19lYyk7Cit9CisKKworY2xhc3MgZGlyZWN0b3J5X2VudHJ5Cit7CisgICAgdHlwZWRlZiBfVlNURF9GUzo6cGF0aCBfUGF0aDsKKworcHVibGljOgorICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMKKyAgICBkaXJlY3RvcnlfZW50cnkoKSBfTk9FWENFUFQgPSBkZWZhdWx0OworICAgIGRpcmVjdG9yeV9lbnRyeShkaXJlY3RvcnlfZW50cnkgY29uc3QmKSA9IGRlZmF1bHQ7CisgICAgZGlyZWN0b3J5X2VudHJ5KGRpcmVjdG9yeV9lbnRyeSYmKSBfTk9FWENFUFQgPSBkZWZhdWx0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IGRpcmVjdG9yeV9lbnRyeShfUGF0aCBjb25zdCYgX19wKSA6IF9fcF8oX19wKSB7fQorCisgICAgfmRpcmVjdG9yeV9lbnRyeSgpIHt9CisKKyAgICBkaXJlY3RvcnlfZW50cnkmIG9wZXJhdG9yPShkaXJlY3RvcnlfZW50cnkgY29uc3QmKSA9IGRlZmF1bHQ7CisgICAgZGlyZWN0b3J5X2VudHJ5JiBvcGVyYXRvcj0oZGlyZWN0b3J5X2VudHJ5JiYpIF9OT0VYQ0VQVCA9IGRlZmF1bHQ7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBhc3NpZ24oX1BhdGggY29uc3QmIF9fcCkgeworICAgICAgICBfX3BfID0gX19wOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHJlcGxhY2VfZmlsZW5hbWUoX1BhdGggY29uc3QmIF9fcCkgeworICAgICAgICBfX3BfID0gX19wXy5wYXJlbnRfcGF0aCgpIC8gX19wOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfUGF0aCBjb25zdCYgcGF0aCgpIGNvbnN0IF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBfX3BfOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvciBjb25zdCBfUGF0aCYoKSBjb25zdCBfTk9FWENFUFQgeworICAgICAgICByZXR1cm4gX19wXzsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZmlsZV9zdGF0dXMgc3RhdHVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gX1ZTVERfRlM6OnN0YXR1cyhfX3BfKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZmlsZV9zdGF0dXMgc3RhdHVzKGVycm9yX2NvZGUmIF9fZWMpIGNvbnN0IF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBfVlNURF9GUzo6c3RhdHVzKF9fcF8sIF9fZWMpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBmaWxlX3N0YXR1cyBzeW1saW5rX3N0YXR1cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9WU1REX0ZTOjpzeW1saW5rX3N0YXR1cyhfX3BfKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZmlsZV9zdGF0dXMgc3ltbGlua19zdGF0dXMoZXJyb3JfY29kZSYgX19lYykgY29uc3QgX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuIF9WU1REX0ZTOjpzeW1saW5rX3N0YXR1cyhfX3BfLCBfX2VjKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcjwgKGRpcmVjdG9yeV9lbnRyeSBjb25zdCYgX19yaHMpIGNvbnN0IF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBfX3BfIDwgX19yaHMuX19wXzsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcj09KGRpcmVjdG9yeV9lbnRyeSBjb25zdCYgX19yaHMpIGNvbnN0IF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBfX3BfID09IF9fcmhzLl9fcF87CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3IhPShkaXJlY3RvcnlfZW50cnkgY29uc3QmIF9fcmhzKSBjb25zdCBfTk9FWENFUFQgeworICAgICAgICByZXR1cm4gX19wXyAhPSBfX3Jocy5fX3BfOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yPD0oZGlyZWN0b3J5X2VudHJ5IGNvbnN0JiBfX3JocykgY29uc3QgX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuIF9fcF8gPD0gX19yaHMuX19wXzsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcj4gKGRpcmVjdG9yeV9lbnRyeSBjb25zdCYgX19yaHMpIGNvbnN0IF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBfX3BfID4gX19yaHMuX19wXzsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcj49KGRpcmVjdG9yeV9lbnRyeSBjb25zdCYgX19yaHMpIGNvbnN0IF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBfX3BfID49IF9fcmhzLl9fcF87CisgICAgfQorcHJpdmF0ZToKKyAgICBfUGF0aCBfX3BfOworfTsKKworCitjbGFzcyBkaXJlY3RvcnlfaXRlcmF0b3I7CitjbGFzcyByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yOworY2xhc3MgX19kaXJfc3RyZWFtOworCitjbGFzcyBfX2Rpcl9lbGVtZW50X3Byb3h5IHsKK3B1YmxpYzoKKworICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZGlyZWN0b3J5X2VudHJ5IG9wZXJhdG9yKigpIHsgcmV0dXJuIF9WU1REOjptb3ZlKF9fZWxlbV8pOyB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIGRpcmVjdG9yeV9pdGVyYXRvcjsKKyAgICBmcmllbmQgY2xhc3MgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvcjsKKyAgICBleHBsaWNpdCBfX2Rpcl9lbGVtZW50X3Byb3h5KGRpcmVjdG9yeV9lbnRyeSBjb25zdCYgX19lKSA6IF9fZWxlbV8oX19lKSB7fQorICAgIF9fZGlyX2VsZW1lbnRfcHJveHkoX19kaXJfZWxlbWVudF9wcm94eSYmIF9fbykgOiBfX2VsZW1fKF9WU1REOjptb3ZlKF9fby5fX2VsZW1fKSkge30KKyAgICBkaXJlY3RvcnlfZW50cnkgX19lbGVtXzsKK307CisKK2NsYXNzIGRpcmVjdG9yeV9pdGVyYXRvcgoreworcHVibGljOgorICAgIHR5cGVkZWYgZGlyZWN0b3J5X2VudHJ5IHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdmFsdWVfdHlwZSBjb25zdCogcG9pbnRlcjsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUgY29uc3QmIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGlucHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworcHVibGljOgorICAgIC8vY3RvciAmIGR0b3IKKyAgICBkaXJlY3RvcnlfaXRlcmF0b3IoKSBfTk9FWENFUFQKKyAgICB7IH0KKworICAgIGV4cGxpY2l0IGRpcmVjdG9yeV9pdGVyYXRvcihjb25zdCBwYXRoJiBfX3ApCisgICAgICAgIDogZGlyZWN0b3J5X2l0ZXJhdG9yKF9fcCwgbnVsbHB0cikKKyAgICB7IH0KKworICAgIGRpcmVjdG9yeV9pdGVyYXRvcihjb25zdCBwYXRoJiBfX3AsIGRpcmVjdG9yeV9vcHRpb25zIF9fb3B0cykKKyAgICAgICAgOiBkaXJlY3RvcnlfaXRlcmF0b3IoX19wLCBudWxscHRyLCBfX29wdHMpCisgICAgeyB9CisKKyAgICBkaXJlY3RvcnlfaXRlcmF0b3IoY29uc3QgcGF0aCYgX19wLCBlcnJvcl9jb2RlJiBfX2VjKQorICAgICAgICA6IGRpcmVjdG9yeV9pdGVyYXRvcihfX3AsICZfX2VjKQorICAgIHsgfQorCisgICAgZGlyZWN0b3J5X2l0ZXJhdG9yKGNvbnN0IHBhdGgmIF9fcCwgZGlyZWN0b3J5X29wdGlvbnMgX19vcHRzLAorICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlJiBfX2VjKQorICAgICAgICA6IGRpcmVjdG9yeV9pdGVyYXRvcihfX3AsICZfX2VjLCBfX29wdHMpCisgICAgeyB9CisKKyAgICBkaXJlY3RvcnlfaXRlcmF0b3IoY29uc3QgZGlyZWN0b3J5X2l0ZXJhdG9yJikgPSBkZWZhdWx0OworICAgIGRpcmVjdG9yeV9pdGVyYXRvcihkaXJlY3RvcnlfaXRlcmF0b3ImJikgPSBkZWZhdWx0OworICAgIGRpcmVjdG9yeV9pdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IGRpcmVjdG9yeV9pdGVyYXRvciYpID0gZGVmYXVsdDsKKworICAgIGRpcmVjdG9yeV9pdGVyYXRvciYgb3BlcmF0b3I9KGRpcmVjdG9yeV9pdGVyYXRvciYmIF9fbykgX05PRVhDRVBUIHsKKyAgICAgICAgLy8gbm9uLWRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgdG8gc3VwcG9ydCBzZWxmLW1vdmUgYXNzaWduLgorICAgICAgICBpZiAodGhpcyAhPSAmX19vKSB7CisgICAgICAgICAgICBfX2ltcF8gPSBfVlNURDo6bW92ZShfX28uX19pbXBfKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgfmRpcmVjdG9yeV9pdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgIGNvbnN0IGRpcmVjdG9yeV9lbnRyeSYgb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgICBfTElCQ1BQX0FTU0VSVChfX2ltcF8sICJUaGUgZW5kIGl0ZXJhdG9yIGNhbm5vdCBiZSBkZXJlZmVyZW5jZWQiKTsKKyAgICAgICAgcmV0dXJuIF9fZGVyZWZlcmVuY2UoKTsKKyAgICB9CisKKyAgICBjb25zdCBkaXJlY3RvcnlfZW50cnkqIG9wZXJhdG9yLT4oKSBjb25zdAorICAgIHsgcmV0dXJuICYqKnRoaXM7IH0KKworICAgIGRpcmVjdG9yeV9pdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgeyByZXR1cm4gX19pbmNyZW1lbnQoKTsgfQorCisgICAgX19kaXJfZWxlbWVudF9wcm94eSBvcGVyYXRvcisrKGludCkgeworICAgICAgICBfX2Rpcl9lbGVtZW50X3Byb3h5IF9fcCgqKnRoaXMpOworICAgICAgICBfX2luY3JlbWVudCgpOworICAgICAgICByZXR1cm4gX19wOworICAgIH0KKworICAgIGRpcmVjdG9yeV9pdGVyYXRvciYgaW5jcmVtZW50KGVycm9yX2NvZGUmIF9fZWMpCisgICAgeyByZXR1cm4gX19pbmNyZW1lbnQoJl9fZWMpOyB9CisKK3ByaXZhdGU6CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGRpcmVjdG9yeV9pdGVyYXRvciYgX19saHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3RvcnlfaXRlcmF0b3ImIF9fcmhzKSBfTk9FWENFUFQ7CisKKyAgICAvLyBjb25zdHJ1Y3QgdGhlIGRpcl9zdHJlYW0KKyAgICBfTElCQ1BQX0ZVTkNfVklTCisgICAgZGlyZWN0b3J5X2l0ZXJhdG9yKGNvbnN0IHBhdGgmLCBlcnJvcl9jb2RlICosCisgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeV9vcHRpb25zID0gZGlyZWN0b3J5X29wdGlvbnM6Om5vbmUpOworCisgICAgX0xJQkNQUF9GVU5DX1ZJUworICAgIGRpcmVjdG9yeV9pdGVyYXRvciYgX19pbmNyZW1lbnQoZXJyb3JfY29kZSAqIF9fZWMgPSBudWxscHRyKTsKKworICAgIF9MSUJDUFBfRlVOQ19WSVMKKyAgICBjb25zdCBkaXJlY3RvcnlfZW50cnkmIF9fZGVyZWZlcmVuY2UoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBzaGFyZWRfcHRyPF9fZGlyX3N0cmVhbT4gX19pbXBfOworfTsKKworCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBvcGVyYXRvcj09KGNvbnN0IGRpcmVjdG9yeV9pdGVyYXRvciYgX19saHMsCisgICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0b3J5X2l0ZXJhdG9yJiBfX3JocykgX05PRVhDRVBUIHsKKyAgICByZXR1cm4gX19saHMuX19pbXBfID09IF9fcmhzLl9faW1wXzsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBkaXJlY3RvcnlfaXRlcmF0b3ImIF9fbGhzLAorICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdG9yeV9pdGVyYXRvciYgX19yaHMpIF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOworfQorCisvLyBlbmFibGUgZGlyZWN0b3J5X2l0ZXJhdG9yIHJhbmdlLWJhc2VkIGZvciBzdGF0ZW1lbnRzCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorZGlyZWN0b3J5X2l0ZXJhdG9yIGJlZ2luKGRpcmVjdG9yeV9pdGVyYXRvciBfX2l0ZXIpIF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuIF9faXRlcjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2RpcmVjdG9yeV9pdGVyYXRvciBlbmQoY29uc3QgZGlyZWN0b3J5X2l0ZXJhdG9yJikgX05PRVhDRVBUIHsKKyAgICByZXR1cm4gZGlyZWN0b3J5X2l0ZXJhdG9yKCk7Cit9CisKK2NsYXNzIHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IgeworcHVibGljOgorICAgIHVzaW5nIHZhbHVlX3R5cGUgPSBkaXJlY3RvcnlfZW50cnk7CisgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gc3RkOjpwdHJkaWZmX3Q7CisgICAgdXNpbmcgcG9pbnRlciA9IGRpcmVjdG9yeV9lbnRyeSBjb25zdCAqOworICAgIHVzaW5nIHJlZmVyZW5jZSA9IGRpcmVjdG9yeV9lbnRyeSBjb25zdCAmOworICAgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjppbnB1dF9pdGVyYXRvcl90YWc7CisKK3B1YmxpYzoKKyAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3IKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvcigpICBfTk9FWENFUFQKKyAgICAgICAgOiBfX3JlY18oZmFsc2UpCisgICAge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yKGNvbnN0IHBhdGgmIF9fcCwKKyAgICAgICAgICAgICAgICBkaXJlY3Rvcnlfb3B0aW9ucyBfX3hvcHRpb25zID0gZGlyZWN0b3J5X29wdGlvbnM6Om5vbmUpCisgICAgICAgIDogcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvcihfX3AsIF9feG9wdGlvbnMsICBudWxscHRyKQorICAgIHsgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IoY29uc3QgcGF0aCYgX19wLAorICAgICAgICBkaXJlY3Rvcnlfb3B0aW9ucyBfX3hvcHRpb25zLCBlcnJvcl9jb2RlJiBfX2VjKQorICAgICAgICA6IHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IoX19wLCBfX3hvcHRpb25zLCAmX19lYykKKyAgICB7IH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yKGNvbnN0IHBhdGgmIF9fcCwgZXJyb3JfY29kZSYgX19lYykKKyAgICAgICAgOiByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yKF9fcCwgZGlyZWN0b3J5X29wdGlvbnM6Om5vbmUsICAmX19lYykKKyAgICB7IH0KKworICAgIHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IoY29uc3QgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvciYpID0gZGVmYXVsdDsKKyAgICByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yKHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3ImJikgPSBkZWZhdWx0OworCisgICAgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvciAmCisgICAgb3BlcmF0b3I9KGNvbnN0IHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3ImKSA9IGRlZmF1bHQ7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvciAmCisgICAgb3BlcmF0b3I9KHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3ImJiBfX28pIG5vZXhjZXB0IHsKKyAgICAgICAgLy8gbm9uLWRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgdG8gc3VwcG9ydCBzZWxmLW1vdmUgYXNzaWduLgorICAgICAgICBpZiAodGhpcyAhPSAmX19vKSB7CisgICAgICAgICAgICBfX2ltcF8gPSBfVlNURDo6bW92ZShfX28uX19pbXBfKTsKKyAgICAgICAgICAgIF9fcmVjXyA9IF9fby5fX3JlY187CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIH5yZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IGRpcmVjdG9yeV9lbnRyeSYgb3BlcmF0b3IqKCkgY29uc3QKKyAgICB7IHJldHVybiBfX2RlcmVmZXJlbmNlKCk7IH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdCBkaXJlY3RvcnlfZW50cnkqIG9wZXJhdG9yLT4oKSBjb25zdAorICAgIHsgcmV0dXJuICZfX2RlcmVmZXJlbmNlKCk7IH0KKworICAgIHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgIHsgcmV0dXJuIF9faW5jcmVtZW50KCk7IH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2Rpcl9lbGVtZW50X3Byb3h5IG9wZXJhdG9yKysoaW50KSB7CisgICAgICAgIF9fZGlyX2VsZW1lbnRfcHJveHkgX19wKCoqdGhpcyk7CisgICAgICAgIF9faW5jcmVtZW50KCk7CisgICAgICAgIHJldHVybiBfX3A7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3ImIGluY3JlbWVudChlcnJvcl9jb2RlJiBfX2VjKQorICAgIHsgcmV0dXJuIF9faW5jcmVtZW50KCZfX2VjKTsgfQorCisgICAgX0xJQkNQUF9GVU5DX1ZJUyBkaXJlY3Rvcnlfb3B0aW9ucyBvcHRpb25zKCkgY29uc3Q7CisgICAgX0xJQkNQUF9GVU5DX1ZJUyBpbnQgIGRlcHRoKCkgY29uc3Q7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBwb3AoKSB7IF9fcG9wKCk7IH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHBvcChlcnJvcl9jb2RlJiBfX2VjKQorICAgIHsgX19wb3AoJl9fZWMpOyB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCByZWN1cnNpb25fcGVuZGluZygpIGNvbnN0CisgICAgeyByZXR1cm4gX19yZWNfOyB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBkaXNhYmxlX3JlY3Vyc2lvbl9wZW5kaW5nKCkKKyAgICB7IF9fcmVjXyA9IGZhbHNlOyB9CisKK3ByaXZhdGU6CisgICAgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvcihjb25zdCBwYXRoJiBfX3AsIGRpcmVjdG9yeV9vcHRpb25zIF9fb3B0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSAqX19lYyk7CisKKyAgICBfTElCQ1BQX0ZVTkNfVklTCisgICAgY29uc3QgZGlyZWN0b3J5X2VudHJ5JiBfX2RlcmVmZXJlbmNlKCkgY29uc3Q7CisKKyAgICBfTElCQ1BQX0ZVTkNfVklTCisgICAgYm9vbCBfX3RyeV9yZWN1cnNpb24oZXJyb3JfY29kZSogX19lYyk7CisKKyAgICBfTElCQ1BQX0ZVTkNfVklTCisgICAgdm9pZCBfX2FkdmFuY2UoZXJyb3JfY29kZSogX19lYz1udWxscHRyKTsKKworICAgIF9MSUJDUFBfRlVOQ19WSVMKKyAgICByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yJiBfX2luY3JlbWVudChlcnJvcl9jb2RlICpfX2VjPW51bGxwdHIpOworCisgICAgX0xJQkNQUF9GVU5DX1ZJUworICAgIHZvaWQgX19wb3AoZXJyb3JfY29kZSogX19lYz1udWxscHRyKTsKKworICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3ImKSBfTk9FWENFUFQ7CisKKyAgICBzdHJ1Y3QgX19zaGFyZWRfaW1wOworICAgIHNoYXJlZF9wdHI8X19zaGFyZWRfaW1wPiBfX2ltcF87CisgICAgYm9vbCBfX3JlY187Cit9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFzcyByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yCisKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yJiBfX2xocywKKyAgICAgICAgICAgICAgICBjb25zdCByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yJiBfX3JocykgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fbGhzLl9faW1wXyA9PSBfX3Jocy5fX2ltcF87Cit9CisKK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvciYgX19saHMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yJiBfX3JocykgX05PRVhDRVBUCit7CisgICAgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOworfQorLy8gZW5hYmxlIHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IgcmFuZ2UtYmFzZWQgZm9yIHN0YXRlbWVudHMKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCityZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yIGJlZ2luKHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IgX19pdGVyKSBfTk9FWENFUFQgeworICAgIHJldHVybiBfX2l0ZXI7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCityZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yIGVuZChjb25zdCByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yJikgX05PRVhDRVBUIHsKKyAgICByZXR1cm4gcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvcigpOworfQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfRVhQRVJJTUVOVEFMX0ZJTEVTWVNURU0KKworI2VuZGlmIC8vIF9MSUJDUFBfRVhQRVJJTUVOVEFMX0ZJTEVTWVNURU0KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvZm9yd2FyZF9saXN0IGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9mb3J3YXJkX2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlMTk1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvZm9yd2FyZF9saXN0CkBAIC0wLDAgKzEsNDcgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBmb3J3YXJkX2xpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfRVhQRVJJTUVOVEFMX0ZPUldBUkRfTElTVAorI2RlZmluZSBfTElCQ1BQX0VYUEVSSU1FTlRBTF9GT1JXQVJEX0xJU1QKKy8qCisgICAgZXhwZXJpbWVudGFsL2ZvcndhcmRfbGlzdCBzeW5vcHNpcworCisvLyBDKysxegorbmFtZXNwYWNlIHN0ZCB7CituYW1lc3BhY2UgZXhwZXJpbWVudGFsIHsKK2lubGluZSBuYW1lc3BhY2UgZnVuZGFtZW50YWxzX3YxIHsKK25hbWVzcGFjZSBwbXIgeworCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICB1c2luZyBmb3J3YXJkX2xpc3QgPSBzdGQ6OmZvcndhcmRfbGlzdDxULHBvbHltb3JwaGljX2FsbG9jYXRvcjxUPj47CisKK30gLy8gbmFtZXNwYWNlIHBtcgorfSAvLyBuYW1lc3BhY2UgZnVuZGFtZW50YWxzX3YxCit9IC8vIG5hbWVzcGFjZSBleHBlcmltZW50YWwKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisgKi8KKworI2luY2x1ZGUgPGV4cGVyaW1lbnRhbC9fX2NvbmZpZz4KKyNpbmNsdWRlIDxmb3J3YXJkX2xpc3Q+CisjaW5jbHVkZSA8ZXhwZXJpbWVudGFsL21lbW9yeV9yZXNvdXJjZT4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX0xGVFNfUE1SCisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWVUPgordXNpbmcgZm9yd2FyZF9saXN0ID0gX1ZTVEQ6OmZvcndhcmRfbGlzdDxfVmFsdWVULCBwb2x5bW9ycGhpY19hbGxvY2F0b3I8X1ZhbHVlVD4+OworCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfTEZUU19QTVIKKworI2VuZGlmIC8qIF9MSUJDUFBfRVhQRVJJTUVOVEFMX0ZPUldBUkRfTElTVCAqLwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9mdW5jdGlvbmFsIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9mdW5jdGlvbmFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2M2RmYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL2Z1bmN0aW9uYWwKQEAgLTAsMCArMSw0NjIgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZ1bmN0aW9uYWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfRVhQRVJJTUVOVEFMX0ZVTkNUSU9OQUwKKyNkZWZpbmUgX0xJQkNQUF9FWFBFUklNRU5UQUxfRlVOQ1RJT05BTAorCisvKgorICAgZXhwZXJpbWVudGFsL2Z1bmN0aW9uYWwgc3lub3BzaXMKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIHN0ZCB7CituYW1lc3BhY2UgZXhwZXJpbWVudGFsIHsKK2lubGluZSBuYW1lc3BhY2UgZnVuZGFtZW50YWxzX3YxIHsKKworICAgIC8vIFNlZSBDKysxNCAyMC45LjksIEZ1bmN0aW9uIG9iamVjdCBiaW5kZXJzCisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNvbnN0ZXhwciBib29sIGlzX2JpbmRfZXhwcmVzc2lvbl92CisgICAgICA9IGlzX2JpbmRfZXhwcmVzc2lvbjxUPjo6dmFsdWU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNvbnN0ZXhwciBpbnQgaXNfcGxhY2Vob2xkZXJfdgorICAgICAgPSBpc19wbGFjZWhvbGRlcjxUPjo6dmFsdWU7CisKKyAgICAvLyA0LjIsIENsYXNzIHRlbXBsYXRlIGZ1bmN0aW9uCisgICAgdGVtcGxhdGU8Y2xhc3M+IGNsYXNzIGZ1bmN0aW9uOyAvLyB1bmRlZmluZWQKKyAgICB0ZW1wbGF0ZTxjbGFzcyBSLCBjbGFzcy4uLiBBcmdUeXBlcz4gY2xhc3MgZnVuY3Rpb248UihBcmdUeXBlcy4uLik+OworCisgICAgdGVtcGxhdGU8Y2xhc3MgUiwgY2xhc3MuLi4gQXJnVHlwZXM+CisgICAgdm9pZCBzd2FwKGZ1bmN0aW9uPFIoQXJnVHlwZXMuLi4pPiYsIGZ1bmN0aW9uPFIoQXJnVHlwZXMuLi4pPiYpOworCisgICAgdGVtcGxhdGU8Y2xhc3MgUiwgY2xhc3MuLi4gQXJnVHlwZXM+CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGZ1bmN0aW9uPFIoQXJnVHlwZXMuLi4pPiYsIG51bGxwdHJfdCkgbm9leGNlcHQ7CisgICAgdGVtcGxhdGU8Y2xhc3MgUiwgY2xhc3MuLi4gQXJnVHlwZXM+CisgICAgYm9vbCBvcGVyYXRvcj09KG51bGxwdHJfdCwgY29uc3QgZnVuY3Rpb248UihBcmdUeXBlcy4uLik+Jikgbm9leGNlcHQ7CisgICAgdGVtcGxhdGU8Y2xhc3MgUiwgY2xhc3MuLi4gQXJnVHlwZXM+CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGZ1bmN0aW9uPFIoQXJnVHlwZXMuLi4pPiYsIG51bGxwdHJfdCkgbm9leGNlcHQ7CisgICAgdGVtcGxhdGU8Y2xhc3MgUiwgY2xhc3MuLi4gQXJnVHlwZXM+CisgICAgYm9vbCBvcGVyYXRvciE9KG51bGxwdHJfdCwgY29uc3QgZnVuY3Rpb248UihBcmdUeXBlcy4uLik+Jikgbm9leGNlcHQ7CisKKyAgICAvLyA0LjMsIFNlYXJjaGVycworICAgIHRlbXBsYXRlPGNsYXNzIEZvcndhcmRJdGVyYXRvciwgY2xhc3MgQmluYXJ5UHJlZGljYXRlID0gZXF1YWxfdG88Pj4KKyAgICAgIGNsYXNzIGRlZmF1bHRfc2VhcmNoZXI7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBSYW5kb21BY2Nlc3NJdGVyYXRvciwKKyAgICAgICAgICAgICBjbGFzcyBIYXNoID0gaGFzaDx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8UmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPiwKKyAgICAgICAgICAgICBjbGFzcyBCaW5hcnlQcmVkaWNhdGUgPSBlcXVhbF90bzw+PgorICAgICAgY2xhc3MgYm95ZXJfbW9vcmVfc2VhcmNoZXI7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBSYW5kb21BY2Nlc3NJdGVyYXRvciwKKyAgICAgICAgICAgICBjbGFzcyBIYXNoID0gaGFzaDx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8UmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPiwKKyAgICAgICAgICAgICBjbGFzcyBCaW5hcnlQcmVkaWNhdGUgPSBlcXVhbF90bzw+PgorICAgICAgY2xhc3MgYm95ZXJfbW9vcmVfaG9yc3Bvb2xfc2VhcmNoZXI7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBGb3J3YXJkSXRlcmF0b3IsIGNsYXNzIEJpbmFyeVByZWRpY2F0ZSA9IGVxdWFsX3RvPD4+CisgICAgZGVmYXVsdF9zZWFyY2hlcjxGb3J3YXJkSXRlcmF0b3IsIEJpbmFyeVByZWRpY2F0ZT4KKyAgICBtYWtlX2RlZmF1bHRfc2VhcmNoZXIoRm9yd2FyZEl0ZXJhdG9yIHBhdF9maXJzdCwgRm9yd2FyZEl0ZXJhdG9yIHBhdF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlQcmVkaWNhdGUgcHJlZCA9IEJpbmFyeVByZWRpY2F0ZSgpKTsKKworICAgIHRlbXBsYXRlPGNsYXNzIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yLAorICAgICAgICAgICAgIGNsYXNzIEhhc2ggPSBoYXNoPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxSYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgIGNsYXNzIEJpbmFyeVByZWRpY2F0ZSA9IGVxdWFsX3RvPD4+CisgICAgYm95ZXJfbW9vcmVfc2VhcmNoZXI8UmFuZG9tQWNjZXNzSXRlcmF0b3IsIEhhc2gsIEJpbmFyeVByZWRpY2F0ZT4KKyAgICBtYWtlX2JveWVyX21vb3JlX3NlYXJjaGVyKAorICAgICAgICBSYW5kb21BY2Nlc3NJdGVyYXRvciBwYXRfZmlyc3QsIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIHBhdF9sYXN0LAorICAgICAgICBIYXNoIGhmID0gSGFzaCgpLCBCaW5hcnlQcmVkaWNhdGUgcHJlZCA9IEJpbmFyeVByZWRpY2F0ZSgpKTsKKworICAgIHRlbXBsYXRlPGNsYXNzIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yLAorICAgICAgICAgICAgIGNsYXNzIEhhc2ggPSBoYXNoPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxSYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgIGNsYXNzIEJpbmFyeVByZWRpY2F0ZSA9IGVxdWFsX3RvPD4+CisgICAgYm95ZXJfbW9vcmVfaG9yc3Bvb2xfc2VhcmNoZXI8UmFuZG9tQWNjZXNzSXRlcmF0b3IsIEhhc2gsIEJpbmFyeVByZWRpY2F0ZT4KKyAgICBtYWtlX2JveWVyX21vb3JlX2hvcnNwb29sX3NlYXJjaGVyKAorICAgICAgICBSYW5kb21BY2Nlc3NJdGVyYXRvciBwYXRfZmlyc3QsIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIHBhdF9sYXN0LAorICAgICAgICBIYXNoIGhmID0gSGFzaCgpLCBCaW5hcnlQcmVkaWNhdGUgcHJlZCA9IEJpbmFyeVByZWRpY2F0ZSgpKTsKKworICB9IC8vIG5hbWVzcGFjZSBmdW5kYW1lbnRhbHNfdjEKKyAgfSAvLyBuYW1lc3BhY2UgZXhwZXJpbWVudGFsCisKKyAgdGVtcGxhdGU8Y2xhc3MgUiwgY2xhc3MuLi4gQXJnVHlwZXMsIGNsYXNzIEFsbG9jPgorICBzdHJ1Y3QgdXNlc19hbGxvY2F0b3I8ZXhwZXJpbWVudGFsOjpmdW5jdGlvbjxSKEFyZ1R5cGVzLi4uKT4sIEFsbG9jPjsKKworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyovCisKKyNpbmNsdWRlIDxleHBlcmltZW50YWwvX19jb25maWc+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxfX2RlYnVnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9QVVNIX01BQ1JPUworI2luY2x1ZGUgPF9fdW5kZWZfbWFjcm9zPgorCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX0xGVFMKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisvLyBkZWZhdWx0IHNlYXJjaGVyCit0ZW1wbGF0ZTxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlID0gZXF1YWxfdG88Pj4KK19MSUJDUFBfVFlQRV9WSVMKK2NsYXNzIGRlZmF1bHRfc2VhcmNoZXIgeworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBkZWZhdWx0X3NlYXJjaGVyKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fbCwgCisgICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19wID0gX0JpbmFyeVByZWRpY2F0ZSgpKQorICAgICAgICA6IF9fZmlyc3RfKF9fZiksIF9fbGFzdF8oX19sKSwgX19wcmVkXyhfX3ApIHt9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8X0ZvcndhcmRJdGVyYXRvcjIsIF9Gb3J3YXJkSXRlcmF0b3IyPgorICAgIG9wZXJhdG9yICgpIChfRm9yd2FyZEl0ZXJhdG9yMiBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IyIF9fbCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBfVlNURDo6X19zZWFyY2goX19mLCBfX2wsIF9fZmlyc3RfLCBfX2xhc3RfLCBfX3ByZWRfLAorICAgICAgICAgICAgdHlwZW5hbWUgX1ZTVEQ6Oml0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnkoKSwKKyAgICAgICAgICAgIHR5cGVuYW1lIF9WU1REOjppdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcjI+OjppdGVyYXRvcl9jYXRlZ29yeSgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0XzsKKyAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdF87CisgICAgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWRfOworICAgIH07CisKK3RlbXBsYXRlPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGUgPSBlcXVhbF90bzw+PgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorZGVmYXVsdF9zZWFyY2hlcjxfRm9yd2FyZEl0ZXJhdG9yLCBfQmluYXJ5UHJlZGljYXRlPgorbWFrZV9kZWZhdWx0X3NlYXJjaGVyKCBfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX2wsIF9CaW5hcnlQcmVkaWNhdGUgX19wID0gX0JpbmFyeVByZWRpY2F0ZSAoKSkKK3sKKyAgICByZXR1cm4gZGVmYXVsdF9zZWFyY2hlcjxfRm9yd2FyZEl0ZXJhdG9yLCBfQmluYXJ5UHJlZGljYXRlPihfX2YsIF9fbCwgX19wKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZSwgYm9vbCAvKnVzZUFycmF5Ki8+IGNsYXNzIF9CTVNraXBUYWJsZTsKKworLy8gIEdlbmVyYWwgY2FzZSBmb3IgQk0gZGF0YSBzZWFyY2hpbmc7IHVzZSBhIG1hcAordGVtcGxhdGU8Y2xhc3MgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK2NsYXNzIF9CTVNraXBUYWJsZTxfS2V5LCBfVmFsdWUsIF9IYXNoLCBfQmluYXJ5UHJlZGljYXRlLCBmYWxzZT4geworcHVibGljOiAvLyBUT0RPIHByaXZhdGU6CisgICAgdHlwZWRlZiBfVmFsdWUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9LZXkgICBrZXlfdHlwZTsKKworICAgIGNvbnN0IF9WYWx1ZSBfX2RlZmF1bHRfdmFsdWVfOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxfS2V5LCBfVmFsdWUsIF9IYXNoLCBfQmluYXJ5UHJlZGljYXRlPiBfX3RhYmxlOworICAgIAorcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfQk1Ta2lwVGFibGUoc3RkOjpzaXplX3QgX19zeiwgX1ZhbHVlIF9fZGVmYXVsdCwgX0hhc2ggX19oZiwgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQpCisgICAgICAgIDogX19kZWZhdWx0X3ZhbHVlXyhfX2RlZmF1bHQpLCBfX3RhYmxlKF9fc3osIF9faGYsIF9fcHJlZCkge30KKyAgICAKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBpbnNlcnQoY29uc3Qga2V5X3R5cGUgJl9fa2V5LCB2YWx1ZV90eXBlIF9fdmFsKQorICAgIHsKKyAgICAgICAgX190YWJsZSBbX19rZXldID0gX192YWw7ICAgIC8vIFdvdWxkIHNraXBfLmluc2VydCAodmFsKSBiZSBiZXR0ZXIgaGVyZT8KKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmFsdWVfdHlwZSBvcGVyYXRvciBbXShjb25zdCBrZXlfdHlwZSAmIF9fa2V5KSBjb25zdAorICAgIHsKKyAgICAgICAgYXV0byBfX2l0ID0gX190YWJsZS5maW5kIChfX2tleSk7CisgICAgICAgIHJldHVybiBfX2l0ID09IF9fdGFibGUuZW5kKCkgPyBfX2RlZmF1bHRfdmFsdWVfIDogX19pdC0+c2Vjb25kOworICAgIH0KK307CisgICAgCisKKy8vICBTcGVjaWFsIGNhc2Ugc21hbGwgbnVtZXJpYyB2YWx1ZXM7IHVzZSBhbiBhcnJheQordGVtcGxhdGU8Y2xhc3MgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KK2NsYXNzIF9CTVNraXBUYWJsZTxfS2V5LCBfVmFsdWUsIF9IYXNoLCBfQmluYXJ5UHJlZGljYXRlLCB0cnVlPiB7Citwcml2YXRlOgorICAgIHR5cGVkZWYgX1ZhbHVlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfS2V5ICAga2V5X3R5cGU7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6bWFrZV91bnNpZ25lZDxrZXlfdHlwZT46OnR5cGUgdW5zaWduZWRfa2V5X3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OmFycmF5PHZhbHVlX3R5cGUsIF9WU1REOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZF9rZXlfdHlwZT46Om1heCgpPiBza2lwX21hcDsKKyAgICBza2lwX21hcCBfX3RhYmxlOworCitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9CTVNraXBUYWJsZShzdGQ6OnNpemVfdCAvKl9fc3oqLywgX1ZhbHVlIF9fZGVmYXVsdCwgX0hhc2ggLypfX2hmKi8sIF9CaW5hcnlQcmVkaWNhdGUgLypfX3ByZWQqLykKKyAgICB7CisgICAgICAgIHN0ZDo6ZmlsbF9uKF9fdGFibGUuYmVnaW4oKSwgX190YWJsZS5zaXplKCksIF9fZGVmYXVsdCk7CisgICAgfQorICAgIAorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGluc2VydChrZXlfdHlwZSBfX2tleSwgdmFsdWVfdHlwZSBfX3ZhbCkKKyAgICB7CisgICAgICAgIF9fdGFibGVbc3RhdGljX2Nhc3Q8dW5zaWduZWRfa2V5X3R5cGU+KF9fa2V5KV0gPSBfX3ZhbDsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmFsdWVfdHlwZSBvcGVyYXRvciBbXShrZXlfdHlwZSBfX2tleSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBfX3RhYmxlW3N0YXRpY19jYXN0PHVuc2lnbmVkX2tleV90eXBlPihfX2tleSldOworICAgIH0KK307CisKKwordGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEsIAorICAgICAgICAgIGNsYXNzIF9IYXNoID0gaGFzaDx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMT46OnZhbHVlX3R5cGU+LCAKKyAgICAgICAgICBjbGFzcyBfQmluYXJ5UHJlZGljYXRlID0gZXF1YWxfdG88Pj4KK19MSUJDUFBfVFlQRV9WSVMKK2NsYXNzIGJveWVyX21vb3JlX3NlYXJjaGVyIHsKK3ByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3IxPjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9CTVNraXBUYWJsZTx2YWx1ZV90eXBlLCBkaWZmZXJlbmNlX3R5cGUsIF9IYXNoLCBfQmluYXJ5UHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICBfVlNURDo6aXNfaW50ZWdyYWw8dmFsdWVfdHlwZT46OnZhbHVlICYmIC8vIHdoYXQgYWJvdXQgZW51bXM/CisgICAgICAgICAgICAgICAgICAgIHNpemVvZih2YWx1ZV90eXBlKSA9PSAxICYmCisgICAgICAgICAgICAgICAgICAgIGlzX3NhbWU8X0hhc2gsIGhhc2g8dmFsdWVfdHlwZT4+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICBpc19zYW1lPF9CaW5hcnlQcmVkaWNhdGUsIGVxdWFsX3RvPD4+Ojp2YWx1ZQorICAgICAgICAgICAgPiBza2lwX3RhYmxlX3R5cGU7CisgICAgCitwdWJsaWM6CisgICAgYm95ZXJfbW9vcmVfc2VhcmNoZXIoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMSBfX2YsIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEgX19sLCAKKyAgICAgICAgICAgICAgICBfSGFzaCBfX2hmID0gX0hhc2goKSwgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQgPSBfQmluYXJ5UHJlZGljYXRlKCkpCisgICAgICAgICAgICA6IF9fZmlyc3RfKF9fZiksIF9fbGFzdF8oX19sKSwgX19wcmVkXyhfX3ByZWQpLAorICAgICAgICAgICAgICBfX3BhdHRlcm5fbGVuZ3RoXyhfVlNURDo6ZGlzdGFuY2UoX19maXJzdF8sIF9fbGFzdF8pKSwKKyAgICAgICAgICAgICAgX19za2lwX3ttYWtlX3NoYXJlZDxza2lwX3RhYmxlX3R5cGU+KF9fcGF0dGVybl9sZW5ndGhfLCAtMSwgX19oZiwgX19wcmVkXyl9LAorICAgICAgICAgICAgICBfX3N1ZmZpeF97bWFrZV9zaGFyZWQ8dmVjdG9yPGRpZmZlcmVuY2VfdHlwZT4+KF9fcGF0dGVybl9sZW5ndGhfICsgMSl9CisgICAgICAgIHsKKyAgICAvLyAgYnVpbGQgdGhlIHNraXAgdGFibGUKKyAgICAgICAgZm9yICggZGlmZmVyZW5jZV90eXBlIF9faSA9IDA7IF9fZiAhPSBfX2w7ICsrX19mLCAodm9pZCkgKytfX2kgKQorICAgICAgICAgICAgX19za2lwXy0+aW5zZXJ0KCpfX2YsIF9faSk7CisKKyAgICAgICAgdGhpcy0+X19idWlsZF9zdWZmaXhfdGFibGUgKCBfX2ZpcnN0XywgX19sYXN0XywgX19wcmVkXyApOworICAgICAgICB9CisgICAgICAgIAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyPgorICAgIHBhaXI8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMiwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMj4KKyAgICBvcGVyYXRvciAoKShfUmFuZG9tQWNjZXNzSXRlcmF0b3IyIF9fZiwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMiBfX2wpIGNvbnN0CisgICAgeworICAgICAgICBzdGF0aWNfYXNzZXJ0ICggc3RkOjppc19zYW1lPAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6X191bmN2cmVmPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlPjo6dHlwZSwgCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpfX3VuY3ZyZWY8dHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMj46OnZhbHVlX3R5cGU+Ojp0eXBlCisgICAgICAgICAgICAgICAgICAgID46OnZhbHVlLAorICAgICAgICAgICAgICAgICJDb3JwdXMgYW5kIFBhdHRlcm4gaXRlcmF0b3JzIG11c3QgcG9pbnQgdG8gdGhlIHNhbWUgdHlwZSIgKTsKKworICAgICAgICBpZiAoX19mICAgICAgPT0gX19sICkgICAgcmV0dXJuIG1ha2VfcGFpcihfX2wsIF9fbCk7IC8vIGVtcHR5IGNvcnB1cworICAgICAgICBpZiAoX19maXJzdF8gPT0gX19sYXN0XykgcmV0dXJuIG1ha2VfcGFpcihfX2YsIF9fZik7IC8vIGVtcHR5IHBhdHRlcm4KKworICAgIC8vICBJZiB0aGUgcGF0dGVybiBpcyBsYXJnZXIgdGhhbiB0aGUgY29ycHVzLCB3ZSBjYW4ndCBmaW5kIGl0IQorICAgICAgICBpZiAoIF9fcGF0dGVybl9sZW5ndGhfID4gX1ZTVEQ6OmRpc3RhbmNlIChfX2YsIF9fbCkpIAorICAgICAgICAgICAgcmV0dXJuIG1ha2VfcGFpcihfX2wsIF9fbCk7CisKKyAgICAvLyAgRG8gdGhlIHNlYXJjaCAKKyAgICAgICAgcmV0dXJuIHRoaXMtPl9fc2VhcmNoKF9fZiwgX19sKTsKKyAgICB9CisgICAgICAgIAorcHVibGljOiAvLyBUT0RPIHByaXZhdGU6CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMSAgICAgICAgICAgICAgIF9fZmlyc3RfOworICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEgICAgICAgICAgICAgICBfX2xhc3RfOworICAgIF9CaW5hcnlQcmVkaWNhdGUgICAgICAgICAgICAgICAgICAgICBfX3ByZWRfOworICAgIGRpZmZlcmVuY2VfdHlwZSAgICAgICAgICAgICAgICAgICAgICBfX3BhdHRlcm5fbGVuZ3RoXzsKKyAgICBzaGFyZWRfcHRyPHNraXBfdGFibGVfdHlwZT4gICAgICAgICAgX19za2lwXzsKKyAgICBzaGFyZWRfcHRyPHZlY3RvcjxkaWZmZXJlbmNlX3R5cGU+PiAgX19zdWZmaXhfOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjI+CisgICAgcGFpcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IyLCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyPgorICAgIF9fc2VhcmNoKF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIgX19mLCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyIF9fbCkgY29uc3QKKyAgICB7CisgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIgX19jdXIgPSBfX2Y7CisgICAgICAgIGNvbnN0IF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIgX19sYXN0ID0gX19sIC0gX19wYXR0ZXJuX2xlbmd0aF87CisgICAgICAgIGNvbnN0IHNraXBfdGFibGVfdHlwZSAmICAgICAgICAgX19za2lwICAgPSAqX19za2lwXy5nZXQoKTsKKyAgICAgICAgY29uc3QgdmVjdG9yPGRpZmZlcmVuY2VfdHlwZT4gJiBfX3N1ZmZpeCA9ICpfX3N1ZmZpeF8uZ2V0KCk7CisgICAgICAgIAorICAgICAgICB3aGlsZSAoX19jdXIgPD0gX19sYXN0KQorICAgICAgICB7CisKKyAgICAgICAgLy8gIERvIHdlIG1hdGNoIHJpZ2h0IHdoZXJlIHdlIGFyZT8KKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2ogPSBfX3BhdHRlcm5fbGVuZ3RoXzsKKyAgICAgICAgICAgIHdoaWxlIChfX3ByZWRfKF9fZmlyc3RfIFtfX2otMV0sIF9fY3VyIFtfX2otMV0pKSB7CisgICAgICAgICAgICAgICAgX19qLS07CisgICAgICAgICAgICAvLyAgV2UgbWF0Y2hlZCAtIHdlJ3JlIGRvbmUhCisgICAgICAgICAgICAgICAgaWYgKCBfX2ogPT0gMCApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlX3BhaXIoX19jdXIsIF9fY3VyICsgX19wYXR0ZXJuX2xlbmd0aF8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAvLyAgU2luY2Ugd2UgZGlkbid0IG1hdGNoLCBmaWd1cmUgb3V0IGhvdyBmYXIgdG8gc2tpcCBmb3J3YXJkCisgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19rID0gX19za2lwW19fY3VyIFsgX19qIC0gMSBdXTsKKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX20gPSBfX2ogLSBfX2sgLSAxOworICAgICAgICAgICAgaWYgKF9fayA8IF9faiAmJiBfX20gPiBfX3N1ZmZpeFsgX19qIF0pCisgICAgICAgICAgICAgICAgX19jdXIgKz0gX19tOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9fY3VyICs9IF9fc3VmZml4WyBfX2ogXTsKKyAgICAgICAgfQorICAgIAorICAgICAgICByZXR1cm4gbWFrZV9wYWlyKF9fbCwgX19sKTsgICAgIC8vIFdlIGRpZG4ndCBmaW5kIGFueXRoaW5nCisgICAgfQorCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgdm9pZCBfX2NvbXB1dGVfYm1fcHJlZml4ICggX0l0ZXJhdG9yIF9fZiwgX0l0ZXJhdG9yIF9fbCwgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQsIF9Db250YWluZXIgJl9fcHJlZml4ICkKKyAgICB7CisgICAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IF9fY291bnQgPSBfVlNURDo6ZGlzdGFuY2UoX19mLCBfX2wpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIF9fcHJlZml4WzBdID0gMDsKKyAgICAgICAgc3RkOjpzaXplX3QgX19rID0gMDsKKyAgICAgICAgZm9yICggc3RkOjpzaXplX3QgX19pID0gMTsgX19pIDwgX19jb3VudDsgKytfX2kgKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoIF9fayA+IDAgJiYgIV9fcHJlZCAoIF9fZltfX2tdLCBfX2ZbX19pXSApKQorICAgICAgICAgICAgICAgIF9fayA9IF9fcHJlZml4IFsgX19rIC0gMSBdOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCBfX3ByZWQgKCBfX2ZbX19rXSwgX19mW19faV0gKSkKKyAgICAgICAgICAgICAgICBfX2srKzsKKyAgICAgICAgICAgIF9fcHJlZml4IFsgX19pIF0gPSBfX2s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIF9fYnVpbGRfc3VmZml4X3RhYmxlKF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEgX19mLCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IxIF9fbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgICBjb25zdCBzdGQ6OnNpemVfdCBfX2NvdW50ID0gX1ZTVEQ6OmRpc3RhbmNlKF9fZiwgX19sKTsKKyAgICAgICAgdmVjdG9yPGRpZmZlcmVuY2VfdHlwZT4gJiBfX3N1ZmZpeCA9ICpfX3N1ZmZpeF8uZ2V0KCk7CisgICAgICAgIGlmIChfX2NvdW50ID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgX1ZTVEQ6OnZlY3Rvcjx2YWx1ZV90eXBlPiBfX3NjcmF0Y2goX19jb3VudCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIF9fY29tcHV0ZV9ibV9wcmVmaXgoX19mLCBfX2wsIF9fcHJlZCwgX19zY3JhdGNoKTsKKyAgICAgICAgICAgIGZvciAoIHN0ZDo6c2l6ZV90IF9faSA9IDA7IF9faSA8PSBfX2NvdW50OyBfX2krKyApCisgICAgICAgICAgICAgICAgX19zdWZmaXhbX19pXSA9IF9fY291bnQgLSBfX3NjcmF0Y2hbX19jb3VudC0xXTsKKyAgICAKKyAgICAgICAgICAgIHR5cGVkZWYgX1ZTVEQ6OnJldmVyc2VfaXRlcmF0b3I8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMT4gX1Jldkl0ZXI7CisgICAgICAgICAgICBfX2NvbXB1dGVfYm1fcHJlZml4KF9SZXZJdGVyKF9fbCksIF9SZXZJdGVyKF9fZiksIF9fcHJlZCwgX19zY3JhdGNoKTsKKyAgICAgCisgICAgICAgICAgICBmb3IgKCBzdGQ6OnNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX2NvdW50OyBfX2krKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaXplX3QgICAgIF9faiA9IF9fY291bnQgLSBfX3NjcmF0Y2hbX19pXTsKKyAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19rID0gX19pICAgICAtIF9fc2NyYXRjaFtfX2ldICsgMTsKKyAgICAgCisgICAgICAgICAgICAgICAgaWYgKF9fc3VmZml4W19fal0gPiBfX2spCisgICAgICAgICAgICAgICAgICAgIF9fc3VmZml4W19fal0gPSBfX2s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK307CisKK3RlbXBsYXRlPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgCisgICAgICAgICBjbGFzcyBfSGFzaCA9IGhhc2g8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGU+LCAKKyAgICAgICAgIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGUgPSBlcXVhbF90bzw+PgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm95ZXJfbW9vcmVfc2VhcmNoZXI8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfSGFzaCwgX0JpbmFyeVByZWRpY2F0ZT4KK21ha2VfYm95ZXJfbW9vcmVfc2VhcmNoZXIoIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2YsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2wsIAorICAgICAgICAgICAgICAgICAgICBfSGFzaCBfX2hmID0gX0hhc2goKSwgX0JpbmFyeVByZWRpY2F0ZSBfX3AgPSBfQmluYXJ5UHJlZGljYXRlICgpKQoreworICAgIHJldHVybiBib3llcl9tb29yZV9zZWFyY2hlcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9IYXNoLCBfQmluYXJ5UHJlZGljYXRlPihfX2YsIF9fbCwgX19oZiwgX19wKTsKK30KKworLy8gYm95ZXItbW9vcmUtaG9yc3Bvb2wKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IxLCAKKyAgICAgICAgICBjbGFzcyBfSGFzaCA9IGhhc2g8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlPiwgCisgICAgICAgICAgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZSA9IGVxdWFsX3RvPD4+CitfTElCQ1BQX1RZUEVfVklTCitjbGFzcyBib3llcl9tb29yZV9ob3JzcG9vbF9zZWFyY2hlciB7Citwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMT46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3IxPjo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQk1Ta2lwVGFibGU8dmFsdWVfdHlwZSwgZGlmZmVyZW5jZV90eXBlLCBfSGFzaCwgX0JpbmFyeVByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmlzX2ludGVncmFsPHZhbHVlX3R5cGU+Ojp2YWx1ZSAmJiAvLyB3aGF0IGFib3V0IGVudW1zPworICAgICAgICAgICAgICAgICAgICBzaXplb2YodmFsdWVfdHlwZSkgPT0gMSAmJgorICAgICAgICAgICAgICAgICAgICBpc19zYW1lPF9IYXNoLCBoYXNoPHZhbHVlX3R5cGU+Pjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgaXNfc2FtZTxfQmluYXJ5UHJlZGljYXRlLCBlcXVhbF90bzw+Pjo6dmFsdWUKKyAgICAgICAgICAgID4gc2tpcF90YWJsZV90eXBlOworCitwdWJsaWM6CisgICAgYm95ZXJfbW9vcmVfaG9yc3Bvb2xfc2VhcmNoZXIoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMSBfX2YsIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEgX19sLCAKKyAgICAgICAgICAgICAgICBfSGFzaCBfX2hmID0gX0hhc2goKSwgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQgPSBfQmluYXJ5UHJlZGljYXRlKCkpCisgICAgICAgICAgICA6IF9fZmlyc3RfKF9fZiksIF9fbGFzdF8oX19sKSwgX19wcmVkXyhfX3ByZWQpLAorICAgICAgICAgICAgICBfX3BhdHRlcm5fbGVuZ3RoXyhfVlNURDo6ZGlzdGFuY2UoX19maXJzdF8sIF9fbGFzdF8pKSwKKyAgICAgICAgICAgICAgX19za2lwX3tfVlNURDo6bWFrZV9zaGFyZWQ8c2tpcF90YWJsZV90eXBlPihfX3BhdHRlcm5fbGVuZ3RoXywgX19wYXR0ZXJuX2xlbmd0aF8sIF9faGYsIF9fcHJlZF8pfQorICAgICAgICB7CisgICAgLy8gIGJ1aWxkIHRoZSBza2lwIHRhYmxlCisgICAgICAgICAgICBpZiAoIF9fZiAhPSBfX2wgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fbCA9IF9fbCAtIDE7CisgICAgICAgICAgICAgICAgZm9yICggZGlmZmVyZW5jZV90eXBlIF9faSA9IDA7IF9fZiAhPSBfX2w7ICsrX19mLCAodm9pZCkgKytfX2kgKQorICAgICAgICAgICAgICAgICAgICBfX3NraXBfLT5pbnNlcnQoKl9fZiwgX19wYXR0ZXJuX2xlbmd0aF8gLSAxIC0gX19pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjI+CisgICAgcGFpcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IyLCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyPgorICAgIG9wZXJhdG9yICgpKF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIgX19mLCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyIF9fbCkgY29uc3QKKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQgKCBzdGQ6OmlzX3NhbWU8CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpfX3VuY3ZyZWY8dHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMT46OnZhbHVlX3R5cGU+Ojp0eXBlLCAKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Ol9fdW5jdnJlZjx0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3IyPjo6dmFsdWVfdHlwZT46OnR5cGUKKyAgICAgICAgICAgICAgICAgICAgPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIkNvcnB1cyBhbmQgUGF0dGVybiBpdGVyYXRvcnMgbXVzdCBwb2ludCB0byB0aGUgc2FtZSB0eXBlIiApOworCisgICAgICAgIGlmIChfX2YgICAgICA9PSBfX2wgKSAgICByZXR1cm4gbWFrZV9wYWlyKF9fbCwgX19sKTsgLy8gZW1wdHkgY29ycHVzCisgICAgICAgIGlmIChfX2ZpcnN0XyA9PSBfX2xhc3RfKSByZXR1cm4gbWFrZV9wYWlyKF9fZiwgX19mKTsgLy8gZW1wdHkgcGF0dGVybgorCisgICAgLy8gIElmIHRoZSBwYXR0ZXJuIGlzIGxhcmdlciB0aGFuIHRoZSBjb3JwdXMsIHdlIGNhbid0IGZpbmQgaXQhCisgICAgICAgIGlmICggX19wYXR0ZXJuX2xlbmd0aF8gPiBfVlNURDo6ZGlzdGFuY2UgKF9fZiwgX19sKSkgCisgICAgICAgICAgICByZXR1cm4gbWFrZV9wYWlyKF9fbCwgX19sKTsKKworICAgIC8vICBEbyB0aGUgc2VhcmNoIAorICAgICAgICByZXR1cm4gdGhpcy0+X19zZWFyY2goX19mLCBfX2wpOworICAgIH0KKyAgICAgICAgCitwcml2YXRlOgorICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEgICAgICBfX2ZpcnN0XzsKKyAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IxICAgICAgX19sYXN0XzsKKyAgICBfQmluYXJ5UHJlZGljYXRlICAgICAgICAgICAgX19wcmVkXzsKKyAgICBkaWZmZXJlbmNlX3R5cGUgICAgICAgICAgICAgX19wYXR0ZXJuX2xlbmd0aF87CisgICAgc2hhcmVkX3B0cjxza2lwX3RhYmxlX3R5cGU+IF9fc2tpcF87CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMj4KKyAgICBwYWlyPF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIsIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjI+CisgICAgX19zZWFyY2ggKCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyIF9fZiwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMiBfX2wgKSBjb25zdCB7CisgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIgX19jdXIgPSBfX2Y7CisgICAgICAgIGNvbnN0IF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIgX19sYXN0ID0gX19sIC0gX19wYXR0ZXJuX2xlbmd0aF87CisgICAgICAgIGNvbnN0IHNraXBfdGFibGVfdHlwZSAmIF9fc2tpcCA9ICpfX3NraXBfLmdldCgpOworCisgICAgICAgIHdoaWxlIChfX2N1ciA8PSBfX2xhc3QpCisgICAgICAgIHsKKyAgICAgICAgLy8gIERvIHdlIG1hdGNoIHJpZ2h0IHdoZXJlIHdlIGFyZT8KKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2ogPSBfX3BhdHRlcm5fbGVuZ3RoXzsKKyAgICAgICAgICAgIHdoaWxlIChfX3ByZWRfKF9fZmlyc3RfW19fai0xXSwgX19jdXJbX19qLTFdKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX2otLTsKKyAgICAgICAgICAgIC8vICBXZSBtYXRjaGVkIC0gd2UncmUgZG9uZSEKKyAgICAgICAgICAgICAgICBpZiAoIF9faiA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VfcGFpcihfX2N1ciwgX19jdXIgKyBfX3BhdHRlcm5fbGVuZ3RoXyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2N1ciArPSBfX3NraXBbX19jdXJbX19wYXR0ZXJuX2xlbmd0aF8tMV1dOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gbWFrZV9wYWlyKF9fbCwgX19sKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIAorICAgICAgICAgY2xhc3MgX0hhc2ggPSBoYXNoPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPiwgCisgICAgICAgICBjbGFzcyBfQmluYXJ5UHJlZGljYXRlID0gZXF1YWxfdG88Pj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2JveWVyX21vb3JlX2hvcnNwb29sX3NlYXJjaGVyPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX0hhc2gsIF9CaW5hcnlQcmVkaWNhdGU+CittYWtlX2JveWVyX21vb3JlX2hvcnNwb29sX3NlYXJjaGVyKCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19mLCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sLCAKKyAgICAgICAgICAgICAgICAgICAgX0hhc2ggX19oZiA9IF9IYXNoKCksIF9CaW5hcnlQcmVkaWNhdGUgX19wID0gX0JpbmFyeVByZWRpY2F0ZSAoKSkKK3sKKyAgICByZXR1cm4gYm95ZXJfbW9vcmVfaG9yc3Bvb2xfc2VhcmNoZXI8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfSGFzaCwgX0JpbmFyeVByZWRpY2F0ZT4oX19mLCBfX2wsIF9faGYsIF9fcCk7Cit9CisKKyNlbmRpZiAvLyBfTElCQ1BQX1NURF9WRVIgPiAxMQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfTEZUUworCitfTElCQ1BQX1BPUF9NQUNST1MKKworI2VuZGlmIC8qIF9MSUJDUFBfRVhQRVJJTUVOVEFMX0ZVTkNUSU9OQUwgKi8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvaXRlcmF0b3IgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL2l0ZXJhdG9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNjcyZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL2l0ZXJhdG9yCkBAIC0wLDAgKzEsMTE0IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpdGVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0VYUEVSSU1FTlRBTF9JVEVSQVRPUgorI2RlZmluZSBfTElCQ1BQX0VYUEVSSU1FTlRBTF9JVEVSQVRPUgorCisvKgorbmFtZXNwYWNlIHN0ZCB7CisgIG5hbWVzcGFjZSBleHBlcmltZW50YWwgeworICAgIGlubGluZSBuYW1lc3BhY2UgZnVuZGFtZW50YWxzX3YyIHsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBEZWxpbVQsIGNsYXNzIGNoYXJUID0gY2hhciwgY2xhc3MgdHJhaXRzID0gY2hhcl90cmFpdHM8Y2hhclQ+PgorICAgICAgICBjbGFzcyBvc3RyZWFtX2pvaW5lciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgIHR5cGVkZWYgY2hhclQgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgICAgICB0eXBlZGVmIHRyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgICAgICAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4gb3N0cmVhbV90eXBlOworICAgICAgICAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgCisgICAgICAgICBvc3RyZWFtX2pvaW5lcihvc3RyZWFtX3R5cGUmIHMsIGNvbnN0IERlbGltVCYgZGVsaW1pdGVyKTsKKyAgICAgICAgIG9zdHJlYW1fam9pbmVyKG9zdHJlYW1fdHlwZSYgcywgRGVsaW1UJiYgZGVsaW1pdGVyKTsKKworICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gIAorICAgICAgICAgb3N0cmVhbV9qb2luZXImIG9wZXJhdG9yPShjb25zdCBUJiB2YWx1ZSk7CisKKyAgICAgICAgIG9zdHJlYW1fam9pbmVyJiBvcGVyYXRvciooKSBub2V4Y2VwdDsKKyAgICAgICAgIG9zdHJlYW1fam9pbmVyJiBvcGVyYXRvcisrKCkgbm9leGNlcHQ7CisgICAgICAgICBvc3RyZWFtX2pvaW5lciYgb3BlcmF0b3IrKyhpbnQpIG5vZXhjZXB0OworICAgcHJpdmF0ZToKKyAgICAgIG9zdHJlYW1fdHlwZSogb3V0X3N0cmVhbTsgICAvLyBleHBvc2l0aW9uIG9ubHkgCisgICAgICBEZWxpbVQgZGVsaW07ICAgICAgICAgICAgICAgLy8gZXhwb3NpdGlvbiBvbmx5IAorICAgICAgYm9vbCBmaXJzdF9lbGVtZW50OyAgICAgICAgIC8vIGV4cG9zaXRpb24gb25seQorICAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgRGVsaW1UPgorICAgIG9zdHJlYW1fam9pbmVyPGRlY2F5X3Q8RGVsaW1UPiwgY2hhclQsIHRyYWl0cz4KKyAgICBtYWtlX29zdHJlYW1fam9pbmVyKGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mIG9zLCBEZWxpbVQmJiBkZWxpbWl0ZXIpOworCisgICAgfSAvLyBpbmxpbmUgbmFtZXNwYWNlIGZ1bmRhbWVudGFsc192MgorICB9IC8vIG5hbWVzcGFjZSBleHBlcmltZW50YWwKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisqLworCisjaW5jbHVkZSA8ZXhwZXJpbWVudGFsL19fY29uZmlnPgorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9MRlRTCisKK3RlbXBsYXRlIDxjbGFzcyBfRGVsaW0sIGNsYXNzIF9DaGFyVCA9IGNoYXIsIGNsYXNzIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+PgorY2xhc3Mgb3N0cmVhbV9qb2luZXIgeworcHVibGljOgorCisgICAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworICAgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxjaGFyX3R5cGUsdHJhaXRzX3R5cGU+IG9zdHJlYW1fdHlwZTsKKyAgICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKworICAgIG9zdHJlYW1fam9pbmVyKG9zdHJlYW1fdHlwZSYgX19vcywgX0RlbGltJiYgX19kKQorICAgICAgICA6IF9fb3V0cHV0X2l0ZXIoX1ZTVEQ6OmFkZHJlc3NvZihfX29zKSksIF9fZGVsaW0oX1ZTVEQ6Om1vdmUoX19kKSksIF9fZmlyc3QodHJ1ZSkge30KKyAgICAgICAgCisgICAgb3N0cmVhbV9qb2luZXIob3N0cmVhbV90eXBlJiBfX29zLCBjb25zdCBfRGVsaW0mIF9fZCkKKyAgICAgICAgOiBfX291dHB1dF9pdGVyKF9WU1REOjphZGRyZXNzb2YoX19vcykpLCBfX2RlbGltKF9fZCksIF9fZmlyc3QodHJ1ZSkge30KKyAgICAKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBvc3RyZWFtX2pvaW5lciYgb3BlcmF0b3I9KGNvbnN0IF9UcCYgX192KQorICAgIHsKKyAgICAgICAgaWYgKCFfX2ZpcnN0KQorICAgICAgICAgICAgKl9fb3V0cHV0X2l0ZXIgPDwgX19kZWxpbTsKKyAgICAgICAgX19maXJzdCA9IGZhbHNlOworICAgICAgICAqX19vdXRwdXRfaXRlciA8PCBfX3Y7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvc3RyZWFtX2pvaW5lciYgb3BlcmF0b3IqKCkgICAgIF9OT0VYQ0VQVCB7IHJldHVybiAqdGhpczsgfQorICAgIG9zdHJlYW1fam9pbmVyJiBvcGVyYXRvcisrKCkgICAgX05PRVhDRVBUIHsgcmV0dXJuICp0aGlzOyB9CisgICAgb3N0cmVhbV9qb2luZXImIG9wZXJhdG9yKysoaW50KSBfTk9FWENFUFQgeyByZXR1cm4gKnRoaXM7IH0KKworcHJpdmF0ZToKKyAgICBvc3RyZWFtX3R5cGUqICAgX19vdXRwdXRfaXRlcjsKKyAgICBfRGVsaW0gICAgICAgICAgX19kZWxpbTsKKyAgICBib29sICAgICAgICAgICAgX19maXJzdDsKK307CisKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0RlbGltPgorb3N0cmVhbV9qb2luZXI8dHlwZW5hbWUgZGVjYXk8X0RlbGltPjo6dHlwZSwgX0NoYXJULCBfVHJhaXRzPgorbWFrZV9vc3RyZWFtX2pvaW5lcihiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIF9EZWxpbSAmJiBfX2QpCit7IHJldHVybiBvc3RyZWFtX2pvaW5lcjx0eXBlbmFtZSBkZWNheTxfRGVsaW0+Ojp0eXBlLCBfQ2hhclQsIF9UcmFpdHM+KF9fb3MsIF9WU1REOjpmb3J3YXJkPF9EZWxpbT4oX19kKSk7IH0KKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX0xGVFMKKworI2VuZGlmIC8qIF9MSUJDUFBfU1REX1ZFUiA+IDExICovCisKKyNlbmRpZiAvLyBfTElCQ1BQX0VYUEVSSU1FTlRBTF9JVEVSQVRPUgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9saXN0IGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9saXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NzhlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL2xpc3QKQEAgLTAsMCArMSw0NyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGxpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0VYUEVSSU1FTlRBTF9MSVNUCisjZGVmaW5lIF9MSUJDUFBfRVhQRVJJTUVOVEFMX0xJU1QKKy8qCisgICAgZXhwZXJpbWVudGFsL2xpc3Qgc3lub3BzaXMKKworLy8gQysrMXoKK25hbWVzcGFjZSBzdGQgeworbmFtZXNwYWNlIGV4cGVyaW1lbnRhbCB7CitpbmxpbmUgbmFtZXNwYWNlIGZ1bmRhbWVudGFsc192MSB7CituYW1lc3BhY2UgcG1yIHsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgdXNpbmcgbGlzdCA9IHN0ZDo6bGlzdDxULHBvbHltb3JwaGljX2FsbG9jYXRvcjxUPj47CisKK30gLy8gbmFtZXNwYWNlIHBtcgorfSAvLyBuYW1lc3BhY2UgZnVuZGFtZW50YWxzX3YxCit9IC8vIG5hbWVzcGFjZSBleHBlcmltZW50YWwKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisgKi8KKworI2luY2x1ZGUgPGV4cGVyaW1lbnRhbC9fX2NvbmZpZz4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPGV4cGVyaW1lbnRhbC9tZW1vcnlfcmVzb3VyY2U+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9MRlRTX1BNUgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlVD4KK3VzaW5nIGxpc3QgPSBfVlNURDo6bGlzdDxfVmFsdWVULCBwb2x5bW9ycGhpY19hbGxvY2F0b3I8X1ZhbHVlVD4+OworCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfTEZUU19QTVIKKworI2VuZGlmIC8qIF9MSUJDUFBfRVhQRVJJTUVOVEFMX0xJU1QgKi8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvbWFwIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZmMmM1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvbWFwCkBAIC0wLDAgKzEsNTcgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1hcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfRVhQRVJJTUVOVEFMX01BUAorI2RlZmluZSBfTElCQ1BQX0VYUEVSSU1FTlRBTF9NQVAKKy8qCisgICAgZXhwZXJpbWVudGFsL21hcCBzeW5vcHNpcworCisvLyBDKysxegorbmFtZXNwYWNlIHN0ZCB7CituYW1lc3BhY2UgZXhwZXJpbWVudGFsIHsKK2lubGluZSBuYW1lc3BhY2UgZnVuZGFtZW50YWxzX3YxIHsKK25hbWVzcGFjZSBwbXIgeworCisgIHRlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIENvbXBhcmUgPSBsZXNzPEtleT4+CisgIHVzaW5nIG1hcCA9IHN0ZDo6bWFwPEtleSwgVCwgQ29tcGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcG9seW1vcnBoaWNfYWxsb2NhdG9yPHBhaXI8Y29uc3QgS2V5LFQ+Pj47CisKKyAgdGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVCwgY2xhc3MgQ29tcGFyZSA9IGxlc3M8S2V5Pj4KKyAgdXNpbmcgbXVsdGltYXAgPSBzdGQ6Om11bHRpbWFwPEtleSwgVCwgQ29tcGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHltb3JwaGljX2FsbG9jYXRvcjxwYWlyPGNvbnN0IEtleSxUPj4+OworCit9IC8vIG5hbWVzcGFjZSBwbXIKK30gLy8gbmFtZXNwYWNlIGZ1bmRhbWVudGFsc192MQorfSAvLyBuYW1lc3BhY2UgZXhwZXJpbWVudGFsCit9IC8vIG5hbWVzcGFjZSBzdGQKKworICovCisKKyNpbmNsdWRlIDxleHBlcmltZW50YWwvX19jb25maWc+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGV4cGVyaW1lbnRhbC9tZW1vcnlfcmVzb3VyY2U+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9MRlRTX1BNUgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyAgX0NvbXBhcmUgPSBsZXNzPF9LZXk+PgordXNpbmcgbWFwID0gX1ZTVEQ6Om1hcDxfS2V5LCBfVmFsdWUsIF9Db21wYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgcG9seW1vcnBoaWNfYWxsb2NhdG9yPHBhaXI8Y29uc3QgX0tleSwgX1ZhbHVlPj4+OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyAgX0NvbXBhcmUgPSBsZXNzPF9LZXk+PgordXNpbmcgbXVsdGltYXAgPSBfVlNURDo6bXVsdGltYXA8X0tleSwgX1ZhbHVlLCBfQ29tcGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvbHltb3JwaGljX2FsbG9jYXRvcjxwYWlyPGNvbnN0IF9LZXksIF9WYWx1ZT4+PjsKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX0xGVFNfUE1SCisKKyNlbmRpZiAvKiBfTElCQ1BQX0VYUEVSSU1FTlRBTF9NQVAgKi8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvbWVtb3J5X3Jlc291cmNlIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9tZW1vcnlfcmVzb3VyY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwMWYzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvbWVtb3J5X3Jlc291cmNlCkBAIC0wLDAgKzEsNDI3IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWVtb3J5X3Jlc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0VYUEVSSU1FTlRBTF9NRU1PUllfUkVTT1VSQ0UKKyNkZWZpbmUgX0xJQkNQUF9FWFBFUklNRU5UQUxfTUVNT1JZX1JFU09VUkNFCisKKy8qKgorICAgIGV4cGVyaW1lbnRhbC9tZW1vcnlfcmVzb3VyY2Ugc3lub3BzaXMKKworLy8gQysrMXkKKworbmFtZXNwYWNlIHN0ZCB7CituYW1lc3BhY2UgZXhwZXJpbWVudGFsIHsKK2lubGluZSBuYW1lc3BhY2UgZnVuZGFtZW50YWxzX3YxIHsKK25hbWVzcGFjZSBwbXIgeworCisgIGNsYXNzIG1lbW9yeV9yZXNvdXJjZTsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgbWVtb3J5X3Jlc291cmNlJiBhLAorICAgICAgICAgICAgICAgICAgY29uc3QgbWVtb3J5X3Jlc291cmNlJiBiKSBub2V4Y2VwdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IG1lbW9yeV9yZXNvdXJjZSYgYSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IG1lbW9yeV9yZXNvdXJjZSYgYikgbm9leGNlcHQ7CisKKyAgdGVtcGxhdGUgPGNsYXNzIFRwPiBjbGFzcyBwb2x5bW9ycGhpY19hbGxvY2F0b3I7CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBvbHltb3JwaGljX2FsbG9jYXRvcjxUMT4mIGEsCisgICAgICAgICAgICAgICAgICBjb25zdCBwb2x5bW9ycGhpY19hbGxvY2F0b3I8VDI+JiBiKSBub2V4Y2VwdDsKKyAgdGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHBvbHltb3JwaGljX2FsbG9jYXRvcjxUMT4mIGEsCisgICAgICAgICAgICAgICAgICBjb25zdCBwb2x5bW9ycGhpY19hbGxvY2F0b3I8VDI+JiBiKSBub2V4Y2VwdDsKKworICAvLyBUaGUgbmFtZSByZXNvdXJjZV9hZGFwdG9yX2ltcCBpcyBmb3IgZXhwb3NpdGlvbiBvbmx5LgorICB0ZW1wbGF0ZSA8Y2xhc3MgQWxsb2NhdG9yPiBjbGFzcyByZXNvdXJjZV9hZGFwdG9yX2ltcDsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgQWxsb2NhdG9yPgorICAgIHVzaW5nIHJlc291cmNlX2FkYXB0b3IgPSByZXNvdXJjZV9hZGFwdG9yX2ltcDwKKyAgICAgIGFsbG9jYXRvcl90cmFpdHM8QWxsb2NhdG9yPjo6cmViaW5kX2FsbG9jPGNoYXI+PjsKKworICAvLyBHbG9iYWwgbWVtb3J5IHJlc291cmNlcworICBtZW1vcnlfcmVzb3VyY2UqIG5ld19kZWxldGVfcmVzb3VyY2UoKSBub2V4Y2VwdDsKKyAgbWVtb3J5X3Jlc291cmNlKiBudWxsX21lbW9yeV9yZXNvdXJjZSgpIG5vZXhjZXB0OworCisgIC8vIFRoZSBkZWZhdWx0IG1lbW9yeSByZXNvdXJjZQorICBtZW1vcnlfcmVzb3VyY2UqIHNldF9kZWZhdWx0X3Jlc291cmNlKG1lbW9yeV9yZXNvdXJjZSogcikgbm9leGNlcHQ7CisgIG1lbW9yeV9yZXNvdXJjZSogZ2V0X2RlZmF1bHRfcmVzb3VyY2UoKSBub2V4Y2VwdDsKKworICAvLyBTdGFuZGFyZCBtZW1vcnkgcmVzb3VyY2VzCisgIHN0cnVjdCBwb29sX29wdGlvbnM7CisgIGNsYXNzIHN5bmNocm9uaXplZF9wb29sX3Jlc291cmNlOworICBjbGFzcyB1bnN5bmNocm9uaXplZF9wb29sX3Jlc291cmNlOworICBjbGFzcyBtb25vdG9uaWNfYnVmZmVyX3Jlc291cmNlOworCit9IC8vIG5hbWVzcGFjZSBwbXIKK30gLy8gbmFtZXNwYWNlIGZ1bmRhbWVudGFsc192MQorfSAvLyBuYW1lc3BhY2UgZXhwZXJpbWVudGFsCit9IC8vIG5hbWVzcGFjZSBzdGQKKworICovCisKKyNpbmNsdWRlIDxleHBlcmltZW50YWwvX19jb25maWc+CisjaW5jbHVkZSA8ZXhwZXJpbWVudGFsL19fbWVtb3J5PgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxfX2RlYnVnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9QVVNIX01BQ1JPUworI2luY2x1ZGUgPF9fdW5kZWZfbWFjcm9zPgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9MRlRTX1BNUgorCisvLyBSb3VuZCBfX3MgdXAgdG8gbmV4dCBtdWx0aXBsZSBvZiBfX2EuCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorc2l6ZV90IF9fYWxpZ25lZF9hbGxvY2F0aW9uX3NpemUoc2l6ZV90IF9fcywgc2l6ZV90IF9fYSkgX05PRVhDRVBUCit7CisgICAgX0xJQkNQUF9BU1NFUlQoX19zICsgX19hID4gX19zLCAiYWxpZ25lZCBhbGxvY2F0aW9uIHNpemUgb3ZlcmZsb3dzIik7CisgICAgcmV0dXJuIChfX3MgKyBfX2EgLSAxKSAmIH4oX19hIC0gMSk7Cit9CisKKy8vIDguNSwgbWVtb3J5LnJlc291cmNlCitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBtZW1vcnlfcmVzb3VyY2UKK3sKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IF9fbWF4X2FsaWduID0gYWxpZ25vZihtYXhfYWxpZ25fdCk7CisKKy8vIDguNS4yLCBtZW1vcnkucmVzb3VyY2UucHVibGljCitwdWJsaWM6CisgICAgdmlydHVhbCB+bWVtb3J5X3Jlc291cmNlKCkgPSBkZWZhdWx0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQqIGFsbG9jYXRlKHNpemVfdCBfX2J5dGVzLCBzaXplX3QgX19hbGlnbiA9IF9fbWF4X2FsaWduKQorICAgICAgICB7IHJldHVybiBkb19hbGxvY2F0ZShfX2J5dGVzLCBfX2FsaWduKTsgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgZGVhbGxvY2F0ZSh2b2lkICogX19wLCBzaXplX3QgX19ieXRlcywgc2l6ZV90IF9fYWxpZ24gPSBfX21heF9hbGlnbikKKyAgICAgICAgeyBkb19kZWFsbG9jYXRlKF9fcCwgX19ieXRlcywgX19hbGlnbik7IH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIGlzX2VxdWFsKG1lbW9yeV9yZXNvdXJjZSBjb25zdCAmIF9fb3RoZXIpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7IHJldHVybiBkb19pc19lcXVhbChfX290aGVyKTsgfQorCisvLyA4LjUuMywgbWVtb3J5LnJlc291cmNlLnByaXYKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQqIGRvX2FsbG9jYXRlKHNpemVfdCwgc2l6ZV90KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRvX2RlYWxsb2NhdGUodm9pZCosIHNpemVfdCwgc2l6ZV90KSA9IDA7CisgICAgdmlydHVhbCBib29sIGRvX2lzX2VxdWFsKG1lbW9yeV9yZXNvdXJjZSBjb25zdCAmKSBjb25zdCBfTk9FWENFUFQgPSAwOworfTsKKworLy8gOC41LjQsIG1lbW9yeS5yZXNvdXJjZS5lcQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3I9PShtZW1vcnlfcmVzb3VyY2UgY29uc3QgJiBfX2xocywKKyAgICAgICAgICAgICAgICBtZW1vcnlfcmVzb3VyY2UgY29uc3QgJiBfX3JocykgX05PRVhDRVBUCit7CisgICAgcmV0dXJuICZfX2xocyA9PSAmX19yaHMgfHwgX19saHMuaXNfZXF1YWwoX19yaHMpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBvcGVyYXRvciE9KG1lbW9yeV9yZXNvdXJjZSBjb25zdCAmIF9fbGhzLAorICAgICAgICAgICAgICAgIG1lbW9yeV9yZXNvdXJjZSBjb25zdCAmIF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7Cit9CisKK19MSUJDUFBfRlVOQ19WSVMKK21lbW9yeV9yZXNvdXJjZSAqIG5ld19kZWxldGVfcmVzb3VyY2UoKSBfTk9FWENFUFQ7CisKK19MSUJDUFBfRlVOQ19WSVMKK21lbW9yeV9yZXNvdXJjZSAqIG51bGxfbWVtb3J5X3Jlc291cmNlKCkgX05PRVhDRVBUOworCitfTElCQ1BQX0ZVTkNfVklTCittZW1vcnlfcmVzb3VyY2UgKiBnZXRfZGVmYXVsdF9yZXNvdXJjZSgpIF9OT0VYQ0VQVDsKKworX0xJQkNQUF9GVU5DX1ZJUworbWVtb3J5X3Jlc291cmNlICogc2V0X2RlZmF1bHRfcmVzb3VyY2UobWVtb3J5X3Jlc291cmNlICogX19uZXdfcmVzKSBfTk9FWENFUFQ7CisKKy8vIDguNiwgbWVtb3J5LnBvbHltb3JwaGljLmFsbG9jYXRvci5jbGFzcworCisvLyA4LjYuMSwgbWVtb3J5LnBvbHltb3JwaGljLmFsbG9jYXRvci5vdmVydmlldwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZVR5cGU+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBwb2x5bW9ycGhpY19hbGxvY2F0b3IKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9WYWx1ZVR5cGUgdmFsdWVfdHlwZTsKKworICAgIC8vIDguNi4yLCBtZW1vcnkucG9seW1vcnBoaWMuYWxsb2NhdG9yLmN0b3IKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcG9seW1vcnBoaWNfYWxsb2NhdG9yKCkgX05PRVhDRVBUCisgICAgICA6IF9fcmVzXyhfVlNURF9MRlRTX1BNUjo6Z2V0X2RlZmF1bHRfcmVzb3VyY2UoKSkKKyAgICB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBvbHltb3JwaGljX2FsbG9jYXRvcihtZW1vcnlfcmVzb3VyY2UgKiBfX3IpIF9OT0VYQ0VQVAorICAgICAgOiBfX3Jlc18oX19yKQorICAgIHt9CisKKyAgICBwb2x5bW9ycGhpY19hbGxvY2F0b3IocG9seW1vcnBoaWNfYWxsb2NhdG9yIGNvbnN0ICYpID0gZGVmYXVsdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBvbHltb3JwaGljX2FsbG9jYXRvcihwb2x5bW9ycGhpY19hbGxvY2F0b3I8X1RwPiBjb25zdCAmIF9fb3RoZXIpIF9OT0VYQ0VQVAorICAgICAgOiBfX3Jlc18oX19vdGhlci5yZXNvdXJjZSgpKQorICAgIHt9CisKKyAgICBwb2x5bW9ycGhpY19hbGxvY2F0b3IgJgorICAgIG9wZXJhdG9yPShwb2x5bW9ycGhpY19hbGxvY2F0b3IgY29uc3QgJikgPSBkZWxldGU7CisKKyAgICAvLyA4LjYuMywgbWVtb3J5LnBvbHltb3JwaGljLmFsbG9jYXRvci5tZW0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1ZhbHVlVHlwZSogYWxsb2NhdGUoc2l6ZV90IF9fbikgeworICAgICAgICBpZiAoX19uID4gX19tYXhfc2l6ZSgpKSB7CisgICAgICAgICAgICBfX3Rocm93X2xlbmd0aF9lcnJvcigKKyAgICAgICAgICAgICAgICAic3RkOjpleHBlcmltZW50YWw6OnBtcjo6cG9seW1vcnBoaWNfYWxsb2NhdG9yPFQ+OjphbGxvY2F0ZShzaXplX3QgbikiCisgICAgICAgICAgICAgICAgIiAnbicgZXhjZWVkcyBtYXhpbXVtIHN1cHBvcnRlZCBzaXplIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9WYWx1ZVR5cGUqPigKKyAgICAgICAgICAgIF9fcmVzXy0+YWxsb2NhdGUoX19uICogc2l6ZW9mKF9WYWx1ZVR5cGUpLCBhbGlnbm9mKF9WYWx1ZVR5cGUpKQorICAgICAgICApOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGRlYWxsb2NhdGUoX1ZhbHVlVHlwZSAqIF9fcCwgc2l6ZV90IF9fbikgX05PRVhDRVBUIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19uIDw9IF9fbWF4X3NpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgImRlYWxsb2NhdGUgY2FsbGVkIGZvciBzaXplIHdoaWNoIGV4Y2VlZHMgbWF4X3NpemUoKSIpOworICAgICAgICBfX3Jlc18tPmRlYWxsb2NhdGUoX19wLCBfX24gKiBzaXplb2YoX1ZhbHVlVHlwZSksIGFsaWdub2YoX1ZhbHVlVHlwZSkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIC4uLl9Ucz4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBjb25zdHJ1Y3QoX1RwKiBfX3AsIF9UcyAmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgICBfVlNURF9MRlRTOjpfX2xmdHNfdXNlcl9hbGxvY19jb25zdHJ1Y3QoCisgICAgICAgICAgICBfX3AsIHJlc291cmNlKCksIF9WU1REOjpmb3J3YXJkPF9Ucz4oX19hcmdzKS4uLgorICAgICAgICAgICk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyLCBjbGFzcyAuLi5fQXJnczEsIGNsYXNzIC4uLl9BcmdzMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBjb25zdHJ1Y3QocGFpcjxfVDEsIF9UMj4qIF9fcCwgcGllY2V3aXNlX2NvbnN0cnVjdF90LAorICAgICAgICAgICAgICAgICAgIHR1cGxlPF9BcmdzMS4uLj4gX194LCB0dXBsZTxfQXJnczIuLi4+IF9feSkKKyAgICB7CisgICAgICAgIDo6bmV3ICgodm9pZCopX19wKSBwYWlyPF9UMSwgX1QyPihwaWVjZXdpc2VfY29uc3RydWN0CisgICAgICAgICAgLCBfX3RyYW5zZm9ybV90dXBsZSgKKyAgICAgICAgICAgICAgdHlwZW5hbWUgX19sZnRzX3VzZXNfYWxsb2NfY3RvcjwKKyAgICAgICAgICAgICAgICAgIF9UMSwgbWVtb3J5X3Jlc291cmNlKiwgX0FyZ3MxLi4uCisgICAgICAgICAgICAgID46OnR5cGUoKQorICAgICAgICAgICAgLCBfVlNURDo6bW92ZShfX3gpCisgICAgICAgICAgICAsIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPHNpemVvZi4uLihfQXJnczEpPjo6dHlwZXt9CisgICAgICAgICAgKQorICAgICAgICAgICwgX190cmFuc2Zvcm1fdHVwbGUoCisgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbGZ0c191c2VzX2FsbG9jX2N0b3I8CisgICAgICAgICAgICAgICAgICBfVDIsIG1lbW9yeV9yZXNvdXJjZSosIF9BcmdzMi4uLgorICAgICAgICAgICAgICA+Ojp0eXBlKCkKKyAgICAgICAgICAgICwgX1ZTVEQ6Om1vdmUoX195KQorICAgICAgICAgICAgLCB0eXBlbmFtZSBfX21ha2VfdHVwbGVfaW5kaWNlczxzaXplb2YuLi4oX0FyZ3MyKT46OnR5cGV7fQorICAgICAgICAgICkKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgY29uc3RydWN0KHBhaXI8X1QxLCBfVDI+KiBfX3ApIHsKKyAgICAgICAgY29uc3RydWN0KF9fcCwgcGllY2V3aXNlX2NvbnN0cnVjdCwgdHVwbGU8PigpLCB0dXBsZTw+KCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMiwgY2xhc3MgX1VwLCBjbGFzcyBfVnA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgY29uc3RydWN0KHBhaXI8X1QxLCBfVDI+ICogX19wLCBfVXAgJiYgX191LCBfVnAgJiYgX192KSB7CisgICAgICAgIGNvbnN0cnVjdChfX3AsIHBpZWNld2lzZV9jb25zdHJ1Y3QKKyAgICAgICAgICAsIF9WU1REOjpmb3J3YXJkX2FzX3R1cGxlKF9WU1REOjpmb3J3YXJkPF9VcD4oX191KSkKKyAgICAgICAgICAsIF9WU1REOjpmb3J3YXJkX2FzX3R1cGxlKF9WU1REOjpmb3J3YXJkPF9WcD4oX192KSkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMiwgY2xhc3MgX1UxLCBjbGFzcyBfVTI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgY29uc3RydWN0KHBhaXI8X1QxLCBfVDI+ICogX19wLCBwYWlyPF9VMSwgX1UyPiBjb25zdCAmIF9fcHIpIHsKKyAgICAgICAgY29uc3RydWN0KF9fcCwgcGllY2V3aXNlX2NvbnN0cnVjdAorICAgICAgICAgICAgLCBfVlNURDo6Zm9yd2FyZF9hc190dXBsZShfX3ByLmZpcnN0KQorICAgICAgICAgICAgLCBfVlNURDo6Zm9yd2FyZF9hc190dXBsZShfX3ByLnNlY29uZCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMiwgY2xhc3MgX1UxLCBjbGFzcyBfVTI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgY29uc3RydWN0KHBhaXI8X1QxLCBfVDI+ICogX19wLCBwYWlyPF9VMSwgX1UyPiAmJiBfX3ByKXsKKyAgICAgICAgY29uc3RydWN0KF9fcCwgcGllY2V3aXNlX2NvbnN0cnVjdAorICAgICAgICAgICAgLCBfVlNURDo6Zm9yd2FyZF9hc190dXBsZShfVlNURDo6Zm9yd2FyZDxfVTE+KF9fcHIuZmlyc3QpKQorICAgICAgICAgICAgLCBfVlNURDo6Zm9yd2FyZF9hc190dXBsZShfVlNURDo6Zm9yd2FyZDxfVTI+KF9fcHIuc2Vjb25kKSkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgZGVzdHJveShfVHAgKiBfX3ApIF9OT0VYQ0VQVAorICAgICAgICB7IF9fcC0+fl9UcCgpOyB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcG9seW1vcnBoaWNfYWxsb2NhdG9yCisgICAgc2VsZWN0X29uX2NvbnRhaW5lcl9jb3B5X2NvbnN0cnVjdGlvbigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7IHJldHVybiBwb2x5bW9ycGhpY19hbGxvY2F0b3IoKTsgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG1lbW9yeV9yZXNvdXJjZSAqIHJlc291cmNlKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHsgcmV0dXJuIF9fcmVzXzsgfQorCitwcml2YXRlOgorICAgIHRlbXBsYXRlIDxjbGFzcyAuLi5fQXJncywgc2l6ZV90IC4uLl9JZHg+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR1cGxlPF9BcmdzJiYuLi4+CisgICAgX190cmFuc2Zvcm1fdHVwbGUoaW50ZWdyYWxfY29uc3RhbnQ8aW50LCAwPiwgdHVwbGU8X0FyZ3MuLi4+JiYgX190LAorICAgICAgICAgICAgICAgICAgICAgIF9fdHVwbGVfaW5kaWNlczxfSWR4Li4uPikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBfVlNURDo6Zm9yd2FyZF9hc190dXBsZShfVlNURDo6Z2V0PF9JZHg+KF9WU1REOjptb3ZlKF9fdCkpLi4uKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FyZ3MsIHNpemVfdCAuLi5fSWR4PgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0dXBsZTxhbGxvY2F0b3JfYXJnX3QgY29uc3QmLCBtZW1vcnlfcmVzb3VyY2UqLCBfQXJncyYmLi4uPgorICAgIF9fdHJhbnNmb3JtX3R1cGxlKGludGVncmFsX2NvbnN0YW50PGludCwgMT4sIHR1cGxlPF9BcmdzLi4uPiAmJiBfX3QsCisgICAgICAgICAgICAgICAgICAgICAgX190dXBsZV9pbmRpY2VzPF9JZHguLi4+KSBjb25zdAorICAgIHsKKyAgICAgICAgdXNpbmcgX1R1cCA9IHR1cGxlPGFsbG9jYXRvcl9hcmdfdCBjb25zdCYsIG1lbW9yeV9yZXNvdXJjZSosIF9BcmdzJiYuLi4+OworICAgICAgICByZXR1cm4gX1R1cChhbGxvY2F0b3JfYXJnLCByZXNvdXJjZSgpLAorICAgICAgICAgICAgICAgICAgICBfVlNURDo6Z2V0PF9JZHg+KF9WU1REOjptb3ZlKF9fdCkpLi4uKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FyZ3MsIHNpemVfdCAuLi5fSWR4PgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0dXBsZTxfQXJncyYmLi4uLCBtZW1vcnlfcmVzb3VyY2UqPgorICAgIF9fdHJhbnNmb3JtX3R1cGxlKGludGVncmFsX2NvbnN0YW50PGludCwgMj4sIHR1cGxlPF9BcmdzLi4uPiAmJiBfX3QsCisgICAgICAgICAgICAgICAgICAgICAgX190dXBsZV9pbmRpY2VzPF9JZHguLi4+KSBjb25zdAorICAgIHsKKyAgICAgICAgdXNpbmcgX1R1cCA9IHR1cGxlPF9BcmdzJiYuLi4sIG1lbW9yeV9yZXNvdXJjZSo+OworICAgICAgICByZXR1cm4gX1R1cChfVlNURDo6Z2V0PF9JZHg+KF9WU1REOjptb3ZlKF9fdCkpLi4uLCByZXNvdXJjZSgpKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IF9fbWF4X3NpemUoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAgeyByZXR1cm4gbnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkgLyBzaXplb2YodmFsdWVfdHlwZSk7IH0KKworICAgIG1lbW9yeV9yZXNvdXJjZSAqIF9fcmVzXzsKK307CisKKy8vIDguNi40LCBtZW1vcnkucG9seW1vcnBoaWMuYWxsb2NhdG9yLmVxCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIG9wZXJhdG9yPT0ocG9seW1vcnBoaWNfYWxsb2NhdG9yPF9UcD4gY29uc3QgJiBfX2xocywKKyAgICAgICAgICAgICAgICBwb2x5bW9ycGhpY19hbGxvY2F0b3I8X1VwPiBjb25zdCAmIF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gKl9fbGhzLnJlc291cmNlKCkgPT0gKl9fcmhzLnJlc291cmNlKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIG9wZXJhdG9yIT0ocG9seW1vcnBoaWNfYWxsb2NhdG9yPF9UcD4gY29uc3QgJiBfX2xocywKKyAgICAgICAgICAgICAgICBwb2x5bW9ycGhpY19hbGxvY2F0b3I8X1VwPiBjb25zdCAmIF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7Cit9CisKKy8vIDguNywgbWVtb3J5LnJlc291cmNlLmFkYXB0b3IKKworLy8gOC43LjEsIG1lbW9yeS5yZXNvdXJjZS5hZGFwdG9yLm92ZXJ2aWV3Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJBbGxvYz4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9fcmVzb3VyY2VfYWRhcHRvcl9pbXAKKyAgOiBwdWJsaWMgbWVtb3J5X3Jlc291cmNlCit7CisgICAgdXNpbmcgX0NUcmFpdHMgPSBhbGxvY2F0b3JfdHJhaXRzPF9DaGFyQWxsb2M+OworICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTx0eXBlbmFtZSBfQ1RyYWl0czo6dmFsdWVfdHlwZSwgY2hhcj46OnZhbHVlCisgICAgICAgICAgICAgICAmJiBpc19zYW1lPHR5cGVuYW1lIF9DVHJhaXRzOjpwb2ludGVyLCBjaGFyKj46OnZhbHVlCisgICAgICAgICAgICAgICAmJiBpc19zYW1lPHR5cGVuYW1lIF9DVHJhaXRzOjp2b2lkX3BvaW50ZXIsIHZvaWQqPjo6dmFsdWUsICIiKTsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgX01heEFsaWduID0gYWxpZ25vZihtYXhfYWxpZ25fdCk7CisKKyAgICB1c2luZyBfQWxsb2MgPSB0eXBlbmFtZSBfQ1RyYWl0czo6dGVtcGxhdGUgcmViaW5kX2FsbG9jPAorICAgICAgICAgICAgdHlwZW5hbWUgYWxpZ25lZF9zdG9yYWdlPF9NYXhBbGlnbiwgX01heEFsaWduPjo6dHlwZQorICAgICAgICA+OworCisgICAgdXNpbmcgX1ZhbHVlVHlwZSA9IHR5cGVuYW1lIF9BbGxvYzo6dmFsdWVfdHlwZTsKKworICAgIF9BbGxvYyBfX2FsbG9jXzsKKworcHVibGljOgorICAgIHR5cGVkZWYgX0NoYXJBbGxvYyBhbGxvY2F0b3JfdHlwZTsKKworICAgIF9fcmVzb3VyY2VfYWRhcHRvcl9pbXAoKSA9IGRlZmF1bHQ7CisgICAgX19yZXNvdXJjZV9hZGFwdG9yX2ltcChfX3Jlc291cmNlX2FkYXB0b3JfaW1wIGNvbnN0ICYpID0gZGVmYXVsdDsKKyAgICBfX3Jlc291cmNlX2FkYXB0b3JfaW1wKF9fcmVzb3VyY2VfYWRhcHRvcl9pbXAgJiYpID0gZGVmYXVsdDsKKworICAgIC8vIDguNy4yLCBtZW1vcnkucmVzb3VyY2UuYWRhcHRvci5jdG9yCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19yZXNvdXJjZV9hZGFwdG9yX2ltcChhbGxvY2F0b3JfdHlwZSBjb25zdCAmIF9fYSkKKyAgICAgIDogX19hbGxvY18oX19hKQorICAgIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19yZXNvdXJjZV9hZGFwdG9yX2ltcChhbGxvY2F0b3JfdHlwZSAmJiBfX2EpCisgICAgICA6IF9fYWxsb2NfKF9WU1REOjptb3ZlKF9fYSkpCisgICAge30KKworICAgIF9fcmVzb3VyY2VfYWRhcHRvcl9pbXAgJgorICAgIG9wZXJhdG9yPShfX3Jlc291cmNlX2FkYXB0b3JfaW1wIGNvbnN0ICYpID0gZGVmYXVsdDsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICB7IHJldHVybiBfX2FsbG9jXzsgfQorCisvLyA4LjcuMywgbWVtb3J5LnJlc291cmNlLmFkYXB0b3IubWVtCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkICogZG9fYWxsb2NhdGUoc2l6ZV90IF9fYnl0ZXMsIHNpemVfdCkKKyAgICB7CisgICAgICAgIGlmIChfX2J5dGVzID4gX19tYXhfc2l6ZSgpKSB7CisgICAgICAgICAgICBfX3Rocm93X2xlbmd0aF9lcnJvcigKKyAgICAgICAgICAgICAgICAic3RkOjpleHBlcmltZW50YWw6OnBtcjo6cmVzb3VyY2VfYWRhcHRvcjxUPjo6ZG9fYWxsb2NhdGUoc2l6ZV90IGJ5dGVzLCBzaXplX3QgYWxpZ24pIgorICAgICAgICAgICAgICAgICIgJ2J5dGVzJyBleGNlZWRzIG1heGltdW0gc3VwcG9ydGVkIHNpemUiKTsKKyAgICAgICAgfQorICAgICAgICBzaXplX3QgX19zID0gX19hbGlnbmVkX2FsbG9jYXRpb25fc2l6ZShfX2J5dGVzLCBfTWF4QWxpZ24pIC8gX01heEFsaWduOworICAgICAgICByZXR1cm4gX19hbGxvY18uYWxsb2NhdGUoX19zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZG9fZGVhbGxvY2F0ZSh2b2lkICogX19wLCBzaXplX3QgX19ieXRlcywgc2l6ZV90KQorICAgIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19ieXRlcyA8PSBfX21heF9zaXplKCksCisgICAgICAgICAgICAiZG9fZGVhbGxvY2F0ZSBjYWxsZWQgZm9yIHNpemUgd2hpY2ggZXhjZWVkcyB0aGUgbWF4aW11bSBhbGxvY2F0aW9uIHNpemUiKTsKKyAgICAgICAgc2l6ZV90IF9fcyA9IF9fYWxpZ25lZF9hbGxvY2F0aW9uX3NpemUoX19ieXRlcywgX01heEFsaWduKSAvIF9NYXhBbGlnbjsKKyAgICAgICAgX19hbGxvY18uZGVhbGxvY2F0ZSgoX1ZhbHVlVHlwZSopX19wLCBfX3MpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBkb19pc19lcXVhbChtZW1vcnlfcmVzb3VyY2UgY29uc3QgJiBfX290aGVyKSBjb25zdCBfTk9FWENFUFQgeworICAgICAgICBfX3Jlc291cmNlX2FkYXB0b3JfaW1wIGNvbnN0ICogX19wCisgICAgICAgICAgPSBkeW5hbWljX2Nhc3Q8X19yZXNvdXJjZV9hZGFwdG9yX2ltcCBjb25zdCAqPigmX19vdGhlcik7CisgICAgICAgIHJldHVybiBfX3AgID8gX19hbGxvY18gPT0gX19wLT5fX2FsbG9jXyA6IGZhbHNlOworICAgIH0KKworcHJpdmF0ZToKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IF9fbWF4X3NpemUoKSBjb25zdCBfTk9FWENFUFQgeworICAgICAgICByZXR1cm4gbnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkgLSBfTWF4QWxpZ247CisgICAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK3VzaW5nIHJlc291cmNlX2FkYXB0b3IgPSBfX3Jlc291cmNlX2FkYXB0b3JfaW1wPAorICAgIHR5cGVuYW1lIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPjo6dGVtcGxhdGUgcmViaW5kX2FsbG9jPGNoYXI+CisgID47CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9MRlRTX1BNUgorCitfTElCQ1BQX1BPUF9NQUNST1MKKworI2VuZGlmIC8qIF9MSUJDUFBfRVhQRVJJTUVOVEFMX01FTU9SWV9SRVNPVVJDRSAqLwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9udW1lcmljIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9udW1lcmljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YTY2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL251bWVyaWMKQEAgLTAsMCArMSwxMSBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG51bWVyaWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNlcnJvciAiPGV4cGVyaW1lbnRhbC9udW1lcmljPiBoYXMgYmVlbiByZW1vdmVkLiBVc2UgPG51bWVyaWM+IGluc3RlYWQuIgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9vcHRpb25hbCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvb3B0aW9uYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4Y2VmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvb3B0aW9uYWwKQEAgLTAsMCArMSwxMSBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gb3B0aW9uYWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNlcnJvciAiPGV4cGVyaW1lbnRhbC9vcHRpb25hbD4gaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIDxvcHRpb25hbD4gaW5zdGVhZC4iCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL3Byb3BhZ2F0ZV9jb25zdCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvcHJvcGFnYXRlX2NvbnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ODU0ODUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL3Byb3BhZ2F0ZV9jb25zdApAQCAtMCwwICsxLDU3OSBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3BhZ2F0ZV9jb25zdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9FWFBFUklNRU5UQUxfUFJPUEFHQVRFX0NPTlNUCisjZGVmaW5lIF9MSUJDUFBfRVhQRVJJTUVOVEFMX1BST1BBR0FURV9DT05TVAorLyoKKyAgICBwcm9wYWdhdGVfY29uc3Qgc3lub3BzaXMKKworICAgIG5hbWVzcGFjZSBzdGQgeyBuYW1lc3BhY2UgZXhwZXJpbWVudGFsIHsgaW5saW5lIG5hbWVzcGFjZSBmdW5kYW1lbnRhbHNfdjIgeworCisgICAgLy8gW3Byb3BhZ2F0ZV9jb25zdF0KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgcHJvcGFnYXRlX2NvbnN0OworCisgICAgLy8gW3Byb3BhZ2F0ZV9jb25zdC51bmRlcmx5aW5nXSwgdW5kZXJseWluZyBwb2ludGVyIGFjY2VzcworICAgIGNvbnN0ZXhwciBjb25zdCBfVHAmIF9WU1REX0xGVFNfVjI6OmdldF91bmRlcmx5aW5nKGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxUPiYgcHQpIG5vZXhjZXB0OworICAgIGNvbnN0ZXhwciBUJiBfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhwcm9wYWdhdGVfY29uc3Q8VD4mIHB0KSBub2V4Y2VwdDsKKworICAgIC8vIFtwcm9wYWdhdGVfY29uc3QucmVsYXRpb25hbF0sIHJlbGF0aW9uYWwgb3BlcmF0b3JzCisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPT0oY29uc3QgcHJvcGFnYXRlX2NvbnN0PFQ+JiBwdCwgbnVsbHB0cl90KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShudWxscHRyX3QsIGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxUPiYgcHUpOworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxUPiYgcHQsIG51bGxwdHJfdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0obnVsbHB0cl90LCBjb25zdCBwcm9wYWdhdGVfY29uc3Q8VD4mIHB1KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwcm9wYWdhdGVfY29uc3Q8VD4mIHB0LCBjb25zdCBwcm9wYWdhdGVfY29uc3Q8X1VwPiYgcHUpOworICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxUPiYgcHQsIGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxfVXA+JiBwdSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPChjb25zdCBwcm9wYWdhdGVfY29uc3Q8VD4mIHB0LCBjb25zdCBwcm9wYWdhdGVfY29uc3Q8X1VwPiYgcHUpOworICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj4oY29uc3QgcHJvcGFnYXRlX2NvbnN0PFQ+JiBwdCwgY29uc3QgcHJvcGFnYXRlX2NvbnN0PF9VcD4mIHB1KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gY29uc3RleHByIGJvb2wgb3BlcmF0b3I8PShjb25zdCBwcm9wYWdhdGVfY29uc3Q8VD4mIHB0LCBjb25zdCBwcm9wYWdhdGVfY29uc3Q8X1VwPiYgcHUpOworICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxUPiYgcHQsIGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxfVXA+JiBwdSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPT0oY29uc3QgcHJvcGFnYXRlX2NvbnN0PFQ+JiBwdCwgY29uc3QgX1VwJiB1KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gY29uc3RleHByIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwcm9wYWdhdGVfY29uc3Q8VD4mIHB0LCBjb25zdCBfVXAmIHUpOworICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgcHJvcGFnYXRlX2NvbnN0PFQ+JiBwdCwgY29uc3QgX1VwJiB1KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gY29uc3RleHByIGJvb2wgb3BlcmF0b3I+KGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxUPiYgcHQsIGNvbnN0IF9VcCYgdSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPD0oY29uc3QgcHJvcGFnYXRlX2NvbnN0PFQ+JiBwdCwgY29uc3QgX1VwJiB1KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gY29uc3RleHByIGJvb2wgb3BlcmF0b3I+PShjb25zdCBwcm9wYWdhdGVfY29uc3Q8VD4mIHB0LCBjb25zdCBfVXAmIHUpOworICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9UcCYgdCwgY29uc3QgcHJvcGFnYXRlX2NvbnN0PF9VcD4mIHB1KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gY29uc3RleHByIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfVHAmIHQsIGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxfVXA+JiBwdSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPChjb25zdCBfVHAmIHQsIGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxfVXA+JiBwdSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPihjb25zdCBfVHAmIHQsIGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxfVXA+JiBwdSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPD0oY29uc3QgX1RwJiB0LCBjb25zdCBwcm9wYWdhdGVfY29uc3Q8X1VwPiYgcHUpOworICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IF9UcCYgdCwgY29uc3QgcHJvcGFnYXRlX2NvbnN0PF9VcD4mIHB1KTsKKworICAgIC8vIFtwcm9wYWdhdGVfY29uc3QuYWxnb3JpdGhtc10sIHNwZWNpYWxpemVkIGFsZ29yaXRobXMKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gY29uc3RleHByIHZvaWQgc3dhcChwcm9wYWdhdGVfY29uc3Q8VD4mIHB0LCBwcm9wYWdhdGVfY29uc3Q8VD4mIHB1KSBub2V4Y2VwdChzZWUgYmVsb3cpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgY2xhc3MgcHJvcGFnYXRlX2NvbnN0CisgICAgeworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiByZW1vdmVfcmVmZXJlbmNlX3Q8ZGVjbHR5cGUoKmRlY2x2YWw8VCY+KCkpPiBlbGVtZW50X3R5cGU7CisKKyAgICAgIC8vIFtwcm9wYWdhdGVfY29uc3QuY3Rvcl0sIGNvbnN0cnVjdG9ycworICAgICAgY29uc3RleHByIHByb3BhZ2F0ZV9jb25zdCgpID0gZGVmYXVsdDsKKyAgICAgIHByb3BhZ2F0ZV9jb25zdChjb25zdCBwcm9wYWdhdGVfY29uc3QmIHApID0gZGVsZXRlOworICAgICAgY29uc3RleHByIHByb3BhZ2F0ZV9jb25zdChwcm9wYWdhdGVfY29uc3QmJiBwKSA9IGRlZmF1bHQ7CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVT4gRVhQTElDSVQgY29uc3RleHByIHByb3BhZ2F0ZV9jb25zdChwcm9wYWdhdGVfY29uc3Q8X1VwPiYmIHB1KTsgLy8gc2VlIGJlbG93CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVT4gRVhQTElDSVQgY29uc3RleHByIHByb3BhZ2F0ZV9jb25zdChVJiYgdSk7IC8vIHNlZSBiZWxvdworCisgICAgICAvLyBbcHJvcGFnYXRlX2NvbnN0LmFzc2lnbm1lbnRdLCBhc3NpZ25tZW50CisgICAgICBwcm9wYWdhdGVfY29uc3QmIG9wZXJhdG9yPShjb25zdCBwcm9wYWdhdGVfY29uc3QmIHApID0gZGVsZXRlOworICAgICAgY29uc3RleHByIHByb3BhZ2F0ZV9jb25zdCYgb3BlcmF0b3I9KHByb3BhZ2F0ZV9jb25zdCYmIHApID0gZGVmYXVsdDsKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBVPiBjb25zdGV4cHIgcHJvcGFnYXRlX2NvbnN0JiBvcGVyYXRvcj0ocHJvcGFnYXRlX2NvbnN0PF9VcD4mJiBwdSk7CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVT4gY29uc3RleHByIHByb3BhZ2F0ZV9jb25zdCYgb3BlcmF0b3I9KFUmJiB1KTsgLy8gc2VlIGJlbG93CisKKyAgICAgIC8vIFtwcm9wYWdhdGVfY29uc3QuY29uc3Rfb2JzZXJ2ZXJzXSwgY29uc3Qgb2JzZXJ2ZXJzCisgICAgICBleHBsaWNpdCBjb25zdGV4cHIgb3BlcmF0b3IgYm9vbCgpIGNvbnN0OworICAgICAgY29uc3RleHByIGNvbnN0IGVsZW1lbnRfdHlwZSogb3BlcmF0b3ItPigpIGNvbnN0OworICAgICAgY29uc3RleHByIG9wZXJhdG9yIGNvbnN0IGVsZW1lbnRfdHlwZSooKSBjb25zdDsgLy8gTm90IGFsd2F5cyBkZWZpbmVkCisgICAgICBjb25zdGV4cHIgY29uc3QgZWxlbWVudF90eXBlJiBvcGVyYXRvciooKSBjb25zdDsKKyAgICAgIGNvbnN0ZXhwciBjb25zdCBlbGVtZW50X3R5cGUqIGdldCgpIGNvbnN0OworCisgICAgICAvLyBbcHJvcGFnYXRlX2NvbnN0Lm5vbl9jb25zdF9vYnNlcnZlcnNdLCBub24tY29uc3Qgb2JzZXJ2ZXJzCisgICAgICBjb25zdGV4cHIgZWxlbWVudF90eXBlKiBvcGVyYXRvci0+KCk7CisgICAgICBjb25zdGV4cHIgb3BlcmF0b3IgZWxlbWVudF90eXBlKigpOyAvLyBOb3QgYWx3YXlzIGRlZmluZWQKKyAgICAgIGNvbnN0ZXhwciBlbGVtZW50X3R5cGUmIG9wZXJhdG9yKigpOworICAgICAgY29uc3RleHByIGVsZW1lbnRfdHlwZSogZ2V0KCk7CisKKyAgICAgIC8vIFtwcm9wYWdhdGVfY29uc3QubW9kaWZpZXJzXSwgbW9kaWZpZXJzCisgICAgICBjb25zdGV4cHIgdm9pZCBzd2FwKHByb3BhZ2F0ZV9jb25zdCYgcHQpIG5vZXhjZXB0KHNlZSBiZWxvdykKKworICAgIHByaXZhdGU6CisgICAgICBUIHRfOyAvLyBleHBvc2l0aW9uIG9ubHkKKyAgICB9OworCisgIH0gLy8gbmFtZXNwYWNlIGZ1bmRhbWVudGFsc192MgorICB9IC8vIG5hbWVzcGFjZSBleHBlcmltZW50YWwKKworICAvLyBbcHJvcGFnYXRlX2NvbnN0Lmhhc2hdLCBoYXNoIHN1cHBvcnQKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBoYXNoPGV4cGVyaW1lbnRhbDo6ZnVuZGFtZW50YWxzX3YyOjpwcm9wYWdhdGVfY29uc3Q8VD4+OworCisgIC8vIFtwcm9wYWdhdGVfY29uc3QuY29tcGFyaXNvbl9mdW5jdGlvbl9vYmplY3RzXSwgY29tcGFyaXNvbiBmdW5jdGlvbiBvYmplY3RzCisgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgZXF1YWxfdG88ZXhwZXJpbWVudGFsOjpmdW5kYW1lbnRhbHNfdjI6OnByb3BhZ2F0ZV9jb25zdDxUPj47CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3Qgbm90X2VxdWFsX3RvPGV4cGVyaW1lbnRhbDo6ZnVuZGFtZW50YWxzX3YyOjpwcm9wYWdhdGVfY29uc3Q8VD4+OworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGxlc3M8ZXhwZXJpbWVudGFsOjpmdW5kYW1lbnRhbHNfdjI6OnByb3BhZ2F0ZV9jb25zdDxUPj47CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgZ3JlYXRlcjxleHBlcmltZW50YWw6OmZ1bmRhbWVudGFsc192Mjo6cHJvcGFnYXRlX2NvbnN0PFQ+PjsKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBsZXNzX2VxdWFsPGV4cGVyaW1lbnRhbDo6ZnVuZGFtZW50YWxzX3YyOjpwcm9wYWdhdGVfY29uc3Q8VD4+OworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGdyZWF0ZXJfZXF1YWw8ZXhwZXJpbWVudGFsOjpmdW5kYW1lbnRhbHNfdjI6OnByb3BhZ2F0ZV9jb25zdDxUPj47CisKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisqLworCisjaW5jbHVkZSA8ZXhwZXJpbWVudGFsL19fY29uZmlnPgorI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9MRlRTX1YyCisKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NsYXNzIHByb3BhZ2F0ZV9jb25zdDsKKwordGVtcGxhdGUgPGNsYXNzIF9VcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSCitjb25zdCBfVXAmIGdldF91bmRlcmx5aW5nKGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxfVXA+JiBfX3B1KSBfTk9FWENFUFQ7CisKK3RlbXBsYXRlIDxjbGFzcyBfVXA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgorX1VwJiBnZXRfdW5kZXJseWluZyhwcm9wYWdhdGVfY29uc3Q8X1VwPiYgX19wdSkgX05PRVhDRVBUOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgcHJvcGFnYXRlX2NvbnN0Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgcmVtb3ZlX3JlZmVyZW5jZV90PGRlY2x0eXBlKCpfVlNURDo6ZGVjbHZhbDxfVHAmPigpKT4gZWxlbWVudF90eXBlOworCisgIHN0YXRpY19hc3NlcnQoIWlzX2FycmF5PF9UcD46OnZhbHVlLAorICAgICAgIkluc3RhbnRpYXRpb24gb2YgcHJvcGFnYXRlX2NvbnN0IHdpdGggYW4gYXJyYXkgdHlwZSBpcyBpbGwtZm9ybWVkLiIpOworICBzdGF0aWNfYXNzZXJ0KCFpc19yZWZlcmVuY2U8X1RwPjo6dmFsdWUsCisgICAgICAiSW5zdGFudGlhdGlvbiBvZiBwcm9wYWdhdGVfY29uc3Qgd2l0aCBhIHJlZmVyZW5jZSB0eXBlIGlzIGlsbC1mb3JtZWQuIik7CisgIHN0YXRpY19hc3NlcnQoIShpc19wb2ludGVyPF9UcD46OnZhbHVlICYmIGlzX2Z1bmN0aW9uPHR5cGVuYW1lIHJlbW92ZV9wb2ludGVyPF9UcD46OnR5cGU+Ojp2YWx1ZSksCisgICAgICAiSW5zdGFudGlhdGlvbiBvZiBwcm9wYWdhdGVfY29uc3Qgd2l0aCBhIGZ1bmN0aW9uLXBvaW50ZXIgdHlwZSBpcyBpbGwtZm9ybWVkLiIpOworICBzdGF0aWNfYXNzZXJ0KCEoaXNfcG9pbnRlcjxfVHA+Ojp2YWx1ZSAmJiBpc19zYW1lPHR5cGVuYW1lIHJlbW92ZV9jdjx0eXBlbmFtZSByZW1vdmVfcG9pbnRlcjxfVHA+Ojp0eXBlPjo6dHlwZSwgdm9pZD46OnZhbHVlKSwKKyAgICAgICJJbnN0YW50aWF0aW9uIG9mIHByb3BhZ2F0ZV9jb25zdCB3aXRoIGEgcG9pbnRlciB0byAocG9zc2libHkgY3YtcXVhbGlmaWVkKSB2b2lkIGlzIGlsbC1mb3JtZWQuIik7CisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDxjbGFzcyBfVXA+CisgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBlbGVtZW50X3R5cGUqIF9fZ2V0X3BvaW50ZXIoX1VwKiBfX3UpCisgIHsKKyAgICByZXR1cm4gX191OworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGVsZW1lbnRfdHlwZSogX19nZXRfcG9pbnRlcihfVXAmIF9fdSkKKyAgeworICAgIHJldHVybiBfX2dldF9wb2ludGVyKF9fdS5nZXQoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPgorICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgZWxlbWVudF90eXBlKiBfX2dldF9wb2ludGVyKGNvbnN0IF9VcCogX191KQorICB7CisgICAgcmV0dXJuIF9fdTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVXA+CisgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBlbGVtZW50X3R5cGUqIF9fZ2V0X3BvaW50ZXIoY29uc3QgX1VwJiBfX3UpCisgIHsKKyAgICByZXR1cm4gX19nZXRfcG9pbnRlcihfX3UuZ2V0KCkpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgc3RydWN0IF9faXNfcHJvcGFnYXRlX2NvbnN0IDogZmFsc2VfdHlwZQorICB7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgc3RydWN0IF9faXNfcHJvcGFnYXRlX2NvbnN0PHByb3BhZ2F0ZV9jb25zdDxfVXA+PiA6IHRydWVfdHlwZQorICB7CisgIH07CisKKyAgX1RwIF9fdF87CisKK3B1YmxpYzoKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPiBmcmllbmQgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgX1VwJiA6Ol9WU1REX0xGVFNfVjI6OmdldF91bmRlcmx5aW5nKGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxfVXA+JiBfX3B1KSBfTk9FWENFUFQ7CisgIHRlbXBsYXRlIDxjbGFzcyBfVXA+IGZyaWVuZCBfTElCQ1BQX0NPTlNURVhQUiBfVXAmIDo6X1ZTVERfTEZUU19WMjo6Z2V0X3VuZGVybHlpbmcocHJvcGFnYXRlX2NvbnN0PF9VcD4mIF9fcHUpIF9OT0VYQ0VQVDsKKworICBfTElCQ1BQX0NPTlNURVhQUiBwcm9wYWdhdGVfY29uc3QoKSA9IGRlZmF1bHQ7CisKKyAgcHJvcGFnYXRlX2NvbnN0KGNvbnN0IHByb3BhZ2F0ZV9jb25zdCYpID0gZGVsZXRlOworCisgIF9MSUJDUFBfQ09OU1RFWFBSIHByb3BhZ2F0ZV9jb25zdChwcm9wYWdhdGVfY29uc3QmJikgPSBkZWZhdWx0OworCisgIHRlbXBsYXRlIDxjbGFzcyBfVXAsIGVuYWJsZV9pZl90PCFpc19jb252ZXJ0aWJsZTxfVXAsIF9UcD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19jb25zdHJ1Y3RpYmxlPF9UcCwgX1VwJiY+Ojp2YWx1ZSxib29sPiA9IHRydWU+CisgIGV4cGxpY2l0IF9MSUJDUFBfQ09OU1RFWFBSIHByb3BhZ2F0ZV9jb25zdChwcm9wYWdhdGVfY29uc3Q8X1VwPiYmIF9fcHUpCisgICAgICA6IF9fdF8oc3RkOjptb3ZlKF9WU1REX0xGVFNfVjI6OmdldF91bmRlcmx5aW5nKF9fcHUpKSkKKyAgeworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcCwgZW5hYmxlX2lmX3Q8aXNfY29udmVydGlibGU8X1VwJiYsIF9UcD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19jb25zdHJ1Y3RpYmxlPF9UcCwgX1VwJiY+Ojp2YWx1ZSxib29sPiA9IGZhbHNlPgorICBfTElCQ1BQX0NPTlNURVhQUiBwcm9wYWdhdGVfY29uc3QocHJvcGFnYXRlX2NvbnN0PF9VcD4mJiBfX3B1KQorICAgICAgOiBfX3RfKHN0ZDo6bW92ZShfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3B1KSkpCisgIHsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVXAsIGVuYWJsZV9pZl90PCFpc19jb252ZXJ0aWJsZTxfVXAmJiwgX1RwPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NvbnN0cnVjdGlibGU8X1RwLCBfVXAmJj46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhX19pc19wcm9wYWdhdGVfY29uc3Q8ZGVjYXlfdDxfVXA+Pjo6dmFsdWUsYm9vbD4gPSB0cnVlPgorICBleHBsaWNpdCBfTElCQ1BQX0NPTlNURVhQUiBwcm9wYWdhdGVfY29uc3QoX1VwJiYgX191KQorICAgICAgOiBfX3RfKHN0ZDo6Zm9yd2FyZDxfVXA+KF9fdSkpCisgIHsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVXAsIGVuYWJsZV9pZl90PGlzX2NvbnZlcnRpYmxlPF9VcCYmLCBfVHA+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfY29uc3RydWN0aWJsZTxfVHAsIF9VcCYmPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFfX2lzX3Byb3BhZ2F0ZV9jb25zdDxkZWNheV90PF9VcD4+Ojp2YWx1ZSxib29sPiA9IGZhbHNlPgorICBfTElCQ1BQX0NPTlNURVhQUiBwcm9wYWdhdGVfY29uc3QoX1VwJiYgX191KQorICAgICAgOiBfX3RfKHN0ZDo6Zm9yd2FyZDxfVXA+KF9fdSkpCisgIHsKKyAgfQorCisgIHByb3BhZ2F0ZV9jb25zdCYgb3BlcmF0b3I9KGNvbnN0IHByb3BhZ2F0ZV9jb25zdCYpID0gZGVsZXRlOworCisgIF9MSUJDUFBfQ09OU1RFWFBSIHByb3BhZ2F0ZV9jb25zdCYgb3BlcmF0b3I9KHByb3BhZ2F0ZV9jb25zdCYmKSA9IGRlZmF1bHQ7CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgX0xJQkNQUF9DT05TVEVYUFIgcHJvcGFnYXRlX2NvbnN0JiBvcGVyYXRvcj0ocHJvcGFnYXRlX2NvbnN0PF9VcD4mJiBfX3B1KQorICB7CisgICAgX190XyA9IHN0ZDo6bW92ZShfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3B1KSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcCwgY2xhc3MgX1ZwID0gZW5hYmxlX2lmX3Q8IV9faXNfcHJvcGFnYXRlX2NvbnN0PGRlY2F5X3Q8X1VwPj46OnZhbHVlPj4KKyAgX0xJQkNQUF9DT05TVEVYUFIgcHJvcGFnYXRlX2NvbnN0JiBvcGVyYXRvcj0oX1VwJiYgX191KQorICB7CisgICAgX190XyA9IHN0ZDo6Zm9yd2FyZDxfVXA+KF9fdSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgZWxlbWVudF90eXBlKiBnZXQoKSBjb25zdAorICB7CisgICAgcmV0dXJuIF9fZ2V0X3BvaW50ZXIoX190Xyk7CisgIH0KKworICBfTElCQ1BQX0NPTlNURVhQUiBlbGVtZW50X3R5cGUqIGdldCgpCisgIHsKKyAgICByZXR1cm4gX19nZXRfcG9pbnRlcihfX3RfKTsKKyAgfQorCisgIGV4cGxpY2l0IF9MSUJDUFBfQ09OU1RFWFBSIG9wZXJhdG9yIGJvb2woKSBjb25zdAorICB7CisgICAgcmV0dXJuIGdldCgpICE9IG51bGxwdHI7CisgIH0KKworICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBlbGVtZW50X3R5cGUqIG9wZXJhdG9yLT4oKSBjb25zdAorICB7CisgICAgcmV0dXJuIGdldCgpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcF8gPSBfVHAsIGNsYXNzIF9VcCA9IGVuYWJsZV9pZl90PGlzX2NvbnZlcnRpYmxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcF8sIGNvbnN0IGVsZW1lbnRfdHlwZSAqPjo6dmFsdWU+PgorICBfTElCQ1BQX0NPTlNURVhQUiBvcGVyYXRvciBjb25zdCBlbGVtZW50X3R5cGUgKigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0KCk7CisgIH0KKworICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBlbGVtZW50X3R5cGUmIG9wZXJhdG9yKigpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gKmdldCgpOworICB9CisKKyAgX0xJQkNQUF9DT05TVEVYUFIgZWxlbWVudF90eXBlKiBvcGVyYXRvci0+KCkKKyAgeworICAgIHJldHVybiBnZXQoKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHBfID0gX1RwLCBjbGFzcyBfVXAgPSBlbmFibGVfaWZfdDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19jb252ZXJ0aWJsZTxfVHBfLCBlbGVtZW50X3R5cGUgKj46OnZhbHVlPj4KKyAgX0xJQkNQUF9DT05TVEVYUFIgb3BlcmF0b3IgZWxlbWVudF90eXBlICooKSB7CisgICAgcmV0dXJuIGdldCgpOworICB9CisKKyAgX0xJQkNQUF9DT05TVEVYUFIgZWxlbWVudF90eXBlJiBvcGVyYXRvciooKQorICB7CisgICAgcmV0dXJuICpnZXQoKTsKKyAgfQorCisgIF9MSUJDUFBfQ09OU1RFWFBSIHZvaWQgc3dhcChwcm9wYWdhdGVfY29uc3QmIF9fcHQpIF9OT0VYQ0VQVF8oX19pc19ub3Rocm93X3N3YXBwYWJsZTxfVHA+Ojp2YWx1ZSkKKyAgeworICAgIHVzaW5nIF9WU1REOjpzd2FwOworICAgIHN3YXAoX190XywgX19wdC5fX3RfKTsKKyAgfQorfTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxfVHA+JiBfX3B0LCBudWxscHRyX3QpCit7CisgIHJldHVybiBfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3B0KSA9PSBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvcj09KG51bGxwdHJfdCwgY29uc3QgcHJvcGFnYXRlX2NvbnN0PF9UcD4mIF9fcHQpCit7CisgIHJldHVybiBudWxscHRyID09IF9WU1REX0xGVFNfVjI6OmdldF91bmRlcmx5aW5nKF9fcHQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxfVHA+JiBfX3B0LCBudWxscHRyX3QpCit7CisgIHJldHVybiBfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3B0KSAhPSBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvciE9KG51bGxwdHJfdCwgY29uc3QgcHJvcGFnYXRlX2NvbnN0PF9UcD4mIF9fcHQpCit7CisgIHJldHVybiBudWxscHRyICE9IF9WU1REX0xGVFNfVjI6OmdldF91bmRlcmx5aW5nKF9fcHQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0NPTlNURVhQUiBib29sIG9wZXJhdG9yPT0oY29uc3QgcHJvcGFnYXRlX2NvbnN0PF9UcD4mIF9fcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxfVXA+JiBfX3B1KQoreworICByZXR1cm4gX1ZTVERfTEZUU19WMjo6Z2V0X3VuZGVybHlpbmcoX19wdCkgPT0gX1ZTVERfTEZUU19WMjo6Z2V0X3VuZGVybHlpbmcoX19wdSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwcm9wYWdhdGVfY29uc3Q8X1RwPiYgX19wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcGFnYXRlX2NvbnN0PF9VcD4mIF9fcHUpCit7CisgIHJldHVybiBfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3B0KSAhPSBfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3B1KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvcjwoY29uc3QgcHJvcGFnYXRlX2NvbnN0PF9UcD4mIF9fcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcGFnYXRlX2NvbnN0PF9VcD4mIF9fcHUpCit7CisgIHJldHVybiBfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3B0KSA8IF9WU1REX0xGVFNfVjI6OmdldF91bmRlcmx5aW5nKF9fcHUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0NPTlNURVhQUiBib29sIG9wZXJhdG9yPihjb25zdCBwcm9wYWdhdGVfY29uc3Q8X1RwPiYgX19wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wYWdhdGVfY29uc3Q8X1VwPiYgX19wdSkKK3sKKyAgcmV0dXJuIF9WU1REX0xGVFNfVjI6OmdldF91bmRlcmx5aW5nKF9fcHQpID4gX1ZTVERfTEZUU19WMjo6Z2V0X3VuZGVybHlpbmcoX19wdSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3I8PShjb25zdCBwcm9wYWdhdGVfY29uc3Q8X1RwPiYgX19wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcGFnYXRlX2NvbnN0PF9VcD4mIF9fcHUpCit7CisgIHJldHVybiBfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3B0KSA8PSBfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3B1KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxfVHA+JiBfX3B0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wYWdhdGVfY29uc3Q8X1VwPiYgX19wdSkKK3sKKyAgcmV0dXJuIF9WU1REX0xGVFNfVjI6OmdldF91bmRlcmx5aW5nKF9fcHQpID49IF9WU1REX0xGVFNfVjI6OmdldF91bmRlcmx5aW5nKF9fcHUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0NPTlNURVhQUiBib29sIG9wZXJhdG9yPT0oY29uc3QgcHJvcGFnYXRlX2NvbnN0PF9UcD4mIF9fcHQsIGNvbnN0IF9VcCYgX191KQoreworICByZXR1cm4gX1ZTVERfTEZUU19WMjo6Z2V0X3VuZGVybHlpbmcoX19wdCkgPT0gX191OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0NPTlNURVhQUiBib29sIG9wZXJhdG9yIT0oY29uc3QgcHJvcGFnYXRlX2NvbnN0PF9UcD4mIF9fcHQsIGNvbnN0IF9VcCYgX191KQoreworICByZXR1cm4gX1ZTVERfTEZUU19WMjo6Z2V0X3VuZGVybHlpbmcoX19wdCkgIT0gX191OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0NPTlNURVhQUiBib29sIG9wZXJhdG9yPChjb25zdCBwcm9wYWdhdGVfY29uc3Q8X1RwPiYgX19wdCwgY29uc3QgX1VwJiBfX3UpCit7CisgIHJldHVybiBfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3B0KSA8IF9fdTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvcj4oY29uc3QgcHJvcGFnYXRlX2NvbnN0PF9UcD4mIF9fcHQsIGNvbnN0IF9VcCYgX191KQoreworICByZXR1cm4gX1ZTVERfTEZUU19WMjo6Z2V0X3VuZGVybHlpbmcoX19wdCkgPiBfX3U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3I8PShjb25zdCBwcm9wYWdhdGVfY29uc3Q8X1RwPiYgX19wdCwgY29uc3QgX1VwJiBfX3UpCit7CisgIHJldHVybiBfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3B0KSA8PSBfX3U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3I+PShjb25zdCBwcm9wYWdhdGVfY29uc3Q8X1RwPiYgX19wdCwgY29uc3QgX1VwJiBfX3UpCit7CisgIHJldHVybiBfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3B0KSA+PSBfX3U7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9UcCYgX190LCBjb25zdCBwcm9wYWdhdGVfY29uc3Q8X1VwPiYgX19wdSkKK3sKKyAgcmV0dXJuIF9fdCA9PSBfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3B1KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF9UcCYgX190LCBjb25zdCBwcm9wYWdhdGVfY29uc3Q8X1VwPiYgX19wdSkKK3sKKyAgcmV0dXJuIF9fdCAhPSBfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3B1KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvcjwoY29uc3QgX1RwJiBfX3QsIGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxfVXA+JiBfX3B1KQoreworICByZXR1cm4gX190IDwgX1ZTVERfTEZUU19WMjo6Z2V0X3VuZGVybHlpbmcoX19wdSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3I+KGNvbnN0IF9UcCYgX190LCBjb25zdCBwcm9wYWdhdGVfY29uc3Q8X1VwPiYgX19wdSkKK3sKKyAgcmV0dXJuIF9fdCA+IF9WU1REX0xGVFNfVjI6OmdldF91bmRlcmx5aW5nKF9fcHUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0NPTlNURVhQUiBib29sIG9wZXJhdG9yPD0oY29uc3QgX1RwJiBfX3QsIGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxfVXA+JiBfX3B1KQoreworICByZXR1cm4gX190IDw9IF9WU1REX0xGVFNfVjI6OmdldF91bmRlcmx5aW5nKF9fcHUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0NPTlNURVhQUiBib29sIG9wZXJhdG9yPj0oY29uc3QgX1RwJiBfX3QsIGNvbnN0IHByb3BhZ2F0ZV9jb25zdDxfVXA+JiBfX3B1KQoreworICByZXR1cm4gX190ID49IF9WU1REX0xGVFNfVjI6OmdldF91bmRlcmx5aW5nKF9fcHUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIgdm9pZCBzd2FwKHByb3BhZ2F0ZV9jb25zdDxfVHA+JiBfX3BjMSwgcHJvcGFnYXRlX2NvbnN0PF9UcD4mIF9fcGMyKSBfTk9FWENFUFRfKF9faXNfbm90aHJvd19zd2FwcGFibGU8X1RwPjo6dmFsdWUpCit7CisgIF9fcGMxLnN3YXAoX19wYzIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgX1RwJiBnZXRfdW5kZXJseWluZyhjb25zdCBwcm9wYWdhdGVfY29uc3Q8X1RwPiYgX19wdCkgX05PRVhDRVBUCit7CisgIHJldHVybiBfX3B0Ll9fdF87Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0NPTlNURVhQUiBfVHAmIGdldF91bmRlcmx5aW5nKHByb3BhZ2F0ZV9jb25zdDxfVHA+JiBfX3B0KSBfTk9FWENFUFQKK3sKKyAgcmV0dXJuIF9fcHQuX190XzsKK30KKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX0xGVFNfVjIKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaGFzaDxleHBlcmltZW50YWw6OmZ1bmRhbWVudGFsc192Mjo6cHJvcGFnYXRlX2NvbnN0PF9UcD4+Cit7CisgIHR5cGVkZWYgc2l6ZV90IHJlc3VsdF90eXBlOworICB0eXBlZGVmIGV4cGVyaW1lbnRhbDo6ZnVuZGFtZW50YWxzX3YyOjpwcm9wYWdhdGVfY29uc3Q8X1RwPiBhcmd1bWVudF90eXBlOworCisgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IGV4cGVyaW1lbnRhbDo6ZnVuZGFtZW50YWxzX3YyOjpwcm9wYWdhdGVfY29uc3Q8X1RwPiYgX19wYzEpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RkOjpoYXNoPF9UcD4oKShfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3BjMSkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGVxdWFsX3RvPGV4cGVyaW1lbnRhbDo6ZnVuZGFtZW50YWxzX3YyOjpwcm9wYWdhdGVfY29uc3Q8X1RwPj4KK3sKKyAgdHlwZWRlZiBleHBlcmltZW50YWw6OmZ1bmRhbWVudGFsc192Mjo6cHJvcGFnYXRlX2NvbnN0PF9UcD4gZmlyc3RfYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiBleHBlcmltZW50YWw6OmZ1bmRhbWVudGFsc192Mjo6cHJvcGFnYXRlX2NvbnN0PF9UcD4gc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGV4cGVyaW1lbnRhbDo6ZnVuZGFtZW50YWxzX3YyOjpwcm9wYWdhdGVfY29uc3Q8X1RwPiYgX19wYzEsCisgICAgICBjb25zdCBleHBlcmltZW50YWw6OmZ1bmRhbWVudGFsc192Mjo6cHJvcGFnYXRlX2NvbnN0PF9UcD4mIF9fcGMyKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0ZDo6ZXF1YWxfdG88X1RwPigpKF9WU1REX0xGVFNfVjI6OmdldF91bmRlcmx5aW5nKF9fcGMxKSwgX1ZTVERfTEZUU19WMjo6Z2V0X3VuZGVybHlpbmcoX19wYzIpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBub3RfZXF1YWxfdG88ZXhwZXJpbWVudGFsOjpmdW5kYW1lbnRhbHNfdjI6OnByb3BhZ2F0ZV9jb25zdDxfVHA+PgoreworICB0eXBlZGVmIGV4cGVyaW1lbnRhbDo6ZnVuZGFtZW50YWxzX3YyOjpwcm9wYWdhdGVfY29uc3Q8X1RwPiBmaXJzdF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIGV4cGVyaW1lbnRhbDo6ZnVuZGFtZW50YWxzX3YyOjpwcm9wYWdhdGVfY29uc3Q8X1RwPiBzZWNvbmRfYXJndW1lbnRfdHlwZTsKKworICBib29sIG9wZXJhdG9yKCkoY29uc3QgZXhwZXJpbWVudGFsOjpmdW5kYW1lbnRhbHNfdjI6OnByb3BhZ2F0ZV9jb25zdDxfVHA+JiBfX3BjMSwKKyAgICAgIGNvbnN0IGV4cGVyaW1lbnRhbDo6ZnVuZGFtZW50YWxzX3YyOjpwcm9wYWdhdGVfY29uc3Q8X1RwPiYgX19wYzIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RkOjpub3RfZXF1YWxfdG88X1RwPigpKF9WU1REX0xGVFNfVjI6OmdldF91bmRlcmx5aW5nKF9fcGMxKSwgX1ZTVERfTEZUU19WMjo6Z2V0X3VuZGVybHlpbmcoX19wYzIpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBsZXNzPGV4cGVyaW1lbnRhbDo6ZnVuZGFtZW50YWxzX3YyOjpwcm9wYWdhdGVfY29uc3Q8X1RwPj4KK3sKKyAgdHlwZWRlZiBleHBlcmltZW50YWw6OmZ1bmRhbWVudGFsc192Mjo6cHJvcGFnYXRlX2NvbnN0PF9UcD4gZmlyc3RfYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiBleHBlcmltZW50YWw6OmZ1bmRhbWVudGFsc192Mjo6cHJvcGFnYXRlX2NvbnN0PF9UcD4gc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGV4cGVyaW1lbnRhbDo6ZnVuZGFtZW50YWxzX3YyOjpwcm9wYWdhdGVfY29uc3Q8X1RwPiYgX19wYzEsCisgICAgICBjb25zdCBleHBlcmltZW50YWw6OmZ1bmRhbWVudGFsc192Mjo6cHJvcGFnYXRlX2NvbnN0PF9UcD4mIF9fcGMyKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0ZDo6bGVzczxfVHA+KCkoX1ZTVERfTEZUU19WMjo6Z2V0X3VuZGVybHlpbmcoX19wYzEpLCBfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3BjMikpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGdyZWF0ZXI8ZXhwZXJpbWVudGFsOjpmdW5kYW1lbnRhbHNfdjI6OnByb3BhZ2F0ZV9jb25zdDxfVHA+PgoreworICB0eXBlZGVmIGV4cGVyaW1lbnRhbDo6ZnVuZGFtZW50YWxzX3YyOjpwcm9wYWdhdGVfY29uc3Q8X1RwPiBmaXJzdF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIGV4cGVyaW1lbnRhbDo6ZnVuZGFtZW50YWxzX3YyOjpwcm9wYWdhdGVfY29uc3Q8X1RwPiBzZWNvbmRfYXJndW1lbnRfdHlwZTsKKworICBib29sIG9wZXJhdG9yKCkoY29uc3QgZXhwZXJpbWVudGFsOjpmdW5kYW1lbnRhbHNfdjI6OnByb3BhZ2F0ZV9jb25zdDxfVHA+JiBfX3BjMSwKKyAgICAgIGNvbnN0IGV4cGVyaW1lbnRhbDo6ZnVuZGFtZW50YWxzX3YyOjpwcm9wYWdhdGVfY29uc3Q8X1RwPiYgX19wYzIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gc3RkOjpncmVhdGVyPF9UcD4oKShfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3BjMSksIF9WU1REX0xGVFNfVjI6OmdldF91bmRlcmx5aW5nKF9fcGMyKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgbGVzc19lcXVhbDxleHBlcmltZW50YWw6OmZ1bmRhbWVudGFsc192Mjo6cHJvcGFnYXRlX2NvbnN0PF9UcD4+Cit7CisgIHR5cGVkZWYgZXhwZXJpbWVudGFsOjpmdW5kYW1lbnRhbHNfdjI6OnByb3BhZ2F0ZV9jb25zdDxfVHA+IGZpcnN0X2FyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgZXhwZXJpbWVudGFsOjpmdW5kYW1lbnRhbHNfdjI6OnByb3BhZ2F0ZV9jb25zdDxfVHA+IHNlY29uZF9hcmd1bWVudF90eXBlOworCisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBleHBlcmltZW50YWw6OmZ1bmRhbWVudGFsc192Mjo6cHJvcGFnYXRlX2NvbnN0PF9UcD4mIF9fcGMxLAorICAgICAgY29uc3QgZXhwZXJpbWVudGFsOjpmdW5kYW1lbnRhbHNfdjI6OnByb3BhZ2F0ZV9jb25zdDxfVHA+JiBfX3BjMikgY29uc3QKKyAgeworICAgIHJldHVybiBzdGQ6Omxlc3NfZXF1YWw8X1RwPigpKF9WU1REX0xGVFNfVjI6OmdldF91bmRlcmx5aW5nKF9fcGMxKSwgX1ZTVERfTEZUU19WMjo6Z2V0X3VuZGVybHlpbmcoX19wYzIpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBncmVhdGVyX2VxdWFsPGV4cGVyaW1lbnRhbDo6ZnVuZGFtZW50YWxzX3YyOjpwcm9wYWdhdGVfY29uc3Q8X1RwPj4KK3sKKyAgdHlwZWRlZiBleHBlcmltZW50YWw6OmZ1bmRhbWVudGFsc192Mjo6cHJvcGFnYXRlX2NvbnN0PF9UcD4gZmlyc3RfYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiBleHBlcmltZW50YWw6OmZ1bmRhbWVudGFsc192Mjo6cHJvcGFnYXRlX2NvbnN0PF9UcD4gc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGV4cGVyaW1lbnRhbDo6ZnVuZGFtZW50YWxzX3YyOjpwcm9wYWdhdGVfY29uc3Q8X1RwPiYgX19wYzEsCisgICAgICBjb25zdCBleHBlcmltZW50YWw6OmZ1bmRhbWVudGFsc192Mjo6cHJvcGFnYXRlX2NvbnN0PF9UcD4mIF9fcGMyKSBjb25zdAorICB7CisgICAgcmV0dXJuIHN0ZDo6Z3JlYXRlcl9lcXVhbDxfVHA+KCkoX1ZTVERfTEZUU19WMjo6Z2V0X3VuZGVybHlpbmcoX19wYzEpLCBfVlNURF9MRlRTX1YyOjpnZXRfdW5kZXJseWluZyhfX3BjMikpOworICB9Cit9OworCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKKyNlbmRpZiAvLyBfTElCQ1BQX1NURF9WRVIgPiAxMQorI2VuZGlmIC8vIF9MSUJDUFBfRVhQRVJJTUVOVEFMX1BST1BBR0FURV9DT05TVAorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL3JhdGlvIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9yYXRpbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzJiZjJlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9yYXRpbwpAQCAtMCwwICsxLDExIEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmF0aW8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2Vycm9yICI8ZXhwZXJpbWVudGFsL3JhdGlvPiBoYXMgYmVlbiByZW1vdmVkLiBVc2UgPHJhdGlvPiBpbnN0ZWFkLiIKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvcmVnZXggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL3JlZ2V4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODg5MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL3JlZ2V4CkBAIC0wLDAgKzEsNjIgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlZ2V4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfRVhQRVJJTUVOVEFMX1JFR0VYCisjZGVmaW5lIF9MSUJDUFBfRVhQRVJJTUVOVEFMX1JFR0VYCisvKgorICAgIGV4cGVyaW1lbnRhbC9yZWdleCBzeW5vcHNpcworCisvLyBDKysxegorbmFtZXNwYWNlIHN0ZCB7CituYW1lc3BhY2UgZXhwZXJpbWVudGFsIHsKK2lubGluZSBuYW1lc3BhY2UgZnVuZGFtZW50YWxzX3YxIHsKK25hbWVzcGFjZSBwbXIgeworCisgIHRlbXBsYXRlIDxjbGFzcyBCaWRpcmVjdGlvbmFsSXRlcmF0b3I+CisgIHVzaW5nIG1hdGNoX3Jlc3VsdHMgPQorICAgIHN0ZDo6bWF0Y2hfcmVzdWx0czxCaWRpcmVjdGlvbmFsSXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIHBvbHltb3JwaGljX2FsbG9jYXRvcjxzdWJfbWF0Y2g8QmlkaXJlY3Rpb25hbEl0ZXJhdG9yPj4+OworCisgIHR5cGVkZWYgbWF0Y2hfcmVzdWx0czxjb25zdCBjaGFyKj4gY21hdGNoOworICB0eXBlZGVmIG1hdGNoX3Jlc3VsdHM8Y29uc3Qgd2NoYXJfdCo+IHdjbWF0Y2g7CisgIHR5cGVkZWYgbWF0Y2hfcmVzdWx0czxzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiBzbWF0Y2g7CisgIHR5cGVkZWYgbWF0Y2hfcmVzdWx0czx3c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gd3NtYXRjaDsKKworfSAvLyBuYW1lc3BhY2UgcG1yCit9IC8vIG5hbWVzcGFjZSBmdW5kYW1lbnRhbHNfdjEKK30gLy8gbmFtZXNwYWNlIGV4cGVyaW1lbnRhbAorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyAqLworCisjaW5jbHVkZSA8ZXhwZXJpbWVudGFsL19fY29uZmlnPgorI2luY2x1ZGUgPHJlZ2V4PgorI2luY2x1ZGUgPGV4cGVyaW1lbnRhbC9zdHJpbmc+CisjaW5jbHVkZSA8ZXhwZXJpbWVudGFsL21lbW9yeV9yZXNvdXJjZT4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX0xGVFNfUE1SCisKK3RlbXBsYXRlIDxjbGFzcyBfQmlEaXJJdGVyPgordXNpbmcgbWF0Y2hfcmVzdWx0cyA9CisgICAgX1ZTVEQ6Om1hdGNoX3Jlc3VsdHM8X0JpRGlySXRlciwKKyAgICAgICAgcG9seW1vcnBoaWNfYWxsb2NhdG9yPF9WU1REOjpzdWJfbWF0Y2g8X0JpRGlySXRlcj4+PjsKKwordHlwZWRlZiBtYXRjaF9yZXN1bHRzPGNvbnN0IGNoYXIqPiBjbWF0Y2g7Cit0eXBlZGVmIG1hdGNoX3Jlc3VsdHM8Y29uc3Qgd2NoYXJfdCo+IHdjbWF0Y2g7Cit0eXBlZGVmIG1hdGNoX3Jlc3VsdHM8X1ZTVERfTEZUU19QTVI6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3I+IHNtYXRjaDsKK3R5cGVkZWYgbWF0Y2hfcmVzdWx0czxfVlNURF9MRlRTX1BNUjo6d3N0cmluZzo6Y29uc3RfaXRlcmF0b3I+IHdzbWF0Y2g7CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9MRlRTX1BNUgorCisjZW5kaWYgLyogX0xJQkNQUF9FWFBFUklNRU5UQUxfUkVHRVggKi8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvc2V0IGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9zZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjZjZkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvc2V0CkBAIC0wLDAgKzEsNTcgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsaXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9FWFBFUklNRU5UQUxfU0VUCisjZGVmaW5lIF9MSUJDUFBfRVhQRVJJTUVOVEFMX1NFVAorLyoKKyAgICBleHBlcmltZW50YWwvc2V0IHN5bm9wc2lzCisKKy8vIEMrKzF6CituYW1lc3BhY2Ugc3RkIHsKK25hbWVzcGFjZSBleHBlcmltZW50YWwgeworaW5saW5lIG5hbWVzcGFjZSBmdW5kYW1lbnRhbHNfdjEgeworbmFtZXNwYWNlIHBtciB7CisKKyAgdGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVCwgY2xhc3MgQ29tcGFyZSA9IGxlc3M8S2V5Pj4KKyAgdXNpbmcgc2V0ID0gc3RkOjpzZXQ8S2V5LCBULCBDb21wYXJlLAorICAgICAgICAgICAgICAgICAgICAgICBwb2x5bW9ycGhpY19hbGxvY2F0b3I8cGFpcjxjb25zdCBLZXksVD4+PjsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBULCBjbGFzcyBDb21wYXJlID0gbGVzczxLZXk+PgorICB1c2luZyBtdWx0aXNldCA9IHN0ZDo6bXVsdGlzZXQ8S2V5LCBULCBDb21wYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9seW1vcnBoaWNfYWxsb2NhdG9yPHBhaXI8Y29uc3QgS2V5LFQ+Pj47CisKK30gLy8gbmFtZXNwYWNlIHBtcgorfSAvLyBuYW1lc3BhY2UgZnVuZGFtZW50YWxzX3YxCit9IC8vIG5hbWVzcGFjZSBleHBlcmltZW50YWwKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisgKi8KKworI2luY2x1ZGUgPGV4cGVyaW1lbnRhbC9fX2NvbmZpZz4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8ZXhwZXJpbWVudGFsL21lbW9yeV9yZXNvdXJjZT4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX0xGVFNfUE1SCisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzICBfQ29tcGFyZSA9IGxlc3M8X1ZhbHVlPj4KK3VzaW5nIHNldCA9IF9WU1REOjpzZXQ8X1ZhbHVlLCBfQ29tcGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvbHltb3JwaGljX2FsbG9jYXRvcjxfVmFsdWU+PjsKKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgIF9Db21wYXJlID0gbGVzczxfVmFsdWU+PgordXNpbmcgbXVsdGlzZXQgPSBfVlNURDo6bXVsdGlzZXQ8X1ZhbHVlLCBfQ29tcGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvbHltb3JwaGljX2FsbG9jYXRvcjxfVmFsdWU+PjsKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX0xGVFNfUE1SCisKKyNlbmRpZiAvKiBfTElCQ1BQX0VYUEVSSU1FTlRBTF9TRVQgKi8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvc3RyaW5nIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9zdHJpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4NTQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvc3RyaW5nCkBAIC0wLDAgKzEsNjIgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdHJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9FWFBFUklNRU5UQUxfU1RSSU5HCisjZGVmaW5lIF9MSUJDUFBfRVhQRVJJTUVOVEFMX1NUUklORworLyoKKyAgICBleHBlcmltZW50YWwvc3RyaW5nIHN5bm9wc2lzCisKKy8vIEMrKzF6CituYW1lc3BhY2Ugc3RkIHsKK25hbWVzcGFjZSBleHBlcmltZW50YWwgeworaW5saW5lIG5hbWVzcGFjZSBmdW5kYW1lbnRhbHNfdjEgeworbmFtZXNwYWNlIHBtciB7CisKKyAgLy8gYmFzaWNfc3RyaW5nIHVzaW5nIHBvbHltb3JwaGljIGFsbG9jYXRvciBpbiBuYW1lc3BhY2UgcG1yCisgIHRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzID0gY2hhcl90cmFpdHM8Y2hhclQ+PgorICAgdXNpbmcgYmFzaWNfc3RyaW5nID0KKyAgICAgc3RkOjpiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgcG9seW1vcnBoaWNfYWxsb2NhdG9yPGNoYXJUPj47CisKKyAgLy8gYmFzaWNfc3RyaW5nIHR5cGVkZWYgbmFtZXMgdXNpbmcgcG9seW1vcnBoaWMgYWxsb2NhdG9yIGluIG5hbWVzcGFjZQorICAvLyBzdGQ6OmV4cGVyaW1lbnRhbDo6cG1yCisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPGNoYXI+IHN0cmluZzsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcjE2X3Q+IHUxNnN0cmluZzsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcjMyX3Q+IHUzMnN0cmluZzsKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8d2NoYXJfdD4gd3N0cmluZzsKKworfSAvLyBuYW1lc3BhY2UgcG1yCit9IC8vIG5hbWVzcGFjZSBmdW5kYW1lbnRhbHNfdjEKK30gLy8gbmFtZXNwYWNlIGV4cGVyaW1lbnRhbAorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyAqLworCisjaW5jbHVkZSA8ZXhwZXJpbWVudGFsL19fY29uZmlnPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxleHBlcmltZW50YWwvbWVtb3J5X3Jlc291cmNlPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfTEZUU19QTVIKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4+Cit1c2luZyBiYXNpY19zdHJpbmcgPQorICAgIF9WU1REOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBwb2x5bW9ycGhpY19hbGxvY2F0b3I8X0NoYXJUPj47CisKK3R5cGVkZWYgYmFzaWNfc3RyaW5nPGNoYXI+IHN0cmluZzsKK3R5cGVkZWYgYmFzaWNfc3RyaW5nPGNoYXIxNl90PiB1MTZzdHJpbmc7Cit0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyMzJfdD4gdTMyc3RyaW5nOwordHlwZWRlZiBiYXNpY19zdHJpbmc8d2NoYXJfdD4gd3N0cmluZzsKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX0xGVFNfUE1SCisKKyNlbmRpZiAvKiBfTElCQ1BQX0VYUEVSSU1FTlRBTF9TVFJJTkcgKi8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvc3RyaW5nX3ZpZXcgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL3N0cmluZ192aWV3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxM2JmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL3N0cmluZ192aWV3CkBAIC0wLDAgKzEsMTEgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdHJpbmdfdmlldyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZXJyb3IgIjxleHBlcmltZW50YWwvc3RyaW5nX3ZpZXc+IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSA8c3RyaW5nX3ZpZXc+IGluc3RlYWQuIgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9zeXN0ZW1fZXJyb3IgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL3N5c3RlbV9lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTM3MzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC9zeXN0ZW1fZXJyb3IKQEAgLTAsMCArMSwxMSBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3lzdGVtX2Vycm9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNlcnJvciAiPGV4cGVyaW1lbnRhbC9zeXN0ZW1fZXJyb3I+IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSA8c3lzdGVtX2Vycm9yPiBpbnN0ZWFkLiIKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvdHVwbGUgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL3R1cGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMzdhNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL3R1cGxlCkBAIC0wLDAgKzEsMTEgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR1cGxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjZXJyb3IgIjxleHBlcmltZW50YWwvdHVwbGU+IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSA8dHVwbGU+IGluc3RlYWQuIgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC90eXBlX3RyYWl0cyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvdHlwZV90cmFpdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlNDkxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvdHlwZV90cmFpdHMKQEAgLTAsMCArMSwxNTUgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVfdHJhaXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfRVhQRVJJTUVOVEFMX1RZUEVfVFJBSVRTCisjZGVmaW5lIF9MSUJDUFBfRVhQRVJJTUVOVEFMX1RZUEVfVFJBSVRTCisKKy8qKgorICAgIGV4cGVyaW1lbnRhbC90eXBlX3RyYWl0cyBzeW5vcHNpcworCisvLyBDKysxeQorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2Ugc3RkIHsKK25hbWVzcGFjZSBleHBlcmltZW50YWwgeworaW5saW5lIG5hbWVzcGFjZSBmdW5kYW1lbnRhbHNfdjEgeworCisgIC8vIDMuMy4yLCBPdGhlciB0eXBlIHRyYW5zZm9ybWF0aW9ucworICB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIGludm9jYXRpb25fdHlwZTsgLy8gbm90IGRlZmluZWQKKyAgdGVtcGxhdGUgPGNsYXNzIEYsIGNsYXNzLi4uIEFyZ1R5cGVzPiBjbGFzcyBpbnZvY2F0aW9uX3R5cGU8RihBcmdUeXBlcy4uLik+OworICB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIHJhd19pbnZvY2F0aW9uX3R5cGU7IC8vIG5vdCBkZWZpbmVkCisgIHRlbXBsYXRlIDxjbGFzcyBGLCBjbGFzcy4uLiBBcmdUeXBlcz4gY2xhc3MgcmF3X2ludm9jYXRpb25fdHlwZTxGKEFyZ1R5cGVzLi4uKT47CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgdXNpbmcgaW52b2NhdGlvbl90eXBlX3QgPSB0eXBlbmFtZSBpbnZvY2F0aW9uX3R5cGU8VD46OnR5cGU7CisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgIHVzaW5nIHJhd19pbnZvY2F0aW9uX3R5cGVfdCA9IHR5cGVuYW1lIHJhd19pbnZvY2F0aW9uX3R5cGU8VD46OnR5cGU7CisKKyAgLy8gMy4zLjQsIERldGVjdGlvbiBpZGlvbQorICB0ZW1wbGF0ZSA8Y2xhc3MuLi4+IHVzaW5nIHZvaWRfdCA9IHZvaWQ7CisKKyAgc3RydWN0IG5vbmVzdWNoIHsKKyAgICBub25lc3VjaCgpID0gZGVsZXRlOworICAgIH5ub25lc3VjaCgpID0gZGVsZXRlOworICAgIG5vbmVzdWNoKG5vbmVzdWNoIGNvbnN0JikgPSBkZWxldGU7CisgICAgdm9pZCBvcGVyYXRvcj0obm9uZXN1Y2ggY29uc3QmKSA9IGRlbGV0ZTsKKyAgfTsKKworICB0ZW1wbGF0ZSA8dGVtcGxhdGU8Y2xhc3MuLi4+IGNsYXNzIE9wLCBjbGFzcy4uLiBBcmdzPgorICAgIHVzaW5nIGlzX2RldGVjdGVkID0gc2VlIGJlbG93OworICB0ZW1wbGF0ZSA8dGVtcGxhdGU8Y2xhc3MuLi4+IGNsYXNzIE9wLCBjbGFzcy4uLiBBcmdzPgorICAgIGNvbnN0ZXhwciBib29sIGlzX2RldGVjdGVkX3YgPSBpc19kZXRlY3RlZDxPcCwgQXJncy4uLj46OnZhbHVlOworICB0ZW1wbGF0ZSA8dGVtcGxhdGU8Y2xhc3MuLi4+IGNsYXNzIE9wLCBjbGFzcy4uLiBBcmdzPgorICAgIHVzaW5nIGRldGVjdGVkX3QgPSBzZWUgYmVsb3c7CisgIHRlbXBsYXRlIDxjbGFzcyBEZWZhdWx0LCB0ZW1wbGF0ZTxjbGFzcy4uLj4gY2xhc3MgT3AsIGNsYXNzLi4uIEFyZ3M+CisgICAgdXNpbmcgZGV0ZWN0ZWRfb3IgPSBzZWUgYmVsb3c7CisgIHRlbXBsYXRlIDxjbGFzcyBEZWZhdWx0LCB0ZW1wbGF0ZTxjbGFzcy4uLj4gY2xhc3MgT3AsIGNsYXNzLi4uIEFyZ3M+CisgICAgdXNpbmcgZGV0ZWN0ZWRfb3JfdCA9IHR5cGVuYW1lIGRldGVjdGVkX29yPERlZmF1bHQsIE9wLCBBcmdzLi4uPjo6dHlwZTsKKyAgdGVtcGxhdGUgPGNsYXNzIEV4cGVjdGVkLCB0ZW1wbGF0ZTxjbGFzcy4uLj4gY2xhc3MgT3AsIGNsYXNzLi4uIEFyZ3M+CisgICAgdXNpbmcgaXNfZGV0ZWN0ZWRfZXhhY3QgPSBpc19zYW1lPEV4cGVjdGVkLCBkZXRlY3RlZF90PE9wLCBBcmdzLi4uPj47CisgIHRlbXBsYXRlIDxjbGFzcyBFeHBlY3RlZCwgdGVtcGxhdGU8Y2xhc3MuLi4+IGNsYXNzIE9wLCBjbGFzcy4uLiBBcmdzPgorICAgIGNvbnN0ZXhwciBib29sIGlzX2RldGVjdGVkX2V4YWN0X3YKKyAgICAgID0gaXNfZGV0ZWN0ZWRfZXhhY3Q8RXhwZWN0ZWQsIE9wLCBBcmdzLi4uPjo6dmFsdWU7CisgIHRlbXBsYXRlIDxjbGFzcyBUbywgdGVtcGxhdGU8Y2xhc3MuLi4+IGNsYXNzIE9wLCBjbGFzcy4uLiBBcmdzPgorICAgICB1c2luZyBpc19kZXRlY3RlZF9jb252ZXJ0aWJsZSA9IGlzX2NvbnZlcnRpYmxlPGRldGVjdGVkX3Q8T3AsIEFyZ3MuLi4+LCBUbz47CisgIHRlbXBsYXRlIDxjbGFzcyBUbywgdGVtcGxhdGU8Y2xhc3MuLi4+IGNsYXNzIE9wLCBjbGFzcy4uLiBBcmdzPgorICAgICBjb25zdGV4cHIgYm9vbCBpc19kZXRlY3RlZF9jb252ZXJ0aWJsZV92CisgICAgICAgPSBpc19kZXRlY3RlZF9jb252ZXJ0aWJsZTxUbywgT3AsIEFyZ3MuLi4+Ojp2YWx1ZTsgIAorCit9IC8vIG5hbWVzcGFjZSBmdW5kYW1lbnRhbHNfdjEKK30gLy8gbmFtZXNwYWNlIGV4cGVyaW1lbnRhbAorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyAqLworCisjaW5jbHVkZSA8ZXhwZXJpbWVudGFsL19fY29uZmlnPgorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfTEZUUworCisvLyAzLjMuMiwgT3RoZXIgdHlwZSB0cmFuc2Zvcm1hdGlvbnMKKy8qCit0ZW1wbGF0ZSA8Y2xhc3M+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyByYXdfaW52b2NhdGlvbl90eXBlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZuLCBjbGFzcyAuLi5fQXJncz4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHJhd19pbnZvY2F0aW9uX3R5cGU8X0ZuKF9BcmdzLi4uKT47CisKK3RlbXBsYXRlIDxjbGFzcz4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGludm9rYXRpb25fdHlwZTsKKwordGVtcGxhdGUgPGNsYXNzIF9GbiwgY2xhc3MgLi4uX0FyZ3M+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpbnZva2F0aW9uX3R5cGU8X0ZuKF9BcmdzLi4uKT47CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit1c2luZyBpbnZva2F0aW9uX3R5cGVfdCA9IHR5cGVuYW1lIGludm9rYXRpb25fdHlwZTxfVHA+Ojp0eXBlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordXNpbmcgcmF3X2ludm9jYXRpb25fdHlwZV90ID0gdHlwZW5hbWUgcmF3X2ludm9jYXRpb25fdHlwZTxfVHA+Ojp0eXBlOworKi8KKworLy8gMy4zLjQsIERldGVjdGlvbiBpZGlvbQordGVtcGxhdGUgPGNsYXNzLi4uPiB1c2luZyB2b2lkX3QgPSB2b2lkOworCitzdHJ1Y3Qgbm9uZXN1Y2ggeworICAgIG5vbmVzdWNoKCkgID0gZGVsZXRlOworICAgIH5ub25lc3VjaCgpID0gZGVsZXRlOworICAgIG5vbmVzdWNoICAgICAgKG5vbmVzdWNoIGNvbnN0JikgPSBkZWxldGU7CisgICAgdm9pZCBvcGVyYXRvcj0obm9uZXN1Y2ggY29uc3QmKSA9IGRlbGV0ZTsKKyAgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9EZWZhdWx0LCBjbGFzcyBfQWx3YXlzVm9pZCwgdGVtcGxhdGUgPGNsYXNzLi4uPiBjbGFzcyBfT3AsIGNsYXNzLi4uIF9BcmdzPgorc3RydWN0IF9ERVRFQ1RPUiB7CisgICB1c2luZyB2YWx1ZV90ID0gZmFsc2VfdHlwZTsKKyAgIHVzaW5nIHR5cGUgPSBfRGVmYXVsdDsKKyAgIH07CisKK3RlbXBsYXRlIDxjbGFzcyBfRGVmYXVsdCwgdGVtcGxhdGUgPGNsYXNzLi4uPiBjbGFzcyBfT3AsIGNsYXNzLi4uIF9BcmdzPgorc3RydWN0IF9ERVRFQ1RPUjxfRGVmYXVsdCwgdm9pZF90PF9PcDxfQXJncy4uLj4+LCBfT3AsIF9BcmdzLi4uPiB7CisgICB1c2luZyB2YWx1ZV90ID0gdHJ1ZV90eXBlOworICAgdXNpbmcgdHlwZSA9IF9PcDxfQXJncy4uLj47CisgICB9OworICAgICAKKwordGVtcGxhdGUgPHRlbXBsYXRlPGNsYXNzLi4uPiBjbGFzcyBfT3AsIGNsYXNzLi4uIF9BcmdzPgorICB1c2luZyBpc19kZXRlY3RlZCA9IHR5cGVuYW1lIF9ERVRFQ1RPUjxub25lc3VjaCwgdm9pZCwgX09wLCBfQXJncy4uLj46OnZhbHVlX3Q7Cit0ZW1wbGF0ZSA8dGVtcGxhdGU8Y2xhc3MuLi4+IGNsYXNzIF9PcCwgY2xhc3MuLi4gX0FyZ3M+CisgIHVzaW5nIGRldGVjdGVkX3QgPSB0eXBlbmFtZSBfREVURUNUT1I8bm9uZXN1Y2gsIHZvaWQsIF9PcCwgX0FyZ3MuLi4+Ojp0eXBlOwordGVtcGxhdGUgPHRlbXBsYXRlPGNsYXNzLi4uPiBjbGFzcyBfT3AsIGNsYXNzLi4uIF9BcmdzPgorICBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX2RldGVjdGVkX3YgPSBpc19kZXRlY3RlZDxfT3AsIF9BcmdzLi4uPjo6dmFsdWU7CisKK3RlbXBsYXRlIDxjbGFzcyBEZWZhdWx0LCB0ZW1wbGF0ZTxjbGFzcy4uLj4gY2xhc3MgX09wLCBjbGFzcy4uLiBfQXJncz4KKyAgdXNpbmcgZGV0ZWN0ZWRfb3IgPSBfREVURUNUT1I8RGVmYXVsdCwgdm9pZCwgX09wLCBfQXJncy4uLj47Cit0ZW1wbGF0ZSA8Y2xhc3MgRGVmYXVsdCwgdGVtcGxhdGU8Y2xhc3MuLi4+IGNsYXNzIF9PcCwgY2xhc3MuLi4gX0FyZ3M+CisgIHVzaW5nIGRldGVjdGVkX29yX3QgPSB0eXBlbmFtZSBkZXRlY3RlZF9vcjxEZWZhdWx0LCBfT3AsIF9BcmdzLi4uPjo6dHlwZTsKKwordGVtcGxhdGUgPGNsYXNzIEV4cGVjdGVkLCB0ZW1wbGF0ZTxjbGFzcy4uLj4gY2xhc3MgX09wLCBjbGFzcy4uLiBfQXJncz4KKyAgdXNpbmcgaXNfZGV0ZWN0ZWRfZXhhY3QgPSBpc19zYW1lPEV4cGVjdGVkLCBkZXRlY3RlZF90PF9PcCwgX0FyZ3MuLi4+PjsKK3RlbXBsYXRlIDxjbGFzcyBFeHBlY3RlZCwgdGVtcGxhdGU8Y2xhc3MuLi4+IGNsYXNzIF9PcCwgY2xhc3MuLi4gX0FyZ3M+CisgIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfZGV0ZWN0ZWRfZXhhY3RfdiA9IGlzX2RldGVjdGVkX2V4YWN0PEV4cGVjdGVkLCBfT3AsIF9BcmdzLi4uPjo6dmFsdWU7CisKK3RlbXBsYXRlIDxjbGFzcyBUbywgdGVtcGxhdGU8Y2xhc3MuLi4+IGNsYXNzIF9PcCwgY2xhc3MuLi4gX0FyZ3M+CisgIHVzaW5nIGlzX2RldGVjdGVkX2NvbnZlcnRpYmxlID0gaXNfY29udmVydGlibGU8ZGV0ZWN0ZWRfdDxfT3AsIF9BcmdzLi4uPiwgVG8+OwordGVtcGxhdGUgPGNsYXNzIFRvLCB0ZW1wbGF0ZTxjbGFzcy4uLj4gY2xhc3MgX09wLCBjbGFzcy4uLiBfQXJncz4KKyAgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc19kZXRlY3RlZF9jb252ZXJ0aWJsZV92ID0gaXNfZGV0ZWN0ZWRfY29udmVydGlibGU8VG8sIF9PcCwgX0FyZ3MuLi4+Ojp2YWx1ZTsgIAorCisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9MRlRTCisKKyNlbmRpZiAvKiBfTElCQ1BQX1NURF9WRVIgPiAxMSAqLworCisjZW5kaWYgLyogX0xJQkNQUF9FWFBFUklNRU5UQUxfVFlQRV9UUkFJVFMgKi8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvdW5vcmRlcmVkX21hcCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvdW5vcmRlcmVkX21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjk5OGMyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC91bm9yZGVyZWRfbWFwCkBAIC0wLDAgKzEsNjUgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdW5vcmRlcmVkX21hcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfRVhQRVJJTUVOVEFMX1VOT1JERVJFRF9NQVAKKyNkZWZpbmUgX0xJQkNQUF9FWFBFUklNRU5UQUxfVU5PUkRFUkVEX01BUAorLyoKKyAgICBleHBlcmltZW50YWwvdW5vcmRlcmVkX21hcCBzeW5vcHNpcworCisvLyBDKysxegorbmFtZXNwYWNlIHN0ZCB7CituYW1lc3BhY2UgZXhwZXJpbWVudGFsIHsKK2lubGluZSBuYW1lc3BhY2UgZnVuZGFtZW50YWxzX3YxIHsKK25hbWVzcGFjZSBwbXIgeworCisgIHRlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQsCisgICAgICAgICAgICBjbGFzcyBIYXNoID0gaGFzaDxLZXk+LAorICAgICAgICAgICAgY2xhc3MgUHJlZCA9IGVxdWFsX3RvPEtleT4+CisgIHVzaW5nIHVub3JkZXJlZF9tYXAgPQorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxLZXksIFQsIEhhc2gsIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgIHBvbHltb3JwaGljX2FsbG9jYXRvcjxwYWlyPGNvbnN0IEtleSxUPj4+OworCisgIHRlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQsCisgICAgICAgICAgICBjbGFzcyBIYXNoID0gaGFzaDxLZXk+LAorICAgICAgICAgICAgY2xhc3MgUHJlZCA9IGVxdWFsX3RvPEtleT4+CisgIHVzaW5nIHVub3JkZXJlZF9tdWx0aW1hcCA9CisgICAgc3RkOjp1bm9yZGVyZWRfbXVsdGltYXA8S2V5LCBULCBIYXNoLCBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHltb3JwaGljX2FsbG9jYXRvcjxwYWlyPGNvbnN0IEtleSxUPj4+OworCit9IC8vIG5hbWVzcGFjZSBwbXIKK30gLy8gbmFtZXNwYWNlIGZ1bmRhbWVudGFsc192MQorfSAvLyBuYW1lc3BhY2UgZXhwZXJpbWVudGFsCit9IC8vIG5hbWVzcGFjZSBzdGQKKworICovCisKKyNpbmNsdWRlIDxleHBlcmltZW50YWwvX19jb25maWc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDxleHBlcmltZW50YWwvbWVtb3J5X3Jlc291cmNlPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfTEZUU19QTVIKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwKKyAgICAgICAgICBjbGFzcyBfSGFzaCA9IGhhc2g8X0tleT4sIGNsYXNzIF9QcmVkID0gZXF1YWxfdG88X0tleT4+Cit1c2luZyB1bm9yZGVyZWRfbWFwID0gX1ZTVEQ6OnVub3JkZXJlZF9tYXA8X0tleSwgX1ZhbHVlLCBfSGFzaCwgX1ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBwb2x5bW9ycGhpY19hbGxvY2F0b3I8cGFpcjxjb25zdCBfS2V5LCBfVmFsdWU+Pj47CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVmFsdWUsCisgICAgICAgICAgY2xhc3MgX0hhc2ggPSBoYXNoPF9LZXk+LCBjbGFzcyBfUHJlZCA9IGVxdWFsX3RvPF9LZXk+PgordXNpbmcgdW5vcmRlcmVkX211bHRpbWFwID0gX1ZTVEQ6OnVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVmFsdWUsIF9IYXNoLCBfUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvbHltb3JwaGljX2FsbG9jYXRvcjxwYWlyPGNvbnN0IF9LZXksIF9WYWx1ZT4+PjsKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX0xGVFNfUE1SCisKKyNlbmRpZiAvKiBfTElCQ1BQX0VYUEVSSU1FTlRBTF9VTk9SREVSRURfTUFQICovCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL3Vub3JkZXJlZF9zZXQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL3Vub3JkZXJlZF9zZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwYTgzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvdW5vcmRlcmVkX3NldApAQCAtMCwwICsxLDU5IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHVub3JkZXJlZF9zZXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0VYUEVSSU1FTlRBTF9VTk9SREVSRURfU0VUCisjZGVmaW5lIF9MSUJDUFBfRVhQRVJJTUVOVEFMX1VOT1JERVJFRF9TRVQKKy8qCisgICAgZXhwZXJpbWVudGFsL3Vub3JkZXJlZF9zZXQgc3lub3BzaXMKKworLy8gQysrMXoKK25hbWVzcGFjZSBzdGQgeworbmFtZXNwYWNlIGV4cGVyaW1lbnRhbCB7CitpbmxpbmUgbmFtZXNwYWNlIGZ1bmRhbWVudGFsc192MSB7CituYW1lc3BhY2UgcG1yIHsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgSGFzaCA9IGhhc2g8VD4sIGNsYXNzIFByZWQgPSBlcXVhbF90bzxUPj4KKyAgdXNpbmcgdW5vcmRlcmVkX3NldCA9IHN0ZDo6dW5vcmRlcmVkX3NldDxULCBIYXNoLCBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICBwb2x5bW9ycGhpY19hbGxvY2F0b3I8VD4+OworCisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBIYXNoID0gaGFzaDxUPiwgY2xhc3MgUHJlZCA9IGVxdWFsX3RvPFQ+PgorICB1c2luZyB1bm9yZGVyZWRfbXVsdGlzZXQgPSBzdGQ6OnVub3JkZXJlZF9tdWx0aXNldDxULCBIYXNoLCBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICBwb2x5bW9ycGhpY19hbGxvY2F0b3I8VD4+OworCit9IC8vIG5hbWVzcGFjZSBwbXIKK30gLy8gbmFtZXNwYWNlIGZ1bmRhbWVudGFsc192MQorfSAvLyBuYW1lc3BhY2UgZXhwZXJpbWVudGFsCit9IC8vIG5hbWVzcGFjZSBzdGQKKworICovCisKKyNpbmNsdWRlIDxleHBlcmltZW50YWwvX19jb25maWc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNpbmNsdWRlIDxleHBlcmltZW50YWwvbWVtb3J5X3Jlc291cmNlPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfTEZUU19QTVIKKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwKKyAgICAgICAgICBjbGFzcyBfSGFzaCA9IGhhc2g8X1ZhbHVlPiwgY2xhc3MgX1ByZWQgPSBlcXVhbF90bzxfVmFsdWU+PgordXNpbmcgdW5vcmRlcmVkX3NldCA9IF9WU1REOjp1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgcG9seW1vcnBoaWNfYWxsb2NhdG9yPF9WYWx1ZT4+OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLAorICAgICAgICAgIGNsYXNzIF9IYXNoID0gaGFzaDxfVmFsdWU+LCBjbGFzcyBfUHJlZCA9IGVxdWFsX3RvPF9WYWx1ZT4+Cit1c2luZyB1bm9yZGVyZWRfbXVsdGlzZXQgPSBfVlNURDo6dW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgcG9seW1vcnBoaWNfYWxsb2NhdG9yPF9WYWx1ZT4+OworCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfTEZUU19QTVIKKworI2VuZGlmIC8qIF9MSUJDUFBfRVhQRVJJTUVOVEFMX1VOT1JERVJFRF9TRVQgKi8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvdXRpbGl0eSBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHBlcmltZW50YWwvdXRpbGl0eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWZmYTcxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC91dGlsaXR5CkBAIC0wLDAgKzEsNDcgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHV0aWxpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9FWFBFUklNRU5UQUxfVVRJTElUWQorI2RlZmluZSBfTElCQ1BQX0VYUEVSSU1FTlRBTF9VVElMSVRZCisKKy8qCisgICAgZXhwZXJpbWVudGFsL3V0aWxpdHkgc3lub3BzaXMKKworLy8gQysrMXkKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBzdGQgeworbmFtZXNwYWNlIGV4cGVyaW1lbnRhbCB7CitpbmxpbmUgbmFtZXNwYWNlIGZ1bmRhbWVudGFsc192MSB7CisKKyAgMy4xLjIsIGVyYXNlZC10eXBlIHBsYWNlaG9sZGVyCisgIHN0cnVjdCBlcmFzZWRfdHlwZSB7IH07CisKK30gLy8gbmFtZXNwYWNlIGZ1bmRhbWVudGFsc192MQorfSAvLyBuYW1lc3BhY2UgZXhwZXJpbWVudGFsCit9IC8vIG5hbWVzcGFjZSBzdGQKKworICovCisKKyNpbmNsdWRlIDxleHBlcmltZW50YWwvX19jb25maWc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX0xGVFMKKworICBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgZXJhc2VkX3R5cGUgeyB9OworCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfTEZUUworCisjZW5kaWYgLyogX0xJQkNQUF9FWFBFUklNRU5UQUxfVVRJTElUWSAqLwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC92ZWN0b3IgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXhwZXJpbWVudGFsL3ZlY3RvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDEwNDkyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4cGVyaW1lbnRhbC92ZWN0b3IKQEAgLTAsMCArMSw0NyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHZlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfRVhQRVJJTUVOVEFMX1ZFQ1RPUgorI2RlZmluZSBfTElCQ1BQX0VYUEVSSU1FTlRBTF9WRUNUT1IKKy8qCisgICAgZXhwZXJpbWVudGFsL3ZlY3RvciBzeW5vcHNpcworCisvLyBDKysxegorbmFtZXNwYWNlIHN0ZCB7CituYW1lc3BhY2UgZXhwZXJpbWVudGFsIHsKK2lubGluZSBuYW1lc3BhY2UgZnVuZGFtZW50YWxzX3YxIHsKK25hbWVzcGFjZSBwbXIgeworCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICB1c2luZyB2ZWN0b3IgPSBzdGQ6OnZlY3RvcjxULCBwb2x5bW9ycGhpY19hbGxvY2F0b3I8VD4+OworCit9IC8vIG5hbWVzcGFjZSBwbXIKK30gLy8gbmFtZXNwYWNlIGZ1bmRhbWVudGFsc192MQorfSAvLyBuYW1lc3BhY2UgZXhwZXJpbWVudGFsCit9IC8vIG5hbWVzcGFjZSBzdGQKKworICovCisKKyNpbmNsdWRlIDxleHBlcmltZW50YWwvX19jb25maWc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGV4cGVyaW1lbnRhbC9tZW1vcnlfcmVzb3VyY2U+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9MRlRTX1BNUgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlVD4KK3VzaW5nIHZlY3RvciA9IF9WU1REOjp2ZWN0b3I8X1ZhbHVlVCwgcG9seW1vcnBoaWNfYWxsb2NhdG9yPF9WYWx1ZVQ+PjsKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX0xGVFNfUE1SCisKKyNlbmRpZiAvKiBfTElCQ1BQX0VYUEVSSU1FTlRBTF9WRUNUT1IgKi8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHQvX19oYXNoIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4dC9fX2hhc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4Y2IxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHQvX19oYXNoCkBAIC0wLDAgKzEsMTM1IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhhc2hfc2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9FWFRfSEFTSAorI2RlZmluZSBfTElCQ1BQX0VYVF9IQVNICisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2UgX19nbnVfY3h4IHsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBoYXNoIHsgfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc2g8Y29uc3QgY2hhcio+CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248Y29uc3QgY2hhciosIHNpemVfdD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgY2hhciAqX19jKSBjb25zdCBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIHJldHVybiBfX2RvX3N0cmluZ19oYXNoKF9fYywgX19jICsgc3RybGVuKF9fYykpOworICAgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBoYXNoPGNoYXIgKj4KKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxjaGFyKiwgc2l6ZV90PgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShjaGFyICpfX2MpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIF9fZG9fc3RyaW5nX2hhc2g8Y29uc3QgY2hhciAqPihfX2MsIF9fYyArIHN0cmxlbihfX2MpKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDxjaGFyPgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGNoYXIsIHNpemVfdD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IG9wZXJhdG9yKCkoY2hhciBfX2MpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIF9fYzsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDxzaWduZWQgY2hhcj4KKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxzaWduZWQgY2hhciwgc2l6ZV90PgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShzaWduZWQgY2hhciBfX2MpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIF9fYzsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDx1bnNpZ25lZCBjaGFyPgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHVuc2lnbmVkIGNoYXIsIHNpemVfdD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IG9wZXJhdG9yKCkodW5zaWduZWQgY2hhciBfX2MpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIF9fYzsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDxzaG9ydD4KKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxzaG9ydCwgc2l6ZV90PgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShzaG9ydCBfX2MpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIF9fYzsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDx1bnNpZ25lZCBzaG9ydD4KKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx1bnNpZ25lZCBzaG9ydCwgc2l6ZV90PgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgb3BlcmF0b3IoKSh1bnNpZ25lZCBzaG9ydCBfX2MpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIF9fYzsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDxpbnQ+CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248aW50LCBzaXplX3Q+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBvcGVyYXRvcigpKGludCBfX2MpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIF9fYzsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDx1bnNpZ25lZCBpbnQ+CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dW5zaWduZWQgaW50LCBzaXplX3Q+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBvcGVyYXRvcigpKHVuc2lnbmVkIGludCBfX2MpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIF9fYzsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDxsb25nPgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGxvbmcsIHNpemVfdD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IG9wZXJhdG9yKCkobG9uZyBfX2MpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIF9fYzsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDx1bnNpZ25lZCBsb25nPgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHVuc2lnbmVkIGxvbmcsIHNpemVfdD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IG9wZXJhdG9yKCkodW5zaWduZWQgbG9uZyBfX2MpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIF9fYzsKKyAgICB9Cit9OworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfRVhUX0hBU0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9leHQvaGFzaF9tYXAgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXh0L2hhc2hfbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OGU4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXh0L2hhc2hfbWFwCkBAIC0wLDAgKzEsOTg0IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBoYXNoX21hcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0hBU0hfTUFQCisjZGVmaW5lIF9MSUJDUFBfSEFTSF9NQVAKKworLyoKKworICAgIGhhc2hfbWFwIHN5bm9wc2lzCisKK25hbWVzcGFjZSBfX2dudV9jeHgKK3sKKwordGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVCwgY2xhc3MgSGFzaCA9IGhhc2g8S2V5PiwgY2xhc3MgUHJlZCA9IGVxdWFsX3RvPEtleT4sCisgICAgICAgICAgY2xhc3MgQWxsb2MgPSBhbGxvY2F0b3I8cGFpcjxjb25zdCBLZXksIFQ+Pj4KK2NsYXNzIGhhc2hfbWFwCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIEtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CisgICAgdHlwZWRlZiBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZF90eXBlOworICAgIHR5cGVkZWYgSGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXI7CisgICAgdHlwZWRlZiBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9lcXVhbDsKKyAgICB0eXBlZGVmIEFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgdHlwZWRlZiBwYWlyPGNvbnN0IGtleV90eXBlLCBtYXBwZWRfdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OnBvaW50ZXIgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OmNvbnN0X3BvaW50ZXIgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgIHR5cGVkZWYgL3Vuc3BlY2lmaWVkLyBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIC91bnNwZWNpZmllZC8gY29uc3RfaXRlcmF0b3I7CisKKyAgICBleHBsaWNpdCBoYXNoX21hcChzaXplX3R5cGUgbiA9IDE5MywgY29uc3QgaGFzaGVyJiBoZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBlcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbWFwKElucHV0SXRlcmF0b3IgZiwgSW5wdXRJdGVyYXRvciBsLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBuID0gMTkzLCBjb25zdCBoYXNoZXImIGhmID0gaGFzaGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBlcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSA9IGFsbG9jYXRvcl90eXBlKCkpOworICAgIGhhc2hfbWFwKGNvbnN0IGhhc2hfbWFwJik7CisgICAgfmhhc2hfbWFwKCk7CisgICAgaGFzaF9tYXAmIG9wZXJhdG9yPShjb25zdCBoYXNoX21hcCYpOworCisgICAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0OworCisgICAgYm9vbCAgICAgIGVtcHR5KCkgY29uc3Q7CisgICAgc2l6ZV90eXBlIHNpemUoKSBjb25zdDsKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdDsKKworICAgIGl0ZXJhdG9yICAgICAgIGJlZ2luKCk7CisgICAgaXRlcmF0b3IgICAgICAgZW5kKCk7CisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSAgY29uc3Q7CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICAgY29uc3Q7CisKKyAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgb2JqKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZCBpbnNlcnQoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0KTsKKworICAgIHZvaWQgZXJhc2UoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24pOworICAgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgayk7CisgICAgdm9pZCBlcmFzZShjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCk7CisgICAgdm9pZCBjbGVhcigpOworCisgICAgdm9pZCBzd2FwKGhhc2hfbWFwJik7CisKKyAgICBoYXNoZXIgaGFzaF9mdW5jdCgpIGNvbnN0OworICAgIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdDsKKworICAgIGl0ZXJhdG9yICAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIGspOworICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworICAgIHNpemVfdHlwZSBjb3VudChjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+ICAgICAgICAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworCisgICAgbWFwcGVkX3R5cGUmIG9wZXJhdG9yW10oY29uc3Qga2V5X3R5cGUmIGspOworCisgICAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0OworICAgIHNpemVfdHlwZSBtYXhfYnVja2V0X2NvdW50KCkgY29uc3Q7CisKKyAgICBzaXplX3R5cGUgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBuKSBjb25zdDsKKworICAgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIEhhc2gsIGNsYXNzIFByZWQsIGNsYXNzIEFsbG9jPgorICAgIHZvaWQgc3dhcChoYXNoX21hcDxLZXksIFQsIEhhc2gsIFByZWQsIEFsbG9jPiYgeCwKKyAgICAgICAgICAgICAgaGFzaF9tYXA8S2V5LCBULCBIYXNoLCBQcmVkLCBBbGxvYz4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBULCBjbGFzcyBIYXNoLCBjbGFzcyBQcmVkLCBjbGFzcyBBbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBoYXNoX21hcDxLZXksIFQsIEhhc2gsIFByZWQsIEFsbG9jPiYgeCwKKyAgICAgICAgICAgICAgIGNvbnN0IGhhc2hfbWFwPEtleSwgVCwgSGFzaCwgUHJlZCwgQWxsb2M+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVCwgY2xhc3MgSGFzaCwgY2xhc3MgUHJlZCwgY2xhc3MgQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgaGFzaF9tYXA8S2V5LCBULCBIYXNoLCBQcmVkLCBBbGxvYz4mIHgsCisgICAgICAgICAgICAgICBjb25zdCBoYXNoX21hcDxLZXksIFQsIEhhc2gsIFByZWQsIEFsbG9jPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIEhhc2ggPSBoYXNoPEtleT4sIGNsYXNzIFByZWQgPSBlcXVhbF90bzxLZXk+LAorICAgICAgICAgIGNsYXNzIEFsbG9jID0gYWxsb2NhdG9yPHBhaXI8Y29uc3QgS2V5LCBUPj4+CitjbGFzcyBoYXNoX211bHRpbWFwCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIEtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CisgICAgdHlwZWRlZiBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZF90eXBlOworICAgIHR5cGVkZWYgSGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXI7CisgICAgdHlwZWRlZiBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9lcXVhbDsKKyAgICB0eXBlZGVmIEFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgdHlwZWRlZiBwYWlyPGNvbnN0IGtleV90eXBlLCBtYXBwZWRfdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OnBvaW50ZXIgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OmNvbnN0X3BvaW50ZXIgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgIHR5cGVkZWYgL3Vuc3BlY2lmaWVkLyBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIC91bnNwZWNpZmllZC8gY29uc3RfaXRlcmF0b3I7CisKKyAgICBleHBsaWNpdCBoYXNoX211bHRpbWFwKHNpemVfdHlwZSBuID0gMTkzLCBjb25zdCBoYXNoZXImIGhmID0gaGFzaGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIGVxbCA9IGtleV9lcXVhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tdWx0aW1hcChJbnB1dEl0ZXJhdG9yIGYsIElucHV0SXRlcmF0b3IgbCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgbiA9IDE5MywgY29uc3QgaGFzaGVyJiBoZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgZXFsID0ga2V5X2VxdWFsKCksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKyAgICBleHBsaWNpdCBoYXNoX211bHRpbWFwKGNvbnN0IGFsbG9jYXRvcl90eXBlJik7CisgICAgaGFzaF9tdWx0aW1hcChjb25zdCBoYXNoX211bHRpbWFwJik7CisgICAgfmhhc2hfbXVsdGltYXAoKTsKKyAgICBoYXNoX211bHRpbWFwJiBvcGVyYXRvcj0oY29uc3QgaGFzaF9tdWx0aW1hcCYpOworCisgICAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0OworCisgICAgYm9vbCAgICAgIGVtcHR5KCkgY29uc3Q7CisgICAgc2l6ZV90eXBlIHNpemUoKSBjb25zdDsKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdDsKKworICAgIGl0ZXJhdG9yICAgICAgIGJlZ2luKCk7CisgICAgaXRlcmF0b3IgICAgICAgZW5kKCk7CisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSAgY29uc3Q7CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICAgY29uc3Q7CisKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgb2JqKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZCBpbnNlcnQoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0KTsKKworICAgIHZvaWQgZXJhc2UoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24pOworICAgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgayk7CisgICAgdm9pZCBlcmFzZShjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCk7CisgICAgdm9pZCBjbGVhcigpOworCisgICAgdm9pZCBzd2FwKGhhc2hfbXVsdGltYXAmKTsKKworICAgIGhhc2hlciBoYXNoX2Z1bmN0KCkgY29uc3Q7CisgICAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0OworCisgICAgaXRlcmF0b3IgICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgayk7CisgICAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisgICAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IGtleV90eXBlJiBrKSBjb25zdDsKKyAgICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gICAgICAgICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIGspOworICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisKKyAgICBzaXplX3R5cGUgYnVja2V0X2NvdW50KCkgY29uc3Q7CisgICAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdDsKKworICAgIHNpemVfdHlwZSBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIG4pIGNvbnN0OworCisgICAgdm9pZCByZXNpemUoc2l6ZV90eXBlIG4pOworfTsKKwordGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVCwgY2xhc3MgSGFzaCwgY2xhc3MgUHJlZCwgY2xhc3MgQWxsb2M+CisgICAgdm9pZCBzd2FwKGhhc2hfbXVsdGltYXA8S2V5LCBULCBIYXNoLCBQcmVkLCBBbGxvYz4mIHgsCisgICAgICAgICAgICAgIGhhc2hfbXVsdGltYXA8S2V5LCBULCBIYXNoLCBQcmVkLCBBbGxvYz4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBULCBjbGFzcyBIYXNoLCBjbGFzcyBQcmVkLCBjbGFzcyBBbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBoYXNoX211bHRpbWFwPEtleSwgVCwgSGFzaCwgUHJlZCwgQWxsb2M+JiB4LAorICAgICAgICAgICAgICAgY29uc3QgaGFzaF9tdWx0aW1hcDxLZXksIFQsIEhhc2gsIFByZWQsIEFsbG9jPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIEhhc2gsIGNsYXNzIFByZWQsIGNsYXNzIEFsbG9jPgorICAgIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGhhc2hfbXVsdGltYXA8S2V5LCBULCBIYXNoLCBQcmVkLCBBbGxvYz4mIHgsCisgICAgICAgICAgICAgICBjb25zdCBoYXNoX211bHRpbWFwPEtleSwgVCwgSGFzaCwgUHJlZCwgQWxsb2M+JiB5KTsKKworfSAgLy8gX19nbnVfY3h4CisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxfX2hhc2hfdGFibGU+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8ZXh0L19faGFzaD4KKworI2lmIF9fREVQUkVDQVRFRAorI2lmIGRlZmluZWQoX0xJQkNQUF9XQVJOSU5HKQorICAgIF9MSUJDUFBfV0FSTklORygiVXNlIG9mIHRoZSBoZWFkZXIgPGV4dC9oYXNoX21hcD4gaXMgZGVwcmVjYXRlZC4gIE1pZ3JhdGUgdG8gPHVub3JkZXJlZF9tYXA+IikKKyNlbHNlCisjICAgd2FybmluZyBVc2Ugb2YgdGhlIGhlYWRlciA8ZXh0L2hhc2hfbWFwPiBpcyBkZXByZWNhdGVkLiAgTWlncmF0ZSB0byA8dW5vcmRlcmVkX21hcD4KKyNlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCituYW1lc3BhY2UgX19nbnVfY3h4IHsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsCisgICAgICAgICAgYm9vbCA9IGlzX2VtcHR5PF9IYXNoPjo6dmFsdWUgJiYgIV9fbGliY3BwX2lzX2ZpbmFsPF9IYXNoPjo6dmFsdWUKKyAgICAgICAgPgorY2xhc3MgX19oYXNoX21hcF9oYXNoZXIKKyAgICA6IHByaXZhdGUgX0hhc2gKK3sKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9faGFzaF9tYXBfaGFzaGVyKCkgOiBfSGFzaCgpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX2hhc2hfbWFwX2hhc2hlcihjb25zdCBfSGFzaCYgX19oKSA6IF9IYXNoKF9faCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0IF9IYXNoJiBoYXNoX2Z1bmN0aW9uKCkgY29uc3Qge3JldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBjb25zdAorICAgICAgICB7cmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9IYXNoJj4oKnRoaXMpKF9feC5maXJzdCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCB0eXBlbmFtZSBfVHA6OmZpcnN0X3R5cGUmIF9feCkgY29uc3QKKyAgICAgICAge3JldHVybiBzdGF0aWNfY2FzdDxjb25zdCBfSGFzaCY+KCp0aGlzKShfX3gpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9IYXNoPgorY2xhc3MgX19oYXNoX21hcF9oYXNoZXI8X1RwLCBfSGFzaCwgZmFsc2U+Cit7CisgICAgX0hhc2ggX19oYXNoXzsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9faGFzaF9tYXBfaGFzaGVyKCkgOiBfX2hhc2hfKCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9faGFzaF9tYXBfaGFzaGVyKGNvbnN0IF9IYXNoJiBfX2gpIDogX19oYXNoXyhfX2gpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdCBfSGFzaCYgaGFzaF9mdW5jdGlvbigpIGNvbnN0IHtyZXR1cm4gX19oYXNoXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBjb25zdAorICAgICAgICB7cmV0dXJuIF9faGFzaF8oX194LmZpcnN0KTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9UcDo6Zmlyc3RfdHlwZSYgX194KSBjb25zdAorICAgICAgICB7cmV0dXJuIF9faGFzaF8oX194KTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfUHJlZCwKKyAgICAgICAgICBib29sID0gaXNfZW1wdHk8X1ByZWQ+Ojp2YWx1ZSAmJiAhX19saWJjcHBfaXNfZmluYWw8X1ByZWQ+Ojp2YWx1ZQorICAgICAgICAgPgorY2xhc3MgX19oYXNoX21hcF9lcXVhbAorICAgIDogcHJpdmF0ZSBfUHJlZAoreworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX19oYXNoX21hcF9lcXVhbCgpIDogX1ByZWQoKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX19oYXNoX21hcF9lcXVhbChjb25zdCBfUHJlZCYgX19wKSA6IF9QcmVkKF9fcCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0IF9QcmVkJiBrZXlfZXEoKSBjb25zdCB7cmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgICAge3JldHVybiBzdGF0aWNfY2FzdDxjb25zdCBfUHJlZCY+KCp0aGlzKShfX3guZmlyc3QsIF9feS5maXJzdCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgdHlwZW5hbWUgX1RwOjpmaXJzdF90eXBlJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9QcmVkJj4oKnRoaXMpKF9feCwgX195LmZpcnN0KTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgdHlwZW5hbWUgX1RwOjpmaXJzdF90eXBlJiBfX3kpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgX1ByZWQmPigqdGhpcykoX194LmZpcnN0LCBfX3kpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9UcDo6Zmlyc3RfdHlwZSYgX194LAorICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBfVHA6OmZpcnN0X3R5cGUmIF9feSkgY29uc3QKKyAgICAgICAge3JldHVybiBzdGF0aWNfY2FzdDxjb25zdCBfUHJlZCY+KCp0aGlzKShfX3gsIF9feSk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1ByZWQ+CitjbGFzcyBfX2hhc2hfbWFwX2VxdWFsPF9UcCwgX1ByZWQsIGZhbHNlPgoreworICAgIF9QcmVkIF9fcHJlZF87CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX2hhc2hfbWFwX2VxdWFsKCkgOiBfX3ByZWRfKCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9faGFzaF9tYXBfZXF1YWwoY29uc3QgX1ByZWQmIF9fcCkgOiBfX3ByZWRfKF9fcCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0IF9QcmVkJiBrZXlfZXEoKSBjb25zdCB7cmV0dXJuIF9fcHJlZF87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fcHJlZF8oX194LmZpcnN0LCBfX3kuZmlyc3QpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9UcDo6Zmlyc3RfdHlwZSYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgICAge3JldHVybiBfX3ByZWRfKF9feCwgX195LmZpcnN0KTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgdHlwZW5hbWUgX1RwOjpmaXJzdF90eXBlJiBfX3kpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX19wcmVkXyhfX3guZmlyc3QsIF9feSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgdHlwZW5hbWUgX1RwOjpmaXJzdF90eXBlJiBfX3gsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIF9UcDo6Zmlyc3RfdHlwZSYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fcHJlZF8oX194LCBfX3kpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CitjbGFzcyBfX2hhc2hfbWFwX25vZGVfZGVzdHJ1Y3RvcgoreworICAgIHR5cGVkZWYgX0FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPiAgICBfX2FsbG9jX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjp2YWx1ZV90eXBlOjpfX25vZGVfdmFsdWVfdHlwZSB2YWx1ZV90eXBlOworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnBvaW50ZXIgICAgcG9pbnRlcjsKK3ByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSB2YWx1ZV90eXBlOjpmaXJzdF90eXBlICAgICBmaXJzdF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUgICAgc2Vjb25kX3R5cGU7CisKKyAgICBhbGxvY2F0b3JfdHlwZSYgX19uYV87CisKKyAgICBfX2hhc2hfbWFwX25vZGVfZGVzdHJ1Y3RvciYgb3BlcmF0b3I9KGNvbnN0IF9faGFzaF9tYXBfbm9kZV9kZXN0cnVjdG9yJik7CisKK3B1YmxpYzoKKyAgICBib29sIF9fZmlyc3RfY29uc3RydWN0ZWQ7CisgICAgYm9vbCBfX3NlY29uZF9jb25zdHJ1Y3RlZDsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2hhc2hfbWFwX25vZGVfZGVzdHJ1Y3RvcihhbGxvY2F0b3JfdHlwZSYgX19uYSkKKyAgICAgICAgOiBfX25hXyhfX25hKSwKKyAgICAgICAgICBfX2ZpcnN0X2NvbnN0cnVjdGVkKGZhbHNlKSwKKyAgICAgICAgICBfX3NlY29uZF9jb25zdHJ1Y3RlZChmYWxzZSkKKyAgICAgICAge30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX21hcF9ub2RlX2Rlc3RydWN0b3IoX19oYXNoX25vZGVfZGVzdHJ1Y3RvcjxhbGxvY2F0b3JfdHlwZT4mJiBfX3gpCisgICAgICAgIDogX19uYV8oX194Ll9fbmFfKSwKKyAgICAgICAgICBfX2ZpcnN0X2NvbnN0cnVjdGVkKF9feC5fX3ZhbHVlX2NvbnN0cnVjdGVkKSwKKyAgICAgICAgICBfX3NlY29uZF9jb25zdHJ1Y3RlZChfX3guX192YWx1ZV9jb25zdHJ1Y3RlZCkKKyAgICAgICAgeworICAgICAgICAgICAgX194Ll9fdmFsdWVfY29uc3RydWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorI2Vsc2UgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2hhc2hfbWFwX25vZGVfZGVzdHJ1Y3Rvcihjb25zdCBfX2hhc2hfbm9kZV9kZXN0cnVjdG9yPGFsbG9jYXRvcl90eXBlPiYgX194KQorICAgICAgICA6IF9fbmFfKF9feC5fX25hXyksCisgICAgICAgICAgX19maXJzdF9jb25zdHJ1Y3RlZChfX3guX192YWx1ZV9jb25zdHJ1Y3RlZCksCisgICAgICAgICAgX19zZWNvbmRfY29uc3RydWN0ZWQoX194Ll9fdmFsdWVfY29uc3RydWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Ym9vbCY+KF9feC5fX3ZhbHVlX2NvbnN0cnVjdGVkKSA9IGZhbHNlOworICAgICAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgb3BlcmF0b3IoKShwb2ludGVyIF9fcCkKKyAgICB7CisgICAgICAgIGlmIChfX3NlY29uZF9jb25zdHJ1Y3RlZCkKKyAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpkZXN0cm95KF9fbmFfLCBfVlNURDo6YWRkcmVzc29mKF9fcC0+X192YWx1ZV8uc2Vjb25kKSk7CisgICAgICAgIGlmIChfX2ZpcnN0X2NvbnN0cnVjdGVkKQorICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmRlc3Ryb3koX19uYV8sIF9WU1REOjphZGRyZXNzb2YoX19wLT5fX3ZhbHVlXy5maXJzdCkpOworICAgICAgICBpZiAoX19wKQorICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19uYV8sIF9fcCwgMSk7CisgICAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9IYXNoSXRlcmF0b3I+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2hhc2hfbWFwX2l0ZXJhdG9yCit7CisgICAgX0hhc2hJdGVyYXRvciBfX2lfOworCisgICAgdHlwZWRlZiBjb25zdCB0eXBlbmFtZSBfSGFzaEl0ZXJhdG9yOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlIGtleV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2hJdGVyYXRvcjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUgICAgICBtYXBwZWRfdHlwZTsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBwYWlyPGtleV90eXBlLCBtYXBwZWRfdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaEl0ZXJhdG9yOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfcG9pbnRlcjx0eXBlbmFtZSBfSGFzaEl0ZXJhdG9yOjpwb2ludGVyLCB2YWx1ZV90eXBlPjo6dHlwZQorICAgICAgICBwb2ludGVyOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX2hhc2hfbWFwX2l0ZXJhdG9yKCkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX19oYXNoX21hcF9pdGVyYXRvcihfSGFzaEl0ZXJhdG9yIF9faSkgOiBfX2lfKF9faSkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHtyZXR1cm4gKm9wZXJhdG9yLT4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7cmV0dXJuIChwb2ludGVyKV9faV8ub3BlcmF0b3ItPigpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX19oYXNoX21hcF9pdGVyYXRvciYgb3BlcmF0b3IrKygpIHsrK19faV87IHJldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faGFzaF9tYXBfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpCisgICAgeworICAgICAgICBfX2hhc2hfbWFwX2l0ZXJhdG9yIF9fdCgqdGhpcyk7CisgICAgICAgICsrKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuIF9fdDsKKyAgICB9CisKKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSAKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgX19oYXNoX21hcF9pdGVyYXRvciYgX194LCBjb25zdCBfX2hhc2hfbWFwX2l0ZXJhdG9yJiBfX3kpCisgICAgICAgIHtyZXR1cm4gX194Ll9faV8gPT0gX195Ll9faV87fQorICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIAorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfX2hhc2hfbWFwX2l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9faGFzaF9tYXBfaXRlcmF0b3ImIF9feSkKKyAgICAgICAge3JldHVybiBfX3guX19pXyAhPSBfX3kuX19pXzt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaF9tYXA7CisgICAgdGVtcGxhdGUgPGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc2hfbXVsdGltYXA7CisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19oYXNoX2NvbnN0X2l0ZXJhdG9yOworICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9faGFzaF9jb25zdF9sb2NhbF9pdGVyYXRvcjsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3M+IGZyaWVuZCBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2hhc2hfbWFwX2NvbnN0X2l0ZXJhdG9yOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9IYXNoSXRlcmF0b3I+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2hhc2hfbWFwX2NvbnN0X2l0ZXJhdG9yCit7CisgICAgX0hhc2hJdGVyYXRvciBfX2lfOworCisgICAgdHlwZWRlZiBjb25zdCB0eXBlbmFtZSBfSGFzaEl0ZXJhdG9yOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlIGtleV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2hJdGVyYXRvcjo6dmFsdWVfdHlwZTo6c2Vjb25kX3R5cGUgICAgICBtYXBwZWRfdHlwZTsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBwYWlyPGtleV90eXBlLCBtYXBwZWRfdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaEl0ZXJhdG9yOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfcG9pbnRlcjx0eXBlbmFtZSBfSGFzaEl0ZXJhdG9yOjpwb2ludGVyLCBjb25zdCB2YWx1ZV90eXBlPjo6dHlwZQorICAgICAgICBwb2ludGVyOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX2hhc2hfbWFwX2NvbnN0X2l0ZXJhdG9yKCkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2hhc2hfbWFwX2NvbnN0X2l0ZXJhdG9yKF9IYXNoSXRlcmF0b3IgX19pKSA6IF9faV8oX19pKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2hhc2hfbWFwX2NvbnN0X2l0ZXJhdG9yKAorICAgICAgICAgICAgX19oYXNoX21hcF9pdGVyYXRvcjx0eXBlbmFtZSBfSGFzaEl0ZXJhdG9yOjpfX25vbl9jb25zdF9pdGVyYXRvcj4gX19pKQorICAgICAgICAgICAgICAgIDogX19pXyhfX2kuX19pXykge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3Qge3JldHVybiAqb3BlcmF0b3ItPigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3Qge3JldHVybiAocG9pbnRlcilfX2lfLm9wZXJhdG9yLT4oKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX21hcF9jb25zdF9pdGVyYXRvciYgb3BlcmF0b3IrKygpIHsrK19faV87IHJldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faGFzaF9tYXBfY29uc3RfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpCisgICAgeworICAgICAgICBfX2hhc2hfbWFwX2NvbnN0X2l0ZXJhdG9yIF9fdCgqdGhpcyk7CisgICAgICAgICsrKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuIF9fdDsKKyAgICB9CisKKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfX2hhc2hfbWFwX2NvbnN0X2l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9faGFzaF9tYXBfY29uc3RfaXRlcmF0b3ImIF9feSkKKyAgICAgICAge3JldHVybiBfX3guX19pXyA9PSBfX3kuX19pXzt9CisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgX19oYXNoX21hcF9jb25zdF9pdGVyYXRvciYgX194LCBjb25zdCBfX2hhc2hfbWFwX2NvbnN0X2l0ZXJhdG9yJiBfX3kpCisgICAgICAgIHtyZXR1cm4gX194Ll9faV8gIT0gX195Ll9faV87fQorCisgICAgdGVtcGxhdGUgPGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc2hfbWFwOworICAgIHRlbXBsYXRlIDxjbGFzcywgY2xhc3MsIGNsYXNzLCBjbGFzcywgY2xhc3M+IGZyaWVuZCBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBoYXNoX211bHRpbWFwOworICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9faGFzaF9jb25zdF9pdGVyYXRvcjsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3M+IGZyaWVuZCBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2hhc2hfY29uc3RfbG9jYWxfaXRlcmF0b3I7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCA9IGhhc2g8X0tleT4sIGNsYXNzIF9QcmVkID0gZXF1YWxfdG88X0tleT4sCisgICAgICAgICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPHBhaXI8Y29uc3QgX0tleSwgX1RwPiA+ID4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc2hfbWFwCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIF9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CisgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZF90eXBlOworICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3R5cGU7CisgICAgdHlwZWRlZiBfSGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlcjsKKyAgICB0eXBlZGVmIF9QcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2VxdWFsOworICAgIHR5cGVkZWYgX0FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHBhaXI8Y29uc3Qga2V5X3R5cGUsIG1hcHBlZF90eXBlPiAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBwYWlyPGtleV90eXBlLCBtYXBwZWRfdHlwZT4gICAgICAgICAgICAgICAgICAgIF9fdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9faGFzaF9tYXBfaGFzaGVyPF9fdmFsdWVfdHlwZSwgaGFzaGVyPiAgIF9faGFzaGVyOworICAgIHR5cGVkZWYgX19oYXNoX21hcF9lcXVhbDxfX3ZhbHVlX3R5cGUsIGtleV9lcXVhbD4gX19rZXlfZXF1YWw7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9hbGxvY19oZWxwZXI8YWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT4sIF9fdmFsdWVfdHlwZT46OnR5cGUgX19hbGxvY2F0b3JfdHlwZTsKKworICAgIHR5cGVkZWYgX19oYXNoX3RhYmxlPF9fdmFsdWVfdHlwZSwgX19oYXNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19rZXlfZXF1YWwsICBfX2FsbG9jYXRvcl90eXBlPiAgIF9fdGFibGU7CisKKyAgICBfX3RhYmxlIF9fdGFibGVfOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RhYmxlOjpfX25vZGVfcG9pbnRlciAgICAgICAgICAgICAgIF9fbm9kZV9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6X19ub2RlX2NvbnN0X3BvaW50ZXIgICAgICAgICBfX25vZGVfY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6Ol9fbm9kZV90cmFpdHMgICAgICAgICAgICAgICAgX19ub2RlX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6Ol9fbm9kZV9hbGxvY2F0b3IgICAgICAgICAgICAgX19ub2RlX2FsbG9jYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6Ol9fbm9kZSAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlOworICAgIHR5cGVkZWYgX19oYXNoX21hcF9ub2RlX2Rlc3RydWN0b3I8X19ub2RlX2FsbG9jYXRvcj4gICBfRHA7CisgICAgdHlwZWRlZiB1bmlxdWVfcHRyPF9fbm9kZSwgX0RwPiAgICAgICAgICAgICAgICAgICAgICAgICBfX25vZGVfaG9sZGVyOworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT4gICAgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpwb2ludGVyICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpjb25zdF9wb2ludGVyICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICB0eXBlZGVmIF9faGFzaF9tYXBfaXRlcmF0b3I8dHlwZW5hbWUgX190YWJsZTo6aXRlcmF0b3I+ICAgICAgIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgX19oYXNoX21hcF9jb25zdF9pdGVyYXRvcjx0eXBlbmFtZSBfX3RhYmxlOjpjb25zdF9pdGVyYXRvcj4gY29uc3RfaXRlcmF0b3I7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGhhc2hfbWFwKCkge19fdGFibGVfLnJlaGFzaCgxOTMpO30KKyAgICBleHBsaWNpdCBoYXNoX21hcChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSk7CisgICAgaGFzaF9tYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLAorICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCkpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworICAgIGhhc2hfbWFwKGNvbnN0IGhhc2hfbWFwJiBfX3UpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgICB7cmV0dXJuIGFsbG9jYXRvcl90eXBlKF9fdGFibGVfLl9fbm9kZV9hbGxvYygpKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCAgICAgIGVtcHR5KCkgY29uc3Qge3JldHVybiBfX3RhYmxlXy5zaXplKCkgPT0gMDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgIHtyZXR1cm4gX190YWJsZV8uc2l6ZSgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3Qge3JldHVybiBfX3RhYmxlXy5tYXhfc2l6ZSgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciAgICAgICBiZWdpbigpICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciAgICAgICBlbmQoKSAgICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmVuZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSAgY29uc3Qge3JldHVybiBfX3RhYmxlXy5iZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICAgY29uc3Qge3JldHVybiBfX3RhYmxlXy5lbmQoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgICAge3JldHVybiBfX3RhYmxlXy5fX2luc2VydF91bmlxdWUoX194KTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciwgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7cmV0dXJuIGluc2VydChfX3gpLmZpcnN0O30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdm9pZCBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcCkge19fdGFibGVfLmVyYXNlKF9fcC5fX2lfKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rKSB7cmV0dXJuIF9fdGFibGVfLl9fZXJhc2VfdW5pcXVlKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAge19fdGFibGVfLmVyYXNlKF9fZmlyc3QuX19pXywgX19sYXN0Ll9faV8pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBjbGVhcigpIHtfX3RhYmxlXy5jbGVhcigpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAoaGFzaF9tYXAmIF9fdSkge19fdGFibGVfLnN3YXAoX191Ll9fdGFibGVfKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaGFzaGVyIGhhc2hfZnVuY3QoKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmhhc2hfZnVuY3Rpb24oKS5oYXNoX2Z1bmN0aW9uKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBrZXlfZXF1YWwga2V5X2VxKCkgY29uc3QKKyAgICAgICAge3JldHVybiBfX3RhYmxlXy5rZXlfZXEoKS5rZXlfZXEoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rKSAgICAgICB7cmV0dXJuIF9fdGFibGVfLmZpbmQoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Qge3JldHVybiBfX3RhYmxlXy5maW5kKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgY291bnQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Qge3JldHVybiBfX3RhYmxlXy5fX2NvdW50X3VuaXF1ZShfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+ICAgICAgICAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgICAgIHtyZXR1cm4gX190YWJsZV8uX19lcXVhbF9yYW5nZV91bmlxdWUoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9fZXF1YWxfcmFuZ2VfdW5pcXVlKF9fayk7fQorCisgICAgbWFwcGVkX3R5cGUmIG9wZXJhdG9yW10oY29uc3Qga2V5X3R5cGUmIF9fayk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uYnVja2V0X2NvdW50KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0IHtyZXR1cm4gX190YWJsZV8ubWF4X2J1Y2tldF9jb3VudCgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX190YWJsZV8uYnVja2V0X3NpemUoX19uKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbikge19fdGFibGVfLnJlaGFzaChfX24pO30KKworcHJpdmF0ZToKKyAgICBfX25vZGVfaG9sZGVyIF9fY29uc3RydWN0X25vZGUoY29uc3Qga2V5X3R5cGUmIF9fayk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK2hhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+OjpoYXNoX21hcCgKKyAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsKQorICAgIDogX190YWJsZV8oX19oZiwgX19lcWwpCit7CisgICAgX190YWJsZV8ucmVoYXNoKF9fbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgoraGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46Omhhc2hfbWFwKAorICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX3RhYmxlXyhfX2hmLCBfX2VxbCwgX19hKQoreworICAgIF9fdGFibGVfLnJlaGFzaChfX24pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2hhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+OjpoYXNoX21hcCgKKyAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQoreworICAgIF9fdGFibGVfLnJlaGFzaCgxOTMpOworICAgIGluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2hhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+OjpoYXNoX21hcCgKKyAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBzaXplX3R5cGUgX19uLAorICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwpCisgICAgOiBfX3RhYmxlXyhfX2hmLCBfX2VxbCkKK3sKKyAgICBfX3RhYmxlXy5yZWhhc2goX19uKTsKKyAgICBpbnNlcnQoX19maXJzdCwgX19sYXN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CitoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6aGFzaF9tYXAoCisgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX190YWJsZV8oX19oZiwgX19lcWwsIF9fYSkKK3sKKyAgICBfX3RhYmxlXy5yZWhhc2goX19uKTsKKyAgICBpbnNlcnQoX19maXJzdCwgX19sYXN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CitoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6aGFzaF9tYXAoCisgICAgICAgIGNvbnN0IGhhc2hfbWFwJiBfX3UpCisgICAgOiBfX3RhYmxlXyhfX3UuX190YWJsZV8pCit7CisgICAgX190YWJsZV8ucmVoYXNoKF9fdS5idWNrZXRfY291bnQoKSk7CisgICAgaW5zZXJ0KF9fdS5iZWdpbigpLCBfX3UuZW5kKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3R5cGVuYW1lIGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+OjpfX25vZGVfaG9sZGVyCitoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6X19jb25zdHJ1Y3Rfbm9kZShjb25zdCBrZXlfdHlwZSYgX19rKQoreworICAgIF9fbm9kZV9hbGxvY2F0b3ImIF9fbmEgPSBfX3RhYmxlXy5fX25vZGVfYWxsb2MoKTsKKyAgICBfX25vZGVfaG9sZGVyIF9faChfX25vZGVfdHJhaXRzOjphbGxvY2F0ZShfX25hLCAxKSwgX0RwKF9fbmEpKTsKKyAgICBfX25vZGVfdHJhaXRzOjpjb25zdHJ1Y3QoX19uYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX2gtPl9fdmFsdWVfLmZpcnN0KSwgX19rKTsKKyAgICBfX2guZ2V0X2RlbGV0ZXIoKS5fX2ZpcnN0X2NvbnN0cnVjdGVkID0gdHJ1ZTsKKyAgICBfX25vZGVfdHJhaXRzOjpjb25zdHJ1Y3QoX19uYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX2gtPl9fdmFsdWVfLnNlY29uZCkpOworICAgIF9faC5nZXRfZGVsZXRlcigpLl9fc2Vjb25kX2NvbnN0cnVjdGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gX0xJQkNQUF9FWFBMSUNJVF9NT1ZFKF9faCk7ICAvLyBleHBsaWNpdGx5IG1vdmVkIGZvciBDKyswMworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2lubGluZQordm9pZAoraGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46Omluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgX190YWJsZV8uX19pbnNlcnRfdW5pcXVlKCpfX2ZpcnN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CitfVHAmCitoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6b3BlcmF0b3JbXShjb25zdCBrZXlfdHlwZSYgX19rKQoreworICAgIGl0ZXJhdG9yIF9faSA9IGZpbmQoX19rKTsKKyAgICBpZiAoX19pICE9IGVuZCgpKQorICAgICAgICByZXR1cm4gX19pLT5zZWNvbmQ7CisgICAgX19ub2RlX2hvbGRlciBfX2ggPSBfX2NvbnN0cnVjdF9ub2RlKF9fayk7CisgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gX19yID0gX190YWJsZV8uX19ub2RlX2luc2VydF91bmlxdWUoX19oLmdldCgpKTsKKyAgICBfX2gucmVsZWFzZSgpOworICAgIHJldHVybiBfX3IuZmlyc3QtPnNlY29uZDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorICAgICBoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQoreworICAgIF9feC5zd2FwKF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorYm9vbAorb3BlcmF0b3I9PShjb25zdCBoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorICAgICAgICAgICBjb25zdCBoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQoreworICAgIGlmIChfX3guc2l6ZSgpICE9IF9feS5zaXplKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICBmb3IgKGNvbnN0X2l0ZXJhdG9yIF9faSA9IF9feC5iZWdpbigpLCBfX2V4ID0gX194LmVuZCgpLCBfX2V5ID0gX195LmVuZCgpOworICAgICAgICAgICAgX19pICE9IF9fZXg7ICsrX19pKQorICAgIHsKKyAgICAgICAgY29uc3RfaXRlcmF0b3IgX19qID0gX195LmZpbmQoX19pLT5maXJzdCk7CisgICAgICAgIGlmIChfX2ogPT0gX19leSB8fCAhKCpfX2kgPT0gKl9faikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KGNvbnN0IGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194ID09IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoID0gaGFzaDxfS2V5PiwgY2xhc3MgX1ByZWQgPSBlcXVhbF90bzxfS2V5PiwKKyAgICAgICAgICBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaF9tdWx0aW1hcAoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBfS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRfdHlwZTsKKyAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV90eXBlOworICAgIHR5cGVkZWYgX0hhc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXI7CisgICAgdHlwZWRlZiBfUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9lcXVhbDsKKyAgICB0eXBlZGVmIF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgdHlwZWRlZiBwYWlyPGNvbnN0IGtleV90eXBlLCBtYXBwZWRfdHlwZT4gICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgcGFpcjxrZXlfdHlwZSwgbWFwcGVkX3R5cGU+ICAgICAgICAgICAgICAgICAgICBfX3ZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfX2hhc2hfbWFwX2hhc2hlcjxfX3ZhbHVlX3R5cGUsIGhhc2hlcj4gICBfX2hhc2hlcjsKKyAgICB0eXBlZGVmIF9faGFzaF9tYXBfZXF1YWw8X192YWx1ZV90eXBlLCBrZXlfZXF1YWw+IF9fa2V5X2VxdWFsOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYWxsb2NfaGVscGVyPGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+LCBfX3ZhbHVlX3R5cGU+Ojp0eXBlIF9fYWxsb2NhdG9yX3R5cGU7CisKKyAgICB0eXBlZGVmIF9faGFzaF90YWJsZTxfX3ZhbHVlX3R5cGUsIF9faGFzaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fa2V5X2VxdWFsLCAgX19hbGxvY2F0b3JfdHlwZT4gICBfX3RhYmxlOworCisgICAgX190YWJsZSBfX3RhYmxlXzsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6X19ub2RlX3RyYWl0cyAgICAgICAgICAgICAgICBfX25vZGVfdHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6X19ub2RlX2FsbG9jYXRvciAgICAgICAgICAgICBfX25vZGVfYWxsb2NhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6X19ub2RlICAgICAgICAgICAgICAgICAgICAgICBfX25vZGU7CisgICAgdHlwZWRlZiBfX2hhc2hfbWFwX25vZGVfZGVzdHJ1Y3RvcjxfX25vZGVfYWxsb2NhdG9yPiAgIF9EcDsKKyAgICB0eXBlZGVmIHVuaXF1ZV9wdHI8X19ub2RlLCBfRHA+ICAgICAgICAgICAgICAgICAgICAgICAgIF9fbm9kZV9ob2xkZXI7CisgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPiAgICAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnBvaW50ZXIgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OmNvbnN0X3BvaW50ZXIgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2FsbG9jX3RyYWl0czo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgIHR5cGVkZWYgX19oYXNoX21hcF9pdGVyYXRvcjx0eXBlbmFtZSBfX3RhYmxlOjppdGVyYXRvcj4gICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfX2hhc2hfbWFwX2NvbnN0X2l0ZXJhdG9yPHR5cGVuYW1lIF9fdGFibGU6OmNvbnN0X2l0ZXJhdG9yPiBjb25zdF9pdGVyYXRvcjsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBoYXNoX211bHRpbWFwKCkge19fdGFibGVfLnJlaGFzaCgxOTMpO30KKyAgICBleHBsaWNpdCBoYXNoX211bHRpbWFwKHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCkpOworICAgIGhhc2hfbXVsdGltYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyAgICBoYXNoX211bHRpbWFwKGNvbnN0IGhhc2hfbXVsdGltYXAmIF9fdSk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gYWxsb2NhdG9yX3R5cGUoX190YWJsZV8uX19ub2RlX2FsbG9jKCkpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sICAgICAgZW1wdHkoKSBjb25zdCB7cmV0dXJuIF9fdGFibGVfLnNpemUoKSA9PSAwO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCAge3JldHVybiBfX3RhYmxlXy5zaXplKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7cmV0dXJuIF9fdGFibGVfLm1heF9zaXplKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yICAgICAgIGJlZ2luKCkgICAgICAgIHtyZXR1cm4gX190YWJsZV8uYmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yICAgICAgIGVuZCgpICAgICAgICAgIHtyZXR1cm4gX190YWJsZV8uZW5kKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpICBjb25zdCB7cmV0dXJuIF9fdGFibGVfLmJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSAgICBjb25zdCB7cmV0dXJuIF9fdGFibGVfLmVuZCgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7cmV0dXJuIF9fdGFibGVfLl9faW5zZXJ0X211bHRpKF9feCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkge3JldHVybiBpbnNlcnQoX194KTt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBlcmFzZShjb25zdF9pdGVyYXRvciBfX3ApIHtfX3RhYmxlXy5lcmFzZShfX3AuX19pXyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9faykge3JldHVybiBfX3RhYmxlXy5fX2VyYXNlX211bHRpKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAge19fdGFibGVfLmVyYXNlKF9fZmlyc3QuX19pXywgX19sYXN0Ll9faV8pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBjbGVhcigpIHtfX3RhYmxlXy5jbGVhcigpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAoaGFzaF9tdWx0aW1hcCYgX191KSB7X190YWJsZV8uc3dhcChfX3UuX190YWJsZV8pO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBoYXNoZXIgaGFzaF9mdW5jdCgpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX190YWJsZV8uaGFzaF9mdW5jdGlvbigpLmhhc2hfZnVuY3Rpb24oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmtleV9lcSgpLmtleV9lcSgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciAgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2spICAgICAgIHtyZXR1cm4gX190YWJsZV8uZmluZChfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdCB7cmV0dXJuIF9fdGFibGVfLmZpbmQoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdCB7cmV0dXJuIF9fdGFibGVfLl9fY291bnRfbXVsdGkoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiAgICAgICAgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKQorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9fZXF1YWxfcmFuZ2VfbXVsdGkoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9fZXF1YWxfcmFuZ2VfbXVsdGkoX19rKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uYnVja2V0X2NvdW50KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0IHtyZXR1cm4gX190YWJsZV8ubWF4X2J1Y2tldF9jb3VudCgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX190YWJsZV8uYnVja2V0X3NpemUoX19uKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbikge19fdGFibGVfLnJlaGFzaChfX24pO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgoraGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6aGFzaF9tdWx0aW1hcCgKKyAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsKQorICAgIDogX190YWJsZV8oX19oZiwgX19lcWwpCit7CisgICAgX190YWJsZV8ucmVoYXNoKF9fbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgoraGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6aGFzaF9tdWx0aW1hcCgKKyAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX190YWJsZV8oX19oZiwgX19lcWwsIF9fYSkKK3sKKyAgICBfX3RhYmxlXy5yZWhhc2goX19uKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CitoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+OjpoYXNoX211bHRpbWFwKAorICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgX190YWJsZV8ucmVoYXNoKDE5Myk7CisgICAgaW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgoraGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6aGFzaF9tdWx0aW1hcCgKKyAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBzaXplX3R5cGUgX19uLAorICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwpCisgICAgOiBfX3RhYmxlXyhfX2hmLCBfX2VxbCkKK3sKKyAgICBfX3RhYmxlXy5yZWhhc2goX19uKTsKKyAgICBpbnNlcnQoX19maXJzdCwgX19sYXN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CitoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+OjpoYXNoX211bHRpbWFwKAorICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIHNpemVfdHlwZSBfX24sCisgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fdGFibGVfKF9faGYsIF9fZXFsLCBfX2EpCit7CisgICAgX190YWJsZV8ucmVoYXNoKF9fbik7CisgICAgaW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgoraGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6aGFzaF9tdWx0aW1hcCgKKyAgICAgICAgY29uc3QgaGFzaF9tdWx0aW1hcCYgX191KQorICAgIDogX190YWJsZV8oX191Ll9fdGFibGVfKQoreworICAgIF9fdGFibGVfLnJlaGFzaChfX3UuYnVja2V0X2NvdW50KCkpOworICAgIGluc2VydChfX3UuYmVnaW4oKSwgX191LmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CitpbmxpbmUKK3ZvaWQKK2hhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46Omluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19sYXN0KQoreworICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICBfX3RhYmxlXy5fX2luc2VydF9tdWx0aSgqX19maXJzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3N3YXAoaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorICAgICBoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCit7CisgICAgX194LnN3YXAoX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Citib29sCitvcGVyYXRvcj09KGNvbnN0IGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgY29uc3QgaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQoreworICAgIGlmIChfX3guc2l6ZSgpICE9IF9feS5zaXplKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IF9FcVJuZzsKKyAgICBmb3IgKGNvbnN0X2l0ZXJhdG9yIF9faSA9IF9feC5iZWdpbigpLCBfX2V4ID0gX194LmVuZCgpOyBfX2kgIT0gX19leDspCisgICAgeworICAgICAgICBfRXFSbmcgX194ZXEgPSBfX3guZXF1YWxfcmFuZ2UoX19pLT5maXJzdCk7CisgICAgICAgIF9FcVJuZyBfX3llcSA9IF9feS5lcXVhbF9yYW5nZShfX2ktPmZpcnN0KTsKKyAgICAgICAgaWYgKF9WU1REOjpkaXN0YW5jZShfX3hlcS5maXJzdCwgX194ZXEuc2Vjb25kKSAhPQorICAgICAgICAgICAgX1ZTVEQ6OmRpc3RhbmNlKF9feWVxLmZpcnN0LCBfX3llcS5zZWNvbmQpIHx8CisgICAgICAgICAgICAgICAgICAhX1ZTVEQ6OmlzX3Blcm11dGF0aW9uKF9feGVxLmZpcnN0LCBfX3hlcS5zZWNvbmQsIF9feWVxLmZpcnN0KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgX19pID0gX194ZXEuc2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPT0gX195KTsKK30KKworfSAvLyBfX2dudV9jeHgKKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU0hfTUFQCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZXh0L2hhc2hfc2V0IGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4dC9oYXNoX3NldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGY4MWVkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2V4dC9oYXNoX3NldApAQCAtMCwwICsxLDY2MyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBoYXNoX3NldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfSEFTSF9TRVQKKyNkZWZpbmUgX0xJQkNQUF9IQVNIX1NFVAorCisvKgorCisgICAgaGFzaF9zZXQgc3lub3BzaXMKKworbmFtZXNwYWNlIF9fZ251X2N4eAoreworCit0ZW1wbGF0ZSA8Y2xhc3MgVmFsdWUsIGNsYXNzIEhhc2ggPSBoYXNoPFZhbHVlPiwgY2xhc3MgUHJlZCA9IGVxdWFsX3RvPFZhbHVlPiwKKyAgICAgICAgICBjbGFzcyBBbGxvYyA9IGFsbG9jYXRvcjxWYWx1ZT4+CitjbGFzcyBoYXNoX3NldAoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgIHR5cGVkZWYga2V5X3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgSGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXI7CisgICAgdHlwZWRlZiBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9lcXVhbDsKKyAgICB0eXBlZGVmIEFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OnBvaW50ZXIgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OmNvbnN0X3BvaW50ZXIgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgIHR5cGVkZWYgL3Vuc3BlY2lmaWVkLyBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIC91bnNwZWNpZmllZC8gY29uc3RfaXRlcmF0b3I7CisKKyAgICBleHBsaWNpdCBoYXNoX3NldChzaXplX3R5cGUgbiA9IDE5MywgY29uc3QgaGFzaGVyJiBoZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBlcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfc2V0KElucHV0SXRlcmF0b3IgZiwgSW5wdXRJdGVyYXRvciBsLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBuID0gMTkzLCBjb25zdCBoYXNoZXImIGhmID0gaGFzaGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBlcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSA9IGFsbG9jYXRvcl90eXBlKCkpOworICAgIGhhc2hfc2V0KGNvbnN0IGhhc2hfc2V0Jik7CisgICAgfmhhc2hfc2V0KCk7CisgICAgaGFzaF9zZXQmIG9wZXJhdG9yPShjb25zdCBoYXNoX3NldCYpOworCisgICAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0OworCisgICAgYm9vbCAgICAgIGVtcHR5KCkgY29uc3Q7CisgICAgc2l6ZV90eXBlIHNpemUoKSBjb25zdDsKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdDsKKworICAgIGl0ZXJhdG9yICAgICAgIGJlZ2luKCk7CisgICAgaXRlcmF0b3IgICAgICAgZW5kKCk7CisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSAgY29uc3Q7CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICAgY29uc3Q7CisKKyAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgb2JqKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZCBpbnNlcnQoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0KTsKKworICAgIHZvaWQgZXJhc2UoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24pOworICAgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgayk7CisgICAgdm9pZCBlcmFzZShjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCk7CisgICAgdm9pZCBjbGVhcigpOworCisgICAgdm9pZCBzd2FwKGhhc2hfc2V0Jik7CisKKyAgICBoYXNoZXIgaGFzaF9mdW5jdCgpIGNvbnN0OworICAgIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdDsKKworICAgIGl0ZXJhdG9yICAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIGspOworICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworICAgIHNpemVfdHlwZSBjb3VudChjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+ICAgICAgICAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworCisgICAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0OworICAgIHNpemVfdHlwZSBtYXhfYnVja2V0X2NvdW50KCkgY29uc3Q7CisKKyAgICBzaXplX3R5cGUgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBuKSBjb25zdDsKKworICAgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBWYWx1ZSwgY2xhc3MgSGFzaCwgY2xhc3MgUHJlZCwgY2xhc3MgQWxsb2M+CisgICAgdm9pZCBzd2FwKGhhc2hfc2V0PFZhbHVlLCBIYXNoLCBQcmVkLCBBbGxvYz4mIHgsCisgICAgICAgICAgICAgIGhhc2hfc2V0PFZhbHVlLCBIYXNoLCBQcmVkLCBBbGxvYz4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVmFsdWUsIGNsYXNzIEhhc2gsIGNsYXNzIFByZWQsIGNsYXNzIEFsbG9jPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGhhc2hfc2V0PFZhbHVlLCBIYXNoLCBQcmVkLCBBbGxvYz4mIHgsCisgICAgICAgICAgICAgICBjb25zdCBoYXNoX3NldDxWYWx1ZSwgSGFzaCwgUHJlZCwgQWxsb2M+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIFZhbHVlLCBjbGFzcyBIYXNoLCBjbGFzcyBQcmVkLCBjbGFzcyBBbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBoYXNoX3NldDxWYWx1ZSwgSGFzaCwgUHJlZCwgQWxsb2M+JiB4LAorICAgICAgICAgICAgICAgY29uc3QgaGFzaF9zZXQ8VmFsdWUsIEhhc2gsIFByZWQsIEFsbG9jPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBWYWx1ZSwgY2xhc3MgSGFzaCA9IGhhc2g8VmFsdWU+LCBjbGFzcyBQcmVkID0gZXF1YWxfdG88VmFsdWU+LAorICAgICAgICAgIGNsYXNzIEFsbG9jID0gYWxsb2NhdG9yPFZhbHVlPj4KK2NsYXNzIGhhc2hfbXVsdGlzZXQKK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICB0eXBlZGVmIGtleV90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIEhhc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaGVyOworICAgIHR5cGVkZWYgUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfZXF1YWw7CisgICAgdHlwZWRlZiBBbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+Ojpwb2ludGVyICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+Ojpjb25zdF9wb2ludGVyICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+OjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICB0eXBlZGVmIC91bnNwZWNpZmllZC8gaXRlcmF0b3I7CisgICAgdHlwZWRlZiAvdW5zcGVjaWZpZWQvIGNvbnN0X2l0ZXJhdG9yOworCisgICAgZXhwbGljaXQgaGFzaF9tdWx0aXNldChzaXplX3R5cGUgbiA9IDE5MywgY29uc3QgaGFzaGVyJiBoZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBlcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGlzZXQoSW5wdXRJdGVyYXRvciBmLCBJbnB1dEl0ZXJhdG9yIGwsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIG4gPSAxOTMsIGNvbnN0IGhhc2hlciYgaGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIGVxbCA9IGtleV9lcXVhbCgpLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSk7CisgICAgaGFzaF9tdWx0aXNldChjb25zdCBoYXNoX211bHRpc2V0Jik7CisgICAgfmhhc2hfbXVsdGlzZXQoKTsKKyAgICBoYXNoX211bHRpc2V0JiBvcGVyYXRvcj0oY29uc3QgaGFzaF9tdWx0aXNldCYpOworCisgICAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0OworCisgICAgYm9vbCAgICAgIGVtcHR5KCkgY29uc3Q7CisgICAgc2l6ZV90eXBlIHNpemUoKSBjb25zdDsKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdDsKKworICAgIGl0ZXJhdG9yICAgICAgIGJlZ2luKCk7CisgICAgaXRlcmF0b3IgICAgICAgZW5kKCk7CisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSAgY29uc3Q7CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICAgY29uc3Q7CisKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgb2JqKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZCBpbnNlcnQoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0KTsKKworICAgIHZvaWQgZXJhc2UoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24pOworICAgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgayk7CisgICAgdm9pZCBlcmFzZShjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCk7CisgICAgdm9pZCBjbGVhcigpOworCisgICAgdm9pZCBzd2FwKGhhc2hfbXVsdGlzZXQmKTsKKworICAgIGhhc2hlciBoYXNoX2Z1bmN0KCkgY29uc3Q7CisgICAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0OworCisgICAgaXRlcmF0b3IgICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgayk7CisgICAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisgICAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IGtleV90eXBlJiBrKSBjb25zdDsKKyAgICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gICAgICAgICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIGspOworICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisKKyAgICBzaXplX3R5cGUgYnVja2V0X2NvdW50KCkgY29uc3Q7CisgICAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdDsKKworICAgIHNpemVfdHlwZSBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIG4pIGNvbnN0OworCisgICAgdm9pZCByZXNpemUoc2l6ZV90eXBlIG4pOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFZhbHVlLCBjbGFzcyBIYXNoLCBjbGFzcyBQcmVkLCBjbGFzcyBBbGxvYz4KKyAgICB2b2lkIHN3YXAoaGFzaF9tdWx0aXNldDxWYWx1ZSwgSGFzaCwgUHJlZCwgQWxsb2M+JiB4LAorICAgICAgICAgICAgICBoYXNoX211bHRpc2V0PFZhbHVlLCBIYXNoLCBQcmVkLCBBbGxvYz4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVmFsdWUsIGNsYXNzIEhhc2gsIGNsYXNzIFByZWQsIGNsYXNzIEFsbG9jPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGhhc2hfbXVsdGlzZXQ8VmFsdWUsIEhhc2gsIFByZWQsIEFsbG9jPiYgeCwKKyAgICAgICAgICAgICAgIGNvbnN0IGhhc2hfbXVsdGlzZXQ8VmFsdWUsIEhhc2gsIFByZWQsIEFsbG9jPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBWYWx1ZSwgY2xhc3MgSGFzaCwgY2xhc3MgUHJlZCwgY2xhc3MgQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgaGFzaF9tdWx0aXNldDxWYWx1ZSwgSGFzaCwgUHJlZCwgQWxsb2M+JiB4LAorICAgICAgICAgICAgICAgY29uc3QgaGFzaF9tdWx0aXNldDxWYWx1ZSwgSGFzaCwgUHJlZCwgQWxsb2M+JiB5KTsKK30gIC8vIF9fZ251X2N4eAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8X19oYXNoX3RhYmxlPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8ZXh0L19faGFzaD4KKworI2lmIF9fREVQUkVDQVRFRAorI2lmIGRlZmluZWQoX0xJQkNQUF9XQVJOSU5HKQorICAgIF9MSUJDUFBfV0FSTklORygiVXNlIG9mIHRoZSBoZWFkZXIgPGV4dC9oYXNoX3NldD4gaXMgZGVwcmVjYXRlZC4gIE1pZ3JhdGUgdG8gPHVub3JkZXJlZF9zZXQ+IikKKyNlbHNlCisjICAgd2FybmluZyBVc2Ugb2YgdGhlIGhlYWRlciA8ZXh0L2hhc2hfc2V0PiBpcyBkZXByZWNhdGVkLiAgTWlncmF0ZSB0byA8dW5vcmRlcmVkX3NldD4KKyNlbmRpZgorI2VuZGlmCisKK25hbWVzcGFjZSBfX2dudV9jeHggeworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCA9IGhhc2g8X1ZhbHVlPiwgY2xhc3MgX1ByZWQgPSBlcXVhbF90bzxfVmFsdWU+LAorICAgICAgICAgIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjxfVmFsdWU+ID4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc2hfc2V0Cit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIF9WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CisgICAgdHlwZWRlZiBrZXlfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfSGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlcjsKKyAgICB0eXBlZGVmIF9QcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2VxdWFsOworICAgIHR5cGVkZWYgX0FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBfX2hhc2hfdGFibGU8dmFsdWVfdHlwZSwgaGFzaGVyLCBrZXlfZXF1YWwsIGFsbG9jYXRvcl90eXBlPiBfX3RhYmxlOworCisgICAgX190YWJsZSBfX3RhYmxlXzsKKworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6cG9pbnRlciAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RhYmxlOjpjb25zdF9wb2ludGVyICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RhYmxlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RhYmxlOjpjb25zdF9pdGVyYXRvciAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6OmNvbnN0X2l0ZXJhdG9yICAgICAgIGNvbnN0X2l0ZXJhdG9yOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGhhc2hfc2V0KCkge19fdGFibGVfLnJlaGFzaCgxOTMpO30KKyAgICBleHBsaWNpdCBoYXNoX3NldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSk7CisgICAgaGFzaF9zZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9zZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworICAgIGhhc2hfc2V0KGNvbnN0IGhhc2hfc2V0JiBfX3UpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgICB7cmV0dXJuIGFsbG9jYXRvcl90eXBlKF9fdGFibGVfLl9fbm9kZV9hbGxvYygpKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCAgICAgIGVtcHR5KCkgY29uc3Qge3JldHVybiBfX3RhYmxlXy5zaXplKCkgPT0gMDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgIHtyZXR1cm4gX190YWJsZV8uc2l6ZSgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3Qge3JldHVybiBfX3RhYmxlXy5tYXhfc2l6ZSgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciAgICAgICBiZWdpbigpICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciAgICAgICBlbmQoKSAgICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmVuZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSAgY29uc3Qge3JldHVybiBfX3RhYmxlXy5iZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICAgY29uc3Qge3JldHVybiBfX3RhYmxlXy5lbmQoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgICAge3JldHVybiBfX3RhYmxlXy5fX2luc2VydF91bmlxdWUoX194KTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciwgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7cmV0dXJuIGluc2VydChfX3gpLmZpcnN0O30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdm9pZCBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcCkge19fdGFibGVfLmVyYXNlKF9fcCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9faykge3JldHVybiBfX3RhYmxlXy5fX2VyYXNlX3VuaXF1ZShfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHtfX3RhYmxlXy5lcmFzZShfX2ZpcnN0LCBfX2xhc3QpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBjbGVhcigpIHtfX3RhYmxlXy5jbGVhcigpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAoaGFzaF9zZXQmIF9fdSkge19fdGFibGVfLnN3YXAoX191Ll9fdGFibGVfKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaGFzaGVyIGhhc2hfZnVuY3QoKSBjb25zdCB7cmV0dXJuIF9fdGFibGVfLmhhc2hfZnVuY3Rpb24oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdCB7cmV0dXJuIF9fdGFibGVfLmtleV9lcSgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciAgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2spICAgICAgIHtyZXR1cm4gX190YWJsZV8uZmluZChfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdCB7cmV0dXJuIF9fdGFibGVfLmZpbmQoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdCB7cmV0dXJuIF9fdGFibGVfLl9fY291bnRfdW5pcXVlKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gICAgICAgICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICAgICAge3JldHVybiBfX3RhYmxlXy5fX2VxdWFsX3JhbmdlX3VuaXF1ZShfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX190YWJsZV8uX19lcXVhbF9yYW5nZV91bmlxdWUoX19rKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uYnVja2V0X2NvdW50KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0IHtyZXR1cm4gX190YWJsZV8ubWF4X2J1Y2tldF9jb3VudCgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX24pIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uYnVja2V0X3NpemUoX19uKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbikge19fdGFibGVfLnJlaGFzaChfX24pO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgoraGFzaF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46Omhhc2hfc2V0KHNpemVfdHlwZSBfX24sCisgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCkKKyAgICA6IF9fdGFibGVfKF9faGYsIF9fZXFsKQoreworICAgIF9fdGFibGVfLnJlaGFzaChfX24pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK2hhc2hfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+OjpoYXNoX3NldChzaXplX3R5cGUgX19uLAorICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX3RhYmxlXyhfX2hmLCBfX2VxbCwgX19hKQoreworICAgIF9fdGFibGVfLnJlaGFzaChfX24pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2hhc2hfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+OjpoYXNoX3NldCgKKyAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQoreworICAgIF9fdGFibGVfLnJlaGFzaCgxOTMpOworICAgIGluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2hhc2hfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+OjpoYXNoX3NldCgKKyAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBzaXplX3R5cGUgX19uLAorICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwpCisgICAgOiBfX3RhYmxlXyhfX2hmLCBfX2VxbCkKK3sKKyAgICBfX3RhYmxlXy5yZWhhc2goX19uKTsKKyAgICBpbnNlcnQoX19maXJzdCwgX19sYXN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CitoYXNoX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6aGFzaF9zZXQoCisgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX190YWJsZV8oX19oZiwgX19lcWwsIF9fYSkKK3sKKyAgICBfX3RhYmxlXy5yZWhhc2goX19uKTsKKyAgICBpbnNlcnQoX19maXJzdCwgX19sYXN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CitoYXNoX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6aGFzaF9zZXQoCisgICAgICAgIGNvbnN0IGhhc2hfc2V0JiBfX3UpCisgICAgOiBfX3RhYmxlXyhfX3UuX190YWJsZV8pCit7CisgICAgX190YWJsZV8ucmVoYXNoKF9fdS5idWNrZXRfY291bnQoKSk7CisgICAgaW5zZXJ0KF9fdS5iZWdpbigpLCBfX3UuZW5kKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2lubGluZQordm9pZAoraGFzaF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46Omluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgX190YWJsZV8uX19pbnNlcnRfdW5pcXVlKCpfX2ZpcnN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChoYXNoX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorICAgICBoYXNoX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQoreworICAgIF9feC5zd2FwKF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorYm9vbAorb3BlcmF0b3I9PShjb25zdCBoYXNoX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorICAgICAgICAgICBjb25zdCBoYXNoX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQoreworICAgIGlmIChfX3guc2l6ZSgpICE9IF9feS5zaXplKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICBmb3IgKGNvbnN0X2l0ZXJhdG9yIF9faSA9IF9feC5iZWdpbigpLCBfX2V4ID0gX194LmVuZCgpLCBfX2V5ID0gX195LmVuZCgpOworICAgICAgICAgICAgX19pICE9IF9fZXg7ICsrX19pKQorICAgIHsKKyAgICAgICAgY29uc3RfaXRlcmF0b3IgX19qID0gX195LmZpbmQoKl9faSk7CisgICAgICAgIGlmIChfX2ogPT0gX19leSB8fCAhKCpfX2kgPT0gKl9faikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KGNvbnN0IGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194ID09IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoID0gaGFzaDxfVmFsdWU+LCBjbGFzcyBfUHJlZCA9IGVxdWFsX3RvPF9WYWx1ZT4sCisgICAgICAgICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPF9WYWx1ZT4gPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaF9tdWx0aXNldAoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBfVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgIHR5cGVkZWYga2V5X3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0hhc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXI7CisgICAgdHlwZWRlZiBfUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9lcXVhbDsKKyAgICB0eXBlZGVmIF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgX19oYXNoX3RhYmxlPHZhbHVlX3R5cGUsIGhhc2hlciwga2V5X2VxdWFsLCBhbGxvY2F0b3JfdHlwZT4gX190YWJsZTsKKworICAgIF9fdGFibGUgX190YWJsZV87CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6OnBvaW50ZXIgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6Y29uc3RfcG9pbnRlciAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RhYmxlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RhYmxlOjpjb25zdF9pdGVyYXRvciAgICAgICBjb25zdF9pdGVyYXRvcjsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBoYXNoX211bHRpc2V0KCkge19fdGFibGVfLnJlaGFzaCgxOTMpO30KKyAgICBleHBsaWNpdCBoYXNoX211bHRpc2V0KHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCkpOworICAgIGhhc2hfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uICwgY29uc3QgaGFzaGVyJiBfX2hmLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworICAgIGhhc2hfbXVsdGlzZXQoY29uc3QgaGFzaF9tdWx0aXNldCYgX191KTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgICAge3JldHVybiBhbGxvY2F0b3JfdHlwZShfX3RhYmxlXy5fX25vZGVfYWxsb2MoKSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgICAgICBlbXB0eSgpIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uc2l6ZSgpID09IDA7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0ICB7cmV0dXJuIF9fdGFibGVfLnNpemUoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHtyZXR1cm4gX190YWJsZV8ubWF4X3NpemUoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgICAgICAgYmVnaW4oKSAgICAgICAge3JldHVybiBfX3RhYmxlXy5iZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgICAgICAgZW5kKCkgICAgICAgICAge3JldHVybiBfX3RhYmxlXy5lbmQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uYmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpICAgIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uZW5kKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHtyZXR1cm4gX190YWJsZV8uX19pbnNlcnRfbXVsdGkoX194KTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciwgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7cmV0dXJuIGluc2VydChfX3gpO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdm9pZCBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcCkge19fdGFibGVfLmVyYXNlKF9fcCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9faykge3JldHVybiBfX3RhYmxlXy5fX2VyYXNlX211bHRpKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAge19fdGFibGVfLmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGNsZWFyKCkge19fdGFibGVfLmNsZWFyKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc3dhcChoYXNoX211bHRpc2V0JiBfX3UpIHtfX3RhYmxlXy5zd2FwKF9fdS5fX3RhYmxlXyk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGhhc2hlciBoYXNoX2Z1bmN0KCkgY29uc3Qge3JldHVybiBfX3RhYmxlXy5oYXNoX2Z1bmN0aW9uKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBrZXlfZXF1YWwga2V5X2VxKCkgY29uc3Qge3JldHVybiBfX3RhYmxlXy5rZXlfZXEoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rKSAgICAgICB7cmV0dXJuIF9fdGFibGVfLmZpbmQoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Qge3JldHVybiBfX3RhYmxlXy5maW5kKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgY291bnQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Qge3JldHVybiBfX3RhYmxlXy5fX2NvdW50X211bHRpKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gICAgICAgICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICAgICAge3JldHVybiBfX3RhYmxlXy5fX2VxdWFsX3JhbmdlX211bHRpKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICAgICAge3JldHVybiBfX3RhYmxlXy5fX2VxdWFsX3JhbmdlX211bHRpKF9fayk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBidWNrZXRfY291bnQoKSBjb25zdCB7cmV0dXJuIF9fdGFibGVfLmJ1Y2tldF9jb3VudCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdCB7cmV0dXJuIF9fdGFibGVfLm1heF9idWNrZXRfY291bnQoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdCB7cmV0dXJuIF9fdGFibGVfLmJ1Y2tldF9zaXplKF9fbik7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX24pIHtfX3RhYmxlXy5yZWhhc2goX19uKTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK2hhc2hfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46Omhhc2hfbXVsdGlzZXQoCisgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCkKKyAgICA6IF9fdGFibGVfKF9faGYsIF9fZXFsKQoreworICAgIF9fdGFibGVfLnJlaGFzaChfX24pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK2hhc2hfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46Omhhc2hfbXVsdGlzZXQoCisgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fdGFibGVfKF9faGYsIF9fZXFsLCBfX2EpCit7CisgICAgX190YWJsZV8ucmVoYXNoKF9fbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgoraGFzaF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6aGFzaF9tdWx0aXNldCgKKyAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQoreworICAgIF9fdGFibGVfLnJlaGFzaCgxOTMpOworICAgIGluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2hhc2hfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46Omhhc2hfbXVsdGlzZXQoCisgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsKQorICAgIDogX190YWJsZV8oX19oZiwgX19lcWwpCit7CisgICAgX190YWJsZV8ucmVoYXNoKF9fbik7CisgICAgaW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgoraGFzaF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6aGFzaF9tdWx0aXNldCgKKyAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBzaXplX3R5cGUgX19uLAorICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX3RhYmxlXyhfX2hmLCBfX2VxbCwgX19hKQoreworICAgIF9fdGFibGVfLnJlaGFzaChfX24pOworICAgIGluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK2hhc2hfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46Omhhc2hfbXVsdGlzZXQoCisgICAgICAgIGNvbnN0IGhhc2hfbXVsdGlzZXQmIF9fdSkKKyAgICA6IF9fdGFibGVfKF9fdS5fX3RhYmxlXykKK3sKKyAgICBfX3RhYmxlXy5yZWhhc2goX191LmJ1Y2tldF9jb3VudCgpKTsKKyAgICBpbnNlcnQoX191LmJlZ2luKCksIF9fdS5lbmQoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgoraW5saW5lCit2b2lkCitoYXNoX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+OjppbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgX190YWJsZV8uX19pbnNlcnRfbXVsdGkoKl9fZmlyc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzd2FwKGhhc2hfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKyAgICAgaGFzaF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQoreworICAgIF9feC5zd2FwKF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorYm9vbAorb3BlcmF0b3I9PShjb25zdCBoYXNoX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IGhhc2hfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKK3sKKyAgICBpZiAoX194LnNpemUoKSAhPSBfX3kuc2l6ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBoYXNoX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBfRXFSbmc7CisgICAgZm9yIChjb25zdF9pdGVyYXRvciBfX2kgPSBfX3guYmVnaW4oKSwgX19leCA9IF9feC5lbmQoKTsgX19pICE9IF9fZXg7KQorICAgIHsKKyAgICAgICAgX0VxUm5nIF9feGVxID0gX194LmVxdWFsX3JhbmdlKCpfX2kpOworICAgICAgICBfRXFSbmcgX195ZXEgPSBfX3kuZXF1YWxfcmFuZ2UoKl9faSk7CisgICAgICAgIGlmIChfVlNURDo6ZGlzdGFuY2UoX194ZXEuZmlyc3QsIF9feGVxLnNlY29uZCkgIT0KKyAgICAgICAgICAgIF9WU1REOjpkaXN0YW5jZShfX3llcS5maXJzdCwgX195ZXEuc2Vjb25kKSB8fAorICAgICAgICAgICAgICAgICAgIV9WU1REOjppc19wZXJtdXRhdGlvbihfX3hlcS5maXJzdCwgX194ZXEuc2Vjb25kLCBfX3llcS5maXJzdCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIF9faSA9IF9feGVxLnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yIT0oY29uc3QgaGFzaF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorICAgICAgICAgICBjb25zdCBoYXNoX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194ID09IF9feSk7Cit9CisKK30gLy8gX19nbnVfY3h4CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNIX1NFVApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2Zsb2F0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZmxvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWNmZGM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2Zsb2F0LmgKQEAgLTAsMCArMSw4MyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZsb2F0LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9GTE9BVF9ICisjZGVmaW5lIF9MSUJDUFBfRkxPQVRfSAorCisvKgorICAgIGZsb2F0Lmggc3lub3BzaXMKKworTWFjcm9zOgorCisgICAgRkxUX1JPVU5EUworICAgIEZMVF9FVkFMX01FVEhPRCAgICAgLy8gQzk5CisgICAgRkxUX1JBRElYCisKKyAgICBGTFRfTUFOVF9ESUcKKyAgICBEQkxfTUFOVF9ESUcKKyAgICBMREJMX01BTlRfRElHCisKKyAgICBERUNJTUFMX0RJRyAgICAgICAgIC8vIEM5OQorCisgICAgRkxUX0RJRworICAgIERCTF9ESUcKKyAgICBMREJMX0RJRworCisgICAgRkxUX01JTl9FWFAKKyAgICBEQkxfTUlOX0VYUAorICAgIExEQkxfTUlOX0VYUAorCisgICAgRkxUX01JTl8xMF9FWFAKKyAgICBEQkxfTUlOXzEwX0VYUAorICAgIExEQkxfTUlOXzEwX0VYUAorCisgICAgRkxUX01BWF9FWFAKKyAgICBEQkxfTUFYX0VYUAorICAgIExEQkxfTUFYX0VYUAorCisgICAgRkxUX01BWF8xMF9FWFAKKyAgICBEQkxfTUFYXzEwX0VYUAorICAgIExEQkxfTUFYXzEwX0VYUAorCisgICAgRkxUX01BWAorICAgIERCTF9NQVgKKyAgICBMREJMX01BWAorCisgICAgRkxUX0VQU0lMT04KKyAgICBEQkxfRVBTSUxPTgorICAgIExEQkxfRVBTSUxPTgorCisgICAgRkxUX01JTgorICAgIERCTF9NSU4KKyAgICBMREJMX01JTgorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCisjaW5jbHVkZV9uZXh0IDxmbG9hdC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKKworI2lmbmRlZiBGTFRfRVZBTF9NRVRIT0QKKyNkZWZpbmUgRkxUX0VWQUxfTUVUSE9EIF9fRkxUX0VWQUxfTUVUSE9EX18KKyNlbmRpZgorCisjaWZuZGVmIERFQ0lNQUxfRElHCisjZGVmaW5lIERFQ0lNQUxfRElHIF9fREVDSU1BTF9ESUdfXworI2VuZGlmCisKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgIC8vIF9MSUJDUFBfRkxPQVRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2ZvcndhcmRfbGlzdCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9mb3J3YXJkX2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4MjA0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9mb3J3YXJkX2xpc3QKQEAgLTAsMCArMSwxNzI1IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBmb3J3YXJkX2xpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0ZPUldBUkRfTElTVAorI2RlZmluZSBfTElCQ1BQX0ZPUldBUkRfTElTVAorCisvKgorICAgIGZvcndhcmRfbGlzdCBzeW5vcHNpcworCituYW1lc3BhY2Ugc3RkCit7CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBBbGxvY2F0b3IgPSBhbGxvY2F0b3I8VD4+CitjbGFzcyBmb3J3YXJkX2xpc3QKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFQgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgQWxsb2NhdG9yIGFsbG9jYXRvcl90eXBlOworCisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OnBvaW50ZXIgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OmNvbnN0X3BvaW50ZXIgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgIHR5cGVkZWYgPGRldGFpbHM+IGl0ZXJhdG9yOworICAgIHR5cGVkZWYgPGRldGFpbHM+IGNvbnN0X2l0ZXJhdG9yOworCisgICAgZm9yd2FyZF9saXN0KCkKKyAgICAgICAgbm9leGNlcHQoaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisgICAgZXhwbGljaXQgZm9yd2FyZF9saXN0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsKKyAgICBleHBsaWNpdCBmb3J3YXJkX2xpc3Qoc2l6ZV90eXBlIG4pOworICAgIGV4cGxpY2l0IGZvcndhcmRfbGlzdChzaXplX3R5cGUgbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOyAvLyBDKysxNAorICAgIGZvcndhcmRfbGlzdChzaXplX3R5cGUgbiwgY29uc3QgdmFsdWVfdHlwZSYgdik7CisgICAgZm9yd2FyZF9saXN0KHNpemVfdHlwZSBuLCBjb25zdCB2YWx1ZV90eXBlJiB2LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIGZvcndhcmRfbGlzdChJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICBmb3J3YXJkX2xpc3QoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7CisgICAgZm9yd2FyZF9saXN0KGNvbnN0IGZvcndhcmRfbGlzdCYgeCk7CisgICAgZm9yd2FyZF9saXN0KGNvbnN0IGZvcndhcmRfbGlzdCYgeCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOworICAgIGZvcndhcmRfbGlzdChmb3J3YXJkX2xpc3QmJiB4KQorICAgICAgICBub2V4Y2VwdChpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKTsKKyAgICBmb3J3YXJkX2xpc3QoZm9yd2FyZF9saXN0JiYgeCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOworICAgIGZvcndhcmRfbGlzdChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IGlsKTsKKyAgICBmb3J3YXJkX2xpc3QoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBpbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOworCisgICAgfmZvcndhcmRfbGlzdCgpOworCisgICAgZm9yd2FyZF9saXN0JiBvcGVyYXRvcj0oY29uc3QgZm9yd2FyZF9saXN0JiB4KTsKKyAgICBmb3J3YXJkX2xpc3QmIG9wZXJhdG9yPShmb3J3YXJkX2xpc3QmJiB4KQorICAgICAgICBub2V4Y2VwdCgKKyAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ6OnZhbHVlICYmCisgICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisgICAgZm9yd2FyZF9saXN0JiBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBpbCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZCBhc3NpZ24oSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0KTsKKyAgICB2b2lkIGFzc2lnbihzaXplX3R5cGUgbiwgY29uc3QgdmFsdWVfdHlwZSYgdik7CisgICAgdm9pZCBhc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBpbCk7CisKKyAgICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICBpdGVyYXRvciAgICAgICBiZWdpbigpIG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgaXRlcmF0b3IgICAgICAgZW5kKCkgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICBjb25zdF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdDsKKyAgICBjb25zdF9pdGVyYXRvciBjZW5kKCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICBpdGVyYXRvciAgICAgICBiZWZvcmVfYmVnaW4oKSBub2V4Y2VwdDsKKyAgICBjb25zdF9pdGVyYXRvciBiZWZvcmVfYmVnaW4oKSBjb25zdCBub2V4Y2VwdDsKKyAgICBjb25zdF9pdGVyYXRvciBjYmVmb3JlX2JlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICBib29sIGVtcHR5KCkgY29uc3Qgbm9leGNlcHQ7CisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICByZWZlcmVuY2UgICAgICAgZnJvbnQoKTsKKyAgICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPiByZWZlcmVuY2UgZW1wbGFjZV9mcm9udChBcmdzJiYuLi4gYXJncyk7ICAvLyByZWZlcmVuY2UgaW4gQysrMTcKKyAgICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgdik7CisgICAgdm9pZCBwdXNoX2Zyb250KHZhbHVlX3R5cGUmJiB2KTsKKworICAgIHZvaWQgcG9wX2Zyb250KCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KKyAgICAgICAgaXRlcmF0b3IgZW1wbGFjZV9hZnRlcihjb25zdF9pdGVyYXRvciBwLCBBcmdzJiYuLi4gYXJncyk7CisgICAgaXRlcmF0b3IgaW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIHAsIGNvbnN0IHZhbHVlX3R5cGUmIHYpOworICAgIGl0ZXJhdG9yIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBwLCB2YWx1ZV90eXBlJiYgdik7CisgICAgaXRlcmF0b3IgaW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIHAsIHNpemVfdHlwZSBuLCBjb25zdCB2YWx1ZV90eXBlJiB2KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaXRlcmF0b3IgaW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QpOworICAgIGl0ZXJhdG9yIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBwLCBpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IGlsKTsKKworICAgIGl0ZXJhdG9yIGVyYXNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIHApOworICAgIGl0ZXJhdG9yIGVyYXNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIGZpcnN0LCBjb25zdF9pdGVyYXRvciBsYXN0KTsKKworICAgIHZvaWQgc3dhcChmb3J3YXJkX2xpc3QmIHgpCisgICAgICAgIG5vZXhjZXB0KGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+Ojppc19hbHdheXNfZXF1YWw6OnZhbHVlKTsgIC8vIEMrKzE3CisKKyAgICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbik7CisgICAgdm9pZCByZXNpemUoc2l6ZV90eXBlIG4sIGNvbnN0IHZhbHVlX3R5cGUmIHYpOworICAgIHZvaWQgY2xlYXIoKSBub2V4Y2VwdDsKKworICAgIHZvaWQgc3BsaWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIHAsIGZvcndhcmRfbGlzdCYgeCk7CisgICAgdm9pZCBzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgcCwgZm9yd2FyZF9saXN0JiYgeCk7CisgICAgdm9pZCBzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgcCwgZm9yd2FyZF9saXN0JiB4LCBjb25zdF9pdGVyYXRvciBpKTsKKyAgICB2b2lkIHNwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBwLCBmb3J3YXJkX2xpc3QmJiB4LCBjb25zdF9pdGVyYXRvciBpKTsKKyAgICB2b2lkIHNwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBwLCBmb3J3YXJkX2xpc3QmIHgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIGxhc3QpOworICAgIHZvaWQgc3BsaWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIHAsIGZvcndhcmRfbGlzdCYmIHgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIGxhc3QpOworICAgIHZvaWQgcmVtb3ZlKGNvbnN0IHZhbHVlX3R5cGUmIHYpOworICAgIHRlbXBsYXRlIDxjbGFzcyBQcmVkaWNhdGU+IHZvaWQgcmVtb3ZlX2lmKFByZWRpY2F0ZSBwcmVkKTsKKyAgICB2b2lkIHVuaXF1ZSgpOworICAgIHRlbXBsYXRlIDxjbGFzcyBCaW5hcnlQcmVkaWNhdGU+IHZvaWQgdW5pcXVlKEJpbmFyeVByZWRpY2F0ZSBiaW5hcnlfcHJlZCk7CisgICAgdm9pZCBtZXJnZShmb3J3YXJkX2xpc3QmIHgpOworICAgIHZvaWQgbWVyZ2UoZm9yd2FyZF9saXN0JiYgeCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIENvbXBhcmU+IHZvaWQgbWVyZ2UoZm9yd2FyZF9saXN0JiB4LCBDb21wYXJlIGNvbXApOworICAgIHRlbXBsYXRlIDxjbGFzcyBDb21wYXJlPiB2b2lkIG1lcmdlKGZvcndhcmRfbGlzdCYmIHgsIENvbXBhcmUgY29tcCk7CisgICAgdm9pZCBzb3J0KCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIENvbXBhcmU+IHZvaWQgc29ydChDb21wYXJlIGNvbXApOworICAgIHZvaWQgcmV2ZXJzZSgpIG5vZXhjZXB0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgZm9yd2FyZF9saXN0PFQsIEFsbG9jYXRvcj4mIHgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxULCBBbGxvY2F0b3I+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBib29sIG9wZXJhdG9yPCAoY29uc3QgZm9yd2FyZF9saXN0PFQsIEFsbG9jYXRvcj4mIHgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxULCBBbGxvY2F0b3I+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgZm9yd2FyZF9saXN0PFQsIEFsbG9jYXRvcj4mIHgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxULCBBbGxvY2F0b3I+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBib29sIG9wZXJhdG9yPiAoY29uc3QgZm9yd2FyZF9saXN0PFQsIEFsbG9jYXRvcj4mIHgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxULCBBbGxvY2F0b3I+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBib29sIG9wZXJhdG9yPj0oY29uc3QgZm9yd2FyZF9saXN0PFQsIEFsbG9jYXRvcj4mIHgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxULCBBbGxvY2F0b3I+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBib29sIG9wZXJhdG9yPD0oY29uc3QgZm9yd2FyZF9saXN0PFQsIEFsbG9jYXRvcj4mIHgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxULCBBbGxvY2F0b3I+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICB2b2lkIHN3YXAoZm9yd2FyZF9saXN0PFQsIEFsbG9jYXRvcj4mIHgsIGZvcndhcmRfbGlzdDxULCBBbGxvY2F0b3I+JiB5KQorICAgICAgICAgbm9leGNlcHQobm9leGNlcHQoeC5zd2FwKHkpKSk7CisKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfUFVTSF9NQUNST1MKKyNpbmNsdWRlIDxfX3VuZGVmX21hY3Jvcz4KKworCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1ZvaWRQdHI+IHN0cnVjdCBfX2ZvcndhcmRfbGlzdF9ub2RlOwordGVtcGxhdGUgPGNsYXNzIF9Ob2RlUHRyPiBzdHJ1Y3QgX19mb3J3YXJkX2JlZ2luX25vZGU7CisKKwordGVtcGxhdGUgPGNsYXNzPgorc3RydWN0IF9fZm9yd2FyZF9saXN0X25vZGVfdmFsdWVfdHlwZTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1ZvaWRQdHI+CitzdHJ1Y3QgX19mb3J3YXJkX2xpc3Rfbm9kZV92YWx1ZV90eXBlPF9fZm9yd2FyZF9saXN0X25vZGU8X1RwLCBfVm9pZFB0cj4gPiB7CisgIHR5cGVkZWYgX1RwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX05vZGVQdHI+CitzdHJ1Y3QgX19mb3J3YXJkX25vZGVfdHJhaXRzIHsKKworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9jdjwKKyAgICAgICAgdHlwZW5hbWUgcG9pbnRlcl90cmFpdHM8X05vZGVQdHI+OjplbGVtZW50X3R5cGU+Ojp0eXBlICBfX25vZGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19mb3J3YXJkX2xpc3Rfbm9kZV92YWx1ZV90eXBlPF9fbm9kZT46OnR5cGUgX19ub2RlX3ZhbHVlX3R5cGU7CisgIHR5cGVkZWYgX05vZGVQdHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlX3BvaW50ZXI7CisgIHR5cGVkZWYgX19mb3J3YXJkX2JlZ2luX25vZGU8X05vZGVQdHI+ICAgICAgICAgICAgICAgICAgICAgICAgX19iZWdpbl9ub2RlOworICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3BvaW50ZXI8X05vZGVQdHIsIF9fYmVnaW5fbm9kZT46OnR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luX25vZGVfcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9wb2ludGVyPF9Ob2RlUHRyLCB2b2lkPjo6dHlwZSAgICAgICBfX3ZvaWRfcG9pbnRlcjsKKworI2lmIGRlZmluZWQoX0xJQkNQUF9BQklfRk9SV0FSRF9MSVNUX1JFTU9WRV9OT0RFX1BPSU5URVJfVUIpCisgIHR5cGVkZWYgX19iZWdpbl9ub2RlX3BvaW50ZXIgX19pdGVyX25vZGVfcG9pbnRlcjsKKyNlbHNlCisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8CisgICAgICAgICAgaXNfcG9pbnRlcjxfX3ZvaWRfcG9pbnRlcj46OnZhbHVlLAorICAgICAgICAgIF9fYmVnaW5fbm9kZV9wb2ludGVyLAorICAgICAgICAgIF9fbm9kZV9wb2ludGVyCisgICAgPjo6dHlwZSBfX2l0ZXJfbm9kZV9wb2ludGVyOworI2VuZGlmCisKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDwKKyAgICAgICAgICBpc19zYW1lPF9faXRlcl9ub2RlX3BvaW50ZXIsIF9fbm9kZV9wb2ludGVyPjo6dmFsdWUsCisgICAgICAgICAgX19iZWdpbl9ub2RlX3BvaW50ZXIsCisgICAgICAgICAgX19ub2RlX3BvaW50ZXIKKyAgICA+Ojp0eXBlIF9fbm9uX2l0ZXJfbm9kZV9wb2ludGVyOworCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgc3RhdGljIF9faXRlcl9ub2RlX3BvaW50ZXIgX19hc19pdGVyX25vZGUoX19pdGVyX25vZGVfcG9pbnRlciBfX3ApIHsKKyAgICAgIHJldHVybiBfX3A7CisgIH0KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgX19pdGVyX25vZGVfcG9pbnRlciBfX2FzX2l0ZXJfbm9kZShfX25vbl9pdGVyX25vZGVfcG9pbnRlciBfX3ApIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxfX2l0ZXJfbm9kZV9wb2ludGVyPihzdGF0aWNfY2FzdDxfX3ZvaWRfcG9pbnRlcj4oX19wKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfTm9kZVB0cj4KK3N0cnVjdCBfX2ZvcndhcmRfYmVnaW5fbm9kZQoreworICAgIHR5cGVkZWYgX05vZGVQdHIgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3BvaW50ZXI8X05vZGVQdHIsIF9fZm9yd2FyZF9iZWdpbl9ub2RlPjo6dHlwZSBfX2JlZ2luX25vZGVfcG9pbnRlcjsKKworICAgIHBvaW50ZXIgX19uZXh0XzsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX19mb3J3YXJkX2JlZ2luX25vZGUoKSA6IF9fbmV4dF8obnVsbHB0cikge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2JlZ2luX25vZGVfcG9pbnRlciBfX25leHRfYXNfYmVnaW4oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxfX2JlZ2luX25vZGVfcG9pbnRlcj4oX19uZXh0Xyk7CisgICAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1ZvaWRQdHI+CitzdHJ1Y3QgX0xJQkNQUF9ISURERU4gX19iZWdpbl9ub2RlX29mCit7CisgICAgdHlwZWRlZiBfX2ZvcndhcmRfYmVnaW5fbm9kZTwKKyAgICAgICAgdHlwZW5hbWUgX19yZWJpbmRfcG9pbnRlcjxfVm9pZFB0ciwgX19mb3J3YXJkX2xpc3Rfbm9kZTxfVHAsIF9Wb2lkUHRyPiA+Ojp0eXBlCisgICAgPiB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1ZvaWRQdHI+CitzdHJ1Y3QgX19mb3J3YXJkX2xpc3Rfbm9kZQorICAgIDogcHVibGljIF9fYmVnaW5fbm9kZV9vZjxfVHAsIF9Wb2lkUHRyPjo6dHlwZQoreworICAgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisKKyAgICB2YWx1ZV90eXBlIF9fdmFsdWVfOworfTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X1RwPiA+IGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGZvcndhcmRfbGlzdDsKK3RlbXBsYXRlPGNsYXNzIF9Ob2RlQ29uc3RQdHI+IGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9fZm9yd2FyZF9saXN0X2NvbnN0X2l0ZXJhdG9yOworCit0ZW1wbGF0ZSA8Y2xhc3MgX05vZGVQdHI+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2ZvcndhcmRfbGlzdF9pdGVyYXRvcgoreworICAgIHR5cGVkZWYgX19mb3J3YXJkX25vZGVfdHJhaXRzPF9Ob2RlUHRyPiAgICAgICAgIF9fdHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHM6Ol9fbm9kZV9wb2ludGVyICAgICAgIF9fbm9kZV9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHM6Ol9fYmVnaW5fbm9kZV9wb2ludGVyIF9fYmVnaW5fbm9kZV9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHM6Ol9faXRlcl9ub2RlX3BvaW50ZXIgIF9faXRlcl9ub2RlX3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0czo6X192b2lkX3BvaW50ZXIgICAgICAgX192b2lkX3BvaW50ZXI7CisKKyAgICBfX2l0ZXJfbm9kZV9wb2ludGVyIF9fcHRyXzsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2JlZ2luX25vZGVfcG9pbnRlciBfX2dldF9iZWdpbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9fYmVnaW5fbm9kZV9wb2ludGVyPigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX3ZvaWRfcG9pbnRlcj4oX19wdHJfKSk7CisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX25vZGVfcG9pbnRlciBfX2dldF91bnNhZmVfbm9kZV9wb2ludGVyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fdm9pZF9wb2ludGVyPihfX3B0cl8pKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19mb3J3YXJkX2xpc3RfaXRlcmF0b3IobnVsbHB0cl90KSBfTk9FWENFUFQgOiBfX3B0cl8obnVsbHB0cikge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2ZvcndhcmRfbGlzdF9pdGVyYXRvcihfX2JlZ2luX25vZGVfcG9pbnRlciBfX3ApIF9OT0VYQ0VQVAorICAgICAgICA6IF9fcHRyXyhfX3RyYWl0czo6X19hc19pdGVyX25vZGUoX19wKSkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2ZvcndhcmRfbGlzdF9pdGVyYXRvcihfX25vZGVfcG9pbnRlciBfX3ApIF9OT0VYQ0VQVAorICAgICAgICA6IF9fcHRyXyhfX3RyYWl0czo6X19hc19pdGVyX25vZGUoX19wKSkge30KKworICAgIHRlbXBsYXRlPGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGZvcndhcmRfbGlzdDsKKyAgICB0ZW1wbGF0ZTxjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9fZm9yd2FyZF9saXN0X2NvbnN0X2l0ZXJhdG9yOworCitwdWJsaWM6CisgICAgdHlwZWRlZiBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHM6Ol9fbm9kZV92YWx1ZV90eXBlICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBwb2ludGVyX3RyYWl0czxfX25vZGVfcG9pbnRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9wb2ludGVyPF9fbm9kZV9wb2ludGVyLCB2YWx1ZV90eXBlPjo6dHlwZSBwb2ludGVyOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fZm9yd2FyZF9saXN0X2l0ZXJhdG9yKCkgX05PRVhDRVBUIDogX19wdHJfKG51bGxwdHIpIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHtyZXR1cm4gX19nZXRfdW5zYWZlX25vZGVfcG9pbnRlcigpLT5fX3ZhbHVlXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHBvaW50ZXJfdHJhaXRzPHBvaW50ZXI+Ojpwb2ludGVyX3RvKF9fZ2V0X3Vuc2FmZV9ub2RlX3BvaW50ZXIoKS0+X192YWx1ZV8pOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2ZvcndhcmRfbGlzdF9pdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgeworICAgICAgICBfX3B0cl8gPSBfX3RyYWl0czo6X19hc19pdGVyX25vZGUoX19wdHJfLT5fX25leHRfKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19mb3J3YXJkX2xpc3RfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpCisgICAgeworICAgICAgICBfX2ZvcndhcmRfbGlzdF9pdGVyYXRvciBfX3QoKnRoaXMpOworICAgICAgICArKygqdGhpcyk7CisgICAgICAgIHJldHVybiBfX3Q7CisgICAgfQorCisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgX19mb3J3YXJkX2xpc3RfaXRlcmF0b3ImIF9feCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mb3J3YXJkX2xpc3RfaXRlcmF0b3ImIF9feSkKKyAgICAgICAge3JldHVybiBfX3guX19wdHJfID09IF9feS5fX3B0cl87fQorICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF9fZm9yd2FyZF9saXN0X2l0ZXJhdG9yJiBfX3gsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZm9yd2FyZF9saXN0X2l0ZXJhdG9yJiBfX3kpCisgICAgICAgIHtyZXR1cm4gIShfX3ggPT0gX195KTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX05vZGVDb25zdFB0cj4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9fZm9yd2FyZF9saXN0X2NvbnN0X2l0ZXJhdG9yCit7CisgICAgc3RhdGljX2Fzc2VydCgoIWlzX2NvbnN0PHR5cGVuYW1lIHBvaW50ZXJfdHJhaXRzPF9Ob2RlQ29uc3RQdHI+OjplbGVtZW50X3R5cGU+Ojp2YWx1ZSksICIiKTsKKyAgICB0eXBlZGVmIF9Ob2RlQ29uc3RQdHIgX05vZGVQdHI7CisKKyAgICB0eXBlZGVmIF9fZm9yd2FyZF9ub2RlX3RyYWl0czxfTm9kZVB0cj4gICAgICAgICBfX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzOjpfX25vZGUgICAgICAgICAgICAgICBfX25vZGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0czo6X19ub2RlX3BvaW50ZXIgICAgICAgX19ub2RlX3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0czo6X19iZWdpbl9ub2RlX3BvaW50ZXIgX19iZWdpbl9ub2RlX3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0czo6X19pdGVyX25vZGVfcG9pbnRlciAgX19pdGVyX25vZGVfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzOjpfX3ZvaWRfcG9pbnRlciAgICAgICBfX3ZvaWRfcG9pbnRlcjsKKworICAgIF9faXRlcl9ub2RlX3BvaW50ZXIgX19wdHJfOworCisgICAgX19iZWdpbl9ub2RlX3BvaW50ZXIgX19nZXRfYmVnaW4oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxfX2JlZ2luX25vZGVfcG9pbnRlcj4oCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X192b2lkX3BvaW50ZXI+KF9fcHRyXykpOworICAgIH0KKyAgICBfX25vZGVfcG9pbnRlciBfX2dldF91bnNhZmVfbm9kZV9wb2ludGVyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X19ub2RlX3BvaW50ZXI+KAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fdm9pZF9wb2ludGVyPihfX3B0cl8pKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19mb3J3YXJkX2xpc3RfY29uc3RfaXRlcmF0b3IobnVsbHB0cl90KSBfTk9FWENFUFQKKyAgICAgICAgOiBfX3B0cl8obnVsbHB0cikge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2ZvcndhcmRfbGlzdF9jb25zdF9pdGVyYXRvcihfX2JlZ2luX25vZGVfcG9pbnRlciBfX3ApIF9OT0VYQ0VQVAorICAgICAgICA6IF9fcHRyXyhfX3RyYWl0czo6X19hc19pdGVyX25vZGUoX19wKSkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2ZvcndhcmRfbGlzdF9jb25zdF9pdGVyYXRvcihfX25vZGVfcG9pbnRlciBfX3ApIF9OT0VYQ0VQVAorICAgICAgICA6IF9fcHRyXyhfX3RyYWl0czo6X19hc19pdGVyX25vZGUoX19wKSkge30KKworCisgICAgdGVtcGxhdGU8Y2xhc3MsIGNsYXNzPiBmcmllbmQgY2xhc3MgZm9yd2FyZF9saXN0OworCitwdWJsaWM6CisgICAgdHlwZWRlZiBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHM6Ol9fbm9kZV92YWx1ZV90eXBlICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBwb2ludGVyX3RyYWl0czxfX25vZGVfcG9pbnRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9wb2ludGVyPF9fbm9kZV9wb2ludGVyLCBjb25zdCB2YWx1ZV90eXBlPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fZm9yd2FyZF9saXN0X2NvbnN0X2l0ZXJhdG9yKCkgX05PRVhDRVBUIDogX19wdHJfKG51bGxwdHIpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fZm9yd2FyZF9saXN0X2NvbnN0X2l0ZXJhdG9yKF9fZm9yd2FyZF9saXN0X2l0ZXJhdG9yPF9fbm9kZV9wb2ludGVyPiBfX3ApIF9OT0VYQ0VQVAorICAgICAgICA6IF9fcHRyXyhfX3AuX19wdHJfKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7cmV0dXJuIF9fZ2V0X3Vuc2FmZV9ub2RlX3BvaW50ZXIoKS0+X192YWx1ZV87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7cmV0dXJuIHBvaW50ZXJfdHJhaXRzPHBvaW50ZXI+Ojpwb2ludGVyX3RvKAorICAgICAgICAgICAgICAgIF9fZ2V0X3Vuc2FmZV9ub2RlX3BvaW50ZXIoKS0+X192YWx1ZV8pO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2ZvcndhcmRfbGlzdF9jb25zdF9pdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgeworICAgICAgICBfX3B0cl8gPSBfX3RyYWl0czo6X19hc19pdGVyX25vZGUoX19wdHJfLT5fX25leHRfKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19mb3J3YXJkX2xpc3RfY29uc3RfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpCisgICAgeworICAgICAgICBfX2ZvcndhcmRfbGlzdF9jb25zdF9pdGVyYXRvciBfX3QoKnRoaXMpOworICAgICAgICArKygqdGhpcyk7CisgICAgICAgIHJldHVybiBfX3Q7CisgICAgfQorCisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgX19mb3J3YXJkX2xpc3RfY29uc3RfaXRlcmF0b3ImIF9feCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgX19mb3J3YXJkX2xpc3RfY29uc3RfaXRlcmF0b3ImIF9feSkKKyAgICAgICAge3JldHVybiBfX3guX19wdHJfID09IF9feS5fX3B0cl87fQorICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF9fZm9yd2FyZF9saXN0X2NvbnN0X2l0ZXJhdG9yJiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2ZvcndhcmRfbGlzdF9jb25zdF9pdGVyYXRvciYgX195KQorICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorY2xhc3MgX19mb3J3YXJkX2xpc3RfYmFzZQoreworcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgX1RwICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQWxsb2MgYWxsb2NhdG9yX3R5cGU7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+Ojp2b2lkX3BvaW50ZXIgIHZvaWRfcG9pbnRlcjsKKyAgICB0eXBlZGVmIF9fZm9yd2FyZF9saXN0X25vZGU8dmFsdWVfdHlwZSwgdm9pZF9wb2ludGVyPiAgICAgICAgICAgIF9fbm9kZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYmVnaW5fbm9kZV9vZjx2YWx1ZV90eXBlLCB2b2lkX3BvaW50ZXI+Ojp0eXBlIF9fYmVnaW5fbm9kZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2FsbG9jX2hlbHBlcjxhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPiwgX19ub2RlPjo6dHlwZSBfX25vZGVfYWxsb2NhdG9yOworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfX25vZGVfYWxsb2NhdG9yPiAgICAgICAgX19ub2RlX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbm9kZV90cmFpdHM6OnBvaW50ZXIgICAgICAgICAgIF9fbm9kZV9wb2ludGVyOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9hbGxvY19oZWxwZXI8CisgICAgICAgIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+LCBfX2JlZ2luX25vZGUKKyAgICA+Ojp0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmVnaW5fbm9kZV9hbGxvY2F0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPF9fYmVnaW5fbm9kZV9hbGxvY2F0b3I+Ojpwb2ludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luX25vZGVfcG9pbnRlcjsKKworICAgIF9fY29tcHJlc3NlZF9wYWlyPF9fYmVnaW5fbm9kZSwgX19ub2RlX2FsbG9jYXRvcj4gX19iZWZvcmVfYmVnaW5fOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fYmVnaW5fbm9kZV9wb2ludGVyICAgICAgICBfX2JlZm9yZV9iZWdpbigpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIHBvaW50ZXJfdHJhaXRzPF9fYmVnaW5fbm9kZV9wb2ludGVyPjo6cG9pbnRlcl90byhfX2JlZm9yZV9iZWdpbl8uZmlyc3QoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2JlZ2luX25vZGVfcG9pbnRlciBfX2JlZm9yZV9iZWdpbigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIHBvaW50ZXJfdHJhaXRzPF9fYmVnaW5fbm9kZV9wb2ludGVyPjo6cG9pbnRlcl90byhjb25zdF9jYXN0PF9fYmVnaW5fbm9kZSY+KF9fYmVmb3JlX2JlZ2luXy5maXJzdCgpKSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgIF9fbm9kZV9hbGxvY2F0b3ImIF9fYWxsb2MoKSBfTk9FWENFUFQKKyAgICAgICAgICAgIHtyZXR1cm4gX19iZWZvcmVfYmVnaW5fLnNlY29uZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgX19ub2RlX2FsbG9jYXRvciYgX19hbGxvYygpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fYmVmb3JlX2JlZ2luXy5zZWNvbmQoKTt9CisKKyAgICB0eXBlZGVmIF9fZm9yd2FyZF9saXN0X2l0ZXJhdG9yPF9fbm9kZV9wb2ludGVyPiAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9fZm9yd2FyZF9saXN0X2NvbnN0X2l0ZXJhdG9yPF9fbm9kZV9wb2ludGVyPiAgICAgICBjb25zdF9pdGVyYXRvcjsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2ZvcndhcmRfbGlzdF9iYXNlKCkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxfX25vZGVfYWxsb2NhdG9yPjo6dmFsdWUpCisgICAgICAgIDogX19iZWZvcmVfYmVnaW5fKF9fYmVnaW5fbm9kZSgpKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2ZvcndhcmRfbGlzdF9iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICAgIDogX19iZWZvcmVfYmVnaW5fKF9fYmVnaW5fbm9kZSgpLCBfX25vZGVfYWxsb2NhdG9yKF9fYSkpIHt9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fZm9yd2FyZF9saXN0X2Jhc2UoX19mb3J3YXJkX2xpc3RfYmFzZSYmIF9feCkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxfX25vZGVfYWxsb2NhdG9yPjo6dmFsdWUpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2ZvcndhcmRfbGlzdF9iYXNlKF9fZm9yd2FyZF9saXN0X2Jhc2UmJiBfX3gsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworcHJpdmF0ZToKKyAgICBfX2ZvcndhcmRfbGlzdF9iYXNlKGNvbnN0IF9fZm9yd2FyZF9saXN0X2Jhc2UmKTsKKyAgICBfX2ZvcndhcmRfbGlzdF9iYXNlJiBvcGVyYXRvcj0oY29uc3QgX19mb3J3YXJkX2xpc3RfYmFzZSYpOworCitwdWJsaWM6CisgICAgfl9fZm9yd2FyZF9saXN0X2Jhc2UoKTsKKworcHJvdGVjdGVkOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fY29weV9hc3NpZ25fYWxsb2MoY29uc3QgX19mb3J3YXJkX2xpc3RfYmFzZSYgX194KQorICAgICAgICB7X19jb3B5X2Fzc2lnbl9hbGxvYyhfX3gsIGludGVncmFsX2NvbnN0YW50PGJvb2wsCisgICAgICAgICAgICAgIF9fbm9kZV90cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfY29weV9hc3NpZ25tZW50Ojp2YWx1ZT4oKSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19tb3ZlX2Fzc2lnbl9hbGxvYyhfX2ZvcndhcmRfbGlzdF9iYXNlJiBfX3gpCisgICAgICAgIF9OT0VYQ0VQVF8oIV9fbm9kZV90cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPF9fbm9kZV9hbGxvY2F0b3I+Ojp2YWx1ZSkKKyAgICAgICAge19fbW92ZV9hc3NpZ25fYWxsb2MoX194LCBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgICAgICBfX25vZGVfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWU+KCkpO30KKworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAoX19mb3J3YXJkX2xpc3RfYmFzZSYgX194KQorI2lmIF9MSUJDUFBfU1REX1ZFUiA+PSAxNAorICAgICAgICBfTk9FWENFUFQ7CisjZWxzZQorICAgICAgICBfTk9FWENFUFRfKCFfX25vZGVfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWUgfHwgCisgICAgICAgICAgICAgICAgICAgIF9faXNfbm90aHJvd19zd2FwcGFibGU8X19ub2RlX2FsbG9jYXRvcj46OnZhbHVlKTsKKyNlbmRpZgorcHJvdGVjdGVkOgorICAgIHZvaWQgY2xlYXIoKSBfTk9FWENFUFQ7CisKK3ByaXZhdGU6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19jb3B5X2Fzc2lnbl9hbGxvYyhjb25zdCBfX2ZvcndhcmRfbGlzdF9iYXNlJiwgZmFsc2VfdHlwZSkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX2NvcHlfYXNzaWduX2FsbG9jKGNvbnN0IF9fZm9yd2FyZF9saXN0X2Jhc2UmIF9feCwgdHJ1ZV90eXBlKQorICAgIHsKKyAgICAgICAgaWYgKF9fYWxsb2MoKSAhPSBfX3guX19hbGxvYygpKQorICAgICAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgX19hbGxvYygpID0gX194Ll9fYWxsb2MoKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX21vdmVfYXNzaWduX2FsbG9jKF9fZm9yd2FyZF9saXN0X2Jhc2UmLCBmYWxzZV90eXBlKSBfTk9FWENFUFQKKyAgICAgICAge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX21vdmVfYXNzaWduX2FsbG9jKF9fZm9yd2FyZF9saXN0X2Jhc2UmIF9feCwgdHJ1ZV90eXBlKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPF9fbm9kZV9hbGxvY2F0b3I+Ojp2YWx1ZSkKKyAgICAgICAge19fYWxsb2MoKSA9IF9WU1REOjptb3ZlKF9feC5fX2FsbG9jKCkpO30KK307CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2lubGluZQorX19mb3J3YXJkX2xpc3RfYmFzZTxfVHAsIF9BbGxvYz46Ol9fZm9yd2FyZF9saXN0X2Jhc2UoX19mb3J3YXJkX2xpc3RfYmFzZSYmIF9feCkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxfX25vZGVfYWxsb2NhdG9yPjo6dmFsdWUpCisgICAgOiBfX2JlZm9yZV9iZWdpbl8oX1ZTVEQ6Om1vdmUoX194Ll9fYmVmb3JlX2JlZ2luXykpCit7CisgICAgX194Ll9fYmVmb3JlX2JlZ2luKCktPl9fbmV4dF8gPSBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUKK19fZm9yd2FyZF9saXN0X2Jhc2U8X1RwLCBfQWxsb2M+OjpfX2ZvcndhcmRfbGlzdF9iYXNlKF9fZm9yd2FyZF9saXN0X2Jhc2UmJiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX19iZWZvcmVfYmVnaW5fKF9fYmVnaW5fbm9kZSgpLCBfX25vZGVfYWxsb2NhdG9yKF9fYSkpCit7CisgICAgaWYgKF9fYWxsb2MoKSA9PSBfX3guX19hbGxvYygpKQorICAgIHsKKyAgICAgICAgX19iZWZvcmVfYmVnaW4oKS0+X19uZXh0XyA9IF9feC5fX2JlZm9yZV9iZWdpbigpLT5fX25leHRfOworICAgICAgICBfX3guX19iZWZvcmVfYmVnaW4oKS0+X19uZXh0XyA9IG51bGxwdHI7CisgICAgfQorfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitfX2ZvcndhcmRfbGlzdF9iYXNlPF9UcCwgX0FsbG9jPjo6fl9fZm9yd2FyZF9saXN0X2Jhc2UoKQoreworICAgIGNsZWFyKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2lubGluZQordm9pZAorX19mb3J3YXJkX2xpc3RfYmFzZTxfVHAsIF9BbGxvYz46OnN3YXAoX19mb3J3YXJkX2xpc3RfYmFzZSYgX194KQorI2lmIF9MSUJDUFBfU1REX1ZFUiA+PSAxNAorICAgICAgICBfTk9FWENFUFQKKyNlbHNlCisgICAgICAgIF9OT0VYQ0VQVF8oIV9fbm9kZV90cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZSB8fCAKKyAgICAgICAgICAgICAgICAgICAgX19pc19ub3Rocm93X3N3YXBwYWJsZTxfX25vZGVfYWxsb2NhdG9yPjo6dmFsdWUpCisjZW5kaWYKK3sKKyAgICBfX3N3YXBfYWxsb2NhdG9yKF9fYWxsb2MoKSwgX194Ll9fYWxsb2MoKSwgCisgICAgICAgICAgICBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX25vZGVfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXA6OnZhbHVlPigpKTsKKyAgICB1c2luZyBfVlNURDo6c3dhcDsKKyAgICBzd2FwKF9fYmVmb3JlX2JlZ2luKCktPl9fbmV4dF8sIF9feC5fX2JlZm9yZV9iZWdpbigpLT5fX25leHRfKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZAorX19mb3J3YXJkX2xpc3RfYmFzZTxfVHAsIF9BbGxvYz46OmNsZWFyKCkgX05PRVhDRVBUCit7CisgICAgX19ub2RlX2FsbG9jYXRvciYgX19hID0gX19hbGxvYygpOworICAgIGZvciAoX19ub2RlX3BvaW50ZXIgX19wID0gX19iZWZvcmVfYmVnaW4oKS0+X19uZXh0XzsgX19wICE9IG51bGxwdHI7KQorICAgIHsKKyAgICAgICAgX19ub2RlX3BvaW50ZXIgX19uZXh0ID0gX19wLT5fX25leHRfOworICAgICAgICBfX25vZGVfdHJhaXRzOjpkZXN0cm95KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX3AtPl9fdmFsdWVfKSk7CisgICAgICAgIF9fbm9kZV90cmFpdHM6OmRlYWxsb2NhdGUoX19hLCBfX3AsIDEpOworICAgICAgICBfX3AgPSBfX25leHQ7CisgICAgfQorICAgIF9fYmVmb3JlX2JlZ2luKCktPl9fbmV4dF8gPSBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgLyo9IGFsbG9jYXRvcjxfVHA+Ki8+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBmb3J3YXJkX2xpc3QKKyAgICA6IHByaXZhdGUgX19mb3J3YXJkX2xpc3RfYmFzZTxfVHAsIF9BbGxvYz4KK3sKKyAgICB0eXBlZGVmIF9fZm9yd2FyZF9saXN0X2Jhc2U8X1RwLCBfQWxsb2M+IGJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlOjpfX25vZGVfYWxsb2NhdG9yICBfX25vZGVfYWxsb2NhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZTo6X19ub2RlICAgICAgICAgICAgICAgX19ub2RlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZTo6X19ub2RlX3RyYWl0cyAgICAgICAgX19ub2RlX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2U6Ol9fbm9kZV9wb2ludGVyICAgICAgIF9fbm9kZV9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZTo6X19iZWdpbl9ub2RlX3BvaW50ZXIgX19iZWdpbl9ub2RlX3BvaW50ZXI7CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9UcCAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0FsbG9jIGFsbG9jYXRvcl90eXBlOworCisgICAgc3RhdGljX2Fzc2VydCgoaXNfc2FtZTx0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6dmFsdWVfdHlwZSwgdmFsdWVfdHlwZT46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICJBbGxvY2F0b3I6OnZhbHVlX3R5cGUgbXVzdCBiZSBzYW1lIHR5cGUgYXMgdmFsdWVfdHlwZSIpOworCisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OnBvaW50ZXIgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OmNvbnN0X3BvaW50ZXIgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZTo6aXRlcmF0b3IgICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBmb3J3YXJkX2xpc3QoKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9fbm9kZV9hbGxvY2F0b3I+Ojp2YWx1ZSkKKyAgICAgICAge30gLy8gPSBkZWZhdWx0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBmb3J3YXJkX2xpc3QoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgZXhwbGljaXQgZm9yd2FyZF9saXN0KHNpemVfdHlwZSBfX24pOworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisgICAgZXhwbGljaXQgZm9yd2FyZF9saXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworI2VuZGlmCisgICAgZm9yd2FyZF9saXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdik7CisgICAgZm9yd2FyZF9saXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBmb3J3YXJkX2xpc3QoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgICAgICAgICAgICAgICAgICAgIF9faXNfaW5wdXRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSogPSBudWxscHRyKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGZvcndhcmRfbGlzdChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EsCisgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgICAgICAgICAgICAgICAgICAgIF9faXNfaW5wdXRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSogPSBudWxscHRyKTsKKyAgICBmb3J3YXJkX2xpc3QoY29uc3QgZm9yd2FyZF9saXN0JiBfX3gpOworICAgIGZvcndhcmRfbGlzdChjb25zdCBmb3J3YXJkX2xpc3QmIF9feCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisKKyAgICBmb3J3YXJkX2xpc3QmIG9wZXJhdG9yPShjb25zdCBmb3J3YXJkX2xpc3QmIF9feCk7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGZvcndhcmRfbGlzdChmb3J3YXJkX2xpc3QmJiBfX3gpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8YmFzZT46OnZhbHVlKQorICAgICAgICA6IGJhc2UoX1ZTVEQ6Om1vdmUoX194KSkge30KKyAgICBmb3J3YXJkX2xpc3QoZm9yd2FyZF9saXN0JiYgX194LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKworICAgIGZvcndhcmRfbGlzdChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpOworICAgIGZvcndhcmRfbGlzdChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGZvcndhcmRfbGlzdCYgb3BlcmF0b3I9KGZvcndhcmRfbGlzdCYmIF9feCkKKyAgICAgICAgX05PRVhDRVBUXygKKyAgICAgICAgICAgICBfX25vZGVfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWUgJiYKKyAgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBmb3J3YXJkX2xpc3QmIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCk7CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgLy8gfmZvcndhcmRfbGlzdCgpID0gZGVmYXVsdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIF9faXNfaW5wdXRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICAgICAgICAgIHZvaWQKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpOworICAgIHZvaWQgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdik7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGFsbG9jYXRvcl90eXBlKGJhc2U6Ol9fYWxsb2MoKSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yICAgICAgIGJlZ2luKCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gICAgICAgaXRlcmF0b3IoYmFzZTo6X19iZWZvcmVfYmVnaW4oKS0+X19uZXh0Xyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGNvbnN0X2l0ZXJhdG9yKGJhc2U6Ol9fYmVmb3JlX2JlZ2luKCktPl9fbmV4dF8pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgICAgICAgZW5kKCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gICAgICAgaXRlcmF0b3IobnVsbHB0cik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBjb25zdF9pdGVyYXRvcihudWxscHRyKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfaXRlcmF0b3IoYmFzZTo6X19iZWZvcmVfYmVnaW4oKS0+X19uZXh0Xyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBjZW5kKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfaXRlcmF0b3IobnVsbHB0cik7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yICAgICAgIGJlZm9yZV9iZWdpbigpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuICAgICAgIGl0ZXJhdG9yKGJhc2U6Ol9fYmVmb3JlX2JlZ2luKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgYmVmb3JlX2JlZ2luKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfaXRlcmF0b3IoYmFzZTo6X19iZWZvcmVfYmVnaW4oKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBjYmVmb3JlX2JlZ2luKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfaXRlcmF0b3IoYmFzZTo6X19iZWZvcmVfYmVnaW4oKSk7fQorCisgICAgX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgZW1wdHkoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBiYXNlOjpfX2JlZm9yZV9iZWdpbigpLT5fX25leHRfID09IG51bGxwdHI7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBfTk9FWENFUFQgeworICAgICAgICByZXR1cm4gc3RkOjptaW48c2l6ZV90eXBlPigKKyAgICAgICAgICAgIF9fbm9kZV90cmFpdHM6Om1heF9zaXplKGJhc2U6Ol9fYWxsb2MoKSksCisgICAgICAgICAgICBudW1lcmljX2xpbWl0czxkaWZmZXJlbmNlX3R5cGU+OjptYXgoKSk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlZmVyZW5jZSAgICAgICBmcm9udCgpICAgICAgIHtyZXR1cm4gYmFzZTo6X19iZWZvcmVfYmVnaW4oKS0+X19uZXh0Xy0+X192YWx1ZV87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7cmV0dXJuIGJhc2U6Ol9fYmVmb3JlX2JlZ2luKCktPl9fbmV4dF8tPl9fdmFsdWVfO30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAorICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4gcmVmZXJlbmNlIGVtcGxhY2VfZnJvbnQoX0FyZ3MmJi4uLiBfX2FyZ3MpOworI2Vsc2UKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+IHZvaWQgICAgICBlbXBsYWNlX2Zyb250KF9BcmdzJiYuLi4gX19hcmdzKTsKKyNlbmRpZgorICAgIHZvaWQgcHVzaF9mcm9udCh2YWx1ZV90eXBlJiYgX192KTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdm9pZCBwdXNoX2Zyb250KGNvbnN0IHZhbHVlX3R5cGUmIF9fdik7CisKKyAgICB2b2lkIHBvcF9mcm9udCgpOworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IgZW1wbGFjZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKTsKKworICAgIGl0ZXJhdG9yIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3AsIHZhbHVlX3R5cGUmJiBfX3YpOworICAgIGl0ZXJhdG9yIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3AsIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkKKyAgICAgICAge3JldHVybiBpbnNlcnRfYWZ0ZXIoX19wLCBfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpO30KKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisgICAgaXRlcmF0b3IgaW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcCwgY29uc3QgdmFsdWVfdHlwZSYgX192KTsKKyAgICBpdGVyYXRvciBpbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgX19pc19pbnB1dF9pdGVyYXRvcjxfSW5wdXRJdGVyYXRvcj46OnZhbHVlLAorICAgICAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBpbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wLCBfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCk7CisKKyAgICBpdGVyYXRvciBlcmFzZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3ApOworICAgIGl0ZXJhdG9yIGVyYXNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAoZm9yd2FyZF9saXN0JiBfX3gpCisjaWYgX0xJQkNQUF9TVERfVkVSID49IDE0CisgICAgICAgIF9OT0VYQ0VQVAorI2Vsc2UKKyAgICAgICAgX05PRVhDRVBUXyghX19ub2RlX3RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwOjp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgIF9faXNfbm90aHJvd19zd2FwcGFibGU8X19ub2RlX2FsbG9jYXRvcj46OnZhbHVlKQorI2VuZGlmCisgICAgICAgIHtiYXNlOjpzd2FwKF9feCk7fQorCisgICAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbik7CisgICAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192KTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBjbGVhcigpIF9OT0VYQ0VQVCB7YmFzZTo6Y2xlYXIoKTt9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc3BsaWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcCwgZm9yd2FyZF9saXN0JiYgX194KTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wLCBmb3J3YXJkX2xpc3QmJiBfX3gsIGNvbnN0X2l0ZXJhdG9yIF9faSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc3BsaWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcCwgZm9yd2FyZF9saXN0JiYgX194LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdm9pZCBzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wLCBmb3J3YXJkX2xpc3QmIF9feCk7CisgICAgdm9pZCBzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wLCBmb3J3YXJkX2xpc3QmIF9feCwgY29uc3RfaXRlcmF0b3IgX19pKTsKKyAgICB2b2lkIHNwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3AsIGZvcndhcmRfbGlzdCYgX194LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKTsKKyAgICB2b2lkIHJlbW92ZShjb25zdCB2YWx1ZV90eXBlJiBfX3YpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPiB2b2lkIHJlbW92ZV9pZihfUHJlZGljYXRlIF9fcHJlZCk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgdW5pcXVlKCkge3VuaXF1ZShfX2VxdWFsX3RvPHZhbHVlX3R5cGU+KCkpO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4gdm9pZCB1bmlxdWUoX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKTsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgbWVyZ2UoZm9yd2FyZF9saXN0JiYgX194KSB7bWVyZ2UoX194LCBfX2xlc3M8dmFsdWVfdHlwZT4oKSk7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfQ29tcGFyZT4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB2b2lkIG1lcmdlKGZvcndhcmRfbGlzdCYmIF9feCwgX0NvbXBhcmUgX19jb21wKQorICAgICAgICB7bWVyZ2UoX194LCBfVlNURDo6bW92ZShfX2NvbXApKTt9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIG1lcmdlKGZvcndhcmRfbGlzdCYgX194KSB7bWVyZ2UoX194LCBfX2xlc3M8dmFsdWVfdHlwZT4oKSk7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfQ29tcGFyZT4gdm9pZCBtZXJnZShmb3J3YXJkX2xpc3QmIF9feCwgX0NvbXBhcmUgX19jb21wKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzb3J0KCkge3NvcnQoX19sZXNzPHZhbHVlX3R5cGU+KCkpO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmU+IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCBzb3J0KF9Db21wYXJlIF9fY29tcCk7CisgICAgdm9pZCByZXZlcnNlKCkgX05PRVhDRVBUOworCitwcml2YXRlOgorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHZvaWQgX19tb3ZlX2Fzc2lnbihmb3J3YXJkX2xpc3QmIF9feCwgdHJ1ZV90eXBlKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpOworICAgIHZvaWQgX19tb3ZlX2Fzc2lnbihmb3J3YXJkX2xpc3QmIF9feCwgZmFsc2VfdHlwZSk7CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9Db21wYXJlPgorICAgICAgICBzdGF0aWMKKyAgICAgICAgX19ub2RlX3BvaW50ZXIKKyAgICAgICAgX19tZXJnZShfX25vZGVfcG9pbnRlciBfX2YxLCBfX25vZGVfcG9pbnRlciBfX2YyLCBfQ29tcGFyZSYgX19jb21wKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ29tcGFyZT4KKyAgICAgICAgc3RhdGljCisgICAgICAgIF9fbm9kZV9wb2ludGVyCisgICAgICAgIF9fc29ydChfX25vZGVfcG9pbnRlciBfX2YsIGRpZmZlcmVuY2VfdHlwZSBfX3N6LCBfQ29tcGFyZSYgX19jb21wKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2lubGluZQorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6Zm9yd2FyZF9saXN0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBiYXNlKF9fYSkKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6Zm9yd2FyZF9saXN0KHNpemVfdHlwZSBfX24pCit7CisgICAgaWYgKF9fbiA+IDApCisgICAgeworICAgICAgICBfX25vZGVfYWxsb2NhdG9yJiBfX2EgPSBiYXNlOjpfX2FsbG9jKCk7CisgICAgICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfX25vZGVfYWxsb2NhdG9yPiBfRHA7CisgICAgICAgIHVuaXF1ZV9wdHI8X19ub2RlLCBfRHA+IF9faChudWxscHRyLCBfRHAoX19hLCAxKSk7CisgICAgICAgIGZvciAoX19iZWdpbl9ub2RlX3BvaW50ZXIgX19wID0gYmFzZTo6X19iZWZvcmVfYmVnaW4oKTsgX19uID4gMDsgLS1fX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wID0gX19wLT5fX25leHRfYXNfYmVnaW4oKSkKKyAgICAgICAgeworICAgICAgICAgICAgX19oLnJlc2V0KF9fbm9kZV90cmFpdHM6OmFsbG9jYXRlKF9fYSwgMSkpOworICAgICAgICAgICAgX19ub2RlX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX2gtPl9fdmFsdWVfKSk7CisgICAgICAgICAgICBfX2gtPl9fbmV4dF8gPSBudWxscHRyOworICAgICAgICAgICAgX19wLT5fX25leHRfID0gX19oLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Citmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+Ojpmb3J3YXJkX2xpc3Qoc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19iYXNlX2FsbG9jKQorICAgIDogYmFzZSAoIF9fYmFzZV9hbGxvYyApCit7CisgICAgaWYgKF9fbiA+IDApCisgICAgeworICAgICAgICBfX25vZGVfYWxsb2NhdG9yJiBfX2EgPSBiYXNlOjpfX2FsbG9jKCk7CisgICAgICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfX25vZGVfYWxsb2NhdG9yPiBfRHA7CisgICAgICAgIHVuaXF1ZV9wdHI8X19ub2RlLCBfRHA+IF9faChudWxscHRyLCBfRHAoX19hLCAxKSk7CisgICAgICAgIGZvciAoX19iZWdpbl9ub2RlX3BvaW50ZXIgX19wID0gYmFzZTo6X19iZWZvcmVfYmVnaW4oKTsgX19uID4gMDsgLS1fX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wID0gX19wLT5fX25leHRfYXNfYmVnaW4oKSkKKyAgICAgICAgeworICAgICAgICAgICAgX19oLnJlc2V0KF9fbm9kZV90cmFpdHM6OmFsbG9jYXRlKF9fYSwgMSkpOworICAgICAgICAgICAgX19ub2RlX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX2gtPl9fdmFsdWVfKSk7CisgICAgICAgICAgICBfX2gtPl9fbmV4dF8gPSBudWxscHRyOworICAgICAgICAgICAgX19wLT5fX25leHRfID0gX19oLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Citmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+Ojpmb3J3YXJkX2xpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192KQoreworICAgIGluc2VydF9hZnRlcihjYmVmb3JlX2JlZ2luKCksIF9fbiwgX192KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6Zm9yd2FyZF9saXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogYmFzZShfX2EpCit7CisgICAgaW5zZXJ0X2FmdGVyKGNiZWZvcmVfYmVnaW4oKSwgX19uLCBfX3YpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Citmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+Ojpmb3J3YXJkX2xpc3QoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pc19pbnB1dF9pdGVyYXRvcjxfSW5wdXRJdGVyYXRvcj46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSopCit7CisgICAgaW5zZXJ0X2FmdGVyKGNiZWZvcmVfYmVnaW4oKSwgX19mLCBfX2wpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Citmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+Ojpmb3J3YXJkX2xpc3QoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2lzX2lucHV0X2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlKikKKyAgICA6IGJhc2UoX19hKQoreworICAgIGluc2VydF9hZnRlcihjYmVmb3JlX2JlZ2luKCksIF9fZiwgX19sKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6Zm9yd2FyZF9saXN0KGNvbnN0IGZvcndhcmRfbGlzdCYgX194KQorICAgIDogYmFzZShhbGxvY2F0b3JfdHlwZSgKKyAgICAgICAgICAgICBfX25vZGVfdHJhaXRzOjpzZWxlY3Rfb25fY29udGFpbmVyX2NvcHlfY29uc3RydWN0aW9uKF9feC5fX2FsbG9jKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICkKK3sKKyAgICBpbnNlcnRfYWZ0ZXIoY2JlZm9yZV9iZWdpbigpLCBfX3guYmVnaW4oKSwgX194LmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6Zm9yd2FyZF9saXN0KGNvbnN0IGZvcndhcmRfbGlzdCYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBiYXNlKF9fYSkKK3sKKyAgICBpbnNlcnRfYWZ0ZXIoY2JlZm9yZV9iZWdpbigpLCBfX3guYmVnaW4oKSwgX194LmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYKK2ZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46Om9wZXJhdG9yPShjb25zdCBmb3J3YXJkX2xpc3QmIF9feCkKK3sKKyAgICBpZiAodGhpcyAhPSAmX194KQorICAgIHsKKyAgICAgICAgYmFzZTo6X19jb3B5X2Fzc2lnbl9hbGxvYyhfX3gpOworICAgICAgICBhc3NpZ24oX194LmJlZ2luKCksIF9feC5lbmQoKSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2ZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OmZvcndhcmRfbGlzdChmb3J3YXJkX2xpc3QmJiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IGJhc2UoX1ZTVEQ6Om1vdmUoX194KSwgX19hKQoreworICAgIGlmIChiYXNlOjpfX2FsbG9jKCkgIT0gX194Ll9fYWxsb2MoKSkKKyAgICB7CisgICAgICAgIHR5cGVkZWYgbW92ZV9pdGVyYXRvcjxpdGVyYXRvcj4gX0lwOworICAgICAgICBpbnNlcnRfYWZ0ZXIoY2JlZm9yZV9iZWdpbigpLCBfSXAoX194LmJlZ2luKCkpLCBfSXAoX194LmVuZCgpKSk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Citmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+Ojpmb3J3YXJkX2xpc3QoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQoreworICAgIGluc2VydF9hZnRlcihjYmVmb3JlX2JlZ2luKCksIF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2ZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OmZvcndhcmRfbGlzdChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IGJhc2UoX19hKQoreworICAgIGluc2VydF9hZnRlcihjYmVmb3JlX2JlZ2luKCksIF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK2ZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46Ol9fbW92ZV9hc3NpZ24oZm9yd2FyZF9saXN0JiBfX3gsIHRydWVfdHlwZSkKKyAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpCit7CisgICAgY2xlYXIoKTsKKyAgICBiYXNlOjpfX21vdmVfYXNzaWduX2FsbG9jKF9feCk7CisgICAgYmFzZTo6X19iZWZvcmVfYmVnaW4oKS0+X19uZXh0XyA9IF9feC5fX2JlZm9yZV9iZWdpbigpLT5fX25leHRfOworICAgIF9feC5fX2JlZm9yZV9iZWdpbigpLT5fX25leHRfID0gbnVsbHB0cjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZAorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6X19tb3ZlX2Fzc2lnbihmb3J3YXJkX2xpc3QmIF9feCwgZmFsc2VfdHlwZSkKK3sKKyAgICBpZiAoYmFzZTo6X19hbGxvYygpID09IF9feC5fX2FsbG9jKCkpCisgICAgICAgIF9fbW92ZV9hc3NpZ24oX194LCB0cnVlX3R5cGUoKSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdHlwZWRlZiBtb3ZlX2l0ZXJhdG9yPGl0ZXJhdG9yPiBfSXA7CisgICAgICAgIGFzc2lnbihfSXAoX194LmJlZ2luKCkpLCBfSXAoX194LmVuZCgpKSk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUKK2ZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mCitmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjpvcGVyYXRvcj0oZm9yd2FyZF9saXN0JiYgX194KQorICAgIF9OT0VYQ0VQVF8oCisgICAgICAgICAgICAgX19ub2RlX3RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ6OnZhbHVlICYmCisgICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSkKK3sKKyAgICBfX21vdmVfYXNzaWduKF9feCwgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICBfX25vZGVfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWU+KCkpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lCitmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JgorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6b3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkKK3sKKyAgICBhc3NpZ24oX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfaW5wdXRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICB2b2lkCis+Ojp0eXBlCitmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+Ojphc3NpZ24oX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCit7CisgICAgaXRlcmF0b3IgX19pID0gYmVmb3JlX2JlZ2luKCk7CisgICAgaXRlcmF0b3IgX19qID0gX1ZTVEQ6Om5leHQoX19pKTsKKyAgICBpdGVyYXRvciBfX2UgPSBlbmQoKTsKKyAgICBmb3IgKDsgX19qICE9IF9fZSAmJiBfX2YgIT0gX19sOyArK19faSwgKHZvaWQpICsrX19qLCArK19fZikKKyAgICAgICAgKl9faiA9ICpfX2Y7CisgICAgaWYgKF9faiA9PSBfX2UpCisgICAgICAgIGluc2VydF9hZnRlcihfX2ksIF9fZiwgX19sKTsKKyAgICBlbHNlCisgICAgICAgIGVyYXNlX2FmdGVyKF9faSwgX19lKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZAorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6YXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdikKK3sKKyAgICBpdGVyYXRvciBfX2kgPSBiZWZvcmVfYmVnaW4oKTsKKyAgICBpdGVyYXRvciBfX2ogPSBfVlNURDo6bmV4dChfX2kpOworICAgIGl0ZXJhdG9yIF9fZSA9IGVuZCgpOworICAgIGZvciAoOyBfX2ogIT0gX19lICYmIF9fbiA+IDA7IC0tX19uLCArK19faSwgKytfX2opCisgICAgICAgICpfX2ogPSBfX3Y7CisgICAgaWYgKF9faiA9PSBfX2UpCisgICAgICAgIGluc2VydF9hZnRlcihfX2ksIF9fbiwgX192KTsKKyAgICBlbHNlCisgICAgICAgIGVyYXNlX2FmdGVyKF9faSwgX19lKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lCit2b2lkCitmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+Ojphc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQoreworICAgIGFzc2lnbihfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKK3R5cGVuYW1lIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OnJlZmVyZW5jZQorI2Vsc2UKK3ZvaWQKKyNlbmRpZgorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6ZW1wbGFjZV9mcm9udChfQXJncyYmLi4uIF9fYXJncykKK3sKKyAgICBfX25vZGVfYWxsb2NhdG9yJiBfX2EgPSBiYXNlOjpfX2FsbG9jKCk7CisgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9fbm9kZV9hbGxvY2F0b3I+IF9EcDsKKyAgICB1bmlxdWVfcHRyPF9fbm9kZSwgX0RwPiBfX2goX19ub2RlX3RyYWl0czo6YWxsb2NhdGUoX19hLCAxKSwgX0RwKF9fYSwgMSkpOworICAgIF9fbm9kZV90cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjphZGRyZXNzb2YoX19oLT5fX3ZhbHVlXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIF9faC0+X19uZXh0XyA9IGJhc2U6Ol9fYmVmb3JlX2JlZ2luKCktPl9fbmV4dF87CisgICAgYmFzZTo6X19iZWZvcmVfYmVnaW4oKS0+X19uZXh0XyA9IF9faC5yZWxlYXNlKCk7CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKyAgICByZXR1cm4gYmFzZTo6X19iZWZvcmVfYmVnaW4oKS0+X19uZXh0Xy0+X192YWx1ZV87CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZAorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6cHVzaF9mcm9udCh2YWx1ZV90eXBlJiYgX192KQoreworICAgIF9fbm9kZV9hbGxvY2F0b3ImIF9fYSA9IGJhc2U6Ol9fYWxsb2MoKTsKKyAgICB0eXBlZGVmIF9fYWxsb2NhdG9yX2Rlc3RydWN0b3I8X19ub2RlX2FsbG9jYXRvcj4gX0RwOworICAgIHVuaXF1ZV9wdHI8X19ub2RlLCBfRHA+IF9faChfX25vZGVfdHJhaXRzOjphbGxvY2F0ZShfX2EsIDEpLCBfRHAoX19hLCAxKSk7CisgICAgX19ub2RlX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX2gtPl9fdmFsdWVfKSwgX1ZTVEQ6Om1vdmUoX192KSk7CisgICAgX19oLT5fX25leHRfID0gYmFzZTo6X19iZWZvcmVfYmVnaW4oKS0+X19uZXh0XzsKKyAgICBiYXNlOjpfX2JlZm9yZV9iZWdpbigpLT5fX25leHRfID0gX19oLnJlbGVhc2UoKTsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZAorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6cHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiBfX3YpCit7CisgICAgX19ub2RlX2FsbG9jYXRvciYgX19hID0gYmFzZTo6X19hbGxvYygpOworICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfX25vZGVfYWxsb2NhdG9yPiBfRHA7CisgICAgdW5pcXVlX3B0cjxfX25vZGUsIF9EcD4gX19oKF9fbm9kZV90cmFpdHM6OmFsbG9jYXRlKF9fYSwgMSksIF9EcChfX2EsIDEpKTsKKyAgICBfX25vZGVfdHJhaXRzOjpjb25zdHJ1Y3QoX19hLCBfVlNURDo6YWRkcmVzc29mKF9faC0+X192YWx1ZV8pLCBfX3YpOworICAgIF9faC0+X19uZXh0XyA9IGJhc2U6Ol9fYmVmb3JlX2JlZ2luKCktPl9fbmV4dF87CisgICAgYmFzZTo6X19iZWZvcmVfYmVnaW4oKS0+X19uZXh0XyA9IF9faC5yZWxlYXNlKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK2ZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OnBvcF9mcm9udCgpCit7CisgICAgX19ub2RlX2FsbG9jYXRvciYgX19hID0gYmFzZTo6X19hbGxvYygpOworICAgIF9fbm9kZV9wb2ludGVyIF9fcCA9IGJhc2U6Ol9fYmVmb3JlX2JlZ2luKCktPl9fbmV4dF87CisgICAgYmFzZTo6X19iZWZvcmVfYmVnaW4oKS0+X19uZXh0XyA9IF9fcC0+X19uZXh0XzsKKyAgICBfX25vZGVfdHJhaXRzOjpkZXN0cm95KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX3AtPl9fdmFsdWVfKSk7CisgICAgX19ub2RlX3RyYWl0czo6ZGVhbGxvY2F0ZShfX2EsIF9fcCwgMSk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KK3R5cGVuYW1lIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCitmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjplbXBsYWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCit7CisgICAgX19iZWdpbl9ub2RlX3BvaW50ZXIgY29uc3QgX19yID0gX19wLl9fZ2V0X2JlZ2luKCk7CisgICAgX19ub2RlX2FsbG9jYXRvciYgX19hID0gYmFzZTo6X19hbGxvYygpOworICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfX25vZGVfYWxsb2NhdG9yPiBfRHA7CisgICAgdW5pcXVlX3B0cjxfX25vZGUsIF9EcD4gX19oKF9fbm9kZV90cmFpdHM6OmFsbG9jYXRlKF9fYSwgMSksIF9EcChfX2EsIDEpKTsKKyAgICBfX25vZGVfdHJhaXRzOjpjb25zdHJ1Y3QoX19hLCBfVlNURDo6YWRkcmVzc29mKF9faC0+X192YWx1ZV8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICBfX2gtPl9fbmV4dF8gPSBfX3ItPl9fbmV4dF87CisgICAgX19yLT5fX25leHRfID0gX19oLnJlbGVhc2UoKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoX19yLT5fX25leHRfKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordHlwZW5hbWUgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKK2ZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46Omluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3AsIHZhbHVlX3R5cGUmJiBfX3YpCit7CisgICAgX19iZWdpbl9ub2RlX3BvaW50ZXIgY29uc3QgX19yID0gX19wLl9fZ2V0X2JlZ2luKCk7CisgICAgX19ub2RlX2FsbG9jYXRvciYgX19hID0gYmFzZTo6X19hbGxvYygpOworICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfX25vZGVfYWxsb2NhdG9yPiBfRHA7CisgICAgdW5pcXVlX3B0cjxfX25vZGUsIF9EcD4gX19oKF9fbm9kZV90cmFpdHM6OmFsbG9jYXRlKF9fYSwgMSksIF9EcChfX2EsIDEpKTsKKyAgICBfX25vZGVfdHJhaXRzOjpjb25zdHJ1Y3QoX19hLCBfVlNURDo6YWRkcmVzc29mKF9faC0+X192YWx1ZV8pLCBfVlNURDo6bW92ZShfX3YpKTsKKyAgICBfX2gtPl9fbmV4dF8gPSBfX3ItPl9fbmV4dF87CisgICAgX19yLT5fX25leHRfID0gX19oLnJlbGVhc2UoKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoX19yLT5fX25leHRfKTsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordHlwZW5hbWUgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKK2ZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46Omluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3AsIGNvbnN0IHZhbHVlX3R5cGUmIF9fdikKK3sKKyAgICBfX2JlZ2luX25vZGVfcG9pbnRlciBjb25zdCBfX3IgPSBfX3AuX19nZXRfYmVnaW4oKTsKKyAgICBfX25vZGVfYWxsb2NhdG9yJiBfX2EgPSBiYXNlOjpfX2FsbG9jKCk7CisgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9fbm9kZV9hbGxvY2F0b3I+IF9EcDsKKyAgICB1bmlxdWVfcHRyPF9fbm9kZSwgX0RwPiBfX2goX19ub2RlX3RyYWl0czo6YWxsb2NhdGUoX19hLCAxKSwgX0RwKF9fYSwgMSkpOworICAgIF9fbm9kZV90cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjphZGRyZXNzb2YoX19oLT5fX3ZhbHVlXyksIF9fdik7CisgICAgX19oLT5fX25leHRfID0gX19yLT5fX25leHRfOworICAgIF9fci0+X19uZXh0XyA9IF9faC5yZWxlYXNlKCk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKF9fci0+X19uZXh0Xyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3R5cGVuYW1lIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCitmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjppbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUmIF9fdikKK3sKKyAgICBfX2JlZ2luX25vZGVfcG9pbnRlciBfX3IgPSBfX3AuX19nZXRfYmVnaW4oKTsKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIF9fbm9kZV9hbGxvY2F0b3ImIF9fYSA9IGJhc2U6Ol9fYWxsb2MoKTsKKyAgICAgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9fbm9kZV9hbGxvY2F0b3I+IF9EcDsKKyAgICAgICAgdW5pcXVlX3B0cjxfX25vZGUsIF9EcD4gX19oKF9fbm9kZV90cmFpdHM6OmFsbG9jYXRlKF9fYSwgMSksIF9EcChfX2EsIDEpKTsKKyAgICAgICAgX19ub2RlX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX2gtPl9fdmFsdWVfKSwgX192KTsKKyAgICAgICAgX19ub2RlX3BvaW50ZXIgX19maXJzdCA9IF9faC5yZWxlYXNlKCk7CisgICAgICAgIF9fbm9kZV9wb2ludGVyIF9fbGFzdCA9IF9fZmlyc3Q7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0cnkKKyAgICAgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIGZvciAoLS1fX247IF9fbiAhPSAwOyAtLV9fbiwgX19sYXN0ID0gX19sYXN0LT5fX25leHRfKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9faC5yZXNldChfX25vZGVfdHJhaXRzOjphbGxvY2F0ZShfX2EsIDEpKTsKKyAgICAgICAgICAgICAgICBfX25vZGVfdHJhaXRzOjpjb25zdHJ1Y3QoX19hLCBfVlNURDo6YWRkcmVzc29mKF9faC0+X192YWx1ZV8pLCBfX3YpOworICAgICAgICAgICAgICAgIF9fbGFzdC0+X19uZXh0XyA9IF9faC5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB9CisgICAgICAgIGNhdGNoICguLi4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IG51bGxwdHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19ub2RlX3BvaW50ZXIgX19uZXh0ID0gX19maXJzdC0+X19uZXh0XzsKKyAgICAgICAgICAgICAgICBfX25vZGVfdHJhaXRzOjpkZXN0cm95KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX2ZpcnN0LT5fX3ZhbHVlXykpOworICAgICAgICAgICAgICAgIF9fbm9kZV90cmFpdHM6OmRlYWxsb2NhdGUoX19hLCBfX2ZpcnN0LCAxKTsKKyAgICAgICAgICAgICAgICBfX2ZpcnN0ID0gX19uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIF9fbGFzdC0+X19uZXh0XyA9IF9fci0+X19uZXh0XzsKKyAgICAgICAgX19yLT5fX25leHRfID0gX19maXJzdDsKKyAgICAgICAgX19yID0gc3RhdGljX2Nhc3Q8X19iZWdpbl9ub2RlX3BvaW50ZXI+KF9fbGFzdCk7CisgICAgfQorICAgIHJldHVybiBpdGVyYXRvcihfX3IpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Cit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX2lucHV0X2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgdHlwZW5hbWUgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKz46OnR5cGUKK2ZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46Omluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCit7CisgICAgX19iZWdpbl9ub2RlX3BvaW50ZXIgX19yID0gX19wLl9fZ2V0X2JlZ2luKCk7CisgICAgaWYgKF9fZiAhPSBfX2wpCisgICAgeworICAgICAgICBfX25vZGVfYWxsb2NhdG9yJiBfX2EgPSBiYXNlOjpfX2FsbG9jKCk7CisgICAgICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfX25vZGVfYWxsb2NhdG9yPiBfRHA7CisgICAgICAgIHVuaXF1ZV9wdHI8X19ub2RlLCBfRHA+IF9faChfX25vZGVfdHJhaXRzOjphbGxvY2F0ZShfX2EsIDEpLCBfRHAoX19hLCAxKSk7CisgICAgICAgIF9fbm9kZV90cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjphZGRyZXNzb2YoX19oLT5fX3ZhbHVlXyksICpfX2YpOworICAgICAgICBfX25vZGVfcG9pbnRlciBfX2ZpcnN0ID0gX19oLnJlbGVhc2UoKTsKKyAgICAgICAgX19ub2RlX3BvaW50ZXIgX19sYXN0ID0gX19maXJzdDsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHRyeQorICAgICAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgZm9yICgrK19fZjsgX19mICE9IF9fbDsgKytfX2YsICgodm9pZCkoX19sYXN0ID0gX19sYXN0LT5fX25leHRfKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19oLnJlc2V0KF9fbm9kZV90cmFpdHM6OmFsbG9jYXRlKF9fYSwgMSkpOworICAgICAgICAgICAgICAgIF9fbm9kZV90cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjphZGRyZXNzb2YoX19oLT5fX3ZhbHVlXyksICpfX2YpOworICAgICAgICAgICAgICAgIF9fbGFzdC0+X19uZXh0XyA9IF9faC5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB9CisgICAgICAgIGNhdGNoICguLi4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IG51bGxwdHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19ub2RlX3BvaW50ZXIgX19uZXh0ID0gX19maXJzdC0+X19uZXh0XzsKKyAgICAgICAgICAgICAgICBfX25vZGVfdHJhaXRzOjpkZXN0cm95KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX2ZpcnN0LT5fX3ZhbHVlXykpOworICAgICAgICAgICAgICAgIF9fbm9kZV90cmFpdHM6OmRlYWxsb2NhdGUoX19hLCBfX2ZpcnN0LCAxKTsKKyAgICAgICAgICAgICAgICBfX2ZpcnN0ID0gX19uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIF9fbGFzdC0+X19uZXh0XyA9IF9fci0+X19uZXh0XzsKKyAgICAgICAgX19yLT5fX25leHRfID0gX19maXJzdDsKKyAgICAgICAgX19yID0gc3RhdGljX2Nhc3Q8X19iZWdpbl9ub2RlX3BvaW50ZXI+KF9fbGFzdCk7CisgICAgfQorICAgIHJldHVybiBpdGVyYXRvcihfX3IpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit0eXBlbmFtZSBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6ZXJhc2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19mKQoreworICAgIF9fYmVnaW5fbm9kZV9wb2ludGVyIF9fcCA9IF9fZi5fX2dldF9iZWdpbigpOworICAgIF9fbm9kZV9wb2ludGVyIF9fbiA9IF9fcC0+X19uZXh0XzsKKyAgICBfX3AtPl9fbmV4dF8gPSBfX24tPl9fbmV4dF87CisgICAgX19ub2RlX2FsbG9jYXRvciYgX19hID0gYmFzZTo6X19hbGxvYygpOworICAgIF9fbm9kZV90cmFpdHM6OmRlc3Ryb3koX19hLCBfVlNURDo6YWRkcmVzc29mKF9fbi0+X192YWx1ZV8pKTsKKyAgICBfX25vZGVfdHJhaXRzOjpkZWFsbG9jYXRlKF9fYSwgX19uLCAxKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoX19wLT5fX25leHRfKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordHlwZW5hbWUgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKK2ZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OmVyYXNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQoreworICAgIF9fbm9kZV9wb2ludGVyIF9fZSA9IF9fbC5fX2dldF91bnNhZmVfbm9kZV9wb2ludGVyKCk7CisgICAgaWYgKF9fZiAhPSBfX2wpCisgICAgeworICAgICAgICBfX2JlZ2luX25vZGVfcG9pbnRlciBfX2JwID0gX19mLl9fZ2V0X2JlZ2luKCk7CisKKyAgICAgICAgX19ub2RlX3BvaW50ZXIgX19uID0gX19icC0+X19uZXh0XzsKKyAgICAgICAgaWYgKF9fbiAhPSBfX2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fYnAtPl9fbmV4dF8gPSBfX2U7CisgICAgICAgICAgICBfX25vZGVfYWxsb2NhdG9yJiBfX2EgPSBiYXNlOjpfX2FsbG9jKCk7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fbm9kZV9wb2ludGVyIF9fdG1wID0gX19uLT5fX25leHRfOworICAgICAgICAgICAgICAgIF9fbm9kZV90cmFpdHM6OmRlc3Ryb3koX19hLCBfVlNURDo6YWRkcmVzc29mKF9fbi0+X192YWx1ZV8pKTsKKyAgICAgICAgICAgICAgICBfX25vZGVfdHJhaXRzOjpkZWFsbG9jYXRlKF9fYSwgX19uLCAxKTsKKyAgICAgICAgICAgICAgICBfX24gPSBfX3RtcDsKKyAgICAgICAgICAgIH0gd2hpbGUgKF9fbiAhPSBfX2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpdGVyYXRvcihfX2UpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjpyZXNpemUoc2l6ZV90eXBlIF9fbikKK3sKKyAgICBzaXplX3R5cGUgX19zeiA9IDA7CisgICAgaXRlcmF0b3IgX19wID0gYmVmb3JlX2JlZ2luKCk7CisgICAgaXRlcmF0b3IgX19pID0gYmVnaW4oKTsKKyAgICBpdGVyYXRvciBfX2UgPSBlbmQoKTsKKyAgICBmb3IgKDsgX19pICE9IF9fZSAmJiBfX3N6IDwgX19uOyArK19fcCwgKytfX2ksICsrX19zeikKKyAgICAgICAgOworICAgIGlmIChfX2kgIT0gX19lKQorICAgICAgICBlcmFzZV9hZnRlcihfX3AsIF9fZSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX19uIC09IF9fc3o7CisgICAgICAgIGlmIChfX24gPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBfX25vZGVfYWxsb2NhdG9yJiBfX2EgPSBiYXNlOjpfX2FsbG9jKCk7CisgICAgICAgICAgICB0eXBlZGVmIF9fYWxsb2NhdG9yX2Rlc3RydWN0b3I8X19ub2RlX2FsbG9jYXRvcj4gX0RwOworICAgICAgICAgICAgdW5pcXVlX3B0cjxfX25vZGUsIF9EcD4gX19oKG51bGxwdHIsIF9EcChfX2EsIDEpKTsKKyAgICAgICAgICAgIGZvciAoX19iZWdpbl9ub2RlX3BvaW50ZXIgX19wdHIgPSBfX3AuX19nZXRfYmVnaW4oKTsgX19uID4gMDsgLS1fX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3B0ciA9IF9fcHRyLT5fX25leHRfYXNfYmVnaW4oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX2gucmVzZXQoX19ub2RlX3RyYWl0czo6YWxsb2NhdGUoX19hLCAxKSk7CisgICAgICAgICAgICAgICAgX19ub2RlX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX2gtPl9fdmFsdWVfKSk7CisgICAgICAgICAgICAgICAgX19oLT5fX25leHRfID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBfX3B0ci0+X19uZXh0XyA9IF9faC5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK2ZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OnJlc2l6ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpCit7CisgICAgc2l6ZV90eXBlIF9fc3ogPSAwOworICAgIGl0ZXJhdG9yIF9fcCA9IGJlZm9yZV9iZWdpbigpOworICAgIGl0ZXJhdG9yIF9faSA9IGJlZ2luKCk7CisgICAgaXRlcmF0b3IgX19lID0gZW5kKCk7CisgICAgZm9yICg7IF9faSAhPSBfX2UgJiYgX19zeiA8IF9fbjsgKytfX3AsICsrX19pLCArK19fc3opCisgICAgICAgIDsKKyAgICBpZiAoX19pICE9IF9fZSkKKyAgICAgICAgZXJhc2VfYWZ0ZXIoX19wLCBfX2UpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIF9fbiAtPSBfX3N6OworICAgICAgICBpZiAoX19uID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgX19ub2RlX2FsbG9jYXRvciYgX19hID0gYmFzZTo6X19hbGxvYygpOworICAgICAgICAgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9fbm9kZV9hbGxvY2F0b3I+IF9EcDsKKyAgICAgICAgICAgIHVuaXF1ZV9wdHI8X19ub2RlLCBfRHA+IF9faChudWxscHRyLCBfRHAoX19hLCAxKSk7CisgICAgICAgICAgICBmb3IgKF9fYmVnaW5fbm9kZV9wb2ludGVyIF9fcHRyID0gX19wLl9fZ2V0X2JlZ2luKCk7IF9fbiA+IDA7IC0tX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wdHIgPSBfX3B0ci0+X19uZXh0X2FzX2JlZ2luKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19oLnJlc2V0KF9fbm9kZV90cmFpdHM6OmFsbG9jYXRlKF9fYSwgMSkpOworICAgICAgICAgICAgICAgIF9fbm9kZV90cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjphZGRyZXNzb2YoX19oLT5fX3ZhbHVlXyksIF9fdik7CisgICAgICAgICAgICAgICAgX19oLT5fX25leHRfID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBfX3B0ci0+X19uZXh0XyA9IF9faC5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK2ZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OnNwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yd2FyZF9saXN0JiBfX3gpCit7CisgICAgaWYgKCFfX3guZW1wdHkoKSkKKyAgICB7CisgICAgICAgIGlmIChfX3AuX19nZXRfYmVnaW4oKS0+X19uZXh0XyAhPSBudWxscHRyKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2xtMSA9IF9feC5iZWZvcmVfYmVnaW4oKTsKKyAgICAgICAgICAgIHdoaWxlIChfX2xtMS5fX2dldF9iZWdpbigpLT5fX25leHRfICE9IG51bGxwdHIpCisgICAgICAgICAgICAgICAgKytfX2xtMTsKKyAgICAgICAgICAgIF9fbG0xLl9fZ2V0X2JlZ2luKCktPl9fbmV4dF8gPSBfX3AuX19nZXRfYmVnaW4oKS0+X19uZXh0XzsKKyAgICAgICAgfQorICAgICAgICBfX3AuX19nZXRfYmVnaW4oKS0+X19uZXh0XyA9IF9feC5fX2JlZm9yZV9iZWdpbigpLT5fX25leHRfOworICAgICAgICBfX3guX19iZWZvcmVfYmVnaW4oKS0+X19uZXh0XyA9IG51bGxwdHI7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjpzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRfbGlzdCYgLypfX290aGVyKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19pKQoreworICAgIGNvbnN0X2l0ZXJhdG9yIF9fbG0xID0gX1ZTVEQ6Om5leHQoX19pKTsKKyAgICBpZiAoX19wICE9IF9faSAmJiBfX3AgIT0gX19sbTEpCisgICAgeworICAgICAgICBfX2kuX19nZXRfYmVnaW4oKS0+X19uZXh0XyA9IF9fbG0xLl9fZ2V0X2JlZ2luKCktPl9fbmV4dF87CisgICAgICAgIF9fbG0xLl9fZ2V0X2JlZ2luKCktPl9fbmV4dF8gPSBfX3AuX19nZXRfYmVnaW4oKS0+X19uZXh0XzsKKyAgICAgICAgX19wLl9fZ2V0X2JlZ2luKCktPl9fbmV4dF8gPSBfX2xtMS5fX2dldF91bnNhZmVfbm9kZV9wb2ludGVyKCk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjpzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRfbGlzdCYgLypfX290aGVyKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19mLCBjb25zdF9pdGVyYXRvciBfX2wpCit7CisgICAgaWYgKF9fZiAhPSBfX2wgJiYgX19wICE9IF9fZikKKyAgICB7CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fbG0xID0gX19mOworICAgICAgICB3aGlsZSAoX19sbTEuX19nZXRfYmVnaW4oKS0+X19uZXh0XyAhPSBfX2wuX19nZXRfYmVnaW4oKSkKKyAgICAgICAgICAgICsrX19sbTE7CisgICAgICAgIGlmIChfX2YgIT0gX19sbTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fbG0xLl9fZ2V0X2JlZ2luKCktPl9fbmV4dF8gPSBfX3AuX19nZXRfYmVnaW4oKS0+X19uZXh0XzsKKyAgICAgICAgICAgIF9fcC5fX2dldF9iZWdpbigpLT5fX25leHRfID0gX19mLl9fZ2V0X2JlZ2luKCktPl9fbmV4dF87CisgICAgICAgICAgICBfX2YuX19nZXRfYmVnaW4oKS0+X19uZXh0XyA9IF9fbC5fX2dldF91bnNhZmVfbm9kZV9wb2ludGVyKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjpzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRfbGlzdCYmIF9feCkKK3sKKyAgICBzcGxpY2VfYWZ0ZXIoX19wLCBfX3gpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6c3BsaWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkX2xpc3QmJiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19pKQoreworICAgIHNwbGljZV9hZnRlcihfX3AsIF9feCwgX19pKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK2ZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OnNwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yd2FyZF9saXN0JiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQoreworICAgIHNwbGljZV9hZnRlcihfX3AsIF9feCwgX19mLCBfX2wpOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjpyZW1vdmUoY29uc3QgdmFsdWVfdHlwZSYgX192KQoreworICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4gX19kZWxldGVkX25vZGVzOyAvLyBjb2xsZWN0IHRoZSBub2RlcyB3ZSdyZSByZW1vdmluZworICAgIGl0ZXJhdG9yIF9fZSA9IGVuZCgpOworICAgIGZvciAoaXRlcmF0b3IgX19pID0gYmVmb3JlX2JlZ2luKCk7IF9faS5fX2dldF9iZWdpbigpLT5fX25leHRfICE9IG51bGxwdHI7KQorICAgIHsKKyAgICAgICAgaWYgKF9faS5fX2dldF9iZWdpbigpLT5fX25leHRfLT5fX3ZhbHVlXyA9PSBfX3YpCisgICAgICAgIHsKKyAgICAgICAgICAgIGl0ZXJhdG9yIF9faiA9IF9WU1REOjpuZXh0KF9faSwgMik7CisgICAgICAgICAgICBmb3IgKDsgX19qICE9IF9fZSAmJiAqX19qID09IF9fdjsgKytfX2opCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgX19kZWxldGVkX25vZGVzLnNwbGljZV9hZnRlcihfX2RlbGV0ZWRfbm9kZXMuYmVmb3JlX2JlZ2luKCksICp0aGlzLCBfX2ksIF9faik7CisgICAgICAgICAgICBpZiAoX19qID09IF9fZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIF9faSA9IF9fajsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICArK19faTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgordm9pZAorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6cmVtb3ZlX2lmKF9QcmVkaWNhdGUgX19wcmVkKQoreworICAgIGl0ZXJhdG9yIF9fZSA9IGVuZCgpOworICAgIGZvciAoaXRlcmF0b3IgX19pID0gYmVmb3JlX2JlZ2luKCk7IF9faS5fX2dldF9iZWdpbigpLT5fX25leHRfICE9IG51bGxwdHI7KQorICAgIHsKKyAgICAgICAgaWYgKF9fcHJlZChfX2kuX19nZXRfYmVnaW4oKS0+X19uZXh0Xy0+X192YWx1ZV8pKQorICAgICAgICB7CisgICAgICAgICAgICBpdGVyYXRvciBfX2ogPSBfVlNURDo6bmV4dChfX2ksIDIpOworICAgICAgICAgICAgZm9yICg7IF9faiAhPSBfX2UgJiYgX19wcmVkKCpfX2opOyArK19faikKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICBlcmFzZV9hZnRlcihfX2ksIF9faik7CisgICAgICAgICAgICBpZiAoX19qID09IF9fZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIF9faSA9IF9fajsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICArK19faTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgordm9pZAorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6dW5pcXVlKF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkKK3sKKyAgICBmb3IgKGl0ZXJhdG9yIF9faSA9IGJlZ2luKCksIF9fZSA9IGVuZCgpOyBfX2kgIT0gX19lOykKKyAgICB7CisgICAgICAgIGl0ZXJhdG9yIF9faiA9IF9WU1REOjpuZXh0KF9faSk7CisgICAgICAgIGZvciAoOyBfX2ogIT0gX19lICYmIF9fYmluYXJ5X3ByZWQoKl9faSwgKl9faik7ICsrX19qKQorICAgICAgICAgICAgOworICAgICAgICBpZiAoX19pLl9fZ2V0X2JlZ2luKCktPl9fbmV4dF8gIT0gX19qLl9fZ2V0X3Vuc2FmZV9ub2RlX3BvaW50ZXIoKSkKKyAgICAgICAgICAgIGVyYXNlX2FmdGVyKF9faSwgX19qKTsKKyAgICAgICAgX19pID0gX19qOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9Db21wYXJlPgordm9pZAorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6bWVyZ2UoZm9yd2FyZF9saXN0JiBfX3gsIF9Db21wYXJlIF9fY29tcCkKK3sKKyAgICBpZiAodGhpcyAhPSAmX194KQorICAgIHsKKyAgICAgICAgYmFzZTo6X19iZWZvcmVfYmVnaW4oKS0+X19uZXh0XyA9IF9fbWVyZ2UoYmFzZTo6X19iZWZvcmVfYmVnaW4oKS0+X19uZXh0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3guX19iZWZvcmVfYmVnaW4oKS0+X19uZXh0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOworICAgICAgICBfX3guX19iZWZvcmVfYmVnaW4oKS0+X19uZXh0XyA9IG51bGxwdHI7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXBhcmU+Cit0eXBlbmFtZSBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjpfX25vZGVfcG9pbnRlcgorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6X19tZXJnZShfX25vZGVfcG9pbnRlciBfX2YxLCBfX25vZGVfcG9pbnRlciBfX2YyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSYgX19jb21wKQoreworICAgIGlmIChfX2YxID09IG51bGxwdHIpCisgICAgICAgIHJldHVybiBfX2YyOworICAgIGlmIChfX2YyID09IG51bGxwdHIpCisgICAgICAgIHJldHVybiBfX2YxOworICAgIF9fbm9kZV9wb2ludGVyIF9fcjsKKyAgICBpZiAoX19jb21wKF9fZjItPl9fdmFsdWVfLCBfX2YxLT5fX3ZhbHVlXykpCisgICAgeworICAgICAgICBfX25vZGVfcG9pbnRlciBfX3QgPSBfX2YyOworICAgICAgICB3aGlsZSAoX190LT5fX25leHRfICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wKF9fdC0+X19uZXh0Xy0+X192YWx1ZV8sIF9fZjEtPl9fdmFsdWVfKSkKKyAgICAgICAgICAgIF9fdCA9IF9fdC0+X19uZXh0XzsKKyAgICAgICAgX19yID0gX19mMjsKKyAgICAgICAgX19mMiA9IF9fdC0+X19uZXh0XzsKKyAgICAgICAgX190LT5fX25leHRfID0gX19mMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBfX3IgPSBfX2YxOworICAgIF9fbm9kZV9wb2ludGVyIF9fcCA9IF9fZjE7CisgICAgX19mMSA9IF9fZjEtPl9fbmV4dF87CisgICAgd2hpbGUgKF9fZjEgIT0gbnVsbHB0ciAmJiBfX2YyICE9IG51bGxwdHIpCisgICAgeworICAgICAgICBpZiAoX19jb21wKF9fZjItPl9fdmFsdWVfLCBfX2YxLT5fX3ZhbHVlXykpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fbm9kZV9wb2ludGVyIF9fdCA9IF9fZjI7CisgICAgICAgICAgICB3aGlsZSAoX190LT5fX25leHRfICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcChfX3QtPl9fbmV4dF8tPl9fdmFsdWVfLCBfX2YxLT5fX3ZhbHVlXykpCisgICAgICAgICAgICAgICAgX190ID0gX190LT5fX25leHRfOworICAgICAgICAgICAgX19wLT5fX25leHRfID0gX19mMjsKKyAgICAgICAgICAgIF9fZjIgPSBfX3QtPl9fbmV4dF87CisgICAgICAgICAgICBfX3QtPl9fbmV4dF8gPSBfX2YxOworICAgICAgICB9CisgICAgICAgIF9fcCA9IF9fZjE7CisgICAgICAgIF9fZjEgPSBfX2YxLT5fX25leHRfOworICAgIH0KKyAgICBpZiAoX19mMiAhPSBudWxscHRyKQorICAgICAgICBfX3AtPl9fbmV4dF8gPSBfX2YyOworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfQ29tcGFyZT4KK2lubGluZQordm9pZAorZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6c29ydChfQ29tcGFyZSBfX2NvbXApCit7CisgICAgYmFzZTo6X19iZWZvcmVfYmVnaW4oKS0+X19uZXh0XyA9IF9fc29ydChiYXNlOjpfX2JlZm9yZV9iZWdpbigpLT5fX25leHRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmRpc3RhbmNlKGJlZ2luKCksIGVuZCgpKSwgX19jb21wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9Db21wYXJlPgordHlwZW5hbWUgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6X19ub2RlX3BvaW50ZXIKK2ZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46Ol9fc29ydChfX25vZGVfcG9pbnRlciBfX2YxLCBkaWZmZXJlbmNlX3R5cGUgX19zeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSYgX19jb21wKQoreworICAgIHN3aXRjaCAoX19zeikKKyAgICB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICAgICAgcmV0dXJuIF9fZjE7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoX19jb21wKF9fZjEtPl9fbmV4dF8tPl9fdmFsdWVfLCBfX2YxLT5fX3ZhbHVlXykpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fbm9kZV9wb2ludGVyIF9fdCA9IF9fZjEtPl9fbmV4dF87CisgICAgICAgICAgICBfX3QtPl9fbmV4dF8gPSBfX2YxOworICAgICAgICAgICAgX19mMS0+X19uZXh0XyA9IG51bGxwdHI7CisgICAgICAgICAgICBfX2YxID0gX190OworICAgICAgICB9CisgICAgICAgIHJldHVybiBfX2YxOworICAgIH0KKyAgICBkaWZmZXJlbmNlX3R5cGUgX19zejEgPSBfX3N6IC8gMjsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19zejIgPSBfX3N6IC0gX19zejE7CisgICAgX19ub2RlX3BvaW50ZXIgX190ID0gX1ZTVEQ6Om5leHQoaXRlcmF0b3IoX19mMSksIF9fc3oxIC0gMSkuX19nZXRfdW5zYWZlX25vZGVfcG9pbnRlcigpOworICAgIF9fbm9kZV9wb2ludGVyIF9fZjIgPSBfX3QtPl9fbmV4dF87CisgICAgX190LT5fX25leHRfID0gbnVsbHB0cjsKKyAgICByZXR1cm4gX19tZXJnZShfX3NvcnQoX19mMSwgX19zejEsIF9fY29tcCksCisgICAgICAgICAgICAgICAgICAgX19zb3J0KF9fZjIsIF9fc3oyLCBfX2NvbXApLCBfX2NvbXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjpyZXZlcnNlKCkgX05PRVhDRVBUCit7CisgICAgX19ub2RlX3BvaW50ZXIgX19wID0gYmFzZTo6X19iZWZvcmVfYmVnaW4oKS0+X19uZXh0XzsKKyAgICBpZiAoX19wICE9IG51bGxwdHIpCisgICAgeworICAgICAgICBfX25vZGVfcG9pbnRlciBfX2YgPSBfX3AtPl9fbmV4dF87CisgICAgICAgIF9fcC0+X19uZXh0XyA9IG51bGxwdHI7CisgICAgICAgIHdoaWxlIChfX2YgIT0gbnVsbHB0cikKKyAgICAgICAgeworICAgICAgICAgICAgX19ub2RlX3BvaW50ZXIgX190ID0gX19mLT5fX25leHRfOworICAgICAgICAgICAgX19mLT5fX25leHRfID0gX19wOworICAgICAgICAgICAgX19wID0gX19mOworICAgICAgICAgICAgX19mID0gX190OworICAgICAgICB9CisgICAgICAgIGJhc2U6Ol9fYmVmb3JlX2JlZ2luKCktPl9fbmV4dF8gPSBfX3A7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Citib29sIG9wZXJhdG9yPT0oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9feSkKK3sKKyAgICB0eXBlZGVmIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4gX0NwOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NwOjpjb25zdF9pdGVyYXRvciBfSXA7CisgICAgX0lwIF9faXggPSBfX3guYmVnaW4oKTsKKyAgICBfSXAgX19leCA9IF9feC5lbmQoKTsKKyAgICBfSXAgX19peSA9IF9feS5iZWdpbigpOworICAgIF9JcCBfX2V5ID0gX195LmVuZCgpOworICAgIGZvciAoOyBfX2l4ICE9IF9fZXggJiYgX19peSAhPSBfX2V5OyArK19faXgsICsrX19peSkKKyAgICAgICAgaWYgKCEoKl9faXggPT0gKl9faXkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAoX19peCA9PSBfX2V4KSA9PSAoX19peSA9PSBfX2V5KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX195KQoreworICAgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBvcGVyYXRvcjwgKGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX3kpCit7CisgICAgcmV0dXJuIF9WU1REOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZShfX3guYmVnaW4oKSwgX194LmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3kuYmVnaW4oKSwgX195LmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3I+IChjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX195KQoreworICAgIHJldHVybiBfX3kgPCBfX3g7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIG9wZXJhdG9yPj0oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPCBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBvcGVyYXRvcjw9KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX195IDwgX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3N3YXAoZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX194LCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgX05PRVhDRVBUXyhfTk9FWENFUFRfKF9feC5zd2FwKF9feSkpKQoreworICAgIF9feC5zd2FwKF9feSk7Cit9CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworX0xJQkNQUF9QT1BfTUFDUk9TCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9GT1JXQVJEX0xJU1QKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9mc3RyZWFtIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2ZzdHJlYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmNGNmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9mc3RyZWFtCkBAIC0wLDAgKzEsMTY2MSBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBmc3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9GU1RSRUFNCisjZGVmaW5lIF9MSUJDUFBfRlNUUkVBTQorCisvKgorICAgIGZzdHJlYW0gc3lub3BzaXMKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMgPSBjaGFyX3RyYWl0czxjaGFyVD4gPgorY2xhc3MgYmFzaWNfZmlsZWJ1ZgorICAgIDogcHVibGljIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyVCwgdHJhaXRzPgoreworcHVibGljOgorICAgIHR5cGVkZWYgY2hhclQgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIHRyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSBvZmZfdHlwZTsKKworICAgIC8vIDI3LjkuMS4yIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yOgorICAgIGJhc2ljX2ZpbGVidWYoKTsKKyAgICBiYXNpY19maWxlYnVmKGJhc2ljX2ZpbGVidWYmJiByaHMpOworICAgIHZpcnR1YWwgfmJhc2ljX2ZpbGVidWYoKTsKKworICAgIC8vIDI3LjkuMS4zIEFzc2lnbi9zd2FwOgorICAgIGJhc2ljX2ZpbGVidWYmIG9wZXJhdG9yPShiYXNpY19maWxlYnVmJiYgcmhzKTsKKyAgICB2b2lkIHN3YXAoYmFzaWNfZmlsZWJ1ZiYgcmhzKTsKKworICAgIC8vIDI3LjkuMS40IE1lbWJlcnM6CisgICAgYm9vbCBpc19vcGVuKCkgY29uc3Q7CisgICAgYmFzaWNfZmlsZWJ1Ziogb3Blbihjb25zdCBjaGFyKiBzLCBpb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSk7CisgICAgYmFzaWNfZmlsZWJ1Ziogb3Blbihjb25zdCBzdHJpbmcmIHMsIGlvc19iYXNlOjpvcGVubW9kZSBtb2RlKTsKKyAgICBiYXNpY19maWxlYnVmKiBjbG9zZSgpOworCitwcm90ZWN0ZWQ6CisgICAgLy8gMjcuOS4xLjUgT3ZlcnJpZGRlbiB2aXJ0dWFsIGZ1bmN0aW9uczoKKyAgICB2aXJ0dWFsIHN0cmVhbXNpemUgc2hvd21hbnljKCk7CisgICAgdmlydHVhbCBpbnRfdHlwZSB1bmRlcmZsb3coKTsKKyAgICB2aXJ0dWFsIGludF90eXBlIHVmbG93KCk7CisgICAgdmlydHVhbCBpbnRfdHlwZSBwYmFja2ZhaWwoaW50X3R5cGUgYyA9IHRyYWl0c190eXBlOjplb2YoKSk7CisgICAgdmlydHVhbCBpbnRfdHlwZSBvdmVyZmxvdyAoaW50X3R5cGUgYyA9IHRyYWl0c190eXBlOjplb2YoKSk7CisgICAgdmlydHVhbCBiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIHNldGJ1ZihjaGFyX3R5cGUqIHMsIHN0cmVhbXNpemUgbik7CisgICAgdmlydHVhbCBwb3NfdHlwZSBzZWVrb2ZmKG9mZl90eXBlIG9mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgd2F5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgd2hpY2ggPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyAgICB2aXJ0dWFsIHBvc190eXBlIHNlZWtwb3MocG9zX3R5cGUgc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSB3aGljaCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworICAgIHZpcnR1YWwgaW50IHN5bmMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW1idWUoY29uc3QgbG9jYWxlJiBsb2MpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgIHZvaWQKKyAgc3dhcChiYXNpY19maWxlYnVmPGNoYXJULCB0cmFpdHM+JiB4LCBiYXNpY19maWxlYnVmPGNoYXJULCB0cmFpdHM+JiB5KTsKKwordHlwZWRlZiBiYXNpY19maWxlYnVmPGNoYXI+ICAgIGZpbGVidWY7Cit0eXBlZGVmIGJhc2ljX2ZpbGVidWY8d2NoYXJfdD4gd2ZpbGVidWY7CisKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzID0gY2hhcl90cmFpdHM8Y2hhclQ+ID4KK2NsYXNzIGJhc2ljX2lmc3RyZWFtCisgICAgOiBwdWJsaWMgYmFzaWNfaXN0cmVhbTxjaGFyVCx0cmFpdHM+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBjaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgIHR5cGVkZWYgdHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIGludF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIHBvc190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlIG9mZl90eXBlOworCisgICAgYmFzaWNfaWZzdHJlYW0oKTsKKyAgICBleHBsaWNpdCBiYXNpY19pZnN0cmVhbShjb25zdCBjaGFyKiBzLCBpb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IGlvc19iYXNlOjppbik7CisgICAgZXhwbGljaXQgYmFzaWNfaWZzdHJlYW0oY29uc3Qgc3RyaW5nJiBzLCBpb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IGlvc19iYXNlOjppbik7CisgICAgYmFzaWNfaWZzdHJlYW0oYmFzaWNfaWZzdHJlYW0mJiByaHMpOworCisgICAgYmFzaWNfaWZzdHJlYW0mIG9wZXJhdG9yPShiYXNpY19pZnN0cmVhbSYmIHJocyk7CisgICAgdm9pZCBzd2FwKGJhc2ljX2lmc3RyZWFtJiByaHMpOworCisgICAgYmFzaWNfZmlsZWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiogcmRidWYoKSBjb25zdDsKKyAgICBib29sIGlzX29wZW4oKSBjb25zdDsKKyAgICB2b2lkIG9wZW4oY29uc3QgY2hhciogcywgaW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBpb3NfYmFzZTo6aW4pOworICAgIHZvaWQgb3Blbihjb25zdCBzdHJpbmcmIHMsIGlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gaW9zX2Jhc2U6OmluKTsKKyAgICB2b2lkIGNsb3NlKCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgdm9pZAorICBzd2FwKGJhc2ljX2lmc3RyZWFtPGNoYXJULCB0cmFpdHM+JiB4LCBiYXNpY19pZnN0cmVhbTxjaGFyVCwgdHJhaXRzPiYgeSk7CisKK3R5cGVkZWYgYmFzaWNfaWZzdHJlYW08Y2hhcj4gICAgaWZzdHJlYW07Cit0eXBlZGVmIGJhc2ljX2lmc3RyZWFtPHdjaGFyX3Q+IHdpZnN0cmVhbTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMgPSBjaGFyX3RyYWl0czxjaGFyVD4gPgorY2xhc3MgYmFzaWNfb2ZzdHJlYW0KKyAgICA6IHB1YmxpYyBiYXNpY19vc3RyZWFtPGNoYXJULHRyYWl0cz4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGNoYXJUICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiB0cmFpdHMgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgaW50X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cG9zX3R5cGUgcG9zX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgb2ZmX3R5cGU7CisKKyAgICBiYXNpY19vZnN0cmVhbSgpOworICAgIGV4cGxpY2l0IGJhc2ljX29mc3RyZWFtKGNvbnN0IGNoYXIqIHMsIGlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gaW9zX2Jhc2U6Om91dCk7CisgICAgZXhwbGljaXQgYmFzaWNfb2ZzdHJlYW0oY29uc3Qgc3RyaW5nJiBzLCBpb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IGlvc19iYXNlOjpvdXQpOworICAgIGJhc2ljX29mc3RyZWFtKGJhc2ljX29mc3RyZWFtJiYgcmhzKTsKKworICAgIGJhc2ljX29mc3RyZWFtJiBvcGVyYXRvcj0oYmFzaWNfb2ZzdHJlYW0mJiByaHMpOworICAgIHZvaWQgc3dhcChiYXNpY19vZnN0cmVhbSYgcmhzKTsKKworICAgIGJhc2ljX2ZpbGVidWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIHJkYnVmKCkgY29uc3Q7CisgICAgYm9vbCBpc19vcGVuKCkgY29uc3Q7CisgICAgdm9pZCBvcGVuKGNvbnN0IGNoYXIqIHMsIGlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gaW9zX2Jhc2U6Om91dCk7CisgICAgdm9pZCBvcGVuKGNvbnN0IHN0cmluZyYgcywgaW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBpb3NfYmFzZTo6b3V0KTsKKyAgICB2b2lkIGNsb3NlKCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgdm9pZAorICBzd2FwKGJhc2ljX29mc3RyZWFtPGNoYXJULCB0cmFpdHM+JiB4LCBiYXNpY19vZnN0cmVhbTxjaGFyVCwgdHJhaXRzPiYgeSk7CisKK3R5cGVkZWYgYmFzaWNfb2ZzdHJlYW08Y2hhcj4gICAgb2ZzdHJlYW07Cit0eXBlZGVmIGJhc2ljX29mc3RyZWFtPHdjaGFyX3Q+IHdvZnN0cmVhbTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM9Y2hhcl90cmFpdHM8Y2hhclQ+ID4KK2NsYXNzIGJhc2ljX2ZzdHJlYW0KKyAgICA6IHB1YmxpYyBiYXNpY19pb3N0cmVhbTxjaGFyVCx0cmFpdHM+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBjaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgIHR5cGVkZWYgdHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIGludF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIHBvc190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlIG9mZl90eXBlOworCisgICAgYmFzaWNfZnN0cmVhbSgpOworICAgIGV4cGxpY2l0IGJhc2ljX2ZzdHJlYW0oY29uc3QgY2hhciogcywgaW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBpb3NfYmFzZTo6aW58aW9zX2Jhc2U6Om91dCk7CisgICAgZXhwbGljaXQgYmFzaWNfZnN0cmVhbShjb25zdCBzdHJpbmcmIHMsIGlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gaW9zX2Jhc2U6OmlufGlvc19iYXNlOjpvdXQpOworICAgIGJhc2ljX2ZzdHJlYW0oYmFzaWNfZnN0cmVhbSYmIHJocyk7CisKKyAgICBiYXNpY19mc3RyZWFtJiBvcGVyYXRvcj0oYmFzaWNfZnN0cmVhbSYmIHJocyk7CisgICAgdm9pZCBzd2FwKGJhc2ljX2ZzdHJlYW0mIHJocyk7CisKKyAgICBiYXNpY19maWxlYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiByZGJ1ZigpIGNvbnN0OworICAgIGJvb2wgaXNfb3BlbigpIGNvbnN0OworICAgIHZvaWQgb3Blbihjb25zdCBjaGFyKiBzLCBpb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IGlvc19iYXNlOjppbnxpb3NfYmFzZTo6b3V0KTsKKyAgICB2b2lkIG9wZW4oY29uc3Qgc3RyaW5nJiBzLCBpb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IGlvc19iYXNlOjppbnxpb3NfYmFzZTo6b3V0KTsKKyAgICB2b2lkIGNsb3NlKCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgdm9pZCBzd2FwKGJhc2ljX2ZzdHJlYW08Y2hhclQsIHRyYWl0cz4mIHgsIGJhc2ljX2ZzdHJlYW08Y2hhclQsIHRyYWl0cz4mIHkpOworCit0eXBlZGVmIGJhc2ljX2ZzdHJlYW08Y2hhcj4gICAgZnN0cmVhbTsKK3R5cGVkZWYgYmFzaWNfZnN0cmVhbTx3Y2hhcl90PiB3ZnN0cmVhbTsKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPGlzdHJlYW0+CisjaW5jbHVkZSA8X19sb2NhbGU+CisjaW5jbHVkZSA8Y3N0ZGlvPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9QVVNIX01BQ1JPUworI2luY2x1ZGUgPF9fdW5kZWZfbWFjcm9zPgorCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYmFzaWNfZmlsZWJ1ZgorICAgIDogcHVibGljIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSAgIGludF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlICAgcG9zX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgICBvZmZfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpzdGF0ZV90eXBlIHN0YXRlX3R5cGU7CisKKyAgICAvLyAyNy45LjEuMiBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcjoKKyAgICBiYXNpY19maWxlYnVmKCk7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIGJhc2ljX2ZpbGVidWYoYmFzaWNfZmlsZWJ1ZiYmIF9fcmhzKTsKKyNlbmRpZgorICAgIHZpcnR1YWwgfmJhc2ljX2ZpbGVidWYoKTsKKworICAgIC8vIDI3LjkuMS4zIEFzc2lnbi9zd2FwOgorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfZmlsZWJ1ZiYgb3BlcmF0b3I9KGJhc2ljX2ZpbGVidWYmJiBfX3Jocyk7CisjZW5kaWYKKyAgICB2b2lkIHN3YXAoYmFzaWNfZmlsZWJ1ZiYgX19yaHMpOworCisgICAgLy8gMjcuOS4xLjQgTWVtYmVyczoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBpc19vcGVuKCkgY29uc3Q7CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0dMT0JBTF9GSUxFU1lTVEVNX05BTUVTUEFDRQorICAgIGJhc2ljX2ZpbGVidWYqIG9wZW4oY29uc3QgY2hhciogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKTsKKyNpZmRlZiBfTElCQ1BQX0hBU19PUEVOX1dJVEhfV0NIQVIKKyAgICBiYXNpY19maWxlYnVmKiBvcGVuKGNvbnN0IHdjaGFyX3QqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSk7CisjZW5kaWYKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfZmlsZWJ1Ziogb3Blbihjb25zdCBzdHJpbmcmIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSk7CisjZW5kaWYKKyAgICBiYXNpY19maWxlYnVmKiBjbG9zZSgpOworCitwcm90ZWN0ZWQ6CisgICAgLy8gMjcuOS4xLjUgT3ZlcnJpZGRlbiB2aXJ0dWFsIGZ1bmN0aW9uczoKKyAgICB2aXJ0dWFsIGludF90eXBlIHVuZGVyZmxvdygpOworICAgIHZpcnR1YWwgaW50X3R5cGUgcGJhY2tmYWlsKGludF90eXBlIF9fYyA9IHRyYWl0c190eXBlOjplb2YoKSk7CisgICAgdmlydHVhbCBpbnRfdHlwZSBvdmVyZmxvdyAoaW50X3R5cGUgX19jID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKKyAgICB2aXJ0dWFsIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiogc2V0YnVmKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbik7CisgICAgdmlydHVhbCBwb3NfdHlwZSBzZWVrb2ZmKG9mZl90eXBlIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX3dheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fd2NoID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CisgICAgdmlydHVhbCBwb3NfdHlwZSBzZWVrcG9zKHBvc190eXBlIF9fc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX3djaCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworICAgIHZpcnR1YWwgaW50IHN5bmMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW1idWUoY29uc3QgbG9jYWxlJiBfX2xvYyk7CisKK3ByaXZhdGU6CisgICAgY2hhciogICAgICAgX19leHRidWZfOworICAgIGNvbnN0IGNoYXIqIF9fZXh0YnVmbmV4dF87CisgICAgY29uc3QgY2hhciogX19leHRidWZlbmRfOworICAgIGNoYXIgX19leHRidWZfbWluX1s4XTsKKyAgICBzaXplX3QgX19lYnNfOworICAgIGNoYXJfdHlwZSogX19pbnRidWZfOworICAgIHNpemVfdCBfX2lic187CisgICAgRklMRSogX19maWxlXzsKKyAgICBjb25zdCBjb2RlY3Z0PGNoYXJfdHlwZSwgY2hhciwgc3RhdGVfdHlwZT4qIF9fY3ZfOworICAgIHN0YXRlX3R5cGUgX19zdF87CisgICAgc3RhdGVfdHlwZSBfX3N0X2xhc3RfOworICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX29tXzsKKyAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19jbV87CisgICAgYm9vbCBfX293bnNfZWJfOworICAgIGJvb2wgX19vd25zX2liXzsKKyAgICBib29sIF9fYWx3YXlzX25vY29udl87CisKKyAgICBib29sIF9fcmVhZF9tb2RlKCk7CisgICAgdm9pZCBfX3dyaXRlX21vZGUoKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OmJhc2ljX2ZpbGVidWYoKQorICAgIDogX19leHRidWZfKDApLAorICAgICAgX19leHRidWZuZXh0XygwKSwKKyAgICAgIF9fZXh0YnVmZW5kXygwKSwKKyAgICAgIF9fZWJzXygwKSwKKyAgICAgIF9faW50YnVmXygwKSwKKyAgICAgIF9faWJzXygwKSwKKyAgICAgIF9fZmlsZV8oMCksCisgICAgICBfX2N2XyhudWxscHRyKSwKKyAgICAgIF9fc3RfKCksCisgICAgICBfX3N0X2xhc3RfKCksCisgICAgICBfX29tXygwKSwKKyAgICAgIF9fY21fKDApLAorICAgICAgX19vd25zX2ViXyhmYWxzZSksCisgICAgICBfX293bnNfaWJfKGZhbHNlKSwKKyAgICAgIF9fYWx3YXlzX25vY29udl8oZmFsc2UpCit7CisgICAgaWYgKGhhc19mYWNldDxjb2RlY3Z0PGNoYXJfdHlwZSwgY2hhciwgc3RhdGVfdHlwZT4gPih0aGlzLT5nZXRsb2MoKSkpCisgICAgeworICAgICAgICBfX2N2XyA9ICZ1c2VfZmFjZXQ8Y29kZWN2dDxjaGFyX3R5cGUsIGNoYXIsIHN0YXRlX3R5cGU+ID4odGhpcy0+Z2V0bG9jKCkpOworICAgICAgICBfX2Fsd2F5c19ub2NvbnZfID0gX19jdl8tPmFsd2F5c19ub2NvbnYoKTsKKyAgICB9CisgICAgc2V0YnVmKDAsIDQwOTYpOworfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpiYXNpY19maWxlYnVmKGJhc2ljX2ZpbGVidWYmJiBfX3JocykKKyAgICA6IGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KF9fcmhzKQoreworICAgIGlmIChfX3Jocy5fX2V4dGJ1Zl8gPT0gX19yaHMuX19leHRidWZfbWluXykKKyAgICB7CisgICAgICAgIF9fZXh0YnVmXyA9IF9fZXh0YnVmX21pbl87CisgICAgICAgIF9fZXh0YnVmbmV4dF8gPSBfX2V4dGJ1Zl8gKyAoX19yaHMuX19leHRidWZuZXh0XyAtIF9fcmhzLl9fZXh0YnVmXyk7CisgICAgICAgIF9fZXh0YnVmZW5kXyA9IF9fZXh0YnVmXyArIChfX3Jocy5fX2V4dGJ1ZmVuZF8gLSBfX3Jocy5fX2V4dGJ1Zl8pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfX2V4dGJ1Zl8gPSBfX3Jocy5fX2V4dGJ1Zl87CisgICAgICAgIF9fZXh0YnVmbmV4dF8gPSBfX3Jocy5fX2V4dGJ1Zm5leHRfOworICAgICAgICBfX2V4dGJ1ZmVuZF8gPSBfX3Jocy5fX2V4dGJ1ZmVuZF87CisgICAgfQorICAgIF9fZWJzXyA9IF9fcmhzLl9fZWJzXzsKKyAgICBfX2ludGJ1Zl8gPSBfX3Jocy5fX2ludGJ1Zl87CisgICAgX19pYnNfID0gX19yaHMuX19pYnNfOworICAgIF9fZmlsZV8gPSBfX3Jocy5fX2ZpbGVfOworICAgIF9fY3ZfID0gX19yaHMuX19jdl87CisgICAgX19zdF8gPSBfX3Jocy5fX3N0XzsKKyAgICBfX3N0X2xhc3RfID0gX19yaHMuX19zdF9sYXN0XzsKKyAgICBfX29tXyA9IF9fcmhzLl9fb21fOworICAgIF9fY21fID0gX19yaHMuX19jbV87CisgICAgX19vd25zX2ViXyA9IF9fcmhzLl9fb3duc19lYl87CisgICAgX19vd25zX2liXyA9IF9fcmhzLl9fb3duc19pYl87CisgICAgX19hbHdheXNfbm9jb252XyA9IF9fcmhzLl9fYWx3YXlzX25vY29udl87CisgICAgaWYgKF9fcmhzLnBiYXNlKCkpCisgICAgeworICAgICAgICBpZiAoX19yaHMucGJhc2UoKSA9PSBfX3Jocy5fX2ludGJ1Zl8pCisgICAgICAgICAgICB0aGlzLT5zZXRwKF9faW50YnVmXywgX19pbnRidWZfICsgKF9fcmhzLiBlcHB0cigpIC0gX19yaHMucGJhc2UoKSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aGlzLT5zZXRwKChjaGFyX3R5cGUqKV9fZXh0YnVmXywKKyAgICAgICAgICAgICAgICAgICAgICAgKGNoYXJfdHlwZSopX19leHRidWZfICsgKF9fcmhzLiBlcHB0cigpIC0gX19yaHMucGJhc2UoKSkpOworICAgICAgICB0aGlzLT5fX3BidW1wKF9fcmhzLiBwcHRyKCkgLSBfX3Jocy5wYmFzZSgpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoX19yaHMuZWJhY2soKSkKKyAgICB7CisgICAgICAgIGlmIChfX3Jocy5lYmFjaygpID09IF9fcmhzLl9faW50YnVmXykKKyAgICAgICAgICAgIHRoaXMtPnNldGcoX19pbnRidWZfLCBfX2ludGJ1Zl8gKyAoX19yaHMuZ3B0cigpIC0gX19yaHMuZWJhY2soKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pbnRidWZfICsgKF9fcmhzLmVncHRyKCkgLSBfX3Jocy5lYmFjaygpKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMtPnNldGcoKGNoYXJfdHlwZSopX19leHRidWZfLAorICAgICAgICAgICAgICAgICAgICAgICAoY2hhcl90eXBlKilfX2V4dGJ1Zl8gKyAoX19yaHMuZ3B0cigpIC0gX19yaHMuZWJhY2soKSksCisgICAgICAgICAgICAgICAgICAgICAgIChjaGFyX3R5cGUqKV9fZXh0YnVmXyArIChfX3Jocy5lZ3B0cigpIC0gX19yaHMuZWJhY2soKSkpOworICAgIH0KKyAgICBfX3Jocy5fX2V4dGJ1Zl8gPSAwOworICAgIF9fcmhzLl9fZXh0YnVmbmV4dF8gPSAwOworICAgIF9fcmhzLl9fZXh0YnVmZW5kXyA9IDA7CisgICAgX19yaHMuX19lYnNfID0gMDsKKyAgICBfX3Jocy5fX2ludGJ1Zl8gPSAwOworICAgIF9fcmhzLl9faWJzXyA9IDA7CisgICAgX19yaHMuX19maWxlXyA9IDA7CisgICAgX19yaHMuX19zdF8gPSBzdGF0ZV90eXBlKCk7CisgICAgX19yaHMuX19zdF9sYXN0XyA9IHN0YXRlX3R5cGUoKTsKKyAgICBfX3Jocy5fX29tXyA9IDA7CisgICAgX19yaHMuX19jbV8gPSAwOworICAgIF9fcmhzLl9fb3duc19lYl8gPSBmYWxzZTsKKyAgICBfX3Jocy5fX293bnNfaWJfID0gZmFsc2U7CisgICAgX19yaHMuc2V0ZygwLCAwLCAwKTsKKyAgICBfX3Jocy5zZXRwKDAsIDApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lCitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPShiYXNpY19maWxlYnVmJiYgX19yaHMpCit7CisgICAgY2xvc2UoKTsKKyAgICBzd2FwKF9fcmhzKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46On5iYXNpY19maWxlYnVmKCkKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgY2xvc2UoKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgaWYgKF9fb3duc19lYl8pCisgICAgICAgIGRlbGV0ZSBbXSBfX2V4dGJ1Zl87CisgICAgaWYgKF9fb3duc19pYl8pCisgICAgICAgIGRlbGV0ZSBbXSBfX2ludGJ1Zl87Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OnN3YXAoYmFzaWNfZmlsZWJ1ZiYgX19yaHMpCit7CisgICAgYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+Ojpzd2FwKF9fcmhzKTsKKyAgICBpZiAoX19leHRidWZfICE9IF9fZXh0YnVmX21pbl8gJiYgX19yaHMuX19leHRidWZfICE9IF9fcmhzLl9fZXh0YnVmX21pbl8pCisgICAgeworICAgICAgICBfVlNURDo6c3dhcChfX2V4dGJ1Zl8sIF9fcmhzLl9fZXh0YnVmXyk7CisgICAgICAgIF9WU1REOjpzd2FwKF9fZXh0YnVmbmV4dF8sIF9fcmhzLl9fZXh0YnVmbmV4dF8pOworICAgICAgICBfVlNURDo6c3dhcChfX2V4dGJ1ZmVuZF8sIF9fcmhzLl9fZXh0YnVmZW5kXyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHB0cmRpZmZfdCBfX2xuID0gX19leHRidWZuZXh0XyAtIF9fZXh0YnVmXzsKKyAgICAgICAgcHRyZGlmZl90IF9fbGUgPSBfX2V4dGJ1ZmVuZF8gLSBfX2V4dGJ1Zl87CisgICAgICAgIHB0cmRpZmZfdCBfX3JuID0gX19yaHMuX19leHRidWZuZXh0XyAtIF9fcmhzLl9fZXh0YnVmXzsKKyAgICAgICAgcHRyZGlmZl90IF9fcmUgPSBfX3Jocy5fX2V4dGJ1ZmVuZF8gLSBfX3Jocy5fX2V4dGJ1Zl87CisgICAgICAgIGlmIChfX2V4dGJ1Zl8gPT0gX19leHRidWZfbWluXyAmJiBfX3Jocy5fX2V4dGJ1Zl8gIT0gX19yaHMuX19leHRidWZfbWluXykKKyAgICAgICAgeworICAgICAgICAgICAgX19leHRidWZfID0gX19yaHMuX19leHRidWZfOworICAgICAgICAgICAgX19yaHMuX19leHRidWZfID0gX19yaHMuX19leHRidWZfbWluXzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChfX2V4dGJ1Zl8gIT0gX19leHRidWZfbWluXyAmJiBfX3Jocy5fX2V4dGJ1Zl8gPT0gX19yaHMuX19leHRidWZfbWluXykKKyAgICAgICAgeworICAgICAgICAgICAgX19yaHMuX19leHRidWZfID0gX19leHRidWZfOworICAgICAgICAgICAgX19leHRidWZfID0gX19leHRidWZfbWluXzsKKyAgICAgICAgfQorICAgICAgICBfX2V4dGJ1Zm5leHRfID0gX19leHRidWZfICsgX19ybjsKKyAgICAgICAgX19leHRidWZlbmRfID0gX19leHRidWZfICsgX19yZTsKKyAgICAgICAgX19yaHMuX19leHRidWZuZXh0XyA9IF9fcmhzLl9fZXh0YnVmXyArIF9fbG47CisgICAgICAgIF9fcmhzLl9fZXh0YnVmZW5kXyA9IF9fcmhzLl9fZXh0YnVmXyArIF9fbGU7CisgICAgfQorICAgIF9WU1REOjpzd2FwKF9fZWJzXywgX19yaHMuX19lYnNfKTsKKyAgICBfVlNURDo6c3dhcChfX2ludGJ1Zl8sIF9fcmhzLl9faW50YnVmXyk7CisgICAgX1ZTVEQ6OnN3YXAoX19pYnNfLCBfX3Jocy5fX2lic18pOworICAgIF9WU1REOjpzd2FwKF9fZmlsZV8sIF9fcmhzLl9fZmlsZV8pOworICAgIF9WU1REOjpzd2FwKF9fY3ZfLCBfX3Jocy5fX2N2Xyk7CisgICAgX1ZTVEQ6OnN3YXAoX19zdF8sIF9fcmhzLl9fc3RfKTsKKyAgICBfVlNURDo6c3dhcChfX3N0X2xhc3RfLCBfX3Jocy5fX3N0X2xhc3RfKTsKKyAgICBfVlNURDo6c3dhcChfX29tXywgX19yaHMuX19vbV8pOworICAgIF9WU1REOjpzd2FwKF9fY21fLCBfX3Jocy5fX2NtXyk7CisgICAgX1ZTVEQ6OnN3YXAoX19vd25zX2ViXywgX19yaHMuX19vd25zX2ViXyk7CisgICAgX1ZTVEQ6OnN3YXAoX19vd25zX2liXywgX19yaHMuX19vd25zX2liXyk7CisgICAgX1ZTVEQ6OnN3YXAoX19hbHdheXNfbm9jb252XywgX19yaHMuX19hbHdheXNfbm9jb252Xyk7CisgICAgaWYgKHRoaXMtPmViYWNrKCkgPT0gKGNoYXJfdHlwZSopX19yaHMuX19leHRidWZfbWluXykKKyAgICB7CisgICAgICAgIHB0cmRpZmZfdCBfX24gPSB0aGlzLT5ncHRyKCkgLSB0aGlzLT5lYmFjaygpOworICAgICAgICBwdHJkaWZmX3QgX19lID0gdGhpcy0+ZWdwdHIoKSAtIHRoaXMtPmViYWNrKCk7CisgICAgICAgIHRoaXMtPnNldGcoKGNoYXJfdHlwZSopX19leHRidWZfbWluXywKKyAgICAgICAgICAgICAgICAgICAoY2hhcl90eXBlKilfX2V4dGJ1Zl9taW5fICsgX19uLAorICAgICAgICAgICAgICAgICAgIChjaGFyX3R5cGUqKV9fZXh0YnVmX21pbl8gKyBfX2UpOworICAgIH0KKyAgICBlbHNlIGlmICh0aGlzLT5wYmFzZSgpID09IChjaGFyX3R5cGUqKV9fcmhzLl9fZXh0YnVmX21pbl8pCisgICAgeworICAgICAgICBwdHJkaWZmX3QgX19uID0gdGhpcy0+cHB0cigpIC0gdGhpcy0+cGJhc2UoKTsKKyAgICAgICAgcHRyZGlmZl90IF9fZSA9IHRoaXMtPmVwcHRyKCkgLSB0aGlzLT5wYmFzZSgpOworICAgICAgICB0aGlzLT5zZXRwKChjaGFyX3R5cGUqKV9fZXh0YnVmX21pbl8sCisgICAgICAgICAgICAgICAgICAgKGNoYXJfdHlwZSopX19leHRidWZfbWluXyArIF9fZSk7CisgICAgICAgIHRoaXMtPl9fcGJ1bXAoX19uKTsKKyAgICB9CisgICAgaWYgKF9fcmhzLmViYWNrKCkgPT0gKGNoYXJfdHlwZSopX19leHRidWZfbWluXykKKyAgICB7CisgICAgICAgIHB0cmRpZmZfdCBfX24gPSBfX3Jocy5ncHRyKCkgLSBfX3Jocy5lYmFjaygpOworICAgICAgICBwdHJkaWZmX3QgX19lID0gX19yaHMuZWdwdHIoKSAtIF9fcmhzLmViYWNrKCk7CisgICAgICAgIF9fcmhzLnNldGcoKGNoYXJfdHlwZSopX19yaHMuX19leHRidWZfbWluXywKKyAgICAgICAgICAgICAgICAgICAoY2hhcl90eXBlKilfX3Jocy5fX2V4dGJ1Zl9taW5fICsgX19uLAorICAgICAgICAgICAgICAgICAgIChjaGFyX3R5cGUqKV9fcmhzLl9fZXh0YnVmX21pbl8gKyBfX2UpOworICAgIH0KKyAgICBlbHNlIGlmIChfX3Jocy5wYmFzZSgpID09IChjaGFyX3R5cGUqKV9fZXh0YnVmX21pbl8pCisgICAgeworICAgICAgICBwdHJkaWZmX3QgX19uID0gX19yaHMucHB0cigpIC0gX19yaHMucGJhc2UoKTsKKyAgICAgICAgcHRyZGlmZl90IF9fZSA9IF9fcmhzLmVwcHRyKCkgLSBfX3Jocy5wYmFzZSgpOworICAgICAgICBfX3Jocy5zZXRwKChjaGFyX3R5cGUqKV9fcmhzLl9fZXh0YnVmX21pbl8sCisgICAgICAgICAgICAgICAgICAgKGNoYXJfdHlwZSopX19yaHMuX19leHRidWZfbWluXyArIF9fZSk7CisgICAgICAgIF9fcmhzLl9fcGJ1bXAoX19uKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4mIF9feCwgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+JiBfX3kpCit7CisgICAgX194LnN3YXAoX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZQorYm9vbAorYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+Ojppc19vcGVuKCkgY29uc3QKK3sKKyAgICByZXR1cm4gX19maWxlXyAhPSAwOworfQorCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0dMT0JBTF9GSUxFU1lTVEVNX05BTUVTUEFDRQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPioKK2Jhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6b3Blbihjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCit7CisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3J0ID0gMDsKKyAgICBpZiAoX19maWxlXyA9PSAwKQorICAgIHsKKyAgICAgICAgX19ydCA9IHRoaXM7CisgICAgICAgIGNvbnN0IGNoYXIqIF9fbWRzdHI7CisgICAgICAgIHN3aXRjaCAoX19tb2RlICYgfmlvc19iYXNlOjphdGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBpb3NfYmFzZTo6b3V0OgorICAgICAgICBjYXNlIGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6dHJ1bmM6CisgICAgICAgICAgICBfX21kc3RyID0gInciOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjphcHA6CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6OmFwcDoKKyAgICAgICAgICAgIF9fbWRzdHIgPSAiYSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBpb3NfYmFzZTo6aW46CisgICAgICAgICAgICBfX21kc3RyID0gInIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dDoKKyAgICAgICAgICAgIF9fbWRzdHIgPSAicisiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjp0cnVuYzoKKyAgICAgICAgICAgIF9fbWRzdHIgPSAidysiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjphcHA6CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6OmFwcDoKKyAgICAgICAgICAgIF9fbWRzdHIgPSAiYSsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjpiaW5hcnk6CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjp0cnVuYyB8IGlvc19iYXNlOjpiaW5hcnk6CisgICAgICAgICAgICBfX21kc3RyID0gIndiIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6YXBwIHwgaW9zX2Jhc2U6OmJpbmFyeToKKyAgICAgICAgY2FzZSBpb3NfYmFzZTo6YXBwIHwgaW9zX2Jhc2U6OmJpbmFyeToKKyAgICAgICAgICAgIF9fbWRzdHIgPSAiYWIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6OmJpbmFyeToKKyAgICAgICAgICAgIF9fbWRzdHIgPSAicmIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjpiaW5hcnk6CisgICAgICAgICAgICBfX21kc3RyID0gInIrYiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0IHwgaW9zX2Jhc2U6OnRydW5jIHwgaW9zX2Jhc2U6OmJpbmFyeToKKyAgICAgICAgICAgIF9fbWRzdHIgPSAidytiIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6YXBwIHwgaW9zX2Jhc2U6OmJpbmFyeToKKyAgICAgICAgY2FzZSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6YXBwIHwgaW9zX2Jhc2U6OmJpbmFyeToKKyAgICAgICAgICAgIF9fbWRzdHIgPSAiYStiIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgX19ydCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19ydCkKKyAgICAgICAgeworICAgICAgICAgICAgX19maWxlXyA9IGZvcGVuKF9fcywgX19tZHN0cik7CisgICAgICAgICAgICBpZiAoX19maWxlXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX29tXyA9IF9fbW9kZTsKKyAgICAgICAgICAgICAgICBpZiAoX19tb2RlICYgaW9zX2Jhc2U6OmF0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmc2VlayhfX2ZpbGVfLCAwLCBTRUVLX0VORCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjbG9zZShfX2ZpbGVfKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZmlsZV8gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgX19ydCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX19ydCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fcnQ7Cit9CisKKyNpZmRlZiBfTElCQ1BQX0hBU19PUEVOX1dJVEhfV0NIQVIKKy8vIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIHRoZSBjaGFyKiBvdmVybG9hZCBleGNlcHQgdGhhdCBpdCB1c2VzIF93Zm9wZW4KKy8vIGFuZCBsb25nIG1vZGUgc3RyaW5ncy4KK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4qCitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Om9wZW4oY29uc3Qgd2NoYXJfdCogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQoreworICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPiogX19ydCA9IDA7CisgICAgaWYgKF9fZmlsZV8gPT0gMCkKKyAgICB7CisgICAgICAgIF9fcnQgPSB0aGlzOworICAgICAgICBjb25zdCB3Y2hhcl90KiBfX21kc3RyOworICAgICAgICBzd2l0Y2ggKF9fbW9kZSAmIH5pb3NfYmFzZTo6YXRlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6Om91dDoKKyAgICAgICAgY2FzZSBpb3NfYmFzZTo6b3V0IHwgaW9zX2Jhc2U6OnRydW5jOgorICAgICAgICAgICAgX19tZHN0ciA9IEwidyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBpb3NfYmFzZTo6b3V0IHwgaW9zX2Jhc2U6OmFwcDoKKyAgICAgICAgY2FzZSBpb3NfYmFzZTo6YXBwOgorICAgICAgICAgICAgX19tZHN0ciA9IEwiYSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBpb3NfYmFzZTo6aW46CisgICAgICAgICAgICBfX21kc3RyID0gTCJyIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQ6CisgICAgICAgICAgICBfX21kc3RyID0gTCJyKyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0IHwgaW9zX2Jhc2U6OnRydW5jOgorICAgICAgICAgICAgX19tZHN0ciA9IEwidysiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjphcHA6CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6OmFwcDoKKyAgICAgICAgICAgIF9fbWRzdHIgPSBMImErIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6YmluYXJ5OgorICAgICAgICBjYXNlIGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6dHJ1bmMgfCBpb3NfYmFzZTo6YmluYXJ5OgorICAgICAgICAgICAgX19tZHN0ciA9IEwid2IiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjphcHAgfCBpb3NfYmFzZTo6YmluYXJ5OgorICAgICAgICBjYXNlIGlvc19iYXNlOjphcHAgfCBpb3NfYmFzZTo6YmluYXJ5OgorICAgICAgICAgICAgX19tZHN0ciA9IEwiYWIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6OmJpbmFyeToKKyAgICAgICAgICAgIF9fbWRzdHIgPSBMInJiIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6YmluYXJ5OgorICAgICAgICAgICAgX19tZHN0ciA9IEwicitiIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6dHJ1bmMgfCBpb3NfYmFzZTo6YmluYXJ5OgorICAgICAgICAgICAgX19tZHN0ciA9IEwidytiIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6YXBwIHwgaW9zX2Jhc2U6OmJpbmFyeToKKyAgICAgICAgY2FzZSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6YXBwIHwgaW9zX2Jhc2U6OmJpbmFyeToKKyAgICAgICAgICAgIF9fbWRzdHIgPSBMImErYiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIF9fcnQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fZmlsZV8gPSBfd2ZvcGVuKF9fcywgX19tZHN0cik7CisgICAgICAgICAgICBpZiAoX19maWxlXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX29tXyA9IF9fbW9kZTsKKyAgICAgICAgICAgICAgICBpZiAoX19tb2RlICYgaW9zX2Jhc2U6OmF0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmc2VlayhfX2ZpbGVfLCAwLCBTRUVLX0VORCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjbG9zZShfX2ZpbGVfKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZmlsZV8gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgX19ydCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX19ydCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fcnQ7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZQorYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KgorYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpvcGVuKGNvbnN0IHN0cmluZyYgX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQoreworICAgIHJldHVybiBvcGVuKF9fcy5jX3N0cigpLCBfX21vZGUpOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4qCitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OmNsb3NlKCkKK3sKKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fcnQgPSAwOworICAgIGlmIChfX2ZpbGVfKQorICAgIHsKKyAgICAgICAgX19ydCA9IHRoaXM7CisgICAgICAgIHVuaXF1ZV9wdHI8RklMRSwgaW50KCopKEZJTEUqKT4gX19oKF9fZmlsZV8sIGZjbG9zZSk7CisgICAgICAgIGlmIChzeW5jKCkpCisgICAgICAgICAgICBfX3J0ID0gMDsKKyAgICAgICAgaWYgKGZjbG9zZShfX2gucmVsZWFzZSgpKSA9PSAwKQorICAgICAgICAgICAgX19maWxlXyA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fcnQgPSAwOworICAgIH0KKyAgICByZXR1cm4gX19ydDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3R5cGVuYW1lIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUKK2Jhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6dW5kZXJmbG93KCkKK3sKKyAgICBpZiAoX19maWxlXyA9PSAwKQorICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgIGJvb2wgX19pbml0aWFsID0gX19yZWFkX21vZGUoKTsKKyAgICBjaGFyX3R5cGUgX18xYnVmOworICAgIGlmICh0aGlzLT5ncHRyKCkgPT0gMCkKKyAgICAgICAgdGhpcy0+c2V0ZygmX18xYnVmLCAmX18xYnVmKzEsICZfXzFidWYrMSk7CisgICAgY29uc3Qgc2l6ZV90IF9fdW5nZXRfc3ogPSBfX2luaXRpYWwgPyAwIDogbWluPHNpemVfdD4oKHRoaXMtPmVncHRyKCkgLSB0aGlzLT5lYmFjaygpKSAvIDIsIDQpOworICAgIGludF90eXBlIF9fYyA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICBpZiAodGhpcy0+Z3B0cigpID09IHRoaXMtPmVncHRyKCkpCisgICAgeworICAgICAgICBtZW1tb3ZlKHRoaXMtPmViYWNrKCksIHRoaXMtPmVncHRyKCkgLSBfX3VuZ2V0X3N6LCBfX3VuZ2V0X3N6ICogc2l6ZW9mKGNoYXJfdHlwZSkpOworICAgICAgICBpZiAoX19hbHdheXNfbm9jb252XykKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IF9fbm1lbWIgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHRoaXMtPmVncHRyKCkgLSB0aGlzLT5lYmFjaygpIC0gX191bmdldF9zeik7CisgICAgICAgICAgICBfX25tZW1iID0gZnJlYWQodGhpcy0+ZWJhY2soKSArIF9fdW5nZXRfc3osIDEsIF9fbm1lbWIsIF9fZmlsZV8pOworICAgICAgICAgICAgaWYgKF9fbm1lbWIgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT5zZXRnKHRoaXMtPmViYWNrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5lYmFjaygpICsgX191bmdldF9zeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmViYWNrKCkgKyBfX3VuZ2V0X3N6ICsgX19ubWVtYik7CisgICAgICAgICAgICAgICAgX19jID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCp0aGlzLT5ncHRyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX0xJQkNQUF9BU1NFUlQgKCAhKF9fZXh0YnVmbmV4dF8gPT0gTlVMTCAmJiAoX19leHRidWZlbmRfICE9IF9fZXh0YnVmbmV4dF8pKSwgInVuZGVyZmxvdyBtb3ZpbmcgZnJvbSBOVUxMIiApOworICAgICAgICAgICAgaWYgKF9fZXh0YnVmZW5kXyAhPSBfX2V4dGJ1Zm5leHRfKQorICAgICAgICAgICAgICAgIG1lbW1vdmUoX19leHRidWZfLCBfX2V4dGJ1Zm5leHRfLCBfX2V4dGJ1ZmVuZF8gLSBfX2V4dGJ1Zm5leHRfKTsKKyAgICAgICAgICAgIF9fZXh0YnVmbmV4dF8gPSBfX2V4dGJ1Zl8gKyAoX19leHRidWZlbmRfIC0gX19leHRidWZuZXh0Xyk7CisgICAgICAgICAgICBfX2V4dGJ1ZmVuZF8gPSBfX2V4dGJ1Zl8gKyAoX19leHRidWZfID09IF9fZXh0YnVmX21pbl8gPyBzaXplb2YoX19leHRidWZfbWluXykgOiBfX2Vic18pOworICAgICAgICAgICAgc2l6ZV90IF9fbm1lbWIgPSBfVlNURDo6bWluKHN0YXRpY19jYXN0PHNpemVfdD4oX19pYnNfIC0gX191bmdldF9zeiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fZXh0YnVmZW5kXyAtIF9fZXh0YnVmbmV4dF8pKTsKKyAgICAgICAgICAgIGNvZGVjdnRfYmFzZTo6cmVzdWx0IF9fcjsKKyAgICAgICAgICAgIF9fc3RfbGFzdF8gPSBfX3N0XzsKKyAgICAgICAgICAgIHNpemVfdCBfX25yID0gZnJlYWQoKHZvaWQqKSBjb25zdF9jYXN0PGNoYXIgKj4oX19leHRidWZuZXh0XyksIDEsIF9fbm1lbWIsIF9fZmlsZV8pOworICAgICAgICAgICAgaWYgKF9fbnIgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIV9fY3ZfKQorICAgICAgICAgICAgICAgICAgICBfX3Rocm93X2JhZF9jYXN0KCk7CisKKyAgICAgICAgICAgICAgICBfX2V4dGJ1ZmVuZF8gPSBfX2V4dGJ1Zm5leHRfICsgX19ucjsKKyAgICAgICAgICAgICAgICBjaGFyX3R5cGUqICBfX2luZXh0OworICAgICAgICAgICAgICAgIF9fciA9IF9fY3ZfLT5pbihfX3N0XywgX19leHRidWZfLCBfX2V4dGJ1ZmVuZF8sIF9fZXh0YnVmbmV4dF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5lYmFjaygpICsgX191bmdldF9zeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmViYWNrKCkgKyBfX2lic18sIF9faW5leHQpOworICAgICAgICAgICAgICAgIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjpub2NvbnYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aGlzLT5zZXRnKChjaGFyX3R5cGUqKV9fZXh0YnVmXywgKGNoYXJfdHlwZSopX19leHRidWZfLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyX3R5cGUqKWNvbnN0X2Nhc3Q8Y2hhciAqPihfX2V4dGJ1ZmVuZF8pKTsKKyAgICAgICAgICAgICAgICAgICAgX19jID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCp0aGlzLT5ncHRyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChfX2luZXh0ICE9IHRoaXMtPmViYWNrKCkgKyBfX3VuZ2V0X3N6KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy0+c2V0Zyh0aGlzLT5lYmFjaygpLCB0aGlzLT5lYmFjaygpICsgX191bmdldF9zeiwgX19pbmV4dCk7CisgICAgICAgICAgICAgICAgICAgIF9fYyA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqdGhpcy0+Z3B0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBfX2MgPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKnRoaXMtPmdwdHIoKSk7CisgICAgaWYgKHRoaXMtPmViYWNrKCkgPT0gJl9fMWJ1ZikKKyAgICAgICAgdGhpcy0+c2V0ZygwLCAwLCAwKTsKKyAgICByZXR1cm4gX19jOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordHlwZW5hbWUgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQorYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpwYmFja2ZhaWwoaW50X3R5cGUgX19jKQoreworICAgIGlmIChfX2ZpbGVfICYmIHRoaXMtPmViYWNrKCkgPCB0aGlzLT5ncHRyKCkpCisgICAgeworICAgICAgICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgdHJhaXRzX3R5cGU6OmVvZigpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+Z2J1bXAoLTEpOworICAgICAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjpub3RfZW9mKF9fYyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChfX29tXyAmIGlvc19iYXNlOjpvdXQpIHx8CisgICAgICAgICAgICB0cmFpdHNfdHlwZTo6ZXEodHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpLCB0aGlzLT5ncHRyKClbLTFdKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+Z2J1bXAoLTEpOworICAgICAgICAgICAgKnRoaXMtPmdwdHIoKSA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKTsKKyAgICAgICAgICAgIHJldHVybiBfX2M7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3R5cGVuYW1lIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUKK2Jhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6b3ZlcmZsb3coaW50X3R5cGUgX19jKQoreworICAgIGlmIChfX2ZpbGVfID09IDApCisgICAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgX193cml0ZV9tb2RlKCk7CisgICAgY2hhcl90eXBlIF9fMWJ1ZjsKKyAgICBjaGFyX3R5cGUqIF9fcGJfc2F2ZSA9IHRoaXMtPnBiYXNlKCk7CisgICAgY2hhcl90eXBlKiBfX2VwYl9zYXZlID0gdGhpcy0+ZXBwdHIoKTsKKyAgICBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIHRyYWl0c190eXBlOjplb2YoKSkpCisgICAgeworICAgICAgICBpZiAodGhpcy0+cHB0cigpID09IDApCisgICAgICAgICAgICB0aGlzLT5zZXRwKCZfXzFidWYsICZfXzFidWYrMSk7CisgICAgICAgICp0aGlzLT5wcHRyKCkgPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyk7CisgICAgICAgIHRoaXMtPnBidW1wKDEpOworICAgIH0KKyAgICBpZiAodGhpcy0+cHB0cigpICE9IHRoaXMtPnBiYXNlKCkpCisgICAgeworICAgICAgICBpZiAoX19hbHdheXNfbm9jb252XykKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IF9fbm1lbWIgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHRoaXMtPnBwdHIoKSAtIHRoaXMtPnBiYXNlKCkpOworICAgICAgICAgICAgaWYgKGZ3cml0ZSh0aGlzLT5wYmFzZSgpLCBzaXplb2YoY2hhcl90eXBlKSwgX19ubWVtYiwgX19maWxlXykgIT0gX19ubWVtYikKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciogX19leHRiZSA9IF9fZXh0YnVmXzsKKyAgICAgICAgICAgIGNvZGVjdnRfYmFzZTo6cmVzdWx0IF9fcjsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFfX2N2XykKKyAgICAgICAgICAgICAgICAgICAgX190aHJvd19iYWRfY2FzdCgpOworCisgICAgICAgICAgICAgICAgY29uc3QgY2hhcl90eXBlKiBfX2U7CisgICAgICAgICAgICAgICAgX19yID0gX19jdl8tPm91dChfX3N0XywgdGhpcy0+cGJhc2UoKSwgdGhpcy0+cHB0cigpLCBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19leHRidWZfLCBfX2V4dGJ1Zl8gKyBfX2Vic18sIF9fZXh0YmUpOworICAgICAgICAgICAgICAgIGlmIChfX2UgPT0gdGhpcy0+cGJhc2UoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgICAgICAgICAgICBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6bm9jb252KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbm1lbWIgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHRoaXMtPnBwdHIoKSAtIHRoaXMtPnBiYXNlKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZndyaXRlKHRoaXMtPnBiYXNlKCksIDEsIF9fbm1lbWIsIF9fZmlsZV8pICE9IF9fbm1lbWIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjpvayB8fCBfX3IgPT0gY29kZWN2dF9iYXNlOjpwYXJ0aWFsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbm1lbWIgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fZXh0YmUgLSBfX2V4dGJ1Zl8pOworICAgICAgICAgICAgICAgICAgICBpZiAoZndyaXRlKF9fZXh0YnVmXywgMSwgX19ubWVtYiwgX19maWxlXykgIT0gX19ubWVtYikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjpwYXJ0aWFsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zZXRwKGNvbnN0X2Nhc3Q8Y2hhcl90eXBlKj4oX19lKSwgdGhpcy0+cHB0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPl9fcGJ1bXAodGhpcy0+ZXBwdHIoKSAtIHRoaXMtPnBiYXNlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6OnBhcnRpYWwpOworICAgICAgICB9CisgICAgICAgIHRoaXMtPnNldHAoX19wYl9zYXZlLCBfX2VwYl9zYXZlKTsKKyAgICB9CisgICAgcmV0dXJuIHRyYWl0c190eXBlOjpub3RfZW9mKF9fYyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPioKK2Jhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6c2V0YnVmKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKK3sKKyAgICB0aGlzLT5zZXRnKDAsIDAsIDApOworICAgIHRoaXMtPnNldHAoMCwgMCk7CisgICAgaWYgKF9fb3duc19lYl8pCisgICAgICAgIGRlbGV0ZSBbXSBfX2V4dGJ1Zl87CisgICAgaWYgKF9fb3duc19pYl8pCisgICAgICAgIGRlbGV0ZSBbXSBfX2ludGJ1Zl87CisgICAgX19lYnNfID0gX19uOworICAgIGlmIChfX2Vic18gPiBzaXplb2YoX19leHRidWZfbWluXykpCisgICAgeworICAgICAgICBpZiAoX19hbHdheXNfbm9jb252XyAmJiBfX3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fZXh0YnVmXyA9IChjaGFyKilfX3M7CisgICAgICAgICAgICBfX293bnNfZWJfID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfX2V4dGJ1Zl8gPSBuZXcgY2hhcltfX2Vic19dOworICAgICAgICAgICAgX19vd25zX2ViXyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX19leHRidWZfID0gX19leHRidWZfbWluXzsKKyAgICAgICAgX19lYnNfID0gc2l6ZW9mKF9fZXh0YnVmX21pbl8pOworICAgICAgICBfX293bnNfZWJfID0gZmFsc2U7CisgICAgfQorICAgIGlmICghX19hbHdheXNfbm9jb252XykKKyAgICB7CisgICAgICAgIF9faWJzXyA9IG1heDxzdHJlYW1zaXplPihfX24sIHNpemVvZihfX2V4dGJ1Zl9taW5fKSk7CisgICAgICAgIGlmIChfX3MgJiYgX19pYnNfID49IHNpemVvZihfX2V4dGJ1Zl9taW5fKSkKKyAgICAgICAgeworICAgICAgICAgICAgX19pbnRidWZfID0gX19zOworICAgICAgICAgICAgX19vd25zX2liXyA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX19pbnRidWZfID0gbmV3IGNoYXJfdHlwZVtfX2lic19dOworICAgICAgICAgICAgX19vd25zX2liXyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX19pYnNfID0gMDsKKyAgICAgICAgX19pbnRidWZfID0gMDsKKyAgICAgICAgX19vd25zX2liXyA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3R5cGVuYW1lIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6cG9zX3R5cGUKK2Jhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6c2Vla29mZihvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX193YXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlKQoreworICAgIGlmICghX19jdl8pCisgICAgICAgIF9fdGhyb3dfYmFkX2Nhc3QoKTsKKworICAgIGludCBfX3dpZHRoID0gX19jdl8tPmVuY29kaW5nKCk7CisgICAgaWYgKF9fZmlsZV8gPT0gMCB8fCAoX193aWR0aCA8PSAwICYmIF9fb2ZmICE9IDApIHx8IHN5bmMoKSkKKyAgICAgICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisgICAgLy8gX193aWR0aCA+IDAgfHwgX19vZmYgPT0gMAorICAgIGludCBfX3doZW5jZTsKKyAgICBzd2l0Y2ggKF9fd2F5KQorICAgIHsKKyAgICBjYXNlIGlvc19iYXNlOjpiZWc6CisgICAgICAgIF9fd2hlbmNlID0gU0VFS19TRVQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgaW9zX2Jhc2U6OmN1cjoKKyAgICAgICAgX193aGVuY2UgPSBTRUVLX0NVUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBpb3NfYmFzZTo6ZW5kOgorICAgICAgICBfX3doZW5jZSA9IFNFRUtfRU5EOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKyAgICB9CisjaWYgZGVmaW5lZChfTElCQ1BQX0hBU19OT19PRkZfVF9GVU5DVElPTlMpCisgICAgaWYgKGZzZWVrKF9fZmlsZV8sIF9fd2lkdGggPiAwID8gX193aWR0aCAqIF9fb2ZmIDogMCwgX193aGVuY2UpKQorICAgICAgICByZXR1cm4gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKyAgICBwb3NfdHlwZSBfX3IgPSBmdGVsbChfX2ZpbGVfKTsKKyNlbHNlCisgICAgaWYgKGZzZWVrbyhfX2ZpbGVfLCBfX3dpZHRoID4gMCA/IF9fd2lkdGggKiBfX29mZiA6IDAsIF9fd2hlbmNlKSkKKyAgICAgICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisgICAgcG9zX3R5cGUgX19yID0gZnRlbGxvKF9fZmlsZV8pOworI2VuZGlmCisgICAgX19yLnN0YXRlKF9fc3RfKTsKKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordHlwZW5hbWUgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+Ojpwb3NfdHlwZQorYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpzZWVrcG9zKHBvc190eXBlIF9fc3AsIGlvc19iYXNlOjpvcGVubW9kZSkKK3sKKyAgICBpZiAoX19maWxlXyA9PSAwIHx8IHN5bmMoKSkKKyAgICAgICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisjaWYgZGVmaW5lZChfTElCQ1BQX0hBU19OT19PRkZfVF9GVU5DVElPTlMpCisgICAgaWYgKGZzZWVrKF9fZmlsZV8sIF9fc3AsIFNFRUtfU0VUKSkKKyAgICAgICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisjZWxzZQorICAgIGlmIChmc2Vla28oX19maWxlXywgX19zcCwgU0VFS19TRVQpKQorICAgICAgICByZXR1cm4gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKyNlbmRpZgorICAgIF9fc3RfID0gX19zcC5zdGF0ZSgpOworICAgIHJldHVybiBfX3NwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW50CitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OnN5bmMoKQoreworICAgIGlmIChfX2ZpbGVfID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghX19jdl8pCisgICAgICAgIF9fdGhyb3dfYmFkX2Nhc3QoKTsKKworICAgIGlmIChfX2NtXyAmIGlvc19iYXNlOjpvdXQpCisgICAgeworICAgICAgICBpZiAodGhpcy0+cHB0cigpICE9IHRoaXMtPnBiYXNlKCkpCisgICAgICAgICAgICBpZiAob3ZlcmZsb3coKSA9PSB0cmFpdHNfdHlwZTo6ZW9mKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjb2RlY3Z0X2Jhc2U6OnJlc3VsdCBfX3I7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIqIF9fZXh0YmU7CisgICAgICAgICAgICBfX3IgPSBfX2N2Xy0+dW5zaGlmdChfX3N0XywgX19leHRidWZfLCBfX2V4dGJ1Zl8gKyBfX2Vic18sIF9fZXh0YmUpOworICAgICAgICAgICAgc2l6ZV90IF9fbm1lbWIgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fZXh0YmUgLSBfX2V4dGJ1Zl8pOworICAgICAgICAgICAgaWYgKGZ3cml0ZShfX2V4dGJ1Zl8sIDEsIF9fbm1lbWIsIF9fZmlsZV8pICE9IF9fbm1lbWIpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IHdoaWxlIChfX3IgPT0gY29kZWN2dF9iYXNlOjpwYXJ0aWFsKTsKKyAgICAgICAgaWYgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6OmVycm9yKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoZmZsdXNoKF9fZmlsZV8pKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIGlmIChfX2NtXyAmIGlvc19iYXNlOjppbikKKyAgICB7CisgICAgICAgIG9mZl90eXBlIF9fYzsKKyAgICAgICAgc3RhdGVfdHlwZSBfX3N0YXRlID0gX19zdF9sYXN0XzsKKyAgICAgICAgYm9vbCBfX3VwZGF0ZV9zdCA9IGZhbHNlOworICAgICAgICBpZiAoX19hbHdheXNfbm9jb252XykKKyAgICAgICAgICAgIF9fYyA9IHRoaXMtPmVncHRyKCkgLSB0aGlzLT5ncHRyKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50IF9fd2lkdGggPSBfX2N2Xy0+ZW5jb2RpbmcoKTsKKyAgICAgICAgICAgIF9fYyA9IF9fZXh0YnVmZW5kXyAtIF9fZXh0YnVmbmV4dF87CisgICAgICAgICAgICBpZiAoX193aWR0aCA+IDApCisgICAgICAgICAgICAgICAgX19jICs9IF9fd2lkdGggKiAodGhpcy0+ZWdwdHIoKSAtIHRoaXMtPmdwdHIoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPmdwdHIoKSAhPSB0aGlzLT5lZ3B0cigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IF9fb2ZmID0gIF9fY3ZfLT5sZW5ndGgoX19zdGF0ZSwgX19leHRidWZfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2V4dGJ1Zm5leHRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5ncHRyKCkgLSB0aGlzLT5lYmFjaygpKTsKKyAgICAgICAgICAgICAgICAgICAgX19jICs9IF9fZXh0YnVmbmV4dF8gLSBfX2V4dGJ1Zl8gLSBfX29mZjsKKyAgICAgICAgICAgICAgICAgICAgX191cGRhdGVfc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmIGRlZmluZWQoX0xJQkNQUF9IQVNfTk9fT0ZGX1RfRlVOQ1RJT05TKQorICAgICAgICBpZiAoZnNlZWsoX19maWxlXywgLV9fYywgU0VFS19DVVIpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworI2Vsc2UKKyAgICAgICAgaWYgKGZzZWVrbyhfX2ZpbGVfLCAtX19jLCBTRUVLX0NVUikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisjZW5kaWYKKyAgICAgICAgaWYgKF9fdXBkYXRlX3N0KQorICAgICAgICAgICAgX19zdF8gPSBfX3N0YXRlOworICAgICAgICBfX2V4dGJ1Zm5leHRfID0gX19leHRidWZlbmRfID0gX19leHRidWZfOworICAgICAgICB0aGlzLT5zZXRnKDAsIDAsIDApOworICAgICAgICBfX2NtXyA9IDA7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZAorYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjppbWJ1ZShjb25zdCBsb2NhbGUmIF9fbG9jKQoreworICAgIHN5bmMoKTsKKyAgICBfX2N2XyA9ICZ1c2VfZmFjZXQ8Y29kZWN2dDxjaGFyX3R5cGUsIGNoYXIsIHN0YXRlX3R5cGU+ID4oX19sb2MpOworICAgIGJvb2wgX19vbGRfYW5jID0gX19hbHdheXNfbm9jb252XzsKKyAgICBfX2Fsd2F5c19ub2NvbnZfID0gX19jdl8tPmFsd2F5c19ub2NvbnYoKTsKKyAgICBpZiAoX19vbGRfYW5jICE9IF9fYWx3YXlzX25vY29udl8pCisgICAgeworICAgICAgICB0aGlzLT5zZXRnKDAsIDAsIDApOworICAgICAgICB0aGlzLT5zZXRwKDAsIDApOworICAgICAgICAvLyBpbnZhcmlhbnQsIGNoYXJfdHlwZSBpcyBjaGFyLCBlbHNlIHdlIGNvdWxkbid0IGdldCBoZXJlCisgICAgICAgIGlmIChfX2Fsd2F5c19ub2NvbnZfKSAgLy8gbmVlZCB0byBkdW1wIF9faW50YnVmXworICAgICAgICB7CisgICAgICAgICAgICBpZiAoX19vd25zX2ViXykKKyAgICAgICAgICAgICAgICBkZWxldGUgW10gX19leHRidWZfOworICAgICAgICAgICAgX19vd25zX2ViXyA9IF9fb3duc19pYl87CisgICAgICAgICAgICBfX2Vic18gPSBfX2lic187CisgICAgICAgICAgICBfX2V4dGJ1Zl8gPSAoY2hhciopX19pbnRidWZfOworICAgICAgICAgICAgX19pYnNfID0gMDsKKyAgICAgICAgICAgIF9faW50YnVmXyA9IDA7CisgICAgICAgICAgICBfX293bnNfaWJfID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgLy8gbmVlZCB0byBvYnRhaW4gYW4gX19pbnRidWZfLgorICAgICAgICB7ICAgICAvLyBJZiBfX2V4dGJ1Zl8gaXMgdXNlci1zdXBwbGllZCwgdXNlIGl0LCBlbHNlIG5ldyBfX2ludGJ1Zl8KKyAgICAgICAgICAgIGlmICghX19vd25zX2ViXyAmJiBfX2V4dGJ1Zl8gIT0gX19leHRidWZfbWluXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX2lic18gPSBfX2Vic187CisgICAgICAgICAgICAgICAgX19pbnRidWZfID0gKGNoYXJfdHlwZSopX19leHRidWZfOworICAgICAgICAgICAgICAgIF9fb3duc19pYl8gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBfX2V4dGJ1Zl8gPSBuZXcgY2hhcltfX2Vic19dOworICAgICAgICAgICAgICAgIF9fb3duc19lYl8gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9faWJzXyA9IF9fZWJzXzsKKyAgICAgICAgICAgICAgICBfX2ludGJ1Zl8gPSBuZXcgY2hhcl90eXBlW19faWJzX107CisgICAgICAgICAgICAgICAgX19vd25zX2liXyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Citib29sCitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9fcmVhZF9tb2RlKCkKK3sKKyAgICBpZiAoIShfX2NtXyAmIGlvc19iYXNlOjppbikpCisgICAgeworICAgICAgICB0aGlzLT5zZXRwKDAsIDApOworICAgICAgICBpZiAoX19hbHdheXNfbm9jb252XykKKyAgICAgICAgICAgIHRoaXMtPnNldGcoKGNoYXJfdHlwZSopX19leHRidWZfLAorICAgICAgICAgICAgICAgICAgICAgICAoY2hhcl90eXBlKilfX2V4dGJ1Zl8gKyBfX2Vic18sCisgICAgICAgICAgICAgICAgICAgICAgIChjaGFyX3R5cGUqKV9fZXh0YnVmXyArIF9fZWJzXyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMtPnNldGcoX19pbnRidWZfLCBfX2ludGJ1Zl8gKyBfX2lic18sIF9faW50YnVmXyArIF9faWJzXyk7CisgICAgICAgIF9fY21fID0gaW9zX2Jhc2U6OmluOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZAorYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfX3dyaXRlX21vZGUoKQoreworICAgIGlmICghKF9fY21fICYgaW9zX2Jhc2U6Om91dCkpCisgICAgeworICAgICAgICB0aGlzLT5zZXRnKDAsIDAsIDApOworICAgICAgICBpZiAoX19lYnNfID4gc2l6ZW9mKF9fZXh0YnVmX21pbl8pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX19hbHdheXNfbm9jb252XykKKyAgICAgICAgICAgICAgICB0aGlzLT5zZXRwKChjaGFyX3R5cGUqKV9fZXh0YnVmXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyX3R5cGUqKV9fZXh0YnVmXyArIChfX2Vic18gLSAxKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhpcy0+c2V0cChfX2ludGJ1Zl8sIF9faW50YnVmXyArIChfX2lic18gLSAxKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy0+c2V0cCgwLCAwKTsKKyAgICAgICAgX19jbV8gPSBpb3NfYmFzZTo6b3V0OworICAgIH0KK30KKworLy8gYmFzaWNfaWZzdHJlYW0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGJhc2ljX2lmc3RyZWFtCisgICAgOiBwdWJsaWMgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIGludF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIHBvc190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlIG9mZl90eXBlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX2lmc3RyZWFtKCk7CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0dMT0JBTF9GSUxFU1lTVEVNX05BTUVTUEFDRQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBiYXNpY19pZnN0cmVhbShjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4pOworI2lmZGVmIF9MSUJDUFBfSEFTX09QRU5fV0lUSF9XQ0hBUgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBiYXNpY19pZnN0cmVhbShjb25zdCB3Y2hhcl90KiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4pOworI2VuZGlmCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IGJhc2ljX2lmc3RyZWFtKGNvbnN0IHN0cmluZyYgX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluKTsKKyNlbmRpZgorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfaWZzdHJlYW0oYmFzaWNfaWZzdHJlYW0mJiBfX3Jocyk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfaWZzdHJlYW0mIG9wZXJhdG9yPShiYXNpY19pZnN0cmVhbSYmIF9fcmhzKTsKKyNlbmRpZgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAoYmFzaWNfaWZzdHJlYW0mIF9fcmhzKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19maWxlYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiByZGJ1ZigpIGNvbnN0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIGlzX29wZW4oKSBjb25zdDsKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fR0xPQkFMX0ZJTEVTWVNURU1fTkFNRVNQQUNFCisgICAgdm9pZCBvcGVuKGNvbnN0IGNoYXIqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbik7CisjaWZkZWYgX0xJQkNQUF9IQVNfT1BFTl9XSVRIX1dDSEFSCisgICAgdm9pZCBvcGVuKGNvbnN0IHdjaGFyX3QqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbik7CisjZW5kaWYKKyAgICB2b2lkIG9wZW4oY29uc3Qgc3RyaW5nJiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4pOworI2VuZGlmCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgY2xvc2UoKTsKKworcHJpdmF0ZToKKyAgICBiYXNpY19maWxlYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+IF9fc2JfOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZQorYmFzaWNfaWZzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6YmFzaWNfaWZzdHJlYW0oKQorICAgIDogYmFzaWNfaXN0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPigmX19zYl8pCit7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fR0xPQkFMX0ZJTEVTWVNURU1fTkFNRVNQQUNFCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lCitiYXNpY19pZnN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpiYXNpY19pZnN0cmVhbShjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCisgICAgOiBiYXNpY19pc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KCZfX3NiXykKK3sKKyAgICBpZiAoX19zYl8ub3BlbihfX3MsIF9fbW9kZSB8IGlvc19iYXNlOjppbikgPT0gMCkKKyAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworfQorCisjaWZkZWYgX0xJQkNQUF9IQVNfT1BFTl9XSVRIX1dDSEFSCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lCitiYXNpY19pZnN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpiYXNpY19pZnN0cmVhbShjb25zdCB3Y2hhcl90KiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCisgICAgOiBiYXNpY19pc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KCZfX3NiXykKK3sKKyAgICBpZiAoX19zYl8ub3BlbihfX3MsIF9fbW9kZSB8IGlvc19iYXNlOjppbikgPT0gMCkKKyAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUKK2Jhc2ljX2lmc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmJhc2ljX2lmc3RyZWFtKGNvbnN0IHN0cmluZyYgX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQorICAgIDogYmFzaWNfaXN0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPigmX19zYl8pCit7CisgICAgaWYgKF9fc2JfLm9wZW4oX19zLCBfX21vZGUgfCBpb3NfYmFzZTo6aW4pID09IDApCisgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lCitiYXNpY19pZnN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpiYXNpY19pZnN0cmVhbShiYXNpY19pZnN0cmVhbSYmIF9fcmhzKQorICAgIDogYmFzaWNfaXN0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPihfVlNURDo6bW92ZShfX3JocykpLAorICAgICAgX19zYl8oX1ZTVEQ6Om1vdmUoX19yaHMuX19zYl8pKQoreworICAgIHRoaXMtPnNldF9yZGJ1ZigmX19zYl8pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lCitiYXNpY19pZnN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaWZzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I9KGJhc2ljX2lmc3RyZWFtJiYgX19yaHMpCit7CisgICAgYmFzaWNfaXN0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPjo6b3BlcmF0b3I9KF9WU1REOjptb3ZlKF9fcmhzKSk7CisgICAgX19zYl8gPSBfVlNURDo6bW92ZShfX3Jocy5fX3NiXyk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lCit2b2lkCitiYXNpY19pZnN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojpzd2FwKGJhc2ljX2lmc3RyZWFtJiBfX3JocykKK3sKKyAgICBiYXNpY19pc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+Ojpzd2FwKF9fcmhzKTsKKyAgICBfX3NiXy5zd2FwKF9fcmhzLl9fc2JfKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzd2FwKGJhc2ljX2lmc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9feCwgYmFzaWNfaWZzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX195KQoreworICAgIF9feC5zd2FwKF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUKK2Jhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPioKK2Jhc2ljX2lmc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnJkYnVmKCkgY29uc3QKK3sKKyAgICByZXR1cm4gY29uc3RfY2FzdDxiYXNpY19maWxlYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+Kj4oJl9fc2JfKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZQorYm9vbAorYmFzaWNfaWZzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6aXNfb3BlbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIF9fc2JfLmlzX29wZW4oKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19HTE9CQUxfRklMRVNZU1RFTV9OQU1FU1BBQ0UKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitiYXNpY19pZnN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVuKGNvbnN0IGNoYXIqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkKK3sKKyAgICBpZiAoX19zYl8ub3BlbihfX3MsIF9fbW9kZSB8IGlvc19iYXNlOjppbikpCisgICAgICAgIHRoaXMtPmNsZWFyKCk7CisgICAgZWxzZQorICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Cit9CisKKyNpZmRlZiBfTElCQ1BQX0hBU19PUEVOX1dJVEhfV0NIQVIKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitiYXNpY19pZnN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVuKGNvbnN0IHdjaGFyX3QqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkKK3sKKyAgICBpZiAoX19zYl8ub3BlbihfX3MsIF9fbW9kZSB8IGlvc19iYXNlOjppbikpCisgICAgICAgIHRoaXMtPmNsZWFyKCk7CisgICAgZWxzZQorICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQKK2Jhc2ljX2lmc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZW4oY29uc3Qgc3RyaW5nJiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCit7CisgICAgaWYgKF9fc2JfLm9wZW4oX19zLCBfX21vZGUgfCBpb3NfYmFzZTo6aW4pKQorICAgICAgICB0aGlzLT5jbGVhcigpOworICAgIGVsc2UKKyAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUKK3ZvaWQKK2Jhc2ljX2lmc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmNsb3NlKCkKK3sKKyAgICBpZiAoX19zYl8uY2xvc2UoKSA9PSAwKQorICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Cit9CisKKy8vIGJhc2ljX29mc3RyZWFtCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBiYXNpY19vZnN0cmVhbQorICAgIDogcHVibGljIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPgoreworcHVibGljOgorICAgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSBvZmZfdHlwZTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19vZnN0cmVhbSgpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBiYXNpY19vZnN0cmVhbShjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6b3V0KTsKKyNpZmRlZiBfTElCQ1BQX0hBU19PUEVOX1dJVEhfV0NIQVIKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgYmFzaWNfb2ZzdHJlYW0oY29uc3Qgd2NoYXJfdCogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6Om91dCk7CisjZW5kaWYKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgYmFzaWNfb2ZzdHJlYW0oY29uc3Qgc3RyaW5nJiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6b3V0KTsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX29mc3RyZWFtKGJhc2ljX29mc3RyZWFtJiYgX19yaHMpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX29mc3RyZWFtJiBvcGVyYXRvcj0oYmFzaWNfb2ZzdHJlYW0mJiBfX3Jocyk7CisjZW5kaWYKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKGJhc2ljX29mc3RyZWFtJiBfX3Jocyk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfZmlsZWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiogcmRidWYoKSBjb25zdDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBpc19vcGVuKCkgY29uc3Q7CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0dMT0JBTF9GSUxFU1lTVEVNX05BTUVTUEFDRQorICAgIHZvaWQgb3Blbihjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6b3V0KTsKKyNpZmRlZiBfTElCQ1BQX0hBU19PUEVOX1dJVEhfV0NIQVIKKyAgICB2b2lkIG9wZW4oY29uc3Qgd2NoYXJfdCogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6Om91dCk7CisjZW5kaWYKKyAgICB2b2lkIG9wZW4oY29uc3Qgc3RyaW5nJiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6b3V0KTsKKyNlbmRpZgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGNsb3NlKCk7CisKK3ByaXZhdGU6CisgICAgYmFzaWNfZmlsZWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiBfX3NiXzsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUKK2Jhc2ljX29mc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmJhc2ljX29mc3RyZWFtKCkKKyAgICA6IGJhc2ljX29zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4oJl9fc2JfKQoreworfQorCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0dMT0JBTF9GSUxFU1lTVEVNX05BTUVTUEFDRQordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZQorYmFzaWNfb2ZzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6YmFzaWNfb2ZzdHJlYW0oY29uc3QgY2hhciogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQorICAgIDogYmFzaWNfb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPigmX19zYl8pCit7CisgICAgaWYgKF9fc2JfLm9wZW4oX19zLCBfX21vZGUgfCBpb3NfYmFzZTo6b3V0KSA9PSAwKQorICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Cit9CisKKyNpZmRlZiBfTElCQ1BQX0hBU19PUEVOX1dJVEhfV0NIQVIKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUKK2Jhc2ljX29mc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmJhc2ljX29mc3RyZWFtKGNvbnN0IHdjaGFyX3QqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkKKyAgICA6IGJhc2ljX29zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4oJl9fc2JfKQoreworICAgIGlmIChfX3NiXy5vcGVuKF9fcywgX19tb2RlIHwgaW9zX2Jhc2U6Om91dCkgPT0gMCkKKyAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUKK2Jhc2ljX29mc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmJhc2ljX29mc3RyZWFtKGNvbnN0IHN0cmluZyYgX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQorICAgIDogYmFzaWNfb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPigmX19zYl8pCit7CisgICAgaWYgKF9fc2JfLm9wZW4oX19zLCBfX21vZGUgfCBpb3NfYmFzZTo6b3V0KSA9PSAwKQorICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZQorYmFzaWNfb2ZzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6YmFzaWNfb2ZzdHJlYW0oYmFzaWNfb2ZzdHJlYW0mJiBfX3JocykKKyAgICA6IGJhc2ljX29zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4oX1ZTVEQ6Om1vdmUoX19yaHMpKSwKKyAgICAgIF9fc2JfKF9WU1REOjptb3ZlKF9fcmhzLl9fc2JfKSkKK3sKKyAgICB0aGlzLT5zZXRfcmRidWYoJl9fc2JfKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZQorYmFzaWNfb2ZzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX29mc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPShiYXNpY19vZnN0cmVhbSYmIF9fcmhzKQoreworICAgIGJhc2ljX29zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT46Om9wZXJhdG9yPShfVlNURDo6bW92ZShfX3JocykpOworICAgIF9fc2JfID0gX1ZTVEQ6Om1vdmUoX19yaHMuX19zYl8pOworICAgIHJldHVybiAqdGhpczsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZQordm9pZAorYmFzaWNfb2ZzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c3dhcChiYXNpY19vZnN0cmVhbSYgX19yaHMpCit7CisgICAgYmFzaWNfb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPjo6c3dhcChfX3Jocyk7CisgICAgX19zYl8uc3dhcChfX3Jocy5fX3NiXyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChiYXNpY19vZnN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX3gsIGJhc2ljX29mc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9feSkKK3sKKyAgICBfX3guc3dhcChfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lCitiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4qCitiYXNpY19vZnN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpyZGJ1ZigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8YmFzaWNfZmlsZWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPio+KCZfX3NiXyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUKK2Jvb2wKK2Jhc2ljX29mc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmlzX29wZW4oKSBjb25zdAoreworICAgIHJldHVybiBfX3NiXy5pc19vcGVuKCk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fR0xPQkFMX0ZJTEVTWVNURU1fTkFNRVNQQUNFCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZAorYmFzaWNfb2ZzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3Blbihjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCit7CisgICAgaWYgKF9fc2JfLm9wZW4oX19zLCBfX21vZGUgfCBpb3NfYmFzZTo6b3V0KSkKKyAgICAgICAgdGhpcy0+Y2xlYXIoKTsKKyAgICBlbHNlCisgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKK30KKworI2lmZGVmIF9MSUJDUFBfSEFTX09QRU5fV0lUSF9XQ0hBUgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQKK2Jhc2ljX29mc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZW4oY29uc3Qgd2NoYXJfdCogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQoreworICAgIGlmIChfX3NiXy5vcGVuKF9fcywgX19tb2RlIHwgaW9zX2Jhc2U6Om91dCkpCisgICAgICAgIHRoaXMtPmNsZWFyKCk7CisgICAgZWxzZQorICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQKK2Jhc2ljX29mc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZW4oY29uc3Qgc3RyaW5nJiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCit7CisgICAgaWYgKF9fc2JfLm9wZW4oX19zLCBfX21vZGUgfCBpb3NfYmFzZTo6b3V0KSkKKyAgICAgICAgdGhpcy0+Y2xlYXIoKTsKKyAgICBlbHNlCisgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lCit2b2lkCitiYXNpY19vZnN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpjbG9zZSgpCit7CisgICAgaWYgKF9fc2JfLmNsb3NlKCkgPT0gMCkKKyAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworfQorCisvLyBiYXNpY19mc3RyZWFtCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBiYXNpY19mc3RyZWFtCisgICAgOiBwdWJsaWMgYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPgoreworcHVibGljOgorICAgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSBvZmZfdHlwZTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19mc3RyZWFtKCk7CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0dMT0JBTF9GSUxFU1lTVEVNX05BTUVTUEFDRQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBiYXNpY19mc3RyZWFtKGNvbnN0IGNoYXIqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworI2lmZGVmIF9MSUJDUFBfSEFTX09QRU5fV0lUSF9XQ0hBUgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBiYXNpY19mc3RyZWFtKGNvbnN0IHdjaGFyX3QqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworI2VuZGlmCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IGJhc2ljX2ZzdHJlYW0oY29uc3Qgc3RyaW5nJiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyNlbmRpZgorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfZnN0cmVhbShiYXNpY19mc3RyZWFtJiYgX19yaHMpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX2ZzdHJlYW0mIG9wZXJhdG9yPShiYXNpY19mc3RyZWFtJiYgX19yaHMpOworI2VuZGlmCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc3dhcChiYXNpY19mc3RyZWFtJiBfX3Jocyk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfZmlsZWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiogcmRidWYoKSBjb25zdDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBpc19vcGVuKCkgY29uc3Q7CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0dMT0JBTF9GSUxFU1lTVEVNX05BTUVTUEFDRQorICAgIHZvaWQgb3Blbihjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyNpZmRlZiBfTElCQ1BQX0hBU19PUEVOX1dJVEhfV0NIQVIKKyAgICB2b2lkIG9wZW4oY29uc3Qgd2NoYXJfdCogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CisjZW5kaWYKKyAgICB2b2lkIG9wZW4oY29uc3Qgc3RyaW5nJiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyNlbmRpZgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGNsb3NlKCk7CisKK3ByaXZhdGU6CisgICAgYmFzaWNfZmlsZWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiBfX3NiXzsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUKK2Jhc2ljX2ZzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6YmFzaWNfZnN0cmVhbSgpCisgICAgOiBiYXNpY19pb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPigmX19zYl8pCit7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fR0xPQkFMX0ZJTEVTWVNURU1fTkFNRVNQQUNFCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lCitiYXNpY19mc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmJhc2ljX2ZzdHJlYW0oY29uc3QgY2hhciogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQorICAgIDogYmFzaWNfaW9zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4oJl9fc2JfKQoreworICAgIGlmIChfX3NiXy5vcGVuKF9fcywgX19tb2RlKSA9PSAwKQorICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7Cit9CisKKyNpZmRlZiBfTElCQ1BQX0hBU19PUEVOX1dJVEhfV0NIQVIKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUKK2Jhc2ljX2ZzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6YmFzaWNfZnN0cmVhbShjb25zdCB3Y2hhcl90KiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCisgICAgOiBiYXNpY19pb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPigmX19zYl8pCit7CisgICAgaWYgKF9fc2JfLm9wZW4oX19zLCBfX21vZGUpID09IDApCisgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lCitiYXNpY19mc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmJhc2ljX2ZzdHJlYW0oY29uc3Qgc3RyaW5nJiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCisgICAgOiBiYXNpY19pb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPigmX19zYl8pCit7CisgICAgaWYgKF9fc2JfLm9wZW4oX19zLCBfX21vZGUpID09IDApCisgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lCitiYXNpY19mc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmJhc2ljX2ZzdHJlYW0oYmFzaWNfZnN0cmVhbSYmIF9fcmhzKQorICAgIDogYmFzaWNfaW9zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4oX1ZTVEQ6Om1vdmUoX19yaHMpKSwKKyAgICAgIF9fc2JfKF9WU1REOjptb3ZlKF9fcmhzLl9fc2JfKSkKK3sKKyAgICB0aGlzLT5zZXRfcmRidWYoJl9fc2JfKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZQorYmFzaWNfZnN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfZnN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj0oYmFzaWNfZnN0cmVhbSYmIF9fcmhzKQoreworICAgIGJhc2ljX2lvc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+OjpvcGVyYXRvcj0oX1ZTVEQ6Om1vdmUoX19yaHMpKTsKKyAgICBfX3NiXyA9IF9WU1REOjptb3ZlKF9fcmhzLl9fc2JfKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUKK3ZvaWQKK2Jhc2ljX2ZzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c3dhcChiYXNpY19mc3RyZWFtJiBfX3JocykKK3sKKyAgICBiYXNpY19pb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPjo6c3dhcChfX3Jocyk7CisgICAgX19zYl8uc3dhcChfX3Jocy5fX3NiXyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChiYXNpY19mc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9feCwgYmFzaWNfZnN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX3kpCit7CisgICAgX194LnN3YXAoX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZQorYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KgorYmFzaWNfZnN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpyZGJ1ZigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8YmFzaWNfZmlsZWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPio+KCZfX3NiXyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUKK2Jvb2wKK2Jhc2ljX2ZzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6aXNfb3BlbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIF9fc2JfLmlzX29wZW4oKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19HTE9CQUxfRklMRVNZU1RFTV9OQU1FU1BBQ0UKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitiYXNpY19mc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZW4oY29uc3QgY2hhciogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQoreworICAgIGlmIChfX3NiXy5vcGVuKF9fcywgX19tb2RlKSkKKyAgICAgICAgdGhpcy0+Y2xlYXIoKTsKKyAgICBlbHNlCisgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKK30KKworI2lmZGVmIF9MSUJDUFBfSEFTX09QRU5fV0lUSF9XQ0hBUgordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQKK2Jhc2ljX2ZzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3Blbihjb25zdCB3Y2hhcl90KiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCit7CisgICAgaWYgKF9fc2JfLm9wZW4oX19zLCBfX21vZGUpKQorICAgICAgICB0aGlzLT5jbGVhcigpOworICAgIGVsc2UKKyAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitiYXNpY19mc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZW4oY29uc3Qgc3RyaW5nJiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCit7CisgICAgaWYgKF9fc2JfLm9wZW4oX19zLCBfX21vZGUpKQorICAgICAgICB0aGlzLT5jbGVhcigpOworICAgIGVsc2UKKyAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUKK3ZvaWQKK2Jhc2ljX2ZzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6Y2xvc2UoKQoreworICAgIGlmIChfX3NiXy5jbG9zZSgpID09IDApCisgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKK30KKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCitfTElCQ1BQX1BPUF9NQUNST1MKKworI2VuZGlmICAvLyBfTElCQ1BQX0ZTVFJFQU0KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9mdW5jdGlvbmFsIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2Z1bmN0aW9uYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1YmViOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9mdW5jdGlvbmFsCkBAIC0wLDAgKzEsMjUyNyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZ1bmN0aW9uYWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9GVU5DVElPTkFMCisjZGVmaW5lIF9MSUJDUFBfRlVOQ1RJT05BTAorCisvKgorICAgIGZ1bmN0aW9uYWwgc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCit0ZW1wbGF0ZSA8Y2xhc3MgQXJnLCBjbGFzcyBSZXN1bHQ+CitzdHJ1Y3QgdW5hcnlfZnVuY3Rpb24KK3sKKyAgICB0eXBlZGVmIEFyZyAgICBhcmd1bWVudF90eXBlOworICAgIHR5cGVkZWYgUmVzdWx0IHJlc3VsdF90eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIEFyZzEsIGNsYXNzIEFyZzIsIGNsYXNzIFJlc3VsdD4KK3N0cnVjdCBiaW5hcnlfZnVuY3Rpb24KK3sKKyAgICB0eXBlZGVmIEFyZzEgICBmaXJzdF9hcmd1bWVudF90eXBlOworICAgIHR5cGVkZWYgQXJnMiAgIHNlY29uZF9hcmd1bWVudF90eXBlOworICAgIHR5cGVkZWYgUmVzdWx0IHJlc3VsdF90eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyByZWZlcmVuY2Vfd3JhcHBlcgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPFQxLCBSPiAvLyBpZiB3cmFwcGluZyBhIHVuYXJ5IGZ1bmN0b3IKKyAgICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248VDEsIFQyLCBSPiAvLyBpZiB3cmFwaW5nIGEgYmluYXJ5IGZ1bmN0b3IKK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgVCB0eXBlOworICAgIHR5cGVkZWYgc2VlIGJlbG93IHJlc3VsdF90eXBlOyAvLyBOb3QgYWx3YXlzIGRlZmluZWQKKworICAgIC8vIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3kKKyAgICByZWZlcmVuY2Vfd3JhcHBlcihUJikgbm9leGNlcHQ7CisgICAgcmVmZXJlbmNlX3dyYXBwZXIoVCYmKSA9IGRlbGV0ZTsgLy8gZG8gbm90IGJpbmQgdG8gdGVtcHMKKyAgICByZWZlcmVuY2Vfd3JhcHBlcihjb25zdCByZWZlcmVuY2Vfd3JhcHBlcjxUPiYgeCkgbm9leGNlcHQ7CisKKyAgICAvLyBhc3NpZ25tZW50CisgICAgcmVmZXJlbmNlX3dyYXBwZXImIG9wZXJhdG9yPShjb25zdCByZWZlcmVuY2Vfd3JhcHBlcjxUPiYgeCkgbm9leGNlcHQ7CisKKyAgICAvLyBhY2Nlc3MKKyAgICBvcGVyYXRvciBUJiAoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBUJiBnZXQoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIC8vIGludm9rZQorICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdUeXBlcz4KKyAgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjxUJihBcmdUeXBlcyYmLi4uKT46OnR5cGUKKyAgICAgICAgICBvcGVyYXRvcigpIChBcmdUeXBlcyYmLi4uKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPiByZWZlcmVuY2Vfd3JhcHBlcjxUPiByZWYoVCYgdCkgbm9leGNlcHQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCByZWYoY29uc3QgVCYmIHQpID0gZGVsZXRlOwordGVtcGxhdGUgPGNsYXNzIFQ+IHJlZmVyZW5jZV93cmFwcGVyPFQ+IHJlZihyZWZlcmVuY2Vfd3JhcHBlcjxUPnQpIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gcmVmZXJlbmNlX3dyYXBwZXI8Y29uc3QgVD4gY3JlZihjb25zdCBUJiB0KSBub2V4Y2VwdDsKK3RlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGNyZWYoY29uc3QgVCYmIHQpID0gZGVsZXRlOwordGVtcGxhdGUgPGNsYXNzIFQ+IHJlZmVyZW5jZV93cmFwcGVyPGNvbnN0IFQ+IGNyZWYocmVmZXJlbmNlX3dyYXBwZXI8VD4gdCkgbm9leGNlcHQ7CisKK3RlbXBsYXRlIDxjbGFzcyBUPiAvLyA8Y2xhc3MgVD12b2lkPiBpbiBDKysxNAorc3RydWN0IHBsdXMgOiBiaW5hcnlfZnVuY3Rpb248VCwgVCwgVD4KK3sKKyAgICBUIG9wZXJhdG9yKCkoY29uc3QgVCYgeCwgY29uc3QgVCYgeSkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gLy8gPGNsYXNzIFQ9dm9pZD4gaW4gQysrMTQKK3N0cnVjdCBtaW51cyA6IGJpbmFyeV9mdW5jdGlvbjxULCBULCBUPgoreworICAgIFQgb3BlcmF0b3IoKShjb25zdCBUJiB4LCBjb25zdCBUJiB5KSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPiAvLyA8Y2xhc3MgVD12b2lkPiBpbiBDKysxNAorc3RydWN0IG11bHRpcGxpZXMgOiBiaW5hcnlfZnVuY3Rpb248VCwgVCwgVD4KK3sKKyAgICBUIG9wZXJhdG9yKCkoY29uc3QgVCYgeCwgY29uc3QgVCYgeSkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gLy8gPGNsYXNzIFQ9dm9pZD4gaW4gQysrMTQKK3N0cnVjdCBkaXZpZGVzIDogYmluYXJ5X2Z1bmN0aW9uPFQsIFQsIFQ+Cit7CisgICAgVCBvcGVyYXRvcigpKGNvbnN0IFQmIHgsIGNvbnN0IFQmIHkpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IC8vIDxjbGFzcyBUPXZvaWQ+IGluIEMrKzE0CitzdHJ1Y3QgbW9kdWx1cyA6IGJpbmFyeV9mdW5jdGlvbjxULCBULCBUPgoreworICAgIFQgb3BlcmF0b3IoKShjb25zdCBUJiB4LCBjb25zdCBUJiB5KSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPiAvLyA8Y2xhc3MgVD12b2lkPiBpbiBDKysxNAorc3RydWN0IG5lZ2F0ZSA6IHVuYXJ5X2Z1bmN0aW9uPFQsIFQ+Cit7CisgICAgVCBvcGVyYXRvcigpKGNvbnN0IFQmIHgpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IC8vIDxjbGFzcyBUPXZvaWQ+IGluIEMrKzE0CitzdHJ1Y3QgZXF1YWxfdG8gOiBiaW5hcnlfZnVuY3Rpb248VCwgVCwgYm9vbD4KK3sKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgVCYgeCwgY29uc3QgVCYgeSkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gLy8gPGNsYXNzIFQ9dm9pZD4gaW4gQysrMTQKK3N0cnVjdCBub3RfZXF1YWxfdG8gOiBiaW5hcnlfZnVuY3Rpb248VCwgVCwgYm9vbD4KK3sKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgVCYgeCwgY29uc3QgVCYgeSkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gLy8gPGNsYXNzIFQ9dm9pZD4gaW4gQysrMTQKK3N0cnVjdCBncmVhdGVyIDogYmluYXJ5X2Z1bmN0aW9uPFQsIFQsIGJvb2w+Cit7CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQmIHgsIGNvbnN0IFQmIHkpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IC8vIDxjbGFzcyBUPXZvaWQ+IGluIEMrKzE0CitzdHJ1Y3QgbGVzcyA6IGJpbmFyeV9mdW5jdGlvbjxULCBULCBib29sPgoreworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUJiB4LCBjb25zdCBUJiB5KSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPiAvLyA8Y2xhc3MgVD12b2lkPiBpbiBDKysxNAorc3RydWN0IGdyZWF0ZXJfZXF1YWwgOiBiaW5hcnlfZnVuY3Rpb248VCwgVCwgYm9vbD4KK3sKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgVCYgeCwgY29uc3QgVCYgeSkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gLy8gPGNsYXNzIFQ9dm9pZD4gaW4gQysrMTQKK3N0cnVjdCBsZXNzX2VxdWFsIDogYmluYXJ5X2Z1bmN0aW9uPFQsIFQsIGJvb2w+Cit7CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQmIHgsIGNvbnN0IFQmIHkpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IC8vIDxjbGFzcyBUPXZvaWQ+IGluIEMrKzE0CitzdHJ1Y3QgbG9naWNhbF9hbmQgOiBiaW5hcnlfZnVuY3Rpb248VCwgVCwgYm9vbD4KK3sKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgVCYgeCwgY29uc3QgVCYgeSkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gLy8gPGNsYXNzIFQ9dm9pZD4gaW4gQysrMTQKK3N0cnVjdCBsb2dpY2FsX29yIDogYmluYXJ5X2Z1bmN0aW9uPFQsIFQsIGJvb2w+Cit7CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQmIHgsIGNvbnN0IFQmIHkpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IC8vIDxjbGFzcyBUPXZvaWQ+IGluIEMrKzE0CitzdHJ1Y3QgbG9naWNhbF9ub3QgOiB1bmFyeV9mdW5jdGlvbjxULCBib29sPgoreworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUJiB4KSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPiAvLyA8Y2xhc3MgVD12b2lkPiBpbiBDKysxNAorc3RydWN0IGJpdF9hbmQgOiB1bmFyeV9mdW5jdGlvbjxULCBib29sPgoreworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUJiB4LCBjb25zdCBUJiB5KSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPiAvLyA8Y2xhc3MgVD12b2lkPiBpbiBDKysxNAorc3RydWN0IGJpdF9vciA6IHVuYXJ5X2Z1bmN0aW9uPFQsIGJvb2w+Cit7CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQmIHgsIGNvbnN0IFQmIHkpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IC8vIDxjbGFzcyBUPXZvaWQ+IGluIEMrKzE0CitzdHJ1Y3QgYml0X3hvciA6IHVuYXJ5X2Z1bmN0aW9uPFQsIGJvb2w+Cit7CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQmIHgsIGNvbnN0IFQmIHkpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ9dm9pZD4gLy8gQysrMTQKK3N0cnVjdCBiaXRfeG9yIDogdW5hcnlfZnVuY3Rpb248VCwgYm9vbD4KK3sKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgVCYgeCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgUHJlZGljYXRlPgorY2xhc3MgdW5hcnlfbmVnYXRlCisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgUHJlZGljYXRlOjphcmd1bWVudF90eXBlLCBib29sPgoreworcHVibGljOgorICAgIGV4cGxpY2l0IHVuYXJ5X25lZ2F0ZShjb25zdCBQcmVkaWNhdGUmIHByZWQpOworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCB0eXBlbmFtZSBQcmVkaWNhdGU6OmFyZ3VtZW50X3R5cGUmIHgpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFByZWRpY2F0ZT4gdW5hcnlfbmVnYXRlPFByZWRpY2F0ZT4gbm90MShjb25zdCBQcmVkaWNhdGUmIHByZWQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgUHJlZGljYXRlPgorY2xhc3MgYmluYXJ5X25lZ2F0ZQorICAgIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBQcmVkaWNhdGU6OmZpcnN0X2FyZ3VtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFByZWRpY2F0ZTo6c2Vjb25kX2FyZ3VtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2w+Cit7CitwdWJsaWM6CisgICAgZXhwbGljaXQgYmluYXJ5X25lZ2F0ZShjb25zdCBQcmVkaWNhdGUmIHByZWQpOworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCB0eXBlbmFtZSBQcmVkaWNhdGU6OmZpcnN0X2FyZ3VtZW50X3R5cGUmIHgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIFByZWRpY2F0ZTo6c2Vjb25kX2FyZ3VtZW50X3R5cGUmIHkpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFByZWRpY2F0ZT4gYmluYXJ5X25lZ2F0ZTxQcmVkaWNhdGU+IG5vdDIoY29uc3QgUHJlZGljYXRlJiBwcmVkKTsKKwordGVtcGxhdGUgPGNsYXNzIEY+IHVuc3BlY2lmaWVkIG5vdF9mbihGJiYgZik7IC8vIEMrKzE3CisKK3RlbXBsYXRlPGNsYXNzIFQ+IHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb247Cit0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgaXNfcGxhY2Vob2xkZXI7CisKKyAgICAvLyBTZWUgQysrMTQgMjAuOS45LCBGdW5jdGlvbiBvYmplY3QgYmluZGVycwordGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19iaW5kX2V4cHJlc3Npb25fdgorICA9IGlzX2JpbmRfZXhwcmVzc2lvbjxUPjo6dmFsdWU7IC8vIEMrKzE3Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBpbnQgaXNfcGxhY2Vob2xkZXJfdgorICA9IGlzX3BsYWNlaG9sZGVyPFQ+Ojp2YWx1ZTsgLy8gQysrMTcKKworCit0ZW1wbGF0ZTxjbGFzcyBGbiwgY2xhc3MuLi4gQm91bmRBcmdzPgorICB1bnNwZWNpZmllZCBiaW5kKEZuJiYsIEJvdW5kQXJncyYmLi4uKTsKK3RlbXBsYXRlPGNsYXNzIFIsIGNsYXNzIEZuLCBjbGFzcy4uLiBCb3VuZEFyZ3M+CisgIHVuc3BlY2lmaWVkIGJpbmQoRm4mJiwgQm91bmRBcmdzJiYuLi4pOworCituYW1lc3BhY2UgcGxhY2Vob2xkZXJzIHsKKyAgLy8gTSBpcyB0aGUgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBudW1iZXIgb2YgcGxhY2Vob2xkZXJzCisgIGV4dGVybiB1bnNwZWNpZmllZCBfMTsKKyAgZXh0ZXJuIHVuc3BlY2lmaWVkIF8yOworICAuCisgIC4KKyAgLgorICBleHRlcm4gdW5zcGVjaWZpZWQgX01wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgT3BlcmF0aW9uPgorY2xhc3MgYmluZGVyMXN0ICAgICAvLyBkZXByZWNhdGVkIGluIEMrKzExLCByZW1vdmVkIGluIEMrKzE3CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBPcGVyYXRpb246OnJlc3VsdF90eXBlPgoreworcHJvdGVjdGVkOgorICAgIE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcDsKKyAgICB0eXBlbmFtZSBPcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUgdmFsdWU7CitwdWJsaWM6CisgICAgYmluZGVyMXN0KGNvbnN0IE9wZXJhdGlvbiYgeCwgY29uc3QgdHlwZW5hbWUgT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlIHkpOworICAgIHR5cGVuYW1lIE9wZXJhdGlvbjo6cmVzdWx0X3R5cGUgb3BlcmF0b3IoKSggICAgICB0eXBlbmFtZSBPcGVyYXRpb246OnNlY29uZF9hcmd1bWVudF90eXBlJiB4KSBjb25zdDsKKyAgICB0eXBlbmFtZSBPcGVyYXRpb246OnJlc3VsdF90eXBlIG9wZXJhdG9yKCkoY29uc3QgdHlwZW5hbWUgT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSYgeCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgT3BlcmF0aW9uLCBjbGFzcyBUPgorYmluZGVyMXN0PE9wZXJhdGlvbj4gYmluZDFzdChjb25zdCBPcGVyYXRpb24mIG9wLCBjb25zdCBUJiB4KTsgIC8vIGRlcHJlY2F0ZWQgaW4gQysrMTEsIHJlbW92ZWQgaW4gQysrMTcKKwordGVtcGxhdGUgPGNsYXNzIE9wZXJhdGlvbj4KK2NsYXNzIGJpbmRlcjJuZCAgICAgLy8gZGVwcmVjYXRlZCBpbiBDKysxMSwgcmVtb3ZlZCBpbiBDKysxNworICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIE9wZXJhdGlvbjo6Zmlyc3RfYXJndW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBPcGVyYXRpb246OnJlc3VsdF90eXBlPgoreworcHJvdGVjdGVkOgorICAgIE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3A7CisgICAgdHlwZW5hbWUgT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSB2YWx1ZTsKK3B1YmxpYzoKKyAgICBiaW5kZXIybmQoY29uc3QgT3BlcmF0aW9uJiB4LCBjb25zdCB0eXBlbmFtZSBPcGVyYXRpb246OnNlY29uZF9hcmd1bWVudF90eXBlIHkpOworICAgIHR5cGVuYW1lIE9wZXJhdGlvbjo6cmVzdWx0X3R5cGUgb3BlcmF0b3IoKSggICAgICB0eXBlbmFtZSBPcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUmIHgpIGNvbnN0OworICAgIHR5cGVuYW1lIE9wZXJhdGlvbjo6cmVzdWx0X3R5cGUgb3BlcmF0b3IoKShjb25zdCB0eXBlbmFtZSBPcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUmIHgpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIE9wZXJhdGlvbiwgY2xhc3MgVD4KK2JpbmRlcjJuZDxPcGVyYXRpb24+IGJpbmQybmQoY29uc3QgT3BlcmF0aW9uJiBvcCwgY29uc3QgVCYgeCk7ICAvLyBkZXByZWNhdGVkIGluIEMrKzExLCByZW1vdmVkIGluIEMrKzE3CisKK3RlbXBsYXRlIDxjbGFzcyBBcmcsIGNsYXNzIFJlc3VsdD4gICAgICAvLyBkZXByZWNhdGVkIGluIEMrKzExLCByZW1vdmVkIGluIEMrKzE3CitjbGFzcyBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPEFyZywgUmVzdWx0PgoreworcHVibGljOgorICAgIGV4cGxpY2l0IHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb24oUmVzdWx0ICgqZikoQXJnKSk7CisgICAgUmVzdWx0IG9wZXJhdG9yKCkoQXJnIHgpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIEFyZywgY2xhc3MgUmVzdWx0PgorcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbjxBcmcsUmVzdWx0PiBwdHJfZnVuKFJlc3VsdCAoKmYpKEFyZykpOyAgICAgIC8vIGRlcHJlY2F0ZWQgaW4gQysrMTEsIHJlbW92ZWQgaW4gQysrMTcKKwordGVtcGxhdGUgPGNsYXNzIEFyZzEsIGNsYXNzIEFyZzIsIGNsYXNzIFJlc3VsdD4gICAgICAvLyBkZXByZWNhdGVkIGluIEMrKzExLCByZW1vdmVkIGluIEMrKzE3CitjbGFzcyBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbiA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248QXJnMSwgQXJnMiwgUmVzdWx0PgoreworcHVibGljOgorICAgIGV4cGxpY2l0IHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uKFJlc3VsdCAoKmYpKEFyZzEsIEFyZzIpKTsKKyAgICBSZXN1bHQgb3BlcmF0b3IoKShBcmcxIHgsIEFyZzIgeSkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgQXJnMSwgY2xhc3MgQXJnMiwgY2xhc3MgUmVzdWx0PgorcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb248QXJnMSxBcmcyLFJlc3VsdD4gcHRyX2Z1bihSZXN1bHQgKCpmKShBcmcxLEFyZzIpKTsgICAgICAvLyBkZXByZWNhdGVkIGluIEMrKzExLCByZW1vdmVkIGluIEMrKzE3CisKK3RlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+ICAgICAgLy8gZGVwcmVjYXRlZCBpbiBDKysxMSwgcmVtb3ZlZCBpbiBDKysxNworY2xhc3MgbWVtX2Z1bl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPFQqLCBTPgoreworcHVibGljOgorICAgIGV4cGxpY2l0IG1lbV9mdW5fdChTIChUOjoqcCkoKSk7CisgICAgUyBvcGVyYXRvcigpKFQqIHApIGNvbnN0OworfTsKKwordGVtcGxhdGU8Y2xhc3MgUywgY2xhc3MgVCwgY2xhc3MgQT4KK2NsYXNzIG1lbV9mdW4xX3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPFQqLCBBLCBTPiAgICAgIC8vIGRlcHJlY2F0ZWQgaW4gQysrMTEsIHJlbW92ZWQgaW4gQysrMTcKK3sKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBtZW1fZnVuMV90KFMgKFQ6OipwKShBKSk7CisgICAgUyBvcGVyYXRvcigpKFQqIHAsIEEgeCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBTLCBjbGFzcyBUPiAgICAgICAgICBtZW1fZnVuX3Q8UyxUPiAgICBtZW1fZnVuKFMgKFQ6OipmKSgpKTsgICAgICAvLyBkZXByZWNhdGVkIGluIEMrKzExLCByZW1vdmVkIGluIEMrKzE3Cit0ZW1wbGF0ZTxjbGFzcyBTLCBjbGFzcyBULCBjbGFzcyBBPiBtZW1fZnVuMV90PFMsVCxBPiBtZW1fZnVuKFMgKFQ6OipmKShBKSk7ICAgICAvLyBkZXByZWNhdGVkIGluIEMrKzExLCByZW1vdmVkIGluIEMrKzE3CisKK3RlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+CitjbGFzcyBtZW1fZnVuX3JlZl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPFQsIFM+ICAgICAgLy8gZGVwcmVjYXRlZCBpbiBDKysxMSwgcmVtb3ZlZCBpbiBDKysxNworeworcHVibGljOgorICAgIGV4cGxpY2l0IG1lbV9mdW5fcmVmX3QoUyAoVDo6KnApKCkpOworICAgIFMgb3BlcmF0b3IoKShUJiBwKSBjb25zdDsKK307CisKK3RlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQsIGNsYXNzIEE+CitjbGFzcyBtZW1fZnVuMV9yZWZfdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248VCwgQSwgUz4gICAgICAvLyBkZXByZWNhdGVkIGluIEMrKzExLCByZW1vdmVkIGluIEMrKzE3Cit7CitwdWJsaWM6CisgICAgZXhwbGljaXQgbWVtX2Z1bjFfcmVmX3QoUyAoVDo6KnApKEEpKTsKKyAgICBTIG9wZXJhdG9yKCkoVCYgcCwgQSB4KSBjb25zdDsKK307CisKK3RlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+ICAgICAgICAgIG1lbV9mdW5fcmVmX3Q8UyxUPiAgICBtZW1fZnVuX3JlZihTIChUOjoqZikoKSk7ICAgICAgLy8gZGVwcmVjYXRlZCBpbiBDKysxMSwgcmVtb3ZlZCBpbiBDKysxNwordGVtcGxhdGU8Y2xhc3MgUywgY2xhc3MgVCwgY2xhc3MgQT4gbWVtX2Z1bjFfcmVmX3Q8UyxULEE+IG1lbV9mdW5fcmVmKFMgKFQ6OipmKShBKSk7ICAgICAvLyBkZXByZWNhdGVkIGluIEMrKzExLCByZW1vdmVkIGluIEMrKzE3CisKK3RlbXBsYXRlIDxjbGFzcyBTLCBjbGFzcyBUPgorY2xhc3MgY29uc3RfbWVtX2Z1bl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGNvbnN0IFQqLCBTPiAgICAgIC8vIGRlcHJlY2F0ZWQgaW4gQysrMTEsIHJlbW92ZWQgaW4gQysrMTcKK3sKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBjb25zdF9tZW1fZnVuX3QoUyAoVDo6KnApKCkgY29uc3QpOworICAgIFMgb3BlcmF0b3IoKShjb25zdCBUKiBwKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBTLCBjbGFzcyBULCBjbGFzcyBBPgorY2xhc3MgY29uc3RfbWVtX2Z1bjFfdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248Y29uc3QgVCosIEEsIFM+ICAgICAgLy8gZGVwcmVjYXRlZCBpbiBDKysxMSwgcmVtb3ZlZCBpbiBDKysxNworeworcHVibGljOgorICAgIGV4cGxpY2l0IGNvbnN0X21lbV9mdW4xX3QoUyAoVDo6KnApKEEpIGNvbnN0KTsKKyAgICBTIG9wZXJhdG9yKCkoY29uc3QgVCogcCwgQSB4KSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBTLCBjbGFzcyBUPiAgICAgICAgICBjb25zdF9tZW1fZnVuX3Q8UyxUPiAgICBtZW1fZnVuKFMgKFQ6OipmKSgpIGNvbnN0KTsgICAgICAvLyBkZXByZWNhdGVkIGluIEMrKzExLCByZW1vdmVkIGluIEMrKzE3Cit0ZW1wbGF0ZSA8Y2xhc3MgUywgY2xhc3MgVCwgY2xhc3MgQT4gY29uc3RfbWVtX2Z1bjFfdDxTLFQsQT4gbWVtX2Z1bihTIChUOjoqZikoQSkgY29uc3QpOyAgICAgLy8gZGVwcmVjYXRlZCBpbiBDKysxMSwgcmVtb3ZlZCBpbiBDKysxNworCit0ZW1wbGF0ZSA8Y2xhc3MgUywgY2xhc3MgVD4KK2NsYXNzIGNvbnN0X21lbV9mdW5fcmVmX3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248VCwgUz4gICAgICAvLyBkZXByZWNhdGVkIGluIEMrKzExLCByZW1vdmVkIGluIEMrKzE3Cit7CitwdWJsaWM6CisgICAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bl9yZWZfdChTIChUOjoqcCkoKSBjb25zdCk7CisgICAgUyBvcGVyYXRvcigpKGNvbnN0IFQmIHApIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFMsIGNsYXNzIFQsIGNsYXNzIEE+CitjbGFzcyBjb25zdF9tZW1fZnVuMV9yZWZfdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248VCwgQSwgUz4gICAgICAvLyBkZXByZWNhdGVkIGluIEMrKzExLCByZW1vdmVkIGluIEMrKzE3Cit7CitwdWJsaWM6CisgICAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bjFfcmVmX3QoUyAoVDo6KnApKEEpIGNvbnN0KTsKKyAgICBTIG9wZXJhdG9yKCkoY29uc3QgVCYgcCwgQSB4KSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBTLCBjbGFzcyBUPiAgICAgICAgICBjb25zdF9tZW1fZnVuX3JlZl90PFMsVD4gICAgbWVtX2Z1bl9yZWYoUyAoVDo6KmYpKCkgY29uc3QpOyAgIC8vIGRlcHJlY2F0ZWQgaW4gQysrMTEsIHJlbW92ZWQgaW4gQysrMTcKK3RlbXBsYXRlIDxjbGFzcyBTLCBjbGFzcyBULCBjbGFzcyBBPiBjb25zdF9tZW1fZnVuMV9yZWZfdDxTLFQsQT4gbWVtX2Z1bl9yZWYoUyAoVDo6KmYpKEEpIGNvbnN0KTsgIC8vIGRlcHJlY2F0ZWQgaW4gQysrMTEsIHJlbW92ZWQgaW4gQysrMTcKKwordGVtcGxhdGU8Y2xhc3MgUiwgY2xhc3MgVD4gdW5zcGVjaWZpZWQgbWVtX2ZuKFIgVDo6Kik7CisKK2NsYXNzIGJhZF9mdW5jdGlvbl9jYWxsCisgICAgOiBwdWJsaWMgZXhjZXB0aW9uCit7Cit9OworCit0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgZnVuY3Rpb247IC8vIHVuZGVmaW5lZAorCit0ZW1wbGF0ZTxjbGFzcyBSLCBjbGFzcy4uLiBBcmdUeXBlcz4KK2NsYXNzIGZ1bmN0aW9uPFIoQXJnVHlwZXMuLi4pPgorICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxUMSwgUj4gICAgICAvLyBpZmYgc2l6ZW9mLi4uKEFyZ1R5cGVzKSA9PSAxIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcmdUeXBlcyBjb250YWlucyBUMQorICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248VDEsIFQyLCBSPiAvLyBpZmYgc2l6ZW9mLi4uKEFyZ1R5cGVzKSA9PSAyIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcmdUeXBlcyBjb250YWlucyBUMSBhbmQgVDIKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFIgcmVzdWx0X3R5cGU7CisKKyAgICAvLyBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgIGZ1bmN0aW9uKCkgbm9leGNlcHQ7CisgICAgZnVuY3Rpb24obnVsbHB0cl90KSBub2V4Y2VwdDsKKyAgICBmdW5jdGlvbihjb25zdCBmdW5jdGlvbiYpOworICAgIGZ1bmN0aW9uKGZ1bmN0aW9uJiYpIG5vZXhjZXB0OworICAgIHRlbXBsYXRlPGNsYXNzIEY+CisgICAgICBmdW5jdGlvbihGKTsKKyAgICB0ZW1wbGF0ZTxBbGxvY2F0b3IgQWxsb2M+CisgICAgICBmdW5jdGlvbihhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IEFsbG9jJikgbm9leGNlcHQ7ICAgICAgICAgICAgLy8gcmVtb3ZlZCBpbiBDKysxNworICAgIHRlbXBsYXRlPEFsbG9jYXRvciBBbGxvYz4KKyAgICAgIGZ1bmN0aW9uKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgQWxsb2MmLCBudWxscHRyX3QpIG5vZXhjZXB0OyAvLyByZW1vdmVkIGluIEMrKzE3CisgICAgdGVtcGxhdGU8QWxsb2NhdG9yIEFsbG9jPgorICAgICAgZnVuY3Rpb24oYWxsb2NhdG9yX2FyZ190LCBjb25zdCBBbGxvYyYsIGNvbnN0IGZ1bmN0aW9uJik7ICAgIC8vIHJlbW92ZWQgaW4gQysrMTcKKyAgICB0ZW1wbGF0ZTxBbGxvY2F0b3IgQWxsb2M+CisgICAgICBmdW5jdGlvbihhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IEFsbG9jJiwgZnVuY3Rpb24mJik7ICAgICAgICAgLy8gcmVtb3ZlZCBpbiBDKysxNworICAgIHRlbXBsYXRlPGNsYXNzIEYsIEFsbG9jYXRvciBBbGxvYz4KKyAgICAgIGZ1bmN0aW9uKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgQWxsb2MmLCBGKTsgICAgICAgICAgICAgICAgICAvLyByZW1vdmVkIGluIEMrKzE3CisKKyAgICBmdW5jdGlvbiYgb3BlcmF0b3I9KGNvbnN0IGZ1bmN0aW9uJik7CisgICAgZnVuY3Rpb24mIG9wZXJhdG9yPShmdW5jdGlvbiYmKSBub2V4Y2VwdDsKKyAgICBmdW5jdGlvbiYgb3BlcmF0b3I9KG51bGxwdHJfdCkgbm9leGNlcHQ7CisgICAgdGVtcGxhdGU8Y2xhc3MgRj4KKyAgICAgIGZ1bmN0aW9uJiBvcGVyYXRvcj0oRiYmKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBGPgorICAgICAgZnVuY3Rpb24mIG9wZXJhdG9yPShyZWZlcmVuY2Vfd3JhcHBlcjxGPikgbm9leGNlcHQ7CisKKyAgICB+ZnVuY3Rpb24oKTsKKworICAgIC8vIGZ1bmN0aW9uIG1vZGlmaWVyczoKKyAgICB2b2lkIHN3YXAoZnVuY3Rpb24mKSBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBGLCBjbGFzcyBBbGxvYz4KKyAgICAgIHZvaWQgYXNzaWduKEYmJiwgY29uc3QgQWxsb2MmKTsgICAgICAgICAgICAgICAgIC8vIFJlbW92ZWQgaW4gQysrMTcKKworICAgIC8vIGZ1bmN0aW9uIGNhcGFjaXR5OgorICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBub2V4Y2VwdDsKKworICAgIC8vIGZ1bmN0aW9uIGludm9jYXRpb246CisgICAgUiBvcGVyYXRvcigpKEFyZ1R5cGVzLi4uKSBjb25zdDsKKworICAgIC8vIGZ1bmN0aW9uIHRhcmdldCBhY2Nlc3M6CisgICAgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHRhcmdldF90eXBlKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+ICAgICAgIFQqIHRhcmdldCgpIG5vZXhjZXB0OworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjb25zdCBUKiB0YXJnZXQoKSBjb25zdCBub2V4Y2VwdDsKK307CisKKy8vIE51bGwgcG9pbnRlciBjb21wYXJpc29uczoKK3RlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyAuLi4gQXJnVHlwZXM+CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBmdW5jdGlvbjxSKEFyZ1R5cGVzLi4uKT4mLCBudWxscHRyX3QpIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgLi4uIEFyZ1R5cGVzPgorICBib29sIG9wZXJhdG9yPT0obnVsbHB0cl90LCBjb25zdCBmdW5jdGlvbjxSKEFyZ1R5cGVzLi4uKT4mKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIC4uLiBBcmdUeXBlcz4KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGZ1bmN0aW9uPFIoQXJnVHlwZXMuLi4pPiYsIG51bGxwdHJfdCkgbm9leGNlcHQ7CisKK3RlbXBsYXRlIDxjbGFzcyAgUiwgY2xhc3MgLi4uIEFyZ1R5cGVzPgorICBib29sIG9wZXJhdG9yIT0obnVsbHB0cl90LCBjb25zdCBmdW5jdGlvbjxSKEFyZ1R5cGVzLi4uKT4mKSBub2V4Y2VwdDsKKworLy8gc3BlY2lhbGl6ZWQgYWxnb3JpdGhtczoKK3RlbXBsYXRlIDxjbGFzcyAgUiwgY2xhc3MgLi4uIEFyZ1R5cGVzPgorICB2b2lkIHN3YXAoZnVuY3Rpb248UihBcmdUeXBlcy4uLik+JiwgZnVuY3Rpb248UihBcmdUeXBlcy4uLik+Jikgbm9leGNlcHQ7CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaGFzaDsKKwordGVtcGxhdGUgPD4gc3RydWN0IGhhc2g8Ym9vbD47Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaGFzaDxjaGFyPjsKK3RlbXBsYXRlIDw+IHN0cnVjdCBoYXNoPHNpZ25lZCBjaGFyPjsKK3RlbXBsYXRlIDw+IHN0cnVjdCBoYXNoPHVuc2lnbmVkIGNoYXI+OwordGVtcGxhdGUgPD4gc3RydWN0IGhhc2g8Y2hhcjE2X3Q+OwordGVtcGxhdGUgPD4gc3RydWN0IGhhc2g8Y2hhcjMyX3Q+OwordGVtcGxhdGUgPD4gc3RydWN0IGhhc2g8d2NoYXJfdD47Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaGFzaDxzaG9ydD47Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaGFzaDx1bnNpZ25lZCBzaG9ydD47Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaGFzaDxpbnQ+OwordGVtcGxhdGUgPD4gc3RydWN0IGhhc2g8dW5zaWduZWQgaW50PjsKK3RlbXBsYXRlIDw+IHN0cnVjdCBoYXNoPGxvbmc+OwordGVtcGxhdGUgPD4gc3RydWN0IGhhc2g8bG9uZyBsb25nPjsKK3RlbXBsYXRlIDw+IHN0cnVjdCBoYXNoPHVuc2lnbmVkIGxvbmc+OwordGVtcGxhdGUgPD4gc3RydWN0IGhhc2g8dW5zaWduZWQgbG9uZyBsb25nPjsKKwordGVtcGxhdGUgPD4gc3RydWN0IGhhc2g8ZmxvYXQ+OwordGVtcGxhdGUgPD4gc3RydWN0IGhhc2g8ZG91YmxlPjsKK3RlbXBsYXRlIDw+IHN0cnVjdCBoYXNoPGxvbmcgZG91YmxlPjsKKwordGVtcGxhdGU8Y2xhc3MgVD4gc3RydWN0IGhhc2g8VCo+OwordGVtcGxhdGUgPD4gc3RydWN0IGhhc2g8bnVsbHB0cl90PjsgIC8vIEMrKzE3CisKK30gIC8vIHN0ZAorCitQT0xJQ1k6ICBGb3Igbm9uLXZhcmlhZGljIGltcGxlbWVudGF0aW9ucywgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgaXMgbGltaXRlZAorICAgICAgICAgdG8gMy4gIEl0IGlzIGhvcGVkIHRoYXQgdGhlIG5lZWQgZm9yIG5vbi12YXJpYWRpYyBpbXBsZW1lbnRhdGlvbnMKKyAgICAgICAgIHdpbGwgYmUgbWluaW1hbC4KKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHR5cGVpbmZvPgorI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPF9fZnVuY3Rpb25hbF9iYXNlPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPGNsYXNzIF9UcCA9IHZvaWQ+CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyNlbmRpZgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHBsdXMgOiBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4KK3sKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIF9feCArIF9feTt9Cit9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgcGx1czx2b2lkPgoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYXV0byBvcGVyYXRvcigpKF9UMSYmIF9fdCwgX1QyJiYgX191KSBjb25zdAorICAgIF9OT0VYQ0VQVF8obm9leGNlcHQoX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpICsgX1ZTVEQ6OmZvcndhcmQ8X1QyPihfX3UpKSkKKyAgICAtPiBkZWNsdHlwZSAgICAgICAgKF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSArIF9WU1REOjpmb3J3YXJkPF9UMj4oX191KSkKKyAgICAgICAgeyByZXR1cm4gICAgICAgIF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSArIF9WU1REOjpmb3J3YXJkPF9UMj4oX191KTsgfQorICAgIHR5cGVkZWYgdm9pZCBpc190cmFuc3BhcmVudDsKK307CisjZW5kaWYKKworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxjbGFzcyBfVHAgPSB2b2lkPgorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisjZW5kaWYKK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBtaW51cyA6IGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgX1RwPgoreworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX194IC0gX195O30KK307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBtaW51czx2b2lkPgoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYXV0byBvcGVyYXRvcigpKF9UMSYmIF9fdCwgX1QyJiYgX191KSBjb25zdAorICAgIF9OT0VYQ0VQVF8obm9leGNlcHQoX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpIC0gX1ZTVEQ6OmZvcndhcmQ8X1QyPihfX3UpKSkKKyAgICAtPiBkZWNsdHlwZSAgICAgICAgKF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSAtIF9WU1REOjpmb3J3YXJkPF9UMj4oX191KSkKKyAgICAgICAgeyByZXR1cm4gICAgICAgIF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSAtIF9WU1REOjpmb3J3YXJkPF9UMj4oX191KTsgfQorICAgIHR5cGVkZWYgdm9pZCBpc190cmFuc3BhcmVudDsKK307CisjZW5kaWYKKworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxjbGFzcyBfVHAgPSB2b2lkPgorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisjZW5kaWYKK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBtdWx0aXBsaWVzIDogYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBfVHA+Cit7CisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgICAge3JldHVybiBfX3ggKiBfX3k7fQorfTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIG11bHRpcGxpZXM8dm9pZD4KK3sKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGF1dG8gb3BlcmF0b3IoKShfVDEmJiBfX3QsIF9UMiYmIF9fdSkgY29uc3QKKyAgICBfTk9FWENFUFRfKG5vZXhjZXB0KF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSAqIF9WU1REOjpmb3J3YXJkPF9UMj4oX191KSkpCisgICAgLT4gZGVjbHR5cGUgICAgICAgIChfVlNURDo6Zm9yd2FyZDxfVDE+KF9fdCkgKiBfVlNURDo6Zm9yd2FyZDxfVDI+KF9fdSkpCisgICAgICAgIHsgcmV0dXJuICAgICAgICBfVlNURDo6Zm9yd2FyZDxfVDE+KF9fdCkgKiBfVlNURDo6Zm9yd2FyZDxfVDI+KF9fdSk7IH0KKyAgICB0eXBlZGVmIHZvaWQgaXNfdHJhbnNwYXJlbnQ7Cit9OworI2VuZGlmCisKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwID0gdm9pZD4KKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorI2VuZGlmCitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgZGl2aWRlcyA6IGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgX1RwPgoreworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX194IC8gX195O30KK307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBkaXZpZGVzPHZvaWQ+Cit7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBhdXRvIG9wZXJhdG9yKCkoX1QxJiYgX190LCBfVDImJiBfX3UpIGNvbnN0CisgICAgX05PRVhDRVBUXyhub2V4Y2VwdChfVlNURDo6Zm9yd2FyZDxfVDE+KF9fdCkgLyBfVlNURDo6Zm9yd2FyZDxfVDI+KF9fdSkpKQorICAgIC0+IGRlY2x0eXBlICAgICAgICAoX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpIC8gX1ZTVEQ6OmZvcndhcmQ8X1QyPihfX3UpKQorICAgICAgICB7IHJldHVybiAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpIC8gX1ZTVEQ6OmZvcndhcmQ8X1QyPihfX3UpOyB9CisgICAgdHlwZWRlZiB2b2lkIGlzX3RyYW5zcGFyZW50OworfTsKKyNlbmRpZgorCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPGNsYXNzIF9UcCA9IHZvaWQ+CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyNlbmRpZgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIG1vZHVsdXMgOiBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4KK3sKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIF9feCAlIF9feTt9Cit9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgbW9kdWx1czx2b2lkPgoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYXV0byBvcGVyYXRvcigpKF9UMSYmIF9fdCwgX1QyJiYgX191KSBjb25zdAorICAgIF9OT0VYQ0VQVF8obm9leGNlcHQoX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpICUgX1ZTVEQ6OmZvcndhcmQ8X1QyPihfX3UpKSkKKyAgICAtPiBkZWNsdHlwZSAgICAgICAgKF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSAlIF9WU1REOjpmb3J3YXJkPF9UMj4oX191KSkKKyAgICAgICAgeyByZXR1cm4gICAgICAgIF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSAlIF9WU1REOjpmb3J3YXJkPF9UMj4oX191KTsgfQorICAgIHR5cGVkZWYgdm9pZCBpc190cmFuc3BhcmVudDsKK307CisjZW5kaWYKKworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxjbGFzcyBfVHAgPSB2b2lkPgorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisjZW5kaWYKK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBuZWdhdGUgOiB1bmFyeV9mdW5jdGlvbjxfVHAsIF9UcD4KK3sKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gLV9feDt9Cit9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgbmVnYXRlPHZvaWQ+Cit7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYXV0byBvcGVyYXRvcigpKF9UcCYmIF9feCkgY29uc3QKKyAgICBfTk9FWENFUFRfKG5vZXhjZXB0KC0gX1ZTVEQ6OmZvcndhcmQ8X1RwPihfX3gpKSkKKyAgICAtPiBkZWNsdHlwZSAgICAgICAgKC0gX1ZTVEQ6OmZvcndhcmQ8X1RwPihfX3gpKQorICAgICAgICB7IHJldHVybiAgICAgICAgLSBfVlNURDo6Zm9yd2FyZDxfVHA+KF9feCk7IH0KKyAgICB0eXBlZGVmIHZvaWQgaXNfdHJhbnNwYXJlbnQ7Cit9OworI2VuZGlmCisKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwID0gdm9pZD4KKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorI2VuZGlmCitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgZXF1YWxfdG8gOiBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIGJvb2w+Cit7CisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX194ID09IF9feTt9Cit9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgZXF1YWxfdG88dm9pZD4KK3sKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGF1dG8gb3BlcmF0b3IoKShfVDEmJiBfX3QsIF9UMiYmIF9fdSkgY29uc3QKKyAgICBfTk9FWENFUFRfKG5vZXhjZXB0KF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSA9PSBfVlNURDo6Zm9yd2FyZDxfVDI+KF9fdSkpKQorICAgIC0+IGRlY2x0eXBlICAgICAgICAoX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpID09IF9WU1REOjpmb3J3YXJkPF9UMj4oX191KSkKKyAgICAgICAgeyByZXR1cm4gICAgICAgIF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSA9PSBfVlNURDo6Zm9yd2FyZDxfVDI+KF9fdSk7IH0KKyAgICB0eXBlZGVmIHZvaWQgaXNfdHJhbnNwYXJlbnQ7Cit9OworI2VuZGlmCisKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwID0gdm9pZD4KKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorI2VuZGlmCitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgbm90X2VxdWFsX3RvIDogYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBib29sPgoreworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIF9feCAhPSBfX3k7fQorfTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIG5vdF9lcXVhbF90bzx2b2lkPgoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYXV0byBvcGVyYXRvcigpKF9UMSYmIF9fdCwgX1QyJiYgX191KSBjb25zdAorICAgIF9OT0VYQ0VQVF8obm9leGNlcHQoX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpICE9IF9WU1REOjpmb3J3YXJkPF9UMj4oX191KSkpCisgICAgLT4gZGVjbHR5cGUgICAgICAgIChfVlNURDo6Zm9yd2FyZDxfVDE+KF9fdCkgIT0gX1ZTVEQ6OmZvcndhcmQ8X1QyPihfX3UpKQorICAgICAgICB7IHJldHVybiAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpICE9IF9WU1REOjpmb3J3YXJkPF9UMj4oX191KTsgfQorICAgIHR5cGVkZWYgdm9pZCBpc190cmFuc3BhcmVudDsKK307CisjZW5kaWYKKworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxjbGFzcyBfVHAgPSB2b2lkPgorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisjZW5kaWYKK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBncmVhdGVyIDogYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBib29sPgoreworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIF9feCA+IF9feTt9Cit9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgZ3JlYXRlcjx2b2lkPgoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYXV0byBvcGVyYXRvcigpKF9UMSYmIF9fdCwgX1QyJiYgX191KSBjb25zdAorICAgIF9OT0VYQ0VQVF8obm9leGNlcHQoX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpID4gX1ZTVEQ6OmZvcndhcmQ8X1QyPihfX3UpKSkKKyAgICAtPiBkZWNsdHlwZSAgICAgICAgKF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSA+IF9WU1REOjpmb3J3YXJkPF9UMj4oX191KSkKKyAgICAgICAgeyByZXR1cm4gICAgICAgIF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSA+IF9WU1REOjpmb3J3YXJkPF9UMj4oX191KTsgfQorICAgIHR5cGVkZWYgdm9pZCBpc190cmFuc3BhcmVudDsKK307CisjZW5kaWYKKworCisvLyBsZXNzIGluIDxfX2Z1bmN0aW9uYWxfYmFzZT4KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwID0gdm9pZD4KKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorI2VuZGlmCitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgZ3JlYXRlcl9lcXVhbCA6IGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4KK3sKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgICAge3JldHVybiBfX3ggPj0gX195O30KK307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBncmVhdGVyX2VxdWFsPHZvaWQ+Cit7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBhdXRvIG9wZXJhdG9yKCkoX1QxJiYgX190LCBfVDImJiBfX3UpIGNvbnN0CisgICAgX05PRVhDRVBUXyhub2V4Y2VwdChfVlNURDo6Zm9yd2FyZDxfVDE+KF9fdCkgPj0gX1ZTVEQ6OmZvcndhcmQ8X1QyPihfX3UpKSkKKyAgICAtPiBkZWNsdHlwZSAgICAgICAgKF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSA+PSBfVlNURDo6Zm9yd2FyZDxfVDI+KF9fdSkpCisgICAgICAgIHsgcmV0dXJuICAgICAgICBfVlNURDo6Zm9yd2FyZDxfVDE+KF9fdCkgPj0gX1ZTVEQ6OmZvcndhcmQ8X1QyPihfX3UpOyB9CisgICAgdHlwZWRlZiB2b2lkIGlzX3RyYW5zcGFyZW50OworfTsKKyNlbmRpZgorCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPGNsYXNzIF9UcCA9IHZvaWQ+CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyNlbmRpZgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGxlc3NfZXF1YWwgOiBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIGJvb2w+Cit7CisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX194IDw9IF9feTt9Cit9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgbGVzc19lcXVhbDx2b2lkPgoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYXV0byBvcGVyYXRvcigpKF9UMSYmIF9fdCwgX1QyJiYgX191KSBjb25zdAorICAgIF9OT0VYQ0VQVF8obm9leGNlcHQoX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpIDw9IF9WU1REOjpmb3J3YXJkPF9UMj4oX191KSkpCisgICAgLT4gZGVjbHR5cGUgICAgICAgIChfVlNURDo6Zm9yd2FyZDxfVDE+KF9fdCkgPD0gX1ZTVEQ6OmZvcndhcmQ8X1QyPihfX3UpKQorICAgICAgICB7IHJldHVybiAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpIDw9IF9WU1REOjpmb3J3YXJkPF9UMj4oX191KTsgfQorICAgIHR5cGVkZWYgdm9pZCBpc190cmFuc3BhcmVudDsKK307CisjZW5kaWYKKworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxjbGFzcyBfVHAgPSB2b2lkPgorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisjZW5kaWYKK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBsb2dpY2FsX2FuZCA6IGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4KK3sKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgICAge3JldHVybiBfX3ggJiYgX195O30KK307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBsb2dpY2FsX2FuZDx2b2lkPgoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYXV0byBvcGVyYXRvcigpKF9UMSYmIF9fdCwgX1QyJiYgX191KSBjb25zdAorICAgIF9OT0VYQ0VQVF8obm9leGNlcHQoX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpICYmIF9WU1REOjpmb3J3YXJkPF9UMj4oX191KSkpCisgICAgLT4gZGVjbHR5cGUgICAgICAgIChfVlNURDo6Zm9yd2FyZDxfVDE+KF9fdCkgJiYgX1ZTVEQ6OmZvcndhcmQ8X1QyPihfX3UpKQorICAgICAgICB7IHJldHVybiAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpICYmIF9WU1REOjpmb3J3YXJkPF9UMj4oX191KTsgfQorICAgIHR5cGVkZWYgdm9pZCBpc190cmFuc3BhcmVudDsKK307CisjZW5kaWYKKworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxjbGFzcyBfVHAgPSB2b2lkPgorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisjZW5kaWYKK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBsb2dpY2FsX29yIDogYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBib29sPgoreworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIF9feCB8fCBfX3k7fQorfTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGxvZ2ljYWxfb3I8dm9pZD4KK3sKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGF1dG8gb3BlcmF0b3IoKShfVDEmJiBfX3QsIF9UMiYmIF9fdSkgY29uc3QKKyAgICBfTk9FWENFUFRfKG5vZXhjZXB0KF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSB8fCBfVlNURDo6Zm9yd2FyZDxfVDI+KF9fdSkpKQorICAgIC0+IGRlY2x0eXBlICAgICAgICAoX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpIHx8IF9WU1REOjpmb3J3YXJkPF9UMj4oX191KSkKKyAgICAgICAgeyByZXR1cm4gICAgICAgIF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSB8fCBfVlNURDo6Zm9yd2FyZDxfVDI+KF9fdSk7IH0KKyAgICB0eXBlZGVmIHZvaWQgaXNfdHJhbnNwYXJlbnQ7Cit9OworI2VuZGlmCisKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwID0gdm9pZD4KKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorI2VuZGlmCitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgbG9naWNhbF9ub3QgOiB1bmFyeV9mdW5jdGlvbjxfVHAsIGJvb2w+Cit7CisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCkgY29uc3QKKyAgICAgICAge3JldHVybiAhX194O30KK307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBsb2dpY2FsX25vdDx2b2lkPgoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGF1dG8gb3BlcmF0b3IoKShfVHAmJiBfX3gpIGNvbnN0CisgICAgX05PRVhDRVBUXyhub2V4Y2VwdCghX1ZTVEQ6OmZvcndhcmQ8X1RwPihfX3gpKSkKKyAgICAtPiBkZWNsdHlwZSAgICAgICAgKCFfVlNURDo6Zm9yd2FyZDxfVHA+KF9feCkpCisgICAgICAgIHsgcmV0dXJuICAgICAgICAhX1ZTVEQ6OmZvcndhcmQ8X1RwPihfX3gpOyB9CisgICAgdHlwZWRlZiB2b2lkIGlzX3RyYW5zcGFyZW50OworfTsKKyNlbmRpZgorCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPGNsYXNzIF9UcCA9IHZvaWQ+CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyNlbmRpZgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGJpdF9hbmQgOiBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4KK3sKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIF9feCAmIF9feTt9Cit9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgYml0X2FuZDx2b2lkPgoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYXV0byBvcGVyYXRvcigpKF9UMSYmIF9fdCwgX1QyJiYgX191KSBjb25zdAorICAgIF9OT0VYQ0VQVF8obm9leGNlcHQoX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpICYgX1ZTVEQ6OmZvcndhcmQ8X1QyPihfX3UpKSkKKyAgICAtPiBkZWNsdHlwZSAgICAgICAgKF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSAmIF9WU1REOjpmb3J3YXJkPF9UMj4oX191KSkKKyAgICAgICAgeyByZXR1cm4gICAgICAgIF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSAmIF9WU1REOjpmb3J3YXJkPF9UMj4oX191KTsgfQorICAgIHR5cGVkZWYgdm9pZCBpc190cmFuc3BhcmVudDsKK307CisjZW5kaWYKKworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxjbGFzcyBfVHAgPSB2b2lkPgorI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisjZW5kaWYKK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBiaXRfb3IgOiBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4KK3sKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIF9feCB8IF9feTt9Cit9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgYml0X29yPHZvaWQ+Cit7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBhdXRvIG9wZXJhdG9yKCkoX1QxJiYgX190LCBfVDImJiBfX3UpIGNvbnN0CisgICAgX05PRVhDRVBUXyhub2V4Y2VwdChfVlNURDo6Zm9yd2FyZDxfVDE+KF9fdCkgfCBfVlNURDo6Zm9yd2FyZDxfVDI+KF9fdSkpKQorICAgIC0+IGRlY2x0eXBlICAgICAgICAoX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpIHwgX1ZTVEQ6OmZvcndhcmQ8X1QyPihfX3UpKQorICAgICAgICB7IHJldHVybiAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpIHwgX1ZTVEQ6OmZvcndhcmQ8X1QyPihfX3UpOyB9CisgICAgdHlwZWRlZiB2b2lkIGlzX3RyYW5zcGFyZW50OworfTsKKyNlbmRpZgorCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPGNsYXNzIF9UcCA9IHZvaWQ+CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyNlbmRpZgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGJpdF94b3IgOiBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4KK3sKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIF9feCBeIF9feTt9Cit9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgYml0X3hvcjx2b2lkPgoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYXV0byBvcGVyYXRvcigpKF9UMSYmIF9fdCwgX1QyJiYgX191KSBjb25zdAorICAgIF9OT0VYQ0VQVF8obm9leGNlcHQoX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3QpIF4gX1ZTVEQ6OmZvcndhcmQ8X1QyPihfX3UpKSkKKyAgICAtPiBkZWNsdHlwZSAgICAgICAgKF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSBeIF9WU1REOjpmb3J3YXJkPF9UMj4oX191KSkKKyAgICAgICAgeyByZXR1cm4gICAgICAgIF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSBeIF9WU1REOjpmb3J3YXJkPF9UMj4oX191KTsgfQorICAgIHR5cGVkZWYgdm9pZCBpc190cmFuc3BhcmVudDsKK307CisjZW5kaWYKKworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxjbGFzcyBfVHAgPSB2b2lkPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGJpdF9ub3QgOiB1bmFyeV9mdW5jdGlvbjxfVHAsIF9UcD4KK3sKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gfl9feDt9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGJpdF9ub3Q8dm9pZD4KK3sKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBhdXRvIG9wZXJhdG9yKCkoX1RwJiYgX194KSBjb25zdAorICAgIF9OT0VYQ0VQVF8obm9leGNlcHQofl9WU1REOjpmb3J3YXJkPF9UcD4oX194KSkpCisgICAgLT4gZGVjbHR5cGUgICAgICAgICh+X1ZTVEQ6OmZvcndhcmQ8X1RwPihfX3gpKQorICAgICAgICB7IHJldHVybiAgICAgICAgfl9WU1REOjpmb3J3YXJkPF9UcD4oX194KTsgfQorICAgIHR5cGVkZWYgdm9pZCBpc190cmFuc3BhcmVudDsKK307CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB1bmFyeV9uZWdhdGUKKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfUHJlZGljYXRlOjphcmd1bWVudF90eXBlLCBib29sPgoreworICAgIF9QcmVkaWNhdGUgX19wcmVkXzsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgdW5hcnlfbmVnYXRlKGNvbnN0IF9QcmVkaWNhdGUmIF9fcHJlZCkKKyAgICAgICAgOiBfX3ByZWRfKF9fcHJlZCkge30KKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9QcmVkaWNhdGU6OmFyZ3VtZW50X3R5cGUmIF9feCkgY29uc3QKKyAgICAgICAge3JldHVybiAhX19wcmVkXyhfX3gpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgoraW5saW5lIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3VuYXJ5X25lZ2F0ZTxfUHJlZGljYXRlPgorbm90MShjb25zdCBfUHJlZGljYXRlJiBfX3ByZWQpIHtyZXR1cm4gdW5hcnlfbmVnYXRlPF9QcmVkaWNhdGU+KF9fcHJlZCk7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGJpbmFyeV9uZWdhdGUKKyAgICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX1ByZWRpY2F0ZTo6Zmlyc3RfYXJndW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZTo6c2Vjb25kX2FyZ3VtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2w+Cit7CisgICAgX1ByZWRpY2F0ZSBfX3ByZWRfOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZXhwbGljaXQgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgCisgICAgYmluYXJ5X25lZ2F0ZShjb25zdCBfUHJlZGljYXRlJiBfX3ByZWQpIDogX19wcmVkXyhfX3ByZWQpIHt9CisKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9QcmVkaWNhdGU6OmZpcnN0X2FyZ3VtZW50X3R5cGUmIF9feCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgX1ByZWRpY2F0ZTo6c2Vjb25kX2FyZ3VtZW50X3R5cGUmIF9feSkgY29uc3QKKyAgICAgICAge3JldHVybiAhX19wcmVkXyhfX3gsIF9feSk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+CitpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmluYXJ5X25lZ2F0ZTxfUHJlZGljYXRlPgorbm90Mihjb25zdCBfUHJlZGljYXRlJiBfX3ByZWQpIHtyZXR1cm4gYmluYXJ5X25lZ2F0ZTxfUHJlZGljYXRlPihfX3ByZWQpO30KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA8PSAxNCB8fCBkZWZpbmVkKF9MSUJDUFBfRU5BQkxFX0NYWDE3X1JFTU9WRURfQklOREVSUykKK3RlbXBsYXRlIDxjbGFzcyBfX09wZXJhdGlvbj4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGJpbmRlcjFzdAorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9fT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX09wZXJhdGlvbjo6cmVzdWx0X3R5cGU+Cit7Citwcm90ZWN0ZWQ6CisgICAgX19PcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3A7CisgICAgdHlwZW5hbWUgX19PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUgdmFsdWU7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBiaW5kZXIxc3QoY29uc3QgX19PcGVyYXRpb24mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBfX09wZXJhdGlvbjo6Zmlyc3RfYXJndW1lbnRfdHlwZSBfX3kpCisgICAgICAgIDogb3AoX194KSwgdmFsdWUoX195KSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdHlwZW5hbWUgX19PcGVyYXRpb246OnJlc3VsdF90eXBlIG9wZXJhdG9yKCkKKyAgICAgICAgKHR5cGVuYW1lIF9fT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSYgX194KSBjb25zdAorICAgICAgICAgICAge3JldHVybiBvcCh2YWx1ZSwgX194KTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB0eXBlbmFtZSBfX09wZXJhdGlvbjo6cmVzdWx0X3R5cGUgb3BlcmF0b3IoKQorICAgICAgICAoY29uc3QgdHlwZW5hbWUgX19PcGVyYXRpb246OnNlY29uZF9hcmd1bWVudF90eXBlJiBfX3gpIGNvbnN0CisgICAgICAgICAgICB7cmV0dXJuIG9wKHZhbHVlLCBfX3gpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfX09wZXJhdGlvbiwgY2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2JpbmRlcjFzdDxfX09wZXJhdGlvbj4KK2JpbmQxc3QoY29uc3QgX19PcGVyYXRpb24mIF9fb3AsIGNvbnN0IF9UcCYgX194KQorICAgIHtyZXR1cm4gYmluZGVyMXN0PF9fT3BlcmF0aW9uPihfX29wLCBfX3gpO30KKwordGVtcGxhdGUgPGNsYXNzIF9fT3BlcmF0aW9uPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYmluZGVyMm5kCisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX19PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19PcGVyYXRpb246OnJlc3VsdF90eXBlPgoreworcHJvdGVjdGVkOgorICAgIF9fT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcDsKKyAgICB0eXBlbmFtZSBfX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUgdmFsdWU7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJpbmRlcjJuZChjb25zdCBfX09wZXJhdGlvbiYgX194LCBjb25zdCB0eXBlbmFtZSBfX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUgX195KQorICAgICAgICA6IG9wKF9feCksIHZhbHVlKF9feSkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHR5cGVuYW1lIF9fT3BlcmF0aW9uOjpyZXN1bHRfdHlwZSBvcGVyYXRvcigpCisgICAgICAgICggICAgICB0eXBlbmFtZSBfX09wZXJhdGlvbjo6Zmlyc3RfYXJndW1lbnRfdHlwZSYgX194KSBjb25zdAorICAgICAgICAgICAge3JldHVybiBvcChfX3gsIHZhbHVlKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB0eXBlbmFtZSBfX09wZXJhdGlvbjo6cmVzdWx0X3R5cGUgb3BlcmF0b3IoKQorICAgICAgICAoY29uc3QgdHlwZW5hbWUgX19PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUmIF9feCkgY29uc3QKKyAgICAgICAgICAgIHtyZXR1cm4gb3AoX194LCB2YWx1ZSk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9fT3BlcmF0aW9uLCBjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmluZGVyMm5kPF9fT3BlcmF0aW9uPgorYmluZDJuZChjb25zdCBfX09wZXJhdGlvbiYgX19vcCwgY29uc3QgX1RwJiBfX3gpCisgICAge3JldHVybiBiaW5kZXIybmQ8X19PcGVyYXRpb24+KF9fb3AsIF9feCk7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0FyZywgY2xhc3MgX1Jlc3VsdD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb24KKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfQXJnLCBfUmVzdWx0PgoreworICAgIF9SZXN1bHQgKCpfX2ZfKShfQXJnKTsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb24oX1Jlc3VsdCAoKl9fZikoX0FyZykpCisgICAgICAgIDogX19mXyhfX2YpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfUmVzdWx0IG9wZXJhdG9yKCkoX0FyZyBfX3gpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX19mXyhfX3gpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQXJnLCBjbGFzcyBfUmVzdWx0PgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3BvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb248X0FyZyxfUmVzdWx0PgorcHRyX2Z1bihfUmVzdWx0ICgqX19mKShfQXJnKSkKKyAgICB7cmV0dXJuIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb248X0FyZyxfUmVzdWx0PihfX2YpO30KKwordGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMiwgY2xhc3MgX1Jlc3VsdD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uCisgICAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLCBfQXJnMiwgX1Jlc3VsdD4KK3sKKyAgICBfUmVzdWx0ICgqX19mXykoX0FyZzEsIF9BcmcyKTsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uKF9SZXN1bHQgKCpfX2YpKF9BcmcxLCBfQXJnMikpCisgICAgICAgIDogX19mXyhfX2YpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfUmVzdWx0IG9wZXJhdG9yKCkoX0FyZzEgX194LCBfQXJnMiBfX3kpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX19mXyhfX3gsIF9feSk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMiwgY2xhc3MgX1Jlc3VsdD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbjxfQXJnMSxfQXJnMixfUmVzdWx0PgorcHRyX2Z1bihfUmVzdWx0ICgqX19mKShfQXJnMSxfQXJnMikpCisgICAge3JldHVybiBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbjxfQXJnMSxfQXJnMixfUmVzdWx0PihfX2YpO30KKwordGVtcGxhdGU8Y2xhc3MgX1NwLCBjbGFzcyBfVHA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBtZW1fZnVuX3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwKiwgX1NwPgoreworICAgIF9TcCAoX1RwOjoqX19wXykoKTsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IG1lbV9mdW5fdChfU3AgKF9UcDo6Kl9fcCkoKSkKKyAgICAgICAgOiBfX3BfKF9fcCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9TcCBvcGVyYXRvcigpKF9UcCogX19wKSBjb25zdAorICAgICAgICB7cmV0dXJuIChfX3AtPipfX3BfKSgpO30KK307CisKK3RlbXBsYXRlPGNsYXNzIF9TcCwgY2xhc3MgX1RwLCBjbGFzcyBfQXA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBtZW1fZnVuMV90IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAqLCBfQXAsIF9TcD4KK3sKKyAgICBfU3AgKF9UcDo6Kl9fcF8pKF9BcCk7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBleHBsaWNpdCBtZW1fZnVuMV90KF9TcCAoX1RwOjoqX19wKShfQXApKQorICAgICAgICA6IF9fcF8oX19wKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX1NwIG9wZXJhdG9yKCkoX1RwKiBfX3AsIF9BcCBfX3gpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gKF9fcC0+Kl9fcF8pKF9feCk7fQorfTsKKwordGVtcGxhdGU8Y2xhc3MgX1NwLCBjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorbWVtX2Z1bl90PF9TcCxfVHA+CittZW1fZnVuKF9TcCAoX1RwOjoqX19mKSgpKQorICAgIHtyZXR1cm4gbWVtX2Z1bl90PF9TcCxfVHA+KF9fZik7fQorCit0ZW1wbGF0ZTxjbGFzcyBfU3AsIGNsYXNzIF9UcCwgY2xhc3MgX0FwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK21lbV9mdW4xX3Q8X1NwLF9UcCxfQXA+CittZW1fZnVuKF9TcCAoX1RwOjoqX19mKShfQXApKQorICAgIHtyZXR1cm4gbWVtX2Z1bjFfdDxfU3AsX1RwLF9BcD4oX19mKTt9CisKK3RlbXBsYXRlPGNsYXNzIF9TcCwgY2xhc3MgX1RwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgbWVtX2Z1bl9yZWZfdCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsIF9TcD4KK3sKKyAgICBfU3AgKF9UcDo6Kl9fcF8pKCk7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBleHBsaWNpdCBtZW1fZnVuX3JlZl90KF9TcCAoX1RwOjoqX19wKSgpKQorICAgICAgICA6IF9fcF8oX19wKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX1NwIG9wZXJhdG9yKCkoX1RwJiBfX3ApIGNvbnN0CisgICAgICAgIHtyZXR1cm4gKF9fcC4qX19wXykoKTt9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfU3AsIGNsYXNzIF9UcCwgY2xhc3MgX0FwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgbWVtX2Z1bjFfcmVmX3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX0FwLCBfU3A+Cit7CisgICAgX1NwIChfVHA6OipfX3BfKShfQXApOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZXhwbGljaXQgbWVtX2Z1bjFfcmVmX3QoX1NwIChfVHA6OipfX3ApKF9BcCkpCisgICAgICAgIDogX19wXyhfX3ApIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfU3Agb3BlcmF0b3IoKShfVHAmIF9fcCwgX0FwIF9feCkgY29uc3QKKyAgICAgICAge3JldHVybiAoX19wLipfX3BfKShfX3gpO30KK307CisKK3RlbXBsYXRlPGNsYXNzIF9TcCwgY2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK21lbV9mdW5fcmVmX3Q8X1NwLF9UcD4KK21lbV9mdW5fcmVmKF9TcCAoX1RwOjoqX19mKSgpKQorICAgIHtyZXR1cm4gbWVtX2Z1bl9yZWZfdDxfU3AsX1RwPihfX2YpO30KKwordGVtcGxhdGU8Y2xhc3MgX1NwLCBjbGFzcyBfVHAsIGNsYXNzIF9BcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCittZW1fZnVuMV9yZWZfdDxfU3AsX1RwLF9BcD4KK21lbV9mdW5fcmVmKF9TcCAoX1RwOjoqX19mKShfQXApKQorICAgIHtyZXR1cm4gbWVtX2Z1bjFfcmVmX3Q8X1NwLF9UcCxfQXA+KF9fZik7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1NwLCBjbGFzcyBfVHA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBjb25zdF9tZW1fZnVuX3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248Y29uc3QgX1RwKiwgX1NwPgoreworICAgIF9TcCAoX1RwOjoqX19wXykoKSBjb25zdDsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IGNvbnN0X21lbV9mdW5fdChfU3AgKF9UcDo6Kl9fcCkoKSBjb25zdCkKKyAgICAgICAgOiBfX3BfKF9fcCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9TcCBvcGVyYXRvcigpKGNvbnN0IF9UcCogX19wKSBjb25zdAorICAgICAgICB7cmV0dXJuIChfX3AtPipfX3BfKSgpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfU3AsIGNsYXNzIF9UcCwgY2xhc3MgX0FwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgY29uc3RfbWVtX2Z1bjFfdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248Y29uc3QgX1RwKiwgX0FwLCBfU3A+Cit7CisgICAgX1NwIChfVHA6OipfX3BfKShfQXApIGNvbnN0OworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZXhwbGljaXQgY29uc3RfbWVtX2Z1bjFfdChfU3AgKF9UcDo6Kl9fcCkoX0FwKSBjb25zdCkKKyAgICAgICAgOiBfX3BfKF9fcCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9TcCBvcGVyYXRvcigpKGNvbnN0IF9UcCogX19wLCBfQXAgX194KSBjb25zdAorICAgICAgICB7cmV0dXJuIChfX3AtPipfX3BfKShfX3gpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfU3AsIGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdF9tZW1fZnVuX3Q8X1NwLF9UcD4KK21lbV9mdW4oX1NwIChfVHA6OipfX2YpKCkgY29uc3QpCisgICAge3JldHVybiBjb25zdF9tZW1fZnVuX3Q8X1NwLF9UcD4oX19mKTt9CisKK3RlbXBsYXRlIDxjbGFzcyBfU3AsIGNsYXNzIF9UcCwgY2xhc3MgX0FwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0X21lbV9mdW4xX3Q8X1NwLF9UcCxfQXA+CittZW1fZnVuKF9TcCAoX1RwOjoqX19mKShfQXApIGNvbnN0KQorICAgIHtyZXR1cm4gY29uc3RfbWVtX2Z1bjFfdDxfU3AsX1RwLF9BcD4oX19mKTt9CisKK3RlbXBsYXRlIDxjbGFzcyBfU3AsIGNsYXNzIF9UcD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGNvbnN0X21lbV9mdW5fcmVmX3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLCBfU3A+Cit7CisgICAgX1NwIChfVHA6OipfX3BfKSgpIGNvbnN0OworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZXhwbGljaXQgY29uc3RfbWVtX2Z1bl9yZWZfdChfU3AgKF9UcDo6Kl9fcCkoKSBjb25zdCkKKyAgICAgICAgOiBfX3BfKF9fcCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9TcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX19wKSBjb25zdAorICAgICAgICB7cmV0dXJuIChfX3AuKl9fcF8pKCk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9TcCwgY2xhc3MgX1RwLCBjbGFzcyBfQXA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBjb25zdF9tZW1fZnVuMV9yZWZfdAorICAgIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9BcCwgX1NwPgoreworICAgIF9TcCAoX1RwOjoqX19wXykoX0FwKSBjb25zdDsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IGNvbnN0X21lbV9mdW4xX3JlZl90KF9TcCAoX1RwOjoqX19wKShfQXApIGNvbnN0KQorICAgICAgICA6IF9fcF8oX19wKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX1NwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3AsIF9BcCBfX3gpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gKF9fcC4qX19wXykoX194KTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1NwLCBjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RfbWVtX2Z1bl9yZWZfdDxfU3AsX1RwPgorbWVtX2Z1bl9yZWYoX1NwIChfVHA6OipfX2YpKCkgY29uc3QpCisgICAge3JldHVybiBjb25zdF9tZW1fZnVuX3JlZl90PF9TcCxfVHA+KF9fZik7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1NwLCBjbGFzcyBfVHAsIGNsYXNzIF9BcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdF9tZW1fZnVuMV9yZWZfdDxfU3AsX1RwLF9BcD4KK21lbV9mdW5fcmVmKF9TcCAoX1RwOjoqX19mKShfQXApIGNvbnN0KQorICAgIHtyZXR1cm4gY29uc3RfbWVtX2Z1bjFfcmVmX3Q8X1NwLF9UcCxfQXA+KF9fZik7fQorI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVNRlVOCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgX19tZW1fZm4KKyAgICA6IHB1YmxpYyBfX3dlYWtfcmVzdWx0X3R5cGU8X1RwPgoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBfVHAgdHlwZTsKK3ByaXZhdGU6CisgICAgdHlwZSBfX2ZfOworCitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX21lbV9mbih0eXBlIF9fZikgX05PRVhDRVBUIDogX19mXyhfX2YpIHt9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgLy8gaW52b2tlCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdUeXBlcz4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgX19pbnZva2VfcmV0dXJuPHR5cGUsIF9BcmdUeXBlcy4uLj46OnR5cGUKKyAgICBvcGVyYXRvcigpIChfQXJnVHlwZXMmJi4uLiBfX2FyZ3MpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKF9fZl8sIF9WU1REOjpmb3J3YXJkPF9BcmdUeXBlcz4oX19hcmdzKS4uLik7CisgICAgfQorI2Vsc2UKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQTA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIF9faW52b2tlX3JldHVybjA8dHlwZSwgX0EwPjo6dHlwZQorICAgIG9wZXJhdG9yKCkgKF9BMCYgX19hMCkgY29uc3QgeworICAgICAgICByZXR1cm4gX19pbnZva2UoX19mXywgX19hMCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9BMD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgX19pbnZva2VfcmV0dXJuMDx0eXBlLCBfQTAgY29uc3Q+Ojp0eXBlCisgICAgb3BlcmF0b3IoKSAoX0EwIGNvbnN0JiBfX2EwKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfX2ludm9rZShfX2ZfLCBfX2EwKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTE+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIF9faW52b2tlX3JldHVybjE8dHlwZSwgX0EwLCBfQTE+Ojp0eXBlCisgICAgb3BlcmF0b3IoKSAoX0EwJiBfX2EwLCBfQTEmIF9fYTEpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKF9fZl8sIF9fYTAsIF9fYTEpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQTAsIGNsYXNzIF9BMT4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgX19pbnZva2VfcmV0dXJuMTx0eXBlLCBfQTAgY29uc3QsIF9BMT46OnR5cGUKKyAgICBvcGVyYXRvcigpIChfQTAgY29uc3QmIF9fYTAsIF9BMSYgX19hMSkgY29uc3QgeworICAgICAgICByZXR1cm4gX19pbnZva2UoX19mXywgX19hMCwgX19hMSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBfX2ludm9rZV9yZXR1cm4xPHR5cGUsIF9BMCwgX0ExIGNvbnN0Pjo6dHlwZQorICAgIG9wZXJhdG9yKCkgKF9BMCYgX19hMCwgX0ExIGNvbnN0JiBfX2ExKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfX2ludm9rZShfX2ZfLCBfX2EwLCBfX2ExKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTE+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIF9faW52b2tlX3JldHVybjE8dHlwZSwgX0EwIGNvbnN0LCBfQTEgY29uc3Q+Ojp0eXBlCisgICAgb3BlcmF0b3IoKSAoX0EwIGNvbnN0JiBfX2EwLCBfQTEgY29uc3QmIF9fYTEpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKF9fZl8sIF9fYTAsIF9fYTEpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBfX2ludm9rZV9yZXR1cm4yPHR5cGUsIF9BMCwgX0ExLCBfQTI+Ojp0eXBlCisgICAgb3BlcmF0b3IoKSAoX0EwJiBfX2EwLCBfQTEmIF9fYTEsIF9BMiYgX19hMikgY29uc3QgeworICAgICAgICByZXR1cm4gX19pbnZva2UoX19mXywgX19hMCwgX19hMSwgX19hMik7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9BMCwgY2xhc3MgX0ExLCBjbGFzcyBfQTI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIF9faW52b2tlX3JldHVybjI8dHlwZSwgX0EwIGNvbnN0LCBfQTEsIF9BMj46OnR5cGUKKyAgICBvcGVyYXRvcigpIChfQTAgY29uc3QmIF9fYTAsIF9BMSYgX19hMSwgX0EyJiBfX2EyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfX2ludm9rZShfX2ZfLCBfX2EwLCBfX2ExLCBfX2EyKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgX19pbnZva2VfcmV0dXJuMjx0eXBlLCBfQTAsIF9BMSBjb25zdCwgX0EyPjo6dHlwZQorICAgIG9wZXJhdG9yKCkgKF9BMCYgX19hMCwgX0ExIGNvbnN0JiBfX2ExLCBfQTImIF9fYTIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKF9fZl8sIF9fYTAsIF9fYTEsIF9fYTIpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBfX2ludm9rZV9yZXR1cm4yPHR5cGUsIF9BMCwgX0ExLCBfQTIgY29uc3Q+Ojp0eXBlCisgICAgb3BlcmF0b3IoKSAoX0EwJiBfX2EwLCBfQTEmIF9fYTEsIF9BMiBjb25zdCYgX19hMikgY29uc3QgeworICAgICAgICByZXR1cm4gX19pbnZva2UoX19mXywgX19hMCwgX19hMSwgX19hMik7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9BMCwgY2xhc3MgX0ExLCBjbGFzcyBfQTI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIF9faW52b2tlX3JldHVybjI8dHlwZSwgX0EwIGNvbnN0LCBfQTEgY29uc3QsIF9BMj46OnR5cGUKKyAgICBvcGVyYXRvcigpIChfQTAgY29uc3QmIF9fYTAsIF9BMSBjb25zdCYgX19hMSwgX0EyJiBfX2EyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfX2ludm9rZShfX2ZfLCBfX2EwLCBfX2ExLCBfX2EyKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgX19pbnZva2VfcmV0dXJuMjx0eXBlLCBfQTAgY29uc3QsIF9BMSwgX0EyIGNvbnN0Pjo6dHlwZQorICAgIG9wZXJhdG9yKCkgKF9BMCBjb25zdCYgX19hMCwgX0ExJiBfX2ExLCBfQTIgY29uc3QmIF9fYTIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlKF9fZl8sIF9fYTAsIF9fYTEsIF9fYTIpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBfX2ludm9rZV9yZXR1cm4yPHR5cGUsIF9BMCwgX0ExIGNvbnN0LCBfQTIgY29uc3Q+Ojp0eXBlCisgICAgb3BlcmF0b3IoKSAoX0EwJiBfX2EwLCBfQTEgY29uc3QmIF9fYTEsIF9BMiBjb25zdCYgX19hMikgY29uc3QgeworICAgICAgICByZXR1cm4gX19pbnZva2UoX19mXywgX19hMCwgX19hMSwgX19hMik7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9BMCwgY2xhc3MgX0ExLCBjbGFzcyBfQTI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIF9faW52b2tlX3JldHVybjI8dHlwZSwgX0EwIGNvbnN0LCBfQTEgY29uc3QsIF9BMiBjb25zdD46OnR5cGUKKyAgICBvcGVyYXRvcigpIChfQTAgY29uc3QmIF9fYTAsIF9BMSBjb25zdCYgX19hMSwgX0EyIGNvbnN0JiBfX2EyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfX2ludm9rZShfX2ZfLCBfX2EwLCBfX2ExLCBfX2EyKTsKKyAgICB9CisjZW5kaWYKK307CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19fbWVtX2ZuPF9ScCBfVHA6Oio+CittZW1fZm4oX1JwIF9UcDo6KiBfX3BtKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19tZW1fZm48X1JwIF9UcDo6Kj4oX19wbSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOQ1RJT04KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIGJhZF9mdW5jdGlvbl9jYWxsCisKK2NsYXNzIF9MSUJDUFBfRVhDRVBUSU9OX0FCSSBiYWRfZnVuY3Rpb25fY2FsbAorICAgIDogcHVibGljIGV4Y2VwdGlvbgoreworI2lmZGVmIF9MSUJDUFBfQUJJX0JBRF9GVU5DVElPTl9DQUxMX0tFWV9GVU5DVElPTgorcHVibGljOgorICAgIHZpcnR1YWwgfmJhZF9mdW5jdGlvbl9jYWxsKCkgX05PRVhDRVBUOworCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgX05PRVhDRVBUOworI2VuZGlmCit9OworCitfTElCQ1BQX05PUkVUVVJOIGlubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUKK3ZvaWQgX190aHJvd19iYWRfZnVuY3Rpb25fY2FsbCgpCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRocm93IGJhZF9mdW5jdGlvbl9jYWxsKCk7CisjZWxzZQorCV9WU1REOjphYm9ydCgpOworI2VuZGlmCit9CisKK3RlbXBsYXRlPGNsYXNzIF9GcD4gY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgZnVuY3Rpb247IC8vIHVuZGVmaW5lZAorCituYW1lc3BhY2UgX19mdW5jdGlvbgoreworCit0ZW1wbGF0ZTxjbGFzcyBfUnA+CitzdHJ1Y3QgX19tYXliZV9kZXJpdmVfZnJvbV91bmFyeV9mdW5jdGlvbgoreworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyBfQTE+CitzdHJ1Y3QgX19tYXliZV9kZXJpdmVfZnJvbV91bmFyeV9mdW5jdGlvbjxfUnAoX0ExKT4KKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfQTEsIF9ScD4KK3sKK307CisKK3RlbXBsYXRlPGNsYXNzIF9ScD4KK3N0cnVjdCBfX21heWJlX2Rlcml2ZV9mcm9tX2JpbmFyeV9mdW5jdGlvbgoreworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KK3N0cnVjdCBfX21heWJlX2Rlcml2ZV9mcm9tX2JpbmFyeV9mdW5jdGlvbjxfUnAoX0ExLCBfQTIpPgorICAgIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfQTEsIF9BMiwgX1JwPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9GcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgX19ub3RfbnVsbChfRnAgY29uc3QmKSB7IHJldHVybiB0cnVlOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfRnA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIF9fbm90X251bGwoX0ZwKiBfX3B0cikgeyByZXR1cm4gX19wdHI7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9DbGFzcz4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgX19ub3RfbnVsbChfUmV0IF9DbGFzczo6Kl9fcHRyKSB7IHJldHVybiBfX3B0cjsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBfX25vdF9udWxsKGZ1bmN0aW9uPF9GcD4gY29uc3QmIF9fZikgeyByZXR1cm4gISFfX2Y7IH0KKworfSAvLyBuYW1lc3BhY2UgX19mdW5jdGlvbgorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCituYW1lc3BhY2UgX19mdW5jdGlvbiB7CisKK3RlbXBsYXRlPGNsYXNzIF9GcD4gY2xhc3MgX19iYXNlOworCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIC4uLl9BcmdUeXBlcz4KK2NsYXNzIF9fYmFzZTxfUnAoX0FyZ1R5cGVzLi4uKT4KK3sKKyAgICBfX2Jhc2UoY29uc3QgX19iYXNlJik7CisgICAgX19iYXNlJiBvcGVyYXRvcj0oY29uc3QgX19iYXNlJik7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX2Jhc2UoKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdmlydHVhbCB+X19iYXNlKCkge30KKyAgICB2aXJ0dWFsIF9fYmFzZSogX19jbG9uZSgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgX19jbG9uZShfX2Jhc2UqKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKSBfTk9FWENFUFQgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95X2RlYWxsb2NhdGUoKSBfTk9FWENFUFQgPSAwOworICAgIHZpcnR1YWwgX1JwIG9wZXJhdG9yKCkoX0FyZ1R5cGVzJiYgLi4uKSA9IDA7CisjaWZuZGVmIF9MSUJDUFBfTk9fUlRUSQorICAgIHZpcnR1YWwgY29uc3Qgdm9pZCogdGFyZ2V0KGNvbnN0IHR5cGVfaW5mbyYpIGNvbnN0IF9OT0VYQ0VQVCA9IDA7CisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdGFyZ2V0X3R5cGUoKSBjb25zdCBfTk9FWENFUFQgPSAwOworI2VuZGlmICAvLyBfTElCQ1BQX05PX1JUVEkKK307CisKK3RlbXBsYXRlPGNsYXNzIF9GRCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfRkI+IGNsYXNzIF9fZnVuYzsKKwordGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9ScCwgY2xhc3MgLi4uX0FyZ1R5cGVzPgorY2xhc3MgX19mdW5jPF9GcCwgX0FsbG9jLCBfUnAoX0FyZ1R5cGVzLi4uKT4KKyAgICA6IHB1YmxpYyAgX19iYXNlPF9ScChfQXJnVHlwZXMuLi4pPgoreworICAgIF9fY29tcHJlc3NlZF9wYWlyPF9GcCwgX0FsbG9jPiBfX2ZfOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2Z1bmMoX0ZwJiYgX19mKQorICAgICAgICA6IF9fZl8ocGllY2V3aXNlX2NvbnN0cnVjdCwgX1ZTVEQ6OmZvcndhcmRfYXNfdHVwbGUoX1ZTVEQ6Om1vdmUoX19mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZF9hc190dXBsZSgpKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2Z1bmMoY29uc3QgX0ZwJiBfX2YsIGNvbnN0IF9BbGxvYyYgX19hKQorICAgICAgICA6IF9fZl8ocGllY2V3aXNlX2NvbnN0cnVjdCwgX1ZTVEQ6OmZvcndhcmRfYXNfdHVwbGUoX19mKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkX2FzX3R1cGxlKF9fYSkpIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19mdW5jKGNvbnN0IF9GcCYgX19mLCBfQWxsb2MmJiBfX2EpCisgICAgICAgIDogX19mXyhwaWVjZXdpc2VfY29uc3RydWN0LCBfVlNURDo6Zm9yd2FyZF9hc190dXBsZShfX2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmRfYXNfdHVwbGUoX1ZTVEQ6Om1vdmUoX19hKSkpIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19mdW5jKF9GcCYmIF9fZiwgX0FsbG9jJiYgX19hKQorICAgICAgICA6IF9fZl8ocGllY2V3aXNlX2NvbnN0cnVjdCwgX1ZTVEQ6OmZvcndhcmRfYXNfdHVwbGUoX1ZTVEQ6Om1vdmUoX19mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZF9hc190dXBsZShfVlNURDo6bW92ZShfX2EpKSkge30KKyAgICB2aXJ0dWFsIF9fYmFzZTxfUnAoX0FyZ1R5cGVzLi4uKT4qIF9fY2xvbmUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgX19jbG9uZShfX2Jhc2U8X1JwKF9BcmdUeXBlcy4uLik+KikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKSBfTk9FWENFUFQ7CisgICAgdmlydHVhbCB2b2lkIGRlc3Ryb3lfZGVhbGxvY2F0ZSgpIF9OT0VYQ0VQVDsKKyAgICB2aXJ0dWFsIF9ScCBvcGVyYXRvcigpKF9BcmdUeXBlcyYmIC4uLiBfX2FyZyk7CisjaWZuZGVmIF9MSUJDUFBfTk9fUlRUSQorICAgIHZpcnR1YWwgY29uc3Qgdm9pZCogdGFyZ2V0KGNvbnN0IHR5cGVfaW5mbyYpIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0YXJnZXRfdHlwZSgpIGNvbnN0IF9OT0VYQ0VQVDsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19SVFRJCit9OworCit0ZW1wbGF0ZTxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1JwLCBjbGFzcyAuLi5fQXJnVHlwZXM+CitfX2Jhc2U8X1JwKF9BcmdUeXBlcy4uLik+KgorX19mdW5jPF9GcCwgX0FsbG9jLCBfUnAoX0FyZ1R5cGVzLi4uKT46Ol9fY2xvbmUoKSBjb25zdAoreworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+IF9fYWxsb2NfdHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYWxsb2NfaGVscGVyPF9fYWxsb2NfdHJhaXRzLCBfX2Z1bmM+Ojp0eXBlIF9BcDsKKyAgICBfQXAgX19hKF9fZl8uc2Vjb25kKCkpOworICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfQXA+IF9EcDsKKyAgICB1bmlxdWVfcHRyPF9fZnVuYywgX0RwPiBfX2hvbGQoX19hLmFsbG9jYXRlKDEpLCBfRHAoX19hLCAxKSk7CisgICAgOjpuZXcgKF9faG9sZC5nZXQoKSkgX19mdW5jKF9fZl8uZmlyc3QoKSwgX0FsbG9jKF9fYSkpOworICAgIHJldHVybiBfX2hvbGQucmVsZWFzZSgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1JwLCBjbGFzcyAuLi5fQXJnVHlwZXM+Cit2b2lkCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQXJnVHlwZXMuLi4pPjo6X19jbG9uZShfX2Jhc2U8X1JwKF9BcmdUeXBlcy4uLik+KiBfX3ApIGNvbnN0Cit7CisgICAgOjpuZXcgKF9fcCkgX19mdW5jKF9fZl8uZmlyc3QoKSwgX19mXy5zZWNvbmQoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUnAsIGNsYXNzIC4uLl9BcmdUeXBlcz4KK3ZvaWQKK19fZnVuYzxfRnAsIF9BbGxvYywgX1JwKF9BcmdUeXBlcy4uLik+OjpkZXN0cm95KCkgX05PRVhDRVBUCit7CisgICAgX19mXy5+X19jb21wcmVzc2VkX3BhaXI8X0ZwLCBfQWxsb2M+KCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUnAsIGNsYXNzIC4uLl9BcmdUeXBlcz4KK3ZvaWQKK19fZnVuYzxfRnAsIF9BbGxvYywgX1JwKF9BcmdUeXBlcy4uLik+OjpkZXN0cm95X2RlYWxsb2NhdGUoKSBfTk9FWENFUFQKK3sKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPiBfX2FsbG9jX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2FsbG9jX2hlbHBlcjxfX2FsbG9jX3RyYWl0cywgX19mdW5jPjo6dHlwZSBfQXA7CisgICAgX0FwIF9fYShfX2ZfLnNlY29uZCgpKTsKKyAgICBfX2ZfLn5fX2NvbXByZXNzZWRfcGFpcjxfRnAsIF9BbGxvYz4oKTsKKyAgICBfX2EuZGVhbGxvY2F0ZSh0aGlzLCAxKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9ScCwgY2xhc3MgLi4uX0FyZ1R5cGVzPgorX1JwCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQXJnVHlwZXMuLi4pPjo6b3BlcmF0b3IoKShfQXJnVHlwZXMmJiAuLi4gX19hcmcpCit7CisgICAgdHlwZWRlZiBfX2ludm9rZV92b2lkX3JldHVybl93cmFwcGVyPF9ScD4gX0ludm9rZXI7CisgICAgcmV0dXJuIF9JbnZva2VyOjpfX2NhbGwoX19mXy5maXJzdCgpLCBfVlNURDo6Zm9yd2FyZDxfQXJnVHlwZXM+KF9fYXJnKS4uLik7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9OT19SVFRJCisKK3RlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUnAsIGNsYXNzIC4uLl9BcmdUeXBlcz4KK2NvbnN0IHZvaWQqCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQXJnVHlwZXMuLi4pPjo6dGFyZ2V0KGNvbnN0IHR5cGVfaW5mbyYgX190aSkgY29uc3QgX05PRVhDRVBUCit7CisgICAgaWYgKF9fdGkgPT0gdHlwZWlkKF9GcCkpCisgICAgICAgIHJldHVybiAmX19mXy5maXJzdCgpOworICAgIHJldHVybiAoY29uc3Qgdm9pZCopMDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9ScCwgY2xhc3MgLi4uX0FyZ1R5cGVzPgorY29uc3Qgc3RkOjp0eXBlX2luZm8mCitfX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQXJnVHlwZXMuLi4pPjo6dGFyZ2V0X3R5cGUoKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gdHlwZWlkKF9GcCk7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19SVFRJCisKK30gIC8vIF9fZnVuY3Rpb24KKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyAuLi5fQXJnVHlwZXM+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBmdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT4KKyAgICA6IHB1YmxpYyBfX2Z1bmN0aW9uOjpfX21heWJlX2Rlcml2ZV9mcm9tX3VuYXJ5X2Z1bmN0aW9uPF9ScChfQXJnVHlwZXMuLi4pPiwKKyAgICAgIHB1YmxpYyBfX2Z1bmN0aW9uOjpfX21heWJlX2Rlcml2ZV9mcm9tX2JpbmFyeV9mdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT4KK3sKKyAgICB0eXBlZGVmIF9fZnVuY3Rpb246Ol9fYmFzZTxfUnAoX0FyZ1R5cGVzLi4uKT4gX19iYXNlOworICAgIHR5cGVuYW1lIGFsaWduZWRfc3RvcmFnZTwzKnNpemVvZih2b2lkKik+Ojp0eXBlIF9fYnVmXzsKKyAgICBfX2Jhc2UqIF9fZl87CisKKyAgICBfTElCQ1BQX05PX0NGSSBzdGF0aWMgX19iYXNlICpfX2FzX2Jhc2Uodm9pZCAqcCkgeworICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8X19iYXNlKj4ocCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9GcCwgYm9vbCA9IF9fbGF6eV9hbmQ8CisgICAgICAgIGludGVncmFsX2NvbnN0YW50PGJvb2wsICFpc19zYW1lPF9fdW5jdnJlZl90PF9GcD4sIGZ1bmN0aW9uPjo6dmFsdWU+LAorICAgICAgICBfX2ludm9rYWJsZTxfRnAmLCBfQXJnVHlwZXMuLi4+CisgICAgPjo6dmFsdWU+CisgICAgc3RydWN0IF9fY2FsbGFibGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9GcD4KKyAgICAgICAgc3RydWN0IF9fY2FsbGFibGU8X0ZwLCB0cnVlPgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGlzX3NhbWU8dm9pZCwgX1JwPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICBpc19jb252ZXJ0aWJsZTx0eXBlbmFtZSBfX2ludm9rZV9vZjxfRnAmLCBfQXJnVHlwZXMuLi4+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ScD46OnZhbHVlOworICAgICAgICB9OworICAgIHRlbXBsYXRlIDxjbGFzcyBfRnA+CisgICAgICAgIHN0cnVjdCBfX2NhbGxhYmxlPF9GcCwgZmFsc2U+CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7CisgICAgICAgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9GcD4KKyAgdXNpbmcgX0VuYWJsZUlmQ2FsbGFibGUgPSB0eXBlbmFtZSBlbmFibGVfaWY8X19jYWxsYWJsZTxfRnA+Ojp2YWx1ZT46OnR5cGU7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfUnAgcmVzdWx0X3R5cGU7CisKKyAgICAvLyBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBmdW5jdGlvbigpIF9OT0VYQ0VQVCA6IF9fZl8oMCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZnVuY3Rpb24obnVsbHB0cl90KSBfTk9FWENFUFQgOiBfX2ZfKDApIHt9CisgICAgZnVuY3Rpb24oY29uc3QgZnVuY3Rpb24mKTsKKyAgICBmdW5jdGlvbihmdW5jdGlvbiYmKSBfTk9FWENFUFQ7CisgICAgdGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyA9IF9FbmFibGVJZkNhbGxhYmxlPF9GcD4+CisgICAgZnVuY3Rpb24oX0ZwKTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA8PSAxNAorICAgIHRlbXBsYXRlPGNsYXNzIF9BbGxvYz4KKyAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgIGZ1bmN0aW9uKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJikgX05PRVhDRVBUIDogX19mXygwKSB7fQorICAgIHRlbXBsYXRlPGNsYXNzIF9BbGxvYz4KKyAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgIGZ1bmN0aW9uKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiwgbnVsbHB0cl90KSBfTk9FWENFUFQgOiBfX2ZfKDApIHt9CisgICAgdGVtcGxhdGU8Y2xhc3MgX0FsbG9jPgorICAgICAgZnVuY3Rpb24oYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2MmLCBjb25zdCBmdW5jdGlvbiYpOworICAgIHRlbXBsYXRlPGNsYXNzIF9BbGxvYz4KKyAgICAgIGZ1bmN0aW9uKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiwgZnVuY3Rpb24mJik7CisgICAgdGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2MsIGNsYXNzID0gX0VuYWJsZUlmQ2FsbGFibGU8X0ZwPj4KKyAgICAgIGZ1bmN0aW9uKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiBfX2EsIF9GcCBfX2YpOworI2VuZGlmCisKKyAgICBmdW5jdGlvbiYgb3BlcmF0b3I9KGNvbnN0IGZ1bmN0aW9uJik7CisgICAgZnVuY3Rpb24mIG9wZXJhdG9yPShmdW5jdGlvbiYmKSBfTk9FWENFUFQ7CisgICAgZnVuY3Rpb24mIG9wZXJhdG9yPShudWxscHRyX3QpIF9OT0VYQ0VQVDsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfRnAsIGNsYXNzID0gX0VuYWJsZUlmQ2FsbGFibGU8X0ZwPj4KKyAgICBmdW5jdGlvbiYgb3BlcmF0b3I9KF9GcCYmKTsKKworICAgIH5mdW5jdGlvbigpOworCisgICAgLy8gZnVuY3Rpb24gbW9kaWZpZXJzOgorICAgIHZvaWQgc3dhcChmdW5jdGlvbiYpIF9OT0VYQ0VQVDsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA8PSAxNAorICAgIHRlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jPgorICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgdm9pZCBhc3NpZ24oX0ZwJiYgX19mLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICAgICAge2Z1bmN0aW9uKGFsbG9jYXRvcl9hcmcsIF9fYSwgX1ZTVEQ6OmZvcndhcmQ8X0ZwPihfX2YpKS5zd2FwKCp0aGlzKTt9CisjZW5kaWYKKworICAgIC8vIGZ1bmN0aW9uIGNhcGFjaXR5OgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgX0xJQkNQUF9FWFBMSUNJVCBvcGVyYXRvciBib29sKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX19mXzt9CisKKyAgICAvLyBkZWxldGVkIG92ZXJsb2FkcyBjbG9zZSBwb3NzaWJsZSBob2xlIGluIHRoZSB0eXBlIHN5c3RlbQorICAgIHRlbXBsYXRlPGNsYXNzIF9SMiwgY2xhc3MuLi4gX0FyZ1R5cGVzMj4KKyAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBmdW5jdGlvbjxfUjIoX0FyZ1R5cGVzMi4uLik+JikgY29uc3QgPSBkZWxldGU7CisgICAgdGVtcGxhdGU8Y2xhc3MgX1IyLCBjbGFzcy4uLiBfQXJnVHlwZXMyPgorICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGZ1bmN0aW9uPF9SMihfQXJnVHlwZXMyLi4uKT4mKSBjb25zdCA9IGRlbGV0ZTsKK3B1YmxpYzoKKyAgICAvLyBmdW5jdGlvbiBpbnZvY2F0aW9uOgorICAgIF9ScCBvcGVyYXRvcigpKF9BcmdUeXBlcy4uLikgY29uc3Q7CisKKyNpZm5kZWYgX0xJQkNQUF9OT19SVFRJCisgICAgLy8gZnVuY3Rpb24gdGFyZ2V0IGFjY2VzczoKKyAgICBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdGFyZ2V0X3R5cGUoKSBjb25zdCBfTk9FWENFUFQ7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4gX1RwKiB0YXJnZXQoKSBfTk9FWENFUFQ7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4gY29uc3QgX1RwKiB0YXJnZXQoKSBjb25zdCBfTk9FWENFUFQ7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fUlRUSQorfTsKKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyAuLi5fQXJnVHlwZXM+CitmdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT46OmZ1bmN0aW9uKGNvbnN0IGZ1bmN0aW9uJiBfX2YpCit7CisgICAgaWYgKF9fZi5fX2ZfID09IDApCisgICAgICAgIF9fZl8gPSAwOworICAgIGVsc2UgaWYgKCh2b2lkICopX19mLl9fZl8gPT0gJl9fZi5fX2J1Zl8pCisgICAgeworICAgICAgICBfX2ZfID0gX19hc19iYXNlKCZfX2J1Zl8pOworICAgICAgICBfX2YuX19mXy0+X19jbG9uZShfX2ZfKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBfX2ZfID0gX19mLl9fZl8tPl9fY2xvbmUoKTsKK30KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA8PSAxNAordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyAuLi5fQXJnVHlwZXM+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgorZnVuY3Rpb248X1JwKF9BcmdUeXBlcy4uLik+OjpmdW5jdGlvbihhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnVuY3Rpb24mIF9fZikKK3sKKyAgICBpZiAoX19mLl9fZl8gPT0gMCkKKyAgICAgICAgX19mXyA9IDA7CisgICAgZWxzZSBpZiAoKHZvaWQgKilfX2YuX19mXyA9PSAmX19mLl9fYnVmXykKKyAgICB7CisgICAgICAgIF9fZl8gPSBfX2FzX2Jhc2UoJl9fYnVmXyk7CisgICAgICAgIF9fZi5fX2ZfLT5fX2Nsb25lKF9fZl8pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIF9fZl8gPSBfX2YuX19mXy0+X19jbG9uZSgpOworfQorI2VuZGlmCisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgLi4uX0FyZ1R5cGVzPgorZnVuY3Rpb248X1JwKF9BcmdUeXBlcy4uLik+OjpmdW5jdGlvbihmdW5jdGlvbiYmIF9fZikgX05PRVhDRVBUCit7CisgICAgaWYgKF9fZi5fX2ZfID09IDApCisgICAgICAgIF9fZl8gPSAwOworICAgIGVsc2UgaWYgKCh2b2lkICopX19mLl9fZl8gPT0gJl9fZi5fX2J1Zl8pCisgICAgeworICAgICAgICBfX2ZfID0gX19hc19iYXNlKCZfX2J1Zl8pOworICAgICAgICBfX2YuX19mXy0+X19jbG9uZShfX2ZfKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX19mXyA9IF9fZi5fX2ZfOworICAgICAgICBfX2YuX19mXyA9IDA7CisgICAgfQorfQorCisjaWYgX0xJQkNQUF9TVERfVkVSIDw9IDE0Cit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIC4uLl9BcmdUeXBlcz4KK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CitmdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT46OmZ1bmN0aW9uKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiYmIF9fZikKK3sKKyAgICBpZiAoX19mLl9fZl8gPT0gMCkKKyAgICAgICAgX19mXyA9IDA7CisgICAgZWxzZSBpZiAoKHZvaWQgKilfX2YuX19mXyA9PSAmX19mLl9fYnVmXykKKyAgICB7CisgICAgICAgIF9fZl8gPSBfX2FzX2Jhc2UoJl9fYnVmXyk7CisgICAgICAgIF9fZi5fX2ZfLT5fX2Nsb25lKF9fZl8pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfX2ZfID0gX19mLl9fZl87CisgICAgICAgIF9fZi5fX2ZfID0gMDsKKyAgICB9Cit9CisjZW5kaWYKKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyAuLi5fQXJnVHlwZXM+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcz4KK2Z1bmN0aW9uPF9ScChfQXJnVHlwZXMuLi4pPjo6ZnVuY3Rpb24oX0ZwIF9fZikKKyAgICA6IF9fZl8oMCkKK3sKKyAgICBpZiAoX19mdW5jdGlvbjo6X19ub3RfbnVsbChfX2YpKQorICAgIHsKKyAgICAgICAgdHlwZWRlZiBfX2Z1bmN0aW9uOjpfX2Z1bmM8X0ZwLCBhbGxvY2F0b3I8X0ZwPiwgX1JwKF9BcmdUeXBlcy4uLik+IF9GRjsKKyAgICAgICAgaWYgKHNpemVvZihfRkYpIDw9IHNpemVvZihfX2J1Zl8pICYmIGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPF9GcD46OnZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBfX2ZfID0gOjpuZXcoKHZvaWQqKSZfX2J1Zl8pIF9GRihfVlNURDo6bW92ZShfX2YpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgYWxsb2NhdG9yPF9GRj4gX0FwOworICAgICAgICAgICAgX0FwIF9fYTsKKyAgICAgICAgICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfQXA+IF9EcDsKKyAgICAgICAgICAgIHVuaXF1ZV9wdHI8X19iYXNlLCBfRHA+IF9faG9sZChfX2EuYWxsb2NhdGUoMSksIF9EcChfX2EsIDEpKTsKKyAgICAgICAgICAgIDo6bmV3IChfX2hvbGQuZ2V0KCkpIF9GRihfVlNURDo6bW92ZShfX2YpLCBhbGxvY2F0b3I8X0ZwPihfX2EpKTsKKyAgICAgICAgICAgIF9fZl8gPSBfX2hvbGQucmVsZWFzZSgpOworICAgICAgICB9CisgICAgfQorfQorCisjaWYgX0xJQkNQUF9TVERfVkVSIDw9IDE0Cit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIC4uLl9BcmdUeXBlcz4KK3RlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYywgY2xhc3M+CitmdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT46OmZ1bmN0aW9uKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiBfX2EwLCBfRnAgX19mKQorICAgIDogX19mXygwKQoreworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+IF9fYWxsb2NfdHJhaXRzOworICAgIGlmIChfX2Z1bmN0aW9uOjpfX25vdF9udWxsKF9fZikpCisgICAgeworICAgICAgICB0eXBlZGVmIF9fZnVuY3Rpb246Ol9fZnVuYzxfRnAsIF9BbGxvYywgX1JwKF9BcmdUeXBlcy4uLik+IF9GRjsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9hbGxvY19oZWxwZXI8X19hbGxvY190cmFpdHMsIF9GRj46OnR5cGUgX0FwOworICAgICAgICBfQXAgX19hKF9fYTApOworICAgICAgICBpZiAoc2l6ZW9mKF9GRikgPD0gc2l6ZW9mKF9fYnVmXykgJiYgCisgICAgICAgICAgICBpc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZTxfRnA+Ojp2YWx1ZSAmJiBpc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZTxfQXA+Ojp2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgX19mXyA9IDo6bmV3KCh2b2lkKikmX19idWZfKSBfRkYoX1ZTVEQ6Om1vdmUoX19mKSwgX0FsbG9jKF9fYSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9BcD4gX0RwOworICAgICAgICAgICAgdW5pcXVlX3B0cjxfX2Jhc2UsIF9EcD4gX19ob2xkKF9fYS5hbGxvY2F0ZSgxKSwgX0RwKF9fYSwgMSkpOworICAgICAgICAgICAgOjpuZXcgKF9faG9sZC5nZXQoKSkgX0ZGKF9WU1REOjptb3ZlKF9fZiksIF9BbGxvYyhfX2EpKTsKKyAgICAgICAgICAgIF9fZl8gPSBfX2hvbGQucmVsZWFzZSgpOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgLi4uX0FyZ1R5cGVzPgorZnVuY3Rpb248X1JwKF9BcmdUeXBlcy4uLik+JgorZnVuY3Rpb248X1JwKF9BcmdUeXBlcy4uLik+OjpvcGVyYXRvcj0oY29uc3QgZnVuY3Rpb24mIF9fZikKK3sKKyAgICBmdW5jdGlvbihfX2YpLnN3YXAoKnRoaXMpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyAuLi5fQXJnVHlwZXM+CitmdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT4mCitmdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT46Om9wZXJhdG9yPShmdW5jdGlvbiYmIF9fZikgX05PRVhDRVBUCit7CisgICAgaWYgKCh2b2lkICopX19mXyA9PSAmX19idWZfKQorICAgICAgICBfX2ZfLT5kZXN0cm95KCk7CisgICAgZWxzZSBpZiAoX19mXykKKyAgICAgICAgX19mXy0+ZGVzdHJveV9kZWFsbG9jYXRlKCk7CisgICAgX19mXyA9IDA7CisgICAgaWYgKF9fZi5fX2ZfID09IDApCisgICAgICAgIF9fZl8gPSAwOworICAgIGVsc2UgaWYgKCh2b2lkICopX19mLl9fZl8gPT0gJl9fZi5fX2J1Zl8pCisgICAgeworICAgICAgICBfX2ZfID0gX19hc19iYXNlKCZfX2J1Zl8pOworICAgICAgICBfX2YuX19mXy0+X19jbG9uZShfX2ZfKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX19mXyA9IF9fZi5fX2ZfOworICAgICAgICBfX2YuX19mXyA9IDA7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyAuLi5fQXJnVHlwZXM+CitmdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT4mCitmdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT46Om9wZXJhdG9yPShudWxscHRyX3QpIF9OT0VYQ0VQVAoreworICAgIGlmICgodm9pZCAqKV9fZl8gPT0gJl9fYnVmXykKKyAgICAgICAgX19mXy0+ZGVzdHJveSgpOworICAgIGVsc2UgaWYgKF9fZl8pCisgICAgICAgIF9fZl8tPmRlc3Ryb3lfZGVhbGxvY2F0ZSgpOworICAgIF9fZl8gPSAwOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyAuLi5fQXJnVHlwZXM+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcz4KK2Z1bmN0aW9uPF9ScChfQXJnVHlwZXMuLi4pPiYKK2Z1bmN0aW9uPF9ScChfQXJnVHlwZXMuLi4pPjo6b3BlcmF0b3I9KF9GcCYmIF9fZikKK3sKKyAgICBmdW5jdGlvbihfVlNURDo6Zm9yd2FyZDxfRnA+KF9fZikpLnN3YXAoKnRoaXMpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyAuLi5fQXJnVHlwZXM+CitmdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT46On5mdW5jdGlvbigpCit7CisgICAgaWYgKCh2b2lkICopX19mXyA9PSAmX19idWZfKQorICAgICAgICBfX2ZfLT5kZXN0cm95KCk7CisgICAgZWxzZSBpZiAoX19mXykKKyAgICAgICAgX19mXy0+ZGVzdHJveV9kZWFsbG9jYXRlKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgLi4uX0FyZ1R5cGVzPgordm9pZAorZnVuY3Rpb248X1JwKF9BcmdUeXBlcy4uLik+Ojpzd2FwKGZ1bmN0aW9uJiBfX2YpIF9OT0VYQ0VQVAoreworICAgIGlmIChfVlNURDo6YWRkcmVzc29mKF9fZikgPT0gdGhpcykKKyAgICAgIHJldHVybjsKKyAgICBpZiAoKHZvaWQgKilfX2ZfID09ICZfX2J1Zl8gJiYgKHZvaWQgKilfX2YuX19mXyA9PSAmX19mLl9fYnVmXykKKyAgICB7CisgICAgICAgIHR5cGVuYW1lIGFsaWduZWRfc3RvcmFnZTxzaXplb2YoX19idWZfKT46OnR5cGUgX190ZW1wYnVmOworICAgICAgICBfX2Jhc2UqIF9fdCA9IF9fYXNfYmFzZSgmX190ZW1wYnVmKTsKKyAgICAgICAgX19mXy0+X19jbG9uZShfX3QpOworICAgICAgICBfX2ZfLT5kZXN0cm95KCk7CisgICAgICAgIF9fZl8gPSAwOworICAgICAgICBfX2YuX19mXy0+X19jbG9uZShfX2FzX2Jhc2UoJl9fYnVmXykpOworICAgICAgICBfX2YuX19mXy0+ZGVzdHJveSgpOworICAgICAgICBfX2YuX19mXyA9IDA7CisgICAgICAgIF9fZl8gPSBfX2FzX2Jhc2UoJl9fYnVmXyk7CisgICAgICAgIF9fdC0+X19jbG9uZShfX2FzX2Jhc2UoJl9fZi5fX2J1Zl8pKTsKKyAgICAgICAgX190LT5kZXN0cm95KCk7CisgICAgICAgIF9fZi5fX2ZfID0gX19hc19iYXNlKCZfX2YuX19idWZfKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHZvaWQgKilfX2ZfID09ICZfX2J1Zl8pCisgICAgeworICAgICAgICBfX2ZfLT5fX2Nsb25lKF9fYXNfYmFzZSgmX19mLl9fYnVmXykpOworICAgICAgICBfX2ZfLT5kZXN0cm95KCk7CisgICAgICAgIF9fZl8gPSBfX2YuX19mXzsKKyAgICAgICAgX19mLl9fZl8gPSBfX2FzX2Jhc2UoJl9fZi5fX2J1Zl8pOworICAgIH0KKyAgICBlbHNlIGlmICgodm9pZCAqKV9fZi5fX2ZfID09ICZfX2YuX19idWZfKQorICAgIHsKKyAgICAgICAgX19mLl9fZl8tPl9fY2xvbmUoX19hc19iYXNlKCZfX2J1Zl8pKTsKKyAgICAgICAgX19mLl9fZl8tPmRlc3Ryb3koKTsKKyAgICAgICAgX19mLl9fZl8gPSBfX2ZfOworICAgICAgICBfX2ZfID0gX19hc19iYXNlKCZfX2J1Zl8pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIF9WU1REOjpzd2FwKF9fZl8sIF9fZi5fX2ZfKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyAuLi5fQXJnVHlwZXM+CitfUnAKK2Z1bmN0aW9uPF9ScChfQXJnVHlwZXMuLi4pPjo6b3BlcmF0b3IoKShfQXJnVHlwZXMuLi4gX19hcmcpIGNvbnN0Cit7CisgICAgaWYgKF9fZl8gPT0gMCkKKyAgICAgICAgX190aHJvd19iYWRfZnVuY3Rpb25fY2FsbCgpOworICAgIHJldHVybiAoKl9fZl8pKF9WU1REOjpmb3J3YXJkPF9BcmdUeXBlcz4oX19hcmcpLi4uKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX05PX1JUVEkKKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyAuLi5fQXJnVHlwZXM+Citjb25zdCBzdGQ6OnR5cGVfaW5mbyYKK2Z1bmN0aW9uPF9ScChfQXJnVHlwZXMuLi4pPjo6dGFyZ2V0X3R5cGUoKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICBpZiAoX19mXyA9PSAwKQorICAgICAgICByZXR1cm4gdHlwZWlkKHZvaWQpOworICAgIHJldHVybiBfX2ZfLT50YXJnZXRfdHlwZSgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIC4uLl9BcmdUeXBlcz4KK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CitfVHAqCitmdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT46OnRhcmdldCgpIF9OT0VYQ0VQVAoreworICAgIGlmIChfX2ZfID09IDApCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiAoX1RwKikgY29uc3RfY2FzdDx2b2lkICo+KF9fZl8tPnRhcmdldCh0eXBlaWQoX1RwKSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIC4uLl9BcmdUeXBlcz4KK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHA+Citjb25zdCBfVHAqCitmdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT46OnRhcmdldCgpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIGlmIChfX2ZfID09IDApCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiAoY29uc3QgX1RwKilfX2ZfLT50YXJnZXQodHlwZWlkKF9UcCkpOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fUlRUSQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcy4uLiBfQXJnVHlwZXM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBmdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT4mIF9fZiwgbnVsbHB0cl90KSBfTk9FWENFUFQge3JldHVybiAhX19mO30KKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MuLi4gX0FyZ1R5cGVzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPT0obnVsbHB0cl90LCBjb25zdCBmdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT4mIF9fZikgX05PRVhDRVBUIHtyZXR1cm4gIV9fZjt9CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzLi4uIF9BcmdUeXBlcz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KGNvbnN0IGZ1bmN0aW9uPF9ScChfQXJnVHlwZXMuLi4pPiYgX19mLCBudWxscHRyX3QpIF9OT0VYQ0VQVCB7cmV0dXJuIChib29sKV9fZjt9CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzLi4uIF9BcmdUeXBlcz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KG51bGxwdHJfdCwgY29uc3QgZnVuY3Rpb248X1JwKF9BcmdUeXBlcy4uLik+JiBfX2YpIF9OT0VYQ0VQVCB7cmV0dXJuIChib29sKV9fZjt9CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzLi4uIF9BcmdUeXBlcz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzd2FwKGZ1bmN0aW9uPF9ScChfQXJnVHlwZXMuLi4pPiYgX194LCBmdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT4mIF9feSkgX05PRVhDRVBUCit7cmV0dXJuIF9feC5zd2FwKF9feSk7fQorCisjZWxzZSAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworI2luY2x1ZGUgPF9fZnVuY3Rpb25hbF8wMz4KKworI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSU5ECisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+IHN0cnVjdCBfX2lzX2JpbmRfZXhwcmVzc2lvbiA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwordGVtcGxhdGU8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfYmluZF9leHByZXNzaW9uCisgICAgOiBwdWJsaWMgX19pc19iaW5kX2V4cHJlc3Npb248dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+IHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgY29uc3RleHByIHNpemVfdCBpc19iaW5kX2V4cHJlc3Npb25fdiA9IGlzX2JpbmRfZXhwcmVzc2lvbjxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+IHN0cnVjdCBfX2lzX3BsYWNlaG9sZGVyIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGludCwgMD4ge307Cit0ZW1wbGF0ZTxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19wbGFjZWhvbGRlcgorICAgIDogcHVibGljIF9faXNfcGxhY2Vob2xkZXI8dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+IHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgY29uc3RleHByIHNpemVfdCBpc19wbGFjZWhvbGRlcl92ID0gaXNfcGxhY2Vob2xkZXI8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworbmFtZXNwYWNlIHBsYWNlaG9sZGVycworeworCit0ZW1wbGF0ZSA8aW50IF9OcD4gc3RydWN0IF9fcGgge307CisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfQ1hYMDNfTEFORykgfHwgZGVmaW5lZChfTElCQ1BQX0JVSUxESU5HX0JJTkQpCitfTElCQ1BQX0ZVTkNfVklTIGV4dGVybiBjb25zdCBfX3BoPDE+ICAgXzE7CitfTElCQ1BQX0ZVTkNfVklTIGV4dGVybiBjb25zdCBfX3BoPDI+ICAgXzI7CitfTElCQ1BQX0ZVTkNfVklTIGV4dGVybiBjb25zdCBfX3BoPDM+ICAgXzM7CitfTElCQ1BQX0ZVTkNfVklTIGV4dGVybiBjb25zdCBfX3BoPDQ+ICAgXzQ7CitfTElCQ1BQX0ZVTkNfVklTIGV4dGVybiBjb25zdCBfX3BoPDU+ICAgXzU7CitfTElCQ1BQX0ZVTkNfVklTIGV4dGVybiBjb25zdCBfX3BoPDY+ICAgXzY7CitfTElCQ1BQX0ZVTkNfVklTIGV4dGVybiBjb25zdCBfX3BoPDc+ICAgXzc7CitfTElCQ1BQX0ZVTkNfVklTIGV4dGVybiBjb25zdCBfX3BoPDg+ICAgXzg7CitfTElCQ1BQX0ZVTkNfVklTIGV4dGVybiBjb25zdCBfX3BoPDk+ICAgXzk7CitfTElCQ1BQX0ZVTkNfVklTIGV4dGVybiBjb25zdCBfX3BoPDEwPiBfMTA7CisjZWxzZQorLyogX0xJQkNQUF9JTkxJTkVfVkFSICovIGNvbnN0ZXhwciBfX3BoPDE+ICAgXzF7fTsKKy8qIF9MSUJDUFBfSU5MSU5FX1ZBUiAqLyBjb25zdGV4cHIgX19waDwyPiAgIF8ye307CisvKiBfTElCQ1BQX0lOTElORV9WQVIgKi8gY29uc3RleHByIF9fcGg8Mz4gICBfM3t9OworLyogX0xJQkNQUF9JTkxJTkVfVkFSICovIGNvbnN0ZXhwciBfX3BoPDQ+ICAgXzR7fTsKKy8qIF9MSUJDUFBfSU5MSU5FX1ZBUiAqLyBjb25zdGV4cHIgX19waDw1PiAgIF81e307CisvKiBfTElCQ1BQX0lOTElORV9WQVIgKi8gY29uc3RleHByIF9fcGg8Nj4gICBfNnt9OworLyogX0xJQkNQUF9JTkxJTkVfVkFSICovIGNvbnN0ZXhwciBfX3BoPDc+ICAgXzd7fTsKKy8qIF9MSUJDUFBfSU5MSU5FX1ZBUiAqLyBjb25zdGV4cHIgX19waDw4PiAgIF84e307CisvKiBfTElCQ1BQX0lOTElORV9WQVIgKi8gY29uc3RleHByIF9fcGg8OT4gICBfOXt9OworLyogX0xJQkNQUF9JTkxJTkVfVkFSICovIGNvbnN0ZXhwciBfX3BoPDEwPiBfMTB7fTsKKyNlbmRpZiAvLyBkZWZpbmVkKF9MSUJDUFBfQ1hYMDNfTEFORykgfHwgZGVmaW5lZChfTElCQ1BQX0JVSUxESU5HX0JJTkQpCisKK30gIC8vIHBsYWNlaG9sZGVycworCit0ZW1wbGF0ZTxpbnQgX05wPgorc3RydWN0IF9faXNfcGxhY2Vob2xkZXI8cGxhY2Vob2xkZXJzOjpfX3BoPF9OcD4gPgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGludCwgX05wPiB7fTsKKworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVWo+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwJgorX19tdShyZWZlcmVuY2Vfd3JhcHBlcjxfVHA+IF9fdCwgX1VqJikKK3sKKyAgICByZXR1cm4gX190LmdldCgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RpLCBjbGFzcyAuLi5fVWosIHNpemVfdCAuLi5fSW5keD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBfX2ludm9rZV9vZjxfVGkmLCBfVWouLi4+Ojp0eXBlCitfX211X2V4cGFuZChfVGkmIF9fdGksIHR1cGxlPF9Vai4uLj4mIF9fdWosIF9fdHVwbGVfaW5kaWNlczxfSW5keC4uLj4pCit7CisgICAgcmV0dXJuIF9fdGkoX1ZTVEQ6OmZvcndhcmQ8X1VqPihfVlNURDo6Z2V0PF9JbmR4PihfX3VqKSkuLi4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RpLCBjbGFzcyAuLi5fVWo+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgX19sYXp5X2VuYWJsZV9pZgorPAorICAgIGlzX2JpbmRfZXhwcmVzc2lvbjxfVGk+Ojp2YWx1ZSwKKyAgICBfX2ludm9rZV9vZjxfVGkmLCBfVWouLi4+Cis+Ojp0eXBlCitfX211KF9UaSYgX190aSwgdHVwbGU8X1VqLi4uPiYgX191aikKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPHNpemVvZi4uLihfVWopPjo6dHlwZSBfX2luZGljZXM7CisgICAgcmV0dXJuICBfX211X2V4cGFuZChfX3RpLCBfX3VqLCBfX2luZGljZXMoKSk7Cit9CisKK3RlbXBsYXRlIDxib29sIElzUGgsIGNsYXNzIF9UaSwgY2xhc3MgX1VqPgorc3RydWN0IF9fbXVfcmV0dXJuMiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UaSwgY2xhc3MgX1VqPgorc3RydWN0IF9fbXVfcmV0dXJuMjx0cnVlLCBfVGksIF9Vaj4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8aXNfcGxhY2Vob2xkZXI8X1RpPjo6dmFsdWUgLSAxLCBfVWo+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RpLCBjbGFzcyBfVWo+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgMCA8IGlzX3BsYWNlaG9sZGVyPF9UaT46OnZhbHVlLAorICAgIHR5cGVuYW1lIF9fbXVfcmV0dXJuMjwwIDwgaXNfcGxhY2Vob2xkZXI8X1RpPjo6dmFsdWUsIF9UaSwgX1VqPjo6dHlwZQorPjo6dHlwZQorX19tdShfVGkmLCBfVWomIF9fdWopCit7CisgICAgY29uc3Qgc2l6ZV90IF9JbmR4ID0gaXNfcGxhY2Vob2xkZXI8X1RpPjo6dmFsdWUgLSAxOworICAgIHJldHVybiBfVlNURDo6Zm9yd2FyZDx0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9JbmR4LCBfVWo+Ojp0eXBlPihfVlNURDo6Z2V0PF9JbmR4PihfX3VqKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVGksIGNsYXNzIF9Vaj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICAhaXNfYmluZF9leHByZXNzaW9uPF9UaT46OnZhbHVlICYmCisgICAgaXNfcGxhY2Vob2xkZXI8X1RpPjo6dmFsdWUgPT0gMCAmJgorICAgICFfX2lzX3JlZmVyZW5jZV93cmFwcGVyPF9UaT46OnZhbHVlLAorICAgIF9UaSYKKz46OnR5cGUKK19fbXUoX1RpJiBfX3RpLCBfVWomKQoreworICAgIHJldHVybiBfX3RpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RpLCBib29sIElzUmVmZXJlbmNlV3JhcHBlciwgYm9vbCBJc0JpbmRFeCwgYm9vbCBJc1BoLAorICAgICAgICAgIGNsYXNzIF9UdXBsZVVqPgorc3RydWN0IF9fX19tdV9yZXR1cm47CisKK3RlbXBsYXRlIDxib29sIF9JbnZva2FibGUsIGNsYXNzIF9UaSwgY2xhc3MgLi4uX1VqPgorc3RydWN0IF9fX19tdV9yZXR1cm5faW52b2thYmxlICAvLyBmYWxzZQoreworICAgIHR5cGVkZWYgX19uYXQgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVGksIGNsYXNzIC4uLl9Vaj4KK3N0cnVjdCBfX19fbXVfcmV0dXJuX2ludm9rYWJsZTx0cnVlLCBfVGksIF9Vai4uLj4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9faW52b2tlX29mPF9UaSYsIF9Vai4uLj46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVGksIGNsYXNzIC4uLl9Vaj4KK3N0cnVjdCBfX19fbXVfcmV0dXJuPF9UaSwgZmFsc2UsIHRydWUsIGZhbHNlLCB0dXBsZTxfVWouLi4+ID4KKyAgICA6IHB1YmxpYyBfX19fbXVfcmV0dXJuX2ludm9rYWJsZTxfX2ludm9rYWJsZTxfVGkmLCBfVWouLi4+Ojp2YWx1ZSwgX1RpLCBfVWouLi4+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RpLCBjbGFzcyBfVHVwbGVVaj4KK3N0cnVjdCBfX19fbXVfcmV0dXJuPF9UaSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBfVHVwbGVVaj4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8aXNfcGxhY2Vob2xkZXI8X1RpPjo6dmFsdWUgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHVwbGVVaj46OnR5cGUmJiB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UaSwgY2xhc3MgX1R1cGxlVWo+CitzdHJ1Y3QgX19fX211X3JldHVybjxfVGksIHRydWUsIGZhbHNlLCBmYWxzZSwgX1R1cGxlVWo+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfVGk6OnR5cGUmIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RpLCBjbGFzcyBfVHVwbGVVaj4KK3N0cnVjdCBfX19fbXVfcmV0dXJuPF9UaSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgX1R1cGxlVWo+Cit7CisgICAgdHlwZWRlZiBfVGkmIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RpLCBjbGFzcyBfVHVwbGVVaj4KK3N0cnVjdCBfX211X3JldHVybgorICAgIDogcHVibGljIF9fX19tdV9yZXR1cm48X1RpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pc19yZWZlcmVuY2Vfd3JhcHBlcjxfVGk+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2JpbmRfZXhwcmVzc2lvbjxfVGk+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPCBpc19wbGFjZWhvbGRlcjxfVGk+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcGxhY2Vob2xkZXI8X1RpPjo6dmFsdWUgPD0gdHVwbGVfc2l6ZTxfVHVwbGVVaj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX1R1cGxlVWo+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcyBfQm91bmRBcmdzLCBjbGFzcyBfVHVwbGVVaj4KK3N0cnVjdCBfX2lzX3ZhbGlkX2JpbmRfcmV0dXJuCit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIC4uLl9Cb3VuZEFyZ3MsIGNsYXNzIF9UdXBsZVVqPgorc3RydWN0IF9faXNfdmFsaWRfYmluZF9yZXR1cm48X0ZwLCB0dXBsZTxfQm91bmRBcmdzLi4uPiwgX1R1cGxlVWo+Cit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBfX2ludm9rYWJsZTxfRnAsCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbXVfcmV0dXJuPF9Cb3VuZEFyZ3MsIF9UdXBsZVVqPjo6dHlwZS4uLj46OnZhbHVlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MgLi4uX0JvdW5kQXJncywgY2xhc3MgX1R1cGxlVWo+CitzdHJ1Y3QgX19pc192YWxpZF9iaW5kX3JldHVybjxfRnAsIGNvbnN0IHR1cGxlPF9Cb3VuZEFyZ3MuLi4+LCBfVHVwbGVVaj4KK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IF9faW52b2thYmxlPF9GcCwKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tdV9yZXR1cm48Y29uc3QgX0JvdW5kQXJncywgX1R1cGxlVWo+Ojp0eXBlLi4uPjo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcyBfQm91bmRBcmdzLCBjbGFzcyBfVHVwbGVVaiwKKyAgICAgICAgICBib29sID0gX19pc192YWxpZF9iaW5kX3JldHVybjxfRnAsIF9Cb3VuZEFyZ3MsIF9UdXBsZVVqPjo6dmFsdWU+CitzdHJ1Y3QgX19iaW5kX3JldHVybjsKKwordGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MgLi4uX0JvdW5kQXJncywgY2xhc3MgX1R1cGxlVWo+CitzdHJ1Y3QgX19iaW5kX3JldHVybjxfRnAsIHR1cGxlPF9Cb3VuZEFyZ3MuLi4+LCBfVHVwbGVVaiwgdHJ1ZT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9faW52b2tlX29mCisgICAgPAorICAgICAgICBfRnAmLAorICAgICAgICB0eXBlbmFtZSBfX211X3JldHVybgorICAgICAgICA8CisgICAgICAgICAgICBfQm91bmRBcmdzLAorICAgICAgICAgICAgX1R1cGxlVWoKKyAgICAgICAgPjo6dHlwZS4uLgorICAgID46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIC4uLl9Cb3VuZEFyZ3MsIGNsYXNzIF9UdXBsZVVqPgorc3RydWN0IF9fYmluZF9yZXR1cm48X0ZwLCBjb25zdCB0dXBsZTxfQm91bmRBcmdzLi4uPiwgX1R1cGxlVWosIHRydWU+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2ludm9rZV9vZgorICAgIDwKKyAgICAgICAgX0ZwJiwKKyAgICAgICAgdHlwZW5hbWUgX19tdV9yZXR1cm4KKyAgICAgICAgPAorICAgICAgICAgICAgY29uc3QgX0JvdW5kQXJncywKKyAgICAgICAgICAgIF9UdXBsZVVqCisgICAgICAgID46OnR5cGUuLi4KKyAgICA+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcyBfQm91bmRBcmdzLCBzaXplX3QgLi4uX0luZHgsIGNsYXNzIF9BcmdzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIF9fYmluZF9yZXR1cm48X0ZwLCBfQm91bmRBcmdzLCBfQXJncz46OnR5cGUKK19fYXBwbHlfZnVuY3RvcihfRnAmIF9fZiwgX0JvdW5kQXJncyYgX19ib3VuZF9hcmdzLCBfX3R1cGxlX2luZGljZXM8X0luZHguLi4+LAorICAgICAgICAgICAgICAgIF9BcmdzJiYgX19hcmdzKQoreworICAgIHJldHVybiBfVlNURDo6X19pbnZva2UoX19mLCBfVlNURDo6X19tdShfVlNURDo6Z2V0PF9JbmR4PihfX2JvdW5kX2FyZ3MpLCBfX2FyZ3MpLi4uKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyAuLi5fQm91bmRBcmdzPgorY2xhc3MgX19iaW5kCisgICAgOiBwdWJsaWMgX193ZWFrX3Jlc3VsdF90eXBlPHR5cGVuYW1lIGRlY2F5PF9GcD46OnR5cGU+Cit7Citwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBkZWNheTxfRnA+Ojp0eXBlIF9GZDsKKyAgICB0eXBlZGVmIHR1cGxlPHR5cGVuYW1lIGRlY2F5PF9Cb3VuZEFyZ3M+Ojp0eXBlLi4uPiBfVGQ7Citwcml2YXRlOgorICAgIF9GZCBfX2ZfOworICAgIF9UZCBfX2JvdW5kX2FyZ3NfOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX21ha2VfdHVwbGVfaW5kaWNlczxzaXplb2YuLi4oX0JvdW5kQXJncyk+Ojp0eXBlIF9faW5kaWNlczsKK3B1YmxpYzoKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0dwLCBjbGFzcyAuLi5fQkEsCisgICAgICAgICAgICAgIGNsYXNzID0gdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NvbnN0cnVjdGlibGU8X0ZkLCBfR3A+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc19zYW1lPHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X0dwPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JpbmQ+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID46OnR5cGU+CisgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICBleHBsaWNpdCBfX2JpbmQoX0dwJiYgX19mLCBfQkEmJiAuLi5fX2JvdW5kX2FyZ3MpCisgICAgICAgIDogX19mXyhfVlNURDo6Zm9yd2FyZDxfR3A+KF9fZikpLAorICAgICAgICAgIF9fYm91bmRfYXJnc18oX1ZTVEQ6OmZvcndhcmQ8X0JBPihfX2JvdW5kX2FyZ3MpLi4uKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIC4uLl9BcmdzPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHR5cGVuYW1lIF9fYmluZF9yZXR1cm48X0ZkLCBfVGQsIHR1cGxlPF9BcmdzJiYuLi4+ID46OnR5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfQXJncyYmIC4uLl9fYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9WU1REOjpfX2FwcGx5X2Z1bmN0b3IoX19mXywgX19ib3VuZF9hcmdzXywgX19pbmRpY2VzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGU8X0FyZ3MmJi4uLj4oX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIC4uLl9BcmdzPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHR5cGVuYW1lIF9fYmluZF9yZXR1cm48Y29uc3QgX0ZkLCBjb25zdCBfVGQsIHR1cGxlPF9BcmdzJiYuLi4+ID46OnR5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfQXJncyYmIC4uLl9fYXJncykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9WU1REOjpfX2FwcGx5X2Z1bmN0b3IoX19mXywgX19ib3VuZF9hcmdzXywgX19pbmRpY2VzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlPF9BcmdzJiYuLi4+KF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSk7CisgICAgICAgIH0KK307CisKK3RlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgLi4uX0JvdW5kQXJncz4KK3N0cnVjdCBfX2lzX2JpbmRfZXhwcmVzc2lvbjxfX2JpbmQ8X0ZwLCBfQm91bmRBcmdzLi4uPiA+IDogcHVibGljIHRydWVfdHlwZSB7fTsKKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyBfRnAsIGNsYXNzIC4uLl9Cb3VuZEFyZ3M+CitjbGFzcyBfX2JpbmRfcgorICAgIDogcHVibGljIF9fYmluZDxfRnAsIF9Cb3VuZEFyZ3MuLi4+Cit7CisgICAgdHlwZWRlZiBfX2JpbmQ8X0ZwLCBfQm91bmRBcmdzLi4uPiBiYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZTo6X0ZkIF9GZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2U6Ol9UZCBfVGQ7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfUnAgcmVzdWx0X3R5cGU7CisKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfR3AsIGNsYXNzIC4uLl9CQSwKKyAgICAgICAgICAgICAgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfY29uc3RydWN0aWJsZTxfRmQsIF9HcD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzX3NhbWU8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfR3A+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmluZF9yPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlPgorICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgZXhwbGljaXQgX19iaW5kX3IoX0dwJiYgX19mLCBfQkEmJiAuLi5fX2JvdW5kX2FyZ3MpCisgICAgICAgIDogYmFzZShfVlNURDo6Zm9yd2FyZDxfR3A+KF9fZiksCisgICAgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZDxfQkE+KF9fYm91bmRfYXJncykuLi4pIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FyZ3M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIGlzX2NvbnZlcnRpYmxlPHR5cGVuYW1lIF9fYmluZF9yZXR1cm48X0ZkLCBfVGQsIHR1cGxlPF9BcmdzJiYuLi4+ID46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZT46OnZhbHVlIHx8IGlzX3ZvaWQ8X1JwPjo6dmFsdWUsCisgICAgICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICA+Ojp0eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX0FyZ3MmJiAuLi5fX2FyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgX19pbnZva2Vfdm9pZF9yZXR1cm5fd3JhcHBlcjxfUnA+IF9JbnZva2VyOworICAgICAgICAgICAgcmV0dXJuIF9JbnZva2VyOjpfX2NhbGwoc3RhdGljX2Nhc3Q8YmFzZSY+KCp0aGlzKSwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FyZ3M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIGlzX2NvbnZlcnRpYmxlPHR5cGVuYW1lIF9fYmluZF9yZXR1cm48Y29uc3QgX0ZkLCBjb25zdCBfVGQsIHR1cGxlPF9BcmdzJiYuLi4+ID46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZT46OnZhbHVlIHx8IGlzX3ZvaWQ8X1JwPjo6dmFsdWUsCisgICAgICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICA+Ojp0eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX0FyZ3MmJiAuLi5fX2FyZ3MpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgX19pbnZva2Vfdm9pZF9yZXR1cm5fd3JhcHBlcjxfUnA+IF9JbnZva2VyOworICAgICAgICAgICAgcmV0dXJuIF9JbnZva2VyOjpfX2NhbGwoc3RhdGljX2Nhc3Q8YmFzZSBjb25zdCY+KCp0aGlzKSwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICAgICB9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIF9GcCwgY2xhc3MgLi4uX0JvdW5kQXJncz4KK3N0cnVjdCBfX2lzX2JpbmRfZXhwcmVzc2lvbjxfX2JpbmRfcjxfUnAsIF9GcCwgX0JvdW5kQXJncy4uLj4gPiA6IHB1YmxpYyB0cnVlX3R5cGUge307CisKK3RlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgLi4uX0JvdW5kQXJncz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfX2JpbmQ8X0ZwLCBfQm91bmRBcmdzLi4uPgorYmluZChfRnAmJiBfX2YsIF9Cb3VuZEFyZ3MmJi4uLiBfX2JvdW5kX2FyZ3MpCit7CisgICAgdHlwZWRlZiBfX2JpbmQ8X0ZwLCBfQm91bmRBcmdzLi4uPiB0eXBlOworICAgIHJldHVybiB0eXBlKF9WU1REOjpmb3J3YXJkPF9GcD4oX19mKSwgX1ZTVEQ6OmZvcndhcmQ8X0JvdW5kQXJncz4oX19ib3VuZF9hcmdzKS4uLik7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgX0ZwLCBjbGFzcyAuLi5fQm91bmRBcmdzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19fYmluZF9yPF9ScCwgX0ZwLCBfQm91bmRBcmdzLi4uPgorYmluZChfRnAmJiBfX2YsIF9Cb3VuZEFyZ3MmJi4uLiBfX2JvdW5kX2FyZ3MpCit7CisgICAgdHlwZWRlZiBfX2JpbmRfcjxfUnAsIF9GcCwgX0JvdW5kQXJncy4uLj4gdHlwZTsKKyAgICByZXR1cm4gdHlwZShfVlNURDo6Zm9yd2FyZDxfRnA+KF9fZiksIF9WU1REOjpmb3J3YXJkPF9Cb3VuZEFyZ3M+KF9fYm91bmRfYXJncykuLi4pOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKworI2RlZmluZSBfX2NwcF9saWJfaW52b2tlIDIwMTQxMQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZuLCBjbGFzcyAuLi5fQXJncz4KK3Jlc3VsdF9vZl90PF9GbiYmKF9BcmdzJiYuLi4pPgoraW52b2tlKF9GbiYmIF9fZiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgbm9leGNlcHQobm9leGNlcHQoX1ZTVEQ6Ol9faW52b2tlKF9WU1REOjpmb3J3YXJkPF9Gbj4oX19mKSwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKSkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6Ol9faW52b2tlKF9WU1REOjpmb3J3YXJkPF9Gbj4oX19mKSwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0RlY2F5RnVuYz4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9fbm90X2ZuX2ltcCB7CisgIF9EZWNheUZ1bmMgX19mZDsKKworcHVibGljOgorICAgIF9fbm90X2ZuX2ltcCgpID0gZGVsZXRlOworCisgICAgdGVtcGxhdGUgPGNsYXNzIC4uLl9BcmdzPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBhdXRvIG9wZXJhdG9yKCkoX0FyZ3MmJiAuLi5fX2FyZ3MpICYKKyAgICAgICAgICAgIG5vZXhjZXB0KG5vZXhjZXB0KCFfVlNURDo6aW52b2tlKF9fZmQsIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSkpCisgICAgICAgIC0+IGRlY2x0eXBlKCAgICAgICAgICAhX1ZTVEQ6Omludm9rZShfX2ZkLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikpCisgICAgICAgIHsgcmV0dXJuICAgICAgICAgICAgICAhX1ZTVEQ6Omludm9rZShfX2ZkLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyAuLi5fQXJncz4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYXV0byBvcGVyYXRvcigpKF9BcmdzJiYgLi4uX19hcmdzKSAmJgorICAgICAgICAgICAgbm9leGNlcHQobm9leGNlcHQoIV9WU1REOjppbnZva2UoX1ZTVEQ6Om1vdmUoX19mZCksIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSkpCisgICAgICAgIC0+IGRlY2x0eXBlKCAgICAgICAgICAhX1ZTVEQ6Omludm9rZShfVlNURDo6bW92ZShfX2ZkKSwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKQorICAgICAgICB7IHJldHVybiAgICAgICAgICAgICAgIV9WU1REOjppbnZva2UoX1ZTVEQ6Om1vdmUoX19mZCksIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIC4uLl9BcmdzPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBhdXRvIG9wZXJhdG9yKCkoX0FyZ3MmJiAuLi5fX2FyZ3MpIGNvbnN0JgorICAgICAgICAgICAgbm9leGNlcHQobm9leGNlcHQoIV9WU1REOjppbnZva2UoX19mZCwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKSkKKyAgICAgICAgLT4gZGVjbHR5cGUoICAgICAgICAgICFfVlNURDo6aW52b2tlKF9fZmQsIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSkKKyAgICAgICAgeyByZXR1cm4gICAgICAgICAgICAgICFfVlNURDo6aW52b2tlKF9fZmQsIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FyZ3M+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGF1dG8gb3BlcmF0b3IoKShfQXJncyYmIC4uLl9fYXJncykgY29uc3QmJgorICAgICAgICAgICAgbm9leGNlcHQobm9leGNlcHQoIV9WU1REOjppbnZva2UoX1ZTVEQ6Om1vdmUoX19mZCksIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSkpCisgICAgICAgIC0+IGRlY2x0eXBlKCAgICAgICAgICAhX1ZTVEQ6Omludm9rZShfVlNURDo6bW92ZShfX2ZkKSwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKQorICAgICAgICB7IHJldHVybiAgICAgICAgICAgICAgIV9WU1REOjppbnZva2UoX1ZTVEQ6Om1vdmUoX19mZCksIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCitwcml2YXRlOgorICAgIHRlbXBsYXRlIDxjbGFzcyBfUmF3RnVuYywKKyAgICAgICAgICAgICAgY2xhc3MgPSBlbmFibGVfaWZfdDwhaXNfc2FtZTxkZWNheV90PF9SYXdGdW5jPiwgX19ub3RfZm5faW1wPjo6dmFsdWU+PgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX25vdF9mbl9pbXAoX1Jhd0Z1bmMmJiBfX3JmKQorICAgICAgICA6IF9fZmQoX1ZTVEQ6OmZvcndhcmQ8X1Jhd0Z1bmM+KF9fcmYpKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9SYXdGdW5jPgorICAgIGZyaWVuZCBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fbm90X2ZuX2ltcDxkZWNheV90PF9SYXdGdW5jPj4gbm90X2ZuKF9SYXdGdW5jJiYpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SYXdGdW5jPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19fbm90X2ZuX2ltcDxkZWNheV90PF9SYXdGdW5jPj4gbm90X2ZuKF9SYXdGdW5jJiYgX19mbikgeworICAgIHJldHVybiBfX25vdF9mbl9pbXA8ZGVjYXlfdDxfUmF3RnVuYz4+KF9WU1REOjpmb3J3YXJkPF9SYXdGdW5jPihfX2ZuKSk7Cit9CisKKyNlbmRpZgorCisvLyBzdHJ1Y3QgaGFzaDxUKj4gaW4gPG1lbW9yeT4KKwordGVtcGxhdGUgPGNsYXNzIF9CaW5hcnlQcmVkaWNhdGUsIGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IxLCBjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yMj4KK3BhaXI8X0ZvcndhcmRJdGVyYXRvcjEsIF9Gb3J3YXJkSXRlcmF0b3IxPiBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorX19zZWFyY2goX0ZvcndhcmRJdGVyYXRvcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyYXRvcjIgX19sYXN0MiwgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQsCisgICAgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZywgZm9yd2FyZF9pdGVyYXRvcl90YWcpCit7CisgICAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCisgICAgICAgIHJldHVybiBtYWtlX3BhaXIoX19maXJzdDEsIF9fZmlyc3QxKTsgIC8vIEV2ZXJ5dGhpbmcgbWF0Y2hlcyBhbiBlbXB0eSBzZXF1ZW5jZQorICAgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgICAgLy8gRmluZCBmaXJzdCBlbGVtZW50IGluIHNlcXVlbmNlIDEgdGhhdCBtYXRjaHMgKl9fZmlyc3QyLCB3aXRoIGEgbWluaW51bSBvZiBsb29wIGNoZWNrcworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEpICAvLyByZXR1cm4gX19sYXN0MSBpZiBubyBlbGVtZW50IG1hdGNoZXMgKl9fZmlyc3QyCisgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VfcGFpcihfX2xhc3QxLCBfX2xhc3QxKTsKKyAgICAgICAgICAgIGlmIChfX3ByZWQoKl9fZmlyc3QxLCAqX19maXJzdDIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgKytfX2ZpcnN0MTsKKyAgICAgICAgfQorICAgICAgICAvLyAqX19maXJzdDEgbWF0Y2hlcyAqX19maXJzdDIsIG5vdyBtYXRjaCBlbGVtZW50cyBhZnRlciBoZXJlCisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbTEgPSBfX2ZpcnN0MTsKKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvcjIgX19tMiA9IF9fZmlyc3QyOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCsrX19tMiA9PSBfX2xhc3QyKSAgLy8gSWYgcGF0dGVybiBleGhhdXN0ZWQsIF9fZmlyc3QxIGlzIHRoZSBhbnN3ZXIgKHdvcmtzIGZvciAxIGVsZW1lbnQgcGF0dGVybikKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFrZV9wYWlyKF9fZmlyc3QxLCBfX20xKTsKKyAgICAgICAgICAgIGlmICgrK19fbTEgPT0gX19sYXN0MSkgIC8vIE90aGVyd2lzZSBpZiBzb3VyY2UgZXhoYXVzZWQsIHBhdHRlcm4gbm90IGZvdW5kCisgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VfcGFpcihfX2xhc3QxLCBfX2xhc3QxKTsKKyAgICAgICAgICAgIGlmICghX19wcmVkKCpfX20xLCAqX19tMikpICAvLyBpZiB0aGVyZSBpcyBhIG1pc21hdGNoLCByZXN0YXJ0IHdpdGggYSBuZXcgX19maXJzdDEKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK19fZmlyc3QxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAgLy8gZWxzZSB0aGVyZSBpcyBhIG1hdGNoLCBjaGVjayBuZXh0IGVsZW1lbnRzCisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmluYXJ5UHJlZGljYXRlLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IxLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyPgorX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK3BhaXI8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMSwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMT4KK19fc2VhcmNoKF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEgX19maXJzdDEsIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEgX19sYXN0MSwKKyAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIgX19maXJzdDIsIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIgX19sYXN0MiwgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQsCisgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3IxPjo6ZGlmZmVyZW5jZV90eXBlIF9EMTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3IyPjo6ZGlmZmVyZW5jZV90eXBlIF9EMjsKKyAgICAvLyBUYWtlIGFkdmFudGFnZSBvZiBrbm93aW5nIHNvdXJjZSBhbmQgcGF0dGVybiBsZW5ndGhzLiAgU3RvcCBzaG9ydCB3aGVuIHNvdXJjZSBpcyBzbWFsbGVyIHRoYW4gcGF0dGVybgorICAgIGNvbnN0IF9EMiBfX2xlbjIgPSBfX2xhc3QyIC0gX19maXJzdDI7CisgICAgaWYgKF9fbGVuMiA9PSAwKQorICAgICAgICByZXR1cm4gbWFrZV9wYWlyKF9fZmlyc3QxLCBfX2ZpcnN0MSk7CisgICAgY29uc3QgX0QxIF9fbGVuMSA9IF9fbGFzdDEgLSBfX2ZpcnN0MTsKKyAgICBpZiAoX19sZW4xIDwgX19sZW4yKQorICAgICAgICByZXR1cm4gbWFrZV9wYWlyKF9fbGFzdDEsIF9fbGFzdDEpOworICAgIGNvbnN0IF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEgX19zID0gX19sYXN0MSAtIChfX2xlbjIgLSAxKTsgIC8vIFN0YXJ0IG9mIHBhdHRlcm4gbWF0Y2ggY2FuJ3QgZ28gYmV5b25kIGhlcmUKKworICAgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX2ZpcnN0MSA9PSBfX3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VfcGFpcihfX2xhc3QxLCBfX2xhc3QxKTsKKyAgICAgICAgICAgIGlmIChfX3ByZWQoKl9fZmlyc3QxLCAqX19maXJzdDIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgKytfX2ZpcnN0MTsKKyAgICAgICAgfQorCisgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEgX19tMSA9IF9fZmlyc3QxOworICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyIF9fbTIgPSBfX2ZpcnN0MjsKKyAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgeworICAgICAgICAgICAgIGlmICgrK19fbTIgPT0gX19sYXN0MikKKyAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VfcGFpcihfX2ZpcnN0MSwgX19maXJzdDEgKyBfX2xlbjIpOworICAgICAgICAgICAgICsrX19tMTsgICAgICAgICAgLy8gbm8gbmVlZCB0byBjaGVjayByYW5nZSBvbiBfX20xIGJlY2F1c2UgX19zIGd1YXJhbnRlZXMgd2UgaGF2ZSBlbm91Z2ggc291cmNlCisgICAgICAgICAgICAgaWYgKCFfX3ByZWQoKl9fbTEsICpfX20yKSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICsrX19maXJzdDE7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICB9Cit9CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAorCisvLyBkZWZhdWx0IHNlYXJjaGVyCit0ZW1wbGF0ZTxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlID0gZXF1YWxfdG88Pj4KK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgZGVmYXVsdF9zZWFyY2hlciB7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGRlZmF1bHRfc2VhcmNoZXIoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX19sLCAKKyAgICAgICAgICAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX3AgPSBfQmluYXJ5UHJlZGljYXRlKCkpCisgICAgICAgIDogX19maXJzdF8oX19mKSwgX19sYXN0XyhfX2wpLCBfX3ByZWRfKF9fcCkge30KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpcjxfRm9yd2FyZEl0ZXJhdG9yMiwgX0ZvcndhcmRJdGVyYXRvcjI+CisgICAgb3BlcmF0b3IgKCkgKF9Gb3J3YXJkSXRlcmF0b3IyIF9fZiwgX0ZvcndhcmRJdGVyYXRvcjIgX19sKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIF9WU1REOjpfX3NlYXJjaChfX2YsIF9fbCwgX19maXJzdF8sIF9fbGFzdF8sIF9fcHJlZF8sCisgICAgICAgICAgICB0eXBlbmFtZSBfVlNURDo6aXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSgpLAorICAgICAgICAgICAgdHlwZW5hbWUgX1ZTVEQ6Oml0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMj46Oml0ZXJhdG9yX2NhdGVnb3J5KCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3RfOworICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0XzsKKyAgICBfQmluYXJ5UHJlZGljYXRlIF9fcHJlZF87CisgICAgfTsKKworI2VuZGlmIC8vIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX0ZVTkNUSU9OQUwKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9mdXR1cmUgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZnV0dXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNjU3NGUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvZnV0dXJlCkBAIC0wLDAgKzEsMjYxOCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZ1dHVyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9GVVRVUkUKKyNkZWZpbmUgX0xJQkNQUF9GVVRVUkUKKworLyoKKyAgICBmdXR1cmUgc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCitlbnVtIGNsYXNzIGZ1dHVyZV9lcnJjCit7CisgICAgZnV0dXJlX2FscmVhZHlfcmV0cmlldmVkID0gMSwKKyAgICBwcm9taXNlX2FscmVhZHlfc2F0aXNmaWVkLAorICAgIG5vX3N0YXRlLAorICAgIGJyb2tlbl9wcm9taXNlCit9OworCitlbnVtIGNsYXNzIGxhdW5jaAoreworICAgIGFzeW5jID0gMSwKKyAgICBkZWZlcnJlZCA9IDIsCisgICAgYW55ID0gYXN5bmMgfCBkZWZlcnJlZAorfTsKKworZW51bSBjbGFzcyBmdXR1cmVfc3RhdHVzCit7CisgICAgcmVhZHksCisgICAgdGltZW91dCwKKyAgICBkZWZlcnJlZAorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzX2Vycm9yX2NvZGVfZW51bTxmdXR1cmVfZXJyYz4gOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKK2Vycm9yX2NvZGUgbWFrZV9lcnJvcl9jb2RlKGZ1dHVyZV9lcnJjIGUpIG5vZXhjZXB0OworZXJyb3JfY29uZGl0aW9uIG1ha2VfZXJyb3JfY29uZGl0aW9uKGZ1dHVyZV9lcnJjIGUpIG5vZXhjZXB0OworCitjb25zdCBlcnJvcl9jYXRlZ29yeSYgZnV0dXJlX2NhdGVnb3J5KCkgbm9leGNlcHQ7CisKK2NsYXNzIGZ1dHVyZV9lcnJvcgorICAgIDogcHVibGljIGxvZ2ljX2Vycm9yCit7CitwdWJsaWM6CisgICAgZnV0dXJlX2Vycm9yKGVycm9yX2NvZGUgZWMpOyAgLy8gZXhwb3NpdGlvbiBvbmx5CisgICAgZXhwbGljaXQgZnV0dXJlX2Vycm9yKGZ1dHVyZV9lcnJjKTsgLy8gQysrMTcKKyAgICBjb25zdCBlcnJvcl9jb2RlJiBjb2RlKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3QgY2hhciogICAgICAgd2hhdCgpIGNvbnN0IG5vZXhjZXB0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFI+CitjbGFzcyBwcm9taXNlCit7CitwdWJsaWM6CisgICAgcHJvbWlzZSgpOworICAgIHRlbXBsYXRlIDxjbGFzcyBBbGxvY2F0b3I+CisgICAgICAgIHByb21pc2UoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBBbGxvY2F0b3ImIGEpOworICAgIHByb21pc2UocHJvbWlzZSYmIHJocykgbm9leGNlcHQ7CisgICAgcHJvbWlzZShjb25zdCBwcm9taXNlJiByaHMpID0gZGVsZXRlOworICAgIH5wcm9taXNlKCk7CisKKyAgICAvLyBhc3NpZ25tZW50CisgICAgcHJvbWlzZSYgb3BlcmF0b3I9KHByb21pc2UmJiByaHMpIG5vZXhjZXB0OworICAgIHByb21pc2UmIG9wZXJhdG9yPShjb25zdCBwcm9taXNlJiByaHMpID0gZGVsZXRlOworICAgIHZvaWQgc3dhcChwcm9taXNlJiBvdGhlcikgbm9leGNlcHQ7CisKKyAgICAvLyByZXRyaWV2aW5nIHRoZSByZXN1bHQKKyAgICBmdXR1cmU8Uj4gZ2V0X2Z1dHVyZSgpOworCisgICAgLy8gc2V0dGluZyB0aGUgcmVzdWx0CisgICAgdm9pZCBzZXRfdmFsdWUoY29uc3QgUiYgcik7CisgICAgdm9pZCBzZXRfdmFsdWUoUiYmIHIpOworICAgIHZvaWQgc2V0X2V4Y2VwdGlvbihleGNlcHRpb25fcHRyIHApOworCisgICAgLy8gc2V0dGluZyB0aGUgcmVzdWx0IHdpdGggZGVmZXJyZWQgbm90aWZpY2F0aW9uCisgICAgdm9pZCBzZXRfdmFsdWVfYXRfdGhyZWFkX2V4aXQoY29uc3QgUiYgcik7CisgICAgdm9pZCBzZXRfdmFsdWVfYXRfdGhyZWFkX2V4aXQoUiYmIHIpOworICAgIHZvaWQgc2V0X2V4Y2VwdGlvbl9hdF90aHJlYWRfZXhpdChleGNlcHRpb25fcHRyIHApOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFI+CitjbGFzcyBwcm9taXNlPFImPgoreworcHVibGljOgorICAgIHByb21pc2UoKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgQWxsb2NhdG9yPgorICAgICAgICBwcm9taXNlKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgQWxsb2NhdG9yJiBhKTsKKyAgICBwcm9taXNlKHByb21pc2UmJiByaHMpIG5vZXhjZXB0OworICAgIHByb21pc2UoY29uc3QgcHJvbWlzZSYgcmhzKSA9IGRlbGV0ZTsKKyAgICB+cHJvbWlzZSgpOworCisgICAgLy8gYXNzaWdubWVudAorICAgIHByb21pc2UmIG9wZXJhdG9yPShwcm9taXNlJiYgcmhzKSBub2V4Y2VwdDsKKyAgICBwcm9taXNlJiBvcGVyYXRvcj0oY29uc3QgcHJvbWlzZSYgcmhzKSA9IGRlbGV0ZTsKKyAgICB2b2lkIHN3YXAocHJvbWlzZSYgb3RoZXIpIG5vZXhjZXB0OworCisgICAgLy8gcmV0cmlldmluZyB0aGUgcmVzdWx0CisgICAgZnV0dXJlPFImPiBnZXRfZnV0dXJlKCk7CisKKyAgICAvLyBzZXR0aW5nIHRoZSByZXN1bHQKKyAgICB2b2lkIHNldF92YWx1ZShSJiByKTsKKyAgICB2b2lkIHNldF9leGNlcHRpb24oZXhjZXB0aW9uX3B0ciBwKTsKKworICAgIC8vIHNldHRpbmcgdGhlIHJlc3VsdCB3aXRoIGRlZmVycmVkIG5vdGlmaWNhdGlvbgorICAgIHZvaWQgc2V0X3ZhbHVlX2F0X3RocmVhZF9leGl0KFImKTsKKyAgICB2b2lkIHNldF9leGNlcHRpb25fYXRfdGhyZWFkX2V4aXQoZXhjZXB0aW9uX3B0ciBwKTsKK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBwcm9taXNlPHZvaWQ+Cit7CitwdWJsaWM6CisgICAgcHJvbWlzZSgpOworICAgIHRlbXBsYXRlIDxjbGFzcyBBbGxvY2F0b3I+CisgICAgICAgIHByb21pc2UoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBBbGxvY2F0b3ImIGEpOworICAgIHByb21pc2UocHJvbWlzZSYmIHJocykgbm9leGNlcHQ7CisgICAgcHJvbWlzZShjb25zdCBwcm9taXNlJiByaHMpID0gZGVsZXRlOworICAgIH5wcm9taXNlKCk7CisKKyAgICAvLyBhc3NpZ25tZW50CisgICAgcHJvbWlzZSYgb3BlcmF0b3I9KHByb21pc2UmJiByaHMpIG5vZXhjZXB0OworICAgIHByb21pc2UmIG9wZXJhdG9yPShjb25zdCBwcm9taXNlJiByaHMpID0gZGVsZXRlOworICAgIHZvaWQgc3dhcChwcm9taXNlJiBvdGhlcikgbm9leGNlcHQ7CisKKyAgICAvLyByZXRyaWV2aW5nIHRoZSByZXN1bHQKKyAgICBmdXR1cmU8dm9pZD4gZ2V0X2Z1dHVyZSgpOworCisgICAgLy8gc2V0dGluZyB0aGUgcmVzdWx0CisgICAgdm9pZCBzZXRfdmFsdWUoKTsKKyAgICB2b2lkIHNldF9leGNlcHRpb24oZXhjZXB0aW9uX3B0ciBwKTsKKworICAgIC8vIHNldHRpbmcgdGhlIHJlc3VsdCB3aXRoIGRlZmVycmVkIG5vdGlmaWNhdGlvbgorICAgIHZvaWQgc2V0X3ZhbHVlX2F0X3RocmVhZF9leGl0KCk7CisgICAgdm9pZCBzZXRfZXhjZXB0aW9uX2F0X3RocmVhZF9leGl0KGV4Y2VwdGlvbl9wdHIgcCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgUj4gdm9pZCBzd2FwKHByb21pc2U8Uj4mIHgsIHByb21pc2U8Uj4mIHkpIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgQWxsb2M+CisgICAgc3RydWN0IHVzZXNfYWxsb2NhdG9yPHByb21pc2U8Uj4sIEFsbG9jPiA6IHB1YmxpYyB0cnVlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBSPgorY2xhc3MgZnV0dXJlCit7CitwdWJsaWM6CisgICAgZnV0dXJlKCkgbm9leGNlcHQ7CisgICAgZnV0dXJlKGZ1dHVyZSYmKSBub2V4Y2VwdDsKKyAgICBmdXR1cmUoY29uc3QgZnV0dXJlJiByaHMpID0gZGVsZXRlOworICAgIH5mdXR1cmUoKTsKKyAgICBmdXR1cmUmIG9wZXJhdG9yPShjb25zdCBmdXR1cmUmIHJocykgPSBkZWxldGU7CisgICAgZnV0dXJlJiBvcGVyYXRvcj0oZnV0dXJlJiYpIG5vZXhjZXB0OworICAgIHNoYXJlZF9mdXR1cmU8Uj4gc2hhcmUoKSBub2V4Y2VwdDsKKworICAgIC8vIHJldHJpZXZpbmcgdGhlIHZhbHVlCisgICAgUiBnZXQoKTsKKworICAgIC8vIGZ1bmN0aW9ucyB0byBjaGVjayBzdGF0ZQorICAgIGJvb2wgdmFsaWQoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIHZvaWQgd2FpdCgpIGNvbnN0OworICAgIHRlbXBsYXRlIDxjbGFzcyBSZXAsIGNsYXNzIFBlcmlvZD4KKyAgICAgICAgZnV0dXJlX3N0YXR1cworICAgICAgICB3YWl0X2Zvcihjb25zdCBjaHJvbm86OmR1cmF0aW9uPFJlcCwgUGVyaW9kPiYgcmVsX3RpbWUpIGNvbnN0OworICAgIHRlbXBsYXRlIDxjbGFzcyBDbG9jaywgY2xhc3MgRHVyYXRpb24+CisgICAgICAgIGZ1dHVyZV9zdGF0dXMKKyAgICAgICAgd2FpdF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFI+CitjbGFzcyBmdXR1cmU8UiY+Cit7CitwdWJsaWM6CisgICAgZnV0dXJlKCkgbm9leGNlcHQ7CisgICAgZnV0dXJlKGZ1dHVyZSYmKSBub2V4Y2VwdDsKKyAgICBmdXR1cmUoY29uc3QgZnV0dXJlJiByaHMpID0gZGVsZXRlOworICAgIH5mdXR1cmUoKTsKKyAgICBmdXR1cmUmIG9wZXJhdG9yPShjb25zdCBmdXR1cmUmIHJocykgPSBkZWxldGU7CisgICAgZnV0dXJlJiBvcGVyYXRvcj0oZnV0dXJlJiYpIG5vZXhjZXB0OworICAgIHNoYXJlZF9mdXR1cmU8UiY+IHNoYXJlKCkgbm9leGNlcHQ7CisKKyAgICAvLyByZXRyaWV2aW5nIHRoZSB2YWx1ZQorICAgIFImIGdldCgpOworCisgICAgLy8gZnVuY3Rpb25zIHRvIGNoZWNrIHN0YXRlCisgICAgYm9vbCB2YWxpZCgpIGNvbnN0IG5vZXhjZXB0OworCisgICAgdm9pZCB3YWl0KCkgY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIFJlcCwgY2xhc3MgUGVyaW9kPgorICAgICAgICBmdXR1cmVfc3RhdHVzCisgICAgICAgIHdhaXRfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248UmVwLCBQZXJpb2Q+JiByZWxfdGltZSkgY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbj4KKyAgICAgICAgZnV0dXJlX3N0YXR1cworICAgICAgICB3YWl0X3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxDbG9jaywgRHVyYXRpb24+JiBhYnNfdGltZSkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgZnV0dXJlPHZvaWQ+Cit7CitwdWJsaWM6CisgICAgZnV0dXJlKCkgbm9leGNlcHQ7CisgICAgZnV0dXJlKGZ1dHVyZSYmKSBub2V4Y2VwdDsKKyAgICBmdXR1cmUoY29uc3QgZnV0dXJlJiByaHMpID0gZGVsZXRlOworICAgIH5mdXR1cmUoKTsKKyAgICBmdXR1cmUmIG9wZXJhdG9yPShjb25zdCBmdXR1cmUmIHJocykgPSBkZWxldGU7CisgICAgZnV0dXJlJiBvcGVyYXRvcj0oZnV0dXJlJiYpIG5vZXhjZXB0OworICAgIHNoYXJlZF9mdXR1cmU8dm9pZD4gc2hhcmUoKSBub2V4Y2VwdDsKKworICAgIC8vIHJldHJpZXZpbmcgdGhlIHZhbHVlCisgICAgdm9pZCBnZXQoKTsKKworICAgIC8vIGZ1bmN0aW9ucyB0byBjaGVjayBzdGF0ZQorICAgIGJvb2wgdmFsaWQoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIHZvaWQgd2FpdCgpIGNvbnN0OworICAgIHRlbXBsYXRlIDxjbGFzcyBSZXAsIGNsYXNzIFBlcmlvZD4KKyAgICAgICAgZnV0dXJlX3N0YXR1cworICAgICAgICB3YWl0X2Zvcihjb25zdCBjaHJvbm86OmR1cmF0aW9uPFJlcCwgUGVyaW9kPiYgcmVsX3RpbWUpIGNvbnN0OworICAgIHRlbXBsYXRlIDxjbGFzcyBDbG9jaywgY2xhc3MgRHVyYXRpb24+CisgICAgICAgIGZ1dHVyZV9zdGF0dXMKKyAgICAgICAgd2FpdF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFI+CitjbGFzcyBzaGFyZWRfZnV0dXJlCit7CitwdWJsaWM6CisgICAgc2hhcmVkX2Z1dHVyZSgpIG5vZXhjZXB0OworICAgIHNoYXJlZF9mdXR1cmUoY29uc3Qgc2hhcmVkX2Z1dHVyZSYgcmhzKTsKKyAgICBzaGFyZWRfZnV0dXJlKGZ1dHVyZTxSPiYmKSBub2V4Y2VwdDsKKyAgICBzaGFyZWRfZnV0dXJlKHNoYXJlZF9mdXR1cmUmJiByaHMpIG5vZXhjZXB0OworICAgIH5zaGFyZWRfZnV0dXJlKCk7CisgICAgc2hhcmVkX2Z1dHVyZSYgb3BlcmF0b3I9KGNvbnN0IHNoYXJlZF9mdXR1cmUmIHJocyk7CisgICAgc2hhcmVkX2Z1dHVyZSYgb3BlcmF0b3I9KHNoYXJlZF9mdXR1cmUmJiByaHMpIG5vZXhjZXB0OworCisgICAgLy8gcmV0cmlldmluZyB0aGUgdmFsdWUKKyAgICBjb25zdCBSJiBnZXQoKSBjb25zdDsKKworICAgIC8vIGZ1bmN0aW9ucyB0byBjaGVjayBzdGF0ZQorICAgIGJvb2wgdmFsaWQoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIHZvaWQgd2FpdCgpIGNvbnN0OworICAgIHRlbXBsYXRlIDxjbGFzcyBSZXAsIGNsYXNzIFBlcmlvZD4KKyAgICAgICAgZnV0dXJlX3N0YXR1cworICAgICAgICB3YWl0X2Zvcihjb25zdCBjaHJvbm86OmR1cmF0aW9uPFJlcCwgUGVyaW9kPiYgcmVsX3RpbWUpIGNvbnN0OworICAgIHRlbXBsYXRlIDxjbGFzcyBDbG9jaywgY2xhc3MgRHVyYXRpb24+CisgICAgICAgIGZ1dHVyZV9zdGF0dXMKKyAgICAgICAgd2FpdF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFI+CitjbGFzcyBzaGFyZWRfZnV0dXJlPFImPgoreworcHVibGljOgorICAgIHNoYXJlZF9mdXR1cmUoKSBub2V4Y2VwdDsKKyAgICBzaGFyZWRfZnV0dXJlKGNvbnN0IHNoYXJlZF9mdXR1cmUmIHJocyk7CisgICAgc2hhcmVkX2Z1dHVyZShmdXR1cmU8UiY+JiYpIG5vZXhjZXB0OworICAgIHNoYXJlZF9mdXR1cmUoc2hhcmVkX2Z1dHVyZSYmIHJocykgbm9leGNlcHQ7CisgICAgfnNoYXJlZF9mdXR1cmUoKTsKKyAgICBzaGFyZWRfZnV0dXJlJiBvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX2Z1dHVyZSYgcmhzKTsKKyAgICBzaGFyZWRfZnV0dXJlJiBvcGVyYXRvcj0oc2hhcmVkX2Z1dHVyZSYmIHJocykgbm9leGNlcHQ7CisKKyAgICAvLyByZXRyaWV2aW5nIHRoZSB2YWx1ZQorICAgIFImIGdldCgpIGNvbnN0OworCisgICAgLy8gZnVuY3Rpb25zIHRvIGNoZWNrIHN0YXRlCisgICAgYm9vbCB2YWxpZCgpIGNvbnN0IG5vZXhjZXB0OworCisgICAgdm9pZCB3YWl0KCkgY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIFJlcCwgY2xhc3MgUGVyaW9kPgorICAgICAgICBmdXR1cmVfc3RhdHVzCisgICAgICAgIHdhaXRfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248UmVwLCBQZXJpb2Q+JiByZWxfdGltZSkgY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbj4KKyAgICAgICAgZnV0dXJlX3N0YXR1cworICAgICAgICB3YWl0X3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxDbG9jaywgRHVyYXRpb24+JiBhYnNfdGltZSkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3Mgc2hhcmVkX2Z1dHVyZTx2b2lkPgoreworcHVibGljOgorICAgIHNoYXJlZF9mdXR1cmUoKSBub2V4Y2VwdDsKKyAgICBzaGFyZWRfZnV0dXJlKGNvbnN0IHNoYXJlZF9mdXR1cmUmIHJocyk7CisgICAgc2hhcmVkX2Z1dHVyZShmdXR1cmU8dm9pZD4mJikgbm9leGNlcHQ7CisgICAgc2hhcmVkX2Z1dHVyZShzaGFyZWRfZnV0dXJlJiYgcmhzKSBub2V4Y2VwdDsKKyAgICB+c2hhcmVkX2Z1dHVyZSgpOworICAgIHNoYXJlZF9mdXR1cmUmIG9wZXJhdG9yPShjb25zdCBzaGFyZWRfZnV0dXJlJiByaHMpOworICAgIHNoYXJlZF9mdXR1cmUmIG9wZXJhdG9yPShzaGFyZWRfZnV0dXJlJiYgcmhzKSBub2V4Y2VwdDsKKworICAgIC8vIHJldHJpZXZpbmcgdGhlIHZhbHVlCisgICAgdm9pZCBnZXQoKSBjb25zdDsKKworICAgIC8vIGZ1bmN0aW9ucyB0byBjaGVjayBzdGF0ZQorICAgIGJvb2wgdmFsaWQoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIHZvaWQgd2FpdCgpIGNvbnN0OworICAgIHRlbXBsYXRlIDxjbGFzcyBSZXAsIGNsYXNzIFBlcmlvZD4KKyAgICAgICAgZnV0dXJlX3N0YXR1cworICAgICAgICB3YWl0X2Zvcihjb25zdCBjaHJvbm86OmR1cmF0aW9uPFJlcCwgUGVyaW9kPiYgcmVsX3RpbWUpIGNvbnN0OworICAgIHRlbXBsYXRlIDxjbGFzcyBDbG9jaywgY2xhc3MgRHVyYXRpb24+CisgICAgICAgIGZ1dHVyZV9zdGF0dXMKKyAgICAgICAgd2FpdF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIEYsIGNsYXNzLi4uIEFyZ3M+CisgIGZ1dHVyZTx0eXBlbmFtZSByZXN1bHRfb2Y8dHlwZW5hbWUgZGVjYXk8Rj46OnR5cGUodHlwZW5hbWUgZGVjYXk8QXJncz46OnR5cGUuLi4pPjo6dHlwZT4KKyAgYXN5bmMoRiYmIGYsIEFyZ3MmJi4uLiBhcmdzKTsKKwordGVtcGxhdGUgPGNsYXNzIEYsIGNsYXNzLi4uIEFyZ3M+CisgIGZ1dHVyZTx0eXBlbmFtZSByZXN1bHRfb2Y8dHlwZW5hbWUgZGVjYXk8Rj46OnR5cGUodHlwZW5hbWUgZGVjYXk8QXJncz46OnR5cGUuLi4pPjo6dHlwZT4KKyAgYXN5bmMobGF1bmNoIHBvbGljeSwgRiYmIGYsIEFyZ3MmJi4uLiBhcmdzKTsKKwordGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBwYWNrYWdlZF90YXNrOyAvLyB1bmRlZmluZWQKKwordGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzLi4uIEFyZ1R5cGVzPgorY2xhc3MgcGFja2FnZWRfdGFzazxSKEFyZ1R5cGVzLi4uKT4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFIgcmVzdWx0X3R5cGU7IC8vIGV4dGVuc2lvbgorCisgICAgLy8gY29uc3RydWN0aW9uIGFuZCBkZXN0cnVjdGlvbgorICAgIHBhY2thZ2VkX3Rhc2soKSBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgRj4KKyAgICAgICAgZXhwbGljaXQgcGFja2FnZWRfdGFzayhGJiYgZik7CisgICAgdGVtcGxhdGUgPGNsYXNzIEYsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICAgICAgcGFja2FnZWRfdGFzayhhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IEFsbG9jYXRvciYgYSwgRiYmIGYpOworICAgIH5wYWNrYWdlZF90YXNrKCk7CisKKyAgICAvLyBubyBjb3B5CisgICAgcGFja2FnZWRfdGFzayhjb25zdCBwYWNrYWdlZF90YXNrJikgPSBkZWxldGU7CisgICAgcGFja2FnZWRfdGFzayYgb3BlcmF0b3I9KGNvbnN0IHBhY2thZ2VkX3Rhc2smKSA9IGRlbGV0ZTsKKworICAgIC8vIG1vdmUgc3VwcG9ydAorICAgIHBhY2thZ2VkX3Rhc2socGFja2FnZWRfdGFzayYmIG90aGVyKSBub2V4Y2VwdDsKKyAgICBwYWNrYWdlZF90YXNrJiBvcGVyYXRvcj0ocGFja2FnZWRfdGFzayYmIG90aGVyKSBub2V4Y2VwdDsKKyAgICB2b2lkIHN3YXAocGFja2FnZWRfdGFzayYgb3RoZXIpIG5vZXhjZXB0OworCisgICAgYm9vbCB2YWxpZCgpIGNvbnN0IG5vZXhjZXB0OworCisgICAgLy8gcmVzdWx0IHJldHJpZXZhbAorICAgIGZ1dHVyZTxSPiBnZXRfZnV0dXJlKCk7CisKKyAgICAvLyBleGVjdXRpb24KKyAgICB2b2lkIG9wZXJhdG9yKCkoQXJnVHlwZXMuLi4gKTsKKyAgICB2b2lkIG1ha2VfcmVhZHlfYXRfdGhyZWFkX2V4aXQoQXJnVHlwZXMuLi4pOworCisgICAgdm9pZCByZXNldCgpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFI+CisgIHZvaWQgc3dhcChwYWNrYWdlZF90YXNrPFIoQXJnVHlwZXMuLi4pJiwgcGFja2FnZWRfdGFzazxSKEFyZ1R5cGVzLi4uKT4mKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIEFsbG9jPiBzdHJ1Y3QgdXNlc19hbGxvY2F0b3I8cGFja2FnZWRfdGFzazxSPiwgQWxsb2M+OworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCisjaWZkZWYgX0xJQkNQUF9IQVNfTk9fVEhSRUFEUworI2Vycm9yIDxmdXR1cmU+IGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBzaW5nbGUgdGhyZWFkZWQgc3lzdGVtCisjZWxzZSAvLyAhX0xJQkNQUF9IQVNfTk9fVEhSRUFEUworCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKworLy9lbnVtIGNsYXNzIGZ1dHVyZV9lcnJjCitfTElCQ1BQX0RFQ0xBUkVfU1RST05HX0VOVU0oZnV0dXJlX2VycmMpCit7CisgICAgZnV0dXJlX2FscmVhZHlfcmV0cmlldmVkID0gMSwKKyAgICBwcm9taXNlX2FscmVhZHlfc2F0aXNmaWVkLAorICAgIG5vX3N0YXRlLAorICAgIGJyb2tlbl9wcm9taXNlCit9OworX0xJQkNQUF9ERUNMQVJFX1NUUk9OR19FTlVNX0VQSUxPRyhmdXR1cmVfZXJyYykKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19lcnJvcl9jb2RlX2VudW08ZnV0dXJlX2VycmM+IDogcHVibGljIHRydWVfdHlwZSB7fTsKKworI2lmZGVmIF9MSUJDUFBfSEFTX05PX1NUUk9OR19FTlVNUwordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19lcnJvcl9jb2RlX2VudW08ZnV0dXJlX2VycmM6Ol9fbHg+IDogcHVibGljIHRydWVfdHlwZSB7IH07CisjZW5kaWYKKworLy9lbnVtIGNsYXNzIGxhdW5jaAorX0xJQkNQUF9ERUNMQVJFX1NUUk9OR19FTlVNKGxhdW5jaCkKK3sKKyAgICBhc3luYyA9IDEsCisgICAgZGVmZXJyZWQgPSAyLAorICAgIGFueSA9IGFzeW5jIHwgZGVmZXJyZWQKK307CitfTElCQ1BQX0RFQ0xBUkVfU1RST05HX0VOVU1fRVBJTE9HKGxhdW5jaCkKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19TVFJPTkdfRU5VTVMKKworI2lmZGVmIF9MSUJDWFhfVU5ERVJMWUlOR19UWVBFCit0eXBlZGVmIHVuZGVybHlpbmdfdHlwZTxsYXVuY2g+Ojp0eXBlIF9fbGF1bmNoX3VuZGVybHlpbmdfdHlwZTsKKyNlbHNlCit0eXBlZGVmIGludCBfX2xhdW5jaF91bmRlcmx5aW5nX3R5cGU7CisjZW5kaWYKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSCitsYXVuY2gKK29wZXJhdG9yJihsYXVuY2ggX194LCBsYXVuY2ggX195KQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxsYXVuY2g+KHN0YXRpY19jYXN0PF9fbGF1bmNoX3VuZGVybHlpbmdfdHlwZT4oX194KSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X19sYXVuY2hfdW5kZXJseWluZ190eXBlPihfX3kpKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSCitsYXVuY2gKK29wZXJhdG9yfChsYXVuY2ggX194LCBsYXVuY2ggX195KQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxsYXVuY2g+KHN0YXRpY19jYXN0PF9fbGF1bmNoX3VuZGVybHlpbmdfdHlwZT4oX194KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X19sYXVuY2hfdW5kZXJseWluZ190eXBlPihfX3kpKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSCitsYXVuY2gKK29wZXJhdG9yXihsYXVuY2ggX194LCBsYXVuY2ggX195KQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxsYXVuY2g+KHN0YXRpY19jYXN0PF9fbGF1bmNoX3VuZGVybHlpbmdfdHlwZT4oX194KSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X19sYXVuY2hfdW5kZXJseWluZ190eXBlPihfX3kpKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSCitsYXVuY2gKK29wZXJhdG9yfihsYXVuY2ggX194KQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxsYXVuY2g+KH5zdGF0aWNfY2FzdDxfX2xhdW5jaF91bmRlcmx5aW5nX3R5cGU+KF9feCkgJiAzKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2xhdW5jaCYKK29wZXJhdG9yJj0obGF1bmNoJiBfX3gsIGxhdW5jaCBfX3kpCit7CisgICAgX194ID0gX194ICYgX195OyByZXR1cm4gX194OworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorbGF1bmNoJgorb3BlcmF0b3J8PShsYXVuY2gmIF9feCwgbGF1bmNoIF9feSkKK3sKKyAgICBfX3ggPSBfX3ggfCBfX3k7IHJldHVybiBfX3g7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitsYXVuY2gmCitvcGVyYXRvcl49KGxhdW5jaCYgX194LCBsYXVuY2ggX195KQoreworICAgIF9feCA9IF9feCBeIF9feTsgcmV0dXJuIF9feDsKK30KKworI2VuZGlmICAvLyAhX0xJQkNQUF9IQVNfTk9fU1RST05HX0VOVU1TCisKKy8vZW51bSBjbGFzcyBmdXR1cmVfc3RhdHVzCitfTElCQ1BQX0RFQ0xBUkVfU1RST05HX0VOVU0oZnV0dXJlX3N0YXR1cykKK3sKKyAgICByZWFkeSwKKyAgICB0aW1lb3V0LAorICAgIGRlZmVycmVkCit9OworX0xJQkNQUF9ERUNMQVJFX1NUUk9OR19FTlVNX0VQSUxPRyhmdXR1cmVfc3RhdHVzKQorCitfTElCQ1BQX0ZVTkNfVklTCitjb25zdCBlcnJvcl9jYXRlZ29yeSYgZnV0dXJlX2NhdGVnb3J5KCkgX05PRVhDRVBUOworCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorZXJyb3JfY29kZQorbWFrZV9lcnJvcl9jb2RlKGZ1dHVyZV9lcnJjIF9fZSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIGVycm9yX2NvZGUoc3RhdGljX2Nhc3Q8aW50PihfX2UpLCBmdXR1cmVfY2F0ZWdvcnkoKSk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitlcnJvcl9jb25kaXRpb24KK21ha2VfZXJyb3JfY29uZGl0aW9uKGZ1dHVyZV9lcnJjIF9fZSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIGVycm9yX2NvbmRpdGlvbihzdGF0aWNfY2FzdDxpbnQ+KF9fZSksIGZ1dHVyZV9jYXRlZ29yeSgpKTsKK30KKworY2xhc3MgX0xJQkNQUF9FWENFUFRJT05fQUJJIF9MSUJDUFBfQVZBSUxBQklMSVRZX0ZVVFVSRV9FUlJPUiBmdXR1cmVfZXJyb3IKKyAgICA6IHB1YmxpYyBsb2dpY19lcnJvcgoreworICAgIGVycm9yX2NvZGUgX19lY187CitwdWJsaWM6CisgICAgZnV0dXJlX2Vycm9yKGVycm9yX2NvZGUgX19lYyk7CisjaWYgX0xJQkNQUF9TVERfVkVSUyA+IDE0CisgICAgZXhwbGljaXQgZnV0dXJlX2Vycm9yKGZ1dHVyZV9lcnJjIF9FdikgOiBsb2dpY19lcnJvcigpLCBfX2VjXyhtYWtlX2Vycm9yX2NvZGUoX0V2KSkge30KKyNlbmRpZgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdCBlcnJvcl9jb2RlJiBjb2RlKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX19lY187fQorCisgICAgdmlydHVhbCB+ZnV0dXJlX2Vycm9yKCkgX05PRVhDRVBUOworfTsKKworX0xJQkNQUF9OT1JFVFVSTiBpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworX0xJQkNQUF9BVkFJTEFCSUxJVFlfRlVUVVJFX0VSUk9SCisjZW5kaWYKK3ZvaWQgX190aHJvd19mdXR1cmVfZXJyb3IoZnV0dXJlX2VycmMgX0V2KQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0aHJvdyBmdXR1cmVfZXJyb3IobWFrZV9lcnJvcl9jb2RlKF9FdikpOworI2Vsc2UKKyAgICAoKHZvaWQpX0V2KTsKKyAgICBfVlNURDo6YWJvcnQoKTsKKyNlbmRpZgorfQorCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIF9MSUJDUFBfQVZBSUxBQklMSVRZX0ZVVFVSRSBfX2Fzc29jX3N1Yl9zdGF0ZQorICAgIDogcHVibGljIF9fc2hhcmVkX2NvdW50Cit7Citwcm90ZWN0ZWQ6CisgICAgZXhjZXB0aW9uX3B0ciBfX2V4Y2VwdGlvbl87CisgICAgbXV0YWJsZSBtdXRleCBfX211dF87CisgICAgbXV0YWJsZSBjb25kaXRpb25fdmFyaWFibGUgX19jdl87CisgICAgdW5zaWduZWQgX19zdGF0ZV87CisKKyAgICB2aXJ0dWFsIHZvaWQgX19vbl96ZXJvX3NoYXJlZCgpIF9OT0VYQ0VQVDsKKyAgICB2b2lkIF9fc3ViX3dhaXQodW5pcXVlX2xvY2s8bXV0ZXg+JiBfX2xrKTsKK3B1YmxpYzoKKyAgICBlbnVtCisgICAgeworICAgICAgICBfX2NvbnN0cnVjdGVkID0gMSwKKyAgICAgICAgX19mdXR1cmVfYXR0YWNoZWQgPSAyLAorICAgICAgICByZWFkeSA9IDQsCisgICAgICAgIGRlZmVycmVkID0gOAorICAgIH07CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19hc3NvY19zdWJfc3RhdGUoKSA6IF9fc3RhdGVfKDApIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBfX2hhc192YWx1ZSgpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gKF9fc3RhdGVfICYgX19jb25zdHJ1Y3RlZCkgfHwgKF9fZXhjZXB0aW9uXyAhPSBudWxscHRyKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX3NldF9mdXR1cmVfYXR0YWNoZWQoKQorICAgIHsKKyAgICAgICAgbG9ja19ndWFyZDxtdXRleD4gX19sayhfX211dF8pOworICAgICAgICBfX3N0YXRlXyB8PSBfX2Z1dHVyZV9hdHRhY2hlZDsKKyAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgX19oYXNfZnV0dXJlX2F0dGFjaGVkKCkgY29uc3Qge3JldHVybiAoX19zdGF0ZV8gJiBfX2Z1dHVyZV9hdHRhY2hlZCkgIT0gMDt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX3NldF9kZWZlcnJlZCgpIHtfX3N0YXRlXyB8PSBkZWZlcnJlZDt9CisKKyAgICB2b2lkIF9fbWFrZV9yZWFkeSgpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIF9faXNfcmVhZHkoKSBjb25zdCB7cmV0dXJuIChfX3N0YXRlXyAmIHJlYWR5KSAhPSAwO30KKworICAgIHZvaWQgc2V0X3ZhbHVlKCk7CisgICAgdm9pZCBzZXRfdmFsdWVfYXRfdGhyZWFkX2V4aXQoKTsKKworICAgIHZvaWQgc2V0X2V4Y2VwdGlvbihleGNlcHRpb25fcHRyIF9fcCk7CisgICAgdm9pZCBzZXRfZXhjZXB0aW9uX2F0X3RocmVhZF9leGl0KGV4Y2VwdGlvbl9wdHIgX19wKTsKKworICAgIHZvaWQgY29weSgpOworCisgICAgdm9pZCB3YWl0KCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CisgICAgICAgIGZ1dHVyZV9zdGF0dXMKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB3YWl0X2Zvcihjb25zdCBjaHJvbm86OmR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX3JlbF90aW1lKSBjb25zdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0Nsb2NrLCBjbGFzcyBfRHVyYXRpb24+CisgICAgICAgIF9MSUJDUFBfTUVUSE9EX1RFTVBMQVRFX0lNUExJQ0lUX0lOU1RBTlRJQVRJT05fVklTCisgICAgICAgIGZ1dHVyZV9zdGF0dXMKKyAgICAgICAgd2FpdF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX2Fic190aW1lKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBfX2V4ZWN1dGUoKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2xvY2ssIGNsYXNzIF9EdXJhdGlvbj4KK2Z1dHVyZV9zdGF0dXMKK19fYXNzb2Nfc3ViX3N0YXRlOjp3YWl0X3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYWJzX3RpbWUpIGNvbnN0Cit7CisgICAgdW5pcXVlX2xvY2s8bXV0ZXg+IF9fbGsoX19tdXRfKTsKKyAgICBpZiAoX19zdGF0ZV8gJiBkZWZlcnJlZCkKKyAgICAgICAgcmV0dXJuIGZ1dHVyZV9zdGF0dXM6OmRlZmVycmVkOworICAgIHdoaWxlICghKF9fc3RhdGVfICYgcmVhZHkpICYmIF9DbG9jazo6bm93KCkgPCBfX2Fic190aW1lKQorICAgICAgICBfX2N2Xy53YWl0X3VudGlsKF9fbGssIF9fYWJzX3RpbWUpOworICAgIGlmIChfX3N0YXRlXyAmIHJlYWR5KQorICAgICAgICByZXR1cm4gZnV0dXJlX3N0YXR1czo6cmVhZHk7CisgICAgcmV0dXJuIGZ1dHVyZV9zdGF0dXM6OnRpbWVvdXQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVwLCBjbGFzcyBfUGVyaW9kPgoraW5saW5lCitmdXR1cmVfc3RhdHVzCitfX2Fzc29jX3N1Yl9zdGF0ZTo6d2FpdF9mb3IoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19yZWxfdGltZSkgY29uc3QKK3sKKyAgICByZXR1cm4gd2FpdF91bnRpbChjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgKyBfX3JlbF90aW1lKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK2NsYXNzIF9MSUJDUFBfQVZBSUxBQklMSVRZX0ZVVFVSRSBfX2Fzc29jX3N0YXRlCisgICAgOiBwdWJsaWMgX19hc3NvY19zdWJfc3RhdGUKK3sKKyAgICB0eXBlZGVmIF9fYXNzb2Nfc3ViX3N0YXRlIGJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGlnbmVkX3N0b3JhZ2U8c2l6ZW9mKF9ScCksIGFsaWdubWVudF9vZjxfUnA+Ojp2YWx1ZT46OnR5cGUgX1VwOworcHJvdGVjdGVkOgorICAgIF9VcCBfX3ZhbHVlXzsKKworICAgIHZpcnR1YWwgdm9pZCBfX29uX3plcm9fc2hhcmVkKCkgX05PRVhDRVBUOworcHVibGljOgorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9Bcmc+CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisgICAgICAgIHZvaWQgc2V0X3ZhbHVlKF9BcmcmJiBfX2FyZyk7CisjZWxzZQorICAgICAgICB2b2lkIHNldF92YWx1ZShfQXJnJiBfX2FyZyk7CisjZW5kaWYKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQXJnPgorI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgICAgICB2b2lkIHNldF92YWx1ZV9hdF90aHJlYWRfZXhpdChfQXJnJiYgX19hcmcpOworI2Vsc2UKKyAgICAgICAgdm9pZCBzZXRfdmFsdWVfYXRfdGhyZWFkX2V4aXQoX0FyZyYgX19hcmcpOworI2VuZGlmCisKKyAgICBfUnAgbW92ZSgpOworICAgIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9ScD46OnR5cGUgY29weSgpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK3ZvaWQKK19fYXNzb2Nfc3RhdGU8X1JwPjo6X19vbl96ZXJvX3NoYXJlZCgpIF9OT0VYQ0VQVAoreworICAgIGlmICh0aGlzLT5fX3N0YXRlXyAmIGJhc2U6Ol9fY29uc3RydWN0ZWQpCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8X1JwKj4oJl9fdmFsdWVfKS0+fl9ScCgpOworICAgIGRlbGV0ZSB0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgordGVtcGxhdGUgPGNsYXNzIF9Bcmc+CitfTElCQ1BQX0FWQUlMQUJJTElUWV9GVVRVUkUKK3ZvaWQKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKK19fYXNzb2Nfc3RhdGU8X1JwPjo6c2V0X3ZhbHVlKF9BcmcmJiBfX2FyZykKKyNlbHNlCitfX2Fzc29jX3N0YXRlPF9ScD46OnNldF92YWx1ZShfQXJnJiBfX2FyZykKKyNlbmRpZgoreworICAgIHVuaXF1ZV9sb2NrPG11dGV4PiBfX2xrKHRoaXMtPl9fbXV0Xyk7CisgICAgaWYgKHRoaXMtPl9faGFzX3ZhbHVlKCkpCisgICAgICAgIF9fdGhyb3dfZnV0dXJlX2Vycm9yKGZ1dHVyZV9lcnJjOjpwcm9taXNlX2FscmVhZHlfc2F0aXNmaWVkKTsKKyAgICA6Om5ldygmX192YWx1ZV8pIF9ScChfVlNURDo6Zm9yd2FyZDxfQXJnPihfX2FyZykpOworICAgIHRoaXMtPl9fc3RhdGVfIHw9IGJhc2U6Ol9fY29uc3RydWN0ZWQgfCBiYXNlOjpyZWFkeTsKKyAgICBfX2N2Xy5ub3RpZnlfYWxsKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUnA+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0FyZz4KK3ZvaWQKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKK19fYXNzb2Nfc3RhdGU8X1JwPjo6c2V0X3ZhbHVlX2F0X3RocmVhZF9leGl0KF9BcmcmJiBfX2FyZykKKyNlbHNlCitfX2Fzc29jX3N0YXRlPF9ScD46OnNldF92YWx1ZV9hdF90aHJlYWRfZXhpdChfQXJnJiBfX2FyZykKKyNlbmRpZgoreworICAgIHVuaXF1ZV9sb2NrPG11dGV4PiBfX2xrKHRoaXMtPl9fbXV0Xyk7CisgICAgaWYgKHRoaXMtPl9faGFzX3ZhbHVlKCkpCisgICAgICAgIF9fdGhyb3dfZnV0dXJlX2Vycm9yKGZ1dHVyZV9lcnJjOjpwcm9taXNlX2FscmVhZHlfc2F0aXNmaWVkKTsKKyAgICA6Om5ldygmX192YWx1ZV8pIF9ScChfVlNURDo6Zm9yd2FyZDxfQXJnPihfX2FyZykpOworICAgIHRoaXMtPl9fc3RhdGVfIHw9IGJhc2U6Ol9fY29uc3RydWN0ZWQ7CisgICAgX190aHJlYWRfbG9jYWxfZGF0YSgpLT5fX21ha2VfcmVhZHlfYXRfdGhyZWFkX2V4aXQodGhpcyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUnA+CitfUnAKK19fYXNzb2Nfc3RhdGU8X1JwPjo6bW92ZSgpCit7CisgICAgdW5pcXVlX2xvY2s8bXV0ZXg+IF9fbGsodGhpcy0+X19tdXRfKTsKKyAgICB0aGlzLT5fX3N1Yl93YWl0KF9fbGspOworICAgIGlmICh0aGlzLT5fX2V4Y2VwdGlvbl8gIT0gbnVsbHB0cikKKyAgICAgICAgcmV0aHJvd19leGNlcHRpb24odGhpcy0+X19leGNlcHRpb25fKTsKKyAgICByZXR1cm4gX1ZTVEQ6Om1vdmUoKnJlaW50ZXJwcmV0X2Nhc3Q8X1JwKj4oJl9fdmFsdWVfKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUnA+Cit0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfUnA+Ojp0eXBlCitfX2Fzc29jX3N0YXRlPF9ScD46OmNvcHkoKQoreworICAgIHVuaXF1ZV9sb2NrPG11dGV4PiBfX2xrKHRoaXMtPl9fbXV0Xyk7CisgICAgdGhpcy0+X19zdWJfd2FpdChfX2xrKTsKKyAgICBpZiAodGhpcy0+X19leGNlcHRpb25fICE9IG51bGxwdHIpCisgICAgICAgIHJldGhyb3dfZXhjZXB0aW9uKHRoaXMtPl9fZXhjZXB0aW9uXyk7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PF9ScCo+KCZfX3ZhbHVlXyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUnA+CitjbGFzcyBfTElCQ1BQX0FWQUlMQUJJTElUWV9GVVRVUkUgX19hc3NvY19zdGF0ZTxfUnAmPgorICAgIDogcHVibGljIF9fYXNzb2Nfc3ViX3N0YXRlCit7CisgICAgdHlwZWRlZiBfX2Fzc29jX3N1Yl9zdGF0ZSBiYXNlOworICAgIHR5cGVkZWYgX1JwKiBfVXA7Citwcm90ZWN0ZWQ6CisgICAgX1VwIF9fdmFsdWVfOworCisgICAgdmlydHVhbCB2b2lkIF9fb25femVyb19zaGFyZWQoKSBfTk9FWENFUFQ7CitwdWJsaWM6CisKKyAgICB2b2lkIHNldF92YWx1ZShfUnAmIF9fYXJnKTsKKyAgICB2b2lkIHNldF92YWx1ZV9hdF90aHJlYWRfZXhpdChfUnAmIF9fYXJnKTsKKworICAgIF9ScCYgY29weSgpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK3ZvaWQKK19fYXNzb2Nfc3RhdGU8X1JwJj46Ol9fb25femVyb19zaGFyZWQoKSBfTk9FWENFUFQKK3sKKyAgICBkZWxldGUgdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK3ZvaWQKK19fYXNzb2Nfc3RhdGU8X1JwJj46OnNldF92YWx1ZShfUnAmIF9fYXJnKQoreworICAgIHVuaXF1ZV9sb2NrPG11dGV4PiBfX2xrKHRoaXMtPl9fbXV0Xyk7CisgICAgaWYgKHRoaXMtPl9faGFzX3ZhbHVlKCkpCisgICAgICAgIF9fdGhyb3dfZnV0dXJlX2Vycm9yKGZ1dHVyZV9lcnJjOjpwcm9taXNlX2FscmVhZHlfc2F0aXNmaWVkKTsKKyAgICBfX3ZhbHVlXyA9IF9WU1REOjphZGRyZXNzb2YoX19hcmcpOworICAgIHRoaXMtPl9fc3RhdGVfIHw9IGJhc2U6Ol9fY29uc3RydWN0ZWQgfCBiYXNlOjpyZWFkeTsKKyAgICBfX2N2Xy5ub3RpZnlfYWxsKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUnA+Cit2b2lkCitfX2Fzc29jX3N0YXRlPF9ScCY+OjpzZXRfdmFsdWVfYXRfdGhyZWFkX2V4aXQoX1JwJiBfX2FyZykKK3sKKyAgICB1bmlxdWVfbG9jazxtdXRleD4gX19sayh0aGlzLT5fX211dF8pOworICAgIGlmICh0aGlzLT5fX2hhc192YWx1ZSgpKQorICAgICAgICBfX3Rocm93X2Z1dHVyZV9lcnJvcihmdXR1cmVfZXJyYzo6cHJvbWlzZV9hbHJlYWR5X3NhdGlzZmllZCk7CisgICAgX192YWx1ZV8gPSBfVlNURDo6YWRkcmVzc29mKF9fYXJnKTsKKyAgICB0aGlzLT5fX3N0YXRlXyB8PSBiYXNlOjpfX2NvbnN0cnVjdGVkOworICAgIF9fdGhyZWFkX2xvY2FsX2RhdGEoKS0+X19tYWtlX3JlYWR5X2F0X3RocmVhZF9leGl0KHRoaXMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgorX1JwJgorX19hc3NvY19zdGF0ZTxfUnAmPjo6Y29weSgpCit7CisgICAgdW5pcXVlX2xvY2s8bXV0ZXg+IF9fbGsodGhpcy0+X19tdXRfKTsKKyAgICB0aGlzLT5fX3N1Yl93YWl0KF9fbGspOworICAgIGlmICh0aGlzLT5fX2V4Y2VwdGlvbl8gIT0gbnVsbHB0cikKKyAgICAgICAgcmV0aHJvd19leGNlcHRpb24odGhpcy0+X19leGNlcHRpb25fKTsKKyAgICByZXR1cm4gKl9fdmFsdWVfOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQWxsb2M+CitjbGFzcyBfTElCQ1BQX0FWQUlMQUJJTElUWV9GVVRVUkUgX19hc3NvY19zdGF0ZV9hbGxvYworICAgIDogcHVibGljIF9fYXNzb2Nfc3RhdGU8X1JwPgoreworICAgIHR5cGVkZWYgX19hc3NvY19zdGF0ZTxfUnA+IGJhc2U7CisgICAgX0FsbG9jIF9fYWxsb2NfOworCisgICAgdmlydHVhbCB2b2lkIF9fb25femVyb19zaGFyZWQoKSBfTk9FWENFUFQ7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9fYXNzb2Nfc3RhdGVfYWxsb2MoY29uc3QgX0FsbG9jJiBfX2EpCisgICAgICAgIDogX19hbGxvY18oX19hKSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0FsbG9jPgordm9pZAorX19hc3NvY19zdGF0ZV9hbGxvYzxfUnAsIF9BbGxvYz46Ol9fb25femVyb19zaGFyZWQoKSBfTk9FWENFUFQKK3sKKyAgICBpZiAodGhpcy0+X19zdGF0ZV8gJiBiYXNlOjpfX2NvbnN0cnVjdGVkKQorICAgICAgICByZWludGVycHJldF9jYXN0PF9ScCo+KF9WU1REOjphZGRyZXNzb2YodGhpcy0+X192YWx1ZV8pKS0+fl9ScCgpOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY2F0b3JfdHJhaXRzX3JlYmluZDxfQWxsb2MsIF9fYXNzb2Nfc3RhdGVfYWxsb2M+Ojp0eXBlIF9BbDsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X0FsPiBfQVRyYWl0czsKKyAgICB0eXBlZGVmIHBvaW50ZXJfdHJhaXRzPHR5cGVuYW1lIF9BVHJhaXRzOjpwb2ludGVyPiBfUFRyYWl0czsKKyAgICBfQWwgX19hKF9fYWxsb2NfKTsKKyAgICB0aGlzLT5+X19hc3NvY19zdGF0ZV9hbGxvYygpOworICAgIF9fYS5kZWFsbG9jYXRlKF9QVHJhaXRzOjpwb2ludGVyX3RvKCp0aGlzKSwgMSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9BbGxvYz4KK2NsYXNzIF9MSUJDUFBfQVZBSUxBQklMSVRZX0ZVVFVSRSBfX2Fzc29jX3N0YXRlX2FsbG9jPF9ScCYsIF9BbGxvYz4KKyAgICA6IHB1YmxpYyBfX2Fzc29jX3N0YXRlPF9ScCY+Cit7CisgICAgdHlwZWRlZiBfX2Fzc29jX3N0YXRlPF9ScCY+IGJhc2U7CisgICAgX0FsbG9jIF9fYWxsb2NfOworCisgICAgdmlydHVhbCB2b2lkIF9fb25femVyb19zaGFyZWQoKSBfTk9FWENFUFQ7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9fYXNzb2Nfc3RhdGVfYWxsb2MoY29uc3QgX0FsbG9jJiBfX2EpCisgICAgICAgIDogX19hbGxvY18oX19hKSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0FsbG9jPgordm9pZAorX19hc3NvY19zdGF0ZV9hbGxvYzxfUnAmLCBfQWxsb2M+OjpfX29uX3plcm9fc2hhcmVkKCkgX05PRVhDRVBUCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2FsbG9jYXRvcl90cmFpdHNfcmViaW5kPF9BbGxvYywgX19hc3NvY19zdGF0ZV9hbGxvYz46OnR5cGUgX0FsOworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfQWw+IF9BVHJhaXRzOworICAgIHR5cGVkZWYgcG9pbnRlcl90cmFpdHM8dHlwZW5hbWUgX0FUcmFpdHM6OnBvaW50ZXI+IF9QVHJhaXRzOworICAgIF9BbCBfX2EoX19hbGxvY18pOworICAgIHRoaXMtPn5fX2Fzc29jX3N0YXRlX2FsbG9jKCk7CisgICAgX19hLmRlYWxsb2NhdGUoX1BUcmFpdHM6OnBvaW50ZXJfdG8oKnRoaXMpLCAxKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK2NsYXNzIF9MSUJDUFBfQVZBSUxBQklMSVRZX0ZVVFVSRSBfX2Fzc29jX3N1Yl9zdGF0ZV9hbGxvYworICAgIDogcHVibGljIF9fYXNzb2Nfc3ViX3N0YXRlCit7CisgICAgdHlwZWRlZiBfX2Fzc29jX3N1Yl9zdGF0ZSBiYXNlOworICAgIF9BbGxvYyBfX2FsbG9jXzsKKworICAgIHZpcnR1YWwgdm9pZCBfX29uX3plcm9fc2hhcmVkKCkgX05PRVhDRVBUOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2Fzc29jX3N1Yl9zdGF0ZV9hbGxvYyhjb25zdCBfQWxsb2MmIF9fYSkKKyAgICAgICAgOiBfX2FsbG9jXyhfX2EpIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgordm9pZAorX19hc3NvY19zdWJfc3RhdGVfYWxsb2M8X0FsbG9jPjo6X19vbl96ZXJvX3NoYXJlZCgpIF9OT0VYQ0VQVAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY2F0b3JfdHJhaXRzX3JlYmluZDxfQWxsb2MsIF9fYXNzb2Nfc3ViX3N0YXRlX2FsbG9jPjo6dHlwZSBfQWw7CisgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPF9BbD4gX0FUcmFpdHM7CisgICAgdHlwZWRlZiBwb2ludGVyX3RyYWl0czx0eXBlbmFtZSBfQVRyYWl0czo6cG9pbnRlcj4gX1BUcmFpdHM7CisgICAgX0FsIF9fYShfX2FsbG9jXyk7CisgICAgdGhpcy0+fl9fYXNzb2Nfc3ViX3N0YXRlX2FsbG9jKCk7CisgICAgX19hLmRlYWxsb2NhdGUoX1BUcmFpdHM6OnBvaW50ZXJfdG8oKnRoaXMpLCAxKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0ZwPgorY2xhc3MgX0xJQkNQUF9BVkFJTEFCSUxJVFlfRlVUVVJFIF9fZGVmZXJyZWRfYXNzb2Nfc3RhdGUKKyAgICA6IHB1YmxpYyBfX2Fzc29jX3N0YXRlPF9ScD4KK3sKKyAgICB0eXBlZGVmIF9fYXNzb2Nfc3RhdGU8X1JwPiBiYXNlOworCisgICAgX0ZwIF9fZnVuY187CisKK3B1YmxpYzoKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19kZWZlcnJlZF9hc3NvY19zdGF0ZShfRnAmJiBfX2YpOworI2VuZGlmCisKKyAgICB2aXJ0dWFsIHZvaWQgX19leGVjdXRlKCk7Cit9OworCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9GcD4KK2lubGluZQorX19kZWZlcnJlZF9hc3NvY19zdGF0ZTxfUnAsIF9GcD46Ol9fZGVmZXJyZWRfYXNzb2Nfc3RhdGUoX0ZwJiYgX19mKQorICAgIDogX19mdW5jXyhfVlNURDo6Zm9yd2FyZDxfRnA+KF9fZikpCit7CisgICAgdGhpcy0+X19zZXRfZGVmZXJyZWQoKTsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfRnA+Cit2b2lkCitfX2RlZmVycmVkX2Fzc29jX3N0YXRlPF9ScCwgX0ZwPjo6X19leGVjdXRlKCkKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgdGhpcy0+c2V0X3ZhbHVlKF9fZnVuY18oKSk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2V0X2V4Y2VwdGlvbihjdXJyZW50X2V4Y2VwdGlvbigpKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwPgorY2xhc3MgX0xJQkNQUF9BVkFJTEFCSUxJVFlfRlVUVVJFIF9fZGVmZXJyZWRfYXNzb2Nfc3RhdGU8dm9pZCwgX0ZwPgorICAgIDogcHVibGljIF9fYXNzb2Nfc3ViX3N0YXRlCit7CisgICAgdHlwZWRlZiBfX2Fzc29jX3N1Yl9zdGF0ZSBiYXNlOworCisgICAgX0ZwIF9fZnVuY187CisKK3B1YmxpYzoKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19kZWZlcnJlZF9hc3NvY19zdGF0ZShfRnAmJiBfX2YpOworI2VuZGlmCisKKyAgICB2aXJ0dWFsIHZvaWQgX19leGVjdXRlKCk7Cit9OworCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKK3RlbXBsYXRlIDxjbGFzcyBfRnA+CitpbmxpbmUKK19fZGVmZXJyZWRfYXNzb2Nfc3RhdGU8dm9pZCwgX0ZwPjo6X19kZWZlcnJlZF9hc3NvY19zdGF0ZShfRnAmJiBfX2YpCisgICAgOiBfX2Z1bmNfKF9WU1REOjpmb3J3YXJkPF9GcD4oX19mKSkKK3sKKyAgICB0aGlzLT5fX3NldF9kZWZlcnJlZCgpOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKK3RlbXBsYXRlIDxjbGFzcyBfRnA+Cit2b2lkCitfX2RlZmVycmVkX2Fzc29jX3N0YXRlPHZvaWQsIF9GcD46Ol9fZXhlY3V0ZSgpCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIF9fZnVuY18oKTsKKyAgICAgICAgdGhpcy0+c2V0X3ZhbHVlKCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2V0X2V4Y2VwdGlvbihjdXJyZW50X2V4Y2VwdGlvbigpKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfRnA+CitjbGFzcyBfTElCQ1BQX0FWQUlMQUJJTElUWV9GVVRVUkUgX19hc3luY19hc3NvY19zdGF0ZQorICAgIDogcHVibGljIF9fYXNzb2Nfc3RhdGU8X1JwPgoreworICAgIHR5cGVkZWYgX19hc3NvY19zdGF0ZTxfUnA+IGJhc2U7CisKKyAgICBfRnAgX19mdW5jXzsKKworICAgIHZpcnR1YWwgdm9pZCBfX29uX3plcm9fc2hhcmVkKCkgX05PRVhDRVBUOworcHVibGljOgorI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2FzeW5jX2Fzc29jX3N0YXRlKF9GcCYmIF9fZik7CisjZW5kaWYKKworICAgIHZpcnR1YWwgdm9pZCBfX2V4ZWN1dGUoKTsKK307CisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0ZwPgoraW5saW5lCitfX2FzeW5jX2Fzc29jX3N0YXRlPF9ScCwgX0ZwPjo6X19hc3luY19hc3NvY19zdGF0ZShfRnAmJiBfX2YpCisgICAgOiBfX2Z1bmNfKF9WU1REOjpmb3J3YXJkPF9GcD4oX19mKSkKK3sKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfRnA+Cit2b2lkCitfX2FzeW5jX2Fzc29jX3N0YXRlPF9ScCwgX0ZwPjo6X19leGVjdXRlKCkKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgdGhpcy0+c2V0X3ZhbHVlKF9fZnVuY18oKSk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2V0X2V4Y2VwdGlvbihjdXJyZW50X2V4Y2VwdGlvbigpKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfRnA+Cit2b2lkCitfX2FzeW5jX2Fzc29jX3N0YXRlPF9ScCwgX0ZwPjo6X19vbl96ZXJvX3NoYXJlZCgpIF9OT0VYQ0VQVAoreworICAgIHRoaXMtPndhaXQoKTsKKyAgICBiYXNlOjpfX29uX3plcm9fc2hhcmVkKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRnA+CitjbGFzcyBfTElCQ1BQX0FWQUlMQUJJTElUWV9GVVRVUkUgX19hc3luY19hc3NvY19zdGF0ZTx2b2lkLCBfRnA+CisgICAgOiBwdWJsaWMgX19hc3NvY19zdWJfc3RhdGUKK3sKKyAgICB0eXBlZGVmIF9fYXNzb2Nfc3ViX3N0YXRlIGJhc2U7CisKKyAgICBfRnAgX19mdW5jXzsKKworICAgIHZpcnR1YWwgdm9pZCBfX29uX3plcm9fc2hhcmVkKCkgX05PRVhDRVBUOworcHVibGljOgorI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2FzeW5jX2Fzc29jX3N0YXRlKF9GcCYmIF9fZik7CisjZW5kaWYKKworICAgIHZpcnR1YWwgdm9pZCBfX2V4ZWN1dGUoKTsKK307CisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKwordGVtcGxhdGUgPGNsYXNzIF9GcD4KK2lubGluZQorX19hc3luY19hc3NvY19zdGF0ZTx2b2lkLCBfRnA+OjpfX2FzeW5jX2Fzc29jX3N0YXRlKF9GcCYmIF9fZikKKyAgICA6IF9fZnVuY18oX1ZTVEQ6OmZvcndhcmQ8X0ZwPihfX2YpKQoreworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKK3RlbXBsYXRlIDxjbGFzcyBfRnA+Cit2b2lkCitfX2FzeW5jX2Fzc29jX3N0YXRlPHZvaWQsIF9GcD46Ol9fZXhlY3V0ZSgpCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIF9fZnVuY18oKTsKKyAgICAgICAgdGhpcy0+c2V0X3ZhbHVlKCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2V0X2V4Y2VwdGlvbihjdXJyZW50X2V4Y2VwdGlvbigpKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwPgordm9pZAorX19hc3luY19hc3NvY19zdGF0ZTx2b2lkLCBfRnA+OjpfX29uX3plcm9fc2hhcmVkKCkgX05PRVhDRVBUCit7CisgICAgdGhpcy0+d2FpdCgpOworICAgIGJhc2U6Ol9fb25femVyb19zaGFyZWQoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9ScD4gY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgcHJvbWlzZTsKK3RlbXBsYXRlIDxjbGFzcyBfUnA+IGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHNoYXJlZF9mdXR1cmU7CisKKy8vIGZ1dHVyZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPiBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBmdXR1cmU7CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9GcD4KK2Z1dHVyZTxfUnA+CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCitfX21ha2VfZGVmZXJyZWRfYXNzb2Nfc3RhdGUoX0ZwJiYgX19mKTsKKyNlbHNlCitfX21ha2VfZGVmZXJyZWRfYXNzb2Nfc3RhdGUoX0ZwIF9fZik7CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0ZwPgorZnV0dXJlPF9ScD4KKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKK19fbWFrZV9hc3luY19hc3NvY19zdGF0ZShfRnAmJiBfX2YpOworI2Vsc2UKK19fbWFrZV9hc3luY19hc3NvY19zdGF0ZShfRnAgX19mKTsKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX0xJQkNQUF9BVkFJTEFCSUxJVFlfRlVUVVJFIGZ1dHVyZQoreworICAgIF9fYXNzb2Nfc3RhdGU8X1JwPiogX19zdGF0ZV87CisKKyAgICBleHBsaWNpdCBmdXR1cmUoX19hc3NvY19zdGF0ZTxfUnA+KiBfX3N0YXRlKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIHByb21pc2U7CisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3Mgc2hhcmVkX2Z1dHVyZTsKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgIHRlbXBsYXRlIDxjbGFzcyBfUjEsIGNsYXNzIF9GcD4KKyAgICAgICAgZnJpZW5kIGZ1dHVyZTxfUjE+IF9fbWFrZV9kZWZlcnJlZF9hc3NvY19zdGF0ZShfRnAmJiBfX2YpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfUjEsIGNsYXNzIF9GcD4KKyAgICAgICAgZnJpZW5kIGZ1dHVyZTxfUjE+IF9fbWFrZV9hc3luY19hc3NvY19zdGF0ZShfRnAmJiBfX2YpOworI2Vsc2UKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfRnA+CisgICAgICAgIGZyaWVuZCBmdXR1cmU8X1IxPiBfX21ha2VfZGVmZXJyZWRfYXNzb2Nfc3RhdGUoX0ZwIF9fZik7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX0ZwPgorICAgICAgICBmcmllbmQgZnV0dXJlPF9SMT4gX19tYWtlX2FzeW5jX2Fzc29jX3N0YXRlKF9GcCBfX2YpOworI2VuZGlmCisKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZnV0dXJlKCkgX05PRVhDRVBUIDogX19zdGF0ZV8obnVsbHB0cikge30KKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZnV0dXJlKGZ1dHVyZSYmIF9fcmhzKSBfTk9FWENFUFQKKyAgICAgICAgOiBfX3N0YXRlXyhfX3Jocy5fX3N0YXRlXykge19fcmhzLl9fc3RhdGVfID0gbnVsbHB0cjt9CisgICAgZnV0dXJlKGNvbnN0IGZ1dHVyZSYpID0gZGVsZXRlOworICAgIGZ1dHVyZSYgb3BlcmF0b3I9KGNvbnN0IGZ1dHVyZSYpID0gZGVsZXRlOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBmdXR1cmUmIG9wZXJhdG9yPShmdXR1cmUmJiBfX3JocykgX05PRVhDRVBUCisgICAgICAgIHsKKyAgICAgICAgICAgIGZ1dHVyZShzdGQ6Om1vdmUoX19yaHMpKS5zd2FwKCp0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorI2Vsc2UgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCitwcml2YXRlOgorICAgIGZ1dHVyZShjb25zdCBmdXR1cmUmKTsKKyAgICBmdXR1cmUmIG9wZXJhdG9yPShjb25zdCBmdXR1cmUmKTsKK3B1YmxpYzoKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICB+ZnV0dXJlKCk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNoYXJlZF9mdXR1cmU8X1JwPiBzaGFyZSgpIF9OT0VYQ0VQVDsKKworICAgIC8vIHJldHJpZXZpbmcgdGhlIHZhbHVlCisgICAgX1JwIGdldCgpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc3dhcChmdXR1cmUmIF9fcmhzKSBfTk9FWENFUFQge19WU1REOjpzd2FwKF9fc3RhdGVfLCBfX3Jocy5fX3N0YXRlXyk7fQorCisgICAgLy8gZnVuY3Rpb25zIHRvIGNoZWNrIHN0YXRlCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgdmFsaWQoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3N0YXRlXyAhPSBudWxscHRyO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHdhaXQoKSBjb25zdCB7X19zdGF0ZV8tPndhaXQoKTt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZnV0dXJlX3N0YXR1cworICAgICAgICB3YWl0X2Zvcihjb25zdCBjaHJvbm86OmR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX3JlbF90aW1lKSBjb25zdAorICAgICAgICAgICAge3JldHVybiBfX3N0YXRlXy0+d2FpdF9mb3IoX19yZWxfdGltZSk7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2xvY2ssIGNsYXNzIF9EdXJhdGlvbj4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBmdXR1cmVfc3RhdHVzCisgICAgICAgIHdhaXRfdW50aWwoY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX19hYnNfdGltZSkgY29uc3QKKyAgICAgICAgICAgIHtyZXR1cm4gX19zdGF0ZV8tPndhaXRfdW50aWwoX19hYnNfdGltZSk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK2Z1dHVyZTxfUnA+OjpmdXR1cmUoX19hc3NvY19zdGF0ZTxfUnA+KiBfX3N0YXRlKQorICAgIDogX19zdGF0ZV8oX19zdGF0ZSkKK3sKKyAgICBpZiAoX19zdGF0ZV8tPl9faGFzX2Z1dHVyZV9hdHRhY2hlZCgpKQorICAgICAgICBfX3Rocm93X2Z1dHVyZV9lcnJvcihmdXR1cmVfZXJyYzo6ZnV0dXJlX2FscmVhZHlfcmV0cmlldmVkKTsKKyAgICBfX3N0YXRlXy0+X19hZGRfc2hhcmVkKCk7CisgICAgX19zdGF0ZV8tPl9fc2V0X2Z1dHVyZV9hdHRhY2hlZCgpOworfQorCitzdHJ1Y3QgX19yZWxlYXNlX3NoYXJlZF9jb3VudAoreworICAgIHZvaWQgb3BlcmF0b3IoKShfX3NoYXJlZF9jb3VudCogcCkge3AtPl9fcmVsZWFzZV9zaGFyZWQoKTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgorZnV0dXJlPF9ScD46On5mdXR1cmUoKQoreworICAgIGlmIChfX3N0YXRlXykKKyAgICAgICAgX19zdGF0ZV8tPl9fcmVsZWFzZV9zaGFyZWQoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK19ScAorZnV0dXJlPF9ScD46OmdldCgpCit7CisgICAgdW5pcXVlX3B0cjxfX3NoYXJlZF9jb3VudCwgX19yZWxlYXNlX3NoYXJlZF9jb3VudD4gX18oX19zdGF0ZV8pOworICAgIF9fYXNzb2Nfc3RhdGU8X1JwPiogX19zID0gX19zdGF0ZV87CisgICAgX19zdGF0ZV8gPSBudWxscHRyOworICAgIHJldHVybiBfX3MtPm1vdmUoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9MSUJDUFBfQVZBSUxBQklMSVRZX0ZVVFVSRSBmdXR1cmU8X1JwJj4KK3sKKyAgICBfX2Fzc29jX3N0YXRlPF9ScCY+KiBfX3N0YXRlXzsKKworICAgIGV4cGxpY2l0IGZ1dHVyZShfX2Fzc29jX3N0YXRlPF9ScCY+KiBfX3N0YXRlKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIHByb21pc2U7CisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3Mgc2hhcmVkX2Z1dHVyZTsKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgIHRlbXBsYXRlIDxjbGFzcyBfUjEsIGNsYXNzIF9GcD4KKyAgICAgICAgZnJpZW5kIGZ1dHVyZTxfUjE+IF9fbWFrZV9kZWZlcnJlZF9hc3NvY19zdGF0ZShfRnAmJiBfX2YpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfUjEsIGNsYXNzIF9GcD4KKyAgICAgICAgZnJpZW5kIGZ1dHVyZTxfUjE+IF9fbWFrZV9hc3luY19hc3NvY19zdGF0ZShfRnAmJiBfX2YpOworI2Vsc2UKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfRnA+CisgICAgICAgIGZyaWVuZCBmdXR1cmU8X1IxPiBfX21ha2VfZGVmZXJyZWRfYXNzb2Nfc3RhdGUoX0ZwIF9fZik7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX0ZwPgorICAgICAgICBmcmllbmQgZnV0dXJlPF9SMT4gX19tYWtlX2FzeW5jX2Fzc29jX3N0YXRlKF9GcCBfX2YpOworI2VuZGlmCisKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZnV0dXJlKCkgX05PRVhDRVBUIDogX19zdGF0ZV8obnVsbHB0cikge30KKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZnV0dXJlKGZ1dHVyZSYmIF9fcmhzKSBfTk9FWENFUFQKKyAgICAgICAgOiBfX3N0YXRlXyhfX3Jocy5fX3N0YXRlXykge19fcmhzLl9fc3RhdGVfID0gbnVsbHB0cjt9CisgICAgZnV0dXJlKGNvbnN0IGZ1dHVyZSYpID0gZGVsZXRlOworICAgIGZ1dHVyZSYgb3BlcmF0b3I9KGNvbnN0IGZ1dHVyZSYpID0gZGVsZXRlOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBmdXR1cmUmIG9wZXJhdG9yPShmdXR1cmUmJiBfX3JocykgX05PRVhDRVBUCisgICAgICAgIHsKKyAgICAgICAgICAgIGZ1dHVyZShzdGQ6Om1vdmUoX19yaHMpKS5zd2FwKCp0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorI2Vsc2UgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCitwcml2YXRlOgorICAgIGZ1dHVyZShjb25zdCBmdXR1cmUmKTsKKyAgICBmdXR1cmUmIG9wZXJhdG9yPShjb25zdCBmdXR1cmUmKTsKK3B1YmxpYzoKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICB+ZnV0dXJlKCk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNoYXJlZF9mdXR1cmU8X1JwJj4gc2hhcmUoKSBfTk9FWENFUFQ7CisKKyAgICAvLyByZXRyaWV2aW5nIHRoZSB2YWx1ZQorICAgIF9ScCYgZ2V0KCk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKGZ1dHVyZSYgX19yaHMpIF9OT0VYQ0VQVCB7X1ZTVEQ6OnN3YXAoX19zdGF0ZV8sIF9fcmhzLl9fc3RhdGVfKTt9CisKKyAgICAvLyBmdW5jdGlvbnMgdG8gY2hlY2sgc3RhdGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCB2YWxpZCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fc3RhdGVfICE9IG51bGxwdHI7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgd2FpdCgpIGNvbnN0IHtfX3N0YXRlXy0+d2FpdCgpO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1JlcCwgY2xhc3MgX1BlcmlvZD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBmdXR1cmVfc3RhdHVzCisgICAgICAgIHdhaXRfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcmVsX3RpbWUpIGNvbnN0CisgICAgICAgICAgICB7cmV0dXJuIF9fc3RhdGVfLT53YWl0X2ZvcihfX3JlbF90aW1lKTt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGZ1dHVyZV9zdGF0dXMKKyAgICAgICAgd2FpdF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX2Fic190aW1lKSBjb25zdAorICAgICAgICAgICAge3JldHVybiBfX3N0YXRlXy0+d2FpdF91bnRpbChfX2Fic190aW1lKTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgorZnV0dXJlPF9ScCY+OjpmdXR1cmUoX19hc3NvY19zdGF0ZTxfUnAmPiogX19zdGF0ZSkKKyAgICA6IF9fc3RhdGVfKF9fc3RhdGUpCit7CisgICAgaWYgKF9fc3RhdGVfLT5fX2hhc19mdXR1cmVfYXR0YWNoZWQoKSkKKyAgICAgICAgX190aHJvd19mdXR1cmVfZXJyb3IoZnV0dXJlX2VycmM6OmZ1dHVyZV9hbHJlYWR5X3JldHJpZXZlZCk7CisgICAgX19zdGF0ZV8tPl9fYWRkX3NoYXJlZCgpOworICAgIF9fc3RhdGVfLT5fX3NldF9mdXR1cmVfYXR0YWNoZWQoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK2Z1dHVyZTxfUnAmPjo6fmZ1dHVyZSgpCit7CisgICAgaWYgKF9fc3RhdGVfKQorICAgICAgICBfX3N0YXRlXy0+X19yZWxlYXNlX3NoYXJlZCgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgorX1JwJgorZnV0dXJlPF9ScCY+OjpnZXQoKQoreworICAgIHVuaXF1ZV9wdHI8X19zaGFyZWRfY291bnQsIF9fcmVsZWFzZV9zaGFyZWRfY291bnQ+IF9fKF9fc3RhdGVfKTsKKyAgICBfX2Fzc29jX3N0YXRlPF9ScCY+KiBfX3MgPSBfX3N0YXRlXzsKKyAgICBfX3N0YXRlXyA9IG51bGxwdHI7CisgICAgcmV0dXJuIF9fcy0+Y29weSgpOworfQorCit0ZW1wbGF0ZSA8PgorY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBfTElCQ1BQX0FWQUlMQUJJTElUWV9GVVRVUkUgZnV0dXJlPHZvaWQ+Cit7CisgICAgX19hc3NvY19zdWJfc3RhdGUqIF9fc3RhdGVfOworCisgICAgZXhwbGljaXQgZnV0dXJlKF9fYXNzb2Nfc3ViX3N0YXRlKiBfX3N0YXRlKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIHByb21pc2U7CisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3Mgc2hhcmVkX2Z1dHVyZTsKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgIHRlbXBsYXRlIDxjbGFzcyBfUjEsIGNsYXNzIF9GcD4KKyAgICAgICAgZnJpZW5kIGZ1dHVyZTxfUjE+IF9fbWFrZV9kZWZlcnJlZF9hc3NvY19zdGF0ZShfRnAmJiBfX2YpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfUjEsIGNsYXNzIF9GcD4KKyAgICAgICAgZnJpZW5kIGZ1dHVyZTxfUjE+IF9fbWFrZV9hc3luY19hc3NvY19zdGF0ZShfRnAmJiBfX2YpOworI2Vsc2UKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfRnA+CisgICAgICAgIGZyaWVuZCBmdXR1cmU8X1IxPiBfX21ha2VfZGVmZXJyZWRfYXNzb2Nfc3RhdGUoX0ZwIF9fZik7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX0ZwPgorICAgICAgICBmcmllbmQgZnV0dXJlPF9SMT4gX19tYWtlX2FzeW5jX2Fzc29jX3N0YXRlKF9GcCBfX2YpOworI2VuZGlmCisKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZnV0dXJlKCkgX05PRVhDRVBUIDogX19zdGF0ZV8obnVsbHB0cikge30KKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZnV0dXJlKGZ1dHVyZSYmIF9fcmhzKSBfTk9FWENFUFQKKyAgICAgICAgOiBfX3N0YXRlXyhfX3Jocy5fX3N0YXRlXykge19fcmhzLl9fc3RhdGVfID0gbnVsbHB0cjt9CisgICAgZnV0dXJlKGNvbnN0IGZ1dHVyZSYpID0gZGVsZXRlOworICAgIGZ1dHVyZSYgb3BlcmF0b3I9KGNvbnN0IGZ1dHVyZSYpID0gZGVsZXRlOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBmdXR1cmUmIG9wZXJhdG9yPShmdXR1cmUmJiBfX3JocykgX05PRVhDRVBUCisgICAgICAgIHsKKyAgICAgICAgICAgIGZ1dHVyZShzdGQ6Om1vdmUoX19yaHMpKS5zd2FwKCp0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorI2Vsc2UgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCitwcml2YXRlOgorICAgIGZ1dHVyZShjb25zdCBmdXR1cmUmKTsKKyAgICBmdXR1cmUmIG9wZXJhdG9yPShjb25zdCBmdXR1cmUmKTsKK3B1YmxpYzoKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICB+ZnV0dXJlKCk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNoYXJlZF9mdXR1cmU8dm9pZD4gc2hhcmUoKSBfTk9FWENFUFQ7CisKKyAgICAvLyByZXRyaWV2aW5nIHRoZSB2YWx1ZQorICAgIHZvaWQgZ2V0KCk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKGZ1dHVyZSYgX19yaHMpIF9OT0VYQ0VQVCB7X1ZTVEQ6OnN3YXAoX19zdGF0ZV8sIF9fcmhzLl9fc3RhdGVfKTt9CisKKyAgICAvLyBmdW5jdGlvbnMgdG8gY2hlY2sgc3RhdGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCB2YWxpZCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fc3RhdGVfICE9IG51bGxwdHI7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgd2FpdCgpIGNvbnN0IHtfX3N0YXRlXy0+d2FpdCgpO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1JlcCwgY2xhc3MgX1BlcmlvZD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBmdXR1cmVfc3RhdHVzCisgICAgICAgIHdhaXRfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcmVsX3RpbWUpIGNvbnN0CisgICAgICAgICAgICB7cmV0dXJuIF9fc3RhdGVfLT53YWl0X2ZvcihfX3JlbF90aW1lKTt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGZ1dHVyZV9zdGF0dXMKKyAgICAgICAgd2FpdF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX2Fic190aW1lKSBjb25zdAorICAgICAgICAgICAge3JldHVybiBfX3N0YXRlXy0+d2FpdF91bnRpbChfX2Fic190aW1lKTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3N3YXAoZnV0dXJlPF9ScD4mIF9feCwgZnV0dXJlPF9ScD4mIF9feSkgX05PRVhDRVBUCit7CisgICAgX194LnN3YXAoX195KTsKK30KKworLy8gcHJvbWlzZTxSPgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NhbGxhYmxlPiBjbGFzcyBwYWNrYWdlZF90YXNrOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX0xJQkNQUF9BVkFJTEFCSUxJVFlfRlVUVVJFIHByb21pc2UKK3sKKyAgICBfX2Fzc29jX3N0YXRlPF9ScD4qIF9fc3RhdGVfOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IHByb21pc2UobnVsbHB0cl90KSBfTk9FWENFUFQgOiBfX3N0YXRlXyhudWxscHRyKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgcGFja2FnZWRfdGFzazsKK3B1YmxpYzoKKyAgICBwcm9taXNlKCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KKyAgICAgICAgcHJvbWlzZShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYgX19hKTsKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcHJvbWlzZShwcm9taXNlJiYgX19yaHMpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fc3RhdGVfKF9fcmhzLl9fc3RhdGVfKSB7X19yaHMuX19zdGF0ZV8gPSBudWxscHRyO30KKyAgICBwcm9taXNlKGNvbnN0IHByb21pc2UmIF9fcmhzKSA9IGRlbGV0ZTsKKyNlbHNlICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworcHJpdmF0ZToKKyAgICBwcm9taXNlKGNvbnN0IHByb21pc2UmIF9fcmhzKTsKK3B1YmxpYzoKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICB+cHJvbWlzZSgpOworCisgICAgLy8gYXNzaWdubWVudAorI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwcm9taXNlJiBvcGVyYXRvcj0ocHJvbWlzZSYmIF9fcmhzKSBfTk9FWENFUFQKKyAgICAgICAgeworICAgICAgICAgICAgcHJvbWlzZShzdGQ6Om1vdmUoX19yaHMpKS5zd2FwKCp0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgIHByb21pc2UmIG9wZXJhdG9yPShjb25zdCBwcm9taXNlJiBfX3JocykgPSBkZWxldGU7CisjZWxzZSAgLy8gX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKK3ByaXZhdGU6CisgICAgcHJvbWlzZSYgb3BlcmF0b3I9KGNvbnN0IHByb21pc2UmIF9fcmhzKTsKK3B1YmxpYzoKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKHByb21pc2UmIF9fcmhzKSBfTk9FWENFUFQge19WU1REOjpzd2FwKF9fc3RhdGVfLCBfX3Jocy5fX3N0YXRlXyk7fQorCisgICAgLy8gcmV0cmlldmluZyB0aGUgcmVzdWx0CisgICAgZnV0dXJlPF9ScD4gZ2V0X2Z1dHVyZSgpOworCisgICAgLy8gc2V0dGluZyB0aGUgcmVzdWx0CisgICAgdm9pZCBzZXRfdmFsdWUoY29uc3QgX1JwJiBfX3IpOworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgIHZvaWQgc2V0X3ZhbHVlKF9ScCYmIF9fcik7CisjZW5kaWYKKyAgICB2b2lkIHNldF9leGNlcHRpb24oZXhjZXB0aW9uX3B0ciBfX3ApOworCisgICAgLy8gc2V0dGluZyB0aGUgcmVzdWx0IHdpdGggZGVmZXJyZWQgbm90aWZpY2F0aW9uCisgICAgdm9pZCBzZXRfdmFsdWVfYXRfdGhyZWFkX2V4aXQoY29uc3QgX1JwJiBfX3IpOworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgIHZvaWQgc2V0X3ZhbHVlX2F0X3RocmVhZF9leGl0KF9ScCYmIF9fcik7CisjZW5kaWYKKyAgICB2b2lkIHNldF9leGNlcHRpb25fYXRfdGhyZWFkX2V4aXQoZXhjZXB0aW9uX3B0ciBfX3ApOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK3Byb21pc2U8X1JwPjo6cHJvbWlzZSgpCisgICAgOiBfX3N0YXRlXyhuZXcgX19hc3NvY19zdGF0ZTxfUnA+KQoreworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK3Byb21pc2U8X1JwPjo6cHJvbWlzZShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYgX19hMCkKK3sKKyAgICB0eXBlZGVmIF9fYXNzb2Nfc3RhdGVfYWxsb2M8X1JwLCBfQWxsb2M+IF9TdGF0ZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NhdG9yX3RyYWl0c19yZWJpbmQ8X0FsbG9jLCBfU3RhdGU+Ojp0eXBlIF9BMjsKKyAgICB0eXBlZGVmIF9fYWxsb2NhdG9yX2Rlc3RydWN0b3I8X0EyPiBfRDI7CisgICAgX0EyIF9fYShfX2EwKTsKKyAgICB1bmlxdWVfcHRyPF9TdGF0ZSwgX0QyPiBfX2hvbGQoX19hLmFsbG9jYXRlKDEpLCBfRDIoX19hLCAxKSk7CisgICAgOjpuZXcoc3RhdGljX2Nhc3Q8dm9pZCo+KF9WU1REOjphZGRyZXNzb2YoKl9faG9sZC5nZXQoKSkpKSBfU3RhdGUoX19hMCk7CisgICAgX19zdGF0ZV8gPSBfVlNURDo6YWRkcmVzc29mKCpfX2hvbGQucmVsZWFzZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK3Byb21pc2U8X1JwPjo6fnByb21pc2UoKQoreworICAgIGlmIChfX3N0YXRlXykKKyAgICB7CisgICAgICAgIGlmICghX19zdGF0ZV8tPl9faGFzX3ZhbHVlKCkgJiYgX19zdGF0ZV8tPnVzZV9jb3VudCgpID4gMSkKKyAgICAgICAgICAgIF9fc3RhdGVfLT5zZXRfZXhjZXB0aW9uKG1ha2VfZXhjZXB0aW9uX3B0cigKKyAgICAgICAgICAgICAgICAgICAgICBmdXR1cmVfZXJyb3IobWFrZV9lcnJvcl9jb2RlKGZ1dHVyZV9lcnJjOjpicm9rZW5fcHJvbWlzZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKKyAgICAgICAgX19zdGF0ZV8tPl9fcmVsZWFzZV9zaGFyZWQoKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUnA+CitmdXR1cmU8X1JwPgorcHJvbWlzZTxfUnA+OjpnZXRfZnV0dXJlKCkKK3sKKyAgICBpZiAoX19zdGF0ZV8gPT0gbnVsbHB0cikKKyAgICAgICAgX190aHJvd19mdXR1cmVfZXJyb3IoZnV0dXJlX2VycmM6Om5vX3N0YXRlKTsKKyAgICByZXR1cm4gZnV0dXJlPF9ScD4oX19zdGF0ZV8pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgordm9pZAorcHJvbWlzZTxfUnA+OjpzZXRfdmFsdWUoY29uc3QgX1JwJiBfX3IpCit7CisgICAgaWYgKF9fc3RhdGVfID09IG51bGxwdHIpCisgICAgICAgIF9fdGhyb3dfZnV0dXJlX2Vycm9yKGZ1dHVyZV9lcnJjOjpub19zdGF0ZSk7CisgICAgX19zdGF0ZV8tPnNldF92YWx1ZShfX3IpOworfQorCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKK3RlbXBsYXRlIDxjbGFzcyBfUnA+Cit2b2lkCitwcm9taXNlPF9ScD46OnNldF92YWx1ZShfUnAmJiBfX3IpCit7CisgICAgaWYgKF9fc3RhdGVfID09IG51bGxwdHIpCisgICAgICAgIF9fdGhyb3dfZnV0dXJlX2Vycm9yKGZ1dHVyZV9lcnJjOjpub19zdGF0ZSk7CisgICAgX19zdGF0ZV8tPnNldF92YWx1ZShfVlNURDo6bW92ZShfX3IpKTsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgordm9pZAorcHJvbWlzZTxfUnA+OjpzZXRfZXhjZXB0aW9uKGV4Y2VwdGlvbl9wdHIgX19wKQoreworICAgIF9MSUJDUFBfQVNTRVJUKCBfX3AgIT0gbnVsbHB0ciwgInByb21pc2U6OnNldF9leGNlcHRpb246IHJlY2VpdmVkIG51bGxwdHIiICk7CisgICAgaWYgKF9fc3RhdGVfID09IG51bGxwdHIpCisgICAgICAgIF9fdGhyb3dfZnV0dXJlX2Vycm9yKGZ1dHVyZV9lcnJjOjpub19zdGF0ZSk7CisgICAgX19zdGF0ZV8tPnNldF9leGNlcHRpb24oX19wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK3ZvaWQKK3Byb21pc2U8X1JwPjo6c2V0X3ZhbHVlX2F0X3RocmVhZF9leGl0KGNvbnN0IF9ScCYgX19yKQoreworICAgIGlmIChfX3N0YXRlXyA9PSBudWxscHRyKQorICAgICAgICBfX3Rocm93X2Z1dHVyZV9lcnJvcihmdXR1cmVfZXJyYzo6bm9fc3RhdGUpOworICAgIF9fc3RhdGVfLT5zZXRfdmFsdWVfYXRfdGhyZWFkX2V4aXQoX19yKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgordm9pZAorcHJvbWlzZTxfUnA+OjpzZXRfdmFsdWVfYXRfdGhyZWFkX2V4aXQoX1JwJiYgX19yKQoreworICAgIGlmIChfX3N0YXRlXyA9PSBudWxscHRyKQorICAgICAgICBfX3Rocm93X2Z1dHVyZV9lcnJvcihmdXR1cmVfZXJyYzo6bm9fc3RhdGUpOworICAgIF9fc3RhdGVfLT5zZXRfdmFsdWVfYXRfdGhyZWFkX2V4aXQoX1ZTVEQ6Om1vdmUoX19yKSk7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK3ZvaWQKK3Byb21pc2U8X1JwPjo6c2V0X2V4Y2VwdGlvbl9hdF90aHJlYWRfZXhpdChleGNlcHRpb25fcHRyIF9fcCkKK3sKKyAgICBfTElCQ1BQX0FTU0VSVCggX19wICE9IG51bGxwdHIsICJwcm9taXNlOjpzZXRfZXhjZXB0aW9uX2F0X3RocmVhZF9leGl0OiByZWNlaXZlZCBudWxscHRyIiApOworICAgIGlmIChfX3N0YXRlXyA9PSBudWxscHRyKQorICAgICAgICBfX3Rocm93X2Z1dHVyZV9lcnJvcihmdXR1cmVfZXJyYzo6bm9fc3RhdGUpOworICAgIF9fc3RhdGVfLT5zZXRfZXhjZXB0aW9uX2F0X3RocmVhZF9leGl0KF9fcCk7Cit9CisKKy8vIHByb21pc2U8UiY+CisKK3RlbXBsYXRlIDxjbGFzcyBfUnA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfTElCQ1BQX0FWQUlMQUJJTElUWV9GVVRVUkUgcHJvbWlzZTxfUnAmPgoreworICAgIF9fYXNzb2Nfc3RhdGU8X1JwJj4qIF9fc3RhdGVfOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IHByb21pc2UobnVsbHB0cl90KSBfTk9FWENFUFQgOiBfX3N0YXRlXyhudWxscHRyKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgcGFja2FnZWRfdGFzazsKKworcHVibGljOgorICAgIHByb21pc2UoKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KKyAgICAgICAgcHJvbWlzZShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSk7CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHByb21pc2UocHJvbWlzZSYmIF9fcmhzKSBfTk9FWENFUFQKKyAgICAgICAgOiBfX3N0YXRlXyhfX3Jocy5fX3N0YXRlXykge19fcmhzLl9fc3RhdGVfID0gbnVsbHB0cjt9CisgICAgcHJvbWlzZShjb25zdCBwcm9taXNlJiBfX3JocykgPSBkZWxldGU7CisjZWxzZSAgLy8gX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKK3ByaXZhdGU6CisgICAgcHJvbWlzZShjb25zdCBwcm9taXNlJiBfX3Jocyk7CitwdWJsaWM6CisjZW5kaWYgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisgICAgfnByb21pc2UoKTsKKworICAgIC8vIGFzc2lnbm1lbnQKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcHJvbWlzZSYgb3BlcmF0b3I9KHByb21pc2UmJiBfX3JocykgX05PRVhDRVBUCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb21pc2Uoc3RkOjptb3ZlKF9fcmhzKSkuc3dhcCgqdGhpcyk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICBwcm9taXNlJiBvcGVyYXRvcj0oY29uc3QgcHJvbWlzZSYgX19yaHMpID0gZGVsZXRlOworI2Vsc2UgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCitwcml2YXRlOgorICAgIHByb21pc2UmIG9wZXJhdG9yPShjb25zdCBwcm9taXNlJiBfX3Jocyk7CitwdWJsaWM6CisjZW5kaWYgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc3dhcChwcm9taXNlJiBfX3JocykgX05PRVhDRVBUIHtfVlNURDo6c3dhcChfX3N0YXRlXywgX19yaHMuX19zdGF0ZV8pO30KKworICAgIC8vIHJldHJpZXZpbmcgdGhlIHJlc3VsdAorICAgIGZ1dHVyZTxfUnAmPiBnZXRfZnV0dXJlKCk7CisKKyAgICAvLyBzZXR0aW5nIHRoZSByZXN1bHQKKyAgICB2b2lkIHNldF92YWx1ZShfUnAmIF9fcik7CisgICAgdm9pZCBzZXRfZXhjZXB0aW9uKGV4Y2VwdGlvbl9wdHIgX19wKTsKKworICAgIC8vIHNldHRpbmcgdGhlIHJlc3VsdCB3aXRoIGRlZmVycmVkIG5vdGlmaWNhdGlvbgorICAgIHZvaWQgc2V0X3ZhbHVlX2F0X3RocmVhZF9leGl0KF9ScCYpOworICAgIHZvaWQgc2V0X2V4Y2VwdGlvbl9hdF90aHJlYWRfZXhpdChleGNlcHRpb25fcHRyIF9fcCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgorcHJvbWlzZTxfUnAmPjo6cHJvbWlzZSgpCisgICAgOiBfX3N0YXRlXyhuZXcgX19hc3NvY19zdGF0ZTxfUnAmPikKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2M+Citwcm9taXNlPF9ScCY+Ojpwcm9taXNlKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiBfX2EwKQoreworICAgIHR5cGVkZWYgX19hc3NvY19zdGF0ZV9hbGxvYzxfUnAmLCBfQWxsb2M+IF9TdGF0ZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NhdG9yX3RyYWl0c19yZWJpbmQ8X0FsbG9jLCBfU3RhdGU+Ojp0eXBlIF9BMjsKKyAgICB0eXBlZGVmIF9fYWxsb2NhdG9yX2Rlc3RydWN0b3I8X0EyPiBfRDI7CisgICAgX0EyIF9fYShfX2EwKTsKKyAgICB1bmlxdWVfcHRyPF9TdGF0ZSwgX0QyPiBfX2hvbGQoX19hLmFsbG9jYXRlKDEpLCBfRDIoX19hLCAxKSk7CisgICAgOjpuZXcoc3RhdGljX2Nhc3Q8dm9pZCo+KF9WU1REOjphZGRyZXNzb2YoKl9faG9sZC5nZXQoKSkpKSBfU3RhdGUoX19hMCk7CisgICAgX19zdGF0ZV8gPSBfVlNURDo6YWRkcmVzc29mKCpfX2hvbGQucmVsZWFzZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK3Byb21pc2U8X1JwJj46On5wcm9taXNlKCkKK3sKKyAgICBpZiAoX19zdGF0ZV8pCisgICAgeworICAgICAgICBpZiAoIV9fc3RhdGVfLT5fX2hhc192YWx1ZSgpICYmIF9fc3RhdGVfLT51c2VfY291bnQoKSA+IDEpCisgICAgICAgICAgICBfX3N0YXRlXy0+c2V0X2V4Y2VwdGlvbihtYWtlX2V4Y2VwdGlvbl9wdHIoCisgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlX2Vycm9yKG1ha2VfZXJyb3JfY29kZShmdXR1cmVfZXJyYzo6YnJva2VuX3Byb21pc2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7CisgICAgICAgIF9fc3RhdGVfLT5fX3JlbGVhc2Vfc2hhcmVkKCk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgorZnV0dXJlPF9ScCY+Citwcm9taXNlPF9ScCY+OjpnZXRfZnV0dXJlKCkKK3sKKyAgICBpZiAoX19zdGF0ZV8gPT0gbnVsbHB0cikKKyAgICAgICAgX190aHJvd19mdXR1cmVfZXJyb3IoZnV0dXJlX2VycmM6Om5vX3N0YXRlKTsKKyAgICByZXR1cm4gZnV0dXJlPF9ScCY+KF9fc3RhdGVfKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK3ZvaWQKK3Byb21pc2U8X1JwJj46OnNldF92YWx1ZShfUnAmIF9fcikKK3sKKyAgICBpZiAoX19zdGF0ZV8gPT0gbnVsbHB0cikKKyAgICAgICAgX190aHJvd19mdXR1cmVfZXJyb3IoZnV0dXJlX2VycmM6Om5vX3N0YXRlKTsKKyAgICBfX3N0YXRlXy0+c2V0X3ZhbHVlKF9fcik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUnA+Cit2b2lkCitwcm9taXNlPF9ScCY+OjpzZXRfZXhjZXB0aW9uKGV4Y2VwdGlvbl9wdHIgX19wKQoreworICAgIF9MSUJDUFBfQVNTRVJUKCBfX3AgIT0gbnVsbHB0ciwgInByb21pc2U6OnNldF9leGNlcHRpb246IHJlY2VpdmVkIG51bGxwdHIiICk7CisgICAgaWYgKF9fc3RhdGVfID09IG51bGxwdHIpCisgICAgICAgIF9fdGhyb3dfZnV0dXJlX2Vycm9yKGZ1dHVyZV9lcnJjOjpub19zdGF0ZSk7CisgICAgX19zdGF0ZV8tPnNldF9leGNlcHRpb24oX19wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK3ZvaWQKK3Byb21pc2U8X1JwJj46OnNldF92YWx1ZV9hdF90aHJlYWRfZXhpdChfUnAmIF9fcikKK3sKKyAgICBpZiAoX19zdGF0ZV8gPT0gbnVsbHB0cikKKyAgICAgICAgX190aHJvd19mdXR1cmVfZXJyb3IoZnV0dXJlX2VycmM6Om5vX3N0YXRlKTsKKyAgICBfX3N0YXRlXy0+c2V0X3ZhbHVlX2F0X3RocmVhZF9leGl0KF9fcik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUnA+Cit2b2lkCitwcm9taXNlPF9ScCY+OjpzZXRfZXhjZXB0aW9uX2F0X3RocmVhZF9leGl0KGV4Y2VwdGlvbl9wdHIgX19wKQoreworICAgIF9MSUJDUFBfQVNTRVJUKCBfX3AgIT0gbnVsbHB0ciwgInByb21pc2U6OnNldF9leGNlcHRpb25fYXRfdGhyZWFkX2V4aXQ6IHJlY2VpdmVkIG51bGxwdHIiICk7CisgICAgaWYgKF9fc3RhdGVfID09IG51bGxwdHIpCisgICAgICAgIF9fdGhyb3dfZnV0dXJlX2Vycm9yKGZ1dHVyZV9lcnJjOjpub19zdGF0ZSk7CisgICAgX19zdGF0ZV8tPnNldF9leGNlcHRpb25fYXRfdGhyZWFkX2V4aXQoX19wKTsKK30KKworLy8gcHJvbWlzZTx2b2lkPgorCit0ZW1wbGF0ZSA8PgorY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBfTElCQ1BQX0FWQUlMQUJJTElUWV9GVVRVUkUgcHJvbWlzZTx2b2lkPgoreworICAgIF9fYXNzb2Nfc3ViX3N0YXRlKiBfX3N0YXRlXzsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBwcm9taXNlKG51bGxwdHJfdCkgX05PRVhDRVBUIDogX19zdGF0ZV8obnVsbHB0cikge30KKworICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIHBhY2thZ2VkX3Rhc2s7CisKK3B1YmxpYzoKKyAgICBwcm9taXNlKCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+CisgICAgICAgIF9MSUJDUFBfTUVUSE9EX1RFTVBMQVRFX0lNUExJQ0lUX0lOU1RBTlRJQVRJT05fVklTCisgICAgICAgIHByb21pc2UoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2NhdG9yJiBfX2EpOworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwcm9taXNlKHByb21pc2UmJiBfX3JocykgX05PRVhDRVBUCisgICAgICAgIDogX19zdGF0ZV8oX19yaHMuX19zdGF0ZV8pIHtfX3Jocy5fX3N0YXRlXyA9IG51bGxwdHI7fQorICAgIHByb21pc2UoY29uc3QgcHJvbWlzZSYgX19yaHMpID0gZGVsZXRlOworI2Vsc2UgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCitwcml2YXRlOgorICAgIHByb21pc2UoY29uc3QgcHJvbWlzZSYgX19yaHMpOworcHVibGljOgorI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgIH5wcm9taXNlKCk7CisKKyAgICAvLyBhc3NpZ25tZW50CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHByb21pc2UmIG9wZXJhdG9yPShwcm9taXNlJiYgX19yaHMpIF9OT0VYQ0VQVAorICAgICAgICB7CisgICAgICAgICAgICBwcm9taXNlKHN0ZDo6bW92ZShfX3JocykpLnN3YXAoKnRoaXMpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgcHJvbWlzZSYgb3BlcmF0b3I9KGNvbnN0IHByb21pc2UmIF9fcmhzKSA9IGRlbGV0ZTsKKyNlbHNlICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworcHJpdmF0ZToKKyAgICBwcm9taXNlJiBvcGVyYXRvcj0oY29uc3QgcHJvbWlzZSYgX19yaHMpOworcHVibGljOgorI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAocHJvbWlzZSYgX19yaHMpIF9OT0VYQ0VQVCB7X1ZTVEQ6OnN3YXAoX19zdGF0ZV8sIF9fcmhzLl9fc3RhdGVfKTt9CisKKyAgICAvLyByZXRyaWV2aW5nIHRoZSByZXN1bHQKKyAgICBmdXR1cmU8dm9pZD4gZ2V0X2Z1dHVyZSgpOworCisgICAgLy8gc2V0dGluZyB0aGUgcmVzdWx0CisgICAgdm9pZCBzZXRfdmFsdWUoKTsKKyAgICB2b2lkIHNldF9leGNlcHRpb24oZXhjZXB0aW9uX3B0ciBfX3ApOworCisgICAgLy8gc2V0dGluZyB0aGUgcmVzdWx0IHdpdGggZGVmZXJyZWQgbm90aWZpY2F0aW9uCisgICAgdm9pZCBzZXRfdmFsdWVfYXRfdGhyZWFkX2V4aXQoKTsKKyAgICB2b2lkIHNldF9leGNlcHRpb25fYXRfdGhyZWFkX2V4aXQoZXhjZXB0aW9uX3B0ciBfX3ApOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK3Byb21pc2U8dm9pZD46OnByb21pc2UoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2MmIF9fYTApCit7CisgICAgdHlwZWRlZiBfX2Fzc29jX3N1Yl9zdGF0ZV9hbGxvYzxfQWxsb2M+IF9TdGF0ZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NhdG9yX3RyYWl0c19yZWJpbmQ8X0FsbG9jLCBfU3RhdGU+Ojp0eXBlIF9BMjsKKyAgICB0eXBlZGVmIF9fYWxsb2NhdG9yX2Rlc3RydWN0b3I8X0EyPiBfRDI7CisgICAgX0EyIF9fYShfX2EwKTsKKyAgICB1bmlxdWVfcHRyPF9TdGF0ZSwgX0QyPiBfX2hvbGQoX19hLmFsbG9jYXRlKDEpLCBfRDIoX19hLCAxKSk7CisgICAgOjpuZXcoc3RhdGljX2Nhc3Q8dm9pZCo+KF9WU1REOjphZGRyZXNzb2YoKl9faG9sZC5nZXQoKSkpKSBfU3RhdGUoX19hMCk7CisgICAgX19zdGF0ZV8gPSBfVlNURDo6YWRkcmVzc29mKCpfX2hvbGQucmVsZWFzZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzd2FwKHByb21pc2U8X1JwPiYgX194LCBwcm9taXNlPF9ScD4mIF9feSkgX05PRVhDRVBUCit7CisgICAgX194LnN3YXAoX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB1c2VzX2FsbG9jYXRvcjxwcm9taXNlPF9ScD4sIF9BbGxvYz4KKyAgICAgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OworCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworCisvLyBwYWNrYWdlZF90YXNrCisKK3RlbXBsYXRlPGNsYXNzIF9GcD4gY2xhc3MgX19wYWNrYWdlZF90YXNrX2Jhc2U7CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgLi4uX0FyZ1R5cGVzPgorY2xhc3MgX0xJQkNQUF9BVkFJTEFCSUxJVFlfRlVUVVJFIF9fcGFja2FnZWRfdGFza19iYXNlPF9ScChfQXJnVHlwZXMuLi4pPgoreworICAgIF9fcGFja2FnZWRfdGFza19iYXNlKGNvbnN0IF9fcGFja2FnZWRfdGFza19iYXNlJik7CisgICAgX19wYWNrYWdlZF90YXNrX2Jhc2UmIG9wZXJhdG9yPShjb25zdCBfX3BhY2thZ2VkX3Rhc2tfYmFzZSYpOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3BhY2thZ2VkX3Rhc2tfYmFzZSgpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZpcnR1YWwgfl9fcGFja2FnZWRfdGFza19iYXNlKCkge30KKyAgICB2aXJ0dWFsIHZvaWQgX19tb3ZlX3RvKF9fcGFja2FnZWRfdGFza19iYXNlKikgX05PRVhDRVBUID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveV9kZWFsbG9jYXRlKCkgPSAwOworICAgIHZpcnR1YWwgX1JwIG9wZXJhdG9yKCkoX0FyZ1R5cGVzJiYgLi4uKSA9IDA7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfRkQsIGNsYXNzIF9BbGxvYywgY2xhc3MgX0ZCPiBjbGFzcyBfX3BhY2thZ2VkX3Rhc2tfZnVuYzsKKwordGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9ScCwgY2xhc3MgLi4uX0FyZ1R5cGVzPgorY2xhc3MgX0xJQkNQUF9BVkFJTEFCSUxJVFlfRlVUVVJFIF9fcGFja2FnZWRfdGFza19mdW5jPF9GcCwgX0FsbG9jLCBfUnAoX0FyZ1R5cGVzLi4uKT4KKyAgICA6IHB1YmxpYyAgX19wYWNrYWdlZF90YXNrX2Jhc2U8X1JwKF9BcmdUeXBlcy4uLik+Cit7CisgICAgX19jb21wcmVzc2VkX3BhaXI8X0ZwLCBfQWxsb2M+IF9fZl87CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9fcGFja2FnZWRfdGFza19mdW5jKGNvbnN0IF9GcCYgX19mKSA6IF9fZl8oX19mKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX3BhY2thZ2VkX3Rhc2tfZnVuYyhfRnAmJiBfX2YpIDogX19mXyhfVlNURDo6bW92ZShfX2YpKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3BhY2thZ2VkX3Rhc2tfZnVuYyhjb25zdCBfRnAmIF9fZiwgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgICAgIDogX19mXyhfX2YsIF9fYSkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19wYWNrYWdlZF90YXNrX2Z1bmMoX0ZwJiYgX19mLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICAgICAgOiBfX2ZfKF9WU1REOjptb3ZlKF9fZiksIF9fYSkge30KKyAgICB2aXJ0dWFsIHZvaWQgX19tb3ZlX3RvKF9fcGFja2FnZWRfdGFza19iYXNlPF9ScChfQXJnVHlwZXMuLi4pPiopIF9OT0VYQ0VQVDsKKyAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgpOworICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95X2RlYWxsb2NhdGUoKTsKKyAgICB2aXJ0dWFsIF9ScCBvcGVyYXRvcigpKF9BcmdUeXBlcyYmIC4uLiBfX2FyZ3MpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9ScCwgY2xhc3MgLi4uX0FyZ1R5cGVzPgordm9pZAorX19wYWNrYWdlZF90YXNrX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQXJnVHlwZXMuLi4pPjo6X19tb3ZlX3RvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wYWNrYWdlZF90YXNrX2Jhc2U8X1JwKF9BcmdUeXBlcy4uLik+KiBfX3ApIF9OT0VYQ0VQVAoreworICAgIDo6bmV3IChfX3ApIF9fcGFja2FnZWRfdGFza19mdW5jKF9WU1REOjptb3ZlKF9fZl8uZmlyc3QoKSksIF9WU1REOjptb3ZlKF9fZl8uc2Vjb25kKCkpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0ZwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9ScCwgY2xhc3MgLi4uX0FyZ1R5cGVzPgordm9pZAorX19wYWNrYWdlZF90YXNrX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQXJnVHlwZXMuLi4pPjo6ZGVzdHJveSgpCit7CisgICAgX19mXy5+X19jb21wcmVzc2VkX3BhaXI8X0ZwLCBfQWxsb2M+KCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUnAsIGNsYXNzIC4uLl9BcmdUeXBlcz4KK3ZvaWQKK19fcGFja2FnZWRfdGFza19mdW5jPF9GcCwgX0FsbG9jLCBfUnAoX0FyZ1R5cGVzLi4uKT46OmRlc3Ryb3lfZGVhbGxvY2F0ZSgpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2FsbG9jYXRvcl90cmFpdHNfcmViaW5kPF9BbGxvYywgX19wYWNrYWdlZF90YXNrX2Z1bmM+Ojp0eXBlIF9BcDsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X0FwPiBfQVRyYWl0czsKKyAgICB0eXBlZGVmIHBvaW50ZXJfdHJhaXRzPHR5cGVuYW1lIF9BVHJhaXRzOjpwb2ludGVyPiBfUFRyYWl0czsKKyAgICBfQXAgX19hKF9fZl8uc2Vjb25kKCkpOworICAgIF9fZl8ufl9fY29tcHJlc3NlZF9wYWlyPF9GcCwgX0FsbG9jPigpOworICAgIF9fYS5kZWFsbG9jYXRlKF9QVHJhaXRzOjpwb2ludGVyX3RvKCp0aGlzKSwgMSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfUnAsIGNsYXNzIC4uLl9BcmdUeXBlcz4KK19ScAorX19wYWNrYWdlZF90YXNrX2Z1bmM8X0ZwLCBfQWxsb2MsIF9ScChfQXJnVHlwZXMuLi4pPjo6b3BlcmF0b3IoKShfQXJnVHlwZXMmJiAuLi4gX19hcmcpCit7CisgICAgcmV0dXJuIF9faW52b2tlKF9fZl8uZmlyc3QoKSwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZykuLi4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NhbGxhYmxlPiBjbGFzcyBfX3BhY2thZ2VkX3Rhc2tfZnVuY3Rpb247CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgLi4uX0FyZ1R5cGVzPgorY2xhc3MgX0xJQkNQUF9BVkFJTEFCSUxJVFlfRlVUVVJFIF9fcGFja2FnZWRfdGFza19mdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT4KK3sKKyAgICB0eXBlZGVmIF9fcGFja2FnZWRfdGFza19iYXNlPF9ScChfQXJnVHlwZXMuLi4pPiBfX2Jhc2U7CisgICAgdHlwZW5hbWUgYWxpZ25lZF9zdG9yYWdlPDMqc2l6ZW9mKHZvaWQqKT46OnR5cGUgX19idWZfOworICAgIF9fYmFzZSogX19mXzsKKworcHVibGljOgorICAgIHR5cGVkZWYgX1JwIHJlc3VsdF90eXBlOworCisgICAgLy8gY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19wYWNrYWdlZF90YXNrX2Z1bmN0aW9uKCkgX05PRVhDRVBUIDogX19mXyhudWxscHRyKSB7fQorICAgIHRlbXBsYXRlPGNsYXNzIF9GcD4KKyAgICAgIF9fcGFja2FnZWRfdGFza19mdW5jdGlvbihfRnAmJiBfX2YpOworICAgIHRlbXBsYXRlPGNsYXNzIF9GcCwgY2xhc3MgX0FsbG9jPgorICAgICAgX19wYWNrYWdlZF90YXNrX2Z1bmN0aW9uKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiBfX2EsIF9GcCYmIF9fZik7CisKKyAgICBfX3BhY2thZ2VkX3Rhc2tfZnVuY3Rpb24oX19wYWNrYWdlZF90YXNrX2Z1bmN0aW9uJiYpIF9OT0VYQ0VQVDsKKyAgICBfX3BhY2thZ2VkX3Rhc2tfZnVuY3Rpb24mIG9wZXJhdG9yPShfX3BhY2thZ2VkX3Rhc2tfZnVuY3Rpb24mJikgX05PRVhDRVBUOworCisgICAgX19wYWNrYWdlZF90YXNrX2Z1bmN0aW9uKGNvbnN0IF9fcGFja2FnZWRfdGFza19mdW5jdGlvbiYpID0gIGRlbGV0ZTsKKyAgICBfX3BhY2thZ2VkX3Rhc2tfZnVuY3Rpb24mIG9wZXJhdG9yPShjb25zdCBfX3BhY2thZ2VkX3Rhc2tfZnVuY3Rpb24mKSA9ICBkZWxldGU7CisKKyAgICB+X19wYWNrYWdlZF90YXNrX2Z1bmN0aW9uKCk7CisKKyAgICB2b2lkIHN3YXAoX19wYWNrYWdlZF90YXNrX2Z1bmN0aW9uJikgX05PRVhDRVBUOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9ScCBvcGVyYXRvcigpKF9BcmdUeXBlcy4uLikgY29uc3Q7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIC4uLl9BcmdUeXBlcz4KK19fcGFja2FnZWRfdGFza19mdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT46Ol9fcGFja2FnZWRfdGFza19mdW5jdGlvbihfX3BhY2thZ2VkX3Rhc2tfZnVuY3Rpb24mJiBfX2YpIF9OT0VYQ0VQVAoreworICAgIGlmIChfX2YuX19mXyA9PSBudWxscHRyKQorICAgICAgICBfX2ZfID0gbnVsbHB0cjsKKyAgICBlbHNlIGlmIChfX2YuX19mXyA9PSAoX19iYXNlKikmX19mLl9fYnVmXykKKyAgICB7CisgICAgICAgIF9fZl8gPSAoX19iYXNlKikmX19idWZfOworICAgICAgICBfX2YuX19mXy0+X19tb3ZlX3RvKF9fZl8pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfX2ZfID0gX19mLl9fZl87CisgICAgICAgIF9fZi5fX2ZfID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgLi4uX0FyZ1R5cGVzPgordGVtcGxhdGUgPGNsYXNzIF9GcD4KK19fcGFja2FnZWRfdGFza19mdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT46Ol9fcGFja2FnZWRfdGFza19mdW5jdGlvbihfRnAmJiBfX2YpCisgICAgOiBfX2ZfKG51bGxwdHIpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPHR5cGVuYW1lIGRlY2F5PF9GcD46OnR5cGU+Ojp0eXBlIF9GUjsKKyAgICB0eXBlZGVmIF9fcGFja2FnZWRfdGFza19mdW5jPF9GUiwgYWxsb2NhdG9yPF9GUj4sIF9ScChfQXJnVHlwZXMuLi4pPiBfRkY7CisgICAgaWYgKHNpemVvZihfRkYpIDw9IHNpemVvZihfX2J1Zl8pKQorICAgIHsKKyAgICAgICAgX19mXyA9IChfX2Jhc2UqKSZfX2J1Zl87CisgICAgICAgIDo6bmV3IChfX2ZfKSBfRkYoX1ZTVEQ6OmZvcndhcmQ8X0ZwPihfX2YpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdHlwZWRlZiBhbGxvY2F0b3I8X0ZGPiBfQXA7CisgICAgICAgIF9BcCBfX2E7CisgICAgICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfQXA+IF9EcDsKKyAgICAgICAgdW5pcXVlX3B0cjxfX2Jhc2UsIF9EcD4gX19ob2xkKF9fYS5hbGxvY2F0ZSgxKSwgX0RwKF9fYSwgMSkpOworICAgICAgICA6Om5ldyAoX19ob2xkLmdldCgpKSBfRkYoX1ZTVEQ6OmZvcndhcmQ8X0ZwPihfX2YpLCBhbGxvY2F0b3I8X0ZSPihfX2EpKTsKKyAgICAgICAgX19mXyA9IF9faG9sZC5yZWxlYXNlKCk7CisgICAgfQorfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIC4uLl9BcmdUeXBlcz4KK3RlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvYz4KK19fcGFja2FnZWRfdGFza19mdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT46Ol9fcGFja2FnZWRfdGFza19mdW5jdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYgX19hMCwgX0ZwJiYgX19mKQorICAgIDogX19mXyhudWxscHRyKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTx0eXBlbmFtZSBkZWNheTxfRnA+Ojp0eXBlPjo6dHlwZSBfRlI7CisgICAgdHlwZWRlZiBfX3BhY2thZ2VkX3Rhc2tfZnVuYzxfRlIsIF9BbGxvYywgX1JwKF9BcmdUeXBlcy4uLik+IF9GRjsKKyAgICBpZiAoc2l6ZW9mKF9GRikgPD0gc2l6ZW9mKF9fYnVmXykpCisgICAgeworICAgICAgICBfX2ZfID0gKF9fYmFzZSopJl9fYnVmXzsKKyAgICAgICAgOjpuZXcgKF9fZl8pIF9GRihfVlNURDo6Zm9yd2FyZDxfRnA+KF9fZikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NhdG9yX3RyYWl0c19yZWJpbmQ8X0FsbG9jLCBfRkY+Ojp0eXBlIF9BcDsKKyAgICAgICAgX0FwIF9fYShfX2EwKTsKKyAgICAgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9BcD4gX0RwOworICAgICAgICB1bmlxdWVfcHRyPF9fYmFzZSwgX0RwPiBfX2hvbGQoX19hLmFsbG9jYXRlKDEpLCBfRHAoX19hLCAxKSk7CisgICAgICAgIDo6bmV3IChzdGF0aWNfY2FzdDx2b2lkKj4oX1ZTVEQ6OmFkZHJlc3NvZigqX19ob2xkLmdldCgpKSkpCisgICAgICAgICAgICBfRkYoX1ZTVEQ6OmZvcndhcmQ8X0ZwPihfX2YpLCBfQWxsb2MoX19hKSk7CisgICAgICAgIF9fZl8gPSBfVlNURDo6YWRkcmVzc29mKCpfX2hvbGQucmVsZWFzZSgpKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgLi4uX0FyZ1R5cGVzPgorX19wYWNrYWdlZF90YXNrX2Z1bmN0aW9uPF9ScChfQXJnVHlwZXMuLi4pPiYKK19fcGFja2FnZWRfdGFza19mdW5jdGlvbjxfUnAoX0FyZ1R5cGVzLi4uKT46Om9wZXJhdG9yPShfX3BhY2thZ2VkX3Rhc2tfZnVuY3Rpb24mJiBfX2YpIF9OT0VYQ0VQVAoreworICAgIGlmIChfX2ZfID09IChfX2Jhc2UqKSZfX2J1Zl8pCisgICAgICAgIF9fZl8tPmRlc3Ryb3koKTsKKyAgICBlbHNlIGlmIChfX2ZfKQorICAgICAgICBfX2ZfLT5kZXN0cm95X2RlYWxsb2NhdGUoKTsKKyAgICBfX2ZfID0gbnVsbHB0cjsKKyAgICBpZiAoX19mLl9fZl8gPT0gbnVsbHB0cikKKyAgICAgICAgX19mXyA9IG51bGxwdHI7CisgICAgZWxzZSBpZiAoX19mLl9fZl8gPT0gKF9fYmFzZSopJl9fZi5fX2J1Zl8pCisgICAgeworICAgICAgICBfX2ZfID0gKF9fYmFzZSopJl9fYnVmXzsKKyAgICAgICAgX19mLl9fZl8tPl9fbW92ZV90byhfX2ZfKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX19mXyA9IF9fZi5fX2ZfOworICAgICAgICBfX2YuX19mXyA9IG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyAuLi5fQXJnVHlwZXM+CitfX3BhY2thZ2VkX3Rhc2tfZnVuY3Rpb248X1JwKF9BcmdUeXBlcy4uLik+Ojp+X19wYWNrYWdlZF90YXNrX2Z1bmN0aW9uKCkKK3sKKyAgICBpZiAoX19mXyA9PSAoX19iYXNlKikmX19idWZfKQorICAgICAgICBfX2ZfLT5kZXN0cm95KCk7CisgICAgZWxzZSBpZiAoX19mXykKKyAgICAgICAgX19mXy0+ZGVzdHJveV9kZWFsbG9jYXRlKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgLi4uX0FyZ1R5cGVzPgordm9pZAorX19wYWNrYWdlZF90YXNrX2Z1bmN0aW9uPF9ScChfQXJnVHlwZXMuLi4pPjo6c3dhcChfX3BhY2thZ2VkX3Rhc2tfZnVuY3Rpb24mIF9fZikgX05PRVhDRVBUCit7CisgICAgaWYgKF9fZl8gPT0gKF9fYmFzZSopJl9fYnVmXyAmJiBfX2YuX19mXyA9PSAoX19iYXNlKikmX19mLl9fYnVmXykKKyAgICB7CisgICAgICAgIHR5cGVuYW1lIGFsaWduZWRfc3RvcmFnZTxzaXplb2YoX19idWZfKT46OnR5cGUgX190ZW1wYnVmOworICAgICAgICBfX2Jhc2UqIF9fdCA9IChfX2Jhc2UqKSZfX3RlbXBidWY7CisgICAgICAgIF9fZl8tPl9fbW92ZV90byhfX3QpOworICAgICAgICBfX2ZfLT5kZXN0cm95KCk7CisgICAgICAgIF9fZl8gPSBudWxscHRyOworICAgICAgICBfX2YuX19mXy0+X19tb3ZlX3RvKChfX2Jhc2UqKSZfX2J1Zl8pOworICAgICAgICBfX2YuX19mXy0+ZGVzdHJveSgpOworICAgICAgICBfX2YuX19mXyA9IG51bGxwdHI7CisgICAgICAgIF9fZl8gPSAoX19iYXNlKikmX19idWZfOworICAgICAgICBfX3QtPl9fbW92ZV90bygoX19iYXNlKikmX19mLl9fYnVmXyk7CisgICAgICAgIF9fdC0+ZGVzdHJveSgpOworICAgICAgICBfX2YuX19mXyA9IChfX2Jhc2UqKSZfX2YuX19idWZfOworICAgIH0KKyAgICBlbHNlIGlmIChfX2ZfID09IChfX2Jhc2UqKSZfX2J1Zl8pCisgICAgeworICAgICAgICBfX2ZfLT5fX21vdmVfdG8oKF9fYmFzZSopJl9fZi5fX2J1Zl8pOworICAgICAgICBfX2ZfLT5kZXN0cm95KCk7CisgICAgICAgIF9fZl8gPSBfX2YuX19mXzsKKyAgICAgICAgX19mLl9fZl8gPSAoX19iYXNlKikmX19mLl9fYnVmXzsKKyAgICB9CisgICAgZWxzZSBpZiAoX19mLl9fZl8gPT0gKF9fYmFzZSopJl9fZi5fX2J1Zl8pCisgICAgeworICAgICAgICBfX2YuX19mXy0+X19tb3ZlX3RvKChfX2Jhc2UqKSZfX2J1Zl8pOworICAgICAgICBfX2YuX19mXy0+ZGVzdHJveSgpOworICAgICAgICBfX2YuX19mXyA9IF9fZl87CisgICAgICAgIF9fZl8gPSAoX19iYXNlKikmX19idWZfOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIF9WU1REOjpzd2FwKF9fZl8sIF9fZi5fX2ZfKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JwLCBjbGFzcyAuLi5fQXJnVHlwZXM+CitpbmxpbmUKK19ScAorX19wYWNrYWdlZF90YXNrX2Z1bmN0aW9uPF9ScChfQXJnVHlwZXMuLi4pPjo6b3BlcmF0b3IoKShfQXJnVHlwZXMuLi4gX19hcmcpIGNvbnN0Cit7CisgICAgcmV0dXJuICgqX19mXykoX1ZTVEQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZykuLi4pOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUnAsIGNsYXNzIC4uLl9BcmdUeXBlcz4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9MSUJDUFBfQVZBSUxBQklMSVRZX0ZVVFVSRSBwYWNrYWdlZF90YXNrPF9ScChfQXJnVHlwZXMuLi4pPgoreworcHVibGljOgorICAgIHR5cGVkZWYgX1JwIHJlc3VsdF90eXBlOyAvLyBleHRlbnNpb24KKworcHJpdmF0ZToKKyAgICBfX3BhY2thZ2VkX3Rhc2tfZnVuY3Rpb248cmVzdWx0X3R5cGUoX0FyZ1R5cGVzLi4uKT4gX19mXzsKKyAgICBwcm9taXNlPHJlc3VsdF90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wXzsKKworcHVibGljOgorICAgIC8vIGNvbnN0cnVjdGlvbiBhbmQgZGVzdHJ1Y3Rpb24KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFja2FnZWRfdGFzaygpIF9OT0VYQ0VQVCA6IF9fcF8obnVsbHB0cikge30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLAorICAgICAgICAgICAgICBjbGFzcyA9IHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICAgICAgICA8CisgICAgICAgICAgICAgICAgICAhaXNfc2FtZTwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX3VuY3ZyZWY8X0ZwPjo6dHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZWRfdGFzaworICAgICAgICAgICAgICAgICAgICAgID46OnZhbHVlCisgICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgICAgICAgICAgPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGV4cGxpY2l0IHBhY2thZ2VkX3Rhc2soX0ZwJiYgX19mKSA6IF9fZl8oX1ZTVEQ6OmZvcndhcmQ8X0ZwPihfX2YpKSB7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvY2F0b3IsCisgICAgICAgICAgICAgIGNsYXNzID0gdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICAgICFpc19zYW1lPAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fdW5jdnJlZjxfRnA+Ojp0eXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlZF90YXNrCisgICAgICAgICAgICAgICAgICAgICAgPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICAgICAgICAgICAgPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHBhY2thZ2VkX3Rhc2soYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2NhdG9yJiBfX2EsIF9GcCYmIF9fZikKKyAgICAgICAgICAgICA6IF9fZl8oYWxsb2NhdG9yX2FyZywgX19hLCBfVlNURDo6Zm9yd2FyZDxfRnA+KF9fZikpLAorICAgICAgICAgICAgICAgX19wXyhhbGxvY2F0b3JfYXJnLCBfX2EpIHt9CisgICAgLy8gfnBhY2thZ2VkX3Rhc2soKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBubyBjb3B5CisgICAgcGFja2FnZWRfdGFzayhjb25zdCBwYWNrYWdlZF90YXNrJikgPSBkZWxldGU7CisgICAgcGFja2FnZWRfdGFzayYgb3BlcmF0b3I9KGNvbnN0IHBhY2thZ2VkX3Rhc2smKSA9IGRlbGV0ZTsKKworICAgIC8vIG1vdmUgc3VwcG9ydAorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWNrYWdlZF90YXNrKHBhY2thZ2VkX3Rhc2smJiBfX290aGVyKSBfTk9FWENFUFQKKyAgICAgICAgOiBfX2ZfKF9WU1REOjptb3ZlKF9fb3RoZXIuX19mXykpLCBfX3BfKF9WU1REOjptb3ZlKF9fb3RoZXIuX19wXykpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhY2thZ2VkX3Rhc2smIG9wZXJhdG9yPShwYWNrYWdlZF90YXNrJiYgX19vdGhlcikgX05PRVhDRVBUCisgICAgeworICAgICAgICBfX2ZfID0gX1ZTVEQ6Om1vdmUoX19vdGhlci5fX2ZfKTsKKyAgICAgICAgX19wXyA9IF9WU1REOjptb3ZlKF9fb3RoZXIuX19wXyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc3dhcChwYWNrYWdlZF90YXNrJiBfX290aGVyKSBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIF9fZl8uc3dhcChfX290aGVyLl9fZl8pOworICAgICAgICBfX3BfLnN3YXAoX19vdGhlci5fX3BfKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCB2YWxpZCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fcF8uX19zdGF0ZV8gIT0gbnVsbHB0cjt9CisKKyAgICAvLyByZXN1bHQgcmV0cmlldmFsCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGZ1dHVyZTxyZXN1bHRfdHlwZT4gZ2V0X2Z1dHVyZSgpIHtyZXR1cm4gX19wXy5nZXRfZnV0dXJlKCk7fQorCisgICAgLy8gZXhlY3V0aW9uCisgICAgdm9pZCBvcGVyYXRvcigpKF9BcmdUeXBlcy4uLiBfX2FyZ3MpOworICAgIHZvaWQgbWFrZV9yZWFkeV9hdF90aHJlYWRfZXhpdChfQXJnVHlwZXMuLi4gX19hcmdzKTsKKworICAgIHZvaWQgcmVzZXQoKTsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgLi4uX0FyZ1R5cGVzPgordm9pZAorcGFja2FnZWRfdGFzazxfUnAoX0FyZ1R5cGVzLi4uKT46Om9wZXJhdG9yKCkoX0FyZ1R5cGVzLi4uIF9fYXJncykKK3sKKyAgICBpZiAoX19wXy5fX3N0YXRlXyA9PSBudWxscHRyKQorICAgICAgICBfX3Rocm93X2Z1dHVyZV9lcnJvcihmdXR1cmVfZXJyYzo6bm9fc3RhdGUpOworICAgIGlmIChfX3BfLl9fc3RhdGVfLT5fX2hhc192YWx1ZSgpKQorICAgICAgICBfX3Rocm93X2Z1dHVyZV9lcnJvcihmdXR1cmVfZXJyYzo6cHJvbWlzZV9hbHJlYWR5X3NhdGlzZmllZCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIF9fcF8uc2V0X3ZhbHVlKF9fZl8oX1ZTVEQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKSk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgX19wXy5zZXRfZXhjZXB0aW9uKGN1cnJlbnRfZXhjZXB0aW9uKCkpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgLi4uX0FyZ1R5cGVzPgordm9pZAorcGFja2FnZWRfdGFzazxfUnAoX0FyZ1R5cGVzLi4uKT46Om1ha2VfcmVhZHlfYXRfdGhyZWFkX2V4aXQoX0FyZ1R5cGVzLi4uIF9fYXJncykKK3sKKyAgICBpZiAoX19wXy5fX3N0YXRlXyA9PSBudWxscHRyKQorICAgICAgICBfX3Rocm93X2Z1dHVyZV9lcnJvcihmdXR1cmVfZXJyYzo6bm9fc3RhdGUpOworICAgIGlmIChfX3BfLl9fc3RhdGVfLT5fX2hhc192YWx1ZSgpKQorICAgICAgICBfX3Rocm93X2Z1dHVyZV9lcnJvcihmdXR1cmVfZXJyYzo6cHJvbWlzZV9hbHJlYWR5X3NhdGlzZmllZCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIF9fcF8uc2V0X3ZhbHVlX2F0X3RocmVhZF9leGl0KF9fZl8oX1ZTVEQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKSk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgX19wXy5zZXRfZXhjZXB0aW9uX2F0X3RocmVhZF9leGl0KGN1cnJlbnRfZXhjZXB0aW9uKCkpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCit9CisKK3RlbXBsYXRlPGNsYXNzIF9ScCwgY2xhc3MgLi4uX0FyZ1R5cGVzPgordm9pZAorcGFja2FnZWRfdGFzazxfUnAoX0FyZ1R5cGVzLi4uKT46OnJlc2V0KCkKK3sKKyAgICBpZiAoIXZhbGlkKCkpCisgICAgICAgIF9fdGhyb3dfZnV0dXJlX2Vycm9yKGZ1dHVyZV9lcnJjOjpub19zdGF0ZSk7CisgICAgX19wXyA9IHByb21pc2U8cmVzdWx0X3R5cGU+KCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIC4uLl9BcmdUeXBlcz4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9MSUJDUFBfQVZBSUxBQklMSVRZX0ZVVFVSRSBwYWNrYWdlZF90YXNrPHZvaWQoX0FyZ1R5cGVzLi4uKT4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHZvaWQgcmVzdWx0X3R5cGU7IC8vIGV4dGVuc2lvbgorCitwcml2YXRlOgorICAgIF9fcGFja2FnZWRfdGFza19mdW5jdGlvbjxyZXN1bHRfdHlwZShfQXJnVHlwZXMuLi4pPiBfX2ZfOworICAgIHByb21pc2U8cmVzdWx0X3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3BfOworCitwdWJsaWM6CisgICAgLy8gY29uc3RydWN0aW9uIGFuZCBkZXN0cnVjdGlvbgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWNrYWdlZF90YXNrKCkgX05PRVhDRVBUIDogX19wXyhudWxscHRyKSB7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfRnAsCisgICAgICAgICAgICAgIGNsYXNzID0gdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICAgICFpc19zYW1lPAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fdW5jdnJlZjxfRnA+Ojp0eXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlZF90YXNrCisgICAgICAgICAgICAgICAgICAgICAgPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICAgICAgICAgICAgPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGV4cGxpY2l0IHBhY2thZ2VkX3Rhc2soX0ZwJiYgX19mKSA6IF9fZl8oX1ZTVEQ6OmZvcndhcmQ8X0ZwPihfX2YpKSB7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIF9BbGxvY2F0b3IsCisgICAgICAgICAgICAgIGNsYXNzID0gdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICAgICFpc19zYW1lPAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fdW5jdnJlZjxfRnA+Ojp0eXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlZF90YXNrCisgICAgICAgICAgICAgICAgICAgICAgPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICAgICAgICAgICAgPiAgICAKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBwYWNrYWdlZF90YXNrKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jYXRvciYgX19hLCBfRnAmJiBfX2YpCisgICAgICAgICAgICAgOiBfX2ZfKGFsbG9jYXRvcl9hcmcsIF9fYSwgX1ZTVEQ6OmZvcndhcmQ8X0ZwPihfX2YpKSwKKyAgICAgICAgICAgICAgIF9fcF8oYWxsb2NhdG9yX2FyZywgX19hKSB7fQorICAgIC8vIH5wYWNrYWdlZF90YXNrKCkgPSBkZWZhdWx0OworCisgICAgLy8gbm8gY29weQorICAgIHBhY2thZ2VkX3Rhc2soY29uc3QgcGFja2FnZWRfdGFzayYpID0gZGVsZXRlOworICAgIHBhY2thZ2VkX3Rhc2smIG9wZXJhdG9yPShjb25zdCBwYWNrYWdlZF90YXNrJikgPSBkZWxldGU7CisKKyAgICAvLyBtb3ZlIHN1cHBvcnQKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFja2FnZWRfdGFzayhwYWNrYWdlZF90YXNrJiYgX19vdGhlcikgX05PRVhDRVBUCisgICAgICAgIDogX19mXyhfVlNURDo6bW92ZShfX290aGVyLl9fZl8pKSwgX19wXyhfVlNURDo6bW92ZShfX290aGVyLl9fcF8pKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWNrYWdlZF90YXNrJiBvcGVyYXRvcj0ocGFja2FnZWRfdGFzayYmIF9fb3RoZXIpIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgX19mXyA9IF9WU1REOjptb3ZlKF9fb3RoZXIuX19mXyk7CisgICAgICAgIF9fcF8gPSBfVlNURDo6bW92ZShfX290aGVyLl9fcF8pOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAocGFja2FnZWRfdGFzayYgX19vdGhlcikgX05PRVhDRVBUCisgICAgeworICAgICAgICBfX2ZfLnN3YXAoX19vdGhlci5fX2ZfKTsKKyAgICAgICAgX19wXy5zd2FwKF9fb3RoZXIuX19wXyk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgdmFsaWQoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3BfLl9fc3RhdGVfICE9IG51bGxwdHI7fQorCisgICAgLy8gcmVzdWx0IHJldHJpZXZhbAorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBmdXR1cmU8cmVzdWx0X3R5cGU+IGdldF9mdXR1cmUoKSB7cmV0dXJuIF9fcF8uZ2V0X2Z1dHVyZSgpO30KKworICAgIC8vIGV4ZWN1dGlvbgorICAgIHZvaWQgb3BlcmF0b3IoKShfQXJnVHlwZXMuLi4gX19hcmdzKTsKKyAgICB2b2lkIG1ha2VfcmVhZHlfYXRfdGhyZWFkX2V4aXQoX0FyZ1R5cGVzLi4uIF9fYXJncyk7CisKKyAgICB2b2lkIHJlc2V0KCk7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyAuLi5fQXJnVHlwZXM+Cit2b2lkCitwYWNrYWdlZF90YXNrPHZvaWQoX0FyZ1R5cGVzLi4uKT46Om9wZXJhdG9yKCkoX0FyZ1R5cGVzLi4uIF9fYXJncykKK3sKKyAgICBpZiAoX19wXy5fX3N0YXRlXyA9PSBudWxscHRyKQorICAgICAgICBfX3Rocm93X2Z1dHVyZV9lcnJvcihmdXR1cmVfZXJyYzo6bm9fc3RhdGUpOworICAgIGlmIChfX3BfLl9fc3RhdGVfLT5fX2hhc192YWx1ZSgpKQorICAgICAgICBfX3Rocm93X2Z1dHVyZV9lcnJvcihmdXR1cmVfZXJyYzo6cHJvbWlzZV9hbHJlYWR5X3NhdGlzZmllZCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIF9fZl8oX1ZTVEQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsKKyAgICAgICAgX19wXy5zZXRfdmFsdWUoKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICBfX3BfLnNldF9leGNlcHRpb24oY3VycmVudF9leGNlcHRpb24oKSk7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKK30KKwordGVtcGxhdGU8Y2xhc3MgLi4uX0FyZ1R5cGVzPgordm9pZAorcGFja2FnZWRfdGFzazx2b2lkKF9BcmdUeXBlcy4uLik+OjptYWtlX3JlYWR5X2F0X3RocmVhZF9leGl0KF9BcmdUeXBlcy4uLiBfX2FyZ3MpCit7CisgICAgaWYgKF9fcF8uX19zdGF0ZV8gPT0gbnVsbHB0cikKKyAgICAgICAgX190aHJvd19mdXR1cmVfZXJyb3IoZnV0dXJlX2VycmM6Om5vX3N0YXRlKTsKKyAgICBpZiAoX19wXy5fX3N0YXRlXy0+X19oYXNfdmFsdWUoKSkKKyAgICAgICAgX190aHJvd19mdXR1cmVfZXJyb3IoZnV0dXJlX2VycmM6OnByb21pc2VfYWxyZWFkeV9zYXRpc2ZpZWQpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICBfX2ZfKF9WU1REOjpmb3J3YXJkPF9BcmdUeXBlcz4oX19hcmdzKS4uLik7CisgICAgICAgIF9fcF8uc2V0X3ZhbHVlX2F0X3RocmVhZF9leGl0KCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgX19wXy5zZXRfZXhjZXB0aW9uX2F0X3RocmVhZF9leGl0KGN1cnJlbnRfZXhjZXB0aW9uKCkpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCit9CisKK3RlbXBsYXRlPGNsYXNzIC4uLl9BcmdUeXBlcz4KK3ZvaWQKK3BhY2thZ2VkX3Rhc2s8dm9pZChfQXJnVHlwZXMuLi4pPjo6cmVzZXQoKQoreworICAgIGlmICghdmFsaWQoKSkKKyAgICAgICAgX190aHJvd19mdXR1cmVfZXJyb3IoZnV0dXJlX2VycmM6Om5vX3N0YXRlKTsKKyAgICBfX3BfID0gcHJvbWlzZTxyZXN1bHRfdHlwZT4oKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DYWxsYWJsZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzd2FwKHBhY2thZ2VkX3Rhc2s8X0NhbGxhYmxlPiYgX194LCBwYWNrYWdlZF90YXNrPF9DYWxsYWJsZT4mIF9feSkgX05PRVhDRVBUCit7CisgICAgX194LnN3YXAoX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DYWxsYWJsZSwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHVzZXNfYWxsb2NhdG9yPHBhY2thZ2VkX3Rhc2s8X0NhbGxhYmxlPiwgX0FsbG9jPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0ZwPgorZnV0dXJlPF9ScD4KKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKK19fbWFrZV9kZWZlcnJlZF9hc3NvY19zdGF0ZShfRnAmJiBfX2YpCisjZWxzZQorX19tYWtlX2RlZmVycmVkX2Fzc29jX3N0YXRlKF9GcCBfX2YpCisjZW5kaWYKK3sKKyAgICB1bmlxdWVfcHRyPF9fZGVmZXJyZWRfYXNzb2Nfc3RhdGU8X1JwLCBfRnA+LCBfX3JlbGVhc2Vfc2hhcmVkX2NvdW50PgorICAgICAgICBfX2gobmV3IF9fZGVmZXJyZWRfYXNzb2Nfc3RhdGU8X1JwLCBfRnA+KF9WU1REOjpmb3J3YXJkPF9GcD4oX19mKSkpOworICAgIHJldHVybiBmdXR1cmU8X1JwPihfX2guZ2V0KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfRnA+CitmdXR1cmU8X1JwPgorI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworX19tYWtlX2FzeW5jX2Fzc29jX3N0YXRlKF9GcCYmIF9fZikKKyNlbHNlCitfX21ha2VfYXN5bmNfYXNzb2Nfc3RhdGUoX0ZwIF9fZikKKyNlbmRpZgoreworICAgIHVuaXF1ZV9wdHI8X19hc3luY19hc3NvY19zdGF0ZTxfUnAsIF9GcD4sIF9fcmVsZWFzZV9zaGFyZWRfY291bnQ+CisgICAgICAgIF9faChuZXcgX19hc3luY19hc3NvY19zdGF0ZTxfUnAsIF9GcD4oX1ZTVEQ6OmZvcndhcmQ8X0ZwPihfX2YpKSk7CisgICAgX1ZTVEQ6OnRocmVhZCgmX19hc3luY19hc3NvY19zdGF0ZTxfUnAsIF9GcD46Ol9fZXhlY3V0ZSwgX19oLmdldCgpKS5kZXRhY2goKTsKKyAgICByZXR1cm4gZnV0dXJlPF9ScD4oX19oLmdldCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MuLi4gX0FyZ3M+CitjbGFzcyBfX2FzeW5jX2Z1bmMKK3sKKyAgICB0dXBsZTxfRnAsIF9BcmdzLi4uPiBfX2ZfOworCitwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2ludm9rZV9vZjxfRnAsIF9BcmdzLi4uPjo6dHlwZSBfUnA7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19hc3luY19mdW5jKF9GcCYmIF9fZiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgIDogX19mXyhfVlNURDo6bW92ZShfX2YpLCBfVlNURDo6bW92ZShfX2FyZ3MpLi4uKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fYXN5bmNfZnVuYyhfX2FzeW5jX2Z1bmMmJiBfX2YpIDogX19mXyhfVlNURDo6bW92ZShfX2YuX19mXykpIHt9CisKKyAgICBfUnAgb3BlcmF0b3IoKSgpCisgICAgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPDErc2l6ZW9mLi4uKF9BcmdzKSwgMT46OnR5cGUgX0luZGV4OworICAgICAgICByZXR1cm4gX19leGVjdXRlKF9JbmRleCgpKTsKKyAgICB9Citwcml2YXRlOgorICAgIHRlbXBsYXRlIDxzaXplX3QgLi4uX0luZGljZXM+CisgICAgX1JwCisgICAgX19leGVjdXRlKF9fdHVwbGVfaW5kaWNlczxfSW5kaWNlcy4uLj4pCisgICAgeworICAgICAgICByZXR1cm4gX19pbnZva2UoX1ZTVEQ6Om1vdmUoX1ZTVEQ6OmdldDwwPihfX2ZfKSksIF9WU1REOjptb3ZlKF9WU1REOjpnZXQ8X0luZGljZXM+KF9fZl8pKS4uLik7CisgICAgfQorfTsKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYm9vbCBfX2RvZXNfcG9saWN5X2NvbnRhaW4obGF1bmNoIF9fcG9saWN5LCBsYXVuY2ggX192YWx1ZSApCit7IHJldHVybiAoaW50KF9fcG9saWN5KSAmIGludChfX3ZhbHVlKSkgIT0gMDsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcy4uLiBfQXJncz4KK19MSUJDUFBfTk9ESVNDQVJEX0FGVEVSX0NYWDE3CitmdXR1cmU8dHlwZW5hbWUgX19pbnZva2Vfb2Y8dHlwZW5hbWUgZGVjYXk8X0ZwPjo6dHlwZSwgdHlwZW5hbWUgZGVjYXk8X0FyZ3M+Ojp0eXBlLi4uPjo6dHlwZT4KK2FzeW5jKGxhdW5jaCBfX3BvbGljeSwgX0ZwJiYgX19mLCBfQXJncyYmLi4uIF9fYXJncykKK3sKKyAgICB0eXBlZGVmIF9fYXN5bmNfZnVuYzx0eXBlbmFtZSBkZWNheTxfRnA+Ojp0eXBlLCB0eXBlbmFtZSBkZWNheTxfQXJncz46OnR5cGUuLi4+IF9CRjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9CRjo6X1JwIF9ScDsKKworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYKKyAgICAgICAgaWYgKF9fZG9lc19wb2xpY3lfY29udGFpbihfX3BvbGljeSwgbGF1bmNoOjphc3luYykpCisgICAgICAgIHJldHVybiBfVlNURDo6X19tYWtlX2FzeW5jX2Fzc29jX3N0YXRlPF9ScD4oX0JGKF9fZGVjYXlfY29weShfVlNURDo6Zm9yd2FyZDxfRnA+KF9fZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2RlY2F5X2NvcHkoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykpLi4uKSk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoIC4uLiApIHsgaWYgKF9fcG9saWN5ID09IGxhdW5jaDo6YXN5bmMpIHRocm93IDsgfQorI2VuZGlmCisKKyAgICBpZiAoX19kb2VzX3BvbGljeV9jb250YWluKF9fcG9saWN5LCBsYXVuY2g6OmRlZmVycmVkKSkKKyAgICAgICAgcmV0dXJuIF9WU1REOjpfX21ha2VfZGVmZXJyZWRfYXNzb2Nfc3RhdGU8X1JwPihfQkYoX19kZWNheV9jb3B5KF9WU1REOjpmb3J3YXJkPF9GcD4oX19mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZGVjYXlfY29weShfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKSkuLi4pKTsKKyAgICByZXR1cm4gZnV0dXJlPF9ScD57fTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MuLi4gX0FyZ3M+CitfTElCQ1BQX05PRElTQ0FSRF9BRlRFUl9DWFgxNyBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorZnV0dXJlPHR5cGVuYW1lIF9faW52b2tlX29mPHR5cGVuYW1lIGRlY2F5PF9GcD46OnR5cGUsIHR5cGVuYW1lIGRlY2F5PF9BcmdzPjo6dHlwZS4uLj46OnR5cGU+Cithc3luYyhfRnAmJiBfX2YsIF9BcmdzJiYuLi4gX19hcmdzKQoreworICAgIHJldHVybiBfVlNURDo6YXN5bmMobGF1bmNoOjphbnksIF9WU1REOjpmb3J3YXJkPF9GcD4oX19mKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKKworLy8gc2hhcmVkX2Z1dHVyZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgc2hhcmVkX2Z1dHVyZQoreworICAgIF9fYXNzb2Nfc3RhdGU8X1JwPiogX19zdGF0ZV87CisKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2hhcmVkX2Z1dHVyZSgpIF9OT0VYQ0VQVCA6IF9fc3RhdGVfKG51bGxwdHIpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNoYXJlZF9mdXR1cmUoY29uc3Qgc2hhcmVkX2Z1dHVyZSYgX19yaHMpICBfTk9FWENFUFQgOiBfX3N0YXRlXyhfX3Jocy5fX3N0YXRlXykKKyAgICAgICAge2lmIChfX3N0YXRlXykgX19zdGF0ZV8tPl9fYWRkX3NoYXJlZCgpO30KKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2hhcmVkX2Z1dHVyZShmdXR1cmU8X1JwPiYmIF9fZikgX05PRVhDRVBUIDogX19zdGF0ZV8oX19mLl9fc3RhdGVfKQorICAgICAgICB7X19mLl9fc3RhdGVfID0gbnVsbHB0cjt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNoYXJlZF9mdXR1cmUoc2hhcmVkX2Z1dHVyZSYmIF9fcmhzKSBfTk9FWENFUFQgOiBfX3N0YXRlXyhfX3Jocy5fX3N0YXRlXykKKyAgICAgICAge19fcmhzLl9fc3RhdGVfID0gbnVsbHB0cjt9CisjZW5kaWYgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisgICAgfnNoYXJlZF9mdXR1cmUoKTsKKyAgICBzaGFyZWRfZnV0dXJlJiBvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX2Z1dHVyZSYgX19yaHMpIF9OT0VYQ0VQVDsKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2hhcmVkX2Z1dHVyZSYgb3BlcmF0b3I9KHNoYXJlZF9mdXR1cmUmJiBfX3JocykgX05PRVhDRVBUCisgICAgICAgIHsKKyAgICAgICAgICAgIHNoYXJlZF9mdXR1cmUoc3RkOjptb3ZlKF9fcmhzKSkuc3dhcCgqdGhpcyk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKworICAgIC8vIHJldHJpZXZpbmcgdGhlIHZhbHVlCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IF9ScCYgZ2V0KCkgY29uc3Qge3JldHVybiBfX3N0YXRlXy0+Y29weSgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAoc2hhcmVkX2Z1dHVyZSYgX19yaHMpIF9OT0VYQ0VQVCB7X1ZTVEQ6OnN3YXAoX19zdGF0ZV8sIF9fcmhzLl9fc3RhdGVfKTt9CisKKyAgICAvLyBmdW5jdGlvbnMgdG8gY2hlY2sgc3RhdGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCB2YWxpZCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fc3RhdGVfICE9IG51bGxwdHI7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgd2FpdCgpIGNvbnN0IHtfX3N0YXRlXy0+d2FpdCgpO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1JlcCwgY2xhc3MgX1BlcmlvZD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBmdXR1cmVfc3RhdHVzCisgICAgICAgIHdhaXRfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcmVsX3RpbWUpIGNvbnN0CisgICAgICAgICAgICB7cmV0dXJuIF9fc3RhdGVfLT53YWl0X2ZvcihfX3JlbF90aW1lKTt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGZ1dHVyZV9zdGF0dXMKKyAgICAgICAgd2FpdF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX2Fic190aW1lKSBjb25zdAorICAgICAgICAgICAge3JldHVybiBfX3N0YXRlXy0+d2FpdF91bnRpbChfX2Fic190aW1lKTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgorc2hhcmVkX2Z1dHVyZTxfUnA+Ojp+c2hhcmVkX2Z1dHVyZSgpCit7CisgICAgaWYgKF9fc3RhdGVfKQorICAgICAgICBfX3N0YXRlXy0+X19yZWxlYXNlX3NoYXJlZCgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgorc2hhcmVkX2Z1dHVyZTxfUnA+Jgorc2hhcmVkX2Z1dHVyZTxfUnA+OjpvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX2Z1dHVyZSYgX19yaHMpIF9OT0VYQ0VQVAoreworICAgIGlmIChfX3Jocy5fX3N0YXRlXykKKyAgICAgICAgX19yaHMuX19zdGF0ZV8tPl9fYWRkX3NoYXJlZCgpOworICAgIGlmIChfX3N0YXRlXykKKyAgICAgICAgX19zdGF0ZV8tPl9fcmVsZWFzZV9zaGFyZWQoKTsKKyAgICBfX3N0YXRlXyA9IF9fcmhzLl9fc3RhdGVfOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHNoYXJlZF9mdXR1cmU8X1JwJj4KK3sKKyAgICBfX2Fzc29jX3N0YXRlPF9ScCY+KiBfX3N0YXRlXzsKKworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaGFyZWRfZnV0dXJlKCkgX05PRVhDRVBUIDogX19zdGF0ZV8obnVsbHB0cikge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2hhcmVkX2Z1dHVyZShjb25zdCBzaGFyZWRfZnV0dXJlJiBfX3JocykgOiBfX3N0YXRlXyhfX3Jocy5fX3N0YXRlXykKKyAgICAgICAge2lmIChfX3N0YXRlXykgX19zdGF0ZV8tPl9fYWRkX3NoYXJlZCgpO30KKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2hhcmVkX2Z1dHVyZShmdXR1cmU8X1JwJj4mJiBfX2YpIF9OT0VYQ0VQVCA6IF9fc3RhdGVfKF9fZi5fX3N0YXRlXykKKyAgICAgICAge19fZi5fX3N0YXRlXyA9IG51bGxwdHI7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaGFyZWRfZnV0dXJlKHNoYXJlZF9mdXR1cmUmJiBfX3JocykgX05PRVhDRVBUIDogX19zdGF0ZV8oX19yaHMuX19zdGF0ZV8pCisgICAgICAgIHtfX3Jocy5fX3N0YXRlXyA9IG51bGxwdHI7fQorI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgIH5zaGFyZWRfZnV0dXJlKCk7CisgICAgc2hhcmVkX2Z1dHVyZSYgb3BlcmF0b3I9KGNvbnN0IHNoYXJlZF9mdXR1cmUmIF9fcmhzKTsKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2hhcmVkX2Z1dHVyZSYgb3BlcmF0b3I9KHNoYXJlZF9mdXR1cmUmJiBfX3JocykgX05PRVhDRVBUCisgICAgICAgIHsKKyAgICAgICAgICAgIHNoYXJlZF9mdXR1cmUoc3RkOjptb3ZlKF9fcmhzKSkuc3dhcCgqdGhpcyk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKworICAgIC8vIHJldHJpZXZpbmcgdGhlIHZhbHVlCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9ScCYgZ2V0KCkgY29uc3Qge3JldHVybiBfX3N0YXRlXy0+Y29weSgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAoc2hhcmVkX2Z1dHVyZSYgX19yaHMpIF9OT0VYQ0VQVCB7X1ZTVEQ6OnN3YXAoX19zdGF0ZV8sIF9fcmhzLl9fc3RhdGVfKTt9CisKKyAgICAvLyBmdW5jdGlvbnMgdG8gY2hlY2sgc3RhdGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCB2YWxpZCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fc3RhdGVfICE9IG51bGxwdHI7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgd2FpdCgpIGNvbnN0IHtfX3N0YXRlXy0+d2FpdCgpO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1JlcCwgY2xhc3MgX1BlcmlvZD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBmdXR1cmVfc3RhdHVzCisgICAgICAgIHdhaXRfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcmVsX3RpbWUpIGNvbnN0CisgICAgICAgICAgICB7cmV0dXJuIF9fc3RhdGVfLT53YWl0X2ZvcihfX3JlbF90aW1lKTt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGZ1dHVyZV9zdGF0dXMKKyAgICAgICAgd2FpdF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX2Fic190aW1lKSBjb25zdAorICAgICAgICAgICAge3JldHVybiBfX3N0YXRlXy0+d2FpdF91bnRpbChfX2Fic190aW1lKTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgorc2hhcmVkX2Z1dHVyZTxfUnAmPjo6fnNoYXJlZF9mdXR1cmUoKQoreworICAgIGlmIChfX3N0YXRlXykKKyAgICAgICAgX19zdGF0ZV8tPl9fcmVsZWFzZV9zaGFyZWQoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9ScD4KK3NoYXJlZF9mdXR1cmU8X1JwJj4mCitzaGFyZWRfZnV0dXJlPF9ScCY+OjpvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX2Z1dHVyZSYgX19yaHMpCit7CisgICAgaWYgKF9fcmhzLl9fc3RhdGVfKQorICAgICAgICBfX3Jocy5fX3N0YXRlXy0+X19hZGRfc2hhcmVkKCk7CisgICAgaWYgKF9fc3RhdGVfKQorICAgICAgICBfX3N0YXRlXy0+X19yZWxlYXNlX3NoYXJlZCgpOworICAgIF9fc3RhdGVfID0gX19yaHMuX19zdGF0ZV87CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8PgorY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBfTElCQ1BQX0FWQUlMQUJJTElUWV9GVVRVUkUgc2hhcmVkX2Z1dHVyZTx2b2lkPgoreworICAgIF9fYXNzb2Nfc3ViX3N0YXRlKiBfX3N0YXRlXzsKKworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaGFyZWRfZnV0dXJlKCkgX05PRVhDRVBUIDogX19zdGF0ZV8obnVsbHB0cikge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2hhcmVkX2Z1dHVyZShjb25zdCBzaGFyZWRfZnV0dXJlJiBfX3JocykgOiBfX3N0YXRlXyhfX3Jocy5fX3N0YXRlXykKKyAgICAgICAge2lmIChfX3N0YXRlXykgX19zdGF0ZV8tPl9fYWRkX3NoYXJlZCgpO30KKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2hhcmVkX2Z1dHVyZShmdXR1cmU8dm9pZD4mJiBfX2YpIF9OT0VYQ0VQVCA6IF9fc3RhdGVfKF9fZi5fX3N0YXRlXykKKyAgICAgICAge19fZi5fX3N0YXRlXyA9IG51bGxwdHI7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaGFyZWRfZnV0dXJlKHNoYXJlZF9mdXR1cmUmJiBfX3JocykgX05PRVhDRVBUIDogX19zdGF0ZV8oX19yaHMuX19zdGF0ZV8pCisgICAgICAgIHtfX3Jocy5fX3N0YXRlXyA9IG51bGxwdHI7fQorI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgIH5zaGFyZWRfZnV0dXJlKCk7CisgICAgc2hhcmVkX2Z1dHVyZSYgb3BlcmF0b3I9KGNvbnN0IHNoYXJlZF9mdXR1cmUmIF9fcmhzKTsKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2hhcmVkX2Z1dHVyZSYgb3BlcmF0b3I9KHNoYXJlZF9mdXR1cmUmJiBfX3JocykgX05PRVhDRVBUCisgICAgICAgIHsKKyAgICAgICAgICAgIHNoYXJlZF9mdXR1cmUoc3RkOjptb3ZlKF9fcmhzKSkuc3dhcCgqdGhpcyk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKworICAgIC8vIHJldHJpZXZpbmcgdGhlIHZhbHVlCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgZ2V0KCkgY29uc3Qge19fc3RhdGVfLT5jb3B5KCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc3dhcChzaGFyZWRfZnV0dXJlJiBfX3JocykgX05PRVhDRVBUIHtfVlNURDo6c3dhcChfX3N0YXRlXywgX19yaHMuX19zdGF0ZV8pO30KKworICAgIC8vIGZ1bmN0aW9ucyB0byBjaGVjayBzdGF0ZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIHZhbGlkKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX19zdGF0ZV8gIT0gbnVsbHB0cjt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCB3YWl0KCkgY29uc3Qge19fc3RhdGVfLT53YWl0KCk7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfUmVwLCBjbGFzcyBfUGVyaW9kPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGZ1dHVyZV9zdGF0dXMKKyAgICAgICAgd2FpdF9mb3IoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19yZWxfdGltZSkgY29uc3QKKyAgICAgICAgICAgIHtyZXR1cm4gX19zdGF0ZV8tPndhaXRfZm9yKF9fcmVsX3RpbWUpO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0Nsb2NrLCBjbGFzcyBfRHVyYXRpb24+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZnV0dXJlX3N0YXR1cworICAgICAgICB3YWl0X3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYWJzX3RpbWUpIGNvbnN0CisgICAgICAgICAgICB7cmV0dXJuIF9fc3RhdGVfLT53YWl0X3VudGlsKF9fYWJzX3RpbWUpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChzaGFyZWRfZnV0dXJlPF9ScD4mIF9feCwgc2hhcmVkX2Z1dHVyZTxfUnA+JiBfX3kpIF9OT0VYQ0VQVAoreworICAgIF9feC5zd2FwKF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUnA+CitpbmxpbmUKK3NoYXJlZF9mdXR1cmU8X1JwPgorZnV0dXJlPF9ScD46OnNoYXJlKCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIHNoYXJlZF9mdXR1cmU8X1JwPihfVlNURDo6bW92ZSgqdGhpcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwPgoraW5saW5lCitzaGFyZWRfZnV0dXJlPF9ScCY+CitmdXR1cmU8X1JwJj46OnNoYXJlKCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIHNoYXJlZF9mdXR1cmU8X1JwJj4oX1ZTVEQ6Om1vdmUoKnRoaXMpKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworCitpbmxpbmUKK3NoYXJlZF9mdXR1cmU8dm9pZD4KK2Z1dHVyZTx2b2lkPjo6c2hhcmUoKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gc2hhcmVkX2Z1dHVyZTx2b2lkPihfVlNURDo6bW92ZSgqdGhpcykpOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmIC8vICFfTElCQ1BQX0hBU19OT19USFJFQURTCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9GVVRVUkUKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9pbml0aWFsaXplcl9saXN0IGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2luaXRpYWxpemVyX2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyMzRhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9pbml0aWFsaXplcl9saXN0CkBAIC0wLDAgKzEsMTE4IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpbml0aWFsaXplcl9saXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0lOSVRJQUxJWkVSX0xJU1QKKyNkZWZpbmUgX0xJQkNQUF9JTklUSUFMSVpFUl9MSVNUCisKKy8qCisgICAgaW5pdGlhbGl6ZXJfbGlzdCBzeW5vcHNpcworCituYW1lc3BhY2Ugc3RkCit7CisKK3RlbXBsYXRlPGNsYXNzIEU+CitjbGFzcyBpbml0aWFsaXplcl9saXN0Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBFICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgY29uc3QgRSYgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgRSYgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgc2l6ZV90ICAgc2l6ZV90eXBlOworCisgICAgdHlwZWRlZiBjb25zdCBFKiBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIGNvbnN0IEUqIGNvbnN0X2l0ZXJhdG9yOworCisgICAgaW5pdGlhbGl6ZXJfbGlzdCgpIG5vZXhjZXB0OyAvLyBjb25zdGV4cHIgaW4gQysrMTQKKworICAgIHNpemVfdCAgIHNpemUoKSAgY29uc3Qgbm9leGNlcHQ7IC8vIGNvbnN0ZXhwciBpbiBDKysxNAorICAgIGNvbnN0IEUqIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQ7IC8vIGNvbnN0ZXhwciBpbiBDKysxNAorICAgIGNvbnN0IEUqIGVuZCgpICAgY29uc3Qgbm9leGNlcHQ7IC8vIGNvbnN0ZXhwciBpbiBDKysxNAorfTsKKwordGVtcGxhdGU8Y2xhc3MgRT4gY29uc3QgRSogYmVnaW4oaW5pdGlhbGl6ZXJfbGlzdDxFPiBpbCkgbm9leGNlcHQ7IC8vIGNvbnN0ZXhwciBpbiBDKysxNAordGVtcGxhdGU8Y2xhc3MgRT4gY29uc3QgRSogZW5kKGluaXRpYWxpemVyX2xpc3Q8RT4gaWwpIG5vZXhjZXB0OyAvLyBjb25zdGV4cHIgaW4gQysrMTQKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxjc3RkZGVmPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCAgLy8gcHVycG9zZWZ1bGx5IG5vdCB2ZXJzaW9uZWQKK3sKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGU8Y2xhc3MgX0VwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgaW5pdGlhbGl6ZXJfbGlzdAoreworICAgIGNvbnN0IF9FcCogX19iZWdpbl87CisgICAgc2l6ZV90ICAgIF9fc2l6ZV87CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorICAgIGluaXRpYWxpemVyX2xpc3QoY29uc3QgX0VwKiBfX2IsIHNpemVfdCBfX3MpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fYmVnaW5fKF9fYiksCisgICAgICAgICAgX19zaXplXyhfX3MpCisgICAgICAgIHt9CitwdWJsaWM6CisgICAgdHlwZWRlZiBfRXAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBjb25zdCBfRXAmIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IF9FcCYgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgc2l6ZV90ICAgIHNpemVfdHlwZTsKKworICAgIHR5cGVkZWYgY29uc3QgX0VwKiBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIGNvbnN0IF9FcCogY29uc3RfaXRlcmF0b3I7CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorICAgIGluaXRpYWxpemVyX2xpc3QoKSBfTk9FWENFUFQgOiBfX2JlZ2luXyhudWxscHRyKSwgX19zaXplXygwKSB7fQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICBzaXplX3QgICAgc2l6ZSgpICBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3NpemVfO30KKyAgICAKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorICAgIGNvbnN0IF9FcCogYmVnaW4oKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX2JlZ2luXzt9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorICAgIGNvbnN0IF9FcCogZW5kKCkgICBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX2JlZ2luXyArIF9fc2l6ZV87fQorfTsKKwordGVtcGxhdGU8Y2xhc3MgX0VwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitjb25zdCBfRXAqCitiZWdpbihpbml0aWFsaXplcl9saXN0PF9FcD4gX19pbCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9faWwuYmVnaW4oKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0VwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitjb25zdCBfRXAqCitlbmQoaW5pdGlhbGl6ZXJfbGlzdDxfRXA+IF9faWwpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX2lsLmVuZCgpOworfQorCisjZW5kaWYgIC8vICFkZWZpbmVkKF9MSUJDUFBfQ1hYMDNfTEFORykKKworfSAgLy8gc3RkCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9JTklUSUFMSVpFUl9MSVNUCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvaW50dHlwZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9pbnR0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OGY1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvaW50dHlwZXMuaApAQCAtMCwwICsxLDI1OCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGludHR5cGVzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9JTlRUWVBFU19ICisjZGVmaW5lIF9MSUJDUFBfSU5UVFlQRVNfSAorCisvKgorICAgIGludHR5cGVzLmggc3lub3BzaXMKKworVGhpcyBlbnRpcmUgaGVhZGVyIGlzIEM5OSAvIEMrKzBYCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4gIC8vIDxjaW50dHlwZXM+IGluY2x1ZGVzIDxjc3RkaW50PgorCitNYWNyb3M6CisKKyAgICBQUklkOAorICAgIFBSSWQxNgorICAgIFBSSWQzMgorICAgIFBSSWQ2NAorCisgICAgUFJJZExFQVNUOAorICAgIFBSSWRMRUFTVDE2CisgICAgUFJJZExFQVNUMzIKKyAgICBQUklkTEVBU1Q2NAorCisgICAgUFJJZEZBU1Q4CisgICAgUFJJZEZBU1QxNgorICAgIFBSSWRGQVNUMzIKKyAgICBQUklkRkFTVDY0CisKKyAgICBQUklkTUFYCisgICAgUFJJZFBUUgorCisgICAgUFJJaTgKKyAgICBQUklpMTYKKyAgICBQUklpMzIKKyAgICBQUklpNjQKKworICAgIFBSSWlMRUFTVDgKKyAgICBQUklpTEVBU1QxNgorICAgIFBSSWlMRUFTVDMyCisgICAgUFJJaUxFQVNUNjQKKworICAgIFBSSWlGQVNUOAorICAgIFBSSWlGQVNUMTYKKyAgICBQUklpRkFTVDMyCisgICAgUFJJaUZBU1Q2NAorCisgICAgUFJJaU1BWAorICAgIFBSSWlQVFIKKworICAgIFBSSW84CisgICAgUFJJbzE2CisgICAgUFJJbzMyCisgICAgUFJJbzY0CisKKyAgICBQUklvTEVBU1Q4CisgICAgUFJJb0xFQVNUMTYKKyAgICBQUklvTEVBU1QzMgorICAgIFBSSW9MRUFTVDY0CisKKyAgICBQUklvRkFTVDgKKyAgICBQUklvRkFTVDE2CisgICAgUFJJb0ZBU1QzMgorICAgIFBSSW9GQVNUNjQKKworICAgIFBSSW9NQVgKKyAgICBQUklvUFRSCisKKyAgICBQUkl1OAorICAgIFBSSXUxNgorICAgIFBSSXUzMgorICAgIFBSSXU2NAorCisgICAgUFJJdUxFQVNUOAorICAgIFBSSXVMRUFTVDE2CisgICAgUFJJdUxFQVNUMzIKKyAgICBQUkl1TEVBU1Q2NAorCisgICAgUFJJdUZBU1Q4CisgICAgUFJJdUZBU1QxNgorICAgIFBSSXVGQVNUMzIKKyAgICBQUkl1RkFTVDY0CisKKyAgICBQUkl1TUFYCisgICAgUFJJdVBUUgorCisgICAgUFJJeDgKKyAgICBQUkl4MTYKKyAgICBQUkl4MzIKKyAgICBQUkl4NjQKKworICAgIFBSSXhMRUFTVDgKKyAgICBQUkl4TEVBU1QxNgorICAgIFBSSXhMRUFTVDMyCisgICAgUFJJeExFQVNUNjQKKworICAgIFBSSXhGQVNUOAorICAgIFBSSXhGQVNUMTYKKyAgICBQUkl4RkFTVDMyCisgICAgUFJJeEZBU1Q2NAorCisgICAgUFJJeE1BWAorICAgIFBSSXhQVFIKKworICAgIFBSSVg4CisgICAgUFJJWDE2CisgICAgUFJJWDMyCisgICAgUFJJWDY0CisKKyAgICBQUklYTEVBU1Q4CisgICAgUFJJWExFQVNUMTYKKyAgICBQUklYTEVBU1QzMgorICAgIFBSSVhMRUFTVDY0CisKKyAgICBQUklYRkFTVDgKKyAgICBQUklYRkFTVDE2CisgICAgUFJJWEZBU1QzMgorICAgIFBSSVhGQVNUNjQKKworICAgIFBSSVhNQVgKKyAgICBQUklYUFRSCisKKyAgICBTQ05kOAorICAgIFNDTmQxNgorICAgIFNDTmQzMgorICAgIFNDTmQ2NAorCisgICAgU0NOZExFQVNUOAorICAgIFNDTmRMRUFTVDE2CisgICAgU0NOZExFQVNUMzIKKyAgICBTQ05kTEVBU1Q2NAorCisgICAgU0NOZEZBU1Q4CisgICAgU0NOZEZBU1QxNgorICAgIFNDTmRGQVNUMzIKKyAgICBTQ05kRkFTVDY0CisKKyAgICBTQ05kTUFYCisgICAgU0NOZFBUUgorCisgICAgU0NOaTgKKyAgICBTQ05pMTYKKyAgICBTQ05pMzIKKyAgICBTQ05pNjQKKworICAgIFNDTmlMRUFTVDgKKyAgICBTQ05pTEVBU1QxNgorICAgIFNDTmlMRUFTVDMyCisgICAgU0NOaUxFQVNUNjQKKworICAgIFNDTmlGQVNUOAorICAgIFNDTmlGQVNUMTYKKyAgICBTQ05pRkFTVDMyCisgICAgU0NOaUZBU1Q2NAorCisgICAgU0NOaU1BWAorICAgIFNDTmlQVFIKKworICAgIFNDTm84CisgICAgU0NObzE2CisgICAgU0NObzMyCisgICAgU0NObzY0CisKKyAgICBTQ05vTEVBU1Q4CisgICAgU0NOb0xFQVNUMTYKKyAgICBTQ05vTEVBU1QzMgorICAgIFNDTm9MRUFTVDY0CisKKyAgICBTQ05vRkFTVDgKKyAgICBTQ05vRkFTVDE2CisgICAgU0NOb0ZBU1QzMgorICAgIFNDTm9GQVNUNjQKKworICAgIFNDTm9NQVgKKyAgICBTQ05vUFRSCisKKyAgICBTQ051OAorICAgIFNDTnUxNgorICAgIFNDTnUzMgorICAgIFNDTnU2NAorCisgICAgU0NOdUxFQVNUOAorICAgIFNDTnVMRUFTVDE2CisgICAgU0NOdUxFQVNUMzIKKyAgICBTQ051TEVBU1Q2NAorCisgICAgU0NOdUZBU1Q4CisgICAgU0NOdUZBU1QxNgorICAgIFNDTnVGQVNUMzIKKyAgICBTQ051RkFTVDY0CisKKyAgICBTQ051TUFYCisgICAgU0NOdVBUUgorCisgICAgU0NOeDgKKyAgICBTQ054MTYKKyAgICBTQ054MzIKKyAgICBTQ054NjQKKworICAgIFNDTnhMRUFTVDgKKyAgICBTQ054TEVBU1QxNgorICAgIFNDTnhMRUFTVDMyCisgICAgU0NOeExFQVNUNjQKKworICAgIFNDTnhGQVNUOAorICAgIFNDTnhGQVNUMTYKKyAgICBTQ054RkFTVDMyCisgICAgU0NOeEZBU1Q2NAorCisgICAgU0NOeE1BWAorICAgIFNDTnhQVFIKKworVHlwZXM6CisKKyAgICBpbWF4ZGl2X3QKKworaW50bWF4X3QgIGltYXhhYnMoaW50bWF4X3Qgaik7CitpbWF4ZGl2X3QgaW1heGRpdihpbnRtYXhfdCBudW1lciwgaW50bWF4X3QgZGVub20pOworaW50bWF4X3QgIHN0cnRvaW1heChjb25zdCBjaGFyKiByZXN0cmljdCBucHRyLCBjaGFyKiogcmVzdHJpY3QgZW5kcHRyLCBpbnQgYmFzZSk7Cit1aW50bWF4X3Qgc3RydG91bWF4KGNvbnN0IGNoYXIqIHJlc3RyaWN0IG5wdHIsIGNoYXIqKiByZXN0cmljdCBlbmRwdHIsIGludCBiYXNlKTsKK2ludG1heF90ICB3Y3N0b2ltYXgoY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgbnB0ciwgd2NoYXJfdCoqIHJlc3RyaWN0IGVuZHB0ciwgaW50IGJhc2UpOwordWludG1heF90IHdjc3RvdW1heChjb25zdCB3Y2hhcl90KiByZXN0cmljdCBucHRyLCB3Y2hhcl90KiogcmVzdHJpY3QgZW5kcHRyLCBpbnQgYmFzZSk7CisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKKy8qIEM5OSBzdGRsaWIgKGUuZy4gZ2xpYmMgPCAyLjE4KSBkb2VzIG5vdCBwcm92aWRlIGZvcm1hdCBtYWNyb3MgbmVlZGVkCisgICBmb3IgQysrMTEgdW5sZXNzIF9fU1REQ19GT1JNQVRfTUFDUk9TIGlzIGRlZmluZWQKKyovCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoX19TVERDX0ZPUk1BVF9NQUNST1MpCisjICAgZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjZW5kaWYKKworI2luY2x1ZGVfbmV4dCA8aW50dHlwZXMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI3VuZGVmIGltYXhhYnMKKyN1bmRlZiBpbWF4ZGl2CisKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgIC8vIF9MSUJDUFBfSU5UVFlQRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2lvbWFuaXAgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvaW9tYW5pcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmJlZTczCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2lvbWFuaXAKQEAgLTAsMCArMSw2NzAgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpb21hbmlwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfSU9NQU5JUAorI2RlZmluZSBfTElCQ1BQX0lPTUFOSVAKKworLyoKKyAgICBpb21hbmlwIHN5bm9wc2lzCisKK25hbWVzcGFjZSBzdGQgeworCisvLyB0eXBlcyBUMSwgVDIsIC4uLiBhcmUgdW5zcGVjaWZpZWQgaW1wbGVtZW50YXRpb24gdHlwZXMKK1QxIHJlc2V0aW9zZmxhZ3MoaW9zX2Jhc2U6OmZtdGZsYWdzIG1hc2spOworVDIgc2V0aW9zZmxhZ3MgKGlvc19iYXNlOjpmbXRmbGFncyBtYXNrKTsKK1QzIHNldGJhc2UoaW50IGJhc2UpOwordGVtcGxhdGU8Y2hhclQ+IFQ0IHNldGZpbGwoY2hhclQgYyk7CitUNSBzZXRwcmVjaXNpb24oaW50IG4pOworVDYgc2V0dyhpbnQgbik7Cit0ZW1wbGF0ZSA8Y2xhc3MgbW9uZXlUPiBUNyBnZXRfbW9uZXkobW9uZXlUJiBtb24sIGJvb2wgaW50bCA9IGZhbHNlKTsKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgbW9uZXlUPiBUOCBwdXRfbW9uZXkoY29uc3QgbW9uZXlUJiBtb24sIGJvb2wgaW50bCA9IGZhbHNlKTsKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVD4gVDkgZ2V0X3RpbWUoc3RydWN0IHRtKiB0bWIsIGNvbnN0IGNoYXJUKiBmbXQpOwordGVtcGxhdGUgPGNsYXNzIGNoYXJUPiBUMTAgcHV0X3RpbWUoY29uc3Qgc3RydWN0IHRtKiB0bWIsIGNvbnN0IGNoYXJUKiBmbXQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+CisgIFQxMSBxdW90ZWQoY29uc3QgY2hhclQqIHMsIGNoYXJUIGRlbGltPWNoYXJUKCciJyksIGNoYXJUIGVzY2FwZT1jaGFyVCgnXFwnKSk7IC8vIEMrKzE0CisKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CisgIFQxMiBxdW90ZWQoY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHMsCisgICAgICAgICAgICAgY2hhclQgZGVsaW09Y2hhclQoJyInKSwgY2hhclQgZXNjYXBlPWNoYXJUKCdcXCcpKTsgLy8gQysrMTQKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KKyAgVDEzIHF1b3RlZChiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgcywKKyAgICAgICAgICAgICBjaGFyVCBkZWxpbT1jaGFyVCgnIicpLCBjaGFyVCBlc2NhcGU9Y2hhclQoJ1xcJykpOyAvLyBDKysxNAorCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPF9fc3RyaW5nPgorI2luY2x1ZGUgPGlzdHJlYW0+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKworLy8gcmVzZXRpb3NmbGFncworCitjbGFzcyBfX2lvbV90MQoreworICAgIGlvc19iYXNlOjpmbXRmbGFncyBfX21hc2tfOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2lvbV90MShpb3NfYmFzZTo6Zm10ZmxhZ3MgX19tKSA6IF9fbWFza18oX19tKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICBmcmllbmQKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCBjb25zdCBfX2lvbV90MSYgX194KQorICAgIHsKKyAgICAgICAgX19pcy51bnNldGYoX194Ll9fbWFza18pOworICAgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorICAgIGZyaWVuZAorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIGNvbnN0IF9faW9tX3QxJiBfX3gpCisgICAgeworICAgICAgICBfX29zLnVuc2V0ZihfX3guX19tYXNrXyk7CisgICAgICAgIHJldHVybiBfX29zOworICAgIH0KK307CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfX2lvbV90MQorcmVzZXRpb3NmbGFncyhpb3NfYmFzZTo6Zm10ZmxhZ3MgX19tYXNrKQoreworICAgIHJldHVybiBfX2lvbV90MShfX21hc2spOworfQorCisvLyBzZXRpb3NmbGFncworCitjbGFzcyBfX2lvbV90MgoreworICAgIGlvc19iYXNlOjpmbXRmbGFncyBfX21hc2tfOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2lvbV90Mihpb3NfYmFzZTo6Zm10ZmxhZ3MgX19tKSA6IF9fbWFza18oX19tKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICBmcmllbmQKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCBjb25zdCBfX2lvbV90MiYgX194KQorICAgIHsKKyAgICAgICAgX19pcy5zZXRmKF9feC5fX21hc2tfKTsKKyAgICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICBmcmllbmQKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBfX2lvbV90MiYgX194KQorICAgIHsKKyAgICAgICAgX19vcy5zZXRmKF9feC5fX21hc2tfKTsKKyAgICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorfTsKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19faW9tX3QyCitzZXRpb3NmbGFncyhpb3NfYmFzZTo6Zm10ZmxhZ3MgX19tYXNrKQoreworICAgIHJldHVybiBfX2lvbV90MihfX21hc2spOworfQorCisvLyBzZXRiYXNlCisKK2NsYXNzIF9faW9tX3QzCit7CisgICAgaW50IF9fYmFzZV87CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9faW9tX3QzKGludCBfX2IpIDogX19iYXNlXyhfX2IpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorICAgIGZyaWVuZAorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIGNvbnN0IF9faW9tX3QzJiBfX3gpCisgICAgeworICAgICAgICBfX2lzLnNldGYoX194Ll9fYmFzZV8gPT0gOCAgPyBpb3NfYmFzZTo6b2N0IDoKKyAgICAgICAgICAgICAgICAgIF9feC5fX2Jhc2VfID09IDEwID8gaW9zX2Jhc2U6OmRlYyA6CisgICAgICAgICAgICAgICAgICBfX3guX19iYXNlXyA9PSAxNiA/IGlvc19iYXNlOjpoZXggOgorICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6OmZtdGZsYWdzKDApLCBpb3NfYmFzZTo6YmFzZWZpZWxkKTsKKyAgICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICBmcmllbmQKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBfX2lvbV90MyYgX194KQorICAgIHsKKyAgICAgICAgX19vcy5zZXRmKF9feC5fX2Jhc2VfID09IDggID8gaW9zX2Jhc2U6Om9jdCA6CisgICAgICAgICAgICAgICAgICBfX3guX19iYXNlXyA9PSAxMCA/IGlvc19iYXNlOjpkZWMgOgorICAgICAgICAgICAgICAgICAgX194Ll9fYmFzZV8gPT0gMTYgPyBpb3NfYmFzZTo6aGV4IDoKKyAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpmbXRmbGFncygwKSwgaW9zX2Jhc2U6OmJhc2VmaWVsZCk7CisgICAgICAgIHJldHVybiBfX29zOworICAgIH0KK307CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfX2lvbV90Mworc2V0YmFzZShpbnQgX19iYXNlKQoreworICAgIHJldHVybiBfX2lvbV90MyhfX2Jhc2UpOworfQorCisvLyBzZXRmaWxsCisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVD4KK2NsYXNzIF9faW9tX3Q0Cit7CisgICAgX0NoYXJUIF9fZmlsbF87CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9faW9tX3Q0KF9DaGFyVCBfX2MpIDogX19maWxsXyhfX2MpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KKyAgICBmcmllbmQKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBfX2lvbV90NCYgX194KQorICAgIHsKKyAgICAgICAgX19vcy5maWxsKF9feC5fX2ZpbGxfKTsKKyAgICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorfTsKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJUPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19faW9tX3Q0PF9DaGFyVD4KK3NldGZpbGwoX0NoYXJUIF9fYykKK3sKKyAgICByZXR1cm4gX19pb21fdDQ8X0NoYXJUPihfX2MpOworfQorCisvLyBzZXRwcmVjaXNpb24KKworY2xhc3MgX19pb21fdDUKK3sKKyAgICBpbnQgX19uXzsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19pb21fdDUoaW50IF9fbikgOiBfX25fKF9fbikge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisgICAgZnJpZW5kCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgY29uc3QgX19pb21fdDUmIF9feCkKKyAgICB7CisgICAgICAgIF9faXMucHJlY2lzaW9uKF9feC5fX25fKTsKKyAgICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICBmcmllbmQKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBfX2lvbV90NSYgX194KQorICAgIHsKKyAgICAgICAgX19vcy5wcmVjaXNpb24oX194Ll9fbl8pOworICAgICAgICByZXR1cm4gX19vczsKKyAgICB9Cit9OworCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX19pb21fdDUKK3NldHByZWNpc2lvbihpbnQgX19uKQoreworICAgIHJldHVybiBfX2lvbV90NShfX24pOworfQorCisvLyBzZXR3CisKK2NsYXNzIF9faW9tX3Q2Cit7CisgICAgaW50IF9fbl87CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9faW9tX3Q2KGludCBfX24pIDogX19uXyhfX24pIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorICAgIGZyaWVuZAorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIGNvbnN0IF9faW9tX3Q2JiBfX3gpCisgICAgeworICAgICAgICBfX2lzLndpZHRoKF9feC5fX25fKTsKKyAgICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICBmcmllbmQKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBfX2lvbV90NiYgX194KQorICAgIHsKKyAgICAgICAgX19vcy53aWR0aChfX3guX19uXyk7CisgICAgICAgIHJldHVybiBfX29zOworICAgIH0KK307CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfX2lvbV90Ngorc2V0dyhpbnQgX19uKQoreworICAgIHJldHVybiBfX2lvbV90NihfX24pOworfQorCisvLyBnZXRfbW9uZXkKKwordGVtcGxhdGUgPGNsYXNzIF9Nb25leVQ+IGNsYXNzIF9faW9tX3Q3OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfTW9uZXlUPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIGNvbnN0IF9faW9tX3Q3PF9Nb25leVQ+JiBfX3gpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX01vbmV5VD4KK2NsYXNzIF9faW9tX3Q3Cit7CisgICAgX01vbmV5VCYgX19tb25fOworICAgIGJvb2wgX19pbnRsXzsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19pb21fdDcoX01vbmV5VCYgX19tb24sIGJvb2wgX19pbnRsKQorICAgICAgICA6IF9fbW9uXyhfX21vbiksIF9faW50bF8oX19pbnRsKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX01wPgorICAgIGZyaWVuZAorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgY29uc3QgX19pb21fdDc8X01wPiYgX194KTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9Nb25leVQ+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgY29uc3QgX19pb21fdDc8X01vbmV5VD4mIF9feCkKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnkgX19zKF9faXMpOworICAgICAgICBpZiAoX19zKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiBfSXA7CisgICAgICAgICAgICB0eXBlZGVmIG1vbmV5X2dldDxfQ2hhclQsIF9JcD4gX0ZwOworICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgICAgICAgIGNvbnN0IF9GcCYgX19tZiA9IHVzZV9mYWNldDxfRnA+KF9faXMuZ2V0bG9jKCkpOworICAgICAgICAgICAgX19tZi5nZXQoX0lwKF9faXMpLCBfSXAoKSwgX194Ll9faW50bF8sIF9faXMsIF9fZXJyLCBfX3guX19tb25fKTsKKyAgICAgICAgICAgIF9faXMuc2V0c3RhdGUoX19lcnIpOworICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgX19pcy5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiBfX2lzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX01vbmV5VD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfX2lvbV90NzxfTW9uZXlUPgorZ2V0X21vbmV5KF9Nb25leVQmIF9fbW9uLCBib29sIF9faW50bCA9IGZhbHNlKQoreworICAgIHJldHVybiBfX2lvbV90NzxfTW9uZXlUPihfX21vbiwgX19pbnRsKTsKK30KKworLy8gcHV0X21vbmV5CisKK3RlbXBsYXRlIDxjbGFzcyBfTW9uZXlUPiBjbGFzcyBfX2lvbV90ODsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX01vbmV5VD4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBfX2lvbV90ODxfTW9uZXlUPiYgX194KTsKKwordGVtcGxhdGUgPGNsYXNzIF9Nb25leVQ+CitjbGFzcyBfX2lvbV90OAoreworICAgIGNvbnN0IF9Nb25leVQmIF9fbW9uXzsKKyAgICBib29sIF9faW50bF87CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faW9tX3Q4KGNvbnN0IF9Nb25leVQmIF9fbW9uLCBib29sIF9faW50bCkKKyAgICAgICAgOiBfX21vbl8oX19tb24pLCBfX2ludGxfKF9faW50bCkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9NcD4KKyAgICBmcmllbmQKKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIGNvbnN0IF9faW9tX3Q4PF9NcD4mIF9feCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfTW9uZXlUPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIGNvbnN0IF9faW9tX3Q4PF9Nb25leVQ+JiBfX3gpCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHR5cGVuYW1lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c2VudHJ5IF9fcyhfX29zKTsKKyAgICAgICAgaWYgKF9fcykKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZWRlZiBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4gX09wOworICAgICAgICAgICAgdHlwZWRlZiBtb25leV9wdXQ8X0NoYXJULCBfT3A+IF9GcDsKKyAgICAgICAgICAgIGNvbnN0IF9GcCYgX19tZiA9IHVzZV9mYWNldDxfRnA+KF9fb3MuZ2V0bG9jKCkpOworICAgICAgICAgICAgaWYgKF9fbWYucHV0KF9PcChfX29zKSwgX194Ll9faW50bF8sIF9fb3MsIF9fb3MuZmlsbCgpLCBfX3guX19tb25fKS5mYWlsZWQoKSkKKyAgICAgICAgICAgICAgICBfX29zLnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgX19vcy5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX01vbmV5VD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfX2lvbV90ODxfTW9uZXlUPgorcHV0X21vbmV5KGNvbnN0IF9Nb25leVQmIF9fbW9uLCBib29sIF9faW50bCA9IGZhbHNlKQoreworICAgIHJldHVybiBfX2lvbV90ODxfTW9uZXlUPihfX21vbiwgX19pbnRsKTsKK30KKworLy8gZ2V0X3RpbWUKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4gY2xhc3MgX19pb21fdDk7CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgY29uc3QgX19pb21fdDk8X0NoYXJUPiYgX194KTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2NsYXNzIF9faW9tX3Q5Cit7CisgICAgdG0qIF9fdG1fOworICAgIGNvbnN0IF9DaGFyVCogX19mbXRfOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2lvbV90OSh0bSogX190bSwgY29uc3QgX0NoYXJUKiBfX2ZtdCkKKyAgICAgICAgOiBfX3RtXyhfX3RtKSwgX19mbXRfKF9fZm10KSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DcCwgY2xhc3MgX1RyYWl0cz4KKyAgICBmcmllbmQKKyAgICBiYXNpY19pc3RyZWFtPF9DcCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DcCwgX1RyYWl0cz4mIF9faXMsIGNvbnN0IF9faW9tX3Q5PF9DcD4mIF9feCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIGNvbnN0IF9faW9tX3Q5PF9DaGFyVD4mIF9feCkKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnkgX19zKF9faXMpOworICAgICAgICBpZiAoX19zKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiBfSXA7CisgICAgICAgICAgICB0eXBlZGVmIHRpbWVfZ2V0PF9DaGFyVCwgX0lwPiBfRnA7CisgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgICAgICAgY29uc3QgX0ZwJiBfX3RmID0gdXNlX2ZhY2V0PF9GcD4oX19pcy5nZXRsb2MoKSk7CisgICAgICAgICAgICBfX3RmLmdldChfSXAoX19pcyksIF9JcCgpLCBfX2lzLCBfX2VyciwgX194Ll9fdG1fLAorICAgICAgICAgICAgICAgICAgICAgX194Ll9fZm10XywgX194Ll9fZm10XyArIF9UcmFpdHM6Omxlbmd0aChfX3guX19mbXRfKSk7CisgICAgICAgICAgICBfX2lzLnNldHN0YXRlKF9fZXJyKTsKKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIF9faXMuX19zZXRfYmFkYml0X2FuZF9jb25zaWRlcl9yZXRocm93KCk7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICByZXR1cm4gX19pczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfX2lvbV90OTxfQ2hhclQ+CitnZXRfdGltZSh0bSogX190bSwgY29uc3QgX0NoYXJUKiBfX2ZtdCkKK3sKKyAgICByZXR1cm4gX19pb21fdDk8X0NoYXJUPihfX3RtLCBfX2ZtdCk7Cit9CisKKy8vIHB1dF90aW1lCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+IGNsYXNzIF9faW9tX3QxMDsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBfX2lvbV90MTA8X0NoYXJUPiYgX194KTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2NsYXNzIF9faW9tX3QxMAoreworICAgIGNvbnN0IHRtKiBfX3RtXzsKKyAgICBjb25zdCBfQ2hhclQqIF9fZm10XzsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19pb21fdDEwKGNvbnN0IHRtKiBfX3RtLCBjb25zdCBfQ2hhclQqIF9fZm10KQorICAgICAgICA6IF9fdG1fKF9fdG0pLCBfX2ZtdF8oX19mbXQpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0NwLCBjbGFzcyBfVHJhaXRzPgorICAgIGZyaWVuZAorICAgIGJhc2ljX29zdHJlYW08X0NwLCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NwLCBfVHJhaXRzPiYgX19vcywgY29uc3QgX19pb21fdDEwPF9DcD4mIF9feCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIGNvbnN0IF9faW9tX3QxMDxfQ2hhclQ+JiBfX3gpCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHR5cGVuYW1lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c2VudHJ5IF9fcyhfX29zKTsKKyAgICAgICAgaWYgKF9fcykKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZWRlZiBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4gX09wOworICAgICAgICAgICAgdHlwZWRlZiB0aW1lX3B1dDxfQ2hhclQsIF9PcD4gX0ZwOworICAgICAgICAgICAgY29uc3QgX0ZwJiBfX3RmID0gdXNlX2ZhY2V0PF9GcD4oX19vcy5nZXRsb2MoKSk7CisgICAgICAgICAgICBpZiAoX190Zi5wdXQoX09wKF9fb3MpLCBfX29zLCBfX29zLmZpbGwoKSwgX194Ll9fdG1fLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9feC5fX2ZtdF8sIF9feC5fX2ZtdF8gKyBfVHJhaXRzOjpsZW5ndGgoX194Ll9fZm10XykpLmZhaWxlZCgpKQorICAgICAgICAgICAgICAgIF9fb3Muc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICBfX29zLl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuIF9fb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX19pb21fdDEwPF9DaGFyVD4KK3B1dF90aW1lKGNvbnN0IHRtKiBfX3RtLCBjb25zdCBfQ2hhclQqIF9fZm10KQoreworICAgIHJldHVybiBfX2lvbV90MTA8X0NoYXJUPihfX3RtLCBfX2ZtdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAmCitfX3F1b3RlZF9vdXRwdXQgKCBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gJl9fb3MsIAorICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfQ2hhclQgX19kZWxpbSwgX0NoYXJUIF9fZXNjYXBlICkKK3sKKyAgICBfVlNURDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cz4gX19zdHI7CisgICAgX19zdHIucHVzaF9iYWNrKF9fZGVsaW0pOworICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrIF9fZmlyc3QgKQorICAgIHsKKyAgICAgICAgaWYgKF9UcmFpdHM6OmVxICgqX19maXJzdCwgX19lc2NhcGUpIHx8IF9UcmFpdHM6OmVxICgqX19maXJzdCwgX19kZWxpbSkpCisgICAgICAgICAgICBfX3N0ci5wdXNoX2JhY2soX19lc2NhcGUpOworICAgICAgICBfX3N0ci5wdXNoX2JhY2soKl9fZmlyc3QpOworICAgIH0KKyAgICBfX3N0ci5wdXNoX2JhY2soX19kZWxpbSk7CisgICAgcmV0dXJuIF9fcHV0X2NoYXJhY3Rlcl9zZXF1ZW5jZShfX29zLCBfX3N0ci5kYXRhKCksIF9fc3RyLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9TdHJpbmc+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gJgorX19xdW90ZWRfaW5wdXQgKCBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gJl9faXMsIF9TdHJpbmcgJiBfX3N0cmluZywgX0NoYXJUIF9fZGVsaW0sIF9DaGFyVCBfX2VzY2FwZSApCit7CisgICAgX19zdHJpbmcuY2xlYXIgKCk7CisgICAgX0NoYXJUIF9fYzsKKyAgICBfX2lzID4+IF9fYzsKKyAgICBpZiAoIF9faXMuZmFpbCAoKSkKKyAgICAgICAgcmV0dXJuIF9faXM7CisKKyAgICBpZiAoIV9UcmFpdHM6OmVxIChfX2MsIF9fZGVsaW0pKSAgICAvLyBubyBkZWxpbWl0ZXIsIHJlYWQgdGhlIHdob2xlIHN0cmluZworICAgIHsKKyAgICAgICAgX19pcy51bmdldCAoKTsKKyAgICAgICAgX19pcyA+PiBfX3N0cmluZzsKKyAgICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisgICAgX19zYXZlX2ZsYWdzPF9DaGFyVCwgX1RyYWl0cz4gc2YoX19pcyk7CisgICAgbm9za2lwd3MgKF9faXMpOworICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgIF9faXMgPj4gX19jOworICAgICAgICBpZiAoIF9faXMuZmFpbCAoKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoX1RyYWl0czo6ZXEgKF9fYywgX19lc2NhcGUpKQorICAgICAgICB7CisgICAgICAgICAgICBfX2lzID4+IF9fYzsKKyAgICAgICAgICAgIGlmICggX19pcy5mYWlsICgpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKF9UcmFpdHM6OmVxIChfX2MsIF9fZGVsaW0pKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIF9fc3RyaW5nLnB1c2hfYmFjayAoIF9fYyApOworICAgICAgICB9CisgICAgcmV0dXJuIF9faXM7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0l0ZXI+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIG9wZXJhdG9yPDwoCisgICAgICAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIAorICAgICAgICAgY29uc3QgX19xdW90ZWRfb3V0cHV0X3Byb3h5PF9DaGFyVCwgX0l0ZXIsIF9UcmFpdHM+ICYgX19wcm94eSkKK3sKKyAgICByZXR1cm4gX19xdW90ZWRfb3V0cHV0IChfX29zLCBfX3Byb3h5Ll9fZmlyc3QsIF9fcHJveHkuX19sYXN0LCBfX3Byb3h5Ll9fZGVsaW0sIF9fcHJveHkuX19lc2NhcGUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorc3RydWN0IF9fcXVvdGVkX3Byb3h5Cit7CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4gJl9fc3RyaW5nOworICAgIF9DaGFyVCAgX19kZWxpbTsKKyAgICBfQ2hhclQgIF9fZXNjYXBlOworCisgICAgX19xdW90ZWRfcHJveHkoYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4gJl9fcywgX0NoYXJUIF9fZCwgX0NoYXJUIF9fZSkKKyAgICA6IF9fc3RyaW5nKF9fcyksIF9fZGVsaW0oX19kKSwgX19lc2NhcGUoX19lKSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgb3BlcmF0b3I8PCgKKyAgICAgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCAKKyAgICAgICAgY29uc3QgX19xdW90ZWRfcHJveHk8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiAmIF9fcHJveHkpCit7CisgICAgcmV0dXJuIF9fcXVvdGVkX291dHB1dCAoX19vcywgX19wcm94eS5fX3N0cmluZy5jYmVnaW4gKCksIF9fcHJveHkuX19zdHJpbmcuY2VuZCAoKSwgX19wcm94eS5fX2RlbGltLCBfX3Byb3h5Ll9fZXNjYXBlKTsKK30KKworLy8gIGV4dHJhY3RvciBmb3Igbm9uLWNvbnN0IGJhc2ljX3N0cmluZyYgcHJveGllcwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgb3BlcmF0b3I+PigKKyAgICAgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCAKKyAgICAgICAgY29uc3QgX19xdW90ZWRfcHJveHk8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiAmIF9fcHJveHkpCit7CisgICAgcmV0dXJuIF9fcXVvdGVkX2lucHV0ICggX19pcywgX19wcm94eS5fX3N0cmluZywgX19wcm94eS5fX2RlbGltLCBfX3Byb3h5Ll9fZXNjYXBlICk7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19fcXVvdGVkX291dHB1dF9wcm94eTxfQ2hhclQsIGNvbnN0IF9DaGFyVCAqPgorcXVvdGVkICggY29uc3QgX0NoYXJUICpfX3MsIF9DaGFyVCBfX2RlbGltID0gX0NoYXJUKCciJyksIF9DaGFyVCBfX2VzY2FwZSA9X0NoYXJUKCdcXCcpKQoreworICAgIGNvbnN0IF9DaGFyVCAqX19lbmQgPSBfX3M7CisgICAgd2hpbGUgKCAqX19lbmQgKSArK19fZW5kOworICAgIHJldHVybiBfX3F1b3RlZF9vdXRwdXRfcHJveHk8X0NoYXJULCBjb25zdCBfQ2hhclQgKj4gKCBfX3MsIF9fZW5kLCBfX2RlbGltLCBfX2VzY2FwZSApOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfX3F1b3RlZF9vdXRwdXRfcHJveHk8X0NoYXJULCB0eXBlbmFtZSBiYXNpY19zdHJpbmcgPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmNvbnN0X2l0ZXJhdG9yPgorX19xdW90ZWQgKCBjb25zdCBiYXNpY19zdHJpbmcgPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4gJl9fcywgX0NoYXJUIF9fZGVsaW0gPSBfQ2hhclQoJyInKSwgX0NoYXJUIF9fZXNjYXBlPV9DaGFyVCgnXFwnKSkKK3sKKyAgICByZXR1cm4gX19xdW90ZWRfb3V0cHV0X3Byb3h5PF9DaGFyVCwKKyAgICAgICAgICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZyA8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6Y29uc3RfaXRlcmF0b3I+CisgICAgICAgICAgICAgICAgICAgICggX19zLmNiZWdpbigpLCBfX3MuY2VuZCAoKSwgX19kZWxpbSwgX19lc2NhcGUgKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19fcXVvdGVkX3Byb3h5PF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK19fcXVvdGVkICggYmFzaWNfc3RyaW5nIDxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+ICZfX3MsIF9DaGFyVCBfX2RlbGltID0gX0NoYXJUKCciJyksIF9DaGFyVCBfX2VzY2FwZT1fQ2hhclQoJ1xcJykpCit7CisgICAgcmV0dXJuIF9fcXVvdGVkX3Byb3h5PF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4oIF9fcywgX19kZWxpbSwgX19lc2NhcGUgKTsKK30KKworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19fcXVvdGVkX291dHB1dF9wcm94eTxfQ2hhclQsIHR5cGVuYW1lIGJhc2ljX3N0cmluZyA8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6Y29uc3RfaXRlcmF0b3I+CitxdW90ZWQgKCBjb25zdCBiYXNpY19zdHJpbmcgPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4gJl9fcywgX0NoYXJUIF9fZGVsaW0gPSBfQ2hhclQoJyInKSwgX0NoYXJUIF9fZXNjYXBlPV9DaGFyVCgnXFwnKSkKK3sKKyAgICByZXR1cm4gX19xdW90ZWQoX19zLCBfX2RlbGltLCBfX2VzY2FwZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfX3F1b3RlZF9wcm94eTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+CitxdW90ZWQgKCBiYXNpY19zdHJpbmcgPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4gJl9fcywgX0NoYXJUIF9fZGVsaW0gPSBfQ2hhclQoJyInKSwgX0NoYXJUIF9fZXNjYXBlPV9DaGFyVCgnXFwnKSkKK3sKKyAgICByZXR1cm4gX19xdW90ZWQoX19zLCBfX2RlbGltLCBfX2VzY2FwZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitfX3F1b3RlZF9vdXRwdXRfcHJveHk8X0NoYXJULCBjb25zdCBfQ2hhclQgKiwgX1RyYWl0cz4KK3F1b3RlZCAoYmFzaWNfc3RyaW5nX3ZpZXcgPF9DaGFyVCwgX1RyYWl0cz4gX19zdiwKKyAgICAgICAgICAgICBfQ2hhclQgX19kZWxpbSA9IF9DaGFyVCgnIicpLCBfQ2hhclQgX19lc2NhcGU9X0NoYXJUKCdcXCcpKQoreworICAgIHJldHVybiBfX3F1b3RlZF9vdXRwdXRfcHJveHk8X0NoYXJULCBjb25zdCBfQ2hhclQgKiwgX1RyYWl0cz4gCisgICAgICAgICAoIF9fc3YuZGF0YSgpLCBfX3N2LmRhdGEoKSArIF9fc3Yuc2l6ZSgpLCBfX2RlbGltLCBfX2VzY2FwZSApOworfQorI2VuZGlmCisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX0lPTUFOSVAKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9pb3MgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvaW9zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMzJkMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvaW9zCkBAIC0wLDAgKzEsMTA0OCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9JT1MKKyNkZWZpbmUgX0xJQkNQUF9JT1MKKworLyoKKyAgICBpb3Mgc3lub3BzaXMKKworI2luY2x1ZGUgPGlvc2Z3ZD4KKworbmFtZXNwYWNlIHN0ZAoreworCit0eXBlZGVmIE9GRl9UIHN0cmVhbW9mZjsKK3R5cGVkZWYgU1pfVCBzdHJlYW1zaXplOwordGVtcGxhdGUgPGNsYXNzIHN0YXRlVD4gY2xhc3MgZnBvczsKKworY2xhc3MgaW9zX2Jhc2UKK3sKK3B1YmxpYzoKKyAgICBjbGFzcyBmYWlsdXJlOworCisgICAgdHlwZWRlZiBUMSBmbXRmbGFnczsKKyAgICBzdGF0aWMgY29uc3RleHByIGZtdGZsYWdzIGJvb2xhbHBoYTsKKyAgICBzdGF0aWMgY29uc3RleHByIGZtdGZsYWdzIGRlYzsKKyAgICBzdGF0aWMgY29uc3RleHByIGZtdGZsYWdzIGZpeGVkOworICAgIHN0YXRpYyBjb25zdGV4cHIgZm10ZmxhZ3MgaGV4OworICAgIHN0YXRpYyBjb25zdGV4cHIgZm10ZmxhZ3MgaW50ZXJuYWw7CisgICAgc3RhdGljIGNvbnN0ZXhwciBmbXRmbGFncyBsZWZ0OworICAgIHN0YXRpYyBjb25zdGV4cHIgZm10ZmxhZ3Mgb2N0OworICAgIHN0YXRpYyBjb25zdGV4cHIgZm10ZmxhZ3MgcmlnaHQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBmbXRmbGFncyBzY2llbnRpZmljOworICAgIHN0YXRpYyBjb25zdGV4cHIgZm10ZmxhZ3Mgc2hvd2Jhc2U7CisgICAgc3RhdGljIGNvbnN0ZXhwciBmbXRmbGFncyBzaG93cG9pbnQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBmbXRmbGFncyBzaG93cG9zOworICAgIHN0YXRpYyBjb25zdGV4cHIgZm10ZmxhZ3Mgc2tpcHdzOworICAgIHN0YXRpYyBjb25zdGV4cHIgZm10ZmxhZ3MgdW5pdGJ1ZjsKKyAgICBzdGF0aWMgY29uc3RleHByIGZtdGZsYWdzIHVwcGVyY2FzZTsKKyAgICBzdGF0aWMgY29uc3RleHByIGZtdGZsYWdzIGFkanVzdGZpZWxkOworICAgIHN0YXRpYyBjb25zdGV4cHIgZm10ZmxhZ3MgYmFzZWZpZWxkOworICAgIHN0YXRpYyBjb25zdGV4cHIgZm10ZmxhZ3MgZmxvYXRmaWVsZDsKKworICAgIHR5cGVkZWYgVDIgaW9zdGF0ZTsKKyAgICBzdGF0aWMgY29uc3RleHByIGlvc3RhdGUgYmFkYml0OworICAgIHN0YXRpYyBjb25zdGV4cHIgaW9zdGF0ZSBlb2ZiaXQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpb3N0YXRlIGZhaWxiaXQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpb3N0YXRlIGdvb2RiaXQ7CisKKyAgICB0eXBlZGVmIFQzIG9wZW5tb2RlOworICAgIHN0YXRpYyBjb25zdGV4cHIgb3Blbm1vZGUgYXBwOworICAgIHN0YXRpYyBjb25zdGV4cHIgb3Blbm1vZGUgYXRlOworICAgIHN0YXRpYyBjb25zdGV4cHIgb3Blbm1vZGUgYmluYXJ5OworICAgIHN0YXRpYyBjb25zdGV4cHIgb3Blbm1vZGUgaW47CisgICAgc3RhdGljIGNvbnN0ZXhwciBvcGVubW9kZSBvdXQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBvcGVubW9kZSB0cnVuYzsKKworICAgIHR5cGVkZWYgVDQgc2Vla2RpcjsKKyAgICBzdGF0aWMgY29uc3RleHByIHNlZWtkaXIgYmVnOworICAgIHN0YXRpYyBjb25zdGV4cHIgc2Vla2RpciBjdXI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzZWVrZGlyIGVuZDsKKworICAgIGNsYXNzIEluaXQ7CisKKyAgICAvLyAyNy41LjIuMiBmbXRmbGFncyBzdGF0ZToKKyAgICBmbXRmbGFncyBmbGFncygpIGNvbnN0OworICAgIGZtdGZsYWdzIGZsYWdzKGZtdGZsYWdzIGZtdGZsKTsKKyAgICBmbXRmbGFncyBzZXRmKGZtdGZsYWdzIGZtdGZsKTsKKyAgICBmbXRmbGFncyBzZXRmKGZtdGZsYWdzIGZtdGZsLCBmbXRmbGFncyBtYXNrKTsKKyAgICB2b2lkIHVuc2V0ZihmbXRmbGFncyBtYXNrKTsKKworICAgIHN0cmVhbXNpemUgcHJlY2lzaW9uKCkgY29uc3Q7CisgICAgc3RyZWFtc2l6ZSBwcmVjaXNpb24oc3RyZWFtc2l6ZSBwcmVjKTsKKyAgICBzdHJlYW1zaXplIHdpZHRoKCkgY29uc3Q7CisgICAgc3RyZWFtc2l6ZSB3aWR0aChzdHJlYW1zaXplIHdpZGUpOworCisgICAgLy8gMjcuNS4yLjMgbG9jYWxlczoKKyAgICBsb2NhbGUgaW1idWUoY29uc3QgbG9jYWxlJiBsb2MpOworICAgIGxvY2FsZSBnZXRsb2MoKSBjb25zdDsKKworICAgIC8vIDI3LjUuMi41IHN0b3JhZ2U6CisgICAgc3RhdGljIGludCB4YWxsb2MoKTsKKyAgICBsb25nJiBpd29yZChpbnQgaW5kZXgpOworICAgIHZvaWQqJiBwd29yZChpbnQgaW5kZXgpOworCisgICAgLy8gZGVzdHJ1Y3RvcgorICAgIHZpcnR1YWwgfmlvc19iYXNlKCk7CisKKyAgICAvLyAyNy41LjIuNiBjYWxsYmFja3M7CisgICAgZW51bSBldmVudCB7IGVyYXNlX2V2ZW50LCBpbWJ1ZV9ldmVudCwgY29weWZtdF9ldmVudCB9OworICAgIHR5cGVkZWYgdm9pZCAoKmV2ZW50X2NhbGxiYWNrKShldmVudCwgaW9zX2Jhc2UmLCBpbnQgaW5kZXgpOworICAgIHZvaWQgcmVnaXN0ZXJfY2FsbGJhY2soZXZlbnRfY2FsbGJhY2sgZm4sIGludCBpbmRleCk7CisKKyAgICBpb3NfYmFzZShjb25zdCBpb3NfYmFzZSYpID0gZGVsZXRlOworICAgIGlvc19iYXNlJiBvcGVyYXRvcj0oY29uc3QgaW9zX2Jhc2UmKSA9IGRlbGV0ZTsKKworICAgIHN0YXRpYyBib29sIHN5bmNfd2l0aF9zdGRpbyhib29sIHN5bmMgPSB0cnVlKTsKKworcHJvdGVjdGVkOgorICAgIGlvc19iYXNlKCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cyA9IGNoYXJfdHJhaXRzPGNoYXJUPiA+CitjbGFzcyBiYXNpY19pb3MKKyAgICA6IHB1YmxpYyBpb3NfYmFzZQoreworcHVibGljOgorICAgIC8vIHR5cGVzOgorICAgIHR5cGVkZWYgY2hhclQgY2hhcl90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzOjppbnRfdHlwZSBpbnRfdHlwZTsgIC8vIHJlbW92ZWQgaW4gQysrMTcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czo6cG9zX3R5cGUgcG9zX3R5cGU7ICAvLyByZW1vdmVkIGluIEMrKzE3CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM6Om9mZl90eXBlIG9mZl90eXBlOyAgLy8gcmVtb3ZlZCBpbiBDKysxNworICAgIHR5cGVkZWYgdHJhaXRzIHRyYWl0c190eXBlOworCisgICAgb3BlcmF0b3IgdW5zcGVjaWZpZWQtYm9vbC10eXBlKCkgY29uc3Q7CisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdDsKKyAgICBpb3N0YXRlIHJkc3RhdGUoKSBjb25zdDsKKyAgICB2b2lkIGNsZWFyKGlvc3RhdGUgc3RhdGUgPSBnb29kYml0KTsKKyAgICB2b2lkIHNldHN0YXRlKGlvc3RhdGUgc3RhdGUpOworICAgIGJvb2wgZ29vZCgpIGNvbnN0OworICAgIGJvb2wgZW9mKCkgY29uc3Q7CisgICAgYm9vbCBmYWlsKCkgY29uc3Q7CisgICAgYm9vbCBiYWQoKSBjb25zdDsKKworICAgIGlvc3RhdGUgZXhjZXB0aW9ucygpIGNvbnN0OworICAgIHZvaWQgZXhjZXB0aW9ucyhpb3N0YXRlIGV4Y2VwdCk7CisKKyAgICAvLyAyNy41LjQuMSBDb25zdHJ1Y3Rvci9kZXN0cnVjdG9yOgorICAgIGV4cGxpY2l0IGJhc2ljX2lvcyhiYXNpY19zdHJlYW1idWY8Y2hhclQsdHJhaXRzPiogc2IpOworICAgIHZpcnR1YWwgfmJhc2ljX2lvcygpOworCisgICAgLy8gMjcuNS40LjIgTWVtYmVyczoKKyAgICBiYXNpY19vc3RyZWFtPGNoYXJULHRyYWl0cz4qIHRpZSgpIGNvbnN0OworICAgIGJhc2ljX29zdHJlYW08Y2hhclQsdHJhaXRzPiogdGllKGJhc2ljX29zdHJlYW08Y2hhclQsdHJhaXRzPiogdGllc3RyKTsKKworICAgIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyVCx0cmFpdHM+KiByZGJ1ZigpIGNvbnN0OworICAgIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyVCx0cmFpdHM+KiByZGJ1ZihiYXNpY19zdHJlYW1idWY8Y2hhclQsdHJhaXRzPiogc2IpOworCisgICAgYmFzaWNfaW9zJiBjb3B5Zm10KGNvbnN0IGJhc2ljX2lvcyYgcmhzKTsKKworICAgIGNoYXJfdHlwZSBmaWxsKCkgY29uc3Q7CisgICAgY2hhcl90eXBlIGZpbGwoY2hhcl90eXBlIGNoKTsKKworICAgIGxvY2FsZSBpbWJ1ZShjb25zdCBsb2NhbGUmIGxvYyk7CisKKyAgICBjaGFyIG5hcnJvdyhjaGFyX3R5cGUgYywgY2hhciBkZmF1bHQpIGNvbnN0OworICAgIGNoYXJfdHlwZSB3aWRlbihjaGFyIGMpIGNvbnN0OworCisgICAgYmFzaWNfaW9zKGNvbnN0IGJhc2ljX2lvcyYgKSA9IGRlbGV0ZTsKKyAgICBiYXNpY19pb3MmIG9wZXJhdG9yPShjb25zdCBiYXNpY19pb3MmKSA9IGRlbGV0ZTsKKworcHJvdGVjdGVkOgorICAgIGJhc2ljX2lvcygpOworICAgIHZvaWQgaW5pdChiYXNpY19zdHJlYW1idWY8Y2hhclQsdHJhaXRzPiogc2IpOworICAgIHZvaWQgbW92ZShiYXNpY19pb3MmIHJocyk7CisgICAgdm9pZCBzd2FwKGJhc2ljX2lvcyYgcmhzKSBub2V4Y2VwdDsKKyAgICB2b2lkIHNldF9yZGJ1ZihiYXNpY19zdHJlYW1idWY8Y2hhclQsIHRyYWl0cz4qIHNiKTsKK307CisKKy8vIDI3LjUuNSwgbWFuaXB1bGF0b3JzOgoraW9zX2Jhc2UmIGJvb2xhbHBoYSAoaW9zX2Jhc2UmIHN0cik7Citpb3NfYmFzZSYgbm9ib29sYWxwaGEoaW9zX2Jhc2UmIHN0cik7Citpb3NfYmFzZSYgc2hvd2Jhc2UgKGlvc19iYXNlJiBzdHIpOworaW9zX2Jhc2UmIG5vc2hvd2Jhc2UgKGlvc19iYXNlJiBzdHIpOworaW9zX2Jhc2UmIHNob3dwb2ludCAoaW9zX2Jhc2UmIHN0cik7Citpb3NfYmFzZSYgbm9zaG93cG9pbnQoaW9zX2Jhc2UmIHN0cik7Citpb3NfYmFzZSYgc2hvd3BvcyAoaW9zX2Jhc2UmIHN0cik7Citpb3NfYmFzZSYgbm9zaG93cG9zIChpb3NfYmFzZSYgc3RyKTsKK2lvc19iYXNlJiBza2lwd3MgKGlvc19iYXNlJiBzdHIpOworaW9zX2Jhc2UmIG5vc2tpcHdzIChpb3NfYmFzZSYgc3RyKTsKK2lvc19iYXNlJiB1cHBlcmNhc2UgKGlvc19iYXNlJiBzdHIpOworaW9zX2Jhc2UmIG5vdXBwZXJjYXNlKGlvc19iYXNlJiBzdHIpOworaW9zX2Jhc2UmIHVuaXRidWYgKGlvc19iYXNlJiBzdHIpOworaW9zX2Jhc2UmIG5vdW5pdGJ1ZiAoaW9zX2Jhc2UmIHN0cik7CisKKy8vIDI3LjUuNS4yIGFkanVzdGZpZWxkOgoraW9zX2Jhc2UmIGludGVybmFsIChpb3NfYmFzZSYgc3RyKTsKK2lvc19iYXNlJiBsZWZ0IChpb3NfYmFzZSYgc3RyKTsKK2lvc19iYXNlJiByaWdodCAoaW9zX2Jhc2UmIHN0cik7CisKKy8vIDI3LjUuNS4zIGJhc2VmaWVsZDoKK2lvc19iYXNlJiBkZWMgKGlvc19iYXNlJiBzdHIpOworaW9zX2Jhc2UmIGhleCAoaW9zX2Jhc2UmIHN0cik7Citpb3NfYmFzZSYgb2N0IChpb3NfYmFzZSYgc3RyKTsKKworLy8gMjcuNS41LjQgZmxvYXRmaWVsZDoKK2lvc19iYXNlJiBmaXhlZCAoaW9zX2Jhc2UmIHN0cik7Citpb3NfYmFzZSYgc2NpZW50aWZpYyAoaW9zX2Jhc2UmIHN0cik7Citpb3NfYmFzZSYgaGV4ZmxvYXQgKGlvc19iYXNlJiBzdHIpOworaW9zX2Jhc2UmIGRlZmF1bHRmbG9hdChpb3NfYmFzZSYgc3RyKTsKKworLy8gMjcuNS41LjUgZXJyb3IgcmVwb3J0aW5nOgorZW51bSBjbGFzcyBpb19lcnJjCit7CisgICAgc3RyZWFtID0gMQorfTsKKworY29uY2VwdF9tYXAgRXJyb3JDb2RlRW51bTxpb19lcnJjPiB7IH07CitlcnJvcl9jb2RlIG1ha2VfZXJyb3JfY29kZShpb19lcnJjIGUpIG5vZXhjZXB0OyAKK2Vycm9yX2NvbmRpdGlvbiBtYWtlX2Vycm9yX2NvbmRpdGlvbihpb19lcnJjIGUpIG5vZXhjZXB0OyAKK3N0b3JhZ2UtY2xhc3Mtc3BlY2lmaWVyIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBpb3N0cmVhbV9jYXRlZ29yeSgpIG5vZXhjZXB0OworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxfX2xvY2FsZT4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19BVE9NSUNfSEVBREVSKQorI2luY2x1ZGUgPGF0b21pYz4gICAgIC8vIGZvciBfX3hpbmRleF8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3R5cGVkZWYgcHRyZGlmZl90IHN0cmVhbXNpemU7CisKK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgaW9zX2Jhc2UKK3sKK3B1YmxpYzoKKyAgICBjbGFzcyBfTElCQ1BQX0VYQ0VQVElPTl9BQkkgZmFpbHVyZTsKKworICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IGZtdGZsYWdzOworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBib29sYWxwaGEgICA9IDB4MDAwMTsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgZGVjICAgICAgICAgPSAweDAwMDI7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIGZpeGVkICAgICAgID0gMHgwMDA0OworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBoZXggICAgICAgICA9IDB4MDAwODsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgaW50ZXJuYWwgICAgPSAweDAwMTA7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIGxlZnQgICAgICAgID0gMHgwMDIwOworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBvY3QgICAgICAgICA9IDB4MDA0MDsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgcmlnaHQgICAgICAgPSAweDAwODA7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIHNjaWVudGlmaWMgID0gMHgwMTAwOworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBzaG93YmFzZSAgICA9IDB4MDIwMDsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3Mgc2hvd3BvaW50ICAgPSAweDA0MDA7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIHNob3dwb3MgICAgID0gMHgwODAwOworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBza2lwd3MgICAgICA9IDB4MTAwMDsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgdW5pdGJ1ZiAgICAgPSAweDIwMDA7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIHVwcGVyY2FzZSAgID0gMHg0MDAwOworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBhZGp1c3RmaWVsZCA9IGxlZnQgfCByaWdodCB8IGludGVybmFsOworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBiYXNlZmllbGQgICA9IGRlYyB8IG9jdCB8IGhleDsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgZmxvYXRmaWVsZCAgPSBzY2llbnRpZmljIHwgZml4ZWQ7CisKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGludCBpb3N0YXRlOworICAgIHN0YXRpYyBjb25zdCBpb3N0YXRlIGJhZGJpdCAgPSAweDE7CisgICAgc3RhdGljIGNvbnN0IGlvc3RhdGUgZW9mYml0ICA9IDB4MjsKKyAgICBzdGF0aWMgY29uc3QgaW9zdGF0ZSBmYWlsYml0ID0gMHg0OworICAgIHN0YXRpYyBjb25zdCBpb3N0YXRlIGdvb2RiaXQgPSAweDA7CisKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGludCBvcGVubW9kZTsKKyAgICBzdGF0aWMgY29uc3Qgb3Blbm1vZGUgYXBwICAgID0gMHgwMTsKKyAgICBzdGF0aWMgY29uc3Qgb3Blbm1vZGUgYXRlICAgID0gMHgwMjsKKyAgICBzdGF0aWMgY29uc3Qgb3Blbm1vZGUgYmluYXJ5ID0gMHgwNDsKKyAgICBzdGF0aWMgY29uc3Qgb3Blbm1vZGUgaW4gICAgID0gMHgwODsKKyAgICBzdGF0aWMgY29uc3Qgb3Blbm1vZGUgb3V0ICAgID0gMHgxMDsKKyAgICBzdGF0aWMgY29uc3Qgb3Blbm1vZGUgdHJ1bmMgID0gMHgyMDsKKworICAgIGVudW0gc2Vla2RpciB7YmVnLCBjdXIsIGVuZH07CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPD0gMTQKKyAgICB0eXBlZGVmIGlvc3RhdGUgICAgICBpb19zdGF0ZTsKKyAgICB0eXBlZGVmIG9wZW5tb2RlICAgICBvcGVuX21vZGU7CisgICAgdHlwZWRlZiBzZWVrZGlyICAgICAgc2Vla19kaXI7CisKKyAgICB0eXBlZGVmIF9WU1REOjpzdHJlYW1vZmYgc3RyZWFtb2ZmOworICAgIHR5cGVkZWYgX1ZTVEQ6OnN0cmVhbXBvcyBzdHJlYW1wb3M7CisjZW5kaWYKKworICAgIGNsYXNzIF9MSUJDUFBfVFlQRV9WSVMgSW5pdDsKKworICAgIC8vIDI3LjUuMi4yIGZtdGZsYWdzIHN0YXRlOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZm10ZmxhZ3MgZmxhZ3MoKSBjb25zdDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZtdGZsYWdzIGZsYWdzKGZtdGZsYWdzIF9fZm10ZmwpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZm10ZmxhZ3Mgc2V0ZihmbXRmbGFncyBfX2ZtdGZsKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZtdGZsYWdzIHNldGYoZm10ZmxhZ3MgX19mbXRmbCwgZm10ZmxhZ3MgX19tYXNrKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgdW5zZXRmKGZtdGZsYWdzIF9fbWFzayk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0cmVhbXNpemUgcHJlY2lzaW9uKCkgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdHJlYW1zaXplIHByZWNpc2lvbihzdHJlYW1zaXplIF9fcHJlYyk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdHJlYW1zaXplIHdpZHRoKCkgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdHJlYW1zaXplIHdpZHRoKHN0cmVhbXNpemUgX193aWRlKTsKKworICAgIC8vIDI3LjUuMi4zIGxvY2FsZXM6CisgICAgbG9jYWxlIGltYnVlKGNvbnN0IGxvY2FsZSYgX19sb2MpOworICAgIGxvY2FsZSBnZXRsb2MoKSBjb25zdDsKKworICAgIC8vIDI3LjUuMi41IHN0b3JhZ2U6CisgICAgc3RhdGljIGludCB4YWxsb2MoKTsKKyAgICBsb25nJiBpd29yZChpbnQgX19pbmRleCk7CisgICAgdm9pZComIHB3b3JkKGludCBfX2luZGV4KTsKKworICAgIC8vIGRlc3RydWN0b3IKKyAgICB2aXJ0dWFsIH5pb3NfYmFzZSgpOworCisgICAgLy8gMjcuNS4yLjYgY2FsbGJhY2tzOworICAgIGVudW0gZXZlbnQgeyBlcmFzZV9ldmVudCwgaW1idWVfZXZlbnQsIGNvcHlmbXRfZXZlbnQgfTsKKyAgICB0eXBlZGVmIHZvaWQgKCpldmVudF9jYWxsYmFjaykoZXZlbnQsIGlvc19iYXNlJiwgaW50IF9faW5kZXgpOworICAgIHZvaWQgcmVnaXN0ZXJfY2FsbGJhY2soZXZlbnRfY2FsbGJhY2sgX19mbiwgaW50IF9faW5kZXgpOworCitwcml2YXRlOgorICAgIGlvc19iYXNlKGNvbnN0IGlvc19iYXNlJik7IC8vID0gZGVsZXRlOworICAgIGlvc19iYXNlJiBvcGVyYXRvcj0oY29uc3QgaW9zX2Jhc2UmKTsgLy8gPSBkZWxldGU7CisKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBzeW5jX3dpdGhfc3RkaW8oYm9vbCBfX3N5bmMgPSB0cnVlKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW9zdGF0ZSByZHN0YXRlKCkgY29uc3Q7CisgICAgdm9pZCBjbGVhcihpb3N0YXRlIF9fc3RhdGUgPSBnb29kYml0KTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgc2V0c3RhdGUoaW9zdGF0ZSBfX3N0YXRlKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYm9vbCBnb29kKCkgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBib29sIGVvZigpIGNvbnN0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYm9vbCBmYWlsKCkgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBib29sIGJhZCgpIGNvbnN0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpb3N0YXRlIGV4Y2VwdGlvbnMoKSBjb25zdDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgZXhjZXB0aW9ucyhpb3N0YXRlIF9faW9zdGF0ZSk7CisKKyAgICB2b2lkIF9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIHZvaWQgX19zZXRfZmFpbGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworCitwcm90ZWN0ZWQ6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGlvc19iYXNlKCkgey8vIHB1cnBvc2VmdWxseSBkb2VzIG5vIGluaXRpYWxpemF0aW9uCisgICAgICAgICAgICAgICB9CisKKyAgICB2b2lkIGluaXQodm9pZCogX19zYik7CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIHZvaWQqIHJkYnVmKCkgY29uc3Qge3JldHVybiBfX3JkYnVmXzt9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICB2b2lkIHJkYnVmKHZvaWQqIF9fc2IpCisgICAgeworICAgICAgICBfX3JkYnVmXyA9IF9fc2I7CisgICAgICAgIGNsZWFyKCk7CisgICAgfQorCisgICAgdm9pZCBfX2NhbGxfY2FsbGJhY2tzKGV2ZW50KTsKKyAgICB2b2lkIGNvcHlmbXQoY29uc3QgaW9zX2Jhc2UmKTsKKyAgICB2b2lkIG1vdmUoaW9zX2Jhc2UmKTsKKyAgICB2b2lkIHN3YXAoaW9zX2Jhc2UmKSBfTk9FWENFUFQ7CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICB2b2lkIHNldF9yZGJ1Zih2b2lkKiBfX3NiKQorICAgIHsKKyAgICAgICAgX19yZGJ1Zl8gPSBfX3NiOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBBbGwgZGF0YSBtZW1iZXJzIG11c3QgYmUgc2NhbGFycworICAgIGZtdGZsYWdzICAgICAgICBfX2ZtdGZsYWdzXzsKKyAgICBzdHJlYW1zaXplICAgICAgX19wcmVjaXNpb25fOworICAgIHN0cmVhbXNpemUgICAgICBfX3dpZHRoXzsKKyAgICBpb3N0YXRlICAgICAgICAgX19yZHN0YXRlXzsKKyAgICBpb3N0YXRlICAgICAgICAgX19leGNlcHRpb25zXzsKKyAgICB2b2lkKiAgICAgICAgICAgX19yZGJ1Zl87CisgICAgdm9pZCogICAgICAgICAgIF9fbG9jXzsKKyAgICBldmVudF9jYWxsYmFjayogX19mbl87CisgICAgaW50KiAgICAgICAgICAgIF9faW5kZXhfOworICAgIHNpemVfdCAgICAgICAgICBfX2V2ZW50X3NpemVfOworICAgIHNpemVfdCAgICAgICAgICBfX2V2ZW50X2NhcF87CisvLyBUT0RPKEVyaWNXRik6IEVuYWJsZSB0aGlzIGZvciBib3RoIENsYW5nIGFuZCBHQ0MuIEN1cnJlbnRseSBpdCBpcyBvbmx5CisvLyBlbmFibGVkIHdpdGggY2xhbmcuCisjaWYgZGVmaW5lZChfTElCQ1BQX0hBU19DX0FUT01JQ19JTVApICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1RIUkVBRFMpCisgICAgc3RhdGljIGF0b21pYzxpbnQ+IF9feGluZGV4XzsKKyNlbHNlCisgICAgc3RhdGljIGludCAgICAgIF9feGluZGV4XzsKKyNlbmRpZgorICAgIGxvbmcqICAgICAgICAgICBfX2lhcnJheV87CisgICAgc2l6ZV90ICAgICAgICAgIF9faWFycmF5X3NpemVfOworICAgIHNpemVfdCAgICAgICAgICBfX2lhcnJheV9jYXBfOworICAgIHZvaWQqKiAgICAgICAgICBfX3BhcnJheV87CisgICAgc2l6ZV90ICAgICAgICAgIF9fcGFycmF5X3NpemVfOworICAgIHNpemVfdCAgICAgICAgICBfX3BhcnJheV9jYXBfOworfTsKKworLy9lbnVtIGNsYXNzIGlvX2VycmMKK19MSUJDUFBfREVDTEFSRV9TVFJPTkdfRU5VTShpb19lcnJjKQoreworICAgIHN0cmVhbSA9IDEKK307CitfTElCQ1BQX0RFQ0xBUkVfU1RST05HX0VOVU1fRVBJTE9HKGlvX2VycmMpCisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfZXJyb3JfY29kZV9lbnVtPGlvX2VycmM+IDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyNpZmRlZiBfTElCQ1BQX0hBU19OT19TVFJPTkdfRU5VTVMKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfZXJyb3JfY29kZV9lbnVtPGlvX2VycmM6Ol9fbHg+IDogcHVibGljIHRydWVfdHlwZSB7IH07CisjZW5kaWYKKworX0xJQkNQUF9GVU5DX1ZJUworY29uc3QgZXJyb3JfY2F0ZWdvcnkmIGlvc3RyZWFtX2NhdGVnb3J5KCkgX05PRVhDRVBUOworCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorZXJyb3JfY29kZQorbWFrZV9lcnJvcl9jb2RlKGlvX2VycmMgX19lKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gZXJyb3JfY29kZShzdGF0aWNfY2FzdDxpbnQ+KF9fZSksIGlvc3RyZWFtX2NhdGVnb3J5KCkpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorZXJyb3JfY29uZGl0aW9uCittYWtlX2Vycm9yX2NvbmRpdGlvbihpb19lcnJjIF9fZSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIGVycm9yX2NvbmRpdGlvbihzdGF0aWNfY2FzdDxpbnQ+KF9fZSksIGlvc3RyZWFtX2NhdGVnb3J5KCkpOworfQorCitjbGFzcyBfTElCQ1BQX0VYQ0VQVElPTl9BQkkgaW9zX2Jhc2U6OmZhaWx1cmUKKyAgICA6IHB1YmxpYyBzeXN0ZW1fZXJyb3IKK3sKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBmYWlsdXJlKGNvbnN0IHN0cmluZyYgX19tc2csIGNvbnN0IGVycm9yX2NvZGUmIF9fZWMgPSBpb19lcnJjOjpzdHJlYW0pOworICAgIGV4cGxpY2l0IGZhaWx1cmUoY29uc3QgY2hhciogX19tc2csIGNvbnN0IGVycm9yX2NvZGUmIF9fZWMgPSBpb19lcnJjOjpzdHJlYW0pOworICAgIHZpcnR1YWwgfmZhaWx1cmUoKSB0aHJvdygpOworfTsKKworY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBpb3NfYmFzZTo6SW5pdAoreworcHVibGljOgorICAgIEluaXQoKTsKKyAgICB+SW5pdCgpOworfTsKKworLy8gZm10ZmxhZ3MKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlOjpmbXRmbGFncworaW9zX2Jhc2U6OmZsYWdzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gX19mbXRmbGFnc187Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZTo6Zm10ZmxhZ3MKK2lvc19iYXNlOjpmbGFncyhmbXRmbGFncyBfX2ZtdGZsKQoreworICAgIGZtdGZsYWdzIF9fciA9IF9fZm10ZmxhZ3NfOworICAgIF9fZm10ZmxhZ3NfID0gX19mbXRmbDsKKyAgICByZXR1cm4gX19yOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2U6OmZtdGZsYWdzCitpb3NfYmFzZTo6c2V0ZihmbXRmbGFncyBfX2ZtdGZsKQoreworICAgIGZtdGZsYWdzIF9fciA9IF9fZm10ZmxhZ3NfOworICAgIF9fZm10ZmxhZ3NfIHw9IF9fZm10Zmw7CisgICAgcmV0dXJuIF9fcjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK2lvc19iYXNlOjp1bnNldGYoZm10ZmxhZ3MgX19tYXNrKQoreworICAgIF9fZm10ZmxhZ3NfICY9IH5fX21hc2s7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZTo6Zm10ZmxhZ3MKK2lvc19iYXNlOjpzZXRmKGZtdGZsYWdzIF9fZm10ZmwsIGZtdGZsYWdzIF9fbWFzaykKK3sKKyAgICBmbXRmbGFncyBfX3IgPSBfX2ZtdGZsYWdzXzsKKyAgICB1bnNldGYoX19tYXNrKTsKKyAgICBfX2ZtdGZsYWdzXyB8PSBfX2ZtdGZsICYgX19tYXNrOworICAgIHJldHVybiBfX3I7Cit9CisKKy8vIHByZWNpc2lvbgorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorc3RyZWFtc2l6ZQoraW9zX2Jhc2U6OnByZWNpc2lvbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIF9fcHJlY2lzaW9uXzsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3N0cmVhbXNpemUKK2lvc19iYXNlOjpwcmVjaXNpb24oc3RyZWFtc2l6ZSBfX3ByZWMpCit7CisgICAgc3RyZWFtc2l6ZSBfX3IgPSBfX3ByZWNpc2lvbl87CisgICAgX19wcmVjaXNpb25fID0gX19wcmVjOworICAgIHJldHVybiBfX3I7Cit9CisKKy8vIHdpZHRoCisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitzdHJlYW1zaXplCitpb3NfYmFzZTo6d2lkdGgoKSBjb25zdAoreworICAgIHJldHVybiBfX3dpZHRoXzsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3N0cmVhbXNpemUKK2lvc19iYXNlOjp3aWR0aChzdHJlYW1zaXplIF9fd2lkZSkKK3sKKyAgICBzdHJlYW1zaXplIF9fciA9IF9fd2lkdGhfOworICAgIF9fd2lkdGhfID0gX193aWRlOworICAgIHJldHVybiBfX3I7Cit9CisKKy8vIGlvc3RhdGUKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlOjppb3N0YXRlCitpb3NfYmFzZTo6cmRzdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIF9fcmRzdGF0ZV87Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitpb3NfYmFzZTo6c2V0c3RhdGUoaW9zdGF0ZSBfX3N0YXRlKQoreworICAgIGNsZWFyKF9fcmRzdGF0ZV8gfCBfX3N0YXRlKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK2lvc19iYXNlOjpnb29kKCkgY29uc3QKK3sKKyAgICByZXR1cm4gX19yZHN0YXRlXyA9PSAwOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAoraW9zX2Jhc2U6OmVvZigpIGNvbnN0Cit7CisgICAgcmV0dXJuIChfX3Jkc3RhdGVfICYgZW9mYml0KSAhPSAwOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAoraW9zX2Jhc2U6OmZhaWwoKSBjb25zdAoreworICAgIHJldHVybiAoX19yZHN0YXRlXyAmIChmYWlsYml0IHwgYmFkYml0KSkgIT0gMDsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK2lvc19iYXNlOjpiYWQoKSBjb25zdAoreworICAgIHJldHVybiAoX19yZHN0YXRlXyAmIGJhZGJpdCkgIT0gMDsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlOjppb3N0YXRlCitpb3NfYmFzZTo6ZXhjZXB0aW9ucygpIGNvbnN0Cit7CisgICAgcmV0dXJuIF9fZXhjZXB0aW9uc187Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitpb3NfYmFzZTo6ZXhjZXB0aW9ucyhpb3N0YXRlIF9faW9zdGF0ZSkKK3sKKyAgICBfX2V4Y2VwdGlvbnNfID0gX19pb3N0YXRlOworICAgIGNsZWFyKF9fcmRzdGF0ZV8pOworfQorCisjaWYgZGVmaW5lZChfTElCQ1BQX0NYWDAzX0xBTkcpCitzdHJ1Y3QgX0xJQkNQUF9UWVBFX1ZJUyBfX2N4eDAzX2Jvb2wgeworICB0eXBlZGVmIHZvaWQgKF9fY3h4MDNfYm9vbDo6Kl9fYm9vbF90eXBlKSgpOworICB2b2lkIF9fdHJ1ZV92YWx1ZSgpIHt9Cit9OworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBiYXNpY19pb3MKKyAgICA6IHB1YmxpYyBpb3NfYmFzZQoreworcHVibGljOgorICAgIC8vIHR5cGVzOgorICAgIHR5cGVkZWYgX0NoYXJUIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIF9UcmFpdHMgdHJhaXRzX3R5cGU7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSBvZmZfdHlwZTsKKworICAgIHN0YXRpY19hc3NlcnQoKGlzX3NhbWU8X0NoYXJULCB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6Y2hhcl90eXBlPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgInRyYWl0c190eXBlOjpjaGFyX3R5cGUgbXVzdCBiZSB0aGUgc2FtZSB0eXBlIGFzIENoYXJUIik7CisKKyAgLy8gX190cnVlX3ZhbHVlIHdpbGwgZ2VuZXJhdGUgdW5kZWZpbmVkIHJlZmVyZW5jZXMgd2hlbiBsaW5raW5nIHVubGVzcworICAvLyB3ZSBnaXZlIGl0IGludGVybmFsIGxpbmthZ2UuCisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfQ1hYMDNfTEFORykKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBvcGVyYXRvciBfX2N4eDAzX2Jvb2w6Ol9fYm9vbF90eXBlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gIWZhaWwoKSA/ICZfX2N4eDAzX2Jvb2w6Ol9fdHJ1ZV92YWx1ZSA6IG51bGxwdHI7CisgICAgfQorI2Vsc2UKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBfTElCQ1BQX0VYUExJQ0lUIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7cmV0dXJuICFmYWlsKCk7fQorI2VuZGlmCisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgYm9vbCBvcGVyYXRvciEoKSBjb25zdCAgICB7cmV0dXJuICBmYWlsKCk7fQorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBpb3N0YXRlIHJkc3RhdGUoKSBjb25zdCAgIHtyZXR1cm4gaW9zX2Jhc2U6OnJkc3RhdGUoKTt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIHZvaWQgY2xlYXIoaW9zdGF0ZSBfX3N0YXRlID0gZ29vZGJpdCkge2lvc19iYXNlOjpjbGVhcihfX3N0YXRlKTt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIHZvaWQgc2V0c3RhdGUoaW9zdGF0ZSBfX3N0YXRlKSB7aW9zX2Jhc2U6OnNldHN0YXRlKF9fc3RhdGUpO30KKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgYm9vbCBnb29kKCkgY29uc3Qge3JldHVybiBpb3NfYmFzZTo6Z29vZCgpO30KKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgYm9vbCBlb2YoKSBjb25zdCAge3JldHVybiBpb3NfYmFzZTo6ZW9mKCk7fQorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBib29sIGZhaWwoKSBjb25zdCB7cmV0dXJuIGlvc19iYXNlOjpmYWlsKCk7fQorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBib29sIGJhZCgpIGNvbnN0ICB7cmV0dXJuIGlvc19iYXNlOjpiYWQoKTt9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgaW9zdGF0ZSBleGNlcHRpb25zKCkgY29uc3Qge3JldHVybiBpb3NfYmFzZTo6ZXhjZXB0aW9ucygpO30KKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgdm9pZCBleGNlcHRpb25zKGlvc3RhdGUgX19pb3N0YXRlKSB7aW9zX2Jhc2U6OmV4Y2VwdGlvbnMoX19pb3N0YXRlKTt9CisKKyAgICAvLyAyNy41LjQuMSBDb25zdHJ1Y3Rvci9kZXN0cnVjdG9yOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBiYXNpY19pb3MoYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSx0cmFpdHNfdHlwZT4qIF9fc2IpOworICAgIHZpcnR1YWwgfmJhc2ljX2lvcygpOworCisgICAgLy8gMjcuNS40LjIgTWVtYmVyczoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIAorICAgIGJhc2ljX29zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIHRpZSgpIGNvbnN0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgCisgICAgYmFzaWNfb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiogdGllKGJhc2ljX29zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIF9fdGllc3RyKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgCisgICAgYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiByZGJ1ZigpIGNvbnN0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgCisgICAgYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiByZGJ1ZihiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIF9fc2IpOworCisgICAgYmFzaWNfaW9zJiBjb3B5Zm10KGNvbnN0IGJhc2ljX2lvcyYgX19yaHMpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSAKKyAgICBjaGFyX3R5cGUgZmlsbCgpIGNvbnN0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgCisgICAgY2hhcl90eXBlIGZpbGwoY2hhcl90eXBlIF9fY2gpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSAKKyAgICBsb2NhbGUgaW1idWUoY29uc3QgbG9jYWxlJiBfX2xvYyk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIAorICAgIGNoYXIgbmFycm93KGNoYXJfdHlwZSBfX2MsIGNoYXIgX19kZmF1bHQpIGNvbnN0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgCisgICAgY2hhcl90eXBlIHdpZGVuKGNoYXIgX19jKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGJhc2ljX2lvcygpIHsvLyBwdXJwb3NlZnVsbHkgZG9lcyBubyBpbml0aWFsaXphdGlvbgorICAgICAgICAgICAgICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIAorICAgIHZvaWQgaW5pdChiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIF9fc2IpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSAKKyAgICB2b2lkIG1vdmUoYmFzaWNfaW9zJiBfX3Jocyk7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIHZvaWQgbW92ZShiYXNpY19pb3MmJiBfX3Jocykge21vdmUoX19yaHMpO30KKyNlbmRpZgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgCisgICAgdm9pZCBzd2FwKGJhc2ljX2lvcyYgX19yaHMpIF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIAorICAgIHZvaWQgc2V0X3JkYnVmKGJhc2ljX3N0cmVhbWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiogX19zYik7Citwcml2YXRlOgorICAgIGJhc2ljX29zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIF9fdGllXzsKKyAgICBtdXRhYmxlIGludF90eXBlIF9fZmlsbF87Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjpiYXNpY19pb3MoYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSx0cmFpdHNfdHlwZT4qIF9fc2IpCit7CisgICAgaW5pdChfX3NiKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojp+YmFzaWNfaW9zKCkKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6aW5pdChiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIF9fc2IpCit7CisgICAgaW9zX2Jhc2U6OmluaXQoX19zYik7CisgICAgX190aWVfID0gMDsKKyAgICBfX2ZpbGxfID0gdHJhaXRzX3R5cGU6OmVvZigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPioKK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojp0aWUoKSBjb25zdAoreworICAgIHJldHVybiBfX3RpZV87Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KgorYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OnRpZShiYXNpY19vc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiBfX3RpZXN0cikKK3sKKyAgICBiYXNpY19vc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiBfX3IgPSBfX3RpZV87CisgICAgX190aWVfID0gX190aWVzdHI7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPioKK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjpyZGJ1ZigpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGJhc2ljX3N0cmVhbWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPio+KGlvc19iYXNlOjpyZGJ1ZigpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPioKK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjpyZGJ1ZihiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIF9fc2IpCit7CisgICAgYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiBfX3IgPSByZGJ1ZigpOworICAgIGlvc19iYXNlOjpyZGJ1ZihfX3NiKTsKKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2xvY2FsZQorYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OmltYnVlKGNvbnN0IGxvY2FsZSYgX19sb2MpCit7CisgICAgbG9jYWxlIF9fciA9IGdldGxvYygpOworICAgIGlvc19iYXNlOjppbWJ1ZShfX2xvYyk7CisgICAgaWYgKHJkYnVmKCkpCisgICAgICAgIHJkYnVmKCktPnB1YmltYnVlKF9fbG9jKTsKKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NoYXIKK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjpuYXJyb3coY2hhcl90eXBlIF9fYywgY2hhciBfX2RmYXVsdCkgY29uc3QKK3sKKyAgICByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPGNoYXJfdHlwZT4gPihnZXRsb2MoKSkubmFycm93KF9fYywgX19kZmF1bHQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19DaGFyVAorYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OndpZGVuKGNoYXIgX19jKSBjb25zdAoreworICAgIHJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8Y2hhcl90eXBlPiA+KGdldGxvYygpKS53aWRlbihfX2MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19DaGFyVAorYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OmZpbGwoKSBjb25zdAoreworICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUodHJhaXRzX3R5cGU6OmVvZigpLCBfX2ZpbGxfKSkKKyAgICAgICAgX19maWxsXyA9IHdpZGVuKCcgJyk7CisgICAgcmV0dXJuIF9fZmlsbF87Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0NoYXJUCitiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6ZmlsbChjaGFyX3R5cGUgX19jaCkKK3sKKyAgICBjaGFyX3R5cGUgX19yID0gX19maWxsXzsKKyAgICBfX2ZpbGxfID0gX19jaDsKKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6Y29weWZtdChjb25zdCBiYXNpY19pb3MmIF9fcmhzKQoreworICAgIGlmICh0aGlzICE9ICZfX3JocykKKyAgICB7CisgICAgICAgIF9fY2FsbF9jYWxsYmFja3MoZXJhc2VfZXZlbnQpOworICAgICAgICBpb3NfYmFzZTo6Y29weWZtdChfX3Jocyk7CisgICAgICAgIF9fdGllXyA9IF9fcmhzLl9fdGllXzsKKyAgICAgICAgX19maWxsXyA9IF9fcmhzLl9fZmlsbF87CisgICAgICAgIF9fY2FsbF9jYWxsYmFja3MoY29weWZtdF9ldmVudCk7CisgICAgICAgIGV4Y2VwdGlvbnMoX19yaHMuZXhjZXB0aW9ucygpKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojptb3ZlKGJhc2ljX2lvcyYgX19yaHMpCit7CisgICAgaW9zX2Jhc2U6Om1vdmUoX19yaHMpOworICAgIF9fdGllXyA9IF9fcmhzLl9fdGllXzsKKyAgICBfX3Jocy5fX3RpZV8gPSAwOworICAgIF9fZmlsbF8gPSBfX3Jocy5fX2ZpbGxfOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojpzd2FwKGJhc2ljX2lvcyYgX19yaHMpIF9OT0VYQ0VQVAoreworICAgIGlvc19iYXNlOjpzd2FwKF9fcmhzKTsKKyAgICBfVlNURDo6c3dhcChfX3RpZV8sIF9fcmhzLl9fdGllXyk7CisgICAgX1ZTVEQ6OnN3YXAoX19maWxsXywgX19yaHMuX19maWxsXyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OnNldF9yZGJ1ZihiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIF9fc2IpCit7CisgICAgaW9zX2Jhc2U6OnNldF9yZGJ1ZihfX3NiKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlJgorYm9vbGFscGhhKGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci5zZXRmKGlvc19iYXNlOjpib29sYWxwaGEpOworICAgIHJldHVybiBfX3N0cjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlJgorbm9ib29sYWxwaGEoaW9zX2Jhc2UmIF9fc3RyKQoreworICAgIF9fc3RyLnVuc2V0Zihpb3NfYmFzZTo6Ym9vbGFscGhhKTsKKyAgICByZXR1cm4gX19zdHI7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZSYKK3Nob3diYXNlKGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci5zZXRmKGlvc19iYXNlOjpzaG93YmFzZSk7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCitub3Nob3diYXNlKGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci51bnNldGYoaW9zX2Jhc2U6OnNob3diYXNlKTsKKyAgICByZXR1cm4gX19zdHI7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZSYKK3Nob3dwb2ludChpb3NfYmFzZSYgX19zdHIpCit7CisgICAgX19zdHIuc2V0Zihpb3NfYmFzZTo6c2hvd3BvaW50KTsKKyAgICByZXR1cm4gX19zdHI7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZSYKK25vc2hvd3BvaW50KGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci51bnNldGYoaW9zX2Jhc2U6OnNob3dwb2ludCk7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCitzaG93cG9zKGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci5zZXRmKGlvc19iYXNlOjpzaG93cG9zKTsKKyAgICByZXR1cm4gX19zdHI7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZSYKK25vc2hvd3Bvcyhpb3NfYmFzZSYgX19zdHIpCit7CisgICAgX19zdHIudW5zZXRmKGlvc19iYXNlOjpzaG93cG9zKTsKKyAgICByZXR1cm4gX19zdHI7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZSYKK3NraXB3cyhpb3NfYmFzZSYgX19zdHIpCit7CisgICAgX19zdHIuc2V0Zihpb3NfYmFzZTo6c2tpcHdzKTsKKyAgICByZXR1cm4gX19zdHI7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZSYKK25vc2tpcHdzKGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci51bnNldGYoaW9zX2Jhc2U6OnNraXB3cyk7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCit1cHBlcmNhc2UoaW9zX2Jhc2UmIF9fc3RyKQoreworICAgIF9fc3RyLnNldGYoaW9zX2Jhc2U6OnVwcGVyY2FzZSk7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCitub3VwcGVyY2FzZShpb3NfYmFzZSYgX19zdHIpCit7CisgICAgX19zdHIudW5zZXRmKGlvc19iYXNlOjp1cHBlcmNhc2UpOworICAgIHJldHVybiBfX3N0cjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlJgordW5pdGJ1Zihpb3NfYmFzZSYgX19zdHIpCit7CisgICAgX19zdHIuc2V0Zihpb3NfYmFzZTo6dW5pdGJ1Zik7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCitub3VuaXRidWYoaW9zX2Jhc2UmIF9fc3RyKQoreworICAgIF9fc3RyLnVuc2V0Zihpb3NfYmFzZTo6dW5pdGJ1Zik7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCitpbnRlcm5hbChpb3NfYmFzZSYgX19zdHIpCit7CisgICAgX19zdHIuc2V0Zihpb3NfYmFzZTo6aW50ZXJuYWwsIGlvc19iYXNlOjphZGp1c3RmaWVsZCk7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCitsZWZ0KGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci5zZXRmKGlvc19iYXNlOjpsZWZ0LCBpb3NfYmFzZTo6YWRqdXN0ZmllbGQpOworICAgIHJldHVybiBfX3N0cjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlJgorcmlnaHQoaW9zX2Jhc2UmIF9fc3RyKQoreworICAgIF9fc3RyLnNldGYoaW9zX2Jhc2U6OnJpZ2h0LCBpb3NfYmFzZTo6YWRqdXN0ZmllbGQpOworICAgIHJldHVybiBfX3N0cjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlJgorZGVjKGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci5zZXRmKGlvc19iYXNlOjpkZWMsIGlvc19iYXNlOjpiYXNlZmllbGQpOworICAgIHJldHVybiBfX3N0cjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlJgoraGV4KGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci5zZXRmKGlvc19iYXNlOjpoZXgsIGlvc19iYXNlOjpiYXNlZmllbGQpOworICAgIHJldHVybiBfX3N0cjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlJgorb2N0KGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci5zZXRmKGlvc19iYXNlOjpvY3QsIGlvc19iYXNlOjpiYXNlZmllbGQpOworICAgIHJldHVybiBfX3N0cjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlJgorZml4ZWQoaW9zX2Jhc2UmIF9fc3RyKQoreworICAgIF9fc3RyLnNldGYoaW9zX2Jhc2U6OmZpeGVkLCBpb3NfYmFzZTo6ZmxvYXRmaWVsZCk7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCitzY2llbnRpZmljKGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci5zZXRmKGlvc19iYXNlOjpzY2llbnRpZmljLCBpb3NfYmFzZTo6ZmxvYXRmaWVsZCk7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCitoZXhmbG9hdChpb3NfYmFzZSYgX19zdHIpCit7CisgICAgX19zdHIuc2V0Zihpb3NfYmFzZTo6Zml4ZWQgfCBpb3NfYmFzZTo6c2NpZW50aWZpYywgaW9zX2Jhc2U6OmZsb2F0ZmllbGQpOworICAgIHJldHVybiBfX3N0cjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlJgorZGVmYXVsdGZsb2F0KGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci51bnNldGYoaW9zX2Jhc2U6OmZsb2F0ZmllbGQpOworICAgIHJldHVybiBfX3N0cjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIF9fc2F2ZV9mbGFncworeworICAgIHR5cGVkZWYgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4gX19zdHJlYW1fdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fc3RyZWFtX3R5cGU6OmZtdGZsYWdzIGZtdGZsYWdzOworCisgICAgX19zdHJlYW1fdHlwZSYgX19zdHJlYW1fOworICAgIGZtdGZsYWdzICAgICAgIF9fZm10ZmxhZ3NfOworICAgIF9DaGFyVCAgICAgICAgIF9fZmlsbF87CisKKyAgICBfX3NhdmVfZmxhZ3MoY29uc3QgX19zYXZlX2ZsYWdzJik7CisgICAgX19zYXZlX2ZsYWdzJiBvcGVyYXRvcj0oY29uc3QgX19zYXZlX2ZsYWdzJik7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9fc2F2ZV9mbGFncyhfX3N0cmVhbV90eXBlJiBfX3N0cmVhbSkKKyAgICAgICAgOiBfX3N0cmVhbV8oX19zdHJlYW0pLAorICAgICAgICAgIF9fZm10ZmxhZ3NfKF9fc3RyZWFtLmZsYWdzKCkpLAorICAgICAgICAgIF9fZmlsbF8oX19zdHJlYW0uZmlsbCgpKQorICAgICAgICB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB+X19zYXZlX2ZsYWdzKCkKKyAgICB7CisgICAgICAgIF9fc3RyZWFtXy5mbGFncyhfX2ZtdGZsYWdzXyk7CisgICAgICAgIF9fc3RyZWFtXy5maWxsKF9fZmlsbF8pOworICAgIH0KK307CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX0lPUwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2lvc2Z3ZCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9pb3Nmd2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzODQ4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9pb3Nmd2QKQEAgLTAsMCArMSwyMDQgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpb3Nmd2QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfSU9TRldECisjZGVmaW5lIF9MSUJDUFBfSU9TRldECisKKy8qCisgICAgaW9zZndkIHN5bm9wc2lzCisKK25hbWVzcGFjZSBzdGQKK3sKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQ+IHN0cnVjdCBjaGFyX3RyYWl0czsKK3RlbXBsYXRlPGNsYXNzIFQ+ICAgICBjbGFzcyBhbGxvY2F0b3I7CisKK2NsYXNzIGlvc19iYXNlOwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMgPSBjaGFyX3RyYWl0czxjaGFyVD4gPiBjbGFzcyBiYXNpY19pb3M7CisKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzID0gY2hhcl90cmFpdHM8Y2hhclQ+ID4gY2xhc3MgYmFzaWNfc3RyZWFtYnVmOwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMgPSBjaGFyX3RyYWl0czxjaGFyVD4gPiBjbGFzcyBiYXNpY19pc3RyZWFtOwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMgPSBjaGFyX3RyYWl0czxjaGFyVD4gPiBjbGFzcyBiYXNpY19vc3RyZWFtOwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMgPSBjaGFyX3RyYWl0czxjaGFyVD4gPiBjbGFzcyBiYXNpY19pb3N0cmVhbTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMgPSBjaGFyX3RyYWl0czxjaGFyVD4sIGNsYXNzIEFsbG9jYXRvciA9IGFsbG9jYXRvcjxjaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX3N0cmluZ2J1ZjsKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzID0gY2hhcl90cmFpdHM8Y2hhclQ+LCBjbGFzcyBBbGxvY2F0b3IgPSBhbGxvY2F0b3I8Y2hhclQ+ID4KKyAgICBjbGFzcyBiYXNpY19pc3RyaW5nc3RyZWFtOwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMgPSBjaGFyX3RyYWl0czxjaGFyVD4sIGNsYXNzIEFsbG9jYXRvciA9IGFsbG9jYXRvcjxjaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX29zdHJpbmdzdHJlYW07Cit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cyA9IGNoYXJfdHJhaXRzPGNoYXJUPiwgY2xhc3MgQWxsb2NhdG9yID0gYWxsb2NhdG9yPGNoYXJUPiA+CisgICAgY2xhc3MgYmFzaWNfc3RyaW5nc3RyZWFtOworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cyA9IGNoYXJfdHJhaXRzPGNoYXJUPiA+IGNsYXNzIGJhc2ljX2ZpbGVidWY7Cit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cyA9IGNoYXJfdHJhaXRzPGNoYXJUPiA+IGNsYXNzIGJhc2ljX2lmc3RyZWFtOwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMgPSBjaGFyX3RyYWl0czxjaGFyVD4gPiBjbGFzcyBiYXNpY19vZnN0cmVhbTsKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzID0gY2hhcl90cmFpdHM8Y2hhclQ+ID4gY2xhc3MgYmFzaWNfZnN0cmVhbTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMgPSBjaGFyX3RyYWl0czxjaGFyVD4gPiBjbGFzcyBpc3RyZWFtYnVmX2l0ZXJhdG9yOwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMgPSBjaGFyX3RyYWl0czxjaGFyVD4gPiBjbGFzcyBvc3RyZWFtYnVmX2l0ZXJhdG9yOworCit0eXBlZGVmIGJhc2ljX2lvczxjaGFyPiAgICAgICAgICAgICAgaW9zOwordHlwZWRlZiBiYXNpY19pb3M8d2NoYXJfdD4gICAgICAgICAgIHdpb3M7CisKK3R5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPGNoYXI+ICAgICAgICBzdHJlYW1idWY7Cit0eXBlZGVmIGJhc2ljX2lzdHJlYW08Y2hhcj4gICAgICAgICAgaXN0cmVhbTsKK3R5cGVkZWYgYmFzaWNfb3N0cmVhbTxjaGFyPiAgICAgICAgICBvc3RyZWFtOwordHlwZWRlZiBiYXNpY19pb3N0cmVhbTxjaGFyPiAgICAgICAgIGlvc3RyZWFtOworCit0eXBlZGVmIGJhc2ljX3N0cmluZ2J1ZjxjaGFyPiAgICAgICAgc3RyaW5nYnVmOwordHlwZWRlZiBiYXNpY19pc3RyaW5nc3RyZWFtPGNoYXI+ICAgIGlzdHJpbmdzdHJlYW07Cit0eXBlZGVmIGJhc2ljX29zdHJpbmdzdHJlYW08Y2hhcj4gICAgb3N0cmluZ3N0cmVhbTsKK3R5cGVkZWYgYmFzaWNfc3RyaW5nc3RyZWFtPGNoYXI+ICAgICBzdHJpbmdzdHJlYW07CisKK3R5cGVkZWYgYmFzaWNfZmlsZWJ1ZjxjaGFyPiAgICAgICAgICBmaWxlYnVmOwordHlwZWRlZiBiYXNpY19pZnN0cmVhbTxjaGFyPiAgICAgICAgIGlmc3RyZWFtOwordHlwZWRlZiBiYXNpY19vZnN0cmVhbTxjaGFyPiAgICAgICAgIG9mc3RyZWFtOwordHlwZWRlZiBiYXNpY19mc3RyZWFtPGNoYXI+ICAgICAgICAgIGZzdHJlYW07CisKK3R5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPHdjaGFyX3Q+ICAgICB3c3RyZWFtYnVmOwordHlwZWRlZiBiYXNpY19pc3RyZWFtPHdjaGFyX3Q+ICAgICAgIHdpc3RyZWFtOwordHlwZWRlZiBiYXNpY19vc3RyZWFtPHdjaGFyX3Q+ICAgICAgIHdvc3RyZWFtOwordHlwZWRlZiBiYXNpY19pb3N0cmVhbTx3Y2hhcl90PiAgICAgIHdpb3N0cmVhbTsKKwordHlwZWRlZiBiYXNpY19zdHJpbmdidWY8d2NoYXJfdD4gICAgIHdzdHJpbmdidWY7Cit0eXBlZGVmIGJhc2ljX2lzdHJpbmdzdHJlYW08d2NoYXJfdD4gd2lzdHJpbmdzdHJlYW07Cit0eXBlZGVmIGJhc2ljX29zdHJpbmdzdHJlYW08d2NoYXJfdD4gd29zdHJpbmdzdHJlYW07Cit0eXBlZGVmIGJhc2ljX3N0cmluZ3N0cmVhbTx3Y2hhcl90PiAgd3N0cmluZ3N0cmVhbTsKKwordHlwZWRlZiBiYXNpY19maWxlYnVmPHdjaGFyX3Q+ICAgICAgIHdmaWxlYnVmOwordHlwZWRlZiBiYXNpY19pZnN0cmVhbTx3Y2hhcl90PiAgICAgIHdpZnN0cmVhbTsKK3R5cGVkZWYgYmFzaWNfb2ZzdHJlYW08d2NoYXJfdD4gICAgICB3b2ZzdHJlYW07Cit0eXBlZGVmIGJhc2ljX2ZzdHJlYW08d2NoYXJfdD4gICAgICAgd2ZzdHJlYW07CisKK3RlbXBsYXRlIDxjbGFzcyBzdGF0ZT4gY2xhc3MgZnBvczsKK3R5cGVkZWYgZnBvczxjaGFyX3RyYWl0czxjaGFyPjo6c3RhdGVfdHlwZT4gICAgc3RyZWFtcG9zOwordHlwZWRlZiBmcG9zPGNoYXJfdHJhaXRzPHdjaGFyX3Q+OjpzdGF0ZV90eXBlPiB3c3RyZWFtcG9zOworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPHdjaGFyLmg+ICAvLyBmb3IgbWJzdGF0ZV90CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKworY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBpb3NfYmFzZTsKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJUPiAgc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGNoYXJfdHJhaXRzOwordGVtcGxhdGU8Y2xhc3MgX1RwPiAgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYWxsb2NhdG9yOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYmFzaWNfaW9zOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYmFzaWNfc3RyZWFtYnVmOwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGJhc2ljX2lzdHJlYW07Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYmFzaWNfb3N0cmVhbTsKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyAgICBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBiYXNpY19pb3N0cmVhbTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4sCisgICAgICAgICAgY2xhc3MgX0FsbG9jYXRvciA9IGFsbG9jYXRvcjxfQ2hhclQ+ID4KKyAgICBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBiYXNpY19zdHJpbmdidWY7Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiwKKyAgICAgICAgICBjbGFzcyBfQWxsb2NhdG9yID0gYWxsb2NhdG9yPF9DaGFyVD4gPgorICAgIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGJhc2ljX2lzdHJpbmdzdHJlYW07Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiwKKyAgICAgICAgICBjbGFzcyBfQWxsb2NhdG9yID0gYWxsb2NhdG9yPF9DaGFyVD4gPgorICAgIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGJhc2ljX29zdHJpbmdzdHJlYW07Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiwKKyAgICAgICAgICBjbGFzcyBfQWxsb2NhdG9yID0gYWxsb2NhdG9yPF9DaGFyVD4gPgorICAgIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGJhc2ljX3N0cmluZ3N0cmVhbTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGJhc2ljX2ZpbGVidWY7Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYmFzaWNfaWZzdHJlYW07Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYmFzaWNfb2ZzdHJlYW07Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYmFzaWNfZnN0cmVhbTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGlzdHJlYW1idWZfaXRlcmF0b3I7Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgb3N0cmVhbWJ1Zl9pdGVyYXRvcjsKKwordHlwZWRlZiBiYXNpY19pb3M8Y2hhcj4gICAgICAgICAgICAgIGlvczsKK3R5cGVkZWYgYmFzaWNfaW9zPHdjaGFyX3Q+ICAgICAgICAgICB3aW9zOworCit0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyPiAgICAgICAgc3RyZWFtYnVmOwordHlwZWRlZiBiYXNpY19pc3RyZWFtPGNoYXI+ICAgICAgICAgIGlzdHJlYW07Cit0eXBlZGVmIGJhc2ljX29zdHJlYW08Y2hhcj4gICAgICAgICAgb3N0cmVhbTsKK3R5cGVkZWYgYmFzaWNfaW9zdHJlYW08Y2hhcj4gICAgICAgICBpb3N0cmVhbTsKKwordHlwZWRlZiBiYXNpY19zdHJpbmdidWY8Y2hhcj4gICAgICAgIHN0cmluZ2J1ZjsKK3R5cGVkZWYgYmFzaWNfaXN0cmluZ3N0cmVhbTxjaGFyPiAgICBpc3RyaW5nc3RyZWFtOwordHlwZWRlZiBiYXNpY19vc3RyaW5nc3RyZWFtPGNoYXI+ICAgIG9zdHJpbmdzdHJlYW07Cit0eXBlZGVmIGJhc2ljX3N0cmluZ3N0cmVhbTxjaGFyPiAgICAgc3RyaW5nc3RyZWFtOworCit0eXBlZGVmIGJhc2ljX2ZpbGVidWY8Y2hhcj4gICAgICAgICAgZmlsZWJ1ZjsKK3R5cGVkZWYgYmFzaWNfaWZzdHJlYW08Y2hhcj4gICAgICAgICBpZnN0cmVhbTsKK3R5cGVkZWYgYmFzaWNfb2ZzdHJlYW08Y2hhcj4gICAgICAgICBvZnN0cmVhbTsKK3R5cGVkZWYgYmFzaWNfZnN0cmVhbTxjaGFyPiAgICAgICAgICBmc3RyZWFtOworCit0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1Zjx3Y2hhcl90PiAgICAgd3N0cmVhbWJ1ZjsKK3R5cGVkZWYgYmFzaWNfaXN0cmVhbTx3Y2hhcl90PiAgICAgICB3aXN0cmVhbTsKK3R5cGVkZWYgYmFzaWNfb3N0cmVhbTx3Y2hhcl90PiAgICAgICB3b3N0cmVhbTsKK3R5cGVkZWYgYmFzaWNfaW9zdHJlYW08d2NoYXJfdD4gICAgICB3aW9zdHJlYW07CisKK3R5cGVkZWYgYmFzaWNfc3RyaW5nYnVmPHdjaGFyX3Q+ICAgICB3c3RyaW5nYnVmOwordHlwZWRlZiBiYXNpY19pc3RyaW5nc3RyZWFtPHdjaGFyX3Q+IHdpc3RyaW5nc3RyZWFtOwordHlwZWRlZiBiYXNpY19vc3RyaW5nc3RyZWFtPHdjaGFyX3Q+IHdvc3RyaW5nc3RyZWFtOwordHlwZWRlZiBiYXNpY19zdHJpbmdzdHJlYW08d2NoYXJfdD4gIHdzdHJpbmdzdHJlYW07CisKK3R5cGVkZWYgYmFzaWNfZmlsZWJ1Zjx3Y2hhcl90PiAgICAgICB3ZmlsZWJ1ZjsKK3R5cGVkZWYgYmFzaWNfaWZzdHJlYW08d2NoYXJfdD4gICAgICB3aWZzdHJlYW07Cit0eXBlZGVmIGJhc2ljX29mc3RyZWFtPHdjaGFyX3Q+ICAgICAgd29mc3RyZWFtOwordHlwZWRlZiBiYXNpY19mc3RyZWFtPHdjaGFyX3Q+ICAgICAgIHdmc3RyZWFtOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1N0YXRlPiAgICAgICAgICAgICBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBmcG9zOwordHlwZWRlZiBmcG9zPG1ic3RhdGVfdD4gICAgc3RyZWFtcG9zOwordHlwZWRlZiBmcG9zPG1ic3RhdGVfdD4gICAgd3N0cmVhbXBvczsKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fVU5JQ09ERV9DSEFSUwordHlwZWRlZiBmcG9zPG1ic3RhdGVfdD4gICAgdTE2c3RyZWFtcG9zOwordHlwZWRlZiBmcG9zPG1ic3RhdGVfdD4gICAgdTMyc3RyZWFtcG9zOworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19VTklDT0RFX0NIQVJTCisKKyNpZiBkZWZpbmVkKF9ORVdMSUJfVkVSU0lPTikKKy8vIE9uIG5ld2xpYiwgb2ZmX3QgaXMgJ2xvbmcgaW50JwordHlwZWRlZiBsb25nIGludCBzdHJlYW1vZmY7ICAgICAgICAgLy8gZm9yIGNoYXJfdHJhaXRzIGluIDxzdHJpbmc+CisjZWxzZQordHlwZWRlZiBsb25nIGxvbmcgc3RyZWFtb2ZmOyAgICAgICAgLy8gZm9yIGNoYXJfdHJhaXRzIGluIDxzdHJpbmc+CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgICAgICAgICAgICAgLy8gZm9yIDxzdGRleGNlcHQ+CisgICAgICAgICAgY2xhc3MgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4sCisgICAgICAgICAgY2xhc3MgX0FsbG9jYXRvciA9IGFsbG9jYXRvcjxfQ2hhclQ+ID4KKyAgICBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBiYXNpY19zdHJpbmc7Cit0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgYWxsb2NhdG9yPGNoYXI+ID4gc3RyaW5nOwordHlwZWRlZiBiYXNpY19zdHJpbmc8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIGFsbG9jYXRvcjx3Y2hhcl90PiA+IHdzdHJpbmc7CisKKworLy8gSW5jbHVkZSBvdGhlciBmb3J3YXJkIGRlY2xhcmF0aW9ucyBoZXJlCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X1RwPiA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB2ZWN0b3I7CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX0lPU0ZXRApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2lvc3RyZWFtIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2lvc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNmE4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvaW9zdHJlYW0KQEAgLTAsMCArMSw2NCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGlvc3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9JT1NUUkVBTQorI2RlZmluZSBfTElCQ1BQX0lPU1RSRUFNCisKKy8qCisgICAgaW9zdHJlYW0gc3lub3BzaXMKKworI2luY2x1ZGUgPGlvcz4KKyNpbmNsdWRlIDxzdHJlYW1idWY+CisjaW5jbHVkZSA8aXN0cmVhbT4KKyNpbmNsdWRlIDxvc3RyZWFtPgorCituYW1lc3BhY2Ugc3RkIHsKKworZXh0ZXJuIGlzdHJlYW0gY2luOworZXh0ZXJuIG9zdHJlYW0gY291dDsKK2V4dGVybiBvc3RyZWFtIGNlcnI7CitleHRlcm4gb3N0cmVhbSBjbG9nOworZXh0ZXJuIHdpc3RyZWFtIHdjaW47CitleHRlcm4gd29zdHJlYW0gd2NvdXQ7CitleHRlcm4gd29zdHJlYW0gd2NlcnI7CitleHRlcm4gd29zdHJlYW0gd2Nsb2c7CisKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8aW9zPgorI2luY2x1ZGUgPHN0cmVhbWJ1Zj4KKyNpbmNsdWRlIDxpc3RyZWFtPgorI2luY2x1ZGUgPG9zdHJlYW0+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19TVERJTgorZXh0ZXJuIF9MSUJDUFBfRlVOQ19WSVMgaXN0cmVhbSBjaW47CitleHRlcm4gX0xJQkNQUF9GVU5DX1ZJUyB3aXN0cmVhbSB3Y2luOworI2VuZGlmCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1NURE9VVAorZXh0ZXJuIF9MSUJDUFBfRlVOQ19WSVMgb3N0cmVhbSBjb3V0OworZXh0ZXJuIF9MSUJDUFBfRlVOQ19WSVMgd29zdHJlYW0gd2NvdXQ7CisjZW5kaWYKK2V4dGVybiBfTElCQ1BQX0ZVTkNfVklTIG9zdHJlYW0gY2VycjsKK2V4dGVybiBfTElCQ1BQX0ZVTkNfVklTIHdvc3RyZWFtIHdjZXJyOworZXh0ZXJuIF9MSUJDUFBfRlVOQ19WSVMgb3N0cmVhbSBjbG9nOworZXh0ZXJuIF9MSUJDUFBfRlVOQ19WSVMgd29zdHJlYW0gd2Nsb2c7CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX0lPU1RSRUFNCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvaXN0cmVhbSBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9pc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNTc5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvaXN0cmVhbQpAQCAtMCwwICsxLDE2OTUgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpc3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfSVNUUkVBTQorI2RlZmluZSBfTElCQ1BQX0lTVFJFQU0KKworLyoKKyAgICBpc3RyZWFtIHN5bm9wc2lzCisKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzID0gY2hhcl90cmFpdHM8Y2hhclQ+ID4KK2NsYXNzIGJhc2ljX2lzdHJlYW0KKyAgICA6IHZpcnR1YWwgcHVibGljIGJhc2ljX2lvczxjaGFyVCx0cmFpdHM+Cit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMgKGluaGVyaXRlZCBmcm9tIGJhc2ljX2lvcyAoMjcuNS40KSk6CisgICAgdHlwZWRlZiBjaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgIHR5cGVkZWYgdHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIGludF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIHBvc190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlIG9mZl90eXBlOworCisgICAgLy8gMjcuNy4xLjEuMSBDb25zdHJ1Y3Rvci9kZXN0cnVjdG9yOgorICAgIGV4cGxpY2l0IGJhc2ljX2lzdHJlYW0oYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiBzYik7CisgICAgYmFzaWNfaXN0cmVhbShiYXNpY19pc3RyZWFtJiYgcmhzKTsKKyAgICB2aXJ0dWFsIH5iYXNpY19pc3RyZWFtKCk7CisKKyAgICAvLyAyNy43LjEuMS4yIEFzc2lnbi9zd2FwOgorICAgIGJhc2ljX2lzdHJlYW0mIG9wZXJhdG9yPShiYXNpY19pc3RyZWFtJiYgcmhzKTsKKyAgICB2b2lkIHN3YXAoYmFzaWNfaXN0cmVhbSYgcmhzKTsKKworICAgIC8vIDI3LjcuMS4xLjMgUHJlZml4L3N1ZmZpeDoKKyAgICBjbGFzcyBzZW50cnk7CisKKyAgICAvLyAyNy43LjEuMiBGb3JtYXR0ZWQgaW5wdXQ6CisgICAgYmFzaWNfaXN0cmVhbSYgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtJiAoKnBmKShiYXNpY19pc3RyZWFtJikpOworICAgIGJhc2ljX2lzdHJlYW0mIG9wZXJhdG9yPj4oYmFzaWNfaW9zPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+JgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwZikoYmFzaWNfaW9zPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+JikpOworICAgIGJhc2ljX2lzdHJlYW0mIG9wZXJhdG9yPj4oaW9zX2Jhc2UmICgqcGYpKGlvc19iYXNlJikpOworICAgIGJhc2ljX2lzdHJlYW0mIG9wZXJhdG9yPj4oYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiBzYik7CisgICAgYmFzaWNfaXN0cmVhbSYgb3BlcmF0b3I+Pihib29sJiBuKTsKKyAgICBiYXNpY19pc3RyZWFtJiBvcGVyYXRvcj4+KHNob3J0JiBuKTsKKyAgICBiYXNpY19pc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIHNob3J0JiBuKTsKKyAgICBiYXNpY19pc3RyZWFtJiBvcGVyYXRvcj4+KGludCYgbik7CisgICAgYmFzaWNfaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBpbnQmIG4pOworICAgIGJhc2ljX2lzdHJlYW0mIG9wZXJhdG9yPj4obG9uZyYgbik7CisgICAgYmFzaWNfaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nJiBuKTsKKyAgICBiYXNpY19pc3RyZWFtJiBvcGVyYXRvcj4+KGxvbmcgbG9uZyYgbik7CisgICAgYmFzaWNfaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nIGxvbmcmIG4pOworICAgIGJhc2ljX2lzdHJlYW0mIG9wZXJhdG9yPj4oZmxvYXQmIGYpOworICAgIGJhc2ljX2lzdHJlYW0mIG9wZXJhdG9yPj4oZG91YmxlJiBmKTsKKyAgICBiYXNpY19pc3RyZWFtJiBvcGVyYXRvcj4+KGxvbmcgZG91YmxlJiBmKTsKKyAgICBiYXNpY19pc3RyZWFtJiBvcGVyYXRvcj4+KHZvaWQqJiBwKTsKKworICAgIC8vIDI3LjcuMS4zIFVuZm9ybWF0dGVkIGlucHV0OgorICAgIHN0cmVhbXNpemUgZ2NvdW50KCkgY29uc3Q7CisgICAgaW50X3R5cGUgZ2V0KCk7CisgICAgYmFzaWNfaXN0cmVhbSYgZ2V0KGNoYXJfdHlwZSYgYyk7CisgICAgYmFzaWNfaXN0cmVhbSYgZ2V0KGNoYXJfdHlwZSogcywgc3RyZWFtc2l6ZSBuKTsKKyAgICBiYXNpY19pc3RyZWFtJiBnZXQoY2hhcl90eXBlKiBzLCBzdHJlYW1zaXplIG4sIGNoYXJfdHlwZSBkZWxpbSk7CisgICAgYmFzaWNfaXN0cmVhbSYgZ2V0KGJhc2ljX3N0cmVhbWJ1ZjxjaGFyX3R5cGUsdHJhaXRzX3R5cGU+JiBzYik7CisgICAgYmFzaWNfaXN0cmVhbSYgZ2V0KGJhc2ljX3N0cmVhbWJ1ZjxjaGFyX3R5cGUsdHJhaXRzX3R5cGU+JiBzYiwgY2hhcl90eXBlIGRlbGltKTsKKworICAgIGJhc2ljX2lzdHJlYW0mIGdldGxpbmUoY2hhcl90eXBlKiBzLCBzdHJlYW1zaXplIG4pOworICAgIGJhc2ljX2lzdHJlYW0mIGdldGxpbmUoY2hhcl90eXBlKiBzLCBzdHJlYW1zaXplIG4sIGNoYXJfdHlwZSBkZWxpbSk7CisKKyAgICBiYXNpY19pc3RyZWFtJiBpZ25vcmUoc3RyZWFtc2l6ZSBuID0gMSwgaW50X3R5cGUgZGVsaW0gPSB0cmFpdHNfdHlwZTo6ZW9mKCkpOworICAgIGludF90eXBlIHBlZWsoKTsKKyAgICBiYXNpY19pc3RyZWFtJiByZWFkIChjaGFyX3R5cGUqIHMsIHN0cmVhbXNpemUgbik7CisgICAgc3RyZWFtc2l6ZSByZWFkc29tZShjaGFyX3R5cGUqIHMsIHN0cmVhbXNpemUgbik7CisKKyAgICBiYXNpY19pc3RyZWFtJiBwdXRiYWNrKGNoYXJfdHlwZSBjKTsKKyAgICBiYXNpY19pc3RyZWFtJiB1bmdldCgpOworICAgIGludCBzeW5jKCk7CisKKyAgICBwb3NfdHlwZSB0ZWxsZygpOworICAgIGJhc2ljX2lzdHJlYW0mIHNlZWtnKHBvc190eXBlKTsKKyAgICBiYXNpY19pc3RyZWFtJiBzZWVrZyhvZmZfdHlwZSwgaW9zX2Jhc2U6OnNlZWtkaXIpOworcHJvdGVjdGVkOgorICAgIGJhc2ljX2lzdHJlYW0oY29uc3QgYmFzaWNfaXN0cmVhbSYgcmhzKSA9IGRlbGV0ZTsKKyAgICBiYXNpY19pc3RyZWFtKGJhc2ljX2lzdHJlYW0mJiByaHMpOworICAgIC8vIDI3LjcuMi4xLjIgQXNzaWduL3N3YXA6CisgICAgYmFzaWNfaXN0cmVhbSYgb3BlcmF0b3I9KGNvbnN0IGJhc2ljX2lzdHJlYW0mIHJocykgPSBkZWxldGU7CisgICAgYmFzaWNfaXN0cmVhbSYgb3BlcmF0b3I9KGJhc2ljX2lzdHJlYW0mJiByaHMpOworICAgIHZvaWQgc3dhcChiYXNpY19pc3RyZWFtJiByaHMpOworfTsKKworLy8gMjcuNy4xLjIuMyBjaGFyYWN0ZXIgZXh0cmFjdGlvbiB0ZW1wbGF0ZXM6Cit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICBiYXNpY19pc3RyZWFtPGNoYXJULHRyYWl0cz4mIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyVCx0cmFpdHM+JiwgY2hhclQmKTsKKwordGVtcGxhdGU8Y2xhc3MgdHJhaXRzPgorICBiYXNpY19pc3RyZWFtPGNoYXIsdHJhaXRzPiYgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXIsdHJhaXRzPiYsIHVuc2lnbmVkIGNoYXImKTsKKwordGVtcGxhdGU8Y2xhc3MgdHJhaXRzPgorICBiYXNpY19pc3RyZWFtPGNoYXIsdHJhaXRzPiYgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXIsdHJhaXRzPiYsIHNpZ25lZCBjaGFyJik7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgIGJhc2ljX2lzdHJlYW08Y2hhclQsdHJhaXRzPiYgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXJULHRyYWl0cz4mLCBjaGFyVCopOworCit0ZW1wbGF0ZTxjbGFzcyB0cmFpdHM+CisgIGJhc2ljX2lzdHJlYW08Y2hhcix0cmFpdHM+JiBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhcix0cmFpdHM+JiwgdW5zaWduZWQgY2hhciopOworCit0ZW1wbGF0ZTxjbGFzcyB0cmFpdHM+CisgIGJhc2ljX2lzdHJlYW08Y2hhcix0cmFpdHM+JiBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhcix0cmFpdHM+Jiwgc2lnbmVkIGNoYXIqKTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgIHZvaWQKKyAgc3dhcChiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JiB4LCBiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JiB5KTsKKwordHlwZWRlZiBiYXNpY19pc3RyZWFtPGNoYXI+IGlzdHJlYW07Cit0eXBlZGVmIGJhc2ljX2lzdHJlYW08d2NoYXJfdD4gd2lzdHJlYW07CisKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzID0gY2hhcl90cmFpdHM8Y2hhclQ+ID4KK2NsYXNzIGJhc2ljX2lvc3RyZWFtIDoKKyAgICBwdWJsaWMgYmFzaWNfaXN0cmVhbTxjaGFyVCx0cmFpdHM+LAorICAgIHB1YmxpYyBiYXNpY19vc3RyZWFtPGNoYXJULHRyYWl0cz4KK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlczoKKyAgICB0eXBlZGVmIGNoYXJUICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiB0cmFpdHMgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgaW50X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cG9zX3R5cGUgcG9zX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgb2ZmX3R5cGU7CisKKyAgICAvLyBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yCisgICAgZXhwbGljaXQgYmFzaWNfaW9zdHJlYW0oYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiBzYik7CisgICAgYmFzaWNfaW9zdHJlYW0oYmFzaWNfaW9zdHJlYW0mJiByaHMpOworICAgIHZpcnR1YWwgfmJhc2ljX2lvc3RyZWFtKCk7CisKKyAgICAvLyBhc3NpZ24vc3dhcAorICAgIGJhc2ljX2lvc3RyZWFtJiBvcGVyYXRvcj0oYmFzaWNfaW9zdHJlYW0mJiByaHMpOworICAgIHZvaWQgc3dhcChiYXNpY19pb3N0cmVhbSYgcmhzKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICB2b2lkCisgIHN3YXAoYmFzaWNfaW9zdHJlYW08Y2hhclQsIHRyYWl0cz4mIHgsIGJhc2ljX2lvc3RyZWFtPGNoYXJULCB0cmFpdHM+JiB5KTsKKwordHlwZWRlZiBiYXNpY19pb3N0cmVhbTxjaGFyPiBpb3N0cmVhbTsKK3R5cGVkZWYgYmFzaWNfaW9zdHJlYW08d2NoYXJfdD4gd2lvc3RyZWFtOworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgYmFzaWNfaXN0cmVhbTxjaGFyVCx0cmFpdHM+JgorICB3cyhiYXNpY19pc3RyZWFtPGNoYXJULHRyYWl0cz4mIGlzKTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIFQ+CisgIGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYmIGlzLCBUJiB4KTsKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxvc3RyZWFtPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9QVVNIX01BQ1JPUworI2luY2x1ZGUgPF9fdW5kZWZfbWFjcm9zPgorCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYmFzaWNfaXN0cmVhbQorICAgIDogdmlydHVhbCBwdWJsaWMgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4KK3sKKyAgICBzdHJlYW1zaXplIF9fZ2NfOworcHVibGljOgorICAgIC8vIHR5cGVzIChpbmhlcml0ZWQgZnJvbSBiYXNpY19pb3MgKDI3LjUuNCkpOgorICAgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSBvZmZfdHlwZTsKKworICAgIC8vIDI3LjcuMS4xLjEgQ29uc3RydWN0b3IvZGVzdHJ1Y3RvcjoKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBiYXNpY19pc3RyZWFtKGJhc2ljX3N0cmVhbWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiogX19zYikgOiBfX2djXygwKQorICAgIHsgdGhpcy0+aW5pdChfX3NiKTsgfQorICAgIHZpcnR1YWwgfmJhc2ljX2lzdHJlYW0oKTsKK3Byb3RlY3RlZDoKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19pc3RyZWFtKGJhc2ljX2lzdHJlYW0mJiBfX3Jocyk7CisKKyAgICAvLyAyNy43LjEuMS4yIEFzc2lnbi9zd2FwOgorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfaXN0cmVhbSYgb3BlcmF0b3I9KGJhc2ljX2lzdHJlYW0mJiBfX3Jocyk7CisjZW5kaWYKKworICAgIGlubGluZSBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc3dhcChiYXNpY19pc3RyZWFtJiBfX3JocykgeworICAgICAgX1ZTVEQ6OnN3YXAoX19nY18sIF9fcmhzLl9fZ2NfKTsKKyAgICAgIGJhc2ljX2lvczxjaGFyX3R5cGUsIHRyYWl0c190eXBlPjo6c3dhcChfX3Jocyk7CisgICAgfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIGJhc2ljX2lzdHJlYW0gICAgICAgICAgIChjb25zdCBiYXNpY19pc3RyZWFtJiBfX3JocykgPSBkZWxldGU7CisgICAgYmFzaWNfaXN0cmVhbSYgb3BlcmF0b3I9KGNvbnN0IGJhc2ljX2lzdHJlYW0mIF9fcmhzKSA9IGRlbGV0ZTsKKyNlbmRpZgorcHVibGljOgorCisgICAgLy8gMjcuNy4xLjEuMyBQcmVmaXgvc3VmZml4OgorICAgIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHNlbnRyeTsKKworICAgIC8vIDI3LjcuMS4yIEZvcm1hdHRlZCBpbnB1dDoKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19pc3RyZWFtJiBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW0mICgqX19wZikoYmFzaWNfaXN0cmVhbSYpKQorICAgIHsgcmV0dXJuIF9fcGYoKnRoaXMpOyB9CisKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19pc3RyZWFtJiBvcGVyYXRvcj4+KGJhc2ljX2lvczxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqX19wZikoYmFzaWNfaW9zPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+JikpCisgICAgeyBfX3BmKCp0aGlzKTsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19pc3RyZWFtJiBvcGVyYXRvcj4+KGlvc19iYXNlJiAoKl9fcGYpKGlvc19iYXNlJikpCisgICAgeyBfX3BmKCp0aGlzKTsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBiYXNpY19pc3RyZWFtJiBvcGVyYXRvcj4+KGJhc2ljX3N0cmVhbWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiogX19zYik7CisgICAgYmFzaWNfaXN0cmVhbSYgb3BlcmF0b3I+Pihib29sJiBfX24pOworICAgIGJhc2ljX2lzdHJlYW0mIG9wZXJhdG9yPj4oc2hvcnQmIF9fbik7CisgICAgYmFzaWNfaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBzaG9ydCYgX19uKTsKKyAgICBiYXNpY19pc3RyZWFtJiBvcGVyYXRvcj4+KGludCYgX19uKTsKKyAgICBiYXNpY19pc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIGludCYgX19uKTsKKyAgICBiYXNpY19pc3RyZWFtJiBvcGVyYXRvcj4+KGxvbmcmIF9fbik7CisgICAgYmFzaWNfaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nJiBfX24pOworICAgIGJhc2ljX2lzdHJlYW0mIG9wZXJhdG9yPj4obG9uZyBsb25nJiBfX24pOworICAgIGJhc2ljX2lzdHJlYW0mIG9wZXJhdG9yPj4odW5zaWduZWQgbG9uZyBsb25nJiBfX24pOworICAgIGJhc2ljX2lzdHJlYW0mIG9wZXJhdG9yPj4oZmxvYXQmIF9fZik7CisgICAgYmFzaWNfaXN0cmVhbSYgb3BlcmF0b3I+Pihkb3VibGUmIF9fZik7CisgICAgYmFzaWNfaXN0cmVhbSYgb3BlcmF0b3I+Pihsb25nIGRvdWJsZSYgX19mKTsKKyAgICBiYXNpY19pc3RyZWFtJiBvcGVyYXRvcj4+KHZvaWQqJiBfX3ApOworCisgICAgLy8gMjcuNy4xLjMgVW5mb3JtYXR0ZWQgaW5wdXQ6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0cmVhbXNpemUgZ2NvdW50KCkgY29uc3Qge3JldHVybiBfX2djXzt9CisgICAgaW50X3R5cGUgZ2V0KCk7CisKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19pc3RyZWFtJiBnZXQoY2hhcl90eXBlJiBfX2MpIHsKKyAgICAgIGludF90eXBlIF9fY2ggPSBnZXQoKTsKKyAgICAgIGlmIChfX2NoICE9IHRyYWl0c190eXBlOjplb2YoKSkKKyAgICAgICAgX19jID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2NoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19pc3RyZWFtJiBnZXQoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQorICAgIHsgcmV0dXJuIGdldChfX3MsIF9fbiwgdGhpcy0+d2lkZW4oJ1xuJykpOyB9CisKKyAgICBiYXNpY19pc3RyZWFtJiBnZXQoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uLCBjaGFyX3R5cGUgX19kbG0pOworCisgICAgaW5saW5lIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfaXN0cmVhbSYgZ2V0KGJhc2ljX3N0cmVhbWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiYgX19zYikKKyAgICB7IHJldHVybiBnZXQoX19zYiwgdGhpcy0+d2lkZW4oJ1xuJykpOyB9CisKKyAgICBiYXNpY19pc3RyZWFtJiBnZXQoYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+JiBfX3NiLCBjaGFyX3R5cGUgX19kbG0pOworCisgICAgaW5saW5lIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfaXN0cmVhbSYgZ2V0bGluZShjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgeyByZXR1cm4gZ2V0bGluZShfX3MsIF9fbiwgdGhpcy0+d2lkZW4oJ1xuJykpOyB9CisKKyAgICBiYXNpY19pc3RyZWFtJiBnZXRsaW5lKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbiwgY2hhcl90eXBlIF9fZGxtKTsKKworICAgIGJhc2ljX2lzdHJlYW0mIGlnbm9yZShzdHJlYW1zaXplIF9fbiA9IDEsIGludF90eXBlIF9fZGxtID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKKyAgICBpbnRfdHlwZSBwZWVrKCk7CisgICAgYmFzaWNfaXN0cmVhbSYgcmVhZCAoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKyAgICBzdHJlYW1zaXplIHJlYWRzb21lKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbik7CisKKyAgICBiYXNpY19pc3RyZWFtJiBwdXRiYWNrKGNoYXJfdHlwZSBfX2MpOworICAgIGJhc2ljX2lzdHJlYW0mIHVuZ2V0KCk7CisgICAgaW50IHN5bmMoKTsKKworICAgIHBvc190eXBlIHRlbGxnKCk7CisgICAgYmFzaWNfaXN0cmVhbSYgc2Vla2cocG9zX3R5cGUgX19wb3MpOworICAgIGJhc2ljX2lzdHJlYW0mIHNlZWtnKG9mZl90eXBlIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX2Rpcik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnkKK3sKKyAgICBib29sIF9fb2tfOworCisgICAgc2VudHJ5KGNvbnN0IHNlbnRyeSYpOyAvLyA9IGRlbGV0ZTsKKyAgICBzZW50cnkmIG9wZXJhdG9yPShjb25zdCBzZW50cnkmKTsgLy8gPSBkZWxldGU7CisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBzZW50cnkoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCBib29sIF9fbm9za2lwd3MgPSBmYWxzZSk7CisvLyAgICB+c2VudHJ5KCkgPSBkZWZhdWx0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBfTElCQ1BQX0VYUExJQ0lUCisgICAgICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7cmV0dXJuIF9fb2tfO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeTo6c2VudHJ5KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX25vc2tpcHdzKQorICAgIDogX19va18oZmFsc2UpCit7CisgICAgaWYgKF9faXMuZ29vZCgpKQorICAgIHsKKyAgICAgICAgaWYgKF9faXMudGllKCkpCisgICAgICAgICAgICBfX2lzLnRpZSgpLT5mbHVzaCgpOworICAgICAgICBpZiAoIV9fbm9za2lwd3MgJiYgKF9faXMuZmxhZ3MoKSAmIGlvc19iYXNlOjpza2lwd3MpKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiBfSXA7CisgICAgICAgICAgICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0ID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2lzLmdldGxvYygpKTsKKyAgICAgICAgICAgIF9JcCBfX2koX19pcyk7CisgICAgICAgICAgICBfSXAgX19lb2Y7CisgICAgICAgICAgICBmb3IgKDsgX19pICE9IF9fZW9mOyArK19faSkKKyAgICAgICAgICAgICAgICBpZiAoIV9fY3QuaXMoX19jdC5zcGFjZSwgKl9faSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKF9faSA9PSBfX2VvZikKKyAgICAgICAgICAgICAgICBfX2lzLnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0IHwgaW9zX2Jhc2U6OmVvZmJpdCk7CisgICAgICAgIH0KKyAgICAgICAgX19va18gPSBfX2lzLmdvb2QoKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBfX2lzLnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6YmFzaWNfaXN0cmVhbShiYXNpY19pc3RyZWFtJiYgX19yaHMpCisgICAgOiBfX2djXyhfX3Jocy5fX2djXykKK3sKKyAgICBfX3Jocy5fX2djXyA9IDA7CisgICAgdGhpcy0+bW92ZShfX3Jocyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPShiYXNpY19pc3RyZWFtJiYgX19yaHMpCit7CisgICAgc3dhcChfX3Jocyk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojp+YmFzaWNfaXN0cmVhbSgpCit7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4odW5zaWduZWQgc2hvcnQmIF9fbikKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgc2VudHJ5IF9fcygqdGhpcyk7CisgICAgICAgIGlmIChfX3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiBfSXA7CisgICAgICAgICAgICB0eXBlZGVmIG51bV9nZXQ8Y2hhcl90eXBlLCBfSXA+IF9GcDsKKyAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICAgICAgICB1c2VfZmFjZXQ8X0ZwPih0aGlzLT5nZXRsb2MoKSkuZ2V0KF9JcCgqdGhpcyksIF9JcCgpLCAqdGhpcywgX19lcnIsIF9fbik7CisgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICB0aGlzLT5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I+Pih1bnNpZ25lZCBpbnQmIF9fbikKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgc2VudHJ5IF9fcygqdGhpcyk7CisgICAgICAgIGlmIChfX3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiBfSXA7CisgICAgICAgICAgICB0eXBlZGVmIG51bV9nZXQ8Y2hhcl90eXBlLCBfSXA+IF9GcDsKKyAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICAgICAgICB1c2VfZmFjZXQ8X0ZwPih0aGlzLT5nZXRsb2MoKSkuZ2V0KF9JcCgqdGhpcyksIF9JcCgpLCAqdGhpcywgX19lcnIsIF9fbik7CisgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICB0aGlzLT5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I+Pihsb25nJiBfX24pCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHNlbnRyeSBfX3MoKnRoaXMpOworICAgICAgICBpZiAoX19zKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gX0lwOworICAgICAgICAgICAgdHlwZWRlZiBudW1fZ2V0PGNoYXJfdHlwZSwgX0lwPiBfRnA7CisgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgICAgICAgdXNlX2ZhY2V0PF9GcD4odGhpcy0+Z2V0bG9jKCkpLmdldChfSXAoKnRoaXMpLCBfSXAoKSwgKnRoaXMsIF9fZXJyLCBfX24pOworICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgdGhpcy0+X19zZXRfYmFkYml0X2FuZF9jb25zaWRlcl9yZXRocm93KCk7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4odW5zaWduZWQgbG9uZyYgX19uKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICBzZW50cnkgX19zKCp0aGlzKTsKKyAgICAgICAgaWYgKF9fcykKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZWRlZiBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+IF9JcDsKKyAgICAgICAgICAgIHR5cGVkZWYgbnVtX2dldDxjaGFyX3R5cGUsIF9JcD4gX0ZwOworICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgICAgICAgIHVzZV9mYWNldDxfRnA+KHRoaXMtPmdldGxvYygpKS5nZXQoX0lwKCp0aGlzKSwgX0lwKCksICp0aGlzLCBfX2VyciwgX19uKTsKKyAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+KGxvbmcgbG9uZyYgX19uKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICBzZW50cnkgX19zKCp0aGlzKTsKKyAgICAgICAgaWYgKF9fcykKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZWRlZiBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+IF9JcDsKKyAgICAgICAgICAgIHR5cGVkZWYgbnVtX2dldDxjaGFyX3R5cGUsIF9JcD4gX0ZwOworICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgICAgICAgIHVzZV9mYWNldDxfRnA+KHRoaXMtPmdldGxvYygpKS5nZXQoX0lwKCp0aGlzKSwgX0lwKCksICp0aGlzLCBfX2VyciwgX19uKTsKKyAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+KHVuc2lnbmVkIGxvbmcgbG9uZyYgX19uKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICBzZW50cnkgX19zKCp0aGlzKTsKKyAgICAgICAgaWYgKF9fcykKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZWRlZiBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+IF9JcDsKKyAgICAgICAgICAgIHR5cGVkZWYgbnVtX2dldDxjaGFyX3R5cGUsIF9JcD4gX0ZwOworICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgICAgICAgIHVzZV9mYWNldDxfRnA+KHRoaXMtPmdldGxvYygpKS5nZXQoX0lwKCp0aGlzKSwgX0lwKCksICp0aGlzLCBfX2VyciwgX19uKTsKKyAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+KGZsb2F0JiBfX24pCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHNlbnRyeSBfX3MoKnRoaXMpOworICAgICAgICBpZiAoX19zKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gX0lwOworICAgICAgICAgICAgdHlwZWRlZiBudW1fZ2V0PGNoYXJfdHlwZSwgX0lwPiBfRnA7CisgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgICAgICAgdXNlX2ZhY2V0PF9GcD4odGhpcy0+Z2V0bG9jKCkpLmdldChfSXAoKnRoaXMpLCBfSXAoKSwgKnRoaXMsIF9fZXJyLCBfX24pOworICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgdGhpcy0+X19zZXRfYmFkYml0X2FuZF9jb25zaWRlcl9yZXRocm93KCk7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4oZG91YmxlJiBfX24pCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHNlbnRyeSBfX3MoKnRoaXMpOworICAgICAgICBpZiAoX19zKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gX0lwOworICAgICAgICAgICAgdHlwZWRlZiBudW1fZ2V0PGNoYXJfdHlwZSwgX0lwPiBfRnA7CisgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgICAgICAgdXNlX2ZhY2V0PF9GcD4odGhpcy0+Z2V0bG9jKCkpLmdldChfSXAoKnRoaXMpLCBfSXAoKSwgKnRoaXMsIF9fZXJyLCBfX24pOworICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgdGhpcy0+X19zZXRfYmFkYml0X2FuZF9jb25zaWRlcl9yZXRocm93KCk7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4obG9uZyBkb3VibGUmIF9fbikKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgc2VudHJ5IF9fcygqdGhpcyk7CisgICAgICAgIGlmIChfX3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiBfSXA7CisgICAgICAgICAgICB0eXBlZGVmIG51bV9nZXQ8Y2hhcl90eXBlLCBfSXA+IF9GcDsKKyAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICAgICAgICB1c2VfZmFjZXQ8X0ZwPih0aGlzLT5nZXRsb2MoKSkuZ2V0KF9JcCgqdGhpcyksIF9JcCgpLCAqdGhpcywgX19lcnIsIF9fbik7CisgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICB0aGlzLT5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I+Pihib29sJiBfX24pCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHNlbnRyeSBfX3MoKnRoaXMpOworICAgICAgICBpZiAoX19zKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gX0lwOworICAgICAgICAgICAgdHlwZWRlZiBudW1fZ2V0PGNoYXJfdHlwZSwgX0lwPiBfRnA7CisgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgICAgICAgdXNlX2ZhY2V0PF9GcD4odGhpcy0+Z2V0bG9jKCkpLmdldChfSXAoKnRoaXMpLCBfSXAoKSwgKnRoaXMsIF9fZXJyLCBfX24pOworICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgdGhpcy0+X19zZXRfYmFkYml0X2FuZF9jb25zaWRlcl9yZXRocm93KCk7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4odm9pZComIF9fbikKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgc2VudHJ5IF9fcygqdGhpcyk7CisgICAgICAgIGlmIChfX3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiBfSXA7CisgICAgICAgICAgICB0eXBlZGVmIG51bV9nZXQ8Y2hhcl90eXBlLCBfSXA+IF9GcDsKKyAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICAgICAgICB1c2VfZmFjZXQ8X0ZwPih0aGlzLT5nZXRsb2MoKSkuZ2V0KF9JcCgqdGhpcyksIF9JcCgpLCAqdGhpcywgX19lcnIsIF9fbik7CisgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICB0aGlzLT5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I+PihzaG9ydCYgX19uKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICBzZW50cnkgX19zKCp0aGlzKTsKKyAgICAgICAgaWYgKF9fcykKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZWRlZiBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+IF9JcDsKKyAgICAgICAgICAgIHR5cGVkZWYgbnVtX2dldDxjaGFyX3R5cGUsIF9JcD4gX0ZwOworICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgICAgICAgIGxvbmcgX190ZW1wOworICAgICAgICAgICAgdXNlX2ZhY2V0PF9GcD4odGhpcy0+Z2V0bG9jKCkpLmdldChfSXAoKnRoaXMpLCBfSXAoKSwgKnRoaXMsIF9fZXJyLCBfX3RlbXApOworICAgICAgICAgICAgaWYgKF9fdGVtcCA8IG51bWVyaWNfbGltaXRzPHNob3J0Pjo6bWluKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgICAgICAgICAgX19uID0gbnVtZXJpY19saW1pdHM8c2hvcnQ+OjptaW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKF9fdGVtcCA+IG51bWVyaWNfbGltaXRzPHNob3J0Pjo6bWF4KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgICAgICAgICAgX19uID0gbnVtZXJpY19saW1pdHM8c2hvcnQ+OjptYXgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfX24gPSBzdGF0aWNfY2FzdDxzaG9ydD4oX190ZW1wKTsKKyAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj4+KGludCYgX19uKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICBzZW50cnkgX19zKCp0aGlzKTsKKyAgICAgICAgaWYgKF9fcykKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZWRlZiBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+IF9JcDsKKyAgICAgICAgICAgIHR5cGVkZWYgbnVtX2dldDxjaGFyX3R5cGUsIF9JcD4gX0ZwOworICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgICAgICAgIGxvbmcgX190ZW1wOworICAgICAgICAgICAgdXNlX2ZhY2V0PF9GcD4odGhpcy0+Z2V0bG9jKCkpLmdldChfSXAoKnRoaXMpLCBfSXAoKSwgKnRoaXMsIF9fZXJyLCBfX3RlbXApOworICAgICAgICAgICAgaWYgKF9fdGVtcCA8IG51bWVyaWNfbGltaXRzPGludD46Om1pbigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICAgICAgICAgIF9fbiA9IG51bWVyaWNfbGltaXRzPGludD46Om1pbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX190ZW1wID4gbnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgICAgICAgICAgX19uID0gbnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX19uID0gc3RhdGljX2Nhc3Q8aW50PihfX3RlbXApOworICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgdGhpcy0+X19zZXRfYmFkYml0X2FuZF9jb25zaWRlcl9yZXRocm93KCk7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCBfQ2hhclQqIF9fcykKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnkgX19zZW4oX19pcyk7CisgICAgICAgIGlmIChfX3NlbikKKyAgICAgICAgeworICAgICAgICAgICAgc3RyZWFtc2l6ZSBfX24gPSBfX2lzLndpZHRoKCk7CisgICAgICAgICAgICBpZiAoX19uIDw9IDApCisgICAgICAgICAgICAgICAgX19uID0gbnVtZXJpY19saW1pdHM8c3RyZWFtc2l6ZT46Om1heCgpIC8gc2l6ZW9mKF9DaGFyVCkgLSAxOworICAgICAgICAgICAgc3RyZWFtc2l6ZSBfX2MgPSAwOworICAgICAgICAgICAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdCA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19pcy5nZXRsb2MoKSk7CisgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgICAgICAgd2hpbGUgKF9fYyA8IF9fbi0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9faSA9IF9faXMucmRidWYoKS0+c2dldGMoKTsKKyAgICAgICAgICAgICAgICBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19pLCBfVHJhaXRzOjplb2YoKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9DaGFyVCBfX2NoID0gX1RyYWl0czo6dG9fY2hhcl90eXBlKF9faSk7CisgICAgICAgICAgICAgICAgaWYgKF9fY3QuaXMoX19jdC5zcGFjZSwgX19jaCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICpfX3MrKyA9IF9fY2g7CisgICAgICAgICAgICAgICAgKytfX2M7CisgICAgICAgICAgICAgICAgIF9faXMucmRidWYoKS0+c2J1bXBjKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqX19zID0gX0NoYXJUKCk7CisgICAgICAgICAgICBfX2lzLndpZHRoKDApOworICAgICAgICAgICAgaWYgKF9fYyA9PSAwKQorICAgICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgICAgICBfX2lzLnNldHN0YXRlKF9fZXJyKTsKKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIF9faXMuX19zZXRfYmFkYml0X2FuZF9jb25zaWRlcl9yZXRocm93KCk7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICByZXR1cm4gX19pczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX2lzLCB1bnNpZ25lZCBjaGFyKiBfX3MpCit7CisgICAgcmV0dXJuIF9faXMgPj4gKGNoYXIqKV9fczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX2lzLCBzaWduZWQgY2hhciogX19zKQoreworICAgIHJldHVybiBfX2lzID4+IChjaGFyKilfX3M7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCBfQ2hhclQmIF9fYykKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnkgX19zZW4oX19pcyk7CisgICAgICAgIGlmIChfX3NlbikKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX19pID0gX19pcy5yZGJ1ZigpLT5zYnVtcGMoKTsKKyAgICAgICAgICAgIGlmIChfVHJhaXRzOjplcV9pbnRfdHlwZShfX2ksIF9UcmFpdHM6OmVvZigpKSkKKyAgICAgICAgICAgICAgICBfX2lzLnNldHN0YXRlKGlvc19iYXNlOjplb2ZiaXQgfCBpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX19jID0gX1RyYWl0czo6dG9fY2hhcl90eXBlKF9faSk7CisgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICBfX2lzLl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuIF9faXM7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19pcywgdW5zaWduZWQgY2hhciYgX19jKQoreworICAgIHJldHVybiBfX2lzID4+IChjaGFyJilfX2M7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19pcywgc2lnbmVkIGNoYXImIF9fYykKK3sKKyAgICByZXR1cm4gX19pcyA+PiAoY2hhciYpX19jOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPj4oYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiBfX3NiKQoreworICAgIF9fZ2NfID0gMDsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgc2VudHJ5IF9fcygqdGhpcywgdHJ1ZSk7CisgICAgICAgIGlmIChfX3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX3NiKQorICAgICAgICAgICAgeworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIF9faSA9IHRoaXMtPnJkYnVmKCktPnNnZXRjKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9faSwgX1RyYWl0czo6ZW9mKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zYi0+c3B1dGModHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2kpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU6OmVvZigpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrX19nY187CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5yZGJ1ZigpLT5zYnVtcGMoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoX19nY18gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoICguLi4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX19nY18gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPl9fc2V0X2ZhaWxiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit0eXBlbmFtZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmludF90eXBlCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmdldCgpCit7CisgICAgX19nY18gPSAwOworICAgIGludF90eXBlIF9fciA9IHRyYWl0c190eXBlOjplb2YoKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgc2VudHJ5IF9fcygqdGhpcywgdHJ1ZSk7CisgICAgICAgIGlmIChfX3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fciA9IHRoaXMtPnJkYnVmKCktPnNidW1wYygpOworICAgICAgICAgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX3IsIHRyYWl0c190eXBlOjplb2YoKSkpCisgICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCB8IGlvc19iYXNlOjplb2ZiaXQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9fZ2NfID0gMTsKKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpnZXQoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uLCBjaGFyX3R5cGUgX19kbG0pCit7CisgICAgX19nY18gPSAwOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICBzZW50cnkgX19zZW4oKnRoaXMsIHRydWUpOworICAgICAgICBpZiAoX19zZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX24gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICAgICAgICAgICAgd2hpbGUgKF9fZ2NfIDwgX19uLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnRfdHlwZSBfX2kgPSB0aGlzLT5yZGJ1ZigpLT5zZ2V0YygpOworICAgICAgICAgICAgICAgICAgICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9faSwgdHJhaXRzX3R5cGU6OmVvZigpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGUgX19jaCA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWl0c190eXBlOjplcShfX2NoLCBfX2RsbSkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgKl9fcysrID0gX19jaDsKKyAgICAgICAgICAgICAgICAgICAgKytfX2djXzsKKyAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnJkYnVmKCktPnNidW1wYygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoX19nY18gPT0gMCkKKyAgICAgICAgICAgICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgICAgICB9CisgICAgICAgIGlmIChfX24gPiAwKQorICAgICAgICAgICAgKl9fcyA9IGNoYXJfdHlwZSgpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIGlmIChfX24gPiAwKQorICAgICAgICAgICAgKl9fcyA9IGNoYXJfdHlwZSgpOworICAgICAgICB0aGlzLT5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpnZXQoYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+JiBfX3NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlIF9fZGxtKQoreworICAgIF9fZ2NfID0gMDsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgc2VudHJ5IF9fc2VuKCp0aGlzLCB0cnVlKTsKKyAgICAgICAgaWYgKF9fc2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSBfX2kgPSB0aGlzLT5yZGJ1ZigpLT5zZ2V0YygpOworICAgICAgICAgICAgICAgICAgICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9faSwgdHJhaXRzX3R5cGU6OmVvZigpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGUgX19jaCA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWl0c190eXBlOjplcShfX2NoLCBfX2RsbSkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX3NiLnNwdXRjKF9fY2gpLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICsrX19nY187CisgICAgICAgICAgICAgICAgICAgIHRoaXMtPnJkYnVmKCktPnNidW1wYygpOworICAgICAgICAgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoLi4uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIGlmIChfX2djXyA9PSAwKQorICAgICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICB0aGlzLT5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpnZXRsaW5lKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbiwgY2hhcl90eXBlIF9fZGxtKQoreworICAgIF9fZ2NfID0gMDsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgc2VudHJ5IF9fc2VuKCp0aGlzLCB0cnVlKTsKKyAgICAgICAgaWYgKF9fc2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIF9faSA9IHRoaXMtPnJkYnVmKCktPnNnZXRjKCk7CisgICAgICAgICAgICAgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2ksIHRyYWl0c190eXBlOjplb2YoKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoYXJfdHlwZSBfX2NoID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2kpOworICAgICAgICAgICAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXEoX19jaCwgX19kbG0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy0+cmRidWYoKS0+c2J1bXBjKCk7CisgICAgICAgICAgICAgICAgICAgICsrX19nY187CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoX19nY18gPj0gX19uLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpfX3MrKyA9IF9fY2g7CisgICAgICAgICAgICAgICAgdGhpcy0+cmRidWYoKS0+c2J1bXBjKCk7CisgICAgICAgICAgICAgICAgKytfX2djXzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfX2djXyA9PSAwKQorICAgICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fbiA+IDApCisgICAgICAgICAgICAqX19zID0gY2hhcl90eXBlKCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgaWYgKF9fbiA+IDApCisgICAgICAgICAgICAqX19zID0gY2hhcl90eXBlKCk7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Omlnbm9yZShzdHJlYW1zaXplIF9fbiwgaW50X3R5cGUgX19kbG0pCit7CisgICAgX19nY18gPSAwOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICBzZW50cnkgX19zZW4oKnRoaXMsIHRydWUpOworICAgICAgICBpZiAoX19zZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICAgICAgICBpZiAoX19uID09IG51bWVyaWNfbGltaXRzPHN0cmVhbXNpemU+OjptYXgoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSBfX2kgPSB0aGlzLT5yZGJ1ZigpLT5zYnVtcGMoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2ksIHRyYWl0c190eXBlOjplb2YoKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKytfX2djXzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2ksIF9fZGxtKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoX19nY18gPCBfX24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgX19pID0gdGhpcy0+cmRidWYoKS0+c2J1bXBjKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19pLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrX19nY187CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19pLCBfX2RsbSkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICB0aGlzLT5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpwZWVrKCkKK3sKKyAgICBfX2djXyA9IDA7CisgICAgaW50X3R5cGUgX19yID0gdHJhaXRzX3R5cGU6OmVvZigpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICBzZW50cnkgX19zZW4oKnRoaXMsIHRydWUpOworICAgICAgICBpZiAoX19zZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fciA9IHRoaXMtPnJkYnVmKCktPnNnZXRjKCk7CisgICAgICAgICAgICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fciwgdHJhaXRzX3R5cGU6OmVvZigpKSkKKyAgICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZW9mYml0KTsKKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpyZWFkKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKK3sKKyAgICBfX2djXyA9IDA7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHNlbnRyeSBfX3NlbigqdGhpcywgdHJ1ZSk7CisgICAgICAgIGlmIChfX3NlbikKKyAgICAgICAgeworICAgICAgICAgICAgX19nY18gPSB0aGlzLT5yZGJ1ZigpLT5zZ2V0bihfX3MsIF9fbik7CisgICAgICAgICAgICBpZiAoX19nY18gIT0gX19uKQorICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0IHwgaW9zX2Jhc2U6OmVvZmJpdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitzdHJlYW1zaXplCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnJlYWRzb21lKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKK3sKKyAgICBfX2djXyA9IDA7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHNlbnRyeSBfX3NlbigqdGhpcywgdHJ1ZSk7CisgICAgICAgIGlmIChfX3NlbikKKyAgICAgICAgeworICAgICAgICAgICAgc3RyZWFtc2l6ZSBfX2MgPSB0aGlzLT5yZGJ1ZigpLT5pbl9hdmFpbCgpOworICAgICAgICAgICAgc3dpdGNoIChfX2MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjplb2ZiaXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZWFkKF9fcywgX1ZTVEQ6Om1pbihfX2MsIF9fbikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICB0aGlzLT5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiBfX2djXzsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpwdXRiYWNrKGNoYXJfdHlwZSBfX2MpCit7CisgICAgX19nY18gPSAwOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0aGlzLT5jbGVhcih0aGlzLT5yZHN0YXRlKCkgJiB+aW9zX2Jhc2U6OmVvZmJpdCk7CisgICAgICAgIHNlbnRyeSBfX3NlbigqdGhpcywgdHJ1ZSk7CisgICAgICAgIGlmIChfX3NlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRoaXMtPnJkYnVmKCkgPT0gMCB8fCB0aGlzLT5yZGJ1ZigpLT5zcHV0YmFja2MoX19jKSA9PSB0cmFpdHNfdHlwZTo6ZW9mKCkpCisgICAgICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnVuZ2V0KCkKK3sKKyAgICBfX2djXyA9IDA7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHRoaXMtPmNsZWFyKHRoaXMtPnJkc3RhdGUoKSAmIH5pb3NfYmFzZTo6ZW9mYml0KTsKKyAgICAgICAgc2VudHJ5IF9fc2VuKCp0aGlzLCB0cnVlKTsKKyAgICAgICAgaWYgKF9fc2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhpcy0+cmRidWYoKSA9PSAwIHx8IHRoaXMtPnJkYnVmKCktPnN1bmdldGMoKSA9PSB0cmFpdHNfdHlwZTo6ZW9mKCkpCisgICAgICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbnQKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c3luYygpCit7CisgICAgaW50IF9fciA9IDA7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHNlbnRyeSBfX3NlbigqdGhpcywgdHJ1ZSk7CisgICAgICAgIGlmIChfX3NlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRoaXMtPnJkYnVmKCkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAodGhpcy0+cmRidWYoKS0+cHVic3luYygpID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojpwb3NfdHlwZQorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojp0ZWxsZygpCit7CisgICAgcG9zX3R5cGUgX19yKC0xKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgc2VudHJ5IF9fc2VuKCp0aGlzLCB0cnVlKTsKKyAgICAgICAgaWYgKF9fc2VuKQorICAgICAgICAgICAgX19yID0gdGhpcy0+cmRidWYoKS0+cHVic2Vla29mZigwLCBpb3NfYmFzZTo6Y3VyLCBpb3NfYmFzZTo6aW4pOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZWVrZyhwb3NfdHlwZSBfX3BvcykKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgdGhpcy0+Y2xlYXIodGhpcy0+cmRzdGF0ZSgpICYgfmlvc19iYXNlOjplb2ZiaXQpOworICAgICAgICBzZW50cnkgX19zZW4oKnRoaXMsIHRydWUpOworICAgICAgICBpZiAoX19zZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGlzLT5yZGJ1ZigpLT5wdWJzZWVrcG9zKF9fcG9zLCBpb3NfYmFzZTo6aW4pID09IHBvc190eXBlKC0xKSkKKyAgICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICB0aGlzLT5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZWVrZyhvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX19kaXIpCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHRoaXMtPmNsZWFyKHRoaXMtPnJkc3RhdGUoKSAmIH5pb3NfYmFzZTo6ZW9mYml0KTsKKyAgICAgICAgc2VudHJ5IF9fc2VuKCp0aGlzLCB0cnVlKTsKKyAgICAgICAgaWYgKF9fc2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhpcy0+cmRidWYoKS0+cHVic2Vla29mZihfX29mZiwgX19kaXIsIGlvc19iYXNlOjppbikgPT0gcG9zX3R5cGUoLTEpKQorICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgord3MoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0eXBlbmFtZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeSBfX3NlbihfX2lzLCB0cnVlKTsKKyAgICAgICAgaWYgKF9fc2VuKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0ID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2lzLmdldGxvYygpKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9faSA9IF9faXMucmRidWYoKS0+c2dldGMoKTsKKyAgICAgICAgICAgICAgICBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19pLCBfVHJhaXRzOjplb2YoKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIF9faXMuc2V0c3RhdGUoaW9zX2Jhc2U6OmVvZmJpdCk7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghX19jdC5pcyhfX2N0LnNwYWNlLCBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19pKSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIF9faXMucmRidWYoKS0+c2J1bXBjKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICBfX2lzLl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuIF9faXM7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYmIF9faXMsIF9UcCYmIF9feCkKK3sKKyAgICBfX2lzID4+IF9WU1REOjpmb3J3YXJkPF9UcD4oX194KTsKKyAgICByZXR1cm4gX19pczsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGJhc2ljX2lvc3RyZWFtCisgICAgOiBwdWJsaWMgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+LAorICAgICAgcHVibGljIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPgoreworcHVibGljOgorICAgIC8vIHR5cGVzOgorICAgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSBvZmZfdHlwZTsKKworICAgIC8vIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBiYXNpY19pb3N0cmVhbShiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIF9fc2IpCisgICAgICA6IGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPihfX3NiKQorICAgIHt9CisKKyAgICB2aXJ0dWFsIH5iYXNpY19pb3N0cmVhbSgpOworcHJvdGVjdGVkOgorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX2lvc3RyZWFtKGJhc2ljX2lvc3RyZWFtJiYgX19yaHMpOworCisgICAgLy8gYXNzaWduL3N3YXAKKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX2lvc3RyZWFtJiBvcGVyYXRvcj0oYmFzaWNfaW9zdHJlYW0mJiBfX3Jocyk7CisjZW5kaWYKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAoYmFzaWNfaW9zdHJlYW0mIF9fcmhzKQorICAgIHsgYmFzaWNfaXN0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPjo6c3dhcChfX3Jocyk7IH0KK3B1YmxpYzoKK307CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpiYXNpY19pb3N0cmVhbShiYXNpY19pb3N0cmVhbSYmIF9fcmhzKQorICAgIDogYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KF9WU1REOjptb3ZlKF9fcmhzKSkKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lvc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19pb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj0oYmFzaWNfaW9zdHJlYW0mJiBfX3JocykKK3sKKyAgICBzd2FwKF9fcmhzKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojp+YmFzaWNfaW9zdHJlYW0oKQoreworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fc3RyKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0eXBlbmFtZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeSBfX3NlbihfX2lzKTsKKyAgICAgICAgaWYgKF9fc2VuKQorICAgICAgICB7CisgICAgICAgICAgICBfX3N0ci5jbGVhcigpOworICAgICAgICAgICAgc3RyZWFtc2l6ZSBfX24gPSBfX2lzLndpZHRoKCk7CisgICAgICAgICAgICBpZiAoX19uIDw9IDApCisgICAgICAgICAgICAgICAgX19uID0gX19zdHIubWF4X3NpemUoKTsKKyAgICAgICAgICAgIGlmIChfX24gPD0gMCkKKyAgICAgICAgICAgICAgICBfX24gPSBudW1lcmljX2xpbWl0czxzdHJlYW1zaXplPjo6bWF4KCk7CisgICAgICAgICAgICBzdHJlYW1zaXplIF9fYyA9IDA7CisgICAgICAgICAgICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0ID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2lzLmdldGxvYygpKTsKKyAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICAgICAgICB3aGlsZSAoX19jIDwgX19uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9faSA9IF9faXMucmRidWYoKS0+c2dldGMoKTsKKyAgICAgICAgICAgICAgICBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19pLCBfVHJhaXRzOjplb2YoKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9DaGFyVCBfX2NoID0gX1RyYWl0czo6dG9fY2hhcl90eXBlKF9faSk7CisgICAgICAgICAgICAgICAgaWYgKF9fY3QuaXMoX19jdC5zcGFjZSwgX19jaCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIF9fc3RyLnB1c2hfYmFjayhfX2NoKTsKKyAgICAgICAgICAgICAgICArK19fYzsKKyAgICAgICAgICAgICAgICAgX19pcy5yZGJ1ZigpLT5zYnVtcGMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9faXMud2lkdGgoMCk7CisgICAgICAgICAgICBpZiAoX19jID09IDApCisgICAgICAgICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgICAgIF9faXMuc2V0c3RhdGUoX19lcnIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9faXMuc2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIF9faXMuX19zZXRfYmFkYml0X2FuZF9jb25zaWRlcl9yZXRocm93KCk7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICByZXR1cm4gX19pczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorZ2V0bGluZShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3N0ciwgX0NoYXJUIF9fZGxtKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0eXBlbmFtZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeSBfX3NlbihfX2lzLCB0cnVlKTsKKyAgICAgICAgaWYgKF9fc2VuKQorICAgICAgICB7CisgICAgICAgICAgICBfX3N0ci5jbGVhcigpOworICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgICAgICAgIHN0cmVhbXNpemUgX19leHRyID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9faSA9IF9faXMucmRidWYoKS0+c2J1bXBjKCk7CisgICAgICAgICAgICAgICAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9faSwgX1RyYWl0czo6ZW9mKCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK19fZXh0cjsKKyAgICAgICAgICAgICAgICBfQ2hhclQgX19jaCA9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2kpOworICAgICAgICAgICAgICAgIGlmIChfVHJhaXRzOjplcShfX2NoLCBfX2RsbSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIF9fc3RyLnB1c2hfYmFjayhfX2NoKTsKKyAgICAgICAgICAgICAgICBpZiAoX19zdHIuc2l6ZSgpID09IF9fc3RyLm1heF9zaXplKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9fZXh0ciA9PSAwKQorICAgICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgICAgICBfX2lzLnNldHN0YXRlKF9fZXJyKTsKKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIF9faXMuX19zZXRfYmFkYml0X2FuZF9jb25zaWRlcl9yZXRocm93KCk7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICByZXR1cm4gX19pczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2dldGxpbmUoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19zdHIpCit7CisgICAgcmV0dXJuIGdldGxpbmUoX19pcywgX19zdHIsIF9faXMud2lkZW4oJ1xuJykpOworfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorZ2V0bGluZShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mJiBfX2lzLAorICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19zdHIsIF9DaGFyVCBfX2RsbSkKK3sKKyAgICByZXR1cm4gZ2V0bGluZShfX2lzLCBfX3N0ciwgX19kbG0pOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorZ2V0bGluZShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mJiBfX2lzLAorICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19zdHIpCit7CisgICAgcmV0dXJuIGdldGxpbmUoX19pcywgX19zdHIsIF9faXMud2lkZW4oJ1xuJykpOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBzaXplX3QgX1NpemU+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgYml0c2V0PF9TaXplPiYgX194KQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0eXBlbmFtZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeSBfX3NlbihfX2lzKTsKKyAgICAgICAgaWYgKF9fc2VuKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzPiBfX3N0cjsKKyAgICAgICAgICAgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3QgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9faXMuZ2V0bG9jKCkpOworICAgICAgICAgICAgc2l6ZV90IF9fYyA9IDA7CisgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgICAgICAgX0NoYXJUIF9femVybyA9IF9fY3Qud2lkZW4oJzAnKTsKKyAgICAgICAgICAgIF9DaGFyVCBfX29uZSA9IF9fY3Qud2lkZW4oJzEnKTsKKyAgICAgICAgICAgIHdoaWxlIChfX2MgPCBfU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBfX2kgPSBfX2lzLnJkYnVmKCktPnNnZXRjKCk7CisgICAgICAgICAgICAgICAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9faSwgX1RyYWl0czo6ZW9mKCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfQ2hhclQgX19jaCA9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2kpOworICAgICAgICAgICAgICAgIGlmICghX1RyYWl0czo6ZXEoX19jaCwgX196ZXJvKSAmJiAhX1RyYWl0czo6ZXEoX19jaCwgX19vbmUpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBfX3N0ci5wdXNoX2JhY2soX19jaCk7CisgICAgICAgICAgICAgICAgKytfX2M7CisgICAgICAgICAgICAgICAgIF9faXMucmRidWYoKS0+c2J1bXBjKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX3ggPSBiaXRzZXQ8X1NpemU+KF9fc3RyKTsKKyAgICAgICAgICAgIGlmIChfX2MgPT0gMCkKKyAgICAgICAgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICAgICAgX19pcy5zZXRzdGF0ZShfX2Vycik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX19pcy5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgX19pcy5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiBfX2lzOworfQorCisjaWZuZGVmIF9MSUJDUFBfQVZBSUxBQklMSVRZX05PX1NUUkVBTVNfRVhURVJOX1RFTVBMQVRFCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURShjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBiYXNpY19pc3RyZWFtPGNoYXI+KQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoY2xhc3MgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfVFlQRV9WSVMgYmFzaWNfaXN0cmVhbTx3Y2hhcl90PikKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIGJhc2ljX2lvc3RyZWFtPGNoYXI+KQorI2VuZGlmCisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworX0xJQkNQUF9QT1BfTUFDUk9TCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9JU1RSRUFNCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvaXRlcmF0b3IgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvaXRlcmF0b3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4ODdkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9pdGVyYXRvcgpAQCAtMCwwICsxLDE4ODIgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGl0ZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfSVRFUkFUT1IKKyNkZWZpbmUgX0xJQkNQUF9JVEVSQVRPUgorCisvKgorICAgIGl0ZXJhdG9yIHN5bm9wc2lzCisKK25hbWVzcGFjZSBzdGQKK3sKKwordGVtcGxhdGU8Y2xhc3MgSXRlcmF0b3I+CitzdHJ1Y3QgaXRlcmF0b3JfdHJhaXRzCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBJdGVyYXRvcjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEl0ZXJhdG9yOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBJdGVyYXRvcjo6cG9pbnRlciBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgSXRlcmF0b3I6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBJdGVyYXRvcjo6aXRlcmF0b3JfY2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RydWN0IGl0ZXJhdG9yX3RyYWl0czxUKj4KK3sKKyAgICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBUKiBwb2ludGVyOworICAgIHR5cGVkZWYgVCYgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBDYXRlZ29yeSwgY2xhc3MgVCwgY2xhc3MgRGlzdGFuY2UgPSBwdHJkaWZmX3QsCisgICAgICAgICBjbGFzcyBQb2ludGVyID0gVCosIGNsYXNzIFJlZmVyZW5jZSA9IFQmPgorc3RydWN0IGl0ZXJhdG9yCit7CisgICAgdHlwZWRlZiBUICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIERpc3RhbmNlICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiBQb2ludGVyICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIFJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBDYXRlZ29yeSAgaXRlcmF0b3JfY2F0ZWdvcnk7Cit9OworCitzdHJ1Y3QgaW5wdXRfaXRlcmF0b3JfdGFnICB7fTsKK3N0cnVjdCBvdXRwdXRfaXRlcmF0b3JfdGFnIHt9Oworc3RydWN0IGZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgIDogcHVibGljIGlucHV0X2l0ZXJhdG9yX3RhZyAgICAgICAgIHt9Oworc3RydWN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIDogcHVibGljIGZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgIHt9Oworc3RydWN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIDogcHVibGljIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIHt9OworCisvLyAyNy40LjMsIGl0ZXJhdG9yIG9wZXJhdGlvbnMKKy8vIGV4dGVuc2lvbjogc2Vjb25kIGFyZ3VtZW50IG5vdCBjb25mb3JtaW5nIHRvIEMrKzAzCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4gIC8vIGNvbnN0ZXhwciBpbiBDKysxNworICBjb25zdGV4cHIgdm9pZCBhZHZhbmNlKElucHV0SXRlcmF0b3ImIGksCisgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPElucHV0SXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgbik7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPiAgLy8gY29uc3RleHByIGluIEMrKzE3CisgIGNvbnN0ZXhwciB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8SW5wdXRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIGRpc3RhbmNlKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPiAgLy8gY29uc3RleHByIGluIEMrKzE3CisgIGNvbnN0ZXhwciBJbnB1dEl0ZXJhdG9yIG5leHQoSW5wdXRJdGVyYXRvciB4LAordHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPElucHV0SXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgbiA9IDEpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPiAgLy8gY29uc3RleHByIGluIEMrKzE3CisgIGNvbnN0ZXhwciBCaWRpcmVjdGlvbmFsSXRlcmF0b3IgcHJldihCaWRpcmVjdGlvbmFsSXRlcmF0b3IgeCwKKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8QmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIG4gPSAxKTsgICAgCisKK3RlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4KK2NsYXNzIHJldmVyc2VfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcjx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8SXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8SXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8SXRlcmF0b3I+Ojpwb2ludGVyLAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OnJlZmVyZW5jZT4KK3sKK3Byb3RlY3RlZDoKKyAgICBJdGVyYXRvciBjdXJyZW50OworcHVibGljOgorICAgIHR5cGVkZWYgSXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8SXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yPjo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OnBvaW50ZXIgICAgICAgICBwb2ludGVyOworCisgICAgY29uc3RleHByIHJldmVyc2VfaXRlcmF0b3IoKTsKKyAgICBjb25zdGV4cHIgZXhwbGljaXQgcmV2ZXJzZV9pdGVyYXRvcihJdGVyYXRvciB4KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVT4gY29uc3RleHByIHJldmVyc2VfaXRlcmF0b3IoY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxVPiYgdSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFU+IGNvbnN0ZXhwciByZXZlcnNlX2l0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxVPiYgdSk7CisgICAgY29uc3RleHByIEl0ZXJhdG9yIGJhc2UoKSBjb25zdDsKKyAgICBjb25zdGV4cHIgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0OworICAgIGNvbnN0ZXhwciBwb2ludGVyICAgb3BlcmF0b3ItPigpIGNvbnN0OworICAgIGNvbnN0ZXhwciByZXZlcnNlX2l0ZXJhdG9yJiBvcGVyYXRvcisrKCk7CisgICAgY29uc3RleHByIHJldmVyc2VfaXRlcmF0b3IgIG9wZXJhdG9yKysoaW50KTsKKyAgICBjb25zdGV4cHIgcmV2ZXJzZV9pdGVyYXRvciYgb3BlcmF0b3ItLSgpOworICAgIGNvbnN0ZXhwciByZXZlcnNlX2l0ZXJhdG9yICBvcGVyYXRvci0tKGludCk7CisgICAgY29uc3RleHByIHJldmVyc2VfaXRlcmF0b3IgIG9wZXJhdG9yKyAoZGlmZmVyZW5jZV90eXBlIG4pIGNvbnN0OworICAgIGNvbnN0ZXhwciByZXZlcnNlX2l0ZXJhdG9yJiBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBuKTsKKyAgICBjb25zdGV4cHIgcmV2ZXJzZV9pdGVyYXRvciAgb3BlcmF0b3ItIChkaWZmZXJlbmNlX3R5cGUgbikgY29uc3Q7CisgICAgY29uc3RleHByIHJldmVyc2VfaXRlcmF0b3ImIG9wZXJhdG9yLT0oZGlmZmVyZW5jZV90eXBlIG4pOworICAgIGNvbnN0ZXhwciByZWZlcmVuY2UgICAgICAgICBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSBuKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcjEsIGNsYXNzIEl0ZXJhdG9yMj4KK2NvbnN0ZXhwciBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMTcKK29wZXJhdG9yPT0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxJdGVyYXRvcjE+JiB4LCBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPEl0ZXJhdG9yMj4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3IxLCBjbGFzcyBJdGVyYXRvcjI+Citjb25zdGV4cHIgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RleHByIGluIEMrKzE3CitvcGVyYXRvcjwoY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxJdGVyYXRvcjE+JiB4LCBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPEl0ZXJhdG9yMj4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3IxLCBjbGFzcyBJdGVyYXRvcjI+Citjb25zdGV4cHIgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RleHByIGluIEMrKzE3CitvcGVyYXRvciE9KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8SXRlcmF0b3IxPiYgeCwgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxJdGVyYXRvcjI+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yMSwgY2xhc3MgSXRlcmF0b3IyPgorY29uc3RleHByIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysxNworb3BlcmF0b3I+KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8SXRlcmF0b3IxPiYgeCwgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxJdGVyYXRvcjI+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yMSwgY2xhc3MgSXRlcmF0b3IyPgorY29uc3RleHByIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysxNworb3BlcmF0b3I+PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPEl0ZXJhdG9yMT4mIHgsIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8SXRlcmF0b3IyPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcjEsIGNsYXNzIEl0ZXJhdG9yMj4KK2NvbnN0ZXhwciBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMTcKK29wZXJhdG9yPD0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxJdGVyYXRvcjE+JiB4LCBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPEl0ZXJhdG9yMj4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3IxLCBjbGFzcyBJdGVyYXRvcjI+Citjb25zdGV4cHIgYXV0bworb3BlcmF0b3ItKGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8SXRlcmF0b3IxPiYgeCwgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxJdGVyYXRvcjI+JiB5KQorLT4gZGVjbHR5cGUoX195LmJhc2UoKSAtIF9feC5iYXNlKCkpOyAgIC8vIGNvbnN0ZXhwciBpbiBDKysxNworCit0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3I+Citjb25zdGV4cHIgcmV2ZXJzZV9pdGVyYXRvcjxJdGVyYXRvcj4KK29wZXJhdG9yKyh0eXBlbmFtZSByZXZlcnNlX2l0ZXJhdG9yPEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIG4sIAorICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8SXRlcmF0b3I+JiB4KTsgICAvLyBjb25zdGV4cHIgaW4gQysrMTcKKwordGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yPgorY29uc3RleHByIHJldmVyc2VfaXRlcmF0b3I8SXRlcmF0b3I+IG1ha2VfcmV2ZXJzZV9pdGVyYXRvcihJdGVyYXRvciBpKTsgLy8gQysrMTQsIGNvbnN0ZXhwciBpbiBDKysxNworCit0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgorY2xhc3MgYmFja19pbnNlcnRfaXRlcmF0b3IKK3sKK3Byb3RlY3RlZDoKKyAgICBDb250YWluZXIqIGNvbnRhaW5lcjsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIENvbnRhaW5lciAgICAgICAgICAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKworICAgIGV4cGxpY2l0IGJhY2tfaW5zZXJ0X2l0ZXJhdG9yKENvbnRhaW5lciYgeCk7CisgICAgYmFja19pbnNlcnRfaXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBDb250YWluZXI6OnZhbHVlX3R5cGUmIHZhbHVlKTsKKyAgICBiYWNrX2luc2VydF9pdGVyYXRvciYgb3BlcmF0b3IqKCk7CisgICAgYmFja19pbnNlcnRfaXRlcmF0b3ImIG9wZXJhdG9yKysoKTsKKyAgICBiYWNrX2luc2VydF9pdGVyYXRvciAgb3BlcmF0b3IrKyhpbnQpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lcj4gYmFja19pbnNlcnRfaXRlcmF0b3I8Q29udGFpbmVyPiBiYWNrX2luc2VydGVyKENvbnRhaW5lciYgeCk7CisKK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXI+CitjbGFzcyBmcm9udF9pbnNlcnRfaXRlcmF0b3IKK3sKK3Byb3RlY3RlZDoKKyAgICBDb250YWluZXIqIGNvbnRhaW5lcjsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIENvbnRhaW5lciAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworCisgICAgZXhwbGljaXQgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yKENvbnRhaW5lciYgeCk7CisgICAgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlJiB2YWx1ZSk7CisgICAgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yJiBvcGVyYXRvciooKTsKKyAgICBmcm9udF9pbnNlcnRfaXRlcmF0b3ImIG9wZXJhdG9yKysoKTsKKyAgICBmcm9udF9pbnNlcnRfaXRlcmF0b3IgIG9wZXJhdG9yKysoaW50KTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXI+IGZyb250X2luc2VydF9pdGVyYXRvcjxDb250YWluZXI+IGZyb250X2luc2VydGVyKENvbnRhaW5lciYgeCk7CisKK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXI+CitjbGFzcyBpbnNlcnRfaXRlcmF0b3IKK3sKK3Byb3RlY3RlZDoKKyAgICBDb250YWluZXIqIGNvbnRhaW5lcjsKKyAgICB0eXBlbmFtZSBDb250YWluZXI6Oml0ZXJhdG9yIGl0ZXI7CitwdWJsaWM6CisgICAgdHlwZWRlZiBDb250YWluZXIgICAgICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKworICAgIGluc2VydF9pdGVyYXRvcihDb250YWluZXImIHgsIHR5cGVuYW1lIENvbnRhaW5lcjo6aXRlcmF0b3IgaSk7CisgICAgaW5zZXJ0X2l0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlJiB2YWx1ZSk7CisgICAgaW5zZXJ0X2l0ZXJhdG9yJiBvcGVyYXRvciooKTsKKyAgICBpbnNlcnRfaXRlcmF0b3ImIG9wZXJhdG9yKysoKTsKKyAgICBpbnNlcnRfaXRlcmF0b3ImIG9wZXJhdG9yKysoaW50KTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXIsIGNsYXNzIEl0ZXJhdG9yPgoraW5zZXJ0X2l0ZXJhdG9yPENvbnRhaW5lcj4gaW5zZXJ0ZXIoQ29udGFpbmVyJiB4LCBJdGVyYXRvciBpKTsKKwordGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yPgorY2xhc3MgbW92ZV9pdGVyYXRvciB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBJdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgSXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OnZhbHVlX3R5cGUgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8SXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAKKyAgICBjb25zdGV4cHIgbW92ZV9pdGVyYXRvcigpOyAgLy8gYWxsIHRoZSBjb25zdGV4cHJzIGFyZSBpbiBDKysxNworICAgIGNvbnN0ZXhwciBleHBsaWNpdCBtb3ZlX2l0ZXJhdG9yKEl0ZXJhdG9yIGkpOworICAgIHRlbXBsYXRlIDxjbGFzcyBVPgorICAgICAgY29uc3RleHByIG1vdmVfaXRlcmF0b3IoY29uc3QgbW92ZV9pdGVyYXRvcjxVPiYgdSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFU+CisgICAgICBjb25zdGV4cHIgbW92ZV9pdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IG1vdmVfaXRlcmF0b3I8VT4mIHUpOworICAgIGNvbnN0ZXhwciBpdGVyYXRvcl90eXBlIGJhc2UoKSBjb25zdDsKKyAgICBjb25zdGV4cHIgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0OworICAgIGNvbnN0ZXhwciBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdDsKKyAgICBjb25zdGV4cHIgbW92ZV9pdGVyYXRvciYgb3BlcmF0b3IrKygpOworICAgIGNvbnN0ZXhwciBtb3ZlX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KTsKKyAgICBjb25zdGV4cHIgbW92ZV9pdGVyYXRvciYgb3BlcmF0b3ItLSgpOworICAgIGNvbnN0ZXhwciBtb3ZlX2l0ZXJhdG9yIG9wZXJhdG9yLS0oaW50KTsKKyAgICBjb25zdGV4cHIgbW92ZV9pdGVyYXRvciBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIG4pIGNvbnN0OyAKKyAgICBjb25zdGV4cHIgbW92ZV9pdGVyYXRvciYgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgbik7IAorICAgIGNvbnN0ZXhwciBtb3ZlX2l0ZXJhdG9yIG9wZXJhdG9yLShkaWZmZXJlbmNlX3R5cGUgbikgY29uc3Q7IAorICAgIGNvbnN0ZXhwciBtb3ZlX2l0ZXJhdG9yJiBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBuKTsgCisgICAgY29uc3RleHByIHVuc3BlY2lmaWVkIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIG4pIGNvbnN0OworcHJpdmF0ZToKKyAgICBJdGVyYXRvciBjdXJyZW50OyAvLyBleHBvc2l0aW9uIG9ubHkKK307CisKK3RlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcjEsIGNsYXNzIEl0ZXJhdG9yMj4KK2NvbnN0ZXhwciBib29sICAgLy8gY29uc3RleHByIGluIEMrKzE3CitvcGVyYXRvcj09KGNvbnN0IG1vdmVfaXRlcmF0b3I8SXRlcmF0b3IxPiYgeCwgY29uc3QgbW92ZV9pdGVyYXRvcjxJdGVyYXRvcjI+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yMSwgY2xhc3MgSXRlcmF0b3IyPgorY29uc3RleHByIGJvb2wgICAvLyBjb25zdGV4cHIgaW4gQysrMTcKK29wZXJhdG9yIT0oY29uc3QgbW92ZV9pdGVyYXRvcjxJdGVyYXRvcjE+JiB4LCBjb25zdCBtb3ZlX2l0ZXJhdG9yPEl0ZXJhdG9yMj4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3IxLCBjbGFzcyBJdGVyYXRvcjI+Citjb25zdGV4cHIgYm9vbCAgIC8vIGNvbnN0ZXhwciBpbiBDKysxNworb3BlcmF0b3I8KGNvbnN0IG1vdmVfaXRlcmF0b3I8SXRlcmF0b3IxPiYgeCwgY29uc3QgbW92ZV9pdGVyYXRvcjxJdGVyYXRvcjI+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yMSwgY2xhc3MgSXRlcmF0b3IyPgorY29uc3RleHByIGJvb2wgICAvLyBjb25zdGV4cHIgaW4gQysrMTcKK29wZXJhdG9yPD0oY29uc3QgbW92ZV9pdGVyYXRvcjxJdGVyYXRvcjE+JiB4LCBjb25zdCBtb3ZlX2l0ZXJhdG9yPEl0ZXJhdG9yMj4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3IxLCBjbGFzcyBJdGVyYXRvcjI+Citjb25zdGV4cHIgYm9vbCAgIC8vIGNvbnN0ZXhwciBpbiBDKysxNworb3BlcmF0b3I+KGNvbnN0IG1vdmVfaXRlcmF0b3I8SXRlcmF0b3IxPiYgeCwgY29uc3QgbW92ZV9pdGVyYXRvcjxJdGVyYXRvcjI+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yMSwgY2xhc3MgSXRlcmF0b3IyPgorY29uc3RleHByIGJvb2wgICAvLyBjb25zdGV4cHIgaW4gQysrMTcKK29wZXJhdG9yPj0oY29uc3QgbW92ZV9pdGVyYXRvcjxJdGVyYXRvcjE+JiB4LCBjb25zdCBtb3ZlX2l0ZXJhdG9yPEl0ZXJhdG9yMj4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3IxLCBjbGFzcyBJdGVyYXRvcjI+Citjb25zdGV4cHIgYXV0byAgIC8vIGNvbnN0ZXhwciBpbiBDKysxNworb3BlcmF0b3ItKGNvbnN0IG1vdmVfaXRlcmF0b3I8SXRlcmF0b3IxPiYgeCwKKyAgICAgICAgICBjb25zdCBtb3ZlX2l0ZXJhdG9yPEl0ZXJhdG9yMj4mIHkpIC0+IGRlY2x0eXBlKHguYmFzZSgpIC0geS5iYXNlKCkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3I+Citjb25zdGV4cHIgbW92ZV9pdGVyYXRvcjxJdGVyYXRvcj4gb3BlcmF0b3IrKCAgIC8vIGNvbnN0ZXhwciBpbiBDKysxNworICAgICAgICAgICAgdHlwZW5hbWUgbW92ZV9pdGVyYXRvcjxJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBuLCAKKyAgICAgICAgICAgIGNvbnN0IG1vdmVfaXRlcmF0b3I8SXRlcmF0b3I+JiB4KTsKKwordGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yPiAgIC8vIGNvbnN0ZXhwciBpbiBDKysxNworY29uc3RleHByICBtb3ZlX2l0ZXJhdG9yPEl0ZXJhdG9yPiBtYWtlX21vdmVfaXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIGkpOworCisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBjaGFyVCA9IGNoYXIsIGNsYXNzIHRyYWl0cyA9IGNoYXJfdHJhaXRzPGNoYXJUPiwgY2xhc3MgRGlzdGFuY2UgPSBwdHJkaWZmX3Q+CitjbGFzcyBpc3RyZWFtX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3I8aW5wdXRfaXRlcmF0b3JfdGFnLCBULCBEaXN0YW5jZSwgY29uc3QgVCosIGNvbnN0IFQmPgoreworcHVibGljOgorICAgIHR5cGVkZWYgY2hhclQgY2hhcl90eXBlOworICAgIHR5cGVkZWYgdHJhaXRzIHRyYWl0c190eXBlOworICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxjaGFyVCx0cmFpdHM+IGlzdHJlYW1fdHlwZTsKKworICAgIGNvbnN0ZXhwciBpc3RyZWFtX2l0ZXJhdG9yKCk7CisgICAgaXN0cmVhbV9pdGVyYXRvcihpc3RyZWFtX3R5cGUmIHMpOworICAgIGlzdHJlYW1faXRlcmF0b3IoY29uc3QgaXN0cmVhbV9pdGVyYXRvciYgeCk7CisgICAgfmlzdHJlYW1faXRlcmF0b3IoKTsKKworICAgIGNvbnN0IFQmIG9wZXJhdG9yKigpIGNvbnN0OworICAgIGNvbnN0IFQqIG9wZXJhdG9yLT4oKSBjb25zdDsKKyAgICBpc3RyZWFtX2l0ZXJhdG9yJiBvcGVyYXRvcisrKCk7CisgICAgaXN0cmVhbV9pdGVyYXRvciAgb3BlcmF0b3IrKyhpbnQpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIERpc3RhbmNlPgorYm9vbCBvcGVyYXRvcj09KGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8VCxjaGFyVCx0cmFpdHMsRGlzdGFuY2U+JiB4LAorICAgICAgICAgICAgICAgIGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8VCxjaGFyVCx0cmFpdHMsRGlzdGFuY2U+JiB5KTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBEaXN0YW5jZT4KK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPFQsY2hhclQsdHJhaXRzLERpc3RhbmNlPiYgeCwKKyAgICAgICAgICAgICAgICBjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPFQsY2hhclQsdHJhaXRzLERpc3RhbmNlPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBjaGFyVCA9IGNoYXIsIGNsYXNzIHRyYWl0cyA9IGNoYXJfdHJhaXRzPGNoYXJUPiA+CitjbGFzcyBvc3RyZWFtX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3I8b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCAsdm9pZD4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGNoYXJUIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIHRyYWl0cyB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08Y2hhclQsdHJhaXRzPiBvc3RyZWFtX3R5cGU7CisKKyAgICBvc3RyZWFtX2l0ZXJhdG9yKG9zdHJlYW1fdHlwZSYgcyk7CisgICAgb3N0cmVhbV9pdGVyYXRvcihvc3RyZWFtX3R5cGUmIHMsIGNvbnN0IGNoYXJUKiBkZWxpbWl0ZXIpOworICAgIG9zdHJlYW1faXRlcmF0b3IoY29uc3Qgb3N0cmVhbV9pdGVyYXRvciYgeCk7CisgICAgfm9zdHJlYW1faXRlcmF0b3IoKTsKKyAgICBvc3RyZWFtX2l0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgVCYgdmFsdWUpOworCisgICAgb3N0cmVhbV9pdGVyYXRvciYgb3BlcmF0b3IqKCk7CisgICAgb3N0cmVhbV9pdGVyYXRvciYgb3BlcmF0b3IrKygpOworICAgIG9zdHJlYW1faXRlcmF0b3ImIG9wZXJhdG9yKysoaW50KTsKK307CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMgPSBjaGFyX3RyYWl0czxjaGFyVD4gPgorY2xhc3MgaXN0cmVhbWJ1Zl9pdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yPGlucHV0X2l0ZXJhdG9yX3RhZywgY2hhclQsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzOjpvZmZfdHlwZSwgdW5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgY2hhclQ+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBjaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiB0cmFpdHMgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czo6aW50X3R5cGUgICAgIGludF90eXBlOworICAgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPGNoYXJULHRyYWl0cz4gc3RyZWFtYnVmX3R5cGU7CisgICAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPGNoYXJULHRyYWl0cz4gICBpc3RyZWFtX3R5cGU7CisKKyAgICBpc3RyZWFtYnVmX2l0ZXJhdG9yKCkgbm9leGNlcHQ7CisgICAgaXN0cmVhbWJ1Zl9pdGVyYXRvcihpc3RyZWFtX3R5cGUmIHMpIG5vZXhjZXB0OworICAgIGlzdHJlYW1idWZfaXRlcmF0b3Ioc3RyZWFtYnVmX3R5cGUqIHMpIG5vZXhjZXB0OworICAgIGlzdHJlYW1idWZfaXRlcmF0b3IoYS1wcml2YXRlLXR5cGUpIG5vZXhjZXB0OworCisgICAgY2hhclQgICAgICAgICAgICAgICAgb3BlcmF0b3IqKCkgY29uc3Q7CisgICAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3Q7CisgICAgaXN0cmVhbWJ1Zl9pdGVyYXRvciYgb3BlcmF0b3IrKygpOworICAgIGEtcHJpdmF0ZS10eXBlICAgICAgIG9wZXJhdG9yKysoaW50KTsKKworICAgIGJvb2wgZXF1YWwoY29uc3QgaXN0cmVhbWJ1Zl9pdGVyYXRvciYgYikgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXJULHRyYWl0cz4mIGEsCisgICAgICAgICAgICAgICAgY29uc3QgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyVCx0cmFpdHM+JiBiKTsKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorYm9vbCBvcGVyYXRvciE9KGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhclQsdHJhaXRzPiYgYSwKKyAgICAgICAgICAgICAgICBjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXJULHRyYWl0cz4mIGIpOworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cyA9IGNoYXJfdHJhaXRzPGNoYXJUPiA+CitjbGFzcyBvc3RyZWFtYnVmX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3I8b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGNoYXJUICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIHRyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworICAgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPGNoYXJULHRyYWl0cz4gc3RyZWFtYnVmX3R5cGU7CisgICAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPGNoYXJULHRyYWl0cz4gICBvc3RyZWFtX3R5cGU7CisKKyAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yKG9zdHJlYW1fdHlwZSYgcykgbm9leGNlcHQ7CisgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvcihzdHJlYW1idWZfdHlwZSogcykgbm9leGNlcHQ7CisgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvciYgb3BlcmF0b3I9KGNoYXJUIGMpOworICAgIG9zdHJlYW1idWZfaXRlcmF0b3ImIG9wZXJhdG9yKigpOworICAgIG9zdHJlYW1idWZfaXRlcmF0b3ImIG9wZXJhdG9yKysoKTsKKyAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yJiBvcGVyYXRvcisrKGludCk7CisgICAgYm9vbCBmYWlsZWQoKSBjb25zdCBub2V4Y2VwdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBDPiBjb25zdGV4cHIgYXV0byBiZWdpbihDJiBjKSAtPiBkZWNsdHlwZShjLmJlZ2luKCkpOwordGVtcGxhdGUgPGNsYXNzIEM+IGNvbnN0ZXhwciBhdXRvIGJlZ2luKGNvbnN0IEMmIGMpIC0+IGRlY2x0eXBlKGMuYmVnaW4oKSk7Cit0ZW1wbGF0ZSA8Y2xhc3MgQz4gY29uc3RleHByIGF1dG8gZW5kKEMmIGMpIC0+IGRlY2x0eXBlKGMuZW5kKCkpOwordGVtcGxhdGUgPGNsYXNzIEM+IGNvbnN0ZXhwciBhdXRvIGVuZChjb25zdCBDJiBjKSAtPiBkZWNsdHlwZShjLmVuZCgpKTsKK3RlbXBsYXRlIDxjbGFzcyBULCBzaXplX3QgTj4gY29uc3RleHByIFQqIGJlZ2luKFQgKCZhcnJheSlbTl0pOwordGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBOPiBjb25zdGV4cHIgVCogZW5kKFQgKCZhcnJheSlbTl0pOworCit0ZW1wbGF0ZSA8Y2xhc3MgQz4gYXV0byBjb25zdGV4cHIgY2JlZ2luKGNvbnN0IEMmIGMpIC0+IGRlY2x0eXBlKHN0ZDo6YmVnaW4oYykpOyAgICAgICAgLy8gQysrMTQKK3RlbXBsYXRlIDxjbGFzcyBDPiBhdXRvIGNvbnN0ZXhwciBjZW5kKGNvbnN0IEMmIGMpIC0+IGRlY2x0eXBlKHN0ZDo6ZW5kKGMpKTsgICAgICAgICAgICAvLyBDKysxNAordGVtcGxhdGUgPGNsYXNzIEM+IGF1dG8gY29uc3RleHByIHJiZWdpbihDJiBjKSAtPiBkZWNsdHlwZShjLnJiZWdpbigpKTsgICAgICAgICAgICAgICAgIC8vIEMrKzE0Cit0ZW1wbGF0ZSA8Y2xhc3MgQz4gYXV0byBjb25zdGV4cHIgcmJlZ2luKGNvbnN0IEMmIGMpIC0+IGRlY2x0eXBlKGMucmJlZ2luKCkpOyAgICAgICAgICAgLy8gQysrMTQKK3RlbXBsYXRlIDxjbGFzcyBDPiBhdXRvIGNvbnN0ZXhwciByZW5kKEMmIGMpIC0+IGRlY2x0eXBlKGMucmVuZCgpKTsgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNAordGVtcGxhdGUgPGNsYXNzIEM+IGNvbnN0ZXhwciBhdXRvIHJlbmQoY29uc3QgQyYgYykgLT4gZGVjbHR5cGUoYy5yZW5kKCkpOyAgICAgICAgICAgICAgIC8vIEMrKzE0Cit0ZW1wbGF0ZSA8Y2xhc3MgRT4gcmV2ZXJzZV9pdGVyYXRvcjxjb25zdCBFKj4gY29uc3RleHByIHJiZWdpbihpbml0aWFsaXplcl9saXN0PEU+IGlsKTsgLy8gQysrMTQKK3RlbXBsYXRlIDxjbGFzcyBFPiByZXZlcnNlX2l0ZXJhdG9yPGNvbnN0IEUqPiBjb25zdGV4cHIgcmVuZChpbml0aWFsaXplcl9saXN0PEU+IGlsKTsgICAvLyBDKysxNAordGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBOPiByZXZlcnNlX2l0ZXJhdG9yPFQqPiBjb25zdGV4cHIgcmJlZ2luKFQgKCZhcnJheSlbTl0pOyAgICAgIC8vIEMrKzE0Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgc2l6ZV90IE4+IHJldmVyc2VfaXRlcmF0b3I8VCo+IGNvbnN0ZXhwciByZW5kKFQgKCZhcnJheSlbTl0pOyAgICAgICAgLy8gQysrMTQKK3RlbXBsYXRlIDxjbGFzcyBDPiBjb25zdGV4cHIgYXV0byBjcmJlZ2luKGNvbnN0IEMmIGMpIC0+IGRlY2x0eXBlKHN0ZDo6cmJlZ2luKGMpKTsgICAgICAvLyBDKysxNAordGVtcGxhdGUgPGNsYXNzIEM+IGNvbnN0ZXhwciBhdXRvIGNyZW5kKGNvbnN0IEMmIGMpIC0+IGRlY2x0eXBlKHN0ZDo6cmVuZChjKSk7ICAgICAgICAgIC8vIEMrKzE0CisKKy8vIDI0LjgsIGNvbnRhaW5lciBhY2Nlc3M6Cit0ZW1wbGF0ZSA8Y2xhc3MgQz4gY29uc3RleHByIGF1dG8gc2l6ZShjb25zdCBDJiBjKSAtPiBkZWNsdHlwZShjLnNpemUoKSk7ICAgICAgICAgLy8gQysrMTcKK3RlbXBsYXRlIDxjbGFzcyBULCBzaXplX3QgTj4gY29uc3RleHByIHNpemVfdCBzaXplKGNvbnN0IFQgKCZhcnJheSlbTl0pIG5vZXhjZXB0OyAvLyBDKysxNwordGVtcGxhdGUgPGNsYXNzIEM+IGNvbnN0ZXhwciBhdXRvIGVtcHR5KGNvbnN0IEMmIGMpIC0+IGRlY2x0eXBlKGMuZW1wdHkoKSk7ICAgICAgIC8vIEMrKzE3Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgc2l6ZV90IE4+IGNvbnN0ZXhwciBib29sIGVtcHR5KGNvbnN0IFQgKCZhcnJheSlbTl0pIG5vZXhjZXB0OyAgLy8gQysrMTcKK3RlbXBsYXRlIDxjbGFzcyBFPiBjb25zdGV4cHIgYm9vbCBlbXB0eShpbml0aWFsaXplcl9saXN0PEU+IGlsKSBub2V4Y2VwdDsgICAgICAgICAvLyBDKysxNwordGVtcGxhdGUgPGNsYXNzIEM+IGNvbnN0ZXhwciBhdXRvIGRhdGEoQyYgYykgLT4gZGVjbHR5cGUoYy5kYXRhKCkpOyAgICAgICAgICAgICAgIC8vIEMrKzE3Cit0ZW1wbGF0ZSA8Y2xhc3MgQz4gY29uc3RleHByIGF1dG8gZGF0YShjb25zdCBDJiBjKSAtPiBkZWNsdHlwZShjLmRhdGEoKSk7ICAgICAgICAgLy8gQysrMTcKK3RlbXBsYXRlIDxjbGFzcyBULCBzaXplX3QgTj4gY29uc3RleHByIFQqIGRhdGEoVCAoJmFycmF5KVtOXSkgbm9leGNlcHQ7ICAgICAgICAgICAvLyBDKysxNwordGVtcGxhdGUgPGNsYXNzIEU+IGNvbnN0ZXhwciBjb25zdCBFKiBkYXRhKGluaXRpYWxpemVyX2xpc3Q8RT4gaWwpIG5vZXhjZXB0OyAgICAgIC8vIEMrKzE3CisKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8aW9zZndkPiAvLyBmb3IgZm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgdmVjdG9yIGFuZCBzdHJpbmcuCisjaW5jbHVkZSA8X19mdW5jdGlvbmFsX2Jhc2U+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2lmZGVmIF9fQVBQTEVfXworI2luY2x1ZGUgPEF2YWlsYWJpbGl0eS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxfX2RlYnVnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpbnB1dF9pdGVyYXRvcl90YWcge307CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgb3V0cHV0X2l0ZXJhdG9yX3RhZyB7fTsKK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICA6IHB1YmxpYyBpbnB1dF9pdGVyYXRvcl90YWcge307CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgOiBwdWJsaWMgZm9yd2FyZF9pdGVyYXRvcl90YWcge307CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgOiBwdWJsaWMgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19oYXNfaXRlcmF0b3JfY2F0ZWdvcnkKK3sKK3ByaXZhdGU6CisgICAgc3RydWN0IF9fdHdvIHtjaGFyIF9fbHg7IGNoYXIgX19seHg7fTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPiBzdGF0aWMgX190d28gX190ZXN0KC4uLik7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4gc3RhdGljIGNoYXIgX190ZXN0KHR5cGVuYW1lIF9VcDo6aXRlcmF0b3JfY2F0ZWdvcnkqID0gMCk7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBzaXplb2YoX190ZXN0PF9UcD4oMCkpID09IDE7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIsIGJvb2w+IHN0cnVjdCBfX2l0ZXJhdG9yX3RyYWl0c19pbXBsIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CitzdHJ1Y3QgX19pdGVyYXRvcl90cmFpdHNfaW1wbDxfSXRlciwgdHJ1ZT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyOjpkaWZmZXJlbmNlX3R5cGUgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcjo6dmFsdWVfdHlwZSAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyOjpwb2ludGVyICAgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXI6OnJlZmVyZW5jZSAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyOjppdGVyYXRvcl9jYXRlZ29yeSBpdGVyYXRvcl9jYXRlZ29yeTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlciwgYm9vbD4gc3RydWN0IF9faXRlcmF0b3JfdHJhaXRzIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CitzdHJ1Y3QgX19pdGVyYXRvcl90cmFpdHM8X0l0ZXIsIHRydWU+CisgICAgOiAgX19pdGVyYXRvcl90cmFpdHNfaW1wbAorICAgICAgPAorICAgICAgICBfSXRlciwKKyAgICAgICAgaXNfY29udmVydGlibGU8dHlwZW5hbWUgX0l0ZXI6Oml0ZXJhdG9yX2NhdGVnb3J5LCBpbnB1dF9pdGVyYXRvcl90YWc+Ojp2YWx1ZSB8fAorICAgICAgICBpc19jb252ZXJ0aWJsZTx0eXBlbmFtZSBfSXRlcjo6aXRlcmF0b3JfY2F0ZWdvcnksIG91dHB1dF9pdGVyYXRvcl90YWc+Ojp2YWx1ZQorICAgICAgPgore307CisKKy8vIGl0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj4gd2lsbCBvbmx5IGhhdmUgdGhlIG5lc3RlZCB0eXBlcyBpZiBJdGVyYXRvcjo6aXRlcmF0b3JfY2F0ZWdvcnkKKy8vICAgIGV4aXN0cy4gIEVsc2UgaXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yPiB3aWxsIGJlIGFuIGVtcHR5IGNsYXNzLiAgVGhpcyBpcyBhCisvLyAgICBjb25mb3JtaW5nIGV4dGVuc2lvbiB3aGljaCBhbGxvd3Mgc29tZSBwcm9ncmFtcyB0byBjb21waWxlIGFuZCBiZWhhdmUgYXMKKy8vICAgIHRoZSBjbGllbnQgZXhwZWN0cyBpbnN0ZWFkIG9mIGZhaWxpbmcgYXQgY29tcGlsZSB0aW1lLgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXRlcmF0b3JfdHJhaXRzCisgICAgOiBfX2l0ZXJhdG9yX3RyYWl0czxfSXRlciwgX19oYXNfaXRlcmF0b3JfY2F0ZWdvcnk8X0l0ZXI+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpdGVyYXRvcl90cmFpdHM8X1RwKj4KK3sKKyAgICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX1RwKiBwb2ludGVyOworICAgIHR5cGVkZWYgX1RwJiByZWZlcmVuY2U7CisgICAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcCwgYm9vbCA9IF9faGFzX2l0ZXJhdG9yX2NhdGVnb3J5PGl0ZXJhdG9yX3RyYWl0czxfVHA+ID46OnZhbHVlPgorc3RydWN0IF9faGFzX2l0ZXJhdG9yX2NhdGVnb3J5X2NvbnZlcnRpYmxlX3RvCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfY29udmVydGlibGU8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9UcD46Oml0ZXJhdG9yX2NhdGVnb3J5LCBfVXA+Ojp2YWx1ZT4KK3t9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitzdHJ1Y3QgX19oYXNfaXRlcmF0b3JfY2F0ZWdvcnlfY29udmVydGlibGVfdG88X1RwLCBfVXAsIGZhbHNlPiA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9faXNfaW5wdXRfaXRlcmF0b3IgOiBwdWJsaWMgX19oYXNfaXRlcmF0b3JfY2F0ZWdvcnlfY29udmVydGlibGVfdG88X1RwLCBpbnB1dF9pdGVyYXRvcl90YWc+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9faXNfZm9yd2FyZF9pdGVyYXRvciA6IHB1YmxpYyBfX2hhc19pdGVyYXRvcl9jYXRlZ29yeV9jb252ZXJ0aWJsZV90bzxfVHAsIGZvcndhcmRfaXRlcmF0b3JfdGFnPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2lzX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3IgOiBwdWJsaWMgX19oYXNfaXRlcmF0b3JfY2F0ZWdvcnlfY29udmVydGlibGVfdG88X1RwLCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZz4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19pc19yYW5kb21fYWNjZXNzX2l0ZXJhdG9yIDogcHVibGljIF9faGFzX2l0ZXJhdG9yX2NhdGVnb3J5X2NvbnZlcnRpYmxlX3RvPF9UcCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWc+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9faXNfZXhhY3RseV9pbnB1dF9pdGVyYXRvcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIAorICAgICAgICAgX19oYXNfaXRlcmF0b3JfY2F0ZWdvcnlfY29udmVydGlibGVfdG88X1RwLCBpbnB1dF9pdGVyYXRvcl90YWc+Ojp2YWx1ZSAmJiAKKyAgICAgICAgIV9faGFzX2l0ZXJhdG9yX2NhdGVnb3J5X2NvbnZlcnRpYmxlX3RvPF9UcCwgZm9yd2FyZF9pdGVyYXRvcl90YWc+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlPGNsYXNzIF9DYXRlZ29yeSwgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2UgPSBwdHJkaWZmX3QsCisgICAgICAgICBjbGFzcyBfUG9pbnRlciA9IF9UcCosIGNsYXNzIF9SZWZlcmVuY2UgPSBfVHAmPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGl0ZXJhdG9yCit7CisgICAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfRGlzdGFuY2UgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIF9Qb2ludGVyICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIF9SZWZlcmVuY2UgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgX0NhdGVnb3J5ICBpdGVyYXRvcl9jYXRlZ29yeTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK3ZvaWQgX19hZHZhbmNlKF9JbnB1dEl0ZXImIF9faSwKKyAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcj46OmRpZmZlcmVuY2VfdHlwZSBfX24sIGlucHV0X2l0ZXJhdG9yX3RhZykKK3sKKyAgICBmb3IgKDsgX19uID4gMDsgLS1fX24pCisgICAgICAgICsrX19pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpRGlySXRlcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0Cit2b2lkIF9fYWR2YW5jZShfQmlEaXJJdGVyJiBfX2ksCisgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaURpckl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUgX19uLCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZykKK3sKKyAgICBpZiAoX19uID49IDApCisgICAgICAgIGZvciAoOyBfX24gPiAwOyAtLV9fbikKKyAgICAgICAgICAgICsrX19pOworICAgIGVsc2UKKyAgICAgICAgZm9yICg7IF9fbiA8IDA7ICsrX19uKQorICAgICAgICAgICAgLS1fX2k7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUmFuZEl0ZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAordm9pZCBfX2FkdmFuY2UoX1JhbmRJdGVyJiBfX2ksCisgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kSXRlcj46OmRpZmZlcmVuY2VfdHlwZSBfX24sIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQoreworICAgX19pICs9IF9fbjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAordm9pZCBhZHZhbmNlKF9JbnB1dEl0ZXImIF9faSwKKyAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcj46OmRpZmZlcmVuY2VfdHlwZSBfX24pCit7CisgICAgX19hZHZhbmNlKF9faSwgX19uLCB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0Cit0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcj46OmRpZmZlcmVuY2VfdHlwZQorX19kaXN0YW5jZShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBpbnB1dF9pdGVyYXRvcl90YWcpCit7CisgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUgX19yKDApOworICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICArK19fcjsKKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRJdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK3R5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZEl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKK19fZGlzdGFuY2UoX1JhbmRJdGVyIF9fZmlyc3QsIF9SYW5kSXRlciBfX2xhc3QsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQoreworICAgIHJldHVybiBfX2xhc3QgLSBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0Cit0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcj46OmRpZmZlcmVuY2VfdHlwZQorZGlzdGFuY2UoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkKK3sKKyAgICByZXR1cm4gX19kaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QsIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyPjo6aXRlcmF0b3JfY2F0ZWdvcnkoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfaW5wdXRfaXRlcmF0b3I8X0lucHV0SXRlcj46OnZhbHVlLCAKKyAgICBfSW5wdXRJdGVyCis+Ojp0eXBlCituZXh0KF9JbnB1dEl0ZXIgX194LAorICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcj46OmRpZmZlcmVuY2VfdHlwZSBfX24gPSAxKQoreworICAgIF9WU1REOjphZHZhbmNlKF9feCwgX19uKTsKKyAgICByZXR1cm4gX194OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXI+Ojp2YWx1ZSwgCisgICAgX0JpZGlyZWN0aW9uYWxJdGVyCis+Ojp0eXBlCitwcmV2KF9CaWRpcmVjdGlvbmFsSXRlciBfX3gsCisgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUgX19uID0gMSkKK3sKKyAgICBfVlNURDo6YWR2YW5jZShfX3gsIC1fX24pOworICAgIHJldHVybiBfX3g7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgPSB2b2lkPgorc3RydWN0IF9faXNfc3Rhc2hpbmdfaXRlcmF0b3IgOiBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9faXNfc3Rhc2hpbmdfaXRlcmF0b3I8X1RwLCB0eXBlbmFtZSBfX3ZvaWRfdDx0eXBlbmFtZSBfVHA6Ol9fc3Rhc2hpbmdfaXRlcmF0b3JfdGFnPjo6dHlwZT4KKyAgOiB0cnVlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcj4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHJldmVyc2VfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcjx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+OjppdGVyYXRvcl9jYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+Ojp2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46OmRpZmZlcmVuY2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+Ojpwb2ludGVyLAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46OnJlZmVyZW5jZT4KK3sKK3ByaXZhdGU6CisgICAgLyptdXRhYmxlKi8gX0l0ZXIgX190OyAgLy8gbm8gbG9uZ2VyIHVzZWQgYXMgb2YgTFdHICMyMzYwLCBub3QgcmVtb3ZlZCBkdWUgdG8gQUJJIGJyZWFrCisKKyAgICBzdGF0aWNfYXNzZXJ0KCFfX2lzX3N0YXNoaW5nX2l0ZXJhdG9yPF9JdGVyPjo6dmFsdWUsCisgICAgICAiVGhlIHNwZWNpZmllZCBpdGVyYXRvciB0eXBlIGNhbm5vdCBiZSB1c2VkIHdpdGggcmV2ZXJzZV9pdGVyYXRvcjsgIgorICAgICAgIlVzaW5nIHN0YXNoaW5nIGl0ZXJhdG9ycyB3aXRoIHJldmVyc2VfaXRlcmF0b3IgY2F1c2VzIHVuZGVmaW5lZCBiZWhhdmlvciIpOworCitwcm90ZWN0ZWQ6CisgICAgX0l0ZXIgY3VycmVudDsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9JdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46OnJlZmVyZW5jZSAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+Ojpwb2ludGVyICAgICAgICAgcG9pbnRlcjsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICByZXZlcnNlX2l0ZXJhdG9yKCkgOiBfX3QoKSwgY3VycmVudCgpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIGV4cGxpY2l0IHJldmVyc2VfaXRlcmF0b3IoX0l0ZXIgX194KSA6IF9fdChfX3gpLCBjdXJyZW50KF9feCkge30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgICAgICAgIHJldmVyc2VfaXRlcmF0b3IoY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfVXA+JiBfX3UpIDogX190KF9fdS5iYXNlKCkpLCBjdXJyZW50KF9fdS5iYXNlKCkpIHt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgICAgICByZXZlcnNlX2l0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfVXA+JiBfX3UpCisgICAgICAgICAgICB7IF9fdCA9IGN1cnJlbnQgPSBfX3UuYmFzZSgpOyByZXR1cm4gKnRoaXM7IH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgICAgX0l0ZXIgYmFzZSgpIGNvbnN0IHtyZXR1cm4gY3VycmVudDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7X0l0ZXIgX190bXAgPSBjdXJyZW50OyByZXR1cm4gKi0tX190bXA7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICBwb2ludGVyICBvcGVyYXRvci0+KCkgY29uc3Qge3JldHVybiBfVlNURDo6YWRkcmVzc29mKG9wZXJhdG9yKigpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIHJldmVyc2VfaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7LS1jdXJyZW50OyByZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICByZXZlcnNlX2l0ZXJhdG9yICBvcGVyYXRvcisrKGludCkge3JldmVyc2VfaXRlcmF0b3IgX190bXAoKnRoaXMpOyAtLWN1cnJlbnQ7IHJldHVybiBfX3RtcDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIHJldmVyc2VfaXRlcmF0b3ImIG9wZXJhdG9yLS0oKSB7KytjdXJyZW50OyByZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICByZXZlcnNlX2l0ZXJhdG9yICBvcGVyYXRvci0tKGludCkge3JldmVyc2VfaXRlcmF0b3IgX190bXAoKnRoaXMpOyArK2N1cnJlbnQ7IHJldHVybiBfX3RtcDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIHJldmVyc2VfaXRlcmF0b3IgIG9wZXJhdG9yKyAoZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3Qge3JldHVybiByZXZlcnNlX2l0ZXJhdG9yKGN1cnJlbnQgLSBfX24pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgICAgcmV2ZXJzZV9pdGVyYXRvciYgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19uKSB7Y3VycmVudCAtPSBfX247IHJldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIHJldmVyc2VfaXRlcmF0b3IgIG9wZXJhdG9yLSAoZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3Qge3JldHVybiByZXZlcnNlX2l0ZXJhdG9yKGN1cnJlbnQgKyBfX24pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgICAgcmV2ZXJzZV9pdGVyYXRvciYgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgX19uKSB7Y3VycmVudCArPSBfX247IHJldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIHJlZmVyZW5jZSAgICAgICAgIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3Qge3JldHVybiAqKCp0aGlzICsgX19uKTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIxLCBjbGFzcyBfSXRlcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorYm9vbAorb3BlcmF0b3I9PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyMT4mIF9feCwgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcjI+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5iYXNlKCkgPT0gX195LmJhc2UoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyMSwgY2xhc3MgX0l0ZXIyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK2Jvb2wKK29wZXJhdG9yPChjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyMT4mIF9feCwgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcjI+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5iYXNlKCkgPiBfX3kuYmFzZSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIxLCBjbGFzcyBfSXRlcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorYm9vbAorb3BlcmF0b3IhPShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyMT4mIF9feCwgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcjI+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5iYXNlKCkgIT0gX195LmJhc2UoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyMSwgY2xhc3MgX0l0ZXIyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK2Jvb2wKK29wZXJhdG9yPihjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyMT4mIF9feCwgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcjI+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5iYXNlKCkgPCBfX3kuYmFzZSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIxLCBjbGFzcyBfSXRlcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorYm9vbAorb3BlcmF0b3I+PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyMT4mIF9feCwgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcjI+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5iYXNlKCkgPD0gX195LmJhc2UoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyMSwgY2xhc3MgX0l0ZXIyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK2Jvb2wKK29wZXJhdG9yPD0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcjE+JiBfX3gsIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXIyPiYgX195KQoreworICAgIHJldHVybiBfX3guYmFzZSgpID49IF9feS5iYXNlKCk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIxLCBjbGFzcyBfSXRlcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorYXV0bworb3BlcmF0b3ItKGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXIxPiYgX194LCBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyMj4mIF9feSkKKy0+IGRlY2x0eXBlKF9feS5iYXNlKCkgLSBfX3guYmFzZSgpKQoreworICAgIHJldHVybiBfX3kuYmFzZSgpIC0gX194LmJhc2UoKTsKK30KKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIxLCBjbGFzcyBfSXRlcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcjE+OjpkaWZmZXJlbmNlX3R5cGUKK29wZXJhdG9yLShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyMT4mIF9feCwgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcjI+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feS5iYXNlKCkgLSBfX3guYmFzZSgpOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CityZXZlcnNlX2l0ZXJhdG9yPF9JdGVyPgorb3BlcmF0b3IrKHR5cGVuYW1lIHJldmVyc2VfaXRlcmF0b3I8X0l0ZXI+OjpkaWZmZXJlbmNlX3R5cGUgX19uLCBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyPiYgX194KQoreworICAgIHJldHVybiByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyPihfX3guYmFzZSgpIC0gX19uKTsKK30KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcj4gbWFrZV9yZXZlcnNlX2l0ZXJhdG9yKF9JdGVyIF9faSkKK3sKKyAgICByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcj4oX19pKTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3I8b3V0cHV0X2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkPgoreworcHJvdGVjdGVkOgorICAgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9Db250YWluZXIgY29udGFpbmVyX3R5cGU7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IGJhY2tfaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoX1ZTVEQ6OmFkZHJlc3NvZihfX3gpKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYmFja19pbnNlcnRfaXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlXykKKyAgICAgICAge2NvbnRhaW5lci0+cHVzaF9iYWNrKF9fdmFsdWVfKTsgcmV0dXJuICp0aGlzO30KKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBiYWNrX2luc2VydF9pdGVyYXRvciYgb3BlcmF0b3I9KHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmJiBfX3ZhbHVlXykKKyAgICAgICAge2NvbnRhaW5lci0+cHVzaF9iYWNrKF9WU1REOjptb3ZlKF9fdmFsdWVfKSk7IHJldHVybiAqdGhpczt9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYmFja19pbnNlcnRfaXRlcmF0b3ImIG9wZXJhdG9yKigpICAgICB7cmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkgICAge3JldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBiYWNrX2luc2VydF9pdGVyYXRvciAgb3BlcmF0b3IrKyhpbnQpIHtyZXR1cm4gKnRoaXM7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFja19pbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4KK2JhY2tfaW5zZXJ0ZXIoX0NvbnRhaW5lciYgX194KQoreworICAgIHJldHVybiBiYWNrX2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPihfX3gpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGZyb250X2luc2VydF9pdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZD4KK3sKK3Byb3RlY3RlZDoKKyAgICBfQ29udGFpbmVyKiBjb250YWluZXI7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfQ29udGFpbmVyIGNvbnRhaW5lcl90eXBlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBleHBsaWNpdCBmcm9udF9pbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KSA6IGNvbnRhaW5lcihfVlNURDo6YWRkcmVzc29mKF9feCkpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmcm9udF9pbnNlcnRfaXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlXykKKyAgICAgICAge2NvbnRhaW5lci0+cHVzaF9mcm9udChfX3ZhbHVlXyk7IHJldHVybiAqdGhpczt9CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yJiBvcGVyYXRvcj0odHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYmIF9fdmFsdWVfKQorICAgICAgICB7Y29udGFpbmVyLT5wdXNoX2Zyb250KF9WU1REOjptb3ZlKF9fdmFsdWVfKSk7IHJldHVybiAqdGhpczt9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yJiBvcGVyYXRvciooKSAgICAge3JldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmcm9udF9pbnNlcnRfaXRlcmF0b3ImIG9wZXJhdG9yKysoKSAgICB7cmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZyb250X2luc2VydF9pdGVyYXRvciAgb3BlcmF0b3IrKyhpbnQpIHtyZXR1cm4gKnRoaXM7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+Citmcm9udF9pbnNlcnRlcihfQ29udGFpbmVyJiBfX3gpCit7CisgICAgcmV0dXJuIGZyb250X2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPihfX3gpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGluc2VydF9pdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZD4KK3sKK3Byb3RlY3RlZDoKKyAgICBfQ29udGFpbmVyKiBjb250YWluZXI7CisgICAgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgaXRlcjsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9Db250YWluZXIgY29udGFpbmVyX3R5cGU7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIF9faSkKKyAgICAgICAgOiBjb250YWluZXIoX1ZTVEQ6OmFkZHJlc3NvZihfX3gpKSwgaXRlcihfX2kpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbnNlcnRfaXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlXykKKyAgICAgICAge2l0ZXIgPSBjb250YWluZXItPmluc2VydChpdGVyLCBfX3ZhbHVlXyk7ICsraXRlcjsgcmV0dXJuICp0aGlzO30KKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbnNlcnRfaXRlcmF0b3ImIG9wZXJhdG9yPSh0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiYgX192YWx1ZV8pCisgICAgICAgIHtpdGVyID0gY29udGFpbmVyLT5pbnNlcnQoaXRlciwgX1ZTVEQ6Om1vdmUoX192YWx1ZV8pKTsgKytpdGVyOyByZXR1cm4gKnRoaXM7fQorI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGluc2VydF9pdGVyYXRvciYgb3BlcmF0b3IqKCkgICAgICAgIHtyZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5zZXJ0X2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkgICAgICAge3JldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbnNlcnRfaXRlcmF0b3ImIG9wZXJhdG9yKysoaW50KSAgICB7cmV0dXJuICp0aGlzO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPgoraW5zZXJ0ZXIoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBfX2kpCit7CisgICAgcmV0dXJuIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPihfX3gsIF9faSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9DaGFyVCA9IGNoYXIsCisgICAgICAgICAgY2xhc3MgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4sIGNsYXNzIF9EaXN0YW5jZSA9IHB0cmRpZmZfdD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGlzdHJlYW1faXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcjxpbnB1dF9pdGVyYXRvcl90YWcsIF9UcCwgX0Rpc3RhbmNlLCBjb25zdCBfVHAqLCBjb25zdCBfVHAmPgoreworcHVibGljOgorICAgIHR5cGVkZWYgX0NoYXJUIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIF9UcmFpdHMgdHJhaXRzX3R5cGU7CisgICAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiBpc3RyZWFtX3R5cGU7Citwcml2YXRlOgorICAgIGlzdHJlYW1fdHlwZSogX19pbl9zdHJlYW1fOworICAgIF9UcCBfX3ZhbHVlXzsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSIGlzdHJlYW1faXRlcmF0b3IoKSA6IF9faW5fc3RyZWFtXygwKSwgX192YWx1ZV8oKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaXN0cmVhbV9pdGVyYXRvcihpc3RyZWFtX3R5cGUmIF9fcykgOiBfX2luX3N0cmVhbV8oX1ZTVEQ6OmFkZHJlc3NvZihfX3MpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoISgqX19pbl9zdHJlYW1fID4+IF9fdmFsdWVfKSkKKyAgICAgICAgICAgICAgICBfX2luX3N0cmVhbV8gPSAwOworICAgICAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0IF9UcCYgb3BlcmF0b3IqKCkgY29uc3Qge3JldHVybiBfX3ZhbHVlXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdCBfVHAqIG9wZXJhdG9yLT4oKSBjb25zdCB7cmV0dXJuIF9WU1REOjphZGRyZXNzb2YoKG9wZXJhdG9yKigpKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaXN0cmVhbV9pdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghKCpfX2luX3N0cmVhbV8gPj4gX192YWx1ZV8pKQorICAgICAgICAgICAgICAgIF9faW5fc3RyZWFtXyA9IDA7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlzdHJlYW1faXRlcmF0b3IgIG9wZXJhdG9yKysoaW50KQorICAgICAgICB7aXN0cmVhbV9pdGVyYXRvciBfX3QoKnRoaXMpOyArKygqdGhpcyk7IHJldHVybiBfX3Q7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcCwgY2xhc3MgX0NoYXJVLCBjbGFzcyBfVHJhaXRzVSwgY2xhc3MgX0Rpc3RhbmNlVT4KKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8X1VwLCBfQ2hhclUsIF9UcmFpdHNVLCBfRGlzdGFuY2VVPiYgX194LAorICAgICAgICAgICAgICAgY29uc3QgaXN0cmVhbV9pdGVyYXRvcjxfVXAsIF9DaGFyVSwgX1RyYWl0c1UsIF9EaXN0YW5jZVU+JiBfX3kpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcCwgY2xhc3MgX0NoYXJVLCBjbGFzcyBfVHJhaXRzVSwgY2xhc3MgX0Rpc3RhbmNlVT4KKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8X1VwLCBfQ2hhclUsIF9UcmFpdHNVLCBfRGlzdGFuY2VVPiYgX194LAorICAgICAgICAgICAgICAgY29uc3QgaXN0cmVhbV9pdGVyYXRvcjxfVXAsIF9DaGFyVSwgX1RyYWl0c1UsIF9EaXN0YW5jZVU+JiBfX3kpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRGlzdGFuY2U+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPF9UcCwgX0NoYXJULCBfVHJhaXRzLCBfRGlzdGFuY2U+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8X1RwLCBfQ2hhclQsIF9UcmFpdHMsIF9EaXN0YW5jZT4mIF9feSkKK3sKKyAgICByZXR1cm4gX194Ll9faW5fc3RyZWFtXyA9PSBfX3kuX19pbl9zdHJlYW1fOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9EaXN0YW5jZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8X1RwLCBfQ2hhclQsIF9UcmFpdHMsIF9EaXN0YW5jZT4mIF9feCwKKyAgICAgICAgICAgY29uc3QgaXN0cmVhbV9pdGVyYXRvcjxfVHAsIF9DaGFyVCwgX1RyYWl0cywgX0Rpc3RhbmNlPiYgX195KQoreworICAgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ2hhclQgPSBjaGFyLCBjbGFzcyBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBvc3RyZWFtX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3I8b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9DaGFyVCBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBfVHJhaXRzIHRyYWl0c190eXBlOworICAgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsX1RyYWl0cz4gb3N0cmVhbV90eXBlOworcHJpdmF0ZToKKyAgICBvc3RyZWFtX3R5cGUqIF9fb3V0X3N0cmVhbV87CisgICAgY29uc3QgY2hhcl90eXBlKiBfX2RlbGltXzsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIG9zdHJlYW1faXRlcmF0b3Iob3N0cmVhbV90eXBlJiBfX3MpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fb3V0X3N0cmVhbV8oX1ZTVEQ6OmFkZHJlc3NvZihfX3MpKSwgX19kZWxpbV8oMCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIG9zdHJlYW1faXRlcmF0b3Iob3N0cmVhbV90eXBlJiBfX3MsIGNvbnN0IF9DaGFyVCogX19kZWxpbWl0ZXIpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fb3V0X3N0cmVhbV8oX1ZTVEQ6OmFkZHJlc3NvZihfX3MpKSwgX19kZWxpbV8oX19kZWxpbWl0ZXIpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBvc3RyZWFtX2l0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgX1RwJiBfX3ZhbHVlXykKKyAgICAgICAgeworICAgICAgICAgICAgKl9fb3V0X3N0cmVhbV8gPDwgX192YWx1ZV87CisgICAgICAgICAgICBpZiAoX19kZWxpbV8pCisgICAgICAgICAgICAgICAgKl9fb3V0X3N0cmVhbV8gPDwgX19kZWxpbV87CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgb3N0cmVhbV9pdGVyYXRvciYgb3BlcmF0b3IqKCkgICAgIHtyZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgb3N0cmVhbV9pdGVyYXRvciYgb3BlcmF0b3IrKygpICAgIHtyZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgb3N0cmVhbV9pdGVyYXRvciYgb3BlcmF0b3IrKyhpbnQpIHtyZXR1cm4gKnRoaXM7fQorfTsKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgaXN0cmVhbWJ1Zl9pdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yPGlucHV0X2l0ZXJhdG9yX3RhZywgX0NoYXJULAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9UcmFpdHM6Om9mZl90eXBlLCBfQ2hhclQqLAorICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVD4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlICAgICAgaW50X3R5cGU7CisgICAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8X0NoYXJULF9UcmFpdHM+IHN0cmVhbWJ1Zl90eXBlOworICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsX1RyYWl0cz4gICBpc3RyZWFtX3R5cGU7Citwcml2YXRlOgorICAgIG11dGFibGUgc3RyZWFtYnVmX3R5cGUqIF9fc2J1Zl87CisKKyAgICBjbGFzcyBfX3Byb3h5CisgICAgeworICAgICAgICBjaGFyX3R5cGUgX19rZWVwXzsKKyAgICAgICAgc3RyZWFtYnVmX3R5cGUqIF9fc2J1Zl87CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX19wcm94eShjaGFyX3R5cGUgX19jLCBzdHJlYW1idWZfdHlwZSogX19zKQorICAgICAgICAgICAgOiBfX2tlZXBfKF9fYyksIF9fc2J1Zl8oX19zKSB7fQorICAgICAgICBmcmllbmQgY2xhc3MgaXN0cmVhbWJ1Zl9pdGVyYXRvcjsKKyAgICBwdWJsaWM6CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY2hhcl90eXBlIG9wZXJhdG9yKigpIGNvbnN0IHtyZXR1cm4gX19rZWVwXzt9CisgICAgfTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIF9fdGVzdF9mb3JfZW9mKCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChfX3NidWZfICYmIHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX3NidWZfLT5zZ2V0YygpLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorICAgICAgICAgICAgX19zYnVmXyA9IDA7CisgICAgICAgIHJldHVybiBfX3NidWZfID09IDA7CisgICAgfQorcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIgaXN0cmVhbWJ1Zl9pdGVyYXRvcigpIF9OT0VYQ0VQVCA6IF9fc2J1Zl8oMCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlzdHJlYW1idWZfaXRlcmF0b3IoaXN0cmVhbV90eXBlJiBfX3MpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fc2J1Zl8oX19zLnJkYnVmKCkpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpc3RyZWFtYnVmX2l0ZXJhdG9yKHN0cmVhbWJ1Zl90eXBlKiBfX3MpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fc2J1Zl8oX19zKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaXN0cmVhbWJ1Zl9pdGVyYXRvcihjb25zdCBfX3Byb3h5JiBfX3ApIF9OT0VYQ0VQVAorICAgICAgICA6IF9fc2J1Zl8oX19wLl9fc2J1Zl8pIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNoYXJfdHlwZSAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgICAge3JldHVybiBzdGF0aWNfY2FzdDxjaGFyX3R5cGU+KF9fc2J1Zl8tPnNnZXRjKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlzdHJlYW1idWZfaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICB7CisgICAgICAgICAgICBfX3NidWZfLT5zYnVtcGMoKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX19wcm94eSAgICAgICAgICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfX3Byb3h5KF9fc2J1Zl8tPnNidW1wYygpLCBfX3NidWZfKTsKKyAgICAgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBib29sIGVxdWFsKGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3ImIF9fYikgY29uc3QKKyAgICAgICAge3JldHVybiBfX3Rlc3RfZm9yX2VvZigpID09IF9fYi5fX3Rlc3RfZm9yX2VvZigpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBvcGVyYXRvcj09KGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULF9UcmFpdHM+JiBfX2EsCisgICAgICAgICAgICAgICAgY29uc3QgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsX1RyYWl0cz4mIF9fYikKKyAgICAgICAgICAgICAgICB7cmV0dXJuIF9fYS5lcXVhbChfX2IpO30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIG9wZXJhdG9yIT0oY29uc3QgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsX1RyYWl0cz4mIF9fYSwKKyAgICAgICAgICAgICAgICBjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCxfVHJhaXRzPiYgX19iKQorICAgICAgICAgICAgICAgIHtyZXR1cm4gIV9fYS5lcXVhbChfX2IpO30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIG9zdHJlYW1idWZfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcjxvdXRwdXRfaXRlcmF0b3JfdGFnLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkPgoreworcHVibGljOgorICAgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworICAgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCxfVHJhaXRzPiBzdHJlYW1idWZfdHlwZTsKKyAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJULF9UcmFpdHM+ICAgb3N0cmVhbV90eXBlOworcHJpdmF0ZToKKyAgICBzdHJlYW1idWZfdHlwZSogX19zYnVmXzsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIG9zdHJlYW1idWZfaXRlcmF0b3Iob3N0cmVhbV90eXBlJiBfX3MpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fc2J1Zl8oX19zLnJkYnVmKCkpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBvc3RyZWFtYnVmX2l0ZXJhdG9yKHN0cmVhbWJ1Zl90eXBlKiBfX3MpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fc2J1Zl8oX19zKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgb3N0cmVhbWJ1Zl9pdGVyYXRvciYgb3BlcmF0b3I9KF9DaGFyVCBfX2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX3NidWZfICYmIHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX3NidWZfLT5zcHV0YyhfX2MpLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorICAgICAgICAgICAgICAgIF9fc2J1Zl8gPSAwOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBvc3RyZWFtYnVmX2l0ZXJhdG9yJiBvcGVyYXRvciooKSAgICAge3JldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBvc3RyZWFtYnVmX2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkgICAge3JldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBvc3RyZWFtYnVmX2l0ZXJhdG9yJiBvcGVyYXRvcisrKGludCkge3JldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBib29sIGZhaWxlZCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fc2J1Zl8gPT0gMDt9CisKKyNpZiAhZGVmaW5lZChfX0FQUExFX18pIHx8IFwKKyAgICAoZGVmaW5lZChfX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEKSAmJiBfX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEID4gX19NQUNfMTBfOCkgfHwgXAorICAgIChkZWZpbmVkKF9fSVBIT05FX09TX1ZFUlNJT05fTUlOX1JFUVVJUkVEKSAmJiBfX0lQSE9ORV9PU19WRVJTSU9OX01JTl9SRVFVSVJFRCA+IF9fSVBIT05FXzZfMCkKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2gsIGNsYXNzIF9Ucj4KKyAgICBmcmllbmQKKyAgICBfTElCQ1BQX0hJRERFTgorICAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoLCBfVHI+CisgICAgX19wYWRfYW5kX291dHB1dChvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaCwgX1RyPiBfX3MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBfQ2gqIF9fb2IsIGNvbnN0IF9DaCogX19vcCwgY29uc3QgX0NoKiBfX29lLAorICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9faW9iLCBfQ2ggX19mbCk7CisjZW5kaWYKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcj4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIG1vdmVfaXRlcmF0b3IKK3sKK3ByaXZhdGU6CisgICAgX0l0ZXIgX19pOworcHVibGljOgorICAgIHR5cGVkZWYgX0l0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8aXRlcmF0b3JfdHlwZT46Oml0ZXJhdG9yX2NhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPGl0ZXJhdG9yX3R5cGU+Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8aXRlcmF0b3JfdHlwZT46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiBpdGVyYXRvcl90eXBlIHBvaW50ZXI7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPGl0ZXJhdG9yX3R5cGU+OjpyZWZlcmVuY2UgX19yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDwKKyAgICAgICAgICAgIGlzX3JlZmVyZW5jZTxfX3JlZmVyZW5jZT46OnZhbHVlLAorICAgICAgICAgICAgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfX3JlZmVyZW5jZT46OnR5cGUmJiwKKyAgICAgICAgICAgIF9fcmVmZXJlbmNlCisgICAgICAgID46OnR5cGUgcmVmZXJlbmNlOworI2Vsc2UKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxpdGVyYXRvcl90eXBlPjo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIG1vdmVfaXRlcmF0b3IoKSA6IF9faSgpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIGV4cGxpY2l0IG1vdmVfaXRlcmF0b3IoX0l0ZXIgX194KSA6IF9faShfX3gpIHt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICAgIG1vdmVfaXRlcmF0b3IoY29uc3QgbW92ZV9pdGVyYXRvcjxfVXA+JiBfX3UpIDogX19pKF9fdS5iYXNlKCkpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNCBfSXRlciBiYXNlKCkgY29uc3Qge3JldHVybiBfX2k7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQgCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PHJlZmVyZW5jZT4oKl9faSk7IH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgICAgcG9pbnRlciAgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIF9faTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIG1vdmVfaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7KytfX2k7IHJldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIG1vdmVfaXRlcmF0b3IgIG9wZXJhdG9yKysoaW50KSB7bW92ZV9pdGVyYXRvciBfX3RtcCgqdGhpcyk7ICsrX19pOyByZXR1cm4gX190bXA7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICBtb3ZlX2l0ZXJhdG9yJiBvcGVyYXRvci0tKCkgey0tX19pOyByZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICBtb3ZlX2l0ZXJhdG9yICBvcGVyYXRvci0tKGludCkge21vdmVfaXRlcmF0b3IgX190bXAoKnRoaXMpOyAtLV9faTsgcmV0dXJuIF9fdG1wO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgICAgbW92ZV9pdGVyYXRvciAgb3BlcmF0b3IrIChkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdCB7cmV0dXJuIG1vdmVfaXRlcmF0b3IoX19pICsgX19uKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIG1vdmVfaXRlcmF0b3ImIG9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIF9fbikge19faSArPSBfX247IHJldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICAgIG1vdmVfaXRlcmF0b3IgIG9wZXJhdG9yLSAoZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3Qge3JldHVybiBtb3ZlX2l0ZXJhdG9yKF9faSAtIF9fbik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICBtb3ZlX2l0ZXJhdG9yJiBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBfX24pIHtfX2kgLT0gX19uOyByZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKKyAgICByZWZlcmVuY2Ugb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxyZWZlcmVuY2U+KF9faVtfX25dKTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyMSwgY2xhc3MgX0l0ZXIyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcjE+JiBfX3gsIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXIyPiYgX195KQoreworICAgIHJldHVybiBfX3guYmFzZSgpID09IF9feS5iYXNlKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcjEsIGNsYXNzIF9JdGVyMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0Citib29sCitvcGVyYXRvcjwoY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcjE+JiBfX3gsIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXIyPiYgX195KQoreworICAgIHJldHVybiBfX3guYmFzZSgpIDwgX195LmJhc2UoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyMSwgY2xhc3MgX0l0ZXIyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK2Jvb2wKK29wZXJhdG9yIT0oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcjE+JiBfX3gsIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXIyPiYgX195KQoreworICAgIHJldHVybiBfX3guYmFzZSgpICE9IF9feS5iYXNlKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcjEsIGNsYXNzIF9JdGVyMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0Citib29sCitvcGVyYXRvcj4oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcjE+JiBfX3gsIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXIyPiYgX195KQoreworICAgIHJldHVybiBfX3guYmFzZSgpID4gX195LmJhc2UoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyMSwgY2xhc3MgX0l0ZXIyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK2Jvb2wKK29wZXJhdG9yPj0oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcjE+JiBfX3gsIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXIyPiYgX195KQoreworICAgIHJldHVybiBfX3guYmFzZSgpID49IF9feS5iYXNlKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcjEsIGNsYXNzIF9JdGVyMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0Citib29sCitvcGVyYXRvcjw9KGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXIxPiYgX194LCBjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyMj4mIF9feSkKK3sKKyAgICByZXR1cm4gX194LmJhc2UoKSA8PSBfX3kuYmFzZSgpOworfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORwordGVtcGxhdGUgPGNsYXNzIF9JdGVyMSwgY2xhc3MgX0l0ZXIyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK2F1dG8KK29wZXJhdG9yLShjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyMT4mIF9feCwgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcjI+JiBfX3kpCistPiBkZWNsdHlwZShfX3guYmFzZSgpIC0gX195LmJhc2UoKSkKK3sKKyAgICByZXR1cm4gX194LmJhc2UoKSAtIF9feS5iYXNlKCk7Cit9CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9JdGVyMSwgY2xhc3MgX0l0ZXIyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIG1vdmVfaXRlcmF0b3I8X0l0ZXIxPjo6ZGlmZmVyZW5jZV90eXBlCitvcGVyYXRvci0oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcjE+JiBfX3gsIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXIyPiYgX195KQoreworICAgIHJldHVybiBfX3guYmFzZSgpIC0gX195LmJhc2UoKTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorbW92ZV9pdGVyYXRvcjxfSXRlcj4KK29wZXJhdG9yKyh0eXBlbmFtZSBtb3ZlX2l0ZXJhdG9yPF9JdGVyPjo6ZGlmZmVyZW5jZV90eXBlIF9fbiwgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcj4mIF9feCkKK3sKKyAgICByZXR1cm4gbW92ZV9pdGVyYXRvcjxfSXRlcj4oX194LmJhc2UoKSArIF9fbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0Cittb3ZlX2l0ZXJhdG9yPF9JdGVyPgorbWFrZV9tb3ZlX2l0ZXJhdG9yKF9JdGVyIF9faSkKK3sKKyAgICByZXR1cm4gbW92ZV9pdGVyYXRvcjxfSXRlcj4oX19pKTsKK30KKworLy8gX193cmFwX2l0ZXIKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyPiBjbGFzcyBfX3dyYXBfaXRlcjsKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyMSwgY2xhc3MgX0l0ZXIyPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjE+JiwgY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIyPiYpIF9OT0VYQ0VQVF9ERUJVRzsKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyMSwgY2xhc3MgX0l0ZXIyPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8KGNvbnN0IF9fd3JhcF9pdGVyPF9JdGVyMT4mLCBjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjI+JikgX05PRVhDRVBUX0RFQlVHOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIxLCBjbGFzcyBfSXRlcjI+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KGNvbnN0IF9fd3JhcF9pdGVyPF9JdGVyMT4mLCBjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjI+JikgX05PRVhDRVBUX0RFQlVHOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIxLCBjbGFzcyBfSXRlcjI+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj4oY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIxPiYsIGNvbnN0IF9fd3JhcF9pdGVyPF9JdGVyMj4mKSBfTk9FWENFUFRfREVCVUc7CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcjEsIGNsYXNzIF9JdGVyMj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPj0oY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIxPiYsIGNvbnN0IF9fd3JhcF9pdGVyPF9JdGVyMj4mKSBfTk9FWENFUFRfREVCVUc7CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcjEsIGNsYXNzIF9JdGVyMj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPD0oY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIxPiYsIGNvbnN0IF9fd3JhcF9pdGVyPF9JdGVyMj4mKSBfTk9FWENFUFRfREVCVUc7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIxLCBjbGFzcyBfSXRlcjI+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCithdXRvCitvcGVyYXRvci0oY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIxPiYgX194LCBjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjI+JiBfX3kpIF9OT0VYQ0VQVF9ERUJVRworLT4gZGVjbHR5cGUoX194LmJhc2UoKSAtIF9feS5iYXNlKCkpOworI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcjEsIGNsYXNzIF9JdGVyMj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIF9fd3JhcF9pdGVyPF9JdGVyMT46OmRpZmZlcmVuY2VfdHlwZQorb3BlcmF0b3ItKGNvbnN0IF9fd3JhcF9pdGVyPF9JdGVyMT4mLCBjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjI+JikgX05PRVhDRVBUX0RFQlVHOworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19fd3JhcF9pdGVyPF9JdGVyPgorb3BlcmF0b3IrKHR5cGVuYW1lIF9fd3JhcF9pdGVyPF9JdGVyPjo6ZGlmZmVyZW5jZV90eXBlLCBfX3dyYXBfaXRlcjxfSXRlcj4pIF9OT0VYQ0VQVF9ERUJVRzsKKwordGVtcGxhdGUgPGNsYXNzIF9JcCwgY2xhc3MgX09wPiBfT3AgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb3B5KF9JcCwgX0lwLCBfT3ApOwordGVtcGxhdGUgPGNsYXNzIF9CMSwgY2xhc3MgX0IyPiBfQjIgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb3B5X2JhY2t3YXJkKF9CMSwgX0IxLCBfQjIpOwordGVtcGxhdGUgPGNsYXNzIF9JcCwgY2xhc3MgX09wPiBfT3AgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBtb3ZlKF9JcCwgX0lwLCBfT3ApOwordGVtcGxhdGUgPGNsYXNzIF9CMSwgY2xhc3MgX0IyPiBfQjIgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBtb3ZlX2JhY2t3YXJkKF9CMSwgX0IxLCBfQjIpOworCisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA8IDIKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX3RyaXZpYWxseV9jb3B5X2Fzc2lnbmFibGU8X1RwPjo6dmFsdWUsCisgICAgX1RwKgorPjo6dHlwZQorX191bndyYXBfaXRlcihfX3dyYXBfaXRlcjxfVHAqPik7CisKKyNlbHNlCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgaXNfdHJpdmlhbGx5X2NvcHlfYXNzaWduYWJsZTxfVHA+Ojp2YWx1ZSwKKyAgICBfX3dyYXBfaXRlcjxfVHAqPgorPjo6dHlwZQorX191bndyYXBfaXRlcihfX3dyYXBfaXRlcjxfVHAqPiBfX2kpOworCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyPgorY2xhc3MgX193cmFwX2l0ZXIKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9JdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxpdGVyYXRvcl90eXBlPjo6aXRlcmF0b3JfY2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8aXRlcmF0b3JfdHlwZT46OnZhbHVlX3R5cGUgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8aXRlcmF0b3JfdHlwZT46OmRpZmZlcmVuY2VfdHlwZSAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxpdGVyYXRvcl90eXBlPjo6cG9pbnRlciAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxpdGVyYXRvcl90eXBlPjo6cmVmZXJlbmNlICAgICAgICAgcmVmZXJlbmNlOworcHJpdmF0ZToKKyAgICBpdGVyYXRvcl90eXBlIF9faTsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fd3JhcF9pdGVyKCkgX05PRVhDRVBUX0RFQlVHCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICAgICAgICAgICAgICA6IF9faXt9CisjZW5kaWYKKyAgICB7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2kodGhpcyk7CisjZW5kaWYKKyAgICB9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4gX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX3dyYXBfaXRlcihjb25zdCBfX3dyYXBfaXRlcjxfVXA+JiBfX3UsCisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19jb252ZXJ0aWJsZTxfVXAsIGl0ZXJhdG9yX3R5cGU+Ojp2YWx1ZT46OnR5cGUqID0gMCkgX05PRVhDRVBUX0RFQlVHCisgICAgICAgIDogX19pKF9fdS5iYXNlKCkpCisgICAgeworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICBfX2dldF9kYigpLT5fX2l0ZXJhdG9yX2NvcHkodGhpcywgJl9fdSk7CisjZW5kaWYKKyAgICB9CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fd3JhcF9pdGVyKGNvbnN0IF9fd3JhcF9pdGVyJiBfX3gpCisgICAgICAgIDogX19pKF9feC5iYXNlKCkpCisgICAgeworICAgICAgICBfX2dldF9kYigpLT5fX2l0ZXJhdG9yX2NvcHkodGhpcywgJl9feCk7CisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3dyYXBfaXRlciYgb3BlcmF0b3I9KGNvbnN0IF9fd3JhcF9pdGVyJiBfX3gpCisgICAgeworICAgICAgICBpZiAodGhpcyAhPSAmX194KQorICAgICAgICB7CisgICAgICAgICAgICBfX2dldF9kYigpLT5fX2l0ZXJhdG9yX2NvcHkodGhpcywgJl9feCk7CisgICAgICAgICAgICBfX2kgPSBfX3guX19pOworICAgICAgICB9CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIH5fX3dyYXBfaXRlcigpCisgICAgeworICAgICAgICBfX2dldF9kYigpLT5fX2VyYXNlX2kodGhpcyk7CisgICAgfQorI2VuZGlmCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgX05PRVhDRVBUX0RFQlVHCisgICAgeworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2RlcmVmZXJlbmNlYWJsZSh0aGlzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCB0byBkZXJlZmVyZW5jZSBhIG5vbi1kZXJlZmVyZW5jZWFibGUgaXRlcmF0b3IiKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gKl9faTsKKyAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBwb2ludGVyICBvcGVyYXRvci0+KCkgY29uc3QgX05PRVhDRVBUX0RFQlVHCisgICAgeworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2RlcmVmZXJlbmNlYWJsZSh0aGlzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCB0byBkZXJlZmVyZW5jZSBhIG5vbi1kZXJlZmVyZW5jZWFibGUgaXRlcmF0b3IiKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gKHBvaW50ZXIpX1ZTVEQ6OmFkZHJlc3NvZigqX19pKTsKKyAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX3dyYXBfaXRlciYgb3BlcmF0b3IrKygpIF9OT0VYQ0VQVF9ERUJVRworICAgIHsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19kZXJlZmVyZW5jZWFibGUodGhpcyksCisgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0ZWQgdG8gaW5jcmVtZW50IG5vbi1pbmNyZW1lbnRhYmxlIGl0ZXJhdG9yIik7CisjZW5kaWYKKyAgICAgICAgKytfX2k7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX3dyYXBfaXRlciAgb3BlcmF0b3IrKyhpbnQpIF9OT0VYQ0VQVF9ERUJVRworICAgICAgICB7X193cmFwX2l0ZXIgX190bXAoKnRoaXMpOyArKygqdGhpcyk7IHJldHVybiBfX3RtcDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX3dyYXBfaXRlciYgb3BlcmF0b3ItLSgpIF9OT0VYQ0VQVF9ERUJVRworICAgIHsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19kZWNyZW1lbnRhYmxlKHRoaXMpLAorICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIGRlY3JlbWVudCBub24tZGVjcmVtZW50YWJsZSBpdGVyYXRvciIpOworI2VuZGlmCisgICAgICAgIC0tX19pOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX193cmFwX2l0ZXIgIG9wZXJhdG9yLS0oaW50KSBfTk9FWENFUFRfREVCVUcKKyAgICAgICAge19fd3JhcF9pdGVyIF9fdG1wKCp0aGlzKTsgLS0oKnRoaXMpOyByZXR1cm4gX190bXA7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX193cmFwX2l0ZXIgIG9wZXJhdG9yKyAoZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QgX05PRVhDRVBUX0RFQlVHCisgICAgICAgIHtfX3dyYXBfaXRlciBfX3coKnRoaXMpOyBfX3cgKz0gX19uOyByZXR1cm4gX193O30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fd3JhcF9pdGVyJiBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBfX24pIF9OT0VYQ0VQVF9ERUJVRworICAgIHsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19hZGRhYmxlKHRoaXMsIF9fbiksCisgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCB0byBhZGQvc3VidHJhY3QgaXRlcmF0b3Igb3V0c2lkZSBvZiB2YWxpZCByYW5nZSIpOworI2VuZGlmCisgICAgICAgIF9faSArPSBfX247CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX3dyYXBfaXRlciAgb3BlcmF0b3ItIChkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdCBfTk9FWENFUFRfREVCVUcKKyAgICAgICAge3JldHVybiAqdGhpcyArICgtX19uKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX3dyYXBfaXRlciYgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgX19uKSBfTk9FWENFUFRfREVCVUcKKyAgICAgICAgeyp0aGlzICs9IC1fX247IHJldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByZWZlcmVuY2UgICAgICAgIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QgX05PRVhDRVBUX0RFQlVHCisgICAgeworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX3N1YnNjcmlwdGFibGUodGhpcywgX19uKSwKKyAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIHN1YnNjcmlwdCBpdGVyYXRvciBvdXRzaWRlIG9mIHZhbGlkIHJhbmdlIik7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIF9faVtfX25dOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaXRlcmF0b3JfdHlwZSBiYXNlKCkgY29uc3QgX05PRVhDRVBUX0RFQlVHIHtyZXR1cm4gX19pO30KKworcHJpdmF0ZToKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fd3JhcF9pdGVyKGNvbnN0IHZvaWQqIF9fcCwgaXRlcmF0b3JfdHlwZSBfX3gpIDogX19pKF9feCkKKyAgICB7CisgICAgICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ljKHRoaXMsIF9fcCk7CisgICAgfQorI2Vsc2UKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fd3JhcF9pdGVyKGl0ZXJhdG9yX3R5cGUgX194KSBfTk9FWENFUFRfREVCVUcgOiBfX2koX194KSB7fQorI2VuZGlmCisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPiBmcmllbmQgY2xhc3MgX193cmFwX2l0ZXI7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPiBmcmllbmQgY2xhc3MgYmFzaWNfc3RyaW5nOworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHZlY3RvcjsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfSXRlcjEsIGNsYXNzIF9JdGVyMj4KKyAgICBmcmllbmQKKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjE+JiwgY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIyPiYpIF9OT0VYQ0VQVF9ERUJVRzsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfSXRlcjEsIGNsYXNzIF9JdGVyMj4KKyAgICBmcmllbmQKKyAgICBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9fd3JhcF9pdGVyPF9JdGVyMT4mLCBjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjI+JikgX05PRVhDRVBUX0RFQlVHOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JdGVyMSwgY2xhc3MgX0l0ZXIyPgorICAgIGZyaWVuZAorICAgIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9fd3JhcF9pdGVyPF9JdGVyMT4mLCBjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjI+JikgX05PRVhDRVBUX0RFQlVHOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JdGVyMSwgY2xhc3MgX0l0ZXIyPgorICAgIGZyaWVuZAorICAgIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIxPiYsIGNvbnN0IF9fd3JhcF9pdGVyPF9JdGVyMj4mKSBfTk9FWENFUFRfREVCVUc7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIxLCBjbGFzcyBfSXRlcjI+CisgICAgZnJpZW5kCisgICAgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIxPiYsIGNvbnN0IF9fd3JhcF9pdGVyPF9JdGVyMj4mKSBfTk9FWENFUFRfREVCVUc7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIxLCBjbGFzcyBfSXRlcjI+CisgICAgZnJpZW5kCisgICAgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIxPiYsIGNvbnN0IF9fd3JhcF9pdGVyPF9JdGVyMj4mKSBfTk9FWENFUFRfREVCVUc7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JdGVyMSwgY2xhc3MgX0l0ZXIyPgorICAgIGZyaWVuZAorICAgIGF1dG8KKyAgICBvcGVyYXRvci0oY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIxPiYgX194LCBjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjI+JiBfX3kpIF9OT0VYQ0VQVF9ERUJVRworICAgIC0+IGRlY2x0eXBlKF9feC5iYXNlKCkgLSBfX3kuYmFzZSgpKTsKKyNlbHNlCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JdGVyMSwgY2xhc3MgX0l0ZXIyPgorICAgIGZyaWVuZAorICAgIHR5cGVuYW1lIF9fd3JhcF9pdGVyPF9JdGVyMT46OmRpZmZlcmVuY2VfdHlwZQorICAgIG9wZXJhdG9yLShjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjE+JiwgY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIyPiYpIF9OT0VYQ0VQVF9ERUJVRzsKKyNlbmRpZgorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JdGVyMT4KKyAgICBmcmllbmQKKyAgICBfX3dyYXBfaXRlcjxfSXRlcjE+CisgICAgb3BlcmF0b3IrKHR5cGVuYW1lIF9fd3JhcF9pdGVyPF9JdGVyMT46OmRpZmZlcmVuY2VfdHlwZSwgX193cmFwX2l0ZXI8X0l0ZXIxPikgX05PRVhDRVBUX0RFQlVHOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JcCwgY2xhc3MgX09wPiBmcmllbmQgX09wIGNvcHkoX0lwLCBfSXAsIF9PcCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9CMSwgY2xhc3MgX0IyPiBmcmllbmQgX0IyIGNvcHlfYmFja3dhcmQoX0IxLCBfQjEsIF9CMik7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JcCwgY2xhc3MgX09wPiBmcmllbmQgX09wIG1vdmUoX0lwLCBfSXAsIF9PcCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9CMSwgY2xhc3MgX0IyPiBmcmllbmQgX0IyIG1vdmVfYmFja3dhcmQoX0IxLCBfQjEsIF9CMik7CisKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMIDwgMgorICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgZnJpZW5kCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgPAorICAgICAgICBpc190cml2aWFsbHlfY29weV9hc3NpZ25hYmxlPF9UcD46OnZhbHVlLAorICAgICAgICBfVHAqCisgICAgPjo6dHlwZQorICAgIF9fdW53cmFwX2l0ZXIoX193cmFwX2l0ZXI8X1RwKj4pOworI2Vsc2UKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgdHlwZW5hbWUgZW5hYmxlX2lmCisgIDwKKyAgICAgIGlzX3RyaXZpYWxseV9jb3B5X2Fzc2lnbmFibGU8X1RwPjo6dmFsdWUsCisgICAgICBfX3dyYXBfaXRlcjxfVHAqPgorICA+Ojp0eXBlCisgIF9fdW53cmFwX2l0ZXIoX193cmFwX2l0ZXI8X1RwKj4gX19pKTsKKyNlbmRpZgorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyMSwgY2xhc3MgX0l0ZXIyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIxPiYgX194LCBjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjI+JiBfX3kpIF9OT0VYQ0VQVF9ERUJVRworeworICAgIHJldHVybiBfX3guYmFzZSgpID09IF9feS5iYXNlKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcjEsIGNsYXNzIF9JdGVyMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjwoY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIxPiYgX194LCBjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjI+JiBfX3kpIF9OT0VYQ0VQVF9ERUJVRworeworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fbGVzc190aGFuX2NvbXBhcmFibGUoJl9feCwgJl9feSksCisgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCB0byBjb21wYXJlIGluY29tcGFyYWJsZSBpdGVyYXRvcnMiKTsKKyNlbmRpZgorICAgIHJldHVybiBfX3guYmFzZSgpIDwgX195LmJhc2UoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyMSwgY2xhc3MgX0l0ZXIyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yIT0oY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIxPiYgX194LCBjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjI+JiBfX3kpIF9OT0VYQ0VQVF9ERUJVRworeworICAgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIxLCBjbGFzcyBfSXRlcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+KGNvbnN0IF9fd3JhcF9pdGVyPF9JdGVyMT4mIF9feCwgY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIyPiYgX195KSBfTk9FWENFUFRfREVCVUcKK3sKKyAgICByZXR1cm4gX195IDwgX194OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIxLCBjbGFzcyBfSXRlcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+PShjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjE+JiBfX3gsIGNvbnN0IF9fd3JhcF9pdGVyPF9JdGVyMj4mIF9feSkgX05PRVhDRVBUX0RFQlVHCit7CisgICAgcmV0dXJuICEoX194IDwgX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyMSwgY2xhc3MgX0l0ZXIyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPD0oY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIxPiYgX194LCBjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjI+JiBfX3kpIF9OT0VYQ0VQVF9ERUJVRworeworICAgIHJldHVybiAhKF9feSA8IF9feCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcjE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjE+JiBfX3gsIGNvbnN0IF9fd3JhcF9pdGVyPF9JdGVyMT4mIF9feSkgX05PRVhDRVBUX0RFQlVHCit7CisgICAgcmV0dXJuICEoX194ID09IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcjE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+KGNvbnN0IF9fd3JhcF9pdGVyPF9JdGVyMT4mIF9feCwgY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIxPiYgX195KSBfTk9FWENFUFRfREVCVUcKK3sKKyAgICByZXR1cm4gX195IDwgX194OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIxPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPj0oY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIxPiYgX194LCBjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjE+JiBfX3kpIF9OT0VYQ0VQVF9ERUJVRworeworICAgIHJldHVybiAhKF9feCA8IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcjE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8PShjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjE+JiBfX3gsIGNvbnN0IF9fd3JhcF9pdGVyPF9JdGVyMT4mIF9feSkgX05PRVhDRVBUX0RFQlVHCit7CisgICAgcmV0dXJuICEoX195IDwgX194KTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcjEsIGNsYXNzIF9JdGVyMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCithdXRvCitvcGVyYXRvci0oY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIxPiYgX194LCBjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjI+JiBfX3kpIF9OT0VYQ0VQVF9ERUJVRworLT4gZGVjbHR5cGUoX194LmJhc2UoKSAtIF9feS5iYXNlKCkpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19sZXNzX3RoYW5fY29tcGFyYWJsZSgmX194LCAmX195KSwKKyAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIHN1YnRyYWN0IGluY29tcGF0aWJsZSBpdGVyYXRvcnMiKTsKKyNlbmRpZgorICAgIHJldHVybiBfX3guYmFzZSgpIC0gX195LmJhc2UoKTsKK30KKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIxLCBjbGFzcyBfSXRlcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgX193cmFwX2l0ZXI8X0l0ZXIxPjo6ZGlmZmVyZW5jZV90eXBlCitvcGVyYXRvci0oY29uc3QgX193cmFwX2l0ZXI8X0l0ZXIxPiYgX194LCBjb25zdCBfX3dyYXBfaXRlcjxfSXRlcjI+JiBfX3kpIF9OT0VYQ0VQVF9ERUJVRworeworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fbGVzc190aGFuX2NvbXBhcmFibGUoJl9feCwgJl9feSksCisgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCB0byBzdWJ0cmFjdCBpbmNvbXBhdGlibGUgaXRlcmF0b3JzIik7CisjZW5kaWYKKyAgICByZXR1cm4gX194LmJhc2UoKSAtIF9feS5iYXNlKCk7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19fd3JhcF9pdGVyPF9JdGVyPgorb3BlcmF0b3IrKHR5cGVuYW1lIF9fd3JhcF9pdGVyPF9JdGVyPjo6ZGlmZmVyZW5jZV90eXBlIF9fbiwKKyAgICAgICAgICBfX3dyYXBfaXRlcjxfSXRlcj4gX194KSBfTk9FWENFUFRfREVCVUcKK3sKKyAgICBfX3ggKz0gX19uOworICAgIHJldHVybiBfX3g7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcj4KK3N0cnVjdCBfX2xpYmNwcF9pc190cml2aWFsX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgX0xJQkNQUF9CT09MX0NPTlNUQU5UKGlzX3BvaW50ZXI8X0l0ZXI+Ojp2YWx1ZSkge307CisgICAgCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CitzdHJ1Y3QgX19saWJjcHBfaXNfdHJpdmlhbF9pdGVyYXRvcjxtb3ZlX2l0ZXJhdG9yPF9JdGVyPiA+CisgICAgOiBwdWJsaWMgX0xJQkNQUF9CT09MX0NPTlNUQU5UKF9fbGliY3BwX2lzX3RyaXZpYWxfaXRlcmF0b3I8X0l0ZXI+Ojp2YWx1ZSkge307CisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcj4KK3N0cnVjdCBfX2xpYmNwcF9pc190cml2aWFsX2l0ZXJhdG9yPHJldmVyc2VfaXRlcmF0b3I8X0l0ZXI+ID4KKyAgICA6IHB1YmxpYyBfTElCQ1BQX0JPT0xfQ09OU1RBTlQoX19saWJjcHBfaXNfdHJpdmlhbF9pdGVyYXRvcjxfSXRlcj46OnZhbHVlKSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyPgorc3RydWN0IF9fbGliY3BwX2lzX3RyaXZpYWxfaXRlcmF0b3I8X193cmFwX2l0ZXI8X0l0ZXI+ID4KKyAgICA6IHB1YmxpYyBfTElCQ1BQX0JPT0xfQ09OU1RBTlQoX19saWJjcHBfaXNfdHJpdmlhbF9pdGVyYXRvcjxfSXRlcj46OnZhbHVlKSB7fTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBzaXplX3QgX05wPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK19UcCoKK2JlZ2luKF9UcCAoJl9fYXJyYXkpW19OcF0pCit7CisgICAgcmV0dXJuIF9fYXJyYXk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfTnA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorX1RwKgorZW5kKF9UcCAoJl9fYXJyYXkpW19OcF0pCit7CisgICAgcmV0dXJuIF9fYXJyYXkgKyBfTnA7Cit9CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0NYWDAzX0xBTkcpCisKK3RlbXBsYXRlIDxjbGFzcyBfQ3A+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorYXV0bworYmVnaW4oX0NwJiBfX2MpIC0+IGRlY2x0eXBlKF9fYy5iZWdpbigpKQoreworICAgIHJldHVybiBfX2MuYmVnaW4oKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CithdXRvCitiZWdpbihjb25zdCBfQ3AmIF9fYykgLT4gZGVjbHR5cGUoX19jLmJlZ2luKCkpCit7CisgICAgcmV0dXJuIF9fYy5iZWdpbigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK2F1dG8KK2VuZChfQ3AmIF9fYykgLT4gZGVjbHR5cGUoX19jLmVuZCgpKQoreworICAgIHJldHVybiBfX2MuZW5kKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ3A+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorYXV0bworZW5kKGNvbnN0IF9DcCYgX19jKSAtPiBkZWNsdHlwZShfX2MuZW5kKCkpCit7CisgICAgcmV0dXJuIF9fYy5lbmQoKTsKK30KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfTnA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorcmV2ZXJzZV9pdGVyYXRvcjxfVHAqPiByYmVnaW4oX1RwICgmX19hcnJheSlbX05wXSkKK3sKKyAgICByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcjxfVHAqPihfX2FycmF5ICsgX05wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9OcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CityZXZlcnNlX2l0ZXJhdG9yPF9UcCo+IHJlbmQoX1RwICgmX19hcnJheSlbX05wXSkKK3sKKyAgICByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcjxfVHAqPihfX2FycmF5KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9FcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CityZXZlcnNlX2l0ZXJhdG9yPGNvbnN0IF9FcCo+IHJiZWdpbihpbml0aWFsaXplcl9saXN0PF9FcD4gX19pbCkKK3sKKyAgICByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcjxjb25zdCBfRXAqPihfX2lsLmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9FcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CityZXZlcnNlX2l0ZXJhdG9yPGNvbnN0IF9FcCo+IHJlbmQoaW5pdGlhbGl6ZXJfbGlzdDxfRXA+IF9faWwpCit7CisgICAgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3I8Y29uc3QgX0VwKj4oX19pbC5iZWdpbigpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCithdXRvIGNiZWdpbihjb25zdCBfQ3AmIF9fYykgLT4gZGVjbHR5cGUoX1ZTVEQ6OmJlZ2luKF9fYykpCit7CisgICAgcmV0dXJuIF9WU1REOjpiZWdpbihfX2MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK2F1dG8gY2VuZChjb25zdCBfQ3AmIF9fYykgLT4gZGVjbHR5cGUoX1ZTVEQ6OmVuZChfX2MpKQoreworICAgIHJldHVybiBfVlNURDo6ZW5kKF9fYyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ3A+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorYXV0byByYmVnaW4oX0NwJiBfX2MpIC0+IGRlY2x0eXBlKF9fYy5yYmVnaW4oKSkKK3sKKyAgICByZXR1cm4gX19jLnJiZWdpbigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK2F1dG8gcmJlZ2luKGNvbnN0IF9DcCYgX19jKSAtPiBkZWNsdHlwZShfX2MucmJlZ2luKCkpCit7CisgICAgcmV0dXJuIF9fYy5yYmVnaW4oKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CithdXRvIHJlbmQoX0NwJiBfX2MpIC0+IGRlY2x0eXBlKF9fYy5yZW5kKCkpCit7CisgICAgcmV0dXJuIF9fYy5yZW5kKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ3A+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorYXV0byByZW5kKGNvbnN0IF9DcCYgX19jKSAtPiBkZWNsdHlwZShfX2MucmVuZCgpKQoreworICAgIHJldHVybiBfX2MucmVuZCgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK2F1dG8gY3JiZWdpbihjb25zdCBfQ3AmIF9fYykgLT4gZGVjbHR5cGUoX1ZTVEQ6OnJiZWdpbihfX2MpKQoreworICAgIHJldHVybiBfVlNURDo6cmJlZ2luKF9fYyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ3A+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorYXV0byBjcmVuZChjb25zdCBfQ3AmIF9fYykgLT4gZGVjbHR5cGUoX1ZTVEQ6OnJlbmQoX19jKSkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OnJlbmQoX19jKTsKK30KKworI2VuZGlmCisKKworI2Vsc2UgIC8vIGRlZmluZWQoX0xJQkNQUF9DWFgwM19MQU5HKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIF9DcDo6aXRlcmF0b3IKK2JlZ2luKF9DcCYgX19jKQoreworICAgIHJldHVybiBfX2MuYmVnaW4oKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBfQ3A6OmNvbnN0X2l0ZXJhdG9yCitiZWdpbihjb25zdCBfQ3AmIF9fYykKK3sKKyAgICByZXR1cm4gX19jLmJlZ2luKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ3A+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgX0NwOjppdGVyYXRvcgorZW5kKF9DcCYgX19jKQoreworICAgIHJldHVybiBfX2MuZW5kKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ3A+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgX0NwOjpjb25zdF9pdGVyYXRvcgorZW5kKGNvbnN0IF9DcCYgX19jKQoreworICAgIHJldHVybiBfX2MuZW5kKCk7Cit9CisKKyNlbmRpZiAgLy8gIWRlZmluZWQoX0xJQkNQUF9DWFgwM19MQU5HKQorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKworLy8gI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisvLyB0ZW1wbGF0ZSA8PgorLy8gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHBsdXM8dm9pZD4KKy8vIHsKKy8vICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CisvLyAgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorLy8gICAgIGF1dG8gb3BlcmF0b3IoKShfVDEmJiBfX3QsIF9UMiYmIF9fdSkgY29uc3QKKy8vICAgICBfTk9FWENFUFRfKG5vZXhjZXB0KF9WU1REOjpmb3J3YXJkPF9UMT4oX190KSArIF9WU1REOjpmb3J3YXJkPF9UMj4oX191KSkpCisvLyAgICAgLT4gZGVjbHR5cGUgICAgICAgIChfVlNURDo6Zm9yd2FyZDxfVDE+KF9fdCkgKyBfVlNURDo6Zm9yd2FyZDxfVDI+KF9fdSkpCisvLyAgICAgICAgIHsgcmV0dXJuICAgICAgICBfVlNURDo6Zm9yd2FyZDxfVDE+KF9fdCkgKyBfVlNURDo6Zm9yd2FyZDxfVDI+KF9fdSk7IH0KKy8vICAgICB0eXBlZGVmIHZvaWQgaXNfdHJhbnNwYXJlbnQ7CisvLyB9OworLy8gI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdGV4cHIgYXV0byBzaXplKGNvbnN0IF9Db250JiBfX2MpCitfTk9FWENFUFRfKG5vZXhjZXB0KF9fYy5zaXplKCkpKQorLT4gZGVjbHR5cGUgICAgICAgIChfX2Muc2l6ZSgpKQoreyByZXR1cm4gICAgICAgICAgICBfX2Muc2l6ZSgpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfU3o+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RleHByIHNpemVfdCBzaXplKGNvbnN0IF9UcCAoJilbX1N6XSkgbm9leGNlcHQgeyByZXR1cm4gX1N6OyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29udD4KK19MSUJDUFBfTk9ESVNDQVJEX0FGVEVSX0NYWDE3IGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdGV4cHIgYXV0byBlbXB0eShjb25zdCBfQ29udCYgX19jKQorX05PRVhDRVBUXyhub2V4Y2VwdChfX2MuZW1wdHkoKSkpCistPiBkZWNsdHlwZSAgICAgICAgKF9fYy5lbXB0eSgpKQoreyByZXR1cm4gICAgICAgICAgICBfX2MuZW1wdHkoKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBzaXplX3QgX1N6PgorX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBib29sIGVtcHR5KGNvbnN0IF9UcCAoJilbX1N6XSkgbm9leGNlcHQgeyByZXR1cm4gZmFsc2U7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9FcD4KK19MSUJDUFBfTk9ESVNDQVJEX0FGVEVSX0NYWDE3IGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdGV4cHIgYm9vbCBlbXB0eShpbml0aWFsaXplcl9saXN0PF9FcD4gX19pbCkgbm9leGNlcHQgeyByZXR1cm4gX19pbC5zaXplKCkgPT0gMDsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnQ+IGNvbnN0ZXhwcgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2F1dG8gZGF0YShfQ29udCYgX19jKQorX05PRVhDRVBUXyhub2V4Y2VwdChfX2MuZGF0YSgpKSkKKy0+IGRlY2x0eXBlICAgICAgICAoX19jLmRhdGEoKSkKK3sgcmV0dXJuICAgICAgICAgICAgX19jLmRhdGEoKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnQ+IGNvbnN0ZXhwcgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2F1dG8gZGF0YShjb25zdCBfQ29udCYgX19jKQorX05PRVhDRVBUXyhub2V4Y2VwdChfX2MuZGF0YSgpKSkKKy0+IGRlY2x0eXBlICAgICAgICAoX19jLmRhdGEoKSkgCit7IHJldHVybiAgICAgICAgICAgIF9fYy5kYXRhKCk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9Tej4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdGV4cHIgX1RwKiBkYXRhKF9UcCAoJl9fYXJyYXkpW19Tel0pIG5vZXhjZXB0IHsgcmV0dXJuIF9fYXJyYXk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9FcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdGV4cHIgY29uc3QgX0VwKiBkYXRhKGluaXRpYWxpemVyX2xpc3Q8X0VwPiBfX2lsKSBub2V4Y2VwdCB7IHJldHVybiBfX2lsLmJlZ2luKCk7IH0KKyNlbmRpZgorCisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX0lURVJBVE9SCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvbGltaXRzIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2xpbWl0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTMwNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2xpbWl0cwpAQCAtMCwwICsxLDgxNyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsaW1pdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9MSU1JVFMKKyNkZWZpbmUgX0xJQkNQUF9MSU1JVFMKKworLyoKKyAgICBsaW1pdHMgc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2xhc3MgbnVtZXJpY19saW1pdHMKK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSBmYWxzZTsKKyAgICBzdGF0aWMgY29uc3RleHByIFQgbWluKCkgbm9leGNlcHQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBUIG1heCgpIG5vZXhjZXB0OworICAgIHN0YXRpYyBjb25zdGV4cHIgVCBsb3dlc3QoKSBub2V4Y2VwdDsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50ICBkaWdpdHMgPSAwOworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50ICBkaWdpdHMxMCA9IDA7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgIG1heF9kaWdpdHMxMCA9IDA7CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX3NpZ25lZCA9IGZhbHNlOworICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBpc19pbnRlZ2VyID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX2V4YWN0ID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgIHJhZGl4ID0gMDsKKyAgICBzdGF0aWMgY29uc3RleHByIFQgZXBzaWxvbigpIG5vZXhjZXB0OworICAgIHN0YXRpYyBjb25zdGV4cHIgVCByb3VuZF9lcnJvcigpIG5vZXhjZXB0OworCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgIG1pbl9leHBvbmVudCA9IDA7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgIG1pbl9leHBvbmVudDEwID0gMDsKKyAgICBzdGF0aWMgY29uc3RleHByIGludCAgbWF4X2V4cG9uZW50ID0gMDsKKyAgICBzdGF0aWMgY29uc3RleHByIGludCAgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSA9IGRlbm9ybV9hYnNlbnQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworICAgIHN0YXRpYyBjb25zdGV4cHIgVCBpbmZpbml0eSgpIG5vZXhjZXB0OworICAgIHN0YXRpYyBjb25zdGV4cHIgVCBxdWlldF9OYU4oKSBub2V4Y2VwdDsKKyAgICBzdGF0aWMgY29uc3RleHByIFQgc2lnbmFsaW5nX05hTigpIG5vZXhjZXB0OworICAgIHN0YXRpYyBjb25zdGV4cHIgVCBkZW5vcm1fbWluKCkgbm9leGNlcHQ7CisKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX2JvdW5kZWQgPSBmYWxzZTsKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CisKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgdHJhcHMgPSBmYWxzZTsKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSA9IHJvdW5kX3Rvd2FyZF96ZXJvOworfTsKKworZW51bSBmbG9hdF9yb3VuZF9zdHlsZQoreworICAgIHJvdW5kX2luZGV0ZXJtaW5hdGUgICAgICAgPSAtMSwKKyAgICByb3VuZF90b3dhcmRfemVybyAgICAgICAgID0gIDAsCisgICAgcm91bmRfdG9fbmVhcmVzdCAgICAgICAgICA9ICAxLAorICAgIHJvdW5kX3Rvd2FyZF9pbmZpbml0eSAgICAgPSAgMiwKKyAgICByb3VuZF90b3dhcmRfbmVnX2luZmluaXR5ID0gIDMKK307CisKK2VudW0gZmxvYXRfZGVub3JtX3N0eWxlCit7CisgICAgZGVub3JtX2luZGV0ZXJtaW5hdGUgPSAtMSwKKyAgICBkZW5vcm1fYWJzZW50ID0gMCwKKyAgICBkZW5vcm1fcHJlc2VudCA9IDEKK307CisKK3RlbXBsYXRlPD4gY2xhc3MgbnVtZXJpY19saW1pdHM8Y3YgYm9vbD47CisKK3RlbXBsYXRlPD4gY2xhc3MgbnVtZXJpY19saW1pdHM8Y3YgY2hhcj47Cit0ZW1wbGF0ZTw+IGNsYXNzIG51bWVyaWNfbGltaXRzPGN2IHNpZ25lZCBjaGFyPjsKK3RlbXBsYXRlPD4gY2xhc3MgbnVtZXJpY19saW1pdHM8Y3YgdW5zaWduZWQgY2hhcj47Cit0ZW1wbGF0ZTw+IGNsYXNzIG51bWVyaWNfbGltaXRzPGN2IHdjaGFyX3Q+OwordGVtcGxhdGU8PiBjbGFzcyBudW1lcmljX2xpbWl0czxjdiBjaGFyMTZfdD47Cit0ZW1wbGF0ZTw+IGNsYXNzIG51bWVyaWNfbGltaXRzPGN2IGNoYXIzMl90PjsKKwordGVtcGxhdGU8PiBjbGFzcyBudW1lcmljX2xpbWl0czxjdiBzaG9ydD47Cit0ZW1wbGF0ZTw+IGNsYXNzIG51bWVyaWNfbGltaXRzPGN2IGludD47Cit0ZW1wbGF0ZTw+IGNsYXNzIG51bWVyaWNfbGltaXRzPGN2IGxvbmc+OwordGVtcGxhdGU8PiBjbGFzcyBudW1lcmljX2xpbWl0czxjdiBsb25nIGxvbmc+OwordGVtcGxhdGU8PiBjbGFzcyBudW1lcmljX2xpbWl0czxjdiB1bnNpZ25lZCBzaG9ydD47Cit0ZW1wbGF0ZTw+IGNsYXNzIG51bWVyaWNfbGltaXRzPGN2IHVuc2lnbmVkIGludD47Cit0ZW1wbGF0ZTw+IGNsYXNzIG51bWVyaWNfbGltaXRzPGN2IHVuc2lnbmVkIGxvbmc+OwordGVtcGxhdGU8PiBjbGFzcyBudW1lcmljX2xpbWl0czxjdiB1bnNpZ25lZCBsb25nIGxvbmc+OworCit0ZW1wbGF0ZTw+IGNsYXNzIG51bWVyaWNfbGltaXRzPGN2IGZsb2F0PjsKK3RlbXBsYXRlPD4gY2xhc3MgbnVtZXJpY19saW1pdHM8Y3YgZG91YmxlPjsKK3RlbXBsYXRlPD4gY2xhc3MgbnVtZXJpY19saW1pdHM8Y3YgbG9uZyBkb3VibGU+OworCit9ICAvLyBzdGQKKworKi8KKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2lmIGRlZmluZWQoX0xJQkNQUF9DT01QSUxFUl9NU1ZDKQorI2luY2x1ZGUgInN1cHBvcnQvd2luMzIvbGltaXRzX21zdmNfd2luMzIuaCIKKyNlbmRpZiAvLyBfTElCQ1BQX01TVkNSVAorCisjaWYgZGVmaW5lZChfX0lCTUNQUF9fKQorI2luY2x1ZGUgInN1cHBvcnQvaWJtL2xpbWl0cy5oIgorI2VuZGlmIC8vIF9fSUJNQ1BQX18KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfUFVTSF9NQUNST1MKKyNpbmNsdWRlIDxfX3VuZGVmX21hY3Jvcz4KKworCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKworZW51bSBmbG9hdF9yb3VuZF9zdHlsZQoreworICAgIHJvdW5kX2luZGV0ZXJtaW5hdGUgICAgICAgPSAtMSwKKyAgICByb3VuZF90b3dhcmRfemVybyAgICAgICAgID0gIDAsCisgICAgcm91bmRfdG9fbmVhcmVzdCAgICAgICAgICA9ICAxLAorICAgIHJvdW5kX3Rvd2FyZF9pbmZpbml0eSAgICAgPSAgMiwKKyAgICByb3VuZF90b3dhcmRfbmVnX2luZmluaXR5ID0gIDMKK307CisKK2VudW0gZmxvYXRfZGVub3JtX3N0eWxlCit7CisgICAgZGVub3JtX2luZGV0ZXJtaW5hdGUgPSAtMSwKKyAgICBkZW5vcm1fYWJzZW50ID0gMCwKKyAgICBkZW5vcm1fcHJlc2VudCA9IDEKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGJvb2wgPSBpc19hcml0aG1ldGljPF9UcD46OnZhbHVlPgorY2xhc3MgX19saWJjcHBfbnVtZXJpY19saW1pdHMKK3sKK3Byb3RlY3RlZDoKKyAgICB0eXBlZGVmIF9UcCB0eXBlOworCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0ICBib29sIGlzX3NwZWNpYWxpemVkID0gZmFsc2U7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBtaW4oKSBfTk9FWENFUFQge3JldHVybiB0eXBlKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgbWF4KCkgX05PRVhDRVBUIHtyZXR1cm4gdHlwZSgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIGxvd2VzdCgpIF9OT0VYQ0VQVCB7cmV0dXJuIHR5cGUoKTt9CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBkaWdpdHMgPSAwOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIGRpZ2l0czEwID0gMDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtYXhfZGlnaXRzMTAgPSAwOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX3NpZ25lZCA9IGZhbHNlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2ludGVnZXIgPSBmYWxzZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBpc19leGFjdCA9IGZhbHNlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIHJhZGl4ID0gMDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIGVwc2lsb24oKSBfTk9FWENFUFQge3JldHVybiB0eXBlKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgcm91bmRfZXJyb3IoKSBfTk9FWENFUFQge3JldHVybiB0eXBlKCk7fQorCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWluX2V4cG9uZW50ID0gMDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWF4X2V4cG9uZW50ID0gMDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gPSBkZW5vcm1fYWJzZW50OworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgaW5maW5pdHkoKSBfTk9FWENFUFQge3JldHVybiB0eXBlKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgcXVpZXRfTmFOKCkgX05PRVhDRVBUIHtyZXR1cm4gdHlwZSgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIHNpZ25hbGluZ19OYU4oKSBfTk9FWENFUFQge3JldHVybiB0eXBlKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgZGVub3JtX21pbigpIF9OT0VYQ0VQVCB7cmV0dXJuIHR5cGUoKTt9CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBpc19ib3VuZGVkID0gZmFsc2U7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCB0cmFwcyA9IGZhbHNlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSA9IHJvdW5kX3Rvd2FyZF96ZXJvOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgaW50IF9fZGlnaXRzLCBib29sIF9Jc1NpZ25lZD4KK3N0cnVjdCBfX2xpYmNwcF9jb21wdXRlX21pbgoreworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBfVHAgdmFsdWUgPSBfVHAoX1RwKDEpIDw8IF9fZGlnaXRzKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGludCBfX2RpZ2l0cz4KK3N0cnVjdCBfX2xpYmNwcF9jb21wdXRlX21pbjxfVHAsIF9fZGlnaXRzLCBmYWxzZT4KK3sKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgX1RwIHZhbHVlID0gX1RwKDApOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NsYXNzIF9fbGliY3BwX251bWVyaWNfbGltaXRzPF9UcCwgdHJ1ZT4KK3sKK3Byb3RlY3RlZDoKKyAgICB0eXBlZGVmIF9UcCB0eXBlOworCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfc2lnbmVkID0gdHlwZSgtMSkgPCB0eXBlKDApOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIGRpZ2l0cyA9IHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKHR5cGUpICogX19DSEFSX0JJVF9fIC0gaXNfc2lnbmVkKTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBkaWdpdHMxMCA9IGRpZ2l0cyAqIDMgLyAxMDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtYXhfZGlnaXRzMTAgPSAwOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCB0eXBlIF9fbWluID0gX19saWJjcHBfY29tcHV0ZV9taW48dHlwZSwgZGlnaXRzLCBpc19zaWduZWQ+Ojp2YWx1ZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgdHlwZSBfX21heCA9IGlzX3NpZ25lZCA/IHR5cGUodHlwZSh+MCkgXiBfX21pbikgOiB0eXBlKH4wKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIG1pbigpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fbWluO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIG1heCgpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fbWF4O30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIGxvd2VzdCgpIF9OT0VYQ0VQVCB7cmV0dXJuIG1pbigpO30KKworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICByYWRpeCA9IDI7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBlcHNpbG9uKCkgX05PRVhDRVBUIHtyZXR1cm4gdHlwZSgwKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSByb3VuZF9lcnJvcigpIF9OT0VYQ0VQVCB7cmV0dXJuIHR5cGUoMCk7fQorCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWluX2V4cG9uZW50ID0gMDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWF4X2V4cG9uZW50ID0gMDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gPSBkZW5vcm1fYWJzZW50OworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgaW5maW5pdHkoKSBfTk9FWENFUFQge3JldHVybiB0eXBlKDApO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIHF1aWV0X05hTigpIF9OT0VYQ0VQVCB7cmV0dXJuIHR5cGUoMCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgc2lnbmFsaW5nX05hTigpIF9OT0VYQ0VQVCB7cmV0dXJuIHR5cGUoMCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgZGVub3JtX21pbigpIF9OT0VYQ0VQVCB7cmV0dXJuIHR5cGUoMCk7fQorCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfbW9kdWxvID0gIV9WU1REOjppc19zaWduZWQ8X1RwPjo6dmFsdWU7CisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19wbmFjbF9fKSB8fCBcCisgICAgZGVmaW5lZChfX3dhc21fXykKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCB0cmFwcyA9IHRydWU7CisjZWxzZQorICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIHRyYXBzID0gZmFsc2U7CisjZW5kaWYKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgPSByb3VuZF90b3dhcmRfemVybzsKK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBfX2xpYmNwcF9udW1lcmljX2xpbWl0czxib29sLCB0cnVlPgoreworcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgYm9vbCB0eXBlOworCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfc2lnbmVkID0gZmFsc2U7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgZGlnaXRzID0gMTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBkaWdpdHMxMCA9IDA7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWF4X2RpZ2l0czEwID0gMDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgdHlwZSBfX21pbiA9IGZhbHNlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCB0eXBlIF9fbWF4ID0gdHJ1ZTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIG1pbigpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fbWluO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIG1heCgpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fbWF4O30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIGxvd2VzdCgpIF9OT0VYQ0VQVCB7cmV0dXJuIG1pbigpO30KKworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICByYWRpeCA9IDI7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBlcHNpbG9uKCkgX05PRVhDRVBUIHtyZXR1cm4gdHlwZSgwKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSByb3VuZF9lcnJvcigpIF9OT0VYQ0VQVCB7cmV0dXJuIHR5cGUoMCk7fQorCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWluX2V4cG9uZW50ID0gMDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWF4X2V4cG9uZW50ID0gMDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gPSBkZW5vcm1fYWJzZW50OworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgaW5maW5pdHkoKSBfTk9FWENFUFQge3JldHVybiB0eXBlKDApO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIHF1aWV0X05hTigpIF9OT0VYQ0VQVCB7cmV0dXJuIHR5cGUoMCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgc2lnbmFsaW5nX05hTigpIF9OT0VYQ0VQVCB7cmV0dXJuIHR5cGUoMCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgZGVub3JtX21pbigpIF9OT0VYQ0VQVCB7cmV0dXJuIHR5cGUoMCk7fQorCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCB0cmFwcyA9IGZhbHNlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSA9IHJvdW5kX3Rvd2FyZF96ZXJvOworfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIF9fbGliY3BwX251bWVyaWNfbGltaXRzPGZsb2F0LCB0cnVlPgoreworcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgZmxvYXQgdHlwZTsKKworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX3NpZ25lZCA9IHRydWU7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgZGlnaXRzID0gX19GTFRfTUFOVF9ESUdfXzsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBkaWdpdHMxMCA9IF9fRkxUX0RJR19fOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIG1heF9kaWdpdHMxMCA9IDIrKGRpZ2l0cyAqIDMwMTAzbCkvMTAwMDAwbDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIG1pbigpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fRkxUX01JTl9fO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIG1heCgpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fRkxUX01BWF9fO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIGxvd2VzdCgpIF9OT0VYQ0VQVCB7cmV0dXJuIC1tYXgoKTt9CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBpc19pbnRlZ2VyID0gZmFsc2U7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfZXhhY3QgPSBmYWxzZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICByYWRpeCA9IF9fRkxUX1JBRElYX187CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBlcHNpbG9uKCkgX05PRVhDRVBUIHtyZXR1cm4gX19GTFRfRVBTSUxPTl9fO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIHJvdW5kX2Vycm9yKCkgX05PRVhDRVBUIHtyZXR1cm4gMC41Rjt9CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtaW5fZXhwb25lbnQgPSBfX0ZMVF9NSU5fRVhQX187CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWluX2V4cG9uZW50MTAgPSBfX0ZMVF9NSU5fMTBfRVhQX187CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWF4X2V4cG9uZW50ID0gX19GTFRfTUFYX0VYUF9fOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIG1heF9leHBvbmVudDEwID0gX19GTFRfTUFYXzEwX0VYUF9fOworCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaGFzX2luZmluaXR5ID0gdHJ1ZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBoYXNfcXVpZXRfTmFOID0gdHJ1ZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IHRydWU7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtID0gZGVub3JtX3ByZXNlbnQ7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBpbmZpbml0eSgpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fYnVpbHRpbl9odWdlX3ZhbGYoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBxdWlldF9OYU4oKSBfTk9FWENFUFQge3JldHVybiBfX2J1aWx0aW5fbmFuZigiIik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgc2lnbmFsaW5nX05hTigpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fYnVpbHRpbl9uYW5zZigiIik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgZGVub3JtX21pbigpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fRkxUX0RFTk9STV9NSU5fXzt9CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBpc19pZWM1NTkgPSB0cnVlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX21vZHVsbyA9IGZhbHNlOworCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgdHJhcHMgPSBmYWxzZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgPSByb3VuZF90b19uZWFyZXN0OworfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIF9fbGliY3BwX251bWVyaWNfbGltaXRzPGRvdWJsZSwgdHJ1ZT4KK3sKK3Byb3RlY3RlZDoKKyAgICB0eXBlZGVmIGRvdWJsZSB0eXBlOworCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfc2lnbmVkID0gdHJ1ZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBkaWdpdHMgPSBfX0RCTF9NQU5UX0RJR19fOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIGRpZ2l0czEwID0gX19EQkxfRElHX187CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWF4X2RpZ2l0czEwID0gMisoZGlnaXRzICogMzAxMDNsKS8xMDAwMDBsOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgbWluKCkgX05PRVhDRVBUIHtyZXR1cm4gX19EQkxfTUlOX187fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgbWF4KCkgX05PRVhDRVBUIHtyZXR1cm4gX19EQkxfTUFYX187fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgbG93ZXN0KCkgX05PRVhDRVBUIHtyZXR1cm4gLW1heCgpO30KKworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2ludGVnZXIgPSBmYWxzZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBpc19leGFjdCA9IGZhbHNlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIHJhZGl4ID0gX19GTFRfUkFESVhfXzsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIGVwc2lsb24oKSBfTk9FWENFUFQge3JldHVybiBfX0RCTF9FUFNJTE9OX187fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgcm91bmRfZXJyb3IoKSBfTk9FWENFUFQge3JldHVybiAwLjU7fQorCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWluX2V4cG9uZW50ID0gX19EQkxfTUlOX0VYUF9fOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIG1pbl9leHBvbmVudDEwID0gX19EQkxfTUlOXzEwX0VYUF9fOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIG1heF9leHBvbmVudCA9IF9fREJMX01BWF9FWFBfXzsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtYXhfZXhwb25lbnQxMCA9IF9fREJMX01BWF8xMF9FWFBfXzsKKworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGhhc19pbmZpbml0eSA9IHRydWU7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaGFzX3F1aWV0X05hTiA9IHRydWU7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSB0cnVlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSA9IGRlbm9ybV9wcmVzZW50OworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgaW5maW5pdHkoKSBfTk9FWENFUFQge3JldHVybiBfX2J1aWx0aW5faHVnZV92YWwoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBxdWlldF9OYU4oKSBfTk9FWENFUFQge3JldHVybiBfX2J1aWx0aW5fbmFuKCIiKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBzaWduYWxpbmdfTmFOKCkgX05PRVhDRVBUIHtyZXR1cm4gX19idWlsdGluX25hbnMoIiIpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIGRlbm9ybV9taW4oKSBfTk9FWENFUFQge3JldHVybiBfX0RCTF9ERU5PUk1fTUlOX187fQorCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfaWVjNTU5ID0gdHJ1ZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBpc19tb2R1bG8gPSBmYWxzZTsKKworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIHRyYXBzID0gZmFsc2U7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlID0gcm91bmRfdG9fbmVhcmVzdDsKK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBfX2xpYmNwcF9udW1lcmljX2xpbWl0czxsb25nIGRvdWJsZSwgdHJ1ZT4KK3sKK3Byb3RlY3RlZDoKKyAgICB0eXBlZGVmIGxvbmcgZG91YmxlIHR5cGU7CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBpc19zaWduZWQgPSB0cnVlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIGRpZ2l0cyA9IF9fTERCTF9NQU5UX0RJR19fOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIGRpZ2l0czEwID0gX19MREJMX0RJR19fOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIG1heF9kaWdpdHMxMCA9IDIrKGRpZ2l0cyAqIDMwMTAzbCkvMTAwMDAwbDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIG1pbigpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fTERCTF9NSU5fXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBtYXgoKSBfTk9FWENFUFQge3JldHVybiBfX0xEQkxfTUFYX187fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgbG93ZXN0KCkgX05PRVhDRVBUIHtyZXR1cm4gLW1heCgpO30KKworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2ludGVnZXIgPSBmYWxzZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBpc19leGFjdCA9IGZhbHNlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIHJhZGl4ID0gX19GTFRfUkFESVhfXzsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIGVwc2lsb24oKSBfTk9FWENFUFQge3JldHVybiBfX0xEQkxfRVBTSUxPTl9fO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIHJvdW5kX2Vycm9yKCkgX05PRVhDRVBUIHtyZXR1cm4gMC41O30KKworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIG1pbl9leHBvbmVudCA9IF9fTERCTF9NSU5fRVhQX187CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWluX2V4cG9uZW50MTAgPSBfX0xEQkxfTUlOXzEwX0VYUF9fOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIG1heF9leHBvbmVudCA9IF9fTERCTF9NQVhfRVhQX187CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWF4X2V4cG9uZW50MTAgPSBfX0xEQkxfTUFYXzEwX0VYUF9fOworCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaGFzX2luZmluaXR5ID0gdHJ1ZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBoYXNfcXVpZXRfTmFOID0gdHJ1ZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IHRydWU7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtID0gZGVub3JtX3ByZXNlbnQ7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBpbmZpbml0eSgpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fYnVpbHRpbl9odWdlX3ZhbGwoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBxdWlldF9OYU4oKSBfTk9FWENFUFQge3JldHVybiBfX2J1aWx0aW5fbmFubCgiIik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgc2lnbmFsaW5nX05hTigpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fYnVpbHRpbl9uYW5zbCgiIik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgZGVub3JtX21pbigpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fTERCTF9ERU5PUk1fTUlOX187fQorCisjaWYgKGRlZmluZWQoX19wcGNfXykgfHwgZGVmaW5lZChfX3BwYzY0X18pKQorICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2llYzU1OSA9IGZhbHNlOworI2Vsc2UKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBpc19pZWM1NTkgPSB0cnVlOworI2VuZGlmCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCB0cmFwcyA9IGZhbHNlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSA9IHJvdW5kX3RvX25lYXJlc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgbnVtZXJpY19saW1pdHMKKyAgICA6IHByaXZhdGUgX19saWJjcHBfbnVtZXJpY19saW1pdHM8dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Cit7CisgICAgdHlwZWRlZiBfX2xpYmNwcF9udW1lcmljX2xpbWl0czx0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZT4gX19iYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19iYXNlOjp0eXBlIHR5cGU7CitwdWJsaWM6CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSBfX2Jhc2U6OmlzX3NwZWNpYWxpemVkOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgbWluKCkgX05PRVhDRVBUIHtyZXR1cm4gX19iYXNlOjptaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBtYXgoKSBfTk9FWENFUFQge3JldHVybiBfX2Jhc2U6Om1heCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIGxvd2VzdCgpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fYmFzZTo6bG93ZXN0KCk7fQorCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgZGlnaXRzID0gX19iYXNlOjpkaWdpdHM7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgZGlnaXRzMTAgPSBfX2Jhc2U6OmRpZ2l0czEwOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIG1heF9kaWdpdHMxMCA9IF9fYmFzZTo6bWF4X2RpZ2l0czEwOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX3NpZ25lZCA9IF9fYmFzZTo6aXNfc2lnbmVkOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2ludGVnZXIgPSBfX2Jhc2U6OmlzX2ludGVnZXI7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfZXhhY3QgPSBfX2Jhc2U6OmlzX2V4YWN0OworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIHJhZGl4ID0gX19iYXNlOjpyYWRpeDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIGVwc2lsb24oKSBfTk9FWENFUFQge3JldHVybiBfX2Jhc2U6OmVwc2lsb24oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSByb3VuZF9lcnJvcigpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fYmFzZTo6cm91bmRfZXJyb3IoKTt9CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtaW5fZXhwb25lbnQgPSBfX2Jhc2U6Om1pbl9leHBvbmVudDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtaW5fZXhwb25lbnQxMCA9IF9fYmFzZTo6bWluX2V4cG9uZW50MTA7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWF4X2V4cG9uZW50ID0gX19iYXNlOjptYXhfZXhwb25lbnQ7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWF4X2V4cG9uZW50MTAgPSBfX2Jhc2U6Om1heF9leHBvbmVudDEwOworCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaGFzX2luZmluaXR5ID0gX19iYXNlOjpoYXNfaW5maW5pdHk7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaGFzX3F1aWV0X05hTiA9IF9fYmFzZTo6aGFzX3F1aWV0X05hTjsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IF9fYmFzZTo6aGFzX3NpZ25hbGluZ19OYU47CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtID0gX19iYXNlOjpoYXNfZGVub3JtOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGhhc19kZW5vcm1fbG9zcyA9IF9fYmFzZTo6aGFzX2Rlbm9ybV9sb3NzOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgaW5maW5pdHkoKSBfTk9FWENFUFQge3JldHVybiBfX2Jhc2U6OmluZmluaXR5KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgcXVpZXRfTmFOKCkgX05PRVhDRVBUIHtyZXR1cm4gX19iYXNlOjpxdWlldF9OYU4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBzaWduYWxpbmdfTmFOKCkgX05PRVhDRVBUIHtyZXR1cm4gX19iYXNlOjpzaWduYWxpbmdfTmFOKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgZGVub3JtX21pbigpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fYmFzZTo6ZGVub3JtX21pbigpO30KKworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2llYzU1OSA9IF9fYmFzZTo6aXNfaWVjNTU5OworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2JvdW5kZWQgPSBfX2Jhc2U6OmlzX2JvdW5kZWQ7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfbW9kdWxvID0gX19iYXNlOjppc19tb2R1bG87CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCB0cmFwcyA9IF9fYmFzZTo6dHJhcHM7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgdGlueW5lc3NfYmVmb3JlID0gX19iYXNlOjp0aW55bmVzc19iZWZvcmU7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlID0gX19iYXNlOjpyb3VuZF9zdHlsZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxfVHA+Ojppc19zcGVjaWFsaXplZDsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPF9UcD46OmRpZ2l0czsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPF9UcD46OmRpZ2l0czEwOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgbnVtZXJpY19saW1pdHM8X1RwPjo6bWF4X2RpZ2l0czEwOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPF9UcD46OmlzX3NpZ25lZDsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxfVHA+Ojppc19pbnRlZ2VyOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPF9UcD46OmlzX2V4YWN0OwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgbnVtZXJpY19saW1pdHM8X1RwPjo6cmFkaXg7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCBudW1lcmljX2xpbWl0czxfVHA+OjptaW5fZXhwb25lbnQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCBudW1lcmljX2xpbWl0czxfVHA+OjptaW5fZXhwb25lbnQxMDsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPF9UcD46Om1heF9leHBvbmVudDsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPF9UcD46Om1heF9leHBvbmVudDEwOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPF9UcD46Omhhc19pbmZpbml0eTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxfVHA+OjpoYXNfcXVpZXRfTmFOOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPF9UcD46Omhhc19zaWduYWxpbmdfTmFOOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBmbG9hdF9kZW5vcm1fc3R5bGUgbnVtZXJpY19saW1pdHM8X1RwPjo6aGFzX2Rlbm9ybTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxfVHA+OjpoYXNfZGVub3JtX2xvc3M7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgbnVtZXJpY19saW1pdHM8X1RwPjo6aXNfaWVjNTU5OwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPF9UcD46OmlzX2JvdW5kZWQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgbnVtZXJpY19saW1pdHM8X1RwPjo6aXNfbW9kdWxvOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPF9UcD46OnRyYXBzOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPF9UcD46OnRpbnluZXNzX2JlZm9yZTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgZmxvYXRfcm91bmRfc3R5bGUgbnVtZXJpY19saW1pdHM8X1RwPjo6cm91bmRfc3R5bGU7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBudW1lcmljX2xpbWl0czxjb25zdCBfVHA+CisgICAgOiBwcml2YXRlIG51bWVyaWNfbGltaXRzPF9UcD4KK3sKKyAgICB0eXBlZGVmIG51bWVyaWNfbGltaXRzPF9UcD4gX19iYXNlOworICAgIHR5cGVkZWYgX1RwIHR5cGU7CitwdWJsaWM6CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSBfX2Jhc2U6OmlzX3NwZWNpYWxpemVkOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgbWluKCkgX05PRVhDRVBUIHtyZXR1cm4gX19iYXNlOjptaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBtYXgoKSBfTk9FWENFUFQge3JldHVybiBfX2Jhc2U6Om1heCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIGxvd2VzdCgpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fYmFzZTo6bG93ZXN0KCk7fQorCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgZGlnaXRzID0gX19iYXNlOjpkaWdpdHM7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgZGlnaXRzMTAgPSBfX2Jhc2U6OmRpZ2l0czEwOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIG1heF9kaWdpdHMxMCA9IF9fYmFzZTo6bWF4X2RpZ2l0czEwOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX3NpZ25lZCA9IF9fYmFzZTo6aXNfc2lnbmVkOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2ludGVnZXIgPSBfX2Jhc2U6OmlzX2ludGVnZXI7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfZXhhY3QgPSBfX2Jhc2U6OmlzX2V4YWN0OworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIHJhZGl4ID0gX19iYXNlOjpyYWRpeDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIGVwc2lsb24oKSBfTk9FWENFUFQge3JldHVybiBfX2Jhc2U6OmVwc2lsb24oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSByb3VuZF9lcnJvcigpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fYmFzZTo6cm91bmRfZXJyb3IoKTt9CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtaW5fZXhwb25lbnQgPSBfX2Jhc2U6Om1pbl9leHBvbmVudDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtaW5fZXhwb25lbnQxMCA9IF9fYmFzZTo6bWluX2V4cG9uZW50MTA7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWF4X2V4cG9uZW50ID0gX19iYXNlOjptYXhfZXhwb25lbnQ7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWF4X2V4cG9uZW50MTAgPSBfX2Jhc2U6Om1heF9leHBvbmVudDEwOworCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaGFzX2luZmluaXR5ID0gX19iYXNlOjpoYXNfaW5maW5pdHk7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaGFzX3F1aWV0X05hTiA9IF9fYmFzZTo6aGFzX3F1aWV0X05hTjsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IF9fYmFzZTo6aGFzX3NpZ25hbGluZ19OYU47CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtID0gX19iYXNlOjpoYXNfZGVub3JtOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGhhc19kZW5vcm1fbG9zcyA9IF9fYmFzZTo6aGFzX2Rlbm9ybV9sb3NzOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgaW5maW5pdHkoKSBfTk9FWENFUFQge3JldHVybiBfX2Jhc2U6OmluZmluaXR5KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgcXVpZXRfTmFOKCkgX05PRVhDRVBUIHtyZXR1cm4gX19iYXNlOjpxdWlldF9OYU4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBzaWduYWxpbmdfTmFOKCkgX05PRVhDRVBUIHtyZXR1cm4gX19iYXNlOjpzaWduYWxpbmdfTmFOKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgZGVub3JtX21pbigpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fYmFzZTo6ZGVub3JtX21pbigpO30KKworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2llYzU1OSA9IF9fYmFzZTo6aXNfaWVjNTU5OworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2JvdW5kZWQgPSBfX2Jhc2U6OmlzX2JvdW5kZWQ7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfbW9kdWxvID0gX19iYXNlOjppc19tb2R1bG87CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCB0cmFwcyA9IF9fYmFzZTo6dHJhcHM7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgdGlueW5lc3NfYmVmb3JlID0gX19iYXNlOjp0aW55bmVzc19iZWZvcmU7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlID0gX19iYXNlOjpyb3VuZF9zdHlsZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxjb25zdCBfVHA+Ojppc19zcGVjaWFsaXplZDsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPGNvbnN0IF9UcD46OmRpZ2l0czsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPGNvbnN0IF9UcD46OmRpZ2l0czEwOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgbnVtZXJpY19saW1pdHM8Y29uc3QgX1RwPjo6bWF4X2RpZ2l0czEwOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPGNvbnN0IF9UcD46OmlzX3NpZ25lZDsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxjb25zdCBfVHA+Ojppc19pbnRlZ2VyOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPGNvbnN0IF9UcD46OmlzX2V4YWN0OwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgbnVtZXJpY19saW1pdHM8Y29uc3QgX1RwPjo6cmFkaXg7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCBudW1lcmljX2xpbWl0czxjb25zdCBfVHA+OjptaW5fZXhwb25lbnQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCBudW1lcmljX2xpbWl0czxjb25zdCBfVHA+OjptaW5fZXhwb25lbnQxMDsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPGNvbnN0IF9UcD46Om1heF9leHBvbmVudDsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPGNvbnN0IF9UcD46Om1heF9leHBvbmVudDEwOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPGNvbnN0IF9UcD46Omhhc19pbmZpbml0eTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxjb25zdCBfVHA+OjpoYXNfcXVpZXRfTmFOOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPGNvbnN0IF9UcD46Omhhc19zaWduYWxpbmdfTmFOOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBmbG9hdF9kZW5vcm1fc3R5bGUgbnVtZXJpY19saW1pdHM8Y29uc3QgX1RwPjo6aGFzX2Rlbm9ybTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxjb25zdCBfVHA+OjpoYXNfZGVub3JtX2xvc3M7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgbnVtZXJpY19saW1pdHM8Y29uc3QgX1RwPjo6aXNfaWVjNTU5OwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPGNvbnN0IF9UcD46OmlzX2JvdW5kZWQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgbnVtZXJpY19saW1pdHM8Y29uc3QgX1RwPjo6aXNfbW9kdWxvOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPGNvbnN0IF9UcD46OnRyYXBzOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPGNvbnN0IF9UcD46OnRpbnluZXNzX2JlZm9yZTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgZmxvYXRfcm91bmRfc3R5bGUgbnVtZXJpY19saW1pdHM8Y29uc3QgX1RwPjo6cm91bmRfc3R5bGU7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBudW1lcmljX2xpbWl0czx2b2xhdGlsZSBfVHA+CisgICAgOiBwcml2YXRlIG51bWVyaWNfbGltaXRzPF9UcD4KK3sKKyAgICB0eXBlZGVmIG51bWVyaWNfbGltaXRzPF9UcD4gX19iYXNlOworICAgIHR5cGVkZWYgX1RwIHR5cGU7CitwdWJsaWM6CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSBfX2Jhc2U6OmlzX3NwZWNpYWxpemVkOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgbWluKCkgX05PRVhDRVBUIHtyZXR1cm4gX19iYXNlOjptaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBtYXgoKSBfTk9FWENFUFQge3JldHVybiBfX2Jhc2U6Om1heCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIGxvd2VzdCgpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fYmFzZTo6bG93ZXN0KCk7fQorCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgZGlnaXRzID0gX19iYXNlOjpkaWdpdHM7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgZGlnaXRzMTAgPSBfX2Jhc2U6OmRpZ2l0czEwOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIG1heF9kaWdpdHMxMCA9IF9fYmFzZTo6bWF4X2RpZ2l0czEwOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX3NpZ25lZCA9IF9fYmFzZTo6aXNfc2lnbmVkOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2ludGVnZXIgPSBfX2Jhc2U6OmlzX2ludGVnZXI7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfZXhhY3QgPSBfX2Jhc2U6OmlzX2V4YWN0OworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIHJhZGl4ID0gX19iYXNlOjpyYWRpeDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIGVwc2lsb24oKSBfTk9FWENFUFQge3JldHVybiBfX2Jhc2U6OmVwc2lsb24oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSByb3VuZF9lcnJvcigpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fYmFzZTo6cm91bmRfZXJyb3IoKTt9CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtaW5fZXhwb25lbnQgPSBfX2Jhc2U6Om1pbl9leHBvbmVudDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtaW5fZXhwb25lbnQxMCA9IF9fYmFzZTo6bWluX2V4cG9uZW50MTA7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWF4X2V4cG9uZW50ID0gX19iYXNlOjptYXhfZXhwb25lbnQ7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWF4X2V4cG9uZW50MTAgPSBfX2Jhc2U6Om1heF9leHBvbmVudDEwOworCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaGFzX2luZmluaXR5ID0gX19iYXNlOjpoYXNfaW5maW5pdHk7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaGFzX3F1aWV0X05hTiA9IF9fYmFzZTo6aGFzX3F1aWV0X05hTjsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IF9fYmFzZTo6aGFzX3NpZ25hbGluZ19OYU47CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtID0gX19iYXNlOjpoYXNfZGVub3JtOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGhhc19kZW5vcm1fbG9zcyA9IF9fYmFzZTo6aGFzX2Rlbm9ybV9sb3NzOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgaW5maW5pdHkoKSBfTk9FWENFUFQge3JldHVybiBfX2Jhc2U6OmluZmluaXR5KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgcXVpZXRfTmFOKCkgX05PRVhDRVBUIHtyZXR1cm4gX19iYXNlOjpxdWlldF9OYU4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBzaWduYWxpbmdfTmFOKCkgX05PRVhDRVBUIHtyZXR1cm4gX19iYXNlOjpzaWduYWxpbmdfTmFOKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgZGVub3JtX21pbigpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fYmFzZTo6ZGVub3JtX21pbigpO30KKworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2llYzU1OSA9IF9fYmFzZTo6aXNfaWVjNTU5OworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2JvdW5kZWQgPSBfX2Jhc2U6OmlzX2JvdW5kZWQ7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfbW9kdWxvID0gX19iYXNlOjppc19tb2R1bG87CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCB0cmFwcyA9IF9fYmFzZTo6dHJhcHM7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgdGlueW5lc3NfYmVmb3JlID0gX19iYXNlOjp0aW55bmVzc19iZWZvcmU7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlID0gX19iYXNlOjpyb3VuZF9zdHlsZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czx2b2xhdGlsZSBfVHA+Ojppc19zcGVjaWFsaXplZDsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPHZvbGF0aWxlIF9UcD46OmRpZ2l0czsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPHZvbGF0aWxlIF9UcD46OmRpZ2l0czEwOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgbnVtZXJpY19saW1pdHM8dm9sYXRpbGUgX1RwPjo6bWF4X2RpZ2l0czEwOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPHZvbGF0aWxlIF9UcD46OmlzX3NpZ25lZDsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czx2b2xhdGlsZSBfVHA+Ojppc19pbnRlZ2VyOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPHZvbGF0aWxlIF9UcD46OmlzX2V4YWN0OwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgbnVtZXJpY19saW1pdHM8dm9sYXRpbGUgX1RwPjo6cmFkaXg7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCBudW1lcmljX2xpbWl0czx2b2xhdGlsZSBfVHA+OjptaW5fZXhwb25lbnQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCBudW1lcmljX2xpbWl0czx2b2xhdGlsZSBfVHA+OjptaW5fZXhwb25lbnQxMDsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPHZvbGF0aWxlIF9UcD46Om1heF9leHBvbmVudDsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPHZvbGF0aWxlIF9UcD46Om1heF9leHBvbmVudDEwOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPHZvbGF0aWxlIF9UcD46Omhhc19pbmZpbml0eTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czx2b2xhdGlsZSBfVHA+OjpoYXNfcXVpZXRfTmFOOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPHZvbGF0aWxlIF9UcD46Omhhc19zaWduYWxpbmdfTmFOOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBmbG9hdF9kZW5vcm1fc3R5bGUgbnVtZXJpY19saW1pdHM8dm9sYXRpbGUgX1RwPjo6aGFzX2Rlbm9ybTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czx2b2xhdGlsZSBfVHA+OjpoYXNfZGVub3JtX2xvc3M7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgbnVtZXJpY19saW1pdHM8dm9sYXRpbGUgX1RwPjo6aXNfaWVjNTU5OwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPHZvbGF0aWxlIF9UcD46OmlzX2JvdW5kZWQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgbnVtZXJpY19saW1pdHM8dm9sYXRpbGUgX1RwPjo6aXNfbW9kdWxvOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPHZvbGF0aWxlIF9UcD46OnRyYXBzOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPHZvbGF0aWxlIF9UcD46OnRpbnluZXNzX2JlZm9yZTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgZmxvYXRfcm91bmRfc3R5bGUgbnVtZXJpY19saW1pdHM8dm9sYXRpbGUgX1RwPjo6cm91bmRfc3R5bGU7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBudW1lcmljX2xpbWl0czxjb25zdCB2b2xhdGlsZSBfVHA+CisgICAgOiBwcml2YXRlIG51bWVyaWNfbGltaXRzPF9UcD4KK3sKKyAgICB0eXBlZGVmIG51bWVyaWNfbGltaXRzPF9UcD4gX19iYXNlOworICAgIHR5cGVkZWYgX1RwIHR5cGU7CitwdWJsaWM6CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSBfX2Jhc2U6OmlzX3NwZWNpYWxpemVkOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgbWluKCkgX05PRVhDRVBUIHtyZXR1cm4gX19iYXNlOjptaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBtYXgoKSBfTk9FWENFUFQge3JldHVybiBfX2Jhc2U6Om1heCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIGxvd2VzdCgpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fYmFzZTo6bG93ZXN0KCk7fQorCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgZGlnaXRzID0gX19iYXNlOjpkaWdpdHM7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgZGlnaXRzMTAgPSBfX2Jhc2U6OmRpZ2l0czEwOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIG1heF9kaWdpdHMxMCA9IF9fYmFzZTo6bWF4X2RpZ2l0czEwOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX3NpZ25lZCA9IF9fYmFzZTo6aXNfc2lnbmVkOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2ludGVnZXIgPSBfX2Jhc2U6OmlzX2ludGVnZXI7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfZXhhY3QgPSBfX2Jhc2U6OmlzX2V4YWN0OworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgIHJhZGl4ID0gX19iYXNlOjpyYWRpeDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiB0eXBlIGVwc2lsb24oKSBfTk9FWENFUFQge3JldHVybiBfX2Jhc2U6OmVwc2lsb24oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSByb3VuZF9lcnJvcigpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fYmFzZTo6cm91bmRfZXJyb3IoKTt9CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtaW5fZXhwb25lbnQgPSBfX2Jhc2U6Om1pbl9leHBvbmVudDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50ICBtaW5fZXhwb25lbnQxMCA9IF9fYmFzZTo6bWluX2V4cG9uZW50MTA7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWF4X2V4cG9uZW50ID0gX19iYXNlOjptYXhfZXhwb25lbnQ7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCAgbWF4X2V4cG9uZW50MTAgPSBfX2Jhc2U6Om1heF9leHBvbmVudDEwOworCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaGFzX2luZmluaXR5ID0gX19iYXNlOjpoYXNfaW5maW5pdHk7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaGFzX3F1aWV0X05hTiA9IF9fYmFzZTo6aGFzX3F1aWV0X05hTjsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IF9fYmFzZTo6aGFzX3NpZ25hbGluZ19OYU47CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtID0gX19iYXNlOjpoYXNfZGVub3JtOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGhhc19kZW5vcm1fbG9zcyA9IF9fYmFzZTo6aGFzX2Rlbm9ybV9sb3NzOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgaW5maW5pdHkoKSBfTk9FWENFUFQge3JldHVybiBfX2Jhc2U6OmluZmluaXR5KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgcXVpZXRfTmFOKCkgX05PRVhDRVBUIHtyZXR1cm4gX19iYXNlOjpxdWlldF9OYU4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgdHlwZSBzaWduYWxpbmdfTmFOKCkgX05PRVhDRVBUIHtyZXR1cm4gX19iYXNlOjpzaWduYWxpbmdfTmFOKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHR5cGUgZGVub3JtX21pbigpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fYmFzZTo6ZGVub3JtX21pbigpO30KKworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2llYzU1OSA9IF9fYmFzZTo6aXNfaWVjNTU5OworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIGlzX2JvdW5kZWQgPSBfX2Jhc2U6OmlzX2JvdW5kZWQ7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgaXNfbW9kdWxvID0gX19iYXNlOjppc19tb2R1bG87CisKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCB0cmFwcyA9IF9fYmFzZTo6dHJhcHM7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgdGlueW5lc3NfYmVmb3JlID0gX19iYXNlOjp0aW55bmVzc19iZWZvcmU7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlID0gX19iYXNlOjpyb3VuZF9zdHlsZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxjb25zdCB2b2xhdGlsZSBfVHA+Ojppc19zcGVjaWFsaXplZDsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPGNvbnN0IHZvbGF0aWxlIF9UcD46OmRpZ2l0czsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPGNvbnN0IHZvbGF0aWxlIF9UcD46OmRpZ2l0czEwOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgbnVtZXJpY19saW1pdHM8Y29uc3Qgdm9sYXRpbGUgX1RwPjo6bWF4X2RpZ2l0czEwOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPGNvbnN0IHZvbGF0aWxlIF9UcD46OmlzX3NpZ25lZDsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxjb25zdCB2b2xhdGlsZSBfVHA+Ojppc19pbnRlZ2VyOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPGNvbnN0IHZvbGF0aWxlIF9UcD46OmlzX2V4YWN0OwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnQgbnVtZXJpY19saW1pdHM8Y29uc3Qgdm9sYXRpbGUgX1RwPjo6cmFkaXg7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCBudW1lcmljX2xpbWl0czxjb25zdCB2b2xhdGlsZSBfVHA+OjptaW5fZXhwb25lbnQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludCBudW1lcmljX2xpbWl0czxjb25zdCB2b2xhdGlsZSBfVHA+OjptaW5fZXhwb25lbnQxMDsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPGNvbnN0IHZvbGF0aWxlIF9UcD46Om1heF9leHBvbmVudDsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50IG51bWVyaWNfbGltaXRzPGNvbnN0IHZvbGF0aWxlIF9UcD46Om1heF9leHBvbmVudDEwOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPGNvbnN0IHZvbGF0aWxlIF9UcD46Omhhc19pbmZpbml0eTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxjb25zdCB2b2xhdGlsZSBfVHA+OjpoYXNfcXVpZXRfTmFOOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPGNvbnN0IHZvbGF0aWxlIF9UcD46Omhhc19zaWduYWxpbmdfTmFOOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBmbG9hdF9kZW5vcm1fc3R5bGUgbnVtZXJpY19saW1pdHM8Y29uc3Qgdm9sYXRpbGUgX1RwPjo6aGFzX2Rlbm9ybTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxjb25zdCB2b2xhdGlsZSBfVHA+OjpoYXNfZGVub3JtX2xvc3M7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgbnVtZXJpY19saW1pdHM8Y29uc3Qgdm9sYXRpbGUgX1RwPjo6aXNfaWVjNTU5OwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPGNvbnN0IHZvbGF0aWxlIF9UcD46OmlzX2JvdW5kZWQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGJvb2wgbnVtZXJpY19saW1pdHM8Y29uc3Qgdm9sYXRpbGUgX1RwPjo6aXNfbW9kdWxvOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPGNvbnN0IHZvbGF0aWxlIF9UcD46OnRyYXBzOwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPGNvbnN0IHZvbGF0aWxlIF9UcD46OnRpbnluZXNzX2JlZm9yZTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgZmxvYXRfcm91bmRfc3R5bGUgbnVtZXJpY19saW1pdHM8Y29uc3Qgdm9sYXRpbGUgX1RwPjo6cm91bmRfc3R5bGU7CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworX0xJQkNQUF9QT1BfTUFDUk9TCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9MSU1JVFMKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9saW1pdHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9saW1pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODY3YjEwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2xpbWl0cy5oCkBAIC0wLDAgKzEsNjUgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsaW1pdHMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfTElNSVRTX0gKKyNkZWZpbmUgX0xJQkNQUF9MSU1JVFNfSAorCisvKgorICAgIGxpbWl0cy5oIHN5bm9wc2lzCisKK01hY3JvczoKKworICAgIENIQVJfQklUCisgICAgU0NIQVJfTUlOCisgICAgU0NIQVJfTUFYCisgICAgVUNIQVJfTUFYCisgICAgQ0hBUl9NSU4KKyAgICBDSEFSX01BWAorICAgIE1CX0xFTl9NQVgKKyAgICBTSFJUX01JTgorICAgIFNIUlRfTUFYCisgICAgVVNIUlRfTUFYCisgICAgSU5UX01JTgorICAgIElOVF9NQVgKKyAgICBVSU5UX01BWAorICAgIExPTkdfTUlOCisgICAgTE9OR19NQVgKKyAgICBVTE9OR19NQVgKKyAgICBMTE9OR19NSU4gICAvLyBDOTkKKyAgICBMTE9OR19NQVggICAvLyBDOTkKKyAgICBVTExPTkdfTUFYICAvLyBDOTkKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2lmbmRlZiBfX0dOVUNfXworI2luY2x1ZGVfbmV4dCA8bGltaXRzLmg+CisjZWxzZQorLy8gR0NDIGhlYWRlciBsaW1pdHMuaCByZWN1cnNpdmVseSBpbmNsdWRlcyBpdHNlbGYgdGhyb3VnaCBhbm90aGVyIGhlYWRlciBjYWxsZWQKKy8vIHN5c2xpbWl0cy5oIGZvciBzb21lIHJlYXNvbi4gVGhpcyBzZXR1cCBicmVha3MgZG93biBpZiB3ZSBkaXJlY3RseQorLy8gI2luY2x1ZGVfbmV4dCBHQ0MncyBsaW1pdHMuaCAocmVhc29ucyBub3QgZW50aXJlbHkgY2xlYXIgdG8gbWUpLiBUaGVyZWZvcmUsCisvLyB3ZSBtYW51YWxseSByZS1jcmVhdGUgdGhlIG5lY2Vzc2FyeSBpbmNsdWRlIHNlcXVlbmNlIGJlbG93OgorCisvLyBHZXQgdGhlIHN5c3RlbSBsaW1pdHMuaCBkZWZpbmVzIChmb3JjZSByZWN1cnNlIGludG8gdGhlIG5leHQgbGV2ZWwpCisjZGVmaW5lIF9HQ0NfTElNSVRTX0hfCisjZGVmaW5lIF9HQ0NfTkVYVF9MSU1JVFNfSAorI2luY2x1ZGVfbmV4dCA8bGltaXRzLmg+CisKKy8vIEdldCB0aGUgSVNPIEMgZGVmaW5lcworI3VuZGVmIF9HQ0NfTElNSVRTX0hfCisjaW5jbHVkZV9uZXh0IDxsaW1pdHMuaD4KKyNlbmRpZiAvLyBfX0dOVUNfXworCisjZW5kaWYgIC8vIF9MSUJDUFBfTElNSVRTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9saXN0IGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4NGIxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9saXN0CkBAIC0wLDAgKzEsMjQyMSBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsaXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9MSVNUCisjZGVmaW5lIF9MSUJDUFBfTElTVAorCisvKgorICAgIGxpc3Qgc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQWxsb2MgPSBhbGxvY2F0b3I8VD4gPgorY2xhc3MgbGlzdAoreworcHVibGljOgorCisgICAgLy8gdHlwZXM6CisgICAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBBbGxvYyBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6cG9pbnRlciBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIGltcGxlbWVudGF0aW9uLWRlZmluZWQgaXRlcmF0b3I7CisgICAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBzaXplX3R5cGU7CisgICAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3I7CisgICAgdHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgbGlzdCgpCisgICAgICAgIG5vZXhjZXB0KGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpOworICAgIGV4cGxpY2l0IGxpc3QoY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOworICAgIGV4cGxpY2l0IGxpc3Qoc2l6ZV90eXBlIG4pOworICAgIGV4cGxpY2l0IGxpc3Qoc2l6ZV90eXBlIG4sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsgLy8gQysrMTQKKyAgICBsaXN0KHNpemVfdHlwZSBuLCBjb25zdCB2YWx1ZV90eXBlJiB2YWx1ZSk7CisgICAgbGlzdChzaXplX3R5cGUgbiwgY29uc3QgdmFsdWVfdHlwZSYgdmFsdWUsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSXRlcj4KKyAgICAgICAgbGlzdChJdGVyIGZpcnN0LCBJdGVyIGxhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBJdGVyPgorICAgICAgICBsaXN0KEl0ZXIgZmlyc3QsIEl0ZXIgbGFzdCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOworICAgIGxpc3QoY29uc3QgbGlzdCYgeCk7CisgICAgbGlzdChjb25zdCBsaXN0JiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOworICAgIGxpc3QobGlzdCYmIHgpCisgICAgICAgIG5vZXhjZXB0KGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpOworICAgIGxpc3QobGlzdCYmLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7CisgICAgbGlzdChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+KTsKKyAgICBsaXN0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsKKworICAgIH5saXN0KCk7CisKKyAgICBsaXN0JiBvcGVyYXRvcj0oY29uc3QgbGlzdCYgeCk7CisgICAgbGlzdCYgb3BlcmF0b3I9KGxpc3QmJiB4KQorICAgICAgICBub2V4Y2VwdCgKKyAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ6OnZhbHVlICYmCisgICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisgICAgbGlzdCYgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4pOworICAgIHRlbXBsYXRlIDxjbGFzcyBJdGVyPgorICAgICAgICB2b2lkIGFzc2lnbihJdGVyIGZpcnN0LCBJdGVyIGxhc3QpOworICAgIHZvaWQgYXNzaWduKHNpemVfdHlwZSBuLCBjb25zdCB2YWx1ZV90eXBlJiB0KTsKKyAgICB2b2lkIGFzc2lnbihpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+KTsKKworICAgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIGl0ZXJhdG9yIGJlZ2luKCkgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCBub2V4Y2VwdDsKKyAgICBpdGVyYXRvciBlbmQoKSBub2V4Y2VwdDsKKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCBub2V4Y2VwdDsKKyAgICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIG5vZXhjZXB0OworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgY2VuZCgpIGNvbnN0IG5vZXhjZXB0OworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0OworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY3JlbmQoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIHJlZmVyZW5jZSBmcm9udCgpOworICAgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0OworICAgIHJlZmVyZW5jZSBiYWNrKCk7CisgICAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdDsKKworICAgIGJvb2wgZW1wdHkoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IG5vZXhjZXB0OworICAgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IG5vZXhjZXB0OworCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CisgICAgICAgIHJlZmVyZW5jZSBlbXBsYWNlX2Zyb250KEFyZ3MmJi4uLiBhcmdzKTsgLy8gcmVmZXJlbmNlIGluIEMrKzE3CisgICAgdm9pZCBwb3BfZnJvbnQoKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KKyAgICAgICAgcmVmZXJlbmNlIGVtcGxhY2VfYmFjayhBcmdzJiYuLi4gYXJncyk7ICAvLyByZWZlcmVuY2UgaW4gQysrMTcKKyAgICB2b2lkIHBvcF9iYWNrKCk7CisgICAgdm9pZCBwdXNoX2Zyb250KGNvbnN0IHZhbHVlX3R5cGUmIHgpOworICAgIHZvaWQgcHVzaF9mcm9udCh2YWx1ZV90eXBlJiYgeCk7CisgICAgdm9pZCBwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgeCk7CisgICAgdm9pZCBwdXNoX2JhY2sodmFsdWVfdHlwZSYmIHgpOworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorICAgICAgICBpdGVyYXRvciBlbXBsYWNlKGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCBBcmdzJiYuLi4gYXJncyk7CisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiB4KTsKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24sIHZhbHVlX3R5cGUmJiB4KTsKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24sIHNpemVfdHlwZSBuLCBjb25zdCB2YWx1ZV90eXBlJiB4KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSXRlcj4KKyAgICAgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCBJdGVyIGZpcnN0LCBJdGVyIGxhc3QpOworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBpbCk7CisKKyAgICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBwb3NpdGlvbik7CisgICAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24sIGNvbnN0X2l0ZXJhdG9yIGxhc3QpOworCisgICAgdm9pZCByZXNpemUoc2l6ZV90eXBlIHN6KTsKKyAgICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgc3osIGNvbnN0IHZhbHVlX3R5cGUmIGMpOworCisgICAgdm9pZCBzd2FwKGxpc3QmKQorICAgICAgICBub2V4Y2VwdChhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPjo6aXNfYWx3YXlzX2VxdWFsOjp2YWx1ZSk7ICAvLyBDKysxNworICAgIHZvaWQgY2xlYXIoKSBub2V4Y2VwdDsKKworICAgIHZvaWQgc3BsaWNlKGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCBsaXN0JiB4KTsKKyAgICB2b2lkIHNwbGljZShjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgbGlzdCYmIHgpOworICAgIHZvaWQgc3BsaWNlKGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCBsaXN0JiB4LCBjb25zdF9pdGVyYXRvciBpKTsKKyAgICB2b2lkIHNwbGljZShjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgbGlzdCYmIHgsIGNvbnN0X2l0ZXJhdG9yIGkpOworICAgIHZvaWQgc3BsaWNlKGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCBsaXN0JiB4LCBjb25zdF9pdGVyYXRvciBmaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgbGFzdCk7CisgICAgdm9pZCBzcGxpY2UoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24sIGxpc3QmJiB4LCBjb25zdF9pdGVyYXRvciBmaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgbGFzdCk7CisKKyAgICB2b2lkIHJlbW92ZShjb25zdCB2YWx1ZV90eXBlJiB2YWx1ZSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFByZWQ+IHZvaWQgcmVtb3ZlX2lmKFByZWQgcHJlZCk7CisgICAgdm9pZCB1bmlxdWUoKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgQmluYXJ5UHJlZGljYXRlPgorICAgICAgICB2b2lkIHVuaXF1ZShCaW5hcnlQcmVkaWNhdGUgYmluYXJ5X3ByZWQpOworICAgIHZvaWQgbWVyZ2UobGlzdCYgeCk7CisgICAgdm9pZCBtZXJnZShsaXN0JiYgeCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIENvbXBhcmU+CisgICAgICAgIHZvaWQgbWVyZ2UobGlzdCYgeCwgQ29tcGFyZSBjb21wKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgQ29tcGFyZT4KKyAgICAgICAgdm9pZCBtZXJnZShsaXN0JiYgeCwgQ29tcGFyZSBjb21wKTsKKyAgICB2b2lkIHNvcnQoKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgQ29tcGFyZT4KKyAgICAgICAgdm9pZCBzb3J0KENvbXBhcmUgY29tcCk7CisgICAgdm9pZCByZXZlcnNlKCkgbm9leGNlcHQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQWxsb2M+CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGxpc3Q8VCxBbGxvYz4mIHgsIGNvbnN0IGxpc3Q8VCxBbGxvYz4mIHkpOwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jPgorICAgIGJvb2wgb3BlcmF0b3I8IChjb25zdCBsaXN0PFQsQWxsb2M+JiB4LCBjb25zdCBsaXN0PFQsQWxsb2M+JiB5KTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBBbGxvYz4KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgbGlzdDxULEFsbG9jPiYgeCwgY29uc3QgbGlzdDxULEFsbG9jPiYgeSk7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQWxsb2M+CisgICAgYm9vbCBvcGVyYXRvcj4gKGNvbnN0IGxpc3Q8VCxBbGxvYz4mIHgsIGNvbnN0IGxpc3Q8VCxBbGxvYz4mIHkpOwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jPgorICAgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBsaXN0PFQsQWxsb2M+JiB4LCBjb25zdCBsaXN0PFQsQWxsb2M+JiB5KTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBBbGxvYz4KKyAgICBib29sIG9wZXJhdG9yPD0oY29uc3QgbGlzdDxULEFsbG9jPiYgeCwgY29uc3QgbGlzdDxULEFsbG9jPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBBbGxvYz4KKyAgICB2b2lkIHN3YXAobGlzdDxULEFsbG9jPiYgeCwgbGlzdDxULEFsbG9jPiYgeSkKKyAgICAgICAgIG5vZXhjZXB0KG5vZXhjZXB0KHguc3dhcCh5KSkpOworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPF9fZGVidWc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX1BVU0hfTUFDUk9TCisjaW5jbHVkZSA8X191bmRlZl9tYWNyb3M+CisKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Wb2lkUHRyPiBzdHJ1Y3QgX19saXN0X25vZGU7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVm9pZFB0cj4gc3RydWN0IF9fbGlzdF9ub2RlX2Jhc2U7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Wb2lkUHRyPgorc3RydWN0IF9fbGlzdF9ub2RlX3BvaW50ZXJfdHJhaXRzIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9wb2ludGVyPF9Wb2lkUHRyLCBfX2xpc3Rfbm9kZTxfVHAsIF9Wb2lkUHRyPiA+Ojp0eXBlCisgICAgICAgIF9fbm9kZV9wb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3BvaW50ZXI8X1ZvaWRQdHIsIF9fbGlzdF9ub2RlX2Jhc2U8X1RwLCBfVm9pZFB0cj4gPjo6dHlwZQorICAgICAgICBfX2Jhc2VfcG9pbnRlcjsKKworI2lmIGRlZmluZWQoX0xJQkNQUF9BQklfTElTVF9SRU1PVkVfTk9ERV9QT0lOVEVSX1VCKQorICB0eXBlZGVmIF9fYmFzZV9wb2ludGVyIF9fbGlua19wb2ludGVyOworI2Vsc2UKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDwKKyAgICAgICAgICBpc19wb2ludGVyPF9Wb2lkUHRyPjo6dmFsdWUsCisgICAgICAgICAgX19iYXNlX3BvaW50ZXIsCisgICAgICAgICAgX19ub2RlX3BvaW50ZXIKKyAgPjo6dHlwZSBfX2xpbmtfcG9pbnRlcjsKKyNlbmRpZgorCisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8CisgICAgICAgICAgaXNfc2FtZTxfX2xpbmtfcG9pbnRlciwgX19ub2RlX3BvaW50ZXI+Ojp2YWx1ZSwKKyAgICAgICAgICBfX2Jhc2VfcG9pbnRlciwKKyAgICAgICAgICBfX25vZGVfcG9pbnRlcgorICA+Ojp0eXBlIF9fbm9uX2xpbmtfcG9pbnRlcjsKKworICBzdGF0aWMgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBfX2xpbmtfcG9pbnRlciBfX3Vuc2FmZV9saW5rX3BvaW50ZXJfY2FzdChfX2xpbmtfcG9pbnRlciBfX3ApIHsKKyAgICAgIHJldHVybiBfX3A7CisgIH0KKworICBzdGF0aWMgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBfX2xpbmtfcG9pbnRlciBfX3Vuc2FmZV9saW5rX3BvaW50ZXJfY2FzdChfX25vbl9saW5rX3BvaW50ZXIgX19wKSB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X19saW5rX3BvaW50ZXI+KHN0YXRpY19jYXN0PF9Wb2lkUHRyPihfX3ApKTsKKyAgfQorCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVm9pZFB0cj4KK3N0cnVjdCBfX2xpc3Rfbm9kZV9iYXNlCit7CisgICAgdHlwZWRlZiBfX2xpc3Rfbm9kZV9wb2ludGVyX3RyYWl0czxfVHAsIF9Wb2lkUHRyPiBfTm9kZVRyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHJhaXRzOjpfX25vZGVfcG9pbnRlciBfX25vZGVfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHJhaXRzOjpfX2Jhc2VfcG9pbnRlciBfX2Jhc2VfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHJhaXRzOjpfX2xpbmtfcG9pbnRlciBfX2xpbmtfcG9pbnRlcjsKKworICAgIF9fbGlua19wb2ludGVyIF9fcHJldl87CisgICAgX19saW5rX3BvaW50ZXIgX19uZXh0XzsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2xpc3Rfbm9kZV9iYXNlKCkgOiBfX3ByZXZfKF9Ob2RlVHJhaXRzOjpfX3Vuc2FmZV9saW5rX3BvaW50ZXJfY2FzdChfX3NlbGYoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fbmV4dF8oX05vZGVUcmFpdHM6Ol9fdW5zYWZlX2xpbmtfcG9pbnRlcl9jYXN0KF9fc2VsZigpKSkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2Jhc2VfcG9pbnRlciBfX3NlbGYoKSB7CisgICAgICAgIHJldHVybiBwb2ludGVyX3RyYWl0czxfX2Jhc2VfcG9pbnRlcj46OnBvaW50ZXJfdG8oKnRoaXMpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX25vZGVfcG9pbnRlciBfX2FzX25vZGUoKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19zZWxmKCkpOworICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Wb2lkUHRyPgorc3RydWN0IF9fbGlzdF9ub2RlCisgICAgOiBwdWJsaWMgX19saXN0X25vZGVfYmFzZTxfVHAsIF9Wb2lkUHRyPgoreworICAgIF9UcCBfX3ZhbHVlXzsKKworICAgIHR5cGVkZWYgX19saXN0X25vZGVfYmFzZTxfVHAsIF9Wb2lkUHRyPiBfX2Jhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6Ol9fbGlua19wb2ludGVyIF9fbGlua19wb2ludGVyOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fbGlua19wb2ludGVyIF9fYXNfbGluaygpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9fbGlua19wb2ludGVyPihfX2Jhc2U6Ol9fc2VsZigpKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X1RwPiA+IGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGxpc3Q7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+IGNsYXNzIF9fbGlzdF9pbXA7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVm9pZFB0cj4gY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19saXN0X2NvbnN0X2l0ZXJhdG9yOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVm9pZFB0cj4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9fbGlzdF9pdGVyYXRvcgoreworICAgIHR5cGVkZWYgX19saXN0X25vZGVfcG9pbnRlcl90cmFpdHM8X1RwLCBfVm9pZFB0cj4gX05vZGVUcmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVRyYWl0czo6X19saW5rX3BvaW50ZXIgX19saW5rX3BvaW50ZXI7CisKKyAgICBfX2xpbmtfcG9pbnRlciBfX3B0cl87CisKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19saXN0X2l0ZXJhdG9yKF9fbGlua19wb2ludGVyIF9fcCwgY29uc3Qgdm9pZCogX19jKSBfTk9FWENFUFQKKyAgICAgICAgOiBfX3B0cl8oX19wKQorICAgIHsKKyAgICAgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfaWModGhpcywgX19jKTsKKyAgICB9CisjZWxzZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2xpc3RfaXRlcmF0b3IoX19saW5rX3BvaW50ZXIgX19wKSBfTk9FWENFUFQgOiBfX3B0cl8oX19wKSB7fQorI2VuZGlmCisKKworCisgICAgdGVtcGxhdGU8Y2xhc3MsIGNsYXNzPiBmcmllbmQgY2xhc3MgbGlzdDsKKyAgICB0ZW1wbGF0ZTxjbGFzcywgY2xhc3M+IGZyaWVuZCBjbGFzcyBfX2xpc3RfaW1wOworICAgIHRlbXBsYXRlPGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9fbGlzdF9jb25zdF9pdGVyYXRvcjsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3BvaW50ZXI8X1ZvaWRQdHIsIHZhbHVlX3R5cGU+Ojp0eXBlIHBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBwb2ludGVyX3RyYWl0czxwb2ludGVyPjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2xpc3RfaXRlcmF0b3IoKSBfTk9FWENFUFQgOiBfX3B0cl8obnVsbHB0cikKKyAgICB7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2kodGhpcyk7CisjZW5kaWYKKyAgICB9CisKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2xpc3RfaXRlcmF0b3IoY29uc3QgX19saXN0X2l0ZXJhdG9yJiBfX3ApCisgICAgICAgIDogX19wdHJfKF9fcC5fX3B0cl8pCisgICAgeworICAgICAgICBfX2dldF9kYigpLT5fX2l0ZXJhdG9yX2NvcHkodGhpcywgJl9fcCk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIH5fX2xpc3RfaXRlcmF0b3IoKQorICAgIHsKKyAgICAgICAgX19nZXRfZGIoKS0+X19lcmFzZV9pKHRoaXMpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2xpc3RfaXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBfX2xpc3RfaXRlcmF0b3ImIF9fcCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzICE9ICZfX3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fZ2V0X2RiKCktPl9faXRlcmF0b3JfY29weSh0aGlzLCAmX19wKTsKKyAgICAgICAgICAgIF9fcHRyXyA9IF9fcC5fX3B0cl87CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QKKyAgICB7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZGVyZWZlcmVuY2VhYmxlKHRoaXMpLAorICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIGRlcmVmZXJlbmNlIGEgbm9uLWRlcmVmZXJlbmNlYWJsZSBsaXN0OjppdGVyYXRvciIpOworI2VuZGlmCisgICAgICAgIHJldHVybiBfX3B0cl8tPl9fYXNfbm9kZSgpLT5fX3ZhbHVlXzsKKyAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgeworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2RlcmVmZXJlbmNlYWJsZSh0aGlzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCB0byBkZXJlZmVyZW5jZSBhIG5vbi1kZXJlZmVyZW5jZWFibGUgbGlzdDo6aXRlcmF0b3IiKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gcG9pbnRlcl90cmFpdHM8cG9pbnRlcj46OnBvaW50ZXJfdG8oX19wdHJfLT5fX2FzX25vZGUoKS0+X192YWx1ZV8pOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2xpc3RfaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgIHsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19kZXJlZmVyZW5jZWFibGUodGhpcyksCisgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0ZWQgdG8gaW5jcmVtZW50IG5vbi1pbmNyZW1lbnRhYmxlIGxpc3Q6Oml0ZXJhdG9yIik7CisjZW5kaWYKKyAgICAgICAgX19wdHJfID0gX19wdHJfLT5fX25leHRfOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2xpc3RfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHtfX2xpc3RfaXRlcmF0b3IgX190KCp0aGlzKTsgKysoKnRoaXMpOyByZXR1cm4gX190O30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2xpc3RfaXRlcmF0b3ImIG9wZXJhdG9yLS0oKQorICAgIHsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19kZWNyZW1lbnRhYmxlKHRoaXMpLAorICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIGRlY3JlbWVudCBub24tZGVjcmVtZW50YWJsZSBsaXN0OjppdGVyYXRvciIpOworI2VuZGlmCisgICAgICAgIF9fcHRyXyA9IF9fcHRyXy0+X19wcmV2XzsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19saXN0X2l0ZXJhdG9yIG9wZXJhdG9yLS0oaW50KSB7X19saXN0X2l0ZXJhdG9yIF9fdCgqdGhpcyk7IC0tKCp0aGlzKTsgcmV0dXJuIF9fdDt9CisKKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfX2xpc3RfaXRlcmF0b3ImIF9feCwgY29uc3QgX19saXN0X2l0ZXJhdG9yJiBfX3kpCisgICAgeworICAgICAgICByZXR1cm4gX194Ll9fcHRyXyA9PSBfX3kuX19wdHJfOworICAgIH0KKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgX19saXN0X2l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9fbGlzdF9pdGVyYXRvciYgX195KQorICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1ZvaWRQdHI+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2xpc3RfY29uc3RfaXRlcmF0b3IKK3sKKyAgICB0eXBlZGVmIF9fbGlzdF9ub2RlX3BvaW50ZXJfdHJhaXRzPF9UcCwgX1ZvaWRQdHI+IF9Ob2RlVHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUcmFpdHM6Ol9fbGlua19wb2ludGVyIF9fbGlua19wb2ludGVyOworCisgICAgX19saW5rX3BvaW50ZXIgX19wdHJfOworCisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9fbGlzdF9jb25zdF9pdGVyYXRvcihfX2xpbmtfcG9pbnRlciBfX3AsIGNvbnN0IHZvaWQqIF9fYykgX05PRVhDRVBUCisgICAgICAgIDogX19wdHJfKF9fcCkKKyAgICB7CisgICAgICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ljKHRoaXMsIF9fYyk7CisgICAgfQorI2Vsc2UKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19saXN0X2NvbnN0X2l0ZXJhdG9yKF9fbGlua19wb2ludGVyIF9fcCkgX05PRVhDRVBUIDogX19wdHJfKF9fcCkge30KKyNlbmRpZgorCisgICAgdGVtcGxhdGU8Y2xhc3MsIGNsYXNzPiBmcmllbmQgY2xhc3MgbGlzdDsKKyAgICB0ZW1wbGF0ZTxjbGFzcywgY2xhc3M+IGZyaWVuZCBjbGFzcyBfX2xpc3RfaW1wOworcHVibGljOgorICAgIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfcG9pbnRlcjxfVm9pZFB0ciwgY29uc3QgdmFsdWVfdHlwZT46OnR5cGUgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHBvaW50ZXJfdHJhaXRzPHBvaW50ZXI+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fbGlzdF9jb25zdF9pdGVyYXRvcigpIF9OT0VYQ0VQVCA6IF9fcHRyXyhudWxscHRyKQorICAgIHsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfaSh0aGlzKTsKKyNlbmRpZgorICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19saXN0X2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9fbGlzdF9pdGVyYXRvcjxfVHAsIF9Wb2lkUHRyPiYgX19wKSBfTk9FWENFUFQKKyAgICAgICAgOiBfX3B0cl8oX19wLl9fcHRyXykKKyAgICB7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgIF9fZ2V0X2RiKCktPl9faXRlcmF0b3JfY29weSh0aGlzLCAmX19wKTsKKyNlbmRpZgorICAgIH0KKworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fbGlzdF9jb25zdF9pdGVyYXRvcihjb25zdCBfX2xpc3RfY29uc3RfaXRlcmF0b3ImIF9fcCkKKyAgICAgICAgOiBfX3B0cl8oX19wLl9fcHRyXykKKyAgICB7CisgICAgICAgIF9fZ2V0X2RiKCktPl9faXRlcmF0b3JfY29weSh0aGlzLCAmX19wKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgfl9fbGlzdF9jb25zdF9pdGVyYXRvcigpCisgICAgeworICAgICAgICBfX2dldF9kYigpLT5fX2VyYXNlX2kodGhpcyk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fbGlzdF9jb25zdF9pdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IF9fbGlzdF9jb25zdF9pdGVyYXRvciYgX19wKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMgIT0gJl9fcCkKKyAgICAgICAgeworICAgICAgICAgICAgX19nZXRfZGIoKS0+X19pdGVyYXRvcl9jb3B5KHRoaXMsICZfX3ApOworICAgICAgICAgICAgX19wdHJfID0gX19wLl9fcHRyXzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QKKyAgICB7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZGVyZWZlcmVuY2VhYmxlKHRoaXMpLAorICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIGRlcmVmZXJlbmNlIGEgbm9uLWRlcmVmZXJlbmNlYWJsZSBsaXN0Ojpjb25zdF9pdGVyYXRvciIpOworI2VuZGlmCisgICAgICAgIHJldHVybiBfX3B0cl8tPl9fYXNfbm9kZSgpLT5fX3ZhbHVlXzsKKyAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgeworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2RlcmVmZXJlbmNlYWJsZSh0aGlzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCB0byBkZXJlZmVyZW5jZSBhIG5vbi1kZXJlZmVyZW5jZWFibGUgbGlzdDo6Y29uc3RfaXRlcmF0b3IiKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gcG9pbnRlcl90cmFpdHM8cG9pbnRlcj46OnBvaW50ZXJfdG8oX19wdHJfLT5fX2FzX25vZGUoKS0+X192YWx1ZV8pOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2xpc3RfY29uc3RfaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgIHsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19kZXJlZmVyZW5jZWFibGUodGhpcyksCisgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0ZWQgdG8gaW5jcmVtZW50IG5vbi1pbmNyZW1lbnRhYmxlIGxpc3Q6OmNvbnN0X2l0ZXJhdG9yIik7CisjZW5kaWYKKyAgICAgICAgX19wdHJfID0gX19wdHJfLT5fX25leHRfOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2xpc3RfY29uc3RfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHtfX2xpc3RfY29uc3RfaXRlcmF0b3IgX190KCp0aGlzKTsgKysoKnRoaXMpOyByZXR1cm4gX190O30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2xpc3RfY29uc3RfaXRlcmF0b3ImIG9wZXJhdG9yLS0oKQorICAgIHsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19kZWNyZW1lbnRhYmxlKHRoaXMpLAorICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIGRlY3JlbWVudCBub24tZGVjcmVtZW50YWJsZSBsaXN0Ojpjb25zdF9pdGVyYXRvciIpOworI2VuZGlmCisgICAgICAgIF9fcHRyXyA9IF9fcHRyXy0+X19wcmV2XzsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19saXN0X2NvbnN0X2l0ZXJhdG9yIG9wZXJhdG9yLS0oaW50KSB7X19saXN0X2NvbnN0X2l0ZXJhdG9yIF9fdCgqdGhpcyk7IC0tKCp0aGlzKTsgcmV0dXJuIF9fdDt9CisKKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfX2xpc3RfY29uc3RfaXRlcmF0b3ImIF9feCwgY29uc3QgX19saXN0X2NvbnN0X2l0ZXJhdG9yJiBfX3kpCisgICAgeworICAgICAgICByZXR1cm4gX194Ll9fcHRyXyA9PSBfX3kuX19wdHJfOworICAgIH0KKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfX2xpc3RfY29uc3RfaXRlcmF0b3ImIF9feCwgY29uc3QgX19saXN0X2NvbnN0X2l0ZXJhdG9yJiBfX3kpCisgICAgICAgIHtyZXR1cm4gIShfX3ggPT0gX195KTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitjbGFzcyBfX2xpc3RfaW1wCit7CisgICAgX19saXN0X2ltcChjb25zdCBfX2xpc3RfaW1wJik7CisgICAgX19saXN0X2ltcCYgb3BlcmF0b3I9KGNvbnN0IF9fbGlzdF9pbXAmKTsKK3Byb3RlY3RlZDoKKyAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnNpemVfdHlwZSAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2FsbG9jX3RyYWl0czo6dm9pZF9wb2ludGVyICAgICAgICAgICAgICAgICAgIF9fdm9pZF9wb2ludGVyOworICAgIHR5cGVkZWYgX19saXN0X2l0ZXJhdG9yPHZhbHVlX3R5cGUsIF9fdm9pZF9wb2ludGVyPiAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9fbGlzdF9jb25zdF9pdGVyYXRvcjx2YWx1ZV90eXBlLCBfX3ZvaWRfcG9pbnRlcj4gICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfX2xpc3Rfbm9kZV9iYXNlPHZhbHVlX3R5cGUsIF9fdm9pZF9wb2ludGVyPiAgICAgICAgICAgIF9fbm9kZV9iYXNlOworICAgIHR5cGVkZWYgX19saXN0X25vZGU8dmFsdWVfdHlwZSwgX192b2lkX3BvaW50ZXI+ICAgICAgICAgICAgICAgICBfX25vZGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9hbGxvY19oZWxwZXI8X19hbGxvY190cmFpdHMsIF9fbm9kZT46OnR5cGUgX19ub2RlX2FsbG9jYXRvcjsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X19ub2RlX2FsbG9jYXRvcj4gICAgICAgICAgICAgICAgICAgICAgIF9fbm9kZV9hbGxvY190cmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX25vZGVfYWxsb2NfdHJhaXRzOjpwb2ludGVyICAgICAgICAgICAgICAgICAgICBfX25vZGVfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbm9kZV9hbGxvY190cmFpdHM6OnBvaW50ZXIgICAgICAgICAgICAgICAgICAgIF9fbm9kZV9jb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgX19saXN0X25vZGVfcG9pbnRlcl90cmFpdHM8dmFsdWVfdHlwZSwgX192b2lkX3BvaW50ZXI+IF9fbm9kZV9wb2ludGVyX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbm9kZV9wb2ludGVyX3RyYWl0czo6X19saW5rX3BvaW50ZXIgX19saW5rX3BvaW50ZXI7CisgICAgdHlwZWRlZiBfX2xpbmtfcG9pbnRlciBfX2xpbmtfY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2FsbG9jX3RyYWl0czo6Y29uc3RfcG9pbnRlciAgICAgICAgICAgICAgICAgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OmRpZmZlcmVuY2VfdHlwZSAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9hbGxvY19oZWxwZXI8X19hbGxvY190cmFpdHMsIF9fbm9kZV9iYXNlPjo6dHlwZSBfX25vZGVfYmFzZV9hbGxvY2F0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPF9fbm9kZV9iYXNlX2FsbG9jYXRvcj46OnBvaW50ZXIgX19ub2RlX2Jhc2VfcG9pbnRlcjsKKworICAgIF9fbm9kZV9iYXNlIF9fZW5kXzsKKyAgICBfX2NvbXByZXNzZWRfcGFpcjxzaXplX3R5cGUsIF9fbm9kZV9hbGxvY2F0b3I+IF9fc2l6ZV9hbGxvY187CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19saW5rX3BvaW50ZXIgX19lbmRfYXNfbGluaygpIGNvbnN0IF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBfX25vZGVfcG9pbnRlcl90cmFpdHM6Ol9fdW5zYWZlX2xpbmtfcG9pbnRlcl9jYXN0KAorICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8X19ub2RlX2Jhc2UmPihfX2VuZF8pLl9fc2VsZigpKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgc2l6ZV90eXBlJiBfX3N6KCkgX05PRVhDRVBUIHtyZXR1cm4gX19zaXplX2FsbG9jXy5maXJzdCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3Qgc2l6ZV90eXBlJiBfX3N6KCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19zaXplX2FsbG9jXy5maXJzdCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgX19ub2RlX2FsbG9jYXRvciYgX19ub2RlX2FsbG9jKCkgX05PRVhDRVBUCisgICAgICAgICAge3JldHVybiBfX3NpemVfYWxsb2NfLnNlY29uZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgX19ub2RlX2FsbG9jYXRvciYgX19ub2RlX2FsbG9jKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19zaXplX2FsbG9jXy5zZWNvbmQoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIF9fbm9kZV9hbGxvY19tYXhfc2l6ZSgpIGNvbnN0IF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBfX25vZGVfYWxsb2NfdHJhaXRzOjptYXhfc2l6ZShfX25vZGVfYWxsb2MoKSk7CisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgdm9pZCBfX3VubGlua19ub2RlcyhfX2xpbmtfcG9pbnRlciBfX2YsIF9fbGlua19wb2ludGVyIF9fbCkgX05PRVhDRVBUOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fbGlzdF9pbXAoKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9fbm9kZV9hbGxvY2F0b3I+Ojp2YWx1ZSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fbGlzdF9pbXAoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgfl9fbGlzdF9pbXAoKTsKKyAgICB2b2lkIGNsZWFyKCkgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIGVtcHR5KCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX19zeigpID09IDA7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGJlZ2luKCkgX05PRVhDRVBUCisgICAgeworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICByZXR1cm4gaXRlcmF0b3IoX19lbmRfLl9fbmV4dF8sIHRoaXMpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9fZW5kXy5fX25leHRfKTsKKyNlbmRpZgorICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCAgX05PRVhDRVBUCisgICAgeworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX19lbmRfLl9fbmV4dF8sIHRoaXMpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9fZW5kXy5fX25leHRfKTsKKyNlbmRpZgorICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgZW5kKCkgX05PRVhDRVBUCisgICAgeworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICByZXR1cm4gaXRlcmF0b3IoX19lbmRfYXNfbGluaygpLCB0aGlzKTsKKyNlbHNlCisgICAgICAgIHJldHVybiBpdGVyYXRvcihfX2VuZF9hc19saW5rKCkpOworI2VuZGlmCisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCBfTk9FWENFUFQKKyAgICB7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihfX2VuZF9hc19saW5rKCksIHRoaXMpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9fZW5kX2FzX2xpbmsoKSk7CisjZW5kaWYKKyAgICB9CisKKyAgICB2b2lkIHN3YXAoX19saXN0X2ltcCYgX19jKQorI2lmIF9MSUJDUFBfU1REX1ZFUiA+PSAxNAorICAgICAgICBfTk9FWENFUFRfREVCVUc7CisjZWxzZQorICAgICAgICBfTk9FWENFUFRfREVCVUdfKCFfX2FsbG9jX3RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwOjp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpOworI2VuZGlmCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX2NvcHlfYXNzaWduX2FsbG9jKGNvbnN0IF9fbGlzdF9pbXAmIF9fYykKKyAgICAgICAge19fY29weV9hc3NpZ25fYWxsb2MoX19jLCBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgICAgICAgICAgICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfY29weV9hc3NpZ25tZW50Ojp2YWx1ZT4oKSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19tb3ZlX2Fzc2lnbl9hbGxvYyhfX2xpc3RfaW1wJiBfX2MpCisgICAgICAgIF9OT0VYQ0VQVF8oCisgICAgICAgICAgICAhX19ub2RlX2FsbG9jX3RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ6OnZhbHVlIHx8CisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfX25vZGVfYWxsb2NhdG9yPjo6dmFsdWUpCisgICAgICAgIHtfX21vdmVfYXNzaWduX2FsbG9jKF9fYywgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgICAgICAgICAgICBfX25vZGVfYWxsb2NfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWU+KCkpO30KKworcHJpdmF0ZToKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX2NvcHlfYXNzaWduX2FsbG9jKGNvbnN0IF9fbGlzdF9pbXAmIF9fYywgdHJ1ZV90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX19ub2RlX2FsbG9jKCkgIT0gX19jLl9fbm9kZV9hbGxvYygpKQorICAgICAgICAgICAgICAgIGNsZWFyKCk7CisgICAgICAgICAgICBfX25vZGVfYWxsb2MoKSA9IF9fYy5fX25vZGVfYWxsb2MoKTsKKyAgICAgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19jb3B5X2Fzc2lnbl9hbGxvYyhjb25zdCBfX2xpc3RfaW1wJiwgZmFsc2VfdHlwZSkKKyAgICAgICAge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fbW92ZV9hc3NpZ25fYWxsb2MoX19saXN0X2ltcCYgX19jLCB0cnVlX3R5cGUpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8X19ub2RlX2FsbG9jYXRvcj46OnZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBfX25vZGVfYWxsb2MoKSA9IF9WU1REOjptb3ZlKF9fYy5fX25vZGVfYWxsb2MoKSk7CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fbW92ZV9hc3NpZ25fYWxsb2MoX19saXN0X2ltcCYsIGZhbHNlX3R5cGUpCisgICAgICAgIF9OT0VYQ0VQVAorICAgICAgICB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19pbnZhbGlkYXRlX2FsbF9pdGVyYXRvcnMoKSB7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICBfX2dldF9kYigpLT5fX2ludmFsaWRhdGVfYWxsKHRoaXMpOworI2VuZGlmCisgICAgfQorfTsKKworLy8gVW5saW5rIG5vZGVzIFtfX2YsIF9fbF0KK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2lubGluZQordm9pZAorX19saXN0X2ltcDxfVHAsIF9BbGxvYz46Ol9fdW5saW5rX25vZGVzKF9fbGlua19wb2ludGVyIF9fZiwgX19saW5rX3BvaW50ZXIgX19sKQorICAgIF9OT0VYQ0VQVAoreworICAgIF9fZi0+X19wcmV2Xy0+X19uZXh0XyA9IF9fbC0+X19uZXh0XzsKKyAgICBfX2wtPl9fbmV4dF8tPl9fcHJldl8gPSBfX2YtPl9fcHJldl87Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2lubGluZQorX19saXN0X2ltcDxfVHAsIF9BbGxvYz46Ol9fbGlzdF9pbXAoKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9fbm9kZV9hbGxvY2F0b3I+Ojp2YWx1ZSkKKyAgICA6IF9fc2l6ZV9hbGxvY18oMCkKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lCitfX2xpc3RfaW1wPF9UcCwgX0FsbG9jPjo6X19saXN0X2ltcChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX19zaXplX2FsbG9jXygwLCBfX25vZGVfYWxsb2NhdG9yKF9fYSkpCit7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK19fbGlzdF9pbXA8X1RwLCBfQWxsb2M+Ojp+X19saXN0X2ltcCgpCit7CisgICAgY2xlYXIoKTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2VyYXNlX2ModGhpcyk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZAorX19saXN0X2ltcDxfVHAsIF9BbGxvYz46OmNsZWFyKCkgX05PRVhDRVBUCit7CisgICAgaWYgKCFlbXB0eSgpKQorICAgIHsKKyAgICAgICAgX19ub2RlX2FsbG9jYXRvciYgX19uYSA9IF9fbm9kZV9hbGxvYygpOworICAgICAgICBfX2xpbmtfcG9pbnRlciBfX2YgPSBfX2VuZF8uX19uZXh0XzsKKyAgICAgICAgX19saW5rX3BvaW50ZXIgX19sID0gX19lbmRfYXNfbGluaygpOworICAgICAgICBfX3VubGlua19ub2RlcyhfX2YsIF9fbC0+X19wcmV2Xyk7CisgICAgICAgIF9fc3ooKSA9IDA7CisgICAgICAgIHdoaWxlIChfX2YgIT0gX19sKQorICAgICAgICB7CisgICAgICAgICAgICBfX25vZGVfcG9pbnRlciBfX25wID0gX19mLT5fX2FzX25vZGUoKTsKKyAgICAgICAgICAgIF9fZiA9IF9fZi0+X19uZXh0XzsKKyAgICAgICAgICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmRlc3Ryb3koX19uYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX25wLT5fX3ZhbHVlXykpOworICAgICAgICAgICAgX19ub2RlX2FsbG9jX3RyYWl0czo6ZGVhbGxvY2F0ZShfX25hLCBfX25wLCAxKTsKKyAgICAgICAgfQorICAgICAgICBfX2ludmFsaWRhdGVfYWxsX2l0ZXJhdG9ycygpOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZAorX19saXN0X2ltcDxfVHAsIF9BbGxvYz46OnN3YXAoX19saXN0X2ltcCYgX19jKQorI2lmIF9MSUJDUFBfU1REX1ZFUiA+PSAxNAorICAgICAgICBfTk9FWENFUFRfREVCVUcKKyNlbHNlCisgICAgICAgIF9OT0VYQ0VQVF9ERUJVR18oIV9fYWxsb2NfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXA6OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgIF9faXNfbm90aHJvd19zd2FwcGFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSkKKyNlbmRpZgoreworICAgIF9MSUJDUFBfQVNTRVJUKF9fYWxsb2NfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXA6OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgdGhpcy0+X19ub2RlX2FsbG9jKCkgPT0gX19jLl9fbm9kZV9hbGxvYygpLAorICAgICAgICAgICAgICAgICAgICJsaXN0Ojpzd2FwOiBFaXRoZXIgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwIG11c3QgYmUgdHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAiIG9yIHRoZSBhbGxvY2F0b3JzIG11c3QgY29tcGFyZSBlcXVhbCIpOworICAgIHVzaW5nIF9WU1REOjpzd2FwOworICAgIF9fc3dhcF9hbGxvY2F0b3IoX19ub2RlX2FsbG9jKCksIF9fYy5fX25vZGVfYWxsb2MoKSk7CisgICAgc3dhcChfX3N6KCksIF9fYy5fX3N6KCkpOworICAgIHN3YXAoX19lbmRfLCBfX2MuX19lbmRfKTsKKyAgICBpZiAoX19zeigpID09IDApCisgICAgICAgIF9fZW5kXy5fX25leHRfID0gX19lbmRfLl9fcHJldl8gPSBfX2VuZF9hc19saW5rKCk7CisgICAgZWxzZQorICAgICAgICBfX2VuZF8uX19wcmV2Xy0+X19uZXh0XyA9IF9fZW5kXy5fX25leHRfLT5fX3ByZXZfID0gX19lbmRfYXNfbGluaygpOworICAgIGlmIChfX2MuX19zeigpID09IDApCisgICAgICAgIF9fYy5fX2VuZF8uX19uZXh0XyA9IF9fYy5fX2VuZF8uX19wcmV2XyA9IF9fYy5fX2VuZF9hc19saW5rKCk7CisgICAgZWxzZQorICAgICAgICBfX2MuX19lbmRfLl9fcHJldl8tPl9fbmV4dF8gPSBfX2MuX19lbmRfLl9fbmV4dF8tPl9fcHJldl8gPSBfX2MuX19lbmRfYXNfbGluaygpOworCisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19saWJjcHBfZGIqIF9fZGIgPSBfX2dldF9kYigpOworICAgIF9fY19ub2RlKiBfX2NuMSA9IF9fZGItPl9fZmluZF9jX2FuZF9sb2NrKHRoaXMpOworICAgIF9fY19ub2RlKiBfX2NuMiA9IF9fZGItPl9fZmluZF9jKCZfX2MpOworICAgIHN0ZDo6c3dhcChfX2NuMS0+YmVnXywgX19jbjItPmJlZ18pOworICAgIHN0ZDo6c3dhcChfX2NuMS0+ZW5kXywgX19jbjItPmVuZF8pOworICAgIHN0ZDo6c3dhcChfX2NuMS0+Y2FwXywgX19jbjItPmNhcF8pOworICAgIGZvciAoX19pX25vZGUqKiBfX3AgPSBfX2NuMS0+ZW5kXzsgX19wICE9IF9fY24xLT5iZWdfOykKKyAgICB7CisgICAgICAgIC0tX19wOworICAgICAgICBjb25zdF9pdGVyYXRvciogX19pID0gc3RhdGljX2Nhc3Q8Y29uc3RfaXRlcmF0b3IqPigoKl9fcCktPl9faV8pOworICAgICAgICBpZiAoX19pLT5fX3B0cl8gPT0gX19jLl9fZW5kX2FzX2xpbmsoKSkKKyAgICAgICAgeworICAgICAgICAgICAgX19jbjItPl9fYWRkKCpfX3ApOworICAgICAgICAgICAgaWYgKC0tX19jbjEtPmVuZF8gIT0gX19wKQorICAgICAgICAgICAgICAgIG1lbW1vdmUoX19wLCBfX3ArMSwgKF9fY24xLT5lbmRfIC0gX19wKSpzaXplb2YoX19pX25vZGUqKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKCpfX3ApLT5fX2NfID0gX19jbjE7CisgICAgfQorICAgIGZvciAoX19pX25vZGUqKiBfX3AgPSBfX2NuMi0+ZW5kXzsgX19wICE9IF9fY24yLT5iZWdfOykKKyAgICB7CisgICAgICAgIC0tX19wOworICAgICAgICBjb25zdF9pdGVyYXRvciogX19pID0gc3RhdGljX2Nhc3Q8Y29uc3RfaXRlcmF0b3IqPigoKl9fcCktPl9faV8pOworICAgICAgICBpZiAoX19pLT5fX3B0cl8gPT0gX19lbmRfYXNfbGluaygpKQorICAgICAgICB7CisgICAgICAgICAgICBfX2NuMS0+X19hZGQoKl9fcCk7CisgICAgICAgICAgICBpZiAoLS1fX2NuMi0+ZW5kXyAhPSBfX3ApCisgICAgICAgICAgICAgICAgbWVtbW92ZShfX3AsIF9fcCsxLCAoX19jbjItPmVuZF8gLSBfX3ApKnNpemVvZihfX2lfbm9kZSopKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAoKl9fcCktPl9fY18gPSBfX2NuMjsKKyAgICB9CisgICAgX19kYi0+dW5sb2NrKCk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jIC8qPSBhbGxvY2F0b3I8X1RwPiovPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgbGlzdAorICAgIDogcHJpdmF0ZSBfX2xpc3RfaW1wPF9UcCwgX0FsbG9jPgoreworICAgIHR5cGVkZWYgX19saXN0X2ltcDxfVHAsIF9BbGxvYz4gYmFzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2U6Ol9fbm9kZSAgICAgICAgICAgICAgX19ub2RlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZTo6X19ub2RlX2FsbG9jYXRvciAgICBfX25vZGVfYWxsb2NhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZTo6X19ub2RlX3BvaW50ZXIgICAgICBfX25vZGVfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2U6Ol9fbm9kZV9hbGxvY190cmFpdHMgX19ub2RlX2FsbG9jX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2U6Ol9fbm9kZV9iYXNlICAgICAgICAgX19ub2RlX2Jhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlOjpfX25vZGVfYmFzZV9wb2ludGVyIF9fbm9kZV9iYXNlX3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlOjpfX2xpbmtfcG9pbnRlciBfX2xpbmtfcG9pbnRlcjsKKworcHVibGljOgorICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICBzdGF0aWNfYXNzZXJ0KChpc19zYW1lPHZhbHVlX3R5cGUsIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjp2YWx1ZV90eXBlPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgIkludmFsaWQgYWxsb2NhdG9yOjp2YWx1ZV90eXBlIik7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgICAgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZTo6c2l6ZV90eXBlICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2U6Oml0ZXJhdG9yICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlOjpjb25zdF9pdGVyYXRvciAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgX1ZTVEQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9WU1REOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgbGlzdCgpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8X19ub2RlX2FsbG9jYXRvcj46OnZhbHVlKQorICAgIHsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgbGlzdChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKSA6IGJhc2UoX19hKQorICAgIHsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIH0KKyAgICBleHBsaWNpdCBsaXN0KHNpemVfdHlwZSBfX24pOworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisgICAgZXhwbGljaXQgbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyNlbmRpZgorICAgIGxpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKyAgICBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnBJdGVyPgorICAgICAgICBsaXN0KF9JbnBJdGVyIF9fZiwgX0lucEl0ZXIgX19sLAorICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX2lucHV0X2l0ZXJhdG9yPF9JbnBJdGVyPjo6dmFsdWU+Ojp0eXBlKiA9IDApOworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wSXRlcj4KKyAgICAgICAgbGlzdChfSW5wSXRlciBfX2YsIF9JbnBJdGVyIF9fbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSwKKyAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19pbnB1dF9pdGVyYXRvcjxfSW5wSXRlcj46OnZhbHVlPjo6dHlwZSogPSAwKTsKKworICAgIGxpc3QoY29uc3QgbGlzdCYgX19jKTsKKyAgICBsaXN0KGNvbnN0IGxpc3QmIF9fYywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGxpc3QmIG9wZXJhdG9yPShjb25zdCBsaXN0JiBfX2MpOworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBsaXN0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCk7CisgICAgbGlzdChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGxpc3QobGlzdCYmIF9fYykKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxfX25vZGVfYWxsb2NhdG9yPjo6dmFsdWUpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBsaXN0KGxpc3QmJiBfX2MsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBsaXN0JiBvcGVyYXRvcj0obGlzdCYmIF9fYykKKyAgICAgICAgX05PRVhDRVBUXygKKyAgICAgICAgICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8X19ub2RlX2FsbG9jYXRvcj46OnZhbHVlKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBsaXN0JiBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQorICAgICAgICB7YXNzaWduKF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7IHJldHVybiAqdGhpczt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBhc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQorICAgICAgICB7YXNzaWduKF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7fQorI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wSXRlcj4KKyAgICAgICAgdm9pZCBhc3NpZ24oX0lucEl0ZXIgX19mLCBfSW5wSXRlciBfX2wsCisgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfaW5wdXRfaXRlcmF0b3I8X0lucEl0ZXI+Ojp2YWx1ZT46OnR5cGUqID0gMCk7CisgICAgdm9pZCBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgX05PRVhDRVBUOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgX05PRVhDRVBUICAgICB7cmV0dXJuIGJhc2U6Ol9fc3ooKTt9CisgICAgX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgZW1wdHkoKSBjb25zdCBfTk9FWENFUFQgICAgICAgICB7cmV0dXJuIGJhc2U6OmVtcHR5KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWluPHNpemVfdHlwZT4oCisgICAgICAgICAgICAgICAgYmFzZTo6X19ub2RlX2FsbG9jX21heF9zaXplKCksCisgICAgICAgICAgICAgICAgbnVtZXJpY19saW1pdHM8ZGlmZmVyZW5jZV90eXBlID46Om1heCgpKTsKKyAgICAgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgX05PRVhDRVBUICAgICAgICB7cmV0dXJuIGJhc2U6OmJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpICBjb25zdCBfTk9FWENFUFQge3JldHVybiBiYXNlOjpiZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgaXRlcmF0b3IgZW5kKCkgX05PRVhDRVBUICAgICAgICAgIHtyZXR1cm4gYmFzZTo6ZW5kKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSAgICBjb25zdCBfTk9FWENFUFQge3JldHVybiBiYXNlOjplbmQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIGJhc2U6OmJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBjZW5kKCkgICBjb25zdCBfTk9FWENFUFQge3JldHVybiBiYXNlOjplbmQoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBfTk9FWENFUFQKKyAgICAgICAgICAgIHtyZXR1cm4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpICBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIF9OT0VYQ0VQVAorICAgICAgICAgICAge3JldHVybiAgICAgICByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgICAgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY3JiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmVuZCgpICAgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVmZXJlbmNlIGZyb250KCkKKyAgICB7CisgICAgICAgIF9MSUJDUFBfQVNTRVJUKCFlbXB0eSgpLCAibGlzdDo6ZnJvbnQgY2FsbGVkIG9uIGVtcHR5IGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIGJhc2U6Ol9fZW5kXy5fX25leHRfLT5fX2FzX25vZGUoKS0+X192YWx1ZV87CisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdAorICAgIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoIWVtcHR5KCksICJsaXN0Ojpmcm9udCBjYWxsZWQgb24gZW1wdHkgbGlzdCIpOworICAgICAgICByZXR1cm4gYmFzZTo6X19lbmRfLl9fbmV4dF8tPl9fYXNfbm9kZSgpLT5fX3ZhbHVlXzsKKyAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlZmVyZW5jZSBiYWNrKCkKKyAgICB7CisgICAgICAgIF9MSUJDUFBfQVNTRVJUKCFlbXB0eSgpLCAibGlzdDo6YmFjayBjYWxsZWQgb24gZW1wdHkgbGlzdCIpOworICAgICAgICByZXR1cm4gYmFzZTo6X19lbmRfLl9fcHJldl8tPl9fYXNfbm9kZSgpLT5fX3ZhbHVlXzsKKyAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QKKyAgICB7CisgICAgICAgIF9MSUJDUFBfQVNTRVJUKCFlbXB0eSgpLCAibGlzdDo6YmFjayBjYWxsZWQgb24gZW1wdHkgbGlzdCIpOworICAgICAgICByZXR1cm4gYmFzZTo6X19lbmRfLl9fcHJldl8tPl9fYXNfbm9kZSgpLT5fX3ZhbHVlXzsKKyAgICB9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdm9pZCBwdXNoX2Zyb250KHZhbHVlX3R5cGUmJiBfX3gpOworICAgIHZvaWQgcHVzaF9iYWNrKHZhbHVlX3R5cGUmJiBfX3gpOworCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisgICAgICAgcmVmZXJlbmNlIGVtcGxhY2VfZnJvbnQoX0FyZ3MmJi4uLiBfX2FyZ3MpOworI2Vsc2UKKyAgICAgICB2b2lkICAgICAgZW1wbGFjZV9mcm9udChfQXJncyYmLi4uIF9fYXJncyk7CisjZW5kaWYKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKyAgICAgICAgcmVmZXJlbmNlIGVtcGxhY2VfYmFjayhfQXJncyYmLi4uIF9fYXJncyk7CisjZWxzZQorICAgICAgIHZvaWQgICAgICAgZW1wbGFjZV9iYWNrKF9BcmdzJiYuLi4gX19hcmdzKTsKKyNlbmRpZgorICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IgZW1wbGFjZShjb25zdF9pdGVyYXRvciBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKTsKKworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3AsIHZhbHVlX3R5cGUmJiBfX3gpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3AsIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkKKyAgICAgICAge3JldHVybiBpbnNlcnQoX19wLCBfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpO30KKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKyAgICB2b2lkIHB1c2hfYmFjayhjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHRlbXBsYXRlIDxjbGFzcyBfQXJnPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fZW1wbGFjZV9iYWNrKF9BcmcmJiBfX2FyZykgeyBlbXBsYWNlX2JhY2soX1ZTVEQ6OmZvcndhcmQ8X0FyZz4oX19hcmcpKTsgfQorI2Vsc2UKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX2VtcGxhY2VfYmFjayh2YWx1ZV90eXBlIGNvbnN0JiBfX2FyZykgeyBwdXNoX2JhY2soX19hcmcpOyB9CisjZW5kaWYKKworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3AsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcCwgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucEl0ZXI+CisgICAgICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3AsIF9JbnBJdGVyIF9fZiwgX0lucEl0ZXIgX19sLAorICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX2lucHV0X2l0ZXJhdG9yPF9JbnBJdGVyPjo6dmFsdWU+Ojp0eXBlKiA9IDApOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc3dhcChsaXN0JiBfX2MpCisjaWYgX0xJQkNQUF9TVERfVkVSID49IDE0CisgICAgICAgIF9OT0VYQ0VQVF9ERUJVRworI2Vsc2UKKyAgICAgICAgX05PRVhDRVBUX0RFQlVHXyghX19ub2RlX2FsbG9jX3RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwOjp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgIF9faXNfbm90aHJvd19zd2FwcGFibGU8X19ub2RlX2FsbG9jYXRvcj46OnZhbHVlKQorI2VuZGlmCisgICAgICAgIHtiYXNlOjpzd2FwKF9fYyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGNsZWFyKCkgX05PRVhDRVBUIHtiYXNlOjpjbGVhcigpO30KKworICAgIHZvaWQgcG9wX2Zyb250KCk7CisgICAgdm9pZCBwb3BfYmFjaygpOworCisgICAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wKTsKKyAgICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCk7CisKKyAgICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uKTsKKyAgICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworCisgICAgdm9pZCBzcGxpY2UoY29uc3RfaXRlcmF0b3IgX19wLCBsaXN0JiBfX2MpOworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzcGxpY2UoY29uc3RfaXRlcmF0b3IgX19wLCBsaXN0JiYgX19jKSB7c3BsaWNlKF9fcCwgX19jKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc3BsaWNlKGNvbnN0X2l0ZXJhdG9yIF9fcCwgbGlzdCYmIF9fYywgY29uc3RfaXRlcmF0b3IgX19pKQorICAgICAgICB7c3BsaWNlKF9fcCwgX19jLCBfX2kpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzcGxpY2UoY29uc3RfaXRlcmF0b3IgX19wLCBsaXN0JiYgX19jLCBjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkKKyAgICAgICAge3NwbGljZShfX3AsIF9fYywgX19mLCBfX2wpO30KKyNlbmRpZgorICAgIHZvaWQgc3BsaWNlKGNvbnN0X2l0ZXJhdG9yIF9fcCwgbGlzdCYgX19jLCBjb25zdF9pdGVyYXRvciBfX2kpOworICAgIHZvaWQgc3BsaWNlKGNvbnN0X2l0ZXJhdG9yIF9fcCwgbGlzdCYgX19jLCBjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCk7CisKKyAgICB2b2lkIHJlbW92ZShjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfUHJlZD4gdm9pZCByZW1vdmVfaWYoX1ByZWQgX19wcmVkKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCB1bmlxdWUoKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWQ+CisgICAgICAgIHZvaWQgdW5pcXVlKF9CaW5hcnlQcmVkIF9fYmluYXJ5X3ByZWQpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIG1lcmdlKGxpc3QmIF9fYyk7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIG1lcmdlKGxpc3QmJiBfX2MpIHttZXJnZShfX2MpO30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ29tcD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQgbWVyZ2UobGlzdCYmIF9fYywgX0NvbXAgX19jb21wKSB7bWVyZ2UoX19jLCBfX2NvbXApO30KKyNlbmRpZgorICAgIHRlbXBsYXRlIDxjbGFzcyBfQ29tcD4KKyAgICAgICAgdm9pZCBtZXJnZShsaXN0JiBfX2MsIF9Db21wIF9fY29tcCk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzb3J0KCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Db21wPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQgc29ydChfQ29tcCBfX2NvbXApOworCisgICAgdm9pZCByZXZlcnNlKCkgX05PRVhDRVBUOworCisgICAgYm9vbCBfX2ludmFyaWFudHMoKSBjb25zdDsKKworICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfX25vZGVfYWxsb2NhdG9yPiBfX25vZGVfZGVzdHJ1Y3RvcjsKKyAgICB0eXBlZGVmIHVuaXF1ZV9wdHI8X19ub2RlLCBfX25vZGVfZGVzdHJ1Y3Rvcj4gX19ob2xkX3BvaW50ZXI7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19ob2xkX3BvaW50ZXIgX19hbGxvY2F0ZV9ub2RlKF9fbm9kZV9hbGxvY2F0b3ImIF9fbmEpIHsKKyAgICAgIF9fbm9kZV9wb2ludGVyIF9fcCA9IF9fbm9kZV9hbGxvY190cmFpdHM6OmFsbG9jYXRlKF9fbmEsIDEpOworICAgICAgX19wLT5fX3ByZXZfID0gbnVsbHB0cjsKKyAgICAgIHJldHVybiBfX2hvbGRfcG9pbnRlcihfX3AsIF9fbm9kZV9kZXN0cnVjdG9yKF9fbmEsIDEpKTsKKyAgICB9CisKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKworICAgIGJvb2wgX19kZXJlZmVyZW5jZWFibGUoY29uc3QgY29uc3RfaXRlcmF0b3IqIF9faSkgY29uc3Q7CisgICAgYm9vbCBfX2RlY3JlbWVudGFibGUoY29uc3QgY29uc3RfaXRlcmF0b3IqIF9faSkgY29uc3Q7CisgICAgYm9vbCBfX2FkZGFibGUoY29uc3QgY29uc3RfaXRlcmF0b3IqIF9faSwgcHRyZGlmZl90IF9fbikgY29uc3Q7CisgICAgYm9vbCBfX3N1YnNjcmlwdGFibGUoY29uc3QgY29uc3RfaXRlcmF0b3IqIF9faSwgcHRyZGlmZl90IF9fbikgY29uc3Q7CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisKK3ByaXZhdGU6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyB2b2lkIF9fbGlua19ub2RlcyAgKF9fbGlua19wb2ludGVyIF9fcCwgX19saW5rX3BvaW50ZXIgX19mLCBfX2xpbmtfcG9pbnRlciBfX2wpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fbGlua19ub2Rlc19hdF9mcm9udChfX2xpbmtfcG9pbnRlciBfX2YsIF9fbGlua19wb2ludGVyIF9fbCk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19saW5rX25vZGVzX2F0X2JhY2sgKF9fbGlua19wb2ludGVyIF9fZiwgX19saW5rX3BvaW50ZXIgX19sKTsKKyAgICBpdGVyYXRvciBfX2l0ZXJhdG9yKHNpemVfdHlwZSBfX24pOworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ29tcD4KKyAgICAgICAgc3RhdGljIGl0ZXJhdG9yIF9fc29ydChpdGVyYXRvciBfX2YxLCBpdGVyYXRvciBfX2UyLCBzaXplX3R5cGUgX19uLCBfQ29tcCYgX19jb21wKTsKKworICAgIHZvaWQgX19tb3ZlX2Fzc2lnbihsaXN0JiBfX2MsIHRydWVfdHlwZSkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfX25vZGVfYWxsb2NhdG9yPjo6dmFsdWUpOworICAgIHZvaWQgX19tb3ZlX2Fzc2lnbihsaXN0JiBfX2MsIGZhbHNlX3R5cGUpOworfTsKKworLy8gTGluayBpbiBub2RlcyBbX19mLCBfX2xdIGp1c3QgcHJpb3IgdG8gX19wCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUKK3ZvaWQKK2xpc3Q8X1RwLCBfQWxsb2M+OjpfX2xpbmtfbm9kZXMoX19saW5rX3BvaW50ZXIgX19wLCBfX2xpbmtfcG9pbnRlciBfX2YsIF9fbGlua19wb2ludGVyIF9fbCkKK3sKKyAgICBfX3AtPl9fcHJldl8tPl9fbmV4dF8gPSBfX2Y7CisgICAgX19mLT5fX3ByZXZfID0gX19wLT5fX3ByZXZfOworICAgIF9fcC0+X19wcmV2XyA9IF9fbDsKKyAgICBfX2wtPl9fbmV4dF8gPSBfX3A7Cit9CisKKy8vIExpbmsgaW4gbm9kZXMgW19fZiwgX19sXSBhdCB0aGUgZnJvbnQgb2YgdGhlIGxpc3QKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2lubGluZQordm9pZAorbGlzdDxfVHAsIF9BbGxvYz46Ol9fbGlua19ub2Rlc19hdF9mcm9udChfX2xpbmtfcG9pbnRlciBfX2YsIF9fbGlua19wb2ludGVyIF9fbCkKK3sKKyAgICBfX2YtPl9fcHJldl8gPSBiYXNlOjpfX2VuZF9hc19saW5rKCk7CisgICAgX19sLT5fX25leHRfID0gYmFzZTo6X19lbmRfLl9fbmV4dF87CisgICAgX19sLT5fX25leHRfLT5fX3ByZXZfID0gX19sOworICAgIGJhc2U6Ol9fZW5kXy5fX25leHRfID0gX19mOworfQorCisvLyBMaW5rIGluIG5vZGVzIFtfX2YsIF9fbF0gYXQgdGhlIGZyb250IG9mIHRoZSBsaXN0Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUKK3ZvaWQKK2xpc3Q8X1RwLCBfQWxsb2M+OjpfX2xpbmtfbm9kZXNfYXRfYmFjayhfX2xpbmtfcG9pbnRlciBfX2YsIF9fbGlua19wb2ludGVyIF9fbCkKK3sKKyAgICBfX2wtPl9fbmV4dF8gPSBiYXNlOjpfX2VuZF9hc19saW5rKCk7CisgICAgX19mLT5fX3ByZXZfID0gYmFzZTo6X19lbmRfLl9fcHJldl87CisgICAgX19mLT5fX3ByZXZfLT5fX25leHRfID0gX19mOworICAgIGJhc2U6Ol9fZW5kXy5fX3ByZXZfID0gX19sOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2lubGluZQordHlwZW5hbWUgbGlzdDxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCitsaXN0PF9UcCwgX0FsbG9jPjo6X19pdGVyYXRvcihzaXplX3R5cGUgX19uKQoreworICAgIHJldHVybiBfX24gPD0gYmFzZTo6X19zeigpIC8gMiA/IF9WU1REOjpuZXh0KGJlZ2luKCksIF9fbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfVlNURDo6cHJldihlbmQoKSwgYmFzZTo6X19zeigpIC0gX19uKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorbGlzdDxfVHAsIF9BbGxvYz46Omxpc3Qoc2l6ZV90eXBlIF9fbikKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgZm9yICg7IF9fbiA+IDA7IC0tX19uKQorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICAgICAgZW1wbGFjZV9iYWNrKCk7CisjZWxzZQorICAgICAgICBwdXNoX2JhY2sodmFsdWVfdHlwZSgpKTsKKyNlbmRpZgorfQorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2xpc3Q8X1RwLCBfQWxsb2M+OjpsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpIDogYmFzZShfX2EpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIGZvciAoOyBfX24gPiAwOyAtLV9fbikKKyAgICAgICAgZW1wbGFjZV9iYWNrKCk7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorbGlzdDxfVHAsIF9BbGxvYz46Omxpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBmb3IgKDsgX19uID4gMDsgLS1fX24pCisgICAgICAgIHB1c2hfYmFjayhfX3gpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitsaXN0PF9UcCwgX0FsbG9jPjo6bGlzdChzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBiYXNlKF9fYSkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgZm9yICg7IF9fbiA+IDA7IC0tX19uKQorICAgICAgICBwdXNoX2JhY2soX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9JbnBJdGVyPgorbGlzdDxfVHAsIF9BbGxvYz46Omxpc3QoX0lucEl0ZXIgX19mLCBfSW5wSXRlciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19pbnB1dF9pdGVyYXRvcjxfSW5wSXRlcj46OnZhbHVlPjo6dHlwZSopCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIGZvciAoOyBfX2YgIT0gX19sOyArK19fZikKKyAgICAgICAgX19lbXBsYWNlX2JhY2soKl9fZik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wSXRlcj4KK2xpc3Q8X1RwLCBfQWxsb2M+OjpsaXN0KF9JbnBJdGVyIF9fZiwgX0lucEl0ZXIgX19sLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfaW5wdXRfaXRlcmF0b3I8X0lucEl0ZXI+Ojp2YWx1ZT46OnR5cGUqKQorICAgIDogYmFzZShfX2EpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIGZvciAoOyBfX2YgIT0gX19sOyArK19fZikKKyAgICAgICAgX19lbXBsYWNlX2JhY2soKl9fZik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2xpc3Q8X1RwLCBfQWxsb2M+OjpsaXN0KGNvbnN0IGxpc3QmIF9fYykKKyAgICA6IGJhc2UoYWxsb2NhdG9yX3R5cGUoCisgICAgICAgICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OnNlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb24oCisgICAgICAgICAgICAgICAgX19jLl9fbm9kZV9hbGxvYygpKSkpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIGZvciAoY29uc3RfaXRlcmF0b3IgX19pID0gX19jLmJlZ2luKCksIF9fZSA9IF9fYy5lbmQoKTsgX19pICE9IF9fZTsgKytfX2kpCisgICAgICAgIHB1c2hfYmFjaygqX19pKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorbGlzdDxfVHAsIF9BbGxvYz46Omxpc3QoY29uc3QgbGlzdCYgX19jLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogYmFzZShfX2EpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIGZvciAoY29uc3RfaXRlcmF0b3IgX19pID0gX19jLmJlZ2luKCksIF9fZSA9IF9fYy5lbmQoKTsgX19pICE9IF9fZTsgKytfX2kpCisgICAgICAgIHB1c2hfYmFjaygqX19pKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorbGlzdDxfVHAsIF9BbGxvYz46Omxpc3QoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogYmFzZShfX2EpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIGZvciAodHlwZW5hbWUgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPjo6Y29uc3RfaXRlcmF0b3IgX19pID0gX19pbC5iZWdpbigpLAorICAgICAgICAgICAgX19lID0gX19pbC5lbmQoKTsgX19pICE9IF9fZTsgKytfX2kpCisgICAgICAgIHB1c2hfYmFjaygqX19pKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorbGlzdDxfVHAsIF9BbGxvYz46Omxpc3QoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBmb3IgKHR5cGVuYW1lIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT46OmNvbnN0X2l0ZXJhdG9yIF9faSA9IF9faWwuYmVnaW4oKSwKKyAgICAgICAgICAgIF9fZSA9IF9faWwuZW5kKCk7IF9faSAhPSBfX2U7ICsrX19pKQorICAgICAgICBwdXNoX2JhY2soKl9faSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2lubGluZQorbGlzdDxfVHAsIF9BbGxvYz46Omxpc3QobGlzdCYmIF9fYykKKyAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPF9fbm9kZV9hbGxvY2F0b3I+Ojp2YWx1ZSkKKyAgICA6IGJhc2UoYWxsb2NhdG9yX3R5cGUoX1ZTVEQ6Om1vdmUoX19jLl9fbm9kZV9hbGxvYygpKSkpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIHNwbGljZShlbmQoKSwgX19jKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lCitsaXN0PF9UcCwgX0FsbG9jPjo6bGlzdChsaXN0JiYgX19jLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogYmFzZShfX2EpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIGlmIChfX2EgPT0gX19jLmdldF9hbGxvY2F0b3IoKSkKKyAgICAgICAgc3BsaWNlKGVuZCgpLCBfX2MpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHR5cGVkZWYgbW92ZV9pdGVyYXRvcjxpdGVyYXRvcj4gX0lwOworICAgICAgICBhc3NpZ24oX0lwKF9fYy5iZWdpbigpKSwgX0lwKF9fYy5lbmQoKSkpOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lCitsaXN0PF9UcCwgX0FsbG9jPiYKK2xpc3Q8X1RwLCBfQWxsb2M+OjpvcGVyYXRvcj0obGlzdCYmIF9fYykKKyAgICAgICAgX05PRVhDRVBUXygKKyAgICAgICAgICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8X19ub2RlX2FsbG9jYXRvcj46OnZhbHVlKQoreworICAgIF9fbW92ZV9hc3NpZ24oX19jLCBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZT4oKSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitsaXN0PF9UcCwgX0FsbG9jPjo6X19tb3ZlX2Fzc2lnbihsaXN0JiBfX2MsIGZhbHNlX3R5cGUpCit7CisgICAgaWYgKGJhc2U6Ol9fbm9kZV9hbGxvYygpICE9IF9fYy5fX25vZGVfYWxsb2MoKSkKKyAgICB7CisgICAgICAgIHR5cGVkZWYgbW92ZV9pdGVyYXRvcjxpdGVyYXRvcj4gX0lwOworICAgICAgICBhc3NpZ24oX0lwKF9fYy5iZWdpbigpKSwgX0lwKF9fYy5lbmQoKSkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIF9fbW92ZV9hc3NpZ24oX19jLCB0cnVlX3R5cGUoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK2xpc3Q8X1RwLCBfQWxsb2M+OjpfX21vdmVfYXNzaWduKGxpc3QmIF9fYywgdHJ1ZV90eXBlKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPF9fbm9kZV9hbGxvY2F0b3I+Ojp2YWx1ZSkKK3sKKyAgICBjbGVhcigpOworICAgIGJhc2U6Ol9fbW92ZV9hc3NpZ25fYWxsb2MoX19jKTsKKyAgICBzcGxpY2UoZW5kKCksIF9fYyk7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2lubGluZQorbGlzdDxfVHAsIF9BbGxvYz4mCitsaXN0PF9UcCwgX0FsbG9jPjo6b3BlcmF0b3I9KGNvbnN0IGxpc3QmIF9fYykKK3sKKyAgICBpZiAodGhpcyAhPSAmX19jKQorICAgIHsKKyAgICAgICAgYmFzZTo6X19jb3B5X2Fzc2lnbl9hbGxvYyhfX2MpOworICAgICAgICBhc3NpZ24oX19jLmJlZ2luKCksIF9fYy5lbmQoKSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9JbnBJdGVyPgordm9pZAorbGlzdDxfVHAsIF9BbGxvYz46OmFzc2lnbihfSW5wSXRlciBfX2YsIF9JbnBJdGVyIF9fbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfaW5wdXRfaXRlcmF0b3I8X0lucEl0ZXI+Ojp2YWx1ZT46OnR5cGUqKQoreworICAgIGl0ZXJhdG9yIF9faSA9IGJlZ2luKCk7CisgICAgaXRlcmF0b3IgX19lID0gZW5kKCk7CisgICAgZm9yICg7IF9fZiAhPSBfX2wgJiYgX19pICE9IF9fZTsgKytfX2YsICsrX19pKQorICAgICAgICAqX19pID0gKl9fZjsKKyAgICBpZiAoX19pID09IF9fZSkKKyAgICAgICAgaW5zZXJ0KF9fZSwgX19mLCBfX2wpOworICAgIGVsc2UKKyAgICAgICAgZXJhc2UoX19pLCBfX2UpOworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgX19nZXRfZGIoKS0+X19pbnZhbGlkYXRlX2FsbCh0aGlzKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitsaXN0PF9UcCwgX0FsbG9jPjo6YXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKK3sKKyAgICBpdGVyYXRvciBfX2kgPSBiZWdpbigpOworICAgIGl0ZXJhdG9yIF9fZSA9IGVuZCgpOworICAgIGZvciAoOyBfX24gPiAwICYmIF9faSAhPSBfX2U7IC0tX19uLCArK19faSkKKyAgICAgICAgKl9faSA9IF9feDsKKyAgICBpZiAoX19pID09IF9fZSkKKyAgICAgICAgaW5zZXJ0KF9fZSwgX19uLCBfX3gpOworICAgIGVsc2UKKyAgICAgICAgZXJhc2UoX19pLCBfX2UpOworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgX19nZXRfZGIoKS0+X19pbnZhbGlkYXRlX2FsbCh0aGlzKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUKK19BbGxvYworbGlzdDxfVHAsIF9BbGxvYz46OmdldF9hbGxvY2F0b3IoKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gYWxsb2NhdG9yX3R5cGUoYmFzZTo6X19ub2RlX2FsbG9jKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit0eXBlbmFtZSBsaXN0PF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKK2xpc3Q8X1RwLCBfQWxsb2M+OjppbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19maW5kX2NfZnJvbV9pKCZfX3ApID09IHRoaXMsCisgICAgICAgICJsaXN0OjppbnNlcnQoaXRlcmF0b3IsIHgpIGNhbGxlZCB3aXRoIGFuIGl0ZXJhdG9yIG5vdCIKKyAgICAgICAgIiByZWZlcnJpbmcgdG8gdGhpcyBsaXN0Iik7CisjZW5kaWYKKyAgICBfX25vZGVfYWxsb2NhdG9yJiBfX25hID0gYmFzZTo6X19ub2RlX2FsbG9jKCk7CisgICAgX19ob2xkX3BvaW50ZXIgX19ob2xkID0gX19hbGxvY2F0ZV9ub2RlKF9fbmEpOworICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX25hLCBfVlNURDo6YWRkcmVzc29mKF9faG9sZC0+X192YWx1ZV8pLCBfX3gpOworICAgIF9fbGlua19ub2RlcyhfX3AuX19wdHJfLCBfX2hvbGQtPl9fYXNfbGluaygpLCBfX2hvbGQtPl9fYXNfbGluaygpKTsKKyAgICArK2Jhc2U6Ol9fc3ooKTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICByZXR1cm4gaXRlcmF0b3IoX19ob2xkLnJlbGVhc2UoKS0+X19hc19saW5rKCksIHRoaXMpOworI2Vsc2UKKyAgICByZXR1cm4gaXRlcmF0b3IoX19ob2xkLnJlbGVhc2UoKS0+X19hc19saW5rKCkpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3R5cGVuYW1lIGxpc3Q8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorbGlzdDxfVHAsIF9BbGxvYz46Omluc2VydChjb25zdF9pdGVyYXRvciBfX3AsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2ZpbmRfY19mcm9tX2koJl9fcCkgPT0gdGhpcywKKyAgICAgICAgImxpc3Q6Omluc2VydChpdGVyYXRvciwgbiwgeCkgY2FsbGVkIHdpdGggYW4gaXRlcmF0b3Igbm90IgorICAgICAgICAiIHJlZmVycmluZyB0byB0aGlzIGxpc3QiKTsKKyAgICBpdGVyYXRvciBfX3IoX19wLl9fcHRyXywgdGhpcyk7CisjZWxzZQorICAgIGl0ZXJhdG9yIF9fcihfX3AuX19wdHJfKTsKKyNlbmRpZgorICAgIGlmIChfX24gPiAwKQorICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fZHMgPSAwOworICAgICAgICBfX25vZGVfYWxsb2NhdG9yJiBfX25hID0gYmFzZTo6X19ub2RlX2FsbG9jKCk7CisgICAgICAgIF9faG9sZF9wb2ludGVyIF9faG9sZCA9IF9fYWxsb2NhdGVfbm9kZShfX25hKTsKKyAgICAgICAgX19ub2RlX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fbmEsIF9WU1REOjphZGRyZXNzb2YoX19ob2xkLT5fX3ZhbHVlXyksIF9feCk7CisgICAgICAgICsrX19kczsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgX19yID0gaXRlcmF0b3IoX19ob2xkLT5fX2FzX2xpbmsoKSwgdGhpcyk7CisjZWxzZQorICAgICAgICBfX3IgPSBpdGVyYXRvcihfX2hvbGQtPl9fYXNfbGluaygpKTsKKyNlbmRpZgorICAgICAgICBfX2hvbGQucmVsZWFzZSgpOworICAgICAgICBpdGVyYXRvciBfX2UgPSBfX3I7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0cnkKKyAgICAgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIGZvciAoLS1fX247IF9fbiAhPSAwOyAtLV9fbiwgKytfX2UsICsrX19kcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX2hvbGQucmVzZXQoX19ub2RlX2FsbG9jX3RyYWl0czo6YWxsb2NhdGUoX19uYSwgMSkpOworICAgICAgICAgICAgICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX25hLCBfVlNURDo6YWRkcmVzc29mKF9faG9sZC0+X192YWx1ZV8pLCBfX3gpOworICAgICAgICAgICAgICAgIF9fZS5fX3B0cl8tPl9fbmV4dF8gPSBfX2hvbGQtPl9fYXNfbGluaygpOworICAgICAgICAgICAgICAgIF9faG9sZC0+X19wcmV2XyA9IF9fZS5fX3B0cl87CisgICAgICAgICAgICAgICAgX19ob2xkLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKC4uLikKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19ub2RlX2FsbG9jX3RyYWl0czo6ZGVzdHJveShfX25hLCBfVlNURDo6YWRkcmVzc29mKCpfX2UpKTsKKyAgICAgICAgICAgICAgICBfX2xpbmtfcG9pbnRlciBfX3ByZXYgPSBfX2UuX19wdHJfLT5fX3ByZXZfOworICAgICAgICAgICAgICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19uYSwgX19lLl9fcHRyXy0+X19hc19ub2RlKCksIDEpOworICAgICAgICAgICAgICAgIGlmIChfX3ByZXYgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgICAgICAgICAgX19lID0gaXRlcmF0b3IoX19wcmV2LCB0aGlzKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgX19lID0gaXRlcmF0b3IoX19wcmV2KTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIF9fbGlua19ub2RlcyhfX3AuX19wdHJfLCBfX3IuX19wdHJfLCBfX2UuX19wdHJfKTsKKyAgICAgICAgYmFzZTo6X19zeigpICs9IF9fZHM7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wSXRlcj4KK3R5cGVuYW1lIGxpc3Q8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorbGlzdDxfVHAsIF9BbGxvYz46Omluc2VydChjb25zdF9pdGVyYXRvciBfX3AsIF9JbnBJdGVyIF9fZiwgX0lucEl0ZXIgX19sLAorICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX2lucHV0X2l0ZXJhdG9yPF9JbnBJdGVyPjo6dmFsdWU+Ojp0eXBlKikKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2ZpbmRfY19mcm9tX2koJl9fcCkgPT0gdGhpcywKKyAgICAgICAgImxpc3Q6Omluc2VydChpdGVyYXRvciwgcmFuZ2UpIGNhbGxlZCB3aXRoIGFuIGl0ZXJhdG9yIG5vdCIKKyAgICAgICAgIiByZWZlcnJpbmcgdG8gdGhpcyBsaXN0Iik7CisgICAgaXRlcmF0b3IgX19yKF9fcC5fX3B0cl8sIHRoaXMpOworI2Vsc2UKKyAgICBpdGVyYXRvciBfX3IoX19wLl9fcHRyXyk7CisjZW5kaWYKKyAgICBpZiAoX19mICE9IF9fbCkKKyAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX2RzID0gMDsKKyAgICAgICAgX19ub2RlX2FsbG9jYXRvciYgX19uYSA9IGJhc2U6Ol9fbm9kZV9hbGxvYygpOworICAgICAgICBfX2hvbGRfcG9pbnRlciBfX2hvbGQgPSBfX2FsbG9jYXRlX25vZGUoX19uYSk7CisgICAgICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX25hLCBfVlNURDo6YWRkcmVzc29mKF9faG9sZC0+X192YWx1ZV8pLCAqX19mKTsKKyAgICAgICAgKytfX2RzOworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICBfX3IgPSBpdGVyYXRvcihfX2hvbGQuZ2V0KCktPl9fYXNfbGluaygpLCB0aGlzKTsKKyNlbHNlCisgICAgICAgIF9fciA9IGl0ZXJhdG9yKF9faG9sZC5nZXQoKS0+X19hc19saW5rKCkpOworI2VuZGlmCisgICAgICAgIF9faG9sZC5yZWxlYXNlKCk7CisgICAgICAgIGl0ZXJhdG9yIF9fZSA9IF9fcjsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHRyeQorICAgICAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgZm9yICgrK19fZjsgX19mICE9IF9fbDsgKytfX2YsICh2b2lkKSArK19fZSwgKHZvaWQpICsrX19kcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX2hvbGQucmVzZXQoX19ub2RlX2FsbG9jX3RyYWl0czo6YWxsb2NhdGUoX19uYSwgMSkpOworICAgICAgICAgICAgICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX25hLCBfVlNURDo6YWRkcmVzc29mKF9faG9sZC0+X192YWx1ZV8pLCAqX19mKTsKKyAgICAgICAgICAgICAgICBfX2UuX19wdHJfLT5fX25leHRfID0gX19ob2xkLmdldCgpLT5fX2FzX2xpbmsoKTsKKyAgICAgICAgICAgICAgICBfX2hvbGQtPl9fcHJldl8gPSBfX2UuX19wdHJfOworICAgICAgICAgICAgICAgIF9faG9sZC5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB9CisgICAgICAgIGNhdGNoICguLi4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmRlc3Ryb3koX19uYSwgX1ZTVEQ6OmFkZHJlc3NvZigqX19lKSk7CisgICAgICAgICAgICAgICAgX19saW5rX3BvaW50ZXIgX19wcmV2ID0gX19lLl9fcHRyXy0+X19wcmV2XzsKKyAgICAgICAgICAgICAgICBfX25vZGVfYWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKF9fbmEsIF9fZS5fX3B0cl8tPl9fYXNfbm9kZSgpLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAoX19wcmV2ID09IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICAgICAgICAgIF9fZSA9IGl0ZXJhdG9yKF9fcHJldiwgdGhpcyk7CisjZWxzZQorICAgICAgICAgICAgICAgIF9fZSA9IGl0ZXJhdG9yKF9fcHJldik7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93OworICAgICAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICBfX2xpbmtfbm9kZXMoX19wLl9fcHRyXywgX19yLl9fcHRyXywgX19lLl9fcHRyXyk7CisgICAgICAgIGJhc2U6Ol9fc3ooKSArPSBfX2RzOworICAgIH0KKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitsaXN0PF9UcCwgX0FsbG9jPjo6cHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCit7CisgICAgX19ub2RlX2FsbG9jYXRvciYgX19uYSA9IGJhc2U6Ol9fbm9kZV9hbGxvYygpOworICAgIF9faG9sZF9wb2ludGVyIF9faG9sZCA9IF9fYWxsb2NhdGVfbm9kZShfX25hKTsKKyAgICBfX25vZGVfYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19uYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX2hvbGQtPl9fdmFsdWVfKSwgX194KTsKKyAgICBfX2xpbmtfcG9pbnRlciBfX25sID0gX19ob2xkLT5fX2FzX2xpbmsoKTsKKyAgICBfX2xpbmtfbm9kZXNfYXRfZnJvbnQoX19ubCwgX19ubCk7CisgICAgKytiYXNlOjpfX3N6KCk7CisgICAgX19ob2xkLnJlbGVhc2UoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZAorbGlzdDxfVHAsIF9BbGxvYz46OnB1c2hfYmFjayhjb25zdCB2YWx1ZV90eXBlJiBfX3gpCit7CisgICAgX19ub2RlX2FsbG9jYXRvciYgX19uYSA9IGJhc2U6Ol9fbm9kZV9hbGxvYygpOworICAgIF9faG9sZF9wb2ludGVyIF9faG9sZCA9IF9fYWxsb2NhdGVfbm9kZShfX25hKTsKKyAgICBfX25vZGVfYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19uYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX2hvbGQtPl9fdmFsdWVfKSwgX194KTsKKyAgICBfX2xpbmtfbm9kZXNfYXRfYmFjayhfX2hvbGQuZ2V0KCktPl9fYXNfbGluaygpLCBfX2hvbGQuZ2V0KCktPl9fYXNfbGluaygpKTsKKyAgICArK2Jhc2U6Ol9fc3ooKTsKKyAgICBfX2hvbGQucmVsZWFzZSgpOworfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitsaXN0PF9UcCwgX0FsbG9jPjo6cHVzaF9mcm9udCh2YWx1ZV90eXBlJiYgX194KQoreworICAgIF9fbm9kZV9hbGxvY2F0b3ImIF9fbmEgPSBiYXNlOjpfX25vZGVfYWxsb2MoKTsKKyAgICBfX2hvbGRfcG9pbnRlciBfX2hvbGQgPSBfX2FsbG9jYXRlX25vZGUoX19uYSk7CisgICAgX19ub2RlX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fbmEsIF9WU1REOjphZGRyZXNzb2YoX19ob2xkLT5fX3ZhbHVlXyksIF9WU1REOjptb3ZlKF9feCkpOworICAgIF9fbGlua19ub2Rlc19hdF9mcm9udChfX2hvbGQuZ2V0KCktPl9fYXNfbGluaygpLCBfX2hvbGQuZ2V0KCktPl9fYXNfbGluaygpKTsKKyAgICArK2Jhc2U6Ol9fc3ooKTsKKyAgICBfX2hvbGQucmVsZWFzZSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitsaXN0PF9UcCwgX0FsbG9jPjo6cHVzaF9iYWNrKHZhbHVlX3R5cGUmJiBfX3gpCit7CisgICAgX19ub2RlX2FsbG9jYXRvciYgX19uYSA9IGJhc2U6Ol9fbm9kZV9hbGxvYygpOworICAgIF9faG9sZF9wb2ludGVyIF9faG9sZCA9IF9fYWxsb2NhdGVfbm9kZShfX25hKTsKKyAgICBfX25vZGVfYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19uYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX2hvbGQtPl9fdmFsdWVfKSwgX1ZTVEQ6Om1vdmUoX194KSk7CisgICAgX19saW5rX25vZGVzX2F0X2JhY2soX19ob2xkLmdldCgpLT5fX2FzX2xpbmsoKSwgX19ob2xkLmdldCgpLT5fX2FzX2xpbmsoKSk7CisgICAgKytiYXNlOjpfX3N6KCk7CisgICAgX19ob2xkLnJlbGVhc2UoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0Cit0eXBlbmFtZSBsaXN0PF9UcCwgX0FsbG9jPjo6cmVmZXJlbmNlCisjZWxzZQordm9pZAorI2VuZGlmCitsaXN0PF9UcCwgX0FsbG9jPjo6ZW1wbGFjZV9mcm9udChfQXJncyYmLi4uIF9fYXJncykKK3sKKyAgICBfX25vZGVfYWxsb2NhdG9yJiBfX25hID0gYmFzZTo6X19ub2RlX2FsbG9jKCk7CisgICAgX19ob2xkX3BvaW50ZXIgX19ob2xkID0gX19hbGxvY2F0ZV9ub2RlKF9fbmEpOworICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX25hLCBfVlNURDo6YWRkcmVzc29mKF9faG9sZC0+X192YWx1ZV8pLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgX19saW5rX25vZGVzX2F0X2Zyb250KF9faG9sZC5nZXQoKS0+X19hc19saW5rKCksIF9faG9sZC5nZXQoKS0+X19hc19saW5rKCkpOworICAgICsrYmFzZTo6X19zeigpOworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisgICAgcmV0dXJuIF9faG9sZC5yZWxlYXNlKCktPl9fdmFsdWVfOworI2Vsc2UKKyAgICBfX2hvbGQucmVsZWFzZSgpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAordHlwZW5hbWUgbGlzdDxfVHAsIF9BbGxvYz46OnJlZmVyZW5jZQorI2Vsc2UKK3ZvaWQKKyNlbmRpZgorbGlzdDxfVHAsIF9BbGxvYz46OmVtcGxhY2VfYmFjayhfQXJncyYmLi4uIF9fYXJncykKK3sKKyAgICBfX25vZGVfYWxsb2NhdG9yJiBfX25hID0gYmFzZTo6X19ub2RlX2FsbG9jKCk7CisgICAgX19ob2xkX3BvaW50ZXIgX19ob2xkID0gX19hbGxvY2F0ZV9ub2RlKF9fbmEpOworICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX25hLCBfVlNURDo6YWRkcmVzc29mKF9faG9sZC0+X192YWx1ZV8pLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgX19saW5rX3BvaW50ZXIgX19ubCA9IF9faG9sZC0+X19hc19saW5rKCk7CisgICAgX19saW5rX25vZGVzX2F0X2JhY2soX19ubCwgX19ubCk7CisgICAgKytiYXNlOjpfX3N6KCk7CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKyAgICByZXR1cm4gX19ob2xkLnJlbGVhc2UoKS0+X192YWx1ZV87CisjZWxzZQorICAgIF9faG9sZC5yZWxlYXNlKCk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgordHlwZW5hbWUgbGlzdDxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCitsaXN0PF9UcCwgX0FsbG9jPjo6ZW1wbGFjZShjb25zdF9pdGVyYXRvciBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZmluZF9jX2Zyb21faSgmX19wKSA9PSB0aGlzLAorICAgICAgICAibGlzdDo6ZW1wbGFjZShpdGVyYXRvciwgYXJncy4uLikgY2FsbGVkIHdpdGggYW4gaXRlcmF0b3Igbm90IgorICAgICAgICAiIHJlZmVycmluZyB0byB0aGlzIGxpc3QiKTsKKyNlbmRpZgorICAgIF9fbm9kZV9hbGxvY2F0b3ImIF9fbmEgPSBiYXNlOjpfX25vZGVfYWxsb2MoKTsKKyAgICBfX2hvbGRfcG9pbnRlciBfX2hvbGQgPSBfX2FsbG9jYXRlX25vZGUoX19uYSk7CisgICAgX19ub2RlX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fbmEsIF9WU1REOjphZGRyZXNzb2YoX19ob2xkLT5fX3ZhbHVlXyksIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICBfX2xpbmtfcG9pbnRlciBfX25sID0gX19ob2xkLmdldCgpLT5fX2FzX2xpbmsoKTsKKyAgICBfX2xpbmtfbm9kZXMoX19wLl9fcHRyXywgX19ubCwgX19ubCk7CisgICAgKytiYXNlOjpfX3N6KCk7CisgICAgX19ob2xkLnJlbGVhc2UoKTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICByZXR1cm4gaXRlcmF0b3IoX19ubCwgdGhpcyk7CisjZWxzZQorICAgIHJldHVybiBpdGVyYXRvcihfX25sKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit0eXBlbmFtZSBsaXN0PF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKK2xpc3Q8X1RwLCBfQWxsb2M+OjppbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wLCB2YWx1ZV90eXBlJiYgX194KQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZmluZF9jX2Zyb21faSgmX19wKSA9PSB0aGlzLAorICAgICAgICAibGlzdDo6aW5zZXJ0KGl0ZXJhdG9yLCB4KSBjYWxsZWQgd2l0aCBhbiBpdGVyYXRvciBub3QiCisgICAgICAgICIgcmVmZXJyaW5nIHRvIHRoaXMgbGlzdCIpOworI2VuZGlmCisgICAgX19ub2RlX2FsbG9jYXRvciYgX19uYSA9IGJhc2U6Ol9fbm9kZV9hbGxvYygpOworICAgIF9faG9sZF9wb2ludGVyIF9faG9sZCA9IF9fYWxsb2NhdGVfbm9kZShfX25hKTsKKyAgICBfX25vZGVfYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19uYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX2hvbGQtPl9fdmFsdWVfKSwgX1ZTVEQ6Om1vdmUoX194KSk7CisgICAgX19saW5rX3BvaW50ZXIgX19ubCA9IF9faG9sZC0+X19hc19saW5rKCk7CisgICAgX19saW5rX25vZGVzKF9fcC5fX3B0cl8sIF9fbmwsIF9fbmwpOworICAgICsrYmFzZTo6X19zeigpOworICAgIF9faG9sZC5yZWxlYXNlKCk7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgcmV0dXJuIGl0ZXJhdG9yKF9fbmwsIHRoaXMpOworI2Vsc2UKKyAgICByZXR1cm4gaXRlcmF0b3IoX19ubCk7CisjZW5kaWYKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZAorbGlzdDxfVHAsIF9BbGxvYz46OnBvcF9mcm9udCgpCit7CisgICAgX0xJQkNQUF9BU1NFUlQoIWVtcHR5KCksICJsaXN0Ojpwb3BfZnJvbnQoKSBjYWxsZWQgd2l0aCBlbXB0eSBsaXN0Iik7CisgICAgX19ub2RlX2FsbG9jYXRvciYgX19uYSA9IGJhc2U6Ol9fbm9kZV9hbGxvYygpOworICAgIF9fbGlua19wb2ludGVyIF9fbiA9IGJhc2U6Ol9fZW5kXy5fX25leHRfOworICAgIGJhc2U6Ol9fdW5saW5rX25vZGVzKF9fbiwgX19uKTsKKyAgICAtLWJhc2U6Ol9fc3ooKTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2Nfbm9kZSogX19jID0gX19nZXRfZGIoKS0+X19maW5kX2NfYW5kX2xvY2sodGhpcyk7CisgICAgZm9yIChfX2lfbm9kZSoqIF9fcCA9IF9fYy0+ZW5kXzsgX19wICE9IF9fYy0+YmVnXzsgKQorICAgIHsKKyAgICAgICAgLS1fX3A7CisgICAgICAgIGl0ZXJhdG9yKiBfX2kgPSBzdGF0aWNfY2FzdDxpdGVyYXRvcio+KCgqX19wKS0+X19pXyk7CisgICAgICAgIGlmIChfX2ktPl9fcHRyXyA9PSBfX24pCisgICAgICAgIHsKKyAgICAgICAgICAgICgqX19wKS0+X19jXyA9IG51bGxwdHI7CisgICAgICAgICAgICBpZiAoLS1fX2MtPmVuZF8gIT0gX19wKQorICAgICAgICAgICAgICAgIG1lbW1vdmUoX19wLCBfX3ArMSwgKF9fYy0+ZW5kXyAtIF9fcCkqc2l6ZW9mKF9faV9ub2RlKikpOworICAgICAgICB9CisgICAgfQorICAgIF9fZ2V0X2RiKCktPnVubG9jaygpOworI2VuZGlmCisgICAgX19ub2RlX3BvaW50ZXIgX19ucCA9IF9fbi0+X19hc19ub2RlKCk7CisgICAgX19ub2RlX2FsbG9jX3RyYWl0czo6ZGVzdHJveShfX25hLCBfVlNURDo6YWRkcmVzc29mKF9fbnAtPl9fdmFsdWVfKSk7CisgICAgX19ub2RlX2FsbG9jX3RyYWl0czo6ZGVhbGxvY2F0ZShfX25hLCBfX25wLCAxKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZAorbGlzdDxfVHAsIF9BbGxvYz46OnBvcF9iYWNrKCkKK3sKKyAgICBfTElCQ1BQX0FTU0VSVCghZW1wdHkoKSwgImxpc3Q6OnBvcF9iYWNrKCkgY2FsbGVkIHdpdGggZW1wdHkgbGlzdCIpOworICAgIF9fbm9kZV9hbGxvY2F0b3ImIF9fbmEgPSBiYXNlOjpfX25vZGVfYWxsb2MoKTsKKyAgICBfX2xpbmtfcG9pbnRlciBfX24gPSBiYXNlOjpfX2VuZF8uX19wcmV2XzsKKyAgICBiYXNlOjpfX3VubGlua19ub2RlcyhfX24sIF9fbik7CisgICAgLS1iYXNlOjpfX3N6KCk7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19jX25vZGUqIF9fYyA9IF9fZ2V0X2RiKCktPl9fZmluZF9jX2FuZF9sb2NrKHRoaXMpOworICAgIGZvciAoX19pX25vZGUqKiBfX3AgPSBfX2MtPmVuZF87IF9fcCAhPSBfX2MtPmJlZ187ICkKKyAgICB7CisgICAgICAgIC0tX19wOworICAgICAgICBpdGVyYXRvciogX19pID0gc3RhdGljX2Nhc3Q8aXRlcmF0b3IqPigoKl9fcCktPl9faV8pOworICAgICAgICBpZiAoX19pLT5fX3B0cl8gPT0gX19uKQorICAgICAgICB7CisgICAgICAgICAgICAoKl9fcCktPl9fY18gPSBudWxscHRyOworICAgICAgICAgICAgaWYgKC0tX19jLT5lbmRfICE9IF9fcCkKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKF9fcCwgX19wKzEsIChfX2MtPmVuZF8gLSBfX3ApKnNpemVvZihfX2lfbm9kZSopKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2dldF9kYigpLT51bmxvY2soKTsKKyNlbmRpZgorICAgIF9fbm9kZV9wb2ludGVyIF9fbnAgPSBfX24tPl9fYXNfbm9kZSgpOworICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmRlc3Ryb3koX19uYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX25wLT5fX3ZhbHVlXykpOworICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19uYSwgX19ucCwgMSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3R5cGVuYW1lIGxpc3Q8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorbGlzdDxfVHAsIF9BbGxvYz46OmVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2ZpbmRfY19mcm9tX2koJl9fcCkgPT0gdGhpcywKKyAgICAgICAgImxpc3Q6OmVyYXNlKGl0ZXJhdG9yKSBjYWxsZWQgd2l0aCBhbiBpdGVyYXRvciBub3QiCisgICAgICAgICIgcmVmZXJyaW5nIHRvIHRoaXMgbGlzdCIpOworI2VuZGlmCisgICAgX0xJQkNQUF9BU1NFUlQoX19wICE9IGVuZCgpLAorICAgICAgICAibGlzdDo6ZXJhc2UoaXRlcmF0b3IpIGNhbGxlZCB3aXRoIGEgbm9uLWRlcmVmZXJlbmNlYWJsZSBpdGVyYXRvciIpOworICAgIF9fbm9kZV9hbGxvY2F0b3ImIF9fbmEgPSBiYXNlOjpfX25vZGVfYWxsb2MoKTsKKyAgICBfX2xpbmtfcG9pbnRlciBfX24gPSBfX3AuX19wdHJfOworICAgIF9fbGlua19wb2ludGVyIF9fciA9IF9fbi0+X19uZXh0XzsKKyAgICBiYXNlOjpfX3VubGlua19ub2RlcyhfX24sIF9fbik7CisgICAgLS1iYXNlOjpfX3N6KCk7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19jX25vZGUqIF9fYyA9IF9fZ2V0X2RiKCktPl9fZmluZF9jX2FuZF9sb2NrKHRoaXMpOworICAgIGZvciAoX19pX25vZGUqKiBfX2lwID0gX19jLT5lbmRfOyBfX2lwICE9IF9fYy0+YmVnXzsgKQorICAgIHsKKyAgICAgICAgLS1fX2lwOworICAgICAgICBpdGVyYXRvciogX19pID0gc3RhdGljX2Nhc3Q8aXRlcmF0b3IqPigoKl9faXApLT5fX2lfKTsKKyAgICAgICAgaWYgKF9faS0+X19wdHJfID09IF9fbikKKyAgICAgICAgeworICAgICAgICAgICAgKCpfX2lwKS0+X19jXyA9IG51bGxwdHI7CisgICAgICAgICAgICBpZiAoLS1fX2MtPmVuZF8gIT0gX19pcCkKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKF9faXAsIF9faXArMSwgKF9fYy0+ZW5kXyAtIF9faXApKnNpemVvZihfX2lfbm9kZSopKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2dldF9kYigpLT51bmxvY2soKTsKKyNlbmRpZgorICAgIF9fbm9kZV9wb2ludGVyIF9fbnAgPSBfX24tPl9fYXNfbm9kZSgpOworICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmRlc3Ryb3koX19uYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX25wLT5fX3ZhbHVlXykpOworICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19uYSwgX19ucCwgMSk7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgcmV0dXJuIGl0ZXJhdG9yKF9fciwgdGhpcyk7CisjZWxzZQorICAgIHJldHVybiBpdGVyYXRvcihfX3IpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3R5cGVuYW1lIGxpc3Q8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorbGlzdDxfVHAsIF9BbGxvYz46OmVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZmluZF9jX2Zyb21faSgmX19mKSA9PSB0aGlzLAorICAgICAgICAibGlzdDo6ZXJhc2UoaXRlcmF0b3IsIGl0ZXJhdG9yKSBjYWxsZWQgd2l0aCBhbiBpdGVyYXRvciBub3QiCisgICAgICAgICIgcmVmZXJyaW5nIHRvIHRoaXMgbGlzdCIpOworICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19maW5kX2NfZnJvbV9pKCZfX2wpID09IHRoaXMsCisgICAgICAgICJsaXN0OjplcmFzZShpdGVyYXRvciwgaXRlcmF0b3IpIGNhbGxlZCB3aXRoIGFuIGl0ZXJhdG9yIG5vdCIKKyAgICAgICAgIiByZWZlcnJpbmcgdG8gdGhpcyBsaXN0Iik7CisjZW5kaWYKKyAgICBpZiAoX19mICE9IF9fbCkKKyAgICB7CisgICAgICAgIF9fbm9kZV9hbGxvY2F0b3ImIF9fbmEgPSBiYXNlOjpfX25vZGVfYWxsb2MoKTsKKyAgICAgICAgYmFzZTo6X191bmxpbmtfbm9kZXMoX19mLl9fcHRyXywgX19sLl9fcHRyXy0+X19wcmV2Xyk7CisgICAgICAgIHdoaWxlIChfX2YgIT0gX19sKQorICAgICAgICB7CisgICAgICAgICAgICBfX2xpbmtfcG9pbnRlciBfX24gPSBfX2YuX19wdHJfOworICAgICAgICAgICAgKytfX2Y7CisgICAgICAgICAgICAtLWJhc2U6Ol9fc3ooKTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgICAgIF9fY19ub2RlKiBfX2MgPSBfX2dldF9kYigpLT5fX2ZpbmRfY19hbmRfbG9jayh0aGlzKTsKKyAgICAgICAgICAgIGZvciAoX19pX25vZGUqKiBfX3AgPSBfX2MtPmVuZF87IF9fcCAhPSBfX2MtPmJlZ187ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAtLV9fcDsKKyAgICAgICAgICAgICAgICBpdGVyYXRvciogX19pID0gc3RhdGljX2Nhc3Q8aXRlcmF0b3IqPigoKl9fcCktPl9faV8pOworICAgICAgICAgICAgICAgIGlmIChfX2ktPl9fcHRyXyA9PSBfX24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAoKl9fcCktPl9fY18gPSBudWxscHRyOworICAgICAgICAgICAgICAgICAgICBpZiAoLS1fX2MtPmVuZF8gIT0gX19wKQorICAgICAgICAgICAgICAgICAgICAgICAgbWVtbW92ZShfX3AsIF9fcCsxLCAoX19jLT5lbmRfIC0gX19wKSpzaXplb2YoX19pX25vZGUqKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX19nZXRfZGIoKS0+dW5sb2NrKCk7CisjZW5kaWYKKyAgICAgICAgICAgIF9fbm9kZV9wb2ludGVyIF9fbnAgPSBfX24tPl9fYXNfbm9kZSgpOworICAgICAgICAgICAgX19ub2RlX2FsbG9jX3RyYWl0czo6ZGVzdHJveShfX25hLCBfVlNURDo6YWRkcmVzc29mKF9fbnAtPl9fdmFsdWVfKSk7CisgICAgICAgICAgICBfX25vZGVfYWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKF9fbmEsIF9fbnAsIDEpOworICAgICAgICB9CisgICAgfQorI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIHJldHVybiBpdGVyYXRvcihfX2wuX19wdHJfLCB0aGlzKTsKKyNlbHNlCisgICAgcmV0dXJuIGl0ZXJhdG9yKF9fbC5fX3B0cl8pOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK2xpc3Q8X1RwLCBfQWxsb2M+OjpyZXNpemUoc2l6ZV90eXBlIF9fbikKK3sKKyAgICBpZiAoX19uIDwgYmFzZTo6X19zeigpKQorICAgICAgICBlcmFzZShfX2l0ZXJhdG9yKF9fbiksIGVuZCgpKTsKKyAgICBlbHNlIGlmIChfX24gPiBiYXNlOjpfX3N6KCkpCisgICAgeworICAgICAgICBfX24gLT0gYmFzZTo6X19zeigpOworICAgICAgICBzaXplX3R5cGUgX19kcyA9IDA7CisgICAgICAgIF9fbm9kZV9hbGxvY2F0b3ImIF9fbmEgPSBiYXNlOjpfX25vZGVfYWxsb2MoKTsKKyAgICAgICAgX19ob2xkX3BvaW50ZXIgX19ob2xkID0gX19hbGxvY2F0ZV9ub2RlKF9fbmEpOworICAgICAgICBfX25vZGVfYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19uYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX2hvbGQtPl9fdmFsdWVfKSk7CisgICAgICAgICsrX19kczsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgaXRlcmF0b3IgX19yID0gaXRlcmF0b3IoX19ob2xkLnJlbGVhc2UoKS0+X19hc19saW5rKCksIHRoaXMpOworI2Vsc2UKKyAgICAgICAgaXRlcmF0b3IgX19yID0gaXRlcmF0b3IoX19ob2xkLnJlbGVhc2UoKS0+X19hc19saW5rKCkpOworI2VuZGlmCisgICAgICAgIGl0ZXJhdG9yIF9fZSA9IF9fcjsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHRyeQorICAgICAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgZm9yICgtLV9fbjsgX19uICE9IDA7IC0tX19uLCArK19fZSwgKytfX2RzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9faG9sZC5yZXNldChfX25vZGVfYWxsb2NfdHJhaXRzOjphbGxvY2F0ZShfX25hLCAxKSk7CisgICAgICAgICAgICAgICAgX19ub2RlX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fbmEsIF9WU1REOjphZGRyZXNzb2YoX19ob2xkLT5fX3ZhbHVlXykpOworICAgICAgICAgICAgICAgIF9fZS5fX3B0cl8tPl9fbmV4dF8gPSBfX2hvbGQuZ2V0KCktPl9fYXNfbGluaygpOworICAgICAgICAgICAgICAgIF9faG9sZC0+X19wcmV2XyA9IF9fZS5fX3B0cl87CisgICAgICAgICAgICAgICAgX19ob2xkLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKC4uLikKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19ub2RlX2FsbG9jX3RyYWl0czo6ZGVzdHJveShfX25hLCBfVlNURDo6YWRkcmVzc29mKCpfX2UpKTsKKyAgICAgICAgICAgICAgICBfX2xpbmtfcG9pbnRlciBfX3ByZXYgPSBfX2UuX19wdHJfLT5fX3ByZXZfOworICAgICAgICAgICAgICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19uYSwgX19lLl9fcHRyXy0+X19hc19ub2RlKCksIDEpOworICAgICAgICAgICAgICAgIGlmIChfX3ByZXYgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgICAgICAgICAgX19lID0gaXRlcmF0b3IoX19wcmV2LCB0aGlzKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgX19lID0gaXRlcmF0b3IoX19wcmV2KTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIF9fbGlua19ub2Rlc19hdF9iYWNrKF9fci5fX3B0cl8sIF9fZS5fX3B0cl8pOworICAgICAgICBiYXNlOjpfX3N6KCkgKz0gX19kczsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK2xpc3Q8X1RwLCBfQWxsb2M+OjpyZXNpemUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQoreworICAgIGlmIChfX24gPCBiYXNlOjpfX3N6KCkpCisgICAgICAgIGVyYXNlKF9faXRlcmF0b3IoX19uKSwgZW5kKCkpOworICAgIGVsc2UgaWYgKF9fbiA+IGJhc2U6Ol9fc3ooKSkKKyAgICB7CisgICAgICAgIF9fbiAtPSBiYXNlOjpfX3N6KCk7CisgICAgICAgIHNpemVfdHlwZSBfX2RzID0gMDsKKyAgICAgICAgX19ub2RlX2FsbG9jYXRvciYgX19uYSA9IGJhc2U6Ol9fbm9kZV9hbGxvYygpOworICAgICAgICBfX2hvbGRfcG9pbnRlciBfX2hvbGQgPSBfX2FsbG9jYXRlX25vZGUoX19uYSk7CisgICAgICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX25hLCBfVlNURDo6YWRkcmVzc29mKF9faG9sZC0+X192YWx1ZV8pLCBfX3gpOworICAgICAgICArK19fZHM7CisgICAgICAgIF9fbGlua19wb2ludGVyIF9fbmwgPSBfX2hvbGQucmVsZWFzZSgpLT5fX2FzX2xpbmsoKTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgaXRlcmF0b3IgX19yID0gaXRlcmF0b3IoX19ubCwgdGhpcyk7CisjZWxzZQorICAgICAgICBpdGVyYXRvciBfX3IgPSBpdGVyYXRvcihfX25sKTsKKyNlbmRpZgorICAgICAgICBpdGVyYXRvciBfX2UgPSBfX3I7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0cnkKKyAgICAgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIGZvciAoLS1fX247IF9fbiAhPSAwOyAtLV9fbiwgKytfX2UsICsrX19kcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX2hvbGQucmVzZXQoX19ub2RlX2FsbG9jX3RyYWl0czo6YWxsb2NhdGUoX19uYSwgMSkpOworICAgICAgICAgICAgICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX25hLCBfVlNURDo6YWRkcmVzc29mKF9faG9sZC0+X192YWx1ZV8pLCBfX3gpOworICAgICAgICAgICAgICAgIF9fZS5fX3B0cl8tPl9fbmV4dF8gPSBfX2hvbGQuZ2V0KCktPl9fYXNfbGluaygpOworICAgICAgICAgICAgICAgIF9faG9sZC0+X19wcmV2XyA9IF9fZS5fX3B0cl87CisgICAgICAgICAgICAgICAgX19ob2xkLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKC4uLikKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19ub2RlX2FsbG9jX3RyYWl0czo6ZGVzdHJveShfX25hLCBfVlNURDo6YWRkcmVzc29mKCpfX2UpKTsKKyAgICAgICAgICAgICAgICBfX2xpbmtfcG9pbnRlciBfX3ByZXYgPSBfX2UuX19wdHJfLT5fX3ByZXZfOworICAgICAgICAgICAgICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19uYSwgX19lLl9fcHRyXy0+X19hc19ub2RlKCksIDEpOworICAgICAgICAgICAgICAgIGlmIChfX3ByZXYgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgICAgICAgICAgX19lID0gaXRlcmF0b3IoX19wcmV2LCB0aGlzKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgX19lID0gaXRlcmF0b3IoX19wcmV2KTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIF9fbGlua19ub2RlcyhiYXNlOjpfX2VuZF9hc19saW5rKCksIF9fci5fX3B0cl8sIF9fZS5fX3B0cl8pOworICAgICAgICBiYXNlOjpfX3N6KCkgKz0gX19kczsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK2xpc3Q8X1RwLCBfQWxsb2M+OjpzcGxpY2UoY29uc3RfaXRlcmF0b3IgX19wLCBsaXN0JiBfX2MpCit7CisgICAgX0xJQkNQUF9BU1NFUlQodGhpcyAhPSAmX19jLAorICAgICAgICAgICAgICAgICAgICJsaXN0OjpzcGxpY2UoaXRlcmF0b3IsIGxpc3QpIGNhbGxlZCB3aXRoIHRoaXMgPT0gJmxpc3QiKTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2ZpbmRfY19mcm9tX2koJl9fcCkgPT0gdGhpcywKKyAgICAgICAgImxpc3Q6OnNwbGljZShpdGVyYXRvciwgbGlzdCkgY2FsbGVkIHdpdGggYW4gaXRlcmF0b3Igbm90IgorICAgICAgICAiIHJlZmVycmluZyB0byB0aGlzIGxpc3QiKTsKKyNlbmRpZgorICAgIGlmICghX19jLmVtcHR5KCkpCisgICAgeworICAgICAgICBfX2xpbmtfcG9pbnRlciBfX2YgPSBfX2MuX19lbmRfLl9fbmV4dF87CisgICAgICAgIF9fbGlua19wb2ludGVyIF9fbCA9IF9fYy5fX2VuZF8uX19wcmV2XzsKKyAgICAgICAgYmFzZTo6X191bmxpbmtfbm9kZXMoX19mLCBfX2wpOworICAgICAgICBfX2xpbmtfbm9kZXMoX19wLl9fcHRyXywgX19mLCBfX2wpOworICAgICAgICBiYXNlOjpfX3N6KCkgKz0gX19jLl9fc3ooKTsKKyAgICAgICAgX19jLl9fc3ooKSA9IDA7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgIF9fbGliY3BwX2RiKiBfX2RiID0gX19nZXRfZGIoKTsKKyAgICAgICAgX19jX25vZGUqIF9fY24xID0gX19kYi0+X19maW5kX2NfYW5kX2xvY2sodGhpcyk7CisgICAgICAgIF9fY19ub2RlKiBfX2NuMiA9IF9fZGItPl9fZmluZF9jKCZfX2MpOworICAgICAgICBmb3IgKF9faV9ub2RlKiogX19pcCA9IF9fY24yLT5lbmRfOyBfX2lwICE9IF9fY24yLT5iZWdfOykKKyAgICAgICAgeworICAgICAgICAgICAgLS1fX2lwOworICAgICAgICAgICAgaXRlcmF0b3IqIF9faSA9IHN0YXRpY19jYXN0PGl0ZXJhdG9yKj4oKCpfX2lwKS0+X19pXyk7CisgICAgICAgICAgICBpZiAoX19pLT5fX3B0cl8gIT0gX19jLl9fZW5kX2FzX2xpbmsoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX2NuMS0+X19hZGQoKl9faXApOworICAgICAgICAgICAgICAgICgqX19pcCktPl9fY18gPSBfX2NuMTsKKyAgICAgICAgICAgICAgICBpZiAoLS1fX2NuMi0+ZW5kXyAhPSBfX2lwKQorICAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKF9faXAsIF9faXArMSwgKF9fY24yLT5lbmRfIC0gX19pcCkqc2l6ZW9mKF9faV9ub2RlKikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fZGItPnVubG9jaygpOworI2VuZGlmCisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitsaXN0PF9UcCwgX0FsbG9jPjo6c3BsaWNlKGNvbnN0X2l0ZXJhdG9yIF9fcCwgbGlzdCYgX19jLCBjb25zdF9pdGVyYXRvciBfX2kpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19maW5kX2NfZnJvbV9pKCZfX3ApID09IHRoaXMsCisgICAgICAgICJsaXN0OjpzcGxpY2UoaXRlcmF0b3IsIGxpc3QsIGl0ZXJhdG9yKSBjYWxsZWQgd2l0aCBmaXJzdCBpdGVyYXRvciBub3QiCisgICAgICAgICIgcmVmZXJyaW5nIHRvIHRoaXMgbGlzdCIpOworICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZmluZF9jX2Zyb21faSgmX19pKSA9PSAmX19jLAorICAgICAgICAibGlzdDo6c3BsaWNlKGl0ZXJhdG9yLCBsaXN0LCBpdGVyYXRvcikgY2FsbGVkIHdpdGggc2Vjb25kIGl0ZXJhdG9yIG5vdCIKKyAgICAgICAgIiByZWZlcnJpbmcgdG8gbGlzdCBhcmd1bWVudCIpOworICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZGVyZWZlcmVuY2VhYmxlKCZfX2kpLAorICAgICAgICAibGlzdDo6c3BsaWNlKGl0ZXJhdG9yLCBsaXN0LCBpdGVyYXRvcikgY2FsbGVkIHdpdGggc2Vjb25kIGl0ZXJhdG9yIG5vdCIKKyAgICAgICAgIiBkZXJlZmVyZWNlYWJsZSIpOworI2VuZGlmCisgICAgaWYgKF9fcC5fX3B0cl8gIT0gX19pLl9fcHRyXyAmJiBfX3AuX19wdHJfICE9IF9faS5fX3B0cl8tPl9fbmV4dF8pCisgICAgeworICAgICAgICBfX2xpbmtfcG9pbnRlciBfX2YgPSBfX2kuX19wdHJfOworICAgICAgICBiYXNlOjpfX3VubGlua19ub2RlcyhfX2YsIF9fZik7CisgICAgICAgIF9fbGlua19ub2RlcyhfX3AuX19wdHJfLCBfX2YsIF9fZik7CisgICAgICAgIC0tX19jLl9fc3ooKTsKKyAgICAgICAgKytiYXNlOjpfX3N6KCk7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgIF9fbGliY3BwX2RiKiBfX2RiID0gX19nZXRfZGIoKTsKKyAgICAgICAgX19jX25vZGUqIF9fY24xID0gX19kYi0+X19maW5kX2NfYW5kX2xvY2sodGhpcyk7CisgICAgICAgIF9fY19ub2RlKiBfX2NuMiA9IF9fZGItPl9fZmluZF9jKCZfX2MpOworICAgICAgICBmb3IgKF9faV9ub2RlKiogX19pcCA9IF9fY24yLT5lbmRfOyBfX2lwICE9IF9fY24yLT5iZWdfOykKKyAgICAgICAgeworICAgICAgICAgICAgLS1fX2lwOworICAgICAgICAgICAgaXRlcmF0b3IqIF9faiA9IHN0YXRpY19jYXN0PGl0ZXJhdG9yKj4oKCpfX2lwKS0+X19pXyk7CisgICAgICAgICAgICBpZiAoX19qLT5fX3B0cl8gPT0gX19mKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fY24xLT5fX2FkZCgqX19pcCk7CisgICAgICAgICAgICAgICAgKCpfX2lwKS0+X19jXyA9IF9fY24xOworICAgICAgICAgICAgICAgIGlmICgtLV9fY24yLT5lbmRfICE9IF9faXApCisgICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoX19pcCwgX19pcCsxLCAoX19jbjItPmVuZF8gLSBfX2lwKSpzaXplb2YoX19pX25vZGUqKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX19kYi0+dW5sb2NrKCk7CisjZW5kaWYKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK2xpc3Q8X1RwLCBfQWxsb2M+OjpzcGxpY2UoY29uc3RfaXRlcmF0b3IgX19wLCBsaXN0JiBfX2MsIGNvbnN0X2l0ZXJhdG9yIF9fZiwgY29uc3RfaXRlcmF0b3IgX19sKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZmluZF9jX2Zyb21faSgmX19wKSA9PSB0aGlzLAorICAgICAgICAibGlzdDo6c3BsaWNlKGl0ZXJhdG9yLCBsaXN0LCBpdGVyYXRvciwgaXRlcmF0b3IpIGNhbGxlZCB3aXRoIGZpcnN0IGl0ZXJhdG9yIG5vdCIKKyAgICAgICAgIiByZWZlcnJpbmcgdG8gdGhpcyBsaXN0Iik7CisgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19maW5kX2NfZnJvbV9pKCZfX2YpID09ICZfX2MsCisgICAgICAgICJsaXN0OjpzcGxpY2UoaXRlcmF0b3IsIGxpc3QsIGl0ZXJhdG9yLCBpdGVyYXRvcikgY2FsbGVkIHdpdGggc2Vjb25kIGl0ZXJhdG9yIG5vdCIKKyAgICAgICAgIiByZWZlcnJpbmcgdG8gbGlzdCBhcmd1bWVudCIpOworICAgIGlmICh0aGlzID09ICZfX2MpCisgICAgeworICAgICAgICBmb3IgKGNvbnN0X2l0ZXJhdG9yIF9faSA9IF9fZjsgX19pICE9IF9fbDsgKytfX2kpCisgICAgICAgICAgICBfTElCQ1BQX0FTU0VSVChfX2kgIT0gX19wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3Q6OnNwbGljZShpdGVyYXRvciwgbGlzdCwgaXRlcmF0b3IsIGl0ZXJhdG9yKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY2FsbGVkIHdpdGggdGhlIGZpcnN0IGl0ZXJhdG9yIHdpdGhpbiB0aGUgcmFuZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9mIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGl0ZXJhdG9ycyIpOworICAgIH0KKyNlbmRpZgorICAgIGlmIChfX2YgIT0gX19sKQorICAgIHsKKyAgICAgICAgX19saW5rX3BvaW50ZXIgX19maXJzdCA9IF9fZi5fX3B0cl87CisgICAgICAgIC0tX19sOworICAgICAgICBfX2xpbmtfcG9pbnRlciBfX2xhc3QgPSBfX2wuX19wdHJfOworICAgICAgICBpZiAodGhpcyAhPSAmX19jKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplX3R5cGUgX19zID0gX1ZTVEQ6OmRpc3RhbmNlKF9fZiwgX19sKSArIDE7CisgICAgICAgICAgICBfX2MuX19zeigpIC09IF9fczsKKyAgICAgICAgICAgIGJhc2U6Ol9fc3ooKSArPSBfX3M7CisgICAgICAgIH0KKyAgICAgICAgYmFzZTo6X191bmxpbmtfbm9kZXMoX19maXJzdCwgX19sYXN0KTsKKyAgICAgICAgX19saW5rX25vZGVzKF9fcC5fX3B0cl8sIF9fZmlyc3QsIF9fbGFzdCk7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgIF9fbGliY3BwX2RiKiBfX2RiID0gX19nZXRfZGIoKTsKKyAgICAgICAgX19jX25vZGUqIF9fY24xID0gX19kYi0+X19maW5kX2NfYW5kX2xvY2sodGhpcyk7CisgICAgICAgIF9fY19ub2RlKiBfX2NuMiA9IF9fZGItPl9fZmluZF9jKCZfX2MpOworICAgICAgICBmb3IgKF9faV9ub2RlKiogX19pcCA9IF9fY24yLT5lbmRfOyBfX2lwICE9IF9fY24yLT5iZWdfOykKKyAgICAgICAgeworICAgICAgICAgICAgLS1fX2lwOworICAgICAgICAgICAgaXRlcmF0b3IqIF9faiA9IHN0YXRpY19jYXN0PGl0ZXJhdG9yKj4oKCpfX2lwKS0+X19pXyk7CisgICAgICAgICAgICBmb3IgKF9fbGlua19wb2ludGVyIF9fayA9IF9fZi5fX3B0cl87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2sgIT0gX19sLl9fcHRyXzsgX19rID0gX19rLT5fX25leHRfKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfX2otPl9fcHRyXyA9PSBfX2spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX2NuMS0+X19hZGQoKl9faXApOworICAgICAgICAgICAgICAgICAgICAoKl9faXApLT5fX2NfID0gX19jbjE7CisgICAgICAgICAgICAgICAgICAgIGlmICgtLV9fY24yLT5lbmRfICE9IF9faXApCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKF9faXAsIF9faXArMSwgKF9fY24yLT5lbmRfIC0gX19pcCkqc2l6ZW9mKF9faV9ub2RlKikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfX2RiLT51bmxvY2soKTsKKyNlbmRpZgorICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordm9pZAorbGlzdDxfVHAsIF9BbGxvYz46OnJlbW92ZShjb25zdCB2YWx1ZV90eXBlJiBfX3gpCit7CisgICAgbGlzdDxfVHAsIF9BbGxvYz4gX19kZWxldGVkX25vZGVzKGdldF9hbGxvY2F0b3IoKSk7IC8vIGNvbGxlY3QgdGhlIG5vZGVzIHdlJ3JlIHJlbW92aW5nCisgICAgZm9yIChjb25zdF9pdGVyYXRvciBfX2kgPSBiZWdpbigpLCBfX2UgPSBlbmQoKTsgX19pICE9IF9fZTspCisgICAgeworICAgICAgICBpZiAoKl9faSA9PSBfX3gpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9faiA9IF9WU1REOjpuZXh0KF9faSk7CisgICAgICAgICAgICBmb3IgKDsgX19qICE9IF9fZSAmJiAqX19qID09IF9feDsgKytfX2opCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgX19kZWxldGVkX25vZGVzLnNwbGljZShfX2RlbGV0ZWRfbm9kZXMuZW5kKCksICp0aGlzLCBfX2ksIF9faik7CisgICAgICAgICAgICBfX2kgPSBfX2o7CisgICAgICAgICAgICBpZiAoX19pICE9IF9fZSkKKyAgICAgICAgICAgICAgICArK19faTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICArK19faTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfUHJlZD4KK3ZvaWQKK2xpc3Q8X1RwLCBfQWxsb2M+OjpyZW1vdmVfaWYoX1ByZWQgX19wcmVkKQoreworICAgIGZvciAoaXRlcmF0b3IgX19pID0gYmVnaW4oKSwgX19lID0gZW5kKCk7IF9faSAhPSBfX2U7KQorICAgIHsKKyAgICAgICAgaWYgKF9fcHJlZCgqX19pKSkKKyAgICAgICAgeworICAgICAgICAgICAgaXRlcmF0b3IgX19qID0gX1ZTVEQ6Om5leHQoX19pKTsKKyAgICAgICAgICAgIGZvciAoOyBfX2ogIT0gX19lICYmIF9fcHJlZCgqX19qKTsgKytfX2opCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgX19pID0gZXJhc2UoX19pLCBfX2opOworICAgICAgICAgICAgaWYgKF9faSAhPSBfX2UpCisgICAgICAgICAgICAgICAgKytfX2k7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKytfX2k7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUKK3ZvaWQKK2xpc3Q8X1RwLCBfQWxsb2M+Ojp1bmlxdWUoKQoreworICAgIHVuaXF1ZShfX2VxdWFsX3RvPHZhbHVlX3R5cGU+KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWQ+Cit2b2lkCitsaXN0PF9UcCwgX0FsbG9jPjo6dW5pcXVlKF9CaW5hcnlQcmVkIF9fYmluYXJ5X3ByZWQpCit7CisgICAgZm9yIChpdGVyYXRvciBfX2kgPSBiZWdpbigpLCBfX2UgPSBlbmQoKTsgX19pICE9IF9fZTspCisgICAgeworICAgICAgICBpdGVyYXRvciBfX2ogPSBfVlNURDo6bmV4dChfX2kpOworICAgICAgICBmb3IgKDsgX19qICE9IF9fZSAmJiBfX2JpbmFyeV9wcmVkKCpfX2ksICpfX2opOyArK19faikKKyAgICAgICAgICAgIDsKKyAgICAgICAgaWYgKCsrX19pICE9IF9faikKKyAgICAgICAgICAgIF9faSA9IGVyYXNlKF9faSwgX19qKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2lubGluZQordm9pZAorbGlzdDxfVHAsIF9BbGxvYz46Om1lcmdlKGxpc3QmIF9fYykKK3sKKyAgICBtZXJnZShfX2MsIF9fbGVzczx2YWx1ZV90eXBlPigpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9Db21wPgordm9pZAorbGlzdDxfVHAsIF9BbGxvYz46Om1lcmdlKGxpc3QmIF9fYywgX0NvbXAgX19jb21wKQoreworICAgIGlmICh0aGlzICE9ICZfX2MpCisgICAgeworICAgICAgICBpdGVyYXRvciBfX2YxID0gYmVnaW4oKTsKKyAgICAgICAgaXRlcmF0b3IgX19lMSA9IGVuZCgpOworICAgICAgICBpdGVyYXRvciBfX2YyID0gX19jLmJlZ2luKCk7CisgICAgICAgIGl0ZXJhdG9yIF9fZTIgPSBfX2MuZW5kKCk7CisgICAgICAgIHdoaWxlIChfX2YxICE9IF9fZTEgJiYgX19mMiAhPSBfX2UyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX19jb21wKCpfX2YyLCAqX19mMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fZHMgPSAxOworICAgICAgICAgICAgICAgIGl0ZXJhdG9yIF9fbTIgPSBfVlNURDo6bmV4dChfX2YyKTsKKyAgICAgICAgICAgICAgICBmb3IgKDsgX19tMiAhPSBfX2UyICYmIF9fY29tcCgqX19tMiwgKl9fZjEpOyArK19fbTIsICsrX19kcykKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIGJhc2U6Ol9fc3ooKSArPSBfX2RzOworICAgICAgICAgICAgICAgIF9fYy5fX3N6KCkgLT0gX19kczsKKyAgICAgICAgICAgICAgICBfX2xpbmtfcG9pbnRlciBfX2YgPSBfX2YyLl9fcHRyXzsKKyAgICAgICAgICAgICAgICBfX2xpbmtfcG9pbnRlciBfX2wgPSBfX20yLl9fcHRyXy0+X19wcmV2XzsKKyAgICAgICAgICAgICAgICBfX2YyID0gX19tMjsKKyAgICAgICAgICAgICAgICBiYXNlOjpfX3VubGlua19ub2RlcyhfX2YsIF9fbCk7CisgICAgICAgICAgICAgICAgX19tMiA9IF9WU1REOjpuZXh0KF9fZjEpOworICAgICAgICAgICAgICAgIF9fbGlua19ub2RlcyhfX2YxLl9fcHRyXywgX19mLCBfX2wpOworICAgICAgICAgICAgICAgIF9fZjEgPSBfX20yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICsrX19mMTsKKyAgICAgICAgfQorICAgICAgICBzcGxpY2UoX19lMSwgX19jKTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgX19saWJjcHBfZGIqIF9fZGIgPSBfX2dldF9kYigpOworICAgICAgICBfX2Nfbm9kZSogX19jbjEgPSBfX2RiLT5fX2ZpbmRfY19hbmRfbG9jayh0aGlzKTsKKyAgICAgICAgX19jX25vZGUqIF9fY24yID0gX19kYi0+X19maW5kX2MoJl9fYyk7CisgICAgICAgIGZvciAoX19pX25vZGUqKiBfX3AgPSBfX2NuMi0+ZW5kXzsgX19wICE9IF9fY24yLT5iZWdfOykKKyAgICAgICAgeworICAgICAgICAgICAgLS1fX3A7CisgICAgICAgICAgICBpdGVyYXRvciogX19pID0gc3RhdGljX2Nhc3Q8aXRlcmF0b3IqPigoKl9fcCktPl9faV8pOworICAgICAgICAgICAgaWYgKF9faS0+X19wdHJfICE9IF9fYy5fX2VuZF9hc19saW5rKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19jbjEtPl9fYWRkKCpfX3ApOworICAgICAgICAgICAgICAgICgqX19wKS0+X19jXyA9IF9fY24xOworICAgICAgICAgICAgICAgIGlmICgtLV9fY24yLT5lbmRfICE9IF9fcCkKKyAgICAgICAgICAgICAgICAgICAgbWVtbW92ZShfX3AsIF9fcCsxLCAoX19jbjItPmVuZF8gLSBfX3ApKnNpemVvZihfX2lfbm9kZSopKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfX2RiLT51bmxvY2soKTsKKyNlbmRpZgorICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lCit2b2lkCitsaXN0PF9UcCwgX0FsbG9jPjo6c29ydCgpCit7CisgICAgc29ydChfX2xlc3M8dmFsdWVfdHlwZT4oKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfQ29tcD4KK2lubGluZQordm9pZAorbGlzdDxfVHAsIF9BbGxvYz46OnNvcnQoX0NvbXAgX19jb21wKQoreworICAgIF9fc29ydChiZWdpbigpLCBlbmQoKSwgYmFzZTo6X19zeigpLCBfX2NvbXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NvbXA+Cit0eXBlbmFtZSBsaXN0PF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKK2xpc3Q8X1RwLCBfQWxsb2M+OjpfX3NvcnQoaXRlcmF0b3IgX19mMSwgaXRlcmF0b3IgX19lMiwgc2l6ZV90eXBlIF9fbiwgX0NvbXAmIF9fY29tcCkKK3sKKyAgICBzd2l0Y2ggKF9fbikKKyAgICB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICAgICAgcmV0dXJuIF9fZjE7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoX19jb21wKCotLV9fZTIsICpfX2YxKSkKKyAgICAgICAgeworICAgICAgICAgICAgX19saW5rX3BvaW50ZXIgX19mID0gX19lMi5fX3B0cl87CisgICAgICAgICAgICBiYXNlOjpfX3VubGlua19ub2RlcyhfX2YsIF9fZik7CisgICAgICAgICAgICBfX2xpbmtfbm9kZXMoX19mMS5fX3B0cl8sIF9fZiwgX19mKTsKKyAgICAgICAgICAgIHJldHVybiBfX2UyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfX2YxOworICAgIH0KKyAgICBzaXplX3R5cGUgX19uMiA9IF9fbiAvIDI7CisgICAgaXRlcmF0b3IgX19lMSA9IF9WU1REOjpuZXh0KF9fZjEsIF9fbjIpOworICAgIGl0ZXJhdG9yICBfX3IgPSBfX2YxID0gX19zb3J0KF9fZjEsIF9fZTEsIF9fbjIsIF9fY29tcCk7CisgICAgaXRlcmF0b3IgX19mMiA9IF9fZTEgPSBfX3NvcnQoX19lMSwgX19lMiwgX19uIC0gX19uMiwgX19jb21wKTsKKyAgICBpZiAoX19jb21wKCpfX2YyLCAqX19mMSkpCisgICAgeworICAgICAgICBpdGVyYXRvciBfX20yID0gX1ZTVEQ6Om5leHQoX19mMik7CisgICAgICAgIGZvciAoOyBfX20yICE9IF9fZTIgJiYgX19jb21wKCpfX20yLCAqX19mMSk7ICsrX19tMikKKyAgICAgICAgICAgIDsKKyAgICAgICAgX19saW5rX3BvaW50ZXIgX19mID0gX19mMi5fX3B0cl87CisgICAgICAgIF9fbGlua19wb2ludGVyIF9fbCA9IF9fbTIuX19wdHJfLT5fX3ByZXZfOworICAgICAgICBfX3IgPSBfX2YyOworICAgICAgICBfX2UxID0gX19mMiA9IF9fbTI7CisgICAgICAgIGJhc2U6Ol9fdW5saW5rX25vZGVzKF9fZiwgX19sKTsKKyAgICAgICAgX19tMiA9IF9WU1REOjpuZXh0KF9fZjEpOworICAgICAgICBfX2xpbmtfbm9kZXMoX19mMS5fX3B0cl8sIF9fZiwgX19sKTsKKyAgICAgICAgX19mMSA9IF9fbTI7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgKytfX2YxOworICAgIHdoaWxlIChfX2YxICE9IF9fZTEgJiYgX19mMiAhPSBfX2UyKQorICAgIHsKKyAgICAgICAgaWYgKF9fY29tcCgqX19mMiwgKl9fZjEpKQorICAgICAgICB7CisgICAgICAgICAgICBpdGVyYXRvciBfX20yID0gX1ZTVEQ6Om5leHQoX19mMik7CisgICAgICAgICAgICBmb3IgKDsgX19tMiAhPSBfX2UyICYmIF9fY29tcCgqX19tMiwgKl9fZjEpOyArK19fbTIpCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgX19saW5rX3BvaW50ZXIgX19mID0gX19mMi5fX3B0cl87CisgICAgICAgICAgICBfX2xpbmtfcG9pbnRlciBfX2wgPSBfX20yLl9fcHRyXy0+X19wcmV2XzsKKyAgICAgICAgICAgIGlmIChfX2UxID09IF9fZjIpCisgICAgICAgICAgICAgICAgX19lMSA9IF9fbTI7CisgICAgICAgICAgICBfX2YyID0gX19tMjsKKyAgICAgICAgICAgIGJhc2U6Ol9fdW5saW5rX25vZGVzKF9fZiwgX19sKTsKKyAgICAgICAgICAgIF9fbTIgPSBfVlNURDo6bmV4dChfX2YxKTsKKyAgICAgICAgICAgIF9fbGlua19ub2RlcyhfX2YxLl9fcHRyXywgX19mLCBfX2wpOworICAgICAgICAgICAgX19mMSA9IF9fbTI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKytfX2YxOworICAgIH0KKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitsaXN0PF9UcCwgX0FsbG9jPjo6cmV2ZXJzZSgpIF9OT0VYQ0VQVAoreworICAgIGlmIChiYXNlOjpfX3N6KCkgPiAxKQorICAgIHsKKyAgICAgICAgaXRlcmF0b3IgX19lID0gZW5kKCk7CisgICAgICAgIGZvciAoaXRlcmF0b3IgX19pID0gYmVnaW4oKTsgX19pLl9fcHRyXyAhPSBfX2UuX19wdHJfOykKKyAgICAgICAgeworICAgICAgICAgICAgX1ZTVEQ6OnN3YXAoX19pLl9fcHRyXy0+X19wcmV2XywgX19pLl9fcHRyXy0+X19uZXh0Xyk7CisgICAgICAgICAgICBfX2kuX19wdHJfID0gX19pLl9fcHRyXy0+X19wcmV2XzsKKyAgICAgICAgfQorICAgICAgICBfVlNURDo6c3dhcChfX2UuX19wdHJfLT5fX3ByZXZfLCBfX2UuX19wdHJfLT5fX25leHRfKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2Jvb2wKK2xpc3Q8X1RwLCBfQWxsb2M+OjpfX2ludmFyaWFudHMoKSBjb25zdAoreworICAgIHJldHVybiBzaXplKCkgPT0gX1ZTVEQ6OmRpc3RhbmNlKGJlZ2luKCksIGVuZCgpKTsKK30KKworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Citib29sCitsaXN0PF9UcCwgX0FsbG9jPjo6X19kZXJlZmVyZW5jZWFibGUoY29uc3QgY29uc3RfaXRlcmF0b3IqIF9faSkgY29uc3QKK3sKKyAgICByZXR1cm4gX19pLT5fX3B0cl8gIT0gdGhpcy0+X19lbmRfYXNfbGluaygpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Citib29sCitsaXN0PF9UcCwgX0FsbG9jPjo6X19kZWNyZW1lbnRhYmxlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yKiBfX2kpIGNvbnN0Cit7CisgICAgcmV0dXJuICFlbXB0eSgpICYmICBfX2ktPl9fcHRyXyAhPSBiYXNlOjpfX2VuZF8uX19uZXh0XzsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorYm9vbAorbGlzdDxfVHAsIF9BbGxvYz46Ol9fYWRkYWJsZShjb25zdCBjb25zdF9pdGVyYXRvciosIHB0cmRpZmZfdCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2Jvb2wKK2xpc3Q8X1RwLCBfQWxsb2M+OjpfX3N1YnNjcmlwdGFibGUoY29uc3QgY29uc3RfaXRlcmF0b3IqLCBwdHJkaWZmX3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX194LCBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX195KQoreworICAgIHJldHVybiBfX3guc2l6ZSgpID09IF9feS5zaXplKCkgJiYgX1ZTVEQ6OmVxdWFsKF9feC5iZWdpbigpLCBfX3guZW5kKCksIF9feS5iZWdpbigpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPCAoY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9feCwgY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9feSkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9feC5iZWdpbigpLCBfX3guZW5kKCksIF9feS5iZWdpbigpLCBfX3kuZW5kKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX194LCBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX195KQoreworICAgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+IChjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX194LCBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX195KQoreworICAgIHJldHVybiBfX3kgPCBfX3g7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj49KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsIGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194IDwgX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPD0oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9feCwgY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3kgPCBfX3gpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChsaXN0PF9UcCwgX0FsbG9jPiYgX194LCBsaXN0PF9UcCwgX0FsbG9jPiYgX195KQorICAgIF9OT0VYQ0VQVF8oX05PRVhDRVBUXyhfX3guc3dhcChfX3kpKSkKK3sKKyAgICBfX3guc3dhcChfX3kpOworfQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKK19MSUJDUFBfUE9QX01BQ1JPUworCisjZW5kaWYgIC8vIF9MSUJDUFBfTElTVApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL2xvY2FsZSBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9sb2NhbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4ODViNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9sb2NhbGUKQEAgLTAsMCArMSw0MzM2IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsb2NhbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0xPQ0FMRQorI2RlZmluZSBfTElCQ1BQX0xPQ0FMRQorCisvKgorICAgIGxvY2FsZSBzeW5vcHNpcworCituYW1lc3BhY2Ugc3RkCit7CisKK2NsYXNzIGxvY2FsZQoreworcHVibGljOgorICAgIC8vIHR5cGVzOgorICAgIGNsYXNzIGZhY2V0OworICAgIGNsYXNzIGlkOworCisgICAgdHlwZWRlZiBpbnQgY2F0ZWdvcnk7CisgICAgc3RhdGljIGNvbnN0IGNhdGVnb3J5IC8vIHZhbHVlcyBhc3NpZ25lZCBoZXJlIGFyZSBmb3IgZXhwb3NpdGlvbiBvbmx5CisgICAgICAgIG5vbmUgICAgID0gMHgwMDAsCisgICAgICAgIGNvbGxhdGUgID0gMHgwMTAsCisgICAgICAgIGN0eXBlICAgID0gMHgwMjAsCisgICAgICAgIG1vbmV0YXJ5ID0gMHgwNDAsCisgICAgICAgIG51bWVyaWMgID0gMHgwODAsCisgICAgICAgIHRpbWUgICAgID0gMHgxMDAsCisgICAgICAgIG1lc3NhZ2VzID0gMHgyMDAsCisgICAgICAgIGFsbCA9IGNvbGxhdGUgfCBjdHlwZSB8IG1vbmV0YXJ5IHwgbnVtZXJpYyB8IHRpbWUgfCBtZXNzYWdlczsKKworICAgIC8vIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgbG9jYWxlKCkgbm9leGNlcHQ7CisgICAgbG9jYWxlKGNvbnN0IGxvY2FsZSYgb3RoZXIpIG5vZXhjZXB0OworICAgIGV4cGxpY2l0IGxvY2FsZShjb25zdCBjaGFyKiBzdGRfbmFtZSk7CisgICAgZXhwbGljaXQgbG9jYWxlKGNvbnN0IHN0cmluZyYgc3RkX25hbWUpOworICAgIGxvY2FsZShjb25zdCBsb2NhbGUmIG90aGVyLCBjb25zdCBjaGFyKiBzdGRfbmFtZSwgY2F0ZWdvcnkpOworICAgIGxvY2FsZShjb25zdCBsb2NhbGUmIG90aGVyLCBjb25zdCBzdHJpbmcmIHN0ZF9uYW1lLCBjYXRlZ29yeSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIEZhY2V0PiBsb2NhbGUoY29uc3QgbG9jYWxlJiBvdGhlciwgRmFjZXQqIGYpOworICAgIGxvY2FsZShjb25zdCBsb2NhbGUmIG90aGVyLCBjb25zdCBsb2NhbGUmIG9uZSwgY2F0ZWdvcnkpOworCisgICAgfmxvY2FsZSgpOyAvLyBub3QgdmlydHVhbAorCisgICAgY29uc3QgbG9jYWxlJiBvcGVyYXRvcj0oY29uc3QgbG9jYWxlJiBvdGhlcikgbm9leGNlcHQ7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgRmFjZXQ+IGxvY2FsZSBjb21iaW5lKGNvbnN0IGxvY2FsZSYgb3RoZXIpIGNvbnN0OworCisgICAgLy8gbG9jYWxlIG9wZXJhdGlvbnM6CisgICAgYmFzaWNfc3RyaW5nPGNoYXI+IG5hbWUoKSBjb25zdDsKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgbG9jYWxlJiBvdGhlcikgY29uc3Q7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGxvY2FsZSYgb3RoZXIpIGNvbnN0OworICAgIHRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgVHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CisgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULFRyYWl0cyxBbGxvY2F0b3I+JiBzMSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsVHJhaXRzLEFsbG9jYXRvcj4mIHMyKSBjb25zdDsKKworICAgIC8vIGdsb2JhbCBsb2NhbGUgb2JqZWN0czoKKyAgICBzdGF0aWMgbG9jYWxlIGdsb2JhbChjb25zdCBsb2NhbGUmKTsKKyAgICBzdGF0aWMgY29uc3QgbG9jYWxlJiBjbGFzc2ljKCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgRmFjZXQ+IGNvbnN0IEZhY2V0JiB1c2VfZmFjZXQoY29uc3QgbG9jYWxlJik7Cit0ZW1wbGF0ZSA8Y2xhc3MgRmFjZXQ+IGJvb2wgaGFzX2ZhY2V0KGNvbnN0IGxvY2FsZSYpIG5vZXhjZXB0OworCisvLyAyMi4zLjMsIGNvbnZlbmllbmNlIGludGVyZmFjZXM6Cit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+IGJvb2wgaXNzcGFjZSAoY2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpOwordGVtcGxhdGUgPGNsYXNzIGNoYXJUPiBib29sIGlzcHJpbnQgKGNoYXJUIGMsIGNvbnN0IGxvY2FsZSYgbG9jKTsKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVD4gYm9vbCBpc2NudHJsIChjaGFyVCBjLCBjb25zdCBsb2NhbGUmIGxvYyk7Cit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+IGJvb2wgaXN1cHBlciAoY2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpOwordGVtcGxhdGUgPGNsYXNzIGNoYXJUPiBib29sIGlzbG93ZXIgKGNoYXJUIGMsIGNvbnN0IGxvY2FsZSYgbG9jKTsKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVD4gYm9vbCBpc2FscGhhIChjaGFyVCBjLCBjb25zdCBsb2NhbGUmIGxvYyk7Cit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+IGJvb2wgaXNkaWdpdCAoY2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpOwordGVtcGxhdGUgPGNsYXNzIGNoYXJUPiBib29sIGlzcHVuY3QgKGNoYXJUIGMsIGNvbnN0IGxvY2FsZSYgbG9jKTsKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVD4gYm9vbCBpc3hkaWdpdChjaGFyVCBjLCBjb25zdCBsb2NhbGUmIGxvYyk7Cit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+IGJvb2wgaXNhbG51bSAoY2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpOwordGVtcGxhdGUgPGNsYXNzIGNoYXJUPiBib29sIGlzZ3JhcGggKGNoYXJUIGMsIGNvbnN0IGxvY2FsZSYgbG9jKTsKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVD4gY2hhclQgdG91cHBlcihjaGFyVCBjLCBjb25zdCBsb2NhbGUmIGxvYyk7Cit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+IGNoYXJUIHRvbG93ZXIoY2hhclQgYywgY29uc3QgbG9jYWxlJiBsb2MpOworCit0ZW1wbGF0ZTxjbGFzcyBDb2RlY3Z0LCBjbGFzcyBFbGVtID0gd2NoYXJfdCwKKyAgICAgICAgIGNsYXNzIFdpZGVfYWxsb2MgPSBhbGxvY2F0b3I8RWxlbT4sCisgICAgICAgICBjbGFzcyBCeXRlX2FsbG9jID0gYWxsb2NhdG9yPGNoYXI+PgorY2xhc3Mgd3N0cmluZ19jb252ZXJ0Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIEJ5dGVfYWxsb2M+IGJ5dGVfc3RyaW5nOworICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPEVsZW0sIGNoYXJfdHJhaXRzPEVsZW0+LCBXaWRlX2FsbG9jPiB3aWRlX3N0cmluZzsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIENvZGVjdnQ6OnN0YXRlX3R5cGUgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHdpZGVfc3RyaW5nOjp0cmFpdHNfdHlwZTo6aW50X3R5cGUgICAgICAgaW50X3R5cGU7CisKKyAgICBleHBsaWNpdCB3c3RyaW5nX2NvbnZlcnQoQ29kZWN2dCogcGN2dCA9IG5ldyBDb2RlY3Z0KTsgICAgICAgICAgLy8gZXhwbGljaXQgaW4gQysrMTQKKyAgICB3c3RyaW5nX2NvbnZlcnQoQ29kZWN2dCogcGN2dCwgc3RhdGVfdHlwZSBzdGF0ZSk7CisgICAgZXhwbGljaXQgd3N0cmluZ19jb252ZXJ0KGNvbnN0IGJ5dGVfc3RyaW5nJiBieXRlX2VyciwgICAgICAgICAgIC8vIGV4cGxpY2l0IGluIEMrKzE0CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpZGVfc3RyaW5nJiB3aWRlX2VyciA9IHdpZGVfc3RyaW5nKCkpOworICAgIHdzdHJpbmdfY29udmVydChjb25zdCB3c3RyaW5nX2NvbnZlcnQmKSA9IGRlbGV0ZTsgICAgICAgICAgICAgICAvLyBDKysxNAorICAgIHdzdHJpbmdfY29udmVydCAmIG9wZXJhdG9yPShjb25zdCB3c3RyaW5nX2NvbnZlcnQgJikgPSBkZWxldGU7ICAvLyBDKysxNAorICAgIH53c3RyaW5nX2NvbnZlcnQoKTsKKworICAgIHdpZGVfc3RyaW5nIGZyb21fYnl0ZXMoY2hhciBieXRlKTsKKyAgICB3aWRlX3N0cmluZyBmcm9tX2J5dGVzKGNvbnN0IGNoYXIqIHB0cik7CisgICAgd2lkZV9zdHJpbmcgZnJvbV9ieXRlcyhjb25zdCBieXRlX3N0cmluZyYgc3RyKTsKKyAgICB3aWRlX3N0cmluZyBmcm9tX2J5dGVzKGNvbnN0IGNoYXIqIGZpcnN0LCBjb25zdCBjaGFyKiBsYXN0KTsKKworICAgIGJ5dGVfc3RyaW5nIHRvX2J5dGVzKEVsZW0gd2NoYXIpOworICAgIGJ5dGVfc3RyaW5nIHRvX2J5dGVzKGNvbnN0IEVsZW0qIHdwdHIpOworICAgIGJ5dGVfc3RyaW5nIHRvX2J5dGVzKGNvbnN0IHdpZGVfc3RyaW5nJiB3c3RyKTsKKyAgICBieXRlX3N0cmluZyB0b19ieXRlcyhjb25zdCBFbGVtKiBmaXJzdCwgY29uc3QgRWxlbSogbGFzdCk7CisKKyAgICBzaXplX3QgY29udmVydGVkKCkgY29uc3Q7IC8vIG5vZXhjZXB0IGluIEMrKzE0CisgICAgc3RhdGVfdHlwZSBzdGF0ZSgpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIENvZGVjdnQsIGNsYXNzIEVsZW0gPSB3Y2hhcl90LCBjbGFzcyBUciA9IGNoYXJfdHJhaXRzPEVsZW0+PgorY2xhc3Mgd2J1ZmZlcl9jb252ZXJ0CisgICAgOiBwdWJsaWMgYmFzaWNfc3RyZWFtYnVmPEVsZW0sIFRyPgoreworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgVHI6OnN0YXRlX3R5cGUgc3RhdGVfdHlwZTsKKworICAgIGV4cGxpY2l0IHdidWZmZXJfY29udmVydChzdHJlYW1idWYqIGJ5dGVidWYgPSAwLCBDb2RlY3Z0KiBwY3Z0ID0gbmV3IENvZGVjdnQsCisgICAgICAgICAgICAgICAgICAgIHN0YXRlX3R5cGUgc3RhdGUgPSBzdGF0ZV90eXBlKCkpOyAgICAgICAvLyBleHBsaWNpdCBpbiBDKysxNAorICAgIHdidWZmZXJfY29udmVydChjb25zdCB3YnVmZmVyX2NvbnZlcnQmKSA9IGRlbGV0ZTsgICAgICAgICAgICAgICAvLyBDKysxNAorICAgIHdidWZmZXJfY29udmVydCAmIG9wZXJhdG9yPShjb25zdCB3YnVmZmVyX2NvbnZlcnQgJikgPSBkZWxldGU7ICAvLyBDKysxNAorICAgIH53YnVmZmVyX2NvbnZlcnQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNAorICAgIAorICAgIHN0cmVhbWJ1ZiogcmRidWYoKSBjb25zdDsKKyAgICBzdHJlYW1idWYqIHJkYnVmKHN0cmVhbWJ1ZiogYnl0ZWJ1Zik7CisKKyAgICBzdGF0ZV90eXBlIHN0YXRlKCkgY29uc3Q7Cit9OworCisvLyAyMi40LjEgYW5kIDIyLjQuMS4zLCBjdHlwZToKK2NsYXNzIGN0eXBlX2Jhc2U7Cit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+IGNsYXNzIGN0eXBlOwordGVtcGxhdGUgPD4gY2xhc3MgY3R5cGU8Y2hhcj47IC8vIHNwZWNpYWxpemF0aW9uCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+IGNsYXNzIGN0eXBlX2J5bmFtZTsKK3RlbXBsYXRlIDw+IGNsYXNzIGN0eXBlX2J5bmFtZTxjaGFyPjsgLy8gc3BlY2lhbGl6YXRpb24KKworY2xhc3MgY29kZWN2dF9iYXNlOwordGVtcGxhdGUgPGNsYXNzIGludGVyblQsIGNsYXNzIGV4dGVyblQsIGNsYXNzIHN0YXRlVD4gY2xhc3MgY29kZWN2dDsKK3RlbXBsYXRlIDxjbGFzcyBpbnRlcm5ULCBjbGFzcyBleHRlcm5ULCBjbGFzcyBzdGF0ZVQ+IGNsYXNzIGNvZGVjdnRfYnluYW1lOworCisvLyAyMi40LjIgYW5kIDIyLjQuMywgbnVtZXJpYzoKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgSW5wdXRJdGVyYXRvcj4gY2xhc3MgbnVtX2dldDsKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgT3V0cHV0SXRlcmF0b3I+IGNsYXNzIG51bV9wdXQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+IGNsYXNzIG51bXB1bmN0OwordGVtcGxhdGUgPGNsYXNzIGNoYXJUPiBjbGFzcyBudW1wdW5jdF9ieW5hbWU7CisKKy8vIDIyLjQuNCwgY29sIGxhdGlvbjoKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVD4gY2xhc3MgY29sbGF0ZTsKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVD4gY2xhc3MgY29sbGF0ZV9ieW5hbWU7CisKKy8vIDIyLjQuNSwgZGF0ZSBhbmQgdGltZToKK2NsYXNzIHRpbWVfYmFzZTsKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgSW5wdXRJdGVyYXRvcj4gY2xhc3MgdGltZV9nZXQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIElucHV0SXRlcmF0b3I+IGNsYXNzIHRpbWVfZ2V0X2J5bmFtZTsKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgT3V0cHV0SXRlcmF0b3I+IGNsYXNzIHRpbWVfcHV0OwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyBPdXRwdXRJdGVyYXRvcj4gY2xhc3MgdGltZV9wdXRfYnluYW1lOworCisvLyAyMi40LjYsIG1vbmV5OgorY2xhc3MgbW9uZXlfYmFzZTsKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgSW5wdXRJdGVyYXRvcj4gY2xhc3MgbW9uZXlfZ2V0OwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyBPdXRwdXRJdGVyYXRvcj4gY2xhc3MgbW9uZXlfcHV0OwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBib29sIEludGw+IGNsYXNzIG1vbmV5cHVuY3Q7Cit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGJvb2wgSW50bD4gY2xhc3MgbW9uZXlwdW5jdF9ieW5hbWU7CisKKy8vIDIyLjQuNywgbWVzc2FnZSByZXRyaWV2YWw6CitjbGFzcyBtZXNzYWdlc19iYXNlOwordGVtcGxhdGUgPGNsYXNzIGNoYXJUPiBjbGFzcyBtZXNzYWdlczsKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVD4gY2xhc3MgbWVzc2FnZXNfYnluYW1lOworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPF9fbG9jYWxlPgorI2luY2x1ZGUgPF9fZGVidWc+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxpb3M+CisjaW5jbHVkZSA8c3RyZWFtYnVmPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpZm5kZWYgX19BUFBMRV9fCisjaW5jbHVkZSA8Y3N0ZGFyZz4KKyNlbmRpZgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3RpbWU+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2lmZGVmIF9MSUJDUFBfSEFTX0NBVE9QRU4KKyNpbmNsdWRlIDxubF90eXBlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0FQUExFX18KKyNpbmNsdWRlIDxBdmFpbGFiaWxpdHkuaD4KKyNlbmRpZgorCisjaWZkZWYgX0xJQkNQUF9MT0NBTEVfX0xfRVhURU5TSU9OUworI2luY2x1ZGUgPF9fYnNkX2xvY2FsZV9kZWZhdWx0cy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxfX2JzZF9sb2NhbGVfZmFsbGJhY2tzLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfUFVTSF9NQUNST1MKKyNpbmNsdWRlIDxfX3VuZGVmX21hY3Jvcz4KKworCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKworI2lmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorIyAgZGVmaW5lIF9MSUJDUFBfR0VUX0NfTE9DQUxFIDAKKyNlbGlmIGRlZmluZWQoX19DbG91ZEFCSV9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCisjICBkZWZpbmUgX0xJQkNQUF9HRVRfQ19MT0NBTEUgTENfQ19MT0NBTEUKKyNlbHNlCisjICBkZWZpbmUgX0xJQkNQUF9HRVRfQ19MT0NBTEUgX19jbG9jKCkKKyAgIC8vIEdldCB0aGUgQyBsb2NhbGUgb2JqZWN0CisgICBfTElCQ1BQX0ZVTkNfVklTIGxvY2FsZV90IF9fY2xvYygpOworI2RlZmluZSBfX2Nsb2NfZGVmaW5lZAorI2VuZGlmCisKKy8vIF9fc2Nhbl9rZXl3b3JkCisvLyBTY2FucyBbX19iLCBfX2UpIHVudGlsIGEgbWF0Y2ggaXMgZm91bmQgaW4gdGhlIGJhc2ljX3N0cmluZ3MgcmFuZ2UKKy8vICBbX19rYiwgX19rZSkgb3IgdW50aWwgaXQgY2FuIGJlIHNob3duIHRoYXQgdGhlcmUgaXMgbm8gbWF0Y2ggaW4gW19fa2IsIF9fa2UpLgorLy8gIF9fYiB3aWxsIGJlIGluY3JlbWVudGVkICh2aXNpYmx5KSwgY29uc3VtaW5nIENoYXJUIHVudGlsIGEgbWF0Y2ggaXMgZm91bmQKKy8vICBvciBwcm92ZWQgdG8gbm90IGV4aXN0LiAgQSBrZXl3b3JkIG1heSBiZSAiIiwgaW4gd2hpY2ggd2lsbCBtYXRjaCBhbnl0aGluZy4KKy8vICBJZiBvbmUga2V5d29yZCBpcyBhIHByZWZpeCBvZiBhbm90aGVyLCBhbmQgdGhlIG5leHQgQ2hhclQgaW4gdGhlIGlucHV0CisvLyAgbWlnaHQgbWF0Y2ggYW5vdGhlciBrZXl3b3JkLCB0aGUgYWxnb3JpdGhtIHdpbGwgYXR0ZW1wdCB0byBmaW5kIHRoZSBsb25nZXN0CisvLyAgbWF0Y2hpbmcga2V5d29yZC4gIElmIHRoZSBsb25nZXIgbWF0Y2hpbmcga2V5d29yZCBlbmRzIHVwIG5vdCBtYXRjaGluZywgdGhlbgorLy8gIG5vIGtleXdvcmQgbWF0Y2ggaXMgZm91bmQuICBJZiBubyBrZXl3b3JkIG1hdGNoIGlzIGZvdW5kLCBfX2tlIGlzIHJldHVybmVkCisvLyAgYW5kIGZhaWxiaXQgaXMgc2V0IGluIF9fZXJyLgorLy8gIEVsc2UgYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIG1hdGNoaW5nIGtleXdvcmQgaXMgZm91bmQuICBJZiBtb3JlIHRoYW4KKy8vICBvbmUga2V5d29yZCBtYXRjaGVzLCBhbiBpdGVyYXRvciB0byB0aGUgZmlyc3QgbWF0Y2hpbmcga2V5d29yZCBpcyByZXR1cm5lZC4KKy8vICBJZiBvbiBleGl0IF9fYiA9PSBfX2UsIGVvZmJpdCBpcyBzZXQgaW4gX19lcnIuICBJZiBfX2Nhc2Vfc2Vuc2l0aXZlIGlzIGZhbHNlLAorLy8gIF9fY3QgaXMgdXNlZCB0byBmb3JjZSB0byBsb3dlciBjYXNlIGJlZm9yZSBjb21wYXJpbmcgY2hhcmFjdGVycy4KKy8vICBFeGFtcGxlczoKKy8vICBLZXl3b3JkczogICJhIiwgImFiYiIKKy8vICBJZiB0aGUgaW5wdXQgaXMgImEiLCB0aGUgZmlyc3Qga2V5d29yZCBtYXRjaGVzIGFuZCBlb2ZiaXQgaXMgc2V0LgorLy8gIElmIHRoZSBpbnB1dCBpcyAiYWJjIiwgbm8gbWF0Y2ggaXMgZm91bmQgYW5kICJhYiIgYXJlIGNvbnN1bWVkLgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfQ3R5cGU+CitfTElCQ1BQX0hJRERFTgorX0ZvcndhcmRJdGVyYXRvcgorX19zY2FuX2tleXdvcmQoX0lucHV0SXRlcmF0b3ImIF9fYiwgX0lucHV0SXRlcmF0b3IgX19lLAorICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2tiLCBfRm9yd2FyZEl0ZXJhdG9yIF9fa2UsCisgICAgICAgICAgICAgICBjb25zdCBfQ3R5cGUmIF9fY3QsIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgIGJvb2wgX19jYXNlX3NlbnNpdGl2ZSA9IHRydWUpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlIF9DaGFyVDsKKyAgICBzaXplX3QgX19ua3cgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9WU1REOjpkaXN0YW5jZShfX2tiLCBfX2tlKSk7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciBfX2RvZXNudF9tYXRjaCA9ICdcMCc7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciBfX21pZ2h0X21hdGNoID0gJ1wxJzsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIF9fZG9lc19tYXRjaCA9ICdcMic7CisgICAgdW5zaWduZWQgY2hhciBfX3N0YXRidWZbMTAwXTsKKyAgICB1bnNpZ25lZCBjaGFyKiBfX3N0YXR1cyA9IF9fc3RhdGJ1ZjsKKyAgICB1bmlxdWVfcHRyPHVuc2lnbmVkIGNoYXIsIHZvaWQoKikodm9pZCopPiBfX3N0YXRfaG9sZCgwLCBmcmVlKTsKKyAgICBpZiAoX19ua3cgPiBzaXplb2YoX19zdGF0YnVmKSkKKyAgICB7CisgICAgICAgIF9fc3RhdHVzID0gKHVuc2lnbmVkIGNoYXIqKW1hbGxvYyhfX25rdyk7CisgICAgICAgIGlmIChfX3N0YXR1cyA9PSAwKQorICAgICAgICAgICAgX190aHJvd19iYWRfYWxsb2MoKTsKKyAgICAgICAgX19zdGF0X2hvbGQucmVzZXQoX19zdGF0dXMpOworICAgIH0KKyAgICBzaXplX3QgX19uX21pZ2h0X21hdGNoID0gX19ua3c7ICAvLyBBdCB0aGlzIHBvaW50LCBhbnkga2V5d29yZCBtaWdodCBtYXRjaAorICAgIHNpemVfdCBfX25fZG9lc19tYXRjaCA9IDA7ICAgICAgIC8vIGJ1dCBub25lIG9mIHRoZW0gZGVmaW5pdGVseSBkbworICAgIC8vIEluaXRpYWxpemUgYWxsIHN0YXR1c2VzIHRvIF9fbWlnaHRfbWF0Y2gsIGV4Y2VwdCBmb3IgIiIga2V5d29yZHMgYXJlIF9fZG9lc19tYXRjaAorICAgIHVuc2lnbmVkIGNoYXIqIF9fc3QgPSBfX3N0YXR1czsKKyAgICBmb3IgKF9Gb3J3YXJkSXRlcmF0b3IgX19reSA9IF9fa2I7IF9fa3kgIT0gX19rZTsgKytfX2t5LCAodm9pZCkgKytfX3N0KQorICAgIHsKKyAgICAgICAgaWYgKCFfX2t5LT5lbXB0eSgpKQorICAgICAgICAgICAgKl9fc3QgPSBfX21pZ2h0X21hdGNoOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpfX3N0ID0gX19kb2VzX21hdGNoOworICAgICAgICAgICAgLS1fX25fbWlnaHRfbWF0Y2g7CisgICAgICAgICAgICArK19fbl9kb2VzX21hdGNoOworICAgICAgICB9CisgICAgfQorICAgIC8vIFdoaWxlIHRoZXJlIG1pZ2h0IGJlIGEgbWF0Y2gsIHRlc3Qga2V5d29yZHMgYWdhaW5zdCB0aGUgbmV4dCBDaGFyVAorICAgIGZvciAoc2l6ZV90IF9faW5keCA9IDA7IF9fYiAhPSBfX2UgJiYgX19uX21pZ2h0X21hdGNoID4gMDsgKytfX2luZHgpCisgICAgeworICAgICAgICAvLyBQZWVrIGF0IHRoZSBuZXh0IENoYXJUIGJ1dCBkb24ndCBjb25zdW1lIGl0CisgICAgICAgIF9DaGFyVCBfX2MgPSAqX19iOworICAgICAgICBpZiAoIV9fY2FzZV9zZW5zaXRpdmUpCisgICAgICAgICAgICBfX2MgPSBfX2N0LnRvdXBwZXIoX19jKTsKKyAgICAgICAgYm9vbCBfX2NvbnN1bWUgPSBmYWxzZTsKKyAgICAgICAgLy8gRm9yIGVhY2gga2V5d29yZCB3aGljaCBtaWdodCBtYXRjaCwgc2VlIGlmIHRoZSBfX2luZHggY2hhcmFjdGVyIGlzIF9fYworICAgICAgICAvLyBJZiBhIG1hdGNoIGlmIGZvdW5kLCBjb25zdW1lIF9fYworICAgICAgICAvLyBJZiBhIG1hdGNoIGlzIGZvdW5kLCBhbmQgdGhhdCBpcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGtleXdvcmQsCisgICAgICAgIC8vICAgIHRoZW4gdGhhdCBrZXl3b3JkIG1hdGNoZXMuCisgICAgICAgIC8vIElmIHRoZSBrZXl3b3JkIGRvZXNuJ3QgbWF0Y2ggdGhpcyBjaGFyYWN0ZXIsIHRoZW4gY2hhbmdlIHRoZSBrZXl3b3JkCisgICAgICAgIC8vICAgIHRvIGRvZXNuJ3QgbWF0Y2gKKyAgICAgICAgX19zdCA9IF9fc3RhdHVzOworICAgICAgICBmb3IgKF9Gb3J3YXJkSXRlcmF0b3IgX19reSA9IF9fa2I7IF9fa3kgIT0gX19rZTsgKytfX2t5LCAodm9pZCkgKytfX3N0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKl9fc3QgPT0gX19taWdodF9tYXRjaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfQ2hhclQgX19rYyA9ICgqX19reSlbX19pbmR4XTsKKyAgICAgICAgICAgICAgICBpZiAoIV9fY2FzZV9zZW5zaXRpdmUpCisgICAgICAgICAgICAgICAgICAgIF9fa2MgPSBfX2N0LnRvdXBwZXIoX19rYyk7CisgICAgICAgICAgICAgICAgaWYgKF9fYyA9PSBfX2tjKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX19jb25zdW1lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fa3ktPnNpemUoKSA9PSBfX2luZHgrMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKl9fc3QgPSBfX2RvZXNfbWF0Y2g7CisgICAgICAgICAgICAgICAgICAgICAgICAtLV9fbl9taWdodF9tYXRjaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrX19uX2RvZXNfbWF0Y2g7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKl9fc3QgPSBfX2RvZXNudF9tYXRjaDsKKyAgICAgICAgICAgICAgICAgICAgLS1fX25fbWlnaHRfbWF0Y2g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGNvbnN1bWUgaWYgd2UgbWF0Y2hlZCBhIGNoYXJhY3RlcgorICAgICAgICBpZiAoX19jb25zdW1lKQorICAgICAgICB7CisgICAgICAgICAgICArK19fYjsKKyAgICAgICAgICAgIC8vIElmIHdlIGNvbnN1bWVkIGEgY2hhcmFjdGVyIGFuZCB0aGVyZSBtaWdodCBiZSBhIG1hdGNoZWQga2V5d29yZCB0aGF0CisgICAgICAgICAgICAvLyAgIHdhcyBtYXJrZWQgbWF0Y2hlZCBvbiBhIHByZXZpb3VzIGl0ZXJhdGlvbiwgdGhlbiBzdWNoIGtleXdvcmRzCisgICAgICAgICAgICAvLyAgIHdoaWNoIGFyZSBub3cgbWFya2VkIGFzIG5vdCBtYXRjaGluZy4KKyAgICAgICAgICAgIGlmIChfX25fbWlnaHRfbWF0Y2ggKyBfX25fZG9lc19tYXRjaCA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19zdCA9IF9fc3RhdHVzOworICAgICAgICAgICAgICAgIGZvciAoX0ZvcndhcmRJdGVyYXRvciBfX2t5ID0gX19rYjsgX19reSAhPSBfX2tlOyArK19fa3ksICh2b2lkKSArK19fc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKl9fc3QgPT0gX19kb2VzX21hdGNoICYmIF9fa3ktPnNpemUoKSAhPSBfX2luZHgrMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKl9fc3QgPSBfX2RvZXNudF9tYXRjaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tX19uX2RvZXNfbWF0Y2g7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gV2UndmUgZXhpdGVkIHRoZSBsb29wIGJlY2F1c2Ugd2UgaGl0IGVvZiBhbmQvb3Igd2UgaGF2ZSBubyBtb3JlICJtaWdodCBtYXRjaGVzIi4KKyAgICBpZiAoX19iID09IF9fZSkKKyAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICAvLyBSZXR1cm4gdGhlIGZpcnN0IG1hdGNoaW5nIHJlc3VsdAorICAgIGZvciAoX19zdCA9IF9fc3RhdHVzOyBfX2tiICE9IF9fa2U7ICsrX19rYiwgKHZvaWQpICsrX19zdCkKKyAgICAgICAgaWYgKCpfX3N0ID09IF9fZG9lc19tYXRjaCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChfX2tiID09IF9fa2UpCisgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgIHJldHVybiBfX2tiOworfQorCitzdHJ1Y3QgX0xJQkNQUF9UWVBFX1ZJUyBfX251bV9nZXRfYmFzZQoreworICAgIHN0YXRpYyBjb25zdCBpbnQgX19udW1fZ2V0X2J1Zl9zeiA9IDQwOworCisgICAgc3RhdGljIGludCBfX2dldF9iYXNlKGlvc19iYXNlJik7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgX19zcmNbMzNdOworfTsKKworX0xJQkNQUF9GVU5DX1ZJUwordm9pZCBfX2NoZWNrX2dyb3VwaW5nKGNvbnN0IHN0cmluZyYgX19ncm91cGluZywgdW5zaWduZWQqIF9fZywgdW5zaWduZWQqIF9fZ19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyKTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3N0cnVjdCBfX251bV9nZXQKKyAgICA6IHByb3RlY3RlZCBfX251bV9nZXRfYmFzZQoreworICAgIHN0YXRpYyBzdHJpbmcgX19zdGFnZTJfZmxvYXRfcHJlcChpb3NfYmFzZSYgX19pb2IsIF9DaGFyVCogX19hdG9tcywgX0NoYXJUJiBfX2RlY2ltYWxfcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCYgX190aG91c2FuZHNfc2VwKTsKKworICAgIHN0YXRpYyBpbnQgX19zdGFnZTJfZmxvYXRfbG9vcChfQ2hhclQgX19jdCwgYm9vbCYgX19pbl91bml0cywgY2hhciYgX19leHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIF9fYSwgY2hhciomIF9fYV9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCBfX2RlY2ltYWxfcG9pbnQsIF9DaGFyVCBfX3Rob3VzYW5kc19zZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgX19ncm91cGluZywgdW5zaWduZWQqIF9fZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQqJiBfX2dfZW5kLCB1bnNpZ25lZCYgX19kYywgX0NoYXJUKiBfX2F0b21zKTsKKyNpZm5kZWYgX0xJQkNQUF9BQklfT1BUSU1JWkVEX0xPQ0FMRV9OVU1fR0VUCisgICAgc3RhdGljIHN0cmluZyBfX3N0YWdlMl9pbnRfcHJlcChpb3NfYmFzZSYgX19pb2IsIF9DaGFyVCogX19hdG9tcywgX0NoYXJUJiBfX3Rob3VzYW5kc19zZXApOworICAgIHN0YXRpYyBpbnQgX19zdGFnZTJfaW50X2xvb3AoX0NoYXJUIF9fY3QsIGludCBfX2Jhc2UsIGNoYXIqIF9fYSwgY2hhciomIF9fYV9lbmQsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCYgX19kYywgX0NoYXJUIF9fdGhvdXNhbmRzX3NlcCwgY29uc3Qgc3RyaW5nJiBfX2dyb3VwaW5nLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQqIF9fZywgdW5zaWduZWQqJiBfX2dfZW5kLCBfQ2hhclQqIF9fYXRvbXMpOworCisjZWxzZQorICAgIHN0YXRpYyBzdHJpbmcgX19zdGFnZTJfaW50X3ByZXAoaW9zX2Jhc2UmIF9faW9iLCBfQ2hhclQmIF9fdGhvdXNhbmRzX3NlcCkKKyAgICB7CisgICAgICAgIGxvY2FsZSBfX2xvYyA9IF9faW9iLmdldGxvYygpOworICAgICAgICBjb25zdCBudW1wdW5jdDxfQ2hhclQ+JiBfX25wID0gdXNlX2ZhY2V0PG51bXB1bmN0PF9DaGFyVD4gPihfX2xvYyk7CisgICAgICAgIF9fdGhvdXNhbmRzX3NlcCA9IF9fbnAudGhvdXNhbmRzX3NlcCgpOworICAgICAgICByZXR1cm4gX19ucC5ncm91cGluZygpOworICAgIH0KKworICAgIGNvbnN0IF9DaGFyVCogX19kb193aWRlbihpb3NfYmFzZSYgX19pb2IsIF9DaGFyVCogX19hdG9tcykgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gX19kb193aWRlbl9wKF9faW9iLCBfX2F0b21zKTsKKyAgICB9CisKKworICAgIHN0YXRpYyBpbnQgX19zdGFnZTJfaW50X2xvb3AoX0NoYXJUIF9fY3QsIGludCBfX2Jhc2UsIGNoYXIqIF9fYSwgY2hhciomIF9fYV9lbmQsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCYgX19kYywgX0NoYXJUIF9fdGhvdXNhbmRzX3NlcCwgY29uc3Qgc3RyaW5nJiBfX2dyb3VwaW5nLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQqIF9fZywgdW5zaWduZWQqJiBfX2dfZW5kLCBjb25zdCBfQ2hhclQqIF9fYXRvbXMpOworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNvbnN0IFQqIF9fZG9fd2lkZW5fcChpb3NfYmFzZSYgX19pb2IsIFQqIF9fYXRvbXMpIGNvbnN0CisgICAgeworICAgICAgbG9jYWxlIF9fbG9jID0gX19pb2IuZ2V0bG9jKCk7CisgICAgICB1c2VfZmFjZXQ8Y3R5cGU8VD4gPihfX2xvYykud2lkZW4oX19zcmMsIF9fc3JjICsgMjYsIF9fYXRvbXMpOworICAgICAgcmV0dXJuIF9fYXRvbXM7CisgICAgfQorCisgICAgY29uc3QgY2hhciogX19kb193aWRlbl9wKGlvc19iYXNlJiBfX2lvYiwgY2hhciogX19hdG9tcykgY29uc3QKKyAgICB7CisgICAgICAodm9pZClfX2lvYjsKKyAgICAgICh2b2lkKV9fYXRvbXM7CisgICAgICByZXR1cm4gX19zcmM7CisgICAgfQorI2VuZGlmCit9OworCisjaWZuZGVmIF9MSUJDUFBfQUJJX09QVElNSVpFRF9MT0NBTEVfTlVNX0dFVAordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3N0cmluZworX19udW1fZ2V0PF9DaGFyVD46Ol9fc3RhZ2UyX2ludF9wcmVwKGlvc19iYXNlJiBfX2lvYiwgX0NoYXJUKiBfX2F0b21zLCBfQ2hhclQmIF9fdGhvdXNhbmRzX3NlcCkKK3sKKyAgICBsb2NhbGUgX19sb2MgPSBfX2lvYi5nZXRsb2MoKTsKKyAgICB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKS53aWRlbihfX3NyYywgX19zcmMgKyAyNiwgX19hdG9tcyk7CisgICAgY29uc3QgbnVtcHVuY3Q8X0NoYXJUPiYgX19ucCA9IHVzZV9mYWNldDxudW1wdW5jdDxfQ2hhclQ+ID4oX19sb2MpOworICAgIF9fdGhvdXNhbmRzX3NlcCA9IF9fbnAudGhvdXNhbmRzX3NlcCgpOworICAgIHJldHVybiBfX25wLmdyb3VwaW5nKCk7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3N0cmluZworX19udW1fZ2V0PF9DaGFyVD46Ol9fc3RhZ2UyX2Zsb2F0X3ByZXAoaW9zX2Jhc2UmIF9faW9iLCBfQ2hhclQqIF9fYXRvbXMsIF9DaGFyVCYgX19kZWNpbWFsX3BvaW50LAorICAgICAgICAgICAgICAgICAgICBfQ2hhclQmIF9fdGhvdXNhbmRzX3NlcCkKK3sKKyAgICBsb2NhbGUgX19sb2MgPSBfX2lvYi5nZXRsb2MoKTsKKyAgICB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKS53aWRlbihfX3NyYywgX19zcmMgKyAzMiwgX19hdG9tcyk7CisgICAgY29uc3QgbnVtcHVuY3Q8X0NoYXJUPiYgX19ucCA9IHVzZV9mYWNldDxudW1wdW5jdDxfQ2hhclQ+ID4oX19sb2MpOworICAgIF9fZGVjaW1hbF9wb2ludCA9IF9fbnAuZGVjaW1hbF9wb2ludCgpOworICAgIF9fdGhvdXNhbmRzX3NlcCA9IF9fbnAudGhvdXNhbmRzX3NlcCgpOworICAgIHJldHVybiBfX25wLmdyb3VwaW5nKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitpbnQKKyNpZm5kZWYgX0xJQkNQUF9BQklfT1BUSU1JWkVEX0xPQ0FMRV9OVU1fR0VUCitfX251bV9nZXQ8X0NoYXJUPjo6X19zdGFnZTJfaW50X2xvb3AoX0NoYXJUIF9fY3QsIGludCBfX2Jhc2UsIGNoYXIqIF9fYSwgY2hhciomIF9fYV9lbmQsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCYgX19kYywgX0NoYXJUIF9fdGhvdXNhbmRzX3NlcCwgY29uc3Qgc3RyaW5nJiBfX2dyb3VwaW5nLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQqIF9fZywgdW5zaWduZWQqJiBfX2dfZW5kLCBfQ2hhclQqIF9fYXRvbXMpCisjZWxzZQorX19udW1fZ2V0PF9DaGFyVD46Ol9fc3RhZ2UyX2ludF9sb29wKF9DaGFyVCBfX2N0LCBpbnQgX19iYXNlLCBjaGFyKiBfX2EsIGNoYXIqJiBfX2FfZW5kLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQmIF9fZGMsIF9DaGFyVCBfX3Rob3VzYW5kc19zZXAsIGNvbnN0IHN0cmluZyYgX19ncm91cGluZywKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkKiBfX2csIHVuc2lnbmVkKiYgX19nX2VuZCwgY29uc3QgX0NoYXJUKiBfX2F0b21zKQorCisjZW5kaWYKK3sKKyAgICBpZiAoX19hX2VuZCA9PSBfX2EgJiYgKF9fY3QgPT0gX19hdG9tc1syNF0gfHwgX19jdCA9PSBfX2F0b21zWzI1XSkpCisgICAgeworICAgICAgICAqX19hX2VuZCsrID0gX19jdCA9PSBfX2F0b21zWzI0XSA/ICcrJyA6ICctJzsKKyAgICAgICAgX19kYyA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoX19ncm91cGluZy5zaXplKCkgIT0gMCAmJiBfX2N0ID09IF9fdGhvdXNhbmRzX3NlcCkKKyAgICB7CisgICAgICAgIGlmIChfX2dfZW5kLV9fZyA8IF9fbnVtX2dldF9idWZfc3opCisgICAgICAgIHsKKyAgICAgICAgICAgICpfX2dfZW5kKysgPSBfX2RjOworICAgICAgICAgICAgX19kYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHB0cmRpZmZfdCBfX2YgPSBmaW5kKF9fYXRvbXMsIF9fYXRvbXMgKyAyNiwgX19jdCkgLSBfX2F0b21zOworICAgIGlmIChfX2YgPj0gMjQpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzd2l0Y2ggKF9fYmFzZSkKKyAgICB7CisgICAgY2FzZSA4OgorICAgIGNhc2UgMTA6CisgICAgICAgIGlmIChfX2YgPj0gX19iYXNlKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgICAgICBpZiAoX19mIDwgMjIpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKF9fYV9lbmQgIT0gX19hICYmIF9fYV9lbmQgLSBfX2EgPD0gMiAmJiBfX2FfZW5kWy0xXSA9PSAnMCcpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fZGMgPSAwOworICAgICAgICAgICAgKl9fYV9lbmQrKyA9IF9fc3JjW19fZl07CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICpfX2FfZW5kKysgPSBfX3NyY1tfX2ZdOworICAgICsrX19kYzsKKyAgICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2ludAorX19udW1fZ2V0PF9DaGFyVD46Ol9fc3RhZ2UyX2Zsb2F0X2xvb3AoX0NoYXJUIF9fY3QsIGJvb2wmIF9faW5fdW5pdHMsIGNoYXImIF9fZXhwLCBjaGFyKiBfX2EsIGNoYXIqJiBfX2FfZW5kLAorICAgICAgICAgICAgICAgICAgICBfQ2hhclQgX19kZWNpbWFsX3BvaW50LCBfQ2hhclQgX190aG91c2FuZHNfc2VwLCBjb25zdCBzdHJpbmcmIF9fZ3JvdXBpbmcsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkKiBfX2csIHVuc2lnbmVkKiYgX19nX2VuZCwgdW5zaWduZWQmIF9fZGMsIF9DaGFyVCogX19hdG9tcykKK3sKKyAgICBpZiAoX19jdCA9PSBfX2RlY2ltYWxfcG9pbnQpCisgICAgeworICAgICAgICBpZiAoIV9faW5fdW5pdHMpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIF9faW5fdW5pdHMgPSBmYWxzZTsKKyAgICAgICAgKl9fYV9lbmQrKyA9ICcuJzsKKyAgICAgICAgaWYgKF9fZ3JvdXBpbmcuc2l6ZSgpICE9IDAgJiYgX19nX2VuZC1fX2cgPCBfX251bV9nZXRfYnVmX3N6KQorICAgICAgICAgICAgKl9fZ19lbmQrKyA9IF9fZGM7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoX19jdCA9PSBfX3Rob3VzYW5kc19zZXAgJiYgX19ncm91cGluZy5zaXplKCkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghX19pbl91bml0cykKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKF9fZ19lbmQtX19nIDwgX19udW1fZ2V0X2J1Zl9zeikKKyAgICAgICAgeworICAgICAgICAgICAgKl9fZ19lbmQrKyA9IF9fZGM7CisgICAgICAgICAgICBfX2RjID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcHRyZGlmZl90IF9fZiA9IGZpbmQoX19hdG9tcywgX19hdG9tcyArIDMyLCBfX2N0KSAtIF9fYXRvbXM7CisgICAgaWYgKF9fZiA+PSAzMikKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGNoYXIgX194ID0gX19zcmNbX19mXTsKKyAgICBpZiAoX194ID09ICctJyB8fCBfX3ggPT0gJysnKQorICAgIHsKKyAgICAgICAgaWYgKF9fYV9lbmQgPT0gX19hIHx8IChfX2FfZW5kWy0xXSAmIDB4NUYpID09IChfX2V4cCAmIDB4N0YpKQorICAgICAgICB7CisgICAgICAgICAgICAqX19hX2VuZCsrID0gX194OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoX194ID09ICd4JyB8fCBfX3ggPT0gJ1gnKQorICAgICAgICBfX2V4cCA9ICdQJzsKKyAgICBlbHNlIGlmICgoX194ICYgMHg1RikgPT0gX19leHApCisgICAgeworICAgICAgICBfX2V4cCB8PSAweDgwOworICAgICAgICBpZiAoX19pbl91bml0cykKKyAgICAgICAgeworICAgICAgICAgICAgX19pbl91bml0cyA9IGZhbHNlOworICAgICAgICAgICAgaWYgKF9fZ3JvdXBpbmcuc2l6ZSgpICE9IDAgJiYgX19nX2VuZC1fX2cgPCBfX251bV9nZXRfYnVmX3N6KQorICAgICAgICAgICAgICAgICpfX2dfZW5kKysgPSBfX2RjOworICAgICAgICB9CisgICAgfQorICAgICpfX2FfZW5kKysgPSBfX3g7CisgICAgaWYgKF9fZiA+PSAyMikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgKytfX2RjOworICAgIHJldHVybiAwOworfQorCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURTIoc3RydWN0IF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIF9fbnVtX2dldDxjaGFyPikKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFMihzdHJ1Y3QgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfVFlQRV9WSVMgX19udW1fZ2V0PHdjaGFyX3Q+KQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvciA9IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBudW1fZ2V0CisgICAgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwKKyAgICAgIHByaXZhdGUgX19udW1fZ2V0PF9DaGFyVD4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9DaGFyVCBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBfSW5wdXRJdGVyYXRvciBpdGVyX3R5cGU7CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBleHBsaWNpdCBudW1fZ2V0KHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgICA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKSB7fQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgaXRlcl90eXBlIGdldChpdGVyX3R5cGUgX19iLCBpdGVyX3R5cGUgX19lLCBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGJvb2wmIF9fdikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19nZXQoX19iLCBfX2UsIF9faW9iLCBfX2VyciwgX192KTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBpdGVyX3R5cGUgZ2V0KGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyYgX192KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX2dldChfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX3YpOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGl0ZXJfdHlwZSBnZXQoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nIGxvbmcmIF9fdikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19nZXQoX19iLCBfX2UsIF9faW9iLCBfX2VyciwgX192KTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBpdGVyX3R5cGUgZ2V0KGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgc2hvcnQmIF9fdikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19nZXQoX19iLCBfX2UsIF9faW9iLCBfX2VyciwgX192KTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBpdGVyX3R5cGUgZ2V0KGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgaW50JiBfX3YpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fZ2V0KF9fYiwgX19lLCBfX2lvYiwgX19lcnIsIF9fdik7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgaXRlcl90eXBlIGdldChpdGVyX3R5cGUgX19iLCBpdGVyX3R5cGUgX19lLCBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVuc2lnbmVkIGxvbmcmIF9fdikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19nZXQoX19iLCBfX2UsIF9faW9iLCBfX2VyciwgX192KTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBpdGVyX3R5cGUgZ2V0KGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgbG9uZyBsb25nJiBfX3YpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fZ2V0KF9fYiwgX19lLCBfX2lvYiwgX19lcnIsIF9fdik7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgaXRlcl90eXBlIGdldChpdGVyX3R5cGUgX19iLCBpdGVyX3R5cGUgX19lLCBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGZsb2F0JiBfX3YpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fZ2V0KF9fYiwgX19lLCBfX2lvYiwgX19lcnIsIF9fdik7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgaXRlcl90eXBlIGdldChpdGVyX3R5cGUgX19iLCBpdGVyX3R5cGUgX19lLCBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGRvdWJsZSYgX192KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX2dldChfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX3YpOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGl0ZXJfdHlwZSBnZXQoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nIGRvdWJsZSYgX192KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX2dldChfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX3YpOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGl0ZXJfdHlwZSBnZXQoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB2b2lkKiYgX192KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX2dldChfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX3YpOworICAgIH0KKworICAgIHN0YXRpYyBsb2NhbGU6OmlkIGlkOworCitwcm90ZWN0ZWQ6CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgfm51bV9nZXQoKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9GcD4KKyAgICBfTElCQ1BQX01FVEhPRF9URU1QTEFURV9JTVBMSUNJVF9JTlNUQU5USUFUSU9OX1ZJUworICAgIGl0ZXJfdHlwZSBfX2RvX2dldF9mbG9hdGluZ19wb2ludAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVyX3R5cGUgX19iLCBpdGVyX3R5cGUgX19lLCBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgX0ZwJiBfX3YpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9TaWduZWQ+CisgICAgX0xJQkNQUF9NRVRIT0RfVEVNUExBVEVfSU1QTElDSVRfSU5TVEFOVElBVElPTl9WSVMKKyAgICBpdGVyX3R5cGUgX19kb19nZXRfc2lnbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBfU2lnbmVkJiBfX3YpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9VbnNpZ25lZD4KKyAgICBfTElCQ1BQX01FVEhPRF9URU1QTEFURV9JTVBMSUNJVF9JTlNUQU5USUFUSU9OX1ZJUworICAgIGl0ZXJfdHlwZSBfX2RvX2dldF91bnNpZ25lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVyX3R5cGUgX19iLCBpdGVyX3R5cGUgX19lLCBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgX1Vuc2lnbmVkJiBfX3YpIGNvbnN0OworCisKKyAgICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19nZXQoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGJvb2wmIF9fdikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19nZXQoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGxvbmcmIF9fdikgY29uc3QKKyAgICB7IHJldHVybiB0aGlzLT5fX2RvX2dldF9zaWduZWQgKCBfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX3YgKTsgfQorCisgICAgdmlydHVhbCBpdGVyX3R5cGUgZG9fZ2V0KGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nIGxvbmcmIF9fdikgY29uc3QKKyAgICB7IHJldHVybiB0aGlzLT5fX2RvX2dldF9zaWduZWQgKCBfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX3YgKTsgfQorCisgICAgdmlydHVhbCBpdGVyX3R5cGUgZG9fZ2V0KGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBzaG9ydCYgX192KSBjb25zdAorICAgIHsgcmV0dXJuIHRoaXMtPl9fZG9fZ2V0X3Vuc2lnbmVkICggX19iLCBfX2UsIF9faW9iLCBfX2VyciwgX192ICk7IH0KKworICAgIHZpcnR1YWwgaXRlcl90eXBlIGRvX2dldChpdGVyX3R5cGUgX19iLCBpdGVyX3R5cGUgX19lLCBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgaW50JiBfX3YpIGNvbnN0CisgICAgeyByZXR1cm4gdGhpcy0+X19kb19nZXRfdW5zaWduZWQgKCBfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX3YgKTsgfQorCisgICAgdmlydHVhbCBpdGVyX3R5cGUgZG9fZ2V0KGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBsb25nJiBfX3YpIGNvbnN0CisgICAgeyByZXR1cm4gdGhpcy0+X19kb19nZXRfdW5zaWduZWQgKCBfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX3YgKTsgfQorCisgICAgdmlydHVhbCBpdGVyX3R5cGUgZG9fZ2V0KGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBsb25nIGxvbmcmIF9fdikgY29uc3QKKyAgICB7IHJldHVybiB0aGlzLT5fX2RvX2dldF91bnNpZ25lZCAoIF9fYiwgX19lLCBfX2lvYiwgX19lcnIsIF9fdiApOyB9CisKKyAgICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19nZXQoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGZsb2F0JiBfX3YpIGNvbnN0CisgICAgeyByZXR1cm4gdGhpcy0+X19kb19nZXRfZmxvYXRpbmdfcG9pbnQgKCBfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX3YgKTsgfQorCisgICAgdmlydHVhbCBpdGVyX3R5cGUgZG9fZ2V0KGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBkb3VibGUmIF9fdikgY29uc3QKKyAgICB7IHJldHVybiB0aGlzLT5fX2RvX2dldF9mbG9hdGluZ19wb2ludCAoIF9fYiwgX19lLCBfX2lvYiwgX19lcnIsIF9fdiApOyB9CisKKyAgICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19nZXQoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGxvbmcgZG91YmxlJiBfX3YpIGNvbnN0CisgICAgeyByZXR1cm4gdGhpcy0+X19kb19nZXRfZmxvYXRpbmdfcG9pbnQgKCBfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX3YgKTsgfQorCisgICAgdmlydHVhbCBpdGVyX3R5cGUgZG9fZ2V0KGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB2b2lkKiYgX192KSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorbG9jYWxlOjppZAorbnVtX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXJhdG9yPjo6aWQ7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfVHAKK19fbnVtX2dldF9zaWduZWRfaW50ZWdyYWwoY29uc3QgY2hhciogX19hLCBjb25zdCBjaGFyKiBfX2FfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGludCBfX2Jhc2UpCit7CisgICAgaWYgKF9fYSAhPSBfX2FfZW5kKQorICAgIHsKKyAgICAgICAgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxkZWNsdHlwZShlcnJubyk+Ojp0eXBlIF9fc2F2ZV9lcnJubyA9IGVycm5vOworICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGNoYXIgKl9fcDI7CisgICAgICAgIGxvbmcgbG9uZyBfX2xsID0gc3RydG9sbF9sKF9fYSwgJl9fcDIsIF9fYmFzZSwgX0xJQkNQUF9HRVRfQ19MT0NBTEUpOworICAgICAgICB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPGRlY2x0eXBlKGVycm5vKT46OnR5cGUgX19jdXJyZW50X2Vycm5vID0gZXJybm87CisgICAgICAgIGlmIChfX2N1cnJlbnRfZXJybm8gPT0gMCkKKyAgICAgICAgICAgIGVycm5vID0gX19zYXZlX2Vycm5vOworICAgICAgICBpZiAoX19wMiAhPSBfX2FfZW5kKQorICAgICAgICB7CisgICAgICAgICAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoX19jdXJyZW50X2Vycm5vID09IEVSQU5HRSAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgIF9fbGwgPCBudW1lcmljX2xpbWl0czxfVHA+OjptaW4oKSB8fAorICAgICAgICAgICAgICAgICBudW1lcmljX2xpbWl0czxfVHA+OjptYXgoKSA8IF9fbGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgICAgICBpZiAoX19sbCA+IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bWVyaWNfbGltaXRzPF9UcD46Om1heCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBudW1lcmljX2xpbWl0czxfVHA+OjptaW4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPihfX2xsKTsKKyAgICB9CisgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19UcAorX19udW1fZ2V0X3Vuc2lnbmVkX2ludGVncmFsKGNvbnN0IGNoYXIqIF9fYSwgY29uc3QgY2hhciogX19hX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGludCBfX2Jhc2UpCit7CisgICAgaWYgKF9fYSAhPSBfX2FfZW5kKQorICAgIHsKKyAgICAgICAgY29uc3QgYm9vbCBfX25lZ2F0ZSA9ICpfX2EgPT0gJy0nOworICAgICAgICBpZiAoX19uZWdhdGUgJiYgKytfX2EgPT0gX19hX2VuZCkgeworICAgICAgICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxkZWNsdHlwZShlcnJubyk+Ojp0eXBlIF9fc2F2ZV9lcnJubyA9IGVycm5vOworICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGNoYXIgKl9fcDI7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2xsID0gc3RydG91bGxfbChfX2EsICZfX3AyLCBfX2Jhc2UsIF9MSUJDUFBfR0VUX0NfTE9DQUxFKTsKKyAgICAgICAgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxkZWNsdHlwZShlcnJubyk+Ojp0eXBlIF9fY3VycmVudF9lcnJubyA9IGVycm5vOworICAgICAgICBpZiAoX19jdXJyZW50X2Vycm5vID09IDApCisgICAgICAgICAgICBlcnJubyA9IF9fc2F2ZV9lcnJubzsKKyAgICAgICAgaWYgKF9fcDIgIT0gX19hX2VuZCkKKyAgICAgICAgeworICAgICAgICAgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKF9fY3VycmVudF9lcnJubyA9PSBFUkFOR0UgfHwgbnVtZXJpY19saW1pdHM8X1RwPjo6bWF4KCkgPCBfX2xsKQorICAgICAgICB7CisgICAgICAgICAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICAgICAgcmV0dXJuIG51bWVyaWNfbGltaXRzPF9UcD46Om1heCgpOworICAgICAgICB9CisgICAgICAgIF9UcCBfX3JlcyA9IHN0YXRpY19jYXN0PF9UcD4oX19sbCk7CisgICAgICAgIGlmIChfX25lZ2F0ZSkgX19yZXMgPSAtX19yZXM7CisgICAgICAgIHJldHVybiBfX3JlczsKKyAgICB9CisgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19UcCBfX2RvX3N0cnRvZChjb25zdCBjaGFyKiBfX2EsIGNoYXIqKiBfX3AyKTsKKwordGVtcGxhdGUgPD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitmbG9hdCBfX2RvX3N0cnRvZDxmbG9hdD4oY29uc3QgY2hhciogX19hLCBjaGFyKiogX19wMikgeworICAgIHJldHVybiBzdHJ0b2ZfbChfX2EsIF9fcDIsIF9MSUJDUFBfR0VUX0NfTE9DQUxFKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitkb3VibGUgX19kb19zdHJ0b2Q8ZG91YmxlPihjb25zdCBjaGFyKiBfX2EsIGNoYXIqKiBfX3AyKSB7CisgICAgcmV0dXJuIHN0cnRvZF9sKF9fYSwgX19wMiwgX0xJQkNQUF9HRVRfQ19MT0NBTEUpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2xvbmcgZG91YmxlIF9fZG9fc3RydG9kPGxvbmcgZG91YmxlPihjb25zdCBjaGFyKiBfX2EsIGNoYXIqKiBfX3AyKSB7CisgICAgcmV0dXJuIHN0cnRvbGRfbChfX2EsIF9fcDIsIF9MSUJDUFBfR0VUX0NfTE9DQUxFKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSElEREVOCitfVHAKK19fbnVtX2dldF9mbG9hdChjb25zdCBjaGFyKiBfX2EsIGNvbnN0IGNoYXIqIF9fYV9lbmQsIGlvc19iYXNlOjppb3N0YXRlJiBfX2VycikKK3sKKyAgICBpZiAoX19hICE9IF9fYV9lbmQpCisgICAgeworICAgICAgICB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPGRlY2x0eXBlKGVycm5vKT46OnR5cGUgX19zYXZlX2Vycm5vID0gZXJybm87CisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgY2hhciAqX19wMjsKKyAgICAgICAgX1RwIF9fbGQgPSBfX2RvX3N0cnRvZDxfVHA+KF9fYSwgJl9fcDIpOworICAgICAgICB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPGRlY2x0eXBlKGVycm5vKT46OnR5cGUgX19jdXJyZW50X2Vycm5vID0gZXJybm87CisgICAgICAgIGlmIChfX2N1cnJlbnRfZXJybm8gPT0gMCkKKyAgICAgICAgICAgIGVycm5vID0gX19zYXZlX2Vycm5vOworICAgICAgICBpZiAoX19wMiAhPSBfX2FfZW5kKQorICAgICAgICB7CisgICAgICAgICAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoX19jdXJyZW50X2Vycm5vID09IEVSQU5HRSkKKyAgICAgICAgICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgIHJldHVybiBfX2xkOworICAgIH0KKyAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworICAgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK19JbnB1dEl0ZXJhdG9yCitudW1fZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+Ojpkb19nZXQoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIF9fdikgY29uc3QKK3sKKyAgICBpZiAoKF9faW9iLmZsYWdzKCkgJiBpb3NfYmFzZTo6Ym9vbGFscGhhKSA9PSAwKQorICAgIHsKKyAgICAgICAgbG9uZyBfX2x2ID0gLTE7CisgICAgICAgIF9fYiA9IGRvX2dldChfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX2x2KTsKKyAgICAgICAgc3dpdGNoIChfX2x2KQorICAgICAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIF9fdiA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIF9fdiA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIF9fdiA9IHRydWU7CisgICAgICAgICAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fYjsKKyAgICB9CisgICAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdCA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19pb2IuZ2V0bG9jKCkpOworICAgIGNvbnN0IG51bXB1bmN0PF9DaGFyVD4mIF9fbnAgPSB1c2VfZmFjZXQ8bnVtcHVuY3Q8X0NoYXJUPiA+KF9faW9iLmdldGxvYygpKTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIG51bXB1bmN0PF9DaGFyVD46OnN0cmluZ190eXBlIHN0cmluZ190eXBlOworICAgIGNvbnN0IHN0cmluZ190eXBlIF9fbmFtZXNbMl0gPSB7X19ucC50cnVlbmFtZSgpLCBfX25wLmZhbHNlbmFtZSgpfTsKKyAgICBjb25zdCBzdHJpbmdfdHlwZSogX19pID0gX19zY2FuX2tleXdvcmQoX19iLCBfX2UsIF9fbmFtZXMsIF9fbmFtZXMrMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jdCwgX19lcnIpOworICAgIF9fdiA9IF9faSA9PSBfX25hbWVzOworICAgIHJldHVybiBfX2I7Cit9CisKKy8vIHNpZ25lZAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfU2lnbmVkPgorX0lucHV0SXRlcmF0b3IKK251bV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyYXRvcj46Ol9fZG9fZ2V0X3NpZ25lZChpdGVyX3R5cGUgX19iLCBpdGVyX3R5cGUgX19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NpZ25lZCYgX192KSBjb25zdAoreworICAgIC8vIFN0YWdlIDEKKyAgICBpbnQgX19iYXNlID0gdGhpcy0+X19nZXRfYmFzZShfX2lvYik7CisgICAgLy8gU3RhZ2UgMgorICAgIGNoYXJfdHlwZSBfX3Rob3VzYW5kc19zZXA7CisgICAgY29uc3QgaW50IF9fYXRvbXNfc2l6ZSA9IDI2OworI2lmZGVmIF9MSUJDUFBfQUJJX09QVElNSVpFRF9MT0NBTEVfTlVNX0dFVAorICAgIGNoYXJfdHlwZSBfX2F0b21zMVtfX2F0b21zX3NpemVdOworICAgIGNvbnN0IGNoYXJfdHlwZSAqX19hdG9tcyA9IHRoaXMtPl9fZG9fd2lkZW4oX19pb2IsIF9fYXRvbXMxKTsKKyAgICBzdHJpbmcgX19ncm91cGluZyA9IHRoaXMtPl9fc3RhZ2UyX2ludF9wcmVwKF9faW9iLCBfX3Rob3VzYW5kc19zZXApOworI2Vsc2UKKyAgICBjaGFyX3R5cGUgX19hdG9tc1tfX2F0b21zX3NpemVdOworICAgIHN0cmluZyBfX2dyb3VwaW5nID0gdGhpcy0+X19zdGFnZTJfaW50X3ByZXAoX19pb2IsIF9fYXRvbXMsIF9fdGhvdXNhbmRzX3NlcCk7CisjZW5kaWYKKyAgICBzdHJpbmcgX19idWY7CisgICAgX19idWYucmVzaXplKF9fYnVmLmNhcGFjaXR5KCkpOworICAgIGNoYXIqIF9fYSA9ICZfX2J1ZlswXTsKKyAgICBjaGFyKiBfX2FfZW5kID0gX19hOworICAgIHVuc2lnbmVkIF9fZ1tfX251bV9nZXRfYmFzZTo6X19udW1fZ2V0X2J1Zl9zel07CisgICAgdW5zaWduZWQqIF9fZ19lbmQgPSBfX2c7CisgICAgdW5zaWduZWQgX19kYyA9IDA7CisgICAgZm9yICg7IF9fYiAhPSBfX2U7ICsrX19iKQorICAgIHsKKyAgICAgICAgaWYgKF9fYV9lbmQgPT0gX19hICsgX19idWYuc2l6ZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgX190bXAgPSBfX2J1Zi5zaXplKCk7CisgICAgICAgICAgICBfX2J1Zi5yZXNpemUoMipfX2J1Zi5zaXplKCkpOworICAgICAgICAgICAgX19idWYucmVzaXplKF9fYnVmLmNhcGFjaXR5KCkpOworICAgICAgICAgICAgX19hID0gJl9fYnVmWzBdOworICAgICAgICAgICAgX19hX2VuZCA9IF9fYSArIF9fdG1wOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLT5fX3N0YWdlMl9pbnRfbG9vcCgqX19iLCBfX2Jhc2UsIF9fYSwgX19hX2VuZCwgX19kYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGhvdXNhbmRzX3NlcCwgX19ncm91cGluZywgX19nLCBfX2dfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hdG9tcykpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKF9fZ3JvdXBpbmcuc2l6ZSgpICE9IDAgJiYgX19nX2VuZC1fX2cgPCBfX251bV9nZXRfYmFzZTo6X19udW1fZ2V0X2J1Zl9zeikKKyAgICAgICAgKl9fZ19lbmQrKyA9IF9fZGM7CisgICAgLy8gU3RhZ2UgMworICAgIF9fdiA9IF9fbnVtX2dldF9zaWduZWRfaW50ZWdyYWw8X1NpZ25lZD4oX19hLCBfX2FfZW5kLCBfX2VyciwgX19iYXNlKTsKKyAgICAvLyBEaWdpdCBncm91cGluZyBjaGVja2VkCisgICAgX19jaGVja19ncm91cGluZyhfX2dyb3VwaW5nLCBfX2csIF9fZ19lbmQsIF9fZXJyKTsKKyAgICAvLyBFT0YgY2hlY2tlZAorICAgIGlmIChfX2IgPT0gX19lKQorICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgIHJldHVybiBfX2I7Cit9CisKKy8vIHVuc2lnbmVkCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9VbnNpZ25lZD4KK19JbnB1dEl0ZXJhdG9yCitudW1fZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+OjpfX2RvX2dldF91bnNpZ25lZChpdGVyX3R5cGUgX19iLCBpdGVyX3R5cGUgX19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1Vuc2lnbmVkJiBfX3YpIGNvbnN0Cit7CisgICAgLy8gU3RhZ2UgMQorICAgIGludCBfX2Jhc2UgPSB0aGlzLT5fX2dldF9iYXNlKF9faW9iKTsKKyAgICAvLyBTdGFnZSAyCisgICAgY2hhcl90eXBlIF9fdGhvdXNhbmRzX3NlcDsKKyAgICBjb25zdCBpbnQgX19hdG9tc19zaXplID0gMjY7CisjaWZkZWYgX0xJQkNQUF9BQklfT1BUSU1JWkVEX0xPQ0FMRV9OVU1fR0VUCisgICAgY2hhcl90eXBlIF9fYXRvbXMxW19fYXRvbXNfc2l6ZV07CisgICAgY29uc3QgY2hhcl90eXBlICpfX2F0b21zID0gdGhpcy0+X19kb193aWRlbihfX2lvYiwgX19hdG9tczEpOworICAgIHN0cmluZyBfX2dyb3VwaW5nID0gdGhpcy0+X19zdGFnZTJfaW50X3ByZXAoX19pb2IsIF9fdGhvdXNhbmRzX3NlcCk7CisjZWxzZQorICAgIGNoYXJfdHlwZSBfX2F0b21zW19fYXRvbXNfc2l6ZV07CisgICAgc3RyaW5nIF9fZ3JvdXBpbmcgPSB0aGlzLT5fX3N0YWdlMl9pbnRfcHJlcChfX2lvYiwgX19hdG9tcywgX190aG91c2FuZHNfc2VwKTsKKyNlbmRpZgorICAgIHN0cmluZyBfX2J1ZjsKKyAgICBfX2J1Zi5yZXNpemUoX19idWYuY2FwYWNpdHkoKSk7CisgICAgY2hhciogX19hID0gJl9fYnVmWzBdOworICAgIGNoYXIqIF9fYV9lbmQgPSBfX2E7CisgICAgdW5zaWduZWQgX19nW19fbnVtX2dldF9iYXNlOjpfX251bV9nZXRfYnVmX3N6XTsKKyAgICB1bnNpZ25lZCogX19nX2VuZCA9IF9fZzsKKyAgICB1bnNpZ25lZCBfX2RjID0gMDsKKyAgICBmb3IgKDsgX19iICE9IF9fZTsgKytfX2IpCisgICAgeworICAgICAgICBpZiAoX19hX2VuZCA9PSBfX2EgKyBfX2J1Zi5zaXplKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdCBfX3RtcCA9IF9fYnVmLnNpemUoKTsKKyAgICAgICAgICAgIF9fYnVmLnJlc2l6ZSgyKl9fYnVmLnNpemUoKSk7CisgICAgICAgICAgICBfX2J1Zi5yZXNpemUoX19idWYuY2FwYWNpdHkoKSk7CisgICAgICAgICAgICBfX2EgPSAmX19idWZbMF07CisgICAgICAgICAgICBfX2FfZW5kID0gX19hICsgX190bXA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMtPl9fc3RhZ2UyX2ludF9sb29wKCpfX2IsIF9fYmFzZSwgX19hLCBfX2FfZW5kLCBfX2RjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190aG91c2FuZHNfc2VwLCBfX2dyb3VwaW5nLCBfX2csIF9fZ19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2F0b21zKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoX19ncm91cGluZy5zaXplKCkgIT0gMCAmJiBfX2dfZW5kLV9fZyA8IF9fbnVtX2dldF9iYXNlOjpfX251bV9nZXRfYnVmX3N6KQorICAgICAgICAqX19nX2VuZCsrID0gX19kYzsKKyAgICAvLyBTdGFnZSAzCisgICAgX192ID0gX19udW1fZ2V0X3Vuc2lnbmVkX2ludGVncmFsPF9VbnNpZ25lZD4oX19hLCBfX2FfZW5kLCBfX2VyciwgX19iYXNlKTsKKyAgICAvLyBEaWdpdCBncm91cGluZyBjaGVja2VkCisgICAgX19jaGVja19ncm91cGluZyhfX2dyb3VwaW5nLCBfX2csIF9fZ19lbmQsIF9fZXJyKTsKKyAgICAvLyBFT0YgY2hlY2tlZAorICAgIGlmIChfX2IgPT0gX19lKQorICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgIHJldHVybiBfX2I7Cit9CisKKy8vIGZsb2F0aW5nIHBvaW50CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9GcD4KK19JbnB1dEl0ZXJhdG9yCitudW1fZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+OjpfX2RvX2dldF9mbG9hdGluZ19wb2ludChpdGVyX3R5cGUgX19iLCBpdGVyX3R5cGUgX19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZwJiBfX3YpIGNvbnN0Cit7CisgICAgLy8gU3RhZ2UgMSwgbm90aGluZyB0byBkbworICAgIC8vIFN0YWdlIDIKKyAgICBjaGFyX3R5cGUgX19hdG9tc1szMl07CisgICAgY2hhcl90eXBlIF9fZGVjaW1hbF9wb2ludDsKKyAgICBjaGFyX3R5cGUgX190aG91c2FuZHNfc2VwOworICAgIHN0cmluZyBfX2dyb3VwaW5nID0gdGhpcy0+X19zdGFnZTJfZmxvYXRfcHJlcChfX2lvYiwgX19hdG9tcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kZWNpbWFsX3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Rob3VzYW5kc19zZXApOworICAgIHN0cmluZyBfX2J1ZjsKKyAgICBfX2J1Zi5yZXNpemUoX19idWYuY2FwYWNpdHkoKSk7CisgICAgY2hhciogX19hID0gJl9fYnVmWzBdOworICAgIGNoYXIqIF9fYV9lbmQgPSBfX2E7CisgICAgdW5zaWduZWQgX19nW19fbnVtX2dldF9iYXNlOjpfX251bV9nZXRfYnVmX3N6XTsKKyAgICB1bnNpZ25lZCogX19nX2VuZCA9IF9fZzsKKyAgICB1bnNpZ25lZCBfX2RjID0gMDsKKyAgICBib29sIF9faW5fdW5pdHMgPSB0cnVlOworICAgIGNoYXIgX19leHAgPSAnRSc7CisgICAgZm9yICg7IF9fYiAhPSBfX2U7ICsrX19iKQorICAgIHsKKyAgICAgICAgaWYgKF9fYV9lbmQgPT0gX19hICsgX19idWYuc2l6ZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgX190bXAgPSBfX2J1Zi5zaXplKCk7CisgICAgICAgICAgICBfX2J1Zi5yZXNpemUoMipfX2J1Zi5zaXplKCkpOworICAgICAgICAgICAgX19idWYucmVzaXplKF9fYnVmLmNhcGFjaXR5KCkpOworICAgICAgICAgICAgX19hID0gJl9fYnVmWzBdOworICAgICAgICAgICAgX19hX2VuZCA9IF9fYSArIF9fdG1wOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLT5fX3N0YWdlMl9mbG9hdF9sb29wKCpfX2IsIF9faW5fdW5pdHMsIF9fZXhwLCBfX2EsIF9fYV9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZGVjaW1hbF9wb2ludCwgX190aG91c2FuZHNfc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dyb3VwaW5nLCBfX2csIF9fZ19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZGMsIF9fYXRvbXMpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChfX2dyb3VwaW5nLnNpemUoKSAhPSAwICYmIF9faW5fdW5pdHMgJiYgX19nX2VuZC1fX2cgPCBfX251bV9nZXRfYmFzZTo6X19udW1fZ2V0X2J1Zl9zeikKKyAgICAgICAgKl9fZ19lbmQrKyA9IF9fZGM7CisgICAgLy8gU3RhZ2UgMworICAgIF9fdiA9IF9fbnVtX2dldF9mbG9hdDxfRnA+KF9fYSwgX19hX2VuZCwgX19lcnIpOworICAgIC8vIERpZ2l0IGdyb3VwaW5nIGNoZWNrZWQKKyAgICBfX2NoZWNrX2dyb3VwaW5nKF9fZ3JvdXBpbmcsIF9fZywgX19nX2VuZCwgX19lcnIpOworICAgIC8vIEVPRiBjaGVja2VkCisgICAgaWYgKF9fYiA9PSBfX2UpCisgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgcmV0dXJuIF9fYjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcmF0b3I+CitfSW5wdXRJdGVyYXRvcgorbnVtX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXJhdG9yPjo6ZG9fZ2V0KGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgX192KSBjb25zdAoreworICAgIC8vIFN0YWdlIDEKKyAgICBpbnQgX19iYXNlID0gMTY7CisgICAgLy8gU3RhZ2UgMgorICAgIGNoYXJfdHlwZSBfX2F0b21zWzI2XTsKKyAgICBjaGFyX3R5cGUgX190aG91c2FuZHNfc2VwID0gMDsKKyAgICBzdHJpbmcgX19ncm91cGluZzsKKyAgICB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9faW9iLmdldGxvYygpKS53aWRlbihfX251bV9nZXRfYmFzZTo6X19zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19udW1fZ2V0X2Jhc2U6Ol9fc3JjICsgMjYsIF9fYXRvbXMpOworICAgIHN0cmluZyBfX2J1ZjsKKyAgICBfX2J1Zi5yZXNpemUoX19idWYuY2FwYWNpdHkoKSk7CisgICAgY2hhciogX19hID0gJl9fYnVmWzBdOworICAgIGNoYXIqIF9fYV9lbmQgPSBfX2E7CisgICAgdW5zaWduZWQgX19nW19fbnVtX2dldF9iYXNlOjpfX251bV9nZXRfYnVmX3N6XTsKKyAgICB1bnNpZ25lZCogX19nX2VuZCA9IF9fZzsKKyAgICB1bnNpZ25lZCBfX2RjID0gMDsKKyAgICBmb3IgKDsgX19iICE9IF9fZTsgKytfX2IpCisgICAgeworICAgICAgICBpZiAoX19hX2VuZCA9PSBfX2EgKyBfX2J1Zi5zaXplKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdCBfX3RtcCA9IF9fYnVmLnNpemUoKTsKKyAgICAgICAgICAgIF9fYnVmLnJlc2l6ZSgyKl9fYnVmLnNpemUoKSk7CisgICAgICAgICAgICBfX2J1Zi5yZXNpemUoX19idWYuY2FwYWNpdHkoKSk7CisgICAgICAgICAgICBfX2EgPSAmX19idWZbMF07CisgICAgICAgICAgICBfX2FfZW5kID0gX19hICsgX190bXA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMtPl9fc3RhZ2UyX2ludF9sb29wKCpfX2IsIF9fYmFzZSwgX19hLCBfX2FfZW5kLCBfX2RjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190aG91c2FuZHNfc2VwLCBfX2dyb3VwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nLCBfX2dfZW5kLCBfX2F0b21zKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBTdGFnZSAzCisgICAgX19idWYucmVzaXplKF9fYV9lbmQgLSBfX2EpOworICAgIGlmIChfX2xpYmNwcF9zc2NhbmZfbChfX2J1Zi5jX3N0cigpLCBfTElCQ1BQX0dFVF9DX0xPQ0FMRSwgIiVwIiwgJl9fdikgIT0gMSkKKyAgICAgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAvLyBFT0YgY2hlY2tlZAorICAgIGlmIChfX2IgPT0gX19lKQorICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgIHJldHVybiBfX2I7Cit9CisKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFMihjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBudW1fZ2V0PGNoYXI+KQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUyKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIG51bV9nZXQ8d2NoYXJfdD4pCisKK3N0cnVjdCBfTElCQ1BQX1RZUEVfVklTIF9fbnVtX3B1dF9iYXNlCit7Citwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgX19mb3JtYXRfaW50KGNoYXIqIF9fZm10LCBjb25zdCBjaGFyKiBfX2xlbiwgYm9vbCBfX3NpZ25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyk7CisgICAgc3RhdGljIGJvb2wgX19mb3JtYXRfZmxvYXQoY2hhciogX19mbXQsIGNvbnN0IGNoYXIqIF9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzKTsKKyAgICBzdGF0aWMgY2hhciogX19pZGVudGlmeV9wYWRkaW5nKGNoYXIqIF9fbmIsIGNoYXIqIF9fbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpb3NfYmFzZSYgX19pb2IpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3N0cnVjdCBfX251bV9wdXQKKyAgICA6IHByb3RlY3RlZCBfX251bV9wdXRfYmFzZQoreworICAgIHN0YXRpYyB2b2lkIF9fd2lkZW5fYW5kX2dyb3VwX2ludChjaGFyKiBfX25iLCBjaGFyKiBfX25wLCBjaGFyKiBfX25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hhclQqIF9fb2IsIF9DaGFyVComIF9fb3AsIF9DaGFyVComIF9fb2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MpOworICAgIHN0YXRpYyB2b2lkIF9fd2lkZW5fYW5kX2dyb3VwX2Zsb2F0KGNoYXIqIF9fbmIsIGNoYXIqIF9fbnAsIGNoYXIqIF9fbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUKiBfX29iLCBfQ2hhclQqJiBfX29wLCBfQ2hhclQqJiBfX29lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3ZvaWQKK19fbnVtX3B1dDxfQ2hhclQ+OjpfX3dpZGVuX2FuZF9ncm91cF9pbnQoY2hhciogX19uYiwgY2hhciogX19ucCwgY2hhciogX19uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUKiBfX29iLCBfQ2hhclQqJiBfX29wLCBfQ2hhclQqJiBfX29lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbGUmIF9fbG9jKQoreworICAgIGNvbnN0IGN0eXBlPF9DaGFyVD4mICAgIF9fY3QgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+ICAgKF9fbG9jKTsKKyAgICBjb25zdCBudW1wdW5jdDxfQ2hhclQ+JiBfX25wdCA9IHVzZV9mYWNldDxudW1wdW5jdDxfQ2hhclQ+ID4oX19sb2MpOworICAgIHN0cmluZyBfX2dyb3VwaW5nID0gX19ucHQuZ3JvdXBpbmcoKTsKKyAgICBpZiAoX19ncm91cGluZy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgX19jdC53aWRlbihfX25iLCBfX25lLCBfX29iKTsKKyAgICAgICAgX19vZSA9IF9fb2IgKyAoX19uZSAtIF9fbmIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfX29lID0gX19vYjsKKyAgICAgICAgY2hhciogX19uZiA9IF9fbmI7CisgICAgICAgIGlmICgqX19uZiA9PSAnLScgfHwgKl9fbmYgPT0gJysnKQorICAgICAgICAgICAgKl9fb2UrKyA9IF9fY3Qud2lkZW4oKl9fbmYrKyk7CisgICAgICAgIGlmIChfX25lIC0gX19uZiA+PSAyICYmIF9fbmZbMF0gPT0gJzAnICYmIChfX25mWzFdID09ICd4JyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uZlsxXSA9PSAnWCcpKQorICAgICAgICB7CisgICAgICAgICAgICAqX19vZSsrID0gX19jdC53aWRlbigqX19uZisrKTsKKyAgICAgICAgICAgICpfX29lKysgPSBfX2N0LndpZGVuKCpfX25mKyspOworICAgICAgICB9CisgICAgICAgIHJldmVyc2UoX19uZiwgX19uZSk7CisgICAgICAgIF9DaGFyVCBfX3Rob3VzYW5kc19zZXAgPSBfX25wdC50aG91c2FuZHNfc2VwKCk7CisgICAgICAgIHVuc2lnbmVkIF9fZGMgPSAwOworICAgICAgICB1bnNpZ25lZCBfX2RnID0gMDsKKyAgICAgICAgZm9yIChjaGFyKiBfX3AgPSBfX25mOyBfX3AgPCBfX25lOyArK19fcCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PHVuc2lnbmVkPihfX2dyb3VwaW5nW19fZGddKSA+IDAgJiYKKyAgICAgICAgICAgICAgICBfX2RjID09IHN0YXRpY19jYXN0PHVuc2lnbmVkPihfX2dyb3VwaW5nW19fZGddKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqX19vZSsrID0gX190aG91c2FuZHNfc2VwOworICAgICAgICAgICAgICAgIF9fZGMgPSAwOworICAgICAgICAgICAgICAgIGlmIChfX2RnIDwgX19ncm91cGluZy5zaXplKCktMSkKKyAgICAgICAgICAgICAgICAgICAgKytfX2RnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKl9fb2UrKyA9IF9fY3Qud2lkZW4oKl9fcCk7CisgICAgICAgICAgICArK19fZGM7CisgICAgICAgIH0KKyAgICAgICAgcmV2ZXJzZShfX29iICsgKF9fbmYgLSBfX25iKSwgX19vZSk7CisgICAgfQorICAgIGlmIChfX25wID09IF9fbmUpCisgICAgICAgIF9fb3AgPSBfX29lOworICAgIGVsc2UKKyAgICAgICAgX19vcCA9IF9fb2IgKyAoX19ucCAtIF9fbmIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordm9pZAorX19udW1fcHV0PF9DaGFyVD46Ol9fd2lkZW5fYW5kX2dyb3VwX2Zsb2F0KGNoYXIqIF9fbmIsIGNoYXIqIF9fbnAsIGNoYXIqIF9fbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUKiBfX29iLCBfQ2hhclQqJiBfX29wLCBfQ2hhclQqJiBfX29lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MpCit7CisgICAgY29uc3QgY3R5cGU8X0NoYXJUPiYgICAgX19jdCA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4gICAoX19sb2MpOworICAgIGNvbnN0IG51bXB1bmN0PF9DaGFyVD4mIF9fbnB0ID0gdXNlX2ZhY2V0PG51bXB1bmN0PF9DaGFyVD4gPihfX2xvYyk7CisgICAgc3RyaW5nIF9fZ3JvdXBpbmcgPSBfX25wdC5ncm91cGluZygpOworICAgIF9fb2UgPSBfX29iOworICAgIGNoYXIqIF9fbmYgPSBfX25iOworICAgIGlmICgqX19uZiA9PSAnLScgfHwgKl9fbmYgPT0gJysnKQorICAgICAgICAqX19vZSsrID0gX19jdC53aWRlbigqX19uZisrKTsKKyAgICBjaGFyKiBfX25zOworICAgIGlmIChfX25lIC0gX19uZiA+PSAyICYmIF9fbmZbMF0gPT0gJzAnICYmIChfX25mWzFdID09ICd4JyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25mWzFdID09ICdYJykpCisgICAgeworICAgICAgICAqX19vZSsrID0gX19jdC53aWRlbigqX19uZisrKTsKKyAgICAgICAgKl9fb2UrKyA9IF9fY3Qud2lkZW4oKl9fbmYrKyk7CisgICAgICAgIGZvciAoX19ucyA9IF9fbmY7IF9fbnMgPCBfX25lOyArK19fbnMpCisgICAgICAgICAgICBpZiAoIWlzeGRpZ2l0X2woKl9fbnMsIF9MSUJDUFBfR0VUX0NfTE9DQUxFKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChfX25zID0gX19uZjsgX19ucyA8IF9fbmU7ICsrX19ucykKKyAgICAgICAgICAgIGlmICghaXNkaWdpdF9sKCpfX25zLCBfTElCQ1BQX0dFVF9DX0xPQ0FMRSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChfX2dyb3VwaW5nLmVtcHR5KCkpCisgICAgeworICAgICAgICBfX2N0LndpZGVuKF9fbmYsIF9fbnMsIF9fb2UpOworICAgICAgICBfX29lICs9IF9fbnMgLSBfX25mOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXZlcnNlKF9fbmYsIF9fbnMpOworICAgICAgICBfQ2hhclQgX190aG91c2FuZHNfc2VwID0gX19ucHQudGhvdXNhbmRzX3NlcCgpOworICAgICAgICB1bnNpZ25lZCBfX2RjID0gMDsKKyAgICAgICAgdW5zaWduZWQgX19kZyA9IDA7CisgICAgICAgIGZvciAoY2hhciogX19wID0gX19uZjsgX19wIDwgX19uczsgKytfX3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX2dyb3VwaW5nW19fZGddID4gMCAmJiBfX2RjID09IHN0YXRpY19jYXN0PHVuc2lnbmVkPihfX2dyb3VwaW5nW19fZGddKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqX19vZSsrID0gX190aG91c2FuZHNfc2VwOworICAgICAgICAgICAgICAgIF9fZGMgPSAwOworICAgICAgICAgICAgICAgIGlmIChfX2RnIDwgX19ncm91cGluZy5zaXplKCktMSkKKyAgICAgICAgICAgICAgICAgICAgKytfX2RnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKl9fb2UrKyA9IF9fY3Qud2lkZW4oKl9fcCk7CisgICAgICAgICAgICArK19fZGM7CisgICAgICAgIH0KKyAgICAgICAgcmV2ZXJzZShfX29iICsgKF9fbmYgLSBfX25iKSwgX19vZSk7CisgICAgfQorICAgIGZvciAoX19uZiA9IF9fbnM7IF9fbmYgPCBfX25lOyArK19fbmYpCisgICAgeworICAgICAgICBpZiAoKl9fbmYgPT0gJy4nKQorICAgICAgICB7CisgICAgICAgICAgICAqX19vZSsrID0gX19ucHQuZGVjaW1hbF9wb2ludCgpOworICAgICAgICAgICAgKytfX25mOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKl9fb2UrKyA9IF9fY3Qud2lkZW4oKl9fbmYpOworICAgIH0KKyAgICBfX2N0LndpZGVuKF9fbmYsIF9fbmUsIF9fb2UpOworICAgIF9fb2UgKz0gX19uZSAtIF9fbmY7CisgICAgaWYgKF9fbnAgPT0gX19uZSkKKyAgICAgICAgX19vcCA9IF9fb2U7CisgICAgZWxzZQorICAgICAgICBfX29wID0gX19vYiArIChfX25wIC0gX19uYik7Cit9CisKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFMihzdHJ1Y3QgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfVFlQRV9WSVMgX19udW1fcHV0PGNoYXI+KQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUyKHN0cnVjdCBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBfX251bV9wdXQ8d2NoYXJfdD4pCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyYXRvciA9IG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBudW1fcHV0CisgICAgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwKKyAgICAgIHByaXZhdGUgX19udW1fcHV0PF9DaGFyVD4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9DaGFyVCBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBfT3V0cHV0SXRlcmF0b3IgaXRlcl90eXBlOworCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgZXhwbGljaXQgbnVtX3B1dChzaXplX3QgX19yZWZzID0gMCkKKyAgICAgICAgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW9iLCBjaGFyX3R5cGUgX19mbCwKKyAgICAgICAgICAgICAgICAgIGJvb2wgX192KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX3B1dChfX3MsIF9faW9iLCBfX2ZsLCBfX3YpOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW9iLCBjaGFyX3R5cGUgX19mbCwKKyAgICAgICAgICAgICAgICAgIGxvbmcgX192KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX3B1dChfX3MsIF9faW9iLCBfX2ZsLCBfX3YpOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW9iLCBjaGFyX3R5cGUgX19mbCwKKyAgICAgICAgICAgICAgICAgIGxvbmcgbG9uZyBfX3YpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fcHV0KF9fcywgX19pb2IsIF9fZmwsIF9fdik7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgaXRlcl90eXBlIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pb2IsIGNoYXJfdHlwZSBfX2ZsLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBfX3YpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fcHV0KF9fcywgX19pb2IsIF9fZmwsIF9fdik7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgaXRlcl90eXBlIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pb2IsIGNoYXJfdHlwZSBfX2ZsLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIF9fdikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19wdXQoX19zLCBfX2lvYiwgX19mbCwgX192KTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBpdGVyX3R5cGUgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvYiwgY2hhcl90eXBlIF9fZmwsCisgICAgICAgICAgICAgICAgICBkb3VibGUgX192KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX3B1dChfX3MsIF9faW9iLCBfX2ZsLCBfX3YpOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW9iLCBjaGFyX3R5cGUgX19mbCwKKyAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlIF9fdikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19wdXQoX19zLCBfX2lvYiwgX19mbCwgX192KTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBpdGVyX3R5cGUgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvYiwgY2hhcl90eXBlIF9fZmwsCisgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBfX3YpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fcHV0KF9fcywgX19pb2IsIF9fZmwsIF9fdik7CisgICAgfQorCisgICAgc3RhdGljIGxvY2FsZTo6aWQgaWQ7CisKK3Byb3RlY3RlZDoKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICB+bnVtX3B1dCgpIHt9CisKKyAgICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW9iLCBjaGFyX3R5cGUgX19mbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX3YpIGNvbnN0OworICAgIHZpcnR1YWwgaXRlcl90eXBlIGRvX3B1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pb2IsIGNoYXJfdHlwZSBfX2ZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIF9fdikgY29uc3Q7CisgICAgdmlydHVhbCBpdGVyX3R5cGUgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvYiwgY2hhcl90eXBlIF9fZmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbG9uZyBfX3YpIGNvbnN0OworICAgIHZpcnR1YWwgaXRlcl90eXBlIGRvX3B1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pb2IsIGNoYXJfdHlwZSBfX2ZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nKSBjb25zdDsKKyAgICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW9iLCBjaGFyX3R5cGUgX19mbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nKSBjb25zdDsKKyAgICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW9iLCBjaGFyX3R5cGUgX19mbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIF9fdikgY29uc3Q7CisgICAgdmlydHVhbCBpdGVyX3R5cGUgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvYiwgY2hhcl90eXBlIF9fZmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlIF9fdikgY29uc3Q7CisgICAgdmlydHVhbCBpdGVyX3R5cGUgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvYiwgY2hhcl90eXBlIF9fZmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIF9fdikgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+Citsb2NhbGU6OmlkCitudW1fcHV0PF9DaGFyVCwgX091dHB1dEl0ZXJhdG9yPjo6aWQ7CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK19MSUJDUFBfSElEREVOCitfT3V0cHV0SXRlcmF0b3IKK19fcGFkX2FuZF9vdXRwdXQoX091dHB1dEl0ZXJhdG9yIF9fcywKKyAgICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX29iLCBjb25zdCBfQ2hhclQqIF9fb3AsIGNvbnN0IF9DaGFyVCogX19vZSwKKyAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9faW9iLCBfQ2hhclQgX19mbCkKK3sKKyAgICBzdHJlYW1zaXplIF9fc3ogPSBfX29lIC0gX19vYjsKKyAgICBzdHJlYW1zaXplIF9fbnMgPSBfX2lvYi53aWR0aCgpOworICAgIGlmIChfX25zID4gX19zeikKKyAgICAgICAgX19ucyAtPSBfX3N6OworICAgIGVsc2UKKyAgICAgICAgX19ucyA9IDA7CisgICAgZm9yICg7X19vYiA8IF9fb3A7ICsrX19vYiwgKytfX3MpCisgICAgICAgICpfX3MgPSAqX19vYjsKKyAgICBmb3IgKDsgX19uczsgLS1fX25zLCArK19fcykKKyAgICAgICAgKl9fcyA9IF9fZmw7CisgICAgZm9yICg7IF9fb2IgPCBfX29lOyArK19fb2IsICsrX19zKQorICAgICAgICAqX19zID0gKl9fb2I7CisgICAgX19pb2Iud2lkdGgoMCk7CisgICAgcmV0dXJuIF9fczsKK30KKworI2lmICFkZWZpbmVkKF9fQVBQTEVfXykgfHwgXAorICAgIChkZWZpbmVkKF9fTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQpICYmIF9fTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPiBfX01BQ18xMF84KSB8fCBcCisgICAgKGRlZmluZWQoX19JUEhPTkVfT1NfVkVSU0lPTl9NSU5fUkVRVUlSRUQpICYmIF9fSVBIT05FX09TX1ZFUlNJT05fTUlOX1JFUVVJUkVEID4gX19JUEhPTkVfNl8wKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX0xJQkNQUF9ISURERU4KK29zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPgorX19wYWRfYW5kX291dHB1dChvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4gX19zLAorICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fb2IsIGNvbnN0IF9DaGFyVCogX19vcCwgY29uc3QgX0NoYXJUKiBfX29lLAorICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgX19pb2IsIF9DaGFyVCBfX2ZsKQoreworICAgIGlmIChfX3MuX19zYnVmXyA9PSBudWxscHRyKQorICAgICAgICByZXR1cm4gX19zOworICAgIHN0cmVhbXNpemUgX19zeiA9IF9fb2UgLSBfX29iOworICAgIHN0cmVhbXNpemUgX19ucyA9IF9faW9iLndpZHRoKCk7CisgICAgaWYgKF9fbnMgPiBfX3N6KQorICAgICAgICBfX25zIC09IF9fc3o7CisgICAgZWxzZQorICAgICAgICBfX25zID0gMDsKKyAgICBzdHJlYW1zaXplIF9fbnAgPSBfX29wIC0gX19vYjsKKyAgICBpZiAoX19ucCA+IDApCisgICAgeworICAgICAgICBpZiAoX19zLl9fc2J1Zl8tPnNwdXRuKF9fb2IsIF9fbnApICE9IF9fbnApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fcy5fX3NidWZfID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHJldHVybiBfX3M7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKF9fbnMgPiAwKQorICAgIHsKKyAgICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cz4gX19zcChfX25zLCBfX2ZsKTsKKyAgICAgICAgaWYgKF9fcy5fX3NidWZfLT5zcHV0bihfX3NwLmRhdGEoKSwgX19ucykgIT0gX19ucykKKyAgICAgICAgeworICAgICAgICAgICAgX19zLl9fc2J1Zl8gPSBudWxscHRyOworICAgICAgICAgICAgcmV0dXJuIF9fczsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX25wID0gX19vZSAtIF9fb3A7CisgICAgaWYgKF9fbnAgPiAwKQorICAgIHsKKyAgICAgICAgaWYgKF9fcy5fX3NidWZfLT5zcHV0bihfX29wLCBfX25wKSAhPSBfX25wKQorICAgICAgICB7CisgICAgICAgICAgICBfX3MuX19zYnVmXyA9IG51bGxwdHI7CisgICAgICAgICAgICByZXR1cm4gX19zOworICAgICAgICB9CisgICAgfQorICAgIF9faW9iLndpZHRoKDApOworICAgIHJldHVybiBfX3M7Cit9CisKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitfT3V0cHV0SXRlcmF0b3IKK251bV9wdXQ8X0NoYXJULCBfT3V0cHV0SXRlcmF0b3I+Ojpkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGUgX19mbCwgYm9vbCBfX3YpIGNvbnN0Cit7CisgICAgaWYgKChfX2lvYi5mbGFncygpICYgaW9zX2Jhc2U6OmJvb2xhbHBoYSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIGRvX3B1dChfX3MsIF9faW9iLCBfX2ZsLCAodW5zaWduZWQgbG9uZylfX3YpOworICAgIGNvbnN0IG51bXB1bmN0PGNoYXJfdHlwZT4mIF9fbnAgPSB1c2VfZmFjZXQ8bnVtcHVuY3Q8Y2hhcl90eXBlPiA+KF9faW9iLmdldGxvYygpKTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIG51bXB1bmN0PGNoYXJfdHlwZT46OnN0cmluZ190eXBlIHN0cmluZ190eXBlOworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIHN0cmluZ190eXBlIF9fdG1wKF9fdiA/IF9fbnAudHJ1ZW5hbWUoKSA6IF9fbnAuZmFsc2VuYW1lKCkpOworICAgIHN0cmluZ190eXBlIF9fbm0gPSBfVlNURDo6bW92ZShfX3RtcCk7CisjZWxzZQorICAgIHN0cmluZ190eXBlIF9fbm0gPSBfX3YgPyBfX25wLnRydWVuYW1lKCkgOiBfX25wLmZhbHNlbmFtZSgpOworI2VuZGlmCisgICAgZm9yICh0eXBlbmFtZSBzdHJpbmdfdHlwZTo6aXRlcmF0b3IgX19pID0gX19ubS5iZWdpbigpOyBfX2kgIT0gX19ubS5lbmQoKTsgKytfX2ksICsrX19zKQorICAgICAgICAqX19zID0gKl9faTsKKyAgICByZXR1cm4gX19zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitfT3V0cHV0SXRlcmF0b3IKK251bV9wdXQ8X0NoYXJULCBfT3V0cHV0SXRlcmF0b3I+Ojpkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGUgX19mbCwgbG9uZyBfX3YpIGNvbnN0Cit7CisgICAgLy8gU3RhZ2UgMSAtIEdldCBudW1iZXIgaW4gbmFycm93IGNoYXIKKyAgICBjaGFyIF9fZm10WzZdID0geyclJywgMH07CisgICAgY29uc3QgY2hhciogX19sZW4gPSAibCI7CisgICAgdGhpcy0+X19mb3JtYXRfaW50KF9fZm10KzEsIF9fbGVuLCB0cnVlLCBfX2lvYi5mbGFncygpKTsKKyAgICBjb25zdCB1bnNpZ25lZCBfX25idWYgPSAobnVtZXJpY19saW1pdHM8bG9uZz46OmRpZ2l0cyAvIDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgKChudW1lcmljX2xpbWl0czxsb25nPjo6ZGlnaXRzICUgMykgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKF9faW9iLmZsYWdzKCkgJiBpb3NfYmFzZTo6c2hvd2Jhc2UpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgMjsKKyAgICBjaGFyIF9fbmFyW19fbmJ1Zl07CisgICAgaW50IF9fbmMgPSBfX2xpYmNwcF9zbnByaW50Zl9sKF9fbmFyLCBzaXplb2YoX19uYXIpLCBfTElCQ1BQX0dFVF9DX0xPQ0FMRSwgX19mbXQsIF9fdik7CisgICAgY2hhciogX19uZSA9IF9fbmFyICsgX19uYzsKKyAgICBjaGFyKiBfX25wID0gdGhpcy0+X19pZGVudGlmeV9wYWRkaW5nKF9fbmFyLCBfX25lLCBfX2lvYik7CisgICAgLy8gU3RhZ2UgMiAtIFdpZGVuIF9fbmFyIHdoaWxlIGFkZGluZyB0aG91c2FuZHMgc2VwYXJhdG9ycworICAgIGNoYXJfdHlwZSBfX29bMiooX19uYnVmLTEpIC0gMV07CisgICAgY2hhcl90eXBlKiBfX29wOyAgLy8gcGFkIGhlcmUKKyAgICBjaGFyX3R5cGUqIF9fb2U7ICAvLyBlbmQgb2Ygb3V0cHV0CisgICAgdGhpcy0+X193aWRlbl9hbmRfZ3JvdXBfaW50KF9fbmFyLCBfX25wLCBfX25lLCBfX28sIF9fb3AsIF9fb2UsIF9faW9iLmdldGxvYygpKTsKKyAgICAvLyBbX19vLCBfX29lKSBjb250YWlucyB0aG91c2FuZHNfc2VwJ2Qgd2lkZSBudW1iZXIKKyAgICAvLyBTdGFnZSAzICYgNAorICAgIHJldHVybiBfX3BhZF9hbmRfb3V0cHV0KF9fcywgX19vLCBfX29wLCBfX29lLCBfX2lvYiwgX19mbCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK19PdXRwdXRJdGVyYXRvcgorbnVtX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyYXRvcj46OmRvX3B1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZSBfX2ZsLCBsb25nIGxvbmcgX192KSBjb25zdAoreworICAgIC8vIFN0YWdlIDEgLSBHZXQgbnVtYmVyIGluIG5hcnJvdyBjaGFyCisgICAgY2hhciBfX2ZtdFs4XSA9IHsnJScsIDB9OworICAgIGNvbnN0IGNoYXIqIF9fbGVuID0gImxsIjsKKyAgICB0aGlzLT5fX2Zvcm1hdF9pbnQoX19mbXQrMSwgX19sZW4sIHRydWUsIF9faW9iLmZsYWdzKCkpOworICAgIGNvbnN0IHVuc2lnbmVkIF9fbmJ1ZiA9IChudW1lcmljX2xpbWl0czxsb25nIGxvbmc+OjpkaWdpdHMgLyAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICArICgobnVtZXJpY19saW1pdHM8bG9uZyBsb25nPjo6ZGlnaXRzICUgMykgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKF9faW9iLmZsYWdzKCkgJiBpb3NfYmFzZTo6c2hvd2Jhc2UpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgMjsKKyAgICBjaGFyIF9fbmFyW19fbmJ1Zl07CisgICAgaW50IF9fbmMgPSBfX2xpYmNwcF9zbnByaW50Zl9sKF9fbmFyLCBzaXplb2YoX19uYXIpLCBfTElCQ1BQX0dFVF9DX0xPQ0FMRSwgX19mbXQsIF9fdik7CisgICAgY2hhciogX19uZSA9IF9fbmFyICsgX19uYzsKKyAgICBjaGFyKiBfX25wID0gdGhpcy0+X19pZGVudGlmeV9wYWRkaW5nKF9fbmFyLCBfX25lLCBfX2lvYik7CisgICAgLy8gU3RhZ2UgMiAtIFdpZGVuIF9fbmFyIHdoaWxlIGFkZGluZyB0aG91c2FuZHMgc2VwYXJhdG9ycworICAgIGNoYXJfdHlwZSBfX29bMiooX19uYnVmLTEpIC0gMV07CisgICAgY2hhcl90eXBlKiBfX29wOyAgLy8gcGFkIGhlcmUKKyAgICBjaGFyX3R5cGUqIF9fb2U7ICAvLyBlbmQgb2Ygb3V0cHV0CisgICAgdGhpcy0+X193aWRlbl9hbmRfZ3JvdXBfaW50KF9fbmFyLCBfX25wLCBfX25lLCBfX28sIF9fb3AsIF9fb2UsIF9faW9iLmdldGxvYygpKTsKKyAgICAvLyBbX19vLCBfX29lKSBjb250YWlucyB0aG91c2FuZHNfc2VwJ2Qgd2lkZSBudW1iZXIKKyAgICAvLyBTdGFnZSAzICYgNAorICAgIHJldHVybiBfX3BhZF9hbmRfb3V0cHV0KF9fcywgX19vLCBfX29wLCBfX29lLCBfX2lvYiwgX19mbCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK19PdXRwdXRJdGVyYXRvcgorbnVtX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyYXRvcj46OmRvX3B1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZSBfX2ZsLCB1bnNpZ25lZCBsb25nIF9fdikgY29uc3QKK3sKKyAgICAvLyBTdGFnZSAxIC0gR2V0IG51bWJlciBpbiBuYXJyb3cgY2hhcgorICAgIGNoYXIgX19mbXRbNl0gPSB7JyUnLCAwfTsKKyAgICBjb25zdCBjaGFyKiBfX2xlbiA9ICJsIjsKKyAgICB0aGlzLT5fX2Zvcm1hdF9pbnQoX19mbXQrMSwgX19sZW4sIGZhbHNlLCBfX2lvYi5mbGFncygpKTsKKyAgICBjb25zdCB1bnNpZ25lZCBfX25idWYgPSAobnVtZXJpY19saW1pdHM8dW5zaWduZWQgbG9uZz46OmRpZ2l0cyAvIDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgKChudW1lcmljX2xpbWl0czx1bnNpZ25lZCBsb25nPjo6ZGlnaXRzICUgMykgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKF9faW9iLmZsYWdzKCkgJiBpb3NfYmFzZTo6c2hvd2Jhc2UpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgMTsKKyAgICBjaGFyIF9fbmFyW19fbmJ1Zl07CisgICAgaW50IF9fbmMgPSBfX2xpYmNwcF9zbnByaW50Zl9sKF9fbmFyLCBzaXplb2YoX19uYXIpLCBfTElCQ1BQX0dFVF9DX0xPQ0FMRSwgX19mbXQsIF9fdik7CisgICAgY2hhciogX19uZSA9IF9fbmFyICsgX19uYzsKKyAgICBjaGFyKiBfX25wID0gdGhpcy0+X19pZGVudGlmeV9wYWRkaW5nKF9fbmFyLCBfX25lLCBfX2lvYik7CisgICAgLy8gU3RhZ2UgMiAtIFdpZGVuIF9fbmFyIHdoaWxlIGFkZGluZyB0aG91c2FuZHMgc2VwYXJhdG9ycworICAgIGNoYXJfdHlwZSBfX29bMiooX19uYnVmLTEpIC0gMV07CisgICAgY2hhcl90eXBlKiBfX29wOyAgLy8gcGFkIGhlcmUKKyAgICBjaGFyX3R5cGUqIF9fb2U7ICAvLyBlbmQgb2Ygb3V0cHV0CisgICAgdGhpcy0+X193aWRlbl9hbmRfZ3JvdXBfaW50KF9fbmFyLCBfX25wLCBfX25lLCBfX28sIF9fb3AsIF9fb2UsIF9faW9iLmdldGxvYygpKTsKKyAgICAvLyBbX19vLCBfX29lKSBjb250YWlucyB0aG91c2FuZHNfc2VwJ2Qgd2lkZSBudW1iZXIKKyAgICAvLyBTdGFnZSAzICYgNAorICAgIHJldHVybiBfX3BhZF9hbmRfb3V0cHV0KF9fcywgX19vLCBfX29wLCBfX29lLCBfX2lvYiwgX19mbCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK19PdXRwdXRJdGVyYXRvcgorbnVtX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyYXRvcj46OmRvX3B1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZSBfX2ZsLCB1bnNpZ25lZCBsb25nIGxvbmcgX192KSBjb25zdAoreworICAgIC8vIFN0YWdlIDEgLSBHZXQgbnVtYmVyIGluIG5hcnJvdyBjaGFyCisgICAgY2hhciBfX2ZtdFs4XSA9IHsnJScsIDB9OworICAgIGNvbnN0IGNoYXIqIF9fbGVuID0gImxsIjsKKyAgICB0aGlzLT5fX2Zvcm1hdF9pbnQoX19mbXQrMSwgX19sZW4sIGZhbHNlLCBfX2lvYi5mbGFncygpKTsKKyAgICBjb25zdCB1bnNpZ25lZCBfX25idWYgPSAobnVtZXJpY19saW1pdHM8dW5zaWduZWQgbG9uZyBsb25nPjo6ZGlnaXRzIC8gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGxvbmcgbG9uZz46OmRpZ2l0cyAlIDMpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgKChfX2lvYi5mbGFncygpICYgaW9zX2Jhc2U6OnNob3diYXNlKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICArIDE7CisgICAgY2hhciBfX25hcltfX25idWZdOworICAgIGludCBfX25jID0gX19saWJjcHBfc25wcmludGZfbChfX25hciwgc2l6ZW9mKF9fbmFyKSwgX0xJQkNQUF9HRVRfQ19MT0NBTEUsIF9fZm10LCBfX3YpOworICAgIGNoYXIqIF9fbmUgPSBfX25hciArIF9fbmM7CisgICAgY2hhciogX19ucCA9IHRoaXMtPl9faWRlbnRpZnlfcGFkZGluZyhfX25hciwgX19uZSwgX19pb2IpOworICAgIC8vIFN0YWdlIDIgLSBXaWRlbiBfX25hciB3aGlsZSBhZGRpbmcgdGhvdXNhbmRzIHNlcGFyYXRvcnMKKyAgICBjaGFyX3R5cGUgX19vWzIqKF9fbmJ1Zi0xKSAtIDFdOworICAgIGNoYXJfdHlwZSogX19vcDsgIC8vIHBhZCBoZXJlCisgICAgY2hhcl90eXBlKiBfX29lOyAgLy8gZW5kIG9mIG91dHB1dAorICAgIHRoaXMtPl9fd2lkZW5fYW5kX2dyb3VwX2ludChfX25hciwgX19ucCwgX19uZSwgX19vLCBfX29wLCBfX29lLCBfX2lvYi5nZXRsb2MoKSk7CisgICAgLy8gW19fbywgX19vZSkgY29udGFpbnMgdGhvdXNhbmRzX3NlcCdkIHdpZGUgbnVtYmVyCisgICAgLy8gU3RhZ2UgMyAmIDQKKyAgICByZXR1cm4gX19wYWRfYW5kX291dHB1dChfX3MsIF9fbywgX19vcCwgX19vZSwgX19pb2IsIF9fZmwpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitfT3V0cHV0SXRlcmF0b3IKK251bV9wdXQ8X0NoYXJULCBfT3V0cHV0SXRlcmF0b3I+Ojpkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGUgX19mbCwgZG91YmxlIF9fdikgY29uc3QKK3sKKyAgICAvLyBTdGFnZSAxIC0gR2V0IG51bWJlciBpbiBuYXJyb3cgY2hhcgorICAgIGNoYXIgX19mbXRbOF0gPSB7JyUnLCAwfTsKKyAgICBjb25zdCBjaGFyKiBfX2xlbiA9ICIiOworICAgIGJvb2wgX19zcGVjaWZ5X3ByZWNpc2lvbiA9IHRoaXMtPl9fZm9ybWF0X2Zsb2F0KF9fZm10KzEsIF9fbGVuLCBfX2lvYi5mbGFncygpKTsKKyAgICBjb25zdCB1bnNpZ25lZCBfX25idWYgPSAzMDsKKyAgICBjaGFyIF9fbmFyW19fbmJ1Zl07CisgICAgY2hhciogX19uYiA9IF9fbmFyOworICAgIGludCBfX25jOworICAgIGlmIChfX3NwZWNpZnlfcHJlY2lzaW9uKQorICAgICAgICBfX25jID0gX19saWJjcHBfc25wcmludGZfbChfX25iLCBfX25idWYsIF9MSUJDUFBfR0VUX0NfTE9DQUxFLCBfX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClfX2lvYi5wcmVjaXNpb24oKSwgX192KTsKKyAgICBlbHNlCisgICAgICAgIF9fbmMgPSBfX2xpYmNwcF9zbnByaW50Zl9sKF9fbmIsIF9fbmJ1ZiwgX0xJQkNQUF9HRVRfQ19MT0NBTEUsIF9fZm10LCBfX3YpOworICAgIHVuaXF1ZV9wdHI8Y2hhciwgdm9pZCgqKSh2b2lkKik+IF9fbmJoKDAsIGZyZWUpOworICAgIGlmIChfX25jID4gc3RhdGljX2Nhc3Q8aW50PihfX25idWYtMSkpCisgICAgeworICAgICAgICBpZiAoX19zcGVjaWZ5X3ByZWNpc2lvbikKKyAgICAgICAgICAgIF9fbmMgPSBfX2xpYmNwcF9hc3ByaW50Zl9sKCZfX25iLCBfTElCQ1BQX0dFVF9DX0xPQ0FMRSwgX19mbXQsIChpbnQpX19pb2IucHJlY2lzaW9uKCksIF9fdik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fbmMgPSBfX2xpYmNwcF9hc3ByaW50Zl9sKCZfX25iLCBfTElCQ1BQX0dFVF9DX0xPQ0FMRSwgX19mbXQsIF9fdik7CisgICAgICAgIGlmIChfX25iID09IDApCisgICAgICAgICAgICBfX3Rocm93X2JhZF9hbGxvYygpOworICAgICAgICBfX25iaC5yZXNldChfX25iKTsKKyAgICB9CisgICAgY2hhciogX19uZSA9IF9fbmIgKyBfX25jOworICAgIGNoYXIqIF9fbnAgPSB0aGlzLT5fX2lkZW50aWZ5X3BhZGRpbmcoX19uYiwgX19uZSwgX19pb2IpOworICAgIC8vIFN0YWdlIDIgLSBXaWRlbiBfX25hciB3aGlsZSBhZGRpbmcgdGhvdXNhbmRzIHNlcGFyYXRvcnMKKyAgICBjaGFyX3R5cGUgX19vWzIqKF9fbmJ1Zi0xKSAtIDFdOworICAgIGNoYXJfdHlwZSogX19vYiA9IF9fbzsKKyAgICB1bmlxdWVfcHRyPGNoYXJfdHlwZSwgdm9pZCgqKSh2b2lkKik+IF9fb2JoKDAsIGZyZWUpOworICAgIGlmIChfX25iICE9IF9fbmFyKQorICAgIHsKKyAgICAgICAgX19vYiA9IChjaGFyX3R5cGUqKW1hbGxvYygyKnN0YXRpY19jYXN0PHNpemVfdD4oX19uYykqc2l6ZW9mKGNoYXJfdHlwZSkpOworICAgICAgICBpZiAoX19vYiA9PSAwKQorICAgICAgICAgICAgX190aHJvd19iYWRfYWxsb2MoKTsKKyAgICAgICAgX19vYmgucmVzZXQoX19vYik7CisgICAgfQorICAgIGNoYXJfdHlwZSogX19vcDsgIC8vIHBhZCBoZXJlCisgICAgY2hhcl90eXBlKiBfX29lOyAgLy8gZW5kIG9mIG91dHB1dAorICAgIHRoaXMtPl9fd2lkZW5fYW5kX2dyb3VwX2Zsb2F0KF9fbmIsIF9fbnAsIF9fbmUsIF9fb2IsIF9fb3AsIF9fb2UsIF9faW9iLmdldGxvYygpKTsKKyAgICAvLyBbX19vLCBfX29lKSBjb250YWlucyB0aG91c2FuZHNfc2VwJ2Qgd2lkZSBudW1iZXIKKyAgICAvLyBTdGFnZSAzICYgNAorICAgIF9fcyA9IF9fcGFkX2FuZF9vdXRwdXQoX19zLCBfX29iLCBfX29wLCBfX29lLCBfX2lvYiwgX19mbCk7CisgICAgcmV0dXJuIF9fczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgorX091dHB1dEl0ZXJhdG9yCitudW1fcHV0PF9DaGFyVCwgX091dHB1dEl0ZXJhdG9yPjo6ZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlIF9fZmwsIGxvbmcgZG91YmxlIF9fdikgY29uc3QKK3sKKyAgICAvLyBTdGFnZSAxIC0gR2V0IG51bWJlciBpbiBuYXJyb3cgY2hhcgorICAgIGNoYXIgX19mbXRbOF0gPSB7JyUnLCAwfTsKKyAgICBjb25zdCBjaGFyKiBfX2xlbiA9ICJMIjsKKyAgICBib29sIF9fc3BlY2lmeV9wcmVjaXNpb24gPSB0aGlzLT5fX2Zvcm1hdF9mbG9hdChfX2ZtdCsxLCBfX2xlbiwgX19pb2IuZmxhZ3MoKSk7CisgICAgY29uc3QgdW5zaWduZWQgX19uYnVmID0gMzA7CisgICAgY2hhciBfX25hcltfX25idWZdOworICAgIGNoYXIqIF9fbmIgPSBfX25hcjsKKyAgICBpbnQgX19uYzsKKyAgICBpZiAoX19zcGVjaWZ5X3ByZWNpc2lvbikKKyAgICAgICAgX19uYyA9IF9fbGliY3BwX3NucHJpbnRmX2woX19uYiwgX19uYnVmLCBfTElCQ1BQX0dFVF9DX0xPQ0FMRSwgX19mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpX19pb2IucHJlY2lzaW9uKCksIF9fdik7CisgICAgZWxzZQorICAgICAgICBfX25jID0gX19saWJjcHBfc25wcmludGZfbChfX25iLCBfX25idWYsIF9MSUJDUFBfR0VUX0NfTE9DQUxFLCBfX2ZtdCwgX192KTsKKyAgICB1bmlxdWVfcHRyPGNoYXIsIHZvaWQoKikodm9pZCopPiBfX25iaCgwLCBmcmVlKTsKKyAgICBpZiAoX19uYyA+IHN0YXRpY19jYXN0PGludD4oX19uYnVmLTEpKQorICAgIHsKKyAgICAgICAgaWYgKF9fc3BlY2lmeV9wcmVjaXNpb24pCisgICAgICAgICAgICBfX25jID0gX19saWJjcHBfYXNwcmludGZfbCgmX19uYiwgX0xJQkNQUF9HRVRfQ19MT0NBTEUsIF9fZm10LCAoaW50KV9faW9iLnByZWNpc2lvbigpLCBfX3YpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX25jID0gX19saWJjcHBfYXNwcmludGZfbCgmX19uYiwgX0xJQkNQUF9HRVRfQ19MT0NBTEUsIF9fZm10LCBfX3YpOworICAgICAgICBpZiAoX19uYiA9PSAwKQorICAgICAgICAgICAgX190aHJvd19iYWRfYWxsb2MoKTsKKyAgICAgICAgX19uYmgucmVzZXQoX19uYik7CisgICAgfQorICAgIGNoYXIqIF9fbmUgPSBfX25iICsgX19uYzsKKyAgICBjaGFyKiBfX25wID0gdGhpcy0+X19pZGVudGlmeV9wYWRkaW5nKF9fbmIsIF9fbmUsIF9faW9iKTsKKyAgICAvLyBTdGFnZSAyIC0gV2lkZW4gX19uYXIgd2hpbGUgYWRkaW5nIHRob3VzYW5kcyBzZXBhcmF0b3JzCisgICAgY2hhcl90eXBlIF9fb1syKihfX25idWYtMSkgLSAxXTsKKyAgICBjaGFyX3R5cGUqIF9fb2IgPSBfX287CisgICAgdW5pcXVlX3B0cjxjaGFyX3R5cGUsIHZvaWQoKikodm9pZCopPiBfX29iaCgwLCBmcmVlKTsKKyAgICBpZiAoX19uYiAhPSBfX25hcikKKyAgICB7CisgICAgICAgIF9fb2IgPSAoY2hhcl90eXBlKiltYWxsb2MoMipzdGF0aWNfY2FzdDxzaXplX3Q+KF9fbmMpKnNpemVvZihjaGFyX3R5cGUpKTsKKyAgICAgICAgaWYgKF9fb2IgPT0gMCkKKyAgICAgICAgICAgIF9fdGhyb3dfYmFkX2FsbG9jKCk7CisgICAgICAgIF9fb2JoLnJlc2V0KF9fb2IpOworICAgIH0KKyAgICBjaGFyX3R5cGUqIF9fb3A7ICAvLyBwYWQgaGVyZQorICAgIGNoYXJfdHlwZSogX19vZTsgIC8vIGVuZCBvZiBvdXRwdXQKKyAgICB0aGlzLT5fX3dpZGVuX2FuZF9ncm91cF9mbG9hdChfX25iLCBfX25wLCBfX25lLCBfX29iLCBfX29wLCBfX29lLCBfX2lvYi5nZXRsb2MoKSk7CisgICAgLy8gW19fbywgX19vZSkgY29udGFpbnMgdGhvdXNhbmRzX3NlcCdkIHdpZGUgbnVtYmVyCisgICAgLy8gU3RhZ2UgMyAmIDQKKyAgICBfX3MgPSBfX3BhZF9hbmRfb3V0cHV0KF9fcywgX19vYiwgX19vcCwgX19vZSwgX19pb2IsIF9fZmwpOworICAgIHJldHVybiBfX3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK19PdXRwdXRJdGVyYXRvcgorbnVtX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyYXRvcj46OmRvX3B1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZSBfX2ZsLCBjb25zdCB2b2lkKiBfX3YpIGNvbnN0Cit7CisgICAgLy8gU3RhZ2UgMSAtIEdldCBwb2ludGVyIGluIG5hcnJvdyBjaGFyCisgICAgY2hhciBfX2ZtdFs2XSA9ICIlcCI7CisgICAgY29uc3QgdW5zaWduZWQgX19uYnVmID0gMjA7CisgICAgY2hhciBfX25hcltfX25idWZdOworICAgIGludCBfX25jID0gX19saWJjcHBfc25wcmludGZfbChfX25hciwgc2l6ZW9mKF9fbmFyKSwgX0xJQkNQUF9HRVRfQ19MT0NBTEUsIF9fZm10LCBfX3YpOworICAgIGNoYXIqIF9fbmUgPSBfX25hciArIF9fbmM7CisgICAgY2hhciogX19ucCA9IHRoaXMtPl9faWRlbnRpZnlfcGFkZGluZyhfX25hciwgX19uZSwgX19pb2IpOworICAgIC8vIFN0YWdlIDIgLSBXaWRlbiBfX25hcgorICAgIGNoYXJfdHlwZSBfX29bMiooX19uYnVmLTEpIC0gMV07CisgICAgY2hhcl90eXBlKiBfX29wOyAgLy8gcGFkIGhlcmUKKyAgICBjaGFyX3R5cGUqIF9fb2U7ICAvLyBlbmQgb2Ygb3V0cHV0CisgICAgY29uc3QgY3R5cGU8Y2hhcl90eXBlPiYgX19jdCA9IHVzZV9mYWNldDxjdHlwZTxjaGFyX3R5cGU+ID4oX19pb2IuZ2V0bG9jKCkpOworICAgIF9fY3Qud2lkZW4oX19uYXIsIF9fbmUsIF9fbyk7CisgICAgX19vZSA9IF9fbyArIChfX25lIC0gX19uYXIpOworICAgIGlmIChfX25wID09IF9fbmUpCisgICAgICAgIF9fb3AgPSBfX29lOworICAgIGVsc2UKKyAgICAgICAgX19vcCA9IF9fbyArIChfX25wIC0gX19uYXIpOworICAgIC8vIFtfX28sIF9fb2UpIGNvbnRhaW5zIHdpZGUgbnVtYmVyCisgICAgLy8gU3RhZ2UgMyAmIDQKKyAgICByZXR1cm4gX19wYWRfYW5kX291dHB1dChfX3MsIF9fbywgX19vcCwgX19vZSwgX19pb2IsIF9fZmwpOworfQorCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURTIoY2xhc3MgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfVFlQRV9WSVMgbnVtX3B1dDxjaGFyPikKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFMihjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBudW1fcHV0PHdjaGFyX3Q+KQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK19MSUJDUFBfSElEREVOCitpbnQKK19fZ2V0X3VwX3RvX25fZGlnaXRzKF9JbnB1dEl0ZXJhdG9yJiBfX2IsIF9JbnB1dEl0ZXJhdG9yIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdCwgaW50IF9fbikKK3sKKyAgICAvLyBQcmVjb25kaXRpb246ICBfX24gPj0gMQorICAgIGlmIChfX2IgPT0gX19lKQorICAgIHsKKyAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdCB8IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gZ2V0IGZpcnN0IGRpZ2l0CisgICAgX0NoYXJUIF9fYyA9ICpfX2I7CisgICAgaWYgKCFfX2N0LmlzKGN0eXBlX2Jhc2U6OmRpZ2l0LCBfX2MpKQorICAgIHsKKyAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgX19yID0gX19jdC5uYXJyb3coX19jLCAwKSAtICcwJzsKKyAgICBmb3IgKCsrX19iLCAodm9pZCkgLS1fX247IF9fYiAhPSBfX2UgJiYgX19uID4gMDsgKytfX2IsICh2b2lkKSAtLV9fbikKKyAgICB7CisgICAgICAgIC8vIGdldCBuZXh0IGRpZ2l0CisgICAgICAgIF9fYyA9ICpfX2I7CisgICAgICAgIGlmICghX19jdC5pcyhjdHlwZV9iYXNlOjpkaWdpdCwgX19jKSkKKyAgICAgICAgICAgIHJldHVybiBfX3I7CisgICAgICAgIF9fciA9IF9fciAqIDEwICsgX19jdC5uYXJyb3coX19jLCAwKSAtICcwJzsKKyAgICB9CisgICAgaWYgKF9fYiA9PSBfX2UpCisgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgcmV0dXJuIF9fcjsKK30KKworY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyB0aW1lX2Jhc2UKK3sKK3B1YmxpYzoKKyAgICBlbnVtIGRhdGVvcmRlciB7bm9fb3JkZXIsIGRteSwgbWR5LCB5bWQsIHlkbX07Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX190aW1lX2dldF9jX3N0b3JhZ2UKK3sKK3Byb3RlY3RlZDoKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQ+IHN0cmluZ190eXBlOworCisgICAgdmlydHVhbCBjb25zdCBzdHJpbmdfdHlwZSogX193ZWVrcygpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3Qgc3RyaW5nX3R5cGUqIF9fbW9udGhzKCkgY29uc3Q7CisgICAgdmlydHVhbCBjb25zdCBzdHJpbmdfdHlwZSogX19hbV9wbSgpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3Qgc3RyaW5nX3R5cGUmIF9fYygpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3Qgc3RyaW5nX3R5cGUmIF9fcigpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3Qgc3RyaW5nX3R5cGUmIF9feCgpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3Qgc3RyaW5nX3R5cGUmIF9fWCgpIGNvbnN0OworCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgfl9fdGltZV9nZXRfY19zdG9yYWdlKCkge30KK307CisKK3RlbXBsYXRlIDw+IF9MSUJDUFBfRlVOQ19WSVMgY29uc3Qgc3RyaW5nKiBfX3RpbWVfZ2V0X2Nfc3RvcmFnZTxjaGFyPjo6X193ZWVrcygpIGNvbnN0OwordGVtcGxhdGUgPD4gX0xJQkNQUF9GVU5DX1ZJUyBjb25zdCBzdHJpbmcqIF9fdGltZV9nZXRfY19zdG9yYWdlPGNoYXI+OjpfX21vbnRocygpIGNvbnN0OwordGVtcGxhdGUgPD4gX0xJQkNQUF9GVU5DX1ZJUyBjb25zdCBzdHJpbmcqIF9fdGltZV9nZXRfY19zdG9yYWdlPGNoYXI+OjpfX2FtX3BtKCkgY29uc3Q7Cit0ZW1wbGF0ZSA8PiBfTElCQ1BQX0ZVTkNfVklTIGNvbnN0IHN0cmluZyYgX190aW1lX2dldF9jX3N0b3JhZ2U8Y2hhcj46Ol9fYygpIGNvbnN0OwordGVtcGxhdGUgPD4gX0xJQkNQUF9GVU5DX1ZJUyBjb25zdCBzdHJpbmcmIF9fdGltZV9nZXRfY19zdG9yYWdlPGNoYXI+OjpfX3IoKSBjb25zdDsKK3RlbXBsYXRlIDw+IF9MSUJDUFBfRlVOQ19WSVMgY29uc3Qgc3RyaW5nJiBfX3RpbWVfZ2V0X2Nfc3RvcmFnZTxjaGFyPjo6X194KCkgY29uc3Q7Cit0ZW1wbGF0ZSA8PiBfTElCQ1BQX0ZVTkNfVklTIGNvbnN0IHN0cmluZyYgX190aW1lX2dldF9jX3N0b3JhZ2U8Y2hhcj46Ol9fWCgpIGNvbnN0OworCit0ZW1wbGF0ZSA8PiBfTElCQ1BQX0ZVTkNfVklTIGNvbnN0IHdzdHJpbmcqIF9fdGltZV9nZXRfY19zdG9yYWdlPHdjaGFyX3Q+OjpfX3dlZWtzKCkgY29uc3Q7Cit0ZW1wbGF0ZSA8PiBfTElCQ1BQX0ZVTkNfVklTIGNvbnN0IHdzdHJpbmcqIF9fdGltZV9nZXRfY19zdG9yYWdlPHdjaGFyX3Q+OjpfX21vbnRocygpIGNvbnN0OwordGVtcGxhdGUgPD4gX0xJQkNQUF9GVU5DX1ZJUyBjb25zdCB3c3RyaW5nKiBfX3RpbWVfZ2V0X2Nfc3RvcmFnZTx3Y2hhcl90Pjo6X19hbV9wbSgpIGNvbnN0OwordGVtcGxhdGUgPD4gX0xJQkNQUF9GVU5DX1ZJUyBjb25zdCB3c3RyaW5nJiBfX3RpbWVfZ2V0X2Nfc3RvcmFnZTx3Y2hhcl90Pjo6X19jKCkgY29uc3Q7Cit0ZW1wbGF0ZSA8PiBfTElCQ1BQX0ZVTkNfVklTIGNvbnN0IHdzdHJpbmcmIF9fdGltZV9nZXRfY19zdG9yYWdlPHdjaGFyX3Q+OjpfX3IoKSBjb25zdDsKK3RlbXBsYXRlIDw+IF9MSUJDUFBfRlVOQ19WSVMgY29uc3Qgd3N0cmluZyYgX190aW1lX2dldF9jX3N0b3JhZ2U8d2NoYXJfdD46Ol9feCgpIGNvbnN0OwordGVtcGxhdGUgPD4gX0xJQkNQUF9GVU5DX1ZJUyBjb25zdCB3c3RyaW5nJiBfX3RpbWVfZ2V0X2Nfc3RvcmFnZTx3Y2hhcl90Pjo6X19YKCkgY29uc3Q7CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yID0gaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ID4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHRpbWVfZ2V0CisgICAgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwKKyAgICAgIHB1YmxpYyB0aW1lX2Jhc2UsCisgICAgICBwcml2YXRlIF9fdGltZV9nZXRfY19zdG9yYWdlPF9DaGFyVD4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIF9JbnB1dEl0ZXJhdG9yICAgICAgICAgIGl0ZXJfdHlwZTsKKyAgICB0eXBlZGVmIHRpbWVfYmFzZTo6ZGF0ZW9yZGVyICAgIGRhdGVvcmRlcjsKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyX3R5cGU+IHN0cmluZ190eXBlOworCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgZXhwbGljaXQgdGltZV9nZXQoc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICAgIDogbG9jYWxlOjpmYWNldChfX3JlZnMpIHt9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBkYXRlb3JkZXIgZGF0ZV9vcmRlcigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdGhpcy0+ZG9fZGF0ZV9vcmRlcigpOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGl0ZXJfdHlwZSBnZXRfdGltZShpdGVyX3R5cGUgX19iLCBpdGVyX3R5cGUgX19lLCBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fZ2V0X3RpbWUoX19iLCBfX2UsIF9faW9iLCBfX2VyciwgX190bSk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgaXRlcl90eXBlIGdldF9kYXRlKGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19nZXRfZGF0ZShfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX3RtKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBpdGVyX3R5cGUgZ2V0X3dlZWtkYXkoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX2dldF93ZWVrZGF5KF9fYiwgX19lLCBfX2lvYiwgX19lcnIsIF9fdG0pOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGl0ZXJfdHlwZSBnZXRfbW9udGhuYW1lKGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX2dldF9tb250aG5hbWUoX19iLCBfX2UsIF9faW9iLCBfX2VyciwgX190bSk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgaXRlcl90eXBlIGdldF95ZWFyKGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19nZXRfeWVhcihfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX3RtKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBpdGVyX3R5cGUgZ2V0KGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0gKl9fdG0sCisgICAgICAgICAgICAgICAgICBjaGFyIF9fZm10LCBjaGFyIF9fbW9kID0gMCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19nZXQoX19iLCBfX2UsIF9faW9iLCBfX2VyciwgX190bSwgX19mbXQsIF9fbW9kKTsKKyAgICB9CisKKyAgICBpdGVyX3R5cGUgZ2V0KGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0sCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyX3R5cGUqIF9fZm10YiwgY29uc3QgY2hhcl90eXBlKiBfX2ZtdGUpIGNvbnN0OworCisgICAgc3RhdGljIGxvY2FsZTo6aWQgaWQ7CisKK3Byb3RlY3RlZDoKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICB+dGltZV9nZXQoKSB7fQorCisgICAgdmlydHVhbCBkYXRlb3JkZXIgZG9fZGF0ZV9vcmRlcigpIGNvbnN0OworICAgIHZpcnR1YWwgaXRlcl90eXBlIGRvX2dldF90aW1lKGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSBjb25zdDsKKyAgICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19nZXRfZGF0ZShpdGVyX3R5cGUgX19iLCBpdGVyX3R5cGUgX19lLCBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSkgY29uc3Q7CisgICAgdmlydHVhbCBpdGVyX3R5cGUgZG9fZ2V0X3dlZWtkYXkoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0OworICAgIHZpcnR1YWwgaXRlcl90eXBlIGRvX2dldF9tb250aG5hbWUoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSkgY29uc3Q7CisgICAgdmlydHVhbCBpdGVyX3R5cGUgZG9fZ2V0X3llYXIoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0OworICAgIHZpcnR1YWwgaXRlcl90eXBlIGRvX2dldChpdGVyX3R5cGUgX19iLCBpdGVyX3R5cGUgX19lLCBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgX19mbXQsIGNoYXIgX19tb2QpIGNvbnN0OworcHJpdmF0ZToKKyAgICB2b2lkIF9fZ2V0X3doaXRlX3NwYWNlKGl0ZXJfdHlwZSYgX19iLCBpdGVyX3R5cGUgX19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0KSBjb25zdDsKKyAgICB2b2lkIF9fZ2V0X3BlcmNlbnQoaXRlcl90eXBlJiBfX2IsIGl0ZXJfdHlwZSBfX2UsIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3R5cGU8Y2hhcl90eXBlPiYgX19jdCkgY29uc3Q7CisKKyAgICB2b2lkIF9fZ2V0X3dlZWtkYXluYW1lKGludCYgX19tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcl90eXBlJiBfX2IsIGl0ZXJfdHlwZSBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0KSBjb25zdDsKKyAgICB2b2lkIF9fZ2V0X21vbnRobmFtZShpbnQmIF9fbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyX3R5cGUmIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3R5cGU8Y2hhcl90eXBlPiYgX19jdCkgY29uc3Q7CisgICAgdm9pZCBfX2dldF9kYXkoaW50JiBfX2QsCisgICAgICAgICAgICAgICAgICAgaXRlcl90eXBlJiBfX2IsIGl0ZXJfdHlwZSBfX2UsCisgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGN0eXBlPGNoYXJfdHlwZT4mIF9fY3QpIGNvbnN0OworICAgIHZvaWQgX19nZXRfbW9udGgoaW50JiBfX20sCisgICAgICAgICAgICAgICAgICAgICBpdGVyX3R5cGUmIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN0eXBlPGNoYXJfdHlwZT4mIF9fY3QpIGNvbnN0OworICAgIHZvaWQgX19nZXRfeWVhcihpbnQmIF9feSwKKyAgICAgICAgICAgICAgICAgICBpdGVyX3R5cGUmIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY3R5cGU8Y2hhcl90eXBlPiYgX19jdCkgY29uc3Q7CisgICAgdm9pZCBfX2dldF95ZWFyNChpbnQmIF9feSwKKyAgICAgICAgICAgICAgICAgICAgaXRlcl90eXBlJiBfX2IsIGl0ZXJfdHlwZSBfX2UsCisgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY3R5cGU8Y2hhcl90eXBlPiYgX19jdCkgY29uc3Q7CisgICAgdm9pZCBfX2dldF9ob3VyKGludCYgX19kLAorICAgICAgICAgICAgICAgICAgICBpdGVyX3R5cGUmIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0KSBjb25zdDsKKyAgICB2b2lkIF9fZ2V0XzEyX2hvdXIoaW50JiBfX2gsCisgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJfdHlwZSYgX19iLCBpdGVyX3R5cGUgX19lLAorICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN0eXBlPGNoYXJfdHlwZT4mIF9fY3QpIGNvbnN0OworICAgIHZvaWQgX19nZXRfYW1fcG0oaW50JiBfX2gsCisgICAgICAgICAgICAgICAgICAgICBpdGVyX3R5cGUmIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN0eXBlPGNoYXJfdHlwZT4mIF9fY3QpIGNvbnN0OworICAgIHZvaWQgX19nZXRfbWludXRlKGludCYgX19tLAorICAgICAgICAgICAgICAgICAgICAgIGl0ZXJfdHlwZSYgX19iLCBpdGVyX3R5cGUgX19lLAorICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0KSBjb25zdDsKKyAgICB2b2lkIF9fZ2V0X3NlY29uZChpbnQmIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICBpdGVyX3R5cGUmIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3R5cGU8Y2hhcl90eXBlPiYgX19jdCkgY29uc3Q7CisgICAgdm9pZCBfX2dldF93ZWVrZGF5KGludCYgX193LAorICAgICAgICAgICAgICAgICAgICAgICBpdGVyX3R5cGUmIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0KSBjb25zdDsKKyAgICB2b2lkIF9fZ2V0X2RheV95ZWFyX251bShpbnQmIF9fdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyX3R5cGUmIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3R5cGU8Y2hhcl90eXBlPiYgX19jdCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2xvY2FsZTo6aWQKK3RpbWVfZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+OjppZDsKKworLy8gdGltZV9nZXQgcHJpbWl0aXZlcworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3ZvaWQKK3RpbWVfZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+OjpfX2dldF93ZWVrZGF5bmFtZShpbnQmIF9fdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyX3R5cGUmIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3R5cGU8Y2hhcl90eXBlPiYgX19jdCkgY29uc3QKK3sKKyAgICAvLyBOb3RlOiAgaWdub3JpbmcgY2FzZSBjb21lcyBmcm9tIHRoZSBQT1NJWCBzdHJwdGltZSBzcGVjCisgICAgY29uc3Qgc3RyaW5nX3R5cGUqIF9fd2sgPSB0aGlzLT5fX3dlZWtzKCk7CisgICAgcHRyZGlmZl90IF9faSA9IF9fc2Nhbl9rZXl3b3JkKF9fYiwgX19lLCBfX3drLCBfX3drKzE0LCBfX2N0LCBfX2VyciwgZmFsc2UpIC0gX193azsKKyAgICBpZiAoX19pIDwgMTQpCisgICAgICAgIF9fdyA9IF9faSAlIDc7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordm9pZAordGltZV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyYXRvcj46Ol9fZ2V0X21vbnRobmFtZShpbnQmIF9fbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcl90eXBlJiBfX2IsIGl0ZXJfdHlwZSBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3R5cGU8Y2hhcl90eXBlPiYgX19jdCkgY29uc3QKK3sKKyAgICAvLyBOb3RlOiAgaWdub3JpbmcgY2FzZSBjb21lcyBmcm9tIHRoZSBQT1NJWCBzdHJwdGltZSBzcGVjCisgICAgY29uc3Qgc3RyaW5nX3R5cGUqIF9fbW9udGggPSB0aGlzLT5fX21vbnRocygpOworICAgIHB0cmRpZmZfdCBfX2kgPSBfX3NjYW5fa2V5d29yZChfX2IsIF9fZSwgX19tb250aCwgX19tb250aCsyNCwgX19jdCwgX19lcnIsIGZhbHNlKSAtIF9fbW9udGg7CisgICAgaWYgKF9faSA8IDI0KQorICAgICAgICBfX20gPSBfX2kgJSAxMjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcmF0b3I+Cit2b2lkCit0aW1lX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXJhdG9yPjo6X19nZXRfZGF5KGludCYgX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyX3R5cGUmIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0KSBjb25zdAoreworICAgIGludCBfX3QgPSBfX2dldF91cF90b19uX2RpZ2l0cyhfX2IsIF9fZSwgX19lcnIsIF9fY3QsIDIpOworICAgIGlmICghKF9fZXJyICYgaW9zX2Jhc2U6OmZhaWxiaXQpICYmIDEgPD0gX190ICYmIF9fdCA8PSAzMSkKKyAgICAgICAgX19kID0gX190OworICAgIGVsc2UKKyAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordm9pZAordGltZV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyYXRvcj46Ol9fZ2V0X21vbnRoKGludCYgX19tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJfdHlwZSYgX19iLCBpdGVyX3R5cGUgX19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0KSBjb25zdAoreworICAgIGludCBfX3QgPSBfX2dldF91cF90b19uX2RpZ2l0cyhfX2IsIF9fZSwgX19lcnIsIF9fY3QsIDIpIC0gMTsKKyAgICBpZiAoIShfX2VyciAmIGlvc19iYXNlOjpmYWlsYml0KSAmJiBfX3QgPD0gMTEpCisgICAgICAgIF9fbSA9IF9fdDsKKyAgICBlbHNlCisgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3ZvaWQKK3RpbWVfZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+OjpfX2dldF95ZWFyKGludCYgX195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcl90eXBlJiBfX2IsIGl0ZXJfdHlwZSBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0KSBjb25zdAoreworICAgIGludCBfX3QgPSBfX2dldF91cF90b19uX2RpZ2l0cyhfX2IsIF9fZSwgX19lcnIsIF9fY3QsIDQpOworICAgIGlmICghKF9fZXJyICYgaW9zX2Jhc2U6OmZhaWxiaXQpKQorICAgIHsKKyAgICAgICAgaWYgKF9fdCA8IDY5KQorICAgICAgICAgICAgX190ICs9IDIwMDA7CisgICAgICAgIGVsc2UgaWYgKDY5IDw9IF9fdCAmJiBfX3QgPD0gOTkpCisgICAgICAgICAgICBfX3QgKz0gMTkwMDsKKyAgICAgICAgX195ID0gX190IC0gMTkwMDsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordm9pZAordGltZV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyYXRvcj46Ol9fZ2V0X3llYXI0KGludCYgX195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJfdHlwZSYgX19iLCBpdGVyX3R5cGUgX19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0KSBjb25zdAoreworICAgIGludCBfX3QgPSBfX2dldF91cF90b19uX2RpZ2l0cyhfX2IsIF9fZSwgX19lcnIsIF9fY3QsIDQpOworICAgIGlmICghKF9fZXJyICYgaW9zX2Jhc2U6OmZhaWxiaXQpKQorICAgICAgICBfX3kgPSBfX3QgLSAxOTAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3ZvaWQKK3RpbWVfZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+OjpfX2dldF9ob3VyKGludCYgX19oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcl90eXBlJiBfX2IsIGl0ZXJfdHlwZSBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0KSBjb25zdAoreworICAgIGludCBfX3QgPSBfX2dldF91cF90b19uX2RpZ2l0cyhfX2IsIF9fZSwgX19lcnIsIF9fY3QsIDIpOworICAgIGlmICghKF9fZXJyICYgaW9zX2Jhc2U6OmZhaWxiaXQpICYmIF9fdCA8PSAyMykKKyAgICAgICAgX19oID0gX190OworICAgIGVsc2UKKyAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordm9pZAordGltZV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyYXRvcj46Ol9fZ2V0XzEyX2hvdXIoaW50JiBfX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyX3R5cGUmIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN0eXBlPGNoYXJfdHlwZT4mIF9fY3QpIGNvbnN0Cit7CisgICAgaW50IF9fdCA9IF9fZ2V0X3VwX3RvX25fZGlnaXRzKF9fYiwgX19lLCBfX2VyciwgX19jdCwgMik7CisgICAgaWYgKCEoX19lcnIgJiBpb3NfYmFzZTo6ZmFpbGJpdCkgJiYgMSA8PSBfX3QgJiYgX190IDw9IDEyKQorICAgICAgICBfX2ggPSBfX3Q7CisgICAgZWxzZQorICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcmF0b3I+Cit2b2lkCit0aW1lX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXJhdG9yPjo6X19nZXRfbWludXRlKGludCYgX19tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyX3R5cGUmIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0KSBjb25zdAoreworICAgIGludCBfX3QgPSBfX2dldF91cF90b19uX2RpZ2l0cyhfX2IsIF9fZSwgX19lcnIsIF9fY3QsIDIpOworICAgIGlmICghKF9fZXJyICYgaW9zX2Jhc2U6OmZhaWxiaXQpICYmIF9fdCA8PSA1OSkKKyAgICAgICAgX19tID0gX190OworICAgIGVsc2UKKyAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordm9pZAordGltZV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyYXRvcj46Ol9fZ2V0X3NlY29uZChpbnQmIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcl90eXBlJiBfX2IsIGl0ZXJfdHlwZSBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3R5cGU8Y2hhcl90eXBlPiYgX19jdCkgY29uc3QKK3sKKyAgICBpbnQgX190ID0gX19nZXRfdXBfdG9fbl9kaWdpdHMoX19iLCBfX2UsIF9fZXJyLCBfX2N0LCAyKTsKKyAgICBpZiAoIShfX2VyciAmIGlvc19iYXNlOjpmYWlsYml0KSAmJiBfX3QgPD0gNjApCisgICAgICAgIF9fcyA9IF9fdDsKKyAgICBlbHNlCisgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3ZvaWQKK3RpbWVfZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+OjpfX2dldF93ZWVrZGF5KGludCYgX193LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcl90eXBlJiBfX2IsIGl0ZXJfdHlwZSBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0KSBjb25zdAoreworICAgIGludCBfX3QgPSBfX2dldF91cF90b19uX2RpZ2l0cyhfX2IsIF9fZSwgX19lcnIsIF9fY3QsIDEpOworICAgIGlmICghKF9fZXJyICYgaW9zX2Jhc2U6OmZhaWxiaXQpICYmIF9fdCA8PSA2KQorICAgICAgICBfX3cgPSBfX3Q7CisgICAgZWxzZQorICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcmF0b3I+Cit2b2lkCit0aW1lX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXJhdG9yPjo6X19nZXRfZGF5X3llYXJfbnVtKGludCYgX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyX3R5cGUmIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0KSBjb25zdAoreworICAgIGludCBfX3QgPSBfX2dldF91cF90b19uX2RpZ2l0cyhfX2IsIF9fZSwgX19lcnIsIF9fY3QsIDMpOworICAgIGlmICghKF9fZXJyICYgaW9zX2Jhc2U6OmZhaWxiaXQpICYmIF9fdCA8PSAzNjUpCisgICAgICAgIF9fZCA9IF9fdDsKKyAgICBlbHNlCisgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3ZvaWQKK3RpbWVfZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+OjpfX2dldF93aGl0ZV9zcGFjZShpdGVyX3R5cGUmIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3R5cGU8Y2hhcl90eXBlPiYgX19jdCkgY29uc3QKK3sKKyAgICBmb3IgKDsgX19iICE9IF9fZSAmJiBfX2N0LmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCAqX19iKTsgKytfX2IpCisgICAgICAgIDsKKyAgICBpZiAoX19iID09IF9fZSkKKyAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcmF0b3I+Cit2b2lkCit0aW1lX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXJhdG9yPjo6X19nZXRfYW1fcG0oaW50JiBfX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcl90eXBlJiBfX2IsIGl0ZXJfdHlwZSBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN0eXBlPGNoYXJfdHlwZT4mIF9fY3QpIGNvbnN0Cit7CisgICAgY29uc3Qgc3RyaW5nX3R5cGUqIF9fYXAgPSB0aGlzLT5fX2FtX3BtKCk7CisgICAgaWYgKF9fYXBbMF0uc2l6ZSgpICsgX19hcFsxXS5zaXplKCkgPT0gMCkKKyAgICB7CisgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHB0cmRpZmZfdCBfX2kgPSBfX3NjYW5fa2V5d29yZChfX2IsIF9fZSwgX19hcCwgX19hcCsyLCBfX2N0LCBfX2VyciwgZmFsc2UpIC0gX19hcDsKKyAgICBpZiAoX19pID09IDAgJiYgX19oID09IDEyKQorICAgICAgICBfX2ggPSAwOworICAgIGVsc2UgaWYgKF9faSA9PSAxICYmIF9faCA8IDEyKQorICAgICAgICBfX2ggKz0gMTI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordm9pZAordGltZV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyYXRvcj46Ol9fZ2V0X3BlcmNlbnQoaXRlcl90eXBlJiBfX2IsIGl0ZXJfdHlwZSBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0KSBjb25zdAoreworICAgIGlmIChfX2IgPT0gX19lKQorICAgIHsKKyAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdCB8IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChfX2N0Lm5hcnJvdygqX19iLCAwKSAhPSAnJScpCisgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgIGVsc2UgaWYoKytfX2IgPT0gX19lKQorICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworfQorCisvLyB0aW1lX2dldCBlbmQgcHJpbWl0aXZlcworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK19JbnB1dEl0ZXJhdG9yCit0aW1lX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXJhdG9yPjo6Z2V0KGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcl90eXBlKiBfX2ZtdGIsIGNvbnN0IGNoYXJfdHlwZSogX19mbXRlKSBjb25zdAoreworICAgIGNvbnN0IGN0eXBlPGNoYXJfdHlwZT4mIF9fY3QgPSB1c2VfZmFjZXQ8Y3R5cGU8Y2hhcl90eXBlPiA+KF9faW9iLmdldGxvYygpKTsKKyAgICBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgIHdoaWxlIChfX2ZtdGIgIT0gX19mbXRlICYmIF9fZXJyID09IGlvc19iYXNlOjpnb29kYml0KQorICAgIHsKKyAgICAgICAgaWYgKF9fYiA9PSBfX2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19jdC5uYXJyb3coKl9fZm10YiwgMCkgPT0gJyUnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKytfX2ZtdGIgPT0gX19mbXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFyIF9fY21kID0gX19jdC5uYXJyb3coKl9fZm10YiwgMCk7CisgICAgICAgICAgICBjaGFyIF9fb3B0ID0gJ1wwJzsKKyAgICAgICAgICAgIGlmIChfX2NtZCA9PSAnRScgfHwgX19jbWQgPT0gJzAnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgrK19fZm10YiA9PSBfX2ZtdGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19vcHQgPSBfX2NtZDsKKyAgICAgICAgICAgICAgICBfX2NtZCA9IF9fY3QubmFycm93KCpfX2ZtdGIsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19iID0gZG9fZ2V0KF9fYiwgX19lLCBfX2lvYiwgX19lcnIsIF9fdG0sIF9fY21kLCBfX29wdCk7CisgICAgICAgICAgICArK19fZm10YjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChfX2N0LmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCAqX19mbXRiKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICgrK19fZm10YjsgX19mbXRiICE9IF9fZm10ZSAmJiBfX2N0LmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCAqX19mbXRiKTsgKytfX2ZtdGIpCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgZm9yICggICAgICAgIDsgICAgX19iICE9IF9fZSAgICAmJiBfX2N0LmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCAqX19iKTsgICAgKytfX2IpCisgICAgICAgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKF9fY3QudG91cHBlcigqX19iKSA9PSBfX2N0LnRvdXBwZXIoKl9fZm10YikpCisgICAgICAgIHsKKyAgICAgICAgICAgICsrX19iOworICAgICAgICAgICAgKytfX2ZtdGI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICB9CisgICAgaWYgKF9fYiA9PSBfX2UpCisgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgcmV0dXJuIF9fYjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcmF0b3I+Cit0eXBlbmFtZSB0aW1lX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXJhdG9yPjo6ZGF0ZW9yZGVyCit0aW1lX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXJhdG9yPjo6ZG9fZGF0ZV9vcmRlcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1keTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcmF0b3I+CitfSW5wdXRJdGVyYXRvcgordGltZV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyYXRvcj46OmRvX2dldF90aW1lKGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bSogX190bSkgY29uc3QKK3sKKyAgICBjb25zdCBjaGFyX3R5cGUgX19mbXRbXSA9IHsnJScsICdIJywgJzonLCAnJScsICdNJywgJzonLCAnJScsICdTJ307CisgICAgcmV0dXJuIGdldChfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX3RtLCBfX2ZtdCwgX19mbXQgKyBzaXplb2YoX19mbXQpL3NpemVvZihfX2ZtdFswXSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK19JbnB1dEl0ZXJhdG9yCit0aW1lX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXJhdG9yPjo6ZG9fZ2V0X2RhdGUoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtKiBfX3RtKSBjb25zdAoreworICAgIGNvbnN0IHN0cmluZ190eXBlJiBfX2ZtdCA9IHRoaXMtPl9feCgpOworICAgIHJldHVybiBnZXQoX19iLCBfX2UsIF9faW9iLCBfX2VyciwgX190bSwgX19mbXQuZGF0YSgpLCBfX2ZtdC5kYXRhKCkgKyBfX2ZtdC5zaXplKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK19JbnB1dEl0ZXJhdG9yCit0aW1lX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXJhdG9yPjo6ZG9fZ2V0X3dlZWtkYXkoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtKiBfX3RtKSBjb25zdAoreworICAgIGNvbnN0IGN0eXBlPGNoYXJfdHlwZT4mIF9fY3QgPSB1c2VfZmFjZXQ8Y3R5cGU8Y2hhcl90eXBlPiA+KF9faW9iLmdldGxvYygpKTsKKyAgICBfX2dldF93ZWVrZGF5bmFtZShfX3RtLT50bV93ZGF5LCBfX2IsIF9fZSwgX19lcnIsIF9fY3QpOworICAgIHJldHVybiBfX2I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorX0lucHV0SXRlcmF0b3IKK3RpbWVfZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+Ojpkb19nZXRfbW9udGhuYW1lKGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bSogX190bSkgY29uc3QKK3sKKyAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0ID0gdXNlX2ZhY2V0PGN0eXBlPGNoYXJfdHlwZT4gPihfX2lvYi5nZXRsb2MoKSk7CisgICAgX19nZXRfbW9udGhuYW1lKF9fdG0tPnRtX21vbiwgX19iLCBfX2UsIF9fZXJyLCBfX2N0KTsKKyAgICByZXR1cm4gX19iOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK19JbnB1dEl0ZXJhdG9yCit0aW1lX2dldDxfQ2hhclQsIF9JbnB1dEl0ZXJhdG9yPjo6ZG9fZ2V0X3llYXIoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtKiBfX3RtKSBjb25zdAoreworICAgIGNvbnN0IGN0eXBlPGNoYXJfdHlwZT4mIF9fY3QgPSB1c2VfZmFjZXQ8Y3R5cGU8Y2hhcl90eXBlPiA+KF9faW9iLmdldGxvYygpKTsKKyAgICBfX2dldF95ZWFyKF9fdG0tPnRtX3llYXIsIF9fYiwgX19lLCBfX2VyciwgX19jdCk7CisgICAgcmV0dXJuIF9fYjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcmF0b3I+CitfSW5wdXRJdGVyYXRvcgordGltZV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyYXRvcj46OmRvX2dldChpdGVyX3R5cGUgX19iLCBpdGVyX3R5cGUgX19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgX19mbXQsIGNoYXIpIGNvbnN0Cit7CisgICAgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0ID0gdXNlX2ZhY2V0PGN0eXBlPGNoYXJfdHlwZT4gPihfX2lvYi5nZXRsb2MoKSk7CisgICAgc3dpdGNoIChfX2ZtdCkKKyAgICB7CisgICAgY2FzZSAnYSc6CisgICAgY2FzZSAnQSc6CisgICAgICAgIF9fZ2V0X3dlZWtkYXluYW1lKF9fdG0tPnRtX3dkYXksIF9fYiwgX19lLCBfX2VyciwgX19jdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2InOgorICAgIGNhc2UgJ0InOgorICAgIGNhc2UgJ2gnOgorICAgICAgICBfX2dldF9tb250aG5hbWUoX190bS0+dG1fbW9uLCBfX2IsIF9fZSwgX19lcnIsIF9fY3QpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdjJzoKKyAgICAgICAgeworICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19mbSA9IHRoaXMtPl9fYygpOworICAgICAgICBfX2IgPSBnZXQoX19iLCBfX2UsIF9faW9iLCBfX2VyciwgX190bSwgX19mbS5kYXRhKCksIF9fZm0uZGF0YSgpICsgX19mbS5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2QnOgorICAgIGNhc2UgJ2UnOgorICAgICAgICBfX2dldF9kYXkoX190bS0+dG1fbWRheSwgX19iLCBfX2UsIF9fZXJyLCBfX2N0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnRCc6CisgICAgICAgIHsKKyAgICAgICAgY29uc3QgY2hhcl90eXBlIF9fZm1bXSA9IHsnJScsICdtJywgJy8nLCAnJScsICdkJywgJy8nLCAnJScsICd5J307CisgICAgICAgIF9fYiA9IGdldChfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX3RtLCBfX2ZtLCBfX2ZtICsgc2l6ZW9mKF9fZm0pL3NpemVvZihfX2ZtWzBdKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnRic6CisgICAgICAgIHsKKyAgICAgICAgY29uc3QgY2hhcl90eXBlIF9fZm1bXSA9IHsnJScsICdZJywgJy0nLCAnJScsICdtJywgJy0nLCAnJScsICdkJ307CisgICAgICAgIF9fYiA9IGdldChfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX3RtLCBfX2ZtLCBfX2ZtICsgc2l6ZW9mKF9fZm0pL3NpemVvZihfX2ZtWzBdKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnSCc6CisgICAgICAgIF9fZ2V0X2hvdXIoX190bS0+dG1faG91ciwgX19iLCBfX2UsIF9fZXJyLCBfX2N0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnSSc6CisgICAgICAgIF9fZ2V0XzEyX2hvdXIoX190bS0+dG1faG91ciwgX19iLCBfX2UsIF9fZXJyLCBfX2N0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnaic6CisgICAgICAgIF9fZ2V0X2RheV95ZWFyX251bShfX3RtLT50bV95ZGF5LCBfX2IsIF9fZSwgX19lcnIsIF9fY3QpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdtJzoKKyAgICAgICAgX19nZXRfbW9udGgoX190bS0+dG1fbW9uLCBfX2IsIF9fZSwgX19lcnIsIF9fY3QpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdNJzoKKyAgICAgICAgX19nZXRfbWludXRlKF9fdG0tPnRtX21pbiwgX19iLCBfX2UsIF9fZXJyLCBfX2N0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnbic6CisgICAgY2FzZSAndCc6CisgICAgICAgIF9fZ2V0X3doaXRlX3NwYWNlKF9fYiwgX19lLCBfX2VyciwgX19jdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ3AnOgorICAgICAgICBfX2dldF9hbV9wbShfX3RtLT50bV9ob3VyLCBfX2IsIF9fZSwgX19lcnIsIF9fY3QpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdyJzoKKyAgICAgICAgeworICAgICAgICBjb25zdCBjaGFyX3R5cGUgX19mbVtdID0geyclJywgJ0knLCAnOicsICclJywgJ00nLCAnOicsICclJywgJ1MnLCAnICcsICclJywgJ3AnfTsKKyAgICAgICAgX19iID0gZ2V0KF9fYiwgX19lLCBfX2lvYiwgX19lcnIsIF9fdG0sIF9fZm0sIF9fZm0gKyBzaXplb2YoX19mbSkvc2l6ZW9mKF9fZm1bMF0pKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICdSJzoKKyAgICAgICAgeworICAgICAgICBjb25zdCBjaGFyX3R5cGUgX19mbVtdID0geyclJywgJ0gnLCAnOicsICclJywgJ00nfTsKKyAgICAgICAgX19iID0gZ2V0KF9fYiwgX19lLCBfX2lvYiwgX19lcnIsIF9fdG0sIF9fZm0sIF9fZm0gKyBzaXplb2YoX19mbSkvc2l6ZW9mKF9fZm1bMF0pKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICdTJzoKKyAgICAgICAgX19nZXRfc2Vjb25kKF9fdG0tPnRtX3NlYywgX19iLCBfX2UsIF9fZXJyLCBfX2N0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnVCc6CisgICAgICAgIHsKKyAgICAgICAgY29uc3QgY2hhcl90eXBlIF9fZm1bXSA9IHsnJScsICdIJywgJzonLCAnJScsICdNJywgJzonLCAnJScsICdTJ307CisgICAgICAgIF9fYiA9IGdldChfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX3RtLCBfX2ZtLCBfX2ZtICsgc2l6ZW9mKF9fZm0pL3NpemVvZihfX2ZtWzBdKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAndyc6CisgICAgICAgIF9fZ2V0X3dlZWtkYXkoX190bS0+dG1fd2RheSwgX19iLCBfX2UsIF9fZXJyLCBfX2N0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAneCc6CisgICAgICAgIHJldHVybiBkb19nZXRfZGF0ZShfX2IsIF9fZSwgX19pb2IsIF9fZXJyLCBfX3RtKTsKKyAgICBjYXNlICdYJzoKKyAgICAgICAgeworICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19mbSA9IHRoaXMtPl9fWCgpOworICAgICAgICBfX2IgPSBnZXQoX19iLCBfX2UsIF9faW9iLCBfX2VyciwgX190bSwgX19mbS5kYXRhKCksIF9fZm0uZGF0YSgpICsgX19mbS5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ3knOgorICAgICAgICBfX2dldF95ZWFyKF9fdG0tPnRtX3llYXIsIF9fYiwgX19lLCBfX2VyciwgX19jdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ1knOgorICAgICAgICBfX2dldF95ZWFyNChfX3RtLT50bV95ZWFyLCBfX2IsIF9fZSwgX19lcnIsIF9fY3QpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICclJzoKKyAgICAgICAgX19nZXRfcGVyY2VudChfX2IsIF9fZSwgX19lcnIsIF9fY3QpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICB9CisgICAgcmV0dXJuIF9fYjsKK30KKworX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUyKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIHRpbWVfZ2V0PGNoYXI+KQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUyKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIHRpbWVfZ2V0PHdjaGFyX3Q+KQorCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIF9fdGltZV9nZXQKK3sKK3Byb3RlY3RlZDoKKyAgICBsb2NhbGVfdCBfX2xvY187CisKKyAgICBfX3RpbWVfZ2V0KGNvbnN0IGNoYXIqIF9fbm0pOworICAgIF9fdGltZV9nZXQoY29uc3Qgc3RyaW5nJiBfX25tKTsKKyAgICB+X190aW1lX2dldCgpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9fdGltZV9nZXRfc3RvcmFnZQorICAgIDogcHVibGljIF9fdGltZV9nZXQKK3sKK3Byb3RlY3RlZDoKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQ+IHN0cmluZ190eXBlOworCisgICAgc3RyaW5nX3R5cGUgX193ZWVrc19bMTRdOworICAgIHN0cmluZ190eXBlIF9fbW9udGhzX1syNF07CisgICAgc3RyaW5nX3R5cGUgX19hbV9wbV9bMl07CisgICAgc3RyaW5nX3R5cGUgX19jXzsKKyAgICBzdHJpbmdfdHlwZSBfX3JfOworICAgIHN0cmluZ190eXBlIF9feF87CisgICAgc3RyaW5nX3R5cGUgX19YXzsKKworICAgIGV4cGxpY2l0IF9fdGltZV9nZXRfc3RvcmFnZShjb25zdCBjaGFyKiBfX25tKTsKKyAgICBleHBsaWNpdCBfX3RpbWVfZ2V0X3N0b3JhZ2UoY29uc3Qgc3RyaW5nJiBfX25tKTsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSB+X190aW1lX2dldF9zdG9yYWdlKCkge30KKworICAgIHRpbWVfYmFzZTo6ZGF0ZW9yZGVyIF9fZG9fZGF0ZV9vcmRlcigpIGNvbnN0OworCitwcml2YXRlOgorICAgIHZvaWQgaW5pdChjb25zdCBjdHlwZTxfQ2hhclQ+Jik7CisgICAgc3RyaW5nX3R5cGUgX19hbmFseXplKGNoYXIgX19mbXQsIGNvbnN0IGN0eXBlPF9DaGFyVD4mKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yID0gaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ID4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHRpbWVfZ2V0X2J5bmFtZQorICAgIDogcHVibGljIHRpbWVfZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+LAorICAgICAgcHJpdmF0ZSBfX3RpbWVfZ2V0X3N0b3JhZ2U8X0NoYXJUPgoreworcHVibGljOgorICAgIHR5cGVkZWYgdGltZV9iYXNlOjpkYXRlb3JkZXIgICAgZGF0ZW9yZGVyOworICAgIHR5cGVkZWYgX0lucHV0SXRlcmF0b3IgICAgICAgICAgaXRlcl90eXBlOworICAgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZT4gc3RyaW5nX3R5cGU7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgdGltZV9nZXRfYnluYW1lKGNvbnN0IGNoYXIqIF9fbm0sIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgICA6IHRpbWVfZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+KF9fcmVmcyksCisgICAgICAgICAgX190aW1lX2dldF9zdG9yYWdlPF9DaGFyVD4oX19ubSkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgdGltZV9nZXRfYnluYW1lKGNvbnN0IHN0cmluZyYgX19ubSwgc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICAgIDogdGltZV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyYXRvcj4oX19yZWZzKSwKKyAgICAgICAgICBfX3RpbWVfZ2V0X3N0b3JhZ2U8X0NoYXJUPihfX25tKSB7fQorCitwcm90ZWN0ZWQ6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIH50aW1lX2dldF9ieW5hbWUoKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZpcnR1YWwgZGF0ZW9yZGVyIGRvX2RhdGVfb3JkZXIoKSBjb25zdCB7cmV0dXJuIHRoaXMtPl9fZG9fZGF0ZV9vcmRlcigpO30KK3ByaXZhdGU6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZpcnR1YWwgY29uc3Qgc3RyaW5nX3R5cGUqIF9fd2Vla3MoKSBjb25zdCAge3JldHVybiB0aGlzLT5fX3dlZWtzXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZpcnR1YWwgY29uc3Qgc3RyaW5nX3R5cGUqIF9fbW9udGhzKCkgY29uc3Qge3JldHVybiB0aGlzLT5fX21vbnRoc187fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2aXJ0dWFsIGNvbnN0IHN0cmluZ190eXBlKiBfX2FtX3BtKCkgY29uc3QgIHtyZXR1cm4gdGhpcy0+X19hbV9wbV87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2aXJ0dWFsIGNvbnN0IHN0cmluZ190eXBlJiBfX2MoKSBjb25zdCAgICAgIHtyZXR1cm4gdGhpcy0+X19jXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZpcnR1YWwgY29uc3Qgc3RyaW5nX3R5cGUmIF9fcigpIGNvbnN0ICAgICAge3JldHVybiB0aGlzLT5fX3JfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmlydHVhbCBjb25zdCBzdHJpbmdfdHlwZSYgX194KCkgY29uc3QgICAgICB7cmV0dXJuIHRoaXMtPl9feF87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2aXJ0dWFsIGNvbnN0IHN0cmluZ190eXBlJiBfX1goKSBjb25zdCAgICAgIHtyZXR1cm4gdGhpcy0+X19YXzt9Cit9OworCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURTIoY2xhc3MgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfVFlQRV9WSVMgdGltZV9nZXRfYnluYW1lPGNoYXI+KQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUyKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIHRpbWVfZ2V0X2J5bmFtZTx3Y2hhcl90PikKKworY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBfX3RpbWVfcHV0Cit7CisgICAgbG9jYWxlX3QgX19sb2NfOworcHJvdGVjdGVkOgorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBfX3RpbWVfcHV0KCkgOiBfX2xvY18oX0xJQkNQUF9HRVRfQ19MT0NBTEUpIHt9CisgICAgX190aW1lX3B1dChjb25zdCBjaGFyKiBfX25tKTsKKyAgICBfX3RpbWVfcHV0KGNvbnN0IHN0cmluZyYgX19ubSk7CisgICAgfl9fdGltZV9wdXQoKTsKKyAgICB2b2lkIF9fZG9fcHV0KGNoYXIqIF9fbmIsIGNoYXIqJiBfX25lLCBjb25zdCB0bSogX190bSwKKyAgICAgICAgICAgICAgICAgIGNoYXIgX19mbXQsIGNoYXIgX19tb2QpIGNvbnN0OworICAgIHZvaWQgX19kb19wdXQod2NoYXJfdCogX193Yiwgd2NoYXJfdComIF9fd2UsIGNvbnN0IHRtKiBfX3RtLAorICAgICAgICAgICAgICAgICAgY2hhciBfX2ZtdCwgY2hhciBfX21vZCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcmF0b3IgPSBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdGltZV9wdXQKKyAgICA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LAorICAgICAgcHJpdmF0ZSBfX3RpbWVfcHV0Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOworICAgIHR5cGVkZWYgX091dHB1dEl0ZXJhdG9yIGl0ZXJfdHlwZTsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGV4cGxpY2l0IHRpbWVfcHV0KHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgICA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKSB7fQorCisgICAgaXRlcl90eXBlIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pb2IsIGNoYXJfdHlwZSBfX2ZsLCBjb25zdCB0bSogX190bSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19wYiwgY29uc3QgY2hhcl90eXBlKiBfX3BlKSBjb25zdDsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW9iLCBjaGFyX3R5cGUgX19mbCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHRtKiBfX3RtLCBjaGFyIF9fZm10LCBjaGFyIF9fbW9kID0gMCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19wdXQoX19zLCBfX2lvYiwgX19mbCwgX190bSwgX19mbXQsIF9fbW9kKTsKKyAgICB9CisKKyAgICBzdGF0aWMgbG9jYWxlOjppZCBpZDsKKworcHJvdGVjdGVkOgorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIH50aW1lX3B1dCgpIHt9CisgICAgdmlydHVhbCBpdGVyX3R5cGUgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiwgY2hhcl90eXBlLCBjb25zdCB0bSogX190bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBfX2ZtdCwgY2hhciBfX21vZCkgY29uc3Q7CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBleHBsaWNpdCB0aW1lX3B1dChjb25zdCBjaGFyKiBfX25tLCBzaXplX3QgX19yZWZzKQorICAgICAgICA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKSwKKyAgICAgICAgICBfX3RpbWVfcHV0KF9fbm0pIHt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgZXhwbGljaXQgdGltZV9wdXQoY29uc3Qgc3RyaW5nJiBfX25tLCBzaXplX3QgX19yZWZzKQorICAgICAgICA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKSwKKyAgICAgICAgICBfX3RpbWVfcHV0KF9fbm0pIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+Citsb2NhbGU6OmlkCit0aW1lX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyYXRvcj46OmlkOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitfT3V0cHV0SXRlcmF0b3IKK3RpbWVfcHV0PF9DaGFyVCwgX091dHB1dEl0ZXJhdG9yPjo6cHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZSBfX2ZsLCBjb25zdCB0bSogX190bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19wYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19wZSkgY29uc3QKK3sKKyAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0ID0gdXNlX2ZhY2V0PGN0eXBlPGNoYXJfdHlwZT4gPihfX2lvYi5nZXRsb2MoKSk7CisgICAgZm9yICg7IF9fcGIgIT0gX19wZTsgKytfX3BiKQorICAgIHsKKyAgICAgICAgaWYgKF9fY3QubmFycm93KCpfX3BiLCAwKSA9PSAnJScpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgrK19fcGIgPT0gX19wZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqX19zKysgPSBfX3BiWy0xXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXIgX19tb2QgPSAwOworICAgICAgICAgICAgY2hhciBfX2ZtdCA9IF9fY3QubmFycm93KCpfX3BiLCAwKTsKKyAgICAgICAgICAgIGlmIChfX2ZtdCA9PSAnRScgfHwgX19mbXQgPT0gJ08nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgrK19fcGIgPT0gX19wZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpfX3MrKyA9IF9fcGJbLTJdOworICAgICAgICAgICAgICAgICAgICAqX19zKysgPSBfX3BiWy0xXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fbW9kID0gX19mbXQ7CisgICAgICAgICAgICAgICAgX19mbXQgPSBfX2N0Lm5hcnJvdygqX19wYiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX3MgPSBkb19wdXQoX19zLCBfX2lvYiwgX19mbCwgX190bSwgX19mbXQsIF9fbW9kKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAqX19zKysgPSAqX19wYjsKKyAgICB9CisgICAgcmV0dXJuIF9fczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgorX091dHB1dEl0ZXJhdG9yCit0aW1lX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyYXRvcj46OmRvX3B1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGUsIGNvbnN0IHRtKiBfX3RtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBfX2ZtdCwgY2hhciBfX21vZCkgY29uc3QKK3sKKyAgICBjaGFyX3R5cGUgX19uYXJbMTAwXTsKKyAgICBjaGFyX3R5cGUqIF9fbmIgPSBfX25hcjsKKyAgICBjaGFyX3R5cGUqIF9fbmUgPSBfX25iICsgMTAwOworICAgIF9fZG9fcHV0KF9fbmIsIF9fbmUsIF9fdG0sIF9fZm10LCBfX21vZCk7CisgICAgcmV0dXJuIF9WU1REOjpjb3B5KF9fbmIsIF9fbmUsIF9fcyk7Cit9CisKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFMihjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyB0aW1lX3B1dDxjaGFyPikKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFMihjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyB0aW1lX3B1dDx3Y2hhcl90PikKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX091dHB1dEl0ZXJhdG9yID0gb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ID4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHRpbWVfcHV0X2J5bmFtZQorICAgIDogcHVibGljIHRpbWVfcHV0PF9DaGFyVCwgX091dHB1dEl0ZXJhdG9yPgoreworcHVibGljOgorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGV4cGxpY2l0IHRpbWVfcHV0X2J5bmFtZShjb25zdCBjaGFyKiBfX25tLCBzaXplX3QgX19yZWZzID0gMCkKKyAgICAgICAgOiB0aW1lX3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyYXRvcj4oX19ubSwgX19yZWZzKSB7fQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgZXhwbGljaXQgdGltZV9wdXRfYnluYW1lKGNvbnN0IHN0cmluZyYgX19ubSwgc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICAgIDogdGltZV9wdXQ8X0NoYXJULCBfT3V0cHV0SXRlcmF0b3I+KF9fbm0sIF9fcmVmcykge30KKworcHJvdGVjdGVkOgorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIH50aW1lX3B1dF9ieW5hbWUoKSB7fQorfTsKKworX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUyKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIHRpbWVfcHV0X2J5bmFtZTxjaGFyPikKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFMihjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyB0aW1lX3B1dF9ieW5hbWU8d2NoYXJfdD4pCisKKy8vIG1vbmV5X2Jhc2UKKworY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBtb25leV9iYXNlCit7CitwdWJsaWM6CisgICAgZW51bSBwYXJ0IHtub25lLCBzcGFjZSwgc3ltYm9sLCBzaWduLCB2YWx1ZX07CisgICAgc3RydWN0IHBhdHRlcm4ge2NoYXIgZmllbGRbNF07fTsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBtb25leV9iYXNlKCkge30KK307CisKKy8vIG1vbmV5cHVuY3QKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgYm9vbCBfSW50ZXJuYXRpb25hbCA9IGZhbHNlPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgbW9uZXlwdW5jdAorICAgIDogcHVibGljIGxvY2FsZTo6ZmFjZXQsCisgICAgICBwdWJsaWMgbW9uZXlfYmFzZQoreworcHVibGljOgorICAgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZT4gc3RyaW5nX3R5cGU7CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBleHBsaWNpdCBtb25leXB1bmN0KHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgICA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKSB7fQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGNoYXJfdHlwZSAgIGRlY2ltYWxfcG9pbnQoKSBjb25zdCB7cmV0dXJuIGRvX2RlY2ltYWxfcG9pbnQoKTt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGNoYXJfdHlwZSAgIHRob3VzYW5kc19zZXAoKSBjb25zdCB7cmV0dXJuIGRvX3Rob3VzYW5kc19zZXAoKTt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIHN0cmluZyAgICAgIGdyb3VwaW5nKCkgICAgICBjb25zdCB7cmV0dXJuIGRvX2dyb3VwaW5nKCk7fQorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBzdHJpbmdfdHlwZSBjdXJyX3N5bWJvbCgpICAgY29uc3Qge3JldHVybiBkb19jdXJyX3N5bWJvbCgpO30KKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgc3RyaW5nX3R5cGUgcG9zaXRpdmVfc2lnbigpIGNvbnN0IHtyZXR1cm4gZG9fcG9zaXRpdmVfc2lnbigpO30KKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgc3RyaW5nX3R5cGUgbmVnYXRpdmVfc2lnbigpIGNvbnN0IHtyZXR1cm4gZG9fbmVnYXRpdmVfc2lnbigpO30KKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgaW50ICAgICAgICAgZnJhY19kaWdpdHMoKSAgIGNvbnN0IHtyZXR1cm4gZG9fZnJhY19kaWdpdHMoKTt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIHBhdHRlcm4gICAgIHBvc19mb3JtYXQoKSAgICBjb25zdCB7cmV0dXJuIGRvX3Bvc19mb3JtYXQoKTt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIHBhdHRlcm4gICAgIG5lZ19mb3JtYXQoKSAgICBjb25zdCB7cmV0dXJuIGRvX25lZ19mb3JtYXQoKTt9CisKKyAgICBzdGF0aWMgbG9jYWxlOjppZCBpZDsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBpbnRsID0gX0ludGVybmF0aW9uYWw7CisKK3Byb3RlY3RlZDoKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICB+bW9uZXlwdW5jdCgpIHt9CisKKyAgICB2aXJ0dWFsIGNoYXJfdHlwZSAgIGRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdCB7cmV0dXJuIG51bWVyaWNfbGltaXRzPGNoYXJfdHlwZT46Om1heCgpO30KKyAgICB2aXJ0dWFsIGNoYXJfdHlwZSAgIGRvX3Rob3VzYW5kc19zZXAoKSBjb25zdCB7cmV0dXJuIG51bWVyaWNfbGltaXRzPGNoYXJfdHlwZT46Om1heCgpO30KKyAgICB2aXJ0dWFsIHN0cmluZyAgICAgIGRvX2dyb3VwaW5nKCkgICAgICBjb25zdCB7cmV0dXJuIHN0cmluZygpO30KKyAgICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX2N1cnJfc3ltYm9sKCkgICBjb25zdCB7cmV0dXJuIHN0cmluZ190eXBlKCk7fQorICAgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fcG9zaXRpdmVfc2lnbigpIGNvbnN0IHtyZXR1cm4gc3RyaW5nX3R5cGUoKTt9CisgICAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19uZWdhdGl2ZV9zaWduKCkgY29uc3Qge3JldHVybiBzdHJpbmdfdHlwZSgxLCAnLScpO30KKyAgICB2aXJ0dWFsIGludCAgICAgICAgIGRvX2ZyYWNfZGlnaXRzKCkgICBjb25zdCB7cmV0dXJuIDA7fQorICAgIHZpcnR1YWwgcGF0dGVybiAgICAgZG9fcG9zX2Zvcm1hdCgpICAgIGNvbnN0CisgICAgICAgIHtwYXR0ZXJuIF9fcCA9IHt7c3ltYm9sLCBzaWduLCBub25lLCB2YWx1ZX19OyByZXR1cm4gX19wO30KKyAgICB2aXJ0dWFsIHBhdHRlcm4gICAgIGRvX25lZ19mb3JtYXQoKSAgICBjb25zdAorICAgICAgICB7cGF0dGVybiBfX3AgPSB7e3N5bWJvbCwgc2lnbiwgbm9uZSwgdmFsdWV9fTsgcmV0dXJuIF9fcDt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBib29sIF9JbnRlcm5hdGlvbmFsPgorbG9jYWxlOjppZAorbW9uZXlwdW5jdDxfQ2hhclQsIF9JbnRlcm5hdGlvbmFsPjo6aWQ7CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGJvb2wgX0ludGVybmF0aW9uYWw+Citjb25zdCBib29sCittb25leXB1bmN0PF9DaGFyVCwgX0ludGVybmF0aW9uYWw+OjppbnRsOworCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURTIoY2xhc3MgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfVFlQRV9WSVMgbW9uZXlwdW5jdDxjaGFyLCBmYWxzZT4pCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURTIoY2xhc3MgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfVFlQRV9WSVMgbW9uZXlwdW5jdDxjaGFyLCB0cnVlPikKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFMihjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBtb25leXB1bmN0PHdjaGFyX3QsIGZhbHNlPikKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFMihjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBtb25leXB1bmN0PHdjaGFyX3QsIHRydWU+KQorCisvLyBtb25leXB1bmN0X2J5bmFtZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBib29sIF9JbnRlcm5hdGlvbmFsID0gZmFsc2U+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBtb25leXB1bmN0X2J5bmFtZQorICAgIDogcHVibGljIG1vbmV5cHVuY3Q8X0NoYXJULCBfSW50ZXJuYXRpb25hbD4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIG1vbmV5X2Jhc2U6OnBhdHRlcm4gIHBhdHRlcm47CisgICAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcl90eXBlPiBzdHJpbmdfdHlwZTsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGV4cGxpY2l0IG1vbmV5cHVuY3RfYnluYW1lKGNvbnN0IGNoYXIqIF9fbm0sIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgICA6IG1vbmV5cHVuY3Q8X0NoYXJULCBfSW50ZXJuYXRpb25hbD4oX19yZWZzKSB7aW5pdChfX25tKTt9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBleHBsaWNpdCBtb25leXB1bmN0X2J5bmFtZShjb25zdCBzdHJpbmcmIF9fbm0sIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgICA6IG1vbmV5cHVuY3Q8X0NoYXJULCBfSW50ZXJuYXRpb25hbD4oX19yZWZzKSB7aW5pdChfX25tLmNfc3RyKCkpO30KKworcHJvdGVjdGVkOgorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIH5tb25leXB1bmN0X2J5bmFtZSgpIHt9CisKKyAgICB2aXJ0dWFsIGNoYXJfdHlwZSAgIGRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdCB7cmV0dXJuIF9fZGVjaW1hbF9wb2ludF87fQorICAgIHZpcnR1YWwgY2hhcl90eXBlICAgZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0IHtyZXR1cm4gX190aG91c2FuZHNfc2VwXzt9CisgICAgdmlydHVhbCBzdHJpbmcgICAgICBkb19ncm91cGluZygpICAgICAgY29uc3Qge3JldHVybiBfX2dyb3VwaW5nXzt9CisgICAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19jdXJyX3N5bWJvbCgpICAgY29uc3Qge3JldHVybiBfX2N1cnJfc3ltYm9sXzt9CisgICAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19wb3NpdGl2ZV9zaWduKCkgY29uc3Qge3JldHVybiBfX3Bvc2l0aXZlX3NpZ25fO30KKyAgICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX25lZ2F0aXZlX3NpZ24oKSBjb25zdCB7cmV0dXJuIF9fbmVnYXRpdmVfc2lnbl87fQorICAgIHZpcnR1YWwgaW50ICAgICAgICAgZG9fZnJhY19kaWdpdHMoKSAgIGNvbnN0IHtyZXR1cm4gX19mcmFjX2RpZ2l0c187fQorICAgIHZpcnR1YWwgcGF0dGVybiAgICAgZG9fcG9zX2Zvcm1hdCgpICAgIGNvbnN0IHtyZXR1cm4gX19wb3NfZm9ybWF0Xzt9CisgICAgdmlydHVhbCBwYXR0ZXJuICAgICBkb19uZWdfZm9ybWF0KCkgICAgY29uc3Qge3JldHVybiBfX25lZ19mb3JtYXRfO30KKworcHJpdmF0ZToKKyAgICBjaGFyX3R5cGUgICBfX2RlY2ltYWxfcG9pbnRfOworICAgIGNoYXJfdHlwZSAgIF9fdGhvdXNhbmRzX3NlcF87CisgICAgc3RyaW5nICAgICAgX19ncm91cGluZ187CisgICAgc3RyaW5nX3R5cGUgX19jdXJyX3N5bWJvbF87CisgICAgc3RyaW5nX3R5cGUgX19wb3NpdGl2ZV9zaWduXzsKKyAgICBzdHJpbmdfdHlwZSBfX25lZ2F0aXZlX3NpZ25fOworICAgIGludCAgICAgICAgIF9fZnJhY19kaWdpdHNfOworICAgIHBhdHRlcm4gICAgIF9fcG9zX2Zvcm1hdF87CisgICAgcGF0dGVybiAgICAgX19uZWdfZm9ybWF0XzsKKworICAgIHZvaWQgaW5pdChjb25zdCBjaGFyKik7Cit9OworCit0ZW1wbGF0ZTw+IF9MSUJDUFBfRlVOQ19WSVMgdm9pZCBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCBmYWxzZT46OmluaXQoY29uc3QgY2hhciopOwordGVtcGxhdGU8PiBfTElCQ1BQX0ZVTkNfVklTIHZvaWQgbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgdHJ1ZT46OmluaXQoY29uc3QgY2hhciopOwordGVtcGxhdGU8PiBfTElCQ1BQX0ZVTkNfVklTIHZvaWQgbW9uZXlwdW5jdF9ieW5hbWU8d2NoYXJfdCwgZmFsc2U+Ojppbml0KGNvbnN0IGNoYXIqKTsKK3RlbXBsYXRlPD4gX0xJQkNQUF9GVU5DX1ZJUyB2b2lkIG1vbmV5cHVuY3RfYnluYW1lPHdjaGFyX3QsIHRydWU+Ojppbml0KGNvbnN0IGNoYXIqKTsKKworX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUyKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIG1vbmV5cHVuY3RfYnluYW1lPGNoYXIsIGZhbHNlPikKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFMihjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCB0cnVlPikKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFMihjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCBmYWxzZT4pCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURTIoY2xhc3MgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfVFlQRV9WSVMgbW9uZXlwdW5jdF9ieW5hbWU8d2NoYXJfdCwgdHJ1ZT4pCisKKy8vIG1vbmV5X2dldAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorY2xhc3MgX19tb25leV9nZXQKK3sKK3Byb3RlY3RlZDoKKyAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyX3R5cGU+IHN0cmluZ190eXBlOworCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIF9fbW9uZXlfZ2V0KCkge30KKworICAgIHN0YXRpYyB2b2lkIF9fZ2F0aGVyX2luZm8oYm9vbCBfX2ludGwsIGNvbnN0IGxvY2FsZSYgX19sb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25leV9iYXNlOjpwYXR0ZXJuJiBfX3BhdCwgY2hhcl90eXBlJiBfX2RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlJiBfX3RzLCBzdHJpbmcmIF9fZ3JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGUmIF9fc3ltLCBzdHJpbmdfdHlwZSYgX19wc24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZSYgX19uc24sIGludCYgX19mZCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordm9pZAorX19tb25leV9nZXQ8X0NoYXJUPjo6X19nYXRoZXJfaW5mbyhib29sIF9faW50bCwgY29uc3QgbG9jYWxlJiBfX2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uZXlfYmFzZTo6cGF0dGVybiYgX19wYXQsIGNoYXJfdHlwZSYgX19kcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlJiBfX3RzLCBzdHJpbmcmIF9fZ3JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZSYgX19zeW0sIHN0cmluZ190eXBlJiBfX3BzbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGUmIF9fbnNuLCBpbnQmIF9fZmQpCit7CisgICAgaWYgKF9faW50bCkKKyAgICB7CisgICAgICAgIGNvbnN0IG1vbmV5cHVuY3Q8Y2hhcl90eXBlLCB0cnVlPiYgX19tcCA9CisgICAgICAgICAgICB1c2VfZmFjZXQ8bW9uZXlwdW5jdDxjaGFyX3R5cGUsIHRydWU+ID4oX19sb2MpOworICAgICAgICBfX3BhdCA9IF9fbXAubmVnX2Zvcm1hdCgpOworICAgICAgICBfX25zbiA9IF9fbXAubmVnYXRpdmVfc2lnbigpOworICAgICAgICBfX3BzbiA9IF9fbXAucG9zaXRpdmVfc2lnbigpOworICAgICAgICBfX2RwID0gX19tcC5kZWNpbWFsX3BvaW50KCk7CisgICAgICAgIF9fdHMgPSBfX21wLnRob3VzYW5kc19zZXAoKTsKKyAgICAgICAgX19ncnAgPSBfX21wLmdyb3VwaW5nKCk7CisgICAgICAgIF9fc3ltID0gX19tcC5jdXJyX3N5bWJvbCgpOworICAgICAgICBfX2ZkID0gX19tcC5mcmFjX2RpZ2l0cygpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjb25zdCBtb25leXB1bmN0PGNoYXJfdHlwZSwgZmFsc2U+JiBfX21wID0KKyAgICAgICAgICAgIHVzZV9mYWNldDxtb25leXB1bmN0PGNoYXJfdHlwZSwgZmFsc2U+ID4oX19sb2MpOworICAgICAgICBfX3BhdCA9IF9fbXAubmVnX2Zvcm1hdCgpOworICAgICAgICBfX25zbiA9IF9fbXAubmVnYXRpdmVfc2lnbigpOworICAgICAgICBfX3BzbiA9IF9fbXAucG9zaXRpdmVfc2lnbigpOworICAgICAgICBfX2RwID0gX19tcC5kZWNpbWFsX3BvaW50KCk7CisgICAgICAgIF9fdHMgPSBfX21wLnRob3VzYW5kc19zZXAoKTsKKyAgICAgICAgX19ncnAgPSBfX21wLmdyb3VwaW5nKCk7CisgICAgICAgIF9fc3ltID0gX19tcC5jdXJyX3N5bWJvbCgpOworICAgICAgICBfX2ZkID0gX19tcC5mcmFjX2RpZ2l0cygpOworICAgIH0KK30KKworX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUyKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIF9fbW9uZXlfZ2V0PGNoYXI+KQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUyKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIF9fbW9uZXlfZ2V0PHdjaGFyX3Q+KQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvciA9IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBtb25leV9nZXQKKyAgICA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LAorICAgICAgcHJpdmF0ZSBfX21vbmV5X2dldDxfQ2hhclQ+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBfSW5wdXRJdGVyYXRvciAgICAgICAgICBpdGVyX3R5cGU7CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcl90eXBlPiBzdHJpbmdfdHlwZTsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGV4cGxpY2l0IG1vbmV5X2dldChzaXplX3QgX19yZWZzID0gMCkKKyAgICAgICAgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGl0ZXJfdHlwZSBnZXQoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyBkb3VibGUmIF9fdikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19nZXQoX19iLCBfX2UsIF9faW50bCwgX19pb2IsIF9fZXJyLCBfX3YpOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGl0ZXJfdHlwZSBnZXQoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2Vyciwgc3RyaW5nX3R5cGUmIF9fdikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBkb19nZXQoX19iLCBfX2UsIF9faW50bCwgX19pb2IsIF9fZXJyLCBfX3YpOworICAgIH0KKworICAgIHN0YXRpYyBsb2NhbGU6OmlkIGlkOworCitwcm90ZWN0ZWQ6CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICB+bW9uZXlfZ2V0KCkge30KKworICAgIHZpcnR1YWwgaXRlcl90eXBlIGRvX2dldChpdGVyX3R5cGUgX19iLCBpdGVyX3R5cGUgX19lLCBib29sIF9faW50bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9faW9iLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlJiBfX3YpIGNvbnN0OworICAgIHZpcnR1YWwgaXRlcl90eXBlIGRvX2dldChpdGVyX3R5cGUgX19iLCBpdGVyX3R5cGUgX19lLCBib29sIF9faW50bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9faW9iLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190eXBlJiBfX3YpIGNvbnN0OworCitwcml2YXRlOgorICAgIHN0YXRpYyBib29sIF9fZG9fZ2V0KGl0ZXJfdHlwZSYgX19iLCBpdGVyX3R5cGUgX19lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX19pbnRsLCBjb25zdCBsb2NhbGUmIF9fbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgX19uZWcsIGNvbnN0IGN0eXBlPGNoYXJfdHlwZT4mIF9fY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlX3B0cjxjaGFyX3R5cGUsIHZvaWQoKikodm9pZCopPiYgX193YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGUqJiBfX3duLCBjaGFyX3R5cGUqIF9fd2UpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcmF0b3I+Citsb2NhbGU6OmlkCittb25leV9nZXQ8X0NoYXJULCBfSW5wdXRJdGVyYXRvcj46OmlkOworCitfTElCQ1BQX0ZVTkNfVklTIHZvaWQgX19kb19ub3RoaW5nKHZvaWQqKTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSElEREVOCit2b2lkCitfX2RvdWJsZV9vcl9ub3RoaW5nKHVuaXF1ZV9wdHI8X1RwLCB2b2lkKCopKHZvaWQqKT4mIF9fYiwgX1RwKiYgX19uLCBfVHAqJiBfX2UpCit7CisgICAgYm9vbCBfX293bnMgPSBfX2IuZ2V0X2RlbGV0ZXIoKSAhPSBfX2RvX25vdGhpbmc7CisgICAgc2l6ZV90IF9fY3VyX2NhcCA9IHN0YXRpY19jYXN0PHNpemVfdD4oX19lLV9fYi5nZXQoKSkgKiBzaXplb2YoX1RwKTsKKyAgICBzaXplX3QgX19uZXdfY2FwID0gX19jdXJfY2FwIDwgbnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkgLyAyID8KKyAgICAgICAgICAgICAgICAgICAgICAgMiAqIF9fY3VyX2NhcCA6IG51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpOworICAgIGlmIChfX25ld19jYXAgPT0gMCkKKyAgICAgICAgX19uZXdfY2FwID0gc2l6ZW9mKF9UcCk7CisgICAgc2l6ZV90IF9fbl9vZmYgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fbiAtIF9fYi5nZXQoKSk7CisgICAgX1RwKiBfX3QgPSAoX1RwKilyZWFsbG9jKF9fb3ducyA/IF9fYi5nZXQoKSA6IDAsIF9fbmV3X2NhcCk7CisgICAgaWYgKF9fdCA9PSAwKQorICAgICAgICBfX3Rocm93X2JhZF9hbGxvYygpOworICAgIGlmIChfX293bnMpCisgICAgICAgIF9fYi5yZWxlYXNlKCk7CisgICAgX19iID0gdW5pcXVlX3B0cjxfVHAsIHZvaWQoKikodm9pZCopPihfX3QsIGZyZWUpOworICAgIF9fbmV3X2NhcCAvPSBzaXplb2YoX1RwKTsKKyAgICBfX24gPSBfX2IuZ2V0KCkgKyBfX25fb2ZmOworICAgIF9fZSA9IF9fYi5nZXQoKSArIF9fbmV3X2NhcDsKK30KKworLy8gdHJ1ZSA9PSBzdWNjZXNzCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2Jvb2wKK21vbmV5X2dldDxfQ2hhclQsIF9JbnB1dEl0ZXJhdG9yPjo6X19kb19nZXQoaXRlcl90eXBlJiBfX2IsIGl0ZXJfdHlwZSBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX19pbnRsLCBjb25zdCBsb2NhbGUmIF9fbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBfX25lZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3R5cGU8Y2hhcl90eXBlPiYgX19jdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlX3B0cjxjaGFyX3R5cGUsIHZvaWQoKikodm9pZCopPiYgX193YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlKiYgX193biwgY2hhcl90eXBlKiBfX3dlKQoreworICAgIGNvbnN0IHVuc2lnbmVkIF9fYnogPSAxMDA7CisgICAgdW5zaWduZWQgX19nYnVmW19fYnpdOworICAgIHVuaXF1ZV9wdHI8dW5zaWduZWQsIHZvaWQoKikodm9pZCopPiBfX2diKF9fZ2J1ZiwgX19kb19ub3RoaW5nKTsKKyAgICB1bnNpZ25lZCogX19nbiA9IF9fZ2IuZ2V0KCk7CisgICAgdW5zaWduZWQqIF9fZ2UgPSBfX2duICsgX19iejsKKyAgICBtb25leV9iYXNlOjpwYXR0ZXJuIF9fcGF0OworICAgIGNoYXJfdHlwZSBfX2RwOworICAgIGNoYXJfdHlwZSBfX3RzOworICAgIHN0cmluZyBfX2dycDsKKyAgICBzdHJpbmdfdHlwZSBfX3N5bTsKKyAgICBzdHJpbmdfdHlwZSBfX3BzbjsKKyAgICBzdHJpbmdfdHlwZSBfX25zbjsKKyAgICAvLyBDYXB0dXJlIHRoZSBzcGFjZXMgcmVhZCBpbnRvIG1vbmV5X2Jhc2U6OntzcGFjZSxub25lfSBzbyB0aGV5CisgICAgLy8gY2FuIGJlIGNvbXBhcmVkIHRvIGluaXRpYWwgc3BhY2VzIGluIF9fc3ltLgorICAgIHN0cmluZ190eXBlIF9fc3BhY2VzOworICAgIGludCBfX2ZkOworICAgIF9fbW9uZXlfZ2V0PF9DaGFyVD46Ol9fZ2F0aGVyX2luZm8oX19pbnRsLCBfX2xvYywgX19wYXQsIF9fZHAsIF9fdHMsIF9fZ3JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zeW0sIF9fcHNuLCBfX25zbiwgX19mZCk7CisgICAgY29uc3Qgc3RyaW5nX3R5cGUqIF9fdHJhaWxpbmdfc2lnbiA9IDA7CisgICAgX193biA9IF9fd2IuZ2V0KCk7CisgICAgZm9yICh1bnNpZ25lZCBfX3AgPSAwOyBfX3AgPCA0ICYmIF9fYiAhPSBfX2U7ICsrX19wKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChfX3BhdC5maWVsZFtfX3BdKQorICAgICAgICB7CisgICAgICAgIGNhc2UgbW9uZXlfYmFzZTo6c3BhY2U6CisgICAgICAgICAgICBpZiAoX19wICE9IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9fY3QuaXMoY3R5cGVfYmFzZTo6c3BhY2UsICpfX2IpKQorICAgICAgICAgICAgICAgICAgICBfX3NwYWNlcy5wdXNoX2JhY2soKl9fYisrKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9MSUJDUFBfRkFMTFRIUk9VR0goKTsKKyAgICAgICAgY2FzZSBtb25leV9iYXNlOjpub25lOgorICAgICAgICAgICAgaWYgKF9fcCAhPSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlIChfX2IgIT0gX19lICYmIF9fY3QuaXMoY3R5cGVfYmFzZTo6c3BhY2UsICpfX2IpKQorICAgICAgICAgICAgICAgICAgICBfX3NwYWNlcy5wdXNoX2JhY2soKl9fYisrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIG1vbmV5X2Jhc2U6OnNpZ246CisgICAgICAgICAgICBpZiAoX19wc24uc2l6ZSgpICsgX19uc24uc2l6ZSgpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX19wc24uc2l6ZSgpID09IDAgfHwgX19uc24uc2l6ZSgpID09IDApCisgICAgICAgICAgICAgICAgeyAgIC8vIHNpZ24gaXMgb3B0aW9uYWwKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fcHNuLnNpemUoKSA+IDApCisgICAgICAgICAgICAgICAgICAgIHsgICAvLyBfX25zbi5zaXplKCkgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpfX2IgPT0gX19wc25bMF0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytfX2I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fcHNuLnNpemUoKSA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdHJhaWxpbmdfc2lnbiA9ICZfX3BzbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25lZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKl9fYiA9PSBfX25zblswXSkgIC8vIF9fbnNuLnNpemUoKSA+IDAgJiYgIF9fcHNuLnNpemUoKSA9PSAwCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrX19iOworICAgICAgICAgICAgICAgICAgICAgICAgX19uZWcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fbnNuLnNpemUoKSA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190cmFpbGluZ19zaWduID0gJl9fbnNuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgIC8vIHNpZ24gaXMgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqX19iID09IF9fcHNuWzBdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICArK19fYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX3Bzbi5zaXplKCkgPiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdHJhaWxpbmdfc2lnbiA9ICZfX3BzbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgqX19iID09IF9fbnNuWzBdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICArK19fYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fbmVnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX25zbi5zaXplKCkgPiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdHJhaWxpbmdfc2lnbiA9ICZfX25zbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgbW9uZXlfYmFzZTo6c3ltYm9sOgorICAgICAgICAgICAgeworICAgICAgICAgICAgYm9vbCBfX21vcmVfbmVlZGVkID0gX190cmFpbGluZ19zaWduIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19wIDwgMikgICAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3AgPT0gMiAmJiBfX3BhdC5maWVsZFszXSAhPSBzdGF0aWNfY2FzdDxjaGFyPihtb25leV9iYXNlOjpub25lKSk7CisgICAgICAgICAgICBib29sIF9fc2IgPSAoX19mbGFncyAmIGlvc19iYXNlOjpzaG93YmFzZSkgIT0gMDsKKyAgICAgICAgICAgIGlmIChfX3NiIHx8IF9fbW9yZV9uZWVkZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RyaW5nX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIF9fc3ltX3NwYWNlX2VuZCA9IF9fc3ltLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaWYgKF9fcCA+IDAgJiYgKF9fcGF0LmZpZWxkW19fcCAtIDFdID09IG1vbmV5X2Jhc2U6Om5vbmUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wYXQuZmllbGRbX19wIC0gMV0gPT0gbW9uZXlfYmFzZTo6c3BhY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIHNwYWNlcyB3ZSd2ZSBhbHJlYWR5IHJlYWQgYWdhaW5zdCBzcGFjZXMgYXQKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJlZ2lubmluZyBvZiBfX3N5bS4KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKF9fc3ltX3NwYWNlX2VuZCAhPSBfX3N5bS5lbmQoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jdC5pcyhjdHlwZV9iYXNlOjpzcGFjZSwgKl9fc3ltX3NwYWNlX2VuZCkpCisgICAgICAgICAgICAgICAgICAgICAgICArK19fc3ltX3NwYWNlX2VuZDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IF9fbnVtX3NwYWNlcyA9IF9fc3ltX3NwYWNlX2VuZCAtIF9fc3ltLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX251bV9zcGFjZXMgPiBfX3NwYWNlcy5zaXplKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICFlcXVhbChfX3NwYWNlcy5lbmQoKSAtIF9fbnVtX3NwYWNlcywgX19zcGFjZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zeW0uYmVnaW4oKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG1hdGNoLiBQdXQgX19zeW1fc3BhY2VfZW5kIGJhY2sgYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWdpbm5pbmcgb2YgX19zeW0sIHdoaWNoIHdpbGwgcHJldmVudCBhCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCBpbiB0aGUgbmV4dCBsb29wLgorICAgICAgICAgICAgICAgICAgICAgICAgX19zeW1fc3BhY2VfZW5kID0gX19zeW0uYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdHJpbmdfdHlwZTo6Y29uc3RfaXRlcmF0b3IgX19zeW1fY3Vycl9jaGFyID0gX19zeW1fc3BhY2VfZW5kOworICAgICAgICAgICAgICAgIHdoaWxlIChfX3N5bV9jdXJyX2NoYXIgIT0gX19zeW0uZW5kKCkgJiYgX19iICE9IF9fZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAqX19iID09ICpfX3N5bV9jdXJyX2NoYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgKytfX2I7CisgICAgICAgICAgICAgICAgICAgICsrX19zeW1fY3Vycl9jaGFyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoX19zYiAmJiBfX3N5bV9jdXJyX2NoYXIgIT0gX19zeW0uZW5kKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIG1vbmV5X2Jhc2U6OnZhbHVlOgorICAgICAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgX19uZyA9IDA7CisgICAgICAgICAgICBmb3IgKDsgX19iICE9IF9fZTsgKytfX2IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhcl90eXBlIF9fYyA9ICpfX2I7CisgICAgICAgICAgICAgICAgaWYgKF9fY3QuaXMoY3R5cGVfYmFzZTo6ZGlnaXQsIF9fYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX193biA9PSBfX3dlKQorICAgICAgICAgICAgICAgICAgICAgICAgX19kb3VibGVfb3Jfbm90aGluZyhfX3diLCBfX3duLCBfX3dlKTsKKyAgICAgICAgICAgICAgICAgICAgKl9fd24rKyA9IF9fYzsKKyAgICAgICAgICAgICAgICAgICAgKytfX25nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChfX2dycC5zaXplKCkgPiAwICYmIF9fbmcgPiAwICYmIF9fYyA9PSBfX3RzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fZ24gPT0gX19nZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZG91YmxlX29yX25vdGhpbmcoX19nYiwgX19nbiwgX19nZSk7CisgICAgICAgICAgICAgICAgICAgICpfX2duKysgPSBfX25nOworICAgICAgICAgICAgICAgICAgICBfX25nID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfX2diLmdldCgpICE9IF9fZ24gJiYgX19uZyA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9fZ24gPT0gX19nZSkKKyAgICAgICAgICAgICAgICAgICAgX19kb3VibGVfb3Jfbm90aGluZyhfX2diLCBfX2duLCBfX2dlKTsKKyAgICAgICAgICAgICAgICAqX19nbisrID0gX19uZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfX2ZkID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX19iID09IF9fZSB8fCAqX19iICE9IF9fZHApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKCsrX19iOyBfX2ZkID4gMDsgLS1fX2ZkLCArK19fYikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2IgPT0gX19lIHx8ICFfX2N0LmlzKGN0eXBlX2Jhc2U6OmRpZ2l0LCAqX19iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fd24gPT0gX193ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZG91YmxlX29yX25vdGhpbmcoX193YiwgX193biwgX193ZSk7CisgICAgICAgICAgICAgICAgICAgICpfX3duKysgPSAqX19iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfX3duID09IF9fd2IuZ2V0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKF9fdHJhaWxpbmdfc2lnbikKKyAgICB7CisgICAgICAgIGZvciAodW5zaWduZWQgX19pID0gMTsgX19pIDwgX190cmFpbGluZ19zaWduLT5zaXplKCk7ICsrX19pLCArK19fYikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9fYiA9PSBfX2UgfHwgKl9fYiAhPSAoKl9fdHJhaWxpbmdfc2lnbilbX19pXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKF9fZ2IuZ2V0KCkgIT0gX19nbikKKyAgICB7CisgICAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXQgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgICAgX19jaGVja19ncm91cGluZyhfX2dycCwgX19nYi5nZXQoKSwgX19nbiwgX19ldCk7CisgICAgICAgIGlmIChfX2V0KQorICAgICAgICB7CisgICAgICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0lucHV0SXRlcmF0b3I+CitfSW5wdXRJdGVyYXRvcgorbW9uZXlfZ2V0PF9DaGFyVCwgX0lucHV0SXRlcmF0b3I+Ojpkb19nZXQoaXRlcl90eXBlIF9fYiwgaXRlcl90eXBlIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSYgX192KSBjb25zdAoreworICAgIGNvbnN0IGludCBfX2J6ID0gMTAwOworICAgIGNoYXJfdHlwZSBfX3didWZbX19iel07CisgICAgdW5pcXVlX3B0cjxjaGFyX3R5cGUsIHZvaWQoKikodm9pZCopPiBfX3diKF9fd2J1ZiwgX19kb19ub3RoaW5nKTsKKyAgICBjaGFyX3R5cGUqIF9fd247CisgICAgY2hhcl90eXBlKiBfX3dlID0gX193YnVmICsgX19iejsKKyAgICBsb2NhbGUgX19sb2MgPSBfX2lvYi5nZXRsb2MoKTsKKyAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0ID0gdXNlX2ZhY2V0PGN0eXBlPGNoYXJfdHlwZT4gPihfX2xvYyk7CisgICAgYm9vbCBfX25lZyA9IGZhbHNlOworICAgIGlmIChfX2RvX2dldChfX2IsIF9fZSwgX19pbnRsLCBfX2xvYywgX19pb2IuZmxhZ3MoKSwgX19lcnIsIF9fbmVnLCBfX2N0LAorICAgICAgICAgICAgICAgICBfX3diLCBfX3duLCBfX3dlKSkKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgX19zcmNbXSA9ICIwMTIzNDU2Nzg5IjsKKyAgICAgICAgY2hhcl90eXBlIF9fYXRvbXNbc2l6ZW9mKF9fc3JjKS0xXTsKKyAgICAgICAgX19jdC53aWRlbihfX3NyYywgX19zcmMgKyAoc2l6ZW9mKF9fc3JjKS0xKSwgX19hdG9tcyk7CisgICAgICAgIGNoYXIgX19uYnVmW19fYnpdOworICAgICAgICBjaGFyKiBfX25jID0gX19uYnVmOworICAgICAgICB1bmlxdWVfcHRyPGNoYXIsIHZvaWQoKikodm9pZCopPiBfX2goMCwgZnJlZSk7CisgICAgICAgIGlmIChfX3duIC0gX193Yi5nZXQoKSA+IF9fYnotMikKKyAgICAgICAgeworICAgICAgICAgICAgX19oLnJlc2V0KChjaGFyKiltYWxsb2Moc3RhdGljX2Nhc3Q8c2l6ZV90PihfX3duIC0gX193Yi5nZXQoKSArIDIpKSk7CisgICAgICAgICAgICBpZiAoX19oLmdldCgpID09IDApCisgICAgICAgICAgICAgICAgX190aHJvd19iYWRfYWxsb2MoKTsKKyAgICAgICAgICAgIF9fbmMgPSBfX2guZ2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fbmVnKQorICAgICAgICAgICAgKl9fbmMrKyA9ICctJzsKKyAgICAgICAgZm9yIChjb25zdCBjaGFyX3R5cGUqIF9fdyA9IF9fd2IuZ2V0KCk7IF9fdyA8IF9fd247ICsrX193LCArK19fbmMpCisgICAgICAgICAgICAqX19uYyA9IF9fc3JjW2ZpbmQoX19hdG9tcywgX1ZTVEQ6OmVuZChfX2F0b21zKSwgKl9fdykgLSBfX2F0b21zXTsKKyAgICAgICAgKl9fbmMgPSBjaGFyKCk7CisgICAgICAgIGlmIChzc2NhbmYoX19uYnVmLCAiJUxmIiwgJl9fdikgIT0gMSkKKyAgICAgICAgICAgIF9fdGhyb3dfcnVudGltZV9lcnJvcigibW9uZXlfZ2V0IGVycm9yIik7CisgICAgfQorICAgIGlmIChfX2IgPT0gX19lKQorICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgIHJldHVybiBfX2I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorX0lucHV0SXRlcmF0b3IKK21vbmV5X2dldDxfQ2hhclQsIF9JbnB1dEl0ZXJhdG9yPjo6ZG9fZ2V0KGl0ZXJfdHlwZSBfX2IsIGl0ZXJfdHlwZSBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGUmIF9fdikgY29uc3QKK3sKKyAgICBjb25zdCBpbnQgX19ieiA9IDEwMDsKKyAgICBjaGFyX3R5cGUgX193YnVmW19fYnpdOworICAgIHVuaXF1ZV9wdHI8Y2hhcl90eXBlLCB2b2lkKCopKHZvaWQqKT4gX193YihfX3didWYsIF9fZG9fbm90aGluZyk7CisgICAgY2hhcl90eXBlKiBfX3duOworICAgIGNoYXJfdHlwZSogX193ZSA9IF9fd2J1ZiArIF9fYno7CisgICAgbG9jYWxlIF9fbG9jID0gX19pb2IuZ2V0bG9jKCk7CisgICAgY29uc3QgY3R5cGU8Y2hhcl90eXBlPiYgX19jdCA9IHVzZV9mYWNldDxjdHlwZTxjaGFyX3R5cGU+ID4oX19sb2MpOworICAgIGJvb2wgX19uZWcgPSBmYWxzZTsKKyAgICBpZiAoX19kb19nZXQoX19iLCBfX2UsIF9faW50bCwgX19sb2MsIF9faW9iLmZsYWdzKCksIF9fZXJyLCBfX25lZywgX19jdCwKKyAgICAgICAgICAgICAgICAgX193YiwgX193biwgX193ZSkpCisgICAgeworICAgICAgICBfX3YuY2xlYXIoKTsKKyAgICAgICAgaWYgKF9fbmVnKQorICAgICAgICAgICAgX192LnB1c2hfYmFjayhfX2N0LndpZGVuKCctJykpOworICAgICAgICBjaGFyX3R5cGUgX196ID0gX19jdC53aWRlbignMCcpOworICAgICAgICBjaGFyX3R5cGUqIF9fdzsKKyAgICAgICAgZm9yIChfX3cgPSBfX3diLmdldCgpOyBfX3cgPCBfX3duLTE7ICsrX193KQorICAgICAgICAgICAgaWYgKCpfX3cgIT0gX196KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBfX3YuYXBwZW5kKF9fdywgX193bik7CisgICAgfQorICAgIGlmIChfX2IgPT0gX19lKQorICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgIHJldHVybiBfX2I7Cit9CisKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFMihjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBtb25leV9nZXQ8Y2hhcj4pCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURTIoY2xhc3MgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfVFlQRV9WSVMgbW9uZXlfZ2V0PHdjaGFyX3Q+KQorCisvLyBtb25leV9wdXQKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2NsYXNzIF9fbW9uZXlfcHV0Cit7Citwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcl90eXBlPiBzdHJpbmdfdHlwZTsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBfX21vbmV5X3B1dCgpIHt9CisKKyAgICBzdGF0aWMgdm9pZCBfX2dhdGhlcl9pbmZvKGJvb2wgX19pbnRsLCBib29sIF9fbmVnLCBjb25zdCBsb2NhbGUmIF9fbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uZXlfYmFzZTo6cGF0dGVybiYgX19wYXQsIGNoYXJfdHlwZSYgX19kcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZSYgX190cywgc3RyaW5nJiBfX2dycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190eXBlJiBfX3N5bSwgc3RyaW5nX3R5cGUmIF9fc24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIF9fZmQpOworICAgIHN0YXRpYyB2b2lkIF9fZm9ybWF0KGNoYXJfdHlwZSogX19tYiwgY2hhcl90eXBlKiYgX19taSwgY2hhcl90eXBlKiYgX19tZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyX3R5cGUqIF9fZGIsIGNvbnN0IGNoYXJfdHlwZSogX19kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0LCBib29sIF9fbmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vbmV5X2Jhc2U6OnBhdHRlcm4mIF9fcGF0LCBjaGFyX3R5cGUgX19kcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGUgX190cywgY29uc3Qgc3RyaW5nJiBfX2dycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19zeW0sIGNvbnN0IHN0cmluZ190eXBlJiBfX3NuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX2ZkKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+Cit2b2lkCitfX21vbmV5X3B1dDxfQ2hhclQ+OjpfX2dhdGhlcl9pbmZvKGJvb2wgX19pbnRsLCBib29sIF9fbmVnLCBjb25zdCBsb2NhbGUmIF9fbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25leV9iYXNlOjpwYXR0ZXJuJiBfX3BhdCwgY2hhcl90eXBlJiBfX2RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGUmIF9fdHMsIHN0cmluZyYgX19ncnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190eXBlJiBfX3N5bSwgc3RyaW5nX3R5cGUmIF9fc24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgX19mZCkKK3sKKyAgICBpZiAoX19pbnRsKQorICAgIHsKKyAgICAgICAgY29uc3QgbW9uZXlwdW5jdDxjaGFyX3R5cGUsIHRydWU+JiBfX21wID0KKyAgICAgICAgICAgIHVzZV9mYWNldDxtb25leXB1bmN0PGNoYXJfdHlwZSwgdHJ1ZT4gPihfX2xvYyk7CisgICAgICAgIGlmIChfX25lZykKKyAgICAgICAgeworICAgICAgICAgICAgX19wYXQgPSBfX21wLm5lZ19mb3JtYXQoKTsKKyAgICAgICAgICAgIF9fc24gPSBfX21wLm5lZ2F0aXZlX3NpZ24oKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fcGF0ID0gX19tcC5wb3NfZm9ybWF0KCk7CisgICAgICAgICAgICBfX3NuID0gX19tcC5wb3NpdGl2ZV9zaWduKCk7CisgICAgICAgIH0KKyAgICAgICAgX19kcCA9IF9fbXAuZGVjaW1hbF9wb2ludCgpOworICAgICAgICBfX3RzID0gX19tcC50aG91c2FuZHNfc2VwKCk7CisgICAgICAgIF9fZ3JwID0gX19tcC5ncm91cGluZygpOworICAgICAgICBfX3N5bSA9IF9fbXAuY3Vycl9zeW1ib2woKTsKKyAgICAgICAgX19mZCA9IF9fbXAuZnJhY19kaWdpdHMoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29uc3QgbW9uZXlwdW5jdDxjaGFyX3R5cGUsIGZhbHNlPiYgX19tcCA9CisgICAgICAgICAgICB1c2VfZmFjZXQ8bW9uZXlwdW5jdDxjaGFyX3R5cGUsIGZhbHNlPiA+KF9fbG9jKTsKKyAgICAgICAgaWYgKF9fbmVnKQorICAgICAgICB7CisgICAgICAgICAgICBfX3BhdCA9IF9fbXAubmVnX2Zvcm1hdCgpOworICAgICAgICAgICAgX19zbiA9IF9fbXAubmVnYXRpdmVfc2lnbigpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX19wYXQgPSBfX21wLnBvc19mb3JtYXQoKTsKKyAgICAgICAgICAgIF9fc24gPSBfX21wLnBvc2l0aXZlX3NpZ24oKTsKKyAgICAgICAgfQorICAgICAgICBfX2RwID0gX19tcC5kZWNpbWFsX3BvaW50KCk7CisgICAgICAgIF9fdHMgPSBfX21wLnRob3VzYW5kc19zZXAoKTsKKyAgICAgICAgX19ncnAgPSBfX21wLmdyb3VwaW5nKCk7CisgICAgICAgIF9fc3ltID0gX19tcC5jdXJyX3N5bWJvbCgpOworICAgICAgICBfX2ZkID0gX19tcC5mcmFjX2RpZ2l0cygpOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3ZvaWQKK19fbW9uZXlfcHV0PF9DaGFyVD46Ol9fZm9ybWF0KGNoYXJfdHlwZSogX19tYiwgY2hhcl90eXBlKiYgX19taSwgY2hhcl90eXBlKiYgX19tZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcl90eXBlKiBfX2RiLCBjb25zdCBjaGFyX3R5cGUqIF9fZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0LCBib29sIF9fbmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9uZXlfYmFzZTo6cGF0dGVybiYgX19wYXQsIGNoYXJfdHlwZSBfX2RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlIF9fdHMsIGNvbnN0IHN0cmluZyYgX19ncnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19zeW0sIGNvbnN0IHN0cmluZ190eXBlJiBfX3NuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9fZmQpCit7CisgICAgX19tZSA9IF9fbWI7CisgICAgZm9yICh1bnNpZ25lZCBfX3AgPSAwOyBfX3AgPCA0OyArK19fcCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoX19wYXQuZmllbGRbX19wXSkKKyAgICAgICAgeworICAgICAgICBjYXNlIG1vbmV5X2Jhc2U6Om5vbmU6CisgICAgICAgICAgICBfX21pID0gX19tZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIG1vbmV5X2Jhc2U6OnNwYWNlOgorICAgICAgICAgICAgX19taSA9IF9fbWU7CisgICAgICAgICAgICAqX19tZSsrID0gX19jdC53aWRlbignICcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgbW9uZXlfYmFzZTo6c2lnbjoKKyAgICAgICAgICAgIGlmICghX19zbi5lbXB0eSgpKQorICAgICAgICAgICAgICAgICpfX21lKysgPSBfX3NuWzBdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgbW9uZXlfYmFzZTo6c3ltYm9sOgorICAgICAgICAgICAgaWYgKCFfX3N5bS5lbXB0eSgpICYmIChfX2ZsYWdzICYgaW9zX2Jhc2U6OnNob3diYXNlKSkKKyAgICAgICAgICAgICAgICBfX21lID0gX1ZTVEQ6OmNvcHkoX19zeW0uYmVnaW4oKSwgX19zeW0uZW5kKCksIF9fbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgbW9uZXlfYmFzZTo6dmFsdWU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyByZW1lbWJlciBzdGFydCBvZiB2YWx1ZSBzbyB3ZSBjYW4gcmV2ZXJzZSBpdAorICAgICAgICAgICAgY2hhcl90eXBlKiBfX3QgPSBfX21lOworICAgICAgICAgICAgLy8gZmluZCBiZWdpbm5pbmcgb2YgZGlnaXRzCisgICAgICAgICAgICBpZiAoX19uZWcpCisgICAgICAgICAgICAgICAgKytfX2RiOworICAgICAgICAgICAgLy8gZmluZCBlbmQgb2YgZGlnaXRzCisgICAgICAgICAgICBjb25zdCBjaGFyX3R5cGUqIF9fZDsKKyAgICAgICAgICAgIGZvciAoX19kID0gX19kYjsgX19kIDwgX19kZTsgKytfX2QpCisgICAgICAgICAgICAgICAgaWYgKCFfX2N0LmlzKGN0eXBlX2Jhc2U6OmRpZ2l0LCAqX19kKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBwcmludCBmcmFjdGlvbmFsIHBhcnQKKyAgICAgICAgICAgIGlmIChfX2ZkID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgX19mOworICAgICAgICAgICAgICAgIGZvciAoX19mID0gX19mZDsgX19kID4gX19kYiAmJiBfX2YgPiAwOyAtLV9fZikKKyAgICAgICAgICAgICAgICAgICAgKl9fbWUrKyA9ICotLV9fZDsKKyAgICAgICAgICAgICAgICBjaGFyX3R5cGUgX196ID0gX19mID4gMCA/IF9fY3Qud2lkZW4oJzAnKSA6IGNoYXJfdHlwZSgpOworICAgICAgICAgICAgICAgIGZvciAoOyBfX2YgPiAwOyAtLV9fZikKKyAgICAgICAgICAgICAgICAgICAgKl9fbWUrKyA9IF9fejsKKyAgICAgICAgICAgICAgICAqX19tZSsrID0gX19kcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHByaW50IHVuaXRzIHBhcnQKKyAgICAgICAgICAgIGlmIChfX2QgPT0gX19kYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqX19tZSsrID0gX19jdC53aWRlbignMCcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9fbmcgPSAwOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9faWcgPSAwOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9fZ2wgPSBfX2dycC5lbXB0eSgpID8gbnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KF9fZ3JwW19faWddKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoX19kICE9IF9fZGIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX19uZyA9PSBfX2dsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqX19tZSsrID0gX190czsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fbmcgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrX19pZyA8IF9fZ3JwLnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dsID0gX19ncnBbX19pZ10gPT0gbnVtZXJpY19saW1pdHM8Y2hhcj46Om1heCgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oX19ncnBbX19pZ10pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICpfX21lKysgPSAqLS1fX2Q7CisgICAgICAgICAgICAgICAgICAgICsrX19uZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyByZXZlcnNlIGl0CisgICAgICAgICAgICByZXZlcnNlKF9fdCwgX19tZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBwcmludCByZXN0IG9mIHNpZ24sIGlmIGFueQorICAgIGlmIChfX3NuLnNpemUoKSA+IDEpCisgICAgICAgIF9fbWUgPSBfVlNURDo6Y29weShfX3NuLmJlZ2luKCkrMSwgX19zbi5lbmQoKSwgX19tZSk7CisgICAgLy8gc2V0IGFsaWdubWVudAorICAgIGlmICgoX19mbGFncyAmIGlvc19iYXNlOjphZGp1c3RmaWVsZCkgPT0gaW9zX2Jhc2U6OmxlZnQpCisgICAgICAgIF9fbWkgPSBfX21lOworICAgIGVsc2UgaWYgKChfX2ZsYWdzICYgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKSAhPSBpb3NfYmFzZTo6aW50ZXJuYWwpCisgICAgICAgIF9fbWkgPSBfX21iOworfQorCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURTIoY2xhc3MgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfVFlQRV9WSVMgX19tb25leV9wdXQ8Y2hhcj4pCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURTIoY2xhc3MgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfVFlQRV9WSVMgX19tb25leV9wdXQ8d2NoYXJfdD4pCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyYXRvciA9IG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBtb25leV9wdXQKKyAgICA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LAorICAgICAgcHJpdmF0ZSBfX21vbmV5X3B1dDxfQ2hhclQ+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBfT3V0cHV0SXRlcmF0b3IgICAgICAgICBpdGVyX3R5cGU7CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcl90eXBlPiBzdHJpbmdfdHlwZTsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGV4cGxpY2l0IG1vbmV5X3B1dChzaXplX3QgX19yZWZzID0gMCkKKyAgICAgICAgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvYiwgY2hhcl90eXBlIF9fZmwsCisgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSBfX3VuaXRzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX3B1dChfX3MsIF9faW50bCwgX19pb2IsIF9fZmwsIF9fdW5pdHMpOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGl0ZXJfdHlwZSBwdXQoaXRlcl90eXBlIF9fcywgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvYiwgY2hhcl90eXBlIF9fZmwsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fcHV0KF9fcywgX19pbnRsLCBfX2lvYiwgX19mbCwgX19kaWdpdHMpOworICAgIH0KKworICAgIHN0YXRpYyBsb2NhbGU6OmlkIGlkOworCitwcm90ZWN0ZWQ6CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgfm1vbmV5X3B1dCgpIHt9CisKKyAgICB2aXJ0dWFsIGl0ZXJfdHlwZSBkb19wdXQoaXRlcl90eXBlIF9fcywgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlIF9fZmwsIGxvbmcgZG91YmxlIF9fdW5pdHMpIGNvbnN0OworICAgIHZpcnR1YWwgaXRlcl90eXBlIGRvX3B1dChpdGVyX3R5cGUgX19zLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGUgX19mbCwgY29uc3Qgc3RyaW5nX3R5cGUmIF9fZGlnaXRzKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK2xvY2FsZTo6aWQKK21vbmV5X3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyYXRvcj46OmlkOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitfT3V0cHV0SXRlcmF0b3IKK21vbmV5X3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyYXRvcj46OmRvX3B1dChpdGVyX3R5cGUgX19zLCBib29sIF9faW50bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgX19pb2IsIGNoYXJfdHlwZSBfX2ZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlIF9fdW5pdHMpIGNvbnN0Cit7CisgICAgLy8gY29udmVydCB0byBjaGFyCisgICAgY29uc3Qgc2l6ZV90IF9fYnMgPSAxMDA7CisgICAgY2hhciBfX2J1ZltfX2JzXTsKKyAgICBjaGFyKiBfX2JiID0gX19idWY7CisgICAgY2hhcl90eXBlIF9fZGlnaXRzW19fYnNdOworICAgIGNoYXJfdHlwZSogX19kYiA9IF9fZGlnaXRzOworICAgIHNpemVfdCBfX24gPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHNucHJpbnRmKF9fYmIsIF9fYnMsICIlLjBMZiIsIF9fdW5pdHMpKTsKKyAgICB1bmlxdWVfcHRyPGNoYXIsIHZvaWQoKikodm9pZCopPiBfX2huKDAsIGZyZWUpOworICAgIHVuaXF1ZV9wdHI8Y2hhcl90eXBlLCB2b2lkKCopKHZvaWQqKT4gX19oZCgwLCBmcmVlKTsKKyAgICAvLyBzZWN1cmUgbWVtb3J5IGZvciBkaWdpdCBzdG9yYWdlCisgICAgaWYgKF9fbiA+IF9fYnMtMSkKKyAgICB7CisgICAgICAgIF9fbiA9IHN0YXRpY19jYXN0PHNpemVfdD4oX19saWJjcHBfYXNwcmludGZfbCgmX19iYiwgX0xJQkNQUF9HRVRfQ19MT0NBTEUsICIlLjBMZiIsIF9fdW5pdHMpKTsKKyAgICAgICAgaWYgKF9fYmIgPT0gMCkKKyAgICAgICAgICAgIF9fdGhyb3dfYmFkX2FsbG9jKCk7CisgICAgICAgIF9faG4ucmVzZXQoX19iYik7CisgICAgICAgIF9faGQucmVzZXQoKGNoYXJfdHlwZSopbWFsbG9jKF9fbiAqIHNpemVvZihjaGFyX3R5cGUpKSk7CisgICAgICAgIGlmIChfX2hkID09IG51bGxwdHIpCisgICAgICAgICAgICBfX3Rocm93X2JhZF9hbGxvYygpOworICAgICAgICBfX2RiID0gX19oZC5nZXQoKTsKKyAgICB9CisgICAgLy8gZ2F0aGVyIGluZm8KKyAgICBsb2NhbGUgX19sb2MgPSBfX2lvYi5nZXRsb2MoKTsKKyAgICBjb25zdCBjdHlwZTxjaGFyX3R5cGU+JiBfX2N0ID0gdXNlX2ZhY2V0PGN0eXBlPGNoYXJfdHlwZT4gPihfX2xvYyk7CisgICAgX19jdC53aWRlbihfX2JiLCBfX2JiICsgX19uLCBfX2RiKTsKKyAgICBib29sIF9fbmVnID0gX19uID4gMCAmJiBfX2JiWzBdID09ICctJzsKKyAgICBtb25leV9iYXNlOjpwYXR0ZXJuIF9fcGF0OworICAgIGNoYXJfdHlwZSBfX2RwOworICAgIGNoYXJfdHlwZSBfX3RzOworICAgIHN0cmluZyBfX2dycDsKKyAgICBzdHJpbmdfdHlwZSBfX3N5bTsKKyAgICBzdHJpbmdfdHlwZSBfX3NuOworICAgIGludCBfX2ZkOworICAgIHRoaXMtPl9fZ2F0aGVyX2luZm8oX19pbnRsLCBfX25lZywgX19sb2MsIF9fcGF0LCBfX2RwLCBfX3RzLCBfX2dycCwgX19zeW0sIF9fc24sIF9fZmQpOworICAgIC8vIHNlY3VyZSBtZW1vcnkgZm9yIGZvcm1hdHRpbmcKKyAgICBjaGFyX3R5cGUgX19tYnVmW19fYnNdOworICAgIGNoYXJfdHlwZSogX19tYiA9IF9fbWJ1ZjsKKyAgICB1bmlxdWVfcHRyPGNoYXJfdHlwZSwgdm9pZCgqKSh2b2lkKik+IF9faHcoMCwgZnJlZSk7CisgICAgc2l6ZV90IF9fZXhuID0gc3RhdGljX2Nhc3Q8aW50PihfX24pID4gX19mZCA/CisgICAgICAgICAgICAgICAgICAgKF9fbiAtIHN0YXRpY19jYXN0PHNpemVfdD4oX19mZCkpICogMiArIF9fc24uc2l6ZSgpICsKKyAgICAgICAgICAgICAgICAgICAgX19zeW0uc2l6ZSgpICsgc3RhdGljX2Nhc3Q8c2l6ZV90PihfX2ZkKSArIDEKKyAgICAgICAgICAgICAgICAgOiBfX3NuLnNpemUoKSArIF9fc3ltLnNpemUoKSArIHN0YXRpY19jYXN0PHNpemVfdD4oX19mZCkgKyAyOworICAgIGlmIChfX2V4biA+IF9fYnMpCisgICAgeworICAgICAgICBfX2h3LnJlc2V0KChjaGFyX3R5cGUqKW1hbGxvYyhfX2V4biAqIHNpemVvZihjaGFyX3R5cGUpKSk7CisgICAgICAgIF9fbWIgPSBfX2h3LmdldCgpOworICAgICAgICBpZiAoX19tYiA9PSAwKQorICAgICAgICAgICAgX190aHJvd19iYWRfYWxsb2MoKTsKKyAgICB9CisgICAgLy8gZm9ybWF0CisgICAgY2hhcl90eXBlKiBfX21pOworICAgIGNoYXJfdHlwZSogX19tZTsKKyAgICB0aGlzLT5fX2Zvcm1hdChfX21iLCBfX21pLCBfX21lLCBfX2lvYi5mbGFncygpLAorICAgICAgICAgICAgICAgICAgIF9fZGIsIF9fZGIgKyBfX24sIF9fY3QsCisgICAgICAgICAgICAgICAgICAgX19uZWcsIF9fcGF0LCBfX2RwLCBfX3RzLCBfX2dycCwgX19zeW0sIF9fc24sIF9fZmQpOworICAgIHJldHVybiBfX3BhZF9hbmRfb3V0cHV0KF9fcywgX19tYiwgX19taSwgX19tZSwgX19pb2IsIF9fZmwpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitfT3V0cHV0SXRlcmF0b3IKK21vbmV5X3B1dDxfQ2hhclQsIF9PdXRwdXRJdGVyYXRvcj46OmRvX3B1dChpdGVyX3R5cGUgX19zLCBib29sIF9faW50bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgX19pb2IsIGNoYXJfdHlwZSBfX2ZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZ190eXBlJiBfX2RpZ2l0cykgY29uc3QKK3sKKyAgICAvLyBnYXRoZXIgaW5mbworICAgIGxvY2FsZSBfX2xvYyA9IF9faW9iLmdldGxvYygpOworICAgIGNvbnN0IGN0eXBlPGNoYXJfdHlwZT4mIF9fY3QgPSB1c2VfZmFjZXQ8Y3R5cGU8Y2hhcl90eXBlPiA+KF9fbG9jKTsKKyAgICBib29sIF9fbmVnID0gX19kaWdpdHMuc2l6ZSgpID4gMCAmJiBfX2RpZ2l0c1swXSA9PSBfX2N0LndpZGVuKCctJyk7CisgICAgbW9uZXlfYmFzZTo6cGF0dGVybiBfX3BhdDsKKyAgICBjaGFyX3R5cGUgX19kcDsKKyAgICBjaGFyX3R5cGUgX190czsKKyAgICBzdHJpbmcgX19ncnA7CisgICAgc3RyaW5nX3R5cGUgX19zeW07CisgICAgc3RyaW5nX3R5cGUgX19zbjsKKyAgICBpbnQgX19mZDsKKyAgICB0aGlzLT5fX2dhdGhlcl9pbmZvKF9faW50bCwgX19uZWcsIF9fbG9jLCBfX3BhdCwgX19kcCwgX190cywgX19ncnAsIF9fc3ltLCBfX3NuLCBfX2ZkKTsKKyAgICAvLyBzZWN1cmUgbWVtb3J5IGZvciBmb3JtYXR0aW5nCisgICAgY2hhcl90eXBlIF9fbWJ1ZlsxMDBdOworICAgIGNoYXJfdHlwZSogX19tYiA9IF9fbWJ1ZjsKKyAgICB1bmlxdWVfcHRyPGNoYXJfdHlwZSwgdm9pZCgqKSh2b2lkKik+IF9faCgwLCBmcmVlKTsKKyAgICBzaXplX3QgX19leG4gPSBzdGF0aWNfY2FzdDxpbnQ+KF9fZGlnaXRzLnNpemUoKSkgPiBfX2ZkID8KKyAgICAgICAgICAgICAgICAgICAoX19kaWdpdHMuc2l6ZSgpIC0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX2ZkKSkgKiAyICsKKyAgICAgICAgICAgICAgICAgICAgX19zbi5zaXplKCkgKyBfX3N5bS5zaXplKCkgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fZmQpICsgMQorICAgICAgICAgICAgICAgICA6IF9fc24uc2l6ZSgpICsgX19zeW0uc2l6ZSgpICsgc3RhdGljX2Nhc3Q8c2l6ZV90PihfX2ZkKSArIDI7CisgICAgaWYgKF9fZXhuID4gMTAwKQorICAgIHsKKyAgICAgICAgX19oLnJlc2V0KChjaGFyX3R5cGUqKW1hbGxvYyhfX2V4biAqIHNpemVvZihjaGFyX3R5cGUpKSk7CisgICAgICAgIF9fbWIgPSBfX2guZ2V0KCk7CisgICAgICAgIGlmIChfX21iID09IDApCisgICAgICAgICAgICBfX3Rocm93X2JhZF9hbGxvYygpOworICAgIH0KKyAgICAvLyBmb3JtYXQKKyAgICBjaGFyX3R5cGUqIF9fbWk7CisgICAgY2hhcl90eXBlKiBfX21lOworICAgIHRoaXMtPl9fZm9ybWF0KF9fbWIsIF9fbWksIF9fbWUsIF9faW9iLmZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgX19kaWdpdHMuZGF0YSgpLCBfX2RpZ2l0cy5kYXRhKCkgKyBfX2RpZ2l0cy5zaXplKCksIF9fY3QsCisgICAgICAgICAgICAgICAgICAgX19uZWcsIF9fcGF0LCBfX2RwLCBfX3RzLCBfX2dycCwgX19zeW0sIF9fc24sIF9fZmQpOworICAgIHJldHVybiBfX3BhZF9hbmRfb3V0cHV0KF9fcywgX19tYiwgX19taSwgX19tZSwgX19pb2IsIF9fZmwpOworfQorCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURTIoY2xhc3MgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfVFlQRV9WSVMgbW9uZXlfcHV0PGNoYXI+KQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUyKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIG1vbmV5X3B1dDx3Y2hhcl90PikKKworLy8gbWVzc2FnZXMKKworY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBtZXNzYWdlc19iYXNlCit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBwdHJkaWZmX3QgY2F0YWxvZzsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBtZXNzYWdlc19iYXNlKCkge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBtZXNzYWdlcworICAgIDogcHVibGljIGxvY2FsZTo6ZmFjZXQsCisgICAgICBwdWJsaWMgbWVzc2FnZXNfYmFzZQoreworcHVibGljOgorICAgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVD4gc3RyaW5nX3R5cGU7CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBleHBsaWNpdCBtZXNzYWdlcyhzaXplX3QgX19yZWZzID0gMCkKKyAgICAgICAgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykge30KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGNhdGFsb2cgb3Blbihjb25zdCBiYXNpY19zdHJpbmc8Y2hhcj4mIF9fbm0sIGNvbnN0IGxvY2FsZSYgX19sb2MpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZG9fb3BlbihfX25tLCBfX2xvYyk7CisgICAgfQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgc3RyaW5nX3R5cGUgZ2V0KGNhdGFsb2cgX19jLCBpbnQgX19zZXQsIGludCBfX21zZ2lkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19kZmx0KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRvX2dldChfX2MsIF9fc2V0LCBfX21zZ2lkLCBfX2RmbHQpOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIHZvaWQgY2xvc2UoY2F0YWxvZyBfX2MpIGNvbnN0CisgICAgeworICAgICAgICBkb19jbG9zZShfX2MpOworICAgIH0KKworICAgIHN0YXRpYyBsb2NhbGU6OmlkIGlkOworCitwcm90ZWN0ZWQ6CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgfm1lc3NhZ2VzKCkge30KKworICAgIHZpcnR1YWwgY2F0YWxvZyBkb19vcGVuKGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyPiYsIGNvbnN0IGxvY2FsZSYpIGNvbnN0OworICAgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fZ2V0KGNhdGFsb2csIGludCBfX3NldCwgaW50IF9fbXNnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nX3R5cGUmIF9fZGZsdCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGRvX2Nsb3NlKGNhdGFsb2cpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2xvY2FsZTo6aWQKK21lc3NhZ2VzPF9DaGFyVD46OmlkOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordHlwZW5hbWUgbWVzc2FnZXM8X0NoYXJUPjo6Y2F0YWxvZworbWVzc2FnZXM8X0NoYXJUPjo6ZG9fb3Blbihjb25zdCBiYXNpY19zdHJpbmc8Y2hhcj4mIF9fbm0sIGNvbnN0IGxvY2FsZSYpIGNvbnN0Cit7CisjaWZkZWYgX0xJQkNQUF9IQVNfQ0FUT1BFTgorICAgIGNhdGFsb2cgX19jYXQgPSAoY2F0YWxvZyljYXRvcGVuKF9fbm0uY19zdHIoKSwgTkxfQ0FUX0xPQ0FMRSk7CisgICAgaWYgKF9fY2F0ICE9IC0xKQorICAgICAgICBfX2NhdCA9IHN0YXRpY19jYXN0PGNhdGFsb2c+KChzdGF0aWNfY2FzdDxzaXplX3Q+KF9fY2F0KSA+PiAxKSk7CisgICAgcmV0dXJuIF9fY2F0OworI2Vsc2UgLy8gIV9MSUJDUFBfSEFTX0NBVE9QRU4KKyAgICByZXR1cm4gLTE7CisjZW5kaWYgLy8gX0xJQkNQUF9IQVNfQ0FUT1BFTgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordHlwZW5hbWUgbWVzc2FnZXM8X0NoYXJUPjo6c3RyaW5nX3R5cGUKK21lc3NhZ2VzPF9DaGFyVD46OmRvX2dldChjYXRhbG9nIF9fYywgaW50IF9fc2V0LCBpbnQgX19tc2dpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19kZmx0KSBjb25zdAoreworI2lmZGVmIF9MSUJDUFBfSEFTX0NBVE9QRU4KKyAgICBzdHJpbmcgX19uZGZsdDsKKyAgICBfX25hcnJvd190b191dGY4PHNpemVvZihjaGFyX3R5cGUpKl9fQ0hBUl9CSVRfXz4oKShiYWNrX2luc2VydGVyKF9fbmRmbHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZGZsdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZGZsdC5jX3N0cigpICsgX19kZmx0LnNpemUoKSk7CisgICAgaWYgKF9fYyAhPSAtMSkKKyAgICAgICAgX19jIDw8PSAxOworICAgIG5sX2NhdGQgX19jYXQgPSAobmxfY2F0ZClfX2M7CisgICAgY2hhciogX19uID0gY2F0Z2V0cyhfX2NhdCwgX19zZXQsIF9fbXNnaWQsIF9fbmRmbHQuY19zdHIoKSk7CisgICAgc3RyaW5nX3R5cGUgX193OworICAgIF9fd2lkZW5fZnJvbV91dGY4PHNpemVvZihjaGFyX3R5cGUpKl9fQ0hBUl9CSVRfXz4oKShiYWNrX2luc2VydGVyKF9fdyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbiwgX19uICsgc3RybGVuKF9fbikpOworICAgIHJldHVybiBfX3c7CisjZWxzZSAvLyAhX0xJQkNQUF9IQVNfQ0FUT1BFTgorICAgIHJldHVybiBfX2RmbHQ7CisjZW5kaWYgLy8gX0xJQkNQUF9IQVNfQ0FUT1BFTgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordm9pZAorbWVzc2FnZXM8X0NoYXJUPjo6ZG9fY2xvc2UoY2F0YWxvZyBfX2MpIGNvbnN0Cit7CisjaWZkZWYgX0xJQkNQUF9IQVNfQ0FUT1BFTgorICAgIGlmIChfX2MgIT0gLTEpCisgICAgICAgIF9fYyA8PD0gMTsKKyAgICBubF9jYXRkIF9fY2F0ID0gKG5sX2NhdGQpX19jOworICAgIGNhdGNsb3NlKF9fY2F0KTsKKyNlbmRpZiAvLyBfTElCQ1BQX0hBU19DQVRPUEVOCit9CisKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFMihjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBtZXNzYWdlczxjaGFyPikKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFMihjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBtZXNzYWdlczx3Y2hhcl90PikKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIG1lc3NhZ2VzX2J5bmFtZQorICAgIDogcHVibGljIG1lc3NhZ2VzPF9DaGFyVD4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIG1lc3NhZ2VzX2Jhc2U6OmNhdGFsb2cgY2F0YWxvZzsKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQ+IHN0cmluZ190eXBlOworCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgZXhwbGljaXQgbWVzc2FnZXNfYnluYW1lKGNvbnN0IGNoYXIqLCBzaXplX3QgX19yZWZzID0gMCkKKyAgICAgICAgOiBtZXNzYWdlczxfQ2hhclQ+KF9fcmVmcykge30KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGV4cGxpY2l0IG1lc3NhZ2VzX2J5bmFtZShjb25zdCBzdHJpbmcmLCBzaXplX3QgX19yZWZzID0gMCkKKyAgICAgICAgOiBtZXNzYWdlczxfQ2hhclQ+KF9fcmVmcykge30KKworcHJvdGVjdGVkOgorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIH5tZXNzYWdlc19ieW5hbWUoKSB7fQorfTsKKworX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUyKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIG1lc3NhZ2VzX2J5bmFtZTxjaGFyPikKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFMihjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBtZXNzYWdlc19ieW5hbWU8d2NoYXJfdD4pCisKK3RlbXBsYXRlPGNsYXNzIF9Db2RlY3Z0LCBjbGFzcyBfRWxlbSA9IHdjaGFyX3QsCisgICAgICAgICBjbGFzcyBfV2lkZV9hbGxvYyA9IGFsbG9jYXRvcjxfRWxlbT4sCisgICAgICAgICBjbGFzcyBfQnl0ZV9hbGxvYyA9IGFsbG9jYXRvcjxjaGFyPiA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB3c3RyaW5nX2NvbnZlcnQKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgX0J5dGVfYWxsb2M+ICAgYnl0ZV9zdHJpbmc7CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0VsZW0sIGNoYXJfdHJhaXRzPF9FbGVtPiwgX1dpZGVfYWxsb2M+IHdpZGVfc3RyaW5nOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NvZGVjdnQ6OnN0YXRlX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgd2lkZV9zdHJpbmc6OnRyYWl0c190eXBlOjppbnRfdHlwZSAgICAgICAgICBpbnRfdHlwZTsKKworcHJpdmF0ZToKKyAgICBieXRlX3N0cmluZyBfX2J5dGVfZXJyX3N0cmluZ187CisgICAgd2lkZV9zdHJpbmcgX193aWRlX2Vycl9zdHJpbmdfOworICAgIF9Db2RlY3Z0KiBfX2N2dHB0cl87CisgICAgc3RhdGVfdHlwZSBfX2N2dHN0YXRlXzsKKyAgICBzaXplX3QgX19jdnRjb3VudF87CisKKyAgICB3c3RyaW5nX2NvbnZlcnQoY29uc3Qgd3N0cmluZ19jb252ZXJ0JiBfX3djKTsKKyAgICB3c3RyaW5nX2NvbnZlcnQmIG9wZXJhdG9yPShjb25zdCB3c3RyaW5nX2NvbnZlcnQmIF9fd2MpOworcHVibGljOgorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIF9MSUJDUFBfRVhQTElDSVRfQUZURVJfQ1hYMTEgd3N0cmluZ19jb252ZXJ0KF9Db2RlY3Z0KiBfX3BjdnQgPSBuZXcgX0NvZGVjdnQpOworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIHdzdHJpbmdfY29udmVydChfQ29kZWN2dCogX19wY3Z0LCBzdGF0ZV90eXBlIF9fc3RhdGUpOworICAgIF9MSUJDUFBfRVhQTElDSVRfQUZURVJfQ1hYMTEgd3N0cmluZ19jb252ZXJ0KGNvbnN0IGJ5dGVfc3RyaW5nJiBfX2J5dGVfZXJyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB3aWRlX3N0cmluZyYgX193aWRlX2VyciA9IHdpZGVfc3RyaW5nKCkpOworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICB3c3RyaW5nX2NvbnZlcnQod3N0cmluZ19jb252ZXJ0JiYgX193Yyk7CisjZW5kaWYKKyAgICB+d3N0cmluZ19jb252ZXJ0KCk7CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICB3aWRlX3N0cmluZyBmcm9tX2J5dGVzKGNoYXIgX19ieXRlKQorICAgICAgICB7cmV0dXJuIGZyb21fYnl0ZXMoJl9fYnl0ZSwgJl9fYnl0ZSsxKTt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgd2lkZV9zdHJpbmcgZnJvbV9ieXRlcyhjb25zdCBjaGFyKiBfX3B0cikKKyAgICAgICAge3JldHVybiBmcm9tX2J5dGVzKF9fcHRyLCBfX3B0ciArIGNoYXJfdHJhaXRzPGNoYXI+OjpsZW5ndGgoX19wdHIpKTt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgd2lkZV9zdHJpbmcgZnJvbV9ieXRlcyhjb25zdCBieXRlX3N0cmluZyYgX19zdHIpCisgICAgICAgIHtyZXR1cm4gZnJvbV9ieXRlcyhfX3N0ci5kYXRhKCksIF9fc3RyLmRhdGEoKSArIF9fc3RyLnNpemUoKSk7fQorICAgIHdpZGVfc3RyaW5nIGZyb21fYnl0ZXMoY29uc3QgY2hhciogX19maXJzdCwgY29uc3QgY2hhciogX19sYXN0KTsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGJ5dGVfc3RyaW5nIHRvX2J5dGVzKF9FbGVtIF9fd2NoYXIpCisgICAgICAgIHtyZXR1cm4gdG9fYnl0ZXMoJl9fd2NoYXIsICZfX3djaGFyKzEpO30KKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBieXRlX3N0cmluZyB0b19ieXRlcyhjb25zdCBfRWxlbSogX193cHRyKQorICAgICAgICB7cmV0dXJuIHRvX2J5dGVzKF9fd3B0ciwgX193cHRyICsgY2hhcl90cmFpdHM8X0VsZW0+OjpsZW5ndGgoX193cHRyKSk7fQorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGJ5dGVfc3RyaW5nIHRvX2J5dGVzKGNvbnN0IHdpZGVfc3RyaW5nJiBfX3dzdHIpCisgICAgICAgIHtyZXR1cm4gdG9fYnl0ZXMoX193c3RyLmRhdGEoKSwgX193c3RyLmRhdGEoKSArIF9fd3N0ci5zaXplKCkpO30KKyAgICBieXRlX3N0cmluZyB0b19ieXRlcyhjb25zdCBfRWxlbSogX19maXJzdCwgY29uc3QgX0VsZW0qIF9fbGFzdCk7CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBzaXplX3QgY29udmVydGVkKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX19jdnRjb3VudF87fQorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIHN0YXRlX3R5cGUgc3RhdGUoKSBjb25zdCB7cmV0dXJuIF9fY3Z0c3RhdGVfO30KK307CisKK3RlbXBsYXRlPGNsYXNzIF9Db2RlY3Z0LCBjbGFzcyBfRWxlbSwgY2xhc3MgX1dpZGVfYWxsb2MsIGNsYXNzIF9CeXRlX2FsbG9jPgoraW5saW5lCit3c3RyaW5nX2NvbnZlcnQ8X0NvZGVjdnQsIF9FbGVtLCBfV2lkZV9hbGxvYywgX0J5dGVfYWxsb2M+OjoKKyAgICB3c3RyaW5nX2NvbnZlcnQoX0NvZGVjdnQqIF9fcGN2dCkKKyAgICAgICAgOiBfX2N2dHB0cl8oX19wY3Z0KSwgX19jdnRzdGF0ZV8oKSwgX19jdnRjb3VudF8oMCkKK3sKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NvZGVjdnQsIGNsYXNzIF9FbGVtLCBjbGFzcyBfV2lkZV9hbGxvYywgY2xhc3MgX0J5dGVfYWxsb2M+CitpbmxpbmUKK3dzdHJpbmdfY29udmVydDxfQ29kZWN2dCwgX0VsZW0sIF9XaWRlX2FsbG9jLCBfQnl0ZV9hbGxvYz46OgorICAgIHdzdHJpbmdfY29udmVydChfQ29kZWN2dCogX19wY3Z0LCBzdGF0ZV90eXBlIF9fc3RhdGUpCisgICAgICAgIDogX19jdnRwdHJfKF9fcGN2dCksIF9fY3Z0c3RhdGVfKF9fc3RhdGUpLCBfX2N2dGNvdW50XygwKQoreworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ29kZWN2dCwgY2xhc3MgX0VsZW0sIGNsYXNzIF9XaWRlX2FsbG9jLCBjbGFzcyBfQnl0ZV9hbGxvYz4KK3dzdHJpbmdfY29udmVydDxfQ29kZWN2dCwgX0VsZW0sIF9XaWRlX2FsbG9jLCBfQnl0ZV9hbGxvYz46OgorICAgIHdzdHJpbmdfY29udmVydChjb25zdCBieXRlX3N0cmluZyYgX19ieXRlX2VyciwgY29uc3Qgd2lkZV9zdHJpbmcmIF9fd2lkZV9lcnIpCisgICAgICAgIDogX19ieXRlX2Vycl9zdHJpbmdfKF9fYnl0ZV9lcnIpLCBfX3dpZGVfZXJyX3N0cmluZ18oX193aWRlX2VyciksCisgICAgICAgICAgX19jdnRzdGF0ZV8oKSwgX19jdnRjb3VudF8oMCkKK3sKKyAgICBfX2N2dHB0cl8gPSBuZXcgX0NvZGVjdnQ7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlPGNsYXNzIF9Db2RlY3Z0LCBjbGFzcyBfRWxlbSwgY2xhc3MgX1dpZGVfYWxsb2MsIGNsYXNzIF9CeXRlX2FsbG9jPgoraW5saW5lCit3c3RyaW5nX2NvbnZlcnQ8X0NvZGVjdnQsIF9FbGVtLCBfV2lkZV9hbGxvYywgX0J5dGVfYWxsb2M+OjoKKyAgICB3c3RyaW5nX2NvbnZlcnQod3N0cmluZ19jb252ZXJ0JiYgX193YykKKyAgICAgICAgOiBfX2J5dGVfZXJyX3N0cmluZ18oX1ZTVEQ6Om1vdmUoX193Yy5fX2J5dGVfZXJyX3N0cmluZ18pKSwKKyAgICAgICAgICBfX3dpZGVfZXJyX3N0cmluZ18oX1ZTVEQ6Om1vdmUoX193Yy5fX3dpZGVfZXJyX3N0cmluZ18pKSwKKyAgICAgICAgICBfX2N2dHB0cl8oX193Yy5fX2N2dHB0cl8pLAorICAgICAgICAgIF9fY3Z0c3RhdGVfKF9fd2MuX19jdnRzdGF0ZV8pLCBfX2N2dGNvdW50XyhfX3djLl9fY3Z0Y291bnRfKQoreworICAgIF9fd2MuX19jdnRwdHJfID0gbnVsbHB0cjsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGU8Y2xhc3MgX0NvZGVjdnQsIGNsYXNzIF9FbGVtLCBjbGFzcyBfV2lkZV9hbGxvYywgY2xhc3MgX0J5dGVfYWxsb2M+Cit3c3RyaW5nX2NvbnZlcnQ8X0NvZGVjdnQsIF9FbGVtLCBfV2lkZV9hbGxvYywgX0J5dGVfYWxsb2M+Ojp+d3N0cmluZ19jb252ZXJ0KCkKK3sKKyAgICBkZWxldGUgX19jdnRwdHJfOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ29kZWN2dCwgY2xhc3MgX0VsZW0sIGNsYXNzIF9XaWRlX2FsbG9jLCBjbGFzcyBfQnl0ZV9hbGxvYz4KK3R5cGVuYW1lIHdzdHJpbmdfY29udmVydDxfQ29kZWN2dCwgX0VsZW0sIF9XaWRlX2FsbG9jLCBfQnl0ZV9hbGxvYz46OndpZGVfc3RyaW5nCit3c3RyaW5nX2NvbnZlcnQ8X0NvZGVjdnQsIF9FbGVtLCBfV2lkZV9hbGxvYywgX0J5dGVfYWxsb2M+OjoKKyAgICBmcm9tX2J5dGVzKGNvbnN0IGNoYXIqIF9fZnJtLCBjb25zdCBjaGFyKiBfX2ZybV9lbmQpCit7CisgICAgX19jdnRjb3VudF8gPSAwOworICAgIGlmIChfX2N2dHB0cl8gIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIHdpZGVfc3RyaW5nIF9fd3MoMiooX19mcm1fZW5kIC0gX19mcm0pLCBfRWxlbSgpKTsKKyAgICAgICAgaWYgKF9fZnJtICE9IF9fZnJtX2VuZCkKKyAgICAgICAgICAgIF9fd3MucmVzaXplKF9fd3MuY2FwYWNpdHkoKSk7CisgICAgICAgIGNvZGVjdnRfYmFzZTo6cmVzdWx0IF9fciA9IGNvZGVjdnRfYmFzZTo6b2s7CisgICAgICAgIHN0YXRlX3R5cGUgX19zdCA9IF9fY3Z0c3RhdGVfOworICAgICAgICBpZiAoX19mcm0gIT0gX19mcm1fZW5kKQorICAgICAgICB7CisgICAgICAgICAgICBfRWxlbSogX190byA9ICZfX3dzWzBdOworICAgICAgICAgICAgX0VsZW0qIF9fdG9fZW5kID0gX190byArIF9fd3Muc2l6ZSgpOworICAgICAgICAgICAgY29uc3QgY2hhciogX19mcm1fbnh0OworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfRWxlbSogX190b19ueHQ7CisgICAgICAgICAgICAgICAgX19yID0gX19jdnRwdHJfLT5pbihfX3N0LCBfX2ZybSwgX19mcm1fZW5kLCBfX2ZybV9ueHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RvLCBfX3RvX2VuZCwgX190b19ueHQpOworICAgICAgICAgICAgICAgIF9fY3Z0Y291bnRfICs9IF9fZnJtX254dCAtIF9fZnJtOworICAgICAgICAgICAgICAgIGlmIChfX2ZybV9ueHQgPT0gX19mcm0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX3IgPSBjb2RlY3Z0X2Jhc2U6OmVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjpub2NvbnYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX3dzLnJlc2l6ZShfX3RvIC0gJl9fd3NbMF0pOworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG9ubHkgZ2V0cyBleGVjdXRlZCBpZiBfRWxlbSBpcyBjaGFyCisgICAgICAgICAgICAgICAgICAgIF9fd3MuYXBwZW5kKChjb25zdCBfRWxlbSopX19mcm0sIChjb25zdCBfRWxlbSopX19mcm1fZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgX19mcm0gPSBfX2ZybV9ueHQ7CisgICAgICAgICAgICAgICAgICAgIF9fciA9IGNvZGVjdnRfYmFzZTo6b2s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6Om9rKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX193cy5yZXNpemUoX190b19ueHQgLSAmX193c1swXSk7CisgICAgICAgICAgICAgICAgICAgIF9fZnJtID0gX19mcm1fbnh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjpwYXJ0aWFsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IF9fcyA9IF9fdG9fbnh0IC0gJl9fd3NbMF07CisgICAgICAgICAgICAgICAgICAgIF9fd3MucmVzaXplKDIgKiBfX3MpOworICAgICAgICAgICAgICAgICAgICBfX3RvID0gJl9fd3NbMF0gKyBfX3M7CisgICAgICAgICAgICAgICAgICAgIF9fdG9fZW5kID0gJl9fd3NbMF0gKyBfX3dzLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgX19mcm0gPSBfX2ZybV9ueHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoX19yID09IGNvZGVjdnRfYmFzZTo6cGFydGlhbCAmJiBfX2ZybV9ueHQgPCBfX2ZybV9lbmQpOworICAgICAgICB9CisgICAgICAgIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjpvaykKKyAgICAgICAgICAgIHJldHVybiBfX3dzOworICAgIH0KKworICAgIGlmIChfX3dpZGVfZXJyX3N0cmluZ18uZW1wdHkoKSkKKyAgICAgICAgX190aHJvd19yYW5nZV9lcnJvcigid3N0cmluZ19jb252ZXJ0OiBmcm9tX2J5dGVzIGVycm9yIik7CisKKyAgICByZXR1cm4gX193aWRlX2Vycl9zdHJpbmdfOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ29kZWN2dCwgY2xhc3MgX0VsZW0sIGNsYXNzIF9XaWRlX2FsbG9jLCBjbGFzcyBfQnl0ZV9hbGxvYz4KK3R5cGVuYW1lIHdzdHJpbmdfY29udmVydDxfQ29kZWN2dCwgX0VsZW0sIF9XaWRlX2FsbG9jLCBfQnl0ZV9hbGxvYz46OmJ5dGVfc3RyaW5nCit3c3RyaW5nX2NvbnZlcnQ8X0NvZGVjdnQsIF9FbGVtLCBfV2lkZV9hbGxvYywgX0J5dGVfYWxsb2M+OjoKKyAgICB0b19ieXRlcyhjb25zdCBfRWxlbSogX19mcm0sIGNvbnN0IF9FbGVtKiBfX2ZybV9lbmQpCit7CisgICAgX19jdnRjb3VudF8gPSAwOworICAgIGlmIChfX2N2dHB0cl8gIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIGJ5dGVfc3RyaW5nIF9fYnMoMiooX19mcm1fZW5kIC0gX19mcm0pLCBjaGFyKCkpOworICAgICAgICBpZiAoX19mcm0gIT0gX19mcm1fZW5kKQorICAgICAgICAgICAgX19icy5yZXNpemUoX19icy5jYXBhY2l0eSgpKTsKKyAgICAgICAgY29kZWN2dF9iYXNlOjpyZXN1bHQgX19yID0gY29kZWN2dF9iYXNlOjpvazsKKyAgICAgICAgc3RhdGVfdHlwZSBfX3N0ID0gX19jdnRzdGF0ZV87CisgICAgICAgIGlmIChfX2ZybSAhPSBfX2ZybV9lbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIqIF9fdG8gPSAmX19ic1swXTsKKyAgICAgICAgICAgIGNoYXIqIF9fdG9fZW5kID0gX190byArIF9fYnMuc2l6ZSgpOworICAgICAgICAgICAgY29uc3QgX0VsZW0qIF9fZnJtX254dDsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciogX190b19ueHQ7CisgICAgICAgICAgICAgICAgX19yID0gX19jdnRwdHJfLT5vdXQoX19zdCwgX19mcm0sIF9fZnJtX2VuZCwgX19mcm1fbnh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdG8sIF9fdG9fZW5kLCBfX3RvX254dCk7CisgICAgICAgICAgICAgICAgX19jdnRjb3VudF8gKz0gX19mcm1fbnh0IC0gX19mcm07CisgICAgICAgICAgICAgICAgaWYgKF9fZnJtX254dCA9PSBfX2ZybSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9fciA9IGNvZGVjdnRfYmFzZTo6ZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6Om5vY29udikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9fYnMucmVzaXplKF9fdG8gLSAmX19ic1swXSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgb25seSBnZXRzIGV4ZWN1dGVkIGlmIF9FbGVtIGlzIGNoYXIKKyAgICAgICAgICAgICAgICAgICAgX19icy5hcHBlbmQoKGNvbnN0IGNoYXIqKV9fZnJtLCAoY29uc3QgY2hhciopX19mcm1fZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgX19mcm0gPSBfX2ZybV9ueHQ7CisgICAgICAgICAgICAgICAgICAgIF9fciA9IGNvZGVjdnRfYmFzZTo6b2s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6Om9rKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX19icy5yZXNpemUoX190b19ueHQgLSAmX19ic1swXSk7CisgICAgICAgICAgICAgICAgICAgIF9fZnJtID0gX19mcm1fbnh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjpwYXJ0aWFsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IF9fcyA9IF9fdG9fbnh0IC0gJl9fYnNbMF07CisgICAgICAgICAgICAgICAgICAgIF9fYnMucmVzaXplKDIgKiBfX3MpOworICAgICAgICAgICAgICAgICAgICBfX3RvID0gJl9fYnNbMF0gKyBfX3M7CisgICAgICAgICAgICAgICAgICAgIF9fdG9fZW5kID0gJl9fYnNbMF0gKyBfX2JzLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgX19mcm0gPSBfX2ZybV9ueHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoX19yID09IGNvZGVjdnRfYmFzZTo6cGFydGlhbCAmJiBfX2ZybV9ueHQgPCBfX2ZybV9lbmQpOworICAgICAgICB9CisgICAgICAgIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjpvaykKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IF9fcyA9IF9fYnMuc2l6ZSgpOworICAgICAgICAgICAgX19icy5yZXNpemUoX19icy5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIGNoYXIqIF9fdG8gPSAmX19ic1swXSArIF9fczsKKyAgICAgICAgICAgIGNoYXIqIF9fdG9fZW5kID0gX190byArIF9fYnMuc2l6ZSgpOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyKiBfX3RvX254dDsKKyAgICAgICAgICAgICAgICBfX3IgPSBfX2N2dHB0cl8tPnVuc2hpZnQoX19zdCwgX190bywgX190b19lbmQsIF9fdG9fbnh0KTsKKyAgICAgICAgICAgICAgICBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6bm9jb252KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX19icy5yZXNpemUoX190byAtICZfX2JzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgX19yID0gY29kZWN2dF9iYXNlOjpvazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6b2spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX2JzLnJlc2l6ZShfX3RvX254dCAtICZfX2JzWzBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6cGFydGlhbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBfX3NwID0gX190b19ueHQgLSAmX19ic1swXTsKKyAgICAgICAgICAgICAgICAgICAgX19icy5yZXNpemUoMiAqIF9fc3ApOworICAgICAgICAgICAgICAgICAgICBfX3RvID0gJl9fYnNbMF0gKyBfX3NwOworICAgICAgICAgICAgICAgICAgICBfX3RvX2VuZCA9ICZfX2JzWzBdICsgX19icy5zaXplKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoX19yID09IGNvZGVjdnRfYmFzZTo6cGFydGlhbCk7CisgICAgICAgICAgICBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6b2spCisgICAgICAgICAgICAgICAgcmV0dXJuIF9fYnM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoX19ieXRlX2Vycl9zdHJpbmdfLmVtcHR5KCkpCisgICAgICAgIF9fdGhyb3dfcmFuZ2VfZXJyb3IoIndzdHJpbmdfY29udmVydDogdG9fYnl0ZXMgZXJyb3IiKTsKKworICAgIHJldHVybiBfX2J5dGVfZXJyX3N0cmluZ187Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29kZWN2dCwgY2xhc3MgX0VsZW0gPSB3Y2hhcl90LCBjbGFzcyBfVHIgPSBjaGFyX3RyYWl0czxfRWxlbT4gPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgd2J1ZmZlcl9jb252ZXJ0CisgICAgOiBwdWJsaWMgYmFzaWNfc3RyZWFtYnVmPF9FbGVtLCBfVHI+Cit7CitwdWJsaWM6CisgICAgLy8gdHlwZXM6CisgICAgdHlwZWRlZiBfRWxlbSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgIHR5cGVkZWYgX1RyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIGludF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIHBvc190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlIG9mZl90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NvZGVjdnQ6OnN0YXRlX3R5cGUgIHN0YXRlX3R5cGU7CisKK3ByaXZhdGU6CisgICAgY2hhciogICAgICAgX19leHRidWZfOworICAgIGNvbnN0IGNoYXIqIF9fZXh0YnVmbmV4dF87CisgICAgY29uc3QgY2hhciogX19leHRidWZlbmRfOworICAgIGNoYXIgX19leHRidWZfbWluX1s4XTsKKyAgICBzaXplX3QgX19lYnNfOworICAgIGNoYXJfdHlwZSogX19pbnRidWZfOworICAgIHNpemVfdCBfX2lic187CisgICAgc3RyZWFtYnVmKiBfX2J1ZnB0cl87CisgICAgX0NvZGVjdnQqIF9fY3ZfOworICAgIHN0YXRlX3R5cGUgX19zdF87CisgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fY21fOworICAgIGJvb2wgX19vd25zX2ViXzsKKyAgICBib29sIF9fb3duc19pYl87CisgICAgYm9vbCBfX2Fsd2F5c19ub2NvbnZfOworCisgICAgd2J1ZmZlcl9jb252ZXJ0KGNvbnN0IHdidWZmZXJfY29udmVydCYpOworICAgIHdidWZmZXJfY29udmVydCYgb3BlcmF0b3I9KGNvbnN0IHdidWZmZXJfY29udmVydCYpOworcHVibGljOgorICAgIF9MSUJDUFBfRVhQTElDSVRfQUZURVJfQ1hYMTEgd2J1ZmZlcl9jb252ZXJ0KHN0cmVhbWJ1ZiogX19ieXRlYnVmID0gMCwgCisgICAgICAgICAgICBfQ29kZWN2dCogX19wY3Z0ID0gbmV3IF9Db2RlY3Z0LCBzdGF0ZV90eXBlIF9fc3RhdGUgPSBzdGF0ZV90eXBlKCkpOworICAgIH53YnVmZmVyX2NvbnZlcnQoKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdHJlYW1idWYqIHJkYnVmKCkgY29uc3Qge3JldHVybiBfX2J1ZnB0cl87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdHJlYW1idWYqIHJkYnVmKHN0cmVhbWJ1ZiogX19ieXRlYnVmKQorICAgIHsKKyAgICAgICAgc3RyZWFtYnVmKiBfX3IgPSBfX2J1ZnB0cl87CisgICAgICAgIF9fYnVmcHRyXyA9IF9fYnl0ZWJ1ZjsKKyAgICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGVfdHlwZSBzdGF0ZSgpIGNvbnN0IHtyZXR1cm4gX19zdF87fQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBpbnRfdHlwZSB1bmRlcmZsb3coKTsKKyAgICB2aXJ0dWFsIGludF90eXBlIHBiYWNrZmFpbChpbnRfdHlwZSBfX2MgPSB0cmFpdHNfdHlwZTo6ZW9mKCkpOworICAgIHZpcnR1YWwgaW50X3R5cGUgb3ZlcmZsb3cgKGludF90eXBlIF9fYyA9IHRyYWl0c190eXBlOjplb2YoKSk7CisgICAgdmlydHVhbCBiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIHNldGJ1ZihjaGFyX3R5cGUqIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbXNpemUgX19uKTsKKyAgICB2aXJ0dWFsIHBvc190eXBlIHNlZWtvZmYob2ZmX3R5cGUgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fd2F5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX193Y2ggPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyAgICB2aXJ0dWFsIHBvc190eXBlIHNlZWtwb3MocG9zX3R5cGUgX19zcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fd2NoID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CisgICAgdmlydHVhbCBpbnQgc3luYygpOworCitwcml2YXRlOgorICAgIGJvb2wgX19yZWFkX21vZGUoKTsKKyAgICB2b2lkIF9fd3JpdGVfbW9kZSgpOworICAgIHdidWZmZXJfY29udmVydCogX19jbG9zZSgpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Db2RlY3Z0LCBjbGFzcyBfRWxlbSwgY2xhc3MgX1RyPgord2J1ZmZlcl9jb252ZXJ0PF9Db2RlY3Z0LCBfRWxlbSwgX1RyPjo6CisgICAgd2J1ZmZlcl9jb252ZXJ0KHN0cmVhbWJ1ZiogX19ieXRlYnVmLCBfQ29kZWN2dCogX19wY3Z0LCBzdGF0ZV90eXBlIF9fc3RhdGUpCisgICAgOiBfX2V4dGJ1Zl8oMCksCisgICAgICBfX2V4dGJ1Zm5leHRfKDApLAorICAgICAgX19leHRidWZlbmRfKDApLAorICAgICAgX19lYnNfKDApLAorICAgICAgX19pbnRidWZfKDApLAorICAgICAgX19pYnNfKDApLAorICAgICAgX19idWZwdHJfKF9fYnl0ZWJ1ZiksCisgICAgICBfX2N2XyhfX3BjdnQpLAorICAgICAgX19zdF8oX19zdGF0ZSksCisgICAgICBfX2NtXygwKSwKKyAgICAgIF9fb3duc19lYl8oZmFsc2UpLAorICAgICAgX19vd25zX2liXyhmYWxzZSksCisgICAgICBfX2Fsd2F5c19ub2NvbnZfKF9fY3ZfID8gX19jdl8tPmFsd2F5c19ub2NvbnYoKSA6IGZhbHNlKQoreworICAgIHNldGJ1ZigwLCA0MDk2KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db2RlY3Z0LCBjbGFzcyBfRWxlbSwgY2xhc3MgX1RyPgord2J1ZmZlcl9jb252ZXJ0PF9Db2RlY3Z0LCBfRWxlbSwgX1RyPjo6fndidWZmZXJfY29udmVydCgpCit7CisgICAgX19jbG9zZSgpOworICAgIGRlbGV0ZSBfX2N2XzsKKyAgICBpZiAoX19vd25zX2ViXykKKyAgICAgICAgZGVsZXRlIFtdIF9fZXh0YnVmXzsKKyAgICBpZiAoX19vd25zX2liXykKKyAgICAgICAgZGVsZXRlIFtdIF9faW50YnVmXzsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db2RlY3Z0LCBjbGFzcyBfRWxlbSwgY2xhc3MgX1RyPgordHlwZW5hbWUgd2J1ZmZlcl9jb252ZXJ0PF9Db2RlY3Z0LCBfRWxlbSwgX1RyPjo6aW50X3R5cGUKK3didWZmZXJfY29udmVydDxfQ29kZWN2dCwgX0VsZW0sIF9Ucj46OnVuZGVyZmxvdygpCit7CisgICAgaWYgKF9fY3ZfID09IDAgfHwgX19idWZwdHJfID09IDApCisgICAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgYm9vbCBfX2luaXRpYWwgPSBfX3JlYWRfbW9kZSgpOworICAgIGNoYXJfdHlwZSBfXzFidWY7CisgICAgaWYgKHRoaXMtPmdwdHIoKSA9PSAwKQorICAgICAgICB0aGlzLT5zZXRnKCZfXzFidWYsICZfXzFidWYrMSwgJl9fMWJ1ZisxKTsKKyAgICBjb25zdCBzaXplX3QgX191bmdldF9zeiA9IF9faW5pdGlhbCA/IDAgOiBtaW48c2l6ZV90PigodGhpcy0+ZWdwdHIoKSAtIHRoaXMtPmViYWNrKCkpIC8gMiwgNCk7CisgICAgaW50X3R5cGUgX19jID0gdHJhaXRzX3R5cGU6OmVvZigpOworICAgIGlmICh0aGlzLT5ncHRyKCkgPT0gdGhpcy0+ZWdwdHIoKSkKKyAgICB7CisgICAgICAgIG1lbW1vdmUodGhpcy0+ZWJhY2soKSwgdGhpcy0+ZWdwdHIoKSAtIF9fdW5nZXRfc3osIF9fdW5nZXRfc3ogKiBzaXplb2YoY2hhcl90eXBlKSk7CisgICAgICAgIGlmIChfX2Fsd2F5c19ub2NvbnZfKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJlYW1zaXplIF9fbm1lbWIgPSBzdGF0aWNfY2FzdDxzdHJlYW1zaXplPih0aGlzLT5lZ3B0cigpIC0gdGhpcy0+ZWJhY2soKSAtIF9fdW5nZXRfc3opOworICAgICAgICAgICAgX19ubWVtYiA9IF9fYnVmcHRyXy0+c2dldG4oKGNoYXIqKXRoaXMtPmViYWNrKCkgKyBfX3VuZ2V0X3N6LCBfX25tZW1iKTsKKyAgICAgICAgICAgIGlmIChfX25tZW1iICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+c2V0Zyh0aGlzLT5lYmFjaygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+ZWJhY2soKSArIF9fdW5nZXRfc3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5lYmFjaygpICsgX191bmdldF9zeiArIF9fbm1lbWIpOworICAgICAgICAgICAgICAgIF9fYyA9ICp0aGlzLT5ncHRyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgX0xJQkNQUF9BU1NFUlQoIShfX2V4dGJ1Zm5leHRfID09IE5VTEwgJiYgKF9fZXh0YnVmZW5kXyAhPSBfX2V4dGJ1Zm5leHRfKSksICJ1bmRlcmZsb3cgbW92aW5nIGZyb20gTlVMTCIgKTsKKyAgICAgICAgICAgICBpZiAoX19leHRidWZlbmRfICE9IF9fZXh0YnVmbmV4dF8pCisgICAgICAgICAgICAgICAgbWVtbW92ZShfX2V4dGJ1Zl8sIF9fZXh0YnVmbmV4dF8sIF9fZXh0YnVmZW5kXyAtIF9fZXh0YnVmbmV4dF8pOworICAgICAgICAgICAgX19leHRidWZuZXh0XyA9IF9fZXh0YnVmXyArIChfX2V4dGJ1ZmVuZF8gLSBfX2V4dGJ1Zm5leHRfKTsKKyAgICAgICAgICAgIF9fZXh0YnVmZW5kXyA9IF9fZXh0YnVmXyArIChfX2V4dGJ1Zl8gPT0gX19leHRidWZfbWluXyA/IHNpemVvZihfX2V4dGJ1Zl9taW5fKSA6IF9fZWJzXyk7CisgICAgICAgICAgICBzdHJlYW1zaXplIF9fbm1lbWIgPSBfVlNURDo6bWluKHN0YXRpY19jYXN0PHN0cmVhbXNpemU+KHRoaXMtPmVncHRyKCkgLSB0aGlzLT5lYmFjaygpIC0gX191bmdldF9zeiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzdHJlYW1zaXplPihfX2V4dGJ1ZmVuZF8gLSBfX2V4dGJ1Zm5leHRfKSk7CisgICAgICAgICAgICBjb2RlY3Z0X2Jhc2U6OnJlc3VsdCBfX3I7CisgICAgICAgICAgICAvLyBGSVhNRTogRG8gd2UgZXZlciBuZWVkIHRvIHJlc3RvcmUgdGhlIHN0YXRlIGhlcmU/CisgICAgICAgICAgICAvL3N0YXRlX3R5cGUgX19zdnMgPSBfX3N0XzsKKyAgICAgICAgICAgIHN0cmVhbXNpemUgX19uciA9IF9fYnVmcHRyXy0+c2dldG4oY29uc3RfY2FzdDxjaGFyKj4oX19leHRidWZuZXh0XyksIF9fbm1lbWIpOworICAgICAgICAgICAgaWYgKF9fbnIgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX2V4dGJ1ZmVuZF8gPSBfX2V4dGJ1Zm5leHRfICsgX19ucjsKKyAgICAgICAgICAgICAgICBjaGFyX3R5cGUqICBfX2luZXh0OworICAgICAgICAgICAgICAgIF9fciA9IF9fY3ZfLT5pbihfX3N0XywgX19leHRidWZfLCBfX2V4dGJ1ZmVuZF8sIF9fZXh0YnVmbmV4dF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5lYmFjaygpICsgX191bmdldF9zeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmVncHRyKCksIF9faW5leHQpOworICAgICAgICAgICAgICAgIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjpub2NvbnYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aGlzLT5zZXRnKChjaGFyX3R5cGUqKV9fZXh0YnVmXywgKGNoYXJfdHlwZSopX19leHRidWZfLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhcl90eXBlKikgY29uc3RfY2FzdDxjaGFyICo+KF9fZXh0YnVmZW5kXykpOworICAgICAgICAgICAgICAgICAgICBfX2MgPSAqdGhpcy0+Z3B0cigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChfX2luZXh0ICE9IHRoaXMtPmViYWNrKCkgKyBfX3VuZ2V0X3N6KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy0+c2V0Zyh0aGlzLT5lYmFjaygpLCB0aGlzLT5lYmFjaygpICsgX191bmdldF9zeiwgX19pbmV4dCk7CisgICAgICAgICAgICAgICAgICAgIF9fYyA9ICp0aGlzLT5ncHRyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgX19jID0gKnRoaXMtPmdwdHIoKTsKKyAgICBpZiAodGhpcy0+ZWJhY2soKSA9PSAmX18xYnVmKQorICAgICAgICB0aGlzLT5zZXRnKDAsIDAsIDApOworICAgIHJldHVybiBfX2M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29kZWN2dCwgY2xhc3MgX0VsZW0sIGNsYXNzIF9Ucj4KK3R5cGVuYW1lIHdidWZmZXJfY29udmVydDxfQ29kZWN2dCwgX0VsZW0sIF9Ucj46OmludF90eXBlCit3YnVmZmVyX2NvbnZlcnQ8X0NvZGVjdnQsIF9FbGVtLCBfVHI+OjpwYmFja2ZhaWwoaW50X3R5cGUgX19jKQoreworICAgIGlmIChfX2N2XyAhPSAwICYmIF9fYnVmcHRyXyAhPSAwICYmIHRoaXMtPmViYWNrKCkgPCB0aGlzLT5ncHRyKCkpCisgICAgeworICAgICAgICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgdHJhaXRzX3R5cGU6OmVvZigpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+Z2J1bXAoLTEpOworICAgICAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjpub3RfZW9mKF9fYyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYWl0c190eXBlOjplcSh0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyksIHRoaXMtPmdwdHIoKVstMV0pKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5nYnVtcCgtMSk7CisgICAgICAgICAgICAqdGhpcy0+Z3B0cigpID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpOworICAgICAgICAgICAgcmV0dXJuIF9fYzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvZGVjdnQsIGNsYXNzIF9FbGVtLCBjbGFzcyBfVHI+Cit0eXBlbmFtZSB3YnVmZmVyX2NvbnZlcnQ8X0NvZGVjdnQsIF9FbGVtLCBfVHI+OjppbnRfdHlwZQord2J1ZmZlcl9jb252ZXJ0PF9Db2RlY3Z0LCBfRWxlbSwgX1RyPjo6b3ZlcmZsb3coaW50X3R5cGUgX19jKQoreworICAgIGlmIChfX2N2XyA9PSAwIHx8IF9fYnVmcHRyXyA9PSAwKQorICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgIF9fd3JpdGVfbW9kZSgpOworICAgIGNoYXJfdHlwZSBfXzFidWY7CisgICAgY2hhcl90eXBlKiBfX3BiX3NhdmUgPSB0aGlzLT5wYmFzZSgpOworICAgIGNoYXJfdHlwZSogX19lcGJfc2F2ZSA9IHRoaXMtPmVwcHRyKCk7CisgICAgaWYgKCF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBwdHIoKSA9PSAwKQorICAgICAgICAgICAgdGhpcy0+c2V0cCgmX18xYnVmLCAmX18xYnVmKzEpOworICAgICAgICAqdGhpcy0+cHB0cigpID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpOworICAgICAgICB0aGlzLT5wYnVtcCgxKTsKKyAgICB9CisgICAgaWYgKHRoaXMtPnBwdHIoKSAhPSB0aGlzLT5wYmFzZSgpKQorICAgIHsKKyAgICAgICAgaWYgKF9fYWx3YXlzX25vY29udl8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmVhbXNpemUgX19ubWVtYiA9IHN0YXRpY19jYXN0PHN0cmVhbXNpemU+KHRoaXMtPnBwdHIoKSAtIHRoaXMtPnBiYXNlKCkpOworICAgICAgICAgICAgaWYgKF9fYnVmcHRyXy0+c3B1dG4oKGNvbnN0IGNoYXIqKXRoaXMtPnBiYXNlKCksIF9fbm1lbWIpICE9IF9fbm1lbWIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIqIF9fZXh0YmUgPSBfX2V4dGJ1Zl87CisgICAgICAgICAgICBjb2RlY3Z0X2Jhc2U6OnJlc3VsdCBfX3I7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19lOworICAgICAgICAgICAgICAgIF9fciA9IF9fY3ZfLT5vdXQoX19zdF8sIHRoaXMtPnBiYXNlKCksIHRoaXMtPnBwdHIoKSwgX19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZXh0YnVmXywgX19leHRidWZfICsgX19lYnNfLCBfX2V4dGJlKTsKKyAgICAgICAgICAgICAgICBpZiAoX19lID09IHRoaXMtPnBiYXNlKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICAgICAgICAgICAgaWYgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6Om5vY29udikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbXNpemUgX19ubWVtYiA9IHN0YXRpY19jYXN0PHNpemVfdD4odGhpcy0+cHB0cigpIC0gdGhpcy0+cGJhc2UoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2J1ZnB0cl8tPnNwdXRuKChjb25zdCBjaGFyKil0aGlzLT5wYmFzZSgpLCBfX25tZW1iKSAhPSBfX25tZW1iKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6b2sgfHwgX19yID09IGNvZGVjdnRfYmFzZTo6cGFydGlhbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbXNpemUgX19ubWVtYiA9IHN0YXRpY19jYXN0PHNpemVfdD4oX19leHRiZSAtIF9fZXh0YnVmXyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2J1ZnB0cl8tPnNwdXRuKF9fZXh0YnVmXywgX19ubWVtYikgIT0gX19ubWVtYikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjpwYXJ0aWFsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zZXRwKGNvbnN0X2Nhc3Q8Y2hhcl90eXBlICo+KF9fZSksIHRoaXMtPnBwdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5fX3BidW1wKHRoaXMtPmVwcHRyKCkgLSB0aGlzLT5wYmFzZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICAgICAgICB9IHdoaWxlIChfX3IgPT0gY29kZWN2dF9iYXNlOjpwYXJ0aWFsKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLT5zZXRwKF9fcGJfc2F2ZSwgX19lcGJfc2F2ZSk7CisgICAgfQorICAgIHJldHVybiB0cmFpdHNfdHlwZTo6bm90X2VvZihfX2MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvZGVjdnQsIGNsYXNzIF9FbGVtLCBjbGFzcyBfVHI+CitiYXNpY19zdHJlYW1idWY8X0VsZW0sIF9Ucj4qCit3YnVmZmVyX2NvbnZlcnQ8X0NvZGVjdnQsIF9FbGVtLCBfVHI+OjpzZXRidWYoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQoreworICAgIHRoaXMtPnNldGcoMCwgMCwgMCk7CisgICAgdGhpcy0+c2V0cCgwLCAwKTsKKyAgICBpZiAoX19vd25zX2ViXykKKyAgICAgICAgZGVsZXRlIFtdIF9fZXh0YnVmXzsKKyAgICBpZiAoX19vd25zX2liXykKKyAgICAgICAgZGVsZXRlIFtdIF9faW50YnVmXzsKKyAgICBfX2Vic18gPSBfX247CisgICAgaWYgKF9fZWJzXyA+IHNpemVvZihfX2V4dGJ1Zl9taW5fKSkKKyAgICB7CisgICAgICAgIGlmIChfX2Fsd2F5c19ub2NvbnZfICYmIF9fcykKKyAgICAgICAgeworICAgICAgICAgICAgX19leHRidWZfID0gKGNoYXIqKV9fczsKKyAgICAgICAgICAgIF9fb3duc19lYl8gPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fZXh0YnVmXyA9IG5ldyBjaGFyW19fZWJzX107CisgICAgICAgICAgICBfX293bnNfZWJfID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfX2V4dGJ1Zl8gPSBfX2V4dGJ1Zl9taW5fOworICAgICAgICBfX2Vic18gPSBzaXplb2YoX19leHRidWZfbWluXyk7CisgICAgICAgIF9fb3duc19lYl8gPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFfX2Fsd2F5c19ub2NvbnZfKQorICAgIHsKKyAgICAgICAgX19pYnNfID0gbWF4PHN0cmVhbXNpemU+KF9fbiwgc2l6ZW9mKF9fZXh0YnVmX21pbl8pKTsKKyAgICAgICAgaWYgKF9fcyAmJiBfX2lic18gPj0gc2l6ZW9mKF9fZXh0YnVmX21pbl8pKQorICAgICAgICB7CisgICAgICAgICAgICBfX2ludGJ1Zl8gPSBfX3M7CisgICAgICAgICAgICBfX293bnNfaWJfID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfX2ludGJ1Zl8gPSBuZXcgY2hhcl90eXBlW19faWJzX107CisgICAgICAgICAgICBfX293bnNfaWJfID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfX2lic18gPSAwOworICAgICAgICBfX2ludGJ1Zl8gPSAwOworICAgICAgICBfX293bnNfaWJfID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvZGVjdnQsIGNsYXNzIF9FbGVtLCBjbGFzcyBfVHI+Cit0eXBlbmFtZSB3YnVmZmVyX2NvbnZlcnQ8X0NvZGVjdnQsIF9FbGVtLCBfVHI+Ojpwb3NfdHlwZQord2J1ZmZlcl9jb252ZXJ0PF9Db2RlY3Z0LCBfRWxlbSwgX1RyPjo6c2Vla29mZihvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX193YXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fb20pCit7CisgICAgaW50IF9fd2lkdGggPSBfX2N2Xy0+ZW5jb2RpbmcoKTsKKyAgICBpZiAoX19jdl8gPT0gMCB8fCBfX2J1ZnB0cl8gPT0gMCB8fCAoX193aWR0aCA8PSAwICYmIF9fb2ZmICE9IDApIHx8IHN5bmMoKSkKKyAgICAgICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisgICAgLy8gX193aWR0aCA+IDAgfHwgX19vZmYgPT0gMCwgbm93IGNoZWNrIF9fd2F5CisgICAgaWYgKF9fd2F5ICE9IGlvc19iYXNlOjpiZWcgJiYgX193YXkgIT0gaW9zX2Jhc2U6OmN1ciAmJiBfX3dheSAhPSBpb3NfYmFzZTo6ZW5kKQorICAgICAgICByZXR1cm4gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKyAgICBwb3NfdHlwZSBfX3IgPSBfX2J1ZnB0cl8tPnB1YnNlZWtvZmYoX193aWR0aCAqIF9fb2ZmLCBfX3dheSwgX19vbSk7CisgICAgX19yLnN0YXRlKF9fc3RfKTsKKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvZGVjdnQsIGNsYXNzIF9FbGVtLCBjbGFzcyBfVHI+Cit0eXBlbmFtZSB3YnVmZmVyX2NvbnZlcnQ8X0NvZGVjdnQsIF9FbGVtLCBfVHI+Ojpwb3NfdHlwZQord2J1ZmZlcl9jb252ZXJ0PF9Db2RlY3Z0LCBfRWxlbSwgX1RyPjo6c2Vla3Bvcyhwb3NfdHlwZSBfX3NwLCBpb3NfYmFzZTo6b3Blbm1vZGUgX193Y2gpCit7CisgICAgaWYgKF9fY3ZfID09IDAgfHwgX19idWZwdHJfID09IDAgfHwgc3luYygpKQorICAgICAgICByZXR1cm4gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKyAgICBpZiAoX19idWZwdHJfLT5wdWJzZWVrcG9zKF9fc3AsIF9fd2NoKSA9PSBwb3NfdHlwZShvZmZfdHlwZSgtMSkpKQorICAgICAgICByZXR1cm4gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKyAgICByZXR1cm4gX19zcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db2RlY3Z0LCBjbGFzcyBfRWxlbSwgY2xhc3MgX1RyPgoraW50Cit3YnVmZmVyX2NvbnZlcnQ8X0NvZGVjdnQsIF9FbGVtLCBfVHI+OjpzeW5jKCkKK3sKKyAgICBpZiAoX19jdl8gPT0gMCB8fCBfX2J1ZnB0cl8gPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKF9fY21fICYgaW9zX2Jhc2U6Om91dCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5wcHRyKCkgIT0gdGhpcy0+cGJhc2UoKSkKKyAgICAgICAgICAgIGlmIChvdmVyZmxvdygpID09IHRyYWl0c190eXBlOjplb2YoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNvZGVjdnRfYmFzZTo6cmVzdWx0IF9fcjsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgY2hhciogX19leHRiZTsKKyAgICAgICAgICAgIF9fciA9IF9fY3ZfLT51bnNoaWZ0KF9fc3RfLCBfX2V4dGJ1Zl8sIF9fZXh0YnVmXyArIF9fZWJzXywgX19leHRiZSk7CisgICAgICAgICAgICBzdHJlYW1zaXplIF9fbm1lbWIgPSBzdGF0aWNfY2FzdDxzdHJlYW1zaXplPihfX2V4dGJlIC0gX19leHRidWZfKTsKKyAgICAgICAgICAgIGlmIChfX2J1ZnB0cl8tPnNwdXRuKF9fZXh0YnVmXywgX19ubWVtYikgIT0gX19ubWVtYikKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gd2hpbGUgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6OnBhcnRpYWwpOworICAgICAgICBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6ZXJyb3IpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChfX2J1ZnB0cl8tPnB1YnN5bmMoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAoX19jbV8gJiBpb3NfYmFzZTo6aW4pCisgICAgeworICAgICAgICBvZmZfdHlwZSBfX2M7CisgICAgICAgIGlmIChfX2Fsd2F5c19ub2NvbnZfKQorICAgICAgICAgICAgX19jID0gdGhpcy0+ZWdwdHIoKSAtIHRoaXMtPmdwdHIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgX193aWR0aCA9IF9fY3ZfLT5lbmNvZGluZygpOworICAgICAgICAgICAgX19jID0gX19leHRidWZlbmRfIC0gX19leHRidWZuZXh0XzsKKyAgICAgICAgICAgIGlmIChfX3dpZHRoID4gMCkKKyAgICAgICAgICAgICAgICBfX2MgKz0gX193aWR0aCAqICh0aGlzLT5lZ3B0cigpIC0gdGhpcy0+Z3B0cigpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+Z3B0cigpICE9IHRoaXMtPmVncHRyKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXZlcnNlKHRoaXMtPmdwdHIoKSwgdGhpcy0+ZWdwdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvZGVjdnRfYmFzZTo6cmVzdWx0IF9fcjsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcl90eXBlKiBfX2UgPSB0aGlzLT5ncHRyKCk7CisgICAgICAgICAgICAgICAgICAgIGNoYXIqIF9fZXh0YmU7CisgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fciA9IF9fY3ZfLT5vdXQoX19zdF8sIF9fZSwgdGhpcy0+ZWdwdHIoKSwgX19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2V4dGJ1Zl8sIF9fZXh0YnVmXyArIF9fZWJzXywgX19leHRiZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9fcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgY29kZWN2dF9iYXNlOjpub2NvbnY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jICs9IHRoaXMtPmVncHRyKCkgLSB0aGlzLT5ncHRyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGNvZGVjdnRfYmFzZTo6b2s6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGNvZGVjdnRfYmFzZTo6cGFydGlhbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2MgKz0gX19leHRiZSAtIF9fZXh0YnVmXzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChfX3IgPT0gY29kZWN2dF9iYXNlOjpwYXJ0aWFsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fYnVmcHRyXy0+cHVic2Vla29mZigtX19jLCBpb3NfYmFzZTo6Y3VyLCBfX2NtXykgPT0gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgdGhpcy0+c2V0ZygwLCAwLCAwKTsKKyAgICAgICAgX19jbV8gPSAwOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Db2RlY3Z0LCBjbGFzcyBfRWxlbSwgY2xhc3MgX1RyPgorYm9vbAord2J1ZmZlcl9jb252ZXJ0PF9Db2RlY3Z0LCBfRWxlbSwgX1RyPjo6X19yZWFkX21vZGUoKQoreworICAgIGlmICghKF9fY21fICYgaW9zX2Jhc2U6OmluKSkKKyAgICB7CisgICAgICAgIHRoaXMtPnNldHAoMCwgMCk7CisgICAgICAgIGlmIChfX2Fsd2F5c19ub2NvbnZfKQorICAgICAgICAgICAgdGhpcy0+c2V0ZygoY2hhcl90eXBlKilfX2V4dGJ1Zl8sCisgICAgICAgICAgICAgICAgICAgICAgIChjaGFyX3R5cGUqKV9fZXh0YnVmXyArIF9fZWJzXywKKyAgICAgICAgICAgICAgICAgICAgICAgKGNoYXJfdHlwZSopX19leHRidWZfICsgX19lYnNfKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy0+c2V0ZyhfX2ludGJ1Zl8sIF9faW50YnVmXyArIF9faWJzXywgX19pbnRidWZfICsgX19pYnNfKTsKKyAgICAgICAgX19jbV8gPSBpb3NfYmFzZTo6aW47CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ29kZWN2dCwgY2xhc3MgX0VsZW0sIGNsYXNzIF9Ucj4KK3ZvaWQKK3didWZmZXJfY29udmVydDxfQ29kZWN2dCwgX0VsZW0sIF9Ucj46Ol9fd3JpdGVfbW9kZSgpCit7CisgICAgaWYgKCEoX19jbV8gJiBpb3NfYmFzZTo6b3V0KSkKKyAgICB7CisgICAgICAgIHRoaXMtPnNldGcoMCwgMCwgMCk7CisgICAgICAgIGlmIChfX2Vic18gPiBzaXplb2YoX19leHRidWZfbWluXykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX2Fsd2F5c19ub2NvbnZfKQorICAgICAgICAgICAgICAgIHRoaXMtPnNldHAoKGNoYXJfdHlwZSopX19leHRidWZfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXJfdHlwZSopX19leHRidWZfICsgKF9fZWJzXyAtIDEpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aGlzLT5zZXRwKF9faW50YnVmXywgX19pbnRidWZfICsgKF9faWJzXyAtIDEpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB0aGlzLT5zZXRwKDAsIDApOworICAgICAgICBfX2NtXyA9IGlvc19iYXNlOjpvdXQ7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NvZGVjdnQsIGNsYXNzIF9FbGVtLCBjbGFzcyBfVHI+Cit3YnVmZmVyX2NvbnZlcnQ8X0NvZGVjdnQsIF9FbGVtLCBfVHI+Kgord2J1ZmZlcl9jb252ZXJ0PF9Db2RlY3Z0LCBfRWxlbSwgX1RyPjo6X19jbG9zZSgpCit7CisgICAgd2J1ZmZlcl9jb252ZXJ0KiBfX3J0ID0gMDsKKyAgICBpZiAoX19jdl8gIT0gMCAmJiBfX2J1ZnB0cl8gIT0gMCkKKyAgICB7CisgICAgICAgIF9fcnQgPSB0aGlzOworICAgICAgICBpZiAoKF9fY21fICYgaW9zX2Jhc2U6Om91dCkgJiYgc3luYygpKQorICAgICAgICAgICAgX19ydCA9IDA7CisgICAgfQorICAgIHJldHVybiBfX3J0OworfQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKK19MSUJDUFBfUE9QX01BQ1JPUworCisjZW5kaWYgIC8vIF9MSUJDUFBfTE9DQUxFCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvbG9jYWxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvbG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkN2I4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9sb2NhbGUuaApAQCAtMCwwICsxLDQ1IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGxvY2FsZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0xPQ0FMRV9ICisjZGVmaW5lIF9MSUJDUFBfTE9DQUxFX0gKKworLyoKKyAgICBsb2NhbGUuaCBzeW5vcHNpcworCitNYWNyb3M6CisKKyAgICBMQ19BTEwKKyAgICBMQ19DT0xMQVRFCisgICAgTENfQ1RZUEUKKyAgICBMQ19NT05FVEFSWQorICAgIExDX05VTUVSSUMKKyAgICBMQ19USU1FCisKK1R5cGVzOgorCisgICAgbGNvbnYKKworRnVuY3Rpb25zOgorCisgICBzZXRsb2NhbGUKKyAgIGxvY2FsZWNvbnYKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2luY2x1ZGVfbmV4dCA8bG9jYWxlLmg+CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9MT0NBTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL21hcCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3MjI2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9tYXAKQEAgLTAsMCArMSwxOTI2IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtYXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX01BUAorI2RlZmluZSBfTElCQ1BQX01BUAorCisvKgorCisgICAgbWFwIHN5bm9wc2lzCisKK25hbWVzcGFjZSBzdGQKK3sKKwordGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVCwgY2xhc3MgQ29tcGFyZSA9IGxlc3M8S2V5PiwKKyAgICAgICAgICBjbGFzcyBBbGxvY2F0b3IgPSBhbGxvY2F0b3I8cGFpcjxjb25zdCBLZXksIFQ+Pj4KK2NsYXNzIG1hcAoreworcHVibGljOgorICAgIC8vIHR5cGVzOgorICAgIHR5cGVkZWYgS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICB0eXBlZGVmIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkX3R5cGU7CisgICAgdHlwZWRlZiBwYWlyPGNvbnN0IGtleV90eXBlLCBtYXBwZWRfdHlwZT4gICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBDb21wYXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9jb21wYXJlOworICAgIHR5cGVkZWYgQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpyZWZlcmVuY2UgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6cG9pbnRlciAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6Y29uc3RfcG9pbnRlciAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgaW1wbGVtZW50YXRpb24tZGVmaW5lZCAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgIGNsYXNzIHZhbHVlX2NvbXBhcmUKKyAgICAgICAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPHZhbHVlX3R5cGUsIHZhbHVlX3R5cGUsIGJvb2w+CisgICAgeworICAgICAgICBmcmllbmQgY2xhc3MgbWFwOworICAgIHByb3RlY3RlZDoKKyAgICAgICAga2V5X2NvbXBhcmUgY29tcDsKKworICAgICAgICB2YWx1ZV9jb21wYXJlKGtleV9jb21wYXJlIGMpOworICAgIHB1YmxpYzoKKyAgICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHZhbHVlX3R5cGUmIHgsIGNvbnN0IHZhbHVlX3R5cGUmIHkpIGNvbnN0OworICAgIH07CisKKyAgICAvLyBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgIG1hcCgpCisgICAgICAgIG5vZXhjZXB0KAorICAgICAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8a2V5X2NvbXBhcmU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8a2V5X2NvbXBhcmU+Ojp2YWx1ZSk7CisgICAgZXhwbGljaXQgbWFwKGNvbnN0IGtleV9jb21wYXJlJiBjb21wKTsKKyAgICBtYXAoY29uc3Qga2V5X2NvbXBhcmUmIGNvbXAsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgbWFwKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwKKyAgICAgICAgICAgIGNvbnN0IGtleV9jb21wYXJlJiBjb21wID0ga2V5X2NvbXBhcmUoKSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIG1hcChJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICBjb25zdCBrZXlfY29tcGFyZSYgY29tcCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOworICAgIG1hcChjb25zdCBtYXAmIG0pOworICAgIG1hcChtYXAmJiBtKQorICAgICAgICBub2V4Y2VwdCgKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGtleV9jb21wYXJlPjo6dmFsdWUpOworICAgIGV4cGxpY2l0IG1hcChjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7CisgICAgbWFwKGNvbnN0IG1hcCYgbSwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOworICAgIG1hcChtYXAmJiBtLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7CisgICAgbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwsIGNvbnN0IGtleV9jb21wYXJlJiBjb21wID0ga2V5X2NvbXBhcmUoKSk7CisgICAgbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwsIGNvbnN0IGtleV9jb21wYXJlJiBjb21wLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIG1hcChJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKQorICAgICAgICAgICAgOiBtYXAoZmlyc3QsIGxhc3QsIENvbXBhcmUoKSwgYSkge30gIC8vIEMrKzE0CisgICAgbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKQorICAgICAgICA6IG1hcChpbCwgQ29tcGFyZSgpLCBhKSB7fSAgLy8gQysrMTQKKyAgIH5tYXAoKTsKKworICAgIG1hcCYgb3BlcmF0b3I9KGNvbnN0IG1hcCYgbSk7CisgICAgbWFwJiBvcGVyYXRvcj0obWFwJiYgbSkKKyAgICAgICAgbm9leGNlcHQoCisgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ6OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxrZXlfY29tcGFyZT46OnZhbHVlKTsKKyAgICBtYXAmIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IGlsKTsKKworICAgIC8vIGl0ZXJhdG9yczoKKyAgICAgICAgICBpdGVyYXRvciBiZWdpbigpIG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgICAgICAgaXRlcmF0b3IgZW5kKCkgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICBjb25zdCBub2V4Y2VwdDsKKworICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCBub2V4Y2VwdDsKKyAgICAgICAgICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBub2V4Y2VwdDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSAgIGNvbnN0IG5vZXhjZXB0OworCisgICAgY29uc3RfaXRlcmF0b3IgICAgICAgICBjYmVnaW4oKSAgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgICAgICAgICBjZW5kKCkgICAgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmVuZCgpICAgY29uc3Qgbm9leGNlcHQ7CisKKyAgICAvLyBjYXBhY2l0eToKKyAgICBib29sICAgICAgZW1wdHkoKSAgICBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgc2l6ZSgpICAgICBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIC8vIGVsZW1lbnQgYWNjZXNzOgorICAgIG1hcHBlZF90eXBlJiBvcGVyYXRvcltdKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBtYXBwZWRfdHlwZSYgb3BlcmF0b3JbXShrZXlfdHlwZSYmIGspOworCisgICAgICAgICAgbWFwcGVkX3R5cGUmIGF0KGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBjb25zdCBtYXBwZWRfdHlwZSYgYXQoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworCisgICAgLy8gbW9kaWZpZXJzOgorICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorICAgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBlbXBsYWNlKEFyZ3MmJi4uLiBhcmdzKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KKyAgICAgICAgaXRlcmF0b3IgZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCBBcmdzJiYuLi4gYXJncyk7CisgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIHYpOworICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydCggICAgICB2YWx1ZV90eXBlJiYgdik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgIHRlbXBsYXRlIDxjbGFzcyBQPgorICAgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnQoUCYmIHApOworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgdik7CisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCAgICAgICB2YWx1ZV90eXBlJiYgdik7ICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgdGVtcGxhdGUgPGNsYXNzIFA+CisgICAgICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgUCYmIHApOworICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkIGluc2VydChJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QpOworICAgIHZvaWQgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwpOworCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CisgICAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IHRyeV9lbXBsYWNlKGNvbnN0IGtleV90eXBlJiBrLCBBcmdzJiYuLi4gYXJncyk7ICAgICAgICAgIC8vIEMrKzE3CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CisgICAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IHRyeV9lbXBsYWNlKGtleV90eXBlJiYgaywgQXJncyYmLi4uIGFyZ3MpOyAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CisgICAgICAgIGl0ZXJhdG9yIHRyeV9lbXBsYWNlKGNvbnN0X2l0ZXJhdG9yIGhpbnQsIGNvbnN0IGtleV90eXBlJiBrLCBBcmdzJiYuLi4gYXJncyk7IC8vIEMrKzE3CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CisgICAgICAgIGl0ZXJhdG9yIHRyeV9lbXBsYWNlKGNvbnN0X2l0ZXJhdG9yIGhpbnQsIGtleV90eXBlJiYgaywgQXJncyYmLi4uIGFyZ3MpOyAgICAgIC8vIEMrKzE3CisgICAgdGVtcGxhdGUgPGNsYXNzIE0+CisgICAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydF9vcl9hc3NpZ24oY29uc3Qga2V5X3R5cGUmIGssIE0mJiBvYmopOyAgICAgICAgICAgIC8vIEMrKzE3CisgICAgdGVtcGxhdGUgPGNsYXNzIE0+CisgICAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydF9vcl9hc3NpZ24oa2V5X3R5cGUmJiBrLCBNJiYgb2JqKTsgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgdGVtcGxhdGUgPGNsYXNzIE0+CisgICAgICAgIGl0ZXJhdG9yIGluc2VydF9vcl9hc3NpZ24oY29uc3RfaXRlcmF0b3IgaGludCwgY29uc3Qga2V5X3R5cGUmIGssIE0mJiBvYmopOyAgIC8vIEMrKzE3CisgICAgdGVtcGxhdGUgPGNsYXNzIE0+CisgICAgICAgIGl0ZXJhdG9yIGluc2VydF9vcl9hc3NpZ24oY29uc3RfaXRlcmF0b3IgaGludCwga2V5X3R5cGUmJiBrLCBNJiYgb2JqKTsgICAgICAgIC8vIEMrKzE3CisKKyAgICBpdGVyYXRvciAgZXJhc2UoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24pOworICAgIGl0ZXJhdG9yICBlcmFzZShpdGVyYXRvciBwb3NpdGlvbik7IC8vIEMrKzE0CisgICAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBpdGVyYXRvciAgZXJhc2UoY29uc3RfaXRlcmF0b3IgZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIGxhc3QpOworICAgIHZvaWQgY2xlYXIoKSBub2V4Y2VwdDsKKworICAgIHZvaWQgc3dhcChtYXAmIG0pCisgICAgICAgIG5vZXhjZXB0KGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+Ojppc19hbHdheXNfZXF1YWw6OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X3N3YXBwYWJsZTxrZXlfY29tcGFyZT46OnZhbHVlKTsgLy8gQysrMTcKKworICAgIC8vIG9ic2VydmVyczoKKyAgICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3Qgbm9leGNlcHQ7CisgICAga2V5X2NvbXBhcmUgICAga2V5X2NvbXAoKSAgICAgIGNvbnN0OworICAgIHZhbHVlX2NvbXBhcmUgIHZhbHVlX2NvbXAoKSAgICBjb25zdDsKKworICAgIC8vIG1hcCBvcGVyYXRpb25zOgorICAgICAgICAgIGl0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUmIGspOworICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEs+CisgICAgICAgIGl0ZXJhdG9yIGZpbmQoY29uc3QgSyYgeCk7ICAgICAgICAgICAgICAvLyBDKysxNAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEs+CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgSyYgeCkgY29uc3Q7ICAvLyBDKysxNAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEs+CisgICAgICBzaXplX3R5cGUgY291bnQoY29uc3QgSyYgeCkgY29uc3Q7ICAgICAgICAvLyBDKysxNAorCisgICAgc2l6ZV90eXBlICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworICAgICAgICAgIGl0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBjb25zdF9pdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSz4KKyAgICAgICAgaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3QgSyYgeCk7ICAgICAgICAgICAgICAvLyBDKysxNAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEs+CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IEsmIHgpIGNvbnN0OyAgLy8gQysrMTQKKworICAgICAgICAgIGl0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSz4KKyAgICAgICAgaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgSyYgeCk7ICAgICAgICAgICAgICAvLyBDKysxNAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEs+CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IEsmIHgpIGNvbnN0OyAgLy8gQysrMTQKKworICAgIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+ICAgICAgICAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSz4KKyAgICAgICAgcGFpcjxpdGVyYXRvcixpdGVyYXRvcj4gICAgICAgICAgICAgZXF1YWxfcmFuZ2UoY29uc3QgSyYgeCk7ICAgICAgICAvLyBDKysxNAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEs+CisgICAgICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IEsmIHgpIGNvbnN0OyAgLy8gQysrMTQKK307CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIENvbXBhcmUsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgbWFwPEtleSwgVCwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeCwKKyAgICAgICAgICAgY29uc3QgbWFwPEtleSwgVCwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIENvbXBhcmUsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wKK29wZXJhdG9yPCAoY29uc3QgbWFwPEtleSwgVCwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeCwKKyAgICAgICAgICAgY29uc3QgbWFwPEtleSwgVCwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIENvbXBhcmUsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wKK29wZXJhdG9yIT0oY29uc3QgbWFwPEtleSwgVCwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeCwKKyAgICAgICAgICAgY29uc3QgbWFwPEtleSwgVCwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIENvbXBhcmUsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wKK29wZXJhdG9yPiAoY29uc3QgbWFwPEtleSwgVCwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeCwKKyAgICAgICAgICAgY29uc3QgbWFwPEtleSwgVCwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIENvbXBhcmUsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wKK29wZXJhdG9yPj0oY29uc3QgbWFwPEtleSwgVCwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeCwKKyAgICAgICAgICAgY29uc3QgbWFwPEtleSwgVCwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIENvbXBhcmUsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wKK29wZXJhdG9yPD0oY29uc3QgbWFwPEtleSwgVCwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeCwKKyAgICAgICAgICAgY29uc3QgbWFwPEtleSwgVCwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeSk7CisKKy8vIHNwZWNpYWxpemVkIGFsZ29yaXRobXM6Cit0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBULCBjbGFzcyBDb21wYXJlLCBjbGFzcyBBbGxvY2F0b3I+Cit2b2lkCitzd2FwKG1hcDxLZXksIFQsIENvbXBhcmUsIEFsbG9jYXRvcj4mIHgsIG1hcDxLZXksIFQsIENvbXBhcmUsIEFsbG9jYXRvcj4mIHkpCisgICAgbm9leGNlcHQobm9leGNlcHQoeC5zd2FwKHkpKSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIENvbXBhcmUgPSBsZXNzPEtleT4sCisgICAgICAgICAgY2xhc3MgQWxsb2NhdG9yID0gYWxsb2NhdG9yPHBhaXI8Y29uc3QgS2V5LCBUPj4+CitjbGFzcyBtdWx0aW1hcAoreworcHVibGljOgorICAgIC8vIHR5cGVzOgorICAgIHR5cGVkZWYgS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICB0eXBlZGVmIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkX3R5cGU7CisgICAgdHlwZWRlZiBwYWlyPGNvbnN0IGtleV90eXBlLG1hcHBlZF90eXBlPiAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBDb21wYXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9jb21wYXJlOworICAgIHR5cGVkZWYgQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpyZWZlcmVuY2UgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnBvaW50ZXIgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OmNvbnN0X3BvaW50ZXIgICBjb25zdF9wb2ludGVyOworCisgICAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgaW1wbGVtZW50YXRpb24tZGVmaW5lZCAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgIGNsYXNzIHZhbHVlX2NvbXBhcmUKKyAgICAgICAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPHZhbHVlX3R5cGUsdmFsdWVfdHlwZSxib29sPgorICAgIHsKKyAgICAgICAgZnJpZW5kIGNsYXNzIG11bHRpbWFwOworICAgIHByb3RlY3RlZDoKKyAgICAgICAga2V5X2NvbXBhcmUgY29tcDsKKyAgICAgICAgdmFsdWVfY29tcGFyZShrZXlfY29tcGFyZSBjKTsKKyAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCB2YWx1ZV90eXBlJiB4LCBjb25zdCB2YWx1ZV90eXBlJiB5KSBjb25zdDsKKyAgICB9OworCisgICAgLy8gY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICBtdWx0aW1hcCgpCisgICAgICAgIG5vZXhjZXB0KAorICAgICAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8a2V5X2NvbXBhcmU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8a2V5X2NvbXBhcmU+Ojp2YWx1ZSk7CisgICAgZXhwbGljaXQgbXVsdGltYXAoY29uc3Qga2V5X2NvbXBhcmUmIGNvbXApOworICAgIG11bHRpbWFwKGNvbnN0IGtleV9jb21wYXJlJiBjb21wLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIG11bHRpbWFwKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwgY29uc3Qga2V5X2NvbXBhcmUmIGNvbXApOworICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICBtdWx0aW1hcChJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIGNvbnN0IGtleV9jb21wYXJlJiBjb21wLAorICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7CisgICAgbXVsdGltYXAoY29uc3QgbXVsdGltYXAmIG0pOworICAgIG11bHRpbWFwKG11bHRpbWFwJiYgbSkKKyAgICAgICAgbm9leGNlcHQoCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxrZXlfY29tcGFyZT46OnZhbHVlKTsKKyAgICBleHBsaWNpdCBtdWx0aW1hcChjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7CisgICAgbXVsdGltYXAoY29uc3QgbXVsdGltYXAmIG0sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsKKyAgICBtdWx0aW1hcChtdWx0aW1hcCYmIG0sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsKKyAgICBtdWx0aW1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IGlsLCBjb25zdCBrZXlfY29tcGFyZSYgY29tcCA9IGtleV9jb21wYXJlKCkpOworICAgIG11bHRpbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwsIGNvbnN0IGtleV9jb21wYXJlJiBjb21wLAorICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgbXVsdGltYXAoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSkKKyAgICAgICAgICAgIDogbXVsdGltYXAoZmlyc3QsIGxhc3QsIENvbXBhcmUoKSwgYSkge30gLy8gQysrMTQKKyAgICBtdWx0aW1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IGlsLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSkKKyAgICAgICAgOiBtdWx0aW1hcChpbCwgQ29tcGFyZSgpLCBhKSB7fSAvLyBDKysxNAorICAgIH5tdWx0aW1hcCgpOworCisgICAgbXVsdGltYXAmIG9wZXJhdG9yPShjb25zdCBtdWx0aW1hcCYgbSk7CisgICAgbXVsdGltYXAmIG9wZXJhdG9yPShtdWx0aW1hcCYmIG0pCisgICAgICAgIG5vZXhjZXB0KAorICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8a2V5X2NvbXBhcmU+Ojp2YWx1ZSk7CisgICAgbXVsdGltYXAmIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IGlsKTsKKworICAgIC8vIGl0ZXJhdG9yczoKKyAgICAgICAgICBpdGVyYXRvciBiZWdpbigpIG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgICAgICAgaXRlcmF0b3IgZW5kKCkgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICBjb25zdCBub2V4Y2VwdDsKKworICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCBub2V4Y2VwdDsKKyAgICAgICAgICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBub2V4Y2VwdDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSAgIGNvbnN0IG5vZXhjZXB0OworCisgICAgY29uc3RfaXRlcmF0b3IgICAgICAgICBjYmVnaW4oKSAgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgICAgICAgICBjZW5kKCkgICAgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmVuZCgpICAgY29uc3Qgbm9leGNlcHQ7CisKKyAgICAvLyBjYXBhY2l0eToKKyAgICBib29sICAgICAgZW1wdHkoKSAgICBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgc2l6ZSgpICAgICBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIC8vIG1vZGlmaWVyczoKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KKyAgICAgICAgaXRlcmF0b3IgZW1wbGFjZShBcmdzJiYuLi4gYXJncyk7CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CisgICAgICAgIGl0ZXJhdG9yIGVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgQXJncyYmLi4uIGFyZ3MpOworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiB2KTsKKyAgICBpdGVyYXRvciBpbnNlcnQoICAgICAgdmFsdWVfdHlwZSYmIHYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUD4KKyAgICAgICAgaXRlcmF0b3IgaW5zZXJ0KFAmJiBwKTsKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIHYpOworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgICAgICAgdmFsdWVfdHlwZSYmIHYpOyAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgIHRlbXBsYXRlIDxjbGFzcyBQPgorICAgICAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24sIFAmJiBwKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZCBpbnNlcnQoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0KTsKKyAgICB2b2lkIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IGlsKTsKKworICAgIGl0ZXJhdG9yICBlcmFzZShjb25zdF9pdGVyYXRvciBwb3NpdGlvbik7CisgICAgaXRlcmF0b3IgIGVyYXNlKGl0ZXJhdG9yIHBvc2l0aW9uKTsgLy8gQysrMTQKKyAgICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIGspOworICAgIGl0ZXJhdG9yICBlcmFzZShjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCk7CisgICAgdm9pZCBjbGVhcigpIG5vZXhjZXB0OworCisgICAgdm9pZCBzd2FwKG11bHRpbWFwJiBtKQorICAgICAgICBub2V4Y2VwdChhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPjo6aXNfYWx3YXlzX2VxdWFsOjp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19zd2FwcGFibGU8a2V5X2NvbXBhcmU+Ojp2YWx1ZSk7IC8vIEMrKzE3CisKKyAgICAvLyBvYnNlcnZlcnM6CisgICAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IG5vZXhjZXB0OworICAgIGtleV9jb21wYXJlICAgIGtleV9jb21wKCkgICAgICBjb25zdDsKKyAgICB2YWx1ZV9jb21wYXJlICB2YWx1ZV9jb21wKCkgICAgY29uc3Q7CisKKyAgICAvLyBtYXAgb3BlcmF0aW9uczoKKyAgICAgICAgICBpdGVyYXRvciBmaW5kKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IGtleV90eXBlJiBrKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLPgorICAgICAgICBpdGVyYXRvciBmaW5kKGNvbnN0IEsmIHgpOyAgICAgICAgICAgICAgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLPgorICAgICAgICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IEsmIHgpIGNvbnN0OyAgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLPgorICAgICAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IEsmIHgpIGNvbnN0OyAgICAgICAgLy8gQysrMTQKKworICAgIHNpemVfdHlwZSAgICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBrKSBjb25zdDsKKyAgICAgICAgICBpdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgayk7CisgICAgY29uc3RfaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEs+CisgICAgICAgIGl0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IEsmIHgpOyAgICAgICAgICAgICAgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLPgorICAgICAgICBjb25zdF9pdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBLJiB4KSBjb25zdDsgIC8vIEMrKzE0CisKKyAgICAgICAgICBpdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgayk7CisgICAgY29uc3RfaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEs+CisgICAgICAgIGl0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IEsmIHgpOyAgICAgICAgICAgICAgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLPgorICAgICAgICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBLJiB4KSBjb25zdDsgIC8vIEMrKzE0CisKKyAgICBwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPiAgICAgICAgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgayk7CisgICAgcGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEs+CisgICAgICAgIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+ICAgICAgICAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IEsmIHgpOyAgICAgICAgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLPgorICAgICAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBLJiB4KSBjb25zdDsgIC8vIEMrKzE0Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBULCBjbGFzcyBDb21wYXJlLCBjbGFzcyBBbGxvY2F0b3I+Citib29sCitvcGVyYXRvcj09KGNvbnN0IG11bHRpbWFwPEtleSwgVCwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeCwKKyAgICAgICAgICAgY29uc3QgbXVsdGltYXA8S2V5LCBULCBDb21wYXJlLCBBbGxvY2F0b3I+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVCwgY2xhc3MgQ29tcGFyZSwgY2xhc3MgQWxsb2NhdG9yPgorYm9vbAorb3BlcmF0b3I8IChjb25zdCBtdWx0aW1hcDxLZXksIFQsIENvbXBhcmUsIEFsbG9jYXRvcj4mIHgsCisgICAgICAgICAgIGNvbnN0IG11bHRpbWFwPEtleSwgVCwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIENvbXBhcmUsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wKK29wZXJhdG9yIT0oY29uc3QgbXVsdGltYXA8S2V5LCBULCBDb21wYXJlLCBBbGxvY2F0b3I+JiB4LAorICAgICAgICAgICBjb25zdCBtdWx0aW1hcDxLZXksIFQsIENvbXBhcmUsIEFsbG9jYXRvcj4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBULCBjbGFzcyBDb21wYXJlLCBjbGFzcyBBbGxvY2F0b3I+Citib29sCitvcGVyYXRvcj4gKGNvbnN0IG11bHRpbWFwPEtleSwgVCwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeCwKKyAgICAgICAgICAgY29uc3QgbXVsdGltYXA8S2V5LCBULCBDb21wYXJlLCBBbGxvY2F0b3I+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVCwgY2xhc3MgQ29tcGFyZSwgY2xhc3MgQWxsb2NhdG9yPgorYm9vbAorb3BlcmF0b3I+PShjb25zdCBtdWx0aW1hcDxLZXksIFQsIENvbXBhcmUsIEFsbG9jYXRvcj4mIHgsCisgICAgICAgICAgIGNvbnN0IG11bHRpbWFwPEtleSwgVCwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIENvbXBhcmUsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wKK29wZXJhdG9yPD0oY29uc3QgbXVsdGltYXA8S2V5LCBULCBDb21wYXJlLCBBbGxvY2F0b3I+JiB4LAorICAgICAgICAgICBjb25zdCBtdWx0aW1hcDxLZXksIFQsIENvbXBhcmUsIEFsbG9jYXRvcj4mIHkpOworCisvLyBzcGVjaWFsaXplZCBhbGdvcml0aG1zOgordGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVCwgY2xhc3MgQ29tcGFyZSwgY2xhc3MgQWxsb2NhdG9yPgordm9pZAorc3dhcChtdWx0aW1hcDxLZXksIFQsIENvbXBhcmUsIEFsbG9jYXRvcj4mIHgsCisgICAgIG11bHRpbWFwPEtleSwgVCwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeSkKKyAgICBub2V4Y2VwdChub2V4Y2VwdCh4LnN3YXAoeSkpKTsKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxfX3RyZWU+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ1AsIGNsYXNzIF9Db21wYXJlLCBib29sIF9Jc1NtYWxsPgorY2xhc3MgX19tYXBfdmFsdWVfY29tcGFyZQorICAgIDogcHJpdmF0ZSBfQ29tcGFyZQoreworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX21hcF92YWx1ZV9jb21wYXJlKCkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxfQ29tcGFyZT46OnZhbHVlKQorICAgICAgICA6IF9Db21wYXJlKCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19tYXBfdmFsdWVfY29tcGFyZShfQ29tcGFyZSBjKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPF9Db21wYXJlPjo6dmFsdWUpCisgICAgICAgIDogX0NvbXBhcmUoYykge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgX0NvbXBhcmUmIGtleV9jb21wKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX0NQJiBfX3gsIGNvbnN0IF9DUCYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9Db21wYXJlJj4oKnRoaXMpKF9feC5fX2NjLmZpcnN0LCBfX3kuX19jYy5maXJzdCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX0NQJiBfX3gsIGNvbnN0IF9LZXkmIF9feSkgY29uc3QKKyAgICAgICAge3JldHVybiBzdGF0aWNfY2FzdDxjb25zdCBfQ29tcGFyZSY+KCp0aGlzKShfX3guX19jYy5maXJzdCwgX195KTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfS2V5JiBfX3gsIGNvbnN0IF9DUCYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9Db21wYXJlJj4oKnRoaXMpKF9feCwgX195Ll9fY2MuZmlyc3QpO30KKyAgICB2b2lkIHN3YXAoX19tYXBfdmFsdWVfY29tcGFyZSZfX3kpCisgICAgICAgIF9OT0VYQ0VQVF8oX19pc19ub3Rocm93X3N3YXBwYWJsZTxfQ29tcGFyZT46OnZhbHVlKQorICAgIHsKKyAgICAgIHVzaW5nIF9WU1REOjpzd2FwOworICAgICAgc3dhcChzdGF0aWNfY2FzdDxfQ29tcGFyZSY+KCp0aGlzKSwgc3RhdGljX2Nhc3Q8X0NvbXBhcmUmPihfX3kpKTsKKyAgICB9CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfSzI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3RyYW5zcGFyZW50PF9Db21wYXJlLCBfSzI+Ojp2YWx1ZSwgYm9vbD46OnR5cGUKKyAgICBvcGVyYXRvciAoKSAoIGNvbnN0IF9LMiYgX194LCBjb25zdCBfQ1AmIF9feSApIGNvbnN0CisgICAgICAgIHtyZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgX0NvbXBhcmUmPigqdGhpcykgKF9feCwgX195Ll9fY2MuZmlyc3QpO30KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfSzI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3RyYW5zcGFyZW50PF9Db21wYXJlLCBfSzI+Ojp2YWx1ZSwgYm9vbD46OnR5cGUKKyAgICBvcGVyYXRvciAoKSAoY29uc3QgX0NQJiBfX3gsIGNvbnN0IF9LMiYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9Db21wYXJlJj4oKnRoaXMpIChfX3guX19jYy5maXJzdCwgX195KTt9CisjZW5kaWYKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ1AsIGNsYXNzIF9Db21wYXJlPgorY2xhc3MgX19tYXBfdmFsdWVfY29tcGFyZTxfS2V5LCBfQ1AsIF9Db21wYXJlLCBmYWxzZT4KK3sKKyAgICBfQ29tcGFyZSBjb21wOworCitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fbWFwX3ZhbHVlX2NvbXBhcmUoKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9Db21wYXJlPjo6dmFsdWUpCisgICAgICAgIDogY29tcCgpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fbWFwX3ZhbHVlX2NvbXBhcmUoX0NvbXBhcmUgYykKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZTxfQ29tcGFyZT46OnZhbHVlKQorICAgICAgICA6IGNvbXAoYykge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgX0NvbXBhcmUmIGtleV9jb21wKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gY29tcDt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9DUCYgX194LCBjb25zdCBfQ1AmIF9feSkgY29uc3QKKyAgICAgICAge3JldHVybiBjb21wKF9feC5fX2NjLmZpcnN0LCBfX3kuX19jYy5maXJzdCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX0NQJiBfX3gsIGNvbnN0IF9LZXkmIF9feSkgY29uc3QKKyAgICAgICAge3JldHVybiBjb21wKF9feC5fX2NjLmZpcnN0LCBfX3kpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9LZXkmIF9feCwgY29uc3QgX0NQJiBfX3kpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gY29tcChfX3gsIF9feS5fX2NjLmZpcnN0KTt9CisgICAgdm9pZCBzd2FwKF9fbWFwX3ZhbHVlX2NvbXBhcmUmX195KQorICAgICAgICBfTk9FWENFUFRfKF9faXNfbm90aHJvd19zd2FwcGFibGU8X0NvbXBhcmU+Ojp2YWx1ZSkKKyAgICB7CisgICAgICAgIHVzaW5nIF9WU1REOjpzd2FwOworICAgICAgICBzd2FwKGNvbXAsIF9feS5jb21wKTsKKyAgICB9CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfSzI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3RyYW5zcGFyZW50PF9Db21wYXJlLCBfSzI+Ojp2YWx1ZSwgYm9vbD46OnR5cGUKKyAgICBvcGVyYXRvciAoKSAoIGNvbnN0IF9LMiYgX194LCBjb25zdCBfQ1AmIF9feSApIGNvbnN0CisgICAgICAgIHtyZXR1cm4gY29tcCAoX194LCBfX3kuX19jYy5maXJzdCk7fQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9LMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfdHJhbnNwYXJlbnQ8X0NvbXBhcmUsIF9LMj46OnZhbHVlLCBib29sPjo6dHlwZQorICAgIG9wZXJhdG9yICgpIChjb25zdCBfQ1AmIF9feCwgY29uc3QgX0syJiBfX3kpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gY29tcCAoX194Ll9fY2MuZmlyc3QsIF9feSk7fQorI2VuZGlmCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NQLCBjbGFzcyBfQ29tcGFyZSwgYm9vbCBfX2I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChfX21hcF92YWx1ZV9jb21wYXJlPF9LZXksIF9DUCwgX0NvbXBhcmUsIF9fYj4mIF9feCwKKyAgICAgX19tYXBfdmFsdWVfY29tcGFyZTxfS2V5LCBfQ1AsIF9Db21wYXJlLCBfX2I+JiBfX3kpCisgICAgX05PRVhDRVBUXyhfTk9FWENFUFRfKF9feC5zd2FwKF9feSkpKQoreworICAgIF9feC5zd2FwKF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgorY2xhc3MgX19tYXBfbm9kZV9kZXN0cnVjdG9yCit7CisgICAgdHlwZWRlZiBfQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+ICAgIF9fYWxsb2NfdHJhaXRzOworCitwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2FsbG9jX3RyYWl0czo6cG9pbnRlciAgICBwb2ludGVyOworCitwcml2YXRlOgorICAgIGFsbG9jYXRvcl90eXBlJiBfX25hXzsKKworICAgIF9fbWFwX25vZGVfZGVzdHJ1Y3RvciYgb3BlcmF0b3I9KGNvbnN0IF9fbWFwX25vZGVfZGVzdHJ1Y3RvciYpOworCitwdWJsaWM6CisgICAgYm9vbCBfX2ZpcnN0X2NvbnN0cnVjdGVkOworICAgIGJvb2wgX19zZWNvbmRfY29uc3RydWN0ZWQ7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19tYXBfbm9kZV9kZXN0cnVjdG9yKGFsbG9jYXRvcl90eXBlJiBfX25hKSBfTk9FWENFUFQKKyAgICAgICAgOiBfX25hXyhfX25hKSwKKyAgICAgICAgICBfX2ZpcnN0X2NvbnN0cnVjdGVkKGZhbHNlKSwKKyAgICAgICAgICBfX3NlY29uZF9jb25zdHJ1Y3RlZChmYWxzZSkKKyAgICAgICAge30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19tYXBfbm9kZV9kZXN0cnVjdG9yKF9fdHJlZV9ub2RlX2Rlc3RydWN0b3I8YWxsb2NhdG9yX3R5cGU+JiYgX194KSBfTk9FWENFUFQKKyAgICAgICAgOiBfX25hXyhfX3guX19uYV8pLAorICAgICAgICAgIF9fZmlyc3RfY29uc3RydWN0ZWQoX194Ll9fdmFsdWVfY29uc3RydWN0ZWQpLAorICAgICAgICAgIF9fc2Vjb25kX2NvbnN0cnVjdGVkKF9feC5fX3ZhbHVlX2NvbnN0cnVjdGVkKQorICAgICAgICB7CisgICAgICAgICAgICBfX3guX192YWx1ZV9jb25zdHJ1Y3RlZCA9IGZhbHNlOworICAgICAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgb3BlcmF0b3IoKShwb2ludGVyIF9fcCkgX05PRVhDRVBUCisgICAgeworICAgICAgICBpZiAoX19zZWNvbmRfY29uc3RydWN0ZWQpCisgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6ZGVzdHJveShfX25hXywgX1ZTVEQ6OmFkZHJlc3NvZihfX3AtPl9fdmFsdWVfLl9fY2Muc2Vjb25kKSk7CisgICAgICAgIGlmIChfX2ZpcnN0X2NvbnN0cnVjdGVkKQorICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmRlc3Ryb3koX19uYV8sIF9WU1REOjphZGRyZXNzb2YoX19wLT5fX3ZhbHVlXy5fX2NjLmZpcnN0KSk7CisgICAgICAgIGlmIChfX3ApCisgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6ZGVhbGxvY2F0ZShfX25hXywgX19wLCAxKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KKyAgICBjbGFzcyBtYXA7Cit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KKyAgICBjbGFzcyBtdWx0aW1hcDsKK3RlbXBsYXRlIDxjbGFzcyBfVHJlZUl0ZXJhdG9yPiBjbGFzcyBfX21hcF9jb25zdF9pdGVyYXRvcjsKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcD4KK3VuaW9uIF9fdmFsdWVfdHlwZQoreworICAgIHR5cGVkZWYgX0tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkX3R5cGU7CisgICAgdHlwZWRlZiBwYWlyPGNvbnN0IGtleV90eXBlLCBtYXBwZWRfdHlwZT4gICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBwYWlyPGtleV90eXBlLCBtYXBwZWRfdHlwZT4gICAgICAgICAgICAgIF9fbmNfdmFsdWVfdHlwZTsKKworICAgIHZhbHVlX3R5cGUgX19jYzsKKyAgICBfX25jX3ZhbHVlX3R5cGUgX19uYzsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3ZhbHVlX3R5cGUmIG9wZXJhdG9yPShjb25zdCBfX3ZhbHVlX3R5cGUmIF9fdikKKyAgICAgICAge19fbmMgPSBfX3YuX19jYzsgcmV0dXJuICp0aGlzO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3ZhbHVlX3R5cGUmIG9wZXJhdG9yPShfX3ZhbHVlX3R5cGUmJiBfX3YpCisgICAgICAgIHtfX25jID0gX1ZTVEQ6Om1vdmUoX192Ll9fbmMpOyByZXR1cm4gKnRoaXM7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9WYWx1ZVRwLAorICAgICAgICAgICAgICBjbGFzcyA9IHR5cGVuYW1lIGVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgICAgX19pc19zYW1lX3VuY3ZyZWY8X1ZhbHVlVHAsIHZhbHVlX3R5cGU+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgICAgICAgICAgPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3ZhbHVlX3R5cGUmIG9wZXJhdG9yPShfVmFsdWVUcCYmIF9fdikgeworICAgICAgICBfX25jID0gX1ZTVEQ6OmZvcndhcmQ8X1ZhbHVlVHA+KF9fdik7IHJldHVybiAqdGhpczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgX192YWx1ZV90eXBlKCkgX0xJQkNQUF9FUVVBTF9ERUxFVEU7CisgICAgfl9fdmFsdWVfdHlwZSgpIF9MSUJDUFBfRVFVQUxfREVMRVRFOworICAgIF9fdmFsdWVfdHlwZShjb25zdCBfX3ZhbHVlX3R5cGUmIF9fdikgX0xJQkNQUF9FUVVBTF9ERUxFVEU7CisgICAgX192YWx1ZV90eXBlKF9fdmFsdWVfdHlwZSYmIF9fdikgX0xJQkNQUF9FUVVBTF9ERUxFVEU7Cit9OworCisjZWxzZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwPgorc3RydWN0IF9fdmFsdWVfdHlwZQoreworICAgIHR5cGVkZWYgX0tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkX3R5cGU7CisgICAgdHlwZWRlZiBwYWlyPGNvbnN0IGtleV90eXBlLCBtYXBwZWRfdHlwZT4gICAgICAgIHZhbHVlX3R5cGU7CisKKyAgICB2YWx1ZV90eXBlIF9fY2M7CisKK3ByaXZhdGU6CisgICBfX3ZhbHVlX3R5cGUoKTsKKyAgIF9fdmFsdWVfdHlwZShfX3ZhbHVlX3R5cGUgY29uc3QmKTsKKyAgIF9fdmFsdWVfdHlwZSYgb3BlcmF0b3I9KF9fdmFsdWVfdHlwZSBjb25zdCYpOworICAgfl9fdmFsdWVfdHlwZSgpOworfTsKKworI2VuZGlmIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fZXh0cmFjdF9rZXlfdmFsdWVfdHlwZXM7CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHA+CitzdHJ1Y3QgX19leHRyYWN0X2tleV92YWx1ZV90eXBlczxfX3ZhbHVlX3R5cGU8X0tleSwgX1RwPiA+Cit7CisgIHR5cGVkZWYgX0tleSBjb25zdCBfX2tleV90eXBlOworICB0eXBlZGVmIF9UcCAgICAgICAgX19tYXBwZWRfdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHJlZUl0ZXJhdG9yPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19tYXBfaXRlcmF0b3IKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmVlSXRlcmF0b3I6Ol9Ob2RlVHlwZXMgICAgICAgICAgICAgICAgICAgX05vZGVUeXBlczsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmVlSXRlcmF0b3I6Ol9fcG9pbnRlcl90cmFpdHMgICAgICAgICAgICAgX19wb2ludGVyX3RyYWl0czsKKworICAgIF9UcmVlSXRlcmF0b3IgX19pXzsKKworcHVibGljOgorICAgIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6Ol9fbWFwX3ZhbHVlX3R5cGUgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmVlSXRlcmF0b3I6OmRpZmZlcmVuY2VfdHlwZSAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjpfX21hcF92YWx1ZV90eXBlX3BvaW50ZXIgICAgICAgIHBvaW50ZXI7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19tYXBfaXRlcmF0b3IoKSBfTk9FWENFUFQge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX21hcF9pdGVyYXRvcihfVHJlZUl0ZXJhdG9yIF9faSkgX05PRVhDRVBUIDogX19pXyhfX2kpIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHtyZXR1cm4gX19pXy0+X19jYzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHtyZXR1cm4gcG9pbnRlcl90cmFpdHM8cG9pbnRlcj46OnBvaW50ZXJfdG8oX19pXy0+X19jYyk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fbWFwX2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeysrX19pXzsgcmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19tYXBfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpCisgICAgeworICAgICAgICBfX21hcF9pdGVyYXRvciBfX3QoKnRoaXMpOworICAgICAgICArKygqdGhpcyk7CisgICAgICAgIHJldHVybiBfX3Q7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fbWFwX2l0ZXJhdG9yJiBvcGVyYXRvci0tKCkgey0tX19pXzsgcmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19tYXBfaXRlcmF0b3Igb3BlcmF0b3ItLShpbnQpCisgICAgeworICAgICAgICBfX21hcF9pdGVyYXRvciBfX3QoKnRoaXMpOworICAgICAgICAtLSgqdGhpcyk7CisgICAgICAgIHJldHVybiBfX3Q7CisgICAgfQorCisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgX19tYXBfaXRlcmF0b3ImIF9feCwgY29uc3QgX19tYXBfaXRlcmF0b3ImIF9feSkKKyAgICAgICAge3JldHVybiBfX3guX19pXyA9PSBfX3kuX19pXzt9CisgICAgZnJpZW5kCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfX21hcF9pdGVyYXRvciYgX194LCBjb25zdCBfX21hcF9pdGVyYXRvciYgX195KQorICAgICAgICB7cmV0dXJuIF9feC5fX2lfICE9IF9feS5fX2lfO30KKworICAgIHRlbXBsYXRlIDxjbGFzcywgY2xhc3MsIGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIG1hcDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcywgY2xhc3M+IGZyaWVuZCBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBtdWx0aW1hcDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3M+IGZyaWVuZCBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX21hcF9jb25zdF9pdGVyYXRvcjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHJlZUl0ZXJhdG9yPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19tYXBfY29uc3RfaXRlcmF0b3IKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmVlSXRlcmF0b3I6Ol9Ob2RlVHlwZXMgICAgICAgICAgICAgICAgICAgX05vZGVUeXBlczsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmVlSXRlcmF0b3I6Ol9fcG9pbnRlcl90cmFpdHMgICAgICAgICAgICAgX19wb2ludGVyX3RyYWl0czsKKworICAgIF9UcmVlSXRlcmF0b3IgX19pXzsKKworcHVibGljOgorICAgIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6Ol9fbWFwX3ZhbHVlX3R5cGUgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmVlSXRlcmF0b3I6OmRpZmZlcmVuY2VfdHlwZSAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjpfX2NvbnN0X21hcF92YWx1ZV90eXBlX3BvaW50ZXIgIHBvaW50ZXI7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19tYXBfY29uc3RfaXRlcmF0b3IoKSBfTk9FWENFUFQge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX21hcF9jb25zdF9pdGVyYXRvcihfVHJlZUl0ZXJhdG9yIF9faSkgX05PRVhDRVBUIDogX19pXyhfX2kpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fbWFwX2NvbnN0X2l0ZXJhdG9yKF9fbWFwX2l0ZXJhdG9yPAorICAgICAgICB0eXBlbmFtZSBfVHJlZUl0ZXJhdG9yOjpfX25vbl9jb25zdF9pdGVyYXRvcj4gX19pKSBfTk9FWENFUFQKKyAgICAgICAgOiBfX2lfKF9faS5fX2lfKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7cmV0dXJuIF9faV8tPl9fY2M7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7cmV0dXJuIHBvaW50ZXJfdHJhaXRzPHBvaW50ZXI+Ojpwb2ludGVyX3RvKF9faV8tPl9fY2MpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX21hcF9jb25zdF9pdGVyYXRvciYgb3BlcmF0b3IrKygpIHsrK19faV87IHJldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fbWFwX2NvbnN0X2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KQorICAgIHsKKyAgICAgICAgX19tYXBfY29uc3RfaXRlcmF0b3IgX190KCp0aGlzKTsKKyAgICAgICAgKysoKnRoaXMpOworICAgICAgICByZXR1cm4gX190OworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX21hcF9jb25zdF9pdGVyYXRvciYgb3BlcmF0b3ItLSgpIHstLV9faV87IHJldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fbWFwX2NvbnN0X2l0ZXJhdG9yIG9wZXJhdG9yLS0oaW50KQorICAgIHsKKyAgICAgICAgX19tYXBfY29uc3RfaXRlcmF0b3IgX190KCp0aGlzKTsKKyAgICAgICAgLS0oKnRoaXMpOworICAgICAgICByZXR1cm4gX190OworICAgIH0KKworICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9fbWFwX2NvbnN0X2l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9fbWFwX2NvbnN0X2l0ZXJhdG9yJiBfX3kpCisgICAgICAgIHtyZXR1cm4gX194Ll9faV8gPT0gX195Ll9faV87fQorICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF9fbWFwX2NvbnN0X2l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9fbWFwX2NvbnN0X2l0ZXJhdG9yJiBfX3kpCisgICAgICAgIHtyZXR1cm4gX194Ll9faV8gIT0gX195Ll9faV87fQorCisgICAgdGVtcGxhdGUgPGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgbWFwOworICAgIHRlbXBsYXRlIDxjbGFzcywgY2xhc3MsIGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIG11bHRpbWFwOworICAgIHRlbXBsYXRlIDxjbGFzcywgY2xhc3MsIGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX190cmVlX2NvbnN0X2l0ZXJhdG9yOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUgPSBsZXNzPF9LZXk+LAorICAgICAgICAgIGNsYXNzIF9BbGxvY2F0b3IgPSBhbGxvY2F0b3I8cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgbWFwCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXM6CisgICAgdHlwZWRlZiBfS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRfdHlwZTsKKyAgICB0eXBlZGVmIHBhaXI8Y29uc3Qga2V5X3R5cGUsIG1hcHBlZF90eXBlPiAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHBhaXI8a2V5X3R5cGUsIG1hcHBlZF90eXBlPiAgICAgICAgICAgICAgX19uY192YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0NvbXBhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfY29tcGFyZTsKKyAgICB0eXBlZGVmIF9BbGxvY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgc3RhdGljX2Fzc2VydCgoaXNfc2FtZTx0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6dmFsdWVfdHlwZSwgdmFsdWVfdHlwZT46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICJBbGxvY2F0b3I6OnZhbHVlX3R5cGUgbXVzdCBiZSBzYW1lIHR5cGUgYXMgdmFsdWVfdHlwZSIpOworCisgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdmFsdWVfY29tcGFyZQorICAgICAgICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248dmFsdWVfdHlwZSwgdmFsdWVfdHlwZSwgYm9vbD4KKyAgICB7CisgICAgICAgIGZyaWVuZCBjbGFzcyBtYXA7CisgICAgcHJvdGVjdGVkOgorICAgICAgICBrZXlfY29tcGFyZSBjb21wOworCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdmFsdWVfY29tcGFyZShrZXlfY29tcGFyZSBjKSA6IGNvbXAoYykge30KKyAgICBwdWJsaWM6CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHZhbHVlX3R5cGUmIF9feCwgY29uc3QgdmFsdWVfdHlwZSYgX195KSBjb25zdAorICAgICAgICAgICAge3JldHVybiBjb21wKF9feC5maXJzdCwgX195LmZpcnN0KTt9CisgICAgfTsKKworcHJpdmF0ZToKKworICAgIHR5cGVkZWYgX1ZTVEQ6Ol9fdmFsdWVfdHlwZTxrZXlfdHlwZSwgbWFwcGVkX3R5cGU+ICAgICAgICAgICAgIF9fdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9fbWFwX3ZhbHVlX2NvbXBhcmU8a2V5X3R5cGUsIF9fdmFsdWVfdHlwZSwga2V5X2NvbXBhcmU+IF9fdmM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9hbGxvY19oZWxwZXI8YWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX192YWx1ZV90eXBlPjo6dHlwZSBfX2FsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgX190cmVlPF9fdmFsdWVfdHlwZSwgX192YywgX19hbGxvY2F0b3JfdHlwZT4gICBfX2Jhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6Ol9fbm9kZV90cmFpdHMgICAgICAgICAgICAgICAgIF9fbm9kZV90cmFpdHM7CisgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPiAgICAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOworCisgICAgX19iYXNlIF9fdHJlZV87CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpwb2ludGVyICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpjb25zdF9wb2ludGVyICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpzaXplX3R5cGUgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OmRpZmZlcmVuY2VfdHlwZSAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiBfX21hcF9pdGVyYXRvcjx0eXBlbmFtZSBfX2Jhc2U6Oml0ZXJhdG9yPiAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9fbWFwX2NvbnN0X2l0ZXJhdG9yPHR5cGVuYW1lIF9fYmFzZTo6Y29uc3RfaXRlcmF0b3I+IGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgX1ZTVEQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgICAgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9WU1REOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiAgICAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgbWFwKCkKKyAgICAgICAgX05PRVhDRVBUXygKKyAgICAgICAgICAgIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGtleV9jb21wYXJlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPGtleV9jb21wYXJlPjo6dmFsdWUpCisgICAgICAgIDogX190cmVlXyhfX3ZjKGtleV9jb21wYXJlKCkpKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IG1hcChjb25zdCBrZXlfY29tcGFyZSYgX19jb21wKQorICAgICAgICBfTk9FWENFUFRfKAorICAgICAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8a2V5X2NvbXBhcmU+Ojp2YWx1ZSkKKyAgICAgICAgOiBfX3RyZWVfKF9fdmMoX19jb21wKSkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBtYXAoY29uc3Qga2V5X2NvbXBhcmUmIF9fY29tcCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgICAgOiBfX3RyZWVfKF9fdmMoX19jb21wKSwgdHlwZW5hbWUgX19iYXNlOjphbGxvY2F0b3JfdHlwZShfX2EpKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorICAgICAgICAgICAgY29uc3Qga2V5X2NvbXBhcmUmIF9fY29tcCA9IGtleV9jb21wYXJlKCkpCisgICAgICAgIDogX190cmVlXyhfX3ZjKF9fY29tcCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluc2VydChfX2YsIF9fbCk7CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIG1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKyAgICAgICAgICAgIGNvbnN0IGtleV9jb21wYXJlJiBfX2NvbXAsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICAgIDogX190cmVlXyhfX3ZjKF9fY29tcCksIHR5cGVuYW1lIF9fYmFzZTo6YWxsb2NhdG9yX3R5cGUoX19hKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW5zZXJ0KF9fZiwgX19sKTsKKyAgICAgICAgfQorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgICAgOiBtYXAoX19mLCBfX2wsIGtleV9jb21wYXJlKCksIF9fYSkge30KKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG1hcChjb25zdCBtYXAmIF9fbSkKKyAgICAgICAgOiBfX3RyZWVfKF9fbS5fX3RyZWVfKQorICAgICAgICB7CisgICAgICAgICAgICBpbnNlcnQoX19tLmJlZ2luKCksIF9fbS5lbmQoKSk7CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBtYXAmIG9wZXJhdG9yPShjb25zdCBtYXAmIF9fbSkKKyAgICAgICAgeworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICAgICAgICAgIF9fdHJlZV8gPSBfX20uX190cmVlXzsKKyNlbHNlCisgICAgICAgICAgICBpZiAodGhpcyAhPSAmX19tKSB7CisgICAgICAgICAgICAgICAgX190cmVlXy5jbGVhcigpOworICAgICAgICAgICAgICAgIF9fdHJlZV8udmFsdWVfY29tcCgpID0gX19tLl9fdHJlZV8udmFsdWVfY29tcCgpOworICAgICAgICAgICAgICAgIF9fdHJlZV8uX19jb3B5X2Fzc2lnbl9hbGxvYyhfX20uX190cmVlXyk7CisgICAgICAgICAgICAgICAgaW5zZXJ0KF9fbS5iZWdpbigpLCBfX20uZW5kKCkpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBtYXAobWFwJiYgX19tKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPF9fYmFzZT46OnZhbHVlKQorICAgICAgICA6IF9fdHJlZV8oX1ZTVEQ6Om1vdmUoX19tLl9fdHJlZV8pKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgIG1hcChtYXAmJiBfX20sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG1hcCYgb3BlcmF0b3I9KG1hcCYmIF9fbSkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfX2Jhc2U+Ojp2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgX190cmVlXyA9IF9WU1REOjptb3ZlKF9fbS5fX3RyZWVfKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIGNvbnN0IGtleV9jb21wYXJlJiBfX2NvbXAgPSBrZXlfY29tcGFyZSgpKQorICAgICAgICA6IF9fdHJlZV8oX192YyhfX2NvbXApKQorICAgICAgICB7CisgICAgICAgICAgICBpbnNlcnQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKKyAgICAgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIGNvbnN0IGtleV9jb21wYXJlJiBfX2NvbXAsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICAgIDogX190cmVlXyhfX3ZjKF9fY29tcCksIHR5cGVuYW1lIF9fYmFzZTo6YWxsb2NhdG9yX3R5cGUoX19hKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW5zZXJ0KF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7CisgICAgICAgIH0KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICAgIDogbWFwKF9faWwsIGtleV9jb21wYXJlKCksIF9fYSkge30KKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG1hcCYgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkKKyAgICAgICAgeworICAgICAgICAgICAgX190cmVlXy5fX2Fzc2lnbl91bmlxdWUoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IG1hcChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgICA6IF9fdHJlZV8odHlwZW5hbWUgX19iYXNlOjphbGxvY2F0b3JfdHlwZShfX2EpKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBtYXAoY29uc3QgbWFwJiBfX20sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICAgIDogX190cmVlXyhfX20uX190cmVlXy52YWx1ZV9jb21wKCksIHR5cGVuYW1lIF9fYmFzZTo6YWxsb2NhdG9yX3R5cGUoX19hKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW5zZXJ0KF9fbS5iZWdpbigpLCBfX20uZW5kKCkpOworICAgICAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgaXRlcmF0b3IgYmVnaW4oKSBfTk9FWENFUFQge3JldHVybiBfX3RyZWVfLmJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdHJlZV8uYmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgIGl0ZXJhdG9yIGVuZCgpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fdHJlZV8uZW5kKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RyZWVfLmVuZCgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIF9OT0VYQ0VQVCB7cmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIF9OT0VYQ0VQVAorICAgICAgICAgICAge3JldHVybiAgICAgICByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gYmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGNlbmQoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBlbmQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY3JiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIHJiZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmVuZCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIHJlbmQoKTt9CisKKyAgICBfTElCQ1BQX05PRElTQ0FSRF9BRlRFUl9DWFgxNyBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCAgICAgIGVtcHR5KCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190cmVlXy5zaXplKCkgPT0gMDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190cmVlXy5zaXplKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RyZWVfLm1heF9zaXplKCk7fQorCisgICAgbWFwcGVkX3R5cGUmIG9wZXJhdG9yW10oY29uc3Qga2V5X3R5cGUmIF9fayk7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIG1hcHBlZF90eXBlJiBvcGVyYXRvcltdKGtleV90eXBlJiYgX19rKTsKKyNlbmRpZgorCisgICAgICAgICAgbWFwcGVkX3R5cGUmIGF0KGNvbnN0IGtleV90eXBlJiBfX2spOworICAgIGNvbnN0IG1hcHBlZF90eXBlJiBhdChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdDsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gYWxsb2NhdG9yX3R5cGUoX190cmVlXy5fX2FsbG9jKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAga2V5X2NvbXBhcmUgICAga2V5X2NvbXAoKSAgICAgIGNvbnN0IHtyZXR1cm4gX190cmVlXy52YWx1ZV9jb21wKCkua2V5X2NvbXAoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZhbHVlX2NvbXBhcmUgIHZhbHVlX2NvbXAoKSAgICBjb25zdCB7cmV0dXJuIHZhbHVlX2NvbXBhcmUoX190cmVlXy52YWx1ZV9jb21wKCkua2V5X2NvbXAoKSk7fQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHRlbXBsYXRlIDxjbGFzcyAuLi5fQXJncz4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gZW1wbGFjZShfQXJncyYmIC4uLl9fYXJncykgeworICAgICAgICByZXR1cm4gX190cmVlXy5fX2VtcGxhY2VfdW5pcXVlKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FyZ3M+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3AsIF9BcmdzJiYgLi4uX19hcmdzKSB7CisgICAgICAgIHJldHVybiBfX3RyZWVfLl9fZW1wbGFjZV9oaW50X3VuaXF1ZShfX3AuX19pXywgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfUHAsCisgICAgICAgICAgICAgIGNsYXNzID0gdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwgX1BwPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydChfUHAmJiBfX3ApCisgICAgICAgICAgICB7cmV0dXJuIF9fdHJlZV8uX19pbnNlcnRfdW5pcXVlKF9WU1REOjpmb3J3YXJkPF9QcD4oX19wKSk7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9QcCwKKyAgICAgICAgICAgICAgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLCBfUHA+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfUHAmJiBfX3ApCisgICAgICAgICAgICB7cmV0dXJuIF9fdHJlZV8uX19pbnNlcnRfdW5pcXVlKF9fcG9zLl9faV8sIF9WU1REOjpmb3J3YXJkPF9QcD4oX19wKSk7fQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3YpIHtyZXR1cm4gX190cmVlXy5fX2luc2VydF91bmlxdWUoX192KTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IKKyAgICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcCwgY29uc3QgdmFsdWVfdHlwZSYgX192KQorICAgICAgICAgICAge3JldHVybiBfX3RyZWVfLl9faW5zZXJ0X3VuaXF1ZShfX3AuX19pXywgX192KTt9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3YpIHtyZXR1cm4gX190cmVlXy5fX2luc2VydF91bmlxdWUoX1ZTVEQ6Om1vdmUoX192KSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3AsICB2YWx1ZV90eXBlJiYgX192KQorICAgIHtyZXR1cm4gX190cmVlXy5fX2luc2VydF91bmlxdWUoX19wLl9faV8sIF9WU1REOjptb3ZlKF9fdikpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpCisgICAgICAgIHtpbnNlcnQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTt9CisjZW5kaWYKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChjb25zdF9pdGVyYXRvciBfX2UgPSBjZW5kKCk7IF9fZiAhPSBfX2w7ICsrX19mKQorICAgICAgICAgICAgICAgIGluc2VydChfX2UuX19pXywgKl9fZik7CisgICAgICAgIH0KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gdHJ5X2VtcGxhY2UoY29uc3Qga2V5X3R5cGUmIF9faywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgICByZXR1cm4gX190cmVlXy5fX2VtcGxhY2VfdW5pcXVlX2tleV9hcmdzKF9faywKKyAgICAgICAgICAgIF9WU1REOjpwaWVjZXdpc2VfY29uc3RydWN0LAorICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmRfYXNfdHVwbGUoX19rKSwKKyAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkX2FzX3R1cGxlKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IHRyeV9lbXBsYWNlKGtleV90eXBlJiYgX19rLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICB7CisgICAgICAgIHJldHVybiBfX3RyZWVfLl9fZW1wbGFjZV91bmlxdWVfa2V5X2FyZ3MoX19rLAorICAgICAgICAgICAgX1ZTVEQ6OnBpZWNld2lzZV9jb25zdHJ1Y3QsCisgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZF9hc190dXBsZShfVlNURDo6bW92ZShfX2spKSwKKyAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkX2FzX3R1cGxlKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGl0ZXJhdG9yIHRyeV9lbXBsYWNlKGNvbnN0X2l0ZXJhdG9yIF9faCwgY29uc3Qga2V5X3R5cGUmIF9faywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgICByZXR1cm4gX190cmVlXy5fX2VtcGxhY2VfaGludF91bmlxdWVfa2V5X2FyZ3MoX19oLl9faV8sIF9faywKKyAgICAgICAgICAgIF9WU1REOjpwaWVjZXdpc2VfY29uc3RydWN0LAorICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmRfYXNfdHVwbGUoX19rKSwKKyAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkX2FzX3R1cGxlKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGl0ZXJhdG9yIHRyeV9lbXBsYWNlKGNvbnN0X2l0ZXJhdG9yIF9faCwga2V5X3R5cGUmJiBfX2ssIF9BcmdzJiYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9fdHJlZV8uX19lbXBsYWNlX2hpbnRfdW5pcXVlX2tleV9hcmdzKF9faC5fX2lfLCBfX2ssCisgICAgICAgICAgICBfVlNURDo6cGllY2V3aXNlX2NvbnN0cnVjdCwKKyAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkX2FzX3R1cGxlKF9WU1REOjptb3ZlKF9faykpLAorICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmRfYXNfdHVwbGUoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1ZwPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydF9vcl9hc3NpZ24oY29uc3Qga2V5X3R5cGUmIF9faywgX1ZwJiYgX192KQorICAgIHsKKyAgICAgICAgaXRlcmF0b3IgX19wID0gbG93ZXJfYm91bmQoX19rKTsKKyAgICAgICAgaWYgKCBfX3AgIT0gZW5kKCkgJiYgIWtleV9jb21wKCkoX19rLCBfX3AtPmZpcnN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgX19wLT5zZWNvbmQgPSBfVlNURDo6Zm9yd2FyZDxfVnA+KF9fdik7CisgICAgICAgICAgICByZXR1cm4gX1ZTVEQ6Om1ha2VfcGFpcihfX3AsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX1ZTVEQ6Om1ha2VfcGFpcihlbXBsYWNlX2hpbnQoX19wLCBfX2ssIF9WU1REOjpmb3J3YXJkPF9WcD4oX192KSksIHRydWUpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVnA+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0X29yX2Fzc2lnbihrZXlfdHlwZSYmIF9faywgX1ZwJiYgX192KQorICAgIHsKKyAgICAgICAgaXRlcmF0b3IgX19wID0gbG93ZXJfYm91bmQoX19rKTsKKyAgICAgICAgaWYgKCBfX3AgIT0gZW5kKCkgJiYgIWtleV9jb21wKCkoX19rLCBfX3AtPmZpcnN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgX19wLT5zZWNvbmQgPSBfVlNURDo6Zm9yd2FyZDxfVnA+KF9fdik7CisgICAgICAgICAgICByZXR1cm4gX1ZTVEQ6Om1ha2VfcGFpcihfX3AsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX1ZTVEQ6Om1ha2VfcGFpcihlbXBsYWNlX2hpbnQoX19wLCBfVlNURDo6bW92ZShfX2spLCBfVlNURDo6Zm9yd2FyZDxfVnA+KF9fdikpLCB0cnVlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1ZwPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGl0ZXJhdG9yIGluc2VydF9vcl9hc3NpZ24oY29uc3RfaXRlcmF0b3IgX19oLCBjb25zdCBrZXlfdHlwZSYgX19rLCBfVnAmJiBfX3YpCisgICAgIHsKKyAgICAgICAgaXRlcmF0b3IgX19wID0gbG93ZXJfYm91bmQoX19rKTsKKyAgICAgICAgaWYgKCBfX3AgIT0gZW5kKCkgJiYgIWtleV9jb21wKCkoX19rLCBfX3AtPmZpcnN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgX19wLT5zZWNvbmQgPSBfVlNURDo6Zm9yd2FyZDxfVnA+KF9fdik7CisgICAgICAgICAgICByZXR1cm4gX19wOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbXBsYWNlX2hpbnQoX19oLCBfX2ssIF9WU1REOjpmb3J3YXJkPF9WcD4oX192KSk7CisgICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVnA+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgaXRlcmF0b3IgaW5zZXJ0X29yX2Fzc2lnbihjb25zdF9pdGVyYXRvciBfX2gsIGtleV90eXBlJiYgX19rLCBfVnAmJiBfX3YpCisgICAgIHsKKyAgICAgICAgaXRlcmF0b3IgX19wID0gbG93ZXJfYm91bmQoX19rKTsKKyAgICAgICAgaWYgKCBfX3AgIT0gZW5kKCkgJiYgIWtleV9jb21wKCkoX19rLCBfX3AtPmZpcnN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgX19wLT5zZWNvbmQgPSBfVlNURDo6Zm9yd2FyZDxfVnA+KF9fdik7CisgICAgICAgICAgICByZXR1cm4gX19wOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbXBsYWNlX2hpbnQoX19oLCBfVlNURDo6bW92ZShfX2spLCBfVlNURDo6Zm9yd2FyZDxfVnA+KF9fdikpOworICAgICB9CisKKyNlbmRpZiAvLyBfTElCQ1BQX1NURF9WRVIgPiAxNAorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcCkge3JldHVybiBfX3RyZWVfLmVyYXNlKF9fcC5fX2lfKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcCkgICAgICAge3JldHVybiBfX3RyZWVfLmVyYXNlKF9fcC5fX2lfKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rKQorICAgICAgICB7cmV0dXJuIF9fdHJlZV8uX19lcmFzZV91bmlxdWUoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkKKyAgICAgICAge3JldHVybiBfX3RyZWVfLmVyYXNlKF9fZi5fX2lfLCBfX2wuX19pXyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGNsZWFyKCkgX05PRVhDRVBUIHtfX3RyZWVfLmNsZWFyKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc3dhcChtYXAmIF9fbSkKKyAgICAgICAgX05PRVhDRVBUXyhfX2lzX25vdGhyb3dfc3dhcHBhYmxlPF9fYmFzZT46OnZhbHVlKQorICAgICAgICB7X190cmVlXy5zd2FwKF9fbS5fX3RyZWVfKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgZmluZChjb25zdCBrZXlfdHlwZSYgX19rKSAgICAgICAgICAgICB7cmV0dXJuIF9fdHJlZV8uZmluZChfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdCB7cmV0dXJuIF9fdHJlZV8uZmluZChfX2spO30KKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfSzI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3RyYW5zcGFyZW50PF9Db21wYXJlLCBfSzI+Ojp2YWx1ZSxpdGVyYXRvcj46OnR5cGUKKyAgICBmaW5kKGNvbnN0IF9LMiYgX19rKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gX190cmVlXy5maW5kKF9fayk7fQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfSzI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3RyYW5zcGFyZW50PF9Db21wYXJlLCBfSzI+Ojp2YWx1ZSxjb25zdF9pdGVyYXRvcj46OnR5cGUKKyAgICBmaW5kKGNvbnN0IF9LMiYgX19rKSBjb25zdCAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gX190cmVlXy5maW5kKF9fayk7fQorI2VuZGlmCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICAgICAge3JldHVybiBfX3RyZWVfLl9fY291bnRfdW5pcXVlKF9fayk7fQorI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9LMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfdHJhbnNwYXJlbnQ8X0NvbXBhcmUsIF9LMj46OnZhbHVlLHNpemVfdHlwZT46OnR5cGUKKyAgICBjb3VudChjb25zdCBfSzImIF9faykgY29uc3Qge3JldHVybiBfX3RyZWVfLl9fY291bnRfbXVsdGkoX19rKTt9CisjZW5kaWYKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICAgICAge3JldHVybiBfX3RyZWVfLmxvd2VyX2JvdW5kKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdHJlZV8ubG93ZXJfYm91bmQoX19rKTt9CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc190cmFuc3BhcmVudDxfQ29tcGFyZSwgX0syPjo6dmFsdWUsaXRlcmF0b3I+Ojp0eXBlCisgICAgbG93ZXJfYm91bmQoY29uc3QgX0syJiBfX2spICAgICAgIHtyZXR1cm4gX190cmVlXy5sb3dlcl9ib3VuZChfX2spO30KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfSzI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3RyYW5zcGFyZW50PF9Db21wYXJlLCBfSzI+Ojp2YWx1ZSxjb25zdF9pdGVyYXRvcj46OnR5cGUKKyAgICBsb3dlcl9ib3VuZChjb25zdCBfSzImIF9faykgY29uc3Qge3JldHVybiBfX3RyZWVfLmxvd2VyX2JvdW5kKF9fayk7fQorI2VuZGlmCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICAgICAge3JldHVybiBfX3RyZWVfLnVwcGVyX2JvdW5kKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdHJlZV8udXBwZXJfYm91bmQoX19rKTt9CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc190cmFuc3BhcmVudDxfQ29tcGFyZSwgX0syPjo6dmFsdWUsaXRlcmF0b3I+Ojp0eXBlCisgICAgdXBwZXJfYm91bmQoY29uc3QgX0syJiBfX2spICAgICAgIHtyZXR1cm4gX190cmVlXy51cHBlcl9ib3VuZChfX2spO30KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc190cmFuc3BhcmVudDxfQ29tcGFyZSwgX0syPjo6dmFsdWUsY29uc3RfaXRlcmF0b3I+Ojp0eXBlCisgICAgdXBwZXJfYm91bmQoY29uc3QgX0syJiBfX2spIGNvbnN0IHtyZXR1cm4gX190cmVlXy51cHBlcl9ib3VuZChfX2spO30KKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgICAgIHtyZXR1cm4gX190cmVlXy5fX2VxdWFsX3JhbmdlX3VuaXF1ZShfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICAgICAge3JldHVybiBfX3RyZWVfLl9fZXF1YWxfcmFuZ2VfdW5pcXVlKF9fayk7fQorI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9LMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfdHJhbnNwYXJlbnQ8X0NvbXBhcmUsIF9LMj46OnZhbHVlLHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+Pjo6dHlwZQorICAgIGVxdWFsX3JhbmdlKGNvbnN0IF9LMiYgX19rKSAgICAgICB7cmV0dXJuIF9fdHJlZV8uX19lcXVhbF9yYW5nZV9tdWx0aShfX2spO30KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc190cmFuc3BhcmVudDxfQ29tcGFyZSwgX0syPjo6dmFsdWUscGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4+Ojp0eXBlCisgICAgZXF1YWxfcmFuZ2UoY29uc3QgX0syJiBfX2spIGNvbnN0IHtyZXR1cm4gX190cmVlXy5fX2VxdWFsX3JhbmdlX211bHRpKF9fayk7fQorI2VuZGlmCisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6Ol9fbm9kZSAgICAgICAgICAgICAgICAgICAgX19ub2RlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19iYXNlOjpfX25vZGVfYWxsb2NhdG9yICAgICAgICAgIF9fbm9kZV9hbGxvY2F0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6Ol9fbm9kZV9wb2ludGVyICAgICAgICAgICAgX19ub2RlX3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6Ol9fbm9kZV9iYXNlX3BvaW50ZXIgICAgICAgX19ub2RlX2Jhc2VfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYmFzZTo6X19wYXJlbnRfcG9pbnRlciAgICAgICAgICBfX3BhcmVudF9wb2ludGVyOworCisgICAgdHlwZWRlZiBfX21hcF9ub2RlX2Rlc3RydWN0b3I8X19ub2RlX2FsbG9jYXRvcj4gX0RwOworICAgIHR5cGVkZWYgdW5pcXVlX3B0cjxfX25vZGUsIF9EcD4gX19ub2RlX2hvbGRlcjsKKworI2lmZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9fbm9kZV9ob2xkZXIgX19jb25zdHJ1Y3Rfbm9kZV93aXRoX2tleShjb25zdCBrZXlfdHlwZSYgX19rKTsKKyNlbmRpZgorfTsKKworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CittYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Om1hcChtYXAmJiBfX20sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX3RyZWVfKF9WU1REOjptb3ZlKF9fbS5fX3RyZWVfKSwgdHlwZW5hbWUgX19iYXNlOjphbGxvY2F0b3JfdHlwZShfX2EpKQoreworICAgIGlmIChfX2EgIT0gX19tLmdldF9hbGxvY2F0b3IoKSkKKyAgICB7CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZSA9IGNlbmQoKTsKKyAgICAgICAgd2hpbGUgKCFfX20uZW1wdHkoKSkKKyAgICAgICAgICAgIF9fdHJlZV8uX19pbnNlcnRfdW5pcXVlKF9fZS5fX2lfLAorICAgICAgICAgICAgICAgICAgICBfVlNURDo6bW92ZShfX20uX190cmVlXy5yZW1vdmUoX19tLmJlZ2luKCkuX19pXyktPl9fdmFsdWVfLl9fbmMpKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgorX1RwJgorbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpvcGVyYXRvcltdKGNvbnN0IGtleV90eXBlJiBfX2spCit7CisgICAgcmV0dXJuIF9fdHJlZV8uX19lbXBsYWNlX3VuaXF1ZV9rZXlfYXJncyhfX2ssCisgICAgICAgIF9WU1REOjpwaWVjZXdpc2VfY29uc3RydWN0LAorICAgICAgICBfVlNURDo6Zm9yd2FyZF9hc190dXBsZShfX2spLAorICAgICAgICBfVlNURDo6Zm9yd2FyZF9hc190dXBsZSgpKS5maXJzdC0+X19jYy5zZWNvbmQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgorX1RwJgorbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpvcGVyYXRvcltdKGtleV90eXBlJiYgX19rKQoreworICAgIHJldHVybiBfX3RyZWVfLl9fZW1wbGFjZV91bmlxdWVfa2V5X2FyZ3MoX19rLAorICAgICAgICBfVlNURDo6cGllY2V3aXNlX2NvbnN0cnVjdCwKKyAgICAgICAgX1ZTVEQ6OmZvcndhcmRfYXNfdHVwbGUoX1ZTVEQ6Om1vdmUoX19rKSksCisgICAgICAgIF9WU1REOjpmb3J3YXJkX2FzX3R1cGxlKCkpLmZpcnN0LT5fX2NjLnNlY29uZDsKK30KKworI2Vsc2UgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpfX25vZGVfaG9sZGVyCittYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Ol9fY29uc3RydWN0X25vZGVfd2l0aF9rZXkoY29uc3Qga2V5X3R5cGUmIF9faykKK3sKKyAgICBfX25vZGVfYWxsb2NhdG9yJiBfX25hID0gX190cmVlXy5fX25vZGVfYWxsb2MoKTsKKyAgICBfX25vZGVfaG9sZGVyIF9faChfX25vZGVfdHJhaXRzOjphbGxvY2F0ZShfX25hLCAxKSwgX0RwKF9fbmEpKTsKKyAgICBfX25vZGVfdHJhaXRzOjpjb25zdHJ1Y3QoX19uYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX2gtPl9fdmFsdWVfLl9fY2MuZmlyc3QpLCBfX2spOworICAgIF9faC5nZXRfZGVsZXRlcigpLl9fZmlyc3RfY29uc3RydWN0ZWQgPSB0cnVlOworICAgIF9fbm9kZV90cmFpdHM6OmNvbnN0cnVjdChfX25hLCBfVlNURDo6YWRkcmVzc29mKF9faC0+X192YWx1ZV8uX19jYy5zZWNvbmQpKTsKKyAgICBfX2guZ2V0X2RlbGV0ZXIoKS5fX3NlY29uZF9jb25zdHJ1Y3RlZCA9IHRydWU7CisgICAgcmV0dXJuIF9MSUJDUFBfRVhQTElDSVRfTU9WRShfX2gpOyAgLy8gZXhwbGljaXRseSBtb3ZlZCBmb3IgQysrMDMKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitfVHAmCittYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Om9wZXJhdG9yW10oY29uc3Qga2V5X3R5cGUmIF9faykKK3sKKyAgICBfX3BhcmVudF9wb2ludGVyIF9fcGFyZW50OworICAgIF9fbm9kZV9iYXNlX3BvaW50ZXImIF9fY2hpbGQgPSBfX3RyZWVfLl9fZmluZF9lcXVhbChfX3BhcmVudCwgX19rKTsKKyAgICBfX25vZGVfcG9pbnRlciBfX3IgPSBzdGF0aWNfY2FzdDxfX25vZGVfcG9pbnRlcj4oX19jaGlsZCk7CisgICAgaWYgKF9fY2hpbGQgPT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIF9fbm9kZV9ob2xkZXIgX19oID0gX19jb25zdHJ1Y3Rfbm9kZV93aXRoX2tleShfX2spOworICAgICAgICBfX3RyZWVfLl9faW5zZXJ0X25vZGVfYXQoX19wYXJlbnQsIF9fY2hpbGQsIHN0YXRpY19jYXN0PF9fbm9kZV9iYXNlX3BvaW50ZXI+KF9faC5nZXQoKSkpOworICAgICAgICBfX3IgPSBfX2gucmVsZWFzZSgpOworICAgIH0KKyAgICByZXR1cm4gX19yLT5fX3ZhbHVlXy5fX2NjLnNlY29uZDsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitfVHAmCittYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46OmF0KGNvbnN0IGtleV90eXBlJiBfX2spCit7CisgICAgX19wYXJlbnRfcG9pbnRlciBfX3BhcmVudDsKKyAgICBfX25vZGVfYmFzZV9wb2ludGVyJiBfX2NoaWxkID0gX190cmVlXy5fX2ZpbmRfZXF1YWwoX19wYXJlbnQsIF9fayk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIGlmIChfX2NoaWxkID09IG51bGxwdHIpCisgICAgICAgIHRocm93IG91dF9vZl9yYW5nZSgibWFwOjphdDogIGtleSBub3QgZm91bmQiKTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX2NoaWxkKS0+X192YWx1ZV8uX19jYy5zZWNvbmQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgorY29uc3QgX1RwJgorbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjphdChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAoreworICAgIF9fcGFyZW50X3BvaW50ZXIgX19wYXJlbnQ7CisgICAgX19ub2RlX2Jhc2VfcG9pbnRlciBfX2NoaWxkID0gX190cmVlXy5fX2ZpbmRfZXF1YWwoX19wYXJlbnQsIF9fayk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIGlmIChfX2NoaWxkID09IG51bGxwdHIpCisgICAgICAgIHRocm93IG91dF9vZl9yYW5nZSgibWFwOjphdDogIGtleSBub3QgZm91bmQiKTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9fbm9kZV9wb2ludGVyPihfX2NoaWxkKS0+X192YWx1ZV8uX19jYy5zZWNvbmQ7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feCwKKyAgICAgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5zaXplKCkgPT0gX195LnNpemUoKSAmJiBfVlNURDo6ZXF1YWwoX194LmJlZ2luKCksIF9feC5lbmQoKSwgX195LmJlZ2luKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjwgKGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX194LAorICAgICAgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feSkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9feC5iZWdpbigpLCBfX3guZW5kKCksIF9feS5iZWdpbigpLCBfX3kuZW5kKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX194LAorICAgICAgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPT0gX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+IChjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feCwKKyAgICAgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feSA8IF9feDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+PShjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feCwKKyAgICAgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194IDwgX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8PShjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feCwKKyAgICAgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX195IDwgX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feCwKKyAgICAgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCisgICAgX05PRVhDRVBUXyhfTk9FWENFUFRfKF9feC5zd2FwKF9feSkpKQoreworICAgIF9feC5zd2FwKF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlID0gbGVzczxfS2V5PiwKKyAgICAgICAgICBjbGFzcyBfQWxsb2NhdG9yID0gYWxsb2NhdG9yPHBhaXI8Y29uc3QgX0tleSwgX1RwPiA+ID4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIG11bHRpbWFwCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXM6CisgICAgdHlwZWRlZiBfS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRfdHlwZTsKKyAgICB0eXBlZGVmIHBhaXI8Y29uc3Qga2V5X3R5cGUsIG1hcHBlZF90eXBlPiAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHBhaXI8a2V5X3R5cGUsIG1hcHBlZF90eXBlPiAgICAgICAgICAgICAgX19uY192YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0NvbXBhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfY29tcGFyZTsKKyAgICB0eXBlZGVmIF9BbGxvY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgc3RhdGljX2Fzc2VydCgoaXNfc2FtZTx0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6dmFsdWVfdHlwZSwgdmFsdWVfdHlwZT46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICJBbGxvY2F0b3I6OnZhbHVlX3R5cGUgbXVzdCBiZSBzYW1lIHR5cGUgYXMgdmFsdWVfdHlwZSIpOworCisgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdmFsdWVfY29tcGFyZQorICAgICAgICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248dmFsdWVfdHlwZSwgdmFsdWVfdHlwZSwgYm9vbD4KKyAgICB7CisgICAgICAgIGZyaWVuZCBjbGFzcyBtdWx0aW1hcDsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGtleV9jb21wYXJlIGNvbXA7CisKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB2YWx1ZV9jb21wYXJlKGtleV9jb21wYXJlIGMpIDogY29tcChjKSB7fQorICAgIHB1YmxpYzoKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgdmFsdWVfdHlwZSYgX194LCBjb25zdCB2YWx1ZV90eXBlJiBfX3kpIGNvbnN0CisgICAgICAgICAgICB7cmV0dXJuIGNvbXAoX194LmZpcnN0LCBfX3kuZmlyc3QpO30KKyAgICB9OworCitwcml2YXRlOgorCisgICAgdHlwZWRlZiBfVlNURDo6X192YWx1ZV90eXBlPGtleV90eXBlLCBtYXBwZWRfdHlwZT4gICAgICAgICAgICAgX192YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX19tYXBfdmFsdWVfY29tcGFyZTxrZXlfdHlwZSwgX192YWx1ZV90eXBlLCBrZXlfY29tcGFyZT4gX192YzsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2FsbG9jX2hlbHBlcjxhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3ZhbHVlX3R5cGU+Ojp0eXBlIF9fYWxsb2NhdG9yX3R5cGU7CisgICAgdHlwZWRlZiBfX3RyZWU8X192YWx1ZV90eXBlLCBfX3ZjLCBfX2FsbG9jYXRvcl90eXBlPiAgICAgICAgICAgIF9fYmFzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYmFzZTo6X19ub2RlX3RyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlX3RyYWl0czsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM7CisKKyAgICBfX2Jhc2UgX190cmVlXzsKKworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnBvaW50ZXIgICAgICAgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OmNvbnN0X3BvaW50ZXIgICAgICAgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnNpemVfdHlwZSAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2FsbG9jX3RyYWl0czo6ZGlmZmVyZW5jZV90eXBlICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIF9fbWFwX2l0ZXJhdG9yPHR5cGVuYW1lIF9fYmFzZTo6aXRlcmF0b3I+ICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfX21hcF9jb25zdF9pdGVyYXRvcjx0eXBlbmFtZSBfX2Jhc2U6OmNvbnN0X2l0ZXJhdG9yPiBjb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9WU1REOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfVlNURDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gICAgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG11bHRpbWFwKCkKKyAgICAgICAgX05PRVhDRVBUXygKKyAgICAgICAgICAgIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGtleV9jb21wYXJlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPGtleV9jb21wYXJlPjo6dmFsdWUpCisgICAgICAgIDogX190cmVlXyhfX3ZjKGtleV9jb21wYXJlKCkpKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IG11bHRpbWFwKGNvbnN0IGtleV9jb21wYXJlJiBfX2NvbXApCisgICAgICAgIF9OT0VYQ0VQVF8oCisgICAgICAgICAgICBpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZTxrZXlfY29tcGFyZT46OnZhbHVlKQorICAgICAgICA6IF9fdHJlZV8oX192YyhfX2NvbXApKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IG11bHRpbWFwKGNvbnN0IGtleV9jb21wYXJlJiBfX2NvbXAsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICAgIDogX190cmVlXyhfX3ZjKF9fY29tcCksIHR5cGVuYW1lIF9fYmFzZTo6YWxsb2NhdG9yX3R5cGUoX19hKSkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBtdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKyAgICAgICAgICAgIGNvbnN0IGtleV9jb21wYXJlJiBfX2NvbXAgPSBrZXlfY29tcGFyZSgpKQorICAgICAgICA6IF9fdHJlZV8oX192YyhfX2NvbXApKQorICAgICAgICB7CisgICAgICAgICAgICBpbnNlcnQoX19mLCBfX2wpOworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisgICAgICAgICAgICBjb25zdCBrZXlfY29tcGFyZSYgX19jb21wLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgICA6IF9fdHJlZV8oX192YyhfX2NvbXApLCB0eXBlbmFtZSBfX2Jhc2U6OmFsbG9jYXRvcl90eXBlKF9fYSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluc2VydChfX2YsIF9fbCk7CisgICAgICAgIH0KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBtdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgICAgOiBtdWx0aW1hcChfX2YsIF9fbCwga2V5X2NvbXBhcmUoKSwgX19hKSB7fQorI2VuZGlmCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgbXVsdGltYXAoY29uc3QgbXVsdGltYXAmIF9fbSkKKyAgICAgICAgOiBfX3RyZWVfKF9fbS5fX3RyZWVfLnZhbHVlX2NvbXAoKSwKKyAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6c2VsZWN0X29uX2NvbnRhaW5lcl9jb3B5X2NvbnN0cnVjdGlvbihfX20uX190cmVlXy5fX2FsbG9jKCkpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnNlcnQoX19tLmJlZ2luKCksIF9fbS5lbmQoKSk7CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBtdWx0aW1hcCYgb3BlcmF0b3I9KGNvbnN0IG11bHRpbWFwJiBfX20pCisgICAgICAgIHsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgICAgICAgICBfX3RyZWVfID0gX19tLl9fdHJlZV87CisjZWxzZQorICAgICAgICAgICAgaWYgKHRoaXMgIT0gJl9fbSkgeworICAgICAgICAgICAgICAgIF9fdHJlZV8uY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBfX3RyZWVfLnZhbHVlX2NvbXAoKSA9IF9fbS5fX3RyZWVfLnZhbHVlX2NvbXAoKTsKKyAgICAgICAgICAgICAgICBfX3RyZWVfLl9fY29weV9hc3NpZ25fYWxsb2MoX19tLl9fdHJlZV8pOworICAgICAgICAgICAgICAgIGluc2VydChfX20uYmVnaW4oKSwgX19tLmVuZCgpKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgbXVsdGltYXAobXVsdGltYXAmJiBfX20pCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8X19iYXNlPjo6dmFsdWUpCisgICAgICAgIDogX190cmVlXyhfVlNURDo6bW92ZShfX20uX190cmVlXykpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgbXVsdGltYXAobXVsdGltYXAmJiBfX20sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG11bHRpbWFwJiBvcGVyYXRvcj0obXVsdGltYXAmJiBfX20pCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8X19iYXNlPjo6dmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fdHJlZV8gPSBfVlNURDo6bW92ZShfX20uX190cmVlXyk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBtdWx0aW1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIGNvbnN0IGtleV9jb21wYXJlJiBfX2NvbXAgPSBrZXlfY29tcGFyZSgpKQorICAgICAgICA6IF9fdHJlZV8oX192YyhfX2NvbXApKQorICAgICAgICB7CisgICAgICAgICAgICBpbnNlcnQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKKyAgICAgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG11bHRpbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCwgY29uc3Qga2V5X2NvbXBhcmUmIF9fY29tcCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgICAgOiBfX3RyZWVfKF9fdmMoX19jb21wKSwgdHlwZW5hbWUgX19iYXNlOjphbGxvY2F0b3JfdHlwZShfX2EpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnNlcnQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKKyAgICAgICAgfQorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgbXVsdGltYXAoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgICA6IG11bHRpbWFwKF9faWwsIGtleV9jb21wYXJlKCksIF9fYSkge30KKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG11bHRpbWFwJiBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQorICAgICAgICB7CisgICAgICAgICAgICBfX3RyZWVfLl9fYXNzaWduX211bHRpKF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBtdWx0aW1hcChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgICA6IF9fdHJlZV8odHlwZW5hbWUgX19iYXNlOjphbGxvY2F0b3JfdHlwZShfX2EpKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBtdWx0aW1hcChjb25zdCBtdWx0aW1hcCYgX19tLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgICA6IF9fdHJlZV8oX19tLl9fdHJlZV8udmFsdWVfY29tcCgpLCB0eXBlbmFtZSBfX2Jhc2U6OmFsbG9jYXRvcl90eXBlKF9fYSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluc2VydChfX20uYmVnaW4oKSwgX19tLmVuZCgpKTsKKyAgICAgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgX05PRVhDRVBUIHtyZXR1cm4gX190cmVlXy5iZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RyZWVfLmJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICBpdGVyYXRvciBlbmQoKSBfTk9FWENFUFQge3JldHVybiBfX3RyZWVfLmVuZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190cmVlXy5lbmQoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBfTk9FWENFUFQge3JldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBfTk9FWENFUFQge3JldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIGJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBjZW5kKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gZW5kKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyYmVnaW4oKSBjb25zdCBfTk9FWENFUFQge3JldHVybiByYmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY3JlbmQoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiByZW5kKCk7fQorCisgICAgX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgZW1wdHkoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RyZWVfLnNpemUoKSA9PSAwO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RyZWVfLnNpemUoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdHJlZV8ubWF4X3NpemUoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIGFsbG9jYXRvcl90eXBlKF9fdHJlZV8uX19hbGxvYygpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGtleV9jb21wYXJlICAgIGtleV9jb21wKCkgY29uc3Qge3JldHVybiBfX3RyZWVfLnZhbHVlX2NvbXAoKS5rZXlfY29tcCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmFsdWVfY29tcGFyZSAgdmFsdWVfY29tcCgpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gdmFsdWVfY29tcGFyZShfX3RyZWVfLnZhbHVlX2NvbXAoKS5rZXlfY29tcCgpKTt9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FyZ3M+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGVtcGxhY2UoX0FyZ3MmJiAuLi5fX2FyZ3MpIHsKKyAgICAgICAgcmV0dXJuIF9fdHJlZV8uX19lbXBsYWNlX211bHRpKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FyZ3M+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3AsIF9BcmdzJiYgLi4uX19hcmdzKSB7CisgICAgICAgIHJldHVybiBfX3RyZWVfLl9fZW1wbGFjZV9oaW50X211bHRpKF9fcC5fX2lfLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9QcCwKKyAgICAgICAgICAgICAgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLCBfUHA+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgaXRlcmF0b3IgaW5zZXJ0KF9QcCYmIF9fcCkKKyAgICAgICAgICAgIHtyZXR1cm4gX190cmVlXy5fX2luc2VydF9tdWx0aShfVlNURDo6Zm9yd2FyZDxfUHA+KF9fcCkpO30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfUHAsCisgICAgICAgICAgICAgIGNsYXNzID0gdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwgX1BwPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3BvcywgX1BwJiYgX19wKQorICAgICAgICAgICAge3JldHVybiBfX3RyZWVfLl9faW5zZXJ0X211bHRpKF9fcG9zLl9faV8sIF9WU1REOjpmb3J3YXJkPF9QcD4oX19wKSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydCh2YWx1ZV90eXBlJiYgX192KQorICAgICAgICB7cmV0dXJuIF9fdHJlZV8uX19pbnNlcnRfbXVsdGkoX1ZTVEQ6Om1vdmUoX192KSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3AsIHZhbHVlX3R5cGUmJiBfX3YpCisgICAgICAgIHtyZXR1cm4gX190cmVlXy5fX2luc2VydF9tdWx0aShfX3AuX19pXywgX1ZTVEQ6Om1vdmUoX192KSk7fQorCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBpbnNlcnQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQorICAgICAgICB7aW5zZXJ0KF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7fQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3YpIHtyZXR1cm4gX190cmVlXy5fX2luc2VydF9tdWx0aShfX3YpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpCisgICAgICAgICAgICB7cmV0dXJuIF9fdHJlZV8uX19pbnNlcnRfbXVsdGkoX19wLl9faV8sIF9fdik7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGNvbnN0X2l0ZXJhdG9yIF9fZSA9IGNlbmQoKTsgX19mICE9IF9fbDsgKytfX2YpCisgICAgICAgICAgICAgICAgX190cmVlXy5fX2luc2VydF9tdWx0aShfX2UuX19pXywgKl9fZik7CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBfX3ApIHtyZXR1cm4gX190cmVlXy5lcmFzZShfX3AuX19pXyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3ApICAgICAgIHtyZXR1cm4gX190cmVlXy5lcmFzZShfX3AuX19pXyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9faykge3JldHVybiBfX3RyZWVfLl9fZXJhc2VfbXVsdGkoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkKKyAgICAgICAge3JldHVybiBfX3RyZWVfLmVyYXNlKF9fZi5fX2lfLCBfX2wuX19pXyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGNsZWFyKCkge19fdHJlZV8uY2xlYXIoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKG11bHRpbWFwJiBfX20pCisgICAgICAgIF9OT0VYQ0VQVF8oX19pc19ub3Rocm93X3N3YXBwYWJsZTxfX2Jhc2U+Ojp2YWx1ZSkKKyAgICAgICAge19fdHJlZV8uc3dhcChfX20uX190cmVlXyk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykgICAgICAgICAgICAge3JldHVybiBfX3RyZWVfLmZpbmQoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Qge3JldHVybiBfX3RyZWVfLmZpbmQoX19rKTt9CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc190cmFuc3BhcmVudDxfQ29tcGFyZSwgX0syPjo6dmFsdWUsaXRlcmF0b3I+Ojp0eXBlCisgICAgZmluZChjb25zdCBfSzImIF9faykgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIF9fdHJlZV8uZmluZChfX2spO30KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc190cmFuc3BhcmVudDxfQ29tcGFyZSwgX0syPjo6dmFsdWUsY29uc3RfaXRlcmF0b3I+Ojp0eXBlCisgICAgZmluZChjb25zdCBfSzImIF9faykgY29uc3QgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIF9fdHJlZV8uZmluZChfX2spO30KKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSAgICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX190cmVlXy5fX2NvdW50X211bHRpKF9fayk7fQorI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9LMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfdHJhbnNwYXJlbnQ8X0NvbXBhcmUsIF9LMj46OnZhbHVlLHNpemVfdHlwZT46OnR5cGUKKyAgICBjb3VudChjb25zdCBfSzImIF9faykgY29uc3Qge3JldHVybiBfX3RyZWVfLl9fY291bnRfbXVsdGkoX19rKTt9CisjZW5kaWYKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICAgICAge3JldHVybiBfX3RyZWVfLmxvd2VyX2JvdW5kKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgICAgICAgICAge3JldHVybiBfX3RyZWVfLmxvd2VyX2JvdW5kKF9fayk7fQorI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9LMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfdHJhbnNwYXJlbnQ8X0NvbXBhcmUsIF9LMj46OnZhbHVlLGl0ZXJhdG9yPjo6dHlwZQorICAgIGxvd2VyX2JvdW5kKGNvbnN0IF9LMiYgX19rKSAgICAgICB7cmV0dXJuIF9fdHJlZV8ubG93ZXJfYm91bmQoX19rKTt9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc190cmFuc3BhcmVudDxfQ29tcGFyZSwgX0syPjo6dmFsdWUsY29uc3RfaXRlcmF0b3I+Ojp0eXBlCisgICAgbG93ZXJfYm91bmQoY29uc3QgX0syJiBfX2spIGNvbnN0IHtyZXR1cm4gX190cmVlXy5sb3dlcl9ib3VuZChfX2spO30KKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgICAgICAgICB7cmV0dXJuIF9fdHJlZV8udXBwZXJfYm91bmQoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgICAgICAgICB7cmV0dXJuIF9fdHJlZV8udXBwZXJfYm91bmQoX19rKTt9CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc190cmFuc3BhcmVudDxfQ29tcGFyZSwgX0syPjo6dmFsdWUsaXRlcmF0b3I+Ojp0eXBlCisgICAgdXBwZXJfYm91bmQoY29uc3QgX0syJiBfX2spICAgICAgIHtyZXR1cm4gX190cmVlXy51cHBlcl9ib3VuZChfX2spO30KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc190cmFuc3BhcmVudDxfQ29tcGFyZSwgX0syPjo6dmFsdWUsY29uc3RfaXRlcmF0b3I+Ojp0eXBlCisgICAgdXBwZXJfYm91bmQoY29uc3QgX0syJiBfX2spIGNvbnN0IHtyZXR1cm4gX190cmVlXy51cHBlcl9ib3VuZChfX2spO30KKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+ICAgICAgICAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgICAgICAgICB7cmV0dXJuIF9fdHJlZV8uX19lcXVhbF9yYW5nZV9tdWx0aShfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICAgICAgICAgIHtyZXR1cm4gX190cmVlXy5fX2VxdWFsX3JhbmdlX211bHRpKF9fayk7fQorI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9LMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfdHJhbnNwYXJlbnQ8X0NvbXBhcmUsIF9LMj46OnZhbHVlLHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+Pjo6dHlwZQorICAgIGVxdWFsX3JhbmdlKGNvbnN0IF9LMiYgX19rKSAgICAgICB7cmV0dXJuIF9fdHJlZV8uX19lcXVhbF9yYW5nZV9tdWx0aShfX2spO30KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc190cmFuc3BhcmVudDxfQ29tcGFyZSwgX0syPjo6dmFsdWUscGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4+Ojp0eXBlCisgICAgZXF1YWxfcmFuZ2UoY29uc3QgX0syJiBfX2spIGNvbnN0IHtyZXR1cm4gX190cmVlXy5fX2VxdWFsX3JhbmdlX211bHRpKF9fayk7fQorI2VuZGlmCisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6Ol9fbm9kZSAgICAgICAgICAgICAgICAgICAgX19ub2RlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19iYXNlOjpfX25vZGVfYWxsb2NhdG9yICAgICAgICAgIF9fbm9kZV9hbGxvY2F0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6Ol9fbm9kZV9wb2ludGVyICAgICAgICAgICAgX19ub2RlX3BvaW50ZXI7CisKKyAgICB0eXBlZGVmIF9fbWFwX25vZGVfZGVzdHJ1Y3RvcjxfX25vZGVfYWxsb2NhdG9yPiBfRHA7CisgICAgdHlwZWRlZiB1bmlxdWVfcHRyPF9fbm9kZSwgX0RwPiBfX25vZGVfaG9sZGVyOworfTsKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgorbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj46Om11bHRpbWFwKG11bHRpbWFwJiYgX19tLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX190cmVlXyhfVlNURDo6bW92ZShfX20uX190cmVlXyksIHR5cGVuYW1lIF9fYmFzZTo6YWxsb2NhdG9yX3R5cGUoX19hKSkKK3sKKyAgICBpZiAoX19hICE9IF9fbS5nZXRfYWxsb2NhdG9yKCkpCisgICAgeworICAgICAgICBjb25zdF9pdGVyYXRvciBfX2UgPSBjZW5kKCk7CisgICAgICAgIHdoaWxlICghX19tLmVtcHR5KCkpCisgICAgICAgICAgICBfX3RyZWVfLl9faW5zZXJ0X211bHRpKF9fZS5fX2lfLAorICAgICAgICAgICAgICAgICAgICBfVlNURDo6bW92ZShfX20uX190cmVlXy5yZW1vdmUoX19tLmJlZ2luKCkuX19pXyktPl9fdmFsdWVfLl9fbmMpKTsKKyAgICB9Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX194LAorICAgICAgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX195KQoreworICAgIHJldHVybiBfX3guc2l6ZSgpID09IF9feS5zaXplKCkgJiYgX1ZTVEQ6OmVxdWFsKF9feC5iZWdpbigpLCBfX3guZW5kKCksIF9feS5iZWdpbigpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8IChjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX194LAorICAgICAgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX195KQoreworICAgIHJldHVybiBfVlNURDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX194LmJlZ2luKCksIF9feC5lbmQoKSwgX195LmJlZ2luKCksIF9feS5lbmQoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yIT0oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feCwKKyAgICAgICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPT0gX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+IChjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX194LAorICAgICAgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX195KQoreworICAgIHJldHVybiBfX3kgPCBfX3g7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPj0oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feCwKKyAgICAgICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPCBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjw9KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX195IDwgX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX194LAorICAgICBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX195KQorICAgIF9OT0VYQ0VQVF8oX05PRVhDRVBUXyhfX3guc3dhcChfX3kpKSkKK3sKKyAgICBfX3guc3dhcChfX3kpOworfQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKKyNlbmRpZiAgLy8gX0xJQkNQUF9NQVAKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9tYXRoLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMDU1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvbWF0aC5oCkBAIC0wLDAgKzEsMTUwMyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtYXRoLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9NQVRIX0gKKyNkZWZpbmUgX0xJQkNQUF9NQVRIX0gKKworLyoKKyAgICBtYXRoLmggc3lub3BzaXMKKworTWFjcm9zOgorCisgICAgSFVHRV9WQUwKKyAgICBIVUdFX1ZBTEYgICAgICAgICAgICAgICAvLyBDOTkKKyAgICBIVUdFX1ZBTEwgICAgICAgICAgICAgICAvLyBDOTkKKyAgICBJTkZJTklUWSAgICAgICAgICAgICAgICAvLyBDOTkKKyAgICBOQU4gICAgICAgICAgICAgICAgICAgICAvLyBDOTkKKyAgICBGUF9JTkZJTklURSAgICAgICAgICAgICAvLyBDOTkKKyAgICBGUF9OQU4gICAgICAgICAgICAgICAgICAvLyBDOTkKKyAgICBGUF9OT1JNQUwgICAgICAgICAgICAgICAvLyBDOTkKKyAgICBGUF9TVUJOT1JNQUwgICAgICAgICAgICAvLyBDOTkKKyAgICBGUF9aRVJPICAgICAgICAgICAgICAgICAvLyBDOTkKKyAgICBGUF9GQVNUX0ZNQSAgICAgICAgICAgICAvLyBDOTkKKyAgICBGUF9GQVNUX0ZNQUYgICAgICAgICAgICAvLyBDOTkKKyAgICBGUF9GQVNUX0ZNQUwgICAgICAgICAgICAvLyBDOTkKKyAgICBGUF9JTE9HQjAgICAgICAgICAgICAgICAvLyBDOTkKKyAgICBGUF9JTE9HQk5BTiAgICAgICAgICAgICAvLyBDOTkKKyAgICBNQVRIX0VSUk5PICAgICAgICAgICAgICAvLyBDOTkKKyAgICBNQVRIX0VSUkVYQ0VQVCAgICAgICAgICAvLyBDOTkKKyAgICBtYXRoX2VycmhhbmRsaW5nICAgICAgICAvLyBDOTkKKworVHlwZXM6CisKKyAgICBmbG9hdF90ICAgICAgICAgICAgICAgICAvLyBDOTkKKyAgICBkb3VibGVfdCAgICAgICAgICAgICAgICAvLyBDOTkKKworLy8gQzkwCisKK2Zsb2F0aW5nX3BvaW50IGFicyhmbG9hdGluZ19wb2ludCB4KTsKKworZmxvYXRpbmdfcG9pbnQgYWNvcyAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGFjb3NmKGZsb2F0IHgpOworbG9uZyBkb3VibGUgICAgYWNvc2wobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IGFzaW4gKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBhc2luZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGFzaW5sKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBhdGFuIChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgYXRhbmYoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICBhdGFubChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgYXRhbjIgKGFyaXRobWV0aWMgeSwgYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGF0YW4yZihmbG9hdCB5LCBmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGF0YW4ybChsb25nIGRvdWJsZSB5LCBsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgY2VpbCAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGNlaWxmKGZsb2F0IHgpOworbG9uZyBkb3VibGUgICAgY2VpbGwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IGNvcyAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGNvc2YoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICBjb3NsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBjb3NoIChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgY29zaGYoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICBjb3NobChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgZXhwIChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgZXhwZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGV4cGwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IGZhYnMgKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBmYWJzZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGZhYnNsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBmbG9vciAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGZsb29yZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGZsb29ybChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgZm1vZCAoYXJpdGhtZXRpYyB4LCBhcml0aG1ldGljIHkpOworZmxvYXQgICAgICAgICAgZm1vZGYoZmxvYXQgeCwgZmxvYXQgeSk7Citsb25nIGRvdWJsZSAgICBmbW9kbChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KTsKKworZmxvYXRpbmdfcG9pbnQgZnJleHAgKGFyaXRobWV0aWMgdmFsdWUsIGludCogZXhwKTsKK2Zsb2F0ICAgICAgICAgIGZyZXhwZihmbG9hdCB2YWx1ZSwgaW50KiBleHApOworbG9uZyBkb3VibGUgICAgZnJleHBsKGxvbmcgZG91YmxlIHZhbHVlLCBpbnQqIGV4cCk7CisKK2Zsb2F0aW5nX3BvaW50IGxkZXhwIChhcml0aG1ldGljIHZhbHVlLCBpbnQgZXhwKTsKK2Zsb2F0ICAgICAgICAgIGxkZXhwZihmbG9hdCB2YWx1ZSwgaW50IGV4cCk7Citsb25nIGRvdWJsZSAgICBsZGV4cGwobG9uZyBkb3VibGUgdmFsdWUsIGludCBleHApOworCitmbG9hdGluZ19wb2ludCBsb2cgKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBsb2dmKGZsb2F0IHgpOworbG9uZyBkb3VibGUgICAgbG9nbChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgbG9nMTAgKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBsb2cxMGYoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICBsb2cxMGwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IG1vZGYgKGZsb2F0aW5nX3BvaW50IHZhbHVlLCBmbG9hdGluZ19wb2ludCogaXB0cik7CitmbG9hdCAgICAgICAgICBtb2RmZihmbG9hdCB2YWx1ZSwgZmxvYXQqIGlwdHIpOworbG9uZyBkb3VibGUgICAgbW9kZmwobG9uZyBkb3VibGUgdmFsdWUsIGxvbmcgZG91YmxlKiBpcHRyKTsKKworZmxvYXRpbmdfcG9pbnQgcG93IChhcml0aG1ldGljIHgsIGFyaXRobWV0aWMgeSk7CitmbG9hdCAgICAgICAgICBwb3dmKGZsb2F0IHgsIGZsb2F0IHkpOworbG9uZyBkb3VibGUgICAgcG93bChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KTsKKworZmxvYXRpbmdfcG9pbnQgc2luIChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgc2luZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIHNpbmwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IHNpbmggKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBzaW5oZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIHNpbmhsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBzcXJ0IChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgc3FydGYoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICBzcXJ0bChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgdGFuIChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgdGFuZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIHRhbmwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IHRhbmggKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICB0YW5oZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIHRhbmhsKGxvbmcgZG91YmxlIHgpOworCisvLyAgQzk5CisKK2Jvb2wgc2lnbmJpdChhcml0aG1ldGljIHgpOworCitpbnQgZnBjbGFzc2lmeShhcml0aG1ldGljIHgpOworCitib29sIGlzZmluaXRlKGFyaXRobWV0aWMgeCk7Citib29sIGlzaW5mKGFyaXRobWV0aWMgeCk7Citib29sIGlzbmFuKGFyaXRobWV0aWMgeCk7Citib29sIGlzbm9ybWFsKGFyaXRobWV0aWMgeCk7CisKK2Jvb2wgaXNncmVhdGVyKGFyaXRobWV0aWMgeCwgYXJpdGhtZXRpYyB5KTsKK2Jvb2wgaXNncmVhdGVyZXF1YWwoYXJpdGhtZXRpYyB4LCBhcml0aG1ldGljIHkpOworYm9vbCBpc2xlc3MoYXJpdGhtZXRpYyB4LCBhcml0aG1ldGljIHkpOworYm9vbCBpc2xlc3NlcXVhbChhcml0aG1ldGljIHgsIGFyaXRobWV0aWMgeSk7Citib29sIGlzbGVzc2dyZWF0ZXIoYXJpdGhtZXRpYyB4LCBhcml0aG1ldGljIHkpOworYm9vbCBpc3Vub3JkZXJlZChhcml0aG1ldGljIHgsIGFyaXRobWV0aWMgeSk7CisKK2Zsb2F0aW5nX3BvaW50IGFjb3NoIChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgYWNvc2hmKGZsb2F0IHgpOworbG9uZyBkb3VibGUgICAgYWNvc2hsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBhc2luaCAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGFzaW5oZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGFzaW5obChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgYXRhbmggKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBhdGFuaGYoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICBhdGFuaGwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IGNicnQgKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBjYnJ0ZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGNicnRsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBjb3B5c2lnbiAoYXJpdGhtZXRpYyB4LCBhcml0aG1ldGljIHkpOworZmxvYXQgICAgICAgICAgY29weXNpZ25mKGZsb2F0IHgsIGZsb2F0IHkpOworbG9uZyBkb3VibGUgICAgY29weXNpZ25sKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpOworCitmbG9hdGluZ19wb2ludCBlcmYgKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBlcmZmKGZsb2F0IHgpOworbG9uZyBkb3VibGUgICAgZXJmbChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgZXJmYyAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGVyZmNmKGZsb2F0IHgpOworbG9uZyBkb3VibGUgICAgZXJmY2wobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IGV4cDIgKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBleHAyZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGV4cDJsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBleHBtMSAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIGV4cG0xZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGV4cG0xbChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgZmRpbSAoYXJpdGhtZXRpYyB4LCBhcml0aG1ldGljIHkpOworZmxvYXQgICAgICAgICAgZmRpbWYoZmxvYXQgeCwgZmxvYXQgeSk7Citsb25nIGRvdWJsZSAgICBmZGltbChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KTsKKworZmxvYXRpbmdfcG9pbnQgZm1hIChhcml0aG1ldGljIHgsIGFyaXRobWV0aWMgeSwgYXJpdGhtZXRpYyB6KTsKK2Zsb2F0ICAgICAgICAgIGZtYWYoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7Citsb25nIGRvdWJsZSAgICBmbWFsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHksIGxvbmcgZG91YmxlIHopOworCitmbG9hdGluZ19wb2ludCBmbWF4IChhcml0aG1ldGljIHgsIGFyaXRobWV0aWMgeSk7CitmbG9hdCAgICAgICAgICBmbWF4ZihmbG9hdCB4LCBmbG9hdCB5KTsKK2xvbmcgZG91YmxlICAgIGZtYXhsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpOworCitmbG9hdGluZ19wb2ludCBmbWluIChhcml0aG1ldGljIHgsIGFyaXRobWV0aWMgeSk7CitmbG9hdCAgICAgICAgICBmbWluZihmbG9hdCB4LCBmbG9hdCB5KTsKK2xvbmcgZG91YmxlICAgIGZtaW5sKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpOworCitmbG9hdGluZ19wb2ludCBoeXBvdCAoYXJpdGhtZXRpYyB4LCBhcml0aG1ldGljIHkpOworZmxvYXQgICAgICAgICAgaHlwb3RmKGZsb2F0IHgsIGZsb2F0IHkpOworbG9uZyBkb3VibGUgICAgaHlwb3RsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpOworCitpbnQgaWxvZ2IgKGFyaXRobWV0aWMgeCk7CitpbnQgaWxvZ2JmKGZsb2F0IHgpOworaW50IGlsb2dibChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgbGdhbW1hIChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgbGdhbW1hZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGxnYW1tYWwobG9uZyBkb3VibGUgeCk7CisKK2xvbmcgbG9uZyBsbHJpbnQgKGFyaXRobWV0aWMgeCk7Citsb25nIGxvbmcgbGxyaW50ZihmbG9hdCB4KTsKK2xvbmcgbG9uZyBsbHJpbnRsKGxvbmcgZG91YmxlIHgpOworCitsb25nIGxvbmcgbGxyb3VuZCAoYXJpdGhtZXRpYyB4KTsKK2xvbmcgbG9uZyBsbHJvdW5kZihmbG9hdCB4KTsKK2xvbmcgbG9uZyBsbHJvdW5kbChsb25nIGRvdWJsZSB4KTsKKworZmxvYXRpbmdfcG9pbnQgbG9nMXAgKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBsb2cxcGYoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICBsb2cxcGwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IGxvZzIgKGFyaXRobWV0aWMgeCk7CitmbG9hdCAgICAgICAgICBsb2cyZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIGxvZzJsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBsb2diIChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgbG9nYmYoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICBsb2dibChsb25nIGRvdWJsZSB4KTsKKworbG9uZyBscmludCAoYXJpdGhtZXRpYyB4KTsKK2xvbmcgbHJpbnRmKGZsb2F0IHgpOworbG9uZyBscmludGwobG9uZyBkb3VibGUgeCk7CisKK2xvbmcgbHJvdW5kIChhcml0aG1ldGljIHgpOworbG9uZyBscm91bmRmKGZsb2F0IHgpOworbG9uZyBscm91bmRsKGxvbmcgZG91YmxlIHgpOworCitkb3VibGUgICAgICBuYW4gKGNvbnN0IGNoYXIqIHN0cik7CitmbG9hdCAgICAgICBuYW5mKGNvbnN0IGNoYXIqIHN0cik7Citsb25nIGRvdWJsZSBuYW5sKGNvbnN0IGNoYXIqIHN0cik7CisKK2Zsb2F0aW5nX3BvaW50IG5lYXJieWludCAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIG5lYXJieWludGYoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICBuZWFyYnlpbnRsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBuZXh0YWZ0ZXIgKGFyaXRobWV0aWMgeCwgYXJpdGhtZXRpYyB5KTsKK2Zsb2F0ICAgICAgICAgIG5leHRhZnRlcmYoZmxvYXQgeCwgZmxvYXQgeSk7Citsb25nIGRvdWJsZSAgICBuZXh0YWZ0ZXJsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpOworCitmbG9hdGluZ19wb2ludCBuZXh0dG93YXJkIChhcml0aG1ldGljIHgsIGxvbmcgZG91YmxlIHkpOworZmxvYXQgICAgICAgICAgbmV4dHRvd2FyZGYoZmxvYXQgeCwgbG9uZyBkb3VibGUgeSk7Citsb25nIGRvdWJsZSAgICBuZXh0dG93YXJkbChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KTsKKworZmxvYXRpbmdfcG9pbnQgcmVtYWluZGVyIChhcml0aG1ldGljIHgsIGFyaXRobWV0aWMgeSk7CitmbG9hdCAgICAgICAgICByZW1haW5kZXJmKGZsb2F0IHgsIGZsb2F0IHkpOworbG9uZyBkb3VibGUgICAgcmVtYWluZGVybChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KTsKKworZmxvYXRpbmdfcG9pbnQgcmVtcXVvIChhcml0aG1ldGljIHgsIGFyaXRobWV0aWMgeSwgaW50KiBwcXVvKTsKK2Zsb2F0ICAgICAgICAgIHJlbXF1b2YoZmxvYXQgeCwgZmxvYXQgeSwgaW50KiBwcXVvKTsKK2xvbmcgZG91YmxlICAgIHJlbXF1b2wobG9uZyBkb3VibGUgeCwgbG9uZyBkb3VibGUgeSwgaW50KiBwcXVvKTsKKworZmxvYXRpbmdfcG9pbnQgcmludCAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIHJpbnRmKGZsb2F0IHgpOworbG9uZyBkb3VibGUgICAgcmludGwobG9uZyBkb3VibGUgeCk7CisKK2Zsb2F0aW5nX3BvaW50IHJvdW5kIChhcml0aG1ldGljIHgpOworZmxvYXQgICAgICAgICAgcm91bmRmKGZsb2F0IHgpOworbG9uZyBkb3VibGUgICAgcm91bmRsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCBzY2FsYmxuIChhcml0aG1ldGljIHgsIGxvbmcgZXgpOworZmxvYXQgICAgICAgICAgc2NhbGJsbmYoZmxvYXQgeCwgbG9uZyBleCk7Citsb25nIGRvdWJsZSAgICBzY2FsYmxubChsb25nIGRvdWJsZSB4LCBsb25nIGV4KTsKKworZmxvYXRpbmdfcG9pbnQgc2NhbGJuIChhcml0aG1ldGljIHgsIGludCBleCk7CitmbG9hdCAgICAgICAgICBzY2FsYm5mKGZsb2F0IHgsIGludCBleCk7Citsb25nIGRvdWJsZSAgICBzY2FsYm5sKGxvbmcgZG91YmxlIHgsIGludCBleCk7CisKK2Zsb2F0aW5nX3BvaW50IHRnYW1tYSAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIHRnYW1tYWYoZmxvYXQgeCk7Citsb25nIGRvdWJsZSAgICB0Z2FtbWFsKGxvbmcgZG91YmxlIHgpOworCitmbG9hdGluZ19wb2ludCB0cnVuYyAoYXJpdGhtZXRpYyB4KTsKK2Zsb2F0ICAgICAgICAgIHRydW5jZihmbG9hdCB4KTsKK2xvbmcgZG91YmxlICAgIHRydW5jbChsb25nIGRvdWJsZSB4KTsKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2luY2x1ZGVfbmV4dCA8bWF0aC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKKworLy8gV2Ugc3VwcG9ydCBpbmNsdWRpbmcgLmggaGVhZGVycyBpbnNpZGUgJ2V4dGVybiAiQyInIGNvbnRleHRzLCBzbyBzd2l0Y2gKKy8vIGJhY2sgdG8gQysrIGxpbmthZ2UgYmVmb3JlIGluY2x1ZGluZyB0aGVzZSBDKysgaGVhZGVycy4KK2V4dGVybiAiQysrIiB7CisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKy8vIHNpZ25iaXQKKworI2lmZGVmIHNpZ25iaXQKKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK19MSUJDUFBfQUxXQVlTX0lOTElORQorYm9vbAorX19saWJjcHBfc2lnbmJpdChfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBzaWduYml0KF9fbGNwcF94KTsKK30KKworI3VuZGVmIHNpZ25iaXQKKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9BMT46OnZhbHVlLCBib29sPjo6dHlwZQorc2lnbmJpdChfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX2xpYmNwcF9zaWduYml0KCh0eXBlbmFtZSBzdGQ6Ol9fcHJvbW90ZTxfQTE+Ojp0eXBlKV9fbGNwcF94KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICBzdGQ6OmlzX2ludGVncmFsPF9BMT46OnZhbHVlICYmIHN0ZDo6aXNfc2lnbmVkPF9BMT46OnZhbHVlLCBib29sPjo6dHlwZQorc2lnbmJpdChfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVAoreyByZXR1cm4gX19sY3BwX3ggPCAwOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgc3RkOjppc19pbnRlZ3JhbDxfQTE+Ojp2YWx1ZSAmJiAhc3RkOjppc19zaWduZWQ8X0ExPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCitzaWduYml0KF9BMSkgX05PRVhDRVBUCit7IHJldHVybiBmYWxzZTsgfQorCisjZWxpZiBkZWZpbmVkKF9MSUJDUFBfTVNWQ1JUKQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X0ExPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCitzaWduYml0KF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUCit7CisgIHJldHVybiA6OnNpZ25iaXQoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgc3RkOjpfX3Byb21vdGU8X0ExPjo6dHlwZT4oX19sY3BwX3gpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICBzdGQ6OmlzX2ludGVncmFsPF9BMT46OnZhbHVlICYmIHN0ZDo6aXNfc2lnbmVkPF9BMT46OnZhbHVlLCBib29sPjo6dHlwZQorc2lnbmJpdChfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVAoreyByZXR1cm4gX19sY3BwX3ggPCAwOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgc3RkOjppc19pbnRlZ3JhbDxfQTE+Ojp2YWx1ZSAmJiAhc3RkOjppc19zaWduZWQ8X0ExPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCitzaWduYml0KF9BMSkgX05PRVhDRVBUCit7IHJldHVybiBmYWxzZTsgfQorCisjZW5kaWYgIC8vIHNpZ25iaXQKKworLy8gZnBjbGFzc2lmeQorCisjaWZkZWYgZnBjbGFzc2lmeQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgorX0xJQkNQUF9BTFdBWVNfSU5MSU5FCitpbnQKK19fbGliY3BwX2ZwY2xhc3NpZnkoX0ExIF9fbGNwcF94KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gZnBjbGFzc2lmeShfX2xjcHBfeCk7Cit9CisKKyN1bmRlZiBmcGNsYXNzaWZ5CisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19mbG9hdGluZ19wb2ludDxfQTE+Ojp2YWx1ZSwgaW50Pjo6dHlwZQorZnBjbGFzc2lmeShfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX2xpYmNwcF9mcGNsYXNzaWZ5KCh0eXBlbmFtZSBzdGQ6Ol9fcHJvbW90ZTxfQTE+Ojp0eXBlKV9fbGNwcF94KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPF9BMT46OnZhbHVlLCBpbnQ+Ojp0eXBlCitmcGNsYXNzaWZ5KF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUCit7IHJldHVybiBfX2xjcHBfeCA9PSAwID8gRlBfWkVSTyA6IEZQX05PUk1BTDsgfQorCisjZWxpZiBkZWZpbmVkKF9MSUJDUFBfTVNWQ1JUKQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X0ExPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCitmcGNsYXNzaWZ5KF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUCit7CisgIHJldHVybiA6OmZwY2xhc3NpZnkoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgc3RkOjpfX3Byb21vdGU8X0ExPjo6dHlwZT4oX19sY3BwX3gpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPF9BMT46OnZhbHVlLCBpbnQ+Ojp0eXBlCitmcGNsYXNzaWZ5KF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUCit7IHJldHVybiBfX2xjcHBfeCA9PSAwID8gRlBfWkVSTyA6IEZQX05PUk1BTDsgfQorCisjZW5kaWYgIC8vIGZwY2xhc3NpZnkKKworLy8gaXNmaW5pdGUKKworI2lmZGVmIGlzZmluaXRlCisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitfTElCQ1BQX0FMV0FZU19JTkxJTkUKK2Jvb2wKK19fbGliY3BwX2lzZmluaXRlKF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIGlzZmluaXRlKF9fbGNwcF94KTsKK30KKworI3VuZGVmIGlzZmluaXRlCisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMT46OnZhbHVlICYmIHN0ZDo6bnVtZXJpY19saW1pdHM8X0ExPjo6aGFzX2luZmluaXR5LAorICAgIGJvb2w+Ojp0eXBlCitpc2Zpbml0ZShfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX2xpYmNwcF9pc2Zpbml0ZSgodHlwZW5hbWUgc3RkOjpfX3Byb21vdGU8X0ExPjo6dHlwZSlfX2xjcHBfeCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMT46OnZhbHVlICYmICFzdGQ6Om51bWVyaWNfbGltaXRzPF9BMT46Omhhc19pbmZpbml0eSwKKyAgICBib29sPjo6dHlwZQoraXNmaW5pdGUoX0ExKSBfTk9FWENFUFQKK3sgcmV0dXJuIHRydWU7IH0KKworI2VuZGlmICAvLyBpc2Zpbml0ZQorCisvLyBpc2luZgorCisjaWZkZWYgaXNpbmYKKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK19MSUJDUFBfQUxXQVlTX0lOTElORQorYm9vbAorX19saWJjcHBfaXNpbmYoX0ExIF9fbGNwcF94KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gaXNpbmYoX19sY3BwX3gpOworfQorCisjdW5kZWYgaXNpbmYKKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICBzdGQ6OmlzX2FyaXRobWV0aWM8X0ExPjo6dmFsdWUgJiYgc3RkOjpudW1lcmljX2xpbWl0czxfQTE+OjpoYXNfaW5maW5pdHksCisgICAgYm9vbD46OnR5cGUKK2lzaW5mKF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fbGliY3BwX2lzaW5mKCh0eXBlbmFtZSBzdGQ6Ol9fcHJvbW90ZTxfQTE+Ojp0eXBlKV9fbGNwcF94KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICBzdGQ6OmlzX2FyaXRobWV0aWM8X0ExPjo6dmFsdWUgJiYgIXN0ZDo6bnVtZXJpY19saW1pdHM8X0ExPjo6aGFzX2luZmluaXR5LAorICAgIGJvb2w+Ojp0eXBlCitpc2luZihfQTEpIF9OT0VYQ0VQVAoreyByZXR1cm4gZmFsc2U7IH0KKworI2VuZGlmICAvLyBpc2luZgorCisvLyBpc25hbgorCisjaWZkZWYgaXNuYW4KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK19MSUJDUFBfQUxXQVlTX0lOTElORQorYm9vbAorX19saWJjcHBfaXNuYW4oX0ExIF9fbGNwcF94KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gaXNuYW4oX19sY3BwX3gpOworfQorCisjdW5kZWYgaXNuYW4KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9BMT46OnZhbHVlLCBib29sPjo6dHlwZQoraXNuYW4oX0ExIF9fbGNwcF94KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19saWJjcHBfaXNuYW4oKHR5cGVuYW1lIHN0ZDo6X19wcm9tb3RlPF9BMT46OnR5cGUpX19sY3BwX3gpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCitpc25hbihfQTEpIF9OT0VYQ0VQVAoreyByZXR1cm4gZmFsc2U7IH0KKworI2VuZGlmICAvLyBpc25hbgorCisvLyBpc25vcm1hbAorCisjaWZkZWYgaXNub3JtYWwKKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK19MSUJDUFBfQUxXQVlTX0lOTElORQorYm9vbAorX19saWJjcHBfaXNub3JtYWwoX0ExIF9fbGNwcF94KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gaXNub3JtYWwoX19sY3BwX3gpOworfQorCisjdW5kZWYgaXNub3JtYWwKKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9BMT46OnZhbHVlLCBib29sPjo6dHlwZQoraXNub3JtYWwoX0ExIF9fbGNwcF94KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19saWJjcHBfaXNub3JtYWwoKHR5cGVuYW1lIHN0ZDo6X19wcm9tb3RlPF9BMT46OnR5cGUpX19sY3BwX3gpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCitpc25vcm1hbChfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVAoreyByZXR1cm4gX19sY3BwX3ggIT0gMDsgfQorCisjZW5kaWYgIC8vIGlzbm9ybWFsCisKKy8vIGlzZ3JlYXRlcgorCisjaWZkZWYgaXNncmVhdGVyCisKK3RlbXBsYXRlIDxjbGFzcyBfQTEsIGNsYXNzIF9BMj4KK19MSUJDUFBfQUxXQVlTX0lOTElORQorYm9vbAorX19saWJjcHBfaXNncmVhdGVyKF9BMSBfX2xjcHBfeCwgX0EyIF9fbGNwcF95KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gaXNncmVhdGVyKF9fbGNwcF94LCBfX2xjcHBfeSk7Cit9CisKKyN1bmRlZiBpc2dyZWF0ZXIKKwordGVtcGxhdGUgPGNsYXNzIF9BMSwgY2xhc3MgX0EyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmCis8CisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMT46OnZhbHVlICYmCisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMj46OnZhbHVlLAorICAgIGJvb2wKKz46OnR5cGUKK2lzZ3JlYXRlcihfQTEgX19sY3BwX3gsIF9BMiBfX2xjcHBfeSkgX05PRVhDRVBUCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9fcHJvbW90ZTxfQTEsIF9BMj46OnR5cGUgdHlwZTsKKyAgICByZXR1cm4gX19saWJjcHBfaXNncmVhdGVyKCh0eXBlKV9fbGNwcF94LCAodHlwZSlfX2xjcHBfeSk7Cit9CisKKyNlbmRpZiAgLy8gaXNncmVhdGVyCisKKy8vIGlzZ3JlYXRlcmVxdWFsCisKKyNpZmRlZiBpc2dyZWF0ZXJlcXVhbAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExLCBjbGFzcyBfQTI+CitfTElCQ1BQX0FMV0FZU19JTkxJTkUKK2Jvb2wKK19fbGliY3BwX2lzZ3JlYXRlcmVxdWFsKF9BMSBfX2xjcHBfeCwgX0EyIF9fbGNwcF95KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gaXNncmVhdGVyZXF1YWwoX19sY3BwX3gsIF9fbGNwcF95KTsKK30KKworI3VuZGVmIGlzZ3JlYXRlcmVxdWFsCisKK3RlbXBsYXRlIDxjbGFzcyBfQTEsIGNsYXNzIF9BMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZgorPAorICAgIHN0ZDo6aXNfYXJpdGhtZXRpYzxfQTE+Ojp2YWx1ZSAmJgorICAgIHN0ZDo6aXNfYXJpdGhtZXRpYzxfQTI+Ojp2YWx1ZSwKKyAgICBib29sCis+Ojp0eXBlCitpc2dyZWF0ZXJlcXVhbChfQTEgX19sY3BwX3gsIF9BMiBfX2xjcHBfeSkgX05PRVhDRVBUCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9fcHJvbW90ZTxfQTEsIF9BMj46OnR5cGUgdHlwZTsKKyAgICByZXR1cm4gX19saWJjcHBfaXNncmVhdGVyZXF1YWwoKHR5cGUpX19sY3BwX3gsICh0eXBlKV9fbGNwcF95KTsKK30KKworI2VuZGlmICAvLyBpc2dyZWF0ZXJlcXVhbAorCisvLyBpc2xlc3MKKworI2lmZGVmIGlzbGVzcworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExLCBjbGFzcyBfQTI+CitfTElCQ1BQX0FMV0FZU19JTkxJTkUKK2Jvb2wKK19fbGliY3BwX2lzbGVzcyhfQTEgX19sY3BwX3gsIF9BMiBfX2xjcHBfeSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIGlzbGVzcyhfX2xjcHBfeCwgX19sY3BwX3kpOworfQorCisjdW5kZWYgaXNsZXNzCisKK3RlbXBsYXRlIDxjbGFzcyBfQTEsIGNsYXNzIF9BMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZgorPAorICAgIHN0ZDo6aXNfYXJpdGhtZXRpYzxfQTE+Ojp2YWx1ZSAmJgorICAgIHN0ZDo6aXNfYXJpdGhtZXRpYzxfQTI+Ojp2YWx1ZSwKKyAgICBib29sCis+Ojp0eXBlCitpc2xlc3MoX0ExIF9fbGNwcF94LCBfQTIgX19sY3BwX3kpIF9OT0VYQ0VQVAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX3Byb21vdGU8X0ExLCBfQTI+Ojp0eXBlIHR5cGU7CisgICAgcmV0dXJuIF9fbGliY3BwX2lzbGVzcygodHlwZSlfX2xjcHBfeCwgKHR5cGUpX19sY3BwX3kpOworfQorCisjZW5kaWYgIC8vIGlzbGVzcworCisvLyBpc2xlc3NlcXVhbAorCisjaWZkZWYgaXNsZXNzZXF1YWwKKwordGVtcGxhdGUgPGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorX0xJQkNQUF9BTFdBWVNfSU5MSU5FCitib29sCitfX2xpYmNwcF9pc2xlc3NlcXVhbChfQTEgX19sY3BwX3gsIF9BMiBfX2xjcHBfeSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIGlzbGVzc2VxdWFsKF9fbGNwcF94LCBfX2xjcHBfeSk7Cit9CisKKyN1bmRlZiBpc2xlc3NlcXVhbAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExLCBjbGFzcyBfQTI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWYKKzwKKyAgICBzdGQ6OmlzX2FyaXRobWV0aWM8X0ExPjo6dmFsdWUgJiYKKyAgICBzdGQ6OmlzX2FyaXRobWV0aWM8X0EyPjo6dmFsdWUsCisgICAgYm9vbAorPjo6dHlwZQoraXNsZXNzZXF1YWwoX0ExIF9fbGNwcF94LCBfQTIgX19sY3BwX3kpIF9OT0VYQ0VQVAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX3Byb21vdGU8X0ExLCBfQTI+Ojp0eXBlIHR5cGU7CisgICAgcmV0dXJuIF9fbGliY3BwX2lzbGVzc2VxdWFsKCh0eXBlKV9fbGNwcF94LCAodHlwZSlfX2xjcHBfeSk7Cit9CisKKyNlbmRpZiAgLy8gaXNsZXNzZXF1YWwKKworLy8gaXNsZXNzZ3JlYXRlcgorCisjaWZkZWYgaXNsZXNzZ3JlYXRlcgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExLCBjbGFzcyBfQTI+CitfTElCQ1BQX0FMV0FZU19JTkxJTkUKK2Jvb2wKK19fbGliY3BwX2lzbGVzc2dyZWF0ZXIoX0ExIF9fbGNwcF94LCBfQTIgX19sY3BwX3kpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBpc2xlc3NncmVhdGVyKF9fbGNwcF94LCBfX2xjcHBfeSk7Cit9CisKKyN1bmRlZiBpc2xlc3NncmVhdGVyCisKK3RlbXBsYXRlIDxjbGFzcyBfQTEsIGNsYXNzIF9BMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZgorPAorICAgIHN0ZDo6aXNfYXJpdGhtZXRpYzxfQTE+Ojp2YWx1ZSAmJgorICAgIHN0ZDo6aXNfYXJpdGhtZXRpYzxfQTI+Ojp2YWx1ZSwKKyAgICBib29sCis+Ojp0eXBlCitpc2xlc3NncmVhdGVyKF9BMSBfX2xjcHBfeCwgX0EyIF9fbGNwcF95KSBfTk9FWENFUFQKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19wcm9tb3RlPF9BMSwgX0EyPjo6dHlwZSB0eXBlOworICAgIHJldHVybiBfX2xpYmNwcF9pc2xlc3NncmVhdGVyKCh0eXBlKV9fbGNwcF94LCAodHlwZSlfX2xjcHBfeSk7Cit9CisKKyNlbmRpZiAgLy8gaXNsZXNzZ3JlYXRlcgorCisvLyBpc3Vub3JkZXJlZAorCisjaWZkZWYgaXN1bm9yZGVyZWQKKwordGVtcGxhdGUgPGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorX0xJQkNQUF9BTFdBWVNfSU5MSU5FCitib29sCitfX2xpYmNwcF9pc3Vub3JkZXJlZChfQTEgX19sY3BwX3gsIF9BMiBfX2xjcHBfeSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIGlzdW5vcmRlcmVkKF9fbGNwcF94LCBfX2xjcHBfeSk7Cit9CisKKyN1bmRlZiBpc3Vub3JkZXJlZAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExLCBjbGFzcyBfQTI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWYKKzwKKyAgICBzdGQ6OmlzX2FyaXRobWV0aWM8X0ExPjo6dmFsdWUgJiYKKyAgICBzdGQ6OmlzX2FyaXRobWV0aWM8X0EyPjo6dmFsdWUsCisgICAgYm9vbAorPjo6dHlwZQoraXN1bm9yZGVyZWQoX0ExIF9fbGNwcF94LCBfQTIgX19sY3BwX3kpIF9OT0VYQ0VQVAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX3Byb21vdGU8X0ExLCBfQTI+Ojp0eXBlIHR5cGU7CisgICAgcmV0dXJuIF9fbGliY3BwX2lzdW5vcmRlcmVkKCh0eXBlKV9fbGNwcF94LCAodHlwZSlfX2xjcHBfeSk7Cit9CisKKyNlbmRpZiAgLy8gaXN1bm9yZGVyZWQKKworLy8gYWJzCisKKyNpZiAhKGRlZmluZWQoX0FJWCkgfHwgZGVmaW5lZChfX3N1bl9fKSkKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitmbG9hdAorYWJzKGZsb2F0IF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmZhYnNmKF9fbGNwcF94KTt9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitkb3VibGUKK2Ficyhkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6ZmFicyhfX2xjcHBfeCk7fQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorbG9uZyBkb3VibGUKK2Ficyhsb25nIGRvdWJsZSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjpmYWJzbChfX2xjcHBfeCk7fQorI2VuZGlmIC8vICEoZGVmaW5lZChfQUlYKSB8fCBkZWZpbmVkKF9fc3VuX18pKQorCisvLyBhY29zCisKKyNpZiAhKGRlZmluZWQoX0FJWCkgfHwgZGVmaW5lZChfX3N1bl9fKSkKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIGFjb3MoZmxvYXQgX19sY3BwX3gpIF9OT0VYQ0VQVCAgICAgICB7cmV0dXJuIDo6YWNvc2YoX19sY3BwX3gpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgZG91YmxlIGFjb3MobG9uZyBkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6YWNvc2woX19sY3BwX3gpO30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGRvdWJsZT46OnR5cGUKK2Fjb3MoX0ExIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmFjb3MoKGRvdWJsZSlfX2xjcHBfeCk7fQorCisvLyBhc2luCisKKyNpZiAhKGRlZmluZWQoX0FJWCkgfHwgZGVmaW5lZChfX3N1bl9fKSkKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIGFzaW4oZmxvYXQgX19sY3BwX3gpIF9OT0VYQ0VQVCAgICAgICB7cmV0dXJuIDo6YXNpbmYoX19sY3BwX3gpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgZG91YmxlIGFzaW4obG9uZyBkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6YXNpbmwoX19sY3BwX3gpO30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGRvdWJsZT46OnR5cGUKK2FzaW4oX0ExIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmFzaW4oKGRvdWJsZSlfX2xjcHBfeCk7fQorCisvLyBhdGFuCisKKyNpZiAhKGRlZmluZWQoX0FJWCkgfHwgZGVmaW5lZChfX3N1bl9fKSkKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIGF0YW4oZmxvYXQgX19sY3BwX3gpIF9OT0VYQ0VQVCAgICAgICB7cmV0dXJuIDo6YXRhbmYoX19sY3BwX3gpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgZG91YmxlIGF0YW4obG9uZyBkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6YXRhbmwoX19sY3BwX3gpO30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGRvdWJsZT46OnR5cGUKK2F0YW4oX0ExIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmF0YW4oKGRvdWJsZSlfX2xjcHBfeCk7fQorCisvLyBhdGFuMgorCisjaWYgIShkZWZpbmVkKF9BSVgpIHx8IGRlZmluZWQoX19zdW5fXykpCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmbG9hdCAgICAgICBhdGFuMihmbG9hdCBfX2xjcHBfeSwgZmxvYXQgX19sY3BwX3gpIF9OT0VYQ0VQVCAgICAgICAgICAgICB7cmV0dXJuIDo6YXRhbjJmKF9fbGNwcF95LCBfX2xjcHBfeCk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgYXRhbjIobG9uZyBkb3VibGUgX19sY3BwX3ksIGxvbmcgZG91YmxlIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmF0YW4ybChfX2xjcHBfeSwgX19sY3BwX3gpO30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExLCBjbGFzcyBfQTI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjpfX2xhenlfZW5hYmxlX2lmCis8CisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMT46OnZhbHVlICYmCisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMj46OnZhbHVlLAorICAgIHN0ZDo6X19wcm9tb3RlPF9BMSwgX0EyPgorPjo6dHlwZQorYXRhbjIoX0ExIF9fbGNwcF95LCBfQTIgX19sY3BwX3gpIF9OT0VYQ0VQVAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX3Byb21vdGU8X0ExLCBfQTI+Ojp0eXBlIF9fcmVzdWx0X3R5cGU7CisgICAgc3RhdGljX2Fzc2VydCgoIShzdGQ6OmlzX3NhbWU8X0ExLCBfX3Jlc3VsdF90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxfQTIsIF9fcmVzdWx0X3R5cGU+Ojp2YWx1ZSkpLCAiIik7CisgICAgcmV0dXJuIDo6YXRhbjIoKF9fcmVzdWx0X3R5cGUpX19sY3BwX3ksIChfX3Jlc3VsdF90eXBlKV9fbGNwcF94KTsKK30KKworLy8gY2VpbAorCisjaWYgIShkZWZpbmVkKF9BSVgpIHx8IGRlZmluZWQoX19zdW5fXykpCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmbG9hdCAgICAgICBjZWlsKGZsb2F0IF9fbGNwcF94KSBfTk9FWENFUFQgICAgICAge3JldHVybiA6OmNlaWxmKF9fbGNwcF94KTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSBjZWlsKGxvbmcgZG91YmxlIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmNlaWxsKF9fbGNwcF94KTt9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPF9BMT46OnZhbHVlLCBkb3VibGU+Ojp0eXBlCitjZWlsKF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjpjZWlsKChkb3VibGUpX19sY3BwX3gpO30KKworLy8gY29zCisKKyNpZiAhKGRlZmluZWQoX0FJWCkgfHwgZGVmaW5lZChfX3N1bl9fKSkKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIGNvcyhmbG9hdCBfX2xjcHBfeCkgX05PRVhDRVBUICAgICAgIHtyZXR1cm4gOjpjb3NmKF9fbGNwcF94KTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSBjb3MobG9uZyBkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6Y29zbChfX2xjcHBfeCk7fQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxfQTE+Ojp2YWx1ZSwgZG91YmxlPjo6dHlwZQorY29zKF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjpjb3MoKGRvdWJsZSlfX2xjcHBfeCk7fQorCisvLyBjb3NoCisKKyNpZiAhKGRlZmluZWQoX0FJWCkgfHwgZGVmaW5lZChfX3N1bl9fKSkKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIGNvc2goZmxvYXQgX19sY3BwX3gpIF9OT0VYQ0VQVCAgICAgICB7cmV0dXJuIDo6Y29zaGYoX19sY3BwX3gpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgZG91YmxlIGNvc2gobG9uZyBkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6Y29zaGwoX19sY3BwX3gpO30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGRvdWJsZT46OnR5cGUKK2Nvc2goX0ExIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmNvc2goKGRvdWJsZSlfX2xjcHBfeCk7fQorCisvLyBleHAKKworI2lmICEoZGVmaW5lZChfQUlYKSB8fCBkZWZpbmVkKF9fc3VuX18pKQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZmxvYXQgICAgICAgZXhwKGZsb2F0IF9fbGNwcF94KSBfTk9FWENFUFQgICAgICAge3JldHVybiA6OmV4cGYoX19sY3BwX3gpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgZG91YmxlIGV4cChsb25nIGRvdWJsZSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjpleHBsKF9fbGNwcF94KTt9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPF9BMT46OnZhbHVlLCBkb3VibGU+Ojp0eXBlCitleHAoX0ExIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmV4cCgoZG91YmxlKV9fbGNwcF94KTt9CisKKy8vIGZhYnMKKworI2lmICEoZGVmaW5lZChfQUlYKSB8fCBkZWZpbmVkKF9fc3VuX18pKQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZmxvYXQgICAgICAgZmFicyhmbG9hdCBfX2xjcHBfeCkgX05PRVhDRVBUICAgICAgIHtyZXR1cm4gOjpmYWJzZihfX2xjcHBfeCk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgZmFicyhsb25nIGRvdWJsZSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjpmYWJzbChfX2xjcHBfeCk7fQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxfQTE+Ojp2YWx1ZSwgZG91YmxlPjo6dHlwZQorZmFicyhfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6ZmFicygoZG91YmxlKV9fbGNwcF94KTt9CisKKy8vIGZsb29yCisKKyNpZiAhKGRlZmluZWQoX0FJWCkgfHwgZGVmaW5lZChfX3N1bl9fKSkKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIGZsb29yKGZsb2F0IF9fbGNwcF94KSBfTk9FWENFUFQgICAgICAge3JldHVybiA6OmZsb29yZihfX2xjcHBfeCk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgZmxvb3IobG9uZyBkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6Zmxvb3JsKF9fbGNwcF94KTt9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPF9BMT46OnZhbHVlLCBkb3VibGU+Ojp0eXBlCitmbG9vcihfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6Zmxvb3IoKGRvdWJsZSlfX2xjcHBfeCk7fQorCisvLyBmbW9kCisKKyNpZiAhKGRlZmluZWQoX0FJWCkgfHwgZGVmaW5lZChfX3N1bl9fKSkKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIGZtb2QoZmxvYXQgX19sY3BwX3gsIGZsb2F0IF9fbGNwcF95KSBfTk9FWENFUFQgICAgICAgICAgICAge3JldHVybiA6OmZtb2RmKF9fbGNwcF94LCBfX2xjcHBfeSk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgZm1vZChsb25nIGRvdWJsZSBfX2xjcHBfeCwgbG9uZyBkb3VibGUgX19sY3BwX3kpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6Zm1vZGwoX19sY3BwX3gsIF9fbGNwcF95KTt9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9BMSwgY2xhc3MgX0EyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6X19sYXp5X2VuYWJsZV9pZgorPAorICAgIHN0ZDo6aXNfYXJpdGhtZXRpYzxfQTE+Ojp2YWx1ZSAmJgorICAgIHN0ZDo6aXNfYXJpdGhtZXRpYzxfQTI+Ojp2YWx1ZSwKKyAgICBzdGQ6Ol9fcHJvbW90ZTxfQTEsIF9BMj4KKz46OnR5cGUKK2Ztb2QoX0ExIF9fbGNwcF94LCBfQTIgX19sY3BwX3kpIF9OT0VYQ0VQVAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX3Byb21vdGU8X0ExLCBfQTI+Ojp0eXBlIF9fcmVzdWx0X3R5cGU7CisgICAgc3RhdGljX2Fzc2VydCgoIShzdGQ6OmlzX3NhbWU8X0ExLCBfX3Jlc3VsdF90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxfQTIsIF9fcmVzdWx0X3R5cGU+Ojp2YWx1ZSkpLCAiIik7CisgICAgcmV0dXJuIDo6Zm1vZCgoX19yZXN1bHRfdHlwZSlfX2xjcHBfeCwgKF9fcmVzdWx0X3R5cGUpX19sY3BwX3kpOworfQorCisvLyBmcmV4cAorCisjaWYgIShkZWZpbmVkKF9BSVgpIHx8IGRlZmluZWQoX19zdW5fXykpCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmbG9hdCAgICAgICBmcmV4cChmbG9hdCBfX2xjcHBfeCwgaW50KiBfX2xjcHBfZSkgX05PRVhDRVBUICAgICAgIHtyZXR1cm4gOjpmcmV4cGYoX19sY3BwX3gsIF9fbGNwcF9lKTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSBmcmV4cChsb25nIGRvdWJsZSBfX2xjcHBfeCwgaW50KiBfX2xjcHBfZSkgX05PRVhDRVBUIHtyZXR1cm4gOjpmcmV4cGwoX19sY3BwX3gsIF9fbGNwcF9lKTt9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPF9BMT46OnZhbHVlLCBkb3VibGU+Ojp0eXBlCitmcmV4cChfQTEgX19sY3BwX3gsIGludCogX19sY3BwX2UpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6ZnJleHAoKGRvdWJsZSlfX2xjcHBfeCwgX19sY3BwX2UpO30KKworLy8gbGRleHAKKworI2lmICEoZGVmaW5lZChfQUlYKSB8fCBkZWZpbmVkKF9fc3VuX18pKQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZmxvYXQgICAgICAgbGRleHAoZmxvYXQgX19sY3BwX3gsIGludCBfX2xjcHBfZSkgX05PRVhDRVBUICAgICAgIHtyZXR1cm4gOjpsZGV4cGYoX19sY3BwX3gsIF9fbGNwcF9lKTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSBsZGV4cChsb25nIGRvdWJsZSBfX2xjcHBfeCwgaW50IF9fbGNwcF9lKSBfTk9FWENFUFQge3JldHVybiA6OmxkZXhwbChfX2xjcHBfeCwgX19sY3BwX2UpO30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGRvdWJsZT46OnR5cGUKK2xkZXhwKF9BMSBfX2xjcHBfeCwgaW50IF9fbGNwcF9lKSBfTk9FWENFUFQge3JldHVybiA6OmxkZXhwKChkb3VibGUpX19sY3BwX3gsIF9fbGNwcF9lKTt9CisKKy8vIGxvZworCisjaWYgIShkZWZpbmVkKF9BSVgpIHx8IGRlZmluZWQoX19zdW5fXykpCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmbG9hdCAgICAgICBsb2coZmxvYXQgX19sY3BwX3gpIF9OT0VYQ0VQVCAgICAgICB7cmV0dXJuIDo6bG9nZihfX2xjcHBfeCk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgbG9nKGxvbmcgZG91YmxlIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmxvZ2woX19sY3BwX3gpO30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGRvdWJsZT46OnR5cGUKK2xvZyhfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6bG9nKChkb3VibGUpX19sY3BwX3gpO30KKworLy8gbG9nMTAKKworI2lmICEoZGVmaW5lZChfQUlYKSB8fCBkZWZpbmVkKF9fc3VuX18pKQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZmxvYXQgICAgICAgbG9nMTAoZmxvYXQgX19sY3BwX3gpIF9OT0VYQ0VQVCAgICAgICB7cmV0dXJuIDo6bG9nMTBmKF9fbGNwcF94KTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSBsb2cxMChsb25nIGRvdWJsZSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjpsb2cxMGwoX19sY3BwX3gpO30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGRvdWJsZT46OnR5cGUKK2xvZzEwKF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjpsb2cxMCgoZG91YmxlKV9fbGNwcF94KTt9CisKKy8vIG1vZGYKKworI2lmICEoZGVmaW5lZChfQUlYKSB8fCBkZWZpbmVkKF9fc3VuX18pKQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZmxvYXQgICAgICAgbW9kZihmbG9hdCBfX2xjcHBfeCwgZmxvYXQqIF9fbGNwcF95KSBfTk9FWENFUFQgICAgICAgICAgICAge3JldHVybiA6Om1vZGZmKF9fbGNwcF94LCBfX2xjcHBfeSk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgbW9kZihsb25nIGRvdWJsZSBfX2xjcHBfeCwgbG9uZyBkb3VibGUqIF9fbGNwcF95KSBfTk9FWENFUFQge3JldHVybiA6Om1vZGZsKF9fbGNwcF94LCBfX2xjcHBfeSk7fQorI2VuZGlmCisKKy8vIHBvdworCisjaWYgIShkZWZpbmVkKF9BSVgpIHx8IGRlZmluZWQoX19zdW5fXykpCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmbG9hdCAgICAgICBwb3coZmxvYXQgX19sY3BwX3gsIGZsb2F0IF9fbGNwcF95KSBfTk9FWENFUFQgICAgICAgICAgICAge3JldHVybiA6OnBvd2YoX19sY3BwX3gsIF9fbGNwcF95KTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSBwb3cobG9uZyBkb3VibGUgX19sY3BwX3gsIGxvbmcgZG91YmxlIF9fbGNwcF95KSBfTk9FWENFUFQge3JldHVybiA6OnBvd2woX19sY3BwX3gsIF9fbGNwcF95KTt9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9BMSwgY2xhc3MgX0EyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6X19sYXp5X2VuYWJsZV9pZgorPAorICAgIHN0ZDo6aXNfYXJpdGhtZXRpYzxfQTE+Ojp2YWx1ZSAmJgorICAgIHN0ZDo6aXNfYXJpdGhtZXRpYzxfQTI+Ojp2YWx1ZSwKKyAgICBzdGQ6Ol9fcHJvbW90ZTxfQTEsIF9BMj4KKz46OnR5cGUKK3BvdyhfQTEgX19sY3BwX3gsIF9BMiBfX2xjcHBfeSkgX05PRVhDRVBUCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9fcHJvbW90ZTxfQTEsIF9BMj46OnR5cGUgX19yZXN1bHRfdHlwZTsKKyAgICBzdGF0aWNfYXNzZXJ0KCghKHN0ZDo6aXNfc2FtZTxfQTEsIF9fcmVzdWx0X3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPF9BMiwgX19yZXN1bHRfdHlwZT46OnZhbHVlKSksICIiKTsKKyAgICByZXR1cm4gOjpwb3coKF9fcmVzdWx0X3R5cGUpX19sY3BwX3gsIChfX3Jlc3VsdF90eXBlKV9fbGNwcF95KTsKK30KKworLy8gc2luCisKKyNpZiAhKGRlZmluZWQoX0FJWCkgfHwgZGVmaW5lZChfX3N1bl9fKSkKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIHNpbihmbG9hdCBfX2xjcHBfeCkgX05PRVhDRVBUICAgICAgIHtyZXR1cm4gOjpzaW5mKF9fbGNwcF94KTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSBzaW4obG9uZyBkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6c2lubChfX2xjcHBfeCk7fQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxfQTE+Ojp2YWx1ZSwgZG91YmxlPjo6dHlwZQorc2luKF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjpzaW4oKGRvdWJsZSlfX2xjcHBfeCk7fQorCisvLyBzaW5oCisKKyNpZiAhKGRlZmluZWQoX0FJWCkgfHwgZGVmaW5lZChfX3N1bl9fKSkKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIHNpbmgoZmxvYXQgX19sY3BwX3gpIF9OT0VYQ0VQVCAgICAgICB7cmV0dXJuIDo6c2luaGYoX19sY3BwX3gpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgZG91YmxlIHNpbmgobG9uZyBkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6c2luaGwoX19sY3BwX3gpO30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGRvdWJsZT46OnR5cGUKK3NpbmgoX0ExIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OnNpbmgoKGRvdWJsZSlfX2xjcHBfeCk7fQorCisvLyBzcXJ0CisKKyNpZiAhKGRlZmluZWQoX0FJWCkgfHwgZGVmaW5lZChfX3N1bl9fKSkKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIHNxcnQoZmxvYXQgX19sY3BwX3gpIF9OT0VYQ0VQVCAgICAgICB7cmV0dXJuIDo6c3FydGYoX19sY3BwX3gpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgZG91YmxlIHNxcnQobG9uZyBkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6c3FydGwoX19sY3BwX3gpO30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGRvdWJsZT46OnR5cGUKK3NxcnQoX0ExIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OnNxcnQoKGRvdWJsZSlfX2xjcHBfeCk7fQorCisvLyB0YW4KKworI2lmICEoZGVmaW5lZChfQUlYKSB8fCBkZWZpbmVkKF9fc3VuX18pKQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZmxvYXQgICAgICAgdGFuKGZsb2F0IF9fbGNwcF94KSBfTk9FWENFUFQgICAgICAge3JldHVybiA6OnRhbmYoX19sY3BwX3gpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgZG91YmxlIHRhbihsb25nIGRvdWJsZSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjp0YW5sKF9fbGNwcF94KTt9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPF9BMT46OnZhbHVlLCBkb3VibGU+Ojp0eXBlCit0YW4oX0ExIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OnRhbigoZG91YmxlKV9fbGNwcF94KTt9CisKKy8vIHRhbmgKKworI2lmICEoZGVmaW5lZChfQUlYKSB8fCBkZWZpbmVkKF9fc3VuX18pKQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZmxvYXQgICAgICAgdGFuaChmbG9hdCBfX2xjcHBfeCkgX05PRVhDRVBUICAgICAgIHtyZXR1cm4gOjp0YW5oZihfX2xjcHBfeCk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgdGFuaChsb25nIGRvdWJsZSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjp0YW5obChfX2xjcHBfeCk7fQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxfQTE+Ojp2YWx1ZSwgZG91YmxlPjo6dHlwZQordGFuaChfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6dGFuaCgoZG91YmxlKV9fbGNwcF94KTt9CisKKy8vIGFjb3NoCisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIGFjb3NoKGZsb2F0IF9fbGNwcF94KSBfTk9FWENFUFQgICAgICAge3JldHVybiA6OmFjb3NoZihfX2xjcHBfeCk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgYWNvc2gobG9uZyBkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6YWNvc2hsKF9fbGNwcF94KTt9CisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxfQTE+Ojp2YWx1ZSwgZG91YmxlPjo6dHlwZQorYWNvc2goX0ExIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmFjb3NoKChkb3VibGUpX19sY3BwX3gpO30KKworLy8gYXNpbmgKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZmxvYXQgICAgICAgYXNpbmgoZmxvYXQgX19sY3BwX3gpIF9OT0VYQ0VQVCAgICAgICB7cmV0dXJuIDo6YXNpbmhmKF9fbGNwcF94KTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSBhc2luaChsb25nIGRvdWJsZSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjphc2luaGwoX19sY3BwX3gpO30KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPF9BMT46OnZhbHVlLCBkb3VibGU+Ojp0eXBlCithc2luaChfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6YXNpbmgoKGRvdWJsZSlfX2xjcHBfeCk7fQorCisvLyBhdGFuaAorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmbG9hdCAgICAgICBhdGFuaChmbG9hdCBfX2xjcHBfeCkgX05PRVhDRVBUICAgICAgIHtyZXR1cm4gOjphdGFuaGYoX19sY3BwX3gpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgZG91YmxlIGF0YW5oKGxvbmcgZG91YmxlIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmF0YW5obChfX2xjcHBfeCk7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGRvdWJsZT46OnR5cGUKK2F0YW5oKF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjphdGFuaCgoZG91YmxlKV9fbGNwcF94KTt9CisKKy8vIGNicnQKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZmxvYXQgICAgICAgY2JydChmbG9hdCBfX2xjcHBfeCkgX05PRVhDRVBUICAgICAgIHtyZXR1cm4gOjpjYnJ0ZihfX2xjcHBfeCk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgY2JydChsb25nIGRvdWJsZSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjpjYnJ0bChfX2xjcHBfeCk7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGRvdWJsZT46OnR5cGUKK2NicnQoX0ExIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmNicnQoKGRvdWJsZSlfX2xjcHBfeCk7fQorCisvLyBjb3B5c2lnbgorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmbG9hdCBjb3B5c2lnbihmbG9hdCBfX2xjcHBfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IF9fbGNwcF95KSBfTk9FWENFUFQgeworICByZXR1cm4gOjpjb3B5c2lnbmYoX19sY3BwX3gsIF9fbGNwcF95KTsKK30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgZG91YmxlCitjb3B5c2lnbihsb25nIGRvdWJsZSBfX2xjcHBfeCwgbG9uZyBkb3VibGUgX19sY3BwX3kpIF9OT0VYQ0VQVCB7CisgIHJldHVybiA6OmNvcHlzaWdubChfX2xjcHBfeCwgX19sY3BwX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExLCBjbGFzcyBfQTI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjpfX2xhenlfZW5hYmxlX2lmCis8CisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMT46OnZhbHVlICYmCisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMj46OnZhbHVlLAorICAgIHN0ZDo6X19wcm9tb3RlPF9BMSwgX0EyPgorPjo6dHlwZQorY29weXNpZ24oX0ExIF9fbGNwcF94LCBfQTIgX19sY3BwX3kpIF9OT0VYQ0VQVAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX3Byb21vdGU8X0ExLCBfQTI+Ojp0eXBlIF9fcmVzdWx0X3R5cGU7CisgICAgc3RhdGljX2Fzc2VydCgoIShzdGQ6OmlzX3NhbWU8X0ExLCBfX3Jlc3VsdF90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxfQTIsIF9fcmVzdWx0X3R5cGU+Ojp2YWx1ZSkpLCAiIik7CisgICAgcmV0dXJuIDo6Y29weXNpZ24oKF9fcmVzdWx0X3R5cGUpX19sY3BwX3gsIChfX3Jlc3VsdF90eXBlKV9fbGNwcF95KTsKK30KKworLy8gZXJmCisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIGVyZihmbG9hdCBfX2xjcHBfeCkgX05PRVhDRVBUICAgICAgIHtyZXR1cm4gOjplcmZmKF9fbGNwcF94KTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSBlcmYobG9uZyBkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6ZXJmbChfX2xjcHBfeCk7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGRvdWJsZT46OnR5cGUKK2VyZihfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6ZXJmKChkb3VibGUpX19sY3BwX3gpO30KKworLy8gZXJmYworCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmbG9hdCAgICAgICBlcmZjKGZsb2F0IF9fbGNwcF94KSBfTk9FWENFUFQgICAgICAge3JldHVybiA6OmVyZmNmKF9fbGNwcF94KTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSBlcmZjKGxvbmcgZG91YmxlIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmVyZmNsKF9fbGNwcF94KTt9CisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxfQTE+Ojp2YWx1ZSwgZG91YmxlPjo6dHlwZQorZXJmYyhfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6ZXJmYygoZG91YmxlKV9fbGNwcF94KTt9CisKKy8vIGV4cDIKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZmxvYXQgICAgICAgZXhwMihmbG9hdCBfX2xjcHBfeCkgX05PRVhDRVBUICAgICAgIHtyZXR1cm4gOjpleHAyZihfX2xjcHBfeCk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgZXhwMihsb25nIGRvdWJsZSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjpleHAybChfX2xjcHBfeCk7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGRvdWJsZT46OnR5cGUKK2V4cDIoX0ExIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmV4cDIoKGRvdWJsZSlfX2xjcHBfeCk7fQorCisvLyBleHBtMQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmbG9hdCAgICAgICBleHBtMShmbG9hdCBfX2xjcHBfeCkgX05PRVhDRVBUICAgICAgIHtyZXR1cm4gOjpleHBtMWYoX19sY3BwX3gpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgZG91YmxlIGV4cG0xKGxvbmcgZG91YmxlIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmV4cG0xbChfX2xjcHBfeCk7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGRvdWJsZT46OnR5cGUKK2V4cG0xKF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjpleHBtMSgoZG91YmxlKV9fbGNwcF94KTt9CisKKy8vIGZkaW0KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZmxvYXQgICAgICAgZmRpbShmbG9hdCBfX2xjcHBfeCwgZmxvYXQgX19sY3BwX3kpIF9OT0VYQ0VQVCAgICAgICAgICAgICB7cmV0dXJuIDo6ZmRpbWYoX19sY3BwX3gsIF9fbGNwcF95KTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSBmZGltKGxvbmcgZG91YmxlIF9fbGNwcF94LCBsb25nIGRvdWJsZSBfX2xjcHBfeSkgX05PRVhDRVBUIHtyZXR1cm4gOjpmZGltbChfX2xjcHBfeCwgX19sY3BwX3kpO30KKwordGVtcGxhdGUgPGNsYXNzIF9BMSwgY2xhc3MgX0EyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6X19sYXp5X2VuYWJsZV9pZgorPAorICAgIHN0ZDo6aXNfYXJpdGhtZXRpYzxfQTE+Ojp2YWx1ZSAmJgorICAgIHN0ZDo6aXNfYXJpdGhtZXRpYzxfQTI+Ojp2YWx1ZSwKKyAgICBzdGQ6Ol9fcHJvbW90ZTxfQTEsIF9BMj4KKz46OnR5cGUKK2ZkaW0oX0ExIF9fbGNwcF94LCBfQTIgX19sY3BwX3kpIF9OT0VYQ0VQVAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX3Byb21vdGU8X0ExLCBfQTI+Ojp0eXBlIF9fcmVzdWx0X3R5cGU7CisgICAgc3RhdGljX2Fzc2VydCgoIShzdGQ6OmlzX3NhbWU8X0ExLCBfX3Jlc3VsdF90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxfQTIsIF9fcmVzdWx0X3R5cGU+Ojp2YWx1ZSkpLCAiIik7CisgICAgcmV0dXJuIDo6ZmRpbSgoX19yZXN1bHRfdHlwZSlfX2xjcHBfeCwgKF9fcmVzdWx0X3R5cGUpX19sY3BwX3kpOworfQorCisvLyBmbWEKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZmxvYXQgICAgICAgZm1hKGZsb2F0IF9fbGNwcF94LCBmbG9hdCBfX2xjcHBfeSwgZmxvYXQgX19sY3BwX3opIF9OT0VYQ0VQVCAgICAgICAgICAgICAgICAgICB7cmV0dXJuIDo6Zm1hZihfX2xjcHBfeCwgX19sY3BwX3ksIF9fbGNwcF96KTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSBmbWEobG9uZyBkb3VibGUgX19sY3BwX3gsIGxvbmcgZG91YmxlIF9fbGNwcF95LCBsb25nIGRvdWJsZSBfX2xjcHBfeikgX05PRVhDRVBUIHtyZXR1cm4gOjpmbWFsKF9fbGNwcF94LCBfX2xjcHBfeSwgX19sY3BwX3opO30KKwordGVtcGxhdGUgPGNsYXNzIF9BMSwgY2xhc3MgX0EyLCBjbGFzcyBfQTM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjpfX2xhenlfZW5hYmxlX2lmCis8CisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMT46OnZhbHVlICYmCisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMj46OnZhbHVlICYmCisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMz46OnZhbHVlLAorICAgIHN0ZDo6X19wcm9tb3RlPF9BMSwgX0EyLCBfQTM+Cis+Ojp0eXBlCitmbWEoX0ExIF9fbGNwcF94LCBfQTIgX19sY3BwX3ksIF9BMyBfX2xjcHBfeikgX05PRVhDRVBUCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9fcHJvbW90ZTxfQTEsIF9BMiwgX0EzPjo6dHlwZSBfX3Jlc3VsdF90eXBlOworICAgIHN0YXRpY19hc3NlcnQoKCEoc3RkOjppc19zYW1lPF9BMSwgX19yZXN1bHRfdHlwZT46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8X0EyLCBfX3Jlc3VsdF90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxfQTMsIF9fcmVzdWx0X3R5cGU+Ojp2YWx1ZSkpLCAiIik7CisgICAgcmV0dXJuIDo6Zm1hKChfX3Jlc3VsdF90eXBlKV9fbGNwcF94LCAoX19yZXN1bHRfdHlwZSlfX2xjcHBfeSwgKF9fcmVzdWx0X3R5cGUpX19sY3BwX3opOworfQorCisvLyBmbWF4CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIGZtYXgoZmxvYXQgX19sY3BwX3gsIGZsb2F0IF9fbGNwcF95KSBfTk9FWENFUFQgICAgICAgICAgICAge3JldHVybiA6OmZtYXhmKF9fbGNwcF94LCBfX2xjcHBfeSk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgZm1heChsb25nIGRvdWJsZSBfX2xjcHBfeCwgbG9uZyBkb3VibGUgX19sY3BwX3kpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6Zm1heGwoX19sY3BwX3gsIF9fbGNwcF95KTt9CisKK3RlbXBsYXRlIDxjbGFzcyBfQTEsIGNsYXNzIF9BMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6Ol9fbGF6eV9lbmFibGVfaWYKKzwKKyAgICBzdGQ6OmlzX2FyaXRobWV0aWM8X0ExPjo6dmFsdWUgJiYKKyAgICBzdGQ6OmlzX2FyaXRobWV0aWM8X0EyPjo6dmFsdWUsCisgICAgc3RkOjpfX3Byb21vdGU8X0ExLCBfQTI+Cis+Ojp0eXBlCitmbWF4KF9BMSBfX2xjcHBfeCwgX0EyIF9fbGNwcF95KSBfTk9FWENFUFQKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19wcm9tb3RlPF9BMSwgX0EyPjo6dHlwZSBfX3Jlc3VsdF90eXBlOworICAgIHN0YXRpY19hc3NlcnQoKCEoc3RkOjppc19zYW1lPF9BMSwgX19yZXN1bHRfdHlwZT46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8X0EyLCBfX3Jlc3VsdF90eXBlPjo6dmFsdWUpKSwgIiIpOworICAgIHJldHVybiA6OmZtYXgoKF9fcmVzdWx0X3R5cGUpX19sY3BwX3gsIChfX3Jlc3VsdF90eXBlKV9fbGNwcF95KTsKK30KKworLy8gZm1pbgorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmbG9hdCAgICAgICBmbWluKGZsb2F0IF9fbGNwcF94LCBmbG9hdCBfX2xjcHBfeSkgX05PRVhDRVBUICAgICAgICAgICAgIHtyZXR1cm4gOjpmbWluZihfX2xjcHBfeCwgX19sY3BwX3kpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgZG91YmxlIGZtaW4obG9uZyBkb3VibGUgX19sY3BwX3gsIGxvbmcgZG91YmxlIF9fbGNwcF95KSBfTk9FWENFUFQge3JldHVybiA6OmZtaW5sKF9fbGNwcF94LCBfX2xjcHBfeSk7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExLCBjbGFzcyBfQTI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjpfX2xhenlfZW5hYmxlX2lmCis8CisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMT46OnZhbHVlICYmCisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMj46OnZhbHVlLAorICAgIHN0ZDo6X19wcm9tb3RlPF9BMSwgX0EyPgorPjo6dHlwZQorZm1pbihfQTEgX19sY3BwX3gsIF9BMiBfX2xjcHBfeSkgX05PRVhDRVBUCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9fcHJvbW90ZTxfQTEsIF9BMj46OnR5cGUgX19yZXN1bHRfdHlwZTsKKyAgICBzdGF0aWNfYXNzZXJ0KCghKHN0ZDo6aXNfc2FtZTxfQTEsIF9fcmVzdWx0X3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPF9BMiwgX19yZXN1bHRfdHlwZT46OnZhbHVlKSksICIiKTsKKyAgICByZXR1cm4gOjpmbWluKChfX3Jlc3VsdF90eXBlKV9fbGNwcF94LCAoX19yZXN1bHRfdHlwZSlfX2xjcHBfeSk7Cit9CisKKy8vIGh5cG90CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIGh5cG90KGZsb2F0IF9fbGNwcF94LCBmbG9hdCBfX2xjcHBfeSkgX05PRVhDRVBUICAgICAgICAgICAgIHtyZXR1cm4gOjpoeXBvdGYoX19sY3BwX3gsIF9fbGNwcF95KTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSBoeXBvdChsb25nIGRvdWJsZSBfX2xjcHBfeCwgbG9uZyBkb3VibGUgX19sY3BwX3kpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6aHlwb3RsKF9fbGNwcF94LCBfX2xjcHBfeSk7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExLCBjbGFzcyBfQTI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjpfX2xhenlfZW5hYmxlX2lmCis8CisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMT46OnZhbHVlICYmCisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMj46OnZhbHVlLAorICAgIHN0ZDo6X19wcm9tb3RlPF9BMSwgX0EyPgorPjo6dHlwZQoraHlwb3QoX0ExIF9fbGNwcF94LCBfQTIgX19sY3BwX3kpIF9OT0VYQ0VQVAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX3Byb21vdGU8X0ExLCBfQTI+Ojp0eXBlIF9fcmVzdWx0X3R5cGU7CisgICAgc3RhdGljX2Fzc2VydCgoIShzdGQ6OmlzX3NhbWU8X0ExLCBfX3Jlc3VsdF90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxfQTIsIF9fcmVzdWx0X3R5cGU+Ojp2YWx1ZSkpLCAiIik7CisgICAgcmV0dXJuIDo6aHlwb3QoKF9fcmVzdWx0X3R5cGUpX19sY3BwX3gsIChfX3Jlc3VsdF90eXBlKV9fbGNwcF95KTsKK30KKworLy8gaWxvZ2IKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW50IGlsb2diKGZsb2F0IF9fbGNwcF94KSBfTk9FWENFUFQgICAgICAge3JldHVybiA6Omlsb2diZihfX2xjcHBfeCk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW50IGlsb2diKGxvbmcgZG91YmxlIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6Omlsb2dibChfX2xjcHBfeCk7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGludD46OnR5cGUKK2lsb2diKF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjppbG9nYigoZG91YmxlKV9fbGNwcF94KTt9CisKKy8vIGxnYW1tYQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmbG9hdCAgICAgICBsZ2FtbWEoZmxvYXQgX19sY3BwX3gpIF9OT0VYQ0VQVCAgICAgICB7cmV0dXJuIDo6bGdhbW1hZihfX2xjcHBfeCk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgbGdhbW1hKGxvbmcgZG91YmxlIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmxnYW1tYWwoX19sY3BwX3gpO30KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPF9BMT46OnZhbHVlLCBkb3VibGU+Ojp0eXBlCitsZ2FtbWEoX0ExIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmxnYW1tYSgoZG91YmxlKV9fbGNwcF94KTt9CisKKy8vIGxscmludAorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGxvbmcgbGxyaW50KGZsb2F0IF9fbGNwcF94KSBfTk9FWENFUFQgICAgICAge3JldHVybiA6OmxscmludGYoX19sY3BwX3gpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgbG9uZyBsbHJpbnQobG9uZyBkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6bGxyaW50bChfX2xjcHBfeCk7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGxvbmcgbG9uZz46OnR5cGUKK2xscmludChfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6bGxyaW50KChkb3VibGUpX19sY3BwX3gpO30KKworLy8gbGxyb3VuZAorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGxvbmcgbGxyb3VuZChmbG9hdCBfX2xjcHBfeCkgX05PRVhDRVBUICAgICAgIHtyZXR1cm4gOjpsbHJvdW5kZihfX2xjcHBfeCk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBsb25nIGxscm91bmQobG9uZyBkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6bGxyb3VuZGwoX19sY3BwX3gpO30KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPF9BMT46OnZhbHVlLCBsb25nIGxvbmc+Ojp0eXBlCitsbHJvdW5kKF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjpsbHJvdW5kKChkb3VibGUpX19sY3BwX3gpO30KKworLy8gbG9nMXAKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZmxvYXQgICAgICAgbG9nMXAoZmxvYXQgX19sY3BwX3gpIF9OT0VYQ0VQVCAgICAgICB7cmV0dXJuIDo6bG9nMXBmKF9fbGNwcF94KTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSBsb2cxcChsb25nIGRvdWJsZSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjpsb2cxcGwoX19sY3BwX3gpO30KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPF9BMT46OnZhbHVlLCBkb3VibGU+Ojp0eXBlCitsb2cxcChfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6bG9nMXAoKGRvdWJsZSlfX2xjcHBfeCk7fQorCisvLyBsb2cyCisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIGxvZzIoZmxvYXQgX19sY3BwX3gpIF9OT0VYQ0VQVCAgICAgICB7cmV0dXJuIDo6bG9nMmYoX19sY3BwX3gpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgZG91YmxlIGxvZzIobG9uZyBkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6bG9nMmwoX19sY3BwX3gpO30KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPF9BMT46OnZhbHVlLCBkb3VibGU+Ojp0eXBlCitsb2cyKF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjpsb2cyKChkb3VibGUpX19sY3BwX3gpO30KKworLy8gbG9nYgorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmbG9hdCAgICAgICBsb2diKGZsb2F0IF9fbGNwcF94KSBfTk9FWENFUFQgICAgICAge3JldHVybiA6OmxvZ2JmKF9fbGNwcF94KTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSBsb2diKGxvbmcgZG91YmxlIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmxvZ2JsKF9fbGNwcF94KTt9CisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxfQTE+Ojp2YWx1ZSwgZG91YmxlPjo6dHlwZQorbG9nYihfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6bG9nYigoZG91YmxlKV9fbGNwcF94KTt9CisKKy8vIGxyaW50CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgbHJpbnQoZmxvYXQgX19sY3BwX3gpIF9OT0VYQ0VQVCAgICAgICB7cmV0dXJuIDo6bHJpbnRmKF9fbGNwcF94KTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGxyaW50KGxvbmcgZG91YmxlIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OmxyaW50bChfX2xjcHBfeCk7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGxvbmc+Ojp0eXBlCitscmludChfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6bHJpbnQoKGRvdWJsZSlfX2xjcHBfeCk7fQorCisvLyBscm91bmQKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBscm91bmQoZmxvYXQgX19sY3BwX3gpIF9OT0VYQ0VQVCAgICAgICB7cmV0dXJuIDo6bHJvdW5kZihfX2xjcHBfeCk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBscm91bmQobG9uZyBkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6bHJvdW5kbChfX2xjcHBfeCk7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8X0ExPjo6dmFsdWUsIGxvbmc+Ojp0eXBlCitscm91bmQoX0ExIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6Omxyb3VuZCgoZG91YmxlKV9fbGNwcF94KTt9CisKKy8vIG5hbgorCisvLyBuZWFyYnlpbnQKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZmxvYXQgICAgICAgbmVhcmJ5aW50KGZsb2F0IF9fbGNwcF94KSBfTk9FWENFUFQgICAgICAge3JldHVybiA6Om5lYXJieWludGYoX19sY3BwX3gpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgZG91YmxlIG5lYXJieWludChsb25nIGRvdWJsZSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjpuZWFyYnlpbnRsKF9fbGNwcF94KTt9CisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxfQTE+Ojp2YWx1ZSwgZG91YmxlPjo6dHlwZQorbmVhcmJ5aW50KF9BMSBfX2xjcHBfeCkgX05PRVhDRVBUIHtyZXR1cm4gOjpuZWFyYnlpbnQoKGRvdWJsZSlfX2xjcHBfeCk7fQorCisvLyBuZXh0YWZ0ZXIKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZmxvYXQgICAgICAgbmV4dGFmdGVyKGZsb2F0IF9fbGNwcF94LCBmbG9hdCBfX2xjcHBfeSkgX05PRVhDRVBUICAgICAgICAgICAgIHtyZXR1cm4gOjpuZXh0YWZ0ZXJmKF9fbGNwcF94LCBfX2xjcHBfeSk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgbmV4dGFmdGVyKGxvbmcgZG91YmxlIF9fbGNwcF94LCBsb25nIGRvdWJsZSBfX2xjcHBfeSkgX05PRVhDRVBUIHtyZXR1cm4gOjpuZXh0YWZ0ZXJsKF9fbGNwcF94LCBfX2xjcHBfeSk7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExLCBjbGFzcyBfQTI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjpfX2xhenlfZW5hYmxlX2lmCis8CisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMT46OnZhbHVlICYmCisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMj46OnZhbHVlLAorICAgIHN0ZDo6X19wcm9tb3RlPF9BMSwgX0EyPgorPjo6dHlwZQorbmV4dGFmdGVyKF9BMSBfX2xjcHBfeCwgX0EyIF9fbGNwcF95KSBfTk9FWENFUFQKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19wcm9tb3RlPF9BMSwgX0EyPjo6dHlwZSBfX3Jlc3VsdF90eXBlOworICAgIHN0YXRpY19hc3NlcnQoKCEoc3RkOjppc19zYW1lPF9BMSwgX19yZXN1bHRfdHlwZT46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8X0EyLCBfX3Jlc3VsdF90eXBlPjo6dmFsdWUpKSwgIiIpOworICAgIHJldHVybiA6Om5leHRhZnRlcigoX19yZXN1bHRfdHlwZSlfX2xjcHBfeCwgKF9fcmVzdWx0X3R5cGUpX19sY3BwX3kpOworfQorCisvLyBuZXh0dG93YXJkCisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIG5leHR0b3dhcmQoZmxvYXQgX19sY3BwX3gsIGxvbmcgZG91YmxlIF9fbGNwcF95KSBfTk9FWENFUFQgICAgICAge3JldHVybiA6Om5leHR0b3dhcmRmKF9fbGNwcF94LCBfX2xjcHBfeSk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgbmV4dHRvd2FyZChsb25nIGRvdWJsZSBfX2xjcHBfeCwgbG9uZyBkb3VibGUgX19sY3BwX3kpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6bmV4dHRvd2FyZGwoX19sY3BwX3gsIF9fbGNwcF95KTt9CisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxfQTE+Ojp2YWx1ZSwgZG91YmxlPjo6dHlwZQorbmV4dHRvd2FyZChfQTEgX19sY3BwX3gsIGxvbmcgZG91YmxlIF9fbGNwcF95KSBfTk9FWENFUFQge3JldHVybiA6Om5leHR0b3dhcmQoKGRvdWJsZSlfX2xjcHBfeCwgX19sY3BwX3kpO30KKworLy8gcmVtYWluZGVyCisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIHJlbWFpbmRlcihmbG9hdCBfX2xjcHBfeCwgZmxvYXQgX19sY3BwX3kpIF9OT0VYQ0VQVCAgICAgICAgICAgICB7cmV0dXJuIDo6cmVtYWluZGVyZihfX2xjcHBfeCwgX19sY3BwX3kpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgZG91YmxlIHJlbWFpbmRlcihsb25nIGRvdWJsZSBfX2xjcHBfeCwgbG9uZyBkb3VibGUgX19sY3BwX3kpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6cmVtYWluZGVybChfX2xjcHBfeCwgX19sY3BwX3kpO30KKwordGVtcGxhdGUgPGNsYXNzIF9BMSwgY2xhc3MgX0EyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHN0ZDo6X19sYXp5X2VuYWJsZV9pZgorPAorICAgIHN0ZDo6aXNfYXJpdGhtZXRpYzxfQTE+Ojp2YWx1ZSAmJgorICAgIHN0ZDo6aXNfYXJpdGhtZXRpYzxfQTI+Ojp2YWx1ZSwKKyAgICBzdGQ6Ol9fcHJvbW90ZTxfQTEsIF9BMj4KKz46OnR5cGUKK3JlbWFpbmRlcihfQTEgX19sY3BwX3gsIF9BMiBfX2xjcHBfeSkgX05PRVhDRVBUCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9fcHJvbW90ZTxfQTEsIF9BMj46OnR5cGUgX19yZXN1bHRfdHlwZTsKKyAgICBzdGF0aWNfYXNzZXJ0KCghKHN0ZDo6aXNfc2FtZTxfQTEsIF9fcmVzdWx0X3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPF9BMiwgX19yZXN1bHRfdHlwZT46OnZhbHVlKSksICIiKTsKKyAgICByZXR1cm4gOjpyZW1haW5kZXIoKF9fcmVzdWx0X3R5cGUpX19sY3BwX3gsIChfX3Jlc3VsdF90eXBlKV9fbGNwcF95KTsKK30KKworLy8gcmVtcXVvCisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIHJlbXF1byhmbG9hdCBfX2xjcHBfeCwgZmxvYXQgX19sY3BwX3ksIGludCogX19sY3BwX3opIF9OT0VYQ0VQVCAgICAgICAgICAgICB7cmV0dXJuIDo6cmVtcXVvZihfX2xjcHBfeCwgX19sY3BwX3ksIF9fbGNwcF96KTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSByZW1xdW8obG9uZyBkb3VibGUgX19sY3BwX3gsIGxvbmcgZG91YmxlIF9fbGNwcF95LCBpbnQqIF9fbGNwcF96KSBfTk9FWENFUFQge3JldHVybiA6OnJlbXF1b2woX19sY3BwX3gsIF9fbGNwcF95LCBfX2xjcHBfeik7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExLCBjbGFzcyBfQTI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjpfX2xhenlfZW5hYmxlX2lmCis8CisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMT46OnZhbHVlICYmCisgICAgc3RkOjppc19hcml0aG1ldGljPF9BMj46OnZhbHVlLAorICAgIHN0ZDo6X19wcm9tb3RlPF9BMSwgX0EyPgorPjo6dHlwZQorcmVtcXVvKF9BMSBfX2xjcHBfeCwgX0EyIF9fbGNwcF95LCBpbnQqIF9fbGNwcF96KSBfTk9FWENFUFQKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19wcm9tb3RlPF9BMSwgX0EyPjo6dHlwZSBfX3Jlc3VsdF90eXBlOworICAgIHN0YXRpY19hc3NlcnQoKCEoc3RkOjppc19zYW1lPF9BMSwgX19yZXN1bHRfdHlwZT46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8X0EyLCBfX3Jlc3VsdF90eXBlPjo6dmFsdWUpKSwgIiIpOworICAgIHJldHVybiA6OnJlbXF1bygoX19yZXN1bHRfdHlwZSlfX2xjcHBfeCwgKF9fcmVzdWx0X3R5cGUpX19sY3BwX3ksIF9fbGNwcF96KTsKK30KKworLy8gcmludAorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmbG9hdCAgICAgICByaW50KGZsb2F0IF9fbGNwcF94KSBfTk9FWENFUFQgICAgICAge3JldHVybiA6OnJpbnRmKF9fbGNwcF94KTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nIGRvdWJsZSByaW50KGxvbmcgZG91YmxlIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OnJpbnRsKF9fbGNwcF94KTt9CisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxfQTE+Ojp2YWx1ZSwgZG91YmxlPjo6dHlwZQorcmludChfQTEgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6cmludCgoZG91YmxlKV9fbGNwcF94KTt9CisKKy8vIHJvdW5kCisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIHJvdW5kKGZsb2F0IF9fbGNwcF94KSBfTk9FWENFUFQgICAgICAge3JldHVybiA6OnJvdW5kZihfX2xjcHBfeCk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgcm91bmQobG9uZyBkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6cm91bmRsKF9fbGNwcF94KTt9CisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxfQTE+Ojp2YWx1ZSwgZG91YmxlPjo6dHlwZQorcm91bmQoX0ExIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OnJvdW5kKChkb3VibGUpX19sY3BwX3gpO30KKworLy8gc2NhbGJsbgorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmbG9hdCAgICAgICBzY2FsYmxuKGZsb2F0IF9fbGNwcF94LCBsb25nIF9fbGNwcF95KSBfTk9FWENFUFQgICAgICAge3JldHVybiA6OnNjYWxibG5mKF9fbGNwcF94LCBfX2xjcHBfeSk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgc2NhbGJsbihsb25nIGRvdWJsZSBfX2xjcHBfeCwgbG9uZyBfX2xjcHBfeSkgX05PRVhDRVBUIHtyZXR1cm4gOjpzY2FsYmxubChfX2xjcHBfeCwgX19sY3BwX3kpO30KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPF9BMT46OnZhbHVlLCBkb3VibGU+Ojp0eXBlCitzY2FsYmxuKF9BMSBfX2xjcHBfeCwgbG9uZyBfX2xjcHBfeSkgX05PRVhDRVBUIHtyZXR1cm4gOjpzY2FsYmxuKChkb3VibGUpX19sY3BwX3gsIF9fbGNwcF95KTt9CisKKy8vIHNjYWxibgorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmbG9hdCAgICAgICBzY2FsYm4oZmxvYXQgX19sY3BwX3gsIGludCBfX2xjcHBfeSkgX05PRVhDRVBUICAgICAgIHtyZXR1cm4gOjpzY2FsYm5mKF9fbGNwcF94LCBfX2xjcHBfeSk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgc2NhbGJuKGxvbmcgZG91YmxlIF9fbGNwcF94LCBpbnQgX19sY3BwX3kpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6c2NhbGJubChfX2xjcHBfeCwgX19sY3BwX3kpO30KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPF9BMT46OnZhbHVlLCBkb3VibGU+Ojp0eXBlCitzY2FsYm4oX0ExIF9fbGNwcF94LCBpbnQgX19sY3BwX3kpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6c2NhbGJuKChkb3VibGUpX19sY3BwX3gsIF9fbGNwcF95KTt9CisKKy8vIHRnYW1tYQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmbG9hdCAgICAgICB0Z2FtbWEoZmxvYXQgX19sY3BwX3gpIF9OT0VYQ0VQVCAgICAgICB7cmV0dXJuIDo6dGdhbW1hZihfX2xjcHBfeCk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgdGdhbW1hKGxvbmcgZG91YmxlIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OnRnYW1tYWwoX19sY3BwX3gpO30KKwordGVtcGxhdGUgPGNsYXNzIF9BMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPF9BMT46OnZhbHVlLCBkb3VibGU+Ojp0eXBlCit0Z2FtbWEoX0ExIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OnRnYW1tYSgoZG91YmxlKV9fbGNwcF94KTt9CisKKy8vIHRydW5jCisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZsb2F0ICAgICAgIHRydW5jKGZsb2F0IF9fbGNwcF94KSBfTk9FWENFUFQgICAgICAge3JldHVybiA6OnRydW5jZihfX2xjcHBfeCk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbG9uZyBkb3VibGUgdHJ1bmMobG9uZyBkb3VibGUgX19sY3BwX3gpIF9OT0VYQ0VQVCB7cmV0dXJuIDo6dHJ1bmNsKF9fbGNwcF94KTt9CisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxfQTE+Ojp2YWx1ZSwgZG91YmxlPjo6dHlwZQordHJ1bmMoX0ExIF9fbGNwcF94KSBfTk9FWENFUFQge3JldHVybiA6OnRydW5jKChkb3VibGUpX19sY3BwX3gpO30KKworfSAvLyBleHRlcm4gIkMrKyIKKworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbHNlIC8vIF9MSUJDUFBfTUFUSF9ICisKKy8vIFRoaXMgaW5jbHVkZSBsaXZlcyBvdXRzaWRlIHRoZSBoZWFkZXIgZ3VhcmQgaW4gb3JkZXIgdG8gc3VwcG9ydCBhbiBNU1ZDCisvLyBleHRlbnNpb24gd2hpY2ggYWxsb3dzIHVzZXJzIHRvIGRvOgorLy8KKy8vICNkZWZpbmUgX1VTRV9NQVRIX0RFRklORVMKKy8vICNpbmNsdWRlIDxtYXRoLmg+CisvLworLy8gYW5kIHJlY2VpdmUgdGhlIGRlZmluaXRpb25zIG9mIG1hdGhlbWF0aWNhbCBjb25zdGFudHMsIGV2ZW4gaWYgPG1hdGguaD4KKy8vIGhhcyBwcmV2aW91c2x5IGJlZW4gaW5jbHVkZWQuCisjaWYgZGVmaW5lZChfTElCQ1BQX01TVkNSVCkgJiYgZGVmaW5lZChfVVNFX01BVEhfREVGSU5FUykKKyNpbmNsdWRlX25leHQgPG1hdGguaD4KKyNlbmRpZgorCisjZW5kaWYgIC8vIF9MSUJDUFBfTUFUSF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvbWVtb3J5IGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL21lbW9yeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjFiZDEzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL21lbW9yeQpAQCAtMCwwICsxLDU2NTUgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1lbW9yeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfTUVNT1JZCisjZGVmaW5lIF9MSUJDUFBfTUVNT1JZCisKKy8qCisgICAgbWVtb3J5IHN5bm9wc2lzCisKK25hbWVzcGFjZSBzdGQKK3sKKworc3RydWN0IGFsbG9jYXRvcl9hcmdfdCB7IH07CitpbmxpbmUgY29uc3RleHByIGFsbG9jYXRvcl9hcmdfdCBhbGxvY2F0b3JfYXJnID0gYWxsb2NhdG9yX2FyZ190KCk7CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBBbGxvYz4gc3RydWN0IHVzZXNfYWxsb2NhdG9yOworCit0ZW1wbGF0ZSA8Y2xhc3MgUHRyPgorc3RydWN0IHBvaW50ZXJfdHJhaXRzCit7CisgICAgdHlwZWRlZiBQdHIgcG9pbnRlcjsKKyAgICB0eXBlZGVmIDxkZXRhaWxzPiBlbGVtZW50X3R5cGU7CisgICAgdHlwZWRlZiA8ZGV0YWlscz4gZGlmZmVyZW5jZV90eXBlOworCisgICAgdGVtcGxhdGUgPGNsYXNzIFU+IHVzaW5nIHJlYmluZCA9IDxkZXRhaWxzPjsKKworICAgIHN0YXRpYyBwb2ludGVyIHBvaW50ZXJfdG8oPGRldGFpbHM+KTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IHBvaW50ZXJfdHJhaXRzPFQqPgoreworICAgIHR5cGVkZWYgVCogcG9pbnRlcjsKKyAgICB0eXBlZGVmIFQgZWxlbWVudF90eXBlOworICAgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBVPiB1c2luZyByZWJpbmQgPSBVKjsKKworICAgIHN0YXRpYyBwb2ludGVyIHBvaW50ZXJfdG8oPGRldGFpbHM+KSBub2V4Y2VwdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBjb25zdGV4cHIgVCogdG9fYWRkcmVzcyhUKiBwKSBub2V4Y2VwdDsgLy8gQysrMjAKK3RlbXBsYXRlIDxjbGFzcyBQdHI+IGF1dG8gdG9fYWRkcmVzcyhjb25zdCBQdHImIHApIG5vZXhjZXB0OyAvLyBDKysyMAorCit0ZW1wbGF0ZSA8Y2xhc3MgQWxsb2M+CitzdHJ1Y3QgYWxsb2NhdG9yX3RyYWl0cworeworICAgIHR5cGVkZWYgQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjp2YWx1ZV90eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisKKyAgICB0eXBlZGVmIEFsbG9jOjpwb2ludGVyIHwgdmFsdWVfdHlwZSogcG9pbnRlcjsKKyAgICB0eXBlZGVmIEFsbG9jOjpjb25zdF9wb2ludGVyCisgICAgICAgICAgfCBwb2ludGVyX3RyYWl0czxwb2ludGVyPjo6cmViaW5kPGNvbnN0IHZhbHVlX3R5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiBBbGxvYzo6dm9pZF9wb2ludGVyCisgICAgICAgICAgfCBwb2ludGVyX3RyYWl0czxwb2ludGVyPjo6cmViaW5kPHZvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRfcG9pbnRlcjsKKyAgICB0eXBlZGVmIEFsbG9jOjpjb25zdF92b2lkX3BvaW50ZXIKKyAgICAgICAgICB8IHBvaW50ZXJfdHJhaXRzPHBvaW50ZXI+OjpyZWJpbmQ8Y29uc3Qgdm9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Rfdm9pZF9wb2ludGVyOworICAgIHR5cGVkZWYgQWxsb2M6OmRpZmZlcmVuY2VfdHlwZQorICAgICAgICAgIHwgcG9pbnRlcl90cmFpdHM8cG9pbnRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiBBbGxvYzo6c2l6ZV90eXBlCisgICAgICAgICAgfCBtYWtlX3Vuc2lnbmVkPGRpZmZlcmVuY2VfdHlwZT46OnR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgQWxsb2M6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfY29weV9hc3NpZ25tZW50CisgICAgICAgICAgfCBmYWxzZV90eXBlICAgICAgICAgICAgICAgICAgIHByb3BhZ2F0ZV9vbl9jb250YWluZXJfY29weV9hc3NpZ25tZW50OworICAgIHR5cGVkZWYgQWxsb2M6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50CisgICAgICAgICAgfCBmYWxzZV90eXBlICAgICAgICAgICAgICAgICAgIHByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50OworICAgIHR5cGVkZWYgQWxsb2M6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcAorICAgICAgICAgIHwgZmFsc2VfdHlwZSAgICAgICAgICAgICAgICAgICBwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXA7CisgICAgdHlwZWRlZiBBbGxvYzo6aXNfYWx3YXlzX2VxdWFsCisgICAgICAgICAgfCBpc19lbXB0eSAgICAgICAgICAgICAgICAgICAgIGlzX2Fsd2F5c19lcXVhbDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiB1c2luZyByZWJpbmRfYWxsb2MgID0gQWxsb2M6OnJlYmluZDxVPjo6b3RoZXIgfCBBbGxvYzxULCBBcmdzLi4uPjsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdXNpbmcgcmViaW5kX3RyYWl0cyA9IGFsbG9jYXRvcl90cmFpdHM8cmViaW5kX2FsbG9jPFQ+PjsKKworICAgIHN0YXRpYyBwb2ludGVyIGFsbG9jYXRlKGFsbG9jYXRvcl90eXBlJiBhLCBzaXplX3R5cGUgbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbW25vZGlzY2FyZF1dIGluIEMrKzIwCisgICAgc3RhdGljIHBvaW50ZXIgYWxsb2NhdGUoYWxsb2NhdG9yX3R5cGUmIGEsIHNpemVfdHlwZSBuLCBjb25zdF92b2lkX3BvaW50ZXIgaGludCk7IC8vIFtbbm9kaXNjYXJkXV0gaW4gQysrMjAKKworICAgIHN0YXRpYyB2b2lkIGRlYWxsb2NhdGUoYWxsb2NhdG9yX3R5cGUmIGEsIHBvaW50ZXIgcCwgc2l6ZV90eXBlIG4pIG5vZXhjZXB0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzLi4uIEFyZ3M+CisgICAgICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChhbGxvY2F0b3JfdHlwZSYgYSwgVCogcCwgQXJncyYmLi4uIGFyZ3MpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koYWxsb2NhdG9yX3R5cGUmIGEsIFQqIHApOworCisgICAgc3RhdGljIHNpemVfdHlwZSBtYXhfc2l6ZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7IC8vIG5vZXhjZXB0IGluIEMrKzE0CisKKyAgICBzdGF0aWMgYWxsb2NhdG9yX3R5cGUKKyAgICAgICAgc2VsZWN0X29uX2NvbnRhaW5lcl9jb3B5X2NvbnN0cnVjdGlvbihjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgYWxsb2NhdG9yPHZvaWQ+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPiBzdHJ1Y3QgcmViaW5kIHt0eXBlZGVmIGFsbG9jYXRvcjxfVXA+IG90aGVyO307Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NsYXNzIGFsbG9jYXRvcgoreworcHVibGljOgorICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIFQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIGNvbnN0IFQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPFQ+Ojp0eXBlICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPGNvbnN0IFQ+Ojp0eXBlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBVPiBzdHJ1Y3QgcmViaW5kIHt0eXBlZGVmIGFsbG9jYXRvcjxVPiBvdGhlcjt9OworCisgICAgY29uc3RleHByIGFsbG9jYXRvcigpIG5vZXhjZXB0OyAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMjAKKyAgICBjb25zdGV4cHIgYWxsb2NhdG9yKGNvbnN0IGFsbG9jYXRvciYpIG5vZXhjZXB0OyAgICAgIC8vIGNvbnN0ZXhwciBpbiBDKysyMAorICAgIHRlbXBsYXRlIDxjbGFzcyBVPgorICAgICAgY29uc3RleHByIGFsbG9jYXRvcihjb25zdCBhbGxvY2F0b3I8VT4mKSBub2V4Y2VwdDsgLy8gY29uc3RleHByIGluIEMrKzIwCisgICAgfmFsbG9jYXRvcigpOworICAgIHBvaW50ZXIgYWRkcmVzcyhyZWZlcmVuY2UgeCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfcG9pbnRlciBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSB4KSBjb25zdCBub2V4Y2VwdDsKKyAgICBwb2ludGVyIGFsbG9jYXRlKHNpemVfdHlwZSwgYWxsb2NhdG9yPHZvaWQ+Ojpjb25zdF9wb2ludGVyIGhpbnQgPSAwKTsKKyAgICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBwLCBzaXplX3R5cGUgbikgbm9leGNlcHQ7CisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgdGVtcGxhdGU8Y2xhc3MgVSwgY2xhc3MuLi4gQXJncz4KKyAgICAgICAgdm9pZCBjb25zdHJ1Y3QoVSogcCwgQXJncyYmLi4uIGFyZ3MpOworICAgIHRlbXBsYXRlIDxjbGFzcyBVPgorICAgICAgICB2b2lkIGRlc3Ryb3koVSogcCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBhbGxvY2F0b3I8VD4mLCBjb25zdCBhbGxvY2F0b3I8VT4mKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIG9wZXJhdG9yIT0oY29uc3QgYWxsb2NhdG9yPFQ+JiwgY29uc3QgYWxsb2NhdG9yPFU+Jikgbm9leGNlcHQ7CisKK3RlbXBsYXRlIDxjbGFzcyBPdXRwdXRJdGVyYXRvciwgY2xhc3MgVD4KK2NsYXNzIHJhd19zdG9yYWdlX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3I8b3V0cHV0X2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICBULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwdXJwb3NlZnVsbHkgbm90IEMrKzAzCisgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90LCAgICAgICAgICAgICAgICAgICAgICAgLy8gcHVycG9zZWZ1bGx5IG5vdCBDKyswMworICAgICAgICAgICAgICAgICAgICAgIFQqLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB1cnBvc2VmdWxseSBub3QgQysrMDMKKyAgICAgICAgICAgICAgICAgICAgICByYXdfc3RvcmFnZV9pdGVyYXRvciY+ICAgICAgICAgICAvLyBwdXJwb3NlZnVsbHkgbm90IEMrKzAzCit7CitwdWJsaWM6CisgICAgZXhwbGljaXQgcmF3X3N0b3JhZ2VfaXRlcmF0b3IoT3V0cHV0SXRlcmF0b3IgeCk7CisgICAgcmF3X3N0b3JhZ2VfaXRlcmF0b3ImIG9wZXJhdG9yKigpOworICAgIHJhd19zdG9yYWdlX2l0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgVCYgZWxlbWVudCk7CisgICAgcmF3X3N0b3JhZ2VfaXRlcmF0b3ImIG9wZXJhdG9yKysoKTsKKyAgICByYXdfc3RvcmFnZV9pdGVyYXRvciAgb3BlcmF0b3IrKyhpbnQpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IHBhaXI8VCoscHRyZGlmZl90PiBnZXRfdGVtcG9yYXJ5X2J1ZmZlcihwdHJkaWZmX3Qgbikgbm9leGNlcHQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCAgICAgICAgICAgICAgIHJldHVybl90ZW1wb3JhcnlfYnVmZmVyKFQqIHApIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gVCogYWRkcmVzc29mKFQmIHIpIG5vZXhjZXB0OwordGVtcGxhdGUgPGNsYXNzIFQ+IFQqIGFkZHJlc3NvZihjb25zdCBUJiYgcikgbm9leGNlcHQgPSBkZWxldGU7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yLCBjbGFzcyBGb3J3YXJkSXRlcmF0b3I+CitGb3J3YXJkSXRlcmF0b3IKK3VuaW5pdGlhbGl6ZWRfY29weShJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIEZvcndhcmRJdGVyYXRvciByZXN1bHQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvciwgY2xhc3MgU2l6ZSwgY2xhc3MgRm9yd2FyZEl0ZXJhdG9yPgorRm9yd2FyZEl0ZXJhdG9yCit1bmluaXRpYWxpemVkX2NvcHlfbihJbnB1dEl0ZXJhdG9yIGZpcnN0LCBTaXplIG4sIEZvcndhcmRJdGVyYXRvciByZXN1bHQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBUPgordm9pZCB1bmluaXRpYWxpemVkX2ZpbGwoRm9yd2FyZEl0ZXJhdG9yIGZpcnN0LCBGb3J3YXJkSXRlcmF0b3IgbGFzdCwgY29uc3QgVCYgeCk7CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3IsIGNsYXNzIFNpemUsIGNsYXNzIFQ+CitGb3J3YXJkSXRlcmF0b3IKK3VuaW5pdGlhbGl6ZWRfZmlsbF9uKEZvcndhcmRJdGVyYXRvciBmaXJzdCwgU2l6ZSBuLCBjb25zdCBUJiB4KTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIGRlc3Ryb3lfYXQoVCogbG9jYXRpb24pOworCit0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yPgorIHZvaWQgZGVzdHJveShGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0KTsKKwordGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvciwgY2xhc3MgU2l6ZT4KKyBGb3J3YXJkSXRlcmF0b3IgZGVzdHJveV9uKEZvcndhcmRJdGVyYXRvciBmaXJzdCwgU2l6ZSBuKTsKKwordGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIEZvcndhcmRJdGVyYXRvcj4KKyBGb3J3YXJkSXRlcmF0b3IgdW5pbml0aWFsaXplZF9tb3ZlKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwgRm9yd2FyZEl0ZXJhdG9yIHJlc3VsdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yLCBjbGFzcyBTaXplLCBjbGFzcyBGb3J3YXJkSXRlcmF0b3I+CisgcGFpcjxJbnB1dEl0ZXJhdG9yLEZvcndhcmRJdGVyYXRvcj4gdW5pbml0aWFsaXplZF9tb3ZlX24oSW5wdXRJdGVyYXRvciBmaXJzdCwgU2l6ZSBuLCBGb3J3YXJkSXRlcmF0b3IgcmVzdWx0KTsKKwordGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvcj4KKyB2b2lkIHVuaW5pdGlhbGl6ZWRfdmFsdWVfY29uc3RydWN0KEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QpOworCit0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBTaXplPgorIEZvcndhcmRJdGVyYXRvciB1bmluaXRpYWxpemVkX3ZhbHVlX2NvbnN0cnVjdF9uKEZvcndhcmRJdGVyYXRvciBmaXJzdCwgU2l6ZSBuKTsKKwordGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvcj4KKyB2b2lkIHVuaW5pdGlhbGl6ZWRfZGVmYXVsdF9jb25zdHJ1Y3QoRm9yd2FyZEl0ZXJhdG9yIGZpcnN0LCBGb3J3YXJkSXRlcmF0b3IgbGFzdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3IsIGNsYXNzIFNpemU+CisgRm9yd2FyZEl0ZXJhdG9yIHVuaW5pdGlhbGl6ZWRfZGVmYXVsdF9jb25zdHJ1Y3RfbihGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIFNpemUgbik7CisKK3RlbXBsYXRlIDxjbGFzcyBZPiBzdHJ1Y3QgYXV0b19wdHJfcmVmIHt9OyAgICAgIC8vIHJlbW92ZWQgaW4gQysrMTcKKwordGVtcGxhdGU8Y2xhc3MgWD4KK2NsYXNzIGF1dG9fcHRyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZWQgaW4gQysrMTcKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFggZWxlbWVudF90eXBlOworCisgICAgZXhwbGljaXQgYXV0b19wdHIoWCogcCA9MCkgdGhyb3coKTsKKyAgICBhdXRvX3B0cihhdXRvX3B0ciYpIHRocm93KCk7CisgICAgdGVtcGxhdGU8Y2xhc3MgWT4gYXV0b19wdHIoYXV0b19wdHI8WT4mKSB0aHJvdygpOworICAgIGF1dG9fcHRyJiBvcGVyYXRvcj0oYXV0b19wdHImKSB0aHJvdygpOworICAgIHRlbXBsYXRlPGNsYXNzIFk+IGF1dG9fcHRyJiBvcGVyYXRvcj0oYXV0b19wdHI8WT4mKSB0aHJvdygpOworICAgIGF1dG9fcHRyJiBvcGVyYXRvcj0oYXV0b19wdHJfcmVmPFg+IHIpIHRocm93KCk7CisgICAgfmF1dG9fcHRyKCkgdGhyb3coKTsKKworICAgIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPFg+Ojp0eXBlIG9wZXJhdG9yKigpIGNvbnN0IHRocm93KCk7CisgICAgWCogb3BlcmF0b3ItPigpIGNvbnN0IHRocm93KCk7CisgICAgWCogZ2V0KCkgY29uc3QgdGhyb3coKTsKKyAgICBYKiByZWxlYXNlKCkgdGhyb3coKTsKKyAgICB2b2lkIHJlc2V0KFgqIHAgPTApIHRocm93KCk7CisKKyAgICBhdXRvX3B0cihhdXRvX3B0cl9yZWY8WD4pIHRocm93KCk7CisgICAgdGVtcGxhdGU8Y2xhc3MgWT4gb3BlcmF0b3IgYXV0b19wdHJfcmVmPFk+KCkgdGhyb3coKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBZPiBvcGVyYXRvciBhdXRvX3B0cjxZPigpIHRocm93KCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBkZWZhdWx0X2RlbGV0ZQoreworICAgIGNvbnN0ZXhwciBkZWZhdWx0X2RlbGV0ZSgpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVT4gZGVmYXVsdF9kZWxldGUoY29uc3QgZGVmYXVsdF9kZWxldGU8VT4mKSBub2V4Y2VwdDsKKworICAgIHZvaWQgb3BlcmF0b3IoKShUKikgY29uc3Qgbm9leGNlcHQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBkZWZhdWx0X2RlbGV0ZTxUW10+Cit7CisgICAgY29uc3RleHByIGRlZmF1bHRfZGVsZXRlKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgIHZvaWQgb3BlcmF0b3IoKShUKikgY29uc3Qgbm9leGNlcHQ7CisgICAgdGVtcGxhdGUgPGNsYXNzIFU+IHZvaWQgb3BlcmF0b3IoKShVKikgY29uc3QgPSBkZWxldGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgRCA9IGRlZmF1bHRfZGVsZXRlPFQ+PgorY2xhc3MgdW5pcXVlX3B0cgoreworcHVibGljOgorICAgIHR5cGVkZWYgc2VlIGJlbG93IHBvaW50ZXI7CisgICAgdHlwZWRlZiBUIGVsZW1lbnRfdHlwZTsKKyAgICB0eXBlZGVmIEQgZGVsZXRlcl90eXBlOworCisgICAgLy8gY29uc3RydWN0b3JzCisgICAgY29uc3RleHByIHVuaXF1ZV9wdHIoKSBub2V4Y2VwdDsKKyAgICBleHBsaWNpdCB1bmlxdWVfcHRyKHBvaW50ZXIgcCkgbm9leGNlcHQ7CisgICAgdW5pcXVlX3B0cihwb2ludGVyIHAsIHNlZSBiZWxvdyBkMSkgbm9leGNlcHQ7CisgICAgdW5pcXVlX3B0cihwb2ludGVyIHAsIHNlZSBiZWxvdyBkMikgbm9leGNlcHQ7CisgICAgdW5pcXVlX3B0cih1bmlxdWVfcHRyJiYgdSkgbm9leGNlcHQ7CisgICAgdW5pcXVlX3B0cihudWxscHRyX3QpIG5vZXhjZXB0IDogdW5pcXVlX3B0cigpIHsgfQorICAgIHRlbXBsYXRlIDxjbGFzcyBVLCBjbGFzcyBFPgorICAgICAgICB1bmlxdWVfcHRyKHVuaXF1ZV9wdHI8VSwgRT4mJiB1KSBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVT4KKyAgICAgICAgdW5pcXVlX3B0cihhdXRvX3B0cjxVPiYmIHUpIG5vZXhjZXB0OyAgICAgICAvLyByZW1vdmVkIGluIEMrKzE3CisKKyAgICAvLyBkZXN0cnVjdG9yCisgICAgfnVuaXF1ZV9wdHIoKTsKKworICAgIC8vIGFzc2lnbm1lbnQKKyAgICB1bmlxdWVfcHRyJiBvcGVyYXRvcj0odW5pcXVlX3B0ciYmIHUpIG5vZXhjZXB0OworICAgIHRlbXBsYXRlIDxjbGFzcyBVLCBjbGFzcyBFPiB1bmlxdWVfcHRyJiBvcGVyYXRvcj0odW5pcXVlX3B0cjxVLCBFPiYmIHUpIG5vZXhjZXB0OworICAgIHVuaXF1ZV9wdHImIG9wZXJhdG9yPShudWxscHRyX3QpIG5vZXhjZXB0OworCisgICAgLy8gb2JzZXJ2ZXJzCisgICAgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8VD46OnR5cGUgb3BlcmF0b3IqKCkgY29uc3Q7CisgICAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3Qgbm9leGNlcHQ7CisgICAgcG9pbnRlciBnZXQoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBkZWxldGVyX3R5cGUmIGdldF9kZWxldGVyKCkgbm9leGNlcHQ7CisgICAgY29uc3QgZGVsZXRlcl90eXBlJiBnZXRfZGVsZXRlcigpIGNvbnN0IG5vZXhjZXB0OworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBub2V4Y2VwdDsKKworICAgIC8vIG1vZGlmaWVycworICAgIHBvaW50ZXIgcmVsZWFzZSgpIG5vZXhjZXB0OworICAgIHZvaWQgcmVzZXQocG9pbnRlciBwID0gcG9pbnRlcigpKSBub2V4Y2VwdDsKKyAgICB2b2lkIHN3YXAodW5pcXVlX3B0ciYgdSkgbm9leGNlcHQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgRD4KK2NsYXNzIHVuaXF1ZV9wdHI8VFtdLCBEPgoreworcHVibGljOgorICAgIHR5cGVkZWYgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBwb2ludGVyOworICAgIHR5cGVkZWYgVCBlbGVtZW50X3R5cGU7CisgICAgdHlwZWRlZiBEIGRlbGV0ZXJfdHlwZTsKKworICAgIC8vIGNvbnN0cnVjdG9ycworICAgIGNvbnN0ZXhwciB1bmlxdWVfcHRyKCkgbm9leGNlcHQ7CisgICAgZXhwbGljaXQgdW5pcXVlX3B0cihwb2ludGVyIHApIG5vZXhjZXB0OworICAgIHVuaXF1ZV9wdHIocG9pbnRlciBwLCBzZWUgYmVsb3cgZCkgbm9leGNlcHQ7CisgICAgdW5pcXVlX3B0cihwb2ludGVyIHAsIHNlZSBiZWxvdyBkKSBub2V4Y2VwdDsKKyAgICB1bmlxdWVfcHRyKHVuaXF1ZV9wdHImJiB1KSBub2V4Y2VwdDsKKyAgICB1bmlxdWVfcHRyKG51bGxwdHJfdCkgbm9leGNlcHQgOiB1bmlxdWVfcHRyKCkgeyB9CisKKyAgICAvLyBkZXN0cnVjdG9yCisgICAgfnVuaXF1ZV9wdHIoKTsKKworICAgIC8vIGFzc2lnbm1lbnQKKyAgICB1bmlxdWVfcHRyJiBvcGVyYXRvcj0odW5pcXVlX3B0ciYmIHUpIG5vZXhjZXB0OworICAgIHVuaXF1ZV9wdHImIG9wZXJhdG9yPShudWxscHRyX3QpIG5vZXhjZXB0OworCisgICAgLy8gb2JzZXJ2ZXJzCisgICAgVCYgb3BlcmF0b3JbXShzaXplX3QgaSkgY29uc3Q7CisgICAgcG9pbnRlciBnZXQoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBkZWxldGVyX3R5cGUmIGdldF9kZWxldGVyKCkgbm9leGNlcHQ7CisgICAgY29uc3QgZGVsZXRlcl90eXBlJiBnZXRfZGVsZXRlcigpIGNvbnN0IG5vZXhjZXB0OworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBub2V4Y2VwdDsKKworICAgIC8vIG1vZGlmaWVycworICAgIHBvaW50ZXIgcmVsZWFzZSgpIG5vZXhjZXB0OworICAgIHZvaWQgcmVzZXQocG9pbnRlciBwID0gcG9pbnRlcigpKSBub2V4Y2VwdDsKKyAgICB2b2lkIHJlc2V0KG51bGxwdHJfdCkgbm9leGNlcHQ7CisgICAgdGVtcGxhdGUgPGNsYXNzIFU+IHZvaWQgcmVzZXQoVSkgPSBkZWxldGU7CisgICAgdm9pZCBzd2FwKHVuaXF1ZV9wdHImIHUpIG5vZXhjZXB0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEQ+CisgICAgdm9pZCBzd2FwKHVuaXF1ZV9wdHI8VCwgRD4mIHgsIHVuaXF1ZV9wdHI8VCwgRD4mIHkpIG5vZXhjZXB0OworCit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIEQxLCBjbGFzcyBUMiwgY2xhc3MgRDI+CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHVuaXF1ZV9wdHI8VDEsIEQxPiYgeCwgY29uc3QgdW5pcXVlX3B0cjxUMiwgRDI+JiB5KTsKK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgRDEsIGNsYXNzIFQyLCBjbGFzcyBEMj4KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgdW5pcXVlX3B0cjxUMSwgRDE+JiB4LCBjb25zdCB1bmlxdWVfcHRyPFQyLCBEMj4mIHkpOwordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBEMSwgY2xhc3MgVDIsIGNsYXNzIEQyPgorICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IHVuaXF1ZV9wdHI8VDEsIEQxPiYgeCwgY29uc3QgdW5pcXVlX3B0cjxUMiwgRDI+JiB5KTsKK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgRDEsIGNsYXNzIFQyLCBjbGFzcyBEMj4KKyAgICBib29sIG9wZXJhdG9yPD0oY29uc3QgdW5pcXVlX3B0cjxUMSwgRDE+JiB4LCBjb25zdCB1bmlxdWVfcHRyPFQyLCBEMj4mIHkpOwordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBEMSwgY2xhc3MgVDIsIGNsYXNzIEQyPgorICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IHVuaXF1ZV9wdHI8VDEsIEQxPiYgeCwgY29uc3QgdW5pcXVlX3B0cjxUMiwgRDI+JiB5KTsKK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgRDEsIGNsYXNzIFQyLCBjbGFzcyBEMj4KKyAgICBib29sIG9wZXJhdG9yPj0oY29uc3QgdW5pcXVlX3B0cjxUMSwgRDE+JiB4LCBjb25zdCB1bmlxdWVfcHRyPFQyLCBEMj4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgRD4KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgdW5pcXVlX3B0cjxULCBEPiYgeCwgbnVsbHB0cl90KSBub2V4Y2VwdDsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBEPgorICAgIGJvb2wgb3BlcmF0b3I9PShudWxscHRyX3QsIGNvbnN0IHVuaXF1ZV9wdHI8VCwgRD4mIHkpIG5vZXhjZXB0OwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEQ+CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHVuaXF1ZV9wdHI8VCwgRD4mIHgsIG51bGxwdHJfdCkgbm9leGNlcHQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgRD4KKyAgICBib29sIG9wZXJhdG9yIT0obnVsbHB0cl90LCBjb25zdCB1bmlxdWVfcHRyPFQsIEQ+JiB5KSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEQ+CisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgdW5pcXVlX3B0cjxULCBEPiYgeCwgbnVsbHB0cl90KTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBEPgorICAgIGJvb2wgb3BlcmF0b3I8KG51bGxwdHJfdCwgY29uc3QgdW5pcXVlX3B0cjxULCBEPiYgeSk7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgRD4KKyAgICBib29sIG9wZXJhdG9yPD0oY29uc3QgdW5pcXVlX3B0cjxULCBEPiYgeCwgbnVsbHB0cl90KTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBEPgorICAgIGJvb2wgb3BlcmF0b3I8PShudWxscHRyX3QsIGNvbnN0IHVuaXF1ZV9wdHI8VCwgRD4mIHkpOwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEQ+CisgICAgYm9vbCBvcGVyYXRvcj4oY29uc3QgdW5pcXVlX3B0cjxULCBEPiYgeCwgbnVsbHB0cl90KTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBEPgorICAgIGJvb2wgb3BlcmF0b3I+KG51bGxwdHJfdCwgY29uc3QgdW5pcXVlX3B0cjxULCBEPiYgeSk7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgRD4KKyAgICBib29sIG9wZXJhdG9yPj0oY29uc3QgdW5pcXVlX3B0cjxULCBEPiYgeCwgbnVsbHB0cl90KTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBEPgorICAgIGJvb2wgb3BlcmF0b3I+PShudWxscHRyX3QsIGNvbnN0IHVuaXF1ZV9wdHI8VCwgRD4mIHkpOworCitjbGFzcyBiYWRfd2Vha19wdHIKKyAgICA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbgoreworICAgIGJhZF93ZWFrX3B0cigpIG5vZXhjZXB0OworfTsKKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MuLi4gQXJncz4gdW5pcXVlX3B0cjxUPiBtYWtlX3VuaXF1ZShBcmdzJiYuLi4gYXJncyk7ICAgICAvLyBDKysxNAordGVtcGxhdGU8Y2xhc3MgVD4gICAgICAgICAgICAgICAgdW5pcXVlX3B0cjxUPiBtYWtlX3VuaXF1ZShzaXplX3Qgbik7ICAgICAgICAgICAvLyBDKysxNAordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MuLi4gQXJncz4gdW5zcGVjaWZpZWQgICBtYWtlX3VuaXF1ZShBcmdzJiYuLi4pID0gZGVsZXRlOyAvLyBDKysxNCwgVCA9PSBVW05dCisKK3RlbXBsYXRlPGNsYXNzIEUsIGNsYXNzIFQsIGNsYXNzIFksIGNsYXNzIEQ+CisgICAgYmFzaWNfb3N0cmVhbTxFLCBUPiYgb3BlcmF0b3I8PCAoYmFzaWNfb3N0cmVhbTxFLCBUPiYgb3MsIHVuaXF1ZV9wdHI8WSwgRD4gY29uc3QmIHApOworCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2xhc3Mgc2hhcmVkX3B0cgoreworcHVibGljOgorICAgIHR5cGVkZWYgVCBlbGVtZW50X3R5cGU7CisgICAgdHlwZWRlZiB3ZWFrX3B0cjxUPiB3ZWFrX3R5cGU7IC8vIEMrKzE3CisKKyAgICAvLyBjb25zdHJ1Y3RvcnM6CisgICAgY29uc3RleHByIHNoYXJlZF9wdHIoKSBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBZPiBleHBsaWNpdCBzaGFyZWRfcHRyKFkqIHApOworICAgIHRlbXBsYXRlPGNsYXNzIFksIGNsYXNzIEQ+IHNoYXJlZF9wdHIoWSogcCwgRCBkKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBZLCBjbGFzcyBELCBjbGFzcyBBPiBzaGFyZWRfcHRyKFkqIHAsIEQgZCwgQSBhKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgRD4gc2hhcmVkX3B0cihudWxscHRyX3QgcCwgRCBkKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgRCwgY2xhc3MgQT4gc2hhcmVkX3B0cihudWxscHRyX3QgcCwgRCBkLCBBIGEpOworICAgIHRlbXBsYXRlPGNsYXNzIFk+IHNoYXJlZF9wdHIoY29uc3Qgc2hhcmVkX3B0cjxZPiYgciwgVCAqcCkgbm9leGNlcHQ7CisgICAgc2hhcmVkX3B0cihjb25zdCBzaGFyZWRfcHRyJiByKSBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBZPiBzaGFyZWRfcHRyKGNvbnN0IHNoYXJlZF9wdHI8WT4mIHIpIG5vZXhjZXB0OworICAgIHNoYXJlZF9wdHIoc2hhcmVkX3B0ciYmIHIpIG5vZXhjZXB0OworICAgIHRlbXBsYXRlPGNsYXNzIFk+IHNoYXJlZF9wdHIoc2hhcmVkX3B0cjxZPiYmIHIpIG5vZXhjZXB0OworICAgIHRlbXBsYXRlPGNsYXNzIFk+IGV4cGxpY2l0IHNoYXJlZF9wdHIoY29uc3Qgd2Vha19wdHI8WT4mIHIpOworICAgIHRlbXBsYXRlPGNsYXNzIFk+IHNoYXJlZF9wdHIoYXV0b19wdHI8WT4mJiByKTsgICAgICAgICAgLy8gcmVtb3ZlZCBpbiBDKysxNworICAgIHRlbXBsYXRlIDxjbGFzcyBZLCBjbGFzcyBEPiBzaGFyZWRfcHRyKHVuaXF1ZV9wdHI8WSwgRD4mJiByKTsKKyAgICBzaGFyZWRfcHRyKG51bGxwdHJfdCkgOiBzaGFyZWRfcHRyKCkgeyB9CisKKyAgICAvLyBkZXN0cnVjdG9yOgorICAgIH5zaGFyZWRfcHRyKCk7CisKKyAgICAvLyBhc3NpZ25tZW50OgorICAgIHNoYXJlZF9wdHImIG9wZXJhdG9yPShjb25zdCBzaGFyZWRfcHRyJiByKSBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBZPiBzaGFyZWRfcHRyJiBvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX3B0cjxZPiYgcikgbm9leGNlcHQ7CisgICAgc2hhcmVkX3B0ciYgb3BlcmF0b3I9KHNoYXJlZF9wdHImJiByKSBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBZPiBzaGFyZWRfcHRyJiBvcGVyYXRvcj0oc2hhcmVkX3B0cjxZPiYmIHIpOworICAgIHRlbXBsYXRlPGNsYXNzIFk+IHNoYXJlZF9wdHImIG9wZXJhdG9yPShhdXRvX3B0cjxZPiYmIHIpOyAvLyByZW1vdmVkIGluIEMrKzE3CisgICAgdGVtcGxhdGUgPGNsYXNzIFksIGNsYXNzIEQ+IHNoYXJlZF9wdHImIG9wZXJhdG9yPSh1bmlxdWVfcHRyPFksIEQ+JiYgcik7CisKKyAgICAvLyBtb2RpZmllcnM6CisgICAgdm9pZCBzd2FwKHNoYXJlZF9wdHImIHIpIG5vZXhjZXB0OworICAgIHZvaWQgcmVzZXQoKSBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBZPiB2b2lkIHJlc2V0KFkqIHApOworICAgIHRlbXBsYXRlPGNsYXNzIFksIGNsYXNzIEQ+IHZvaWQgcmVzZXQoWSogcCwgRCBkKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBZLCBjbGFzcyBELCBjbGFzcyBBPiB2b2lkIHJlc2V0KFkqIHAsIEQgZCwgQSBhKTsKKworICAgIC8vIG9ic2VydmVyczoKKyAgICBUKiBnZXQoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBUJiBvcGVyYXRvciooKSBjb25zdCBub2V4Y2VwdDsKKyAgICBUKiBvcGVyYXRvci0+KCkgY29uc3Qgbm9leGNlcHQ7CisgICAgbG9uZyB1c2VfY291bnQoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBib29sIHVuaXF1ZSgpIGNvbnN0IG5vZXhjZXB0OworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVPiBib29sIG93bmVyX2JlZm9yZShzaGFyZWRfcHRyPFU+IGNvbnN0JiBiKSBjb25zdCBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVPiBib29sIG93bmVyX2JlZm9yZSh3ZWFrX3B0cjxVPiBjb25zdCYgYikgY29uc3Qgbm9leGNlcHQ7Cit9OworCisvLyBzaGFyZWRfcHRyIGNvbXBhcmlzb25zOgordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KKyAgICBib29sIG9wZXJhdG9yPT0oc2hhcmVkX3B0cjxUPiBjb25zdCYgYSwgc2hhcmVkX3B0cjxVPiBjb25zdCYgYikgbm9leGNlcHQ7Cit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorICAgIGJvb2wgb3BlcmF0b3IhPShzaGFyZWRfcHRyPFQ+IGNvbnN0JiBhLCBzaGFyZWRfcHRyPFU+IGNvbnN0JiBiKSBub2V4Y2VwdDsKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CisgICAgYm9vbCBvcGVyYXRvcjwoc2hhcmVkX3B0cjxUPiBjb25zdCYgYSwgc2hhcmVkX3B0cjxVPiBjb25zdCYgYikgbm9leGNlcHQ7Cit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorICAgIGJvb2wgb3BlcmF0b3I+KHNoYXJlZF9wdHI8VD4gY29uc3QmIGEsIHNoYXJlZF9wdHI8VT4gY29uc3QmIGIpIG5vZXhjZXB0OwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KKyAgICBib29sIG9wZXJhdG9yPD0oc2hhcmVkX3B0cjxUPiBjb25zdCYgYSwgc2hhcmVkX3B0cjxVPiBjb25zdCYgYikgbm9leGNlcHQ7Cit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorICAgIGJvb2wgb3BlcmF0b3I+PShzaGFyZWRfcHRyPFQ+IGNvbnN0JiBhLCBzaGFyZWRfcHRyPFU+IGNvbnN0JiBiKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHNoYXJlZF9wdHI8VD4mIHgsIG51bGxwdHJfdCkgbm9leGNlcHQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBib29sIG9wZXJhdG9yPT0obnVsbHB0cl90LCBjb25zdCBzaGFyZWRfcHRyPFQ+JiB5KSBub2V4Y2VwdDsKK3RlbXBsYXRlIDxjbGFzcyBUPgorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBzaGFyZWRfcHRyPFQ+JiB4LCBudWxscHRyX3QpIG5vZXhjZXB0OwordGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgYm9vbCBvcGVyYXRvciE9KG51bGxwdHJfdCwgY29uc3Qgc2hhcmVkX3B0cjxUPiYgeSkgbm9leGNlcHQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBzaGFyZWRfcHRyPFQ+JiB4LCBudWxscHRyX3QpIG5vZXhjZXB0OwordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIG9wZXJhdG9yPChudWxscHRyX3QsIGNvbnN0IHNoYXJlZF9wdHI8VD4mIHkpIG5vZXhjZXB0OwordGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IHNoYXJlZF9wdHI8VD4mIHgsIG51bGxwdHJfdCkgbm9leGNlcHQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBib29sIG9wZXJhdG9yPD0obnVsbHB0cl90LCBjb25zdCBzaGFyZWRfcHRyPFQ+JiB5KSBub2V4Y2VwdDsKK3RlbXBsYXRlIDxjbGFzcyBUPgorICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IHNoYXJlZF9wdHI8VD4mIHgsIG51bGxwdHJfdCkgbm9leGNlcHQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBib29sIG9wZXJhdG9yPihudWxscHRyX3QsIGNvbnN0IHNoYXJlZF9wdHI8VD4mIHkpIG5vZXhjZXB0OwordGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IHNoYXJlZF9wdHI8VD4mIHgsIG51bGxwdHJfdCkgbm9leGNlcHQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBib29sIG9wZXJhdG9yPj0obnVsbHB0cl90LCBjb25zdCBzaGFyZWRfcHRyPFQ+JiB5KSBub2V4Y2VwdDsKKworLy8gc2hhcmVkX3B0ciBzcGVjaWFsaXplZCBhbGdvcml0aG1zOgordGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBzd2FwKHNoYXJlZF9wdHI8VD4mIGEsIHNoYXJlZF9wdHI8VD4mIGIpIG5vZXhjZXB0OworCisvLyBzaGFyZWRfcHRyIGNhc3RzOgordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KKyAgICBzaGFyZWRfcHRyPFQ+IHN0YXRpY19wb2ludGVyX2Nhc3Qoc2hhcmVkX3B0cjxVPiBjb25zdCYgcikgbm9leGNlcHQ7Cit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorICAgIHNoYXJlZF9wdHI8VD4gZHluYW1pY19wb2ludGVyX2Nhc3Qoc2hhcmVkX3B0cjxVPiBjb25zdCYgcikgbm9leGNlcHQ7Cit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorICAgIHNoYXJlZF9wdHI8VD4gY29uc3RfcG9pbnRlcl9jYXN0KHNoYXJlZF9wdHI8VT4gY29uc3QmIHIpIG5vZXhjZXB0OworCisvLyBzaGFyZWRfcHRyIEkvTzoKK3RlbXBsYXRlPGNsYXNzIEUsIGNsYXNzIFQsIGNsYXNzIFk+CisgICAgYmFzaWNfb3N0cmVhbTxFLCBUPiYgb3BlcmF0b3I8PCAoYmFzaWNfb3N0cmVhbTxFLCBUPiYgb3MsIHNoYXJlZF9wdHI8WT4gY29uc3QmIHApOworCisvLyBzaGFyZWRfcHRyIGdldF9kZWxldGVyOgordGVtcGxhdGU8Y2xhc3MgRCwgY2xhc3MgVD4gRCogZ2V0X2RlbGV0ZXIoc2hhcmVkX3B0cjxUPiBjb25zdCYgcCkgbm9leGNlcHQ7CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzLi4uIEFyZ3M+CisgICAgc2hhcmVkX3B0cjxUPiBtYWtlX3NoYXJlZChBcmdzJiYuLi4gYXJncyk7Cit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBBLCBjbGFzcy4uLiBBcmdzPgorICAgIHNoYXJlZF9wdHI8VD4gYWxsb2NhdGVfc2hhcmVkKGNvbnN0IEEmIGEsIEFyZ3MmJi4uLiBhcmdzKTsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NsYXNzIHdlYWtfcHRyCit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBUIGVsZW1lbnRfdHlwZTsKKworICAgIC8vIGNvbnN0cnVjdG9ycworICAgIGNvbnN0ZXhwciB3ZWFrX3B0cigpIG5vZXhjZXB0OworICAgIHRlbXBsYXRlPGNsYXNzIFk+IHdlYWtfcHRyKHNoYXJlZF9wdHI8WT4gY29uc3QmIHIpIG5vZXhjZXB0OworICAgIHdlYWtfcHRyKHdlYWtfcHRyIGNvbnN0JiByKSBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBZPiB3ZWFrX3B0cih3ZWFrX3B0cjxZPiBjb25zdCYgcikgbm9leGNlcHQ7CisgICAgd2Vha19wdHIod2Vha19wdHImJiByKSBub2V4Y2VwdDsgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZTxjbGFzcyBZPiB3ZWFrX3B0cih3ZWFrX3B0cjxZPiYmIHIpIG5vZXhjZXB0OyAvLyBDKysxNAorCisgICAgLy8gZGVzdHJ1Y3RvcgorICAgIH53ZWFrX3B0cigpOworCisgICAgLy8gYXNzaWdubWVudAorICAgIHdlYWtfcHRyJiBvcGVyYXRvcj0od2Vha19wdHIgY29uc3QmIHIpIG5vZXhjZXB0OworICAgIHRlbXBsYXRlPGNsYXNzIFk+IHdlYWtfcHRyJiBvcGVyYXRvcj0od2Vha19wdHI8WT4gY29uc3QmIHIpIG5vZXhjZXB0OworICAgIHRlbXBsYXRlPGNsYXNzIFk+IHdlYWtfcHRyJiBvcGVyYXRvcj0oc2hhcmVkX3B0cjxZPiBjb25zdCYgcikgbm9leGNlcHQ7CisgICAgd2Vha19wdHImIG9wZXJhdG9yPSh3ZWFrX3B0ciYmIHIpIG5vZXhjZXB0OyAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNAorICAgIHRlbXBsYXRlPGNsYXNzIFk+IHdlYWtfcHRyJiBvcGVyYXRvcj0od2Vha19wdHI8WT4mJiByKSBub2V4Y2VwdDsgLy8gQysrMTQKKworICAgIC8vIG1vZGlmaWVycworICAgIHZvaWQgc3dhcCh3ZWFrX3B0ciYgcikgbm9leGNlcHQ7CisgICAgdm9pZCByZXNldCgpIG5vZXhjZXB0OworCisgICAgLy8gb2JzZXJ2ZXJzCisgICAgbG9uZyB1c2VfY291bnQoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBib29sIGV4cGlyZWQoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBzaGFyZWRfcHRyPFQ+IGxvY2soKSBjb25zdCBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVPiBib29sIG93bmVyX2JlZm9yZShzaGFyZWRfcHRyPFU+IGNvbnN0JiBiKSBjb25zdCBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVPiBib29sIG93bmVyX2JlZm9yZSh3ZWFrX3B0cjxVPiBjb25zdCYgYikgY29uc3Qgbm9leGNlcHQ7Cit9OworCisvLyB3ZWFrX3B0ciBzcGVjaWFsaXplZCBhbGdvcml0aG1zOgordGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBzd2FwKHdlYWtfcHRyPFQ+JiBhLCB3ZWFrX3B0cjxUPiYgYikgbm9leGNlcHQ7CisKKy8vIGNsYXNzIG93bmVyX2xlc3M6Cit0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3Qgb3duZXJfbGVzczsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK3N0cnVjdCBvd25lcl9sZXNzPHNoYXJlZF9wdHI8VD4+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248c2hhcmVkX3B0cjxUPiwgc2hhcmVkX3B0cjxUPiwgYm9vbD4KK3sKKyAgICB0eXBlZGVmIGJvb2wgcmVzdWx0X3R5cGU7CisgICAgYm9vbCBvcGVyYXRvcigpKHNoYXJlZF9wdHI8VD4gY29uc3QmLCBzaGFyZWRfcHRyPFQ+IGNvbnN0JikgY29uc3Qgbm9leGNlcHQ7CisgICAgYm9vbCBvcGVyYXRvcigpKHNoYXJlZF9wdHI8VD4gY29uc3QmLCB3ZWFrX3B0cjxUPiBjb25zdCYpIGNvbnN0IG5vZXhjZXB0OworICAgIGJvb2wgb3BlcmF0b3IoKSh3ZWFrX3B0cjxUPiBjb25zdCYsIHNoYXJlZF9wdHI8VD4gY29uc3QmKSBjb25zdCBub2V4Y2VwdDsKK307CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdHJ1Y3Qgb3duZXJfbGVzczx3ZWFrX3B0cjxUPj4KKyAgICA6IGJpbmFyeV9mdW5jdGlvbjx3ZWFrX3B0cjxUPiwgd2Vha19wdHI8VD4sIGJvb2w+Cit7CisgICAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworICAgIGJvb2wgb3BlcmF0b3IoKSh3ZWFrX3B0cjxUPiBjb25zdCYsIHdlYWtfcHRyPFQ+IGNvbnN0JikgY29uc3Qgbm9leGNlcHQ7CisgICAgYm9vbCBvcGVyYXRvcigpKHNoYXJlZF9wdHI8VD4gY29uc3QmLCB3ZWFrX3B0cjxUPiBjb25zdCYpIGNvbnN0IG5vZXhjZXB0OworICAgIGJvb2wgb3BlcmF0b3IoKSh3ZWFrX3B0cjxUPiBjb25zdCYsIHNoYXJlZF9wdHI8VD4gY29uc3QmKSBjb25zdCBub2V4Y2VwdDsKK307CisKK3RlbXBsYXRlIDw+ICAvLyBBZGRlZCBpbiBDKysxNAorc3RydWN0IG93bmVyX2xlc3M8dm9pZD4KK3sKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CisgICAgYm9vbCBvcGVyYXRvcigpKCBzaGFyZWRfcHRyPF9UcD4gY29uc3QmIF9feCwgc2hhcmVkX3B0cjxfVXA+IGNvbnN0JiBfX3kpIGNvbnN0IG5vZXhjZXB0OworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KKyAgICBib29sIG9wZXJhdG9yKCkoIHNoYXJlZF9wdHI8X1RwPiBjb25zdCYgX194LCAgIHdlYWtfcHRyPF9VcD4gY29uc3QmIF9feSkgY29uc3Qgbm9leGNlcHQ7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorICAgIGJvb2wgb3BlcmF0b3IoKSggICB3ZWFrX3B0cjxfVHA+IGNvbnN0JiBfX3gsIHNoYXJlZF9wdHI8X1VwPiBjb25zdCYgX195KSBjb25zdCBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CisgICAgYm9vbCBvcGVyYXRvcigpKCAgIHdlYWtfcHRyPF9UcD4gY29uc3QmIF9feCwgICB3ZWFrX3B0cjxfVXA+IGNvbnN0JiBfX3kpIGNvbnN0IG5vZXhjZXB0OworCisgICAgdHlwZWRlZiB2b2lkIGlzX3RyYW5zcGFyZW50OworfTsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NsYXNzIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzCit7Citwcm90ZWN0ZWQ6CisgICAgY29uc3RleHByIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzKCkgbm9leGNlcHQ7CisgICAgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMoZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMgY29uc3QmKSBub2V4Y2VwdDsKKyAgICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYgb3BlcmF0b3I9KGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzIGNvbnN0Jikgbm9leGNlcHQ7CisgICAgfmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzKCk7CitwdWJsaWM6CisgICAgc2hhcmVkX3B0cjxUPiBzaGFyZWRfZnJvbV90aGlzKCk7CisgICAgc2hhcmVkX3B0cjxUIGNvbnN0PiBzaGFyZWRfZnJvbV90aGlzKCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIGJvb2wgYXRvbWljX2lzX2xvY2tfZnJlZShjb25zdCBzaGFyZWRfcHRyPFQ+KiBwKTsKK3RlbXBsYXRlPGNsYXNzIFQ+CisgICAgc2hhcmVkX3B0cjxUPiBhdG9taWNfbG9hZChjb25zdCBzaGFyZWRfcHRyPFQ+KiBwKTsKK3RlbXBsYXRlPGNsYXNzIFQ+CisgICAgc2hhcmVkX3B0cjxUPiBhdG9taWNfbG9hZF9leHBsaWNpdChjb25zdCBzaGFyZWRfcHRyPFQ+KiBwLCBtZW1vcnlfb3JkZXIgbW8pOwordGVtcGxhdGU8Y2xhc3MgVD4KKyAgICB2b2lkIGF0b21pY19zdG9yZShzaGFyZWRfcHRyPFQ+KiBwLCBzaGFyZWRfcHRyPFQ+IHIpOwordGVtcGxhdGU8Y2xhc3MgVD4KKyAgICB2b2lkIGF0b21pY19zdG9yZV9leHBsaWNpdChzaGFyZWRfcHRyPFQ+KiBwLCBzaGFyZWRfcHRyPFQ+IHIsIG1lbW9yeV9vcmRlciBtbyk7Cit0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIHNoYXJlZF9wdHI8VD4gYXRvbWljX2V4Y2hhbmdlKHNoYXJlZF9wdHI8VD4qIHAsIHNoYXJlZF9wdHI8VD4gcik7Cit0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIHNoYXJlZF9wdHI8VD4KKyAgICBhdG9taWNfZXhjaGFuZ2VfZXhwbGljaXQoc2hhcmVkX3B0cjxUPiogcCwgc2hhcmVkX3B0cjxUPiByLCBtZW1vcnlfb3JkZXIgbW8pOwordGVtcGxhdGU8Y2xhc3MgVD4KKyAgICBib29sCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhayhzaGFyZWRfcHRyPFQ+KiBwLCBzaGFyZWRfcHRyPFQ+KiB2LCBzaGFyZWRfcHRyPFQ+IHcpOwordGVtcGxhdGU8Y2xhc3MgVD4KKyAgICBib29sCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKCBzaGFyZWRfcHRyPFQ+KiBwLCBzaGFyZWRfcHRyPFQ+KiB2LCBzaGFyZWRfcHRyPFQ+IHcpOwordGVtcGxhdGU8Y2xhc3MgVD4KKyAgICBib29sCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vha19leHBsaWNpdChzaGFyZWRfcHRyPFQ+KiBwLCBzaGFyZWRfcHRyPFQ+KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUPiB3LCBtZW1vcnlfb3JkZXIgc3VjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlciBmYWlsdXJlKTsKK3RlbXBsYXRlPGNsYXNzIFQ+CisgICAgYm9vbAorICAgIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdChzaGFyZWRfcHRyPFQ+KiBwLCBzaGFyZWRfcHRyPFQ+KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFQ+IHcsIG1lbW9yeV9vcmRlciBzdWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXIgZmFpbHVyZSk7CisvLyBIYXNoIHN1cHBvcnQKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaGFzaDsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBEPiBzdHJ1Y3QgaGFzaDx1bmlxdWVfcHRyPFQsIEQ+ID47Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGhhc2g8c2hhcmVkX3B0cjxUPiA+OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQWxsb2M+CisgIGlubGluZSBjb25zdGV4cHIgYm9vbCB1c2VzX2FsbG9jYXRvcl92ID0gdXNlc19hbGxvY2F0b3I8VCwgQWxsb2M+Ojp2YWx1ZTsKKworLy8gUG9pbnRlciBzYWZldHkKK2VudW0gY2xhc3MgcG9pbnRlcl9zYWZldHkgeyByZWxheGVkLCBwcmVmZXJyZWQsIHN0cmljdCB9Owordm9pZCBkZWNsYXJlX3JlYWNoYWJsZSh2b2lkICpwKTsKK3RlbXBsYXRlIDxjbGFzcyBUPiBUICp1bmRlY2xhcmVfcmVhY2hhYmxlKFQgKnApOwordm9pZCBkZWNsYXJlX25vX3BvaW50ZXJzKGNoYXIgKnAsIHNpemVfdCBuKTsKK3ZvaWQgdW5kZWNsYXJlX25vX3BvaW50ZXJzKGNoYXIgKnAsIHNpemVfdCBuKTsKK3BvaW50ZXJfc2FmZXR5IGdldF9wb2ludGVyX3NhZmV0eSgpIG5vZXhjZXB0OworCit2b2lkKiBhbGlnbihzaXplX3QgYWxpZ25tZW50LCBzaXplX3Qgc2l6ZSwgdm9pZComIHB0ciwgc2l6ZV90JiBzcGFjZSk7CisKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dHlwZWluZm8+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxfX2Z1bmN0aW9uYWxfYmFzZT4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19BVE9NSUNfSEVBREVSKQorIyAgaW5jbHVkZSA8YXRvbWljPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX1BVU0hfTUFDUk9TCisjaW5jbHVkZSA8X191bmRlZl9tYWNyb3M+CisKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWVUeXBlPgoraW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORQorX1ZhbHVlVHlwZSBfX2xpYmNwcF9yZWxheGVkX2xvYWQoX1ZhbHVlVHlwZSBjb25zdCogX192YWx1ZSkgeworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1RIUkVBRFMpICYmIFwKKyAgICBkZWZpbmVkKF9fQVRPTUlDX1JFTEFYRUQpICYmICAgICAgICBcCisgICAgKF9faGFzX2J1aWx0aW4oX19hdG9taWNfbG9hZF9uKSB8fCBfR05VQ19WRVIgPj0gNDA3KQorICAgIHJldHVybiBfX2F0b21pY19sb2FkX24oX192YWx1ZSwgX19BVE9NSUNfUkVMQVhFRCk7CisjZWxzZQorICAgIHJldHVybiAqX192YWx1ZTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlVHlwZT4KK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUKK19WYWx1ZVR5cGUgX19saWJjcHBfYWNxdWlyZV9sb2FkKF9WYWx1ZVR5cGUgY29uc3QqIF9fdmFsdWUpIHsKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19USFJFQURTKSAmJiBcCisgICAgZGVmaW5lZChfX0FUT01JQ19BQ1FVSVJFKSAmJiAgICAgICAgXAorICAgIChfX2hhc19idWlsdGluKF9fYXRvbWljX2xvYWRfbikgfHwgX0dOVUNfVkVSID49IDQwNykKKyAgICByZXR1cm4gX19hdG9taWNfbG9hZF9uKF9fdmFsdWUsIF9fQVRPTUlDX0FDUVVJUkUpOworI2Vsc2UKKyAgICByZXR1cm4gKl9fdmFsdWU7CisjZW5kaWYKK30KKworLy8gYWRkcmVzc29mIG1vdmVkIHRvIDx0eXBlX3RyYWl0cz4KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gY2xhc3MgYWxsb2NhdG9yOworCit0ZW1wbGF0ZSA8PgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYWxsb2NhdG9yPHZvaWQ+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiB2b2lkKiAgICAgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgY29uc3Qgdm9pZCogICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPiBzdHJ1Y3QgcmViaW5kIHt0eXBlZGVmIGFsbG9jYXRvcjxfVXA+IG90aGVyO307Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYWxsb2NhdG9yPGNvbnN0IHZvaWQ+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBjb25zdCB2b2lkKiAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgY29uc3Qgdm9pZCogICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIGNvbnN0IHZvaWQgICAgICAgIHZhbHVlX3R5cGU7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPiBzdHJ1Y3QgcmViaW5kIHt0eXBlZGVmIGFsbG9jYXRvcjxfVXA+IG90aGVyO307Cit9OworCisvLyBwb2ludGVyX3RyYWl0cworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyA9IHZvaWQ+CitzdHJ1Y3QgX19oYXNfZWxlbWVudF90eXBlIDogZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2hhc19lbGVtZW50X3R5cGU8X1RwLAorICAgICAgICAgICAgICB0eXBlbmFtZSBfX3ZvaWRfdDx0eXBlbmFtZSBfVHA6OmVsZW1lbnRfdHlwZT46OnR5cGU+IDogdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1B0ciwgYm9vbCA9IF9faGFzX2VsZW1lbnRfdHlwZTxfUHRyPjo6dmFsdWU+CitzdHJ1Y3QgX19wb2ludGVyX3RyYWl0c19lbGVtZW50X3R5cGU7CisKK3RlbXBsYXRlIDxjbGFzcyBfUHRyPgorc3RydWN0IF9fcG9pbnRlcl90cmFpdHNfZWxlbWVudF90eXBlPF9QdHIsIHRydWU+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfUHRyOjplbGVtZW50X3R5cGUgdHlwZTsKK307CisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCisKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLi4uPiBjbGFzcyBfU3AsIGNsYXNzIF9UcCwgY2xhc3MgLi4uX0FyZ3M+CitzdHJ1Y3QgX19wb2ludGVyX3RyYWl0c19lbGVtZW50X3R5cGU8X1NwPF9UcCwgX0FyZ3MuLi4+LCB0cnVlPgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NwPF9UcCwgX0FyZ3MuLi4+OjplbGVtZW50X3R5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLi4uPiBjbGFzcyBfU3AsIGNsYXNzIF9UcCwgY2xhc3MgLi4uX0FyZ3M+CitzdHJ1Y3QgX19wb2ludGVyX3RyYWl0c19lbGVtZW50X3R5cGU8X1NwPF9UcCwgX0FyZ3MuLi4+LCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9UcCB0eXBlOworfTsKKworI2Vsc2UgIC8vIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBfU3AsIGNsYXNzIF9UcD4KK3N0cnVjdCBfX3BvaW50ZXJfdHJhaXRzX2VsZW1lbnRfdHlwZTxfU3A8X1RwPiwgdHJ1ZT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9TcDxfVHA+OjplbGVtZW50X3R5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIF9TcCwgY2xhc3MgX1RwPgorc3RydWN0IF9fcG9pbnRlcl90cmFpdHNfZWxlbWVudF90eXBlPF9TcDxfVHA+LCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9UcCB0eXBlOworfTsKKwordGVtcGxhdGUgPHRlbXBsYXRlIDxjbGFzcywgY2xhc3M+IGNsYXNzIF9TcCwgY2xhc3MgX1RwLCBjbGFzcyBfQTA+CitzdHJ1Y3QgX19wb2ludGVyX3RyYWl0c19lbGVtZW50X3R5cGU8X1NwPF9UcCwgX0EwPiwgdHJ1ZT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9TcDxfVHAsIF9BMD46OmVsZW1lbnRfdHlwZSB0eXBlOworfTsKKwordGVtcGxhdGUgPHRlbXBsYXRlIDxjbGFzcywgY2xhc3M+IGNsYXNzIF9TcCwgY2xhc3MgX1RwLCBjbGFzcyBfQTA+CitzdHJ1Y3QgX19wb2ludGVyX3RyYWl0c19lbGVtZW50X3R5cGU8X1NwPF9UcCwgX0EwPiwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfVHAgdHlwZTsKK307CisKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcz4gY2xhc3MgX1NwLCBjbGFzcyBfVHAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorc3RydWN0IF9fcG9pbnRlcl90cmFpdHNfZWxlbWVudF90eXBlPF9TcDxfVHAsIF9BMCwgX0ExPiwgdHJ1ZT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9TcDxfVHAsIF9BMCwgX0ExPjo6ZWxlbWVudF90eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLCBjbGFzcywgY2xhc3M+IGNsYXNzIF9TcCwgY2xhc3MgX1RwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMT4KK3N0cnVjdCBfX3BvaW50ZXJfdHJhaXRzX2VsZW1lbnRfdHlwZTxfU3A8X1RwLCBfQTAsIF9BMT4sIGZhbHNlPgoreworICAgIHR5cGVkZWYgX1RwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzPiBjbGFzcyBfU3AsIGNsYXNzIF9UcCwgY2xhc3MgX0EwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KK3N0cnVjdCBfX3BvaW50ZXJfdHJhaXRzX2VsZW1lbnRfdHlwZTxfU3A8X1RwLCBfQTAsIF9BMSwgX0EyPiwgdHJ1ZT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9TcDxfVHAsIF9BMCwgX0ExLCBfQTI+OjplbGVtZW50X3R5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcywgY2xhc3M+IGNsYXNzIF9TcCwgY2xhc3MgX1RwLCBjbGFzcyBfQTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorc3RydWN0IF9fcG9pbnRlcl90cmFpdHNfZWxlbWVudF90eXBlPF9TcDxfVHAsIF9BMCwgX0ExLCBfQTI+LCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9UcCB0eXBlOworfTsKKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgPSB2b2lkPgorc3RydWN0IF9faGFzX2RpZmZlcmVuY2VfdHlwZSA6IGZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19oYXNfZGlmZmVyZW5jZV90eXBlPF9UcCwKKyAgICAgICAgICAgIHR5cGVuYW1lIF9fdm9pZF90PHR5cGVuYW1lIF9UcDo6ZGlmZmVyZW5jZV90eXBlPjo6dHlwZT4gOiB0cnVlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfUHRyLCBib29sID0gX19oYXNfZGlmZmVyZW5jZV90eXBlPF9QdHI+Ojp2YWx1ZT4KK3N0cnVjdCBfX3BvaW50ZXJfdHJhaXRzX2RpZmZlcmVuY2VfdHlwZQoreworICAgIHR5cGVkZWYgcHRyZGlmZl90IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1B0cj4KK3N0cnVjdCBfX3BvaW50ZXJfdHJhaXRzX2RpZmZlcmVuY2VfdHlwZTxfUHRyLCB0cnVlPgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1B0cjo6ZGlmZmVyZW5jZV90eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitzdHJ1Y3QgX19oYXNfcmViaW5kCit7Citwcml2YXRlOgorICAgIHN0cnVjdCBfX3R3byB7Y2hhciBfX2x4OyBjaGFyIF9fbHh4O307CisgICAgdGVtcGxhdGUgPGNsYXNzIF9YcD4gc3RhdGljIF9fdHdvIF9fdGVzdCguLi4pOworICAgIHRlbXBsYXRlIDxjbGFzcyBfWHA+IHN0YXRpYyBjaGFyIF9fdGVzdCh0eXBlbmFtZSBfWHA6OnRlbXBsYXRlIHJlYmluZDxfVXA+KiA9IDApOworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gc2l6ZW9mKF9fdGVzdDxfVHA+KDApKSA9PSAxOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwLCBib29sID0gX19oYXNfcmViaW5kPF9UcCwgX1VwPjo6dmFsdWU+CitzdHJ1Y3QgX19wb2ludGVyX3RyYWl0c19yZWJpbmQKK3sKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHA6OnRlbXBsYXRlIHJlYmluZDxfVXA+IHR5cGU7CisjZWxzZQorICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwOjp0ZW1wbGF0ZSByZWJpbmQ8X1VwPjo6b3RoZXIgdHlwZTsKKyNlbmRpZgorfTsKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKKwordGVtcGxhdGUgPHRlbXBsYXRlIDxjbGFzcywgY2xhc3MuLi4+IGNsYXNzIF9TcCwgY2xhc3MgX1RwLCBjbGFzcyAuLi5fQXJncywgY2xhc3MgX1VwPgorc3RydWN0IF9fcG9pbnRlcl90cmFpdHNfcmViaW5kPF9TcDxfVHAsIF9BcmdzLi4uPiwgX1VwLCB0cnVlPgoreworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9TcDxfVHAsIF9BcmdzLi4uPjo6dGVtcGxhdGUgcmViaW5kPF9VcD4gdHlwZTsKKyNlbHNlCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfU3A8X1RwLCBfQXJncy4uLj46OnRlbXBsYXRlIHJlYmluZDxfVXA+OjpvdGhlciB0eXBlOworI2VuZGlmCit9OworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLCBjbGFzcy4uLj4gY2xhc3MgX1NwLCBjbGFzcyBfVHAsIGNsYXNzIC4uLl9BcmdzLCBjbGFzcyBfVXA+CitzdHJ1Y3QgX19wb2ludGVyX3RyYWl0c19yZWJpbmQ8X1NwPF9UcCwgX0FyZ3MuLi4+LCBfVXAsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX1NwPF9VcCwgX0FyZ3MuLi4+IHR5cGU7Cit9OworCisjZWxzZSAgLy8gX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCisKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIF9TcCwgY2xhc3MgX1RwLCBjbGFzcyBfVXA+CitzdHJ1Y3QgX19wb2ludGVyX3RyYWl0c19yZWJpbmQ8X1NwPF9UcD4sIF9VcCwgdHJ1ZT4KK3sKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfU3A8X1RwPjo6dGVtcGxhdGUgcmViaW5kPF9VcD4gdHlwZTsKKyNlbHNlCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfU3A8X1RwPjo6dGVtcGxhdGUgcmViaW5kPF9VcD46Om90aGVyIHR5cGU7CisjZW5kaWYKK307CisKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIF9TcCwgY2xhc3MgX1RwLCBjbGFzcyBfVXA+CitzdHJ1Y3QgX19wb2ludGVyX3RyYWl0c19yZWJpbmQ8X1NwPF9UcD4sIF9VcCwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfU3A8X1VwPiB0eXBlOworfTsKKwordGVtcGxhdGUgPHRlbXBsYXRlIDxjbGFzcywgY2xhc3M+IGNsYXNzIF9TcCwgY2xhc3MgX1RwLCBjbGFzcyBfQTAsIGNsYXNzIF9VcD4KK3N0cnVjdCBfX3BvaW50ZXJfdHJhaXRzX3JlYmluZDxfU3A8X1RwLCBfQTA+LCBfVXAsIHRydWU+Cit7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NwPF9UcCwgX0EwPjo6dGVtcGxhdGUgcmViaW5kPF9VcD4gdHlwZTsKKyNlbHNlCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfU3A8X1RwLCBfQTA+Ojp0ZW1wbGF0ZSByZWJpbmQ8X1VwPjo6b3RoZXIgdHlwZTsKKyNlbmRpZgorfTsKKwordGVtcGxhdGUgPHRlbXBsYXRlIDxjbGFzcywgY2xhc3M+IGNsYXNzIF9TcCwgY2xhc3MgX1RwLCBjbGFzcyBfQTAsIGNsYXNzIF9VcD4KK3N0cnVjdCBfX3BvaW50ZXJfdHJhaXRzX3JlYmluZDxfU3A8X1RwLCBfQTA+LCBfVXAsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX1NwPF9VcCwgX0EwPiB0eXBlOworfTsKKwordGVtcGxhdGUgPHRlbXBsYXRlIDxjbGFzcywgY2xhc3MsIGNsYXNzPiBjbGFzcyBfU3AsIGNsYXNzIF9UcCwgY2xhc3MgX0EwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBfQTEsIGNsYXNzIF9VcD4KK3N0cnVjdCBfX3BvaW50ZXJfdHJhaXRzX3JlYmluZDxfU3A8X1RwLCBfQTAsIF9BMT4sIF9VcCwgdHJ1ZT4KK3sKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfU3A8X1RwLCBfQTAsIF9BMT46OnRlbXBsYXRlIHJlYmluZDxfVXA+IHR5cGU7CisjZWxzZQorICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NwPF9UcCwgX0EwLCBfQTE+Ojp0ZW1wbGF0ZSByZWJpbmQ8X1VwPjo6b3RoZXIgdHlwZTsKKyNlbmRpZgorfTsKKwordGVtcGxhdGUgPHRlbXBsYXRlIDxjbGFzcywgY2xhc3MsIGNsYXNzPiBjbGFzcyBfU3AsIGNsYXNzIF9UcCwgY2xhc3MgX0EwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBfQTEsIGNsYXNzIF9VcD4KK3N0cnVjdCBfX3BvaW50ZXJfdHJhaXRzX3JlYmluZDxfU3A8X1RwLCBfQTAsIF9BMT4sIF9VcCwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfU3A8X1VwLCBfQTAsIF9BMT4gdHlwZTsKK307CisKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcywgY2xhc3M+IGNsYXNzIF9TcCwgY2xhc3MgX1RwLCBjbGFzcyBfQTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBfQTEsIGNsYXNzIF9BMiwgY2xhc3MgX1VwPgorc3RydWN0IF9fcG9pbnRlcl90cmFpdHNfcmViaW5kPF9TcDxfVHAsIF9BMCwgX0ExLCBfQTI+LCBfVXAsIHRydWU+Cit7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NwPF9UcCwgX0EwLCBfQTEsIF9BMj46OnRlbXBsYXRlIHJlYmluZDxfVXA+IHR5cGU7CisjZWxzZQorICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NwPF9UcCwgX0EwLCBfQTEsIF9BMj46OnRlbXBsYXRlIHJlYmluZDxfVXA+OjpvdGhlciB0eXBlOworI2VuZGlmCit9OworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzPiBjbGFzcyBfU3AsIGNsYXNzIF9UcCwgY2xhc3MgX0EwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgX0ExLCBjbGFzcyBfQTIsIGNsYXNzIF9VcD4KK3N0cnVjdCBfX3BvaW50ZXJfdHJhaXRzX3JlYmluZDxfU3A8X1RwLCBfQTAsIF9BMSwgX0EyPiwgX1VwLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9TcDxfVXAsIF9BMCwgX0ExLCBfQTI+IHR5cGU7Cit9OworCisjZW5kaWYgIC8vIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworCit0ZW1wbGF0ZSA8Y2xhc3MgX1B0cj4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBwb2ludGVyX3RyYWl0cworeworICAgIHR5cGVkZWYgX1B0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcG9pbnRlcl90cmFpdHNfZWxlbWVudF90eXBlPHBvaW50ZXI+Ojp0eXBlICAgIGVsZW1lbnRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcG9pbnRlcl90cmFpdHNfZGlmZmVyZW5jZV90eXBlPHBvaW50ZXI+Ojp0eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPiB1c2luZyByZWJpbmQgPSB0eXBlbmFtZSBfX3BvaW50ZXJfdHJhaXRzX3JlYmluZDxwb2ludGVyLCBfVXA+Ojp0eXBlOworI2Vsc2UKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPiBzdHJ1Y3QgcmViaW5kCisgICAgICAgIHt0eXBlZGVmIHR5cGVuYW1lIF9fcG9pbnRlcl90cmFpdHNfcmViaW5kPHBvaW50ZXIsIF9VcD46OnR5cGUgb3RoZXI7fTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3ByaXZhdGU6CisgICAgc3RydWN0IF9fbmF0IHt9OworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgcG9pbnRlciBwb2ludGVyX3RvKHR5cGVuYW1lIGNvbmRpdGlvbmFsPGlzX3ZvaWQ8ZWxlbWVudF90eXBlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uYXQsIGVsZW1lbnRfdHlwZT46OnR5cGUmIF9fcikKKyAgICAgICAge3JldHVybiBwb2ludGVyOjpwb2ludGVyX3RvKF9fcik7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBwb2ludGVyX3RyYWl0czxfVHAqPgoreworICAgIHR5cGVkZWYgX1RwKiAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiBfVHAgICAgICAgZWxlbWVudF90eXBlOworICAgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPiB1c2luZyByZWJpbmQgPSBfVXAqOworI2Vsc2UKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPiBzdHJ1Y3QgcmViaW5kIHt0eXBlZGVmIF9VcCogb3RoZXI7fTsKKyNlbmRpZgorCitwcml2YXRlOgorICAgIHN0cnVjdCBfX25hdCB7fTsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGljIHBvaW50ZXIgcG9pbnRlcl90byh0eXBlbmFtZSBjb25kaXRpb25hbDxpc192b2lkPGVsZW1lbnRfdHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25hdCwgZWxlbWVudF90eXBlPjo6dHlwZSYgX19yKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfVlNURDo6YWRkcmVzc29mKF9fcik7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Gcm9tLCBjbGFzcyBfVG8+CitzdHJ1Y3QgX19yZWJpbmRfcG9pbnRlciB7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHR5cGVkZWYgdHlwZW5hbWUgcG9pbnRlcl90cmFpdHM8X0Zyb20+Ojp0ZW1wbGF0ZSByZWJpbmQ8X1RvPiAgICAgICAgdHlwZTsKKyNlbHNlCisgICAgdHlwZWRlZiB0eXBlbmFtZSBwb2ludGVyX3RyYWl0czxfRnJvbT46OnRlbXBsYXRlIHJlYmluZDxfVG8+OjpvdGhlciB0eXBlOworI2VuZGlmCit9OworCisvLyBhbGxvY2F0b3JfdHJhaXRzCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzID0gdm9pZD4KK3N0cnVjdCBfX2hhc19wb2ludGVyX3R5cGUgOiBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9faGFzX3BvaW50ZXJfdHlwZTxfVHAsCisgICAgICAgICAgdHlwZW5hbWUgX192b2lkX3Q8dHlwZW5hbWUgX1RwOjpwb2ludGVyPjo6dHlwZT4gOiB0cnVlX3R5cGUge307CisKK25hbWVzcGFjZSBfX3BvaW50ZXJfdHlwZV9pbXAKK3sKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0RwLCBib29sID0gX19oYXNfcG9pbnRlcl90eXBlPF9EcD46OnZhbHVlPgorc3RydWN0IF9fcG9pbnRlcl90eXBlCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRHA6OnBvaW50ZXIgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EcD4KK3N0cnVjdCBfX3BvaW50ZXJfdHlwZTxfVHAsIF9EcCwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfVHAqIHR5cGU7Cit9OworCit9ICAvLyBfX3BvaW50ZXJfdHlwZV9pbXAKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0RwPgorc3RydWN0IF9fcG9pbnRlcl90eXBlCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3BvaW50ZXJfdHlwZV9pbXA6Ol9fcG9pbnRlcl90eXBlPF9UcCwgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfRHA+Ojp0eXBlPjo6dHlwZSB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgPSB2b2lkPgorc3RydWN0IF9faGFzX2NvbnN0X3BvaW50ZXIgOiBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9faGFzX2NvbnN0X3BvaW50ZXI8X1RwLAorICAgICAgICAgICAgdHlwZW5hbWUgX192b2lkX3Q8dHlwZW5hbWUgX1RwOjpjb25zdF9wb2ludGVyPjo6dHlwZT4gOiB0cnVlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9QdHIsIGNsYXNzIF9BbGxvYywgYm9vbCA9IF9faGFzX2NvbnN0X3BvaW50ZXI8X0FsbG9jPjo6dmFsdWU+CitzdHJ1Y3QgX19jb25zdF9wb2ludGVyCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmNvbnN0X3BvaW50ZXIgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9QdHIsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX2NvbnN0X3BvaW50ZXI8X1RwLCBfUHRyLCBfQWxsb2MsIGZhbHNlPgoreworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHBvaW50ZXJfdHJhaXRzPF9QdHI+Ojp0ZW1wbGF0ZSByZWJpbmQ8Y29uc3QgX1RwPiB0eXBlOworI2Vsc2UKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHBvaW50ZXJfdHJhaXRzPF9QdHI+Ojp0ZW1wbGF0ZSByZWJpbmQ8Y29uc3QgX1RwPjo6b3RoZXIgdHlwZTsKKyNlbmRpZgorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgPSB2b2lkPgorc3RydWN0IF9faGFzX3ZvaWRfcG9pbnRlciA6IGZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19oYXNfdm9pZF9wb2ludGVyPF9UcCwKKyAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fdm9pZF90PHR5cGVuYW1lIF9UcDo6dm9pZF9wb2ludGVyPjo6dHlwZT4gOiB0cnVlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfUHRyLCBjbGFzcyBfQWxsb2MsIGJvb2wgPSBfX2hhc192b2lkX3BvaW50ZXI8X0FsbG9jPjo6dmFsdWU+CitzdHJ1Y3QgX192b2lkX3BvaW50ZXIKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dm9pZF9wb2ludGVyIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1B0ciwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9fdm9pZF9wb2ludGVyPF9QdHIsIF9BbGxvYywgZmFsc2U+Cit7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHR5cGVkZWYgdHlwZW5hbWUgcG9pbnRlcl90cmFpdHM8X1B0cj46OnRlbXBsYXRlIHJlYmluZDx2b2lkPiB0eXBlOworI2Vsc2UKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHBvaW50ZXJfdHJhaXRzPF9QdHI+Ojp0ZW1wbGF0ZSByZWJpbmQ8dm9pZD46Om90aGVyIHR5cGU7CisjZW5kaWYKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzID0gdm9pZD4KK3N0cnVjdCBfX2hhc19jb25zdF92b2lkX3BvaW50ZXIgOiBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9faGFzX2NvbnN0X3ZvaWRfcG9pbnRlcjxfVHAsCisgICAgICAgICAgICB0eXBlbmFtZSBfX3ZvaWRfdDx0eXBlbmFtZSBfVHA6OmNvbnN0X3ZvaWRfcG9pbnRlcj46OnR5cGU+IDogdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1B0ciwgY2xhc3MgX0FsbG9jLCBib29sID0gX19oYXNfY29uc3Rfdm9pZF9wb2ludGVyPF9BbGxvYz46OnZhbHVlPgorc3RydWN0IF9fY29uc3Rfdm9pZF9wb2ludGVyCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmNvbnN0X3ZvaWRfcG9pbnRlciB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9QdHIsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX2NvbnN0X3ZvaWRfcG9pbnRlcjxfUHRyLCBfQWxsb2MsIGZhbHNlPgoreworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHBvaW50ZXJfdHJhaXRzPF9QdHI+Ojp0ZW1wbGF0ZSByZWJpbmQ8Y29uc3Qgdm9pZD4gdHlwZTsKKyNlbHNlCisgICAgdHlwZWRlZiB0eXBlbmFtZSBwb2ludGVyX3RyYWl0czxfUHRyPjo6dGVtcGxhdGUgcmViaW5kPGNvbnN0IHZvaWQ+OjpvdGhlciB0eXBlOworI2VuZGlmCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIKK19UcCoKK19fdG9fcmF3X3BvaW50ZXIoX1RwKiBfX3ApIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX3A7Cit9CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPD0gMTcKK3RlbXBsYXRlIDxjbGFzcyBfUG9pbnRlcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBwb2ludGVyX3RyYWl0czxfUG9pbnRlcj46OmVsZW1lbnRfdHlwZSoKK19fdG9fcmF3X3BvaW50ZXIoX1BvaW50ZXIgX19wKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX1ZTVEQ6Ol9fdG9fcmF3X3BvaW50ZXIoX19wLm9wZXJhdG9yLT4oKSk7Cit9CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9Qb2ludGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2F1dG8KK19fdG9fcmF3X3BvaW50ZXIoY29uc3QgX1BvaW50ZXImIF9fcCkgX05PRVhDRVBUCistPiBkZWNsdHlwZShwb2ludGVyX3RyYWl0czxfUG9pbnRlcj46OnRvX2FkZHJlc3MoX19wKSkKK3sKKyAgICByZXR1cm4gcG9pbnRlcl90cmFpdHM8X1BvaW50ZXI+Ojp0b19hZGRyZXNzKF9fcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUG9pbnRlciwgY2xhc3MuLi4gX05vbmU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYXV0bworX190b19yYXdfcG9pbnRlcihjb25zdCBfUG9pbnRlciYgX19wLCBfTm9uZS4uLikgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fcC5vcGVyYXRvci0+KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RleHByCitfVHAqCit0b19hZGRyZXNzKF9UcCogX19wKSBfTk9FWENFUFQKK3sKKyAgICBzdGF0aWNfYXNzZXJ0KCFpc19mdW5jdGlvbl92PF9UcD4sICJfVHAgaXMgYSBmdW5jdGlvbiB0eXBlIik7CisgICAgcmV0dXJuIF9fcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Qb2ludGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2F1dG8KK3RvX2FkZHJlc3MoY29uc3QgX1BvaW50ZXImIF9fcCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fcCk7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgPSB2b2lkPgorc3RydWN0IF9faGFzX3NpemVfdHlwZSA6IGZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19oYXNfc2l6ZV90eXBlPF9UcCwKKyAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fdm9pZF90PHR5cGVuYW1lIF9UcDo6c2l6ZV90eXBlPjo6dHlwZT4gOiB0cnVlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2MsIGNsYXNzIF9EaWZmVHlwZSwgYm9vbCA9IF9faGFzX3NpemVfdHlwZTxfQWxsb2M+Ojp2YWx1ZT4KK3N0cnVjdCBfX3NpemVfdHlwZQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgbWFrZV91bnNpZ25lZDxfRGlmZlR5cGU+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jLCBjbGFzcyBfRGlmZlR5cGU+CitzdHJ1Y3QgX19zaXplX3R5cGU8X0FsbG9jLCBfRGlmZlR5cGUsIHRydWU+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgPSB2b2lkPgorc3RydWN0IF9faGFzX3Byb3BhZ2F0ZV9vbl9jb250YWluZXJfY29weV9hc3NpZ25tZW50IDogZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2hhc19wcm9wYWdhdGVfb25fY29udGFpbmVyX2NvcHlfYXNzaWdubWVudDxfVHAsCisgICAgdHlwZW5hbWUgX192b2lkX3Q8dHlwZW5hbWUgX1RwOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX2NvcHlfYXNzaWdubWVudD46OnR5cGU+CisgICAgICAgIDogdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jLCBib29sID0gX19oYXNfcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9jb3B5X2Fzc2lnbm1lbnQ8X0FsbG9jPjo6dmFsdWU+CitzdHJ1Y3QgX19wcm9wYWdhdGVfb25fY29udGFpbmVyX2NvcHlfYXNzaWdubWVudAoreworICAgIHR5cGVkZWYgZmFsc2VfdHlwZSB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX3Byb3BhZ2F0ZV9vbl9jb250YWluZXJfY29weV9hc3NpZ25tZW50PF9BbGxvYywgdHJ1ZT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9jb3B5X2Fzc2lnbm1lbnQgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzID0gdm9pZD4KK3N0cnVjdCBfX2hhc19wcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudCA6IGZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19oYXNfcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ8X1RwLAorICAgICAgICAgICB0eXBlbmFtZSBfX3ZvaWRfdDx0eXBlbmFtZSBfVHA6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Pjo6dHlwZT4KKyAgICAgICAgICAgICAgIDogdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jLCBib29sID0gX19oYXNfcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ8X0FsbG9jPjo6dmFsdWU+CitzdHJ1Y3QgX19wcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudAoreworICAgIHR5cGVkZWYgZmFsc2VfdHlwZSB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX3Byb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50PF9BbGxvYywgdHJ1ZT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzID0gdm9pZD4KK3N0cnVjdCBfX2hhc19wcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXAgOiBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9faGFzX3Byb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDxfVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9fdm9pZF90PHR5cGVuYW1lIF9UcDo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwPjo6dHlwZT4KKyAgICAgICAgICAgICAgIDogdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jLCBib29sID0gX19oYXNfcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwPF9BbGxvYz46OnZhbHVlPgorc3RydWN0IF9fcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwCit7CisgICAgdHlwZWRlZiBmYWxzZV90eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgorc3RydWN0IF9fcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwPF9BbGxvYywgdHJ1ZT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyA9IHZvaWQ+CitzdHJ1Y3QgX19oYXNfaXNfYWx3YXlzX2VxdWFsIDogZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2hhc19pc19hbHdheXNfZXF1YWw8X1RwLAorICAgICAgICAgICB0eXBlbmFtZSBfX3ZvaWRfdDx0eXBlbmFtZSBfVHA6OmlzX2Fsd2F5c19lcXVhbD46OnR5cGU+CisgICAgICAgICAgICAgICA6IHRydWVfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYywgYm9vbCA9IF9faGFzX2lzX2Fsd2F5c19lcXVhbDxfQWxsb2M+Ojp2YWx1ZT4KK3N0cnVjdCBfX2lzX2Fsd2F5c19lcXVhbAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1ZTVEQ6OmlzX2VtcHR5PF9BbGxvYz46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19pc19hbHdheXNfZXF1YWw8X0FsbG9jLCB0cnVlPgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjppc19hbHdheXNfZXF1YWwgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcCwgYm9vbCA9IF9faGFzX3JlYmluZDxfVHAsIF9VcD46OnZhbHVlPgorc3RydWN0IF9faGFzX3JlYmluZF9vdGhlcgoreworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgX190d28ge2NoYXIgX19seDsgY2hhciBfX2x4eDt9OworICAgIHRlbXBsYXRlIDxjbGFzcyBfWHA+IHN0YXRpYyBfX3R3byBfX3Rlc3QoLi4uKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1hwPiBzdGF0aWMgY2hhciBfX3Rlc3QodHlwZW5hbWUgX1hwOjp0ZW1wbGF0ZSByZWJpbmQ8X1VwPjo6b3RoZXIqID0gMCk7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBzaXplb2YoX190ZXN0PF9UcD4oMCkpID09IDE7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitzdHJ1Y3QgX19oYXNfcmViaW5kX290aGVyPF9UcCwgX1VwLCBmYWxzZT4KK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwLCBib29sID0gX19oYXNfcmViaW5kX290aGVyPF9UcCwgX1VwPjo6dmFsdWU+CitzdHJ1Y3QgX19hbGxvY2F0b3JfdHJhaXRzX3JlYmluZAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwOjp0ZW1wbGF0ZSByZWJpbmQ8X1VwPjo6b3RoZXIgdHlwZTsKK307CisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCisKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLi4uPiBjbGFzcyBfQWxsb2MsIGNsYXNzIF9UcCwgY2xhc3MgLi4uX0FyZ3MsIGNsYXNzIF9VcD4KK3N0cnVjdCBfX2FsbG9jYXRvcl90cmFpdHNfcmViaW5kPF9BbGxvYzxfVHAsIF9BcmdzLi4uPiwgX1VwLCB0cnVlPgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jPF9UcCwgX0FyZ3MuLi4+Ojp0ZW1wbGF0ZSByZWJpbmQ8X1VwPjo6b3RoZXIgdHlwZTsKK307CisKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLi4uPiBjbGFzcyBfQWxsb2MsIGNsYXNzIF9UcCwgY2xhc3MgLi4uX0FyZ3MsIGNsYXNzIF9VcD4KK3N0cnVjdCBfX2FsbG9jYXRvcl90cmFpdHNfcmViaW5kPF9BbGxvYzxfVHAsIF9BcmdzLi4uPiwgX1VwLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9BbGxvYzxfVXAsIF9BcmdzLi4uPiB0eXBlOworfTsKKworI2Vsc2UgIC8vIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBfQWxsb2MsIGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorc3RydWN0IF9fYWxsb2NhdG9yX3RyYWl0c19yZWJpbmQ8X0FsbG9jPF9UcD4sIF9VcCwgdHJ1ZT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzxfVHA+Ojp0ZW1wbGF0ZSByZWJpbmQ8X1VwPjo6b3RoZXIgdHlwZTsKK307CisKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIF9BbGxvYywgY2xhc3MgX1RwLCBjbGFzcyBfVXA+CitzdHJ1Y3QgX19hbGxvY2F0b3JfdHJhaXRzX3JlYmluZDxfQWxsb2M8X1RwPiwgX1VwLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9BbGxvYzxfVXA+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLCBjbGFzcz4gY2xhc3MgX0FsbG9jLCBjbGFzcyBfVHAsIGNsYXNzIF9BMCwgY2xhc3MgX1VwPgorc3RydWN0IF9fYWxsb2NhdG9yX3RyYWl0c19yZWJpbmQ8X0FsbG9jPF9UcCwgX0EwPiwgX1VwLCB0cnVlPgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jPF9UcCwgX0EwPjo6dGVtcGxhdGUgcmViaW5kPF9VcD46Om90aGVyIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLCBjbGFzcz4gY2xhc3MgX0FsbG9jLCBjbGFzcyBfVHAsIGNsYXNzIF9BMCwgY2xhc3MgX1VwPgorc3RydWN0IF9fYWxsb2NhdG9yX3RyYWl0c19yZWJpbmQ8X0FsbG9jPF9UcCwgX0EwPiwgX1VwLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9BbGxvYzxfVXAsIF9BMD4gdHlwZTsKK307CisKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcz4gY2xhc3MgX0FsbG9jLCBjbGFzcyBfVHAsIGNsYXNzIF9BMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgX0ExLCBjbGFzcyBfVXA+CitzdHJ1Y3QgX19hbGxvY2F0b3JfdHJhaXRzX3JlYmluZDxfQWxsb2M8X1RwLCBfQTAsIF9BMT4sIF9VcCwgdHJ1ZT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzxfVHAsIF9BMCwgX0ExPjo6dGVtcGxhdGUgcmViaW5kPF9VcD46Om90aGVyIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLCBjbGFzcywgY2xhc3M+IGNsYXNzIF9BbGxvYywgY2xhc3MgX1RwLCBjbGFzcyBfQTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIF9BMSwgY2xhc3MgX1VwPgorc3RydWN0IF9fYWxsb2NhdG9yX3RyYWl0c19yZWJpbmQ8X0FsbG9jPF9UcCwgX0EwLCBfQTE+LCBfVXAsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0FsbG9jPF9VcCwgX0EwLCBfQTE+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzPiBjbGFzcyBfQWxsb2MsIGNsYXNzIF9UcCwgY2xhc3MgX0EwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgX0ExLCBjbGFzcyBfQTIsIGNsYXNzIF9VcD4KK3N0cnVjdCBfX2FsbG9jYXRvcl90cmFpdHNfcmViaW5kPF9BbGxvYzxfVHAsIF9BMCwgX0ExLCBfQTI+LCBfVXAsIHRydWU+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M8X1RwLCBfQTAsIF9BMSwgX0EyPjo6dGVtcGxhdGUgcmViaW5kPF9VcD46Om90aGVyIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzPiBjbGFzcyBfQWxsb2MsIGNsYXNzIF9UcCwgY2xhc3MgX0EwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgX0ExLCBjbGFzcyBfQTIsIGNsYXNzIF9VcD4KK3N0cnVjdCBfX2FsbG9jYXRvcl90cmFpdHNfcmViaW5kPF9BbGxvYzxfVHAsIF9BMCwgX0ExLCBfQTI+LCBfVXAsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0FsbG9jPF9VcCwgX0EwLCBfQTEsIF9BMj4gdHlwZTsKK307CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2MsIGNsYXNzIF9TaXplVHlwZSwgY2xhc3MgX0NvbnN0Vm9pZFB0cj4KK2F1dG8KK19faGFzX2FsbG9jYXRlX2hpbnRfdGVzdChfQWxsb2MmJiBfX2EsIF9TaXplVHlwZSYmIF9fc3osIF9Db25zdFZvaWRQdHImJiBfX3ApCisgICAgLT4gZGVjbHR5cGUoKHZvaWQpX19hLmFsbG9jYXRlKF9fc3osIF9fcCksIHRydWVfdHlwZSgpKTsKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYywgY2xhc3MgX1NpemVUeXBlLCBjbGFzcyBfQ29uc3RWb2lkUHRyPgorYXV0bworX19oYXNfYWxsb2NhdGVfaGludF90ZXN0KGNvbnN0IF9BbGxvYyYgX19hLCBfU2l6ZVR5cGUmJiBfX3N6LCBfQ29uc3RWb2lkUHRyJiYgX19wKQorICAgIC0+IGZhbHNlX3R5cGU7CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2MsIGNsYXNzIF9TaXplVHlwZSwgY2xhc3MgX0NvbnN0Vm9pZFB0cj4KK3N0cnVjdCBfX2hhc19hbGxvY2F0ZV9oaW50CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICBpc19zYW1lPAorICAgICAgICAgICAgZGVjbHR5cGUoX1ZTVEQ6Ol9faGFzX2FsbG9jYXRlX2hpbnRfdGVzdChkZWNsdmFsPF9BbGxvYz4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2x2YWw8X1NpemVUeXBlPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbHZhbDxfQ29uc3RWb2lkUHRyPigpKSksCisgICAgICAgICAgICB0cnVlX3R5cGU+Ojp2YWx1ZT4KK3sKK307CisKKyNlbHNlICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYywgY2xhc3MgX1NpemVUeXBlLCBjbGFzcyBfQ29uc3RWb2lkUHRyPgorc3RydWN0IF9faGFzX2FsbG9jYXRlX2hpbnQKKyAgICA6IHRydWVfdHlwZQoreworfTsKKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworI2lmICFkZWZpbmVkKF9MSUJDUFBfQ1hYMDNfTEFORykKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYywgY2xhc3MgX1RwLCBjbGFzcyAuLi5fQXJncz4KK2RlY2x0eXBlKF9WU1REOjpkZWNsdmFsPF9BbGxvYz4oKS5jb25zdHJ1Y3QoX1ZTVEQ6OmRlY2x2YWw8X1RwKj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6ZGVjbHZhbDxfQXJncz4oKS4uLiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZV90eXBlKCkpCitfX2hhc19jb25zdHJ1Y3RfdGVzdChfQWxsb2MmJiBfX2EsIF9UcCogX19wLCBfQXJncyYmIC4uLl9fYXJncyk7CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2MsIGNsYXNzIF9Qb2ludGVyLCBjbGFzcyAuLi5fQXJncz4KK2ZhbHNlX3R5cGUKK19faGFzX2NvbnN0cnVjdF90ZXN0KGNvbnN0IF9BbGxvYyYgX19hLCBfUG9pbnRlciYmIF9fcCwgX0FyZ3MmJiAuLi5fX2FyZ3MpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jLCBjbGFzcyBfUG9pbnRlciwgY2xhc3MgLi4uX0FyZ3M+CitzdHJ1Y3QgX19oYXNfY29uc3RydWN0CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICBpc19zYW1lPAorICAgICAgICAgICAgZGVjbHR5cGUoX1ZTVEQ6Ol9faGFzX2NvbnN0cnVjdF90ZXN0KGRlY2x2YWw8X0FsbG9jPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbHZhbDxfUG9pbnRlcj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2x2YWw8X0FyZ3M+KCkuLi4pKSwKKyAgICAgICAgICAgIHRydWVfdHlwZT46OnZhbHVlPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYywgY2xhc3MgX1BvaW50ZXI+CithdXRvCitfX2hhc19kZXN0cm95X3Rlc3QoX0FsbG9jJiYgX19hLCBfUG9pbnRlciYmIF9fcCkKKyAgICAtPiBkZWNsdHlwZShfX2EuZGVzdHJveShfX3ApLCB0cnVlX3R5cGUoKSk7CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2MsIGNsYXNzIF9Qb2ludGVyPgorYXV0bworX19oYXNfZGVzdHJveV90ZXN0KGNvbnN0IF9BbGxvYyYgX19hLCBfUG9pbnRlciYmIF9fcCkKKyAgICAtPiBmYWxzZV90eXBlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jLCBjbGFzcyBfUG9pbnRlcj4KK3N0cnVjdCBfX2hhc19kZXN0cm95CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICBpc19zYW1lPAorICAgICAgICAgICAgZGVjbHR5cGUoX1ZTVEQ6Ol9faGFzX2Rlc3Ryb3lfdGVzdChkZWNsdmFsPF9BbGxvYz4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsdmFsPF9Qb2ludGVyPigpKSksCisgICAgICAgICAgICB0cnVlX3R5cGU+Ojp2YWx1ZT4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CithdXRvCitfX2hhc19tYXhfc2l6ZV90ZXN0KF9BbGxvYyYmIF9fYSkKKyAgICAtPiBkZWNsdHlwZShfX2EubWF4X3NpemUoKSwgdHJ1ZV90eXBlKCkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgorYXV0bworX19oYXNfbWF4X3NpemVfdGVzdChjb25zdCB2b2xhdGlsZSBfQWxsb2MmIF9fYSkKKyAgICAtPiBmYWxzZV90eXBlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgorc3RydWN0IF9faGFzX21heF9zaXplCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICBpc19zYW1lPAorICAgICAgICAgICAgZGVjbHR5cGUoX1ZTVEQ6Ol9faGFzX21heF9zaXplX3Rlc3QoZGVjbHZhbDxfQWxsb2MmPigpKSksCisgICAgICAgICAgICB0cnVlX3R5cGU+Ojp2YWx1ZT4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CithdXRvCitfX2hhc19zZWxlY3Rfb25fY29udGFpbmVyX2NvcHlfY29uc3RydWN0aW9uX3Rlc3QoX0FsbG9jJiYgX19hKQorICAgIC0+IGRlY2x0eXBlKF9fYS5zZWxlY3Rfb25fY29udGFpbmVyX2NvcHlfY29uc3RydWN0aW9uKCksIHRydWVfdHlwZSgpKTsKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK2F1dG8KK19faGFzX3NlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb25fdGVzdChjb25zdCB2b2xhdGlsZSBfQWxsb2MmIF9fYSkKKyAgICAtPiBmYWxzZV90eXBlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgorc3RydWN0IF9faGFzX3NlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb24KKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsCisgICAgICAgIGlzX3NhbWU8CisgICAgICAgICAgICBkZWNsdHlwZShfVlNURDo6X19oYXNfc2VsZWN0X29uX2NvbnRhaW5lcl9jb3B5X2NvbnN0cnVjdGlvbl90ZXN0KGRlY2x2YWw8X0FsbG9jJj4oKSkpLAorICAgICAgICAgICAgdHJ1ZV90eXBlPjo6dmFsdWU+Cit7Cit9OworCisjZWxzZSAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2MsIGNsYXNzIF9Qb2ludGVyLCBjbGFzcyAuLi5fQXJncz4KK3N0cnVjdCBfX2hhc19jb25zdHJ1Y3QKKyAgICA6IGZhbHNlX3R5cGUKK3sKK307CisKKyNlbHNlICAvLyBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYywgY2xhc3MgX1BvaW50ZXIsIGNsYXNzIF9BcmdzPgorc3RydWN0IF9faGFzX2NvbnN0cnVjdAorICAgIDogZmFsc2VfdHlwZQoreworfTsKKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYywgY2xhc3MgX1BvaW50ZXI+CitzdHJ1Y3QgX19oYXNfZGVzdHJveQorICAgIDogZmFsc2VfdHlwZQoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX2hhc19tYXhfc2l6ZQorICAgIDogdHJ1ZV90eXBlCit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgorc3RydWN0IF9faGFzX3NlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb24KKyAgICA6IGZhbHNlX3R5cGUKK3sKK307CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2MsIGNsYXNzIF9QdHIsIGJvb2wgPSBfX2hhc19kaWZmZXJlbmNlX3R5cGU8X0FsbG9jPjo6dmFsdWU+CitzdHJ1Y3QgX19hbGxvY190cmFpdHNfZGlmZmVyZW5jZV90eXBlCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBwb2ludGVyX3RyYWl0czxfUHRyPjo6ZGlmZmVyZW5jZV90eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jLCBjbGFzcyBfUHRyPgorc3RydWN0IF9fYWxsb2NfdHJhaXRzX2RpZmZlcmVuY2VfdHlwZTxfQWxsb2MsIF9QdHIsIHRydWU+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBhbGxvY2F0b3JfdHJhaXRzCit7CisgICAgdHlwZWRlZiBfQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcG9pbnRlcl90eXBlPHZhbHVlX3R5cGUsIGFsbG9jYXRvcl90eXBlPjo6dHlwZSBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19jb25zdF9wb2ludGVyPHZhbHVlX3R5cGUsIHBvaW50ZXIsIGFsbG9jYXRvcl90eXBlPjo6dHlwZSBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX192b2lkX3BvaW50ZXI8cG9pbnRlciwgYWxsb2NhdG9yX3R5cGU+Ojp0eXBlIHZvaWRfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fY29uc3Rfdm9pZF9wb2ludGVyPHBvaW50ZXIsIGFsbG9jYXRvcl90eXBlPjo6dHlwZSBjb25zdF92b2lkX3BvaW50ZXI7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzX2RpZmZlcmVuY2VfdHlwZTxhbGxvY2F0b3JfdHlwZSwgcG9pbnRlcj46OnR5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19zaXplX3R5cGU8YWxsb2NhdG9yX3R5cGUsIGRpZmZlcmVuY2VfdHlwZT46OnR5cGUgc2l6ZV90eXBlOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3Byb3BhZ2F0ZV9vbl9jb250YWluZXJfY29weV9hc3NpZ25tZW50PGFsbG9jYXRvcl90eXBlPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9jb3B5X2Fzc2lnbm1lbnQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3Byb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50PGFsbG9jYXRvcl90eXBlPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3Byb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDxhbGxvY2F0b3JfdHlwZT46OnR5cGUKKyAgICAgICAgICAgICAgICAgICAgIHByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXNfYWx3YXlzX2VxdWFsPGFsbG9jYXRvcl90eXBlPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgaXNfYWx3YXlzX2VxdWFsOworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+IHVzaW5nIHJlYmluZF9hbGxvYyA9CisgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX2FsbG9jYXRvcl90cmFpdHNfcmViaW5kPGFsbG9jYXRvcl90eXBlLCBfVHA+Ojp0eXBlOworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+IHVzaW5nIHJlYmluZF90cmFpdHMgPSBhbGxvY2F0b3JfdHJhaXRzPHJlYmluZF9hbGxvYzxfVHA+PjsKKyNlbHNlICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgcmViaW5kX2FsbG9jCisgICAgICAgIHt0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NhdG9yX3RyYWl0c19yZWJpbmQ8YWxsb2NhdG9yX3R5cGUsIF9UcD46OnR5cGUgb3RoZXI7fTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgcmViaW5kX3RyYWl0cworICAgICAgICB7dHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPHR5cGVuYW1lIHJlYmluZF9hbGxvYzxfVHA+OjpvdGhlcj4gb3RoZXI7fTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICBfTElCQ1BQX05PRElTQ0FSRF9BRlRFUl9DWFgxNyBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGljIHBvaW50ZXIgYWxsb2NhdGUoYWxsb2NhdG9yX3R5cGUmIF9fYSwgc2l6ZV90eXBlIF9fbikKKyAgICAgICAge3JldHVybiBfX2EuYWxsb2NhdGUoX19uKTt9CisgICAgX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBwb2ludGVyIGFsbG9jYXRlKGFsbG9jYXRvcl90eXBlJiBfX2EsIHNpemVfdHlwZSBfX24sIGNvbnN0X3ZvaWRfcG9pbnRlciBfX2hpbnQpCisgICAgICAgIHtyZXR1cm4gX19hbGxvY2F0ZShfX2EsIF9fbiwgX19oaW50LAorICAgICAgICAgICAgX19oYXNfYWxsb2NhdGVfaGludDxhbGxvY2F0b3JfdHlwZSwgc2l6ZV90eXBlLCBjb25zdF92b2lkX3BvaW50ZXI+KCkpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgdm9pZCBkZWFsbG9jYXRlKGFsbG9jYXRvcl90eXBlJiBfX2EsIHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKSBfTk9FWENFUFQKKyAgICAgICAge19fYS5kZWFsbG9jYXRlKF9fcCwgX19uKTt9CisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MuLi4gX0FyZ3M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgc3RhdGljIHZvaWQgY29uc3RydWN0KGFsbG9jYXRvcl90eXBlJiBfX2EsIF9UcCogX19wLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgICAgICAgIHtfX2NvbnN0cnVjdChfX2hhc19jb25zdHJ1Y3Q8YWxsb2NhdG9yX3R5cGUsIF9UcCosIF9BcmdzLi4uPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fYSwgX19wLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7fQorI2Vsc2UgIC8vIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgc3RhdGljIHZvaWQgY29uc3RydWN0KGFsbG9jYXRvcl90eXBlJiwgX1RwKiBfX3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgOjpuZXcgKCh2b2lkKilfX3ApIF9UcCgpOworICAgICAgICAgICAgfQorICAgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BMD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoYWxsb2NhdG9yX3R5cGUmLCBfVHAqIF9fcCwgY29uc3QgX0EwJiBfX2EwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDo6bmV3ICgodm9pZCopX19wKSBfVHAoX19hMCk7CisgICAgICAgICAgICB9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0EwLCBjbGFzcyBfQTE+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgc3RhdGljIHZvaWQgY29uc3RydWN0KGFsbG9jYXRvcl90eXBlJiwgX1RwKiBfX3AsIGNvbnN0IF9BMCYgX19hMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9BMSYgX19hMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA6Om5ldyAoKHZvaWQqKV9fcCkgX1RwKF9fYTAsIF9fYTEpOworICAgICAgICAgICAgfQorICAgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExLCBjbGFzcyBfQTI+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgc3RhdGljIHZvaWQgY29uc3RydWN0KGFsbG9jYXRvcl90eXBlJiwgX1RwKiBfX3AsIGNvbnN0IF9BMCYgX19hMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9BMSYgX19hMSwgY29uc3QgX0EyJiBfX2EyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDo6bmV3ICgodm9pZCopX19wKSBfVHAoX19hMCwgX19hMSwgX19hMik7CisgICAgICAgICAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBzdGF0aWMgdm9pZCBkZXN0cm95KGFsbG9jYXRvcl90eXBlJiBfX2EsIF9UcCogX19wKQorICAgICAgICAgICAge19fZGVzdHJveShfX2hhc19kZXN0cm95PGFsbG9jYXRvcl90eXBlLCBfVHAqPigpLCBfX2EsIF9fcCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBzaXplX3R5cGUgbWF4X3NpemUoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19tYXhfc2l6ZShfX2hhc19tYXhfc2l6ZTxjb25zdCBhbGxvY2F0b3JfdHlwZT4oKSwgX19hKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGljIGFsbG9jYXRvcl90eXBlCisgICAgICAgIHNlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb24oY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgICAgICAgIHtyZXR1cm4gX19zZWxlY3Rfb25fY29udGFpbmVyX2NvcHlfY29uc3RydWN0aW9uKAorICAgICAgICAgICAgICAgIF9faGFzX3NlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb248Y29uc3QgYWxsb2NhdG9yX3R5cGU+KCksCisgICAgICAgICAgICAgICAgX19hKTt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1B0cj4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBzdGF0aWMKKyAgICAgICAgdm9pZAorICAgICAgICBfX2NvbnN0cnVjdF9mb3J3YXJkKGFsbG9jYXRvcl90eXBlJiBfX2EsIF9QdHIgX19iZWdpbjEsIF9QdHIgX19lbmQxLCBfUHRyJiBfX2JlZ2luMikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICg7IF9fYmVnaW4xICE9IF9fZW5kMTsgKytfX2JlZ2luMSwgKytfX2JlZ2luMikKKyAgICAgICAgICAgICAgICBjb25zdHJ1Y3QoX19hLCBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX2JlZ2luMiksIF9WU1REOjptb3ZlX2lmX25vZXhjZXB0KCpfX2JlZ2luMSkpOworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHN0YXRpYworICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgKGlzX3NhbWU8YWxsb2NhdG9yX3R5cGUsIGFsbG9jYXRvcjxfVHA+ID46OnZhbHVlCisgICAgICAgICAgICAgICAgfHwgIV9faGFzX2NvbnN0cnVjdDxhbGxvY2F0b3JfdHlwZSwgX1RwKiwgX1RwPjo6dmFsdWUpICYmCisgICAgICAgICAgICAgaXNfdHJpdmlhbGx5X21vdmVfY29uc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZSwKKyAgICAgICAgICAgIHZvaWQKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBfX2NvbnN0cnVjdF9mb3J3YXJkKGFsbG9jYXRvcl90eXBlJiwgX1RwKiBfX2JlZ2luMSwgX1RwKiBfX2VuZDEsIF9UcComIF9fYmVnaW4yKQorICAgICAgICB7CisgICAgICAgICAgICBwdHJkaWZmX3QgX05wID0gX19lbmQxIC0gX19iZWdpbjE7CisgICAgICAgICAgICBpZiAoX05wID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfVlNURDo6bWVtY3B5KF9fYmVnaW4yLCBfX2JlZ2luMSwgX05wICogc2l6ZW9mKF9UcCkpOworICAgICAgICAgICAgICAgIF9fYmVnaW4yICs9IF9OcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JdGVyLCBjbGFzcyBfUHRyPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHN0YXRpYworICAgICAgICB2b2lkCisgICAgICAgIF9fY29uc3RydWN0X3JhbmdlX2ZvcndhcmQoYWxsb2NhdG9yX3R5cGUmIF9fYSwgX0l0ZXIgX19iZWdpbjEsIF9JdGVyIF9fZW5kMSwgX1B0ciYgX19iZWdpbjIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoOyBfX2JlZ2luMSAhPSBfX2VuZDE7ICsrX19iZWdpbjEsICh2b2lkKSArK19fYmVnaW4yKQorICAgICAgICAgICAgICAgIGNvbnN0cnVjdChfX2EsIF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fYmVnaW4yKSwgKl9fYmVnaW4xKTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBzdGF0aWMKKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIChpc19zYW1lPGFsbG9jYXRvcl90eXBlLCBhbGxvY2F0b3I8X1RwPiA+Ojp2YWx1ZQorICAgICAgICAgICAgICAgIHx8ICFfX2hhc19jb25zdHJ1Y3Q8YWxsb2NhdG9yX3R5cGUsIF9UcCosIF9UcD46OnZhbHVlKSAmJgorICAgICAgICAgICAgIGlzX3RyaXZpYWxseV9tb3ZlX2NvbnN0cnVjdGlibGU8X1RwPjo6dmFsdWUsCisgICAgICAgICAgICB2b2lkCisgICAgICAgID46OnR5cGUKKyAgICAgICAgX19jb25zdHJ1Y3RfcmFuZ2VfZm9yd2FyZChhbGxvY2F0b3JfdHlwZSYsIF9UcCogX19iZWdpbjEsIF9UcCogX19lbmQxLCBfVHAqJiBfX2JlZ2luMikKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY29uc3Q8X1RwPjo6dHlwZSBfVnA7CisgICAgICAgICAgICBwdHJkaWZmX3QgX05wID0gX19lbmQxIC0gX19iZWdpbjE7CisgICAgICAgICAgICBpZiAoX05wID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfVlNURDo6bWVtY3B5KGNvbnN0X2Nhc3Q8X1ZwKj4oX19iZWdpbjIpLCBfX2JlZ2luMSwgX05wICogc2l6ZW9mKF9UcCkpOworICAgICAgICAgICAgICAgIF9fYmVnaW4yICs9IF9OcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9QdHI+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgc3RhdGljCisgICAgICAgIHZvaWQKKyAgICAgICAgX19jb25zdHJ1Y3RfYmFja3dhcmQoYWxsb2NhdG9yX3R5cGUmIF9fYSwgX1B0ciBfX2JlZ2luMSwgX1B0ciBfX2VuZDEsIF9QdHImIF9fZW5kMikKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKF9fZW5kMSAhPSBfX2JlZ2luMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdHJ1Y3QoX19hLCBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX2VuZDItMSksIF9WU1REOjptb3ZlX2lmX25vZXhjZXB0KCotLV9fZW5kMSkpOworICAgICAgICAgICAgICAgIC0tX19lbmQyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHN0YXRpYworICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgKGlzX3NhbWU8YWxsb2NhdG9yX3R5cGUsIGFsbG9jYXRvcjxfVHA+ID46OnZhbHVlCisgICAgICAgICAgICAgICAgfHwgIV9faGFzX2NvbnN0cnVjdDxhbGxvY2F0b3JfdHlwZSwgX1RwKiwgX1RwPjo6dmFsdWUpICYmCisgICAgICAgICAgICAgaXNfdHJpdmlhbGx5X21vdmVfY29uc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZSwKKyAgICAgICAgICAgIHZvaWQKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBfX2NvbnN0cnVjdF9iYWNrd2FyZChhbGxvY2F0b3JfdHlwZSYsIF9UcCogX19iZWdpbjEsIF9UcCogX19lbmQxLCBfVHAqJiBfX2VuZDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB0cmRpZmZfdCBfTnAgPSBfX2VuZDEgLSBfX2JlZ2luMTsKKyAgICAgICAgICAgIF9fZW5kMiAtPSBfTnA7CisgICAgICAgICAgICBpZiAoX05wID4gMCkKKyAgICAgICAgICAgICAgICBfVlNURDo6bWVtY3B5KF9fZW5kMiwgX19iZWdpbjEsIF9OcCAqIHNpemVvZihfVHApKTsKKyAgICAgICAgfQorCitwcml2YXRlOgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBwb2ludGVyIF9fYWxsb2NhdGUoYWxsb2NhdG9yX3R5cGUmIF9fYSwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgY29uc3Rfdm9pZF9wb2ludGVyIF9faGludCwgdHJ1ZV90eXBlKQorICAgICAgICB7cmV0dXJuIF9fYS5hbGxvY2F0ZShfX24sIF9faGludCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgcG9pbnRlciBfX2FsbG9jYXRlKGFsbG9jYXRvcl90eXBlJiBfX2EsIHNpemVfdHlwZSBfX24sCisgICAgICAgIGNvbnN0X3ZvaWRfcG9pbnRlciwgZmFsc2VfdHlwZSkKKyAgICAgICAge3JldHVybiBfX2EuYWxsb2NhdGUoX19uKTt9CisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MuLi4gX0FyZ3M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgc3RhdGljIHZvaWQgX19jb25zdHJ1Y3QodHJ1ZV90eXBlLCBhbGxvY2F0b3JfdHlwZSYgX19hLCBfVHAqIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgICAgICB7X19hLmNvbnN0cnVjdChfX3AsIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MuLi4gX0FyZ3M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgc3RhdGljIHZvaWQgX19jb25zdHJ1Y3QoZmFsc2VfdHlwZSwgYWxsb2NhdG9yX3R5cGUmLCBfVHAqIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgOjpuZXcgKCh2b2lkKilfX3ApIF9UcChfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICAgICAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBzdGF0aWMgdm9pZCBfX2Rlc3Ryb3kodHJ1ZV90eXBlLCBhbGxvY2F0b3JfdHlwZSYgX19hLCBfVHAqIF9fcCkKKyAgICAgICAgICAgIHtfX2EuZGVzdHJveShfX3ApO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHN0YXRpYyB2b2lkIF9fZGVzdHJveShmYWxzZV90eXBlLCBhbGxvY2F0b3JfdHlwZSYsIF9UcCogX19wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fcC0+fl9UcCgpOworICAgICAgICAgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBzaXplX3R5cGUgX19tYXhfc2l6ZSh0cnVlX3R5cGUsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpIF9OT0VYQ0VQVAorICAgICAgICAgICAge3JldHVybiBfX2EubWF4X3NpemUoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBzaXplX3R5cGUgX19tYXhfc2l6ZShmYWxzZV90eXBlLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYpIF9OT0VYQ0VQVAorICAgICAgICAgICAge3JldHVybiBudW1lcmljX2xpbWl0czxzaXplX3R5cGU+OjptYXgoKSAvIHNpemVvZih2YWx1ZV90eXBlKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGljIGFsbG9jYXRvcl90eXBlCisgICAgICAgIF9fc2VsZWN0X29uX2NvbnRhaW5lcl9jb3B5X2NvbnN0cnVjdGlvbih0cnVlX3R5cGUsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICAgICAgICB7cmV0dXJuIF9fYS5zZWxlY3Rfb25fY29udGFpbmVyX2NvcHlfY29uc3RydWN0aW9uKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgYWxsb2NhdG9yX3R5cGUKKyAgICAgICAgX19zZWxlY3Rfb25fY29udGFpbmVyX2NvcHlfY29uc3RydWN0aW9uKGZhbHNlX3R5cGUsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICAgICAgICB7cmV0dXJuIF9fYTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cywgY2xhc3MgX1RwPgorc3RydWN0IF9fcmViaW5kX2FsbG9jX2hlbHBlcgoreworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnRlbXBsYXRlIHJlYmluZF9hbGxvYzxfVHA+ICAgICAgICB0eXBlOworI2Vsc2UKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnRlbXBsYXRlIHJlYmluZF9hbGxvYzxfVHA+OjpvdGhlciB0eXBlOworI2VuZGlmCit9OworCisvLyBhbGxvY2F0b3IKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGFsbG9jYXRvcgoreworcHVibGljOgorICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgX1RwKiAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIGNvbnN0IF9UcCogICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiBfVHAmICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBjb25zdCBfVHAmICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworCisgICAgdHlwZWRlZiB0cnVlX3R5cGUgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ7CisgICAgdHlwZWRlZiB0cnVlX3R5cGUgaXNfYWx3YXlzX2VxdWFsOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4gc3RydWN0IHJlYmluZCB7dHlwZWRlZiBhbGxvY2F0b3I8X1VwPiBvdGhlcjt9OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworICAgIGFsbG9jYXRvcigpIF9OT0VYQ0VQVCB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4gCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNworICAgIGFsbG9jYXRvcihjb25zdCBhbGxvY2F0b3I8X1VwPiYpIF9OT0VYQ0VQVCB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBwb2ludGVyIGFkZHJlc3MocmVmZXJlbmNlIF9feCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX1ZTVEQ6OmFkZHJlc3NvZihfX3gpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfVlNURDo6YWRkcmVzc29mKF9feCk7fQorICAgIF9MSUJDUFBfTk9ESVNDQVJEX0FGVEVSX0NYWDE3IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgCisgICAgcG9pbnRlciBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBhbGxvY2F0b3I8dm9pZD46OmNvbnN0X3BvaW50ZXIgPSAwKQorICAgICAgICB7CisgICAgICAgIGlmIChfX24gPiBtYXhfc2l6ZSgpKQorICAgICAgICAgICAgX190aHJvd19sZW5ndGhfZXJyb3IoImFsbG9jYXRvcjxUPjo6YWxsb2NhdGUoc2l6ZV90IG4pIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnbicgZXhjZWVkcyBtYXhpbXVtIHN1cHBvcnRlZCBzaXplIik7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxwb2ludGVyPihfVlNURDo6X19saWJjcHBfYWxsb2NhdGUoX19uICogc2l6ZW9mKF9UcCksIF9fYWxpZ25vZihfVHApKSk7CisgICAgICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlKSBfTk9FWENFUFQKKyAgICAgICAge19WU1REOjpfX2xpYmNwcF9kZWFsbG9jYXRlKCh2b2lkKilfX3AsIF9fYWxpZ25vZihfVHApKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBzaXplX3R5cGUofjApIC8gc2l6ZW9mKF9UcCk7fQorI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTKSAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MpCisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcCwgY2xhc3MuLi4gX0FyZ3M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdm9pZAorICAgICAgICBjb25zdHJ1Y3QoX1VwKiBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICB7CisgICAgICAgICAgICA6Om5ldygodm9pZCopX19wKSBfVXAoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICAgICB9CisjZWxzZSAgLy8gIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMpICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUykKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB2b2lkCisgICAgICAgIGNvbnN0cnVjdChwb2ludGVyIF9fcCkKKyAgICAgICAgeworICAgICAgICAgICAgOjpuZXcoKHZvaWQqKV9fcCkgX1RwKCk7CisgICAgICAgIH0KKyMgaWYgZGVmaW5lZChfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUykKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQTA+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdm9pZAorICAgICAgICBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIF9BMCYgX19hMCkKKyAgICAgICAgeworICAgICAgICAgICAgOjpuZXcoKHZvaWQqKV9fcCkgX1RwKF9fYTApOworICAgICAgICB9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9BMD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB2b2lkCisgICAgICAgIGNvbnN0cnVjdChwb2ludGVyIF9fcCwgY29uc3QgX0EwJiBfX2EwKQorICAgICAgICB7CisgICAgICAgICAgICA6Om5ldygodm9pZCopX19wKSBfVHAoX19hMCk7CisgICAgICAgIH0KKyMgZW5kaWYgIC8vIGRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMpCisgICAgdGVtcGxhdGUgPGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQKKyAgICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBfQTAmIF9fYTAsIF9BMSYgX19hMSkKKyAgICAgICAgeworICAgICAgICAgICAgOjpuZXcoKHZvaWQqKV9fcCkgX1RwKF9fYTAsIF9fYTEpOworICAgICAgICB9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQKKyAgICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBjb25zdCBfQTAmIF9fYTAsIF9BMSYgX19hMSkKKyAgICAgICAgeworICAgICAgICAgICAgOjpuZXcoKHZvaWQqKV9fcCkgX1RwKF9fYTAsIF9fYTEpOworICAgICAgICB9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQKKyAgICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBfQTAmIF9fYTAsIGNvbnN0IF9BMSYgX19hMSkKKyAgICAgICAgeworICAgICAgICAgICAgOjpuZXcoKHZvaWQqKV9fcCkgX1RwKF9fYTAsIF9fYTEpOworICAgICAgICB9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQKKyAgICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBjb25zdCBfQTAmIF9fYTAsIGNvbnN0IF9BMSYgX19hMSkKKyAgICAgICAgeworICAgICAgICAgICAgOjpuZXcoKHZvaWQqKV9fcCkgX1RwKF9fYTAsIF9fYTEpOworICAgICAgICB9CisjZW5kaWYgIC8vICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTKSAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MpCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIGRlc3Ryb3kocG9pbnRlciBfX3ApIHtfX3AtPn5fVHAoKTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYWxsb2NhdG9yPGNvbnN0IF9UcD4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIGNvbnN0IF9UcCogICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiBjb25zdCBfVHAqICAgICAgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgY29uc3QgX1RwJiAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgX1RwJiAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgX1RwICAgICAgICAgdmFsdWVfdHlwZTsKKworICAgIHR5cGVkZWYgdHJ1ZV90eXBlIHByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50OworICAgIHR5cGVkZWYgdHJ1ZV90eXBlIGlzX2Fsd2F5c19lcXVhbDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVXA+IHN0cnVjdCByZWJpbmQge3R5cGVkZWYgYWxsb2NhdG9yPF9VcD4gb3RoZXI7fTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTcKKyAgICBhbGxvY2F0b3IoKSBfTk9FWENFUFQge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVXA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNyAKKyAgICBhbGxvY2F0b3IoY29uc3QgYWxsb2NhdG9yPF9VcD4mKSBfTk9FWENFUFQge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfcG9pbnRlciBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSBfX3gpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9WU1REOjphZGRyZXNzb2YoX194KTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBwb2ludGVyIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGFsbG9jYXRvcjx2b2lkPjo6Y29uc3RfcG9pbnRlciA9IDApCisgICAgeworICAgICAgICBpZiAoX19uID4gbWF4X3NpemUoKSkKKyAgICAgICAgICAgIF9fdGhyb3dfbGVuZ3RoX2Vycm9yKCJhbGxvY2F0b3I8Y29uc3QgVD46OmFsbG9jYXRlKHNpemVfdCBuKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJ24nIGV4Y2VlZHMgbWF4aW11bSBzdXBwb3J0ZWQgc2l6ZSIpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8cG9pbnRlcj4oX1ZTVEQ6Ol9fbGliY3BwX2FsbG9jYXRlKF9fbiAqIHNpemVvZihfVHApLCBfX2FsaWdub2YoX1RwKSkpOworICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlKSBfTk9FWENFUFQKKyAgICAgICAge19WU1REOjpfX2xpYmNwcF9kZWFsbG9jYXRlKCh2b2lkKikgY29uc3RfY2FzdDxfVHAgKj4oX19wKSwgX19hbGlnbm9mKF9UcCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIHNpemVfdHlwZSh+MCkgLyBzaXplb2YoX1RwKTt9CisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMpICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUykKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwLCBjbGFzcy4uLiBfQXJncz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB2b2lkCisgICAgICAgIGNvbnN0cnVjdChfVXAqIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIDo6bmV3KCh2b2lkKilfX3ApIF9VcChfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICAgIH0KKyNlbHNlICAvLyAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUykgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTKQorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQKKyAgICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wKQorICAgICAgICB7CisgICAgICAgICAgICA6Om5ldygodm9pZCopIGNvbnN0X2Nhc3Q8X1RwICo+KF9fcCkpIF9UcCgpOworICAgICAgICB9CisjIGlmIGRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMpCisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQKKyAgICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBfQTAmIF9fYTApCisgICAgICAgIHsKKyAgICAgICAgICAgIDo6bmV3KCh2b2lkKikgY29uc3RfY2FzdDxfVHAgKj4oX19wKSkgX1RwKF9fYTApOworICAgICAgICB9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9BMD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB2b2lkCisgICAgICAgIGNvbnN0cnVjdChwb2ludGVyIF9fcCwgY29uc3QgX0EwJiBfX2EwKQorICAgICAgICB7CisgICAgICAgICAgICA6Om5ldygodm9pZCopIGNvbnN0X2Nhc3Q8X1RwICo+KF9fcCkpIF9UcChfX2EwKTsKKyAgICAgICAgfQorIyBlbmRpZiAgLy8gZGVmaW5lZChfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUykKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTE+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdm9pZAorICAgICAgICBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIF9BMCYgX19hMCwgX0ExJiBfX2ExKQorICAgICAgICB7CisgICAgICAgICAgICA6Om5ldygodm9pZCopIGNvbnN0X2Nhc3Q8X1RwICo+KF9fcCkpIF9UcChfX2EwLCBfX2ExKTsKKyAgICAgICAgfQorICAgIHRlbXBsYXRlIDxjbGFzcyBfQTAsIGNsYXNzIF9BMT4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB2b2lkCisgICAgICAgIGNvbnN0cnVjdChwb2ludGVyIF9fcCwgY29uc3QgX0EwJiBfX2EwLCBfQTEmIF9fYTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIDo6bmV3KCh2b2lkKikgY29uc3RfY2FzdDxfVHAgKj4oX19wKSkgX1RwKF9fYTAsIF9fYTEpOworICAgICAgICB9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQKKyAgICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBfQTAmIF9fYTAsIGNvbnN0IF9BMSYgX19hMSkKKyAgICAgICAgeworICAgICAgICAgICAgOjpuZXcoKHZvaWQqKSBjb25zdF9jYXN0PF9UcCAqPihfX3ApKSBfVHAoX19hMCwgX19hMSk7CisgICAgICAgIH0KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTE+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdm9pZAorICAgICAgICBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIGNvbnN0IF9BMCYgX19hMCwgY29uc3QgX0ExJiBfX2ExKQorICAgICAgICB7CisgICAgICAgICAgICA6Om5ldygodm9pZCopIGNvbnN0X2Nhc3Q8X1RwICo+KF9fcCkpIF9UcChfX2EwLCBfX2ExKTsKKyAgICAgICAgfQorI2VuZGlmICAvLyAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUykgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTKQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCBkZXN0cm95KHBvaW50ZXIgX19wKSB7X19wLT5+X1RwKCk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBhbGxvY2F0b3I8X1RwPiYsIGNvbnN0IGFsbG9jYXRvcjxfVXA+JikgX05PRVhDRVBUIHtyZXR1cm4gdHJ1ZTt9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIG9wZXJhdG9yIT0oY29uc3QgYWxsb2NhdG9yPF9UcD4mLCBjb25zdCBhbGxvY2F0b3I8X1VwPiYpIF9OT0VYQ0VQVCB7cmV0dXJuIGZhbHNlO30KKwordGVtcGxhdGUgPGNsYXNzIF9PdXRwdXRJdGVyYXRvciwgY2xhc3MgX1RwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgcmF3X3N0b3JhZ2VfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcjxvdXRwdXRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgIF9UcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB1cnBvc2VmdWxseSBub3QgQysrMDMKKyAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwdXJwb3NlZnVsbHkgbm90IEMrKzAzCisgICAgICAgICAgICAgICAgICAgICAgX1RwKiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHVycG9zZWZ1bGx5IG5vdCBDKyswMworICAgICAgICAgICAgICAgICAgICAgIHJhd19zdG9yYWdlX2l0ZXJhdG9yPF9PdXRwdXRJdGVyYXRvciwgX1RwPiY+IC8vIHB1cnBvc2VmdWxseSBub3QgQysrMDMKK3sKK3ByaXZhdGU6CisgICAgX091dHB1dEl0ZXJhdG9yIF9feF87CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBleHBsaWNpdCByYXdfc3RvcmFnZV9pdGVyYXRvcihfT3V0cHV0SXRlcmF0b3IgX194KSA6IF9feF8oX194KSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmF3X3N0b3JhZ2VfaXRlcmF0b3ImIG9wZXJhdG9yKigpIHtyZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmF3X3N0b3JhZ2VfaXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBfVHAmIF9fZWxlbWVudCkKKyAgICAgICAgezo6bmV3KCYqX194XykgX1RwKF9fZWxlbWVudCk7IHJldHVybiAqdGhpczt9CisjaWYgX0xJQkNQUF9TVERfVkVSID49IDE0CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByYXdfc3RvcmFnZV9pdGVyYXRvciYgb3BlcmF0b3I9KF9UcCYmIF9fZWxlbWVudCkKKyAgICAgICAgezo6bmV3KCYqX194XykgX1RwKF9WU1REOjptb3ZlKF9fZWxlbWVudCkpOyByZXR1cm4gKnRoaXM7fQorI2VuZGlmCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByYXdfc3RvcmFnZV9pdGVyYXRvciYgb3BlcmF0b3IrKygpIHsrK19feF87IHJldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByYXdfc3RvcmFnZV9pdGVyYXRvciAgb3BlcmF0b3IrKyhpbnQpCisgICAgICAgIHtyYXdfc3RvcmFnZV9pdGVyYXRvciBfX3QoKnRoaXMpOyArK19feF87IHJldHVybiBfX3Q7fQorI2lmIF9MSUJDUFBfU1REX1ZFUiA+PSAxNAorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX091dHB1dEl0ZXJhdG9yIGJhc2UoKSBjb25zdCB7IHJldHVybiBfX3hfOyB9CisjZW5kaWYKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX05PX0NGSQorcGFpcjxfVHAqLCBwdHJkaWZmX3Q+CitnZXRfdGVtcG9yYXJ5X2J1ZmZlcihwdHJkaWZmX3QgX19uKSBfTk9FWENFUFQKK3sKKyAgICBwYWlyPF9UcCosIHB0cmRpZmZfdD4gX19yKDAsIDApOworICAgIGNvbnN0IHB0cmRpZmZfdCBfX20gPSAofnB0cmRpZmZfdCgwKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QocHRyZGlmZl90KDEpIDw8IChzaXplb2YocHRyZGlmZl90KSAqIF9fQ0hBUl9CSVRfXyAtIDEpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gc2l6ZW9mKF9UcCk7CisgICAgaWYgKF9fbiA+IF9fbSkKKyAgICAgICAgX19uID0gX19tOworICAgIHdoaWxlIChfX24gPiAwKQorICAgIHsKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19BTElHTkVEX0FMTE9DQVRJT04pCisgICAgaWYgKF9faXNfb3ZlcmFsaWduZWRfZm9yX25ldyhfX2FsaWdub2YoX1RwKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6YWxpZ25fdmFsX3QgX19hbCA9CisgICAgICAgICAgICAgICAgc3RkOjphbGlnbl92YWxfdChzdGQ6OmFsaWdubWVudF9vZjxfVHA+Ojp2YWx1ZSk7CisgICAgICAgICAgICBfX3IuZmlyc3QgPSBzdGF0aWNfY2FzdDxfVHAqPig6Om9wZXJhdG9yIG5ldygKKyAgICAgICAgICAgICAgICBfX24gKiBzaXplb2YoX1RwKSwgX19hbCwgbm90aHJvdykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19yLmZpcnN0ID0gc3RhdGljX2Nhc3Q8X1RwKj4oOjpvcGVyYXRvciBuZXcoCisgICAgICAgICAgICAgICAgX19uICogc2l6ZW9mKF9UcCksIG5vdGhyb3cpKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICBpZiAoX19pc19vdmVyYWxpZ25lZF9mb3JfbmV3KF9fYWxpZ25vZihfVHApKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2luY2UgYWxpZ25lZCBvcGVyYXRvciBuZXcgaXMgdW5hdmFpbGFibGUsIHJldHVybiBhbiBlbXB0eQorICAgICAgICAgICAgLy8gYnVmZmVyIHJhdGhlciB0aGFuIG9uZSB3aXRoIGludmFsaWQgYWxpZ25tZW50LgorICAgICAgICAgICAgcmV0dXJuIF9fcjsKKyAgICAgICAgfQorCisgICAgICAgIF9fci5maXJzdCA9IHN0YXRpY19jYXN0PF9UcCo+KDo6b3BlcmF0b3IgbmV3KF9fbiAqIHNpemVvZihfVHApLCBub3Rocm93KSk7CisjZW5kaWYKKworICAgICAgICBpZiAoX19yLmZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBfX3Iuc2Vjb25kID0gX19uOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgX19uIC89IDI7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCByZXR1cm5fdGVtcG9yYXJ5X2J1ZmZlcihfVHAqIF9fcCkgX05PRVhDRVBUCit7CisgIF9WU1REOjpfX2xpYmNwcF9kZWFsbG9jYXRlKCh2b2lkKilfX3AsIF9fYWxpZ25vZihfVHApKTsKK30KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA8PSAxNCB8fCBkZWZpbmVkKF9MSUJDUFBfRU5BQkxFX0NYWDE3X1JFTU9WRURfQVVUT19QVFIpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGF1dG9fcHRyX3JlZgoreworICAgIF9UcCogX19wdHJfOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYXV0b19wdHIKK3sKK3ByaXZhdGU6CisgICAgX1RwKiBfX3B0cl87CitwdWJsaWM6CisgICAgdHlwZWRlZiBfVHAgZWxlbWVudF90eXBlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBleHBsaWNpdCBhdXRvX3B0cihfVHAqIF9fcCA9IDApIHRocm93KCkgOiBfX3B0cl8oX19wKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYXV0b19wdHIoYXV0b19wdHImIF9fcCkgdGhyb3coKSA6IF9fcHRyXyhfX3AucmVsZWFzZSgpKSB7fQorICAgIHRlbXBsYXRlPGNsYXNzIF9VcD4gX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBhdXRvX3B0cihhdXRvX3B0cjxfVXA+JiBfX3ApIHRocm93KCkKKyAgICAgICAgOiBfX3B0cl8oX19wLnJlbGVhc2UoKSkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGF1dG9fcHRyJiBvcGVyYXRvcj0oYXV0b19wdHImIF9fcCkgdGhyb3coKQorICAgICAgICB7cmVzZXQoX19wLnJlbGVhc2UoKSk7IHJldHVybiAqdGhpczt9CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VwPiBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGF1dG9fcHRyJiBvcGVyYXRvcj0oYXV0b19wdHI8X1VwPiYgX19wKSB0aHJvdygpCisgICAgICAgIHtyZXNldChfX3AucmVsZWFzZSgpKTsgcmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGF1dG9fcHRyJiBvcGVyYXRvcj0oYXV0b19wdHJfcmVmPF9UcD4gX19wKSB0aHJvdygpCisgICAgICAgIHtyZXNldChfX3AuX19wdHJfKTsgcmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIH5hdXRvX3B0cigpIHRocm93KCkge2RlbGV0ZSBfX3B0cl87fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfVHAmIG9wZXJhdG9yKigpIGNvbnN0IHRocm93KCkKKyAgICAgICAge3JldHVybiAqX19wdHJfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9UcCogb3BlcmF0b3ItPigpIGNvbnN0IHRocm93KCkge3JldHVybiBfX3B0cl87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX1RwKiBnZXQoKSBjb25zdCB0aHJvdygpIHtyZXR1cm4gX19wdHJfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9UcCogcmVsZWFzZSgpIHRocm93KCkKKyAgICB7CisgICAgICAgIF9UcCogX190ID0gX19wdHJfOworICAgICAgICBfX3B0cl8gPSAwOworICAgICAgICByZXR1cm4gX190OworICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgcmVzZXQoX1RwKiBfX3AgPSAwKSB0aHJvdygpCisgICAgeworICAgICAgICBpZiAoX19wdHJfICE9IF9fcCkKKyAgICAgICAgICAgIGRlbGV0ZSBfX3B0cl87CisgICAgICAgIF9fcHRyXyA9IF9fcDsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGF1dG9fcHRyKGF1dG9fcHRyX3JlZjxfVHA+IF9fcCkgdGhyb3coKSA6IF9fcHRyXyhfX3AuX19wdHJfKSB7fQorICAgIHRlbXBsYXRlPGNsYXNzIF9VcD4gX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBvcGVyYXRvciBhdXRvX3B0cl9yZWY8X1VwPigpIHRocm93KCkKKyAgICAgICAge2F1dG9fcHRyX3JlZjxfVXA+IF9fdDsgX190Ll9fcHRyXyA9IHJlbGVhc2UoKTsgcmV0dXJuIF9fdDt9CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VwPiBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIG9wZXJhdG9yIGF1dG9fcHRyPF9VcD4oKSB0aHJvdygpCisgICAgICAgIHtyZXR1cm4gYXV0b19wdHI8X1VwPihyZWxlYXNlKCkpO30KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBhdXRvX3B0cjx2b2lkPgoreworcHVibGljOgorICAgIHR5cGVkZWYgdm9pZCBlbGVtZW50X3R5cGU7Cit9OworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGludCBfSWR4LAorICAgICAgICAgIGJvb2wgX0NhbkJlRW1wdHlCYXNlID0KKyAgICAgICAgICAgICAgaXNfZW1wdHk8X1RwPjo6dmFsdWUgJiYgIV9fbGliY3BwX2lzX2ZpbmFsPF9UcD46OnZhbHVlPgorc3RydWN0IF9fY29tcHJlc3NlZF9wYWlyX2VsZW0geworICB0eXBlZGVmIF9UcCBfUGFyYW1UOworICB0eXBlZGVmIF9UcCYgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcmVmZXJlbmNlOworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0ZXhwciBfX2NvbXByZXNzZWRfcGFpcl9lbGVtKCkgOiBfX3ZhbHVlXygpIHt9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcCwgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgICAhaXNfc2FtZTxfX2NvbXByZXNzZWRfcGFpcl9lbGVtLCB0eXBlbmFtZSBkZWNheTxfVXA+Ojp0eXBlPjo6dmFsdWUKKyAgPjo6dHlwZT4KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBjb25zdGV4cHIgZXhwbGljaXQKKyAgX19jb21wcmVzc2VkX3BhaXJfZWxlbShfVXAmJiBfX3UpCisgICAgICA6IF9fdmFsdWVfKF9WU1REOjpmb3J3YXJkPF9VcD4oX191KSl7fTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3MsIHNpemVfdC4uLiBfSW5kZXhlcz4KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICBfX2NvbXByZXNzZWRfcGFpcl9lbGVtKHBpZWNld2lzZV9jb25zdHJ1Y3RfdCwgdHVwbGU8X0FyZ3MuLi4+IF9fYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX3R1cGxlX2luZGljZXM8X0luZGV4ZXMuLi4+KQorICAgICAgOiBfX3ZhbHVlXyhfVlNURDo6Zm9yd2FyZDxfQXJncz4oX1ZTVEQ6OmdldDxfSW5kZXhlcz4oX19hcmdzKSkuLi4pIHt9CisjZWxzZQorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9fY29tcHJlc3NlZF9wYWlyX2VsZW0oKSA6IF9fdmFsdWVfKCkge30KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBfX2NvbXByZXNzZWRfcGFpcl9lbGVtKF9QYXJhbVQgX19wKSA6IF9fdmFsdWVfKHN0ZDo6Zm9yd2FyZDxfUGFyYW1UPihfX3ApKSB7fQorI2VuZGlmCisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByZWZlcmVuY2UgX19nZXQoKSBfTk9FWENFUFQgeyByZXR1cm4gX192YWx1ZV87IH0KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBjb25zdF9yZWZlcmVuY2UgX19nZXQoKSBjb25zdCBfTk9FWENFUFQgeyByZXR1cm4gX192YWx1ZV87IH0KKworcHJpdmF0ZToKKyAgX1RwIF9fdmFsdWVfOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgaW50IF9JZHg+CitzdHJ1Y3QgX19jb21wcmVzc2VkX3BhaXJfZWxlbTxfVHAsIF9JZHgsIHRydWU+IDogcHJpdmF0ZSBfVHAgeworICB0eXBlZGVmIF9UcCBfUGFyYW1UOworICB0eXBlZGVmIF9UcCYgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIF9UcCBfX3ZhbHVlX3R5cGU7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RleHByIF9fY29tcHJlc3NlZF9wYWlyX2VsZW0oKSA9IGRlZmF1bHQ7CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcCwgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgICAgICFpc19zYW1lPF9fY29tcHJlc3NlZF9wYWlyX2VsZW0sIHR5cGVuYW1lIGRlY2F5PF9VcD46OnR5cGU+Ojp2YWx1ZQorICA+Ojp0eXBlPgorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGNvbnN0ZXhwciBleHBsaWNpdAorICBfX2NvbXByZXNzZWRfcGFpcl9lbGVtKF9VcCYmIF9fdSkKKyAgICAgIDogX192YWx1ZV90eXBlKF9WU1REOjpmb3J3YXJkPF9VcD4oX191KSl7fTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3MsIHNpemVfdC4uLiBfSW5kZXhlcz4KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNAorICBfX2NvbXByZXNzZWRfcGFpcl9lbGVtKHBpZWNld2lzZV9jb25zdHJ1Y3RfdCwgdHVwbGU8X0FyZ3MuLi4+IF9fYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX3R1cGxlX2luZGljZXM8X0luZGV4ZXMuLi4+KQorICAgICAgOiBfX3ZhbHVlX3R5cGUoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9WU1REOjpnZXQ8X0luZGV4ZXM+KF9fYXJncykpLi4uKSB7fQorI2Vsc2UKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX2NvbXByZXNzZWRfcGFpcl9lbGVtKCkgOiBfX3ZhbHVlX3R5cGUoKSB7fQorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIF9fY29tcHJlc3NlZF9wYWlyX2VsZW0oX1BhcmFtVCBfX3ApCisgICAgICA6IF9fdmFsdWVfdHlwZShzdGQ6OmZvcndhcmQ8X1BhcmFtVD4oX19wKSkge30KKyNlbmRpZgorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmVmZXJlbmNlIF9fZ2V0KCkgX05PRVhDRVBUIHsgcmV0dXJuICp0aGlzOyB9CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgY29uc3RfcmVmZXJlbmNlIF9fZ2V0KCkgY29uc3QgX05PRVhDRVBUIHsgcmV0dXJuICp0aGlzOyB9Cit9OworCisvLyBUYWcgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIHNlY29uZCBlbGVtZW50IG9mIHRoZSBjb21wcmVzc2VkIHBhaXIuCitzdHJ1Y3QgX19zZWNvbmRfdGFnIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitjbGFzcyBfX2NvbXByZXNzZWRfcGFpciA6IHByaXZhdGUgX19jb21wcmVzc2VkX3BhaXJfZWxlbTxfVDEsIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIF9fY29tcHJlc3NlZF9wYWlyX2VsZW08X1QyLCAxPiB7CisgIHR5cGVkZWYgX19jb21wcmVzc2VkX3BhaXJfZWxlbTxfVDEsIDA+IF9CYXNlMTsKKyAgdHlwZWRlZiBfX2NvbXByZXNzZWRfcGFpcl9lbGVtPF9UMiwgMT4gX0Jhc2UyOworCisgIC8vIE5PVEU6IFRoaXMgc3RhdGljIGFzc2VydCBzaG91bGQgbmV2ZXIgZmlyZSBiZWNhdXNlIF9fY29tcHJlc3NlZF9wYWlyCisgIC8vIGlzICphbG1vc3QgbmV2ZXIqIHVzZWQgaW4gYSBzY2VuYXJpbyB3aGVyZSBpdCdzIHBvc3NpYmxlIGZvciBUMSA9PSBUMi4KKyAgLy8gKFRoZSBleGNlcHRpb24gaXMgc3RkOjpmdW5jdGlvbiB3aGVyZSBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBmdW5jdGlvbgorICAvLyAgb2JqZWN0IGFuZCB0aGUgYWxsb2NhdG9yIGhhdmUgdGhlIHNhbWUgdHlwZSkuCisgIHN0YXRpY19hc3NlcnQoKCFpc19zYW1lPF9UMSwgX1QyPjo6dmFsdWUpLAorICAgICJfX2NvbXByZXNzZWRfcGFpciBjYW5ub3QgYmUgaW5zdGFudGF0ZWQgd2hlbiBUMSBhbmQgVDIgYXJlIHRoZSBzYW1lIHR5cGU7ICIKKyAgICAiVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgTk9UIEFCSS1jb21wYXRpYmxlIHdpdGggdGhlIHByZXZpb3VzICIKKyAgICAiaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgY29uZmlndXJhdGlvbiIpOworCitwdWJsaWM6CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICB0ZW1wbGF0ZSA8Ym9vbCBfRHVtbXkgPSB0cnVlLAorICAgICAgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgICAgICAgX19kZXBlbmRlbnRfdHlwZTxpc19kZWZhdWx0X2NvbnN0cnVjdGlibGU8X1QxPiwgX0R1bW15Pjo6dmFsdWUgJiYKKyAgICAgICAgICBfX2RlcGVuZGVudF90eXBlPGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxfVDI+LCBfRHVtbXk+Ojp2YWx1ZQorICAgICAgPjo6dHlwZQorICA+CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgY29uc3RleHByIF9fY29tcHJlc3NlZF9wYWlyKCkge30KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCB0eXBlbmFtZSBlbmFibGVfaWY8IWlzX3NhbWU8dHlwZW5hbWUgZGVjYXk8X1RwPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcHJlc3NlZF9wYWlyPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sPjo6dHlwZSA9IHRydWU+CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RleHByIGV4cGxpY2l0CisgIF9fY29tcHJlc3NlZF9wYWlyKF9UcCYmIF9fdCkKKyAgICAgIDogX0Jhc2UxKHN0ZDo6Zm9yd2FyZDxfVHA+KF9fdCkpLCBfQmFzZTIoKSB7fQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RleHByCisgIF9fY29tcHJlc3NlZF9wYWlyKF9fc2Vjb25kX3RhZywgX1RwJiYgX190KQorICAgICAgOiBfQmFzZTEoKSwgX0Jhc2UyKHN0ZDo6Zm9yd2FyZDxfVHA+KF9fdCkpIHt9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9VMSwgY2xhc3MgX1UyPgorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0ZXhwcgorICBfX2NvbXByZXNzZWRfcGFpcihfVTEmJiBfX3QxLCBfVTImJiBfX3QyKQorICAgICAgOiBfQmFzZTEoc3RkOjpmb3J3YXJkPF9VMT4oX190MSkpLCBfQmFzZTIoc3RkOjpmb3J3YXJkPF9VMj4oX190MikpIHt9CisKKyAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzMSwgY2xhc3MuLi4gX0FyZ3MyPgorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0CisgIF9fY29tcHJlc3NlZF9wYWlyKHBpZWNld2lzZV9jb25zdHJ1Y3RfdCBfX3BjLCB0dXBsZTxfQXJnczEuLi4+IF9fZmlyc3RfYXJncywKKyAgICAgICAgICAgICAgICAgICAgdHVwbGU8X0FyZ3MyLi4uPiBfX3NlY29uZF9hcmdzKQorICAgICAgOiBfQmFzZTEoX19wYywgX1ZTVEQ6Om1vdmUoX19maXJzdF9hcmdzKSwKKyAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPHNpemVvZi4uLihfQXJnczEpPjo6dHlwZSgpKSwKKyAgICAgICAgX0Jhc2UyKF9fcGMsIF9WU1REOjptb3ZlKF9fc2Vjb25kX2FyZ3MpLAorICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX2luZGljZXM8c2l6ZW9mLi4uKF9BcmdzMik+Ojp0eXBlKCkpIHt9CisKKyNlbHNlCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgX19jb21wcmVzc2VkX3BhaXIoKSB7fQorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZXhwbGljaXQKKyAgX19jb21wcmVzc2VkX3BhaXIoX1QxIF9fdDEpIDogX0Jhc2UxKF9WU1REOjpmb3J3YXJkPF9UMT4oX190MSkpIHt9CisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBfX2NvbXByZXNzZWRfcGFpcihfX3NlY29uZF90YWcsIF9UMiBfX3QyKQorICAgICAgOiBfQmFzZTEoKSwgX0Jhc2UyKF9WU1REOjpmb3J3YXJkPF9UMj4oX190MikpIHt9CisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBfX2NvbXByZXNzZWRfcGFpcihfVDEgX190MSwgX1QyIF9fdDIpCisgICAgICA6IF9CYXNlMShfVlNURDo6Zm9yd2FyZDxfVDE+KF9fdDEpKSwgX0Jhc2UyKF9WU1REOjpmb3J3YXJkPF9UMj4oX190MikpIHt9CisjZW5kaWYKKworICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHR5cGVuYW1lIF9CYXNlMTo6cmVmZXJlbmNlIGZpcnN0KCkgX05PRVhDRVBUIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X0Jhc2UxJj4oKnRoaXMpLl9fZ2V0KCk7CisgIH0KKworICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHR5cGVuYW1lIF9CYXNlMTo6Y29uc3RfcmVmZXJlbmNlIGZpcnN0KCkgY29uc3QgX05PRVhDRVBUIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X0Jhc2UxIGNvbnN0Jj4oKnRoaXMpLl9fZ2V0KCk7CisgIH0KKworICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHR5cGVuYW1lIF9CYXNlMjo6cmVmZXJlbmNlIHNlY29uZCgpIF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9CYXNlMiY+KCp0aGlzKS5fX2dldCgpOworICB9CisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB0eXBlbmFtZSBfQmFzZTI6OmNvbnN0X3JlZmVyZW5jZSBzZWNvbmQoKSBjb25zdCBfTk9FWENFUFQgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxfQmFzZTIgY29uc3QmPigqdGhpcykuX19nZXQoKTsKKyAgfQorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgdm9pZCBzd2FwKF9fY29tcHJlc3NlZF9wYWlyJiBfX3gpCisgICAgX05PRVhDRVBUXyhfX2lzX25vdGhyb3dfc3dhcHBhYmxlPF9UMT46OnZhbHVlICYmCisgICAgICAgICAgICAgICBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPF9UMj46OnZhbHVlKQorICB7CisgICAgdXNpbmcgc3RkOjpzd2FwOworICAgIHN3YXAoZmlyc3QoKSwgX194LmZpcnN0KCkpOworICAgIHN3YXAoc2Vjb25kKCksIF9feC5zZWNvbmQoKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIHN3YXAoX19jb21wcmVzc2VkX3BhaXI8X1QxLCBfVDI+JiBfX3gsIF9fY29tcHJlc3NlZF9wYWlyPF9UMSwgX1QyPiYgX195KQorICAgIF9OT0VYQ0VQVF8oX19pc19ub3Rocm93X3N3YXBwYWJsZTxfVDE+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgX19pc19ub3Rocm93X3N3YXBwYWJsZTxfVDI+Ojp2YWx1ZSkgeworICBfX3guc3dhcChfX3kpOworfQorCisvLyBkZWZhdWx0X2RlbGV0ZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGRlZmF1bHRfZGVsZXRlIHsKKyAgICBzdGF0aWNfYXNzZXJ0KCFpc19mdW5jdGlvbjxfVHA+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJkZWZhdWx0X2RlbGV0ZSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGZvciBmdW5jdGlvbiB0eXBlcyIpOworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdGV4cHIgZGVmYXVsdF9kZWxldGUoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisjZWxzZQorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGRlZmF1bHRfZGVsZXRlKCkge30KKyNlbmRpZgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPgorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGRlZmF1bHRfZGVsZXRlKGNvbnN0IGRlZmF1bHRfZGVsZXRlPF9VcD4mLAorICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8X1VwKiwgX1RwKj46OnZhbHVlPjo6dHlwZSogPQorICAgICAgICAgICAgICAgICAgICAgMCkgX05PRVhDRVBUIHt9CisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIG9wZXJhdG9yKCkoX1RwKiBfX3B0cikgY29uc3QgX05PRVhDRVBUIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihfVHApID4gMCwKKyAgICAgICAgICAgICAgICAgICJkZWZhdWx0X2RlbGV0ZSBjYW4gbm90IGRlbGV0ZSBpbmNvbXBsZXRlIHR5cGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCFpc192b2lkPF9UcD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgImRlZmF1bHRfZGVsZXRlIGNhbiBub3QgZGVsZXRlIGluY29tcGxldGUgdHlwZSIpOworICAgIGRlbGV0ZSBfX3B0cjsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBkZWZhdWx0X2RlbGV0ZTxfVHBbXT4geworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgc3RydWN0IF9FbmFibGVJZkNvbnZlcnRpYmxlCisgICAgICA6IGVuYWJsZV9pZjxpc19jb252ZXJ0aWJsZTxfVXAoKilbXSwgX1RwKCopW10+Ojp2YWx1ZT4ge307CisKK3B1YmxpYzoKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RleHByIGRlZmF1bHRfZGVsZXRlKCkgbm9leGNlcHQgPSBkZWZhdWx0OworI2Vsc2UKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBkZWZhdWx0X2RlbGV0ZSgpIHt9CisjZW5kaWYKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPgorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGRlZmF1bHRfZGVsZXRlKGNvbnN0IGRlZmF1bHRfZGVsZXRlPF9VcFtdPiYsCisgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9FbmFibGVJZkNvbnZlcnRpYmxlPF9VcD46OnR5cGUqID0gMCkgX05PRVhDRVBUIHt9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB0eXBlbmFtZSBfRW5hYmxlSWZDb252ZXJ0aWJsZTxfVXA+Ojp0eXBlCisgIG9wZXJhdG9yKCkoX1VwKiBfX3B0cikgY29uc3QgX05PRVhDRVBUIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihfVHApID4gMCwKKyAgICAgICAgICAgICAgICAgICJkZWZhdWx0X2RlbGV0ZSBjYW4gbm90IGRlbGV0ZSBpbmNvbXBsZXRlIHR5cGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCFpc192b2lkPF9UcD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgImRlZmF1bHRfZGVsZXRlIGNhbiBub3QgZGVsZXRlIHZvaWQgdHlwZSIpOworICAgIGRlbGV0ZVtdIF9fcHRyOworICB9Cit9OworCisKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKK3RlbXBsYXRlIDxjbGFzcyBfRGVsZXRlcj4KK3N0cnVjdCBfX3VuaXF1ZV9wdHJfZGVsZXRlcl9zZmluYWUgeworICBzdGF0aWNfYXNzZXJ0KCFpc19yZWZlcmVuY2U8X0RlbGV0ZXI+Ojp2YWx1ZSwgImluY29ycmVjdCBzcGVjaWFsaXphdGlvbiIpOworICB0eXBlZGVmIGNvbnN0IF9EZWxldGVyJiBfX2x2YWxfcmVmX3R5cGU7CisgIHR5cGVkZWYgX0RlbGV0ZXImJiBfX2dvb2RfcnZhbF9yZWZfdHlwZTsKKyAgdHlwZWRlZiB0cnVlX3R5cGUgX19lbmFibGVfcnZhbF9vdmVybG9hZDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfRGVsZXRlcj4KK3N0cnVjdCBfX3VuaXF1ZV9wdHJfZGVsZXRlcl9zZmluYWU8X0RlbGV0ZXIgY29uc3QmPiB7CisgIHR5cGVkZWYgY29uc3QgX0RlbGV0ZXImIF9fbHZhbF9yZWZfdHlwZTsKKyAgdHlwZWRlZiBjb25zdCBfRGVsZXRlciYmIF9fYmFkX3J2YWxfcmVmX3R5cGU7CisgIHR5cGVkZWYgZmFsc2VfdHlwZSBfX2VuYWJsZV9ydmFsX292ZXJsb2FkOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9EZWxldGVyPgorc3RydWN0IF9fdW5pcXVlX3B0cl9kZWxldGVyX3NmaW5hZTxfRGVsZXRlciY+IHsKKyAgdHlwZWRlZiBfRGVsZXRlciYgX19sdmFsX3JlZl90eXBlOworICB0eXBlZGVmIF9EZWxldGVyJiYgX19iYWRfcnZhbF9yZWZfdHlwZTsKKyAgdHlwZWRlZiBmYWxzZV90eXBlIF9fZW5hYmxlX3J2YWxfb3ZlcmxvYWQ7Cit9OworI2VuZGlmIC8vICFkZWZpbmVkKF9MSUJDUFBfQ1hYMDNfTEFORykKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0RwID0gZGVmYXVsdF9kZWxldGU8X1RwPiA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB1bmlxdWVfcHRyIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfVHAgZWxlbWVudF90eXBlOworICB0eXBlZGVmIF9EcCBkZWxldGVyX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19wb2ludGVyX3R5cGU8X1RwLCBkZWxldGVyX3R5cGU+Ojp0eXBlIHBvaW50ZXI7CisKKyAgc3RhdGljX2Fzc2VydCghaXNfcnZhbHVlX3JlZmVyZW5jZTxkZWxldGVyX3R5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAidGhlIHNwZWNpZmllZCBkZWxldGVyIHR5cGUgY2Fubm90IGJlIGFuIHJ2YWx1ZSByZWZlcmVuY2UiKTsKKworcHJpdmF0ZToKKyAgX19jb21wcmVzc2VkX3BhaXI8cG9pbnRlciwgZGVsZXRlcl90eXBlPiBfX3B0cl87CisKKyAgc3RydWN0IF9fbmF0IHsgaW50IF9fZm9yX2Jvb2xfOyB9OworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICB0eXBlZGVmIF9fdW5pcXVlX3B0cl9kZWxldGVyX3NmaW5hZTxfRHA+IF9EZWxldGVyU0ZJTkFFOworCisgIHRlbXBsYXRlIDxib29sIF9EdW1teT4KKyAgdXNpbmcgX0xWYWxSZWZUeXBlID0KKyAgICAgIHR5cGVuYW1lIF9fZGVwZW5kZW50X3R5cGU8X0RlbGV0ZXJTRklOQUUsIF9EdW1teT46Ol9fbHZhbF9yZWZfdHlwZTsKKworICB0ZW1wbGF0ZSA8Ym9vbCBfRHVtbXk+CisgIHVzaW5nIF9Hb29kUlZhbFJlZlR5cGUgPQorICAgICAgdHlwZW5hbWUgX19kZXBlbmRlbnRfdHlwZTxfRGVsZXRlclNGSU5BRSwgX0R1bW15Pjo6X19nb29kX3J2YWxfcmVmX3R5cGU7CisKKyAgdGVtcGxhdGUgPGJvb2wgX0R1bW15PgorICB1c2luZyBfQmFkUlZhbFJlZlR5cGUgPQorICAgICAgdHlwZW5hbWUgX19kZXBlbmRlbnRfdHlwZTxfRGVsZXRlclNGSU5BRSwgX0R1bW15Pjo6X19iYWRfcnZhbF9yZWZfdHlwZTsKKworICB0ZW1wbGF0ZSA8Ym9vbCBfRHVtbXksIGNsYXNzIF9EZWxldGVyID0gdHlwZW5hbWUgX19kZXBlbmRlbnRfdHlwZTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pZGVudGl0eTxkZWxldGVyX3R5cGU+LCBfRHVtbXk+Ojp0eXBlPgorICB1c2luZyBfRW5hYmxlSWZEZWxldGVyRGVmYXVsdENvbnN0cnVjdGlibGUgPQorICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxfRGVsZXRlcj46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIWlzX3BvaW50ZXI8X0RlbGV0ZXI+Ojp2YWx1ZT46OnR5cGU7CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9BcmdUeXBlPgorICB1c2luZyBfRW5hYmxlSWZEZWxldGVyQ29uc3RydWN0aWJsZSA9CisgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29uc3RydWN0aWJsZTxkZWxldGVyX3R5cGUsIF9BcmdUeXBlPjo6dmFsdWU+Ojp0eXBlOworCisgIHRlbXBsYXRlIDxjbGFzcyBfVVB0ciwgY2xhc3MgX1VwPgorICB1c2luZyBfRW5hYmxlSWZNb3ZlQ29udmVydGlibGUgPSB0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgICBpc19jb252ZXJ0aWJsZTx0eXBlbmFtZSBfVVB0cjo6cG9pbnRlciwgcG9pbnRlcj46OnZhbHVlICYmCisgICAgICAhaXNfYXJyYXk8X1VwPjo6dmFsdWUKKyAgPjo6dHlwZTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1VEZWw+CisgIHVzaW5nIF9FbmFibGVJZkRlbGV0ZXJDb252ZXJ0aWJsZSA9IHR5cGVuYW1lIGVuYWJsZV9pZjwKKyAgICAgIChpc19yZWZlcmVuY2U8X0RwPjo6dmFsdWUgJiYgaXNfc2FtZTxfRHAsIF9VRGVsPjo6dmFsdWUpIHx8CisgICAgICAoIWlzX3JlZmVyZW5jZTxfRHA+Ojp2YWx1ZSAmJiBpc19jb252ZXJ0aWJsZTxfVURlbCwgX0RwPjo6dmFsdWUpCisgICAgPjo6dHlwZTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1VEZWw+CisgIHVzaW5nIF9FbmFibGVJZkRlbGV0ZXJBc3NpZ25hYmxlID0gdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgaXNfYXNzaWduYWJsZTxfRHAmLCBfVURlbCYmPjo6dmFsdWUKKyAgICA+Ojp0eXBlOworCitwdWJsaWM6CisgIHRlbXBsYXRlIDxib29sIF9EdW1teSA9IHRydWUsCisgICAgICAgICAgICBjbGFzcyA9IF9FbmFibGVJZkRlbGV0ZXJEZWZhdWx0Q29uc3RydWN0aWJsZTxfRHVtbXk+PgorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGNvbnN0ZXhwciB1bmlxdWVfcHRyKCkgbm9leGNlcHQgOiBfX3B0cl8ocG9pbnRlcigpKSB7fQorCisgIHRlbXBsYXRlIDxib29sIF9EdW1teSA9IHRydWUsCisgICAgICAgICAgICBjbGFzcyA9IF9FbmFibGVJZkRlbGV0ZXJEZWZhdWx0Q29uc3RydWN0aWJsZTxfRHVtbXk+PgorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGNvbnN0ZXhwciB1bmlxdWVfcHRyKG51bGxwdHJfdCkgbm9leGNlcHQgOiBfX3B0cl8ocG9pbnRlcigpKSB7fQorCisgIHRlbXBsYXRlIDxib29sIF9EdW1teSA9IHRydWUsCisgICAgICAgICAgICBjbGFzcyA9IF9FbmFibGVJZkRlbGV0ZXJEZWZhdWx0Q29uc3RydWN0aWJsZTxfRHVtbXk+PgorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGV4cGxpY2l0IHVuaXF1ZV9wdHIocG9pbnRlciBfX3ApIG5vZXhjZXB0IDogX19wdHJfKF9fcCkge30KKworICB0ZW1wbGF0ZSA8Ym9vbCBfRHVtbXkgPSB0cnVlLAorICAgICAgICAgICAgY2xhc3MgPSBfRW5hYmxlSWZEZWxldGVyQ29uc3RydWN0aWJsZTxfTFZhbFJlZlR5cGU8X0R1bW15Pj4+CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgdW5pcXVlX3B0cihwb2ludGVyIF9fcCwgX0xWYWxSZWZUeXBlPF9EdW1teT4gX19kKSBub2V4Y2VwdAorICAgICAgOiBfX3B0cl8oX19wLCBfX2QpIHt9CisKKyAgdGVtcGxhdGUgPGJvb2wgX0R1bW15ID0gdHJ1ZSwKKyAgICAgICAgICAgIGNsYXNzID0gX0VuYWJsZUlmRGVsZXRlckNvbnN0cnVjdGlibGU8X0dvb2RSVmFsUmVmVHlwZTxfRHVtbXk+Pj4KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB1bmlxdWVfcHRyKHBvaW50ZXIgX19wLCBfR29vZFJWYWxSZWZUeXBlPF9EdW1teT4gX19kKSBub2V4Y2VwdAorICAgICAgOiBfX3B0cl8oX19wLCBfVlNURDo6bW92ZShfX2QpKSB7CisgICAgc3RhdGljX2Fzc2VydCghaXNfcmVmZXJlbmNlPGRlbGV0ZXJfdHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgInJ2YWx1ZSBkZWxldGVyIGJvdW5kIHRvIHJlZmVyZW5jZSIpOworICB9CisKKyAgdGVtcGxhdGUgPGJvb2wgX0R1bW15ID0gdHJ1ZSwKKyAgICAgICAgICAgIGNsYXNzID0gX0VuYWJsZUlmRGVsZXRlckNvbnN0cnVjdGlibGU8X0JhZFJWYWxSZWZUeXBlPF9EdW1teT4+PgorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHVuaXF1ZV9wdHIocG9pbnRlciBfX3AsIF9CYWRSVmFsUmVmVHlwZTxfRHVtbXk+IF9fZCkgPSBkZWxldGU7CisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB1bmlxdWVfcHRyKHVuaXF1ZV9wdHImJiBfX3UpIG5vZXhjZXB0CisgICAgICA6IF9fcHRyXyhfX3UucmVsZWFzZSgpLCBfVlNURDo6Zm9yd2FyZDxkZWxldGVyX3R5cGU+KF9fdS5nZXRfZGVsZXRlcigpKSkgeworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcCwgY2xhc3MgX0VwLAorICAgICAgY2xhc3MgPSBfRW5hYmxlSWZNb3ZlQ29udmVydGlibGU8dW5pcXVlX3B0cjxfVXAsIF9FcD4sIF9VcD4sCisgICAgICBjbGFzcyA9IF9FbmFibGVJZkRlbGV0ZXJDb252ZXJ0aWJsZTxfRXA+CisgID4KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB1bmlxdWVfcHRyKHVuaXF1ZV9wdHI8X1VwLCBfRXA+JiYgX191KSBfTk9FWENFUFQKKyAgICAgIDogX19wdHJfKF9fdS5yZWxlYXNlKCksIF9WU1REOjpmb3J3YXJkPF9FcD4oX191LmdldF9kZWxldGVyKCkpKSB7fQorCisjaWYgX0xJQkNQUF9TVERfVkVSIDw9IDE0IHx8IGRlZmluZWQoX0xJQkNQUF9FTkFCTEVfQ1hYMTdfUkVNT1ZFRF9BVVRPX1BUUikKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB1bmlxdWVfcHRyKGF1dG9fcHRyPF9VcD4mJiBfX3AsCisgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPF9VcCosIF9UcCo+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc2FtZTxfRHAsIGRlZmF1bHRfZGVsZXRlPF9UcD4+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uYXQ+Ojp0eXBlID0gX19uYXQoKSkgX05PRVhDRVBUCisgICAgICA6IF9fcHRyXyhfX3AucmVsZWFzZSgpKSB7fQorI2VuZGlmCisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB1bmlxdWVfcHRyJiBvcGVyYXRvcj0odW5pcXVlX3B0ciYmIF9fdSkgX05PRVhDRVBUIHsKKyAgICByZXNldChfX3UucmVsZWFzZSgpKTsKKyAgICBfX3B0cl8uc2Vjb25kKCkgPSBfVlNURDo6Zm9yd2FyZDxkZWxldGVyX3R5cGU+KF9fdS5nZXRfZGVsZXRlcigpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwLCBjbGFzcyBfRXAsCisgICAgICBjbGFzcyA9IF9FbmFibGVJZk1vdmVDb252ZXJ0aWJsZTx1bmlxdWVfcHRyPF9VcCwgX0VwPiwgX1VwPiwKKyAgICAgIGNsYXNzID0gX0VuYWJsZUlmRGVsZXRlckFzc2lnbmFibGU8X0VwPgorICA+CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgdW5pcXVlX3B0ciYgb3BlcmF0b3I9KHVuaXF1ZV9wdHI8X1VwLCBfRXA+JiYgX191KSBfTk9FWENFUFQgeworICAgIHJlc2V0KF9fdS5yZWxlYXNlKCkpOworICAgIF9fcHRyXy5zZWNvbmQoKSA9IF9WU1REOjpmb3J3YXJkPF9FcD4oX191LmdldF9kZWxldGVyKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisjZWxzZSAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCitwcml2YXRlOgorICB1bmlxdWVfcHRyKHVuaXF1ZV9wdHImKTsKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcCwgY2xhc3MgX0VwPiB1bmlxdWVfcHRyKHVuaXF1ZV9wdHI8X1VwLCBfRXA+Jik7CisKKyAgdW5pcXVlX3B0ciYgb3BlcmF0b3I9KHVuaXF1ZV9wdHImKTsKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcCwgY2xhc3MgX0VwPiB1bmlxdWVfcHRyJiBvcGVyYXRvcj0odW5pcXVlX3B0cjxfVXAsIF9FcD4mKTsKKworcHVibGljOgorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHVuaXF1ZV9wdHIoKSA6IF9fcHRyXyhwb2ludGVyKCkpCisgIHsKKyAgICBzdGF0aWNfYXNzZXJ0KCFpc19wb2ludGVyPGRlbGV0ZXJfdHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgInVuaXF1ZV9wdHIgY29uc3RydWN0ZWQgd2l0aCBudWxsIGZ1bmN0aW9uIHBvaW50ZXIgZGVsZXRlciIpOworICAgIHN0YXRpY19hc3NlcnQoaXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGRlbGV0ZXJfdHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgInVuaXF1ZV9wdHI6OmRlbGV0ZXJfdHlwZSBpcyBub3QgZGVmYXVsdCBjb25zdHJ1Y3RpYmxlIik7CisgIH0KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB1bmlxdWVfcHRyKG51bGxwdHJfdCkgOiBfX3B0cl8ocG9pbnRlcigpKQorICB7CisgICAgc3RhdGljX2Fzc2VydCghaXNfcG9pbnRlcjxkZWxldGVyX3R5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJ1bmlxdWVfcHRyIGNvbnN0cnVjdGVkIHdpdGggbnVsbCBmdW5jdGlvbiBwb2ludGVyIGRlbGV0ZXIiKTsKKyAgfQorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGV4cGxpY2l0IHVuaXF1ZV9wdHIocG9pbnRlciBfX3ApCisgICAgICA6IF9fcHRyXyhfVlNURDo6bW92ZShfX3ApKSB7CisgICAgc3RhdGljX2Fzc2VydCghaXNfcG9pbnRlcjxkZWxldGVyX3R5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJ1bmlxdWVfcHRyIGNvbnN0cnVjdGVkIHdpdGggbnVsbCBmdW5jdGlvbiBwb2ludGVyIGRlbGV0ZXIiKTsKKyAgfQorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgb3BlcmF0b3IgX19ydjx1bmlxdWVfcHRyPigpIHsKKyAgICByZXR1cm4gX19ydjx1bmlxdWVfcHRyPigqdGhpcyk7CisgIH0KKworICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHVuaXF1ZV9wdHIoX19ydjx1bmlxdWVfcHRyPiBfX3UpCisgICAgICA6IF9fcHRyXyhfX3UtPnJlbGVhc2UoKSwKKyAgICAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkPGRlbGV0ZXJfdHlwZT4oX191LT5nZXRfZGVsZXRlcigpKSkge30KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwLCBjbGFzcyBfRXA+CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgIWlzX2FycmF5PF9VcD46OnZhbHVlICYmCisgICAgICAgICAgaXNfY29udmVydGlibGU8dHlwZW5hbWUgdW5pcXVlX3B0cjxfVXAsIF9FcD46OnBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcj46OnZhbHVlICYmCisgICAgICAgICAgaXNfYXNzaWduYWJsZTxkZWxldGVyX3R5cGUmLCBfRXAmPjo6dmFsdWUsCisgICAgICB1bmlxdWVfcHRyJj46OnR5cGUKKyAgb3BlcmF0b3I9KHVuaXF1ZV9wdHI8X1VwLCBfRXA+IF9fdSkgeworICAgIHJlc2V0KF9fdS5yZWxlYXNlKCkpOworICAgIF9fcHRyXy5zZWNvbmQoKSA9IF9WU1REOjpmb3J3YXJkPF9FcD4oX191LmdldF9kZWxldGVyKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgdW5pcXVlX3B0cihwb2ludGVyIF9fcCwgZGVsZXRlcl90eXBlIF9fZCkKKyAgICAgIDogX19wdHJfKF9WU1REOjptb3ZlKF9fcCksIF9WU1REOjptb3ZlKF9fZCkpIHt9CisjZW5kaWYgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPD0gMTQgfHwgZGVmaW5lZChfTElCQ1BQX0VOQUJMRV9DWFgxN19SRU1PVkVEX0FVVE9fUFRSKQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPgorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8X1VwKiwgX1RwKj46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3NhbWU8X0RwLCBkZWZhdWx0X2RlbGV0ZTxfVHA+ID46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZV9wdHImPjo6dHlwZQorICAgICAgb3BlcmF0b3I9KGF1dG9fcHRyPF9VcD4gX19wKSB7CisgICAgcmVzZXQoX19wLnJlbGVhc2UoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYKKworICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIH51bmlxdWVfcHRyKCkgeyByZXNldCgpOyB9CisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB1bmlxdWVfcHRyJiBvcGVyYXRvcj0obnVsbHB0cl90KSBfTk9FWENFUFQgeworICAgIHJlc2V0KCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlCisgIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gKl9fcHRyXy5maXJzdCgpOworICB9CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgX05PRVhDRVBUIHsKKyAgICByZXR1cm4gX19wdHJfLmZpcnN0KCk7CisgIH0KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBwb2ludGVyIGdldCgpIGNvbnN0IF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuIF9fcHRyXy5maXJzdCgpOworICB9CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgZGVsZXRlcl90eXBlJiBnZXRfZGVsZXRlcigpIF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuIF9fcHRyXy5zZWNvbmQoKTsKKyAgfQorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGNvbnN0IGRlbGV0ZXJfdHlwZSYgZ2V0X2RlbGV0ZXIoKSBjb25zdCBfTk9FWENFUFQgeworICAgIHJldHVybiBfX3B0cl8uc2Vjb25kKCk7CisgIH0KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBfTElCQ1BQX0VYUExJQ0lUIG9wZXJhdG9yIGJvb2woKSBjb25zdCBfTk9FWENFUFQgeworICAgIHJldHVybiBfX3B0cl8uZmlyc3QoKSAhPSBudWxscHRyOworICB9CisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBwb2ludGVyIHJlbGVhc2UoKSBfTk9FWENFUFQgeworICAgIHBvaW50ZXIgX190ID0gX19wdHJfLmZpcnN0KCk7CisgICAgX19wdHJfLmZpcnN0KCkgPSBwb2ludGVyKCk7CisgICAgcmV0dXJuIF9fdDsKKyAgfQorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgdm9pZCByZXNldChwb2ludGVyIF9fcCA9IHBvaW50ZXIoKSkgX05PRVhDRVBUIHsKKyAgICBwb2ludGVyIF9fdG1wID0gX19wdHJfLmZpcnN0KCk7CisgICAgX19wdHJfLmZpcnN0KCkgPSBfX3A7CisgICAgaWYgKF9fdG1wKQorICAgICAgX19wdHJfLnNlY29uZCgpKF9fdG1wKTsKKyAgfQorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgdm9pZCBzd2FwKHVuaXF1ZV9wdHImIF9fdSkgX05PRVhDRVBUIHsKKyAgICBfX3B0cl8uc3dhcChfX3UuX19wdHJfKTsKKyAgfQorfTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRHA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB1bmlxdWVfcHRyPF9UcFtdLCBfRHA+IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfVHAgZWxlbWVudF90eXBlOworICB0eXBlZGVmIF9EcCBkZWxldGVyX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19wb2ludGVyX3R5cGU8X1RwLCBkZWxldGVyX3R5cGU+Ojp0eXBlIHBvaW50ZXI7CisKK3ByaXZhdGU6CisgIF9fY29tcHJlc3NlZF9wYWlyPHBvaW50ZXIsIGRlbGV0ZXJfdHlwZT4gX19wdHJfOworCisgIHRlbXBsYXRlIDxjbGFzcyBfRnJvbT4KKyAgc3RydWN0IF9DaGVja0FycmF5UG9pbnRlckNvbnZlcnNpb24gOiBpc19zYW1lPF9Gcm9tLCBwb2ludGVyPiB7fTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0Zyb21FbGVtPgorICBzdHJ1Y3QgX0NoZWNrQXJyYXlQb2ludGVyQ29udmVyc2lvbjxfRnJvbUVsZW0qPgorICAgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgIGlzX3NhbWU8X0Zyb21FbGVtKiwgcG9pbnRlcj46OnZhbHVlIHx8CisgICAgICAgICAgICAoaXNfc2FtZTxwb2ludGVyLCBlbGVtZW50X3R5cGUqPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICBpc19jb252ZXJ0aWJsZTxfRnJvbUVsZW0oKilbXSwgZWxlbWVudF90eXBlKCopW10+Ojp2YWx1ZSkKKyAgICAgID4KKyAge307CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgIHR5cGVkZWYgX191bmlxdWVfcHRyX2RlbGV0ZXJfc2ZpbmFlPF9EcD4gX0RlbGV0ZXJTRklOQUU7CisKKyAgdGVtcGxhdGUgPGJvb2wgX0R1bW15PgorICB1c2luZyBfTFZhbFJlZlR5cGUgPQorICAgICAgdHlwZW5hbWUgX19kZXBlbmRlbnRfdHlwZTxfRGVsZXRlclNGSU5BRSwgX0R1bW15Pjo6X19sdmFsX3JlZl90eXBlOworCisgIHRlbXBsYXRlIDxib29sIF9EdW1teT4KKyAgdXNpbmcgX0dvb2RSVmFsUmVmVHlwZSA9CisgICAgICB0eXBlbmFtZSBfX2RlcGVuZGVudF90eXBlPF9EZWxldGVyU0ZJTkFFLCBfRHVtbXk+OjpfX2dvb2RfcnZhbF9yZWZfdHlwZTsKKworICB0ZW1wbGF0ZSA8Ym9vbCBfRHVtbXk+CisgIHVzaW5nIF9CYWRSVmFsUmVmVHlwZSA9CisgICAgICB0eXBlbmFtZSBfX2RlcGVuZGVudF90eXBlPF9EZWxldGVyU0ZJTkFFLCBfRHVtbXk+OjpfX2JhZF9ydmFsX3JlZl90eXBlOworCisgIHRlbXBsYXRlIDxib29sIF9EdW1teSwgY2xhc3MgX0RlbGV0ZXIgPSB0eXBlbmFtZSBfX2RlcGVuZGVudF90eXBlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2lkZW50aXR5PGRlbGV0ZXJfdHlwZT4sIF9EdW1teT46OnR5cGU+CisgIHVzaW5nIF9FbmFibGVJZkRlbGV0ZXJEZWZhdWx0Q29uc3RydWN0aWJsZSA9CisgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9EZWxldGVyPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAhaXNfcG9pbnRlcjxfRGVsZXRlcj46OnZhbHVlPjo6dHlwZTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0FyZ1R5cGU+CisgIHVzaW5nIF9FbmFibGVJZkRlbGV0ZXJDb25zdHJ1Y3RpYmxlID0KKyAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19jb25zdHJ1Y3RpYmxlPGRlbGV0ZXJfdHlwZSwgX0FyZ1R5cGU+Ojp2YWx1ZT46OnR5cGU7CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9QcD4KKyAgdXNpbmcgX0VuYWJsZUlmUG9pbnRlckNvbnZlcnRpYmxlID0gdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgX0NoZWNrQXJyYXlQb2ludGVyQ29udmVyc2lvbjxfUHA+Ojp2YWx1ZQorICA+Ojp0eXBlOworCisgIHRlbXBsYXRlIDxjbGFzcyBfVVB0ciwgY2xhc3MgX1VwLAorICAgICAgICBjbGFzcyBfRWxlbVQgPSB0eXBlbmFtZSBfVVB0cjo6ZWxlbWVudF90eXBlPgorICB1c2luZyBfRW5hYmxlSWZNb3ZlQ29udmVydGlibGUgPSB0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgICBpc19hcnJheTxfVXA+Ojp2YWx1ZSAmJgorICAgICAgaXNfc2FtZTxwb2ludGVyLCBlbGVtZW50X3R5cGUqPjo6dmFsdWUgJiYKKyAgICAgIGlzX3NhbWU8dHlwZW5hbWUgX1VQdHI6OnBvaW50ZXIsIF9FbGVtVCo+Ojp2YWx1ZSAmJgorICAgICAgaXNfY29udmVydGlibGU8X0VsZW1UKCopW10sIGVsZW1lbnRfdHlwZSgqKVtdPjo6dmFsdWUKKyAgICA+Ojp0eXBlOworCisgIHRlbXBsYXRlIDxjbGFzcyBfVURlbD4KKyAgdXNpbmcgX0VuYWJsZUlmRGVsZXRlckNvbnZlcnRpYmxlID0gdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgKGlzX3JlZmVyZW5jZTxfRHA+Ojp2YWx1ZSAmJiBpc19zYW1lPF9EcCwgX1VEZWw+Ojp2YWx1ZSkgfHwKKyAgICAgICghaXNfcmVmZXJlbmNlPF9EcD46OnZhbHVlICYmIGlzX2NvbnZlcnRpYmxlPF9VRGVsLCBfRHA+Ojp2YWx1ZSkKKyAgICA+Ojp0eXBlOworCisgIHRlbXBsYXRlIDxjbGFzcyBfVURlbD4KKyAgdXNpbmcgX0VuYWJsZUlmRGVsZXRlckFzc2lnbmFibGUgPSB0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgICBpc19hc3NpZ25hYmxlPF9EcCYsIF9VRGVsJiY+Ojp2YWx1ZQorICAgID46OnR5cGU7CisKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPGJvb2wgX0R1bW15ID0gdHJ1ZSwKKyAgICAgICAgICAgIGNsYXNzID0gX0VuYWJsZUlmRGVsZXRlckRlZmF1bHRDb25zdHJ1Y3RpYmxlPF9EdW1teT4+CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgY29uc3RleHByIHVuaXF1ZV9wdHIoKSBub2V4Y2VwdCA6IF9fcHRyXyhwb2ludGVyKCkpIHt9CisKKyAgdGVtcGxhdGUgPGJvb2wgX0R1bW15ID0gdHJ1ZSwKKyAgICAgICAgICAgIGNsYXNzID0gX0VuYWJsZUlmRGVsZXRlckRlZmF1bHRDb25zdHJ1Y3RpYmxlPF9EdW1teT4+CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgY29uc3RleHByIHVuaXF1ZV9wdHIobnVsbHB0cl90KSBub2V4Y2VwdCA6IF9fcHRyXyhwb2ludGVyKCkpIHt9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9QcCwgYm9vbCBfRHVtbXkgPSB0cnVlLAorICAgICAgICAgICAgY2xhc3MgPSBfRW5hYmxlSWZEZWxldGVyRGVmYXVsdENvbnN0cnVjdGlibGU8X0R1bW15PiwKKyAgICAgICAgICAgIGNsYXNzID0gX0VuYWJsZUlmUG9pbnRlckNvbnZlcnRpYmxlPF9QcD4+CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgZXhwbGljaXQgdW5pcXVlX3B0cihfUHAgX19wKSBub2V4Y2VwdAorICAgICAgOiBfX3B0cl8oX19wKSB7fQorCisgIHRlbXBsYXRlIDxjbGFzcyBfUHAsIGJvb2wgX0R1bW15ID0gdHJ1ZSwKKyAgICAgICAgICAgIGNsYXNzID0gX0VuYWJsZUlmRGVsZXRlckNvbnN0cnVjdGlibGU8X0xWYWxSZWZUeXBlPF9EdW1teT4+LAorICAgICAgICAgICAgY2xhc3MgPSBfRW5hYmxlSWZQb2ludGVyQ29udmVydGlibGU8X1BwPj4KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB1bmlxdWVfcHRyKF9QcCBfX3AsIF9MVmFsUmVmVHlwZTxfRHVtbXk+IF9fZCkgbm9leGNlcHQKKyAgICAgIDogX19wdHJfKF9fcCwgX19kKSB7fQorCisgIHRlbXBsYXRlIDxib29sIF9EdW1teSA9IHRydWUsCisgICAgICAgICAgICBjbGFzcyA9IF9FbmFibGVJZkRlbGV0ZXJDb25zdHJ1Y3RpYmxlPF9MVmFsUmVmVHlwZTxfRHVtbXk+Pj4KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB1bmlxdWVfcHRyKG51bGxwdHJfdCwgX0xWYWxSZWZUeXBlPF9EdW1teT4gX19kKSBub2V4Y2VwdAorICAgICAgOiBfX3B0cl8obnVsbHB0ciwgX19kKSB7fQorCisgIHRlbXBsYXRlIDxjbGFzcyBfUHAsIGJvb2wgX0R1bW15ID0gdHJ1ZSwKKyAgICAgICAgICAgIGNsYXNzID0gX0VuYWJsZUlmRGVsZXRlckNvbnN0cnVjdGlibGU8X0dvb2RSVmFsUmVmVHlwZTxfRHVtbXk+PiwKKyAgICAgICAgICAgIGNsYXNzID0gX0VuYWJsZUlmUG9pbnRlckNvbnZlcnRpYmxlPF9QcD4+CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgdW5pcXVlX3B0cihfUHAgX19wLCBfR29vZFJWYWxSZWZUeXBlPF9EdW1teT4gX19kKSBub2V4Y2VwdAorICAgICAgOiBfX3B0cl8oX19wLCBfVlNURDo6bW92ZShfX2QpKSB7CisgICAgc3RhdGljX2Fzc2VydCghaXNfcmVmZXJlbmNlPGRlbGV0ZXJfdHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgInJ2YWx1ZSBkZWxldGVyIGJvdW5kIHRvIHJlZmVyZW5jZSIpOworICB9CisKKyAgdGVtcGxhdGUgPGJvb2wgX0R1bW15ID0gdHJ1ZSwKKyAgICAgICAgICAgIGNsYXNzID0gX0VuYWJsZUlmRGVsZXRlckNvbnN0cnVjdGlibGU8X0dvb2RSVmFsUmVmVHlwZTxfRHVtbXk+Pj4KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB1bmlxdWVfcHRyKG51bGxwdHJfdCwgX0dvb2RSVmFsUmVmVHlwZTxfRHVtbXk+IF9fZCkgbm9leGNlcHQKKyAgICAgIDogX19wdHJfKG51bGxwdHIsIF9WU1REOjptb3ZlKF9fZCkpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KCFpc19yZWZlcmVuY2U8ZGVsZXRlcl90eXBlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAicnZhbHVlIGRlbGV0ZXIgYm91bmQgdG8gcmVmZXJlbmNlIik7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1BwLCBib29sIF9EdW1teSA9IHRydWUsCisgICAgICAgICAgICBjbGFzcyA9IF9FbmFibGVJZkRlbGV0ZXJDb25zdHJ1Y3RpYmxlPF9CYWRSVmFsUmVmVHlwZTxfRHVtbXk+PiwKKyAgICAgICAgICAgIGNsYXNzID0gX0VuYWJsZUlmUG9pbnRlckNvbnZlcnRpYmxlPF9QcD4+CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgdW5pcXVlX3B0cihfUHAgX19wLCBfQmFkUlZhbFJlZlR5cGU8X0R1bW15PiBfX2QpID0gZGVsZXRlOworCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgdW5pcXVlX3B0cih1bmlxdWVfcHRyJiYgX191KSBub2V4Y2VwdAorICAgICAgOiBfX3B0cl8oX191LnJlbGVhc2UoKSwgX1ZTVEQ6OmZvcndhcmQ8ZGVsZXRlcl90eXBlPihfX3UuZ2V0X2RlbGV0ZXIoKSkpIHsKKyAgfQorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgdW5pcXVlX3B0ciYgb3BlcmF0b3I9KHVuaXF1ZV9wdHImJiBfX3UpIG5vZXhjZXB0IHsKKyAgICByZXNldChfX3UucmVsZWFzZSgpKTsKKyAgICBfX3B0cl8uc2Vjb25kKCkgPSBfVlNURDo6Zm9yd2FyZDxkZWxldGVyX3R5cGU+KF9fdS5nZXRfZGVsZXRlcigpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwLCBjbGFzcyBfRXAsCisgICAgICBjbGFzcyA9IF9FbmFibGVJZk1vdmVDb252ZXJ0aWJsZTx1bmlxdWVfcHRyPF9VcCwgX0VwPiwgX1VwPiwKKyAgICAgIGNsYXNzID0gX0VuYWJsZUlmRGVsZXRlckNvbnZlcnRpYmxlPF9FcD4KKyAgPgorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHVuaXF1ZV9wdHIodW5pcXVlX3B0cjxfVXAsIF9FcD4mJiBfX3UpIG5vZXhjZXB0CisgICAgICA6IF9fcHRyXyhfX3UucmVsZWFzZSgpLCBfVlNURDo6Zm9yd2FyZDxfRXA+KF9fdS5nZXRfZGVsZXRlcigpKSkgeworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcCwgY2xhc3MgX0VwLAorICAgICAgY2xhc3MgPSBfRW5hYmxlSWZNb3ZlQ29udmVydGlibGU8dW5pcXVlX3B0cjxfVXAsIF9FcD4sIF9VcD4sCisgICAgICBjbGFzcyA9IF9FbmFibGVJZkRlbGV0ZXJBc3NpZ25hYmxlPF9FcD4KKyAgPgorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHVuaXF1ZV9wdHImCisgIG9wZXJhdG9yPSh1bmlxdWVfcHRyPF9VcCwgX0VwPiYmIF9fdSkgbm9leGNlcHQgeworICAgIHJlc2V0KF9fdS5yZWxlYXNlKCkpOworICAgIF9fcHRyXy5zZWNvbmQoKSA9IF9WU1REOjpmb3J3YXJkPF9FcD4oX191LmdldF9kZWxldGVyKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisjZWxzZSAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDxjbGFzcyBfVXA+IGV4cGxpY2l0IHVuaXF1ZV9wdHIoX1VwKTsKKworICB1bmlxdWVfcHRyKHVuaXF1ZV9wdHImKTsKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcD4gdW5pcXVlX3B0cih1bmlxdWVfcHRyPF9VcD4mKTsKKworICB1bmlxdWVfcHRyJiBvcGVyYXRvcj0odW5pcXVlX3B0ciYpOworICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPiB1bmlxdWVfcHRyJiBvcGVyYXRvcj0odW5pcXVlX3B0cjxfVXA+Jik7CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgdW5pcXVlX3B0cihfVXAgX191LAorICAgICAgICAgICAgIHR5cGVuYW1lIGNvbmRpdGlvbmFsPAorICAgICAgICAgICAgICAgICBpc19yZWZlcmVuY2U8ZGVsZXRlcl90eXBlPjo6dmFsdWUsIGRlbGV0ZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8Y29uc3QgZGVsZXRlcl90eXBlPjo6dHlwZT46OnR5cGUsCisgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPF9VcCwgcG9pbnRlcj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25hdD46OnR5cGUgPSBfX25hdCgpKTsKK3B1YmxpYzoKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB1bmlxdWVfcHRyKCkgOiBfX3B0cl8ocG9pbnRlcigpKSB7CisgICAgc3RhdGljX2Fzc2VydCghaXNfcG9pbnRlcjxkZWxldGVyX3R5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJ1bmlxdWVfcHRyIGNvbnN0cnVjdGVkIHdpdGggbnVsbCBmdW5jdGlvbiBwb2ludGVyIGRlbGV0ZXIiKTsKKyAgfQorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHVuaXF1ZV9wdHIobnVsbHB0cl90KSA6IF9fcHRyXyhwb2ludGVyKCkpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KCFpc19wb2ludGVyPGRlbGV0ZXJfdHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgInVuaXF1ZV9wdHIgY29uc3RydWN0ZWQgd2l0aCBudWxsIGZ1bmN0aW9uIHBvaW50ZXIgZGVsZXRlciIpOworICB9CisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBleHBsaWNpdCB1bmlxdWVfcHRyKHBvaW50ZXIgX19wKSA6IF9fcHRyXyhfX3ApIHsKKyAgICBzdGF0aWNfYXNzZXJ0KCFpc19wb2ludGVyPGRlbGV0ZXJfdHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgInVuaXF1ZV9wdHIgY29uc3RydWN0ZWQgd2l0aCBudWxsIGZ1bmN0aW9uIHBvaW50ZXIgZGVsZXRlciIpOworICB9CisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB1bmlxdWVfcHRyKHBvaW50ZXIgX19wLCBkZWxldGVyX3R5cGUgX19kKQorICAgICAgOiBfX3B0cl8oX19wLCBfVlNURDo6Zm9yd2FyZDxkZWxldGVyX3R5cGU+KF9fZCkpIHt9CisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB1bmlxdWVfcHRyKG51bGxwdHJfdCwgZGVsZXRlcl90eXBlIF9fZCkKKyAgICAgIDogX19wdHJfKHBvaW50ZXIoKSwgX1ZTVEQ6OmZvcndhcmQ8ZGVsZXRlcl90eXBlPihfX2QpKSB7fQorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgb3BlcmF0b3IgX19ydjx1bmlxdWVfcHRyPigpIHsKKyAgICByZXR1cm4gX19ydjx1bmlxdWVfcHRyPigqdGhpcyk7CisgIH0KKworICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHVuaXF1ZV9wdHIoX19ydjx1bmlxdWVfcHRyPiBfX3UpCisgICAgICA6IF9fcHRyXyhfX3UtPnJlbGVhc2UoKSwKKyAgICAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkPGRlbGV0ZXJfdHlwZT4oX191LT5nZXRfZGVsZXRlcigpKSkge30KKworICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHVuaXF1ZV9wdHImIG9wZXJhdG9yPShfX3J2PHVuaXF1ZV9wdHI+IF9fdSkgeworICAgIHJlc2V0KF9fdS0+cmVsZWFzZSgpKTsKKyAgICBfX3B0cl8uc2Vjb25kKCkgPSBfVlNURDo6Zm9yd2FyZDxkZWxldGVyX3R5cGU+KF9fdS0+Z2V0X2RlbGV0ZXIoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyNlbmRpZiAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworcHVibGljOgorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIH51bmlxdWVfcHRyKCkgeyByZXNldCgpOyB9CisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB1bmlxdWVfcHRyJiBvcGVyYXRvcj0obnVsbHB0cl90KSBfTk9FWENFUFQgeworICAgIHJlc2V0KCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlCisgIG9wZXJhdG9yW10oc2l6ZV90IF9faSkgY29uc3QgeworICAgIHJldHVybiBfX3B0cl8uZmlyc3QoKVtfX2ldOworICB9CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgcG9pbnRlciBnZXQoKSBjb25zdCBfTk9FWENFUFQgeworICAgIHJldHVybiBfX3B0cl8uZmlyc3QoKTsKKyAgfQorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgZGVsZXRlcl90eXBlJiBnZXRfZGVsZXRlcigpIF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuIF9fcHRyXy5zZWNvbmQoKTsKKyAgfQorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgY29uc3QgZGVsZXRlcl90eXBlJiBnZXRfZGVsZXRlcigpIGNvbnN0IF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuIF9fcHRyXy5zZWNvbmQoKTsKKyAgfQorICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIF9MSUJDUFBfRVhQTElDSVQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IF9OT0VYQ0VQVCB7CisgICAgcmV0dXJuIF9fcHRyXy5maXJzdCgpICE9IG51bGxwdHI7CisgIH0KKworICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHBvaW50ZXIgcmVsZWFzZSgpIF9OT0VYQ0VQVCB7CisgICAgcG9pbnRlciBfX3QgPSBfX3B0cl8uZmlyc3QoKTsKKyAgICBfX3B0cl8uZmlyc3QoKSA9IHBvaW50ZXIoKTsKKyAgICByZXR1cm4gX190OworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9QcD4KKyAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgICBfQ2hlY2tBcnJheVBvaW50ZXJDb252ZXJzaW9uPF9QcD46OnZhbHVlCisgID46OnR5cGUKKyAgcmVzZXQoX1BwIF9fcCkgX05PRVhDRVBUIHsKKyAgICBwb2ludGVyIF9fdG1wID0gX19wdHJfLmZpcnN0KCk7CisgICAgX19wdHJfLmZpcnN0KCkgPSBfX3A7CisgICAgaWYgKF9fdG1wKQorICAgICAgX19wdHJfLnNlY29uZCgpKF9fdG1wKTsKKyAgfQorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgdm9pZCByZXNldChudWxscHRyX3QgPSBudWxscHRyKSBfTk9FWENFUFQgeworICAgIHBvaW50ZXIgX190bXAgPSBfX3B0cl8uZmlyc3QoKTsKKyAgICBfX3B0cl8uZmlyc3QoKSA9IG51bGxwdHI7CisgICAgaWYgKF9fdG1wKQorICAgICAgX19wdHJfLnNlY29uZCgpKF9fdG1wKTsKKyAgfQorCisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgdm9pZCBzd2FwKHVuaXF1ZV9wdHImIF9fdSkgX05PRVhDRVBUIHsKKyAgICBfX3B0cl8uc3dhcChfX3UuX19wdHJfKTsKKyAgfQorCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmPAorICAgIF9faXNfc3dhcHBhYmxlPF9EcD46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3N3YXAodW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCwgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feSkgX05PRVhDRVBUIHtfX3guc3dhcChfX3kpO30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX0QxLCBjbGFzcyBfVDIsIGNsYXNzIF9EMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj09KGNvbnN0IHVuaXF1ZV9wdHI8X1QxLCBfRDE+JiBfX3gsIGNvbnN0IHVuaXF1ZV9wdHI8X1QyLCBfRDI+JiBfX3kpIHtyZXR1cm4gX194LmdldCgpID09IF9feS5nZXQoKTt9CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9EMSwgY2xhc3MgX1QyLCBjbGFzcyBfRDI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCB1bmlxdWVfcHRyPF9UMSwgX0QxPiYgX194LCBjb25zdCB1bmlxdWVfcHRyPF9UMiwgX0QyPiYgX195KSB7cmV0dXJuICEoX194ID09IF9feSk7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfRDEsIGNsYXNzIF9UMiwgY2xhc3MgX0QyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPCAoY29uc3QgdW5pcXVlX3B0cjxfVDEsIF9EMT4mIF9feCwgY29uc3QgdW5pcXVlX3B0cjxfVDIsIF9EMj4mIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHVuaXF1ZV9wdHI8X1QxLCBfRDE+Ojpwb2ludGVyIF9QMTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHVuaXF1ZV9wdHI8X1QyLCBfRDI+Ojpwb2ludGVyIF9QMjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9QMSwgX1AyPjo6dHlwZSBfVnA7CisgICAgcmV0dXJuIGxlc3M8X1ZwPigpKF9feC5nZXQoKSwgX195LmdldCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX0QxLCBjbGFzcyBfVDIsIGNsYXNzIF9EMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj4gKGNvbnN0IHVuaXF1ZV9wdHI8X1QxLCBfRDE+JiBfX3gsIGNvbnN0IHVuaXF1ZV9wdHI8X1QyLCBfRDI+JiBfX3kpIHtyZXR1cm4gX195IDwgX194O30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX0QxLCBjbGFzcyBfVDIsIGNsYXNzIF9EMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjw9KGNvbnN0IHVuaXF1ZV9wdHI8X1QxLCBfRDE+JiBfX3gsIGNvbnN0IHVuaXF1ZV9wdHI8X1QyLCBfRDI+JiBfX3kpIHtyZXR1cm4gIShfX3kgPCBfX3gpO30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX0QxLCBjbGFzcyBfVDIsIGNsYXNzIF9EMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj49KGNvbnN0IHVuaXF1ZV9wdHI8X1QxLCBfRDE+JiBfX3gsIGNvbnN0IHVuaXF1ZV9wdHI8X1QyLCBfRDI+JiBfX3kpIHtyZXR1cm4gIShfX3ggPCBfX3kpO30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX0QxPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgdW5pcXVlX3B0cjxfVDEsIF9EMT4mIF9feCwgbnVsbHB0cl90KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gIV9feDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX0QxPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPT0obnVsbHB0cl90LCBjb25zdCB1bmlxdWVfcHRyPF9UMSwgX0QxPiYgX194KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gIV9feDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX0QxPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yIT0oY29uc3QgdW5pcXVlX3B0cjxfVDEsIF9EMT4mIF9feCwgbnVsbHB0cl90KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX0QxPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yIT0obnVsbHB0cl90LCBjb25zdCB1bmlxdWVfcHRyPF9UMSwgX0QxPiYgX194KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX0QxPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPChjb25zdCB1bmlxdWVfcHRyPF9UMSwgX0QxPiYgX194LCBudWxscHRyX3QpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB1bmlxdWVfcHRyPF9UMSwgX0QxPjo6cG9pbnRlciBfUDE7CisgICAgcmV0dXJuIGxlc3M8X1AxPigpKF9feC5nZXQoKSwgbnVsbHB0cik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9EMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjwobnVsbHB0cl90LCBjb25zdCB1bmlxdWVfcHRyPF9UMSwgX0QxPiYgX194KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgdW5pcXVlX3B0cjxfVDEsIF9EMT46OnBvaW50ZXIgX1AxOworICAgIHJldHVybiBsZXNzPF9QMT4oKShudWxscHRyLCBfX3guZ2V0KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfRDE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+KGNvbnN0IHVuaXF1ZV9wdHI8X1QxLCBfRDE+JiBfX3gsIG51bGxwdHJfdCkKK3sKKyAgICByZXR1cm4gbnVsbHB0ciA8IF9feDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX0QxPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPihudWxscHRyX3QsIGNvbnN0IHVuaXF1ZV9wdHI8X1QxLCBfRDE+JiBfX3gpCit7CisgICAgcmV0dXJuIF9feCA8IG51bGxwdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9EMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjw9KGNvbnN0IHVuaXF1ZV9wdHI8X1QxLCBfRDE+JiBfX3gsIG51bGxwdHJfdCkKK3sKKyAgICByZXR1cm4gIShudWxscHRyIDwgX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX0QxPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPD0obnVsbHB0cl90LCBjb25zdCB1bmlxdWVfcHRyPF9UMSwgX0QxPiYgX194KQoreworICAgIHJldHVybiAhKF9feCA8IG51bGxwdHIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfRDE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+PShjb25zdCB1bmlxdWVfcHRyPF9UMSwgX0QxPiYgX194LCBudWxscHRyX3QpCit7CisgICAgcmV0dXJuICEoX194IDwgbnVsbHB0cik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9EMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj49KG51bGxwdHJfdCwgY29uc3QgdW5pcXVlX3B0cjxfVDEsIF9EMT4mIF9feCkKK3sKKyAgICByZXR1cm4gIShudWxscHRyIDwgX194KTsKK30KKworI2lmZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit1bmlxdWVfcHRyPF9UcCwgX0RwPgorbW92ZSh1bmlxdWVfcHRyPF9UcCwgX0RwPiYgX190KQoreworICAgIHJldHVybiB1bmlxdWVfcHRyPF9UcCwgX0RwPihfX3J2PHVuaXF1ZV9wdHI8X1RwLCBfRHA+ID4oX190KSk7Cit9CisKKyNlbmRpZgorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgorc3RydWN0IF9fdW5pcXVlX2lmCit7CisgICAgdHlwZWRlZiB1bmlxdWVfcHRyPF9UcD4gX191bmlxdWVfc2luZ2xlOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgorc3RydWN0IF9fdW5pcXVlX2lmPF9UcFtdPgoreworICAgIHR5cGVkZWYgdW5pcXVlX3B0cjxfVHBbXT4gX191bmlxdWVfYXJyYXlfdW5rbm93bl9ib3VuZDsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9UcCwgc2l6ZV90IF9OcD4KK3N0cnVjdCBfX3VuaXF1ZV9pZjxfVHBbX05wXT4KK3sKKyAgICB0eXBlZGVmIHZvaWQgX191bmlxdWVfYXJyYXlfa25vd25fYm91bmQ7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzLi4uIF9BcmdzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIF9fdW5pcXVlX2lmPF9UcD46Ol9fdW5pcXVlX3NpbmdsZQorbWFrZV91bmlxdWUoX0FyZ3MmJi4uLiBfX2FyZ3MpCit7CisgICAgcmV0dXJuIHVuaXF1ZV9wdHI8X1RwPihuZXcgX1RwKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBfX3VuaXF1ZV9pZjxfVHA+OjpfX3VuaXF1ZV9hcnJheV91bmtub3duX2JvdW5kCittYWtlX3VuaXF1ZShzaXplX3QgX19uKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2V4dGVudDxfVHA+Ojp0eXBlIF9VcDsKKyAgICByZXR1cm4gdW5pcXVlX3B0cjxfVHA+KG5ldyBfVXBbX19uXSgpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcy4uLiBfQXJncz4KKyAgICB0eXBlbmFtZSBfX3VuaXF1ZV9pZjxfVHA+OjpfX3VuaXF1ZV9hcnJheV9rbm93bl9ib3VuZAorICAgIG1ha2VfdW5pcXVlKF9BcmdzJiYuLi4pID0gZGVsZXRlOworCisjZW5kaWYgIC8vIF9MSUJDUFBfU1REX1ZFUiA+IDExCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EcD4KKyNpZmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBoYXNoPHVuaXF1ZV9wdHI8X1RwLCBfRHA+ID4KKyNlbHNlCitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDxfX2VuYWJsZV9oYXNoX2hlbHBlcjwKKyAgICB1bmlxdWVfcHRyPF9UcCwgX0RwPiwgdHlwZW5hbWUgdW5pcXVlX3B0cjxfVHAsIF9EcD46OnBvaW50ZXI+PgorI2VuZGlmCit7CisgICAgdHlwZWRlZiB1bmlxdWVfcHRyPF9UcCwgX0RwPiBhcmd1bWVudF90eXBlOworICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgICAgcmVzdWx0X3R5cGU7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoY29uc3QgYXJndW1lbnRfdHlwZSYgX19wdHIpIGNvbnN0CisgICAgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFyZ3VtZW50X3R5cGU6OnBvaW50ZXIgcG9pbnRlcjsKKyAgICAgICAgcmV0dXJuIGhhc2g8cG9pbnRlcj4oKShfX3B0ci5nZXQoKSk7CisgICAgfQorfTsKKworc3RydWN0IF9fZGVzdHJ1Y3RfbgoreworcHJpdmF0ZToKKyAgICBzaXplX3QgX19zaXplXzsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIF9fcHJvY2VzcyhfVHAqIF9fcCwgZmFsc2VfdHlwZSkgX05PRVhDRVBUCisgICAgICAgIHtmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3NpemVfOyArK19faSwgKytfX3ApIF9fcC0+fl9UcCgpO30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIF9fcHJvY2VzcyhfVHAqLCB0cnVlX3R5cGUpIF9OT0VYQ0VQVAorICAgICAgICB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIF9faW5jcihmYWxzZV90eXBlKSBfTk9FWENFUFQKKyAgICAgICAgeysrX19zaXplXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIF9faW5jcih0cnVlX3R5cGUpIF9OT0VYQ0VQVAorICAgICAgICB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIF9fc2V0KHNpemVfdCBfX3MsIGZhbHNlX3R5cGUpIF9OT0VYQ0VQVAorICAgICAgICB7X19zaXplXyA9IF9fczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIF9fc2V0KHNpemVfdCwgdHJ1ZV90eXBlKSBfTk9FWENFUFQKKyAgICAgICAge30KK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IF9fZGVzdHJ1Y3RfbihzaXplX3QgX19zKSBfTk9FWENFUFQKKyAgICAgICAgOiBfX3NpemVfKF9fcykge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIF9faW5jcihfVHAqKSBfTk9FWENFUFQKKyAgICAgICAge19faW5jcihpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc190cml2aWFsbHlfZGVzdHJ1Y3RpYmxlPF9UcD46OnZhbHVlPigpKTt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCBfX3NldChzaXplX3QgX19zLCBfVHAqKSBfTk9FWENFUFQKKyAgICAgICAge19fc2V0KF9fcywgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfdHJpdmlhbGx5X2Rlc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZT4oKSk7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgb3BlcmF0b3IoKShfVHAqIF9fcCkgX05PRVhDRVBUCisgICAgICAgIHtfX3Byb2Nlc3MoX19wLCBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc190cml2aWFsbHlfZGVzdHJ1Y3RpYmxlPF9UcD46OnZhbHVlPigpKTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgorY2xhc3MgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcgoreworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+IF9fYWxsb2NfdHJhaXRzOworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnBvaW50ZXIgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpzaXplX3R5cGUgc2l6ZV90eXBlOworcHJpdmF0ZToKKyAgICBfQWxsb2MmIF9fYWxsb2NfOworICAgIHNpemVfdHlwZSBfX3NfOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcihfQWxsb2MmIF9fYSwgc2l6ZV90eXBlIF9fcykKKyAgICAgICAgICAgICBfTk9FWENFUFQKKyAgICAgICAgOiBfX2FsbG9jXyhfX2EpLCBfX3NfKF9fcykge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBvcGVyYXRvcigpKHBvaW50ZXIgX19wKSBfTk9FWENFUFQKKyAgICAgICAge19fYWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKF9fYWxsb2NfLCBfX3AsIF9fc18pO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK19Gb3J3YXJkSXRlcmF0b3IKK3VuaW5pdGlhbGl6ZWRfY29weShfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgX0ZvcndhcmRJdGVyYXRvciBfX3IpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgX0ZvcndhcmRJdGVyYXRvciBfX3MgPSBfX3I7CisgICAgdHJ5CisgICAgeworI2VuZGlmCisgICAgICAgIGZvciAoOyBfX2YgIT0gX19sOyArK19fZiwgKHZvaWQpICsrX19yKQorICAgICAgICAgICAgOjpuZXcgKHN0YXRpY19jYXN0PHZvaWQqPihfVlNURDo6YWRkcmVzc29mKCpfX3IpKSkgdmFsdWVfdHlwZSgqX19mKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICBmb3IgKDsgX19zICE9IF9fcjsgKytfX3MpCisgICAgICAgICAgICBfX3MtPn52YWx1ZV90eXBlKCk7CisgICAgICAgIHRocm93OworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX1NpemUsIGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCit1bmluaXRpYWxpemVkX2NvcHlfbihfSW5wdXRJdGVyYXRvciBfX2YsIF9TaXplIF9fbiwgX0ZvcndhcmRJdGVyYXRvciBfX3IpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgX0ZvcndhcmRJdGVyYXRvciBfX3MgPSBfX3I7CisgICAgdHJ5CisgICAgeworI2VuZGlmCisgICAgICAgIGZvciAoOyBfX24gPiAwOyArK19fZiwgKHZvaWQpICsrX19yLCAodm9pZCkgLS1fX24pCisgICAgICAgICAgICA6Om5ldyAoc3RhdGljX2Nhc3Q8dm9pZCo+KF9WU1REOjphZGRyZXNzb2YoKl9fcikpKSB2YWx1ZV90eXBlKCpfX2YpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIGZvciAoOyBfX3MgIT0gX19yOyArK19fcykKKyAgICAgICAgICAgIF9fcy0+fnZhbHVlX3R5cGUoKTsKKyAgICAgICAgdGhyb3c7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcD4KK3ZvaWQKK3VuaW5pdGlhbGl6ZWRfZmlsbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX2wsIGNvbnN0IF9UcCYgX194KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19zID0gX19mOworICAgIHRyeQorICAgIHsKKyNlbmRpZgorICAgICAgICBmb3IgKDsgX19mICE9IF9fbDsgKytfX2YpCisgICAgICAgICAgICA6Om5ldyAoc3RhdGljX2Nhc3Q8dm9pZCo+KF9WU1REOjphZGRyZXNzb2YoKl9fZikpKSB2YWx1ZV90eXBlKF9feCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgZm9yICg7IF9fcyAhPSBfX2Y7ICsrX19zKQorICAgICAgICAgICAgX19zLT5+dmFsdWVfdHlwZSgpOworICAgICAgICB0aHJvdzsKKyAgICB9CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+CitfRm9yd2FyZEl0ZXJhdG9yCit1bmluaXRpYWxpemVkX2ZpbGxfbihfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9feCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcyA9IF9fZjsKKyAgICB0cnkKKyAgICB7CisjZW5kaWYKKyAgICAgICAgZm9yICg7IF9fbiA+IDA7ICsrX19mLCAodm9pZCkgLS1fX24pCisgICAgICAgICAgICA6Om5ldyAoc3RhdGljX2Nhc3Q8dm9pZCo+KF9WU1REOjphZGRyZXNzb2YoKl9fZikpKSB2YWx1ZV90eXBlKF9feCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgZm9yICg7IF9fcyAhPSBfX2Y7ICsrX19zKQorICAgICAgICAgICAgX19zLT5+dmFsdWVfdHlwZSgpOworICAgICAgICB0aHJvdzsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gX19mOworfQorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIGRlc3Ryb3lfYXQoX1RwKiBfX2xvYykgeworICAgIF9MSUJDUFBfQVNTRVJUKF9fbG9jLCAibnVsbCBwb2ludGVyIGdpdmVuIHRvIGRlc3Ryb3lfYXQiKTsKKyAgICBfX2xvYy0+fl9UcCgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIGRlc3Ryb3koX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkgeworICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICBfVlNURDo6ZGVzdHJveV9hdChfVlNURDo6YWRkcmVzc29mKCpfX2ZpcnN0KSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfU2l6ZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfRm9yd2FyZEl0ZXJhdG9yIGRlc3Ryb3lfbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fbikgeworICAgIGZvciAoOyBfX24gPiAwOyAodm9pZCkrK19fZmlyc3QsIC0tX19uKQorICAgICAgICBfVlNURDo6ZGVzdHJveV9hdChfVlNURDo6YWRkcmVzc29mKCpfX2ZpcnN0KSk7CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQgdW5pbml0aWFsaXplZF9kZWZhdWx0X2NvbnN0cnVjdChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KSB7CisgICAgdXNpbmcgX1Z0ID0gdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlOworICAgIGF1dG8gX19pZHggPSBfX2ZpcnN0OworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkgeworI2VuZGlmCisgICAgZm9yICg7IF9faWR4ICE9IF9fbGFzdDsgKytfX2lkeCkKKyAgICAgICAgOjpuZXcoKHZvaWQqKV9WU1REOjphZGRyZXNzb2YoKl9faWR4KSkgX1Z0OworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgICAgX1ZTVEQ6OmRlc3Ryb3koX19maXJzdCwgX19pZHgpOworICAgICAgICB0aHJvdzsKKyAgICB9CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9TaXplPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19Gb3J3YXJkSXRlcmF0b3IgdW5pbml0aWFsaXplZF9kZWZhdWx0X2NvbnN0cnVjdF9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uKSB7CisgICAgdXNpbmcgX1Z0ID0gdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlOworICAgIGF1dG8gX19pZHggPSBfX2ZpcnN0OworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkgeworI2VuZGlmCisgICAgZm9yICg7IF9fbiA+IDA7ICh2b2lkKSsrX19pZHgsIC0tX19uKQorICAgICAgICA6Om5ldygodm9pZCopX1ZTVEQ6OmFkZHJlc3NvZigqX19pZHgpKSBfVnQ7CisgICAgcmV0dXJuIF9faWR4OworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgICAgX1ZTVEQ6OmRlc3Ryb3koX19maXJzdCwgX19pZHgpOworICAgICAgICB0aHJvdzsKKyAgICB9CisjZW5kaWYKK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIHVuaW5pdGlhbGl6ZWRfdmFsdWVfY29uc3RydWN0KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpIHsKKyAgICB1c2luZyBfVnQgPSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU7CisgICAgYXV0byBfX2lkeCA9IF9fZmlyc3Q7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeSB7CisjZW5kaWYKKyAgICBmb3IgKDsgX19pZHggIT0gX19sYXN0OyArK19faWR4KQorICAgICAgICA6Om5ldygodm9pZCopX1ZTVEQ6OmFkZHJlc3NvZigqX19pZHgpKSBfVnQoKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAgIF9WU1REOjpkZXN0cm95KF9fZmlyc3QsIF9faWR4KTsKKyAgICAgICAgdGhyb3c7CisgICAgfQorI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfU2l6ZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfRm9yd2FyZEl0ZXJhdG9yIHVuaW5pdGlhbGl6ZWRfdmFsdWVfY29uc3RydWN0X24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24pIHsKKyAgICB1c2luZyBfVnQgPSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU7CisgICAgYXV0byBfX2lkeCA9IF9fZmlyc3Q7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeSB7CisjZW5kaWYKKyAgICBmb3IgKDsgX19uID4gMDsgKHZvaWQpKytfX2lkeCwgLS1fX24pCisgICAgICAgIDo6bmV3KCh2b2lkKilfVlNURDo6YWRkcmVzc29mKCpfX2lkeCkpIF9WdCgpOworICAgIHJldHVybiBfX2lkeDsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAgIF9WU1REOjpkZXN0cm95KF9fZmlyc3QsIF9faWR4KTsKKyAgICAgICAgdGhyb3c7CisgICAgfQorI2VuZGlmCit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0LCBjbGFzcyBfRm9yd2FyZEl0PgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19Gb3J3YXJkSXQgdW5pbml0aWFsaXplZF9tb3ZlKF9JbnB1dEl0IF9fZmlyc3QsIF9JbnB1dEl0IF9fbGFzdCwgX0ZvcndhcmRJdCBfX2ZpcnN0X3JlcykgeworICAgIHVzaW5nIF9WdCA9IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0Pjo6dmFsdWVfdHlwZTsKKyAgICBhdXRvIF9faWR4ID0gX19maXJzdF9yZXM7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeSB7CisjZW5kaWYKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICh2b2lkKSsrX19pZHgsICsrX19maXJzdCkKKyAgICAgICAgOjpuZXcoKHZvaWQqKV9WU1REOjphZGRyZXNzb2YoKl9faWR4KSkgX1Z0KHN0ZDo6bW92ZSgqX19maXJzdCkpOworICAgIHJldHVybiBfX2lkeDsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAgIF9WU1REOjpkZXN0cm95KF9fZmlyc3RfcmVzLCBfX2lkeCk7CisgICAgICAgIHRocm93OworICAgIH0KKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXQsIGNsYXNzIF9TaXplLCBjbGFzcyBfRm9yd2FyZEl0PgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3BhaXI8X0lucHV0SXQsIF9Gb3J3YXJkSXQ+Cit1bmluaXRpYWxpemVkX21vdmVfbihfSW5wdXRJdCBfX2ZpcnN0LCBfU2l6ZSBfX24sIF9Gb3J3YXJkSXQgX19maXJzdF9yZXMpIHsKKyAgICB1c2luZyBfVnQgPSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdD46OnZhbHVlX3R5cGU7CisgICAgYXV0byBfX2lkeCA9IF9fZmlyc3RfcmVzOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkgeworI2VuZGlmCisgICAgZm9yICg7IF9fbiA+IDA7ICsrX19pZHgsICh2b2lkKSsrX19maXJzdCwgLS1fX24pCisgICAgICAgIDo6bmV3KCh2b2lkKilfVlNURDo6YWRkcmVzc29mKCpfX2lkeCkpIF9WdChzdGQ6Om1vdmUoKl9fZmlyc3QpKTsKKyAgICByZXR1cm4ge19fZmlyc3QsIF9faWR4fTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAgIF9WU1REOjpkZXN0cm95KF9fZmlyc3RfcmVzLCBfX2lkeCk7CisgICAgICAgIHRocm93OworICAgIH0KKyNlbmRpZgorfQorCisKKyNlbmRpZiAvLyBfTElCQ1BQX1NURF9WRVIgPiAxNAorCisvLyBOT1RFOiBSZWxheGVkIGFuZCBhY3EvcmVsIGF0b21pY3MgKGZvciBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCByZXNwZWN0aXZlbHkpCisvLyBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgdGhyZWFkIHNhZmV0eS4KKy8vIFNlZSBodHRwczovL2J1Z3MubGx2bS5vcmcvc2hvd19idWcuY2dpP2lkPTIyODAzCisjaWYgZGVmaW5lZChfX2NsYW5nX18pICYmIF9faGFzX2J1aWx0aW4oX19hdG9taWNfYWRkX2ZldGNoKSAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQoX19BVE9NSUNfUkVMQVhFRCkgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQoX19BVE9NSUNfQUNRX1JFTCkKKyMgICBkZWZpbmUgX0xJQkNQUF9IQVNfQlVJTFRJTl9BVE9NSUNfU1VQUE9SVAorI2VsaWYgIWRlZmluZWQoX19jbGFuZ19fKSAmJiBkZWZpbmVkKF9HTlVDX1ZFUikgJiYgX0dOVUNfVkVSID49IDQwNworIyAgIGRlZmluZSBfTElCQ1BQX0hBU19CVUlMVElOX0FUT01JQ19TVVBQT1JUCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9UcAorX19saWJjcHBfYXRvbWljX3JlZmNvdW50X2luY3JlbWVudChfVHAmIF9fdCkgX05PRVhDRVBUCit7CisjaWYgZGVmaW5lZChfTElCQ1BQX0hBU19CVUlMVElOX0FUT01JQ19TVVBQT1JUKSAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19USFJFQURTKQorICAgIHJldHVybiBfX2F0b21pY19hZGRfZmV0Y2goJl9fdCwgMSwgX19BVE9NSUNfUkVMQVhFRCk7CisjZWxzZQorICAgIHJldHVybiBfX3QgKz0gMTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX1RwCitfX2xpYmNwcF9hdG9taWNfcmVmY291bnRfZGVjcmVtZW50KF9UcCYgX190KSBfTk9FWENFUFQKK3sKKyNpZiBkZWZpbmVkKF9MSUJDUFBfSEFTX0JVSUxUSU5fQVRPTUlDX1NVUFBPUlQpICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1RIUkVBRFMpCisgICAgcmV0dXJuIF9fYXRvbWljX2FkZF9mZXRjaCgmX190LCAtMSwgX19BVE9NSUNfQUNRX1JFTCk7CisjZWxzZQorICAgIHJldHVybiBfX3QgLT0gMTsKKyNlbmRpZgorfQorCitjbGFzcyBfTElCQ1BQX0VYQ0VQVElPTl9BQkkgYmFkX3dlYWtfcHRyCisgICAgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24KK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5iYWRfd2Vha19wdHIoKSBfTk9FWENFUFQ7CisgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgIF9OT0VYQ0VQVDsKK307CisKK19MSUJDUFBfTk9SRVRVUk4gaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORQordm9pZCBfX3Rocm93X2JhZF93ZWFrX3B0cigpCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRocm93IGJhZF93ZWFrX3B0cigpOworI2Vsc2UKKyAgICBfVlNURDo6YWJvcnQoKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+IGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHdlYWtfcHRyOworCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIF9fc2hhcmVkX2NvdW50Cit7CisgICAgX19zaGFyZWRfY291bnQoY29uc3QgX19zaGFyZWRfY291bnQmKTsKKyAgICBfX3NoYXJlZF9jb3VudCYgb3BlcmF0b3I9KGNvbnN0IF9fc2hhcmVkX2NvdW50Jik7CisKK3Byb3RlY3RlZDoKKyAgICBsb25nIF9fc2hhcmVkX293bmVyc187CisgICAgdmlydHVhbCB+X19zaGFyZWRfY291bnQoKTsKK3ByaXZhdGU6CisgICAgdmlydHVhbCB2b2lkIF9fb25femVyb19zaGFyZWQoKSBfTk9FWENFUFQgPSAwOworCitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9fc2hhcmVkX2NvdW50KGxvbmcgX19yZWZzID0gMCkgX05PRVhDRVBUCisgICAgICAgIDogX19zaGFyZWRfb3duZXJzXyhfX3JlZnMpIHt9CisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfQlVJTERJTkdfTUVNT1JZKSAmJiBcCisgICAgZGVmaW5lZChfTElCQ1BQX0RFUFJFQ0FURURfQUJJX0xFR0FDWV9MSUJSQVJZX0RFRklOSVRJT05TX0ZPUl9JTkxJTkVfRlVOQ1RJT05TKQorICAgIHZvaWQgX19hZGRfc2hhcmVkKCkgX05PRVhDRVBUOworICAgIGJvb2wgX19yZWxlYXNlX3NoYXJlZCgpIF9OT0VYQ0VQVDsKKyNlbHNlCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19hZGRfc2hhcmVkKCkgX05PRVhDRVBUIHsKKyAgICAgIF9fbGliY3BwX2F0b21pY19yZWZjb3VudF9pbmNyZW1lbnQoX19zaGFyZWRfb3duZXJzXyk7CisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIF9fcmVsZWFzZV9zaGFyZWQoKSBfTk9FWENFUFQgeworICAgICAgaWYgKF9fbGliY3BwX2F0b21pY19yZWZjb3VudF9kZWNyZW1lbnQoX19zaGFyZWRfb3duZXJzXykgPT0gLTEpIHsKKyAgICAgICAgX19vbl96ZXJvX3NoYXJlZCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisjZW5kaWYKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgbG9uZyB1c2VfY291bnQoKSBjb25zdCBfTk9FWENFUFQgeworICAgICAgICByZXR1cm4gX19saWJjcHBfcmVsYXhlZF9sb2FkKCZfX3NoYXJlZF9vd25lcnNfKSArIDE7CisgICAgfQorfTsKKworY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBfX3NoYXJlZF93ZWFrX2NvdW50CisgICAgOiBwcml2YXRlIF9fc2hhcmVkX2NvdW50Cit7CisgICAgbG9uZyBfX3NoYXJlZF93ZWFrX293bmVyc187CisKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19zaGFyZWRfd2Vha19jb3VudChsb25nIF9fcmVmcyA9IDApIF9OT0VYQ0VQVAorICAgICAgICA6IF9fc2hhcmVkX2NvdW50KF9fcmVmcyksCisgICAgICAgICAgX19zaGFyZWRfd2Vha19vd25lcnNfKF9fcmVmcykge30KK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5fX3NoYXJlZF93ZWFrX2NvdW50KCk7CisKK3B1YmxpYzoKKyNpZiBkZWZpbmVkKF9MSUJDUFBfQlVJTERJTkdfTUVNT1JZKSAmJiBcCisgICAgZGVmaW5lZChfTElCQ1BQX0RFUFJFQ0FURURfQUJJX0xFR0FDWV9MSUJSQVJZX0RFRklOSVRJT05TX0ZPUl9JTkxJTkVfRlVOQ1RJT05TKQorICAgIHZvaWQgX19hZGRfc2hhcmVkKCkgX05PRVhDRVBUOworICAgIHZvaWQgX19hZGRfd2VhaygpIF9OT0VYQ0VQVDsKKyAgICB2b2lkIF9fcmVsZWFzZV9zaGFyZWQoKSBfTk9FWENFUFQ7CisjZWxzZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fYWRkX3NoYXJlZCgpIF9OT0VYQ0VQVCB7CisgICAgICBfX3NoYXJlZF9jb3VudDo6X19hZGRfc2hhcmVkKCk7CisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fYWRkX3dlYWsoKSBfTk9FWENFUFQgeworICAgICAgX19saWJjcHBfYXRvbWljX3JlZmNvdW50X2luY3JlbWVudChfX3NoYXJlZF93ZWFrX293bmVyc18pOworICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX3JlbGVhc2Vfc2hhcmVkKCkgX05PRVhDRVBUIHsKKyAgICAgIGlmIChfX3NoYXJlZF9jb3VudDo6X19yZWxlYXNlX3NoYXJlZCgpKQorICAgICAgICBfX3JlbGVhc2Vfd2VhaygpOworICAgIH0KKyNlbmRpZgorICAgIHZvaWQgX19yZWxlYXNlX3dlYWsoKSBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGxvbmcgdXNlX2NvdW50KCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX19zaGFyZWRfY291bnQ6OnVzZV9jb3VudCgpO30KKyAgICBfX3NoYXJlZF93ZWFrX2NvdW50KiBsb2NrKCkgX05PRVhDRVBUOworCisgICAgLy8gRGVmaW5lIHRoZSBmdW5jdGlvbiBvdXQgb25seSBpZiB3ZSBidWlsZCBzdGF0aWMgbGliYysrIHdpdGhvdXQgUlRUSS4KKyAgICAvLyBPdGhlcndpc2Ugd2UgbWF5IGJyZWFrIGNsaWVudHMgd2hvIG5lZWQgdG8gY29tcGlsZSB0aGVpciBwcm9qZWN0cyB3aXRoCisgICAgLy8gLWZuby1ydHRpIGFuZCB5ZXQgbGluayBhZ2FpbnN0IGEgbGliYysrLmR5bGliIGNvbXBpbGVkCisgICAgLy8gd2l0aG91dCAtZm5vLXJ0dGkuCisjaWYgIWRlZmluZWQoX0xJQkNQUF9OT19SVFRJKSB8fCAhZGVmaW5lZChfTElCQ1BQX0JVSUxEX1NUQVRJQykKKyAgICB2aXJ0dWFsIGNvbnN0IHZvaWQqIF9fZ2V0X2RlbGV0ZXIoY29uc3QgdHlwZV9pbmZvJikgY29uc3QgX05PRVhDRVBUOworI2VuZGlmCitwcml2YXRlOgorICAgIHZpcnR1YWwgdm9pZCBfX29uX3plcm9fc2hhcmVkX3dlYWsoKSBfTk9FWENFUFQgPSAwOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0RwLCBjbGFzcyBfQWxsb2M+CitjbGFzcyBfX3NoYXJlZF9wdHJfcG9pbnRlcgorICAgIDogcHVibGljIF9fc2hhcmVkX3dlYWtfY291bnQKK3sKKyAgICBfX2NvbXByZXNzZWRfcGFpcjxfX2NvbXByZXNzZWRfcGFpcjxfVHAsIF9EcD4sIF9BbGxvYz4gX19kYXRhXzsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19zaGFyZWRfcHRyX3BvaW50ZXIoX1RwIF9fcCwgX0RwIF9fZCwgX0FsbG9jIF9fYSkKKyAgICAgICAgOiAgX19kYXRhXyhfX2NvbXByZXNzZWRfcGFpcjxfVHAsIF9EcD4oX19wLCBfVlNURDo6bW92ZShfX2QpKSwgX1ZTVEQ6Om1vdmUoX19hKSkge30KKworI2lmbmRlZiBfTElCQ1BQX05PX1JUVEkKKyAgICB2aXJ0dWFsIGNvbnN0IHZvaWQqIF9fZ2V0X2RlbGV0ZXIoY29uc3QgdHlwZV9pbmZvJikgY29uc3QgX05PRVhDRVBUOworI2VuZGlmCisKK3ByaXZhdGU6CisgICAgdmlydHVhbCB2b2lkIF9fb25femVyb19zaGFyZWQoKSBfTk9FWENFUFQ7CisgICAgdmlydHVhbCB2b2lkIF9fb25femVyb19zaGFyZWRfd2VhaygpIF9OT0VYQ0VQVDsKK307CisKKyNpZm5kZWYgX0xJQkNQUF9OT19SVFRJCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EcCwgY2xhc3MgX0FsbG9jPgorY29uc3Qgdm9pZCoKK19fc2hhcmVkX3B0cl9wb2ludGVyPF9UcCwgX0RwLCBfQWxsb2M+OjpfX2dldF9kZWxldGVyKGNvbnN0IHR5cGVfaW5mbyYgX190KSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX190ID09IHR5cGVpZChfRHApID8gX1ZTVEQ6OmFkZHJlc3NvZihfX2RhdGFfLmZpcnN0KCkuc2Vjb25kKCkpIDogbnVsbHB0cjsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX05PX1JUVEkKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitfX3NoYXJlZF9wdHJfcG9pbnRlcjxfVHAsIF9EcCwgX0FsbG9jPjo6X19vbl96ZXJvX3NoYXJlZCgpIF9OT0VYQ0VQVAoreworICAgIF9fZGF0YV8uZmlyc3QoKS5zZWNvbmQoKShfX2RhdGFfLmZpcnN0KCkuZmlyc3QoKSk7CisgICAgX19kYXRhXy5maXJzdCgpLnNlY29uZCgpLn5fRHAoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitfX3NoYXJlZF9wdHJfcG9pbnRlcjxfVHAsIF9EcCwgX0FsbG9jPjo6X19vbl96ZXJvX3NoYXJlZF93ZWFrKCkgX05PRVhDRVBUCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2FsbG9jYXRvcl90cmFpdHNfcmViaW5kPF9BbGxvYywgX19zaGFyZWRfcHRyX3BvaW50ZXI+Ojp0eXBlIF9BbDsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X0FsPiBfQVRyYWl0czsKKyAgICB0eXBlZGVmIHBvaW50ZXJfdHJhaXRzPHR5cGVuYW1lIF9BVHJhaXRzOjpwb2ludGVyPiBfUFRyYWl0czsKKworICAgIF9BbCBfX2EoX19kYXRhXy5zZWNvbmQoKSk7CisgICAgX19kYXRhXy5zZWNvbmQoKS5+X0FsbG9jKCk7CisgICAgX19hLmRlYWxsb2NhdGUoX1BUcmFpdHM6OnBvaW50ZXJfdG8oKnRoaXMpLCAxKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorY2xhc3MgX19zaGFyZWRfcHRyX2VtcGxhY2UKKyAgICA6IHB1YmxpYyBfX3NoYXJlZF93ZWFrX2NvdW50Cit7CisgICAgX19jb21wcmVzc2VkX3BhaXI8X0FsbG9jLCBfVHA+IF9fZGF0YV87CitwdWJsaWM6CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fc2hhcmVkX3B0cl9lbXBsYWNlKF9BbGxvYyBfX2EpCisgICAgICAgIDogIF9fZGF0YV8oX1ZTVEQ6Om1vdmUoX19hKSkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyAuLi5fQXJncz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBfX3NoYXJlZF9wdHJfZW1wbGFjZShfQWxsb2MgX19hLCBfQXJncyYmIC4uLl9fYXJncykKKyAgICAgICAgICAgIDogIF9fZGF0YV8ocGllY2V3aXNlX2NvbnN0cnVjdCwgX1ZTVEQ6OmZvcndhcmRfYXNfdHVwbGUoX19hKSwKKyAgICAgICAgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZF9hc190dXBsZShfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikpIHt9CisKKyNlbHNlICAvLyBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3NoYXJlZF9wdHJfZW1wbGFjZShfQWxsb2MgX19hKQorICAgICAgICA6ICBfX2RhdGFfKF9fYSkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQTA+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgX19zaGFyZWRfcHRyX2VtcGxhY2UoX0FsbG9jIF9fYSwgX0EwJiBfX2EwKQorICAgICAgICAgICAgOiAgX19kYXRhXyhfX2EsIF9UcChfX2EwKSkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQTAsIGNsYXNzIF9BMT4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBfX3NoYXJlZF9wdHJfZW1wbGFjZShfQWxsb2MgX19hLCBfQTAmIF9fYTAsIF9BMSYgX19hMSkKKyAgICAgICAgICAgIDogIF9fZGF0YV8oX19hLCBfVHAoX19hMCwgX19hMSkpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBfX3NoYXJlZF9wdHJfZW1wbGFjZShfQWxsb2MgX19hLCBfQTAmIF9fYTAsIF9BMSYgX19hMSwgX0EyJiBfX2EyKQorICAgICAgICAgICAgOiAgX19kYXRhXyhfX2EsIF9UcChfX2EwLCBfX2ExLCBfX2EyKSkge30KKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKKworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIHZvaWQgX19vbl96ZXJvX3NoYXJlZCgpIF9OT0VYQ0VQVDsKKyAgICB2aXJ0dWFsIHZvaWQgX19vbl96ZXJvX3NoYXJlZF93ZWFrKCkgX05PRVhDRVBUOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAqIGdldCgpIF9OT0VYQ0VQVCB7cmV0dXJuICZfX2RhdGFfLnNlY29uZCgpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3ZvaWQKK19fc2hhcmVkX3B0cl9lbXBsYWNlPF9UcCwgX0FsbG9jPjo6X19vbl96ZXJvX3NoYXJlZCgpIF9OT0VYQ0VQVAoreworICAgIF9fZGF0YV8uc2Vjb25kKCkufl9UcCgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cit2b2lkCitfX3NoYXJlZF9wdHJfZW1wbGFjZTxfVHAsIF9BbGxvYz46Ol9fb25femVyb19zaGFyZWRfd2VhaygpIF9OT0VYQ0VQVAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY2F0b3JfdHJhaXRzX3JlYmluZDxfQWxsb2MsIF9fc2hhcmVkX3B0cl9lbXBsYWNlPjo6dHlwZSBfQWw7CisgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPF9BbD4gX0FUcmFpdHM7CisgICAgdHlwZWRlZiBwb2ludGVyX3RyYWl0czx0eXBlbmFtZSBfQVRyYWl0czo6cG9pbnRlcj4gX1BUcmFpdHM7CisgICAgX0FsIF9fYShfX2RhdGFfLmZpcnN0KCkpOworICAgIF9fZGF0YV8uZmlyc3QoKS5+X0FsbG9jKCk7CisgICAgX19hLmRlYWxsb2NhdGUoX1BUcmFpdHM6OnBvaW50ZXJfdG8oKnRoaXMpLCAxKTsKK30KKworc3RydWN0IF9fc2hhcmVkX3B0cl9kdW1teV9yZWJpbmRfYWxsb2NhdG9yX3R5cGU7Cit0ZW1wbGF0ZSA8PgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYWxsb2NhdG9yPF9fc2hhcmVkX3B0cl9kdW1teV9yZWJpbmRfYWxsb2NhdG9yX3R5cGU+Cit7CitwdWJsaWM6CisgICAgdGVtcGxhdGUgPGNsYXNzIF9PdGhlcj4KKyAgICBzdHJ1Y3QgcmViaW5kCisgICAgeworICAgICAgICB0eXBlZGVmIGFsbG9jYXRvcjxfT3RoZXI+IG90aGVyOworICAgIH07Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfVHA+IGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzOworCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBzaGFyZWRfcHRyCit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfVHAgZWxlbWVudF90eXBlOworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKyAgICB0eXBlZGVmIHdlYWtfcHRyPF9UcD4gd2Vha190eXBlOworI2VuZGlmCitwcml2YXRlOgorICAgIGVsZW1lbnRfdHlwZSogICAgICBfX3B0cl87CisgICAgX19zaGFyZWRfd2Vha19jb3VudCogX19jbnRybF87CisKKyAgICBzdHJ1Y3QgX19uYXQge2ludCBfX2Zvcl9ib29sXzt9OworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfTElCQ1BQX0NPTlNURVhQUiBzaGFyZWRfcHRyKCkgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfTElCQ1BQX0NPTlNURVhQUiBzaGFyZWRfcHRyKG51bGxwdHJfdCkgX05PRVhDRVBUOworICAgIHRlbXBsYXRlPGNsYXNzIF9ZcD4KKyAgICAgICAgZXhwbGljaXQgc2hhcmVkX3B0cihfWXAqIF9fcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8X1lwKiwgZWxlbWVudF90eXBlKj46OnZhbHVlLCBfX25hdD46OnR5cGUgPSBfX25hdCgpKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWXAsIGNsYXNzIF9EcD4KKyAgICAgICAgc2hhcmVkX3B0cihfWXAqIF9fcCwgX0RwIF9fZCwKKyAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8X1lwKiwgZWxlbWVudF90eXBlKj46OnZhbHVlLCBfX25hdD46OnR5cGUgPSBfX25hdCgpKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWXAsIGNsYXNzIF9EcCwgY2xhc3MgX0FsbG9jPgorICAgICAgICBzaGFyZWRfcHRyKF9ZcCogX19wLCBfRHAgX19kLCBfQWxsb2MgX19hLAorICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19jb252ZXJ0aWJsZTxfWXAqLCBlbGVtZW50X3R5cGUqPjo6dmFsdWUsIF9fbmF0Pjo6dHlwZSA9IF9fbmF0KCkpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRHA+IHNoYXJlZF9wdHIobnVsbHB0cl90IF9fcCwgX0RwIF9fZCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9EcCwgY2xhc3MgX0FsbG9jPiBzaGFyZWRfcHRyKG51bGxwdHJfdCBfX3AsIF9EcCBfX2QsIF9BbGxvYyBfX2EpOworICAgIHRlbXBsYXRlPGNsYXNzIF9ZcD4gX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzaGFyZWRfcHRyKGNvbnN0IHNoYXJlZF9wdHI8X1lwPiYgX19yLCBlbGVtZW50X3R5cGUqIF9fcCkgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaGFyZWRfcHRyKGNvbnN0IHNoYXJlZF9wdHImIF9fcikgX05PRVhDRVBUOworICAgIHRlbXBsYXRlPGNsYXNzIF9ZcD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBzaGFyZWRfcHRyKGNvbnN0IHNoYXJlZF9wdHI8X1lwPiYgX19yLAorICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19jb252ZXJ0aWJsZTxfWXAqLCBlbGVtZW50X3R5cGUqPjo6dmFsdWUsIF9fbmF0Pjo6dHlwZSA9IF9fbmF0KCkpCisgICAgICAgICAgICAgICAgICAgICAgIF9OT0VYQ0VQVDsKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2hhcmVkX3B0cihzaGFyZWRfcHRyJiYgX19yKSBfTk9FWENFUFQ7CisgICAgdGVtcGxhdGU8Y2xhc3MgX1lwPiBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZICBzaGFyZWRfcHRyKHNoYXJlZF9wdHI8X1lwPiYmIF9fciwKKyAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8X1lwKiwgZWxlbWVudF90eXBlKj46OnZhbHVlLCBfX25hdD46OnR5cGUgPSBfX25hdCgpKQorICAgICAgICAgICAgICAgICAgICAgICBfTk9FWENFUFQ7CisjZW5kaWYgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisgICAgdGVtcGxhdGU8Y2xhc3MgX1lwPiBleHBsaWNpdCBzaGFyZWRfcHRyKGNvbnN0IHdlYWtfcHRyPF9ZcD4mIF9fciwKKyAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8X1lwKiwgZWxlbWVudF90eXBlKj46OnZhbHVlLCBfX25hdD46OnR5cGU9IF9fbmF0KCkpOworI2lmIF9MSUJDUFBfU1REX1ZFUiA8PSAxNCB8fCBkZWZpbmVkKF9MSUJDUFBfRU5BQkxFX0NYWDE3X1JFTU9WRURfQVVUT19QVFIpCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisgICAgdGVtcGxhdGU8Y2xhc3MgX1lwPgorICAgICAgICBzaGFyZWRfcHRyKGF1dG9fcHRyPF9ZcD4mJiBfX3IsCisgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPF9ZcCosIGVsZW1lbnRfdHlwZSo+Ojp2YWx1ZSwgX19uYXQ+Ojp0eXBlID0gX19uYXQoKSk7CisjZWxzZQorICAgIHRlbXBsYXRlPGNsYXNzIF9ZcD4KKyAgICAgICAgc2hhcmVkX3B0cihhdXRvX3B0cjxfWXA+IF9fciwKKyAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8X1lwKiwgZWxlbWVudF90eXBlKj46OnZhbHVlLCBfX25hdD46OnR5cGUgPSBfX25hdCgpKTsKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisgICAgdGVtcGxhdGUgPGNsYXNzIF9ZcCwgY2xhc3MgX0RwPgorICAgICAgICBzaGFyZWRfcHRyKHVuaXF1ZV9wdHI8X1lwLCBfRHA+JiYsCisgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgICAgICAgICAhaXNfbHZhbHVlX3JlZmVyZW5jZTxfRHA+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAhaXNfYXJyYXk8X1lwPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgaXNfY29udmVydGlibGU8dHlwZW5hbWUgdW5pcXVlX3B0cjxfWXAsIF9EcD46OnBvaW50ZXIsIGVsZW1lbnRfdHlwZSo+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgX19uYXQKKyAgICAgICAgICAgICAgICAgICA+Ojp0eXBlID0gX19uYXQoKSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9ZcCwgY2xhc3MgX0RwPgorICAgICAgICBzaGFyZWRfcHRyKHVuaXF1ZV9wdHI8X1lwLCBfRHA+JiYsCisgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgICAgICAgICBpc19sdmFsdWVfcmVmZXJlbmNlPF9EcD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICFpc19hcnJheTxfWXA+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICBpc19jb252ZXJ0aWJsZTx0eXBlbmFtZSB1bmlxdWVfcHRyPF9ZcCwgX0RwPjo6cG9pbnRlciwgZWxlbWVudF90eXBlKj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBfX25hdAorICAgICAgICAgICAgICAgICAgID46OnR5cGUgPSBfX25hdCgpKTsKKyNlbHNlICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgIHRlbXBsYXRlIDxjbGFzcyBfWXAsIGNsYXNzIF9EcD4KKyAgICAgICAgc2hhcmVkX3B0cih1bmlxdWVfcHRyPF9ZcCwgX0RwPiwKKyAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgICAgICAgICAgICA8CisgICAgICAgICAgICAgICAgICAgICAgICFpc19sdmFsdWVfcmVmZXJlbmNlPF9EcD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICFpc19hcnJheTxfWXA+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICBpc19jb252ZXJ0aWJsZTx0eXBlbmFtZSB1bmlxdWVfcHRyPF9ZcCwgX0RwPjo6cG9pbnRlciwgZWxlbWVudF90eXBlKj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBfX25hdAorICAgICAgICAgICAgICAgICAgID46OnR5cGUgPSBfX25hdCgpKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1lwLCBjbGFzcyBfRHA+CisgICAgICAgIHNoYXJlZF9wdHIodW5pcXVlX3B0cjxfWXAsIF9EcD4sCisgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgICAgICAgICBpc19sdmFsdWVfcmVmZXJlbmNlPF9EcD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICFpc19hcnJheTxfWXA+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICBpc19jb252ZXJ0aWJsZTx0eXBlbmFtZSB1bmlxdWVfcHRyPF9ZcCwgX0RwPjo6cG9pbnRlciwgZWxlbWVudF90eXBlKj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBfX25hdAorICAgICAgICAgICAgICAgICAgID46OnR5cGUgPSBfX25hdCgpKTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKworICAgIH5zaGFyZWRfcHRyKCk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2hhcmVkX3B0ciYgb3BlcmF0b3I9KGNvbnN0IHNoYXJlZF9wdHImIF9fcikgX05PRVhDRVBUOworICAgIHRlbXBsYXRlPGNsYXNzIF9ZcD4KKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIGlzX2NvbnZlcnRpYmxlPF9ZcCosIGVsZW1lbnRfdHlwZSo+Ojp2YWx1ZSwKKyAgICAgICAgICAgIHNoYXJlZF9wdHImCisgICAgICAgID46OnR5cGUKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX3B0cjxfWXA+JiBfX3IpIF9OT0VYQ0VQVDsKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2hhcmVkX3B0ciYgb3BlcmF0b3I9KHNoYXJlZF9wdHImJiBfX3IpIF9OT0VYQ0VQVDsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWXA+CisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICBpc19jb252ZXJ0aWJsZTxfWXAqLCBlbGVtZW50X3R5cGUqPjo6dmFsdWUsCisgICAgICAgICAgICBzaGFyZWRfcHRyPF9UcD4mCisgICAgICAgID46OnR5cGUKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBvcGVyYXRvcj0oc2hhcmVkX3B0cjxfWXA+JiYgX19yKTsKKyNpZiBfTElCQ1BQX1NURF9WRVIgPD0gMTQgfHwgZGVmaW5lZChfTElCQ1BQX0VOQUJMRV9DWFgxN19SRU1PVkVEX0FVVE9fUFRSKQorICAgIHRlbXBsYXRlPGNsYXNzIF9ZcD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgIWlzX2FycmF5PF9ZcD46OnZhbHVlICYmCisgICAgICAgICAgICBpc19jb252ZXJ0aWJsZTxfWXAqLCBlbGVtZW50X3R5cGUqPjo6dmFsdWUsCisgICAgICAgICAgICBzaGFyZWRfcHRyCisgICAgICAgID46OnR5cGUmCisgICAgICAgIG9wZXJhdG9yPShhdXRvX3B0cjxfWXA+JiYgX19yKTsKKyNlbmRpZgorI2Vsc2UgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisjaWYgX0xJQkNQUF9TVERfVkVSIDw9IDE0IHx8IGRlZmluZWQoX0xJQkNQUF9FTkFCTEVfQ1hYMTdfUkVNT1ZFRF9BVVRPX1BUUikKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWXA+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgICFpc19hcnJheTxfWXA+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfY29udmVydGlibGU8X1lwKiwgZWxlbWVudF90eXBlKj46OnZhbHVlLAorICAgICAgICAgICAgc2hhcmVkX3B0ciYKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBvcGVyYXRvcj0oYXV0b19wdHI8X1lwPiBfX3IpOworI2VuZGlmCisjZW5kaWYKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1lwLCBjbGFzcyBfRHA+CisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICAhaXNfYXJyYXk8X1lwPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX2NvbnZlcnRpYmxlPHR5cGVuYW1lIHVuaXF1ZV9wdHI8X1lwLCBfRHA+Ojpwb2ludGVyLCBlbGVtZW50X3R5cGUqPjo6dmFsdWUsCisgICAgICAgICAgICBzaGFyZWRfcHRyJgorICAgICAgICA+Ojp0eXBlCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgb3BlcmF0b3I9KHVuaXF1ZV9wdHI8X1lwLCBfRHA+JiYgX19yKTsKKyNlbHNlICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIG9wZXJhdG9yPSh1bmlxdWVfcHRyPF9ZcCwgX0RwPiBfX3IpOworI2VuZGlmCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKHNoYXJlZF9wdHImIF9fcikgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHJlc2V0KCkgX05PRVhDRVBUOworICAgIHRlbXBsYXRlPGNsYXNzIF9ZcD4KKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIGlzX2NvbnZlcnRpYmxlPF9ZcCosIGVsZW1lbnRfdHlwZSo+Ojp2YWx1ZSwKKyAgICAgICAgICAgIHZvaWQKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHJlc2V0KF9ZcCogX19wKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWXAsIGNsYXNzIF9EcD4KKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIGlzX2NvbnZlcnRpYmxlPF9ZcCosIGVsZW1lbnRfdHlwZSo+Ojp2YWx1ZSwKKyAgICAgICAgICAgIHZvaWQKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHJlc2V0KF9ZcCogX19wLCBfRHAgX19kKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfWXAsIGNsYXNzIF9EcCwgY2xhc3MgX0FsbG9jPgorICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgaXNfY29udmVydGlibGU8X1lwKiwgZWxlbWVudF90eXBlKj46OnZhbHVlLAorICAgICAgICAgICAgdm9pZAorICAgICAgICA+Ojp0eXBlCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcmVzZXQoX1lwKiBfX3AsIF9EcCBfX2QsIF9BbGxvYyBfX2EpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGVsZW1lbnRfdHlwZSogZ2V0KCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX19wdHJfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8ZWxlbWVudF90eXBlPjo6dHlwZSBvcGVyYXRvciooKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiAqX19wdHJfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZWxlbWVudF90eXBlKiBvcGVyYXRvci0+KCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX19wdHJfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgbG9uZyB1c2VfY291bnQoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX2NudHJsXyA/IF9fY250cmxfLT51c2VfY291bnQoKSA6IDA7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIHVuaXF1ZSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIHVzZV9jb3VudCgpID09IDE7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfTElCQ1BQX0VYUExJQ0lUIG9wZXJhdG9yIGJvb2woKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBnZXQoKSAhPSAwO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgb3duZXJfYmVmb3JlKHNoYXJlZF9wdHI8X1VwPiBjb25zdCYgX19wKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2NudHJsXyA8IF9fcC5fX2NudHJsXzt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG93bmVyX2JlZm9yZSh3ZWFrX3B0cjxfVXA+IGNvbnN0JiBfX3ApIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fY250cmxfIDwgX19wLl9fY250cmxfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbAorICAgIF9fb3duZXJfZXF1aXZhbGVudChjb25zdCBzaGFyZWRfcHRyJiBfX3ApIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX19jbnRybF8gPT0gX19wLl9fY250cmxfO30KKworI2lmbmRlZiBfTElCQ1BQX05PX1JUVEkKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0RwPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIF9EcCogX19nZXRfZGVsZXRlcigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICAgICAge3JldHVybiBzdGF0aWNfY2FzdDxfRHAqPihfX2NudHJsXworICAgICAgICAgICAgICAgICAgICA/IGNvbnN0X2Nhc3Q8dm9pZCAqPihfX2NudHJsXy0+X19nZXRfZGVsZXRlcih0eXBlaWQoX0RwKSkpCisgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyKTt9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fUlRUSQorCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworCisgICAgdGVtcGxhdGU8Y2xhc3MgLi4uX0FyZ3M+CisgICAgICAgIHN0YXRpYworICAgICAgICBzaGFyZWRfcHRyPF9UcD4KKyAgICAgICAgbWFrZV9zaGFyZWQoX0FyZ3MmJiAuLi5fX2FyZ3MpOworCisgICAgdGVtcGxhdGU8Y2xhc3MgX0FsbG9jLCBjbGFzcyAuLi5fQXJncz4KKyAgICAgICAgc3RhdGljCisgICAgICAgIHNoYXJlZF9wdHI8X1RwPgorICAgICAgICBhbGxvY2F0ZV9zaGFyZWQoY29uc3QgX0FsbG9jJiBfX2EsIF9BcmdzJiYgLi4uX19hcmdzKTsKKworI2Vsc2UgIC8vIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworCisgICAgc3RhdGljIHNoYXJlZF9wdHI8X1RwPiBtYWtlX3NoYXJlZCgpOworCisgICAgdGVtcGxhdGU8Y2xhc3MgX0EwPgorICAgICAgICBzdGF0aWMgc2hhcmVkX3B0cjxfVHA+IG1ha2Vfc2hhcmVkKF9BMCYpOworCisgICAgdGVtcGxhdGU8Y2xhc3MgX0EwLCBjbGFzcyBfQTE+CisgICAgICAgIHN0YXRpYyBzaGFyZWRfcHRyPF9UcD4gbWFrZV9zaGFyZWQoX0EwJiwgX0ExJik7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorICAgICAgICBzdGF0aWMgc2hhcmVkX3B0cjxfVHA+IG1ha2Vfc2hhcmVkKF9BMCYsIF9BMSYsIF9BMiYpOworCisgICAgdGVtcGxhdGU8Y2xhc3MgX0FsbG9jPgorICAgICAgICBzdGF0aWMgc2hhcmVkX3B0cjxfVHA+CisgICAgICAgIGFsbG9jYXRlX3NoYXJlZChjb25zdCBfQWxsb2MmIF9fYSk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfQWxsb2MsIGNsYXNzIF9BMD4KKyAgICAgICAgc3RhdGljIHNoYXJlZF9wdHI8X1RwPgorICAgICAgICBhbGxvY2F0ZV9zaGFyZWQoY29uc3QgX0FsbG9jJiBfX2EsIF9BMCYgX19hMCk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfQWxsb2MsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorICAgICAgICBzdGF0aWMgc2hhcmVkX3B0cjxfVHA+CisgICAgICAgIGFsbG9jYXRlX3NoYXJlZChjb25zdCBfQWxsb2MmIF9fYSwgX0EwJiBfX2EwLCBfQTEmIF9fYTEpOworCisgICAgdGVtcGxhdGU8Y2xhc3MgX0FsbG9jLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorICAgICAgICBzdGF0aWMgc2hhcmVkX3B0cjxfVHA+CisgICAgICAgIGFsbG9jYXRlX3NoYXJlZChjb25zdCBfQWxsb2MmIF9fYSwgX0EwJiBfX2EwLCBfQTEmIF9fYTEsIF9BMiYgX19hMik7CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCisKK3ByaXZhdGU6CisgICAgdGVtcGxhdGUgPGNsYXNzIF9ZcCwgYm9vbCA9IGlzX2Z1bmN0aW9uPF9ZcD46OnZhbHVlPgorICAgICAgICBzdHJ1Y3QgX19zaGFyZWRfcHRyX2RlZmF1bHRfYWxsb2NhdG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgYWxsb2NhdG9yPF9ZcD4gdHlwZTsKKyAgICAgICAgfTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfWXA+CisgICAgICAgIHN0cnVjdCBfX3NoYXJlZF9wdHJfZGVmYXVsdF9hbGxvY2F0b3I8X1lwLCB0cnVlPgorICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIGFsbG9jYXRvcjxfX3NoYXJlZF9wdHJfZHVtbXlfcmViaW5kX2FsbG9jYXRvcl90eXBlPiB0eXBlOworICAgICAgICB9OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9ZcCwgY2xhc3MgX09yaWdQdHI+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPF9PcmlnUHRyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPF9ZcD4qCisgICAgICAgID46OnZhbHVlLAorICAgICAgICAgICAgdm9pZD46OnR5cGUKKyAgICAgICAgX19lbmFibGVfd2Vha190aGlzKGNvbnN0IGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPF9ZcD4qIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PcmlnUHRyKiBfX3B0cikgX05PRVhDRVBUCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2N2PF9ZcD46OnR5cGUgX1Jhd1lwOworICAgICAgICAgICAgaWYgKF9fZSAmJiBfX2UtPl9fd2Vha190aGlzXy5leHBpcmVkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19lLT5fX3dlYWtfdGhpc18gPSBzaGFyZWRfcHRyPF9SYXdZcD4oKnRoaXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8X1Jhd1lwKj4oc3RhdGljX2Nhc3Q8Y29uc3QgX1lwKj4oX19wdHIpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCBfX2VuYWJsZV93ZWFrX3RoaXMoLi4uKSBfTk9FWENFUFQge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVXA+IGZyaWVuZCBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBzaGFyZWRfcHRyOworICAgIHRlbXBsYXRlIDxjbGFzcyBfVXA+IGZyaWVuZCBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB3ZWFrX3B0cjsKK307CisKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lCitfTElCQ1BQX0NPTlNURVhQUgorc2hhcmVkX3B0cjxfVHA+OjpzaGFyZWRfcHRyKCkgX05PRVhDRVBUCisgICAgOiBfX3B0cl8oMCksCisgICAgICBfX2NudHJsXygwKQoreworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUKK19MSUJDUFBfQ09OU1RFWFBSCitzaGFyZWRfcHRyPF9UcD46OnNoYXJlZF9wdHIobnVsbHB0cl90KSBfTk9FWENFUFQKKyAgICA6IF9fcHRyXygwKSwKKyAgICAgIF9fY250cmxfKDApCit7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK3RlbXBsYXRlPGNsYXNzIF9ZcD4KK3NoYXJlZF9wdHI8X1RwPjo6c2hhcmVkX3B0cihfWXAqIF9fcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8X1lwKiwgZWxlbWVudF90eXBlKj46OnZhbHVlLCBfX25hdD46OnR5cGUpCisgICAgOiBfX3B0cl8oX19wKQoreworICAgIHVuaXF1ZV9wdHI8X1lwPiBfX2hvbGQoX19wKTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fc2hhcmVkX3B0cl9kZWZhdWx0X2FsbG9jYXRvcjxfWXA+Ojp0eXBlIF9BbGxvY1Q7CisgICAgdHlwZWRlZiBfX3NoYXJlZF9wdHJfcG9pbnRlcjxfWXAqLCBkZWZhdWx0X2RlbGV0ZTxfWXA+LCBfQWxsb2NUID4gX0NudHJsQmxrOworICAgIF9fY250cmxfID0gbmV3IF9DbnRybEJsayhfX3AsIGRlZmF1bHRfZGVsZXRlPF9ZcD4oKSwgX0FsbG9jVCgpKTsKKyAgICBfX2hvbGQucmVsZWFzZSgpOworICAgIF9fZW5hYmxlX3dlYWtfdGhpcyhfX3AsIF9fcCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK3RlbXBsYXRlPGNsYXNzIF9ZcCwgY2xhc3MgX0RwPgorc2hhcmVkX3B0cjxfVHA+OjpzaGFyZWRfcHRyKF9ZcCogX19wLCBfRHAgX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19jb252ZXJ0aWJsZTxfWXAqLCBlbGVtZW50X3R5cGUqPjo6dmFsdWUsIF9fbmF0Pjo6dHlwZSkKKyAgICA6IF9fcHRyXyhfX3ApCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19zaGFyZWRfcHRyX2RlZmF1bHRfYWxsb2NhdG9yPF9ZcD46OnR5cGUgX0FsbG9jVDsKKyAgICAgICAgdHlwZWRlZiBfX3NoYXJlZF9wdHJfcG9pbnRlcjxfWXAqLCBfRHAsIF9BbGxvY1QgPiBfQ250cmxCbGs7CisgICAgICAgIF9fY250cmxfID0gbmV3IF9DbnRybEJsayhfX3AsIF9fZCwgX0FsbG9jVCgpKTsKKyAgICAgICAgX19lbmFibGVfd2Vha190aGlzKF9fcCwgX19wKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICBfX2QoX19wKTsKKyAgICAgICAgdGhyb3c7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGU8Y2xhc3MgX0RwPgorc2hhcmVkX3B0cjxfVHA+OjpzaGFyZWRfcHRyKG51bGxwdHJfdCBfX3AsIF9EcCBfX2QpCisgICAgOiBfX3B0cl8oMCkKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3NoYXJlZF9wdHJfZGVmYXVsdF9hbGxvY2F0b3I8X1RwPjo6dHlwZSBfQWxsb2NUOworICAgICAgICB0eXBlZGVmIF9fc2hhcmVkX3B0cl9wb2ludGVyPG51bGxwdHJfdCwgX0RwLCBfQWxsb2NUID4gX0NudHJsQmxrOworICAgICAgICBfX2NudHJsXyA9IG5ldyBfQ250cmxCbGsoX19wLCBfX2QsIF9BbGxvY1QoKSk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgX19kKF9fcCk7CisgICAgICAgIHRocm93OworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK3RlbXBsYXRlPGNsYXNzIF9ZcCwgY2xhc3MgX0RwLCBjbGFzcyBfQWxsb2M+CitzaGFyZWRfcHRyPF9UcD46OnNoYXJlZF9wdHIoX1lwKiBfX3AsIF9EcCBfX2QsIF9BbGxvYyBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPF9ZcCosIGVsZW1lbnRfdHlwZSo+Ojp2YWx1ZSwgX19uYXQ+Ojp0eXBlKQorICAgIDogX19wdHJfKF9fcCkKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgdHlwZWRlZiBfX3NoYXJlZF9wdHJfcG9pbnRlcjxfWXAqLCBfRHAsIF9BbGxvYz4gX0NudHJsQmxrOworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NhdG9yX3RyYWl0c19yZWJpbmQ8X0FsbG9jLCBfQ250cmxCbGs+Ojp0eXBlIF9BMjsKKyAgICAgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9BMj4gX0QyOworICAgICAgICBfQTIgX19hMihfX2EpOworICAgICAgICB1bmlxdWVfcHRyPF9DbnRybEJsaywgX0QyPiBfX2hvbGQyKF9fYTIuYWxsb2NhdGUoMSksIF9EMihfX2EyLCAxKSk7CisgICAgICAgIDo6bmV3KHN0YXRpY19jYXN0PHZvaWQqPihfVlNURDo6YWRkcmVzc29mKCpfX2hvbGQyLmdldCgpKSkpCisgICAgICAgICAgICBfQ250cmxCbGsoX19wLCBfX2QsIF9fYSk7CisgICAgICAgIF9fY250cmxfID0gX1ZTVEQ6OmFkZHJlc3NvZigqX19ob2xkMi5yZWxlYXNlKCkpOworICAgICAgICBfX2VuYWJsZV93ZWFrX3RoaXMoX19wLCBfX3ApOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIF9fZChfX3ApOworICAgICAgICB0aHJvdzsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+Cit0ZW1wbGF0ZTxjbGFzcyBfRHAsIGNsYXNzIF9BbGxvYz4KK3NoYXJlZF9wdHI8X1RwPjo6c2hhcmVkX3B0cihudWxscHRyX3QgX19wLCBfRHAgX19kLCBfQWxsb2MgX19hKQorICAgIDogX19wdHJfKDApCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHR5cGVkZWYgX19zaGFyZWRfcHRyX3BvaW50ZXI8bnVsbHB0cl90LCBfRHAsIF9BbGxvYz4gX0NudHJsQmxrOworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NhdG9yX3RyYWl0c19yZWJpbmQ8X0FsbG9jLCBfQ250cmxCbGs+Ojp0eXBlIF9BMjsKKyAgICAgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9BMj4gX0QyOworICAgICAgICBfQTIgX19hMihfX2EpOworICAgICAgICB1bmlxdWVfcHRyPF9DbnRybEJsaywgX0QyPiBfX2hvbGQyKF9fYTIuYWxsb2NhdGUoMSksIF9EMihfX2EyLCAxKSk7CisgICAgICAgIDo6bmV3KHN0YXRpY19jYXN0PHZvaWQqPihfVlNURDo6YWRkcmVzc29mKCpfX2hvbGQyLmdldCgpKSkpCisgICAgICAgICAgICBfQ250cmxCbGsoX19wLCBfX2QsIF9fYSk7CisgICAgICAgIF9fY250cmxfID0gX1ZTVEQ6OmFkZHJlc3NvZigqX19ob2xkMi5yZWxlYXNlKCkpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIF9fZChfX3ApOworICAgICAgICB0aHJvdzsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+Cit0ZW1wbGF0ZTxjbGFzcyBfWXA+CitpbmxpbmUKK3NoYXJlZF9wdHI8X1RwPjo6c2hhcmVkX3B0cihjb25zdCBzaGFyZWRfcHRyPF9ZcD4mIF9fciwgZWxlbWVudF90eXBlICpfX3ApIF9OT0VYQ0VQVAorICAgIDogX19wdHJfKF9fcCksCisgICAgICBfX2NudHJsXyhfX3IuX19jbnRybF8pCit7CisgICAgaWYgKF9fY250cmxfKQorICAgICAgICBfX2NudHJsXy0+X19hZGRfc2hhcmVkKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZQorc2hhcmVkX3B0cjxfVHA+OjpzaGFyZWRfcHRyKGNvbnN0IHNoYXJlZF9wdHImIF9fcikgX05PRVhDRVBUCisgICAgOiBfX3B0cl8oX19yLl9fcHRyXyksCisgICAgICBfX2NudHJsXyhfX3IuX19jbnRybF8pCit7CisgICAgaWYgKF9fY250cmxfKQorICAgICAgICBfX2NudHJsXy0+X19hZGRfc2hhcmVkKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK3RlbXBsYXRlPGNsYXNzIF9ZcD4KK2lubGluZQorc2hhcmVkX3B0cjxfVHA+OjpzaGFyZWRfcHRyKGNvbnN0IHNoYXJlZF9wdHI8X1lwPiYgX19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19jb252ZXJ0aWJsZTxfWXAqLCBlbGVtZW50X3R5cGUqPjo6dmFsdWUsIF9fbmF0Pjo6dHlwZSkKKyAgICAgICAgIF9OT0VYQ0VQVAorICAgIDogX19wdHJfKF9fci5fX3B0cl8pLAorICAgICAgX19jbnRybF8oX19yLl9fY250cmxfKQoreworICAgIGlmIChfX2NudHJsXykKKyAgICAgICAgX19jbnRybF8tPl9fYWRkX3NoYXJlZCgpOworfQorCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZQorc2hhcmVkX3B0cjxfVHA+OjpzaGFyZWRfcHRyKHNoYXJlZF9wdHImJiBfX3IpIF9OT0VYQ0VQVAorICAgIDogX19wdHJfKF9fci5fX3B0cl8pLAorICAgICAgX19jbnRybF8oX19yLl9fY250cmxfKQoreworICAgIF9fci5fX3B0cl8gPSAwOworICAgIF9fci5fX2NudHJsXyA9IDA7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK3RlbXBsYXRlPGNsYXNzIF9ZcD4KK2lubGluZQorc2hhcmVkX3B0cjxfVHA+OjpzaGFyZWRfcHRyKHNoYXJlZF9wdHI8X1lwPiYmIF9fciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8X1lwKiwgZWxlbWVudF90eXBlKj46OnZhbHVlLCBfX25hdD46OnR5cGUpCisgICAgICAgICBfTk9FWENFUFQKKyAgICA6IF9fcHRyXyhfX3IuX19wdHJfKSwKKyAgICAgIF9fY250cmxfKF9fci5fX2NudHJsXykKK3sKKyAgICBfX3IuX19wdHJfID0gMDsKKyAgICBfX3IuX19jbnRybF8gPSAwOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPD0gMTQgfHwgZGVmaW5lZChfTElCQ1BQX0VOQUJMRV9DWFgxN19SRU1PVkVEX0FVVE9fUFRSKQordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGU8Y2xhc3MgX1lwPgorI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworc2hhcmVkX3B0cjxfVHA+OjpzaGFyZWRfcHRyKGF1dG9fcHRyPF9ZcD4mJiBfX3IsCisjZWxzZQorc2hhcmVkX3B0cjxfVHA+OjpzaGFyZWRfcHRyKGF1dG9fcHRyPF9ZcD4gX19yLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPF9ZcCosIGVsZW1lbnRfdHlwZSo+Ojp2YWx1ZSwgX19uYXQ+Ojp0eXBlKQorICAgIDogX19wdHJfKF9fci5nZXQoKSkKK3sKKyAgICB0eXBlZGVmIF9fc2hhcmVkX3B0cl9wb2ludGVyPF9ZcCosIGRlZmF1bHRfZGVsZXRlPF9ZcD4sIGFsbG9jYXRvcjxfWXA+ID4gX0NudHJsQmxrOworICAgIF9fY250cmxfID0gbmV3IF9DbnRybEJsayhfX3IuZ2V0KCksIGRlZmF1bHRfZGVsZXRlPF9ZcD4oKSwgYWxsb2NhdG9yPF9ZcD4oKSk7CisgICAgX19lbmFibGVfd2Vha190aGlzKF9fci5nZXQoKSwgX19yLmdldCgpKTsKKyAgICBfX3IucmVsZWFzZSgpOworfQorI2VuZGlmCisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfWXAsIGNsYXNzIF9EcD4KKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKK3NoYXJlZF9wdHI8X1RwPjo6c2hhcmVkX3B0cih1bmlxdWVfcHRyPF9ZcCwgX0RwPiYmIF9fciwKKyNlbHNlCitzaGFyZWRfcHRyPF9UcD46OnNoYXJlZF9wdHIodW5pcXVlX3B0cjxfWXAsIF9EcD4gX19yLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNfbHZhbHVlX3JlZmVyZW5jZTxfRHA+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNfYXJyYXk8X1lwPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfY29udmVydGlibGU8dHlwZW5hbWUgdW5pcXVlX3B0cjxfWXAsIF9EcD46OnBvaW50ZXIsIGVsZW1lbnRfdHlwZSo+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlKQorICAgIDogX19wdHJfKF9fci5nZXQoKSkKK3sKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorICAgIGlmIChfX3B0cl8gPT0gbnVsbHB0cikKKyAgICAgICAgX19jbnRybF8gPSBudWxscHRyOworICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3NoYXJlZF9wdHJfZGVmYXVsdF9hbGxvY2F0b3I8X1lwPjo6dHlwZSBfQWxsb2NUOworICAgICAgICB0eXBlZGVmIF9fc2hhcmVkX3B0cl9wb2ludGVyPF9ZcCosIF9EcCwgX0FsbG9jVCA+IF9DbnRybEJsazsKKyAgICAgICAgX19jbnRybF8gPSBuZXcgX0NudHJsQmxrKF9fci5nZXQoKSwgX19yLmdldF9kZWxldGVyKCksIF9BbGxvY1QoKSk7CisgICAgICAgIF9fZW5hYmxlX3dlYWtfdGhpcyhfX3IuZ2V0KCksIF9fci5nZXQoKSk7CisgICAgfQorICAgIF9fci5yZWxlYXNlKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfWXAsIGNsYXNzIF9EcD4KKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKK3NoYXJlZF9wdHI8X1RwPjo6c2hhcmVkX3B0cih1bmlxdWVfcHRyPF9ZcCwgX0RwPiYmIF9fciwKKyNlbHNlCitzaGFyZWRfcHRyPF9UcD46OnNoYXJlZF9wdHIodW5pcXVlX3B0cjxfWXAsIF9EcD4gX19yLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19sdmFsdWVfcmVmZXJlbmNlPF9EcD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc19hcnJheTxfWXA+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19jb252ZXJ0aWJsZTx0eXBlbmFtZSB1bmlxdWVfcHRyPF9ZcCwgX0RwPjo6cG9pbnRlciwgZWxlbWVudF90eXBlKj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25hdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID46OnR5cGUpCisgICAgOiBfX3B0cl8oX19yLmdldCgpKQoreworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisgICAgaWYgKF9fcHRyXyA9PSBudWxscHRyKQorICAgICAgICBfX2NudHJsXyA9IG51bGxwdHI7CisgICAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fc2hhcmVkX3B0cl9kZWZhdWx0X2FsbG9jYXRvcjxfWXA+Ojp0eXBlIF9BbGxvY1Q7CisgICAgICAgIHR5cGVkZWYgX19zaGFyZWRfcHRyX3BvaW50ZXI8X1lwKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2Vfd3JhcHBlcjx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9EcD46OnR5cGU+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvY1QgPiBfQ250cmxCbGs7CisgICAgICAgIF9fY250cmxfID0gbmV3IF9DbnRybEJsayhfX3IuZ2V0KCksIHJlZihfX3IuZ2V0X2RlbGV0ZXIoKSksIF9BbGxvY1QoKSk7CisgICAgICAgIF9fZW5hYmxlX3dlYWtfdGhpcyhfX3IuZ2V0KCksIF9fci5nZXQoKSk7CisgICAgfQorICAgIF9fci5yZWxlYXNlKCk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK3RlbXBsYXRlPGNsYXNzIC4uLl9BcmdzPgorc2hhcmVkX3B0cjxfVHA+CitzaGFyZWRfcHRyPF9UcD46Om1ha2Vfc2hhcmVkKF9BcmdzJiYgLi4uX19hcmdzKQoreworICAgIHN0YXRpY19hc3NlcnQoIGlzX2NvbnN0cnVjdGlibGU8X1RwLCBfQXJncy4uLj46OnZhbHVlLCAiQ2FuJ3QgY29uc3RydWN0IG9iamVjdCBpbiBtYWtlX3NoYXJlZCIgKTsKKyAgICB0eXBlZGVmIF9fc2hhcmVkX3B0cl9lbXBsYWNlPF9UcCwgYWxsb2NhdG9yPF9UcD4gPiBfQ250cmxCbGs7CisgICAgdHlwZWRlZiBhbGxvY2F0b3I8X0NudHJsQmxrPiBfQTI7CisgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9BMj4gX0QyOworICAgIF9BMiBfX2EyOworICAgIHVuaXF1ZV9wdHI8X0NudHJsQmxrLCBfRDI+IF9faG9sZDIoX19hMi5hbGxvY2F0ZSgxKSwgX0QyKF9fYTIsIDEpKTsKKyAgICA6Om5ldyhfX2hvbGQyLmdldCgpKSBfQ250cmxCbGsoX19hMiwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIHNoYXJlZF9wdHI8X1RwPiBfX3I7CisgICAgX19yLl9fcHRyXyA9IF9faG9sZDIuZ2V0KCktPmdldCgpOworICAgIF9fci5fX2NudHJsXyA9IF9faG9sZDIucmVsZWFzZSgpOworICAgIF9fci5fX2VuYWJsZV93ZWFrX3RoaXMoX19yLl9fcHRyXywgX19yLl9fcHRyXyk7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGU8Y2xhc3MgX0FsbG9jLCBjbGFzcyAuLi5fQXJncz4KK3NoYXJlZF9wdHI8X1RwPgorc2hhcmVkX3B0cjxfVHA+OjphbGxvY2F0ZV9zaGFyZWQoY29uc3QgX0FsbG9jJiBfX2EsIF9BcmdzJiYgLi4uX19hcmdzKQoreworICAgIHN0YXRpY19hc3NlcnQoIGlzX2NvbnN0cnVjdGlibGU8X1RwLCBfQXJncy4uLj46OnZhbHVlLCAiQ2FuJ3QgY29uc3RydWN0IG9iamVjdCBpbiBhbGxvY2F0ZV9zaGFyZWQiICk7CisgICAgdHlwZWRlZiBfX3NoYXJlZF9wdHJfZW1wbGFjZTxfVHAsIF9BbGxvYz4gX0NudHJsQmxrOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY2F0b3JfdHJhaXRzX3JlYmluZDxfQWxsb2MsIF9DbnRybEJsaz46OnR5cGUgX0EyOworICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfQTI+IF9EMjsKKyAgICBfQTIgX19hMihfX2EpOworICAgIHVuaXF1ZV9wdHI8X0NudHJsQmxrLCBfRDI+IF9faG9sZDIoX19hMi5hbGxvY2F0ZSgxKSwgX0QyKF9fYTIsIDEpKTsKKyAgICA6Om5ldyhzdGF0aWNfY2FzdDx2b2lkKj4oX1ZTVEQ6OmFkZHJlc3NvZigqX19ob2xkMi5nZXQoKSkpKQorICAgICAgICBfQ250cmxCbGsoX19hLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgc2hhcmVkX3B0cjxfVHA+IF9fcjsKKyAgICBfX3IuX19wdHJfID0gX19ob2xkMi5nZXQoKS0+Z2V0KCk7CisgICAgX19yLl9fY250cmxfID0gX1ZTVEQ6OmFkZHJlc3NvZigqX19ob2xkMi5yZWxlYXNlKCkpOworICAgIF9fci5fX2VuYWJsZV93ZWFrX3RoaXMoX19yLl9fcHRyXywgX19yLl9fcHRyXyk7CisgICAgcmV0dXJuIF9fcjsKK30KKworI2Vsc2UgIC8vIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitzaGFyZWRfcHRyPF9UcD4KK3NoYXJlZF9wdHI8X1RwPjo6bWFrZV9zaGFyZWQoKQoreworICAgIHN0YXRpY19hc3NlcnQoKGlzX2NvbnN0cnVjdGlibGU8X1RwPjo6dmFsdWUpLCAiQ2FuJ3QgY29uc3RydWN0IG9iamVjdCBpbiBtYWtlX3NoYXJlZCIgKTsKKyAgICB0eXBlZGVmIF9fc2hhcmVkX3B0cl9lbXBsYWNlPF9UcCwgYWxsb2NhdG9yPF9UcD4gPiBfQ250cmxCbGs7CisgICAgdHlwZWRlZiBhbGxvY2F0b3I8X0NudHJsQmxrPiBfQWxsb2MyOworICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfQWxsb2MyPiBfRDI7CisgICAgX0FsbG9jMiBfX2FsbG9jMjsKKyAgICB1bmlxdWVfcHRyPF9DbnRybEJsaywgX0QyPiBfX2hvbGQyKF9fYWxsb2MyLmFsbG9jYXRlKDEpLCBfRDIoX19hbGxvYzIsIDEpKTsKKyAgICA6Om5ldyhfX2hvbGQyLmdldCgpKSBfQ250cmxCbGsoX19hbGxvYzIpOworICAgIHNoYXJlZF9wdHI8X1RwPiBfX3I7CisgICAgX19yLl9fcHRyXyA9IF9faG9sZDIuZ2V0KCktPmdldCgpOworICAgIF9fci5fX2NudHJsXyA9IF9faG9sZDIucmVsZWFzZSgpOworICAgIF9fci5fX2VuYWJsZV93ZWFrX3RoaXMoX19yLl9fcHRyXywgX19yLl9fcHRyXyk7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGU8Y2xhc3MgX0EwPgorc2hhcmVkX3B0cjxfVHA+CitzaGFyZWRfcHRyPF9UcD46Om1ha2Vfc2hhcmVkKF9BMCYgX19hMCkKK3sKKyAgICBzdGF0aWNfYXNzZXJ0KChpc19jb25zdHJ1Y3RpYmxlPF9UcCwgX0EwPjo6dmFsdWUpLCAiQ2FuJ3QgY29uc3RydWN0IG9iamVjdCBpbiBtYWtlX3NoYXJlZCIgKTsKKyAgICB0eXBlZGVmIF9fc2hhcmVkX3B0cl9lbXBsYWNlPF9UcCwgYWxsb2NhdG9yPF9UcD4gPiBfQ250cmxCbGs7CisgICAgdHlwZWRlZiBhbGxvY2F0b3I8X0NudHJsQmxrPiBfQWxsb2MyOworICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfQWxsb2MyPiBfRDI7CisgICAgX0FsbG9jMiBfX2FsbG9jMjsKKyAgICB1bmlxdWVfcHRyPF9DbnRybEJsaywgX0QyPiBfX2hvbGQyKF9fYWxsb2MyLmFsbG9jYXRlKDEpLCBfRDIoX19hbGxvYzIsIDEpKTsKKyAgICA6Om5ldyhfX2hvbGQyLmdldCgpKSBfQ250cmxCbGsoX19hbGxvYzIsIF9fYTApOworICAgIHNoYXJlZF9wdHI8X1RwPiBfX3I7CisgICAgX19yLl9fcHRyXyA9IF9faG9sZDIuZ2V0KCktPmdldCgpOworICAgIF9fci5fX2NudHJsXyA9IF9faG9sZDIucmVsZWFzZSgpOworICAgIF9fci5fX2VuYWJsZV93ZWFrX3RoaXMoX19yLl9fcHRyXywgX19yLl9fcHRyXyk7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGU8Y2xhc3MgX0EwLCBjbGFzcyBfQTE+CitzaGFyZWRfcHRyPF9UcD4KK3NoYXJlZF9wdHI8X1RwPjo6bWFrZV9zaGFyZWQoX0EwJiBfX2EwLCBfQTEmIF9fYTEpCit7CisgICAgc3RhdGljX2Fzc2VydCgoaXNfY29uc3RydWN0aWJsZTxfVHAsIF9BMCwgX0ExPjo6dmFsdWUpLCAiQ2FuJ3QgY29uc3RydWN0IG9iamVjdCBpbiBtYWtlX3NoYXJlZCIgKTsKKyAgICB0eXBlZGVmIF9fc2hhcmVkX3B0cl9lbXBsYWNlPF9UcCwgYWxsb2NhdG9yPF9UcD4gPiBfQ250cmxCbGs7CisgICAgdHlwZWRlZiBhbGxvY2F0b3I8X0NudHJsQmxrPiBfQWxsb2MyOworICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfQWxsb2MyPiBfRDI7CisgICAgX0FsbG9jMiBfX2FsbG9jMjsKKyAgICB1bmlxdWVfcHRyPF9DbnRybEJsaywgX0QyPiBfX2hvbGQyKF9fYWxsb2MyLmFsbG9jYXRlKDEpLCBfRDIoX19hbGxvYzIsIDEpKTsKKyAgICA6Om5ldyhfX2hvbGQyLmdldCgpKSBfQ250cmxCbGsoX19hbGxvYzIsIF9fYTAsIF9fYTEpOworICAgIHNoYXJlZF9wdHI8X1RwPiBfX3I7CisgICAgX19yLl9fcHRyXyA9IF9faG9sZDIuZ2V0KCktPmdldCgpOworICAgIF9fci5fX2NudHJsXyA9IF9faG9sZDIucmVsZWFzZSgpOworICAgIF9fci5fX2VuYWJsZV93ZWFrX3RoaXMoX19yLl9fcHRyXywgX19yLl9fcHRyXyk7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGU8Y2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KK3NoYXJlZF9wdHI8X1RwPgorc2hhcmVkX3B0cjxfVHA+OjptYWtlX3NoYXJlZChfQTAmIF9fYTAsIF9BMSYgX19hMSwgX0EyJiBfX2EyKQoreworICAgIHN0YXRpY19hc3NlcnQoKGlzX2NvbnN0cnVjdGlibGU8X1RwLCBfQTAsIF9BMSwgX0EyPjo6dmFsdWUpLCAiQ2FuJ3QgY29uc3RydWN0IG9iamVjdCBpbiBtYWtlX3NoYXJlZCIgKTsKKyAgICB0eXBlZGVmIF9fc2hhcmVkX3B0cl9lbXBsYWNlPF9UcCwgYWxsb2NhdG9yPF9UcD4gPiBfQ250cmxCbGs7CisgICAgdHlwZWRlZiBhbGxvY2F0b3I8X0NudHJsQmxrPiBfQWxsb2MyOworICAgIHR5cGVkZWYgX19hbGxvY2F0b3JfZGVzdHJ1Y3RvcjxfQWxsb2MyPiBfRDI7CisgICAgX0FsbG9jMiBfX2FsbG9jMjsKKyAgICB1bmlxdWVfcHRyPF9DbnRybEJsaywgX0QyPiBfX2hvbGQyKF9fYWxsb2MyLmFsbG9jYXRlKDEpLCBfRDIoX19hbGxvYzIsIDEpKTsKKyAgICA6Om5ldyhfX2hvbGQyLmdldCgpKSBfQ250cmxCbGsoX19hbGxvYzIsIF9fYTAsIF9fYTEsIF9fYTIpOworICAgIHNoYXJlZF9wdHI8X1RwPiBfX3I7CisgICAgX19yLl9fcHRyXyA9IF9faG9sZDIuZ2V0KCktPmdldCgpOworICAgIF9fci5fX2NudHJsXyA9IF9faG9sZDIucmVsZWFzZSgpOworICAgIF9fci5fX2VuYWJsZV93ZWFrX3RoaXMoX19yLl9fcHRyXywgX19yLl9fcHRyXyk7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGU8Y2xhc3MgX0FsbG9jPgorc2hhcmVkX3B0cjxfVHA+CitzaGFyZWRfcHRyPF9UcD46OmFsbG9jYXRlX3NoYXJlZChjb25zdCBfQWxsb2MmIF9fYSkKK3sKKyAgICBzdGF0aWNfYXNzZXJ0KChpc19jb25zdHJ1Y3RpYmxlPF9UcD46OnZhbHVlKSwgIkNhbid0IGNvbnN0cnVjdCBvYmplY3QgaW4gYWxsb2NhdGVfc2hhcmVkIiApOworICAgIHR5cGVkZWYgX19zaGFyZWRfcHRyX2VtcGxhY2U8X1RwLCBfQWxsb2M+IF9DbnRybEJsazsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NhdG9yX3RyYWl0c19yZWJpbmQ8X0FsbG9jLCBfQ250cmxCbGs+Ojp0eXBlIF9BbGxvYzI7CisgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9BbGxvYzI+IF9EMjsKKyAgICBfQWxsb2MyIF9fYWxsb2MyKF9fYSk7CisgICAgdW5pcXVlX3B0cjxfQ250cmxCbGssIF9EMj4gX19ob2xkMihfX2FsbG9jMi5hbGxvY2F0ZSgxKSwgX0QyKF9fYWxsb2MyLCAxKSk7CisgICAgOjpuZXcoc3RhdGljX2Nhc3Q8dm9pZCo+KF9WU1REOjphZGRyZXNzb2YoKl9faG9sZDIuZ2V0KCkpKSkKKyAgICAgICAgX0NudHJsQmxrKF9fYSk7CisgICAgc2hhcmVkX3B0cjxfVHA+IF9fcjsKKyAgICBfX3IuX19wdHJfID0gX19ob2xkMi5nZXQoKS0+Z2V0KCk7CisgICAgX19yLl9fY250cmxfID0gX1ZTVEQ6OmFkZHJlc3NvZigqX19ob2xkMi5yZWxlYXNlKCkpOworICAgIF9fci5fX2VuYWJsZV93ZWFrX3RoaXMoX19yLl9fcHRyXywgX19yLl9fcHRyXyk7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGU8Y2xhc3MgX0FsbG9jLCBjbGFzcyBfQTA+CitzaGFyZWRfcHRyPF9UcD4KK3NoYXJlZF9wdHI8X1RwPjo6YWxsb2NhdGVfc2hhcmVkKGNvbnN0IF9BbGxvYyYgX19hLCBfQTAmIF9fYTApCit7CisgICAgc3RhdGljX2Fzc2VydCgoaXNfY29uc3RydWN0aWJsZTxfVHAsIF9BMD46OnZhbHVlKSwgIkNhbid0IGNvbnN0cnVjdCBvYmplY3QgaW4gYWxsb2NhdGVfc2hhcmVkIiApOworICAgIHR5cGVkZWYgX19zaGFyZWRfcHRyX2VtcGxhY2U8X1RwLCBfQWxsb2M+IF9DbnRybEJsazsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NhdG9yX3RyYWl0c19yZWJpbmQ8X0FsbG9jLCBfQ250cmxCbGs+Ojp0eXBlIF9BbGxvYzI7CisgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9BbGxvYzI+IF9EMjsKKyAgICBfQWxsb2MyIF9fYWxsb2MyKF9fYSk7CisgICAgdW5pcXVlX3B0cjxfQ250cmxCbGssIF9EMj4gX19ob2xkMihfX2FsbG9jMi5hbGxvY2F0ZSgxKSwgX0QyKF9fYWxsb2MyLCAxKSk7CisgICAgOjpuZXcoc3RhdGljX2Nhc3Q8dm9pZCo+KF9WU1REOjphZGRyZXNzb2YoKl9faG9sZDIuZ2V0KCkpKSkKKyAgICAgICAgX0NudHJsQmxrKF9fYSwgX19hMCk7CisgICAgc2hhcmVkX3B0cjxfVHA+IF9fcjsKKyAgICBfX3IuX19wdHJfID0gX19ob2xkMi5nZXQoKS0+Z2V0KCk7CisgICAgX19yLl9fY250cmxfID0gX1ZTVEQ6OmFkZHJlc3NvZigqX19ob2xkMi5yZWxlYXNlKCkpOworICAgIF9fci5fX2VuYWJsZV93ZWFrX3RoaXMoX19yLl9fcHRyXywgX19yLl9fcHRyXyk7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGU8Y2xhc3MgX0FsbG9jLCBjbGFzcyBfQTAsIGNsYXNzIF9BMT4KK3NoYXJlZF9wdHI8X1RwPgorc2hhcmVkX3B0cjxfVHA+OjphbGxvY2F0ZV9zaGFyZWQoY29uc3QgX0FsbG9jJiBfX2EsIF9BMCYgX19hMCwgX0ExJiBfX2ExKQoreworICAgIHN0YXRpY19hc3NlcnQoKGlzX2NvbnN0cnVjdGlibGU8X1RwLCBfQTAsIF9BMT46OnZhbHVlKSwgIkNhbid0IGNvbnN0cnVjdCBvYmplY3QgaW4gYWxsb2NhdGVfc2hhcmVkIiApOworICAgIHR5cGVkZWYgX19zaGFyZWRfcHRyX2VtcGxhY2U8X1RwLCBfQWxsb2M+IF9DbnRybEJsazsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NhdG9yX3RyYWl0c19yZWJpbmQ8X0FsbG9jLCBfQ250cmxCbGs+Ojp0eXBlIF9BbGxvYzI7CisgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9BbGxvYzI+IF9EMjsKKyAgICBfQWxsb2MyIF9fYWxsb2MyKF9fYSk7CisgICAgdW5pcXVlX3B0cjxfQ250cmxCbGssIF9EMj4gX19ob2xkMihfX2FsbG9jMi5hbGxvY2F0ZSgxKSwgX0QyKF9fYWxsb2MyLCAxKSk7CisgICAgOjpuZXcoc3RhdGljX2Nhc3Q8dm9pZCo+KF9WU1REOjphZGRyZXNzb2YoKl9faG9sZDIuZ2V0KCkpKSkKKyAgICAgICAgX0NudHJsQmxrKF9fYSwgX19hMCwgX19hMSk7CisgICAgc2hhcmVkX3B0cjxfVHA+IF9fcjsKKyAgICBfX3IuX19wdHJfID0gX19ob2xkMi5nZXQoKS0+Z2V0KCk7CisgICAgX19yLl9fY250cmxfID0gX1ZTVEQ6OmFkZHJlc3NvZigqX19ob2xkMi5yZWxlYXNlKCkpOworICAgIF9fci5fX2VuYWJsZV93ZWFrX3RoaXMoX19yLl9fcHRyXywgX19yLl9fcHRyXyk7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGU8Y2xhc3MgX0FsbG9jLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorc2hhcmVkX3B0cjxfVHA+CitzaGFyZWRfcHRyPF9UcD46OmFsbG9jYXRlX3NoYXJlZChjb25zdCBfQWxsb2MmIF9fYSwgX0EwJiBfX2EwLCBfQTEmIF9fYTEsIF9BMiYgX19hMikKK3sKKyAgICBzdGF0aWNfYXNzZXJ0KChpc19jb25zdHJ1Y3RpYmxlPF9UcCwgX0EwLCBfQTEsIF9BMj46OnZhbHVlKSwgIkNhbid0IGNvbnN0cnVjdCBvYmplY3QgaW4gYWxsb2NhdGVfc2hhcmVkIiApOworICAgIHR5cGVkZWYgX19zaGFyZWRfcHRyX2VtcGxhY2U8X1RwLCBfQWxsb2M+IF9DbnRybEJsazsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NhdG9yX3RyYWl0c19yZWJpbmQ8X0FsbG9jLCBfQ250cmxCbGs+Ojp0eXBlIF9BbGxvYzI7CisgICAgdHlwZWRlZiBfX2FsbG9jYXRvcl9kZXN0cnVjdG9yPF9BbGxvYzI+IF9EMjsKKyAgICBfQWxsb2MyIF9fYWxsb2MyKF9fYSk7CisgICAgdW5pcXVlX3B0cjxfQ250cmxCbGssIF9EMj4gX19ob2xkMihfX2FsbG9jMi5hbGxvY2F0ZSgxKSwgX0QyKF9fYWxsb2MyLCAxKSk7CisgICAgOjpuZXcoc3RhdGljX2Nhc3Q8dm9pZCo+KF9WU1REOjphZGRyZXNzb2YoKl9faG9sZDIuZ2V0KCkpKSkKKyAgICAgICAgX0NudHJsQmxrKF9fYSwgX19hMCwgX19hMSwgX19hMik7CisgICAgc2hhcmVkX3B0cjxfVHA+IF9fcjsKKyAgICBfX3IuX19wdHJfID0gX19ob2xkMi5nZXQoKS0+Z2V0KCk7CisgICAgX19yLl9fY250cmxfID0gX1ZTVEQ6OmFkZHJlc3NvZigqX19ob2xkMi5yZWxlYXNlKCkpOworICAgIF9fci5fX2VuYWJsZV93ZWFrX3RoaXMoX19yLl9fcHRyXywgX19yLl9fcHRyXyk7CisgICAgcmV0dXJuIF9fcjsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgorc2hhcmVkX3B0cjxfVHA+Ojp+c2hhcmVkX3B0cigpCit7CisgICAgaWYgKF9fY250cmxfKQorICAgICAgICBfX2NudHJsXy0+X19yZWxlYXNlX3NoYXJlZCgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUKK3NoYXJlZF9wdHI8X1RwPiYKK3NoYXJlZF9wdHI8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IHNoYXJlZF9wdHImIF9fcikgX05PRVhDRVBUCit7CisgICAgc2hhcmVkX3B0cihfX3IpLnN3YXAoKnRoaXMpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGU8Y2xhc3MgX1lwPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBpc19jb252ZXJ0aWJsZTxfWXAqLCB0eXBlbmFtZSBzaGFyZWRfcHRyPF9UcD46OmVsZW1lbnRfdHlwZSo+Ojp2YWx1ZSwKKyAgICBzaGFyZWRfcHRyPF9UcD4mCis+Ojp0eXBlCitzaGFyZWRfcHRyPF9UcD46Om9wZXJhdG9yPShjb25zdCBzaGFyZWRfcHRyPF9ZcD4mIF9fcikgX05PRVhDRVBUCit7CisgICAgc2hhcmVkX3B0cihfX3IpLnN3YXAoKnRoaXMpOworICAgIHJldHVybiAqdGhpczsKK30KKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUKK3NoYXJlZF9wdHI8X1RwPiYKK3NoYXJlZF9wdHI8X1RwPjo6b3BlcmF0b3I9KHNoYXJlZF9wdHImJiBfX3IpIF9OT0VYQ0VQVAoreworICAgIHNoYXJlZF9wdHIoX1ZTVEQ6Om1vdmUoX19yKSkuc3dhcCgqdGhpcyk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+Cit0ZW1wbGF0ZTxjbGFzcyBfWXA+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX2NvbnZlcnRpYmxlPF9ZcCosIHR5cGVuYW1lIHNoYXJlZF9wdHI8X1RwPjo6ZWxlbWVudF90eXBlKj46OnZhbHVlLAorICAgIHNoYXJlZF9wdHI8X1RwPiYKKz46OnR5cGUKK3NoYXJlZF9wdHI8X1RwPjo6b3BlcmF0b3I9KHNoYXJlZF9wdHI8X1lwPiYmIF9fcikKK3sKKyAgICBzaGFyZWRfcHRyKF9WU1REOjptb3ZlKF9fcikpLnN3YXAoKnRoaXMpOworICAgIHJldHVybiAqdGhpczsKK30KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA8PSAxNCB8fCBkZWZpbmVkKF9MSUJDUFBfRU5BQkxFX0NYWDE3X1JFTU9WRURfQVVUT19QVFIpCit0ZW1wbGF0ZTxjbGFzcyBfVHA+Cit0ZW1wbGF0ZTxjbGFzcyBfWXA+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgICFpc19hcnJheTxfWXA+Ojp2YWx1ZSAmJgorICAgIGlzX2NvbnZlcnRpYmxlPF9ZcCosIHR5cGVuYW1lIHNoYXJlZF9wdHI8X1RwPjo6ZWxlbWVudF90eXBlKj46OnZhbHVlLAorICAgIHNoYXJlZF9wdHI8X1RwPgorPjo6dHlwZSYKK3NoYXJlZF9wdHI8X1RwPjo6b3BlcmF0b3I9KGF1dG9fcHRyPF9ZcD4mJiBfX3IpCit7CisgICAgc2hhcmVkX3B0cihfVlNURDo6bW92ZShfX3IpKS5zd2FwKCp0aGlzKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisjZW5kaWYKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9ZcCwgY2xhc3MgX0RwPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICAhaXNfYXJyYXk8X1lwPjo6dmFsdWUgJiYKKyAgICBpc19jb252ZXJ0aWJsZTx0eXBlbmFtZSB1bmlxdWVfcHRyPF9ZcCwgX0RwPjo6cG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzaGFyZWRfcHRyPF9UcD46OmVsZW1lbnRfdHlwZSo+Ojp2YWx1ZSwKKyAgICBzaGFyZWRfcHRyPF9UcD4mCis+Ojp0eXBlCitzaGFyZWRfcHRyPF9UcD46Om9wZXJhdG9yPSh1bmlxdWVfcHRyPF9ZcCwgX0RwPiYmIF9fcikKK3sKKyAgICBzaGFyZWRfcHRyKF9WU1REOjptb3ZlKF9fcikpLnN3YXAoKnRoaXMpOworICAgIHJldHVybiAqdGhpczsKK30KKworI2Vsc2UgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPD0gMTQgfHwgZGVmaW5lZChfTElCQ1BQX0VOQUJMRV9DWFgxN19SRU1PVkVEX0FVVE9fUFRSKQordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGU8Y2xhc3MgX1lwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgICFpc19hcnJheTxfWXA+Ojp2YWx1ZSAmJgorICAgIGlzX2NvbnZlcnRpYmxlPF9ZcCosIHR5cGVuYW1lIHNoYXJlZF9wdHI8X1RwPjo6ZWxlbWVudF90eXBlKj46OnZhbHVlLAorICAgIHNoYXJlZF9wdHI8X1RwPiYKKz46OnR5cGUKK3NoYXJlZF9wdHI8X1RwPjo6b3BlcmF0b3I9KGF1dG9fcHRyPF9ZcD4gX19yKQoreworICAgIHNoYXJlZF9wdHIoX19yKS5zd2FwKCp0aGlzKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisjZW5kaWYKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9ZcCwgY2xhc3MgX0RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgICFpc19hcnJheTxfWXA+Ojp2YWx1ZSAmJgorICAgIGlzX2NvbnZlcnRpYmxlPHR5cGVuYW1lIHVuaXF1ZV9wdHI8X1lwLCBfRHA+Ojpwb2ludGVyLAorICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHNoYXJlZF9wdHI8X1RwPjo6ZWxlbWVudF90eXBlKj46OnZhbHVlLAorICAgIHNoYXJlZF9wdHI8X1RwPiYKKz46OnR5cGUKK3NoYXJlZF9wdHI8X1RwPjo6b3BlcmF0b3I9KHVuaXF1ZV9wdHI8X1lwLCBfRHA+IF9fcikKK3sKKyAgICBzaGFyZWRfcHRyKF9WU1REOjptb3ZlKF9fcikpLnN3YXAoKnRoaXMpOworICAgIHJldHVybiAqdGhpczsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUKK3ZvaWQKK3NoYXJlZF9wdHI8X1RwPjo6c3dhcChzaGFyZWRfcHRyJiBfX3IpIF9OT0VYQ0VQVAoreworICAgIF9WU1REOjpzd2FwKF9fcHRyXywgX19yLl9fcHRyXyk7CisgICAgX1ZTVEQ6OnN3YXAoX19jbnRybF8sIF9fci5fX2NudHJsXyk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZQordm9pZAorc2hhcmVkX3B0cjxfVHA+OjpyZXNldCgpIF9OT0VYQ0VQVAoreworICAgIHNoYXJlZF9wdHIoKS5zd2FwKCp0aGlzKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGU8Y2xhc3MgX1lwPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBpc19jb252ZXJ0aWJsZTxfWXAqLCB0eXBlbmFtZSBzaGFyZWRfcHRyPF9UcD46OmVsZW1lbnRfdHlwZSo+Ojp2YWx1ZSwKKyAgICB2b2lkCis+Ojp0eXBlCitzaGFyZWRfcHRyPF9UcD46OnJlc2V0KF9ZcCogX19wKQoreworICAgIHNoYXJlZF9wdHIoX19wKS5zd2FwKCp0aGlzKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGU8Y2xhc3MgX1lwLCBjbGFzcyBfRHA+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX2NvbnZlcnRpYmxlPF9ZcCosIHR5cGVuYW1lIHNoYXJlZF9wdHI8X1RwPjo6ZWxlbWVudF90eXBlKj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3NoYXJlZF9wdHI8X1RwPjo6cmVzZXQoX1lwKiBfX3AsIF9EcCBfX2QpCit7CisgICAgc2hhcmVkX3B0cihfX3AsIF9fZCkuc3dhcCgqdGhpcyk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK3RlbXBsYXRlPGNsYXNzIF9ZcCwgY2xhc3MgX0RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX2NvbnZlcnRpYmxlPF9ZcCosIHR5cGVuYW1lIHNoYXJlZF9wdHI8X1RwPjo6ZWxlbWVudF90eXBlKj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3NoYXJlZF9wdHI8X1RwPjo6cmVzZXQoX1lwKiBfX3AsIF9EcCBfX2QsIF9BbGxvYyBfX2EpCit7CisgICAgc2hhcmVkX3B0cihfX3AsIF9fZCwgX19hKS5zd2FwKCp0aGlzKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyAuLi5fQXJncz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICAhaXNfYXJyYXk8X1RwPjo6dmFsdWUsCisgICAgc2hhcmVkX3B0cjxfVHA+Cis+Ojp0eXBlCittYWtlX3NoYXJlZChfQXJncyYmIC4uLl9fYXJncykKK3sKKyAgICByZXR1cm4gc2hhcmVkX3B0cjxfVHA+OjptYWtlX3NoYXJlZChfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyAuLi5fQXJncz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICAhaXNfYXJyYXk8X1RwPjo6dmFsdWUsCisgICAgc2hhcmVkX3B0cjxfVHA+Cis+Ojp0eXBlCithbGxvY2F0ZV9zaGFyZWQoY29uc3QgX0FsbG9jJiBfX2EsIF9BcmdzJiYgLi4uX19hcmdzKQoreworICAgIHJldHVybiBzaGFyZWRfcHRyPF9UcD46OmFsbG9jYXRlX3NoYXJlZChfX2EsIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKK30KKworI2Vsc2UgIC8vIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorc2hhcmVkX3B0cjxfVHA+CittYWtlX3NoYXJlZCgpCit7CisgICAgcmV0dXJuIHNoYXJlZF9wdHI8X1RwPjo6bWFrZV9zaGFyZWQoKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQTA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorc2hhcmVkX3B0cjxfVHA+CittYWtlX3NoYXJlZChfQTAmIF9fYTApCit7CisgICAgcmV0dXJuIHNoYXJlZF9wdHI8X1RwPjo6bWFrZV9zaGFyZWQoX19hMCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0EwLCBjbGFzcyBfQTE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorc2hhcmVkX3B0cjxfVHA+CittYWtlX3NoYXJlZChfQTAmIF9fYTAsIF9BMSYgX19hMSkKK3sKKyAgICByZXR1cm4gc2hhcmVkX3B0cjxfVHA+OjptYWtlX3NoYXJlZChfX2EwLCBfX2ExKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3NoYXJlZF9wdHI8X1RwPgorbWFrZV9zaGFyZWQoX0EwJiBfX2EwLCBfQTEmIF9fYTEsIF9BMiYgX19hMikKK3sKKyAgICByZXR1cm4gc2hhcmVkX3B0cjxfVHA+OjptYWtlX3NoYXJlZChfX2EwLCBfX2ExLCBfX2EyKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorc2hhcmVkX3B0cjxfVHA+CithbGxvY2F0ZV9zaGFyZWQoY29uc3QgX0FsbG9jJiBfX2EpCit7CisgICAgcmV0dXJuIHNoYXJlZF9wdHI8X1RwPjo6YWxsb2NhdGVfc2hhcmVkKF9fYSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBjbGFzcyBfQTA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorc2hhcmVkX3B0cjxfVHA+CithbGxvY2F0ZV9zaGFyZWQoY29uc3QgX0FsbG9jJiBfX2EsIF9BMCYgX19hMCkKK3sKKyAgICByZXR1cm4gc2hhcmVkX3B0cjxfVHA+OjphbGxvY2F0ZV9zaGFyZWQoX19hLCBfX2EwKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3NoYXJlZF9wdHI8X1RwPgorYWxsb2NhdGVfc2hhcmVkKGNvbnN0IF9BbGxvYyYgX19hLCBfQTAmIF9fYTAsIF9BMSYgX19hMSkKK3sKKyAgICByZXR1cm4gc2hhcmVkX3B0cjxfVHA+OjphbGxvY2F0ZV9zaGFyZWQoX19hLCBfX2EwLCBfX2ExKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9BMCwgY2xhc3MgX0ExLCBjbGFzcyBfQTI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorc2hhcmVkX3B0cjxfVHA+CithbGxvY2F0ZV9zaGFyZWQoY29uc3QgX0FsbG9jJiBfX2EsIF9BMCYgX19hMCwgX0ExJiBfX2ExLCBfQTImIF9fYTIpCit7CisgICAgcmV0dXJuIHNoYXJlZF9wdHI8X1RwPjo6YWxsb2NhdGVfc2hhcmVkKF9fYSwgX19hMCwgX19hMSwgX19hMik7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCisKK3RlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3Qgc2hhcmVkX3B0cjxfVHA+JiBfX3gsIGNvbnN0IHNoYXJlZF9wdHI8X1VwPiYgX195KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX194LmdldCgpID09IF9feS5nZXQoKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9feCwgY29uc3Qgc2hhcmVkX3B0cjxfVXA+JiBfX3kpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjwoY29uc3Qgc2hhcmVkX3B0cjxfVHA+JiBfX3gsIGNvbnN0IHNoYXJlZF9wdHI8X1VwPiYgX195KSBfTk9FWENFUFQKK3sKKyNpZiBfTElCQ1BQX1NURF9WRVIgPD0gMTEKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9UcCosIF9VcCo+Ojp0eXBlIF9WcDsKKyAgICByZXR1cm4gbGVzczxfVnA+KCkoX194LmdldCgpLCBfX3kuZ2V0KCkpOworI2Vsc2UKKyAgICByZXR1cm4gbGVzczw+KCkoX194LmdldCgpLCBfX3kuZ2V0KCkpOworI2VuZGlmCisKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+KGNvbnN0IHNoYXJlZF9wdHI8X1RwPiYgX194LCBjb25zdCBzaGFyZWRfcHRyPF9VcD4mIF9feSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9feSA8IF9feDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8PShjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9feCwgY29uc3Qgc2hhcmVkX3B0cjxfVXA+JiBfX3kpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiAhKF9feSA8IF9feCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPj0oY29uc3Qgc2hhcmVkX3B0cjxfVHA+JiBfX3gsIGNvbnN0IHNoYXJlZF9wdHI8X1VwPiYgX195KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gIShfX3ggPCBfX3kpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9feCwgbnVsbHB0cl90KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gIV9feDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPT0obnVsbHB0cl90LCBjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9feCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuICFfX3g7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KGNvbnN0IHNoYXJlZF9wdHI8X1RwPiYgX194LCBudWxscHRyX3QpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxib29sPihfX3gpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShudWxscHRyX3QsIGNvbnN0IHNoYXJlZF9wdHI8X1RwPiYgX194KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX194KTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPChjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9feCwgbnVsbHB0cl90KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gbGVzczxfVHAqPigpKF9feC5nZXQoKSwgbnVsbHB0cik7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjwobnVsbHB0cl90LCBjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9feCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIGxlc3M8X1RwKj4oKShudWxscHRyLCBfX3guZ2V0KCkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+KGNvbnN0IHNoYXJlZF9wdHI8X1RwPiYgX194LCBudWxscHRyX3QpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBudWxscHRyIDwgX194OworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+KG51bGxwdHJfdCwgY29uc3Qgc2hhcmVkX3B0cjxfVHA+JiBfX3gpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX3ggPCBudWxscHRyOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8PShjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9feCwgbnVsbHB0cl90KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gIShudWxscHRyIDwgX194KTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPD0obnVsbHB0cl90LCBjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9feCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuICEoX194IDwgbnVsbHB0cik7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj49KGNvbnN0IHNoYXJlZF9wdHI8X1RwPiYgX194LCBudWxscHRyX3QpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiAhKF9feCA8IG51bGxwdHIpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+PShudWxscHRyX3QsIGNvbnN0IHNoYXJlZF9wdHI8X1RwPiYgX194KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gIShudWxscHRyIDwgX194KTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3N3YXAoc2hhcmVkX3B0cjxfVHA+JiBfX3gsIHNoYXJlZF9wdHI8X1RwPiYgX195KSBfTk9FWENFUFQKK3sKKyAgICBfX3guc3dhcChfX3kpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICAhaXNfYXJyYXk8X1RwPjo6dmFsdWUgJiYgIWlzX2FycmF5PF9VcD46OnZhbHVlLAorICAgIHNoYXJlZF9wdHI8X1RwPgorPjo6dHlwZQorc3RhdGljX3BvaW50ZXJfY2FzdChjb25zdCBzaGFyZWRfcHRyPF9VcD4mIF9fcikgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIHNoYXJlZF9wdHI8X1RwPihfX3IsIHN0YXRpY19jYXN0PF9UcCo+KF9fci5nZXQoKSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICAhaXNfYXJyYXk8X1RwPjo6dmFsdWUgJiYgIWlzX2FycmF5PF9VcD46OnZhbHVlLAorICAgIHNoYXJlZF9wdHI8X1RwPgorPjo6dHlwZQorZHluYW1pY19wb2ludGVyX2Nhc3QoY29uc3Qgc2hhcmVkX3B0cjxfVXA+JiBfX3IpIF9OT0VYQ0VQVAoreworICAgIF9UcCogX19wID0gZHluYW1pY19jYXN0PF9UcCo+KF9fci5nZXQoKSk7CisgICAgcmV0dXJuIF9fcCA/IHNoYXJlZF9wdHI8X1RwPihfX3IsIF9fcCkgOiBzaGFyZWRfcHRyPF9UcD4oKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+Cit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBpc19hcnJheTxfVHA+Ojp2YWx1ZSA9PSBpc19hcnJheTxfVXA+Ojp2YWx1ZSwKKyAgICBzaGFyZWRfcHRyPF9UcD4KKz46OnR5cGUKK2NvbnN0X3BvaW50ZXJfY2FzdChjb25zdCBzaGFyZWRfcHRyPF9VcD4mIF9fcikgX05PRVhDRVBUCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfZXh0ZW50PF9UcD46OnR5cGUgX1JUcDsKKyAgICByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KF9fciwgY29uc3RfY2FzdDxfUlRwKj4oX19yLmdldCgpKSk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9OT19SVFRJCisKK3RlbXBsYXRlPGNsYXNzIF9EcCwgY2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19EcCoKK2dldF9kZWxldGVyKGNvbnN0IHNoYXJlZF9wdHI8X1RwPiYgX19wKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19wLnRlbXBsYXRlIF9fZ2V0X2RlbGV0ZXI8X0RwPigpOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fUlRUSQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB3ZWFrX3B0cgoreworcHVibGljOgorICAgIHR5cGVkZWYgX1RwIGVsZW1lbnRfdHlwZTsKK3ByaXZhdGU6CisgICAgZWxlbWVudF90eXBlKiAgICAgICAgX19wdHJfOworICAgIF9fc2hhcmVkX3dlYWtfY291bnQqIF9fY250cmxfOworCitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9MSUJDUFBfQ09OU1RFWFBSIHdlYWtfcHRyKCkgX05PRVhDRVBUOworICAgIHRlbXBsYXRlPGNsYXNzIF9ZcD4gX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB3ZWFrX3B0cihzaGFyZWRfcHRyPF9ZcD4gY29uc3QmIF9fciwKKyAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8X1lwKiwgX1RwKj46OnZhbHVlLCBfX25hdCo+Ojp0eXBlID0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgd2Vha19wdHIod2Vha19wdHIgY29uc3QmIF9fcikgX05PRVhDRVBUOworICAgIHRlbXBsYXRlPGNsYXNzIF9ZcD4gX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB3ZWFrX3B0cih3ZWFrX3B0cjxfWXA+IGNvbnN0JiBfX3IsCisgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPF9ZcCosIF9UcCo+Ojp2YWx1ZSwgX19uYXQqPjo6dHlwZSA9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgX05PRVhDRVBUOworCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHdlYWtfcHRyKHdlYWtfcHRyJiYgX19yKSBfTk9FWENFUFQ7CisgICAgdGVtcGxhdGU8Y2xhc3MgX1lwPiBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHdlYWtfcHRyKHdlYWtfcHRyPF9ZcD4mJiBfX3IsCisgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPF9ZcCosIF9UcCo+Ojp2YWx1ZSwgX19uYXQqPjo6dHlwZSA9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgX05PRVhDRVBUOworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgIH53ZWFrX3B0cigpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHdlYWtfcHRyJiBvcGVyYXRvcj0od2Vha19wdHIgY29uc3QmIF9fcikgX05PRVhDRVBUOworICAgIHRlbXBsYXRlPGNsYXNzIF9ZcD4KKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIGlzX2NvbnZlcnRpYmxlPF9ZcCosIGVsZW1lbnRfdHlwZSo+Ojp2YWx1ZSwKKyAgICAgICAgICAgIHdlYWtfcHRyJgorICAgICAgICA+Ojp0eXBlCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgb3BlcmF0b3I9KHdlYWtfcHRyPF9ZcD4gY29uc3QmIF9fcikgX05PRVhDRVBUOworCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgd2Vha19wdHImIG9wZXJhdG9yPSh3ZWFrX3B0ciYmIF9fcikgX05PRVhDRVBUOworICAgIHRlbXBsYXRlPGNsYXNzIF9ZcD4KKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIGlzX2NvbnZlcnRpYmxlPF9ZcCosIGVsZW1lbnRfdHlwZSo+Ojp2YWx1ZSwKKyAgICAgICAgICAgIHdlYWtfcHRyJgorICAgICAgICA+Ojp0eXBlCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgb3BlcmF0b3I9KHdlYWtfcHRyPF9ZcD4mJiBfX3IpIF9OT0VYQ0VQVDsKKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworCisgICAgdGVtcGxhdGU8Y2xhc3MgX1lwPgorICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgaXNfY29udmVydGlibGU8X1lwKiwgZWxlbWVudF90eXBlKj46OnZhbHVlLAorICAgICAgICAgICAgd2Vha19wdHImCisgICAgICAgID46OnR5cGUKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBvcGVyYXRvcj0oc2hhcmVkX3B0cjxfWXA+IGNvbnN0JiBfX3IpIF9OT0VYQ0VQVDsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAod2Vha19wdHImIF9fcikgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHJlc2V0KCkgX05PRVhDRVBUOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGxvbmcgdXNlX2NvdW50KCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19jbnRybF8gPyBfX2NudHJsXy0+dXNlX2NvdW50KCkgOiAwO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBleHBpcmVkKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19jbnRybF8gPT0gMCB8fCBfX2NudHJsXy0+dXNlX2NvdW50KCkgPT0gMDt9CisgICAgc2hhcmVkX3B0cjxfVHA+IGxvY2soKSBjb25zdCBfTk9FWENFUFQ7CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VwPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgb3duZXJfYmVmb3JlKGNvbnN0IHNoYXJlZF9wdHI8X1VwPiYgX19yKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2NudHJsXyA8IF9fci5fX2NudHJsXzt9CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VwPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgb3duZXJfYmVmb3JlKGNvbnN0IHdlYWtfcHRyPF9VcD4mIF9fcikgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19jbnRybF8gPCBfX3IuX19jbnRybF87fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHdlYWtfcHRyOworICAgIHRlbXBsYXRlIDxjbGFzcyBfVXA+IGZyaWVuZCBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBzaGFyZWRfcHRyOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lCitfTElCQ1BQX0NPTlNURVhQUgord2Vha19wdHI8X1RwPjo6d2Vha19wdHIoKSBfTk9FWENFUFQKKyAgICA6IF9fcHRyXygwKSwKKyAgICAgIF9fY250cmxfKDApCit7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZQord2Vha19wdHI8X1RwPjo6d2Vha19wdHIod2Vha19wdHIgY29uc3QmIF9fcikgX05PRVhDRVBUCisgICAgOiBfX3B0cl8oX19yLl9fcHRyXyksCisgICAgICBfX2NudHJsXyhfX3IuX19jbnRybF8pCit7CisgICAgaWYgKF9fY250cmxfKQorICAgICAgICBfX2NudHJsXy0+X19hZGRfd2VhaygpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+Cit0ZW1wbGF0ZTxjbGFzcyBfWXA+CitpbmxpbmUKK3dlYWtfcHRyPF9UcD46OndlYWtfcHRyKHNoYXJlZF9wdHI8X1lwPiBjb25zdCYgX19yLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPF9ZcCosIF9UcCo+Ojp2YWx1ZSwgX19uYXQqPjo6dHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICBfTk9FWENFUFQKKyAgICA6IF9fcHRyXyhfX3IuX19wdHJfKSwKKyAgICAgIF9fY250cmxfKF9fci5fX2NudHJsXykKK3sKKyAgICBpZiAoX19jbnRybF8pCisgICAgICAgIF9fY250cmxfLT5fX2FkZF93ZWFrKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK3RlbXBsYXRlPGNsYXNzIF9ZcD4KK2lubGluZQord2Vha19wdHI8X1RwPjo6d2Vha19wdHIod2Vha19wdHI8X1lwPiBjb25zdCYgX19yLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPF9ZcCosIF9UcCo+Ojp2YWx1ZSwgX19uYXQqPjo6dHlwZSkKKyAgICAgICAgIF9OT0VYQ0VQVAorICAgIDogX19wdHJfKF9fci5fX3B0cl8pLAorICAgICAgX19jbnRybF8oX19yLl9fY250cmxfKQoreworICAgIGlmIChfX2NudHJsXykKKyAgICAgICAgX19jbnRybF8tPl9fYWRkX3dlYWsoKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUKK3dlYWtfcHRyPF9UcD46OndlYWtfcHRyKHdlYWtfcHRyJiYgX19yKSBfTk9FWENFUFQKKyAgICA6IF9fcHRyXyhfX3IuX19wdHJfKSwKKyAgICAgIF9fY250cmxfKF9fci5fX2NudHJsXykKK3sKKyAgICBfX3IuX19wdHJfID0gMDsKKyAgICBfX3IuX19jbnRybF8gPSAwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+Cit0ZW1wbGF0ZTxjbGFzcyBfWXA+CitpbmxpbmUKK3dlYWtfcHRyPF9UcD46OndlYWtfcHRyKHdlYWtfcHRyPF9ZcD4mJiBfX3IsCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8X1lwKiwgX1RwKj46OnZhbHVlLCBfX25hdCo+Ojp0eXBlKQorICAgICAgICAgX05PRVhDRVBUCisgICAgOiBfX3B0cl8oX19yLl9fcHRyXyksCisgICAgICBfX2NudHJsXyhfX3IuX19jbnRybF8pCit7CisgICAgX19yLl9fcHRyXyA9IDA7CisgICAgX19yLl9fY250cmxfID0gMDsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworCit0ZW1wbGF0ZTxjbGFzcyBfVHA+Cit3ZWFrX3B0cjxfVHA+Ojp+d2Vha19wdHIoKQoreworICAgIGlmIChfX2NudHJsXykKKyAgICAgICAgX19jbnRybF8tPl9fcmVsZWFzZV93ZWFrKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZQord2Vha19wdHI8X1RwPiYKK3dlYWtfcHRyPF9UcD46Om9wZXJhdG9yPSh3ZWFrX3B0ciBjb25zdCYgX19yKSBfTk9FWENFUFQKK3sKKyAgICB3ZWFrX3B0cihfX3IpLnN3YXAoKnRoaXMpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGU8Y2xhc3MgX1lwPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBpc19jb252ZXJ0aWJsZTxfWXAqLCBfVHAqPjo6dmFsdWUsCisgICAgd2Vha19wdHI8X1RwPiYKKz46OnR5cGUKK3dlYWtfcHRyPF9UcD46Om9wZXJhdG9yPSh3ZWFrX3B0cjxfWXA+IGNvbnN0JiBfX3IpIF9OT0VYQ0VQVAoreworICAgIHdlYWtfcHRyKF9fcikuc3dhcCgqdGhpcyk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZQord2Vha19wdHI8X1RwPiYKK3dlYWtfcHRyPF9UcD46Om9wZXJhdG9yPSh3ZWFrX3B0ciYmIF9fcikgX05PRVhDRVBUCit7CisgICAgd2Vha19wdHIoX1ZTVEQ6Om1vdmUoX19yKSkuc3dhcCgqdGhpcyk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+Cit0ZW1wbGF0ZTxjbGFzcyBfWXA+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX2NvbnZlcnRpYmxlPF9ZcCosIF9UcCo+Ojp2YWx1ZSwKKyAgICB3ZWFrX3B0cjxfVHA+JgorPjo6dHlwZQord2Vha19wdHI8X1RwPjo6b3BlcmF0b3I9KHdlYWtfcHRyPF9ZcD4mJiBfX3IpIF9OT0VYQ0VQVAoreworICAgIHdlYWtfcHRyKF9WU1REOjptb3ZlKF9fcikpLnN3YXAoKnRoaXMpOworICAgIHJldHVybiAqdGhpczsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworCit0ZW1wbGF0ZTxjbGFzcyBfVHA+Cit0ZW1wbGF0ZTxjbGFzcyBfWXA+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX2NvbnZlcnRpYmxlPF9ZcCosIF9UcCo+Ojp2YWx1ZSwKKyAgICB3ZWFrX3B0cjxfVHA+JgorPjo6dHlwZQord2Vha19wdHI8X1RwPjo6b3BlcmF0b3I9KHNoYXJlZF9wdHI8X1lwPiBjb25zdCYgX19yKSBfTk9FWENFUFQKK3sKKyAgICB3ZWFrX3B0cihfX3IpLnN3YXAoKnRoaXMpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lCit2b2lkCit3ZWFrX3B0cjxfVHA+Ojpzd2FwKHdlYWtfcHRyJiBfX3IpIF9OT0VYQ0VQVAoreworICAgIF9WU1REOjpzd2FwKF9fcHRyXywgX19yLl9fcHRyXyk7CisgICAgX1ZTVEQ6OnN3YXAoX19jbnRybF8sIF9fci5fX2NudHJsXyk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzd2FwKHdlYWtfcHRyPF9UcD4mIF9feCwgd2Vha19wdHI8X1RwPiYgX195KSBfTk9FWENFUFQKK3sKKyAgICBfX3guc3dhcChfX3kpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUKK3ZvaWQKK3dlYWtfcHRyPF9UcD46OnJlc2V0KCkgX05PRVhDRVBUCit7CisgICAgd2Vha19wdHIoKS5zd2FwKCp0aGlzKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgordGVtcGxhdGU8Y2xhc3MgX1lwPgorc2hhcmVkX3B0cjxfVHA+OjpzaGFyZWRfcHRyKGNvbnN0IHdlYWtfcHRyPF9ZcD4mIF9fciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8X1lwKiwgZWxlbWVudF90eXBlKj46OnZhbHVlLCBfX25hdD46OnR5cGUpCisgICAgOiBfX3B0cl8oX19yLl9fcHRyXyksCisgICAgICBfX2NudHJsXyhfX3IuX19jbnRybF8gPyBfX3IuX19jbnRybF8tPmxvY2soKSA6IF9fci5fX2NudHJsXykKK3sKKyAgICBpZiAoX19jbnRybF8gPT0gMCkKKyAgICAgICAgX190aHJvd19iYWRfd2Vha19wdHIoKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgorc2hhcmVkX3B0cjxfVHA+Cit3ZWFrX3B0cjxfVHA+Ojpsb2NrKCkgY29uc3QgX05PRVhDRVBUCit7CisgICAgc2hhcmVkX3B0cjxfVHA+IF9fcjsKKyAgICBfX3IuX19jbnRybF8gPSBfX2NudHJsXyA/IF9fY250cmxfLT5sb2NrKCkgOiBfX2NudHJsXzsKKyAgICBpZiAoX19yLl9fY250cmxfKQorICAgICAgICBfX3IuX19wdHJfID0gX19wdHJfOworICAgIHJldHVybiBfX3I7Cit9CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAordGVtcGxhdGUgPGNsYXNzIF9UcCA9IHZvaWQ+IHN0cnVjdCBvd25lcl9sZXNzOworI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBvd25lcl9sZXNzOworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgb3duZXJfbGVzczxzaGFyZWRfcHRyPF9UcD4gPgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPHNoYXJlZF9wdHI8X1RwPiwgc2hhcmVkX3B0cjxfVHA+LCBib29sPgoreworICAgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKHNoYXJlZF9wdHI8X1RwPiBjb25zdCYgX194LCBzaGFyZWRfcHRyPF9UcD4gY29uc3QmIF9feSkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX194Lm93bmVyX2JlZm9yZShfX3kpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKHNoYXJlZF9wdHI8X1RwPiBjb25zdCYgX194LCAgIHdlYWtfcHRyPF9UcD4gY29uc3QmIF9feSkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX194Lm93bmVyX2JlZm9yZShfX3kpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKCAgd2Vha19wdHI8X1RwPiBjb25zdCYgX194LCBzaGFyZWRfcHRyPF9UcD4gY29uc3QmIF9feSkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX194Lm93bmVyX2JlZm9yZShfX3kpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgb3duZXJfbGVzczx3ZWFrX3B0cjxfVHA+ID4KKyAgICA6IGJpbmFyeV9mdW5jdGlvbjx3ZWFrX3B0cjxfVHA+LCB3ZWFrX3B0cjxfVHA+LCBib29sPgoreworICAgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKCAgd2Vha19wdHI8X1RwPiBjb25zdCYgX194LCAgIHdlYWtfcHRyPF9UcD4gY29uc3QmIF9feSkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX194Lm93bmVyX2JlZm9yZShfX3kpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKHNoYXJlZF9wdHI8X1RwPiBjb25zdCYgX194LCAgIHdlYWtfcHRyPF9UcD4gY29uc3QmIF9feSkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX194Lm93bmVyX2JlZm9yZShfX3kpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKCAgd2Vha19wdHI8X1RwPiBjb25zdCYgX194LCBzaGFyZWRfcHRyPF9UcD4gY29uc3QmIF9feSkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX194Lm93bmVyX2JlZm9yZShfX3kpO30KK307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBvd25lcl9sZXNzPHZvaWQ+Cit7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yKCkoIHNoYXJlZF9wdHI8X1RwPiBjb25zdCYgX194LCBzaGFyZWRfcHRyPF9VcD4gY29uc3QmIF9feSkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX194Lm93bmVyX2JlZm9yZShfX3kpO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3IoKSggc2hhcmVkX3B0cjxfVHA+IGNvbnN0JiBfX3gsICAgd2Vha19wdHI8X1VwPiBjb25zdCYgX195KSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX3gub3duZXJfYmVmb3JlKF9feSk7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKCAgIHdlYWtfcHRyPF9UcD4gY29uc3QmIF9feCwgc2hhcmVkX3B0cjxfVXA+IGNvbnN0JiBfX3kpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9feC5vd25lcl9iZWZvcmUoX195KTt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yKCkoICAgd2Vha19wdHI8X1RwPiBjb25zdCYgX194LCAgIHdlYWtfcHRyPF9VcD4gY29uc3QmIF9feSkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX194Lm93bmVyX2JlZm9yZShfX3kpO30KKyAgICB0eXBlZGVmIHZvaWQgaXNfdHJhbnNwYXJlbnQ7Cit9OworI2VuZGlmCisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzCit7CisgICAgbXV0YWJsZSB3ZWFrX3B0cjxfVHA+IF9fd2Vha190aGlzXzsKK3Byb3RlY3RlZDoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSCisgICAgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMoKSBfTk9FWENFUFQge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMoZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMgY29uc3QmKSBfTk9FWENFUFQge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMmIG9wZXJhdG9yPShlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyBjb25zdCYpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgfmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzKCkge30KK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2hhcmVkX3B0cjxfVHA+IHNoYXJlZF9mcm9tX3RoaXMoKQorICAgICAgICB7cmV0dXJuIHNoYXJlZF9wdHI8X1RwPihfX3dlYWtfdGhpc18pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2hhcmVkX3B0cjxfVHAgY29uc3Q+IHNoYXJlZF9mcm9tX3RoaXMoKSBjb25zdAorICAgICAgICB7cmV0dXJuIHNoYXJlZF9wdHI8Y29uc3QgX1RwPihfX3dlYWtfdGhpc18pO30KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHdlYWtfcHRyPF9UcD4gd2Vha19mcm9tX3RoaXMoKSBfTk9FWENFUFQKKyAgICAgICB7IHJldHVybiBfX3dlYWtfdGhpc187IH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB3ZWFrX3B0cjxjb25zdCBfVHA+IHdlYWtfZnJvbV90aGlzKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHsgcmV0dXJuIF9fd2Vha190aGlzXzsgfQorI2VuZGlmIC8vIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPiBmcmllbmQgY2xhc3Mgc2hhcmVkX3B0cjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDxzaGFyZWRfcHRyPF9UcD4gPgoreworICAgIHR5cGVkZWYgc2hhcmVkX3B0cjxfVHA+ICAgICAgYXJndW1lbnRfdHlwZTsKKyAgICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgICAgIHJlc3VsdF90eXBlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoY29uc3QgYXJndW1lbnRfdHlwZSYgX19wdHIpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIGhhc2g8X1RwKj4oKShfX3B0ci5nZXQoKSk7CisgICAgfQorfTsKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfWXA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIHNoYXJlZF9wdHI8X1lwPiBjb25zdCYgX19wKTsKKworCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fQVRPTUlDX0hFQURFUikKKworY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBfX3NwX211dAoreworICAgIHZvaWQqIF9fbHg7CitwdWJsaWM6CisgICAgdm9pZCBsb2NrKCkgX05PRVhDRVBUOworICAgIHZvaWQgdW5sb2NrKCkgX05PRVhDRVBUOworCitwcml2YXRlOgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIF9fc3BfbXV0KHZvaWQqKSBfTk9FWENFUFQ7CisgICAgX19zcF9tdXQoY29uc3QgX19zcF9tdXQmKTsKKyAgICBfX3NwX211dCYgb3BlcmF0b3I9KGNvbnN0IF9fc3BfbXV0Jik7CisKKyAgICBmcmllbmQgX0xJQkNQUF9GVU5DX1ZJUyBfX3NwX211dCYgX19nZXRfc3BfbXV0KGNvbnN0IHZvaWQqKTsKK307CisKK19MSUJDUFBfRlVOQ19WSVMgX0xJQkNQUF9BVkFJTEFCSUxJVFlfQVRPTUlDX1NIQVJFRF9QVFIKK19fc3BfbXV0JiBfX2dldF9zcF9tdXQoY29uc3Qgdm9pZCopOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK2F0b21pY19pc19sb2NrX2ZyZWUoY29uc3Qgc2hhcmVkX3B0cjxfVHA+KikKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0FWQUlMQUJJTElUWV9BVE9NSUNfU0hBUkVEX1BUUgorc2hhcmVkX3B0cjxfVHA+CithdG9taWNfbG9hZChjb25zdCBzaGFyZWRfcHRyPF9UcD4qIF9fcCkKK3sKKyAgICBfX3NwX211dCYgX19tID0gX19nZXRfc3BfbXV0KF9fcCk7CisgICAgX19tLmxvY2soKTsKKyAgICBzaGFyZWRfcHRyPF9UcD4gX19xID0gKl9fcDsKKyAgICBfX20udW5sb2NrKCk7CisgICAgcmV0dXJuIF9fcTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0FWQUlMQUJJTElUWV9BVE9NSUNfU0hBUkVEX1BUUgorc2hhcmVkX3B0cjxfVHA+CithdG9taWNfbG9hZF9leHBsaWNpdChjb25zdCBzaGFyZWRfcHRyPF9UcD4qIF9fcCwgbWVtb3J5X29yZGVyKQoreworICAgIHJldHVybiBhdG9taWNfbG9hZChfX3ApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9BVkFJTEFCSUxJVFlfQVRPTUlDX1NIQVJFRF9QVFIKK3ZvaWQKK2F0b21pY19zdG9yZShzaGFyZWRfcHRyPF9UcD4qIF9fcCwgc2hhcmVkX3B0cjxfVHA+IF9fcikKK3sKKyAgICBfX3NwX211dCYgX19tID0gX19nZXRfc3BfbXV0KF9fcCk7CisgICAgX19tLmxvY2soKTsKKyAgICBfX3AtPnN3YXAoX19yKTsKKyAgICBfX20udW5sb2NrKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9BVkFJTEFCSUxJVFlfQVRPTUlDX1NIQVJFRF9QVFIKK3ZvaWQKK2F0b21pY19zdG9yZV9leHBsaWNpdChzaGFyZWRfcHRyPF9UcD4qIF9fcCwgc2hhcmVkX3B0cjxfVHA+IF9fciwgbWVtb3J5X29yZGVyKQoreworICAgIGF0b21pY19zdG9yZShfX3AsIF9fcik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0FWQUlMQUJJTElUWV9BVE9NSUNfU0hBUkVEX1BUUgorc2hhcmVkX3B0cjxfVHA+CithdG9taWNfZXhjaGFuZ2Uoc2hhcmVkX3B0cjxfVHA+KiBfX3AsIHNoYXJlZF9wdHI8X1RwPiBfX3IpCit7CisgICAgX19zcF9tdXQmIF9fbSA9IF9fZ2V0X3NwX211dChfX3ApOworICAgIF9fbS5sb2NrKCk7CisgICAgX19wLT5zd2FwKF9fcik7CisgICAgX19tLnVubG9jaygpOworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9BVkFJTEFCSUxJVFlfQVRPTUlDX1NIQVJFRF9QVFIKK3NoYXJlZF9wdHI8X1RwPgorYXRvbWljX2V4Y2hhbmdlX2V4cGxpY2l0KHNoYXJlZF9wdHI8X1RwPiogX19wLCBzaGFyZWRfcHRyPF9UcD4gX19yLCBtZW1vcnlfb3JkZXIpCit7CisgICAgcmV0dXJuIGF0b21pY19leGNoYW5nZShfX3AsIF9fcik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0FWQUlMQUJJTElUWV9BVE9NSUNfU0hBUkVEX1BUUgorYm9vbAorYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKHNoYXJlZF9wdHI8X1RwPiogX19wLCBzaGFyZWRfcHRyPF9UcD4qIF9fdiwgc2hhcmVkX3B0cjxfVHA+IF9fdykKK3sKKyAgICBzaGFyZWRfcHRyPF9UcD4gX190ZW1wOworICAgIF9fc3BfbXV0JiBfX20gPSBfX2dldF9zcF9tdXQoX19wKTsKKyAgICBfX20ubG9jaygpOworICAgIGlmIChfX3AtPl9fb3duZXJfZXF1aXZhbGVudCgqX192KSkKKyAgICB7CisgICAgICAgIF9WU1REOjpzd2FwKF9fdGVtcCwgKl9fcCk7CisgICAgICAgICpfX3AgPSBfX3c7CisgICAgICAgIF9fbS51bmxvY2soKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIF9WU1REOjpzd2FwKF9fdGVtcCwgKl9fdik7CisgICAgKl9fdiA9ICpfX3A7CisgICAgX19tLnVubG9jaygpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0FWQUlMQUJJTElUWV9BVE9NSUNfU0hBUkVEX1BUUgorYm9vbAorYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhayhzaGFyZWRfcHRyPF9UcD4qIF9fcCwgc2hhcmVkX3B0cjxfVHA+KiBfX3YsIHNoYXJlZF9wdHI8X1RwPiBfX3cpCit7CisgICAgcmV0dXJuIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX3AsIF9fdiwgX193KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0FWQUlMQUJJTElUWV9BVE9NSUNfU0hBUkVEX1BUUgorYm9vbAorYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nX2V4cGxpY2l0KHNoYXJlZF9wdHI8X1RwPiogX19wLCBzaGFyZWRfcHRyPF9UcD4qIF9fdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPF9UcD4gX193LCBtZW1vcnlfb3JkZXIsIG1lbW9yeV9vcmRlcikKK3sKKyAgICByZXR1cm4gYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9fcCwgX192LCBfX3cpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQVZBSUxBQklMSVRZX0FUT01JQ19TSEFSRURfUFRSCitib29sCithdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrX2V4cGxpY2l0KHNoYXJlZF9wdHI8X1RwPiogX19wLCBzaGFyZWRfcHRyPF9UcD4qIF9fdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxfVHA+IF9fdywgbWVtb3J5X29yZGVyLCBtZW1vcnlfb3JkZXIpCit7CisgICAgcmV0dXJuIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19wLCBfX3YsIF9fdyk7Cit9CisKKyNlbmRpZiAgLy8gIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fQVRPTUlDX0hFQURFUikKKworLy9lbnVtIGNsYXNzCisjaWYgZGVmaW5lZChfTElCQ1BQX0FCSV9QT0lOVEVSX1NBRkVUWV9FTlVNX1RZUEUpCisjIGlmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKK2VudW0gY2xhc3MgcG9pbnRlcl9zYWZldHkgOiB1bnNpZ25lZCBjaGFyIHsKKyAgcmVsYXhlZCwKKyAgcHJlZmVycmVkLAorICBzdHJpY3QKK307CisjIGVuZGlmCisjZWxzZQorc3RydWN0IF9MSUJDUFBfVFlQRV9WSVMgcG9pbnRlcl9zYWZldHkKK3sKKyAgICBlbnVtIF9fbHgKKyAgICB7CisgICAgICAgIHJlbGF4ZWQsCisgICAgICAgIHByZWZlcnJlZCwKKyAgICAgICAgc3RyaWN0CisgICAgfTsKKworICAgIF9fbHggX192XzsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwb2ludGVyX3NhZmV0eSgpIDogX192XygpIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcG9pbnRlcl9zYWZldHkoX19seCBfX3YpIDogX192XyhfX3YpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG9wZXJhdG9yIGludCgpIGNvbnN0IHtyZXR1cm4gX192Xzt9Cit9OworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0FCSV9QT0lOVEVSX1NBRkVUWV9FTlVNX1RZUEUpICYmIFwKKyAgICBkZWZpbmVkKF9MSUJDUFBfQlVJTERJTkdfTUVNT1JZKQorX0xJQkNQUF9GVU5DX1ZJUyBwb2ludGVyX3NhZmV0eSBnZXRfcG9pbnRlcl9zYWZldHkoKSBfTk9FWENFUFQ7CisjZWxzZQorLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IG9mZmVyZWQgaW4gQysrMDMgdW5kZXIgQUJJIHYxLgorIyBpZiAhZGVmaW5lZChfTElCQ1BQX0FCSV9QT0lOVEVSX1NBRkVUWV9FTlVNX1RZUEUpIHx8ICFkZWZpbmVkKF9MSUJDUFBfQ1hYMDNfTEFORykKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitwb2ludGVyX3NhZmV0eSBnZXRfcG9pbnRlcl9zYWZldHkoKSBfTk9FWENFUFQgeworICByZXR1cm4gcG9pbnRlcl9zYWZldHk6OnJlbGF4ZWQ7Cit9CisjIGVuZGlmCisjZW5kaWYKKworCitfTElCQ1BQX0ZVTkNfVklTIHZvaWQgZGVjbGFyZV9yZWFjaGFibGUodm9pZCogX19wKTsKK19MSUJDUFBfRlVOQ19WSVMgdm9pZCBkZWNsYXJlX25vX3BvaW50ZXJzKGNoYXIqIF9fcCwgc2l6ZV90IF9fbik7CitfTElCQ1BQX0ZVTkNfVklTIHZvaWQgdW5kZWNsYXJlX25vX3BvaW50ZXJzKGNoYXIqIF9fcCwgc2l6ZV90IF9fbik7CitfTElCQ1BQX0ZVTkNfVklTIHZvaWQqIF9fdW5kZWNsYXJlX3JlYWNoYWJsZSh2b2lkKiBfX3ApOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19UcCoKK3VuZGVjbGFyZV9yZWFjaGFibGUoX1RwKiBfX3ApCit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9UcCo+KF9fdW5kZWNsYXJlX3JlYWNoYWJsZShfX3ApKTsKK30KKworX0xJQkNQUF9GVU5DX1ZJUyB2b2lkKiBhbGlnbihzaXplX3QgX19hbGlnbiwgc2l6ZV90IF9fc3osIHZvaWQqJiBfX3B0ciwgc2l6ZV90JiBfX3NwYWNlKTsKKworLy8gLS0tIEhlbHBlciBmb3IgY29udGFpbmVyIHN3YXAgLS0KK3RlbXBsYXRlIDx0eXBlbmFtZSBfQWxsb2M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCBfX3N3YXBfYWxsb2NhdG9yKF9BbGxvYyAmIF9fYTEsIF9BbGxvYyAmIF9fYTIpCisjaWYgX0xJQkNQUF9TVERfVkVSID49IDE0CisgICAgX05PRVhDRVBUCisjZWxzZQorICAgIF9OT0VYQ0VQVF8oX19pc19ub3Rocm93X3N3YXBwYWJsZTxfQWxsb2M+Ojp2YWx1ZSkKKyNlbmRpZgoreworICAgIF9fc3dhcF9hbGxvY2F0b3IoX19hMSwgX19hMiwKKyAgICAgIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9WU1REOjphbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz46OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDo6dmFsdWU+KCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX0FsbG9jPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCBfX3N3YXBfYWxsb2NhdG9yKF9BbGxvYyAmIF9fYTEsIF9BbGxvYyAmIF9fYTIsIHRydWVfdHlwZSkKKyNpZiBfTElCQ1BQX1NURF9WRVIgPj0gMTQKKyAgICBfTk9FWENFUFQKKyNlbHNlCisgICAgX05PRVhDRVBUXyhfX2lzX25vdGhyb3dfc3dhcHBhYmxlPF9BbGxvYz46OnZhbHVlKQorI2VuZGlmCit7CisgICAgdXNpbmcgX1ZTVEQ6OnN3YXA7CisgICAgc3dhcChfX2ExLCBfX2EyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIF9BbGxvYz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIF9fc3dhcF9hbGxvY2F0b3IoX0FsbG9jICYsIF9BbGxvYyAmLCBmYWxzZV90eXBlKSBfTk9FWENFUFQge30KKwordGVtcGxhdGUgPHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX1RyYWl0cz1hbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz4gPgorc3RydWN0IF9fbm9leGNlcHRfbW92ZV9hc3NpZ25fY29udGFpbmVyIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsCisgICAgX1RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ6OnZhbHVlCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKyAgICAgICAgfHwgX1RyYWl0czo6aXNfYWx3YXlzX2VxdWFsOjp2YWx1ZQorI2Vsc2UKKyAgICAgICAgJiYgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8X0FsbG9jPjo6dmFsdWUKKyNlbmRpZgorICAgID4ge307CisKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX3RlbXBfdmFsdWUgeworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+IF9UcmFpdHM7CisKKyAgICB0eXBlbmFtZSBhbGlnbmVkX3N0b3JhZ2U8c2l6ZW9mKF9UcCksIGFsaWdub2YoX1RwKT46OnR5cGUgX192OworICAgIF9BbGxvYyAmX19hOworCisgICAgX1RwICpfX2FkZHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PF9UcCAqPihhZGRyZXNzb2YoX192KSk7IH0KKyAgICBfVHAgJiAgIGdldCgpIHsgcmV0dXJuICpfX2FkZHIoKTsgfQorCisgICAgdGVtcGxhdGU8Y2xhc3MuLi4gX0FyZ3M+CisgICAgX190ZW1wX3ZhbHVlKF9BbGxvYyAmX19hbGxvYywgX0FyZ3MmJiAuLi4gX19hcmdzKSA6IF9fYShfX2FsbG9jKQorICAgIHsgX1RyYWl0czo6Y29uc3RydWN0KF9fYSwgX19hZGRyKCksIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgfl9fdGVtcF92YWx1ZSgpIHsgX1RyYWl0czo6ZGVzdHJveShfX2EsIF9fYWRkcigpKTsgfQorICAgIH07CisjZW5kaWYKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lID0gdm9pZD4KK3N0cnVjdCBfX2lzX2FsbG9jYXRvciA6IGZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KK3N0cnVjdCBfX2lzX2FsbG9jYXRvcjxfQWxsb2MsCisgICAgIHZvaWRfdDx0eXBlbmFtZSBfQWxsb2M6OnZhbHVlX3R5cGUsIGRlY2x0eXBlKF9WU1REOjpkZWNsdmFsPF9BbGxvYyY+KCkuYWxsb2NhdGUoc2l6ZV90e30pKT4+CisgICA6IHRydWVfdHlwZSB7fTsKKyNlbmRpZgorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKK19MSUJDUFBfUE9QX01BQ1JPUworCisjZW5kaWYgIC8vIF9MSUJDUFBfTUVNT1JZCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvbW9kdWxlLm1vZHVsZW1hcCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9tb2R1bGUubW9kdWxlbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NmVmMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvbW9kdWxlLm1vZHVsZW1hcApAQCAtMCwwICsxLDU3OSBAQAorLy8gZGVmaW5lIHRoZSBtb2R1bGUgZm9yIF9fY29uZmlnIG91dHNpZGUgb2YgdGhlIHRvcCBsZXZlbCAnc3RkJyBtb2R1bGUKKy8vIHNpbmNlIF9fY29uZmlnIG1heSBiZSBpbmNsdWRlZCBmcm9tIEMgaGVhZGVycyB3aGljaCBtYXkgY3JlYXRlIGFuCisvLyBpbmNsdWRlIGN5Y2xlLgorbW9kdWxlIHN0ZF9jb25maWcgW3N5c3RlbV0gW2V4dGVybl9jXSB7CisgICAgaGVhZGVyICJfX2NvbmZpZyIKK30KKworbW9kdWxlIHN0ZCBbc3lzdGVtXSB7CisgIGV4cG9ydCBzdGRfY29uZmlnCisgIC8vIEZJWE1FOiBUaGUgc3RhbmRhcmQgZG9lcyBub3QgcmVxdWlyZSB0aGF0IGVhY2ggb2YgdGhlc2Ugc3VibW9kdWxlcworICAvLyByZS1leHBvcnRzIGl0cyBpbXBvcnRlZCBtb2R1bGVzLiBXZSBzaG91bGQgcHJvdmlkZSBhbiBhbHRlcm5hdGl2ZSBmb3JtIG9mCisgIC8vIGV4cG9ydCB0aGF0IGlzc3VlcyBhIHdhcm5pbmcgaWYgYSBuYW1lIGZyb20gdGhlIHN1Ym1vZHVsZSBpcyB1c2VkLCBhbmQKKyAgLy8gdXNlIHRoYXQgdG8gcHJvdmlkZSBhICdzdHJpY3QgbW9kZScgZm9yIGxpYmMrKy4KKworICAvLyBEZXByZWNhdGVkIEMtY29tcGF0aWJpbGl0eSBoZWFkZXJzLiBUaGVzZSBjYW4gYWxsIGJlIGluY2x1ZGVkIGZyb20gd2l0aGluCisgIC8vIGFuICdleHRlcm4gIkMiJyBjb250ZXh0LgorICBtb2R1bGUgZGVwciBbZXh0ZXJuX2NdIHsKKyAgICAvLyA8YXNzZXJ0Lmg+IHByb3ZpZGVkIGJ5IEMgbGlicmFyeS4KKyAgICBtb2R1bGUgY3R5cGVfaCB7CisgICAgICBoZWFkZXIgImN0eXBlLmgiCisgICAgICBleHBvcnQgKgorICAgIH0KKyAgICBtb2R1bGUgZXJybm9faCB7CisgICAgICBoZWFkZXIgImVycm5vLmgiCisgICAgICBleHBvcnQgKgorICAgIH0KKyAgICAvLyA8ZmVudi5oPiBwcm92aWRlZCBieSBDIGxpYnJhcnkuCisgICAgLy8gPGZsb2F0Lmg+IHByb3ZpZGVkIGJ5IGNvbXBpbGVyIG9yIEMgbGlicmFyeS4KKyAgICBtb2R1bGUgaW50dHlwZXNfaCB7CisgICAgICBoZWFkZXIgImludHR5cGVzLmgiCisgICAgICBleHBvcnQgc3RkaW50X2gKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIC8vIDxpc282NDYuaD4gcHJvdmlkZWQgYnkgY29tcGlsZXIuCisgICAgLy8gPGxpbWl0cy5oPiBwcm92aWRlZCBieSBjb21waWxlciBvciBDIGxpYnJhcnkuCisgICAgbW9kdWxlIGxvY2FsZV9oIHsKKyAgICAgIGhlYWRlciAibG9jYWxlLmgiCisgICAgICBleHBvcnQgKgorICAgIH0KKyAgICBtb2R1bGUgbWF0aF9oIHsKKyAgICAgIGhlYWRlciAibWF0aC5oIgorICAgICAgZXhwb3J0ICoKKyAgICB9CisgICAgbW9kdWxlIHNldGptcF9oIHsKKyAgICAgIGhlYWRlciAic2V0am1wLmgiCisgICAgICBleHBvcnQgKgorICAgIH0KKyAgICAvLyBGSVhNRTogPHN0ZGFsaWduLmg+IGlzIG1pc3NpbmcuCisgICAgLy8gPHNpZ25hbC5oPiBwcm92aWRlZCBieSBDIGxpYnJhcnkuCisgICAgLy8gPHN0ZGFyZy5oPiBwcm92aWRlZCBieSBjb21waWxlci4KKyAgICAvLyA8c3RkYm9vbC5oPiBwcm92aWRlZCBieSBjb21waWxlci4KKyAgICBtb2R1bGUgc3RkZGVmX2ggeworICAgICAgLy8gPHN0ZGRlZi5oPidzIF9fbmVlZF8qIG1hY3JvcyByZXF1aXJlIHRleHR1YWwgaW5jbHVzaW9uLgorICAgICAgdGV4dHVhbCBoZWFkZXIgInN0ZGRlZi5oIgorICAgIH0KKyAgICBtb2R1bGUgc3RkaW50X2ggeworICAgICAgaGVhZGVyICJzdGRpbnQuaCIKKyAgICAgIGV4cG9ydCAqCisgICAgICAvLyBGSVhNRTogVGhpcyBtb2R1bGUgb25seSBleGlzdHMgb24gT1MgWCBhbmQgZm9yIHNvbWUgcmVhc29uIHRoZQorICAgICAgLy8gd2lsZGNhcmQgYWJvdmUgZG9lc24ndCBleHBvcnQgaXQuCisgICAgICBleHBvcnQgRGFyd2luLkMuc3RkaW50CisgICAgfQorICAgIG1vZHVsZSBzdGRpb19oIHsKKyAgICAgIC8vIDxzdGRpby5oPidzIF9fbmVlZF8qIG1hY3JvcyByZXF1aXJlIHRleHR1YWwgaW5jbHVzaW9uLgorICAgICAgdGV4dHVhbCBoZWFkZXIgInN0ZGlvLmgiCisgICAgICBleHBvcnQgKgorICAgICAgZXhwb3J0IERhcndpbi5DLnN0ZGlvCisgICAgfQorICAgIG1vZHVsZSBzdGRsaWJfaCB7CisgICAgICAvLyA8c3RkbGliLmg+J3MgX19uZWVkXyogbWFjcm9zIHJlcXVpcmUgdGV4dHVhbCBpbmNsdXNpb24uCisgICAgICB0ZXh0dWFsIGhlYWRlciAic3RkbGliLmgiCisgICAgICBleHBvcnQgKgorICAgIH0KKyAgICBtb2R1bGUgc3RyaW5nX2ggeworICAgICAgaGVhZGVyICJzdHJpbmcuaCIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIC8vIEZJWE1FOiA8dWNoYXIuaD4gaXMgbWlzc2luZy4KKyAgICAvLyA8dGltZS5oPiBwcm92aWRlZCBieSBDIGxpYnJhcnkuCisgICAgbW9kdWxlIHdjaGFyX2ggeworICAgICAgLy8gPHdjaGFyLmg+J3MgX19uZWVkXyogbWFjcm9zIHJlcXVpcmUgdGV4dHVhbCBpbmNsdXNpb24uCisgICAgICB0ZXh0dWFsIGhlYWRlciAid2NoYXIuaCIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIG1vZHVsZSB3Y3R5cGVfaCB7CisgICAgICBoZWFkZXIgIndjdHlwZS5oIgorICAgICAgZXhwb3J0ICoKKyAgICB9CisgIH0KKworICAvLyA8Y29tcGxleC5oPiBhbmQgPHRnbWF0aC5oPiBhcmUgbm90IEMgaGVhZGVycyBpbiBhbnkgcmVhbCBzZW5zZSwgZG8gbm90CisgIC8vIGFsbG93IHRoZWlyIHVzZSBpbiBleHRlcm4gIkMiIGNvbnRleHRzLgorICBtb2R1bGUgY29tcGxleF9oIHsKKyAgICBoZWFkZXIgImNvbXBsZXguaCIKKyAgICBleHBvcnQgY2NvbXBsZXgKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSB0Z21hdGhfaCB7CisgICAgaGVhZGVyICJ0Z21hdGguaCIKKyAgICBleHBvcnQgY2NvbXBsZXgKKyAgICBleHBvcnQgY21hdGgKKyAgICBleHBvcnQgKgorICB9CisKKyAgLy8gQyBjb21wYXRpYmlsaXR5IGhlYWRlcnMuCisgIG1vZHVsZSBjb21wYXQgeworICAgIG1vZHVsZSBjYXNzZXJ0IHsKKyAgICAgIC8vIDxjYXNzZXJ0PidzIHVzZSBvZiBOREVCVUcgcmVxdWlyZXMgdGV4dHVhbCBpbmNsdXNpb24uCisgICAgICB0ZXh0dWFsIGhlYWRlciAiY2Fzc2VydCIKKyAgICB9CisgICAgbW9kdWxlIGNjb21wbGV4IHsKKyAgICAgIGhlYWRlciAiY2NvbXBsZXgiCisgICAgICBleHBvcnQgY29tcGxleAorICAgICAgZXhwb3J0ICoKKyAgICB9CisgICAgbW9kdWxlIGNjdHlwZSB7CisgICAgICBoZWFkZXIgImNjdHlwZSIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIG1vZHVsZSBjZXJybm8geworICAgICAgaGVhZGVyICJjZXJybm8iCisgICAgICBleHBvcnQgKgorICAgIH0KKyAgICBtb2R1bGUgY2ZlbnYgeworICAgICAgaGVhZGVyICJjZmVudiIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIG1vZHVsZSBjZmxvYXQgeworICAgICAgaGVhZGVyICJjZmxvYXQiCisgICAgICBleHBvcnQgKgorICAgIH0KKyAgICBtb2R1bGUgY2ludHR5cGVzIHsKKyAgICAgIGhlYWRlciAiY2ludHR5cGVzIgorICAgICAgZXhwb3J0IGNzdGRpbnQKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIG1vZHVsZSBjaXNvNjQ2IHsKKyAgICAgIGhlYWRlciAiY2lzbzY0NiIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIG1vZHVsZSBjbGltaXRzIHsKKyAgICAgIGhlYWRlciAiY2xpbWl0cyIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIG1vZHVsZSBjbG9jYWxlIHsKKyAgICAgIGhlYWRlciAiY2xvY2FsZSIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIG1vZHVsZSBjbWF0aCB7CisgICAgICBoZWFkZXIgImNtYXRoIgorICAgICAgZXhwb3J0ICoKKyAgICB9CisgICAgbW9kdWxlIGNzZXRqbXAgeworICAgICAgaGVhZGVyICJjc2V0am1wIgorICAgICAgZXhwb3J0ICoKKyAgICB9CisgICAgbW9kdWxlIGNzaWduYWwgeworICAgICAgaGVhZGVyICJjc2lnbmFsIgorICAgICAgZXhwb3J0ICoKKyAgICB9CisgICAgLy8gRklYTUU6IDxjc3RkYWxpZ24+IGlzIG1pc3NpbmcuCisgICAgbW9kdWxlIGNzdGRhcmcgeworICAgICAgaGVhZGVyICJjc3RkYXJnIgorICAgICAgZXhwb3J0ICoKKyAgICB9CisgICAgbW9kdWxlIGNzdGRib29sIHsKKyAgICAgIGhlYWRlciAiY3N0ZGJvb2wiCisgICAgICBleHBvcnQgKgorICAgIH0KKyAgICBtb2R1bGUgY3N0ZGRlZiB7CisgICAgICBoZWFkZXIgImNzdGRkZWYiCisgICAgICBleHBvcnQgKgorICAgIH0KKyAgICBtb2R1bGUgY3N0ZGludCB7CisgICAgICBoZWFkZXIgImNzdGRpbnQiCisgICAgICBleHBvcnQgZGVwci5zdGRpbnRfaAorICAgICAgZXhwb3J0ICoKKyAgICB9CisgICAgbW9kdWxlIGNzdGRpbyB7CisgICAgICBoZWFkZXIgImNzdGRpbyIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIG1vZHVsZSBjc3RkbGliIHsKKyAgICAgIGhlYWRlciAiY3N0ZGxpYiIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIG1vZHVsZSBjc3RyaW5nIHsKKyAgICAgIGhlYWRlciAiY3N0cmluZyIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIG1vZHVsZSBjdGdtYXRoIHsKKyAgICAgIGhlYWRlciAiY3RnbWF0aCIKKyAgICAgIGV4cG9ydCBjY29tcGxleAorICAgICAgZXhwb3J0IGNtYXRoCisgICAgICBleHBvcnQgKgorICAgIH0KKyAgICBtb2R1bGUgY3RpbWUgeworICAgICAgaGVhZGVyICJjdGltZSIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIC8vIEZJWE1FOiA8Y3VjaGFyPiBpcyBtaXNzaW5nLgorICAgIG1vZHVsZSBjd2NoYXIgeworICAgICAgaGVhZGVyICJjd2NoYXIiCisgICAgICBleHBvcnQgZGVwci5zdGRpb19oCisgICAgICBleHBvcnQgKgorICAgIH0KKyAgICBtb2R1bGUgY3djdHlwZSB7CisgICAgICBoZWFkZXIgImN3Y3R5cGUiCisgICAgICBleHBvcnQgKgorICAgIH0KKyAgfQorCisgIG1vZHVsZSBhbGdvcml0aG0geworICAgIGhlYWRlciAiYWxnb3JpdGhtIgorICAgIGV4cG9ydCBpbml0aWFsaXplcl9saXN0CisgICAgZXhwb3J0ICoKKyAgfQorICBtb2R1bGUgYW55IHsKKyAgICBoZWFkZXIgImFueSIKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSBhcnJheSB7CisgICAgaGVhZGVyICJhcnJheSIKKyAgICBleHBvcnQgaW5pdGlhbGl6ZXJfbGlzdAorICAgIGV4cG9ydCAqCisgIH0KKyAgbW9kdWxlIGF0b21pYyB7CisgICAgaGVhZGVyICJhdG9taWMiCisgICAgZXhwb3J0ICoKKyAgfQorICBtb2R1bGUgYml0c2V0IHsKKyAgICBoZWFkZXIgImJpdHNldCIKKyAgICBleHBvcnQgc3RyaW5nCisgICAgZXhwb3J0IGlvc2Z3ZAorICAgIGV4cG9ydCAqCisgIH0KKyAgLy8gTm8gc3VibW9kdWxlIGZvciBjYXNzZXJ0LiBJdCBmdW5kYW1lbnRhbGx5IG5lZWRzIHJlcGVhdGVkLCB0ZXh0dWFsIGluY2x1c2lvbi4KKyAgbW9kdWxlIGNocm9ubyB7CisgICAgaGVhZGVyICJjaHJvbm8iCisgICAgZXhwb3J0ICoKKyAgfQorICBtb2R1bGUgY29kZWN2dCB7CisgICAgaGVhZGVyICJjb2RlY3Z0IgorICAgIGV4cG9ydCAqCisgIH0KKyAgbW9kdWxlIGNvbXBsZXggeworICAgIGhlYWRlciAiY29tcGxleCIKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSBjb25kaXRpb25fdmFyaWFibGUgeworICAgIGhlYWRlciAiY29uZGl0aW9uX3ZhcmlhYmxlIgorICAgIGV4cG9ydCAqCisgIH0KKyAgbW9kdWxlIGRlcXVlIHsKKyAgICBoZWFkZXIgImRlcXVlIgorICAgIGV4cG9ydCBpbml0aWFsaXplcl9saXN0CisgICAgZXhwb3J0ICoKKyAgfQorICBtb2R1bGUgZXhjZXB0aW9uIHsKKyAgICBoZWFkZXIgImV4Y2VwdGlvbiIKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSBmb3J3YXJkX2xpc3QgeworICAgIGhlYWRlciAiZm9yd2FyZF9saXN0IgorICAgIGV4cG9ydCBpbml0aWFsaXplcl9saXN0CisgICAgZXhwb3J0ICoKKyAgfQorICBtb2R1bGUgZnN0cmVhbSB7CisgICAgaGVhZGVyICJmc3RyZWFtIgorICAgIGV4cG9ydCAqCisgIH0KKyAgbW9kdWxlIGZ1bmN0aW9uYWwgeworICAgIGhlYWRlciAiZnVuY3Rpb25hbCIKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSBmdXR1cmUgeworICAgIGhlYWRlciAiZnV0dXJlIgorICAgIGV4cG9ydCAqCisgIH0KKyAgbW9kdWxlIGluaXRpYWxpemVyX2xpc3QgeworICAgIGhlYWRlciAiaW5pdGlhbGl6ZXJfbGlzdCIKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSBpb21hbmlwIHsKKyAgICBoZWFkZXIgImlvbWFuaXAiCisgICAgZXhwb3J0ICoKKyAgfQorICBtb2R1bGUgaW9zIHsKKyAgICBoZWFkZXIgImlvcyIKKyAgICBleHBvcnQgaW9zZndkCisgICAgZXhwb3J0ICoKKyAgfQorICBtb2R1bGUgaW9zZndkIHsKKyAgICBoZWFkZXIgImlvc2Z3ZCIKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSBpb3N0cmVhbSB7CisgICAgaGVhZGVyICJpb3N0cmVhbSIKKyAgICBleHBvcnQgaW9zCisgICAgZXhwb3J0IHN0cmVhbWJ1ZgorICAgIGV4cG9ydCBpc3RyZWFtCisgICAgZXhwb3J0IG9zdHJlYW0KKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSBpc3RyZWFtIHsKKyAgICBoZWFkZXIgImlzdHJlYW0iCisgICAgLy8gRklYTUU6IHNob3VsZCByZS1leHBvcnQgaW9zLCBzdHJlYW1idWY/CisgICAgZXhwb3J0ICoKKyAgfQorICBtb2R1bGUgaXRlcmF0b3IgeworICAgIGhlYWRlciAiaXRlcmF0b3IiCisgICAgZXhwb3J0ICoKKyAgfQorICBtb2R1bGUgbGltaXRzIHsKKyAgICBoZWFkZXIgImxpbWl0cyIKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSBsaXN0IHsKKyAgICBoZWFkZXIgImxpc3QiCisgICAgZXhwb3J0IGluaXRpYWxpemVyX2xpc3QKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSBsb2NhbGUgeworICAgIGhlYWRlciAibG9jYWxlIgorICAgIGV4cG9ydCAqCisgIH0KKyAgbW9kdWxlIG1hcCB7CisgICAgaGVhZGVyICJtYXAiCisgICAgZXhwb3J0IGluaXRpYWxpemVyX2xpc3QKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSBtZW1vcnkgeworICAgIGhlYWRlciAibWVtb3J5IgorICAgIGV4cG9ydCAqCisgIH0KKyAgbW9kdWxlIG11dGV4IHsKKyAgICBoZWFkZXIgIm11dGV4IgorICAgIGV4cG9ydCAqCisgIH0KKyAgbW9kdWxlIG5ldyB7CisgICAgaGVhZGVyICJuZXciCisgICAgZXhwb3J0ICoKKyAgfQorICBtb2R1bGUgbnVtZXJpYyB7CisgICAgaGVhZGVyICJudW1lcmljIgorICAgIGV4cG9ydCAqCisgIH0KKyAgbW9kdWxlIG9wdGlvbmFsIHsKKyAgICBoZWFkZXIgIm9wdGlvbmFsIgorICAgIGV4cG9ydCAqCisgIH0KKyAgbW9kdWxlIG9zdHJlYW0geworICAgIGhlYWRlciAib3N0cmVhbSIKKyAgICAvLyBGSVhNRTogc2hvdWxkIHJlLWV4cG9ydCBpb3MsIHN0cmVhbWJ1Zj8KKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSBxdWV1ZSB7CisgICAgaGVhZGVyICJxdWV1ZSIKKyAgICBleHBvcnQgaW5pdGlhbGl6ZXJfbGlzdAorICAgIGV4cG9ydCAqCisgIH0KKyAgbW9kdWxlIHJhbmRvbSB7CisgICAgaGVhZGVyICJyYW5kb20iCisgICAgZXhwb3J0IGluaXRpYWxpemVyX2xpc3QKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSByYXRpbyB7CisgICAgaGVhZGVyICJyYXRpbyIKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSByZWdleCB7CisgICAgaGVhZGVyICJyZWdleCIKKyAgICBleHBvcnQgaW5pdGlhbGl6ZXJfbGlzdAorICAgIGV4cG9ydCAqCisgIH0KKyAgbW9kdWxlIHNjb3BlZF9hbGxvY2F0b3IgeworICAgIGhlYWRlciAic2NvcGVkX2FsbG9jYXRvciIKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSBzZXQgeworICAgIGhlYWRlciAic2V0IgorICAgIGV4cG9ydCBpbml0aWFsaXplcl9saXN0CisgICAgZXhwb3J0ICoKKyAgfQorICBtb2R1bGUgc3N0cmVhbSB7CisgICAgaGVhZGVyICJzc3RyZWFtIgorICAgIC8vIEZJWE1FOiBzaG91bGQgcmUtZXhwb3J0IGlzdHJlYW0sIG9zdHJlYW0sIGlvcywgc3RyZWFtYnVmLCBzdHJpbmc/CisgICAgZXhwb3J0ICoKKyAgfQorICBtb2R1bGUgc3RhY2sgeworICAgIGhlYWRlciAic3RhY2siCisgICAgZXhwb3J0IGluaXRpYWxpemVyX2xpc3QKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSBzdGRleGNlcHQgeworICAgIGhlYWRlciAic3RkZXhjZXB0IgorICAgIGV4cG9ydCAqCisgIH0KKyAgbW9kdWxlIHN0cmVhbWJ1ZiB7CisgICAgaGVhZGVyICJzdHJlYW1idWYiCisgICAgZXhwb3J0ICoKKyAgfQorICBtb2R1bGUgc3RyaW5nIHsKKyAgICBoZWFkZXIgInN0cmluZyIKKyAgICBleHBvcnQgaW5pdGlhbGl6ZXJfbGlzdAorICAgIGV4cG9ydCBzdHJpbmdfdmlldworICAgIGV4cG9ydCBfX3N0cmluZworICAgIGV4cG9ydCAqCisgIH0KKyAgbW9kdWxlIHN0cmluZ192aWV3IHsKKyAgICBoZWFkZXIgInN0cmluZ192aWV3IgorICAgIGV4cG9ydCBpbml0aWFsaXplcl9saXN0CisgICAgZXhwb3J0IF9fc3RyaW5nCisgICAgZXhwb3J0ICoKKyAgfQorICBtb2R1bGUgc3Ryc3RyZWFtIHsKKyAgICBoZWFkZXIgInN0cnN0cmVhbSIKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSBzeXN0ZW1fZXJyb3IgeworICAgIGhlYWRlciAic3lzdGVtX2Vycm9yIgorICAgIGV4cG9ydCAqCisgIH0KKyAgbW9kdWxlIHRocmVhZCB7CisgICAgaGVhZGVyICJ0aHJlYWQiCisgICAgZXhwb3J0ICoKKyAgfQorICBtb2R1bGUgdHVwbGUgeworICAgIGhlYWRlciAidHVwbGUiCisgICAgZXhwb3J0ICoKKyAgfQorICBtb2R1bGUgdHlwZV90cmFpdHMgeworICAgIGhlYWRlciAidHlwZV90cmFpdHMiCisgICAgZXhwb3J0ICoKKyAgfQorICBtb2R1bGUgdHlwZWluZGV4IHsKKyAgICBoZWFkZXIgInR5cGVpbmRleCIKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSB0eXBlaW5mbyB7CisgICAgaGVhZGVyICJ0eXBlaW5mbyIKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSB1bm9yZGVyZWRfbWFwIHsKKyAgICBoZWFkZXIgInVub3JkZXJlZF9tYXAiCisgICAgZXhwb3J0IGluaXRpYWxpemVyX2xpc3QKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSB1bm9yZGVyZWRfc2V0IHsKKyAgICBoZWFkZXIgInVub3JkZXJlZF9zZXQiCisgICAgZXhwb3J0IGluaXRpYWxpemVyX2xpc3QKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSB1dGlsaXR5IHsKKyAgICBoZWFkZXIgInV0aWxpdHkiCisgICAgZXhwb3J0IGluaXRpYWxpemVyX2xpc3QKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSB2YWxhcnJheSB7CisgICAgaGVhZGVyICJ2YWxhcnJheSIKKyAgICBleHBvcnQgaW5pdGlhbGl6ZXJfbGlzdAorICAgIGV4cG9ydCAqCisgIH0KKyAgbW9kdWxlIHZhcmlhbnQgeworICAgIGhlYWRlciAidmFyaWFudCIKKyAgICBleHBvcnQgKgorICB9CisgIG1vZHVsZSB2ZWN0b3IgeworICAgIGhlYWRlciAidmVjdG9yIgorICAgIGV4cG9ydCBpbml0aWFsaXplcl9saXN0CisgICAgZXhwb3J0ICoKKyAgfQorCisgIC8vIEZJWE1FOiBUaGVzZSBzaG91bGQgYmUgcHJpdmF0ZS4KKyAgbW9kdWxlIF9fYml0X3JlZmVyZW5jZSB7IGhlYWRlciAiX19iaXRfcmVmZXJlbmNlIiBleHBvcnQgKiB9CisgIG1vZHVsZSBfX2RlYnVnIHsgaGVhZGVyICJfX2RlYnVnIiBleHBvcnQgKiB9CisgIG1vZHVsZSBfX2Z1bmN0aW9uYWxfYmFzZSB7IGhlYWRlciAiX19mdW5jdGlvbmFsX2Jhc2UiIGV4cG9ydCAqIH0KKyAgbW9kdWxlIF9faGFzaF90YWJsZSB7IGhlYWRlciAiX19oYXNoX3RhYmxlIiBleHBvcnQgKiB9CisgIG1vZHVsZSBfX2xvY2FsZSB7IGhlYWRlciAiX19sb2NhbGUiIGV4cG9ydCAqIH0KKyAgbW9kdWxlIF9fbXV0ZXhfYmFzZSB7IGhlYWRlciAiX19tdXRleF9iYXNlIiBleHBvcnQgKiB9CisgIG1vZHVsZSBfX3NwbGl0X2J1ZmZlciB7IGhlYWRlciAiX19zcGxpdF9idWZmZXIiIGV4cG9ydCAqIH0KKyAgbW9kdWxlIF9fc3NvX2FsbG9jYXRvciB7IGhlYWRlciAiX19zc29fYWxsb2NhdG9yIiBleHBvcnQgKiB9CisgIG1vZHVsZSBfX3N0ZF9zdHJlYW0geyBoZWFkZXIgIl9fc3RkX3N0cmVhbSIgZXhwb3J0ICogfQorICBtb2R1bGUgX19zdHJpbmcgeyBoZWFkZXIgIl9fc3RyaW5nIiBleHBvcnQgKiB9CisgIG1vZHVsZSBfX3RyZWUgeyBoZWFkZXIgIl9fdHJlZSIgZXhwb3J0ICogfQorICBtb2R1bGUgX190dXBsZSB7IGhlYWRlciAiX190dXBsZSIgZXhwb3J0ICogfQorICBtb2R1bGUgX191bmRlZl9tYWNyb3MgeyBoZWFkZXIgIl9fdW5kZWZfbWFjcm9zIiBleHBvcnQgKiB9CisKKyAgbW9kdWxlIGV4cGVyaW1lbnRhbCB7CisgICAgcmVxdWlyZXMgY3BsdXNwbHVzMTEKKworICAgIG1vZHVsZSBhbGdvcml0aG0geworICAgICAgaGVhZGVyICJleHBlcmltZW50YWwvYWxnb3JpdGhtIgorICAgICAgZXhwb3J0ICoKKyAgICB9CisgICAgIG1vZHVsZSBjb3JvdXRpbmUgeworICAgICAgcmVxdWlyZXMgY29yb3V0aW5lcworICAgICAgaGVhZGVyICJleHBlcmltZW50YWwvY29yb3V0aW5lIgorICAgICAgZXhwb3J0ICoKKyAgICB9CisgICAgbW9kdWxlIGRlcXVlIHsKKyAgICAgIGhlYWRlciAiZXhwZXJpbWVudGFsL2RlcXVlIgorICAgICAgZXhwb3J0ICoKKyAgICB9CisgICAgbW9kdWxlIGR5bmFycmF5IHsKKyAgICAgIGhlYWRlciAiZXhwZXJpbWVudGFsL2R5bmFycmF5IgorICAgICAgZXhwb3J0ICoKKyAgICB9CisgICAgbW9kdWxlIGZpbGVzeXN0ZW0geworICAgICAgaGVhZGVyICJleHBlcmltZW50YWwvZmlsZXN5c3RlbSIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIG1vZHVsZSBmb3J3YXJkX2xpc3QgeworICAgICAgaGVhZGVyICJleHBlcmltZW50YWwvZm9yd2FyZF9saXN0IgorICAgICAgZXhwb3J0ICoKKyAgICB9CisgICAgbW9kdWxlIGZ1bmN0aW9uYWwgeworICAgICAgaGVhZGVyICJleHBlcmltZW50YWwvZnVuY3Rpb25hbCIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIG1vZHVsZSBpdGVyYXRvciB7CisgICAgICBoZWFkZXIgImV4cGVyaW1lbnRhbC9pdGVyYXRvciIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIG1vZHVsZSBsaXN0IHsKKyAgICAgIGhlYWRlciAiZXhwZXJpbWVudGFsL2xpc3QiCisgICAgICBleHBvcnQgKgorICAgIH0KKyAgICBtb2R1bGUgbWFwIHsKKyAgICAgIGhlYWRlciAiZXhwZXJpbWVudGFsL21hcCIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIG1vZHVsZSBtZW1vcnlfcmVzb3VyY2UgeworICAgICAgaGVhZGVyICJleHBlcmltZW50YWwvbWVtb3J5X3Jlc291cmNlIgorICAgICAgZXhwb3J0ICoKKyAgICB9CisgICAgbW9kdWxlIHByb3BhZ2F0ZV9jb25zdCB7CisgICAgICBoZWFkZXIgImV4cGVyaW1lbnRhbC9wcm9wYWdhdGVfY29uc3QiCisgICAgICBleHBvcnQgKgorICAgIH0KKyAgICBtb2R1bGUgcmVnZXggeworICAgICAgaGVhZGVyICJleHBlcmltZW50YWwvcmVnZXgiCisgICAgICBleHBvcnQgKgorICAgIH0KKyAgICBtb2R1bGUgc2V0IHsKKyAgICAgIGhlYWRlciAiZXhwZXJpbWVudGFsL3NldCIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIG1vZHVsZSBzdHJpbmcgeworICAgICAgaGVhZGVyICJleHBlcmltZW50YWwvc3RyaW5nIgorICAgICAgZXhwb3J0ICoKKyAgICB9CisgICAgbW9kdWxlIHR5cGVfdHJhaXRzIHsKKyAgICAgIGhlYWRlciAiZXhwZXJpbWVudGFsL3R5cGVfdHJhaXRzIgorICAgICAgZXhwb3J0ICoKKyAgICB9CisgICAgbW9kdWxlIHVub3JkZXJlZF9tYXAgeworICAgICAgaGVhZGVyICJleHBlcmltZW50YWwvdW5vcmRlcmVkX21hcCIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICAgIG1vZHVsZSB1bm9yZGVyZWRfc2V0IHsKKyAgICAgIGhlYWRlciAiZXhwZXJpbWVudGFsL3Vub3JkZXJlZF9zZXQiCisgICAgICBleHBvcnQgKgorICAgIH0KKyAgICBtb2R1bGUgdXRpbGl0eSB7CisgICAgICBoZWFkZXIgImV4cGVyaW1lbnRhbC91dGlsaXR5IgorICAgICAgZXhwb3J0ICoKKyAgICB9CisgICAgbW9kdWxlIHZlY3RvciB7CisgICAgICBoZWFkZXIgImV4cGVyaW1lbnRhbC92ZWN0b3IiCisgICAgICBleHBvcnQgKgorICAgIH0KKyAgICAvLyBGSVhNRSB0aGVzZSBzaG91bGQgYmUgcHJpdmF0ZQorICAgIG1vZHVsZSBfX21lbW9yeSB7CisgICAgICBoZWFkZXIgImV4cGVyaW1lbnRhbC9fX21lbW9yeSIKKyAgICAgIGV4cG9ydCAqCisgICAgfQorICB9IC8vIGVuZCBleHBlcmltZW50YWwKK30KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9tdXRleCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9tdXRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmUzOWIwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL211dGV4CkBAIC0wLDAgKzEsNzAyIEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbXV0ZXggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX01VVEVYCisjZGVmaW5lIF9MSUJDUFBfTVVURVgKKworLyoKKyAgICBtdXRleCBzeW5vcHNpcworCituYW1lc3BhY2Ugc3RkCit7CisKK2NsYXNzIG11dGV4Cit7CitwdWJsaWM6CisgICAgIGNvbnN0ZXhwciBtdXRleCgpIG5vZXhjZXB0OworICAgICB+bXV0ZXgoKTsKKworICAgIG11dGV4KGNvbnN0IG11dGV4JikgPSBkZWxldGU7CisgICAgbXV0ZXgmIG9wZXJhdG9yPShjb25zdCBtdXRleCYpID0gZGVsZXRlOworCisgICAgdm9pZCBsb2NrKCk7CisgICAgYm9vbCB0cnlfbG9jaygpOworICAgIHZvaWQgdW5sb2NrKCk7CisKKyAgICB0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCogbmF0aXZlX2hhbmRsZV90eXBlOworICAgIG5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlKCk7Cit9OworCitjbGFzcyByZWN1cnNpdmVfbXV0ZXgKK3sKK3B1YmxpYzoKKyAgICAgcmVjdXJzaXZlX211dGV4KCk7CisgICAgIH5yZWN1cnNpdmVfbXV0ZXgoKTsKKworICAgIHJlY3Vyc2l2ZV9tdXRleChjb25zdCByZWN1cnNpdmVfbXV0ZXgmKSA9IGRlbGV0ZTsKKyAgICByZWN1cnNpdmVfbXV0ZXgmIG9wZXJhdG9yPShjb25zdCByZWN1cnNpdmVfbXV0ZXgmKSA9IGRlbGV0ZTsKKworICAgIHZvaWQgbG9jaygpOworICAgIGJvb2wgdHJ5X2xvY2soKSBub2V4Y2VwdDsKKyAgICB2b2lkIHVubG9jaygpOworCisgICAgdHlwZWRlZiBwdGhyZWFkX211dGV4X3QqIG5hdGl2ZV9oYW5kbGVfdHlwZTsKKyAgICBuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZSgpOworfTsKKworY2xhc3MgdGltZWRfbXV0ZXgKK3sKK3B1YmxpYzoKKyAgICAgdGltZWRfbXV0ZXgoKTsKKyAgICAgfnRpbWVkX211dGV4KCk7CisKKyAgICB0aW1lZF9tdXRleChjb25zdCB0aW1lZF9tdXRleCYpID0gZGVsZXRlOworICAgIHRpbWVkX211dGV4JiBvcGVyYXRvcj0oY29uc3QgdGltZWRfbXV0ZXgmKSA9IGRlbGV0ZTsKKworICAgIHZvaWQgbG9jaygpOworICAgIGJvb2wgdHJ5X2xvY2soKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVwLCBjbGFzcyBQZXJpb2Q+CisgICAgICAgIGJvb2wgdHJ5X2xvY2tfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248UmVwLCBQZXJpb2Q+JiByZWxfdGltZSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbj4KKyAgICAgICAgYm9vbCB0cnlfbG9ja191bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUpOworICAgIHZvaWQgdW5sb2NrKCk7Cit9OworCitjbGFzcyByZWN1cnNpdmVfdGltZWRfbXV0ZXgKK3sKK3B1YmxpYzoKKyAgICAgcmVjdXJzaXZlX3RpbWVkX211dGV4KCk7CisgICAgIH5yZWN1cnNpdmVfdGltZWRfbXV0ZXgoKTsKKworICAgIHJlY3Vyc2l2ZV90aW1lZF9tdXRleChjb25zdCByZWN1cnNpdmVfdGltZWRfbXV0ZXgmKSA9IGRlbGV0ZTsKKyAgICByZWN1cnNpdmVfdGltZWRfbXV0ZXgmIG9wZXJhdG9yPShjb25zdCByZWN1cnNpdmVfdGltZWRfbXV0ZXgmKSA9IGRlbGV0ZTsKKworICAgIHZvaWQgbG9jaygpOworICAgIGJvb2wgdHJ5X2xvY2soKSBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVwLCBjbGFzcyBQZXJpb2Q+CisgICAgICAgIGJvb2wgdHJ5X2xvY2tfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248UmVwLCBQZXJpb2Q+JiByZWxfdGltZSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbj4KKyAgICAgICAgYm9vbCB0cnlfbG9ja191bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUpOworICAgIHZvaWQgdW5sb2NrKCk7Cit9OworCitzdHJ1Y3QgZGVmZXJfbG9ja190IHt9Oworc3RydWN0IHRyeV90b19sb2NrX3Qge307CitzdHJ1Y3QgYWRvcHRfbG9ja190IHt9OworCitpbmxpbmUgY29uc3RleHByIGRlZmVyX2xvY2tfdCAgZGVmZXJfbG9ja3t9OworaW5saW5lIGNvbnN0ZXhwciB0cnlfdG9fbG9ja190IHRyeV90b19sb2Nre307CitpbmxpbmUgY29uc3RleHByIGFkb3B0X2xvY2tfdCAgYWRvcHRfbG9ja3t9OworCit0ZW1wbGF0ZSA8Y2xhc3MgTXV0ZXg+CitjbGFzcyBsb2NrX2d1YXJkCit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBNdXRleCBtdXRleF90eXBlOworCisgICAgZXhwbGljaXQgbG9ja19ndWFyZChtdXRleF90eXBlJiBtKTsKKyAgICBsb2NrX2d1YXJkKG11dGV4X3R5cGUmIG0sIGFkb3B0X2xvY2tfdCk7CisgICAgfmxvY2tfZ3VhcmQoKTsKKworICAgIGxvY2tfZ3VhcmQobG9ja19ndWFyZCBjb25zdCYpID0gZGVsZXRlOworICAgIGxvY2tfZ3VhcmQmIG9wZXJhdG9yPShsb2NrX2d1YXJkIGNvbnN0JikgPSBkZWxldGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gTXV0ZXhUeXBlcz4KK2NsYXNzIHNjb3BlZF9sb2NrIC8vIEMrKzE3Cit7CitwdWJsaWM6CisgICAgdXNpbmcgbXV0ZXhfdHlwZSA9IE11dGV4OyAgLy8gSWYgTXV0ZXhUeXBlcy4uLiBjb25zaXN0cyBvZiB0aGUgc2luZ2xlIHR5cGUgTXV0ZXgKKworICAgIGV4cGxpY2l0IHNjb3BlZF9sb2NrKE11dGV4VHlwZXMmLi4uIG0pOworICAgIHNjb3BlZF9sb2NrKGFkb3B0X2xvY2tfdCwgTXV0ZXhUeXBlcyYuLi4gbSk7CisgICAgfnNjb3BlZF9sb2NrKCk7CisgICAgc2NvcGVkX2xvY2soc2NvcGVkX2xvY2sgY29uc3QmKSA9IGRlbGV0ZTsKKyAgICBzY29wZWRfbG9jayYgb3BlcmF0b3I9KHNjb3BlZF9sb2NrIGNvbnN0JikgPSBkZWxldGU7Citwcml2YXRlOgorICAgIHR1cGxlPE11dGV4VHlwZXMmLi4uPiBwbTsgLy8gZXhwb3NpdGlvbiBvbmx5Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgTXV0ZXg+CitjbGFzcyB1bmlxdWVfbG9jaworeworcHVibGljOgorICAgIHR5cGVkZWYgTXV0ZXggbXV0ZXhfdHlwZTsKKyAgICB1bmlxdWVfbG9jaygpIG5vZXhjZXB0OworICAgIGV4cGxpY2l0IHVuaXF1ZV9sb2NrKG11dGV4X3R5cGUmIG0pOworICAgIHVuaXF1ZV9sb2NrKG11dGV4X3R5cGUmIG0sIGRlZmVyX2xvY2tfdCkgbm9leGNlcHQ7CisgICAgdW5pcXVlX2xvY2sobXV0ZXhfdHlwZSYgbSwgdHJ5X3RvX2xvY2tfdCk7CisgICAgdW5pcXVlX2xvY2sobXV0ZXhfdHlwZSYgbSwgYWRvcHRfbG9ja190KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xvY2ssIGNsYXNzIER1cmF0aW9uPgorICAgICAgICB1bmlxdWVfbG9jayhtdXRleF90eXBlJiBtLCBjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUpOworICAgIHRlbXBsYXRlIDxjbGFzcyBSZXAsIGNsYXNzIFBlcmlvZD4KKyAgICAgICAgdW5pcXVlX2xvY2sobXV0ZXhfdHlwZSYgbSwgY29uc3QgY2hyb25vOjpkdXJhdGlvbjxSZXAsIFBlcmlvZD4mIHJlbF90aW1lKTsKKyAgICB+dW5pcXVlX2xvY2soKTsKKworICAgIHVuaXF1ZV9sb2NrKHVuaXF1ZV9sb2NrIGNvbnN0JikgPSBkZWxldGU7CisgICAgdW5pcXVlX2xvY2smIG9wZXJhdG9yPSh1bmlxdWVfbG9jayBjb25zdCYpID0gZGVsZXRlOworCisgICAgdW5pcXVlX2xvY2sodW5pcXVlX2xvY2smJiB1KSBub2V4Y2VwdDsKKyAgICB1bmlxdWVfbG9jayYgb3BlcmF0b3I9KHVuaXF1ZV9sb2NrJiYgdSkgbm9leGNlcHQ7CisKKyAgICB2b2lkIGxvY2soKTsKKyAgICBib29sIHRyeV9sb2NrKCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVwLCBjbGFzcyBQZXJpb2Q+CisgICAgICAgIGJvb2wgdHJ5X2xvY2tfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248UmVwLCBQZXJpb2Q+JiByZWxfdGltZSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbj4KKyAgICAgICAgYm9vbCB0cnlfbG9ja191bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUpOworCisgICAgdm9pZCB1bmxvY2soKTsKKworICAgIHZvaWQgc3dhcCh1bmlxdWVfbG9jayYgdSkgbm9leGNlcHQ7CisgICAgbXV0ZXhfdHlwZSogcmVsZWFzZSgpIG5vZXhjZXB0OworCisgICAgYm9vbCBvd25zX2xvY2soKSBjb25zdCBub2V4Y2VwdDsKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sICgpIGNvbnN0IG5vZXhjZXB0OworICAgIG11dGV4X3R5cGUqIG11dGV4KCkgY29uc3Qgbm9leGNlcHQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgTXV0ZXg+CisgIHZvaWQgc3dhcCh1bmlxdWVfbG9jazxNdXRleD4mIHgsIHVuaXF1ZV9sb2NrPE11dGV4PiYgeSkgbm9leGNlcHQ7CisKK3RlbXBsYXRlIDxjbGFzcyBMMSwgY2xhc3MgTDIsIGNsYXNzLi4uIEwzPgorICBpbnQgdHJ5X2xvY2soTDEmLCBMMiYsIEwzJi4uLik7Cit0ZW1wbGF0ZSA8Y2xhc3MgTDEsIGNsYXNzIEwyLCBjbGFzcy4uLiBMMz4KKyAgdm9pZCBsb2NrKEwxJiwgTDImLCBMMyYuLi4pOworCitzdHJ1Y3Qgb25jZV9mbGFnCit7CisgICAgY29uc3RleHByIG9uY2VfZmxhZygpIG5vZXhjZXB0OworCisgICAgb25jZV9mbGFnKGNvbnN0IG9uY2VfZmxhZyYpID0gZGVsZXRlOworICAgIG9uY2VfZmxhZyYgb3BlcmF0b3I9KGNvbnN0IG9uY2VfZmxhZyYpID0gZGVsZXRlOworfTsKKwordGVtcGxhdGU8Y2xhc3MgQ2FsbGFibGUsIGNsYXNzIC4uLkFyZ3M+CisgIHZvaWQgY2FsbF9vbmNlKG9uY2VfZmxhZyYgZmxhZywgQ2FsbGFibGUmJiBmdW5jLCBBcmdzJiYuLi4gYXJncyk7CisKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8X19tdXRleF9iYXNlPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyNpbmNsdWRlIDx0dXBsZT4KKyNlbmRpZgorI2luY2x1ZGUgPF9fdGhyZWFkaW5nX3N1cHBvcnQ+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX1BVU0hfTUFDUk9TCisjaW5jbHVkZSA8X191bmRlZl9tYWNyb3M+CisKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fVEhSRUFEUworCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIHJlY3Vyc2l2ZV9tdXRleAoreworICAgIF9fbGliY3BwX3JlY3Vyc2l2ZV9tdXRleF90IF9fbV87CisKK3B1YmxpYzoKKyAgICAgcmVjdXJzaXZlX211dGV4KCk7CisgICAgIH5yZWN1cnNpdmVfbXV0ZXgoKTsKKworcHJpdmF0ZToKKyAgICByZWN1cnNpdmVfbXV0ZXgoY29uc3QgcmVjdXJzaXZlX211dGV4Jik7IC8vID0gZGVsZXRlOworICAgIHJlY3Vyc2l2ZV9tdXRleCYgb3BlcmF0b3I9KGNvbnN0IHJlY3Vyc2l2ZV9tdXRleCYpOyAvLyA9IGRlbGV0ZTsKKworcHVibGljOgorICAgIHZvaWQgbG9jaygpOworICAgIGJvb2wgdHJ5X2xvY2soKSBfTk9FWENFUFQ7CisgICAgdm9pZCB1bmxvY2soKSAgX05PRVhDRVBUOworCisgICAgdHlwZWRlZiBfX2xpYmNwcF9yZWN1cnNpdmVfbXV0ZXhfdCogbmF0aXZlX2hhbmRsZV90eXBlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlKCkge3JldHVybiAmX19tXzt9Cit9OworCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIHRpbWVkX211dGV4Cit7CisgICAgbXV0ZXggICAgICAgICAgICAgIF9fbV87CisgICAgY29uZGl0aW9uX3ZhcmlhYmxlIF9fY3ZfOworICAgIGJvb2wgICAgICAgICAgICAgICBfX2xvY2tlZF87CitwdWJsaWM6CisgICAgIHRpbWVkX211dGV4KCk7CisgICAgIH50aW1lZF9tdXRleCgpOworCitwcml2YXRlOgorICAgIHRpbWVkX211dGV4KGNvbnN0IHRpbWVkX211dGV4Jik7IC8vID0gZGVsZXRlOworICAgIHRpbWVkX211dGV4JiBvcGVyYXRvcj0oY29uc3QgdGltZWRfbXV0ZXgmKTsgLy8gPSBkZWxldGU7CisKK3B1YmxpYzoKKyAgICB2b2lkIGxvY2soKTsKKyAgICBib29sIHRyeV9sb2NrKCkgX05PRVhDRVBUOworICAgIHRlbXBsYXRlIDxjbGFzcyBfUmVwLCBjbGFzcyBfUGVyaW9kPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgdHJ5X2xvY2tfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fZCkKKyAgICAgICAgICAgIHtyZXR1cm4gdHJ5X2xvY2tfdW50aWwoY2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgX19kKTt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgorICAgICAgICBfTElCQ1BQX01FVEhPRF9URU1QTEFURV9JTVBMSUNJVF9JTlNUQU5USUFUSU9OX1ZJUworICAgICAgICBib29sIHRyeV9sb2NrX3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fdCk7CisgICAgdm9pZCB1bmxvY2soKSBfTk9FWENFUFQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0Nsb2NrLCBjbGFzcyBfRHVyYXRpb24+Citib29sCit0aW1lZF9tdXRleDo6dHJ5X2xvY2tfdW50aWwoY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX190KQoreworICAgIHVzaW5nIG5hbWVzcGFjZSBjaHJvbm87CisgICAgdW5pcXVlX2xvY2s8bXV0ZXg+IF9fbGsoX19tXyk7CisgICAgYm9vbCBub190aW1lb3V0ID0gX0Nsb2NrOjpub3coKSA8IF9fdDsKKyAgICB3aGlsZSAobm9fdGltZW91dCAmJiBfX2xvY2tlZF8pCisgICAgICAgIG5vX3RpbWVvdXQgPSBfX2N2Xy53YWl0X3VudGlsKF9fbGssIF9fdCkgPT0gY3Zfc3RhdHVzOjpub190aW1lb3V0OworICAgIGlmICghX19sb2NrZWRfKQorICAgIHsKKyAgICAgICAgX19sb2NrZWRfID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyByZWN1cnNpdmVfdGltZWRfbXV0ZXgKK3sKKyAgICBtdXRleCAgICAgICAgICAgICAgX19tXzsKKyAgICBjb25kaXRpb25fdmFyaWFibGUgX19jdl87CisgICAgc2l6ZV90ICAgICAgICAgICAgIF9fY291bnRfOworICAgIF9fbGliY3BwX3RocmVhZF9pZCBfX2lkXzsKK3B1YmxpYzoKKyAgICAgcmVjdXJzaXZlX3RpbWVkX211dGV4KCk7CisgICAgIH5yZWN1cnNpdmVfdGltZWRfbXV0ZXgoKTsKKworcHJpdmF0ZToKKyAgICByZWN1cnNpdmVfdGltZWRfbXV0ZXgoY29uc3QgcmVjdXJzaXZlX3RpbWVkX211dGV4Jik7IC8vID0gZGVsZXRlOworICAgIHJlY3Vyc2l2ZV90aW1lZF9tdXRleCYgb3BlcmF0b3I9KGNvbnN0IHJlY3Vyc2l2ZV90aW1lZF9tdXRleCYpOyAvLyA9IGRlbGV0ZTsKKworcHVibGljOgorICAgIHZvaWQgbG9jaygpOworICAgIGJvb2wgdHJ5X2xvY2soKSBfTk9FWENFUFQ7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCB0cnlfbG9ja19mb3IoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19kKQorICAgICAgICAgICAge3JldHVybiB0cnlfbG9ja191bnRpbChjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgKyBfX2QpO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0Nsb2NrLCBjbGFzcyBfRHVyYXRpb24+CisgICAgICAgIF9MSUJDUFBfTUVUSE9EX1RFTVBMQVRFX0lNUExJQ0lUX0lOU1RBTlRJQVRJT05fVklTCisgICAgICAgIGJvb2wgdHJ5X2xvY2tfdW50aWwoY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX190KTsKKyAgICB2b2lkIHVubG9jaygpIF9OT0VYQ0VQVDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2xvY2ssIGNsYXNzIF9EdXJhdGlvbj4KK2Jvb2wKK3JlY3Vyc2l2ZV90aW1lZF9tdXRleDo6dHJ5X2xvY2tfdW50aWwoY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX190KQoreworICAgIHVzaW5nIG5hbWVzcGFjZSBjaHJvbm87CisgICAgX19saWJjcHBfdGhyZWFkX2lkIF9faWQgPSBfX2xpYmNwcF90aHJlYWRfZ2V0X2N1cnJlbnRfaWQoKTsKKyAgICB1bmlxdWVfbG9jazxtdXRleD4gbGsoX19tXyk7CisgICAgaWYgKF9fbGliY3BwX3RocmVhZF9pZF9lcXVhbChfX2lkLCBfX2lkXykpCisgICAgeworICAgICAgICBpZiAoX19jb3VudF8gPT0gbnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICsrX19jb3VudF87CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBib29sIG5vX3RpbWVvdXQgPSBfQ2xvY2s6Om5vdygpIDwgX190OworICAgIHdoaWxlIChub190aW1lb3V0ICYmIF9fY291bnRfICE9IDApCisgICAgICAgIG5vX3RpbWVvdXQgPSBfX2N2Xy53YWl0X3VudGlsKGxrLCBfX3QpID09IGN2X3N0YXR1czo6bm9fdGltZW91dDsKKyAgICBpZiAoX19jb3VudF8gPT0gMCkKKyAgICB7CisgICAgICAgIF9fY291bnRfID0gMTsKKyAgICAgICAgX19pZF8gPSBfX2lkOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0wwLCBjbGFzcyBfTDE+CitpbnQKK3RyeV9sb2NrKF9MMCYgX19sMCwgX0wxJiBfX2wxKQoreworICAgIHVuaXF1ZV9sb2NrPF9MMD4gX191MChfX2wwLCB0cnlfdG9fbG9jayk7CisgICAgaWYgKF9fdTAub3duc19sb2NrKCkpCisgICAgeworICAgICAgICBpZiAoX19sMS50cnlfbG9jaygpKQorICAgICAgICB7CisgICAgICAgICAgICBfX3UwLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfTDAsIGNsYXNzIF9MMSwgY2xhc3MgX0wyLCBjbGFzcy4uLiBfTDM+CitpbnQKK3RyeV9sb2NrKF9MMCYgX19sMCwgX0wxJiBfX2wxLCBfTDImIF9fbDIsIF9MMyYuLi4gX19sMykKK3sKKyAgICBpbnQgX19yID0gMDsKKyAgICB1bmlxdWVfbG9jazxfTDA+IF9fdTAoX19sMCwgdHJ5X3RvX2xvY2spOworICAgIGlmIChfX3UwLm93bnNfbG9jaygpKQorICAgIHsKKyAgICAgICAgX19yID0gdHJ5X2xvY2soX19sMSwgX19sMiwgX19sMy4uLik7CisgICAgICAgIGlmIChfX3IgPT0gLTEpCisgICAgICAgICAgICBfX3UwLnJlbGVhc2UoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKytfX3I7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfTDAsIGNsYXNzIF9MMT4KK3ZvaWQKK2xvY2soX0wwJiBfX2wwLCBfTDEmIF9fbDEpCit7CisgICAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICB1bmlxdWVfbG9jazxfTDA+IF9fdTAoX19sMCk7CisgICAgICAgICAgICBpZiAoX19sMS50cnlfbG9jaygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fdTAucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fbGliY3BwX3RocmVhZF95aWVsZCgpOworICAgICAgICB7CisgICAgICAgICAgICB1bmlxdWVfbG9jazxfTDE+IF9fdTEoX19sMSk7CisgICAgICAgICAgICBpZiAoX19sMC50cnlfbG9jaygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fdTEucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fbGliY3BwX3RocmVhZF95aWVsZCgpOworICAgIH0KK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9MMCwgY2xhc3MgX0wxLCBjbGFzcyBfTDIsIGNsYXNzIC4uLl9MMz4KK3ZvaWQKK19fbG9ja19maXJzdChpbnQgX19pLCBfTDAmIF9fbDAsIF9MMSYgX19sMSwgX0wyJiBfX2wyLCBfTDMmIC4uLl9fbDMpCit7CisgICAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgICBzd2l0Y2ggKF9faSkKKyAgICAgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5pcXVlX2xvY2s8X0wwPiBfX3UwKF9fbDApOworICAgICAgICAgICAgICAgIF9faSA9IHRyeV9sb2NrKF9fbDEsIF9fbDIsIF9fbDMuLi4pOworICAgICAgICAgICAgICAgIGlmIChfX2kgPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX3UwLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrX19pOworICAgICAgICAgICAgX19saWJjcHBfdGhyZWFkX3lpZWxkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuaXF1ZV9sb2NrPF9MMT4gX191MShfX2wxKTsKKyAgICAgICAgICAgICAgICBfX2kgPSB0cnlfbG9jayhfX2wyLCBfX2wzLi4uLCBfX2wwKTsKKyAgICAgICAgICAgICAgICBpZiAoX19pID09IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX191MS5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX19pID09IHNpemVvZi4uLihfTDMpICsgMSkKKyAgICAgICAgICAgICAgICBfX2kgPSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9faSArPSAyOworICAgICAgICAgICAgX19saWJjcHBfdGhyZWFkX3lpZWxkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIF9fbG9ja19maXJzdChfX2kgLSAyLCBfX2wyLCBfX2wzLi4uLCBfX2wwLCBfX2wxKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9MMCwgY2xhc3MgX0wxLCBjbGFzcyBfTDIsIGNsYXNzIC4uLl9MMz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitsb2NrKF9MMCYgX19sMCwgX0wxJiBfX2wxLCBfTDImIF9fbDIsIF9MMyYgLi4uX19sMykKK3sKKyAgICBfX2xvY2tfZmlyc3QoMCwgX19sMCwgX19sMSwgX19sMiwgX19sMy4uLik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfTDA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCBfX3VubG9jayhfTDAmIF9fbDApIHsKKyAgICBfX2wwLnVubG9jaygpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0wwLCBjbGFzcyBfTDE+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCBfX3VubG9jayhfTDAmIF9fbDAsIF9MMSYgX19sMSkgeworICAgIF9fbDAudW5sb2NrKCk7CisgICAgX19sMS51bmxvY2soKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9MMCwgY2xhc3MgX0wxLCBjbGFzcyBfTDIsIGNsYXNzIC4uLl9MMz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIF9fdW5sb2NrKF9MMCYgX19sMCwgX0wxJiBfX2wxLCBfTDImIF9fbDIsIF9MMyYuLi4gX19sMykgeworICAgIF9fbDAudW5sb2NrKCk7CisgICAgX19sMS51bmxvY2soKTsKKyAgICBfVlNURDo6X191bmxvY2soX19sMiwgX19sMy4uLik7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAordGVtcGxhdGUgPGNsYXNzIC4uLl9NdXRleGVzPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgc2NvcGVkX2xvY2s7CisKK3RlbXBsYXRlIDw+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBzY29wZWRfbG9jazw+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBzY29wZWRfbG9jaygpIHt9CisgICAgfnNjb3BlZF9sb2NrKCkgPSBkZWZhdWx0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IHNjb3BlZF9sb2NrKGFkb3B0X2xvY2tfdCkge30KKworICAgIHNjb3BlZF9sb2NrKHNjb3BlZF9sb2NrIGNvbnN0JikgPSBkZWxldGU7CisgICAgc2NvcGVkX2xvY2smIG9wZXJhdG9yPShzY29wZWRfbG9jayBjb25zdCYpID0gZGVsZXRlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9NdXRleD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHNjb3BlZF9sb2NrPF9NdXRleD4geworcHVibGljOgorICAgIHR5cGVkZWYgX011dGV4ICBtdXRleF90eXBlOworcHJpdmF0ZToKKyAgICBtdXRleF90eXBlJiBfX21fOworcHVibGljOgorICAgIGV4cGxpY2l0IHNjb3BlZF9sb2NrKG11dGV4X3R5cGUgJiBfX20pIF9MSUJDUFBfVEhSRUFEX1NBRkVUWV9BTk5PVEFUSU9OKGFjcXVpcmVfY2FwYWJpbGl0eShfX20pKQorICAgICAgICA6IF9fbV8oX19tKSB7X19tXy5sb2NrKCk7fQorCisgICAgfnNjb3BlZF9sb2NrKCkgX0xJQkNQUF9USFJFQURfU0FGRVRZX0FOTk9UQVRJT04ocmVsZWFzZV9jYXBhYmlsaXR5KCkpIHtfX21fLnVubG9jaygpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBzY29wZWRfbG9jayhhZG9wdF9sb2NrX3QsIG11dGV4X3R5cGUmIF9fbSkgX0xJQkNQUF9USFJFQURfU0FGRVRZX0FOTk9UQVRJT04ocmVxdWlyZXNfY2FwYWJpbGl0eShfX20pKQorICAgICAgICA6IF9fbV8oX19tKSB7fQorCisgICAgc2NvcGVkX2xvY2soc2NvcGVkX2xvY2sgY29uc3QmKSA9IGRlbGV0ZTsKKyAgICBzY29wZWRfbG9jayYgb3BlcmF0b3I9KHNjb3BlZF9sb2NrIGNvbnN0JikgPSBkZWxldGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX01BcmdzPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgc2NvcGVkX2xvY2sKK3sKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZi4uLihfTUFyZ3MpID4gMSwgIkF0IGxlYXN0IDIgbG9jayB0eXBlcyByZXF1aXJlZCIpOworICAgIHR5cGVkZWYgdHVwbGU8X01BcmdzJi4uLj4gX011dGV4VHVwbGU7CisKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgc2NvcGVkX2xvY2soX01BcmdzJi4uLiBfX21hcmdzKQorICAgICAgOiBfX3RfKF9fbWFyZ3MuLi4pCisgICAgeworICAgICAgICBfVlNURDo6bG9jayhfX21hcmdzLi4uKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2NvcGVkX2xvY2soYWRvcHRfbG9ja190LCBfTUFyZ3MmLi4uIF9fbWFyZ3MpCisgICAgICAgIDogX190XyhfX21hcmdzLi4uKQorICAgIHsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgfnNjb3BlZF9sb2NrKCkgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPHNpemVvZi4uLihfTUFyZ3MpPjo6dHlwZSBfSW5kaWNlczsKKyAgICAgICAgX191bmxvY2tfdW5wYWNrKF9JbmRpY2Vze30sIF9fdF8pOworICAgIH0KKworICAgIHNjb3BlZF9sb2NrKHNjb3BlZF9sb2NrIGNvbnN0JikgPSBkZWxldGU7CisgICAgc2NvcGVkX2xvY2smIG9wZXJhdG9yPShzY29wZWRfbG9jayBjb25zdCYpID0gZGVsZXRlOworCitwcml2YXRlOgorICAgIHRlbXBsYXRlIDxzaXplX3QgLi4uX0luZHg+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyB2b2lkIF9fdW5sb2NrX3VucGFjayhfX3R1cGxlX2luZGljZXM8X0luZHguLi4+LCBfTXV0ZXhUdXBsZSYgX19tdCkgeworICAgICAgICBfVlNURDo6X191bmxvY2soX1ZTVEQ6OmdldDxfSW5keD4oX19tdCkuLi4pOworICAgIH0KKworICAgIF9NdXRleFR1cGxlIF9fdF87Cit9OworCisjZW5kaWYgLy8gX0xJQkNQUF9TVERfVkVSID4gMTQKKyNlbmRpZiAvLyAhX0xJQkNQUF9IQVNfTk9fVEhSRUFEUworCitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgb25jZV9mbGFnOworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZTxjbGFzcyBfQ2FsbGFibGUsIGNsYXNzLi4uIF9BcmdzPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCBjYWxsX29uY2Uob25jZV9mbGFnJiwgX0NhbGxhYmxlJiYsIF9BcmdzJiYuLi4pOworCisjZWxzZSAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlPGNsYXNzIF9DYWxsYWJsZT4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQgY2FsbF9vbmNlKG9uY2VfZmxhZyYsIF9DYWxsYWJsZSYpOworCit0ZW1wbGF0ZTxjbGFzcyBfQ2FsbGFibGU+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIGNhbGxfb25jZShvbmNlX2ZsYWcmLCBjb25zdCBfQ2FsbGFibGUmKTsKKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIG9uY2VfZmxhZworeworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfTElCQ1BQX0NPTlNURVhQUgorICAgICAgICBvbmNlX2ZsYWcoKSBfTk9FWENFUFQgOiBfX3N0YXRlXygwKSB7fQorCitwcml2YXRlOgorICAgIG9uY2VfZmxhZyhjb25zdCBvbmNlX2ZsYWcmKTsgLy8gPSBkZWxldGU7CisgICAgb25jZV9mbGFnJiBvcGVyYXRvcj0oY29uc3Qgb25jZV9mbGFnJik7IC8vID0gZGVsZXRlOworCisgICAgdW5zaWduZWQgbG9uZyBfX3N0YXRlXzsKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2FsbGFibGUsIGNsYXNzLi4uIF9BcmdzPgorICAgIGZyaWVuZAorICAgIHZvaWQgY2FsbF9vbmNlKG9uY2VfZmxhZyYsIF9DYWxsYWJsZSYmLCBfQXJncyYmLi4uKTsKKyNlbHNlICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2FsbGFibGU+CisgICAgZnJpZW5kCisgICAgdm9pZCBjYWxsX29uY2Uob25jZV9mbGFnJiwgX0NhbGxhYmxlJik7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2FsbGFibGU+CisgICAgZnJpZW5kCisgICAgdm9pZCBjYWxsX29uY2Uob25jZV9mbGFnJiwgY29uc3QgX0NhbGxhYmxlJik7CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworfTsKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9GcD4KK2NsYXNzIF9fY2FsbF9vbmNlX3BhcmFtCit7CisgICAgX0ZwJiBfX2ZfOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2NhbGxfb25jZV9wYXJhbShfRnAmIF9fZikgOiBfX2ZfKF9fZikge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIG9wZXJhdG9yKCkoKQorICAgIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX21ha2VfdHVwbGVfaW5kaWNlczx0dXBsZV9zaXplPF9GcD46OnZhbHVlLCAxPjo6dHlwZSBfSW5kZXg7CisgICAgICAgIF9fZXhlY3V0ZShfSW5kZXgoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHRlbXBsYXRlIDxzaXplX3QgLi4uX0luZGljZXM+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19leGVjdXRlKF9fdHVwbGVfaW5kaWNlczxfSW5kaWNlcy4uLj4pCisgICAgeworICAgICAgICBfX2ludm9rZShfVlNURDo6Z2V0PDA+KF9WU1REOjptb3ZlKF9fZl8pKSwgX1ZTVEQ6OmdldDxfSW5kaWNlcz4oX1ZTVEQ6Om1vdmUoX19mXykpLi4uKTsKKyAgICB9Cit9OworCisjZWxzZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwPgorY2xhc3MgX19jYWxsX29uY2VfcGFyYW0KK3sKKyAgICBfRnAmIF9fZl87CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9fY2FsbF9vbmNlX3BhcmFtKF9GcCYgX19mKSA6IF9fZl8oX19mKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgb3BlcmF0b3IoKSgpCisgICAgeworICAgICAgICBfX2ZfKCk7CisgICAgfQorfTsKKworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfRnA+Cit2b2lkCitfX2NhbGxfb25jZV9wcm94eSh2b2lkKiBfX3ZwKQoreworICAgIF9fY2FsbF9vbmNlX3BhcmFtPF9GcD4qIF9fcCA9IHN0YXRpY19jYXN0PF9fY2FsbF9vbmNlX3BhcmFtPF9GcD4qPihfX3ZwKTsKKyAgICAoKl9fcCkoKTsKK30KKworX0xJQkNQUF9GVU5DX1ZJUyB2b2lkIF9fY2FsbF9vbmNlKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcmLCB2b2lkKiwgdm9pZCgqKSh2b2lkKikpOworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZTxjbGFzcyBfQ2FsbGFibGUsIGNsYXNzLi4uIF9BcmdzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK2NhbGxfb25jZShvbmNlX2ZsYWcmIF9fZmxhZywgX0NhbGxhYmxlJiYgX19mdW5jLCBfQXJncyYmLi4uIF9fYXJncykKK3sKKyAgICBpZiAoX19saWJjcHBfYWNxdWlyZV9sb2FkKCZfX2ZsYWcuX19zdGF0ZV8pICE9IH4wdWwpCisgICAgeworICAgICAgICB0eXBlZGVmIHR1cGxlPF9DYWxsYWJsZSYmLCBfQXJncyYmLi4uPiBfR3A7CisgICAgICAgIF9HcCBfX2YoX1ZTVEQ6OmZvcndhcmQ8X0NhbGxhYmxlPihfX2Z1bmMpLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICAgIF9fY2FsbF9vbmNlX3BhcmFtPF9HcD4gX19wKF9fZik7CisgICAgICAgIF9fY2FsbF9vbmNlKF9fZmxhZy5fX3N0YXRlXywgJl9fcCwgJl9fY2FsbF9vbmNlX3Byb3h5PF9HcD4pOworICAgIH0KK30KKworI2Vsc2UgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZTxjbGFzcyBfQ2FsbGFibGU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorY2FsbF9vbmNlKG9uY2VfZmxhZyYgX19mbGFnLCBfQ2FsbGFibGUmIF9fZnVuYykKK3sKKyAgICBpZiAoX19saWJjcHBfYWNxdWlyZV9sb2FkKCZfX2ZsYWcuX19zdGF0ZV8pICE9IH4wdWwpCisgICAgeworICAgICAgICBfX2NhbGxfb25jZV9wYXJhbTxfQ2FsbGFibGU+IF9fcChfX2Z1bmMpOworICAgICAgICBfX2NhbGxfb25jZShfX2ZsYWcuX19zdGF0ZV8sICZfX3AsICZfX2NhbGxfb25jZV9wcm94eTxfQ2FsbGFibGU+KTsKKyAgICB9Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DYWxsYWJsZT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitjYWxsX29uY2Uob25jZV9mbGFnJiBfX2ZsYWcsIGNvbnN0IF9DYWxsYWJsZSYgX19mdW5jKQoreworICAgIGlmIChfX2xpYmNwcF9hY3F1aXJlX2xvYWQoJl9fZmxhZy5fX3N0YXRlXykgIT0gfjB1bCkKKyAgICB7CisgICAgICAgIF9fY2FsbF9vbmNlX3BhcmFtPGNvbnN0IF9DYWxsYWJsZT4gX19wKF9fZnVuYyk7CisgICAgICAgIF9fY2FsbF9vbmNlKF9fZmxhZy5fX3N0YXRlXywgJl9fcCwgJl9fY2FsbF9vbmNlX3Byb3h5PGNvbnN0IF9DYWxsYWJsZT4pOworICAgIH0KK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCitfTElCQ1BQX1BPUF9NQUNST1MKKworI2VuZGlmICAvLyBfTElCQ1BQX01VVEVYCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvbmV3IGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL25ldwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDJmZmFkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL25ldwpAQCAtMCwwICsxLDMyMyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbmV3IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9ORVcKKyNkZWZpbmUgX0xJQkNQUF9ORVcKKworLyoKKyAgICBuZXcgc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCitjbGFzcyBiYWRfYWxsb2MKKyAgICA6IHB1YmxpYyBleGNlcHRpb24KK3sKK3B1YmxpYzoKKyAgICBiYWRfYWxsb2MoKSBub2V4Y2VwdDsKKyAgICBiYWRfYWxsb2MoY29uc3QgYmFkX2FsbG9jJikgbm9leGNlcHQ7CisgICAgYmFkX2FsbG9jJiBvcGVyYXRvcj0oY29uc3QgYmFkX2FsbG9jJikgbm9leGNlcHQ7CisgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQ7Cit9OworCitjbGFzcyBiYWRfYXJyYXlfbGVuZ3RoIDogcHVibGljIGJhZF9hbGxvYyAvLyBGSVhNRTogTm90IHBhcnQgb2YgQysrCit7CitwdWJsaWM6CisgICAgYmFkX2FycmF5X2xlbmd0aCgpIG5vZXhjZXB0OworfTsKKworY2xhc3MgYmFkX2FycmF5X25ld19sZW5ndGggOiBwdWJsaWMgYmFkX2FsbG9jIC8vIEMrKzE0Cit7CitwdWJsaWM6CisgICAgYmFkX2FycmF5X25ld19sZW5ndGgoKSBub2V4Y2VwdDsKK307CisKK2VudW0gY2xhc3MgYWxpZ25fdmFsX3QgOiBzaXplX3Qge307IC8vIEMrKzE3CitzdHJ1Y3Qgbm90aHJvd190IHt9OworZXh0ZXJuIGNvbnN0IG5vdGhyb3dfdCBub3Rocm93OwordHlwZWRlZiB2b2lkICgqbmV3X2hhbmRsZXIpKCk7CituZXdfaGFuZGxlciBzZXRfbmV3X2hhbmRsZXIobmV3X2hhbmRsZXIgbmV3X3ApIG5vZXhjZXB0OworbmV3X2hhbmRsZXIgZ2V0X25ld19oYW5kbGVyKCkgbm9leGNlcHQ7CisKKy8vIDIxLjYuNCwgcG9pbnRlciBvcHRpbWl6YXRpb24gYmFycmllcgordGVtcGxhdGUgPGNsYXNzIFQ+IGNvbnN0ZXhwciBUKiBsYXVuZGVyKFQqIHApIG5vZXhjZXB0OyAvLyBDKysxNworfSAgLy8gc3RkCisKK3ZvaWQqIG9wZXJhdG9yIG5ldyhzdGQ6OnNpemVfdCBzaXplKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2VhYmxlLCBub2Rpc2NhcmQgaW4gQysrMmEKK3ZvaWQqIG9wZXJhdG9yIG5ldyhzdGQ6OnNpemVfdCBzaXplLCBzdGQ6OmFsaWduX3ZhbF90IGFsaWdubWVudCk7ICAgICAgIC8vIHJlcGxhY2VhYmxlLCBDKysxNywgbm9kaXNjYXJkIGluIEMrKzJhCit2b2lkKiBvcGVyYXRvciBuZXcoc3RkOjpzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSBub2V4Y2VwdDsgICAvLyByZXBsYWNlYWJsZSwgbm9kaXNjYXJkIGluIEMrKzJhCit2b2lkKiBvcGVyYXRvciBuZXcoc3RkOjpzaXplX3Qgc2l6ZSwgc3RkOjphbGlnbl92YWxfdCBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpub3Rocm93X3QmKSBub2V4Y2VwdDsgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlYWJsZSwgQysrMTcsIG5vZGlzY2FyZCBpbiBDKysyYQordm9pZCAgb3BlcmF0b3IgZGVsZXRlKHZvaWQqIHB0cikgbm9leGNlcHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZWFibGUKK3ZvaWQgIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBwdHIsIHN0ZDo6c2l6ZV90IHNpemUpIG5vZXhjZXB0OyAgICAgICAgICAgIC8vIHJlcGxhY2VhYmxlLCBDKysxNAordm9pZCAgb3BlcmF0b3IgZGVsZXRlKHZvaWQqIHB0ciwgc3RkOjphbGlnbl92YWxfdCBhbGlnbm1lbnQpIG5vZXhjZXB0OyAgLy8gcmVwbGFjZWFibGUsIEMrKzE3Cit2b2lkICBvcGVyYXRvciBkZWxldGUodm9pZCogcHRyLCBzdGQ6OnNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxpZ25fdmFsX3QgYWxpZ25tZW50KSBub2V4Y2VwdDsgICAgICAgICAgICAgLy8gcmVwbGFjZWFibGUsIEMrKzE3Cit2b2lkICBvcGVyYXRvciBkZWxldGUodm9pZCogcHRyLCBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIG5vZXhjZXB0OyAgICAgICAvLyByZXBsYWNlYWJsZQordm9pZCAgb3BlcmF0b3IgZGVsZXRlKHZvaWQqIHB0ciwgc3RkOmFsaWduX3ZhbF90IGFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIG5vZXhjZXB0OyAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2VhYmxlLCBDKysxNworCit2b2lkKiBvcGVyYXRvciBuZXdbXShzdGQ6OnNpemVfdCBzaXplKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlYWJsZSwgbm9kaXNjYXJkIGluIEMrKzJhCit2b2lkKiBvcGVyYXRvciBuZXdbXShzdGQ6OnNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjphbGlnbl92YWxfdCBhbGlnbm1lbnQpIG5vZXhjZXB0OyAgICAgICAgICAgICAgLy8gcmVwbGFjZWFibGUsIEMrKzE3LCBub2Rpc2NhcmQgaW4gQysrMmEKK3ZvaWQqIG9wZXJhdG9yIG5ld1tdKHN0ZDo6c2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6bm90aHJvd190Jikgbm9leGNlcHQ7IC8vIHJlcGxhY2VhYmxlLCBub2Rpc2NhcmQgaW4gQysrMmEKK3ZvaWQqIG9wZXJhdG9yIG5ld1tdKHN0ZDo6c2l6ZV90IHNpemUsIHN0ZDo6YWxpZ25fdmFsX3QgYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpub3Rocm93X3QmKSBub2V4Y2VwdDsgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZWFibGUsIEMrKzE3LCBub2Rpc2NhcmQgaW4gQysrMmEKK3ZvaWQgIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqIHB0cikgbm9leGNlcHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2VhYmxlCit2b2lkICBvcGVyYXRvciBkZWxldGVbXSh2b2lkKiBwdHIsIHN0ZDo6c2l6ZV90IHNpemUpIG5vZXhjZXB0OyAgICAgICAgICAvLyByZXBsYWNlYWJsZSwgQysrMTQKK3ZvaWQgIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxpZ25fdmFsX3QgYWxpZ25tZW50KSBub2V4Y2VwdDsgICAgICAgICAgIC8vIHJlcGxhY2VhYmxlLCBDKysxNwordm9pZCAgb3BlcmF0b3IgZGVsZXRlW10odm9pZCogcHRyLCBzdGQ6OnNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphbGlnbl92YWxfdCBhbGlnbm1lbnQpIG5vZXhjZXB0OyAgICAgICAgICAgLy8gcmVwbGFjZWFibGUsIEMrKzE3Cit2b2lkICBvcGVyYXRvciBkZWxldGVbXSh2b2lkKiBwdHIsIGNvbnN0IHN0ZDo6bm90aHJvd190Jikgbm9leGNlcHQ7ICAgICAvLyByZXBsYWNlYWJsZQordm9pZCAgb3BlcmF0b3IgZGVsZXRlW10odm9pZCogcHRyLCBzdGQ6OmFsaWduX3ZhbF90IGFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bm90aHJvd190Jikgbm9leGNlcHQ7ICAgICAgICAgICAgICAgIC8vIHJlcGxhY2VhYmxlLCBDKysxNworCit2b2lkKiBvcGVyYXRvciBuZXcgIChzdGQ6OnNpemVfdCBzaXplLCB2b2lkKiBwdHIpIG5vZXhjZXB0OyAgICAgICAgICAgICAvLyBub2Rpc2NhcmQgaW4gQysrMmEKK3ZvaWQqIG9wZXJhdG9yIG5ld1tdKHN0ZDo6c2l6ZV90IHNpemUsIHZvaWQqIHB0cikgbm9leGNlcHQ7ICAgICAgICAgICAgIC8vIG5vZGlzY2FyZCBpbiBDKysyYQordm9pZCAgb3BlcmF0b3IgZGVsZXRlICAodm9pZCogcHRyLCB2b2lkKikgbm9leGNlcHQ7Cit2b2lkICBvcGVyYXRvciBkZWxldGVbXSh2b2lkKiBwdHIsIHZvaWQqKSBub2V4Y2VwdDsKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2lmZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworI2luY2x1ZGUgPGNzdGRsaWI+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX0xJQkNQUF9BQklfTUlDUk9TT0ZUKSAmJiAhZGVmaW5lZChfTElCQ1BQX05PX1ZDUlVOVElNRSkKKyNpbmNsdWRlIDxuZXcuaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2lmICEoZGVmaW5lZChfTElCQ1BQX0JVSUxESU5HX05FVykgfHwgX0xJQkNQUF9TVERfVkVSID49IDE0IHx8IFwKKyAgICAoZGVmaW5lZChfX2NwcF9zaXplZF9kZWFsbG9jYXRpb24pICYmIF9fY3BwX3NpemVkX2RlYWxsb2NhdGlvbiA+PSAyMDEzMDkpKQorIyBkZWZpbmUgX0xJQkNQUF9IQVNfTk9fU0laRURfREVBTExPQ0FUSU9OCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX0FMSUdORURfQUxMT0NBVElPTikgJiYgXAorICAgICghKGRlZmluZWQoX0xJQkNQUF9CVUlMRElOR19ORVcpIHx8IF9MSUJDUFBfU1REX1ZFUiA+IDE0IHx8IFwKKyAgICAoZGVmaW5lZChfX2NwcF9hbGlnbmVkX25ldykgJiYgX19jcHBfYWxpZ25lZF9uZXcgPj0gMjAxNjA2KSkpCisjIGRlZmluZSBfTElCQ1BQX0hBU19OT19BTElHTkVEX0FMTE9DQVRJT04KKyNlbmRpZgorCisKKyNpZiAhX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fb3BlcmF0b3JfbmV3KSB8fCBcCisgICBfX2hhc19idWlsdGluKF9fYnVpbHRpbl9vcGVyYXRvcl9uZXcpIDwgMjAxODAyTCB8fCBcCisgICBkZWZpbmVkKF9MSUJDUFBfSEFTX05PX0FMSUdORURfQUxMT0NBVElPTikgfHwgXAorICAgIWRlZmluZWQoX19jcHBfYWxpZ25lZF9uZXcpIHx8IF9fY3BwX2FsaWduZWRfbmV3IDwgMjAxNjA2CisjZGVmaW5lIF9MSUJDUFBfSEFTX05PX0JVSUxUSU5fQUxJR05FRF9PUEVSQVRPUl9ORVdfREVMRVRFCisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCAgLy8gcHVycG9zZWZ1bGx5IG5vdCB1c2luZyB2ZXJzaW9uaW5nIG5hbWVzcGFjZQoreworCisjaWYgIWRlZmluZWQoX0xJQkNQUF9BQklfTUlDUk9TT0ZUKSB8fCBkZWZpbmVkKF9MSUJDUFBfTk9fVkNSVU5USU1FKQorc3RydWN0IF9MSUJDUFBfVFlQRV9WSVMgbm90aHJvd190IHt9OworZXh0ZXJuIF9MSUJDUFBfRlVOQ19WSVMgY29uc3Qgbm90aHJvd190IG5vdGhyb3c7CisKK2NsYXNzIF9MSUJDUFBfRVhDRVBUSU9OX0FCSSBiYWRfYWxsb2MKKyAgICA6IHB1YmxpYyBleGNlcHRpb24KK3sKK3B1YmxpYzoKKyAgICBiYWRfYWxsb2MoKSBfTk9FWENFUFQ7CisgICAgdmlydHVhbCB+YmFkX2FsbG9jKCkgX05PRVhDRVBUOworICAgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9OT0VYQ0VQVDsKK307CisKK2NsYXNzIF9MSUJDUFBfRVhDRVBUSU9OX0FCSSBiYWRfYXJyYXlfbmV3X2xlbmd0aAorICAgIDogcHVibGljIGJhZF9hbGxvYworeworcHVibGljOgorICAgIGJhZF9hcnJheV9uZXdfbGVuZ3RoKCkgX05PRVhDRVBUOworICAgIHZpcnR1YWwgfmJhZF9hcnJheV9uZXdfbGVuZ3RoKCkgX05PRVhDRVBUOworICAgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9OT0VYQ0VQVDsKK307CisKK3R5cGVkZWYgdm9pZCAoKm5ld19oYW5kbGVyKSgpOworX0xJQkNQUF9GVU5DX1ZJUyBuZXdfaGFuZGxlciBzZXRfbmV3X2hhbmRsZXIobmV3X2hhbmRsZXIpIF9OT0VYQ0VQVDsKK19MSUJDUFBfRlVOQ19WSVMgbmV3X2hhbmRsZXIgZ2V0X25ld19oYW5kbGVyKCkgX05PRVhDRVBUOworCisjZW5kaWYgLy8gIV9MSUJDUFBfQUJJX01JQ1JPU09GVCB8fCBfTElCQ1BQX05PX1ZDUlVOVElNRQorCitfTElCQ1BQX05PUkVUVVJOIF9MSUJDUFBfRlVOQ19WSVMgdm9pZCBfX3Rocm93X2JhZF9hbGxvYygpOyAgLy8gbm90IGluIEMrKyBzcGVjCisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfQlVJTERJTkdfTElCUkFSWSkgfHwgKF9MSUJDUFBfU1REX1ZFUiA+IDExKQorCitjbGFzcyBfTElCQ1BQX0VYQ0VQVElPTl9BQkkgX0xJQkNQUF9BVkFJTEFCSUxJVFlfQkFEX0FSUkFZX0xFTkdUSAorICAgIGJhZF9hcnJheV9sZW5ndGggOiBwdWJsaWMgYmFkX2FsbG9jIHsKK3B1YmxpYzoKKyAgICBiYWRfYXJyYXlfbGVuZ3RoKCkgX05PRVhDRVBUOworICAgIHZpcnR1YWwgfmJhZF9hcnJheV9sZW5ndGgoKSBfTk9FWENFUFQ7CisgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgX05PRVhDRVBUOworfTsKKworI2RlZmluZSBfTElCQ1BQX0JBRF9BUlJBWV9MRU5HVEhfREVGSU5FRAorCisjZW5kaWYgIC8vIGRlZmluZWQoX0xJQkNQUF9CVUlMRElOR19ORVcpIHx8IChfTElCQ1BQX1NURF9WRVIgPiAxMSkKKworI2lmICFkZWZpbmVkKF9MSUJDUFBfQUJJX01JQ1JPU09GVCkgfHwgZGVmaW5lZChfTElCQ1BQX05PX1ZDUlVOVElNRSkKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19BTElHTkVEX0FMTE9DQVRJT04pIHx8IF9MSUJDUFBfU1REX1ZFUiA+IDE0CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworZW51bSBjbGFzcyBfTElCQ1BQX0VOVU1fVklTIGFsaWduX3ZhbF90IDogc2l6ZV90IHsgfTsKKyNlbHNlCitlbnVtIGFsaWduX3ZhbF90IHsgX196ZXJvID0gMCwgX19tYXggPSAoc2l6ZV90KS0xIH07CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKK30gIC8vIHN0ZAorCisjaWYgZGVmaW5lZChfTElCQ1BQX0NYWDAzX0xBTkcpCisjZGVmaW5lIF9USFJPV19CQURfQUxMT0MgdGhyb3coc3RkOjpiYWRfYWxsb2MpCisjZWxzZQorI2RlZmluZSBfVEhST1dfQkFEX0FMTE9DCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9MSUJDUFBfQUJJX01JQ1JPU09GVCkgfHwgZGVmaW5lZChfTElCQ1BQX05PX1ZDUlVOVElNRSkKKworX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgX0xJQkNQUF9PVkVSUklEQUJMRV9GVU5DX1ZJUyB2b2lkKiBvcGVyYXRvciBuZXcoc3RkOjpzaXplX3QgX19zeikgX1RIUk9XX0JBRF9BTExPQzsKK19MSUJDUFBfTk9ESVNDQVJEX0FGVEVSX0NYWDE3IF9MSUJDUFBfT1ZFUlJJREFCTEVfRlVOQ19WSVMgdm9pZCogb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90IF9fc3osIGNvbnN0IHN0ZDo6bm90aHJvd190JikgX05PRVhDRVBUIF9OT0FMSUFTOworX0xJQkNQUF9PVkVSUklEQUJMRV9GVU5DX1ZJUyB2b2lkICBvcGVyYXRvciBkZWxldGUodm9pZCogX19wKSBfTk9FWENFUFQ7CitfTElCQ1BQX09WRVJSSURBQkxFX0ZVTkNfVklTIHZvaWQgIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBfX3AsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgX05PRVhDRVBUOworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19TSVpFRF9ERUFMTE9DQVRJT04KK19MSUJDUFBfT1ZFUlJJREFCTEVfRlVOQ19WSVMgX0xJQkNQUF9BVkFJTEFCSUxJVFlfU0laRURfTkVXX0RFTEVURSB2b2lkICBvcGVyYXRvciBkZWxldGUodm9pZCogX19wLCBzdGQ6OnNpemVfdCBfX3N6KSBfTk9FWENFUFQ7CisjZW5kaWYKKworX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgX0xJQkNQUF9PVkVSUklEQUJMRV9GVU5DX1ZJUyB2b2lkKiBvcGVyYXRvciBuZXdbXShzdGQ6OnNpemVfdCBfX3N6KSBfVEhST1dfQkFEX0FMTE9DOworX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgX0xJQkNQUF9PVkVSUklEQUJMRV9GVU5DX1ZJUyB2b2lkKiBvcGVyYXRvciBuZXdbXShzdGQ6OnNpemVfdCBfX3N6LCBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIF9OT0VYQ0VQVCBfTk9BTElBUzsKK19MSUJDUFBfT1ZFUlJJREFCTEVfRlVOQ19WSVMgdm9pZCAgb3BlcmF0b3IgZGVsZXRlW10odm9pZCogX19wKSBfTk9FWENFUFQ7CitfTElCQ1BQX09WRVJSSURBQkxFX0ZVTkNfVklTIHZvaWQgIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqIF9fcCwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSBfTk9FWENFUFQ7CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1NJWkVEX0RFQUxMT0NBVElPTgorX0xJQkNQUF9PVkVSUklEQUJMRV9GVU5DX1ZJUyBfTElCQ1BQX0FWQUlMQUJJTElUWV9TSVpFRF9ORVdfREVMRVRFIHZvaWQgIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqIF9fcCwgc3RkOjpzaXplX3QgX19zeikgX05PRVhDRVBUOworI2VuZGlmCisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fQUxJR05FRF9BTExPQ0FUSU9OCitfTElCQ1BQX05PRElTQ0FSRF9BRlRFUl9DWFgxNyBfTElCQ1BQX09WRVJSSURBQkxFX0ZVTkNfVklTIHZvaWQqIG9wZXJhdG9yIG5ldyhzdGQ6OnNpemVfdCBfX3N6LCBzdGQ6OmFsaWduX3ZhbF90KSBfVEhST1dfQkFEX0FMTE9DOworX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgX0xJQkNQUF9PVkVSUklEQUJMRV9GVU5DX1ZJUyB2b2lkKiBvcGVyYXRvciBuZXcoc3RkOjpzaXplX3QgX19zeiwgc3RkOjphbGlnbl92YWxfdCwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSBfTk9FWENFUFQgX05PQUxJQVM7CitfTElCQ1BQX09WRVJSSURBQkxFX0ZVTkNfVklTIHZvaWQgIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBfX3AsIHN0ZDo6YWxpZ25fdmFsX3QpIF9OT0VYQ0VQVDsKK19MSUJDUFBfT1ZFUlJJREFCTEVfRlVOQ19WSVMgdm9pZCAgb3BlcmF0b3IgZGVsZXRlKHZvaWQqIF9fcCwgc3RkOjphbGlnbl92YWxfdCwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSBfTk9FWENFUFQ7CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1NJWkVEX0RFQUxMT0NBVElPTgorX0xJQkNQUF9PVkVSUklEQUJMRV9GVU5DX1ZJUyBfTElCQ1BQX0FWQUlMQUJJTElUWV9TSVpFRF9ORVdfREVMRVRFIHZvaWQgIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBfX3AsIHN0ZDo6c2l6ZV90IF9fc3osIHN0ZDo6YWxpZ25fdmFsX3QpIF9OT0VYQ0VQVDsKKyNlbmRpZgorCitfTElCQ1BQX05PRElTQ0FSRF9BRlRFUl9DWFgxNyBfTElCQ1BQX09WRVJSSURBQkxFX0ZVTkNfVklTIHZvaWQqIG9wZXJhdG9yIG5ld1tdKHN0ZDo6c2l6ZV90IF9fc3osIHN0ZDo6YWxpZ25fdmFsX3QpIF9USFJPV19CQURfQUxMT0M7CitfTElCQ1BQX05PRElTQ0FSRF9BRlRFUl9DWFgxNyBfTElCQ1BQX09WRVJSSURBQkxFX0ZVTkNfVklTIHZvaWQqIG9wZXJhdG9yIG5ld1tdKHN0ZDo6c2l6ZV90IF9fc3osIHN0ZDo6YWxpZ25fdmFsX3QsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgX05PRVhDRVBUIF9OT0FMSUFTOworX0xJQkNQUF9PVkVSUklEQUJMRV9GVU5DX1ZJUyB2b2lkICBvcGVyYXRvciBkZWxldGVbXSh2b2lkKiBfX3AsIHN0ZDo6YWxpZ25fdmFsX3QpIF9OT0VYQ0VQVDsKK19MSUJDUFBfT1ZFUlJJREFCTEVfRlVOQ19WSVMgdm9pZCAgb3BlcmF0b3IgZGVsZXRlW10odm9pZCogX19wLCBzdGQ6OmFsaWduX3ZhbF90LCBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIF9OT0VYQ0VQVDsKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fU0laRURfREVBTExPQ0FUSU9OCitfTElCQ1BQX09WRVJSSURBQkxFX0ZVTkNfVklTIF9MSUJDUFBfQVZBSUxBQklMSVRZX1NJWkVEX05FV19ERUxFVEUgdm9pZCAgb3BlcmF0b3IgZGVsZXRlW10odm9pZCogX19wLCBzdGQ6OnNpemVfdCBfX3N6LCBzdGQ6OmFsaWduX3ZhbF90KSBfTk9FWENFUFQ7CisjZW5kaWYKKyNlbmRpZgorCitfTElCQ1BQX05PRElTQ0FSRF9BRlRFUl9DWFgxNyBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkKiBvcGVyYXRvciBuZXcgIChzdGQ6OnNpemVfdCwgdm9pZCogX19wKSBfTk9FWENFUFQge3JldHVybiBfX3A7fQorX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCogb3BlcmF0b3IgbmV3W10oc3RkOjpzaXplX3QsIHZvaWQqIF9fcCkgX05PRVhDRVBUIHtyZXR1cm4gX19wO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgIG9wZXJhdG9yIGRlbGV0ZSAgKHZvaWQqLCB2b2lkKikgX05PRVhDRVBUIHt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkICBvcGVyYXRvciBkZWxldGVbXSh2b2lkKiwgdm9pZCopIF9OT0VYQ0VQVCB7fQorCisjZW5kaWYgLy8gIV9MSUJDUFBfQUJJX01JQ1JPU09GVCB8fCBfTElCQ1BQX05PX1ZDUlVOVElNRQorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKworX0xJQkNQUF9DT05TVEVYUFIgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYm9vbCBfX2lzX292ZXJhbGlnbmVkX2Zvcl9uZXcoc2l6ZV90IF9fYWxpZ24pIF9OT0VYQ0VQVCB7CisjaWZkZWYgX19TVERDUFBfREVGQVVMVF9ORVdfQUxJR05NRU5UX18KKyAgcmV0dXJuIF9fYWxpZ24gPiBfX1NURENQUF9ERUZBVUxUX05FV19BTElHTk1FTlRfXzsKKyNlbHNlCisgIHJldHVybiBfX2FsaWduID4gYWxpZ25tZW50X29mPG1heF9hbGlnbl90Pjo6dmFsdWU7CisjZW5kaWYKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCAqX19saWJjcHBfYWxsb2NhdGUoc2l6ZV90IF9fc2l6ZSwgc2l6ZV90IF9fYWxpZ24pIHsKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fQUxJR05FRF9BTExPQ0FUSU9OCisgIGlmIChfX2lzX292ZXJhbGlnbmVkX2Zvcl9uZXcoX19hbGlnbikpIHsKKyAgICBjb25zdCBhbGlnbl92YWxfdCBfX2FsaWduX3ZhbCA9IHN0YXRpY19jYXN0PGFsaWduX3ZhbF90PihfX2FsaWduKTsKKyMgaWZkZWYgX0xJQkNQUF9IQVNfTk9fQlVJTFRJTl9BTElHTkVEX09QRVJBVE9SX05FV19ERUxFVEUKKyAgICByZXR1cm4gOjpvcGVyYXRvciBuZXcoX19zaXplLCBfX2FsaWduX3ZhbCk7CisjIGVsc2UKKyAgICByZXR1cm4gX19idWlsdGluX29wZXJhdG9yX25ldyhfX3NpemUsIF9fYWxpZ25fdmFsKTsKKyMgZW5kaWYKKyAgfQorI2Vsc2UKKyAgKCh2b2lkKV9fYWxpZ24pOworI2VuZGlmCisjaWZkZWYgX0xJQkNQUF9IQVNfTk9fQlVJTFRJTl9PUEVSQVRPUl9ORVdfREVMRVRFCisgIHJldHVybiA6Om9wZXJhdG9yIG5ldyhfX3NpemUpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9vcGVyYXRvcl9uZXcoX19zaXplKTsKKyNlbmRpZgorfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIF9fbGliY3BwX2RlYWxsb2NhdGUodm9pZCogX19wdHIsIHNpemVfdCBfX2FsaWduKSB7CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0FMSUdORURfQUxMT0NBVElPTgorICBpZiAoX19pc19vdmVyYWxpZ25lZF9mb3JfbmV3KF9fYWxpZ24pKSB7CisgICAgY29uc3QgYWxpZ25fdmFsX3QgX19hbGlnbl92YWwgPSBzdGF0aWNfY2FzdDxhbGlnbl92YWxfdD4oX19hbGlnbik7CisjIGlmZGVmIF9MSUJDUFBfSEFTX05PX0JVSUxUSU5fQUxJR05FRF9PUEVSQVRPUl9ORVdfREVMRVRFCisgICAgcmV0dXJuIDo6b3BlcmF0b3IgZGVsZXRlKF9fcHRyLCBfX2FsaWduX3ZhbCk7CisjIGVsc2UKKyAgICByZXR1cm4gX19idWlsdGluX29wZXJhdG9yX2RlbGV0ZShfX3B0ciwgX19hbGlnbl92YWwpOworIyBlbmRpZgorICB9CisjZWxzZQorICAoKHZvaWQpX19hbGlnbik7CisjZW5kaWYKKyNpZmRlZiBfTElCQ1BQX0hBU19OT19CVUlMVElOX09QRVJBVE9SX05FV19ERUxFVEUKKyAgcmV0dXJuIDo6b3BlcmF0b3IgZGVsZXRlKF9fcHRyKTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fb3BlcmF0b3JfZGVsZXRlKF9fcHRyKTsKKyNlbmRpZgorfQorCisjaWZkZWYgX0xJQkNQUF9CQURfQVJSQVlfTEVOR1RIX0RFRklORUQKK19MSUJDUFBfTk9SRVRVUk4gaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKK19MSUJDUFBfQVZBSUxBQklMSVRZX0JBRF9BUlJBWV9MRU5HVEgKKyNlbmRpZgordm9pZCBfX3Rocm93X2JhZF9hcnJheV9sZW5ndGgoKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0aHJvdyBiYWRfYXJyYXlfbGVuZ3RoKCk7CisjZWxzZQorCV9WU1REOjphYm9ydCgpOworI2VuZGlmCit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfTk9ESVNDQVJEX0FGVEVSX0NYWDE3IGlubGluZSAKK19MSUJDUFBfQ09OU1RFWFBSIF9UcCogX19sYXVuZGVyKF9UcCogX19wKSBfTk9FWENFUFQKK3sKKyAgICBzdGF0aWNfYXNzZXJ0ICghKGlzX2Z1bmN0aW9uPF9UcD46OnZhbHVlKSwgImNhbid0IGxhdW5kZXIgZnVuY3Rpb25zIiApOworICAgIHN0YXRpY19hc3NlcnQgKCEoaXNfc2FtZTx2b2lkLCB0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKSwgImNhbid0IGxhdW5kZXIgY3Ytdm9pZCIgKTsKKyNpZmRlZiBfTElCQ1BQX0NPTVBJTEVSX0hBU19CVUlMVElOX0xBVU5ERVIKKyAgICByZXR1cm4gX19idWlsdGluX2xhdW5kZXIoX19wKTsKKyNlbHNlCisgICAgcmV0dXJuIF9fcDsKKyNlbmRpZgorfQorCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfTk9ESVNDQVJEX0FGVEVSX0NYWDE3IGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdGV4cHIgX1RwKiBsYXVuZGVyKF9UcCogX19wKSBub2V4Y2VwdAoreworICAgIHJldHVybiBfVlNURDo6X19sYXVuZGVyKF9fcCk7Cit9CisjZW5kaWYKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCisjZW5kaWYgIC8vIF9MSUJDUFBfTkVXCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvbnVtZXJpYyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9udW1lcmljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzM2I2YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvbnVtZXJpYwpAQCAtMCwwICsxLDUyNiBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBudW1lcmljIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9OVU1FUklDCisjZGVmaW5lIF9MSUJDUFBfTlVNRVJJQworCisvKgorICAgIG51bWVyaWMgc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvciwgY2xhc3MgVD4KKyAgICBUCisgICAgYWNjdW11bGF0ZShJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIFQgaW5pdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yLCBjbGFzcyBULCBjbGFzcyBCaW5hcnlPcGVyYXRpb24+CisgICAgVAorICAgIGFjY3VtdWxhdGUoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBUIGluaXQsIEJpbmFyeU9wZXJhdGlvbiBiaW5hcnlfb3ApOworCit0ZW1wbGF0ZTxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxJbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorICAgIHJlZHVjZShJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QpOyAgLy8gQysrMTcKKwordGVtcGxhdGU8Y2xhc3MgSW5wdXRJdGVyYXRvciwgY2xhc3MgVD4KKyAgICBUCisgICAgcmVkdWNlKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwgVCBpbml0KTsgIC8vIEMrKzE3CisKK3RlbXBsYXRlPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIFQsIGNsYXNzIEJpbmFyeU9wZXJhdGlvbj4KKyAgICBUCisgICAgcmVkdWNlKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwgVCBpbml0LCBCaW5hcnlPcGVyYXRpb24gYmluYXJ5X29wKTsgIC8vIEMrKzE3CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yMSwgY2xhc3MgSW5wdXRJdGVyYXRvcjIsIGNsYXNzIFQ+CisgICAgVAorICAgIGlubmVyX3Byb2R1Y3QoSW5wdXRJdGVyYXRvcjEgZmlyc3QxLCBJbnB1dEl0ZXJhdG9yMSBsYXN0MSwgSW5wdXRJdGVyYXRvcjIgZmlyc3QyLCBUIGluaXQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcjEsIGNsYXNzIElucHV0SXRlcmF0b3IyLCBjbGFzcyBULCBjbGFzcyBCaW5hcnlPcGVyYXRpb24xLCBjbGFzcyBCaW5hcnlPcGVyYXRpb24yPgorICAgIFQKKyAgICBpbm5lcl9wcm9kdWN0KElucHV0SXRlcmF0b3IxIGZpcnN0MSwgSW5wdXRJdGVyYXRvcjEgbGFzdDEsIElucHV0SXRlcmF0b3IyIGZpcnN0MiwKKyAgICAgICAgICAgICAgICAgIFQgaW5pdCwgQmluYXJ5T3BlcmF0aW9uMSBiaW5hcnlfb3AxLCBCaW5hcnlPcGVyYXRpb24yIGJpbmFyeV9vcDIpOworCisKK3RlbXBsYXRlPGNsYXNzIElucHV0SXRlcmF0b3IxLCBjbGFzcyBJbnB1dEl0ZXJhdG9yMiwgY2xhc3MgVD4KKyAgICBUCisgICAgdHJhbnNmb3JtX3JlZHVjZShJbnB1dEl0ZXJhdG9yMSBmaXJzdDEsIElucHV0SXRlcmF0b3IxIGxhc3QxLAorICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvcjIgZmlyc3QyLCBUIGluaXQpOyAgLy8gQysrMTcKKwordGVtcGxhdGU8Y2xhc3MgSW5wdXRJdGVyYXRvcjEsIGNsYXNzIElucHV0SXRlcmF0b3IyLCBjbGFzcyBULCBjbGFzcyBCaW5hcnlPcGVyYXRpb24xLCBjbGFzcyBCaW5hcnlPcGVyYXRpb24yPgorICAgIFQKKyAgICB0cmFuc2Zvcm1fcmVkdWNlKElucHV0SXRlcmF0b3IxIGZpcnN0MSwgSW5wdXRJdGVyYXRvcjEgbGFzdDEsCisgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yMiBmaXJzdDIsIFQgaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdGlvbjEgYmluYXJ5X29wMSwgQmluYXJ5T3BlcmF0aW9uMiBiaW5hcnlfb3AyKTsgIC8vIEMrKzE3CisKK3RlbXBsYXRlPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIFQsIGNsYXNzIEJpbmFyeU9wZXJhdGlvbiwgY2xhc3MgVW5hcnlPcGVyYXRpb24+CisgICAgVAorICAgIHRyYW5zZm9ybV9yZWR1Y2UoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBUIGluaXQsCisgICAgICAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRpb24gYmluYXJ5X29wLCBVbmFyeU9wZXJhdGlvbiB1bmFyeV9vcCk7ICAvLyBDKysxNworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvciwgY2xhc3MgT3V0cHV0SXRlcmF0b3I+CisgICAgT3V0cHV0SXRlcmF0b3IKKyAgICBwYXJ0aWFsX3N1bShJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIE91dHB1dEl0ZXJhdG9yIHJlc3VsdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yLCBjbGFzcyBPdXRwdXRJdGVyYXRvciwgY2xhc3MgQmluYXJ5T3BlcmF0aW9uPgorICAgIE91dHB1dEl0ZXJhdG9yCisgICAgcGFydGlhbF9zdW0oSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBPdXRwdXRJdGVyYXRvciByZXN1bHQsIEJpbmFyeU9wZXJhdGlvbiBiaW5hcnlfb3ApOworCit0ZW1wbGF0ZTxjbGFzcyBJbnB1dEl0ZXJhdG9yLCBjbGFzcyBPdXRwdXRJdGVyYXRvciwgY2xhc3MgVD4KKyAgICBPdXRwdXRJdGVyYXRvcgorICAgIGV4Y2x1c2l2ZV9zY2FuKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwKKyAgICAgICAgICAgICAgICAgICBPdXRwdXRJdGVyYXRvciByZXN1bHQsIFQgaW5pdCk7IC8vIEMrKzE3CisKK3RlbXBsYXRlPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIE91dHB1dEl0ZXJhdG9yLCBjbGFzcyBULCBjbGFzcyBCaW5hcnlPcGVyYXRpb24+CisgICAgT3V0cHV0SXRlcmF0b3IKKyAgICBleGNsdXNpdmVfc2NhbihJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICAgICAgICAgT3V0cHV0SXRlcmF0b3IgcmVzdWx0LCBUIGluaXQsIEJpbmFyeU9wZXJhdGlvbiBiaW5hcnlfb3ApOyAvLyBDKysxNworCit0ZW1wbGF0ZTxjbGFzcyBJbnB1dEl0ZXJhdG9yLCBjbGFzcyBPdXRwdXRJdGVyYXRvcj4KKyAgICBPdXRwdXRJdGVyYXRvcgorICAgIGluY2x1c2l2ZV9zY2FuKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwgT3V0cHV0SXRlcmF0b3IgcmVzdWx0KTsgIC8vIEMrKzE3CisKK3RlbXBsYXRlPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIE91dHB1dEl0ZXJhdG9yLCBjbGFzcyBCaW5hcnlPcGVyYXRpb24+CisgICAgT3V0cHV0SXRlcmF0b3IKKyAgICBpbmNsdXNpdmVfc2NhbihJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICAgICAgICAgT3V0cHV0SXRlcmF0b3IgcmVzdWx0LCBCaW5hcnlPcGVyYXRpb24gYmluYXJ5X29wKTsgIC8vIEMrKzE3CisKK3RlbXBsYXRlPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIE91dHB1dEl0ZXJhdG9yLCBjbGFzcyBCaW5hcnlPcGVyYXRpb24sIGNsYXNzIFQ+CisgICAgT3V0cHV0SXRlcmF0b3IKKyAgICBpbmNsdXNpdmVfc2NhbihJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICAgICAgICAgT3V0cHV0SXRlcmF0b3IgcmVzdWx0LCBCaW5hcnlPcGVyYXRpb24gYmluYXJ5X29wLCBUIGluaXQpOyAgLy8gQysrMTcKKwordGVtcGxhdGU8Y2xhc3MgSW5wdXRJdGVyYXRvciwgY2xhc3MgT3V0cHV0SXRlcmF0b3IsIGNsYXNzIFQsCisgICAgICAgICBjbGFzcyBCaW5hcnlPcGVyYXRpb24sIGNsYXNzIFVuYXJ5T3BlcmF0aW9uPgorICAgIE91dHB1dEl0ZXJhdG9yCisgICAgdHJhbnNmb3JtX2V4Y2x1c2l2ZV9zY2FuKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0SXRlcmF0b3IgcmVzdWx0LCBUIGluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdGlvbiBiaW5hcnlfb3AsIFVuYXJ5T3BlcmF0aW9uIHVuYXJ5X29wKTsgIC8vIEMrKzE3CisKK3RlbXBsYXRlPGNsYXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIE91dHB1dEl0ZXJhdG9yLAorICAgICAgICAgY2xhc3MgQmluYXJ5T3BlcmF0aW9uLCBjbGFzcyBVbmFyeU9wZXJhdGlvbj4KKwlPdXRwdXRJdGVyYXRvcgorCXRyYW5zZm9ybV9pbmNsdXNpdmVfc2NhbihJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dEl0ZXJhdG9yIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0aW9uIGJpbmFyeV9vcCwgVW5hcnlPcGVyYXRpb24gdW5hcnlfb3ApOyAgLy8gQysrMTcKKwordGVtcGxhdGU8Y2xhc3MgSW5wdXRJdGVyYXRvciwgY2xhc3MgT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICBjbGFzcyBCaW5hcnlPcGVyYXRpb24sIGNsYXNzIFVuYXJ5T3BlcmF0aW9uLCBjbGFzcyBUPgorCU91dHB1dEl0ZXJhdG9yCisJdHJhbnNmb3JtX2luY2x1c2l2ZV9zY2FuKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0SXRlcmF0b3IgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRpb24gYmluYXJ5X29wLCBVbmFyeU9wZXJhdGlvbiB1bmFyeV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCBpbml0KTsgIC8vIEMrKzE3CisKK3RlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yLCBjbGFzcyBPdXRwdXRJdGVyYXRvcj4KKyAgICBPdXRwdXRJdGVyYXRvcgorICAgIGFkamFjZW50X2RpZmZlcmVuY2UoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBPdXRwdXRJdGVyYXRvciByZXN1bHQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvciwgY2xhc3MgT3V0cHV0SXRlcmF0b3IsIGNsYXNzIEJpbmFyeU9wZXJhdGlvbj4KKyAgICBPdXRwdXRJdGVyYXRvcgorICAgIGFkamFjZW50X2RpZmZlcmVuY2UoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBPdXRwdXRJdGVyYXRvciByZXN1bHQsIEJpbmFyeU9wZXJhdGlvbiBiaW5hcnlfb3ApOworCit0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBUPgorICAgIHZvaWQgaW90YShGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0LCBUIHZhbHVlKTsKKwordGVtcGxhdGUgPGNsYXNzIE0sIGNsYXNzIE4+CisgICAgY29uc3RleHByIGNvbW1vbl90eXBlX3Q8TSxOPiBnY2QoTSBtLCBOIG4pOyAgICAvLyBDKysxNworCit0ZW1wbGF0ZSA8Y2xhc3MgTSwgY2xhc3MgTj4KKyAgICBjb25zdGV4cHIgY29tbW9uX3R5cGVfdDxNLE4+IGxjbShNIG0sIE4gbik7ICAgIC8vIEMrKzE3CisKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGltaXRzPiAvLyBmb3IgbnVtZXJpY19saW1pdHMKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9QVVNIX01BQ1JPUworI2luY2x1ZGUgPF9fdW5kZWZfbWFjcm9zPgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwCithY2N1bXVsYXRlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX1RwIF9faW5pdCkKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgX19pbml0ID0gX19pbml0ICsgKl9fZmlyc3Q7CisgICAgcmV0dXJuIF9faW5pdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfVHAsIGNsYXNzIF9CaW5hcnlPcGVyYXRpb24+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwCithY2N1bXVsYXRlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX1RwIF9faW5pdCwgX0JpbmFyeU9wZXJhdGlvbiBfX2JpbmFyeV9vcCkKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgX19pbml0ID0gX19iaW5hcnlfb3AoX19pbml0LCAqX19maXJzdCk7CisgICAgcmV0dXJuIF9faW5pdDsKK30KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9UcCwgY2xhc3MgX0JpbmFyeU9wPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19UcAorcmVkdWNlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX1RwIF9faW5pdCwgX0JpbmFyeU9wIF9fYikKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgX19pbml0ID0gX19iKF9faW5pdCwgKl9fZmlyc3QpOworICAgIHJldHVybiBfX2luaXQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19UcAorcmVkdWNlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX1RwIF9faW5pdCkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OnJlZHVjZShfX2ZpcnN0LCBfX2xhc3QsIF9faW5pdCwgX1ZTVEQ6OnBsdXM8PigpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUKK3JlZHVjZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgcmV0dXJuIF9WU1REOjpyZWR1Y2UoX19maXJzdCwgX19sYXN0LAorICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGV7fSk7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yMSwgY2xhc3MgX0lucHV0SXRlcmF0b3IyLCBjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwCitpbm5lcl9wcm9kdWN0KF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX1RwIF9faW5pdCkKK3sKKyAgICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKHZvaWQpICsrX19maXJzdDIpCisgICAgICAgIF9faW5pdCA9IF9faW5pdCArICpfX2ZpcnN0MSAqICpfX2ZpcnN0MjsKKyAgICByZXR1cm4gX19pbml0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IxLCBjbGFzcyBfSW5wdXRJdGVyYXRvcjIsIGNsYXNzIF9UcCwgY2xhc3MgX0JpbmFyeU9wZXJhdGlvbjEsIGNsYXNzIF9CaW5hcnlPcGVyYXRpb24yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19UcAoraW5uZXJfcHJvZHVjdChfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLCBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsCisgICAgICAgICAgICAgIF9UcCBfX2luaXQsIF9CaW5hcnlPcGVyYXRpb24xIF9fYmluYXJ5X29wMSwgX0JpbmFyeU9wZXJhdGlvbjIgX19iaW5hcnlfb3AyKQoreworICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCAodm9pZCkgKytfX2ZpcnN0MikKKyAgICAgICAgX19pbml0ID0gX19iaW5hcnlfb3AxKF9faW5pdCwgX19iaW5hcnlfb3AyKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSk7CisgICAgcmV0dXJuIF9faW5pdDsKK30KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9UcCwgY2xhc3MgX0JpbmFyeU9wLCBjbGFzcyBfVW5hcnlPcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfVHAKK3RyYW5zZm9ybV9yZWR1Y2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICBfVHAgX19pbml0LCAgX0JpbmFyeU9wIF9fYiwgX1VuYXJ5T3AgX191KQoreworICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICBfX2luaXQgPSBfX2IoX19pbml0LCBfX3UoKl9fZmlyc3QpKTsKKyAgICByZXR1cm4gX19pbml0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IxLCBjbGFzcyBfSW5wdXRJdGVyYXRvcjIsCisgICAgICAgICAgY2xhc3MgX1RwLCBjbGFzcyBfQmluYXJ5T3AxLCBjbGFzcyBfQmluYXJ5T3AyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19UcAordHJhbnNmb3JtX3JlZHVjZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9UcCBfX2luaXQsICBfQmluYXJ5T3AxIF9fYjEsIF9CaW5hcnlPcDIgX19iMikKK3sKKyAgICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKHZvaWQpICsrX19maXJzdDIpCisgICAgICAgIF9faW5pdCA9IF9fYjEoX19pbml0LCBfX2IyKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSk7CisgICAgcmV0dXJuIF9faW5pdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yMSwgY2xhc3MgX0lucHV0SXRlcmF0b3IyLCBjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwCit0cmFuc2Zvcm1fcmVkdWNlKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX1RwIF9faW5pdCkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OnRyYW5zZm9ybV9yZWR1Y2UoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfVlNURDo6bW92ZShfX2luaXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6cGx1czw+KCksIF9WU1REOjptdWx0aXBsaWVzPD4oKSk7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX091dHB1dEl0ZXJhdG9yCitwYXJ0aWFsX3N1bShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKK3sKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisgICAgeworICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlIF9fdCgqX19maXJzdCk7CisgICAgICAgICpfX3Jlc3VsdCA9IF9fdDsKKyAgICAgICAgZm9yICgrK19fZmlyc3QsICh2b2lkKSArK19fcmVzdWx0OyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0LCAodm9pZCkgKytfX3Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgX190ID0gX190ICsgKl9fZmlyc3Q7CisgICAgICAgICAgICAqX19yZXN1bHQgPSBfX3Q7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9PdXRwdXRJdGVyYXRvciwgY2xhc3MgX0JpbmFyeU9wZXJhdGlvbj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfT3V0cHV0SXRlcmF0b3IKK3BhcnRpYWxfc3VtKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorICAgICAgICAgICAgICBfQmluYXJ5T3BlcmF0aW9uIF9fYmluYXJ5X29wKQoreworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICB7CisgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUgX190KCpfX2ZpcnN0KTsKKyAgICAgICAgKl9fcmVzdWx0ID0gX190OworICAgICAgICBmb3IgKCsrX19maXJzdCwgKHZvaWQpICsrX19yZXN1bHQ7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICh2b2lkKSArK19fcmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICBfX3QgPSBfX2JpbmFyeV9vcChfX3QsICpfX2ZpcnN0KTsKKyAgICAgICAgICAgICpfX3Jlc3VsdCA9IF9fdDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19yZXN1bHQ7Cit9CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3IsIGNsYXNzIF9UcCwgY2xhc3MgX0JpbmFyeU9wPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19PdXRwdXRJdGVyYXRvcgorZXhjbHVzaXZlX3NjYW4oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfVHAgX19pbml0LCBfQmluYXJ5T3AgX19iKQoreworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICB7CisgICAgICAgIF9UcCBfX3NhdmVkID0gX19pbml0OworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBfX2luaXQgPSBfX2IoX19pbml0LCAqX19maXJzdCk7CisgICAgICAgICAgICAqX19yZXN1bHQgPSBfX3NhdmVkOworICAgICAgICAgICAgX19zYXZlZCA9IF9faW5pdDsKKyAgICAgICAgICAgICsrX19yZXN1bHQ7CisgICAgICAgIH0gd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpOworICAgIH0KKyAgICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX091dHB1dEl0ZXJhdG9yCitleGNsdXNpdmVfc2NhbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9UcCBfX2luaXQpCit7CisgICAgcmV0dXJuIF9WU1REOjpleGNsdXNpdmVfc2NhbihfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfX2luaXQsIF9WU1REOjpwbHVzPD4oKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfVHAsIGNsYXNzIF9CaW5hcnlPcD4KK19PdXRwdXRJdGVyYXRvciBpbmNsdXNpdmVfc2NhbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5T3AgX19iLCAgX1RwIF9faW5pdCkKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKHZvaWQpICsrX19yZXN1bHQpIHsKKyAgICAgICAgX19pbml0ID0gX19iKF9faW5pdCwgKl9fZmlyc3QpOworICAgICAgICAqX19yZXN1bHQgPSBfX2luaXQ7CisgICAgICAgIH0KKyAgICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfQmluYXJ5T3A+CitfT3V0cHV0SXRlcmF0b3IgaW5jbHVzaXZlX3NjYW4oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0JpbmFyeU9wIF9fYikKK3sKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIHsKKyAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlIF9faW5pdCA9ICpfX2ZpcnN0OworICAgICAgICAqX19yZXN1bHQrKyA9IF9faW5pdDsKKyAgICAgICAgaWYgKCsrX19maXJzdCAhPSBfX2xhc3QpCisgICAgICAgICAgICByZXR1cm4gX1ZTVEQ6OmluY2x1c2l2ZV9zY2FuKF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9fYiwgX19pbml0KTsKKyAgICAgICAgfQorCisgICAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK19PdXRwdXRJdGVyYXRvciBpbmNsdXNpdmVfc2NhbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQoreworICAgIHJldHVybiBfVlNURDo6aW5jbHVzaXZlX3NjYW4oX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwgc3RkOjpwbHVzPD4oKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfVHAsCisgICAgICAgICAgY2xhc3MgX0JpbmFyeU9wLCBjbGFzcyBfVW5hcnlPcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfT3V0cHV0SXRlcmF0b3IKK3RyYW5zZm9ybV9leGNsdXNpdmVfc2NhbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9UcCBfX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5T3AgX19iLCBfVW5hcnlPcCBfX3UpCit7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgX1RwIF9fc2F2ZWQgPSBfX2luaXQ7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIF9faW5pdCA9IF9fYihfX2luaXQsIF9fdSgqX19maXJzdCkpOworICAgICAgICAgICAgKl9fcmVzdWx0ID0gX19zYXZlZDsKKyAgICAgICAgICAgIF9fc2F2ZWQgPSBfX2luaXQ7CisgICAgICAgICAgICArK19fcmVzdWx0OworICAgICAgICB9IHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KTsKKyAgICB9CisgICAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9PdXRwdXRJdGVyYXRvciwgY2xhc3MgX1RwLCBjbGFzcyBfQmluYXJ5T3AsIGNsYXNzIF9VbmFyeU9wPgorX091dHB1dEl0ZXJhdG9yIHRyYW5zZm9ybV9pbmNsdXNpdmVfc2NhbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9CaW5hcnlPcCBfX2IsIF9VbmFyeU9wIF9fdSwgX1RwIF9faW5pdCkKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKHZvaWQpICsrX19yZXN1bHQpIHsKKyAgICAgICAgX19pbml0ID0gX19iKF9faW5pdCwgX191KCpfX2ZpcnN0KSk7CisgICAgICAgICpfX3Jlc3VsdCA9IF9faW5pdDsKKyAgICAgICAgfQorCisgICAgcmV0dXJuIF9fcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9PdXRwdXRJdGVyYXRvciwgY2xhc3MgX0JpbmFyeU9wLCBjbGFzcyBfVW5hcnlPcD4KK19PdXRwdXRJdGVyYXRvciB0cmFuc2Zvcm1faW5jbHVzaXZlX3NjYW4oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0JpbmFyeU9wIF9fYiwgX1VuYXJ5T3AgX191KQoreworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUgX19pbml0ID0gX191KCpfX2ZpcnN0KTsKKyAgICAgICAgKl9fcmVzdWx0KysgPSBfX2luaXQ7CisgICAgICAgIGlmICgrK19fZmlyc3QgIT0gX19sYXN0KQorICAgICAgICAgICAgcmV0dXJuIF9WU1REOjp0cmFuc2Zvcm1faW5jbHVzaXZlX3NjYW4oX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwgX19iLCBfX3UsIF9faW5pdCk7CisgICAgICAgIH0KKworICAgIHJldHVybiBfX3Jlc3VsdDsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfT3V0cHV0SXRlcmF0b3IKK2FkamFjZW50X2RpZmZlcmVuY2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCit7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBfX3QxKCpfX2ZpcnN0KTsKKyAgICAgICAgKl9fcmVzdWx0ID0gX190MTsKKyAgICAgICAgZm9yICgrK19fZmlyc3QsICh2b2lkKSArK19fcmVzdWx0OyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0LCAodm9pZCkgKytfX3Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBfX3QyKCpfX2ZpcnN0KTsKKyAgICAgICAgICAgICpfX3Jlc3VsdCA9IF9fdDIgLSBfX3QxOworICAgICAgICAgICAgX190MSA9IF9WU1REOjptb3ZlKF9fdDIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3IsIGNsYXNzIF9CaW5hcnlPcGVyYXRpb24+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX091dHB1dEl0ZXJhdG9yCithZGphY2VudF9kaWZmZXJlbmNlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3ApCit7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBfX3QxKCpfX2ZpcnN0KTsKKyAgICAgICAgKl9fcmVzdWx0ID0gX190MTsKKyAgICAgICAgZm9yICgrK19fZmlyc3QsICh2b2lkKSArK19fcmVzdWx0OyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0LCAodm9pZCkgKytfX3Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBfX3QyKCpfX2ZpcnN0KTsKKyAgICAgICAgICAgICpfX3Jlc3VsdCA9IF9fYmluYXJ5X29wKF9fdDIsIF9fdDEpOworICAgICAgICAgICAgX190MSA9IF9WU1REOjptb3ZlKF9fdDIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitpb3RhKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIF9UcCBfX3ZhbHVlXykKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKHZvaWQpICsrX192YWx1ZV8pCisgICAgICAgICpfX2ZpcnN0ID0gX192YWx1ZV87Cit9CisKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX1NvdXJjZSwgYm9vbCBfSXNTaWduZWQgPSBpc19zaWduZWQ8X1NvdXJjZT46OnZhbHVlPiBzdHJ1Y3QgX19hYnM7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU291cmNlPgorc3RydWN0IF9fYWJzPF9SZXN1bHQsIF9Tb3VyY2UsIHRydWU+IHsKKyAgICBfTElCQ1BQX0NPTlNURVhQUiBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1Jlc3VsdCBvcGVyYXRvcigpKF9Tb3VyY2UgX190KSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICBpZiAoX190ID49IDApIHJldHVybiBfX3Q7CisgICAgaWYgKF9fdCA9PSBudW1lcmljX2xpbWl0czxfU291cmNlPjo6bWluKCkpIHJldHVybiAtc3RhdGljX2Nhc3Q8X1Jlc3VsdD4oX190KTsKKyAgICByZXR1cm4gLV9fdDsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX1NvdXJjZT4KK3N0cnVjdCBfX2FiczxfUmVzdWx0LCBfU291cmNlLCBmYWxzZT4geworICAgIF9MSUJDUFBfQ09OU1RFWFBSIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfUmVzdWx0IG9wZXJhdG9yKCkoX1NvdXJjZSBfX3QpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuIF9fdDsgfQorfTsKKworCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitfTElCQ1BQX0NPTlNURVhQUiBfTElCQ1BQX0hJRERFTgorX1RwIF9fZ2NkKF9UcCBfX20sIF9UcCBfX24pCit7CisgICAgc3RhdGljX2Fzc2VydCgoIWlzX3NpZ25lZDxfVHA+Ojp2YWx1ZSksICIiKTsKKyAgICByZXR1cm4gX19uID09IDAgPyBfX20gOiBfVlNURDo6X19nY2Q8X1RwPihfX24sIF9fbSAlIF9fbik7Cit9CisKKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitfTElCQ1BQX0NPTlNURVhQUiBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb21tb25fdHlwZV90PF9UcCxfVXA+CitnY2QoX1RwIF9fbSwgX1VwIF9fbikKK3sKKyAgICBzdGF0aWNfYXNzZXJ0KChpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZSAmJiBpc19pbnRlZ3JhbDxfVXA+Ojp2YWx1ZSksICJBcmd1bWVudHMgdG8gZ2NkIG11c3QgYmUgaW50ZWdlciB0eXBlcyIpOworICAgIHN0YXRpY19hc3NlcnQoKCFpc19zYW1lPHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlLCBib29sPjo6dmFsdWUpLCAiRmlyc3QgYXJndW1lbnQgdG8gZ2NkIGNhbm5vdCBiZSBib29sIiApOworICAgIHN0YXRpY19hc3NlcnQoKCFpc19zYW1lPHR5cGVuYW1lIHJlbW92ZV9jdjxfVXA+Ojp0eXBlLCBib29sPjo6dmFsdWUpLCAiU2Vjb25kIGFyZ3VtZW50IHRvIGdjZCBjYW5ub3QgYmUgYm9vbCIgKTsKKyAgICB1c2luZyBfUnAgPSBjb21tb25fdHlwZV90PF9UcCxfVXA+OworICAgIHVzaW5nIF9XcCA9IG1ha2VfdW5zaWduZWRfdDxfUnA+OworICAgIHJldHVybiBzdGF0aWNfY2FzdDxfUnA+KF9WU1REOjpfX2djZCgKKyAgICAgICAgc3RhdGljX2Nhc3Q8X1dwPihfX2FiczxfUnAsIF9UcD4oKShfX20pKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8X1dwPihfX2FiczxfUnAsIF9VcD4oKShfX24pKSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK19MSUJDUFBfQ09OU1RFWFBSIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbW1vbl90eXBlX3Q8X1RwLF9VcD4KK2xjbShfVHAgX19tLCBfVXAgX19uKQoreworICAgIHN0YXRpY19hc3NlcnQoKGlzX2ludGVncmFsPF9UcD46OnZhbHVlICYmIGlzX2ludGVncmFsPF9VcD46OnZhbHVlKSwgIkFyZ3VtZW50cyB0byBsY20gbXVzdCBiZSBpbnRlZ2VyIHR5cGVzIik7CisgICAgc3RhdGljX2Fzc2VydCgoIWlzX3NhbWU8dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGUsIGJvb2w+Ojp2YWx1ZSksICJGaXJzdCBhcmd1bWVudCB0byBsY20gY2Fubm90IGJlIGJvb2wiICk7CisgICAgc3RhdGljX2Fzc2VydCgoIWlzX3NhbWU8dHlwZW5hbWUgcmVtb3ZlX2N2PF9VcD46OnR5cGUsIGJvb2w+Ojp2YWx1ZSksICJTZWNvbmQgYXJndW1lbnQgdG8gbGNtIGNhbm5vdCBiZSBib29sIiApOworICAgIGlmIChfX20gPT0gMCB8fCBfX24gPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB1c2luZyBfUnAgPSBjb21tb25fdHlwZV90PF9UcCxfVXA+OworICAgIF9ScCBfX3ZhbDEgPSBfX2FiczxfUnAsIF9UcD4oKShfX20pIC8gX1ZTVEQ6OmdjZChfX20sIF9fbik7CisgICAgX1JwIF9fdmFsMiA9IF9fYWJzPF9ScCwgX1VwPigpKF9fbik7CisgICAgX0xJQkNQUF9BU1NFUlQoKG51bWVyaWNfbGltaXRzPF9ScD46Om1heCgpIC8gX192YWwxID4gX192YWwyKSwgIk92ZXJmbG93IGluIGxjbSIpOworICAgIHJldHVybiBfX3ZhbDEgKiBfX3ZhbDI7Cit9CisKKyNlbmRpZiAvKiBfTElCQ1BQX1NURF9WRVIgPiAxNCAqLworCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKK19MSUJDUFBfUE9QX01BQ1JPUworCisjZW5kaWYgIC8vIF9MSUJDUFBfTlVNRVJJQwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL29wdGlvbmFsIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL29wdGlvbmFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOGU0OTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvb3B0aW9uYWwKQEAgLTAsMCArMSwxMzk5IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBvcHRpb25hbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX09QVElPTkFMCisjZGVmaW5lIF9MSUJDUFBfT1BUSU9OQUwKKworLyoKKyAgICBvcHRpb25hbCBzeW5vcHNpcworCisvLyBDKysxegorCituYW1lc3BhY2Ugc3RkIHsKKyAgLy8gMjMuNi4zLCBvcHRpb25hbCBmb3Igb2JqZWN0IHR5cGVzCisgIHRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBvcHRpb25hbDsKKworICAvLyAyMy42LjQsIG5vLXZhbHVlIHN0YXRlIGluZGljYXRvcgorICBzdHJ1Y3QgbnVsbG9wdF90e3NlZSBiZWxvdyB9OworICBpbmxpbmUgY29uc3RleHByIG51bGxvcHRfdCBudWxsb3B0KHVuc3BlY2lmaWVkICk7CisKKyAgLy8gMjMuNi41LCBjbGFzcyBiYWRfb3B0aW9uYWxfYWNjZXNzCisgIGNsYXNzIGJhZF9vcHRpb25hbF9hY2Nlc3M7CisKKyAgLy8gMjMuNi42LCByZWxhdGlvbmFsIG9wZXJhdG9ycworICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KKyAgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBvcHRpb25hbDxUPiYsIGNvbnN0IG9wdGlvbmFsPFU+Jik7CisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgorICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IG9wdGlvbmFsPFQ+JiwgY29uc3Qgb3B0aW9uYWw8VT4mKTsKKyAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+CisgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPChjb25zdCBvcHRpb25hbDxUPiYsIGNvbnN0IG9wdGlvbmFsPFU+Jik7CisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgorICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj4oY29uc3Qgb3B0aW9uYWw8VD4mLCBjb25zdCBvcHRpb25hbDxVPiYpOworICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KKyAgY29uc3RleHByIGJvb2wgb3BlcmF0b3I8PShjb25zdCBvcHRpb25hbDxUPiYsIGNvbnN0IG9wdGlvbmFsPFU+Jik7CisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgorICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IG9wdGlvbmFsPFQ+JiwgY29uc3Qgb3B0aW9uYWw8VT4mKTsKKworICAvLyAyMy42LjcgY29tcGFyaXNvbiB3aXRoIG51bGxvcHQKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPT0oY29uc3Qgb3B0aW9uYWw8VD4mLCBudWxsb3B0X3QpIG5vZXhjZXB0OworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShudWxsb3B0X3QsIGNvbnN0IG9wdGlvbmFsPFQ+Jikgbm9leGNlcHQ7CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IG9wdGlvbmFsPFQ+JiwgbnVsbG9wdF90KSBub2V4Y2VwdDsKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0obnVsbG9wdF90LCBjb25zdCBvcHRpb25hbDxUPiYpIG5vZXhjZXB0OworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gY29uc3RleHByIGJvb2wgb3BlcmF0b3I8KGNvbnN0IG9wdGlvbmFsPFQ+JiwgbnVsbG9wdF90KSBub2V4Y2VwdDsKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPChudWxsb3B0X3QsIGNvbnN0IG9wdGlvbmFsPFQ+Jikgbm9leGNlcHQ7CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IG9wdGlvbmFsPFQ+JiwgbnVsbG9wdF90KSBub2V4Y2VwdDsKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPD0obnVsbG9wdF90LCBjb25zdCBvcHRpb25hbDxUPiYpIG5vZXhjZXB0OworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gY29uc3RleHByIGJvb2wgb3BlcmF0b3I+KGNvbnN0IG9wdGlvbmFsPFQ+JiwgbnVsbG9wdF90KSBub2V4Y2VwdDsKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPihudWxsb3B0X3QsIGNvbnN0IG9wdGlvbmFsPFQ+Jikgbm9leGNlcHQ7CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IG9wdGlvbmFsPFQ+JiwgbnVsbG9wdF90KSBub2V4Y2VwdDsKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPj0obnVsbG9wdF90LCBjb25zdCBvcHRpb25hbDxUPiYpIG5vZXhjZXB0OworCisgIC8vIDIzLjYuOCwgY29tcGFyaXNvbiB3aXRoIFQKKyAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPT0oY29uc3Qgb3B0aW9uYWw8VD4mLCBjb25zdCBVJik7CisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFQmLCBjb25zdCBvcHRpb25hbDxVPiYpOworICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gY29uc3RleHByIGJvb2wgb3BlcmF0b3IhPShjb25zdCBvcHRpb25hbDxUPiYsIGNvbnN0IFUmKTsKKyAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgVCYsIGNvbnN0IG9wdGlvbmFsPFU+Jik7CisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3Qgb3B0aW9uYWw8VD4mLCBjb25zdCBVJik7CisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgVCYsIGNvbnN0IG9wdGlvbmFsPFU+Jik7CisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IG9wdGlvbmFsPFQ+JiwgY29uc3QgVSYpOworICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gY29uc3RleHByIGJvb2wgb3BlcmF0b3I8PShjb25zdCBUJiwgY29uc3Qgb3B0aW9uYWw8VT4mKTsKKyAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPihjb25zdCBvcHRpb25hbDxUPiYsIGNvbnN0IFUmKTsKKyAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPihjb25zdCBUJiwgY29uc3Qgb3B0aW9uYWw8VT4mKTsKKyAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+IGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPj0oY29uc3Qgb3B0aW9uYWw8VD4mLCBjb25zdCBVJik7CisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFQmLCBjb25zdCBvcHRpb25hbDxVPiYpOworCisgIC8vIDIzLjYuOSwgc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBzd2FwKG9wdGlvbmFsPFQ+Jiwgb3B0aW9uYWw8VD4mKSBub2V4Y2VwdChzZWUgYmVsb3cgKTsKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNvbnN0ZXhwciBvcHRpb25hbDxzZWUgYmVsb3cgPiBtYWtlX29wdGlvbmFsKFQmJik7CisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBBcmdzPgorICAgIGNvbnN0ZXhwciBvcHRpb25hbDxUPiBtYWtlX29wdGlvbmFsKEFyZ3MmJi4uLiBhcmdzKTsKKyAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzLi4uIEFyZ3M+CisgICAgY29uc3RleHByIG9wdGlvbmFsPFQ+IG1ha2Vfb3B0aW9uYWwoaW5pdGlhbGl6ZXJfbGlzdDxVPiBpbCwgQXJncyYmLi4uIGFyZ3MpOworCisgIC8vIDIzLjYuMTAsIGhhc2ggc3VwcG9ydAorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGhhc2g7CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaGFzaDxvcHRpb25hbDxUPj47CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIG9wdGlvbmFsIHsKKyAgcHVibGljOgorICAgIHVzaW5nIHZhbHVlX3R5cGUgPSBUOworCisgICAgLy8gMjMuNi4zLjEsIGNvbnN0cnVjdG9ycworICAgIGNvbnN0ZXhwciBvcHRpb25hbCgpIG5vZXhjZXB0OworICAgIGNvbnN0ZXhwciBvcHRpb25hbChudWxsb3B0X3QpIG5vZXhjZXB0OworICAgIG9wdGlvbmFsKGNvbnN0IG9wdGlvbmFsICYpOworICAgIG9wdGlvbmFsKG9wdGlvbmFsICYmKSBub2V4Y2VwdChzZWUgYmVsb3cpOworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPiBjb25zdGV4cHIgZXhwbGljaXQgb3B0aW9uYWwoaW5fcGxhY2VfdCwgQXJncyAmJi4uLik7CisgICAgdGVtcGxhdGUgPGNsYXNzIFUsIGNsYXNzLi4uIEFyZ3M+CisgICAgICBjb25zdGV4cHIgZXhwbGljaXQgb3B0aW9uYWwoaW5fcGxhY2VfdCwgaW5pdGlhbGl6ZXJfbGlzdDxVPiwgQXJncyAmJi4uLik7CisgICAgdGVtcGxhdGUgPGNsYXNzIFUgPSBUPgorICAgICAgY29uc3RleHByIEVYUExJQ0lUIG9wdGlvbmFsKFUgJiYpOworICAgIHRlbXBsYXRlIDxjbGFzcyBVPgorICAgICAgY29uc3RleHByIEVYUExJQ0lUIG9wdGlvbmFsKGNvbnN0IG9wdGlvbmFsPFU+ICYpOworICAgIHRlbXBsYXRlIDxjbGFzcyBVPgorICAgICAgY29uc3RleHByIEVYUExJQ0lUIG9wdGlvbmFsKG9wdGlvbmFsPFU+ICYmKTsKKworICAgIC8vIDIzLjYuMy4yLCBkZXN0cnVjdG9yCisgICAgfm9wdGlvbmFsKCk7CisKKyAgICAvLyAyMy42LjMuMywgYXNzaWdubWVudAorICAgIG9wdGlvbmFsICZvcGVyYXRvcj0obnVsbG9wdF90KSBub2V4Y2VwdDsKKyAgICBvcHRpb25hbCAmb3BlcmF0b3I9KGNvbnN0IG9wdGlvbmFsICYpOworICAgIG9wdGlvbmFsICZvcGVyYXRvcj0ob3B0aW9uYWwgJiYpIG5vZXhjZXB0KHNlZSBiZWxvdyApOworICAgIHRlbXBsYXRlIDxjbGFzcyBVID0gVD4gb3B0aW9uYWwgJm9wZXJhdG9yPShVICYmKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVT4gb3B0aW9uYWwgJm9wZXJhdG9yPShjb25zdCBvcHRpb25hbDxVPiAmKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVT4gb3B0aW9uYWwgJm9wZXJhdG9yPShvcHRpb25hbDxVPiAmJik7CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+IFQmIGVtcGxhY2UoQXJncyAmJi4uLik7CisgICAgdGVtcGxhdGUgPGNsYXNzIFUsIGNsYXNzLi4uIEFyZ3M+CisgICAgICBUJiBlbXBsYWNlKGluaXRpYWxpemVyX2xpc3Q8VT4sIEFyZ3MgJiYuLi4pOworCisgICAgLy8gMjMuNi4zLjQsIHN3YXAKKyAgICB2b2lkIHN3YXAob3B0aW9uYWwgJikgbm9leGNlcHQoc2VlIGJlbG93ICk7CisKKyAgICAvLyAyMy42LjMuNSwgb2JzZXJ2ZXJzCisgICAgY29uc3RleHByIFQgY29uc3QgKm9wZXJhdG9yLT4oKSBjb25zdDsKKyAgICBjb25zdGV4cHIgVCAqb3BlcmF0b3ItPigpOworICAgIGNvbnN0ZXhwciBUIGNvbnN0ICZvcGVyYXRvciooKSBjb25zdCAmOworICAgIGNvbnN0ZXhwciBUICZvcGVyYXRvciooKSAmOworICAgIGNvbnN0ZXhwciBUICYmb3BlcmF0b3IqKCkgJiY7CisgICAgY29uc3RleHByIGNvbnN0IFQgJiZvcGVyYXRvciooKSBjb25zdCAmJjsKKyAgICBjb25zdGV4cHIgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IG5vZXhjZXB0OworICAgIGNvbnN0ZXhwciBib29sIGhhc192YWx1ZSgpIGNvbnN0IG5vZXhjZXB0OworICAgIGNvbnN0ZXhwciBUIGNvbnN0ICZ2YWx1ZSgpIGNvbnN0ICY7CisgICAgY29uc3RleHByIFQgJnZhbHVlKCkgJjsKKyAgICBjb25zdGV4cHIgVCAmJnZhbHVlKCkgJiY7CisgICAgY29uc3RleHByIGNvbnN0IFQgJiZ2YWx1ZSgpIGNvbnN0ICYmOworICAgIHRlbXBsYXRlIDxjbGFzcyBVPiBjb25zdGV4cHIgVCB2YWx1ZV9vcihVICYmKSBjb25zdCAmOworICAgIHRlbXBsYXRlIDxjbGFzcyBVPiBjb25zdGV4cHIgVCB2YWx1ZV9vcihVICYmKSAmJjsKKworICAgIC8vIDIzLjYuMy42LCBtb2RpZmllcnMKKyAgICB2b2lkIHJlc2V0KCkgbm9leGNlcHQ7CisKKyAgcHJpdmF0ZToKKyAgICBUICp2YWw7IC8vIGV4cG9zaXRpb24gb25seQorICB9OworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxfX2RlYnVnPgorI2luY2x1ZGUgPF9fZnVuY3Rpb25hbF9iYXNlPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX1BVU0hfTUFDUk9TCisjaW5jbHVkZSA8X191bmRlZl9tYWNyb3M+CisKKworbmFtZXNwYWNlIHN0ZCAgLy8gcHVycG9zZWZ1bGx5IG5vdCB1c2luZyB2ZXJzaW9uaW5nIG5hbWVzcGFjZQoreworCitjbGFzcyBfTElCQ1BQX0VYQ0VQVElPTl9BQkkgYmFkX29wdGlvbmFsX2FjY2VzcworICAgIDogcHVibGljIGV4Y2VwdGlvbgoreworcHVibGljOgorICAgIC8vIEdldCB0aGUga2V5IGZ1bmN0aW9uIH5iYWRfb3B0aW9uYWxfYWNjZXNzKCkgaW50byB0aGUgZHlsaWIKKyAgICB2aXJ0dWFsIH5iYWRfb3B0aW9uYWxfYWNjZXNzKCkgX05PRVhDRVBUOworICAgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9OT0VYQ0VQVDsKK307CisKK30gIC8vIHN0ZAorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK19MSUJDUFBfTk9SRVRVUk4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIF9fdGhyb3dfYmFkX29wdGlvbmFsX2FjY2VzcygpIHsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHRocm93IGJhZF9vcHRpb25hbF9hY2Nlc3MoKTsKKyNlbHNlCisgICAgICAgIF9WU1REOjphYm9ydCgpOworI2VuZGlmCit9CisKK3N0cnVjdCBudWxsb3B0X3QKK3sKKyAgICBzdHJ1Y3QgX19zZWNyZXRfdGFnIHsgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBleHBsaWNpdCBfX3NlY3JldF90YWcoKSA9IGRlZmF1bHQ7IH07CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdGV4cHIgZXhwbGljaXQgbnVsbG9wdF90KF9fc2VjcmV0X3RhZywgX19zZWNyZXRfdGFnKSBub2V4Y2VwdCB7fQorfTsKKworX0xJQkNQUF9JTkxJTkVfVkFSIGNvbnN0ZXhwciBudWxsb3B0X3QgbnVsbG9wdHtudWxsb3B0X3Q6Ol9fc2VjcmV0X3RhZ3t9LCBudWxsb3B0X3Q6Ol9fc2VjcmV0X3RhZ3t9fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgYm9vbCA9IGlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGU8X1RwPjo6dmFsdWU+CitzdHJ1Y3QgX19vcHRpb25hbF9kZXN0cnVjdF9iYXNlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fb3B0aW9uYWxfZGVzdHJ1Y3RfYmFzZTxfVHAsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisgICAgc3RhdGljX2Fzc2VydChpc19vYmplY3Rfdjx2YWx1ZV90eXBlPiwKKyAgICAgICAgImluc3RhbnRpYXRpb24gb2Ygb3B0aW9uYWwgd2l0aCBhIG5vbi1vYmplY3QgdHlwZSBpcyB1bmRlZmluZWQgYmVoYXZpb3IiKTsKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgY2hhciBfX251bGxfc3RhdGVfOworICAgICAgICB2YWx1ZV90eXBlIF9fdmFsXzsKKyAgICB9OworICAgIGJvb2wgX19lbmdhZ2VkXzsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB+X19vcHRpb25hbF9kZXN0cnVjdF9iYXNlKCkKKyAgICB7CisgICAgICAgIGlmIChfX2VuZ2FnZWRfKQorICAgICAgICAgICAgX192YWxfLn52YWx1ZV90eXBlKCk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0ZXhwciBfX29wdGlvbmFsX2Rlc3RydWN0X2Jhc2UoKSBub2V4Y2VwdAorICAgICAgICA6ICBfX251bGxfc3RhdGVfKCksCisgICAgICAgICAgIF9fZW5nYWdlZF8oZmFsc2UpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0ZXhwciBleHBsaWNpdCBfX29wdGlvbmFsX2Rlc3RydWN0X2Jhc2UoaW5fcGxhY2VfdCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgIDogIF9fdmFsXyhfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLiksCisgICAgICAgICAgIF9fZW5nYWdlZF8odHJ1ZSkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHJlc2V0KCkgbm9leGNlcHQKKyAgICB7CisgICAgICAgIGlmIChfX2VuZ2FnZWRfKQorICAgICAgICB7CisgICAgICAgICAgICBfX3ZhbF8ufnZhbHVlX3R5cGUoKTsKKyAgICAgICAgICAgIF9fZW5nYWdlZF8gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19vcHRpb25hbF9kZXN0cnVjdF9iYXNlPF9UcCwgdHJ1ZT4KK3sKKyAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICAgIHN0YXRpY19hc3NlcnQoaXNfb2JqZWN0X3Y8dmFsdWVfdHlwZT4sCisgICAgICAgICJpbnN0YW50aWF0aW9uIG9mIG9wdGlvbmFsIHdpdGggYSBub24tb2JqZWN0IHR5cGUgaXMgdW5kZWZpbmVkIGJlaGF2aW9yIik7CisgICAgdW5pb24KKyAgICB7CisgICAgICAgIGNoYXIgX19udWxsX3N0YXRlXzsKKyAgICAgICAgdmFsdWVfdHlwZSBfX3ZhbF87CisgICAgfTsKKyAgICBib29sIF9fZW5nYWdlZF87CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RleHByIF9fb3B0aW9uYWxfZGVzdHJ1Y3RfYmFzZSgpIG5vZXhjZXB0CisgICAgICAgIDogIF9fbnVsbF9zdGF0ZV8oKSwKKyAgICAgICAgICAgX19lbmdhZ2VkXyhmYWxzZSkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RleHByIGV4cGxpY2l0IF9fb3B0aW9uYWxfZGVzdHJ1Y3RfYmFzZShpbl9wbGFjZV90LCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgICAgOiAgX192YWxfKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSwKKyAgICAgICAgICAgX19lbmdhZ2VkXyh0cnVlKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcmVzZXQoKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgaWYgKF9fZW5nYWdlZF8pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fZW5nYWdlZF8gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGJvb2wgPSBpc19yZWZlcmVuY2U8X1RwPjo6dmFsdWU+CitzdHJ1Y3QgX19vcHRpb25hbF9zdG9yYWdlX2Jhc2UgOiBfX29wdGlvbmFsX2Rlc3RydWN0X2Jhc2U8X1RwPgoreworICAgIHVzaW5nIF9fYmFzZSA9IF9fb3B0aW9uYWxfZGVzdHJ1Y3RfYmFzZTxfVHA+OworICAgIHVzaW5nIHZhbHVlX3R5cGUgPSBfVHA7CisgICAgdXNpbmcgX19iYXNlOjpfX2Jhc2U7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RleHByIGJvb2wgaGFzX3ZhbHVlKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLT5fX2VuZ2FnZWRfOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdGV4cHIgdmFsdWVfdHlwZSYgX19nZXQoKSAmIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gdGhpcy0+X192YWxfOworICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RleHByIGNvbnN0IHZhbHVlX3R5cGUmIF9fZ2V0KCkgY29uc3QmIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gdGhpcy0+X192YWxfOworICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RleHByIHZhbHVlX3R5cGUmJiBfX2dldCgpICYmIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gX1ZTVEQ6Om1vdmUodGhpcy0+X192YWxfKTsKKyAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0ZXhwciBjb25zdCB2YWx1ZV90eXBlJiYgX19nZXQoKSBjb25zdCYmIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gX1ZTVEQ6Om1vdmUodGhpcy0+X192YWxfKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19jb25zdHJ1Y3QoX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgICBfTElCQ1BQX0FTU0VSVCghaGFzX3ZhbHVlKCksICJfX2NvbnN0cnVjdCBjYWxsZWQgZm9yIGVuZ2FnZWQgX19vcHRpb25hbF9zdG9yYWdlIik7CisgICAgICAgIDo6bmV3KCh2b2lkKilfVlNURDo6YWRkcmVzc29mKHRoaXMtPl9fdmFsXykpIHZhbHVlX3R5cGUoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICAgICB0aGlzLT5fX2VuZ2FnZWRfID0gdHJ1ZTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RoYXQ+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19jb25zdHJ1Y3RfZnJvbShfVGhhdCYmIF9fb3B0KQorICAgIHsKKyAgICAgICAgaWYgKF9fb3B0Lmhhc192YWx1ZSgpKQorICAgICAgICAgICAgX19jb25zdHJ1Y3QoX1ZTVEQ6OmZvcndhcmQ8X1RoYXQ+KF9fb3B0KS5fX2dldCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RoYXQ+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19hc3NpZ25fZnJvbShfVGhhdCYmIF9fb3B0KQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPl9fZW5nYWdlZF8gPT0gX19vcHQuaGFzX3ZhbHVlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGlzLT5fX2VuZ2FnZWRfKQorICAgICAgICAgICAgICAgIHRoaXMtPl9fdmFsXyA9IF9WU1REOjpmb3J3YXJkPF9UaGF0PihfX29wdCkuX19nZXQoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGlzLT5fX2VuZ2FnZWRfKQorICAgICAgICAgICAgICAgIHRoaXMtPnJlc2V0KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX19jb25zdHJ1Y3QoX1ZTVEQ6OmZvcndhcmQ8X1RoYXQ+KF9fb3B0KS5fX2dldCgpKTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8vIG9wdGlvbmFsPFQmPiBpcyBjdXJyZW50bHkgcmVxdWlyZWQgaWxsLWZvcm1lZCwgaG93ZXZlciBpdCBtYXkgdG8gYmUgaW4gdGhlCisvLyBmdXR1cmUuIEZvciB0aGlzIHJlYXNvbiBpdCBoYXMgYWxyZWFkeSBiZWVuIGltcGxlbWVudGVkIHRvIGVuc3VyZSB3ZSBjYW4KKy8vIG1ha2UgdGhlIGNoYW5nZSBpbiBhbiBBQkkgY29tcGF0aWJsZSBtYW5uZXIuCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fb3B0aW9uYWxfc3RvcmFnZV9iYXNlPF9UcCwgdHJ1ZT4KK3sKKyAgICB1c2luZyB2YWx1ZV90eXBlID0gX1RwOworICAgIHVzaW5nIF9fcmF3X3R5cGUgPSByZW1vdmVfcmVmZXJlbmNlX3Q8X1RwPjsKKyAgICBfX3Jhd190eXBlKiBfX3ZhbHVlXzsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVXA+CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9fY2FuX2JpbmRfcmVmZXJlbmNlKCkgeworICAgICAgICB1c2luZyBfUmF3VXAgPSB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9VcD46OnR5cGU7CisgICAgICAgIHVzaW5nIF9VcFB0ciA9IF9SYXdVcCo7CisgICAgICAgIHVzaW5nIF9SYXdUcCA9IHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZTsKKyAgICAgICAgdXNpbmcgX1RwUHRyID0gX1Jhd1RwKjsKKyAgICAgICAgdXNpbmcgX0NoZWNrTFZhbHVlQXJnID0gaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgIChpc19sdmFsdWVfcmVmZXJlbmNlPF9VcD46OnZhbHVlICYmIGlzX2NvbnZlcnRpYmxlPF9VcFB0ciwgX1RwUHRyPjo6dmFsdWUpCisgICAgICAgIHx8ICBpc19zYW1lPF9SYXdVcCwgcmVmZXJlbmNlX3dyYXBwZXI8X1Jhd1RwPj46OnZhbHVlCisgICAgICAgIHx8ICBpc19zYW1lPF9SYXdVcCwgcmVmZXJlbmNlX3dyYXBwZXI8dHlwZW5hbWUgcmVtb3ZlX2NvbnN0PF9SYXdUcD46OnR5cGU+Pjo6dmFsdWUKKyAgICAgICAgPjsKKyAgICAgICAgcmV0dXJuIChpc19sdmFsdWVfcmVmZXJlbmNlPF9UcD46OnZhbHVlICYmIF9DaGVja0xWYWx1ZUFyZzo6dmFsdWUpCisgICAgICAgICAgICB8fCAoaXNfcnZhbHVlX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZSAmJiAhaXNfbHZhbHVlX3JlZmVyZW5jZTxfVXA+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgIGlzX2NvbnZlcnRpYmxlPF9VcFB0ciwgX1RwUHRyPjo6dmFsdWUpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdGV4cHIgX19vcHRpb25hbF9zdG9yYWdlX2Jhc2UoKSBub2V4Y2VwdAorICAgICAgICA6ICBfX3ZhbHVlXyhudWxscHRyKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9VQXJnPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdGV4cHIgZXhwbGljaXQgX19vcHRpb25hbF9zdG9yYWdlX2Jhc2UoaW5fcGxhY2VfdCwgX1VBcmcmJiBfX3VhcmcpCisgICAgICAgIDogIF9fdmFsdWVfKF9WU1REOjphZGRyZXNzb2YoX191YXJnKSkKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fY2FuX2JpbmRfcmVmZXJlbmNlPF9VQXJnPigpLAorICAgICAgICAiQXR0ZW1wdGVkIHRvIGNvbnN0cnVjdCBhIHJlZmVyZW5jZSBlbGVtZW50IGluIHR1cGxlIGZyb20gYSAiCisgICAgICAgICJwb3NzaWJsZSB0ZW1wb3JhcnkiKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCByZXNldCgpIG5vZXhjZXB0IHsgX192YWx1ZV8gPSBudWxscHRyOyB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RleHByIGJvb2wgaGFzX3ZhbHVlKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fdmFsdWVfICE9IG51bGxwdHI7IH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdGV4cHIgdmFsdWVfdHlwZSYgX19nZXQoKSBjb25zdCYgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuICpfX3ZhbHVlXzsgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0ZXhwciB2YWx1ZV90eXBlJiYgX19nZXQoKSBjb25zdCYmIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfVlNURDo6Zm9yd2FyZDx2YWx1ZV90eXBlPigqX192YWx1ZV8pOyB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VBcmc+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19jb25zdHJ1Y3QoX1VBcmcmJiBfX3ZhbCkKKyAgICB7CisgICAgICAgIF9MSUJDUFBfQVNTRVJUKCFoYXNfdmFsdWUoKSwgIl9fY29uc3RydWN0IGNhbGxlZCBmb3IgZW5nYWdlZCBfX29wdGlvbmFsX3N0b3JhZ2UiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChfX2Nhbl9iaW5kX3JlZmVyZW5jZTxfVUFyZz4oKSwKKyAgICAgICAgICAgICJBdHRlbXB0ZWQgdG8gY29uc3RydWN0IGEgcmVmZXJlbmNlIGVsZW1lbnQgaW4gdHVwbGUgZnJvbSBhICIKKyAgICAgICAgICAgICJwb3NzaWJsZSB0ZW1wb3JhcnkiKTsKKyAgICAgICAgX192YWx1ZV8gPSBfVlNURDo6YWRkcmVzc29mKF9fdmFsKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RoYXQ+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19jb25zdHJ1Y3RfZnJvbShfVGhhdCYmIF9fb3B0KQorICAgIHsKKyAgICAgICAgaWYgKF9fb3B0Lmhhc192YWx1ZSgpKQorICAgICAgICAgICAgX19jb25zdHJ1Y3QoX1ZTVEQ6OmZvcndhcmQ8X1RoYXQ+KF9fb3B0KS5fX2dldCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RoYXQ+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19hc3NpZ25fZnJvbShfVGhhdCYmIF9fb3B0KQorICAgIHsKKyAgICAgICAgaWYgKGhhc192YWx1ZSgpID09IF9fb3B0Lmhhc192YWx1ZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaGFzX3ZhbHVlKCkpCisgICAgICAgICAgICAgICAgKl9fdmFsdWVfID0gX1ZTVEQ6OmZvcndhcmQ8X1RoYXQ+KF9fb3B0KS5fX2dldCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhhc192YWx1ZSgpKQorICAgICAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX19jb25zdHJ1Y3QoX1ZTVEQ6OmZvcndhcmQ8X1RoYXQ+KF9fb3B0KS5fX2dldCgpKTsKKyAgICAgICAgfQorICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGJvb2wgPSBpc190cml2aWFsbHlfY29weV9jb25zdHJ1Y3RpYmxlPF9UcD46OnZhbHVlPgorc3RydWN0IF9fb3B0aW9uYWxfY29weV9iYXNlIDogX19vcHRpb25hbF9zdG9yYWdlX2Jhc2U8X1RwPgoreworICAgIHVzaW5nIF9fb3B0aW9uYWxfc3RvcmFnZV9iYXNlPF9UcD46Ol9fb3B0aW9uYWxfc3RvcmFnZV9iYXNlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX29wdGlvbmFsX2NvcHlfYmFzZTxfVHAsIGZhbHNlPiA6IF9fb3B0aW9uYWxfc3RvcmFnZV9iYXNlPF9UcD4KK3sKKyAgICB1c2luZyBfX29wdGlvbmFsX3N0b3JhZ2VfYmFzZTxfVHA+OjpfX29wdGlvbmFsX3N0b3JhZ2VfYmFzZTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX29wdGlvbmFsX2NvcHlfYmFzZSgpID0gZGVmYXVsdDsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX29wdGlvbmFsX2NvcHlfYmFzZShjb25zdCBfX29wdGlvbmFsX2NvcHlfYmFzZSYgX19vcHQpCisgICAgeworICAgICAgICB0aGlzLT5fX2NvbnN0cnVjdF9mcm9tKF9fb3B0KTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19vcHRpb25hbF9jb3B5X2Jhc2UoX19vcHRpb25hbF9jb3B5X2Jhc2UmJikgPSBkZWZhdWx0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX29wdGlvbmFsX2NvcHlfYmFzZSYgb3BlcmF0b3I9KGNvbnN0IF9fb3B0aW9uYWxfY29weV9iYXNlJikgPSBkZWZhdWx0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX29wdGlvbmFsX2NvcHlfYmFzZSYgb3BlcmF0b3I9KF9fb3B0aW9uYWxfY29weV9iYXNlJiYpID0gZGVmYXVsdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGJvb2wgPSBpc190cml2aWFsbHlfbW92ZV9jb25zdHJ1Y3RpYmxlPF9UcD46OnZhbHVlPgorc3RydWN0IF9fb3B0aW9uYWxfbW92ZV9iYXNlIDogX19vcHRpb25hbF9jb3B5X2Jhc2U8X1RwPgoreworICAgIHVzaW5nIF9fb3B0aW9uYWxfY29weV9iYXNlPF9UcD46Ol9fb3B0aW9uYWxfY29weV9iYXNlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX29wdGlvbmFsX21vdmVfYmFzZTxfVHAsIGZhbHNlPiA6IF9fb3B0aW9uYWxfY29weV9iYXNlPF9UcD4KK3sKKyAgICB1c2luZyB2YWx1ZV90eXBlID0gX1RwOworICAgIHVzaW5nIF9fb3B0aW9uYWxfY29weV9iYXNlPF9UcD46Ol9fb3B0aW9uYWxfY29weV9iYXNlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fb3B0aW9uYWxfbW92ZV9iYXNlKCkgPSBkZWZhdWx0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX29wdGlvbmFsX21vdmVfYmFzZShjb25zdCBfX29wdGlvbmFsX21vdmVfYmFzZSYpID0gZGVmYXVsdDsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX29wdGlvbmFsX21vdmVfYmFzZShfX29wdGlvbmFsX21vdmVfYmFzZSYmIF9fb3B0KQorICAgICAgICBub2V4Y2VwdChpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZV92PHZhbHVlX3R5cGU+KQorICAgIHsKKyAgICAgICAgdGhpcy0+X19jb25zdHJ1Y3RfZnJvbShfVlNURDo6bW92ZShfX29wdCkpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX29wdGlvbmFsX21vdmVfYmFzZSYgb3BlcmF0b3I9KGNvbnN0IF9fb3B0aW9uYWxfbW92ZV9iYXNlJikgPSBkZWZhdWx0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX29wdGlvbmFsX21vdmVfYmFzZSYgb3BlcmF0b3I9KF9fb3B0aW9uYWxfbW92ZV9iYXNlJiYpID0gZGVmYXVsdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGJvb2wgPQorICAgIGlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGU8X1RwPjo6dmFsdWUgJiYKKyAgICBpc190cml2aWFsbHlfY29weV9jb25zdHJ1Y3RpYmxlPF9UcD46OnZhbHVlICYmCisgICAgaXNfdHJpdmlhbGx5X2NvcHlfYXNzaWduYWJsZTxfVHA+Ojp2YWx1ZT4KK3N0cnVjdCBfX29wdGlvbmFsX2NvcHlfYXNzaWduX2Jhc2UgOiBfX29wdGlvbmFsX21vdmVfYmFzZTxfVHA+Cit7CisgICAgdXNpbmcgX19vcHRpb25hbF9tb3ZlX2Jhc2U8X1RwPjo6X19vcHRpb25hbF9tb3ZlX2Jhc2U7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fb3B0aW9uYWxfY29weV9hc3NpZ25fYmFzZTxfVHAsIGZhbHNlPiA6IF9fb3B0aW9uYWxfbW92ZV9iYXNlPF9UcD4KK3sKKyAgICB1c2luZyBfX29wdGlvbmFsX21vdmVfYmFzZTxfVHA+OjpfX29wdGlvbmFsX21vdmVfYmFzZTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX29wdGlvbmFsX2NvcHlfYXNzaWduX2Jhc2UoKSA9IGRlZmF1bHQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fb3B0aW9uYWxfY29weV9hc3NpZ25fYmFzZShjb25zdCBfX29wdGlvbmFsX2NvcHlfYXNzaWduX2Jhc2UmKSA9IGRlZmF1bHQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fb3B0aW9uYWxfY29weV9hc3NpZ25fYmFzZShfX29wdGlvbmFsX2NvcHlfYXNzaWduX2Jhc2UmJikgPSBkZWZhdWx0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fb3B0aW9uYWxfY29weV9hc3NpZ25fYmFzZSYgb3BlcmF0b3I9KGNvbnN0IF9fb3B0aW9uYWxfY29weV9hc3NpZ25fYmFzZSYgX19vcHQpCisgICAgeworICAgICAgICB0aGlzLT5fX2Fzc2lnbl9mcm9tKF9fb3B0KTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX29wdGlvbmFsX2NvcHlfYXNzaWduX2Jhc2UmIG9wZXJhdG9yPShfX29wdGlvbmFsX2NvcHlfYXNzaWduX2Jhc2UmJikgPSBkZWZhdWx0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgYm9vbCA9CisgICAgaXNfdHJpdmlhbGx5X2Rlc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZSAmJgorICAgIGlzX3RyaXZpYWxseV9tb3ZlX2NvbnN0cnVjdGlibGU8X1RwPjo6dmFsdWUgJiYKKyAgICBpc190cml2aWFsbHlfbW92ZV9hc3NpZ25hYmxlPF9UcD46OnZhbHVlPgorc3RydWN0IF9fb3B0aW9uYWxfbW92ZV9hc3NpZ25fYmFzZSA6IF9fb3B0aW9uYWxfY29weV9hc3NpZ25fYmFzZTxfVHA+Cit7CisgICAgdXNpbmcgX19vcHRpb25hbF9jb3B5X2Fzc2lnbl9iYXNlPF9UcD46Ol9fb3B0aW9uYWxfY29weV9hc3NpZ25fYmFzZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19vcHRpb25hbF9tb3ZlX2Fzc2lnbl9iYXNlPF9UcCwgZmFsc2U+IDogX19vcHRpb25hbF9jb3B5X2Fzc2lnbl9iYXNlPF9UcD4KK3sKKyAgICB1c2luZyB2YWx1ZV90eXBlID0gX1RwOworICAgIHVzaW5nIF9fb3B0aW9uYWxfY29weV9hc3NpZ25fYmFzZTxfVHA+OjpfX29wdGlvbmFsX2NvcHlfYXNzaWduX2Jhc2U7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19vcHRpb25hbF9tb3ZlX2Fzc2lnbl9iYXNlKCkgPSBkZWZhdWx0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX29wdGlvbmFsX21vdmVfYXNzaWduX2Jhc2UoY29uc3QgX19vcHRpb25hbF9tb3ZlX2Fzc2lnbl9iYXNlJiBfX29wdCkgPSBkZWZhdWx0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX29wdGlvbmFsX21vdmVfYXNzaWduX2Jhc2UoX19vcHRpb25hbF9tb3ZlX2Fzc2lnbl9iYXNlJiYpID0gZGVmYXVsdDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19vcHRpb25hbF9tb3ZlX2Fzc2lnbl9iYXNlJiBvcGVyYXRvcj0oY29uc3QgX19vcHRpb25hbF9tb3ZlX2Fzc2lnbl9iYXNlJikgPSBkZWZhdWx0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fb3B0aW9uYWxfbW92ZV9hc3NpZ25fYmFzZSYgb3BlcmF0b3I9KF9fb3B0aW9uYWxfbW92ZV9hc3NpZ25fYmFzZSYmIF9fb3B0KQorICAgICAgICBub2V4Y2VwdChpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZV92PHZhbHVlX3R5cGU+ICYmCisgICAgICAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlX3Y8dmFsdWVfdHlwZT4pCisgICAgeworICAgICAgICB0aGlzLT5fX2Fzc2lnbl9mcm9tKF9WU1REOjptb3ZlKF9fb3B0KSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordXNpbmcgX19vcHRpb25hbF9zZmluYWVfY3Rvcl9iYXNlX3QgPSBfX3NmaW5hZV9jdG9yX2Jhc2U8CisgICAgaXNfY29weV9jb25zdHJ1Y3RpYmxlPF9UcD46OnZhbHVlLAorICAgIGlzX21vdmVfY29uc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZQorPjsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3VzaW5nIF9fb3B0aW9uYWxfc2ZpbmFlX2Fzc2lnbl9iYXNlX3QgPSBfX3NmaW5hZV9hc3NpZ25fYmFzZTwKKyAgICAoaXNfY29weV9jb25zdHJ1Y3RpYmxlPF9UcD46OnZhbHVlICYmIGlzX2NvcHlfYXNzaWduYWJsZTxfVHA+Ojp2YWx1ZSksCisgICAgKGlzX21vdmVfY29uc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZSAmJiBpc19tb3ZlX2Fzc2lnbmFibGU8X1RwPjo6dmFsdWUpCis+OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3Mgb3B0aW9uYWwKKyAgICA6IHByaXZhdGUgX19vcHRpb25hbF9tb3ZlX2Fzc2lnbl9iYXNlPF9UcD4KKyAgICAsIHByaXZhdGUgX19vcHRpb25hbF9zZmluYWVfY3Rvcl9iYXNlX3Q8X1RwPgorICAgICwgcHJpdmF0ZSBfX29wdGlvbmFsX3NmaW5hZV9hc3NpZ25fYmFzZV90PF9UcD4KK3sKKyAgICB1c2luZyBfX2Jhc2UgPSBfX29wdGlvbmFsX21vdmVfYXNzaWduX2Jhc2U8X1RwPjsKK3B1YmxpYzoKKyAgICB1c2luZyB2YWx1ZV90eXBlID0gX1RwOworCitwcml2YXRlOgorICAgICAvLyBEaXNhYmxlIHRoZSByZWZlcmVuY2UgZXh0ZW5zaW9uIHVzaW5nIHRoaXMgc3RhdGljIGFzc2VydC4KKyAgICBzdGF0aWNfYXNzZXJ0KCFpc19zYW1lX3Y8dmFsdWVfdHlwZSwgaW5fcGxhY2VfdD4sCisgICAgICAgICJpbnN0YW50aWF0aW9uIG9mIG9wdGlvbmFsIHdpdGggaW5fcGxhY2VfdCBpcyBpbGwtZm9ybWVkIik7CisgICAgc3RhdGljX2Fzc2VydCghaXNfc2FtZV92PF9fdW5jdnJlZl90PHZhbHVlX3R5cGU+LCBudWxsb3B0X3Q+LAorICAgICAgICAiaW5zdGFudGlhdGlvbiBvZiBvcHRpb25hbCB3aXRoIG51bGxvcHRfdCBpcyBpbGwtZm9ybWVkIik7CisgICAgc3RhdGljX2Fzc2VydCghaXNfcmVmZXJlbmNlX3Y8dmFsdWVfdHlwZT4sCisgICAgICAgICJpbnN0YW50aWF0aW9uIG9mIG9wdGlvbmFsIHdpdGggYSByZWZlcmVuY2UgdHlwZSBpcyBpbGwtZm9ybWVkIik7CisgICAgc3RhdGljX2Fzc2VydChpc19kZXN0cnVjdGlibGVfdjx2YWx1ZV90eXBlPiwKKyAgICAgICAgImluc3RhbnRpYXRpb24gb2Ygb3B0aW9uYWwgd2l0aCBhIG5vbi1kZXN0cnVjdGlibGUgdHlwZSBpcyBpbGwtZm9ybWVkIik7CisKKyAgICAvLyBMV0cyNzU2OiBjb25kaXRpb25hbGx5IGV4cGxpY2l0IGNvbnZlcnNpb24gZnJvbSBfVXAKKyAgICBzdHJ1Y3QgX0NoZWNrT3B0aW9uYWxBcmdzQ29uc3RydWN0b3IgeworICAgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfX2VuYWJsZV9pbXBsaWNpdCgpIHsKKyAgICAgICAgICByZXR1cm4gaXNfY29uc3RydWN0aWJsZV92PF9UcCwgX1VwJiY+ICYmCisgICAgICAgICAgICAgICAgIGlzX2NvbnZlcnRpYmxlX3Y8X1VwJiYsIF9UcD47CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfVXA+CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgX19lbmFibGVfZXhwbGljaXQoKSB7CisgICAgICAgICAgcmV0dXJuIGlzX2NvbnN0cnVjdGlibGVfdjxfVHAsIF9VcCYmPiAmJgorICAgICAgICAgICAgICAgICAhaXNfY29udmVydGlibGVfdjxfVXAmJiwgX1RwPjsKKyAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlIDxjbGFzcyBfVXA+CisgICAgdXNpbmcgX0NoZWNrT3B0aW9uYWxBcmdzQ3RvciA9IGNvbmRpdGlvbmFsX3Q8CisgICAgICAgICFpc19zYW1lX3Y8X191bmN2cmVmX3Q8X1VwPiwgaW5fcGxhY2VfdD4gJiYKKyAgICAgICAgIWlzX3NhbWVfdjxfX3VuY3ZyZWZfdDxfVXA+LCBvcHRpb25hbD4sCisgICAgICAgIF9DaGVja09wdGlvbmFsQXJnc0NvbnN0cnVjdG9yLAorICAgICAgICBfX2NoZWNrX3R1cGxlX2NvbnN0cnVjdG9yX2ZhaWwKKyAgICA+OworICAgIHRlbXBsYXRlIDxjbGFzcyBfUXVhbFVwPgorICAgIHN0cnVjdCBfQ2hlY2tPcHRpb25hbExpa2VDb25zdHJ1Y3RvciB7CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwLCBjbGFzcyBfT3B0ID0gb3B0aW9uYWw8X1VwPj4KKyAgICAgIHVzaW5nIF9fY2hlY2tfY29uc3RydWN0aWJsZV9mcm9tX29wdCA9IF9fbGF6eV9vcjwKKyAgICAgICAgICBpc19jb25zdHJ1Y3RpYmxlPF9UcCwgX09wdCY+LAorICAgICAgICAgIGlzX2NvbnN0cnVjdGlibGU8X1RwLCBfT3B0IGNvbnN0Jj4sCisgICAgICAgICAgaXNfY29uc3RydWN0aWJsZTxfVHAsIF9PcHQmJj4sCisgICAgICAgICAgaXNfY29uc3RydWN0aWJsZTxfVHAsIF9PcHQgY29uc3QmJj4sCisgICAgICAgICAgaXNfY29udmVydGlibGU8X09wdCYsIF9UcD4sCisgICAgICAgICAgaXNfY29udmVydGlibGU8X09wdCBjb25zdCYsIF9UcD4sCisgICAgICAgICAgaXNfY29udmVydGlibGU8X09wdCYmLCBfVHA+LAorICAgICAgICAgIGlzX2NvbnZlcnRpYmxlPF9PcHQgY29uc3QmJiwgX1RwPgorICAgICAgPjsKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfVXAsIGNsYXNzIF9PcHQgPSBvcHRpb25hbDxfVXA+PgorICAgICAgdXNpbmcgX19jaGVja19hc3NpZ25hYmxlX2Zyb21fb3B0ID0gX19sYXp5X29yPAorICAgICAgICAgIGlzX2Fzc2lnbmFibGU8X1RwJiwgX09wdCY+LAorICAgICAgICAgIGlzX2Fzc2lnbmFibGU8X1RwJiwgX09wdCBjb25zdCY+LAorICAgICAgICAgIGlzX2Fzc2lnbmFibGU8X1RwJiwgX09wdCYmPiwKKyAgICAgICAgICBpc19hc3NpZ25hYmxlPF9UcCYsIF9PcHQgY29uc3QmJj4KKyAgICAgID47CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwLCBjbGFzcyBfUVVwID0gX1F1YWxVcD4KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfX2VuYWJsZV9pbXBsaWNpdCgpIHsKKyAgICAgICAgICByZXR1cm4gaXNfY29udmVydGlibGU8X1FVcCwgX1RwPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgIV9fY2hlY2tfY29uc3RydWN0aWJsZV9mcm9tX29wdDxfVXA+Ojp2YWx1ZTsKKyAgICAgIH0KKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfVXAsIGNsYXNzIF9RVXAgPSBfUXVhbFVwPgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9fZW5hYmxlX2V4cGxpY2l0KCkgeworICAgICAgICAgIHJldHVybiAhaXNfY29udmVydGlibGU8X1FVcCwgX1RwPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgIV9fY2hlY2tfY29uc3RydWN0aWJsZV9mcm9tX29wdDxfVXA+Ojp2YWx1ZTsKKyAgICAgIH0KKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfVXAsIGNsYXNzIF9RVXAgPSBfUXVhbFVwPgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9fZW5hYmxlX2Fzc2lnbigpIHsKKyAgICAgICAgICAvLyBDb25zdHJ1Y3Rpb24gYW5kIGFzc2lnbmFiaWxpdHkgb2YgX1F1cCB0byBfVHAgaGFzIGFscmVhZHkgYmVlbgorICAgICAgICAgIC8vIGNoZWNrZWQuCisgICAgICAgICAgcmV0dXJuICFfX2NoZWNrX2NvbnN0cnVjdGlibGVfZnJvbV9vcHQ8X1VwPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgIV9fY2hlY2tfYXNzaWduYWJsZV9mcm9tX29wdDxfVXA+Ojp2YWx1ZTsKKyAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcCwgY2xhc3MgX1F1YWxVcD4KKyAgICB1c2luZyBfQ2hlY2tPcHRpb25hbExpa2VDdG9yID0gY29uZGl0aW9uYWxfdDwKKyAgICAgIF9fbGF6eV9hbmQ8CisgICAgICAgICAgX19sYXp5X25vdDxpc19zYW1lPF9VcCwgX1RwPj4sCisgICAgICAgICAgaXNfY29uc3RydWN0aWJsZTxfVHAsIF9RdWFsVXA+CisgICAgICA+Ojp2YWx1ZSwKKyAgICAgIF9DaGVja09wdGlvbmFsTGlrZUNvbnN0cnVjdG9yPF9RdWFsVXA+LAorICAgICAgX19jaGVja190dXBsZV9jb25zdHJ1Y3Rvcl9mYWlsCisgICAgPjsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwLCBjbGFzcyBfUXVhbFVwPgorICAgIHVzaW5nIF9DaGVja09wdGlvbmFsTGlrZUFzc2lnbiA9IGNvbmRpdGlvbmFsX3Q8CisgICAgICBfX2xhenlfYW5kPAorICAgICAgICAgIF9fbGF6eV9ub3Q8aXNfc2FtZTxfVXAsIF9UcD4+LAorICAgICAgICAgIGlzX2NvbnN0cnVjdGlibGU8X1RwLCBfUXVhbFVwPiwKKyAgICAgICAgICBpc19hc3NpZ25hYmxlPF9UcCYsIF9RdWFsVXA+CisgICAgICA+Ojp2YWx1ZSwKKyAgICAgIF9DaGVja09wdGlvbmFsTGlrZUNvbnN0cnVjdG9yPF9RdWFsVXA+LAorICAgICAgX19jaGVja190dXBsZV9jb25zdHJ1Y3Rvcl9mYWlsCisgICAgPjsKK3B1YmxpYzoKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RleHByIG9wdGlvbmFsKCkgbm9leGNlcHQge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0ZXhwciBvcHRpb25hbChjb25zdCBvcHRpb25hbCYpID0gZGVmYXVsdDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0ZXhwciBvcHRpb25hbChvcHRpb25hbCYmKSA9IGRlZmF1bHQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdGV4cHIgb3B0aW9uYWwobnVsbG9wdF90KSBub2V4Y2VwdCB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzLCBjbGFzcyA9IGVuYWJsZV9pZl90PAorICAgICAgICBpc19jb25zdHJ1Y3RpYmxlX3Y8dmFsdWVfdHlwZSwgX0FyZ3MuLi4+PgorICAgID4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RleHByIGV4cGxpY2l0IG9wdGlvbmFsKGluX3BsYWNlX3QsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICA6IF9fYmFzZShpbl9wbGFjZSwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwLCBjbGFzcy4uLiBfQXJncywgY2xhc3MgPSBlbmFibGVfaWZfdDwKKyAgICAgICAgaXNfY29uc3RydWN0aWJsZV92PHZhbHVlX3R5cGUsIGluaXRpYWxpemVyX2xpc3Q8X1VwPiYsIF9BcmdzLi4uPj4KKyAgICA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0ZXhwciBleHBsaWNpdCBvcHRpb25hbChpbl9wbGFjZV90LCBpbml0aWFsaXplcl9saXN0PF9VcD4gX19pbCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgIDogX19iYXNlKGluX3BsYWNlLCBfX2lsLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVXAgPSB2YWx1ZV90eXBlLCBlbmFibGVfaWZfdDwKKyAgICAgICAgX0NoZWNrT3B0aW9uYWxBcmdzQ3RvcjxfVXA+Ojp0ZW1wbGF0ZSBfX2VuYWJsZV9pbXBsaWNpdDxfVXA+KCkKKyAgICAsIGludD4gPSAwPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdGV4cHIgb3B0aW9uYWwoX1VwJiYgX192KQorICAgICAgICA6IF9fYmFzZShpbl9wbGFjZSwgX1ZTVEQ6OmZvcndhcmQ8X1VwPihfX3YpKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcCwgZW5hYmxlX2lmX3Q8CisgICAgICAgIF9DaGVja09wdGlvbmFsQXJnc0N0b3I8X1VwPjo6dGVtcGxhdGUgX19lbmFibGVfZXhwbGljaXQ8X1VwPigpCisgICAgLCBpbnQ+ID0gMD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RleHByIGV4cGxpY2l0IG9wdGlvbmFsKF9VcCYmIF9fdikKKyAgICAgICAgOiBfX2Jhc2UoaW5fcGxhY2UsIF9WU1REOjpmb3J3YXJkPF9VcD4oX192KSkge30KKworICAgIC8vIExXRzI3NTY6IGNvbmRpdGlvbmFsbHkgZXhwbGljaXQgY29udmVyc2lvbiBmcm9tIGNvbnN0IG9wdGlvbmFsPF9VcD4mCisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcCwgZW5hYmxlX2lmX3Q8CisgICAgICAgIF9DaGVja09wdGlvbmFsTGlrZUN0b3I8X1VwLCBfVXAgY29uc3QmPjo6dGVtcGxhdGUgX19lbmFibGVfaW1wbGljaXQ8X1VwPigpCisgICAgLCBpbnQ+ID0gMD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3B0aW9uYWwoY29uc3Qgb3B0aW9uYWw8X1VwPiYgX192KQorICAgIHsKKyAgICAgICAgdGhpcy0+X19jb25zdHJ1Y3RfZnJvbShfX3YpOworICAgIH0KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwLCBlbmFibGVfaWZfdDwKKyAgICAgICAgX0NoZWNrT3B0aW9uYWxMaWtlQ3RvcjxfVXAsIF9VcCBjb25zdCY+Ojp0ZW1wbGF0ZSBfX2VuYWJsZV9leHBsaWNpdDxfVXA+KCkKKyAgICAsIGludD4gPSAwPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBvcHRpb25hbChjb25zdCBvcHRpb25hbDxfVXA+JiBfX3YpCisgICAgeworICAgICAgICB0aGlzLT5fX2NvbnN0cnVjdF9mcm9tKF9fdik7CisgICAgfQorCisgICAgLy8gTFdHMjc1NjogY29uZGl0aW9uYWxseSBleHBsaWNpdCBjb252ZXJzaW9uIGZyb20gb3B0aW9uYWw8X1VwPiYmCisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcCwgZW5hYmxlX2lmX3Q8CisgICAgICAgIF9DaGVja09wdGlvbmFsTGlrZUN0b3I8X1VwLCBfVXAgJiY+Ojp0ZW1wbGF0ZSBfX2VuYWJsZV9pbXBsaWNpdDxfVXA+KCkKKyAgICAsIGludD4gPSAwPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcHRpb25hbChvcHRpb25hbDxfVXA+JiYgX192KQorICAgIHsKKyAgICAgICAgdGhpcy0+X19jb25zdHJ1Y3RfZnJvbShfVlNURDo6bW92ZShfX3YpKTsKKyAgICB9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcCwgZW5hYmxlX2lmX3Q8CisgICAgICAgIF9DaGVja09wdGlvbmFsTGlrZUN0b3I8X1VwLCBfVXAgJiY+Ojp0ZW1wbGF0ZSBfX2VuYWJsZV9leHBsaWNpdDxfVXA+KCkKKyAgICAsIGludD4gPSAwPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBvcHRpb25hbChvcHRpb25hbDxfVXA+JiYgX192KQorICAgIHsKKyAgICAgICAgdGhpcy0+X19jb25zdHJ1Y3RfZnJvbShfVlNURDo6bW92ZShfX3YpKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3B0aW9uYWwmIG9wZXJhdG9yPShudWxsb3B0X3QpIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXNldCgpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBvcHRpb25hbCYgb3BlcmF0b3I9KGNvbnN0IG9wdGlvbmFsJikgPSBkZWZhdWx0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgb3B0aW9uYWwmIG9wZXJhdG9yPShvcHRpb25hbCYmKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBMV0cyNzU2CisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcCA9IHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgIGNsYXNzID0gZW5hYmxlX2lmX3QKKyAgICAgICAgICAgICAgICAgICAgICA8X19sYXp5X2FuZDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc19zYW1lX3Y8X191bmN2cmVmX3Q8X1VwPiwgb3B0aW9uYWw+ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGlzX3NhbWVfdjxfVXAsIHZhbHVlX3R5cGU+ICYmIGlzX3NjYWxhcl92PHZhbHVlX3R5cGU+KQorICAgICAgICAgICAgICAgICAgICAgICAgICA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpc19jb25zdHJ1Y3RpYmxlPHZhbHVlX3R5cGUsIF9VcD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Fzc2lnbmFibGU8dmFsdWVfdHlwZSYsIF9VcD4KKyAgICAgICAgICAgICAgICAgICAgICA+Ojp2YWx1ZT4KKyAgICAgICAgICAgICA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG9wdGlvbmFsJgorICAgIG9wZXJhdG9yPShfVXAmJiBfX3YpCisgICAgeworICAgICAgICBpZiAodGhpcy0+aGFzX3ZhbHVlKCkpCisgICAgICAgICAgICB0aGlzLT5fX2dldCgpID0gX1ZTVEQ6OmZvcndhcmQ8X1VwPihfX3YpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aGlzLT5fX2NvbnN0cnVjdChfVlNURDo6Zm9yd2FyZDxfVXA+KF9fdikpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8gTFdHMjc1NgorICAgIHRlbXBsYXRlIDxjbGFzcyBfVXAsIGVuYWJsZV9pZl90PAorICAgICAgICBfQ2hlY2tPcHRpb25hbExpa2VBc3NpZ248X1VwLCBfVXAgY29uc3QmPjo6dGVtcGxhdGUgX19lbmFibGVfYXNzaWduPF9VcD4oKQorICAgICwgaW50PiA9IDA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG9wdGlvbmFsJgorICAgIG9wZXJhdG9yPShjb25zdCBvcHRpb25hbDxfVXA+JiBfX3YpCisgICAgeworICAgICAgICB0aGlzLT5fX2Fzc2lnbl9mcm9tKF9fdik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLyBMV0cyNzU2CisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcCwgZW5hYmxlX2lmX3Q8CisgICAgICAgIF9DaGVja09wdGlvbmFsTGlrZUN0b3I8X1VwLCBfVXAgJiY+Ojp0ZW1wbGF0ZSBfX2VuYWJsZV9hc3NpZ248X1VwPigpCisgICAgLCBpbnQ+ID0gMD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3B0aW9uYWwmCisgICAgb3BlcmF0b3I9KG9wdGlvbmFsPF9VcD4mJiBfX3YpCisgICAgeworICAgICAgICB0aGlzLT5fX2Fzc2lnbl9mcm9tKF9WU1REOjptb3ZlKF9fdikpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzLAorICAgICAgICAgICAgICBjbGFzcyA9IGVuYWJsZV9pZl90CisgICAgICAgICAgICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgICAgICAgICAgICBpc19jb25zdHJ1Y3RpYmxlX3Y8dmFsdWVfdHlwZSwgX0FyZ3MuLi4+CisgICAgICAgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgID4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwICYKKyAgICBlbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgdGhpcy0+X19jb25zdHJ1Y3QoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICAgICByZXR1cm4gdGhpcy0+X19nZXQoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwLCBjbGFzcy4uLiBfQXJncywKKyAgICAgICAgICAgICAgY2xhc3MgPSBlbmFibGVfaWZfdAorICAgICAgICAgICAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfY29uc3RydWN0aWJsZV92PHZhbHVlX3R5cGUsIGluaXRpYWxpemVyX2xpc3Q8X1VwPiYsIF9BcmdzLi4uPgorICAgICAgICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCAmCisgICAgZW1wbGFjZShpbml0aWFsaXplcl9saXN0PF9VcD4gX19pbCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgICByZXNldCgpOworICAgICAgICB0aGlzLT5fX2NvbnN0cnVjdChfX2lsLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICAgIHJldHVybiB0aGlzLT5fX2dldCgpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAob3B0aW9uYWwmIF9fb3B0KQorICAgICAgICBub2V4Y2VwdChpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZV92PHZhbHVlX3R5cGU+ICYmCisgICAgICAgICAgICAgICAgIGlzX25vdGhyb3dfc3dhcHBhYmxlX3Y8dmFsdWVfdHlwZT4pCisgICAgeworICAgICAgICBpZiAodGhpcy0+aGFzX3ZhbHVlKCkgPT0gX19vcHQuaGFzX3ZhbHVlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIF9WU1REOjpzd2FwOworICAgICAgICAgICAgaWYgKHRoaXMtPmhhc192YWx1ZSgpKQorICAgICAgICAgICAgICAgIHN3YXAodGhpcy0+X19nZXQoKSwgX19vcHQuX19nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhpcy0+aGFzX3ZhbHVlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19vcHQuX19jb25zdHJ1Y3QoX1ZTVEQ6Om1vdmUodGhpcy0+X19nZXQoKSkpOworICAgICAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+X19jb25zdHJ1Y3QoX1ZTVEQ6Om1vdmUoX19vcHQuX19nZXQoKSkpOworICAgICAgICAgICAgICAgIF9fb3B0LnJlc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RleHByCisgICAgYWRkX3BvaW50ZXJfdDx2YWx1ZV90eXBlIGNvbnN0PgorICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQodGhpcy0+aGFzX3ZhbHVlKCksICJvcHRpb25hbCBvcGVyYXRvci0+IGNhbGxlZCBmb3IgZGlzZW5nYWdlZCB2YWx1ZSIpOworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19CVUlMVElOX0FERFJFU1NPRgorICAgICAgICByZXR1cm4gX1ZTVEQ6OmFkZHJlc3NvZih0aGlzLT5fX2dldCgpKTsKKyNlbHNlCisgICAgICAgIHJldHVybiBfX29wZXJhdG9yX2Fycm93KF9faGFzX29wZXJhdG9yX2FkZHJlc3NvZjx2YWx1ZV90eXBlPnt9LCB0aGlzLT5fX2dldCgpKTsKKyNlbmRpZgorICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdGV4cHIKKyAgICBhZGRfcG9pbnRlcl90PHZhbHVlX3R5cGU+CisgICAgb3BlcmF0b3ItPigpCisgICAgeworICAgICAgICBfTElCQ1BQX0FTU0VSVCh0aGlzLT5oYXNfdmFsdWUoKSwgIm9wdGlvbmFsIG9wZXJhdG9yLT4gY2FsbGVkIGZvciBkaXNlbmdhZ2VkIHZhbHVlIik7CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0JVSUxUSU5fQUREUkVTU09GCisgICAgICAgIHJldHVybiBfVlNURDo6YWRkcmVzc29mKHRoaXMtPl9fZ2V0KCkpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIF9fb3BlcmF0b3JfYXJyb3coX19oYXNfb3BlcmF0b3JfYWRkcmVzc29mPHZhbHVlX3R5cGU+e30sIHRoaXMtPl9fZ2V0KCkpOworI2VuZGlmCisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0ZXhwcgorICAgIGNvbnN0IHZhbHVlX3R5cGUmCisgICAgb3BlcmF0b3IqKCkgY29uc3QmCisgICAgeworICAgICAgICBfTElCQ1BQX0FTU0VSVCh0aGlzLT5oYXNfdmFsdWUoKSwgIm9wdGlvbmFsIG9wZXJhdG9yKiBjYWxsZWQgZm9yIGRpc2VuZ2FnZWQgdmFsdWUiKTsKKyAgICAgICAgcmV0dXJuIHRoaXMtPl9fZ2V0KCk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0ZXhwcgorICAgIHZhbHVlX3R5cGUmCisgICAgb3BlcmF0b3IqKCkgJgorICAgIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQodGhpcy0+aGFzX3ZhbHVlKCksICJvcHRpb25hbCBvcGVyYXRvciogY2FsbGVkIGZvciBkaXNlbmdhZ2VkIHZhbHVlIik7CisgICAgICAgIHJldHVybiB0aGlzLT5fX2dldCgpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdGV4cHIKKyAgICB2YWx1ZV90eXBlJiYKKyAgICBvcGVyYXRvciooKSAmJgorICAgIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQodGhpcy0+aGFzX3ZhbHVlKCksICJvcHRpb25hbCBvcGVyYXRvciogY2FsbGVkIGZvciBkaXNlbmdhZ2VkIHZhbHVlIik7CisgICAgICAgIHJldHVybiBfVlNURDo6bW92ZSh0aGlzLT5fX2dldCgpKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RleHByCisgICAgY29uc3QgdmFsdWVfdHlwZSYmCisgICAgb3BlcmF0b3IqKCkgY29uc3QmJgorICAgIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQodGhpcy0+aGFzX3ZhbHVlKCksICJvcHRpb25hbCBvcGVyYXRvciogY2FsbGVkIGZvciBkaXNlbmdhZ2VkIHZhbHVlIik7CisgICAgICAgIHJldHVybiBfVlNURDo6bW92ZSh0aGlzLT5fX2dldCgpKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RleHByIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBoYXNfdmFsdWUoKTsgfQorCisgICAgdXNpbmcgX19iYXNlOjpoYXNfdmFsdWU7CisgICAgdXNpbmcgX19iYXNlOjpfX2dldDsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdGV4cHIgdmFsdWVfdHlwZSBjb25zdCYgdmFsdWUoKSBjb25zdCYKKyAgICB7CisgICAgICAgIGlmICghdGhpcy0+aGFzX3ZhbHVlKCkpCisgICAgICAgICAgICBfX3Rocm93X2JhZF9vcHRpb25hbF9hY2Nlc3MoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMtPl9fZ2V0KCk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0ZXhwciB2YWx1ZV90eXBlJiB2YWx1ZSgpICYKKyAgICB7CisgICAgICAgIGlmICghdGhpcy0+aGFzX3ZhbHVlKCkpCisgICAgICAgICAgICBfX3Rocm93X2JhZF9vcHRpb25hbF9hY2Nlc3MoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMtPl9fZ2V0KCk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0ZXhwciB2YWx1ZV90eXBlJiYgdmFsdWUoKSAmJgorICAgIHsKKyAgICAgICAgaWYgKCF0aGlzLT5oYXNfdmFsdWUoKSkKKyAgICAgICAgICAgIF9fdGhyb3dfYmFkX29wdGlvbmFsX2FjY2VzcygpOworICAgICAgICByZXR1cm4gX1ZTVEQ6Om1vdmUodGhpcy0+X19nZXQoKSk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0ZXhwciB2YWx1ZV90eXBlIGNvbnN0JiYgdmFsdWUoKSBjb25zdCYmCisgICAgeworICAgICAgICBpZiAoIXRoaXMtPmhhc192YWx1ZSgpKQorICAgICAgICAgICAgX190aHJvd19iYWRfb3B0aW9uYWxfYWNjZXNzKCk7CisgICAgICAgIHJldHVybiBfVlNURDo6bW92ZSh0aGlzLT5fX2dldCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdGV4cHIgdmFsdWVfdHlwZSB2YWx1ZV9vcihfVXAmJiBfX3YpIGNvbnN0JgorICAgIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChpc19jb3B5X2NvbnN0cnVjdGlibGVfdjx2YWx1ZV90eXBlPiwKKyAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWw8VD46OnZhbHVlX29yOiBUIG11c3QgYmUgY29weSBjb25zdHJ1Y3RpYmxlIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoaXNfY29udmVydGlibGVfdjxfVXAsIHZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25hbDxUPjo6dmFsdWVfb3I6IFUgbXVzdCBiZSBjb252ZXJ0aWJsZSB0byBUIik7CisgICAgICAgIHJldHVybiB0aGlzLT5oYXNfdmFsdWUoKSA/IHRoaXMtPl9fZ2V0KCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZhbHVlX3R5cGU+KF9WU1REOjpmb3J3YXJkPF9VcD4oX192KSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RleHByIHZhbHVlX3R5cGUgdmFsdWVfb3IoX1VwJiYgX192KSAmJgorICAgIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChpc19tb3ZlX2NvbnN0cnVjdGlibGVfdjx2YWx1ZV90eXBlPiwKKyAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWw8VD46OnZhbHVlX29yOiBUIG11c3QgYmUgbW92ZSBjb25zdHJ1Y3RpYmxlIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoaXNfY29udmVydGlibGVfdjxfVXAsIHZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25hbDxUPjo6dmFsdWVfb3I6IFUgbXVzdCBiZSBjb252ZXJ0aWJsZSB0byBUIik7CisgICAgICAgIHJldHVybiB0aGlzLT5oYXNfdmFsdWUoKSA/IF9WU1REOjptb3ZlKHRoaXMtPl9fZ2V0KCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2YWx1ZV90eXBlPihfVlNURDo6Zm9yd2FyZDxfVXA+KF9fdikpOworICAgIH0KKworICAgIHVzaW5nIF9fYmFzZTo6cmVzZXQ7CisKK3ByaXZhdGU6CisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGljIF9VcCoKKyAgICBfX29wZXJhdG9yX2Fycm93KHRydWVfdHlwZSwgX1VwJiBfX3gpCisgICAgeworICAgICAgICByZXR1cm4gX1ZTVEQ6OmFkZHJlc3NvZihfX3gpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVXA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBjb25zdGV4cHIgX1VwKgorICAgIF9fb3BlcmF0b3JfYXJyb3coZmFsc2VfdHlwZSwgX1VwJiBfX3gpCisgICAgeworICAgICAgICByZXR1cm4gJl9feDsKKyAgICB9Cit9OworCisvLyBDb21wYXJpc29ucyBiZXR3ZWVuIG9wdGlvbmFscwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdGV4cHIKK2VuYWJsZV9pZl90PAorICAgIGlzX2NvbnZlcnRpYmxlX3Y8ZGVjbHR5cGUoX1ZTVEQ6OmRlY2x2YWw8Y29uc3QgX1RwJj4oKSA9PQorICAgICAgICBfVlNURDo6ZGVjbHZhbDxjb25zdCBfVXAmPigpKSwgYm9vbD4sCisgICAgYm9vbAorPgorb3BlcmF0b3I9PShjb25zdCBvcHRpb25hbDxfVHA+JiBfX3gsIGNvbnN0IG9wdGlvbmFsPF9VcD4mIF9feSkKK3sKKyAgICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oX194KSAhPSBzdGF0aWNfY2FzdDxib29sPihfX3kpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFzdGF0aWNfY2FzdDxib29sPihfX3gpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gKl9feCA9PSAqX195OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0ZXhwcgorZW5hYmxlX2lmX3Q8CisgICAgaXNfY29udmVydGlibGVfdjxkZWNsdHlwZShfVlNURDo6ZGVjbHZhbDxjb25zdCBfVHAmPigpICE9CisgICAgICAgIF9WU1REOjpkZWNsdmFsPGNvbnN0IF9VcCY+KCkpLCBib29sPiwKKyAgICBib29sCis+CitvcGVyYXRvciE9KGNvbnN0IG9wdGlvbmFsPF9UcD4mIF9feCwgY29uc3Qgb3B0aW9uYWw8X1VwPiYgX195KQoreworICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihfX3gpICE9IHN0YXRpY19jYXN0PGJvb2w+KF9feSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4oX194KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAqX194ICE9ICpfX3k7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RleHByCitlbmFibGVfaWZfdDwKKyAgICBpc19jb252ZXJ0aWJsZV92PGRlY2x0eXBlKF9WU1REOjpkZWNsdmFsPGNvbnN0IF9UcCY+KCkgPAorICAgICAgICBfVlNURDo6ZGVjbHZhbDxjb25zdCBfVXAmPigpKSwgYm9vbD4sCisgICAgYm9vbAorPgorb3BlcmF0b3I8KGNvbnN0IG9wdGlvbmFsPF9UcD4mIF9feCwgY29uc3Qgb3B0aW9uYWw8X1VwPiYgX195KQoreworICAgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4oX195KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4oX194KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuICpfX3ggPCAqX195OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0ZXhwcgorZW5hYmxlX2lmX3Q8CisgICAgaXNfY29udmVydGlibGVfdjxkZWNsdHlwZShfVlNURDo6ZGVjbHZhbDxjb25zdCBfVHAmPigpID4KKyAgICAgICAgX1ZTVEQ6OmRlY2x2YWw8Y29uc3QgX1VwJj4oKSksIGJvb2w+LAorICAgIGJvb2wKKz4KK29wZXJhdG9yPihjb25zdCBvcHRpb25hbDxfVHA+JiBfX3gsIGNvbnN0IG9wdGlvbmFsPF9VcD4mIF9feSkKK3sKKyAgICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KF9feCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KF9feSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiAqX194ID4gKl9feTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdGV4cHIKK2VuYWJsZV9pZl90PAorICAgIGlzX2NvbnZlcnRpYmxlX3Y8ZGVjbHR5cGUoX1ZTVEQ6OmRlY2x2YWw8Y29uc3QgX1RwJj4oKSA8PQorICAgICAgICBfVlNURDo6ZGVjbHZhbDxjb25zdCBfVXAmPigpKSwgYm9vbD4sCisgICAgYm9vbAorPgorb3BlcmF0b3I8PShjb25zdCBvcHRpb25hbDxfVHA+JiBfX3gsIGNvbnN0IG9wdGlvbmFsPF9VcD4mIF9feSkKK3sKKyAgICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KF9feCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4oX195KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAqX194IDw9ICpfX3k7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RleHByCitlbmFibGVfaWZfdDwKKyAgICBpc19jb252ZXJ0aWJsZV92PGRlY2x0eXBlKF9WU1REOjpkZWNsdmFsPGNvbnN0IF9UcCY+KCkgPj0KKyAgICAgICAgX1ZTVEQ6OmRlY2x2YWw8Y29uc3QgX1VwJj4oKSksIGJvb2w+LAorICAgIGJvb2wKKz4KK29wZXJhdG9yPj0oY29uc3Qgb3B0aW9uYWw8X1RwPiYgX194LCBjb25zdCBvcHRpb25hbDxfVXA+JiBfX3kpCit7CisgICAgaWYgKCFzdGF0aWNfY2FzdDxib29sPihfX3kpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KF9feCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gKl9feCA+PSAqX195OworfQorCisvLyBDb21wYXJpc29ucyB3aXRoIG51bGxvcHQKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0ZXhwcgorYm9vbAorb3BlcmF0b3I9PShjb25zdCBvcHRpb25hbDxfVHA+JiBfX3gsIG51bGxvcHRfdCkgbm9leGNlcHQKK3sKKyAgICByZXR1cm4gIXN0YXRpY19jYXN0PGJvb2w+KF9feCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0ZXhwcgorYm9vbAorb3BlcmF0b3I9PShudWxsb3B0X3QsIGNvbnN0IG9wdGlvbmFsPF9UcD4mIF9feCkgbm9leGNlcHQKK3sKKyAgICByZXR1cm4gIXN0YXRpY19jYXN0PGJvb2w+KF9feCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0ZXhwcgorYm9vbAorb3BlcmF0b3IhPShjb25zdCBvcHRpb25hbDxfVHA+JiBfX3gsIG51bGxvcHRfdCkgbm9leGNlcHQKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RleHByCitib29sCitvcGVyYXRvciE9KG51bGxvcHRfdCwgY29uc3Qgb3B0aW9uYWw8X1RwPiYgX194KSBub2V4Y2VwdAoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxib29sPihfX3gpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdGV4cHIKK2Jvb2wKK29wZXJhdG9yPChjb25zdCBvcHRpb25hbDxfVHA+JiwgbnVsbG9wdF90KSBub2V4Y2VwdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RleHByCitib29sCitvcGVyYXRvcjwobnVsbG9wdF90LCBjb25zdCBvcHRpb25hbDxfVHA+JiBfX3gpIG5vZXhjZXB0Cit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9feCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0ZXhwcgorYm9vbAorb3BlcmF0b3I8PShjb25zdCBvcHRpb25hbDxfVHA+JiBfX3gsIG51bGxvcHRfdCkgbm9leGNlcHQKK3sKKyAgICByZXR1cm4gIXN0YXRpY19jYXN0PGJvb2w+KF9feCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0ZXhwcgorYm9vbAorb3BlcmF0b3I8PShudWxsb3B0X3QsIGNvbnN0IG9wdGlvbmFsPF9UcD4mKSBub2V4Y2VwdAoreworICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdGV4cHIKK2Jvb2wKK29wZXJhdG9yPihjb25zdCBvcHRpb25hbDxfVHA+JiBfX3gsIG51bGxvcHRfdCkgbm9leGNlcHQKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RleHByCitib29sCitvcGVyYXRvcj4obnVsbG9wdF90LCBjb25zdCBvcHRpb25hbDxfVHA+Jikgbm9leGNlcHQKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0ZXhwcgorYm9vbAorb3BlcmF0b3I+PShjb25zdCBvcHRpb25hbDxfVHA+JiwgbnVsbG9wdF90KSBub2V4Y2VwdAoreworICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdGV4cHIKK2Jvb2wKK29wZXJhdG9yPj0obnVsbG9wdF90LCBjb25zdCBvcHRpb25hbDxfVHA+JiBfX3gpIG5vZXhjZXB0Cit7CisgICAgcmV0dXJuICFzdGF0aWNfY2FzdDxib29sPihfX3gpOworfQorCisvLyBDb21wYXJpc29ucyB3aXRoIFQKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RleHByCitlbmFibGVfaWZfdDwKKyAgICBpc19jb252ZXJ0aWJsZV92PGRlY2x0eXBlKF9WU1REOjpkZWNsdmFsPGNvbnN0IF9UcCY+KCkgPT0KKyAgICAgICAgX1ZTVEQ6OmRlY2x2YWw8Y29uc3QgX1VwJj4oKSksIGJvb2w+LAorICAgIGJvb2wKKz4KK29wZXJhdG9yPT0oY29uc3Qgb3B0aW9uYWw8X1RwPiYgX194LCBjb25zdCBfVXAmIF9fdikKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX194KSA/ICpfX3ggPT0gX192IDogZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RleHByCitlbmFibGVfaWZfdDwKKyAgICBpc19jb252ZXJ0aWJsZV92PGRlY2x0eXBlKF9WU1REOjpkZWNsdmFsPGNvbnN0IF9UcCY+KCkgPT0KKyAgICAgICAgX1ZTVEQ6OmRlY2x2YWw8Y29uc3QgX1VwJj4oKSksIGJvb2w+LAorICAgIGJvb2wKKz4KK29wZXJhdG9yPT0oY29uc3QgX1RwJiBfX3YsIGNvbnN0IG9wdGlvbmFsPF9VcD4mIF9feCkKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX194KSA/IF9fdiA9PSAqX194IDogZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RleHByCitlbmFibGVfaWZfdDwKKyAgICBpc19jb252ZXJ0aWJsZV92PGRlY2x0eXBlKF9WU1REOjpkZWNsdmFsPGNvbnN0IF9UcCY+KCkgIT0KKyAgICAgICAgX1ZTVEQ6OmRlY2x2YWw8Y29uc3QgX1VwJj4oKSksIGJvb2w+LAorICAgIGJvb2wKKz4KK29wZXJhdG9yIT0oY29uc3Qgb3B0aW9uYWw8X1RwPiYgX194LCBjb25zdCBfVXAmIF9fdikKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX194KSA/ICpfX3ggIT0gX192IDogdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdGV4cHIKK2VuYWJsZV9pZl90PAorICAgIGlzX2NvbnZlcnRpYmxlX3Y8ZGVjbHR5cGUoX1ZTVEQ6OmRlY2x2YWw8Y29uc3QgX1RwJj4oKSAhPQorICAgICAgICBfVlNURDo6ZGVjbHZhbDxjb25zdCBfVXAmPigpKSwgYm9vbD4sCisgICAgYm9vbAorPgorb3BlcmF0b3IhPShjb25zdCBfVHAmIF9fdiwgY29uc3Qgb3B0aW9uYWw8X1VwPiYgX194KQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxib29sPihfX3gpID8gX192ICE9ICpfX3ggOiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0ZXhwcgorZW5hYmxlX2lmX3Q8CisgICAgaXNfY29udmVydGlibGVfdjxkZWNsdHlwZShfVlNURDo6ZGVjbHZhbDxjb25zdCBfVHAmPigpIDwKKyAgICAgICAgX1ZTVEQ6OmRlY2x2YWw8Y29uc3QgX1VwJj4oKSksIGJvb2w+LAorICAgIGJvb2wKKz4KK29wZXJhdG9yPChjb25zdCBvcHRpb25hbDxfVHA+JiBfX3gsIGNvbnN0IF9VcCYgX192KQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxib29sPihfX3gpID8gKl9feCA8IF9fdiA6IHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RleHByCitlbmFibGVfaWZfdDwKKyAgICBpc19jb252ZXJ0aWJsZV92PGRlY2x0eXBlKF9WU1REOjpkZWNsdmFsPGNvbnN0IF9UcCY+KCkgPAorICAgICAgICBfVlNURDo6ZGVjbHZhbDxjb25zdCBfVXAmPigpKSwgYm9vbD4sCisgICAgYm9vbAorPgorb3BlcmF0b3I8KGNvbnN0IF9UcCYgX192LCBjb25zdCBvcHRpb25hbDxfVXA+JiBfX3gpCit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9feCkgPyBfX3YgPCAqX194IDogZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RleHByCitlbmFibGVfaWZfdDwKKyAgICBpc19jb252ZXJ0aWJsZV92PGRlY2x0eXBlKF9WU1REOjpkZWNsdmFsPGNvbnN0IF9UcCY+KCkgPD0KKyAgICAgICAgX1ZTVEQ6OmRlY2x2YWw8Y29uc3QgX1VwJj4oKSksIGJvb2w+LAorICAgIGJvb2wKKz4KK29wZXJhdG9yPD0oY29uc3Qgb3B0aW9uYWw8X1RwPiYgX194LCBjb25zdCBfVXAmIF9fdikKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX194KSA/ICpfX3ggPD0gX192IDogdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdGV4cHIKK2VuYWJsZV9pZl90PAorICAgIGlzX2NvbnZlcnRpYmxlX3Y8ZGVjbHR5cGUoX1ZTVEQ6OmRlY2x2YWw8Y29uc3QgX1RwJj4oKSA8PQorICAgICAgICBfVlNURDo6ZGVjbHZhbDxjb25zdCBfVXAmPigpKSwgYm9vbD4sCisgICAgYm9vbAorPgorb3BlcmF0b3I8PShjb25zdCBfVHAmIF9fdiwgY29uc3Qgb3B0aW9uYWw8X1VwPiYgX194KQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxib29sPihfX3gpID8gX192IDw9ICpfX3ggOiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdGV4cHIKK2VuYWJsZV9pZl90PAorICAgIGlzX2NvbnZlcnRpYmxlX3Y8ZGVjbHR5cGUoX1ZTVEQ6OmRlY2x2YWw8Y29uc3QgX1RwJj4oKSA+CisgICAgICAgIF9WU1REOjpkZWNsdmFsPGNvbnN0IF9VcCY+KCkpLCBib29sPiwKKyAgICBib29sCis+CitvcGVyYXRvcj4oY29uc3Qgb3B0aW9uYWw8X1RwPiYgX194LCBjb25zdCBfVXAmIF9fdikKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX194KSA/ICpfX3ggPiBfX3YgOiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdGV4cHIKK2VuYWJsZV9pZl90PAorICAgIGlzX2NvbnZlcnRpYmxlX3Y8ZGVjbHR5cGUoX1ZTVEQ6OmRlY2x2YWw8Y29uc3QgX1RwJj4oKSA+CisgICAgICAgIF9WU1REOjpkZWNsdmFsPGNvbnN0IF9VcCY+KCkpLCBib29sPiwKKyAgICBib29sCis+CitvcGVyYXRvcj4oY29uc3QgX1RwJiBfX3YsIGNvbnN0IG9wdGlvbmFsPF9VcD4mIF9feCkKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX194KSA/IF9fdiA+ICpfX3ggOiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0ZXhwcgorZW5hYmxlX2lmX3Q8CisgICAgaXNfY29udmVydGlibGVfdjxkZWNsdHlwZShfVlNURDo6ZGVjbHZhbDxjb25zdCBfVHAmPigpID49CisgICAgICAgIF9WU1REOjpkZWNsdmFsPGNvbnN0IF9VcCY+KCkpLCBib29sPiwKKyAgICBib29sCis+CitvcGVyYXRvcj49KGNvbnN0IG9wdGlvbmFsPF9UcD4mIF9feCwgY29uc3QgX1VwJiBfX3YpCit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9feCkgPyAqX194ID49IF9fdiA6IGZhbHNlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0ZXhwcgorZW5hYmxlX2lmX3Q8CisgICAgaXNfY29udmVydGlibGVfdjxkZWNsdHlwZShfVlNURDo6ZGVjbHZhbDxjb25zdCBfVHAmPigpID49CisgICAgICAgIF9WU1REOjpkZWNsdmFsPGNvbnN0IF9VcCY+KCkpLCBib29sPiwKKyAgICBib29sCis+CitvcGVyYXRvcj49KGNvbnN0IF9UcCYgX192LCBjb25zdCBvcHRpb25hbDxfVXA+JiBfX3gpCit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9feCkgPyBfX3YgPj0gKl9feCA6IHRydWU7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitlbmFibGVfaWZfdDwKKyAgICBpc19tb3ZlX2NvbnN0cnVjdGlibGVfdjxfVHA+ICYmIGlzX3N3YXBwYWJsZV92PF9UcD4sCisgICAgdm9pZAorPgorc3dhcChvcHRpb25hbDxfVHA+JiBfX3gsIG9wdGlvbmFsPF9UcD4mIF9feSkgbm9leGNlcHQobm9leGNlcHQoX194LnN3YXAoX195KSkpCit7CisgICAgX194LnN3YXAoX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RleHByCitvcHRpb25hbDxkZWNheV90PF9UcD4+IG1ha2Vfb3B0aW9uYWwoX1RwJiYgX192KQoreworICAgIHJldHVybiBvcHRpb25hbDxkZWNheV90PF9UcD4+KF9WU1REOjpmb3J3YXJkPF9UcD4oX192KSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzLi4uIF9BcmdzPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdGV4cHIKK29wdGlvbmFsPF9UcD4gbWFrZV9vcHRpb25hbChfQXJncyYmLi4uIF9fYXJncykKK3sKKyAgICByZXR1cm4gb3B0aW9uYWw8X1RwPihpbl9wbGFjZSwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXAsIGNsYXNzLi4uIF9BcmdzPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdGV4cHIKK29wdGlvbmFsPF9UcD4gbWFrZV9vcHRpb25hbChpbml0aWFsaXplcl9saXN0PF9VcD4gX19pbCwgIF9BcmdzJiYuLi4gX19hcmdzKQoreworICAgIHJldHVybiBvcHRpb25hbDxfVHA+KGluX3BsYWNlLCBfX2lsLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDwKKyAgICBfX2VuYWJsZV9oYXNoX2hlbHBlcjxvcHRpb25hbDxfVHA+LCByZW1vdmVfY29uc3RfdDxfVHA+PgorPgoreworICAgIHR5cGVkZWYgb3B0aW9uYWw8X1RwPiBhcmd1bWVudF90eXBlOworICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICByZXN1bHRfdHlwZTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKGNvbnN0IGFyZ3VtZW50X3R5cGUmIF9fb3B0KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9fb3B0KSA/IGhhc2g8cmVtb3ZlX2NvbnN0X3Q8X1RwPj4oKSgqX19vcHQpIDogMDsKKyAgICB9Cit9OworCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKKyNlbmRpZiAgLy8gX0xJQkNQUF9TVERfVkVSID4gMTQKKworX0xJQkNQUF9QT1BfTUFDUk9TCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9PUFRJT05BTApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL29zdHJlYW0gYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvb3N0cmVhbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTc2MzZlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL29zdHJlYW0KQEAgLTAsMCArMSwxMTAyIEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBvc3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX09TVFJFQU0KKyNkZWZpbmUgX0xJQkNQUF9PU1RSRUFNCisKKy8qCisgICAgb3N0cmVhbSBzeW5vcHNpcworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cyA9IGNoYXJfdHJhaXRzPGNoYXJUPiA+CitjbGFzcyBiYXNpY19vc3RyZWFtCisgICAgOiB2aXJ0dWFsIHB1YmxpYyBiYXNpY19pb3M8Y2hhclQsdHJhaXRzPgoreworcHVibGljOgorICAgIC8vIHR5cGVzIChpbmhlcml0ZWQgZnJvbSBiYXNpY19pb3MgKDI3LjUuNCkpOgorICAgIHR5cGVkZWYgY2hhclQgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIHRyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSBvZmZfdHlwZTsKKworICAgIC8vIDI3LjcuMi4yIENvbnN0cnVjdG9yL2Rlc3RydWN0b3I6CisgICAgZXhwbGljaXQgYmFzaWNfb3N0cmVhbShiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLHRyYWl0cz4qIHNiKTsKKyAgICBiYXNpY19vc3RyZWFtKGJhc2ljX29zdHJlYW0mJiByaHMpOworICAgIHZpcnR1YWwgfmJhc2ljX29zdHJlYW0oKTsKKworICAgIC8vIDI3LjcuMi4zIEFzc2lnbi9zd2FwCisgICAgYmFzaWNfb3N0cmVhbSYgb3BlcmF0b3I9KGNvbnN0IGJhc2ljX29zdHJlYW0mIHJocykgPSBkZWxldGU7IC8vIEMrKzE0CisgICAgYmFzaWNfb3N0cmVhbSYgb3BlcmF0b3I9KGJhc2ljX29zdHJlYW0mJiByaHMpOworICAgIHZvaWQgc3dhcChiYXNpY19vc3RyZWFtJiByaHMpOworCisgICAgLy8gMjcuNy4yLjQgUHJlZml4L3N1ZmZpeDoKKyAgICBjbGFzcyBzZW50cnk7CisKKyAgICAvLyAyNy43LjIuNiBGb3JtYXR0ZWQgb3V0cHV0OgorICAgIGJhc2ljX29zdHJlYW0mIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbSYgKCpwZikoYmFzaWNfb3N0cmVhbSYpKTsKKyAgICBiYXNpY19vc3RyZWFtJiBvcGVyYXRvcjw8KGJhc2ljX2lvczxjaGFyVCwgdHJhaXRzPiYgKCpwZikoYmFzaWNfaW9zPGNoYXJULHRyYWl0cz4mKSk7CisgICAgYmFzaWNfb3N0cmVhbSYgb3BlcmF0b3I8PChpb3NfYmFzZSYgKCpwZikoaW9zX2Jhc2UmKSk7CisgICAgYmFzaWNfb3N0cmVhbSYgb3BlcmF0b3I8PChib29sIG4pOworICAgIGJhc2ljX29zdHJlYW0mIG9wZXJhdG9yPDwoc2hvcnQgbik7CisgICAgYmFzaWNfb3N0cmVhbSYgb3BlcmF0b3I8PCh1bnNpZ25lZCBzaG9ydCBuKTsKKyAgICBiYXNpY19vc3RyZWFtJiBvcGVyYXRvcjw8KGludCBuKTsKKyAgICBiYXNpY19vc3RyZWFtJiBvcGVyYXRvcjw8KHVuc2lnbmVkIGludCBuKTsKKyAgICBiYXNpY19vc3RyZWFtJiBvcGVyYXRvcjw8KGxvbmcgbik7CisgICAgYmFzaWNfb3N0cmVhbSYgb3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIG4pOworICAgIGJhc2ljX29zdHJlYW0mIG9wZXJhdG9yPDwobG9uZyBsb25nIG4pOworICAgIGJhc2ljX29zdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBsb25nIG4pOworICAgIGJhc2ljX29zdHJlYW0mIG9wZXJhdG9yPDwoZmxvYXQgZik7CisgICAgYmFzaWNfb3N0cmVhbSYgb3BlcmF0b3I8PChkb3VibGUgZik7CisgICAgYmFzaWNfb3N0cmVhbSYgb3BlcmF0b3I8PChsb25nIGRvdWJsZSBmKTsKKyAgICBiYXNpY19vc3RyZWFtJiBvcGVyYXRvcjw8KGNvbnN0IHZvaWQqIHApOworICAgIGJhc2ljX29zdHJlYW0mIG9wZXJhdG9yPDwoYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSx0cmFpdHM+KiBzYik7CisKKyAgICAvLyAyNy43LjIuNyBVbmZvcm1hdHRlZCBvdXRwdXQ6CisgICAgYmFzaWNfb3N0cmVhbSYgcHV0KGNoYXJfdHlwZSBjKTsKKyAgICBiYXNpY19vc3RyZWFtJiB3cml0ZShjb25zdCBjaGFyX3R5cGUqIHMsIHN0cmVhbXNpemUgbik7CisgICAgYmFzaWNfb3N0cmVhbSYgZmx1c2goKTsKKworICAgIC8vIDI3LjcuMi41IHNlZWtzOgorICAgIHBvc190eXBlIHRlbGxwKCk7CisgICAgYmFzaWNfb3N0cmVhbSYgc2Vla3AocG9zX3R5cGUpOworICAgIGJhc2ljX29zdHJlYW0mIHNlZWtwKG9mZl90eXBlLCBpb3NfYmFzZTo6c2Vla2Rpcik7Citwcm90ZWN0ZWQ6CisgICAgYmFzaWNfb3N0cmVhbShjb25zdCBiYXNpY19vc3RyZWFtJiByaHMpID0gZGVsZXRlOworICAgIGJhc2ljX29zdHJlYW0oYmFzaWNfb3N0cmVhbSYmIHJocyk7CisgICAgLy8gMjcuNy4zLjMgQXNzaWduL3N3YXAKKyAgICBiYXNpY19vc3RyZWFtJiBvcGVyYXRvcj0oYmFzaWNfb3N0cmVhbSYgcmhzKSA9IGRlbGV0ZTsKKyAgICBiYXNpY19vc3RyZWFtJiBvcGVyYXRvcj0oY29uc3QgYmFzaWNfb3N0cmVhbSYmIHJocyk7CisgICAgdm9pZCBzd2FwKGJhc2ljX29zdHJlYW0mIHJocyk7Cit9OworCisvLyAyNy43LjIuNi40IGNoYXJhY3RlciBpbnNlcnRlcnMKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgYmFzaWNfb3N0cmVhbTxjaGFyVCx0cmFpdHM+JiBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhclQsdHJhaXRzPiYsIGNoYXJUKTsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgYmFzaWNfb3N0cmVhbTxjaGFyVCx0cmFpdHM+JiBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhclQsdHJhaXRzPiYsIGNoYXIpOworCit0ZW1wbGF0ZTxjbGFzcyB0cmFpdHM+CisgIGJhc2ljX29zdHJlYW08Y2hhcix0cmFpdHM+JiBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhcix0cmFpdHM+JiwgY2hhcik7CisKKy8vIHNpZ25lZCBhbmQgdW5zaWduZWQKKwordGVtcGxhdGU8Y2xhc3MgdHJhaXRzPgorICBiYXNpY19vc3RyZWFtPGNoYXIsdHJhaXRzPiYgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsdHJhaXRzPiYsIHNpZ25lZCBjaGFyKTsKKwordGVtcGxhdGU8Y2xhc3MgdHJhaXRzPgorICBiYXNpY19vc3RyZWFtPGNoYXIsdHJhaXRzPiYgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsdHJhaXRzPiYsIHVuc2lnbmVkIGNoYXIpOworCisvLyBOVEJTCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICBiYXNpY19vc3RyZWFtPGNoYXJULHRyYWl0cz4mIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyVCx0cmFpdHM+JiwgY29uc3QgY2hhclQqKTsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgYmFzaWNfb3N0cmVhbTxjaGFyVCx0cmFpdHM+JiBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhclQsdHJhaXRzPiYsIGNvbnN0IGNoYXIqKTsKKwordGVtcGxhdGU8Y2xhc3MgdHJhaXRzPgorICBiYXNpY19vc3RyZWFtPGNoYXIsdHJhaXRzPiYgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsdHJhaXRzPiYsIGNvbnN0IGNoYXIqKTsKKworLy8gc2lnbmVkIGFuZCB1bnNpZ25lZAordGVtcGxhdGU8Y2xhc3MgdHJhaXRzPgorYmFzaWNfb3N0cmVhbTxjaGFyLHRyYWl0cz4mIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLHRyYWl0cz4mLCBjb25zdCBzaWduZWQgY2hhciopOworCit0ZW1wbGF0ZTxjbGFzcyB0cmFpdHM+CisgIGJhc2ljX29zdHJlYW08Y2hhcix0cmFpdHM+JiBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhcix0cmFpdHM+JiwgY29uc3QgdW5zaWduZWQgY2hhciopOworCisvLyBzd2FwOgordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgIHZvaWQgc3dhcChiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JiB4LCBiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgIGJhc2ljX29zdHJlYW08Y2hhclQsdHJhaXRzPiYgZW5kbChiYXNpY19vc3RyZWFtPGNoYXJULHRyYWl0cz4mIG9zKTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgIGJhc2ljX29zdHJlYW08Y2hhclQsdHJhaXRzPiYgZW5kcyhiYXNpY19vc3RyZWFtPGNoYXJULHRyYWl0cz4mIG9zKTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgIGJhc2ljX29zdHJlYW08Y2hhclQsdHJhaXRzPiYgZmx1c2goYmFzaWNfb3N0cmVhbTxjaGFyVCx0cmFpdHM+JiBvcyk7CisKKy8vIHJ2YWx1ZSBzdHJlYW0gaW5zZXJ0aW9uCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgVD4KKyAgYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYKKyAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JiYgb3MsIGNvbnN0IFQmIHgpOworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPGlvcz4KKyNpbmNsdWRlIDxzdHJlYW1idWY+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGJpdHNldD4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYmFzaWNfb3N0cmVhbQorICAgIDogdmlydHVhbCBwdWJsaWMgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4KK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcyAoaW5oZXJpdGVkIGZyb20gYmFzaWNfaW9zICgyNy41LjQpKToKKyAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgaW50X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cG9zX3R5cGUgcG9zX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgb2ZmX3R5cGU7CisKKyAgICAvLyAyNy43LjIuMiBDb25zdHJ1Y3Rvci9kZXN0cnVjdG9yOgorICAgIGlubGluZSBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IGJhc2ljX29zdHJlYW0oYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiBfX3NiKQorICAgIHsgdGhpcy0+aW5pdChfX3NiKTsgfQorICAgIHZpcnR1YWwgfmJhc2ljX29zdHJlYW0oKTsKK3Byb3RlY3RlZDoKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19vc3RyZWFtKGJhc2ljX29zdHJlYW0mJiBfX3Jocyk7CisKKyAgICAvLyAyNy43LjIuMyBBc3NpZ24vc3dhcAorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfb3N0cmVhbSYgb3BlcmF0b3I9KGJhc2ljX29zdHJlYW0mJiBfX3Jocyk7CisjZW5kaWYKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAoYmFzaWNfb3N0cmVhbSYgX19yaHMpCisgICAgeyBiYXNpY19pb3M8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT46OnN3YXAoX19yaHMpOyB9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgYmFzaWNfb3N0cmVhbSAgICAgICAgICAgKGNvbnN0IGJhc2ljX29zdHJlYW0mIF9fcmhzKSA9IGRlbGV0ZTsKKyAgICBiYXNpY19vc3RyZWFtJiBvcGVyYXRvcj0oY29uc3QgYmFzaWNfb3N0cmVhbSYgX19yaHMpID0gZGVsZXRlOworI2Vsc2UKKyAgICBiYXNpY19vc3RyZWFtICAgICAgICAgICAoY29uc3QgYmFzaWNfb3N0cmVhbSYgX19yaHMpOyAvLyBub3QgZGVmaW5lZAorICAgIGJhc2ljX29zdHJlYW0mIG9wZXJhdG9yPShjb25zdCBiYXNpY19vc3RyZWFtJiBfX3Jocyk7IC8vIG5vdCBkZWZpbmVkCisjZW5kaWYKK3B1YmxpYzoKKworICAgIC8vIDI3LjcuMi40IFByZWZpeC9zdWZmaXg6CisgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgc2VudHJ5OworCisgICAgLy8gMjcuNy4yLjYgRm9ybWF0dGVkIG91dHB1dDoKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19vc3RyZWFtJiBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW0mICgqX19wZikoYmFzaWNfb3N0cmVhbSYpKQorICAgIHsgcmV0dXJuIF9fcGYoKnRoaXMpOyB9CisKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19vc3RyZWFtJiBvcGVyYXRvcjw8KGJhc2ljX2lvczxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqX19wZikoYmFzaWNfaW9zPGNoYXJfdHlwZSx0cmFpdHNfdHlwZT4mKSkKKyAgICB7IF9fcGYoKnRoaXMpOyByZXR1cm4gKnRoaXM7IH0KKworICAgIGlubGluZSBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX29zdHJlYW0mIG9wZXJhdG9yPDwoaW9zX2Jhc2UmICgqX19wZikoaW9zX2Jhc2UmKSkKKyAgICB7IF9fcGYoKnRoaXMpOyByZXR1cm4gKnRoaXM7IH0KKworICAgIGJhc2ljX29zdHJlYW0mIG9wZXJhdG9yPDwoYm9vbCBfX24pOworICAgIGJhc2ljX29zdHJlYW0mIG9wZXJhdG9yPDwoc2hvcnQgX19uKTsKKyAgICBiYXNpY19vc3RyZWFtJiBvcGVyYXRvcjw8KHVuc2lnbmVkIHNob3J0IF9fbik7CisgICAgYmFzaWNfb3N0cmVhbSYgb3BlcmF0b3I8PChpbnQgX19uKTsKKyAgICBiYXNpY19vc3RyZWFtJiBvcGVyYXRvcjw8KHVuc2lnbmVkIGludCBfX24pOworICAgIGJhc2ljX29zdHJlYW0mIG9wZXJhdG9yPDwobG9uZyBfX24pOworICAgIGJhc2ljX29zdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBfX24pOworICAgIGJhc2ljX29zdHJlYW0mIG9wZXJhdG9yPDwobG9uZyBsb25nIF9fbik7CisgICAgYmFzaWNfb3N0cmVhbSYgb3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIGxvbmcgX19uKTsKKyAgICBiYXNpY19vc3RyZWFtJiBvcGVyYXRvcjw8KGZsb2F0IF9fZik7CisgICAgYmFzaWNfb3N0cmVhbSYgb3BlcmF0b3I8PChkb3VibGUgX19mKTsKKyAgICBiYXNpY19vc3RyZWFtJiBvcGVyYXRvcjw8KGxvbmcgZG91YmxlIF9fZik7CisgICAgYmFzaWNfb3N0cmVhbSYgb3BlcmF0b3I8PChjb25zdCB2b2lkKiBfX3ApOworICAgIGJhc2ljX29zdHJlYW0mIG9wZXJhdG9yPDwoYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiBfX3NiKTsKKworICAgIC8vIDI3LjcuMi43IFVuZm9ybWF0dGVkIG91dHB1dDoKKyAgICBiYXNpY19vc3RyZWFtJiBwdXQoY2hhcl90eXBlIF9fYyk7CisgICAgYmFzaWNfb3N0cmVhbSYgd3JpdGUoY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKyAgICBiYXNpY19vc3RyZWFtJiBmbHVzaCgpOworCisgICAgLy8gMjcuNy4yLjUgc2Vla3M6CisgICAgaW5saW5lIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX0lOTElORV9WSVNJQklMSVRZCisgICAgcG9zX3R5cGUgdGVsbHAoKTsKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19vc3RyZWFtJiBzZWVrcChwb3NfdHlwZSBfX3Bvcyk7CisgICAgaW5saW5lIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfb3N0cmVhbSYgc2Vla3Aob2ZmX3R5cGUgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fZGlyKTsKKworcHJvdGVjdGVkOgorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGJhc2ljX29zdHJlYW0oKSB7fSAgLy8gZXh0ZW5zaW9uLCBpbnRlbnRpYWxseSBkb2VzIG5vdCBpbml0aWFsaXplCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnkKK3sKKyAgICBib29sIF9fb2tfOworICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vc187CisKKyAgICBzZW50cnkoY29uc3Qgc2VudHJ5Jik7IC8vID0gZGVsZXRlOworICAgIHNlbnRyeSYgb3BlcmF0b3I9KGNvbnN0IHNlbnRyeSYpOyAvLyA9IGRlbGV0ZTsKKworcHVibGljOgorICAgIGV4cGxpY2l0IHNlbnRyeShiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MpOworICAgIH5zZW50cnkoKTsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgICAgICBfTElCQ1BQX0VYUExJQ0lUCisgICAgICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7cmV0dXJuIF9fb2tfO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeTo6c2VudHJ5KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcykKKyAgICA6IF9fb2tfKGZhbHNlKSwKKyAgICAgIF9fb3NfKF9fb3MpCit7CisgICAgaWYgKF9fb3MuZ29vZCgpKQorICAgIHsKKyAgICAgICAgaWYgKF9fb3MudGllKCkpCisgICAgICAgICAgICBfX29zLnRpZSgpLT5mbHVzaCgpOworICAgICAgICBfX29rXyA9IHRydWU7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnk6On5zZW50cnkoKQoreworICAgIGlmIChfX29zXy5yZGJ1ZigpICYmIF9fb3NfLmdvb2QoKSAmJiAoX19vc18uZmxhZ3MoKSAmIGlvc19iYXNlOjp1bml0YnVmKQorICAgICAgICAgICAgICAgICAgICAgICYmICF1bmNhdWdodF9leGNlcHRpb24oKSkKKyAgICB7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0cnkKKyAgICAgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIGlmIChfX29zXy5yZGJ1ZigpLT5wdWJzeW5jKCkgPT0gLTEpCisgICAgICAgICAgICAgICAgX19vc18uc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB9CisgICAgICAgIGNhdGNoICguLi4pCisgICAgICAgIHsKKyAgICAgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmJhc2ljX29zdHJlYW0oYmFzaWNfb3N0cmVhbSYmIF9fcmhzKQoreworICAgIHRoaXMtPm1vdmUoX19yaHMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcj0oYmFzaWNfb3N0cmVhbSYmIF9fcmhzKQoreworICAgIHN3YXAoX19yaHMpOworICAgIHJldHVybiAqdGhpczsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6fmJhc2ljX29zdHJlYW0oKQoreworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KGJhc2ljX3N0cmVhbWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiogX19zYikKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgc2VudHJ5IF9fcygqdGhpcyk7CisgICAgICAgIGlmIChfX3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX3NiKQorICAgICAgICAgICAgeworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiBfSXA7CisgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+IF9PcDsKKyAgICAgICAgICAgICAgICAgICAgX0lwIF9faShfX3NiKTsKKyAgICAgICAgICAgICAgICAgICAgX0lwIF9fZW9mOworICAgICAgICAgICAgICAgICAgICBfT3AgX19vKCp0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fYyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBfX2kgIT0gX19lb2Y7ICsrX19pLCArK19fbywgKytfX2MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpfX28gPSAqX19pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fby5mYWlsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoX19jID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoLi4uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy0+X19zZXRfZmFpbGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICB0aGlzLT5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PChib29sIF9fbikKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgc2VudHJ5IF9fcygqdGhpcyk7CisgICAgICAgIGlmIChfX3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgbnVtX3B1dDxjaGFyX3R5cGUsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gPiBfRnA7CisgICAgICAgICAgICBjb25zdCBfRnAmIF9fZiA9IHVzZV9mYWNldDxfRnA+KHRoaXMtPmdldGxvYygpKTsKKyAgICAgICAgICAgIGlmIChfX2YucHV0KCp0aGlzLCAqdGhpcywgdGhpcy0+ZmlsbCgpLCBfX24pLmZhaWxlZCgpKQorICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQgfCBpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICB0aGlzLT5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PChzaG9ydCBfX24pCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHNlbnRyeSBfX3MoKnRoaXMpOworICAgICAgICBpZiAoX19zKQorICAgICAgICB7CisgICAgICAgICAgICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IGlvc19iYXNlOjpmbGFncygpICYgaW9zX2Jhc2U6OmJhc2VmaWVsZDsKKyAgICAgICAgICAgIHR5cGVkZWYgbnVtX3B1dDxjaGFyX3R5cGUsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gPiBfRnA7CisgICAgICAgICAgICBjb25zdCBfRnAmIF9fZiA9IHVzZV9mYWNldDxfRnA+KHRoaXMtPmdldGxvYygpKTsKKyAgICAgICAgICAgIGlmIChfX2YucHV0KCp0aGlzLCAqdGhpcywgdGhpcy0+ZmlsbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mbGFncyA9PSBpb3NfYmFzZTo6b2N0IHx8IF9fZmxhZ3MgPT0gaW9zX2Jhc2U6OmhleCA/CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oX19uKSkgIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmc+KF9fbikpLmZhaWxlZCgpKQorICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQgfCBpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICB0aGlzLT5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PCh1bnNpZ25lZCBzaG9ydCBfX24pCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHNlbnRyeSBfX3MoKnRoaXMpOworICAgICAgICBpZiAoX19zKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIG51bV9wdXQ8Y2hhcl90eXBlLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+ID4gX0ZwOworICAgICAgICAgICAgY29uc3QgX0ZwJiBfX2YgPSB1c2VfZmFjZXQ8X0ZwPih0aGlzLT5nZXRsb2MoKSk7CisgICAgICAgICAgICBpZiAoX19mLnB1dCgqdGhpcywgKnRoaXMsIHRoaXMtPmZpbGwoKSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oX19uKSkuZmFpbGVkKCkpCisgICAgICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCB8IGlvc19iYXNlOjpmYWlsYml0KTsKKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KGludCBfX24pCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHNlbnRyeSBfX3MoKnRoaXMpOworICAgICAgICBpZiAoX19zKQorICAgICAgICB7CisgICAgICAgICAgICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IGlvc19iYXNlOjpmbGFncygpICYgaW9zX2Jhc2U6OmJhc2VmaWVsZDsKKyAgICAgICAgICAgIHR5cGVkZWYgbnVtX3B1dDxjaGFyX3R5cGUsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gPiBfRnA7CisgICAgICAgICAgICBjb25zdCBfRnAmIF9fZiA9IHVzZV9mYWNldDxfRnA+KHRoaXMtPmdldGxvYygpKTsKKyAgICAgICAgICAgIGlmIChfX2YucHV0KCp0aGlzLCAqdGhpcywgdGhpcy0+ZmlsbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mbGFncyA9PSBpb3NfYmFzZTo6b2N0IHx8IF9fZmxhZ3MgPT0gaW9zX2Jhc2U6OmhleCA/CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KF9fbikpICA6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nPihfX24pKS5mYWlsZWQoKSkKKyAgICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgdGhpcy0+X19zZXRfYmFkYml0X2FuZF9jb25zaWRlcl9yZXRocm93KCk7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwodW5zaWduZWQgaW50IF9fbikKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgc2VudHJ5IF9fcygqdGhpcyk7CisgICAgICAgIGlmIChfX3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgbnVtX3B1dDxjaGFyX3R5cGUsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gPiBfRnA7CisgICAgICAgICAgICBjb25zdCBfRnAmIF9fZiA9IHVzZV9mYWNldDxfRnA+KHRoaXMtPmdldGxvYygpKTsKKyAgICAgICAgICAgIGlmIChfX2YucHV0KCp0aGlzLCAqdGhpcywgdGhpcy0+ZmlsbCgpLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihfX24pKS5mYWlsZWQoKSkKKyAgICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgdGhpcy0+X19zZXRfYmFkYml0X2FuZF9jb25zaWRlcl9yZXRocm93KCk7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwobG9uZyBfX24pCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHNlbnRyeSBfX3MoKnRoaXMpOworICAgICAgICBpZiAoX19zKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIG51bV9wdXQ8Y2hhcl90eXBlLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+ID4gX0ZwOworICAgICAgICAgICAgY29uc3QgX0ZwJiBfX2YgPSB1c2VfZmFjZXQ8X0ZwPih0aGlzLT5nZXRsb2MoKSk7CisgICAgICAgICAgICBpZiAoX19mLnB1dCgqdGhpcywgKnRoaXMsIHRoaXMtPmZpbGwoKSwgX19uKS5mYWlsZWQoKSkKKyAgICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgdGhpcy0+X19zZXRfYmFkYml0X2FuZF9jb25zaWRlcl9yZXRocm93KCk7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBfX24pCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHNlbnRyeSBfX3MoKnRoaXMpOworICAgICAgICBpZiAoX19zKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIG51bV9wdXQ8Y2hhcl90eXBlLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+ID4gX0ZwOworICAgICAgICAgICAgY29uc3QgX0ZwJiBfX2YgPSB1c2VfZmFjZXQ8X0ZwPih0aGlzLT5nZXRsb2MoKSk7CisgICAgICAgICAgICBpZiAoX19mLnB1dCgqdGhpcywgKnRoaXMsIHRoaXMtPmZpbGwoKSwgX19uKS5mYWlsZWQoKSkKKyAgICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgdGhpcy0+X19zZXRfYmFkYml0X2FuZF9jb25zaWRlcl9yZXRocm93KCk7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9yPDwobG9uZyBsb25nIF9fbikKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgc2VudHJ5IF9fcygqdGhpcyk7CisgICAgICAgIGlmIChfX3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgbnVtX3B1dDxjaGFyX3R5cGUsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gPiBfRnA7CisgICAgICAgICAgICBjb25zdCBfRnAmIF9fZiA9IHVzZV9mYWNldDxfRnA+KHRoaXMtPmdldGxvYygpKTsKKyAgICAgICAgICAgIGlmIChfX2YucHV0KCp0aGlzLCAqdGhpcywgdGhpcy0+ZmlsbCgpLCBfX24pLmZhaWxlZCgpKQorICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQgfCBpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICB0aGlzLT5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIGxvbmcgX19uKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICBzZW50cnkgX19zKCp0aGlzKTsKKyAgICAgICAgaWYgKF9fcykKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZWRlZiBudW1fcHV0PGNoYXJfdHlwZSwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiA+IF9GcDsKKyAgICAgICAgICAgIGNvbnN0IF9GcCYgX19mID0gdXNlX2ZhY2V0PF9GcD4odGhpcy0+Z2V0bG9jKCkpOworICAgICAgICAgICAgaWYgKF9fZi5wdXQoKnRoaXMsICp0aGlzLCB0aGlzLT5maWxsKCksIF9fbikuZmFpbGVkKCkpCisgICAgICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCB8IGlvc19iYXNlOjpmYWlsYml0KTsKKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KGZsb2F0IF9fbikKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgc2VudHJ5IF9fcygqdGhpcyk7CisgICAgICAgIGlmIChfX3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgbnVtX3B1dDxjaGFyX3R5cGUsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gPiBfRnA7CisgICAgICAgICAgICBjb25zdCBfRnAmIF9fZiA9IHVzZV9mYWNldDxfRnA+KHRoaXMtPmdldGxvYygpKTsKKyAgICAgICAgICAgIGlmIChfX2YucHV0KCp0aGlzLCAqdGhpcywgdGhpcy0+ZmlsbCgpLCBzdGF0aWNfY2FzdDxkb3VibGU+KF9fbikpLmZhaWxlZCgpKQorICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQgfCBpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICB0aGlzLT5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PChkb3VibGUgX19uKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICBzZW50cnkgX19zKCp0aGlzKTsKKyAgICAgICAgaWYgKF9fcykKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZWRlZiBudW1fcHV0PGNoYXJfdHlwZSwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiA+IF9GcDsKKyAgICAgICAgICAgIGNvbnN0IF9GcCYgX19mID0gdXNlX2ZhY2V0PF9GcD4odGhpcy0+Z2V0bG9jKCkpOworICAgICAgICAgICAgaWYgKF9fZi5wdXQoKnRoaXMsICp0aGlzLCB0aGlzLT5maWxsKCksIF9fbikuZmFpbGVkKCkpCisgICAgICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCB8IGlvc19iYXNlOjpmYWlsYml0KTsKKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KGxvbmcgZG91YmxlIF9fbikKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgc2VudHJ5IF9fcygqdGhpcyk7CisgICAgICAgIGlmIChfX3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgbnVtX3B1dDxjaGFyX3R5cGUsIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gPiBfRnA7CisgICAgICAgICAgICBjb25zdCBfRnAmIF9fZiA9IHVzZV9mYWNldDxfRnA+KHRoaXMtPmdldGxvYygpKTsKKyAgICAgICAgICAgIGlmIChfX2YucHV0KCp0aGlzLCAqdGhpcywgdGhpcy0+ZmlsbCgpLCBfX24pLmZhaWxlZCgpKQorICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQgfCBpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICB0aGlzLT5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I8PChjb25zdCB2b2lkKiBfX24pCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHNlbnRyeSBfX3MoKnRoaXMpOworICAgICAgICBpZiAoX19zKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIG51bV9wdXQ8Y2hhcl90eXBlLCBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+ID4gX0ZwOworICAgICAgICAgICAgY29uc3QgX0ZwJiBfX2YgPSB1c2VfZmFjZXQ8X0ZwPih0aGlzLT5nZXRsb2MoKSk7CisgICAgICAgICAgICBpZiAoX19mLnB1dCgqdGhpcywgKnRoaXMsIHRoaXMtPmZpbGwoKSwgX19uKS5mYWlsZWQoKSkKKyAgICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgdGhpcy0+X19zZXRfYmFkYml0X2FuZF9jb25zaWRlcl9yZXRocm93KCk7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK19fcHV0X2NoYXJhY3Rlcl9zZXF1ZW5jZShiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19zdHIsIHNpemVfdCBfX2xlbikKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgdHlwZW5hbWUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnkgX19zKF9fb3MpOworICAgICAgICBpZiAoX19zKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiBfSXA7CisgICAgICAgICAgICBpZiAoX19wYWRfYW5kX291dHB1dChfSXAoX19vcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX29zLmZsYWdzKCkgJiBpb3NfYmFzZTo6YWRqdXN0ZmllbGQpID09IGlvc19iYXNlOjpsZWZ0ID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N0ciArIF9fbGVuIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc3RyICsgX19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX29zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19vcy5maWxsKCkpLmZhaWxlZCgpKQorICAgICAgICAgICAgICAgIF9fb3Muc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCB8IGlvc19iYXNlOjpmYWlsYml0KTsKKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIF9fb3MuX19zZXRfYmFkYml0X2FuZF9jb25zaWRlcl9yZXRocm93KCk7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICByZXR1cm4gX19vczsKK30KKworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgX0NoYXJUIF9fYykKK3sKKyAgICByZXR1cm4gX1ZTVEQ6Ol9fcHV0X2NoYXJhY3Rlcl9zZXF1ZW5jZShfX29zLCAmX19jLCAxKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIGNoYXIgX19jbikKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgdHlwZW5hbWUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnkgX19zKF9fb3MpOworICAgICAgICBpZiAoX19zKQorICAgICAgICB7CisgICAgICAgICAgICBfQ2hhclQgX19jID0gX19vcy53aWRlbihfX2NuKTsKKyAgICAgICAgICAgIHR5cGVkZWYgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+IF9JcDsKKyAgICAgICAgICAgIGlmIChfX3BhZF9hbmRfb3V0cHV0KF9JcChfX29zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfX2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19vcy5mbGFncygpICYgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKSA9PSBpb3NfYmFzZTo6bGVmdCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fYyArIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfX2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX19jICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX29zLmZpbGwoKSkuZmFpbGVkKCkpCisgICAgICAgICAgICAgICAgX19vcy5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgX19vcy5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vcywgY2hhciBfX2MpCit7CisgICAgcmV0dXJuIF9WU1REOjpfX3B1dF9jaGFyYWN0ZXJfc2VxdWVuY2UoX19vcywgJl9fYywgMSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX29zLCBzaWduZWQgY2hhciBfX2MpCit7CisgICAgcmV0dXJuIF9WU1REOjpfX3B1dF9jaGFyYWN0ZXJfc2VxdWVuY2UoX19vcywgKGNoYXIgKikgJl9fYywgMSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX29zLCB1bnNpZ25lZCBjaGFyIF9fYykKK3sKKyAgICByZXR1cm4gX1ZTVEQ6Ol9fcHV0X2NoYXJhY3Rlcl9zZXF1ZW5jZShfX29zLCAoY2hhciAqKSAmX19jLCAxKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIGNvbnN0IF9DaGFyVCogX19zdHIpCit7CisgICAgcmV0dXJuIF9WU1REOjpfX3B1dF9jaGFyYWN0ZXJfc2VxdWVuY2UoX19vcywgX19zdHIsIF9UcmFpdHM6Omxlbmd0aChfX3N0cikpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgY29uc3QgY2hhciogX19zdHJuKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0eXBlbmFtZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeSBfX3MoX19vcyk7CisgICAgICAgIGlmIChfX3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+IF9JcDsKKyAgICAgICAgICAgIHNpemVfdCBfX2xlbiA9IGNoYXJfdHJhaXRzPGNoYXI+OjpsZW5ndGgoX19zdHJuKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBfX2JzID0gMTAwOworICAgICAgICAgICAgX0NoYXJUIF9fd2JiW19fYnNdOworICAgICAgICAgICAgX0NoYXJUKiBfX3diID0gX193YmI7CisgICAgICAgICAgICB1bmlxdWVfcHRyPF9DaGFyVCwgdm9pZCgqKSh2b2lkKik+IF9faCgwLCBmcmVlKTsKKyAgICAgICAgICAgIGlmIChfX2xlbiA+IF9fYnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX193YiA9IChfQ2hhclQqKW1hbGxvYyhfX2xlbipzaXplb2YoX0NoYXJUKSk7CisgICAgICAgICAgICAgICAgaWYgKF9fd2IgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgX190aHJvd19iYWRfYWxsb2MoKTsKKyAgICAgICAgICAgICAgICBfX2gucmVzZXQoX193Yik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKF9DaGFyVCogX19wID0gX193YjsgKl9fc3RybiAhPSAnXDAnOyArK19fc3RybiwgKytfX3ApCisgICAgICAgICAgICAgICAgKl9fcCA9IF9fb3Mud2lkZW4oKl9fc3Rybik7CisgICAgICAgICAgICBpZiAoX19wYWRfYW5kX291dHB1dChfSXAoX19vcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3diLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fb3MuZmxhZ3MoKSAmIGlvc19iYXNlOjphZGp1c3RmaWVsZCkgPT0gaW9zX2Jhc2U6OmxlZnQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fd2IgKyBfX2xlbiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX193YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fd2IgKyBfX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX29zLmZpbGwoKSkuZmFpbGVkKCkpCisgICAgICAgICAgICAgICAgX19vcy5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgX19vcy5fX3NldF9iYWRiaXRfYW5kX2NvbnNpZGVyX3JldGhyb3coKTsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vcywgY29uc3QgY2hhciogX19zdHIpCit7CisgICAgcmV0dXJuIF9WU1REOjpfX3B1dF9jaGFyYWN0ZXJfc2VxdWVuY2UoX19vcywgX19zdHIsIF9UcmFpdHM6Omxlbmd0aChfX3N0cikpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vcywgY29uc3Qgc2lnbmVkIGNoYXIqIF9fc3RyKQoreworICAgIGNvbnN0IGNoYXIgKl9fcyA9IChjb25zdCBjaGFyICopIF9fc3RyOworICAgIHJldHVybiBfVlNURDo6X19wdXRfY2hhcmFjdGVyX3NlcXVlbmNlKF9fb3MsIF9fcywgX1RyYWl0czo6bGVuZ3RoKF9fcykpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vcywgY29uc3QgdW5zaWduZWQgY2hhciogX19zdHIpCit7CisgICAgY29uc3QgY2hhciAqX19zID0gKGNvbnN0IGNoYXIgKikgX19zdHI7CisgICAgcmV0dXJuIF9WU1REOjpfX3B1dF9jaGFyYWN0ZXJfc2VxdWVuY2UoX19vcywgX19zLCBfVHJhaXRzOjpsZW5ndGgoX19zKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnB1dChjaGFyX3R5cGUgX19jKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICBzZW50cnkgX19zKCp0aGlzKTsKKyAgICAgICAgaWYgKF9fcykKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZWRlZiBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4gX09wOworICAgICAgICAgICAgX09wIF9fbygqdGhpcyk7CisgICAgICAgICAgICAqX19vID0gX19jOworICAgICAgICAgICAgaWYgKF9fby5mYWlsZWQoKSkKKyAgICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojp3cml0ZShjb25zdCBjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHNlbnRyeSBfX3NlbigqdGhpcyk7CisgICAgICAgIGlmIChfX3NlbiAmJiBfX24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGlzLT5yZGJ1ZigpLT5zcHV0bihfX3MsIF9fbikgIT0gX19uKQorICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworICAgICAgICB9CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgdGhpcy0+X19zZXRfYmFkYml0X2FuZF9jb25zaWRlcl9yZXRocm93KCk7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmZsdXNoKCkKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdHJ5CisgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgaWYgKHRoaXMtPnJkYnVmKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbnRyeSBfX3MoKnRoaXMpOworICAgICAgICAgICAgaWYgKF9fcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+cmRidWYoKS0+cHVic3luYygpID09IC0xKQorICAgICAgICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHRoaXMtPl9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordHlwZW5hbWUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojpwb3NfdHlwZQorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojp0ZWxscCgpCit7CisgICAgaWYgKHRoaXMtPmZhaWwoKSkKKyAgICAgICAgcmV0dXJuIHBvc190eXBlKC0xKTsKKyAgICByZXR1cm4gdGhpcy0+cmRidWYoKS0+cHVic2Vla29mZigwLCBpb3NfYmFzZTo6Y3VyLCBpb3NfYmFzZTo6b3V0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c2Vla3AocG9zX3R5cGUgX19wb3MpCit7CisgICAgc2VudHJ5IF9fcygqdGhpcyk7CisgICAgaWYgKCF0aGlzLT5mYWlsKCkpCisgICAgeworICAgICAgICBpZiAodGhpcy0+cmRidWYoKS0+cHVic2Vla3BvcyhfX3BvcywgaW9zX2Jhc2U6Om91dCkgPT0gcG9zX3R5cGUoLTEpKQorICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlZWtwKG9mZl90eXBlIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX2RpcikKK3sKKyAgICBzZW50cnkgX19zKCp0aGlzKTsKKyAgICBpZiAoIXRoaXMtPmZhaWwoKSkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5yZGJ1ZigpLT5wdWJzZWVrb2ZmKF9fb2ZmLCBfX2RpciwgaW9zX2Jhc2U6Om91dCkgPT0gcG9zX3R5cGUoLTEpKQorICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorZW5kbChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MpCit7CisgICAgX19vcy5wdXQoX19vcy53aWRlbignXG4nKSk7CisgICAgX19vcy5mbHVzaCgpOworICAgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2VuZHMoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zKQoreworICAgIF9fb3MucHV0KF9DaGFyVCgpKTsKKyAgICByZXR1cm4gX19vczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitmbHVzaChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MpCit7CisgICAgX19vcy5mbHVzaCgpOworICAgIHJldHVybiBfX29zOworfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmVhbSwgY2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgICFpc19sdmFsdWVfcmVmZXJlbmNlPF9TdHJlYW0+Ojp2YWx1ZSAmJgorICAgIGlzX2Jhc2Vfb2Y8aW9zX2Jhc2UsIF9TdHJlYW0+Ojp2YWx1ZSwKKyAgICBfU3RyZWFtJiYKKz46OnR5cGUKK29wZXJhdG9yPDwoX1N0cmVhbSYmIF9fb3MsIGNvbnN0IF9UcCYgX194KQoreworICAgIF9fb3MgPDwgX194OworICAgIHJldHVybiBfVlNURDo6bW92ZShfX29zKTsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3N0cikKK3sKKyAgICByZXR1cm4gX1ZTVEQ6Ol9fcHV0X2NoYXJhY3Rlcl9zZXF1ZW5jZShfX29zLCBfX3N0ci5kYXRhKCksIF9fc3RyLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHM+IF9fc3YpCit7CisgICAgcmV0dXJuIF9WU1REOjpfX3B1dF9jaGFyYWN0ZXJfc2VxdWVuY2UoX19vcywgX19zdi5kYXRhKCksIF9fc3Yuc2l6ZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgY29uc3QgZXJyb3JfY29kZSYgX19lYykKK3sKKyAgICByZXR1cm4gX19vcyA8PCBfX2VjLmNhdGVnb3J5KCkubmFtZSgpIDw8ICc6JyA8PCBfX2VjLnZhbHVlKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX1lwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBzaGFyZWRfcHRyPF9ZcD4gY29uc3QmIF9fcCkKK3sKKyAgICByZXR1cm4gX19vcyA8PCBfX3AuZ2V0KCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX1lwLCBjbGFzcyBfRHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgaXNfc2FtZTx2b2lkLCB0eXBlbmFtZSBfX3ZvaWRfdDxkZWNsdHlwZSgoZGVjbHZhbDxiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mPigpIDw8IGRlY2x2YWw8dHlwZW5hbWUgdW5pcXVlX3B0cjxfWXAsIF9EcD46OnBvaW50ZXI+KCkpKT46OnR5cGU+Ojp2YWx1ZSwKKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCis+Ojp0eXBlCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgdW5pcXVlX3B0cjxfWXAsIF9EcD4gY29uc3QmIF9fcCkKK3sKKyAgICByZXR1cm4gX19vcyA8PCBfX3AuZ2V0KCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIHNpemVfdCBfU2l6ZT4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBiaXRzZXQ8X1NpemU+JiBfX3gpCit7CisgICAgcmV0dXJuIF9fb3MgPDwgX194LnRlbXBsYXRlIHRvX3N0cmluZzxfQ2hhclQsIF9UcmFpdHM+CisgICAgICAgICAgICAgICAgICAgICAgICAodXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX29zLmdldGxvYygpKS53aWRlbignMCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19vcy5nZXRsb2MoKSkud2lkZW4oJzEnKSk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9BVkFJTEFCSUxJVFlfTk9fU1RSRUFNU19FWFRFUk5fVEVNUExBVEUKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIGJhc2ljX29zdHJlYW08Y2hhcj4pCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURShjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBiYXNpY19vc3RyZWFtPHdjaGFyX3Q+KQorI2VuZGlmCisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX09TVFJFQU0KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9xdWV1ZSBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9xdWV1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDU0NmZkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3F1ZXVlCkBAIC0wLDAgKzEsNzM4IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcXVldWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX1FVRVVFCisjZGVmaW5lIF9MSUJDUFBfUVVFVUUKKworLyoKKyAgICBxdWV1ZSBzeW5vcHNpcworCituYW1lc3BhY2Ugc3RkCit7CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDb250YWluZXIgPSBkZXF1ZTxUPj4KK2NsYXNzIHF1ZXVlCit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBDb250YWluZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29udGFpbmVyX3R5cGU6OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29udGFpbmVyX3R5cGU6OnJlZmVyZW5jZSAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb250YWluZXJfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbnRhaW5lcl90eXBlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworCitwcm90ZWN0ZWQ6CisgICAgY29udGFpbmVyX3R5cGUgYzsKKworcHVibGljOgorICAgIHF1ZXVlKCkgPSBkZWZhdWx0OworICAgIH5xdWV1ZSgpID0gZGVmYXVsdDsKKworICAgIHF1ZXVlKGNvbnN0IHF1ZXVlJiBxKSA9IGRlZmF1bHQ7CisgICAgcXVldWUocXVldWUmJiBxKSA9IGRlZmF1bHQ7CisKKyAgICBxdWV1ZSYgb3BlcmF0b3I9KGNvbnN0IHF1ZXVlJiBxKSA9IGRlZmF1bHQ7CisgICAgcXVldWUmIG9wZXJhdG9yPShxdWV1ZSYmIHEpID0gZGVmYXVsdDsKKworICAgIGV4cGxpY2l0IHF1ZXVlKGNvbnN0IGNvbnRhaW5lcl90eXBlJiBjKTsKKyAgICBleHBsaWNpdCBxdWV1ZShjb250YWluZXJfdHlwZSYmIGMpCisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jPgorICAgICAgICBleHBsaWNpdCBxdWV1ZShjb25zdCBBbGxvYyYgYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jPgorICAgICAgICBxdWV1ZShjb25zdCBjb250YWluZXJfdHlwZSYgYywgY29uc3QgQWxsb2MmIGEpOworICAgIHRlbXBsYXRlIDxjbGFzcyBBbGxvYz4KKyAgICAgICAgcXVldWUoY29udGFpbmVyX3R5cGUmJiBjLCBjb25zdCBBbGxvYyYgYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jPgorICAgICAgICBxdWV1ZShjb25zdCBxdWV1ZSYgcSwgY29uc3QgQWxsb2MmIGEpOworICAgIHRlbXBsYXRlIDxjbGFzcyBBbGxvYz4KKyAgICAgICAgcXVldWUocXVldWUmJiBxLCBjb25zdCBBbGxvYyYgYSk7CisKKyAgICBib29sICAgICAgZW1wdHkoKSBjb25zdDsKKyAgICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0OworCisgICAgcmVmZXJlbmNlICAgICAgIGZyb250KCk7CisgICAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3Q7CisgICAgcmVmZXJlbmNlICAgICAgIGJhY2soKTsKKyAgICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0OworCisgICAgdm9pZCBwdXNoKGNvbnN0IHZhbHVlX3R5cGUmIHYpOworICAgIHZvaWQgcHVzaCh2YWx1ZV90eXBlJiYgdik7CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+IHJlZmVyZW5jZSBlbXBsYWNlKEFyZ3MmJi4uLiBhcmdzKTsgLy8gcmVmZXJlbmNlIGluIEMrKzE3CisgICAgdm9pZCBwb3AoKTsKKworICAgIHZvaWQgc3dhcChxdWV1ZSYgcSkgbm9leGNlcHQoaXNfbm90aHJvd19zd2FwcGFibGVfdjxDb250YWluZXI+KQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENvbnRhaW5lcj4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHF1ZXVlPFQsIENvbnRhaW5lcj4mIHgsY29uc3QgcXVldWU8VCwgQ29udGFpbmVyPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDb250YWluZXI+CisgIGJvb2wgb3BlcmF0b3I8IChjb25zdCBxdWV1ZTxULCBDb250YWluZXI+JiB4LGNvbnN0IHF1ZXVlPFQsIENvbnRhaW5lcj4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ29udGFpbmVyPgorICBib29sIG9wZXJhdG9yIT0oY29uc3QgcXVldWU8VCwgQ29udGFpbmVyPiYgeCxjb25zdCBxdWV1ZTxULCBDb250YWluZXI+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENvbnRhaW5lcj4KKyAgYm9vbCBvcGVyYXRvcj4gKGNvbnN0IHF1ZXVlPFQsIENvbnRhaW5lcj4mIHgsY29uc3QgcXVldWU8VCwgQ29udGFpbmVyPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDb250YWluZXI+CisgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBxdWV1ZTxULCBDb250YWluZXI+JiB4LGNvbnN0IHF1ZXVlPFQsIENvbnRhaW5lcj4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ29udGFpbmVyPgorICBib29sIG9wZXJhdG9yPD0oY29uc3QgcXVldWU8VCwgQ29udGFpbmVyPiYgeCxjb25zdCBxdWV1ZTxULCBDb250YWluZXI+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENvbnRhaW5lcj4KKyAgdm9pZCBzd2FwKHF1ZXVlPFQsIENvbnRhaW5lcj4mIHgsIHF1ZXVlPFQsIENvbnRhaW5lcj4mIHkpCisgIG5vZXhjZXB0KG5vZXhjZXB0KHguc3dhcCh5KSkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ29udGFpbmVyID0gdmVjdG9yPFQ+LAorICAgICAgICAgIGNsYXNzIENvbXBhcmUgPSBsZXNzPHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4+CitjbGFzcyBwcmlvcml0eV9xdWV1ZQoreworcHVibGljOgorICAgIHR5cGVkZWYgQ29udGFpbmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbnRhaW5lcl90eXBlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbnRhaW5lcl90eXBlOjpyZWZlcmVuY2UgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29udGFpbmVyX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb250YWluZXJfdHlwZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKworcHJvdGVjdGVkOgorICAgIGNvbnRhaW5lcl90eXBlIGM7CisgICAgQ29tcGFyZSBjb21wOworCitwdWJsaWM6CisgICAgcHJpb3JpdHlfcXVldWUoKSA9IGRlZmF1bHQ7CisgICAgfnByaW9yaXR5X3F1ZXVlKCkgPSBkZWZhdWx0OworCisgICAgcHJpb3JpdHlfcXVldWUoY29uc3QgcHJpb3JpdHlfcXVldWUmIHEpID0gZGVmYXVsdDsKKyAgICBwcmlvcml0eV9xdWV1ZShwcmlvcml0eV9xdWV1ZSYmIHEpID0gZGVmYXVsdDsKKworICAgIHByaW9yaXR5X3F1ZXVlJiBvcGVyYXRvcj0oY29uc3QgcHJpb3JpdHlfcXVldWUmIHEpID0gZGVmYXVsdDsKKyAgICBwcmlvcml0eV9xdWV1ZSYgb3BlcmF0b3I9KHByaW9yaXR5X3F1ZXVlJiYgcSkgPSBkZWZhdWx0OworCisgICAgZXhwbGljaXQgcHJpb3JpdHlfcXVldWUoY29uc3QgQ29tcGFyZSYgY29tcCk7CisgICAgcHJpb3JpdHlfcXVldWUoY29uc3QgQ29tcGFyZSYgY29tcCwgY29uc3QgY29udGFpbmVyX3R5cGUmIGMpOworICAgIGV4cGxpY2l0IHByaW9yaXR5X3F1ZXVlKGNvbnN0IENvbXBhcmUmIGNvbXAsIGNvbnRhaW5lcl90eXBlJiYgYyk7CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIHByaW9yaXR5X3F1ZXVlKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tcGFyZSYgY29tcCA9IENvbXBhcmUoKSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIHByaW9yaXR5X3F1ZXVlKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tcGFyZSYgY29tcCwgY29uc3QgY29udGFpbmVyX3R5cGUmIGMpOworICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICBwcmlvcml0eV9xdWV1ZShJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbXBhcmUmIGNvbXAsIGNvbnRhaW5lcl90eXBlJiYgYyk7CisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jPgorICAgICAgICBleHBsaWNpdCBwcmlvcml0eV9xdWV1ZShjb25zdCBBbGxvYyYgYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jPgorICAgICAgICBwcmlvcml0eV9xdWV1ZShjb25zdCBDb21wYXJlJiBjb21wLCBjb25zdCBBbGxvYyYgYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jPgorICAgICAgICBwcmlvcml0eV9xdWV1ZShjb25zdCBDb21wYXJlJiBjb21wLCBjb25zdCBjb250YWluZXJfdHlwZSYgYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxsb2MmIGEpOworICAgIHRlbXBsYXRlIDxjbGFzcyBBbGxvYz4KKyAgICAgICAgcHJpb3JpdHlfcXVldWUoY29uc3QgQ29tcGFyZSYgY29tcCwgY29udGFpbmVyX3R5cGUmJiBjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbGxvYyYgYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jPgorICAgICAgICBwcmlvcml0eV9xdWV1ZShjb25zdCBwcmlvcml0eV9xdWV1ZSYgcSwgY29uc3QgQWxsb2MmIGEpOworICAgIHRlbXBsYXRlIDxjbGFzcyBBbGxvYz4KKyAgICAgICAgcHJpb3JpdHlfcXVldWUocHJpb3JpdHlfcXVldWUmJiBxLCBjb25zdCBBbGxvYyYgYSk7CisKKyAgICBib29sICAgICAgICAgICAgZW1wdHkoKSBjb25zdDsKKyAgICBzaXplX3R5cGUgICAgICAgc2l6ZSgpIGNvbnN0OworICAgIGNvbnN0X3JlZmVyZW5jZSB0b3AoKSBjb25zdDsKKworICAgIHZvaWQgcHVzaChjb25zdCB2YWx1ZV90eXBlJiB2KTsKKyAgICB2b2lkIHB1c2godmFsdWVfdHlwZSYmIHYpOworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPiB2b2lkIGVtcGxhY2UoQXJncyYmLi4uIGFyZ3MpOworICAgIHZvaWQgcG9wKCk7CisKKyAgICB2b2lkIHN3YXAocHJpb3JpdHlfcXVldWUmIHEpCisgICAgICAgIG5vZXhjZXB0KGlzX25vdGhyb3dfc3dhcHBhYmxlX3Y8Q29udGFpbmVyPiAmJgorICAgICAgICAgICAgICAgICBpc19ub3Rocm93X3N3YXBwYWJsZV92PENvbXA+KQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENvbnRhaW5lciwgY2xhc3MgQ29tcGFyZT4KKyAgdm9pZCBzd2FwKHByaW9yaXR5X3F1ZXVlPFQsIENvbnRhaW5lciwgQ29tcGFyZT4mIHgsCisgICAgICAgICAgICBwcmlvcml0eV9xdWV1ZTxULCBDb250YWluZXIsIENvbXBhcmU+JiB5KQorICAgICAgICAgICAgbm9leGNlcHQobm9leGNlcHQoeC5zd2FwKHkpKSk7CisKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db250YWluZXIgPSBkZXF1ZTxfVHA+ID4gY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgcXVldWU7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db250YWluZXI+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj09KGNvbnN0IHF1ZXVlPF9UcCwgX0NvbnRhaW5lcj4mIF9feCxjb25zdCBxdWV1ZTxfVHAsIF9Db250YWluZXI+JiBfX3kpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29udGFpbmVyPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8IChjb25zdCBxdWV1ZTxfVHAsIF9Db250YWluZXI+JiBfX3gsY29uc3QgcXVldWU8X1RwLCBfQ29udGFpbmVyPiYgX195KTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnRhaW5lciAvKj0gZGVxdWU8X1RwPiovPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgcXVldWUKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb250YWluZXJfdHlwZTo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb250YWluZXJfdHlwZTo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbnRhaW5lcl90eXBlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29udGFpbmVyX3R5cGU6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgc3RhdGljX2Fzc2VydCgoaXNfc2FtZTxfVHAsIHZhbHVlX3R5cGU+Ojp2YWx1ZSksICIiICk7CisKK3Byb3RlY3RlZDoKKyAgICBjb250YWluZXJfdHlwZSBjOworCitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHF1ZXVlKCkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxjb250YWluZXJfdHlwZT46OnZhbHVlKQorICAgICAgICA6IGMoKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHF1ZXVlKGNvbnN0IHF1ZXVlJiBfX3EpIDogYyhfX3EuYykge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBxdWV1ZSYgb3BlcmF0b3I9KGNvbnN0IHF1ZXVlJiBfX3EpIHtjID0gX19xLmM7IHJldHVybiAqdGhpczt9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHF1ZXVlKHF1ZXVlJiYgX19xKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGNvbnRhaW5lcl90eXBlPjo6dmFsdWUpCisgICAgICAgIDogYyhfVlNURDo6bW92ZShfX3EuYykpIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcXVldWUmIG9wZXJhdG9yPShxdWV1ZSYmIF9fcSkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxjb250YWluZXJfdHlwZT46OnZhbHVlKQorICAgICAgICB7YyA9IF9WU1REOjptb3ZlKF9fcS5jKTsgcmV0dXJuICp0aGlzO30KKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgcXVldWUoY29uc3QgY29udGFpbmVyX3R5cGUmIF9fYykgIDogYyhfX2MpIHt9CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBxdWV1ZShjb250YWluZXJfdHlwZSYmIF9fYykgOiBjKF9WU1REOjptb3ZlKF9fYykpIHt9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZXhwbGljaXQgcXVldWUoY29uc3QgX0FsbG9jJiBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjx1c2VzX2FsbG9jYXRvcjxjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvYz46OnZhbHVlPjo6dHlwZSogPSAwKQorICAgICAgICAgICAgOiBjKF9fYSkge30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHF1ZXVlKGNvbnN0IHF1ZXVlJiBfX3EsIGNvbnN0IF9BbGxvYyYgX19hLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8dXNlc19hbGxvY2F0b3I8Y29udGFpbmVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQWxsb2M+Ojp2YWx1ZT46OnR5cGUqID0gMCkKKyAgICAgICAgICAgIDogYyhfX3EuYywgX19hKSB7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcXVldWUoY29uc3QgY29udGFpbmVyX3R5cGUmIF9fYywgY29uc3QgX0FsbG9jJiBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjx1c2VzX2FsbG9jYXRvcjxjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvYz46OnZhbHVlPjo6dHlwZSogPSAwKQorICAgICAgICAgICAgOiBjKF9fYywgX19hKSB7fQorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHF1ZXVlKGNvbnRhaW5lcl90eXBlJiYgX19jLCBjb25zdCBfQWxsb2MmIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPHVzZXNfYWxsb2NhdG9yPGNvbnRhaW5lcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FsbG9jPjo6dmFsdWU+Ojp0eXBlKiA9IDApCisgICAgICAgICAgICA6IGMoX1ZTVEQ6Om1vdmUoX19jKSwgX19hKSB7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcXVldWUocXVldWUmJiBfX3EsIGNvbnN0IF9BbGxvYyYgX19hLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8dXNlc19hbGxvY2F0b3I8Y29udGFpbmVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQWxsb2M+Ojp2YWx1ZT46OnR5cGUqID0gMCkKKyAgICAgICAgICAgIDogYyhfVlNURDo6bW92ZShfX3EuYyksIF9fYSkge30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIF9MSUJDUFBfTk9ESVNDQVJEX0FGVEVSX0NYWDE3IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sICAgICAgZW1wdHkoKSBjb25zdCB7cmV0dXJuIGMuZW1wdHkoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgIHtyZXR1cm4gYy5zaXplKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlZmVyZW5jZSAgICAgICBmcm9udCgpICAgICAgIHtyZXR1cm4gYy5mcm9udCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3Qge3JldHVybiBjLmZyb250KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZWZlcmVuY2UgICAgICAgYmFjaygpICAgICAgICB7cmV0dXJuIGMuYmFjaygpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCAge3JldHVybiBjLmJhY2soKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBwdXNoKGNvbnN0IHZhbHVlX3R5cGUmIF9fdikge2MucHVzaF9iYWNrKF9fdik7fQorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBwdXNoKHZhbHVlX3R5cGUmJiBfX3YpICAgICAge2MucHVzaF9iYWNrKF9WU1REOjptb3ZlKF9fdikpO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAorICAgICAgICBkZWNsdHlwZShhdXRvKSBlbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICAgICAgeyByZXR1cm4gYy5lbXBsYWNlX2JhY2soX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pO30KKyNlbHNlCisgICAgICAgIHZvaWQgICAgIGVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgICAgICB7ICAgICAgICBjLmVtcGxhY2VfYmFjayhfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7fQorI2VuZGlmCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHBvcCgpIHtjLnBvcF9mcm9udCgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAocXVldWUmIF9fcSkKKyAgICAgICAgX05PRVhDRVBUXyhfX2lzX25vdGhyb3dfc3dhcHBhYmxlPGNvbnRhaW5lcl90eXBlPjo6dmFsdWUpCisgICAgeworICAgICAgICB1c2luZyBfVlNURDo6c3dhcDsKKyAgICAgICAgc3dhcChjLCBfX3EuYyk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX0MxPgorICAgIGZyaWVuZAorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBxdWV1ZTxfVDEsIF9DMT4mIF9feCxjb25zdCBxdWV1ZTxfVDEsIF9DMT4mIF9feSk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfQzE+CisgICAgZnJpZW5kCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wKKyAgICBvcGVyYXRvcjwgKGNvbnN0IHF1ZXVlPF9UMSwgX0MxPiYgX194LGNvbnN0IHF1ZXVlPF9UMSwgX0MxPiYgX195KTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBxdWV1ZTxfVHAsIF9Db250YWluZXI+JiBfX3gsY29uc3QgcXVldWU8X1RwLCBfQ29udGFpbmVyPiYgX195KQoreworICAgIHJldHVybiBfX3guYyA9PSBfX3kuYzsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnRhaW5lcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjwgKGNvbnN0IHF1ZXVlPF9UcCwgX0NvbnRhaW5lcj4mIF9feCxjb25zdCBxdWV1ZTxfVHAsIF9Db250YWluZXI+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5jIDwgX195LmM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBxdWV1ZTxfVHAsIF9Db250YWluZXI+JiBfX3gsY29uc3QgcXVldWU8X1RwLCBfQ29udGFpbmVyPiYgX195KQoreworICAgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29udGFpbmVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPiAoY29uc3QgcXVldWU8X1RwLCBfQ29udGFpbmVyPiYgX194LGNvbnN0IHF1ZXVlPF9UcCwgX0NvbnRhaW5lcj4mIF9feSkKK3sKKyAgICByZXR1cm4gX195IDwgX194OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29udGFpbmVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPj0oY29uc3QgcXVldWU8X1RwLCBfQ29udGFpbmVyPiYgX194LGNvbnN0IHF1ZXVlPF9UcCwgX0NvbnRhaW5lcj4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPCBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29udGFpbmVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPD0oY29uc3QgcXVldWU8X1RwLCBfQ29udGFpbmVyPiYgX194LGNvbnN0IHF1ZXVlPF9UcCwgX0NvbnRhaW5lcj4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3kgPCBfX3gpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29udGFpbmVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZjwKKyAgICBfX2lzX3N3YXBwYWJsZTxfQ29udGFpbmVyPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQorc3dhcChxdWV1ZTxfVHAsIF9Db250YWluZXI+JiBfX3gsIHF1ZXVlPF9UcCwgX0NvbnRhaW5lcj4mIF9feSkKKyAgICBfTk9FWENFUFRfKF9OT0VYQ0VQVF8oX194LnN3YXAoX195KSkpCit7CisgICAgX194LnN3YXAoX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHVzZXNfYWxsb2NhdG9yPHF1ZXVlPF9UcCwgX0NvbnRhaW5lcj4sIF9BbGxvYz4KKyAgICA6IHB1YmxpYyB1c2VzX2FsbG9jYXRvcjxfQ29udGFpbmVyLCBfQWxsb2M+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29udGFpbmVyID0gdmVjdG9yPF9UcD4sCisgICAgICAgICAgY2xhc3MgX0NvbXBhcmUgPSBsZXNzPHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGU+ID4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHByaW9yaXR5X3F1ZXVlCit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICAgIHR5cGVkZWYgX0NvbXBhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9jb21wYXJlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29udGFpbmVyX3R5cGU6OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29udGFpbmVyX3R5cGU6OnJlZmVyZW5jZSAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb250YWluZXJfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbnRhaW5lcl90eXBlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgIHN0YXRpY19hc3NlcnQoKGlzX3NhbWU8X1RwLCB2YWx1ZV90eXBlPjo6dmFsdWUpLCAiIiApOworCitwcm90ZWN0ZWQ6CisgICAgY29udGFpbmVyX3R5cGUgYzsKKyAgICB2YWx1ZV9jb21wYXJlIGNvbXA7CisKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcHJpb3JpdHlfcXVldWUoKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGNvbnRhaW5lcl90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICBpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTx2YWx1ZV9jb21wYXJlPjo6dmFsdWUpCisgICAgICAgIDogYygpLCBjb21wKCkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwcmlvcml0eV9xdWV1ZShjb25zdCBwcmlvcml0eV9xdWV1ZSYgX19xKSA6IGMoX19xLmMpLCBjb21wKF9fcS5jb21wKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHByaW9yaXR5X3F1ZXVlJiBvcGVyYXRvcj0oY29uc3QgcHJpb3JpdHlfcXVldWUmIF9fcSkKKyAgICAgICAge2MgPSBfX3EuYzsgY29tcCA9IF9fcS5jb21wOyByZXR1cm4gKnRoaXM7fQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwcmlvcml0eV9xdWV1ZShwcmlvcml0eV9xdWV1ZSYmIF9fcSkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxjb250YWluZXJfdHlwZT46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8dmFsdWVfY29tcGFyZT46OnZhbHVlKQorICAgICAgICA6IGMoX1ZTVEQ6Om1vdmUoX19xLmMpKSwgY29tcChfVlNURDo6bW92ZShfX3EuY29tcCkpIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcHJpb3JpdHlfcXVldWUmIG9wZXJhdG9yPShwcmlvcml0eV9xdWV1ZSYmIF9fcSkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxjb250YWluZXJfdHlwZT46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8dmFsdWVfY29tcGFyZT46OnZhbHVlKQorICAgICAgICB7YyA9IF9WU1REOjptb3ZlKF9fcS5jKTsgY29tcCA9IF9WU1REOjptb3ZlKF9fcS5jb21wKTsgcmV0dXJuICp0aGlzO30KKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgcHJpb3JpdHlfcXVldWUoY29uc3QgdmFsdWVfY29tcGFyZSYgX19jb21wKQorICAgICAgICA6IGMoKSwgY29tcChfX2NvbXApIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHByaW9yaXR5X3F1ZXVlKGNvbnN0IHZhbHVlX2NvbXBhcmUmIF9fY29tcCwgY29uc3QgY29udGFpbmVyX3R5cGUmIF9fYyk7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBwcmlvcml0eV9xdWV1ZShjb25zdCB2YWx1ZV9jb21wYXJlJiBfX2NvbXAsIGNvbnRhaW5lcl90eXBlJiYgX19jKTsKKyNlbmRpZgorICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHByaW9yaXR5X3F1ZXVlKF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfY29tcGFyZSYgX19jb21wID0gdmFsdWVfY29tcGFyZSgpKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBwcmlvcml0eV9xdWV1ZShfSW5wdXRJdGVyIF9fZiwgX0lucHV0SXRlciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX2NvbXBhcmUmIF9fY29tcCwgY29uc3QgY29udGFpbmVyX3R5cGUmIF9fYyk7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHByaW9yaXR5X3F1ZXVlKF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfY29tcGFyZSYgX19jb21wLCBjb250YWluZXJfdHlwZSYmIF9fYyk7CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZXhwbGljaXQgcHJpb3JpdHlfcXVldWUoY29uc3QgX0FsbG9jJiBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjx1c2VzX2FsbG9jYXRvcjxjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvYz46OnZhbHVlPjo6dHlwZSogPSAwKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHByaW9yaXR5X3F1ZXVlKGNvbnN0IHZhbHVlX2NvbXBhcmUmIF9fY29tcCwgY29uc3QgX0FsbG9jJiBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjx1c2VzX2FsbG9jYXRvcjxjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvYz46OnZhbHVlPjo6dHlwZSogPSAwKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHByaW9yaXR5X3F1ZXVlKGNvbnN0IHZhbHVlX2NvbXBhcmUmIF9fY29tcCwgY29uc3QgY29udGFpbmVyX3R5cGUmIF9fYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0FsbG9jJiBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjx1c2VzX2FsbG9jYXRvcjxjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvYz46OnZhbHVlPjo6dHlwZSogPSAwKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHByaW9yaXR5X3F1ZXVlKGNvbnN0IHByaW9yaXR5X3F1ZXVlJiBfX3EsIGNvbnN0IF9BbGxvYyYgX19hLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8dXNlc19hbGxvY2F0b3I8Y29udGFpbmVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQWxsb2M+Ojp2YWx1ZT46OnR5cGUqID0gMCk7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcHJpb3JpdHlfcXVldWUoY29uc3QgdmFsdWVfY29tcGFyZSYgX19jb21wLCBjb250YWluZXJfdHlwZSYmIF9fYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0FsbG9jJiBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjx1c2VzX2FsbG9jYXRvcjxjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvYz46OnZhbHVlPjo6dHlwZSogPSAwKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHByaW9yaXR5X3F1ZXVlKHByaW9yaXR5X3F1ZXVlJiYgX19xLCBjb25zdCBfQWxsb2MmIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPHVzZXNfYWxsb2NhdG9yPGNvbnRhaW5lcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FsbG9jPjo6dmFsdWU+Ojp0eXBlKiA9IDApOworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIF9MSUJDUFBfTk9ESVNDQVJEX0FGVEVSX0NYWDE3IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sICAgICAgICAgICAgZW1wdHkoKSBjb25zdCB7cmV0dXJuIGMuZW1wdHkoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSAgICAgICBzaXplKCkgY29uc3QgIHtyZXR1cm4gYy5zaXplKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9yZWZlcmVuY2UgdG9wKCkgY29uc3QgICB7cmV0dXJuIGMuZnJvbnQoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBwdXNoKGNvbnN0IHZhbHVlX3R5cGUmIF9fdik7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHB1c2godmFsdWVfdHlwZSYmIF9fdik7CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpOworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBwb3AoKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAocHJpb3JpdHlfcXVldWUmIF9fcSkKKyAgICAgICAgX05PRVhDRVBUXyhfX2lzX25vdGhyb3dfc3dhcHBhYmxlPGNvbnRhaW5lcl90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPHZhbHVlX2NvbXBhcmU+Ojp2YWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29udGFpbmVyLCBjbGFzcyBfQ29tcGFyZT4KK2lubGluZQorcHJpb3JpdHlfcXVldWU8X1RwLCBfQ29udGFpbmVyLCBfQ29tcGFyZT46OnByaW9yaXR5X3F1ZXVlKGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyX3R5cGUmIF9fYykKKyAgICA6IGMoX19jKSwKKyAgICAgIGNvbXAoX19jb21wKQoreworICAgIF9WU1REOjptYWtlX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUKK3ByaW9yaXR5X3F1ZXVlPF9UcCwgX0NvbnRhaW5lciwgX0NvbXBhcmU+Ojpwcmlvcml0eV9xdWV1ZShjb25zdCB2YWx1ZV9jb21wYXJlJiBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGUmJiBfX2MpCisgICAgOiBjKF9WU1REOjptb3ZlKF9fYykpLAorICAgICAgY29tcChfX2NvbXApCit7CisgICAgX1ZTVEQ6Om1ha2VfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29udGFpbmVyLCBjbGFzcyBfQ29tcGFyZT4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgoraW5saW5lCitwcmlvcml0eV9xdWV1ZTxfVHAsIF9Db250YWluZXIsIF9Db21wYXJlPjo6cHJpb3JpdHlfcXVldWUoX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX2NvbXBhcmUmIF9fY29tcCkKKyAgICA6IGMoX19mLCBfX2wpLAorICAgICAgY29tcChfX2NvbXApCit7CisgICAgX1ZTVEQ6Om1ha2VfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29udGFpbmVyLCBjbGFzcyBfQ29tcGFyZT4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgoraW5saW5lCitwcmlvcml0eV9xdWV1ZTxfVHAsIF9Db250YWluZXIsIF9Db21wYXJlPjo6cHJpb3JpdHlfcXVldWUoX0lucHV0SXRlciBfX2YsIF9JbnB1dEl0ZXIgX19sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX2NvbXBhcmUmIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJfdHlwZSYgX19jKQorICAgIDogYyhfX2MpLAorICAgICAgY29tcChfX2NvbXApCit7CisgICAgYy5pbnNlcnQoYy5lbmQoKSwgX19mLCBfX2wpOworICAgIF9WU1REOjptYWtlX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX0NvbXBhcmU+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4KK2lubGluZQorcHJpb3JpdHlfcXVldWU8X1RwLCBfQ29udGFpbmVyLCBfQ29tcGFyZT46OnByaW9yaXR5X3F1ZXVlKF9JbnB1dEl0ZXIgX19mLCBfSW5wdXRJdGVyIF9fbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV9jb21wYXJlJiBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGUmJiBfX2MpCisgICAgOiBjKF9WU1REOjptb3ZlKF9fYykpLAorICAgICAgY29tcChfX2NvbXApCit7CisgICAgYy5pbnNlcnQoYy5lbmQoKSwgX19mLCBfX2wpOworICAgIF9WU1REOjptYWtlX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX0NvbXBhcmU+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgoraW5saW5lCitwcmlvcml0eV9xdWV1ZTxfVHAsIF9Db250YWluZXIsIF9Db21wYXJlPjo6cHJpb3JpdHlfcXVldWUoY29uc3QgX0FsbG9jJiBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjx1c2VzX2FsbG9jYXRvcjxjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvYz46OnZhbHVlPjo6dHlwZSopCisgICAgOiBjKF9fYSkKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX0NvbXBhcmU+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgoraW5saW5lCitwcmlvcml0eV9xdWV1ZTxfVHAsIF9Db250YWluZXIsIF9Db21wYXJlPjo6cHJpb3JpdHlfcXVldWUoY29uc3QgdmFsdWVfY29tcGFyZSYgX19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9BbGxvYyYgX19hLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8dXNlc19hbGxvY2F0b3I8Y29udGFpbmVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQWxsb2M+Ojp2YWx1ZT46OnR5cGUqKQorICAgIDogYyhfX2EpLAorICAgICAgY29tcChfX2NvbXApCit7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db250YWluZXIsIGNsYXNzIF9Db21wYXJlPgordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK2lubGluZQorcHJpb3JpdHlfcXVldWU8X1RwLCBfQ29udGFpbmVyLCBfQ29tcGFyZT46OnByaW9yaXR5X3F1ZXVlKGNvbnN0IHZhbHVlX2NvbXBhcmUmIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJfdHlwZSYgX19jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9BbGxvYyYgX19hLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8dXNlc19hbGxvY2F0b3I8Y29udGFpbmVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQWxsb2M+Ojp2YWx1ZT46OnR5cGUqKQorICAgIDogYyhfX2MsIF9fYSksCisgICAgICBjb21wKF9fY29tcCkKK3sKKyAgICBfVlNURDo6bWFrZV9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db250YWluZXIsIGNsYXNzIF9Db21wYXJlPgordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK2lubGluZQorcHJpb3JpdHlfcXVldWU8X1RwLCBfQ29udGFpbmVyLCBfQ29tcGFyZT46OnByaW9yaXR5X3F1ZXVlKGNvbnN0IHByaW9yaXR5X3F1ZXVlJiBfX3EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0FsbG9jJiBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjx1c2VzX2FsbG9jYXRvcjxjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvYz46OnZhbHVlPjo6dHlwZSopCisgICAgOiBjKF9fcS5jLCBfX2EpLAorICAgICAgY29tcChfX3EuY29tcCkKK3sKKyAgICBfVlNURDo6bWFrZV9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db250YWluZXIsIGNsYXNzIF9Db21wYXJlPgordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK2lubGluZQorcHJpb3JpdHlfcXVldWU8X1RwLCBfQ29udGFpbmVyLCBfQ29tcGFyZT46OnByaW9yaXR5X3F1ZXVlKGNvbnN0IHZhbHVlX2NvbXBhcmUmIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfdHlwZSYmIF9fYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfQWxsb2MmIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPHVzZXNfYWxsb2NhdG9yPGNvbnRhaW5lcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FsbG9jPjo6dmFsdWU+Ojp0eXBlKikKKyAgICA6IGMoX1ZTVEQ6Om1vdmUoX19jKSwgX19hKSwKKyAgICAgIGNvbXAoX19jb21wKQoreworICAgIF9WU1REOjptYWtlX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX0NvbXBhcmU+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgoraW5saW5lCitwcmlvcml0eV9xdWV1ZTxfVHAsIF9Db250YWluZXIsIF9Db21wYXJlPjo6cHJpb3JpdHlfcXVldWUocHJpb3JpdHlfcXVldWUmJiBfX3EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0FsbG9jJiBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjx1c2VzX2FsbG9jYXRvcjxjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvYz46OnZhbHVlPjo6dHlwZSopCisgICAgOiBjKF9WU1REOjptb3ZlKF9fcS5jKSwgX19hKSwKKyAgICAgIGNvbXAoX1ZTVEQ6Om1vdmUoX19xLmNvbXApKQoreworICAgIF9WU1REOjptYWtlX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUKK3ZvaWQKK3ByaW9yaXR5X3F1ZXVlPF9UcCwgX0NvbnRhaW5lciwgX0NvbXBhcmU+OjpwdXNoKGNvbnN0IHZhbHVlX3R5cGUmIF9fdikKK3sKKyAgICBjLnB1c2hfYmFjayhfX3YpOworICAgIF9WU1REOjpwdXNoX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUKK3ZvaWQKK3ByaW9yaXR5X3F1ZXVlPF9UcCwgX0NvbnRhaW5lciwgX0NvbXBhcmU+OjpwdXNoKHZhbHVlX3R5cGUmJiBfX3YpCit7CisgICAgYy5wdXNoX2JhY2soX1ZTVEQ6Om1vdmUoX192KSk7CisgICAgX1ZTVEQ6OnB1c2hfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29udGFpbmVyLCBjbGFzcyBfQ29tcGFyZT4KK3RlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KK2lubGluZQordm9pZAorcHJpb3JpdHlfcXVldWU8X1RwLCBfQ29udGFpbmVyLCBfQ29tcGFyZT46OmVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCit7CisgICAgYy5lbXBsYWNlX2JhY2soX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIF9WU1REOjpwdXNoX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUKK3ZvaWQKK3ByaW9yaXR5X3F1ZXVlPF9UcCwgX0NvbnRhaW5lciwgX0NvbXBhcmU+Ojpwb3AoKQoreworICAgIF9WU1REOjpwb3BfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOworICAgIGMucG9wX2JhY2soKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX0NvbXBhcmU+CitpbmxpbmUKK3ZvaWQKK3ByaW9yaXR5X3F1ZXVlPF9UcCwgX0NvbnRhaW5lciwgX0NvbXBhcmU+Ojpzd2FwKHByaW9yaXR5X3F1ZXVlJiBfX3EpCisgICAgICAgIF9OT0VYQ0VQVF8oX19pc19ub3Rocm93X3N3YXBwYWJsZTxjb250YWluZXJfdHlwZT46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgX19pc19ub3Rocm93X3N3YXBwYWJsZTx2YWx1ZV9jb21wYXJlPjo6dmFsdWUpCit7CisgICAgdXNpbmcgX1ZTVEQ6OnN3YXA7CisgICAgc3dhcChjLCBfX3EuYyk7CisgICAgc3dhcChjb21wLCBfX3EuY29tcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db250YWluZXIsIGNsYXNzIF9Db21wYXJlPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZjwKKyAgICBfX2lzX3N3YXBwYWJsZTxfQ29udGFpbmVyPjo6dmFsdWUKKyAgICAmJiBfX2lzX3N3YXBwYWJsZTxfQ29tcGFyZT46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3N3YXAocHJpb3JpdHlfcXVldWU8X1RwLCBfQ29udGFpbmVyLCBfQ29tcGFyZT4mIF9feCwKKyAgICAgcHJpb3JpdHlfcXVldWU8X1RwLCBfQ29udGFpbmVyLCBfQ29tcGFyZT4mIF9feSkKKyAgICBfTk9FWENFUFRfKF9OT0VYQ0VQVF8oX194LnN3YXAoX195KSkpCit7CisgICAgX194LnN3YXAoX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnRhaW5lciwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB1c2VzX2FsbG9jYXRvcjxwcmlvcml0eV9xdWV1ZTxfVHAsIF9Db250YWluZXIsIF9Db21wYXJlPiwgX0FsbG9jPgorICAgIDogcHVibGljIHVzZXNfYWxsb2NhdG9yPF9Db250YWluZXIsIF9BbGxvYz4KK3sKK307CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX1FVRVVFCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvcmFuZG9tIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3JhbmRvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTY2NGE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3JhbmRvbQpAQCAtMCwwICsxLDY3NDQgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByYW5kb20gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfUkFORE9NCisjZGVmaW5lIF9MSUJDUFBfUkFORE9NCisKKy8qCisgICAgcmFuZG9tIHN5bm9wc2lzCisKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorCituYW1lc3BhY2Ugc3RkCit7CisKKy8vIEVuZ2luZXMKKwordGVtcGxhdGUgPGNsYXNzIFVJbnRUeXBlLCBVSW50VHlwZSBhLCBVSW50VHlwZSBjLCBVSW50VHlwZSBtPgorY2xhc3MgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmUKK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgVUludFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICAvLyBlbmdpbmUgY2hhcmFjdGVyaXN0aWNzCisgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSBtdWx0aXBsaWVyID0gYTsKKyAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIGluY3JlbWVudCA9IGM7CisgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSBtb2R1bHVzID0gbTsKKyAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIG1pbigpIHsgcmV0dXJuIGMgPT0gMHUgPyAxdTogMHU7fQorICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgbWF4KCkgeyByZXR1cm4gbSAtIDF1O30KKyAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIGRlZmF1bHRfc2VlZCA9IDF1OworCisgICAgLy8gY29uc3RydWN0b3JzIGFuZCBzZWVkaW5nIGZ1bmN0aW9ucworICAgIGV4cGxpY2l0IGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lKHJlc3VsdF90eXBlIHMgPSBkZWZhdWx0X3NlZWQpOworICAgIHRlbXBsYXRlPGNsYXNzIFNzZXE+IGV4cGxpY2l0IGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lKFNzZXEmIHEpOworICAgIHZvaWQgc2VlZChyZXN1bHRfdHlwZSBzID0gZGVmYXVsdF9zZWVkKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBTc2VxPiB2b2lkIHNlZWQoU3NlcSYgcSk7CisKKyAgICAvLyBnZW5lcmF0aW5nIGZ1bmN0aW9ucworICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoKTsKKyAgICB2b2lkIGRpc2NhcmQodW5zaWduZWQgbG9uZyBsb25nIHopOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFVJbnRUeXBlLCBVSW50VHlwZSBhLCBVSW50VHlwZSBjLCBVSW50VHlwZSBtPgorYm9vbAorb3BlcmF0b3I9PShjb25zdCBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxVSW50VHlwZSwgYSwgYywgbT4mIHgsCisgICAgICAgICAgIGNvbnN0IGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPFVJbnRUeXBlLCBhLCBjLCBtPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBVSW50VHlwZSwgVUludFR5cGUgYSwgVUludFR5cGUgYywgVUludFR5cGUgbT4KK2Jvb2wKK29wZXJhdG9yIT0oY29uc3QgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8VUludFR5cGUsIGEsIGMsIG0+JiB4LAorICAgICAgICAgICBjb25zdCBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxVSW50VHlwZSwgYSwgYywgbT4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywKKyAgICAgICAgICBjbGFzcyBVSW50VHlwZSwgVUludFR5cGUgYSwgVUludFR5cGUgYywgVUludFR5cGUgbT4KK2Jhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mIG9zLAorICAgICAgICAgICBjb25zdCBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxVSW50VHlwZSwgYSwgYywgbT4mIHgpOworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywKKyAgICAgICAgICBjbGFzcyBVSW50VHlwZSwgVUludFR5cGUgYSwgVUludFR5cGUgYywgVUludFR5cGUgbT4KK2Jhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mIGlzLAorICAgICAgICAgICBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxVSW50VHlwZSwgYSwgYywgbT4mIHgpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVUludFR5cGUsIHNpemVfdCB3LCBzaXplX3Qgbiwgc2l6ZV90IG0sIHNpemVfdCByLAorICAgICAgICAgIFVJbnRUeXBlIGEsIHNpemVfdCB1LCBVSW50VHlwZSBkLCBzaXplX3QgcywKKyAgICAgICAgICBVSW50VHlwZSBiLCBzaXplX3QgdCwgVUludFR5cGUgYywgc2l6ZV90IGwsIFVJbnRUeXBlIGY+CitjbGFzcyBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZQoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBVSW50VHlwZSByZXN1bHRfdHlwZTsKKworICAgIC8vIGVuZ2luZSBjaGFyYWN0ZXJpc3RpY3MKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCB3b3JkX3NpemUgPSB3OworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IHN0YXRlX3NpemUgPSBuOworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IHNoaWZ0X3NpemUgPSBtOworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IG1hc2tfYml0cyA9IHI7CisgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSB4b3JfbWFzayA9IGE7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgdGVtcGVyaW5nX3UgPSB1OworICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgdGVtcGVyaW5nX2QgPSBkOworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IHRlbXBlcmluZ19zID0gczsKKyAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIHRlbXBlcmluZ19iID0gYjsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCB0ZW1wZXJpbmdfdCA9IHQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSB0ZW1wZXJpbmdfYyA9IGM7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgdGVtcGVyaW5nX2wgPSBsOworICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgaW5pdGlhbGl6YXRpb25fbXVsdGlwbGllciA9IGY7CisgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSBtaW4gKCkgeyByZXR1cm4gMDsgfQorICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgbWF4KCkgeyByZXR1cm4gMl53IC0gMTsgfQorICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgZGVmYXVsdF9zZWVkID0gNTQ4OXU7CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIHNlZWRpbmcgZnVuY3Rpb25zCisgICAgZXhwbGljaXQgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUocmVzdWx0X3R5cGUgdmFsdWUgPSBkZWZhdWx0X3NlZWQpOworICAgIHRlbXBsYXRlPGNsYXNzIFNzZXE+IGV4cGxpY2l0IG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lKFNzZXEmIHEpOworICAgIHZvaWQgc2VlZChyZXN1bHRfdHlwZSB2YWx1ZSA9IGRlZmF1bHRfc2VlZCk7CisgICAgdGVtcGxhdGU8Y2xhc3MgU3NlcT4gdm9pZCBzZWVkKFNzZXEmIHEpOworCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKCk7CisgICAgdm9pZCBkaXNjYXJkKHVuc2lnbmVkIGxvbmcgbG9uZyB6KTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBVSW50VHlwZSwgc2l6ZV90IHcsIHNpemVfdCBuLCBzaXplX3QgbSwgc2l6ZV90IHIsCisgICAgICAgICAgVUludFR5cGUgYSwgc2l6ZV90IHUsIFVJbnRUeXBlIGQsIHNpemVfdCBzLAorICAgICAgICAgIFVJbnRUeXBlIGIsIHNpemVfdCB0LCBVSW50VHlwZSBjLCBzaXplX3QgbCwgVUludFR5cGUgZj4KK2Jvb2wKK29wZXJhdG9yPT0oCisgICAgY29uc3QgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8VUludFR5cGUsIHcsIG4sIG0sIHIsIGEsIHUsIGQsIHMsIGIsIHQsIGMsIGwsIGY+JiB4LAorICAgIGNvbnN0IG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPFVJbnRUeXBlLCB3LCBuLCBtLCByLCBhLCB1LCBkLCBzLCBiLCB0LCBjLCBsLCBmPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBVSW50VHlwZSwgc2l6ZV90IHcsIHNpemVfdCBuLCBzaXplX3QgbSwgc2l6ZV90IHIsCisgICAgICAgICAgVUludFR5cGUgYSwgc2l6ZV90IHUsIFVJbnRUeXBlIGQsIHNpemVfdCBzLAorICAgICAgICAgIFVJbnRUeXBlIGIsIHNpemVfdCB0LCBVSW50VHlwZSBjLCBzaXplX3QgbCwgVUludFR5cGUgZj4KK2Jvb2wKK29wZXJhdG9yIT0oCisgICAgY29uc3QgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8VUludFR5cGUsIHcsIG4sIG0sIHIsIGEsIHUsIGQsIHMsIGIsIHQsIGMsIGwsIGY+JiB4LAorICAgIGNvbnN0IG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPFVJbnRUeXBlLCB3LCBuLCBtLCByLCBhLCB1LCBkLCBzLCBiLCB0LCBjLCBsLCBmPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLAorICAgICAgICAgIGNsYXNzIFVJbnRUeXBlLCBzaXplX3Qgdywgc2l6ZV90IG4sIHNpemVfdCBtLCBzaXplX3QgciwKKyAgICAgICAgICBVSW50VHlwZSBhLCBzaXplX3QgdSwgVUludFR5cGUgZCwgc2l6ZV90IHMsCisgICAgICAgICAgVUludFR5cGUgYiwgc2l6ZV90IHQsIFVJbnRUeXBlIGMsIHNpemVfdCBsLCBVSW50VHlwZSBmPgorYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYgb3MsCisgICAgICAgICAgIGNvbnN0IG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPFVJbnRUeXBlLCB3LCBuLCBtLCByLCBhLCB1LCBkLCBzLCBiLCB0LCBjLCBsLCBmPiYgeCk7CisKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLAorICAgICAgICAgIGNsYXNzIFVJbnRUeXBlLCBzaXplX3Qgdywgc2l6ZV90IG4sIHNpemVfdCBtLCBzaXplX3QgciwKKyAgICAgICAgICBVSW50VHlwZSBhLCBzaXplX3QgdSwgVUludFR5cGUgZCwgc2l6ZV90IHMsCisgICAgICAgICAgVUludFR5cGUgYiwgc2l6ZV90IHQsIFVJbnRUeXBlIGMsIHNpemVfdCBsLCBVSW50VHlwZSBmPgorYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYgaXMsCisgICAgICAgICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPFVJbnRUeXBlLCB3LCBuLCBtLCByLCBhLCB1LCBkLCBzLCBiLCB0LCBjLCBsLCBmPiYgeCk7CisKK3RlbXBsYXRlPGNsYXNzIFVJbnRUeXBlLCBzaXplX3Qgdywgc2l6ZV90IHMsIHNpemVfdCByPgorY2xhc3Mgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUKK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgVUludFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICAvLyBlbmdpbmUgY2hhcmFjdGVyaXN0aWNzCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qgd29yZF9zaXplID0gdzsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBzaG9ydF9sYWcgPSBzOworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGxvbmdfbGFnID0gcjsKKyAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIG1pbigpIHsgcmV0dXJuIDA7IH0KKyAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIG1heCgpIHsgcmV0dXJuIG0tMTsgfQorICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgZGVmYXVsdF9zZWVkID0gMTk3ODA1MDN1OworCisgICAgLy8gY29uc3RydWN0b3JzIGFuZCBzZWVkaW5nIGZ1bmN0aW9ucworICAgIGV4cGxpY2l0IHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lKHJlc3VsdF90eXBlIHZhbHVlID0gZGVmYXVsdF9zZWVkKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBTc2VxPiBleHBsaWNpdCBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZShTc2VxJiBxKTsKKyAgICB2b2lkIHNlZWQocmVzdWx0X3R5cGUgdmFsdWUgPSBkZWZhdWx0X3NlZWQpOworICAgIHRlbXBsYXRlPGNsYXNzIFNzZXE+IHZvaWQgc2VlZChTc2VxJiBxKTsKKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSgpOworICAgIHZvaWQgZGlzY2FyZCh1bnNpZ25lZCBsb25nIGxvbmcgeik7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBVSW50VHlwZSwgc2l6ZV90IHcsIHNpemVfdCBzLCBzaXplX3Qgcj4KK2Jvb2wKK29wZXJhdG9yPT0oCisgICAgY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8VUludFR5cGUsIHcsIHMsIHI+JiB4LAorICAgIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPFVJbnRUeXBlLCB3LCBzLCByPiYgeSk7CisKK3RlbXBsYXRlPGNsYXNzIFVJbnRUeXBlLCBzaXplX3Qgdywgc2l6ZV90IHMsIHNpemVfdCByPgorYm9vbAorb3BlcmF0b3IhPSgKKyAgICBjb25zdCBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxVSW50VHlwZSwgdywgcywgcj4mIHgsCisgICAgY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8VUludFR5cGUsIHcsIHMsIHI+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsCisgICAgICAgICAgY2xhc3MgVUludFR5cGUsIHNpemVfdCB3LCBzaXplX3Qgcywgc2l6ZV90IHI+CitiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBvcywKKyAgICAgICAgICAgY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8VUludFR5cGUsIHcsIHMsIHI+JiB4KTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsCisgICAgICAgICAgY2xhc3MgVUludFR5cGUsIHNpemVfdCB3LCBzaXplX3Qgcywgc2l6ZV90IHI+CitiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBpcywKKyAgICAgICAgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8VUludFR5cGUsIHcsIHMsIHI+JiB4KTsKKwordGVtcGxhdGU8Y2xhc3MgRW5naW5lLCBzaXplX3QgcCwgc2l6ZV90IHI+CitjbGFzcyBkaXNjYXJkX2Jsb2NrX2VuZ2luZQoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiB0eXBlbmFtZSBFbmdpbmU6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworCisgICAgLy8gZW5naW5lIGNoYXJhY3RlcmlzdGljcworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGJsb2NrX3NpemUgPSBwOworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IHVzZWRfYmxvY2sgPSByOworICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgbWluKCkgeyByZXR1cm4gRW5naW5lOjptaW4oKTsgfQorICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgbWF4KCkgeyByZXR1cm4gRW5naW5lOjptYXgoKTsgfQorCisgICAgLy8gY29uc3RydWN0b3JzIGFuZCBzZWVkaW5nIGZ1bmN0aW9ucworICAgIGRpc2NhcmRfYmxvY2tfZW5naW5lKCk7CisgICAgZXhwbGljaXQgZGlzY2FyZF9ibG9ja19lbmdpbmUoY29uc3QgRW5naW5lJiBlKTsKKyAgICBleHBsaWNpdCBkaXNjYXJkX2Jsb2NrX2VuZ2luZShFbmdpbmUmJiBlKTsKKyAgICBleHBsaWNpdCBkaXNjYXJkX2Jsb2NrX2VuZ2luZShyZXN1bHRfdHlwZSBzKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBTc2VxPiBleHBsaWNpdCBkaXNjYXJkX2Jsb2NrX2VuZ2luZShTc2VxJiBxKTsKKyAgICB2b2lkIHNlZWQoKTsKKyAgICB2b2lkIHNlZWQocmVzdWx0X3R5cGUgcyk7CisgICAgdGVtcGxhdGU8Y2xhc3MgU3NlcT4gdm9pZCBzZWVkKFNzZXEmIHEpOworCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKCk7CisgICAgdm9pZCBkaXNjYXJkKHVuc2lnbmVkIGxvbmcgbG9uZyB6KTsKKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIGNvbnN0IEVuZ2luZSYgYmFzZSgpIGNvbnN0IG5vZXhjZXB0OworfTsKKwordGVtcGxhdGU8Y2xhc3MgRW5naW5lLCBzaXplX3QgcCwgc2l6ZV90IHI+Citib29sCitvcGVyYXRvcj09KAorICAgIGNvbnN0IGRpc2NhcmRfYmxvY2tfZW5naW5lPEVuZ2luZSwgcCwgcj4mIHgsCisgICAgY29uc3QgZGlzY2FyZF9ibG9ja19lbmdpbmU8RW5naW5lLCBwLCByPiYgeSk7CisKK3RlbXBsYXRlPGNsYXNzIEVuZ2luZSwgc2l6ZV90IHAsIHNpemVfdCByPgorYm9vbAorb3BlcmF0b3IhPSgKKyAgICBjb25zdCBkaXNjYXJkX2Jsb2NrX2VuZ2luZTxFbmdpbmUsIHAsIHI+JiB4LAorICAgIGNvbnN0IGRpc2NhcmRfYmxvY2tfZW5naW5lPEVuZ2luZSwgcCwgcj4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywKKyAgICAgICAgICBjbGFzcyBFbmdpbmUsIHNpemVfdCBwLCBzaXplX3Qgcj4KK2Jhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mIG9zLAorICAgICAgICAgICBjb25zdCBkaXNjYXJkX2Jsb2NrX2VuZ2luZTxFbmdpbmUsIHAsIHI+JiB4KTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsCisgICAgICAgICAgY2xhc3MgRW5naW5lLCBzaXplX3QgcCwgc2l6ZV90IHI+CitiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBpcywKKyAgICAgICAgICAgZGlzY2FyZF9ibG9ja19lbmdpbmU8RW5naW5lLCBwLCByPiYgeCk7CisKK3RlbXBsYXRlPGNsYXNzIEVuZ2luZSwgc2l6ZV90IHcsIGNsYXNzIFVJbnRUeXBlPgorY2xhc3MgaW5kZXBlbmRlbnRfYml0c19lbmdpbmUKK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgVUludFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICAvLyBlbmdpbmUgY2hhcmFjdGVyaXN0aWNzCisgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSBtaW4oKSB7IHJldHVybiAwOyB9CisgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSBtYXgoKSB7IHJldHVybiAyXncgLSAxOyB9CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIHNlZWRpbmcgZnVuY3Rpb25zCisgICAgaW5kZXBlbmRlbnRfYml0c19lbmdpbmUoKTsKKyAgICBleHBsaWNpdCBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZShjb25zdCBFbmdpbmUmIGUpOworICAgIGV4cGxpY2l0IGluZGVwZW5kZW50X2JpdHNfZW5naW5lKEVuZ2luZSYmIGUpOworICAgIGV4cGxpY2l0IGluZGVwZW5kZW50X2JpdHNfZW5naW5lKHJlc3VsdF90eXBlIHMpOworICAgIHRlbXBsYXRlPGNsYXNzIFNzZXE+IGV4cGxpY2l0IGluZGVwZW5kZW50X2JpdHNfZW5naW5lKFNzZXEmIHEpOworICAgIHZvaWQgc2VlZCgpOworICAgIHZvaWQgc2VlZChyZXN1bHRfdHlwZSBzKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBTc2VxPiB2b2lkIHNlZWQoU3NlcSYgcSk7CisKKyAgICAvLyBnZW5lcmF0aW5nIGZ1bmN0aW9ucworICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoKTsgdm9pZCBkaXNjYXJkKHVuc2lnbmVkIGxvbmcgbG9uZyB6KTsKKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIGNvbnN0IEVuZ2luZSYgYmFzZSgpIGNvbnN0IG5vZXhjZXB0OworfTsKKwordGVtcGxhdGU8Y2xhc3MgRW5naW5lLCBzaXplX3QgdywgY2xhc3MgVUludFR5cGU+Citib29sCitvcGVyYXRvcj09KAorICAgIGNvbnN0IGluZGVwZW5kZW50X2JpdHNfZW5naW5lPEVuZ2luZSwgdywgVUludFR5cGU+JiB4LAorICAgIGNvbnN0IGluZGVwZW5kZW50X2JpdHNfZW5naW5lPEVuZ2luZSwgdywgVUludFR5cGU+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgRW5naW5lLCBzaXplX3QgdywgY2xhc3MgVUludFR5cGU+Citib29sCitvcGVyYXRvciE9KAorICAgIGNvbnN0IGluZGVwZW5kZW50X2JpdHNfZW5naW5lPEVuZ2luZSwgdywgVUludFR5cGU+JiB4LAorICAgIGNvbnN0IGluZGVwZW5kZW50X2JpdHNfZW5naW5lPEVuZ2luZSwgdywgVUludFR5cGU+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsCisgICAgICAgICAgY2xhc3MgRW5naW5lLCBzaXplX3QgdywgY2xhc3MgVUludFR5cGU+CitiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBvcywKKyAgICAgICAgICAgY29uc3QgaW5kZXBlbmRlbnRfYml0c19lbmdpbmU8RW5naW5lLCB3LCBVSW50VHlwZT4mIHgpOworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywKKyAgICAgICAgICBjbGFzcyBFbmdpbmUsIHNpemVfdCB3LCBjbGFzcyBVSW50VHlwZT4KK2Jhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mIGlzLAorICAgICAgICAgICBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZTxFbmdpbmUsIHcsIFVJbnRUeXBlPiYgeCk7CisKK3RlbXBsYXRlPGNsYXNzIEVuZ2luZSwgc2l6ZV90IGs+CitjbGFzcyBzaHVmZmxlX29yZGVyX2VuZ2luZQoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiB0eXBlbmFtZSBFbmdpbmU6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworCisgICAgLy8gZW5naW5lIGNoYXJhY3RlcmlzdGljcworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IHRhYmxlX3NpemUgPSBrOworICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgbWluKCkgeyByZXR1cm4gRW5naW5lOjptaW47IH0KKyAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIG1heCgpIHsgcmV0dXJuIEVuZ2luZTo6bWF4OyB9CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIHNlZWRpbmcgZnVuY3Rpb25zCisgICAgc2h1ZmZsZV9vcmRlcl9lbmdpbmUoKTsKKyAgICBleHBsaWNpdCBzaHVmZmxlX29yZGVyX2VuZ2luZShjb25zdCBFbmdpbmUmIGUpOworICAgIGV4cGxpY2l0IHNodWZmbGVfb3JkZXJfZW5naW5lKEVuZ2luZSYmIGUpOworICAgIGV4cGxpY2l0IHNodWZmbGVfb3JkZXJfZW5naW5lKHJlc3VsdF90eXBlIHMpOworICAgIHRlbXBsYXRlPGNsYXNzIFNzZXE+IGV4cGxpY2l0IHNodWZmbGVfb3JkZXJfZW5naW5lKFNzZXEmIHEpOworICAgIHZvaWQgc2VlZCgpOworICAgIHZvaWQgc2VlZChyZXN1bHRfdHlwZSBzKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBTc2VxPiB2b2lkIHNlZWQoU3NlcSYgcSk7CisKKyAgICAvLyBnZW5lcmF0aW5nIGZ1bmN0aW9ucworICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoKTsKKyAgICB2b2lkIGRpc2NhcmQodW5zaWduZWQgbG9uZyBsb25nIHopOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgY29uc3QgRW5naW5lJiBiYXNlKCkgY29uc3Qgbm9leGNlcHQ7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBFbmdpbmUsIHNpemVfdCBrPgorYm9vbAorb3BlcmF0b3I9PSgKKyAgICBjb25zdCBzaHVmZmxlX29yZGVyX2VuZ2luZTxFbmdpbmUsIGs+JiB4LAorICAgIGNvbnN0IHNodWZmbGVfb3JkZXJfZW5naW5lPEVuZ2luZSwgaz4mIHkpOworCit0ZW1wbGF0ZTxjbGFzcyBFbmdpbmUsIHNpemVfdCBrPgorYm9vbAorb3BlcmF0b3IhPSgKKyAgICBjb25zdCBzaHVmZmxlX29yZGVyX2VuZ2luZTxFbmdpbmUsIGs+JiB4LAorICAgIGNvbnN0IHNodWZmbGVfb3JkZXJfZW5naW5lPEVuZ2luZSwgaz4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywKKyAgICAgICAgICBjbGFzcyBFbmdpbmUsIHNpemVfdCBrPgorYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYgb3MsCisgICAgICAgICAgIGNvbnN0IHNodWZmbGVfb3JkZXJfZW5naW5lPEVuZ2luZSwgaz4mIHgpOworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywKKyAgICAgICAgICBjbGFzcyBFbmdpbmUsIHNpemVfdCBrPgorYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYgaXMsCisgICAgICAgICAgIHNodWZmbGVfb3JkZXJfZW5naW5lPEVuZ2luZSwgaz4mIHgpOworCit0eXBlZGVmIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPHVpbnRfZmFzdDMyX3QsIDE2ODA3LCAwLCAyMTQ3NDgzNjQ3PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnN0ZF9yYW5kMDsKK3R5cGVkZWYgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8dWludF9mYXN0MzJfdCwgNDgyNzEsIDAsIDIxNDc0ODM2NDc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnN0ZF9yYW5kOwordHlwZWRlZiBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTx1aW50X2Zhc3QzMl90LCAzMiwgNjI0LCAzOTcsIDMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDk5MDhiMGRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSwgMHhmZmZmZmZmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgIDB4OWQyYzU2ODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCAweGVmYzYwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCwgMTgxMjQzMzI1Mz4gICAgICAgICAgICAgICAgICAgICAgICAgbXQxOTkzNzsKK3R5cGVkZWYgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8dWludF9mYXN0NjRfdCwgNjQsIDMxMiwgMTU2LCAzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiNTAyNmY1YWE5NjYxOWU5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSwgMHg1NTU1NTU1NTU1NTU1NTU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNywgMHg3MWQ2N2ZmZmVkYTYwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNywgMHhmZmY3ZWVlMDAwMDAwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywgNjM2NDEzNjIyMzg0Njc5MzAwNT4gICAgICAgICAgICAgbXQxOTkzN182NDsKK3R5cGVkZWYgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8dWludF9mYXN0MzJfdCwgMjQsIDEwLCAyND4gICAgIHJhbmx1eDI0X2Jhc2U7Cit0eXBlZGVmIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPHVpbnRfZmFzdDY0X3QsIDQ4LCAgNSwgMTI+ICAgICByYW5sdXg0OF9iYXNlOwordHlwZWRlZiBkaXNjYXJkX2Jsb2NrX2VuZ2luZTxyYW5sdXgyNF9iYXNlLCAyMjMsIDIzPiAgICAgICAgICAgICAgICAgICByYW5sdXgyNDsKK3R5cGVkZWYgZGlzY2FyZF9ibG9ja19lbmdpbmU8cmFubHV4NDhfYmFzZSwgMzg5LCAxMT4gICAgICAgICAgICAgICAgICAgcmFubHV4NDg7Cit0eXBlZGVmIHNodWZmbGVfb3JkZXJfZW5naW5lPG1pbnN0ZF9yYW5kMCwgMjU2PiAgICAgICAgICAgICAgICAgICAgICAgICBrbnV0aF9iOwordHlwZWRlZiBtaW5zdGRfcmFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfcmFuZG9tX2VuZ2luZTsKKworLy8gR2VuZXJhdG9ycworCitjbGFzcyByYW5kb21fZGV2aWNlCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGludCByZXN1bHRfdHlwZTsKKworICAgIC8vIGdlbmVyYXRvciBjaGFyYWN0ZXJpc3RpY3MKKyAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIG1pbigpIHsgcmV0dXJuIG51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWluKCk7IH0KKyAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIG1heCgpIHsgcmV0dXJuIG51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgIC8vIGNvbnN0cnVjdG9ycworICAgIGV4cGxpY2l0IHJhbmRvbV9kZXZpY2UoY29uc3Qgc3RyaW5nJiB0b2tlbiA9ICIvZGV2L3VyYW5kb20iKTsKKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSgpOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgZG91YmxlIGVudHJvcHkoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIC8vIG5vIGNvcHkgZnVuY3Rpb25zCisgICAgcmFuZG9tX2RldmljZShjb25zdCByYW5kb21fZGV2aWNlJiApID0gZGVsZXRlOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHJhbmRvbV9kZXZpY2UmICkgPSBkZWxldGU7Cit9OworCisvLyBVdGlsaXRpZXMKKworY2xhc3Mgc2VlZF9zZXEKK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgdWludF9sZWFzdDMyX3QgcmVzdWx0X3R5cGU7CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMKKyAgICBzZWVkX3NlcSgpOworICAgIHRlbXBsYXRlPGNsYXNzIFQ+CisgICAgICAgIHNlZWRfc2VxKGluaXRpYWxpemVyX2xpc3Q8VD4gaWwpOworICAgIHRlbXBsYXRlPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIHNlZWRfc2VxKElucHV0SXRlcmF0b3IgYmVnaW4sIElucHV0SXRlcmF0b3IgZW5kKTsKKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgdGVtcGxhdGU8Y2xhc3MgUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgICAgIHZvaWQgZ2VuZXJhdGUoUmFuZG9tQWNjZXNzSXRlcmF0b3IgYmVnaW4sIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIGVuZCk7CisKKyAgICAvLyBwcm9wZXJ0eSBmdW5jdGlvbnMKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworICAgIHRlbXBsYXRlPGNsYXNzIE91dHB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkIHBhcmFtKE91dHB1dEl0ZXJhdG9yIGRlc3QpIGNvbnN0OworCisgICAgLy8gbm8gY29weSBmdW5jdGlvbnMKKyAgICBzZWVkX3NlcShjb25zdCBzZWVkX3NlcSYpID0gZGVsZXRlOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHNlZWRfc2VxJiApID0gZGVsZXRlOworfTsKKwordGVtcGxhdGU8Y2xhc3MgUmVhbFR5cGUsIHNpemVfdCBiaXRzLCBjbGFzcyBVUk5HPgorICAgIFJlYWxUeXBlIGdlbmVyYXRlX2Nhbm9uaWNhbChVUk5HJiBnKTsKKworLy8gRGlzdHJpYnV0aW9ucworCit0ZW1wbGF0ZTxjbGFzcyBJbnRUeXBlID0gaW50PgorY2xhc3MgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIEludFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBjbGFzcyBwYXJhbV90eXBlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiB1bmlmb3JtX2ludF9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgZXhwbGljaXQgcGFyYW1fdHlwZShJbnRUeXBlIGEgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50VHlwZSBiID0gbnVtZXJpY19saW1pdHM8SW50VHlwZT46Om1heCgpKTsKKworICAgICAgICByZXN1bHRfdHlwZSBhKCkgY29uc3Q7CisgICAgICAgIHJlc3VsdF90eXBlIGIoKSBjb25zdDsKKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIHgsIGNvbnN0IHBhcmFtX3R5cGUmIHkpOworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHBhcmFtX3R5cGUmIHgsIGNvbnN0IHBhcmFtX3R5cGUmIHkpOworICAgIH07CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIGV4cGxpY2l0IHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbihJbnRUeXBlIGEgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50VHlwZSBiID0gbnVtZXJpY19saW1pdHM8SW50VHlwZT46Om1heCgpKTsKKyAgICBleHBsaWNpdCB1bmlmb3JtX2ludF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVUk5HPiByZXN1bHRfdHlwZSBvcGVyYXRvcigpKFVSTkcmIGcpOworICAgIHRlbXBsYXRlPGNsYXNzIFVSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoVVJORyYgZywgY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICAvLyBwcm9wZXJ0eSBmdW5jdGlvbnMKKyAgICByZXN1bHRfdHlwZSBhKCkgY29uc3Q7CisgICAgcmVzdWx0X3R5cGUgYigpIGNvbnN0OworCisgICAgcGFyYW1fdHlwZSBwYXJhbSgpIGNvbnN0OworICAgIHZvaWQgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdDsKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdDsKKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uJiB5KTsKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbiYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbiYgeSk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBmcmllbmQKKyAgICBiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYgb3MsCisgICAgICAgICAgICAgICBjb25zdCB1bmlmb3JtX2ludF9kaXN0cmlidXRpb24mIHgpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgZnJpZW5kCisgICAgYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mIGlzLAorICAgICAgICAgICAgICAgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uJiB4KTsKK307CisKK3RlbXBsYXRlPGNsYXNzIFJlYWxUeXBlID0gZG91YmxlPgorY2xhc3MgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbgoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBSZWFsVHlwZSByZXN1bHRfdHlwZTsKKworICAgIGNsYXNzIHBhcmFtX3R5cGUKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgZXhwbGljaXQgcGFyYW1fdHlwZShSZWFsVHlwZSBhID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsVHlwZSBiID0gMSk7CisKKyAgICAgICAgcmVzdWx0X3R5cGUgYSgpIGNvbnN0OworICAgICAgICByZXN1bHRfdHlwZSBiKCkgY29uc3Q7CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICB9OworCisgICAgLy8gY29uc3RydWN0b3JzIGFuZCByZXNldCBmdW5jdGlvbnMKKyAgICBleHBsaWNpdCB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uKFJlYWxUeXBlIGEgPSAwLjAsIFJlYWxUeXBlIGIgPSAxLjApOworICAgIGV4cGxpY2l0IHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVUk5HPiByZXN1bHRfdHlwZSBvcGVyYXRvcigpKFVSTkcmIGcpOworICAgIHRlbXBsYXRlPGNsYXNzIFVSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoVVJORyYgZywgY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICAvLyBwcm9wZXJ0eSBmdW5jdGlvbnMKKyAgICByZXN1bHRfdHlwZSBhKCkgY29uc3Q7CisgICAgcmVzdWx0X3R5cGUgYigpIGNvbnN0OworCisgICAgcGFyYW1fdHlwZSBwYXJhbSgpIGNvbnN0OworICAgIHZvaWQgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdDsKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdDsKKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbiYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb24mIHkpOworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbiYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb24mIHkpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgZnJpZW5kCisgICAgYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mIG9zLAorICAgICAgICAgICAgICAgY29uc3QgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbiYgeCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBmcmllbmQKKyAgICBiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYgaXMsCisgICAgICAgICAgICAgICB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uJiB4KTsKK307CisKK2NsYXNzIGJlcm5vdWxsaV9kaXN0cmlidXRpb24KK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKworICAgIGNsYXNzIHBhcmFtX3R5cGUKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIGJlcm5vdWxsaV9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgZXhwbGljaXQgcGFyYW1fdHlwZShkb3VibGUgcCA9IDAuNSk7CisKKyAgICAgICAgZG91YmxlIHAoKSBjb25zdDsKKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIHgsIGNvbnN0IHBhcmFtX3R5cGUmIHkpOworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHBhcmFtX3R5cGUmIHgsIGNvbnN0IHBhcmFtX3R5cGUmIHkpOworICAgIH07CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIGV4cGxpY2l0IGJlcm5vdWxsaV9kaXN0cmlidXRpb24oZG91YmxlIHAgPSAwLjUpOworICAgIGV4cGxpY2l0IGJlcm5vdWxsaV9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVUk5HPiByZXN1bHRfdHlwZSBvcGVyYXRvcigpKFVSTkcmIGcpOworICAgIHRlbXBsYXRlPGNsYXNzIFVSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoVVJORyYgZywgY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICAvLyBwcm9wZXJ0eSBmdW5jdGlvbnMKKyAgICBkb3VibGUgcCgpIGNvbnN0OworCisgICAgcGFyYW1fdHlwZSBwYXJhbSgpIGNvbnN0OworICAgIHZvaWQgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdDsKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdDsKKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJlcm5vdWxsaV9kaXN0cmlidXRpb24mIHkpOworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJlcm5vdWxsaV9kaXN0cmlidXRpb24mIHkpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgZnJpZW5kCisgICAgYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mIG9zLAorICAgICAgICAgICAgICAgY29uc3QgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiYgeCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBmcmllbmQKKyAgICBiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYgaXMsCisgICAgICAgICAgICAgICBiZXJub3VsbGlfZGlzdHJpYnV0aW9uJiB4KTsKK307CisKK3RlbXBsYXRlPGNsYXNzIEludFR5cGUgPSBpbnQ+CitjbGFzcyBiaW5vbWlhbF9kaXN0cmlidXRpb24KK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgSW50VHlwZSByZXN1bHRfdHlwZTsKKworICAgIGNsYXNzIHBhcmFtX3R5cGUKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbiBkaXN0cmlidXRpb25fdHlwZTsKKworICAgICAgICBleHBsaWNpdCBwYXJhbV90eXBlKEludFR5cGUgdCA9IDEsIGRvdWJsZSBwID0gMC41KTsKKworICAgICAgICBJbnRUeXBlIHQoKSBjb25zdDsKKyAgICAgICAgZG91YmxlIHAoKSBjb25zdDsKKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIHgsIGNvbnN0IHBhcmFtX3R5cGUmIHkpOworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHBhcmFtX3R5cGUmIHgsIGNvbnN0IHBhcmFtX3R5cGUmIHkpOworICAgIH07CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIGV4cGxpY2l0IGJpbm9taWFsX2Rpc3RyaWJ1dGlvbihJbnRUeXBlIHQgPSAxLCBkb3VibGUgcCA9IDAuNSk7CisgICAgZXhwbGljaXQgYmlub21pYWxfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIHBhcm0pOworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgdGVtcGxhdGU8Y2xhc3MgVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShVUk5HJiBnKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVUk5HPiByZXN1bHRfdHlwZSBvcGVyYXRvcigpKFVSTkcmIGcsIGNvbnN0IHBhcmFtX3R5cGUmIHBhcm0pOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgSW50VHlwZSB0KCkgY29uc3Q7CisgICAgZG91YmxlIHAoKSBjb25zdDsKKworICAgIHBhcmFtX3R5cGUgcGFyYW0oKSBjb25zdDsKKyAgICB2b2lkIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIHBhcm0pOworCisgICAgcmVzdWx0X3R5cGUgbWluKCkgY29uc3Q7CisgICAgcmVzdWx0X3R5cGUgbWF4KCkgY29uc3Q7CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGJpbm9taWFsX2Rpc3RyaWJ1dGlvbiYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpbm9taWFsX2Rpc3RyaWJ1dGlvbiYgeSk7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBiaW5vbWlhbF9kaXN0cmlidXRpb24mIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiaW5vbWlhbF9kaXN0cmlidXRpb24mIHkpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgZnJpZW5kCisgICAgYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mIG9zLAorICAgICAgICAgICAgICAgY29uc3QgYmlub21pYWxfZGlzdHJpYnV0aW9uJiB4KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGZyaWVuZAorICAgIGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBpcywKKyAgICAgICAgICAgICAgIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbiYgeCk7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBJbnRUeXBlID0gaW50PgorY2xhc3MgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbgoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBJbnRUeXBlIHJlc3VsdF90eXBlOworCisgICAgY2xhc3MgcGFyYW1fdHlwZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHR5cGVkZWYgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbiBkaXN0cmlidXRpb25fdHlwZTsKKworICAgICAgICBleHBsaWNpdCBwYXJhbV90eXBlKGRvdWJsZSBwID0gMC41KTsKKworICAgICAgICBkb3VibGUgcCgpIGNvbnN0OworCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgeCwgY29uc3QgcGFyYW1fdHlwZSYgeSk7CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgcGFyYW1fdHlwZSYgeCwgY29uc3QgcGFyYW1fdHlwZSYgeSk7CisgICAgfTsKKworICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgcmVzZXQgZnVuY3Rpb25zCisgICAgZXhwbGljaXQgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbihkb3VibGUgcCA9IDAuNSk7CisgICAgZXhwbGljaXQgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyBnZW5lcmF0aW5nIGZ1bmN0aW9ucworICAgIHRlbXBsYXRlPGNsYXNzIFVSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoVVJORyYgZyk7CisgICAgdGVtcGxhdGU8Y2xhc3MgVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShVUk5HJiBnLCBjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIGRvdWJsZSBwKCkgY29uc3Q7CisKKyAgICBwYXJhbV90eXBlIHBhcmFtKCkgY29uc3Q7CisgICAgdm9pZCBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKworICAgIHJlc3VsdF90eXBlIG1pbigpIGNvbnN0OworICAgIHJlc3VsdF90eXBlIG1heCgpIGNvbnN0OworCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbiYgeSk7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbiYgeSk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBmcmllbmQKKyAgICBiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYgb3MsCisgICAgICAgICAgICAgICBjb25zdCBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uJiB4KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGZyaWVuZAorICAgIGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBpcywKKyAgICAgICAgICAgICAgIGdlb21ldHJpY19kaXN0cmlidXRpb24mIHgpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgSW50VHlwZSA9IGludD4KK2NsYXNzIG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbgoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBJbnRUeXBlIHJlc3VsdF90eXBlOworCisgICAgY2xhc3MgcGFyYW1fdHlwZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHR5cGVkZWYgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uIGRpc3RyaWJ1dGlvbl90eXBlOworCisgICAgICAgIGV4cGxpY2l0IHBhcmFtX3R5cGUocmVzdWx0X3R5cGUgayA9IDEsIGRvdWJsZSBwID0gMC41KTsKKworICAgICAgICByZXN1bHRfdHlwZSBrKCkgY29uc3Q7CisgICAgICAgIGRvdWJsZSBwKCkgY29uc3Q7CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICB9OworCisgICAgLy8gY29uc3RydWN0b3IgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIGV4cGxpY2l0IG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbihyZXN1bHRfdHlwZSBrID0gMSwgZG91YmxlIHAgPSAwLjUpOworICAgIGV4cGxpY2l0IG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyBnZW5lcmF0aW5nIGZ1bmN0aW9ucworICAgIHRlbXBsYXRlPGNsYXNzIFVSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoVVJORyYgZyk7CisgICAgdGVtcGxhdGU8Y2xhc3MgVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShVUk5HJiBnLCBjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIHJlc3VsdF90eXBlIGsoKSBjb25zdDsKKyAgICBkb3VibGUgcCgpIGNvbnN0OworCisgICAgcGFyYW1fdHlwZSBwYXJhbSgpIGNvbnN0OworICAgIHZvaWQgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdDsKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdDsKKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uJiB5KTsKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbiYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbiYgeSk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBmcmllbmQKKyAgICBiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYgb3MsCisgICAgICAgICAgICAgICBjb25zdCBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb24mIHgpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgZnJpZW5kCisgICAgYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mIGlzLAorICAgICAgICAgICAgICAgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uJiB4KTsKK307CisKK3RlbXBsYXRlPGNsYXNzIEludFR5cGUgPSBpbnQ+CitjbGFzcyBwb2lzc29uX2Rpc3RyaWJ1dGlvbgoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBJbnRUeXBlIHJlc3VsdF90eXBlOworCisgICAgY2xhc3MgcGFyYW1fdHlwZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHR5cGVkZWYgcG9pc3Nvbl9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgZXhwbGljaXQgcGFyYW1fdHlwZShkb3VibGUgbWVhbiA9IDEuMCk7CisKKyAgICAgICAgZG91YmxlIG1lYW4oKSBjb25zdDsKKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIHgsIGNvbnN0IHBhcmFtX3R5cGUmIHkpOworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHBhcmFtX3R5cGUmIHgsIGNvbnN0IHBhcmFtX3R5cGUmIHkpOworICAgIH07CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIGV4cGxpY2l0IHBvaXNzb25fZGlzdHJpYnV0aW9uKGRvdWJsZSBtZWFuID0gMS4wKTsKKyAgICBleHBsaWNpdCBwb2lzc29uX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyBnZW5lcmF0aW5nIGZ1bmN0aW9ucworICAgIHRlbXBsYXRlPGNsYXNzIFVSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoVVJORyYgZyk7CisgICAgdGVtcGxhdGU8Y2xhc3MgVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShVUk5HJiBnLCBjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIGRvdWJsZSBtZWFuKCkgY29uc3Q7CisKKyAgICBwYXJhbV90eXBlIHBhcmFtKCkgY29uc3Q7CisgICAgdm9pZCBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKworICAgIHJlc3VsdF90eXBlIG1pbigpIGNvbnN0OworICAgIHJlc3VsdF90eXBlIG1heCgpIGNvbnN0OworCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwb2lzc29uX2Rpc3RyaWJ1dGlvbiYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaXNzb25fZGlzdHJpYnV0aW9uJiB5KTsKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHBvaXNzb25fZGlzdHJpYnV0aW9uJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pc3Nvbl9kaXN0cmlidXRpb24mIHkpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgZnJpZW5kCisgICAgYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mIG9zLAorICAgICAgICAgICAgICAgY29uc3QgcG9pc3Nvbl9kaXN0cmlidXRpb24mIHgpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgZnJpZW5kCisgICAgYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mIGlzLAorICAgICAgICAgICAgICAgcG9pc3Nvbl9kaXN0cmlidXRpb24mIHgpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgUmVhbFR5cGUgPSBkb3VibGU+CitjbGFzcyBleHBvbmVudGlhbF9kaXN0cmlidXRpb24KK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBjbGFzcyBwYXJhbV90eXBlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiBleHBvbmVudGlhbF9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgZXhwbGljaXQgcGFyYW1fdHlwZShyZXN1bHRfdHlwZSBsYW1iZGEgPSAxLjApOworCisgICAgICAgIHJlc3VsdF90eXBlIGxhbWJkYSgpIGNvbnN0OworCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgeCwgY29uc3QgcGFyYW1fdHlwZSYgeSk7CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgcGFyYW1fdHlwZSYgeCwgY29uc3QgcGFyYW1fdHlwZSYgeSk7CisgICAgfTsKKworICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgcmVzZXQgZnVuY3Rpb25zCisgICAgZXhwbGljaXQgZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uKHJlc3VsdF90eXBlIGxhbWJkYSA9IDEuMCk7CisgICAgZXhwbGljaXQgZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIHBhcm0pOworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgdGVtcGxhdGU8Y2xhc3MgVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShVUk5HJiBnKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVUk5HPiByZXN1bHRfdHlwZSBvcGVyYXRvcigpKFVSTkcmIGcsIGNvbnN0IHBhcmFtX3R5cGUmIHBhcm0pOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgcmVzdWx0X3R5cGUgbGFtYmRhKCkgY29uc3Q7CisKKyAgICBwYXJhbV90eXBlIHBhcmFtKCkgY29uc3Q7CisgICAgdm9pZCBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKworICAgIHJlc3VsdF90eXBlIG1pbigpIGNvbnN0OworICAgIHJlc3VsdF90eXBlIG1heCgpIGNvbnN0OworCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBleHBvbmVudGlhbF9kaXN0cmlidXRpb24mIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBvbmVudGlhbF9kaXN0cmlidXRpb24mIHkpOworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uJiB5KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGZyaWVuZAorICAgIGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBvcywKKyAgICAgICAgICAgICAgIGNvbnN0IGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbiYgeCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBmcmllbmQKKyAgICBiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYgaXMsCisgICAgICAgICAgICAgICBleHBvbmVudGlhbF9kaXN0cmlidXRpb24mIHgpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgUmVhbFR5cGUgPSBkb3VibGU+CitjbGFzcyBnYW1tYV9kaXN0cmlidXRpb24KK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBjbGFzcyBwYXJhbV90eXBlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiBnYW1tYV9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgZXhwbGljaXQgcGFyYW1fdHlwZShyZXN1bHRfdHlwZSBhbHBoYSA9IDEsIHJlc3VsdF90eXBlIGJldGEgPSAxKTsKKworICAgICAgICByZXN1bHRfdHlwZSBhbHBoYSgpIGNvbnN0OworICAgICAgICByZXN1bHRfdHlwZSBiZXRhKCkgY29uc3Q7CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICB9OworCisgICAgLy8gY29uc3RydWN0b3JzIGFuZCByZXNldCBmdW5jdGlvbnMKKyAgICBleHBsaWNpdCBnYW1tYV9kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgYWxwaGEgPSAxLCByZXN1bHRfdHlwZSBiZXRhID0gMSk7CisgICAgZXhwbGljaXQgZ2FtbWFfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIHBhcm0pOworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgdGVtcGxhdGU8Y2xhc3MgVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShVUk5HJiBnKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVUk5HPiByZXN1bHRfdHlwZSBvcGVyYXRvcigpKFVSTkcmIGcsIGNvbnN0IHBhcmFtX3R5cGUmIHBhcm0pOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgcmVzdWx0X3R5cGUgYWxwaGEoKSBjb25zdDsKKyAgICByZXN1bHRfdHlwZSBiZXRhKCkgY29uc3Q7CisKKyAgICBwYXJhbV90eXBlIHBhcmFtKCkgY29uc3Q7CisgICAgdm9pZCBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKworICAgIHJlc3VsdF90eXBlIG1pbigpIGNvbnN0OworICAgIHJlc3VsdF90eXBlIG1heCgpIGNvbnN0OworCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBnYW1tYV9kaXN0cmlidXRpb24mIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYW1tYV9kaXN0cmlidXRpb24mIHkpOworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgZ2FtbWFfZGlzdHJpYnV0aW9uJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2FtbWFfZGlzdHJpYnV0aW9uJiB5KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGZyaWVuZAorICAgIGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBvcywKKyAgICAgICAgICAgICAgIGNvbnN0IGdhbW1hX2Rpc3RyaWJ1dGlvbiYgeCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBmcmllbmQKKyAgICBiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYgaXMsCisgICAgICAgICAgICAgICBnYW1tYV9kaXN0cmlidXRpb24mIHgpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgUmVhbFR5cGUgPSBkb3VibGU+CitjbGFzcyB3ZWlidWxsX2Rpc3RyaWJ1dGlvbgoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBSZWFsVHlwZSByZXN1bHRfdHlwZTsKKworICAgIGNsYXNzIHBhcmFtX3R5cGUKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIHdlaWJ1bGxfZGlzdHJpYnV0aW9uIGRpc3RyaWJ1dGlvbl90eXBlOworCisgICAgICAgIGV4cGxpY2l0IHBhcmFtX3R5cGUocmVzdWx0X3R5cGUgYWxwaGEgPSAxLCByZXN1bHRfdHlwZSBiZXRhID0gMSk7CisKKyAgICAgICAgcmVzdWx0X3R5cGUgYSgpIGNvbnN0OworICAgICAgICByZXN1bHRfdHlwZSBiKCkgY29uc3Q7CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICB9OworCisgICAgLy8gY29uc3RydWN0b3IgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIGV4cGxpY2l0IHdlaWJ1bGxfZGlzdHJpYnV0aW9uKHJlc3VsdF90eXBlIGEgPSAxLCByZXN1bHRfdHlwZSBiID0gMSk7CisgICAgZXhwbGljaXQgd2VpYnVsbF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVUk5HPiByZXN1bHRfdHlwZSBvcGVyYXRvcigpKFVSTkcmIGcpOworICAgIHRlbXBsYXRlPGNsYXNzIFVSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoVVJORyYgZywgY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICAvLyBwcm9wZXJ0eSBmdW5jdGlvbnMKKyAgICByZXN1bHRfdHlwZSBhKCkgY29uc3Q7CisgICAgcmVzdWx0X3R5cGUgYigpIGNvbnN0OworCisgICAgcGFyYW1fdHlwZSBwYXJhbSgpIGNvbnN0OworICAgIHZvaWQgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdDsKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdDsKKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3Qgd2VpYnVsbF9kaXN0cmlidXRpb24mIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3ZWlidWxsX2Rpc3RyaWJ1dGlvbiYgeSk7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCB3ZWlidWxsX2Rpc3RyaWJ1dGlvbiYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdlaWJ1bGxfZGlzdHJpYnV0aW9uJiB5KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGZyaWVuZAorICAgIGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBvcywKKyAgICAgICAgICAgICAgIGNvbnN0IHdlaWJ1bGxfZGlzdHJpYnV0aW9uJiB4KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGZyaWVuZAorICAgIGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBpcywKKyAgICAgICAgICAgICAgIHdlaWJ1bGxfZGlzdHJpYnV0aW9uJiB4KTsKK307CisKK3RlbXBsYXRlPGNsYXNzIFJlYWxUeXBlID0gZG91YmxlPgorY2xhc3MgZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb24KK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBjbGFzcyBwYXJhbV90eXBlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbiBkaXN0cmlidXRpb25fdHlwZTsKKworICAgICAgICBleHBsaWNpdCBwYXJhbV90eXBlKHJlc3VsdF90eXBlIGEgPSAwLCByZXN1bHRfdHlwZSBiID0gMSk7CisKKyAgICAgICAgcmVzdWx0X3R5cGUgYSgpIGNvbnN0OworICAgICAgICByZXN1bHRfdHlwZSBiKCkgY29uc3Q7CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICB9OworCisgICAgLy8gY29uc3RydWN0b3IgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIGV4cGxpY2l0IGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uKHJlc3VsdF90eXBlIGEgPSAwLCByZXN1bHRfdHlwZSBiID0gMSk7CisgICAgZXhwbGljaXQgZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVUk5HPiByZXN1bHRfdHlwZSBvcGVyYXRvcigpKFVSTkcmIGcpOworICAgIHRlbXBsYXRlPGNsYXNzIFVSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoVVJORyYgZywgY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICAvLyBwcm9wZXJ0eSBmdW5jdGlvbnMKKyAgICByZXN1bHRfdHlwZSBhKCkgY29uc3Q7CisgICAgcmVzdWx0X3R5cGUgYigpIGNvbnN0OworCisgICAgcGFyYW1fdHlwZSBwYXJhbSgpIGNvbnN0OworICAgIHZvaWQgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdDsKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdDsKKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb24mIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbiYgeSk7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbiYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uJiB5KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGZyaWVuZAorICAgIGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBvcywKKyAgICAgICAgICAgICAgIGNvbnN0IGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uJiB4KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGZyaWVuZAorICAgIGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBpcywKKyAgICAgICAgICAgICAgIGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uJiB4KTsKK307CisKK3RlbXBsYXRlPGNsYXNzIFJlYWxUeXBlID0gZG91YmxlPgorY2xhc3Mgbm9ybWFsX2Rpc3RyaWJ1dGlvbgoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBSZWFsVHlwZSByZXN1bHRfdHlwZTsKKworICAgIGNsYXNzIHBhcmFtX3R5cGUKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIG5vcm1hbF9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgZXhwbGljaXQgcGFyYW1fdHlwZShyZXN1bHRfdHlwZSBtZWFuID0gMCwgcmVzdWx0X3R5cGUgc3RkZGV2ID0gMSk7CisKKyAgICAgICAgcmVzdWx0X3R5cGUgbWVhbigpIGNvbnN0OworICAgICAgICByZXN1bHRfdHlwZSBzdGRkZXYoKSBjb25zdDsKKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIHgsIGNvbnN0IHBhcmFtX3R5cGUmIHkpOworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHBhcmFtX3R5cGUmIHgsIGNvbnN0IHBhcmFtX3R5cGUmIHkpOworICAgIH07CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIGV4cGxpY2l0IG5vcm1hbF9kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgbWVhbiA9IDAsIHJlc3VsdF90eXBlIHN0ZGRldiA9IDEpOworICAgIGV4cGxpY2l0IG5vcm1hbF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVUk5HPiByZXN1bHRfdHlwZSBvcGVyYXRvcigpKFVSTkcmIGcpOworICAgIHRlbXBsYXRlPGNsYXNzIFVSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoVVJORyYgZywgY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICAvLyBwcm9wZXJ0eSBmdW5jdGlvbnMKKyAgICByZXN1bHRfdHlwZSBtZWFuKCkgY29uc3Q7CisgICAgcmVzdWx0X3R5cGUgc3RkZGV2KCkgY29uc3Q7CisKKyAgICBwYXJhbV90eXBlIHBhcmFtKCkgY29uc3Q7CisgICAgdm9pZCBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKworICAgIHJlc3VsdF90eXBlIG1pbigpIGNvbnN0OworICAgIHJlc3VsdF90eXBlIG1heCgpIGNvbnN0OworCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBub3JtYWxfZGlzdHJpYnV0aW9uJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsX2Rpc3RyaWJ1dGlvbiYgeSk7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBub3JtYWxfZGlzdHJpYnV0aW9uJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsX2Rpc3RyaWJ1dGlvbiYgeSk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBmcmllbmQKKyAgICBiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYgb3MsCisgICAgICAgICAgICAgICBjb25zdCBub3JtYWxfZGlzdHJpYnV0aW9uJiB4KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGZyaWVuZAorICAgIGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBpcywKKyAgICAgICAgICAgICAgIG5vcm1hbF9kaXN0cmlidXRpb24mIHgpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgUmVhbFR5cGUgPSBkb3VibGU+CitjbGFzcyBsb2dub3JtYWxfZGlzdHJpYnV0aW9uCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIFJlYWxUeXBlIHJlc3VsdF90eXBlOworCisgICAgY2xhc3MgcGFyYW1fdHlwZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHR5cGVkZWYgbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbiBkaXN0cmlidXRpb25fdHlwZTsKKworICAgICAgICBleHBsaWNpdCBwYXJhbV90eXBlKHJlc3VsdF90eXBlIG0gPSAwLCByZXN1bHRfdHlwZSBzID0gMSk7CisKKyAgICAgICAgcmVzdWx0X3R5cGUgbSgpIGNvbnN0OworICAgICAgICByZXN1bHRfdHlwZSBzKCkgY29uc3Q7CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICB9OworCisgICAgLy8gY29uc3RydWN0b3IgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIGV4cGxpY2l0IGxvZ25vcm1hbF9kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgbSA9IDAsIHJlc3VsdF90eXBlIHMgPSAxKTsKKyAgICBleHBsaWNpdCBsb2dub3JtYWxfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIHBhcm0pOworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgdGVtcGxhdGU8Y2xhc3MgVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShVUk5HJiBnKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVUk5HPiByZXN1bHRfdHlwZSBvcGVyYXRvcigpKFVSTkcmIGcsIGNvbnN0IHBhcmFtX3R5cGUmIHBhcm0pOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgcmVzdWx0X3R5cGUgbSgpIGNvbnN0OworICAgIHJlc3VsdF90eXBlIHMoKSBjb25zdDsKKworICAgIHBhcmFtX3R5cGUgcGFyYW0oKSBjb25zdDsKKyAgICB2b2lkIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIHBhcm0pOworCisgICAgcmVzdWx0X3R5cGUgbWluKCkgY29uc3Q7CisgICAgcmVzdWx0X3R5cGUgbWF4KCkgY29uc3Q7CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGxvZ25vcm1hbF9kaXN0cmlidXRpb24mIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2dub3JtYWxfZGlzdHJpYnV0aW9uJiB5KTsKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGxvZ25vcm1hbF9kaXN0cmlidXRpb24mIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2dub3JtYWxfZGlzdHJpYnV0aW9uJiB5KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGZyaWVuZAorICAgIGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBvcywKKyAgICAgICAgICAgICAgIGNvbnN0IGxvZ25vcm1hbF9kaXN0cmlidXRpb24mIHgpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgZnJpZW5kCisgICAgYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mIGlzLAorICAgICAgICAgICAgICAgbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbiYgeCk7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBSZWFsVHlwZSA9IGRvdWJsZT4KK2NsYXNzIGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbgoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBSZWFsVHlwZSByZXN1bHRfdHlwZTsKKworICAgIGNsYXNzIHBhcmFtX3R5cGUKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbiBkaXN0cmlidXRpb25fdHlwZTsKKworICAgICAgICBleHBsaWNpdCBwYXJhbV90eXBlKHJlc3VsdF90eXBlIG4gPSAxKTsKKworICAgICAgICByZXN1bHRfdHlwZSBuKCkgY29uc3Q7CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICB9OworCisgICAgLy8gY29uc3RydWN0b3IgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIGV4cGxpY2l0IGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbihyZXN1bHRfdHlwZSBuID0gMSk7CisgICAgZXhwbGljaXQgY2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIHBhcm0pOworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgdGVtcGxhdGU8Y2xhc3MgVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShVUk5HJiBnKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVUk5HPiByZXN1bHRfdHlwZSBvcGVyYXRvcigpKFVSTkcmIGcsIGNvbnN0IHBhcmFtX3R5cGUmIHBhcm0pOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgcmVzdWx0X3R5cGUgbigpIGNvbnN0OworCisgICAgcGFyYW1fdHlwZSBwYXJhbSgpIGNvbnN0OworICAgIHZvaWQgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdDsKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdDsKKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgY2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uJiB5KTsKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbiYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbiYgeSk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBmcmllbmQKKyAgICBiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYgb3MsCisgICAgICAgICAgICAgICBjb25zdCBjaGlfc3F1YXJlZF9kaXN0cmlidXRpb24mIHgpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgZnJpZW5kCisgICAgYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mIGlzLAorICAgICAgICAgICAgICAgY2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uJiB4KTsKK307CisKK3RlbXBsYXRlPGNsYXNzIFJlYWxUeXBlID0gZG91YmxlPgorY2xhc3MgY2F1Y2h5X2Rpc3RyaWJ1dGlvbgoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBSZWFsVHlwZSByZXN1bHRfdHlwZTsKKworICAgIGNsYXNzIHBhcmFtX3R5cGUKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIGNhdWNoeV9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgZXhwbGljaXQgcGFyYW1fdHlwZShyZXN1bHRfdHlwZSBhID0gMCwgcmVzdWx0X3R5cGUgYiA9IDEpOworCisgICAgICAgIHJlc3VsdF90eXBlIGEoKSBjb25zdDsKKyAgICAgICAgcmVzdWx0X3R5cGUgYigpIGNvbnN0OworCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgeCwgY29uc3QgcGFyYW1fdHlwZSYgeSk7CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgcGFyYW1fdHlwZSYgeCwgY29uc3QgcGFyYW1fdHlwZSYgeSk7CisgICAgfTsKKworICAgIC8vIGNvbnN0cnVjdG9yIGFuZCByZXNldCBmdW5jdGlvbnMKKyAgICBleHBsaWNpdCBjYXVjaHlfZGlzdHJpYnV0aW9uKHJlc3VsdF90eXBlIGEgPSAwLCByZXN1bHRfdHlwZSBiID0gMSk7CisgICAgZXhwbGljaXQgY2F1Y2h5X2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyBnZW5lcmF0aW5nIGZ1bmN0aW9ucworICAgIHRlbXBsYXRlPGNsYXNzIFVSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoVVJORyYgZyk7CisgICAgdGVtcGxhdGU8Y2xhc3MgVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShVUk5HJiBnLCBjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIHJlc3VsdF90eXBlIGEoKSBjb25zdDsKKyAgICByZXN1bHRfdHlwZSBiKCkgY29uc3Q7CisKKyAgICBwYXJhbV90eXBlIHBhcmFtKCkgY29uc3Q7CisgICAgdm9pZCBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKworICAgIHJlc3VsdF90eXBlIG1pbigpIGNvbnN0OworICAgIHJlc3VsdF90eXBlIG1heCgpIGNvbnN0OworCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjYXVjaHlfZGlzdHJpYnV0aW9uJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2F1Y2h5X2Rpc3RyaWJ1dGlvbiYgeSk7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBjYXVjaHlfZGlzdHJpYnV0aW9uJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2F1Y2h5X2Rpc3RyaWJ1dGlvbiYgeSk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBmcmllbmQKKyAgICBiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYgb3MsCisgICAgICAgICAgICAgICBjb25zdCBjYXVjaHlfZGlzdHJpYnV0aW9uJiB4KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGZyaWVuZAorICAgIGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBpcywKKyAgICAgICAgICAgICAgIGNhdWNoeV9kaXN0cmlidXRpb24mIHgpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgUmVhbFR5cGUgPSBkb3VibGU+CitjbGFzcyBmaXNoZXJfZl9kaXN0cmlidXRpb24KK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBjbGFzcyBwYXJhbV90eXBlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiBmaXNoZXJfZl9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgZXhwbGljaXQgcGFyYW1fdHlwZShyZXN1bHRfdHlwZSBtID0gMSwgcmVzdWx0X3R5cGUgbiA9IDEpOworCisgICAgICAgIHJlc3VsdF90eXBlIG0oKSBjb25zdDsKKyAgICAgICAgcmVzdWx0X3R5cGUgbigpIGNvbnN0OworCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgeCwgY29uc3QgcGFyYW1fdHlwZSYgeSk7CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgcGFyYW1fdHlwZSYgeCwgY29uc3QgcGFyYW1fdHlwZSYgeSk7CisgICAgfTsKKworICAgIC8vIGNvbnN0cnVjdG9yIGFuZCByZXNldCBmdW5jdGlvbnMKKyAgICBleHBsaWNpdCBmaXNoZXJfZl9kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgbSA9IDEsIHJlc3VsdF90eXBlIG4gPSAxKTsKKyAgICBleHBsaWNpdCBmaXNoZXJfZl9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVUk5HPiByZXN1bHRfdHlwZSBvcGVyYXRvcigpKFVSTkcmIGcpOworICAgIHRlbXBsYXRlPGNsYXNzIFVSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoVVJORyYgZywgY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICAvLyBwcm9wZXJ0eSBmdW5jdGlvbnMKKyAgICByZXN1bHRfdHlwZSBtKCkgY29uc3Q7CisgICAgcmVzdWx0X3R5cGUgbigpIGNvbnN0OworCisgICAgcGFyYW1fdHlwZSBwYXJhbSgpIGNvbnN0OworICAgIHZvaWQgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdDsKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdDsKKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgZmlzaGVyX2ZfZGlzdHJpYnV0aW9uJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlzaGVyX2ZfZGlzdHJpYnV0aW9uJiB5KTsKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGZpc2hlcl9mX2Rpc3RyaWJ1dGlvbiYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpc2hlcl9mX2Rpc3RyaWJ1dGlvbiYgeSk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBmcmllbmQKKyAgICBiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYgb3MsCisgICAgICAgICAgICAgICBjb25zdCBmaXNoZXJfZl9kaXN0cmlidXRpb24mIHgpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgZnJpZW5kCisgICAgYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mIGlzLAorICAgICAgICAgICAgICAgZmlzaGVyX2ZfZGlzdHJpYnV0aW9uJiB4KTsKK307CisKK3RlbXBsYXRlPGNsYXNzIFJlYWxUeXBlID0gZG91YmxlPgorY2xhc3Mgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbgoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBSZWFsVHlwZSByZXN1bHRfdHlwZTsKKworICAgIGNsYXNzIHBhcmFtX3R5cGUKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIHN0dWRlbnRfdF9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgZXhwbGljaXQgcGFyYW1fdHlwZShyZXN1bHRfdHlwZSBuID0gMSk7CisKKyAgICAgICAgcmVzdWx0X3R5cGUgbigpIGNvbnN0OworCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgeCwgY29uc3QgcGFyYW1fdHlwZSYgeSk7CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgcGFyYW1fdHlwZSYgeCwgY29uc3QgcGFyYW1fdHlwZSYgeSk7CisgICAgfTsKKworICAgIC8vIGNvbnN0cnVjdG9yIGFuZCByZXNldCBmdW5jdGlvbnMKKyAgICBleHBsaWNpdCBzdHVkZW50X3RfZGlzdHJpYnV0aW9uKHJlc3VsdF90eXBlIG4gPSAxKTsKKyAgICBleHBsaWNpdCBzdHVkZW50X3RfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIHBhcm0pOworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgdGVtcGxhdGU8Y2xhc3MgVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShVUk5HJiBnKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVUk5HPiByZXN1bHRfdHlwZSBvcGVyYXRvcigpKFVSTkcmIGcsIGNvbnN0IHBhcmFtX3R5cGUmIHBhcm0pOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgcmVzdWx0X3R5cGUgbigpIGNvbnN0OworCisgICAgcGFyYW1fdHlwZSBwYXJhbSgpIGNvbnN0OworICAgIHZvaWQgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdDsKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdDsKKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3Qgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbiYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0dWRlbnRfdF9kaXN0cmlidXRpb24mIHkpOworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3Qgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbiYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0dWRlbnRfdF9kaXN0cmlidXRpb24mIHkpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgZnJpZW5kCisgICAgYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mIG9zLAorICAgICAgICAgICAgICAgY29uc3Qgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbiYgeCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBmcmllbmQKKyAgICBiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYgaXMsCisgICAgICAgICAgICAgICBzdHVkZW50X3RfZGlzdHJpYnV0aW9uJiB4KTsKK307CisKK3RlbXBsYXRlPGNsYXNzIEludFR5cGUgPSBpbnQ+CitjbGFzcyBkaXNjcmV0ZV9kaXN0cmlidXRpb24KK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgSW50VHlwZSByZXN1bHRfdHlwZTsKKworICAgIGNsYXNzIHBhcmFtX3R5cGUKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbiBkaXN0cmlidXRpb25fdHlwZTsKKworICAgICAgICBwYXJhbV90eXBlKCk7CisgICAgICAgIHRlbXBsYXRlPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgICAgICBwYXJhbV90eXBlKElucHV0SXRlcmF0b3IgZmlyc3RXLCBJbnB1dEl0ZXJhdG9yIGxhc3RXKTsKKyAgICAgICAgcGFyYW1fdHlwZShpbml0aWFsaXplcl9saXN0PGRvdWJsZT4gd2wpOworICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBVbmFyeU9wZXJhdGlvbj4KKyAgICAgICAgICAgIHBhcmFtX3R5cGUoc2l6ZV90IG53LCBkb3VibGUgeG1pbiwgZG91YmxlIHhtYXgsIFVuYXJ5T3BlcmF0aW9uIGZ3KTsKKworICAgICAgICB2ZWN0b3I8ZG91YmxlPiBwcm9iYWJpbGl0aWVzKCkgY29uc3Q7CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICB9OworCisgICAgLy8gY29uc3RydWN0b3IgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbigpOworICAgIHRlbXBsYXRlPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbihJbnB1dEl0ZXJhdG9yIGZpcnN0VywgSW5wdXRJdGVyYXRvciBsYXN0Vyk7CisgICAgZGlzY3JldGVfZGlzdHJpYnV0aW9uKGluaXRpYWxpemVyX2xpc3Q8ZG91YmxlPiB3bCk7CisgICAgdGVtcGxhdGU8Y2xhc3MgVW5hcnlPcGVyYXRpb24+CisgICAgICAgIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbihzaXplX3QgbncsIGRvdWJsZSB4bWluLCBkb3VibGUgeG1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuYXJ5T3BlcmF0aW9uIGZ3KTsKKyAgICBleHBsaWNpdCBkaXNjcmV0ZV9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVUk5HPiByZXN1bHRfdHlwZSBvcGVyYXRvcigpKFVSTkcmIGcpOworICAgIHRlbXBsYXRlPGNsYXNzIFVSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoVVJORyYgZywgY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICAvLyBwcm9wZXJ0eSBmdW5jdGlvbnMKKyAgICB2ZWN0b3I8ZG91YmxlPiBwcm9iYWJpbGl0aWVzKCkgY29uc3Q7CisKKyAgICBwYXJhbV90eXBlIHBhcmFtKCkgY29uc3Q7CisgICAgdm9pZCBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKworICAgIHJlc3VsdF90eXBlIG1pbigpIGNvbnN0OworICAgIHJlc3VsdF90eXBlIG1heCgpIGNvbnN0OworCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBkaXNjcmV0ZV9kaXN0cmlidXRpb24mIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNjcmV0ZV9kaXN0cmlidXRpb24mIHkpOworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgZGlzY3JldGVfZGlzdHJpYnV0aW9uJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzY3JldGVfZGlzdHJpYnV0aW9uJiB5KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGZyaWVuZAorICAgIGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBvcywKKyAgICAgICAgICAgICAgIGNvbnN0IGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbiYgeCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBmcmllbmQKKyAgICBiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYgaXMsCisgICAgICAgICAgICAgICBkaXNjcmV0ZV9kaXN0cmlidXRpb24mIHgpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgUmVhbFR5cGUgPSBkb3VibGU+CitjbGFzcyBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uCit7CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIFJlYWxUeXBlIHJlc3VsdF90eXBlOworCisgICAgY2xhc3MgcGFyYW1fdHlwZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHR5cGVkZWYgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbiBkaXN0cmlidXRpb25fdHlwZTsKKworICAgICAgICBwYXJhbV90eXBlKCk7CisgICAgICAgIHRlbXBsYXRlPGNsYXNzIElucHV0SXRlcmF0b3JCLCBjbGFzcyBJbnB1dEl0ZXJhdG9yVz4KKyAgICAgICAgICAgIHBhcmFtX3R5cGUoSW5wdXRJdGVyYXRvckIgZmlyc3RCLCBJbnB1dEl0ZXJhdG9yQiBsYXN0QiwKKyAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvclcgZmlyc3RXKTsKKyAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVW5hcnlPcGVyYXRpb24+CisgICAgICAgICAgICBwYXJhbV90eXBlKGluaXRpYWxpemVyX2xpc3Q8cmVzdWx0X3R5cGU+IGJsLCBVbmFyeU9wZXJhdGlvbiBmdyk7CisgICAgICAgIHRlbXBsYXRlPGNsYXNzIFVuYXJ5T3BlcmF0aW9uPgorICAgICAgICAgICAgcGFyYW1fdHlwZShzaXplX3QgbncsIHJlc3VsdF90eXBlIHhtaW4sIHJlc3VsdF90eXBlIHhtYXgsCisgICAgICAgICAgICAgICAgICAgICAgIFVuYXJ5T3BlcmF0aW9uIGZ3KTsKKworICAgICAgICB2ZWN0b3I8cmVzdWx0X3R5cGU+IGludGVydmFscygpIGNvbnN0OworICAgICAgICB2ZWN0b3I8cmVzdWx0X3R5cGU+IGRlbnNpdGllcygpIGNvbnN0OworCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgeCwgY29uc3QgcGFyYW1fdHlwZSYgeSk7CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgcGFyYW1fdHlwZSYgeCwgY29uc3QgcGFyYW1fdHlwZSYgeSk7CisgICAgfTsKKworICAgIC8vIGNvbnN0cnVjdG9yIGFuZCByZXNldCBmdW5jdGlvbnMKKyAgICBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uKCk7CisgICAgdGVtcGxhdGU8Y2xhc3MgSW5wdXRJdGVyYXRvckIsIGNsYXNzIElucHV0SXRlcmF0b3JXPgorICAgICAgICBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uKElucHV0SXRlcmF0b3JCIGZpcnN0QiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yQiBsYXN0QiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yVyBmaXJzdFcpOworICAgIHRlbXBsYXRlPGNsYXNzIFVuYXJ5T3BlcmF0aW9uPgorICAgICAgICBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uKGluaXRpYWxpemVyX2xpc3Q8cmVzdWx0X3R5cGU+IGJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuYXJ5T3BlcmF0aW9uIGZ3KTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVbmFyeU9wZXJhdGlvbj4KKyAgICAgICAgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbihzaXplX3QgbncsIHJlc3VsdF90eXBlIHhtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X3R5cGUgeG1heCwgVW5hcnlPcGVyYXRpb24gZncpOworICAgIGV4cGxpY2l0IHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVUk5HPiByZXN1bHRfdHlwZSBvcGVyYXRvcigpKFVSTkcmIGcpOworICAgIHRlbXBsYXRlPGNsYXNzIFVSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoVVJORyYgZywgY29uc3QgcGFyYW1fdHlwZSYgcGFybSk7CisKKyAgICAvLyBwcm9wZXJ0eSBmdW5jdGlvbnMKKyAgICB2ZWN0b3I8cmVzdWx0X3R5cGU+IGludGVydmFscygpIGNvbnN0OworICAgIHZlY3RvcjxyZXN1bHRfdHlwZT4gZGVuc2l0aWVzKCkgY29uc3Q7CisKKyAgICBwYXJhbV90eXBlIHBhcmFtKCkgY29uc3Q7CisgICAgdm9pZCBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKworICAgIHJlc3VsdF90eXBlIG1pbigpIGNvbnN0OworICAgIHJlc3VsdF90eXBlIG1heCgpIGNvbnN0OworCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbiYgeSk7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbiYgeSk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBmcmllbmQKKyAgICBiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYgb3MsCisgICAgICAgICAgICAgICBjb25zdCBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uJiB4KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGZyaWVuZAorICAgIGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBpcywKKyAgICAgICAgICAgICAgIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb24mIHgpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgUmVhbFR5cGUgPSBkb3VibGU+CitjbGFzcyBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbgoreworICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBSZWFsVHlwZSByZXN1bHRfdHlwZTsKKworICAgIGNsYXNzIHBhcmFtX3R5cGUKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uIGRpc3RyaWJ1dGlvbl90eXBlOworCisgICAgICAgIHBhcmFtX3R5cGUoKTsKKyAgICAgICAgdGVtcGxhdGU8Y2xhc3MgSW5wdXRJdGVyYXRvckIsIGNsYXNzIElucHV0SXRlcmF0b3JXPgorICAgICAgICAgICAgcGFyYW1fdHlwZShJbnB1dEl0ZXJhdG9yQiBmaXJzdEIsIElucHV0SXRlcmF0b3JCIGxhc3RCLAorICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yVyBmaXJzdFcpOworICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBVbmFyeU9wZXJhdGlvbj4KKyAgICAgICAgICAgIHBhcmFtX3R5cGUoaW5pdGlhbGl6ZXJfbGlzdDxyZXN1bHRfdHlwZT4gYmwsIFVuYXJ5T3BlcmF0aW9uIGZ3KTsKKyAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVW5hcnlPcGVyYXRpb24+CisgICAgICAgICAgICBwYXJhbV90eXBlKHNpemVfdCBudywgcmVzdWx0X3R5cGUgeG1pbiwgcmVzdWx0X3R5cGUgeG1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgVW5hcnlPcGVyYXRpb24gZncpOworCisgICAgICAgIHZlY3RvcjxyZXN1bHRfdHlwZT4gaW50ZXJ2YWxzKCkgY29uc3Q7CisgICAgICAgIHZlY3RvcjxyZXN1bHRfdHlwZT4gZGVuc2l0aWVzKCkgY29uc3Q7CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwYXJhbV90eXBlJiB4LCBjb25zdCBwYXJhbV90eXBlJiB5KTsKKyAgICB9OworCisgICAgLy8gY29uc3RydWN0b3IgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uKCk7CisgICAgdGVtcGxhdGU8Y2xhc3MgSW5wdXRJdGVyYXRvckIsIGNsYXNzIElucHV0SXRlcmF0b3JXPgorICAgICAgICBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbihJbnB1dEl0ZXJhdG9yQiBmaXJzdEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3JCIGxhc3RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yVyBmaXJzdFcpOworCisgICAgdGVtcGxhdGU8Y2xhc3MgVW5hcnlPcGVyYXRpb24+CisgICAgICAgIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uKGluaXRpYWxpemVyX2xpc3Q8cmVzdWx0X3R5cGU+IGJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmFyeU9wZXJhdGlvbiBmdyk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVbmFyeU9wZXJhdGlvbj4KKyAgICAgICAgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24oc2l6ZV90IG53LCByZXN1bHRfdHlwZSB4bWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZSB4bWF4LCBVbmFyeU9wZXJhdGlvbiBmdyk7CisKKyAgICBleHBsaWNpdCBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyBnZW5lcmF0aW5nIGZ1bmN0aW9ucworICAgIHRlbXBsYXRlPGNsYXNzIFVSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoVVJORyYgZyk7CisgICAgdGVtcGxhdGU8Y2xhc3MgVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShVUk5HJiBnLCBjb25zdCBwYXJhbV90eXBlJiBwYXJtKTsKKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIHZlY3RvcjxyZXN1bHRfdHlwZT4gaW50ZXJ2YWxzKCkgY29uc3Q7CisgICAgdmVjdG9yPHJlc3VsdF90eXBlPiBkZW5zaXRpZXMoKSBjb25zdDsKKworICAgIHBhcmFtX3R5cGUgcGFyYW0oKSBjb25zdDsKKyAgICB2b2lkIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIHBhcm0pOworCisgICAgcmVzdWx0X3R5cGUgbWluKCkgY29uc3Q7CisgICAgcmVzdWx0X3R5cGUgbWF4KCkgY29uc3Q7CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24mIHkpOworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24mIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbiYgeSk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBmcmllbmQKKyAgICBiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYgb3MsCisgICAgICAgICAgICAgICBjb25zdCBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbiYgeCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBmcmllbmQKKyAgICBiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYgaXMsCisgICAgICAgICAgICAgICBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbiYgeCk7Cit9OworCit9IC8vIHN0ZAorKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGlzdHJlYW0+CisjaW5jbHVkZSA8b3N0cmVhbT4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfUFVTSF9NQUNST1MKKyNpbmNsdWRlIDxfX3VuZGVmX21hY3Jvcz4KKworCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKworLy8gX19pc19zZWVkX3NlcXVlbmNlCisKK3RlbXBsYXRlIDxjbGFzcyBfU3NlcSwgY2xhc3MgX0VuZ2luZT4KK3N0cnVjdCBfX2lzX3NlZWRfc2VxdWVuY2UKK3sKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgYm9vbCB2YWx1ZSA9CisgICAgICAgICAgICAgICFpc19jb252ZXJ0aWJsZTxfU3NlcSwgdHlwZW5hbWUgX0VuZ2luZTo6cmVzdWx0X3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAhaXNfc2FtZTx0eXBlbmFtZSByZW1vdmVfY3Y8X1NzZXE+Ojp0eXBlLCBfRW5naW5lPjo6dmFsdWU7Cit9OworCisvLyBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZQorCit0ZW1wbGF0ZSA8dW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdW5zaWduZWQgbG9uZyBsb25nIF9fYywKKyAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgX19tLCB1bnNpZ25lZCBsb25nIGxvbmcgX01wLAorICAgICAgICAgIGJvb2wgX01pZ2h0T3ZlcmZsb3cgPSAoX19hICE9IDAgJiYgX19tICE9IDAgJiYgX19tLTEgPiAoX01wLV9fYykvX19hKT4KK3N0cnVjdCBfX2xjZV90YTsKKworLy8gNjQKKwordGVtcGxhdGUgPHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2MsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX20+CitzdHJ1Y3QgX19sY2VfdGE8X19hLCBfX2MsIF9fbSwgKHVuc2lnbmVkIGxvbmcgbG9uZykofjApLCB0cnVlPgoreworICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHJlc3VsdF90eXBlOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgcmVzdWx0X3R5cGUgbmV4dChyZXN1bHRfdHlwZSBfX3gpCisgICAgeworICAgICAgICAvLyBTY2hyYWdlJ3MgYWxnb3JpdGhtCisgICAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fcSA9IF9fbSAvIF9fYTsKKyAgICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX19yID0gX19tICUgX19hOworICAgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX3QwID0gX19hICogKF9feCAlIF9fcSk7CisgICAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fdDEgPSBfX3IgKiAoX194IC8gX19xKTsKKyAgICAgICAgX194ID0gX190MCArIChfX3QwIDwgX190MSkgKiBfX20gLSBfX3QxOworICAgICAgICBfX3ggKz0gX19jIC0gKF9feCA+PSBfX20gLSBfX2MpICogX19tOworICAgICAgICByZXR1cm4gX194OworICAgIH0KK307CisKK3RlbXBsYXRlIDx1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB1bnNpZ25lZCBsb25nIGxvbmcgX19tPgorc3RydWN0IF9fbGNlX3RhPF9fYSwgMCwgX19tLCAodW5zaWduZWQgbG9uZyBsb25nKSh+MCksIHRydWU+Cit7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgcmVzdWx0X3R5cGU7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyByZXN1bHRfdHlwZSBuZXh0KHJlc3VsdF90eXBlIF9feCkKKyAgICB7CisgICAgICAgIC8vIFNjaHJhZ2UncyBhbGdvcml0aG0KKyAgICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX19xID0gX19tIC8gX19hOworICAgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX3IgPSBfX20gJSBfX2E7CisgICAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fdDAgPSBfX2EgKiAoX194ICUgX19xKTsKKyAgICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX190MSA9IF9fciAqIChfX3ggLyBfX3EpOworICAgICAgICBfX3ggPSBfX3QwICsgKF9fdDAgPCBfX3QxKSAqIF9fbSAtIF9fdDE7CisgICAgICAgIHJldHVybiBfX3g7CisgICAgfQorfTsKKwordGVtcGxhdGUgPHVuc2lnbmVkIGxvbmcgbG9uZyBfX2EsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2MsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX20+CitzdHJ1Y3QgX19sY2VfdGE8X19hLCBfX2MsIF9fbSwgKHVuc2lnbmVkIGxvbmcgbG9uZykofjApLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyByZXN1bHRfdHlwZTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGljIHJlc3VsdF90eXBlIG5leHQocmVzdWx0X3R5cGUgX194KQorICAgIHsKKyAgICAgICAgcmV0dXJuIChfX2EgKiBfX3ggKyBfX2MpICUgX19tOworICAgIH0KK307CisKK3RlbXBsYXRlIDx1bnNpZ25lZCBsb25nIGxvbmcgX19hLCB1bnNpZ25lZCBsb25nIGxvbmcgX19jPgorc3RydWN0IF9fbGNlX3RhPF9fYSwgX19jLCAwLCAodW5zaWduZWQgbG9uZyBsb25nKSh+MCksIGZhbHNlPgoreworICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHJlc3VsdF90eXBlOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgcmVzdWx0X3R5cGUgbmV4dChyZXN1bHRfdHlwZSBfX3gpCisgICAgeworICAgICAgICByZXR1cm4gX19hICogX194ICsgX19jOworICAgIH0KK307CisKKy8vIDMyCisKK3RlbXBsYXRlIDx1bnNpZ25lZCBsb25nIGxvbmcgX0FwLCB1bnNpZ25lZCBsb25nIGxvbmcgX0NwLCB1bnNpZ25lZCBsb25nIGxvbmcgX01wPgorc3RydWN0IF9fbGNlX3RhPF9BcCwgX0NwLCBfTXAsIHVuc2lnbmVkKH4wKSwgdHJ1ZT4KK3sKKyAgICB0eXBlZGVmIHVuc2lnbmVkIHJlc3VsdF90eXBlOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgcmVzdWx0X3R5cGUgbmV4dChyZXN1bHRfdHlwZSBfX3gpCisgICAgeworICAgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX2EgPSBzdGF0aWNfY2FzdDxyZXN1bHRfdHlwZT4oX0FwKTsKKyAgICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX19jID0gc3RhdGljX2Nhc3Q8cmVzdWx0X3R5cGU+KF9DcCk7CisgICAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fbSA9IHN0YXRpY19jYXN0PHJlc3VsdF90eXBlPihfTXApOworICAgICAgICAvLyBTY2hyYWdlJ3MgYWxnb3JpdGhtCisgICAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fcSA9IF9fbSAvIF9fYTsKKyAgICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX19yID0gX19tICUgX19hOworICAgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX3QwID0gX19hICogKF9feCAlIF9fcSk7CisgICAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fdDEgPSBfX3IgKiAoX194IC8gX19xKTsKKyAgICAgICAgX194ID0gX190MCArIChfX3QwIDwgX190MSkgKiBfX20gLSBfX3QxOworICAgICAgICBfX3ggKz0gX19jIC0gKF9feCA+PSBfX20gLSBfX2MpICogX19tOworICAgICAgICByZXR1cm4gX194OworICAgIH0KK307CisKK3RlbXBsYXRlIDx1bnNpZ25lZCBsb25nIGxvbmcgX0FwLCB1bnNpZ25lZCBsb25nIGxvbmcgX01wPgorc3RydWN0IF9fbGNlX3RhPF9BcCwgMCwgX01wLCB1bnNpZ25lZCh+MCksIHRydWU+Cit7CisgICAgdHlwZWRlZiB1bnNpZ25lZCByZXN1bHRfdHlwZTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGljIHJlc3VsdF90eXBlIG5leHQocmVzdWx0X3R5cGUgX194KQorICAgIHsKKyAgICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX19hID0gc3RhdGljX2Nhc3Q8cmVzdWx0X3R5cGU+KF9BcCk7CisgICAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fbSA9IHN0YXRpY19jYXN0PHJlc3VsdF90eXBlPihfTXApOworICAgICAgICAvLyBTY2hyYWdlJ3MgYWxnb3JpdGhtCisgICAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fcSA9IF9fbSAvIF9fYTsKKyAgICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX19yID0gX19tICUgX19hOworICAgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX3QwID0gX19hICogKF9feCAlIF9fcSk7CisgICAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fdDEgPSBfX3IgKiAoX194IC8gX19xKTsKKyAgICAgICAgX194ID0gX190MCArIChfX3QwIDwgX190MSkgKiBfX20gLSBfX3QxOworICAgICAgICByZXR1cm4gX194OworICAgIH0KK307CisKK3RlbXBsYXRlIDx1bnNpZ25lZCBsb25nIGxvbmcgX0FwLCB1bnNpZ25lZCBsb25nIGxvbmcgX0NwLCB1bnNpZ25lZCBsb25nIGxvbmcgX01wPgorc3RydWN0IF9fbGNlX3RhPF9BcCwgX0NwLCBfTXAsIHVuc2lnbmVkKH4wKSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiB1bnNpZ25lZCByZXN1bHRfdHlwZTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGljIHJlc3VsdF90eXBlIG5leHQocmVzdWx0X3R5cGUgX194KQorICAgIHsKKyAgICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX19hID0gc3RhdGljX2Nhc3Q8cmVzdWx0X3R5cGU+KF9BcCk7CisgICAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fYyA9IHN0YXRpY19jYXN0PHJlc3VsdF90eXBlPihfQ3ApOworICAgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX20gPSBzdGF0aWNfY2FzdDxyZXN1bHRfdHlwZT4oX01wKTsKKyAgICAgICAgcmV0dXJuIChfX2EgKiBfX3ggKyBfX2MpICUgX19tOworICAgIH0KK307CisKK3RlbXBsYXRlIDx1bnNpZ25lZCBsb25nIGxvbmcgX0FwLCB1bnNpZ25lZCBsb25nIGxvbmcgX0NwPgorc3RydWN0IF9fbGNlX3RhPF9BcCwgX0NwLCAwLCB1bnNpZ25lZCh+MCksIGZhbHNlPgoreworICAgIHR5cGVkZWYgdW5zaWduZWQgcmVzdWx0X3R5cGU7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyByZXN1bHRfdHlwZSBuZXh0KHJlc3VsdF90eXBlIF9feCkKKyAgICB7CisgICAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fYSA9IHN0YXRpY19jYXN0PHJlc3VsdF90eXBlPihfQXApOworICAgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX2MgPSBzdGF0aWNfY2FzdDxyZXN1bHRfdHlwZT4oX0NwKTsKKyAgICAgICAgcmV0dXJuIF9fYSAqIF9feCArIF9fYzsKKyAgICB9Cit9OworCisvLyAxNgorCit0ZW1wbGF0ZSA8dW5zaWduZWQgbG9uZyBsb25nIF9fYSwgdW5zaWduZWQgbG9uZyBsb25nIF9fYywgdW5zaWduZWQgbG9uZyBsb25nIF9fbSwgYm9vbCBfX2I+CitzdHJ1Y3QgX19sY2VfdGE8X19hLCBfX2MsIF9fbSwgKHVuc2lnbmVkIHNob3J0KSh+MCksIF9fYj4KK3sKKyAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHJlc3VsdF90eXBlOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgcmVzdWx0X3R5cGUgbmV4dChyZXN1bHRfdHlwZSBfX3gpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8cmVzdWx0X3R5cGU+KF9fbGNlX3RhPF9fYSwgX19jLCBfX20sIHVuc2lnbmVkKH4wKT46Om5leHQoX194KSk7CisgICAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLAorICAgICAgICAgIGNsYXNzIF9VcCwgX1VwIF9BcCwgX1VwIF9DcCwgX1VwIF9OcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorICAgICAgICAgICBjb25zdCBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxfVXAsIF9BcCwgX0NwLCBfTnA+Jik7CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsCisgICAgICAgICAgY2xhc3MgX1VwLCBfVXAgX0FwLCBfVXAgX0NwLCBfVXAgX05wPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VcCwgX0FwLCBfQ3AsIF9OcD4mIF9feCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZQoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBfVUludFR5cGUgcmVzdWx0X3R5cGU7CisKK3ByaXZhdGU6CisgICAgcmVzdWx0X3R5cGUgX194XzsKKworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCByZXN1bHRfdHlwZSBfTXAgPSByZXN1bHRfdHlwZSh+MCk7CisKKyAgICBzdGF0aWNfYXNzZXJ0KF9fbSA9PSAwIHx8IF9fYSA8IF9fbSwgImxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lIGludmFsaWQgcGFyYW1ldGVycyIpOworICAgIHN0YXRpY19hc3NlcnQoX19tID09IDAgfHwgX19jIDwgX19tLCAibGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmUgaW52YWxpZCBwYXJhbWV0ZXJzIik7CitwdWJsaWM6CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHJlc3VsdF90eXBlIF9NaW4gPSBfX2MgPT0gMHUgPyAxdTogMHU7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHJlc3VsdF90eXBlIF9NYXggPSBfX20gLSAxdTsKKyAgICBzdGF0aWNfYXNzZXJ0KF9NaW4gPCBfTWF4LCAgICAgICAgICAgImxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lIGludmFsaWQgcGFyYW1ldGVycyIpOworCisgICAgLy8gZW5naW5lIGNoYXJhY3RlcmlzdGljcworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCByZXN1bHRfdHlwZSBtdWx0aXBsaWVyID0gX19hOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCByZXN1bHRfdHlwZSBpbmNyZW1lbnQgPSBfX2M7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHJlc3VsdF90eXBlIG1vZHVsdXMgPSBfX207CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiByZXN1bHRfdHlwZSBtaW4oKSB7cmV0dXJuIF9NaW47fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgcmVzdWx0X3R5cGUgbWF4KCkge3JldHVybiBfTWF4O30KKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgcmVzdWx0X3R5cGUgZGVmYXVsdF9zZWVkID0gMXU7CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIHNlZWRpbmcgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lKHJlc3VsdF90eXBlIF9fcyA9IGRlZmF1bHRfc2VlZCkKKyAgICAgICAge3NlZWQoX19zKTt9CisgICAgdGVtcGxhdGU8Y2xhc3MgX1NzZXE+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZXhwbGljaXQgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmUoX1NzZXEmIF9fcSwKKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfc2VlZF9zZXF1ZW5jZTxfU3NlcSwgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU+Ojp2YWx1ZT46OnR5cGUqID0gMCkKKyAgICAgICAge3NlZWQoX19xKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc2VlZChyZXN1bHRfdHlwZSBfX3MgPSBkZWZhdWx0X3NlZWQpCisgICAgICAgIHtzZWVkKGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9fbSA9PSAwPigpLAorICAgICAgICAgICAgICBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2MgPT0gMD4oKSwgX19zKTt9CisgICAgdGVtcGxhdGU8Y2xhc3MgX1NzZXE+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIF9faXNfc2VlZF9zZXF1ZW5jZTxfU3NlcSwgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU+Ojp2YWx1ZSwKKyAgICAgICAgICAgIHZvaWQKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBzZWVkKF9Tc2VxJiBfX3EpCisgICAgICAgICAgICB7X19zZWVkKF9fcSwgaW50ZWdyYWxfY29uc3RhbnQ8dW5zaWduZWQsCisgICAgICAgICAgICAgICAgMSArIChfX20gPT0gMCA/IChzaXplb2YocmVzdWx0X3R5cGUpICogX19DSEFSX0JJVF9fIC0gMSkvMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgKF9fbSA+IDB4MTAwMDAwMDAwdWxsKSk+KCkpO30KKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoKQorICAgICAgICB7cmV0dXJuIF9feF8gPSBzdGF0aWNfY2FzdDxyZXN1bHRfdHlwZT4oX19sY2VfdGE8X19hLCBfX2MsIF9fbSwgX01wPjo6bmV4dChfX3hfKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGRpc2NhcmQodW5zaWduZWQgbG9uZyBsb25nIF9feikge2ZvciAoOyBfX3o7IC0tX196KSBvcGVyYXRvcigpKCk7fQorCisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmUmIF9feCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmUmIF9feSkKKyAgICAgICAge3JldHVybiBfX3guX194XyA9PSBfX3kuX194Xzt9CisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmUmIF9feCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmUmIF9feSkKKyAgICAgICAge3JldHVybiAhKF9feCA9PSBfX3kpO30KKworcHJpdmF0ZToKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHNlZWQodHJ1ZV90eXBlLCB0cnVlX3R5cGUsIHJlc3VsdF90eXBlIF9fcykge19feF8gPSBfX3MgPT0gMCA/IDEgOiBfX3M7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHNlZWQodHJ1ZV90eXBlLCBmYWxzZV90eXBlLCByZXN1bHRfdHlwZSBfX3MpIHtfX3hfID0gX19zO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzZWVkKGZhbHNlX3R5cGUsIHRydWVfdHlwZSwgcmVzdWx0X3R5cGUgX19zKSB7X194XyA9IF9fcyAlIF9fbSA9PSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA6IF9fcyAlIF9fbTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc2VlZChmYWxzZV90eXBlLCBmYWxzZV90eXBlLCByZXN1bHRfdHlwZSBfX3MpIHtfX3hfID0gX19zICUgX19tO30KKworICAgIHRlbXBsYXRlPGNsYXNzIF9Tc2VxPgorICAgICAgICB2b2lkIF9fc2VlZChfU3NlcSYgX19xLCBpbnRlZ3JhbF9jb25zdGFudDx1bnNpZ25lZCwgMT4pOworICAgIHRlbXBsYXRlPGNsYXNzIF9Tc2VxPgorICAgICAgICB2b2lkIF9fc2VlZChfU3NlcSYgX19xLCBpbnRlZ3JhbF9jb25zdGFudDx1bnNpZ25lZCwgMj4pOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywKKyAgICAgICAgICAgICAgY2xhc3MgX1VwLCBfVXAgX0FwLCBfVXAgX0NwLCBfVXAgX05wPgorICAgIGZyaWVuZAorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgICAgIGNvbnN0IGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VcCwgX0FwLCBfQ3AsIF9OcD4mKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsCisgICAgICAgICAgICAgIGNsYXNzIF9VcCwgX1VwIF9BcCwgX1VwIF9DcCwgX1VwIF9OcD4KKyAgICBmcmllbmQKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgICAgICBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxfVXAsIF9BcCwgX0NwLCBfTnA+JiBfX3gpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCB0eXBlbmFtZSBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+OjpyZXN1bHRfdHlwZQorICAgIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46Om11bHRpcGxpZXI7CisKK3RlbXBsYXRlIDxjbGFzcyBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgdHlwZW5hbWUgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlLCBfX2EsIF9fYywgX19tPjo6cmVzdWx0X3R5cGUKKyAgICBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+OjppbmNyZW1lbnQ7CisKK3RlbXBsYXRlIDxjbGFzcyBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgdHlwZW5hbWUgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlLCBfX2EsIF9fYywgX19tPjo6cmVzdWx0X3R5cGUKKyAgICBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+Ojptb2R1bHVzOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHR5cGVuYW1lIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46OnJlc3VsdF90eXBlCisgICAgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlLCBfX2EsIF9fYywgX19tPjo6ZGVmYXVsdF9zZWVkOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgordGVtcGxhdGU8Y2xhc3MgX1NzZXE+Cit2b2lkCitsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+OjpfX3NlZWQoX1NzZXEmIF9fcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhbF9jb25zdGFudDx1bnNpZ25lZCwgMT4pCit7CisgICAgY29uc3QgdW5zaWduZWQgX19rID0gMTsKKyAgICB1aW50MzJfdCBfX2FyW19fayszXTsKKyAgICBfX3EuZ2VuZXJhdGUoX19hciwgX19hciArIF9fayArIDMpOworICAgIHJlc3VsdF90eXBlIF9fcyA9IHN0YXRpY19jYXN0PHJlc3VsdF90eXBlPihfX2FyWzNdICUgX19tKTsKKyAgICBfX3hfID0gX19jID09IDAgJiYgX19zID09IDAgPyByZXN1bHRfdHlwZSgxKSA6IF9fczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KK3RlbXBsYXRlPGNsYXNzIF9Tc2VxPgordm9pZAorbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlLCBfX2EsIF9fYywgX19tPjo6X19zZWVkKF9Tc2VxJiBfX3EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdyYWxfY29uc3RhbnQ8dW5zaWduZWQsIDI+KQoreworICAgIGNvbnN0IHVuc2lnbmVkIF9fayA9IDI7CisgICAgdWludDMyX3QgX19hcltfX2srM107CisgICAgX19xLmdlbmVyYXRlKF9fYXIsIF9fYXIgKyBfX2sgKyAzKTsKKyAgICByZXN1bHRfdHlwZSBfX3MgPSBzdGF0aWNfY2FzdDxyZXN1bHRfdHlwZT4oKF9fYXJbM10gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDY0X3QpX19hcls0XSA8PCAzMikpICUgX19tKTsKKyAgICBfX3hfID0gX19jID09IDAgJiYgX19zID09IDAgPyByZXN1bHRfdHlwZSgxKSA6IF9fczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywKKyAgICAgICAgICBjbGFzcyBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgIGNvbnN0IGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT4mIF9feCkKK3sKKyAgICBfX3NhdmVfZmxhZ3M8X0NoYXJULCBfVHJhaXRzPiBfX2x4KF9fb3MpOworICAgIF9fb3MuZmxhZ3MoaW9zX2Jhc2U6OmRlYyB8IGlvc19iYXNlOjpsZWZ0KTsKKyAgICBfX29zLmZpbGwoX19vcy53aWRlbignICcpKTsKKyAgICByZXR1cm4gX19vcyA8PCBfX3guX194XzsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywKKyAgICAgICAgICBjbGFzcyBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgICAgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlLCBfX2EsIF9fYywgX19tPiYgX194KQoreworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19pcyk7CisgICAgX19pcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OnNraXB3cyk7CisgICAgX1VJbnRUeXBlIF9fdDsKKyAgICBfX2lzID4+IF9fdDsKKyAgICBpZiAoIV9faXMuZmFpbCgpKQorICAgICAgICBfX3guX194XyA9IF9fdDsKKyAgICByZXR1cm4gX19pczsKK30KKwordHlwZWRlZiBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTx1aW50X2Zhc3QzMl90LCAxNjgwNywgMCwgMjE0NzQ4MzY0Nz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5zdGRfcmFuZDA7Cit0eXBlZGVmIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPHVpbnRfZmFzdDMyX3QsIDQ4MjcxLCAwLCAyMTQ3NDgzNjQ3PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5zdGRfcmFuZDsKK3R5cGVkZWYgbWluc3RkX3JhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X3JhbmRvbV9lbmdpbmU7CisvLyBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorICAgICAgICAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisgICAgICAgICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwgX1VJbnRUeXBlIF9fZj4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1VJbnQsIHNpemVfdCBfV3AsIHNpemVfdCBfTnAsIHNpemVfdCBfTXAsIHNpemVfdCBfUnAsCisgICAgICAgICAgX1VJbnQgX0FwLCBzaXplX3QgX1VwLCBfVUludCBfRHAsIHNpemVfdCBfU3AsCisgICAgICAgICAgX1VJbnQgX0JwLCBzaXplX3QgX1RwLCBfVUludCBfQ3AsIHNpemVfdCBfTHAsIF9VSW50IF9GcD4KK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnQsIF9XcCwgX05wLCBfTXAsIF9ScCwgX0FwLCBfVXAsIF9EcCwgX1NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQnAsIF9UcCwgX0NwLCBfTHAsIF9GcD4mIF9feCwKKyAgICAgICAgICAgY29uc3QgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnQsIF9XcCwgX05wLCBfTXAsIF9ScCwgX0FwLCBfVXAsIF9EcCwgX1NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQnAsIF9UcCwgX0NwLCBfTHAsIF9GcD4mIF9feSk7CisKK3RlbXBsYXRlIDxjbGFzcyBfVUludCwgc2l6ZV90IF9XcCwgc2l6ZV90IF9OcCwgc2l6ZV90IF9NcCwgc2l6ZV90IF9ScCwKKyAgICAgICAgICBfVUludCBfQXAsIHNpemVfdCBfVXAsIF9VSW50IF9EcCwgc2l6ZV90IF9TcCwKKyAgICAgICAgICBfVUludCBfQnAsIHNpemVfdCBfVHAsIF9VSW50IF9DcCwgc2l6ZV90IF9McCwgX1VJbnQgX0ZwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludCwgX1dwLCBfTnAsIF9NcCwgX1JwLCBfQXAsIF9VcCwgX0RwLCBfU3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CcCwgX1RwLCBfQ3AsIF9McCwgX0ZwPiYgX194LAorICAgICAgICAgICBjb25zdCBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludCwgX1dwLCBfTnAsIF9NcCwgX1JwLCBfQXAsIF9VcCwgX0RwLCBfU3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CcCwgX1RwLCBfQ3AsIF9McCwgX0ZwPiYgX195KTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywKKyAgICAgICAgICBjbGFzcyBfVUludCwgc2l6ZV90IF9XcCwgc2l6ZV90IF9OcCwgc2l6ZV90IF9NcCwgc2l6ZV90IF9ScCwKKyAgICAgICAgICBfVUludCBfQXAsIHNpemVfdCBfVXAsIF9VSW50IF9EcCwgc2l6ZV90IF9TcCwKKyAgICAgICAgICBfVUludCBfQnAsIHNpemVfdCBfVHAsIF9VSW50IF9DcCwgc2l6ZV90IF9McCwgX1VJbnQgX0ZwPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgIGNvbnN0IG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50LCBfV3AsIF9OcCwgX01wLCBfUnAsIF9BcCwgX1VwLCBfRHAsIF9TcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JwLCBfVHAsIF9DcCwgX0xwLCBfRnA+JiBfX3gpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLAorICAgICAgICAgIGNsYXNzIF9VSW50LCBzaXplX3QgX1dwLCBzaXplX3QgX05wLCBzaXplX3QgX01wLCBzaXplX3QgX1JwLAorICAgICAgICAgIF9VSW50IF9BcCwgc2l6ZV90IF9VcCwgX1VJbnQgX0RwLCBzaXplX3QgX1NwLAorICAgICAgICAgIF9VSW50IF9CcCwgc2l6ZV90IF9UcCwgX1VJbnQgX0NwLCBzaXplX3QgX0xwLCBfVUludCBfRnA+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnQsIF9XcCwgX05wLCBfTXAsIF9ScCwgX0FwLCBfVXAsIF9EcCwgX1NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQnAsIF9UcCwgX0NwLCBfTHAsIF9GcD4mIF9feCk7CisKK3RlbXBsYXRlIDxjbGFzcyBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisgICAgICAgICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKyAgICAgICAgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLCBfVUludFR5cGUgX19mPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUKK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgX1VJbnRUeXBlIHJlc3VsdF90eXBlOworCitwcml2YXRlOgorICAgIHJlc3VsdF90eXBlIF9feF9bX19uXTsKKyAgICBzaXplX3QgICAgICBfX2lfOworCisgICAgc3RhdGljX2Fzc2VydCggIDAgPCAgX19tLCAibWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUgaW52YWxpZCBwYXJhbWV0ZXJzIik7CisgICAgc3RhdGljX2Fzc2VydChfX20gPD0gX19uLCAibWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUgaW52YWxpZCBwYXJhbWV0ZXJzIik7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHJlc3VsdF90eXBlIF9EdCA9IG51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6ZGlnaXRzOworICAgIHN0YXRpY19hc3NlcnQoX193IDw9IF9EdCwgIm1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIGludmFsaWQgcGFyYW1ldGVycyIpOworICAgIHN0YXRpY19hc3NlcnQoICAyIDw9IF9fdywgIm1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIGludmFsaWQgcGFyYW1ldGVycyIpOworICAgIHN0YXRpY19hc3NlcnQoX19yIDw9IF9fdywgIm1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIGludmFsaWQgcGFyYW1ldGVycyIpOworICAgIHN0YXRpY19hc3NlcnQoX191IDw9IF9fdywgIm1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIGludmFsaWQgcGFyYW1ldGVycyIpOworICAgIHN0YXRpY19hc3NlcnQoX19zIDw9IF9fdywgIm1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIGludmFsaWQgcGFyYW1ldGVycyIpOworICAgIHN0YXRpY19hc3NlcnQoX190IDw9IF9fdywgIm1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIGludmFsaWQgcGFyYW1ldGVycyIpOworICAgIHN0YXRpY19hc3NlcnQoX19sIDw9IF9fdywgIm1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIGludmFsaWQgcGFyYW1ldGVycyIpOworcHVibGljOgorICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCByZXN1bHRfdHlwZSBfTWluID0gMDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgcmVzdWx0X3R5cGUgX01heCA9IF9fdyA9PSBfRHQgPyByZXN1bHRfdHlwZSh+MCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3VsdF90eXBlKDEpIDw8IF9fdykgLSByZXN1bHRfdHlwZSgxKTsKKyAgICBzdGF0aWNfYXNzZXJ0KF9NaW4gPCBfTWF4LCAibWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUgaW52YWxpZCBwYXJhbWV0ZXJzIik7CisgICAgc3RhdGljX2Fzc2VydChfX2EgPD0gX01heCwgIm1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIGludmFsaWQgcGFyYW1ldGVycyIpOworICAgIHN0YXRpY19hc3NlcnQoX19iIDw9IF9NYXgsICJtZXJzZW5uZV90d2lzdGVyX2VuZ2luZSBpbnZhbGlkIHBhcmFtZXRlcnMiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KF9fYyA8PSBfTWF4LCAibWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUgaW52YWxpZCBwYXJhbWV0ZXJzIik7CisgICAgc3RhdGljX2Fzc2VydChfX2QgPD0gX01heCwgIm1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIGludmFsaWQgcGFyYW1ldGVycyIpOworICAgIHN0YXRpY19hc3NlcnQoX19mIDw9IF9NYXgsICJtZXJzZW5uZV90d2lzdGVyX2VuZ2luZSBpbnZhbGlkIHBhcmFtZXRlcnMiKTsKKworICAgIC8vIGVuZ2luZSBjaGFyYWN0ZXJpc3RpY3MKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90IHdvcmRfc2l6ZSA9IF9fdzsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90IHN0YXRlX3NpemUgPSBfX247CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHNpemVfdCBzaGlmdF9zaXplID0gX19tOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBzaXplX3QgbWFza19iaXRzID0gX19yOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCByZXN1bHRfdHlwZSB4b3JfbWFzayA9IF9fYTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90IHRlbXBlcmluZ191ID0gX191OworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCByZXN1bHRfdHlwZSB0ZW1wZXJpbmdfZCA9IF9fZDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90IHRlbXBlcmluZ19zID0gX19zOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCByZXN1bHRfdHlwZSB0ZW1wZXJpbmdfYiA9IF9fYjsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90IHRlbXBlcmluZ190ID0gX190OworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCByZXN1bHRfdHlwZSB0ZW1wZXJpbmdfYyA9IF9fYzsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90IHRlbXBlcmluZ19sID0gX19sOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCByZXN1bHRfdHlwZSBpbml0aWFsaXphdGlvbl9tdWx0aXBsaWVyID0gX19mOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgcmVzdWx0X3R5cGUgbWluKCkgeyByZXR1cm4gX01pbjsgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgcmVzdWx0X3R5cGUgbWF4KCkgeyByZXR1cm4gX01heDsgfQorICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCByZXN1bHRfdHlwZSBkZWZhdWx0X3NlZWQgPSA1NDg5dTsKKworICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgc2VlZGluZyBmdW5jdGlvbnMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUocmVzdWx0X3R5cGUgX19zZCA9IGRlZmF1bHRfc2VlZCkKKyAgICAgICAge3NlZWQoX19zZCk7fQorICAgIHRlbXBsYXRlPGNsYXNzIF9Tc2VxPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGV4cGxpY2l0IG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lKF9Tc2VxJiBfX3EsCisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3NlZWRfc2VxdWVuY2U8X1NzZXEsIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPjo6dmFsdWU+Ojp0eXBlKiA9IDApCisgICAgICAgIHtzZWVkKF9fcSk7fQorICAgIHZvaWQgc2VlZChyZXN1bHRfdHlwZSBfX3NkID0gZGVmYXVsdF9zZWVkKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfU3NlcT4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgX19pc19zZWVkX3NlcXVlbmNlPF9Tc2VxLCBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZT46OnZhbHVlLAorICAgICAgICAgICAgdm9pZAorICAgICAgICA+Ojp0eXBlCisgICAgICAgIHNlZWQoX1NzZXEmIF9fcSkKKyAgICAgICAgICAgIHtfX3NlZWQoX19xLCBpbnRlZ3JhbF9jb25zdGFudDx1bnNpZ25lZCwgMSArIChfX3cgLSAxKSAvIDMyPigpKTt9CisKKyAgICAvLyBnZW5lcmF0aW5nIGZ1bmN0aW9ucworICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBkaXNjYXJkKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3opIHtmb3IgKDsgX196OyAtLV9feikgb3BlcmF0b3IoKSgpO30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVUludCwgc2l6ZV90IF9XcCwgc2l6ZV90IF9OcCwgc2l6ZV90IF9NcCwgc2l6ZV90IF9ScCwKKyAgICAgICAgICAgICAgX1VJbnQgX0FwLCBzaXplX3QgX1VwLCBfVUludCBfRHAsIHNpemVfdCBfU3AsCisgICAgICAgICAgICAgIF9VSW50IF9CcCwgc2l6ZV90IF9UcCwgX1VJbnQgX0NwLCBzaXplX3QgX0xwLCBfVUludCBfRnA+CisgICAgZnJpZW5kCisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnQsIF9XcCwgX05wLCBfTXAsIF9ScCwgX0FwLCBfVXAsIF9EcCwgX1NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JwLCBfVHAsIF9DcCwgX0xwLCBfRnA+JiBfX3gsCisgICAgICAgICAgICAgICBjb25zdCBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludCwgX1dwLCBfTnAsIF9NcCwgX1JwLCBfQXAsIF9VcCwgX0RwLCBfU3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQnAsIF9UcCwgX0NwLCBfTHAsIF9GcD4mIF9feSk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VJbnQsIHNpemVfdCBfV3AsIHNpemVfdCBfTnAsIHNpemVfdCBfTXAsIHNpemVfdCBfUnAsCisgICAgICAgICAgICAgIF9VSW50IF9BcCwgc2l6ZV90IF9VcCwgX1VJbnQgX0RwLCBzaXplX3QgX1NwLAorICAgICAgICAgICAgICBfVUludCBfQnAsIHNpemVfdCBfVHAsIF9VSW50IF9DcCwgc2l6ZV90IF9McCwgX1VJbnQgX0ZwPgorICAgIGZyaWVuZAorICAgIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50LCBfV3AsIF9OcCwgX01wLCBfUnAsIF9BcCwgX1VwLCBfRHAsIF9TcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CcCwgX1RwLCBfQ3AsIF9McCwgX0ZwPiYgX194LAorICAgICAgICAgICAgICAgY29uc3QgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnQsIF9XcCwgX05wLCBfTXAsIF9ScCwgX0FwLCBfVXAsIF9EcCwgX1NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JwLCBfVHAsIF9DcCwgX0xwLCBfRnA+JiBfX3kpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywKKyAgICAgICAgICAgICAgY2xhc3MgX1VJbnQsIHNpemVfdCBfV3AsIHNpemVfdCBfTnAsIHNpemVfdCBfTXAsIHNpemVfdCBfUnAsCisgICAgICAgICAgICAgIF9VSW50IF9BcCwgc2l6ZV90IF9VcCwgX1VJbnQgX0RwLCBzaXplX3QgX1NwLAorICAgICAgICAgICAgICBfVUludCBfQnAsIHNpemVfdCBfVHAsIF9VSW50IF9DcCwgc2l6ZV90IF9McCwgX1VJbnQgX0ZwPgorICAgIGZyaWVuZAorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgICAgIGNvbnN0IG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50LCBfV3AsIF9OcCwgX01wLCBfUnAsIF9BcCwgX1VwLCBfRHAsIF9TcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CcCwgX1RwLCBfQ3AsIF9McCwgX0ZwPiYgX194KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsCisgICAgICAgICAgICAgIGNsYXNzIF9VSW50LCBzaXplX3QgX1dwLCBzaXplX3QgX05wLCBzaXplX3QgX01wLCBzaXplX3QgX1JwLAorICAgICAgICAgICAgICBfVUludCBfQXAsIHNpemVfdCBfVXAsIF9VSW50IF9EcCwgc2l6ZV90IF9TcCwKKyAgICAgICAgICAgICAgX1VJbnQgX0JwLCBzaXplX3QgX1RwLCBfVUludCBfQ3AsIHNpemVfdCBfTHAsIF9VSW50IF9GcD4KKyAgICBmcmllbmQKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgICAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludCwgX1dwLCBfTnAsIF9NcCwgX1JwLCBfQXAsIF9VcCwgX0RwLCBfU3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQnAsIF9UcCwgX0NwLCBfTHAsIF9GcD4mIF9feCk7Citwcml2YXRlOgorCisgICAgdGVtcGxhdGU8Y2xhc3MgX1NzZXE+CisgICAgICAgIHZvaWQgX19zZWVkKF9Tc2VxJiBfX3EsIGludGVncmFsX2NvbnN0YW50PHVuc2lnbmVkLCAxPik7CisgICAgdGVtcGxhdGU8Y2xhc3MgX1NzZXE+CisgICAgICAgIHZvaWQgX19zZWVkKF9Tc2VxJiBfX3EsIGludGVncmFsX2NvbnN0YW50PHVuc2lnbmVkLCAyPik7CisKKyAgICB0ZW1wbGF0ZSA8c2l6ZV90IF9fY291bnQ+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgc3RhdGljCisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICBfX2NvdW50IDwgX193LAorICAgICAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBfX2xzaGlmdChyZXN1bHRfdHlwZSBfX3gpIHtyZXR1cm4gKF9feCA8PCBfX2NvdW50KSAmIF9NYXg7fQorCisgICAgdGVtcGxhdGUgPHNpemVfdCBfX2NvdW50PgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHN0YXRpYworICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgKF9fY291bnQgPj0gX193KSwKKyAgICAgICAgICAgIHJlc3VsdF90eXBlCisgICAgICAgID46OnR5cGUKKyAgICAgICAgX19sc2hpZnQocmVzdWx0X3R5cGUpIHtyZXR1cm4gcmVzdWx0X3R5cGUoMCk7fQorCisgICAgdGVtcGxhdGUgPHNpemVfdCBfX2NvdW50PgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHN0YXRpYworICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgX19jb3VudCA8IF9EdCwKKyAgICAgICAgICAgIHJlc3VsdF90eXBlCisgICAgICAgID46OnR5cGUKKyAgICAgICAgX19yc2hpZnQocmVzdWx0X3R5cGUgX194KSB7cmV0dXJuIF9feCA+PiBfX2NvdW50O30KKworICAgIHRlbXBsYXRlIDxzaXplX3QgX19jb3VudD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBzdGF0aWMKKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIChfX2NvdW50ID49IF9EdCksCisgICAgICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICA+Ojp0eXBlCisgICAgICAgIF9fcnNoaWZ0KHJlc3VsdF90eXBlKSB7cmV0dXJuIHJlc3VsdF90eXBlKDApO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisgICAgICAgICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKyAgICAgICAgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLCBfVUludFR5cGUgX19mPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHNpemVfdAorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLCBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6d29yZF9zaXplOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorICAgICAgICAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisgICAgICAgICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwgX1VJbnRUeXBlIF9fZj4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBzaXplX3QgCisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjpzdGF0ZV9zaXplOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorICAgICAgICAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisgICAgICAgICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwgX1VJbnRUeXBlIF9fZj4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBzaXplX3QgCisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjpzaGlmdF9zaXplOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorICAgICAgICAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisgICAgICAgICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwgX1VJbnRUeXBlIF9fZj4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBzaXplX3QgCisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjptYXNrX2JpdHM7CisKK3RlbXBsYXRlIDxjbGFzcyBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisgICAgICAgICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKyAgICAgICAgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLCBfVUludFR5cGUgX19mPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHR5cGVuYW1lIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLCBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6cmVzdWx0X3R5cGUKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46Onhvcl9tYXNrOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorICAgICAgICAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisgICAgICAgICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwgX1VJbnRUeXBlIF9fZj4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBzaXplX3QgCisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+Ojp0ZW1wZXJpbmdfdTsKKwordGVtcGxhdGUgPGNsYXNzIF9VSW50VHlwZSwgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKyAgICAgICAgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorICAgICAgICAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsIF9VSW50VHlwZSBfX2Y+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgdHlwZW5hbWUgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjpyZXN1bHRfdHlwZQorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLCBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6dGVtcGVyaW5nX2Q7CisKK3RlbXBsYXRlIDxjbGFzcyBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisgICAgICAgICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKyAgICAgICAgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLCBfVUludFR5cGUgX19mPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHNpemVfdCAKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OnRlbXBlcmluZ19zOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorICAgICAgICAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisgICAgICAgICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwgX1VJbnRUeXBlIF9fZj4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCB0eXBlbmFtZSBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OnJlc3VsdF90eXBlCisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+Ojp0ZW1wZXJpbmdfYjsKKwordGVtcGxhdGUgPGNsYXNzIF9VSW50VHlwZSwgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKyAgICAgICAgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorICAgICAgICAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsIF9VSW50VHlwZSBfX2Y+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90IAorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLCBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6dGVtcGVyaW5nX3Q7CisKK3RlbXBsYXRlIDxjbGFzcyBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisgICAgICAgICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKyAgICAgICAgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLCBfVUludFR5cGUgX19mPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHR5cGVuYW1lIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLCBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6cmVzdWx0X3R5cGUKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OnRlbXBlcmluZ19jOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorICAgICAgICAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisgICAgICAgICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwgX1VJbnRUeXBlIF9fZj4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBzaXplX3QgCisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+Ojp0ZW1wZXJpbmdfbDsKKwordGVtcGxhdGUgPGNsYXNzIF9VSW50VHlwZSwgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKyAgICAgICAgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorICAgICAgICAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsIF9VSW50VHlwZSBfX2Y+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgdHlwZW5hbWUgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjpyZXN1bHRfdHlwZQorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLCBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6aW5pdGlhbGl6YXRpb25fbXVsdGlwbGllcjsKKwordGVtcGxhdGUgPGNsYXNzIF9VSW50VHlwZSwgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKyAgICAgICAgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorICAgICAgICAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsIF9VSW50VHlwZSBfX2Y+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgdHlwZW5hbWUgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjpyZXN1bHRfdHlwZQorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLCBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6ZGVmYXVsdF9zZWVkOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorICAgICAgICAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisgICAgICAgICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwgX1VJbnRUeXBlIF9fZj4KK3ZvaWQKK21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLCBfX3MsIF9fYiwKKyAgICBfX3QsIF9fYywgX19sLCBfX2Y+OjpzZWVkKHJlc3VsdF90eXBlIF9fc2QpCisgICAgX0xJQkNQUF9ESVNBQkxFX1VCU0FOX1VOU0lHTkVEX0lOVEVHRVJfQ0hFQ0sKK3sgICAvLyBfX3cgPj0gMgorICAgIF9feF9bMF0gPSBfX3NkICYgX01heDsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAxOyBfX2kgPCBfX247ICsrX19pKQorICAgICAgICBfX3hfW19faV0gPSAoX19mICogKF9feF9bX19pLTFdIF4gX19yc2hpZnQ8X193IC0gMj4oX194X1tfX2ktMV0pKSArIF9faSkgJiBfTWF4OworICAgIF9faV8gPSAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorICAgICAgICAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisgICAgICAgICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwgX1VJbnRUeXBlIF9fZj4KK3RlbXBsYXRlPGNsYXNzIF9Tc2VxPgordm9pZAorbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsIF9fcywgX19iLAorICAgIF9fdCwgX19jLCBfX2wsIF9fZj46Ol9fc2VlZChfU3NlcSYgX19xLCBpbnRlZ3JhbF9jb25zdGFudDx1bnNpZ25lZCwgMT4pCit7CisgICAgY29uc3QgdW5zaWduZWQgX19rID0gMTsKKyAgICB1aW50MzJfdCBfX2FyW19fbiAqIF9fa107CisgICAgX19xLmdlbmVyYXRlKF9fYXIsIF9fYXIgKyBfX24gKiBfX2spOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9feF9bX19pXSA9IHN0YXRpY19jYXN0PHJlc3VsdF90eXBlPihfX2FyW19faV0gJiBfTWF4KTsKKyAgICBjb25zdCByZXN1bHRfdHlwZSBfX21hc2sgPSBfX3IgPT0gX0R0ID8gcmVzdWx0X3R5cGUofjApIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHRfdHlwZSgxKSA8PCBfX3IpIC0gcmVzdWx0X3R5cGUoMSk7CisgICAgX19pXyA9IDA7CisgICAgaWYgKChfX3hfWzBdICYgfl9fbWFzaykgPT0gMCkKKyAgICB7CisgICAgICAgIGZvciAoc2l6ZV90IF9faSA9IDE7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgICAgICBpZiAoX194X1tfX2ldICE9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBfX3hfWzBdID0gX01heDsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisgICAgICAgICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKyAgICAgICAgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLCBfVUludFR5cGUgX19mPgordGVtcGxhdGU8Y2xhc3MgX1NzZXE+Cit2b2lkCittZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwgX19zLCBfX2IsCisgICAgX190LCBfX2MsIF9fbCwgX19mPjo6X19zZWVkKF9Tc2VxJiBfX3EsIGludGVncmFsX2NvbnN0YW50PHVuc2lnbmVkLCAyPikKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBfX2sgPSAyOworICAgIHVpbnQzMl90IF9fYXJbX19uICogX19rXTsKKyAgICBfX3EuZ2VuZXJhdGUoX19hciwgX19hciArIF9fbiAqIF9fayk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgICAgX194X1tfX2ldID0gc3RhdGljX2Nhc3Q8cmVzdWx0X3R5cGU+KAorICAgICAgICAgICAgKF9fYXJbMiAqIF9faV0gKyAoKHVpbnQ2NF90KV9fYXJbMiAqIF9faSArIDFdIDw8IDMyKSkgJiBfTWF4KTsKKyAgICBjb25zdCByZXN1bHRfdHlwZSBfX21hc2sgPSBfX3IgPT0gX0R0ID8gcmVzdWx0X3R5cGUofjApIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHRfdHlwZSgxKSA8PCBfX3IpIC0gcmVzdWx0X3R5cGUoMSk7CisgICAgX19pXyA9IDA7CisgICAgaWYgKChfX3hfWzBdICYgfl9fbWFzaykgPT0gMCkKKyAgICB7CisgICAgICAgIGZvciAoc2l6ZV90IF9faSA9IDE7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgICAgICBpZiAoX194X1tfX2ldICE9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBfX3hfWzBdID0gX01heDsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisgICAgICAgICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKyAgICAgICAgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLCBfVUludFR5cGUgX19mPgorX1VJbnRUeXBlCittZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwgX19zLCBfX2IsCisgICAgX190LCBfX2MsIF9fbCwgX19mPjo6b3BlcmF0b3IoKSgpCit7CisgICAgY29uc3Qgc2l6ZV90IF9faiA9IChfX2lfICsgMSkgJSBfX247CisgICAgY29uc3QgcmVzdWx0X3R5cGUgX19tYXNrID0gX19yID09IF9EdCA/IHJlc3VsdF90eXBlKH4wKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzdWx0X3R5cGUoMSkgPDwgX19yKSAtIHJlc3VsdF90eXBlKDEpOworICAgIGNvbnN0IHJlc3VsdF90eXBlIF9ZcCA9IChfX3hfW19faV9dICYgfl9fbWFzaykgfCAoX194X1tfX2pdICYgX19tYXNrKTsKKyAgICBjb25zdCBzaXplX3QgX19rID0gKF9faV8gKyBfX20pICUgX19uOworICAgIF9feF9bX19pX10gPSBfX3hfW19fa10gXiBfX3JzaGlmdDwxPihfWXApIF4gKF9fYSAqIChfWXAgJiAxKSk7CisgICAgcmVzdWx0X3R5cGUgX196ID0gX194X1tfX2lfXSBeIChfX3JzaGlmdDxfX3U+KF9feF9bX19pX10pICYgX19kKTsKKyAgICBfX2lfID0gX19qOworICAgIF9feiBePSBfX2xzaGlmdDxfX3M+KF9feikgJiBfX2I7CisgICAgX196IF49IF9fbHNoaWZ0PF9fdD4oX196KSAmIF9fYzsKKyAgICByZXR1cm4gX196IF4gX19yc2hpZnQ8X19sPihfX3opOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1VJbnQsIHNpemVfdCBfV3AsIHNpemVfdCBfTnAsIHNpemVfdCBfTXAsIHNpemVfdCBfUnAsCisgICAgICAgICAgX1VJbnQgX0FwLCBzaXplX3QgX1VwLCBfVUludCBfRHAsIHNpemVfdCBfU3AsCisgICAgICAgICAgX1VJbnQgX0JwLCBzaXplX3QgX1RwLCBfVUludCBfQ3AsIHNpemVfdCBfTHAsIF9VSW50IF9GcD4KK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnQsIF9XcCwgX05wLCBfTXAsIF9ScCwgX0FwLCBfVXAsIF9EcCwgX1NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQnAsIF9UcCwgX0NwLCBfTHAsIF9GcD4mIF9feCwKKyAgICAgICAgICAgY29uc3QgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnQsIF9XcCwgX05wLCBfTXAsIF9ScCwgX0FwLCBfVXAsIF9EcCwgX1NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQnAsIF9UcCwgX0NwLCBfTHAsIF9GcD4mIF9feSkKK3sKKyAgICBpZiAoX194Ll9faV8gPT0gX195Ll9faV8pCisgICAgICAgIHJldHVybiBfVlNURDo6ZXF1YWwoX194Ll9feF8sIF9feC5fX3hfICsgX05wLCBfX3kuX194Xyk7CisgICAgaWYgKF9feC5fX2lfID09IDAgfHwgX195Ll9faV8gPT0gMCkKKyAgICB7CisgICAgICAgIHNpemVfdCBfX2ogPSBfVlNURDo6bWluKF9OcCAtIF9feC5fX2lfLCBfTnAgLSBfX3kuX19pXyk7CisgICAgICAgIGlmICghX1ZTVEQ6OmVxdWFsKF9feC5fX3hfICsgX194Ll9faV8sIF9feC5fX3hfICsgX194Ll9faV8gKyBfX2osCisgICAgICAgICAgICAgICAgICAgICAgICAgX195Ll9feF8gKyBfX3kuX19pXykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChfX3guX19pXyA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIF9WU1REOjplcXVhbChfX3guX194XyArIF9faiwgX194Ll9feF8gKyBfTnAsIF9feS5fX3hfKTsKKyAgICAgICAgcmV0dXJuIF9WU1REOjplcXVhbChfX3guX194XywgX194Ll9feF8gKyAoX05wIC0gX19qKSwgX195Ll9feF8gKyBfX2opOworICAgIH0KKyAgICBpZiAoX194Ll9faV8gPCBfX3kuX19pXykKKyAgICB7CisgICAgICAgIHNpemVfdCBfX2ogPSBfTnAgLSBfX3kuX19pXzsKKyAgICAgICAgaWYgKCFfVlNURDo6ZXF1YWwoX194Ll9feF8gKyBfX3guX19pXywgX194Ll9feF8gKyAoX194Ll9faV8gKyBfX2opLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9feS5fX3hfICsgX195Ll9faV8pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIV9WU1REOjplcXVhbChfX3guX194XyArIChfX3guX19pXyArIF9faiksIF9feC5fX3hfICsgX05wLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9feS5fX3hfKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIF9WU1REOjplcXVhbChfX3guX194XywgX194Ll9feF8gKyBfX3guX19pXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9feS5fX3hfICsgKF9OcCAtIChfX3guX19pXyArIF9faikpKTsKKyAgICB9CisgICAgc2l6ZV90IF9faiA9IF9OcCAtIF9feC5fX2lfOworICAgIGlmICghX1ZTVEQ6OmVxdWFsKF9feS5fX3hfICsgX195Ll9faV8sIF9feS5fX3hfICsgKF9feS5fX2lfICsgX19qKSwKKyAgICAgICAgICAgICAgICAgICAgIF9feC5fX3hfICsgX194Ll9faV8pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFfVlNURDo6ZXF1YWwoX195Ll9feF8gKyAoX195Ll9faV8gKyBfX2opLCBfX3kuX194XyArIF9OcCwKKyAgICAgICAgICAgICAgICAgICAgIF9feC5fX3hfKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBfVlNURDo6ZXF1YWwoX195Ll9feF8sIF9feS5fX3hfICsgX195Ll9faV8sCisgICAgICAgICAgICAgICAgICAgICAgIF9feC5fX3hfICsgKF9OcCAtIChfX3kuX19pXyArIF9faikpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9VSW50LCBzaXplX3QgX1dwLCBzaXplX3QgX05wLCBzaXplX3QgX01wLCBzaXplX3QgX1JwLAorICAgICAgICAgIF9VSW50IF9BcCwgc2l6ZV90IF9VcCwgX1VJbnQgX0RwLCBzaXplX3QgX1NwLAorICAgICAgICAgIF9VSW50IF9CcCwgc2l6ZV90IF9UcCwgX1VJbnQgX0NwLCBzaXplX3QgX0xwLCBfVUludCBfRnA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludCwgX1dwLCBfTnAsIF9NcCwgX1JwLCBfQXAsIF9VcCwgX0RwLCBfU3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CcCwgX1RwLCBfQ3AsIF9McCwgX0ZwPiYgX194LAorICAgICAgICAgICBjb25zdCBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludCwgX1dwLCBfTnAsIF9NcCwgX1JwLCBfQXAsIF9VcCwgX0RwLCBfU3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CcCwgX1RwLCBfQ3AsIF9McCwgX0ZwPiYgX195KQoreworICAgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLAorICAgICAgICAgIGNsYXNzIF9VSW50LCBzaXplX3QgX1dwLCBzaXplX3QgX05wLCBzaXplX3QgX01wLCBzaXplX3QgX1JwLAorICAgICAgICAgIF9VSW50IF9BcCwgc2l6ZV90IF9VcCwgX1VJbnQgX0RwLCBzaXplX3QgX1NwLAorICAgICAgICAgIF9VSW50IF9CcCwgc2l6ZV90IF9UcCwgX1VJbnQgX0NwLCBzaXplX3QgX0xwLCBfVUludCBfRnA+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgY29uc3QgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnQsIF9XcCwgX05wLCBfTXAsIF9ScCwgX0FwLCBfVXAsIF9EcCwgX1NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQnAsIF9UcCwgX0NwLCBfTHAsIF9GcD4mIF9feCkKK3sKKyAgICBfX3NhdmVfZmxhZ3M8X0NoYXJULCBfVHJhaXRzPiBfX2x4KF9fb3MpOworICAgIF9fb3MuZmxhZ3MoaW9zX2Jhc2U6OmRlYyB8IGlvc19iYXNlOjpsZWZ0KTsKKyAgICBfQ2hhclQgX19zcCA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICBfX29zLmZpbGwoX19zcCk7CisgICAgX19vcyA8PCBfX3guX194X1tfX3guX19pX107CisgICAgZm9yIChzaXplX3QgX19qID0gX194Ll9faV8gKyAxOyBfX2ogPCBfTnA7ICsrX19qKQorICAgICAgICBfX29zIDw8IF9fc3AgPDwgX194Ll9feF9bX19qXTsKKyAgICBmb3IgKHNpemVfdCBfX2ogPSAwOyBfX2ogPCBfX3guX19pXzsgKytfX2opCisgICAgICAgIF9fb3MgPDwgX19zcCA8PCBfX3guX194X1tfX2pdOworICAgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLAorICAgICAgICAgIGNsYXNzIF9VSW50LCBzaXplX3QgX1dwLCBzaXplX3QgX05wLCBzaXplX3QgX01wLCBzaXplX3QgX1JwLAorICAgICAgICAgIF9VSW50IF9BcCwgc2l6ZV90IF9VcCwgX1VJbnQgX0RwLCBzaXplX3QgX1NwLAorICAgICAgICAgIF9VSW50IF9CcCwgc2l6ZV90IF9UcCwgX1VJbnQgX0NwLCBzaXplX3QgX0xwLCBfVUludCBfRnA+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnQsIF9XcCwgX05wLCBfTXAsIF9ScCwgX0FwLCBfVXAsIF9EcCwgX1NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQnAsIF9UcCwgX0NwLCBfTHAsIF9GcD4mIF9feCkKK3sKKyAgICBfX3NhdmVfZmxhZ3M8X0NoYXJULCBfVHJhaXRzPiBfX2x4KF9faXMpOworICAgIF9faXMuZmxhZ3MoaW9zX2Jhc2U6OmRlYyB8IGlvc19iYXNlOjpza2lwd3MpOworICAgIF9VSW50IF9fdFtfTnBdOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9OcDsgKytfX2kpCisgICAgICAgIF9faXMgPj4gX190W19faV07CisgICAgaWYgKCFfX2lzLmZhaWwoKSkKKyAgICB7CisgICAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9OcDsgKytfX2kpCisgICAgICAgICAgICBfX3guX194X1tfX2ldID0gX190W19faV07CisgICAgICAgIF9feC5fX2lfID0gMDsKKyAgICB9CisgICAgcmV0dXJuIF9faXM7Cit9CisKK3R5cGVkZWYgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8dWludF9mYXN0MzJfdCwgMzIsIDYyNCwgMzk3LCAzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5OTA4YjBkZiwgMTEsIDB4ZmZmZmZmZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsICAweDlkMmM1NjgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgMHhlZmM2MDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgsIDE4MTI0MzMyNTM+ICAgICAgICAgICAgICAgICAgICAgICAgIG10MTk5Mzc7Cit0eXBlZGVmIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPHVpbnRfZmFzdDY0X3QsIDY0LCAzMTIsIDE1NiwgMzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjUwMjZmNWFhOTY2MTllOVVMTCwgMjksIDB4NTU1NTU1NTU1NTU1NTU1NVVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcsIDB4NzFkNjdmZmZlZGE2MDAwMFVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcsIDB4ZmZmN2VlZTAwMDAwMDAwMFVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsIDYzNjQxMzYyMjM4NDY3OTMwMDVVTEw+ICAgICAgICAgIG10MTk5MzdfNjQ7CisKKy8vIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lCisKK3RlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgc2l6ZV90IF9fdywgc2l6ZV90IF9fcywgc2l6ZV90IF9fcj4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lOworCit0ZW1wbGF0ZTxjbGFzcyBfVUludCwgc2l6ZV90IF9XcCwgc2l6ZV90IF9TcCwgc2l6ZV90IF9ScD4KK2Jvb2wKK29wZXJhdG9yPT0oCisgICAgY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnQsIF9XcCwgX1NwLCBfUnA+JiBfX3gsCisgICAgY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnQsIF9XcCwgX1NwLCBfUnA+JiBfX3kpOworCit0ZW1wbGF0ZTxjbGFzcyBfVUludCwgc2l6ZV90IF9XcCwgc2l6ZV90IF9TcCwgc2l6ZV90IF9ScD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yIT0oCisgICAgY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnQsIF9XcCwgX1NwLCBfUnA+JiBfX3gsCisgICAgY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnQsIF9XcCwgX1NwLCBfUnA+JiBfX3kpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLAorICAgICAgICAgIGNsYXNzIF9VSW50LCBzaXplX3QgX1dwLCBzaXplX3QgX1NwLCBzaXplX3QgX1JwPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50LCBfV3AsIF9TcCwgX1JwPiYgX194KTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywKKyAgICAgICAgICBjbGFzcyBfVUludCwgc2l6ZV90IF9XcCwgc2l6ZV90IF9TcCwgc2l6ZV90IF9ScD4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorICAgICAgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludCwgX1dwLCBfU3AsIF9ScD4mIF9feCk7CisKK3RlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgc2l6ZV90IF9fdywgc2l6ZV90IF9fcywgc2l6ZV90IF9fcj4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIF9VSW50VHlwZSByZXN1bHRfdHlwZTsKKworcHJpdmF0ZToKKyAgICByZXN1bHRfdHlwZSBfX3hfW19fcl07CisgICAgcmVzdWx0X3R5cGUgIF9fY187CisgICAgc2l6ZV90ICAgICAgX19pXzsKKworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCByZXN1bHRfdHlwZSBfRHQgPSBudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46OmRpZ2l0czsKKyAgICBzdGF0aWNfYXNzZXJ0KCAgMCA8ICBfX3csICJzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZSBpbnZhbGlkIHBhcmFtZXRlcnMiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KF9fdyA8PSBfRHQsICJzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZSBpbnZhbGlkIHBhcmFtZXRlcnMiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCAgMCA8ICBfX3MsICJzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZSBpbnZhbGlkIHBhcmFtZXRlcnMiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KF9fcyA8ICBfX3IsICJzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZSBpbnZhbGlkIHBhcmFtZXRlcnMiKTsKK3B1YmxpYzoKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgcmVzdWx0X3R5cGUgX01pbiA9IDA7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHJlc3VsdF90eXBlIF9NYXggPSBfX3cgPT0gX0R0ID8gcmVzdWx0X3R5cGUofjApIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHRfdHlwZSgxKSA8PCBfX3cpIC0gcmVzdWx0X3R5cGUoMSk7CisgICAgc3RhdGljX2Fzc2VydChfTWluIDwgX01heCwgInN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lIGludmFsaWQgcGFyYW1ldGVycyIpOworCisgICAgLy8gZW5naW5lIGNoYXJhY3RlcmlzdGljcworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBzaXplX3Qgd29yZF9zaXplID0gX193OworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBzaXplX3Qgc2hvcnRfbGFnID0gX19zOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBzaXplX3QgbG9uZ19sYWcgPSBfX3I7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiByZXN1bHRfdHlwZSBtaW4oKSB7IHJldHVybiBfTWluOyB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiByZXN1bHRfdHlwZSBtYXgoKSB7IHJldHVybiBfTWF4OyB9CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHJlc3VsdF90eXBlIGRlZmF1bHRfc2VlZCA9IDE5NzgwNTAzdTsKKworICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgc2VlZGluZyBmdW5jdGlvbnMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUocmVzdWx0X3R5cGUgX19zZCA9IGRlZmF1bHRfc2VlZCkKKyAgICAgICAge3NlZWQoX19zZCk7fQorICAgIHRlbXBsYXRlPGNsYXNzIF9Tc2VxPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGV4cGxpY2l0IHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lKF9Tc2VxJiBfX3EsCisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3NlZWRfc2VxdWVuY2U8X1NzZXEsIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPjo6dmFsdWU+Ojp0eXBlKiA9IDApCisgICAgICAgIHtzZWVkKF9fcSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHNlZWQocmVzdWx0X3R5cGUgX19zZCA9IGRlZmF1bHRfc2VlZCkKKyAgICAgICAge3NlZWQoX19zZCwgaW50ZWdyYWxfY29uc3RhbnQ8dW5zaWduZWQsIDEgKyAoX193IC0gMSkgLyAzMj4oKSk7fQorICAgIHRlbXBsYXRlPGNsYXNzIF9Tc2VxPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICBfX2lzX3NlZWRfc2VxdWVuY2U8X1NzZXEsIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPjo6dmFsdWUsCisgICAgICAgICAgICB2b2lkCisgICAgICAgID46OnR5cGUKKyAgICAgICAgc2VlZChfU3NlcSYgX19xKQorICAgICAgICAgICAge19fc2VlZChfX3EsIGludGVncmFsX2NvbnN0YW50PHVuc2lnbmVkLCAxICsgKF9fdyAtIDEpIC8gMzI+KCkpO30KKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSgpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGRpc2NhcmQodW5zaWduZWQgbG9uZyBsb25nIF9feikge2ZvciAoOyBfX3o7IC0tX196KSBvcGVyYXRvcigpKCk7fQorCisgICAgdGVtcGxhdGU8Y2xhc3MgX1VJbnQsIHNpemVfdCBfV3AsIHNpemVfdCBfU3AsIHNpemVfdCBfUnA+CisgICAgZnJpZW5kCisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oCisgICAgICAgIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50LCBfV3AsIF9TcCwgX1JwPiYgX194LAorICAgICAgICBjb25zdCBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludCwgX1dwLCBfU3AsIF9ScD4mIF9feSk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVUludCwgc2l6ZV90IF9XcCwgc2l6ZV90IF9TcCwgc2l6ZV90IF9ScD4KKyAgICBmcmllbmQKKyAgICBib29sCisgICAgb3BlcmF0b3IhPSgKKyAgICAgICAgY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnQsIF9XcCwgX1NwLCBfUnA+JiBfX3gsCisgICAgICAgIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50LCBfV3AsIF9TcCwgX1JwPiYgX195KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsCisgICAgICAgICAgICAgIGNsYXNzIF9VSW50LCBzaXplX3QgX1dwLCBzaXplX3QgX1NwLCBzaXplX3QgX1JwPgorICAgIGZyaWVuZAorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgICAgIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50LCBfV3AsIF9TcCwgX1JwPiYgX194KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsCisgICAgICAgICAgICAgIGNsYXNzIF9VSW50LCBzaXplX3QgX1dwLCBzaXplX3QgX1NwLCBzaXplX3QgX1JwPgorICAgIGZyaWVuZAorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgICAgICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50LCBfV3AsIF9TcCwgX1JwPiYgX194KTsKKworcHJpdmF0ZToKKworICAgIHZvaWQgc2VlZChyZXN1bHRfdHlwZSBfX3NkLCBpbnRlZ3JhbF9jb25zdGFudDx1bnNpZ25lZCwgMT4pOworICAgIHZvaWQgc2VlZChyZXN1bHRfdHlwZSBfX3NkLCBpbnRlZ3JhbF9jb25zdGFudDx1bnNpZ25lZCwgMj4pOworICAgIHRlbXBsYXRlPGNsYXNzIF9Tc2VxPgorICAgICAgICB2b2lkIF9fc2VlZChfU3NlcSYgX19xLCBpbnRlZ3JhbF9jb25zdGFudDx1bnNpZ25lZCwgMT4pOworICAgIHRlbXBsYXRlPGNsYXNzIF9Tc2VxPgorICAgICAgICB2b2lkIF9fc2VlZChfU3NlcSYgX19xLCBpbnRlZ3JhbF9jb25zdGFudDx1bnNpZ25lZCwgMj4pOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19zLCBzaXplX3QgX19yPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHNpemVfdCBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19zLCBfX3I+Ojp3b3JkX3NpemU7CisKK3RlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgc2l6ZV90IF9fdywgc2l6ZV90IF9fcywgc2l6ZV90IF9fcj4KKyAgICBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBzaXplX3Qgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fcywgX19yPjo6c2hvcnRfbGFnOworCit0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX3MsIHNpemVfdCBfX3I+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90IHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX3MsIF9fcj46OmxvbmdfbGFnOworCit0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX3MsIHNpemVfdCBfX3I+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgdHlwZW5hbWUgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fcywgX19yPjo6cmVzdWx0X3R5cGUKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19zLCBfX3I+OjpkZWZhdWx0X3NlZWQ7CisKK3RlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgc2l6ZV90IF9fdywgc2l6ZV90IF9fcywgc2l6ZV90IF9fcj4KK3ZvaWQKK3N1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX3MsIF9fcj46OnNlZWQocmVzdWx0X3R5cGUgX19zZCwKKyAgICAgICAgaW50ZWdyYWxfY29uc3RhbnQ8dW5zaWduZWQsIDE+KQoreworICAgIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPHJlc3VsdF90eXBlLCA0MDAxNHUsIDB1LCAyMTQ3NDgzNTYzdT4KKyAgICAgICAgX19lKF9fc2QgPT0gMHUgPyBkZWZhdWx0X3NlZWQgOiBfX3NkKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3I7ICsrX19pKQorICAgICAgICBfX3hfW19faV0gPSBzdGF0aWNfY2FzdDxyZXN1bHRfdHlwZT4oX19lKCkgJiBfTWF4KTsKKyAgICBfX2NfID0gX194X1tfX3ItMV0gPT0gMDsKKyAgICBfX2lfID0gMDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19zLCBzaXplX3QgX19yPgordm9pZAorc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fcywgX19yPjo6c2VlZChyZXN1bHRfdHlwZSBfX3NkLAorICAgICAgICBpbnRlZ3JhbF9jb25zdGFudDx1bnNpZ25lZCwgMj4pCit7CisgICAgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8cmVzdWx0X3R5cGUsIDQwMDE0dSwgMHUsIDIxNDc0ODM1NjN1PgorICAgICAgICBfX2UoX19zZCA9PSAwdSA/IGRlZmF1bHRfc2VlZCA6IF9fc2QpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fcjsgKytfX2kpCisgICAgeworICAgICAgICByZXN1bHRfdHlwZSBfX2UwID0gX19lKCk7CisgICAgICAgIF9feF9bX19pXSA9IHN0YXRpY19jYXN0PHJlc3VsdF90eXBlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX2UwICsgKCh1aW50NjRfdClfX2UoKSA8PCAzMikpICYgX01heCk7CisgICAgfQorICAgIF9fY18gPSBfX3hfW19fci0xXSA9PSAwOworICAgIF9faV8gPSAwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX3MsIHNpemVfdCBfX3I+Cit0ZW1wbGF0ZTxjbGFzcyBfU3NlcT4KK3ZvaWQKK3N1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX3MsIF9fcj46Ol9fc2VlZChfU3NlcSYgX19xLAorICAgICAgICBpbnRlZ3JhbF9jb25zdGFudDx1bnNpZ25lZCwgMT4pCit7CisgICAgY29uc3QgdW5zaWduZWQgX19rID0gMTsKKyAgICB1aW50MzJfdCBfX2FyW19fciAqIF9fa107CisgICAgX19xLmdlbmVyYXRlKF9fYXIsIF9fYXIgKyBfX3IgKiBfX2spOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fcjsgKytfX2kpCisgICAgICAgIF9feF9bX19pXSA9IHN0YXRpY19jYXN0PHJlc3VsdF90eXBlPihfX2FyW19faV0gJiBfTWF4KTsKKyAgICBfX2NfID0gX194X1tfX3ItMV0gPT0gMDsKKyAgICBfX2lfID0gMDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19zLCBzaXplX3QgX19yPgordGVtcGxhdGU8Y2xhc3MgX1NzZXE+Cit2b2lkCitzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19zLCBfX3I+OjpfX3NlZWQoX1NzZXEmIF9fcSwKKyAgICAgICAgaW50ZWdyYWxfY29uc3RhbnQ8dW5zaWduZWQsIDI+KQoreworICAgIGNvbnN0IHVuc2lnbmVkIF9fayA9IDI7CisgICAgdWludDMyX3QgX19hcltfX3IgKiBfX2tdOworICAgIF9fcS5nZW5lcmF0ZShfX2FyLCBfX2FyICsgX19yICogX19rKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3I7ICsrX19pKQorICAgICAgICBfX3hfW19faV0gPSBzdGF0aWNfY2FzdDxyZXN1bHRfdHlwZT4oCisgICAgICAgICAgICAgICAgICAoX19hclsyICogX19pXSArICgodWludDY0X3QpX19hclsyICogX19pICsgMV0gPDwgMzIpKSAmIF9NYXgpOworICAgIF9fY18gPSBfX3hfW19fci0xXSA9PSAwOworICAgIF9faV8gPSAwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX3MsIHNpemVfdCBfX3I+CitfVUludFR5cGUKK3N1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX3MsIF9fcj46Om9wZXJhdG9yKCkoKQoreworICAgIGNvbnN0IHJlc3VsdF90eXBlJiBfX3hzID0gX194X1soX19pXyArIChfX3IgLSBfX3MpKSAlIF9fcl07CisgICAgcmVzdWx0X3R5cGUmIF9feHIgPSBfX3hfW19faV9dOworICAgIHJlc3VsdF90eXBlIF9fbmV3X2MgPSBfX2NfID09IDAgPyBfX3hzIDwgX194ciA6IF9feHMgIT0gMCA/IF9feHMgPD0gX194ciA6IDE7CisgICAgX194ciA9IChfX3hzIC0gX194ciAtIF9fY18pICYgX01heDsKKyAgICBfX2NfID0gX19uZXdfYzsKKyAgICBfX2lfID0gKF9faV8gKyAxKSAlIF9fcjsKKyAgICByZXR1cm4gX194cjsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1VJbnQsIHNpemVfdCBfV3AsIHNpemVfdCBfU3AsIHNpemVfdCBfUnA+Citib29sCitvcGVyYXRvcj09KAorICAgIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50LCBfV3AsIF9TcCwgX1JwPiYgX194LAorICAgIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50LCBfV3AsIF9TcCwgX1JwPiYgX195KQoreworICAgIGlmIChfX3guX19jXyAhPSBfX3kuX19jXykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChfX3guX19pXyA9PSBfX3kuX19pXykKKyAgICAgICAgcmV0dXJuIF9WU1REOjplcXVhbChfX3guX194XywgX194Ll9feF8gKyBfUnAsIF9feS5fX3hfKTsKKyAgICBpZiAoX194Ll9faV8gPT0gMCB8fCBfX3kuX19pXyA9PSAwKQorICAgIHsKKyAgICAgICAgc2l6ZV90IF9faiA9IF9WU1REOjptaW4oX1JwIC0gX194Ll9faV8sIF9ScCAtIF9feS5fX2lfKTsKKyAgICAgICAgaWYgKCFfVlNURDo6ZXF1YWwoX194Ll9feF8gKyBfX3guX19pXywgX194Ll9feF8gKyBfX3guX19pXyArIF9faiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX3kuX194XyArIF9feS5fX2lfKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKF9feC5fX2lfID09IDApCisgICAgICAgICAgICByZXR1cm4gX1ZTVEQ6OmVxdWFsKF9feC5fX3hfICsgX19qLCBfX3guX194XyArIF9ScCwgX195Ll9feF8pOworICAgICAgICByZXR1cm4gX1ZTVEQ6OmVxdWFsKF9feC5fX3hfLCBfX3guX194XyArIChfUnAgLSBfX2opLCBfX3kuX194XyArIF9faik7CisgICAgfQorICAgIGlmIChfX3guX19pXyA8IF9feS5fX2lfKQorICAgIHsKKyAgICAgICAgc2l6ZV90IF9faiA9IF9ScCAtIF9feS5fX2lfOworICAgICAgICBpZiAoIV9WU1REOjplcXVhbChfX3guX194XyArIF9feC5fX2lfLCBfX3guX194XyArIChfX3guX19pXyArIF9faiksCisgICAgICAgICAgICAgICAgICAgICAgICAgX195Ll9feF8gKyBfX3kuX19pXykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghX1ZTVEQ6OmVxdWFsKF9feC5fX3hfICsgKF9feC5fX2lfICsgX19qKSwgX194Ll9feF8gKyBfUnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgX195Ll9feF8pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gX1ZTVEQ6OmVxdWFsKF9feC5fX3hfLCBfX3guX194XyArIF9feC5fX2lfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX195Ll9feF8gKyAoX1JwIC0gKF9feC5fX2lfICsgX19qKSkpOworICAgIH0KKyAgICBzaXplX3QgX19qID0gX1JwIC0gX194Ll9faV87CisgICAgaWYgKCFfVlNURDo6ZXF1YWwoX195Ll9feF8gKyBfX3kuX19pXywgX195Ll9feF8gKyAoX195Ll9faV8gKyBfX2opLAorICAgICAgICAgICAgICAgICAgICAgX194Ll9feF8gKyBfX3guX19pXykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIV9WU1REOjplcXVhbChfX3kuX194XyArIChfX3kuX19pXyArIF9faiksIF9feS5fX3hfICsgX1JwLAorICAgICAgICAgICAgICAgICAgICAgX194Ll9feF8pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIF9WU1REOjplcXVhbChfX3kuX194XywgX195Ll9feF8gKyBfX3kuX19pXywKKyAgICAgICAgICAgICAgICAgICAgICAgX194Ll9feF8gKyAoX1JwIC0gKF9feS5fX2lfICsgX19qKSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVUludCwgc2l6ZV90IF9XcCwgc2l6ZV90IF9TcCwgc2l6ZV90IF9ScD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KAorICAgIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50LCBfV3AsIF9TcCwgX1JwPiYgX194LAorICAgIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50LCBfV3AsIF9TcCwgX1JwPiYgX195KQoreworICAgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLAorICAgICAgICAgIGNsYXNzIF9VSW50LCBzaXplX3QgX1dwLCBzaXplX3QgX1NwLCBzaXplX3QgX1JwPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50LCBfV3AsIF9TcCwgX1JwPiYgX194KQoreworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19vcyk7CisgICAgX19vcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OmxlZnQpOworICAgIF9DaGFyVCBfX3NwID0gX19vcy53aWRlbignICcpOworICAgIF9fb3MuZmlsbChfX3NwKTsKKyAgICBfX29zIDw8IF9feC5fX3hfW19feC5fX2lfXTsKKyAgICBmb3IgKHNpemVfdCBfX2ogPSBfX3guX19pXyArIDE7IF9faiA8IF9ScDsgKytfX2opCisgICAgICAgIF9fb3MgPDwgX19zcCA8PCBfX3guX194X1tfX2pdOworICAgIGZvciAoc2l6ZV90IF9faiA9IDA7IF9faiA8IF9feC5fX2lfOyArK19faikKKyAgICAgICAgX19vcyA8PCBfX3NwIDw8IF9feC5fX3hfW19fal07CisgICAgX19vcyA8PCBfX3NwIDw8IF9feC5fX2NfOworICAgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLAorICAgICAgICAgIGNsYXNzIF9VSW50LCBzaXplX3QgX1dwLCBzaXplX3QgX1NwLCBzaXplX3QgX1JwPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50LCBfV3AsIF9TcCwgX1JwPiYgX194KQoreworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19pcyk7CisgICAgX19pcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OnNraXB3cyk7CisgICAgX1VJbnQgX190W19ScCsxXTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfUnArMTsgKytfX2kpCisgICAgICAgIF9faXMgPj4gX190W19faV07CisgICAgaWYgKCFfX2lzLmZhaWwoKSkKKyAgICB7CisgICAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9ScDsgKytfX2kpCisgICAgICAgICAgICBfX3guX194X1tfX2ldID0gX190W19faV07CisgICAgICAgIF9feC5fX2NfID0gX190W19ScF07CisgICAgICAgIF9feC5fX2lfID0gMDsKKyAgICB9CisgICAgcmV0dXJuIF9faXM7Cit9CisKK3R5cGVkZWYgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8dWludF9mYXN0MzJfdCwgMjQsIDEwLCAyND4gICAgIHJhbmx1eDI0X2Jhc2U7Cit0eXBlZGVmIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPHVpbnRfZmFzdDY0X3QsIDQ4LCAgNSwgMTI+ICAgICByYW5sdXg0OF9iYXNlOworCisvLyBkaXNjYXJkX2Jsb2NrX2VuZ2luZQorCit0ZW1wbGF0ZTxjbGFzcyBfRW5naW5lLCBzaXplX3QgX19wLCBzaXplX3QgX19yPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgZGlzY2FyZF9ibG9ja19lbmdpbmUKK3sKKyAgICBfRW5naW5lIF9fZV87CisgICAgaW50ICAgICBfX25fOworCisgICAgc3RhdGljX2Fzc2VydCggIDAgPCAgX19yLCAiZGlzY2FyZF9ibG9ja19lbmdpbmUgaW52YWxpZCBwYXJhbWV0ZXJzIik7CisgICAgc3RhdGljX2Fzc2VydChfX3IgPD0gX19wLCAiZGlzY2FyZF9ibG9ja19lbmdpbmUgaW52YWxpZCBwYXJhbWV0ZXJzIik7CisgICAgc3RhdGljX2Fzc2VydChfX3IgPD0gSU5UX01BWCwgImRpc2NhcmRfYmxvY2tfZW5naW5lIGludmFsaWQgcGFyYW1ldGVycyIpOworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRW5naW5lOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKKworICAgIC8vIGVuZ2luZSBjaGFyYWN0ZXJpc3RpY3MKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90IGJsb2NrX3NpemUgPSBfX3A7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHNpemVfdCB1c2VkX2Jsb2NrID0gX19yOworCisjaWZkZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgc3RhdGljIGNvbnN0IHJlc3VsdF90eXBlIF9NaW4gPSBfRW5naW5lOjpfTWluOworICAgIHN0YXRpYyBjb25zdCByZXN1bHRfdHlwZSBfTWF4ID0gX0VuZ2luZTo6X01heDsKKyNlbHNlCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHJlc3VsdF90eXBlIF9NaW4gPSBfRW5naW5lOjptaW4oKTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgcmVzdWx0X3R5cGUgX01heCA9IF9FbmdpbmU6Om1heCgpOworI2VuZGlmCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHJlc3VsdF90eXBlIG1pbigpIHsgcmV0dXJuIF9FbmdpbmU6Om1pbigpOyB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiByZXN1bHRfdHlwZSBtYXgoKSB7IHJldHVybiBfRW5naW5lOjptYXgoKTsgfQorCisgICAgLy8gY29uc3RydWN0b3JzIGFuZCBzZWVkaW5nIGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBkaXNjYXJkX2Jsb2NrX2VuZ2luZSgpIDogX19uXygwKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBkaXNjYXJkX2Jsb2NrX2VuZ2luZShjb25zdCBfRW5naW5lJiBfX2UpCisgICAgICAgIDogX19lXyhfX2UpLCBfX25fKDApIHt9CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBkaXNjYXJkX2Jsb2NrX2VuZ2luZShfRW5naW5lJiYgX19lKQorICAgICAgICA6IF9fZV8oX1ZTVEQ6Om1vdmUoX19lKSksIF9fbl8oMCkge30KKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IGRpc2NhcmRfYmxvY2tfZW5naW5lKHJlc3VsdF90eXBlIF9fc2QpIDogX19lXyhfX3NkKSwgX19uXygwKSB7fQorICAgIHRlbXBsYXRlPGNsYXNzIF9Tc2VxPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGV4cGxpY2l0IGRpc2NhcmRfYmxvY2tfZW5naW5lKF9Tc2VxJiBfX3EsCisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3NlZWRfc2VxdWVuY2U8X1NzZXEsIGRpc2NhcmRfYmxvY2tfZW5naW5lPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc19jb252ZXJ0aWJsZTxfU3NlcSwgX0VuZ2luZT46OnZhbHVlPjo6dHlwZSogPSAwKQorICAgICAgICA6IF9fZV8oX19xKSwgX19uXygwKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHNlZWQoKSB7X19lXy5zZWVkKCk7IF9fbl8gPSAwO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzZWVkKHJlc3VsdF90eXBlIF9fc2QpIHtfX2VfLnNlZWQoX19zZCk7IF9fbl8gPSAwO30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfU3NlcT4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgX19pc19zZWVkX3NlcXVlbmNlPF9Tc2VxLCBkaXNjYXJkX2Jsb2NrX2VuZ2luZT46OnZhbHVlLAorICAgICAgICAgICAgdm9pZAorICAgICAgICA+Ojp0eXBlCisgICAgICAgIHNlZWQoX1NzZXEmIF9fcSkge19fZV8uc2VlZChfX3EpOyBfX25fID0gMDt9CisKKyAgICAvLyBnZW5lcmF0aW5nIGZ1bmN0aW9ucworICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBkaXNjYXJkKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3opIHtmb3IgKDsgX196OyAtLV9feikgb3BlcmF0b3IoKSgpO30KKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdCBfRW5naW5lJiBiYXNlKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX19lXzt9CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfRW5nLCBzaXplX3QgX1BwLCBzaXplX3QgX1JwPgorICAgIGZyaWVuZAorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KAorICAgICAgICBjb25zdCBkaXNjYXJkX2Jsb2NrX2VuZ2luZTxfRW5nLCBfUHAsIF9ScD4mIF9feCwKKyAgICAgICAgY29uc3QgZGlzY2FyZF9ibG9ja19lbmdpbmU8X0VuZywgX1BwLCBfUnA+JiBfX3kpOworCisgICAgdGVtcGxhdGU8Y2xhc3MgX0VuZywgc2l6ZV90IF9QcCwgc2l6ZV90IF9ScD4KKyAgICBmcmllbmQKKyAgICBib29sCisgICAgb3BlcmF0b3IhPSgKKyAgICAgICAgY29uc3QgZGlzY2FyZF9ibG9ja19lbmdpbmU8X0VuZywgX1BwLCBfUnA+JiBfX3gsCisgICAgICAgIGNvbnN0IGRpc2NhcmRfYmxvY2tfZW5naW5lPF9FbmcsIF9QcCwgX1JwPiYgX195KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsCisgICAgICAgICAgICAgIGNsYXNzIF9FbmcsIHNpemVfdCBfUHAsIHNpemVfdCBfUnA+CisgICAgZnJpZW5kCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorICAgICAgICAgICAgICAgY29uc3QgZGlzY2FyZF9ibG9ja19lbmdpbmU8X0VuZywgX1BwLCBfUnA+JiBfX3gpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywKKyAgICAgICAgICAgICAgY2xhc3MgX0VuZywgc2l6ZV90IF9QcCwgc2l6ZV90IF9ScD4KKyAgICBmcmllbmQKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgICAgICBkaXNjYXJkX2Jsb2NrX2VuZ2luZTxfRW5nLCBfUHAsIF9ScD4mIF9feCk7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfRW5naW5lLCBzaXplX3QgX19wLCBzaXplX3QgX19yPgorICAgIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHNpemVfdCBkaXNjYXJkX2Jsb2NrX2VuZ2luZTxfRW5naW5lLCBfX3AsIF9fcj46OmJsb2NrX3NpemU7CisKK3RlbXBsYXRlPGNsYXNzIF9FbmdpbmUsIHNpemVfdCBfX3AsIHNpemVfdCBfX3I+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90IGRpc2NhcmRfYmxvY2tfZW5naW5lPF9FbmdpbmUsIF9fcCwgX19yPjo6dXNlZF9ibG9jazsKKwordGVtcGxhdGU8Y2xhc3MgX0VuZ2luZSwgc2l6ZV90IF9fcCwgc2l6ZV90IF9fcj4KK3R5cGVuYW1lIGRpc2NhcmRfYmxvY2tfZW5naW5lPF9FbmdpbmUsIF9fcCwgX19yPjo6cmVzdWx0X3R5cGUKK2Rpc2NhcmRfYmxvY2tfZW5naW5lPF9FbmdpbmUsIF9fcCwgX19yPjo6b3BlcmF0b3IoKSgpCit7CisgICAgaWYgKF9fbl8gPj0gc3RhdGljX2Nhc3Q8aW50PihfX3IpKQorICAgIHsKKyAgICAgICAgX19lXy5kaXNjYXJkKF9fcCAtIF9fcik7CisgICAgICAgIF9fbl8gPSAwOworICAgIH0KKyAgICArK19fbl87CisgICAgcmV0dXJuIF9fZV8oKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0VuZywgc2l6ZV90IF9QcCwgc2l6ZV90IF9ScD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj09KGNvbnN0IGRpc2NhcmRfYmxvY2tfZW5naW5lPF9FbmcsIF9QcCwgX1JwPiYgX194LAorICAgICAgICAgICBjb25zdCBkaXNjYXJkX2Jsb2NrX2VuZ2luZTxfRW5nLCBfUHAsIF9ScD4mIF9feSkKK3sKKyAgICByZXR1cm4gX194Ll9fbl8gPT0gX195Ll9fbl8gJiYgX194Ll9fZV8gPT0gX195Ll9fZV87Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9FbmcsIHNpemVfdCBfUHAsIHNpemVfdCBfUnA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBkaXNjYXJkX2Jsb2NrX2VuZ2luZTxfRW5nLCBfUHAsIF9ScD4mIF9feCwKKyAgICAgICAgICAgY29uc3QgZGlzY2FyZF9ibG9ja19lbmdpbmU8X0VuZywgX1BwLCBfUnA+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194ID09IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsCisgICAgICAgICAgY2xhc3MgX0VuZywgc2l6ZV90IF9QcCwgc2l6ZV90IF9ScD4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorICAgICAgICAgICBjb25zdCBkaXNjYXJkX2Jsb2NrX2VuZ2luZTxfRW5nLCBfUHAsIF9ScD4mIF9feCkKK3sKKyAgICBfX3NhdmVfZmxhZ3M8X0NoYXJULCBfVHJhaXRzPiBfX2x4KF9fb3MpOworICAgIF9fb3MuZmxhZ3MoaW9zX2Jhc2U6OmRlYyB8IGlvc19iYXNlOjpsZWZ0KTsKKyAgICBfQ2hhclQgX19zcCA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICBfX29zLmZpbGwoX19zcCk7CisgICAgcmV0dXJuIF9fb3MgPDwgX194Ll9fZV8gPDwgX19zcCA8PCBfX3guX19uXzsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywKKyAgICAgICAgICBjbGFzcyBfRW5nLCBzaXplX3QgX1BwLCBzaXplX3QgX1JwPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgIGRpc2NhcmRfYmxvY2tfZW5naW5lPF9FbmcsIF9QcCwgX1JwPiYgX194KQoreworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19pcyk7CisgICAgX19pcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OnNraXB3cyk7CisgICAgX0VuZyBfX2U7CisgICAgaW50IF9fbjsKKyAgICBfX2lzID4+IF9fZSA+PiBfX247CisgICAgaWYgKCFfX2lzLmZhaWwoKSkKKyAgICB7CisgICAgICAgIF9feC5fX2VfID0gX19lOworICAgICAgICBfX3guX19uXyA9IF9fbjsKKyAgICB9CisgICAgcmV0dXJuIF9faXM7Cit9CisKK3R5cGVkZWYgZGlzY2FyZF9ibG9ja19lbmdpbmU8cmFubHV4MjRfYmFzZSwgMjIzLCAyMz4gcmFubHV4MjQ7Cit0eXBlZGVmIGRpc2NhcmRfYmxvY2tfZW5naW5lPHJhbmx1eDQ4X2Jhc2UsIDM4OSwgMTE+IHJhbmx1eDQ4OworCisvLyBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZQorCit0ZW1wbGF0ZTxjbGFzcyBfRW5naW5lLCBzaXplX3QgX193LCBjbGFzcyBfVUludFR5cGU+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZQoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfVUludCwgX1VJbnQgX1IwLCBzaXplX3QgX1dwLCBzaXplX3QgX01wPgorICAgIGNsYXNzIF9fZ2V0X24KKyAgICB7CisgICAgICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBzaXplX3QgX0R0ID0gbnVtZXJpY19saW1pdHM8X1VJbnQ+OjpkaWdpdHM7CisgICAgICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBzaXplX3QgX05wID0gX1dwIC8gX01wICsgKF9XcCAlIF9NcCAhPSAwKTsKKyAgICAgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHNpemVfdCBfVzAgPSBfV3AgLyBfTnA7CisgICAgICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBfVUludCBfWTAgPSBfVzAgPj0gX0R0ID8gMCA6IChfUjAgPj4gX1cwKSA8PCBfVzA7CisgICAgcHVibGljOgorICAgICAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90IHZhbHVlID0gX1IwIC0gX1kwID4gX1kwIC8gX05wID8gX05wICsgMSA6IF9OcDsKKyAgICB9OworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBfVUludFR5cGUgcmVzdWx0X3R5cGU7CisKK3ByaXZhdGU6CisgICAgX0VuZ2luZSBfX2VfOworCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHJlc3VsdF90eXBlIF9EdCA9IG51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6ZGlnaXRzOworICAgIHN0YXRpY19hc3NlcnQoICAwIDwgIF9fdywgImluZGVwZW5kZW50X2JpdHNfZW5naW5lIGludmFsaWQgcGFyYW1ldGVycyIpOworICAgIHN0YXRpY19hc3NlcnQoX193IDw9IF9EdCwgImluZGVwZW5kZW50X2JpdHNfZW5naW5lIGludmFsaWQgcGFyYW1ldGVycyIpOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRW5naW5lOjpyZXN1bHRfdHlwZSBfRW5naW5lX3Jlc3VsdF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWwKKyAgICAgICAgPAorICAgICAgICAgICAgc2l6ZW9mKF9FbmdpbmVfcmVzdWx0X3R5cGUpIDw9IHNpemVvZihyZXN1bHRfdHlwZSksCisgICAgICAgICAgICAgICAgcmVzdWx0X3R5cGUsCisgICAgICAgICAgICAgICAgX0VuZ2luZV9yZXN1bHRfdHlwZQorICAgICAgICA+Ojp0eXBlIF9Xb3JraW5nX3Jlc3VsdF90eXBlOworI2lmZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHN0YXRpYyBjb25zdCBfV29ya2luZ19yZXN1bHRfdHlwZSBfUnAgPSBfRW5naW5lOjpfTWF4IC0gX0VuZ2luZTo6X01pbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfV29ya2luZ19yZXN1bHRfdHlwZSgxKTsKKyNlbHNlCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IF9Xb3JraW5nX3Jlc3VsdF90eXBlIF9ScCA9IF9FbmdpbmU6Om1heCgpIC0gX0VuZ2luZTo6bWluKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX1dvcmtpbmdfcmVzdWx0X3R5cGUoMSk7CisjZW5kaWYKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90IF9fbSA9IF9fbG9nMjxfV29ya2luZ19yZXN1bHRfdHlwZSwgX1JwPjo6dmFsdWU7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHNpemVfdCBfX24gPSBfX2dldF9uPF9Xb3JraW5nX3Jlc3VsdF90eXBlLCBfUnAsIF9fdywgX19tPjo6dmFsdWU7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHNpemVfdCBfX3cwID0gX193IC8gX19uOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBzaXplX3QgX19uMCA9IF9fbiAtIF9fdyAlIF9fbjsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90IF9XRHQgPSBudW1lcmljX2xpbWl0czxfV29ya2luZ19yZXN1bHRfdHlwZT46OmRpZ2l0czsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90IF9FRHQgPSBudW1lcmljX2xpbWl0czxfRW5naW5lX3Jlc3VsdF90eXBlPjo6ZGlnaXRzOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBfV29ya2luZ19yZXN1bHRfdHlwZSBfX3kwID0gX193MCA+PSBfV0R0ID8gMCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX1JwID4+IF9fdzApIDw8IF9fdzA7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IF9Xb3JraW5nX3Jlc3VsdF90eXBlIF9feTEgPSBfX3cwID49IF9XRHQgLSAxID8gMCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX1JwID4+IChfX3cwKzEpKSA8PCAoX193MCsxKTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgX0VuZ2luZV9yZXN1bHRfdHlwZSBfX21hc2swID0gX193MCA+IDAgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRW5naW5lX3Jlc3VsdF90eXBlKH4wKSA+PiAoX0VEdCAtIF9fdzApIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0VuZ2luZV9yZXN1bHRfdHlwZSgwKTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgX0VuZ2luZV9yZXN1bHRfdHlwZSBfX21hc2sxID0gX193MCA8IF9FRHQgLSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0VuZ2luZV9yZXN1bHRfdHlwZSh+MCkgPj4gKF9FRHQgLSAoX193MCArIDEpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9FbmdpbmVfcmVzdWx0X3R5cGUofjApOworcHVibGljOgorICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCByZXN1bHRfdHlwZSBfTWluID0gMDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgcmVzdWx0X3R5cGUgX01heCA9IF9fdyA9PSBfRHQgPyByZXN1bHRfdHlwZSh+MCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3VsdF90eXBlKDEpIDw8IF9fdykgLSByZXN1bHRfdHlwZSgxKTsKKyAgICBzdGF0aWNfYXNzZXJ0KF9NaW4gPCBfTWF4LCAiaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgaW52YWxpZCBwYXJhbWV0ZXJzIik7CisKKyAgICAvLyBlbmdpbmUgY2hhcmFjdGVyaXN0aWNzCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiByZXN1bHRfdHlwZSBtaW4oKSB7IHJldHVybiBfTWluOyB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiByZXN1bHRfdHlwZSBtYXgoKSB7IHJldHVybiBfTWF4OyB9CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIHNlZWRpbmcgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGluZGVwZW5kZW50X2JpdHNfZW5naW5lKCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgaW5kZXBlbmRlbnRfYml0c19lbmdpbmUoY29uc3QgX0VuZ2luZSYgX19lKQorICAgICAgICA6IF9fZV8oX19lKSB7fQorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgaW5kZXBlbmRlbnRfYml0c19lbmdpbmUoX0VuZ2luZSYmIF9fZSkKKyAgICAgICAgOiBfX2VfKF9WU1REOjptb3ZlKF9fZSkpIHt9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZShyZXN1bHRfdHlwZSBfX3NkKSA6IF9fZV8oX19zZCkge30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfU3NlcT4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBleHBsaWNpdCBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZShfU3NlcSYgX19xLAorICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19zZWVkX3NlcXVlbmNlPF9Tc2VxLCBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZT46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNfY29udmVydGlibGU8X1NzZXEsIF9FbmdpbmU+Ojp2YWx1ZT46OnR5cGUqID0gMCkKKyAgICAgICAgIDogX19lXyhfX3EpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc2VlZCgpIHtfX2VfLnNlZWQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc2VlZChyZXN1bHRfdHlwZSBfX3NkKSB7X19lXy5zZWVkKF9fc2QpO30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfU3NlcT4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgX19pc19zZWVkX3NlcXVlbmNlPF9Tc2VxLCBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZT46OnZhbHVlLAorICAgICAgICAgICAgdm9pZAorICAgICAgICA+Ojp0eXBlCisgICAgICAgIHNlZWQoX1NzZXEmIF9fcSkge19fZV8uc2VlZChfX3EpO30KKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoKSB7cmV0dXJuIF9fZXZhbChpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfUnAgIT0gMD4oKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGRpc2NhcmQodW5zaWduZWQgbG9uZyBsb25nIF9feikge2ZvciAoOyBfX3o7IC0tX196KSBvcGVyYXRvcigpKCk7fQorCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IF9FbmdpbmUmIGJhc2UoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX2VfO30KKworICAgIHRlbXBsYXRlPGNsYXNzIF9FbmcsIHNpemVfdCBfV3AsIGNsYXNzIF9VSW50PgorICAgIGZyaWVuZAorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KAorICAgICAgICBjb25zdCBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZTxfRW5nLCBfV3AsIF9VSW50PiYgX194LAorICAgICAgICBjb25zdCBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZTxfRW5nLCBfV3AsIF9VSW50PiYgX195KTsKKworICAgIHRlbXBsYXRlPGNsYXNzIF9FbmcsIHNpemVfdCBfV3AsIGNsYXNzIF9VSW50PgorICAgIGZyaWVuZAorICAgIGJvb2wKKyAgICBvcGVyYXRvciE9KAorICAgICAgICBjb25zdCBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZTxfRW5nLCBfV3AsIF9VSW50PiYgX194LAorICAgICAgICBjb25zdCBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZTxfRW5nLCBfV3AsIF9VSW50PiYgX195KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsCisgICAgICAgICAgICAgIGNsYXNzIF9FbmcsIHNpemVfdCBfV3AsIGNsYXNzIF9VSW50PgorICAgIGZyaWVuZAorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgICAgIGNvbnN0IGluZGVwZW5kZW50X2JpdHNfZW5naW5lPF9FbmcsIF9XcCwgX1VJbnQ+JiBfX3gpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywKKyAgICAgICAgICAgICAgY2xhc3MgX0VuZywgc2l6ZV90IF9XcCwgY2xhc3MgX1VJbnQ+CisgICAgZnJpZW5kCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorICAgICAgICAgICAgICAgaW5kZXBlbmRlbnRfYml0c19lbmdpbmU8X0VuZywgX1dwLCBfVUludD4mIF9feCk7CisKK3ByaXZhdGU6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIF9fZXZhbChmYWxzZV90eXBlKTsKKyAgICByZXN1bHRfdHlwZSBfX2V2YWwodHJ1ZV90eXBlKTsKKworICAgIHRlbXBsYXRlIDxzaXplX3QgX19jb3VudD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBzdGF0aWMKKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIF9fY291bnQgPCBfRHQsCisgICAgICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICA+Ojp0eXBlCisgICAgICAgIF9fbHNoaWZ0KHJlc3VsdF90eXBlIF9feCkge3JldHVybiBfX3ggPDwgX19jb3VudDt9CisKKyAgICB0ZW1wbGF0ZSA8c2l6ZV90IF9fY291bnQ+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgc3RhdGljCisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICAoX19jb3VudCA+PSBfRHQpLAorICAgICAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBfX2xzaGlmdChyZXN1bHRfdHlwZSkge3JldHVybiByZXN1bHRfdHlwZSgwKTt9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfRW5naW5lLCBzaXplX3QgX193LCBjbGFzcyBfVUludFR5cGU+CitpbmxpbmUKK19VSW50VHlwZQoraW5kZXBlbmRlbnRfYml0c19lbmdpbmU8X0VuZ2luZSwgX193LCBfVUludFR5cGU+OjpfX2V2YWwoZmFsc2VfdHlwZSkKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8cmVzdWx0X3R5cGU+KF9fZV8oKSAmIF9fbWFzazApOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRW5naW5lLCBzaXplX3QgX193LCBjbGFzcyBfVUludFR5cGU+CitfVUludFR5cGUKK2luZGVwZW5kZW50X2JpdHNfZW5naW5lPF9FbmdpbmUsIF9fdywgX1VJbnRUeXBlPjo6X19ldmFsKHRydWVfdHlwZSkKK3sKKyAgICByZXN1bHRfdHlwZSBfU3AgPSAwOworICAgIGZvciAoc2l6ZV90IF9fayA9IDA7IF9fayA8IF9fbjA7ICsrX19rKQorICAgIHsKKyAgICAgICAgX0VuZ2luZV9yZXN1bHRfdHlwZSBfX3U7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fdSA9IF9fZV8oKSAtIF9FbmdpbmU6Om1pbigpOworICAgICAgICB9IHdoaWxlIChfX3UgPj0gX195MCk7CisgICAgICAgIF9TcCA9IHN0YXRpY19jYXN0PHJlc3VsdF90eXBlPihfX2xzaGlmdDxfX3cwPihfU3ApICsgKF9fdSAmIF9fbWFzazApKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgX19rID0gX19uMDsgX19rIDwgX19uOyArK19faykKKyAgICB7CisgICAgICAgIF9FbmdpbmVfcmVzdWx0X3R5cGUgX191OworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBfX3UgPSBfX2VfKCkgLSBfRW5naW5lOjptaW4oKTsKKyAgICAgICAgfSB3aGlsZSAoX191ID49IF9feTEpOworICAgICAgICBfU3AgPSBzdGF0aWNfY2FzdDxyZXN1bHRfdHlwZT4oX19sc2hpZnQ8X193MCsxPihfU3ApICsgKF9fdSAmIF9fbWFzazEpKTsKKyAgICB9CisgICAgcmV0dXJuIF9TcDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0VuZywgc2l6ZV90IF9XcCwgY2xhc3MgX1VJbnQ+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I9PSgKKyAgICBjb25zdCBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZTxfRW5nLCBfV3AsIF9VSW50PiYgX194LAorICAgIGNvbnN0IGluZGVwZW5kZW50X2JpdHNfZW5naW5lPF9FbmcsIF9XcCwgX1VJbnQ+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5iYXNlKCkgPT0gX195LmJhc2UoKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0VuZywgc2l6ZV90IF9XcCwgY2xhc3MgX1VJbnQ+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPSgKKyAgICBjb25zdCBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZTxfRW5nLCBfV3AsIF9VSW50PiYgX194LAorICAgIGNvbnN0IGluZGVwZW5kZW50X2JpdHNfZW5naW5lPF9FbmcsIF9XcCwgX1VJbnQ+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194ID09IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsCisgICAgICAgICAgY2xhc3MgX0VuZywgc2l6ZV90IF9XcCwgY2xhc3MgX1VJbnQ+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgY29uc3QgaW5kZXBlbmRlbnRfYml0c19lbmdpbmU8X0VuZywgX1dwLCBfVUludD4mIF9feCkKK3sKKyAgICByZXR1cm4gX19vcyA8PCBfX3guYmFzZSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLAorICAgICAgICAgIGNsYXNzIF9FbmcsIHNpemVfdCBfV3AsIGNsYXNzIF9VSW50PgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgIGluZGVwZW5kZW50X2JpdHNfZW5naW5lPF9FbmcsIF9XcCwgX1VJbnQ+JiBfX3gpCit7CisgICAgX0VuZyBfX2U7CisgICAgX19pcyA+PiBfX2U7CisgICAgaWYgKCFfX2lzLmZhaWwoKSkKKyAgICAgICAgX194Ll9fZV8gPSBfX2U7CisgICAgcmV0dXJuIF9faXM7Cit9CisKKy8vIHNodWZmbGVfb3JkZXJfZW5naW5lCisKK3RlbXBsYXRlIDx1aW50NjRfdCBfWHAsIHVpbnQ2NF90IF9ZcD4KK3N0cnVjdCBfX3VnY2QKK3sKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgdWludDY0X3QgdmFsdWUgPSBfX3VnY2Q8X1lwLCBfWHAgJSBfWXA+Ojp2YWx1ZTsKK307CisKK3RlbXBsYXRlIDx1aW50NjRfdCBfWHA+CitzdHJ1Y3QgX191Z2NkPF9YcCwgMD4KK3sKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgdWludDY0X3QgdmFsdWUgPSBfWHA7Cit9OworCit0ZW1wbGF0ZSA8dWludDY0X3QgX05wLCB1aW50NjRfdCBfRHA+CitjbGFzcyBfX3VyYXRpbworeworICAgIHN0YXRpY19hc3NlcnQoX0RwICE9IDAsICJfX3VyYXRpbyBkaXZpZGUgYnkgMCIpOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCB1aW50NjRfdCBfX2djZCA9IF9fdWdjZDxfTnAsIF9EcD46OnZhbHVlOworcHVibGljOgorICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCB1aW50NjRfdCBudW0gPSBfTnAgLyBfX2djZDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgdWludDY0X3QgZGVuID0gX0RwIC8gX19nY2Q7CisKKyAgICB0eXBlZGVmIF9fdXJhdGlvPG51bSwgZGVuPiB0eXBlOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX0VuZ2luZSwgc2l6ZV90IF9faz4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHNodWZmbGVfb3JkZXJfZW5naW5lCit7CisgICAgc3RhdGljX2Fzc2VydCgwIDwgX19rLCAic2h1ZmZsZV9vcmRlcl9lbmdpbmUgaW52YWxpZCBwYXJhbWV0ZXJzIik7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FbmdpbmU6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworCitwcml2YXRlOgorICAgIF9FbmdpbmUgX19lXzsKKyAgICByZXN1bHRfdHlwZSBfVl9bX19rXTsKKyAgICByZXN1bHRfdHlwZSBfWV87CisKK3B1YmxpYzoKKyAgICAvLyBlbmdpbmUgY2hhcmFjdGVyaXN0aWNzCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHNpemVfdCB0YWJsZV9zaXplID0gX19rOworCisjaWZkZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgc3RhdGljIGNvbnN0IHJlc3VsdF90eXBlIF9NaW4gPSBfRW5naW5lOjpfTWluOworICAgIHN0YXRpYyBjb25zdCByZXN1bHRfdHlwZSBfTWF4ID0gX0VuZ2luZTo6X01heDsKKyNlbHNlCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHJlc3VsdF90eXBlIF9NaW4gPSBfRW5naW5lOjptaW4oKTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgcmVzdWx0X3R5cGUgX01heCA9IF9FbmdpbmU6Om1heCgpOworI2VuZGlmCisgICAgc3RhdGljX2Fzc2VydChfTWluIDwgX01heCwgInNodWZmbGVfb3JkZXJfZW5naW5lIGludmFsaWQgcGFyYW1ldGVycyIpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgcmVzdWx0X3R5cGUgbWluKCkgeyByZXR1cm4gX01pbjsgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgcmVzdWx0X3R5cGUgbWF4KCkgeyByZXR1cm4gX01heDsgfQorCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBfUnAgPSBfTWF4IC0gX01pbiArIDF1bGw7CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIHNlZWRpbmcgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNodWZmbGVfb3JkZXJfZW5naW5lKCkge19faW5pdCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgc2h1ZmZsZV9vcmRlcl9lbmdpbmUoY29uc3QgX0VuZ2luZSYgX19lKQorICAgICAgICA6IF9fZV8oX19lKSB7X19pbml0KCk7fQorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgc2h1ZmZsZV9vcmRlcl9lbmdpbmUoX0VuZ2luZSYmIF9fZSkKKyAgICAgICAgOiBfX2VfKF9WU1REOjptb3ZlKF9fZSkpIHtfX2luaXQoKTt9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBzaHVmZmxlX29yZGVyX2VuZ2luZShyZXN1bHRfdHlwZSBfX3NkKSA6IF9fZV8oX19zZCkge19faW5pdCgpO30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfU3NlcT4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBleHBsaWNpdCBzaHVmZmxlX29yZGVyX2VuZ2luZShfU3NlcSYgX19xLAorICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19zZWVkX3NlcXVlbmNlPF9Tc2VxLCBzaHVmZmxlX29yZGVyX2VuZ2luZT46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNfY29udmVydGlibGU8X1NzZXEsIF9FbmdpbmU+Ojp2YWx1ZT46OnR5cGUqID0gMCkKKyAgICAgICAgIDogX19lXyhfX3EpIHtfX2luaXQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc2VlZCgpIHtfX2VfLnNlZWQoKTsgX19pbml0KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHNlZWQocmVzdWx0X3R5cGUgX19zZCkge19fZV8uc2VlZChfX3NkKTsgX19pbml0KCk7fQorICAgIHRlbXBsYXRlPGNsYXNzIF9Tc2VxPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICBfX2lzX3NlZWRfc2VxdWVuY2U8X1NzZXEsIHNodWZmbGVfb3JkZXJfZW5naW5lPjo6dmFsdWUsCisgICAgICAgICAgICB2b2lkCisgICAgICAgID46OnR5cGUKKyAgICAgICAgc2VlZChfU3NlcSYgX19xKSB7X19lXy5zZWVkKF9fcSk7IF9faW5pdCgpO30KKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoKSB7cmV0dXJuIF9fZXZhbChpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfUnAgIT0gMD4oKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGRpc2NhcmQodW5zaWduZWQgbG9uZyBsb25nIF9feikge2ZvciAoOyBfX3o7IC0tX196KSBvcGVyYXRvcigpKCk7fQorCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IF9FbmdpbmUmIGJhc2UoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX2VfO30KKworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfRW5nLCBzaXplX3QgX0twPgorICAgIGZyaWVuZAorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KAorICAgICAgICBjb25zdCBzaHVmZmxlX29yZGVyX2VuZ2luZTxfRW5nLCBfS3A+JiBfX3gsCisgICAgICAgIGNvbnN0IHNodWZmbGVfb3JkZXJfZW5naW5lPF9FbmcsIF9LcD4mIF9feSk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfRW5nLCBzaXplX3QgX0twPgorICAgIGZyaWVuZAorICAgIGJvb2wKKyAgICBvcGVyYXRvciE9KAorICAgICAgICBjb25zdCBzaHVmZmxlX29yZGVyX2VuZ2luZTxfRW5nLCBfS3A+JiBfX3gsCisgICAgICAgIGNvbnN0IHNodWZmbGVfb3JkZXJfZW5naW5lPF9FbmcsIF9LcD4mIF9feSk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLAorICAgICAgICAgICAgICBjbGFzcyBfRW5nLCBzaXplX3QgX0twPgorICAgIGZyaWVuZAorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgICAgIGNvbnN0IHNodWZmbGVfb3JkZXJfZW5naW5lPF9FbmcsIF9LcD4mIF9feCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLAorICAgICAgICAgICAgICBjbGFzcyBfRW5nLCBzaXplX3QgX0twPgorICAgIGZyaWVuZAorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgICAgICAgIHNodWZmbGVfb3JkZXJfZW5naW5lPF9FbmcsIF9LcD4mIF9feCk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX2luaXQoKQorICAgIHsKKyAgICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19rOyArK19faSkKKyAgICAgICAgICAgIF9WX1tfX2ldID0gX19lXygpOworICAgICAgICBfWV8gPSBfX2VfKCk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIF9fZXZhbChmYWxzZV90eXBlKSB7cmV0dXJuIF9fZXZhbDIoaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19rICYgMT4oKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBfX2V2YWwodHJ1ZV90eXBlKSB7cmV0dXJuIF9fZXZhbChfX3VyYXRpbzxfX2ssIF9ScD4oKSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIF9fZXZhbDIoZmFsc2VfdHlwZSkge3JldHVybiBfX2V2YWwoX191cmF0aW88X19rLzIsIDB4ODAwMDAwMDAwMDAwMDAwMHVsbD4oKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBfX2V2YWwyKHRydWVfdHlwZSkge3JldHVybiBfX2V2YWxmPF9faywgMD4oKTt9CisKKyAgICB0ZW1wbGF0ZSA8dWludDY0X3QgX05wLCB1aW50NjRfdCBfRHA+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIChfX3VyYXRpbzxfTnAsIF9EcD46Om51bSA+IDB4RkZGRkZGRkZGRkZGRkZGRnVsbCAvIChfTWF4IC0gX01pbikpLAorICAgICAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBfX2V2YWwoX191cmF0aW88X05wLCBfRHA+KQorICAgICAgICAgICAge3JldHVybiBfX2V2YWxmPF9fdXJhdGlvPF9OcCwgX0RwPjo6bnVtLCBfX3VyYXRpbzxfTnAsIF9EcD46OmRlbj4oKTt9CisKKyAgICB0ZW1wbGF0ZSA8dWludDY0X3QgX05wLCB1aW50NjRfdCBfRHA+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIF9fdXJhdGlvPF9OcCwgX0RwPjo6bnVtIDw9IDB4RkZGRkZGRkZGRkZGRkZGRnVsbCAvIChfTWF4IC0gX01pbiksCisgICAgICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICA+Ojp0eXBlCisgICAgICAgIF9fZXZhbChfX3VyYXRpbzxfTnAsIF9EcD4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBfX2ogPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fdXJhdGlvPF9OcCwgX0RwPjo6bnVtICogKF9ZXyAtIF9NaW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9fdXJhdGlvPF9OcCwgX0RwPjo6ZGVuKTsKKyAgICAgICAgICAgIF9ZXyA9IF9WX1tfX2pdOworICAgICAgICAgICAgX1ZfW19fal0gPSBfX2VfKCk7CisgICAgICAgICAgICByZXR1cm4gX1lfOworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dWludDY0X3QgX19uLCB1aW50NjRfdCBfX2Q+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcmVzdWx0X3R5cGUgX19ldmFsZigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBfRnAgPSBfX2QgPT0gMCA/CisgICAgICAgICAgICAgICAgX19uIC8gKDIuICogMHg4MDAwMDAwMDAwMDAwMDAwdWxsKSA6CisgICAgICAgICAgICAgICAgX19uIC8gKGRvdWJsZSlfX2Q7CisgICAgICAgICAgICBjb25zdCBzaXplX3QgX19qID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfRnAgKiAoX1lfIC0gX01pbikpOworICAgICAgICAgICAgX1lfID0gX1ZfW19fal07CisgICAgICAgICAgICBfVl9bX19qXSA9IF9fZV8oKTsKKyAgICAgICAgICAgIHJldHVybiBfWV87CisgICAgICAgIH0KK307CisKK3RlbXBsYXRlPGNsYXNzIF9FbmdpbmUsIHNpemVfdCBfX2s+CisgICAgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90IHNodWZmbGVfb3JkZXJfZW5naW5lPF9FbmdpbmUsIF9faz46OnRhYmxlX3NpemU7CisKK3RlbXBsYXRlPGNsYXNzIF9FbmcsIHNpemVfdCBfS3A+Citib29sCitvcGVyYXRvcj09KAorICAgIGNvbnN0IHNodWZmbGVfb3JkZXJfZW5naW5lPF9FbmcsIF9LcD4mIF9feCwKKyAgICBjb25zdCBzaHVmZmxlX29yZGVyX2VuZ2luZTxfRW5nLCBfS3A+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5fWV8gPT0gX195Ll9ZXyAmJiBfVlNURDo6ZXF1YWwoX194Ll9WXywgX194Ll9WXyArIF9LcCwgX195Ll9WXykgJiYKKyAgICAgICAgICAgX194Ll9fZV8gPT0gX195Ll9fZV87Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9FbmcsIHNpemVfdCBfS3A+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPSgKKyAgICBjb25zdCBzaHVmZmxlX29yZGVyX2VuZ2luZTxfRW5nLCBfS3A+JiBfX3gsCisgICAgY29uc3Qgc2h1ZmZsZV9vcmRlcl9lbmdpbmU8X0VuZywgX0twPiYgX195KQoreworICAgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLAorICAgICAgICAgIGNsYXNzIF9FbmcsIHNpemVfdCBfS3A+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgY29uc3Qgc2h1ZmZsZV9vcmRlcl9lbmdpbmU8X0VuZywgX0twPiYgX194KQoreworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19vcyk7CisgICAgX19vcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OmxlZnQpOworICAgIF9DaGFyVCBfX3NwID0gX19vcy53aWRlbignICcpOworICAgIF9fb3MuZmlsbChfX3NwKTsKKyAgICBfX29zIDw8IF9feC5fX2VfIDw8IF9fc3AgPDwgX194Ll9WX1swXTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAxOyBfX2kgPCBfS3A7ICsrX19pKQorICAgICAgICBfX29zIDw8IF9fc3AgPDwgX194Ll9WX1tfX2ldOworICAgIHJldHVybiBfX29zIDw8IF9fc3AgPDwgX194Ll9ZXzsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywKKyAgICAgICAgICBjbGFzcyBfRW5nLCBzaXplX3QgX0twPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgIHNodWZmbGVfb3JkZXJfZW5naW5lPF9FbmcsIF9LcD4mIF9feCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHNodWZmbGVfb3JkZXJfZW5naW5lPF9FbmcsIF9LcD46OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19pcyk7CisgICAgX19pcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OnNraXB3cyk7CisgICAgX0VuZyBfX2U7CisgICAgcmVzdWx0X3R5cGUgX1ZwW19LcCsxXTsKKyAgICBfX2lzID4+IF9fZTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfS3ArMTsgKytfX2kpCisgICAgICAgIF9faXMgPj4gX1ZwW19faV07CisgICAgaWYgKCFfX2lzLmZhaWwoKSkKKyAgICB7CisgICAgICAgIF9feC5fX2VfID0gX19lOworICAgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfS3A7ICsrX19pKQorICAgICAgICAgICAgX194Ll9WX1tfX2ldID0gX1ZwW19faV07CisgICAgICAgIF9feC5fWV8gPSBfVnBbX0twXTsKKyAgICB9CisgICAgcmV0dXJuIF9faXM7Cit9CisKK3R5cGVkZWYgc2h1ZmZsZV9vcmRlcl9lbmdpbmU8bWluc3RkX3JhbmQwLCAyNTY+ICAgICAgICAgICAgICAgICAgICAgICAgIGtudXRoX2I7CisKKy8vIHJhbmRvbV9kZXZpY2UKKworY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyByYW5kb21fZGV2aWNlCit7CisjaWZkZWYgX0xJQkNQUF9VU0lOR19ERVZfUkFORE9NCisgICAgaW50IF9fZl87CisjZW5kaWYgLy8gZGVmaW5lZChfTElCQ1BQX1VTSU5HX0RFVl9SQU5ET00pCitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIHVuc2lnbmVkIHJlc3VsdF90eXBlOworCisgICAgLy8gZ2VuZXJhdG9yIGNoYXJhY3RlcmlzdGljcworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCByZXN1bHRfdHlwZSBfTWluID0gMDsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgcmVzdWx0X3R5cGUgX01heCA9IDB4RkZGRkZGRkZ1OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiByZXN1bHRfdHlwZSBtaW4oKSB7IHJldHVybiBfTWluO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIHJlc3VsdF90eXBlIG1heCgpIHsgcmV0dXJuIF9NYXg7fQorCisgICAgLy8gY29uc3RydWN0b3JzCisgICAgZXhwbGljaXQgcmFuZG9tX2RldmljZShjb25zdCBzdHJpbmcmIF9fdG9rZW4gPSAiL2Rldi91cmFuZG9tIik7CisgICAgfnJhbmRvbV9kZXZpY2UoKTsKKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSgpOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgZG91YmxlIGVudHJvcHkoKSBjb25zdCBfTk9FWENFUFQ7CisKK3ByaXZhdGU6CisgICAgLy8gbm8gY29weSBmdW5jdGlvbnMKKyAgICByYW5kb21fZGV2aWNlKGNvbnN0IHJhbmRvbV9kZXZpY2UmKTsgLy8gPSBkZWxldGU7CisgICAgcmFuZG9tX2RldmljZSYgb3BlcmF0b3I9KGNvbnN0IHJhbmRvbV9kZXZpY2UmKTsgLy8gPSBkZWxldGU7Cit9OworCisvLyBzZWVkX3NlcQorCitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBzZWVkX3NlcQoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiB1aW50MzJfdCByZXN1bHRfdHlwZTsKKworcHJpdmF0ZToKKyAgICB2ZWN0b3I8cmVzdWx0X3R5cGU+IF9fdl87CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZCBpbml0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CitwdWJsaWM6CisgICAgLy8gY29uc3RydWN0b3JzCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNlZWRfc2VxKCkgX05PRVhDRVBUIHt9CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBzZWVkX3NlcShpbml0aWFsaXplcl9saXN0PF9UcD4gX19pbCkge2luaXQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTt9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgc2VlZF9zZXEoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICAgICAgIHtpbml0KF9fZmlyc3QsIF9fbGFzdCk7fQorCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgICAgIHZvaWQgZ2VuZXJhdGUoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBzaXplKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX192Xy5zaXplKCk7fQorICAgIHRlbXBsYXRlPGNsYXNzIF9PdXRwdXRJdGVyYXRvcj4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB2b2lkIHBhcmFtKF9PdXRwdXRJdGVyYXRvciBfX2Rlc3QpIGNvbnN0CisgICAgICAgICAgICB7X1ZTVEQ6OmNvcHkoX192Xy5iZWdpbigpLCBfX3ZfLmVuZCgpLCBfX2Rlc3QpO30KKworcHJpdmF0ZToKKyAgICAvLyBubyBjb3B5IGZ1bmN0aW9ucworICAgIHNlZWRfc2VxKGNvbnN0IHNlZWRfc2VxJik7IC8vID0gZGVsZXRlOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHNlZWRfc2VxJik7IC8vID0gZGVsZXRlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyByZXN1bHRfdHlwZSBfVHAocmVzdWx0X3R5cGUgX194KSB7cmV0dXJuIF9feCBeIChfX3ggPj4gMjcpO30KK307CisKK3RlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordm9pZAorc2VlZF9zZXE6OmluaXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQoreworICAgIGZvciAoX0lucHV0SXRlcmF0b3IgX19zID0gX19maXJzdDsgX19zICE9IF9fbGFzdDsgKytfX3MpCisgICAgICAgIF9fdl8ucHVzaF9iYWNrKCpfX3MgJiAweEZGRkZGRkZGKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgordm9pZAorc2VlZF9zZXE6OmdlbmVyYXRlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQoreworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICB7CisgICAgICAgIF9WU1REOjpmaWxsKF9fZmlyc3QsIF9fbGFzdCwgMHg4YjhiOGI4Yik7CisgICAgICAgIGNvbnN0IHNpemVfdCBfX24gPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fbGFzdCAtIF9fZmlyc3QpOworICAgICAgICBjb25zdCBzaXplX3QgX19zID0gX192Xy5zaXplKCk7CisgICAgICAgIGNvbnN0IHNpemVfdCBfX3QgPSAoX19uID49IDYyMykgPyAxMQorICAgICAgICAgICAgICAgICAgICAgICAgIDogKF9fbiA+PSA2OCkgPyA3CisgICAgICAgICAgICAgICAgICAgICAgICAgOiAoX19uID49IDM5KSA/IDUKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IChfX24gPj0gNykgID8gMworICAgICAgICAgICAgICAgICAgICAgICAgIDogKF9fbiAtIDEpIC8gMjsKKyAgICAgICAgY29uc3Qgc2l6ZV90IF9fcCA9IChfX24gLSBfX3QpIC8gMjsKKyAgICAgICAgY29uc3Qgc2l6ZV90IF9fcSA9IF9fcCArIF9fdDsKKyAgICAgICAgY29uc3Qgc2l6ZV90IF9fbSA9IF9WU1REOjptYXgoX19zICsgMSwgX19uKTsKKyAgICAgICAgLy8gX19rID0gMDsKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0X3R5cGUgX19yID0gMTY2NDUyNSAqIF9UcChfX2ZpcnN0WzBdIF4gX19maXJzdFtfX3BdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICBfX2ZpcnN0W19fbiAtIDFdKTsKKyAgICAgICAgICAgIF9fZmlyc3RbX19wXSArPSBfX3I7CisgICAgICAgICAgICBfX3IgKz0gX19zOworICAgICAgICAgICAgX19maXJzdFtfX3FdICs9IF9fcjsKKyAgICAgICAgICAgIF9fZmlyc3RbMF0gPSBfX3I7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgX19rID0gMTsgX19rIDw9IF9fczsgKytfX2spCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBfX2ttb2RuID0gX19rICUgX19uOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IF9fa3Btb2RuID0gKF9fayArIF9fcCkgJSBfX247CisgICAgICAgICAgICByZXN1bHRfdHlwZSBfX3IgPSAxNjY0NTI1ICogX1RwKF9fZmlyc3RbX19rbW9kbl0gXiBfX2ZpcnN0W19fa3Btb2RuXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gX19maXJzdFsoX19rIC0gMSkgJSBfX25dKTsKKyAgICAgICAgICAgIF9fZmlyc3RbX19rcG1vZG5dICs9IF9fcjsKKyAgICAgICAgICAgIF9fciArPSAgX19rbW9kbiArIF9fdl9bX19rLTFdOworICAgICAgICAgICAgX19maXJzdFsoX19rICsgX19xKSAlIF9fbl0gKz0gX19yOworICAgICAgICAgICAgX19maXJzdFtfX2ttb2RuXSA9IF9fcjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBfX2sgPSBfX3MgKyAxOyBfX2sgPCBfX207ICsrX19rKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzaXplX3QgX19rbW9kbiA9IF9fayAlIF9fbjsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBfX2twbW9kbiA9IChfX2sgKyBfX3ApICUgX19uOworICAgICAgICAgICAgcmVzdWx0X3R5cGUgX19yID0gMTY2NDUyNSAqIF9UcChfX2ZpcnN0W19fa21vZG5dIF4gX19maXJzdFtfX2twbW9kbl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIF9fZmlyc3RbKF9fayAtIDEpICUgX19uXSk7CisgICAgICAgICAgICBfX2ZpcnN0W19fa3Btb2RuXSArPSBfX3I7CisgICAgICAgICAgICBfX3IgKz0gIF9fa21vZG47CisgICAgICAgICAgICBfX2ZpcnN0WyhfX2sgKyBfX3EpICUgX19uXSArPSBfX3I7CisgICAgICAgICAgICBfX2ZpcnN0W19fa21vZG5dID0gX19yOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IF9fayA9IF9fbTsgX19rIDwgX19tICsgX19uOyArK19faykKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IF9fa21vZG4gPSBfX2sgJSBfX247CisgICAgICAgICAgICBjb25zdCBzaXplX3QgX19rcG1vZG4gPSAoX19rICsgX19wKSAlIF9fbjsKKyAgICAgICAgICAgIHJlc3VsdF90eXBlIF9fciA9IDE1NjYwODM5NDEgKiBfVHAoX19maXJzdFtfX2ttb2RuXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19maXJzdFtfX2twbW9kbl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmlyc3RbKF9fayAtIDEpICUgX19uXSk7CisgICAgICAgICAgICBfX2ZpcnN0W19fa3Btb2RuXSBePSBfX3I7CisgICAgICAgICAgICBfX3IgLT0gX19rbW9kbjsKKyAgICAgICAgICAgIF9fZmlyc3RbKF9fayArIF9fcSkgJSBfX25dIF49IF9fcjsKKyAgICAgICAgICAgIF9fZmlyc3RbX19rbW9kbl0gPSBfX3I7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIGdlbmVyYXRlX2Nhbm9uaWNhbAorCit0ZW1wbGF0ZTxjbGFzcyBfUmVhbFR5cGUsIHNpemVfdCBfX2JpdHMsIGNsYXNzIF9VUk5HPgorX1JlYWxUeXBlCitnZW5lcmF0ZV9jYW5vbmljYWwoX1VSTkcmIF9fZykKK3sKKyAgICBjb25zdCBzaXplX3QgX0R0ID0gbnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6ZGlnaXRzOworICAgIGNvbnN0IHNpemVfdCBfX2IgPSBfRHQgPCBfX2JpdHMgPyBfRHQgOiBfX2JpdHM7CisjaWZkZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgY29uc3Qgc2l6ZV90IF9fbG9nUiA9IF9fbG9nMjx1aW50NjRfdCwgX1VSTkc6Ol9NYXggLSBfVVJORzo6X01pbiArIHVpbnQ2NF90KDEpPjo6dmFsdWU7CisjZWxzZQorICAgIGNvbnN0IHNpemVfdCBfX2xvZ1IgPSBfX2xvZzI8dWludDY0X3QsIF9VUk5HOjptYXgoKSAtIF9VUk5HOjptaW4oKSArIHVpbnQ2NF90KDEpPjo6dmFsdWU7CisjZW5kaWYKKyAgICBjb25zdCBzaXplX3QgX19rID0gX19iIC8gX19sb2dSICsgKF9fYiAlIF9fbG9nUiAhPSAwKSArIChfX2IgPT0gMCk7CisgICAgY29uc3QgX1JlYWxUeXBlIF9ScCA9IF9VUk5HOjptYXgoKSAtIF9VUk5HOjptaW4oKSArIF9SZWFsVHlwZSgxKTsKKyAgICBfUmVhbFR5cGUgX19iYXNlID0gX1JwOworICAgIF9SZWFsVHlwZSBfU3AgPSBfX2coKSAtIF9VUk5HOjptaW4oKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAxOyBfX2kgPCBfX2s7ICsrX19pLCBfX2Jhc2UgKj0gX1JwKQorICAgICAgICBfU3AgKz0gKF9fZygpIC0gX1VSTkc6Om1pbigpKSAqIF9fYmFzZTsKKyAgICByZXR1cm4gX1NwIC8gX19iYXNlOworfQorCisvLyB1bmlmb3JtX2ludF9kaXN0cmlidXRpb24KKworLy8gaW4gPGFsZ29yaXRobT4KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0lUPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgIGNvbnN0IHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxfSVQ+JiBfX3gpCit7CisgICAgX19zYXZlX2ZsYWdzPF9DaGFyVCwgX1RyYWl0cz4gX19seChfX29zKTsKKyAgICBfX29zLmZsYWdzKGlvc19iYXNlOjpkZWMgfCBpb3NfYmFzZTo6bGVmdCk7CisgICAgX0NoYXJUIF9fc3AgPSBfX29zLndpZGVuKCcgJyk7CisgICAgX19vcy5maWxsKF9fc3ApOworICAgIHJldHVybiBfX29zIDw8IF9feC5hKCkgPDwgX19zcCA8PCBfX3guYigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfSVQ+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgICAgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPF9JVD4mIF9feCkKK3sKKyAgICB0eXBlZGVmIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxfSVQ+IF9Fbmc7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRW5nOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Fbmc6OnBhcmFtX3R5cGUgcGFyYW1fdHlwZTsKKyAgICBfX3NhdmVfZmxhZ3M8X0NoYXJULCBfVHJhaXRzPiBfX2x4KF9faXMpOworICAgIF9faXMuZmxhZ3MoaW9zX2Jhc2U6OmRlYyB8IGlvc19iYXNlOjpza2lwd3MpOworICAgIHJlc3VsdF90eXBlIF9fYTsKKyAgICByZXN1bHRfdHlwZSBfX2I7CisgICAgX19pcyA+PiBfX2EgPj4gX19iOworICAgIGlmICghX19pcy5mYWlsKCkpCisgICAgICAgIF9feC5wYXJhbShwYXJhbV90eXBlKF9fYSwgX19iKSk7CisgICAgcmV0dXJuIF9faXM7Cit9CisKKy8vIHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb24KKwordGVtcGxhdGU8Y2xhc3MgX1JlYWxUeXBlID0gZG91YmxlPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbgoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBwYXJhbV90eXBlCisgICAgeworICAgICAgICByZXN1bHRfdHlwZSBfX2FfOworICAgICAgICByZXN1bHRfdHlwZSBfX2JfOworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uIGRpc3RyaWJ1dGlvbl90eXBlOworCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZXhwbGljaXQgcGFyYW1fdHlwZShyZXN1bHRfdHlwZSBfX2EgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF90eXBlIF9fYiA9IDEpCisgICAgICAgICAgICA6IF9fYV8oX19hKSwgX19iXyhfX2IpIHt9CisKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBhKCkgY29uc3Qge3JldHVybiBfX2FfO30KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBiKCkgY29uc3Qge3JldHVybiBfX2JfO30KKworICAgICAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX194LCBjb25zdCBwYXJhbV90eXBlJiBfX3kpCisgICAgICAgICAgICB7cmV0dXJuIF9feC5fX2FfID09IF9feS5fX2FfICYmIF9feC5fX2JfID09IF9feS5fX2JfO30KKyAgICAgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHBhcmFtX3R5cGUmIF9feCwgY29uc3QgcGFyYW1fdHlwZSYgX195KQorICAgICAgICAgICAge3JldHVybiAhKF9feCA9PSBfX3kpO30KKyAgICB9OworCitwcml2YXRlOgorICAgIHBhcmFtX3R5cGUgX19wXzsKKworcHVibGljOgorICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgcmVzZXQgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgX19hID0gMCwgcmVzdWx0X3R5cGUgX19iID0gMSkKKyAgICAgICAgOiBfX3BfKHBhcmFtX3R5cGUoX19hLCBfX2IpKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkgOiBfX3BfKF9fcCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCByZXNldCgpIHt9CisKKyAgICAvLyBnZW5lcmF0aW5nIGZ1bmN0aW9ucworICAgIHRlbXBsYXRlPGNsYXNzIF9VUk5HPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoX1VSTkcmIF9fZykKKyAgICAgICAge3JldHVybiAoKnRoaXMpKF9fZywgX19wXyk7fQorICAgIHRlbXBsYXRlPGNsYXNzIF9VUk5HPiBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoX1VSTkcmIF9fZywgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBhKCkgY29uc3Qge3JldHVybiBfX3BfLmEoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIGIoKSBjb25zdCB7cmV0dXJuIF9fcF8uYigpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYXJhbV90eXBlIHBhcmFtKCkgY29uc3Qge3JldHVybiBfX3BfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3ApIHtfX3BfID0gX19wO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdCB7cmV0dXJuIGEoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG1heCgpIGNvbnN0IHtyZXR1cm4gYigpO30KKworICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uJiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uJiBfX3kpCisgICAgICAgIHtyZXR1cm4gX194Ll9fcF8gPT0gX195Ll9fcF87fQorICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uJiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uJiBfX3kpCisgICAgICAgIHtyZXR1cm4gIShfX3ggPT0gX195KTt9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfUmVhbFR5cGU+Cit0ZW1wbGF0ZTxjbGFzcyBfVVJORz4KK2lubGluZQordHlwZW5hbWUgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpyZXN1bHRfdHlwZQordW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpvcGVyYXRvcigpKF9VUk5HJiBfX2csIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKK3sKKyAgICByZXR1cm4gKF9fcC5iKCkgLSBfX3AuYSgpKQorICAgICAgICAqIF9WU1REOjpnZW5lcmF0ZV9jYW5vbmljYWw8X1JlYWxUeXBlLCBudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjpkaWdpdHM+KF9fZykKKyAgICAgICAgKyBfX3AuYSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfUlQ+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgY29uc3QgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxfUlQ+JiBfX3gpCit7CisgICAgX19zYXZlX2ZsYWdzPF9DaGFyVCwgX1RyYWl0cz4gX19seChfX29zKTsKKyAgICBfX29zLmZsYWdzKGlvc19iYXNlOjpkZWMgfCBpb3NfYmFzZTo6bGVmdCB8IGlvc19iYXNlOjpmaXhlZCB8CisgICAgICAgICAgICAgICBpb3NfYmFzZTo6c2NpZW50aWZpYyk7CisgICAgX0NoYXJUIF9fc3AgPSBfX29zLndpZGVuKCcgJyk7CisgICAgX19vcy5maWxsKF9fc3ApOworICAgIHJldHVybiBfX29zIDw8IF9feC5hKCkgPDwgX19zcCA8PCBfX3guYigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfUlQ+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgICAgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxfUlQ+JiBfX3gpCit7CisgICAgdHlwZWRlZiB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPF9SVD4gX0VuZzsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Fbmc6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0VuZzo6cGFyYW1fdHlwZSBwYXJhbV90eXBlOworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19pcyk7CisgICAgX19pcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OnNraXB3cyk7CisgICAgcmVzdWx0X3R5cGUgX19hOworICAgIHJlc3VsdF90eXBlIF9fYjsKKyAgICBfX2lzID4+IF9fYSA+PiBfX2I7CisgICAgaWYgKCFfX2lzLmZhaWwoKSkKKyAgICAgICAgX194LnBhcmFtKHBhcmFtX3R5cGUoX19hLCBfX2IpKTsKKyAgICByZXR1cm4gX19pczsKK30KKworLy8gYmVybm91bGxpX2Rpc3RyaWJ1dGlvbgorCitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBiZXJub3VsbGlfZGlzdHJpYnV0aW9uCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIGJvb2wgcmVzdWx0X3R5cGU7CisKKyAgICBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBwYXJhbV90eXBlCisgICAgeworICAgICAgICBkb3VibGUgX19wXzsKKyAgICBwdWJsaWM6CisgICAgICAgIHR5cGVkZWYgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiBkaXN0cmlidXRpb25fdHlwZTsKKworICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGV4cGxpY2l0IHBhcmFtX3R5cGUoZG91YmxlIF9fcCA9IDAuNSkgOiBfX3BfKF9fcCkge30KKworICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGRvdWJsZSBwKCkgY29uc3Qge3JldHVybiBfX3BfO30KKworICAgICAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9feCwgY29uc3QgcGFyYW1fdHlwZSYgX195KQorICAgICAgICAgICAge3JldHVybiBfX3guX19wXyA9PSBfX3kuX19wXzt9CisgICAgICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgcGFyYW1fdHlwZSYgX194LCBjb25zdCBwYXJhbV90eXBlJiBfX3kpCisgICAgICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorICAgIH07CisKK3ByaXZhdGU6CisgICAgcGFyYW1fdHlwZSBfX3BfOworCitwdWJsaWM6CisgICAgLy8gY29uc3RydWN0b3JzIGFuZCByZXNldCBmdW5jdGlvbnMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbihkb3VibGUgX19wID0gMC41KQorICAgICAgICA6IF9fcF8ocGFyYW1fdHlwZShfX3ApKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBiZXJub3VsbGlfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkgOiBfX3BfKF9fcCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCByZXNldCgpIHt9CisKKyAgICAvLyBnZW5lcmF0aW5nIGZ1bmN0aW9ucworICAgIHRlbXBsYXRlPGNsYXNzIF9VUk5HPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoX1VSTkcmIF9fZykKKyAgICAgICAge3JldHVybiAoKnRoaXMpKF9fZywgX19wXyk7fQorICAgIHRlbXBsYXRlPGNsYXNzIF9VUk5HPiBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoX1VSTkcmIF9fZywgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBkb3VibGUgcCgpIGNvbnN0IHtyZXR1cm4gX19wXy5wKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhcmFtX3R5cGUgcGFyYW0oKSBjb25zdCB7cmV0dXJuIF9fcF87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkge19fcF8gPSBfX3A7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG1pbigpIGNvbnN0IHtyZXR1cm4gZmFsc2U7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdCB7cmV0dXJuIHRydWU7fQorCisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGJlcm5vdWxsaV9kaXN0cmlidXRpb24mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJlcm5vdWxsaV9kaXN0cmlidXRpb24mIF9feSkKKyAgICAgICAge3JldHVybiBfX3guX19wXyA9PSBfX3kuX19wXzt9CisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGJlcm5vdWxsaV9kaXN0cmlidXRpb24mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJlcm5vdWxsaV9kaXN0cmlidXRpb24mIF9feSkKKyAgICAgICAge3JldHVybiAhKF9feCA9PSBfX3kpO30KK307CisKK3RlbXBsYXRlPGNsYXNzIF9VUk5HPgoraW5saW5lCitiZXJub3VsbGlfZGlzdHJpYnV0aW9uOjpyZXN1bHRfdHlwZQorYmVybm91bGxpX2Rpc3RyaWJ1dGlvbjo6b3BlcmF0b3IoKShfVVJORyYgX19nLCBjb25zdCBwYXJhbV90eXBlJiBfX3ApCit7CisgICAgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxkb3VibGU+IF9fZ2VuOworICAgIHJldHVybiBfX2dlbihfX2cpIDwgX19wLnAoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBiZXJub3VsbGlfZGlzdHJpYnV0aW9uJiBfX3gpCit7CisgICAgX19zYXZlX2ZsYWdzPF9DaGFyVCwgX1RyYWl0cz4gX19seChfX29zKTsKKyAgICBfX29zLmZsYWdzKGlvc19iYXNlOjpkZWMgfCBpb3NfYmFzZTo6bGVmdCB8IGlvc19iYXNlOjpmaXhlZCB8CisgICAgICAgICAgICAgICBpb3NfYmFzZTo6c2NpZW50aWZpYyk7CisgICAgX0NoYXJUIF9fc3AgPSBfX29zLndpZGVuKCcgJyk7CisgICAgX19vcy5maWxsKF9fc3ApOworICAgIHJldHVybiBfX29zIDw8IF9feC5wKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiYgX194KQoreworICAgIHR5cGVkZWYgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiBfRW5nOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0VuZzo6cGFyYW1fdHlwZSBwYXJhbV90eXBlOworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19pcyk7CisgICAgX19pcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OnNraXB3cyk7CisgICAgZG91YmxlIF9fcDsKKyAgICBfX2lzID4+IF9fcDsKKyAgICBpZiAoIV9faXMuZmFpbCgpKQorICAgICAgICBfX3gucGFyYW0ocGFyYW1fdHlwZShfX3ApKTsKKyAgICByZXR1cm4gX19pczsKK30KKworLy8gYmlub21pYWxfZGlzdHJpYnV0aW9uCisKK3RlbXBsYXRlPGNsYXNzIF9JbnRUeXBlID0gaW50PgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYmlub21pYWxfZGlzdHJpYnV0aW9uCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIF9JbnRUeXBlIHJlc3VsdF90eXBlOworCisgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgcGFyYW1fdHlwZQorICAgIHsKKyAgICAgICAgcmVzdWx0X3R5cGUgX190XzsKKyAgICAgICAgZG91YmxlIF9fcF87CisgICAgICAgIGRvdWJsZSBfX3ByXzsKKyAgICAgICAgZG91YmxlIF9fb2Rkc19yYXRpb187CisgICAgICAgIHJlc3VsdF90eXBlIF9fcjBfOworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiBiaW5vbWlhbF9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgZXhwbGljaXQgcGFyYW1fdHlwZShyZXN1bHRfdHlwZSBfX3QgPSAxLCBkb3VibGUgX19wID0gMC41KTsKKworICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHJlc3VsdF90eXBlIHQoKSBjb25zdCB7cmV0dXJuIF9fdF87fQorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGRvdWJsZSBwKCkgY29uc3Qge3JldHVybiBfX3BfO30KKworICAgICAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9feCwgY29uc3QgcGFyYW1fdHlwZSYgX195KQorICAgICAgICAgICAge3JldHVybiBfX3guX190XyA9PSBfX3kuX190XyAmJiBfX3guX19wXyA9PSBfX3kuX19wXzt9CisgICAgICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgcGFyYW1fdHlwZSYgX194LCBjb25zdCBwYXJhbV90eXBlJiBfX3kpCisgICAgICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorCisgICAgICAgIGZyaWVuZCBjbGFzcyBiaW5vbWlhbF9kaXN0cmlidXRpb247CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBwYXJhbV90eXBlIF9fcF87CisKK3B1YmxpYzoKKyAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBiaW5vbWlhbF9kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgX190ID0gMSwgZG91YmxlIF9fcCA9IDAuNSkKKyAgICAgICAgOiBfX3BfKHBhcmFtX3R5cGUoX190LCBfX3ApKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBiaW5vbWlhbF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKSA6IF9fcF8oX19wKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHJlc2V0KCkge30KKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgdGVtcGxhdGU8Y2xhc3MgX1VSTkc+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfVVJORyYgX19nKQorICAgICAgICB7cmV0dXJuICgqdGhpcykoX19nLCBfX3BfKTt9CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoX1VSTkcmIF9fZywgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSB0KCkgY29uc3Qge3JldHVybiBfX3BfLnQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGRvdWJsZSBwKCkgY29uc3Qge3JldHVybiBfX3BfLnAoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFyYW1fdHlwZSBwYXJhbSgpIGNvbnN0IHtyZXR1cm4gX19wXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wKSB7X19wXyA9IF9fcDt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVzdWx0X3R5cGUgbWluKCkgY29uc3Qge3JldHVybiAwO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVzdWx0X3R5cGUgbWF4KCkgY29uc3Qge3JldHVybiB0KCk7fQorCisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGJpbm9taWFsX2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmlub21pYWxfZGlzdHJpYnV0aW9uJiBfX3kpCisgICAgICAgIHtyZXR1cm4gX194Ll9fcF8gPT0gX195Ll9fcF87fQorICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBiaW5vbWlhbF9kaXN0cmlidXRpb24mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpbm9taWFsX2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorfTsKKworI2lmbmRlZiBfTElCQ1BQX01TVkNSVAorZXh0ZXJuICJDIiBkb3VibGUgbGdhbW1hX3IoZG91YmxlLCBpbnQgKik7CisjZW5kaWYKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZG91YmxlIF9fbGliY3BwX2xnYW1tYShkb3VibGUgX19kKSB7CisjaWYgZGVmaW5lZChfTElCQ1BQX01TVkNSVCkKKyAgcmV0dXJuIGxnYW1tYShfX2QpOworI2Vsc2UKKyAgaW50IF9fc2lnbjsKKyAgcmV0dXJuIGxnYW1tYV9yKF9fZCwgJl9fc2lnbik7CisjZW5kaWYKK30KKwordGVtcGxhdGU8Y2xhc3MgX0ludFR5cGU+CitiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+OjpwYXJhbV90eXBlOjpwYXJhbV90eXBlKGNvbnN0IHJlc3VsdF90eXBlIF9fdCwgY29uc3QgZG91YmxlIF9fcCkKKyAgICA6IF9fdF8oX190KSwgX19wXyhfX3ApCit7CisgICAgaWYgKDAgPCBfX3BfICYmIF9fcF8gPCAxKQorICAgIHsKKyAgICAgICAgX19yMF8gPSBzdGF0aWNfY2FzdDxyZXN1bHRfdHlwZT4oKF9fdF8gKyAxKSAqIF9fcF8pOworICAgICAgICBfX3ByXyA9IF9WU1REOjpleHAoX19saWJjcHBfbGdhbW1hKF9fdF8gKyAxLikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19saWJjcHBfbGdhbW1hKF9fcjBfICsgMS4pIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGliY3BwX2xnYW1tYShfX3RfIC0gX19yMF8gKyAxLikgKyBfX3IwXyAqIF9WU1REOjpsb2coX19wXykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdF8gLSBfX3IwXykgKiBfVlNURDo6bG9nKDEgLSBfX3BfKSk7CisgICAgICAgIF9fb2Rkc19yYXRpb18gPSBfX3BfIC8gKDEgLSBfX3BfKTsKKyAgICB9Cit9CisKKy8vIFJlZmVyZW5jZTogS2VtcCwgQy5ELiAoMTk4NikuIGBBIG1vZGFsIG1ldGhvZCBmb3IgZ2VuZXJhdGluZyBiaW5vbWlhbAorLy8gICAgICAgICAgIHZhcmlhYmxlcycsIENvbW11bi4gU3RhdGlzdC4gLSBUaGVvci4gTWV0aC4gMTUoMyksIDgwNS04MTMuCit0ZW1wbGF0ZTxjbGFzcyBfSW50VHlwZT4KK3RlbXBsYXRlPGNsYXNzIF9VUk5HPgorX0ludFR5cGUKK2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46Om9wZXJhdG9yKCkoX1VSTkcmIF9fZywgY29uc3QgcGFyYW1fdHlwZSYgX19wcikKK3sKKyAgICBpZiAoX19wci5fX3RfID09IDAgfHwgX19wci5fX3BfID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChfX3ByLl9fcF8gPT0gMSkKKyAgICAgICAgcmV0dXJuIF9fcHIuX190XzsKKyAgICB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4gX19nZW47CisgICAgZG91YmxlIF9fdSA9IF9fZ2VuKF9fZykgLSBfX3ByLl9fcHJfOworICAgIGlmIChfX3UgPCAwKQorICAgICAgICByZXR1cm4gX19wci5fX3IwXzsKKyAgICBkb3VibGUgX19wdSA9IF9fcHIuX19wcl87CisgICAgZG91YmxlIF9fcGQgPSBfX3B1OworICAgIHJlc3VsdF90eXBlIF9fcnUgPSBfX3ByLl9fcjBfOworICAgIHJlc3VsdF90eXBlIF9fcmQgPSBfX3J1OworICAgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgICAgaWYgKF9fcmQgPj0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgX19wZCAqPSBfX3JkIC8gKF9fcHIuX19vZGRzX3JhdGlvXyAqIChfX3ByLl9fdF8gLSBfX3JkICsgMSkpOworICAgICAgICAgICAgX191IC09IF9fcGQ7CisgICAgICAgICAgICBpZiAoX191IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gX19yZCAtIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX3JkICE9IDAgKQorICAgICAgICAgICAgLS1fX3JkOworICAgICAgICArK19fcnU7CisgICAgICAgIGlmIChfX3J1IDw9IF9fcHIuX190XykKKyAgICAgICAgeworICAgICAgICAgICAgX19wdSAqPSAoX19wci5fX3RfIC0gX19ydSArIDEpICogX19wci5fX29kZHNfcmF0aW9fIC8gX19ydTsKKyAgICAgICAgICAgIF9fdSAtPSBfX3B1OworICAgICAgICAgICAgaWYgKF9fdSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIF9fcnU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9JbnRUeXBlPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgIGNvbnN0IGJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9feCkKK3sKKyAgICBfX3NhdmVfZmxhZ3M8X0NoYXJULCBfVHJhaXRzPiBfX2x4KF9fb3MpOworICAgIF9fb3MuZmxhZ3MoaW9zX2Jhc2U6OmRlYyB8IGlvc19iYXNlOjpsZWZ0IHwgaW9zX2Jhc2U6OmZpeGVkIHwKKyAgICAgICAgICAgICAgIGlvc19iYXNlOjpzY2llbnRpZmljKTsKKyAgICBfQ2hhclQgX19zcCA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICBfX29zLmZpbGwoX19zcCk7CisgICAgcmV0dXJuIF9fb3MgPDwgX194LnQoKSA8PCBfX3NwIDw8IF9feC5wKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9JbnRUeXBlPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9feCkKK3sKKyAgICB0eXBlZGVmIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4gX0VuZzsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Fbmc6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0VuZzo6cGFyYW1fdHlwZSBwYXJhbV90eXBlOworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19pcyk7CisgICAgX19pcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OnNraXB3cyk7CisgICAgcmVzdWx0X3R5cGUgX190OworICAgIGRvdWJsZSBfX3A7CisgICAgX19pcyA+PiBfX3QgPj4gX19wOworICAgIGlmICghX19pcy5mYWlsKCkpCisgICAgICAgIF9feC5wYXJhbShwYXJhbV90eXBlKF9fdCwgX19wKSk7CisgICAgcmV0dXJuIF9faXM7Cit9CisKKy8vIGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbgorCit0ZW1wbGF0ZTxjbGFzcyBfUmVhbFR5cGUgPSBkb3VibGU+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBleHBvbmVudGlhbF9kaXN0cmlidXRpb24KK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworCisgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgcGFyYW1fdHlwZQorICAgIHsKKyAgICAgICAgcmVzdWx0X3R5cGUgX19sYW1iZGFfOworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiBleHBvbmVudGlhbF9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBleHBsaWNpdCBwYXJhbV90eXBlKHJlc3VsdF90eXBlIF9fbGFtYmRhID0gMSkgOiBfX2xhbWJkYV8oX19sYW1iZGEpIHt9CisKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBsYW1iZGEoKSBjb25zdCB7cmV0dXJuIF9fbGFtYmRhXzt9CisKKyAgICAgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3gsIGNvbnN0IHBhcmFtX3R5cGUmIF9feSkKKyAgICAgICAgICAgIHtyZXR1cm4gX194Ll9fbGFtYmRhXyA9PSBfX3kuX19sYW1iZGFfO30KKyAgICAgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwYXJhbV90eXBlJiBfX3gsIGNvbnN0IHBhcmFtX3R5cGUmIF9feSkKKyAgICAgICAgICAgIHtyZXR1cm4gIShfX3ggPT0gX195KTt9CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBwYXJhbV90eXBlIF9fcF87CisKK3B1YmxpYzoKKyAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBleHBvbmVudGlhbF9kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgX19sYW1iZGEgPSAxKQorICAgICAgICA6IF9fcF8ocGFyYW1fdHlwZShfX2xhbWJkYSkpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApIDogX19wXyhfX3ApIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcmVzZXQoKSB7fQorCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9VUk5HJiBfX2cpCisgICAgICAgIHtyZXR1cm4gKCp0aGlzKShfX2csIF9fcF8pO30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfVVJORyYgX19nLCBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIGxhbWJkYSgpIGNvbnN0IHtyZXR1cm4gX19wXy5sYW1iZGEoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFyYW1fdHlwZSBwYXJhbSgpIGNvbnN0IHtyZXR1cm4gX19wXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wKSB7X19wXyA9IF9fcDt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVzdWx0X3R5cGUgbWluKCkgY29uc3Qge3JldHVybiAwO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVzdWx0X3R5cGUgbWF4KCkgY29uc3Qge3JldHVybiBudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46OmluZmluaXR5KCk7fQorCisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uJiBfX3kpCisgICAgICAgIHtyZXR1cm4gX194Ll9fcF8gPT0gX195Ll9fcF87fQorICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBleHBvbmVudGlhbF9kaXN0cmlidXRpb24mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZWFsVHlwZT4KK3RlbXBsYXRlPGNsYXNzIF9VUk5HPgorX1JlYWxUeXBlCitleHBvbmVudGlhbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6b3BlcmF0b3IoKShfVVJORyYgX19nLCBjb25zdCBwYXJhbV90eXBlJiBfX3ApCit7CisgICAgcmV0dXJuIC1fVlNURDo6bG9nCisgICAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X3R5cGUoMSkgLQorICAgICAgICAgICAgICAgICAgICAgIF9WU1REOjpnZW5lcmF0ZV9jYW5vbmljYWw8cmVzdWx0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46OmRpZ2l0cz4oX19nKQorICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgLyBfX3AubGFtYmRhKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9SZWFsVHlwZT4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorICAgICAgICAgICBjb25zdCBleHBvbmVudGlhbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQoreworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19vcyk7CisgICAgX19vcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OmxlZnQgfCBpb3NfYmFzZTo6Zml4ZWQgfAorICAgICAgICAgICAgICAgaW9zX2Jhc2U6OnNjaWVudGlmaWMpOworICAgIHJldHVybiBfX29zIDw8IF9feC5sYW1iZGEoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX1JlYWxUeXBlPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgIGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCit7CisgICAgdHlwZWRlZiBleHBvbmVudGlhbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiBfRW5nOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0VuZzo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRW5nOjpwYXJhbV90eXBlIHBhcmFtX3R5cGU7CisgICAgX19zYXZlX2ZsYWdzPF9DaGFyVCwgX1RyYWl0cz4gX19seChfX2lzKTsKKyAgICBfX2lzLmZsYWdzKGlvc19iYXNlOjpkZWMgfCBpb3NfYmFzZTo6c2tpcHdzKTsKKyAgICByZXN1bHRfdHlwZSBfX2xhbWJkYTsKKyAgICBfX2lzID4+IF9fbGFtYmRhOworICAgIGlmICghX19pcy5mYWlsKCkpCisgICAgICAgIF9feC5wYXJhbShwYXJhbV90eXBlKF9fbGFtYmRhKSk7CisgICAgcmV0dXJuIF9faXM7Cit9CisKKy8vIG5vcm1hbF9kaXN0cmlidXRpb24KKwordGVtcGxhdGU8Y2xhc3MgX1JlYWxUeXBlID0gZG91YmxlPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgbm9ybWFsX2Rpc3RyaWJ1dGlvbgoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBwYXJhbV90eXBlCisgICAgeworICAgICAgICByZXN1bHRfdHlwZSBfX21lYW5fOworICAgICAgICByZXN1bHRfdHlwZSBfX3N0ZGRldl87CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIG5vcm1hbF9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBleHBsaWNpdCBwYXJhbV90eXBlKHJlc3VsdF90eXBlIF9fbWVhbiA9IDAsIHJlc3VsdF90eXBlIF9fc3RkZGV2ID0gMSkKKyAgICAgICAgICAgIDogX19tZWFuXyhfX21lYW4pLCBfX3N0ZGRldl8oX19zdGRkZXYpIHt9CisKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBtZWFuKCkgY29uc3Qge3JldHVybiBfX21lYW5fO30KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBzdGRkZXYoKSBjb25zdCB7cmV0dXJuIF9fc3RkZGV2Xzt9CisKKyAgICAgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3gsIGNvbnN0IHBhcmFtX3R5cGUmIF9feSkKKyAgICAgICAgICAgIHtyZXR1cm4gX194Ll9fbWVhbl8gPT0gX195Ll9fbWVhbl8gJiYgX194Ll9fc3RkZGV2XyA9PSBfX3kuX19zdGRkZXZfO30KKyAgICAgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwYXJhbV90eXBlJiBfX3gsIGNvbnN0IHBhcmFtX3R5cGUmIF9feSkKKyAgICAgICAgICAgIHtyZXR1cm4gIShfX3ggPT0gX195KTt9CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBwYXJhbV90eXBlIF9fcF87CisgICAgcmVzdWx0X3R5cGUgX1ZfOworICAgIGJvb2wgX1ZfaG90XzsKKworcHVibGljOgorICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgcmVzZXQgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IG5vcm1hbF9kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgX19tZWFuID0gMCwgcmVzdWx0X3R5cGUgX19zdGRkZXYgPSAxKQorICAgICAgICA6IF9fcF8ocGFyYW1fdHlwZShfX21lYW4sIF9fc3RkZGV2KSksIF9WX2hvdF8oZmFsc2UpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IG5vcm1hbF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgICA6IF9fcF8oX19wKSwgX1ZfaG90XyhmYWxzZSkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCByZXNldCgpIHtfVl9ob3RfID0gZmFsc2U7fQorCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9VUk5HJiBfX2cpCisgICAgICAgIHtyZXR1cm4gKCp0aGlzKShfX2csIF9fcF8pO30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfVVJORyYgX19nLCBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG1lYW4oKSBjb25zdCB7cmV0dXJuIF9fcF8ubWVhbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVzdWx0X3R5cGUgc3RkZGV2KCkgY29uc3Qge3JldHVybiBfX3BfLnN0ZGRldigpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYXJhbV90eXBlIHBhcmFtKCkgY29uc3Qge3JldHVybiBfX3BfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3ApIHtfX3BfID0gX19wO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdCB7cmV0dXJuIC1udW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46OmluZmluaXR5KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdCB7cmV0dXJuIG51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6aW5maW5pdHkoKTt9CisKKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3Qgbm9ybWFsX2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsX2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuIF9feC5fX3BfID09IF9feS5fX3BfICYmIF9feC5fVl9ob3RfID09IF9feS5fVl9ob3RfICYmCisgICAgICAgICAgICAgICAgKCFfX3guX1ZfaG90XyB8fCBfX3guX1ZfID09IF9feS5fVl8pO30KKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3Qgbm9ybWFsX2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsX2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX1JUPgorICAgIGZyaWVuZAorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbF9kaXN0cmlidXRpb248X1JUPiYgX194KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9SVD4KKyAgICBmcmllbmQKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgICAgICBub3JtYWxfZGlzdHJpYnV0aW9uPF9SVD4mIF9feCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JlYWxUeXBlPgordGVtcGxhdGU8Y2xhc3MgX1VSTkc+CitfUmVhbFR5cGUKK25vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6b3BlcmF0b3IoKShfVVJORyYgX19nLCBjb25zdCBwYXJhbV90eXBlJiBfX3ApCit7CisgICAgcmVzdWx0X3R5cGUgX1VwOworICAgIGlmIChfVl9ob3RfKQorICAgIHsKKyAgICAgICAgX1ZfaG90XyA9IGZhbHNlOworICAgICAgICBfVXAgPSBfVl87CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9VbmkoLTEsIDEpOworICAgICAgICByZXN1bHRfdHlwZSBfX3U7CisgICAgICAgIHJlc3VsdF90eXBlIF9fdjsKKyAgICAgICAgcmVzdWx0X3R5cGUgX19zOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBfX3UgPSBfVW5pKF9fZyk7CisgICAgICAgICAgICBfX3YgPSBfVW5pKF9fZyk7CisgICAgICAgICAgICBfX3MgPSBfX3UgKiBfX3UgKyBfX3YgKiBfX3Y7CisgICAgICAgIH0gd2hpbGUgKF9fcyA+IDEgfHwgX19zID09IDApOworICAgICAgICByZXN1bHRfdHlwZSBfRnAgPSBfVlNURDo6c3FydCgtMiAqIF9WU1REOjpsb2coX19zKSAvIF9fcyk7CisgICAgICAgIF9WXyA9IF9fdiAqIF9GcDsKKyAgICAgICAgX1ZfaG90XyA9IHRydWU7CisgICAgICAgIF9VcCA9IF9fdSAqIF9GcDsKKyAgICB9CisgICAgcmV0dXJuIF9VcCAqIF9fcC5zdGRkZXYoKSArIF9fcC5tZWFuKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9SVD4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorICAgICAgICAgICBjb25zdCBub3JtYWxfZGlzdHJpYnV0aW9uPF9SVD4mIF9feCkKK3sKKyAgICBfX3NhdmVfZmxhZ3M8X0NoYXJULCBfVHJhaXRzPiBfX2x4KF9fb3MpOworICAgIF9fb3MuZmxhZ3MoaW9zX2Jhc2U6OmRlYyB8IGlvc19iYXNlOjpsZWZ0IHwgaW9zX2Jhc2U6OmZpeGVkIHwKKyAgICAgICAgICAgICAgIGlvc19iYXNlOjpzY2llbnRpZmljKTsKKyAgICBfQ2hhclQgX19zcCA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICBfX29zLmZpbGwoX19zcCk7CisgICAgX19vcyA8PCBfX3gubWVhbigpIDw8IF9fc3AgPDwgX194LnN0ZGRldigpIDw8IF9fc3AgPDwgX194Ll9WX2hvdF87CisgICAgaWYgKF9feC5fVl9ob3RfKQorICAgICAgICBfX29zIDw8IF9fc3AgPDwgX194Ll9WXzsKKyAgICByZXR1cm4gX19vczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX1JUPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgIG5vcm1hbF9kaXN0cmlidXRpb248X1JUPiYgX194KQoreworICAgIHR5cGVkZWYgbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUlQ+IF9Fbmc7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRW5nOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Fbmc6OnBhcmFtX3R5cGUgcGFyYW1fdHlwZTsKKyAgICBfX3NhdmVfZmxhZ3M8X0NoYXJULCBfVHJhaXRzPiBfX2x4KF9faXMpOworICAgIF9faXMuZmxhZ3MoaW9zX2Jhc2U6OmRlYyB8IGlvc19iYXNlOjpza2lwd3MpOworICAgIHJlc3VsdF90eXBlIF9fbWVhbjsKKyAgICByZXN1bHRfdHlwZSBfX3N0ZGRldjsKKyAgICByZXN1bHRfdHlwZSBfVnAgPSAwOworICAgIGJvb2wgX1ZfaG90ID0gZmFsc2U7CisgICAgX19pcyA+PiBfX21lYW4gPj4gX19zdGRkZXYgPj4gX1ZfaG90OworICAgIGlmIChfVl9ob3QpCisgICAgICAgIF9faXMgPj4gX1ZwOworICAgIGlmICghX19pcy5mYWlsKCkpCisgICAgeworICAgICAgICBfX3gucGFyYW0ocGFyYW1fdHlwZShfX21lYW4sIF9fc3RkZGV2KSk7CisgICAgICAgIF9feC5fVl9ob3RfID0gX1ZfaG90OworICAgICAgICBfX3guX1ZfID0gX1ZwOworICAgIH0KKyAgICByZXR1cm4gX19pczsKK30KKworLy8gbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbgorCit0ZW1wbGF0ZTxjbGFzcyBfUmVhbFR5cGUgPSBkb3VibGU+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBsb2dub3JtYWxfZGlzdHJpYnV0aW9uCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKworICAgIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHBhcmFtX3R5cGUKKyAgICB7CisgICAgICAgIG5vcm1hbF9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9fbmRfOworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiBsb2dub3JtYWxfZGlzdHJpYnV0aW9uIGRpc3RyaWJ1dGlvbl90eXBlOworCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZXhwbGljaXQgcGFyYW1fdHlwZShyZXN1bHRfdHlwZSBfX20gPSAwLCByZXN1bHRfdHlwZSBfX3MgPSAxKQorICAgICAgICAgICAgOiBfX25kXyhfX20sIF9fcykge30KKworICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHJlc3VsdF90eXBlIG0oKSBjb25zdCB7cmV0dXJuIF9fbmRfLm1lYW4oKTt9CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcmVzdWx0X3R5cGUgcygpIGNvbnN0IHtyZXR1cm4gX19uZF8uc3RkZGV2KCk7fQorCisgICAgICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX194LCBjb25zdCBwYXJhbV90eXBlJiBfX3kpCisgICAgICAgICAgICB7cmV0dXJuIF9feC5fX25kXyA9PSBfX3kuX19uZF87fQorICAgICAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHBhcmFtX3R5cGUmIF9feCwgY29uc3QgcGFyYW1fdHlwZSYgX195KQorICAgICAgICAgICAge3JldHVybiAhKF9feCA9PSBfX3kpO30KKyAgICAgICAgZnJpZW5kIGNsYXNzIGxvZ25vcm1hbF9kaXN0cmlidXRpb247CisKKyAgICAgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX1JUPgorICAgICAgICBmcmllbmQKKyAgICAgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBsb2dub3JtYWxfZGlzdHJpYnV0aW9uPF9SVD4mIF9feCk7CisKKyAgICAgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX1JUPgorICAgICAgICBmcmllbmQKKyAgICAgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgICAgICAgICAgICBsb2dub3JtYWxfZGlzdHJpYnV0aW9uPF9SVD4mIF9feCk7CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBwYXJhbV90eXBlIF9fcF87CisKK3B1YmxpYzoKKyAgICAvLyBjb25zdHJ1Y3RvciBhbmQgcmVzZXQgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IGxvZ25vcm1hbF9kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgX19tID0gMCwgcmVzdWx0X3R5cGUgX19zID0gMSkKKyAgICAgICAgOiBfX3BfKHBhcmFtX3R5cGUoX19tLCBfX3MpKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBsb2dub3JtYWxfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgICAgOiBfX3BfKF9fcCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCByZXNldCgpIHtfX3BfLl9fbmRfLnJlc2V0KCk7fQorCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9VUk5HJiBfX2cpCisgICAgICAgIHtyZXR1cm4gKCp0aGlzKShfX2csIF9fcF8pO30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9VUk5HJiBfX2csIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgICAge3JldHVybiBfVlNURDo6ZXhwKGNvbnN0X2Nhc3Q8bm9ybWFsX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4mPihfX3AuX19uZF8pKF9fZykpO30KKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtKCkgY29uc3Qge3JldHVybiBfX3BfLm0oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIHMoKSBjb25zdCB7cmV0dXJuIF9fcF8ucygpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYXJhbV90eXBlIHBhcmFtKCkgY29uc3Qge3JldHVybiBfX3BfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3ApIHtfX3BfID0gX19wO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdCB7cmV0dXJuIDA7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdCB7cmV0dXJuIG51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6aW5maW5pdHkoKTt9CisKKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuIF9feC5fX3BfID09IF9feS5fX3BfO30KKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX1JUPgorICAgIGZyaWVuZAorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgICAgIGNvbnN0IGxvZ25vcm1hbF9kaXN0cmlidXRpb248X1JUPiYgX194KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9SVD4KKyAgICBmcmllbmQKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgICAgICBsb2dub3JtYWxfZGlzdHJpYnV0aW9uPF9SVD4mIF9feCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfUlQ+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgIGNvbnN0IGxvZ25vcm1hbF9kaXN0cmlidXRpb248X1JUPiYgX194KQoreworICAgIHJldHVybiBfX29zIDw8IF9feC5fX3BfLl9fbmRfOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfUlQ+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgIGxvZ25vcm1hbF9kaXN0cmlidXRpb248X1JUPiYgX194KQoreworICAgIHJldHVybiBfX2lzID4+IF9feC5fX3BfLl9fbmRfOworfQorCisvLyBwb2lzc29uX2Rpc3RyaWJ1dGlvbgorCit0ZW1wbGF0ZTxjbGFzcyBfSW50VHlwZSA9IGludD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHBvaXNzb25fZGlzdHJpYnV0aW9uCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIF9JbnRUeXBlIHJlc3VsdF90eXBlOworCisgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgcGFyYW1fdHlwZQorICAgIHsKKyAgICAgICAgZG91YmxlIF9fbWVhbl87CisgICAgICAgIGRvdWJsZSBfX3NfOworICAgICAgICBkb3VibGUgX19kXzsKKyAgICAgICAgZG91YmxlIF9fbF87CisgICAgICAgIGRvdWJsZSBfX29tZWdhXzsKKyAgICAgICAgZG91YmxlIF9fYzBfOworICAgICAgICBkb3VibGUgX19jMV87CisgICAgICAgIGRvdWJsZSBfX2MyXzsKKyAgICAgICAgZG91YmxlIF9fYzNfOworICAgICAgICBkb3VibGUgX19jXzsKKworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiBwb2lzc29uX2Rpc3RyaWJ1dGlvbiBkaXN0cmlidXRpb25fdHlwZTsKKworICAgICAgICBleHBsaWNpdCBwYXJhbV90eXBlKGRvdWJsZSBfX21lYW4gPSAxLjApOworCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZG91YmxlIG1lYW4oKSBjb25zdCB7cmV0dXJuIF9fbWVhbl87fQorCisgICAgICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX194LCBjb25zdCBwYXJhbV90eXBlJiBfX3kpCisgICAgICAgICAgICB7cmV0dXJuIF9feC5fX21lYW5fID09IF9feS5fX21lYW5fO30KKyAgICAgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwYXJhbV90eXBlJiBfX3gsIGNvbnN0IHBhcmFtX3R5cGUmIF9feSkKKyAgICAgICAgICAgIHtyZXR1cm4gIShfX3ggPT0gX195KTt9CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIHBvaXNzb25fZGlzdHJpYnV0aW9uOworICAgIH07CisKK3ByaXZhdGU6CisgICAgcGFyYW1fdHlwZSBfX3BfOworCitwdWJsaWM6CisgICAgLy8gY29uc3RydWN0b3JzIGFuZCByZXNldCBmdW5jdGlvbnMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgcG9pc3Nvbl9kaXN0cmlidXRpb24oZG91YmxlIF9fbWVhbiA9IDEuMCkgOiBfX3BfKF9fbWVhbikge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgcG9pc3Nvbl9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKSA6IF9fcF8oX19wKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHJlc2V0KCkge30KKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgdGVtcGxhdGU8Y2xhc3MgX1VSTkc+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfVVJORyYgX19nKQorICAgICAgICB7cmV0dXJuICgqdGhpcykoX19nLCBfX3BfKTt9CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoX1VSTkcmIF9fZywgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBkb3VibGUgbWVhbigpIGNvbnN0IHtyZXR1cm4gX19wXy5tZWFuKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhcmFtX3R5cGUgcGFyYW0oKSBjb25zdCB7cmV0dXJuIF9fcF87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkge19fcF8gPSBfX3A7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG1pbigpIGNvbnN0IHtyZXR1cm4gMDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG1heCgpIGNvbnN0IHtyZXR1cm4gbnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTt9CisKKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgcG9pc3Nvbl9kaXN0cmlidXRpb24mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaXNzb25fZGlzdHJpYnV0aW9uJiBfX3kpCisgICAgICAgIHtyZXR1cm4gX194Ll9fcF8gPT0gX195Ll9fcF87fQorICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwb2lzc29uX2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pc3Nvbl9kaXN0cmlidXRpb24mIF9feSkKKyAgICAgICAge3JldHVybiAhKF9feCA9PSBfX3kpO30KK307CisKK3RlbXBsYXRlPGNsYXNzIF9JbnRUeXBlPgorcG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGU+OjpwYXJhbV90eXBlOjpwYXJhbV90eXBlKGRvdWJsZSBfX21lYW4pCisgICAgOiBfX21lYW5fKF9fbWVhbikKK3sKKyAgICBpZiAoX19tZWFuXyA8IDEwKQorICAgIHsKKyAgICAgICAgX19zXyA9IDA7CisgICAgICAgIF9fZF8gPSAwOworICAgICAgICBfX2xfID0gX1ZTVEQ6OmV4cCgtX19tZWFuXyk7CisgICAgICAgIF9fb21lZ2FfID0gMDsKKyAgICAgICAgX19jM18gPSAwOworICAgICAgICBfX2MyXyA9IDA7CisgICAgICAgIF9fYzFfID0gMDsKKyAgICAgICAgX19jMF8gPSAwOworICAgICAgICBfX2NfID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX19zXyA9IF9WU1REOjpzcXJ0KF9fbWVhbl8pOworICAgICAgICBfX2RfID0gNiAqIF9fbWVhbl8gKiBfX21lYW5fOworICAgICAgICBfX2xfID0gc3RhdGljX2Nhc3Q8cmVzdWx0X3R5cGU+KF9fbWVhbl8gLSAxLjE0ODQpOworICAgICAgICBfX29tZWdhXyA9IC4zOTg5NDIzIC8gX19zXzsKKyAgICAgICAgZG91YmxlIF9fYjFfID0gLjQxNjY2NjdFLTEgLyBfX21lYW5fOworICAgICAgICBkb3VibGUgX19iMl8gPSAuMyAqIF9fYjFfICogX19iMV87CisgICAgICAgIF9fYzNfID0gLjE0Mjg1NzEgKiBfX2IxXyAqIF9fYjJfOworICAgICAgICBfX2MyXyA9IF9fYjJfIC0gMTUuICogX19jM187CisgICAgICAgIF9fYzFfID0gX19iMV8gLSA2LiAqIF9fYjJfICsgNDUuICogX19jM187CisgICAgICAgIF9fYzBfID0gMS4gLSBfX2IxXyArIDMuICogX19iMl8gLSAxNS4gKiBfX2MzXzsKKyAgICAgICAgX19jXyA9IC4xMDY5IC8gX19tZWFuXzsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfSW50VHlwZT4KK3RlbXBsYXRlPGNsYXNzIF9VUk5HPgorX0ludFR5cGUKK3BvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6b3BlcmF0b3IoKShfVVJORyYgX191cm5nLCBjb25zdCBwYXJhbV90eXBlJiBfX3ByKQoreworICAgIHJlc3VsdF90eXBlIF9feDsKKyAgICB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4gX191cmQ7CisgICAgaWYgKF9fcHIuX19tZWFuXyA8IDEwKQorICAgIHsKKyAgICAgICAgIF9feCA9IDA7CisgICAgICAgIGZvciAoZG91YmxlIF9fcCA9IF9fdXJkKF9fdXJuZyk7IF9fcCA+IF9fcHIuX19sXzsgKytfX3gpCisgICAgICAgICAgICBfX3AgKj0gX191cmQoX191cm5nKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZG91YmxlIF9fZGlmbXVrOworICAgICAgICBkb3VibGUgX19nID0gX19wci5fX21lYW5fICsgX19wci5fX3NfICogbm9ybWFsX2Rpc3RyaWJ1dGlvbjxkb3VibGU+KCkoX191cm5nKTsKKyAgICAgICAgZG91YmxlIF9fdTsKKyAgICAgICAgaWYgKF9fZyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9feCA9IHN0YXRpY19jYXN0PHJlc3VsdF90eXBlPihfX2cpOworICAgICAgICAgICAgaWYgKF9feCA+PSBfX3ByLl9fbF8pCisgICAgICAgICAgICAgICAgcmV0dXJuIF9feDsKKyAgICAgICAgICAgIF9fZGlmbXVrID0gX19wci5fX21lYW5fIC0gX194OworICAgICAgICAgICAgX191ID0gX191cmQoX191cm5nKTsKKyAgICAgICAgICAgIGlmIChfX3ByLl9fZF8gKiBfX3UgPj0gX19kaWZtdWsgKiBfX2RpZm11ayAqIF9fZGlmbXVrKQorICAgICAgICAgICAgICAgIHJldHVybiBfX3g7CisgICAgICAgIH0KKyAgICAgICAgZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4gX19lZGlzdDsKKyAgICAgICAgZm9yIChib29sIF9fdXNpbmdfZXhwX2Rpc3QgPSBmYWxzZTsgdHJ1ZTsgX191c2luZ19leHBfZGlzdCA9IHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBfX2U7CisgICAgICAgICAgICBpZiAoX191c2luZ19leHBfZGlzdCB8fCBfX2cgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBfX3Q7CisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9fZSA9IF9fZWRpc3QoX191cm5nKTsKKyAgICAgICAgICAgICAgICAgICAgX191ID0gX191cmQoX191cm5nKTsKKyAgICAgICAgICAgICAgICAgICAgX191ICs9IF9fdSAtIDE7CisgICAgICAgICAgICAgICAgICAgIF9fdCA9IDEuOCArIChfX3UgPCAwID8gLV9fZSA6IF9fZSk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoX190IDw9IC0uNjc0NCk7CisgICAgICAgICAgICAgICAgX194ID0gX19wci5fX21lYW5fICsgX19wci5fX3NfICogX190OworICAgICAgICAgICAgICAgIF9fZGlmbXVrID0gX19wci5fX21lYW5fIC0gX194OworICAgICAgICAgICAgICAgIF9fdXNpbmdfZXhwX2Rpc3QgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG91YmxlIF9fcHg7CisgICAgICAgICAgICBkb3VibGUgX19weTsKKyAgICAgICAgICAgIGlmIChfX3ggPCAxMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgX19mYWNbXSA9IHsxLCAxLCAyLCA2LCAyNCwgMTIwLCA3MjAsIDUwNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDMyMCwgMzYyODgwfTsKKyAgICAgICAgICAgICAgICBfX3B4ID0gLV9fcHIuX19tZWFuXzsKKyAgICAgICAgICAgICAgICBfX3B5ID0gX1ZTVEQ6OnBvdyhfX3ByLl9fbWVhbl8sIChkb3VibGUpX194KSAvIF9fZmFjW19feF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIF9fZGVsID0gLjgzMzMzMzNFLTEgLyBfX3g7CisgICAgICAgICAgICAgICAgX19kZWwgLT0gNC44ICogX19kZWwgKiBfX2RlbCAqIF9fZGVsOworICAgICAgICAgICAgICAgIGRvdWJsZSBfX3YgPSBfX2RpZm11ayAvIF9feDsKKyAgICAgICAgICAgICAgICBpZiAoX1ZTVEQ6OmFicyhfX3YpID4gMC4yNSkKKyAgICAgICAgICAgICAgICAgICAgX19weCA9IF9feCAqIF9WU1REOjpsb2coMSArIF9fdikgLSBfX2RpZm11ayAtIF9fZGVsOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgX19weCA9IF9feCAqIF9fdiAqIF9fdiAqICgoKCgoKCguMTI1MDA2MCAqIF9fdiArIC0uMTM4NDc5NCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgX192ICsgLjE0MjE4NzgpICogX192ICsgLS4xNjYxMjY5KSAqIF9fdiArIC4yMDAwMTE4KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3YgKyAtLjI1MDAwNjgpICogX192ICsgLjMzMzMzMzMpICogX192ICsgLS41KSAtIF9fZGVsOworICAgICAgICAgICAgICAgIF9fcHkgPSAuMzk4OTQyMyAvIF9WU1REOjpzcXJ0KF9feCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkb3VibGUgX19yID0gKDAuNSAtIF9fZGlmbXVrKSAvIF9fcHIuX19zXzsKKyAgICAgICAgICAgIGRvdWJsZSBfX3IyID0gX19yICogX19yOworICAgICAgICAgICAgZG91YmxlIF9fZnggPSAtMC41ICogX19yMjsKKyAgICAgICAgICAgIGRvdWJsZSBfX2Z5ID0gX19wci5fX29tZWdhXyAqICgoKF9fcHIuX19jM18gKiBfX3IyICsgX19wci5fX2MyXykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcjIgKyBfX3ByLl9fYzFfKSAqIF9fcjIgKyBfX3ByLl9fYzBfKTsKKyAgICAgICAgICAgIGlmIChfX3VzaW5nX2V4cF9kaXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfX3ByLl9fY18gKiBfVlNURDo6YWJzKF9fdSkgPD0gX19weSAqIF9WU1REOjpleHAoX19weCArIF9fZSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19meSAqIF9WU1REOjpleHAoX19meCArIF9fZSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfX2Z5IC0gX191ICogX19meSA8PSBfX3B5ICogX1ZTVEQ6OmV4cChfX3B4IC0gX19meCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX3g7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9JbnRUeXBlPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgIGNvbnN0IHBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX194KQoreworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19vcyk7CisgICAgX19vcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OmxlZnQgfCBpb3NfYmFzZTo6Zml4ZWQgfAorICAgICAgICAgICAgICAgaW9zX2Jhc2U6OnNjaWVudGlmaWMpOworICAgIHJldHVybiBfX29zIDw8IF9feC5tZWFuKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9JbnRUeXBlPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgIHBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX194KQoreworICAgIHR5cGVkZWYgcG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGU+IF9Fbmc7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRW5nOjpwYXJhbV90eXBlIHBhcmFtX3R5cGU7CisgICAgX19zYXZlX2ZsYWdzPF9DaGFyVCwgX1RyYWl0cz4gX19seChfX2lzKTsKKyAgICBfX2lzLmZsYWdzKGlvc19iYXNlOjpkZWMgfCBpb3NfYmFzZTo6c2tpcHdzKTsKKyAgICBkb3VibGUgX19tZWFuOworICAgIF9faXMgPj4gX19tZWFuOworICAgIGlmICghX19pcy5mYWlsKCkpCisgICAgICAgIF9feC5wYXJhbShwYXJhbV90eXBlKF9fbWVhbikpOworICAgIHJldHVybiBfX2lzOworfQorCisvLyB3ZWlidWxsX2Rpc3RyaWJ1dGlvbgorCit0ZW1wbGF0ZTxjbGFzcyBfUmVhbFR5cGUgPSBkb3VibGU+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB3ZWlidWxsX2Rpc3RyaWJ1dGlvbgoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBwYXJhbV90eXBlCisgICAgeworICAgICAgICByZXN1bHRfdHlwZSBfX2FfOworICAgICAgICByZXN1bHRfdHlwZSBfX2JfOworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiB3ZWlidWxsX2Rpc3RyaWJ1dGlvbiBkaXN0cmlidXRpb25fdHlwZTsKKworICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGV4cGxpY2l0IHBhcmFtX3R5cGUocmVzdWx0X3R5cGUgX19hID0gMSwgcmVzdWx0X3R5cGUgX19iID0gMSkKKyAgICAgICAgICAgIDogX19hXyhfX2EpLCBfX2JfKF9fYikge30KKworICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHJlc3VsdF90eXBlIGEoKSBjb25zdCB7cmV0dXJuIF9fYV87fQorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHJlc3VsdF90eXBlIGIoKSBjb25zdCB7cmV0dXJuIF9fYl87fQorCisgICAgICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX194LCBjb25zdCBwYXJhbV90eXBlJiBfX3kpCisgICAgICAgICAgICB7cmV0dXJuIF9feC5fX2FfID09IF9feS5fX2FfICYmIF9feC5fX2JfID09IF9feS5fX2JfO30KKyAgICAgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwYXJhbV90eXBlJiBfX3gsIGNvbnN0IHBhcmFtX3R5cGUmIF9feSkKKyAgICAgICAgICAgIHtyZXR1cm4gIShfX3ggPT0gX195KTt9CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBwYXJhbV90eXBlIF9fcF87CisKK3B1YmxpYzoKKyAgICAvLyBjb25zdHJ1Y3RvciBhbmQgcmVzZXQgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IHdlaWJ1bGxfZGlzdHJpYnV0aW9uKHJlc3VsdF90eXBlIF9fYSA9IDEsIHJlc3VsdF90eXBlIF9fYiA9IDEpCisgICAgICAgIDogX19wXyhwYXJhbV90eXBlKF9fYSwgX19iKSkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgd2VpYnVsbF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgICA6IF9fcF8oX19wKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHJlc2V0KCkge30KKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgdGVtcGxhdGU8Y2xhc3MgX1VSTkc+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfVVJORyYgX19nKQorICAgICAgICB7cmV0dXJuICgqdGhpcykoX19nLCBfX3BfKTt9CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VSTkc+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfVVJORyYgX19nLCBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICAgIHtyZXR1cm4gX19wLmIoKSAqCisgICAgICAgICAgICBfVlNURDo6cG93KGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4oKShfX2cpLCAxL19fcC5hKCkpO30KKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBhKCkgY29uc3Qge3JldHVybiBfX3BfLmEoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIGIoKSBjb25zdCB7cmV0dXJuIF9fcF8uYigpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYXJhbV90eXBlIHBhcmFtKCkgY29uc3Qge3JldHVybiBfX3BfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3ApIHtfX3BfID0gX19wO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdCB7cmV0dXJuIDA7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdCB7cmV0dXJuIG51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6aW5maW5pdHkoKTt9CisKKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3Qgd2VpYnVsbF9kaXN0cmlidXRpb24mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdlaWJ1bGxfZGlzdHJpYnV0aW9uJiBfX3kpCisgICAgICAgIHtyZXR1cm4gX194Ll9fcF8gPT0gX195Ll9fcF87fQorICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCB3ZWlidWxsX2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2VpYnVsbF9kaXN0cmlidXRpb24mIF9feSkKKyAgICAgICAge3JldHVybiAhKF9feCA9PSBfX3kpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9SVD4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorICAgICAgICAgICBjb25zdCB3ZWlidWxsX2Rpc3RyaWJ1dGlvbjxfUlQ+JiBfX3gpCit7CisgICAgX19zYXZlX2ZsYWdzPF9DaGFyVCwgX1RyYWl0cz4gX19seChfX29zKTsKKyAgICBfX29zLmZsYWdzKGlvc19iYXNlOjpkZWMgfCBpb3NfYmFzZTo6bGVmdCB8IGlvc19iYXNlOjpmaXhlZCB8CisgICAgICAgICAgICAgICBpb3NfYmFzZTo6c2NpZW50aWZpYyk7CisgICAgX0NoYXJUIF9fc3AgPSBfX29zLndpZGVuKCcgJyk7CisgICAgX19vcy5maWxsKF9fc3ApOworICAgIF9fb3MgPDwgX194LmEoKSA8PCBfX3NwIDw8IF9feC5iKCk7CisgICAgcmV0dXJuIF9fb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9SVD4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorICAgICAgICAgICB3ZWlidWxsX2Rpc3RyaWJ1dGlvbjxfUlQ+JiBfX3gpCit7CisgICAgdHlwZWRlZiB3ZWlidWxsX2Rpc3RyaWJ1dGlvbjxfUlQ+IF9Fbmc7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRW5nOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Fbmc6OnBhcmFtX3R5cGUgcGFyYW1fdHlwZTsKKyAgICBfX3NhdmVfZmxhZ3M8X0NoYXJULCBfVHJhaXRzPiBfX2x4KF9faXMpOworICAgIF9faXMuZmxhZ3MoaW9zX2Jhc2U6OmRlYyB8IGlvc19iYXNlOjpza2lwd3MpOworICAgIHJlc3VsdF90eXBlIF9fYTsKKyAgICByZXN1bHRfdHlwZSBfX2I7CisgICAgX19pcyA+PiBfX2EgPj4gX19iOworICAgIGlmICghX19pcy5mYWlsKCkpCisgICAgICAgIF9feC5wYXJhbShwYXJhbV90eXBlKF9fYSwgX19iKSk7CisgICAgcmV0dXJuIF9faXM7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9SZWFsVHlwZSA9IGRvdWJsZT4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKworICAgIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHBhcmFtX3R5cGUKKyAgICB7CisgICAgICAgIHJlc3VsdF90eXBlIF9fYV87CisgICAgICAgIHJlc3VsdF90eXBlIF9fYl87CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uIGRpc3RyaWJ1dGlvbl90eXBlOworCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZXhwbGljaXQgcGFyYW1fdHlwZShyZXN1bHRfdHlwZSBfX2EgPSAwLCByZXN1bHRfdHlwZSBfX2IgPSAxKQorICAgICAgICAgICAgOiBfX2FfKF9fYSksIF9fYl8oX19iKSB7fQorCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcmVzdWx0X3R5cGUgYSgpIGNvbnN0IHtyZXR1cm4gX19hXzt9CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcmVzdWx0X3R5cGUgYigpIGNvbnN0IHtyZXR1cm4gX19iXzt9CisKKyAgICAgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3gsIGNvbnN0IHBhcmFtX3R5cGUmIF9feSkKKyAgICAgICAgICAgIHtyZXR1cm4gX194Ll9fYV8gPT0gX195Ll9fYV8gJiYgX194Ll9fYl8gPT0gX195Ll9fYl87fQorICAgICAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHBhcmFtX3R5cGUmIF9feCwgY29uc3QgcGFyYW1fdHlwZSYgX195KQorICAgICAgICAgICAge3JldHVybiAhKF9feCA9PSBfX3kpO30KKyAgICB9OworCitwcml2YXRlOgorICAgIHBhcmFtX3R5cGUgX19wXzsKKworcHVibGljOgorICAgIC8vIGNvbnN0cnVjdG9yIGFuZCByZXNldCBmdW5jdGlvbnMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgX19hID0gMCwgcmVzdWx0X3R5cGUgX19iID0gMSkKKyAgICAgICAgOiBfX3BfKHBhcmFtX3R5cGUoX19hLCBfX2IpKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICAgIDogX19wXyhfX3ApIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcmVzZXQoKSB7fQorCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9VUk5HJiBfX2cpCisgICAgICAgIHtyZXR1cm4gKCp0aGlzKShfX2csIF9fcF8pO30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfVVJORyYgX19nLCBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIGEoKSBjb25zdCB7cmV0dXJuIF9fcF8uYSgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVzdWx0X3R5cGUgYigpIGNvbnN0IHtyZXR1cm4gX19wXy5iKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhcmFtX3R5cGUgcGFyYW0oKSBjb25zdCB7cmV0dXJuIF9fcF87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkge19fcF8gPSBfX3A7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG1pbigpIGNvbnN0IHtyZXR1cm4gLW51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6aW5maW5pdHkoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG1heCgpIGNvbnN0IHtyZXR1cm4gbnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjppbmZpbml0eSgpO30KKworICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb24mIF9feSkKKyAgICAgICAge3JldHVybiBfX3guX19wXyA9PSBfX3kuX19wXzt9CisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uJiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorfTsKKwordGVtcGxhdGU8Y2xhc3MgX1JlYWxUeXBlPgordGVtcGxhdGU8Y2xhc3MgX1VSTkc+CitfUmVhbFR5cGUKK2V4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46Om9wZXJhdG9yKCkoX1VSTkcmIF9fZywgY29uc3QgcGFyYW1fdHlwZSYgX19wKQoreworICAgIHJldHVybiBfX3AuYSgpIC0gX19wLmIoKSAqCisgICAgICAgICBfVlNURDo6bG9nKC1fVlNURDo6bG9nKDEtdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4oKShfX2cpKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9SVD4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorICAgICAgICAgICBjb25zdCBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbjxfUlQ+JiBfX3gpCit7CisgICAgX19zYXZlX2ZsYWdzPF9DaGFyVCwgX1RyYWl0cz4gX19seChfX29zKTsKKyAgICBfX29zLmZsYWdzKGlvc19iYXNlOjpkZWMgfCBpb3NfYmFzZTo6bGVmdCB8IGlvc19iYXNlOjpmaXhlZCB8CisgICAgICAgICAgICAgICBpb3NfYmFzZTo6c2NpZW50aWZpYyk7CisgICAgX0NoYXJUIF9fc3AgPSBfX29zLndpZGVuKCcgJyk7CisgICAgX19vcy5maWxsKF9fc3ApOworICAgIF9fb3MgPDwgX194LmEoKSA8PCBfX3NwIDw8IF9feC5iKCk7CisgICAgcmV0dXJuIF9fb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9SVD4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorICAgICAgICAgICBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbjxfUlQ+JiBfX3gpCit7CisgICAgdHlwZWRlZiBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbjxfUlQ+IF9Fbmc7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRW5nOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Fbmc6OnBhcmFtX3R5cGUgcGFyYW1fdHlwZTsKKyAgICBfX3NhdmVfZmxhZ3M8X0NoYXJULCBfVHJhaXRzPiBfX2x4KF9faXMpOworICAgIF9faXMuZmxhZ3MoaW9zX2Jhc2U6OmRlYyB8IGlvc19iYXNlOjpza2lwd3MpOworICAgIHJlc3VsdF90eXBlIF9fYTsKKyAgICByZXN1bHRfdHlwZSBfX2I7CisgICAgX19pcyA+PiBfX2EgPj4gX19iOworICAgIGlmICghX19pcy5mYWlsKCkpCisgICAgICAgIF9feC5wYXJhbShwYXJhbV90eXBlKF9fYSwgX19iKSk7CisgICAgcmV0dXJuIF9faXM7Cit9CisKKy8vIGdhbW1hX2Rpc3RyaWJ1dGlvbgorCit0ZW1wbGF0ZTxjbGFzcyBfUmVhbFR5cGUgPSBkb3VibGU+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBnYW1tYV9kaXN0cmlidXRpb24KK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworCisgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgcGFyYW1fdHlwZQorICAgIHsKKyAgICAgICAgcmVzdWx0X3R5cGUgX19hbHBoYV87CisgICAgICAgIHJlc3VsdF90eXBlIF9fYmV0YV87CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIGdhbW1hX2Rpc3RyaWJ1dGlvbiBkaXN0cmlidXRpb25fdHlwZTsKKworICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGV4cGxpY2l0IHBhcmFtX3R5cGUocmVzdWx0X3R5cGUgX19hbHBoYSA9IDEsIHJlc3VsdF90eXBlIF9fYmV0YSA9IDEpCisgICAgICAgICAgICA6IF9fYWxwaGFfKF9fYWxwaGEpLCBfX2JldGFfKF9fYmV0YSkge30KKworICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHJlc3VsdF90eXBlIGFscGhhKCkgY29uc3Qge3JldHVybiBfX2FscGhhXzt9CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcmVzdWx0X3R5cGUgYmV0YSgpIGNvbnN0IHtyZXR1cm4gX19iZXRhXzt9CisKKyAgICAgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3gsIGNvbnN0IHBhcmFtX3R5cGUmIF9feSkKKyAgICAgICAgICAgIHtyZXR1cm4gX194Ll9fYWxwaGFfID09IF9feS5fX2FscGhhXyAmJiBfX3guX19iZXRhXyA9PSBfX3kuX19iZXRhXzt9CisgICAgICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgcGFyYW1fdHlwZSYgX194LCBjb25zdCBwYXJhbV90eXBlJiBfX3kpCisgICAgICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorICAgIH07CisKK3ByaXZhdGU6CisgICAgcGFyYW1fdHlwZSBfX3BfOworCitwdWJsaWM6CisgICAgLy8gY29uc3RydWN0b3JzIGFuZCByZXNldCBmdW5jdGlvbnMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgZ2FtbWFfZGlzdHJpYnV0aW9uKHJlc3VsdF90eXBlIF9fYWxwaGEgPSAxLCByZXN1bHRfdHlwZSBfX2JldGEgPSAxKQorICAgICAgICA6IF9fcF8ocGFyYW1fdHlwZShfX2FscGhhLCBfX2JldGEpKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBnYW1tYV9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgICA6IF9fcF8oX19wKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHJlc2V0KCkge30KKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgdGVtcGxhdGU8Y2xhc3MgX1VSTkc+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfVVJORyYgX19nKQorICAgICAgICB7cmV0dXJuICgqdGhpcykoX19nLCBfX3BfKTt9CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoX1VSTkcmIF9fZywgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBhbHBoYSgpIGNvbnN0IHtyZXR1cm4gX19wXy5hbHBoYSgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVzdWx0X3R5cGUgYmV0YSgpIGNvbnN0IHtyZXR1cm4gX19wXy5iZXRhKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhcmFtX3R5cGUgcGFyYW0oKSBjb25zdCB7cmV0dXJuIF9fcF87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkge19fcF8gPSBfX3A7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG1pbigpIGNvbnN0IHtyZXR1cm4gMDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG1heCgpIGNvbnN0IHtyZXR1cm4gbnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjppbmZpbml0eSgpO30KKworICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBnYW1tYV9kaXN0cmlidXRpb24mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdhbW1hX2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuIF9feC5fX3BfID09IF9feS5fX3BfO30KKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgZ2FtbWFfZGlzdHJpYnV0aW9uJiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYW1tYV9kaXN0cmlidXRpb24mIF9feSkKKyAgICAgICAge3JldHVybiAhKF9feCA9PSBfX3kpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVhbFR5cGU+Cit0ZW1wbGF0ZTxjbGFzcyBfVVJORz4KK19SZWFsVHlwZQorZ2FtbWFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46Om9wZXJhdG9yKCkoX1VSTkcmIF9fZywgY29uc3QgcGFyYW1fdHlwZSYgX19wKQoreworICAgIHJlc3VsdF90eXBlIF9fYSA9IF9fcC5hbHBoYSgpOworICAgIHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9fZ2VuKDAsIDEpOworICAgIGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gX19lZ2VuOworICAgIHJlc3VsdF90eXBlIF9feDsKKyAgICBpZiAoX19hID09IDEpCisgICAgICAgIF9feCA9IF9fZWdlbihfX2cpOworICAgIGVsc2UgaWYgKF9fYSA+IDEpCisgICAgeworICAgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX2IgPSBfX2EgLSAxOworICAgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX2MgPSAzICogX19hIC0gcmVzdWx0X3R5cGUoMC43NSk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX3UgPSBfX2dlbihfX2cpOworICAgICAgICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX192ID0gX19nZW4oX19nKTsKKyAgICAgICAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fdyA9IF9fdSAqICgxIC0gX191KTsKKyAgICAgICAgICAgIGlmIChfX3cgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX3kgPSBfVlNURDo6c3FydChfX2MgLyBfX3cpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX191IC0gcmVzdWx0X3R5cGUoMC41KSk7CisgICAgICAgICAgICAgICAgX194ID0gX19iICsgX195OworICAgICAgICAgICAgICAgIGlmIChfX3ggPj0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9feiA9IDY0ICogX193ICogX193ICogX193ICogX192ICogX192OworICAgICAgICAgICAgICAgICAgICBpZiAoX196IDw9IDEgLSAyICogX195ICogX195IC8gX194KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlmIChfVlNURDo6bG9nKF9feikgPD0gMiAqIChfX2IgKiBfVlNURDo6bG9nKF9feCAvIF9fYikgLSBfX3kpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgIC8vIF9fYSA8IDEKKyAgICB7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX3UgPSBfX2dlbihfX2cpOworICAgICAgICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX19lcyA9IF9fZWdlbihfX2cpOworICAgICAgICAgICAgaWYgKF9fdSA8PSAxIC0gX19hKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9feCA9IF9WU1REOjpwb3coX191LCAxIC8gX19hKTsKKyAgICAgICAgICAgICAgICBpZiAoX194IDw9IF9fZXMpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fZSA9IC1fVlNURDo6bG9nKCgxLV9fdSkvX19hKTsKKyAgICAgICAgICAgICAgICBfX3ggPSBfVlNURDo6cG93KDEgLSBfX2EgKyBfX2EgKiBfX2UsIDEgLyBfX2EpOworICAgICAgICAgICAgICAgIGlmIChfX3ggPD0gX19lICsgX19lcykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9feCAqIF9fcC5iZXRhKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9SVD4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorICAgICAgICAgICBjb25zdCBnYW1tYV9kaXN0cmlidXRpb248X1JUPiYgX194KQoreworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19vcyk7CisgICAgX19vcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OmxlZnQgfCBpb3NfYmFzZTo6Zml4ZWQgfAorICAgICAgICAgICAgICAgaW9zX2Jhc2U6OnNjaWVudGlmaWMpOworICAgIF9DaGFyVCBfX3NwID0gX19vcy53aWRlbignICcpOworICAgIF9fb3MuZmlsbChfX3NwKTsKKyAgICBfX29zIDw8IF9feC5hbHBoYSgpIDw8IF9fc3AgPDwgX194LmJldGEoKTsKKyAgICByZXR1cm4gX19vczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX1JUPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgIGdhbW1hX2Rpc3RyaWJ1dGlvbjxfUlQ+JiBfX3gpCit7CisgICAgdHlwZWRlZiBnYW1tYV9kaXN0cmlidXRpb248X1JUPiBfRW5nOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0VuZzo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRW5nOjpwYXJhbV90eXBlIHBhcmFtX3R5cGU7CisgICAgX19zYXZlX2ZsYWdzPF9DaGFyVCwgX1RyYWl0cz4gX19seChfX2lzKTsKKyAgICBfX2lzLmZsYWdzKGlvc19iYXNlOjpkZWMgfCBpb3NfYmFzZTo6c2tpcHdzKTsKKyAgICByZXN1bHRfdHlwZSBfX2FscGhhOworICAgIHJlc3VsdF90eXBlIF9fYmV0YTsKKyAgICBfX2lzID4+IF9fYWxwaGEgPj4gX19iZXRhOworICAgIGlmICghX19pcy5mYWlsKCkpCisgICAgICAgIF9feC5wYXJhbShwYXJhbV90eXBlKF9fYWxwaGEsIF9fYmV0YSkpOworICAgIHJldHVybiBfX2lzOworfQorCisvLyBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb24KKwordGVtcGxhdGU8Y2xhc3MgX0ludFR5cGUgPSBpbnQ+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb24KK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgX0ludFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBwYXJhbV90eXBlCisgICAgeworICAgICAgICByZXN1bHRfdHlwZSBfX2tfOworICAgICAgICBkb3VibGUgX19wXzsKKyAgICBwdWJsaWM6CisgICAgICAgIHR5cGVkZWYgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uIGRpc3RyaWJ1dGlvbl90eXBlOworCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZXhwbGljaXQgcGFyYW1fdHlwZShyZXN1bHRfdHlwZSBfX2sgPSAxLCBkb3VibGUgX19wID0gMC41KQorICAgICAgICAgICAgOiBfX2tfKF9fayksIF9fcF8oX19wKSB7fQorCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcmVzdWx0X3R5cGUgaygpIGNvbnN0IHtyZXR1cm4gX19rXzt9CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZG91YmxlIHAoKSBjb25zdCB7cmV0dXJuIF9fcF87fQorCisgICAgICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX194LCBjb25zdCBwYXJhbV90eXBlJiBfX3kpCisgICAgICAgICAgICB7cmV0dXJuIF9feC5fX2tfID09IF9feS5fX2tfICYmIF9feC5fX3BfID09IF9feS5fX3BfO30KKyAgICAgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwYXJhbV90eXBlJiBfX3gsIGNvbnN0IHBhcmFtX3R5cGUmIF9feSkKKyAgICAgICAgICAgIHtyZXR1cm4gIShfX3ggPT0gX195KTt9CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBwYXJhbV90eXBlIF9fcF87CisKK3B1YmxpYzoKKyAgICAvLyBjb25zdHJ1Y3RvciBhbmQgcmVzZXQgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbihyZXN1bHRfdHlwZSBfX2sgPSAxLCBkb3VibGUgX19wID0gMC41KQorICAgICAgICA6IF9fcF8oX19rLCBfX3ApIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApIDogX19wXyhfX3ApIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcmVzZXQoKSB7fQorCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9VUk5HJiBfX2cpCisgICAgICAgIHtyZXR1cm4gKCp0aGlzKShfX2csIF9fcF8pO30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfVVJORyYgX19nLCBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIGsoKSBjb25zdCB7cmV0dXJuIF9fcF8uaygpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZG91YmxlIHAoKSBjb25zdCB7cmV0dXJuIF9fcF8ucCgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYXJhbV90eXBlIHBhcmFtKCkgY29uc3Qge3JldHVybiBfX3BfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3ApIHtfX3BfID0gX19wO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdCB7cmV0dXJuIDA7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdCB7cmV0dXJuIG51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7fQorCisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uJiBfX3kpCisgICAgICAgIHtyZXR1cm4gX194Ll9fcF8gPT0gX195Ll9fcF87fQorICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb24mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9JbnRUeXBlPgordGVtcGxhdGU8Y2xhc3MgX1VSTkc+CitfSW50VHlwZQorbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6b3BlcmF0b3IoKShfVVJORyYgX191cm5nLCBjb25zdCBwYXJhbV90eXBlJiBfX3ByKQoreworICAgIHJlc3VsdF90eXBlIF9fayA9IF9fcHIuaygpOworICAgIGRvdWJsZSBfX3AgPSBfX3ByLnAoKTsKKyAgICBpZiAoX19rIDw9IDIxICogX19wKQorICAgIHsKKyAgICAgICAgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiBfX2dlbihfX3ApOworICAgICAgICByZXN1bHRfdHlwZSBfX2YgPSAwOworICAgICAgICByZXN1bHRfdHlwZSBfX3MgPSAwOworICAgICAgICB3aGlsZSAoX19zIDwgX19rKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX19nZW4oX191cm5nKSkKKyAgICAgICAgICAgICAgICArK19fczsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICArK19fZjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19mOworICAgIH0KKyAgICByZXR1cm4gcG9pc3Nvbl9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+KGdhbW1hX2Rpc3RyaWJ1dGlvbjxkb3VibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX2ssICgxLV9fcCkvX19wKShfX3VybmcpKShfX3VybmcpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfSW50VHlwZT4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorICAgICAgICAgICBjb25zdCBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCit7CisgICAgX19zYXZlX2ZsYWdzPF9DaGFyVCwgX1RyYWl0cz4gX19seChfX29zKTsKKyAgICBfX29zLmZsYWdzKGlvc19iYXNlOjpkZWMgfCBpb3NfYmFzZTo6bGVmdCB8IGlvc19iYXNlOjpmaXhlZCB8CisgICAgICAgICAgICAgICBpb3NfYmFzZTo6c2NpZW50aWZpYyk7CisgICAgX0NoYXJUIF9fc3AgPSBfX29zLndpZGVuKCcgJyk7CisgICAgX19vcy5maWxsKF9fc3ApOworICAgIHJldHVybiBfX29zIDw8IF9feC5rKCkgPDwgX19zcCA8PCBfX3gucCgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfSW50VHlwZT4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorICAgICAgICAgICBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCit7CisgICAgdHlwZWRlZiBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+IF9Fbmc7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRW5nOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Fbmc6OnBhcmFtX3R5cGUgcGFyYW1fdHlwZTsKKyAgICBfX3NhdmVfZmxhZ3M8X0NoYXJULCBfVHJhaXRzPiBfX2x4KF9faXMpOworICAgIF9faXMuZmxhZ3MoaW9zX2Jhc2U6OmRlYyB8IGlvc19iYXNlOjpza2lwd3MpOworICAgIHJlc3VsdF90eXBlIF9fazsKKyAgICBkb3VibGUgX19wOworICAgIF9faXMgPj4gX19rID4+IF9fcDsKKyAgICBpZiAoIV9faXMuZmFpbCgpKQorICAgICAgICBfX3gucGFyYW0ocGFyYW1fdHlwZShfX2ssIF9fcCkpOworICAgIHJldHVybiBfX2lzOworfQorCisvLyBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uCisKK3RlbXBsYXRlPGNsYXNzIF9JbnRUeXBlID0gaW50PgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbgoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBfSW50VHlwZSByZXN1bHRfdHlwZTsKKworICAgIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHBhcmFtX3R5cGUKKyAgICB7CisgICAgICAgIGRvdWJsZSBfX3BfOworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uIGRpc3RyaWJ1dGlvbl90eXBlOworCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZXhwbGljaXQgcGFyYW1fdHlwZShkb3VibGUgX19wID0gMC41KSA6IF9fcF8oX19wKSB7fQorCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZG91YmxlIHAoKSBjb25zdCB7cmV0dXJuIF9fcF87fQorCisgICAgICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX194LCBjb25zdCBwYXJhbV90eXBlJiBfX3kpCisgICAgICAgICAgICB7cmV0dXJuIF9feC5fX3BfID09IF9feS5fX3BfO30KKyAgICAgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwYXJhbV90eXBlJiBfX3gsIGNvbnN0IHBhcmFtX3R5cGUmIF9feSkKKyAgICAgICAgICAgIHtyZXR1cm4gIShfX3ggPT0gX195KTt9CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBwYXJhbV90eXBlIF9fcF87CisKK3B1YmxpYzoKKyAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uKGRvdWJsZSBfX3AgPSAwLjUpIDogX19wXyhfX3ApIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IGdlb21ldHJpY19kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKSA6IF9fcF8oX19wKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHJlc2V0KCkge30KKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgdGVtcGxhdGU8Y2xhc3MgX1VSTkc+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfVVJORyYgX19nKQorICAgICAgICB7cmV0dXJuICgqdGhpcykoX19nLCBfX3BfKTt9CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VSTkc+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfVVJORyYgX19nLCBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICAgIHtyZXR1cm4gbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPigxLCBfX3AucCgpKShfX2cpO30KKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBkb3VibGUgcCgpIGNvbnN0IHtyZXR1cm4gX19wXy5wKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhcmFtX3R5cGUgcGFyYW0oKSBjb25zdCB7cmV0dXJuIF9fcF87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkge19fcF8gPSBfX3A7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG1pbigpIGNvbnN0IHtyZXR1cm4gMDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG1heCgpIGNvbnN0IHtyZXR1cm4gbnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTt9CisKKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuIF9feC5fX3BfID09IF9feS5fX3BfO30KKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0ludFR5cGU+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgY29uc3QgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9feCkKK3sKKyAgICBfX3NhdmVfZmxhZ3M8X0NoYXJULCBfVHJhaXRzPiBfX2x4KF9fb3MpOworICAgIF9fb3MuZmxhZ3MoaW9zX2Jhc2U6OmRlYyB8IGlvc19iYXNlOjpsZWZ0IHwgaW9zX2Jhc2U6OmZpeGVkIHwKKyAgICAgICAgICAgICAgIGlvc19iYXNlOjpzY2llbnRpZmljKTsKKyAgICByZXR1cm4gX19vcyA8PCBfX3gucCgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfSW50VHlwZT4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorICAgICAgICAgICBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX194KQoreworICAgIHR5cGVkZWYgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4gX0VuZzsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Fbmc6OnBhcmFtX3R5cGUgcGFyYW1fdHlwZTsKKyAgICBfX3NhdmVfZmxhZ3M8X0NoYXJULCBfVHJhaXRzPiBfX2x4KF9faXMpOworICAgIF9faXMuZmxhZ3MoaW9zX2Jhc2U6OmRlYyB8IGlvc19iYXNlOjpza2lwd3MpOworICAgIGRvdWJsZSBfX3A7CisgICAgX19pcyA+PiBfX3A7CisgICAgaWYgKCFfX2lzLmZhaWwoKSkKKyAgICAgICAgX194LnBhcmFtKHBhcmFtX3R5cGUoX19wKSk7CisgICAgcmV0dXJuIF9faXM7Cit9CisKKy8vIGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbgorCit0ZW1wbGF0ZTxjbGFzcyBfUmVhbFR5cGUgPSBkb3VibGU+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBjaGlfc3F1YXJlZF9kaXN0cmlidXRpb24KK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworCisgICAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgcGFyYW1fdHlwZQorICAgIHsKKyAgICAgICAgcmVzdWx0X3R5cGUgX19uXzsKKyAgICBwdWJsaWM6CisgICAgICAgIHR5cGVkZWYgY2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uIGRpc3RyaWJ1dGlvbl90eXBlOworCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZXhwbGljaXQgcGFyYW1fdHlwZShyZXN1bHRfdHlwZSBfX24gPSAxKSA6IF9fbl8oX19uKSB7fQorCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcmVzdWx0X3R5cGUgbigpIGNvbnN0IHtyZXR1cm4gX19uXzt9CisKKyAgICAgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3gsIGNvbnN0IHBhcmFtX3R5cGUmIF9feSkKKyAgICAgICAgICAgIHtyZXR1cm4gX194Ll9fbl8gPT0gX195Ll9fbl87fQorICAgICAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHBhcmFtX3R5cGUmIF9feCwgY29uc3QgcGFyYW1fdHlwZSYgX195KQorICAgICAgICAgICAge3JldHVybiAhKF9feCA9PSBfX3kpO30KKyAgICB9OworCitwcml2YXRlOgorICAgIHBhcmFtX3R5cGUgX19wXzsKKworcHVibGljOgorICAgIC8vIGNvbnN0cnVjdG9yIGFuZCByZXNldCBmdW5jdGlvbnMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgY2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uKHJlc3VsdF90eXBlIF9fbiA9IDEpCisgICAgICAgIDogX19wXyhwYXJhbV90eXBlKF9fbikpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICAgIDogX19wXyhfX3ApIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcmVzZXQoKSB7fQorCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9VUk5HJiBfX2cpCisgICAgICAgIHtyZXR1cm4gKCp0aGlzKShfX2csIF9fcF8pO30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9VUk5HJiBfX2csIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgICAge3JldHVybiBnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+KF9fcC5uKCkgLyAyLCAyKShfX2cpO30KKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBuKCkgY29uc3Qge3JldHVybiBfX3BfLm4oKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFyYW1fdHlwZSBwYXJhbSgpIGNvbnN0IHtyZXR1cm4gX19wXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wKSB7X19wXyA9IF9fcDt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVzdWx0X3R5cGUgbWluKCkgY29uc3Qge3JldHVybiAwO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVzdWx0X3R5cGUgbWF4KCkgY29uc3Qge3JldHVybiBudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46OmluZmluaXR5KCk7fQorCisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uJiBfX3kpCisgICAgICAgIHtyZXR1cm4gX194Ll9fcF8gPT0gX195Ll9fcF87fQorICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBjaGlfc3F1YXJlZF9kaXN0cmlidXRpb24mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX1JUPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgIGNvbnN0IGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbjxfUlQ+JiBfX3gpCit7CisgICAgX19zYXZlX2ZsYWdzPF9DaGFyVCwgX1RyYWl0cz4gX19seChfX29zKTsKKyAgICBfX29zLmZsYWdzKGlvc19iYXNlOjpkZWMgfCBpb3NfYmFzZTo6bGVmdCB8IGlvc19iYXNlOjpmaXhlZCB8CisgICAgICAgICAgICAgICBpb3NfYmFzZTo6c2NpZW50aWZpYyk7CisgICAgX19vcyA8PCBfX3gubigpOworICAgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfUlQ+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgICAgY2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uPF9SVD4mIF9feCkKK3sKKyAgICB0eXBlZGVmIGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbjxfUlQ+IF9Fbmc7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRW5nOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Fbmc6OnBhcmFtX3R5cGUgcGFyYW1fdHlwZTsKKyAgICBfX3NhdmVfZmxhZ3M8X0NoYXJULCBfVHJhaXRzPiBfX2x4KF9faXMpOworICAgIF9faXMuZmxhZ3MoaW9zX2Jhc2U6OmRlYyB8IGlvc19iYXNlOjpza2lwd3MpOworICAgIHJlc3VsdF90eXBlIF9fbjsKKyAgICBfX2lzID4+IF9fbjsKKyAgICBpZiAoIV9faXMuZmFpbCgpKQorICAgICAgICBfX3gucGFyYW0ocGFyYW1fdHlwZShfX24pKTsKKyAgICByZXR1cm4gX19pczsKK30KKworLy8gY2F1Y2h5X2Rpc3RyaWJ1dGlvbgorCit0ZW1wbGF0ZTxjbGFzcyBfUmVhbFR5cGUgPSBkb3VibGU+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBjYXVjaHlfZGlzdHJpYnV0aW9uCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKworICAgIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHBhcmFtX3R5cGUKKyAgICB7CisgICAgICAgIHJlc3VsdF90eXBlIF9fYV87CisgICAgICAgIHJlc3VsdF90eXBlIF9fYl87CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIGNhdWNoeV9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBleHBsaWNpdCBwYXJhbV90eXBlKHJlc3VsdF90eXBlIF9fYSA9IDAsIHJlc3VsdF90eXBlIF9fYiA9IDEpCisgICAgICAgICAgICA6IF9fYV8oX19hKSwgX19iXyhfX2IpIHt9CisKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBhKCkgY29uc3Qge3JldHVybiBfX2FfO30KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBiKCkgY29uc3Qge3JldHVybiBfX2JfO30KKworICAgICAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9feCwgY29uc3QgcGFyYW1fdHlwZSYgX195KQorICAgICAgICAgICAge3JldHVybiBfX3guX19hXyA9PSBfX3kuX19hXyAmJiBfX3guX19iXyA9PSBfX3kuX19iXzt9CisgICAgICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgcGFyYW1fdHlwZSYgX194LCBjb25zdCBwYXJhbV90eXBlJiBfX3kpCisgICAgICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorICAgIH07CisKK3ByaXZhdGU6CisgICAgcGFyYW1fdHlwZSBfX3BfOworCitwdWJsaWM6CisgICAgLy8gY29uc3RydWN0b3IgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBjYXVjaHlfZGlzdHJpYnV0aW9uKHJlc3VsdF90eXBlIF9fYSA9IDAsIHJlc3VsdF90eXBlIF9fYiA9IDEpCisgICAgICAgIDogX19wXyhwYXJhbV90eXBlKF9fYSwgX19iKSkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgY2F1Y2h5X2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICAgIDogX19wXyhfX3ApIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcmVzZXQoKSB7fQorCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9VUk5HJiBfX2cpCisgICAgICAgIHtyZXR1cm4gKCp0aGlzKShfX2csIF9fcF8pO30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4gX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9VUk5HJiBfX2csIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAvLyBwcm9wZXJ0eSBmdW5jdGlvbnMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVzdWx0X3R5cGUgYSgpIGNvbnN0IHtyZXR1cm4gX19wXy5hKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBiKCkgY29uc3Qge3JldHVybiBfX3BfLmIoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFyYW1fdHlwZSBwYXJhbSgpIGNvbnN0IHtyZXR1cm4gX19wXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wKSB7X19wXyA9IF9fcDt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVzdWx0X3R5cGUgbWluKCkgY29uc3Qge3JldHVybiAtbnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjppbmZpbml0eSgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVzdWx0X3R5cGUgbWF4KCkgY29uc3Qge3JldHVybiBudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46OmluZmluaXR5KCk7fQorCisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNhdWNoeV9kaXN0cmlidXRpb24mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhdWNoeV9kaXN0cmlidXRpb24mIF9feSkKKyAgICAgICAge3JldHVybiBfX3guX19wXyA9PSBfX3kuX19wXzt9CisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNhdWNoeV9kaXN0cmlidXRpb24mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhdWNoeV9kaXN0cmlidXRpb24mIF9feSkKKyAgICAgICAge3JldHVybiAhKF9feCA9PSBfX3kpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVhbFR5cGU+Cit0ZW1wbGF0ZTxjbGFzcyBfVVJORz4KK2lubGluZQorX1JlYWxUeXBlCitjYXVjaHlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46Om9wZXJhdG9yKCkoX1VSTkcmIF9fZywgY29uc3QgcGFyYW1fdHlwZSYgX19wKQoreworICAgIHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9fZ2VuOworICAgIC8vIHB1cnBvc2VmdWxseSBsZXQgdGFuIGFyZyBnZXQgYXMgY2xvc2UgdG8gcGkvMiBhcyBpdCB3YW50cywgdGFuIHdpbGwgcmV0dXJuIGEgZmluaXRlCisgICAgcmV0dXJuIF9fcC5hKCkgKyBfX3AuYigpICogX1ZTVEQ6OnRhbigzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUgKiBfX2dlbihfX2cpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX1JUPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgIGNvbnN0IGNhdWNoeV9kaXN0cmlidXRpb248X1JUPiYgX194KQoreworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19vcyk7CisgICAgX19vcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OmxlZnQgfCBpb3NfYmFzZTo6Zml4ZWQgfAorICAgICAgICAgICAgICAgaW9zX2Jhc2U6OnNjaWVudGlmaWMpOworICAgIF9DaGFyVCBfX3NwID0gX19vcy53aWRlbignICcpOworICAgIF9fb3MuZmlsbChfX3NwKTsKKyAgICBfX29zIDw8IF9feC5hKCkgPDwgX19zcCA8PCBfX3guYigpOworICAgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfUlQ+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgICAgY2F1Y2h5X2Rpc3RyaWJ1dGlvbjxfUlQ+JiBfX3gpCit7CisgICAgdHlwZWRlZiBjYXVjaHlfZGlzdHJpYnV0aW9uPF9SVD4gX0VuZzsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Fbmc6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0VuZzo6cGFyYW1fdHlwZSBwYXJhbV90eXBlOworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19pcyk7CisgICAgX19pcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OnNraXB3cyk7CisgICAgcmVzdWx0X3R5cGUgX19hOworICAgIHJlc3VsdF90eXBlIF9fYjsKKyAgICBfX2lzID4+IF9fYSA+PiBfX2I7CisgICAgaWYgKCFfX2lzLmZhaWwoKSkKKyAgICAgICAgX194LnBhcmFtKHBhcmFtX3R5cGUoX19hLCBfX2IpKTsKKyAgICByZXR1cm4gX19pczsKK30KKworLy8gZmlzaGVyX2ZfZGlzdHJpYnV0aW9uCisKK3RlbXBsYXRlPGNsYXNzIF9SZWFsVHlwZSA9IGRvdWJsZT4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGZpc2hlcl9mX2Rpc3RyaWJ1dGlvbgoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBwYXJhbV90eXBlCisgICAgeworICAgICAgICByZXN1bHRfdHlwZSBfX21fOworICAgICAgICByZXN1bHRfdHlwZSBfX25fOworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiBmaXNoZXJfZl9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBleHBsaWNpdCBwYXJhbV90eXBlKHJlc3VsdF90eXBlIF9fbSA9IDEsIHJlc3VsdF90eXBlIF9fbiA9IDEpCisgICAgICAgICAgICA6IF9fbV8oX19tKSwgX19uXyhfX24pIHt9CisKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBtKCkgY29uc3Qge3JldHVybiBfX21fO30KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBuKCkgY29uc3Qge3JldHVybiBfX25fO30KKworICAgICAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9feCwgY29uc3QgcGFyYW1fdHlwZSYgX195KQorICAgICAgICAgICAge3JldHVybiBfX3guX19tXyA9PSBfX3kuX19tXyAmJiBfX3guX19uXyA9PSBfX3kuX19uXzt9CisgICAgICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgcGFyYW1fdHlwZSYgX194LCBjb25zdCBwYXJhbV90eXBlJiBfX3kpCisgICAgICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorICAgIH07CisKK3ByaXZhdGU6CisgICAgcGFyYW1fdHlwZSBfX3BfOworCitwdWJsaWM6CisgICAgLy8gY29uc3RydWN0b3IgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBmaXNoZXJfZl9kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgX19tID0gMSwgcmVzdWx0X3R5cGUgX19uID0gMSkKKyAgICAgICAgOiBfX3BfKHBhcmFtX3R5cGUoX19tLCBfX24pKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBmaXNoZXJfZl9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgICA6IF9fcF8oX19wKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHJlc2V0KCkge30KKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgdGVtcGxhdGU8Y2xhc3MgX1VSTkc+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfVVJORyYgX19nKQorICAgICAgICB7cmV0dXJuICgqdGhpcykoX19nLCBfX3BfKTt9CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VSTkc+IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoX1VSTkcmIF9fZywgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtKCkgY29uc3Qge3JldHVybiBfX3BfLm0oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG4oKSBjb25zdCB7cmV0dXJuIF9fcF8ubigpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYXJhbV90eXBlIHBhcmFtKCkgY29uc3Qge3JldHVybiBfX3BfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3ApIHtfX3BfID0gX19wO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdCB7cmV0dXJuIDA7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdCB7cmV0dXJuIG51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6aW5maW5pdHkoKTt9CisKKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgZmlzaGVyX2ZfZGlzdHJpYnV0aW9uJiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXNoZXJfZl9kaXN0cmlidXRpb24mIF9feSkKKyAgICAgICAge3JldHVybiBfX3guX19wXyA9PSBfX3kuX19wXzt9CisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGZpc2hlcl9mX2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlzaGVyX2ZfZGlzdHJpYnV0aW9uJiBfX3kpCisgICAgICAgIHtyZXR1cm4gIShfX3ggPT0gX195KTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JlYWxUeXBlPgordGVtcGxhdGU8Y2xhc3MgX1VSTkc+CitfUmVhbFR5cGUKK2Zpc2hlcl9mX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpvcGVyYXRvcigpKF9VUk5HJiBfX2csIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKK3sKKyAgICBnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9fZ2RtKF9fcC5tKCkgKiByZXN1bHRfdHlwZSguNSkpOworICAgIGdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gX19nZG4oX19wLm4oKSAqIHJlc3VsdF90eXBlKC41KSk7CisgICAgcmV0dXJuIF9fcC5uKCkgKiBfX2dkbShfX2cpIC8gKF9fcC5tKCkgKiBfX2dkbihfX2cpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX1JUPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgIGNvbnN0IGZpc2hlcl9mX2Rpc3RyaWJ1dGlvbjxfUlQ+JiBfX3gpCit7CisgICAgX19zYXZlX2ZsYWdzPF9DaGFyVCwgX1RyYWl0cz4gX19seChfX29zKTsKKyAgICBfX29zLmZsYWdzKGlvc19iYXNlOjpkZWMgfCBpb3NfYmFzZTo6bGVmdCB8IGlvc19iYXNlOjpmaXhlZCB8CisgICAgICAgICAgICAgICBpb3NfYmFzZTo6c2NpZW50aWZpYyk7CisgICAgX0NoYXJUIF9fc3AgPSBfX29zLndpZGVuKCcgJyk7CisgICAgX19vcy5maWxsKF9fc3ApOworICAgIF9fb3MgPDwgX194Lm0oKSA8PCBfX3NwIDw8IF9feC5uKCk7CisgICAgcmV0dXJuIF9fb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9SVD4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorICAgICAgICAgICBmaXNoZXJfZl9kaXN0cmlidXRpb248X1JUPiYgX194KQoreworICAgIHR5cGVkZWYgZmlzaGVyX2ZfZGlzdHJpYnV0aW9uPF9SVD4gX0VuZzsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Fbmc6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0VuZzo6cGFyYW1fdHlwZSBwYXJhbV90eXBlOworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19pcyk7CisgICAgX19pcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OnNraXB3cyk7CisgICAgcmVzdWx0X3R5cGUgX19tOworICAgIHJlc3VsdF90eXBlIF9fbjsKKyAgICBfX2lzID4+IF9fbSA+PiBfX247CisgICAgaWYgKCFfX2lzLmZhaWwoKSkKKyAgICAgICAgX194LnBhcmFtKHBhcmFtX3R5cGUoX19tLCBfX24pKTsKKyAgICByZXR1cm4gX19pczsKK30KKworLy8gc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbgorCit0ZW1wbGF0ZTxjbGFzcyBfUmVhbFR5cGUgPSBkb3VibGU+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBzdHVkZW50X3RfZGlzdHJpYnV0aW9uCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKworICAgIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHBhcmFtX3R5cGUKKyAgICB7CisgICAgICAgIHJlc3VsdF90eXBlIF9fbl87CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIHN0dWRlbnRfdF9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBleHBsaWNpdCBwYXJhbV90eXBlKHJlc3VsdF90eXBlIF9fbiA9IDEpIDogX19uXyhfX24pIHt9CisKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBuKCkgY29uc3Qge3JldHVybiBfX25fO30KKworICAgICAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9feCwgY29uc3QgcGFyYW1fdHlwZSYgX195KQorICAgICAgICAgICAge3JldHVybiBfX3guX19uXyA9PSBfX3kuX19uXzt9CisgICAgICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgcGFyYW1fdHlwZSYgX194LCBjb25zdCBwYXJhbV90eXBlJiBfX3kpCisgICAgICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorICAgIH07CisKK3ByaXZhdGU6CisgICAgcGFyYW1fdHlwZSBfX3BfOworICAgIG5vcm1hbF9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9fbmRfOworCitwdWJsaWM6CisgICAgLy8gY29uc3RydWN0b3IgYW5kIHJlc2V0IGZ1bmN0aW9ucworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBzdHVkZW50X3RfZGlzdHJpYnV0aW9uKHJlc3VsdF90eXBlIF9fbiA9IDEpCisgICAgICAgIDogX19wXyhwYXJhbV90eXBlKF9fbikpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IHN0dWRlbnRfdF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgICA6IF9fcF8oX19wKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHJlc2V0KCkge19fbmRfLnJlc2V0KCk7fQorCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9VUk5HJiBfX2cpCisgICAgICAgIHtyZXR1cm4gKCp0aGlzKShfX2csIF9fcF8pO30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfVVJORyYgX19nLCBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG4oKSBjb25zdCB7cmV0dXJuIF9fcF8ubigpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYXJhbV90eXBlIHBhcmFtKCkgY29uc3Qge3JldHVybiBfX3BfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3ApIHtfX3BfID0gX19wO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdCB7cmV0dXJuIC1udW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46OmluZmluaXR5KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdCB7cmV0dXJuIG51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6aW5maW5pdHkoKTt9CisKKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3Qgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuIF9feC5fX3BfID09IF9feS5fX3BfO30KKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3Qgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZWFsVHlwZT4KK3RlbXBsYXRlPGNsYXNzIF9VUk5HPgorX1JlYWxUeXBlCitzdHVkZW50X3RfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46Om9wZXJhdG9yKCkoX1VSTkcmIF9fZywgY29uc3QgcGFyYW1fdHlwZSYgX19wKQoreworICAgIGdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gX19nZChfX3AubigpICogLjUsIDIpOworICAgIHJldHVybiBfX25kXyhfX2cpICogX1ZTVEQ6OnNxcnQoX19wLm4oKS9fX2dkKF9fZykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfUlQ+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgY29uc3Qgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbjxfUlQ+JiBfX3gpCit7CisgICAgX19zYXZlX2ZsYWdzPF9DaGFyVCwgX1RyYWl0cz4gX19seChfX29zKTsKKyAgICBfX29zLmZsYWdzKGlvc19iYXNlOjpkZWMgfCBpb3NfYmFzZTo6bGVmdCB8IGlvc19iYXNlOjpmaXhlZCB8CisgICAgICAgICAgICAgICBpb3NfYmFzZTo6c2NpZW50aWZpYyk7CisgICAgX19vcyA8PCBfX3gubigpOworICAgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfUlQ+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgICAgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbjxfUlQ+JiBfX3gpCit7CisgICAgdHlwZWRlZiBzdHVkZW50X3RfZGlzdHJpYnV0aW9uPF9SVD4gX0VuZzsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Fbmc6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0VuZzo6cGFyYW1fdHlwZSBwYXJhbV90eXBlOworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19pcyk7CisgICAgX19pcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OnNraXB3cyk7CisgICAgcmVzdWx0X3R5cGUgX19uOworICAgIF9faXMgPj4gX19uOworICAgIGlmICghX19pcy5mYWlsKCkpCisgICAgICAgIF9feC5wYXJhbShwYXJhbV90eXBlKF9fbikpOworICAgIHJldHVybiBfX2lzOworfQorCisvLyBkaXNjcmV0ZV9kaXN0cmlidXRpb24KKwordGVtcGxhdGU8Y2xhc3MgX0ludFR5cGUgPSBpbnQ+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBkaXNjcmV0ZV9kaXN0cmlidXRpb24KK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgX0ludFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBwYXJhbV90eXBlCisgICAgeworICAgICAgICB2ZWN0b3I8ZG91YmxlPiBfX3BfOworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiBkaXNjcmV0ZV9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBwYXJhbV90eXBlKCkge30KKyAgICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgICBwYXJhbV90eXBlKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICAgICAgICAgICAgOiBfX3BfKF9fZiwgX19sKSB7X19pbml0KCk7fQorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBwYXJhbV90eXBlKGluaXRpYWxpemVyX2xpc3Q8ZG91YmxlPiBfX3dsKQorICAgICAgICAgICAgOiBfX3BfKF9fd2wuYmVnaW4oKSwgX193bC5lbmQoKSkge19faW5pdCgpO30KKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9VbmFyeU9wZXJhdGlvbj4KKyAgICAgICAgICAgIHBhcmFtX3R5cGUoc2l6ZV90IF9fbncsIGRvdWJsZSBfX3htaW4sIGRvdWJsZSBfX3htYXgsCisgICAgICAgICAgICAgICAgICAgICAgIF9VbmFyeU9wZXJhdGlvbiBfX2Z3KTsKKworICAgICAgICB2ZWN0b3I8ZG91YmxlPiBwcm9iYWJpbGl0aWVzKCkgY29uc3Q7CisKKyAgICAgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3gsIGNvbnN0IHBhcmFtX3R5cGUmIF9feSkKKyAgICAgICAgICAgIHtyZXR1cm4gX194Ll9fcF8gPT0gX195Ll9fcF87fQorICAgICAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHBhcmFtX3R5cGUmIF9feCwgY29uc3QgcGFyYW1fdHlwZSYgX195KQorICAgICAgICAgICAge3JldHVybiAhKF9feCA9PSBfX3kpO30KKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgX19pbml0KCk7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjsKKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfSVQ+CisgICAgICAgIGZyaWVuZAorICAgICAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSVQ+JiBfX3gpOworCisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9JVD4KKyAgICAgICAgZnJpZW5kCisgICAgICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgICAgICAgICAgZGlzY3JldGVfZGlzdHJpYnV0aW9uPF9JVD4mIF9feCk7CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBwYXJhbV90eXBlIF9fcF87CisKK3B1YmxpYzoKKyAgICAvLyBjb25zdHJ1Y3RvciBhbmQgcmVzZXQgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbigpIHt9CisgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZGlzY3JldGVfZGlzdHJpYnV0aW9uKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICAgICAgICAgICAgOiBfX3BfKF9fZiwgX19sKSB7fQorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZGlzY3JldGVfZGlzdHJpYnV0aW9uKGluaXRpYWxpemVyX2xpc3Q8ZG91YmxlPiBfX3dsKQorICAgICAgICA6IF9fcF8oX193bCkge30KKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdGVtcGxhdGU8Y2xhc3MgX1VuYXJ5T3BlcmF0aW9uPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbihzaXplX3QgX19udywgZG91YmxlIF9feG1pbiwgZG91YmxlIF9feG1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9VbmFyeU9wZXJhdGlvbiBfX2Z3KQorICAgICAgICA6IF9fcF8oX19udywgX194bWluLCBfX3htYXgsIF9fZncpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICAgIDogX19wXyhfX3ApIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcmVzZXQoKSB7fQorCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9VUk5HJiBfX2cpCisgICAgICAgIHtyZXR1cm4gKCp0aGlzKShfX2csIF9fcF8pO30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfVVJORyYgX19nLCBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZlY3Rvcjxkb3VibGU+IHByb2JhYmlsaXRpZXMoKSBjb25zdCB7cmV0dXJuIF9fcF8ucHJvYmFiaWxpdGllcygpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYXJhbV90eXBlIHBhcmFtKCkgY29uc3Qge3JldHVybiBfX3BfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3ApIHtfX3BfID0gX19wO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtaW4oKSBjb25zdCB7cmV0dXJuIDA7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdCB7cmV0dXJuIF9fcF8uX19wXy5zaXplKCk7fQorCisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzY3JldGVfZGlzdHJpYnV0aW9uJiBfX3kpCisgICAgICAgIHtyZXR1cm4gX194Ll9fcF8gPT0gX195Ll9fcF87fQorICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBkaXNjcmV0ZV9kaXN0cmlidXRpb24mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0lUPgorICAgIGZyaWVuZAorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgICAgIGNvbnN0IGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSVQ+JiBfX3gpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0lUPgorICAgIGZyaWVuZAorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgICAgICAgIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSVQ+JiBfX3gpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX0ludFR5cGU+Cit0ZW1wbGF0ZTxjbGFzcyBfVW5hcnlPcGVyYXRpb24+CitkaXNjcmV0ZV9kaXN0cmlidXRpb248X0ludFR5cGU+OjpwYXJhbV90eXBlOjpwYXJhbV90eXBlKHNpemVfdCBfX253LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgX194bWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgX194bWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVW5hcnlPcGVyYXRpb24gX19mdykKK3sKKyAgICBpZiAoX19udyA+IDEpCisgICAgeworICAgICAgICBfX3BfLnJlc2VydmUoX19udyAtIDEpOworICAgICAgICBkb3VibGUgX19kID0gKF9feG1heCAtIF9feG1pbikgLyBfX253OworICAgICAgICBkb3VibGUgX19kMiA9IF9fZCAvIDI7CisgICAgICAgIGZvciAoc2l6ZV90IF9fayA9IDA7IF9fayA8IF9fbnc7ICsrX19rKQorICAgICAgICAgICAgX19wXy5wdXNoX2JhY2soX19mdyhfX3htaW4gKyBfX2sgKiBfX2QgKyBfX2QyKSk7CisgICAgICAgIF9faW5pdCgpOworICAgIH0KK30KKwordGVtcGxhdGU8Y2xhc3MgX0ludFR5cGU+Cit2b2lkCitkaXNjcmV0ZV9kaXN0cmlidXRpb248X0ludFR5cGU+OjpwYXJhbV90eXBlOjpfX2luaXQoKQoreworICAgIGlmICghX19wXy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgaWYgKF9fcF8uc2l6ZSgpID4gMSkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIF9fcyA9IF9WU1REOjphY2N1bXVsYXRlKF9fcF8uYmVnaW4oKSwgX19wXy5lbmQoKSwgMC4wKTsKKyAgICAgICAgICAgIGZvciAoX1ZTVEQ6OnZlY3Rvcjxkb3VibGU+OjppdGVyYXRvciBfX2kgPSBfX3BfLmJlZ2luKCksIF9fZSA9IF9fcF8uZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faSA8IF9fZTsgKytfX2kpCisgICAgICAgICAgICAgICAgKl9faSAvPSBfX3M7CisgICAgICAgICAgICB2ZWN0b3I8ZG91YmxlPiBfX3QoX19wXy5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgIF9WU1REOjpwYXJ0aWFsX3N1bShfX3BfLmJlZ2luKCksIF9fcF8uZW5kKCkgLSAxLCBfX3QuYmVnaW4oKSk7CisgICAgICAgICAgICBzd2FwKF9fcF8sIF9fdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfX3BfLmNsZWFyKCk7CisgICAgICAgICAgICBfX3BfLnNocmlua190b19maXQoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGU8Y2xhc3MgX0ludFR5cGU+Cit2ZWN0b3I8ZG91YmxlPgorZGlzY3JldGVfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6cGFyYW1fdHlwZTo6cHJvYmFiaWxpdGllcygpIGNvbnN0Cit7CisgICAgc2l6ZV90IF9fbiA9IF9fcF8uc2l6ZSgpOworICAgIF9WU1REOjp2ZWN0b3I8ZG91YmxlPiBfX3AoX19uKzEpOworICAgIF9WU1REOjphZGphY2VudF9kaWZmZXJlbmNlKF9fcF8uYmVnaW4oKSwgX19wXy5lbmQoKSwgX19wLmJlZ2luKCkpOworICAgIGlmIChfX24gPiAwKQorICAgICAgICBfX3BbX19uXSA9IDEgLSBfX3BfW19fbi0xXTsKKyAgICBlbHNlCisgICAgICAgIF9fcFswXSA9IDE7CisgICAgcmV0dXJuIF9fcDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0ludFR5cGU+Cit0ZW1wbGF0ZTxjbGFzcyBfVVJORz4KK19JbnRUeXBlCitkaXNjcmV0ZV9kaXN0cmlidXRpb248X0ludFR5cGU+OjpvcGVyYXRvcigpKF9VUk5HJiBfX2csIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKK3sKKyAgICB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4gX19nZW47CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9JbnRUeXBlPigKKyAgICAgICAgICAgX1ZTVEQ6OnVwcGVyX2JvdW5kKF9fcC5fX3BfLmJlZ2luKCksIF9fcC5fX3BfLmVuZCgpLCBfX2dlbihfX2cpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcC5fX3BfLmJlZ2luKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfSVQ+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgY29uc3QgZGlzY3JldGVfZGlzdHJpYnV0aW9uPF9JVD4mIF9feCkKK3sKKyAgICBfX3NhdmVfZmxhZ3M8X0NoYXJULCBfVHJhaXRzPiBfX2x4KF9fb3MpOworICAgIF9fb3MuZmxhZ3MoaW9zX2Jhc2U6OmRlYyB8IGlvc19iYXNlOjpsZWZ0IHwgaW9zX2Jhc2U6OmZpeGVkIHwKKyAgICAgICAgICAgICAgIGlvc19iYXNlOjpzY2llbnRpZmljKTsKKyAgICBfQ2hhclQgX19zcCA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICBfX29zLmZpbGwoX19zcCk7CisgICAgc2l6ZV90IF9fbiA9IF9feC5fX3BfLl9fcF8uc2l6ZSgpOworICAgIF9fb3MgPDwgX19uOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9fb3MgPDwgX19zcCA8PCBfX3guX19wXy5fX3BfW19faV07CisgICAgcmV0dXJuIF9fb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9JVD4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorICAgICAgICAgICBkaXNjcmV0ZV9kaXN0cmlidXRpb248X0lUPiYgX194KQoreworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19pcyk7CisgICAgX19pcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OnNraXB3cyk7CisgICAgc2l6ZV90IF9fbjsKKyAgICBfX2lzID4+IF9fbjsKKyAgICB2ZWN0b3I8ZG91YmxlPiBfX3AoX19uKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorICAgICAgICBfX2lzID4+IF9fcFtfX2ldOworICAgIGlmICghX19pcy5mYWlsKCkpCisgICAgICAgIHN3YXAoX194Ll9fcF8uX19wXywgX19wKTsKKyAgICByZXR1cm4gX19pczsKK30KKworLy8gcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbgorCit0ZW1wbGF0ZTxjbGFzcyBfUmVhbFR5cGUgPSBkb3VibGU+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKworICAgIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHBhcmFtX3R5cGUKKyAgICB7CisgICAgICAgIHZlY3RvcjxyZXN1bHRfdHlwZT4gX19iXzsKKyAgICAgICAgdmVjdG9yPHJlc3VsdF90eXBlPiBfX2RlbnNpdGllc187CisgICAgICAgIHZlY3RvcjxyZXN1bHRfdHlwZT4gX19hcmVhc187CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uX3R5cGU7CisKKyAgICAgICAgcGFyYW1fdHlwZSgpOworICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvckIsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yVz4KKyAgICAgICAgICAgIHBhcmFtX3R5cGUoX0lucHV0SXRlcmF0b3JCIF9fZkIsIF9JbnB1dEl0ZXJhdG9yQiBfX2xCLAorICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvclcgX19mVyk7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5hcnlPcGVyYXRpb24+CisgICAgICAgICAgICBwYXJhbV90eXBlKGluaXRpYWxpemVyX2xpc3Q8cmVzdWx0X3R5cGU+IF9fYmwsIF9VbmFyeU9wZXJhdGlvbiBfX2Z3KTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9VbmFyeU9wZXJhdGlvbj4KKyAgICAgICAgICAgIHBhcmFtX3R5cGUoc2l6ZV90IF9fbncsIHJlc3VsdF90eXBlIF9feG1pbiwgcmVzdWx0X3R5cGUgX194bWF4LAorICAgICAgICAgICAgICAgICAgICAgICBfVW5hcnlPcGVyYXRpb24gX19mdyk7CisgICAgICAgIHBhcmFtX3R5cGUgJiBvcGVyYXRvcj0oY29uc3QgcGFyYW1fdHlwZSYgX19yaHMpOworCisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdmVjdG9yPHJlc3VsdF90eXBlPiBpbnRlcnZhbHMoKSBjb25zdCB7cmV0dXJuIF9fYl87fQorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZlY3RvcjxyZXN1bHRfdHlwZT4gZGVuc2l0aWVzKCkgY29uc3Qge3JldHVybiBfX2RlbnNpdGllc187fQorCisgICAgICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX194LCBjb25zdCBwYXJhbV90eXBlJiBfX3kpCisgICAgICAgICAgICB7cmV0dXJuIF9feC5fX2RlbnNpdGllc18gPT0gX195Ll9fZGVuc2l0aWVzXyAmJiBfX3guX19iXyA9PSBfX3kuX19iXzt9CisgICAgICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgcGFyYW1fdHlwZSYgX194LCBjb25zdCBwYXJhbV90eXBlJiBfX3kpCisgICAgICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBfX2luaXQoKTsKKworICAgICAgICBmcmllbmQgY2xhc3MgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjsKKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfUlQ+CisgICAgICAgIGZyaWVuZAorICAgICAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JUPiYgX194KTsKKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfUlQ+CisgICAgICAgIGZyaWVuZAorICAgICAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorICAgICAgICAgICAgICAgICAgIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JUPiYgX194KTsKKyAgICB9OworCitwcml2YXRlOgorICAgIHBhcmFtX3R5cGUgX19wXzsKKworcHVibGljOgorICAgIC8vIGNvbnN0cnVjdG9yIGFuZCByZXNldCBmdW5jdGlvbnMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbigpIHt9CisgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3JCLCBjbGFzcyBfSW5wdXRJdGVyYXRvclc+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbihfSW5wdXRJdGVyYXRvckIgX19mQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvckIgX19sQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvclcgX19mVykKKyAgICAgICAgOiBfX3BfKF9fZkIsIF9fbEIsIF9fZlcpIHt9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdGVtcGxhdGU8Y2xhc3MgX1VuYXJ5T3BlcmF0aW9uPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb24oaW5pdGlhbGl6ZXJfbGlzdDxyZXN1bHRfdHlwZT4gX19ibCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVW5hcnlPcGVyYXRpb24gX19mdykKKyAgICAgICAgOiBfX3BfKF9fYmwsIF9fZncpIHt9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgdGVtcGxhdGU8Y2xhc3MgX1VuYXJ5T3BlcmF0aW9uPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb24oc2l6ZV90IF9fbncsIHJlc3VsdF90eXBlIF9feG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZSBfX3htYXgsIF9VbmFyeU9wZXJhdGlvbiBfX2Z3KQorICAgICAgICA6IF9fcF8oX19udywgX194bWluLCBfX3htYXgsIF9fZncpIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICAgIDogX19wXyhfX3ApIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCByZXNldCgpIHt9CisKKyAgICAvLyBnZW5lcmF0aW5nIGZ1bmN0aW9ucworICAgIHRlbXBsYXRlPGNsYXNzIF9VUk5HPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoX1VSTkcmIF9fZykKKyAgICAgICAge3JldHVybiAoKnRoaXMpKF9fZywgX19wXyk7fQorICAgIHRlbXBsYXRlPGNsYXNzIF9VUk5HPiByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9VUk5HJiBfX2csIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAvLyBwcm9wZXJ0eSBmdW5jdGlvbnMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmVjdG9yPHJlc3VsdF90eXBlPiBpbnRlcnZhbHMoKSBjb25zdCB7cmV0dXJuIF9fcF8uaW50ZXJ2YWxzKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2ZWN0b3I8cmVzdWx0X3R5cGU+IGRlbnNpdGllcygpIGNvbnN0IHtyZXR1cm4gX19wXy5kZW5zaXRpZXMoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFyYW1fdHlwZSBwYXJhbSgpIGNvbnN0IHtyZXR1cm4gX19wXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wKSB7X19wXyA9IF9fcDt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVzdWx0X3R5cGUgbWluKCkgY29uc3Qge3JldHVybiBfX3BfLl9fYl8uZnJvbnQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG1heCgpIGNvbnN0IHtyZXR1cm4gX19wXy5fX2JfLmJhY2soKTt9CisKKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuIF9feC5fX3BfID09IF9feS5fX3BfO30KKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuICEoX194ID09IF9feSk7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX1JUPgorICAgIGZyaWVuZAorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgICAgIGNvbnN0IHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JUPiYgX194KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9SVD4KKyAgICBmcmllbmQKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgICAgICBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SVD4mIF9feCk7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfUmVhbFR5cGU+Cit0eXBlbmFtZSBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnBhcmFtX3R5cGUgJgorcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpwYXJhbV90eXBlOjpvcGVyYXRvcj0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgcGFyYW1fdHlwZSYgX19yaHMpCit7CisvLyAgVGhlc2UgY2FuIHRocm93CisgICAgX19iXy5yZXNlcnZlICAgICAgICAoX19yaHMuX19iXy5zaXplICgpKTsKKyAgICBfX2RlbnNpdGllc18ucmVzZXJ2ZShfX3Jocy5fX2RlbnNpdGllc18uc2l6ZSgpKTsKKyAgICBfX2FyZWFzXy5yZXNlcnZlICAgIChfX3Jocy5fX2FyZWFzXy5zaXplKCkpOworCisvLyAgVGhlc2UgY2FuIG5vdCB0aHJvdworICAgIF9fYl8gICAgICAgICA9IF9fcmhzLl9fYl87CisgICAgX19kZW5zaXRpZXNfID0gX19yaHMuX19kZW5zaXRpZXNfOworICAgIF9fYXJlYXNfICAgICA9ICBfX3Jocy5fX2FyZWFzXzsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9SZWFsVHlwZT4KK3ZvaWQKK3BpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6X19pbml0KCkKK3sKKyAgICAvLyBfX2RlbnNpdGllc18gY29udGFpbnMgbm9uLW5vcm1hbGl6ZWQgYXJlYXMKKyAgICByZXN1bHRfdHlwZSBfX3RvdGFsX2FyZWEgPSBfVlNURDo6YWNjdW11bGF0ZShfX2RlbnNpdGllc18uYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZGVuc2l0aWVzXy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF90eXBlKCkpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fZGVuc2l0aWVzXy5zaXplKCk7ICsrX19pKQorICAgICAgICBfX2RlbnNpdGllc19bX19pXSAvPSBfX3RvdGFsX2FyZWE7CisgICAgLy8gX19kZW5zaXRpZXNfIGNvbnRhaW5zIG5vcm1hbGl6ZWQgYXJlYXMKKyAgICBfX2FyZWFzXy5hc3NpZ24oX19kZW5zaXRpZXNfLnNpemUoKSwgcmVzdWx0X3R5cGUoKSk7CisgICAgX1ZTVEQ6OnBhcnRpYWxfc3VtKF9fZGVuc2l0aWVzXy5iZWdpbigpLCBfX2RlbnNpdGllc18uZW5kKCkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJlYXNfLmJlZ2luKCkgKyAxKTsKKyAgICAvLyBfX2FyZWFzXyBjb250YWlucyBwYXJ0aWFsIHN1bXMgb2Ygbm9ybWFsaXplZCBhcmVhczogWzAsIF9fZGVuc2l0aWVzXyAtIDFdCisgICAgX19kZW5zaXRpZXNfLmJhY2soKSA9IDEgLSBfX2FyZWFzXy5iYWNrKCk7ICAvLyBjb3JyZWN0IHJvdW5kIG9mZiBlcnJvcgorICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fZGVuc2l0aWVzXy5zaXplKCk7ICsrX19pKQorICAgICAgICBfX2RlbnNpdGllc19bX19pXSAvPSAoX19iX1tfX2krMV0gLSBfX2JfW19faV0pOworICAgIC8vIF9fZGVuc2l0aWVzXyBub3cgY29udGFpbnMgX19kZW5zaXRpZXNfCit9CisKK3RlbXBsYXRlPGNsYXNzIF9SZWFsVHlwZT4KK3BpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6cGFyYW1fdHlwZSgpCisgICAgOiBfX2JfKDIpLAorICAgICAgX19kZW5zaXRpZXNfKDEsIDEuMCksCisgICAgICBfX2FyZWFzXygxLCAwLjApCit7CisgICAgX19iX1sxXSA9IDE7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9SZWFsVHlwZT4KK3RlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yQiwgY2xhc3MgX0lucHV0SXRlcmF0b3JXPgorcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpwYXJhbV90eXBlOjpwYXJhbV90eXBlKAorICAgICAgICBfSW5wdXRJdGVyYXRvckIgX19mQiwgX0lucHV0SXRlcmF0b3JCIF9fbEIsIF9JbnB1dEl0ZXJhdG9yVyBfX2ZXKQorICAgIDogX19iXyhfX2ZCLCBfX2xCKQoreworICAgIGlmIChfX2JfLnNpemUoKSA8IDIpCisgICAgeworICAgICAgICBfX2JfLnJlc2l6ZSgyKTsKKyAgICAgICAgX19iX1swXSA9IDA7CisgICAgICAgIF9fYl9bMV0gPSAxOworICAgICAgICBfX2RlbnNpdGllc18uYXNzaWduKDEsIDEuMCk7CisgICAgICAgIF9fYXJlYXNfLmFzc2lnbigxLCAwLjApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfX2RlbnNpdGllc18ucmVzZXJ2ZShfX2JfLnNpemUoKSAtIDEpOworICAgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX2JfLnNpemUoKSAtIDE7ICsrX19pLCArK19fZlcpCisgICAgICAgICAgICBfX2RlbnNpdGllc18ucHVzaF9iYWNrKCpfX2ZXKTsKKyAgICAgICAgX19pbml0KCk7CisgICAgfQorfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZTxjbGFzcyBfUmVhbFR5cGU+Cit0ZW1wbGF0ZTxjbGFzcyBfVW5hcnlPcGVyYXRpb24+CitwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnBhcmFtX3R5cGU6OnBhcmFtX3R5cGUoCisgICAgICAgIGluaXRpYWxpemVyX2xpc3Q8cmVzdWx0X3R5cGU+IF9fYmwsIF9VbmFyeU9wZXJhdGlvbiBfX2Z3KQorICAgIDogX19iXyhfX2JsLmJlZ2luKCksIF9fYmwuZW5kKCkpCit7CisgICAgaWYgKF9fYl8uc2l6ZSgpIDwgMikKKyAgICB7CisgICAgICAgIF9fYl8ucmVzaXplKDIpOworICAgICAgICBfX2JfWzBdID0gMDsKKyAgICAgICAgX19iX1sxXSA9IDE7CisgICAgICAgIF9fZGVuc2l0aWVzXy5hc3NpZ24oMSwgMS4wKTsKKyAgICAgICAgX19hcmVhc18uYXNzaWduKDEsIDAuMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIF9fZGVuc2l0aWVzXy5yZXNlcnZlKF9fYl8uc2l6ZSgpIC0gMSk7CisgICAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fYl8uc2l6ZSgpIC0gMTsgKytfX2kpCisgICAgICAgICAgICBfX2RlbnNpdGllc18ucHVzaF9iYWNrKF9fZncoKF9fYl9bX19pKzFdICsgX19iX1tfX2ldKSouNSkpOworICAgICAgICBfX2luaXQoKTsKKyAgICB9Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlPGNsYXNzIF9SZWFsVHlwZT4KK3RlbXBsYXRlPGNsYXNzIF9VbmFyeU9wZXJhdGlvbj4KK3BpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6cGFyYW1fdHlwZSgKKyAgICAgICAgc2l6ZV90IF9fbncsIHJlc3VsdF90eXBlIF9feG1pbiwgcmVzdWx0X3R5cGUgX194bWF4LCBfVW5hcnlPcGVyYXRpb24gX19mdykKKyAgICA6IF9fYl8oX19udyA9PSAwID8gMiA6IF9fbncgKyAxKQoreworICAgIHNpemVfdCBfX24gPSBfX2JfLnNpemUoKSAtIDE7CisgICAgcmVzdWx0X3R5cGUgX19kID0gKF9feG1heCAtIF9feG1pbikgLyBfX247CisgICAgX19kZW5zaXRpZXNfLnJlc2VydmUoX19uKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorICAgIHsKKyAgICAgICAgX19iX1tfX2ldID0gX194bWluICsgX19pICogX19kOworICAgICAgICBfX2RlbnNpdGllc18ucHVzaF9iYWNrKF9fZncoX19iX1tfX2ldICsgX19kKi41KSk7CisgICAgfQorICAgIF9fYl9bX19uXSA9IF9feG1heDsKKyAgICBfX2luaXQoKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JlYWxUeXBlPgordGVtcGxhdGU8Y2xhc3MgX1VSTkc+CitfUmVhbFR5cGUKK3BpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6b3BlcmF0b3IoKShfVVJORyYgX19nLCBjb25zdCBwYXJhbV90eXBlJiBfX3ApCit7CisgICAgdHlwZWRlZiB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBfR2VuOworICAgIHJlc3VsdF90eXBlIF9fdSA9IF9HZW4oKShfX2cpOworICAgIHB0cmRpZmZfdCBfX2sgPSBfVlNURDo6dXBwZXJfYm91bmQoX19wLl9fYXJlYXNfLmJlZ2luKCksIF9fcC5fX2FyZWFzXy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191KSAtIF9fcC5fX2FyZWFzXy5iZWdpbigpIC0gMTsKKyAgICByZXR1cm4gKF9fdSAtIF9fcC5fX2FyZWFzX1tfX2tdKSAvIF9fcC5fX2RlbnNpdGllc19bX19rXSArIF9fcC5fX2JfW19fa107Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9SVD4KK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorICAgICAgICAgICBjb25zdCBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SVD4mIF9feCkKK3sKKyAgICBfX3NhdmVfZmxhZ3M8X0NoYXJULCBfVHJhaXRzPiBfX2x4KF9fb3MpOworICAgIF9fb3MuZmxhZ3MoaW9zX2Jhc2U6OmRlYyB8IGlvc19iYXNlOjpsZWZ0IHwgaW9zX2Jhc2U6OmZpeGVkIHwKKyAgICAgICAgICAgICAgIGlvc19iYXNlOjpzY2llbnRpZmljKTsKKyAgICBfQ2hhclQgX19zcCA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICBfX29zLmZpbGwoX19zcCk7CisgICAgc2l6ZV90IF9fbiA9IF9feC5fX3BfLl9fYl8uc2l6ZSgpOworICAgIF9fb3MgPDwgX19uOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9fb3MgPDwgX19zcCA8PCBfX3guX19wXy5fX2JfW19faV07CisgICAgX19uID0gX194Ll9fcF8uX19kZW5zaXRpZXNfLnNpemUoKTsKKyAgICBfX29zIDw8IF9fc3AgPDwgX19uOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9fb3MgPDwgX19zcCA8PCBfX3guX19wXy5fX2RlbnNpdGllc19bX19pXTsKKyAgICBfX24gPSBfX3guX19wXy5fX2FyZWFzXy5zaXplKCk7CisgICAgX19vcyA8PCBfX3NwIDw8IF9fbjsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorICAgICAgICBfX29zIDw8IF9fc3AgPDwgX194Ll9fcF8uX19hcmVhc19bX19pXTsKKyAgICByZXR1cm4gX19vczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX1JUPgorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JUPiYgX194KQoreworICAgIHR5cGVkZWYgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUlQ+IF9Fbmc7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRW5nOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKKyAgICBfX3NhdmVfZmxhZ3M8X0NoYXJULCBfVHJhaXRzPiBfX2x4KF9faXMpOworICAgIF9faXMuZmxhZ3MoaW9zX2Jhc2U6OmRlYyB8IGlvc19iYXNlOjpza2lwd3MpOworICAgIHNpemVfdCBfX247CisgICAgX19pcyA+PiBfX247CisgICAgdmVjdG9yPHJlc3VsdF90eXBlPiBfX2IoX19uKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorICAgICAgICBfX2lzID4+IF9fYltfX2ldOworICAgIF9faXMgPj4gX19uOworICAgIHZlY3RvcjxyZXN1bHRfdHlwZT4gX19kZW5zaXRpZXMoX19uKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorICAgICAgICBfX2lzID4+IF9fZGVuc2l0aWVzW19faV07CisgICAgX19pcyA+PiBfX247CisgICAgdmVjdG9yPHJlc3VsdF90eXBlPiBfX2FyZWFzKF9fbik7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgICAgX19pcyA+PiBfX2FyZWFzW19faV07CisgICAgaWYgKCFfX2lzLmZhaWwoKSkKKyAgICB7CisgICAgICAgIHN3YXAoX194Ll9fcF8uX19iXywgX19iKTsKKyAgICAgICAgc3dhcChfX3guX19wXy5fX2RlbnNpdGllc18sIF9fZGVuc2l0aWVzKTsKKyAgICAgICAgc3dhcChfX3guX19wXy5fX2FyZWFzXywgX19hcmVhcyk7CisgICAgfQorICAgIHJldHVybiBfX2lzOworfQorCisvLyBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbgorCit0ZW1wbGF0ZTxjbGFzcyBfUmVhbFR5cGUgPSBkb3VibGU+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbgoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBwYXJhbV90eXBlCisgICAgeworICAgICAgICB2ZWN0b3I8cmVzdWx0X3R5cGU+IF9fYl87CisgICAgICAgIHZlY3RvcjxyZXN1bHRfdHlwZT4gX19kZW5zaXRpZXNfOworICAgICAgICB2ZWN0b3I8cmVzdWx0X3R5cGU+IF9fYXJlYXNfOworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbiBkaXN0cmlidXRpb25fdHlwZTsKKworICAgICAgICBwYXJhbV90eXBlKCk7CisgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yQiwgY2xhc3MgX0lucHV0SXRlcmF0b3JXPgorICAgICAgICAgICAgcGFyYW1fdHlwZShfSW5wdXRJdGVyYXRvckIgX19mQiwgX0lucHV0SXRlcmF0b3JCIF9fbEIsCisgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yVyBfX2ZXKTsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9VbmFyeU9wZXJhdGlvbj4KKyAgICAgICAgICAgIHBhcmFtX3R5cGUoaW5pdGlhbGl6ZXJfbGlzdDxyZXN1bHRfdHlwZT4gX19ibCwgX1VuYXJ5T3BlcmF0aW9uIF9fZncpOworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICAgICAgdGVtcGxhdGU8Y2xhc3MgX1VuYXJ5T3BlcmF0aW9uPgorICAgICAgICAgICAgcGFyYW1fdHlwZShzaXplX3QgX19udywgcmVzdWx0X3R5cGUgX194bWluLCByZXN1bHRfdHlwZSBfX3htYXgsCisgICAgICAgICAgICAgICAgICAgICAgIF9VbmFyeU9wZXJhdGlvbiBfX2Z3KTsKKyAgICAgICAgcGFyYW1fdHlwZSAmIG9wZXJhdG9yPShjb25zdCBwYXJhbV90eXBlJiBfX3Jocyk7CisgICAgICAgIAorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZlY3RvcjxyZXN1bHRfdHlwZT4gaW50ZXJ2YWxzKCkgY29uc3Qge3JldHVybiBfX2JfO30KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB2ZWN0b3I8cmVzdWx0X3R5cGU+IGRlbnNpdGllcygpIGNvbnN0IHtyZXR1cm4gX19kZW5zaXRpZXNfO30KKworICAgICAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9feCwgY29uc3QgcGFyYW1fdHlwZSYgX195KQorICAgICAgICAgICAge3JldHVybiBfX3guX19kZW5zaXRpZXNfID09IF9feS5fX2RlbnNpdGllc18gJiYgX194Ll9fYl8gPT0gX195Ll9fYl87fQorICAgICAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHBhcmFtX3R5cGUmIF9feCwgY29uc3QgcGFyYW1fdHlwZSYgX195KQorICAgICAgICAgICAge3JldHVybiAhKF9feCA9PSBfX3kpO30KKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgX19pbml0KCk7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uOworCisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9SVD4KKyAgICAgICAgZnJpZW5kCisgICAgICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JUPiYgX194KTsKKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfUlQ+CisgICAgICAgIGZyaWVuZAorICAgICAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorICAgICAgICAgICAgICAgICAgIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SVD4mIF9feCk7CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBwYXJhbV90eXBlIF9fcF87CisKK3B1YmxpYzoKKyAgICAvLyBjb25zdHJ1Y3RvciBhbmQgcmVzZXQgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uKCkge30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvckIsIGNsYXNzIF9JbnB1dEl0ZXJhdG9yVz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbihfSW5wdXRJdGVyYXRvckIgX19mQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3JCIF9fbEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yVyBfX2ZXKQorICAgICAgICA6IF9fcF8oX19mQiwgX19sQiwgX19mVykge30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5hcnlPcGVyYXRpb24+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24oaW5pdGlhbGl6ZXJfbGlzdDxyZXN1bHRfdHlwZT4gX19ibCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1VuYXJ5T3BlcmF0aW9uIF9fZncpCisgICAgICAgIDogX19wXyhfX2JsLCBfX2Z3KSB7fQorI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIHRlbXBsYXRlPGNsYXNzIF9VbmFyeU9wZXJhdGlvbj4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbihzaXplX3QgX19udywgcmVzdWx0X3R5cGUgX194bWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZSBfX3htYXgsIF9VbmFyeU9wZXJhdGlvbiBfX2Z3KQorICAgICAgICA6IF9fcF8oX19udywgX194bWluLCBfX3htYXgsIF9fZncpIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgICA6IF9fcF8oX19wKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcmVzZXQoKSB7fQorCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKF9VUk5HJiBfX2cpCisgICAgICAgIHtyZXR1cm4gKCp0aGlzKShfX2csIF9fcF8pO30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVVJORz4gcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShfVVJORyYgX19nLCBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZlY3RvcjxyZXN1bHRfdHlwZT4gaW50ZXJ2YWxzKCkgY29uc3Qge3JldHVybiBfX3BfLmludGVydmFscygpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmVjdG9yPHJlc3VsdF90eXBlPiBkZW5zaXRpZXMoKSBjb25zdCB7cmV0dXJuIF9fcF8uZGVuc2l0aWVzKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhcmFtX3R5cGUgcGFyYW0oKSBjb25zdCB7cmV0dXJuIF9fcF87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkge19fcF8gPSBfX3A7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG1pbigpIGNvbnN0IHtyZXR1cm4gX19wXy5fX2JfLmZyb250KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBtYXgoKSBjb25zdCB7cmV0dXJuIF9fcF8uX19iXy5iYWNrKCk7fQorCisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uJiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbiYgX195KQorICAgICAgICB7cmV0dXJuIF9feC5fX3BfID09IF9feS5fX3BfO30KKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24mIF9feCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uJiBfX3kpCisgICAgICAgIHtyZXR1cm4gIShfX3ggPT0gX195KTt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfUlQ+CisgICAgZnJpZW5kCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorICAgICAgICAgICAgICAgY29uc3QgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JUPiYgX194KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9SVD4KKyAgICBmcmllbmQKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgICAgICAgICBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUlQ+JiBfX3gpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgX1JlYWxUeXBlPgordHlwZW5hbWUgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZSAmCitwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpwYXJhbV90eXBlOjpvcGVyYXRvcj0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgcGFyYW1fdHlwZSYgX19yaHMpCit7CisvLyAgVGhlc2UgY2FuIHRocm93CisgICAgX19iXy5yZXNlcnZlICAgICAgICAoX19yaHMuX19iXy5zaXplICgpKTsKKyAgICBfX2RlbnNpdGllc18ucmVzZXJ2ZShfX3Jocy5fX2RlbnNpdGllc18uc2l6ZSgpKTsKKyAgICBfX2FyZWFzXy5yZXNlcnZlICAgIChfX3Jocy5fX2FyZWFzXy5zaXplKCkpOworCisvLyAgVGhlc2UgY2FuIG5vdCB0aHJvdworICAgIF9fYl8gICAgICAgICA9IF9fcmhzLl9fYl87CisgICAgX19kZW5zaXRpZXNfID0gX19yaHMuX19kZW5zaXRpZXNfOworICAgIF9fYXJlYXNfICAgICA9ICBfX3Jocy5fX2FyZWFzXzsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKwordGVtcGxhdGU8Y2xhc3MgX1JlYWxUeXBlPgordm9pZAorcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6X19pbml0KCkKK3sKKyAgICBfX2FyZWFzXy5hc3NpZ24oX19kZW5zaXRpZXNfLnNpemUoKSAtIDEsIHJlc3VsdF90eXBlKCkpOworICAgIHJlc3VsdF90eXBlIF9TcCA9IDA7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19hcmVhc18uc2l6ZSgpOyArK19faSkKKyAgICB7CisgICAgICAgIF9fYXJlYXNfW19faV0gPSAoX19kZW5zaXRpZXNfW19faSsxXSArIF9fZGVuc2l0aWVzX1tfX2ldKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAoX19iX1tfX2krMV0gLSBfX2JfW19faV0pICogLjU7CisgICAgICAgIF9TcCArPSBfX2FyZWFzX1tfX2ldOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBfX2kgPSBfX2FyZWFzXy5zaXplKCk7IF9faSA+IDE7KQorICAgIHsKKyAgICAgICAgLS1fX2k7CisgICAgICAgIF9fYXJlYXNfW19faV0gPSBfX2FyZWFzX1tfX2ktMV0gLyBfU3A7CisgICAgfQorICAgIF9fYXJlYXNfWzBdID0gMDsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAxOyBfX2kgPCBfX2FyZWFzXy5zaXplKCk7ICsrX19pKQorICAgICAgICBfX2FyZWFzX1tfX2ldICs9IF9fYXJlYXNfW19faS0xXTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX2RlbnNpdGllc18uc2l6ZSgpOyArK19faSkKKyAgICAgICAgX19kZW5zaXRpZXNfW19faV0gLz0gX1NwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfUmVhbFR5cGU+CitwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpwYXJhbV90eXBlOjpwYXJhbV90eXBlKCkKKyAgICA6IF9fYl8oMiksCisgICAgICBfX2RlbnNpdGllc18oMiwgMS4wKSwKKyAgICAgIF9fYXJlYXNfKDEsIDAuMCkKK3sKKyAgICBfX2JfWzFdID0gMTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JlYWxUeXBlPgordGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3JCLCBjbGFzcyBfSW5wdXRJdGVyYXRvclc+CitwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpwYXJhbV90eXBlOjpwYXJhbV90eXBlKAorICAgICAgICBfSW5wdXRJdGVyYXRvckIgX19mQiwgX0lucHV0SXRlcmF0b3JCIF9fbEIsIF9JbnB1dEl0ZXJhdG9yVyBfX2ZXKQorICAgIDogX19iXyhfX2ZCLCBfX2xCKQoreworICAgIGlmIChfX2JfLnNpemUoKSA8IDIpCisgICAgeworICAgICAgICBfX2JfLnJlc2l6ZSgyKTsKKyAgICAgICAgX19iX1swXSA9IDA7CisgICAgICAgIF9fYl9bMV0gPSAxOworICAgICAgICBfX2RlbnNpdGllc18uYXNzaWduKDIsIDEuMCk7CisgICAgICAgIF9fYXJlYXNfLmFzc2lnbigxLCAwLjApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfX2RlbnNpdGllc18ucmVzZXJ2ZShfX2JfLnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fYl8uc2l6ZSgpOyArK19faSwgKytfX2ZXKQorICAgICAgICAgICAgX19kZW5zaXRpZXNfLnB1c2hfYmFjaygqX19mVyk7CisgICAgICAgIF9faW5pdCgpOworICAgIH0KK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGU8Y2xhc3MgX1JlYWxUeXBlPgordGVtcGxhdGU8Y2xhc3MgX1VuYXJ5T3BlcmF0aW9uPgorcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6cGFyYW1fdHlwZSgKKyAgICAgICAgaW5pdGlhbGl6ZXJfbGlzdDxyZXN1bHRfdHlwZT4gX19ibCwgX1VuYXJ5T3BlcmF0aW9uIF9fZncpCisgICAgOiBfX2JfKF9fYmwuYmVnaW4oKSwgX19ibC5lbmQoKSkKK3sKKyAgICBpZiAoX19iXy5zaXplKCkgPCAyKQorICAgIHsKKyAgICAgICAgX19iXy5yZXNpemUoMik7CisgICAgICAgIF9fYl9bMF0gPSAwOworICAgICAgICBfX2JfWzFdID0gMTsKKyAgICAgICAgX19kZW5zaXRpZXNfLmFzc2lnbigyLCAxLjApOworICAgICAgICBfX2FyZWFzXy5hc3NpZ24oMSwgMC4wKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX19kZW5zaXRpZXNfLnJlc2VydmUoX19iXy5zaXplKCkpOworICAgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX2JfLnNpemUoKTsgKytfX2kpCisgICAgICAgICAgICBfX2RlbnNpdGllc18ucHVzaF9iYWNrKF9fZncoX19iX1tfX2ldKSk7CisgICAgICAgIF9faW5pdCgpOworICAgIH0KK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGU8Y2xhc3MgX1JlYWxUeXBlPgordGVtcGxhdGU8Y2xhc3MgX1VuYXJ5T3BlcmF0aW9uPgorcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6cGFyYW1fdHlwZSgKKyAgICAgICAgc2l6ZV90IF9fbncsIHJlc3VsdF90eXBlIF9feG1pbiwgcmVzdWx0X3R5cGUgX194bWF4LCBfVW5hcnlPcGVyYXRpb24gX19mdykKKyAgICA6IF9fYl8oX19udyA9PSAwID8gMiA6IF9fbncgKyAxKQoreworICAgIHNpemVfdCBfX24gPSBfX2JfLnNpemUoKSAtIDE7CisgICAgcmVzdWx0X3R5cGUgX19kID0gKF9feG1heCAtIF9feG1pbikgLyBfX247CisgICAgX19kZW5zaXRpZXNfLnJlc2VydmUoX19iXy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgeworICAgICAgICBfX2JfW19faV0gPSBfX3htaW4gKyBfX2kgKiBfX2Q7CisgICAgICAgIF9fZGVuc2l0aWVzXy5wdXNoX2JhY2soX19mdyhfX2JfW19faV0pKTsKKyAgICB9CisgICAgX19iX1tfX25dID0gX194bWF4OworICAgIF9fZGVuc2l0aWVzXy5wdXNoX2JhY2soX19mdyhfX2JfW19fbl0pKTsKKyAgICBfX2luaXQoKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1JlYWxUeXBlPgordGVtcGxhdGU8Y2xhc3MgX1VSTkc+CitfUmVhbFR5cGUKK3BpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46Om9wZXJhdG9yKCkoX1VSTkcmIF9fZywgY29uc3QgcGFyYW1fdHlwZSYgX19wKQoreworICAgIHR5cGVkZWYgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gX0dlbjsKKyAgICByZXN1bHRfdHlwZSBfX3UgPSBfR2VuKCkoX19nKTsKKyAgICBwdHJkaWZmX3QgX19rID0gX1ZTVEQ6OnVwcGVyX2JvdW5kKF9fcC5fX2FyZWFzXy5iZWdpbigpLCBfX3AuX19hcmVhc18uZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdSkgLSBfX3AuX19hcmVhc18uYmVnaW4oKSAtIDE7CisgICAgX191IC09IF9fcC5fX2FyZWFzX1tfX2tdOworICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fZGsgPSBfX3AuX19kZW5zaXRpZXNfW19fa107CisgICAgY29uc3QgcmVzdWx0X3R5cGUgX19kazEgPSBfX3AuX19kZW5zaXRpZXNfW19faysxXTsKKyAgICBjb25zdCByZXN1bHRfdHlwZSBfX2RlbHRhZCA9IF9fZGsxIC0gX19kazsKKyAgICBjb25zdCByZXN1bHRfdHlwZSBfX2JrID0gX19wLl9fYl9bX19rXTsKKyAgICBpZiAoX19kZWx0YWQgPT0gMCkKKyAgICAgICAgcmV0dXJuIF9fdSAvIF9fZGsgKyBfX2JrOworICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fYmsxID0gX19wLl9fYl9bX19rKzFdOworICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fZGVsdGFiID0gX19iazEgLSBfX2JrOworICAgIHJldHVybiAoX19iayAqIF9fZGsxIC0gX19iazEgKiBfX2RrICsKKyAgICAgICAgX1ZTVEQ6OnNxcnQoX19kZWx0YWIgKiAoX19kZWx0YWIgKiBfX2RrICogX19kayArIDIgKiBfX2RlbHRhZCAqIF9fdSkpKSAvCisgICAgICAgIF9fZGVsdGFkOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfUlQ+CitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKyAgICAgICAgICAgY29uc3QgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JUPiYgX194KQoreworICAgIF9fc2F2ZV9mbGFnczxfQ2hhclQsIF9UcmFpdHM+IF9fbHgoX19vcyk7CisgICAgX19vcy5mbGFncyhpb3NfYmFzZTo6ZGVjIHwgaW9zX2Jhc2U6OmxlZnQgfCBpb3NfYmFzZTo6Zml4ZWQgfAorICAgICAgICAgICAgICAgaW9zX2Jhc2U6OnNjaWVudGlmaWMpOworICAgIF9DaGFyVCBfX3NwID0gX19vcy53aWRlbignICcpOworICAgIF9fb3MuZmlsbChfX3NwKTsKKyAgICBzaXplX3QgX19uID0gX194Ll9fcF8uX19iXy5zaXplKCk7CisgICAgX19vcyA8PCBfX247CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgICAgX19vcyA8PCBfX3NwIDw8IF9feC5fX3BfLl9fYl9bX19pXTsKKyAgICBfX24gPSBfX3guX19wXy5fX2RlbnNpdGllc18uc2l6ZSgpOworICAgIF9fb3MgPDwgX19zcCA8PCBfX247CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgICAgX19vcyA8PCBfX3NwIDw8IF9feC5fX3BfLl9fZGVuc2l0aWVzX1tfX2ldOworICAgIF9fbiA9IF9feC5fX3BfLl9fYXJlYXNfLnNpemUoKTsKKyAgICBfX29zIDw8IF9fc3AgPDwgX19uOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9fb3MgPDwgX19zcCA8PCBfX3guX19wXy5fX2FyZWFzX1tfX2ldOworICAgIHJldHVybiBfX29zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfUlQ+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgICAgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JUPiYgX194KQoreworICAgIHR5cGVkZWYgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JUPiBfRW5nOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0VuZzo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7CisgICAgX19zYXZlX2ZsYWdzPF9DaGFyVCwgX1RyYWl0cz4gX19seChfX2lzKTsKKyAgICBfX2lzLmZsYWdzKGlvc19iYXNlOjpkZWMgfCBpb3NfYmFzZTo6c2tpcHdzKTsKKyAgICBzaXplX3QgX19uOworICAgIF9faXMgPj4gX19uOworICAgIHZlY3RvcjxyZXN1bHRfdHlwZT4gX19iKF9fbik7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgICAgX19pcyA+PiBfX2JbX19pXTsKKyAgICBfX2lzID4+IF9fbjsKKyAgICB2ZWN0b3I8cmVzdWx0X3R5cGU+IF9fZGVuc2l0aWVzKF9fbik7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgICAgX19pcyA+PiBfX2RlbnNpdGllc1tfX2ldOworICAgIF9faXMgPj4gX19uOworICAgIHZlY3RvcjxyZXN1bHRfdHlwZT4gX19hcmVhcyhfX24pOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9faXMgPj4gX19hcmVhc1tfX2ldOworICAgIGlmICghX19pcy5mYWlsKCkpCisgICAgeworICAgICAgICBzd2FwKF9feC5fX3BfLl9fYl8sIF9fYik7CisgICAgICAgIHN3YXAoX194Ll9fcF8uX19kZW5zaXRpZXNfLCBfX2RlbnNpdGllcyk7CisgICAgICAgIHN3YXAoX194Ll9fcF8uX19hcmVhc18sIF9fYXJlYXMpOworICAgIH0KKyAgICByZXR1cm4gX19pczsKK30KKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCitfTElCQ1BQX1BPUF9NQUNST1MKKworI2VuZGlmICAvLyBfTElCQ1BQX1JBTkRPTQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3JhdGlvIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3JhdGlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZTVlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvcmF0aW8KQEAgLTAsMCArMSw1MzMgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmF0aW8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfUkFUSU8KKyNkZWZpbmUgX0xJQkNQUF9SQVRJTworCisvKgorICAgIHJhdGlvIHN5bm9wc2lzCisKK25hbWVzcGFjZSBzdGQKK3sKKwordGVtcGxhdGUgPGludG1heF90IE4sIGludG1heF90IEQgPSAxPgorY2xhc3MgcmF0aW8KK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3RleHByIGludG1heF90IG51bTsKKyAgICBzdGF0aWMgY29uc3RleHByIGludG1heF90IGRlbjsKKyAgICB0eXBlZGVmIHJhdGlvPG51bSwgZGVuPiB0eXBlOworfTsKKworLy8gcmF0aW8gYXJpdGhtZXRpYwordGVtcGxhdGUgPGNsYXNzIFIxLCBjbGFzcyBSMj4gdXNpbmcgcmF0aW9fYWRkID0gLi4uOwordGVtcGxhdGUgPGNsYXNzIFIxLCBjbGFzcyBSMj4gdXNpbmcgcmF0aW9fc3VidHJhY3QgPSAuLi47Cit0ZW1wbGF0ZSA8Y2xhc3MgUjEsIGNsYXNzIFIyPiB1c2luZyByYXRpb19tdWx0aXBseSA9IC4uLjsKK3RlbXBsYXRlIDxjbGFzcyBSMSwgY2xhc3MgUjI+IHVzaW5nIHJhdGlvX2RpdmlkZSA9IC4uLjsKKworLy8gcmF0aW8gY29tcGFyaXNvbgordGVtcGxhdGUgPGNsYXNzIFIxLCBjbGFzcyBSMj4gc3RydWN0IHJhdGlvX2VxdWFsOwordGVtcGxhdGUgPGNsYXNzIFIxLCBjbGFzcyBSMj4gc3RydWN0IHJhdGlvX25vdF9lcXVhbDsKK3RlbXBsYXRlIDxjbGFzcyBSMSwgY2xhc3MgUjI+IHN0cnVjdCByYXRpb19sZXNzOwordGVtcGxhdGUgPGNsYXNzIFIxLCBjbGFzcyBSMj4gc3RydWN0IHJhdGlvX2xlc3NfZXF1YWw7Cit0ZW1wbGF0ZSA8Y2xhc3MgUjEsIGNsYXNzIFIyPiBzdHJ1Y3QgcmF0aW9fZ3JlYXRlcjsKK3RlbXBsYXRlIDxjbGFzcyBSMSwgY2xhc3MgUjI+IHN0cnVjdCByYXRpb19ncmVhdGVyX2VxdWFsOworCisvLyBjb252ZW5pZW5jZSBTSSB0eXBlZGVmcwordHlwZWRlZiByYXRpbzwxLCAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwPiB5b2N0bzsgIC8vIG5vdCBzdXBwb3J0ZWQKK3R5cGVkZWYgcmF0aW88MSwgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMD4gemVwdG87ICAvLyBub3Qgc3VwcG9ydGVkCit0eXBlZGVmIHJhdGlvPDEsICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDA+IGF0dG87Cit0eXBlZGVmIHJhdGlvPDEsICAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDA+IGZlbXRvOwordHlwZWRlZiByYXRpbzwxLCAgICAgICAgICAgICAxMDAwMDAwMDAwMDAwPiBwaWNvOwordHlwZWRlZiByYXRpbzwxLCAgICAgICAgICAgICAgICAxMDAwMDAwMDAwPiBuYW5vOwordHlwZWRlZiByYXRpbzwxLCAgICAgICAgICAgICAgICAgICAxMDAwMDAwPiBtaWNybzsKK3R5cGVkZWYgcmF0aW88MSwgICAgICAgICAgICAgICAgICAgICAgMTAwMD4gbWlsbGk7Cit0eXBlZGVmIHJhdGlvPDEsICAgICAgICAgICAgICAgICAgICAgICAxMDA+IGNlbnRpOwordHlwZWRlZiByYXRpbzwxLCAgICAgICAgICAgICAgICAgICAgICAgIDEwPiBkZWNpOwordHlwZWRlZiByYXRpbzwgICAgICAgICAgICAgICAgICAgICAgIDEwLCAxPiBkZWNhOwordHlwZWRlZiByYXRpbzwgICAgICAgICAgICAgICAgICAgICAgMTAwLCAxPiBoZWN0bzsKK3R5cGVkZWYgcmF0aW88ICAgICAgICAgICAgICAgICAgICAgMTAwMCwgMT4ga2lsbzsKK3R5cGVkZWYgcmF0aW88ICAgICAgICAgICAgICAgICAgMTAwMDAwMCwgMT4gbWVnYTsKK3R5cGVkZWYgcmF0aW88ICAgICAgICAgICAgICAgMTAwMDAwMDAwMCwgMT4gZ2lnYTsKK3R5cGVkZWYgcmF0aW88ICAgICAgICAgICAgMTAwMDAwMDAwMDAwMCwgMT4gdGVyYTsKK3R5cGVkZWYgcmF0aW88ICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMCwgMT4gcGV0YTsKK3R5cGVkZWYgcmF0aW88ICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMCwgMT4gZXhhOwordHlwZWRlZiByYXRpbzwgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwLCAxPiB6ZXR0YTsgIC8vIG5vdCBzdXBwb3J0ZWQKK3R5cGVkZWYgcmF0aW88MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCwgMT4geW90dGE7ICAvLyBub3Qgc3VwcG9ydGVkCisKKyAgLy8gMjAuMTEuNSwgcmF0aW8gY29tcGFyaXNvbgorICB0ZW1wbGF0ZSA8Y2xhc3MgUjEsIGNsYXNzIFIyPiBpbmxpbmUgY29uc3RleHByIGJvb2wgcmF0aW9fZXF1YWxfdgorICAgID0gcmF0aW9fZXF1YWw8UjEsIFIyPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgdGVtcGxhdGUgPGNsYXNzIFIxLCBjbGFzcyBSMj4gaW5saW5lIGNvbnN0ZXhwciBib29sIHJhdGlvX25vdF9lcXVhbF92CisgICAgPSByYXRpb19ub3RfZXF1YWw8UjEsIFIyPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICB0ZW1wbGF0ZSA8Y2xhc3MgUjEsIGNsYXNzIFIyPiBpbmxpbmUgY29uc3RleHByIGJvb2wgcmF0aW9fbGVzc192CisgICAgPSByYXRpb19sZXNzPFIxLCBSMj46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICB0ZW1wbGF0ZSA8Y2xhc3MgUjEsIGNsYXNzIFIyPiBpbmxpbmUgY29uc3RleHByIGJvb2wgcmF0aW9fbGVzc19lcXVhbF92CisgICAgPSByYXRpb19sZXNzX2VxdWFsPFIxLCBSMj46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICB0ZW1wbGF0ZSA8Y2xhc3MgUjEsIGNsYXNzIFIyPiBpbmxpbmUgY29uc3RleHByIGJvb2wgcmF0aW9fZ3JlYXRlcl92CisgICAgPSByYXRpb19ncmVhdGVyPFIxLCBSMj46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICB0ZW1wbGF0ZSA8Y2xhc3MgUjEsIGNsYXNzIFIyPiBpbmxpbmUgY29uc3RleHByIGJvb2wgcmF0aW9fZ3JlYXRlcl9lcXVhbF92CisgICAgPSByYXRpb19ncmVhdGVyX2VxdWFsPFIxLCBSMj46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworfQorKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfUFVTSF9NQUNST1MKKyNpbmNsdWRlIDxfX3VuZGVmX21hY3Jvcz4KKworCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKworLy8gX19zdGF0aWNfZ2NkCisKK3RlbXBsYXRlIDxpbnRtYXhfdCBfWHAsIGludG1heF90IF9ZcD4KK3N0cnVjdCBfX3N0YXRpY19nY2QKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgdmFsdWUgPSBfX3N0YXRpY19nY2Q8X1lwLCBfWHAgJSBfWXA+Ojp2YWx1ZTsKK307CisKK3RlbXBsYXRlIDxpbnRtYXhfdCBfWHA+CitzdHJ1Y3QgX19zdGF0aWNfZ2NkPF9YcCwgMD4KK3sKKyAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgdmFsdWUgPSBfWHA7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9fc3RhdGljX2djZDwwLCAwPgoreworICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCB2YWx1ZSA9IDE7Cit9OworCisvLyBfX3N0YXRpY19sY20KKwordGVtcGxhdGUgPGludG1heF90IF9YcCwgaW50bWF4X3QgX1lwPgorc3RydWN0IF9fc3RhdGljX2xjbQoreworICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCB2YWx1ZSA9IF9YcCAvIF9fc3RhdGljX2djZDxfWHAsIF9ZcD46OnZhbHVlICogX1lwOworfTsKKwordGVtcGxhdGUgPGludG1heF90IF9YcD4KK3N0cnVjdCBfX3N0YXRpY19hYnMKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgdmFsdWUgPSBfWHAgPCAwID8gLV9YcCA6IF9YcDsKK307CisKK3RlbXBsYXRlIDxpbnRtYXhfdCBfWHA+CitzdHJ1Y3QgX19zdGF0aWNfc2lnbgoreworICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCB2YWx1ZSA9IF9YcCA9PSAwID8gMCA6IChfWHAgPCAwID8gLTEgOiAxKTsKK307CisKK3RlbXBsYXRlIDxpbnRtYXhfdCBfWHAsIGludG1heF90IF9ZcCwgaW50bWF4X3QgPSBfX3N0YXRpY19zaWduPF9ZcD46OnZhbHVlPgorY2xhc3MgX19sbF9hZGQ7CisKK3RlbXBsYXRlIDxpbnRtYXhfdCBfWHAsIGludG1heF90IF9ZcD4KK2NsYXNzIF9fbGxfYWRkPF9YcCwgX1lwLCAxPgoreworICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBtaW4gPSAoMUxMIDw8IChzaXplb2YoaW50bWF4X3QpICogQ0hBUl9CSVQgLSAxKSkgKyAxOworICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBtYXggPSAtbWluOworCisgICAgc3RhdGljX2Fzc2VydChfWHAgPD0gbWF4IC0gX1lwLCAib3ZlcmZsb3cgaW4gX19sbF9hZGQiKTsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgdmFsdWUgPSBfWHAgKyBfWXA7Cit9OworCit0ZW1wbGF0ZSA8aW50bWF4X3QgX1hwLCBpbnRtYXhfdCBfWXA+CitjbGFzcyBfX2xsX2FkZDxfWHAsIF9ZcCwgMD4KK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgdmFsdWUgPSBfWHA7Cit9OworCit0ZW1wbGF0ZSA8aW50bWF4X3QgX1hwLCBpbnRtYXhfdCBfWXA+CitjbGFzcyBfX2xsX2FkZDxfWHAsIF9ZcCwgLTE+Cit7CisgICAgc3RhdGljIGNvbnN0IGludG1heF90IG1pbiA9ICgxTEwgPDwgKHNpemVvZihpbnRtYXhfdCkgKiBDSEFSX0JJVCAtIDEpKSArIDE7CisgICAgc3RhdGljIGNvbnN0IGludG1heF90IG1heCA9IC1taW47CisKKyAgICBzdGF0aWNfYXNzZXJ0KG1pbiAtIF9ZcCA8PSBfWHAsICJvdmVyZmxvdyBpbiBfX2xsX2FkZCIpOworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCB2YWx1ZSA9IF9YcCArIF9ZcDsKK307CisKK3RlbXBsYXRlIDxpbnRtYXhfdCBfWHAsIGludG1heF90IF9ZcCwgaW50bWF4X3QgPSBfX3N0YXRpY19zaWduPF9ZcD46OnZhbHVlPgorY2xhc3MgX19sbF9zdWI7CisKK3RlbXBsYXRlIDxpbnRtYXhfdCBfWHAsIGludG1heF90IF9ZcD4KK2NsYXNzIF9fbGxfc3ViPF9YcCwgX1lwLCAxPgoreworICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBtaW4gPSAoMUxMIDw8IChzaXplb2YoaW50bWF4X3QpICogQ0hBUl9CSVQgLSAxKSkgKyAxOworICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBtYXggPSAtbWluOworCisgICAgc3RhdGljX2Fzc2VydChtaW4gKyBfWXAgPD0gX1hwLCAib3ZlcmZsb3cgaW4gX19sbF9zdWIiKTsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgdmFsdWUgPSBfWHAgLSBfWXA7Cit9OworCit0ZW1wbGF0ZSA8aW50bWF4X3QgX1hwLCBpbnRtYXhfdCBfWXA+CitjbGFzcyBfX2xsX3N1YjxfWHAsIF9ZcCwgMD4KK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgdmFsdWUgPSBfWHA7Cit9OworCit0ZW1wbGF0ZSA8aW50bWF4X3QgX1hwLCBpbnRtYXhfdCBfWXA+CitjbGFzcyBfX2xsX3N1YjxfWHAsIF9ZcCwgLTE+Cit7CisgICAgc3RhdGljIGNvbnN0IGludG1heF90IG1pbiA9ICgxTEwgPDwgKHNpemVvZihpbnRtYXhfdCkgKiBDSEFSX0JJVCAtIDEpKSArIDE7CisgICAgc3RhdGljIGNvbnN0IGludG1heF90IG1heCA9IC1taW47CisKKyAgICBzdGF0aWNfYXNzZXJ0KF9YcCA8PSBtYXggKyBfWXAsICJvdmVyZmxvdyBpbiBfX2xsX3N1YiIpOworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCB2YWx1ZSA9IF9YcCAtIF9ZcDsKK307CisKK3RlbXBsYXRlIDxpbnRtYXhfdCBfWHAsIGludG1heF90IF9ZcD4KK2NsYXNzIF9fbGxfbXVsCit7CisgICAgc3RhdGljIGNvbnN0IGludG1heF90IG5hbiA9ICgxTEwgPDwgKHNpemVvZihpbnRtYXhfdCkgKiBDSEFSX0JJVCAtIDEpKTsKKyAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgbWluID0gbmFuICsgMTsKKyAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgbWF4ID0gLW1pbjsKKyAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgX19hX3ggPSBfX3N0YXRpY19hYnM8X1hwPjo6dmFsdWU7CisgICAgc3RhdGljIGNvbnN0IGludG1heF90IF9fYV95ID0gX19zdGF0aWNfYWJzPF9ZcD46OnZhbHVlOworCisgICAgc3RhdGljX2Fzc2VydChfWHAgIT0gbmFuICYmIF9ZcCAhPSBuYW4gJiYgX19hX3ggPD0gbWF4IC8gX19hX3ksICJvdmVyZmxvdyBpbiBfX2xsX211bCIpOworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCB2YWx1ZSA9IF9YcCAqIF9ZcDsKK307CisKK3RlbXBsYXRlIDxpbnRtYXhfdCBfWXA+CitjbGFzcyBfX2xsX211bDwwLCBfWXA+Cit7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGludG1heF90IHZhbHVlID0gMDsKK307CisKK3RlbXBsYXRlIDxpbnRtYXhfdCBfWHA+CitjbGFzcyBfX2xsX211bDxfWHAsIDA+Cit7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGludG1heF90IHZhbHVlID0gMDsKK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBfX2xsX211bDwwLCAwPgoreworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCB2YWx1ZSA9IDA7Cit9OworCisvLyBOb3QgYWN0dWFsbHkgdXNlZCBidXQgbGVmdCBoZXJlIGluIGNhc2UgbmVlZGVkIGluIGZ1dHVyZSBtYWludGVuYW5jZQordGVtcGxhdGUgPGludG1heF90IF9YcCwgaW50bWF4X3QgX1lwPgorY2xhc3MgX19sbF9kaXYKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgbmFuID0gKDFMTCA8PCAoc2l6ZW9mKGludG1heF90KSAqIENIQVJfQklUIC0gMSkpOworICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBtaW4gPSBuYW4gKyAxOworICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBtYXggPSAtbWluOworCisgICAgc3RhdGljX2Fzc2VydChfWHAgIT0gbmFuICYmIF9ZcCAhPSBuYW4gJiYgX1lwICE9IDAsICJvdmVyZmxvdyBpbiBfX2xsX2RpdiIpOworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCB2YWx1ZSA9IF9YcCAvIF9ZcDsKK307CisKK3RlbXBsYXRlIDxpbnRtYXhfdCBfTnVtLCBpbnRtYXhfdCBfRGVuID0gMT4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHJhdGlvCit7CisgICAgc3RhdGljX2Fzc2VydChfX3N0YXRpY19hYnM8X051bT46OnZhbHVlID49IDAsICJyYXRpbyBudW1lcmF0b3IgaXMgb3V0IG9mIHJhbmdlIik7CisgICAgc3RhdGljX2Fzc2VydChfRGVuICE9IDAsICJyYXRpbyBkaXZpZGUgYnkgMCIpOworICAgIHN0YXRpY19hc3NlcnQoX19zdGF0aWNfYWJzPF9EZW4+Ojp2YWx1ZSA+ICAwLCAicmF0aW8gZGVub21pbmF0b3IgaXMgb3V0IG9mIHJhbmdlIik7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludG1heF90IF9fbmEgPSBfX3N0YXRpY19hYnM8X051bT46OnZhbHVlOworICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnRtYXhfdCBfX2RhID0gX19zdGF0aWNfYWJzPF9EZW4+Ojp2YWx1ZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50bWF4X3QgX19zID0gX19zdGF0aWNfc2lnbjxfTnVtPjo6dmFsdWUgKiBfX3N0YXRpY19zaWduPF9EZW4+Ojp2YWx1ZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50bWF4X3QgX19nY2QgPSBfX3N0YXRpY19nY2Q8X19uYSwgX19kYT46OnZhbHVlOworcHVibGljOgorICAgIHN0YXRpYyBfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBpbnRtYXhfdCBudW0gPSBfX3MgKiBfX25hIC8gX19nY2Q7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludG1heF90IGRlbiA9IF9fZGEgLyBfX2djZDsKKworICAgIHR5cGVkZWYgcmF0aW88bnVtLCBkZW4+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8aW50bWF4X3QgX051bSwgaW50bWF4X3QgX0Rlbj4KK19MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IGludG1heF90IHJhdGlvPF9OdW0sIF9EZW4+OjpudW07CisKK3RlbXBsYXRlIDxpbnRtYXhfdCBfTnVtLCBpbnRtYXhfdCBfRGVuPgorX0xJQkNQUF9DT05TVEVYUFIgY29uc3QgaW50bWF4X3QgcmF0aW88X051bSwgX0Rlbj46OmRlbjsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfX2lzX3JhdGlvICAgICAgICAgICAgICAgICAgICAgOiBmYWxzZV90eXBlIHt9OwordGVtcGxhdGUgPGludG1heF90IF9OdW0sIGludG1heF90IF9EZW4+IHN0cnVjdCBfX2lzX3JhdGlvPHJhdGlvPF9OdW0sIF9EZW4+ID4gOiB0cnVlX3R5cGUgIHt9OworCit0eXBlZGVmIHJhdGlvPDFMTCwgMTAwMDAwMDAwMDAwMDAwMDAwMExMPiBhdHRvOwordHlwZWRlZiByYXRpbzwxTEwsICAgIDEwMDAwMDAwMDAwMDAwMDBMTD4gZmVtdG87Cit0eXBlZGVmIHJhdGlvPDFMTCwgICAgICAgMTAwMDAwMDAwMDAwMExMPiBwaWNvOwordHlwZWRlZiByYXRpbzwxTEwsICAgICAgICAgIDEwMDAwMDAwMDBMTD4gbmFubzsKK3R5cGVkZWYgcmF0aW88MUxMLCAgICAgICAgICAgICAxMDAwMDAwTEw+IG1pY3JvOwordHlwZWRlZiByYXRpbzwxTEwsICAgICAgICAgICAgICAgIDEwMDBMTD4gbWlsbGk7Cit0eXBlZGVmIHJhdGlvPDFMTCwgICAgICAgICAgICAgICAgIDEwMExMPiBjZW50aTsKK3R5cGVkZWYgcmF0aW88MUxMLCAgICAgICAgICAgICAgICAgIDEwTEw+IGRlY2k7Cit0eXBlZGVmIHJhdGlvPCAgICAgICAgICAgICAgICAgMTBMTCwgMUxMPiBkZWNhOwordHlwZWRlZiByYXRpbzwgICAgICAgICAgICAgICAgMTAwTEwsIDFMTD4gaGVjdG87Cit0eXBlZGVmIHJhdGlvPCAgICAgICAgICAgICAgIDEwMDBMTCwgMUxMPiBraWxvOwordHlwZWRlZiByYXRpbzwgICAgICAgICAgICAxMDAwMDAwTEwsIDFMTD4gbWVnYTsKK3R5cGVkZWYgcmF0aW88ICAgICAgICAgMTAwMDAwMDAwMExMLCAxTEw+IGdpZ2E7Cit0eXBlZGVmIHJhdGlvPCAgICAgIDEwMDAwMDAwMDAwMDBMTCwgMUxMPiB0ZXJhOwordHlwZWRlZiByYXRpbzwgICAxMDAwMDAwMDAwMDAwMDAwTEwsIDFMTD4gcGV0YTsKK3R5cGVkZWYgcmF0aW88MTAwMDAwMDAwMDAwMDAwMDAwMExMLCAxTEw+IGV4YTsKKwordGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyPgorc3RydWN0IF9fcmF0aW9fbXVsdGlwbHkKK3sKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IGludG1heF90IF9fZ2NkX24xX2QyID0gX19zdGF0aWNfZ2NkPF9SMTo6bnVtLCBfUjI6OmRlbj46OnZhbHVlOworICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBfX2djZF9kMV9uMiA9IF9fc3RhdGljX2djZDxfUjE6OmRlbiwgX1IyOjpudW0+Ojp2YWx1ZTsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJhdGlvCisgICAgICAgIDwKKyAgICAgICAgICAgIF9fbGxfbXVsPF9SMTo6bnVtIC8gX19nY2RfbjFfZDIsIF9SMjo6bnVtIC8gX19nY2RfZDFfbjI+Ojp2YWx1ZSwKKyAgICAgICAgICAgIF9fbGxfbXVsPF9SMjo6ZGVuIC8gX19nY2RfbjFfZDIsIF9SMTo6ZGVuIC8gX19nY2RfZDFfbjI+Ojp2YWx1ZQorICAgICAgICA+Ojp0eXBlIHR5cGU7Cit9OworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+IHVzaW5nIHJhdGlvX211bHRpcGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHR5cGVuYW1lIF9fcmF0aW9fbXVsdGlwbHk8X1IxLCBfUjI+Ojp0eXBlOworCisjZWxzZSAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfUjEsIGNsYXNzIF9SMj4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyByYXRpb19tdWx0aXBseQorICAgIDogcHVibGljIF9fcmF0aW9fbXVsdGlwbHk8X1IxLCBfUjI+Ojp0eXBlIHt9OworCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CitzdHJ1Y3QgX19yYXRpb19kaXZpZGUKK3sKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IGludG1heF90IF9fZ2NkX24xX24yID0gX19zdGF0aWNfZ2NkPF9SMTo6bnVtLCBfUjI6Om51bT46OnZhbHVlOworICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBfX2djZF9kMV9kMiA9IF9fc3RhdGljX2djZDxfUjE6OmRlbiwgX1IyOjpkZW4+Ojp2YWx1ZTsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJhdGlvCisgICAgICAgIDwKKyAgICAgICAgICAgIF9fbGxfbXVsPF9SMTo6bnVtIC8gX19nY2RfbjFfbjIsIF9SMjo6ZGVuIC8gX19nY2RfZDFfZDI+Ojp2YWx1ZSwKKyAgICAgICAgICAgIF9fbGxfbXVsPF9SMjo6bnVtIC8gX19nY2RfbjFfbjIsIF9SMTo6ZGVuIC8gX19nY2RfZDFfZDI+Ojp2YWx1ZQorICAgICAgICA+Ojp0eXBlIHR5cGU7Cit9OworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+IHVzaW5nIHJhdGlvX2RpdmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHR5cGVuYW1lIF9fcmF0aW9fZGl2aWRlPF9SMSwgX1IyPjo6dHlwZTsKKworI2Vsc2UgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgcmF0aW9fZGl2aWRlCisgICAgOiBwdWJsaWMgX19yYXRpb19kaXZpZGU8X1IxLCBfUjI+Ojp0eXBlIHt9OworCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CitzdHJ1Y3QgX19yYXRpb19hZGQKK3sKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IGludG1heF90IF9fZ2NkX24xX24yID0gX19zdGF0aWNfZ2NkPF9SMTo6bnVtLCBfUjI6Om51bT46OnZhbHVlOworICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBfX2djZF9kMV9kMiA9IF9fc3RhdGljX2djZDxfUjE6OmRlbiwgX1IyOjpkZW4+Ojp2YWx1ZTsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJhdGlvX211bHRpcGx5CisgICAgICAgIDwKKyAgICAgICAgICAgIHJhdGlvPF9fZ2NkX24xX24yLCBfUjE6OmRlbiAvIF9fZ2NkX2QxX2QyPiwKKyAgICAgICAgICAgIHJhdGlvCisgICAgICAgICAgICA8CisgICAgICAgICAgICAgICAgX19sbF9hZGQKKyAgICAgICAgICAgICAgICA8CisgICAgICAgICAgICAgICAgICAgIF9fbGxfbXVsPF9SMTo6bnVtIC8gX19nY2RfbjFfbjIsIF9SMjo6ZGVuIC8gX19nY2RfZDFfZDI+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgX19sbF9tdWw8X1IyOjpudW0gLyBfX2djZF9uMV9uMiwgX1IxOjpkZW4gLyBfX2djZF9kMV9kMj46OnZhbHVlCisgICAgICAgICAgICAgICAgPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgX1IyOjpkZW4KKyAgICAgICAgICAgID4KKyAgICAgICAgPjo6dHlwZSB0eXBlOworfTsKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyPiB1c2luZyByYXRpb19hZGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0eXBlbmFtZSBfX3JhdGlvX2FkZDxfUjEsIF9SMj46OnR5cGU7CisKKyNlbHNlICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHJhdGlvX2FkZAorICAgIDogcHVibGljIF9fcmF0aW9fYWRkPF9SMSwgX1IyPjo6dHlwZSB7fTsKKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyPgorc3RydWN0IF9fcmF0aW9fc3VidHJhY3QKK3sKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IGludG1heF90IF9fZ2NkX24xX24yID0gX19zdGF0aWNfZ2NkPF9SMTo6bnVtLCBfUjI6Om51bT46OnZhbHVlOworICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBfX2djZF9kMV9kMiA9IF9fc3RhdGljX2djZDxfUjE6OmRlbiwgX1IyOjpkZW4+Ojp2YWx1ZTsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJhdGlvX211bHRpcGx5CisgICAgICAgIDwKKyAgICAgICAgICAgIHJhdGlvPF9fZ2NkX24xX24yLCBfUjE6OmRlbiAvIF9fZ2NkX2QxX2QyPiwKKyAgICAgICAgICAgIHJhdGlvCisgICAgICAgICAgICA8CisgICAgICAgICAgICAgICAgX19sbF9zdWIKKyAgICAgICAgICAgICAgICA8CisgICAgICAgICAgICAgICAgICAgIF9fbGxfbXVsPF9SMTo6bnVtIC8gX19nY2RfbjFfbjIsIF9SMjo6ZGVuIC8gX19nY2RfZDFfZDI+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgX19sbF9tdWw8X1IyOjpudW0gLyBfX2djZF9uMV9uMiwgX1IxOjpkZW4gLyBfX2djZF9kMV9kMj46OnZhbHVlCisgICAgICAgICAgICAgICAgPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgX1IyOjpkZW4KKyAgICAgICAgICAgID4KKyAgICAgICAgPjo6dHlwZSB0eXBlOworfTsKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyPiB1c2luZyByYXRpb19zdWJ0cmFjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0eXBlbmFtZSBfX3JhdGlvX3N1YnRyYWN0PF9SMSwgX1IyPjo6dHlwZTsKKworI2Vsc2UgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgcmF0aW9fc3VidHJhY3QKKyAgICA6IHB1YmxpYyBfX3JhdGlvX3N1YnRyYWN0PF9SMSwgX1IyPjo6dHlwZSB7fTsKKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworLy8gcmF0aW9fZXF1YWwKKwordGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHJhdGlvX2VxdWFsCisgICAgOiBwdWJsaWMgX0xJQkNQUF9CT09MX0NPTlNUQU5UKChfUjE6Om51bSA9PSBfUjI6Om51bSAmJiBfUjE6OmRlbiA9PSBfUjI6OmRlbikpIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgcmF0aW9fbm90X2VxdWFsCisgICAgOiBwdWJsaWMgX0xJQkNQUF9CT09MX0NPTlNUQU5UKCghcmF0aW9fZXF1YWw8X1IxLCBfUjI+Ojp2YWx1ZSkpIHt9OworCisvLyByYXRpb19sZXNzCisKK3RlbXBsYXRlIDxjbGFzcyBfUjEsIGNsYXNzIF9SMiwgYm9vbCBfT2RkID0gZmFsc2UsCisgICAgICAgICAgaW50bWF4X3QgX1ExID0gX1IxOjpudW0gLyBfUjE6OmRlbiwgaW50bWF4X3QgX00xID0gX1IxOjpudW0gJSBfUjE6OmRlbiwKKyAgICAgICAgICBpbnRtYXhfdCBfUTIgPSBfUjI6Om51bSAvIF9SMjo6ZGVuLCBpbnRtYXhfdCBfTTIgPSBfUjI6Om51bSAlIF9SMjo6ZGVuPgorc3RydWN0IF9fcmF0aW9fbGVzczEKK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IF9PZGQgPyBfUTIgPCBfUTEgOiBfUTEgPCBfUTI7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjIsIGJvb2wgX09kZCwgaW50bWF4X3QgX1FwPgorc3RydWN0IF9fcmF0aW9fbGVzczE8X1IxLCBfUjIsIF9PZGQsIF9RcCwgMCwgX1FwLCAwPgoreworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjIsIGJvb2wgX09kZCwgaW50bWF4X3QgX1FwLCBpbnRtYXhfdCBfTTI+CitzdHJ1Y3QgX19yYXRpb19sZXNzMTxfUjEsIF9SMiwgX09kZCwgX1FwLCAwLCBfUXAsIF9NMj4KK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9ICFfT2RkOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyLCBib29sIF9PZGQsIGludG1heF90IF9RcCwgaW50bWF4X3QgX00xPgorc3RydWN0IF9fcmF0aW9fbGVzczE8X1IxLCBfUjIsIF9PZGQsIF9RcCwgX00xLCBfUXAsIDA+Cit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBfT2RkOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyLCBib29sIF9PZGQsIGludG1heF90IF9RcCwgaW50bWF4X3QgX00xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRtYXhfdCBfTTI+CitzdHJ1Y3QgX19yYXRpb19sZXNzMTxfUjEsIF9SMiwgX09kZCwgX1FwLCBfTTEsIF9RcCwgX00yPgoreworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gX19yYXRpb19sZXNzMTxyYXRpbzxfUjE6OmRlbiwgX00xPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW88X1IyOjpkZW4sIF9NMj4sICFfT2RkPjo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjIsIGludG1heF90IF9TMSA9IF9fc3RhdGljX3NpZ248X1IxOjpudW0+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50bWF4X3QgX1MyID0gX19zdGF0aWNfc2lnbjxfUjI6Om51bT46OnZhbHVlPgorc3RydWN0IF9fcmF0aW9fbGVzcworeworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gX1MxIDwgX1MyOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyPgorc3RydWN0IF9fcmF0aW9fbGVzczxfUjEsIF9SMiwgMUxMLCAxTEw+Cit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBfX3JhdGlvX2xlc3MxPF9SMSwgX1IyPjo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CitzdHJ1Y3QgX19yYXRpb19sZXNzPF9SMSwgX1IyLCAtMUxMLCAtMUxMPgoreworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gX19yYXRpb19sZXNzMTxyYXRpbzwtX1IyOjpudW0sIF9SMjo6ZGVuPiwgcmF0aW88LV9SMTo6bnVtLCBfUjE6OmRlbj4gPjo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgcmF0aW9fbGVzcworICAgIDogcHVibGljIF9MSUJDUFBfQk9PTF9DT05TVEFOVCgoX19yYXRpb19sZXNzPF9SMSwgX1IyPjo6dmFsdWUpKSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHJhdGlvX2xlc3NfZXF1YWwKKyAgICA6IHB1YmxpYyBfTElCQ1BQX0JPT0xfQ09OU1RBTlQoKCFyYXRpb19sZXNzPF9SMiwgX1IxPjo6dmFsdWUpKSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHJhdGlvX2dyZWF0ZXIKKyAgICA6IHB1YmxpYyBfTElCQ1BQX0JPT0xfQ09OU1RBTlQoKHJhdGlvX2xlc3M8X1IyLCBfUjE+Ojp2YWx1ZSkpIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgcmF0aW9fZ3JlYXRlcl9lcXVhbAorICAgIDogcHVibGljIF9MSUJDUFBfQk9PTF9DT05TVEFOVCgoIXJhdGlvX2xlc3M8X1IxLCBfUjI+Ojp2YWx1ZSkpIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CitzdHJ1Y3QgX19yYXRpb19nY2QKK3sKKyAgICB0eXBlZGVmIHJhdGlvPF9fc3RhdGljX2djZDxfUjE6Om51bSwgX1IyOjpudW0+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIF9fc3RhdGljX2xjbTxfUjE6OmRlbiwgX1IyOjpkZW4+Ojp2YWx1ZT4gdHlwZTsKK307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCByYXRpb19lcXVhbF92CisgICAgPSByYXRpb19lcXVhbDxfUjEsIF9SMj46OnZhbHVlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCByYXRpb19ub3RfZXF1YWxfdgorICAgID0gcmF0aW9fbm90X2VxdWFsPF9SMSwgX1IyPjo6dmFsdWU7CisKK3RlbXBsYXRlIDxjbGFzcyBfUjEsIGNsYXNzIF9SMj4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIHJhdGlvX2xlc3NfdgorICAgID0gcmF0aW9fbGVzczxfUjEsIF9SMj46OnZhbHVlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCByYXRpb19sZXNzX2VxdWFsX3YKKyAgICA9IHJhdGlvX2xlc3NfZXF1YWw8X1IxLCBfUjI+Ojp2YWx1ZTsKKwordGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgcmF0aW9fZ3JlYXRlcl92CisgICAgPSByYXRpb19ncmVhdGVyPF9SMSwgX1IyPjo6dmFsdWU7CisKK3RlbXBsYXRlIDxjbGFzcyBfUjEsIGNsYXNzIF9SMj4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIHJhdGlvX2dyZWF0ZXJfZXF1YWxfdgorICAgID0gcmF0aW9fZ3JlYXRlcl9lcXVhbDxfUjEsIF9SMj46OnZhbHVlOworI2VuZGlmCisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworX0xJQkNQUF9QT1BfTUFDUk9TCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9SQVRJTwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3JlZ2V4IGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3JlZ2V4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMDc4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvcmVnZXgKQEAgLTAsMCArMSw2NjAzIEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVnZXggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX1JFR0VYCisjZGVmaW5lIF9MSUJDUFBfUkVHRVgKKworLyoKKyAgICByZWdleCBzeW5vcHNpcworCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKworbmFtZXNwYWNlIHN0ZAoreworCituYW1lc3BhY2UgcmVnZXhfY29uc3RhbnRzCit7CisKK2VtdW0gc3ludGF4X29wdGlvbl90eXBlCit7CisgICAgaWNhc2UgICAgICA9IHVuc3BlY2lmaWVkLAorICAgIG5vc3VicyAgICAgPSB1bnNwZWNpZmllZCwKKyAgICBvcHRpbWl6ZSAgID0gdW5zcGVjaWZpZWQsCisgICAgY29sbGF0ZSAgICA9IHVuc3BlY2lmaWVkLAorICAgIEVDTUFTY3JpcHQgPSB1bnNwZWNpZmllZCwKKyAgICBiYXNpYyAgICAgID0gdW5zcGVjaWZpZWQsCisgICAgZXh0ZW5kZWQgICA9IHVuc3BlY2lmaWVkLAorICAgIGF3ayAgICAgICAgPSB1bnNwZWNpZmllZCwKKyAgICBncmVwICAgICAgID0gdW5zcGVjaWZpZWQsCisgICAgZWdyZXAgICAgICA9IHVuc3BlY2lmaWVkCit9OworCitjb25zdGV4cHIgc3ludGF4X29wdGlvbl90eXBlIG9wZXJhdG9yfihzeW50YXhfb3B0aW9uX3R5cGUgZik7Citjb25zdGV4cHIgc3ludGF4X29wdGlvbl90eXBlIG9wZXJhdG9yJihzeW50YXhfb3B0aW9uX3R5cGUgbGhzLCBzeW50YXhfb3B0aW9uX3R5cGUgcmhzKTsKK2NvbnN0ZXhwciBzeW50YXhfb3B0aW9uX3R5cGUgb3BlcmF0b3J8KHN5bnRheF9vcHRpb25fdHlwZSBsaHMsIHN5bnRheF9vcHRpb25fdHlwZSByaHMpOworCitlbnVtIG1hdGNoX2ZsYWdfdHlwZQoreworICAgIG1hdGNoX2RlZmF1bHQgICAgID0gMCwKKyAgICBtYXRjaF9ub3RfYm9sICAgICA9IHVuc3BlY2lmaWVkLAorICAgIG1hdGNoX25vdF9lb2wgICAgID0gdW5zcGVjaWZpZWQsCisgICAgbWF0Y2hfbm90X2JvdyAgICAgPSB1bnNwZWNpZmllZCwKKyAgICBtYXRjaF9ub3RfZW93ICAgICA9IHVuc3BlY2lmaWVkLAorICAgIG1hdGNoX2FueSAgICAgICAgID0gdW5zcGVjaWZpZWQsCisgICAgbWF0Y2hfbm90X251bGwgICAgPSB1bnNwZWNpZmllZCwKKyAgICBtYXRjaF9jb250aW51b3VzICA9IHVuc3BlY2lmaWVkLAorICAgIG1hdGNoX3ByZXZfYXZhaWwgID0gdW5zcGVjaWZpZWQsCisgICAgZm9ybWF0X2RlZmF1bHQgICAgPSAwLAorICAgIGZvcm1hdF9zZWQgICAgICAgID0gdW5zcGVjaWZpZWQsCisgICAgZm9ybWF0X25vX2NvcHkgICAgPSB1bnNwZWNpZmllZCwKKyAgICBmb3JtYXRfZmlyc3Rfb25seSA9IHVuc3BlY2lmaWVkCit9OworCitjb25zdGV4cHIgbWF0Y2hfZmxhZ190eXBlIG9wZXJhdG9yfihtYXRjaF9mbGFnX3R5cGUgZik7Citjb25zdGV4cHIgbWF0Y2hfZmxhZ190eXBlIG9wZXJhdG9yJihtYXRjaF9mbGFnX3R5cGUgbGhzLCBtYXRjaF9mbGFnX3R5cGUgcmhzKTsKK2NvbnN0ZXhwciBtYXRjaF9mbGFnX3R5cGUgb3BlcmF0b3J8KG1hdGNoX2ZsYWdfdHlwZSBsaHMsIG1hdGNoX2ZsYWdfdHlwZSByaHMpOworCitlbnVtIGVycm9yX3R5cGUKK3sKKyAgICBlcnJvcl9jb2xsYXRlICAgID0gdW5zcGVjaWZpZWQsCisgICAgZXJyb3JfY3R5cGUgICAgICA9IHVuc3BlY2lmaWVkLAorICAgIGVycm9yX2VzY2FwZSAgICAgPSB1bnNwZWNpZmllZCwKKyAgICBlcnJvcl9iYWNrcmVmICAgID0gdW5zcGVjaWZpZWQsCisgICAgZXJyb3JfYnJhY2sgICAgICA9IHVuc3BlY2lmaWVkLAorICAgIGVycm9yX3BhcmVuICAgICAgPSB1bnNwZWNpZmllZCwKKyAgICBlcnJvcl9icmFjZSAgICAgID0gdW5zcGVjaWZpZWQsCisgICAgZXJyb3JfYmFkYnJhY2UgICA9IHVuc3BlY2lmaWVkLAorICAgIGVycm9yX3JhbmdlICAgICAgPSB1bnNwZWNpZmllZCwKKyAgICBlcnJvcl9zcGFjZSAgICAgID0gdW5zcGVjaWZpZWQsCisgICAgZXJyb3JfYmFkcmVwZWF0ICA9IHVuc3BlY2lmaWVkLAorICAgIGVycm9yX2NvbXBsZXhpdHkgPSB1bnNwZWNpZmllZCwKKyAgICBlcnJvcl9zdGFjayAgICAgID0gdW5zcGVjaWZpZWQKK307CisKK30gIC8vIHJlZ2V4X2NvbnN0YW50cworCitjbGFzcyByZWdleF9lcnJvcgorICAgIDogcHVibGljIHJ1bnRpbWVfZXJyb3IKK3sKK3B1YmxpYzoKKyAgICBleHBsaWNpdCByZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX3R5cGUgZWNvZGUpOworICAgIHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfdHlwZSBjb2RlKCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+CitzdHJ1Y3QgcmVnZXhfdHJhaXRzCit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBjaGFyVCAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcl90eXBlPiBzdHJpbmdfdHlwZTsKKyAgICB0eXBlZGVmIGxvY2FsZSAgICAgICAgICAgICAgICAgIGxvY2FsZV90eXBlOworICAgIHR5cGVkZWYgL2JpdG1hc2tfdHlwZS8gICAgICAgICAgY2hhcl9jbGFzc190eXBlOworCisgICAgcmVnZXhfdHJhaXRzKCk7CisKKyAgICBzdGF0aWMgc2l6ZV90IGxlbmd0aChjb25zdCBjaGFyX3R5cGUqIHApOworICAgIGNoYXJUIHRyYW5zbGF0ZShjaGFyVCBjKSBjb25zdDsKKyAgICBjaGFyVCB0cmFuc2xhdGVfbm9jYXNlKGNoYXJUIGMpIGNvbnN0OworICAgIHRlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHN0cmluZ190eXBlCisgICAgICAgIHRyYW5zZm9ybShGb3J3YXJkSXRlcmF0b3IgZmlyc3QsIEZvcndhcmRJdGVyYXRvciBsYXN0KSBjb25zdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBzdHJpbmdfdHlwZQorICAgICAgICB0cmFuc2Zvcm1fcHJpbWFyeSggRm9yd2FyZEl0ZXJhdG9yIGZpcnN0LCBGb3J3YXJkSXRlcmF0b3IgbGFzdCkgY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgc3RyaW5nX3R5cGUKKyAgICAgICAgbG9va3VwX2NvbGxhdGVuYW1lKEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QpIGNvbnN0OworICAgIHRlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIGNoYXJfY2xhc3NfdHlwZQorICAgICAgICBsb29rdXBfY2xhc3NuYW1lKEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpY2FzZSA9IGZhbHNlKSBjb25zdDsKKyAgICBib29sIGlzY3R5cGUoY2hhclQgYywgY2hhcl9jbGFzc190eXBlIGYpIGNvbnN0OworICAgIGludCB2YWx1ZShjaGFyVCBjaCwgaW50IHJhZGl4KSBjb25zdDsKKyAgICBsb2NhbGVfdHlwZSBpbWJ1ZShsb2NhbGVfdHlwZSBsKTsKKyAgICBsb2NhbGVfdHlwZSBnZXRsb2MoKWNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMgPSByZWdleF90cmFpdHM8Y2hhclQ+PgorY2xhc3MgYmFzaWNfcmVnZXgKK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlczoKKyAgICB0eXBlZGVmIGNoYXJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0cmFpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czo6c3RyaW5nX3R5cGUgICAgICAgIHN0cmluZ190eXBlOworICAgIHR5cGVkZWYgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgZmxhZ190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzOjpsb2NhbGVfdHlwZSAgICAgICAgbG9jYWxlX3R5cGU7CisKKyAgICAvLyBjb25zdGFudHM6CisgICAgc3RhdGljIGNvbnN0ZXhwciByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBpY2FzZSA9IHJlZ2V4X2NvbnN0YW50czo6aWNhc2U7CisgICAgc3RhdGljIGNvbnN0ZXhwciByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBub3N1YnMgPSByZWdleF9jb25zdGFudHM6Om5vc3ViczsKKyAgICBzdGF0aWMgY29uc3RleHByIHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIG9wdGltaXplID0gcmVnZXhfY29uc3RhbnRzOjpvcHRpbWl6ZTsKKyAgICBzdGF0aWMgY29uc3RleHByIHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGNvbGxhdGUgPSByZWdleF9jb25zdGFudHM6OmNvbGxhdGU7CisgICAgc3RhdGljIGNvbnN0ZXhwciByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBFQ01BU2NyaXB0ID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0OworICAgIHN0YXRpYyBjb25zdGV4cHIgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgYmFzaWMgPSByZWdleF9jb25zdGFudHM6OmJhc2ljOworICAgIHN0YXRpYyBjb25zdGV4cHIgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgZXh0ZW5kZWQgPSByZWdleF9jb25zdGFudHM6OmV4dGVuZGVkOworICAgIHN0YXRpYyBjb25zdGV4cHIgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgYXdrID0gcmVnZXhfY29uc3RhbnRzOjphd2s7CisgICAgc3RhdGljIGNvbnN0ZXhwciByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBncmVwID0gcmVnZXhfY29uc3RhbnRzOjpncmVwOworICAgIHN0YXRpYyBjb25zdGV4cHIgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgZWdyZXAgPSByZWdleF9jb25zdGFudHM6OmVncmVwOworCisgICAgLy8gY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICBiYXNpY19yZWdleCgpOworICAgIGV4cGxpY2l0IGJhc2ljX3JlZ2V4KGNvbnN0IGNoYXJUKiBwLCBmbGFnX3R5cGUgZiA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCk7CisgICAgYmFzaWNfcmVnZXgoY29uc3QgY2hhclQqIHAsIHNpemVfdCBsZW4sIGZsYWdfdHlwZSBmID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KTsKKyAgICBiYXNpY19yZWdleChjb25zdCBiYXNpY19yZWdleCYpOworICAgIGJhc2ljX3JlZ2V4KGJhc2ljX3JlZ2V4JiYpIG5vZXhjZXB0OworICAgIHRlbXBsYXRlIDxjbGFzcyBTVCwgY2xhc3MgU0E+CisgICAgICAgIGV4cGxpY2l0IGJhc2ljX3JlZ2V4KGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgU1QsIFNBPiYgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ190eXBlIGYgPSByZWdleF9jb25zdGFudHM6OkVDTUFTY3JpcHQpOworICAgIHRlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIGJhc2ljX3JlZ2V4KEZvcndhcmRJdGVyYXRvciBmaXJzdCwgRm9yd2FyZEl0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICAgICAgICAgIGZsYWdfdHlwZSBmID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KTsKKyAgICBiYXNpY19yZWdleChpbml0aWFsaXplcl9saXN0PGNoYXJUPiwgZmxhZ190eXBlID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KTsKKworICAgIH5iYXNpY19yZWdleCgpOworCisgICAgYmFzaWNfcmVnZXgmIG9wZXJhdG9yPShjb25zdCBiYXNpY19yZWdleCYpOworICAgIGJhc2ljX3JlZ2V4JiBvcGVyYXRvcj0oYmFzaWNfcmVnZXgmJikgbm9leGNlcHQ7CisgICAgYmFzaWNfcmVnZXgmIG9wZXJhdG9yPShjb25zdCBjaGFyVCogcHRyKTsKKyAgICBiYXNpY19yZWdleCYgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8Y2hhclQ+IGlsKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgU1QsIGNsYXNzIFNBPgorICAgICAgICBiYXNpY19yZWdleCYgb3BlcmF0b3I9KGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgU1QsIFNBPiYgcCk7CisKKyAgICAvLyBhc3NpZ246CisgICAgYmFzaWNfcmVnZXgmIGFzc2lnbihjb25zdCBiYXNpY19yZWdleCYgdGhhdCk7CisgICAgYmFzaWNfcmVnZXgmIGFzc2lnbihiYXNpY19yZWdleCYmIHRoYXQpIG5vZXhjZXB0OworICAgIGJhc2ljX3JlZ2V4JiBhc3NpZ24oY29uc3QgY2hhclQqIHB0ciwgZmxhZ190eXBlIGYgPSByZWdleF9jb25zdGFudHM6OkVDTUFTY3JpcHQpOworICAgIGJhc2ljX3JlZ2V4JiBhc3NpZ24oY29uc3QgY2hhclQqIHAsIHNpemVfdCBsZW4sIGZsYWdfdHlwZSBmKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3Mgc3RyaW5nX3RyYWl0cywgY2xhc3MgQT4KKyAgICAgICAgYmFzaWNfcmVnZXgmIGFzc2lnbihjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIHN0cmluZ190cmFpdHMsIEE+JiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdHlwZSBmID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgYmFzaWNfcmVnZXgmIGFzc2lnbihJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ190eXBlIGYgPSByZWdleF9jb25zdGFudHM6OkVDTUFTY3JpcHQpOworICAgIGJhc2ljX3JlZ2V4JiBhc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDxjaGFyVD4sIGZsYWdfdHlwZSA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCk7CisKKyAgICAvLyBjb25zdCBvcGVyYXRpb25zOgorICAgIHVuc2lnbmVkIG1hcmtfY291bnQoKSBjb25zdDsKKyAgICBmbGFnX3R5cGUgZmxhZ3MoKSBjb25zdDsKKworICAgIC8vIGxvY2FsZToKKyAgICBsb2NhbGVfdHlwZSBpbWJ1ZShsb2NhbGVfdHlwZSBsb2MpOworICAgIGxvY2FsZV90eXBlIGdldGxvYygpIGNvbnN0OworCisgICAgLy8gc3dhcDoKKyAgICB2b2lkIHN3YXAoYmFzaWNfcmVnZXgmKTsKK307CisKK3R5cGVkZWYgYmFzaWNfcmVnZXg8Y2hhcj4gICAgcmVnZXg7Cit0eXBlZGVmIGJhc2ljX3JlZ2V4PHdjaGFyX3Q+IHdyZWdleDsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgdm9pZCBzd2FwKGJhc2ljX3JlZ2V4PGNoYXJULCB0cmFpdHM+JiBlMSwgYmFzaWNfcmVnZXg8Y2hhclQsIHRyYWl0cz4mIGUyKTsKKwordGVtcGxhdGUgPGNsYXNzIEJpZGlyZWN0aW9uYWxJdGVyYXRvcj4KK2NsYXNzIHN1Yl9tYXRjaAorICAgIDogcHVibGljIHBhaXI8QmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBCaWRpcmVjdGlvbmFsSXRlcmF0b3I+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8QmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPEJpZGlyZWN0aW9uYWxJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiBCaWRpcmVjdGlvbmFsSXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPHZhbHVlX3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKKworICAgIGJvb2wgbWF0Y2hlZDsKKworICAgIGNvbnN0ZXhwciBzdWJfbWF0Y2goKTsKKworICAgIGRpZmZlcmVuY2VfdHlwZSBsZW5ndGgoKSBjb25zdDsKKyAgICBvcGVyYXRvciBzdHJpbmdfdHlwZSgpIGNvbnN0OworICAgIHN0cmluZ190eXBlIHN0cigpIGNvbnN0OworCisgICAgaW50IGNvbXBhcmUoY29uc3Qgc3ViX21hdGNoJiBzKSBjb25zdDsKKyAgICBpbnQgY29tcGFyZShjb25zdCBzdHJpbmdfdHlwZSYgcykgY29uc3Q7CisgICAgaW50IGNvbXBhcmUoY29uc3QgdmFsdWVfdHlwZSogcykgY29uc3Q7Cit9OworCit0eXBlZGVmIHN1Yl9tYXRjaDxjb25zdCBjaGFyKj4gICAgICAgICAgICAgY3N1Yl9tYXRjaDsKK3R5cGVkZWYgc3ViX21hdGNoPGNvbnN0IHdjaGFyX3QqPiAgICAgICAgICB3Y3N1Yl9tYXRjaDsKK3R5cGVkZWYgc3ViX21hdGNoPHN0cmluZzo6Y29uc3RfaXRlcmF0b3I+ICBzc3ViX21hdGNoOwordHlwZWRlZiBzdWJfbWF0Y2g8d3N0cmluZzo6Y29uc3RfaXRlcmF0b3I+IHdzc3ViX21hdGNoOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlJdGVyPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiBsaHMsIGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiByaHMpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlJdGVyPgorICAgIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiBsaHMsIGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiByaHMpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlJdGVyPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIGxocywgY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIHJocyk7CisKK3RlbXBsYXRlIDxjbGFzcyBCaUl0ZXI+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIGxocywgY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIHJocyk7CisKK3RlbXBsYXRlIDxjbGFzcyBCaUl0ZXI+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIGxocywgY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIHJocyk7CisKK3RlbXBsYXRlIDxjbGFzcyBCaUl0ZXI+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBzdWJfbWF0Y2g8QmlJdGVyPiYgbGhzLCBjb25zdCBzdWJfbWF0Y2g8QmlJdGVyPiYgcmhzKTsKKwordGVtcGxhdGUgPGNsYXNzIEJpSXRlciwgY2xhc3MgU1QsIGNsYXNzIFNBPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGJhc2ljX3N0cmluZzx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8QmlJdGVyPjo6dmFsdWVfdHlwZSwgU1QsIFNBPiYgbGhzLAorICAgICAgICAgICAgICAgY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIHJocyk7CisKK3RlbXBsYXRlIDxjbGFzcyBCaUl0ZXIsIGNsYXNzIFNULCBjbGFzcyBTQT4KKyAgICBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBiYXNpY19zdHJpbmc8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPEJpSXRlcj46OnZhbHVlX3R5cGUsIFNULCBTQT4mIGxocywKKyAgICAgICAgICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiByaHMpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlJdGVyLCBjbGFzcyBTVCwgY2xhc3MgU0E+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBiYXNpY19zdHJpbmc8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPEJpSXRlcj46OnZhbHVlX3R5cGUsIFNULCBTQT4mIGxocywKKyAgICAgICAgICAgICAgY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIHJocyk7CisKK3RlbXBsYXRlIDxjbGFzcyBCaUl0ZXIsIGNsYXNzIFNULCBjbGFzcyBTQT4KKyAgICBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGJhc2ljX3N0cmluZzx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8QmlJdGVyPjo6dmFsdWVfdHlwZSwgU1QsIFNBPiYgbGhzLAorICAgICAgICAgICAgICBjb25zdCBzdWJfbWF0Y2g8QmlJdGVyPiYgcmhzKTsKKwordGVtcGxhdGUgPGNsYXNzIEJpSXRlciwgY2xhc3MgU1QsIGNsYXNzIFNBPgorICAgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBiYXNpY19zdHJpbmc8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPEJpSXRlcj46OnZhbHVlX3R5cGUsIFNULCBTQT4mIGxocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIHJocyk7CisKK3RlbXBsYXRlIDxjbGFzcyBCaUl0ZXIsIGNsYXNzIFNULCBjbGFzcyBTQT4KKyAgICBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBiYXNpY19zdHJpbmc8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPEJpSXRlcj46OnZhbHVlX3R5cGUsIFNULCBTQT4mIGxocywKKyAgICAgICAgICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiByaHMpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlJdGVyLCBjbGFzcyBTVCwgY2xhc3MgU0E+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIGxocywKKyAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8QmlJdGVyPjo6dmFsdWVfdHlwZSwgU1QsIFNBPiYgcmhzKTsKKwordGVtcGxhdGUgPGNsYXNzIEJpSXRlciwgY2xhc3MgU1QsIGNsYXNzIFNBPgorICAgIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiBsaHMsCisgICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPEJpSXRlcj46OnZhbHVlX3R5cGUsIFNULCBTQT4mIHJocyk7CisKK3RlbXBsYXRlIDxjbGFzcyBCaUl0ZXIsIGNsYXNzIFNULCBjbGFzcyBTQT4KKyAgICBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiBsaHMsCisgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8QmlJdGVyPjo6dmFsdWVfdHlwZSwgU1QsIFNBPiYgcmhzKTsKKwordGVtcGxhdGUgPGNsYXNzIEJpSXRlciwgY2xhc3MgU1QsIGNsYXNzIFNBPgorICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiBsaHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxCaUl0ZXI+Ojp2YWx1ZV90eXBlLCBTVCwgU0E+JiByaHMpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlJdGVyLCBjbGFzcyBTVCwgY2xhc3MgU0E+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIGxocywKKyAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8QmlJdGVyPjo6dmFsdWVfdHlwZSwgU1QsIFNBPiYgcmhzKTsKKwordGVtcGxhdGUgPGNsYXNzIEJpSXRlciwgY2xhc3MgU1QsIGNsYXNzIFNBPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiBsaHMsCisgICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPEJpSXRlcj46OnZhbHVlX3R5cGUsIFNULCBTQT4mIHJocyk7CisKK3RlbXBsYXRlIDxjbGFzcyBCaUl0ZXI+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPEJpSXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIGxocywKKyAgICAgICAgICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiByaHMpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlJdGVyPgorICAgIGJvb2wKKyAgICBvcGVyYXRvciE9KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxCaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBsaHMsCisgICAgICAgICAgICAgICBjb25zdCBzdWJfbWF0Y2g8QmlJdGVyPiYgcmhzKTsKKwordGVtcGxhdGUgPGNsYXNzIEJpSXRlcj4KKyAgICBib29sCisgICAgb3BlcmF0b3I8KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxCaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBsaHMsCisgICAgICAgICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiByaHMpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlJdGVyPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj4odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPEJpSXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIGxocywKKyAgICAgICAgICAgICAgY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIHJocyk7CisKK3RlbXBsYXRlIDxjbGFzcyBCaUl0ZXI+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPj0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPEJpSXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIGxocywKKyAgICAgICAgICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiByaHMpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlJdGVyPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcjw9KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxCaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBsaHMsCisgICAgICAgICAgICAgICBjb25zdCBzdWJfbWF0Y2g8QmlJdGVyPiYgcmhzKTsKKwordGVtcGxhdGUgPGNsYXNzIEJpSXRlcj4KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzdWJfbWF0Y2g8QmlJdGVyPiYgbGhzLAorICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPEJpSXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIHJocyk7CisKK3RlbXBsYXRlIDxjbGFzcyBCaUl0ZXI+CisgICAgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIGxocywKKyAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxCaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiByaHMpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlJdGVyPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIGxocywKKyAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPEJpSXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIHJocyk7CisKK3RlbXBsYXRlIDxjbGFzcyBCaUl0ZXI+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBzdWJfbWF0Y2g8QmlJdGVyPiYgbGhzLAorICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8QmlJdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogcmhzKTsKKwordGVtcGxhdGUgPGNsYXNzIEJpSXRlcj4KKyAgICBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBzdWJfbWF0Y2g8QmlJdGVyPiYgbGhzLAorICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPEJpSXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIHJocyk7CisKK3RlbXBsYXRlIDxjbGFzcyBCaUl0ZXI+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIGxocywKKyAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxCaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiByaHMpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlJdGVyPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxCaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBsaHMsCisgICAgICAgICAgICAgICBjb25zdCBzdWJfbWF0Y2g8QmlJdGVyPiYgcmhzKTsKKwordGVtcGxhdGUgPGNsYXNzIEJpSXRlcj4KKyAgICBib29sCisgICAgb3BlcmF0b3IhPSh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8QmlJdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgbGhzLAorICAgICAgICAgICAgICAgY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIHJocyk7CisKK3RlbXBsYXRlIDxjbGFzcyBCaUl0ZXI+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPCh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8QmlJdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgbGhzLAorICAgICAgICAgICAgICBjb25zdCBzdWJfbWF0Y2g8QmlJdGVyPiYgcmhzKTsKKwordGVtcGxhdGUgPGNsYXNzIEJpSXRlcj4KKyAgICBib29sCisgICAgb3BlcmF0b3I+KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxCaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBsaHMsCisgICAgICAgICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiByaHMpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlJdGVyPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj49KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxCaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBsaHMsCisgICAgICAgICAgICAgICBjb25zdCBzdWJfbWF0Y2g8QmlJdGVyPiYgcmhzKTsKKwordGVtcGxhdGUgPGNsYXNzIEJpSXRlcj4KKyAgICBib29sCisgICAgb3BlcmF0b3I8PSh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8QmlJdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgbGhzLAorICAgICAgICAgICAgICAgY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIHJocyk7CisKK3RlbXBsYXRlIDxjbGFzcyBCaUl0ZXI+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIGxocywKKyAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxCaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiByaHMpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlJdGVyPgorICAgIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiBsaHMsCisgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8QmlJdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgcmhzKTsKKwordGVtcGxhdGUgPGNsYXNzIEJpSXRlcj4KKyAgICBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiBsaHMsCisgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxCaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiByaHMpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlJdGVyPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIGxocywKKyAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPEJpSXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIHJocyk7CisKK3RlbXBsYXRlIDxjbGFzcyBCaUl0ZXI+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc3ViX21hdGNoPEJpSXRlcj4mIGxocywKKyAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxCaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiByaHMpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlJdGVyPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiBsaHMsCisgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8QmlJdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgcmhzKTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyBTVCwgY2xhc3MgQmlJdGVyPgorICAgIGJhc2ljX29zdHJlYW08Y2hhclQsIFNUPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhclQsIFNUPiYgb3MsIGNvbnN0IHN1Yl9tYXRjaDxCaUl0ZXI+JiBtKTsKKwordGVtcGxhdGUgPGNsYXNzIEJpZGlyZWN0aW9uYWxJdGVyYXRvciwKKyAgICAgICAgICBjbGFzcyBBbGxvY2F0b3IgPSBhbGxvY2F0b3I8c3ViX21hdGNoPEJpZGlyZWN0aW9uYWxJdGVyYXRvcj4+PgorY2xhc3MgbWF0Y2hfcmVzdWx0cworeworcHVibGljOgorICAgIHR5cGVkZWYgc3ViX21hdGNoPEJpZGlyZWN0aW9uYWxJdGVyYXRvcj4gICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIC9pbXBsZW1lbnRhdGlvbi1kZWZpbmVkLyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBjb25zdF9pdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPEJpZGlyZWN0aW9uYWxJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPEFsbG9jYXRvcj46OnNpemVfdHlwZSAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIEFsbG9jYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8QmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcl90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190eXBlOworCisgICAgLy8gY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICBleHBsaWNpdCBtYXRjaF9yZXN1bHRzKGNvbnN0IEFsbG9jYXRvciYgYSA9IEFsbG9jYXRvcigpKTsKKyAgICBtYXRjaF9yZXN1bHRzKGNvbnN0IG1hdGNoX3Jlc3VsdHMmIG0pOworICAgIG1hdGNoX3Jlc3VsdHMobWF0Y2hfcmVzdWx0cyYmIG0pIG5vZXhjZXB0OworICAgIG1hdGNoX3Jlc3VsdHMmIG9wZXJhdG9yPShjb25zdCBtYXRjaF9yZXN1bHRzJiBtKTsKKyAgICBtYXRjaF9yZXN1bHRzJiBvcGVyYXRvcj0obWF0Y2hfcmVzdWx0cyYmIG0pOworICAgIH5tYXRjaF9yZXN1bHRzKCk7CisKKyAgICBib29sIHJlYWR5KCkgY29uc3Q7CisKKyAgICAvLyBzaXplOgorICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3Q7CisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3Q7CisgICAgYm9vbCBlbXB0eSgpIGNvbnN0OworCisgICAgLy8gZWxlbWVudCBhY2Nlc3M6CisgICAgZGlmZmVyZW5jZV90eXBlIGxlbmd0aChzaXplX3R5cGUgc3ViID0gMCkgY29uc3Q7CisgICAgZGlmZmVyZW5jZV90eXBlIHBvc2l0aW9uKHNpemVfdHlwZSBzdWIgPSAwKSBjb25zdDsKKyAgICBzdHJpbmdfdHlwZSBzdHIoc2l6ZV90eXBlIHN1YiA9IDApIGNvbnN0OworICAgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBuKSBjb25zdDsKKworICAgIGNvbnN0X3JlZmVyZW5jZSBwcmVmaXgoKSBjb25zdDsKKyAgICBjb25zdF9yZWZlcmVuY2Ugc3VmZml4KCkgY29uc3Q7CisKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0OworICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0OworICAgIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0OworICAgIGNvbnN0X2l0ZXJhdG9yIGNlbmQoKSBjb25zdDsKKworICAgIC8vIGZvcm1hdDoKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgT3V0cHV0SXRlcj4KKyAgICAgICAgT3V0cHV0SXRlcgorICAgICAgICBmb3JtYXQoT3V0cHV0SXRlciBvdXQsIGNvbnN0IGNoYXJfdHlwZSogZm10X2ZpcnN0LAorICAgICAgICAgICAgICAgY29uc3QgY2hhcl90eXBlKiBmbXRfbGFzdCwKKyAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIGZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjpmb3JtYXRfZGVmYXVsdCkgY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIE91dHB1dEl0ZXIsIGNsYXNzIFNULCBjbGFzcyBTQT4KKyAgICAgICAgT3V0cHV0SXRlcgorICAgICAgICBmb3JtYXQoT3V0cHV0SXRlciBvdXQsIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyX3R5cGUsIFNULCBTQT4mIGZtdCwKKyAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIGZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjpmb3JtYXRfZGVmYXVsdCkgY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIFNULCBjbGFzcyBTQT4KKyAgICAgICAgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZSwgU1QsIFNBPgorICAgICAgICBmb3JtYXQoY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZSwgU1QsIFNBPiYgZm10LAorICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgZmxhZ3MgPSByZWdleF9jb25zdGFudHM6OmZvcm1hdF9kZWZhdWx0KSBjb25zdDsKKyAgICBzdHJpbmdfdHlwZQorICAgICAgICBmb3JtYXQoY29uc3QgY2hhcl90eXBlKiBmbXQsCisgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBmbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6Zm9ybWF0X2RlZmF1bHQpIGNvbnN0OworCisgICAgLy8gYWxsb2NhdG9yOgorICAgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdDsKKworICAgIC8vIHN3YXA6CisgICAgdm9pZCBzd2FwKG1hdGNoX3Jlc3VsdHMmIHRoYXQpOworfTsKKwordHlwZWRlZiBtYXRjaF9yZXN1bHRzPGNvbnN0IGNoYXIqPiAgICAgICAgICAgICBjbWF0Y2g7Cit0eXBlZGVmIG1hdGNoX3Jlc3VsdHM8Y29uc3Qgd2NoYXJfdCo+ICAgICAgICAgIHdjbWF0Y2g7Cit0eXBlZGVmIG1hdGNoX3Jlc3VsdHM8c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gIHNtYXRjaDsKK3R5cGVkZWYgbWF0Y2hfcmVzdWx0czx3c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gd3NtYXRjaDsKKwordGVtcGxhdGUgPGNsYXNzIEJpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgQWxsb2NhdG9yPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IG1hdGNoX3Jlc3VsdHM8QmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBBbGxvY2F0b3I+JiBtMSwKKyAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoX3Jlc3VsdHM8QmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBBbGxvY2F0b3I+JiBtMik7CisKK3RlbXBsYXRlIDxjbGFzcyBCaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBtYXRjaF9yZXN1bHRzPEJpZGlyZWN0aW9uYWxJdGVyYXRvciwgQWxsb2NhdG9yPiYgbTEsCisgICAgICAgICAgICAgICBjb25zdCBtYXRjaF9yZXN1bHRzPEJpZGlyZWN0aW9uYWxJdGVyYXRvciwgQWxsb2NhdG9yPiYgbTIpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBBbGxvY2F0b3I+CisgICAgdm9pZAorICAgIHN3YXAobWF0Y2hfcmVzdWx0czxCaWRpcmVjdGlvbmFsSXRlcmF0b3IsIEFsbG9jYXRvcj4mIG0xLAorICAgICAgICAgbWF0Y2hfcmVzdWx0czxCaWRpcmVjdGlvbmFsSXRlcmF0b3IsIEFsbG9jYXRvcj4mIG0yKTsKKwordGVtcGxhdGUgPGNsYXNzIEJpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgQWxsb2NhdG9yLCBjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGJvb2wKKyAgICByZWdleF9tYXRjaChCaWRpcmVjdGlvbmFsSXRlcmF0b3IgZmlyc3QsIEJpZGlyZWN0aW9uYWxJdGVyYXRvciBsYXN0LAorICAgICAgICAgICAgICAgIG1hdGNoX3Jlc3VsdHM8QmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBBbGxvY2F0b3I+JiBtLAorICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3JlZ2V4PGNoYXJULCB0cmFpdHM+JiBlLAorICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIGZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKwordGVtcGxhdGUgPGNsYXNzIEJpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBib29sCisgICAgcmVnZXhfbWF0Y2goQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGZpcnN0LCBCaWRpcmVjdGlvbmFsSXRlcmF0b3IgbGFzdCwKKyAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19yZWdleDxjaGFyVCwgdHJhaXRzPiYgZSwKKyAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBmbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgQWxsb2NhdG9yLCBjbGFzcyB0cmFpdHM+CisgICAgYm9vbAorICAgIHJlZ2V4X21hdGNoKGNvbnN0IGNoYXJUKiBzdHIsIG1hdGNoX3Jlc3VsdHM8Y29uc3QgY2hhclQqLCBBbGxvY2F0b3I+JiBtLAorICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3JlZ2V4PGNoYXJULCB0cmFpdHM+JiBlLAorICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIGZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKwordGVtcGxhdGUgPGNsYXNzIFNULCBjbGFzcyBTQSwgY2xhc3MgQWxsb2NhdG9yLCBjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGJvb2wKKyAgICByZWdleF9tYXRjaChjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIFNULCBTQT4mIHMsCisgICAgICAgICAgICAgICAgbWF0Y2hfcmVzdWx0czx0eXBlbmFtZSBiYXNpY19zdHJpbmc8Y2hhclQsIFNULCBTQT46OmNvbnN0X2l0ZXJhdG9yLCBBbGxvY2F0b3I+JiBtLAorICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3JlZ2V4PGNoYXJULCB0cmFpdHM+JiBlLAorICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIGZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKwordGVtcGxhdGUgPGNsYXNzIFNULCBjbGFzcyBTQSwgY2xhc3MgQWxsb2NhdG9yLCBjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGJvb2wKKyAgICByZWdleF9tYXRjaChjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIFNULCBTQT4mJiBzLAorICAgICAgICAgICAgICAgIG1hdGNoX3Jlc3VsdHM8dHlwZW5hbWUgYmFzaWNfc3RyaW5nPGNoYXJULCBTVCwgU0E+Ojpjb25zdF9pdGVyYXRvciwgQWxsb2NhdG9yPiYgbSwKKyAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19yZWdleDxjaGFyVCwgdHJhaXRzPiYgZSwKKyAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBmbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkgPSBkZWxldGU7IC8vIEMrKzE0CisKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGJvb2wKKyAgICByZWdleF9tYXRjaChjb25zdCBjaGFyVCogc3RyLCBjb25zdCBiYXNpY19yZWdleDxjaGFyVCwgdHJhaXRzPiYgZSwKKyAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBmbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBTVCwgY2xhc3MgU0EsIGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgYm9vbAorICAgIHJlZ2V4X21hdGNoKGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgU1QsIFNBPiYgcywKKyAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19yZWdleDxjaGFyVCwgdHJhaXRzPiYgZSwKKyAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBmbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBCaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIEFsbG9jYXRvciwgY2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBib29sCisgICAgcmVnZXhfc2VhcmNoKEJpZGlyZWN0aW9uYWxJdGVyYXRvciBmaXJzdCwgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICAgICAgIG1hdGNoX3Jlc3VsdHM8QmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBBbGxvY2F0b3I+JiBtLAorICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19yZWdleDxjaGFyVCwgdHJhaXRzPiYgZSwKKyAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgZmxhZ3MgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGJvb2wKKyAgICByZWdleF9zZWFyY2goQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGZpcnN0LCBCaWRpcmVjdGlvbmFsSXRlcmF0b3IgbGFzdCwKKyAgICAgICAgICAgICAgICAgY29uc3QgYmFzaWNfcmVnZXg8Y2hhclQsIHRyYWl0cz4mIGUsCisgICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIGZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyBBbGxvY2F0b3IsIGNsYXNzIHRyYWl0cz4KKyAgICBib29sCisgICAgcmVnZXhfc2VhcmNoKGNvbnN0IGNoYXJUKiBzdHIsIG1hdGNoX3Jlc3VsdHM8Y29uc3QgY2hhclQqLCBBbGxvY2F0b3I+JiBtLAorICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19yZWdleDxjaGFyVCwgdHJhaXRzPiYgZSwKKyAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgZmxhZ3MgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBib29sCisgICAgcmVnZXhfc2VhcmNoKGNvbnN0IGNoYXJUKiBzdHIsIGNvbnN0IGJhc2ljX3JlZ2V4PGNoYXJULCB0cmFpdHM+JiBlLAorICAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBmbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBTVCwgY2xhc3MgU0EsIGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgYm9vbAorICAgIHJlZ2V4X3NlYXJjaChjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIFNULCBTQT4mIHMsCisgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3JlZ2V4PGNoYXJULCB0cmFpdHM+JiBlLAorICAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBmbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBTVCwgY2xhc3MgU0EsIGNsYXNzIEFsbG9jYXRvciwgY2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBib29sCisgICAgcmVnZXhfc2VhcmNoKGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgU1QsIFNBPiYgcywKKyAgICAgICAgICAgICAgICAgbWF0Y2hfcmVzdWx0czx0eXBlbmFtZSBiYXNpY19zdHJpbmc8Y2hhclQsIFNULCBTQT46OmNvbnN0X2l0ZXJhdG9yLCBBbGxvY2F0b3I+JiBtLAorICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19yZWdleDxjaGFyVCwgdHJhaXRzPiYgZSwKKyAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgZmxhZ3MgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgU1QsIGNsYXNzIFNBLCBjbGFzcyBBbGxvY2F0b3IsIGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgYm9vbAorICAgIHJlZ2V4X3NlYXJjaChjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIFNULCBTQT4mJiBzLAorICAgICAgICAgICAgICAgICBtYXRjaF9yZXN1bHRzPHR5cGVuYW1lIGJhc2ljX3N0cmluZzxjaGFyVCwgU1QsIFNBPjo6Y29uc3RfaXRlcmF0b3IsIEFsbG9jYXRvcj4mIG0sCisgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3JlZ2V4PGNoYXJULCB0cmFpdHM+JiBlLAorICAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBmbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkgPSBkZWxldGU7IC8vIEMrKzE0CisKK3RlbXBsYXRlIDxjbGFzcyBPdXRwdXRJdGVyYXRvciwgY2xhc3MgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLAorICAgICAgICAgIGNsYXNzIHRyYWl0cywgY2xhc3MgY2hhclQsIGNsYXNzIFNULCBjbGFzcyBTQT4KKyAgICBPdXRwdXRJdGVyYXRvcgorICAgIHJlZ2V4X3JlcGxhY2UoT3V0cHV0SXRlcmF0b3Igb3V0LAorICAgICAgICAgICAgICAgICAgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGZpcnN0LCBCaWRpcmVjdGlvbmFsSXRlcmF0b3IgbGFzdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3JlZ2V4PGNoYXJULCB0cmFpdHM+JiBlLAorICAgICAgICAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCBTVCwgU0E+JiBmbXQsCisgICAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBmbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisKK3RlbXBsYXRlIDxjbGFzcyBPdXRwdXRJdGVyYXRvciwgY2xhc3MgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLAorICAgICAgICAgIGNsYXNzIHRyYWl0cywgY2xhc3MgY2hhclQ+CisgICAgT3V0cHV0SXRlcmF0b3IKKyAgICByZWdleF9yZXBsYWNlKE91dHB1dEl0ZXJhdG9yIG91dCwKKyAgICAgICAgICAgICAgICAgIEJpZGlyZWN0aW9uYWxJdGVyYXRvciBmaXJzdCwgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19yZWdleDxjaGFyVCwgdHJhaXRzPiYgZSwgY29uc3QgY2hhclQqIGZtdCwKKyAgICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIGZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKwordGVtcGxhdGUgPGNsYXNzIHRyYWl0cywgY2xhc3MgY2hhclQsIGNsYXNzIFNULCBjbGFzcyBTQSwgY2xhc3MgRlNULCBjbGFzcyBGU0E+PgorICAgIGJhc2ljX3N0cmluZzxjaGFyVCwgU1QsIFNBPgorICAgIHJlZ2V4X3JlcGxhY2UoY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCBTVCwgU0E+JiBzLAorICAgICAgICAgICAgICAgICAgY29uc3QgYmFzaWNfcmVnZXg8Y2hhclQsIHRyYWl0cz4mIGUsCisgICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIEZTVCwgRlNBPiYgZm10LAorICAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgZmxhZ3MgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgdHJhaXRzLCBjbGFzcyBjaGFyVCwgY2xhc3MgU1QsIGNsYXNzIFNBPgorICAgIGJhc2ljX3N0cmluZzxjaGFyVCwgU1QsIFNBPgorICAgIHJlZ2V4X3JlcGxhY2UoY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCBTVCwgU0E+JiBzLAorICAgICAgICAgICAgICAgICAgY29uc3QgYmFzaWNfcmVnZXg8Y2hhclQsIHRyYWl0cz4mIGUsIGNvbnN0IGNoYXJUKiBmbXQsCisgICAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBmbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisKK3RlbXBsYXRlIDxjbGFzcyB0cmFpdHMsIGNsYXNzIGNoYXJULCBjbGFzcyBTVCwgY2xhc3MgU0E+CisgICAgYmFzaWNfc3RyaW5nPGNoYXJUPgorICAgIHJlZ2V4X3JlcGxhY2UoY29uc3QgY2hhclQqIHMsCisgICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19yZWdleDxjaGFyVCwgdHJhaXRzPiYgZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgU1QsIFNBPiYgZm10LAorICAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgZmxhZ3MgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCit0ZW1wbGF0ZSA8Y2xhc3MgdHJhaXRzLCBjbGFzcyBjaGFyVD4KKyAgICBiYXNpY19zdHJpbmc8Y2hhclQ+CisgICAgcmVnZXhfcmVwbGFjZShjb25zdCBjaGFyVCogcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3JlZ2V4PGNoYXJULCB0cmFpdHM+JiBlLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhclQqIGZtdCwKKyAgICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIGZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKwordGVtcGxhdGUgPGNsYXNzIEJpZGlyZWN0aW9uYWxJdGVyYXRvciwKKyAgICAgICAgICBjbGFzcyBjaGFyVCA9IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czwgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKyAgICAgICAgICBjbGFzcyB0cmFpdHMgPSByZWdleF90cmFpdHM8Y2hhclQ+PgorY2xhc3MgcmVnZXhfaXRlcmF0b3IKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGJhc2ljX3JlZ2V4PGNoYXJULCB0cmFpdHM+ICAgICAgICAgICByZWdleF90eXBlOworICAgIHR5cGVkZWYgbWF0Y2hfcmVzdWx0czxCaWRpcmVjdGlvbmFsSXRlcmF0b3I+IHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgZm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgcmVnZXhfaXRlcmF0b3IoKTsKKyAgICByZWdleF9pdGVyYXRvcihCaWRpcmVjdGlvbmFsSXRlcmF0b3IgYSwgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgcmVnZXhfdHlwZSYgcmUsCisgICAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgbSA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisgICAgcmVnZXhfaXRlcmF0b3IoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2EsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19iLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4X3R5cGUmJiBfX3JlLAorICAgICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fbSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkgPSBkZWxldGU7IC8vIEMrKzE0CisgICAgcmVnZXhfaXRlcmF0b3IoY29uc3QgcmVnZXhfaXRlcmF0b3ImKTsKKyAgICByZWdleF9pdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IHJlZ2V4X2l0ZXJhdG9yJik7CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgcmVnZXhfaXRlcmF0b3ImKSBjb25zdDsKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgcmVnZXhfaXRlcmF0b3ImKSBjb25zdDsKKworICAgIGNvbnN0IHZhbHVlX3R5cGUmIG9wZXJhdG9yKigpIGNvbnN0OworICAgIGNvbnN0IHZhbHVlX3R5cGUqIG9wZXJhdG9yLT4oKSBjb25zdDsKKworICAgIHJlZ2V4X2l0ZXJhdG9yJiBvcGVyYXRvcisrKCk7CisgICAgcmVnZXhfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpOworfTsKKwordHlwZWRlZiByZWdleF9pdGVyYXRvcjxjb25zdCBjaGFyKj4gICAgICAgICAgICAgY3JlZ2V4X2l0ZXJhdG9yOwordHlwZWRlZiByZWdleF9pdGVyYXRvcjxjb25zdCB3Y2hhcl90Kj4gICAgICAgICAgd2NyZWdleF9pdGVyYXRvcjsKK3R5cGVkZWYgcmVnZXhfaXRlcmF0b3I8c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gIHNyZWdleF9pdGVyYXRvcjsKK3R5cGVkZWYgcmVnZXhfaXRlcmF0b3I8d3N0cmluZzo6Y29uc3RfaXRlcmF0b3I+IHdzcmVnZXhfaXRlcmF0b3I7CisKK3RlbXBsYXRlIDxjbGFzcyBCaWRpcmVjdGlvbmFsSXRlcmF0b3IsCisgICAgICAgICAgY2xhc3MgY2hhclQgPSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8IEJpZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisgICAgICAgICAgY2xhc3MgdHJhaXRzID0gcmVnZXhfdHJhaXRzPGNoYXJUPj4KK2NsYXNzIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yCit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBiYXNpY19yZWdleDxjaGFyVCwgdHJhaXRzPiAgICAgICByZWdleF90eXBlOworICAgIHR5cGVkZWYgc3ViX21hdGNoPEJpZGlyZWN0aW9uYWxJdGVyYXRvcj4gdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKCk7CisgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGEsIEJpZGlyZWN0aW9uYWxJdGVyYXRvciBiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4X3R5cGUmIHJlLCBpbnQgc3VibWF0Y2ggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIG0gPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKEJpZGlyZWN0aW9uYWxJdGVyYXRvciBhLCBCaWRpcmVjdGlvbmFsSXRlcmF0b3IgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleF90eXBlJiYgcmUsIGludCBzdWJtYXRjaCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgbSA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkgPSBkZWxldGU7IC8vIEMrKzE0CisgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGEsIEJpZGlyZWN0aW9uYWxJdGVyYXRvciBiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4X3R5cGUmIHJlLCBjb25zdCB2ZWN0b3I8aW50PiYgc3VibWF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBtID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKyAgICByZWdleF90b2tlbl9pdGVyYXRvcihCaWRpcmVjdGlvbmFsSXRlcmF0b3IgYSwgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVnZXhfdHlwZSYmIHJlLCBjb25zdCB2ZWN0b3I8aW50PiYgc3VibWF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBtID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KSA9IGRlbGV0ZTsgLy8gQysrMTQKKyAgICByZWdleF90b2tlbl9pdGVyYXRvcihCaWRpcmVjdGlvbmFsSXRlcmF0b3IgYSwgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVnZXhfdHlwZSYgcmUsIGluaXRpYWxpemVyX2xpc3Q8aW50PiBzdWJtYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIG0gPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKEJpZGlyZWN0aW9uYWxJdGVyYXRvciBhLCBCaWRpcmVjdGlvbmFsSXRlcmF0b3IgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleF90eXBlJiYgcmUsIGluaXRpYWxpemVyX2xpc3Q8aW50PiBzdWJtYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIG0gPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpID0gZGVsZXRlOyAvLyBDKysxNAorICAgIHRlbXBsYXRlIDxzaXplX3QgTj4KKyAgICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGEsIEJpZGlyZWN0aW9uYWxJdGVyYXRvciBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleF90eXBlJiByZSwgY29uc3QgaW50ICgmc3VibWF0Y2hlcylbTl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIG0gPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworICAgIHRlbXBsYXRlIDxzaXplX3QgTj4KKyAgICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGEsIEJpZGlyZWN0aW9uYWxJdGVyYXRvciBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleF90eXBlJiByZSwgY29uc3QgaW50ICgmc3VibWF0Y2hlcylbTl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIG0gPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpID0gZGVsZXRlIC8vIEMrKzE0OworICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKGNvbnN0IHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJik7CisgICAgcmVnZXhfdG9rZW5faXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCByZWdleF90b2tlbl9pdGVyYXRvciYpOworCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJikgY29uc3Q7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJikgY29uc3Q7CisKKyAgICBjb25zdCB2YWx1ZV90eXBlJiBvcGVyYXRvciooKSBjb25zdDsKKyAgICBjb25zdCB2YWx1ZV90eXBlKiBvcGVyYXRvci0+KCkgY29uc3Q7CisKKyAgICByZWdleF90b2tlbl9pdGVyYXRvciYgb3BlcmF0b3IrKygpOworICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KTsKK307CisKK3R5cGVkZWYgcmVnZXhfdG9rZW5faXRlcmF0b3I8Y29uc3QgY2hhcio+ICAgICAgICAgICAgIGNyZWdleF90b2tlbl9pdGVyYXRvcjsKK3R5cGVkZWYgcmVnZXhfdG9rZW5faXRlcmF0b3I8Y29uc3Qgd2NoYXJfdCo+ICAgICAgICAgIHdjcmVnZXhfdG9rZW5faXRlcmF0b3I7Cit0eXBlZGVmIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yPHN0cmluZzo6Y29uc3RfaXRlcmF0b3I+ICBzcmVnZXhfdG9rZW5faXRlcmF0b3I7Cit0eXBlZGVmIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yPHdzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiB3c3JlZ2V4X3Rva2VuX2l0ZXJhdG9yOworCit9IC8vIHN0ZAorKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxfX2xvY2FsZT4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8ZGVxdWU+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX1BVU0hfTUFDUk9TCisjaW5jbHVkZSA8X191bmRlZl9tYWNyb3M+CisKKworI2RlZmluZSBfTElCQ1BQX1JFR0VYX0NPTVBMRVhJVFlfRkFDVE9SIDQwOTYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK25hbWVzcGFjZSByZWdleF9jb25zdGFudHMKK3sKKworLy8gc3ludGF4X29wdGlvbl90eXBlCisKK2VudW0gc3ludGF4X29wdGlvbl90eXBlCit7CisgICAgaWNhc2UgICAgICA9IDEgPDwgMCwKKyAgICBub3N1YnMgICAgID0gMSA8PCAxLAorICAgIG9wdGltaXplICAgPSAxIDw8IDIsCisgICAgY29sbGF0ZSAgICA9IDEgPDwgMywKKyAgICBFQ01BU2NyaXB0ID0gMCwKKyAgICBiYXNpYyAgICAgID0gMSA8PCA0LAorICAgIGV4dGVuZGVkICAgPSAxIDw8IDUsCisgICAgYXdrICAgICAgICA9IDEgPDwgNiwKKyAgICBncmVwICAgICAgID0gMSA8PCA3LAorICAgIGVncmVwICAgICAgPSAxIDw8IDgKK307CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0NPTlNURVhQUgorc3ludGF4X29wdGlvbl90eXBlCitvcGVyYXRvcn4oc3ludGF4X29wdGlvbl90eXBlIF9feCkKK3sKKyAgICByZXR1cm4gc3ludGF4X29wdGlvbl90eXBlKH5pbnQoX194KSAmIDB4MUZGKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSCitzeW50YXhfb3B0aW9uX3R5cGUKK29wZXJhdG9yJihzeW50YXhfb3B0aW9uX3R5cGUgX194LCBzeW50YXhfb3B0aW9uX3R5cGUgX195KQoreworICAgIHJldHVybiBzeW50YXhfb3B0aW9uX3R5cGUoaW50KF9feCkgJiBpbnQoX195KSk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0NPTlNURVhQUgorc3ludGF4X29wdGlvbl90eXBlCitvcGVyYXRvcnwoc3ludGF4X29wdGlvbl90eXBlIF9feCwgc3ludGF4X29wdGlvbl90eXBlIF9feSkKK3sKKyAgICByZXR1cm4gc3ludGF4X29wdGlvbl90eXBlKGludChfX3gpIHwgaW50KF9feSkpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIKK3N5bnRheF9vcHRpb25fdHlwZQorb3BlcmF0b3JeKHN5bnRheF9vcHRpb25fdHlwZSBfX3gsIHN5bnRheF9vcHRpb25fdHlwZSBfX3kpCit7CisgICAgcmV0dXJuIHN5bnRheF9vcHRpb25fdHlwZShpbnQoX194KSBeIGludChfX3kpKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3N5bnRheF9vcHRpb25fdHlwZSYKK29wZXJhdG9yJj0oc3ludGF4X29wdGlvbl90eXBlJiBfX3gsIHN5bnRheF9vcHRpb25fdHlwZSBfX3kpCit7CisgICAgX194ID0gX194ICYgX195OworICAgIHJldHVybiBfX3g7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitzeW50YXhfb3B0aW9uX3R5cGUmCitvcGVyYXRvcnw9KHN5bnRheF9vcHRpb25fdHlwZSYgX194LCBzeW50YXhfb3B0aW9uX3R5cGUgX195KQoreworICAgIF9feCA9IF9feCB8IF9feTsKKyAgICByZXR1cm4gX194OworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorc3ludGF4X29wdGlvbl90eXBlJgorb3BlcmF0b3JePShzeW50YXhfb3B0aW9uX3R5cGUmIF9feCwgc3ludGF4X29wdGlvbl90eXBlIF9feSkKK3sKKyAgICBfX3ggPSBfX3ggXiBfX3k7CisgICAgcmV0dXJuIF9feDsKK30KKworLy8gbWF0Y2hfZmxhZ190eXBlCisKK2VudW0gbWF0Y2hfZmxhZ190eXBlCit7CisgICAgbWF0Y2hfZGVmYXVsdCAgICAgPSAwLAorICAgIG1hdGNoX25vdF9ib2wgICAgID0gMSA8PCAwLAorICAgIG1hdGNoX25vdF9lb2wgICAgID0gMSA8PCAxLAorICAgIG1hdGNoX25vdF9ib3cgICAgID0gMSA8PCAyLAorICAgIG1hdGNoX25vdF9lb3cgICAgID0gMSA8PCAzLAorICAgIG1hdGNoX2FueSAgICAgICAgID0gMSA8PCA0LAorICAgIG1hdGNoX25vdF9udWxsICAgID0gMSA8PCA1LAorICAgIG1hdGNoX2NvbnRpbnVvdXMgID0gMSA8PCA2LAorICAgIG1hdGNoX3ByZXZfYXZhaWwgID0gMSA8PCA3LAorICAgIGZvcm1hdF9kZWZhdWx0ICAgID0gMCwKKyAgICBmb3JtYXRfc2VkICAgICAgICA9IDEgPDwgOCwKKyAgICBmb3JtYXRfbm9fY29weSAgICA9IDEgPDwgOSwKKyAgICBmb3JtYXRfZmlyc3Rfb25seSA9IDEgPDwgMTAsCisgICAgX19ub191cGRhdGVfcG9zICAgPSAxIDw8IDExLAorICAgIF9fZnVsbF9tYXRjaCAgICAgID0gMSA8PCAxMgorfTsKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSCittYXRjaF9mbGFnX3R5cGUKK29wZXJhdG9yfihtYXRjaF9mbGFnX3R5cGUgX194KQoreworICAgIHJldHVybiBtYXRjaF9mbGFnX3R5cGUofmludChfX3gpICYgMHgwRkZGKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSCittYXRjaF9mbGFnX3R5cGUKK29wZXJhdG9yJihtYXRjaF9mbGFnX3R5cGUgX194LCBtYXRjaF9mbGFnX3R5cGUgX195KQoreworICAgIHJldHVybiBtYXRjaF9mbGFnX3R5cGUoaW50KF9feCkgJiBpbnQoX195KSk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0NPTlNURVhQUgorbWF0Y2hfZmxhZ190eXBlCitvcGVyYXRvcnwobWF0Y2hfZmxhZ190eXBlIF9feCwgbWF0Y2hfZmxhZ190eXBlIF9feSkKK3sKKyAgICByZXR1cm4gbWF0Y2hfZmxhZ190eXBlKGludChfX3gpIHwgaW50KF9feSkpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIKK21hdGNoX2ZsYWdfdHlwZQorb3BlcmF0b3JeKG1hdGNoX2ZsYWdfdHlwZSBfX3gsIG1hdGNoX2ZsYWdfdHlwZSBfX3kpCit7CisgICAgcmV0dXJuIG1hdGNoX2ZsYWdfdHlwZShpbnQoX194KSBeIGludChfX3kpKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK21hdGNoX2ZsYWdfdHlwZSYKK29wZXJhdG9yJj0obWF0Y2hfZmxhZ190eXBlJiBfX3gsIG1hdGNoX2ZsYWdfdHlwZSBfX3kpCit7CisgICAgX194ID0gX194ICYgX195OworICAgIHJldHVybiBfX3g7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCittYXRjaF9mbGFnX3R5cGUmCitvcGVyYXRvcnw9KG1hdGNoX2ZsYWdfdHlwZSYgX194LCBtYXRjaF9mbGFnX3R5cGUgX195KQoreworICAgIF9feCA9IF9feCB8IF9feTsKKyAgICByZXR1cm4gX194OworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorbWF0Y2hfZmxhZ190eXBlJgorb3BlcmF0b3JePShtYXRjaF9mbGFnX3R5cGUmIF9feCwgbWF0Y2hfZmxhZ190eXBlIF9feSkKK3sKKyAgICBfX3ggPSBfX3ggXiBfX3k7CisgICAgcmV0dXJuIF9feDsKK30KKworZW51bSBlcnJvcl90eXBlCit7CisgICAgZXJyb3JfY29sbGF0ZSA9IDEsCisgICAgZXJyb3JfY3R5cGUsCisgICAgZXJyb3JfZXNjYXBlLAorICAgIGVycm9yX2JhY2tyZWYsCisgICAgZXJyb3JfYnJhY2ssCisgICAgZXJyb3JfcGFyZW4sCisgICAgZXJyb3JfYnJhY2UsCisgICAgZXJyb3JfYmFkYnJhY2UsCisgICAgZXJyb3JfcmFuZ2UsCisgICAgZXJyb3Jfc3BhY2UsCisgICAgZXJyb3JfYmFkcmVwZWF0LAorICAgIGVycm9yX2NvbXBsZXhpdHksCisgICAgZXJyb3Jfc3RhY2ssCisgICAgX19yZV9lcnJfZ3JhbW1hciwKKyAgICBfX3JlX2Vycl9lbXB0eSwKKyAgICBfX3JlX2Vycl91bmtub3duCit9OworCit9ICAvLyByZWdleF9jb25zdGFudHMKKworY2xhc3MgX0xJQkNQUF9FWENFUFRJT05fQUJJIHJlZ2V4X2Vycm9yCisgICAgOiBwdWJsaWMgcnVudGltZV9lcnJvcgoreworICAgIHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfdHlwZSBfX2NvZGVfOworcHVibGljOgorICAgIGV4cGxpY2l0IHJlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfdHlwZSBfX2Vjb2RlKTsKKyAgICB2aXJ0dWFsIH5yZWdleF9lcnJvcigpIHRocm93KCk7CisgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZWdleF9jb25zdGFudHM6OmVycm9yX3R5cGUgY29kZSgpIGNvbnN0IHtyZXR1cm4gX19jb2RlXzt9Cit9OworCit0ZW1wbGF0ZSA8cmVnZXhfY29uc3RhbnRzOjplcnJvcl90eXBlIF9Fdj4KK19MSUJDUFBfTk9SRVRVUk4gaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORQordm9pZCBfX3Rocm93X3JlZ2V4X2Vycm9yKCkKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdGhyb3cgcmVnZXhfZXJyb3IoX0V2KTsKKyNlbHNlCisgICAgX1ZTVEQ6OmFib3J0KCk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyByZWdleF90cmFpdHMKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyX3R5cGU+IHN0cmluZ190eXBlOworICAgIHR5cGVkZWYgbG9jYWxlICAgICAgICAgICAgICAgICAgbG9jYWxlX3R5cGU7CisgICAgdHlwZWRlZiBjdHlwZV9iYXNlOjptYXNrICAgICAgICBjaGFyX2NsYXNzX3R5cGU7CisKKyNpZiBkZWZpbmVkKF9fbWlwc19fKSAmJiBkZWZpbmVkKF9fR0xJQkNfXykKKyAgICBzdGF0aWMgY29uc3QgY2hhcl9jbGFzc190eXBlIF9fcmVnZXhfd29yZCA9IHN0YXRpY19jYXN0PGNoYXJfY2xhc3NfdHlwZT4oX0lTYml0KDE1KSk7CisjZWxzZQorICAgIHN0YXRpYyBjb25zdCBjaGFyX2NsYXNzX3R5cGUgX19yZWdleF93b3JkID0gMHg4MDsKKyNlbmRpZgorCitwcml2YXRlOgorICAgIGxvY2FsZSBfX2xvY187CisgICAgY29uc3QgY3R5cGU8Y2hhcl90eXBlPiogX19jdF87CisgICAgY29uc3QgY29sbGF0ZTxjaGFyX3R5cGU+KiBfX2NvbF87CisKK3B1YmxpYzoKKyAgICByZWdleF90cmFpdHMoKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgc2l6ZV90IGxlbmd0aChjb25zdCBjaGFyX3R5cGUqIF9fcCkKKyAgICAgICAge3JldHVybiBjaGFyX3RyYWl0czxjaGFyX3R5cGU+OjpsZW5ndGgoX19wKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNoYXJfdHlwZSB0cmFuc2xhdGUoY2hhcl90eXBlIF9fYykgY29uc3Qge3JldHVybiBfX2M7fQorICAgIGNoYXJfdHlwZSB0cmFuc2xhdGVfbm9jYXNlKGNoYXJfdHlwZSBfX2MpIGNvbnN0OworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBzdHJpbmdfdHlwZQorICAgICAgICB0cmFuc2Zvcm0oX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX19sKSBjb25zdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBzdHJpbmdfdHlwZQorICAgICAgICB0cmFuc2Zvcm1fcHJpbWFyeSggX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX19sKSBjb25zdAorICAgICAgICAgICAge3JldHVybiBfX3RyYW5zZm9ybV9wcmltYXJ5KF9fZiwgX19sLCBjaGFyX3R5cGUoKSk7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHN0cmluZ190eXBlCisgICAgICAgIGxvb2t1cF9jb2xsYXRlbmFtZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX2wpIGNvbnN0CisgICAgICAgICAgICB7cmV0dXJuIF9fbG9va3VwX2NvbGxhdGVuYW1lKF9fZiwgX19sLCBjaGFyX3R5cGUoKSk7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGNoYXJfY2xhc3NfdHlwZQorICAgICAgICBsb29rdXBfY2xhc3NuYW1lKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9faWNhc2UgPSBmYWxzZSkgY29uc3QKKyAgICAgICAgICAgIHtyZXR1cm4gX19sb29rdXBfY2xhc3NuYW1lKF9fZiwgX19sLCBfX2ljYXNlLCBjaGFyX3R5cGUoKSk7fQorICAgIGJvb2wgaXNjdHlwZShjaGFyX3R5cGUgX19jLCBjaGFyX2NsYXNzX3R5cGUgX19tKSBjb25zdDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaW50IHZhbHVlKGNoYXJfdHlwZSBfX2NoLCBpbnQgX19yYWRpeCkgY29uc3QKKyAgICAgICAge3JldHVybiBfX3JlZ2V4X3RyYWl0c192YWx1ZShfX2NoLCBfX3JhZGl4KTt9CisgICAgbG9jYWxlX3R5cGUgaW1idWUobG9jYWxlX3R5cGUgX19sKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgbG9jYWxlX3R5cGUgZ2V0bG9jKCljb25zdCB7cmV0dXJuIF9fbG9jXzt9CisKK3ByaXZhdGU6CisgICAgdm9pZCBfX2luaXQoKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBzdHJpbmdfdHlwZQorICAgICAgICBfX3RyYW5zZm9ybV9wcmltYXJ5KF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fbCwgY2hhcikgY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHN0cmluZ190eXBlCisgICAgICAgIF9fdHJhbnNmb3JtX3ByaW1hcnkoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX19sLCB3Y2hhcl90KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBzdHJpbmdfdHlwZQorICAgICAgICBfX2xvb2t1cF9jb2xsYXRlbmFtZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX2wsIGNoYXIpIGNvbnN0OworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBzdHJpbmdfdHlwZQorICAgICAgICBfX2xvb2t1cF9jb2xsYXRlbmFtZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX2wsIHdjaGFyX3QpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIGNoYXJfY2xhc3NfdHlwZQorICAgICAgICBfX2xvb2t1cF9jbGFzc25hbWUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2ljYXNlLCBjaGFyKSBjb25zdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgY2hhcl9jbGFzc190eXBlCisgICAgICAgIF9fbG9va3VwX2NsYXNzbmFtZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9faWNhc2UsIHdjaGFyX3QpIGNvbnN0OworCisgICAgc3RhdGljIGludCBfX3JlZ2V4X3RyYWl0c192YWx1ZSh1bnNpZ25lZCBjaGFyIF9fY2gsIGludCBfX3JhZGl4KTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaW50IF9fcmVnZXhfdHJhaXRzX3ZhbHVlKGNoYXIgX19jaCwgaW50IF9fcmFkaXgpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX19yZWdleF90cmFpdHNfdmFsdWUoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oX19jaCksIF9fcmFkaXgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaW50IF9fcmVnZXhfdHJhaXRzX3ZhbHVlKHdjaGFyX3QgX19jaCwgaW50IF9fcmFkaXgpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2NvbnN0IHR5cGVuYW1lIHJlZ2V4X3RyYWl0czxfQ2hhclQ+OjpjaGFyX2NsYXNzX3R5cGUKK3JlZ2V4X3RyYWl0czxfQ2hhclQ+OjpfX3JlZ2V4X3dvcmQ7CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CityZWdleF90cmFpdHM8X0NoYXJUPjo6cmVnZXhfdHJhaXRzKCkKK3sKKyAgICBfX2luaXQoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3R5cGVuYW1lIHJlZ2V4X3RyYWl0czxfQ2hhclQ+OjpjaGFyX3R5cGUKK3JlZ2V4X3RyYWl0czxfQ2hhclQ+Ojp0cmFuc2xhdGVfbm9jYXNlKGNoYXJfdHlwZSBfX2MpIGNvbnN0Cit7CisgICAgcmV0dXJuIF9fY3RfLT50b2xvd2VyKF9fYyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK3R5cGVuYW1lIHJlZ2V4X3RyYWl0czxfQ2hhclQ+OjpzdHJpbmdfdHlwZQorcmVnZXhfdHJhaXRzPF9DaGFyVD46OnRyYW5zZm9ybShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX2wpIGNvbnN0Cit7CisgICAgc3RyaW5nX3R5cGUgX19zKF9fZiwgX19sKTsKKyAgICByZXR1cm4gX19jb2xfLT50cmFuc2Zvcm0oX19zLmRhdGEoKSwgX19zLmRhdGEoKSArIF9fcy5zaXplKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordm9pZAorcmVnZXhfdHJhaXRzPF9DaGFyVD46Ol9faW5pdCgpCit7CisgICAgX19jdF8gPSAmdXNlX2ZhY2V0PGN0eXBlPGNoYXJfdHlwZT4gPihfX2xvY18pOworICAgIF9fY29sXyA9ICZ1c2VfZmFjZXQ8Y29sbGF0ZTxjaGFyX3R5cGU+ID4oX19sb2NfKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3R5cGVuYW1lIHJlZ2V4X3RyYWl0czxfQ2hhclQ+Ojpsb2NhbGVfdHlwZQorcmVnZXhfdHJhaXRzPF9DaGFyVD46OmltYnVlKGxvY2FsZV90eXBlIF9fbCkKK3sKKyAgICBsb2NhbGUgX19yID0gX19sb2NfOworICAgIF9fbG9jXyA9IF9fbDsKKyAgICBfX2luaXQoKTsKKyAgICByZXR1cm4gX19yOworfQorCisvLyB0cmFuc2Zvcm1fcHJpbWFyeSBpcyB2ZXJ5IEZyZWVCU0Qtc3BlY2lmaWMKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgordHlwZW5hbWUgcmVnZXhfdHJhaXRzPF9DaGFyVD46OnN0cmluZ190eXBlCityZWdleF90cmFpdHM8X0NoYXJUPjo6X190cmFuc2Zvcm1fcHJpbWFyeShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sLCBjaGFyKSBjb25zdAoreworICAgIGNvbnN0IHN0cmluZ190eXBlIF9fcyhfX2YsIF9fbCk7CisgICAgc3RyaW5nX3R5cGUgX19kID0gX19jb2xfLT50cmFuc2Zvcm0oX19zLmRhdGEoKSwgX19zLmRhdGEoKSArIF9fcy5zaXplKCkpOworICAgIHN3aXRjaCAoX19kLnNpemUoKSkKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyOgorICAgICAgICBfX2RbMTFdID0gX19kWzNdOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBfX2QuY2xlYXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBfX2Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK3R5cGVuYW1lIHJlZ2V4X3RyYWl0czxfQ2hhclQ+OjpzdHJpbmdfdHlwZQorcmVnZXhfdHJhaXRzPF9DaGFyVD46Ol9fdHJhbnNmb3JtX3ByaW1hcnkoX0ZvcndhcmRJdGVyYXRvciBfX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbCwgd2NoYXJfdCkgY29uc3QKK3sKKyAgICBjb25zdCBzdHJpbmdfdHlwZSBfX3MoX19mLCBfX2wpOworICAgIHN0cmluZ190eXBlIF9fZCA9IF9fY29sXy0+dHJhbnNmb3JtKF9fcy5kYXRhKCksIF9fcy5kYXRhKCkgKyBfX3Muc2l6ZSgpKTsKKyAgICBzd2l0Y2ggKF9fZC5zaXplKCkpCisgICAgeworICAgIGNhc2UgMToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBfX2RbMl0gPSBfX2RbMF07CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIF9fZC5jbGVhcigpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIF9fZDsKK30KKworLy8gbG9va3VwX2NvbGxhdGVuYW1lIGlzIHZlcnkgRnJlZUJTRC1zcGVjaWZpYworCitfTElCQ1BQX0ZVTkNfVklTIHN0cmluZyBfX2dldF9jb2xsYXRpb25fbmFtZShjb25zdCBjaGFyKiBfX3MpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Cit0eXBlbmFtZSByZWdleF90cmFpdHM8X0NoYXJUPjo6c3RyaW5nX3R5cGUKK3JlZ2V4X3RyYWl0czxfQ2hhclQ+OjpfX2xvb2t1cF9jb2xsYXRlbmFtZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbCwgY2hhcikgY29uc3QKK3sKKyAgICBzdHJpbmdfdHlwZSBfX3MoX19mLCBfX2wpOworICAgIHN0cmluZ190eXBlIF9fcjsKKyAgICBpZiAoIV9fcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgX19yID0gX19nZXRfY29sbGF0aW9uX25hbWUoX19zLmNfc3RyKCkpOworICAgICAgICBpZiAoX19yLmVtcHR5KCkgJiYgX19zLnNpemUoKSA8PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBfX3IgPSBfX2NvbF8tPnRyYW5zZm9ybShfX3MuZGF0YSgpLCBfX3MuZGF0YSgpICsgX19zLnNpemUoKSk7CisgICAgICAgICAgICBpZiAoX19yLnNpemUoKSA9PSAxIHx8IF9fci5zaXplKCkgPT0gMTIpCisgICAgICAgICAgICAgICAgX19yID0gX19zOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9fci5jbGVhcigpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK3R5cGVuYW1lIHJlZ2V4X3RyYWl0czxfQ2hhclQ+OjpzdHJpbmdfdHlwZQorcmVnZXhfdHJhaXRzPF9DaGFyVD46Ol9fbG9va3VwX2NvbGxhdGVuYW1lKF9Gb3J3YXJkSXRlcmF0b3IgX19mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sLCB3Y2hhcl90KSBjb25zdAoreworICAgIHN0cmluZ190eXBlIF9fcyhfX2YsIF9fbCk7CisgICAgc3RyaW5nIF9fbjsKKyAgICBfX24ucmVzZXJ2ZShfX3Muc2l6ZSgpKTsKKyAgICBmb3IgKHR5cGVuYW1lIHN0cmluZ190eXBlOjpjb25zdF9pdGVyYXRvciBfX2kgPSBfX3MuYmVnaW4oKSwgX19lID0gX19zLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2kgIT0gX19lOyArK19faSkKKyAgICB7CisgICAgICAgIGlmIChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oKl9faSkgPj0gMTI3KQorICAgICAgICAgICAgcmV0dXJuIHN0cmluZ190eXBlKCk7CisgICAgICAgIF9fbi5wdXNoX2JhY2soY2hhcigqX19pKSk7CisgICAgfQorICAgIHN0cmluZ190eXBlIF9fcjsKKyAgICBpZiAoIV9fcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgX19uID0gX19nZXRfY29sbGF0aW9uX25hbWUoX19uLmNfc3RyKCkpOworICAgICAgICBpZiAoIV9fbi5lbXB0eSgpKQorICAgICAgICAgICAgX19yLmFzc2lnbihfX24uYmVnaW4oKSwgX19uLmVuZCgpKTsKKyAgICAgICAgZWxzZSBpZiAoX19zLnNpemUoKSA8PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBfX3IgPSBfX2NvbF8tPnRyYW5zZm9ybShfX3MuZGF0YSgpLCBfX3MuZGF0YSgpICsgX19zLnNpemUoKSk7CisgICAgICAgICAgICBpZiAoX19yLnNpemUoKSA9PSAxIHx8IF9fci5zaXplKCkgPT0gMykKKyAgICAgICAgICAgICAgICBfX3IgPSBfX3M7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX19yLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fcjsKK30KKworLy8gbG9va3VwX2NsYXNzbmFtZQorCityZWdleF90cmFpdHM8Y2hhcj46OmNoYXJfY2xhc3NfdHlwZSBfTElCQ1BQX0ZVTkNfVklTCitfX2dldF9jbGFzc25hbWUoY29uc3QgY2hhciogX19zLCBib29sIF9faWNhc2UpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Cit0eXBlbmFtZSByZWdleF90cmFpdHM8X0NoYXJUPjo6Y2hhcl9jbGFzc190eXBlCityZWdleF90cmFpdHM8X0NoYXJUPjo6X19sb29rdXBfY2xhc3NuYW1lKF9Gb3J3YXJkSXRlcmF0b3IgX19mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2ljYXNlLCBjaGFyKSBjb25zdAoreworICAgIHN0cmluZ190eXBlIF9fcyhfX2YsIF9fbCk7CisgICAgX19jdF8tPnRvbG93ZXIoJl9fc1swXSwgJl9fc1swXSArIF9fcy5zaXplKCkpOworICAgIHJldHVybiBfX2dldF9jbGFzc25hbWUoX19zLmNfc3RyKCksIF9faWNhc2UpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Cit0eXBlbmFtZSByZWdleF90cmFpdHM8X0NoYXJUPjo6Y2hhcl9jbGFzc190eXBlCityZWdleF90cmFpdHM8X0NoYXJUPjo6X19sb29rdXBfY2xhc3NuYW1lKF9Gb3J3YXJkSXRlcmF0b3IgX19mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2ljYXNlLCB3Y2hhcl90KSBjb25zdAoreworICAgIHN0cmluZ190eXBlIF9fcyhfX2YsIF9fbCk7CisgICAgX19jdF8tPnRvbG93ZXIoJl9fc1swXSwgJl9fc1swXSArIF9fcy5zaXplKCkpOworICAgIHN0cmluZyBfX247CisgICAgX19uLnJlc2VydmUoX19zLnNpemUoKSk7CisgICAgZm9yICh0eXBlbmFtZSBzdHJpbmdfdHlwZTo6Y29uc3RfaXRlcmF0b3IgX19pID0gX19zLmJlZ2luKCksIF9fZSA9IF9fcy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pICE9IF9fZTsgKytfX2kpCisgICAgeworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KCpfX2kpID49IDEyNykKKyAgICAgICAgICAgIHJldHVybiBjaGFyX2NsYXNzX3R5cGUoKTsKKyAgICAgICAgX19uLnB1c2hfYmFjayhjaGFyKCpfX2kpKTsKKyAgICB9CisgICAgcmV0dXJuIF9fZ2V0X2NsYXNzbmFtZShfX24uY19zdHIoKSwgX19pY2FzZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+Citib29sCityZWdleF90cmFpdHM8X0NoYXJUPjo6aXNjdHlwZShjaGFyX3R5cGUgX19jLCBjaGFyX2NsYXNzX3R5cGUgX19tKSBjb25zdAoreworICAgIGlmIChfX2N0Xy0+aXMoX19tLCBfX2MpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gKF9fYyA9PSAnXycgJiYgKF9fbSAmIF9fcmVnZXhfd29yZCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgoraW50CityZWdleF90cmFpdHM8X0NoYXJUPjo6X19yZWdleF90cmFpdHNfdmFsdWUodW5zaWduZWQgY2hhciBfX2NoLCBpbnQgX19yYWRpeCkKK3sKKyAgICBpZiAoKF9fY2ggJiAweEY4dSkgPT0gMHgzMCkgIC8vICcwJyA8PSBfX2NoICYmIF9fY2ggPD0gJzcnCisgICAgICAgIHJldHVybiBfX2NoIC0gJzAnOworICAgIGlmIChfX3JhZGl4ICE9IDgpCisgICAgeworICAgICAgICBpZiAoKF9fY2ggJiAweEZFdSkgPT0gMHgzOCkgIC8vICc4JyA8PSBfX2NoICYmIF9fY2ggPD0gJzknCisgICAgICAgICAgICByZXR1cm4gX19jaCAtICcwJzsKKyAgICAgICAgaWYgKF9fcmFkaXggPT0gMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fY2ggfD0gMHgyMDsgIC8vIHRvbG93ZXIKKyAgICAgICAgICAgIGlmICgnYScgPD0gX19jaCAmJiBfX2NoIDw9ICdmJykKKyAgICAgICAgICAgICAgICByZXR1cm4gX19jaCAtICgnYScgLSAxMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgoraW5saW5lCitpbnQKK3JlZ2V4X3RyYWl0czxfQ2hhclQ+OjpfX3JlZ2V4X3RyYWl0c192YWx1ZSh3Y2hhcl90IF9fY2gsIGludCBfX3JhZGl4KSBjb25zdAoreworICAgIHJldHVybiBfX3JlZ2V4X3RyYWl0c192YWx1ZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihfX2N0Xy0+bmFycm93KF9fY2gsIGNoYXJfdHlwZSgpKSksIF9fcmFkaXgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPiBjbGFzcyBfX25vZGU7CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPiBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBzdWJfbWF0Y2g7CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLAorICAgICAgICAgIGNsYXNzIF9BbGxvY2F0b3IgPSBhbGxvY2F0b3I8c3ViX21hdGNoPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+ID4gPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgbWF0Y2hfcmVzdWx0czsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3N0cnVjdCBfX3N0YXRlCit7CisgICAgZW51bQorICAgIHsKKyAgICAgICAgX19lbmRfc3RhdGUgPSAtMTAwMCwKKyAgICAgICAgX19jb25zdW1lX2lucHV0LCAgLy8gLTk5OQorICAgICAgICBfX2JlZ2luX21hcmtlZF9leHByLCAvLyAtOTk4CisgICAgICAgIF9fZW5kX21hcmtlZF9leHByLCAgIC8vIC05OTcKKyAgICAgICAgX19wb3Bfc3RhdGUsICAgICAgICAgICAvLyAtOTk2CisgICAgICAgIF9fYWNjZXB0X2FuZF9jb25zdW1lLCAgLy8gLTk5NQorICAgICAgICBfX2FjY2VwdF9idXRfbm90X2NvbnN1bWUsICAvLyAtOTk0CisgICAgICAgIF9fcmVqZWN0LCAgICAgICAgICAgICAgICAgIC8vIC05OTMKKyAgICAgICAgX19zcGxpdCwKKyAgICAgICAgX19yZXBlYXQKKyAgICB9OworCisgICAgaW50IF9fZG9fOworICAgIGNvbnN0IF9DaGFyVCogX19maXJzdF87CisgICAgY29uc3QgX0NoYXJUKiBfX2N1cnJlbnRfOworICAgIGNvbnN0IF9DaGFyVCogX19sYXN0XzsKKyAgICB2ZWN0b3I8c3ViX21hdGNoPGNvbnN0IF9DaGFyVCo+ID4gX19zdWJfbWF0Y2hlc187CisgICAgdmVjdG9yPHBhaXI8c2l6ZV90LCBjb25zdCBfQ2hhclQqPiA+IF9fbG9vcF9kYXRhXzsKKyAgICBjb25zdCBfX25vZGU8X0NoYXJUPiogX19ub2RlXzsKKyAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzXzsKKyAgICBib29sIF9fYXRfZmlyc3RfOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fc3RhdGUoKQorICAgICAgICA6IF9fZG9fKDApLCBfX2ZpcnN0XyhudWxscHRyKSwgX19jdXJyZW50XyhudWxscHRyKSwgX19sYXN0XyhudWxscHRyKSwKKyAgICAgICAgICBfX25vZGVfKG51bGxwdHIpLCBfX2ZsYWdzXygpIHt9Cit9OworCisvLyBfX25vZGUKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2NsYXNzIF9fbm9kZQoreworICAgIF9fbm9kZShjb25zdCBfX25vZGUmKTsKKyAgICBfX25vZGUmIG9wZXJhdG9yPShjb25zdCBfX25vZGUmKTsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9WU1REOjpfX3N0YXRlPF9DaGFyVD4gX19zdGF0ZTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX25vZGUoKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2aXJ0dWFsIH5fX25vZGUoKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZpcnR1YWwgdm9pZCBfX2V4ZWMoX19zdGF0ZSYpIGNvbnN0IHt9OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2aXJ0dWFsIHZvaWQgX19leGVjX3NwbGl0KGJvb2wsIF9fc3RhdGUmKSBjb25zdCB7fTsKK307CisKKy8vIF9fZW5kX3N0YXRlCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitjbGFzcyBfX2VuZF9zdGF0ZQorICAgIDogcHVibGljIF9fbm9kZTxfQ2hhclQ+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfVlNURDo6X19zdGF0ZTxfQ2hhclQ+IF9fc3RhdGU7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19lbmRfc3RhdGUoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIF9fZXhlYyhfX3N0YXRlJikgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordm9pZAorX19lbmRfc3RhdGU8X0NoYXJUPjo6X19leGVjKF9fc3RhdGUmIF9fcykgY29uc3QKK3sKKyAgICBfX3MuX19kb18gPSBfX3N0YXRlOjpfX2VuZF9zdGF0ZTsKK30KKworLy8gX19oYXNfb25lX3N0YXRlCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitjbGFzcyBfX2hhc19vbmVfc3RhdGUKKyAgICA6IHB1YmxpYyBfX25vZGU8X0NoYXJUPgoreworICAgIF9fbm9kZTxfQ2hhclQ+KiBfX2ZpcnN0XzsKKworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2hhc19vbmVfc3RhdGUoX19ub2RlPF9DaGFyVD4qIF9fcykKKyAgICAgICAgOiBfX2ZpcnN0XyhfX3MpIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19ub2RlPF9DaGFyVD4qICBmaXJzdCgpIGNvbnN0IHtyZXR1cm4gX19maXJzdF87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX25vZGU8X0NoYXJUPiomIGZpcnN0KCkgICAgICAge3JldHVybiBfX2ZpcnN0Xzt9Cit9OworCisvLyBfX293bnNfb25lX3N0YXRlCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitjbGFzcyBfX293bnNfb25lX3N0YXRlCisgICAgOiBwdWJsaWMgX19oYXNfb25lX3N0YXRlPF9DaGFyVD4KK3sKKyAgICB0eXBlZGVmIF9faGFzX29uZV9zdGF0ZTxfQ2hhclQ+IGJhc2U7CisKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19vd25zX29uZV9zdGF0ZShfX25vZGU8X0NoYXJUPiogX19zKQorICAgICAgICA6IGJhc2UoX19zKSB7fQorCisgICAgdmlydHVhbCB+X19vd25zX29uZV9zdGF0ZSgpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK19fb3duc19vbmVfc3RhdGU8X0NoYXJUPjo6fl9fb3duc19vbmVfc3RhdGUoKQoreworICAgIGRlbGV0ZSB0aGlzLT5maXJzdCgpOworfQorCisvLyBfX2VtcHR5X3N0YXRlCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitjbGFzcyBfX2VtcHR5X3N0YXRlCisgICAgOiBwdWJsaWMgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+Cit7CisgICAgdHlwZWRlZiBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4gYmFzZTsKKworcHVibGljOgorICAgIHR5cGVkZWYgX1ZTVEQ6Ol9fc3RhdGU8X0NoYXJUPiBfX3N0YXRlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9fZW1wdHlfc3RhdGUoX19ub2RlPF9DaGFyVD4qIF9fcykKKyAgICAgICAgOiBiYXNlKF9fcykge30KKworICAgIHZpcnR1YWwgdm9pZCBfX2V4ZWMoX19zdGF0ZSYpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3ZvaWQKK19fZW1wdHlfc3RhdGU8X0NoYXJUPjo6X19leGVjKF9fc3RhdGUmIF9fcykgY29uc3QKK3sKKyAgICBfX3MuX19kb18gPSBfX3N0YXRlOjpfX2FjY2VwdF9idXRfbm90X2NvbnN1bWU7CisgICAgX19zLl9fbm9kZV8gPSB0aGlzLT5maXJzdCgpOworfQorCisvLyBfX2VtcHR5X25vbl9vd25fc3RhdGUKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2NsYXNzIF9fZW1wdHlfbm9uX293bl9zdGF0ZQorICAgIDogcHVibGljIF9faGFzX29uZV9zdGF0ZTxfQ2hhclQ+Cit7CisgICAgdHlwZWRlZiBfX2hhc19vbmVfc3RhdGU8X0NoYXJUPiBiYXNlOworCitwdWJsaWM6CisgICAgdHlwZWRlZiBfVlNURDo6X19zdGF0ZTxfQ2hhclQ+IF9fc3RhdGU7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19lbXB0eV9ub25fb3duX3N0YXRlKF9fbm9kZTxfQ2hhclQ+KiBfX3MpCisgICAgICAgIDogYmFzZShfX3MpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgX19leGVjKF9fc3RhdGUmKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+Cit2b2lkCitfX2VtcHR5X25vbl9vd25fc3RhdGU8X0NoYXJUPjo6X19leGVjKF9fc3RhdGUmIF9fcykgY29uc3QKK3sKKyAgICBfX3MuX19kb18gPSBfX3N0YXRlOjpfX2FjY2VwdF9idXRfbm90X2NvbnN1bWU7CisgICAgX19zLl9fbm9kZV8gPSB0aGlzLT5maXJzdCgpOworfQorCisvLyBfX3JlcGVhdF9vbmVfbG9vcAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorY2xhc3MgX19yZXBlYXRfb25lX2xvb3AKKyAgICA6IHB1YmxpYyBfX2hhc19vbmVfc3RhdGU8X0NoYXJUPgoreworICAgIHR5cGVkZWYgX19oYXNfb25lX3N0YXRlPF9DaGFyVD4gYmFzZTsKKworcHVibGljOgorICAgIHR5cGVkZWYgX1ZTVEQ6Ol9fc3RhdGU8X0NoYXJUPiBfX3N0YXRlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9fcmVwZWF0X29uZV9sb29wKF9fbm9kZTxfQ2hhclQ+KiBfX3MpCisgICAgICAgIDogYmFzZShfX3MpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgX19leGVjKF9fc3RhdGUmKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+Cit2b2lkCitfX3JlcGVhdF9vbmVfbG9vcDxfQ2hhclQ+OjpfX2V4ZWMoX19zdGF0ZSYgX19zKSBjb25zdAoreworICAgIF9fcy5fX2RvXyA9IF9fc3RhdGU6Ol9fcmVwZWF0OworICAgIF9fcy5fX25vZGVfID0gdGhpcy0+Zmlyc3QoKTsKK30KKworLy8gX19vd25zX3R3b19zdGF0ZXMKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2NsYXNzIF9fb3duc190d29fc3RhdGVzCisgICAgOiBwdWJsaWMgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+Cit7CisgICAgdHlwZWRlZiBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4gYmFzZTsKKworICAgIGJhc2UqIF9fc2Vjb25kXzsKKworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX293bnNfdHdvX3N0YXRlcyhfX25vZGU8X0NoYXJUPiogX19zMSwgYmFzZSogX19zMikKKyAgICAgICAgOiBiYXNlKF9fczEpLCBfX3NlY29uZF8oX19zMikge30KKworICAgIHZpcnR1YWwgfl9fb3duc190d29fc3RhdGVzKCk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzZSogIHNlY29uZCgpIGNvbnN0IHtyZXR1cm4gX19zZWNvbmRfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzZSomIHNlY29uZCgpICAgICAgIHtyZXR1cm4gX19zZWNvbmRfO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitfX293bnNfdHdvX3N0YXRlczxfQ2hhclQ+Ojp+X19vd25zX3R3b19zdGF0ZXMoKQoreworICAgIGRlbGV0ZSBfX3NlY29uZF87Cit9CisKKy8vIF9fbG9vcAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorY2xhc3MgX19sb29wCisgICAgOiBwdWJsaWMgX19vd25zX3R3b19zdGF0ZXM8X0NoYXJUPgoreworICAgIHR5cGVkZWYgX19vd25zX3R3b19zdGF0ZXM8X0NoYXJUPiBiYXNlOworCisgICAgc2l6ZV90IF9fbWluXzsKKyAgICBzaXplX3QgX19tYXhfOworICAgIHVuc2lnbmVkIF9fbG9vcF9pZF87CisgICAgdW5zaWduZWQgX19tZXhwX2JlZ2luXzsKKyAgICB1bnNpZ25lZCBfX21leHBfZW5kXzsKKyAgICBib29sIF9fZ3JlZWR5XzsKKworcHVibGljOgorICAgIHR5cGVkZWYgX1ZTVEQ6Ol9fc3RhdGU8X0NoYXJUPiBfX3N0YXRlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9fbG9vcCh1bnNpZ25lZCBfX2xvb3BfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbm9kZTxfQ2hhclQ+KiBfX3MxLCBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4qIF9fczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9fbWV4cF9iZWdpbiwgdW5zaWduZWQgX19tZXhwX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2dyZWVkeSA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX21pbiA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX21heCA9IG51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpKQorICAgICAgICA6IGJhc2UoX19zMSwgX19zMiksIF9fbWluXyhfX21pbiksIF9fbWF4XyhfX21heCksIF9fbG9vcF9pZF8oX19sb29wX2lkKSwKKyAgICAgICAgICBfX21leHBfYmVnaW5fKF9fbWV4cF9iZWdpbiksIF9fbWV4cF9lbmRfKF9fbWV4cF9lbmQpLAorICAgICAgICAgIF9fZ3JlZWR5XyhfX2dyZWVkeSkge30KKworICAgIHZpcnR1YWwgdm9pZCBfX2V4ZWMoX19zdGF0ZSYgX19zKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgX19leGVjX3NwbGl0KGJvb2wgX19zZWNvbmQsIF9fc3RhdGUmIF9fcykgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19pbml0X3JlcGVhdChfX3N0YXRlJiBfX3MpIGNvbnN0CisgICAgeworICAgICAgICBfX3MuX19sb29wX2RhdGFfW19fbG9vcF9pZF9dLnNlY29uZCA9IF9fcy5fX2N1cnJlbnRfOworICAgICAgICBmb3IgKHNpemVfdCBfX2kgPSBfX21leHBfYmVnaW5fLTE7IF9faSAhPSBfX21leHBfZW5kXy0xOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgICAgX19zLl9fc3ViX21hdGNoZXNfW19faV0uZmlyc3QgPSBfX3MuX19sYXN0XzsKKyAgICAgICAgICAgIF9fcy5fX3N1Yl9tYXRjaGVzX1tfX2ldLnNlY29uZCA9IF9fcy5fX2xhc3RfOworICAgICAgICAgICAgX19zLl9fc3ViX21hdGNoZXNfW19faV0ubWF0Y2hlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3ZvaWQKK19fbG9vcDxfQ2hhclQ+OjpfX2V4ZWMoX19zdGF0ZSYgX19zKSBjb25zdAoreworICAgIGlmIChfX3MuX19kb18gPT0gX19zdGF0ZTo6X19yZXBlYXQpCisgICAgeworICAgICAgICBib29sIF9fZG9fcmVwZWF0ID0gKytfX3MuX19sb29wX2RhdGFfW19fbG9vcF9pZF9dLmZpcnN0IDwgX19tYXhfOworICAgICAgICBib29sIF9fZG9fYWx0ID0gX19zLl9fbG9vcF9kYXRhX1tfX2xvb3BfaWRfXS5maXJzdCA+PSBfX21pbl87CisgICAgICAgIGlmIChfX2RvX3JlcGVhdCAmJiBfX2RvX2FsdCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcy5fX2xvb3BfZGF0YV9bX19sb29wX2lkX10uc2Vjb25kID09IF9fcy5fX2N1cnJlbnRfKQorICAgICAgICAgICAgX19kb19yZXBlYXQgPSBmYWxzZTsKKyAgICAgICAgaWYgKF9fZG9fcmVwZWF0ICYmIF9fZG9fYWx0KQorICAgICAgICAgICAgX19zLl9fZG9fID0gX19zdGF0ZTo6X19zcGxpdDsKKyAgICAgICAgZWxzZSBpZiAoX19kb19yZXBlYXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fcy5fX2RvXyA9IF9fc3RhdGU6Ol9fYWNjZXB0X2J1dF9ub3RfY29uc3VtZTsKKyAgICAgICAgICAgIF9fcy5fX25vZGVfID0gdGhpcy0+Zmlyc3QoKTsKKyAgICAgICAgICAgIF9faW5pdF9yZXBlYXQoX19zKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fcy5fX2RvXyA9IF9fc3RhdGU6Ol9fYWNjZXB0X2J1dF9ub3RfY29uc3VtZTsKKyAgICAgICAgICAgIF9fcy5fX25vZGVfID0gdGhpcy0+c2Vjb25kKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX19zLl9fbG9vcF9kYXRhX1tfX2xvb3BfaWRfXS5maXJzdCA9IDA7CisgICAgICAgIGJvb2wgX19kb19yZXBlYXQgPSAwIDwgX19tYXhfOworICAgICAgICBib29sIF9fZG9fYWx0ID0gMCA+PSBfX21pbl87CisgICAgICAgIGlmIChfX2RvX3JlcGVhdCAmJiBfX2RvX2FsdCkKKyAgICAgICAgICAgIF9fcy5fX2RvXyA9IF9fc3RhdGU6Ol9fc3BsaXQ7CisgICAgICAgIGVsc2UgaWYgKF9fZG9fcmVwZWF0KQorICAgICAgICB7CisgICAgICAgICAgICBfX3MuX19kb18gPSBfX3N0YXRlOjpfX2FjY2VwdF9idXRfbm90X2NvbnN1bWU7CisgICAgICAgICAgICBfX3MuX19ub2RlXyA9IHRoaXMtPmZpcnN0KCk7CisgICAgICAgICAgICBfX2luaXRfcmVwZWF0KF9fcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfX3MuX19kb18gPSBfX3N0YXRlOjpfX2FjY2VwdF9idXRfbm90X2NvbnN1bWU7CisgICAgICAgICAgICBfX3MuX19ub2RlXyA9IHRoaXMtPnNlY29uZCgpOworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordm9pZAorX19sb29wPF9DaGFyVD46Ol9fZXhlY19zcGxpdChib29sIF9fc2Vjb25kLCBfX3N0YXRlJiBfX3MpIGNvbnN0Cit7CisgICAgX19zLl9fZG9fID0gX19zdGF0ZTo6X19hY2NlcHRfYnV0X25vdF9jb25zdW1lOworICAgIGlmIChfX2dyZWVkeV8gIT0gX19zZWNvbmQpCisgICAgeworICAgICAgICBfX3MuX19ub2RlXyA9IHRoaXMtPmZpcnN0KCk7CisgICAgICAgIF9faW5pdF9yZXBlYXQoX19zKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBfX3MuX19ub2RlXyA9IHRoaXMtPnNlY29uZCgpOworfQorCisvLyBfX2FsdGVybmF0ZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorY2xhc3MgX19hbHRlcm5hdGUKKyAgICA6IHB1YmxpYyBfX293bnNfdHdvX3N0YXRlczxfQ2hhclQ+Cit7CisgICAgdHlwZWRlZiBfX293bnNfdHdvX3N0YXRlczxfQ2hhclQ+IGJhc2U7CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9WU1REOjpfX3N0YXRlPF9DaGFyVD4gX19zdGF0ZTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2FsdGVybmF0ZShfX293bnNfb25lX3N0YXRlPF9DaGFyVD4qIF9fczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+KiBfX3MyKQorICAgICAgICA6IGJhc2UoX19zMSwgX19zMikge30KKworICAgIHZpcnR1YWwgdm9pZCBfX2V4ZWMoX19zdGF0ZSYgX19zKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgX19leGVjX3NwbGl0KGJvb2wgX19zZWNvbmQsIF9fc3RhdGUmIF9fcykgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordm9pZAorX19hbHRlcm5hdGU8X0NoYXJUPjo6X19leGVjKF9fc3RhdGUmIF9fcykgY29uc3QKK3sKKyAgICBfX3MuX19kb18gPSBfX3N0YXRlOjpfX3NwbGl0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordm9pZAorX19hbHRlcm5hdGU8X0NoYXJUPjo6X19leGVjX3NwbGl0KGJvb2wgX19zZWNvbmQsIF9fc3RhdGUmIF9fcykgY29uc3QKK3sKKyAgICBfX3MuX19kb18gPSBfX3N0YXRlOjpfX2FjY2VwdF9idXRfbm90X2NvbnN1bWU7CisgICAgaWYgKF9fc2Vjb25kKQorICAgICAgICBfX3MuX19ub2RlXyA9IHRoaXMtPnNlY29uZCgpOworICAgIGVsc2UKKyAgICAgICAgX19zLl9fbm9kZV8gPSB0aGlzLT5maXJzdCgpOworfQorCisvLyBfX2JlZ2luX21hcmtlZF9zdWJleHByZXNzaW9uCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitjbGFzcyBfX2JlZ2luX21hcmtlZF9zdWJleHByZXNzaW9uCisgICAgOiBwdWJsaWMgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+Cit7CisgICAgdHlwZWRlZiBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4gYmFzZTsKKworICAgIHVuc2lnbmVkIF9fbWV4cF87CitwdWJsaWM6CisgICAgdHlwZWRlZiBfVlNURDo6X19zdGF0ZTxfQ2hhclQ+IF9fc3RhdGU7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19iZWdpbl9tYXJrZWRfc3ViZXhwcmVzc2lvbih1bnNpZ25lZCBfX21leHAsIF9fbm9kZTxfQ2hhclQ+KiBfX3MpCisgICAgICAgIDogYmFzZShfX3MpLCBfX21leHBfKF9fbWV4cCkge30KKworICAgIHZpcnR1YWwgdm9pZCBfX2V4ZWMoX19zdGF0ZSYpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3ZvaWQKK19fYmVnaW5fbWFya2VkX3N1YmV4cHJlc3Npb248X0NoYXJUPjo6X19leGVjKF9fc3RhdGUmIF9fcykgY29uc3QKK3sKKyAgICBfX3MuX19kb18gPSBfX3N0YXRlOjpfX2FjY2VwdF9idXRfbm90X2NvbnN1bWU7CisgICAgX19zLl9fc3ViX21hdGNoZXNfW19fbWV4cF8tMV0uZmlyc3QgPSBfX3MuX19jdXJyZW50XzsKKyAgICBfX3MuX19ub2RlXyA9IHRoaXMtPmZpcnN0KCk7Cit9CisKKy8vIF9fZW5kX21hcmtlZF9zdWJleHByZXNzaW9uCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitjbGFzcyBfX2VuZF9tYXJrZWRfc3ViZXhwcmVzc2lvbgorICAgIDogcHVibGljIF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPgoreworICAgIHR5cGVkZWYgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+IGJhc2U7CisKKyAgICB1bnNpZ25lZCBfX21leHBfOworcHVibGljOgorICAgIHR5cGVkZWYgX1ZTVEQ6Ol9fc3RhdGU8X0NoYXJUPiBfX3N0YXRlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9fZW5kX21hcmtlZF9zdWJleHByZXNzaW9uKHVuc2lnbmVkIF9fbWV4cCwgX19ub2RlPF9DaGFyVD4qIF9fcykKKyAgICAgICAgOiBiYXNlKF9fcyksIF9fbWV4cF8oX19tZXhwKSB7fQorCisgICAgdmlydHVhbCB2b2lkIF9fZXhlYyhfX3N0YXRlJikgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordm9pZAorX19lbmRfbWFya2VkX3N1YmV4cHJlc3Npb248X0NoYXJUPjo6X19leGVjKF9fc3RhdGUmIF9fcykgY29uc3QKK3sKKyAgICBfX3MuX19kb18gPSBfX3N0YXRlOjpfX2FjY2VwdF9idXRfbm90X2NvbnN1bWU7CisgICAgX19zLl9fc3ViX21hdGNoZXNfW19fbWV4cF8tMV0uc2Vjb25kID0gX19zLl9fY3VycmVudF87CisgICAgX19zLl9fc3ViX21hdGNoZXNfW19fbWV4cF8tMV0ubWF0Y2hlZCA9IHRydWU7CisgICAgX19zLl9fbm9kZV8gPSB0aGlzLT5maXJzdCgpOworfQorCisvLyBfX2JhY2tfcmVmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitjbGFzcyBfX2JhY2tfcmVmCisgICAgOiBwdWJsaWMgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+Cit7CisgICAgdHlwZWRlZiBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4gYmFzZTsKKworICAgIHVuc2lnbmVkIF9fbWV4cF87CitwdWJsaWM6CisgICAgdHlwZWRlZiBfVlNURDo6X19zdGF0ZTxfQ2hhclQ+IF9fc3RhdGU7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19iYWNrX3JlZih1bnNpZ25lZCBfX21leHAsIF9fbm9kZTxfQ2hhclQ+KiBfX3MpCisgICAgICAgIDogYmFzZShfX3MpLCBfX21leHBfKF9fbWV4cCkge30KKworICAgIHZpcnR1YWwgdm9pZCBfX2V4ZWMoX19zdGF0ZSYpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3ZvaWQKK19fYmFja19yZWY8X0NoYXJUPjo6X19leGVjKF9fc3RhdGUmIF9fcykgY29uc3QKK3sKKyAgICBpZiAoX19tZXhwXyA+IF9fcy5fX3N1Yl9tYXRjaGVzXy5zaXplKCkpCisgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjplcnJvcl9iYWNrcmVmPigpOworICAgIHN1Yl9tYXRjaDxjb25zdCBfQ2hhclQqPiYgX19zbSA9IF9fcy5fX3N1Yl9tYXRjaGVzX1tfX21leHBfLTFdOworICAgIGlmIChfX3NtLm1hdGNoZWQpCisgICAgeworICAgICAgICBwdHJkaWZmX3QgX19sZW4gPSBfX3NtLnNlY29uZCAtIF9fc20uZmlyc3Q7CisgICAgICAgIGlmIChfX3MuX19sYXN0XyAtIF9fcy5fX2N1cnJlbnRfID49IF9fbGVuICYmCisgICAgICAgICAgICBfVlNURDo6ZXF1YWwoX19zbS5maXJzdCwgX19zbS5zZWNvbmQsIF9fcy5fX2N1cnJlbnRfKSkKKyAgICAgICAgeworICAgICAgICAgICAgX19zLl9fZG9fID0gX19zdGF0ZTo6X19hY2NlcHRfYnV0X25vdF9jb25zdW1lOworICAgICAgICAgICAgX19zLl9fY3VycmVudF8gKz0gX19sZW47CisgICAgICAgICAgICBfX3MuX19ub2RlXyA9IHRoaXMtPmZpcnN0KCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfX3MuX19kb18gPSBfX3N0YXRlOjpfX3JlamVjdDsKKyAgICAgICAgICAgIF9fcy5fX25vZGVfID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfX3MuX19kb18gPSBfX3N0YXRlOjpfX3JlamVjdDsKKyAgICAgICAgX19zLl9fbm9kZV8gPSBudWxscHRyOworICAgIH0KK30KKworLy8gX19iYWNrX3JlZl9pY2FzZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorY2xhc3MgX19iYWNrX3JlZl9pY2FzZQorICAgIDogcHVibGljIF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPgoreworICAgIHR5cGVkZWYgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+IGJhc2U7CisKKyAgICBfVHJhaXRzIF9fdHJhaXRzXzsKKyAgICB1bnNpZ25lZCBfX21leHBfOworcHVibGljOgorICAgIHR5cGVkZWYgX1ZTVEQ6Ol9fc3RhdGU8X0NoYXJUPiBfX3N0YXRlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9fYmFja19yZWZfaWNhc2UoY29uc3QgX1RyYWl0cyYgX190cmFpdHMsIHVuc2lnbmVkIF9fbWV4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbm9kZTxfQ2hhclQ+KiBfX3MpCisgICAgICAgIDogYmFzZShfX3MpLCBfX3RyYWl0c18oX190cmFpdHMpLCBfX21leHBfKF9fbWV4cCkge30KKworICAgIHZpcnR1YWwgdm9pZCBfX2V4ZWMoX19zdGF0ZSYpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQKK19fYmFja19yZWZfaWNhc2U8X0NoYXJULCBfVHJhaXRzPjo6X19leGVjKF9fc3RhdGUmIF9fcykgY29uc3QKK3sKKyAgICBzdWJfbWF0Y2g8Y29uc3QgX0NoYXJUKj4mIF9fc20gPSBfX3MuX19zdWJfbWF0Y2hlc19bX19tZXhwXy0xXTsKKyAgICBpZiAoX19zbS5tYXRjaGVkKQorICAgIHsKKyAgICAgICAgcHRyZGlmZl90IF9fbGVuID0gX19zbS5zZWNvbmQgLSBfX3NtLmZpcnN0OworICAgICAgICBpZiAoX19zLl9fbGFzdF8gLSBfX3MuX19jdXJyZW50XyA+PSBfX2xlbikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChwdHJkaWZmX3QgX19pID0gMDsgX19pIDwgX19sZW47ICsrX19pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfX3RyYWl0c18udHJhbnNsYXRlX25vY2FzZShfX3NtLmZpcnN0W19faV0pICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdHJhaXRzXy50cmFuc2xhdGVfbm9jYXNlKF9fcy5fX2N1cnJlbnRfW19faV0pKQorICAgICAgICAgICAgICAgICAgICBnb3RvIF9fbm90X2VxdWFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19zLl9fZG9fID0gX19zdGF0ZTo6X19hY2NlcHRfYnV0X25vdF9jb25zdW1lOworICAgICAgICAgICAgX19zLl9fY3VycmVudF8gKz0gX19sZW47CisgICAgICAgICAgICBfX3MuX19ub2RlXyA9IHRoaXMtPmZpcnN0KCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfX3MuX19kb18gPSBfX3N0YXRlOjpfX3JlamVjdDsKKyAgICAgICAgICAgIF9fcy5fX25vZGVfID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworX19ub3RfZXF1YWw6CisgICAgICAgIF9fcy5fX2RvXyA9IF9fc3RhdGU6Ol9fcmVqZWN0OworICAgICAgICBfX3MuX19ub2RlXyA9IG51bGxwdHI7CisgICAgfQorfQorCisvLyBfX2JhY2tfcmVmX2NvbGxhdGUKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIF9fYmFja19yZWZfY29sbGF0ZQorICAgIDogcHVibGljIF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPgoreworICAgIHR5cGVkZWYgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+IGJhc2U7CisKKyAgICBfVHJhaXRzIF9fdHJhaXRzXzsKKyAgICB1bnNpZ25lZCBfX21leHBfOworcHVibGljOgorICAgIHR5cGVkZWYgX1ZTVEQ6Ol9fc3RhdGU8X0NoYXJUPiBfX3N0YXRlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9fYmFja19yZWZfY29sbGF0ZShjb25zdCBfVHJhaXRzJiBfX3RyYWl0cywgdW5zaWduZWQgX19tZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlPF9DaGFyVD4qIF9fcykKKyAgICAgICAgOiBiYXNlKF9fcyksIF9fdHJhaXRzXyhfX3RyYWl0cyksIF9fbWV4cF8oX19tZXhwKSB7fQorCisgICAgdmlydHVhbCB2b2lkIF9fZXhlYyhfX3N0YXRlJikgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZAorX19iYWNrX3JlZl9jb2xsYXRlPF9DaGFyVCwgX1RyYWl0cz46Ol9fZXhlYyhfX3N0YXRlJiBfX3MpIGNvbnN0Cit7CisgICAgc3ViX21hdGNoPGNvbnN0IF9DaGFyVCo+JiBfX3NtID0gX19zLl9fc3ViX21hdGNoZXNfW19fbWV4cF8tMV07CisgICAgaWYgKF9fc20ubWF0Y2hlZCkKKyAgICB7CisgICAgICAgIHB0cmRpZmZfdCBfX2xlbiA9IF9fc20uc2Vjb25kIC0gX19zbS5maXJzdDsKKyAgICAgICAgaWYgKF9fcy5fX2xhc3RfIC0gX19zLl9fY3VycmVudF8gPj0gX19sZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAocHRyZGlmZl90IF9faSA9IDA7IF9faSA8IF9fbGVuOyArK19faSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX190cmFpdHNfLnRyYW5zbGF0ZShfX3NtLmZpcnN0W19faV0pICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RyYWl0c18udHJhbnNsYXRlKF9fcy5fX2N1cnJlbnRfW19faV0pKQorICAgICAgICAgICAgICAgICAgICBnb3RvIF9fbm90X2VxdWFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19zLl9fZG9fID0gX19zdGF0ZTo6X19hY2NlcHRfYnV0X25vdF9jb25zdW1lOworICAgICAgICAgICAgX19zLl9fY3VycmVudF8gKz0gX19sZW47CisgICAgICAgICAgICBfX3MuX19ub2RlXyA9IHRoaXMtPmZpcnN0KCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfX3MuX19kb18gPSBfX3N0YXRlOjpfX3JlamVjdDsKKyAgICAgICAgICAgIF9fcy5fX25vZGVfID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworX19ub3RfZXF1YWw6CisgICAgICAgIF9fcy5fX2RvXyA9IF9fc3RhdGU6Ol9fcmVqZWN0OworICAgICAgICBfX3MuX19ub2RlXyA9IG51bGxwdHI7CisgICAgfQorfQorCisvLyBfX3dvcmRfYm91bmRhcnkKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIF9fd29yZF9ib3VuZGFyeQorICAgIDogcHVibGljIF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPgoreworICAgIHR5cGVkZWYgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+IGJhc2U7CisKKyAgICBfVHJhaXRzIF9fdHJhaXRzXzsKKyAgICBib29sIF9faW52ZXJ0XzsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9WU1REOjpfX3N0YXRlPF9DaGFyVD4gX19zdGF0ZTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX3dvcmRfYm91bmRhcnkoY29uc3QgX1RyYWl0cyYgX190cmFpdHMsIGJvb2wgX19pbnZlcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbm9kZTxfQ2hhclQ+KiBfX3MpCisgICAgICAgIDogYmFzZShfX3MpLCBfX3RyYWl0c18oX190cmFpdHMpLCBfX2ludmVydF8oX19pbnZlcnQpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgX19leGVjKF9fc3RhdGUmKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitfX3dvcmRfYm91bmRhcnk8X0NoYXJULCBfVHJhaXRzPjo6X19leGVjKF9fc3RhdGUmIF9fcykgY29uc3QKK3sKKyAgICBib29sIF9faXNfd29yZF9iID0gZmFsc2U7CisgICAgaWYgKF9fcy5fX2ZpcnN0XyAhPSBfX3MuX19sYXN0XykKKyAgICB7CisgICAgICAgIGlmIChfX3MuX19jdXJyZW50XyA9PSBfX3MuX19sYXN0XykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCEoX19zLl9fZmxhZ3NfICYgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9ub3RfZW93KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfQ2hhclQgX19jID0gX19zLl9fY3VycmVudF9bLTFdOworICAgICAgICAgICAgICAgIF9faXNfd29yZF9iID0gX19jID09ICdfJyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190cmFpdHNfLmlzY3R5cGUoX19jLCBjdHlwZV9iYXNlOjphbG51bSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoX19zLl9fY3VycmVudF8gPT0gX19zLl9fZmlyc3RfICYmCisgICAgICAgICAgICAgICAgIShfX3MuX19mbGFnc18gJiByZWdleF9jb25zdGFudHM6Om1hdGNoX3ByZXZfYXZhaWwpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIShfX3MuX19mbGFnc18gJiByZWdleF9jb25zdGFudHM6Om1hdGNoX25vdF9ib3cpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9DaGFyVCBfX2MgPSAqX19zLl9fY3VycmVudF87CisgICAgICAgICAgICAgICAgX19pc193b3JkX2IgPSBfX2MgPT0gJ18nIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RyYWl0c18uaXNjdHlwZShfX2MsIGN0eXBlX2Jhc2U6OmFsbnVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9DaGFyVCBfX2MxID0gX19zLl9fY3VycmVudF9bLTFdOworICAgICAgICAgICAgX0NoYXJUIF9fYzIgPSAqX19zLl9fY3VycmVudF87CisgICAgICAgICAgICBib29sIF9faXNfYzFfYiA9IF9fYzEgPT0gJ18nIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdHJhaXRzXy5pc2N0eXBlKF9fYzEsIGN0eXBlX2Jhc2U6OmFsbnVtKTsKKyAgICAgICAgICAgIGJvb2wgX19pc19jMl9iID0gX19jMiA9PSAnXycgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190cmFpdHNfLmlzY3R5cGUoX19jMiwgY3R5cGVfYmFzZTo6YWxudW0pOworICAgICAgICAgICAgX19pc193b3JkX2IgPSBfX2lzX2MxX2IgIT0gX19pc19jMl9iOworICAgICAgICB9CisgICAgfQorICAgIGlmIChfX2lzX3dvcmRfYiAhPSBfX2ludmVydF8pCisgICAgeworICAgICAgICBfX3MuX19kb18gPSBfX3N0YXRlOjpfX2FjY2VwdF9idXRfbm90X2NvbnN1bWU7CisgICAgICAgIF9fcy5fX25vZGVfID0gdGhpcy0+Zmlyc3QoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX19zLl9fZG9fID0gX19zdGF0ZTo6X19yZWplY3Q7CisgICAgICAgIF9fcy5fX25vZGVfID0gbnVsbHB0cjsKKyAgICB9Cit9CisKKy8vIF9fbF9hbmNob3IKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2NsYXNzIF9fbF9hbmNob3IKKyAgICA6IHB1YmxpYyBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4KK3sKKyAgICB0eXBlZGVmIF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPiBiYXNlOworCitwdWJsaWM6CisgICAgdHlwZWRlZiBfVlNURDo6X19zdGF0ZTxfQ2hhclQ+IF9fc3RhdGU7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19sX2FuY2hvcihfX25vZGU8X0NoYXJUPiogX19zKQorICAgICAgICA6IGJhc2UoX19zKSB7fQorCisgICAgdmlydHVhbCB2b2lkIF9fZXhlYyhfX3N0YXRlJikgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordm9pZAorX19sX2FuY2hvcjxfQ2hhclQ+OjpfX2V4ZWMoX19zdGF0ZSYgX19zKSBjb25zdAoreworICAgIGlmIChfX3MuX19hdF9maXJzdF8gJiYgX19zLl9fY3VycmVudF8gPT0gX19zLl9fZmlyc3RfICYmCisgICAgICAgICEoX19zLl9fZmxhZ3NfICYgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9ub3RfYm9sKSkKKyAgICB7CisgICAgICAgIF9fcy5fX2RvXyA9IF9fc3RhdGU6Ol9fYWNjZXB0X2J1dF9ub3RfY29uc3VtZTsKKyAgICAgICAgX19zLl9fbm9kZV8gPSB0aGlzLT5maXJzdCgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfX3MuX19kb18gPSBfX3N0YXRlOjpfX3JlamVjdDsKKyAgICAgICAgX19zLl9fbm9kZV8gPSBudWxscHRyOworICAgIH0KK30KKworLy8gX19yX2FuY2hvcgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorY2xhc3MgX19yX2FuY2hvcgorICAgIDogcHVibGljIF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPgoreworICAgIHR5cGVkZWYgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+IGJhc2U7CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9WU1REOjpfX3N0YXRlPF9DaGFyVD4gX19zdGF0ZTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3JfYW5jaG9yKF9fbm9kZTxfQ2hhclQ+KiBfX3MpCisgICAgICAgIDogYmFzZShfX3MpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgX19leGVjKF9fc3RhdGUmKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+Cit2b2lkCitfX3JfYW5jaG9yPF9DaGFyVD46Ol9fZXhlYyhfX3N0YXRlJiBfX3MpIGNvbnN0Cit7CisgICAgaWYgKF9fcy5fX2N1cnJlbnRfID09IF9fcy5fX2xhc3RfICYmCisgICAgICAgICEoX19zLl9fZmxhZ3NfICYgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9ub3RfZW9sKSkKKyAgICB7CisgICAgICAgIF9fcy5fX2RvXyA9IF9fc3RhdGU6Ol9fYWNjZXB0X2J1dF9ub3RfY29uc3VtZTsKKyAgICAgICAgX19zLl9fbm9kZV8gPSB0aGlzLT5maXJzdCgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfX3MuX19kb18gPSBfX3N0YXRlOjpfX3JlamVjdDsKKyAgICAgICAgX19zLl9fbm9kZV8gPSBudWxscHRyOworICAgIH0KK30KKworLy8gX19tYXRjaF9hbnkKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2NsYXNzIF9fbWF0Y2hfYW55CisgICAgOiBwdWJsaWMgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+Cit7CisgICAgdHlwZWRlZiBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4gYmFzZTsKKworcHVibGljOgorICAgIHR5cGVkZWYgX1ZTVEQ6Ol9fc3RhdGU8X0NoYXJUPiBfX3N0YXRlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fbWF0Y2hfYW55KF9fbm9kZTxfQ2hhclQ+KiBfX3MpCisgICAgICAgIDogYmFzZShfX3MpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgX19leGVjKF9fc3RhdGUmKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+Cit2b2lkCitfX21hdGNoX2FueTxfQ2hhclQ+OjpfX2V4ZWMoX19zdGF0ZSYgX19zKSBjb25zdAoreworICAgIGlmIChfX3MuX19jdXJyZW50XyAhPSBfX3MuX19sYXN0XyAmJiAqX19zLl9fY3VycmVudF8gIT0gMCkKKyAgICB7CisgICAgICAgIF9fcy5fX2RvXyA9IF9fc3RhdGU6Ol9fYWNjZXB0X2FuZF9jb25zdW1lOworICAgICAgICArK19fcy5fX2N1cnJlbnRfOworICAgICAgICBfX3MuX19ub2RlXyA9IHRoaXMtPmZpcnN0KCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIF9fcy5fX2RvXyA9IF9fc3RhdGU6Ol9fcmVqZWN0OworICAgICAgICBfX3MuX19ub2RlXyA9IG51bGxwdHI7CisgICAgfQorfQorCisvLyBfX21hdGNoX2FueV9idXRfbmV3bGluZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorY2xhc3MgX19tYXRjaF9hbnlfYnV0X25ld2xpbmUKKyAgICA6IHB1YmxpYyBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4KK3sKKyAgICB0eXBlZGVmIF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPiBiYXNlOworCitwdWJsaWM6CisgICAgdHlwZWRlZiBfVlNURDo6X19zdGF0ZTxfQ2hhclQ+IF9fc3RhdGU7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19tYXRjaF9hbnlfYnV0X25ld2xpbmUoX19ub2RlPF9DaGFyVD4qIF9fcykKKyAgICAgICAgOiBiYXNlKF9fcykge30KKworICAgIHZpcnR1YWwgdm9pZCBfX2V4ZWMoX19zdGF0ZSYpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPD4gX0xJQkNQUF9GVU5DX1ZJUyB2b2lkIF9fbWF0Y2hfYW55X2J1dF9uZXdsaW5lPGNoYXI+OjpfX2V4ZWMoX19zdGF0ZSYpIGNvbnN0OwordGVtcGxhdGUgPD4gX0xJQkNQUF9GVU5DX1ZJUyB2b2lkIF9fbWF0Y2hfYW55X2J1dF9uZXdsaW5lPHdjaGFyX3Q+OjpfX2V4ZWMoX19zdGF0ZSYpIGNvbnN0OworCisvLyBfX21hdGNoX2NoYXIKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK2NsYXNzIF9fbWF0Y2hfY2hhcgorICAgIDogcHVibGljIF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPgoreworICAgIHR5cGVkZWYgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+IGJhc2U7CisKKyAgICBfQ2hhclQgX19jXzsKKworICAgIF9fbWF0Y2hfY2hhcihjb25zdCBfX21hdGNoX2NoYXImKTsKKyAgICBfX21hdGNoX2NoYXImIG9wZXJhdG9yPShjb25zdCBfX21hdGNoX2NoYXImKTsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9WU1REOjpfX3N0YXRlPF9DaGFyVD4gX19zdGF0ZTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX21hdGNoX2NoYXIoX0NoYXJUIF9fYywgX19ub2RlPF9DaGFyVD4qIF9fcykKKyAgICAgICAgOiBiYXNlKF9fcyksIF9fY18oX19jKSB7fQorCisgICAgdmlydHVhbCB2b2lkIF9fZXhlYyhfX3N0YXRlJikgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgordm9pZAorX19tYXRjaF9jaGFyPF9DaGFyVD46Ol9fZXhlYyhfX3N0YXRlJiBfX3MpIGNvbnN0Cit7CisgICAgaWYgKF9fcy5fX2N1cnJlbnRfICE9IF9fcy5fX2xhc3RfICYmICpfX3MuX19jdXJyZW50XyA9PSBfX2NfKQorICAgIHsKKyAgICAgICAgX19zLl9fZG9fID0gX19zdGF0ZTo6X19hY2NlcHRfYW5kX2NvbnN1bWU7CisgICAgICAgICsrX19zLl9fY3VycmVudF87CisgICAgICAgIF9fcy5fX25vZGVfID0gdGhpcy0+Zmlyc3QoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX19zLl9fZG9fID0gX19zdGF0ZTo6X19yZWplY3Q7CisgICAgICAgIF9fcy5fX25vZGVfID0gbnVsbHB0cjsKKyAgICB9Cit9CisKKy8vIF9fbWF0Y2hfY2hhcl9pY2FzZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorY2xhc3MgX19tYXRjaF9jaGFyX2ljYXNlCisgICAgOiBwdWJsaWMgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+Cit7CisgICAgdHlwZWRlZiBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4gYmFzZTsKKworICAgIF9UcmFpdHMgX190cmFpdHNfOworICAgIF9DaGFyVCBfX2NfOworCisgICAgX19tYXRjaF9jaGFyX2ljYXNlKGNvbnN0IF9fbWF0Y2hfY2hhcl9pY2FzZSYpOworICAgIF9fbWF0Y2hfY2hhcl9pY2FzZSYgb3BlcmF0b3I9KGNvbnN0IF9fbWF0Y2hfY2hhcl9pY2FzZSYpOworcHVibGljOgorICAgIHR5cGVkZWYgX1ZTVEQ6Ol9fc3RhdGU8X0NoYXJUPiBfX3N0YXRlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fbWF0Y2hfY2hhcl9pY2FzZShjb25zdCBfVHJhaXRzJiBfX3RyYWl0cywgX0NoYXJUIF9fYywgX19ub2RlPF9DaGFyVD4qIF9fcykKKyAgICAgICAgOiBiYXNlKF9fcyksIF9fdHJhaXRzXyhfX3RyYWl0cyksIF9fY18oX190cmFpdHMudHJhbnNsYXRlX25vY2FzZShfX2MpKSB7fQorCisgICAgdmlydHVhbCB2b2lkIF9fZXhlYyhfX3N0YXRlJikgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZAorX19tYXRjaF9jaGFyX2ljYXNlPF9DaGFyVCwgX1RyYWl0cz46Ol9fZXhlYyhfX3N0YXRlJiBfX3MpIGNvbnN0Cit7CisgICAgaWYgKF9fcy5fX2N1cnJlbnRfICE9IF9fcy5fX2xhc3RfICYmCisgICAgICAgIF9fdHJhaXRzXy50cmFuc2xhdGVfbm9jYXNlKCpfX3MuX19jdXJyZW50XykgPT0gX19jXykKKyAgICB7CisgICAgICAgIF9fcy5fX2RvXyA9IF9fc3RhdGU6Ol9fYWNjZXB0X2FuZF9jb25zdW1lOworICAgICAgICArK19fcy5fX2N1cnJlbnRfOworICAgICAgICBfX3MuX19ub2RlXyA9IHRoaXMtPmZpcnN0KCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIF9fcy5fX2RvXyA9IF9fc3RhdGU6Ol9fcmVqZWN0OworICAgICAgICBfX3MuX19ub2RlXyA9IG51bGxwdHI7CisgICAgfQorfQorCisvLyBfX21hdGNoX2NoYXJfY29sbGF0ZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorY2xhc3MgX19tYXRjaF9jaGFyX2NvbGxhdGUKKyAgICA6IHB1YmxpYyBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4KK3sKKyAgICB0eXBlZGVmIF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPiBiYXNlOworCisgICAgX1RyYWl0cyBfX3RyYWl0c187CisgICAgX0NoYXJUIF9fY187CisKKyAgICBfX21hdGNoX2NoYXJfY29sbGF0ZShjb25zdCBfX21hdGNoX2NoYXJfY29sbGF0ZSYpOworICAgIF9fbWF0Y2hfY2hhcl9jb2xsYXRlJiBvcGVyYXRvcj0oY29uc3QgX19tYXRjaF9jaGFyX2NvbGxhdGUmKTsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9WU1REOjpfX3N0YXRlPF9DaGFyVD4gX19zdGF0ZTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX21hdGNoX2NoYXJfY29sbGF0ZShjb25zdCBfVHJhaXRzJiBfX3RyYWl0cywgX0NoYXJUIF9fYywgX19ub2RlPF9DaGFyVD4qIF9fcykKKyAgICAgICAgOiBiYXNlKF9fcyksIF9fdHJhaXRzXyhfX3RyYWl0cyksIF9fY18oX190cmFpdHMudHJhbnNsYXRlKF9fYykpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgX19leGVjKF9fc3RhdGUmKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitfX21hdGNoX2NoYXJfY29sbGF0ZTxfQ2hhclQsIF9UcmFpdHM+OjpfX2V4ZWMoX19zdGF0ZSYgX19zKSBjb25zdAoreworICAgIGlmIChfX3MuX19jdXJyZW50XyAhPSBfX3MuX19sYXN0XyAmJgorICAgICAgICBfX3RyYWl0c18udHJhbnNsYXRlKCpfX3MuX19jdXJyZW50XykgPT0gX19jXykKKyAgICB7CisgICAgICAgIF9fcy5fX2RvXyA9IF9fc3RhdGU6Ol9fYWNjZXB0X2FuZF9jb25zdW1lOworICAgICAgICArK19fcy5fX2N1cnJlbnRfOworICAgICAgICBfX3MuX19ub2RlXyA9IHRoaXMtPmZpcnN0KCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIF9fcy5fX2RvXyA9IF9fc3RhdGU6Ol9fcmVqZWN0OworICAgICAgICBfX3MuX19ub2RlXyA9IG51bGxwdHI7CisgICAgfQorfQorCisvLyBfX2JyYWNrZXRfZXhwcmVzc2lvbgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorY2xhc3MgX19icmFja2V0X2V4cHJlc3Npb24KKyAgICA6IHB1YmxpYyBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4KK3sKKyAgICB0eXBlZGVmIF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPiBiYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6c3RyaW5nX3R5cGUgc3RyaW5nX3R5cGU7CisKKyAgICBfVHJhaXRzIF9fdHJhaXRzXzsKKyAgICB2ZWN0b3I8X0NoYXJUPiBfX2NoYXJzXzsKKyAgICB2ZWN0b3I8X0NoYXJUPiBfX25lZ19jaGFyc187CisgICAgdmVjdG9yPHBhaXI8c3RyaW5nX3R5cGUsIHN0cmluZ190eXBlPiA+IF9fcmFuZ2VzXzsKKyAgICB2ZWN0b3I8cGFpcjxfQ2hhclQsIF9DaGFyVD4gPiBfX2RpZ3JhcGhzXzsKKyAgICB2ZWN0b3I8c3RyaW5nX3R5cGU+IF9fZXF1aXZhbGVuY2VzXzsKKyAgICB0eXBlbmFtZSByZWdleF90cmFpdHM8X0NoYXJUPjo6Y2hhcl9jbGFzc190eXBlIF9fbWFza187CisgICAgdHlwZW5hbWUgcmVnZXhfdHJhaXRzPF9DaGFyVD46OmNoYXJfY2xhc3NfdHlwZSBfX25lZ19tYXNrXzsKKyAgICBib29sIF9fbmVnYXRlXzsKKyAgICBib29sIF9faWNhc2VfOworICAgIGJvb2wgX19jb2xsYXRlXzsKKyAgICBib29sIF9fbWlnaHRfaGF2ZV9kaWdyYXBoXzsKKworICAgIF9fYnJhY2tldF9leHByZXNzaW9uKGNvbnN0IF9fYnJhY2tldF9leHByZXNzaW9uJik7CisgICAgX19icmFja2V0X2V4cHJlc3Npb24mIG9wZXJhdG9yPShjb25zdCBfX2JyYWNrZXRfZXhwcmVzc2lvbiYpOworcHVibGljOgorICAgIHR5cGVkZWYgX1ZTVEQ6Ol9fc3RhdGU8X0NoYXJUPiBfX3N0YXRlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fYnJhY2tldF9leHByZXNzaW9uKGNvbnN0IF9UcmFpdHMmIF9fdHJhaXRzLCBfX25vZGU8X0NoYXJUPiogX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX25lZ2F0ZSwgYm9vbCBfX2ljYXNlLCBib29sIF9fY29sbGF0ZSkKKyAgICAgICAgOiBiYXNlKF9fcyksIF9fdHJhaXRzXyhfX3RyYWl0cyksIF9fbWFza18oKSwgX19uZWdfbWFza18oKSwKKyAgICAgICAgICBfX25lZ2F0ZV8oX19uZWdhdGUpLCBfX2ljYXNlXyhfX2ljYXNlKSwgX19jb2xsYXRlXyhfX2NvbGxhdGUpLAorICAgICAgICAgIF9fbWlnaHRfaGF2ZV9kaWdyYXBoXyhfX3RyYWl0c18uZ2V0bG9jKCkubmFtZSgpICE9ICJDIikge30KKworICAgIHZpcnR1YWwgdm9pZCBfX2V4ZWMoX19zdGF0ZSYpIGNvbnN0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgX19uZWdhdGVkKCkgY29uc3Qge3JldHVybiBfX25lZ2F0ZV87fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19hZGRfY2hhcihfQ2hhclQgX19jKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX19pY2FzZV8pCisgICAgICAgICAgICAgICAgX19jaGFyc18ucHVzaF9iYWNrKF9fdHJhaXRzXy50cmFuc2xhdGVfbm9jYXNlKF9fYykpOworICAgICAgICAgICAgZWxzZSBpZiAoX19jb2xsYXRlXykKKyAgICAgICAgICAgICAgICBfX2NoYXJzXy5wdXNoX2JhY2soX190cmFpdHNfLnRyYW5zbGF0ZShfX2MpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfX2NoYXJzXy5wdXNoX2JhY2soX19jKTsKKyAgICAgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fYWRkX25lZ19jaGFyKF9DaGFyVCBfX2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX2ljYXNlXykKKyAgICAgICAgICAgICAgICBfX25lZ19jaGFyc18ucHVzaF9iYWNrKF9fdHJhaXRzXy50cmFuc2xhdGVfbm9jYXNlKF9fYykpOworICAgICAgICAgICAgZWxzZSBpZiAoX19jb2xsYXRlXykKKyAgICAgICAgICAgICAgICBfX25lZ19jaGFyc18ucHVzaF9iYWNrKF9fdHJhaXRzXy50cmFuc2xhdGUoX19jKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX19uZWdfY2hhcnNfLnB1c2hfYmFjayhfX2MpOworICAgICAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19hZGRfcmFuZ2Uoc3RyaW5nX3R5cGUgX19iLCBzdHJpbmdfdHlwZSBfX2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX2NvbGxhdGVfKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfX2ljYXNlXykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fYi5zaXplKCk7ICsrX19pKQorICAgICAgICAgICAgICAgICAgICAgICAgX19iW19faV0gPSBfX3RyYWl0c18udHJhbnNsYXRlX25vY2FzZShfX2JbX19pXSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fZS5zaXplKCk7ICsrX19pKQorICAgICAgICAgICAgICAgICAgICAgICAgX19lW19faV0gPSBfX3RyYWl0c18udHJhbnNsYXRlX25vY2FzZShfX2VbX19pXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fYi5zaXplKCk7ICsrX19pKQorICAgICAgICAgICAgICAgICAgICAgICAgX19iW19faV0gPSBfX3RyYWl0c18udHJhbnNsYXRlKF9fYltfX2ldKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19lLnNpemUoKTsgKytfX2kpCisgICAgICAgICAgICAgICAgICAgICAgICBfX2VbX19pXSA9IF9fdHJhaXRzXy50cmFuc2xhdGUoX19lW19faV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX3Jhbmdlc18ucHVzaF9iYWNrKG1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RyYWl0c18udHJhbnNmb3JtKF9fYi5iZWdpbigpLCBfX2IuZW5kKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdHJhaXRzXy50cmFuc2Zvcm0oX19lLmJlZ2luKCksIF9fZS5lbmQoKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX19iLnNpemUoKSAhPSAxIHx8IF9fZS5zaXplKCkgIT0gMSkKKyAgICAgICAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2NvbGxhdGU+KCk7CisgICAgICAgICAgICAgICAgaWYgKF9faWNhc2VfKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX19iWzBdID0gX190cmFpdHNfLnRyYW5zbGF0ZV9ub2Nhc2UoX19iWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgX19lWzBdID0gX190cmFpdHNfLnRyYW5zbGF0ZV9ub2Nhc2UoX19lWzBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19yYW5nZXNfLnB1c2hfYmFjayhtYWtlX3BhaXIoX1ZTVEQ6Om1vdmUoX19iKSwgX1ZTVEQ6Om1vdmUoX19lKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19hZGRfZGlncmFwaChfQ2hhclQgX19jMSwgX0NoYXJUIF9fYzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX2ljYXNlXykKKyAgICAgICAgICAgICAgICBfX2RpZ3JhcGhzXy5wdXNoX2JhY2sobWFrZV9wYWlyKF9fdHJhaXRzXy50cmFuc2xhdGVfbm9jYXNlKF9fYzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190cmFpdHNfLnRyYW5zbGF0ZV9ub2Nhc2UoX19jMikpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKF9fY29sbGF0ZV8pCisgICAgICAgICAgICAgICAgX19kaWdyYXBoc18ucHVzaF9iYWNrKG1ha2VfcGFpcihfX3RyYWl0c18udHJhbnNsYXRlKF9fYzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190cmFpdHNfLnRyYW5zbGF0ZShfX2MyKSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9fZGlncmFwaHNfLnB1c2hfYmFjayhtYWtlX3BhaXIoX19jMSwgX19jMikpOworICAgICAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19hZGRfZXF1aXZhbGVuY2UoY29uc3Qgc3RyaW5nX3R5cGUmIF9fcykKKyAgICAgICAge19fZXF1aXZhbGVuY2VzXy5wdXNoX2JhY2soX19zKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19hZGRfY2xhc3ModHlwZW5hbWUgcmVnZXhfdHJhaXRzPF9DaGFyVD46OmNoYXJfY2xhc3NfdHlwZSBfX21hc2spCisgICAgICAgIHtfX21hc2tfIHw9IF9fbWFzazt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19hZGRfbmVnX2NsYXNzKHR5cGVuYW1lIHJlZ2V4X3RyYWl0czxfQ2hhclQ+OjpjaGFyX2NsYXNzX3R5cGUgX19tYXNrKQorICAgICAgICB7X19uZWdfbWFza18gfD0gX19tYXNrO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitfX2JyYWNrZXRfZXhwcmVzc2lvbjxfQ2hhclQsIF9UcmFpdHM+OjpfX2V4ZWMoX19zdGF0ZSYgX19zKSBjb25zdAoreworICAgIGJvb2wgX19mb3VuZCA9IGZhbHNlOworICAgIHVuc2lnbmVkIF9fY29uc3VtZWQgPSAwOworICAgIGlmIChfX3MuX19jdXJyZW50XyAhPSBfX3MuX19sYXN0XykKKyAgICB7CisgICAgICAgICsrX19jb25zdW1lZDsKKyAgICAgICAgaWYgKF9fbWlnaHRfaGF2ZV9kaWdyYXBoXykKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX25leHQgPSBfVlNURDo6bmV4dChfX3MuX19jdXJyZW50Xyk7CisgICAgICAgICAgICBpZiAoX19uZXh0ICE9IF9fcy5fX2xhc3RfKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhaXI8X0NoYXJULCBfQ2hhclQ+IF9fY2gyKCpfX3MuX19jdXJyZW50XywgKl9fbmV4dCk7CisgICAgICAgICAgICAgICAgaWYgKF9faWNhc2VfKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX19jaDIuZmlyc3QgPSBfX3RyYWl0c18udHJhbnNsYXRlX25vY2FzZShfX2NoMi5maXJzdCk7CisgICAgICAgICAgICAgICAgICAgIF9fY2gyLnNlY29uZCA9IF9fdHJhaXRzXy50cmFuc2xhdGVfbm9jYXNlKF9fY2gyLnNlY29uZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9fY29sbGF0ZV8pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX2NoMi5maXJzdCA9IF9fdHJhaXRzXy50cmFuc2xhdGUoX19jaDIuZmlyc3QpOworICAgICAgICAgICAgICAgICAgICBfX2NoMi5zZWNvbmQgPSBfX3RyYWl0c18udHJhbnNsYXRlKF9fY2gyLnNlY29uZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghX190cmFpdHNfLmxvb2t1cF9jb2xsYXRlbmFtZSgmX19jaDIuZmlyc3QsICZfX2NoMi5maXJzdCsyKS5lbXB0eSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gX19jaDIgaXMgYSBkaWdyYXBoIGluIHRoaXMgbG9jYWxlCisgICAgICAgICAgICAgICAgICAgICsrX19jb25zdW1lZDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19kaWdyYXBoc18uc2l6ZSgpOyArK19faSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fY2gyID09IF9fZGlncmFwaHNfW19faV0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBfX2V4aXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fY29sbGF0ZV8gJiYgIV9fcmFuZ2VzXy5lbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZSBfX3MyID0gX190cmFpdHNfLnRyYW5zZm9ybSgmX19jaDIuZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX19jaDIuZmlyc3QgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fcmFuZ2VzXy5zaXplKCk7ICsrX19pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX3Jhbmdlc19bX19pXS5maXJzdCA8PSBfX3MyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fczIgPD0gX19yYW5nZXNfW19faV0uc2Vjb25kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gX19leGl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIV9fZXF1aXZhbGVuY2VzXy5lbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZSBfX3MyID0gX190cmFpdHNfLnRyYW5zZm9ybV9wcmltYXJ5KCZfX2NoMi5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fY2gyLmZpcnN0ICsgMik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX2VxdWl2YWxlbmNlc18uc2l6ZSgpOyArK19faSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX19zMiA9PSBfX2VxdWl2YWxlbmNlc19bX19pXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIF9fZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fdHJhaXRzXy5pc2N0eXBlKF9fY2gyLmZpcnN0LCBfX21hc2tfKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgX190cmFpdHNfLmlzY3R5cGUoX19jaDIuc2Vjb25kLCBfX21hc2tfKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX19mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIF9fZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIV9fdHJhaXRzXy5pc2N0eXBlKF9fY2gyLmZpcnN0LCBfX25lZ19tYXNrXykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFfX3RyYWl0c18uaXNjdHlwZShfX2NoMi5zZWNvbmQsIF9fbmVnX21hc2tfKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX19mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIF9fZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBnb3RvIF9fZXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gdGVzdCAqX19zLl9fY3VycmVudF8gYXMgbm90IGEgZGlncmFwaAorICAgICAgICBfQ2hhclQgX19jaCA9ICpfX3MuX19jdXJyZW50XzsKKyAgICAgICAgaWYgKF9faWNhc2VfKQorICAgICAgICAgICAgX19jaCA9IF9fdHJhaXRzXy50cmFuc2xhdGVfbm9jYXNlKF9fY2gpOworICAgICAgICBlbHNlIGlmIChfX2NvbGxhdGVfKQorICAgICAgICAgICAgX19jaCA9IF9fdHJhaXRzXy50cmFuc2xhdGUoX19jaCk7CisgICAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fY2hhcnNfLnNpemUoKTsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX2NoID09IF9fY2hhcnNfW19faV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgZ290byBfX2V4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gc2V0IG9mICJfX2ZvdW5kIiBjaGFycyA9CisgICAgICAgIC8vICAgdW5pb24oY29tcGxlbWVudCh1bmlvbihfX25lZ19jaGFyc18sIF9fbmVnX21hc2tfKSksCisgICAgICAgIC8vICAgICAgICAgb3RoZXIgY2FzZXMuLi4pCisgICAgICAgIC8vCisgICAgICAgIC8vIF9fbmVnX2NoYXJzXyBhbmQgX19uZWdfbWFza18nZCBiZXR0ZXIgYmUgaGFuZGxlZCB0b2dldGhlciwgYXMgdGhlcmUKKyAgICAgICAgLy8gYXJlIG5vIHNob3J0IGNpcmN1aXQgb3Bwb3J0dW5pdGllcy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW4gYWRkaXRpb24sIHdoZW4gX19uZWdfbWFza18vX19uZWdfY2hhcnNfIGlzIGVtcHR5LCB0aGV5IHNob3VsZCBiZQorICAgICAgICAvLyB0cmVhdGVkIGFzIGFsbCBvbmVzL2FsbCBjaGFycy4KKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGJvb2wgX19pbl9uZWdfbWFzayA9IChfX25lZ19tYXNrXyA9PSAwKSB8fAorICAgICAgICAgICAgICBfX3RyYWl0c18uaXNjdHlwZShfX2NoLCBfX25lZ19tYXNrXyk7CisgICAgICAgICAgY29uc3QgYm9vbCBfX2luX25lZ19jaGFycyA9CisgICAgICAgICAgICAgIF9fbmVnX2NoYXJzXy5lbXB0eSgpIHx8CisgICAgICAgICAgICAgIHN0ZDo6ZmluZChfX25lZ19jaGFyc18uYmVnaW4oKSwgX19uZWdfY2hhcnNfLmVuZCgpLCBfX2NoKSAhPQorICAgICAgICAgICAgICBfX25lZ19jaGFyc18uZW5kKCk7CisgICAgICAgICAgaWYgKCEoX19pbl9uZWdfbWFzayB8fCBfX2luX25lZ19jaGFycykpCisgICAgICAgICAgeworICAgICAgICAgICAgX19mb3VuZCA9IHRydWU7CisgICAgICAgICAgICBnb3RvIF9fZXhpdDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFfX3Jhbmdlc18uZW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nX3R5cGUgX19zMiA9IF9fY29sbGF0ZV8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RyYWl0c18udHJhbnNmb3JtKCZfX2NoLCAmX19jaCArIDEpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGUoMSwgX19jaCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3Jhbmdlc18uc2l6ZSgpOyArK19faSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX19yYW5nZXNfW19faV0uZmlyc3QgPD0gX19zMiAmJiBfX3MyIDw9IF9fcmFuZ2VzX1tfX2ldLnNlY29uZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9fZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBnb3RvIF9fZXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFfX2VxdWl2YWxlbmNlc18uZW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nX3R5cGUgX19zMiA9IF9fdHJhaXRzXy50cmFuc2Zvcm1fcHJpbWFyeSgmX19jaCwgJl9fY2ggKyAxKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fZXF1aXZhbGVuY2VzXy5zaXplKCk7ICsrX19pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfX3MyID09IF9fZXF1aXZhbGVuY2VzX1tfX2ldKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX19mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gX19leGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoX190cmFpdHNfLmlzY3R5cGUoX19jaCwgX19tYXNrXykpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fZm91bmQgPSB0cnVlOworICAgICAgICAgICAgZ290byBfX2V4aXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBfX2ZvdW5kID0gX19uZWdhdGVfOyAgLy8gZm9yY2UgcmVqZWN0CitfX2V4aXQ6CisgICAgaWYgKF9fZm91bmQgIT0gX19uZWdhdGVfKQorICAgIHsKKyAgICAgICAgX19zLl9fZG9fID0gX19zdGF0ZTo6X19hY2NlcHRfYW5kX2NvbnN1bWU7CisgICAgICAgIF9fcy5fX2N1cnJlbnRfICs9IF9fY29uc3VtZWQ7CisgICAgICAgIF9fcy5fX25vZGVfID0gdGhpcy0+Zmlyc3QoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX19zLl9fZG9fID0gX19zdGF0ZTo6X19yZWplY3Q7CisgICAgICAgIF9fcy5fX25vZGVfID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+IGNsYXNzIF9fbG9va2FoZWFkOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzID0gcmVnZXhfdHJhaXRzPF9DaGFyVD4gPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYmFzaWNfcmVnZXgKK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlczoKKyAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnN0cmluZ190eXBlICAgICAgIHN0cmluZ190eXBlOworICAgIHR5cGVkZWYgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgZmxhZ190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6bG9jYWxlX3R5cGUgICAgICAgbG9jYWxlX3R5cGU7CisKK3ByaXZhdGU6CisgICAgX1RyYWl0cyAgIF9fdHJhaXRzXzsKKyAgICBmbGFnX3R5cGUgX19mbGFnc187CisgICAgdW5zaWduZWQgX19tYXJrZWRfY291bnRfOworICAgIHVuc2lnbmVkIF9fbG9vcF9jb3VudF87CisgICAgaW50IF9fb3Blbl9jb3VudF87CisgICAgc2hhcmVkX3B0cjxfX2VtcHR5X3N0YXRlPF9DaGFyVD4gPiBfX3N0YXJ0XzsKKyAgICBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4qIF9fZW5kXzsKKworICAgIHR5cGVkZWYgX1ZTVEQ6Ol9fc3RhdGU8X0NoYXJUPiBfX3N0YXRlOworICAgIHR5cGVkZWYgX1ZTVEQ6Ol9fbm9kZTxfQ2hhclQ+IF9fbm9kZTsKKworcHVibGljOgorICAgIC8vIGNvbnN0YW50czoKKyAgICBzdGF0aWMgY29uc3QgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgaWNhc2UgPSByZWdleF9jb25zdGFudHM6OmljYXNlOworICAgIHN0YXRpYyBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBub3N1YnMgPSByZWdleF9jb25zdGFudHM6Om5vc3ViczsKKyAgICBzdGF0aWMgY29uc3QgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgb3B0aW1pemUgPSByZWdleF9jb25zdGFudHM6Om9wdGltaXplOworICAgIHN0YXRpYyBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBjb2xsYXRlID0gcmVnZXhfY29uc3RhbnRzOjpjb2xsYXRlOworICAgIHN0YXRpYyBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBFQ01BU2NyaXB0ID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0OworICAgIHN0YXRpYyBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBiYXNpYyA9IHJlZ2V4X2NvbnN0YW50czo6YmFzaWM7CisgICAgc3RhdGljIGNvbnN0IHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGV4dGVuZGVkID0gcmVnZXhfY29uc3RhbnRzOjpleHRlbmRlZDsKKyAgICBzdGF0aWMgY29uc3QgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgYXdrID0gcmVnZXhfY29uc3RhbnRzOjphd2s7CisgICAgc3RhdGljIGNvbnN0IHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGdyZXAgPSByZWdleF9jb25zdGFudHM6OmdyZXA7CisgICAgc3RhdGljIGNvbnN0IHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGVncmVwID0gcmVnZXhfY29uc3RhbnRzOjplZ3JlcDsKKworICAgIC8vIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX3JlZ2V4KCkKKyAgICAgICAgOiBfX2ZsYWdzXygpLCBfX21hcmtlZF9jb3VudF8oMCksIF9fbG9vcF9jb3VudF8oMCksIF9fb3Blbl9jb3VudF8oMCksCisgICAgICAgICAgX19lbmRfKDApCisgICAgICAgIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IGJhc2ljX3JlZ2V4KGNvbnN0IHZhbHVlX3R5cGUqIF9fcCwgZmxhZ190eXBlIF9fZiA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKyAgICAgICAgOiBfX2ZsYWdzXyhfX2YpLCBfX21hcmtlZF9jb3VudF8oMCksIF9fbG9vcF9jb3VudF8oMCksIF9fb3Blbl9jb3VudF8oMCksCisgICAgICAgICAgX19lbmRfKDApCisgICAgICAgIHtfX3BhcnNlKF9fcCwgX19wICsgX190cmFpdHNfLmxlbmd0aChfX3ApKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX3JlZ2V4KGNvbnN0IHZhbHVlX3R5cGUqIF9fcCwgc2l6ZV90IF9fbGVuLCBmbGFnX3R5cGUgX19mID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KQorICAgICAgICA6IF9fZmxhZ3NfKF9fZiksIF9fbWFya2VkX2NvdW50XygwKSwgX19sb29wX2NvdW50XygwKSwgX19vcGVuX2NvdW50XygwKSwKKyAgICAgICAgICBfX2VuZF8oMCkKKyAgICAgICAge19fcGFyc2UoX19wLCBfX3AgKyBfX2xlbik7fQorLy8gICAgIGJhc2ljX3JlZ2V4KGNvbnN0IGJhc2ljX3JlZ2V4JikgPSBkZWZhdWx0OworLy8gICAgIGJhc2ljX3JlZ2V4KGJhc2ljX3JlZ2V4JiYpID0gZGVmYXVsdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1NULCBjbGFzcyBfU0E+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZXhwbGljaXQgYmFzaWNfcmVnZXgoY29uc3QgYmFzaWNfc3RyaW5nPHZhbHVlX3R5cGUsIF9TVCwgX1NBPiYgX19wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnX3R5cGUgX19mID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KQorICAgICAgICA6IF9fZmxhZ3NfKF9fZiksIF9fbWFya2VkX2NvdW50XygwKSwgX19sb29wX2NvdW50XygwKSwgX19vcGVuX2NvdW50XygwKSwKKyAgICAgICAgICBfX2VuZF8oMCkKKyAgICAgICAge19fcGFyc2UoX19wLmJlZ2luKCksIF9fcC5lbmQoKSk7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJhc2ljX3JlZ2V4KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgIGZsYWdfdHlwZSBfX2YgPSByZWdleF9jb25zdGFudHM6OkVDTUFTY3JpcHQpCisgICAgICAgIDogX19mbGFnc18oX19mKSwgX19tYXJrZWRfY291bnRfKDApLCBfX2xvb3BfY291bnRfKDApLCBfX29wZW5fY291bnRfKDApLAorICAgICAgICAgIF9fZW5kXygwKQorICAgICAgICB7X19wYXJzZShfX2ZpcnN0LCBfX2xhc3QpO30KKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX3JlZ2V4KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCwKKyAgICAgICAgICAgICAgICBmbGFnX3R5cGUgX19mID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KQorICAgICAgICA6IF9fZmxhZ3NfKF9fZiksIF9fbWFya2VkX2NvdW50XygwKSwgX19sb29wX2NvdW50XygwKSwgX19vcGVuX2NvdW50XygwKSwKKyAgICAgICAgICBfX2VuZF8oMCkKKyAgICAgICAge19fcGFyc2UoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTt9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisvLyAgICB+YmFzaWNfcmVnZXgoKSA9IGRlZmF1bHQ7CisKKy8vICAgICBiYXNpY19yZWdleCYgb3BlcmF0b3I9KGNvbnN0IGJhc2ljX3JlZ2V4JikgPSBkZWZhdWx0OworLy8gICAgIGJhc2ljX3JlZ2V4JiBvcGVyYXRvcj0oYmFzaWNfcmVnZXgmJikgPSBkZWZhdWx0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19yZWdleCYgb3BlcmF0b3I9KGNvbnN0IHZhbHVlX3R5cGUqIF9fcCkKKyAgICAgICAge3JldHVybiBhc3NpZ24oX19wKTt9CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19yZWdleCYgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkKKyAgICAgICAge3JldHVybiBhc3NpZ24oX19pbCk7fQorI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1NULCBjbGFzcyBfU0E+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYmFzaWNfcmVnZXgmIG9wZXJhdG9yPShjb25zdCBiYXNpY19zdHJpbmc8dmFsdWVfdHlwZSwgX1NULCBfU0E+JiBfX3ApCisgICAgICAgIHtyZXR1cm4gYXNzaWduKF9fcCk7fQorCisgICAgLy8gYXNzaWduOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19yZWdleCYgYXNzaWduKGNvbnN0IGJhc2ljX3JlZ2V4JiBfX3RoYXQpCisgICAgICAgIHtyZXR1cm4gKnRoaXMgPSBfX3RoYXQ7fQorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfcmVnZXgmIGFzc2lnbihiYXNpY19yZWdleCYmIF9fdGhhdCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gKnRoaXMgPSBfVlNURDo6bW92ZShfX3RoYXQpO30KKyNlbmRpZgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19yZWdleCYgYXNzaWduKGNvbnN0IHZhbHVlX3R5cGUqIF9fcCwgZmxhZ190eXBlIF9fZiA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKyAgICAgICAge3JldHVybiBhc3NpZ24oX19wLCBfX3AgKyBfX3RyYWl0c18ubGVuZ3RoKF9fcCksIF9fZik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19yZWdleCYgYXNzaWduKGNvbnN0IHZhbHVlX3R5cGUqIF9fcCwgc2l6ZV90IF9fbGVuLCBmbGFnX3R5cGUgX19mKQorICAgICAgICB7cmV0dXJuIGFzc2lnbihfX3AsIF9fcCArIF9fbGVuLCBfX2YpO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1NULCBjbGFzcyBfU0E+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYmFzaWNfcmVnZXgmIGFzc2lnbihjb25zdCBiYXNpY19zdHJpbmc8dmFsdWVfdHlwZSwgX1NULCBfU0E+JiBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ190eXBlIF9fZiA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKyAgICAgICAgICAgIHtyZXR1cm4gYXNzaWduKF9fcy5iZWdpbigpLCBfX3MuZW5kKCksIF9fZik7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICAgX19pc19pbnB1dF9pdGVyYXRvciAgPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICFfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICAgICAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgICA+Ojp0eXBlCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ190eXBlIF9fZiA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKyAgICAgICAgeworICAgICAgICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVD4gX190KF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgICAgICByZXR1cm4gYXNzaWduKF9fdC5iZWdpbigpLCBfX3QuZW5kKCksIF9fZik7CisgICAgICAgIH0KKworcHJpdmF0ZToKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX21lbWJlcl9pbml0KGZsYWdfdHlwZSBfX2YpCisgICAgeworICAgICAgICBfX2ZsYWdzXyA9IF9fZjsKKyAgICAgICAgX19tYXJrZWRfY291bnRfID0gMDsKKyAgICAgICAgX19sb29wX2NvdW50XyA9IDA7CisgICAgICAgIF9fb3Blbl9jb3VudF8gPSAwOworICAgICAgICBfX2VuZF8gPSBudWxscHRyOworICAgIH0KK3B1YmxpYzoKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICBfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlLAorICAgICAgICAgICAgYmFzaWNfcmVnZXgmCisgICAgICAgID46OnR5cGUKKyAgICAgICAgYXNzaWduKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ190eXBlIF9fZiA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFzc2lnbihiYXNpY19yZWdleChfX2ZpcnN0LCBfX2xhc3QsIF9fZikpOworICAgICAgICB9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfcmVnZXgmIGFzc2lnbihpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFnX3R5cGUgX19mID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KQorICAgICAgICB7cmV0dXJuIGFzc2lnbihfX2lsLmJlZ2luKCksIF9faWwuZW5kKCksIF9fZik7fQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgLy8gY29uc3Qgb3BlcmF0aW9uczoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5zaWduZWQgbWFya19jb3VudCgpIGNvbnN0IHtyZXR1cm4gX19tYXJrZWRfY291bnRfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZmxhZ190eXBlIGZsYWdzKCkgY29uc3Qge3JldHVybiBfX2ZsYWdzXzt9CisKKyAgICAvLyBsb2NhbGU6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGxvY2FsZV90eXBlIGltYnVlKGxvY2FsZV90eXBlIF9fbG9jKQorICAgIHsKKyAgICAgICAgX19tZW1iZXJfaW5pdChFQ01BU2NyaXB0KTsKKyAgICAgICAgX19zdGFydF8ucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIF9fdHJhaXRzXy5pbWJ1ZShfX2xvYyk7CisgICAgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBsb2NhbGVfdHlwZSBnZXRsb2MoKSBjb25zdCB7cmV0dXJuIF9fdHJhaXRzXy5nZXRsb2MoKTt9CisKKyAgICAvLyBzd2FwOgorICAgIHZvaWQgc3dhcChiYXNpY19yZWdleCYgX19yKTsKKworcHJpdmF0ZToKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5zaWduZWQgX19sb29wX2NvdW50KCkgY29uc3Qge3JldHVybiBfX2xvb3BfY291bnRfO30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fcGFyc2UoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICAgICAgX19wYXJzZV9iYXNpY19yZWdfZXhwKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fcGFyc2VfUkVfZXhwcmVzc2lvbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgICBfX3BhcnNlX3NpbXBsZV9SRShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgICBfX3BhcnNlX25vbmR1cGxfUkUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICAgICAgX19wYXJzZV9vbmVfY2hhcl9vcl9jb2xsX2VsZW1fUkUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICAgICAgX19wYXJzZV9CYWNrX29wZW5fcGFyZW4oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICAgICAgX19wYXJzZV9CYWNrX2Nsb3NlX3BhcmVuKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fcGFyc2VfQmFja19vcGVuX2JyYWNlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fcGFyc2VfQmFja19jbG9zZV9icmFjZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgICBfX3BhcnNlX0JBQ0tSRUYoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICAgICAgX19wYXJzZV9PUkRfQ0hBUihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgICBfX3BhcnNlX1FVT1RFRF9DSEFSKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fcGFyc2VfUkVfZHVwbF9zeW1ib2woX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4qIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBfX21leHBfYmVnaW4sIHVuc2lnbmVkIF9fbWV4cF9lbmQpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fcGFyc2VfRVJFX2R1cGxfc3ltYm9sKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPiogX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBfX21leHBfYmVnaW4sIHVuc2lnbmVkIF9fbWV4cF9lbmQpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fcGFyc2VfYnJhY2tldF9leHByZXNzaW9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fcGFyc2VfZm9sbG93X2xpc3QoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JyYWNrZXRfZXhwcmVzc2lvbjxfQ2hhclQsIF9UcmFpdHM+KiBfX21sKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgICBfX3BhcnNlX2V4cHJlc3Npb25fdGVybShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JyYWNrZXRfZXhwcmVzc2lvbjxfQ2hhclQsIF9UcmFpdHM+KiBfX21sKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgICBfX3BhcnNlX2VxdWl2YWxlbmNlX2NsYXNzKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19icmFja2V0X2V4cHJlc3Npb248X0NoYXJULCBfVHJhaXRzPiogX19tbCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICAgICAgX19wYXJzZV9jaGFyYWN0ZXJfY2xhc3MoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19icmFja2V0X2V4cHJlc3Npb248X0NoYXJULCBfVHJhaXRzPiogX19tbCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICAgICAgX19wYXJzZV9jb2xsYXRpbmdfc3ltYm9sKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJUPiYgX19jb2xfc3ltKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgICBfX3BhcnNlX0RVUF9DT1VOVChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBpbnQmIF9fYyk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICAgICAgX19wYXJzZV9leHRlbmRlZF9yZWdfZXhwKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fcGFyc2VfRVJFX2JyYW5jaChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgICBfX3BhcnNlX0VSRV9leHByZXNzaW9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fcGFyc2Vfb25lX2NoYXJfb3JfY29sbF9lbGVtX0VSRShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgICBfX3BhcnNlX09SRF9DSEFSX0VSRShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgICBfX3BhcnNlX1FVT1RFRF9DSEFSX0VSRShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgICBfX3BhcnNlX2VjbWFfZXhwKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fcGFyc2VfYWx0ZXJuYXRpdmUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICAgICAgX19wYXJzZV90ZXJtKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fcGFyc2VfYXNzZXJ0aW9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fcGFyc2VfYXRvbShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgICBfX3BhcnNlX2F0b21fZXNjYXBlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fcGFyc2VfZGVjaW1hbF9lc2NhcGUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICAgICAgX19wYXJzZV9jaGFyYWN0ZXJfY2xhc3NfZXNjYXBlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fcGFyc2VfY2hhcmFjdGVyX2VzY2FwZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVD4qIF9fc3RyID0gbnVsbHB0cik7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICAgICAgX19wYXJzZV9wYXR0ZXJuX2NoYXJhY3RlcihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgICBfX3BhcnNlX2dyZXAoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICAgICAgX19wYXJzZV9lZ3JlcChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgICBfX3BhcnNlX2NsYXNzX2VzY2FwZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJUPiYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYnJhY2tldF9leHByZXNzaW9uPF9DaGFyVCwgX1RyYWl0cz4qIF9fbWwpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fcGFyc2VfYXdrX2VzY2FwZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJUPiogX19zdHIgPSBudWxscHRyKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fcHVzaF9sX2FuY2hvcigpOworICAgIHZvaWQgX19wdXNoX3JfYW5jaG9yKCk7CisgICAgdm9pZCBfX3B1c2hfbWF0Y2hfYW55KCk7CisgICAgdm9pZCBfX3B1c2hfbWF0Y2hfYW55X2J1dF9uZXdsaW5lKCk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19wdXNoX2dyZWVkeV9pbmZfcmVwZWF0KHNpemVfdCBfX21pbiwgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+KiBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgX19tZXhwX2JlZ2luID0gMCwgdW5zaWduZWQgX19tZXhwX2VuZCA9IDApCisgICAgICAgIHtfX3B1c2hfbG9vcChfX21pbiwgbnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCksIF9fcywKKyAgICAgICAgICAgICAgICAgICAgIF9fbWV4cF9iZWdpbiwgX19tZXhwX2VuZCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fcHVzaF9ub25ncmVlZHlfaW5mX3JlcGVhdChzaXplX3QgX19taW4sIF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPiogX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9fbWV4cF9iZWdpbiA9IDAsIHVuc2lnbmVkIF9fbWV4cF9lbmQgPSAwKQorICAgICAgICB7X19wdXNoX2xvb3AoX19taW4sIG51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpLCBfX3MsCisgICAgICAgICAgICAgICAgICAgICBfX21leHBfYmVnaW4sIF9fbWV4cF9lbmQsIGZhbHNlKTt9CisgICAgdm9pZCBfX3B1c2hfbG9vcChzaXplX3QgX19taW4sIHNpemVfdCBfX21heCwgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+KiBfX3MsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19tZXhwX2JlZ2luID0gMCwgc2l6ZV90IF9fbWV4cF9lbmQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2dyZWVkeSA9IHRydWUpOworICAgIF9fYnJhY2tldF9leHByZXNzaW9uPF9DaGFyVCwgX1RyYWl0cz4qIF9fc3RhcnRfbWF0Y2hpbmdfbGlzdChib29sIF9fbmVnYXRlKTsKKyAgICB2b2lkIF9fcHVzaF9jaGFyKHZhbHVlX3R5cGUgX19jKTsKKyAgICB2b2lkIF9fcHVzaF9iYWNrX3JlZihpbnQgX19pKTsKKyAgICB2b2lkIF9fcHVzaF9hbHRlcm5hdGlvbihfX293bnNfb25lX3N0YXRlPF9DaGFyVD4qIF9fc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+KiBfX3NiKTsKKyAgICB2b2lkIF9fcHVzaF9iZWdpbl9tYXJrZWRfc3ViZXhwcmVzc2lvbigpOworICAgIHZvaWQgX19wdXNoX2VuZF9tYXJrZWRfc3ViZXhwcmVzc2lvbih1bnNpZ25lZCk7CisgICAgdm9pZCBfX3B1c2hfZW1wdHkoKTsKKyAgICB2b2lkIF9fcHVzaF93b3JkX2JvdW5kYXJ5KGJvb2wpOworICAgIHZvaWQgX19wdXNoX2xvb2thaGVhZChjb25zdCBiYXNpY19yZWdleCYsIGJvb2wsIHVuc2lnbmVkKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgorICAgICAgICBib29sCisgICAgICAgIF9fc2VhcmNoKGNvbnN0IF9DaGFyVCogX19maXJzdCwgY29uc3QgX0NoYXJUKiBfX2xhc3QsCisgICAgICAgICAgICAgICAgIG1hdGNoX3Jlc3VsdHM8Y29uc3QgX0NoYXJUKiwgX0FsbG9jYXRvcj4mIF9fbSwKKyAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncykgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KKyAgICAgICAgYm9vbAorICAgICAgICBfX21hdGNoX2F0X3N0YXJ0KGNvbnN0IF9DaGFyVCogX19maXJzdCwgY29uc3QgX0NoYXJUKiBfX2xhc3QsCisgICAgICAgICAgICAgICAgIG1hdGNoX3Jlc3VsdHM8Y29uc3QgX0NoYXJUKiwgX0FsbG9jYXRvcj4mIF9fbSwKKyAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncywgYm9vbCkgY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+CisgICAgICAgIGJvb2wKKyAgICAgICAgX19tYXRjaF9hdF9zdGFydF9lY21hKGNvbnN0IF9DaGFyVCogX19maXJzdCwgY29uc3QgX0NoYXJUKiBfX2xhc3QsCisgICAgICAgICAgICAgICAgIG1hdGNoX3Jlc3VsdHM8Y29uc3QgX0NoYXJUKiwgX0FsbG9jYXRvcj4mIF9fbSwKKyAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncywgYm9vbCkgY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+CisgICAgICAgIGJvb2wKKyAgICAgICAgX19tYXRjaF9hdF9zdGFydF9wb3NpeF9ub3N1YnMoY29uc3QgX0NoYXJUKiBfX2ZpcnN0LCBjb25zdCBfQ2hhclQqIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgbWF0Y2hfcmVzdWx0czxjb25zdCBfQ2hhclQqLCBfQWxsb2NhdG9yPiYgX19tLAorICAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzLCBib29sKSBjb25zdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KKyAgICAgICAgYm9vbAorICAgICAgICBfX21hdGNoX2F0X3N0YXJ0X3Bvc2l4X3N1YnMoY29uc3QgX0NoYXJUKiBfX2ZpcnN0LCBjb25zdCBfQ2hhclQqIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgbWF0Y2hfcmVzdWx0czxjb25zdCBfQ2hhclQqLCBfQWxsb2NhdG9yPiYgX19tLAorICAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzLCBib29sKSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQnAsIGNsYXNzIF9BcCwgY2xhc3MgX0NwLCBjbGFzcyBfVHA+CisgICAgZnJpZW5kCisgICAgYm9vbAorICAgIHJlZ2V4X3NlYXJjaChfQnAsIF9CcCwgbWF0Y2hfcmVzdWx0czxfQnAsIF9BcD4mLCBjb25zdCBiYXNpY19yZWdleDxfQ3AsIF9UcD4mLAorICAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0FwLCBjbGFzcyBfQ3AsIGNsYXNzIF9UcD4KKyAgICBmcmllbmQKKyAgICBib29sCisgICAgcmVnZXhfc2VhcmNoKGNvbnN0IF9DcCosIGNvbnN0IF9DcCosIG1hdGNoX3Jlc3VsdHM8Y29uc3QgX0NwKiwgX0FwPiYsCisgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3JlZ2V4PF9DcCwgX1RwPiYsIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQnAsIGNsYXNzIF9DcCwgY2xhc3MgX1RwPgorICAgIGZyaWVuZAorICAgIGJvb2wKKyAgICByZWdleF9zZWFyY2goX0JwLCBfQnAsIGNvbnN0IGJhc2ljX3JlZ2V4PF9DcCwgX1RwPiYsCisgICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ3AsIGNsYXNzIF9UcD4KKyAgICBmcmllbmQKKyAgICBib29sCisgICAgcmVnZXhfc2VhcmNoKGNvbnN0IF9DcCosIGNvbnN0IF9DcCosCisgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3JlZ2V4PF9DcCwgX1RwPiYsIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ3AsIGNsYXNzIF9BcCwgY2xhc3MgX1RwPgorICAgIGZyaWVuZAorICAgIGJvb2wKKyAgICByZWdleF9zZWFyY2goY29uc3QgX0NwKiwgbWF0Y2hfcmVzdWx0czxjb25zdCBfQ3AqLCBfQXA+JiwgY29uc3QgYmFzaWNfcmVnZXg8X0NwLCBfVHA+JiwKKyAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9TVCwgY2xhc3MgX1NBLCBjbGFzcyBfQ3AsIGNsYXNzIF9UcD4KKyAgICBmcmllbmQKKyAgICBib29sCisgICAgcmVnZXhfc2VhcmNoKGNvbnN0IGJhc2ljX3N0cmluZzxfQ3AsIF9TVCwgX1NBPiYgX19zLAorICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19yZWdleDxfQ3AsIF9UcD4mIF9fZSwKKyAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncyk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1NULCBjbGFzcyBfU0EsIGNsYXNzIF9BcCwgY2xhc3MgX0NwLCBjbGFzcyBfVHA+CisgICAgZnJpZW5kCisgICAgYm9vbAorICAgIHJlZ2V4X3NlYXJjaChjb25zdCBiYXNpY19zdHJpbmc8X0NwLCBfU1QsIF9TQT4mIF9fcywKKyAgICAgICAgICAgICAgICAgbWF0Y2hfcmVzdWx0czx0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NwLCBfU1QsIF9TQT46OmNvbnN0X2l0ZXJhdG9yLCBfQXA+JiwKKyAgICAgICAgICAgICAgICAgY29uc3QgYmFzaWNfcmVnZXg8X0NwLCBfVHA+JiBfX2UsCisgICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JdGVyLCBjbGFzcyBfQXAsIGNsYXNzIF9DcCwgY2xhc3MgX1RwPgorICAgIGZyaWVuZAorICAgIGJvb2wKKyAgICByZWdleF9zZWFyY2goX193cmFwX2l0ZXI8X0l0ZXI+IF9fZmlyc3QsCisgICAgICAgICAgICAgICAgIF9fd3JhcF9pdGVyPF9JdGVyPiBfX2xhc3QsCisgICAgICAgICAgICAgICAgIG1hdGNoX3Jlc3VsdHM8X193cmFwX2l0ZXI8X0l0ZXI+LCBfQXA+JiBfX20sCisgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3JlZ2V4PF9DcCwgX1RwPiYgX19lLAorICAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcywgY2xhc3M+IGZyaWVuZCBjbGFzcyBfX2xvb2thaGVhZDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisgICAgY29uc3QgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6aWNhc2U7Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorICAgIGNvbnN0IHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGJhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Om5vc3ViczsKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisgICAgY29uc3QgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6b3B0aW1pemU7Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorICAgIGNvbnN0IHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGJhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46OmNvbGxhdGU7Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorICAgIGNvbnN0IHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGJhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46OkVDTUFTY3JpcHQ7Cit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorICAgIGNvbnN0IHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGJhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46OmJhc2ljOwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpleHRlbmRlZDsKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisgICAgY29uc3QgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6YXdrOwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpncmVwOwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjplZ3JlcDsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46OnN3YXAoYmFzaWNfcmVnZXgmIF9fcikKK3sKKyAgICB1c2luZyBfVlNURDo6c3dhcDsKKyAgICBzd2FwKF9fdHJhaXRzXywgX19yLl9fdHJhaXRzXyk7CisgICAgc3dhcChfX2ZsYWdzXywgX19yLl9fZmxhZ3NfKTsKKyAgICBzd2FwKF9fbWFya2VkX2NvdW50XywgX19yLl9fbWFya2VkX2NvdW50Xyk7CisgICAgc3dhcChfX2xvb3BfY291bnRfLCBfX3IuX19sb29wX2NvdW50Xyk7CisgICAgc3dhcChfX29wZW5fY291bnRfLCBfX3IuX19vcGVuX2NvdW50Xyk7CisgICAgc3dhcChfX3N0YXJ0XywgX19yLl9fc3RhcnRfKTsKKyAgICBzd2FwKF9fZW5kXywgX19yLl9fZW5kXyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+JiBfX3gsIGJhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz4mIF9feSkKK3sKKyAgICByZXR1cm4gX194LnN3YXAoX195KTsKK30KKworLy8gX19sb29rYWhlYWQKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIF9fbG9va2FoZWFkCisgICAgOiBwdWJsaWMgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+Cit7CisgICAgdHlwZWRlZiBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4gYmFzZTsKKworICAgIGJhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz4gX19leHBfOworICAgIHVuc2lnbmVkIF9fbWV4cF87CisgICAgYm9vbCBfX2ludmVydF87CisKKyAgICBfX2xvb2thaGVhZChjb25zdCBfX2xvb2thaGVhZCYpOworICAgIF9fbG9va2FoZWFkJiBvcGVyYXRvcj0oY29uc3QgX19sb29rYWhlYWQmKTsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9WU1REOjpfX3N0YXRlPF9DaGFyVD4gX19zdGF0ZTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2xvb2thaGVhZChjb25zdCBiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+JiBfX2V4cCwgYm9vbCBfX2ludmVydCwgX19ub2RlPF9DaGFyVD4qIF9fcywgdW5zaWduZWQgX19tZXhwKQorICAgICAgICA6IGJhc2UoX19zKSwgX19leHBfKF9fZXhwKSwgX19tZXhwXyhfX21leHApLCBfX2ludmVydF8oX19pbnZlcnQpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgX19leGVjKF9fc3RhdGUmKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitfX2xvb2thaGVhZDxfQ2hhclQsIF9UcmFpdHM+OjpfX2V4ZWMoX19zdGF0ZSYgX19zKSBjb25zdAoreworICAgIG1hdGNoX3Jlc3VsdHM8Y29uc3QgX0NoYXJUKj4gX19tOworICAgIF9fbS5fX2luaXQoMSArIF9fZXhwXy5tYXJrX2NvdW50KCksIF9fcy5fX2N1cnJlbnRfLCBfX3MuX19sYXN0Xyk7CisgICAgYm9vbCBfX21hdGNoZWQgPSBfX2V4cF8uX19tYXRjaF9hdF9zdGFydF9lY21hKAorICAgICAgICBfX3MuX19jdXJyZW50XywgX19zLl9fbGFzdF8sCisgICAgICAgIF9fbSwKKyAgICAgICAgKF9fcy5fX2ZsYWdzXyB8IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfY29udGludW91cykgJgorICAgICAgICB+cmVnZXhfY29uc3RhbnRzOjpfX2Z1bGxfbWF0Y2gsCisgICAgICAgIF9fcy5fX2F0X2ZpcnN0XyAmJiBfX3MuX19jdXJyZW50XyA9PSBfX3MuX19maXJzdF8pOworICAgIGlmIChfX21hdGNoZWQgIT0gX19pbnZlcnRfKQorICAgIHsKKyAgICAgICAgX19zLl9fZG9fID0gX19zdGF0ZTo6X19hY2NlcHRfYnV0X25vdF9jb25zdW1lOworICAgICAgICBfX3MuX19ub2RlXyA9IHRoaXMtPmZpcnN0KCk7CisgICAgICAgIGZvciAodW5zaWduZWQgX19pID0gMTsgX19pIDwgX19tLnNpemUoKTsgKytfX2kpIHsKKyAgICAgICAgICAgIF9fcy5fX3N1Yl9tYXRjaGVzX1tfX21leHBfICsgX19pIC0gMV0gPSBfX20uX19tYXRjaGVzX1tfX2ldOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIF9fcy5fX2RvXyA9IF9fc3RhdGU6Ol9fcmVqZWN0OworICAgICAgICBfX3MuX19ub2RlXyA9IG51bGxwdHI7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3BhcnNlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgeworICAgICAgICB1bmlxdWVfcHRyPF9fbm9kZT4gX19oKG5ldyBfX2VuZF9zdGF0ZTxfQ2hhclQ+KTsKKyAgICAgICAgX19zdGFydF8ucmVzZXQobmV3IF9fZW1wdHlfc3RhdGU8X0NoYXJUPihfX2guZ2V0KCkpKTsKKyAgICAgICAgX19oLnJlbGVhc2UoKTsKKyAgICAgICAgX19lbmRfID0gX19zdGFydF8uZ2V0KCk7CisgICAgfQorICAgIHN3aXRjaCAoX19mbGFnc18gJiAweDFGMCkKKyAgICB7CisgICAgY2FzZSBFQ01BU2NyaXB0OgorICAgICAgICBfX2ZpcnN0ID0gX19wYXJzZV9lY21hX2V4cChfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGJhc2ljOgorICAgICAgICBfX2ZpcnN0ID0gX19wYXJzZV9iYXNpY19yZWdfZXhwKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZXh0ZW5kZWQ6CisgICAgY2FzZSBhd2s6CisgICAgICAgIF9fZmlyc3QgPSBfX3BhcnNlX2V4dGVuZGVkX3JlZ19leHAoX19maXJzdCwgX19sYXN0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBncmVwOgorICAgICAgICBfX2ZpcnN0ID0gX19wYXJzZV9ncmVwKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZWdyZXA6CisgICAgICAgIF9fZmlyc3QgPSBfX3BhcnNlX2VncmVwKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjpfX3JlX2Vycl9ncmFtbWFyPigpOworICAgIH0KKyAgICByZXR1cm4gX19maXJzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorX0ZvcndhcmRJdGVyYXRvcgorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19wYXJzZV9iYXNpY19yZWdfZXhwKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisgICAgeworICAgICAgICBpZiAoKl9fZmlyc3QgPT0gJ14nKQorICAgICAgICB7CisgICAgICAgICAgICBfX3B1c2hfbF9hbmNob3IoKTsKKyAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fZmlyc3QgPSBfX3BhcnNlX1JFX2V4cHJlc3Npb24oX19maXJzdCwgX19sYXN0KTsKKyAgICAgICAgICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fdGVtcCA9IF9WU1REOjpuZXh0KF9fZmlyc3QpOworICAgICAgICAgICAgICAgIGlmIChfX3RlbXAgPT0gX19sYXN0ICYmICpfX2ZpcnN0ID09ICckJykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9fcHVzaF9yX2FuY2hvcigpOworICAgICAgICAgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICAgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjpfX3JlX2Vycl9lbXB0eT4oKTsKKyAgICB9CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK19Gb3J3YXJkSXRlcmF0b3IKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcGFyc2VfZXh0ZW5kZWRfcmVnX2V4cChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+KiBfX3NhID0gX19lbmRfOworICAgIF9Gb3J3YXJkSXRlcmF0b3IgX190ZW1wID0gX19wYXJzZV9FUkVfYnJhbmNoKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgaWYgKF9fdGVtcCA9PSBfX2ZpcnN0KQorICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6X19yZV9lcnJfZW1wdHk+KCk7CisgICAgX19maXJzdCA9IF9fdGVtcDsKKyAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgKl9fZmlyc3QgPT0gJ3wnKQorICAgIHsKKyAgICAgICAgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+KiBfX3NiID0gX19lbmRfOworICAgICAgICBfX3RlbXAgPSBfX3BhcnNlX0VSRV9icmFuY2goKytfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICBpZiAoX190ZW1wID09IF9fZmlyc3QpCisgICAgICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6X19yZV9lcnJfZW1wdHk+KCk7CisgICAgICAgIF9fcHVzaF9hbHRlcm5hdGlvbihfX3NhLCBfX3NiKTsKKyAgICAgICAgX19maXJzdCA9IF9fdGVtcDsKKyAgICB9CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK19Gb3J3YXJkSXRlcmF0b3IKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcGFyc2VfRVJFX2JyYW5jaChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgX0ZvcndhcmRJdGVyYXRvciBfX3RlbXAgPSBfX3BhcnNlX0VSRV9leHByZXNzaW9uKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgaWYgKF9fdGVtcCA9PSBfX2ZpcnN0KQorICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6X19yZV9lcnJfZW1wdHk+KCk7CisgICAgZG8KKyAgICB7CisgICAgICAgIF9fZmlyc3QgPSBfX3RlbXA7CisgICAgICAgIF9fdGVtcCA9IF9fcGFyc2VfRVJFX2V4cHJlc3Npb24oX19maXJzdCwgX19sYXN0KTsKKyAgICB9IHdoaWxlIChfX3RlbXAgIT0gX19maXJzdCk7CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK19Gb3J3YXJkSXRlcmF0b3IKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcGFyc2VfRVJFX2V4cHJlc3Npb24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4qIF9fZSA9IF9fZW5kXzsKKyAgICB1bnNpZ25lZCBfX21leHBfYmVnaW4gPSBfX21hcmtlZF9jb3VudF87CisgICAgX0ZvcndhcmRJdGVyYXRvciBfX3RlbXAgPSBfX3BhcnNlX29uZV9jaGFyX29yX2NvbGxfZWxlbV9FUkUoX19maXJzdCwgX19sYXN0KTsKKyAgICBpZiAoX190ZW1wID09IF9fZmlyc3QgJiYgX190ZW1wICE9IF9fbGFzdCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoKl9fdGVtcCkKKyAgICAgICAgeworICAgICAgICBjYXNlICdeJzoKKyAgICAgICAgICAgIF9fcHVzaF9sX2FuY2hvcigpOworICAgICAgICAgICAgKytfX3RlbXA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnJCc6CisgICAgICAgICAgICBfX3B1c2hfcl9hbmNob3IoKTsKKyAgICAgICAgICAgICsrX190ZW1wOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJygnOgorICAgICAgICAgICAgX19wdXNoX2JlZ2luX21hcmtlZF9zdWJleHByZXNzaW9uKCk7CisgICAgICAgICAgICB1bnNpZ25lZCBfX3RlbXBfY291bnQgPSBfX21hcmtlZF9jb3VudF87CisgICAgICAgICAgICArK19fb3Blbl9jb3VudF87CisgICAgICAgICAgICBfX3RlbXAgPSBfX3BhcnNlX2V4dGVuZGVkX3JlZ19leHAoKytfX3RlbXAsIF9fbGFzdCk7CisgICAgICAgICAgICBpZiAoX190ZW1wID09IF9fbGFzdCB8fCAqX190ZW1wICE9ICcpJykKKyAgICAgICAgICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfcGFyZW4+KCk7CisgICAgICAgICAgICBfX3B1c2hfZW5kX21hcmtlZF9zdWJleHByZXNzaW9uKF9fdGVtcF9jb3VudCk7CisgICAgICAgICAgICAtLV9fb3Blbl9jb3VudF87CisgICAgICAgICAgICArK19fdGVtcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChfX3RlbXAgIT0gX19maXJzdCkKKyAgICAgICAgX190ZW1wID0gX19wYXJzZV9FUkVfZHVwbF9zeW1ib2woX190ZW1wLCBfX2xhc3QsIF9fZSwgX19tZXhwX2JlZ2luKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWFya2VkX2NvdW50XysxKTsKKyAgICBfX2ZpcnN0ID0gX190ZW1wOworICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3BhcnNlX1JFX2V4cHJlc3Npb24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworICAgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3RlbXAgPSBfX3BhcnNlX3NpbXBsZV9SRShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICBpZiAoX190ZW1wID09IF9fZmlyc3QpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgX19maXJzdCA9IF9fdGVtcDsKKyAgICB9CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK19Gb3J3YXJkSXRlcmF0b3IKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcGFyc2Vfc2ltcGxlX1JFKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICB7CisgICAgICAgIF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPiogX19lID0gX19lbmRfOworICAgICAgICB1bnNpZ25lZCBfX21leHBfYmVnaW4gPSBfX21hcmtlZF9jb3VudF87CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX190ZW1wID0gX19wYXJzZV9ub25kdXBsX1JFKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIGlmIChfX3RlbXAgIT0gX19maXJzdCkKKyAgICAgICAgICAgIF9fZmlyc3QgPSBfX3BhcnNlX1JFX2R1cGxfc3ltYm9sKF9fdGVtcCwgX19sYXN0LCBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX21leHBfYmVnaW4rMSwgX19tYXJrZWRfY291bnRfKzEpOworICAgIH0KKyAgICByZXR1cm4gX19maXJzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorX0ZvcndhcmRJdGVyYXRvcgorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19wYXJzZV9ub25kdXBsX1JFKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fdGVtcCA9IF9fZmlyc3Q7CisgICAgX19maXJzdCA9IF9fcGFyc2Vfb25lX2NoYXJfb3JfY29sbF9lbGVtX1JFKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgaWYgKF9fdGVtcCA9PSBfX2ZpcnN0KQorICAgIHsKKyAgICAgICAgX190ZW1wID0gX19wYXJzZV9CYWNrX29wZW5fcGFyZW4oX19maXJzdCwgX19sYXN0KTsKKyAgICAgICAgaWYgKF9fdGVtcCAhPSBfX2ZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBfX3B1c2hfYmVnaW5fbWFya2VkX3N1YmV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIF9fdGVtcF9jb3VudCA9IF9fbWFya2VkX2NvdW50XzsKKyAgICAgICAgICAgIF9fZmlyc3QgPSBfX3BhcnNlX1JFX2V4cHJlc3Npb24oX190ZW1wLCBfX2xhc3QpOworICAgICAgICAgICAgX190ZW1wID0gX19wYXJzZV9CYWNrX2Nsb3NlX3BhcmVuKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgICAgICBpZiAoX190ZW1wID09IF9fZmlyc3QpCisgICAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX3BhcmVuPigpOworICAgICAgICAgICAgX19wdXNoX2VuZF9tYXJrZWRfc3ViZXhwcmVzc2lvbihfX3RlbXBfY291bnQpOworICAgICAgICAgICAgX19maXJzdCA9IF9fdGVtcDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBfX2ZpcnN0ID0gX19wYXJzZV9CQUNLUkVGKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgfQorICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3BhcnNlX29uZV9jaGFyX29yX2NvbGxfZWxlbV9SRSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgX0ZvcndhcmRJdGVyYXRvciBfX3RlbXAgPSBfX3BhcnNlX09SRF9DSEFSKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgaWYgKF9fdGVtcCA9PSBfX2ZpcnN0KQorICAgIHsKKyAgICAgICAgX190ZW1wID0gX19wYXJzZV9RVU9URURfQ0hBUihfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICBpZiAoX190ZW1wID09IF9fZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX3RlbXAgIT0gX19sYXN0ICYmICpfX3RlbXAgPT0gJy4nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fcHVzaF9tYXRjaF9hbnkoKTsKKyAgICAgICAgICAgICAgICArK19fdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfX3RlbXAgPSBfX3BhcnNlX2JyYWNrZXRfZXhwcmVzc2lvbihfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICB9CisgICAgfQorICAgIF9fZmlyc3QgPSBfX3RlbXA7CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK19Gb3J3YXJkSXRlcmF0b3IKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcGFyc2Vfb25lX2NoYXJfb3JfY29sbF9lbGVtX0VSRSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgX0ZvcndhcmRJdGVyYXRvciBfX3RlbXAgPSBfX3BhcnNlX09SRF9DSEFSX0VSRShfX2ZpcnN0LCBfX2xhc3QpOworICAgIGlmIChfX3RlbXAgPT0gX19maXJzdCkKKyAgICB7CisgICAgICAgIF9fdGVtcCA9IF9fcGFyc2VfUVVPVEVEX0NIQVJfRVJFKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIGlmIChfX3RlbXAgPT0gX19maXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9fdGVtcCAhPSBfX2xhc3QgJiYgKl9fdGVtcCA9PSAnLicpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19wdXNoX21hdGNoX2FueSgpOworICAgICAgICAgICAgICAgICsrX190ZW1wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9fdGVtcCA9IF9fcGFyc2VfYnJhY2tldF9leHByZXNzaW9uKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19maXJzdCA9IF9fdGVtcDsKKyAgICByZXR1cm4gX19maXJzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorX0ZvcndhcmRJdGVyYXRvcgorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19wYXJzZV9CYWNrX29wZW5fcGFyZW4oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3RlbXAgPSBfVlNURDo6bmV4dChfX2ZpcnN0KTsKKyAgICAgICAgaWYgKF9fdGVtcCAhPSBfX2xhc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgqX19maXJzdCA9PSAnXFwnICYmICpfX3RlbXAgPT0gJygnKQorICAgICAgICAgICAgICAgIF9fZmlyc3QgPSArK19fdGVtcDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19maXJzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorX0ZvcndhcmRJdGVyYXRvcgorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19wYXJzZV9CYWNrX2Nsb3NlX3BhcmVuKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisgICAgeworICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fdGVtcCA9IF9WU1REOjpuZXh0KF9fZmlyc3QpOworICAgICAgICBpZiAoX190ZW1wICE9IF9fbGFzdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCpfX2ZpcnN0ID09ICdcXCcgJiYgKl9fdGVtcCA9PSAnKScpCisgICAgICAgICAgICAgICAgX19maXJzdCA9ICsrX190ZW1wOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3BhcnNlX0JhY2tfb3Blbl9icmFjZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisgICAgeworICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fdGVtcCA9IF9WU1REOjpuZXh0KF9fZmlyc3QpOworICAgICAgICBpZiAoX190ZW1wICE9IF9fbGFzdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCpfX2ZpcnN0ID09ICdcXCcgJiYgKl9fdGVtcCA9PSAneycpCisgICAgICAgICAgICAgICAgX19maXJzdCA9ICsrX190ZW1wOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3BhcnNlX0JhY2tfY2xvc2VfYnJhY2UoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICB7CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX190ZW1wID0gX1ZTVEQ6Om5leHQoX19maXJzdCk7CisgICAgICAgIGlmIChfX3RlbXAgIT0gX19sYXN0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKl9fZmlyc3QgPT0gJ1xcJyAmJiAqX190ZW1wID09ICd9JykKKyAgICAgICAgICAgICAgICBfX2ZpcnN0ID0gKytfX3RlbXA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK19Gb3J3YXJkSXRlcmF0b3IKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcGFyc2VfQkFDS1JFRihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3RlbXAgPSBfVlNURDo6bmV4dChfX2ZpcnN0KTsKKyAgICAgICAgaWYgKF9fdGVtcCAhPSBfX2xhc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgqX19maXJzdCA9PSAnXFwnKQorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICBpbnQgX192YWwgPSBfX3RyYWl0c18udmFsdWUoKl9fdGVtcCwgMTApOworICAgICAgICAgICAgICAgIGlmIChfX3ZhbCA+PSAxICYmIF9fdmFsIDw9IDkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX3B1c2hfYmFja19yZWYoX192YWwpOworICAgICAgICAgICAgICAgICAgICBfX2ZpcnN0ID0gKytfX3RlbXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3BhcnNlX09SRF9DSEFSKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3RlbXAgPSBfVlNURDo6bmV4dChfX2ZpcnN0KTsKKyAgICAgICAgaWYgKF9fdGVtcCA9PSBfX2xhc3QgJiYgKl9fZmlyc3QgPT0gJyQnKQorICAgICAgICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgICAgIC8vIE5vdCBjYWxsZWQgaW5zaWRlIGEgYnJhY2tldAorICAgICAgICBpZiAoKl9fZmlyc3QgPT0gJy4nIHx8ICpfX2ZpcnN0ID09ICdcXCcgfHwgKl9fZmlyc3QgPT0gJ1snKQorICAgICAgICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgICAgIF9fcHVzaF9jaGFyKCpfX2ZpcnN0KTsKKyAgICAgICAgKytfX2ZpcnN0OworICAgIH0KKyAgICByZXR1cm4gX19maXJzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorX0ZvcndhcmRJdGVyYXRvcgorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19wYXJzZV9PUkRfQ0hBUl9FUkUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgc3dpdGNoICgqX19maXJzdCkKKyAgICAgICAgeworICAgICAgICBjYXNlICdeJzoKKyAgICAgICAgY2FzZSAnLic6CisgICAgICAgIGNhc2UgJ1snOgorICAgICAgICBjYXNlICckJzoKKyAgICAgICAgY2FzZSAnKCc6CisgICAgICAgIGNhc2UgJ3wnOgorICAgICAgICBjYXNlICcqJzoKKyAgICAgICAgY2FzZSAnKyc6CisgICAgICAgIGNhc2UgJz8nOgorICAgICAgICBjYXNlICd7JzoKKyAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyknOgorICAgICAgICAgICAgaWYgKF9fb3Blbl9jb3VudF8gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX3B1c2hfY2hhcigqX19maXJzdCk7CisgICAgICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBfX3B1c2hfY2hhcigqX19maXJzdCk7CisgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19maXJzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorX0ZvcndhcmRJdGVyYXRvcgorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19wYXJzZV9RVU9URURfQ0hBUihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICB7CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX190ZW1wID0gX1ZTVEQ6Om5leHQoX19maXJzdCk7CisgICAgICAgIGlmIChfX3RlbXAgIT0gX19sYXN0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKl9fZmlyc3QgPT0gJ1xcJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCpfX3RlbXApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJ14nOgorICAgICAgICAgICAgICAgIGNhc2UgJy4nOgorICAgICAgICAgICAgICAgIGNhc2UgJyonOgorICAgICAgICAgICAgICAgIGNhc2UgJ1snOgorICAgICAgICAgICAgICAgIGNhc2UgJyQnOgorICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgICAgICAgX19wdXNoX2NoYXIoKl9fdGVtcCk7CisgICAgICAgICAgICAgICAgICAgIF9fZmlyc3QgPSArK19fdGVtcDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3BhcnNlX1FVT1RFRF9DSEFSX0VSRShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisgICAgeworICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fdGVtcCA9IF9WU1REOjpuZXh0KF9fZmlyc3QpOworICAgICAgICBpZiAoX190ZW1wICE9IF9fbGFzdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCpfX2ZpcnN0ID09ICdcXCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgqX190ZW1wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICdeJzoKKyAgICAgICAgICAgICAgICBjYXNlICcuJzoKKyAgICAgICAgICAgICAgICBjYXNlICcqJzoKKyAgICAgICAgICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgICAgICAgICBjYXNlICckJzoKKyAgICAgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgICAgY2FzZSAnKCc6CisgICAgICAgICAgICAgICAgY2FzZSAnKSc6CisgICAgICAgICAgICAgICAgY2FzZSAnfCc6CisgICAgICAgICAgICAgICAgY2FzZSAnKyc6CisgICAgICAgICAgICAgICAgY2FzZSAnPyc6CisgICAgICAgICAgICAgICAgY2FzZSAneyc6CisgICAgICAgICAgICAgICAgY2FzZSAnfSc6CisgICAgICAgICAgICAgICAgICAgIF9fcHVzaF9jaGFyKCpfX3RlbXApOworICAgICAgICAgICAgICAgICAgICBfX2ZpcnN0ID0gKytfX3RlbXA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmICgoX19mbGFnc18gJiAweDFGMCkgPT0gYXdrKQorICAgICAgICAgICAgICAgICAgICAgICAgX19maXJzdCA9IF9fcGFyc2VfYXdrX2VzY2FwZSgrK19fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19maXJzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorX0ZvcndhcmRJdGVyYXRvcgorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19wYXJzZV9SRV9kdXBsX3N5bWJvbChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4qIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgX19tZXhwX2JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBfX21leHBfZW5kKQoreworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICB7CisgICAgICAgIGlmICgqX19maXJzdCA9PSAnKicpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fcHVzaF9ncmVlZHlfaW5mX3JlcGVhdCgwLCBfX3MsIF9fbWV4cF9iZWdpbiwgX19tZXhwX2VuZCk7CisgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fdGVtcCA9IF9fcGFyc2VfQmFja19vcGVuX2JyYWNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgICAgICBpZiAoX190ZW1wICE9IF9fZmlyc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IF9fbWluID0gMDsKKyAgICAgICAgICAgICAgICBfX2ZpcnN0ID0gX190ZW1wOworICAgICAgICAgICAgICAgIF9fdGVtcCA9IF9fcGFyc2VfRFVQX0NPVU5UKF9fZmlyc3QsIF9fbGFzdCwgX19taW4pOworICAgICAgICAgICAgICAgIGlmIChfX3RlbXAgPT0gX19maXJzdCkKKyAgICAgICAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2JhZGJyYWNlPigpOworICAgICAgICAgICAgICAgIF9fZmlyc3QgPSBfX3RlbXA7CisgICAgICAgICAgICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgICAgICAgICAgICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYnJhY2U+KCk7CisgICAgICAgICAgICAgICAgaWYgKCpfX2ZpcnN0ICE9ICcsJykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9fdGVtcCA9IF9fcGFyc2VfQmFja19jbG9zZV9icmFjZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICAgICAgICAgICAgICBpZiAoX190ZW1wID09IF9fZmlyc3QpCisgICAgICAgICAgICAgICAgICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYnJhY2U+KCk7CisgICAgICAgICAgICAgICAgICAgIF9fcHVzaF9sb29wKF9fbWluLCBfX21pbiwgX19zLCBfX21leHBfYmVnaW4sIF9fbWV4cF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgX19maXJzdCA9IF9fdGVtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytfX2ZpcnN0OyAgLy8gY29uc3VtZSAnLCcKKyAgICAgICAgICAgICAgICAgICAgaW50IF9fbWF4ID0gLTE7CisgICAgICAgICAgICAgICAgICAgIF9fZmlyc3QgPSBfX3BhcnNlX0RVUF9DT1VOVChfX2ZpcnN0LCBfX2xhc3QsIF9fbWF4KTsKKyAgICAgICAgICAgICAgICAgICAgX190ZW1wID0gX19wYXJzZV9CYWNrX2Nsb3NlX2JyYWNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX3RlbXAgPT0gX19maXJzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjplcnJvcl9icmFjZT4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fbWF4ID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgX19wdXNoX2dyZWVkeV9pbmZfcmVwZWF0KF9fbWluLCBfX3MsIF9fbWV4cF9iZWdpbiwgX19tZXhwX2VuZCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fbWF4IDwgX19taW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2JhZGJyYWNlPigpOworICAgICAgICAgICAgICAgICAgICAgICAgX19wdXNoX2xvb3AoX19taW4sIF9fbWF4LCBfX3MsIF9fbWV4cF9iZWdpbiwgX19tZXhwX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9fZmlyc3QgPSBfX3RlbXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3BhcnNlX0VSRV9kdXBsX3N5bWJvbChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPiogX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgX19tZXhwX2JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgX19tZXhwX2VuZCkKK3sKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisgICAgeworICAgICAgICB1bnNpZ25lZCBfX2dyYW1tYXIgPSBfX2ZsYWdzXyAmIDB4MUYwOworICAgICAgICBzd2l0Y2ggKCpfX2ZpcnN0KQorICAgICAgICB7CisgICAgICAgIGNhc2UgJyonOgorICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICAgICAgaWYgKF9fZ3JhbW1hciA9PSBFQ01BU2NyaXB0ICYmIF9fZmlyc3QgIT0gX19sYXN0ICYmICpfX2ZpcnN0ID09ICc/JykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAgICAgICAgX19wdXNoX25vbmdyZWVkeV9pbmZfcmVwZWF0KDAsIF9fcywgX19tZXhwX2JlZ2luLCBfX21leHBfZW5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfX3B1c2hfZ3JlZWR5X2luZl9yZXBlYXQoMCwgX19zLCBfX21leHBfYmVnaW4sIF9fbWV4cF9lbmQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJysnOgorICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICAgICAgaWYgKF9fZ3JhbW1hciA9PSBFQ01BU2NyaXB0ICYmIF9fZmlyc3QgIT0gX19sYXN0ICYmICpfX2ZpcnN0ID09ICc/JykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAgICAgICAgX19wdXNoX25vbmdyZWVkeV9pbmZfcmVwZWF0KDEsIF9fcywgX19tZXhwX2JlZ2luLCBfX21leHBfZW5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfX3B1c2hfZ3JlZWR5X2luZl9yZXBlYXQoMSwgX19zLCBfX21leHBfYmVnaW4sIF9fbWV4cF9lbmQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJz8nOgorICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICAgICAgaWYgKF9fZ3JhbW1hciA9PSBFQ01BU2NyaXB0ICYmIF9fZmlyc3QgIT0gX19sYXN0ICYmICpfX2ZpcnN0ID09ICc/JykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAgICAgICAgX19wdXNoX2xvb3AoMCwgMSwgX19zLCBfX21leHBfYmVnaW4sIF9fbWV4cF9lbmQsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfX3B1c2hfbG9vcCgwLCAxLCBfX3MsIF9fbWV4cF9iZWdpbiwgX19tZXhwX2VuZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAneyc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IF9fbWluOworICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX190ZW1wID0gX19wYXJzZV9EVVBfQ09VTlQoKytfX2ZpcnN0LCBfX2xhc3QsIF9fbWluKTsKKyAgICAgICAgICAgICAgICBpZiAoX190ZW1wID09IF9fZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjplcnJvcl9iYWRicmFjZT4oKTsKKyAgICAgICAgICAgICAgICBfX2ZpcnN0ID0gX190ZW1wOworICAgICAgICAgICAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgICAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2JyYWNlPigpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoKl9fZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJ30nOgorICAgICAgICAgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2dyYW1tYXIgPT0gRUNNQVNjcmlwdCAmJiBfX2ZpcnN0ICE9IF9fbGFzdCAmJiAqX19maXJzdCA9PSAnPycpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fcHVzaF9sb29wKF9fbWluLCBfX21pbiwgX19zLCBfX21leHBfYmVnaW4sIF9fbWV4cF9lbmQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBfX3B1c2hfbG9vcChfX21pbiwgX19taW4sIF9fcywgX19tZXhwX2JlZ2luLCBfX21leHBfZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnLCc6CisgICAgICAgICAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2JhZGJyYWNlPigpOworICAgICAgICAgICAgICAgICAgICBpZiAoKl9fZmlyc3QgPT0gJ30nKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX19ncmFtbWFyID09IEVDTUFTY3JpcHQgJiYgX19maXJzdCAhPSBfX2xhc3QgJiYgKl9fZmlyc3QgPT0gJz8nKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3B1c2hfbm9uZ3JlZWR5X2luZl9yZXBlYXQoX19taW4sIF9fcywgX19tZXhwX2JlZ2luLCBfX21leHBfZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3B1c2hfZ3JlZWR5X2luZl9yZXBlYXQoX19taW4sIF9fcywgX19tZXhwX2JlZ2luLCBfX21leHBfZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX21heCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgX190ZW1wID0gX19wYXJzZV9EVVBfQ09VTlQoX19maXJzdCwgX19sYXN0LCBfX21heCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX190ZW1wID09IF9fZmlyc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2JyYWNlPigpOworICAgICAgICAgICAgICAgICAgICAgICAgX19maXJzdCA9IF9fdGVtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCB8fCAqX19maXJzdCAhPSAnfScpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2JyYWNlPigpOworICAgICAgICAgICAgICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fbWF4IDwgX19taW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2JhZGJyYWNlPigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fZ3JhbW1hciA9PSBFQ01BU2NyaXB0ICYmIF9fZmlyc3QgIT0gX19sYXN0ICYmICpfX2ZpcnN0ID09ICc/JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wdXNoX2xvb3AoX19taW4sIF9fbWF4LCBfX3MsIF9fbWV4cF9iZWdpbiwgX19tZXhwX2VuZCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcHVzaF9sb29wKF9fbWluLCBfX21heCwgX19zLCBfX21leHBfYmVnaW4sIF9fbWV4cF9lbmQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjplcnJvcl9iYWRicmFjZT4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19maXJzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorX0ZvcndhcmRJdGVyYXRvcgorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19wYXJzZV9icmFja2V0X2V4cHJlc3Npb24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0ICYmICpfX2ZpcnN0ID09ICdbJykKKyAgICB7CisgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2JyYWNrPigpOworICAgICAgICBib29sIF9fbmVnYXRlID0gZmFsc2U7CisgICAgICAgIGlmICgqX19maXJzdCA9PSAnXicpCisgICAgICAgIHsKKyAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgIF9fbmVnYXRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBfX2JyYWNrZXRfZXhwcmVzc2lvbjxfQ2hhclQsIF9UcmFpdHM+KiBfX21sID0gX19zdGFydF9tYXRjaGluZ19saXN0KF9fbmVnYXRlKTsKKyAgICAgICAgLy8gX19tbCBvd25lZCBieSAqdGhpcworICAgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYnJhY2s+KCk7CisgICAgICAgIGlmICgoX19mbGFnc18gJiAweDFGMCkgIT0gRUNNQVNjcmlwdCAmJiAqX19maXJzdCA9PSAnXScpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fbWwtPl9fYWRkX2NoYXIoJ10nKTsKKyAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgfQorICAgICAgICBfX2ZpcnN0ID0gX19wYXJzZV9mb2xsb3dfbGlzdChfX2ZpcnN0LCBfX2xhc3QsIF9fbWwpOworICAgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYnJhY2s+KCk7CisgICAgICAgIGlmICgqX19maXJzdCA9PSAnLScpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fbWwtPl9fYWRkX2NoYXIoJy0nKTsKKyAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QgfHwgKl9fZmlyc3QgIT0gJ10nKQorICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2JyYWNrPigpOworICAgICAgICArK19fZmlyc3Q7CisgICAgfQorICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3BhcnNlX2ZvbGxvd19saXN0KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19icmFja2V0X2V4cHJlc3Npb248X0NoYXJULCBfVHJhaXRzPiogX19tbCkKK3sKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisgICAgeworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3RlbXAgPSBfX3BhcnNlX2V4cHJlc3Npb25fdGVybShfX2ZpcnN0LCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWwpOworICAgICAgICAgICAgaWYgKF9fdGVtcCA9PSBfX2ZpcnN0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgX19maXJzdCA9IF9fdGVtcDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19maXJzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorX0ZvcndhcmRJdGVyYXRvcgorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19wYXJzZV9leHByZXNzaW9uX3Rlcm0oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JyYWNrZXRfZXhwcmVzc2lvbjxfQ2hhclQsIF9UcmFpdHM+KiBfX21sKQoreworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiAqX19maXJzdCAhPSAnXScpCisgICAgeworICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fdGVtcCA9IF9WU1REOjpuZXh0KF9fZmlyc3QpOworICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJUPiBfX3N0YXJ0X3JhbmdlOworICAgICAgICBpZiAoX190ZW1wICE9IF9fbGFzdCAmJiAqX19maXJzdCA9PSAnWycpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgqX190ZW1wID09ICc9JykKKyAgICAgICAgICAgICAgICByZXR1cm4gX19wYXJzZV9lcXVpdmFsZW5jZV9jbGFzcygrK19fdGVtcCwgX19sYXN0LCBfX21sKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCpfX3RlbXAgPT0gJzonKQorICAgICAgICAgICAgICAgIHJldHVybiBfX3BhcnNlX2NoYXJhY3Rlcl9jbGFzcygrK19fdGVtcCwgX19sYXN0LCBfX21sKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCpfX3RlbXAgPT0gJy4nKQorICAgICAgICAgICAgICAgIF9fZmlyc3QgPSBfX3BhcnNlX2NvbGxhdGluZ19zeW1ib2woKytfX3RlbXAsIF9fbGFzdCwgX19zdGFydF9yYW5nZSk7CisgICAgICAgIH0KKyAgICAgICAgdW5zaWduZWQgX19ncmFtbWFyID0gX19mbGFnc18gJiAweDFGMDsKKyAgICAgICAgaWYgKF9fc3RhcnRfcmFuZ2UuZW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChfX2dyYW1tYXIgPT0gRUNNQVNjcmlwdCB8fCBfX2dyYW1tYXIgPT0gYXdrKSAmJiAqX19maXJzdCA9PSAnXFwnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfX2dyYW1tYXIgPT0gRUNNQVNjcmlwdCkKKyAgICAgICAgICAgICAgICAgICAgX19maXJzdCA9IF9fcGFyc2VfY2xhc3NfZXNjYXBlKCsrX19maXJzdCwgX19sYXN0LCBfX3N0YXJ0X3JhbmdlLCBfX21sKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIF9fZmlyc3QgPSBfX3BhcnNlX2F3a19lc2NhcGUoKytfX2ZpcnN0LCBfX2xhc3QsICZfX3N0YXJ0X3JhbmdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX3N0YXJ0X3JhbmdlID0gKl9fZmlyc3Q7CisgICAgICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiAqX19maXJzdCAhPSAnXScpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fdGVtcCA9IF9WU1REOjpuZXh0KF9fZmlyc3QpOworICAgICAgICAgICAgaWYgKF9fdGVtcCAhPSBfX2xhc3QgJiYgKl9fZmlyc3QgPT0gJy0nICYmICpfX3RlbXAgIT0gJ10nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHBhcnNlIGEgcmFuZ2UKKyAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJUPiBfX2VuZF9yYW5nZTsKKyAgICAgICAgICAgICAgICBfX2ZpcnN0ID0gX190ZW1wOworICAgICAgICAgICAgICAgICsrX190ZW1wOworICAgICAgICAgICAgICAgIGlmIChfX3RlbXAgIT0gX19sYXN0ICYmICpfX2ZpcnN0ID09ICdbJyAmJiAqX190ZW1wID09ICcuJykKKyAgICAgICAgICAgICAgICAgICAgX19maXJzdCA9IF9fcGFyc2VfY29sbGF0aW5nX3N5bWJvbCgrK19fdGVtcCwgX19sYXN0LCBfX2VuZF9yYW5nZSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChfX2dyYW1tYXIgPT0gRUNNQVNjcmlwdCB8fCBfX2dyYW1tYXIgPT0gYXdrKSAmJiAqX19maXJzdCA9PSAnXFwnKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX19ncmFtbWFyID09IEVDTUFTY3JpcHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19maXJzdCA9IF9fcGFyc2VfY2xhc3NfZXNjYXBlKCsrX19maXJzdCwgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2VuZF9yYW5nZSwgX19tbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19maXJzdCA9IF9fcGFyc2VfYXdrX2VzY2FwZSgrK19fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfX2VuZF9yYW5nZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2VuZF9yYW5nZSA9ICpfX2ZpcnN0OworICAgICAgICAgICAgICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fbWwtPl9fYWRkX3JhbmdlKF9WU1REOjptb3ZlKF9fc3RhcnRfcmFuZ2UpLCBfVlNURDo6bW92ZShfX2VuZF9yYW5nZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIV9fc3RhcnRfcmFuZ2UuZW1wdHkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX19zdGFydF9yYW5nZS5zaXplKCkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgX19tbC0+X19hZGRfY2hhcihfX3N0YXJ0X3JhbmdlWzBdKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIF9fbWwtPl9fYWRkX2RpZ3JhcGgoX19zdGFydF9yYW5nZVswXSwgX19zdGFydF9yYW5nZVsxXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIV9fc3RhcnRfcmFuZ2UuZW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9fc3RhcnRfcmFuZ2Uuc2l6ZSgpID09IDEpCisgICAgICAgICAgICAgICAgX19tbC0+X19hZGRfY2hhcihfX3N0YXJ0X3JhbmdlWzBdKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfX21sLT5fX2FkZF9kaWdyYXBoKF9fc3RhcnRfcmFuZ2VbMF0sIF9fc3RhcnRfcmFuZ2VbMV0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3BhcnNlX2NsYXNzX2VzY2FwZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJUPiYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYnJhY2tldF9leHByZXNzaW9uPF9DaGFyVCwgX1RyYWl0cz4qIF9fbWwpCit7CisgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfZXNjYXBlPigpOworICAgIHN3aXRjaCAoKl9fZmlyc3QpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgICAgX19zdHIgPSAqX19maXJzdDsKKyAgICAgICAgcmV0dXJuICsrX19maXJzdDsKKyAgICBjYXNlICdiJzoKKyAgICAgICAgX19zdHIgPSBfQ2hhclQoOCk7CisgICAgICAgIHJldHVybiArK19fZmlyc3Q7CisgICAgY2FzZSAnZCc6CisgICAgICAgIF9fbWwtPl9fYWRkX2NsYXNzKGN0eXBlX2Jhc2U6OmRpZ2l0KTsKKyAgICAgICAgcmV0dXJuICsrX19maXJzdDsKKyAgICBjYXNlICdEJzoKKyAgICAgICAgX19tbC0+X19hZGRfbmVnX2NsYXNzKGN0eXBlX2Jhc2U6OmRpZ2l0KTsKKyAgICAgICAgcmV0dXJuICsrX19maXJzdDsKKyAgICBjYXNlICdzJzoKKyAgICAgICAgX19tbC0+X19hZGRfY2xhc3MoY3R5cGVfYmFzZTo6c3BhY2UpOworICAgICAgICByZXR1cm4gKytfX2ZpcnN0OworICAgIGNhc2UgJ1MnOgorICAgICAgICBfX21sLT5fX2FkZF9uZWdfY2xhc3MoY3R5cGVfYmFzZTo6c3BhY2UpOworICAgICAgICByZXR1cm4gKytfX2ZpcnN0OworICAgIGNhc2UgJ3cnOgorICAgICAgICBfX21sLT5fX2FkZF9jbGFzcyhjdHlwZV9iYXNlOjphbG51bSk7CisgICAgICAgIF9fbWwtPl9fYWRkX2NoYXIoJ18nKTsKKyAgICAgICAgcmV0dXJuICsrX19maXJzdDsKKyAgICBjYXNlICdXJzoKKyAgICAgICAgX19tbC0+X19hZGRfbmVnX2NsYXNzKGN0eXBlX2Jhc2U6OmFsbnVtKTsKKyAgICAgICAgX19tbC0+X19hZGRfbmVnX2NoYXIoJ18nKTsKKyAgICAgICAgcmV0dXJuICsrX19maXJzdDsKKyAgICB9CisgICAgX19maXJzdCA9IF9fcGFyc2VfY2hhcmFjdGVyX2VzY2FwZShfX2ZpcnN0LCBfX2xhc3QsICZfX3N0cik7CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK19Gb3J3YXJkSXRlcmF0b3IKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcGFyc2VfYXdrX2VzY2FwZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJUPiogX19zdHIpCit7CisgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfZXNjYXBlPigpOworICAgIHN3aXRjaCAoKl9fZmlyc3QpCisgICAgeworICAgIGNhc2UgJ1xcJzoKKyAgICBjYXNlICciJzoKKyAgICBjYXNlICcvJzoKKyAgICAgICAgaWYgKF9fc3RyKQorICAgICAgICAgICAgKl9fc3RyID0gKl9fZmlyc3Q7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fcHVzaF9jaGFyKCpfX2ZpcnN0KTsKKyAgICAgICAgcmV0dXJuICsrX19maXJzdDsKKyAgICBjYXNlICdhJzoKKyAgICAgICAgaWYgKF9fc3RyKQorICAgICAgICAgICAgKl9fc3RyID0gX0NoYXJUKDcpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3B1c2hfY2hhcihfQ2hhclQoNykpOworICAgICAgICByZXR1cm4gKytfX2ZpcnN0OworICAgIGNhc2UgJ2InOgorICAgICAgICBpZiAoX19zdHIpCisgICAgICAgICAgICAqX19zdHIgPSBfQ2hhclQoOCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fcHVzaF9jaGFyKF9DaGFyVCg4KSk7CisgICAgICAgIHJldHVybiArK19fZmlyc3Q7CisgICAgY2FzZSAnZic6CisgICAgICAgIGlmIChfX3N0cikKKyAgICAgICAgICAgICpfX3N0ciA9IF9DaGFyVCgweEMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3B1c2hfY2hhcihfQ2hhclQoMHhDKSk7CisgICAgICAgIHJldHVybiArK19fZmlyc3Q7CisgICAgY2FzZSAnbic6CisgICAgICAgIGlmIChfX3N0cikKKyAgICAgICAgICAgICpfX3N0ciA9IF9DaGFyVCgweEEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3B1c2hfY2hhcihfQ2hhclQoMHhBKSk7CisgICAgICAgIHJldHVybiArK19fZmlyc3Q7CisgICAgY2FzZSAncic6CisgICAgICAgIGlmIChfX3N0cikKKyAgICAgICAgICAgICpfX3N0ciA9IF9DaGFyVCgweEQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3B1c2hfY2hhcihfQ2hhclQoMHhEKSk7CisgICAgICAgIHJldHVybiArK19fZmlyc3Q7CisgICAgY2FzZSAndCc6CisgICAgICAgIGlmIChfX3N0cikKKyAgICAgICAgICAgICpfX3N0ciA9IF9DaGFyVCgweDkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3B1c2hfY2hhcihfQ2hhclQoMHg5KSk7CisgICAgICAgIHJldHVybiArK19fZmlyc3Q7CisgICAgY2FzZSAndic6CisgICAgICAgIGlmIChfX3N0cikKKyAgICAgICAgICAgICpfX3N0ciA9IF9DaGFyVCgweEIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3B1c2hfY2hhcihfQ2hhclQoMHhCKSk7CisgICAgICAgIHJldHVybiArK19fZmlyc3Q7CisgICAgfQorICAgIGlmICgnMCcgPD0gKl9fZmlyc3QgJiYgKl9fZmlyc3QgPD0gJzcnKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgX192YWwgPSAqX19maXJzdCAtICcwJzsKKyAgICAgICAgaWYgKCsrX19maXJzdCAhPSBfX2xhc3QgJiYgKCcwJyA8PSAqX19maXJzdCAmJiAqX19maXJzdCA8PSAnNycpKQorICAgICAgICB7CisgICAgICAgICAgICBfX3ZhbCA9IDggKiBfX3ZhbCArICpfX2ZpcnN0IC0gJzAnOworICAgICAgICAgICAgaWYgKCsrX19maXJzdCAhPSBfX2xhc3QgJiYgKCcwJyA8PSAqX19maXJzdCAmJiAqX19maXJzdCA8PSAnNycpKQorICAgICAgICAgICAgICAgIF9fdmFsID0gOCAqIF9fdmFsICsgKl9fZmlyc3QrKyAtICcwJzsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19zdHIpCisgICAgICAgICAgICAqX19zdHIgPSBfQ2hhclQoX192YWwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3B1c2hfY2hhcihfQ2hhclQoX192YWwpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfZXNjYXBlPigpOworICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3BhcnNlX2VxdWl2YWxlbmNlX2NsYXNzKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19icmFja2V0X2V4cHJlc3Npb248X0NoYXJULCBfVHJhaXRzPiogX19tbCkKK3sKKyAgICAvLyBGb3VuZCBbPQorICAgIC8vICAgVGhpcyBtZWFucyA9XSBtdXN0IGV4aXN0CisgICAgdmFsdWVfdHlwZSBfRXF1YWxfY2xvc2VbMl0gPSB7Jz0nLCAnXSd9OworICAgIF9Gb3J3YXJkSXRlcmF0b3IgX190ZW1wID0gX1ZTVEQ6OnNlYXJjaChfX2ZpcnN0LCBfX2xhc3QsIF9FcXVhbF9jbG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9FcXVhbF9jbG9zZSsyKTsKKyAgICBpZiAoX190ZW1wID09IF9fbGFzdCkKKyAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2JyYWNrPigpOworICAgIC8vIFtfX2ZpcnN0LCBfX3RlbXApIGNvbnRhaW5zIGFsbCB0ZXh0IGluIFs9IC4uLiA9XQorICAgIHN0cmluZ190eXBlIF9fY29sbGF0ZV9uYW1lID0KKyAgICAgICAgX190cmFpdHNfLmxvb2t1cF9jb2xsYXRlbmFtZShfX2ZpcnN0LCBfX3RlbXApOworICAgIGlmIChfX2NvbGxhdGVfbmFtZS5lbXB0eSgpKQorICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfY29sbGF0ZT4oKTsKKyAgICBzdHJpbmdfdHlwZSBfX2VxdWl2X25hbWUgPQorICAgICAgICBfX3RyYWl0c18udHJhbnNmb3JtX3ByaW1hcnkoX19jb2xsYXRlX25hbWUuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29sbGF0ZV9uYW1lLmVuZCgpKTsKKyAgICBpZiAoIV9fZXF1aXZfbmFtZS5lbXB0eSgpKQorICAgICAgICBfX21sLT5fX2FkZF9lcXVpdmFsZW5jZShfX2VxdWl2X25hbWUpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN3aXRjaCAoX19jb2xsYXRlX25hbWUuc2l6ZSgpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIF9fbWwtPl9fYWRkX2NoYXIoX19jb2xsYXRlX25hbWVbMF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIF9fbWwtPl9fYWRkX2RpZ3JhcGgoX19jb2xsYXRlX25hbWVbMF0sIF9fY29sbGF0ZV9uYW1lWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2NvbGxhdGU+KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19maXJzdCA9IF9WU1REOjpuZXh0KF9fdGVtcCwgMik7CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK19Gb3J3YXJkSXRlcmF0b3IKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcGFyc2VfY2hhcmFjdGVyX2NsYXNzKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19icmFja2V0X2V4cHJlc3Npb248X0NoYXJULCBfVHJhaXRzPiogX19tbCkKK3sKKyAgICAvLyBGb3VuZCBbOgorICAgIC8vICAgVGhpcyBtZWFucyA6XSBtdXN0IGV4aXN0CisgICAgdmFsdWVfdHlwZSBfQ29sb25fY2xvc2VbMl0gPSB7JzonLCAnXSd9OworICAgIF9Gb3J3YXJkSXRlcmF0b3IgX190ZW1wID0gX1ZTVEQ6OnNlYXJjaChfX2ZpcnN0LCBfX2xhc3QsIF9Db2xvbl9jbG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db2xvbl9jbG9zZSsyKTsKKyAgICBpZiAoX190ZW1wID09IF9fbGFzdCkKKyAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2JyYWNrPigpOworICAgIC8vIFtfX2ZpcnN0LCBfX3RlbXApIGNvbnRhaW5zIGFsbCB0ZXh0IGluIFs6IC4uLiA6XQorICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl9jbGFzc190eXBlIGNoYXJfY2xhc3NfdHlwZTsKKyAgICBjaGFyX2NsYXNzX3R5cGUgX19jbGFzc190eXBlID0KKyAgICAgICAgX190cmFpdHNfLmxvb2t1cF9jbGFzc25hbWUoX19maXJzdCwgX190ZW1wLCBfX2ZsYWdzXyAmIGljYXNlKTsKKyAgICBpZiAoX19jbGFzc190eXBlID09IDApCisgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjplcnJvcl9jdHlwZT4oKTsKKyAgICBfX21sLT5fX2FkZF9jbGFzcyhfX2NsYXNzX3R5cGUpOworICAgIF9fZmlyc3QgPSBfVlNURDo6bmV4dChfX3RlbXAsIDIpOworICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3BhcnNlX2NvbGxhdGluZ19zeW1ib2woX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJUPiYgX19jb2xfc3ltKQoreworICAgIC8vIEZvdW5kIFsuCisgICAgLy8gICBUaGlzIG1lYW5zIC5dIG11c3QgZXhpc3QKKyAgICB2YWx1ZV90eXBlIF9Eb3RfY2xvc2VbMl0gPSB7Jy4nLCAnXSd9OworICAgIF9Gb3J3YXJkSXRlcmF0b3IgX190ZW1wID0gX1ZTVEQ6OnNlYXJjaChfX2ZpcnN0LCBfX2xhc3QsIF9Eb3RfY2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRG90X2Nsb3NlKzIpOworICAgIGlmIChfX3RlbXAgPT0gX19sYXN0KQorICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYnJhY2s+KCk7CisgICAgLy8gW19fZmlyc3QsIF9fdGVtcCkgY29udGFpbnMgYWxsIHRleHQgaW4gWy4gLi4uIC5dCisgICAgX19jb2xfc3ltID0gX190cmFpdHNfLmxvb2t1cF9jb2xsYXRlbmFtZShfX2ZpcnN0LCBfX3RlbXApOworICAgIHN3aXRjaCAoX19jb2xfc3ltLnNpemUoKSkKKyAgICB7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2NvbGxhdGU+KCk7CisgICAgfQorICAgIF9fZmlyc3QgPSBfVlNURDo6bmV4dChfX3RlbXAsIDIpOworICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3BhcnNlX0RVUF9DT1VOVChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgX19jKQoreworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCApCisgICAgeworICAgICAgICBpbnQgX192YWwgPSBfX3RyYWl0c18udmFsdWUoKl9fZmlyc3QsIDEwKTsKKyAgICAgICAgaWYgKCBfX3ZhbCAhPSAtMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fYyA9IF9fdmFsOworICAgICAgICAgICAgZm9yICgrK19fZmlyc3Q7IAorICAgICAgICAgICAgICAgICBfX2ZpcnN0ICE9IF9fbGFzdCAmJiAoIF9fdmFsID0gX190cmFpdHNfLnZhbHVlKCpfX2ZpcnN0LCAxMCkpICE9IC0xOworICAgICAgICAgICAgICAgICArK19fZmlyc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9fYyA+PSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpIC8gMTApCisgICAgICAgICAgICAgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjplcnJvcl9iYWRicmFjZT4oKTsKKyAgICAgICAgICAgICAgICBfX2MgKj0gMTA7CisgICAgICAgICAgICAgICAgX19jICs9IF9fdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3BhcnNlX2VjbWFfZXhwKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+KiBfX3NhID0gX19lbmRfOworICAgIF9Gb3J3YXJkSXRlcmF0b3IgX190ZW1wID0gX19wYXJzZV9hbHRlcm5hdGl2ZShfX2ZpcnN0LCBfX2xhc3QpOworICAgIGlmIChfX3RlbXAgPT0gX19maXJzdCkKKyAgICAgICAgX19wdXNoX2VtcHR5KCk7CisgICAgX19maXJzdCA9IF9fdGVtcDsKKyAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgKl9fZmlyc3QgPT0gJ3wnKQorICAgIHsKKyAgICAgICAgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+KiBfX3NiID0gX19lbmRfOworICAgICAgICBfX3RlbXAgPSBfX3BhcnNlX2FsdGVybmF0aXZlKCsrX19maXJzdCwgX19sYXN0KTsKKyAgICAgICAgaWYgKF9fdGVtcCA9PSBfX2ZpcnN0KQorICAgICAgICAgICAgX19wdXNoX2VtcHR5KCk7CisgICAgICAgIF9fcHVzaF9hbHRlcm5hdGlvbihfX3NhLCBfX3NiKTsKKyAgICAgICAgX19maXJzdCA9IF9fdGVtcDsKKyAgICB9CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK19Gb3J3YXJkSXRlcmF0b3IKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcGFyc2VfYWx0ZXJuYXRpdmUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX190ZW1wID0gX19wYXJzZV90ZXJtKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIGlmIChfX3RlbXAgPT0gX19maXJzdCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBfX2ZpcnN0ID0gX190ZW1wOworICAgIH0KKyAgICByZXR1cm4gX19maXJzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorX0ZvcndhcmRJdGVyYXRvcgorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19wYXJzZV90ZXJtKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fdGVtcCA9IF9fcGFyc2VfYXNzZXJ0aW9uKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgaWYgKF9fdGVtcCA9PSBfX2ZpcnN0KQorICAgIHsKKyAgICAgICAgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+KiBfX2UgPSBfX2VuZF87CisgICAgICAgIHVuc2lnbmVkIF9fbWV4cF9iZWdpbiA9IF9fbWFya2VkX2NvdW50XzsKKyAgICAgICAgX190ZW1wID0gX19wYXJzZV9hdG9tKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIGlmIChfX3RlbXAgIT0gX19maXJzdCkKKyAgICAgICAgICAgIF9fZmlyc3QgPSBfX3BhcnNlX0VSRV9kdXBsX3N5bWJvbChfX3RlbXAsIF9fbGFzdCwgX19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWV4cF9iZWdpbisxLCBfX21hcmtlZF9jb3VudF8rMSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgX19maXJzdCA9IF9fdGVtcDsKKyAgICByZXR1cm4gX19maXJzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorX0ZvcndhcmRJdGVyYXRvcgorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19wYXJzZV9hc3NlcnRpb24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgc3dpdGNoICgqX19maXJzdCkKKyAgICAgICAgeworICAgICAgICBjYXNlICdeJzoKKyAgICAgICAgICAgIF9fcHVzaF9sX2FuY2hvcigpOworICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyQnOgorICAgICAgICAgICAgX19wdXNoX3JfYW5jaG9yKCk7CisgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX190ZW1wID0gX1ZTVEQ6Om5leHQoX19maXJzdCk7CisgICAgICAgICAgICAgICAgaWYgKF9fdGVtcCAhPSBfX2xhc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKl9fdGVtcCA9PSAnYicpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fcHVzaF93b3JkX2JvdW5kYXJ5KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZmlyc3QgPSArK19fdGVtcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgqX190ZW1wID09ICdCJykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX19wdXNoX3dvcmRfYm91bmRhcnkodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ZpcnN0ID0gKytfX3RlbXA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnKCc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3RlbXAgPSBfVlNURDo6bmV4dChfX2ZpcnN0KTsKKyAgICAgICAgICAgICAgICBpZiAoX190ZW1wICE9IF9fbGFzdCAmJiAqX190ZW1wID09ICc/JykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgrK19fdGVtcCAhPSBfX2xhc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKl9fdGVtcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJz0nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfcmVnZXggX19leHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZXhwLl9fZmxhZ3NfID0gX19mbGFnc187CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGVtcCA9IF9fZXhwLl9fcGFyc2UoKytfX3RlbXAsIF9fbGFzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9fbWV4cCA9IF9fZXhwLl9fbWFya2VkX2NvdW50XzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wdXNoX2xvb2thaGVhZChfVlNURDo6bW92ZShfX2V4cCksIGZhbHNlLCBfX21hcmtlZF9jb3VudF8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX21hcmtlZF9jb3VudF8gKz0gX19tZXhwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX190ZW1wID09IF9fbGFzdCB8fCAqX190ZW1wICE9ICcpJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjplcnJvcl9wYXJlbj4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19maXJzdCA9ICsrX190ZW1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyEnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfcmVnZXggX19leHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZXhwLl9fZmxhZ3NfID0gX19mbGFnc187CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGVtcCA9IF9fZXhwLl9fcGFyc2UoKytfX3RlbXAsIF9fbGFzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9fbWV4cCA9IF9fZXhwLl9fbWFya2VkX2NvdW50XzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wdXNoX2xvb2thaGVhZChfVlNURDo6bW92ZShfX2V4cCksIHRydWUsIF9fbWFya2VkX2NvdW50Xyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWFya2VkX2NvdW50XyArPSBfX21leHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX3RlbXAgPT0gX19sYXN0IHx8ICpfX3RlbXAgIT0gJyknKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX3BhcmVuPigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZpcnN0ID0gKytfX3RlbXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK19Gb3J3YXJkSXRlcmF0b3IKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcGFyc2VfYXRvbShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgc3dpdGNoICgqX19maXJzdCkKKyAgICAgICAgeworICAgICAgICBjYXNlICcuJzoKKyAgICAgICAgICAgIF9fcHVzaF9tYXRjaF9hbnlfYnV0X25ld2xpbmUoKTsKKyAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICBfX2ZpcnN0ID0gX19wYXJzZV9hdG9tX2VzY2FwZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1snOgorICAgICAgICAgICAgX19maXJzdCA9IF9fcGFyc2VfYnJhY2tldF9leHByZXNzaW9uKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnKCc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICAgICAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgICAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX3BhcmVuPigpOworICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX190ZW1wID0gX1ZTVEQ6Om5leHQoX19maXJzdCk7CisgICAgICAgICAgICAgICAgaWYgKF9fdGVtcCAhPSBfX2xhc3QgJiYgKl9fZmlyc3QgPT0gJz8nICYmICpfX3RlbXAgPT0gJzonKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytfX29wZW5fY291bnRfOworICAgICAgICAgICAgICAgICAgICBfX2ZpcnN0ID0gX19wYXJzZV9lY21hX2V4cCgrK19fdGVtcCwgX19sYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0IHx8ICpfX2ZpcnN0ICE9ICcpJykKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjplcnJvcl9wYXJlbj4oKTsKKyAgICAgICAgICAgICAgICAgICAgLS1fX29wZW5fY291bnRfOworICAgICAgICAgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9fcHVzaF9iZWdpbl9tYXJrZWRfc3ViZXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBfX3RlbXBfY291bnQgPSBfX21hcmtlZF9jb3VudF87CisgICAgICAgICAgICAgICAgICAgICsrX19vcGVuX2NvdW50XzsKKyAgICAgICAgICAgICAgICAgICAgX19maXJzdCA9IF9fcGFyc2VfZWNtYV9leHAoX19maXJzdCwgX19sYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0IHx8ICpfX2ZpcnN0ICE9ICcpJykKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjplcnJvcl9wYXJlbj4oKTsKKyAgICAgICAgICAgICAgICAgICAgX19wdXNoX2VuZF9tYXJrZWRfc3ViZXhwcmVzc2lvbihfX3RlbXBfY291bnQpOworICAgICAgICAgICAgICAgICAgICAtLV9fb3Blbl9jb3VudF87CisgICAgICAgICAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnKic6CisgICAgICAgIGNhc2UgJysnOgorICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgY2FzZSAneyc6CisgICAgICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYmFkcmVwZWF0PigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBfX2ZpcnN0ID0gX19wYXJzZV9wYXR0ZXJuX2NoYXJhY3RlcihfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK19Gb3J3YXJkSXRlcmF0b3IKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcGFyc2VfYXRvbV9lc2NhcGUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QgJiYgKl9fZmlyc3QgPT0gJ1xcJykKKyAgICB7CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX190MSA9IF9WU1REOjpuZXh0KF9fZmlyc3QpOworICAgICAgICBpZiAoX190MSA9PSBfX2xhc3QpCisgICAgICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfZXNjYXBlPigpOworCisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX190MiA9IF9fcGFyc2VfZGVjaW1hbF9lc2NhcGUoX190MSwgX19sYXN0KTsKKyAgICAgICAgaWYgKF9fdDIgIT0gX190MSkKKyAgICAgICAgICAgIF9fZmlyc3QgPSBfX3QyOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fdDIgPSBfX3BhcnNlX2NoYXJhY3Rlcl9jbGFzc19lc2NhcGUoX190MSwgX19sYXN0KTsKKyAgICAgICAgICAgIGlmIChfX3QyICE9IF9fdDEpCisgICAgICAgICAgICAgICAgX19maXJzdCA9IF9fdDI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX190MiA9IF9fcGFyc2VfY2hhcmFjdGVyX2VzY2FwZShfX3QxLCBfX2xhc3QpOworICAgICAgICAgICAgICAgIGlmIChfX3QyICE9IF9fdDEpCisgICAgICAgICAgICAgICAgICAgIF9fZmlyc3QgPSBfX3QyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3BhcnNlX2RlY2ltYWxfZXNjYXBlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgaWYgKCpfX2ZpcnN0ID09ICcwJykKKyAgICAgICAgeworICAgICAgICAgICAgX19wdXNoX2NoYXIoX0NoYXJUKCkpOworICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCcxJyA8PSAqX19maXJzdCAmJiAqX19maXJzdCA8PSAnOScpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIF9fdiA9ICpfX2ZpcnN0IC0gJzAnOworICAgICAgICAgICAgZm9yICgrK19fZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgIF9fZmlyc3QgIT0gX19sYXN0ICYmICcwJyA8PSAqX19maXJzdCAmJiAqX19maXJzdCA8PSAnOSc7ICsrX19maXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9fdiA+PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkgLyAxMCkKKyAgICAgICAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2JhY2tyZWY+KCk7CisgICAgICAgICAgICAgICAgX192ID0gMTAgKiBfX3YgKyAqX19maXJzdCAtICcwJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX192ID09IDAgfHwgX192ID4gbWFya19jb3VudCgpKQorICAgICAgICAgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjplcnJvcl9iYWNrcmVmPigpOworICAgICAgICAgICAgX19wdXNoX2JhY2tfcmVmKF9fdik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK19Gb3J3YXJkSXRlcmF0b3IKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcGFyc2VfY2hhcmFjdGVyX2NsYXNzX2VzY2FwZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgX19icmFja2V0X2V4cHJlc3Npb248X0NoYXJULCBfVHJhaXRzPiogX19tbDsKKyAgICAgICAgc3dpdGNoICgqX19maXJzdCkKKyAgICAgICAgeworICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgIF9fbWwgPSBfX3N0YXJ0X21hdGNoaW5nX2xpc3QoZmFsc2UpOworICAgICAgICAgICAgX19tbC0+X19hZGRfY2xhc3MoY3R5cGVfYmFzZTo6ZGlnaXQpOworICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgX19tbCA9IF9fc3RhcnRfbWF0Y2hpbmdfbGlzdCh0cnVlKTsKKyAgICAgICAgICAgIF9fbWwtPl9fYWRkX2NsYXNzKGN0eXBlX2Jhc2U6OmRpZ2l0KTsKKyAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgIF9fbWwgPSBfX3N0YXJ0X21hdGNoaW5nX2xpc3QoZmFsc2UpOworICAgICAgICAgICAgX19tbC0+X19hZGRfY2xhc3MoY3R5cGVfYmFzZTo6c3BhY2UpOworICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1MnOgorICAgICAgICAgICAgX19tbCA9IF9fc3RhcnRfbWF0Y2hpbmdfbGlzdCh0cnVlKTsKKyAgICAgICAgICAgIF9fbWwtPl9fYWRkX2NsYXNzKGN0eXBlX2Jhc2U6OnNwYWNlKTsKKyAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd3JzoKKyAgICAgICAgICAgIF9fbWwgPSBfX3N0YXJ0X21hdGNoaW5nX2xpc3QoZmFsc2UpOworICAgICAgICAgICAgX19tbC0+X19hZGRfY2xhc3MoY3R5cGVfYmFzZTo6YWxudW0pOworICAgICAgICAgICAgX19tbC0+X19hZGRfY2hhcignXycpOworICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1cnOgorICAgICAgICAgICAgX19tbCA9IF9fc3RhcnRfbWF0Y2hpbmdfbGlzdCh0cnVlKTsKKyAgICAgICAgICAgIF9fbWwtPl9fYWRkX2NsYXNzKGN0eXBlX2Jhc2U6OmFsbnVtKTsKKyAgICAgICAgICAgIF9fbWwtPl9fYWRkX2NoYXIoJ18nKTsKKyAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3BhcnNlX2NoYXJhY3Rlcl9lc2NhcGUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQ+KiBfX3N0cikKK3sKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisgICAgeworICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fdDsKKyAgICAgICAgdW5zaWduZWQgX19zdW0gPSAwOworICAgICAgICBpbnQgX19oZDsKKyAgICAgICAgc3dpdGNoICgqX19maXJzdCkKKyAgICAgICAgeworICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICAgIGlmIChfX3N0cikKKyAgICAgICAgICAgICAgICAqX19zdHIgPSBfQ2hhclQoMHhDKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfX3B1c2hfY2hhcihfQ2hhclQoMHhDKSk7CisgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICBpZiAoX19zdHIpCisgICAgICAgICAgICAgICAgKl9fc3RyID0gX0NoYXJUKDB4QSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX19wdXNoX2NoYXIoX0NoYXJUKDB4QSkpOworICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgaWYgKF9fc3RyKQorICAgICAgICAgICAgICAgICpfX3N0ciA9IF9DaGFyVCgweEQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9fcHVzaF9jaGFyKF9DaGFyVCgweEQpKTsKKyAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgIGlmIChfX3N0cikKKyAgICAgICAgICAgICAgICAqX19zdHIgPSBfQ2hhclQoMHg5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfX3B1c2hfY2hhcihfQ2hhclQoMHg5KSk7CisgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgICBpZiAoX19zdHIpCisgICAgICAgICAgICAgICAgKl9fc3RyID0gX0NoYXJUKDB4Qik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX19wdXNoX2NoYXIoX0NoYXJUKDB4QikpOworICAgICAgICAgICAgKytfX2ZpcnN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgaWYgKChfX3QgPSBfVlNURDo6bmV4dChfX2ZpcnN0KSkgIT0gX19sYXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoJ0EnIDw9ICpfX3QgJiYgKl9fdCA8PSAnWicpIHx8IAorICAgICAgICAgICAgICAgICAgICAoJ2EnIDw9ICpfX3QgJiYgKl9fdCA8PSAneicpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fc3RyKQorICAgICAgICAgICAgICAgICAgICAgICAgKl9fc3RyID0gX0NoYXJUKCpfX3QgJSAzMik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fcHVzaF9jaGFyKF9DaGFyVCgqX190ICUgMzIpKTsKKyAgICAgICAgICAgICAgICAgICAgX19maXJzdCA9ICsrX190OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfZXNjYXBlPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjplcnJvcl9lc2NhcGU+KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2VzY2FwZT4oKTsKKyAgICAgICAgICAgIF9faGQgPSBfX3RyYWl0c18udmFsdWUoKl9fZmlyc3QsIDE2KTsKKyAgICAgICAgICAgIGlmIChfX2hkID09IC0xKQorICAgICAgICAgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjplcnJvcl9lc2NhcGU+KCk7CisgICAgICAgICAgICBfX3N1bSA9IDE2ICogX19zdW0gKyBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oX19oZCk7CisgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2VzY2FwZT4oKTsKKyAgICAgICAgICAgIF9faGQgPSBfX3RyYWl0c18udmFsdWUoKl9fZmlyc3QsIDE2KTsKKyAgICAgICAgICAgIGlmIChfX2hkID09IC0xKQorICAgICAgICAgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjplcnJvcl9lc2NhcGU+KCk7CisgICAgICAgICAgICBfX3N1bSA9IDE2ICogX19zdW0gKyBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oX19oZCk7CisgICAgICAgICAgICAvLyBkcm9wIHRocm91Z2gKKyAgICAgICAgY2FzZSAneCc6CisgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2VzY2FwZT4oKTsKKyAgICAgICAgICAgIF9faGQgPSBfX3RyYWl0c18udmFsdWUoKl9fZmlyc3QsIDE2KTsKKyAgICAgICAgICAgIGlmIChfX2hkID09IC0xKQorICAgICAgICAgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjplcnJvcl9lc2NhcGU+KCk7CisgICAgICAgICAgICBfX3N1bSA9IDE2ICogX19zdW0gKyBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oX19oZCk7CisgICAgICAgICAgICArK19fZmlyc3Q7CisgICAgICAgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2VzY2FwZT4oKTsKKyAgICAgICAgICAgIF9faGQgPSBfX3RyYWl0c18udmFsdWUoKl9fZmlyc3QsIDE2KTsKKyAgICAgICAgICAgIGlmIChfX2hkID09IC0xKQorICAgICAgICAgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjplcnJvcl9lc2NhcGU+KCk7CisgICAgICAgICAgICBfX3N1bSA9IDE2ICogX19zdW0gKyBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oX19oZCk7CisgICAgICAgICAgICBpZiAoX19zdHIpCisgICAgICAgICAgICAgICAgKl9fc3RyID0gX0NoYXJUKF9fc3VtKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfX3B1c2hfY2hhcihfQ2hhclQoX19zdW0pKTsKKyAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICcwJzoKKyAgICAgICAgICAgIGlmIChfX3N0cikKKyAgICAgICAgICAgICAgICAqX19zdHIgPSBfQ2hhclQoMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX19wdXNoX2NoYXIoX0NoYXJUKDApKTsKKyAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKCpfX2ZpcnN0ICE9ICdfJyAmJiAhX190cmFpdHNfLmlzY3R5cGUoKl9fZmlyc3QsIGN0eXBlX2Jhc2U6OmFsbnVtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX19zdHIpCisgICAgICAgICAgICAgICAgICAgICpfX3N0ciA9ICpfX2ZpcnN0OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgX19wdXNoX2NoYXIoKl9fZmlyc3QpOworICAgICAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfZXNjYXBlPigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fZmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK19Gb3J3YXJkSXRlcmF0b3IKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcGFyc2VfcGF0dGVybl9jaGFyYWN0ZXIoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisgICAgeworICAgICAgICBzd2l0Y2ggKCpfX2ZpcnN0KQorICAgICAgICB7CisgICAgICAgIGNhc2UgJ14nOgorICAgICAgICBjYXNlICckJzoKKyAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICBjYXNlICcuJzoKKyAgICAgICAgY2FzZSAnKic6CisgICAgICAgIGNhc2UgJysnOgorICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgY2FzZSAnKCc6CisgICAgICAgIGNhc2UgJyknOgorICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgY2FzZSAnXSc6CisgICAgICAgIGNhc2UgJ3snOgorICAgICAgICBjYXNlICd9JzoKKyAgICAgICAgY2FzZSAnfCc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIF9fcHVzaF9jaGFyKCpfX2ZpcnN0KTsKKyAgICAgICAgICAgICsrX19maXJzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX2ZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CitfRm9yd2FyZEl0ZXJhdG9yCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3BhcnNlX2dyZXAoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworICAgIF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPiogX19zYSA9IF9fZW5kXzsKKyAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fdDEgPSBfVlNURDo6ZmluZChfX2ZpcnN0LCBfX2xhc3QsIF9DaGFyVCgnXG4nKSk7CisgICAgaWYgKF9fdDEgIT0gX19maXJzdCkKKyAgICAgICAgX19wYXJzZV9iYXNpY19yZWdfZXhwKF9fZmlyc3QsIF9fdDEpOworICAgIGVsc2UKKyAgICAgICAgX19wdXNoX2VtcHR5KCk7CisgICAgX19maXJzdCA9IF9fdDE7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgICAgICArK19fZmlyc3Q7CisgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgX190MSA9IF9WU1REOjpmaW5kKF9fZmlyc3QsIF9fbGFzdCwgX0NoYXJUKCdcbicpKTsKKyAgICAgICAgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+KiBfX3NiID0gX19lbmRfOworICAgICAgICBpZiAoX190MSAhPSBfX2ZpcnN0KQorICAgICAgICAgICAgX19wYXJzZV9iYXNpY19yZWdfZXhwKF9fZmlyc3QsIF9fdDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3B1c2hfZW1wdHkoKTsKKyAgICAgICAgX19wdXNoX2FsdGVybmF0aW9uKF9fc2EsIF9fc2IpOworICAgICAgICBfX2ZpcnN0ID0gX190MTsKKyAgICAgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgICAgICAgICAgKytfX2ZpcnN0OworICAgIH0KKyAgICByZXR1cm4gX19maXJzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorX0ZvcndhcmRJdGVyYXRvcgorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19wYXJzZV9lZ3JlcChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworICAgIF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPiogX19zYSA9IF9fZW5kXzsKKyAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fdDEgPSBfVlNURDo6ZmluZChfX2ZpcnN0LCBfX2xhc3QsIF9DaGFyVCgnXG4nKSk7CisgICAgaWYgKF9fdDEgIT0gX19maXJzdCkKKyAgICAgICAgX19wYXJzZV9leHRlbmRlZF9yZWdfZXhwKF9fZmlyc3QsIF9fdDEpOworICAgIGVsc2UKKyAgICAgICAgX19wdXNoX2VtcHR5KCk7CisgICAgX19maXJzdCA9IF9fdDE7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgICAgICArK19fZmlyc3Q7CisgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyAgICAgICAgX190MSA9IF9WU1REOjpmaW5kKF9fZmlyc3QsIF9fbGFzdCwgX0NoYXJUKCdcbicpKTsKKyAgICAgICAgX19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+KiBfX3NiID0gX19lbmRfOworICAgICAgICBpZiAoX190MSAhPSBfX2ZpcnN0KQorICAgICAgICAgICAgX19wYXJzZV9leHRlbmRlZF9yZWdfZXhwKF9fZmlyc3QsIF9fdDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3B1c2hfZW1wdHkoKTsKKyAgICAgICAgX19wdXNoX2FsdGVybmF0aW9uKF9fc2EsIF9fc2IpOworICAgICAgICBfX2ZpcnN0ID0gX190MTsKKyAgICAgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgICAgICAgICAgKytfX2ZpcnN0OworICAgIH0KKyAgICByZXR1cm4gX19maXJzdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcHVzaF9sb29wKHNpemVfdCBfX21pbiwgc2l6ZV90IF9fbWF4LAorICAgICAgICBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4qIF9fcywgc2l6ZV90IF9fbWV4cF9iZWdpbiwgc2l6ZV90IF9fbWV4cF9lbmQsCisgICAgICAgIGJvb2wgX19ncmVlZHkpCit7CisgICAgdW5pcXVlX3B0cjxfX2VtcHR5X3N0YXRlPF9DaGFyVD4gPiBfX2UxKG5ldyBfX2VtcHR5X3N0YXRlPF9DaGFyVD4oX19lbmRfLT5maXJzdCgpKSk7CisgICAgX19lbmRfLT5maXJzdCgpID0gbnVsbHB0cjsKKyAgICB1bmlxdWVfcHRyPF9fbG9vcDxfQ2hhclQ+ID4gX19lMihuZXcgX19sb29wPF9DaGFyVD4oX19sb29wX2NvdW50XywKKyAgICAgICAgICAgICAgICBfX3MtPmZpcnN0KCksIF9fZTEuZ2V0KCksIF9fbWV4cF9iZWdpbiwgX19tZXhwX2VuZCwgX19ncmVlZHksCisgICAgICAgICAgICAgICAgX19taW4sIF9fbWF4KSk7CisgICAgX19zLT5maXJzdCgpID0gbnVsbHB0cjsKKyAgICBfX2UxLnJlbGVhc2UoKTsKKyAgICBfX2VuZF8tPmZpcnN0KCkgPSBuZXcgX19yZXBlYXRfb25lX2xvb3A8X0NoYXJUPihfX2UyLmdldCgpKTsKKyAgICBfX2VuZF8gPSBfX2UyLT5zZWNvbmQoKTsKKyAgICBfX3MtPmZpcnN0KCkgPSBfX2UyLnJlbGVhc2UoKTsKKyAgICArK19fbG9vcF9jb3VudF87Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3B1c2hfY2hhcih2YWx1ZV90eXBlIF9fYykKK3sKKyAgICBpZiAoZmxhZ3MoKSAmIGljYXNlKQorICAgICAgICBfX2VuZF8tPmZpcnN0KCkgPSBuZXcgX19tYXRjaF9jaGFyX2ljYXNlPF9DaGFyVCwgX1RyYWl0cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX190cmFpdHNfLCBfX2MsIF9fZW5kXy0+Zmlyc3QoKSk7CisgICAgZWxzZSBpZiAoZmxhZ3MoKSAmIGNvbGxhdGUpCisgICAgICAgIF9fZW5kXy0+Zmlyc3QoKSA9IG5ldyBfX21hdGNoX2NoYXJfY29sbGF0ZTxfQ2hhclQsIF9UcmFpdHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdHJhaXRzXywgX19jLCBfX2VuZF8tPmZpcnN0KCkpOworICAgIGVsc2UKKyAgICAgICAgX19lbmRfLT5maXJzdCgpID0gbmV3IF9fbWF0Y2hfY2hhcjxfQ2hhclQ+KF9fYywgX19lbmRfLT5maXJzdCgpKTsKKyAgICBfX2VuZF8gPSBzdGF0aWNfY2FzdDxfX293bnNfb25lX3N0YXRlPF9DaGFyVD4qPihfX2VuZF8tPmZpcnN0KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZAorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19wdXNoX2JlZ2luX21hcmtlZF9zdWJleHByZXNzaW9uKCkKK3sKKyAgICBpZiAoIShfX2ZsYWdzXyAmIG5vc3VicykpCisgICAgeworICAgICAgICBfX2VuZF8tPmZpcnN0KCkgPQorICAgICAgICAgICAgICAgIG5ldyBfX2JlZ2luX21hcmtlZF9zdWJleHByZXNzaW9uPF9DaGFyVD4oKytfX21hcmtlZF9jb3VudF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2VuZF8tPmZpcnN0KCkpOworICAgICAgICBfX2VuZF8gPSBzdGF0aWNfY2FzdDxfX293bnNfb25lX3N0YXRlPF9DaGFyVD4qPihfX2VuZF8tPmZpcnN0KCkpOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcHVzaF9lbmRfbWFya2VkX3N1YmV4cHJlc3Npb24odW5zaWduZWQgX19zdWIpCit7CisgICAgaWYgKCEoX19mbGFnc18gJiBub3N1YnMpKQorICAgIHsKKyAgICAgICAgX19lbmRfLT5maXJzdCgpID0KKyAgICAgICAgICAgICAgICBuZXcgX19lbmRfbWFya2VkX3N1YmV4cHJlc3Npb248X0NoYXJUPihfX3N1YiwgX19lbmRfLT5maXJzdCgpKTsKKyAgICAgICAgX19lbmRfID0gc3RhdGljX2Nhc3Q8X19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+Kj4oX19lbmRfLT5maXJzdCgpKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3B1c2hfbF9hbmNob3IoKQoreworICAgIF9fZW5kXy0+Zmlyc3QoKSA9IG5ldyBfX2xfYW5jaG9yPF9DaGFyVD4oX19lbmRfLT5maXJzdCgpKTsKKyAgICBfX2VuZF8gPSBzdGF0aWNfY2FzdDxfX293bnNfb25lX3N0YXRlPF9DaGFyVD4qPihfX2VuZF8tPmZpcnN0KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZAorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19wdXNoX3JfYW5jaG9yKCkKK3sKKyAgICBfX2VuZF8tPmZpcnN0KCkgPSBuZXcgX19yX2FuY2hvcjxfQ2hhclQ+KF9fZW5kXy0+Zmlyc3QoKSk7CisgICAgX19lbmRfID0gc3RhdGljX2Nhc3Q8X19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+Kj4oX19lbmRfLT5maXJzdCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcHVzaF9tYXRjaF9hbnkoKQoreworICAgIF9fZW5kXy0+Zmlyc3QoKSA9IG5ldyBfX21hdGNoX2FueTxfQ2hhclQ+KF9fZW5kXy0+Zmlyc3QoKSk7CisgICAgX19lbmRfID0gc3RhdGljX2Nhc3Q8X19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+Kj4oX19lbmRfLT5maXJzdCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcHVzaF9tYXRjaF9hbnlfYnV0X25ld2xpbmUoKQoreworICAgIF9fZW5kXy0+Zmlyc3QoKSA9IG5ldyBfX21hdGNoX2FueV9idXRfbmV3bGluZTxfQ2hhclQ+KF9fZW5kXy0+Zmlyc3QoKSk7CisgICAgX19lbmRfID0gc3RhdGljX2Nhc3Q8X19vd25zX29uZV9zdGF0ZTxfQ2hhclQ+Kj4oX19lbmRfLT5maXJzdCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3ZvaWQKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fcHVzaF9lbXB0eSgpCit7CisgICAgX19lbmRfLT5maXJzdCgpID0gbmV3IF9fZW1wdHlfc3RhdGU8X0NoYXJUPihfX2VuZF8tPmZpcnN0KCkpOworICAgIF9fZW5kXyA9IHN0YXRpY19jYXN0PF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPio+KF9fZW5kXy0+Zmlyc3QoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3B1c2hfd29yZF9ib3VuZGFyeShib29sIF9faW52ZXJ0KQoreworICAgIF9fZW5kXy0+Zmlyc3QoKSA9IG5ldyBfX3dvcmRfYm91bmRhcnk8X0NoYXJULCBfVHJhaXRzPihfX3RyYWl0c18sIF9faW52ZXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2VuZF8tPmZpcnN0KCkpOworICAgIF9fZW5kXyA9IHN0YXRpY19jYXN0PF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPio+KF9fZW5kXy0+Zmlyc3QoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3B1c2hfYmFja19yZWYoaW50IF9faSkKK3sKKyAgICBpZiAoZmxhZ3MoKSAmIGljYXNlKQorICAgICAgICBfX2VuZF8tPmZpcnN0KCkgPSBuZXcgX19iYWNrX3JlZl9pY2FzZTxfQ2hhclQsIF9UcmFpdHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdHJhaXRzXywgX19pLCBfX2VuZF8tPmZpcnN0KCkpOworICAgIGVsc2UgaWYgKGZsYWdzKCkgJiBjb2xsYXRlKQorICAgICAgICBfX2VuZF8tPmZpcnN0KCkgPSBuZXcgX19iYWNrX3JlZl9jb2xsYXRlPF9DaGFyVCwgX1RyYWl0cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX190cmFpdHNfLCBfX2ksIF9fZW5kXy0+Zmlyc3QoKSk7CisgICAgZWxzZQorICAgICAgICBfX2VuZF8tPmZpcnN0KCkgPSBuZXcgX19iYWNrX3JlZjxfQ2hhclQ+KF9faSwgX19lbmRfLT5maXJzdCgpKTsKKyAgICBfX2VuZF8gPSBzdGF0aWNfY2FzdDxfX293bnNfb25lX3N0YXRlPF9DaGFyVD4qPihfX2VuZF8tPmZpcnN0KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordm9pZAorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19wdXNoX2FsdGVybmF0aW9uKF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPiogX19zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX293bnNfb25lX3N0YXRlPF9DaGFyVD4qIF9fZWEpCit7CisgICAgX19zYS0+Zmlyc3QoKSA9IG5ldyBfX2FsdGVybmF0ZTxfQ2hhclQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPio+KF9fc2EtPmZpcnN0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPio+KF9fZWEtPmZpcnN0KCkpKTsKKyAgICBfX2VhLT5maXJzdCgpID0gbnVsbHB0cjsKKyAgICBfX2VhLT5maXJzdCgpID0gbmV3IF9fZW1wdHlfc3RhdGU8X0NoYXJUPihfX2VuZF8tPmZpcnN0KCkpOworICAgIF9fZW5kXy0+Zmlyc3QoKSA9IG51bGxwdHI7CisgICAgX19lbmRfLT5maXJzdCgpID0gbmV3IF9fZW1wdHlfbm9uX293bl9zdGF0ZTxfQ2hhclQ+KF9fZWEtPmZpcnN0KCkpOworICAgIF9fZW5kXyA9IHN0YXRpY19jYXN0PF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPio+KF9fZWEtPmZpcnN0KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX19icmFja2V0X2V4cHJlc3Npb248X0NoYXJULCBfVHJhaXRzPioKK2Jhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz46Ol9fc3RhcnRfbWF0Y2hpbmdfbGlzdChib29sIF9fbmVnYXRlKQoreworICAgIF9fYnJhY2tldF9leHByZXNzaW9uPF9DaGFyVCwgX1RyYWl0cz4qIF9fciA9CisgICAgICAgIG5ldyBfX2JyYWNrZXRfZXhwcmVzc2lvbjxfQ2hhclQsIF9UcmFpdHM+KF9fdHJhaXRzXywgX19lbmRfLT5maXJzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25lZ2F0ZSwgX19mbGFnc18gJiBpY2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mbGFnc18gJiBjb2xsYXRlKTsKKyAgICBfX2VuZF8tPmZpcnN0KCkgPSBfX3I7CisgICAgX19lbmRfID0gX19yOworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX3B1c2hfbG9va2FoZWFkKGNvbnN0IGJhc2ljX3JlZ2V4JiBfX2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2ludmVydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgX19tZXhwKQoreworICAgIF9fZW5kXy0+Zmlyc3QoKSA9IG5ldyBfX2xvb2thaGVhZDxfQ2hhclQsIF9UcmFpdHM+KF9fZXhwLCBfX2ludmVydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19lbmRfLT5maXJzdCgpLCBfX21leHApOworICAgIF9fZW5kXyA9IHN0YXRpY19jYXN0PF9fb3duc19vbmVfc3RhdGU8X0NoYXJUPio+KF9fZW5kXy0+Zmlyc3QoKSk7Cit9CisKK3R5cGVkZWYgYmFzaWNfcmVnZXg8Y2hhcj4gICAgcmVnZXg7Cit0eXBlZGVmIGJhc2ljX3JlZ2V4PHdjaGFyX3Q+IHdyZWdleDsKKworLy8gc3ViX21hdGNoCisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgc3ViX21hdGNoCisgICAgOiBwdWJsaWMgcGFpcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgoreworcHVibGljOgorICAgIHR5cGVkZWYgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPGl0ZXJhdG9yPjo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8aXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPHZhbHVlX3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190eXBlOworCisgICAgYm9vbCBtYXRjaGVkOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9MSUJDUFBfQ09OU1RFWFBSIHN1Yl9tYXRjaCgpIDogbWF0Y2hlZCgpIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZGlmZmVyZW5jZV90eXBlIGxlbmd0aCgpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gbWF0Y2hlZCA/IF9WU1REOjpkaXN0YW5jZSh0aGlzLT5maXJzdCwgdGhpcy0+c2Vjb25kKSA6IDA7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdHJpbmdfdHlwZSBzdHIoKSBjb25zdAorICAgICAgICB7cmV0dXJuIG1hdGNoZWQgPyBzdHJpbmdfdHlwZSh0aGlzLT5maXJzdCwgdGhpcy0+c2Vjb25kKSA6IHN0cmluZ190eXBlKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvciBzdHJpbmdfdHlwZSgpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gc3RyKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGludCBjb21wYXJlKGNvbnN0IHN1Yl9tYXRjaCYgX19zKSBjb25zdAorICAgICAgICB7cmV0dXJuIHN0cigpLmNvbXBhcmUoX19zLnN0cigpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGludCBjb21wYXJlKGNvbnN0IHN0cmluZ190eXBlJiBfX3MpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gc3RyKCkuY29tcGFyZShfX3MpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaW50IGNvbXBhcmUoY29uc3QgdmFsdWVfdHlwZSogX19zKSBjb25zdAorICAgICAgICB7cmV0dXJuIHN0cigpLmNvbXBhcmUoX19zKTt9Cit9OworCit0eXBlZGVmIHN1Yl9tYXRjaDxjb25zdCBjaGFyKj4gICAgICAgICAgICAgY3N1Yl9tYXRjaDsKK3R5cGVkZWYgc3ViX21hdGNoPGNvbnN0IHdjaGFyX3QqPiAgICAgICAgICB3Y3N1Yl9tYXRjaDsKK3R5cGVkZWYgc3ViX21hdGNoPHN0cmluZzo6Y29uc3RfaXRlcmF0b3I+ICBzc3ViX21hdGNoOwordHlwZWRlZiBzdWJfbWF0Y2g8d3N0cmluZzo6Y29uc3RfaXRlcmF0b3I+IHdzc3ViX21hdGNoOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj09KGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX194LCBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9feSkKK3sKKyAgICByZXR1cm4gX194LmNvbXBhcmUoX195KSA9PSAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX194LCBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPT0gX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaUl0ZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8KGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX194LCBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9feSkKK3sKKyAgICByZXR1cm4gX194LmNvbXBhcmUoX195KSA8IDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlJdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPD0oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3gsIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX195KQoreworICAgIHJldHVybiAhKF9feSA8IF9feCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlJdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPj0oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3gsIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX195KQoreworICAgIHJldHVybiAhKF9feCA8IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlJdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPihjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9feCwgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feSA8IF9feDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaUl0ZXIsIGNsYXNzIF9TVCwgY2xhc3MgX1NBPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgYmFzaWNfc3RyaW5nPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6dmFsdWVfdHlwZSwgX1NULCBfU0E+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX195KQoreworICAgIHJldHVybiBfX3kuY29tcGFyZSh0eXBlbmFtZSBzdWJfbWF0Y2g8X0JpSXRlcj46OnN0cmluZ190eXBlKF9feC5kYXRhKCksIF9feC5zaXplKCkpKSA9PSAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlciwgY2xhc3MgX1NULCBjbGFzcyBfU0E+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBiYXNpY19zdHJpbmc8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlLCBfU1QsIF9TQT4mIF9feCwKKyAgICAgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194ID09IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlJdGVyLCBjbGFzcyBfU1QsIGNsYXNzIF9TQT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjwoY29uc3QgYmFzaWNfc3RyaW5nPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6dmFsdWVfdHlwZSwgX1NULCBfU0E+JiBfX3gsCisgICAgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feS5jb21wYXJlKHR5cGVuYW1lIHN1Yl9tYXRjaDxfQmlJdGVyPjo6c3RyaW5nX3R5cGUoX194LmRhdGEoKSwgX194LnNpemUoKSkpID4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaUl0ZXIsIGNsYXNzIF9TVCwgY2xhc3MgX1NBPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPihjb25zdCBiYXNpY19zdHJpbmc8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlLCBfU1QsIF9TQT4mIF9feCwKKyAgICAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9feSkKK3sKKyAgICByZXR1cm4gX195IDwgX194OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlciwgY2xhc3MgX1NULCBjbGFzcyBfU0E+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBvcGVyYXRvcj49KGNvbnN0IGJhc2ljX3N0cmluZzx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpSXRlcj46OnZhbHVlX3R5cGUsIF9TVCwgX1NBPiYgX194LAorICAgICAgICAgICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX195KQoreworICAgIHJldHVybiAhKF9feCA8IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlJdGVyLCBjbGFzcyBfU1QsIGNsYXNzIF9TQT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjw9KGNvbnN0IGJhc2ljX3N0cmluZzx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpSXRlcj46OnZhbHVlX3R5cGUsIF9TVCwgX1NBPiYgX194LAorICAgICAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3kgPCBfX3gpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlciwgY2xhc3MgX1NULCBjbGFzcyBfU0E+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9feCwKKyAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6dmFsdWVfdHlwZSwgX1NULCBfU0E+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5jb21wYXJlKHR5cGVuYW1lIHN1Yl9tYXRjaDxfQmlJdGVyPjo6c3RyaW5nX3R5cGUoX195LmRhdGEoKSwgX195LnNpemUoKSkpID09IDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlJdGVyLCBjbGFzcyBfU1QsIGNsYXNzIF9TQT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX194LAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlLCBfU1QsIF9TQT4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPT0gX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaUl0ZXIsIGNsYXNzIF9TVCwgY2xhc3MgX1NBPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPChjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9feCwKKyAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlLCBfU1QsIF9TQT4mIF9feSkKK3sKKyAgICByZXR1cm4gX194LmNvbXBhcmUodHlwZW5hbWUgc3ViX21hdGNoPF9CaUl0ZXI+OjpzdHJpbmdfdHlwZShfX3kuZGF0YSgpLCBfX3kuc2l6ZSgpKSkgPCAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlciwgY2xhc3MgX1NULCBjbGFzcyBfU0E+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBvcGVyYXRvcj4oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3gsCisgICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlLCBfU1QsIF9TQT4mIF9feSkKK3sKKyAgICByZXR1cm4gX195IDwgX194OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlciwgY2xhc3MgX1NULCBjbGFzcyBfU0E+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+PShjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9feCwKKyAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6dmFsdWVfdHlwZSwgX1NULCBfU0E+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194IDwgX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaUl0ZXIsIGNsYXNzIF9TVCwgY2xhc3MgX1NBPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPD0oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpSXRlcj46OnZhbHVlX3R5cGUsIF9TVCwgX1NBPiYgX195KQoreworICAgIHJldHVybiAhKF9feSA8IF9feCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlJdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPT0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX3gsCisgICAgICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX195KQoreworICAgIHJldHVybiBfX3kuY29tcGFyZShfX3gpID09IDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlJdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yIT0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX3gsCisgICAgICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX195KQoreworICAgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjwodHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX3gsCisgICAgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feS5jb21wYXJlKF9feCkgPiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj4odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX3gsCisgICAgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feSA8IF9feDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaUl0ZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+PSh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpSXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9feCwKKyAgICAgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194IDwgX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaUl0ZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8PSh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpSXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9feCwKKyAgICAgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX195IDwgX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaUl0ZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9feCwKKyAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5jb21wYXJlKF9feSkgPT0gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaUl0ZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9feCwKKyAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX3kpCit7CisgICAgcmV0dXJuICEoX194ID09IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlJdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPChjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9feCwKKyAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpSXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9feSkKK3sKKyAgICByZXR1cm4gX194LmNvbXBhcmUoX195KSA8IDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlJdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPihjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9feCwKKyAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpSXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9feSkKK3sKKyAgICByZXR1cm4gX195IDwgX194OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj49KGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX194LAorICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpSXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPCBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjw9KGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX194LAorICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpSXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3kgPCBfX3gpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj09KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX194LAorICAgICAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9feSkKK3sKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpSXRlcj46OnZhbHVlX3R5cGU+IHN0cmluZ190eXBlOworICAgIHJldHVybiBfX3kuY29tcGFyZShzdHJpbmdfdHlwZSgxLCBfX3gpKSA9PSAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX194LAorICAgICAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPT0gX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaUl0ZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX194LAorICAgICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX195KQoreworICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6dmFsdWVfdHlwZT4gc3RyaW5nX3R5cGU7CisgICAgcmV0dXJuIF9feS5jb21wYXJlKHN0cmluZ190eXBlKDEsIF9feCkpID4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaUl0ZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX194LAorICAgICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX195KQoreworICAgIHJldHVybiBfX3kgPCBfX3g7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlJdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPj0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3gsCisgICAgICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX195KQoreworICAgIHJldHVybiAhKF9feCA8IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlJdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPD0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3gsCisgICAgICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX195KQoreworICAgIHJldHVybiAhKF9feSA8IF9feCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlJdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3gsCisgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX195KQoreworICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6dmFsdWVfdHlwZT4gc3RyaW5nX3R5cGU7CisgICAgcmV0dXJuIF9feC5jb21wYXJlKHN0cmluZ190eXBlKDEsIF9feSkpID09IDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlJdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yIT0oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3gsCisgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX195KQoreworICAgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjwoY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3gsCisgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3kpCit7CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlPiBzdHJpbmdfdHlwZTsKKyAgICByZXR1cm4gX194LmNvbXBhcmUoc3RyaW5nX3R5cGUoMSwgX195KSkgPCAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj4oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3gsCisgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3kpCit7CisgICAgcmV0dXJuIF9feSA8IF9feDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaUl0ZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+PShjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9feCwKKyAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194IDwgX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaUl0ZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8PShjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9feCwKKyAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3kpCit7CisgICAgcmV0dXJuICEoX195IDwgX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1NULCBjbGFzcyBfQmlJdGVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfU1Q+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1NUPiYgX19vcywgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX20pCit7CisgICAgcmV0dXJuIF9fb3MgPDwgX19tLnN0cigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX0FsbG9jYXRvcj4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIG1hdGNoX3Jlc3VsdHMKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9BbGxvY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgdHlwZWRlZiBzdWJfbWF0Y2g8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4gICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7Citwcml2YXRlOgorICAgIHR5cGVkZWYgdmVjdG9yPHZhbHVlX3R5cGUsIGFsbG9jYXRvcl90eXBlPiAgICAgICAgICAgICAgICBfX2NvbnRhaW5lcl90eXBlOworCisgICAgX19jb250YWluZXJfdHlwZSAgX19tYXRjaGVzXzsKKyAgICB2YWx1ZV90eXBlIF9fdW5tYXRjaGVkXzsKKyAgICB2YWx1ZV90eXBlIF9fcHJlZml4XzsKKyAgICB2YWx1ZV90eXBlIF9fc3VmZml4XzsKKyAgICBib29sICAgICAgIF9fcmVhZHlfOworcHVibGljOgorICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19wb3NpdGlvbl9zdGFydF87CisgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19jb250YWluZXJfdHlwZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPjo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcl90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190eXBlOworCisgICAgLy8gY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICBleHBsaWNpdCBtYXRjaF9yZXN1bHRzKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKy8vICAgIG1hdGNoX3Jlc3VsdHMoY29uc3QgbWF0Y2hfcmVzdWx0cyYpID0gZGVmYXVsdDsKKy8vICAgIG1hdGNoX3Jlc3VsdHMmIG9wZXJhdG9yPShjb25zdCBtYXRjaF9yZXN1bHRzJikgPSBkZWZhdWx0OworLy8gICAgbWF0Y2hfcmVzdWx0cyhtYXRjaF9yZXN1bHRzJiYgX19tKSA9IGRlZmF1bHQ7CisvLyAgICBtYXRjaF9yZXN1bHRzJiBvcGVyYXRvcj0obWF0Y2hfcmVzdWx0cyYmIF9fbSkgPSBkZWZhdWx0OworLy8gICAgfm1hdGNoX3Jlc3VsdHMoKSA9IGRlZmF1bHQ7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCByZWFkeSgpIGNvbnN0IHtyZXR1cm4gX19yZWFkeV87fQorCisgICAgLy8gc2l6ZToKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX21hdGNoZXNfLnNpemUoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fbWF0Y2hlc18ubWF4X3NpemUoKTt9CisgICAgX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgZW1wdHkoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBzaXplKCkgPT0gMDt9CisKKyAgICAvLyBlbGVtZW50IGFjY2VzczoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZGlmZmVyZW5jZV90eXBlIGxlbmd0aChzaXplX3R5cGUgX19zdWIgPSAwKSBjb25zdAorICAgICAgICB7cmV0dXJuICgqdGhpcylbX19zdWJdLmxlbmd0aCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZGlmZmVyZW5jZV90eXBlIHBvc2l0aW9uKHNpemVfdHlwZSBfX3N1YiA9IDApIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX1ZTVEQ6OmRpc3RhbmNlKF9fcG9zaXRpb25fc3RhcnRfLCAoKnRoaXMpW19fc3ViXS5maXJzdCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdHJpbmdfdHlwZSBzdHIoc2l6ZV90eXBlIF9fc3ViID0gMCkgY29uc3QKKyAgICAgICAge3JldHVybiAoKnRoaXMpW19fc3ViXS5zdHIoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX19uIDwgX19tYXRjaGVzXy5zaXplKCkgPyBfX21hdGNoZXNfW19fbl0gOiBfX3VubWF0Y2hlZF87fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JlZmVyZW5jZSBwcmVmaXgoKSBjb25zdCB7cmV0dXJuIF9fcHJlZml4Xzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JlZmVyZW5jZSBzdWZmaXgoKSBjb25zdCB7cmV0dXJuIF9fc3VmZml4Xzt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7cmV0dXJuIGVtcHR5KCkgPyBfX21hdGNoZXNfLmVuZCgpIDogX19tYXRjaGVzXy5iZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3Qge3JldHVybiBfX21hdGNoZXNfLmVuZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3Qge3JldHVybiBlbXB0eSgpID8gX19tYXRjaGVzXy5lbmQoKSA6IF9fbWF0Y2hlc18uYmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGNlbmQoKSBjb25zdCB7cmV0dXJuIF9fbWF0Y2hlc18uZW5kKCk7fQorCisgICAgLy8gZm9ybWF0OgorICAgIHRlbXBsYXRlIDxjbGFzcyBfT3V0cHV0SXRlcj4KKyAgICAgICAgX091dHB1dEl0ZXIKKyAgICAgICAgZm9ybWF0KF9PdXRwdXRJdGVyIF9fb3V0cHV0X2l0ZXIsIGNvbnN0IGNoYXJfdHlwZSogX19mbXRfZmlyc3QsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyX3R5cGUqIF9fZm10X2xhc3QsCisgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjpmb3JtYXRfZGVmYXVsdCkgY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfU1QsIGNsYXNzIF9TQT4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBfT3V0cHV0SXRlcgorICAgICAgICBmb3JtYXQoX091dHB1dEl0ZXIgX19vdXRwdXRfaXRlciwgY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZSwgX1NULCBfU0E+JiBfX2ZtdCwKKyAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MgPSByZWdleF9jb25zdGFudHM6OmZvcm1hdF9kZWZhdWx0KSBjb25zdAorICAgICAgICAgICAge3JldHVybiBmb3JtYXQoX19vdXRwdXRfaXRlciwgX19mbXQuZGF0YSgpLCBfX2ZtdC5kYXRhKCkgKyBfX2ZtdC5zaXplKCksIF9fZmxhZ3MpO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1NULCBjbGFzcyBfU0E+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZSwgX1NULCBfU0E+CisgICAgICAgIGZvcm1hdChjb25zdCBiYXNpY19zdHJpbmc8Y2hhcl90eXBlLCBfU1QsIF9TQT4mIF9fZm10LAorICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6Zm9ybWF0X2RlZmF1bHQpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2ljX3N0cmluZzxjaGFyX3R5cGUsIF9TVCwgX1NBPiBfX3I7CisgICAgICAgICAgICBmb3JtYXQoYmFja19pbnNlcnRlcihfX3IpLCBfX2ZtdC5kYXRhKCksIF9fZm10LmRhdGEoKSArIF9fZm10LnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICBfX2ZsYWdzKTsKKyAgICAgICAgICAgIHJldHVybiBfX3I7CisgICAgICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RyaW5nX3R5cGUKKyAgICAgICAgZm9ybWF0KGNvbnN0IGNoYXJfdHlwZSogX19mbXQsCisgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjpmb3JtYXRfZGVmYXVsdCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nX3R5cGUgX19yOworICAgICAgICAgICAgZm9ybWF0KGJhY2tfaW5zZXJ0ZXIoX19yKSwgX19mbXQsCisgICAgICAgICAgICAgICAgICAgX19mbXQgKyBjaGFyX3RyYWl0czxjaGFyX3R5cGU+OjpsZW5ndGgoX19mbXQpLCBfX2ZsYWdzKTsKKyAgICAgICAgICAgIHJldHVybiBfX3I7CisgICAgICAgIH0KKworICAgIC8vIGFsbG9jYXRvcjoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHtyZXR1cm4gX19tYXRjaGVzXy5nZXRfYWxsb2NhdG9yKCk7fQorCisgICAgLy8gc3dhcDoKKyAgICB2b2lkIHN3YXAobWF0Y2hfcmVzdWx0cyYgX19tKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQnAsIGNsYXNzIF9BcD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB2b2lkIF9fYXNzaWduKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19mLCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaF9yZXN1bHRzPF9CcCwgX0FwPiYgX19tLCBib29sIF9fbm9fdXBkYXRlX3BvcykKKyAgICB7CisgICAgICAgIF9CcCBfX21mID0gX19tLnByZWZpeCgpLmZpcnN0OworICAgICAgICBfX21hdGNoZXNfLnJlc2l6ZShfX20uc2l6ZSgpKTsKKyAgICAgICAgZm9yIChzaXplX3R5cGUgX19pID0gMDsgX19pIDwgX19tYXRjaGVzXy5zaXplKCk7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgICBfX21hdGNoZXNfW19faV0uZmlyc3QgPSBfVlNURDo6bmV4dChfX2YsIF9WU1REOjpkaXN0YW5jZShfX21mLCBfX21bX19pXS5maXJzdCkpOworICAgICAgICAgICAgX19tYXRjaGVzX1tfX2ldLnNlY29uZCA9IF9WU1REOjpuZXh0KF9fZiwgX1ZTVEQ6OmRpc3RhbmNlKF9fbWYsIF9fbVtfX2ldLnNlY29uZCkpOworICAgICAgICAgICAgX19tYXRjaGVzX1tfX2ldLm1hdGNoZWQgPSBfX21bX19pXS5tYXRjaGVkOworICAgICAgICB9CisgICAgICAgIF9fdW5tYXRjaGVkXy5maXJzdCAgID0gX19sOworICAgICAgICBfX3VubWF0Y2hlZF8uc2Vjb25kICA9IF9fbDsKKyAgICAgICAgX191bm1hdGNoZWRfLm1hdGNoZWQgPSBmYWxzZTsKKyAgICAgICAgX19wcmVmaXhfLmZpcnN0ID0gX1ZTVEQ6Om5leHQoX19mLCBfVlNURDo6ZGlzdGFuY2UoX19tZiwgX19tLnByZWZpeCgpLmZpcnN0KSk7CisgICAgICAgIF9fcHJlZml4Xy5zZWNvbmQgPSBfVlNURDo6bmV4dChfX2YsIF9WU1REOjpkaXN0YW5jZShfX21mLCBfX20ucHJlZml4KCkuc2Vjb25kKSk7CisgICAgICAgIF9fcHJlZml4Xy5tYXRjaGVkID0gX19tLnByZWZpeCgpLm1hdGNoZWQ7CisgICAgICAgIF9fc3VmZml4Xy5maXJzdCA9IF9WU1REOjpuZXh0KF9fZiwgX1ZTVEQ6OmRpc3RhbmNlKF9fbWYsIF9fbS5zdWZmaXgoKS5maXJzdCkpOworICAgICAgICBfX3N1ZmZpeF8uc2Vjb25kID0gX1ZTVEQ6Om5leHQoX19mLCBfVlNURDo6ZGlzdGFuY2UoX19tZiwgX19tLnN1ZmZpeCgpLnNlY29uZCkpOworICAgICAgICBfX3N1ZmZpeF8ubWF0Y2hlZCA9IF9fbS5zdWZmaXgoKS5tYXRjaGVkOworICAgICAgICBpZiAoIV9fbm9fdXBkYXRlX3BvcykKKyAgICAgICAgICAgIF9fcG9zaXRpb25fc3RhcnRfID0gX19wcmVmaXhfLmZpcnN0OworICAgICAgICBfX3JlYWR5XyA9IF9fbS5yZWFkeSgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIF9faW5pdCh1bnNpZ25lZCBfX3MsCisgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2YsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgIGJvb2wgX19ub191cGRhdGVfcG9zID0gZmFsc2UpOworCisgICAgdGVtcGxhdGUgPGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIGJhc2ljX3JlZ2V4OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9CcCwgY2xhc3MgX0FwLCBjbGFzcyBfQ3AsIGNsYXNzIF9UcD4KKyAgICBmcmllbmQKKyAgICBib29sCisgICAgcmVnZXhfbWF0Y2goX0JwLCBfQnAsIG1hdGNoX3Jlc3VsdHM8X0JwLCBfQXA+JiwgY29uc3QgYmFzaWNfcmVnZXg8X0NwLCBfVHA+JiwKKyAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0JwLCBjbGFzcyBfQXA+CisgICAgZnJpZW5kCisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbWF0Y2hfcmVzdWx0czxfQnAsIF9BcD4mLCBjb25zdCBtYXRjaF9yZXN1bHRzPF9CcCwgX0FwPiYpOworCisgICAgdGVtcGxhdGUgPGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9fbG9va2FoZWFkOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9BbGxvY2F0b3I+CittYXRjaF9yZXN1bHRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9BbGxvY2F0b3I+OjptYXRjaF9yZXN1bHRzKAorICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX19tYXRjaGVzXyhfX2EpLAorICAgICAgX191bm1hdGNoZWRfKCksCisgICAgICBfX3ByZWZpeF8oKSwKKyAgICAgIF9fc3VmZml4XygpLAorICAgICAgX19yZWFkeV8oZmFsc2UpLAorICAgICAgX19wb3NpdGlvbl9zdGFydF8oKQoreworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK21hdGNoX3Jlc3VsdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX0FsbG9jYXRvcj46Ol9faW5pdCh1bnNpZ25lZCBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2YsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX19ub191cGRhdGVfcG9zKQoreworICAgIF9fdW5tYXRjaGVkXy5maXJzdCAgID0gX19sOworICAgIF9fdW5tYXRjaGVkXy5zZWNvbmQgID0gX19sOworICAgIF9fdW5tYXRjaGVkXy5tYXRjaGVkID0gZmFsc2U7CisgICAgX19tYXRjaGVzXy5hc3NpZ24oX19zLCBfX3VubWF0Y2hlZF8pOworICAgIF9fcHJlZml4Xy5maXJzdCAgICAgID0gX19mOworICAgIF9fcHJlZml4Xy5zZWNvbmQgICAgID0gX19mOworICAgIF9fcHJlZml4Xy5tYXRjaGVkICAgID0gZmFsc2U7CisgICAgX19zdWZmaXhfID0gX191bm1hdGNoZWRfOworICAgIGlmICghX19ub191cGRhdGVfcG9zKQorICAgICAgICBfX3Bvc2l0aW9uX3N0YXJ0XyA9IF9fcHJlZml4Xy5maXJzdDsKKyAgICBfX3JlYWR5XyA9IHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9PdXRwdXRJdGVyPgorX091dHB1dEl0ZXIKK21hdGNoX3Jlc3VsdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX0FsbG9jYXRvcj46OmZvcm1hdChfT3V0cHV0SXRlciBfX291dHB1dF9pdGVyLAorICAgICAgICBjb25zdCBjaGFyX3R5cGUqIF9fZm10X2ZpcnN0LCBjb25zdCBjaGFyX3R5cGUqIF9fZm10X2xhc3QsCisgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MpIGNvbnN0Cit7CisgICAgaWYgKF9fZmxhZ3MgJiByZWdleF9jb25zdGFudHM6OmZvcm1hdF9zZWQpCisgICAgeworICAgICAgICBmb3IgKDsgX19mbXRfZmlyc3QgIT0gX19mbXRfbGFzdDsgKytfX2ZtdF9maXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCpfX2ZtdF9maXJzdCA9PSAnJicpCisgICAgICAgICAgICAgICAgX19vdXRwdXRfaXRlciA9IF9WU1REOjpjb3B5KF9fbWF0Y2hlc19bMF0uZmlyc3QsIF9fbWF0Y2hlc19bMF0uc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX291dHB1dF9pdGVyKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCpfX2ZtdF9maXJzdCA9PSAnXFwnICYmIF9fZm10X2ZpcnN0ICsgMSAhPSBfX2ZtdF9sYXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrX19mbXRfZmlyc3Q7CisgICAgICAgICAgICAgICAgaWYgKCcwJyA8PSAqX19mbXRfZmlyc3QgJiYgKl9fZm10X2ZpcnN0IDw9ICc5JykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX2kgPSAqX19mbXRfZmlyc3QgLSAnMCc7CisgICAgICAgICAgICAgICAgICAgIF9fb3V0cHV0X2l0ZXIgPSBfVlNURDo6Y29weSgoKnRoaXMpW19faV0uZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCp0aGlzKVtfX2ldLnNlY29uZCwgX19vdXRwdXRfaXRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpfX291dHB1dF9pdGVyID0gKl9fZm10X2ZpcnN0OworICAgICAgICAgICAgICAgICAgICArK19fb3V0cHV0X2l0ZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpfX291dHB1dF9pdGVyID0gKl9fZm10X2ZpcnN0OworICAgICAgICAgICAgICAgICsrX19vdXRwdXRfaXRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKDsgX19mbXRfZmlyc3QgIT0gX19mbXRfbGFzdDsgKytfX2ZtdF9maXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCpfX2ZtdF9maXJzdCA9PSAnJCcgJiYgX19mbXRfZmlyc3QgKyAxICE9IF9fZm10X2xhc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChfX2ZtdF9maXJzdFsxXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAnJCc6CisgICAgICAgICAgICAgICAgICAgICpfX291dHB1dF9pdGVyID0gKisrX19mbXRfZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgICsrX19vdXRwdXRfaXRlcjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnJic6CisgICAgICAgICAgICAgICAgICAgICsrX19mbXRfZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgIF9fb3V0cHV0X2l0ZXIgPSBfVlNURDo6Y29weShfX21hdGNoZXNfWzBdLmZpcnN0LCBfX21hdGNoZXNfWzBdLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fb3V0cHV0X2l0ZXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdgJzoKKyAgICAgICAgICAgICAgICAgICAgKytfX2ZtdF9maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgX19vdXRwdXRfaXRlciA9IF9WU1REOjpjb3B5KF9fcHJlZml4Xy5maXJzdCwgX19wcmVmaXhfLnNlY29uZCwgX19vdXRwdXRfaXRlcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgICAgICAgKytfX2ZtdF9maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgX19vdXRwdXRfaXRlciA9IF9WU1REOjpjb3B5KF9fc3VmZml4Xy5maXJzdCwgX19zdWZmaXhfLnNlY29uZCwgX19vdXRwdXRfaXRlcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmICgnMCcgPD0gX19mbXRfZmlyc3RbMV0gJiYgX19mbXRfZmlyc3RbMV0gPD0gJzknKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICArK19fZm10X2ZpcnN0OworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9faWR4ID0gKl9fZm10X2ZpcnN0IC0gJzAnOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fZm10X2ZpcnN0ICsgMSAhPSBfX2ZtdF9sYXN0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzAnIDw9IF9fZm10X2ZpcnN0WzFdICYmIF9fZm10X2ZpcnN0WzFdIDw9ICc5JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK19fZm10X2ZpcnN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX2lkeCA+PSBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpIC8gMTApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjplcnJvcl9lc2NhcGU+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pZHggPSAxMCAqIF9faWR4ICsgKl9fZm10X2ZpcnN0IC0gJzAnOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgX19vdXRwdXRfaXRlciA9IF9WU1REOjpjb3B5KCgqdGhpcylbX19pZHhdLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnRoaXMpW19faWR4XS5zZWNvbmQsIF9fb3V0cHV0X2l0ZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKl9fb3V0cHV0X2l0ZXIgPSAqX19mbXRfZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICArK19fb3V0cHV0X2l0ZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpfX291dHB1dF9pdGVyID0gKl9fZm10X2ZpcnN0OworICAgICAgICAgICAgICAgICsrX19vdXRwdXRfaXRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19vdXRwdXRfaXRlcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCittYXRjaF9yZXN1bHRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9BbGxvY2F0b3I+Ojpzd2FwKG1hdGNoX3Jlc3VsdHMmIF9fbSkKK3sKKyAgICB1c2luZyBfVlNURDo6c3dhcDsKKyAgICBzd2FwKF9fbWF0Y2hlc18sIF9fbS5fX21hdGNoZXNfKTsKKyAgICBzd2FwKF9fdW5tYXRjaGVkXywgX19tLl9fdW5tYXRjaGVkXyk7CisgICAgc3dhcChfX3ByZWZpeF8sIF9fbS5fX3ByZWZpeF8pOworICAgIHN3YXAoX19zdWZmaXhfLCBfX20uX19zdWZmaXhfKTsKKyAgICBzd2FwKF9fcG9zaXRpb25fc3RhcnRfLCBfX20uX19wb3NpdGlvbl9zdGFydF8pOworICAgIHN3YXAoX19yZWFkeV8sIF9fbS5fX3JlYWR5Xyk7Cit9CisKK3R5cGVkZWYgbWF0Y2hfcmVzdWx0czxjb25zdCBjaGFyKj4gICAgICAgICAgICAgY21hdGNoOwordHlwZWRlZiBtYXRjaF9yZXN1bHRzPGNvbnN0IHdjaGFyX3QqPiAgICAgICAgICB3Y21hdGNoOwordHlwZWRlZiBtYXRjaF9yZXN1bHRzPHN0cmluZzo6Y29uc3RfaXRlcmF0b3I+ICBzbWF0Y2g7Cit0eXBlZGVmIG1hdGNoX3Jlc3VsdHM8d3N0cmluZzo6Y29uc3RfaXRlcmF0b3I+IHdzbWF0Y2g7CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfQWxsb2NhdG9yPgorYm9vbAorb3BlcmF0b3I9PShjb25zdCBtYXRjaF9yZXN1bHRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9BbGxvY2F0b3I+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IG1hdGNoX3Jlc3VsdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX0FsbG9jYXRvcj4mIF9feSkKK3sKKyAgICBpZiAoX194Ll9fcmVhZHlfICE9IF9feS5fX3JlYWR5XykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghX194Ll9fcmVhZHlfKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gX194Ll9fbWF0Y2hlc18gPT0gX195Ll9fbWF0Y2hlc18gJiYKKyAgICAgICAgICAgX194Ll9fcHJlZml4XyA9PSBfX3kuX19wcmVmaXhfICYmCisgICAgICAgICAgIF9feC5fX3N1ZmZpeF8gPT0gX195Ll9fc3VmZml4XzsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBtYXRjaF9yZXN1bHRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9BbGxvY2F0b3I+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IG1hdGNoX3Jlc3VsdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX0FsbG9jYXRvcj4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPT0gX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChtYXRjaF9yZXN1bHRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9BbGxvY2F0b3I+JiBfX3gsCisgICAgIG1hdGNoX3Jlc3VsdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX0FsbG9jYXRvcj4mIF9feSkKK3sKKyAgICBfX3guc3dhcChfX3kpOworfQorCisvLyByZWdleF9zZWFyY2gKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgorYm9vbAorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19tYXRjaF9hdF9zdGFydF9lY21hKAorICAgICAgICBjb25zdCBfQ2hhclQqIF9fZmlyc3QsIGNvbnN0IF9DaGFyVCogX19sYXN0LAorICAgICAgICBtYXRjaF9yZXN1bHRzPGNvbnN0IF9DaGFyVCosIF9BbGxvY2F0b3I+JiBfX20sCisgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MsIGJvb2wgX19hdF9maXJzdCkgY29uc3QKK3sKKyAgICB2ZWN0b3I8X19zdGF0ZT4gX19zdGF0ZXM7CisgICAgX19ub2RlKiBfX3N0ID0gX19zdGFydF8uZ2V0KCk7CisgICAgaWYgKF9fc3QpCisgICAgeworICAgICAgICBzdWJfbWF0Y2g8Y29uc3QgX0NoYXJUKj4gX191bm1hdGNoZWQ7CisgICAgICAgIF9fdW5tYXRjaGVkLmZpcnN0ICAgPSBfX2xhc3Q7CisgICAgICAgIF9fdW5tYXRjaGVkLnNlY29uZCAgPSBfX2xhc3Q7CisgICAgICAgIF9fdW5tYXRjaGVkLm1hdGNoZWQgPSBmYWxzZTsKKworICAgICAgICBfX3N0YXRlcy5wdXNoX2JhY2soX19zdGF0ZSgpKTsKKyAgICAgICAgX19zdGF0ZXMuYmFjaygpLl9fZG9fID0gMDsKKyAgICAgICAgX19zdGF0ZXMuYmFjaygpLl9fZmlyc3RfID0gX19maXJzdDsKKyAgICAgICAgX19zdGF0ZXMuYmFjaygpLl9fY3VycmVudF8gPSBfX2ZpcnN0OworICAgICAgICBfX3N0YXRlcy5iYWNrKCkuX19sYXN0XyA9IF9fbGFzdDsKKyAgICAgICAgX19zdGF0ZXMuYmFjaygpLl9fc3ViX21hdGNoZXNfLnJlc2l6ZShtYXJrX2NvdW50KCksIF9fdW5tYXRjaGVkKTsKKyAgICAgICAgX19zdGF0ZXMuYmFjaygpLl9fbG9vcF9kYXRhXy5yZXNpemUoX19sb29wX2NvdW50KCkpOworICAgICAgICBfX3N0YXRlcy5iYWNrKCkuX19ub2RlXyA9IF9fc3Q7CisgICAgICAgIF9fc3RhdGVzLmJhY2soKS5fX2ZsYWdzXyA9IF9fZmxhZ3M7CisgICAgICAgIF9fc3RhdGVzLmJhY2soKS5fX2F0X2ZpcnN0XyA9IF9fYXRfZmlyc3Q7CisgICAgICAgIGludCBfX2NvdW50ZXIgPSAwOworICAgICAgICBpbnQgX19sZW5ndGggPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICArK19fY291bnRlcjsKKyAgICAgICAgICAgIGlmIChfX2NvdW50ZXIgJSBfTElCQ1BQX1JFR0VYX0NPTVBMRVhJVFlfRkFDVE9SID09IDAgJiYKKyAgICAgICAgICAgICAgICBfX2NvdW50ZXIgLyBfTElCQ1BQX1JFR0VYX0NPTVBMRVhJVFlfRkFDVE9SID49IF9fbGVuZ3RoKQorICAgICAgICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfY29tcGxleGl0eT4oKTsKKyAgICAgICAgICAgIF9fc3RhdGUmIF9fcyA9IF9fc3RhdGVzLmJhY2soKTsKKyAgICAgICAgICAgIGlmIChfX3MuX19ub2RlXykKKyAgICAgICAgICAgICAgICBfX3MuX19ub2RlXy0+X19leGVjKF9fcyk7CisgICAgICAgICAgICBzd2l0Y2ggKF9fcy5fX2RvXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgX19zdGF0ZTo6X19lbmRfc3RhdGU6CisgICAgICAgICAgICAgICAgaWYgKChfX2ZsYWdzICYgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9ub3RfbnVsbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgX19zLl9fY3VycmVudF8gPT0gX19maXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfX3N0YXRlcy5wb3BfYmFjaygpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoX19mbGFncyAmIHJlZ2V4X2NvbnN0YW50czo6X19mdWxsX21hdGNoKSAmJgorICAgICAgICAgICAgICAgICAgICBfX3MuX19jdXJyZW50XyAhPSBfX2xhc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX19zdGF0ZXMucG9wX2JhY2soKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX20uX19tYXRjaGVzX1swXS5maXJzdCA9IF9fZmlyc3Q7CisgICAgICAgICAgICAgICAgX19tLl9fbWF0Y2hlc19bMF0uc2Vjb25kID0gX1ZTVEQ6Om5leHQoX19maXJzdCwgX19zLl9fY3VycmVudF8gLSBfX2ZpcnN0KTsKKyAgICAgICAgICAgICAgICBfX20uX19tYXRjaGVzX1swXS5tYXRjaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIF9faSA9IDA7IF9faSA8IF9fcy5fX3N1Yl9tYXRjaGVzXy5zaXplKCk7ICsrX19pKQorICAgICAgICAgICAgICAgICAgICBfX20uX19tYXRjaGVzX1tfX2krMV0gPSBfX3MuX19zdWJfbWF0Y2hlc19bX19pXTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgX19zdGF0ZTo6X19hY2NlcHRfYW5kX2NvbnN1bWU6CisgICAgICAgICAgICBjYXNlIF9fc3RhdGU6Ol9fcmVwZWF0OgorICAgICAgICAgICAgY2FzZSBfX3N0YXRlOjpfX2FjY2VwdF9idXRfbm90X2NvbnN1bWU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIF9fc3RhdGU6Ol9fc3BsaXQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fc3RhdGUgX19zbmV4dCA9IF9fczsKKyAgICAgICAgICAgICAgICBfX3MuX19ub2RlXy0+X19leGVjX3NwbGl0KHRydWUsIF9fcyk7CisgICAgICAgICAgICAgICAgX19zbmV4dC5fX25vZGVfLT5fX2V4ZWNfc3BsaXQoZmFsc2UsIF9fc25leHQpOworICAgICAgICAgICAgICAgIF9fc3RhdGVzLnB1c2hfYmFjayhfVlNURDo6bW92ZShfX3NuZXh0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBfX3N0YXRlOjpfX3JlamVjdDoKKyAgICAgICAgICAgICAgICBfX3N0YXRlcy5wb3BfYmFjaygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBfX3Rocm93X3JlZ2V4X2Vycm9yPHJlZ2V4X2NvbnN0YW50czo6X19yZV9lcnJfdW5rbm93bj4oKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICghX19zdGF0ZXMuZW1wdHkoKSk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgorYm9vbAorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19tYXRjaF9hdF9zdGFydF9wb3NpeF9ub3N1YnMoCisgICAgICAgIGNvbnN0IF9DaGFyVCogX19maXJzdCwgY29uc3QgX0NoYXJUKiBfX2xhc3QsCisgICAgICAgIG1hdGNoX3Jlc3VsdHM8Y29uc3QgX0NoYXJUKiwgX0FsbG9jYXRvcj4mIF9fbSwKKyAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncywgYm9vbCBfX2F0X2ZpcnN0KSBjb25zdAoreworICAgIGRlcXVlPF9fc3RhdGU+IF9fc3RhdGVzOworICAgIHB0cmRpZmZfdCBfX2hpZ2hlc3RfaiA9IDA7CisgICAgcHRyZGlmZl90IF9OcCA9IF9WU1REOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgIF9fbm9kZSogX19zdCA9IF9fc3RhcnRfLmdldCgpOworICAgIGlmIChfX3N0KQorICAgIHsKKyAgICAgICAgX19zdGF0ZXMucHVzaF9iYWNrKF9fc3RhdGUoKSk7CisgICAgICAgIF9fc3RhdGVzLmJhY2soKS5fX2RvXyA9IDA7CisgICAgICAgIF9fc3RhdGVzLmJhY2soKS5fX2ZpcnN0XyA9IF9fZmlyc3Q7CisgICAgICAgIF9fc3RhdGVzLmJhY2soKS5fX2N1cnJlbnRfID0gX19maXJzdDsKKyAgICAgICAgX19zdGF0ZXMuYmFjaygpLl9fbGFzdF8gPSBfX2xhc3Q7CisgICAgICAgIF9fc3RhdGVzLmJhY2soKS5fX2xvb3BfZGF0YV8ucmVzaXplKF9fbG9vcF9jb3VudCgpKTsKKyAgICAgICAgX19zdGF0ZXMuYmFjaygpLl9fbm9kZV8gPSBfX3N0OworICAgICAgICBfX3N0YXRlcy5iYWNrKCkuX19mbGFnc18gPSBfX2ZsYWdzOworICAgICAgICBfX3N0YXRlcy5iYWNrKCkuX19hdF9maXJzdF8gPSBfX2F0X2ZpcnN0OworICAgICAgICBib29sIF9fbWF0Y2hlZCA9IGZhbHNlOworICAgICAgICBpbnQgX19jb3VudGVyID0gMDsKKyAgICAgICAgaW50IF9fbGVuZ3RoID0gX19sYXN0IC0gX19maXJzdDsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgKytfX2NvdW50ZXI7CisgICAgICAgICAgICBpZiAoX19jb3VudGVyICUgX0xJQkNQUF9SRUdFWF9DT01QTEVYSVRZX0ZBQ1RPUiA9PSAwICYmCisgICAgICAgICAgICAgICAgX19jb3VudGVyIC8gX0xJQkNQUF9SRUdFWF9DT01QTEVYSVRZX0ZBQ1RPUiA+PSBfX2xlbmd0aCkKKyAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2NvbXBsZXhpdHk+KCk7CisgICAgICAgICAgICBfX3N0YXRlJiBfX3MgPSBfX3N0YXRlcy5iYWNrKCk7CisgICAgICAgICAgICBpZiAoX19zLl9fbm9kZV8pCisgICAgICAgICAgICAgICAgX19zLl9fbm9kZV8tPl9fZXhlYyhfX3MpOworICAgICAgICAgICAgc3dpdGNoIChfX3MuX19kb18pCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIF9fc3RhdGU6Ol9fZW5kX3N0YXRlOgorICAgICAgICAgICAgICAgIGlmICgoX19mbGFncyAmIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfbm90X251bGwpICYmCisgICAgICAgICAgICAgICAgICAgIF9fcy5fX2N1cnJlbnRfID09IF9fZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX19zdGF0ZXMucG9wX2JhY2soKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKF9fZmxhZ3MgJiByZWdleF9jb25zdGFudHM6Ol9fZnVsbF9tYXRjaCkgJiYKKyAgICAgICAgICAgICAgICAgICAgX19zLl9fY3VycmVudF8gIT0gX19sYXN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9fc3RhdGVzLnBvcF9iYWNrKCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFfX21hdGNoZWQgfHwgX19oaWdoZXN0X2ogPCBfX3MuX19jdXJyZW50XyAtIF9fcy5fX2ZpcnN0XykKKyAgICAgICAgICAgICAgICAgICAgX19oaWdoZXN0X2ogPSBfX3MuX19jdXJyZW50XyAtIF9fcy5fX2ZpcnN0XzsKKyAgICAgICAgICAgICAgICBfX21hdGNoZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChfX2hpZ2hlc3RfaiA9PSBfTnApCisgICAgICAgICAgICAgICAgICAgIF9fc3RhdGVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBfX3N0YXRlcy5wb3BfYmFjaygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBfX3N0YXRlOjpfX2NvbnN1bWVfaW5wdXQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIF9fc3RhdGU6Ol9fYWNjZXB0X2FuZF9jb25zdW1lOgorICAgICAgICAgICAgICAgIF9fc3RhdGVzLnB1c2hfZnJvbnQoX1ZTVEQ6Om1vdmUoX19zKSk7CisgICAgICAgICAgICAgICAgX19zdGF0ZXMucG9wX2JhY2soKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgX19zdGF0ZTo6X19yZXBlYXQ6CisgICAgICAgICAgICBjYXNlIF9fc3RhdGU6Ol9fYWNjZXB0X2J1dF9ub3RfY29uc3VtZToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgX19zdGF0ZTo6X19zcGxpdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19zdGF0ZSBfX3NuZXh0ID0gX19zOworICAgICAgICAgICAgICAgIF9fcy5fX25vZGVfLT5fX2V4ZWNfc3BsaXQodHJ1ZSwgX19zKTsKKyAgICAgICAgICAgICAgICBfX3NuZXh0Ll9fbm9kZV8tPl9fZXhlY19zcGxpdChmYWxzZSwgX19zbmV4dCk7CisgICAgICAgICAgICAgICAgX19zdGF0ZXMucHVzaF9iYWNrKF9WU1REOjptb3ZlKF9fc25leHQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIF9fc3RhdGU6Ol9fcmVqZWN0OgorICAgICAgICAgICAgICAgIF9fc3RhdGVzLnBvcF9iYWNrKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIF9fdGhyb3dfcmVnZXhfZXJyb3I8cmVnZXhfY29uc3RhbnRzOjpfX3JlX2Vycl91bmtub3duPigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICghX19zdGF0ZXMuZW1wdHkoKSk7CisgICAgICAgIGlmIChfX21hdGNoZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fbS5fX21hdGNoZXNfWzBdLmZpcnN0ID0gX19maXJzdDsKKyAgICAgICAgICAgIF9fbS5fX21hdGNoZXNfWzBdLnNlY29uZCA9IF9WU1REOjpuZXh0KF9fZmlyc3QsIF9faGlnaGVzdF9qKTsKKyAgICAgICAgICAgIF9fbS5fX21hdGNoZXNfWzBdLm1hdGNoZWQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+Citib29sCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX21hdGNoX2F0X3N0YXJ0X3Bvc2l4X3N1YnMoCisgICAgICAgIGNvbnN0IF9DaGFyVCogX19maXJzdCwgY29uc3QgX0NoYXJUKiBfX2xhc3QsCisgICAgICAgIG1hdGNoX3Jlc3VsdHM8Y29uc3QgX0NoYXJUKiwgX0FsbG9jYXRvcj4mIF9fbSwKKyAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncywgYm9vbCBfX2F0X2ZpcnN0KSBjb25zdAoreworICAgIHZlY3RvcjxfX3N0YXRlPiBfX3N0YXRlczsKKyAgICBfX3N0YXRlIF9fYmVzdF9zdGF0ZTsKKyAgICBwdHJkaWZmX3QgX19qID0gMDsKKyAgICBwdHJkaWZmX3QgX19oaWdoZXN0X2ogPSAwOworICAgIHB0cmRpZmZfdCBfTnAgPSBfVlNURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICBfX25vZGUqIF9fc3QgPSBfX3N0YXJ0Xy5nZXQoKTsKKyAgICBpZiAoX19zdCkKKyAgICB7CisgICAgICAgIHN1Yl9tYXRjaDxjb25zdCBfQ2hhclQqPiBfX3VubWF0Y2hlZDsKKyAgICAgICAgX191bm1hdGNoZWQuZmlyc3QgICA9IF9fbGFzdDsKKyAgICAgICAgX191bm1hdGNoZWQuc2Vjb25kICA9IF9fbGFzdDsKKyAgICAgICAgX191bm1hdGNoZWQubWF0Y2hlZCA9IGZhbHNlOworCisgICAgICAgIF9fc3RhdGVzLnB1c2hfYmFjayhfX3N0YXRlKCkpOworICAgICAgICBfX3N0YXRlcy5iYWNrKCkuX19kb18gPSAwOworICAgICAgICBfX3N0YXRlcy5iYWNrKCkuX19maXJzdF8gPSBfX2ZpcnN0OworICAgICAgICBfX3N0YXRlcy5iYWNrKCkuX19jdXJyZW50XyA9IF9fZmlyc3Q7CisgICAgICAgIF9fc3RhdGVzLmJhY2soKS5fX2xhc3RfID0gX19sYXN0OworICAgICAgICBfX3N0YXRlcy5iYWNrKCkuX19zdWJfbWF0Y2hlc18ucmVzaXplKG1hcmtfY291bnQoKSwgX191bm1hdGNoZWQpOworICAgICAgICBfX3N0YXRlcy5iYWNrKCkuX19sb29wX2RhdGFfLnJlc2l6ZShfX2xvb3BfY291bnQoKSk7CisgICAgICAgIF9fc3RhdGVzLmJhY2soKS5fX25vZGVfID0gX19zdDsKKyAgICAgICAgX19zdGF0ZXMuYmFjaygpLl9fZmxhZ3NfID0gX19mbGFnczsKKyAgICAgICAgX19zdGF0ZXMuYmFjaygpLl9fYXRfZmlyc3RfID0gX19hdF9maXJzdDsKKyAgICAgICAgY29uc3QgX0NoYXJUKiBfX2N1cnJlbnQgPSBfX2ZpcnN0OworICAgICAgICBib29sIF9fbWF0Y2hlZCA9IGZhbHNlOworICAgICAgICBpbnQgX19jb3VudGVyID0gMDsKKyAgICAgICAgaW50IF9fbGVuZ3RoID0gX19sYXN0IC0gX19maXJzdDsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgKytfX2NvdW50ZXI7CisgICAgICAgICAgICBpZiAoX19jb3VudGVyICUgX0xJQkNQUF9SRUdFWF9DT01QTEVYSVRZX0ZBQ1RPUiA9PSAwICYmCisgICAgICAgICAgICAgICAgX19jb3VudGVyIC8gX0xJQkNQUF9SRUdFWF9DT01QTEVYSVRZX0ZBQ1RPUiA+PSBfX2xlbmd0aCkKKyAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6OmVycm9yX2NvbXBsZXhpdHk+KCk7CisgICAgICAgICAgICBfX3N0YXRlJiBfX3MgPSBfX3N0YXRlcy5iYWNrKCk7CisgICAgICAgICAgICBpZiAoX19zLl9fbm9kZV8pCisgICAgICAgICAgICAgICAgX19zLl9fbm9kZV8tPl9fZXhlYyhfX3MpOworICAgICAgICAgICAgc3dpdGNoIChfX3MuX19kb18pCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIF9fc3RhdGU6Ol9fZW5kX3N0YXRlOgorICAgICAgICAgICAgICAgIGlmICgoX19mbGFncyAmIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfbm90X251bGwpICYmCisgICAgICAgICAgICAgICAgICAgIF9fcy5fX2N1cnJlbnRfID09IF9fZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX19zdGF0ZXMucG9wX2JhY2soKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKF9fZmxhZ3MgJiByZWdleF9jb25zdGFudHM6Ol9fZnVsbF9tYXRjaCkgJiYKKyAgICAgICAgICAgICAgICAgICAgX19zLl9fY3VycmVudF8gIT0gX19sYXN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9fc3RhdGVzLnBvcF9iYWNrKCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFfX21hdGNoZWQgfHwgX19oaWdoZXN0X2ogPCBfX3MuX19jdXJyZW50XyAtIF9fcy5fX2ZpcnN0XykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9faGlnaGVzdF9qID0gX19zLl9fY3VycmVudF8gLSBfX3MuX19maXJzdF87CisgICAgICAgICAgICAgICAgICAgIF9fYmVzdF9zdGF0ZSA9IF9fczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19tYXRjaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoX19oaWdoZXN0X2ogPT0gX05wKQorICAgICAgICAgICAgICAgICAgICBfX3N0YXRlcy5jbGVhcigpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgX19zdGF0ZXMucG9wX2JhY2soKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgX19zdGF0ZTo6X19hY2NlcHRfYW5kX2NvbnN1bWU6CisgICAgICAgICAgICAgICAgX19qICs9IF9fcy5fX2N1cnJlbnRfIC0gX19jdXJyZW50OworICAgICAgICAgICAgICAgIF9fY3VycmVudCA9IF9fcy5fX2N1cnJlbnRfOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBfX3N0YXRlOjpfX3JlcGVhdDoKKyAgICAgICAgICAgIGNhc2UgX19zdGF0ZTo6X19hY2NlcHRfYnV0X25vdF9jb25zdW1lOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBfX3N0YXRlOjpfX3NwbGl0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX3N0YXRlIF9fc25leHQgPSBfX3M7CisgICAgICAgICAgICAgICAgX19zLl9fbm9kZV8tPl9fZXhlY19zcGxpdCh0cnVlLCBfX3MpOworICAgICAgICAgICAgICAgIF9fc25leHQuX19ub2RlXy0+X19leGVjX3NwbGl0KGZhbHNlLCBfX3NuZXh0KTsKKyAgICAgICAgICAgICAgICBfX3N0YXRlcy5wdXNoX2JhY2soX1ZTVEQ6Om1vdmUoX19zbmV4dCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgX19zdGF0ZTo6X19yZWplY3Q6CisgICAgICAgICAgICAgICAgX19zdGF0ZXMucG9wX2JhY2soKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgX190aHJvd19yZWdleF9lcnJvcjxyZWdleF9jb25zdGFudHM6Ol9fcmVfZXJyX3Vua25vd24+KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKCFfX3N0YXRlcy5lbXB0eSgpKTsKKyAgICAgICAgaWYgKF9fbWF0Y2hlZCkKKyAgICAgICAgeworICAgICAgICAgICAgX19tLl9fbWF0Y2hlc19bMF0uZmlyc3QgPSBfX2ZpcnN0OworICAgICAgICAgICAgX19tLl9fbWF0Y2hlc19bMF0uc2Vjb25kID0gX1ZTVEQ6Om5leHQoX19maXJzdCwgX19oaWdoZXN0X2opOworICAgICAgICAgICAgX19tLl9fbWF0Y2hlc19bMF0ubWF0Y2hlZCA9IHRydWU7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIF9faSA9IDA7IF9faSA8IF9fYmVzdF9zdGF0ZS5fX3N1Yl9tYXRjaGVzXy5zaXplKCk7ICsrX19pKQorICAgICAgICAgICAgICAgIF9fbS5fX21hdGNoZXNfW19faSsxXSA9IF9fYmVzdF9zdGF0ZS5fX3N1Yl9tYXRjaGVzX1tfX2ldOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+Citib29sCitiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+OjpfX21hdGNoX2F0X3N0YXJ0KAorICAgICAgICBjb25zdCBfQ2hhclQqIF9fZmlyc3QsIGNvbnN0IF9DaGFyVCogX19sYXN0LAorICAgICAgICBtYXRjaF9yZXN1bHRzPGNvbnN0IF9DaGFyVCosIF9BbGxvY2F0b3I+JiBfX20sCisgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MsIGJvb2wgX19hdF9maXJzdCkgY29uc3QKK3sKKyAgICBpZiAoKF9fZmxhZ3NfICYgMHgxRjApID09IEVDTUFTY3JpcHQpCisgICAgICAgIHJldHVybiBfX21hdGNoX2F0X3N0YXJ0X2VjbWEoX19maXJzdCwgX19sYXN0LCBfX20sIF9fZmxhZ3MsIF9fYXRfZmlyc3QpOworICAgIGlmIChtYXJrX2NvdW50KCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIF9fbWF0Y2hfYXRfc3RhcnRfcG9zaXhfbm9zdWJzKF9fZmlyc3QsIF9fbGFzdCwgX19tLCBfX2ZsYWdzLCBfX2F0X2ZpcnN0KTsKKyAgICByZXR1cm4gX19tYXRjaF9hdF9zdGFydF9wb3NpeF9zdWJzKF9fZmlyc3QsIF9fbGFzdCwgX19tLCBfX2ZsYWdzLCBfX2F0X2ZpcnN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgorYm9vbAorYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPjo6X19zZWFyY2goCisgICAgICAgIGNvbnN0IF9DaGFyVCogX19maXJzdCwgY29uc3QgX0NoYXJUKiBfX2xhc3QsCisgICAgICAgIG1hdGNoX3Jlc3VsdHM8Y29uc3QgX0NoYXJUKiwgX0FsbG9jYXRvcj4mIF9fbSwKKyAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncykgY29uc3QKK3sKKyAgICBfX20uX19pbml0KDEgKyBtYXJrX2NvdW50KCksIF9fZmlyc3QsIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmxhZ3MgJiByZWdleF9jb25zdGFudHM6Ol9fbm9fdXBkYXRlX3Bvcyk7CisgICAgaWYgKF9fbWF0Y2hfYXRfc3RhcnQoX19maXJzdCwgX19sYXN0LCBfX20sIF9fZmxhZ3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShfX2ZsYWdzICYgcmVnZXhfY29uc3RhbnRzOjpfX25vX3VwZGF0ZV9wb3MpKSkKKyAgICB7CisgICAgICAgIF9fbS5fX3ByZWZpeF8uc2Vjb25kID0gX19tWzBdLmZpcnN0OworICAgICAgICBfX20uX19wcmVmaXhfLm1hdGNoZWQgPSBfX20uX19wcmVmaXhfLmZpcnN0ICE9IF9fbS5fX3ByZWZpeF8uc2Vjb25kOworICAgICAgICBfX20uX19zdWZmaXhfLmZpcnN0ID0gX19tWzBdLnNlY29uZDsKKyAgICAgICAgX19tLl9fc3VmZml4Xy5tYXRjaGVkID0gX19tLl9fc3VmZml4Xy5maXJzdCAhPSBfX20uX19zdWZmaXhfLnNlY29uZDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiAhKF9fZmxhZ3MgJiByZWdleF9jb25zdGFudHM6Om1hdGNoX2NvbnRpbnVvdXMpKQorICAgIHsKKyAgICAgICAgX19mbGFncyB8PSByZWdleF9jb25zdGFudHM6Om1hdGNoX3ByZXZfYXZhaWw7CisgICAgICAgIGZvciAoKytfX2ZpcnN0OyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBfX20uX19tYXRjaGVzXy5hc3NpZ24oX19tLnNpemUoKSwgX19tLl9fdW5tYXRjaGVkXyk7CisgICAgICAgICAgICBpZiAoX19tYXRjaF9hdF9zdGFydChfX2ZpcnN0LCBfX2xhc3QsIF9fbSwgX19mbGFncywgZmFsc2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fbS5fX3ByZWZpeF8uc2Vjb25kID0gX19tWzBdLmZpcnN0OworICAgICAgICAgICAgICAgIF9fbS5fX3ByZWZpeF8ubWF0Y2hlZCA9IF9fbS5fX3ByZWZpeF8uZmlyc3QgIT0gX19tLl9fcHJlZml4Xy5zZWNvbmQ7CisgICAgICAgICAgICAgICAgX19tLl9fc3VmZml4Xy5maXJzdCA9IF9fbVswXS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgX19tLl9fc3VmZml4Xy5tYXRjaGVkID0gX19tLl9fc3VmZml4Xy5maXJzdCAhPSBfX20uX19zdWZmaXhfLnNlY29uZDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fbS5fX21hdGNoZXNfLmFzc2lnbihfX20uc2l6ZSgpLCBfX20uX191bm1hdGNoZWRfKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX20uX19tYXRjaGVzXy5jbGVhcigpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9BbGxvY2F0b3IsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCityZWdleF9zZWFyY2goX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICBtYXRjaF9yZXN1bHRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9BbGxvY2F0b3I+JiBfX20sCisgICAgICAgICAgICAgY29uc3QgYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPiYgX19lLAorICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCit7CisgICAgaW50IF9fb2Zmc2V0ID0gKF9fZmxhZ3MgJiByZWdleF9jb25zdGFudHM6Om1hdGNoX3ByZXZfYXZhaWwpID8gMSA6IDA7CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVD4gX19zKF9WU1REOjpwcmV2KF9fZmlyc3QsIF9fb2Zmc2V0KSwgX19sYXN0KTsKKyAgICBtYXRjaF9yZXN1bHRzPGNvbnN0IF9DaGFyVCo+IF9fbWM7CisgICAgYm9vbCBfX3IgPSBfX2UuX19zZWFyY2goX19zLmRhdGEoKSArIF9fb2Zmc2V0LCBfX3MuZGF0YSgpICsgX19zLnNpemUoKSwgX19tYywgX19mbGFncyk7CisgICAgX19tLl9fYXNzaWduKF9fZmlyc3QsIF9fbGFzdCwgX19tYywgX19mbGFncyAmIHJlZ2V4X2NvbnN0YW50czo6X19ub191cGRhdGVfcG9zKTsKKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIsIGNsYXNzIF9BbGxvY2F0b3IsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCityZWdleF9zZWFyY2goX193cmFwX2l0ZXI8X0l0ZXI+IF9fZmlyc3QsCisgICAgICAgICAgICAgX193cmFwX2l0ZXI8X0l0ZXI+IF9fbGFzdCwKKyAgICAgICAgICAgICBtYXRjaF9yZXN1bHRzPF9fd3JhcF9pdGVyPF9JdGVyPiwgX0FsbG9jYXRvcj4mIF9fbSwKKyAgICAgICAgICAgICBjb25zdCBiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+JiBfX2UsCisgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKK3sKKyAgICBtYXRjaF9yZXN1bHRzPGNvbnN0IF9DaGFyVCo+IF9fbWM7CisgICAgYm9vbCBfX3IgPSBfX2UuX19zZWFyY2goX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCksIF9fbWMsIF9fZmxhZ3MpOworICAgIF9fbS5fX2Fzc2lnbihfX2ZpcnN0LCBfX2xhc3QsIF9fbWMsIF9fZmxhZ3MgJiByZWdleF9jb25zdGFudHM6Ol9fbm9fdXBkYXRlX3Bvcyk7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3IsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCityZWdleF9zZWFyY2goY29uc3QgX0NoYXJUKiBfX2ZpcnN0LCBjb25zdCBfQ2hhclQqIF9fbGFzdCwKKyAgICAgICAgICAgICBtYXRjaF9yZXN1bHRzPGNvbnN0IF9DaGFyVCosIF9BbGxvY2F0b3I+JiBfX20sCisgICAgICAgICAgICAgY29uc3QgYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPiYgX19lLAorICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCit7CisgICAgcmV0dXJuIF9fZS5fX3NlYXJjaChfX2ZpcnN0LCBfX2xhc3QsIF9fbSwgX19mbGFncyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorcmVnZXhfc2VhcmNoKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgY29uc3QgYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPiYgX19lLAorICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCit7CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVD4gX19zKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgbWF0Y2hfcmVzdWx0czxjb25zdCBfQ2hhclQqPiBfX21jOworICAgIHJldHVybiBfX2UuX19zZWFyY2goX19zLmRhdGEoKSwgX19zLmRhdGEoKSArIF9fcy5zaXplKCksIF9fbWMsIF9fZmxhZ3MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK3JlZ2V4X3NlYXJjaChjb25zdCBfQ2hhclQqIF9fZmlyc3QsIGNvbnN0IF9DaGFyVCogX19sYXN0LAorICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz4mIF9fZSwKKyAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQoreworICAgIG1hdGNoX3Jlc3VsdHM8Y29uc3QgX0NoYXJUKj4gX19tYzsKKyAgICByZXR1cm4gX19lLl9fc2VhcmNoKF9fZmlyc3QsIF9fbGFzdCwgX19tYywgX19mbGFncyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvY2F0b3IsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorcmVnZXhfc2VhcmNoKGNvbnN0IF9DaGFyVCogX19zdHIsIG1hdGNoX3Jlc3VsdHM8Y29uc3QgX0NoYXJUKiwgX0FsbG9jYXRvcj4mIF9fbSwKKyAgICAgICAgICAgICBjb25zdCBiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+JiBfX2UsCisgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKK3sKKyAgICByZXR1cm4gX19lLl9fc2VhcmNoKF9fc3RyLCBfX3N0ciArIF9UcmFpdHM6Omxlbmd0aChfX3N0ciksIF9fbSwgX19mbGFncyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorcmVnZXhfc2VhcmNoKGNvbnN0IF9DaGFyVCogX19zdHIsIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz4mIF9fZSwKKyAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQoreworICAgIG1hdGNoX3Jlc3VsdHM8Y29uc3QgX0NoYXJUKj4gX19tOworICAgIHJldHVybiBfVlNURDo6cmVnZXhfc2VhcmNoKF9fc3RyLCBfX20sIF9fZSwgX19mbGFncyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfU1QsIGNsYXNzIF9TQSwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK3JlZ2V4X3NlYXJjaChjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfU1QsIF9TQT4mIF9fcywKKyAgICAgICAgICAgICBjb25zdCBiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+JiBfX2UsCisgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKK3sKKyAgICBtYXRjaF9yZXN1bHRzPGNvbnN0IF9DaGFyVCo+IF9fbWM7CisgICAgcmV0dXJuIF9fZS5fX3NlYXJjaChfX3MuZGF0YSgpLCBfX3MuZGF0YSgpICsgX19zLnNpemUoKSwgX19tYywgX19mbGFncyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfU1QsIGNsYXNzIF9TQSwgY2xhc3MgX0FsbG9jYXRvciwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK3JlZ2V4X3NlYXJjaChjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfU1QsIF9TQT4mIF9fcywKKyAgICAgICAgICAgICBtYXRjaF9yZXN1bHRzPHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9TVCwgX1NBPjo6Y29uc3RfaXRlcmF0b3IsIF9BbGxvY2F0b3I+JiBfX20sCisgICAgICAgICAgICAgY29uc3QgYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPiYgX19lLAorICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCit7CisgICAgbWF0Y2hfcmVzdWx0czxjb25zdCBfQ2hhclQqPiBfX21jOworICAgIGJvb2wgX19yID0gX19lLl9fc2VhcmNoKF9fcy5kYXRhKCksIF9fcy5kYXRhKCkgKyBfX3Muc2l6ZSgpLCBfX21jLCBfX2ZsYWdzKTsKKyAgICBfX20uX19hc3NpZ24oX19zLmJlZ2luKCksIF9fcy5lbmQoKSwgX19tYywgX19mbGFncyAmIHJlZ2V4X2NvbnN0YW50czo6X19ub191cGRhdGVfcG9zKTsKKyAgICByZXR1cm4gX19yOworfQorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxjbGFzcyBfU1QsIGNsYXNzIF9TQSwgY2xhc3MgX0FwLCBjbGFzcyBfQ3AsIGNsYXNzIF9UcD4KK2Jvb2wKK3JlZ2V4X3NlYXJjaChjb25zdCBiYXNpY19zdHJpbmc8X0NwLCBfU1QsIF9TQT4mJiBfX3MsCisgICAgICAgICAgICAgbWF0Y2hfcmVzdWx0czx0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NwLCBfU1QsIF9TQT46OmNvbnN0X2l0ZXJhdG9yLCBfQXA+JiwKKyAgICAgICAgICAgICBjb25zdCBiYXNpY19yZWdleDxfQ3AsIF9UcD4mIF9fZSwKKyAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KSA9IGRlbGV0ZTsgCisjZW5kaWYKKworLy8gcmVnZXhfbWF0Y2gKKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9BbGxvY2F0b3IsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jvb2wKK3JlZ2V4X21hdGNoKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICBtYXRjaF9yZXN1bHRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9BbGxvY2F0b3I+JiBfX20sCisgICAgICAgICAgICBjb25zdCBiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+JiBfX2UsCisgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQoreworICAgIGJvb2wgX19yID0gX1ZTVEQ6OnJlZ2V4X3NlYXJjaCgKKyAgICAgICAgX19maXJzdCwgX19sYXN0LCBfX20sIF9fZSwKKyAgICAgICAgX19mbGFncyB8IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfY29udGludW91cyB8CisgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6X19mdWxsX21hdGNoKTsKKyAgICBpZiAoX19yKQorICAgIHsKKyAgICAgICAgX19yID0gIV9fbS5zdWZmaXgoKS5tYXRjaGVkOworICAgICAgICBpZiAoIV9fcikKKyAgICAgICAgICAgIF9fbS5fX21hdGNoZXNfLmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorcmVnZXhfbWF0Y2goX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz4mIF9fZSwKKyAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCit7CisgICAgbWF0Y2hfcmVzdWx0czxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPiBfX207CisgICAgcmV0dXJuIF9WU1REOjpyZWdleF9tYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9fbSwgX19lLCBfX2ZsYWdzKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jYXRvciwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCityZWdleF9tYXRjaChjb25zdCBfQ2hhclQqIF9fc3RyLCBtYXRjaF9yZXN1bHRzPGNvbnN0IF9DaGFyVCosIF9BbGxvY2F0b3I+JiBfX20sCisgICAgICAgICAgICBjb25zdCBiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+JiBfX2UsCisgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQoreworICAgIHJldHVybiBfVlNURDo6cmVnZXhfbWF0Y2goX19zdHIsIF9fc3RyICsgX1RyYWl0czo6bGVuZ3RoKF9fc3RyKSwgX19tLCBfX2UsIF9fZmxhZ3MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1NULCBjbGFzcyBfU0EsIGNsYXNzIF9BbGxvY2F0b3IsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCityZWdleF9tYXRjaChjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfU1QsIF9TQT4mIF9fcywKKyAgICAgICAgICAgIG1hdGNoX3Jlc3VsdHM8dHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1NULCBfU0E+Ojpjb25zdF9pdGVyYXRvciwgX0FsbG9jYXRvcj4mIF9fbSwKKyAgICAgICAgICAgIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz4mIF9fZSwKKyAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCit7CisgICAgcmV0dXJuIF9WU1REOjpyZWdleF9tYXRjaChfX3MuYmVnaW4oKSwgX19zLmVuZCgpLCBfX20sIF9fZSwgX19mbGFncyk7Cit9CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPGNsYXNzIF9TVCwgY2xhc3MgX1NBLCBjbGFzcyBfQWxsb2NhdG9yLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorcmVnZXhfbWF0Y2goY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1NULCBfU0E+JiYgX19zLAorICAgICAgICAgICAgbWF0Y2hfcmVzdWx0czx0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfU1QsIF9TQT46OmNvbnN0X2l0ZXJhdG9yLCBfQWxsb2NhdG9yPiYgX19tLAorICAgICAgICAgICAgY29uc3QgYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPiYgX19lLAorICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkgPSBkZWxldGU7IAorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorcmVnZXhfbWF0Y2goY29uc3QgX0NoYXJUKiBfX3N0ciwgY29uc3QgYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPiYgX19lLAorICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OnJlZ2V4X21hdGNoKF9fc3RyLCBfX3N0ciArIF9UcmFpdHM6Omxlbmd0aChfX3N0ciksIF9fZSwgX19mbGFncyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfU1QsIGNsYXNzIF9TQSwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK3JlZ2V4X21hdGNoKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9TVCwgX1NBPiYgX19zLAorICAgICAgICAgICAgY29uc3QgYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPiYgX19lLAorICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OnJlZ2V4X21hdGNoKF9fcy5iZWdpbigpLCBfX3MuZW5kKCksIF9fZSwgX19mbGFncyk7Cit9CisKKy8vIHJlZ2V4X2l0ZXJhdG9yCisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLAorICAgICAgICAgIGNsYXNzIF9DaGFyVCA9IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKyAgICAgICAgICBjbGFzcyBfVHJhaXRzID0gcmVnZXhfdHJhaXRzPF9DaGFyVD4gPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgcmVnZXhfaXRlcmF0b3IKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGJhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgcmVnZXhfdHlwZTsKKyAgICB0eXBlZGVmIG1hdGNoX3Jlc3VsdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4gdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworCitwcml2YXRlOgorICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgICAgICAgICAgIF9fYmVnaW5fOworICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgICAgICAgICAgIF9fZW5kXzsKKyAgICBjb25zdCByZWdleF90eXBlKiAgICAgICAgICAgICAgICBfX3ByZWdleF87CisgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFnc187CisgICAgdmFsdWVfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgX19tYXRjaF87CisKK3B1YmxpYzoKKyAgICByZWdleF9pdGVyYXRvcigpOworICAgIHJlZ2V4X2l0ZXJhdG9yKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19hLCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fYiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleF90eXBlJiBfX3JlLAorICAgICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorICAgIHJlZ2V4X2l0ZXJhdG9yKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19hLCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fYiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleF90eXBlJiYgX19yZSwKKyAgICAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX20gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpID0gZGVsZXRlOworI2VuZGlmCisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgcmVnZXhfaXRlcmF0b3ImIF9feCkgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCByZWdleF9pdGVyYXRvciYgX194KSBjb25zdCB7cmV0dXJuICEoKnRoaXMgPT0gX194KTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHtyZXR1cm4gIF9fbWF0Y2hfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgIHtyZXR1cm4gJl9fbWF0Y2hfO30KKworICAgIHJlZ2V4X2l0ZXJhdG9yJiBvcGVyYXRvcisrKCk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlZ2V4X2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KQorICAgIHsKKyAgICAgICAgcmVnZXhfaXRlcmF0b3IgX190KCp0aGlzKTsKKyAgICAgICAgKysoKnRoaXMpOworICAgICAgICByZXR1cm4gX190OworICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CityZWdleF9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBfQ2hhclQsIF9UcmFpdHM+OjpyZWdleF9pdGVyYXRvcigpCisgICAgOiBfX2JlZ2luXygpLCBfX2VuZF8oKSwgX19wcmVnZXhfKG51bGxwdHIpLCBfX2ZsYWdzXygpLCBfX21hdGNoXygpCit7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CityZWdleF9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICByZWdleF9pdGVyYXRvcihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fYSwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2IsCisgICAgICAgICAgICAgICAgICAgY29uc3QgcmVnZXhfdHlwZSYgX19yZSwgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tKQorICAgIDogX19iZWdpbl8oX19hKSwKKyAgICAgIF9fZW5kXyhfX2IpLAorICAgICAgX19wcmVnZXhfKCZfX3JlKSwKKyAgICAgIF9fZmxhZ3NfKF9fbSkKK3sKKyAgICBfVlNURDo6cmVnZXhfc2VhcmNoKF9fYmVnaW5fLCBfX2VuZF8sIF9fbWF0Y2hfLCAqX19wcmVnZXhfLCBfX2ZsYWdzXyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Citib29sCityZWdleF9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBvcGVyYXRvcj09KGNvbnN0IHJlZ2V4X2l0ZXJhdG9yJiBfX3gpIGNvbnN0Cit7CisgICAgaWYgKF9fbWF0Y2hfLmVtcHR5KCkgJiYgX194Ll9fbWF0Y2hfLmVtcHR5KCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChfX21hdGNoXy5lbXB0eSgpIHx8IF9feC5fX21hdGNoXy5lbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIF9fYmVnaW5fID09IF9feC5fX2JlZ2luXyAgICAgICAmJgorICAgICAgICAgICBfX2VuZF8gPT0gX194Ll9fZW5kXyAgICAgICAgICAgJiYKKyAgICAgICAgICAgX19wcmVnZXhfID09IF9feC5fX3ByZWdleF8gICAgICYmCisgICAgICAgICAgIF9fZmxhZ3NfID09IF9feC5fX2ZsYWdzXyAgICAgICAmJgorICAgICAgICAgICBfX21hdGNoX1swXSA9PSBfX3guX19tYXRjaF9bMF07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CityZWdleF9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBfQ2hhclQsIF9UcmFpdHM+JgorcmVnZXhfaXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3IrKygpCit7CisgICAgX19mbGFnc18gfD0gcmVnZXhfY29uc3RhbnRzOjpfX25vX3VwZGF0ZV9wb3M7CisgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX3N0YXJ0ID0gX19tYXRjaF9bMF0uc2Vjb25kOworICAgIGlmIChfX21hdGNoX1swXS5maXJzdCA9PSBfX21hdGNoX1swXS5zZWNvbmQpCisgICAgeworICAgICAgICBpZiAoX19zdGFydCA9PSBfX2VuZF8pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fbWF0Y2hfID0gdmFsdWVfdHlwZSgpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKF9WU1REOjpyZWdleF9zZWFyY2goX19zdGFydCwgX19lbmRfLCBfX21hdGNoXywgKl9fcHJlZ2V4XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmxhZ3NfIHwgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9ub3RfbnVsbCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2NvbnRpbnVvdXMpKQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICBlbHNlCisgICAgICAgICAgICArK19fc3RhcnQ7CisgICAgfQorICAgIF9fZmxhZ3NfIHw9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfcHJldl9hdmFpbDsKKyAgICBpZiAoIV9WU1REOjpyZWdleF9zZWFyY2goX19zdGFydCwgX19lbmRfLCBfX21hdGNoXywgKl9fcHJlZ2V4XywgX19mbGFnc18pKQorICAgICAgICBfX21hdGNoXyA9IHZhbHVlX3R5cGUoKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3R5cGVkZWYgcmVnZXhfaXRlcmF0b3I8Y29uc3QgY2hhcio+ICAgICAgICAgICAgIGNyZWdleF9pdGVyYXRvcjsKK3R5cGVkZWYgcmVnZXhfaXRlcmF0b3I8Y29uc3Qgd2NoYXJfdCo+ICAgICAgICAgIHdjcmVnZXhfaXRlcmF0b3I7Cit0eXBlZGVmIHJlZ2V4X2l0ZXJhdG9yPHN0cmluZzo6Y29uc3RfaXRlcmF0b3I+ICBzcmVnZXhfaXRlcmF0b3I7Cit0eXBlZGVmIHJlZ2V4X2l0ZXJhdG9yPHdzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiB3c3JlZ2V4X2l0ZXJhdG9yOworCisvLyByZWdleF90b2tlbl9pdGVyYXRvcgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwKKyAgICAgICAgICBjbGFzcyBfQ2hhclQgPSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisgICAgICAgICAgY2xhc3MgX1RyYWl0cyA9IHJlZ2V4X3RyYWl0czxfQ2hhclQ+ID4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yCit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBiYXNpY19yZWdleDxfQ2hhclQsIF9UcmFpdHM+ICAgICAgcmVnZXhfdHlwZTsKKyAgICB0eXBlZGVmIHN1Yl9tYXRjaDxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPiB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHJlZ2V4X2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9DaGFyVCwgX1RyYWl0cz4gX1Bvc2l0aW9uOworCisgICAgX1Bvc2l0aW9uICAgICAgICAgX19wb3NpdGlvbl87CisgICAgY29uc3QgdmFsdWVfdHlwZSogX19yZXN1bHRfOworICAgIHZhbHVlX3R5cGUgICAgICAgIF9fc3VmZml4XzsKKyAgICBwdHJkaWZmX3QgICAgICAgICBfX25fOworICAgIHZlY3RvcjxpbnQ+ICAgICAgIF9fc3Vic187CisKK3B1YmxpYzoKKyAgICByZWdleF90b2tlbl9pdGVyYXRvcigpOworICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19hLCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleF90eXBlJiBfX3JlLCBpbnQgX19zdWJtYXRjaCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICByZWdleF90b2tlbl9pdGVyYXRvcihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fYSwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVnZXhfdHlwZSYmIF9fcmUsIGludCBfX3N1Ym1hdGNoID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX20gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KSA9IGRlbGV0ZTsKKyNlbmRpZgorCisgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2EsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4X3R5cGUmIF9fcmUsIGNvbnN0IHZlY3RvcjxpbnQ+JiBfX3N1Ym1hdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICByZWdleF90b2tlbl9pdGVyYXRvcihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fYSwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVnZXhfdHlwZSYmIF9fcmUsIGNvbnN0IHZlY3RvcjxpbnQ+JiBfX3N1Ym1hdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpID0gZGVsZXRlOworI2VuZGlmCisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2EsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4X3R5cGUmIF9fcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJfbGlzdDxpbnQ+IF9fc3VibWF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX20gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2EsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4X3R5cGUmJiBfX3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVyX2xpc3Q8aW50PiBfX3N1Ym1hdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkgPSBkZWxldGU7CisjZW5kaWYKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdGVtcGxhdGUgPHNpemVfdCBfTnA+CisgICAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVnZXhfdHlwZSYgX19yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICgmX19zdWJtYXRjaGVzKVtfTnBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX20gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorICAgIHRlbXBsYXRlIDxzdGQ6OnNpemVfdCBfTnA+CisgICAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVnZXhfdHlwZSYmIF9fcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAoJl9fc3VibWF0Y2hlcylbX05wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KSA9IGRlbGV0ZTsKKyNlbmRpZgorCisgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoY29uc3QgcmVnZXhfdG9rZW5faXRlcmF0b3ImKTsKKyAgICByZWdleF90b2tlbl9pdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJik7CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgcmVnZXhfdG9rZW5faXRlcmF0b3ImIF9feCkgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCByZWdleF90b2tlbl9pdGVyYXRvciYgX194KSBjb25zdCB7cmV0dXJuICEoKnRoaXMgPT0gX194KTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgdmFsdWVfdHlwZSYgb3BlcmF0b3IqKCkgY29uc3Qge3JldHVybiAqX19yZXN1bHRfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgdmFsdWVfdHlwZSogb3BlcmF0b3ItPigpIGNvbnN0IHtyZXR1cm4gX19yZXN1bHRfO30KKworICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJiBvcGVyYXRvcisrKCk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KQorICAgIHsKKyAgICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IgX190KCp0aGlzKTsKKyAgICAgICAgKysoKnRoaXMpOworICAgICAgICByZXR1cm4gX190OworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIF9faW5pdChfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fYSwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2IpOworICAgIHZvaWQgX19lc3RhYmxpc2hfcmVzdWx0ICgpIHsKKyAgICAgICAgaWYgKF9fc3Vic19bX19uX10gPT0gLTEpCisgICAgICAgICAgICBfX3Jlc3VsdF8gPSAmX19wb3NpdGlvbl8tPnByZWZpeCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3Jlc3VsdF8gPSAmKCpfX3Bvc2l0aW9uXylbX19zdWJzX1tfX25fXV07CisgICAgICAgIH0gICAgICAgCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorcmVnZXhfdG9rZW5faXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX0NoYXJULCBfVHJhaXRzPjo6CisgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoKQorICAgIDogX19yZXN1bHRfKG51bGxwdHIpLAorICAgICAgX19zdWZmaXhfKCksCisgICAgICBfX25fKDApCit7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCityZWdleF90b2tlbl9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBfX2luaXQoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2EsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19iKQoreworICAgIGlmIChfX3Bvc2l0aW9uXyAhPSBfUG9zaXRpb24oKSkKKyAgICAgICAgX19lc3RhYmxpc2hfcmVzdWx0ICgpOworICAgIGVsc2UgaWYgKF9fc3Vic19bX19uX10gPT0gLTEpCisgICAgeworICAgICAgICBfX3N1ZmZpeF8ubWF0Y2hlZCA9IHRydWU7CisgICAgICAgIF9fc3VmZml4Xy5maXJzdCA9IF9fYTsKKyAgICAgICAgX19zdWZmaXhfLnNlY29uZCA9IF9fYjsKKyAgICAgICAgX19yZXN1bHRfID0gJl9fc3VmZml4XzsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBfX3Jlc3VsdF8gPSBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorcmVnZXhfdG9rZW5faXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX0NoYXJULCBfVHJhaXRzPjo6CisgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2EsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4X3R5cGUmIF9fcmUsIGludCBfX3N1Ym1hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fbSkKKyAgICA6IF9fcG9zaXRpb25fKF9fYSwgX19iLCBfX3JlLCBfX20pLAorICAgICAgX19uXygwKSwKKyAgICAgIF9fc3Vic18oMSwgX19zdWJtYXRjaCkKK3sKKyAgICBfX2luaXQoX19hLCBfX2IpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorcmVnZXhfdG9rZW5faXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX0NoYXJULCBfVHJhaXRzPjo6CisgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2EsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4X3R5cGUmIF9fcmUsIGNvbnN0IHZlY3RvcjxpbnQ+JiBfX3N1Ym1hdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tKQorICAgIDogX19wb3NpdGlvbl8oX19hLCBfX2IsIF9fcmUsIF9fbSksCisgICAgICBfX25fKDApLAorICAgICAgX19zdWJzXyhfX3N1Ym1hdGNoZXMpCit7CisgICAgX19pbml0KF9fYSwgX19iKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3JlZ2V4X3Rva2VuX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19hLCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleF90eXBlJiBfX3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVyX2xpc3Q8aW50PiBfX3N1Ym1hdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tKQorICAgIDogX19wb3NpdGlvbl8oX19hLCBfX2IsIF9fcmUsIF9fbSksCisgICAgICBfX25fKDApLAorICAgICAgX19zdWJzXyhfX3N1Ym1hdGNoZXMpCit7CisgICAgX19pbml0KF9fYSwgX19iKTsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3RlbXBsYXRlIDxzaXplX3QgX05wPgorcmVnZXhfdG9rZW5faXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX0NoYXJULCBfVHJhaXRzPjo6CisgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2EsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleF90eXBlJiBfX3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKCZfX3N1Ym1hdGNoZXMpW19OcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fbSkKKyAgICA6IF9fcG9zaXRpb25fKF9fYSwgX19iLCBfX3JlLCBfX20pLAorICAgICAgX19uXygwKSwKKyAgICAgIF9fc3Vic18oX19zdWJtYXRjaGVzLCBfX3N1Ym1hdGNoZXMgKyBfTnApCit7CisgICAgX19pbml0KF9fYSwgX19iKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3JlZ2V4X3Rva2VuX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKGNvbnN0IHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJiBfX3gpCisgICAgOiBfX3Bvc2l0aW9uXyhfX3guX19wb3NpdGlvbl8pLAorICAgICAgX19yZXN1bHRfKF9feC5fX3Jlc3VsdF8pLAorICAgICAgX19zdWZmaXhfKF9feC5fX3N1ZmZpeF8pLAorICAgICAgX19uXyhfX3guX19uXyksCisgICAgICBfX3N1YnNfKF9feC5fX3N1YnNfKQoreworICAgIGlmIChfX3guX19yZXN1bHRfID09ICZfX3guX19zdWZmaXhfKQorICAgICAgICBfX3Jlc3VsdF8gPSAmX19zdWZmaXhfOworICAgIGVsc2UgaWYgKCBfX3Jlc3VsdF8gIT0gbnVsbHB0ciApCisgICAgICAgIF9fZXN0YWJsaXNoX3Jlc3VsdCAoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3JlZ2V4X3Rva2VuX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9DaGFyVCwgX1RyYWl0cz4mCityZWdleF90b2tlbl9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBvcGVyYXRvcj0oY29uc3QgcmVnZXhfdG9rZW5faXRlcmF0b3ImIF9feCkKK3sKKyAgICBpZiAodGhpcyAhPSAmX194KQorICAgIHsKKyAgICAgICAgX19wb3NpdGlvbl8gPSBfX3guX19wb3NpdGlvbl87CisgICAgICAgIGlmIChfX3guX19yZXN1bHRfID09ICZfX3guX19zdWZmaXhfKQorICAgICAgICAgICAgX19yZXN1bHRfID0gJl9fc3VmZml4XzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX19yZXN1bHRfID0gX194Ll9fcmVzdWx0XzsKKyAgICAgICAgX19zdWZmaXhfID0gX194Ll9fc3VmZml4XzsKKyAgICAgICAgX19uXyA9IF9feC5fX25fOworICAgICAgICBfX3N1YnNfID0gX194Ll9fc3Vic187CisKKyAgICAgICAgaWYgKCBfX3Jlc3VsdF8gIT0gbnVsbHB0ciAmJiBfX3Jlc3VsdF8gIT0gJl9fc3VmZml4XyApCisgICAgICAgICAgICBfX2VzdGFibGlzaF9yZXN1bHQoKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYm9vbAorcmVnZXhfdG9rZW5faXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX0NoYXJULCBfVHJhaXRzPjo6CisgICAgb3BlcmF0b3I9PShjb25zdCByZWdleF90b2tlbl9pdGVyYXRvciYgX194KSBjb25zdAoreworICAgIGlmIChfX3Jlc3VsdF8gPT0gbnVsbHB0ciAmJiBfX3guX19yZXN1bHRfID09IG51bGxwdHIpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChfX3Jlc3VsdF8gPT0gJl9fc3VmZml4XyAmJiBfX3guX19yZXN1bHRfID09ICZfX3guX19zdWZmaXhfICYmCisgICAgICAgICAgICBfX3N1ZmZpeF8gPT0gX194Ll9fc3VmZml4XykKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKF9fcmVzdWx0XyA9PSBudWxscHRyIHx8IF9feC5fX3Jlc3VsdF8gPT0gbnVsbHB0cikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChfX3Jlc3VsdF8gPT0gJl9fc3VmZml4XyB8fCBfX3guX19yZXN1bHRfID09ICZfX3guX19zdWZmaXhfKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIF9fcG9zaXRpb25fID09IF9feC5fX3Bvc2l0aW9uXyAmJiBfX25fID09IF9feC5fX25fICYmCisgICAgICAgICAgIF9fc3Vic18gPT0gX194Ll9fc3Vic187Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CityZWdleF90b2tlbl9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBfQ2hhclQsIF9UcmFpdHM+JgorcmVnZXhfdG9rZW5faXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3IrKygpCit7CisgICAgX1Bvc2l0aW9uIF9fcHJldiA9IF9fcG9zaXRpb25fOworICAgIGlmIChfX3Jlc3VsdF8gPT0gJl9fc3VmZml4XykKKyAgICAgICAgX19yZXN1bHRfID0gbnVsbHB0cjsKKyAgICBlbHNlIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KF9fbl8gKyAxKSA8IF9fc3Vic18uc2l6ZSgpKQorICAgIHsKKyAgICAgICAgKytfX25fOworICAgICAgICBfX2VzdGFibGlzaF9yZXN1bHQoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX19uXyA9IDA7CisgICAgICAgICsrX19wb3NpdGlvbl87CisgICAgICAgIGlmIChfX3Bvc2l0aW9uXyAhPSBfUG9zaXRpb24oKSkKKyAgICAgICAgICAgIF9fZXN0YWJsaXNoX3Jlc3VsdCgpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfVlNURDo6ZmluZChfX3N1YnNfLmJlZ2luKCksIF9fc3Vic18uZW5kKCksIC0xKSAhPSBfX3N1YnNfLmVuZCgpCisgICAgICAgICAgICAgICAgJiYgX19wcmV2LT5zdWZmaXgoKS5sZW5ndGgoKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fc3VmZml4Xy5tYXRjaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBfX3N1ZmZpeF8uZmlyc3QgPSBfX3ByZXYtPnN1ZmZpeCgpLmZpcnN0OworICAgICAgICAgICAgICAgIF9fc3VmZml4Xy5zZWNvbmQgPSBfX3ByZXYtPnN1ZmZpeCgpLnNlY29uZDsKKyAgICAgICAgICAgICAgICBfX3Jlc3VsdF8gPSAmX19zdWZmaXhfOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9fcmVzdWx0XyA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworfQorCit0eXBlZGVmIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yPGNvbnN0IGNoYXIqPiAgICAgICAgICAgICBjcmVnZXhfdG9rZW5faXRlcmF0b3I7Cit0eXBlZGVmIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yPGNvbnN0IHdjaGFyX3QqPiAgICAgICAgICB3Y3JlZ2V4X3Rva2VuX2l0ZXJhdG9yOwordHlwZWRlZiByZWdleF90b2tlbl9pdGVyYXRvcjxzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiAgc3JlZ2V4X3Rva2VuX2l0ZXJhdG9yOwordHlwZWRlZiByZWdleF90b2tlbl9pdGVyYXRvcjx3c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gd3NyZWdleF90b2tlbl9pdGVyYXRvcjsKKworLy8gcmVnZXhfcmVwbGFjZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLAorICAgICAgICAgIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9DaGFyVD4KK19PdXRwdXRJdGVyYXRvcgorcmVnZXhfcmVwbGFjZShfT3V0cHV0SXRlcmF0b3IgX19vdXRwdXRfaXRlciwKKyAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgY29uc3QgYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPiYgX19lLCBjb25zdCBfQ2hhclQqIF9fZm10LAorICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQoreworICAgIHR5cGVkZWYgcmVnZXhfaXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX0NoYXJULCBfVHJhaXRzPiBfSXRlcjsKKyAgICBfSXRlciBfX2koX19maXJzdCwgX19sYXN0LCBfX2UsIF9fZmxhZ3MpOworICAgIF9JdGVyIF9fZW9mOworICAgIGlmIChfX2kgPT0gX19lb2YpCisgICAgeworICAgICAgICBpZiAoIShfX2ZsYWdzICYgcmVnZXhfY29uc3RhbnRzOjpmb3JtYXRfbm9fY29weSkpCisgICAgICAgICAgICBfX291dHB1dF9pdGVyID0gX1ZTVEQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX291dHB1dF9pdGVyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3ViX21hdGNoPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+IF9fbG07CisgICAgICAgIGZvciAoc2l6ZV90IF9fbGVuID0gY2hhcl90cmFpdHM8X0NoYXJUPjo6bGVuZ3RoKF9fZm10KTsgX19pICE9IF9fZW9mOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCEoX19mbGFncyAmIHJlZ2V4X2NvbnN0YW50czo6Zm9ybWF0X25vX2NvcHkpKQorICAgICAgICAgICAgICAgIF9fb3V0cHV0X2l0ZXIgPSBfVlNURDo6Y29weShfX2ktPnByZWZpeCgpLmZpcnN0LCBfX2ktPnByZWZpeCgpLnNlY29uZCwgX19vdXRwdXRfaXRlcik7CisgICAgICAgICAgICBfX291dHB1dF9pdGVyID0gX19pLT5mb3JtYXQoX19vdXRwdXRfaXRlciwgX19mbXQsIF9fZm10ICsgX19sZW4sIF9fZmxhZ3MpOworICAgICAgICAgICAgX19sbSA9IF9faS0+c3VmZml4KCk7CisgICAgICAgICAgICBpZiAoX19mbGFncyAmIHJlZ2V4X2NvbnN0YW50czo6Zm9ybWF0X2ZpcnN0X29ubHkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoX19mbGFncyAmIHJlZ2V4X2NvbnN0YW50czo6Zm9ybWF0X25vX2NvcHkpKQorICAgICAgICAgICAgX19vdXRwdXRfaXRlciA9IF9WU1REOjpjb3B5KF9fbG0uZmlyc3QsIF9fbG0uc2Vjb25kLCBfX291dHB1dF9pdGVyKTsKKyAgICB9CisgICAgcmV0dXJuIF9fb3V0cHV0X2l0ZXI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfT3V0cHV0SXRlcmF0b3IsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsCisgICAgICAgICAgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0NoYXJULCBjbGFzcyBfU1QsIGNsYXNzIF9TQT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfT3V0cHV0SXRlcmF0b3IKK3JlZ2V4X3JlcGxhY2UoX091dHB1dEl0ZXJhdG9yIF9fb3V0cHV0X2l0ZXIsCisgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz4mIF9fZSwKKyAgICAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1NULCBfU0E+JiBfX2ZtdCwKKyAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OnJlZ2V4X3JlcGxhY2UoX19vdXRwdXRfaXRlciwgX19maXJzdCwgX19sYXN0LCBfX2UsIF9fZm10LmNfc3RyKCksIF9fZmxhZ3MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cywgY2xhc3MgX0NoYXJULCBjbGFzcyBfU1QsIGNsYXNzIF9TQSwgY2xhc3MgX0ZTVCwKKyAgICAgICAgICBjbGFzcyBfRlNBPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9TVCwgX1NBPgorcmVnZXhfcmVwbGFjZShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfU1QsIF9TQT4mIF9fcywKKyAgICAgICAgICAgICAgY29uc3QgYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPiYgX19lLAorICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfRlNULCBfRlNBPiYgX19mbXQsCisgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCit7CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1NULCBfU0E+IF9fcjsKKyAgICBfVlNURDo6cmVnZXhfcmVwbGFjZShiYWNrX2luc2VydGVyKF9fciksIF9fcy5iZWdpbigpLCBfX3MuZW5kKCksIF9fZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZm10LmNfc3RyKCksIF9fZmxhZ3MpOworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9TVCwgY2xhc3MgX1NBPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9TVCwgX1NBPgorcmVnZXhfcmVwbGFjZShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfU1QsIF9TQT4mIF9fcywKKyAgICAgICAgICAgICAgY29uc3QgYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPiYgX19lLCBjb25zdCBfQ2hhclQqIF9fZm10LAorICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQoreworICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9TVCwgX1NBPiBfX3I7CisgICAgX1ZTVEQ6OnJlZ2V4X3JlcGxhY2UoYmFja19pbnNlcnRlcihfX3IpLCBfX3MuYmVnaW4oKSwgX19zLmVuZCgpLCBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ZtdCwgX19mbGFncyk7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1NULCBjbGFzcyBfU0E+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfc3RyaW5nPF9DaGFyVD4KK3JlZ2V4X3JlcGxhY2UoY29uc3QgX0NoYXJUKiBfX3MsCisgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaGFyVCwgX1RyYWl0cz4mIF9fZSwKKyAgICAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1NULCBfU0E+JiBfX2ZtdCwKKyAgICAgICAgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKK3sKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJUPiBfX3I7CisgICAgX1ZTVEQ6OnJlZ2V4X3JlcGxhY2UoYmFja19pbnNlcnRlcihfX3IpLCBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICBfX3MgKyBjaGFyX3RyYWl0czxfQ2hhclQ+OjpsZW5ndGgoX19zKSwgX19lLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mbXQuY19zdHIoKSwgX19mbGFncyk7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9DaGFyVD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19zdHJpbmc8X0NoYXJUPgorcmVnZXhfcmVwbGFjZShjb25zdCBfQ2hhclQqIF9fcywKKyAgICAgICAgICAgICAgY29uc3QgYmFzaWNfcmVnZXg8X0NoYXJULCBfVHJhaXRzPiYgX19lLAorICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fZm10LAorICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQoreworICAgIGJhc2ljX3N0cmluZzxfQ2hhclQ+IF9fcjsKKyAgICBfVlNURDo6cmVnZXhfcmVwbGFjZShiYWNrX2luc2VydGVyKF9fciksIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fcyArIGNoYXJfdHJhaXRzPF9DaGFyVD46Omxlbmd0aChfX3MpLCBfX2UsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ZtdCwgX19mbGFncyk7CisgICAgcmV0dXJuIF9fcjsKK30KKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCitfTElCQ1BQX1BPUF9NQUNST1MKKworI2VuZGlmICAvLyBfTElCQ1BQX1JFR0VYCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc2NvcGVkX2FsbG9jYXRvciBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zY29wZWRfYWxsb2NhdG9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NjBkOTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc2NvcGVkX2FsbG9jYXRvcgpAQCAtMCwwICsxLDY4MyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2NvcGVkX2FsbG9jYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9TQ09QRURfQUxMT0NBVE9SCisjZGVmaW5lIF9MSUJDUFBfU0NPUEVEX0FMTE9DQVRPUgorCisvKgorICAgIHNjb3BlZF9hbGxvY2F0b3Igc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCit0ZW1wbGF0ZSA8Y2xhc3MgT3V0ZXJBbGxvYywgY2xhc3MuLi4gSW5uZXJBbGxvY3M+CitjbGFzcyBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3IgOiBwdWJsaWMgT3V0ZXJBbGxvYworeworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxPdXRlckFsbG9jPiBPdXRlclRyYWl0czsgLy8gZXhwb3NpdGlvbiBvbmx5CisgICAgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yPElubmVyQWxsb2NzLi4uPiBpbm5lcjsgICAvLyBleHBvc2l0aW9uIG9ubHkKK3B1YmxpYzoKKworICAgIHR5cGVkZWYgT3V0ZXJBbGxvYyBvdXRlcl9hbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHNlZSBiZWxvdyBpbm5lcl9hbGxvY2F0b3JfdHlwZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgT3V0ZXJUcmFpdHM6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE91dGVyVHJhaXRzOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgT3V0ZXJUcmFpdHM6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBPdXRlclRyYWl0czo6cG9pbnRlciBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgT3V0ZXJUcmFpdHM6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE91dGVyVHJhaXRzOjp2b2lkX3BvaW50ZXIgdm9pZF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgT3V0ZXJUcmFpdHM6OmNvbnN0X3ZvaWRfcG9pbnRlciBjb25zdF92b2lkX3BvaW50ZXI7CisKKyAgICB0eXBlZGVmIHNlZSBiZWxvdyBwcm9wYWdhdGVfb25fY29udGFpbmVyX2NvcHlfYXNzaWdubWVudDsKKyAgICB0eXBlZGVmIHNlZSBiZWxvdyBwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDsKKyAgICB0eXBlZGVmIHNlZSBiZWxvdyBwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXA7CisgICAgdHlwZWRlZiBzZWUgYmVsb3cgaXNfYWx3YXlzX2VxdWFsOworCisgICAgdGVtcGxhdGUgPGNsYXNzIFRwPgorICAgICAgICBzdHJ1Y3QgcmViaW5kCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yPAorICAgICAgICAgICAgICAgIE91dGVyVHJhaXRzOjp0ZW1wbGF0ZSByZWJpbmRfYWxsb2M8VHA+LCBJbm5lckFsbG9jcy4uLj4gb3RoZXI7CisgICAgICAgIH07CisKKyAgICBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3IoKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgT3V0ZXJBMj4KKyAgICAgICAgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yKE91dGVyQTImJiBvdXRlckFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5uZXJBbGxvY3MmLi4uIGlubmVyQWxsb2NzKSBub2V4Y2VwdDsKKyAgICBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3IoY29uc3Qgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yJiBvdGhlcikgbm9leGNlcHQ7CisgICAgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yKHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvciYmIG90aGVyKSBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgT3V0ZXJBMj4KKyAgICAgICAgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yKGNvbnN0IHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxPdXRlckEyLCBJbm5lckFsbG9jcy4uLj4mIG90aGVyKSBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgT3V0ZXJBMj4KKyAgICAgICAgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yKGNvbnN0IHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxPdXRlckEyLCBJbm5lckFsbG9jcy4uLj4mJiBvdGhlcikgbm9leGNlcHQ7CisKKyAgICBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3ImIG9wZXJhdG9yPShjb25zdCBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3ImKSA9IGRlZmF1bHQ7CisgICAgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yJiBvcGVyYXRvcj0oc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yJiYpID0gZGVmYXVsdDsKKyAgICB+c2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yKCk7CisKKyAgICBpbm5lcl9hbGxvY2F0b3JfdHlwZSYgaW5uZXJfYWxsb2NhdG9yKCkgbm9leGNlcHQ7CisgICAgY29uc3QgaW5uZXJfYWxsb2NhdG9yX3R5cGUmIGlubmVyX2FsbG9jYXRvcigpIGNvbnN0IG5vZXhjZXB0OworCisgICAgb3V0ZXJfYWxsb2NhdG9yX3R5cGUmIG91dGVyX2FsbG9jYXRvcigpIG5vZXhjZXB0OworICAgIGNvbnN0IG91dGVyX2FsbG9jYXRvcl90eXBlJiBvdXRlcl9hbGxvY2F0b3IoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIHBvaW50ZXIgYWxsb2NhdGUoc2l6ZV90eXBlIG4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFtbbm9kaXNjYXJkXV0gaW4gQysrMjAKKyAgICBwb2ludGVyIGFsbG9jYXRlKHNpemVfdHlwZSBuLCBjb25zdF92b2lkX3BvaW50ZXIgaGludCk7ICAvLyBbW25vZGlzY2FyZF1dIGluIEMrKzIwCisgICAgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIgcCwgc2l6ZV90eXBlIG4pIG5vZXhjZXB0OworCisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzLi4uIEFyZ3M+IHZvaWQgY29uc3RydWN0KFQqIHAsIEFyZ3MmJiBhcmdzKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyLCBjbGFzcy4uLiBBcmdzMSwgY2xhc3MuLi4gQXJnczI+CisgICAgICAgIHZvaWQgY29uc3RydWN0KHBhaXI8VDEsIFQyPiogcCwgcGllY2V3aXNlX2NvbnN0cnVjdCB0LCB0dXBsZTxBcmdzMS4uLj4geCwKKyAgICAgICAgICAgICAgICAgICAgICAgdHVwbGU8QXJnczIuLi4+IHkpOworICAgIHRlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+CisgICAgICAgIHZvaWQgY29uc3RydWN0KHBhaXI8VDEsIFQyPiogcCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMiwgY2xhc3MgVSwgY2xhc3MgVj4KKyAgICAgICAgdm9pZCBjb25zdHJ1Y3QocGFpcjxUMSwgVDI+KiBwLCBVJiYgeCwgViYmIHkpOworICAgIHRlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDIsIGNsYXNzIFUsIGNsYXNzIFY+CisgICAgICAgIHZvaWQgY29uc3RydWN0KHBhaXI8VDEsIFQyPiogcCwgY29uc3QgcGFpcjxVLCBWPiYgeCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMiwgY2xhc3MgVSwgY2xhc3MgVj4KKyAgICAgICAgdm9pZCBjb25zdHJ1Y3QocGFpcjxUMSwgVDI+KiBwLCBwYWlyPFUsIFY+JiYgeCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgZGVzdHJveShUKiBwKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGRlc3Ryb3koVCogcCkgbm9leGNlcHQ7CisKKyAgICBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3Igc2VsZWN0X29uX2NvbnRhaW5lcl9jb3B5X2NvbnN0cnVjdGlvbigpIGNvbnN0IG5vZXhjZXB0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIE91dGVyQTEsIGNsYXNzIE91dGVyQTIsIGNsYXNzLi4uIElubmVyQWxsb2NzPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxPdXRlckExLCBJbm5lckFsbG9jcy4uLj4mIGEsCisgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I8T3V0ZXJBMiwgSW5uZXJBbGxvY3MuLi4+JiBiKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIE91dGVyQTEsIGNsYXNzIE91dGVyQTIsIGNsYXNzLi4uIElubmVyQWxsb2NzPgorICAgIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxPdXRlckExLCBJbm5lckFsbG9jcy4uLj4mIGEsCisgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I8T3V0ZXJBMiwgSW5uZXJBbGxvY3MuLi4+JiBiKSBub2V4Y2VwdDsKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKworI2lmICFkZWZpbmVkKF9MSUJDUFBfQ1hYMDNfTEFORykKKworLy8gc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yCisKK3RlbXBsYXRlIDxjbGFzcyAuLi5fQWxsb2NzPgorY2xhc3Mgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yOworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FsbG9jcz4gc3RydWN0IF9fZ2V0X3BvY19jb3B5X2Fzc2lnbm1lbnQ7CisKK3RlbXBsYXRlIDxjbGFzcyBfQTA+CitzdHJ1Y3QgX19nZXRfcG9jX2NvcHlfYXNzaWdubWVudDxfQTA+Cit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBhbGxvY2F0b3JfdHJhaXRzPF9BMD46OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9jb3B5X2Fzc2lnbm1lbnQ6OnZhbHVlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BMCwgY2xhc3MgLi4uX0FsbG9jcz4KK3N0cnVjdCBfX2dldF9wb2NfY29weV9hc3NpZ25tZW50PF9BMCwgX0FsbG9jcy4uLj4KK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9CisgICAgICAgIGFsbG9jYXRvcl90cmFpdHM8X0EwPjo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9jb3B5X2Fzc2lnbm1lbnQ6OnZhbHVlIHx8CisgICAgICAgIF9fZ2V0X3BvY19jb3B5X2Fzc2lnbm1lbnQ8X0FsbG9jcy4uLj46OnZhbHVlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIC4uLl9BbGxvY3M+IHN0cnVjdCBfX2dldF9wb2NfbW92ZV9hc3NpZ25tZW50OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0EwPgorc3RydWN0IF9fZ2V0X3BvY19tb3ZlX2Fzc2lnbm1lbnQ8X0EwPgoreworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gYWxsb2NhdG9yX3RyYWl0czxfQTA+OjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQTAsIGNsYXNzIC4uLl9BbGxvY3M+CitzdHJ1Y3QgX19nZXRfcG9jX21vdmVfYXNzaWdubWVudDxfQTAsIF9BbGxvY3MuLi4+Cit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPQorICAgICAgICBhbGxvY2F0b3JfdHJhaXRzPF9BMD46OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZSB8fAorICAgICAgICBfX2dldF9wb2NfbW92ZV9hc3NpZ25tZW50PF9BbGxvY3MuLi4+Ojp2YWx1ZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyAuLi5fQWxsb2NzPiBzdHJ1Y3QgX19nZXRfcG9jX3N3YXA7CisKK3RlbXBsYXRlIDxjbGFzcyBfQTA+CitzdHJ1Y3QgX19nZXRfcG9jX3N3YXA8X0EwPgoreworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gYWxsb2NhdG9yX3RyYWl0czxfQTA+OjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0EwLCBjbGFzcyAuLi5fQWxsb2NzPgorc3RydWN0IF9fZ2V0X3BvY19zd2FwPF9BMCwgX0FsbG9jcy4uLj4KK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9CisgICAgICAgIGFsbG9jYXRvcl90cmFpdHM8X0EwPjo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwOjp2YWx1ZSB8fAorICAgICAgICBfX2dldF9wb2Nfc3dhcDxfQWxsb2NzLi4uPjo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FsbG9jcz4gc3RydWN0IF9fZ2V0X2lzX2Fsd2F5c19lcXVhbDsKKwordGVtcGxhdGUgPGNsYXNzIF9BMD4KK3N0cnVjdCBfX2dldF9pc19hbHdheXNfZXF1YWw8X0EwPgoreworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gYWxsb2NhdG9yX3RyYWl0czxfQTA+Ojppc19hbHdheXNfZXF1YWw6OnZhbHVlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BMCwgY2xhc3MgLi4uX0FsbG9jcz4KK3N0cnVjdCBfX2dldF9pc19hbHdheXNfZXF1YWw8X0EwLCBfQWxsb2NzLi4uPgoreworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0KKyAgICAgICAgYWxsb2NhdG9yX3RyYWl0czxfQTA+Ojppc19hbHdheXNfZXF1YWw6OnZhbHVlICYmCisgICAgICAgIF9fZ2V0X2lzX2Fsd2F5c19lcXVhbDxfQWxsb2NzLi4uPjo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FsbG9jcz4KK2NsYXNzIF9fc2NvcGVkX2FsbG9jYXRvcl9zdG9yYWdlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX091dGVyQWxsb2MsIGNsYXNzLi4uIF9Jbm5lckFsbG9jcz4KK2NsYXNzIF9fc2NvcGVkX2FsbG9jYXRvcl9zdG9yYWdlPF9PdXRlckFsbG9jLCBfSW5uZXJBbGxvY3MuLi4+CisgICAgOiBwdWJsaWMgX091dGVyQWxsb2MKK3sKKyAgICB0eXBlZGVmIF9PdXRlckFsbG9jIG91dGVyX2FsbG9jYXRvcl90eXBlOworcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yPF9Jbm5lckFsbG9jcy4uLj4gaW5uZXJfYWxsb2NhdG9yX3R5cGU7CisKK3ByaXZhdGU6CisgICAgaW5uZXJfYWxsb2NhdG9yX3R5cGUgX19pbm5lcl87CisKK3Byb3RlY3RlZDoKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3Njb3BlZF9hbGxvY2F0b3Jfc3RvcmFnZSgpIF9OT0VYQ0VQVCB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9PdXRlckEyLAorICAgICAgICAgICAgICBjbGFzcyA9IHR5cGVuYW1lIGVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NvbnN0cnVjdGlibGU8b3V0ZXJfYWxsb2NhdG9yX3R5cGUsIF9PdXRlckEyPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIF9fc2NvcGVkX2FsbG9jYXRvcl9zdG9yYWdlKF9PdXRlckEyJiYgX19vdXRlckFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSW5uZXJBbGxvY3MmIC4uLl9faW5uZXJBbGxvY3MpIF9OT0VYQ0VQVAorICAgICAgICAgICAgOiBvdXRlcl9hbGxvY2F0b3JfdHlwZShfVlNURDo6Zm9yd2FyZDxfT3V0ZXJBMj4oX19vdXRlckFsbG9jKSksCisgICAgICAgICAgICAgIF9faW5uZXJfKF9faW5uZXJBbGxvY3MuLi4pIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX091dGVyQTIsCisgICAgICAgICAgICAgIGNsYXNzID0gdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICAgICAgICAgaXNfY29uc3RydWN0aWJsZTxvdXRlcl9hbGxvY2F0b3JfdHlwZSwgY29uc3QgX091dGVyQTImPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIF9fc2NvcGVkX2FsbG9jYXRvcl9zdG9yYWdlKAorICAgICAgICAgICAgY29uc3QgX19zY29wZWRfYWxsb2NhdG9yX3N0b3JhZ2U8X091dGVyQTIsIF9Jbm5lckFsbG9jcy4uLj4mIF9fb3RoZXIpIF9OT0VYQ0VQVAorICAgICAgICAgICAgOiBvdXRlcl9hbGxvY2F0b3JfdHlwZShfX290aGVyLm91dGVyX2FsbG9jYXRvcigpKSwKKyAgICAgICAgICAgICAgX19pbm5lcl8oX19vdGhlci5pbm5lcl9hbGxvY2F0b3IoKSkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfT3V0ZXJBMiwKKyAgICAgICAgICAgICAgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgICAgICAgICAgICAgICAgICAgICBpc19jb25zdHJ1Y3RpYmxlPG91dGVyX2FsbG9jYXRvcl90eXBlLCBfT3V0ZXJBMj46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZT4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBfX3Njb3BlZF9hbGxvY2F0b3Jfc3RvcmFnZSgKKyAgICAgICAgICAgIF9fc2NvcGVkX2FsbG9jYXRvcl9zdG9yYWdlPF9PdXRlckEyLCBfSW5uZXJBbGxvY3MuLi4+JiYgX19vdGhlcikgX05PRVhDRVBUCisgICAgICAgICAgICA6IG91dGVyX2FsbG9jYXRvcl90eXBlKF9WU1REOjptb3ZlKF9fb3RoZXIub3V0ZXJfYWxsb2NhdG9yKCkpKSwKKyAgICAgICAgICAgICAgX19pbm5lcl8oX1ZTVEQ6Om1vdmUoX19vdGhlci5pbm5lcl9hbGxvY2F0b3IoKSkpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX091dGVyQTIsCisgICAgICAgICAgICAgIGNsYXNzID0gdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICAgICAgICAgaXNfY29uc3RydWN0aWJsZTxvdXRlcl9hbGxvY2F0b3JfdHlwZSwgX091dGVyQTI+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgID46OnR5cGU+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgX19zY29wZWRfYWxsb2NhdG9yX3N0b3JhZ2UoX091dGVyQTImJiBfX28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyX2FsbG9jYXRvcl90eXBlJiBfX2kpIF9OT0VYQ0VQVAorICAgICAgICAgICAgOiBvdXRlcl9hbGxvY2F0b3JfdHlwZShfVlNURDo6Zm9yd2FyZDxfT3V0ZXJBMj4oX19vKSksCisgICAgICAgICAgICAgIF9faW5uZXJfKF9faSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaW5uZXJfYWxsb2NhdG9yX3R5cGUmIGlubmVyX2FsbG9jYXRvcigpIF9OT0VYQ0VQVCAgICAgICAgICAgICB7cmV0dXJuIF9faW5uZXJfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgaW5uZXJfYWxsb2NhdG9yX3R5cGUmIGlubmVyX2FsbG9jYXRvcigpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9faW5uZXJfO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvdXRlcl9hbGxvY2F0b3JfdHlwZSYgb3V0ZXJfYWxsb2NhdG9yKCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gc3RhdGljX2Nhc3Q8b3V0ZXJfYWxsb2NhdG9yX3R5cGUmPigqdGhpcyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdCBvdXRlcl9hbGxvY2F0b3JfdHlwZSYgb3V0ZXJfYWxsb2NhdG9yKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3Qgb3V0ZXJfYWxsb2NhdG9yX3R5cGUmPigqdGhpcyk7fQorCisgICAgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yPG91dGVyX2FsbG9jYXRvcl90eXBlLCBfSW5uZXJBbGxvY3MuLi4+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb24oKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxvdXRlcl9hbGxvY2F0b3JfdHlwZSwgX0lubmVyQWxsb2NzLi4uPgorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90cmFpdHM8b3V0ZXJfYWxsb2NhdG9yX3R5cGU+OjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0X29uX2NvbnRhaW5lcl9jb3B5X2NvbnN0cnVjdGlvbihvdXRlcl9hbGxvY2F0b3IoKSksCisgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3RyYWl0czxpbm5lcl9hbGxvY2F0b3JfdHlwZT46OgorICAgICAgICAgICAgICAgICAgICBzZWxlY3Rfb25fY29udGFpbmVyX2NvcHlfY29uc3RydWN0aW9uKGlubmVyX2FsbG9jYXRvcigpKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uPiBmcmllbmQgY2xhc3MgX19zY29wZWRfYWxsb2NhdG9yX3N0b3JhZ2U7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX091dGVyQWxsb2M+CitjbGFzcyBfX3Njb3BlZF9hbGxvY2F0b3Jfc3RvcmFnZTxfT3V0ZXJBbGxvYz4KKyAgICA6IHB1YmxpYyBfT3V0ZXJBbGxvYworeworICAgIHR5cGVkZWYgX091dGVyQWxsb2Mgb3V0ZXJfYWxsb2NhdG9yX3R5cGU7Citwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I8X091dGVyQWxsb2M+IGlubmVyX2FsbG9jYXRvcl90eXBlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fc2NvcGVkX2FsbG9jYXRvcl9zdG9yYWdlKCkgX05PRVhDRVBUIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX091dGVyQTIsCisgICAgICAgICAgICAgIGNsYXNzID0gdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICAgICAgICAgaXNfY29uc3RydWN0aWJsZTxvdXRlcl9hbGxvY2F0b3JfdHlwZSwgX091dGVyQTI+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgID46OnR5cGU+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgX19zY29wZWRfYWxsb2NhdG9yX3N0b3JhZ2UoX091dGVyQTImJiBfX291dGVyQWxsb2MpIF9OT0VYQ0VQVAorICAgICAgICAgICAgOiBvdXRlcl9hbGxvY2F0b3JfdHlwZShfVlNURDo6Zm9yd2FyZDxfT3V0ZXJBMj4oX19vdXRlckFsbG9jKSkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfT3V0ZXJBMiwKKyAgICAgICAgICAgICAgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgICAgICAgICAgICAgICAgICAgICBpc19jb25zdHJ1Y3RpYmxlPG91dGVyX2FsbG9jYXRvcl90eXBlLCBjb25zdCBfT3V0ZXJBMiY+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgID46OnR5cGU+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgX19zY29wZWRfYWxsb2NhdG9yX3N0b3JhZ2UoCisgICAgICAgICAgICBjb25zdCBfX3Njb3BlZF9hbGxvY2F0b3Jfc3RvcmFnZTxfT3V0ZXJBMj4mIF9fb3RoZXIpIF9OT0VYQ0VQVAorICAgICAgICAgICAgOiBvdXRlcl9hbGxvY2F0b3JfdHlwZShfX290aGVyLm91dGVyX2FsbG9jYXRvcigpKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9PdXRlckEyLAorICAgICAgICAgICAgICBjbGFzcyA9IHR5cGVuYW1lIGVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NvbnN0cnVjdGlibGU8b3V0ZXJfYWxsb2NhdG9yX3R5cGUsIF9PdXRlckEyPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIF9fc2NvcGVkX2FsbG9jYXRvcl9zdG9yYWdlKAorICAgICAgICAgICAgX19zY29wZWRfYWxsb2NhdG9yX3N0b3JhZ2U8X091dGVyQTI+JiYgX19vdGhlcikgX05PRVhDRVBUCisgICAgICAgICAgICA6IG91dGVyX2FsbG9jYXRvcl90eXBlKF9WU1REOjptb3ZlKF9fb3RoZXIub3V0ZXJfYWxsb2NhdG9yKCkpKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGlubmVyX2FsbG9jYXRvcl90eXBlJiBpbm5lcl9hbGxvY2F0b3IoKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBzdGF0aWNfY2FzdDxpbm5lcl9hbGxvY2F0b3JfdHlwZSY+KCp0aGlzKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IGlubmVyX2FsbG9jYXRvcl90eXBlJiBpbm5lcl9hbGxvY2F0b3IoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBzdGF0aWNfY2FzdDxjb25zdCBpbm5lcl9hbGxvY2F0b3JfdHlwZSY+KCp0aGlzKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3V0ZXJfYWxsb2NhdG9yX3R5cGUmIG91dGVyX2FsbG9jYXRvcigpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIHN0YXRpY19jYXN0PG91dGVyX2FsbG9jYXRvcl90eXBlJj4oKnRoaXMpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3Qgb3V0ZXJfYWxsb2NhdG9yX3R5cGUmIG91dGVyX2FsbG9jYXRvcigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IG91dGVyX2FsbG9jYXRvcl90eXBlJj4oKnRoaXMpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I8b3V0ZXJfYWxsb2NhdG9yX3R5cGU+CisgICAgc2VsZWN0X29uX2NvbnRhaW5lcl9jb3B5X2NvbnN0cnVjdGlvbigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxvdXRlcl9hbGxvY2F0b3JfdHlwZT4oCisgICAgICAgICAgICBhbGxvY2F0b3JfdHJhaXRzPG91dGVyX2FsbG9jYXRvcl90eXBlPjo6CisgICAgICAgICAgICAgICAgc2VsZWN0X29uX2NvbnRhaW5lcl9jb3B5X2NvbnN0cnVjdGlvbihvdXRlcl9hbGxvY2F0b3IoKSkKKyAgICAgICAgKTt9CisKKyAgICBfX3Njb3BlZF9hbGxvY2F0b3Jfc3RvcmFnZShjb25zdCBvdXRlcl9hbGxvY2F0b3JfdHlwZSYgX19vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyX2FsbG9jYXRvcl90eXBlJiBfX2kpIF9OT0VYQ0VQVDsKKworICAgIHRlbXBsYXRlIDxjbGFzcy4uLj4gZnJpZW5kIGNsYXNzIF9fc2NvcGVkX2FsbG9jYXRvcl9zdG9yYWdlOworfTsKKworLy8gX19vdXRlcm1vc3QKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK2RlY2x0eXBlKGRlY2x2YWw8X0FsbG9jPigpLm91dGVyX2FsbG9jYXRvcigpLCB0cnVlX3R5cGUoKSkKK19faGFzX291dGVyX2FsbG9jYXRvcl90ZXN0KF9BbGxvYyYmIF9fYSk7CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CitmYWxzZV90eXBlCitfX2hhc19vdXRlcl9hbGxvY2F0b3JfdGVzdChjb25zdCB2b2xhdGlsZSBfQWxsb2MmIF9fYSk7CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CitzdHJ1Y3QgX19oYXNfb3V0ZXJfYWxsb2NhdG9yCisgICAgOiBwdWJsaWMgY29tbW9uX3R5cGUKKyAgICAgICAgICAgICA8CisgICAgICAgICAgICAgICAgIGRlY2x0eXBlKF9faGFzX291dGVyX2FsbG9jYXRvcl90ZXN0KGRlY2x2YWw8X0FsbG9jJj4oKSkpCisgICAgICAgICAgICAgPjo6dHlwZQoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYywgYm9vbCA9IF9faGFzX291dGVyX2FsbG9jYXRvcjxfQWxsb2M+Ojp2YWx1ZT4KK3N0cnVjdCBfX291dGVybW9zdAoreworICAgIHR5cGVkZWYgX0FsbG9jIHR5cGU7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGUmIG9wZXJhdG9yKCkodHlwZSYgX19hKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX2E7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfX291dGVybW9zdDxfQWxsb2MsIHRydWU+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICA8CisgICAgICAgICAgICAgICAgICAgICAgICBkZWNsdHlwZShfVlNURDo6ZGVjbHZhbDxfQWxsb2M+KCkub3V0ZXJfYWxsb2NhdG9yKCkpCisgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dGVyQWxsb2M7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX291dGVybW9zdDxfT3V0ZXJBbGxvYz46OnR5cGUgICAgICAgICAgICAgdHlwZTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZSYgb3BlcmF0b3IoKShfQWxsb2MmIF9fYSkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19vdXRlcm1vc3Q8X091dGVyQWxsb2M+KCkoX19hLm91dGVyX2FsbG9jYXRvcigpKTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX091dGVyQWxsb2MsIGNsYXNzLi4uIF9Jbm5lckFsbG9jcz4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxfT3V0ZXJBbGxvYywgX0lubmVyQWxsb2NzLi4uPgorICAgIDogcHVibGljIF9fc2NvcGVkX2FsbG9jYXRvcl9zdG9yYWdlPF9PdXRlckFsbG9jLCBfSW5uZXJBbGxvY3MuLi4+Cit7CisgICAgdHlwZWRlZiBfX3Njb3BlZF9hbGxvY2F0b3Jfc3RvcmFnZTxfT3V0ZXJBbGxvYywgX0lubmVyQWxsb2NzLi4uPiBiYXNlOworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfT3V0ZXJBbGxvYz4gICAgICAgICAgICAgX091dGVyVHJhaXRzOworcHVibGljOgorICAgIHR5cGVkZWYgX091dGVyQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJfYWxsb2NhdG9yX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlOjppbm5lcl9hbGxvY2F0b3JfdHlwZSAgICAgICBpbm5lcl9hbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9PdXRlclRyYWl0czo6c2l6ZV90eXBlICAgICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9PdXRlclRyYWl0czo6ZGlmZmVyZW5jZV90eXBlICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9PdXRlclRyYWl0czo6cG9pbnRlciAgICAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfT3V0ZXJUcmFpdHM6OmNvbnN0X3BvaW50ZXIgICAgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX091dGVyVHJhaXRzOjp2b2lkX3BvaW50ZXIgICAgICAgdm9pZF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX091dGVyVHJhaXRzOjpjb25zdF92b2lkX3BvaW50ZXIgY29uc3Rfdm9pZF9wb2ludGVyOworCisgICAgdHlwZWRlZiBpbnRlZ3JhbF9jb25zdGFudAorICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgIGJvb2wsCisgICAgICAgICAgICAgICAgX19nZXRfcG9jX2NvcHlfYXNzaWdubWVudDxvdXRlcl9hbGxvY2F0b3JfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Jbm5lckFsbG9jcy4uLj46OnZhbHVlCisgICAgICAgICAgICA+IHByb3BhZ2F0ZV9vbl9jb250YWluZXJfY29weV9hc3NpZ25tZW50OworICAgIHR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQKKyAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICBib29sLAorICAgICAgICAgICAgICAgIF9fZ2V0X3BvY19tb3ZlX2Fzc2lnbm1lbnQ8b3V0ZXJfYWxsb2NhdG9yX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5uZXJBbGxvY3MuLi4+Ojp2YWx1ZQorICAgICAgICAgICAgPiBwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDsKKyAgICB0eXBlZGVmIGludGVncmFsX2NvbnN0YW50CisgICAgICAgICAgICA8CisgICAgICAgICAgICAgICAgYm9vbCwKKyAgICAgICAgICAgICAgICBfX2dldF9wb2Nfc3dhcDxvdXRlcl9hbGxvY2F0b3JfdHlwZSwgX0lubmVyQWxsb2NzLi4uPjo6dmFsdWUKKyAgICAgICAgICAgID4gcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwOworICAgIHR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQKKyAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICBib29sLAorICAgICAgICAgICAgICAgIF9fZ2V0X2lzX2Fsd2F5c19lcXVhbDxvdXRlcl9hbGxvY2F0b3JfdHlwZSwgX0lubmVyQWxsb2NzLi4uPjo6dmFsdWUKKyAgICAgICAgICAgID4gaXNfYWx3YXlzX2VxdWFsOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBzdHJ1Y3QgcmViaW5kCisgICAgeworICAgICAgICB0eXBlZGVmIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcgorICAgICAgICA8CisgICAgICAgICAgICB0eXBlbmFtZSBfT3V0ZXJUcmFpdHM6OnRlbXBsYXRlIHJlYmluZF9hbGxvYzxfVHA+LCBfSW5uZXJBbGxvY3MuLi4KKyAgICAgICAgPiBvdGhlcjsKKyAgICB9OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcigpIF9OT0VYQ0VQVCB7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfT3V0ZXJBMiwKKyAgICAgICAgICAgICAgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgICAgICAgICAgICAgICAgICAgICBpc19jb25zdHJ1Y3RpYmxlPG91dGVyX2FsbG9jYXRvcl90eXBlLCBfT3V0ZXJBMj46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZT4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3IoX091dGVyQTImJiBfX291dGVyQWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSW5uZXJBbGxvY3MmIC4uLl9faW5uZXJBbGxvY3MpIF9OT0VYQ0VQVAorICAgICAgICAgICAgOiBiYXNlKF9WU1REOjpmb3J3YXJkPF9PdXRlckEyPihfX291dGVyQWxsb2MpLCBfX2lubmVyQWxsb2NzLi4uKSB7fQorICAgIC8vIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcihjb25zdCBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3ImIF9fb3RoZXIpID0gZGVmYXVsdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX091dGVyQTIsCisgICAgICAgICAgICAgIGNsYXNzID0gdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICAgICAgICAgaXNfY29uc3RydWN0aWJsZTxvdXRlcl9hbGxvY2F0b3JfdHlwZSwgY29uc3QgX091dGVyQTImPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcigKKyAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxfT3V0ZXJBMiwgX0lubmVyQWxsb2NzLi4uPiYgX19vdGhlcikgX05PRVhDRVBUCisgICAgICAgICAgICAgICAgOiBiYXNlKF9fb3RoZXIpIHt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9PdXRlckEyLAorICAgICAgICAgICAgICBjbGFzcyA9IHR5cGVuYW1lIGVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NvbnN0cnVjdGlibGU8b3V0ZXJfYWxsb2NhdG9yX3R5cGUsIF9PdXRlckEyPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcigKKyAgICAgICAgICAgIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxfT3V0ZXJBMiwgX0lubmVyQWxsb2NzLi4uPiYmIF9fb3RoZXIpIF9OT0VYQ0VQVAorICAgICAgICAgICAgICAgIDogYmFzZShfVlNURDo6bW92ZShfX290aGVyKSkge30KKworICAgIC8vIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvciYgb3BlcmF0b3I9KGNvbnN0IHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvciYpID0gZGVmYXVsdDsKKyAgICAvLyBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3ImIG9wZXJhdG9yPShzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3ImJikgPSBkZWZhdWx0OworICAgIC8vIH5zY29wZWRfYWxsb2NhdG9yX2FkYXB0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaW5uZXJfYWxsb2NhdG9yX3R5cGUmIGlubmVyX2FsbG9jYXRvcigpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGJhc2U6OmlubmVyX2FsbG9jYXRvcigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgaW5uZXJfYWxsb2NhdG9yX3R5cGUmIGlubmVyX2FsbG9jYXRvcigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGJhc2U6OmlubmVyX2FsbG9jYXRvcigpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvdXRlcl9hbGxvY2F0b3JfdHlwZSYgb3V0ZXJfYWxsb2NhdG9yKCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gYmFzZTo6b3V0ZXJfYWxsb2NhdG9yKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdCBvdXRlcl9hbGxvY2F0b3JfdHlwZSYgb3V0ZXJfYWxsb2NhdG9yKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gYmFzZTo6b3V0ZXJfYWxsb2NhdG9yKCk7fQorCisgICAgX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBvaW50ZXIgYWxsb2NhdGUoc2l6ZV90eXBlIF9fbikKKyAgICAgICAge3JldHVybiBhbGxvY2F0b3JfdHJhaXRzPG91dGVyX2FsbG9jYXRvcl90eXBlPjo6CisgICAgICAgICAgICBhbGxvY2F0ZShvdXRlcl9hbGxvY2F0b3IoKSwgX19uKTt9CisgICAgX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBvaW50ZXIgYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29uc3Rfdm9pZF9wb2ludGVyIF9faGludCkKKyAgICAgICAge3JldHVybiBhbGxvY2F0b3JfdHJhaXRzPG91dGVyX2FsbG9jYXRvcl90eXBlPjo6CisgICAgICAgICAgICBhbGxvY2F0ZShvdXRlcl9hbGxvY2F0b3IoKSwgX19uLCBfX2hpbnQpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pIF9OT0VYQ0VQVAorICAgICAgICB7YWxsb2NhdG9yX3RyYWl0czxvdXRlcl9hbGxvY2F0b3JfdHlwZT46OgorICAgICAgICAgICAgZGVhbGxvY2F0ZShvdXRlcl9hbGxvY2F0b3IoKSwgX19wLCBfX24pO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdAorICAgICAgICB7cmV0dXJuIGFsbG9jYXRvcl90cmFpdHM8b3V0ZXJfYWxsb2NhdG9yX3R5cGU+OjptYXhfc2l6ZShvdXRlcl9hbGxvY2F0b3IoKSk7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MuLi4gX0FyZ3M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdm9pZCBjb25zdHJ1Y3QoX1RwKiBfX3AsIF9BcmdzJiYgLi4uX19hcmdzKQorICAgICAgICAgICAge19fY29uc3RydWN0KF9fdXNlc19hbGxvY19jdG9yPF9UcCwgaW5uZXJfYWxsb2NhdG9yX3R5cGUmLCBfQXJncy4uLj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX3AsIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDIsIGNsYXNzLi4uIF9BcmdzMSwgY2xhc3MuLi4gX0FyZ3MyPgorICAgIHZvaWQgY29uc3RydWN0KHBhaXI8X1QxLCBfVDI+KiBfX3AsIHBpZWNld2lzZV9jb25zdHJ1Y3RfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgdHVwbGU8X0FyZ3MxLi4uPiBfX3gsIHR1cGxlPF9BcmdzMi4uLj4gX195KQorICAgIHsKKyAgICAgICAgdHlwZWRlZiBfX291dGVybW9zdDxvdXRlcl9hbGxvY2F0b3JfdHlwZT4gX09NOworICAgICAgICBhbGxvY2F0b3JfdHJhaXRzPHR5cGVuYW1lIF9PTTo6dHlwZT46OmNvbnN0cnVjdCgKKyAgICAgICAgICAgIF9PTSgpKG91dGVyX2FsbG9jYXRvcigpKSwgX19wLCBwaWVjZXdpc2VfY29uc3RydWN0CisgICAgICAgICAgLCBfX3RyYW5zZm9ybV90dXBsZSgKKyAgICAgICAgICAgICAgdHlwZW5hbWUgX191c2VzX2FsbG9jX2N0b3I8CisgICAgICAgICAgICAgICAgICBfVDEsIGlubmVyX2FsbG9jYXRvcl90eXBlJiwgX0FyZ3MxLi4uCisgICAgICAgICAgICAgID46OnR5cGUoKQorICAgICAgICAgICAgLCBfVlNURDo6bW92ZShfX3gpCisgICAgICAgICAgICAsIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPHNpemVvZi4uLihfQXJnczEpPjo6dHlwZXt9CisgICAgICAgICAgKQorICAgICAgICAgICwgX190cmFuc2Zvcm1fdHVwbGUoCisgICAgICAgICAgICAgIHR5cGVuYW1lIF9fdXNlc19hbGxvY19jdG9yPAorICAgICAgICAgICAgICAgICAgX1QyLCBpbm5lcl9hbGxvY2F0b3JfdHlwZSYsIF9BcmdzMi4uLgorICAgICAgICAgICAgICA+Ojp0eXBlKCkKKyAgICAgICAgICAgICwgX1ZTVEQ6Om1vdmUoX195KQorICAgICAgICAgICAgLCB0eXBlbmFtZSBfX21ha2VfdHVwbGVfaW5kaWNlczxzaXplb2YuLi4oX0FyZ3MyKT46OnR5cGV7fQorICAgICAgICAgICkKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CisgICAgdm9pZCBjb25zdHJ1Y3QocGFpcjxfVDEsIF9UMj4qIF9fcCkKKyAgICB7IGNvbnN0cnVjdChfX3AsIHBpZWNld2lzZV9jb25zdHJ1Y3QsIHR1cGxlPD57fSwgdHVwbGU8Pnt9KTsgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyLCBjbGFzcyBfVXAsIGNsYXNzIF9WcD4KKyAgICB2b2lkIGNvbnN0cnVjdChwYWlyPF9UMSwgX1QyPiogX19wLCBfVXAmJiBfX3gsIF9WcCYmIF9feSkgeworICAgICAgICBjb25zdHJ1Y3QoX19wLCBwaWVjZXdpc2VfY29uc3RydWN0LAorICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmRfYXNfdHVwbGUoX1ZTVEQ6OmZvcndhcmQ8X1VwPihfX3gpKSwKKyAgICAgICAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkX2FzX3R1cGxlKF9WU1REOjpmb3J3YXJkPF9WcD4oX195KSkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMiwgY2xhc3MgX1VwLCBjbGFzcyBfVnA+CisgICAgdm9pZCBjb25zdHJ1Y3QocGFpcjxfVDEsIF9UMj4qIF9fcCwgY29uc3QgcGFpcjxfVXAsIF9WcD4mIF9feCkgeworICAgICAgICBjb25zdHJ1Y3QoX19wLCBwaWVjZXdpc2VfY29uc3RydWN0LAorICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmRfYXNfdHVwbGUoX194LmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkX2FzX3R1cGxlKF9feC5zZWNvbmQpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDIsIGNsYXNzIF9VcCwgY2xhc3MgX1ZwPgorICAgIHZvaWQgY29uc3RydWN0KHBhaXI8X1QxLCBfVDI+KiBfX3AsIHBhaXI8X1VwLCBfVnA+JiYgX194KSB7CisgICAgICAgIGNvbnN0cnVjdChfX3AsIHBpZWNld2lzZV9jb25zdHJ1Y3QsCisgICAgICAgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZF9hc190dXBsZShfVlNURDo6Zm9yd2FyZDxfVXA+KF9feC5maXJzdCkpLAorICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmRfYXNfdHVwbGUoX1ZTVEQ6OmZvcndhcmQ8X1ZwPihfX3guc2Vjb25kKSkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdm9pZCBkZXN0cm95KF9UcCogX19wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR5cGVkZWYgX19vdXRlcm1vc3Q8b3V0ZXJfYWxsb2NhdG9yX3R5cGU+IF9PTTsKKyAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHJhaXRzPHR5cGVuYW1lIF9PTTo6dHlwZT46OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95KF9PTSgpKG91dGVyX2FsbG9jYXRvcigpKSwgX19wKTsKKyAgICAgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3Igc2VsZWN0X29uX2NvbnRhaW5lcl9jb3B5X2NvbnN0cnVjdGlvbigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGJhc2U6OnNlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb24oKTt9CisKK3ByaXZhdGU6CisKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfT3V0ZXJBMiwKKyAgICAgICAgICAgICAgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgICAgICAgICAgICAgICAgICAgICBpc19jb25zdHJ1Y3RpYmxlPG91dGVyX2FsbG9jYXRvcl90eXBlLCBfT3V0ZXJBMj46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZT4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yKF9PdXRlckEyJiYgX19vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lcl9hbGxvY2F0b3JfdHlwZSYgX19pKSBfTk9FWENFUFQKKyAgICAgICAgOiBiYXNlKF9WU1REOjpmb3J3YXJkPF9PdXRlckEyPihfX28pLCBfX2kpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcy4uLiBfQXJncz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB2b2lkIF9fY29uc3RydWN0KGludGVncmFsX2NvbnN0YW50PGludCwgMD4sIF9UcCogX19wLCBfQXJncyYmIC4uLl9fYXJncykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0eXBlZGVmIF9fb3V0ZXJtb3N0PG91dGVyX2FsbG9jYXRvcl90eXBlPiBfT007CisgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3RyYWl0czx0eXBlbmFtZSBfT006OnR5cGU+Ojpjb25zdHJ1Y3QKKyAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgIF9PTSgpKG91dGVyX2FsbG9jYXRvcigpKSwKKyAgICAgICAgICAgICAgICAgICAgX19wLAorICAgICAgICAgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcy4uLiBfQXJncz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB2b2lkIF9fY29uc3RydWN0KGludGVncmFsX2NvbnN0YW50PGludCwgMT4sIF9UcCogX19wLCBfQXJncyYmIC4uLl9fYXJncykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0eXBlZGVmIF9fb3V0ZXJtb3N0PG91dGVyX2FsbG9jYXRvcl90eXBlPiBfT007CisgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3RyYWl0czx0eXBlbmFtZSBfT006OnR5cGU+Ojpjb25zdHJ1Y3QKKyAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgIF9PTSgpKG91dGVyX2FsbG9jYXRvcigpKSwKKyAgICAgICAgICAgICAgICAgICAgX19wLCBhbGxvY2F0b3JfYXJnLCBpbm5lcl9hbGxvY2F0b3IoKSwKKyAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MuLi4gX0FyZ3M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdm9pZCBfX2NvbnN0cnVjdChpbnRlZ3JhbF9jb25zdGFudDxpbnQsIDI+LCBfVHAqIF9fcCwgX0FyZ3MmJiAuLi5fX2FyZ3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZWRlZiBfX291dGVybW9zdDxvdXRlcl9hbGxvY2F0b3JfdHlwZT4gX09NOworICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90cmFpdHM8dHlwZW5hbWUgX09NOjp0eXBlPjo6Y29uc3RydWN0CisgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICBfT00oKShvdXRlcl9hbGxvY2F0b3IoKSksCisgICAgICAgICAgICAgICAgICAgIF9fcCwKKyAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4sCisgICAgICAgICAgICAgICAgICAgIGlubmVyX2FsbG9jYXRvcigpCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyAuLi5fQXJncywgc2l6ZV90IC4uLl9JZHg+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR1cGxlPF9BcmdzJiYuLi4+CisgICAgX190cmFuc2Zvcm1fdHVwbGUoaW50ZWdyYWxfY29uc3RhbnQ8aW50LCAwPiwgdHVwbGU8X0FyZ3MuLi4+JiYgX190LAorICAgICAgICAgICAgICAgICAgICAgIF9fdHVwbGVfaW5kaWNlczxfSWR4Li4uPikKKyAgICB7CisgICAgICAgIHJldHVybiBfVlNURDo6Zm9yd2FyZF9hc190dXBsZShfVlNURDo6Z2V0PF9JZHg+KF9WU1REOjptb3ZlKF9fdCkpLi4uKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FyZ3MsIHNpemVfdCAuLi5fSWR4PgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0dXBsZTxhbGxvY2F0b3JfYXJnX3QsIGlubmVyX2FsbG9jYXRvcl90eXBlJiwgX0FyZ3MmJi4uLj4KKyAgICBfX3RyYW5zZm9ybV90dXBsZShpbnRlZ3JhbF9jb25zdGFudDxpbnQsIDE+LCB0dXBsZTxfQXJncy4uLj4gJiYgX190LAorICAgICAgICAgICAgICAgICAgICAgIF9fdHVwbGVfaW5kaWNlczxfSWR4Li4uPikKKyAgICB7CisgICAgICAgIHVzaW5nIF9UdXAgPSB0dXBsZTxhbGxvY2F0b3JfYXJnX3QsIGlubmVyX2FsbG9jYXRvcl90eXBlJiwgX0FyZ3MmJi4uLj47CisgICAgICAgIHJldHVybiBfVHVwKGFsbG9jYXRvcl9hcmcsIGlubmVyX2FsbG9jYXRvcigpLAorICAgICAgICAgICAgICAgICAgICBfVlNURDo6Z2V0PF9JZHg+KF9WU1REOjptb3ZlKF9fdCkpLi4uKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FyZ3MsIHNpemVfdCAuLi5fSWR4PgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0dXBsZTxfQXJncyYmLi4uLCBpbm5lcl9hbGxvY2F0b3JfdHlwZSY+CisgICAgX190cmFuc2Zvcm1fdHVwbGUoaW50ZWdyYWxfY29uc3RhbnQ8aW50LCAyPiwgdHVwbGU8X0FyZ3MuLi4+ICYmIF9fdCwKKyAgICAgICAgICAgICAgICAgICAgICBfX3R1cGxlX2luZGljZXM8X0lkeC4uLj4pCisgICAgeworICAgICAgICB1c2luZyBfVHVwID0gdHVwbGU8X0FyZ3MmJi4uLiwgaW5uZXJfYWxsb2NhdG9yX3R5cGUmPjsKKyAgICAgICAgcmV0dXJuIF9UdXAoX1ZTVEQ6OmdldDxfSWR4PihfVlNURDo6bW92ZShfX3QpKS4uLiwgaW5uZXJfYWxsb2NhdG9yKCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcy4uLj4gZnJpZW5kIGNsYXNzIF9fc2NvcGVkX2FsbG9jYXRvcl9zdG9yYWdlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9PdXRlckExLCBjbGFzcyBfT3V0ZXJBMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj09KGNvbnN0IHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxfT3V0ZXJBMT4mIF9fYSwKKyAgICAgICAgICAgY29uc3Qgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yPF9PdXRlckEyPiYgX19iKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19hLm91dGVyX2FsbG9jYXRvcigpID09IF9fYi5vdXRlcl9hbGxvY2F0b3IoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9PdXRlckExLCBjbGFzcyBfT3V0ZXJBMiwgY2xhc3MgX0lubmVyQTAsIGNsYXNzLi4uIF9Jbm5lckFsbG9jcz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj09KGNvbnN0IHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxfT3V0ZXJBMSwgX0lubmVyQTAsIF9Jbm5lckFsbG9jcy4uLj4mIF9fYSwKKyAgICAgICAgICAgY29uc3Qgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yPF9PdXRlckEyLCBfSW5uZXJBMCwgX0lubmVyQWxsb2NzLi4uPiYgX19iKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19hLm91dGVyX2FsbG9jYXRvcigpID09IF9fYi5vdXRlcl9hbGxvY2F0b3IoKSAmJgorICAgICAgICAgICBfX2EuaW5uZXJfYWxsb2NhdG9yKCkgPT0gX19iLmlubmVyX2FsbG9jYXRvcigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX091dGVyQTEsIGNsYXNzIF9PdXRlckEyLCBjbGFzcy4uLiBfSW5uZXJBbGxvY3M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I8X091dGVyQTEsIF9Jbm5lckFsbG9jcy4uLj4mIF9fYSwKKyAgICAgICAgICAgY29uc3Qgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yPF9PdXRlckEyLCBfSW5uZXJBbGxvY3MuLi4+JiBfX2IpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiAhKF9fYSA9PSBfX2IpOworfQorCisjZW5kaWYgIC8vICFkZWZpbmVkKF9MSUJDUFBfQ1hYMDNfTEFORykKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCisjZW5kaWYgIC8vIF9MSUJDUFBfU0NPUEVEX0FMTE9DQVRPUgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3NldCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkYjhjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zZXQKQEAgLTAsMCArMSwxMjE4IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX1NFVAorI2RlZmluZSBfTElCQ1BQX1NFVAorCisvKgorCisgICAgc2V0IHN5bm9wc2lzCisKK25hbWVzcGFjZSBzdGQKK3sKKwordGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgQ29tcGFyZSA9IGxlc3M8S2V5PiwKKyAgICAgICAgICBjbGFzcyBBbGxvY2F0b3IgPSBhbGxvY2F0b3I8S2V5Pj4KK2NsYXNzIHNldAoreworcHVibGljOgorICAgIC8vIHR5cGVzOgorICAgIHR5cGVkZWYgS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICB0eXBlZGVmIGtleV90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIENvbXBhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2NvbXBhcmU7CisgICAgdHlwZWRlZiBrZXlfY29tcGFyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2NvbXBhcmU7CisgICAgdHlwZWRlZiBBbGxvY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnJlZmVyZW5jZSAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6cG9pbnRlciAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6Y29uc3RfcG9pbnRlciAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICB0eXBlZGVmIGltcGxlbWVudGF0aW9uLWRlZmluZWQgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgLy8gY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICBzZXQoKQorICAgICAgICBub2V4Y2VwdCgKKyAgICAgICAgICAgIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGtleV9jb21wYXJlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPGtleV9jb21wYXJlPjo6dmFsdWUpOworICAgIGV4cGxpY2l0IHNldChjb25zdCB2YWx1ZV9jb21wYXJlJiBjb21wKTsKKyAgICBzZXQoY29uc3QgdmFsdWVfY29tcGFyZSYgY29tcCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOworICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICBzZXQoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LAorICAgICAgICAgICAgY29uc3QgdmFsdWVfY29tcGFyZSYgY29tcCA9IHZhbHVlX2NvbXBhcmUoKSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIHNldChJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIGNvbnN0IHZhbHVlX2NvbXBhcmUmIGNvbXAsCisgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7CisgICAgc2V0KGNvbnN0IHNldCYgcyk7CisgICAgc2V0KHNldCYmIHMpCisgICAgICAgIG5vZXhjZXB0KAorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8a2V5X2NvbXBhcmU+Ojp2YWx1ZSk7CisgICAgZXhwbGljaXQgc2V0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsKKyAgICBzZXQoY29uc3Qgc2V0JiBzLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7CisgICAgc2V0KHNldCYmIHMsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsKKyAgICBzZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBpbCwgY29uc3QgdmFsdWVfY29tcGFyZSYgY29tcCA9IHZhbHVlX2NvbXBhcmUoKSk7CisgICAgc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwsIGNvbnN0IHZhbHVlX2NvbXBhcmUmIGNvbXAsCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgc2V0KElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpCisgICAgICAgICAgICA6IHNldChmaXJzdCwgbGFzdCwgQ29tcGFyZSgpLCBhKSB7fSAgLy8gQysrMTQKKyAgICBzZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBpbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpCisgICAgICAgIDogc2V0KGlsLCBDb21wYXJlKCksIGEpIHt9ICAvLyBDKysxNAorICAgIH5zZXQoKTsKKworICAgIHNldCYgb3BlcmF0b3I9KGNvbnN0IHNldCYgcyk7CisgICAgc2V0JiBvcGVyYXRvcj0oc2V0JiYgcykKKyAgICAgICAgbm9leGNlcHQoCisgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ6OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxrZXlfY29tcGFyZT46OnZhbHVlKTsKKyAgICBzZXQmIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IGlsKTsKKworICAgIC8vIGl0ZXJhdG9yczoKKyAgICAgICAgICBpdGVyYXRvciBiZWdpbigpIG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgICAgICAgaXRlcmF0b3IgZW5kKCkgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICBjb25zdCBub2V4Y2VwdDsKKworICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCBub2V4Y2VwdDsKKyAgICAgICAgICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBub2V4Y2VwdDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSAgIGNvbnN0IG5vZXhjZXB0OworCisgICAgY29uc3RfaXRlcmF0b3IgICAgICAgICBjYmVnaW4oKSAgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgICAgICAgICBjZW5kKCkgICAgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmVuZCgpICAgY29uc3Qgbm9leGNlcHQ7CisKKyAgICAvLyBjYXBhY2l0eToKKyAgICBib29sICAgICAgZW1wdHkoKSAgICBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgc2l6ZSgpICAgICBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIC8vIG1vZGlmaWVyczoKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KKyAgICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gZW1wbGFjZShBcmdzJiYuLi4gYXJncyk7CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CisgICAgICAgIGl0ZXJhdG9yIGVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgQXJncyYmLi4uIGFyZ3MpOworICAgIHBhaXI8aXRlcmF0b3IsYm9vbD4gaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIHYpOworICAgIHBhaXI8aXRlcmF0b3IsYm9vbD4gaW5zZXJ0KHZhbHVlX3R5cGUmJiB2KTsKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIHYpOworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgdmFsdWVfdHlwZSYmIHYpOworICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkIGluc2VydChJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QpOworICAgIHZvaWQgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwpOworCisgICAgaXRlcmF0b3IgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uKTsKKyAgICBpdGVyYXRvciAgZXJhc2UoaXRlcmF0b3IgcG9zaXRpb24pOyAgLy8gQysrMTQKKyAgICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIGspOworICAgIGl0ZXJhdG9yICBlcmFzZShjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCk7CisgICAgdm9pZCBjbGVhcigpIG5vZXhjZXB0OworCisgICAgdm9pZCBzd2FwKHNldCYgcykKKyAgICAgICAgbm9leGNlcHQoCisgICAgICAgICAgICBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPGtleV9jb21wYXJlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICghYWxsb2NhdG9yX3R5cGU6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDo6dmFsdWUgfHwKKyAgICAgICAgICAgICBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpKTsKKworICAgIC8vIG9ic2VydmVyczoKKyAgICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3Qgbm9leGNlcHQ7CisgICAga2V5X2NvbXBhcmUgICAga2V5X2NvbXAoKSAgICAgIGNvbnN0OworICAgIHZhbHVlX2NvbXBhcmUgIHZhbHVlX2NvbXAoKSAgICBjb25zdDsKKworICAgIC8vIHNldCBvcGVyYXRpb25zOgorICAgICAgICAgIGl0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUmIGspOworICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEs+CisgICAgICAgIGl0ZXJhdG9yIGZpbmQoY29uc3QgSyYgeCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSz4KKyAgICAgICAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBLJiB4KSBjb25zdDsgIC8vIEMrKzE0CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSz4KKyAgICAgIHNpemVfdHlwZSBjb3VudChjb25zdCBLJiB4KSBjb25zdDsgICAgICAgIC8vIEMrKzE0CisKKyAgICBzaXplX3R5cGUgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisgICAgICAgICAgaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIGspOworICAgIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBrKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLPgorICAgICAgICBpdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBLJiB4KTsgICAgICAgICAgICAgIC8vIEMrKzE0CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSz4KKyAgICAgICAgY29uc3RfaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3QgSyYgeCkgY29uc3Q7ICAvLyBDKysxNAorCisgICAgICAgICAgaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIGspOworICAgIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBrKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLPgorICAgICAgICBpdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBLJiB4KTsgICAgICAgICAgICAgIC8vIEMrKzE0CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSz4KKyAgICAgICAgY29uc3RfaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgSyYgeCkgY29uc3Q7ICAvLyBDKysxNAorICAgIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+ICAgICAgICAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSz4KKyAgICAgICAgcGFpcjxpdGVyYXRvcixpdGVyYXRvcj4gICAgICAgICAgICAgZXF1YWxfcmFuZ2UoY29uc3QgSyYgeCk7ICAgICAgICAvLyBDKysxNAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEs+CisgICAgICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IEsmIHgpIGNvbnN0OyAgLy8gQysrMTQKK307CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIENvbXBhcmUsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wKK29wZXJhdG9yPT0oY29uc3Qgc2V0PEtleSwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeCwKKyAgICAgICAgICAgY29uc3Qgc2V0PEtleSwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIENvbXBhcmUsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wKK29wZXJhdG9yPCAoY29uc3Qgc2V0PEtleSwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeCwKKyAgICAgICAgICAgY29uc3Qgc2V0PEtleSwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIENvbXBhcmUsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wKK29wZXJhdG9yIT0oY29uc3Qgc2V0PEtleSwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeCwKKyAgICAgICAgICAgY29uc3Qgc2V0PEtleSwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIENvbXBhcmUsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wKK29wZXJhdG9yPiAoY29uc3Qgc2V0PEtleSwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeCwKKyAgICAgICAgICAgY29uc3Qgc2V0PEtleSwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIENvbXBhcmUsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wKK29wZXJhdG9yPj0oY29uc3Qgc2V0PEtleSwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeCwKKyAgICAgICAgICAgY29uc3Qgc2V0PEtleSwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIENvbXBhcmUsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wKK29wZXJhdG9yPD0oY29uc3Qgc2V0PEtleSwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeCwKKyAgICAgICAgICAgY29uc3Qgc2V0PEtleSwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeSk7CisKKy8vIHNwZWNpYWxpemVkIGFsZ29yaXRobXM6Cit0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBDb21wYXJlLCBjbGFzcyBBbGxvY2F0b3I+Cit2b2lkCitzd2FwKHNldDxLZXksIENvbXBhcmUsIEFsbG9jYXRvcj4mIHgsIHNldDxLZXksIENvbXBhcmUsIEFsbG9jYXRvcj4mIHkpCisgICAgbm9leGNlcHQobm9leGNlcHQoeC5zd2FwKHkpKSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIENvbXBhcmUgPSBsZXNzPEtleT4sCisgICAgICAgICAgY2xhc3MgQWxsb2NhdG9yID0gYWxsb2NhdG9yPEtleT4+CitjbGFzcyBtdWx0aXNldAoreworcHVibGljOgorICAgIC8vIHR5cGVzOgorICAgIHR5cGVkZWYgS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICB0eXBlZGVmIGtleV90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIENvbXBhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2NvbXBhcmU7CisgICAgdHlwZWRlZiBrZXlfY29tcGFyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2NvbXBhcmU7CisgICAgdHlwZWRlZiBBbGxvY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnJlZmVyZW5jZSAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6cG9pbnRlciAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6Y29uc3RfcG9pbnRlciAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICB0eXBlZGVmIGltcGxlbWVudGF0aW9uLWRlZmluZWQgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgLy8gY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICBtdWx0aXNldCgpCisgICAgICAgIG5vZXhjZXB0KAorICAgICAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8a2V5X2NvbXBhcmU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8a2V5X2NvbXBhcmU+Ojp2YWx1ZSk7CisgICAgZXhwbGljaXQgbXVsdGlzZXQoY29uc3QgdmFsdWVfY29tcGFyZSYgY29tcCk7CisgICAgbXVsdGlzZXQoY29uc3QgdmFsdWVfY29tcGFyZSYgY29tcCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOworICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICBtdWx0aXNldChJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX2NvbXBhcmUmIGNvbXAgPSB2YWx1ZV9jb21wYXJlKCkpOworICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICBtdWx0aXNldChJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsCisgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX2NvbXBhcmUmIGNvbXAsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsKKyAgICBtdWx0aXNldChjb25zdCBtdWx0aXNldCYgcyk7CisgICAgbXVsdGlzZXQobXVsdGlzZXQmJiBzKQorICAgICAgICBub2V4Y2VwdCgKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGtleV9jb21wYXJlPjo6dmFsdWUpOworICAgIGV4cGxpY2l0IG11bHRpc2V0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsKKyAgICBtdWx0aXNldChjb25zdCBtdWx0aXNldCYgcywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOworICAgIG11bHRpc2V0KG11bHRpc2V0JiYgcywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOworICAgIG11bHRpc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwsIGNvbnN0IHZhbHVlX2NvbXBhcmUmIGNvbXAgPSB2YWx1ZV9jb21wYXJlKCkpOworICAgIG11bHRpc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwsIGNvbnN0IHZhbHVlX2NvbXBhcmUmIGNvbXAsCisgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOworICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICBtdWx0aXNldChJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKQorICAgICAgICAgICAgOiBzZXQoZmlyc3QsIGxhc3QsIENvbXBhcmUoKSwgYSkge30gIC8vIEMrKzE0CisgICAgbXVsdGlzZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBpbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpCisgICAgICAgIDogc2V0KGlsLCBDb21wYXJlKCksIGEpIHt9ICAvLyBDKysxNAorICAgIH5tdWx0aXNldCgpOworCisgICAgbXVsdGlzZXQmIG9wZXJhdG9yPShjb25zdCBtdWx0aXNldCYgcyk7CisgICAgbXVsdGlzZXQmIG9wZXJhdG9yPShtdWx0aXNldCYmIHMpCisgICAgICAgIG5vZXhjZXB0KAorICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8a2V5X2NvbXBhcmU+Ojp2YWx1ZSk7CisgICAgbXVsdGlzZXQmIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IGlsKTsKKworICAgIC8vIGl0ZXJhdG9yczoKKyAgICAgICAgICBpdGVyYXRvciBiZWdpbigpIG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgICAgICAgaXRlcmF0b3IgZW5kKCkgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICBjb25zdCBub2V4Y2VwdDsKKworICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCBub2V4Y2VwdDsKKyAgICAgICAgICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBub2V4Y2VwdDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSAgIGNvbnN0IG5vZXhjZXB0OworCisgICAgY29uc3RfaXRlcmF0b3IgICAgICAgICBjYmVnaW4oKSAgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgICAgICAgICBjZW5kKCkgICAgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmVuZCgpICAgY29uc3Qgbm9leGNlcHQ7CisKKyAgICAvLyBjYXBhY2l0eToKKyAgICBib29sICAgICAgZW1wdHkoKSAgICBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgc2l6ZSgpICAgICBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIC8vIG1vZGlmaWVyczoKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KKyAgICAgICAgaXRlcmF0b3IgZW1wbGFjZShBcmdzJiYuLi4gYXJncyk7CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CisgICAgICAgIGl0ZXJhdG9yIGVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgQXJncyYmLi4uIGFyZ3MpOworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiB2KTsKKyAgICBpdGVyYXRvciBpbnNlcnQodmFsdWVfdHlwZSYmIHYpOworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgdik7CisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCB2YWx1ZV90eXBlJiYgdik7CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQgaW5zZXJ0KElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCk7CisgICAgdm9pZCBpbnNlcnQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBpbCk7CisKKyAgICBpdGVyYXRvciAgZXJhc2UoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24pOworICAgIGl0ZXJhdG9yICBlcmFzZShpdGVyYXRvciBwb3NpdGlvbik7ICAvLyBDKysxNAorICAgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgayk7CisgICAgaXRlcmF0b3IgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIGZpcnN0LCBjb25zdF9pdGVyYXRvciBsYXN0KTsKKyAgICB2b2lkIGNsZWFyKCkgbm9leGNlcHQ7CisKKyAgICB2b2lkIHN3YXAobXVsdGlzZXQmIHMpCisgICAgICAgIG5vZXhjZXB0KAorICAgICAgICAgICAgX19pc19ub3Rocm93X3N3YXBwYWJsZTxrZXlfY29tcGFyZT46OnZhbHVlICYmCisgICAgICAgICAgICAoIWFsbG9jYXRvcl90eXBlOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXA6OnZhbHVlIHx8CisgICAgICAgICAgICAgX19pc19ub3Rocm93X3N3YXBwYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKSk7CisKKyAgICAvLyBvYnNlcnZlcnM6CisgICAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IG5vZXhjZXB0OworICAgIGtleV9jb21wYXJlICAgIGtleV9jb21wKCkgICAgICBjb25zdDsKKyAgICB2YWx1ZV9jb21wYXJlICB2YWx1ZV9jb21wKCkgICAgY29uc3Q7CisKKyAgICAvLyBzZXQgb3BlcmF0aW9uczoKKyAgICAgICAgICBpdGVyYXRvciBmaW5kKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IGtleV90eXBlJiBrKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLPgorICAgICAgICBpdGVyYXRvciBmaW5kKGNvbnN0IEsmIHgpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEs+CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgSyYgeCkgY29uc3Q7ICAvLyBDKysxNAorCisgICAgc2l6ZV90eXBlICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworICAgICAgICAgIGl0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBjb25zdF9pdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSz4KKyAgICAgICAgaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3QgSyYgeCk7ICAgICAgICAgICAgICAvLyBDKysxNAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEs+CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IEsmIHgpIGNvbnN0OyAgLy8gQysrMTQKKworICAgICAgICAgIGl0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSz4KKyAgICAgICAgaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3QgSyYgeCk7ICAgICAgICAgICAgICAvLyBDKysxNAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEs+CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IEsmIHgpIGNvbnN0OyAgLy8gQysrMTQKKworICAgIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+ICAgICAgICAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSz4KKyAgICAgICAgcGFpcjxpdGVyYXRvcixpdGVyYXRvcj4gICAgICAgICAgICAgZXF1YWxfcmFuZ2UoY29uc3QgSyYgeCk7ICAgICAgICAvLyBDKysxNAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEs+CisgICAgICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IEsmIHgpIGNvbnN0OyAgLy8gQysrMTQKK307CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIENvbXBhcmUsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgbXVsdGlzZXQ8S2V5LCBDb21wYXJlLCBBbGxvY2F0b3I+JiB4LAorICAgICAgICAgICBjb25zdCBtdWx0aXNldDxLZXksIENvbXBhcmUsIEFsbG9jYXRvcj4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBDb21wYXJlLCBjbGFzcyBBbGxvY2F0b3I+Citib29sCitvcGVyYXRvcjwgKGNvbnN0IG11bHRpc2V0PEtleSwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeCwKKyAgICAgICAgICAgY29uc3QgbXVsdGlzZXQ8S2V5LCBDb21wYXJlLCBBbGxvY2F0b3I+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgQ29tcGFyZSwgY2xhc3MgQWxsb2NhdG9yPgorYm9vbAorb3BlcmF0b3IhPShjb25zdCBtdWx0aXNldDxLZXksIENvbXBhcmUsIEFsbG9jYXRvcj4mIHgsCisgICAgICAgICAgIGNvbnN0IG11bHRpc2V0PEtleSwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIENvbXBhcmUsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wKK29wZXJhdG9yPiAoY29uc3QgbXVsdGlzZXQ8S2V5LCBDb21wYXJlLCBBbGxvY2F0b3I+JiB4LAorICAgICAgICAgICBjb25zdCBtdWx0aXNldDxLZXksIENvbXBhcmUsIEFsbG9jYXRvcj4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBDb21wYXJlLCBjbGFzcyBBbGxvY2F0b3I+Citib29sCitvcGVyYXRvcj49KGNvbnN0IG11bHRpc2V0PEtleSwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeCwKKyAgICAgICAgICAgY29uc3QgbXVsdGlzZXQ8S2V5LCBDb21wYXJlLCBBbGxvY2F0b3I+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgQ29tcGFyZSwgY2xhc3MgQWxsb2NhdG9yPgorYm9vbAorb3BlcmF0b3I8PShjb25zdCBtdWx0aXNldDxLZXksIENvbXBhcmUsIEFsbG9jYXRvcj4mIHgsCisgICAgICAgICAgIGNvbnN0IG11bHRpc2V0PEtleSwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeSk7CisKKy8vIHNwZWNpYWxpemVkIGFsZ29yaXRobXM6Cit0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBDb21wYXJlLCBjbGFzcyBBbGxvY2F0b3I+Cit2b2lkCitzd2FwKG11bHRpc2V0PEtleSwgQ29tcGFyZSwgQWxsb2NhdG9yPiYgeCwgbXVsdGlzZXQ8S2V5LCBDb21wYXJlLCBBbGxvY2F0b3I+JiB5KQorICAgIG5vZXhjZXB0KG5vZXhjZXB0KHguc3dhcCh5KSkpOworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPF9fdHJlZT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ29tcGFyZSA9IGxlc3M8X0tleT4sCisgICAgICAgICAgY2xhc3MgX0FsbG9jYXRvciA9IGFsbG9jYXRvcjxfS2V5PiA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBzZXQKK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlczoKKyAgICB0eXBlZGVmIF9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CisgICAgdHlwZWRlZiBrZXlfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQ29tcGFyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9jb21wYXJlOworICAgIHR5cGVkZWYga2V5X2NvbXBhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9jb21wYXJlOworICAgIHR5cGVkZWYgX0FsbG9jYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICBzdGF0aWNfYXNzZXJ0KChpc19zYW1lPHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjp2YWx1ZV90eXBlLCB2YWx1ZV90eXBlPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgIkFsbG9jYXRvcjo6dmFsdWVfdHlwZSBtdXN0IGJlIHNhbWUgdHlwZSBhcyB2YWx1ZV90eXBlIik7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBfX3RyZWU8dmFsdWVfdHlwZSwgdmFsdWVfY29tcGFyZSwgYWxsb2NhdG9yX3R5cGU+IF9fYmFzZTsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+ICAgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6Ol9fbm9kZV9ob2xkZXIgICAgICAgICAgICAgICAgICAgIF9fbm9kZV9ob2xkZXI7CisKKyAgICBfX2Jhc2UgX190cmVlXzsKKworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX19iYXNlOjpwb2ludGVyICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6OmNvbnN0X2l0ZXJhdG9yICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYmFzZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgX1ZTVEQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfVlNURDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzZXQoKQorICAgICAgICBfTk9FWENFUFRfKAorICAgICAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8a2V5X2NvbXBhcmU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8a2V5X2NvbXBhcmU+Ojp2YWx1ZSkKKyAgICAgICAgOiBfX3RyZWVfKHZhbHVlX2NvbXBhcmUoKSkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBzZXQoY29uc3QgdmFsdWVfY29tcGFyZSYgX19jb21wKQorICAgICAgICBfTk9FWENFUFRfKAorICAgICAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8a2V5X2NvbXBhcmU+Ojp2YWx1ZSkKKyAgICAgICAgOiBfX3RyZWVfKF9fY29tcCkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBzZXQoY29uc3QgdmFsdWVfY29tcGFyZSYgX19jb21wLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgICA6IF9fdHJlZV8oX19jb21wLCBfX2EpIHt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKyAgICAgICAgICAgIGNvbnN0IHZhbHVlX2NvbXBhcmUmIF9fY29tcCA9IHZhbHVlX2NvbXBhcmUoKSkKKyAgICAgICAgOiBfX3RyZWVfKF9fY29tcCkKKyAgICAgICAgeworICAgICAgICAgICAgaW5zZXJ0KF9fZiwgX19sKTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgY29uc3QgdmFsdWVfY29tcGFyZSYgX19jb21wLAorICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgICAgOiBfX3RyZWVfKF9fY29tcCwgX19hKQorICAgICAgICB7CisgICAgICAgICAgICBpbnNlcnQoX19mLCBfX2wpOworICAgICAgICB9CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgCisgICAgICAgIHNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgICAgICAgIDogc2V0KF9fZiwgX19sLCBrZXlfY29tcGFyZSgpLCBfX2EpIHt9CisjZW5kaWYKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzZXQoY29uc3Qgc2V0JiBfX3MpCisgICAgICAgIDogX190cmVlXyhfX3MuX190cmVlXykKKyAgICAgICAgeworICAgICAgICAgICAgaW5zZXJ0KF9fcy5iZWdpbigpLCBfX3MuZW5kKCkpOworICAgICAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2V0JiBvcGVyYXRvcj0oY29uc3Qgc2V0JiBfX3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fdHJlZV8gPSBfX3MuX190cmVlXzsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzZXQoc2V0JiYgX19zKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPF9fYmFzZT46OnZhbHVlKQorICAgICAgICA6IF9fdHJlZV8oX1ZTVEQ6Om1vdmUoX19zLl9fdHJlZV8pKSB7fQorI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBzZXQoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgICAgOiBfX3RyZWVfKF9fYSkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzZXQoY29uc3Qgc2V0JiBfX3MsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICAgIDogX190cmVlXyhfX3MuX190cmVlXy52YWx1ZV9jb21wKCksIF9fYSkKKyAgICAgICAgeworICAgICAgICAgICAgaW5zZXJ0KF9fcy5iZWdpbigpLCBfX3MuZW5kKCkpOworICAgICAgICB9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgc2V0KHNldCYmIF9fcywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCwgY29uc3QgdmFsdWVfY29tcGFyZSYgX19jb21wID0gdmFsdWVfY29tcGFyZSgpKQorICAgICAgICA6IF9fdHJlZV8oX19jb21wKQorICAgICAgICB7CisgICAgICAgICAgICBpbnNlcnQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKKyAgICAgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIGNvbnN0IHZhbHVlX2NvbXBhcmUmIF9fY29tcCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgICAgOiBfX3RyZWVfKF9fY29tcCwgX19hKQorICAgICAgICB7CisgICAgICAgICAgICBpbnNlcnQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKKyAgICAgICAgfQorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIAorICAgIHNldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICAgIDogc2V0KF9faWwsIGtleV9jb21wYXJlKCksIF9fYSkge30KKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNldCYgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkKKyAgICAgICAgeworICAgICAgICAgICAgX190cmVlXy5fX2Fzc2lnbl91bmlxdWUoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNldCYgb3BlcmF0b3I9KHNldCYmIF9fcykKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfX2Jhc2U+Ojp2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgX190cmVlXyA9IF9WU1REOjptb3ZlKF9fcy5fX3RyZWVfKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICBpdGVyYXRvciBiZWdpbigpIF9OT0VYQ0VQVCAgICAgICB7cmV0dXJuIF9fdHJlZV8uYmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190cmVlXy5iZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgaXRlcmF0b3IgZW5kKCkgX05PRVhDRVBUICAgICAgICAge3JldHVybiBfX3RyZWVfLmVuZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RyZWVfLmVuZCgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIF9OT0VYQ0VQVAorICAgICAgICAgICAge3JldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBfTk9FWENFUFQKKyAgICAgICAgICAgIHtyZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpICBjb25zdCBfTk9FWENFUFQge3JldHVybiBiZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgY2VuZCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIGVuZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmJlZ2luKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gcmJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyZW5kKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gcmVuZCgpO30KKworICAgIF9MSUJDUFBfTk9ESVNDQVJEX0FGVEVSX0NYWDE3IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIGVtcHR5KCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190cmVlXy5zaXplKCkgPT0gMDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190cmVlXy5zaXplKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RyZWVfLm1heF9zaXplKCk7fQorCisgICAgLy8gbW9kaWZpZXJzOgorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKyAgICAgICAgICAgIHtyZXR1cm4gX190cmVlXy5fX2VtcGxhY2VfdW5pcXVlKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTt9CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGl0ZXJhdG9yIGVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICAgICAge3JldHVybiBfX3RyZWVfLl9fZW1wbGFjZV9oaW50X3VuaXF1ZShfX3AsIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTt9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsYm9vbD4gaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fdikKKyAgICAgICAge3JldHVybiBfX3RyZWVfLl9faW5zZXJ0X3VuaXF1ZShfX3YpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcCwgY29uc3QgdmFsdWVfdHlwZSYgX192KQorICAgICAgICB7cmV0dXJuIF9fdHJlZV8uX19pbnNlcnRfdW5pcXVlKF9fcCwgX192KTt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdm9pZCBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoY29uc3RfaXRlcmF0b3IgX19lID0gY2VuZCgpOyBfX2YgIT0gX19sOyArK19fZikKKyAgICAgICAgICAgICAgICBfX3RyZWVfLl9faW5zZXJ0X3VuaXF1ZShfX2UsICpfX2YpOworICAgICAgICB9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsYm9vbD4gaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3YpCisgICAgICAgIHtyZXR1cm4gX190cmVlXy5fX2luc2VydF91bmlxdWUoX1ZTVEQ6Om1vdmUoX192KSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3AsIHZhbHVlX3R5cGUmJiBfX3YpCisgICAgICAgIHtyZXR1cm4gX190cmVlXy5fX2luc2VydF91bmlxdWUoX19wLCBfVlNURDo6bW92ZShfX3YpKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBpbnNlcnQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQorICAgICAgICB7aW5zZXJ0KF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7fQorI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wKSB7cmV0dXJuIF9fdHJlZV8uZXJhc2UoX19wKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rKQorICAgICAgICB7cmV0dXJuIF9fdHJlZV8uX19lcmFzZV91bmlxdWUoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkKKyAgICAgICAge3JldHVybiBfX3RyZWVfLmVyYXNlKF9fZiwgX19sKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgY2xlYXIoKSBfTk9FWENFUFQge19fdHJlZV8uY2xlYXIoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKHNldCYgX19zKSBfTk9FWENFUFRfKF9faXNfbm90aHJvd19zd2FwcGFibGU8X19iYXNlPjo6dmFsdWUpCisgICAgICAgIHtfX3RyZWVfLnN3YXAoX19zLl9fdHJlZV8pO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190cmVlXy5fX2FsbG9jKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBrZXlfY29tcGFyZSAgICBrZXlfY29tcCgpICAgICAgY29uc3Qge3JldHVybiBfX3RyZWVfLnZhbHVlX2NvbXAoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZhbHVlX2NvbXBhcmUgIHZhbHVlX2NvbXAoKSAgICBjb25zdCB7cmV0dXJuIF9fdHJlZV8udmFsdWVfY29tcCgpO30KKworICAgIC8vIHNldCBvcGVyYXRpb25zOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2spICAgICAgICAgICAgIHtyZXR1cm4gX190cmVlXy5maW5kKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0IHtyZXR1cm4gX190cmVlXy5maW5kKF9fayk7fQorI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9LMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfdHJhbnNwYXJlbnQ8X0NvbXBhcmUsIF9LMj46OnZhbHVlLGl0ZXJhdG9yPjo6dHlwZQorICAgIGZpbmQoY29uc3QgX0syJiBfX2spICAgICAgICAgICAgICAgICAgICAgICAgICAge3JldHVybiBfX3RyZWVfLmZpbmQoX19rKTt9CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9LMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfdHJhbnNwYXJlbnQ8X0NvbXBhcmUsIF9LMj46OnZhbHVlLGNvbnN0X2l0ZXJhdG9yPjo6dHlwZQorICAgIGZpbmQoY29uc3QgX0syJiBfX2spIGNvbnN0ICAgICAgICAgICAgICAgICAgICAge3JldHVybiBfX3RyZWVfLmZpbmQoX19rKTt9CisjZW5kaWYKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdHJlZV8uX19jb3VudF91bmlxdWUoX19rKTt9CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc190cmFuc3BhcmVudDxfQ29tcGFyZSwgX0syPjo6dmFsdWUsc2l6ZV90eXBlPjo6dHlwZQorICAgIGNvdW50KGNvbnN0IF9LMiYgX19rKSBjb25zdCAgICAgICAgICAgICAgICAgICAge3JldHVybiBfX3RyZWVfLl9fY291bnRfbXVsdGkoX19rKTt9CisjZW5kaWYKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICAgICAge3JldHVybiBfX3RyZWVfLmxvd2VyX2JvdW5kKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdHJlZV8ubG93ZXJfYm91bmQoX19rKTt9CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc190cmFuc3BhcmVudDxfQ29tcGFyZSwgX0syPjo6dmFsdWUsaXRlcmF0b3I+Ojp0eXBlCisgICAgbG93ZXJfYm91bmQoY29uc3QgX0syJiBfX2spICAgICAgIHtyZXR1cm4gX190cmVlXy5sb3dlcl9ib3VuZChfX2spO30KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfSzI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3RyYW5zcGFyZW50PF9Db21wYXJlLCBfSzI+Ojp2YWx1ZSxjb25zdF9pdGVyYXRvcj46OnR5cGUKKyAgICBsb3dlcl9ib3VuZChjb25zdCBfSzImIF9faykgY29uc3Qge3JldHVybiBfX3RyZWVfLmxvd2VyX2JvdW5kKF9fayk7fQorI2VuZGlmCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICAgICAge3JldHVybiBfX3RyZWVfLnVwcGVyX2JvdW5kKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdHJlZV8udXBwZXJfYm91bmQoX19rKTt9CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc190cmFuc3BhcmVudDxfQ29tcGFyZSwgX0syPjo6dmFsdWUsaXRlcmF0b3I+Ojp0eXBlCisgICAgdXBwZXJfYm91bmQoY29uc3QgX0syJiBfX2spICAgICAgIHtyZXR1cm4gX190cmVlXy51cHBlcl9ib3VuZChfX2spO30KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc190cmFuc3BhcmVudDxfQ29tcGFyZSwgX0syPjo6dmFsdWUsY29uc3RfaXRlcmF0b3I+Ojp0eXBlCisgICAgdXBwZXJfYm91bmQoY29uc3QgX0syJiBfX2spIGNvbnN0IHtyZXR1cm4gX190cmVlXy51cHBlcl9ib3VuZChfX2spO30KKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgICAgIHtyZXR1cm4gX190cmVlXy5fX2VxdWFsX3JhbmdlX3VuaXF1ZShfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICAgICAge3JldHVybiBfX3RyZWVfLl9fZXF1YWxfcmFuZ2VfdW5pcXVlKF9fayk7fQorI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9LMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfdHJhbnNwYXJlbnQ8X0NvbXBhcmUsIF9LMj46OnZhbHVlLHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+Pjo6dHlwZQorICAgIGVxdWFsX3JhbmdlKGNvbnN0IF9LMiYgX19rKSAgICAgICB7cmV0dXJuIF9fdHJlZV8uX19lcXVhbF9yYW5nZV9tdWx0aShfX2spO30KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc190cmFuc3BhcmVudDxfQ29tcGFyZSwgX0syPjo6dmFsdWUscGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4+Ojp0eXBlCisgICAgZXF1YWxfcmFuZ2UoY29uc3QgX0syJiBfX2spIGNvbnN0IHtyZXR1cm4gX190cmVlXy5fX2VxdWFsX3JhbmdlX211bHRpKF9fayk7fQorI2VuZGlmCit9OworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+OjpzZXQoc2V0JiYgX19zLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX190cmVlXyhfVlNURDo6bW92ZShfX3MuX190cmVlXyksIF9fYSkKK3sKKyAgICBpZiAoX19hICE9IF9fcy5nZXRfYWxsb2NhdG9yKCkpCisgICAgeworICAgICAgICBjb25zdF9pdGVyYXRvciBfX2UgPSBjZW5kKCk7CisgICAgICAgIHdoaWxlICghX19zLmVtcHR5KCkpCisgICAgICAgICAgICBpbnNlcnQoX19lLCBfVlNURDo6bW92ZShfX3MuX190cmVlXy5yZW1vdmUoX19zLmJlZ2luKCkpLT5fX3ZhbHVlXykpOworICAgIH0KK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX194LAorICAgICAgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5zaXplKCkgPT0gX195LnNpemUoKSAmJiBfVlNURDo6ZXF1YWwoX194LmJlZ2luKCksIF9feC5lbmQoKSwgX195LmJlZ2luKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8IChjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feSkKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9feC5iZWdpbigpLCBfX3guZW5kKCksIF9feS5iZWdpbigpLCBfX3kuZW5kKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPT0gX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPiAoY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX194LAorICAgICAgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feSA8IF9feDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPj0oY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX194LAorICAgICAgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194IDwgX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPD0oY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX194LAorICAgICAgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX195IDwgX194KTsKK30KKworLy8gc3BlY2lhbGl6ZWQgYWxnb3JpdGhtczoKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzd2FwKHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feCwKKyAgICAgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX195KQorICAgIF9OT0VYQ0VQVF8oX05PRVhDRVBUXyhfX3guc3dhcChfX3kpKSkKK3sKKyAgICBfX3guc3dhcChfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUgPSBsZXNzPF9LZXk+LAorICAgICAgICAgIGNsYXNzIF9BbGxvY2F0b3IgPSBhbGxvY2F0b3I8X0tleT4gPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgbXVsdGlzZXQKK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlczoKKyAgICB0eXBlZGVmIF9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgIHR5cGVkZWYga2V5X3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0NvbXBhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2NvbXBhcmU7CisgICAgdHlwZWRlZiBrZXlfY29tcGFyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2NvbXBhcmU7CisgICAgdHlwZWRlZiBfQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICBzdGF0aWNfYXNzZXJ0KChpc19zYW1lPHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjp2YWx1ZV90eXBlLCB2YWx1ZV90eXBlPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgIkFsbG9jYXRvcjo6dmFsdWVfdHlwZSBtdXN0IGJlIHNhbWUgdHlwZSBhcyB2YWx1ZV90eXBlIik7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBfX3RyZWU8dmFsdWVfdHlwZSwgdmFsdWVfY29tcGFyZSwgYWxsb2NhdG9yX3R5cGU+IF9fYmFzZTsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+ICAgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6Ol9fbm9kZV9ob2xkZXIgICAgICAgICAgICAgICAgICAgIF9fbm9kZV9ob2xkZXI7CisKKyAgICBfX2Jhc2UgX190cmVlXzsKKworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX19iYXNlOjpwb2ludGVyICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6OmNvbnN0X2l0ZXJhdG9yICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYmFzZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgX1ZTVEQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfVlNURDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgIC8vIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG11bHRpc2V0KCkKKyAgICAgICAgX05PRVhDRVBUXygKKyAgICAgICAgICAgIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGtleV9jb21wYXJlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPGtleV9jb21wYXJlPjo6dmFsdWUpCisgICAgICAgIDogX190cmVlXyh2YWx1ZV9jb21wYXJlKCkpIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgbXVsdGlzZXQoY29uc3QgdmFsdWVfY29tcGFyZSYgX19jb21wKQorICAgICAgICBfTk9FWENFUFRfKAorICAgICAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8a2V5X2NvbXBhcmU+Ojp2YWx1ZSkKKyAgICAgICAgOiBfX3RyZWVfKF9fY29tcCkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBtdWx0aXNldChjb25zdCB2YWx1ZV9jb21wYXJlJiBfX2NvbXAsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICAgIDogX190cmVlXyhfX2NvbXAsIF9fYSkge30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX2NvbXBhcmUmIF9fY29tcCA9IHZhbHVlX2NvbXBhcmUoKSkKKyAgICAgICAgOiBfX3RyZWVfKF9fY29tcCkKKyAgICAgICAgeworICAgICAgICAgICAgaW5zZXJ0KF9fZiwgX19sKTsKKyAgICAgICAgfQorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICAgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIAorICAgICAgICBtdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgICAgICAgIDogbXVsdGlzZXQoX19mLCBfX2wsIGtleV9jb21wYXJlKCksIF9fYSkge30KKyNlbmRpZgorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIG11bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV9jb21wYXJlJiBfX2NvbXAsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICAgIDogX190cmVlXyhfX2NvbXAsIF9fYSkKKyAgICAgICAgeworICAgICAgICAgICAgaW5zZXJ0KF9fZiwgX19sKTsKKyAgICAgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG11bHRpc2V0KGNvbnN0IG11bHRpc2V0JiBfX3MpCisgICAgICAgIDogX190cmVlXyhfX3MuX190cmVlXy52YWx1ZV9jb21wKCksCisgICAgICAgICAgX19hbGxvY190cmFpdHM6OnNlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb24oX19zLl9fdHJlZV8uX19hbGxvYygpKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW5zZXJ0KF9fcy5iZWdpbigpLCBfX3MuZW5kKCkpOworICAgICAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgbXVsdGlzZXQmIG9wZXJhdG9yPShjb25zdCBtdWx0aXNldCYgX19zKQorICAgICAgICB7CisgICAgICAgICAgICBfX3RyZWVfID0gX19zLl9fdHJlZV87CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgbXVsdGlzZXQobXVsdGlzZXQmJiBfX3MpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8X19iYXNlPjo6dmFsdWUpCisgICAgICAgIDogX190cmVlXyhfVlNURDo6bW92ZShfX3MuX190cmVlXykpIHt9CisKKyAgICBtdWx0aXNldChtdWx0aXNldCYmIF9fcywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBtdWx0aXNldChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgICA6IF9fdHJlZV8oX19hKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBtdWx0aXNldChjb25zdCBtdWx0aXNldCYgX19zLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgICA6IF9fdHJlZV8oX19zLl9fdHJlZV8udmFsdWVfY29tcCgpLCBfX2EpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluc2VydChfX3MuYmVnaW4oKSwgX19zLmVuZCgpKTsKKyAgICAgICAgfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBtdWx0aXNldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIGNvbnN0IHZhbHVlX2NvbXBhcmUmIF9fY29tcCA9IHZhbHVlX2NvbXBhcmUoKSkKKyAgICAgICAgOiBfX3RyZWVfKF9fY29tcCkKKyAgICAgICAgeworICAgICAgICAgICAgaW5zZXJ0KF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBtdWx0aXNldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIGNvbnN0IHZhbHVlX2NvbXBhcmUmIF9fY29tcCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgICAgOiBfX3RyZWVfKF9fY29tcCwgX19hKQorICAgICAgICB7CisgICAgICAgICAgICBpbnNlcnQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKKyAgICAgICAgfQorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIAorICAgIG11bHRpc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgICAgOiBtdWx0aXNldChfX2lsLCBrZXlfY29tcGFyZSgpLCBfX2EpIHt9CisjZW5kaWYKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBtdWx0aXNldCYgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkKKyAgICAgICAgeworICAgICAgICAgICAgX190cmVlXy5fX2Fzc2lnbl9tdWx0aShfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgbXVsdGlzZXQmIG9wZXJhdG9yPShtdWx0aXNldCYmIF9fcykKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfX2Jhc2U+Ojp2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgX190cmVlXyA9IF9WU1REOjptb3ZlKF9fcy5fX3RyZWVfKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICBpdGVyYXRvciBiZWdpbigpIF9OT0VYQ0VQVCAgICAgICB7cmV0dXJuIF9fdHJlZV8uYmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190cmVlXy5iZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgICAgaXRlcmF0b3IgZW5kKCkgX05PRVhDRVBUICAgICAgICAge3JldHVybiBfX3RyZWVfLmVuZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RyZWVfLmVuZCgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIF9OT0VYQ0VQVAorICAgICAgICAgICAge3JldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBfTk9FWENFUFQKKyAgICAgICAgICAgIHtyZXR1cm4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpICBjb25zdCBfTk9FWENFUFQge3JldHVybiBiZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgY2VuZCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIGVuZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmJlZ2luKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gcmJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyZW5kKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gcmVuZCgpO30KKworICAgIF9MSUJDUFBfTk9ESVNDQVJEX0FGVEVSX0NYWDE3IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIGVtcHR5KCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190cmVlXy5zaXplKCkgPT0gMDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190cmVlXy5zaXplKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RyZWVfLm1heF9zaXplKCk7fQorCisgICAgLy8gbW9kaWZpZXJzOgorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgaXRlcmF0b3IgZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKyAgICAgICAgICAgIHtyZXR1cm4gX190cmVlXy5fX2VtcGxhY2VfbXVsdGkoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pO30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgaXRlcmF0b3IgZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgICAgICB7cmV0dXJuIF9fdHJlZV8uX19lbXBsYWNlX2hpbnRfbXVsdGkoX19wLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7fQorI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX192KQorICAgICAgICB7cmV0dXJuIF9fdHJlZV8uX19pbnNlcnRfbXVsdGkoX192KTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3AsIGNvbnN0IHZhbHVlX3R5cGUmIF9fdikKKyAgICAgICAge3JldHVybiBfX3RyZWVfLl9faW5zZXJ0X211bHRpKF9fcCwgX192KTt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdm9pZCBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoY29uc3RfaXRlcmF0b3IgX19lID0gY2VuZCgpOyBfX2YgIT0gX19sOyArK19fZikKKyAgICAgICAgICAgICAgICBfX3RyZWVfLl9faW5zZXJ0X211bHRpKF9fZSwgKl9fZik7CisgICAgICAgIH0KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3YpCisgICAgICAgIHtyZXR1cm4gX190cmVlXy5fX2luc2VydF9tdWx0aShfVlNURDo6bW92ZShfX3YpKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcCwgdmFsdWVfdHlwZSYmIF9fdikKKyAgICAgICAge3JldHVybiBfX3RyZWVfLl9faW5zZXJ0X211bHRpKF9fcCwgX1ZTVEQ6Om1vdmUoX192KSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkKKyAgICAgICAge2luc2VydChfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpO30KKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcCkge3JldHVybiBfX3RyZWVfLmVyYXNlKF9fcCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9faykge3JldHVybiBfX3RyZWVfLl9fZXJhc2VfbXVsdGkoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2YsIGNvbnN0X2l0ZXJhdG9yIF9fbCkKKyAgICAgICAge3JldHVybiBfX3RyZWVfLmVyYXNlKF9fZiwgX19sKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgY2xlYXIoKSBfTk9FWENFUFQge19fdHJlZV8uY2xlYXIoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKG11bHRpc2V0JiBfX3MpCisgICAgICAgIF9OT0VYQ0VQVF8oX19pc19ub3Rocm93X3N3YXBwYWJsZTxfX2Jhc2U+Ojp2YWx1ZSkKKyAgICAgICAge19fdHJlZV8uc3dhcChfX3MuX190cmVlXyk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RyZWVfLl9fYWxsb2MoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGtleV9jb21wYXJlICAgIGtleV9jb21wKCkgICAgICBjb25zdCB7cmV0dXJuIF9fdHJlZV8udmFsdWVfY29tcCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmFsdWVfY29tcGFyZSAgdmFsdWVfY29tcCgpICAgIGNvbnN0IHtyZXR1cm4gX190cmVlXy52YWx1ZV9jb21wKCk7fQorCisgICAgLy8gc2V0IG9wZXJhdGlvbnM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykgICAgICAgICAgICAge3JldHVybiBfX3RyZWVfLmZpbmQoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Qge3JldHVybiBfX3RyZWVfLmZpbmQoX19rKTt9CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBfVlNURDo6ZW5hYmxlX2lmPF9WU1REOjpfX2lzX3RyYW5zcGFyZW50PF9Db21wYXJlLCBfSzI+Ojp2YWx1ZSxpdGVyYXRvcj46OnR5cGUKKyAgICBmaW5kKGNvbnN0IF9LMiYgX19rKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gX190cmVlXy5maW5kKF9fayk7fQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfSzI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIF9WU1REOjplbmFibGVfaWY8X1ZTVEQ6Ol9faXNfdHJhbnNwYXJlbnQ8X0NvbXBhcmUsIF9LMj46OnZhbHVlLGNvbnN0X2l0ZXJhdG9yPjo6dHlwZQorICAgIGZpbmQoY29uc3QgX0syJiBfX2spIGNvbnN0ICAgICAgICAgICAgICAgICAgICAge3JldHVybiBfX3RyZWVfLmZpbmQoX19rKTt9CisjZW5kaWYKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdHJlZV8uX19jb3VudF9tdWx0aShfX2spO30KKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfSzI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX3RyYW5zcGFyZW50PF9Db21wYXJlLCBfSzI+Ojp2YWx1ZSxzaXplX3R5cGU+Ojp0eXBlCisgICAgY291bnQoY29uc3QgX0syJiBfX2spIGNvbnN0ICAgICAgICAgICAge3JldHVybiBfX3RyZWVfLl9fY291bnRfbXVsdGkoX19rKTt9CisjZW5kaWYKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX19rKQorICAgICAgICB7cmV0dXJuIF9fdHJlZV8ubG93ZXJfYm91bmQoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgICAgICAgICB7cmV0dXJuIF9fdHJlZV8ubG93ZXJfYm91bmQoX19rKTt9CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBfVlNURDo6ZW5hYmxlX2lmPF9WU1REOjpfX2lzX3RyYW5zcGFyZW50PF9Db21wYXJlLCBfSzI+Ojp2YWx1ZSxpdGVyYXRvcj46OnR5cGUKKyAgICBsb3dlcl9ib3VuZChjb25zdCBfSzImIF9faykgICAgICAge3JldHVybiBfX3RyZWVfLmxvd2VyX2JvdW5kKF9fayk7fQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9LMj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdHlwZW5hbWUgX1ZTVEQ6OmVuYWJsZV9pZjxfVlNURDo6X19pc190cmFuc3BhcmVudDxfQ29tcGFyZSwgX0syPjo6dmFsdWUsY29uc3RfaXRlcmF0b3I+Ojp0eXBlCisgICAgbG93ZXJfYm91bmQoY29uc3QgX0syJiBfX2spIGNvbnN0IHtyZXR1cm4gX190cmVlXy5sb3dlcl9ib3VuZChfX2spO30KKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgICAgICAgICB7cmV0dXJuIF9fdHJlZV8udXBwZXJfYm91bmQoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgICAgICAgICB7cmV0dXJuIF9fdHJlZV8udXBwZXJfYm91bmQoX19rKTt9CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBfVlNURDo6ZW5hYmxlX2lmPF9WU1REOjpfX2lzX3RyYW5zcGFyZW50PF9Db21wYXJlLCBfSzI+Ojp2YWx1ZSxpdGVyYXRvcj46OnR5cGUKKyAgICB1cHBlcl9ib3VuZChjb25zdCBfSzImIF9faykgICAgICAge3JldHVybiBfX3RyZWVfLnVwcGVyX2JvdW5kKF9fayk7fQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfSzI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIF9WU1REOjplbmFibGVfaWY8X1ZTVEQ6Ol9faXNfdHJhbnNwYXJlbnQ8X0NvbXBhcmUsIF9LMj46OnZhbHVlLGNvbnN0X2l0ZXJhdG9yPjo6dHlwZQorICAgIHVwcGVyX2JvdW5kKGNvbnN0IF9LMiYgX19rKSBjb25zdCB7cmV0dXJuIF9fdHJlZV8udXBwZXJfYm91bmQoX19rKTt9CisjZW5kaWYKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPiAgICAgICAgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKQorICAgICAgICAgICAge3JldHVybiBfX3RyZWVfLl9fZXF1YWxfcmFuZ2VfbXVsdGkoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgICAgICAgICB7cmV0dXJuIF9fdHJlZV8uX19lcXVhbF9yYW5nZV9tdWx0aShfX2spO30KKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfSzI+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVuYW1lIF9WU1REOjplbmFibGVfaWY8X1ZTVEQ6Ol9faXNfdHJhbnNwYXJlbnQ8X0NvbXBhcmUsIF9LMj46OnZhbHVlLHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+Pjo6dHlwZQorICAgIGVxdWFsX3JhbmdlKGNvbnN0IF9LMiYgX19rKSAgICAgICB7cmV0dXJuIF9fdHJlZV8uX19lcXVhbF9yYW5nZV9tdWx0aShfX2spO30KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0syPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0eXBlbmFtZSBfVlNURDo6ZW5hYmxlX2lmPF9WU1REOjpfX2lzX3RyYW5zcGFyZW50PF9Db21wYXJlLCBfSzI+Ojp2YWx1ZSxwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPj46OnR5cGUKKyAgICBlcXVhbF9yYW5nZShjb25zdCBfSzImIF9faykgY29uc3Qge3JldHVybiBfX3RyZWVfLl9fZXF1YWxfcmFuZ2VfbXVsdGkoX19rKTt9CisjZW5kaWYKK307CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KK211bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPjo6bXVsdGlzZXQobXVsdGlzZXQmJiBfX3MsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX3RyZWVfKF9WU1REOjptb3ZlKF9fcy5fX3RyZWVfKSwgX19hKQoreworICAgIGlmIChfX2EgIT0gX19zLmdldF9hbGxvY2F0b3IoKSkKKyAgICB7CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZSA9IGNlbmQoKTsKKyAgICAgICAgd2hpbGUgKCFfX3MuZW1wdHkoKSkKKyAgICAgICAgICAgIGluc2VydChfX2UsIF9WU1REOjptb3ZlKF9fcy5fX3RyZWVfLnJlbW92ZShfX3MuYmVnaW4oKSktPl9fdmFsdWVfKSk7CisgICAgfQorfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feCwKKyAgICAgICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5zaXplKCkgPT0gX195LnNpemUoKSAmJiBfVlNURDo6ZXF1YWwoX194LmJlZ2luKCksIF9feC5lbmQoKSwgX195LmJlZ2luKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8IChjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feCwKKyAgICAgICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCit7CisgICAgcmV0dXJuIF9WU1REOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZShfX3guYmVnaW4oKSwgX194LmVuZCgpLCBfX3kuYmVnaW4oKSwgX195LmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yIT0oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX195KQoreworICAgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+IChjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feCwKKyAgICAgICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feSA8IF9feDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPj0oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX195KQoreworICAgIHJldHVybiAhKF9feCA8IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjw9KGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX194LAorICAgICAgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3kgPCBfX3gpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feCwKKyAgICAgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCisgICAgX05PRVhDRVBUXyhfTk9FWENFUFRfKF9feC5zd2FwKF9feSkpKQoreworICAgIF9feC5zd2FwKF9feSk7Cit9CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX1NFVApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3NldGptcC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3NldGptcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NGI0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc2V0am1wLmgKQEAgLTAsMCArMSw0NSBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNldGptcC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9TRVRKTVBfSAorI2RlZmluZSBfTElCQ1BQX1NFVEpNUF9ICisKKy8qCisgICAgc2V0am1wLmggc3lub3BzaXMKKworTWFjcm9zOgorCisgICAgc2V0am1wCisKK1R5cGVzOgorCisgICAgam1wX2J1ZgorCit2b2lkIGxvbmdqbXAoam1wX2J1ZiBlbnYsIGludCB2YWwpOworCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCisjaW5jbHVkZV9uZXh0IDxzZXRqbXAuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKyNpZm5kZWYgc2V0am1wCisjZGVmaW5lIHNldGptcChlbnYpIHNldGptcChlbnYpCisjZW5kaWYKKworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9TRVRKTVBfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3NoYXJlZF9tdXRleCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zaGFyZWRfbXV0ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNiODE1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zaGFyZWRfbXV0ZXgKQEAgLTAsMCArMSw1MDcgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzaGFyZWRfbXV0ZXggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfU0hBUkVEX01VVEVYCisjZGVmaW5lIF9MSUJDUFBfU0hBUkVEX01VVEVYCisKKy8qCisgICAgc2hhcmVkX211dGV4IHN5bm9wc2lzCisKKy8vIEMrKzF5CisKK25hbWVzcGFjZSBzdGQKK3sKKworY2xhc3Mgc2hhcmVkX211dGV4ICAgICAgLy8gQysrMTcKK3sKK3B1YmxpYzoKKyAgICBzaGFyZWRfbXV0ZXgoKTsKKyAgICB+c2hhcmVkX211dGV4KCk7CisKKyAgICBzaGFyZWRfbXV0ZXgoY29uc3Qgc2hhcmVkX211dGV4JikgPSBkZWxldGU7CisgICAgc2hhcmVkX211dGV4JiBvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX211dGV4JikgPSBkZWxldGU7CisKKyAgICAvLyBFeGNsdXNpdmUgb3duZXJzaGlwCisgICAgdm9pZCBsb2NrKCk7IC8vIGJsb2NraW5nCisgICAgYm9vbCB0cnlfbG9jaygpOworICAgIHZvaWQgdW5sb2NrKCk7CisKKyAgICAvLyBTaGFyZWQgb3duZXJzaGlwCisgICAgdm9pZCBsb2NrX3NoYXJlZCgpOyAvLyBibG9ja2luZworICAgIGJvb2wgdHJ5X2xvY2tfc2hhcmVkKCk7CisgICAgdm9pZCB1bmxvY2tfc2hhcmVkKCk7CisKKyAgICB0eXBlZGVmIGltcGxlbWVudGF0aW9uLWRlZmluZWQgbmF0aXZlX2hhbmRsZV90eXBlOyAvLyBTZWUgMzAuMi4zCisgICAgbmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGUoKTsgLy8gU2VlIDMwLjIuMworfTsKKworY2xhc3Mgc2hhcmVkX3RpbWVkX211dGV4Cit7CitwdWJsaWM6CisgICAgc2hhcmVkX3RpbWVkX211dGV4KCk7CisgICAgfnNoYXJlZF90aW1lZF9tdXRleCgpOworCisgICAgc2hhcmVkX3RpbWVkX211dGV4KGNvbnN0IHNoYXJlZF90aW1lZF9tdXRleCYpID0gZGVsZXRlOworICAgIHNoYXJlZF90aW1lZF9tdXRleCYgb3BlcmF0b3I9KGNvbnN0IHNoYXJlZF90aW1lZF9tdXRleCYpID0gZGVsZXRlOworCisgICAgLy8gRXhjbHVzaXZlIG93bmVyc2hpcAorICAgIHZvaWQgbG9jaygpOyAvLyBibG9ja2luZworICAgIGJvb2wgdHJ5X2xvY2soKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVwLCBjbGFzcyBQZXJpb2Q+CisgICAgICAgIGJvb2wgdHJ5X2xvY2tfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248UmVwLCBQZXJpb2Q+JiByZWxfdGltZSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbj4KKyAgICAgICAgYm9vbCB0cnlfbG9ja191bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUpOworICAgIHZvaWQgdW5sb2NrKCk7CisKKyAgICAvLyBTaGFyZWQgb3duZXJzaGlwCisgICAgdm9pZCBsb2NrX3NoYXJlZCgpOyAvLyBibG9ja2luZworICAgIGJvb2wgdHJ5X2xvY2tfc2hhcmVkKCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFJlcCwgY2xhc3MgUGVyaW9kPgorICAgICAgICBib29sCisgICAgICAgIHRyeV9sb2NrX3NoYXJlZF9mb3IoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxSZXAsIFBlcmlvZD4mIHJlbF90aW1lKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xvY2ssIGNsYXNzIER1cmF0aW9uPgorICAgICAgICBib29sCisgICAgICAgIHRyeV9sb2NrX3NoYXJlZF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUpOworICAgIHZvaWQgdW5sb2NrX3NoYXJlZCgpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIE11dGV4PgorY2xhc3Mgc2hhcmVkX2xvY2sKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIE11dGV4IG11dGV4X3R5cGU7CisKKyAgICAvLyBTaGFyZWQgbG9ja2luZworICAgIHNoYXJlZF9sb2NrKCkgbm9leGNlcHQ7CisgICAgZXhwbGljaXQgc2hhcmVkX2xvY2sobXV0ZXhfdHlwZSYgbSk7IC8vIGJsb2NraW5nCisgICAgc2hhcmVkX2xvY2sobXV0ZXhfdHlwZSYgbSwgZGVmZXJfbG9ja190KSBub2V4Y2VwdDsKKyAgICBzaGFyZWRfbG9jayhtdXRleF90eXBlJiBtLCB0cnlfdG9fbG9ja190KTsKKyAgICBzaGFyZWRfbG9jayhtdXRleF90eXBlJiBtLCBhZG9wdF9sb2NrX3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBDbG9jaywgY2xhc3MgRHVyYXRpb24+CisgICAgICAgIHNoYXJlZF9sb2NrKG11dGV4X3R5cGUmIG0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxDbG9jaywgRHVyYXRpb24+JiBhYnNfdGltZSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFJlcCwgY2xhc3MgUGVyaW9kPgorICAgICAgICBzaGFyZWRfbG9jayhtdXRleF90eXBlJiBtLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaHJvbm86OmR1cmF0aW9uPFJlcCwgUGVyaW9kPiYgcmVsX3RpbWUpOworICAgIH5zaGFyZWRfbG9jaygpOworCisgICAgc2hhcmVkX2xvY2soc2hhcmVkX2xvY2sgY29uc3QmKSA9IGRlbGV0ZTsKKyAgICBzaGFyZWRfbG9jayYgb3BlcmF0b3I9KHNoYXJlZF9sb2NrIGNvbnN0JikgPSBkZWxldGU7CisKKyAgICBzaGFyZWRfbG9jayhzaGFyZWRfbG9jayYmIHUpIG5vZXhjZXB0OworICAgIHNoYXJlZF9sb2NrJiBvcGVyYXRvcj0oc2hhcmVkX2xvY2smJiB1KSBub2V4Y2VwdDsKKworICAgIHZvaWQgbG9jaygpOyAvLyBibG9ja2luZworICAgIGJvb2wgdHJ5X2xvY2soKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVwLCBjbGFzcyBQZXJpb2Q+CisgICAgICAgIGJvb2wgdHJ5X2xvY2tfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248UmVwLCBQZXJpb2Q+JiByZWxfdGltZSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbj4KKyAgICAgICAgYm9vbCB0cnlfbG9ja191bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYWJzX3RpbWUpOworICAgIHZvaWQgdW5sb2NrKCk7CisKKyAgICAvLyBTZXR0ZXJzCisgICAgdm9pZCBzd2FwKHNoYXJlZF9sb2NrJiB1KSBub2V4Y2VwdDsKKyAgICBtdXRleF90eXBlKiByZWxlYXNlKCkgbm9leGNlcHQ7CisKKyAgICAvLyBHZXR0ZXJzCisgICAgYm9vbCBvd25zX2xvY2soKSBjb25zdCBub2V4Y2VwdDsKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sICgpIGNvbnN0IG5vZXhjZXB0OworICAgIG11dGV4X3R5cGUqIG11dGV4KCkgY29uc3Qgbm9leGNlcHQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgTXV0ZXg+CisgICAgdm9pZCBzd2FwKHNoYXJlZF9sb2NrPE11dGV4PiYgeCwgc2hhcmVkX2xvY2s8TXV0ZXg+JiB5KSBub2V4Y2VwdDsKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKworX0xJQkNQUF9QVVNIX01BQ1JPUworI2luY2x1ZGUgPF9fdW5kZWZfbWFjcm9zPgorCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMSB8fCBkZWZpbmVkKF9MSUJDUFBfQlVJTERJTkdfU0hBUkVEX01VVEVYKQorCisjaW5jbHVkZSA8X19tdXRleF9iYXNlPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2lmZGVmIF9MSUJDUFBfSEFTX05PX1RIUkVBRFMKKyNlcnJvciA8c2hhcmVkX211dGV4PiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgc2luZ2xlIHRocmVhZGVkIHN5c3RlbQorI2Vsc2UgLy8gIV9MSUJDUFBfSEFTX05PX1RIUkVBRFMKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3N0cnVjdCBfTElCQ1BQX1RZUEVfVklTIF9MSUJDUFBfQVZBSUxBQklMSVRZX1NIQVJFRF9NVVRFWCBfX3NoYXJlZF9tdXRleF9iYXNlCit7CisgICAgbXV0ZXggICAgICAgICAgICAgICBfX211dF87CisgICAgY29uZGl0aW9uX3ZhcmlhYmxlICBfX2dhdGUxXzsKKyAgICBjb25kaXRpb25fdmFyaWFibGUgIF9fZ2F0ZTJfOworICAgIHVuc2lnbmVkICAgICAgICAgICAgX19zdGF0ZV87CisKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgX193cml0ZV9lbnRlcmVkXyA9IDFVIDw8IChzaXplb2YodW5zaWduZWQpKl9fQ0hBUl9CSVRfXyAtIDEpOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBfX25fcmVhZGVyc18gPSB+X193cml0ZV9lbnRlcmVkXzsKKworICAgIF9fc2hhcmVkX211dGV4X2Jhc2UoKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIH5fX3NoYXJlZF9tdXRleF9iYXNlKCkgPSBkZWZhdWx0OworCisgICAgX19zaGFyZWRfbXV0ZXhfYmFzZShjb25zdCBfX3NoYXJlZF9tdXRleF9iYXNlJikgPSBkZWxldGU7CisgICAgX19zaGFyZWRfbXV0ZXhfYmFzZSYgb3BlcmF0b3I9KGNvbnN0IF9fc2hhcmVkX211dGV4X2Jhc2UmKSA9IGRlbGV0ZTsKKworICAgIC8vIEV4Y2x1c2l2ZSBvd25lcnNoaXAKKyAgICB2b2lkIGxvY2soKTsgLy8gYmxvY2tpbmcKKyAgICBib29sIHRyeV9sb2NrKCk7CisgICAgdm9pZCB1bmxvY2soKTsKKworICAgIC8vIFNoYXJlZCBvd25lcnNoaXAKKyAgICB2b2lkIGxvY2tfc2hhcmVkKCk7IC8vIGJsb2NraW5nCisgICAgYm9vbCB0cnlfbG9ja19zaGFyZWQoKTsKKyAgICB2b2lkIHVubG9ja19zaGFyZWQoKTsKKworLy8gICAgIHR5cGVkZWYgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBuYXRpdmVfaGFuZGxlX3R5cGU7IC8vIFNlZSAzMC4yLjMKKy8vICAgICBuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZSgpOyAvLyBTZWUgMzAuMi4zCit9OworCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAorY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyBfTElCQ1BQX0FWQUlMQUJJTElUWV9TSEFSRURfTVVURVggc2hhcmVkX211dGV4Cit7CisgICAgX19zaGFyZWRfbXV0ZXhfYmFzZSBfX2Jhc2U7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzaGFyZWRfbXV0ZXgoKSA6IF9fYmFzZSgpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB+c2hhcmVkX211dGV4KCkgPSBkZWZhdWx0OworCisgICAgc2hhcmVkX211dGV4KGNvbnN0IHNoYXJlZF9tdXRleCYpID0gZGVsZXRlOworICAgIHNoYXJlZF9tdXRleCYgb3BlcmF0b3I9KGNvbnN0IHNoYXJlZF9tdXRleCYpID0gZGVsZXRlOworCisgICAgLy8gRXhjbHVzaXZlIG93bmVyc2hpcAorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCBsb2NrKCkgICAgIHsgcmV0dXJuIF9fYmFzZS5sb2NrKCk7IH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJvb2wgdHJ5X2xvY2soKSB7IHJldHVybiBfX2Jhc2UudHJ5X2xvY2soKTsgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCB1bmxvY2soKSAgIHsgcmV0dXJuIF9fYmFzZS51bmxvY2soKTsgfQorCisgICAgLy8gU2hhcmVkIG93bmVyc2hpcAorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCBsb2NrX3NoYXJlZCgpICAgICB7IHJldHVybiBfX2Jhc2UubG9ja19zaGFyZWQoKTsgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYm9vbCB0cnlfbG9ja19zaGFyZWQoKSB7IHJldHVybiBfX2Jhc2UudHJ5X2xvY2tfc2hhcmVkKCk7IH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgdW5sb2NrX3NoYXJlZCgpICAgeyByZXR1cm4gX19iYXNlLnVubG9ja19zaGFyZWQoKTsgfQorCisvLyAgICAgdHlwZWRlZiBfX3NoYXJlZF9tdXRleF9iYXNlOjpuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZV90eXBlOworLy8gICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGUoKSB7IHJldHVybiBfX2Jhc2U6OnVubG9ja19zaGFyZWQoKTsgfQorfTsKKyNlbmRpZgorCisKK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgX0xJQkNQUF9BVkFJTEFCSUxJVFlfU0hBUkVEX01VVEVYIHNoYXJlZF90aW1lZF9tdXRleAoreworICAgIF9fc2hhcmVkX211dGV4X2Jhc2UgX19iYXNlOworcHVibGljOgorICAgIHNoYXJlZF90aW1lZF9tdXRleCgpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgfnNoYXJlZF90aW1lZF9tdXRleCgpID0gZGVmYXVsdDsKKworICAgIHNoYXJlZF90aW1lZF9tdXRleChjb25zdCBzaGFyZWRfdGltZWRfbXV0ZXgmKSA9IGRlbGV0ZTsKKyAgICBzaGFyZWRfdGltZWRfbXV0ZXgmIG9wZXJhdG9yPShjb25zdCBzaGFyZWRfdGltZWRfbXV0ZXgmKSA9IGRlbGV0ZTsKKworICAgIC8vIEV4Y2x1c2l2ZSBvd25lcnNoaXAKKyAgICB2b2lkIGxvY2soKTsKKyAgICBib29sIHRyeV9sb2NrKCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbAorICAgICAgICB0cnlfbG9ja19mb3IoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19yZWxfdGltZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRyeV9sb2NrX3VudGlsKGNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSArIF9fcmVsX3RpbWUpOworICAgICAgICB9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgorICAgICAgICBfTElCQ1BQX01FVEhPRF9URU1QTEFURV9JTVBMSUNJVF9JTlNUQU5USUFUSU9OX1ZJUworICAgICAgICBib29sCisgICAgICAgIHRyeV9sb2NrX3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYWJzX3RpbWUpOworICAgIHZvaWQgdW5sb2NrKCk7CisKKyAgICAvLyBTaGFyZWQgb3duZXJzaGlwCisgICAgdm9pZCBsb2NrX3NoYXJlZCgpOworICAgIGJvb2wgdHJ5X2xvY2tfc2hhcmVkKCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbAorICAgICAgICB0cnlfbG9ja19zaGFyZWRfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcmVsX3RpbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnlfbG9ja19zaGFyZWRfdW50aWwoY2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgX19yZWxfdGltZSk7CisgICAgICAgIH0KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0Nsb2NrLCBjbGFzcyBfRHVyYXRpb24+CisgICAgICAgIF9MSUJDUFBfTUVUSE9EX1RFTVBMQVRFX0lNUExJQ0lUX0lOU1RBTlRJQVRJT05fVklTCisgICAgICAgIGJvb2wKKyAgICAgICAgdHJ5X2xvY2tfc2hhcmVkX3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYWJzX3RpbWUpOworICAgIHZvaWQgdW5sb2NrX3NoYXJlZCgpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgorYm9vbAorc2hhcmVkX3RpbWVkX211dGV4Ojp0cnlfbG9ja191bnRpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYWJzX3RpbWUpCit7CisgICAgdW5pcXVlX2xvY2s8bXV0ZXg+IF9fbGsoX19iYXNlLl9fbXV0Xyk7CisgICAgaWYgKF9fYmFzZS5fX3N0YXRlXyAmIF9fYmFzZS5fX3dyaXRlX2VudGVyZWRfKQorICAgIHsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2X3N0YXR1cyBfX3N0YXR1cyA9IF9fYmFzZS5fX2dhdGUxXy53YWl0X3VudGlsKF9fbGssIF9fYWJzX3RpbWUpOworICAgICAgICAgICAgaWYgKChfX2Jhc2UuX19zdGF0ZV8gJiBfX2Jhc2UuX193cml0ZV9lbnRlcmVkXykgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChfX3N0YXR1cyA9PSBjdl9zdGF0dXM6OnRpbWVvdXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIF9fYmFzZS5fX3N0YXRlXyB8PSBfX2Jhc2UuX193cml0ZV9lbnRlcmVkXzsKKyAgICBpZiAoX19iYXNlLl9fc3RhdGVfICYgX19iYXNlLl9fbl9yZWFkZXJzXykKKyAgICB7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBjdl9zdGF0dXMgX19zdGF0dXMgPSBfX2Jhc2UuX19nYXRlMl8ud2FpdF91bnRpbChfX2xrLCBfX2Fic190aW1lKTsKKyAgICAgICAgICAgIGlmICgoX19iYXNlLl9fc3RhdGVfICYgX19iYXNlLl9fbl9yZWFkZXJzXykgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChfX3N0YXR1cyA9PSBjdl9zdGF0dXM6OnRpbWVvdXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19iYXNlLl9fc3RhdGVfICY9IH5fX2Jhc2UuX193cml0ZV9lbnRlcmVkXzsKKyAgICAgICAgICAgICAgICBfX2Jhc2UuX19nYXRlMV8ubm90aWZ5X2FsbCgpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgorYm9vbAorc2hhcmVkX3RpbWVkX211dGV4Ojp0cnlfbG9ja19zaGFyZWRfdW50aWwoCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX2Fic190aW1lKQoreworICAgIHVuaXF1ZV9sb2NrPG11dGV4PiBfX2xrKF9fYmFzZS5fX211dF8pOworICAgIGlmICgoX19iYXNlLl9fc3RhdGVfICYgX19iYXNlLl9fd3JpdGVfZW50ZXJlZF8pIHx8IChfX2Jhc2UuX19zdGF0ZV8gJiBfX2Jhc2UuX19uX3JlYWRlcnNfKSA9PSBfX2Jhc2UuX19uX3JlYWRlcnNfKQorICAgIHsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2X3N0YXR1cyBzdGF0dXMgPSBfX2Jhc2UuX19nYXRlMV8ud2FpdF91bnRpbChfX2xrLCBfX2Fic190aW1lKTsKKyAgICAgICAgICAgIGlmICgoX19iYXNlLl9fc3RhdGVfICYgX19iYXNlLl9fd3JpdGVfZW50ZXJlZF8pID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX2Jhc2UuX19zdGF0ZV8gJiBfX2Jhc2UuX19uX3JlYWRlcnNfKSA8IF9fYmFzZS5fX25fcmVhZGVyc18pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IGN2X3N0YXR1czo6dGltZW91dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdW5zaWduZWQgX19udW1fcmVhZGVycyA9IChfX2Jhc2UuX19zdGF0ZV8gJiBfX2Jhc2UuX19uX3JlYWRlcnNfKSArIDE7CisgICAgX19iYXNlLl9fc3RhdGVfICY9IH5fX2Jhc2UuX19uX3JlYWRlcnNfOworICAgIF9fYmFzZS5fX3N0YXRlXyB8PSBfX251bV9yZWFkZXJzOworICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX011dGV4PgorY2xhc3Mgc2hhcmVkX2xvY2sKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9NdXRleCBtdXRleF90eXBlOworCitwcml2YXRlOgorICAgIG11dGV4X3R5cGUqIF9fbV87CisgICAgYm9vbCBfX293bnNfOworCitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNoYXJlZF9sb2NrKCkgX05PRVhDRVBUCisgICAgICAgIDogX19tXyhudWxscHRyKSwKKyAgICAgICAgICBfX293bnNfKGZhbHNlKQorICAgICAgICB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IHNoYXJlZF9sb2NrKG11dGV4X3R5cGUmIF9fbSkKKyAgICAgICAgOiBfX21fKF9WU1REOjphZGRyZXNzb2YoX19tKSksCisgICAgICAgICAgX19vd25zXyh0cnVlKQorICAgICAgICB7X19tXy0+bG9ja19zaGFyZWQoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2hhcmVkX2xvY2sobXV0ZXhfdHlwZSYgX19tLCBkZWZlcl9sb2NrX3QpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fbV8oX1ZTVEQ6OmFkZHJlc3NvZihfX20pKSwKKyAgICAgICAgICBfX293bnNfKGZhbHNlKQorICAgICAgICB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNoYXJlZF9sb2NrKG11dGV4X3R5cGUmIF9fbSwgdHJ5X3RvX2xvY2tfdCkKKyAgICAgICAgOiBfX21fKF9WU1REOjphZGRyZXNzb2YoX19tKSksCisgICAgICAgICAgX19vd25zXyhfX20udHJ5X2xvY2tfc2hhcmVkKCkpCisgICAgICAgIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2hhcmVkX2xvY2sobXV0ZXhfdHlwZSYgX19tLCBhZG9wdF9sb2NrX3QpCisgICAgICAgIDogX19tXyhfVlNURDo6YWRkcmVzc29mKF9fbSkpLAorICAgICAgICAgIF9fb3duc18odHJ1ZSkKKyAgICAgICAge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2xvY2ssIGNsYXNzIF9EdXJhdGlvbj4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBzaGFyZWRfbG9jayhtdXRleF90eXBlJiBfX20sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYWJzX3RpbWUpCisgICAgICAgICAgICA6IF9fbV8oX1ZTVEQ6OmFkZHJlc3NvZihfX20pKSwKKyAgICAgICAgICAgICAgX19vd25zXyhfX20udHJ5X2xvY2tfc2hhcmVkX3VudGlsKF9fYWJzX3RpbWUpKQorICAgICAgICAgICAge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfUmVwLCBjbGFzcyBfUGVyaW9kPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHNoYXJlZF9sb2NrKG11dGV4X3R5cGUmIF9fbSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19yZWxfdGltZSkKKyAgICAgICAgICAgIDogX19tXyhfVlNURDo6YWRkcmVzc29mKF9fbSkpLAorICAgICAgICAgICAgICBfX293bnNfKF9fbS50cnlfbG9ja19zaGFyZWRfZm9yKF9fcmVsX3RpbWUpKQorICAgICAgICAgICAge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB+c2hhcmVkX2xvY2soKQorICAgIHsKKyAgICAgICAgaWYgKF9fb3duc18pCisgICAgICAgICAgICBfX21fLT51bmxvY2tfc2hhcmVkKCk7CisgICAgfQorCisgICAgc2hhcmVkX2xvY2soc2hhcmVkX2xvY2sgY29uc3QmKSA9IGRlbGV0ZTsKKyAgICBzaGFyZWRfbG9jayYgb3BlcmF0b3I9KHNoYXJlZF9sb2NrIGNvbnN0JikgPSBkZWxldGU7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2hhcmVkX2xvY2soc2hhcmVkX2xvY2smJiBfX3UpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fbV8oX191Ll9fbV8pLAorICAgICAgICAgIF9fb3duc18oX191Ll9fb3duc18pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fdS5fX21fID0gbnVsbHB0cjsKKyAgICAgICAgICAgIF9fdS5fX293bnNfID0gZmFsc2U7CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaGFyZWRfbG9jayYgb3BlcmF0b3I9KHNoYXJlZF9sb2NrJiYgX191KSBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIGlmIChfX293bnNfKQorICAgICAgICAgICAgX19tXy0+dW5sb2NrX3NoYXJlZCgpOworICAgICAgICBfX21fID0gbnVsbHB0cjsKKyAgICAgICAgX19vd25zXyA9IGZhbHNlOworICAgICAgICBfX21fID0gX191Ll9fbV87CisgICAgICAgIF9fb3duc18gPSBfX3UuX19vd25zXzsKKyAgICAgICAgX191Ll9fbV8gPSBudWxscHRyOworICAgICAgICBfX3UuX19vd25zXyA9IGZhbHNlOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdm9pZCBsb2NrKCk7CisgICAgYm9vbCB0cnlfbG9jaygpOworICAgIHRlbXBsYXRlIDxjbGFzcyBSZXAsIGNsYXNzIFBlcmlvZD4KKyAgICAgICAgYm9vbCB0cnlfbG9ja19mb3IoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxSZXAsIFBlcmlvZD4mIHJlbF90aW1lKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xvY2ssIGNsYXNzIER1cmF0aW9uPgorICAgICAgICBib29sIHRyeV9sb2NrX3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxDbG9jaywgRHVyYXRpb24+JiBhYnNfdGltZSk7CisgICAgdm9pZCB1bmxvY2soKTsKKworICAgIC8vIFNldHRlcnMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKHNoYXJlZF9sb2NrJiBfX3UpIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgX1ZTVEQ6OnN3YXAoX19tXywgX191Ll9fbV8pOworICAgICAgICBfVlNURDo6c3dhcChfX293bnNfLCBfX3UuX19vd25zXyk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG11dGV4X3R5cGUqIHJlbGVhc2UoKSBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIG11dGV4X3R5cGUqIF9fbSA9IF9fbV87CisgICAgICAgIF9fbV8gPSBudWxscHRyOworICAgICAgICBfX293bnNfID0gZmFsc2U7CisgICAgICAgIHJldHVybiBfX207CisgICAgfQorCisgICAgLy8gR2V0dGVycworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG93bnNfbG9jaygpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fb3duc187fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2wgKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX19vd25zXzt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgbXV0ZXhfdHlwZSogbXV0ZXgoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX21fO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfTXV0ZXg+Cit2b2lkCitzaGFyZWRfbG9jazxfTXV0ZXg+Ojpsb2NrKCkKK3sKKyAgICBpZiAoX19tXyA9PSBudWxscHRyKQorICAgICAgICBfX3Rocm93X3N5c3RlbV9lcnJvcihFUEVSTSwgInNoYXJlZF9sb2NrOjpsb2NrOiByZWZlcmVuY2VzIG51bGwgbXV0ZXgiKTsKKyAgICBpZiAoX19vd25zXykKKyAgICAgICAgX190aHJvd19zeXN0ZW1fZXJyb3IoRURFQURMSywgInNoYXJlZF9sb2NrOjpsb2NrOiBhbHJlYWR5IGxvY2tlZCIpOworICAgIF9fbV8tPmxvY2tfc2hhcmVkKCk7CisgICAgX19vd25zXyA9IHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfTXV0ZXg+Citib29sCitzaGFyZWRfbG9jazxfTXV0ZXg+Ojp0cnlfbG9jaygpCit7CisgICAgaWYgKF9fbV8gPT0gbnVsbHB0cikKKyAgICAgICAgX190aHJvd19zeXN0ZW1fZXJyb3IoRVBFUk0sICJzaGFyZWRfbG9jazo6dHJ5X2xvY2s6IHJlZmVyZW5jZXMgbnVsbCBtdXRleCIpOworICAgIGlmIChfX293bnNfKQorICAgICAgICBfX3Rocm93X3N5c3RlbV9lcnJvcihFREVBRExLLCAic2hhcmVkX2xvY2s6OnRyeV9sb2NrOiBhbHJlYWR5IGxvY2tlZCIpOworICAgIF9fb3duc18gPSBfX21fLT50cnlfbG9ja19zaGFyZWQoKTsKKyAgICByZXR1cm4gX19vd25zXzsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9NdXRleD4KK3RlbXBsYXRlIDxjbGFzcyBfUmVwLCBjbGFzcyBfUGVyaW9kPgorYm9vbAorc2hhcmVkX2xvY2s8X011dGV4Pjo6dHJ5X2xvY2tfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fZCkKK3sKKyAgICBpZiAoX19tXyA9PSBudWxscHRyKQorICAgICAgICBfX3Rocm93X3N5c3RlbV9lcnJvcihFUEVSTSwgInNoYXJlZF9sb2NrOjp0cnlfbG9ja19mb3I6IHJlZmVyZW5jZXMgbnVsbCBtdXRleCIpOworICAgIGlmIChfX293bnNfKQorICAgICAgICBfX3Rocm93X3N5c3RlbV9lcnJvcihFREVBRExLLCAic2hhcmVkX2xvY2s6OnRyeV9sb2NrX2ZvcjogYWxyZWFkeSBsb2NrZWQiKTsKKyAgICBfX293bnNfID0gX19tXy0+dHJ5X2xvY2tfc2hhcmVkX2ZvcihfX2QpOworICAgIHJldHVybiBfX293bnNfOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX011dGV4PgordGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgorYm9vbAorc2hhcmVkX2xvY2s8X011dGV4Pjo6dHJ5X2xvY2tfdW50aWwoY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX190KQoreworICAgIGlmIChfX21fID09IG51bGxwdHIpCisgICAgICAgIF9fdGhyb3dfc3lzdGVtX2Vycm9yKEVQRVJNLCAic2hhcmVkX2xvY2s6OnRyeV9sb2NrX3VudGlsOiByZWZlcmVuY2VzIG51bGwgbXV0ZXgiKTsKKyAgICBpZiAoX19vd25zXykKKyAgICAgICAgX190aHJvd19zeXN0ZW1fZXJyb3IoRURFQURMSywgInNoYXJlZF9sb2NrOjp0cnlfbG9ja191bnRpbDogYWxyZWFkeSBsb2NrZWQiKTsKKyAgICBfX293bnNfID0gX19tXy0+dHJ5X2xvY2tfc2hhcmVkX3VudGlsKF9fdCk7CisgICAgcmV0dXJuIF9fb3duc187Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfTXV0ZXg+Cit2b2lkCitzaGFyZWRfbG9jazxfTXV0ZXg+Ojp1bmxvY2soKQoreworICAgIGlmICghX19vd25zXykKKyAgICAgICAgX190aHJvd19zeXN0ZW1fZXJyb3IoRVBFUk0sICJzaGFyZWRfbG9jazo6dW5sb2NrOiBub3QgbG9ja2VkIik7CisgICAgX19tXy0+dW5sb2NrX3NoYXJlZCgpOworICAgIF9fb3duc18gPSBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9NdXRleD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzd2FwKHNoYXJlZF9sb2NrPF9NdXRleD4mIF9feCwgc2hhcmVkX2xvY2s8X011dGV4PiYgX195KSBfTk9FWENFUFQKKyAgICB7X194LnN3YXAoX195KTt9CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyAhX0xJQkNQUF9IQVNfTk9fVEhSRUFEUworCisjZW5kaWYgIC8vIF9MSUJDUFBfU1REX1ZFUiA+IDExCisKK19MSUJDUFBfUE9QX01BQ1JPUworCisjZW5kaWYgIC8vIF9MSUJDUFBfU0hBUkVEX01VVEVYCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3N0cmVhbSBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMWY0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3N0cmVhbQpAQCAtMCwwICsxLDk4NiBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNzdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9TU1RSRUFNCisjZGVmaW5lIF9MSUJDUFBfU1NUUkVBTQorCisvKgorICAgIHNzdHJlYW0gc3lub3BzaXMKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMgPSBjaGFyX3RyYWl0czxjaGFyVD4sIGNsYXNzIEFsbG9jYXRvciA9IGFsbG9jYXRvcjxjaGFyVD4gPgorY2xhc3MgYmFzaWNfc3RyaW5nYnVmCisgICAgOiBwdWJsaWMgYmFzaWNfc3RyZWFtYnVmPGNoYXJULCB0cmFpdHM+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBjaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgIHR5cGVkZWYgdHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIGludF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIHBvc190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlIG9mZl90eXBlOworICAgIHR5cGVkZWYgQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworCisgICAgLy8gMjcuOC4xLjEgQ29uc3RydWN0b3JzOgorICAgIGV4cGxpY2l0IGJhc2ljX3N0cmluZ2J1Zihpb3NfYmFzZTo6b3Blbm1vZGUgd2hpY2ggPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyAgICBleHBsaWNpdCBiYXNpY19zdHJpbmdidWYoY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGUsIGFsbG9jYXRvcl90eXBlPiYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgd2hpY2ggPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyAgICBiYXNpY19zdHJpbmdidWYoYmFzaWNfc3RyaW5nYnVmJiYgcmhzKTsKKworICAgIC8vIDI3LjguMS4yIEFzc2lnbiBhbmQgc3dhcDoKKyAgICBiYXNpY19zdHJpbmdidWYmIG9wZXJhdG9yPShiYXNpY19zdHJpbmdidWYmJiByaHMpOworICAgIHZvaWQgc3dhcChiYXNpY19zdHJpbmdidWYmIHJocyk7CisKKyAgICAvLyAyNy44LjEuMyBHZXQgYW5kIHNldDoKKyAgICBiYXNpY19zdHJpbmc8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZSwgYWxsb2NhdG9yX3R5cGU+IHN0cigpIGNvbnN0OworICAgIHZvaWQgc3RyKGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyX3R5cGUsIHRyYWl0c190eXBlLCBhbGxvY2F0b3JfdHlwZT4mIHMpOworCitwcm90ZWN0ZWQ6CisgICAgLy8gMjcuOC4xLjQgT3ZlcnJpZGRlbiB2aXJ0dWFsIGZ1bmN0aW9uczoKKyAgICB2aXJ0dWFsIGludF90eXBlIHVuZGVyZmxvdygpOworICAgIHZpcnR1YWwgaW50X3R5cGUgcGJhY2tmYWlsKGludF90eXBlIGMgPSB0cmFpdHNfdHlwZTo6ZW9mKCkpOworICAgIHZpcnR1YWwgaW50X3R5cGUgb3ZlcmZsb3cgKGludF90eXBlIGMgPSB0cmFpdHNfdHlwZTo6ZW9mKCkpOworICAgIHZpcnR1YWwgYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiBzZXRidWYoY2hhcl90eXBlKiwgc3RyZWFtc2l6ZSk7CisgICAgdmlydHVhbCBwb3NfdHlwZSBzZWVrb2ZmKG9mZl90eXBlIG9mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgd2F5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgd2hpY2ggPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyAgICB2aXJ0dWFsIHBvc190eXBlIHNlZWtwb3MocG9zX3R5cGUgc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSB3aGljaCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KKyAgdm9pZCBzd2FwKGJhc2ljX3N0cmluZ2J1ZjxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiB4LAorICAgICAgICAgICAgYmFzaWNfc3RyaW5nYnVmPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHkpOworCit0eXBlZGVmIGJhc2ljX3N0cmluZ2J1ZjxjaGFyPiAgICBzdHJpbmdidWY7Cit0eXBlZGVmIGJhc2ljX3N0cmluZ2J1Zjx3Y2hhcl90PiB3c3RyaW5nYnVmOworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cyA9IGNoYXJfdHJhaXRzPGNoYXJUPiwgY2xhc3MgQWxsb2NhdG9yID0gYWxsb2NhdG9yPGNoYXJUPiA+CitjbGFzcyBiYXNpY19pc3RyaW5nc3RyZWFtCisgICAgOiBwdWJsaWMgYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPgoreworcHVibGljOgorICAgIHR5cGVkZWYgY2hhclQgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIHRyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSBvZmZfdHlwZTsKKyAgICB0eXBlZGVmIEFsbG9jYXRvciAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgIC8vIDI3LjguMi4xIENvbnN0cnVjdG9yczoKKyAgICBleHBsaWNpdCBiYXNpY19pc3RyaW5nc3RyZWFtKGlvc19iYXNlOjpvcGVubW9kZSB3aGljaCA9IGlvc19iYXNlOjppbik7CisgICAgZXhwbGljaXQgYmFzaWNfaXN0cmluZ3N0cmVhbShjb25zdCBiYXNpY19zdHJpbmc8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZSxhbGxvY2F0b3JfdHlwZT4mIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSB3aGljaCA9IGlvc19iYXNlOjppbik7CisgICAgYmFzaWNfaXN0cmluZ3N0cmVhbShiYXNpY19pc3RyaW5nc3RyZWFtJiYgcmhzKTsKKworICAgIC8vIDI3LjguMi4yIEFzc2lnbiBhbmQgc3dhcDoKKyAgICBiYXNpY19pc3RyaW5nc3RyZWFtJiBvcGVyYXRvcj0oYmFzaWNfaXN0cmluZ3N0cmVhbSYmIHJocyk7CisgICAgdm9pZCBzd2FwKGJhc2ljX2lzdHJpbmdzdHJlYW0mIHJocyk7CisKKyAgICAvLyAyNy44LjIuMyBNZW1iZXJzOgorICAgIGJhc2ljX3N0cmluZ2J1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlLCBhbGxvY2F0b3JfdHlwZT4qIHJkYnVmKCkgY29uc3Q7CisgICAgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGUsIGFsbG9jYXRvcl90eXBlPiBzdHIoKSBjb25zdDsKKyAgICB2b2lkIHN0cihjb25zdCBiYXNpY19zdHJpbmc8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZSwgYWxsb2NhdG9yX3R5cGU+JiBzKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CisgIHZvaWQgc3dhcChiYXNpY19pc3RyaW5nc3RyZWFtPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHgsCisgICAgICAgICAgICBiYXNpY19pc3RyaW5nc3RyZWFtPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHkpOworCit0eXBlZGVmIGJhc2ljX2lzdHJpbmdzdHJlYW08Y2hhcj4gICAgaXN0cmluZ3N0cmVhbTsKK3R5cGVkZWYgYmFzaWNfaXN0cmluZ3N0cmVhbTx3Y2hhcl90PiB3aXN0cmluZ3N0cmVhbTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMgPSBjaGFyX3RyYWl0czxjaGFyVD4sIGNsYXNzIEFsbG9jYXRvciA9IGFsbG9jYXRvcjxjaGFyVD4gPgorY2xhc3MgYmFzaWNfb3N0cmluZ3N0cmVhbQorICAgIDogcHVibGljIGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4KK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlczoKKyAgICB0eXBlZGVmIGNoYXJUICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiB0cmFpdHMgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgaW50X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cG9zX3R5cGUgcG9zX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgb2ZmX3R5cGU7CisgICAgdHlwZWRlZiBBbGxvY2F0b3IgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAvLyAyNy44LjMuMSBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcjoKKyAgICBleHBsaWNpdCBiYXNpY19vc3RyaW5nc3RyZWFtKGlvc19iYXNlOjpvcGVubW9kZSB3aGljaCA9IGlvc19iYXNlOjpvdXQpOworICAgIGV4cGxpY2l0IGJhc2ljX29zdHJpbmdzdHJlYW0oY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGUsIGFsbG9jYXRvcl90eXBlPiYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIHdoaWNoID0gaW9zX2Jhc2U6Om91dCk7CisgICAgYmFzaWNfb3N0cmluZ3N0cmVhbShiYXNpY19vc3RyaW5nc3RyZWFtJiYgcmhzKTsKKworICAgIC8vIDI3LjguMy4yIEFzc2lnbi9zd2FwOgorICAgIGJhc2ljX29zdHJpbmdzdHJlYW0mIG9wZXJhdG9yPShiYXNpY19vc3RyaW5nc3RyZWFtJiYgcmhzKTsKKyAgICB2b2lkIHN3YXAoYmFzaWNfb3N0cmluZ3N0cmVhbSYgcmhzKTsKKworICAgIC8vIDI3LjguMy4zIE1lbWJlcnM6CisgICAgYmFzaWNfc3RyaW5nYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGUsIGFsbG9jYXRvcl90eXBlPiogcmRidWYoKSBjb25zdDsKKyAgICBiYXNpY19zdHJpbmc8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZSwgYWxsb2NhdG9yX3R5cGU+IHN0cigpIGNvbnN0OworICAgIHZvaWQgc3RyKGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyX3R5cGUsIHRyYWl0c190eXBlLCBhbGxvY2F0b3JfdHlwZT4mIHMpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KKyAgdm9pZCBzd2FwKGJhc2ljX29zdHJpbmdzdHJlYW08Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgeCwKKyAgICAgICAgICAgIGJhc2ljX29zdHJpbmdzdHJlYW08Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgeSk7CisKK3R5cGVkZWYgYmFzaWNfb3N0cmluZ3N0cmVhbTxjaGFyPiAgICBvc3RyaW5nc3RyZWFtOwordHlwZWRlZiBiYXNpY19vc3RyaW5nc3RyZWFtPHdjaGFyX3Q+IHdvc3RyaW5nc3RyZWFtOworCit0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cyA9IGNoYXJfdHJhaXRzPGNoYXJUPiwgY2xhc3MgQWxsb2NhdG9yID0gYWxsb2NhdG9yPGNoYXJUPiA+CitjbGFzcyBiYXNpY19zdHJpbmdzdHJlYW0KKyAgICA6IHB1YmxpYyBiYXNpY19pb3N0cmVhbTxjaGFyVCwgdHJhaXRzPgoreworcHVibGljOgorICAgIC8vIHR5cGVzOgorICAgIHR5cGVkZWYgY2hhclQgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIHRyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSBvZmZfdHlwZTsKKyAgICB0eXBlZGVmIEFsbG9jYXRvciAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgIC8vIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisgICAgZXhwbGljaXQgYmFzaWNfc3RyaW5nc3RyZWFtKGlvc19iYXNlOjpvcGVubW9kZSB3aGljaCA9IGlvc19iYXNlOjpvdXR8aW9zX2Jhc2U6OmluKTsKKyAgICBleHBsaWNpdCBiYXNpY19zdHJpbmdzdHJlYW0oY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGUsIGFsbG9jYXRvcl90eXBlPiYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgd2hpY2ggPSBpb3NfYmFzZTo6b3V0fGlvc19iYXNlOjppbik7CisgICAgYmFzaWNfc3RyaW5nc3RyZWFtKGJhc2ljX3N0cmluZ3N0cmVhbSYmIHJocyk7CisKKyAgICAvLyAyNy44LjUuMSBBc3NpZ24vc3dhcDoKKyAgICBiYXNpY19zdHJpbmdzdHJlYW0mIG9wZXJhdG9yPShiYXNpY19zdHJpbmdzdHJlYW0mJiByaHMpOworICAgIHZvaWQgc3dhcChiYXNpY19zdHJpbmdzdHJlYW0mIHJocyk7CisKKyAgICAvLyBNZW1iZXJzOgorICAgIGJhc2ljX3N0cmluZ2J1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlLCBhbGxvY2F0b3JfdHlwZT4qIHJkYnVmKCkgY29uc3Q7CisgICAgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGUsIGFsbG9jYXRvcl90eXBlPiBzdHIoKSBjb25zdDsKKyAgICB2b2lkIHN0cihjb25zdCBiYXNpY19zdHJpbmc8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZSwgYWxsb2NhdG9yX3R5cGU+JiBzdHIpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KKyAgdm9pZCBzd2FwKGJhc2ljX3N0cmluZ3N0cmVhbTxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiB4LAorICAgICAgICAgICAgYmFzaWNfc3RyaW5nc3RyZWFtPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHkpOworCit0eXBlZGVmIGJhc2ljX3N0cmluZ3N0cmVhbTxjaGFyPiAgICBzdHJpbmdzdHJlYW07Cit0eXBlZGVmIGJhc2ljX3N0cmluZ3N0cmVhbTx3Y2hhcl90PiB3c3RyaW5nc3RyZWFtOworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8aXN0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX1BVU0hfTUFDUk9TCisjaW5jbHVkZSA8X191bmRlZl9tYWNyb3M+CisKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKKy8vIGJhc2ljX3N0cmluZ2J1ZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYmFzaWNfc3RyaW5nYnVmCisgICAgOiBwdWJsaWMgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgaW50X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cG9zX3R5cGUgcG9zX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgb2ZmX3R5cGU7CisgICAgdHlwZWRlZiBfQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyX3R5cGUsIHRyYWl0c190eXBlLCBhbGxvY2F0b3JfdHlwZT4gc3RyaW5nX3R5cGU7CisKK3ByaXZhdGU6CisKKyAgICBzdHJpbmdfdHlwZSBfX3N0cl87CisgICAgbXV0YWJsZSBjaGFyX3R5cGUqIF9faG1fOworICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGVfOworCitwdWJsaWM6CisgICAgLy8gMjcuOC4xLjEgQ29uc3RydWN0b3JzOgorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgYmFzaWNfc3RyaW5nYnVmKGlvc19iYXNlOjpvcGVubW9kZSBfX3djaCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgYmFzaWNfc3RyaW5nYnVmKGNvbnN0IHN0cmluZ190eXBlJiBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX3djaCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBiYXNpY19zdHJpbmdidWYoYmFzaWNfc3RyaW5nYnVmJiYgX19yaHMpOworCisgICAgLy8gMjcuOC4xLjIgQXNzaWduIGFuZCBzd2FwOgorICAgIGJhc2ljX3N0cmluZ2J1ZiYgb3BlcmF0b3I9KGJhc2ljX3N0cmluZ2J1ZiYmIF9fcmhzKTsKKyNlbmRpZgorICAgIHZvaWQgc3dhcChiYXNpY19zdHJpbmdidWYmIF9fcmhzKTsKKworICAgIC8vIDI3LjguMS4zIEdldCBhbmQgc2V0OgorICAgIHN0cmluZ190eXBlIHN0cigpIGNvbnN0OworICAgIHZvaWQgc3RyKGNvbnN0IHN0cmluZ190eXBlJiBfX3MpOworCitwcm90ZWN0ZWQ6CisgICAgLy8gMjcuOC4xLjQgT3ZlcnJpZGRlbiB2aXJ0dWFsIGZ1bmN0aW9uczoKKyAgICB2aXJ0dWFsIGludF90eXBlIHVuZGVyZmxvdygpOworICAgIHZpcnR1YWwgaW50X3R5cGUgcGJhY2tmYWlsKGludF90eXBlIF9fYyA9IHRyYWl0c190eXBlOjplb2YoKSk7CisgICAgdmlydHVhbCBpbnRfdHlwZSBvdmVyZmxvdyAoaW50X3R5cGUgX19jID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKKyAgICB2aXJ0dWFsIHBvc190eXBlIHNlZWtvZmYob2ZmX3R5cGUgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fd2F5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX193Y2ggPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZpcnR1YWwgcG9zX3R5cGUgc2Vla3Bvcyhwb3NfdHlwZSBfX3NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX193Y2ggPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFzaWNfc3RyaW5nYnVmKGlvc19iYXNlOjpvcGVubW9kZSBfX3djaCkKKyAgICA6IF9faG1fKDApLAorICAgICAgX19tb2RlXyhfX3djaCkKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpiYXNpY19zdHJpbmdidWYoY29uc3Qgc3RyaW5nX3R5cGUmIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fd2NoKQorICAgIDogX19zdHJfKF9fcy5nZXRfYWxsb2NhdG9yKCkpLAorICAgICAgX19obV8oMCksCisgICAgICBfX21vZGVfKF9fd2NoKQoreworICAgIHN0cihfX3MpOworfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZ2J1ZihiYXNpY19zdHJpbmdidWYmJiBfX3JocykKKyAgICA6IF9fbW9kZV8oX19yaHMuX19tb2RlXykKK3sKKyAgICBjaGFyX3R5cGUqIF9fcCA9IGNvbnN0X2Nhc3Q8Y2hhcl90eXBlKj4oX19yaHMuX19zdHJfLmRhdGEoKSk7CisgICAgcHRyZGlmZl90IF9fYmlucCA9IC0xOworICAgIHB0cmRpZmZfdCBfX25pbnAgPSAtMTsKKyAgICBwdHJkaWZmX3QgX19laW5wID0gLTE7CisgICAgaWYgKF9fcmhzLmViYWNrKCkgIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIF9fYmlucCA9IF9fcmhzLmViYWNrKCkgLSBfX3A7CisgICAgICAgIF9fbmlucCA9IF9fcmhzLmdwdHIoKSAtIF9fcDsKKyAgICAgICAgX19laW5wID0gX19yaHMuZWdwdHIoKSAtIF9fcDsKKyAgICB9CisgICAgcHRyZGlmZl90IF9fYm91dCA9IC0xOworICAgIHB0cmRpZmZfdCBfX25vdXQgPSAtMTsKKyAgICBwdHJkaWZmX3QgX19lb3V0ID0gLTE7CisgICAgaWYgKF9fcmhzLnBiYXNlKCkgIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIF9fYm91dCA9IF9fcmhzLnBiYXNlKCkgLSBfX3A7CisgICAgICAgIF9fbm91dCA9IF9fcmhzLnBwdHIoKSAtIF9fcDsKKyAgICAgICAgX19lb3V0ID0gX19yaHMuZXBwdHIoKSAtIF9fcDsKKyAgICB9CisgICAgcHRyZGlmZl90IF9faG0gPSBfX3Jocy5fX2htXyA9PSBudWxscHRyID8gLTEgOiBfX3Jocy5fX2htXyAtIF9fcDsKKyAgICBfX3N0cl8gPSBfVlNURDo6bW92ZShfX3Jocy5fX3N0cl8pOworICAgIF9fcCA9IGNvbnN0X2Nhc3Q8Y2hhcl90eXBlKj4oX19zdHJfLmRhdGEoKSk7CisgICAgaWYgKF9fYmlucCAhPSAtMSkKKyAgICAgICAgdGhpcy0+c2V0ZyhfX3AgKyBfX2JpbnAsIF9fcCArIF9fbmlucCwgX19wICsgX19laW5wKTsKKyAgICBpZiAoX19ib3V0ICE9IC0xKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2V0cChfX3AgKyBfX2JvdXQsIF9fcCArIF9fZW91dCk7CisgICAgICAgIHRoaXMtPl9fcGJ1bXAoX19ub3V0KTsKKyAgICB9CisgICAgX19obV8gPSBfX2htID09IC0xID8gbnVsbHB0ciA6IF9fcCArIF9faG07CisgICAgX19wID0gY29uc3RfY2FzdDxjaGFyX3R5cGUqPihfX3Jocy5fX3N0cl8uZGF0YSgpKTsKKyAgICBfX3Jocy5zZXRnKF9fcCwgX19wLCBfX3ApOworICAgIF9fcmhzLnNldHAoX19wLCBfX3ApOworICAgIF9fcmhzLl9faG1fID0gX19wOworICAgIHRoaXMtPnB1YmltYnVlKF9fcmhzLmdldGxvYygpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Om9wZXJhdG9yPShiYXNpY19zdHJpbmdidWYmJiBfX3JocykKK3sKKyAgICBjaGFyX3R5cGUqIF9fcCA9IGNvbnN0X2Nhc3Q8Y2hhcl90eXBlKj4oX19yaHMuX19zdHJfLmRhdGEoKSk7CisgICAgcHRyZGlmZl90IF9fYmlucCA9IC0xOworICAgIHB0cmRpZmZfdCBfX25pbnAgPSAtMTsKKyAgICBwdHJkaWZmX3QgX19laW5wID0gLTE7CisgICAgaWYgKF9fcmhzLmViYWNrKCkgIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIF9fYmlucCA9IF9fcmhzLmViYWNrKCkgLSBfX3A7CisgICAgICAgIF9fbmlucCA9IF9fcmhzLmdwdHIoKSAtIF9fcDsKKyAgICAgICAgX19laW5wID0gX19yaHMuZWdwdHIoKSAtIF9fcDsKKyAgICB9CisgICAgcHRyZGlmZl90IF9fYm91dCA9IC0xOworICAgIHB0cmRpZmZfdCBfX25vdXQgPSAtMTsKKyAgICBwdHJkaWZmX3QgX19lb3V0ID0gLTE7CisgICAgaWYgKF9fcmhzLnBiYXNlKCkgIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIF9fYm91dCA9IF9fcmhzLnBiYXNlKCkgLSBfX3A7CisgICAgICAgIF9fbm91dCA9IF9fcmhzLnBwdHIoKSAtIF9fcDsKKyAgICAgICAgX19lb3V0ID0gX19yaHMuZXBwdHIoKSAtIF9fcDsKKyAgICB9CisgICAgcHRyZGlmZl90IF9faG0gPSBfX3Jocy5fX2htXyA9PSBudWxscHRyID8gLTEgOiBfX3Jocy5fX2htXyAtIF9fcDsKKyAgICBfX3N0cl8gPSBfVlNURDo6bW92ZShfX3Jocy5fX3N0cl8pOworICAgIF9fcCA9IGNvbnN0X2Nhc3Q8Y2hhcl90eXBlKj4oX19zdHJfLmRhdGEoKSk7CisgICAgaWYgKF9fYmlucCAhPSAtMSkKKyAgICAgICAgdGhpcy0+c2V0ZyhfX3AgKyBfX2JpbnAsIF9fcCArIF9fbmlucCwgX19wICsgX19laW5wKTsKKyAgICBlbHNlCisgICAgICAgIHRoaXMtPnNldGcobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cik7CisgICAgaWYgKF9fYm91dCAhPSAtMSkKKyAgICB7CisgICAgICAgIHRoaXMtPnNldHAoX19wICsgX19ib3V0LCBfX3AgKyBfX2VvdXQpOworICAgICAgICB0aGlzLT5fX3BidW1wKF9fbm91dCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgdGhpcy0+c2V0cChudWxscHRyLCBudWxscHRyKTsKKworICAgIF9faG1fID0gX19obSA9PSAtMSA/IG51bGxwdHIgOiBfX3AgKyBfX2htOworICAgIF9fbW9kZV8gPSBfX3Jocy5fX21vZGVfOworICAgIF9fcCA9IGNvbnN0X2Nhc3Q8Y2hhcl90eXBlKj4oX19yaHMuX19zdHJfLmRhdGEoKSk7CisgICAgX19yaHMuc2V0ZyhfX3AsIF9fcCwgX19wKTsKKyAgICBfX3Jocy5zZXRwKF9fcCwgX19wKTsKKyAgICBfX3Jocy5fX2htXyA9IF9fcDsKKyAgICB0aGlzLT5wdWJpbWJ1ZShfX3Jocy5nZXRsb2MoKSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAorYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnN3YXAoYmFzaWNfc3RyaW5nYnVmJiBfX3JocykKK3sKKyAgICBjaGFyX3R5cGUqIF9fcCA9IGNvbnN0X2Nhc3Q8Y2hhcl90eXBlKj4oX19yaHMuX19zdHJfLmRhdGEoKSk7CisgICAgcHRyZGlmZl90IF9fcmJpbnAgPSAtMTsKKyAgICBwdHJkaWZmX3QgX19ybmlucCA9IC0xOworICAgIHB0cmRpZmZfdCBfX3JlaW5wID0gLTE7CisgICAgaWYgKF9fcmhzLmViYWNrKCkgIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIF9fcmJpbnAgPSBfX3Jocy5lYmFjaygpIC0gX19wOworICAgICAgICBfX3JuaW5wID0gX19yaHMuZ3B0cigpIC0gX19wOworICAgICAgICBfX3JlaW5wID0gX19yaHMuZWdwdHIoKSAtIF9fcDsKKyAgICB9CisgICAgcHRyZGlmZl90IF9fcmJvdXQgPSAtMTsKKyAgICBwdHJkaWZmX3QgX19ybm91dCA9IC0xOworICAgIHB0cmRpZmZfdCBfX3Jlb3V0ID0gLTE7CisgICAgaWYgKF9fcmhzLnBiYXNlKCkgIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIF9fcmJvdXQgPSBfX3Jocy5wYmFzZSgpIC0gX19wOworICAgICAgICBfX3Jub3V0ID0gX19yaHMucHB0cigpIC0gX19wOworICAgICAgICBfX3Jlb3V0ID0gX19yaHMuZXBwdHIoKSAtIF9fcDsKKyAgICB9CisgICAgcHRyZGlmZl90IF9fcmhtID0gX19yaHMuX19obV8gPT0gbnVsbHB0ciA/IC0xIDogX19yaHMuX19obV8gLSBfX3A7CisgICAgX19wID0gY29uc3RfY2FzdDxjaGFyX3R5cGUqPihfX3N0cl8uZGF0YSgpKTsKKyAgICBwdHJkaWZmX3QgX19sYmlucCA9IC0xOworICAgIHB0cmRpZmZfdCBfX2xuaW5wID0gLTE7CisgICAgcHRyZGlmZl90IF9fbGVpbnAgPSAtMTsKKyAgICBpZiAodGhpcy0+ZWJhY2soKSAhPSBudWxscHRyKQorICAgIHsKKyAgICAgICAgX19sYmlucCA9IHRoaXMtPmViYWNrKCkgLSBfX3A7CisgICAgICAgIF9fbG5pbnAgPSB0aGlzLT5ncHRyKCkgLSBfX3A7CisgICAgICAgIF9fbGVpbnAgPSB0aGlzLT5lZ3B0cigpIC0gX19wOworICAgIH0KKyAgICBwdHJkaWZmX3QgX19sYm91dCA9IC0xOworICAgIHB0cmRpZmZfdCBfX2xub3V0ID0gLTE7CisgICAgcHRyZGlmZl90IF9fbGVvdXQgPSAtMTsKKyAgICBpZiAodGhpcy0+cGJhc2UoKSAhPSBudWxscHRyKQorICAgIHsKKyAgICAgICAgX19sYm91dCA9IHRoaXMtPnBiYXNlKCkgLSBfX3A7CisgICAgICAgIF9fbG5vdXQgPSB0aGlzLT5wcHRyKCkgLSBfX3A7CisgICAgICAgIF9fbGVvdXQgPSB0aGlzLT5lcHB0cigpIC0gX19wOworICAgIH0KKyAgICBwdHJkaWZmX3QgX19saG0gPSBfX2htXyA9PSBudWxscHRyID8gLTEgOiBfX2htXyAtIF9fcDsKKyAgICBfVlNURDo6c3dhcChfX21vZGVfLCBfX3Jocy5fX21vZGVfKTsKKyAgICBfX3N0cl8uc3dhcChfX3Jocy5fX3N0cl8pOworICAgIF9fcCA9IGNvbnN0X2Nhc3Q8Y2hhcl90eXBlKj4oX19zdHJfLmRhdGEoKSk7CisgICAgaWYgKF9fcmJpbnAgIT0gLTEpCisgICAgICAgIHRoaXMtPnNldGcoX19wICsgX19yYmlucCwgX19wICsgX19ybmlucCwgX19wICsgX19yZWlucCk7CisgICAgZWxzZQorICAgICAgICB0aGlzLT5zZXRnKG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpOworICAgIGlmIChfX3Jib3V0ICE9IC0xKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2V0cChfX3AgKyBfX3Jib3V0LCBfX3AgKyBfX3Jlb3V0KTsKKyAgICAgICAgdGhpcy0+X19wYnVtcChfX3Jub3V0KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB0aGlzLT5zZXRwKG51bGxwdHIsIG51bGxwdHIpOworICAgIF9faG1fID0gX19yaG0gPT0gLTEgPyBudWxscHRyIDogX19wICsgX19yaG07CisgICAgX19wID0gY29uc3RfY2FzdDxjaGFyX3R5cGUqPihfX3Jocy5fX3N0cl8uZGF0YSgpKTsKKyAgICBpZiAoX19sYmlucCAhPSAtMSkKKyAgICAgICAgX19yaHMuc2V0ZyhfX3AgKyBfX2xiaW5wLCBfX3AgKyBfX2xuaW5wLCBfX3AgKyBfX2xlaW5wKTsKKyAgICBlbHNlCisgICAgICAgIF9fcmhzLnNldGcobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cik7CisgICAgaWYgKF9fbGJvdXQgIT0gLTEpCisgICAgeworICAgICAgICBfX3Jocy5zZXRwKF9fcCArIF9fbGJvdXQsIF9fcCArIF9fbGVvdXQpOworICAgICAgICBfX3Jocy5fX3BidW1wKF9fbG5vdXQpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIF9fcmhzLnNldHAobnVsbHB0ciwgbnVsbHB0cik7CisgICAgX19yaHMuX19obV8gPSBfX2xobSA9PSAtMSA/IG51bGxwdHIgOiBfX3AgKyBfX2xobTsKKyAgICBsb2NhbGUgX190bCA9IF9fcmhzLmdldGxvYygpOworICAgIF9fcmhzLnB1YmltYnVlKHRoaXMtPmdldGxvYygpKTsKKyAgICB0aGlzLT5wdWJpbWJ1ZShfX3RsKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzd2FwKGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3gsCisgICAgIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3kpCit7CisgICAgX194LnN3YXAoX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c3RyKCkgY29uc3QKK3sKKyAgICBpZiAoX19tb2RlXyAmIGlvc19iYXNlOjpvdXQpCisgICAgeworICAgICAgICBpZiAoX19obV8gPCB0aGlzLT5wcHRyKCkpCisgICAgICAgICAgICBfX2htXyA9IHRoaXMtPnBwdHIoKTsKKyAgICAgICAgcmV0dXJuIHN0cmluZ190eXBlKHRoaXMtPnBiYXNlKCksIF9faG1fLCBfX3N0cl8uZ2V0X2FsbG9jYXRvcigpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoX19tb2RlXyAmIGlvc19iYXNlOjppbikKKyAgICAgICAgcmV0dXJuIHN0cmluZ190eXBlKHRoaXMtPmViYWNrKCksIHRoaXMtPmVncHRyKCksIF9fc3RyXy5nZXRfYWxsb2NhdG9yKCkpOworICAgIHJldHVybiBzdHJpbmdfdHlwZShfX3N0cl8uZ2V0X2FsbG9jYXRvcigpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK2Jhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzdHIoY29uc3Qgc3RyaW5nX3R5cGUmIF9fcykKK3sKKyAgICBfX3N0cl8gPSBfX3M7CisgICAgX19obV8gPSAwOworICAgIGlmIChfX21vZGVfICYgaW9zX2Jhc2U6OmluKQorICAgIHsKKyAgICAgICAgX19obV8gPSBjb25zdF9jYXN0PGNoYXJfdHlwZSo+KF9fc3RyXy5kYXRhKCkpICsgX19zdHJfLnNpemUoKTsKKyAgICAgICAgdGhpcy0+c2V0Zyhjb25zdF9jYXN0PGNoYXJfdHlwZSo+KF9fc3RyXy5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcl90eXBlKj4oX19zdHJfLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgX19obV8pOworICAgIH0KKyAgICBpZiAoX19tb2RlXyAmIGlvc19iYXNlOjpvdXQpCisgICAgeworICAgICAgICB0eXBlbmFtZSBzdHJpbmdfdHlwZTo6c2l6ZV90eXBlIF9fc3ogPSBfX3N0cl8uc2l6ZSgpOworICAgICAgICBfX2htXyA9IGNvbnN0X2Nhc3Q8Y2hhcl90eXBlKj4oX19zdHJfLmRhdGEoKSkgKyBfX3N6OworICAgICAgICBfX3N0cl8ucmVzaXplKF9fc3RyXy5jYXBhY2l0eSgpKTsKKyAgICAgICAgdGhpcy0+c2V0cChjb25zdF9jYXN0PGNoYXJfdHlwZSo+KF9fc3RyXy5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcl90eXBlKj4oX19zdHJfLmRhdGEoKSkgKyBfX3N0cl8uc2l6ZSgpKTsKKyAgICAgICAgaWYgKF9fbW9kZV8gJiAoaW9zX2Jhc2U6OmFwcCB8IGlvc19iYXNlOjphdGUpKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoX19zeiA+IElOVF9NQVgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJdGhpcy0+cGJ1bXAoSU5UX01BWCk7CisgICAgICAgICAgICAJX19zeiAtPSBJTlRfTUFYOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9fc3ogPiAwKQorICAgICAgICAgICAgCXRoaXMtPnBidW1wKF9fc3opOworICAgIAl9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmludF90eXBlCitiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6dW5kZXJmbG93KCkKK3sKKyAgICBpZiAoX19obV8gPCB0aGlzLT5wcHRyKCkpCisgICAgICAgIF9faG1fID0gdGhpcy0+cHB0cigpOworICAgIGlmIChfX21vZGVfICYgaW9zX2Jhc2U6OmluKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmVncHRyKCkgPCBfX2htXykKKyAgICAgICAgICAgIHRoaXMtPnNldGcodGhpcy0+ZWJhY2soKSwgdGhpcy0+Z3B0cigpLCBfX2htXyk7CisgICAgICAgIGlmICh0aGlzLT5ncHRyKCkgPCB0aGlzLT5lZ3B0cigpKQorICAgICAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqdGhpcy0+Z3B0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjppbnRfdHlwZQorYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnBiYWNrZmFpbChpbnRfdHlwZSBfX2MpCit7CisgICAgaWYgKF9faG1fIDwgdGhpcy0+cHB0cigpKQorICAgICAgICBfX2htXyA9IHRoaXMtPnBwdHIoKTsKKyAgICBpZiAodGhpcy0+ZWJhY2soKSA8IHRoaXMtPmdwdHIoKSkKKyAgICB7CisgICAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5zZXRnKHRoaXMtPmViYWNrKCksIHRoaXMtPmdwdHIoKS0xLCBfX2htXyk7CisgICAgICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6Om5vdF9lb2YoX19jKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKF9fbW9kZV8gJiBpb3NfYmFzZTo6b3V0KSB8fAorICAgICAgICAgICAgdHJhaXRzX3R5cGU6OmVxKHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKSwgdGhpcy0+Z3B0cigpWy0xXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnNldGcodGhpcy0+ZWJhY2soKSwgdGhpcy0+Z3B0cigpLTEsIF9faG1fKTsKKyAgICAgICAgICAgICp0aGlzLT5ncHRyKCkgPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyk7CisgICAgICAgICAgICByZXR1cm4gX19jOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6aW50X3R5cGUKK2Jhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpvdmVyZmxvdyhpbnRfdHlwZSBfX2MpCit7CisgICAgaWYgKCF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorICAgIHsKKyAgICAgICAgcHRyZGlmZl90IF9fbmlucCA9IHRoaXMtPmdwdHIoKSAgLSB0aGlzLT5lYmFjaygpOworICAgICAgICBpZiAodGhpcy0+cHB0cigpID09IHRoaXMtPmVwcHRyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghKF9fbW9kZV8gJiBpb3NfYmFzZTo6b3V0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgICAgICBwdHJkaWZmX3QgX19ub3V0ID0gdGhpcy0+cHB0cigpICAtIHRoaXMtPnBiYXNlKCk7CisgICAgICAgICAgICAgICAgcHRyZGlmZl90IF9faG0gPSBfX2htXyAtIHRoaXMtPnBiYXNlKCk7CisgICAgICAgICAgICAgICAgX19zdHJfLnB1c2hfYmFjayhjaGFyX3R5cGUoKSk7CisgICAgICAgICAgICAgICAgX19zdHJfLnJlc2l6ZShfX3N0cl8uY2FwYWNpdHkoKSk7CisgICAgICAgICAgICAgICAgY2hhcl90eXBlKiBfX3AgPSBjb25zdF9jYXN0PGNoYXJfdHlwZSo+KF9fc3RyXy5kYXRhKCkpOworICAgICAgICAgICAgICAgIHRoaXMtPnNldHAoX19wLCBfX3AgKyBfX3N0cl8uc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB0aGlzLT5fX3BidW1wKF9fbm91dCk7CisgICAgICAgICAgICAgICAgX19obV8gPSB0aGlzLT5wYmFzZSgpICsgX19obTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoLi4uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICAgICAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB9CisgICAgICAgIF9faG1fID0gX1ZTVEQ6Om1heCh0aGlzLT5wcHRyKCkgKyAxLCBfX2htXyk7CisgICAgICAgIGlmIChfX21vZGVfICYgaW9zX2Jhc2U6OmluKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyX3R5cGUqIF9fcCA9IGNvbnN0X2Nhc3Q8Y2hhcl90eXBlKj4oX19zdHJfLmRhdGEoKSk7CisgICAgICAgICAgICB0aGlzLT5zZXRnKF9fcCwgX19wICsgX19uaW5wLCBfX2htXyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMtPnNwdXRjKF9fYyk7CisgICAgfQorICAgIHJldHVybiB0cmFpdHNfdHlwZTo6bm90X2VvZihfX2MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnBvc190eXBlCitiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2Vla29mZihvZmZfdHlwZSBfX29mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpzZWVrZGlyIF9fd2F5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fd2NoKQoreworICAgIGlmIChfX2htXyA8IHRoaXMtPnBwdHIoKSkKKyAgICAgICAgX19obV8gPSB0aGlzLT5wcHRyKCk7CisgICAgaWYgKChfX3djaCAmIChpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIHBvc190eXBlKC0xKTsKKyAgICBpZiAoKF9fd2NoICYgKGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpKSA9PSAoaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkKKyAgICAgICAgJiYgX193YXkgPT0gaW9zX2Jhc2U6OmN1cikKKyAgICAgICAgcmV0dXJuIHBvc190eXBlKC0xKTsKKyAgICBjb25zdCBwdHJkaWZmX3QgX19obSA9IF9faG1fID09IG51bGxwdHIgPyAwIDogX19obV8gLSBfX3N0cl8uZGF0YSgpOworICAgIG9mZl90eXBlIF9fbm9mZjsKKyAgICBzd2l0Y2ggKF9fd2F5KQorICAgIHsKKyAgICBjYXNlIGlvc19iYXNlOjpiZWc6CisgICAgICAgIF9fbm9mZiA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgaW9zX2Jhc2U6OmN1cjoKKyAgICAgICAgaWYgKF9fd2NoICYgaW9zX2Jhc2U6OmluKQorICAgICAgICAgICAgX19ub2ZmID0gdGhpcy0+Z3B0cigpIC0gdGhpcy0+ZWJhY2soKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX19ub2ZmID0gdGhpcy0+cHB0cigpIC0gdGhpcy0+cGJhc2UoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBpb3NfYmFzZTo6ZW5kOgorICAgICAgICBfX25vZmYgPSBfX2htOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gcG9zX3R5cGUoLTEpOworICAgIH0KKyAgICBfX25vZmYgKz0gX19vZmY7CisgICAgaWYgKF9fbm9mZiA8IDAgfHwgX19obSA8IF9fbm9mZikKKyAgICAgICAgcmV0dXJuIHBvc190eXBlKC0xKTsKKyAgICBpZiAoX19ub2ZmICE9IDApCisgICAgeworICAgICAgICBpZiAoKF9fd2NoICYgaW9zX2Jhc2U6OmluKSAmJiB0aGlzLT5ncHRyKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBwb3NfdHlwZSgtMSk7CisgICAgICAgIGlmICgoX193Y2ggJiBpb3NfYmFzZTo6b3V0KSAmJiB0aGlzLT5wcHRyKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBwb3NfdHlwZSgtMSk7CisgICAgfQorICAgIGlmIChfX3djaCAmIGlvc19iYXNlOjppbikKKyAgICAgICAgdGhpcy0+c2V0Zyh0aGlzLT5lYmFjaygpLCB0aGlzLT5lYmFjaygpICsgX19ub2ZmLCBfX2htXyk7CisgICAgaWYgKF9fd2NoICYgaW9zX2Jhc2U6Om91dCkKKyAgICB7CisgICAgICAgIHRoaXMtPnNldHAodGhpcy0+cGJhc2UoKSwgdGhpcy0+ZXBwdHIoKSk7CisgICAgICAgIHRoaXMtPnBidW1wKF9fbm9mZik7CisgICAgfQorICAgIHJldHVybiBwb3NfdHlwZShfX25vZmYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnBvc190eXBlCitiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2Vla3Bvcyhwb3NfdHlwZSBfX3NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fd2NoKQoreworICAgIHJldHVybiBzZWVrb2ZmKF9fc3AsIGlvc19iYXNlOjpiZWcsIF9fd2NoKTsKK30KKworLy8gYmFzaWNfaXN0cmluZ3N0cmVhbQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYmFzaWNfaXN0cmluZ3N0cmVhbQorICAgIDogcHVibGljIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPgoreworcHVibGljOgorICAgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSBvZmZfdHlwZTsKKyAgICB0eXBlZGVmIF9BbGxvY2F0b3IgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGUsIGFsbG9jYXRvcl90eXBlPiBzdHJpbmdfdHlwZTsKKworcHJpdmF0ZToKKyAgICBiYXNpY19zdHJpbmdidWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZSwgYWxsb2NhdG9yX3R5cGU+IF9fc2JfOworCitwdWJsaWM6CisgICAgLy8gMjcuOC4yLjEgQ29uc3RydWN0b3JzOgorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgYmFzaWNfaXN0cmluZ3N0cmVhbShpb3NfYmFzZTo6b3Blbm1vZGUgX193Y2ggPSBpb3NfYmFzZTo6aW4pOworICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgYmFzaWNfaXN0cmluZ3N0cmVhbShjb25zdCBzdHJpbmdfdHlwZSYgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fd2NoID0gaW9zX2Jhc2U6OmluKTsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19pc3RyaW5nc3RyZWFtKGJhc2ljX2lzdHJpbmdzdHJlYW0mJiBfX3Jocyk7CisKKyAgICAvLyAyNy44LjIuMiBBc3NpZ24gYW5kIHN3YXA6CisgICAgYmFzaWNfaXN0cmluZ3N0cmVhbSYgb3BlcmF0b3I9KGJhc2ljX2lzdHJpbmdzdHJlYW0mJiBfX3Jocyk7CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKGJhc2ljX2lzdHJpbmdzdHJlYW0mIF9fcmhzKTsKKworICAgIC8vIDI3LjguMi4zIE1lbWJlcnM6CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmdidWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZSwgYWxsb2NhdG9yX3R5cGU+KiByZGJ1ZigpIGNvbnN0OworICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RyaW5nX3R5cGUgc3RyKCkgY29uc3Q7CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN0cihjb25zdCBzdHJpbmdfdHlwZSYgX19zKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19pc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX2lzdHJpbmdzdHJlYW0oaW9zX2Jhc2U6Om9wZW5tb2RlIF9fd2NoKQorICAgIDogYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KCZfX3NiXyksCisgICAgICBfX3NiXyhfX3djaCB8IGlvc19iYXNlOjppbikKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX2lzdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFzaWNfaXN0cmluZ3N0cmVhbShjb25zdCBzdHJpbmdfdHlwZSYgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX3djaCkKKyAgICA6IGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPigmX19zYl8pLAorICAgICAgX19zYl8oX19zLCBfX3djaCB8IGlvc19iYXNlOjppbikKK3sKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX2lzdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFzaWNfaXN0cmluZ3N0cmVhbShiYXNpY19pc3RyaW5nc3RyZWFtJiYgX19yaHMpCisgICAgOiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oX1ZTVEQ6Om1vdmUoX19yaHMpKSwKKyAgICAgIF9fc2JfKF9WU1REOjptb3ZlKF9fcmhzLl9fc2JfKSkKK3sKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNldF9yZGJ1ZigmX19zYl8pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfaXN0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfaXN0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpvcGVyYXRvcj0oYmFzaWNfaXN0cmluZ3N0cmVhbSYmIF9fcmhzKQoreworICAgIGJhc2ljX2lzdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT46Om9wZXJhdG9yPShfVlNURDo6bW92ZShfX3JocykpOworICAgIF9fc2JfID0gX1ZTVEQ6Om1vdmUoX19yaHMuX19zYl8pOworICAgIHJldHVybiAqdGhpczsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQgYmFzaWNfaXN0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojpzd2FwKGJhc2ljX2lzdHJpbmdzdHJlYW0mIF9fcmhzKQoreworICAgIGJhc2ljX2lzdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT46OnN3YXAoX19yaHMpOworICAgIF9fc2JfLnN3YXAoX19yaHMuX19zYl8pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3N3YXAoYmFzaWNfaXN0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3gsCisgICAgIGJhc2ljX2lzdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX195KQoreworICAgIF9feC5zd2FwKF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPioKK2Jhc2ljX2lzdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmRidWYoKSBjb25zdAoreworICAgIHJldHVybiBjb25zdF9jYXN0PGJhc2ljX3N0cmluZ2J1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlLCBhbGxvY2F0b3JfdHlwZT4qPigmX19zYl8pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK2Jhc2ljX2lzdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c3RyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gX19zYl8uc3RyKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkIGJhc2ljX2lzdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c3RyKGNvbnN0IHN0cmluZ190eXBlJiBfX3MpCit7CisgICAgX19zYl8uc3RyKF9fcyk7Cit9CisKKy8vIGJhc2ljX29zdHJpbmdzdHJlYW0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGJhc2ljX29zdHJpbmdzdHJlYW0KKyAgICA6IHB1YmxpYyBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgaW50X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cG9zX3R5cGUgcG9zX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgb2ZmX3R5cGU7CisgICAgdHlwZWRlZiBfQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyX3R5cGUsIHRyYWl0c190eXBlLCBhbGxvY2F0b3JfdHlwZT4gc3RyaW5nX3R5cGU7CisKK3ByaXZhdGU6CisgICAgYmFzaWNfc3RyaW5nYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGUsIGFsbG9jYXRvcl90eXBlPiBfX3NiXzsKKworcHVibGljOgorICAgIC8vIDI3LjguMi4xIENvbnN0cnVjdG9yczoKKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IGJhc2ljX29zdHJpbmdzdHJlYW0oaW9zX2Jhc2U6Om9wZW5tb2RlIF9fd2NoID0gaW9zX2Jhc2U6Om91dCk7CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBiYXNpY19vc3RyaW5nc3RyZWFtKGNvbnN0IHN0cmluZ190eXBlJiBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX193Y2ggPSBpb3NfYmFzZTo6b3V0KTsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19vc3RyaW5nc3RyZWFtKGJhc2ljX29zdHJpbmdzdHJlYW0mJiBfX3Jocyk7CisKKyAgICAvLyAyNy44LjIuMiBBc3NpZ24gYW5kIHN3YXA6CisgICAgYmFzaWNfb3N0cmluZ3N0cmVhbSYgb3BlcmF0b3I9KGJhc2ljX29zdHJpbmdzdHJlYW0mJiBfX3Jocyk7CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKGJhc2ljX29zdHJpbmdzdHJlYW0mIF9fcmhzKTsKKworICAgIC8vIDI3LjguMi4zIE1lbWJlcnM6CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmdidWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZSwgYWxsb2NhdG9yX3R5cGU+KiByZGJ1ZigpIGNvbnN0OworICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RyaW5nX3R5cGUgc3RyKCkgY29uc3Q7CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN0cihjb25zdCBzdHJpbmdfdHlwZSYgX19zKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19vc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX29zdHJpbmdzdHJlYW0oaW9zX2Jhc2U6Om9wZW5tb2RlIF9fd2NoKQorICAgIDogYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KCZfX3NiXyksCisgICAgICBfX3NiXyhfX3djaCB8IGlvc19iYXNlOjpvdXQpCit7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19vc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX29zdHJpbmdzdHJlYW0oY29uc3Qgc3RyaW5nX3R5cGUmIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX193Y2gpCisgICAgOiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4oJl9fc2JfKSwKKyAgICAgIF9fc2JfKF9fcywgX193Y2ggfCBpb3NfYmFzZTo6b3V0KQoreworfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfb3N0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpiYXNpY19vc3RyaW5nc3RyZWFtKGJhc2ljX29zdHJpbmdzdHJlYW0mJiBfX3JocykKKyAgICA6IGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPihfVlNURDo6bW92ZShfX3JocykpLAorICAgICAgX19zYl8oX1ZTVEQ6Om1vdmUoX19yaHMuX19zYl8pKQoreworICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c2V0X3JkYnVmKCZfX3NiXyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19vc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mCitiYXNpY19vc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Om9wZXJhdG9yPShiYXNpY19vc3RyaW5nc3RyZWFtJiYgX19yaHMpCit7CisgICAgYmFzaWNfb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPjo6b3BlcmF0b3I9KF9WU1REOjptb3ZlKF9fcmhzKSk7CisgICAgX19zYl8gPSBfVlNURDo6bW92ZShfX3Jocy5fX3NiXyk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAorYmFzaWNfb3N0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojpzd2FwKGJhc2ljX29zdHJpbmdzdHJlYW0mIF9fcmhzKQoreworICAgIGJhc2ljX29zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT46OnN3YXAoX19yaHMpOworICAgIF9fc2JfLnN3YXAoX19yaHMuX19zYl8pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3N3YXAoYmFzaWNfb3N0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3gsCisgICAgIGJhc2ljX29zdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX195KQoreworICAgIF9feC5zd2FwKF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPioKK2Jhc2ljX29zdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmRidWYoKSBjb25zdAoreworICAgIHJldHVybiBjb25zdF9jYXN0PGJhc2ljX3N0cmluZ2J1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlLCBhbGxvY2F0b3JfdHlwZT4qPigmX19zYl8pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK2Jhc2ljX29zdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c3RyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gX19zYl8uc3RyKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitiYXNpY19vc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnN0cihjb25zdCBzdHJpbmdfdHlwZSYgX19zKQoreworICAgIF9fc2JfLnN0cihfX3MpOworfQorCisvLyBiYXNpY19zdHJpbmdzdHJlYW0KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGJhc2ljX3N0cmluZ3N0cmVhbQorICAgIDogcHVibGljIGJhc2ljX2lvc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgaW50X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cG9zX3R5cGUgcG9zX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgb2ZmX3R5cGU7CisgICAgdHlwZWRlZiBfQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyX3R5cGUsIHRyYWl0c190eXBlLCBhbGxvY2F0b3JfdHlwZT4gc3RyaW5nX3R5cGU7CisKK3ByaXZhdGU6CisgICAgYmFzaWNfc3RyaW5nYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGUsIGFsbG9jYXRvcl90eXBlPiBfX3NiXzsKKworcHVibGljOgorICAgIC8vIDI3LjguMi4xIENvbnN0cnVjdG9yczoKKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IGJhc2ljX3N0cmluZ3N0cmVhbShpb3NfYmFzZTo6b3Blbm1vZGUgX193Y2ggPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IGJhc2ljX3N0cmluZ3N0cmVhbShjb25zdCBzdHJpbmdfdHlwZSYgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX193Y2ggPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmdzdHJlYW0oYmFzaWNfc3RyaW5nc3RyZWFtJiYgX19yaHMpOworCisgICAgLy8gMjcuOC4yLjIgQXNzaWduIGFuZCBzd2FwOgorICAgIGJhc2ljX3N0cmluZ3N0cmVhbSYgb3BlcmF0b3I9KGJhc2ljX3N0cmluZ3N0cmVhbSYmIF9fcmhzKTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAoYmFzaWNfc3RyaW5nc3RyZWFtJiBfX3Jocyk7CisKKyAgICAvLyAyNy44LjIuMyBNZW1iZXJzOgorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfc3RyaW5nYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGUsIGFsbG9jYXRvcl90eXBlPiogcmRidWYoKSBjb25zdDsKKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0cmluZ190eXBlIHN0cigpIGNvbnN0OworICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzdHIoY29uc3Qgc3RyaW5nX3R5cGUmIF9fcyk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZ3N0cmVhbShpb3NfYmFzZTo6b3Blbm1vZGUgX193Y2gpCisgICAgOiBiYXNpY19pb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KCZfX3NiXyksCisgICAgICBfX3NiXyhfX3djaCkKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpiYXNpY19zdHJpbmdzdHJlYW0oY29uc3Qgc3RyaW5nX3R5cGUmIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fd2NoKQorICAgIDogYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPigmX19zYl8pLAorICAgICAgX19zYl8oX19zLCBfX3djaCkKK3sKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpiYXNpY19zdHJpbmdzdHJlYW0oYmFzaWNfc3RyaW5nc3RyZWFtJiYgX19yaHMpCisgICAgOiBiYXNpY19pb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KF9WU1REOjptb3ZlKF9fcmhzKSksCisgICAgICBfX3NiXyhfVlNURDo6bW92ZShfX3Jocy5fX3NiXykpCit7CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZXRfcmRidWYoJl9fc2JfKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Om9wZXJhdG9yPShiYXNpY19zdHJpbmdzdHJlYW0mJiBfX3JocykKK3sKKyAgICBiYXNpY19pb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPjo6b3BlcmF0b3I9KF9WU1REOjptb3ZlKF9fcmhzKSk7CisgICAgX19zYl8gPSBfVlNURDo6bW92ZShfX3Jocy5fX3NiXyk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAorYmFzaWNfc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnN3YXAoYmFzaWNfc3RyaW5nc3RyZWFtJiBfX3JocykKK3sKKyAgICBiYXNpY19pb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPjo6c3dhcChfX3Jocyk7CisgICAgX19zYl8uc3dhcChfX3Jocy5fX3NiXyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcChiYXNpY19zdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX194LAorICAgICBiYXNpY19zdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX195KQoreworICAgIF9feC5zd2FwKF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPioKK2Jhc2ljX3N0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpyZGJ1ZigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8YmFzaWNfc3RyaW5nYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGUsIGFsbG9jYXRvcl90eXBlPio+KCZfX3NiXyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnN0cigpIGNvbnN0Cit7CisgICAgcmV0dXJuIF9fc2JfLnN0cigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAorYmFzaWNfc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnN0cihjb25zdCBzdHJpbmdfdHlwZSYgX19zKQoreworICAgIF9fc2JfLnN0cihfX3MpOworfQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKK19MSUJDUFBfUE9QX01BQ1JPUworCisjZW5kaWYgIC8vIF9MSUJDUFBfU1NUUkVBTQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N0YWNrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N0YWNrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiODFhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3RhY2sKQEAgLTAsMCArMSwzMDAgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RhY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfU1RBQ0sKKyNkZWZpbmUgX0xJQkNQUF9TVEFDSworCisvKgorICAgIHN0YWNrIHN5bm9wc2lzCisKK25hbWVzcGFjZSBzdGQKK3sKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENvbnRhaW5lciA9IGRlcXVlPFQ+PgorY2xhc3Mgc3RhY2sKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIENvbnRhaW5lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb250YWluZXJfdHlwZTo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb250YWluZXJfdHlwZTo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbnRhaW5lcl90eXBlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29udGFpbmVyX3R5cGU6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisKK3Byb3RlY3RlZDoKKyAgICBjb250YWluZXJfdHlwZSBjOworCitwdWJsaWM6CisgICAgc3RhY2soKSA9IGRlZmF1bHQ7CisgICAgfnN0YWNrKCkgPSBkZWZhdWx0OworCisgICAgc3RhY2soY29uc3Qgc3RhY2smIHEpID0gZGVmYXVsdDsKKyAgICBzdGFjayhzdGFjayYmIHEpID0gZGVmYXVsdDsKKworICAgIHN0YWNrJiBvcGVyYXRvcj0oY29uc3Qgc3RhY2smIHEpID0gZGVmYXVsdDsKKyAgICBzdGFjayYgb3BlcmF0b3I9KHN0YWNrJiYgcSkgPSBkZWZhdWx0OworCisgICAgZXhwbGljaXQgc3RhY2soY29uc3QgY29udGFpbmVyX3R5cGUmIGMpOworICAgIGV4cGxpY2l0IHN0YWNrKGNvbnRhaW5lcl90eXBlJiYgYyk7CisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jPiBleHBsaWNpdCBzdGFjayhjb25zdCBBbGxvYyYgYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jPiBzdGFjayhjb25zdCBjb250YWluZXJfdHlwZSYgYywgY29uc3QgQWxsb2MmIGEpOworICAgIHRlbXBsYXRlIDxjbGFzcyBBbGxvYz4gc3RhY2soY29udGFpbmVyX3R5cGUmJiBjLCBjb25zdCBBbGxvYyYgYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jPiBzdGFjayhjb25zdCBzdGFjayYgYywgY29uc3QgQWxsb2MmIGEpOworICAgIHRlbXBsYXRlIDxjbGFzcyBBbGxvYz4gc3RhY2soc3RhY2smJiBjLCBjb25zdCBBbGxvYyYgYSk7CisKKyAgICBib29sIGVtcHR5KCkgY29uc3Q7CisgICAgc2l6ZV90eXBlIHNpemUoKSBjb25zdDsKKyAgICByZWZlcmVuY2UgdG9wKCk7CisgICAgY29uc3RfcmVmZXJlbmNlIHRvcCgpIGNvbnN0OworCisgICAgdm9pZCBwdXNoKGNvbnN0IHZhbHVlX3R5cGUmIHgpOworICAgIHZvaWQgcHVzaCh2YWx1ZV90eXBlJiYgeCk7CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+IHJlZmVyZW5jZSBlbXBsYWNlKEFyZ3MmJi4uLiBhcmdzKTsgLy8gcmVmZXJlbmNlIGluIEMrKzE3CisgICAgdm9pZCBwb3AoKTsKKworICAgIHZvaWQgc3dhcChzdGFjayYgYykgbm9leGNlcHQoaXNfbm90aHJvd19zd2FwcGFibGVfdjxDb250YWluZXI+KQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENvbnRhaW5lcj4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHN0YWNrPFQsIENvbnRhaW5lcj4mIHgsIGNvbnN0IHN0YWNrPFQsIENvbnRhaW5lcj4mIHkpOwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENvbnRhaW5lcj4KKyAgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IHN0YWNrPFQsIENvbnRhaW5lcj4mIHgsIGNvbnN0IHN0YWNrPFQsIENvbnRhaW5lcj4mIHkpOwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENvbnRhaW5lcj4KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHN0YWNrPFQsIENvbnRhaW5lcj4mIHgsIGNvbnN0IHN0YWNrPFQsIENvbnRhaW5lcj4mIHkpOwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENvbnRhaW5lcj4KKyAgYm9vbCBvcGVyYXRvcj4gKGNvbnN0IHN0YWNrPFQsIENvbnRhaW5lcj4mIHgsIGNvbnN0IHN0YWNrPFQsIENvbnRhaW5lcj4mIHkpOwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENvbnRhaW5lcj4KKyAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IHN0YWNrPFQsIENvbnRhaW5lcj4mIHgsIGNvbnN0IHN0YWNrPFQsIENvbnRhaW5lcj4mIHkpOwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENvbnRhaW5lcj4KKyAgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IHN0YWNrPFQsIENvbnRhaW5lcj4mIHgsIGNvbnN0IHN0YWNrPFQsIENvbnRhaW5lcj4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ29udGFpbmVyPgorICB2b2lkIHN3YXAoc3RhY2s8VCwgQ29udGFpbmVyPiYgeCwgc3RhY2s8VCwgQ29udGFpbmVyPiYgeSkKKyAgbm9leGNlcHQobm9leGNlcHQoeC5zd2FwKHkpKSk7CisKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8ZGVxdWU+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnRhaW5lciA9IGRlcXVlPF9UcD4gPiBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBzdGFjazsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnRhaW5lcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3Qgc3RhY2s8X1RwLCBfQ29udGFpbmVyPiYgX194LCBjb25zdCBzdGFjazxfVHAsIF9Db250YWluZXI+JiBfX3kpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29udGFpbmVyPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8IChjb25zdCBzdGFjazxfVHAsIF9Db250YWluZXI+JiBfX3gsIGNvbnN0IHN0YWNrPF9UcCwgX0NvbnRhaW5lcj4mIF9feSk7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db250YWluZXIgLyo9IGRlcXVlPF9UcD4qLz4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHN0YWNrCit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29udGFpbmVyX3R5cGU6OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29udGFpbmVyX3R5cGU6OnJlZmVyZW5jZSAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb250YWluZXJfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbnRhaW5lcl90eXBlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgIHN0YXRpY19hc3NlcnQoKGlzX3NhbWU8X1RwLCB2YWx1ZV90eXBlPjo6dmFsdWUpLCAiIiApOworICAgIAorcHJvdGVjdGVkOgorICAgIGNvbnRhaW5lcl90eXBlIGM7CisKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhY2soKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGNvbnRhaW5lcl90eXBlPjo6dmFsdWUpCisgICAgICAgIDogYygpIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhY2soY29uc3Qgc3RhY2smIF9fcSkgOiBjKF9fcS5jKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YWNrJiBvcGVyYXRvcj0oY29uc3Qgc3RhY2smIF9fcSkge2MgPSBfX3EuYzsgcmV0dXJuICp0aGlzO30KKworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGFjayhzdGFjayYmIF9fcSkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxjb250YWluZXJfdHlwZT46OnZhbHVlKQorICAgICAgICA6IGMoX1ZTVEQ6Om1vdmUoX19xLmMpKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YWNrJiBvcGVyYXRvcj0oc3RhY2smJiBfX3EpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8Y29udGFpbmVyX3R5cGU+Ojp2YWx1ZSkKKyAgICAgICAge2MgPSBfVlNURDo6bW92ZShfX3EuYyk7IHJldHVybiAqdGhpczt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgc3RhY2soY29udGFpbmVyX3R5cGUmJiBfX2MpIDogYyhfVlNURDo6bW92ZShfX2MpKSB7fQorI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBzdGFjayhjb25zdCBjb250YWluZXJfdHlwZSYgX19jKSA6IGMoX19jKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBleHBsaWNpdCBzdGFjayhjb25zdCBfQWxsb2MmIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPHVzZXNfYWxsb2NhdG9yPGNvbnRhaW5lcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FsbG9jPjo6dmFsdWU+Ojp0eXBlKiA9IDApCisgICAgICAgICAgICA6IGMoX19hKSB7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgc3RhY2soY29uc3QgY29udGFpbmVyX3R5cGUmIF9fYywgY29uc3QgX0FsbG9jJiBfX2EsCisgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjx1c2VzX2FsbG9jYXRvcjxjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvYz46OnZhbHVlPjo6dHlwZSogPSAwKQorICAgICAgICAgICAgOiBjKF9fYywgX19hKSB7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgc3RhY2soY29uc3Qgc3RhY2smIF9fcywgY29uc3QgX0FsbG9jJiBfX2EsCisgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjx1c2VzX2FsbG9jYXRvcjxjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvYz46OnZhbHVlPjo6dHlwZSogPSAwKQorICAgICAgICAgICAgOiBjKF9fcy5jLCBfX2EpIHt9CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgc3RhY2soY29udGFpbmVyX3R5cGUmJiBfX2MsIGNvbnN0IF9BbGxvYyYgX19hLAorICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8dXNlc19hbGxvY2F0b3I8Y29udGFpbmVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQWxsb2M+Ojp2YWx1ZT46OnR5cGUqID0gMCkKKyAgICAgICAgICAgIDogYyhfVlNURDo6bW92ZShfX2MpLCBfX2EpIHt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBzdGFjayhzdGFjayYmIF9fcywgY29uc3QgX0FsbG9jJiBfX2EsCisgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjx1c2VzX2FsbG9jYXRvcjxjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvYz46OnZhbHVlPjo6dHlwZSogPSAwKQorICAgICAgICAgICAgOiBjKF9WU1REOjptb3ZlKF9fcy5jKSwgX19hKSB7fQorI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIF9MSUJDUFBfTk9ESVNDQVJEX0FGVEVSX0NYWDE3IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIGVtcHR5KCkgICAgIGNvbnN0ICAgICAge3JldHVybiBjLmVtcHR5KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0ICAgICAge3JldHVybiBjLnNpemUoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlZmVyZW5jZSB0b3AoKSAgICAgICAgICAgICB7cmV0dXJuIGMuYmFjaygpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmVmZXJlbmNlIHRvcCgpIGNvbnN0IHtyZXR1cm4gYy5iYWNrKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcHVzaChjb25zdCB2YWx1ZV90eXBlJiBfX3YpIHtjLnB1c2hfYmFjayhfX3YpO30KKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcHVzaCh2YWx1ZV90eXBlJiYgX192KSB7Yy5wdXNoX2JhY2soX1ZTVEQ6Om1vdmUoX192KSk7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKyAgICAgICAgZGVjbHR5cGUoYXV0bykgZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKyAgICAgICAgeyByZXR1cm4gYy5lbXBsYWNlX2JhY2soX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pO30KKyNlbHNlCisgICAgICAgIHZvaWQgICAgICBlbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICB7ICAgICAgICBjLmVtcGxhY2VfYmFjayhfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7fQorI2VuZGlmCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcG9wKCkge2MucG9wX2JhY2soKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKHN0YWNrJiBfX3MpCisgICAgICAgIF9OT0VYQ0VQVF8oX19pc19ub3Rocm93X3N3YXBwYWJsZTxjb250YWluZXJfdHlwZT46OnZhbHVlKQorICAgIHsKKyAgICAgICAgdXNpbmcgX1ZTVEQ6OnN3YXA7CisgICAgICAgIHN3YXAoYywgX19zLmMpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgX0MxPgorICAgIGZyaWVuZAorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHN0YWNrPFQxLCBfQzE+JiBfX3gsIGNvbnN0IHN0YWNrPFQxLCBfQzE+JiBfX3kpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBfQzE+CisgICAgZnJpZW5kCisgICAgYm9vbAorICAgIG9wZXJhdG9yPCAoY29uc3Qgc3RhY2s8VDEsIF9DMT4mIF9feCwgY29uc3Qgc3RhY2s8VDEsIF9DMT4mIF9feSk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29udGFpbmVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3Qgc3RhY2s8X1RwLCBfQ29udGFpbmVyPiYgX194LCBjb25zdCBzdGFjazxfVHAsIF9Db250YWluZXI+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5jID09IF9feS5jOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29udGFpbmVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPCAoY29uc3Qgc3RhY2s8X1RwLCBfQ29udGFpbmVyPiYgX194LCBjb25zdCBzdGFjazxfVHAsIF9Db250YWluZXI+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5jIDwgX195LmM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBzdGFjazxfVHAsIF9Db250YWluZXI+JiBfX3gsIGNvbnN0IHN0YWNrPF9UcCwgX0NvbnRhaW5lcj4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPT0gX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnRhaW5lcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj4gKGNvbnN0IHN0YWNrPF9UcCwgX0NvbnRhaW5lcj4mIF9feCwgY29uc3Qgc3RhY2s8X1RwLCBfQ29udGFpbmVyPiYgX195KQoreworICAgIHJldHVybiBfX3kgPCBfX3g7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db250YWluZXI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+PShjb25zdCBzdGFjazxfVHAsIF9Db250YWluZXI+JiBfX3gsIGNvbnN0IHN0YWNrPF9UcCwgX0NvbnRhaW5lcj4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPCBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ29udGFpbmVyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPD0oY29uc3Qgc3RhY2s8X1RwLCBfQ29udGFpbmVyPiYgX194LCBjb25zdCBzdGFjazxfVHAsIF9Db250YWluZXI+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX195IDwgX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbnRhaW5lcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgX19pc19zd2FwcGFibGU8X0NvbnRhaW5lcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3N3YXAoc3RhY2s8X1RwLCBfQ29udGFpbmVyPiYgX194LCBzdGFjazxfVHAsIF9Db250YWluZXI+JiBfX3kpCisgICAgX05PRVhDRVBUXyhfTk9FWENFUFRfKF9feC5zd2FwKF9feSkpKQoreworICAgIF9feC5zd2FwKF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db250YWluZXIsIGNsYXNzIF9BbGxvYz4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB1c2VzX2FsbG9jYXRvcjxzdGFjazxfVHAsIF9Db250YWluZXI+LCBfQWxsb2M+CisgICAgOiBwdWJsaWMgdXNlc19hbGxvY2F0b3I8X0NvbnRhaW5lciwgX0FsbG9jPgoreworfTsKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCisjZW5kaWYgIC8vIF9MSUJDUFBfU1RBQ0sKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdGRib29sLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3RkYm9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YTEyN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3RkYm9vbC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGRib29sLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBfTElCQ1BQX1NUREJPT0xfSAorI2RlZmluZSBfTElCQ1BQX1NUREJPT0xfSAorCisKKy8qCisgICAgc3RkYm9vbC5oIHN5bm9wc2lzCisKK01hY3JvczoKKworICAgIF9fYm9vbF90cnVlX2ZhbHNlX2FyZV9kZWZpbmVkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKKyNpbmNsdWRlX25leHQgPHN0ZGJvb2wuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCisjdW5kZWYgYm9vbAorI3VuZGVmIHRydWUKKyN1bmRlZiBmYWxzZQorI3VuZGVmIF9fYm9vbF90cnVlX2ZhbHNlX2FyZV9kZWZpbmVkCisjZGVmaW5lIF9fYm9vbF90cnVlX2ZhbHNlX2FyZV9kZWZpbmVkIDEKKyNlbmRpZgorCisjZW5kaWYgIC8vIF9MSUJDUFBfU1REQk9PTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3RkZGVmLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3RkZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmODU1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdGRkZWYuaApAQCAtMCwwICsxLDYzIEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RkZGVmLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmIGRlZmluZWQoX19uZWVkX3B0cmRpZmZfdCkgfHwgZGVmaW5lZChfX25lZWRfc2l6ZV90KSB8fCBcCisgICAgZGVmaW5lZChfX25lZWRfd2NoYXJfdCkgfHwgZGVmaW5lZChfX25lZWRfTlVMTCkgfHwgZGVmaW5lZChfX25lZWRfd2ludF90KQorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2luY2x1ZGVfbmV4dCA8c3RkZGVmLmg+CisKKyNlbGlmICFkZWZpbmVkKF9MSUJDUFBfU1REREVGX0gpCisjZGVmaW5lIF9MSUJDUFBfU1REREVGX0gKKworLyoKKyAgICBzdGRkZWYuaCBzeW5vcHNpcworCitNYWNyb3M6CisKKyAgICBvZmZzZXRvZih0eXBlLG1lbWJlci1kZXNpZ25hdG9yKQorICAgIE5VTEwKKworVHlwZXM6CisKKyAgICBwdHJkaWZmX3QKKyAgICBzaXplX3QKKyAgICBtYXhfYWxpZ25fdAorICAgIG51bGxwdHJfdAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCisjaW5jbHVkZV9uZXh0IDxzdGRkZWYuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCisKK2V4dGVybiAiQysrIiB7CisjaW5jbHVkZSA8X19udWxscHRyPgordXNpbmcgc3RkOjpudWxscHRyX3Q7Cit9CisKKy8vIFJlLXVzZSB0aGUgY29tcGlsZXIncyA8c3RkZGVmLmg+IG1heF9hbGlnbl90IHdoZXJlIHBvc3NpYmxlLgorI2lmICFkZWZpbmVkKF9fQ0xBTkdfTUFYX0FMSUdOX1RfREVGSU5FRCkgJiYgIWRlZmluZWQoX0dDQ19NQVhfQUxJR05fVCkgJiYgXAorICAgICFkZWZpbmVkKF9fREVGSU5FRF9tYXhfYWxpZ25fdCkKK3R5cGVkZWYgbG9uZyBkb3VibGUgbWF4X2FsaWduX3Q7CisjZW5kaWYKKworI2VuZGlmCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9TVERERUZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N0ZGV4Y2VwdCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdGRleGNlcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVhOTZjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdGRleGNlcHQKQEAgLTAsMCArMSwyNzggQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGRleGNlcHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfU1RERVhDRVBUCisjZGVmaW5lIF9MSUJDUFBfU1RERVhDRVBUCisKKy8qCisgICAgc3RkZXhjZXB0IHN5bm9wc2lzCisKK25hbWVzcGFjZSBzdGQKK3sKKworY2xhc3MgbG9naWNfZXJyb3I7CisgICAgY2xhc3MgZG9tYWluX2Vycm9yOworICAgIGNsYXNzIGludmFsaWRfYXJndW1lbnQ7CisgICAgY2xhc3MgbGVuZ3RoX2Vycm9yOworICAgIGNsYXNzIG91dF9vZl9yYW5nZTsKK2NsYXNzIHJ1bnRpbWVfZXJyb3I7CisgICAgY2xhc3MgcmFuZ2VfZXJyb3I7CisgICAgY2xhc3Mgb3ZlcmZsb3dfZXJyb3I7CisgICAgY2xhc3MgdW5kZXJmbG93X2Vycm9yOworCitmb3IgZWFjaCBjbGFzcyB4eHhfZXJyb3I6CisKK2NsYXNzIHh4eF9lcnJvciA6IHB1YmxpYyBleGNlcHRpb24gLy8gYXQgbGVhc3QgaW5kaXJlY3RseQoreworcHVibGljOgorICAgIGV4cGxpY2l0IHh4eF9lcnJvcihjb25zdCBzdHJpbmcmIHdoYXRfYXJnKTsKKyAgICBleHBsaWNpdCB4eHhfZXJyb3IoY29uc3QgY2hhciogICB3aGF0X2FyZyk7CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBub2V4Y2VwdCAvLyByZXR1cm5zIHdoYXRfYXJnCit9OworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNpbmNsdWRlIDxpb3Nmd2Q+ICAvLyBmb3Igc3RyaW5nIGZvcndhcmQgZGVjbAorI2lmZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworI2luY2x1ZGUgPGNzdGRsaWI+CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCitjbGFzcyBfTElCQ1BQX0hJRERFTiBfX2xpYmNwcF9yZWZzdHJpbmcKK3sKKyAgICBjb25zdCBjaGFyKiBfX2ltcF87CisKKyAgICBib29sIF9fdXNlc19yZWZjb3VudCgpIGNvbnN0OworcHVibGljOgorICAgIGV4cGxpY2l0IF9fbGliY3BwX3JlZnN0cmluZyhjb25zdCBjaGFyKiBfX21zZyk7CisgICAgX19saWJjcHBfcmVmc3RyaW5nKGNvbnN0IF9fbGliY3BwX3JlZnN0cmluZyYgX19zKSBfTk9FWENFUFQ7CisgICAgX19saWJjcHBfcmVmc3RyaW5nJiBvcGVyYXRvcj0oY29uc3QgX19saWJjcHBfcmVmc3RyaW5nJiBfX3MpIF9OT0VYQ0VQVDsKKyAgICB+X19saWJjcHBfcmVmc3RyaW5nKCk7CisKKyAgICBjb25zdCBjaGFyKiBjX3N0cigpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9faW1wXzt9Cit9OworCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKK25hbWVzcGFjZSBzdGQgIC8vIHB1cnBvc2VmdWxseSBub3QgdXNpbmcgdmVyc2lvbmluZyBuYW1lc3BhY2UKK3sKKworY2xhc3MgX0xJQkNQUF9FWENFUFRJT05fQUJJIGxvZ2ljX2Vycm9yCisgICAgOiBwdWJsaWMgZXhjZXB0aW9uCit7Citwcml2YXRlOgorICAgIF9WU1REOjpfX2xpYmNwcF9yZWZzdHJpbmcgX19pbXBfOworcHVibGljOgorICAgIGV4cGxpY2l0IGxvZ2ljX2Vycm9yKGNvbnN0IHN0cmluZyYpOworICAgIGV4cGxpY2l0IGxvZ2ljX2Vycm9yKGNvbnN0IGNoYXIqKTsKKworICAgIGxvZ2ljX2Vycm9yKGNvbnN0IGxvZ2ljX2Vycm9yJikgX05PRVhDRVBUOworICAgIGxvZ2ljX2Vycm9yJiBvcGVyYXRvcj0oY29uc3QgbG9naWNfZXJyb3ImKSBfTk9FWENFUFQ7CisKKyAgICB2aXJ0dWFsIH5sb2dpY19lcnJvcigpIF9OT0VYQ0VQVDsKKworICAgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9OT0VYQ0VQVDsKK307CisKK2NsYXNzIF9MSUJDUFBfRVhDRVBUSU9OX0FCSSBydW50aW1lX2Vycm9yCisgICAgOiBwdWJsaWMgZXhjZXB0aW9uCit7Citwcml2YXRlOgorICAgIF9WU1REOjpfX2xpYmNwcF9yZWZzdHJpbmcgX19pbXBfOworcHVibGljOgorICAgIGV4cGxpY2l0IHJ1bnRpbWVfZXJyb3IoY29uc3Qgc3RyaW5nJik7CisgICAgZXhwbGljaXQgcnVudGltZV9lcnJvcihjb25zdCBjaGFyKik7CisKKyAgICBydW50aW1lX2Vycm9yKGNvbnN0IHJ1bnRpbWVfZXJyb3ImKSBfTk9FWENFUFQ7CisgICAgcnVudGltZV9lcnJvciYgb3BlcmF0b3I9KGNvbnN0IHJ1bnRpbWVfZXJyb3ImKSBfTk9FWENFUFQ7CisKKyAgICB2aXJ0dWFsIH5ydW50aW1lX2Vycm9yKCkgX05PRVhDRVBUOworCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgX05PRVhDRVBUOworfTsKKworY2xhc3MgX0xJQkNQUF9FWENFUFRJT05fQUJJIGRvbWFpbl9lcnJvcgorICAgIDogcHVibGljIGxvZ2ljX2Vycm9yCit7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBleHBsaWNpdCBkb21haW5fZXJyb3IoY29uc3Qgc3RyaW5nJiBfX3MpIDogbG9naWNfZXJyb3IoX19zKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZXhwbGljaXQgZG9tYWluX2Vycm9yKGNvbnN0IGNoYXIqIF9fcykgICA6IGxvZ2ljX2Vycm9yKF9fcykge30KKworICAgIHZpcnR1YWwgfmRvbWFpbl9lcnJvcigpIF9OT0VYQ0VQVDsKK307CisKK2NsYXNzIF9MSUJDUFBfRVhDRVBUSU9OX0FCSSBpbnZhbGlkX2FyZ3VtZW50CisgICAgOiBwdWJsaWMgbG9naWNfZXJyb3IKK3sKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IGludmFsaWRfYXJndW1lbnQoY29uc3Qgc3RyaW5nJiBfX3MpIDogbG9naWNfZXJyb3IoX19zKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZXhwbGljaXQgaW52YWxpZF9hcmd1bWVudChjb25zdCBjaGFyKiBfX3MpICAgOiBsb2dpY19lcnJvcihfX3MpIHt9CisKKyAgICB2aXJ0dWFsIH5pbnZhbGlkX2FyZ3VtZW50KCkgX05PRVhDRVBUOworfTsKKworY2xhc3MgX0xJQkNQUF9FWENFUFRJT05fQUJJIGxlbmd0aF9lcnJvcgorICAgIDogcHVibGljIGxvZ2ljX2Vycm9yCit7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBleHBsaWNpdCBsZW5ndGhfZXJyb3IoY29uc3Qgc3RyaW5nJiBfX3MpIDogbG9naWNfZXJyb3IoX19zKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZXhwbGljaXQgbGVuZ3RoX2Vycm9yKGNvbnN0IGNoYXIqIF9fcykgICA6IGxvZ2ljX2Vycm9yKF9fcykge30KKworICAgIHZpcnR1YWwgfmxlbmd0aF9lcnJvcigpIF9OT0VYQ0VQVDsKK307CisKK2NsYXNzIF9MSUJDUFBfRVhDRVBUSU9OX0FCSSBvdXRfb2ZfcmFuZ2UKKyAgICA6IHB1YmxpYyBsb2dpY19lcnJvcgoreworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZXhwbGljaXQgb3V0X29mX3JhbmdlKGNvbnN0IHN0cmluZyYgX19zKSA6IGxvZ2ljX2Vycm9yKF9fcykge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IG91dF9vZl9yYW5nZShjb25zdCBjaGFyKiBfX3MpICAgOiBsb2dpY19lcnJvcihfX3MpIHt9CisKKyAgICB2aXJ0dWFsIH5vdXRfb2ZfcmFuZ2UoKSBfTk9FWENFUFQ7Cit9OworCitjbGFzcyBfTElCQ1BQX0VYQ0VQVElPTl9BQkkgcmFuZ2VfZXJyb3IKKyAgICA6IHB1YmxpYyBydW50aW1lX2Vycm9yCit7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBleHBsaWNpdCByYW5nZV9lcnJvcihjb25zdCBzdHJpbmcmIF9fcykgOiBydW50aW1lX2Vycm9yKF9fcykge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IHJhbmdlX2Vycm9yKGNvbnN0IGNoYXIqIF9fcykgICA6IHJ1bnRpbWVfZXJyb3IoX19zKSB7fQorCisgICAgdmlydHVhbCB+cmFuZ2VfZXJyb3IoKSBfTk9FWENFUFQ7Cit9OworCitjbGFzcyBfTElCQ1BQX0VYQ0VQVElPTl9BQkkgb3ZlcmZsb3dfZXJyb3IKKyAgICA6IHB1YmxpYyBydW50aW1lX2Vycm9yCit7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBleHBsaWNpdCBvdmVyZmxvd19lcnJvcihjb25zdCBzdHJpbmcmIF9fcykgOiBydW50aW1lX2Vycm9yKF9fcykge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IG92ZXJmbG93X2Vycm9yKGNvbnN0IGNoYXIqIF9fcykgICA6IHJ1bnRpbWVfZXJyb3IoX19zKSB7fQorCisgICAgdmlydHVhbCB+b3ZlcmZsb3dfZXJyb3IoKSBfTk9FWENFUFQ7Cit9OworCitjbGFzcyBfTElCQ1BQX0VYQ0VQVElPTl9BQkkgdW5kZXJmbG93X2Vycm9yCisgICAgOiBwdWJsaWMgcnVudGltZV9lcnJvcgoreworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZXhwbGljaXQgdW5kZXJmbG93X2Vycm9yKGNvbnN0IHN0cmluZyYgX19zKSA6IHJ1bnRpbWVfZXJyb3IoX19zKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZXhwbGljaXQgdW5kZXJmbG93X2Vycm9yKGNvbnN0IGNoYXIqIF9fcykgICA6IHJ1bnRpbWVfZXJyb3IoX19zKSB7fQorCisgICAgdmlydHVhbCB+dW5kZXJmbG93X2Vycm9yKCkgX05PRVhDRVBUOworfTsKKworfSAgLy8gc3RkCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCisvLyBpbiB0aGUgZHlsaWIKK19MSUJDUFBfTk9SRVRVUk4gX0xJQkNQUF9GVU5DX1ZJUyB2b2lkIF9fdGhyb3dfcnVudGltZV9lcnJvcihjb25zdCBjaGFyKik7CisKK19MSUJDUFBfTk9SRVRVUk4gaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORQordm9pZCBfX3Rocm93X2xvZ2ljX2Vycm9yKGNvbnN0IGNoYXIqX19tc2cpCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRocm93IGxvZ2ljX2Vycm9yKF9fbXNnKTsKKyNlbHNlCisgICAgKCh2b2lkKV9fbXNnKTsKKwkgIF9WU1REOjphYm9ydCgpOworI2VuZGlmCit9CisKK19MSUJDUFBfTk9SRVRVUk4gaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORQordm9pZCBfX3Rocm93X2RvbWFpbl9lcnJvcihjb25zdCBjaGFyKl9fbXNnKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0aHJvdyBkb21haW5fZXJyb3IoX19tc2cpOworI2Vsc2UKKyAgICAoKHZvaWQpX19tc2cpOworCSAgX1ZTVEQ6OmFib3J0KCk7CisjZW5kaWYKK30KKworX0xJQkNQUF9OT1JFVFVSTiBpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCit2b2lkIF9fdGhyb3dfaW52YWxpZF9hcmd1bWVudChjb25zdCBjaGFyKl9fbXNnKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KF9fbXNnKTsKKyNlbHNlCisgICAgKCh2b2lkKV9fbXNnKTsKKwkgIF9WU1REOjphYm9ydCgpOworI2VuZGlmCit9CisKK19MSUJDUFBfTk9SRVRVUk4gaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORQordm9pZCBfX3Rocm93X2xlbmd0aF9lcnJvcihjb25zdCBjaGFyKl9fbXNnKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0aHJvdyBsZW5ndGhfZXJyb3IoX19tc2cpOworI2Vsc2UKKyAgICAoKHZvaWQpX19tc2cpOworCSAgX1ZTVEQ6OmFib3J0KCk7CisjZW5kaWYKK30KKworX0xJQkNQUF9OT1JFVFVSTiBpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCit2b2lkIF9fdGhyb3dfb3V0X29mX3JhbmdlKGNvbnN0IGNoYXIqX19tc2cpCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRocm93IG91dF9vZl9yYW5nZShfX21zZyk7CisjZWxzZQorICAgICgodm9pZClfX21zZyk7CisJICBfVlNURDo6YWJvcnQoKTsKKyNlbmRpZgorfQorCitfTElCQ1BQX05PUkVUVVJOIGlubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUKK3ZvaWQgX190aHJvd19yYW5nZV9lcnJvcihjb25zdCBjaGFyKl9fbXNnKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0aHJvdyByYW5nZV9lcnJvcihfX21zZyk7CisjZWxzZQorICAgICgodm9pZClfX21zZyk7CisJICBfVlNURDo6YWJvcnQoKTsKKyNlbmRpZgorfQorCitfTElCQ1BQX05PUkVUVVJOIGlubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUKK3ZvaWQgX190aHJvd19vdmVyZmxvd19lcnJvcihjb25zdCBjaGFyKl9fbXNnKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0aHJvdyBvdmVyZmxvd19lcnJvcihfX21zZyk7CisjZWxzZQorICAgICgodm9pZClfX21zZyk7CisgICAgX1ZTVEQ6OmFib3J0KCk7CisjZW5kaWYKK30KKworX0xJQkNQUF9OT1JFVFVSTiBpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCit2b2lkIF9fdGhyb3dfdW5kZXJmbG93X2Vycm9yKGNvbnN0IGNoYXIqX19tc2cpCit7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRocm93IHVuZGVyZmxvd19lcnJvcihfX21zZyk7CisjZWxzZQorICAgICgodm9pZClfX21zZyk7CisgICAgX1ZTVEQ6OmFib3J0KCk7CisjZW5kaWYKK30KKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCisjZW5kaWYgIC8vIF9MSUJDUFBfU1RERVhDRVBUCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3RkaW50LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3RkaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY4ZjZjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdGRpbnQuaApAQCAtMCwwICsxLDEyMSBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGRpbnQuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9TVERJTlRfSAorI2RlZmluZSBfTElCQ1BQX1NURElOVF9ICisKKy8qCisgICAgc3RkaW50Lmggc3lub3BzaXMKKworTWFjcm9zOgorCisgICAgSU5UOF9NSU4KKyAgICBJTlQxNl9NSU4KKyAgICBJTlQzMl9NSU4KKyAgICBJTlQ2NF9NSU4KKworICAgIElOVDhfTUFYCisgICAgSU5UMTZfTUFYCisgICAgSU5UMzJfTUFYCisgICAgSU5UNjRfTUFYCisKKyAgICBVSU5UOF9NQVgKKyAgICBVSU5UMTZfTUFYCisgICAgVUlOVDMyX01BWAorICAgIFVJTlQ2NF9NQVgKKworICAgIElOVF9MRUFTVDhfTUlOCisgICAgSU5UX0xFQVNUMTZfTUlOCisgICAgSU5UX0xFQVNUMzJfTUlOCisgICAgSU5UX0xFQVNUNjRfTUlOCisKKyAgICBJTlRfTEVBU1Q4X01BWAorICAgIElOVF9MRUFTVDE2X01BWAorICAgIElOVF9MRUFTVDMyX01BWAorICAgIElOVF9MRUFTVDY0X01BWAorCisgICAgVUlOVF9MRUFTVDhfTUFYCisgICAgVUlOVF9MRUFTVDE2X01BWAorICAgIFVJTlRfTEVBU1QzMl9NQVgKKyAgICBVSU5UX0xFQVNUNjRfTUFYCisKKyAgICBJTlRfRkFTVDhfTUlOCisgICAgSU5UX0ZBU1QxNl9NSU4KKyAgICBJTlRfRkFTVDMyX01JTgorICAgIElOVF9GQVNUNjRfTUlOCisKKyAgICBJTlRfRkFTVDhfTUFYCisgICAgSU5UX0ZBU1QxNl9NQVgKKyAgICBJTlRfRkFTVDMyX01BWAorICAgIElOVF9GQVNUNjRfTUFYCisKKyAgICBVSU5UX0ZBU1Q4X01BWAorICAgIFVJTlRfRkFTVDE2X01BWAorICAgIFVJTlRfRkFTVDMyX01BWAorICAgIFVJTlRfRkFTVDY0X01BWAorCisgICAgSU5UUFRSX01JTgorICAgIElOVFBUUl9NQVgKKyAgICBVSU5UUFRSX01BWAorCisgICAgSU5UTUFYX01JTgorICAgIElOVE1BWF9NQVgKKworICAgIFVJTlRNQVhfTUFYCisKKyAgICBQVFJESUZGX01JTgorICAgIFBUUkRJRkZfTUFYCisKKyAgICBTSUdfQVRPTUlDX01JTgorICAgIFNJR19BVE9NSUNfTUFYCisKKyAgICBTSVpFX01BWAorCisgICAgV0NIQVJfTUlOCisgICAgV0NIQVJfTUFYCisKKyAgICBXSU5UX01JTgorICAgIFdJTlRfTUFYCisKKyAgICBJTlQ4X0ModmFsdWUpCisgICAgSU5UMTZfQyh2YWx1ZSkKKyAgICBJTlQzMl9DKHZhbHVlKQorICAgIElOVDY0X0ModmFsdWUpCisKKyAgICBVSU5UOF9DKHZhbHVlKQorICAgIFVJTlQxNl9DKHZhbHVlKQorICAgIFVJTlQzMl9DKHZhbHVlKQorICAgIFVJTlQ2NF9DKHZhbHVlKQorCisgICAgSU5UTUFYX0ModmFsdWUpCisgICAgVUlOVE1BWF9DKHZhbHVlKQorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCisvKiBDOTkgc3RkbGliIChlLmcuIGdsaWJjIDwgMi4xOCkgZG9lcyBub3QgcHJvdmlkZSBtYWNyb3MgbmVlZGVkCisgICBmb3IgQysrMTEgdW5sZXNzIF9fU1REQ19MSU1JVF9NQUNST1MgYW5kIF9fU1REQ19DT05TVEFOVF9NQUNST1MKKyAgIGFyZSBkZWZpbmVkCisqLworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKF9fU1REQ19MSU1JVF9NQUNST1MpCisjICAgZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyNlbmRpZgorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKF9fU1REQ19DT05TVEFOVF9NQUNST1MpCisjICAgZGVmaW5lIF9fU1REQ19DT05TVEFOVF9NQUNST1MKKyNlbmRpZgorCisjaW5jbHVkZV9uZXh0IDxzdGRpbnQuaD4KKworI2VuZGlmICAvLyBfTElCQ1BQX1NURElOVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3RkaW8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdGRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YTMxNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3RkaW8uaApAQCAtMCwwICsxLDEyMCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGRpby5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZiBkZWZpbmVkKF9fbmVlZF9GSUxFKSB8fCBkZWZpbmVkKF9fbmVlZF9fX0ZJTEUpCisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCisjaW5jbHVkZV9uZXh0IDxzdGRpby5oPgorCisjZWxpZiAhZGVmaW5lZChfTElCQ1BQX1NURElPX0gpCisjZGVmaW5lIF9MSUJDUFBfU1RESU9fSAorCisvKgorICAgIHN0ZGlvLmggc3lub3BzaXMKKworTWFjcm9zOgorCisgICAgQlVGU0laCisgICAgRU9GCisgICAgRklMRU5BTUVfTUFYCisgICAgRk9QRU5fTUFYCisgICAgTF90bXBuYW0KKyAgICBOVUxMCisgICAgU0VFS19DVVIKKyAgICBTRUVLX0VORAorICAgIFNFRUtfU0VUCisgICAgVE1QX01BWAorICAgIF9JT0ZCRgorICAgIF9JT0xCRgorICAgIF9JT05CRgorICAgIHN0ZGVycgorICAgIHN0ZGluCisgICAgc3Rkb3V0CisKK1R5cGVzOgorCitGSUxFCitmcG9zX3QKK3NpemVfdAorCitpbnQgcmVtb3ZlKGNvbnN0IGNoYXIqIGZpbGVuYW1lKTsKK2ludCByZW5hbWUoY29uc3QgY2hhciogb2xkLCBjb25zdCBjaGFyKiBuZXcpOworRklMRSogdG1wZmlsZSh2b2lkKTsKK2NoYXIqIHRtcG5hbShjaGFyKiBzKTsKK2ludCBmY2xvc2UoRklMRSogc3RyZWFtKTsKK2ludCBmZmx1c2goRklMRSogc3RyZWFtKTsKK0ZJTEUqIGZvcGVuKGNvbnN0IGNoYXIqIHJlc3RyaWN0IGZpbGVuYW1lLCBjb25zdCBjaGFyKiByZXN0cmljdCBtb2RlKTsKK0ZJTEUqIGZyZW9wZW4oY29uc3QgY2hhciogcmVzdHJpY3QgZmlsZW5hbWUsIGNvbnN0IGNoYXIgKiByZXN0cmljdCBtb2RlLAorICAgICAgICAgICAgICBGSUxFICogcmVzdHJpY3Qgc3RyZWFtKTsKK3ZvaWQgc2V0YnVmKEZJTEUqIHJlc3RyaWN0IHN0cmVhbSwgY2hhciogcmVzdHJpY3QgYnVmKTsKK2ludCBzZXR2YnVmKEZJTEUqIHJlc3RyaWN0IHN0cmVhbSwgY2hhciogcmVzdHJpY3QgYnVmLCBpbnQgbW9kZSwgc2l6ZV90IHNpemUpOworaW50IGZwcmludGYoRklMRSogcmVzdHJpY3Qgc3RyZWFtLCBjb25zdCBjaGFyKiByZXN0cmljdCBmb3JtYXQsIC4uLik7CitpbnQgZnNjYW5mKEZJTEUqIHJlc3RyaWN0IHN0cmVhbSwgY29uc3QgY2hhciAqIHJlc3RyaWN0IGZvcm1hdCwgLi4uKTsKK2ludCBwcmludGYoY29uc3QgY2hhciogcmVzdHJpY3QgZm9ybWF0LCAuLi4pOworaW50IHNjYW5mKGNvbnN0IGNoYXIqIHJlc3RyaWN0IGZvcm1hdCwgLi4uKTsKK2ludCBzbnByaW50ZihjaGFyKiByZXN0cmljdCBzLCBzaXplX3QgbiwgY29uc3QgY2hhciogcmVzdHJpY3QgZm9ybWF0LCAuLi4pOyAgICAvLyBDOTkKK2ludCBzcHJpbnRmKGNoYXIqIHJlc3RyaWN0IHMsIGNvbnN0IGNoYXIqIHJlc3RyaWN0IGZvcm1hdCwgLi4uKTsKK2ludCBzc2NhbmYoY29uc3QgY2hhciogcmVzdHJpY3QgcywgY29uc3QgY2hhciogcmVzdHJpY3QgZm9ybWF0LCAuLi4pOworaW50IHZmcHJpbnRmKEZJTEUqIHJlc3RyaWN0IHN0cmVhbSwgY29uc3QgY2hhciogcmVzdHJpY3QgZm9ybWF0LCB2YV9saXN0IGFyZyk7CitpbnQgdmZzY2FuZihGSUxFKiByZXN0cmljdCBzdHJlYW0sIGNvbnN0IGNoYXIqIHJlc3RyaWN0IGZvcm1hdCwgdmFfbGlzdCBhcmcpOyAgLy8gQzk5CitpbnQgdnByaW50Zihjb25zdCBjaGFyKiByZXN0cmljdCBmb3JtYXQsIHZhX2xpc3QgYXJnKTsKK2ludCB2c2NhbmYoY29uc3QgY2hhciogcmVzdHJpY3QgZm9ybWF0LCB2YV9saXN0IGFyZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDOTkKK2ludCB2c25wcmludGYoY2hhciogcmVzdHJpY3Qgcywgc2l6ZV90IG4sIGNvbnN0IGNoYXIqIHJlc3RyaWN0IGZvcm1hdCwgICAgICAgICAvLyBDOTkKKyAgICAgICAgICAgICAgdmFfbGlzdCBhcmcpOworaW50IHZzcHJpbnRmKGNoYXIqIHJlc3RyaWN0IHMsIGNvbnN0IGNoYXIqIHJlc3RyaWN0IGZvcm1hdCwgdmFfbGlzdCBhcmcpOworaW50IHZzc2NhbmYoY29uc3QgY2hhciogcmVzdHJpY3QgcywgY29uc3QgY2hhciogcmVzdHJpY3QgZm9ybWF0LCB2YV9saXN0IGFyZyk7IC8vIEM5OQoraW50IGZnZXRjKEZJTEUqIHN0cmVhbSk7CitjaGFyKiBmZ2V0cyhjaGFyKiByZXN0cmljdCBzLCBpbnQgbiwgRklMRSogcmVzdHJpY3Qgc3RyZWFtKTsKK2ludCBmcHV0YyhpbnQgYywgRklMRSogc3RyZWFtKTsKK2ludCBmcHV0cyhjb25zdCBjaGFyKiByZXN0cmljdCBzLCBGSUxFKiByZXN0cmljdCBzdHJlYW0pOworaW50IGdldGMoRklMRSogc3RyZWFtKTsKK2ludCBnZXRjaGFyKHZvaWQpOworY2hhciogZ2V0cyhjaGFyKiBzKTsgIC8vIHJlbW92ZWQgaW4gQysrMTQKK2ludCBwdXRjKGludCBjLCBGSUxFKiBzdHJlYW0pOworaW50IHB1dGNoYXIoaW50IGMpOworaW50IHB1dHMoY29uc3QgY2hhciogcyk7CitpbnQgdW5nZXRjKGludCBjLCBGSUxFKiBzdHJlYW0pOworc2l6ZV90IGZyZWFkKHZvaWQqIHJlc3RyaWN0IHB0ciwgc2l6ZV90IHNpemUsIHNpemVfdCBubWVtYiwKKyAgICAgICAgICAgICBGSUxFKiByZXN0cmljdCBzdHJlYW0pOworc2l6ZV90IGZ3cml0ZShjb25zdCB2b2lkKiByZXN0cmljdCBwdHIsIHNpemVfdCBzaXplLCBzaXplX3Qgbm1lbWIsCisgICAgICAgICAgICAgIEZJTEUqIHJlc3RyaWN0IHN0cmVhbSk7CitpbnQgZmdldHBvcyhGSUxFKiByZXN0cmljdCBzdHJlYW0sIGZwb3NfdCogcmVzdHJpY3QgcG9zKTsKK2ludCBmc2VlayhGSUxFKiBzdHJlYW0sIGxvbmcgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKK2ludCBmc2V0cG9zKEZJTEUqc3RyZWFtLCBjb25zdCBmcG9zX3QqIHBvcyk7Citsb25nIGZ0ZWxsKEZJTEUqIHN0cmVhbSk7Cit2b2lkIHJld2luZChGSUxFKiBzdHJlYW0pOwordm9pZCBjbGVhcmVycihGSUxFKiBzdHJlYW0pOworaW50IGZlb2YoRklMRSogc3RyZWFtKTsKK2ludCBmZXJyb3IoRklMRSogc3RyZWFtKTsKK3ZvaWQgcGVycm9yKGNvbnN0IGNoYXIqIHMpOworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2luY2x1ZGVfbmV4dCA8c3RkaW8uaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKyN1bmRlZiBnZXRjCisjdW5kZWYgcHV0YworI3VuZGVmIGNsZWFyZXJyCisjdW5kZWYgZmVvZgorI3VuZGVmIGZlcnJvcgorCisjZW5kaWYKKworI2VuZGlmICAvLyBfTElCQ1BQX1NURElPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdGRsaWIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdGRsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTFjNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N0ZGxpYi5oCkBAIC0wLDAgKzEsMTI2IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RkbGliLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmIGRlZmluZWQoX19uZWVkX21hbGxvY19hbmRfY2FsbG9jKQorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2luY2x1ZGVfbmV4dCA8c3RkbGliLmg+CisKKyNlbGlmICFkZWZpbmVkKF9MSUJDUFBfU1RETElCX0gpCisjZGVmaW5lIF9MSUJDUFBfU1RETElCX0gKKworLyoKKyAgICBzdGRsaWIuaCBzeW5vcHNpcworCitNYWNyb3M6CisKKyAgICBFWElUX0ZBSUxVUkUKKyAgICBFWElUX1NVQ0NFU1MKKyAgICBNQl9DVVJfTUFYCisgICAgTlVMTAorICAgIFJBTkRfTUFYCisKK1R5cGVzOgorCisgICAgc2l6ZV90CisgICAgZGl2X3QKKyAgICBsZGl2X3QKKyAgICBsbGRpdl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQzk5CisKK2RvdWJsZSAgICBhdG9mIChjb25zdCBjaGFyKiBucHRyKTsKK2ludCAgICAgICBhdG9pIChjb25zdCBjaGFyKiBucHRyKTsKK2xvbmcgICAgICBhdG9sIChjb25zdCBjaGFyKiBucHRyKTsKK2xvbmcgbG9uZyBhdG9sbChjb25zdCBjaGFyKiBucHRyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQzk5Citkb3VibGUgICAgICAgICAgICAgc3RydG9kICAoY29uc3QgY2hhciogcmVzdHJpY3QgbnB0ciwgY2hhcioqIHJlc3RyaWN0IGVuZHB0cik7CitmbG9hdCAgICAgICAgICAgICAgc3RydG9mICAoY29uc3QgY2hhciogcmVzdHJpY3QgbnB0ciwgY2hhcioqIHJlc3RyaWN0IGVuZHB0cik7IC8vIEM5OQorbG9uZyBkb3VibGUgICAgICAgIHN0cnRvbGQgKGNvbnN0IGNoYXIqIHJlc3RyaWN0IG5wdHIsIGNoYXIqKiByZXN0cmljdCBlbmRwdHIpOyAvLyBDOTkKK2xvbmcgICAgICAgICAgICAgICBzdHJ0b2wgIChjb25zdCBjaGFyKiByZXN0cmljdCBucHRyLCBjaGFyKiogcmVzdHJpY3QgZW5kcHRyLCBpbnQgYmFzZSk7Citsb25nIGxvbmcgICAgICAgICAgc3RydG9sbCAoY29uc3QgY2hhciogcmVzdHJpY3QgbnB0ciwgY2hhcioqIHJlc3RyaWN0IGVuZHB0ciwgaW50IGJhc2UpOyAvLyBDOTkKK3Vuc2lnbmVkIGxvbmcgICAgICBzdHJ0b3VsIChjb25zdCBjaGFyKiByZXN0cmljdCBucHRyLCBjaGFyKiogcmVzdHJpY3QgZW5kcHRyLCBpbnQgYmFzZSk7Cit1bnNpZ25lZCBsb25nIGxvbmcgc3RydG91bGwoY29uc3QgY2hhciogcmVzdHJpY3QgbnB0ciwgY2hhcioqIHJlc3RyaWN0IGVuZHB0ciwgaW50IGJhc2UpOyAvLyBDOTkKK2ludCByYW5kKHZvaWQpOwordm9pZCBzcmFuZCh1bnNpZ25lZCBpbnQgc2VlZCk7Cit2b2lkKiBjYWxsb2Moc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSk7Cit2b2lkIGZyZWUodm9pZCogcHRyKTsKK3ZvaWQqIG1hbGxvYyhzaXplX3Qgc2l6ZSk7Cit2b2lkKiByZWFsbG9jKHZvaWQqIHB0ciwgc2l6ZV90IHNpemUpOwordm9pZCBhYm9ydCh2b2lkKTsKK2ludCBhdGV4aXQodm9pZCAoKmZ1bmMpKHZvaWQpKTsKK3ZvaWQgZXhpdChpbnQgc3RhdHVzKTsKK3ZvaWQgX0V4aXQoaW50IHN0YXR1cyk7CitjaGFyKiBnZXRlbnYoY29uc3QgY2hhciogbmFtZSk7CitpbnQgc3lzdGVtKGNvbnN0IGNoYXIqIHN0cmluZyk7Cit2b2lkKiBic2VhcmNoKGNvbnN0IHZvaWQqIGtleSwgY29uc3Qgdm9pZCogYmFzZSwgc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgaW50ICgqY29tcGFyKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwordm9pZCBxc29ydCh2b2lkKiBiYXNlLCBzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplLAorICAgICAgICAgICBpbnQgKCpjb21wYXIpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7CitpbnQgICAgICAgICBhYnMoICAgICAgaW50IGopOworbG9uZyAgICAgICAgYWJzKCAgICAgbG9uZyBqKTsKK2xvbmcgbG9uZyAgIGFicyhsb25nIGxvbmcgaik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMFgKK2xvbmcgICAgICAgbGFicyggICAgIGxvbmcgaik7Citsb25nIGxvbmcgbGxhYnMobG9uZyBsb25nIGopOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEM5OQorZGl2X3QgICAgIGRpdiggICAgICBpbnQgbnVtZXIsICAgICAgIGludCBkZW5vbSk7CitsZGl2X3QgICAgZGl2KCAgICAgbG9uZyBudW1lciwgICAgICBsb25nIGRlbm9tKTsKK2xsZGl2X3QgICBkaXYobG9uZyBsb25nIG51bWVyLCBsb25nIGxvbmcgZGVub20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMFgKK2xkaXZfdCAgIGxkaXYoICAgICBsb25nIG51bWVyLCAgICAgIGxvbmcgZGVub20pOworbGxkaXZfdCBsbGRpdihsb25nIGxvbmcgbnVtZXIsIGxvbmcgbG9uZyBkZW5vbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDOTkKK2ludCBtYmxlbihjb25zdCBjaGFyKiBzLCBzaXplX3Qgbik7CitpbnQgbWJ0b3djKHdjaGFyX3QqIHJlc3RyaWN0IHB3YywgY29uc3QgY2hhciogcmVzdHJpY3Qgcywgc2l6ZV90IG4pOworaW50IHdjdG9tYihjaGFyKiBzLCB3Y2hhcl90IHdjaGFyKTsKK3NpemVfdCBtYnN0b3djcyh3Y2hhcl90KiByZXN0cmljdCBwd2NzLCBjb25zdCBjaGFyKiByZXN0cmljdCBzLCBzaXplX3Qgbik7CitzaXplX3Qgd2NzdG9tYnMoY2hhciogcmVzdHJpY3QgcywgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgcHdjcywgc2l6ZV90IG4pOworaW50IGF0X3F1aWNrX2V4aXQodm9pZCAoKmZ1bmMpKHZvaWQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxMQordm9pZCBxdWlja19leGl0KGludCBzdGF0dXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxMQordm9pZCAqYWxpZ25lZF9hbGxvYyhzaXplX3QgYWxpZ25tZW50LCBzaXplX3Qgc2l6ZSk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBDMTEKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2luY2x1ZGVfbmV4dCA8c3RkbGliLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworCitleHRlcm4gIkMrKyIgeworCisjdW5kZWYgYWJzCisjdW5kZWYgZGl2CisjdW5kZWYgbGFicworI3VuZGVmIGxkaXYKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fTE9OR19MT05HCisjdW5kZWYgbGxhYnMKKyN1bmRlZiBsbGRpdgorI2VuZGlmCisKKy8vIE1TVkNSVCBhbHJlYWR5IGhhcyB0aGUgY29ycmVjdCBwcm90b3R5cGUgaW4gPHN0ZGxpYi5oPiBpZiBfX2NwbHVzcGx1cyBpcyBkZWZpbmVkCisjaWYgIWRlZmluZWQoX0xJQkNQUF9NU1ZDUlQpICYmICFkZWZpbmVkKF9fc3VuX18pICYmICFkZWZpbmVkKF9BSVgpCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBsb25nICAgICAgYWJzKCAgICAgbG9uZyBfX3gpIF9OT0VYQ0VQVCB7cmV0dXJuICBsYWJzKF9feCk7fQorI2lmbmRlZiBfTElCQ1BQX0hBU19OT19MT05HX0xPTkcKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGxvbmcgbG9uZyBhYnMobG9uZyBsb25nIF9feCkgX05PRVhDRVBUIHtyZXR1cm4gbGxhYnMoX194KTt9CisjZW5kaWYgLy8gX0xJQkNQUF9IQVNfTk9fTE9OR19MT05HCisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZICBsZGl2X3QgZGl2KCAgICAgbG9uZyBfX3gsICAgICAgbG9uZyBfX3kpIF9OT0VYQ0VQVCB7cmV0dXJuICBsZGl2KF9feCwgX195KTt9CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0xPTkdfTE9ORworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgbGxkaXZfdCBkaXYobG9uZyBsb25nIF9feCwgbG9uZyBsb25nIF9feSkgX05PRVhDRVBUIHtyZXR1cm4gbGxkaXYoX194LCBfX3kpO30KKyNlbmRpZiAvLyBfTElCQ1BQX0hBU19OT19MT05HX0xPTkcKKyNlbmRpZiAvLyBfTElCQ1BQX01TVkNSVCAvIF9fc3VuX18gLyBfQUlYCisKK30gIC8vIGV4dGVybiAiQysrIgorCisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9TVERMSUJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N0cmVhbWJ1ZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdHJlYW1idWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwOWQyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdHJlYW1idWYKQEAgLTAsMCArMSw1MDEgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RyZWFtYnVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfU1RFQU1CVUYKKyNkZWZpbmUgX0xJQkNQUF9TVEVBTUJVRgorCisvKgorICAgIHN0cmVhbWJ1ZiBzeW5vcHNpcworCituYW1lc3BhY2Ugc3RkCit7CisKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzID0gY2hhcl90cmFpdHM8Y2hhclQ+ID4KK2NsYXNzIGJhc2ljX3N0cmVhbWJ1ZgoreworcHVibGljOgorICAgIC8vIHR5cGVzOgorICAgIHR5cGVkZWYgY2hhclQgY2hhcl90eXBlOworICAgIHR5cGVkZWYgdHJhaXRzIHRyYWl0c190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIGludF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIHBvc190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlIG9mZl90eXBlOworCisgICAgdmlydHVhbCB+YmFzaWNfc3RyZWFtYnVmKCk7CisKKyAgICAvLyAyNy42LjIuMi4xIGxvY2FsZXM6CisgICAgbG9jYWxlIHB1YmltYnVlKGNvbnN0IGxvY2FsZSYgbG9jKTsKKyAgICBsb2NhbGUgZ2V0bG9jKCkgY29uc3Q7CisKKyAgICAvLyAyNy42LjIuMi4yIGJ1ZmZlciBhbmQgcG9zaXRpb25pbmc6CisgICAgYmFzaWNfc3RyZWFtYnVmKiBwdWJzZXRidWYoY2hhcl90eXBlKiBzLCBzdHJlYW1zaXplIG4pOworICAgIHBvc190eXBlIHB1YnNlZWtvZmYob2ZmX3R5cGUgb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciB3YXksCisgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgd2hpY2ggPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyAgICBwb3NfdHlwZSBwdWJzZWVrcG9zKHBvc190eXBlIHNwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIHdoaWNoID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CisgICAgaW50IHB1YnN5bmMoKTsKKworICAgIC8vIEdldCBhbmQgcHV0IGFyZWFzOgorICAgIC8vIDI3LjYuMi4yLjMgR2V0IGFyZWE6CisgICAgc3RyZWFtc2l6ZSBpbl9hdmFpbCgpOworICAgIGludF90eXBlIHNuZXh0YygpOworICAgIGludF90eXBlIHNidW1wYygpOworICAgIGludF90eXBlIHNnZXRjKCk7CisgICAgc3RyZWFtc2l6ZSBzZ2V0bihjaGFyX3R5cGUqIHMsIHN0cmVhbXNpemUgbik7CisKKyAgICAvLyAyNy42LjIuMi40IFB1dGJhY2s6CisgICAgaW50X3R5cGUgc3B1dGJhY2tjKGNoYXJfdHlwZSBjKTsKKyAgICBpbnRfdHlwZSBzdW5nZXRjKCk7CisKKyAgICAvLyAyNy42LjIuMi41IFB1dCBhcmVhOgorICAgIGludF90eXBlIHNwdXRjKGNoYXJfdHlwZSBjKTsKKyAgICBzdHJlYW1zaXplIHNwdXRuKGNvbnN0IGNoYXJfdHlwZSogcywgc3RyZWFtc2l6ZSBuKTsKKworcHJvdGVjdGVkOgorICAgIGJhc2ljX3N0cmVhbWJ1ZigpOworICAgIGJhc2ljX3N0cmVhbWJ1Zihjb25zdCBiYXNpY19zdHJlYW1idWYmIHJocyk7CisgICAgYmFzaWNfc3RyZWFtYnVmJiBvcGVyYXRvcj0oY29uc3QgYmFzaWNfc3RyZWFtYnVmJiByaHMpOworICAgIHZvaWQgc3dhcChiYXNpY19zdHJlYW1idWYmIHJocyk7CisKKyAgICAvLyAyNy42LjIuMy4yIEdldCBhcmVhOgorICAgIGNoYXJfdHlwZSogZWJhY2soKSBjb25zdDsKKyAgICBjaGFyX3R5cGUqIGdwdHIoKSBjb25zdDsKKyAgICBjaGFyX3R5cGUqIGVncHRyKCkgY29uc3Q7CisgICAgdm9pZCBnYnVtcChpbnQgbik7CisgICAgdm9pZCBzZXRnKGNoYXJfdHlwZSogZ2JlZywgY2hhcl90eXBlKiBnbmV4dCwgY2hhcl90eXBlKiBnZW5kKTsKKworICAgIC8vIDI3LjYuMi4zLjMgUHV0IGFyZWE6CisgICAgY2hhcl90eXBlKiBwYmFzZSgpIGNvbnN0OworICAgIGNoYXJfdHlwZSogcHB0cigpIGNvbnN0OworICAgIGNoYXJfdHlwZSogZXBwdHIoKSBjb25zdDsKKyAgICB2b2lkIHBidW1wKGludCBuKTsKKyAgICB2b2lkIHNldHAoY2hhcl90eXBlKiBwYmVnLCBjaGFyX3R5cGUqIHBlbmQpOworCisgICAgLy8gMjcuNi4yLjQgdmlydHVhbCBmdW5jdGlvbnM6CisgICAgLy8gMjcuNi4yLjQuMSBMb2NhbGVzOgorICAgIHZpcnR1YWwgdm9pZCBpbWJ1ZShjb25zdCBsb2NhbGUmIGxvYyk7CisKKyAgICAvLyAyNy42LjIuNC4yIEJ1ZmZlciBtYW5hZ2VtZW50IGFuZCBwb3NpdGlvbmluZzoKKyAgICB2aXJ0dWFsIGJhc2ljX3N0cmVhbWJ1Ziogc2V0YnVmKGNoYXJfdHlwZSogcywgc3RyZWFtc2l6ZSBuKTsKKyAgICB2aXJ0dWFsIHBvc190eXBlIHNlZWtvZmYob2ZmX3R5cGUgb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciB3YXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSB3aGljaCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworICAgIHZpcnR1YWwgcG9zX3R5cGUgc2Vla3Bvcyhwb3NfdHlwZSBzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIHdoaWNoID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CisgICAgdmlydHVhbCBpbnQgc3luYygpOworCisgICAgLy8gMjcuNi4yLjQuMyBHZXQgYXJlYToKKyAgICB2aXJ0dWFsIHN0cmVhbXNpemUgc2hvd21hbnljKCk7CisgICAgdmlydHVhbCBzdHJlYW1zaXplIHhzZ2V0bihjaGFyX3R5cGUqIHMsIHN0cmVhbXNpemUgbik7CisgICAgdmlydHVhbCBpbnRfdHlwZSB1bmRlcmZsb3coKTsKKyAgICB2aXJ0dWFsIGludF90eXBlIHVmbG93KCk7CisKKyAgICAvLyAyNy42LjIuNC40IFB1dGJhY2s6CisgICAgdmlydHVhbCBpbnRfdHlwZSBwYmFja2ZhaWwoaW50X3R5cGUgYyA9IHRyYWl0c190eXBlOjplb2YoKSk7CisKKyAgICAvLyAyNy42LjIuNC41IFB1dCBhcmVhOgorICAgIHZpcnR1YWwgc3RyZWFtc2l6ZSB4c3B1dG4oY29uc3QgY2hhcl90eXBlKiBzLCBzdHJlYW1zaXplIG4pOworICAgIHZpcnR1YWwgaW50X3R5cGUgb3ZlcmZsb3cgKGludF90eXBlIGMgPSB0cmFpdHNfdHlwZTo6ZW9mKCkpOworfTsKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8aW9zPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9QVVNIX01BQ1JPUworI2luY2x1ZGUgPF9fdW5kZWZfbWFjcm9zPgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGJhc2ljX3N0cmVhbWJ1ZgoreworcHVibGljOgorICAgIC8vIHR5cGVzOgorICAgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSBvZmZfdHlwZTsKKworICAgIHN0YXRpY19hc3NlcnQoKGlzX3NhbWU8X0NoYXJULCB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6Y2hhcl90eXBlPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgInRyYWl0c190eXBlOjpjaGFyX3R5cGUgbXVzdCBiZSB0aGUgc2FtZSB0eXBlIGFzIENoYXJUIik7CisKKyAgICB2aXJ0dWFsIH5iYXNpY19zdHJlYW1idWYoKTsKKworICAgIC8vIDI3LjYuMi4yLjEgbG9jYWxlczoKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBsb2NhbGUgcHViaW1idWUoY29uc3QgbG9jYWxlJiBfX2xvYykgeworICAgICAgICBpbWJ1ZShfX2xvYyk7CisgICAgICAgIGxvY2FsZSBfX3IgPSBfX2xvY187CisgICAgICAgIF9fbG9jXyA9IF9fbG9jOworICAgICAgICByZXR1cm4gX19yOworICAgIH0KKworICAgIGlubGluZSBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9JTkxJTkVfVklTSUJJTElUWQorICAgIGxvY2FsZSBnZXRsb2MoKSBjb25zdCB7IHJldHVybiBfX2xvY187IH0KKworICAgIC8vIDI3LjYuMi4yLjIgYnVmZmVyIGFuZCBwb3NpdGlvbmluZzoKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJlYW1idWYqIHB1YnNldGJ1ZihjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgeyByZXR1cm4gc2V0YnVmKF9fcywgX19uKTsgfQorCisgICAgaW5saW5lIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX0lOTElORV9WSVNJQklMSVRZCisgICAgcG9zX3R5cGUgcHVic2Vla29mZihvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX193YXksCisgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX193aGljaCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCisgICAgeyByZXR1cm4gc2Vla29mZihfX29mZiwgX193YXksIF9fd2hpY2gpOyB9CisKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwb3NfdHlwZSBwdWJzZWVrcG9zKHBvc190eXBlIF9fc3AsCisgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX193aGljaCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCisgICAgeyByZXR1cm4gc2Vla3BvcyhfX3NwLCBfX3doaWNoKTsgfQorCisgICAgaW5saW5lIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX0lOTElORV9WSVNJQklMSVRZCisgICAgaW50IHB1YnN5bmMoKSB7IHJldHVybiBzeW5jKCk7IH0KKworICAgIC8vIEdldCBhbmQgcHV0IGFyZWFzOgorICAgIC8vIDI3LjYuMi4yLjMgR2V0IGFyZWE6CisgICAgaW5saW5lIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RyZWFtc2l6ZSBpbl9hdmFpbCgpIHsKKyAgICAgICAgaWYgKF9fbmlucF8gPCBfX2VpbnBfKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0cmVhbXNpemU+KF9fZWlucF8gLSBfX25pbnBfKTsKKyAgICAgICAgcmV0dXJuIHNob3dtYW55YygpOworICAgIH0KKworICAgIGlubGluZSBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9JTkxJTkVfVklTSUJJTElUWQorICAgIGludF90eXBlIHNuZXh0YygpIHsKKyAgICAgICAgaWYgKHNidW1wYygpID09IHRyYWl0c190eXBlOjplb2YoKSkKKyAgICAgICAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICAgIHJldHVybiBzZ2V0YygpOworICAgIH0KKworICAgIGlubGluZSBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9JTkxJTkVfVklTSUJJTElUWQorICAgIGludF90eXBlIHNidW1wYygpIHsKKyAgICAgICAgaWYgKF9fbmlucF8gPT0gX19laW5wXykKKyAgICAgICAgICAgIHJldHVybiB1ZmxvdygpOworICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCpfX25pbnBfKyspOworICAgIH0KKworICAgIGlubGluZSBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9JTkxJTkVfVklTSUJJTElUWQorICAgIGludF90eXBlIHNnZXRjKCkgeworICAgICAgICBpZiAoX19uaW5wXyA9PSBfX2VpbnBfKQorICAgICAgICAgICAgcmV0dXJuIHVuZGVyZmxvdygpOworICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCpfX25pbnBfKTsKKyAgICB9CisKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdHJlYW1zaXplIHNnZXRuKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7IHJldHVybiB4c2dldG4oX19zLCBfX24pOyB9CisKKyAgICAvLyAyNy42LjIuMi40IFB1dGJhY2s6CisgICAgaW5saW5lIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX0lOTElORV9WSVNJQklMSVRZCisgICAgaW50X3R5cGUgc3B1dGJhY2tjKGNoYXJfdHlwZSBfX2MpIHsKKyAgICAgICAgaWYgKF9fYmlucF8gPT0gX19uaW5wXyB8fCAhdHJhaXRzX3R5cGU6OmVxKF9fYywgX19uaW5wX1stMV0pKQorICAgICAgICAgICAgcmV0dXJuIHBiYWNrZmFpbCh0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoX19jKSk7CisgICAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKi0tX19uaW5wXyk7CisgICAgfQorCisgICAgaW5saW5lIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX0lOTElORV9WSVNJQklMSVRZCisgICAgaW50X3R5cGUgc3VuZ2V0YygpIHsKKyAgICAgICAgaWYgKF9fYmlucF8gPT0gX19uaW5wXykKKyAgICAgICAgICByZXR1cm4gcGJhY2tmYWlsKCk7CisgICAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKi0tX19uaW5wXyk7CisgICAgfQorCisgICAgLy8gMjcuNi4yLjIuNSBQdXQgYXJlYToKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpbnRfdHlwZSBzcHV0YyhjaGFyX3R5cGUgX19jKSB7CisgICAgICAgIGlmIChfX25vdXRfID09IF9fZW91dF8pCisgICAgICAgICAgICByZXR1cm4gb3ZlcmZsb3codHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKF9fYykpOworICAgICAgICAqX19ub3V0XysrID0gX19jOworICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKF9fYyk7CisgICAgfQorCisgICAgaW5saW5lIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RyZWFtc2l6ZSBzcHV0bihjb25zdCBjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgeyByZXR1cm4geHNwdXRuKF9fcywgX19uKTsgfQorCitwcm90ZWN0ZWQ6CisgICAgYmFzaWNfc3RyZWFtYnVmKCk7CisgICAgYmFzaWNfc3RyZWFtYnVmKGNvbnN0IGJhc2ljX3N0cmVhbWJ1ZiYgX19yaHMpOworICAgIGJhc2ljX3N0cmVhbWJ1ZiYgb3BlcmF0b3I9KGNvbnN0IGJhc2ljX3N0cmVhbWJ1ZiYgX19yaHMpOworICAgIHZvaWQgc3dhcChiYXNpY19zdHJlYW1idWYmIF9fcmhzKTsKKworICAgIC8vIDI3LjYuMi4zLjIgR2V0IGFyZWE6CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGNoYXJfdHlwZSogZWJhY2soKSBjb25zdCB7cmV0dXJuIF9fYmlucF87fQorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBjaGFyX3R5cGUqIGdwdHIoKSAgY29uc3Qge3JldHVybiBfX25pbnBfO30KKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgY2hhcl90eXBlKiBlZ3B0cigpIGNvbnN0IHtyZXR1cm4gX19laW5wXzt9CisKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGdidW1wKGludCBfX24pIHsgX19uaW5wXyArPSBfX247IH0KKworICAgIGlubGluZSBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc2V0ZyhjaGFyX3R5cGUqIF9fZ2JlZywgY2hhcl90eXBlKiBfX2duZXh0LCBjaGFyX3R5cGUqIF9fZ2VuZCkgeworICAgICAgICBfX2JpbnBfID0gX19nYmVnOworICAgICAgICBfX25pbnBfID0gX19nbmV4dDsKKyAgICAgICAgX19laW5wXyA9IF9fZ2VuZDsKKyAgICB9CisKKyAgICAvLyAyNy42LjIuMy4zIFB1dCBhcmVhOgorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBjaGFyX3R5cGUqIHBiYXNlKCkgY29uc3Qge3JldHVybiBfX2JvdXRfO30KKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgY2hhcl90eXBlKiBwcHRyKCkgIGNvbnN0IHtyZXR1cm4gX19ub3V0Xzt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGNoYXJfdHlwZSogZXBwdHIoKSBjb25zdCB7cmV0dXJuIF9fZW91dF87fQorCisgICAgaW5saW5lIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBwYnVtcChpbnQgX19uKSB7IF9fbm91dF8gKz0gX19uOyB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICB2b2lkIF9fcGJ1bXAoc3RyZWFtc2l6ZSBfX24pIHsgX19ub3V0XyArPSBfX247IH0KKworICAgIGlubGluZSBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc2V0cChjaGFyX3R5cGUqIF9fcGJlZywgY2hhcl90eXBlKiBfX3BlbmQpIHsKKyAgICAgICAgX19ib3V0XyA9IF9fbm91dF8gPSBfX3BiZWc7CisgICAgICAgIF9fZW91dF8gPSBfX3BlbmQ7CisgICAgfQorCisgICAgLy8gMjcuNi4yLjQgdmlydHVhbCBmdW5jdGlvbnM6CisgICAgLy8gMjcuNi4yLjQuMSBMb2NhbGVzOgorICAgIHZpcnR1YWwgdm9pZCBpbWJ1ZShjb25zdCBsb2NhbGUmIF9fbG9jKTsKKworICAgIC8vIDI3LjYuMi40LjIgQnVmZmVyIG1hbmFnZW1lbnQgYW5kIHBvc2l0aW9uaW5nOgorICAgIHZpcnR1YWwgYmFzaWNfc3RyZWFtYnVmKiBzZXRidWYoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKyAgICB2aXJ0dWFsIHBvc190eXBlIHNlZWtvZmYob2ZmX3R5cGUgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fd2F5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX193aGljaCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworICAgIHZpcnR1YWwgcG9zX3R5cGUgc2Vla3Bvcyhwb3NfdHlwZSBfX3NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX193aGljaCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworICAgIHZpcnR1YWwgaW50IHN5bmMoKTsKKworICAgIC8vIDI3LjYuMi40LjMgR2V0IGFyZWE6CisgICAgdmlydHVhbCBzdHJlYW1zaXplIHNob3dtYW55YygpOworICAgIHZpcnR1YWwgc3RyZWFtc2l6ZSB4c2dldG4oY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKyAgICB2aXJ0dWFsIGludF90eXBlIHVuZGVyZmxvdygpOworICAgIHZpcnR1YWwgaW50X3R5cGUgdWZsb3coKTsKKworICAgIC8vIDI3LjYuMi40LjQgUHV0YmFjazoKKyAgICB2aXJ0dWFsIGludF90eXBlIHBiYWNrZmFpbChpbnRfdHlwZSBfX2MgPSB0cmFpdHNfdHlwZTo6ZW9mKCkpOworCisgICAgLy8gMjcuNi4yLjQuNSBQdXQgYXJlYToKKyAgICB2aXJ0dWFsIHN0cmVhbXNpemUgeHNwdXRuKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbik7CisgICAgdmlydHVhbCBpbnRfdHlwZSBvdmVyZmxvdyhpbnRfdHlwZSBfX2MgPSB0cmFpdHNfdHlwZTo6ZW9mKCkpOworCitwcml2YXRlOgorICAgIGxvY2FsZSBfX2xvY187CisgICAgY2hhcl90eXBlKiBfX2JpbnBfOworICAgIGNoYXJfdHlwZSogX19uaW5wXzsKKyAgICBjaGFyX3R5cGUqIF9fZWlucF87CisgICAgY2hhcl90eXBlKiBfX2JvdXRfOworICAgIGNoYXJfdHlwZSogX19ub3V0XzsKKyAgICBjaGFyX3R5cGUqIF9fZW91dF87Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46On5iYXNpY19zdHJlYW1idWYoKQoreworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OmJhc2ljX3N0cmVhbWJ1ZigpCisgICAgOiBfX2JpbnBfKDApLAorICAgICAgX19uaW5wXygwKSwKKyAgICAgIF9fZWlucF8oMCksCisgICAgICBfX2JvdXRfKDApLAorICAgICAgX19ub3V0XygwKSwKKyAgICAgIF9fZW91dF8oMCkKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpiYXNpY19zdHJlYW1idWYoY29uc3QgYmFzaWNfc3RyZWFtYnVmJiBfX3NiKQorICAgIDogX19sb2NfKF9fc2IuX19sb2NfKSwKKyAgICAgIF9fYmlucF8oX19zYi5fX2JpbnBfKSwKKyAgICAgIF9fbmlucF8oX19zYi5fX25pbnBfKSwKKyAgICAgIF9fZWlucF8oX19zYi5fX2VpbnBfKSwKKyAgICAgIF9fYm91dF8oX19zYi5fX2JvdXRfKSwKKyAgICAgIF9fbm91dF8oX19zYi5fX25vdXRfKSwKKyAgICAgIF9fZW91dF8oX19zYi5fX2VvdXRfKQoreworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4mCitiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0b3I9KGNvbnN0IGJhc2ljX3N0cmVhbWJ1ZiYgX19zYikKK3sKKyAgICBfX2xvY18gPSBfX3NiLl9fbG9jXzsKKyAgICBfX2JpbnBfID0gX19zYi5fX2JpbnBfOworICAgIF9fbmlucF8gPSBfX3NiLl9fbmlucF87CisgICAgX19laW5wXyA9IF9fc2IuX19laW5wXzsKKyAgICBfX2JvdXRfID0gX19zYi5fX2JvdXRfOworICAgIF9fbm91dF8gPSBfX3NiLl9fbm91dF87CisgICAgX19lb3V0XyA9IF9fc2IuX19lb3V0XzsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6c3dhcChiYXNpY19zdHJlYW1idWYmIF9fc2IpCit7CisgICAgX1ZTVEQ6OnN3YXAoX19sb2NfLCBfX3NiLl9fbG9jXyk7CisgICAgX1ZTVEQ6OnN3YXAoX19iaW5wXywgX19zYi5fX2JpbnBfKTsKKyAgICBfVlNURDo6c3dhcChfX25pbnBfLCBfX3NiLl9fbmlucF8pOworICAgIF9WU1REOjpzd2FwKF9fZWlucF8sIF9fc2IuX19laW5wXyk7CisgICAgX1ZTVEQ6OnN3YXAoX19ib3V0XywgX19zYi5fX2JvdXRfKTsKKyAgICBfVlNURDo6c3dhcChfX25vdXRfLCBfX3NiLl9fbm91dF8pOworICAgIF9WU1REOjpzd2FwKF9fZW91dF8sIF9fc2IuX19lb3V0Xyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit2b2lkCitiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6aW1idWUoY29uc3QgbG9jYWxlJikKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KgorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OnNldGJ1ZihjaGFyX3R5cGUqLCBzdHJlYW1zaXplKQoreworICAgIHJldHVybiB0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgordHlwZW5hbWUgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OnBvc190eXBlCitiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6c2Vla29mZihvZmZfdHlwZSwgaW9zX2Jhc2U6OnNlZWtkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUpCit7CisgICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit0eXBlbmFtZSBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6cG9zX3R5cGUKK2Jhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpzZWVrcG9zKHBvc190eXBlLCBpb3NfYmFzZTo6b3Blbm1vZGUpCit7CisgICAgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbnQKK2Jhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpzeW5jKCkKK3sKKyAgICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3N0cmVhbXNpemUKK2Jhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpzaG93bWFueWMoKQoreworICAgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorc3RyZWFtc2l6ZQorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OnhzZ2V0bihjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCit7CisgICAgY29uc3QgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgaW50X3R5cGUgX19jOworICAgIHN0cmVhbXNpemUgX19pID0gMDsKKyAgICB3aGlsZShfX2kgPCBfX24pCisgICAgeworICAgICAgICBpZiAoX19uaW5wXyA8IF9fZWlucF8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHN0cmVhbXNpemUgX19sZW4gPSBfVlNURDo6bWluKHN0YXRpY19jYXN0PHN0cmVhbXNpemU+KElOVF9NQVgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6bWluKF9fZWlucF8gLSBfX25pbnBfLCBfX24gLSBfX2kpKTsKKyAgICAgICAgICAgIHRyYWl0c190eXBlOjpjb3B5KF9fcywgX19uaW5wXywgX19sZW4pOworICAgICAgICAgICAgX19zICs9ICBfX2xlbjsKKyAgICAgICAgICAgIF9faSArPSAgX19sZW47CisgICAgICAgICAgICB0aGlzLT5nYnVtcChfX2xlbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKF9fYyA9IHVmbG93KCkpICE9IF9fZW9mKQorICAgICAgICB7CisgICAgICAgICAgICAqX19zID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpOworICAgICAgICAgICAgKytfX3M7CisgICAgICAgICAgICArK19faTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIF9faTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3R5cGVuYW1lIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OnVuZGVyZmxvdygpCit7CisgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3R5cGVuYW1lIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OnVmbG93KCkKK3sKKyAgICBpZiAodW5kZXJmbG93KCkgPT0gdHJhaXRzX3R5cGU6OmVvZigpKQorICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgIHJldHVybiB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKl9fbmlucF8rKyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit0eXBlbmFtZSBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUKK2Jhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpwYmFja2ZhaWwoaW50X3R5cGUpCit7CisgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3N0cmVhbXNpemUKK2Jhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+Ojp4c3B1dG4oY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQoreworICAgIHN0cmVhbXNpemUgX19pID0gMDsKKyAgICBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICB3aGlsZSggX19pIDwgX19uKQorICAgIHsKKyAgICAgICAgaWYgKF9fbm91dF8gPj0gX19lb3V0XykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG92ZXJmbG93KHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqX19zKSkgPT0gX19lb2YpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICArK19fczsKKyAgICAgICAgICAgICsrX19pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RyZWFtc2l6ZSBfX2NodW5rX3NpemUgPSBfVlNURDo6bWluKF9fZW91dF8gLSBfX25vdXRfLCBfX24gLSBfX2kpOworICAgICAgICAgICAgdHJhaXRzX3R5cGU6OmNvcHkoX19ub3V0XywgX19zLCBfX2NodW5rX3NpemUpOworICAgICAgICAgICAgX19ub3V0XyArPSBfX2NodW5rX3NpemU7CisgICAgICAgICAgICBfX3MgICAgICs9IF9fY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIF9faSAgICAgKz0gX19jaHVua19zaXplOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX2k7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+Cit0eXBlbmFtZSBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUKK2Jhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpvdmVyZmxvdyhpbnRfdHlwZSkKK3sKKyAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworfQorCisjaWZuZGVmIF9MSUJDUFBfQVZBSUxBQklMSVRZX05PX1NUUkVBTVNfRVhURVJOX1RFTVBMQVRFCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURShjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBiYXNpY19zdHJlYW1idWY8Y2hhcj4pCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURShjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBiYXNpY19zdHJlYW1idWY8d2NoYXJfdD4pCisKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIGJhc2ljX2lvczxjaGFyPikKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIGJhc2ljX2lvczx3Y2hhcl90PikKKyNlbmRpZgorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKK19MSUJDUFBfUE9QX01BQ1JPUworCisjZW5kaWYgIC8vIF9MSUJDUFBfU1RFQU1CVUYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdHJpbmcgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3RyaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMThhYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3RyaW5nCkBAIC0wLDAgKzEsNDExNiBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0cmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9TVFJJTkcKKyNkZWZpbmUgX0xJQkNQUF9TVFJJTkcKKworLyoKKyAgICBzdHJpbmcgc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCit0ZW1wbGF0ZSA8Y2xhc3Mgc3RhdGVUPgorY2xhc3MgZnBvcworeworcHJpdmF0ZToKKyAgICBzdGF0ZVQgc3Q7CitwdWJsaWM6CisgICAgZnBvcyhzdHJlYW1vZmYgPSBzdHJlYW1vZmYoKSk7CisKKyAgICBvcGVyYXRvciBzdHJlYW1vZmYoKSBjb25zdDsKKworICAgIHN0YXRlVCBzdGF0ZSgpIGNvbnN0OworICAgIHZvaWQgc3RhdGUoc3RhdGVUKTsKKworICAgIGZwb3MmIG9wZXJhdG9yKz0oc3RyZWFtb2ZmKTsKKyAgICBmcG9zICBvcGVyYXRvcisgKHN0cmVhbW9mZikgY29uc3Q7CisgICAgZnBvcyYgb3BlcmF0b3ItPShzdHJlYW1vZmYpOworICAgIGZwb3MgIG9wZXJhdG9yLSAoc3RyZWFtb2ZmKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBzdGF0ZVQ+IHN0cmVhbW9mZiBvcGVyYXRvci0oY29uc3QgZnBvczxzdGF0ZVQ+JiB4LCBjb25zdCBmcG9zPHN0YXRlVD4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3Mgc3RhdGVUPiBib29sIG9wZXJhdG9yPT0oY29uc3QgZnBvczxzdGF0ZVQ+JiB4LCBjb25zdCBmcG9zPHN0YXRlVD4mIHkpOwordGVtcGxhdGUgPGNsYXNzIHN0YXRlVD4gYm9vbCBvcGVyYXRvciE9KGNvbnN0IGZwb3M8c3RhdGVUPiYgeCwgY29uc3QgZnBvczxzdGF0ZVQ+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJUPgorc3RydWN0IGNoYXJfdHJhaXRzCit7CisgICAgdHlwZWRlZiBjaGFyVCAgICAgY2hhcl90eXBlOworICAgIHR5cGVkZWYgLi4uICAgICAgIGludF90eXBlOworICAgIHR5cGVkZWYgc3RyZWFtb2ZmIG9mZl90eXBlOworICAgIHR5cGVkZWYgc3RyZWFtcG9zIHBvc190eXBlOworICAgIHR5cGVkZWYgbWJzdGF0ZV90IHN0YXRlX3R5cGU7CisKKyAgICBzdGF0aWMgdm9pZCBhc3NpZ24oY2hhcl90eXBlJiBjMSwgY29uc3QgY2hhcl90eXBlJiBjMikgbm9leGNlcHQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGVxKGNoYXJfdHlwZSBjMSwgY2hhcl90eXBlIGMyKSBub2V4Y2VwdDsKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgbHQoY2hhcl90eXBlIGMxLCBjaGFyX3R5cGUgYzIpIG5vZXhjZXB0OworCisgICAgc3RhdGljIGludCAgICAgICAgICAgICAgY29tcGFyZShjb25zdCBjaGFyX3R5cGUqIHMxLCBjb25zdCBjaGFyX3R5cGUqIHMyLCBzaXplX3Qgbik7CisgICAgc3RhdGljIHNpemVfdCAgICAgICAgICAgbGVuZ3RoKGNvbnN0IGNoYXJfdHlwZSogcyk7CisgICAgc3RhdGljIGNvbnN0IGNoYXJfdHlwZSogZmluZChjb25zdCBjaGFyX3R5cGUqIHMsIHNpemVfdCBuLCBjb25zdCBjaGFyX3R5cGUmIGEpOworICAgIHN0YXRpYyBjaGFyX3R5cGUqICAgICAgIG1vdmUoY2hhcl90eXBlKiBzMSwgY29uc3QgY2hhcl90eXBlKiBzMiwgc2l6ZV90IG4pOworICAgIHN0YXRpYyBjaGFyX3R5cGUqICAgICAgIGNvcHkoY2hhcl90eXBlKiBzMSwgY29uc3QgY2hhcl90eXBlKiBzMiwgc2l6ZV90IG4pOworICAgIHN0YXRpYyBjaGFyX3R5cGUqICAgICAgIGFzc2lnbihjaGFyX3R5cGUqIHMsIHNpemVfdCBuLCBjaGFyX3R5cGUgYSk7CisKKyAgICBzdGF0aWMgY29uc3RleHByIGludF90eXBlICBub3RfZW9mKGludF90eXBlIGMpIG5vZXhjZXB0OworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhcl90eXBlIHRvX2NoYXJfdHlwZShpbnRfdHlwZSBjKSBub2V4Y2VwdDsKKyAgICBzdGF0aWMgY29uc3RleHByIGludF90eXBlICB0b19pbnRfdHlwZShjaGFyX3R5cGUgYykgbm9leGNlcHQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sICAgICAgZXFfaW50X3R5cGUoaW50X3R5cGUgYzEsIGludF90eXBlIGMyKSBub2V4Y2VwdDsKKyAgICBzdGF0aWMgY29uc3RleHByIGludF90eXBlICBlb2YoKSBub2V4Y2VwdDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBjaGFyX3RyYWl0czxjaGFyPjsKK3RlbXBsYXRlIDw+IHN0cnVjdCBjaGFyX3RyYWl0czx3Y2hhcl90PjsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cyA9IGNoYXJfdHJhaXRzPGNoYXJUPiwgY2xhc3MgQWxsb2NhdG9yID0gYWxsb2NhdG9yPGNoYXJUPiA+CitjbGFzcyBiYXNpY19zdHJpbmcKK3sKK3B1YmxpYzoKKy8vIHR5cGVzOgorICAgIHR5cGVkZWYgdHJhaXRzIHRyYWl0c190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmNoYXJfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgQWxsb2NhdG9yIGFsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6cG9pbnRlciBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIGltcGxlbWVudGF0aW9uLWRlZmluZWQgaXRlcmF0b3I7CisgICAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yOworICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgc3RhdGljIGNvbnN0IHNpemVfdHlwZSBucG9zID0gLTE7CisKKyAgICBiYXNpY19zdHJpbmcoKQorICAgICAgICBub2V4Y2VwdChpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKTsKKyAgICBleHBsaWNpdCBiYXNpY19zdHJpbmcoY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOworICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIHN0cik7CisgICAgYmFzaWNfc3RyaW5nKGJhc2ljX3N0cmluZyYmIHN0cikKKyAgICAgICAgbm9leGNlcHQoaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisgICAgYmFzaWNfc3RyaW5nKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLCBzaXplX3R5cGUgcG9zLAorICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSA9IGFsbG9jYXRvcl90eXBlKCkpOworICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIHN0ciwgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4sCisgICAgICAgICAgICAgICAgIGNvbnN0IEFsbG9jYXRvciYgYSA9IEFsbG9jYXRvcigpKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgICAgICBiYXNpY19zdHJpbmcoY29uc3QgVCYgdCwgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4sIGNvbnN0IEFsbG9jYXRvciYgYSA9IEFsbG9jYXRvcigpKTsgLy8gQysrMTcKKyAgICBleHBsaWNpdCBiYXNpY19zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4gc3YsIGNvbnN0IEFsbG9jYXRvciYgYSA9IEFsbG9jYXRvcigpKTsKKyAgICBiYXNpY19zdHJpbmcoY29uc3QgdmFsdWVfdHlwZSogcywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKyAgICBiYXNpY19zdHJpbmcoY29uc3QgdmFsdWVfdHlwZSogcywgc2l6ZV90eXBlIG4sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSk7CisgICAgYmFzaWNfc3RyaW5nKHNpemVfdHlwZSBuLCB2YWx1ZV90eXBlIGMsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSk7CisgICAgdGVtcGxhdGU8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgYmFzaWNfc3RyaW5nKElucHV0SXRlcmF0b3IgYmVnaW4sIElucHV0SXRlcmF0b3IgZW5kLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKyAgICBiYXNpY19zdHJpbmcoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiwgY29uc3QgQWxsb2NhdG9yJiA9IEFsbG9jYXRvcigpKTsKKyAgICBiYXNpY19zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nJiwgY29uc3QgQWxsb2NhdG9yJik7CisgICAgYmFzaWNfc3RyaW5nKGJhc2ljX3N0cmluZyYmLCBjb25zdCBBbGxvY2F0b3ImKTsKKworICAgIH5iYXNpY19zdHJpbmcoKTsKKworICAgIG9wZXJhdG9yIGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+KCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICBiYXNpY19zdHJpbmcmIG9wZXJhdG9yPShjb25zdCBiYXNpY19zdHJpbmcmIHN0cik7CisgICAgYmFzaWNfc3RyaW5nJiBvcGVyYXRvcj0oYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4gc3YpOworICAgIGJhc2ljX3N0cmluZyYgb3BlcmF0b3I9KGJhc2ljX3N0cmluZyYmIHN0cikKKyAgICAgICAgbm9leGNlcHQoCisgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZSB8fAorICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOjppc19hbHdheXNfZXF1YWw6OnZhbHVlICk7IC8vIEMrKzE3CisgICAgYmFzaWNfc3RyaW5nJiBvcGVyYXRvcj0oY29uc3QgdmFsdWVfdHlwZSogcyk7CisgICAgYmFzaWNfc3RyaW5nJiBvcGVyYXRvcj0odmFsdWVfdHlwZSBjKTsKKyAgICBiYXNpY19zdHJpbmcmIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+KTsKKworICAgIGl0ZXJhdG9yICAgICAgIGJlZ2luKCkgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCBub2V4Y2VwdDsKKyAgICBpdGVyYXRvciAgICAgICBlbmQoKSBub2V4Y2VwdDsKKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIHJldmVyc2VfaXRlcmF0b3IgICAgICAgcmJlZ2luKCkgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCBub2V4Y2VwdDsKKyAgICByZXZlcnNlX2l0ZXJhdG9yICAgICAgIHJlbmQoKSBub2V4Y2VwdDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgICAgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0OworCisgICAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgbGVuZ3RoKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgc2l6ZV90eXBlIGNhcGFjaXR5KCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbiwgdmFsdWVfdHlwZSBjKTsKKyAgICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbik7CisKKyAgICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIHJlc19hcmcgPSAwKTsKKyAgICB2b2lkIHNocmlua190b19maXQoKTsKKyAgICB2b2lkIGNsZWFyKCkgbm9leGNlcHQ7CisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IG5vZXhjZXB0OworCisgICAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIHBvcykgY29uc3Q7CisgICAgcmVmZXJlbmNlICAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIHBvcyk7CisKKyAgICBjb25zdF9yZWZlcmVuY2UgYXQoc2l6ZV90eXBlIG4pIGNvbnN0OworICAgIHJlZmVyZW5jZSAgICAgICBhdChzaXplX3R5cGUgbik7CisKKyAgICBiYXNpY19zdHJpbmcmIG9wZXJhdG9yKz0oY29uc3QgYmFzaWNfc3RyaW5nJiBzdHIpOworICAgIGJhc2ljX3N0cmluZyYgb3BlcmF0b3IrPShiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiBzdik7CisgICAgYmFzaWNfc3RyaW5nJiBvcGVyYXRvcis9KGNvbnN0IHZhbHVlX3R5cGUqIHMpOworICAgIGJhc2ljX3N0cmluZyYgb3BlcmF0b3IrPSh2YWx1ZV90eXBlIGMpOworICAgIGJhc2ljX3N0cmluZyYgb3BlcmF0b3IrPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+KTsKKworICAgIGJhc2ljX3N0cmluZyYgYXBwZW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyKTsKKyAgICBiYXNpY19zdHJpbmcmIGFwcGVuZChiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiBzdik7CisgICAgYmFzaWNfc3RyaW5nJiBhcHBlbmQoY29uc3QgYmFzaWNfc3RyaW5nJiBzdHIsIHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuPW5wb3MpOyAvL0MrKzE0CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgICAgIGJhc2ljX3N0cmluZyYgYXBwZW5kKGNvbnN0IFQmIHQsIHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuPW5wb3MpOyAvLyBDKysxNworICAgIGJhc2ljX3N0cmluZyYgYXBwZW5kKGNvbnN0IHZhbHVlX3R5cGUqIHMsIHNpemVfdHlwZSBuKTsKKyAgICBiYXNpY19zdHJpbmcmIGFwcGVuZChjb25zdCB2YWx1ZV90eXBlKiBzKTsKKyAgICBiYXNpY19zdHJpbmcmIGFwcGVuZChzaXplX3R5cGUgbiwgdmFsdWVfdHlwZSBjKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICBiYXNpY19zdHJpbmcmIGFwcGVuZChJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QpOworICAgIGJhc2ljX3N0cmluZyYgYXBwZW5kKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4pOworCisgICAgdm9pZCBwdXNoX2JhY2sodmFsdWVfdHlwZSBjKTsKKyAgICB2b2lkIHBvcF9iYWNrKCk7CisgICAgcmVmZXJlbmNlICAgICAgIGZyb250KCk7CisgICAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3Q7CisgICAgcmVmZXJlbmNlICAgICAgIGJhY2soKTsKKyAgICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0OworCisgICAgYmFzaWNfc3RyaW5nJiBhc3NpZ24oY29uc3QgYmFzaWNfc3RyaW5nJiBzdHIpOworICAgIGJhc2ljX3N0cmluZyYgYXNzaWduKGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHN2KTsKKyAgICBiYXNpY19zdHJpbmcmIGFzc2lnbihiYXNpY19zdHJpbmcmJiBzdHIpOworICAgIGJhc2ljX3N0cmluZyYgYXNzaWduKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbj1ucG9zKTsgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgICAgYmFzaWNfc3RyaW5nJiBhc3NpZ24oY29uc3QgVCYgdCwgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG49bnBvcyk7IC8vIEMrKzE3CisgICAgYmFzaWNfc3RyaW5nJiBhc3NpZ24oY29uc3QgdmFsdWVfdHlwZSogcywgc2l6ZV90eXBlIG4pOworICAgIGJhc2ljX3N0cmluZyYgYXNzaWduKGNvbnN0IHZhbHVlX3R5cGUqIHMpOworICAgIGJhc2ljX3N0cmluZyYgYXNzaWduKHNpemVfdHlwZSBuLCB2YWx1ZV90eXBlIGMpOworICAgIHRlbXBsYXRlPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIGJhc2ljX3N0cmluZyYgYXNzaWduKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCk7CisgICAgYmFzaWNfc3RyaW5nJiBhc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPik7CisKKyAgICBiYXNpY19zdHJpbmcmIGluc2VydChzaXplX3R5cGUgcG9zMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBzdHIpOworICAgIGJhc2ljX3N0cmluZyYgaW5zZXJ0KHNpemVfdHlwZSBwb3MxLCBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiBzdik7CisgICAgYmFzaWNfc3RyaW5nJiBpbnNlcnQoc2l6ZV90eXBlIHBvczEsIGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBwb3MyLCBzaXplX3R5cGUgbik7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgICAgIGJhc2ljX3N0cmluZyYgaW5zZXJ0KHNpemVfdHlwZSBwb3MxLCBjb25zdCBUJiB0LCBzaXplX3R5cGUgcG9zMiwgc2l6ZV90eXBlIG4pOyAvLyBDKysxNworICAgIGJhc2ljX3N0cmluZyYgaW5zZXJ0KHNpemVfdHlwZSBwb3MsIGNvbnN0IHZhbHVlX3R5cGUqIHMsIHNpemVfdHlwZSBuPW5wb3MpOyAvL0MrKzE0CisgICAgYmFzaWNfc3RyaW5nJiBpbnNlcnQoc2l6ZV90eXBlIHBvcywgY29uc3QgdmFsdWVfdHlwZSogcyk7CisgICAgYmFzaWNfc3RyaW5nJiBpbnNlcnQoc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4sIHZhbHVlX3R5cGUgYyk7CisgICAgaXRlcmF0b3IgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcCwgdmFsdWVfdHlwZSBjKTsKKyAgICBpdGVyYXRvciAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBwLCBzaXplX3R5cGUgbiwgdmFsdWVfdHlwZSBjKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcCwgSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0KTsKKyAgICBpdGVyYXRvciAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBwLCBpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+KTsKKworICAgIGJhc2ljX3N0cmluZyYgZXJhc2Uoc2l6ZV90eXBlIHBvcyA9IDAsIHNpemVfdHlwZSBuID0gbnBvcyk7CisgICAgaXRlcmF0b3IgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBwb3NpdGlvbik7CisgICAgaXRlcmF0b3IgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCk7CisKKyAgICBiYXNpY19zdHJpbmcmIHJlcGxhY2Uoc2l6ZV90eXBlIHBvczEsIHNpemVfdHlwZSBuMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBzdHIpOworICAgIGJhc2ljX3N0cmluZyYgcmVwbGFjZShzaXplX3R5cGUgcG9zMSwgc2l6ZV90eXBlIG4xLCBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiBzdik7CisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKHNpemVfdHlwZSBwb3MxLCBzaXplX3R5cGUgbjEsIGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgcG9zMiwgc2l6ZV90eXBlIG4yPW5wb3MpOyAvLyBDKysxNAorICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgICAgICBiYXNpY19zdHJpbmcmIHJlcGxhY2Uoc2l6ZV90eXBlIHBvczEsIHNpemVfdHlwZSBuMSwgY29uc3QgVCYgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBwb3MyLCBzaXplX3R5cGUgbik7IC8vIEMrKzE3CisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuMSwgY29uc3QgdmFsdWVfdHlwZSogcywgc2l6ZV90eXBlIG4yKTsKKyAgICBiYXNpY19zdHJpbmcmIHJlcGxhY2Uoc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4xLCBjb25zdCB2YWx1ZV90eXBlKiBzKTsKKyAgICBiYXNpY19zdHJpbmcmIHJlcGxhY2Uoc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4xLCBzaXplX3R5cGUgbjIsIHZhbHVlX3R5cGUgYyk7CisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKGNvbnN0X2l0ZXJhdG9yIGkxLCBjb25zdF9pdGVyYXRvciBpMiwgY29uc3QgYmFzaWNfc3RyaW5nJiBzdHIpOworICAgIGJhc2ljX3N0cmluZyYgcmVwbGFjZShjb25zdF9pdGVyYXRvciBpMSwgY29uc3RfaXRlcmF0b3IgaTIsIGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHN2KTsKKyAgICBiYXNpY19zdHJpbmcmIHJlcGxhY2UoY29uc3RfaXRlcmF0b3IgaTEsIGNvbnN0X2l0ZXJhdG9yIGkyLCBjb25zdCB2YWx1ZV90eXBlKiBzLCBzaXplX3R5cGUgbik7CisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKGNvbnN0X2l0ZXJhdG9yIGkxLCBjb25zdF9pdGVyYXRvciBpMiwgY29uc3QgdmFsdWVfdHlwZSogcyk7CisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKGNvbnN0X2l0ZXJhdG9yIGkxLCBjb25zdF9pdGVyYXRvciBpMiwgc2l6ZV90eXBlIG4sIHZhbHVlX3R5cGUgYyk7CisgICAgdGVtcGxhdGU8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKGNvbnN0X2l0ZXJhdG9yIGkxLCBjb25zdF9pdGVyYXRvciBpMiwgSW5wdXRJdGVyYXRvciBqMSwgSW5wdXRJdGVyYXRvciBqMik7CisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKGNvbnN0X2l0ZXJhdG9yIGkxLCBjb25zdF9pdGVyYXRvciBpMiwgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPik7CisKKyAgICBzaXplX3R5cGUgY29weSh2YWx1ZV90eXBlKiBzLCBzaXplX3R5cGUgbiwgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OworICAgIGJhc2ljX3N0cmluZyBzdWJzdHIoc2l6ZV90eXBlIHBvcyA9IDAsIHNpemVfdHlwZSBuID0gbnBvcykgY29uc3Q7CisKKyAgICB2b2lkIHN3YXAoYmFzaWNfc3RyaW5nJiBzdHIpCisgICAgICAgIG5vZXhjZXB0KGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+Ojpwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXA6OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+Ojppc19hbHdheXNfZXF1YWw6OnZhbHVlKTsgIC8vIEMrKzE3CisKKyAgICBjb25zdCB2YWx1ZV90eXBlKiBjX3N0cigpIGNvbnN0IG5vZXhjZXB0OworICAgIGNvbnN0IHZhbHVlX3R5cGUqIGRhdGEoKSBjb25zdCBub2V4Y2VwdDsKKyAgICAgICAgICB2YWx1ZV90eXBlKiBkYXRhKCkgICAgICAgbm9leGNlcHQ7ICAgLy8gQysrMTcKKworICAgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIHNpemVfdHlwZSBmaW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Qgbm9leGNlcHQ7CisgICAgc2l6ZV90eXBlIGZpbmQoYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4gc3YsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgZmluZChjb25zdCB2YWx1ZV90eXBlKiBzLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbikgY29uc3Qgbm9leGNlcHQ7CisgICAgc2l6ZV90eXBlIGZpbmQoY29uc3QgdmFsdWVfdHlwZSogcywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0IG5vZXhjZXB0OworICAgIHNpemVfdHlwZSBmaW5kKHZhbHVlX3R5cGUgYywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0IG5vZXhjZXB0OworCisgICAgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Qgbm9leGNlcHQ7CisgICAgc2l6ZV90eXBlIHJmaW5kKGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHN2LCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Qgbm9leGNlcHQ7CisgICAgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IHZhbHVlX3R5cGUqIHMsIHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuKSBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgcmZpbmQoY29uc3QgdmFsdWVfdHlwZSogcywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0IG5vZXhjZXB0OworICAgIHNpemVfdHlwZSByZmluZCh2YWx1ZV90eXBlIGMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdCBub2V4Y2VwdDsKKworICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Qgbm9leGNlcHQ7CisgICAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4gc3YsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjb25zdCB2YWx1ZV90eXBlKiBzLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbikgY29uc3Qgbm9leGNlcHQ7CisgICAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoY29uc3QgdmFsdWVfdHlwZSogcywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0IG5vZXhjZXB0OworICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKHZhbHVlX3R5cGUgYywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0IG5vZXhjZXB0OworCisgICAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjb25zdCBiYXNpY19zdHJpbmcmIHN0ciwgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0IG5vZXhjZXB0OworICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4gc3YsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IHZhbHVlX3R5cGUqIHMsIHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuKSBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IHZhbHVlX3R5cGUqIHMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgZmluZF9sYXN0X29mKHZhbHVlX3R5cGUgYywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0IG5vZXhjZXB0OworCisgICAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Qgbm9leGNlcHQ7CisgICAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHN2LCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Qgbm9leGNlcHQ7CisgICAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IHZhbHVlX3R5cGUqIHMsIHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuKSBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgdmFsdWVfdHlwZSogcywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0IG5vZXhjZXB0OworICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZih2YWx1ZV90eXBlIGMsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdCBub2V4Y2VwdDsKKworICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Qgbm9leGNlcHQ7CisgICAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4gc3YsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZihjb25zdCB2YWx1ZV90eXBlKiBzLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbikgY29uc3Qgbm9leGNlcHQ7CisgICAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgdmFsdWVfdHlwZSogcywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0IG5vZXhjZXB0OworICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKHZhbHVlX3R5cGUgYywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0IG5vZXhjZXB0OworCisgICAgaW50IGNvbXBhcmUoY29uc3QgYmFzaWNfc3RyaW5nJiBzdHIpIGNvbnN0IG5vZXhjZXB0OworICAgIGludCBjb21wYXJlKGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHN2KSBjb25zdCBub2V4Y2VwdDsKKyAgICBpbnQgY29tcGFyZShzaXplX3R5cGUgcG9zMSwgc2l6ZV90eXBlIG4xLCBjb25zdCBiYXNpY19zdHJpbmcmIHN0cikgY29uc3Q7CisgICAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIHBvczEsIHNpemVfdHlwZSBuMSwgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4gc3YpIGNvbnN0OworICAgIGludCBjb21wYXJlKHNpemVfdHlwZSBwb3MxLCBzaXplX3R5cGUgbjEsIGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgIHNpemVfdHlwZSBwb3MyLCBzaXplX3R5cGUgbjI9bnBvcykgY29uc3Q7IC8vIEMrKzE0CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgICAgIGludCBjb21wYXJlKHNpemVfdHlwZSBwb3MxLCBzaXplX3R5cGUgbjEsIGNvbnN0IFQmIHQsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBwb3MyLCBzaXplX3R5cGUgbjI9bnBvcykgY29uc3Q7IC8vIEMrKzE3CisgICAgaW50IGNvbXBhcmUoY29uc3QgdmFsdWVfdHlwZSogcykgY29uc3Qgbm9leGNlcHQ7CisgICAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIHBvczEsIHNpemVfdHlwZSBuMSwgY29uc3QgdmFsdWVfdHlwZSogcykgY29uc3Q7CisgICAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIHBvczEsIHNpemVfdHlwZSBuMSwgY29uc3QgdmFsdWVfdHlwZSogcywgc2l6ZV90eXBlIG4yKSBjb25zdDsKKworICAgIGJvb2wgc3RhcnRzX3dpdGgoYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4gc3YpIGNvbnN0IG5vZXhjZXB0OyAvLyBDKysyYQorICAgIGJvb2wgc3RhcnRzX3dpdGgoY2hhclQgYykgY29uc3Qgbm9leGNlcHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysyYQorICAgIGJvb2wgc3RhcnRzX3dpdGgoY29uc3QgY2hhclQqIHMpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysyYQorICAgIGJvb2wgZW5kc193aXRoKGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHN2KSBjb25zdCBub2V4Y2VwdDsgICAvLyBDKysyYQorICAgIGJvb2wgZW5kc193aXRoKGNoYXJUIGMpIGNvbnN0IG5vZXhjZXB0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysyYQorICAgIGJvb2wgZW5kc193aXRoKGNvbnN0IGNoYXJUKiBzKSBjb25zdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysyYQorCisgICAgYm9vbCBfX2ludmFyaWFudHMoKSBjb25zdDsKK307CisKK3RlbXBsYXRlPGNsYXNzIElucHV0SXRlcmF0b3IsCisgICAgICAgICBjbGFzcyBBbGxvY2F0b3IgPSBhbGxvY2F0b3I8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPElucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPj4KK2Jhc2ljX3N0cmluZyhJbnB1dEl0ZXJhdG9yLCBJbnB1dEl0ZXJhdG9yLCBBbGxvY2F0b3IgPSBBbGxvY2F0b3IoKSkKKyAgIC0+IGJhc2ljX3N0cmluZzx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8SW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICBjaGFyX3RyYWl0czx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8SW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgICAgQWxsb2NhdG9yPjsgICAvLyBDKysxNworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPgorb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBsaHMsCisgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocyk7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+CitvcGVyYXRvcisoY29uc3QgY2hhclQqIGxocyAsIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCx0cmFpdHMsQWxsb2NhdG9yPiZyaHMpOworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPgorb3BlcmF0b3IrKGNoYXJUIGxocywgY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULHRyYWl0cyxBbGxvY2F0b3I+JiByaHMpOworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPgorb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBsaHMsIGNvbnN0IGNoYXJUKiByaHMpOworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPgorb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBsaHMsIGNoYXJUIHJocyk7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgbGhzLAorICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiByaHMpIG5vZXhjZXB0OworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+Citib29sIG9wZXJhdG9yPT0oY29uc3QgY2hhclQqIGxocywgY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocykgbm9leGNlcHQ7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsdHJhaXRzLEFsbG9jYXRvcj4mIGxocywgY29uc3QgY2hhclQqIHJocykgbm9leGNlcHQ7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsdHJhaXRzLEFsbG9jYXRvcj4mIGxocywKKyAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgcmhzKSBub2V4Y2VwdDsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNoYXJUKiBsaHMsIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiByaHMpIG5vZXhjZXB0OworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+Citib29sIG9wZXJhdG9yIT0oY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywgY29uc3QgY2hhclQqIHJocykgbm9leGNlcHQ7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wgb3BlcmF0b3I8IChjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgbGhzLAorICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiByaHMpIG5vZXhjZXB0OworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+Citib29sIG9wZXJhdG9yPCAoY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywgY29uc3QgY2hhclQqIHJocykgbm9leGNlcHQ7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wgb3BlcmF0b3I8IChjb25zdCBjaGFyVCogbGhzLCBjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgcmhzKSBub2V4Y2VwdDsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorYm9vbCBvcGVyYXRvcj4gKGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBsaHMsCisgICAgICAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocykgbm9leGNlcHQ7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wgb3BlcmF0b3I+IChjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgbGhzLCBjb25zdCBjaGFyVCogcmhzKSBub2V4Y2VwdDsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorYm9vbCBvcGVyYXRvcj4gKGNvbnN0IGNoYXJUKiBsaHMsIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiByaHMpIG5vZXhjZXB0OworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+Citib29sIG9wZXJhdG9yPD0oY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywKKyAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgcmhzKSBub2V4Y2VwdDsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorYm9vbCBvcGVyYXRvcjw9KGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBsaHMsIGNvbnN0IGNoYXJUKiByaHMpIG5vZXhjZXB0OworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+Citib29sIG9wZXJhdG9yPD0oY29uc3QgY2hhclQqIGxocywgY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocykgbm9leGNlcHQ7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wgb3BlcmF0b3I+PShjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgbGhzLAorICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiByaHMpIG5vZXhjZXB0OworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+Citib29sIG9wZXJhdG9yPj0oY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywgY29uc3QgY2hhclQqIHJocykgbm9leGNlcHQ7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wgb3BlcmF0b3I+PShjb25zdCBjaGFyVCogbGhzLCBjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgcmhzKSBub2V4Y2VwdDsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgordm9pZCBzd2FwKGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBsaHMsCisgICAgICAgICAgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocykKKyAgICAgICAgICAgIG5vZXhjZXB0KG5vZXhjZXB0KGxocy5zd2FwKHJocykpKTsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYgaXMsIGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBzdHIpOworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CitiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBvcywgY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHN0cik7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mCitnZXRsaW5lKGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mIGlzLCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgc3RyLAorICAgICAgICBjaGFyVCBkZWxpbSk7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mCitnZXRsaW5lKGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mIGlzLCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgc3RyKTsKKwordHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcj4gICAgc3RyaW5nOwordHlwZWRlZiBiYXNpY19zdHJpbmc8d2NoYXJfdD4gd3N0cmluZzsKK3R5cGVkZWYgYmFzaWNfc3RyaW5nPGNoYXIxNl90PiB1MTZzdHJpbmc7Cit0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyMzJfdD4gdTMyc3RyaW5nOworCitpbnQgICAgICAgICAgICAgICAgc3RvaSAgKGNvbnN0IHN0cmluZyYgc3RyLCBzaXplX3QqIGlkeCA9IDAsIGludCBiYXNlID0gMTApOworbG9uZyAgICAgICAgICAgICAgIHN0b2wgIChjb25zdCBzdHJpbmcmIHN0ciwgc2l6ZV90KiBpZHggPSAwLCBpbnQgYmFzZSA9IDEwKTsKK3Vuc2lnbmVkIGxvbmcgICAgICBzdG91bCAoY29uc3Qgc3RyaW5nJiBzdHIsIHNpemVfdCogaWR4ID0gMCwgaW50IGJhc2UgPSAxMCk7Citsb25nIGxvbmcgICAgICAgICAgc3RvbGwgKGNvbnN0IHN0cmluZyYgc3RyLCBzaXplX3QqIGlkeCA9IDAsIGludCBiYXNlID0gMTApOwordW5zaWduZWQgbG9uZyBsb25nIHN0b3VsbChjb25zdCBzdHJpbmcmIHN0ciwgc2l6ZV90KiBpZHggPSAwLCBpbnQgYmFzZSA9IDEwKTsKKworZmxvYXQgICAgICAgc3RvZiAoY29uc3Qgc3RyaW5nJiBzdHIsIHNpemVfdCogaWR4ID0gMCk7Citkb3VibGUgICAgICBzdG9kIChjb25zdCBzdHJpbmcmIHN0ciwgc2l6ZV90KiBpZHggPSAwKTsKK2xvbmcgZG91YmxlIHN0b2xkKGNvbnN0IHN0cmluZyYgc3RyLCBzaXplX3QqIGlkeCA9IDApOworCitzdHJpbmcgdG9fc3RyaW5nKGludCB2YWwpOworc3RyaW5nIHRvX3N0cmluZyh1bnNpZ25lZCB2YWwpOworc3RyaW5nIHRvX3N0cmluZyhsb25nIHZhbCk7CitzdHJpbmcgdG9fc3RyaW5nKHVuc2lnbmVkIGxvbmcgdmFsKTsKK3N0cmluZyB0b19zdHJpbmcobG9uZyBsb25nIHZhbCk7CitzdHJpbmcgdG9fc3RyaW5nKHVuc2lnbmVkIGxvbmcgbG9uZyB2YWwpOworc3RyaW5nIHRvX3N0cmluZyhmbG9hdCB2YWwpOworc3RyaW5nIHRvX3N0cmluZyhkb3VibGUgdmFsKTsKK3N0cmluZyB0b19zdHJpbmcobG9uZyBkb3VibGUgdmFsKTsKKworaW50ICAgICAgICAgICAgICAgIHN0b2kgIChjb25zdCB3c3RyaW5nJiBzdHIsIHNpemVfdCogaWR4ID0gMCwgaW50IGJhc2UgPSAxMCk7Citsb25nICAgICAgICAgICAgICAgc3RvbCAgKGNvbnN0IHdzdHJpbmcmIHN0ciwgc2l6ZV90KiBpZHggPSAwLCBpbnQgYmFzZSA9IDEwKTsKK3Vuc2lnbmVkIGxvbmcgICAgICBzdG91bCAoY29uc3Qgd3N0cmluZyYgc3RyLCBzaXplX3QqIGlkeCA9IDAsIGludCBiYXNlID0gMTApOworbG9uZyBsb25nICAgICAgICAgIHN0b2xsIChjb25zdCB3c3RyaW5nJiBzdHIsIHNpemVfdCogaWR4ID0gMCwgaW50IGJhc2UgPSAxMCk7Cit1bnNpZ25lZCBsb25nIGxvbmcgc3RvdWxsKGNvbnN0IHdzdHJpbmcmIHN0ciwgc2l6ZV90KiBpZHggPSAwLCBpbnQgYmFzZSA9IDEwKTsKKworZmxvYXQgICAgICAgc3RvZiAoY29uc3Qgd3N0cmluZyYgc3RyLCBzaXplX3QqIGlkeCA9IDApOworZG91YmxlICAgICAgc3RvZCAoY29uc3Qgd3N0cmluZyYgc3RyLCBzaXplX3QqIGlkeCA9IDApOworbG9uZyBkb3VibGUgc3RvbGQoY29uc3Qgd3N0cmluZyYgc3RyLCBzaXplX3QqIGlkeCA9IDApOworCit3c3RyaW5nIHRvX3dzdHJpbmcoaW50IHZhbCk7Cit3c3RyaW5nIHRvX3dzdHJpbmcodW5zaWduZWQgdmFsKTsKK3dzdHJpbmcgdG9fd3N0cmluZyhsb25nIHZhbCk7Cit3c3RyaW5nIHRvX3dzdHJpbmcodW5zaWduZWQgbG9uZyB2YWwpOword3N0cmluZyB0b193c3RyaW5nKGxvbmcgbG9uZyB2YWwpOword3N0cmluZyB0b193c3RyaW5nKHVuc2lnbmVkIGxvbmcgbG9uZyB2YWwpOword3N0cmluZyB0b193c3RyaW5nKGZsb2F0IHZhbCk7Cit3c3RyaW5nIHRvX3dzdHJpbmcoZG91YmxlIHZhbCk7Cit3c3RyaW5nIHRvX3dzdHJpbmcobG9uZyBkb3VibGUgdmFsKTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGhhc2g8c3RyaW5nPjsKK3RlbXBsYXRlIDw+IHN0cnVjdCBoYXNoPHUxNnN0cmluZz47Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaGFzaDx1MzJzdHJpbmc+OwordGVtcGxhdGUgPD4gc3RydWN0IGhhc2g8d3N0cmluZz47CisKK2Jhc2ljX3N0cmluZzxjaGFyPiAgICAgb3BlcmF0b3IgIiIgcyggY29uc3QgY2hhciAqc3RyLCAgICAgc2l6ZV90IGxlbiApOyAvLyBDKysxNAorYmFzaWNfc3RyaW5nPHdjaGFyX3Q+ICBvcGVyYXRvciAiIiBzKCBjb25zdCB3Y2hhcl90ICpzdHIsICBzaXplX3QgbGVuICk7IC8vIEMrKzE0CitiYXNpY19zdHJpbmc8Y2hhcjE2X3Q+IG9wZXJhdG9yICIiIHMoIGNvbnN0IGNoYXIxNl90ICpzdHIsIHNpemVfdCBsZW4gKTsgLy8gQysrMTQKK2Jhc2ljX3N0cmluZzxjaGFyMzJfdD4gb3BlcmF0b3IgIiIgcyggY29uc3QgY2hhcjMyX3QgKnN0ciwgc2l6ZV90IGxlbiApOyAvLyBDKysxNAorCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPHN0cmluZ192aWV3PgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGNzdGRpbz4gIC8vIEZvciBFT0YuCisjaW5jbHVkZSA8Y3djaGFyPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDxfX2Z1bmN0aW9uYWxfYmFzZT4KKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fVU5JQ09ERV9DSEFSUworI2luY2x1ZGUgPGNzdGRpbnQ+CisjZW5kaWYKKworI2luY2x1ZGUgPF9fZGVidWc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX1BVU0hfTUFDUk9TCisjaW5jbHVkZSA8X191bmRlZl9tYWNyb3M+CisKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKKy8vIGZwb3MKKwordGVtcGxhdGUgPGNsYXNzIF9TdGF0ZVQ+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBmcG9zCit7Citwcml2YXRlOgorICAgIF9TdGF0ZVQgX19zdF87CisgICAgc3RyZWFtb2ZmIF9fb2ZmXzsKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZwb3Moc3RyZWFtb2ZmIF9fb2ZmID0gc3RyZWFtb2ZmKCkpIDogX19zdF8oKSwgX19vZmZfKF9fb2ZmKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBvcGVyYXRvciBzdHJlYW1vZmYoKSBjb25zdCB7cmV0dXJuIF9fb2ZmXzt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9TdGF0ZVQgc3RhdGUoKSBjb25zdCB7cmV0dXJuIF9fc3RfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgc3RhdGUoX1N0YXRlVCBfX3N0KSB7X19zdF8gPSBfX3N0O30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZnBvcyYgb3BlcmF0b3IrPShzdHJlYW1vZmYgX19vZmYpIHtfX29mZl8gKz0gX19vZmY7IHJldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmcG9zICBvcGVyYXRvcisgKHN0cmVhbW9mZiBfX29mZikgY29uc3Qge2Zwb3MgX190KCp0aGlzKTsgX190ICs9IF9fb2ZmOyByZXR1cm4gX190O30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZwb3MmIG9wZXJhdG9yLT0oc3RyZWFtb2ZmIF9fb2ZmKSB7X19vZmZfIC09IF9fb2ZmOyByZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZnBvcyAgb3BlcmF0b3ItIChzdHJlYW1vZmYgX19vZmYpIGNvbnN0IHtmcG9zIF9fdCgqdGhpcyk7IF9fdCAtPSBfX29mZjsgcmV0dXJuIF9fdDt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1N0YXRlVD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitzdHJlYW1vZmYgb3BlcmF0b3ItKGNvbnN0IGZwb3M8X1N0YXRlVD4mIF9feCwgY29uc3QgZnBvczxfU3RhdGVUPiYgX195KQorICAgIHtyZXR1cm4gc3RyZWFtb2ZmKF9feCkgLSBzdHJlYW1vZmYoX195KTt9CisKK3RlbXBsYXRlIDxjbGFzcyBfU3RhdGVUPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBmcG9zPF9TdGF0ZVQ+JiBfX3gsIGNvbnN0IGZwb3M8X1N0YXRlVD4mIF9feSkKKyAgICB7cmV0dXJuIHN0cmVhbW9mZihfX3gpID09IHN0cmVhbW9mZihfX3kpO30KKwordGVtcGxhdGUgPGNsYXNzIF9TdGF0ZVQ+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBvcGVyYXRvciE9KGNvbnN0IGZwb3M8X1N0YXRlVD4mIF9feCwgY29uc3QgZnBvczxfU3RhdGVUPiYgX195KQorICAgIHtyZXR1cm4gc3RyZWFtb2ZmKF9feCkgIT0gc3RyZWFtb2ZmKF9feSk7fQorCisvLyBiYXNpY19zdHJpbmcKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK29wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX194LAorICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3kpOworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPgorb3BlcmF0b3IrKGNvbnN0IF9DaGFyVCogX194LCBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9feSk7CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+CitvcGVyYXRvcisoX0NoYXJUIF9feCwgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3kpOworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPgorb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3gsIGNvbnN0IF9DaGFyVCogX195KTsKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK29wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX194LCBfQ2hhclQgX195KTsKKworX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoX0xJQkNQUF9GVU5DX1ZJUyBzdHJpbmcgb3BlcmF0b3IrPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPihjaGFyIGNvbnN0Kiwgc3RyaW5nIGNvbnN0JikpCisKK3RlbXBsYXRlIDxib29sPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19iYXNpY19zdHJpbmdfY29tbW9uCit7Citwcm90ZWN0ZWQ6CisgICAgX0xJQkNQUF9OT1JFVFVSTiB2b2lkIF9fdGhyb3dfbGVuZ3RoX2Vycm9yKCkgY29uc3Q7CisgICAgX0xJQkNQUF9OT1JFVFVSTiB2b2lkIF9fdGhyb3dfb3V0X29mX3JhbmdlKCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Ym9vbCBfX2I+Cit2b2lkCitfX2Jhc2ljX3N0cmluZ19jb21tb248X19iPjo6X190aHJvd19sZW5ndGhfZXJyb3IoKSBjb25zdAoreworICAgIF9WU1REOjpfX3Rocm93X2xlbmd0aF9lcnJvcigiYmFzaWNfc3RyaW5nIik7Cit9CisKK3RlbXBsYXRlIDxib29sIF9fYj4KK3ZvaWQKK19fYmFzaWNfc3RyaW5nX2NvbW1vbjxfX2I+OjpfX3Rocm93X291dF9vZl9yYW5nZSgpIGNvbnN0Cit7CisgICAgX1ZTVEQ6Ol9fdGhyb3dfb3V0X29mX3JhbmdlKCJiYXNpY19zdHJpbmciKTsKK30KKworX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoY2xhc3MgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfVFlQRV9WSVMgX19iYXNpY19zdHJpbmdfY29tbW9uPHRydWU+KQorCisjaWZkZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CitzdHJ1Y3QgX19saWJjcHBfc3RyaW5nX2dldHNfbm9leGNlcHRfaXRlcmF0b3JfaW1wbCA6IHB1YmxpYyB0cnVlX3R5cGUge307CisjZWxpZiBkZWZpbmVkKF9MSUJDUFBfSEFTX05PX05PRVhDRVBUKQordGVtcGxhdGUgPGNsYXNzIF9JdGVyPgorc3RydWN0IF9fbGliY3BwX3N0cmluZ19nZXRzX25vZXhjZXB0X2l0ZXJhdG9yX2ltcGwgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXIsIGJvb2wgPSBfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0l0ZXI+Ojp2YWx1ZT4KK3N0cnVjdCBfX2xpYmNwcF9zdHJpbmdfZ2V0c19ub2V4Y2VwdF9pdGVyYXRvcl9pbXBsIDogcHVibGljIF9MSUJDUFBfQk9PTF9DT05TVEFOVCgoCisgICAgbm9leGNlcHQoKysoZGVjbHZhbDxfSXRlciY+KCkpKSAmJiAKKyAgICBpc19ub3Rocm93X2Fzc2lnbmFibGU8X0l0ZXImLCBfSXRlcj46OnZhbHVlICYmIAorICAgIG5vZXhjZXB0KGRlY2x2YWw8X0l0ZXI+KCkgPT0gZGVjbHZhbDxfSXRlcj4oKSkgJiYgCisgICAgbm9leGNlcHQoKmRlY2x2YWw8X0l0ZXI+KCkpCispKSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9JdGVyPiAKK3N0cnVjdCBfX2xpYmNwcF9zdHJpbmdfZ2V0c19ub2V4Y2VwdF9pdGVyYXRvcl9pbXBsPF9JdGVyLCBmYWxzZT4gOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKKyNlbmRpZgorCisKK3RlbXBsYXRlIDxjbGFzcyBfSXRlcj4KK3N0cnVjdCBfX2xpYmNwcF9zdHJpbmdfZ2V0c19ub2V4Y2VwdF9pdGVyYXRvcgorICAgIDogcHVibGljIF9MSUJDUFBfQk9PTF9DT05TVEFOVChfX2xpYmNwcF9pc190cml2aWFsX2l0ZXJhdG9yPF9JdGVyPjo6dmFsdWUgfHwgX19saWJjcHBfc3RyaW5nX2dldHNfbm9leGNlcHRfaXRlcmF0b3JfaW1wbDxfSXRlcj46OnZhbHVlKSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX1RwPgorc3RydWN0IF9fY2FuX2JlX2NvbnZlcnRlZF90b19zdHJpbmdfdmlldyA6IHB1YmxpYyBfTElCQ1BQX0JPT0xfQ09OU1RBTlQoCisgICAgKCBpc19jb252ZXJ0aWJsZTxjb25zdCBfVHAmLCBiYXNpY19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHM+ID46OnZhbHVlICYmCisgICAgICFpc19jb252ZXJ0aWJsZTxjb25zdCBfVHAmLCBjb25zdCBfQ2hhclQqPjo6dmFsdWUpKSB7fTsKKworI2lmZGVmIF9MSUJDUFBfQUJJX0FMVEVSTkFURV9TVFJJTkdfTEFZT1VUCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIHNpemVfdCA9IHNpemVvZihfQ2hhclQpPgorc3RydWN0IF9fcGFkZGluZworeworICAgIHVuc2lnbmVkIGNoYXIgX194eFtzaXplb2YoX0NoYXJUKS0xXTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitzdHJ1Y3QgX19wYWRkaW5nPF9DaGFyVCwgMT4KK3sKK307CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9BQklfQUxURVJOQVRFX1NUUklOR19MQVlPVVQKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgYmFzaWNfc3RyaW5nCisgICAgOiBwcml2YXRlIF9fYmFzaWNfc3RyaW5nX2NvbW1vbjx0cnVlPgoreworcHVibGljOgorICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zZWxmOworICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICAgX19zZWxmX3ZpZXc7CisgICAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+ICAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnNpemVfdHlwZSAgICAgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OmRpZmZlcmVuY2VfdHlwZSAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnBvaW50ZXIgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpjb25zdF9wb2ludGVyICAgICAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICBzdGF0aWNfYXNzZXJ0KCghaXNfYXJyYXk8dmFsdWVfdHlwZT46OnZhbHVlKSwgIkNoYXJhY3RlciB0eXBlIG9mIGJhc2ljX3N0cmluZyBtdXN0IG5vdCBiZSBhbiBhcnJheSIpOworICAgIHN0YXRpY19hc3NlcnQoKCBpc19zdGFuZGFyZF9sYXlvdXQ8dmFsdWVfdHlwZT46OnZhbHVlKSwgIkNoYXJhY3RlciB0eXBlIG9mIGJhc2ljX3N0cmluZyBtdXN0IGJlIHN0YW5kYXJkLWxheW91dCIpOworICAgIHN0YXRpY19hc3NlcnQoKCBpc190cml2aWFsPHZhbHVlX3R5cGU+Ojp2YWx1ZSksICJDaGFyYWN0ZXIgdHlwZSBvZiBiYXNpY19zdHJpbmcgbXVzdCBiZSB0cml2aWFsIik7CisgICAgc3RhdGljX2Fzc2VydCgoIGlzX3NhbWU8X0NoYXJULCB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6Y2hhcl90eXBlPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgInRyYWl0c190eXBlOjpjaGFyX3R5cGUgbXVzdCBiZSB0aGUgc2FtZSB0eXBlIGFzIENoYXJUIik7CisgICAgc3RhdGljX2Fzc2VydCgoIGlzX3NhbWU8dHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnZhbHVlX3R5cGUsIHZhbHVlX3R5cGU+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAiQWxsb2NhdG9yOjp2YWx1ZV90eXBlIG11c3QgYmUgc2FtZSB0eXBlIGFzIHZhbHVlX3R5cGUiKTsKKyNpZiBkZWZpbmVkKF9MSUJDUFBfUkFXX0lURVJBVE9SUykKKyAgICB0eXBlZGVmIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgY29uc3RfcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisjZWxzZSAgLy8gZGVmaW5lZChfTElCQ1BQX1JBV19JVEVSQVRPUlMpCisgICAgdHlwZWRlZiBfX3dyYXBfaXRlcjxwb2ludGVyPiAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9fd3JhcF9pdGVyPGNvbnN0X3BvaW50ZXI+ICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworI2VuZGlmICAvLyBkZWZpbmVkKF9MSUJDUFBfUkFXX0lURVJBVE9SUykKKyAgICB0eXBlZGVmIF9WU1REOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgIHR5cGVkZWYgX1ZTVEQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKK3ByaXZhdGU6CisKKyNpZmRlZiBfTElCQ1BQX0FCSV9BTFRFUk5BVEVfU1RSSU5HX0xBWU9VVAorCisgICAgc3RydWN0IF9fbG9uZworICAgIHsKKyAgICAgICAgcG9pbnRlciAgIF9fZGF0YV87CisgICAgICAgIHNpemVfdHlwZSBfX3NpemVfOworICAgICAgICBzaXplX3R5cGUgX19jYXBfOworICAgIH07CisKKyNpZmRlZiBfTElCQ1BQX0JJR19FTkRJQU4KKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIF9fc2hvcnRfbWFzayA9IDB4MDE7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdHlwZSBfX2xvbmdfbWFzayAgPSAweDF1bDsKKyNlbHNlICAvLyBfTElCQ1BQX0JJR19FTkRJQU4KKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIF9fc2hvcnRfbWFzayA9IDB4ODA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdHlwZSBfX2xvbmdfbWFzayAgPSB+KHNpemVfdHlwZSh+MCkgPj4gMSk7CisjZW5kaWYgIC8vIF9MSUJDUFBfQklHX0VORElBTgorCisgICAgZW51bSB7X19taW5fY2FwID0gKHNpemVvZihfX2xvbmcpIC0gMSkvc2l6ZW9mKHZhbHVlX3R5cGUpID4gMiA/CisgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihfX2xvbmcpIC0gMSkvc2l6ZW9mKHZhbHVlX3R5cGUpIDogMn07CisKKyAgICBzdHJ1Y3QgX19zaG9ydAorICAgIHsKKyAgICAgICAgdmFsdWVfdHlwZSBfX2RhdGFfW19fbWluX2NhcF07CisgICAgICAgIHN0cnVjdAorICAgICAgICAgICAgOiBfX3BhZGRpbmc8dmFsdWVfdHlwZT4KKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBfX3NpemVfOworICAgICAgICB9OworICAgIH07CisKKyNlbHNlCisKKyAgICBzdHJ1Y3QgX19sb25nCisgICAgeworICAgICAgICBzaXplX3R5cGUgX19jYXBfOworICAgICAgICBzaXplX3R5cGUgX19zaXplXzsKKyAgICAgICAgcG9pbnRlciAgIF9fZGF0YV87CisgICAgfTsKKworI2lmZGVmIF9MSUJDUFBfQklHX0VORElBTgorICAgIHN0YXRpYyBjb25zdCBzaXplX3R5cGUgX19zaG9ydF9tYXNrID0gMHg4MDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIF9fbG9uZ19tYXNrICA9IH4oc2l6ZV90eXBlKH4wKSA+PiAxKTsKKyNlbHNlICAvLyBfTElCQ1BQX0JJR19FTkRJQU4KKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIF9fc2hvcnRfbWFzayA9IDB4MDE7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdHlwZSBfX2xvbmdfbWFzayAgPSAweDF1bDsKKyNlbmRpZiAgLy8gX0xJQkNQUF9CSUdfRU5ESUFOCisKKyAgICBlbnVtIHtfX21pbl9jYXAgPSAoc2l6ZW9mKF9fbG9uZykgLSAxKS9zaXplb2YodmFsdWVfdHlwZSkgPiAyID8KKyAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKF9fbG9uZykgLSAxKS9zaXplb2YodmFsdWVfdHlwZSkgOiAyfTsKKworICAgIHN0cnVjdCBfX3Nob3J0CisgICAgeworICAgICAgICB1bmlvbgorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIF9fc2l6ZV87CisgICAgICAgICAgICB2YWx1ZV90eXBlIF9fbHg7CisgICAgICAgIH07CisgICAgICAgIHZhbHVlX3R5cGUgX19kYXRhX1tfX21pbl9jYXBdOworICAgIH07CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9BQklfQUxURVJOQVRFX1NUUklOR19MQVlPVVQKKworICAgIHVuaW9uIF9fdWx4e19fbG9uZyBfX2x4OyBfX3Nob3J0IF9fbHh4O307CisKKyAgICBlbnVtIHtfX25fd29yZHMgPSBzaXplb2YoX191bHgpIC8gc2l6ZW9mKHNpemVfdHlwZSl9OworCisgICAgc3RydWN0IF9fcmF3CisgICAgeworICAgICAgICBzaXplX3R5cGUgX193b3Jkc1tfX25fd29yZHNdOworICAgIH07CisKKyAgICBzdHJ1Y3QgX19yZXAKKyAgICB7CisgICAgICAgIHVuaW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fbG9uZyAgX19sOworICAgICAgICAgICAgX19zaG9ydCBfX3M7CisgICAgICAgICAgICBfX3JhdyAgIF9fcjsKKyAgICAgICAgfTsKKyAgICB9OworCisgICAgX19jb21wcmVzc2VkX3BhaXI8X19yZXAsIGFsbG9jYXRvcl90eXBlPiBfX3JfOworCitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IHNpemVfdHlwZSBucG9zID0gLTE7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJhc2ljX3N0cmluZygpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IGJhc2ljX3N0cmluZyhjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2lmIF9MSUJDUFBfU1REX1ZFUiA8PSAxNAorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpOworI2Vsc2UKKyAgICAgICAgX05PRVhDRVBUOworI2VuZGlmCisKKyAgICBiYXNpY19zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cik7CisgICAgYmFzaWNfc3RyaW5nKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmcoYmFzaWNfc3RyaW5nJiYgX19zdHIpCisjaWYgX0xJQkNQUF9TVERfVkVSIDw9IDE0CisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisjZWxzZQorICAgICAgICBfTk9FWENFUFQ7CisjZW5kaWYKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmcoYmFzaWNfc3RyaW5nJiYgX19zdHIsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcyk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgY29uc3QgX0FsbG9jYXRvciYgX19hKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfQWxsb2NhdG9yJiBfX2EpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmcoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYyk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX3N0cmluZyhzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jLCBjb25zdCBfQWxsb2NhdG9yJiBfX2EpOworICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsCisgICAgICAgICAgICAgICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSk7CisgICAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgICAgICBfTElCQ1BQX01FVEhPRF9URU1QTEFURV9JTVBMSUNJVF9JTlNUQU5USUFUSU9OX1ZJUworICAgICAgICBiYXNpY19zdHJpbmcoY29uc3QgX1RwJiBfX3QsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9fY2FuX2JlX2NvbnZlcnRlZF90b19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHMsIF9UcD46OnZhbHVlLCB2b2lkPjo6dHlwZSogPSAwKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0CisgICAgYmFzaWNfc3RyaW5nKF9fc2VsZl92aWV3IF9fc3YpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmcoX19zZWxmX3ZpZXcgX19zdiwgY29uc3QgX0FsbG9jYXRvciYgX19hKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBiYXNpY19zdHJpbmcoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBiYXNpY19zdHJpbmcoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX3N0cmluZyhpbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19pbCk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX3N0cmluZyhpbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19pbCwgY29uc3QgX0FsbG9jYXRvciYgX19hKTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICBpbmxpbmUgfmJhc2ljX3N0cmluZygpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG9wZXJhdG9yIF9fc2VsZl92aWV3KCkgY29uc3QgX05PRVhDRVBUIHsgcmV0dXJuIF9fc2VsZl92aWV3KGRhdGEoKSwgc2l6ZSgpKTsgfQorCisgICAgYmFzaWNfc3RyaW5nJiBvcGVyYXRvcj0oY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cik7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdGVtcGxhdGUgPGNsYXNzID0gdm9pZD4KKyNlbmRpZgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmcmIG9wZXJhdG9yPShfX3NlbGZfdmlldyBfX3N2KSAge3JldHVybiBhc3NpZ24oX19zdik7fQorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfc3RyaW5nJiBvcGVyYXRvcj0oYmFzaWNfc3RyaW5nJiYgX19zdHIpCisgICAgICAgIF9OT0VYQ0VQVF8oKF9fbm9leGNlcHRfbW92ZV9hc3NpZ25fY29udGFpbmVyPF9BbGxvY2F0b3IsIF9fYWxsb2NfdHJhaXRzPjo6dmFsdWUpKTsKKyAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX3N0cmluZyYgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkge3JldHVybiBhc3NpZ24oX19pbC5iZWdpbigpLCBfX2lsLnNpemUoKSk7fQorI2VuZGlmCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBiYXNpY19zdHJpbmcmIG9wZXJhdG9yPShjb25zdCB2YWx1ZV90eXBlKiBfX3MpIHtyZXR1cm4gYXNzaWduKF9fcyk7fQorICAgIGJhc2ljX3N0cmluZyYgb3BlcmF0b3I9KHZhbHVlX3R5cGUgX19jKTsKKworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBiZWdpbigpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGl0ZXJhdG9yKHRoaXMsIF9fZ2V0X3BvaW50ZXIoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMsIF9fZ2V0X3BvaW50ZXIoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBlbmQoKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBpdGVyYXRvcih0aGlzLCBfX2dldF9wb2ludGVyKCkgKyBzaXplKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcywgX19nZXRfcG9pbnRlcigpICsgc2l6ZSgpKTt9CisjZWxzZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBiZWdpbigpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGl0ZXJhdG9yKF9fZ2V0X3BvaW50ZXIoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9fZ2V0X3BvaW50ZXIoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBlbmQoKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBpdGVyYXRvcihfX2dldF9wb2ludGVyKCkgKyBzaXplKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfaXRlcmF0b3IoX19nZXRfcG9pbnRlcigpICsgc2l6ZSgpKTt9CisjZW5kaWYgIC8vIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBiZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgY2VuZCgpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGVuZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmJlZ2luKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gcmJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyZW5kKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gcmVuZCgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc2l6ZV90eXBlIHNpemUoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2lzX2xvbmcoKSA/IF9fZ2V0X2xvbmdfc2l6ZSgpIDogX19nZXRfc2hvcnRfc2l6ZSgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHNpemVfdHlwZSBsZW5ndGgoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBzaXplKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc2l6ZV90eXBlIGNhcGFjaXR5KCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gKF9faXNfbG9uZygpID8gX19nZXRfbG9uZ19jYXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19taW5fY2FwKSkgLSAxO30KKworICAgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX24sIHZhbHVlX3R5cGUgX19jKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX24pIHtyZXNpemUoX19uLCB2YWx1ZV90eXBlKCkpO30KKworICAgIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgX19yZXNfYXJnID0gMCk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc2hyaW5rX3RvX2ZpdCgpIF9OT0VYQ0VQVCB7cmVzZXJ2ZSgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBjbGVhcigpIF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX05PRElTQ0FSRF9BRlRFUl9DWFgxNyBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIHNpemUoKSA9PSAwO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fcG9zKSBjb25zdCBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByZWZlcmVuY2UgICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19wb3MpICAgICAgIF9OT0VYQ0VQVDsKKworICAgIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSBjb25zdDsKKyAgICByZWZlcmVuY2UgICAgICAgYXQoc2l6ZV90eXBlIF9fbik7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJhc2ljX3N0cmluZyYgb3BlcmF0b3IrPShjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKSB7cmV0dXJuIGFwcGVuZChfX3N0cik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYmFzaWNfc3RyaW5nJiBvcGVyYXRvcis9KF9fc2VsZl92aWV3IF9fc3YpICAgICAgICAgIHtyZXR1cm4gYXBwZW5kKF9fc3YpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJhc2ljX3N0cmluZyYgb3BlcmF0b3IrPShjb25zdCB2YWx1ZV90eXBlKiBfX3MpICAgICB7cmV0dXJuIGFwcGVuZChfX3MpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJhc2ljX3N0cmluZyYgb3BlcmF0b3IrPSh2YWx1ZV90eXBlIF9fYykgICAgICAgICAgICB7cHVzaF9iYWNrKF9fYyk7IHJldHVybiAqdGhpczt9CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYmFzaWNfc3RyaW5nJiBvcGVyYXRvcis9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkge3JldHVybiBhcHBlbmQoX19pbCk7fQorI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmcmIGFwcGVuZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfc3RyaW5nJiBhcHBlbmQoX19zZWxmX3ZpZXcgX19zdikgeyByZXR1cm4gYXBwZW5kKF9fc3YuZGF0YSgpLCBfX3N2LnNpemUoKSk7IH0KKyAgICBiYXNpY19zdHJpbmcmIGFwcGVuZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX249bnBvcyk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX01FVEhPRF9URU1QTEFURV9JTVBMSUNJVF9JTlNUQU5USUFUSU9OX1ZJUworICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICBfX2Nhbl9iZV9jb252ZXJ0ZWRfdG9fc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzLCBfVHA+Ojp2YWx1ZSwKKyAgICAgICAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgICAgPjo6dHlwZQorICAgICAgICAgICAgICAgICAgYXBwZW5kKGNvbnN0IF9UcCYgX190LCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX249bnBvcyk7CisgICAgYmFzaWNfc3RyaW5nJiBhcHBlbmQoY29uc3QgdmFsdWVfdHlwZSogX19zLCBzaXplX3R5cGUgX19uKTsKKyAgICBiYXNpY19zdHJpbmcmIGFwcGVuZChjb25zdCB2YWx1ZV90eXBlKiBfX3MpOworICAgIGJhc2ljX3N0cmluZyYgYXBwZW5kKHNpemVfdHlwZSBfX24sIHZhbHVlX3R5cGUgX19jKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBfTElCQ1BQX01FVEhPRF9URU1QTEFURV9JTVBMSUNJVF9JTlNUQU5USUFUSU9OX1ZJUworICAgIGJhc2ljX3N0cmluZyYgX19hcHBlbmRfZm9yd2FyZF91bnNhZmUoX0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvcik7CisgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgX0xJQkNQUF9NRVRIT0RfVEVNUExBVEVfSU1QTElDSVRfSU5TVEFOVElBVElPTl9WSVMKKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgX19pc19leGFjdGx5X2lucHV0X2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUKKyAgICAgICAgICAgICAgICB8fCAhX19saWJjcHBfc3RyaW5nX2dldHNfbm9leGNlcHRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICAgICAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBhcHBlbmQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CisgICAgICBjb25zdCBiYXNpY19zdHJpbmcgX190ZW1wIChfX2ZpcnN0LCBfX2xhc3QsIF9fYWxsb2MoKSk7CisgICAgICBhcHBlbmQoX190ZW1wLmRhdGEoKSwgX190ZW1wLnNpemUoKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIHRlbXBsYXRlPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgX0xJQkNQUF9NRVRIT0RfVEVNUExBVEVfSU1QTElDSVRfSU5TVEFOVElBVElPTl9WSVMKKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICYmIF9fbGliY3BwX3N0cmluZ19nZXRzX25vZXhjZXB0X2l0ZXJhdG9yPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICAgICAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBhcHBlbmQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkgeworICAgICAgcmV0dXJuIF9fYXBwZW5kX2ZvcndhcmRfdW5zYWZlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmcmIGFwcGVuZChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpIHtyZXR1cm4gYXBwZW5kKF9faWwuYmVnaW4oKSwgX19pbC5zaXplKCkpO30KKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICB2b2lkIHB1c2hfYmFjayh2YWx1ZV90eXBlIF9fYyk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcG9wX2JhY2soKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHJlZmVyZW5jZSAgICAgICBmcm9udCgpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByZWZlcmVuY2UgICAgICAgYmFjaygpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdDsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmcmIGFzc2lnbihfX3NlbGZfdmlldyBfX3N2KSB7IHJldHVybiBhc3NpZ24oX19zdi5kYXRhKCksIF9fc3Yuc2l6ZSgpKTsgfQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmcmIGFzc2lnbihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKSB7IHJldHVybiAqdGhpcyA9IF9fc3RyOyB9CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmcmIGFzc2lnbihiYXNpY19zdHJpbmcmJiBfX3N0cikKKyAgICAgICAgX05PRVhDRVBUXygoX19ub2V4Y2VwdF9tb3ZlX2Fzc2lnbl9jb250YWluZXI8X0FsbG9jYXRvciwgX19hbGxvY190cmFpdHM+Ojp2YWx1ZSkpCisgICAgICAgIHsqdGhpcyA9IF9WU1REOjptb3ZlKF9fc3RyKTsgcmV0dXJuICp0aGlzO30KKyNlbmRpZgorICAgIGJhc2ljX3N0cmluZyYgYXNzaWduKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbj1ucG9zKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfTUVUSE9EX1RFTVBMQVRFX0lNUExJQ0lUX0lOU1RBTlRJQVRJT05fVklTCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIF9fY2FuX2JlX2NvbnZlcnRlZF90b19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHMsIF9UcD46OnZhbHVlLAorICAgICAgICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgICA+Ojp0eXBlCisgICAgICAgICAgICAgICAgICBhc3NpZ24oY29uc3QgX1RwICYgX190LCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX249bnBvcyk7CisgICAgYmFzaWNfc3RyaW5nJiBhc3NpZ24oY29uc3QgdmFsdWVfdHlwZSogX19zLCBzaXplX3R5cGUgX19uKTsKKyAgICBiYXNpY19zdHJpbmcmIGFzc2lnbihjb25zdCB2YWx1ZV90eXBlKiBfX3MpOworICAgIGJhc2ljX3N0cmluZyYgYXNzaWduKHNpemVfdHlwZSBfX24sIHZhbHVlX3R5cGUgX19jKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICBfTElCQ1BQX01FVEhPRF9URU1QTEFURV9JTVBMSUNJVF9JTlNUQU5USUFUSU9OX1ZJUworICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgIF9faXNfZXhhY3RseV9pbnB1dF9pdGVyYXRvcjxfSW5wdXRJdGVyYXRvcj46OnZhbHVlCisgICAgICAgICAgICAgICAgfHwgIV9fbGliY3BwX3N0cmluZ19nZXRzX25vZXhjZXB0X2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgICAgICAgICBiYXNpY19zdHJpbmcmCisgICAgICAgID46OnR5cGUKKyAgICAgICAgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisgICAgdGVtcGxhdGU8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBfTElCQ1BQX01FVEhPRF9URU1QTEFURV9JTVBMSUNJVF9JTlNUQU5USUFUSU9OX1ZJUworICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICBfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlCisgICAgICAgICAgICAgICAgICYmIF9fbGliY3BwX3N0cmluZ19nZXRzX25vZXhjZXB0X2l0ZXJhdG9yPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICAgICAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBhc3NpZ24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCk7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmcmIGFzc2lnbihpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpIHtyZXR1cm4gYXNzaWduKF9faWwuYmVnaW4oKSwgX19pbC5zaXplKCkpO30KKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfc3RyaW5nJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cik7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX3N0cmluZyYgaW5zZXJ0KHNpemVfdHlwZSBfX3BvczEsIF9fc2VsZl92aWV3IF9fc3YpIHsgcmV0dXJuIGluc2VydChfX3BvczEsIF9fc3YuZGF0YSgpLCBfX3N2LnNpemUoKSk7IH0KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIF9MSUJDUFBfTUVUSE9EX1RFTVBMQVRFX0lNUExJQ0lUX0lOU1RBTlRJQVRJT05fVklTCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIF9fY2FuX2JlX2NvbnZlcnRlZF90b19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHMsIF9UcD46OnZhbHVlLAorICAgICAgICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgICA+Ojp0eXBlCisgICAgICAgICAgICAgICAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zMSwgY29uc3QgX1RwJiBfX3QsIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX249bnBvcyk7CisgICAgYmFzaWNfc3RyaW5nJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbj1ucG9zKTsKKyAgICBiYXNpY19zdHJpbmcmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUqIF9fcywgc2l6ZV90eXBlIF9fbik7CisgICAgYmFzaWNfc3RyaW5nJiBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlKiBfX3MpOworICAgIGJhc2ljX3N0cmluZyYgaW5zZXJ0KHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgdmFsdWVfdHlwZSBfX2MpOworICAgIGl0ZXJhdG9yICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCB2YWx1ZV90eXBlIF9fYyk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCB2YWx1ZV90eXBlIF9fYyk7CisgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgX0xJQkNQUF9NRVRIT0RfVEVNUExBVEVfSU1QTElDSVRfSU5TVEFOVElBVElPTl9WSVMKKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICBfX2lzX2V4YWN0bHlfaW5wdXRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZQorICAgICAgICAgICAgICAgIHx8ICFfX2xpYmNwcF9zdHJpbmdfZ2V0c19ub2V4Y2VwdF9pdGVyYXRvcjxfSW5wdXRJdGVyYXRvcj46OnZhbHVlLAorICAgICAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisgICAgdGVtcGxhdGU8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBfTElCQ1BQX01FVEhPRF9URU1QTEFURV9JTVBMSUNJVF9JTlNUQU5USUFUSU9OX1ZJUworICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICBfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlCisgICAgICAgICAgICAgICAgICYmIF9fbGliY3BwX3N0cmluZ19nZXRzX25vZXhjZXB0X2l0ZXJhdG9yPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICAgICAgICAgIGl0ZXJhdG9yCisgICAgICAgID46OnR5cGUKKyAgICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KTsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3BvcywgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQorICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIGluc2VydChfX3BvcywgX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTt9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgYmFzaWNfc3RyaW5nJiBlcmFzZShzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gbnBvcyk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3MpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBfX3NlbGZfdmlldyBfX3N2KSB7IHJldHVybiByZXBsYWNlKF9fcG9zMSwgX19uMSwgX19zdi5kYXRhKCksIF9fc3Yuc2l6ZSgpKTsgfQorICAgIGJhc2ljX3N0cmluZyYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjI9bnBvcyk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBfTElCQ1BQX01FVEhPRF9URU1QTEFURV9JTVBMSUNJVF9JTlNUQU5USUFUSU9OX1ZJUworICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICBfX2Nhbl9iZV9jb252ZXJ0ZWRfdG9fc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzLCBfVHA+Ojp2YWx1ZSwKKyAgICAgICAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgICAgPjo6dHlwZQorICAgICAgICAgICAgICAgICAgcmVwbGFjZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX1RwJiBfX3QsIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yPW5wb3MpOworICAgIGJhc2ljX3N0cmluZyYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCB2YWx1ZV90eXBlKiBfX3MsIHNpemVfdHlwZSBfX24yKTsKKyAgICBiYXNpY19zdHJpbmcmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgdmFsdWVfdHlwZSogX19zKTsKKyAgICBiYXNpY19zdHJpbmcmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgc2l6ZV90eXBlIF9fbjIsIHZhbHVlX3R5cGUgX19jKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKGNvbnN0X2l0ZXJhdG9yIF9faTEsIGNvbnN0X2l0ZXJhdG9yIF9faTIsIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmcmIHJlcGxhY2UoY29uc3RfaXRlcmF0b3IgX19pMSwgY29uc3RfaXRlcmF0b3IgX19pMiwgX19zZWxmX3ZpZXcgX19zdikgeyByZXR1cm4gcmVwbGFjZShfX2kxIC0gYmVnaW4oKSwgX19pMiAtIF9faTEsIF9fc3YpOyB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX3N0cmluZyYgcmVwbGFjZShjb25zdF9pdGVyYXRvciBfX2kxLCBjb25zdF9pdGVyYXRvciBfX2kyLCBjb25zdCB2YWx1ZV90eXBlKiBfX3MsIHNpemVfdHlwZSBfX24pOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmcmIHJlcGxhY2UoY29uc3RfaXRlcmF0b3IgX19pMSwgY29uc3RfaXRlcmF0b3IgX19pMiwgY29uc3QgdmFsdWVfdHlwZSogX19zKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKGNvbnN0X2l0ZXJhdG9yIF9faTEsIGNvbnN0X2l0ZXJhdG9yIF9faTIsIHNpemVfdHlwZSBfX24sIHZhbHVlX3R5cGUgX19jKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICBfTElCQ1BQX01FVEhPRF9URU1QTEFURV9JTVBMSUNJVF9JTlNUQU5USUFUSU9OX1ZJUworICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICBfX2lzX2lucHV0X2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgICAgICAgICBiYXNpY19zdHJpbmcmCisgICAgICAgID46OnR5cGUKKyAgICAgICAgcmVwbGFjZShjb25zdF9pdGVyYXRvciBfX2kxLCBjb25zdF9pdGVyYXRvciBfX2kyLCBfSW5wdXRJdGVyYXRvciBfX2oxLCBfSW5wdXRJdGVyYXRvciBfX2oyKTsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX3N0cmluZyYgcmVwbGFjZShjb25zdF9pdGVyYXRvciBfX2kxLCBjb25zdF9pdGVyYXRvciBfX2kyLCBpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpCisgICAgICAgIHtyZXR1cm4gcmVwbGFjZShfX2kxLCBfX2kyLCBfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpO30KKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICBzaXplX3R5cGUgY29weSh2YWx1ZV90eXBlKiBfX3MsIHNpemVfdHlwZSBfX24sIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmcgc3Vic3RyKHNpemVfdHlwZSBfX3BvcyA9IDAsIHNpemVfdHlwZSBfX24gPSBucG9zKSBjb25zdDsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAoYmFzaWNfc3RyaW5nJiBfX3N0cikKKyNpZiBfTElCQ1BQX1NURF9WRVIgPj0gMTQKKyAgICAgICAgX05PRVhDRVBUX0RFQlVHOworI2Vsc2UKKyAgICAgICAgX05PRVhDRVBUX0RFQlVHXyghX19hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgX19pc19ub3Rocm93X3N3YXBwYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKTsKKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IHZhbHVlX3R5cGUqIGNfc3RyKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gZGF0YSgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgdmFsdWVfdHlwZSogZGF0YSgpIGNvbnN0IF9OT0VYQ0VQVCAge3JldHVybiBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX2dldF9wb2ludGVyKCkpO30KKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCB8fCBkZWZpbmVkKF9MSUJDUFBfQlVJTERJTkdfTElCUkFSWSkKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmFsdWVfdHlwZSogZGF0YSgpICAgICAgICAgICAgIF9OT0VYQ0VQVCAge3JldHVybiBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX2dldF9wb2ludGVyKCkpO30KKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX2FsbG9jKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBmaW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGZpbmQoX19zZWxmX3ZpZXcgX19zdiwgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgX05PRVhDRVBUOworICAgIHNpemVfdHlwZSBmaW5kKGNvbnN0IHZhbHVlX3R5cGUqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdCBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBmaW5kKGNvbnN0IHZhbHVlX3R5cGUqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgX05PRVhDRVBUOworICAgIHNpemVfdHlwZSBmaW5kKHZhbHVlX3R5cGUgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCBfTk9FWENFUFQ7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIHJmaW5kKF9fc2VsZl92aWV3IF9fc3YsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICBzaXplX3R5cGUgcmZpbmQoY29uc3QgdmFsdWVfdHlwZSogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IHZhbHVlX3R5cGUqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QgX05PRVhDRVBUOworICAgIHNpemVfdHlwZSByZmluZCh2YWx1ZV90eXBlIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QgX05PRVhDRVBUOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoX19zZWxmX3ZpZXcgX19zdiwgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgX05PRVhDRVBUOworICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IHZhbHVlX3R5cGUqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdCBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IHZhbHVlX3R5cGUqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9vZih2YWx1ZV90eXBlIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgX05PRVhDRVBUOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZmluZF9sYXN0X29mKF9fc2VsZl92aWV3IF9fc3YsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IHZhbHVlX3R5cGUqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdCBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoY29uc3QgdmFsdWVfdHlwZSogX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdCBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YodmFsdWVfdHlwZSBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0IF9OT0VYQ0VQVDsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoX19zZWxmX3ZpZXcgX19zdiwgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgX05PRVhDRVBUOworICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCB2YWx1ZV90eXBlKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgdmFsdWVfdHlwZSogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZih2YWx1ZV90eXBlIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgX05PRVhDRVBUOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoX19zZWxmX3ZpZXcgX19zdiwgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QgX05PRVhDRVBUOworICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IHZhbHVlX3R5cGUqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdCBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IHZhbHVlX3R5cGUqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZih2YWx1ZV90eXBlIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QgX05PRVhDRVBUOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGludCBjb21wYXJlKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaW50IGNvbXBhcmUoX19zZWxmX3ZpZXcgX19zdikgY29uc3QgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpbnQgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgX19zZWxmX3ZpZXcgX19zdikgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGludCBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKSBjb25zdDsKKyAgICBpbnQgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjI9bnBvcykgY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgX19jYW5fYmVfY29udmVydGVkX3RvX3N0cmluZ192aWV3PF9DaGFyVCwgX1RyYWl0cywgX1RwPjo6dmFsdWUsCisgICAgICAgICAgICBpbnQKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfVHAmIF9fdCwgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjI9bnBvcykgY29uc3Q7CisgICAgaW50IGNvbXBhcmUoY29uc3QgdmFsdWVfdHlwZSogX19zKSBjb25zdCBfTk9FWENFUFQ7CisgICAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IHZhbHVlX3R5cGUqIF9fcykgY29uc3Q7CisgICAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IHZhbHVlX3R5cGUqIF9fcywgc2l6ZV90eXBlIF9fbjIpIGNvbnN0OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTcKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBzdGFydHNfd2l0aChfX3NlbGZfdmlldyBfX3N2KSBjb25zdCBfTk9FWENFUFQKKyAgICB7IHJldHVybiBfX3NlbGZfdmlldyhkYXRhKCksIHNpemUoKSkuc3RhcnRzX3dpdGgoX19zdik7IH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIHN0YXJ0c193aXRoKHZhbHVlX3R5cGUgX19jKSBjb25zdCBfTk9FWENFUFQKKyAgICB7IHJldHVybiAhZW1wdHkoKSAmJiBfVHJhaXRzOjplcShmcm9udCgpLCBfX2MpOyB9CisKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBzdGFydHNfd2l0aChjb25zdCB2YWx1ZV90eXBlKiBfX3MpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIHN0YXJ0c193aXRoKF9fc2VsZl92aWV3KF9fcykpOyB9CisKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBlbmRzX3dpdGgoX19zZWxmX3ZpZXcgX19zdikgY29uc3QgX05PRVhDRVBUCisgICAgeyByZXR1cm4gX19zZWxmX3ZpZXcoZGF0YSgpLCBzaXplKCkpLmVuZHNfd2l0aCggX19zdik7IH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIGVuZHNfd2l0aCh2YWx1ZV90eXBlIF9fYykgY29uc3QgX05PRVhDRVBUCisgICAgeyByZXR1cm4gIWVtcHR5KCkgJiYgX1RyYWl0czo6ZXEoYmFjaygpLCBfX2MpOyB9CisKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBlbmRzX3dpdGgoY29uc3QgdmFsdWVfdHlwZSogX19zKSBjb25zdCBfTk9FWENFUFQKKyAgICB7IHJldHVybiBlbmRzX3dpdGgoX19zZWxmX3ZpZXcoX19zKSk7IH0KKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBib29sIF9faW52YXJpYW50cygpIGNvbnN0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIF9fY2xlYXJfYW5kX3NocmluaygpOworICAgIAorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIF9faXNfbG9uZygpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGJvb2woX19yXy5maXJzdCgpLl9fcy5fX3NpemVfICYgX19zaG9ydF9tYXNrKTt9CisKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKworICAgIGJvb2wgX19kZXJlZmVyZW5jZWFibGUoY29uc3QgY29uc3RfaXRlcmF0b3IqIF9faSkgY29uc3Q7CisgICAgYm9vbCBfX2RlY3JlbWVudGFibGUoY29uc3QgY29uc3RfaXRlcmF0b3IqIF9faSkgY29uc3Q7CisgICAgYm9vbCBfX2FkZGFibGUoY29uc3QgY29uc3RfaXRlcmF0b3IqIF9faSwgcHRyZGlmZl90IF9fbikgY29uc3Q7CisgICAgYm9vbCBfX3N1YnNjcmlwdGFibGUoY29uc3QgY29uc3RfaXRlcmF0b3IqIF9faSwgcHRyZGlmZl90IF9fbikgY29uc3Q7CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisKK3ByaXZhdGU6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGFsbG9jYXRvcl90eXBlJiBfX2FsbG9jKCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19yXy5zZWNvbmQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2FsbG9jKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19yXy5zZWNvbmQoKTt9CisKKyNpZmRlZiBfTElCQ1BQX0FCSV9BTFRFUk5BVEVfU1RSSU5HX0xBWU9VVAorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19zZXRfc2hvcnRfc2l6ZShzaXplX3R5cGUgX19zKSBfTk9FWENFUFQKKyMgICBpZmRlZiBfTElCQ1BQX0JJR19FTkRJQU4KKyAgICAgICAge19fcl8uZmlyc3QoKS5fX3MuX19zaXplXyA9ICh1bnNpZ25lZCBjaGFyKShfX3MgPDwgMSk7fQorIyAgIGVsc2UKKyAgICAgICAge19fcl8uZmlyc3QoKS5fX3MuX19zaXplXyA9ICh1bnNpZ25lZCBjaGFyKShfX3MpO30KKyMgICBlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBfX2dldF9zaG9ydF9zaXplKCkgY29uc3QgX05PRVhDRVBUCisjICAgaWZkZWYgX0xJQkNQUF9CSUdfRU5ESUFOCisgICAgICAgIHtyZXR1cm4gX19yXy5maXJzdCgpLl9fcy5fX3NpemVfID4+IDE7fQorIyAgIGVsc2UKKyAgICAgICAge3JldHVybiBfX3JfLmZpcnN0KCkuX19zLl9fc2l6ZV87fQorIyAgIGVuZGlmCisKKyNlbHNlICAvLyBfTElCQ1BQX0FCSV9BTFRFUk5BVEVfU1RSSU5HX0xBWU9VVAorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19zZXRfc2hvcnRfc2l6ZShzaXplX3R5cGUgX19zKSBfTk9FWENFUFQKKyMgICBpZmRlZiBfTElCQ1BQX0JJR19FTkRJQU4KKyAgICAgICAge19fcl8uZmlyc3QoKS5fX3MuX19zaXplXyA9ICh1bnNpZ25lZCBjaGFyKShfX3MpO30KKyMgICBlbHNlCisgICAgICAgIHtfX3JfLmZpcnN0KCkuX19zLl9fc2l6ZV8gPSAodW5zaWduZWQgY2hhcikoX19zIDw8IDEpO30KKyMgICBlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBfX2dldF9zaG9ydF9zaXplKCkgY29uc3QgX05PRVhDRVBUCisjICAgaWZkZWYgX0xJQkNQUF9CSUdfRU5ESUFOCisgICAgICAgIHtyZXR1cm4gX19yXy5maXJzdCgpLl9fcy5fX3NpemVfO30KKyMgICBlbHNlCisgICAgICAgIHtyZXR1cm4gX19yXy5maXJzdCgpLl9fcy5fX3NpemVfID4+IDE7fQorIyAgIGVuZGlmCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9BQklfQUxURVJOQVRFX1NUUklOR19MQVlPVVQKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fc2V0X2xvbmdfc2l6ZShzaXplX3R5cGUgX19zKSBfTk9FWENFUFQKKyAgICAgICAge19fcl8uZmlyc3QoKS5fX2wuX19zaXplXyA9IF9fczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBfX2dldF9sb25nX3NpemUoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX3JfLmZpcnN0KCkuX19sLl9fc2l6ZV87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fc2V0X3NpemUoc2l6ZV90eXBlIF9fcykgX05PRVhDRVBUCisgICAgICAgIHtpZiAoX19pc19sb25nKCkpIF9fc2V0X2xvbmdfc2l6ZShfX3MpOyBlbHNlIF9fc2V0X3Nob3J0X3NpemUoX19zKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX3NldF9sb25nX2NhcChzaXplX3R5cGUgX19zKSBfTk9FWENFUFQKKyAgICAgICAge19fcl8uZmlyc3QoKS5fX2wuX19jYXBfICA9IF9fbG9uZ19tYXNrIHwgX19zO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIF9fZ2V0X2xvbmdfY2FwKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19yXy5maXJzdCgpLl9fbC5fX2NhcF8gJiBzaXplX3R5cGUofl9fbG9uZ19tYXNrKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX3NldF9sb25nX3BvaW50ZXIocG9pbnRlciBfX3ApIF9OT0VYQ0VQVAorICAgICAgICB7X19yXy5maXJzdCgpLl9fbC5fX2RhdGFfID0gX19wO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcG9pbnRlciBfX2dldF9sb25nX3BvaW50ZXIoKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX3JfLmZpcnN0KCkuX19sLl9fZGF0YV87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9wb2ludGVyIF9fZ2V0X2xvbmdfcG9pbnRlcigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fcl8uZmlyc3QoKS5fX2wuX19kYXRhXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBvaW50ZXIgX19nZXRfc2hvcnRfcG9pbnRlcigpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIHBvaW50ZXJfdHJhaXRzPHBvaW50ZXI+Ojpwb2ludGVyX3RvKF9fcl8uZmlyc3QoKS5fX3MuX19kYXRhX1swXSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9wb2ludGVyIF9fZ2V0X3Nob3J0X3BvaW50ZXIoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBwb2ludGVyX3RyYWl0czxjb25zdF9wb2ludGVyPjo6cG9pbnRlcl90byhfX3JfLmZpcnN0KCkuX19zLl9fZGF0YV9bMF0pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcG9pbnRlciBfX2dldF9wb2ludGVyKCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19pc19sb25nKCkgPyBfX2dldF9sb25nX3BvaW50ZXIoKSA6IF9fZ2V0X3Nob3J0X3BvaW50ZXIoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3BvaW50ZXIgX19nZXRfcG9pbnRlcigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9faXNfbG9uZygpID8gX19nZXRfbG9uZ19wb2ludGVyKCkgOiBfX2dldF9zaG9ydF9wb2ludGVyKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX196ZXJvKCkgX05PRVhDRVBUCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdHlwZSAoJl9fYSlbX19uX3dvcmRzXSA9IF9fcl8uZmlyc3QoKS5fX3IuX193b3JkczsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgX19pID0gMDsgX19pIDwgX19uX3dvcmRzOyArK19faSkKKyAgICAgICAgICAgICAgICBfX2FbX19pXSA9IDA7CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlIDxzaXplX3R5cGUgX19hPiBzdGF0aWMKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBzaXplX3R5cGUgX19hbGlnbl9pdChzaXplX3R5cGUgX19zKSBfTk9FWENFUFQKKyAgICAgICAgICAgIHtyZXR1cm4gKF9fcyArIChfX2EtMSkpICYgfihfX2EtMSk7fQorICAgIGVudW0ge19fYWxpZ25tZW50ID0gMTZ9OworICAgIHN0YXRpYyBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIF9fcmVjb21tZW5kKHNpemVfdHlwZSBfX3MpIF9OT0VYQ0VQVAorICAgICAgICB7CisgICAgICAgIGlmIChfX3MgPCBfX21pbl9jYXApIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fbWluX2NhcCkgLSAxOworICAgICAgICBzaXplX3R5cGUgX19ndWVzcyA9IF9fYWxpZ25faXQ8c2l6ZW9mKHZhbHVlX3R5cGUpIDwgX19hbGlnbm1lbnQgPworICAgICAgICAgICAgICAgICAgICAgX19hbGlnbm1lbnQvc2l6ZW9mKHZhbHVlX3R5cGUpIDogMSA+IChfX3MrMSkgLSAxOworICAgICAgICBpZiAoX19ndWVzcyA9PSBfX21pbl9jYXApICsrX19ndWVzczsKKyAgICAgICAgcmV0dXJuIF9fZ3Vlc3M7CisgICAgICAgIH0KKworICAgIGlubGluZQorICAgIHZvaWQgX19pbml0KGNvbnN0IHZhbHVlX3R5cGUqIF9fcywgc2l6ZV90eXBlIF9fc3osIHNpemVfdHlwZSBfX3Jlc2VydmUpOworICAgIGlubGluZQorICAgIHZvaWQgX19pbml0KGNvbnN0IHZhbHVlX3R5cGUqIF9fcywgc2l6ZV90eXBlIF9fc3opOworICAgIGlubGluZQorICAgIHZvaWQgX19pbml0KHNpemVfdHlwZSBfX24sIHZhbHVlX3R5cGUgX19jKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUKKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfZXhhY3RseV9pbnB1dF9pdGVyYXRvcjxfSW5wdXRJdGVyYXRvcj46OnZhbHVlLAorICAgICAgICB2b2lkCisgICAgPjo6dHlwZQorICAgIF9faW5pdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgaW5saW5lCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgPAorICAgICAgICBfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlLAorICAgICAgICB2b2lkCisgICAgPjo6dHlwZQorICAgIF9faW5pdChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KTsKKworICAgIHZvaWQgX19ncm93X2J5KHNpemVfdHlwZSBfX29sZF9jYXAsIHNpemVfdHlwZSBfX2RlbHRhX2NhcCwgc2l6ZV90eXBlIF9fb2xkX3N6LAorICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX25fY29weSwgIHNpemVfdHlwZSBfX25fZGVsLCAgICAgc2l6ZV90eXBlIF9fbl9hZGQgPSAwKTsKKyAgICB2b2lkIF9fZ3Jvd19ieV9hbmRfcmVwbGFjZShzaXplX3R5cGUgX19vbGRfY2FwLCBzaXplX3R5cGUgX19kZWx0YV9jYXAsIHNpemVfdHlwZSBfX29sZF9zeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uX2NvcHksICBzaXplX3R5cGUgX19uX2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uX2FkZCwgY29uc3QgdmFsdWVfdHlwZSogX19wX25ld19zdHVmZik7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX2VyYXNlX3RvX2VuZChzaXplX3R5cGUgX19wb3MpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19jb3B5X2Fzc2lnbl9hbGxvYyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgICAgICB7X19jb3B5X2Fzc2lnbl9hbGxvYyhfX3N0ciwgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9jb3B5X2Fzc2lnbm1lbnQ6OnZhbHVlPigpKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX2NvcHlfYXNzaWduX2FsbG9jKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHRydWVfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9fYWxsb2MoKSA9PSBfX3N0ci5fX2FsbG9jKCkpCisgICAgICAgICAgICAgICAgX19hbGxvYygpID0gX19zdHIuX19hbGxvYygpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghX19zdHIuX19pc19sb25nKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX2NsZWFyX2FuZF9zaHJpbmsoKTsKKyAgICAgICAgICAgICAgICAgICAgX19hbGxvYygpID0gX19zdHIuX19hbGxvYygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZSBfX2EgPSBfX3N0ci5fX2FsbG9jKCk7CisgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgX19wID0gX19hbGxvY190cmFpdHM6OmFsbG9jYXRlKF9fYSwgX19zdHIuX19nZXRfbG9uZ19jYXAoKSk7CisgICAgICAgICAgICAgICAgICAgIF9fY2xlYXJfYW5kX3NocmluaygpOworICAgICAgICAgICAgICAgICAgICBfX2FsbG9jKCkgPSBfVlNURDo6bW92ZShfX2EpOworICAgICAgICAgICAgICAgICAgICBfX3NldF9sb25nX3BvaW50ZXIoX19wKTsKKyAgICAgICAgICAgICAgICAgICAgX19zZXRfbG9uZ19jYXAoX19zdHIuX19nZXRfbG9uZ19jYXAoKSk7CisgICAgICAgICAgICAgICAgICAgIF9fc2V0X2xvbmdfc2l6ZShfX3N0ci5zaXplKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19jb3B5X2Fzc2lnbl9hbGxvYyhjb25zdCBiYXNpY19zdHJpbmcmLCBmYWxzZV90eXBlKSBfTk9FWENFUFQKKyAgICAgICAge30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX21vdmVfYXNzaWduKGJhc2ljX3N0cmluZyYgX19zdHIsIGZhbHNlX3R5cGUpCisgICAgICAgIF9OT0VYQ0VQVF8oX19hbGxvY190cmFpdHM6OmlzX2Fsd2F5c19lcXVhbDo6dmFsdWUpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fbW92ZV9hc3NpZ24oYmFzaWNfc3RyaW5nJiBfX3N0ciwgdHJ1ZV90eXBlKQorI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisgICAgICAgIF9OT0VYQ0VQVDsKKyNlbHNlCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisjZW5kaWYKKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQKKyAgICBfX21vdmVfYXNzaWduX2FsbG9jKGJhc2ljX3N0cmluZyYgX19zdHIpCisgICAgICAgIF9OT0VYQ0VQVF8oCisgICAgICAgICAgICAhX19hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZSB8fAorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSkKKyAgICB7X19tb3ZlX2Fzc2lnbl9hbGxvYyhfX3N0ciwgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ6OnZhbHVlPigpKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX21vdmVfYXNzaWduX2FsbG9jKGJhc2ljX3N0cmluZyYgX19jLCB0cnVlX3R5cGUpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgX19hbGxvYygpID0gX1ZTVEQ6Om1vdmUoX19jLl9fYWxsb2MoKSk7CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fbW92ZV9hc3NpZ25fYWxsb2MoYmFzaWNfc3RyaW5nJiwgZmFsc2VfdHlwZSkKKyAgICAgICAgX05PRVhDRVBUCisgICAgICAgIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgX19pbnZhbGlkYXRlX2FsbF9pdGVyYXRvcnMoKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgX19pbnZhbGlkYXRlX2l0ZXJhdG9yc19wYXN0KHNpemVfdHlwZSk7CisKKyAgICBmcmllbmQgYmFzaWNfc3RyaW5nIG9wZXJhdG9yKzw+KGNvbnN0IGJhc2ljX3N0cmluZyYsIGNvbnN0IGJhc2ljX3N0cmluZyYpOworICAgIGZyaWVuZCBiYXNpY19zdHJpbmcgb3BlcmF0b3IrPD4oY29uc3QgdmFsdWVfdHlwZSosIGNvbnN0IGJhc2ljX3N0cmluZyYpOworICAgIGZyaWVuZCBiYXNpY19zdHJpbmcgb3BlcmF0b3IrPD4odmFsdWVfdHlwZSwgY29uc3QgYmFzaWNfc3RyaW5nJik7CisgICAgZnJpZW5kIGJhc2ljX3N0cmluZyBvcGVyYXRvcis8Pihjb25zdCBiYXNpY19zdHJpbmcmLCBjb25zdCB2YWx1ZV90eXBlKik7CisgICAgZnJpZW5kIGJhc2ljX3N0cmluZyBvcGVyYXRvcis8Pihjb25zdCBiYXNpY19zdHJpbmcmLCB2YWx1ZV90eXBlKTsKK307CisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fREVEVUNUSU9OX0dVSURFUwordGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3IsCisgICAgICAgICBjbGFzcyBfQ2hhclQgPSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorICAgICAgICAgY2xhc3MgX0FsbG9jYXRvciA9IGFsbG9jYXRvcjxfQ2hhclQ+LAorICAgICAgICAgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19pbnB1dF9pdGVyYXRvcjxfSW5wdXRJdGVyYXRvcj46OnZhbHVlLCB2b2lkPjo6dHlwZSwKKyAgICAgICAgIGNsYXNzID0gdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfYWxsb2NhdG9yPF9BbGxvY2F0b3I+Ojp2YWx1ZSwgdm9pZD46OnR5cGUKKyAgICAgICAgID4KK2Jhc2ljX3N0cmluZyhfSW5wdXRJdGVyYXRvciwgX0lucHV0SXRlcmF0b3IsIF9BbGxvY2F0b3IgPSBfQWxsb2NhdG9yKCkpCisgIC0+IGJhc2ljX3N0cmluZzxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4sIF9BbGxvY2F0b3I+OworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgIAordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6X19pbnZhbGlkYXRlX2FsbF9pdGVyYXRvcnMoKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW52YWxpZGF0ZV9hbGwodGhpcyk7CisjZW5kaWYgIC8vIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpfX2ludmFsaWRhdGVfaXRlcmF0b3JzX3Bhc3Qoc2l6ZV90eXBlCisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3BvcworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fY19ub2RlKiBfX2MgPSBfX2dldF9kYigpLT5fX2ZpbmRfY19hbmRfbG9jayh0aGlzKTsKKyAgICBpZiAoX19jKQorICAgIHsKKyAgICAgICAgY29uc3RfcG9pbnRlciBfX25ld19sYXN0ID0gX19nZXRfcG9pbnRlcigpICsgX19wb3M7CisgICAgICAgIGZvciAoX19pX25vZGUqKiBfX3AgPSBfX2MtPmVuZF87IF9fcCAhPSBfX2MtPmJlZ187ICkKKyAgICAgICAgeworICAgICAgICAgICAgLS1fX3A7CisgICAgICAgICAgICBjb25zdF9pdGVyYXRvciogX19pID0gc3RhdGljX2Nhc3Q8Y29uc3RfaXRlcmF0b3IqPigoKl9fcCktPl9faV8pOworICAgICAgICAgICAgaWYgKF9faS0+YmFzZSgpID4gX19uZXdfbGFzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKl9fcCktPl9fY18gPSBudWxscHRyOworICAgICAgICAgICAgICAgIGlmICgtLV9fYy0+ZW5kXyAhPSBfX3ApCisgICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoX19wLCBfX3ArMSwgKF9fYy0+ZW5kXyAtIF9fcCkqc2l6ZW9mKF9faV9ub2RlKikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fZ2V0X2RiKCktPnVubG9jaygpOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZygpCisgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBfX3plcm8oKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFzaWNfc3RyaW5nKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisjaWYgX0xJQkNQUF9TVERfVkVSIDw9IDE0CisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSkKKyNlbHNlCisgICAgICAgIF9OT0VYQ0VQVAorI2VuZGlmCis6IF9fcl8oX19zZWNvbmRfdGFnKCksIF9fYSkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgX196ZXJvKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpfX2luaXQoY29uc3QgdmFsdWVfdHlwZSogX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3N6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3Jlc2VydmUpCit7CisgICAgaWYgKF9fcmVzZXJ2ZSA+IG1heF9zaXplKCkpCisgICAgICAgIHRoaXMtPl9fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7CisgICAgcG9pbnRlciBfX3A7CisgICAgaWYgKF9fcmVzZXJ2ZSA8IF9fbWluX2NhcCkKKyAgICB7CisgICAgICAgIF9fc2V0X3Nob3J0X3NpemUoX19zeik7CisgICAgICAgIF9fcCA9IF9fZ2V0X3Nob3J0X3BvaW50ZXIoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fY2FwID0gX19yZWNvbW1lbmQoX19yZXNlcnZlKTsKKyAgICAgICAgX19wID0gX19hbGxvY190cmFpdHM6OmFsbG9jYXRlKF9fYWxsb2MoKSwgX19jYXArMSk7CisgICAgICAgIF9fc2V0X2xvbmdfcG9pbnRlcihfX3ApOworICAgICAgICBfX3NldF9sb25nX2NhcChfX2NhcCsxKTsKKyAgICAgICAgX19zZXRfbG9uZ19zaXplKF9fc3opOworICAgIH0KKyAgICB0cmFpdHNfdHlwZTo6Y29weShfVlNURDo6X190b19yYXdfcG9pbnRlcihfX3ApLCBfX3MsIF9fc3opOworICAgIHRyYWl0c190eXBlOjphc3NpZ24oX19wW19fc3pdLCB2YWx1ZV90eXBlKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Ol9faW5pdChjb25zdCB2YWx1ZV90eXBlKiBfX3MsIHNpemVfdHlwZSBfX3N6KQoreworICAgIGlmIChfX3N6ID4gbWF4X3NpemUoKSkKKyAgICAgICAgdGhpcy0+X190aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICBwb2ludGVyIF9fcDsKKyAgICBpZiAoX19zeiA8IF9fbWluX2NhcCkKKyAgICB7CisgICAgICAgIF9fc2V0X3Nob3J0X3NpemUoX19zeik7CisgICAgICAgIF9fcCA9IF9fZ2V0X3Nob3J0X3BvaW50ZXIoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fY2FwID0gX19yZWNvbW1lbmQoX19zeik7CisgICAgICAgIF9fcCA9IF9fYWxsb2NfdHJhaXRzOjphbGxvY2F0ZShfX2FsbG9jKCksIF9fY2FwKzEpOworICAgICAgICBfX3NldF9sb25nX3BvaW50ZXIoX19wKTsKKyAgICAgICAgX19zZXRfbG9uZ19jYXAoX19jYXArMSk7CisgICAgICAgIF9fc2V0X2xvbmdfc2l6ZShfX3N6KTsKKyAgICB9CisgICAgdHJhaXRzX3R5cGU6OmNvcHkoX1ZTVEQ6Ol9fdG9fcmF3X3BvaW50ZXIoX19wKSwgX19zLCBfX3N6KTsKKyAgICB0cmFpdHNfdHlwZTo6YXNzaWduKF9fcFtfX3N6XSwgdmFsdWVfdHlwZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zKQoreworICAgIF9MSUJDUFBfQVNTRVJUKF9fcyAhPSBudWxscHRyLCAiYmFzaWNfc3RyaW5nKGNvbnN0IGNoYXIqKSBkZXRlY3RlZCBudWxscHRyIik7CisgICAgX19pbml0KF9fcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgY29uc3QgX0FsbG9jYXRvciYgX19hKQorICAgIDogX19yXyhfX3NlY29uZF90YWcoKSwgX19hKQoreworICAgIF9MSUJDUFBfQVNTRVJUKF9fcyAhPSBudWxscHRyLCAiYmFzaWNfc3RyaW5nKGNvbnN0IGNoYXIqLCBhbGxvY2F0b3IpIGRldGVjdGVkIG51bGxwdHIiKTsKKyAgICBfX2luaXQoX19zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQoreworICAgIF9MSUJDUFBfQVNTRVJUKF9fbiA9PSAwIHx8IF9fcyAhPSBudWxscHRyLCAiYmFzaWNfc3RyaW5nKGNvbnN0IGNoYXIqLCBuKSBkZXRlY3RlZCBudWxscHRyIik7CisgICAgX19pbml0KF9fcywgX19uKTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX0FsbG9jYXRvciYgX19hKQorICAgIDogX19yXyhfX3NlY29uZF90YWcoKSwgX19hKQoreworICAgIF9MSUJDUFBfQVNTRVJUKF9fbiA9PSAwIHx8IF9fcyAhPSBudWxscHRyLCAiYmFzaWNfc3RyaW5nKGNvbnN0IGNoYXIqLCBuLCBhbGxvY2F0b3IpIGRldGVjdGVkIG51bGxwdHIiKTsKKyAgICBfX2luaXQoX19zLCBfX24pOworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpiYXNpY19zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKKyAgICA6IF9fcl8oX19zZWNvbmRfdGFnKCksIF9fYWxsb2NfdHJhaXRzOjpzZWxlY3Rfb25fY29udGFpbmVyX2NvcHlfY29uc3RydWN0aW9uKF9fc3RyLl9fYWxsb2MoKSkpCit7CisgICAgaWYgKCFfX3N0ci5fX2lzX2xvbmcoKSkKKyAgICAgICAgX19yXy5maXJzdCgpLl9fciA9IF9fc3RyLl9fcl8uZmlyc3QoKS5fX3I7CisgICAgZWxzZQorICAgICAgICBfX2luaXQoX1ZTVEQ6Ol9fdG9fcmF3X3BvaW50ZXIoX19zdHIuX19nZXRfbG9uZ19wb2ludGVyKCkpLCBfX3N0ci5fX2dldF9sb25nX3NpemUoKSk7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZygKKyAgICBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX19yXyhfX3NlY29uZF90YWcoKSwgX19hKQoreworICAgIGlmICghX19zdHIuX19pc19sb25nKCkpCisgICAgICAgIF9fcl8uZmlyc3QoKS5fX3IgPSBfX3N0ci5fX3JfLmZpcnN0KCkuX19yOworICAgIGVsc2UKKyAgICAgICAgX19pbml0KF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fc3RyLl9fZ2V0X2xvbmdfcG9pbnRlcigpKSwgX19zdHIuX19nZXRfbG9uZ19zaXplKCkpOworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFzaWNfc3RyaW5nKGJhc2ljX3N0cmluZyYmIF9fc3RyKQorI2lmIF9MSUJDUFBfU1REX1ZFUiA8PSAxNAorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpCisjZWxzZQorICAgICAgICBfTk9FWENFUFQKKyNlbmRpZgorICAgIDogX19yXyhfVlNURDo6bW92ZShfX3N0ci5fX3JfKSkKK3sKKyAgICBfX3N0ci5fX3plcm8oKTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworICAgIGlmIChfX2lzX2xvbmcoKSkKKyAgICAgICAgX19nZXRfZGIoKS0+c3dhcCh0aGlzLCAmX19zdHIpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZyhiYXNpY19zdHJpbmcmJiBfX3N0ciwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fcl8oX19zZWNvbmRfdGFnKCksIF9fYSkKK3sKKyAgICBpZiAoX19zdHIuX19pc19sb25nKCkgJiYgX19hICE9IF9fc3RyLl9fYWxsb2MoKSkgLy8gY29weSwgbm90IG1vdmUKKyAgICAgICAgX19pbml0KF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fc3RyLl9fZ2V0X2xvbmdfcG9pbnRlcigpKSwgX19zdHIuX19nZXRfbG9uZ19zaXplKCkpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIF9fcl8uZmlyc3QoKS5fX3IgPSBfX3N0ci5fX3JfLmZpcnN0KCkuX19yOworICAgICAgICBfX3N0ci5fX3plcm8oKTsKKyAgICB9CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyAgICBpZiAoX19pc19sb25nKCkpCisgICAgICAgIF9fZ2V0X2RiKCktPnN3YXAodGhpcywgJl9fc3RyKTsKKyNlbmRpZgorfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Ol9faW5pdChzaXplX3R5cGUgX19uLCB2YWx1ZV90eXBlIF9fYykKK3sKKyAgICBpZiAoX19uID4gbWF4X3NpemUoKSkKKyAgICAgICAgdGhpcy0+X190aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICBwb2ludGVyIF9fcDsKKyAgICBpZiAoX19uIDwgX19taW5fY2FwKQorICAgIHsKKyAgICAgICAgX19zZXRfc2hvcnRfc2l6ZShfX24pOworICAgICAgICBfX3AgPSBfX2dldF9zaG9ydF9wb2ludGVyKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX2NhcCA9IF9fcmVjb21tZW5kKF9fbik7CisgICAgICAgIF9fcCA9IF9fYWxsb2NfdHJhaXRzOjphbGxvY2F0ZShfX2FsbG9jKCksIF9fY2FwKzEpOworICAgICAgICBfX3NldF9sb25nX3BvaW50ZXIoX19wKTsKKyAgICAgICAgX19zZXRfbG9uZ19jYXAoX19jYXArMSk7CisgICAgICAgIF9fc2V0X2xvbmdfc2l6ZShfX24pOworICAgIH0KKyAgICB0cmFpdHNfdHlwZTo6YXNzaWduKF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fcCksIF9fbiwgX19jKTsKKyAgICB0cmFpdHNfdHlwZTo6YXNzaWduKF9fcFtfX25dLCB2YWx1ZV90eXBlKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpiYXNpY19zdHJpbmcoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKK3sKKyAgICBfX2luaXQoX19uLCBfX2MpOworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFzaWNfc3RyaW5nKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSkKKyAgICA6IF9fcl8oX19zZWNvbmRfdGFnKCksIF9fYSkKK3sKKyAgICBfX2luaXQoX19uLCBfX2MpOworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpiYXNpY19zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EpCisgICAgOiBfX3JfKF9fc2Vjb25kX3RhZygpLCBfX2EpCit7CisgICAgc2l6ZV90eXBlIF9fc3RyX3N6ID0gX19zdHIuc2l6ZSgpOworICAgIGlmIChfX3BvcyA+IF9fc3RyX3N6KQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIF9faW5pdChfX3N0ci5kYXRhKCkgKyBfX3BvcywgX1ZTVEQ6Om1pbihfX24sIF9fc3RyX3N6IC0gX19wb3MpKTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSkKKyAgICA6IF9fcl8oX19zZWNvbmRfdGFnKCksIF9fYSkKK3sKKyAgICBzaXplX3R5cGUgX19zdHJfc3ogPSBfX3N0ci5zaXplKCk7CisgICAgaWYgKF9fcG9zID4gX19zdHJfc3opCisgICAgICAgIHRoaXMtPl9fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgX19pbml0KF9fc3RyLmRhdGEoKSArIF9fcG9zLCBfX3N0cl9zeiAtIF9fcG9zKTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZygKKyAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdCwgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hLAorICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2Nhbl9iZV9jb252ZXJ0ZWRfdG9fc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzLCBfVHA+Ojp2YWx1ZSwgdm9pZD46OnR5cGUgKikKKyAgICA6IF9fcl8oX19zZWNvbmRfdGFnKCksIF9fYSkKK3sKKyAgICBfX3NlbGZfdmlldyBfX3N2ID0gX19zZWxmX3ZpZXcoX190KS5zdWJzdHIoX19wb3MsIF9fbik7CisgICAgX19pbml0KF9fc3YuZGF0YSgpLCBfX3N2LnNpemUoKSk7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpiYXNpY19zdHJpbmcoX19zZWxmX3ZpZXcgX19zdikKK3sKKyAgICBfX2luaXQoX19zdi5kYXRhKCksIF9fc3Yuc2l6ZSgpKTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZyhfX3NlbGZfdmlldyBfX3N2LCBjb25zdCBfQWxsb2NhdG9yJiBfX2EpCisgICAgOiBfX3JfKF9fc2Vjb25kX3RhZygpLCBfX2EpCit7CisgICAgX19pbml0KF9fc3YuZGF0YSgpLCBfX3N2LnNpemUoKSk7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc19leGFjdGx5X2lucHV0X2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Ol9faW5pdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgX196ZXJvKCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHRyeQorICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgIHB1c2hfYmFjaygqX19maXJzdCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgaWYgKF9faXNfbG9uZygpKQorICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hbGxvYygpLCBfX2dldF9sb25nX3BvaW50ZXIoKSwgX19nZXRfbG9uZ19jYXAoKSk7CisgICAgICAgIHRocm93OworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Ol9faW5pdChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworICAgIHNpemVfdHlwZSBfX3N6ID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfVlNURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KSk7CisgICAgaWYgKF9fc3ogPiBtYXhfc2l6ZSgpKQorICAgICAgICB0aGlzLT5fX3Rocm93X2xlbmd0aF9lcnJvcigpOworICAgIHBvaW50ZXIgX19wOworICAgIGlmIChfX3N6IDwgX19taW5fY2FwKQorICAgIHsKKyAgICAgICAgX19zZXRfc2hvcnRfc2l6ZShfX3N6KTsKKyAgICAgICAgX19wID0gX19nZXRfc2hvcnRfcG9pbnRlcigpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzaXplX3R5cGUgX19jYXAgPSBfX3JlY29tbWVuZChfX3N6KTsKKyAgICAgICAgX19wID0gX19hbGxvY190cmFpdHM6OmFsbG9jYXRlKF9fYWxsb2MoKSwgX19jYXArMSk7CisgICAgICAgIF9fc2V0X2xvbmdfcG9pbnRlcihfX3ApOworICAgICAgICBfX3NldF9sb25nX2NhcChfX2NhcCsxKTsKKyAgICAgICAgX19zZXRfbG9uZ19zaXplKF9fc3opOworICAgIH0KKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKHZvaWQpICsrX19wKQorICAgICAgICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX3AsICpfX2ZpcnN0KTsKKyAgICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX3AsIHZhbHVlX3R5cGUoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFzaWNfc3RyaW5nKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBfX2luaXQoX19maXJzdCwgX19sYXN0KTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFzaWNfc3RyaW5nKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fcl8oX19zZWNvbmRfdGFnKCksIF9fYSkKK3sKKyAgICBfX2luaXQoX19maXJzdCwgX19sYXN0KTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZygKKyAgICBpbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19pbCkKK3sKKyAgICBfX2luaXQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFzaWNfc3RyaW5nKAorICAgIGluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2lsLCBjb25zdCBfQWxsb2NhdG9yJiBfX2EpCisgICAgOiBfX3JfKF9fc2Vjb25kX3RhZygpLCBfX2EpCit7CisgICAgX19pbml0KF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46On5iYXNpY19zdHJpbmcoKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9fZXJhc2VfYyh0aGlzKTsKKyNlbmRpZgorICAgIGlmIChfX2lzX2xvbmcoKSkKKyAgICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hbGxvYygpLCBfX2dldF9sb25nX3BvaW50ZXIoKSwgX19nZXRfbG9uZ19jYXAoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6X19ncm93X2J5X2FuZF9yZXBsYWNlCisgICAgKHNpemVfdHlwZSBfX29sZF9jYXAsIHNpemVfdHlwZSBfX2RlbHRhX2NhcCwgc2l6ZV90eXBlIF9fb2xkX3N6LAorICAgICBzaXplX3R5cGUgX19uX2NvcHksICBzaXplX3R5cGUgX19uX2RlbCwgICAgIHNpemVfdHlwZSBfX25fYWRkLCBjb25zdCB2YWx1ZV90eXBlKiBfX3BfbmV3X3N0dWZmKQoreworICAgIHNpemVfdHlwZSBfX21zID0gbWF4X3NpemUoKTsKKyAgICBpZiAoX19kZWx0YV9jYXAgPiBfX21zIC0gX19vbGRfY2FwIC0gMSkKKyAgICAgICAgdGhpcy0+X190aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICBwb2ludGVyIF9fb2xkX3AgPSBfX2dldF9wb2ludGVyKCk7CisgICAgc2l6ZV90eXBlIF9fY2FwID0gX19vbGRfY2FwIDwgX19tcyAvIDIgLSBfX2FsaWdubWVudCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmVjb21tZW5kKF9WU1REOjptYXgoX19vbGRfY2FwICsgX19kZWx0YV9jYXAsIDIgKiBfX29sZF9jYXApKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbXMgLSAxOworICAgIHBvaW50ZXIgX19wID0gX19hbGxvY190cmFpdHM6OmFsbG9jYXRlKF9fYWxsb2MoKSwgX19jYXArMSk7CisgICAgX19pbnZhbGlkYXRlX2FsbF9pdGVyYXRvcnMoKTsKKyAgICBpZiAoX19uX2NvcHkgIT0gMCkKKyAgICAgICAgdHJhaXRzX3R5cGU6OmNvcHkoX1ZTVEQ6Ol9fdG9fcmF3X3BvaW50ZXIoX19wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6Ol9fdG9fcmF3X3BvaW50ZXIoX19vbGRfcCksIF9fbl9jb3B5KTsKKyAgICBpZiAoX19uX2FkZCAhPSAwKQorICAgICAgICB0cmFpdHNfdHlwZTo6Y29weShfVlNURDo6X190b19yYXdfcG9pbnRlcihfX3ApICsgX19uX2NvcHksIF9fcF9uZXdfc3R1ZmYsIF9fbl9hZGQpOworICAgIHNpemVfdHlwZSBfX3NlY19jcF9zeiA9IF9fb2xkX3N6IC0gX19uX2RlbCAtIF9fbl9jb3B5OworICAgIGlmIChfX3NlY19jcF9zeiAhPSAwKQorICAgICAgICB0cmFpdHNfdHlwZTo6Y29weShfVlNURDo6X190b19yYXdfcG9pbnRlcihfX3ApICsgX19uX2NvcHkgKyBfX25fYWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX29sZF9wKSArIF9fbl9jb3B5ICsgX19uX2RlbCwgX19zZWNfY3Bfc3opOworICAgIGlmIChfX29sZF9jYXArMSAhPSBfX21pbl9jYXApCisgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKF9fYWxsb2MoKSwgX19vbGRfcCwgX19vbGRfY2FwKzEpOworICAgIF9fc2V0X2xvbmdfcG9pbnRlcihfX3ApOworICAgIF9fc2V0X2xvbmdfY2FwKF9fY2FwKzEpOworICAgIF9fb2xkX3N6ID0gX19uX2NvcHkgKyBfX25fYWRkICsgX19zZWNfY3Bfc3o7CisgICAgX19zZXRfbG9uZ19zaXplKF9fb2xkX3N6KTsKKyAgICB0cmFpdHNfdHlwZTo6YXNzaWduKF9fcFtfX29sZF9zel0sIHZhbHVlX3R5cGUoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6X19ncm93X2J5KHNpemVfdHlwZSBfX29sZF9jYXAsIHNpemVfdHlwZSBfX2RlbHRhX2NhcCwgc2l6ZV90eXBlIF9fb2xkX3N6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uX2NvcHksICBzaXplX3R5cGUgX19uX2RlbCwgICAgIHNpemVfdHlwZSBfX25fYWRkKQoreworICAgIHNpemVfdHlwZSBfX21zID0gbWF4X3NpemUoKTsKKyAgICBpZiAoX19kZWx0YV9jYXAgPiBfX21zIC0gX19vbGRfY2FwKQorICAgICAgICB0aGlzLT5fX3Rocm93X2xlbmd0aF9lcnJvcigpOworICAgIHBvaW50ZXIgX19vbGRfcCA9IF9fZ2V0X3BvaW50ZXIoKTsKKyAgICBzaXplX3R5cGUgX19jYXAgPSBfX29sZF9jYXAgPCBfX21zIC8gMiAtIF9fYWxpZ25tZW50ID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19yZWNvbW1lbmQoX1ZTVEQ6Om1heChfX29sZF9jYXAgKyBfX2RlbHRhX2NhcCwgMiAqIF9fb2xkX2NhcCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19tcyAtIDE7CisgICAgcG9pbnRlciBfX3AgPSBfX2FsbG9jX3RyYWl0czo6YWxsb2NhdGUoX19hbGxvYygpLCBfX2NhcCsxKTsKKyAgICBfX2ludmFsaWRhdGVfYWxsX2l0ZXJhdG9ycygpOworICAgIGlmIChfX25fY29weSAhPSAwKQorICAgICAgICB0cmFpdHNfdHlwZTo6Y29weShfVlNURDo6X190b19yYXdfcG9pbnRlcihfX3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX29sZF9wKSwgX19uX2NvcHkpOworICAgIHNpemVfdHlwZSBfX3NlY19jcF9zeiA9IF9fb2xkX3N6IC0gX19uX2RlbCAtIF9fbl9jb3B5OworICAgIGlmIChfX3NlY19jcF9zeiAhPSAwKQorICAgICAgICB0cmFpdHNfdHlwZTo6Y29weShfVlNURDo6X190b19yYXdfcG9pbnRlcihfX3ApICsgX19uX2NvcHkgKyBfX25fYWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX29sZF9wKSArIF9fbl9jb3B5ICsgX19uX2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19zZWNfY3Bfc3opOworICAgIGlmIChfX29sZF9jYXArMSAhPSBfX21pbl9jYXApCisgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKF9fYWxsb2MoKSwgX19vbGRfcCwgX19vbGRfY2FwKzEpOworICAgIF9fc2V0X2xvbmdfcG9pbnRlcihfX3ApOworICAgIF9fc2V0X2xvbmdfY2FwKF9fY2FwKzEpOworfQorCisvLyBhc3NpZ24KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmFzc2lnbihjb25zdCB2YWx1ZV90eXBlKiBfX3MsIHNpemVfdHlwZSBfX24pCit7CisgICAgX0xJQkNQUF9BU1NFUlQoX19uID09IDAgfHwgX19zICE9IG51bGxwdHIsICJzdHJpbmc6OmFzc2lnbiByZWNlaXZlZCBudWxscHRyIik7CisgICAgc2l6ZV90eXBlIF9fY2FwID0gY2FwYWNpdHkoKTsKKyAgICBpZiAoX19jYXAgPj0gX19uKQorICAgIHsKKyAgICAgICAgdmFsdWVfdHlwZSogX19wID0gX1ZTVEQ6Ol9fdG9fcmF3X3BvaW50ZXIoX19nZXRfcG9pbnRlcigpKTsKKyAgICAgICAgdHJhaXRzX3R5cGU6Om1vdmUoX19wLCBfX3MsIF9fbik7CisgICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oX19wW19fbl0sIHZhbHVlX3R5cGUoKSk7CisgICAgICAgIF9fc2V0X3NpemUoX19uKTsKKyAgICAgICAgX19pbnZhbGlkYXRlX2l0ZXJhdG9yc19wYXN0KF9fbik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgICAgICBfX2dyb3dfYnlfYW5kX3JlcGxhY2UoX19jYXAsIF9fbiAtIF9fY2FwLCBfX3N6LCAwLCBfX3N6LCBfX24sIF9fcyk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmFzc2lnbihzaXplX3R5cGUgX19uLCB2YWx1ZV90eXBlIF9fYykKK3sKKyAgICBzaXplX3R5cGUgX19jYXAgPSBjYXBhY2l0eSgpOworICAgIGlmIChfX2NhcCA8IF9fbikKKyAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgICAgICBfX2dyb3dfYnkoX19jYXAsIF9fbiAtIF9fY2FwLCBfX3N6LCAwLCBfX3N6KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBfX2ludmFsaWRhdGVfaXRlcmF0b3JzX3Bhc3QoX19uKTsKKyAgICB2YWx1ZV90eXBlKiBfX3AgPSBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX2dldF9wb2ludGVyKCkpOworICAgIHRyYWl0c190eXBlOjphc3NpZ24oX19wLCBfX24sIF9fYyk7CisgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX3BbX19uXSwgdmFsdWVfdHlwZSgpKTsKKyAgICBfX3NldF9zaXplKF9fbik7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6b3BlcmF0b3I9KHZhbHVlX3R5cGUgX19jKQoreworICAgIHBvaW50ZXIgX19wOworICAgIGlmIChfX2lzX2xvbmcoKSkKKyAgICB7CisgICAgICAgIF9fcCA9IF9fZ2V0X2xvbmdfcG9pbnRlcigpOworICAgICAgICBfX3NldF9sb25nX3NpemUoMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIF9fcCA9IF9fZ2V0X3Nob3J0X3BvaW50ZXIoKTsKKyAgICAgICAgX19zZXRfc2hvcnRfc2l6ZSgxKTsKKyAgICB9CisgICAgdHJhaXRzX3R5cGU6OmFzc2lnbigqX19wLCBfX2MpOworICAgIHRyYWl0c190eXBlOjphc3NpZ24oKisrX19wLCB2YWx1ZV90eXBlKCkpOworICAgIF9faW52YWxpZGF0ZV9pdGVyYXRvcnNfcGFzdCgxKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpvcGVyYXRvcj0oY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKK3sKKyAgICBpZiAodGhpcyAhPSAmX19zdHIpCisgICAgeworICAgICAgICBfX2NvcHlfYXNzaWduX2FsbG9jKF9fc3RyKTsKKyAgICAgICAgYXNzaWduKF9fc3RyLmRhdGEoKSwgX19zdHIuc2l6ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpfX21vdmVfYXNzaWduKGJhc2ljX3N0cmluZyYgX19zdHIsIGZhbHNlX3R5cGUpCisgICAgX05PRVhDRVBUXyhfX2FsbG9jX3RyYWl0czo6aXNfYWx3YXlzX2VxdWFsOjp2YWx1ZSkKK3sKKyAgICBpZiAoX19hbGxvYygpICE9IF9fc3RyLl9fYWxsb2MoKSkKKyAgICAgICAgYXNzaWduKF9fc3RyKTsKKyAgICBlbHNlCisgICAgICAgIF9fbW92ZV9hc3NpZ24oX19zdHIsIHRydWVfdHlwZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6X19tb3ZlX2Fzc2lnbihiYXNpY19zdHJpbmcmIF9fc3RyLCB0cnVlX3R5cGUpCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKyAgICBfTk9FWENFUFQKKyNlbHNlCisgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKQorI2VuZGlmCit7CisgICAgX19jbGVhcl9hbmRfc2hyaW5rKCk7CisgICAgX19yXy5maXJzdCgpID0gX19zdHIuX19yXy5maXJzdCgpOworICAgIF9fbW92ZV9hc3NpZ25fYWxsb2MoX19zdHIpOworICAgIF9fc3RyLl9femVybygpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Om9wZXJhdG9yPShiYXNpY19zdHJpbmcmJiBfX3N0cikKKyAgICBfTk9FWENFUFRfKChfX25vZXhjZXB0X21vdmVfYXNzaWduX2NvbnRhaW5lcjxfQWxsb2NhdG9yLCBfX2FsbG9jX3RyYWl0cz46OnZhbHVlKSkKK3sKKyAgICBfX21vdmVfYXNzaWduKF9fc3RyLCBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWU+KCkpOworICAgIHJldHVybiAqdGhpczsKK30KKworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgICBfX2lzX2V4YWN0bHlfaW5wdXRfaXRlcmF0b3IgPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUKKyAgICAgICAgICB8fCAhX19saWJjcHBfc3RyaW5nX2dldHNfbm9leGNlcHRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKKz46OnR5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojphc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQoreworICAgIGNvbnN0IGJhc2ljX3N0cmluZyBfX3RlbXAoX19maXJzdCwgX19sYXN0LCBfX2FsbG9jKCkpOworICAgIGFzc2lnbihfX3RlbXAuZGF0YSgpLCBfX3RlbXAuc2l6ZSgpKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZTxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZQorICAgICAgICAgJiYgX19saWJjcHBfc3RyaW5nX2dldHNfbm9leGNlcHRfaXRlcmF0b3I8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlLAorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorPjo6dHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmFzc2lnbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworICAgIHNpemVfdHlwZSBfX24gPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9WU1REOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpKTsKKyAgICBzaXplX3R5cGUgX19jYXAgPSBjYXBhY2l0eSgpOworICAgIGlmIChfX2NhcCA8IF9fbikKKyAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgICAgICBfX2dyb3dfYnkoX19jYXAsIF9fbiAtIF9fY2FwLCBfX3N6LCAwLCBfX3N6KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBfX2ludmFsaWRhdGVfaXRlcmF0b3JzX3Bhc3QoX19uKTsKKyAgICBwb2ludGVyIF9fcCA9IF9fZ2V0X3BvaW50ZXIoKTsKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKytfX3ApCisgICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fcCwgKl9fZmlyc3QpOworICAgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fcCwgdmFsdWVfdHlwZSgpKTsKKyAgICBfX3NldF9zaXplKF9fbik7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YXNzaWduKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKK3sKKyAgICBzaXplX3R5cGUgX19zeiA9IF9fc3RyLnNpemUoKTsKKyAgICBpZiAoX19wb3MgPiBfX3N6KQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiBhc3NpZ24oX19zdHIuZGF0YSgpICsgX19wb3MsIF9WU1REOjptaW4oX19uLCBfX3N6IC0gX19wb3MpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2Nhbl9iZV9jb252ZXJ0ZWRfdG9fc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzLCBfVHA+Ojp2YWx1ZSwKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKKz46OnR5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojphc3NpZ24oY29uc3QgX1RwICYgX190LCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCit7CisgICAgX19zZWxmX3ZpZXcgX19zdiA9IF9fdDsKKyAgICBzaXplX3R5cGUgX19zeiA9IF9fc3Yuc2l6ZSgpOworICAgIGlmIChfX3BvcyA+IF9fc3opCisgICAgICAgIHRoaXMtPl9fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgcmV0dXJuIGFzc2lnbihfX3N2LmRhdGEoKSArIF9fcG9zLCBfVlNURDo6bWluKF9fbiwgX19zeiAtIF9fcG9zKSk7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmFzc2lnbihjb25zdCB2YWx1ZV90eXBlKiBfX3MpCit7CisgICAgX0xJQkNQUF9BU1NFUlQoX19zICE9IG51bGxwdHIsICJzdHJpbmc6OmFzc2lnbiByZWNlaXZlZCBudWxscHRyIik7CisgICAgcmV0dXJuIGFzc2lnbihfX3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7Cit9CisKKy8vIGFwcGVuZAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YXBwZW5kKGNvbnN0IHZhbHVlX3R5cGUqIF9fcywgc2l6ZV90eXBlIF9fbikKK3sKKyAgICBfTElCQ1BQX0FTU0VSVChfX24gPT0gMCB8fCBfX3MgIT0gbnVsbHB0ciwgInN0cmluZzo6YXBwZW5kIHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICBzaXplX3R5cGUgX19jYXAgPSBjYXBhY2l0eSgpOworICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgIGlmIChfX2NhcCAtIF9fc3ogPj0gX19uKQorICAgIHsKKyAgICAgICAgaWYgKF9fbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFsdWVfdHlwZSogX19wID0gX1ZTVEQ6Ol9fdG9fcmF3X3BvaW50ZXIoX19nZXRfcG9pbnRlcigpKTsKKyAgICAgICAgICAgIHRyYWl0c190eXBlOjpjb3B5KF9fcCArIF9fc3osIF9fcywgX19uKTsKKyAgICAgICAgICAgIF9fc3ogKz0gX19uOworICAgICAgICAgICAgX19zZXRfc2l6ZShfX3N6KTsKKyAgICAgICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oX19wW19fc3pdLCB2YWx1ZV90eXBlKCkpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgX19ncm93X2J5X2FuZF9yZXBsYWNlKF9fY2FwLCBfX3N6ICsgX19uIC0gX19jYXAsIF9fc3osIF9fc3osIDAsIF9fbiwgX19zKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjphcHBlbmQoc2l6ZV90eXBlIF9fbiwgdmFsdWVfdHlwZSBfX2MpCit7CisgICAgaWYgKF9fbikKKyAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX2NhcCA9IGNhcGFjaXR5KCk7CisgICAgICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgICAgICBpZiAoX19jYXAgLSBfX3N6IDwgX19uKQorICAgICAgICAgICAgX19ncm93X2J5KF9fY2FwLCBfX3N6ICsgX19uIC0gX19jYXAsIF9fc3osIF9fc3osIDApOworICAgICAgICBwb2ludGVyIF9fcCA9IF9fZ2V0X3BvaW50ZXIoKTsKKyAgICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfVlNURDo6X190b19yYXdfcG9pbnRlcihfX3ApICsgX19zeiwgX19uLCBfX2MpOworICAgICAgICBfX3N6ICs9IF9fbjsKKyAgICAgICAgX19zZXRfc2l6ZShfX3N6KTsKKyAgICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX3BbX19zel0sIHZhbHVlX3R5cGUoKSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpwdXNoX2JhY2sodmFsdWVfdHlwZSBfX2MpCit7CisgICAgYm9vbCBfX2lzX3Nob3J0ID0gIV9faXNfbG9uZygpOworICAgIHNpemVfdHlwZSBfX2NhcDsKKyAgICBzaXplX3R5cGUgX19zejsKKyAgICBpZiAoX19pc19zaG9ydCkKKyAgICB7CisgICAgICAgIF9fY2FwID0gX19taW5fY2FwIC0gMTsKKyAgICAgICAgX19zeiA9IF9fZ2V0X3Nob3J0X3NpemUoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX19jYXAgPSBfX2dldF9sb25nX2NhcCgpIC0gMTsKKyAgICAgICAgX19zeiA9IF9fZ2V0X2xvbmdfc2l6ZSgpOworICAgIH0KKyAgICBpZiAoX19zeiA9PSBfX2NhcCkKKyAgICB7CisgICAgICAgIF9fZ3Jvd19ieShfX2NhcCwgMSwgX19zeiwgX19zeiwgMCk7CisgICAgICAgIF9faXNfc2hvcnQgPSAhX19pc19sb25nKCk7CisgICAgfQorICAgIHBvaW50ZXIgX19wOworICAgIGlmIChfX2lzX3Nob3J0KQorICAgIHsKKyAgICAgICAgX19wID0gX19nZXRfc2hvcnRfcG9pbnRlcigpICsgX19zejsKKyAgICAgICAgX19zZXRfc2hvcnRfc2l6ZShfX3N6KzEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfX3AgPSBfX2dldF9sb25nX3BvaW50ZXIoKSArIF9fc3o7CisgICAgICAgIF9fc2V0X2xvbmdfc2l6ZShfX3N6KzEpOworICAgIH0KKyAgICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX3AsIF9fYyk7CisgICAgdHJhaXRzX3R5cGU6OmFzc2lnbigqKytfX3AsIHZhbHVlX3R5cGUoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Citib29sIF9fcHRyX2luX3JhbmdlIChjb25zdCBfVHAqIF9fcCwgY29uc3QgX1RwKiBfX2ZpcnN0LCBjb25zdCBfVHAqIF9fbGFzdCkKK3sKKyAgICByZXR1cm4gX19maXJzdCA8PSBfX3AgJiYgX19wIDwgX19sYXN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK2Jvb2wgX19wdHJfaW5fcmFuZ2UgKGNvbnN0IF9UcDEqLCBjb25zdCBfVHAyKiwgY29uc3QgX1RwMiopCit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGU8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Ol9fYXBwZW5kX2ZvcndhcmRfdW5zYWZlKAorICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgc3RhdGljX2Fzc2VydChfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIHJlcXVpcmVzIGEgRm9yd2FyZEl0ZXJhdG9yIik7CisgICAgc2l6ZV90eXBlIF9fc3ogPSBzaXplKCk7CisgICAgc2l6ZV90eXBlIF9fY2FwID0gY2FwYWNpdHkoKTsKKyAgICBzaXplX3R5cGUgX19uID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfVlNURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KSk7CisgICAgaWYgKF9fbikKKyAgICB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjpyZWZlcmVuY2UgX0NoYXJSZWY7CisgICAgICAgIF9DaGFyUmVmIF9fdG1wX3JlZiA9ICpfX2ZpcnN0OworICAgICAgICBpZiAoX19wdHJfaW5fcmFuZ2UoX1ZTVEQ6OmFkZHJlc3NvZihfX3RtcF9yZWYpLCBkYXRhKCksIGRhdGEoKSArIHNpemUoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZyBfX3RlbXAgKF9fZmlyc3QsIF9fbGFzdCwgX19hbGxvYygpKTsKKyAgICAgICAgICAgIGFwcGVuZChfX3RlbXAuZGF0YSgpLCBfX3RlbXAuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX19jYXAgLSBfX3N6IDwgX19uKQorICAgICAgICAgICAgICAgIF9fZ3Jvd19ieShfX2NhcCwgX19zeiArIF9fbiAtIF9fY2FwLCBfX3N6LCBfX3N6LCAwKTsKKyAgICAgICAgICAgIHBvaW50ZXIgX19wID0gX19nZXRfcG9pbnRlcigpICsgX19zejsKKyAgICAgICAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX3AsICsrX19maXJzdCkKKyAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX3AsICpfX2ZpcnN0KTsKKyAgICAgICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fcCwgdmFsdWVfdHlwZSgpKTsKKyAgICAgICAgICAgIF9fc2V0X3NpemUoX19zeiArIF9fbik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmFwcGVuZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQoreworICAgIHJldHVybiBhcHBlbmQoX19zdHIuZGF0YSgpLCBfX3N0ci5zaXplKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YXBwZW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKK3sKKyAgICBzaXplX3R5cGUgX19zeiA9IF9fc3RyLnNpemUoKTsKKyAgICBpZiAoX19wb3MgPiBfX3N6KQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiBhcHBlbmQoX19zdHIuZGF0YSgpICsgX19wb3MsIF9WU1REOjptaW4oX19uLCBfX3N6IC0gX19wb3MpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgPAorICAgICAgICBfX2Nhbl9iZV9jb252ZXJ0ZWRfdG9fc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzLCBfVHA+Ojp2YWx1ZSwKKyAgICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mCisgICAgPjo6dHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmFwcGVuZChjb25zdCBfVHAgJiBfX3QsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKK3sKKyAgICBfX3NlbGZfdmlldyBfX3N2ID0gX190OworICAgIHNpemVfdHlwZSBfX3N6ID0gX19zdi5zaXplKCk7CisgICAgaWYgKF9fcG9zID4gX19zeikKKyAgICAgICAgdGhpcy0+X190aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICByZXR1cm4gYXBwZW5kKF9fc3YuZGF0YSgpICsgX19wb3MsIF9WU1REOjptaW4oX19uLCBfX3N6IC0gX19wb3MpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmFwcGVuZChjb25zdCB2YWx1ZV90eXBlKiBfX3MpCit7CisgICAgX0xJQkNQUF9BU1NFUlQoX19zICE9IG51bGxwdHIsICJzdHJpbmc6OmFwcGVuZCByZWNlaXZlZCBudWxscHRyIik7CisgICAgcmV0dXJuIGFwcGVuZChfX3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7Cit9CisKKy8vIGluc2VydAorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6aW5zZXJ0KHNpemVfdHlwZSBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSogX19zLCBzaXplX3R5cGUgX19uKQoreworICAgIF9MSUJDUFBfQVNTRVJUKF9fbiA9PSAwIHx8IF9fcyAhPSBudWxscHRyLCAic3RyaW5nOjppbnNlcnQgcmVjZWl2ZWQgbnVsbHB0ciIpOworICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgIGlmIChfX3BvcyA+IF9fc3opCisgICAgICAgIHRoaXMtPl9fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgc2l6ZV90eXBlIF9fY2FwID0gY2FwYWNpdHkoKTsKKyAgICBpZiAoX19jYXAgLSBfX3N6ID49IF9fbikKKyAgICB7CisgICAgICAgIGlmIChfX24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVlX3R5cGUqIF9fcCA9IF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fZ2V0X3BvaW50ZXIoKSk7CisgICAgICAgICAgICBzaXplX3R5cGUgX19uX21vdmUgPSBfX3N6IC0gX19wb3M7CisgICAgICAgICAgICBpZiAoX19uX21vdmUgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX19wICsgX19wb3MgPD0gX19zICYmIF9fcyA8IF9fcCArIF9fc3opCisgICAgICAgICAgICAgICAgICAgIF9fcyArPSBfX247CisgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU6Om1vdmUoX19wICsgX19wb3MgKyBfX24sIF9fcCArIF9fcG9zLCBfX25fbW92ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFpdHNfdHlwZTo6bW92ZShfX3AgKyBfX3BvcywgX19zLCBfX24pOworICAgICAgICAgICAgX19zeiArPSBfX247CisgICAgICAgICAgICBfX3NldF9zaXplKF9fc3opOworICAgICAgICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX3BbX19zel0sIHZhbHVlX3R5cGUoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBfX2dyb3dfYnlfYW5kX3JlcGxhY2UoX19jYXAsIF9fc3ogKyBfX24gLSBfX2NhcCwgX19zeiwgX19wb3MsIDAsIF9fbiwgX19zKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjppbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCB2YWx1ZV90eXBlIF9fYykKK3sKKyAgICBzaXplX3R5cGUgX19zeiA9IHNpemUoKTsKKyAgICBpZiAoX19wb3MgPiBfX3N6KQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIGlmIChfX24pCisgICAgeworICAgICAgICBzaXplX3R5cGUgX19jYXAgPSBjYXBhY2l0eSgpOworICAgICAgICB2YWx1ZV90eXBlKiBfX3A7CisgICAgICAgIGlmIChfX2NhcCAtIF9fc3ogPj0gX19uKQorICAgICAgICB7CisgICAgICAgICAgICBfX3AgPSBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX2dldF9wb2ludGVyKCkpOworICAgICAgICAgICAgc2l6ZV90eXBlIF9fbl9tb3ZlID0gX19zeiAtIF9fcG9zOworICAgICAgICAgICAgaWYgKF9fbl9tb3ZlICE9IDApCisgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU6Om1vdmUoX19wICsgX19wb3MgKyBfX24sIF9fcCArIF9fcG9zLCBfX25fbW92ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfX2dyb3dfYnkoX19jYXAsIF9fc3ogKyBfX24gLSBfX2NhcCwgX19zeiwgX19wb3MsIDAsIF9fbik7CisgICAgICAgICAgICBfX3AgPSBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX2dldF9sb25nX3BvaW50ZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX3AgKyBfX3BvcywgX19uLCBfX2MpOworICAgICAgICBfX3N6ICs9IF9fbjsKKyAgICAgICAgX19zZXRfc2l6ZShfX3N6KTsKKyAgICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX3BbX19zel0sIHZhbHVlX3R5cGUoKSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICBfX2lzX2V4YWN0bHlfaW5wdXRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZQorICAgICAgICB8fCAhX19saWJjcHBfc3RyaW5nX2dldHNfbm9leGNlcHRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSwKKyAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorPjo6dHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Omluc2VydChjb25zdF9pdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZmluZF9jX2Zyb21faSgmX19wb3MpID09IHRoaXMsCisgICAgICAgICJzdHJpbmc6Omluc2VydChpdGVyYXRvciwgcmFuZ2UpIGNhbGxlZCB3aXRoIGFuIGl0ZXJhdG9yIG5vdCIKKyAgICAgICAgIiByZWZlcnJpbmcgdG8gdGhpcyBzdHJpbmciKTsKKyNlbmRpZgorICAgIGNvbnN0IGJhc2ljX3N0cmluZyBfX3RlbXAoX19maXJzdCwgX19sYXN0LCBfX2FsbG9jKCkpOworICAgIHJldHVybiBpbnNlcnQoX19wb3MsIF9fdGVtcC5kYXRhKCksIF9fdGVtcC5kYXRhKCkgKyBfX3RlbXAuc2l6ZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Cit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlCisgICAgICAgICYmIF9fbGliY3BwX3N0cmluZ19nZXRzX25vZXhjZXB0X2l0ZXJhdG9yPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IKKz46OnR5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjppbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19maW5kX2NfZnJvbV9pKCZfX3BvcykgPT0gdGhpcywKKyAgICAgICAgInN0cmluZzo6aW5zZXJ0KGl0ZXJhdG9yLCByYW5nZSkgY2FsbGVkIHdpdGggYW4gaXRlcmF0b3Igbm90IgorICAgICAgICAiIHJlZmVycmluZyB0byB0aGlzIHN0cmluZyIpOworI2VuZGlmCisgICAgc2l6ZV90eXBlIF9faXAgPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fcG9zIC0gYmVnaW4oKSk7CisgICAgc2l6ZV90eXBlIF9fbiA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX1ZTVEQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCkpOworICAgIGlmIChfX24pCisgICAgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6cmVmZXJlbmNlIF9DaGFyUmVmOworICAgICAgICBfQ2hhclJlZiBfX3RtcF9jaGFyID0gKl9fZmlyc3Q7CisgICAgICAgIGlmIChfX3B0cl9pbl9yYW5nZShfVlNURDo6YWRkcmVzc29mKF9fdG1wX2NoYXIpLCBkYXRhKCksIGRhdGEoKSArIHNpemUoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZyBfX3RlbXAoX19maXJzdCwgX19sYXN0LCBfX2FsbG9jKCkpOworICAgICAgICAgICAgcmV0dXJuIGluc2VydChfX3BvcywgX190ZW1wLmRhdGEoKSwgX190ZW1wLmRhdGEoKSArIF9fdGVtcC5zaXplKCkpOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90eXBlIF9fc3ogPSBzaXplKCk7CisgICAgICAgIHNpemVfdHlwZSBfX2NhcCA9IGNhcGFjaXR5KCk7CisgICAgICAgIHZhbHVlX3R5cGUqIF9fcDsKKyAgICAgICAgaWYgKF9fY2FwIC0gX19zeiA+PSBfX24pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fcCA9IF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fZ2V0X3BvaW50ZXIoKSk7CisgICAgICAgICAgICBzaXplX3R5cGUgX19uX21vdmUgPSBfX3N6IC0gX19pcDsKKyAgICAgICAgICAgIGlmIChfX25fbW92ZSAhPSAwKQorICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOjptb3ZlKF9fcCArIF9faXAgKyBfX24sIF9fcCArIF9faXAsIF9fbl9tb3ZlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fZ3Jvd19ieShfX2NhcCwgX19zeiArIF9fbiAtIF9fY2FwLCBfX3N6LCBfX2lwLCAwLCBfX24pOworICAgICAgICAgICAgX19wID0gX1ZTVEQ6Ol9fdG9fcmF3X3BvaW50ZXIoX19nZXRfbG9uZ19wb2ludGVyKCkpOworICAgICAgICB9CisgICAgICAgIF9fc3ogKz0gX19uOworICAgICAgICBfX3NldF9zaXplKF9fc3opOworICAgICAgICB0cmFpdHNfdHlwZTo6YXNzaWduKF9fcFtfX3N6XSwgdmFsdWVfdHlwZSgpKTsKKyAgICAgICAgZm9yIChfX3AgKz0gX19pcDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19wLCArK19fZmlyc3QpCisgICAgICAgICAgICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX3AsICpfX2ZpcnN0KTsKKyAgICB9CisgICAgcmV0dXJuIGJlZ2luKCkgKyBfX2lwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Omluc2VydChzaXplX3R5cGUgX19wb3MxLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQoreworICAgIHJldHVybiBpbnNlcnQoX19wb3MxLCBfX3N0ci5kYXRhKCksIF9fc3RyLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjppbnNlcnQoc2l6ZV90eXBlIF9fcG9zMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbikKK3sKKyAgICBzaXplX3R5cGUgX19zdHJfc3ogPSBfX3N0ci5zaXplKCk7CisgICAgaWYgKF9fcG9zMiA+IF9fc3RyX3N6KQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiBpbnNlcnQoX19wb3MxLCBfX3N0ci5kYXRhKCkgKyBfX3BvczIsIF9WU1REOjptaW4oX19uLCBfX3N0cl9zeiAtIF9fcG9zMikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9fY2FuX2JlX2NvbnZlcnRlZF90b19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHMsIF9UcD46OnZhbHVlLAorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorPjo6dHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Omluc2VydChzaXplX3R5cGUgX19wb3MxLCBjb25zdCBfVHAmIF9fdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbikKK3sKKyAgICBfX3NlbGZfdmlldyBfX3N2ID0gX190OworICAgIHNpemVfdHlwZSBfX3N0cl9zeiA9IF9fc3Yuc2l6ZSgpOworICAgIGlmIChfX3BvczIgPiBfX3N0cl9zeikKKyAgICAgICAgdGhpcy0+X190aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICByZXR1cm4gaW5zZXJ0KF9fcG9zMSwgX19zdi5kYXRhKCkgKyBfX3BvczIsIF9WU1REOjptaW4oX19uLCBfX3N0cl9zeiAtIF9fcG9zMikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6aW5zZXJ0KHNpemVfdHlwZSBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSogX19zKQoreworICAgIF9MSUJDUFBfQVNTRVJUKF9fcyAhPSBudWxscHRyLCAic3RyaW5nOjppbnNlcnQgcmVjZWl2ZWQgbnVsbHB0ciIpOworICAgIHJldHVybiBpbnNlcnQoX19wb3MsIF9fcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Omluc2VydChjb25zdF9pdGVyYXRvciBfX3BvcywgdmFsdWVfdHlwZSBfX2MpCit7CisgICAgc2l6ZV90eXBlIF9faXAgPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fcG9zIC0gYmVnaW4oKSk7CisgICAgc2l6ZV90eXBlIF9fc3ogPSBzaXplKCk7CisgICAgc2l6ZV90eXBlIF9fY2FwID0gY2FwYWNpdHkoKTsKKyAgICB2YWx1ZV90eXBlKiBfX3A7CisgICAgaWYgKF9fY2FwID09IF9fc3opCisgICAgeworICAgICAgICBfX2dyb3dfYnkoX19jYXAsIDEsIF9fc3osIF9faXAsIDAsIDEpOworICAgICAgICBfX3AgPSBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX2dldF9sb25nX3BvaW50ZXIoKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIF9fcCA9IF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fZ2V0X3BvaW50ZXIoKSk7CisgICAgICAgIHNpemVfdHlwZSBfX25fbW92ZSA9IF9fc3ogLSBfX2lwOworICAgICAgICBpZiAoX19uX21vdmUgIT0gMCkKKyAgICAgICAgICAgIHRyYWl0c190eXBlOjptb3ZlKF9fcCArIF9faXAgKyAxLCBfX3AgKyBfX2lwLCBfX25fbW92ZSk7CisgICAgfQorICAgIHRyYWl0c190eXBlOjphc3NpZ24oX19wW19faXBdLCBfX2MpOworICAgIHRyYWl0c190eXBlOjphc3NpZ24oX19wWysrX19zel0sIHZhbHVlX3R5cGUoKSk7CisgICAgX19zZXRfc2l6ZShfX3N6KTsKKyAgICByZXR1cm4gYmVnaW4oKSArIHN0YXRpY19jYXN0PGRpZmZlcmVuY2VfdHlwZT4oX19pcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6aW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCB2YWx1ZV90eXBlIF9fYykKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2ZpbmRfY19mcm9tX2koJl9fcG9zKSA9PSB0aGlzLAorICAgICAgICAic3RyaW5nOjppbnNlcnQoaXRlcmF0b3IsIG4sIHZhbHVlKSBjYWxsZWQgd2l0aCBhbiBpdGVyYXRvciBub3QiCisgICAgICAgICIgcmVmZXJyaW5nIHRvIHRoaXMgc3RyaW5nIik7CisjZW5kaWYKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19wID0gX19wb3MgLSBiZWdpbigpOworICAgIGluc2VydChzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fcCksIF9fbiwgX19jKTsKKyAgICByZXR1cm4gYmVnaW4oKSArIF9fcDsKK30KKworLy8gcmVwbGFjZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCB2YWx1ZV90eXBlKiBfX3MsIHNpemVfdHlwZSBfX24yKQorICAgIF9MSUJDUFBfRElTQUJMRV9VQlNBTl9VTlNJR05FRF9JTlRFR0VSX0NIRUNLCit7CisgICAgX0xJQkNQUF9BU1NFUlQoX19uMiA9PSAwIHx8IF9fcyAhPSBudWxscHRyLCAic3RyaW5nOjpyZXBsYWNlIHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICBzaXplX3R5cGUgX19zeiA9IHNpemUoKTsKKyAgICBpZiAoX19wb3MgPiBfX3N6KQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIF9fbjEgPSBfVlNURDo6bWluKF9fbjEsIF9fc3ogLSBfX3Bvcyk7CisgICAgc2l6ZV90eXBlIF9fY2FwID0gY2FwYWNpdHkoKTsKKyAgICBpZiAoX19jYXAgLSBfX3N6ICsgX19uMSA+PSBfX24yKQorICAgIHsKKyAgICAgICAgdmFsdWVfdHlwZSogX19wID0gX1ZTVEQ6Ol9fdG9fcmF3X3BvaW50ZXIoX19nZXRfcG9pbnRlcigpKTsKKyAgICAgICAgaWYgKF9fbjEgIT0gX19uMikKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90eXBlIF9fbl9tb3ZlID0gX19zeiAtIF9fcG9zIC0gX19uMTsKKyAgICAgICAgICAgIGlmIChfX25fbW92ZSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfX24xID4gX19uMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOjptb3ZlKF9fcCArIF9fcG9zLCBfX3MsIF9fbjIpOworICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTo6bW92ZShfX3AgKyBfX3BvcyArIF9fbjIsIF9fcCArIF9fcG9zICsgX19uMSwgX19uX21vdmUpOworICAgICAgICAgICAgICAgICAgICBnb3RvIF9fZmluaXNoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoX19wICsgX19wb3MgPCBfX3MgJiYgX19zIDwgX19wICsgX19zeikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX3AgKyBfX3BvcyArIF9fbjEgPD0gX19zKQorICAgICAgICAgICAgICAgICAgICAgICAgX19zICs9IF9fbjIgLSBfX24xOworICAgICAgICAgICAgICAgICAgICBlbHNlIC8vIF9fcCArIF9fcG9zIDwgX19zIDwgX19wICsgX19wb3MgKyBfX24xCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOjptb3ZlKF9fcCArIF9fcG9zLCBfX3MsIF9fbjEpOworICAgICAgICAgICAgICAgICAgICAgICAgX19wb3MgKz0gX19uMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fcyArPSBfX24yOworICAgICAgICAgICAgICAgICAgICAgICAgX19uMiAtPSBfX24xOworICAgICAgICAgICAgICAgICAgICAgICAgX19uMSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU6Om1vdmUoX19wICsgX19wb3MgKyBfX24yLCBfX3AgKyBfX3BvcyArIF9fbjEsIF9fbl9tb3ZlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0cmFpdHNfdHlwZTo6bW92ZShfX3AgKyBfX3BvcywgX19zLCBfX24yKTsKK19fZmluaXNoOgorLy8gX19zeiArPSBfX24yIC0gX19uMTsgaW4gdGhpcyBhbmQgdGhlIGJlbG93IGZ1bmN0aW9uIGJlbG93IGNhbiBjYXVzZSB1bnNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93LAorLy8gYnV0IHRoaXMgaXMgYSBzYWZlIG9wZXJhdGlvbiwgc28gd2UgZGlzYWJsZSB0aGUgY2hlY2suCisgICAgICAgIF9fc3ogKz0gX19uMiAtIF9fbjE7CisgICAgICAgIF9fc2V0X3NpemUoX19zeik7CisgICAgICAgIF9faW52YWxpZGF0ZV9pdGVyYXRvcnNfcGFzdChfX3N6KTsKKyAgICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX3BbX19zel0sIHZhbHVlX3R5cGUoKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgX19ncm93X2J5X2FuZF9yZXBsYWNlKF9fY2FwLCBfX3N6IC0gX19uMSArIF9fbjIgLSBfX2NhcCwgX19zeiwgX19wb3MsIF9fbjEsIF9fbjIsIF9fcyk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBzaXplX3R5cGUgX19uMiwgdmFsdWVfdHlwZSBfX2MpCisgICAgX0xJQkNQUF9ESVNBQkxFX1VCU0FOX1VOU0lHTkVEX0lOVEVHRVJfQ0hFQ0sKK3sKKyAgICBzaXplX3R5cGUgX19zeiA9IHNpemUoKTsKKyAgICBpZiAoX19wb3MgPiBfX3N6KQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIF9fbjEgPSBfVlNURDo6bWluKF9fbjEsIF9fc3ogLSBfX3Bvcyk7CisgICAgc2l6ZV90eXBlIF9fY2FwID0gY2FwYWNpdHkoKTsKKyAgICB2YWx1ZV90eXBlKiBfX3A7CisgICAgaWYgKF9fY2FwIC0gX19zeiArIF9fbjEgPj0gX19uMikKKyAgICB7CisgICAgICAgIF9fcCA9IF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fZ2V0X3BvaW50ZXIoKSk7CisgICAgICAgIGlmIChfX24xICE9IF9fbjIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdHlwZSBfX25fbW92ZSA9IF9fc3ogLSBfX3BvcyAtIF9fbjE7CisgICAgICAgICAgICBpZiAoX19uX21vdmUgIT0gMCkKKyAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTo6bW92ZShfX3AgKyBfX3BvcyArIF9fbjIsIF9fcCArIF9fcG9zICsgX19uMSwgX19uX21vdmUpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIF9fZ3Jvd19ieShfX2NhcCwgX19zeiAtIF9fbjEgKyBfX24yIC0gX19jYXAsIF9fc3osIF9fcG9zLCBfX24xLCBfX24yKTsKKyAgICAgICAgX19wID0gX1ZTVEQ6Ol9fdG9fcmF3X3BvaW50ZXIoX19nZXRfbG9uZ19wb2ludGVyKCkpOworICAgIH0KKyAgICB0cmFpdHNfdHlwZTo6YXNzaWduKF9fcCArIF9fcG9zLCBfX24yLCBfX2MpOworICAgIF9fc3ogKz0gX19uMiAtIF9fbjE7CisgICAgX19zZXRfc2l6ZShfX3N6KTsKKyAgICBfX2ludmFsaWRhdGVfaXRlcmF0b3JzX3Bhc3QoX19zeik7CisgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX3BbX19zel0sIHZhbHVlX3R5cGUoKSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Cit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX2lucHV0X2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mCis+Ojp0eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmVwbGFjZShjb25zdF9pdGVyYXRvciBfX2kxLCBjb25zdF9pdGVyYXRvciBfX2kyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19qMSwgX0lucHV0SXRlcmF0b3IgX19qMikKK3sKKyAgICBjb25zdCBiYXNpY19zdHJpbmcgX190ZW1wKF9fajEsIF9fajIsIF9fYWxsb2MoKSk7CisgICAgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19pMSwgX19pMiwgX190ZW1wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpyZXBsYWNlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQoreworICAgIHJldHVybiByZXBsYWNlKF9fcG9zMSwgX19uMSwgX19zdHIuZGF0YSgpLCBfX3N0ci5zaXplKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmVwbGFjZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKQoreworICAgIHNpemVfdHlwZSBfX3N0cl9zeiA9IF9fc3RyLnNpemUoKTsKKyAgICBpZiAoX19wb3MyID4gX19zdHJfc3opCisgICAgICAgIHRoaXMtPl9fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgcmV0dXJuIHJlcGxhY2UoX19wb3MxLCBfX24xLCBfX3N0ci5kYXRhKCkgKyBfX3BvczIsIF9WU1REOjptaW4oX19uMiwgX19zdHJfc3ogLSBfX3BvczIpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2Nhbl9iZV9jb252ZXJ0ZWRfdG9fc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzLCBfVHA+Ojp2YWx1ZSwKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKKz46OnR5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpyZXBsYWNlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfVHAmIF9fdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKQoreworICAgIF9fc2VsZl92aWV3IF9fc3YgPSBfX3Q7CisgICAgc2l6ZV90eXBlIF9fc3RyX3N6ID0gX19zdi5zaXplKCk7CisgICAgaWYgKF9fcG9zMiA+IF9fc3RyX3N6KQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiByZXBsYWNlKF9fcG9zMSwgX19uMSwgX19zdi5kYXRhKCkgKyBfX3BvczIsIF9WU1REOjptaW4oX19uMiwgX19zdHJfc3ogLSBfX3BvczIpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgdmFsdWVfdHlwZSogX19zKQoreworICAgIF9MSUJDUFBfQVNTRVJUKF9fcyAhPSBudWxscHRyLCAic3RyaW5nOjpyZXBsYWNlIHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICByZXR1cm4gcmVwbGFjZShfX3BvcywgX19uMSwgX19zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnJlcGxhY2UoY29uc3RfaXRlcmF0b3IgX19pMSwgY29uc3RfaXRlcmF0b3IgX19pMiwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKK3sKKyAgICByZXR1cm4gcmVwbGFjZShzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9faTEgLSBiZWdpbigpKSwgc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX2kyIC0gX19pMSksCisgICAgICAgICAgICAgICAgICAgX19zdHIuZGF0YSgpLCBfX3N0ci5zaXplKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnJlcGxhY2UoY29uc3RfaXRlcmF0b3IgX19pMSwgY29uc3RfaXRlcmF0b3IgX19pMiwgY29uc3QgdmFsdWVfdHlwZSogX19zLCBzaXplX3R5cGUgX19uKQoreworICAgIHJldHVybiByZXBsYWNlKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19pMSAtIGJlZ2luKCkpLCBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9faTIgLSBfX2kxKSwgX19zLCBfX24pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnJlcGxhY2UoY29uc3RfaXRlcmF0b3IgX19pMSwgY29uc3RfaXRlcmF0b3IgX19pMiwgY29uc3QgdmFsdWVfdHlwZSogX19zKQoreworICAgIHJldHVybiByZXBsYWNlKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19pMSAtIGJlZ2luKCkpLCBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9faTIgLSBfX2kxKSwgX19zKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpyZXBsYWNlKGNvbnN0X2l0ZXJhdG9yIF9faTEsIGNvbnN0X2l0ZXJhdG9yIF9faTIsIHNpemVfdHlwZSBfX24sIHZhbHVlX3R5cGUgX19jKQoreworICAgIHJldHVybiByZXBsYWNlKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19pMSAtIGJlZ2luKCkpLCBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9faTIgLSBfX2kxKSwgX19uLCBfX2MpOworfQorCisvLyBlcmFzZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZXJhc2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKQoreworICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgIGlmIChfX3BvcyA+IF9fc3opCisgICAgICAgIHRoaXMtPl9fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgaWYgKF9fbikKKyAgICB7CisgICAgICAgIHZhbHVlX3R5cGUqIF9fcCA9IF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fZ2V0X3BvaW50ZXIoKSk7CisgICAgICAgIF9fbiA9IF9WU1REOjptaW4oX19uLCBfX3N6IC0gX19wb3MpOworICAgICAgICBzaXplX3R5cGUgX19uX21vdmUgPSBfX3N6IC0gX19wb3MgLSBfX247CisgICAgICAgIGlmIChfX25fbW92ZSAhPSAwKQorICAgICAgICAgICAgdHJhaXRzX3R5cGU6Om1vdmUoX19wICsgX19wb3MsIF9fcCArIF9fcG9zICsgX19uLCBfX25fbW92ZSk7CisgICAgICAgIF9fc3ogLT0gX19uOworICAgICAgICBfX3NldF9zaXplKF9fc3opOworICAgICAgICBfX2ludmFsaWRhdGVfaXRlcmF0b3JzX3Bhc3QoX19zeik7CisgICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oX19wW19fc3pdLCB2YWx1ZV90eXBlKCkpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3MpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19maW5kX2NfZnJvbV9pKCZfX3BvcykgPT0gdGhpcywKKyAgICAgICAgInN0cmluZzo6ZXJhc2UoaXRlcmF0b3IpIGNhbGxlZCB3aXRoIGFuIGl0ZXJhdG9yIG5vdCIKKyAgICAgICAgIiByZWZlcnJpbmcgdG8gdGhpcyBzdHJpbmciKTsKKyNlbmRpZgorICAgIF9MSUJDUFBfQVNTRVJUKF9fcG9zICE9IGVuZCgpLAorICAgICAgICAic3RyaW5nOjplcmFzZShpdGVyYXRvcikgY2FsbGVkIHdpdGggYSBub24tZGVyZWZlcmVuY2VhYmxlIGl0ZXJhdG9yIik7CisgICAgaXRlcmF0b3IgX19iID0gYmVnaW4oKTsKKyAgICBzaXplX3R5cGUgX19yID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX3BvcyAtIF9fYik7CisgICAgZXJhc2UoX19yLCAxKTsKKyAgICByZXR1cm4gX19iICsgc3RhdGljX2Nhc3Q8ZGlmZmVyZW5jZV90eXBlPihfX3IpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2ZpbmRfY19mcm9tX2koJl9fZmlyc3QpID09IHRoaXMsCisgICAgICAgICJzdHJpbmc6OmVyYXNlKGl0ZXJhdG9yLCAgaXRlcmF0b3IpIGNhbGxlZCB3aXRoIGFuIGl0ZXJhdG9yIG5vdCIKKyAgICAgICAgIiByZWZlcnJpbmcgdG8gdGhpcyBzdHJpbmciKTsKKyNlbmRpZgorICAgIF9MSUJDUFBfQVNTRVJUKF9fZmlyc3QgPD0gX19sYXN0LCAic3RyaW5nOjplcmFzZShmaXJzdCwgbGFzdCkgY2FsbGVkIHdpdGggaW52YWxpZCByYW5nZSIpOworICAgIGl0ZXJhdG9yIF9fYiA9IGJlZ2luKCk7CisgICAgc2l6ZV90eXBlIF9fciA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19maXJzdCAtIF9fYik7CisgICAgZXJhc2UoX19yLCBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fbGFzdCAtIF9fZmlyc3QpKTsKKyAgICByZXR1cm4gX19iICsgc3RhdGljX2Nhc3Q8ZGlmZmVyZW5jZV90eXBlPihfX3IpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojpwb3BfYmFjaygpCit7CisgICAgX0xJQkNQUF9BU1NFUlQoIWVtcHR5KCksICJzdHJpbmc6OnBvcF9iYWNrKCk6IHN0cmluZyBpcyBhbHJlYWR5IGVtcHR5Iik7CisgICAgc2l6ZV90eXBlIF9fc3o7CisgICAgaWYgKF9faXNfbG9uZygpKQorICAgIHsKKyAgICAgICAgX19zeiA9IF9fZ2V0X2xvbmdfc2l6ZSgpIC0gMTsKKyAgICAgICAgX19zZXRfbG9uZ19zaXplKF9fc3opOworICAgICAgICB0cmFpdHNfdHlwZTo6YXNzaWduKCooX19nZXRfbG9uZ19wb2ludGVyKCkgKyBfX3N6KSwgdmFsdWVfdHlwZSgpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX19zeiA9IF9fZ2V0X3Nob3J0X3NpemUoKSAtIDE7CisgICAgICAgIF9fc2V0X3Nob3J0X3NpemUoX19zeik7CisgICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oKihfX2dldF9zaG9ydF9wb2ludGVyKCkgKyBfX3N6KSwgdmFsdWVfdHlwZSgpKTsKKyAgICB9CisgICAgX19pbnZhbGlkYXRlX2l0ZXJhdG9yc19wYXN0KF9fc3opOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpjbGVhcigpIF9OT0VYQ0VQVAoreworICAgIF9faW52YWxpZGF0ZV9hbGxfaXRlcmF0b3JzKCk7CisgICAgaWYgKF9faXNfbG9uZygpKQorICAgIHsKKyAgICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbigqX19nZXRfbG9uZ19wb2ludGVyKCksIHZhbHVlX3R5cGUoKSk7CisgICAgICAgIF9fc2V0X2xvbmdfc2l6ZSgwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbigqX19nZXRfc2hvcnRfcG9pbnRlcigpLCB2YWx1ZV90eXBlKCkpOworICAgICAgICBfX3NldF9zaG9ydF9zaXplKDApOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6X19lcmFzZV90b19lbmQoc2l6ZV90eXBlIF9fcG9zKQoreworICAgIGlmIChfX2lzX2xvbmcoKSkKKyAgICB7CisgICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oKihfX2dldF9sb25nX3BvaW50ZXIoKSArIF9fcG9zKSwgdmFsdWVfdHlwZSgpKTsKKyAgICAgICAgX19zZXRfbG9uZ19zaXplKF9fcG9zKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbigqKF9fZ2V0X3Nob3J0X3BvaW50ZXIoKSArIF9fcG9zKSwgdmFsdWVfdHlwZSgpKTsKKyAgICAgICAgX19zZXRfc2hvcnRfc2l6ZShfX3Bvcyk7CisgICAgfQorICAgIF9faW52YWxpZGF0ZV9pdGVyYXRvcnNfcGFzdChfX3Bvcyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmVzaXplKHNpemVfdHlwZSBfX24sIHZhbHVlX3R5cGUgX19jKQoreworICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgIGlmIChfX24gPiBfX3N6KQorICAgICAgICBhcHBlbmQoX19uIC0gX19zeiwgX19jKTsKKyAgICBlbHNlCisgICAgICAgIF9fZXJhc2VfdG9fZW5kKF9fbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Om1heF9zaXplKCkgY29uc3QgX05PRVhDRVBUCit7CisgICAgc2l6ZV90eXBlIF9fbSA9IF9fYWxsb2NfdHJhaXRzOjptYXhfc2l6ZShfX2FsbG9jKCkpOworI2lmZGVmIF9MSUJDUFBfQklHX0VORElBTgorICAgIHJldHVybiAoX19tIDw9IH5fX2xvbmdfbWFzayA/IF9fbSA6IF9fbS8yKSAtIF9fYWxpZ25tZW50OworI2Vsc2UKKyAgICByZXR1cm4gX19tIC0gX19hbGlnbm1lbnQ7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpyZXNlcnZlKHNpemVfdHlwZSBfX3Jlc19hcmcpCit7CisgICAgaWYgKF9fcmVzX2FyZyA+IG1heF9zaXplKCkpCisgICAgICAgIHRoaXMtPl9fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7CisgICAgc2l6ZV90eXBlIF9fY2FwID0gY2FwYWNpdHkoKTsKKyAgICBzaXplX3R5cGUgX19zeiA9IHNpemUoKTsKKyAgICBfX3Jlc19hcmcgPSBfVlNURDo6bWF4KF9fcmVzX2FyZywgX19zeik7CisgICAgX19yZXNfYXJnID0gX19yZWNvbW1lbmQoX19yZXNfYXJnKTsKKyAgICBpZiAoX19yZXNfYXJnICE9IF9fY2FwKQorICAgIHsKKyAgICAgICAgcG9pbnRlciBfX25ld19kYXRhLCBfX3A7CisgICAgICAgIGJvb2wgX193YXNfbG9uZywgX19ub3dfbG9uZzsKKyAgICAgICAgaWYgKF9fcmVzX2FyZyA9PSBfX21pbl9jYXAgLSAxKQorICAgICAgICB7CisgICAgICAgICAgICBfX3dhc19sb25nID0gdHJ1ZTsKKyAgICAgICAgICAgIF9fbm93X2xvbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIF9fbmV3X2RhdGEgPSBfX2dldF9zaG9ydF9wb2ludGVyKCk7CisgICAgICAgICAgICBfX3AgPSBfX2dldF9sb25nX3BvaW50ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX3Jlc19hcmcgPiBfX2NhcCkKKyAgICAgICAgICAgICAgICBfX25ld19kYXRhID0gX19hbGxvY190cmFpdHM6OmFsbG9jYXRlKF9fYWxsb2MoKSwgX19yZXNfYXJnKzEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgICAgICAgICBfX25ld19kYXRhID0gX19hbGxvY190cmFpdHM6OmFsbG9jYXRlKF9fYWxsb2MoKSwgX19yZXNfYXJnKzEpOworICAgICAgICAgICAgI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKC4uLikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAjZWxzZSAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgICAgICAgICAgaWYgKF9fbmV3X2RhdGEgPT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fbm93X2xvbmcgPSB0cnVlOworICAgICAgICAgICAgX193YXNfbG9uZyA9IF9faXNfbG9uZygpOworICAgICAgICAgICAgX19wID0gX19nZXRfcG9pbnRlcigpOworICAgICAgICB9CisgICAgICAgIHRyYWl0c190eXBlOjpjb3B5KF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fbmV3X2RhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX3ApLCBzaXplKCkrMSk7CisgICAgICAgIGlmIChfX3dhc19sb25nKQorICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hbGxvYygpLCBfX3AsIF9fY2FwKzEpOworICAgICAgICBpZiAoX19ub3dfbG9uZykKKyAgICAgICAgeworICAgICAgICAgICAgX19zZXRfbG9uZ19jYXAoX19yZXNfYXJnKzEpOworICAgICAgICAgICAgX19zZXRfbG9uZ19zaXplKF9fc3opOworICAgICAgICAgICAgX19zZXRfbG9uZ19wb2ludGVyKF9fbmV3X2RhdGEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fc2V0X3Nob3J0X3NpemUoX19zeik7CisgICAgICAgIF9faW52YWxpZGF0ZV9hbGxfaXRlcmF0b3JzKCk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojpjb25zdF9yZWZlcmVuY2UKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpvcGVyYXRvcltdKHNpemVfdHlwZSBfX3BvcykgY29uc3QgX05PRVhDRVBUCit7CisgICAgX0xJQkNQUF9BU1NFUlQoX19wb3MgPD0gc2l6ZSgpLCAic3RyaW5nIGluZGV4IG91dCBvZiBib3VuZHMiKTsKKyAgICByZXR1cm4gKihkYXRhKCkgKyBfX3Bvcyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnJlZmVyZW5jZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Om9wZXJhdG9yW10oc2l6ZV90eXBlIF9fcG9zKSBfTk9FWENFUFQKK3sKKyAgICBfTElCQ1BQX0FTU0VSVChfX3BvcyA8PSBzaXplKCksICJzdHJpbmcgaW5kZXggb3V0IG9mIGJvdW5kcyIpOworICAgIHJldHVybiAqKF9fZ2V0X3BvaW50ZXIoKSArIF9fcG9zKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojpjb25zdF9yZWZlcmVuY2UKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjphdChzaXplX3R5cGUgX19uKSBjb25zdAoreworICAgIGlmIChfX24gPj0gc2l6ZSgpKQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiAoKnRoaXMpW19fbl07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmVmZXJlbmNlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YXQoc2l6ZV90eXBlIF9fbikKK3sKKyAgICBpZiAoX19uID49IHNpemUoKSkKKyAgICAgICAgdGhpcy0+X190aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICByZXR1cm4gKCp0aGlzKVtfX25dOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpyZWZlcmVuY2UKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojpmcm9udCgpCit7CisgICAgX0xJQkNQUF9BU1NFUlQoIWVtcHR5KCksICJzdHJpbmc6OmZyb250KCk6IHN0cmluZyBpcyBlbXB0eSIpOworICAgIHJldHVybiAqX19nZXRfcG9pbnRlcigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojpjb25zdF9yZWZlcmVuY2UKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojpmcm9udCgpIGNvbnN0Cit7CisgICAgX0xJQkNQUF9BU1NFUlQoIWVtcHR5KCksICJzdHJpbmc6OmZyb250KCk6IHN0cmluZyBpcyBlbXB0eSIpOworICAgIHJldHVybiAqZGF0YSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpyZWZlcmVuY2UKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpiYWNrKCkKK3sKKyAgICBfTElCQ1BQX0FTU0VSVCghZW1wdHkoKSwgInN0cmluZzo6YmFjaygpOiBzdHJpbmcgaXMgZW1wdHkiKTsKKyAgICByZXR1cm4gKihfX2dldF9wb2ludGVyKCkgKyBzaXplKCkgLSAxKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6Y29uc3RfcmVmZXJlbmNlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFjaygpIGNvbnN0Cit7CisgICAgX0xJQkNQUF9BU1NFUlQoIWVtcHR5KCksICJzdHJpbmc6OmJhY2soKTogc3RyaW5nIGlzIGVtcHR5Iik7CisgICAgcmV0dXJuICooZGF0YSgpICsgc2l6ZSgpIC0gMSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6Y29weSh2YWx1ZV90eXBlKiBfX3MsIHNpemVfdHlwZSBfX24sIHNpemVfdHlwZSBfX3BvcykgY29uc3QKK3sKKyAgICBzaXplX3R5cGUgX19zeiA9IHNpemUoKTsKKyAgICBpZiAoX19wb3MgPiBfX3N6KQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHNpemVfdHlwZSBfX3JsZW4gPSBfVlNURDo6bWluKF9fbiwgX19zeiAtIF9fcG9zKTsKKyAgICB0cmFpdHNfdHlwZTo6Y29weShfX3MsIGRhdGEoKSArIF9fcG9zLCBfX3JsZW4pOworICAgIHJldHVybiBfX3JsZW47Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzdWJzdHIoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAoreworICAgIHJldHVybiBiYXNpY19zdHJpbmcoKnRoaXMsIF9fcG9zLCBfX24sIF9fYWxsb2MoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnN3YXAoYmFzaWNfc3RyaW5nJiBfX3N0cikKKyNpZiBfTElCQ1BQX1NURF9WRVIgPj0gMTQKKyAgICAgICAgX05PRVhDRVBUX0RFQlVHCisjZWxzZQorICAgICAgICBfTk9FWENFUFRfREVCVUdfKCFfX2FsbG9jX3RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwOjp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpCisjZW5kaWYKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBpZiAoIV9faXNfbG9uZygpKQorICAgICAgICBfX2dldF9kYigpLT5fX2ludmFsaWRhdGVfYWxsKHRoaXMpOworICAgIGlmICghX19zdHIuX19pc19sb25nKCkpCisgICAgICAgIF9fZ2V0X2RiKCktPl9faW52YWxpZGF0ZV9hbGwoJl9fc3RyKTsKKyAgICBfX2dldF9kYigpLT5zd2FwKHRoaXMsICZfX3N0cik7CisjZW5kaWYKKyAgICBfTElCQ1BQX0FTU0VSVCgKKyAgICAgICAgX19hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDo6dmFsdWUgfHwKKyAgICAgICAgX19hbGxvY190cmFpdHM6OmlzX2Fsd2F5c19lcXVhbDo6dmFsdWUgfHwKKyAgICAgICAgX19hbGxvYygpID09IF9fc3RyLl9fYWxsb2MoKSwgInN3YXBwaW5nIG5vbi1lcXVhbCBhbGxvY2F0b3JzIik7CisgICAgX1ZTVEQ6OnN3YXAoX19yXy5maXJzdCgpLCBfX3N0ci5fX3JfLmZpcnN0KCkpOworICAgIF9fc3dhcF9hbGxvY2F0b3IoX19hbGxvYygpLCBfX3N0ci5fX2FsbG9jKCkpOworfQorCisvLyBmaW5kCisKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgorc3RydWN0IF9MSUJDUFBfSElEREVOIF9fdHJhaXRzX2VxCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUgY2hhcl90eXBlOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhcl90eXBlJiBfX3gsIGNvbnN0IGNoYXJfdHlwZSYgX195KSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfVHJhaXRzOjplcShfX3gsIF9feSk7fQorfTsKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmZpbmQoY29uc3QgdmFsdWVfdHlwZSogX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbikgY29uc3QgX05PRVhDRVBUCit7CisgICAgX0xJQkNQUF9BU1NFUlQoX19uID09IDAgfHwgX19zICE9IG51bGxwdHIsICJzdHJpbmc6OmZpbmQoKTogcmVjZWl2ZWQgbnVsbHB0ciIpOworICAgIHJldHVybiBfX3N0cl9maW5kPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19zLCBfX3BvcywgX19uKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpmaW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX3N0cl9maW5kPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19zdHIuZGF0YSgpLCBfX3BvcywgX19zdHIuc2l6ZSgpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpmaW5kKF9fc2VsZl92aWV3IF9fc3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX3N0cl9maW5kPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19zdi5kYXRhKCksIF9fcG9zLCBfX3N2LnNpemUoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZChjb25zdCB2YWx1ZV90eXBlKiBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIF9MSUJDUFBfQVNTRVJUKF9fcyAhPSBudWxscHRyLCAic3RyaW5nOjpmaW5kKCk6IHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICByZXR1cm4gX19zdHJfZmluZDx2YWx1ZV90eXBlLCBzaXplX3R5cGUsIHRyYWl0c190eXBlLCBucG9zPgorICAgICAgICAoZGF0YSgpLCBzaXplKCksIF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpmaW5kKHZhbHVlX3R5cGUgX19jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19zdHJfZmluZDx2YWx1ZV90eXBlLCBzaXplX3R5cGUsIHRyYWl0c190eXBlLCBucG9zPgorICAgICAgICAoZGF0YSgpLCBzaXplKCksIF9fYywgX19wb3MpOworfQorCisvLyByZmluZAorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmZpbmQoY29uc3QgdmFsdWVfdHlwZSogX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICBfTElCQ1BQX0FTU0VSVChfX24gPT0gMCB8fCBfX3MgIT0gbnVsbHB0ciwgInN0cmluZzo6cmZpbmQoKTogcmVjZWl2ZWQgbnVsbHB0ciIpOworICAgIHJldHVybiBfX3N0cl9yZmluZDx2YWx1ZV90eXBlLCBzaXplX3R5cGUsIHRyYWl0c190eXBlLCBucG9zPgorICAgICAgICAoZGF0YSgpLCBzaXplKCksIF9fcywgX19wb3MsIF9fbik7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmZpbmQoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX3N0cl9yZmluZDx2YWx1ZV90eXBlLCBzaXplX3R5cGUsIHRyYWl0c190eXBlLCBucG9zPgorICAgICAgICAoZGF0YSgpLCBzaXplKCksIF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmZpbmQoX19zZWxmX3ZpZXcgX19zdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvcykgY29uc3QgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fc3RyX3JmaW5kPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19zdi5kYXRhKCksIF9fcG9zLCBfX3N2LnNpemUoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmZpbmQoY29uc3QgdmFsdWVfdHlwZSogX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvcykgY29uc3QgX05PRVhDRVBUCit7CisgICAgX0xJQkNQUF9BU1NFUlQoX19zICE9IG51bGxwdHIsICJzdHJpbmc6OnJmaW5kKCk6IHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICByZXR1cm4gX19zdHJfcmZpbmQ8dmFsdWVfdHlwZSwgc2l6ZV90eXBlLCB0cmFpdHNfdHlwZSwgbnBvcz4KKyAgICAgICAgKGRhdGEoKSwgc2l6ZSgpLCBfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmZpbmQodmFsdWVfdHlwZSBfX2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19zdHJfcmZpbmQ8dmFsdWVfdHlwZSwgc2l6ZV90eXBlLCB0cmFpdHNfdHlwZSwgbnBvcz4KKyAgICAgICAgKGRhdGEoKSwgc2l6ZSgpLCBfX2MsIF9fcG9zKTsKK30KKworLy8gZmluZF9maXJzdF9vZgorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZF9maXJzdF9vZihjb25zdCB2YWx1ZV90eXBlKiBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICBfTElCQ1BQX0FTU0VSVChfX24gPT0gMCB8fCBfX3MgIT0gbnVsbHB0ciwgInN0cmluZzo6ZmluZF9maXJzdF9vZigpOiByZWNlaXZlZCBudWxscHRyIik7CisgICAgcmV0dXJuIF9fc3RyX2ZpbmRfZmlyc3Rfb2Y8dmFsdWVfdHlwZSwgc2l6ZV90eXBlLCB0cmFpdHNfdHlwZSwgbnBvcz4KKyAgICAgICAgKGRhdGEoKSwgc2l6ZSgpLCBfX3MsIF9fcG9zLCBfX24pOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmZpbmRfZmlyc3Rfb2YoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvcykgY29uc3QgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fc3RyX2ZpbmRfZmlyc3Rfb2Y8dmFsdWVfdHlwZSwgc2l6ZV90eXBlLCB0cmFpdHNfdHlwZSwgbnBvcz4KKyAgICAgICAgKGRhdGEoKSwgc2l6ZSgpLCBfX3N0ci5kYXRhKCksIF9fcG9zLCBfX3N0ci5zaXplKCkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmZpbmRfZmlyc3Rfb2YoX19zZWxmX3ZpZXcgX19zdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvcykgY29uc3QgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fc3RyX2ZpbmRfZmlyc3Rfb2Y8dmFsdWVfdHlwZSwgc2l6ZV90eXBlLCB0cmFpdHNfdHlwZSwgbnBvcz4KKyAgICAgICAgKGRhdGEoKSwgc2l6ZSgpLCBfX3N2LmRhdGEoKSwgX19wb3MsIF9fc3Yuc2l6ZSgpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpmaW5kX2ZpcnN0X29mKGNvbnN0IHZhbHVlX3R5cGUqIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvcykgY29uc3QgX05PRVhDRVBUCit7CisgICAgX0xJQkNQUF9BU1NFUlQoX19zICE9IG51bGxwdHIsICJzdHJpbmc6OmZpbmRfZmlyc3Rfb2YoKTogcmVjZWl2ZWQgbnVsbHB0ciIpOworICAgIHJldHVybiBfX3N0cl9maW5kX2ZpcnN0X29mPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpmaW5kX2ZpcnN0X29mKHZhbHVlX3R5cGUgX19jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gZmluZChfX2MsIF9fcG9zKTsKK30KKworLy8gZmluZF9sYXN0X29mCisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpmaW5kX2xhc3Rfb2YoY29uc3QgdmFsdWVfdHlwZSogX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24pIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIF9MSUJDUFBfQVNTRVJUKF9fbiA9PSAwIHx8IF9fcyAhPSBudWxscHRyLCAic3RyaW5nOjpmaW5kX2xhc3Rfb2YoKTogcmVjZWl2ZWQgbnVsbHB0ciIpOworICAgIHJldHVybiBfX3N0cl9maW5kX2xhc3Rfb2Y8dmFsdWVfdHlwZSwgc2l6ZV90eXBlLCB0cmFpdHNfdHlwZSwgbnBvcz4KKyAgICAgICAgKGRhdGEoKSwgc2l6ZSgpLCBfX3MsIF9fcG9zLCBfX24pOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmZpbmRfbGFzdF9vZihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX3N0cl9maW5kX2xhc3Rfb2Y8dmFsdWVfdHlwZSwgc2l6ZV90eXBlLCB0cmFpdHNfdHlwZSwgbnBvcz4KKyAgICAgICAgKGRhdGEoKSwgc2l6ZSgpLCBfX3N0ci5kYXRhKCksIF9fcG9zLCBfX3N0ci5zaXplKCkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmZpbmRfbGFzdF9vZihfX3NlbGZfdmlldyBfX3N2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19zdHJfZmluZF9sYXN0X29mPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19zdi5kYXRhKCksIF9fcG9zLCBfX3N2LnNpemUoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZF9sYXN0X29mKGNvbnN0IHZhbHVlX3R5cGUqIF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICBfTElCQ1BQX0FTU0VSVChfX3MgIT0gbnVsbHB0ciwgInN0cmluZzo6ZmluZF9sYXN0X29mKCk6IHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICByZXR1cm4gX19zdHJfZmluZF9sYXN0X29mPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpmaW5kX2xhc3Rfb2YodmFsdWVfdHlwZSBfX2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvcykgY29uc3QgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIHJmaW5kKF9fYywgX19wb3MpOworfQorCisvLyBmaW5kX2ZpcnN0X25vdF9vZgorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgdmFsdWVfdHlwZSogX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICBfTElCQ1BQX0FTU0VSVChfX24gPT0gMCB8fCBfX3MgIT0gbnVsbHB0ciwgInN0cmluZzo6ZmluZF9maXJzdF9ub3Rfb2YoKTogcmVjZWl2ZWQgbnVsbHB0ciIpOworICAgIHJldHVybiBfX3N0cl9maW5kX2ZpcnN0X25vdF9vZjx2YWx1ZV90eXBlLCBzaXplX3R5cGUsIHRyYWl0c190eXBlLCBucG9zPgorICAgICAgICAoZGF0YSgpLCBzaXplKCksIF9fcywgX19wb3MsIF9fbik7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX3N0cl9maW5kX2ZpcnN0X25vdF9vZjx2YWx1ZV90eXBlLCBzaXplX3R5cGUsIHRyYWl0c190eXBlLCBucG9zPgorICAgICAgICAoZGF0YSgpLCBzaXplKCksIF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZF9maXJzdF9ub3Rfb2YoX19zZWxmX3ZpZXcgX19zdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvcykgY29uc3QgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fc3RyX2ZpbmRfZmlyc3Rfbm90X29mPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19zdi5kYXRhKCksIF9fcG9zLCBfX3N2LnNpemUoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgdmFsdWVfdHlwZSogX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvcykgY29uc3QgX05PRVhDRVBUCit7CisgICAgX0xJQkNQUF9BU1NFUlQoX19zICE9IG51bGxwdHIsICJzdHJpbmc6OmZpbmRfZmlyc3Rfbm90X29mKCk6IHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICByZXR1cm4gX19zdHJfZmluZF9maXJzdF9ub3Rfb2Y8dmFsdWVfdHlwZSwgc2l6ZV90eXBlLCB0cmFpdHNfdHlwZSwgbnBvcz4KKyAgICAgICAgKGRhdGEoKSwgc2l6ZSgpLCBfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmZpbmRfZmlyc3Rfbm90X29mKHZhbHVlX3R5cGUgX19jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvcykgY29uc3QgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fc3RyX2ZpbmRfZmlyc3Rfbm90X29mPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19jLCBfX3Bvcyk7Cit9CisKKy8vIGZpbmRfbGFzdF9ub3Rfb2YKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgdmFsdWVfdHlwZSogX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbikgY29uc3QgX05PRVhDRVBUCit7CisgICAgX0xJQkNQUF9BU1NFUlQoX19uID09IDAgfHwgX19zICE9IG51bGxwdHIsICJzdHJpbmc6OmZpbmRfbGFzdF9ub3Rfb2YoKTogcmVjZWl2ZWQgbnVsbHB0ciIpOworICAgIHJldHVybiBfX3N0cl9maW5kX2xhc3Rfbm90X29mPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19zLCBfX3BvcywgX19uKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpmaW5kX2xhc3Rfbm90X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX3N0cl9maW5kX2xhc3Rfbm90X29mPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19zdHIuZGF0YSgpLCBfX3BvcywgX19zdHIuc2l6ZSgpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpmaW5kX2xhc3Rfbm90X29mKF9fc2VsZl92aWV3IF9fc3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX3N0cl9maW5kX2xhc3Rfbm90X29mPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19zdi5kYXRhKCksIF9fcG9zLCBfX3N2LnNpemUoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZF9sYXN0X25vdF9vZihjb25zdCB2YWx1ZV90eXBlKiBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIF9MSUJDUFBfQVNTRVJUKF9fcyAhPSBudWxscHRyLCAic3RyaW5nOjpmaW5kX2xhc3Rfbm90X29mKCk6IHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICByZXR1cm4gX19zdHJfZmluZF9sYXN0X25vdF9vZjx2YWx1ZV90eXBlLCBzaXplX3R5cGUsIHRyYWl0c190eXBlLCBucG9zPgorICAgICAgICAoZGF0YSgpLCBzaXplKCksIF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZF9sYXN0X25vdF9vZih2YWx1ZV90eXBlIF9fYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvcykgY29uc3QgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fc3RyX2ZpbmRfbGFzdF9ub3Rfb2Y8dmFsdWVfdHlwZSwgc2l6ZV90eXBlLCB0cmFpdHNfdHlwZSwgbnBvcz4KKyAgICAgICAgKGRhdGEoKSwgc2l6ZSgpLCBfX2MsIF9fcG9zKTsKK30KKworLy8gY29tcGFyZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2ludAorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmNvbXBhcmUoX19zZWxmX3ZpZXcgX19zdikgY29uc3QgX05PRVhDRVBUCit7CisgICAgc2l6ZV90IF9fbGhzX3N6ID0gc2l6ZSgpOworICAgIHNpemVfdCBfX3Joc19zeiA9IF9fc3Yuc2l6ZSgpOworICAgIGludCBfX3Jlc3VsdCA9IHRyYWl0c190eXBlOjpjb21wYXJlKGRhdGEoKSwgX19zdi5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6Om1pbihfX2xoc19zeiwgX19yaHNfc3opKTsKKyAgICBpZiAoX19yZXN1bHQgIT0gMCkKKyAgICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIGlmIChfX2xoc19zeiA8IF9fcmhzX3N6KQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKF9fbGhzX3N6ID4gX19yaHNfc3opCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2ludAorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmNvbXBhcmUoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikgY29uc3QgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIGNvbXBhcmUoX19zZWxmX3ZpZXcoX19zdHIpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2ludAorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbjIpIGNvbnN0Cit7CisgICAgX0xJQkNQUF9BU1NFUlQoX19uMiA9PSAwIHx8IF9fcyAhPSBudWxscHRyLCAic3RyaW5nOjpjb21wYXJlKCk6IHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICBzaXplX3R5cGUgX19zeiA9IHNpemUoKTsKKyAgICBpZiAoX19wb3MxID4gX19zeiB8fCBfX24yID09IG5wb3MpCisgICAgICAgIHRoaXMtPl9fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgc2l6ZV90eXBlIF9fcmxlbiA9IF9WU1REOjptaW4oX19uMSwgX19zeiAtIF9fcG9zMSk7CisgICAgaW50IF9fciA9IHRyYWl0c190eXBlOjpjb21wYXJlKGRhdGEoKSArIF9fcG9zMSwgX19zLCBfVlNURDo6bWluKF9fcmxlbiwgX19uMikpOworICAgIGlmIChfX3IgPT0gMCkKKyAgICB7CisgICAgICAgIGlmIChfX3JsZW4gPCBfX24yKQorICAgICAgICAgICAgX19yID0gLTE7CisgICAgICAgIGVsc2UgaWYgKF9fcmxlbiA+IF9fbjIpCisgICAgICAgICAgICBfX3IgPSAxOworICAgIH0KKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2ludAorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zZWxmX3ZpZXcgX19zdikgY29uc3QKK3sKKyAgICByZXR1cm4gY29tcGFyZShfX3BvczEsIF9fbjEsIF9fc3YuZGF0YSgpLCBfX3N2LnNpemUoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW50CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6Y29tcGFyZShzaXplX3R5cGUgX19wb3MxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKSBjb25zdAoreworICAgIHJldHVybiBjb21wYXJlKF9fcG9zMSwgX19uMSwgX19zdHIuZGF0YSgpLCBfX3N0ci5zaXplKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9fY2FuX2JlX2NvbnZlcnRlZF90b19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHMsIF9UcD46OnZhbHVlLAorICAgIGludAorPjo6dHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbjIpIGNvbnN0Cit7CisgICAgX19zZWxmX3ZpZXcgX19zdiA9IF9fdDsKKyAgICByZXR1cm4gX19zZWxmX3ZpZXcoKnRoaXMpLnN1YnN0cihfX3BvczEsIF9fbjEpLmNvbXBhcmUoX19zdi5zdWJzdHIoX19wb3MyLCBfX24yKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbnQKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojpjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbjIpIGNvbnN0Cit7CisgICAgICAgIHJldHVybiBjb21wYXJlKF9fcG9zMSwgX19uMSwgX19zZWxmX3ZpZXcoX19zdHIpLCBfX3BvczIsIF9fbjIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW50CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6Y29tcGFyZShjb25zdCB2YWx1ZV90eXBlKiBfX3MpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIF9MSUJDUFBfQVNTRVJUKF9fcyAhPSBudWxscHRyLCAic3RyaW5nOjpjb21wYXJlKCk6IHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICByZXR1cm4gY29tcGFyZSgwLCBucG9zLCBfX3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbnQKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojpjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fcykgY29uc3QKK3sKKyAgICBfTElCQ1BQX0FTU0VSVChfX3MgIT0gbnVsbHB0ciwgInN0cmluZzo6Y29tcGFyZSgpOiByZWNlaXZlZCBudWxscHRyIik7CisgICAgcmV0dXJuIGNvbXBhcmUoX19wb3MxLCBfX24xLCBfX3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7Cit9CisKKy8vIF9faW52YXJpYW50cworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Ol9faW52YXJpYW50cygpIGNvbnN0Cit7CisgICAgaWYgKHNpemUoKSA+IGNhcGFjaXR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoY2FwYWNpdHkoKSA8IF9fbWluX2NhcCAtIDEpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZGF0YSgpID09IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZGF0YSgpW3NpemUoKV0gIT0gdmFsdWVfdHlwZSgwKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBfX2NsZWFyX2FuZF9zaHJpbmsKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQgCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6X19jbGVhcl9hbmRfc2hyaW5rKCkKK3sKKyAgICBjbGVhcigpOworICAgIGlmKF9faXNfbG9uZygpKQorICAgIHsKKyAgICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hbGxvYygpLCBfX2dldF9sb25nX3BvaW50ZXIoKSwgY2FwYWNpdHkoKSArIDEpOworICAgICAgICBfX3NldF9sb25nX2NhcCgwKTsKKyAgICAgICAgX19zZXRfc2hvcnRfc2l6ZSgwKTsKKyAgICB9Cit9IAorCisvLyBvcGVyYXRvcj09CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj09KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX2xocywKKyAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICBzaXplX3QgX19saHNfc3ogPSBfX2xocy5zaXplKCk7CisgICAgcmV0dXJuIF9fbGhzX3N6ID09IF9fcmhzLnNpemUoKSAmJiBfVHJhaXRzOjpjb21wYXJlKF9fbGhzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yaHMuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2xoc19zeikgPT0gMDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj09KGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgX0FsbG9jYXRvcj4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIF9BbGxvY2F0b3I+JiBfX3JocykgX05PRVhDRVBUCit7CisgICAgc2l6ZV90IF9fbGhzX3N6ID0gX19saHMuc2l6ZSgpOworICAgIGlmIChfX2xoc19zeiAhPSBfX3Jocy5zaXplKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBjaGFyKiBfX2xwID0gX19saHMuZGF0YSgpOworICAgIGNvbnN0IGNoYXIqIF9fcnAgPSBfX3Jocy5kYXRhKCk7CisgICAgaWYgKF9fbGhzLl9faXNfbG9uZygpKQorICAgICAgICByZXR1cm4gY2hhcl90cmFpdHM8Y2hhcj46OmNvbXBhcmUoX19scCwgX19ycCwgX19saHNfc3opID09IDA7CisgICAgZm9yICg7IF9fbGhzX3N6ICE9IDA7IC0tX19saHNfc3osICsrX19scCwgKytfX3JwKQorICAgICAgICBpZiAoKl9fbHAgIT0gKl9fcnApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj09KGNvbnN0IF9DaGFyVCogX19saHMsCisgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3JocykgX05PRVhDRVBUCit7CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiBfU3RyaW5nOworICAgIF9MSUJDUFBfQVNTRVJUKF9fbGhzICE9IG51bGxwdHIsICJvcGVyYXRvcj09KGNoYXIqLCBiYXNpY19zdHJpbmcpOiByZWNlaXZlZCBudWxscHRyIik7CisgICAgc2l6ZV90IF9fbGhzX2xlbiA9IF9UcmFpdHM6Omxlbmd0aChfX2xocyk7CisgICAgaWYgKF9fbGhzX2xlbiAhPSBfX3Jocy5zaXplKCkpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gX19yaHMuY29tcGFyZSgwLCBfU3RyaW5nOjpucG9zLCBfX2xocywgX19saHNfbGVuKSA9PSAwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+IF9TdHJpbmc7CisgICAgX0xJQkNQUF9BU1NFUlQoX19yaHMgIT0gbnVsbHB0ciwgIm9wZXJhdG9yPT0oYmFzaWNfc3RyaW5nLCBjaGFyKik6IHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICBzaXplX3QgX19yaHNfbGVuID0gX1RyYWl0czo6bGVuZ3RoKF9fcmhzKTsKKyAgICBpZiAoX19yaHNfbGVuICE9IF9fbGhzLnNpemUoKSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBfX2xocy5jb21wYXJlKDAsIF9TdHJpbmc6Om5wb3MsIF9fcmhzLCBfX3Joc19sZW4pID09IDA7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19saHMsCisgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3JocykgX05PRVhDRVBUCit7CisgICAgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBfQ2hhclQqIF9fbGhzLAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19yaHMpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yIT0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7Cit9CisKKy8vIG9wZXJhdG9yPAorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8IChjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19saHMsCisgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3JocykgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpIDwgMDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPCAoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPCAwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8IChjb25zdCBfQ2hhclQqIF9fbGhzLAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19yaHMpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX3Jocy5jb21wYXJlKF9fbGhzKSA+IDA7Cit9CisKKy8vIG9wZXJhdG9yPgorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+IChjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19saHMsCisgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3JocykgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fcmhzIDwgX19saHM7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj4gKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX2xocywKKyAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fcmhzIDwgX19saHM7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj4gKGNvbnN0IF9DaGFyVCogX19saHMsCisgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3JocykgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fcmhzIDwgX19saHM7Cit9CisKKy8vIG9wZXJhdG9yPD0KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPD0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19yaHMpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiAhKF9fcmhzIDwgX19saHMpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19saHMsCisgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiAhKF9fcmhzIDwgX19saHMpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8PShjb25zdCBfQ2hhclQqIF9fbGhzLAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19yaHMpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiAhKF9fcmhzIDwgX19saHMpOworfQorCisvLyBvcGVyYXRvcj49CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj49KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX2xocywKKyAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gIShfX2xocyA8IF9fcmhzKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPj0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gIShfX2xocyA8IF9fcmhzKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPj0oY29uc3QgX0NoYXJUKiBfX2xocywKKyAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gIShfX2xocyA8IF9fcmhzKTsKK30KKworLy8gb3BlcmF0b3IgKworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPgorb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX2xocywKKyAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19yaHMpCit7CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4gX19yKF9fbGhzLmdldF9hbGxvY2F0b3IoKSk7CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZSBfX2xoc19zeiA9IF9fbGhzLnNpemUoKTsKKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlIF9fcmhzX3N6ID0gX19yaHMuc2l6ZSgpOworICAgIF9fci5fX2luaXQoX19saHMuZGF0YSgpLCBfX2xoc19zeiwgX19saHNfc3ogKyBfX3Joc19zeik7CisgICAgX19yLmFwcGVuZChfX3Jocy5kYXRhKCksIF9fcmhzX3N6KTsKKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPgorb3BlcmF0b3IrKGNvbnN0IF9DaGFyVCogX19saHMgLCBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQoreworICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+IF9fcihfX3Jocy5nZXRfYWxsb2NhdG9yKCkpOworICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUgX19saHNfc3ogPSBfVHJhaXRzOjpsZW5ndGgoX19saHMpOworICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUgX19yaHNfc3ogPSBfX3Jocy5zaXplKCk7CisgICAgX19yLl9faW5pdChfX2xocywgX19saHNfc3osIF9fbGhzX3N6ICsgX19yaHNfc3opOworICAgIF9fci5hcHBlbmQoX19yaHMuZGF0YSgpLCBfX3Joc19zeik7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK29wZXJhdG9yKyhfQ2hhclQgX19saHMsIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCit7CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4gX19yKF9fcmhzLmdldF9hbGxvY2F0b3IoKSk7CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZSBfX3Joc19zeiA9IF9fcmhzLnNpemUoKTsKKyAgICBfX3IuX19pbml0KCZfX2xocywgMSwgMSArIF9fcmhzX3N6KTsKKyAgICBfX3IuYXBwZW5kKF9fcmhzLmRhdGEoKSwgX19yaHNfc3opOworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+CitvcGVyYXRvcisoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fbGhzLCBjb25zdCBfQ2hhclQqIF9fcmhzKQoreworICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+IF9fcihfX2xocy5nZXRfYWxsb2NhdG9yKCkpOworICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUgX19saHNfc3ogPSBfX2xocy5zaXplKCk7CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZSBfX3Joc19zeiA9IF9UcmFpdHM6Omxlbmd0aChfX3Jocyk7CisgICAgX19yLl9faW5pdChfX2xocy5kYXRhKCksIF9fbGhzX3N6LCBfX2xoc19zeiArIF9fcmhzX3N6KTsKKyAgICBfX3IuYXBwZW5kKF9fcmhzLCBfX3Joc19zeik7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK29wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19saHMsIF9DaGFyVCBfX3JocykKK3sKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiBfX3IoX19saHMuZ2V0X2FsbG9jYXRvcigpKTsKKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlIF9fbGhzX3N6ID0gX19saHMuc2l6ZSgpOworICAgIF9fci5fX2luaXQoX19saHMuZGF0YSgpLCBfX2xoc19zeiwgX19saHNfc3ogKyAxKTsKKyAgICBfX3IucHVzaF9iYWNrKF9fcmhzKTsKKyAgICByZXR1cm4gX19yOworfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK29wZXJhdG9yKyhiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYmIF9fbGhzLCBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19yaHMpCit7CisgICAgcmV0dXJuIF9WU1REOjptb3ZlKF9fbGhzLmFwcGVuZChfX3JocykpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK29wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19saHMsIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiYgX19yaHMpCit7CisgICAgcmV0dXJuIF9WU1REOjptb3ZlKF9fcmhzLmluc2VydCgwLCBfX2xocykpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK29wZXJhdG9yKyhiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYmIF9fbGhzLCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYmIF9fcmhzKQoreworICAgIHJldHVybiBfVlNURDo6bW92ZShfX2xocy5hcHBlbmQoX19yaHMpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+CitvcGVyYXRvcisoY29uc3QgX0NoYXJUKiBfX2xocyAsIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYmIF9fcmhzKQoreworICAgIHJldHVybiBfVlNURDo6bW92ZShfX3Jocy5pbnNlcnQoMCwgX19saHMpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+CitvcGVyYXRvcisoX0NoYXJUIF9fbGhzLCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mJiBfX3JocykKK3sKKyAgICBfX3Jocy5pbnNlcnQoX19yaHMuYmVnaW4oKSwgX19saHMpOworICAgIHJldHVybiBfVlNURDo6bW92ZShfX3Jocyk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPgorb3BlcmF0b3IrKGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiYgX19saHMsIGNvbnN0IF9DaGFyVCogX19yaHMpCit7CisgICAgcmV0dXJuIF9WU1REOjptb3ZlKF9fbGhzLmFwcGVuZChfX3JocykpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK29wZXJhdG9yKyhiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYmIF9fbGhzLCBfQ2hhclQgX19yaHMpCit7CisgICAgX19saHMucHVzaF9iYWNrKF9fcmhzKTsKKyAgICByZXR1cm4gX1ZTVEQ6Om1vdmUoX19saHMpOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisvLyBzd2FwCisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzd2FwKGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX2xocywKKyAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgICBfTk9FWENFUFRfKF9OT0VYQ0VQVF8oX19saHMuc3dhcChfX3JocykpKQoreworICAgIF9fbGhzLnN3YXAoX19yaHMpOworfQorCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1VOSUNPREVfQ0hBUlMKKwordHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcjE2X3Q+IHUxNnN0cmluZzsKK3R5cGVkZWYgYmFzaWNfc3RyaW5nPGNoYXIzMl90PiB1MzJzdHJpbmc7CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fVU5JQ09ERV9DSEFSUworCitfTElCQ1BQX0ZVTkNfVklTIGludCAgICAgICAgICAgICAgICBzdG9pICAoY29uc3Qgc3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCk7CitfTElCQ1BQX0ZVTkNfVklTIGxvbmcgICAgICAgICAgICAgICBzdG9sICAoY29uc3Qgc3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCk7CitfTElCQ1BQX0ZVTkNfVklTIHVuc2lnbmVkIGxvbmcgICAgICBzdG91bCAoY29uc3Qgc3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCk7CitfTElCQ1BQX0ZVTkNfVklTIGxvbmcgbG9uZyAgICAgICAgICBzdG9sbCAoY29uc3Qgc3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCk7CitfTElCQ1BQX0ZVTkNfVklTIHVuc2lnbmVkIGxvbmcgbG9uZyBzdG91bGwoY29uc3Qgc3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCk7CisKK19MSUJDUFBfRlVOQ19WSVMgZmxvYXQgICAgICAgc3RvZiAoY29uc3Qgc3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDApOworX0xJQkNQUF9GVU5DX1ZJUyBkb3VibGUgICAgICBzdG9kIChjb25zdCBzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCk7CitfTElCQ1BQX0ZVTkNfVklTIGxvbmcgZG91YmxlIHN0b2xkKGNvbnN0IHN0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwKTsKKworX0xJQkNQUF9GVU5DX1ZJUyBzdHJpbmcgdG9fc3RyaW5nKGludCBfX3ZhbCk7CitfTElCQ1BQX0ZVTkNfVklTIHN0cmluZyB0b19zdHJpbmcodW5zaWduZWQgX192YWwpOworX0xJQkNQUF9GVU5DX1ZJUyBzdHJpbmcgdG9fc3RyaW5nKGxvbmcgX192YWwpOworX0xJQkNQUF9GVU5DX1ZJUyBzdHJpbmcgdG9fc3RyaW5nKHVuc2lnbmVkIGxvbmcgX192YWwpOworX0xJQkNQUF9GVU5DX1ZJUyBzdHJpbmcgdG9fc3RyaW5nKGxvbmcgbG9uZyBfX3ZhbCk7CitfTElCQ1BQX0ZVTkNfVklTIHN0cmluZyB0b19zdHJpbmcodW5zaWduZWQgbG9uZyBsb25nIF9fdmFsKTsKK19MSUJDUFBfRlVOQ19WSVMgc3RyaW5nIHRvX3N0cmluZyhmbG9hdCBfX3ZhbCk7CitfTElCQ1BQX0ZVTkNfVklTIHN0cmluZyB0b19zdHJpbmcoZG91YmxlIF9fdmFsKTsKK19MSUJDUFBfRlVOQ19WSVMgc3RyaW5nIHRvX3N0cmluZyhsb25nIGRvdWJsZSBfX3ZhbCk7CisKK19MSUJDUFBfRlVOQ19WSVMgaW50ICAgICAgICAgICAgICAgIHN0b2kgIChjb25zdCB3c3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCk7CitfTElCQ1BQX0ZVTkNfVklTIGxvbmcgICAgICAgICAgICAgICBzdG9sICAoY29uc3Qgd3N0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwLCBpbnQgX19iYXNlID0gMTApOworX0xJQkNQUF9GVU5DX1ZJUyB1bnNpZ25lZCBsb25nICAgICAgc3RvdWwgKGNvbnN0IHdzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKTsKK19MSUJDUFBfRlVOQ19WSVMgbG9uZyBsb25nICAgICAgICAgIHN0b2xsIChjb25zdCB3c3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCk7CitfTElCQ1BQX0ZVTkNfVklTIHVuc2lnbmVkIGxvbmcgbG9uZyBzdG91bGwoY29uc3Qgd3N0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwLCBpbnQgX19iYXNlID0gMTApOworCitfTElCQ1BQX0ZVTkNfVklTIGZsb2F0ICAgICAgIHN0b2YgKGNvbnN0IHdzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCk7CitfTElCQ1BQX0ZVTkNfVklTIGRvdWJsZSAgICAgIHN0b2QgKGNvbnN0IHdzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCk7CitfTElCQ1BQX0ZVTkNfVklTIGxvbmcgZG91YmxlIHN0b2xkKGNvbnN0IHdzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCk7CisKK19MSUJDUFBfRlVOQ19WSVMgd3N0cmluZyB0b193c3RyaW5nKGludCBfX3ZhbCk7CitfTElCQ1BQX0ZVTkNfVklTIHdzdHJpbmcgdG9fd3N0cmluZyh1bnNpZ25lZCBfX3ZhbCk7CitfTElCQ1BQX0ZVTkNfVklTIHdzdHJpbmcgdG9fd3N0cmluZyhsb25nIF9fdmFsKTsKK19MSUJDUFBfRlVOQ19WSVMgd3N0cmluZyB0b193c3RyaW5nKHVuc2lnbmVkIGxvbmcgX192YWwpOworX0xJQkNQUF9GVU5DX1ZJUyB3c3RyaW5nIHRvX3dzdHJpbmcobG9uZyBsb25nIF9fdmFsKTsKK19MSUJDUFBfRlVOQ19WSVMgd3N0cmluZyB0b193c3RyaW5nKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbCk7CitfTElCQ1BQX0ZVTkNfVklTIHdzdHJpbmcgdG9fd3N0cmluZyhmbG9hdCBfX3ZhbCk7CitfTElCQ1BQX0ZVTkNfVklTIHdzdHJpbmcgdG9fd3N0cmluZyhkb3VibGUgX192YWwpOworX0xJQkNQUF9GVU5DX1ZJUyB3c3RyaW5nIHRvX3dzdHJpbmcobG9uZyBkb3VibGUgX192YWwpOworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CisgICAgY29uc3QgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZQorICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpucG9zOworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDxiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiA+CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4sIHNpemVfdD4KK3sKKyAgICBzaXplX3QKKyAgICAgICAgb3BlcmF0b3IoKShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX192YWwpIGNvbnN0IF9OT0VYQ0VQVDsKK307CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3NpemVfdAoraGFzaDxiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiA+OjpvcGVyYXRvcigpKAorICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX192YWwpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX2RvX3N0cmluZ19oYXNoKF9fdmFsLmRhdGEoKSwgX192YWwuZGF0YSgpICsgX192YWwuc2l6ZSgpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgorb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3N0cik7CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK29wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorICAgICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19zdHIpOworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitnZXRsaW5lKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKyAgICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fc3RyLCBfQ2hhclQgX19kbG0pOworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorZ2V0bGluZShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisgICAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3N0cik7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCitnZXRsaW5lKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYmIF9faXMsCisgICAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3N0ciwgX0NoYXJUIF9fZGxtKTsKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKK2dldGxpbmUoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiYgX19pcywKKyAgICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fc3RyKTsKKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Citib29sCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6X19kZXJlZmVyZW5jZWFibGUoY29uc3QgY29uc3RfaXRlcmF0b3IqIF9faSkgY29uc3QKK3sKKyAgICByZXR1cm4gdGhpcy0+ZGF0YSgpIDw9IF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9faS0+YmFzZSgpKSAmJgorICAgICAgICAgICBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX2ktPmJhc2UoKSkgPCB0aGlzLT5kYXRhKCkgKyB0aGlzLT5zaXplKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jvb2wKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpfX2RlY3JlbWVudGFibGUoY29uc3QgY29uc3RfaXRlcmF0b3IqIF9faSkgY29uc3QKK3sKKyAgICByZXR1cm4gdGhpcy0+ZGF0YSgpIDwgX1ZTVEQ6Ol9fdG9fcmF3X3BvaW50ZXIoX19pLT5iYXNlKCkpICYmCisgICAgICAgICAgIF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9faS0+YmFzZSgpKSA8PSB0aGlzLT5kYXRhKCkgKyB0aGlzLT5zaXplKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jvb2wKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpfX2FkZGFibGUoY29uc3QgY29uc3RfaXRlcmF0b3IqIF9faSwgcHRyZGlmZl90IF9fbikgY29uc3QKK3sKKyAgICBjb25zdCB2YWx1ZV90eXBlKiBfX3AgPSBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX2ktPmJhc2UoKSkgKyBfX247CisgICAgcmV0dXJuIHRoaXMtPmRhdGEoKSA8PSBfX3AgJiYgX19wIDw9IHRoaXMtPmRhdGEoKSArIHRoaXMtPnNpemUoKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYm9vbAorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Ol9fc3Vic2NyaXB0YWJsZShjb25zdCBjb25zdF9pdGVyYXRvciogX19pLCBwdHJkaWZmX3QgX19uKSBjb25zdAoreworICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fcCA9IF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9faS0+YmFzZSgpKSArIF9fbjsKKyAgICByZXR1cm4gdGhpcy0+ZGF0YSgpIDw9IF9fcCAmJiBfX3AgPCB0aGlzLT5kYXRhKCkgKyB0aGlzLT5zaXplKCk7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIGJhc2ljX3N0cmluZzxjaGFyPikKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKGNsYXNzIF9MSUJDUFBfRVhURVJOX1RFTVBMQVRFX1RZUEVfVklTIGJhc2ljX3N0cmluZzx3Y2hhcl90PikKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExIAorLy8gTGl0ZXJhbCBzdWZmaXhlcyBmb3IgYmFzaWNfc3RyaW5nIFtiYXNpYy5zdHJpbmcubGl0ZXJhbHNdCitpbmxpbmUgbmFtZXNwYWNlIGxpdGVyYWxzCit7CisgIGlubGluZSBuYW1lc3BhY2Ugc3RyaW5nX2xpdGVyYWxzCisgIHsKKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX3N0cmluZzxjaGFyPiBvcGVyYXRvciAiIiBzKCBjb25zdCBjaGFyICpfX3N0ciwgc2l6ZV90IF9fbGVuICkKKyAgICB7CisgICAgICAgIHJldHVybiBiYXNpY19zdHJpbmc8Y2hhcj4gKF9fc3RyLCBfX2xlbik7CisgICAgfQorCisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmc8d2NoYXJfdD4gb3BlcmF0b3IgIiIgcyggY29uc3Qgd2NoYXJfdCAqX19zdHIsIHNpemVfdCBfX2xlbiApCisgICAgeworICAgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nPHdjaGFyX3Q+IChfX3N0ciwgX19sZW4pOworICAgIH0KKworICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfc3RyaW5nPGNoYXIxNl90PiBvcGVyYXRvciAiIiBzKCBjb25zdCBjaGFyMTZfdCAqX19zdHIsIHNpemVfdCBfX2xlbiApCisgICAgeworICAgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nPGNoYXIxNl90PiAoX19zdHIsIF9fbGVuKTsKKyAgICB9CisKKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX3N0cmluZzxjaGFyMzJfdD4gb3BlcmF0b3IgIiIgcyggY29uc3QgY2hhcjMyX3QgKl9fc3RyLCBzaXplX3QgX19sZW4gKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJhc2ljX3N0cmluZzxjaGFyMzJfdD4gKF9fc3RyLCBfX2xlbik7CisgICAgfQorICB9Cit9CisjZW5kaWYKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCitfTElCQ1BQX1BPUF9NQUNST1MKKworI2VuZGlmICAvLyBfTElCQ1BQX1NUUklORwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N0cmluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExY2U1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3RyaW5nLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdHJpbmcuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfU1RSSU5HX0gKKyNkZWZpbmUgX0xJQkNQUF9TVFJJTkdfSAorCisvKgorICAgIHN0cmluZy5oIHN5bm9wc2lzCisKK01hY3JvczoKKworICAgIE5VTEwKKworVHlwZXM6CisKKyAgICBzaXplX3QKKwordm9pZCogbWVtY3B5KHZvaWQqIHJlc3RyaWN0IHMxLCBjb25zdCB2b2lkKiByZXN0cmljdCBzMiwgc2l6ZV90IG4pOwordm9pZCogbWVtbW92ZSh2b2lkKiBzMSwgY29uc3Qgdm9pZCogczIsIHNpemVfdCBuKTsKK2NoYXIqIHN0cmNweSAoY2hhciogcmVzdHJpY3QgczEsIGNvbnN0IGNoYXIqIHJlc3RyaWN0IHMyKTsKK2NoYXIqIHN0cm5jcHkoY2hhciogcmVzdHJpY3QgczEsIGNvbnN0IGNoYXIqIHJlc3RyaWN0IHMyLCBzaXplX3Qgbik7CitjaGFyKiBzdHJjYXQgKGNoYXIqIHJlc3RyaWN0IHMxLCBjb25zdCBjaGFyKiByZXN0cmljdCBzMik7CitjaGFyKiBzdHJuY2F0KGNoYXIqIHJlc3RyaWN0IHMxLCBjb25zdCBjaGFyKiByZXN0cmljdCBzMiwgc2l6ZV90IG4pOworaW50IG1lbWNtcChjb25zdCB2b2lkKiBzMSwgY29uc3Qgdm9pZCogczIsIHNpemVfdCBuKTsKK2ludCBzdHJjbXAgKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMik7CitpbnQgc3RybmNtcChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIsIHNpemVfdCBuKTsKK2ludCBzdHJjb2xsKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMik7CitzaXplX3Qgc3RyeGZybShjaGFyKiByZXN0cmljdCBzMSwgY29uc3QgY2hhciogcmVzdHJpY3QgczIsIHNpemVfdCBuKTsKK2NvbnN0IHZvaWQqIG1lbWNocihjb25zdCB2b2lkKiBzLCBpbnQgYywgc2l6ZV90IG4pOworICAgICAgdm9pZCogbWVtY2hyKCAgICAgIHZvaWQqIHMsIGludCBjLCBzaXplX3Qgbik7Citjb25zdCBjaGFyKiBzdHJjaHIoY29uc3QgY2hhciogcywgaW50IGMpOworICAgICAgY2hhciogc3RyY2hyKCAgICAgIGNoYXIqIHMsIGludCBjKTsKK3NpemVfdCBzdHJjc3BuKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMik7Citjb25zdCBjaGFyKiBzdHJwYnJrKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMik7CisgICAgICBjaGFyKiBzdHJwYnJrKCAgICAgIGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMik7Citjb25zdCBjaGFyKiBzdHJyY2hyKGNvbnN0IGNoYXIqIHMsIGludCBjKTsKKyAgICAgIGNoYXIqIHN0cnJjaHIoICAgICAgY2hhciogcywgaW50IGMpOworc2l6ZV90IHN0cnNwbihjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpOworY29uc3QgY2hhciogc3Ryc3RyKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMik7CisgICAgICBjaGFyKiBzdHJzdHIoICAgICAgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKTsKK2NoYXIqIHN0cnRvayhjaGFyKiByZXN0cmljdCBzMSwgY29uc3QgY2hhciogcmVzdHJpY3QgczIpOwordm9pZCogbWVtc2V0KHZvaWQqIHMsIGludCBjLCBzaXplX3Qgbik7CitjaGFyKiBzdHJlcnJvcihpbnQgZXJybnVtKTsKK3NpemVfdCBzdHJsZW4oY29uc3QgY2hhciogcyk7CisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKKyNpbmNsdWRlX25leHQgPHN0cmluZy5oPgorCisvLyBNU1ZDUlQsIEdOVSBsaWJjIGFuZCBpdHMgZGVyaXZhdGVzIG1heSBhbHJlYWR5IGhhdmUgdGhlIGNvcnJlY3QgcHJvdG90eXBlIGluCisvLyA8c3RyaW5nLmg+LiBUaGlzIG1hY3JvIGNhbiBiZSBkZWZpbmVkIGJ5IHVzZXJzIGlmIHRoZWlyIEMgbGlicmFyeSBwcm92aWRlcworLy8gdGhlIHJpZ2h0IHNpZ25hdHVyZS4KKyNpZiBkZWZpbmVkKF9fQ09SUkVDVF9JU09fQ1BQX1NUUklOR19IX1BST1RPKSB8fCBkZWZpbmVkKF9MSUJDUFBfTVNWQ1JUKSB8fCBcCisgICAgZGVmaW5lZChfX3N1bl9fKSB8fCBkZWZpbmVkKF9TVFJJTkdfSF9DUExVU1BMVVNfOThfQ09ORk9STUFOQ0VfKQorI2RlZmluZSBfTElCQ1BQX1NUUklOR19IX0hBU19DT05TVF9PVkVSTE9BRFMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoX0xJQkNQUF9TVFJJTkdfSF9IQVNfQ09OU1RfT1ZFUkxPQURTKSAmJiBkZWZpbmVkKF9MSUJDUFBfUFJFRkVSUkVEX09WRVJMT0FEKQorZXh0ZXJuICJDKysiIHsKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjaGFyKiBfX2xpYmNwcF9zdHJjaHIoY29uc3QgY2hhciogX19zLCBpbnQgX19jKSB7cmV0dXJuIChjaGFyKilzdHJjaHIoX19zLCBfX2MpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfUFJFRkVSUkVEX09WRVJMT0FECitjb25zdCBjaGFyKiBzdHJjaHIoY29uc3QgY2hhciogX19zLCBpbnQgX19jKSB7cmV0dXJuIF9fbGliY3BwX3N0cmNocihfX3MsIF9fYyk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9QUkVGRVJSRURfT1ZFUkxPQUQKKyAgICAgIGNoYXIqIHN0cmNociggICAgICBjaGFyKiBfX3MsIGludCBfX2MpIHtyZXR1cm4gX19saWJjcHBfc3RyY2hyKF9fcywgX19jKTt9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjaGFyKiBfX2xpYmNwcF9zdHJwYnJrKGNvbnN0IGNoYXIqIF9fczEsIGNvbnN0IGNoYXIqIF9fczIpIHtyZXR1cm4gKGNoYXIqKXN0cnBicmsoX19zMSwgX19zMik7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9QUkVGRVJSRURfT1ZFUkxPQUQKK2NvbnN0IGNoYXIqIHN0cnBicmsoY29uc3QgY2hhciogX19zMSwgY29uc3QgY2hhciogX19zMikge3JldHVybiBfX2xpYmNwcF9zdHJwYnJrKF9fczEsIF9fczIpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfUFJFRkVSUkVEX09WRVJMT0FECisgICAgICBjaGFyKiBzdHJwYnJrKCAgICAgIGNoYXIqIF9fczEsIGNvbnN0IGNoYXIqIF9fczIpIHtyZXR1cm4gX19saWJjcHBfc3RycGJyayhfX3MxLCBfX3MyKTt9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjaGFyKiBfX2xpYmNwcF9zdHJyY2hyKGNvbnN0IGNoYXIqIF9fcywgaW50IF9fYykge3JldHVybiAoY2hhciopc3RycmNocihfX3MsIF9fYyk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9QUkVGRVJSRURfT1ZFUkxPQUQKK2NvbnN0IGNoYXIqIHN0cnJjaHIoY29uc3QgY2hhciogX19zLCBpbnQgX19jKSB7cmV0dXJuIF9fbGliY3BwX3N0cnJjaHIoX19zLCBfX2MpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfUFJFRkVSUkVEX09WRVJMT0FECisgICAgICBjaGFyKiBzdHJyY2hyKCAgICAgIGNoYXIqIF9fcywgaW50IF9fYykge3JldHVybiBfX2xpYmNwcF9zdHJyY2hyKF9fcywgX19jKTt9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkKiBfX2xpYmNwcF9tZW1jaHIoY29uc3Qgdm9pZCogX19zLCBpbnQgX19jLCBzaXplX3QgX19uKSB7cmV0dXJuICh2b2lkKiltZW1jaHIoX19zLCBfX2MsIF9fbik7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9QUkVGRVJSRURfT1ZFUkxPQUQKK2NvbnN0IHZvaWQqIG1lbWNocihjb25zdCB2b2lkKiBfX3MsIGludCBfX2MsIHNpemVfdCBfX24pIHtyZXR1cm4gX19saWJjcHBfbWVtY2hyKF9fcywgX19jLCBfX24pO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfUFJFRkVSUkVEX09WRVJMT0FECisgICAgICB2b2lkKiBtZW1jaHIoICAgICAgdm9pZCogX19zLCBpbnQgX19jLCBzaXplX3QgX19uKSB7cmV0dXJuIF9fbGliY3BwX21lbWNocihfX3MsIF9fYywgX19uKTt9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjaGFyKiBfX2xpYmNwcF9zdHJzdHIoY29uc3QgY2hhciogX19zMSwgY29uc3QgY2hhciogX19zMikge3JldHVybiAoY2hhciopc3Ryc3RyKF9fczEsIF9fczIpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfUFJFRkVSUkVEX09WRVJMT0FECitjb25zdCBjaGFyKiBzdHJzdHIoY29uc3QgY2hhciogX19zMSwgY29uc3QgY2hhciogX19zMikge3JldHVybiBfX2xpYmNwcF9zdHJzdHIoX19zMSwgX19zMik7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9QUkVGRVJSRURfT1ZFUkxPQUQKKyAgICAgIGNoYXIqIHN0cnN0ciggICAgICBjaGFyKiBfX3MxLCBjb25zdCBjaGFyKiBfX3MyKSB7cmV0dXJuIF9fbGliY3BwX3N0cnN0cihfX3MxLCBfX3MyKTt9Cit9CisjZW5kaWYKKworI2VuZGlmICAvLyBfTElCQ1BQX1NUUklOR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3RyaW5nX3ZpZXcgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3RyaW5nX3ZpZXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM3N2FlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdHJpbmdfdmlldwpAQCAtMCwwICsxLDgyNyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0cmluZ192aWV3IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9TVFJJTkdfVklFVworI2RlZmluZSBfTElCQ1BQX1NUUklOR19WSUVXCisKKy8qCitzdHJpbmdfdmlldyBzeW5vcHNpcworCituYW1lc3BhY2Ugc3RkIHsKKworICAgIC8vIDcuMiwgQ2xhc3MgdGVtcGxhdGUgYmFzaWNfc3RyaW5nX3ZpZXcKKyAgICB0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzID0gY2hhcl90cmFpdHM8Y2hhclQ+PgorICAgICAgICBjbGFzcyBiYXNpY19zdHJpbmdfdmlldzsKKworICAgIC8vIDcuOSwgYmFzaWNfc3RyaW5nX3ZpZXcgbm9uLW1lbWJlciBjb21wYXJpc29uIGZ1bmN0aW9ucworICAgIHRlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4geSkgbm9leGNlcHQ7CisgICAgdGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB5KSBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPCAoYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4geCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHkpIG5vZXhjZXB0OworICAgIHRlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+IChiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4geSkgbm9leGNlcHQ7CisgICAgdGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjw9KGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB5KSBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPj0oYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4geCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHkpIG5vZXhjZXB0OworICAgIC8vIHNlZSBiZWxvdywgc3VmZmljaWVudCBhZGRpdGlvbmFsIG92ZXJsb2FkcyBvZiBjb21wYXJpc29uIGZ1bmN0aW9ucworCisgICAgLy8gNy4xMCwgSW5zZXJ0ZXJzIGFuZCBleHRyYWN0b3JzCisgICAgdGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICAgIGJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYgb3MsCisgICAgICAgICAgICAgICAgICAgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4gc3RyKTsKKworICAgIC8vIGJhc2ljX3N0cmluZ192aWV3IHR5cGVkZWYgbmFtZXMKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmluZ192aWV3PGNoYXI+IHN0cmluZ192aWV3OworICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhcjE2X3Q+IHUxNnN0cmluZ192aWV3OworICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhcjMyX3Q+IHUzMnN0cmluZ192aWV3OworICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nX3ZpZXc8d2NoYXJfdD4gd3N0cmluZ192aWV3OworCisgICAgdGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cyA9IGNoYXJfdHJhaXRzPGNoYXJUPj4KKyAgICBjbGFzcyBiYXNpY19zdHJpbmdfdmlldyB7CisgICAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlcworICAgICAgdHlwZWRlZiB0cmFpdHMgdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIGNoYXJUIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIGNoYXJUKiBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBjaGFyVCogY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY2hhclQmIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgY2hhclQmIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90eXBlIG5wb3MgPSBzaXplX3R5cGUoLTEpOworCisgICAgICAvLyA3LjMsIGJhc2ljX3N0cmluZ192aWV3IGNvbnN0cnVjdG9ycyBhbmQgYXNzaWdubWVudCBvcGVyYXRvcnMKKyAgICAgIGNvbnN0ZXhwciBiYXNpY19zdHJpbmdfdmlldygpIG5vZXhjZXB0OworICAgICAgY29uc3RleHByIGJhc2ljX3N0cmluZ192aWV3KGNvbnN0IGJhc2ljX3N0cmluZ192aWV3Jikgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgYmFzaWNfc3RyaW5nX3ZpZXcmIG9wZXJhdG9yPShjb25zdCBiYXNpY19zdHJpbmdfdmlldyYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIEFsbG9jYXRvcj4KKyAgICAgIGNvbnN0ZXhwciBiYXNpY19zdHJpbmdfdmlldyhjb25zdCBjaGFyVCogc3RyKTsKKyAgICAgIGNvbnN0ZXhwciBiYXNpY19zdHJpbmdfdmlldyhjb25zdCBjaGFyVCogc3RyLCBzaXplX3R5cGUgbGVuKTsKKworICAgICAgLy8gNy40LCBiYXNpY19zdHJpbmdfdmlldyBpdGVyYXRvciBzdXBwb3J0CisgICAgICBjb25zdGV4cHIgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCBub2V4Y2VwdDsKKyAgICAgIGNvbnN0ZXhwciBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCBub2V4Y2VwdDsKKyAgICAgIGNvbnN0ZXhwciBjb25zdF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdDsKKyAgICAgIGNvbnN0ZXhwciBjb25zdF9pdGVyYXRvciBjZW5kKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IG5vZXhjZXB0OworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdDsKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY3JlbmQoKSBjb25zdCBub2V4Y2VwdDsKKworICAgICAgLy8gNy41LCBiYXNpY19zdHJpbmdfdmlldyBjYXBhY2l0eQorICAgICAgY29uc3RleHByIHNpemVfdHlwZSBzaXplKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgICBjb25zdGV4cHIgc2l6ZV90eXBlIGxlbmd0aCgpIGNvbnN0IG5vZXhjZXB0OworICAgICAgY29uc3RleHByIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IG5vZXhjZXB0OworICAgICAgY29uc3RleHByIGJvb2wgZW1wdHkoKSBjb25zdCBub2V4Y2VwdDsKKworICAgICAgLy8gNy42LCBiYXNpY19zdHJpbmdfdmlldyBlbGVtZW50IGFjY2VzcworICAgICAgY29uc3RleHByIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBwb3MpIGNvbnN0OworICAgICAgY29uc3RleHByIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgcG9zKSBjb25zdDsKKyAgICAgIGNvbnN0ZXhwciBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdDsKKyAgICAgIGNvbnN0ZXhwciBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0OworICAgICAgY29uc3RleHByIGNvbnN0X3BvaW50ZXIgZGF0YSgpIGNvbnN0IG5vZXhjZXB0OworCisgICAgICAvLyA3LjcsIGJhc2ljX3N0cmluZ192aWV3IG1vZGlmaWVycworICAgICAgY29uc3RleHByIHZvaWQgcmVtb3ZlX3ByZWZpeChzaXplX3R5cGUgbik7CisgICAgICBjb25zdGV4cHIgdm9pZCByZW1vdmVfc3VmZml4KHNpemVfdHlwZSBuKTsKKyAgICAgIGNvbnN0ZXhwciB2b2lkIHN3YXAoYmFzaWNfc3RyaW5nX3ZpZXcmIHMpIG5vZXhjZXB0OworCisgICAgICBzaXplX3R5cGUgY29weShjaGFyVCogcywgc2l6ZV90eXBlIG4sIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdDsKKworICAgICAgY29uc3RleHByIGJhc2ljX3N0cmluZ192aWV3IHN1YnN0cihzaXplX3R5cGUgcG9zID0gMCwgc2l6ZV90eXBlIG4gPSBucG9zKSBjb25zdDsKKyAgICAgIGNvbnN0ZXhwciBpbnQgY29tcGFyZShiYXNpY19zdHJpbmdfdmlldyBzKSBjb25zdCBub2V4Y2VwdDsKKyAgICAgIGNvbnN0ZXhwciBpbnQgY29tcGFyZShzaXplX3R5cGUgcG9zMSwgc2l6ZV90eXBlIG4xLCBiYXNpY19zdHJpbmdfdmlldyBzKSBjb25zdDsKKyAgICAgIGNvbnN0ZXhwciBpbnQgY29tcGFyZShzaXplX3R5cGUgcG9zMSwgc2l6ZV90eXBlIG4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmluZ192aWV3IHMsIHNpemVfdHlwZSBwb3MyLCBzaXplX3R5cGUgbjIpIGNvbnN0OworICAgICAgY29uc3RleHByIGludCBjb21wYXJlKGNvbnN0IGNoYXJUKiBzKSBjb25zdDsKKyAgICAgIGNvbnN0ZXhwciBpbnQgY29tcGFyZShzaXplX3R5cGUgcG9zMSwgc2l6ZV90eXBlIG4xLCBjb25zdCBjaGFyVCogcykgY29uc3Q7CisgICAgICBjb25zdGV4cHIgaW50IGNvbXBhcmUoc2l6ZV90eXBlIHBvczEsIHNpemVfdHlwZSBuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIG4yKSBjb25zdDsKKyAgICAgIGNvbnN0ZXhwciBzaXplX3R5cGUgZmluZChiYXNpY19zdHJpbmdfdmlldyBzLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Qgbm9leGNlcHQ7CisgICAgICBjb25zdGV4cHIgc2l6ZV90eXBlIGZpbmQoY2hhclQgYywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0IG5vZXhjZXB0OworICAgICAgY29uc3RleHByIHNpemVfdHlwZSBmaW5kKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbikgY29uc3Q7CisgICAgICBjb25zdGV4cHIgc2l6ZV90eXBlIGZpbmQoY29uc3QgY2hhclQqIHMsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdDsKKyAgICAgIGNvbnN0ZXhwciBzaXplX3R5cGUgcmZpbmQoYmFzaWNfc3RyaW5nX3ZpZXcgcywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0IG5vZXhjZXB0OworICAgICAgY29uc3RleHByIHNpemVfdHlwZSByZmluZChjaGFyVCBjLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Qgbm9leGNlcHQ7CisgICAgICBjb25zdGV4cHIgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbikgY29uc3Q7CisgICAgICBjb25zdGV4cHIgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Q7CisgICAgICBjb25zdGV4cHIgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoYmFzaWNfc3RyaW5nX3ZpZXcgcywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0IG5vZXhjZXB0OworICAgICAgY29uc3RleHByIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNoYXJUIGMsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdCBub2V4Y2VwdDsKKyAgICAgIGNvbnN0ZXhwciBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4pIGNvbnN0OworICAgICAgY29uc3RleHByIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7CisgICAgICBjb25zdGV4cHIgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihiYXNpY19zdHJpbmdfdmlldyBzLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Qgbm9leGNlcHQ7CisgICAgICBjb25zdGV4cHIgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjaGFyVCBjLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Qgbm9leGNlcHQ7CisgICAgICBjb25zdGV4cHIgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4pIGNvbnN0OworICAgICAgY29uc3RleHByIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoY29uc3QgY2hhclQqIHMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdDsKKyAgICAgIGNvbnN0ZXhwciBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoYmFzaWNfc3RyaW5nX3ZpZXcgcywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0IG5vZXhjZXB0OworICAgICAgY29uc3RleHByIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjaGFyVCBjLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Qgbm9leGNlcHQ7CisgICAgICBjb25zdGV4cHIgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbikgY29uc3Q7CisgICAgICBjb25zdGV4cHIgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7CisgICAgICBjb25zdGV4cHIgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoYmFzaWNfc3RyaW5nX3ZpZXcgcywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0IG5vZXhjZXB0OworICAgICAgY29uc3RleHByIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNoYXJUIGMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdCBub2V4Y2VwdDsKKyAgICAgIGNvbnN0ZXhwciBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZihjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4pIGNvbnN0OworICAgICAgY29uc3RleHByIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Q7CisKKyAgICAgIGNvbnN0ZXhwciBib29sIHN0YXJ0c193aXRoKGJhc2ljX3N0cmluZ192aWV3IHMpIGNvbnN0IG5vZXhjZXB0OyAvLyBDKysyYQorICAgICAgY29uc3RleHByIGJvb2wgc3RhcnRzX3dpdGgoY2hhclQgYykgY29uc3Qgbm9leGNlcHQ7ICAgICAgICAgICAgIC8vIEMrKzJhCisgICAgICBjb25zdGV4cHIgYm9vbCBzdGFydHNfd2l0aChjb25zdCBjaGFyVCogcykgY29uc3Q7ICAgICAgICAgICAgICAgLy8gQysrMmEKKyAgICAgIGNvbnN0ZXhwciBib29sIGVuZHNfd2l0aChiYXNpY19zdHJpbmdfdmlldyBzKSBjb25zdCBub2V4Y2VwdDsgICAvLyBDKysyYQorICAgICAgY29uc3RleHByIGJvb2wgZW5kc193aXRoKGNoYXJUIGMpIGNvbnN0IG5vZXhjZXB0OyAgICAgICAgICAgICAgIC8vIEMrKzJhCisgICAgICBjb25zdGV4cHIgYm9vbCBlbmRzX3dpdGgoY29uc3QgY2hhclQqIHMpIGNvbnN0OyAgICAgICAgICAgICAgICAgLy8gQysrMmEKKworICAgICBwcml2YXRlOgorICAgICAgY29uc3RfcG9pbnRlciBkYXRhXzsgIC8vIGV4cG9zaXRpb24gb25seQorICAgICAgc2l6ZV90eXBlICAgICBzaXplXzsgIC8vIGV4cG9zaXRpb24gb25seQorICAgIH07CisKKyAgLy8gNy4xMSwgSGFzaCBzdXBwb3J0CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaGFzaDsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGhhc2g8c3RyaW5nX3ZpZXc+OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaGFzaDx1MTZzdHJpbmdfdmlldz47CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBoYXNoPHUzMnN0cmluZ192aWV3PjsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGhhc2g8d3N0cmluZ192aWV3PjsKKworICBjb25zdGV4cHIgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhcj4gICAgIG9wZXJhdG9yICIiIHN2KCBjb25zdCBjaGFyICpzdHIsICAgICBzaXplX3QgbGVuICkgbm9leGNlcHQ7CisgIGNvbnN0ZXhwciBiYXNpY19zdHJpbmdfdmlldzx3Y2hhcl90PiAgb3BlcmF0b3IgIiIgc3YoIGNvbnN0IHdjaGFyX3QgKnN0ciwgIHNpemVfdCBsZW4gKSBub2V4Y2VwdDsKKyAgY29uc3RleHByIGJhc2ljX3N0cmluZ192aWV3PGNoYXIxNl90PiBvcGVyYXRvciAiIiBzdiggY29uc3QgY2hhcjE2X3QgKnN0ciwgc2l6ZV90IGxlbiApIG5vZXhjZXB0OworICBjb25zdGV4cHIgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhcjMyX3Q+IG9wZXJhdG9yICIiIHN2KCBjb25zdCBjaGFyMzJfdCAqc3RyLCBzaXplX3QgbGVuICkgbm9leGNlcHQ7CisKK30gIC8vIG5hbWVzcGFjZSBzdGQKKworCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8X19zdHJpbmc+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8X19kZWJ1Zz4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfUFVTSF9NQUNST1MKKyNpbmNsdWRlIDxfX3VuZGVmX21hY3Jvcz4KKworCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBiYXNpY19zdHJpbmdfdmlldyB7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0NoYXJUKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiBjb25zdCBfQ2hhclQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIF9DaGFyVCYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBjb25zdCBfQ2hhclQmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3RfcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOyAvLyBTZWUgW3N0cmluZy52aWV3Lml0ZXJhdG9yc10KKyAgICB0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9WU1REOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICAgIHR5cGVkZWYgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICBzdGF0aWMgX0xJQkNQUF9DT05TVEVYUFIgY29uc3Qgc2l6ZV90eXBlIG5wb3MgPSAtMTsgLy8gc2l6ZV90eXBlKC0xKTsKKworICAgIHN0YXRpY19hc3NlcnQoKCFpc19hcnJheTx2YWx1ZV90eXBlPjo6dmFsdWUpLCAiQ2hhcmFjdGVyIHR5cGUgb2YgYmFzaWNfc3RyaW5nX3ZpZXcgbXVzdCBub3QgYmUgYW4gYXJyYXkiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCggaXNfc3RhbmRhcmRfbGF5b3V0PHZhbHVlX3R5cGU+Ojp2YWx1ZSksICJDaGFyYWN0ZXIgdHlwZSBvZiBiYXNpY19zdHJpbmdfdmlldyBtdXN0IGJlIHN0YW5kYXJkLWxheW91dCIpOworICAgIHN0YXRpY19hc3NlcnQoKCBpc190cml2aWFsPHZhbHVlX3R5cGU+Ojp2YWx1ZSksICJDaGFyYWN0ZXIgdHlwZSBvZiBiYXNpY19zdHJpbmdfdmlldyBtdXN0IGJlIHRyaXZpYWwiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KChpc19zYW1lPF9DaGFyVCwgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmNoYXJfdHlwZT46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICJ0cmFpdHNfdHlwZTo6Y2hhcl90eXBlIG11c3QgYmUgdGhlIHNhbWUgdHlwZSBhcyBDaGFyVCIpOworCisgICAgLy8gW3N0cmluZy52aWV3LmNvbnNdLCBjb25zdHJ1Y3QvY29weQorICAgIF9MSUJDUFBfQ09OU1RFWFBSIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmdfdmlldygpIF9OT0VYQ0VQVCA6IF9fZGF0YSAobnVsbHB0ciksIF9fc2l6ZSgwKSB7fQorCisgICAgX0xJQkNQUF9DT05TVEVYUFIgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX3N0cmluZ192aWV3KGNvbnN0IGJhc2ljX3N0cmluZ192aWV3JikgX05PRVhDRVBUID0gZGVmYXVsdDsKKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmdfdmlldyYgb3BlcmF0b3I9KGNvbnN0IGJhc2ljX3N0cmluZ192aWV3JikgX05PRVhDRVBUID0gZGVmYXVsdDsKKworICAgIF9MSUJDUFBfQ09OU1RFWFBSIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBiYXNpY19zdHJpbmdfdmlldyhjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbGVuKSBfTk9FWENFUFQKKyAgICAgICAgOiBfX2RhdGEoX19zKSwgX19zaXplKF9fbGVuKQorICAgIHsKKy8vICNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorLy8gICAgICAgICBfTElCQ1BQX0FTU0VSVChfX2xlbiA9PSAwIHx8IF9fcyAhPSBudWxscHRyLCAic3RyaW5nX3ZpZXc6OnN0cmluZ192aWV3KF9DaGFyVCAqLCBzaXplX3QpOiByZWNlaXZlZCBudWxscHRyIik7CisvLyAjZW5kaWYKKyAgICB9CisKKyAgICBfTElCQ1BQX0NPTlNURVhQUiBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfc3RyaW5nX3ZpZXcoY29uc3QgX0NoYXJUKiBfX3MpCisgICAgICAgIDogX19kYXRhKF9fcyksIF9fc2l6ZShfVHJhaXRzOjpsZW5ndGgoX19zKSkge30KKworICAgIC8vIFtzdHJpbmcudmlldy5pdGVyYXRvcnNdLCBpdGVyYXRvcnMKKyAgICBfTElCQ1BQX0NPTlNURVhQUiBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSAgY29uc3QgX05PRVhDRVBUIHsgcmV0dXJuIGNiZWdpbigpOyB9CisKKyAgICBfTElCQ1BQX0NPTlNURVhQUiBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICAgY29uc3QgX05PRVhDRVBUIHsgcmV0dXJuIGNlbmQoKTsgfQorCisgICAgX0xJQkNQUF9DT05TVEVYUFIgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVCB7IHJldHVybiBfX2RhdGE7IH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBjZW5kKCkgICBjb25zdCBfTk9FWENFUFQgeyByZXR1cm4gX19kYXRhICsgX19zaXplOyB9CisKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSAgIGNvbnN0IF9OT0VYQ0VQVCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGNlbmQoKSk7IH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSAgICAgY29uc3QgX05PRVhDRVBUIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoY2JlZ2luKCkpOyB9CisKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxNCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmJlZ2luKCkgIGNvbnN0IF9OT0VYQ0VQVCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGNlbmQoKSk7IH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE0IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyZW5kKCkgICAgY29uc3QgX05PRVhDRVBUIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoY2JlZ2luKCkpOyB9CisKKyAgICAvLyBbc3RyaW5nLnZpZXcuY2FwYWNpdHldLCBjYXBhY2l0eQorICAgIF9MSUJDUFBfQ09OU1RFWFBSIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgc2l6ZSgpICAgICBjb25zdCBfTk9FWENFUFQgeyByZXR1cm4gX19zaXplOyB9CisKKyAgICBfTElCQ1BQX0NPTlNURVhQUiBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGxlbmd0aCgpICAgY29uc3QgX05PRVhDRVBUIHsgcmV0dXJuIF9fc2l6ZTsgfQorCisgICAgX0xJQkNQUF9DT05TVEVYUFIgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IF9OT0VYQ0VQVCB7IHJldHVybiBudW1lcmljX2xpbWl0czxzaXplX3R5cGU+OjptYXgoKTsgfQorCisgICAgX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgorICAgIGJvb2wgZW1wdHkoKSAgICAgICAgIGNvbnN0IF9OT0VYQ0VQVCB7IHJldHVybiBfX3NpemUgPT0gMDsgfQorCisgICAgLy8gW3N0cmluZy52aWV3LmFjY2Vzc10sIGVsZW1lbnQgYWNjZXNzCisgICAgX0xJQkNQUF9DT05TVEVYUFIgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX3BvcykgY29uc3QgX05PRVhDRVBUIHsgcmV0dXJuIF9fZGF0YVtfX3Bvc107IH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9yZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fcG9zKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIF9fcG9zID49IHNpemUoKQorICAgICAgICAgICAgPyAoX190aHJvd19vdXRfb2ZfcmFuZ2UoInN0cmluZ192aWV3OjphdCIpLCBfX2RhdGFbMF0pCisgICAgICAgICAgICA6IF9fZGF0YVtfX3Bvc107CisgICAgfQorCisgICAgX0xJQkNQUF9DT05TVEVYUFIgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gX0xJQkNQUF9BU1NFUlQoIWVtcHR5KCksICJzdHJpbmdfdmlldzo6ZnJvbnQoKTogc3RyaW5nIGlzIGVtcHR5IiksIF9fZGF0YVswXTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0NPTlNURVhQUiBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIF9MSUJDUFBfQVNTRVJUKCFlbXB0eSgpLCAic3RyaW5nX3ZpZXc6OmJhY2soKTogc3RyaW5nIGlzIGVtcHR5IiksIF9fZGF0YVtfX3NpemUtMV07CisgICAgfQorCisgICAgX0xJQkNQUF9DT05TVEVYUFIgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3BvaW50ZXIgZGF0YSgpIGNvbnN0IF9OT0VYQ0VQVCB7IHJldHVybiBfX2RhdGE7IH0KKworICAgIC8vIFtzdHJpbmcudmlldy5tb2RpZmllcnNdLCBtb2RpZmllcnM6CisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgcmVtb3ZlX3ByZWZpeChzaXplX3R5cGUgX19uKSBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fbiA8PSBzaXplKCksICJyZW1vdmVfcHJlZml4KCkgY2FuJ3QgcmVtb3ZlIG1vcmUgdGhhbiBzaXplKCkiKTsKKyAgICAgICAgX19kYXRhICs9IF9fbjsKKyAgICAgICAgX19zaXplIC09IF9fbjsKKyAgICB9CisKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCByZW1vdmVfc3VmZml4KHNpemVfdHlwZSBfX24pIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19uIDw9IHNpemUoKSwgInJlbW92ZV9zdWZmaXgoKSBjYW4ndCByZW1vdmUgbW9yZSB0aGFuIHNpemUoKSIpOworICAgICAgICBfX3NpemUgLT0gX19uOworICAgIH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAoYmFzaWNfc3RyaW5nX3ZpZXcmIF9fb3RoZXIpIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgY29uc3QgdmFsdWVfdHlwZSAqX19wID0gX19kYXRhOworICAgICAgICBfX2RhdGEgPSBfX290aGVyLl9fZGF0YTsKKyAgICAgICAgX19vdGhlci5fX2RhdGEgPSBfX3A7CisKKyAgICAgICAgc2l6ZV90eXBlIF9fc3ogPSBfX3NpemU7CisgICAgICAgIF9fc2l6ZSA9IF9fb3RoZXIuX19zaXplOworICAgICAgICBfX290aGVyLl9fc2l6ZSA9IF9fc3o7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBjb3B5KF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKF9fcG9zID4gc2l6ZSgpKQorICAgICAgICAgICAgX190aHJvd19vdXRfb2ZfcmFuZ2UoInN0cmluZ192aWV3Ojpjb3B5Iik7CisgICAgICAgIHNpemVfdHlwZSBfX3JsZW4gPSBfVlNURDo6bWluKF9fbiwgc2l6ZSgpIC0gX19wb3MpOworICAgICAgICBfVHJhaXRzOjpjb3B5KF9fcywgZGF0YSgpICsgX19wb3MsIF9fcmxlbik7CisgICAgICAgIHJldHVybiBfX3JsZW47CisgICAgfQorCisgICAgX0xJQkNQUF9DT05TVEVYUFIgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJhc2ljX3N0cmluZ192aWV3IHN1YnN0cihzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gbnBvcykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBfX3BvcyA+IHNpemUoKQorICAgICAgICAgICAgPyAoX190aHJvd19vdXRfb2ZfcmFuZ2UoInN0cmluZ192aWV3OjpzdWJzdHIiKSwgYmFzaWNfc3RyaW5nX3ZpZXcoKSkKKyAgICAgICAgICAgIDogYmFzaWNfc3RyaW5nX3ZpZXcoZGF0YSgpICsgX19wb3MsIF9WU1REOjptaW4oX19uLCBzaXplKCkgLSBfX3BvcykpOworICAgIH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIGludCBjb21wYXJlKGJhc2ljX3N0cmluZ192aWV3IF9fc3YpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fcmxlbiA9IF9WU1REOjptaW4oIHNpemUoKSwgX19zdi5zaXplKCkpOworICAgICAgICBpbnQgX19yZXR2YWwgPSBfVHJhaXRzOjpjb21wYXJlKGRhdGEoKSwgX19zdi5kYXRhKCksIF9fcmxlbik7CisgICAgICAgIGlmICggX19yZXR2YWwgPT0gMCApIC8vIGZpcnN0IF9fcmxlbiBjaGFycyBtYXRjaGVkCisgICAgICAgICAgICBfX3JldHZhbCA9IHNpemUoKSA9PSBfX3N2LnNpemUoKSA/IDAgOiAoIHNpemUoKSA8IF9fc3Yuc2l6ZSgpID8gLTEgOiAxICk7CisgICAgICAgIHJldHVybiBfX3JldHZhbDsKKyAgICB9CisKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGJhc2ljX3N0cmluZ192aWV3IF9fc3YpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gc3Vic3RyKF9fcG9zMSwgX19uMSkuY29tcGFyZShfX3N2KTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaW50IGNvbXBhcmUoICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgCisgICAgICAgICAgICAgICAgYmFzaWNfc3RyaW5nX3ZpZXcgX19zdiwgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gc3Vic3RyKF9fcG9zMSwgX19uMSkuY29tcGFyZShfX3N2LnN1YnN0cihfX3BvczIsIF9fbjIpKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaW50IGNvbXBhcmUoY29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmUoYmFzaWNfc3RyaW5nX3ZpZXcoX19zKSk7CisgICAgfQorCisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGludCBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBzdWJzdHIoX19wb3MxLCBfX24xKS5jb21wYXJlKGJhc2ljX3N0cmluZ192aWV3KF9fcykpOworICAgIH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpbnQgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24yKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHN1YnN0cihfX3BvczEsIF9fbjEpLmNvbXBhcmUoYmFzaWNfc3RyaW5nX3ZpZXcoX19zLCBfX24yKSk7CisgICAgfQorCisgICAgLy8gZmluZAorICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZmluZChiYXNpY19zdHJpbmdfdmlldyBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19zLnNpemUoKSA9PSAwIHx8IF9fcy5kYXRhKCkgIT0gbnVsbHB0ciwgInN0cmluZ192aWV3OjpmaW5kKCk6IHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICAgICAgcmV0dXJuIF9fc3RyX2ZpbmQ8dmFsdWVfdHlwZSwgc2l6ZV90eXBlLCB0cmFpdHNfdHlwZSwgbnBvcz4KKyAgICAgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19zLmRhdGEoKSwgX19wb3MsIF9fcy5zaXplKCkpOworICAgIH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIHJldHVybiBfX3N0cl9maW5kPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgICAgICAoZGF0YSgpLCBzaXplKCksIF9fYywgX19wb3MpOworICAgIH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19uID09IDAgfHwgX19zICE9IG51bGxwdHIsICJzdHJpbmdfdmlldzo6ZmluZCgpOiByZWNlaXZlZCBudWxscHRyIik7CisgICAgICAgIHJldHVybiBfX3N0cl9maW5kPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgICAgICAoZGF0YSgpLCBzaXplKCksIF9fcywgX19wb3MsIF9fbik7CisgICAgfQorCisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19zICE9IG51bGxwdHIsICJzdHJpbmdfdmlldzo6ZmluZCgpOiByZWNlaXZlZCBudWxscHRyIik7CisgICAgICAgIHJldHVybiBfX3N0cl9maW5kPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgICAgICAoZGF0YSgpLCBzaXplKCksIF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgfQorCisgICAgLy8gcmZpbmQKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIHJmaW5kKGJhc2ljX3N0cmluZ192aWV3IF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QgX05PRVhDRVBUCisgICAgeworICAgICAgICBfTElCQ1BQX0FTU0VSVChfX3Muc2l6ZSgpID09IDAgfHwgX19zLmRhdGEoKSAhPSBudWxscHRyLCAic3RyaW5nX3ZpZXc6OmZpbmQoKTogcmVjZWl2ZWQgbnVsbHB0ciIpOworICAgICAgICByZXR1cm4gX19zdHJfcmZpbmQ8dmFsdWVfdHlwZSwgc2l6ZV90eXBlLCB0cmFpdHNfdHlwZSwgbnBvcz4KKyAgICAgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19zLmRhdGEoKSwgX19wb3MsIF9fcy5zaXplKCkpOworICAgIH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgcmZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QgX05PRVhDRVBUCisgICAgeworICAgICAgICByZXR1cm4gX19zdHJfcmZpbmQ8dmFsdWVfdHlwZSwgc2l6ZV90eXBlLCB0cmFpdHNfdHlwZSwgbnBvcz4KKyAgICAgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19jLCBfX3Bvcyk7CisgICAgfQorCisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSByZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19uID09IDAgfHwgX19zICE9IG51bGxwdHIsICJzdHJpbmdfdmlldzo6cmZpbmQoKTogcmVjZWl2ZWQgbnVsbHB0ciIpOworICAgICAgICByZXR1cm4gX19zdHJfcmZpbmQ8dmFsdWVfdHlwZSwgc2l6ZV90eXBlLCB0cmFpdHNfdHlwZSwgbnBvcz4KKyAgICAgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19zLCBfX3BvcywgX19uKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3M9bnBvcykgY29uc3QKKyAgICB7CisgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fcyAhPSBudWxscHRyLCAic3RyaW5nX3ZpZXc6OnJmaW5kKCk6IHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICAgICAgcmV0dXJuIF9fc3RyX3JmaW5kPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgICAgICAoZGF0YSgpLCBzaXplKCksIF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgfQorCisgICAgLy8gZmluZF9maXJzdF9vZgorICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihiYXNpY19zdHJpbmdfdmlldyBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19zLnNpemUoKSA9PSAwIHx8IF9fcy5kYXRhKCkgIT0gbnVsbHB0ciwgInN0cmluZ192aWV3OjpmaW5kX2ZpcnN0X29mKCk6IHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICAgICAgcmV0dXJuIF9fc3RyX2ZpbmRfZmlyc3Rfb2Y8dmFsdWVfdHlwZSwgc2l6ZV90eXBlLCB0cmFpdHNfdHlwZSwgbnBvcz4KKyAgICAgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19zLmRhdGEoKSwgX19wb3MsIF9fcy5zaXplKCkpOworICAgIH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCBfTk9FWENFUFQKKyAgICB7IHJldHVybiBmaW5kKF9fYywgX19wb3MpOyB9CisKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fbiA9PSAwIHx8IF9fcyAhPSBudWxscHRyLCAic3RyaW5nX3ZpZXc6OmZpbmRfZmlyc3Rfb2YoKTogcmVjZWl2ZWQgbnVsbHB0ciIpOworICAgICAgICByZXR1cm4gX19zdHJfZmluZF9maXJzdF9vZjx2YWx1ZV90eXBlLCBzaXplX3R5cGUsIHRyYWl0c190eXBlLCBucG9zPgorICAgICAgICAgICAgKGRhdGEoKSwgc2l6ZSgpLCBfX3MsIF9fcG9zLCBfX24pOworICAgIH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zPTApIGNvbnN0CisgICAgeworICAgICAgICBfTElCQ1BQX0FTU0VSVChfX3MgIT0gbnVsbHB0ciwgInN0cmluZ192aWV3OjpmaW5kX2ZpcnN0X29mKCk6IHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICAgICAgcmV0dXJuIF9fc3RyX2ZpbmRfZmlyc3Rfb2Y8dmFsdWVfdHlwZSwgc2l6ZV90eXBlLCB0cmFpdHNfdHlwZSwgbnBvcz4KKyAgICAgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICB9CisKKyAgICAvLyBmaW5kX2xhc3Rfb2YKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihiYXNpY19zdHJpbmdfdmlldyBfX3MsIHNpemVfdHlwZSBfX3Bvcz1ucG9zKSBjb25zdCBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fcy5zaXplKCkgPT0gMCB8fCBfX3MuZGF0YSgpICE9IG51bGxwdHIsICJzdHJpbmdfdmlldzo6ZmluZF9sYXN0X29mKCk6IHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICAgICAgcmV0dXJuIF9fc3RyX2ZpbmRfbGFzdF9vZjx2YWx1ZV90eXBlLCBzaXplX3R5cGUsIHRyYWl0c190eXBlLCBucG9zPgorICAgICAgICAgICAgKGRhdGEoKSwgc2l6ZSgpLCBfX3MuZGF0YSgpLCBfX3BvcywgX19zLnNpemUoKSk7CisgICAgfQorCisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QgX05PRVhDRVBUCisgICAgeyByZXR1cm4gcmZpbmQoX19jLCBfX3Bvcyk7IH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgICBfTElCQ1BQX0FTU0VSVChfX24gPT0gMCB8fCBfX3MgIT0gbnVsbHB0ciwgInN0cmluZ192aWV3OjpmaW5kX2xhc3Rfb2YoKTogcmVjZWl2ZWQgbnVsbHB0ciIpOworICAgICAgICByZXR1cm4gX19zdHJfZmluZF9sYXN0X29mPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgICAgICAoZGF0YSgpLCBzaXplKCksIF9fcywgX19wb3MsIF9fbik7CisgICAgfQorCisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcz1ucG9zKSBjb25zdAorICAgIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19zICE9IG51bGxwdHIsICJzdHJpbmdfdmlldzo6ZmluZF9sYXN0X29mKCk6IHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICAgICAgcmV0dXJuIF9fc3RyX2ZpbmRfbGFzdF9vZjx2YWx1ZV90eXBlLCBzaXplX3R5cGUsIHRyYWl0c190eXBlLCBucG9zPgorICAgICAgICAgICAgKGRhdGEoKSwgc2l6ZSgpLCBfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgIH0KKworICAgIC8vIGZpbmRfZmlyc3Rfbm90X29mCisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihiYXNpY19zdHJpbmdfdmlldyBfX3MsIHNpemVfdHlwZSBfX3Bvcz0wKSBjb25zdCBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fcy5zaXplKCkgPT0gMCB8fCBfX3MuZGF0YSgpICE9IG51bGxwdHIsICJzdHJpbmdfdmlldzo6ZmluZF9maXJzdF9ub3Rfb2YoKTogcmVjZWl2ZWQgbnVsbHB0ciIpOworICAgICAgICByZXR1cm4gX19zdHJfZmluZF9maXJzdF9ub3Rfb2Y8dmFsdWVfdHlwZSwgc2l6ZV90eXBlLCB0cmFpdHNfdHlwZSwgbnBvcz4KKyAgICAgICAgICAgIChkYXRhKCksIHNpemUoKSwgX19zLmRhdGEoKSwgX19wb3MsIF9fcy5zaXplKCkpOworICAgIH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zPTApIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIF9fc3RyX2ZpbmRfZmlyc3Rfbm90X29mPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgICAgICAoZGF0YSgpLCBzaXplKCksIF9fYywgX19wb3MpOworICAgIH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fbiA9PSAwIHx8IF9fcyAhPSBudWxscHRyLCAic3RyaW5nX3ZpZXc6OmZpbmRfZmlyc3Rfbm90X29mKCk6IHJlY2VpdmVkIG51bGxwdHIiKTsKKyAgICAgICAgcmV0dXJuIF9fc3RyX2ZpbmRfZmlyc3Rfbm90X29mPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgICAgICAoZGF0YSgpLCBzaXplKCksIF9fcywgX19wb3MsIF9fbik7CisgICAgfQorCisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zPTApIGNvbnN0CisgICAgeworICAgICAgICBfTElCQ1BQX0FTU0VSVChfX3MgIT0gbnVsbHB0ciwgInN0cmluZ192aWV3OjpmaW5kX2ZpcnN0X25vdF9vZigpOiByZWNlaXZlZCBudWxscHRyIik7CisgICAgICAgIHJldHVybiBfX3N0cl9maW5kX2ZpcnN0X25vdF9vZjx2YWx1ZV90eXBlLCBzaXplX3R5cGUsIHRyYWl0c190eXBlLCBucG9zPgorICAgICAgICAgICAgKGRhdGEoKSwgc2l6ZSgpLCBfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgIH0KKworICAgIC8vIGZpbmRfbGFzdF9ub3Rfb2YKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoYmFzaWNfc3RyaW5nX3ZpZXcgX19zLCBzaXplX3R5cGUgX19wb3M9bnBvcykgY29uc3QgX05PRVhDRVBUCisgICAgeworICAgICAgICBfTElCQ1BQX0FTU0VSVChfX3Muc2l6ZSgpID09IDAgfHwgX19zLmRhdGEoKSAhPSBudWxscHRyLCAic3RyaW5nX3ZpZXc6OmZpbmRfbGFzdF9ub3Rfb2YoKTogcmVjZWl2ZWQgbnVsbHB0ciIpOworICAgICAgICByZXR1cm4gX19zdHJfZmluZF9sYXN0X25vdF9vZjx2YWx1ZV90eXBlLCBzaXplX3R5cGUsIHRyYWl0c190eXBlLCBucG9zPgorICAgICAgICAgICAgKGRhdGEoKSwgc2l6ZSgpLCBfX3MuZGF0YSgpLCBfX3BvcywgX19zLnNpemUoKSk7CisgICAgfQorCisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3Bvcz1ucG9zKSBjb25zdCBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIHJldHVybiBfX3N0cl9maW5kX2xhc3Rfbm90X29mPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgICAgICAoZGF0YSgpLCBzaXplKCksIF9fYywgX19wb3MpOworICAgIH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19uID09IDAgfHwgX19zICE9IG51bGxwdHIsICJzdHJpbmdfdmlldzo6ZmluZF9sYXN0X25vdF9vZigpOiByZWNlaXZlZCBudWxscHRyIik7CisgICAgICAgIHJldHVybiBfX3N0cl9maW5kX2xhc3Rfbm90X29mPHZhbHVlX3R5cGUsIHNpemVfdHlwZSwgdHJhaXRzX3R5cGUsIG5wb3M+CisgICAgICAgICAgICAoZGF0YSgpLCBzaXplKCksIF9fcywgX19wb3MsIF9fbik7CisgICAgfQorCisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3M9bnBvcykgY29uc3QKKyAgICB7CisgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fcyAhPSBudWxscHRyLCAic3RyaW5nX3ZpZXc6OmZpbmRfbGFzdF9ub3Rfb2YoKTogcmVjZWl2ZWQgbnVsbHB0ciIpOworICAgICAgICByZXR1cm4gX19zdHJfZmluZF9sYXN0X25vdF9vZjx2YWx1ZV90eXBlLCBzaXplX3R5cGUsIHRyYWl0c190eXBlLCBucG9zPgorICAgICAgICAgICAgKGRhdGEoKSwgc2l6ZSgpLCBfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgIH0KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE3CisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgc3RhcnRzX3dpdGgoYmFzaWNfc3RyaW5nX3ZpZXcgX19zKSBjb25zdCBfTk9FWENFUFQKKyAgICB7IHJldHVybiBzaXplKCkgPj0gX19zLnNpemUoKSAmJiBjb21wYXJlKDAsIF9fcy5zaXplKCksIF9fcykgPT0gMDsgfQorCisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgc3RhcnRzX3dpdGgodmFsdWVfdHlwZSBfX2MpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuICFlbXB0eSgpICYmIF9UcmFpdHM6OmVxKGZyb250KCksIF9fYyk7IH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIHN0YXJ0c193aXRoKGNvbnN0IHZhbHVlX3R5cGUqIF9fcykgY29uc3QgX05PRVhDRVBUCisgICAgeyByZXR1cm4gc3RhcnRzX3dpdGgoYmFzaWNfc3RyaW5nX3ZpZXcoX19zKSk7IH0KKworICAgIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIGVuZHNfd2l0aChiYXNpY19zdHJpbmdfdmlldyBfX3MpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIHNpemUoKSA+PSBfX3Muc2l6ZSgpICYmIGNvbXBhcmUoc2l6ZSgpIC0gX19zLnNpemUoKSwgbnBvcywgX19zKSA9PSAwOyB9CisKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBlbmRzX3dpdGgodmFsdWVfdHlwZSBfX2MpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuICFlbXB0eSgpICYmIF9UcmFpdHM6OmVxKGJhY2soKSwgX19jKTsgfQorCisgICAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgZW5kc193aXRoKGNvbnN0IHZhbHVlX3R5cGUqIF9fcykgY29uc3QgX05PRVhDRVBUCisgICAgeyByZXR1cm4gZW5kc193aXRoKGJhc2ljX3N0cmluZ192aWV3KF9fcykpOyB9CisjZW5kaWYKKworcHJpdmF0ZToKKyAgICBjb25zdCAgIHZhbHVlX3R5cGUqIF9fZGF0YTsKKyAgICBzaXplX3R5cGUgICAgICAgICAgIF9fc2l6ZTsKK307CisKKworLy8gW3N0cmluZy52aWV3LmNvbXBhcmlzb25dCisvLyBvcGVyYXRvciA9PQordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBvcGVyYXRvcj09KGJhc2ljX3N0cmluZ192aWV3PF9DaGFyVCwgX1RyYWl0cz4gX19saHMsCisgICAgICAgICAgICAgICAgYmFzaWNfc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzPiBfX3JocykgX05PRVhDRVBUCit7CisgICAgaWYgKCBfX2xocy5zaXplKCkgIT0gX19yaHMuc2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID09IDA7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3I9PShiYXNpY19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHM+IF9fbGhzLAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIGNvbW1vbl90eXBlPGJhc2ljX3N0cmluZ192aWV3PF9DaGFyVCwgX1RyYWl0cz4gPjo6dHlwZSBfX3JocykgX05PRVhDRVBUCit7CisgICAgaWYgKCBfX2xocy5zaXplKCkgIT0gX19yaHMuc2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID09IDA7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3I9PSh0eXBlbmFtZSBjb21tb25fdHlwZTxiYXNpY19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHM+ID46OnR5cGUgX19saHMsIAorICAgICAgICAgICAgICAgIGJhc2ljX3N0cmluZ192aWV3PF9DaGFyVCwgX1RyYWl0cz4gX19yaHMpIF9OT0VYQ0VQVAoreworICAgIGlmICggX19saHMuc2l6ZSgpICE9IF9fcmhzLnNpemUoKSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA9PSAwOworfQorCisKKy8vIG9wZXJhdG9yICE9Cit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIG9wZXJhdG9yIT0oYmFzaWNfc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzPiBfX2xocywgYmFzaWNfc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzPiBfX3JocykgX05PRVhDRVBUCit7CisgICAgaWYgKCBfX2xocy5zaXplKCkgIT0gX19yaHMuc2l6ZSgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgIT0gMDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBvcGVyYXRvciE9KGJhc2ljX3N0cmluZ192aWV3PF9DaGFyVCwgX1RyYWl0cz4gX19saHMsCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgY29tbW9uX3R5cGU8YmFzaWNfc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzPiA+Ojp0eXBlIF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICBpZiAoIF9fbGhzLnNpemUoKSAhPSBfX3Jocy5zaXplKCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSAhPSAwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIG9wZXJhdG9yIT0odHlwZW5hbWUgY29tbW9uX3R5cGU8YmFzaWNfc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzPiA+Ojp0eXBlIF9fbGhzLCAKKyAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHM+IF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICBpZiAoIF9fbGhzLnNpemUoKSAhPSBfX3Jocy5zaXplKCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSAhPSAwOworfQorCisKKy8vIG9wZXJhdG9yIDwKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3I8KGJhc2ljX3N0cmluZ192aWV3PF9DaGFyVCwgX1RyYWl0cz4gX19saHMsIGJhc2ljX3N0cmluZ192aWV3PF9DaGFyVCwgX1RyYWl0cz4gX19yaHMpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8IDA7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3I8KGJhc2ljX3N0cmluZ192aWV3PF9DaGFyVCwgX1RyYWl0cz4gX19saHMsCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgY29tbW9uX3R5cGU8YmFzaWNfc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzPiA+Ojp0eXBlIF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPCAwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIG9wZXJhdG9yPCh0eXBlbmFtZSBjb21tb25fdHlwZTxiYXNpY19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHM+ID46OnR5cGUgX19saHMsIAorICAgICAgICAgICAgICAgIGJhc2ljX3N0cmluZ192aWV3PF9DaGFyVCwgX1RyYWl0cz4gX19yaHMpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8IDA7Cit9CisKKworLy8gb3BlcmF0b3IgPgordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBvcGVyYXRvcj4gKGJhc2ljX3N0cmluZ192aWV3PF9DaGFyVCwgX1RyYWl0cz4gX19saHMsIGJhc2ljX3N0cmluZ192aWV3PF9DaGFyVCwgX1RyYWl0cz4gX19yaHMpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+IDA7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3I+KGJhc2ljX3N0cmluZ192aWV3PF9DaGFyVCwgX1RyYWl0cz4gX19saHMsCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgY29tbW9uX3R5cGU8YmFzaWNfc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzPiA+Ojp0eXBlIF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPiAwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIG9wZXJhdG9yPih0eXBlbmFtZSBjb21tb25fdHlwZTxiYXNpY19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHM+ID46OnR5cGUgX19saHMsIAorICAgICAgICAgICAgICAgIGJhc2ljX3N0cmluZ192aWV3PF9DaGFyVCwgX1RyYWl0cz4gX19yaHMpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+IDA7Cit9CisKKworLy8gb3BlcmF0b3IgPD0KK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3I8PShiYXNpY19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHM+IF9fbGhzLCBiYXNpY19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHM+IF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPD0gMDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBvcGVyYXRvcjw9KGJhc2ljX3N0cmluZ192aWV3PF9DaGFyVCwgX1RyYWl0cz4gX19saHMsCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgY29tbW9uX3R5cGU8YmFzaWNfc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzPiA+Ojp0eXBlIF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPD0gMDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbCBvcGVyYXRvcjw9KHR5cGVuYW1lIGNvbW1vbl90eXBlPGJhc2ljX3N0cmluZ192aWV3PF9DaGFyVCwgX1RyYWl0cz4gPjo6dHlwZSBfX2xocywgCisgICAgICAgICAgICAgICAgYmFzaWNfc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzPiBfX3JocykgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpIDw9IDA7Cit9CisKKworLy8gb3BlcmF0b3IgPj0KK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK19MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3I+PShiYXNpY19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHM+IF9fbGhzLCBiYXNpY19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHM+IF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPj0gMDsKK30KKworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIG9wZXJhdG9yPj0oYmFzaWNfc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzPiBfX2xocywKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBjb21tb25fdHlwZTxiYXNpY19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHM+ID46OnR5cGUgX19yaHMpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+PSAwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIG9wZXJhdG9yPj0odHlwZW5hbWUgY29tbW9uX3R5cGU8YmFzaWNfc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzPiA+Ojp0eXBlIF9fbGhzLCAKKyAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHM+IF9fcmhzKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPj0gMDsKK30KKwordHlwZWRlZiBiYXNpY19zdHJpbmdfdmlldzxjaGFyPiAgICAgc3RyaW5nX3ZpZXc7Cit0eXBlZGVmIGJhc2ljX3N0cmluZ192aWV3PGNoYXIxNl90PiB1MTZzdHJpbmdfdmlldzsKK3R5cGVkZWYgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhcjMyX3Q+IHUzMnN0cmluZ192aWV3OwordHlwZWRlZiBiYXNpY19zdHJpbmdfdmlldzx3Y2hhcl90PiAgd3N0cmluZ192aWV3OworCisvLyBbc3RyaW5nLnZpZXcuaGFzaF0KK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBoYXNoPGJhc2ljX3N0cmluZ192aWV3PF9DaGFyVCwgX1RyYWl0cz4gPgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGJhc2ljX3N0cmluZ192aWV3PF9DaGFyVCwgX1RyYWl0cz4sIHNpemVfdD4KK3sKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBiYXNpY19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHM+IF9fdmFsKSBjb25zdCBfTk9FWENFUFQ7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitzaXplX3QKK2hhc2g8YmFzaWNfc3RyaW5nX3ZpZXc8X0NoYXJULCBfVHJhaXRzPiA+OjpvcGVyYXRvcigpKAorICAgICAgICBjb25zdCBiYXNpY19zdHJpbmdfdmlldzxfQ2hhclQsIF9UcmFpdHM+IF9fdmFsKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19kb19zdHJpbmdfaGFzaChfX3ZhbC5kYXRhKCksIF9fdmFsLmRhdGEoKSArIF9fdmFsLnNpemUoKSk7Cit9CisKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExIAoraW5saW5lIG5hbWVzcGFjZSBsaXRlcmFscworeworICBpbmxpbmUgbmFtZXNwYWNlIHN0cmluZ192aWV3X2xpdGVyYWxzCisgIHsKKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgorICAgIGJhc2ljX3N0cmluZ192aWV3PGNoYXI+IG9wZXJhdG9yICIiIHN2KGNvbnN0IGNoYXIgKl9fc3RyLCBzaXplX3QgX19sZW4pIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIGJhc2ljX3N0cmluZ192aWV3PGNoYXI+IChfX3N0ciwgX19sZW4pOworICAgIH0KKworICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSCisgICAgYmFzaWNfc3RyaW5nX3ZpZXc8d2NoYXJfdD4gb3BlcmF0b3IgIiIgc3YoY29uc3Qgd2NoYXJfdCAqX19zdHIsIHNpemVfdCBfX2xlbikgX05PRVhDRVBUCisgICAgeworICAgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nX3ZpZXc8d2NoYXJfdD4gKF9fc3RyLCBfX2xlbik7CisgICAgfQorCisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIKKyAgICBiYXNpY19zdHJpbmdfdmlldzxjaGFyMTZfdD4gb3BlcmF0b3IgIiIgc3YoY29uc3QgY2hhcjE2X3QgKl9fc3RyLCBzaXplX3QgX19sZW4pIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgcmV0dXJuIGJhc2ljX3N0cmluZ192aWV3PGNoYXIxNl90PiAoX19zdHIsIF9fbGVuKTsKKyAgICB9CisKKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgorICAgIGJhc2ljX3N0cmluZ192aWV3PGNoYXIzMl90PiBvcGVyYXRvciAiIiBzdihjb25zdCBjaGFyMzJfdCAqX19zdHIsIHNpemVfdCBfX2xlbikgX05PRVhDRVBUCisgICAgeworICAgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhcjMyX3Q+IChfX3N0ciwgX19sZW4pOworICAgIH0KKyAgfQorfQorI2VuZGlmCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKK19MSUJDUFBfUE9QX01BQ1JPUworCisjZW5kaWYgLy8gX0xJQkNQUF9TVFJJTkdfVklFVwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N0cnN0cmVhbSBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdHJzdHJlYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwYjlkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdHJzdHJlYW0KQEAgLTAsMCArMSw0MDAgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdHJzdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfU1RSU1RSRUFNCisjZGVmaW5lIF9MSUJDUFBfU1RSU1RSRUFNCisKKy8qCisgICAgc3Ryc3RyZWFtIHN5bm9wc2lzCisKK2NsYXNzIHN0cnN0cmVhbWJ1ZgorICAgIDogcHVibGljIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyPgoreworcHVibGljOgorICAgIGV4cGxpY2l0IHN0cnN0cmVhbWJ1ZihzdHJlYW1zaXplIGFsc2l6ZV9hcmcgPSAwKTsKKyAgICBzdHJzdHJlYW1idWYodm9pZCogKCpwYWxsb2NfYXJnKShzaXplX3QpLCB2b2lkICgqcGZyZWVfYXJnKSh2b2lkKikpOworICAgIHN0cnN0cmVhbWJ1ZihjaGFyKiBnbmV4dF9hcmcsIHN0cmVhbXNpemUgbiwgY2hhciogcGJlZ19hcmcgPSAwKTsKKyAgICBzdHJzdHJlYW1idWYoY29uc3QgY2hhciogZ25leHRfYXJnLCBzdHJlYW1zaXplIG4pOworCisgICAgc3Ryc3RyZWFtYnVmKHNpZ25lZCBjaGFyKiBnbmV4dF9hcmcsIHN0cmVhbXNpemUgbiwgc2lnbmVkIGNoYXIqIHBiZWdfYXJnID0gMCk7CisgICAgc3Ryc3RyZWFtYnVmKGNvbnN0IHNpZ25lZCBjaGFyKiBnbmV4dF9hcmcsIHN0cmVhbXNpemUgbik7CisgICAgc3Ryc3RyZWFtYnVmKHVuc2lnbmVkIGNoYXIqIGduZXh0X2FyZywgc3RyZWFtc2l6ZSBuLCB1bnNpZ25lZCBjaGFyKiBwYmVnX2FyZyA9IDApOworICAgIHN0cnN0cmVhbWJ1Zihjb25zdCB1bnNpZ25lZCBjaGFyKiBnbmV4dF9hcmcsIHN0cmVhbXNpemUgbik7CisKKyAgICBzdHJzdHJlYW1idWYoc3Ryc3RyZWFtYnVmJiYgcmhzKTsKKyAgICBzdHJzdHJlYW1idWYmIG9wZXJhdG9yPShzdHJzdHJlYW1idWYmJiByaHMpOworCisgICAgdmlydHVhbCB+c3Ryc3RyZWFtYnVmKCk7CisKKyAgICB2b2lkIHN3YXAoc3Ryc3RyZWFtYnVmJiByaHMpOworCisgICAgdm9pZCBmcmVlemUoYm9vbCBmcmVlemVmbCA9IHRydWUpOworICAgIGNoYXIqIHN0cigpOworICAgIGludCBwY291bnQoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgaW50X3R5cGUgb3ZlcmZsb3cgKGludF90eXBlIGMgPSBFT0YpOworICAgIHZpcnR1YWwgaW50X3R5cGUgcGJhY2tmYWlsKGludF90eXBlIGMgPSBFT0YpOworICAgIHZpcnR1YWwgaW50X3R5cGUgdW5kZXJmbG93KCk7CisgICAgdmlydHVhbCBwb3NfdHlwZSBzZWVrb2ZmKG9mZl90eXBlIG9mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgd2F5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgd2hpY2ggPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyAgICB2aXJ0dWFsIHBvc190eXBlIHNlZWtwb3MocG9zX3R5cGUgc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSB3aGljaCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworICAgIHZpcnR1YWwgc3RyZWFtYnVmKiBzZXRidWYoY2hhciogcywgc3RyZWFtc2l6ZSBuKTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIFQxIHN0cnN0YXRlOyAgICAgICAgICAgICAgICAvLyBleHBvc2l0aW9uIG9ubHkKKyAgICBzdGF0aWMgY29uc3Qgc3Ryc3RhdGUgYWxsb2NhdGVkOyAgICAvLyBleHBvc2l0aW9uIG9ubHkKKyAgICBzdGF0aWMgY29uc3Qgc3Ryc3RhdGUgY29uc3RhbnQ7ICAgICAvLyBleHBvc2l0aW9uIG9ubHkKKyAgICBzdGF0aWMgY29uc3Qgc3Ryc3RhdGUgZHluYW1pYzsgICAgICAvLyBleHBvc2l0aW9uIG9ubHkKKyAgICBzdGF0aWMgY29uc3Qgc3Ryc3RhdGUgZnJvemVuOyAgICAgICAvLyBleHBvc2l0aW9uIG9ubHkKKyAgICBzdHJzdGF0ZSBzdHJtb2RlOyAgICAgICAgICAgICAgICAgICAvLyBleHBvc2l0aW9uIG9ubHkKKyAgICBzdHJlYW1zaXplIGFsc2l6ZTsgICAgICAgICAgICAgICAgICAvLyBleHBvc2l0aW9uIG9ubHkKKyAgICB2b2lkKiAoKnBhbGxvYykoc2l6ZV90KTsgICAgICAgICAgICAvLyBleHBvc2l0aW9uIG9ubHkKKyAgICB2b2lkICgqcGZyZWUpKHZvaWQqKTsgICAgICAgICAgICAgICAvLyBleHBvc2l0aW9uIG9ubHkKK307CisKK2NsYXNzIGlzdHJzdHJlYW0KKyAgICA6IHB1YmxpYyBiYXNpY19pc3RyZWFtPGNoYXI+Cit7CitwdWJsaWM6CisgICAgZXhwbGljaXQgaXN0cnN0cmVhbShjb25zdCBjaGFyKiBzKTsKKyAgICBleHBsaWNpdCBpc3Ryc3RyZWFtKGNoYXIqIHMpOworICAgIGlzdHJzdHJlYW0oY29uc3QgY2hhciogcywgc3RyZWFtc2l6ZSBuKTsKKyAgICBpc3Ryc3RyZWFtKGNoYXIqIHMsIHN0cmVhbXNpemUgbik7CisKKyAgICB2aXJ0dWFsIH5pc3Ryc3RyZWFtKCk7CisKKyAgICBzdHJzdHJlYW1idWYqIHJkYnVmKCkgY29uc3Q7CisgICAgY2hhciAqc3RyKCk7CisKK3ByaXZhdGU6CisgICAgc3Ryc3RyZWFtYnVmIHNiOyAvLyBleHBvc2l0aW9uIG9ubHkKK307CisKK2NsYXNzIG9zdHJzdHJlYW0KKyAgICA6IHB1YmxpYyBiYXNpY19vc3RyZWFtPGNoYXI+Cit7CitwdWJsaWM6CisgICAgb3N0cnN0cmVhbSgpOworICAgIG9zdHJzdHJlYW0oY2hhciogcywgaW50IG4sIGlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gaW9zX2Jhc2U6Om91dCk7CisKKyAgICB2aXJ0dWFsIH5vc3Ryc3RyZWFtKCk7CisKKyAgICBzdHJzdHJlYW1idWYqIHJkYnVmKCkgY29uc3Q7CisgICAgdm9pZCBmcmVlemUoYm9vbCBmcmVlemVmbCA9IHRydWUpOworICAgIGNoYXIqIHN0cigpOworICAgIGludCBwY291bnQoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBzdHJzdHJlYW1idWYgc2I7IC8vIGV4cG9zaXRpb24gb25seQorfTsKKworY2xhc3Mgc3Ryc3RyZWFtCisgICAgOiBwdWJsaWMgYmFzaWNfaW9zdHJlYW08Y2hhcj4KK3sKK3B1YmxpYzoKKyAgICAvLyBUeXBlcworICAgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+OjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+Ojpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+OjpvZmZfdHlwZSBvZmZfdHlwZTsKKworICAgIC8vIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisgICAgc3Ryc3RyZWFtKCk7CisgICAgc3Ryc3RyZWFtKGNoYXIqIHMsIGludCBuLCBpb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworCisgICAgdmlydHVhbCB+c3Ryc3RyZWFtKCk7CisKKyAgICAvLyBNZW1iZXJzOgorICAgIHN0cnN0cmVhbWJ1ZiogcmRidWYoKSBjb25zdDsKKyAgICB2b2lkIGZyZWV6ZShib29sIGZyZWV6ZWZsID0gdHJ1ZSk7CisgICAgaW50IHBjb3VudCgpIGNvbnN0OworICAgIGNoYXIqIHN0cigpOworCitwcml2YXRlOgorICAgIHN0cnN0cmVhbWJ1ZiBzYjsgLy8gZXhwb3NpdGlvbiBvbmx5Cit9OworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8aXN0cmVhbT4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIHN0cnN0cmVhbWJ1ZgorICAgIDogcHVibGljIHN0cmVhbWJ1ZgoreworcHVibGljOgorICAgIGV4cGxpY2l0IHN0cnN0cmVhbWJ1ZihzdHJlYW1zaXplIF9fYWxzaXplID0gMCk7CisgICAgc3Ryc3RyZWFtYnVmKHZvaWQqICgqX19wYWxsb2MpKHNpemVfdCksIHZvaWQgKCpfX3BmcmVlKSh2b2lkKikpOworICAgIHN0cnN0cmVhbWJ1ZihjaGFyKiBfX2duZXh0LCBzdHJlYW1zaXplIF9fbiwgY2hhciogX19wYmVnID0gMCk7CisgICAgc3Ryc3RyZWFtYnVmKGNvbnN0IGNoYXIqIF9fZ25leHQsIHN0cmVhbXNpemUgX19uKTsKKworICAgIHN0cnN0cmVhbWJ1ZihzaWduZWQgY2hhciogX19nbmV4dCwgc3RyZWFtc2l6ZSBfX24sIHNpZ25lZCBjaGFyKiBfX3BiZWcgPSAwKTsKKyAgICBzdHJzdHJlYW1idWYoY29uc3Qgc2lnbmVkIGNoYXIqIF9fZ25leHQsIHN0cmVhbXNpemUgX19uKTsKKyAgICBzdHJzdHJlYW1idWYodW5zaWduZWQgY2hhciogX19nbmV4dCwgc3RyZWFtc2l6ZSBfX24sIHVuc2lnbmVkIGNoYXIqIF9fcGJlZyA9IDApOworICAgIHN0cnN0cmVhbWJ1Zihjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2duZXh0LCBzdHJlYW1zaXplIF9fbik7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0cnN0cmVhbWJ1ZihzdHJzdHJlYW1idWYmJiBfX3Jocyk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0cnN0cmVhbWJ1ZiYgb3BlcmF0b3I9KHN0cnN0cmVhbWJ1ZiYmIF9fcmhzKTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICB2aXJ0dWFsIH5zdHJzdHJlYW1idWYoKTsKKworICAgIHZvaWQgc3dhcChzdHJzdHJlYW1idWYmIF9fcmhzKTsKKworICAgIHZvaWQgZnJlZXplKGJvb2wgX19mcmVlemVmbCA9IHRydWUpOworICAgIGNoYXIqIHN0cigpOworICAgIGludCBwY291bnQoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgaW50X3R5cGUgb3ZlcmZsb3cgKGludF90eXBlIF9fYyA9IEVPRik7CisgICAgdmlydHVhbCBpbnRfdHlwZSBwYmFja2ZhaWwoaW50X3R5cGUgX19jID0gRU9GKTsKKyAgICB2aXJ0dWFsIGludF90eXBlIHVuZGVyZmxvdygpOworICAgIHZpcnR1YWwgcG9zX3R5cGUgc2Vla29mZihvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX193YXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX3doaWNoID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CisgICAgdmlydHVhbCBwb3NfdHlwZSBzZWVrcG9zKHBvc190eXBlIF9fc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX3doaWNoID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiB1bnNpZ25lZCBfX21vZGVfdHlwZTsKKyAgICBzdGF0aWMgY29uc3QgX19tb2RlX3R5cGUgX19hbGxvY2F0ZWQgPSAweDAxOworICAgIHN0YXRpYyBjb25zdCBfX21vZGVfdHlwZSBfX2NvbnN0YW50ICA9IDB4MDI7CisgICAgc3RhdGljIGNvbnN0IF9fbW9kZV90eXBlIF9fZHluYW1pYyAgID0gMHgwNDsKKyAgICBzdGF0aWMgY29uc3QgX19tb2RlX3R5cGUgX19mcm96ZW4gICAgPSAweDA4OworICAgIHN0YXRpYyBjb25zdCBzdHJlYW1zaXplICAgIF9fZGVmYXVsdF9hbHNpemUgPSA0MDk2OworCisgICAgX19tb2RlX3R5cGUgX19zdHJtb2RlXzsKKyAgICBzdHJlYW1zaXplIF9fYWxzaXplXzsKKyAgICB2b2lkKiAoKl9fcGFsbG9jXykoc2l6ZV90KTsKKyAgICB2b2lkICgqX19wZnJlZV8pKHZvaWQqKTsKKworICAgIHZvaWQgX19pbml0KGNoYXIqIF9fZ25leHQsIHN0cmVhbXNpemUgX19uLCBjaGFyKiBfX3BiZWcpOworfTsKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3N0cnN0cmVhbWJ1Zjo6c3Ryc3RyZWFtYnVmKHN0cnN0cmVhbWJ1ZiYmIF9fcmhzKQorICAgIDogc3RyZWFtYnVmKF9fcmhzKSwKKyAgICAgIF9fc3RybW9kZV8oX19yaHMuX19zdHJtb2RlXyksCisgICAgICBfX2Fsc2l6ZV8oX19yaHMuX19hbHNpemVfKSwKKyAgICAgIF9fcGFsbG9jXyhfX3Jocy5fX3BhbGxvY18pLAorICAgICAgX19wZnJlZV8oX19yaHMuX19wZnJlZV8pCit7CisgICAgX19yaHMuc2V0ZyhudWxscHRyLCBudWxscHRyLCBudWxscHRyKTsKKyAgICBfX3Jocy5zZXRwKG51bGxwdHIsIG51bGxwdHIpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorc3Ryc3RyZWFtYnVmJgorc3Ryc3RyZWFtYnVmOjpvcGVyYXRvcj0oc3Ryc3RyZWFtYnVmJiYgX19yaHMpCit7CisgICAgaWYgKGViYWNrKCkgJiYgKF9fc3RybW9kZV8gJiBfX2FsbG9jYXRlZCkgIT0gMCAmJiAoX19zdHJtb2RlXyAmIF9fZnJvemVuKSA9PSAwKQorICAgIHsKKyAgICAgICAgaWYgKF9fcGZyZWVfKQorICAgICAgICAgICAgX19wZnJlZV8oZWJhY2soKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRlbGV0ZSBbXSBlYmFjaygpOworICAgIH0KKyAgICBzdHJlYW1idWY6Om9wZXJhdG9yPShfX3Jocyk7CisgICAgX19zdHJtb2RlXyA9IF9fcmhzLl9fc3RybW9kZV87CisgICAgX19hbHNpemVfID0gX19yaHMuX19hbHNpemVfOworICAgIF9fcGFsbG9jXyA9IF9fcmhzLl9fcGFsbG9jXzsKKyAgICBfX3BmcmVlXyA9IF9fcmhzLl9fcGZyZWVfOworICAgIF9fcmhzLnNldGcobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cik7CisgICAgX19yaHMuc2V0cChudWxscHRyLCBudWxscHRyKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgaXN0cnN0cmVhbQorICAgIDogcHVibGljIGlzdHJlYW0KK3sKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgaXN0cnN0cmVhbShjb25zdCBjaGFyKiBfX3MpCisgICAgICAgIDogaXN0cmVhbSgmX19zYl8pLCBfX3NiXyhfX3MsIDApIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IGlzdHJzdHJlYW0oY2hhciogX19zKQorICAgICAgICA6IGlzdHJlYW0oJl9fc2JfKSwgX19zYl8oX19zLCAwKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpc3Ryc3RyZWFtKGNvbnN0IGNoYXIqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgICAgIDogaXN0cmVhbSgmX19zYl8pLCBfX3NiXyhfX3MsIF9fbikge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXN0cnN0cmVhbShjaGFyKiBfX3MsIHN0cmVhbXNpemUgX19uKQorICAgICAgICA6IGlzdHJlYW0oJl9fc2JfKSwgX19zYl8oX19zLCBfX24pIHt9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGlzdHJzdHJlYW0oaXN0cnN0cmVhbSYmIF9fcmhzKQorICAgICAgICA6IGlzdHJlYW0oX1ZTVEQ6Om1vdmUoX19yaHMpKSwKKyAgICAgICAgICBfX3NiXyhfVlNURDo6bW92ZShfX3Jocy5fX3NiXykpCisgICAgeworICAgICAgICBpc3RyZWFtOjpzZXRfcmRidWYoJl9fc2JfKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXN0cnN0cmVhbSYgb3BlcmF0b3I9KGlzdHJzdHJlYW0mJiBfX3JocykKKyAgICB7CisgICAgICAgIGlzdHJlYW06Om9wZXJhdG9yPShfVlNURDo6bW92ZShfX3JocykpOworICAgICAgICBfX3NiXyA9IF9WU1REOjptb3ZlKF9fcmhzLl9fc2JfKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICB2aXJ0dWFsIH5pc3Ryc3RyZWFtKCk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKGlzdHJzdHJlYW0mIF9fcmhzKQorICAgIHsKKyAgICAgICAgaXN0cmVhbTo6c3dhcChfX3Jocyk7CisgICAgICAgIF9fc2JfLnN3YXAoX19yaHMuX19zYl8pOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdHJzdHJlYW1idWYqIHJkYnVmKCkgY29uc3Qge3JldHVybiBjb25zdF9jYXN0PHN0cnN0cmVhbWJ1Zio+KCZfX3NiXyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjaGFyICpzdHIoKSB7cmV0dXJuIF9fc2JfLnN0cigpO30KKworcHJpdmF0ZToKKyAgICBzdHJzdHJlYW1idWYgX19zYl87Cit9OworCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIG9zdHJzdHJlYW0KKyAgICA6IHB1YmxpYyBvc3RyZWFtCit7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG9zdHJzdHJlYW0oKQorICAgICAgICA6IG9zdHJlYW0oJl9fc2JfKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvc3Ryc3RyZWFtKGNoYXIqIF9fcywgaW50IF9fbiwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjpvdXQpCisgICAgICAgIDogb3N0cmVhbSgmX19zYl8pLAorICAgICAgICAgIF9fc2JfKF9fcywgX19uLCBfX3MgKyAoX19tb2RlICYgaW9zOjphcHAgPyBzdHJsZW4oX19zKSA6IDApKQorICAgICAgICB7fQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvc3Ryc3RyZWFtKG9zdHJzdHJlYW0mJiBfX3JocykKKyAgICAgICAgOiBvc3RyZWFtKF9WU1REOjptb3ZlKF9fcmhzKSksCisgICAgICAgICAgX19zYl8oX1ZTVEQ6Om1vdmUoX19yaHMuX19zYl8pKQorICAgIHsKKyAgICAgICAgb3N0cmVhbTo6c2V0X3JkYnVmKCZfX3NiXyk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG9zdHJzdHJlYW0mIG9wZXJhdG9yPShvc3Ryc3RyZWFtJiYgX19yaHMpCisgICAgeworICAgICAgICBvc3RyZWFtOjpvcGVyYXRvcj0oX1ZTVEQ6Om1vdmUoX19yaHMpKTsKKyAgICAgICAgX19zYl8gPSBfVlNURDo6bW92ZShfX3Jocy5fX3NiXyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgdmlydHVhbCB+b3N0cnN0cmVhbSgpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc3dhcChvc3Ryc3RyZWFtJiBfX3JocykKKyAgICB7CisgICAgICAgIG9zdHJlYW06OnN3YXAoX19yaHMpOworICAgICAgICBfX3NiXy5zd2FwKF9fcmhzLl9fc2JfKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3Ryc3RyZWFtYnVmKiByZGJ1ZigpIGNvbnN0IHtyZXR1cm4gY29uc3RfY2FzdDxzdHJzdHJlYW1idWYqPigmX19zYl8pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBmcmVlemUoYm9vbCBfX2ZyZWV6ZWZsID0gdHJ1ZSkge19fc2JfLmZyZWV6ZShfX2ZyZWV6ZWZsKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNoYXIqIHN0cigpICAgICAgICAge3JldHVybiBfX3NiXy5zdHIoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGludCBwY291bnQoKSBjb25zdCAge3JldHVybiBfX3NiXy5wY291bnQoKTt9CisKK3ByaXZhdGU6CisgICAgc3Ryc3RyZWFtYnVmIF9fc2JfOyAvLyBleHBvc2l0aW9uIG9ubHkKK307CisKK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgc3Ryc3RyZWFtCisgICAgOiBwdWJsaWMgaW9zdHJlYW0KK3sKK3B1YmxpYzoKKyAgICAvLyBUeXBlcworICAgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+OjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+Ojpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+OjpvZmZfdHlwZSBvZmZfdHlwZTsKKworICAgIC8vIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0cnN0cmVhbSgpCisgICAgICAgIDogaW9zdHJlYW0oJl9fc2JfKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdHJzdHJlYW0oY2hhciogX19zLCBpbnQgX19uLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkKKyAgICAgICAgOiBpb3N0cmVhbSgmX19zYl8pLAorICAgICAgICAgIF9fc2JfKF9fcywgX19uLCBfX3MgKyAoX19tb2RlICYgaW9zOjphcHAgPyBzdHJsZW4oX19zKSA6IDApKQorICAgICAgICB7fQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdHJzdHJlYW0oc3Ryc3RyZWFtJiYgX19yaHMpCisgICAgICAgIDogaW9zdHJlYW0oX1ZTVEQ6Om1vdmUoX19yaHMpKSwKKyAgICAgICAgICBfX3NiXyhfVlNURDo6bW92ZShfX3Jocy5fX3NiXykpCisgICAgeworICAgICAgICBpb3N0cmVhbTo6c2V0X3JkYnVmKCZfX3NiXyk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0cnN0cmVhbSYgb3BlcmF0b3I9KHN0cnN0cmVhbSYmIF9fcmhzKQorICAgIHsKKyAgICAgICAgaW9zdHJlYW06Om9wZXJhdG9yPShfVlNURDo6bW92ZShfX3JocykpOworICAgICAgICBfX3NiXyA9IF9WU1REOjptb3ZlKF9fcmhzLl9fc2JfKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICB2aXJ0dWFsIH5zdHJzdHJlYW0oKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAoc3Ryc3RyZWFtJiBfX3JocykKKyAgICB7CisgICAgICAgIGlvc3RyZWFtOjpzd2FwKF9fcmhzKTsKKyAgICAgICAgX19zYl8uc3dhcChfX3Jocy5fX3NiXyk7CisgICAgfQorCisgICAgLy8gTWVtYmVyczoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3Ryc3RyZWFtYnVmKiByZGJ1ZigpIGNvbnN0IHtyZXR1cm4gY29uc3RfY2FzdDxzdHJzdHJlYW1idWYqPigmX19zYl8pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBmcmVlemUoYm9vbCBfX2ZyZWV6ZWZsID0gdHJ1ZSkge19fc2JfLmZyZWV6ZShfX2ZyZWV6ZWZsKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGludCBwY291bnQoKSBjb25zdCB7cmV0dXJuIF9fc2JfLnBjb3VudCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY2hhciogc3RyKCkgICAgICAgIHtyZXR1cm4gX19zYl8uc3RyKCk7fQorCitwcml2YXRlOgorICAgIHN0cnN0cmVhbWJ1ZiBfX3NiXzsgLy8gZXhwb3NpdGlvbiBvbmx5Cit9OworCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKKyNlbmRpZiAgLy8gX0xJQkNQUF9TVFJTVFJFQU0KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdXBwb3J0L2FuZHJvaWQvbG9jYWxlX2Jpb25pYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvYW5kcm9pZC9sb2NhbGVfYmlvbmljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxMDM1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdXBwb3J0L2FuZHJvaWQvbG9jYWxlX2Jpb25pYy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0gc3VwcG9ydC9hbmRyb2lkL2xvY2FsZV9iaW9uaWMuaCAtLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfU1VQUE9SVF9BTkRST0lEX0xPQ0FMRV9CSU9OSUNfSAorI2RlZmluZSBfTElCQ1BQX1NVUFBPUlRfQU5EUk9JRF9MT0NBTEVfQklPTklDX0gKKworI2lmIGRlZmluZWQoX19CSU9OSUNfXykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8eGxvY2FsZS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjaW5jbHVkZSA8c3VwcG9ydC94bG9jYWxlL19fcG9zaXhfbF9mYWxsYmFjay5oPgorCisjZW5kaWYgLy8gZGVmaW5lZChfX0JJT05JQ19fKQorI2VuZGlmIC8vIF9MSUJDUFBfU1VQUE9SVF9BTkRST0lEX0xPQ0FMRV9CSU9OSUNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvZnVjaHNpYS94bG9jYWxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3VwcG9ydC9mdWNoc2lhL3hsb2NhbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGUyZmNhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvZnVjaHNpYS94bG9jYWxlLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLSBzdXBwb3J0L2Z1Y2hzaWEveGxvY2FsZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9TVVBQT1JUX0ZVQ0hTSUFfWExPQ0FMRV9ICisjZGVmaW5lIF9MSUJDUFBfU1VQUE9SVF9GVUNIU0lBX1hMT0NBTEVfSAorCisjaWYgZGVmaW5lZChfX0Z1Y2hzaWFfXykKKworI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3djaGFyPgorI2luY2x1ZGUgPHN1cHBvcnQveGxvY2FsZS9fX3Bvc2l4X2xfZmFsbGJhY2suaD4KKyNpbmNsdWRlIDxzdXBwb3J0L3hsb2NhbGUvX19zdHJ0b251bV9mYWxsYmFjay5oPgorCisjZW5kaWYgLy8gZGVmaW5lZChfX0Z1Y2hzaWFfXykKKworI2VuZGlmIC8vIF9MSUJDUFBfU1VQUE9SVF9GVUNIU0lBX1hMT0NBTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvaWJtL2xpbWl0cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvaWJtL2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZGIzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3VwcG9ydC9pYm0vbGltaXRzLmgKQEAgLTAsMCArMSw5OSBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN1cHBvcnQvaWJtL2xpbWl0cy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9TVVBQT1JUX0lCTV9MSU1JVFNfSAorI2RlZmluZSBfTElCQ1BQX1NVUFBPUlRfSUJNX0xJTUlUU19ICisKKyNpZiAhZGVmaW5lZChfQUlYKSAvLyBMaW51eAorI2luY2x1ZGUgPG1hdGguaD4gLy8gZm9yIEhVR0VfVkFMLCBIVUdFX1ZBTEYsIEhVR0VfVkFMTCwgYW5kIE5BTgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IF9RTkFOX0YgPSAweDdmYzAwMDAwOworI2RlZmluZSBOQU5GICgqKChmbG9hdCAqKSgmX1FOQU5fRikpKQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBfUU5BTl9MREJMMTI4WzRdID0gezB4N2ZmODAwMDAsIDB4MCwgMHgwLCAweDB9OworI2RlZmluZSBOQU5MICgqKChsb25nIGRvdWJsZSAqKSgmX1FOQU5fTERCTDEyOCkpKQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBfU05BTl9GPSAweDdmODU1NTU1OworI2RlZmluZSBOQU5TRiAoKigoZmxvYXQgKikoJl9TTkFOX0YpKSkKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgX1NOQU5fRFsyXSA9IHsweDdmZjU1NTU1LCAweDU1NTU1NTU1fTsKKyNkZWZpbmUgTkFOUyAoKigoZG91YmxlICopKCZfU05BTl9EKSkpCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IF9TTkFOX0xEQkwxMjhbNF0gPSB7MHg3ZmY1NTU1NSwgMHg1NTU1NTU1NSwgMHgwLCAweDB9OworI2RlZmluZSBOQU5TTCAoKigobG9uZyBkb3VibGUgKikoJl9TTkFOX0xEQkwxMjgpKSkKKworI2RlZmluZSBfX2J1aWx0aW5faHVnZV92YWwoKSAgICAgSFVHRV9WQUwKKyNkZWZpbmUgX19idWlsdGluX2h1Z2VfdmFsZigpICAgIEhVR0VfVkFMRgorI2RlZmluZSBfX2J1aWx0aW5faHVnZV92YWxsKCkgICAgSFVHRV9WQUxMCisjZGVmaW5lIF9fYnVpbHRpbl9uYW4oX19kdW1teSkgICBOQU4KKyNkZWZpbmUgX19idWlsdGluX25hbmYoX19kdW1teSkgIE5BTkYKKyNkZWZpbmUgX19idWlsdGluX25hbmwoX19kdW1teSkgIE5BTkwKKyNkZWZpbmUgX19idWlsdGluX25hbnMoX19kdW1teSkgIE5BTlMKKyNkZWZpbmUgX19idWlsdGluX25hbnNmKF9fZHVtbXkpIE5BTlNGCisjZGVmaW5lIF9fYnVpbHRpbl9uYW5zbChfX2R1bW15KSBOQU5TTAorCisjZWxzZQorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+IC8vIGxpbWl0IGNvbnN0YW50cworCisjZGVmaW5lIF9fYnVpbHRpbl9odWdlX3ZhbCgpICAgICBIVUdFX1ZBTCAgLy8weDdmZjAwMDAwMDAwMDAwMDAKKyNkZWZpbmUgX19idWlsdGluX2h1Z2VfdmFsZigpICAgIEhVR0VfVkFMRiAvLzB4N2Y4MDAwMDAKKyNkZWZpbmUgX19idWlsdGluX2h1Z2VfdmFsbCgpICAgIEhVR0VfVkFMTCAvLzB4N2ZmMDAwMDAwMDAwMDAwMAorI2RlZmluZSBfX2J1aWx0aW5fbmFuKF9fZHVtbXkpICAgbmFuKF9fZHVtbXkpIC8vMHg3ZmY4MDAwMDAwMDAwMDAwCisjZGVmaW5lIF9fYnVpbHRpbl9uYW5mKF9fZHVtbXkpICBuYW5mKF9fZHVtbXkpIC8vIDB4N2ZmODAwMDAKKyNkZWZpbmUgX19idWlsdGluX25hbmwoX19kdW1teSkgIG5hbmwoX19kdW1teSkgLy8weDdmZjgwMDAwMDAwMDAwMDAKKyNkZWZpbmUgX19idWlsdGluX25hbnMoX19kdW1teSkgIERCTF9TTkFOIC8vMHg3ZmY1NTU1NTU1NTU1NTU1CisjZGVmaW5lIF9fYnVpbHRpbl9uYW5zZihfX2R1bW15KSBGTFRfU05BTiAvLzB4N2Y4NTU1NTUKKyNkZWZpbmUgX19idWlsdGluX25hbnNsKF9fZHVtbXkpIERCTF9TTkFOIC8vMHg3ZmY1NTU1NTU1NTU1NTU1CisKKyNkZWZpbmUgX19GTFRfTUFOVF9ESUdfXyAgIEZMVF9NQU5UX0RJRworI2RlZmluZSBfX0ZMVF9ESUdfXyAgICAgICAgRkxUX0RJRworI2RlZmluZSBfX0ZMVF9SQURJWF9fICAgICAgRkxUX1JBRElYCisjZGVmaW5lIF9fRkxUX01JTl9FWFBfXyAgICBGTFRfTUlOX0VYUAorI2RlZmluZSBfX0ZMVF9NSU5fMTBfRVhQX18gRkxUX01JTl8xMF9FWFAKKyNkZWZpbmUgX19GTFRfTUFYX0VYUF9fICAgIEZMVF9NQVhfRVhQCisjZGVmaW5lIF9fRkxUX01BWF8xMF9FWFBfXyBGTFRfTUFYXzEwX0VYUAorI2RlZmluZSBfX0ZMVF9NSU5fXyAgICAgICAgRkxUX01JTgorI2RlZmluZSBfX0ZMVF9NQVhfXyAgICAgICAgRkxUX01BWAorI2RlZmluZSBfX0ZMVF9FUFNJTE9OX18gICAgRkxUX0VQU0lMT04KKy8vIHByZWRlZmluZWQgYnkgWExDIG9uIExvUAorI2RlZmluZSBfX0ZMVF9ERU5PUk1fTUlOX18gMS40MDEyOTg0NmUtNDVGCisKKyNkZWZpbmUgX19EQkxfTUFOVF9ESUdfXyAgIERCTF9NQU5UX0RJRworI2RlZmluZSBfX0RCTF9ESUdfXyAgICAgICAgREJMX0RJRworI2RlZmluZSBfX0RCTF9NSU5fRVhQX18gICAgREJMX01JTl9FWFAKKyNkZWZpbmUgX19EQkxfTUlOXzEwX0VYUF9fIERCTF9NSU5fMTBfRVhQCisjZGVmaW5lIF9fREJMX01BWF9FWFBfXyAgICBEQkxfTUFYX0VYUAorI2RlZmluZSBfX0RCTF9NQVhfMTBfRVhQX18gREJMX01BWF8xMF9FWFAKKyNkZWZpbmUgX19EQkxfTUlOX18gICAgICAgIERCTF9NSU4KKyNkZWZpbmUgX19EQkxfTUFYX18gICAgICAgIERCTF9NQVgKKyNkZWZpbmUgX19EQkxfRVBTSUxPTl9fICAgIERCTF9FUFNJTE9OCisvLyBwcmVkZWZpbmVkIGJ5IFhMQyBvbiBMb1AKKyNkZWZpbmUgX19EQkxfREVOT1JNX01JTl9fIDQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0CisKKyNkZWZpbmUgX19MREJMX01BTlRfRElHX18gICBMREJMX01BTlRfRElHCisjZGVmaW5lIF9fTERCTF9ESUdfXyAgICAgICAgTERCTF9ESUcKKyNkZWZpbmUgX19MREJMX01JTl9FWFBfXyAgICBMREJMX01JTl9FWFAKKyNkZWZpbmUgX19MREJMX01JTl8xMF9FWFBfXyBMREJMX01JTl8xMF9FWFAKKyNkZWZpbmUgX19MREJMX01BWF9FWFBfXyAgICBMREJMX01BWF9FWFAKKyNkZWZpbmUgX19MREJMX01BWF8xMF9FWFBfXyBMREJMX01BWF8xMF9FWFAKKyNkZWZpbmUgX19MREJMX01JTl9fICAgICAgICBMREJMX01JTgorI2RlZmluZSBfX0xEQkxfTUFYX18gICAgICAgIExEQkxfTUFYCisjZGVmaW5lIF9fTERCTF9FUFNJTE9OX18gICAgTERCTF9FUFNJTE9OCisvLyBwcmVkZWZpbmVkIGJ5IFhMQyBvbiBMb1AKKyNpZiBfX0xPTkdET1VCTEUxMjgKKyNkZWZpbmUgX19MREJMX0RFTk9STV9NSU5fXyA0Ljk0MDY1NjQ1ODQxMjQ2NTQ0MTc2NTY4NzkyODY4MjIxZS0zMjRMCisjZWxzZQorI2RlZmluZSBfX0xEQkxfREVOT1JNX01JTl9fIDQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0TAorI2VuZGlmCisKKy8vIHByZWRlZmluZWQgYnkgWExDIG9uIExvUAorI2RlZmluZSBfX0NIQVJfQklUX18gICAgOAorCisjZW5kaWYgLy8gX0FJWAorCisjZW5kaWYgLy8gX0xJQkNQUF9TVVBQT1JUX0lCTV9MSU1JVFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvaWJtL2xvY2FsZV9tZ210X2FpeC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvaWJtL2xvY2FsZV9tZ210X2FpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYjdhNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3VwcG9ydC9pYm0vbG9jYWxlX21nbXRfYWl4LmgKQEAgLTAsMCArMSw4NSBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLSBzdXBwb3J0L2libS9sb2NhbGVfbWdtdF9haXguaCAtLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9TVVBQT1JUX0lCTV9MT0NBTEVfTUdNVF9BSVhfSAorI2RlZmluZSBfTElCQ1BQX1NVUFBPUlRfSUJNX0xPQ0FMRV9NR01UX0FJWF9ICisKKyNpZiBkZWZpbmVkKF9BSVgpCisjaW5jbHVkZSAiY3N0ZGxpYiIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX0FJWDcxKQorLy8gQUlYIDcuMSBhbmQgaGlnaGVyIGhhcyB0aGVzZSBkZWZpbml0aW9ucy4gIERlZmluaXRpb25zIGFuZCBzdHVicworLy8gYXJlIHByb3ZpZWQgaGVyZSBhcyBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIG9uIEFJWCA2LjEuCisKKyNkZWZpbmUgTENfQ09MTEFURV9NQVNLICAgICAgICAgMQorI2RlZmluZSBMQ19DVFlQRV9NQVNLICAgICAgICAgICAyCisjZGVmaW5lIExDX01FU1NBR0VTX01BU0sgICAgICAgIDQKKyNkZWZpbmUgTENfTU9ORVRBUllfTUFTSyAgICAgICAgOAorI2RlZmluZSBMQ19OVU1FUklDX01BU0sgICAgICAgICAxNgorI2RlZmluZSBMQ19USU1FX01BU0sgICAgICAgICAgICAzMgorI2RlZmluZSBMQ19BTExfTUFTSyAgICAgICAgICAgICAoTENfQ09MTEFURV9NQVNLIHwgTENfQ1RZUEVfTUFTSyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExDX01FU1NBR0VTX01BU0sgfCBMQ19NT05FVEFSWV9NQVNLIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ19OVU1FUklDX01BU0sgfCBMQ19USU1FX01BU0spCisKK3R5cGVkZWYgdm9pZCogbG9jYWxlX3Q7CisKKy8vIFRoZSBmb2xsb3dpbmcgYXJlIHN0dWJzLiAgVGhleSBhcmUgbm90IHN1cHBvcnRlZCBvbiBBSVggNi4xLgorc3RhdGljIGlubGluZQorbG9jYWxlX3QgbmV3bG9jYWxlKGludCBjYXRlZ29yeV9tYXNrLCBjb25zdCBjaGFyICpsb2NhbGUsIGxvY2FsZV90IGJhc2UpCit7CisgIF9MQ19sb2NhbGVfdCAqbmV3bG9jLCAqbG9jOworICBpZiAoKGxvYyA9IChfTENfbG9jYWxlX3QgKilfX3hvcGVuX2xvY2FsZShsb2NhbGUpKSA9PSBOVUxMKQorICB7CisgICAgZXJybm8gPSBFSU5WQUw7CisgICAgcmV0dXJuIChsb2NhbGVfdCkwOworICB9CisgIGlmICgobmV3bG9jID0gKF9MQ19sb2NhbGVfdCAqKWNhbGxvYygxLCBzaXplb2YoX0xDX2xvY2FsZV90KSkpID09IE5VTEwpCisgIHsKKyAgICBlcnJubyA9IEVOT01FTTsKKyAgICByZXR1cm4gKGxvY2FsZV90KTA7CisgIH0KKyAgaWYgKCFiYXNlKQorICAgIGJhc2UgPSAoX0xDX2xvY2FsZV90ICopX194b3Blbl9sb2NhbGUoIkMiKTsKKyAgbWVtY3B5KG5ld2xvYywgYmFzZSwgc2l6ZW9mIChfTENfbG9jYWxlX3QpKTsKKyAgaWYgKGNhdGVnb3J5X21hc2sgJiBMQ19DT0xMQVRFX01BU0spCisgICAgbmV3bG9jLT5sY19jb2xsYXRlID0gbG9jLT5sY19jb2xsYXRlOworICBpZiAoY2F0ZWdvcnlfbWFzayAmIExDX0NUWVBFX01BU0spCisgICAgbmV3bG9jLT5sY19jdHlwZSA9IGxvYy0+bGNfY3R5cGU7CisgIC8vaWYgKGNhdGVnb3J5X21hc2sgJiBMQ19NRVNTQUdFU19NQVNLKQorICAvLyAgbmV3bG9jLT5sY19tZXNzYWdlcyA9IGxvYy0+bGNfbWVzc2FnZXM7CisgIGlmIChjYXRlZ29yeV9tYXNrICYgTENfTU9ORVRBUllfTUFTSykKKyAgICBuZXdsb2MtPmxjX21vbmV0YXJ5ID0gbG9jLT5sY19tb25ldGFyeTsKKyAgaWYgKGNhdGVnb3J5X21hc2sgJiBMQ19USU1FX01BU0spCisgICAgbmV3bG9jLT5sY190aW1lID0gbG9jLT5sY190aW1lOworICBpZiAoY2F0ZWdvcnlfbWFzayAmIExDX05VTUVSSUNfTUFTSykKKyAgICBuZXdsb2MtPmxjX251bWVyaWMgPSBsb2MtPmxjX251bWVyaWM7CisgIHJldHVybiAobG9jYWxlX3QpbmV3bG9jOworfQorc3RhdGljIGlubGluZQordm9pZCBmcmVlbG9jYWxlKGxvY2FsZV90IGxvY29iaikKK3sKKyAgZnJlZShsb2NvYmopOworfQorc3RhdGljIGlubGluZQorbG9jYWxlX3QgdXNlbG9jYWxlKGxvY2FsZV90IG5ld2xvYykKK3sKKyAgcmV0dXJuIChsb2NhbGVfdCkwOworfQorI2VuZGlmIC8vICFkZWZpbmVkKF9BSVg3MSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvLyBkZWZpbmVkKF9BSVgpCisjZW5kaWYgLy8gX0xJQkNQUF9TVVBQT1JUX0lCTV9MT0NBTEVfTUdNVF9BSVhfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvaWJtL3N1cHBvcnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdXBwb3J0L2libS9zdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiZmE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdXBwb3J0L2libS9zdXBwb3J0LmgKQEAgLTAsMCArMSw1NCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3VwcG9ydC9pYm0vc3VwcG9ydC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfU1VQUE9SVF9JQk1fU1VQUE9SVF9ICisjZGVmaW5lIF9MSUJDUFBfU1VQUE9SVF9JQk1fU1VQUE9SVF9ICisKK2V4dGVybiAiYnVpbHRpbiIgaW50IF9fcG9wY250NCh1bnNpZ25lZCBpbnQpOworZXh0ZXJuICJidWlsdGluIiBpbnQgX19wb3BjbnQ4KHVuc2lnbmVkIGxvbmcgbG9uZyk7CitleHRlcm4gImJ1aWx0aW4iIHVuc2lnbmVkIGludCBfX2NudHR6NCh1bnNpZ25lZCBpbnQpOworZXh0ZXJuICJidWlsdGluIiB1bnNpZ25lZCBpbnQgX19jbnR0ejgodW5zaWduZWQgbG9uZyBsb25nKTsKK2V4dGVybiAiYnVpbHRpbiIgdW5zaWduZWQgaW50IF9fY250bHo0KHVuc2lnbmVkIGludCk7CitleHRlcm4gImJ1aWx0aW4iIHVuc2lnbmVkIGludCBfX2NudGx6OCh1bnNpZ25lZCBsb25nIGxvbmcpOworCisvLyBCdWlsdGluIGZ1bmN0aW9ucyBmb3IgY291bnRpbmcgcG9wdWxhdGlvbgorI2RlZmluZSBfX2J1aWx0aW5fcG9wY291bnQoeCkgX19wb3BjbnQ0KHgpCisjZGVmaW5lIF9fYnVpbHRpbl9wb3Bjb3VudGxsKHgpIF9fcG9wY250OCh4KQorI2lmIGRlZmluZWQoX182NEJJVF9fKQorI2RlZmluZSBfX2J1aWx0aW5fcG9wY291bnRsKHgpIF9fYnVpbHRpbl9wb3Bjb3VudGxsKHgpCisjZWxzZQorI2RlZmluZSBfX2J1aWx0aW5fcG9wY291bnRsKHgpIF9fYnVpbHRpbl9wb3Bjb3VudCh4KQorI2VuZGlmCisKKy8vIEJ1aWx0aW4gZnVuY3Rpb25zIGZvciBjb3VudGluZyB0cmFpbGluZyB6ZXJvcworI2RlZmluZSBfX2J1aWx0aW5fY3R6KHgpIF9fY250dHo0KHgpCisjZGVmaW5lIF9fYnVpbHRpbl9jdHpsbCh4KSBfX2NudHR6OCh4KQorI2lmIGRlZmluZWQoX182NEJJVF9fKQorI2RlZmluZSBfX2J1aWx0aW5fY3R6bCh4KSBfX2J1aWx0aW5fY3R6bGwoeCkKKyNlbHNlCisjZGVmaW5lIF9fYnVpbHRpbl9jdHpsKHgpIF9fYnVpbHRpbl9jdHooeCkKKyNlbmRpZgorCisvLyBCdWlsdGluIGZ1bmN0aW9ucyBmb3IgY291bnRpbmcgbGVhZGluZyB6ZXJvcworI2RlZmluZSBfX2J1aWx0aW5fY2x6KHgpIF9fY250bHo0KHgpCisjZGVmaW5lIF9fYnVpbHRpbl9jbHpsbCh4KSBfX2NudGx6OCh4KQorI2lmIGRlZmluZWQoX182NEJJVF9fKQorI2RlZmluZSBfX2J1aWx0aW5fY2x6bCh4KSBfX2J1aWx0aW5fY2x6bGwoeCkKKyNlbHNlCisjZGVmaW5lIF9fYnVpbHRpbl9jbHpsKHgpIF9fYnVpbHRpbl9jbHooeCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfXzY0QklUX18pCisjZGVmaW5lIF9fU0laRV9XSURUSF9fIDY0CisjZWxzZQorI2RlZmluZSBfX1NJWkVfV0lEVEhfXyAzMgorI2VuZGlmCisKKyNlbmRpZiAvLyBfTElCQ1BQX1NVUFBPUlRfSUJNX1NVUFBPUlRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvaWJtL3hsb2NhbGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdXBwb3J0L2libS94bG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5YzBiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdXBwb3J0L2libS94bG9jYWxlLmgKQEAgLTAsMCArMSwyNzEgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdXBwb3J0L2libS94bG9jYWxlLmggLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9TVVBQT1JUX0lCTV9YTE9DQUxFX0gKKyNkZWZpbmUgX0xJQkNQUF9TVVBQT1JUX0lCTV9YTE9DQUxFX0gKKyNpbmNsdWRlIDxzdXBwb3J0L2libS9sb2NhbGVfbWdtdF9haXguaD4KKworI2lmIGRlZmluZWQoX0FJWCkKKyNpbmNsdWRlICJjc3RkbGliIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfQUlYNzEpCisvLyBBSVggNy4xIGFuZCBoaWdoZXIgaGFzIHRoZXNlIGRlZmluaXRpb25zLiAgRGVmaW5pdGlvbnMgYW5kIHN0dWJzCisvLyBhcmUgcHJvdmllZCBoZXJlIGFzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgb24gQUlYIDYuMS4KK3N0YXRpYyBpbmxpbmUKK2ludCBpc2FsbnVtX2woaW50IGMsIGxvY2FsZV90IGxvY2FsZSkKK3sKKyAgcmV0dXJuIF9feGlzYWxudW0obG9jYWxlLCBjKTsKK30KK3N0YXRpYyBpbmxpbmUKK2ludCBpc2FscGhhX2woaW50IGMsIGxvY2FsZV90IGxvY2FsZSkKK3sKKyAgcmV0dXJuIF9feGlzYWxwaGEobG9jYWxlLCBjKTsKK30KK3N0YXRpYyBpbmxpbmUKK2ludCBpc2JsYW5rX2woaW50IGMsIGxvY2FsZV90IGxvY2FsZSkKK3sKKyAgcmV0dXJuIF9feGlzYmxhbmsobG9jYWxlLCBjKTsKK30KK3N0YXRpYyBpbmxpbmUKK2ludCBpc2NudHJsX2woaW50IGMsIGxvY2FsZV90IGxvY2FsZSkKK3sKKyAgcmV0dXJuIF9feGlzY250cmwobG9jYWxlLCBjKTsKK30KK3N0YXRpYyBpbmxpbmUKK2ludCBpc2RpZ2l0X2woaW50IGMsIGxvY2FsZV90IGxvY2FsZSkKK3sKKyAgcmV0dXJuIF9feGlzZGlnaXQobG9jYWxlLCBjKTsKK30KK3N0YXRpYyBpbmxpbmUKK2ludCBpc2dyYXBoX2woaW50IGMsIGxvY2FsZV90IGxvY2FsZSkKK3sKKyAgcmV0dXJuIF9feGlzZ3JhcGgobG9jYWxlLCBjKTsKK30KK3N0YXRpYyBpbmxpbmUKK2ludCBpc2xvd2VyX2woaW50IGMsIGxvY2FsZV90IGxvY2FsZSkKK3sKKyAgcmV0dXJuIF9feGlzbG93ZXIobG9jYWxlLCBjKTsKK30KK3N0YXRpYyBpbmxpbmUKK2ludCBpc3ByaW50X2woaW50IGMsIGxvY2FsZV90IGxvY2FsZSkKK3sKKyAgcmV0dXJuIF9feGlzcHJpbnQobG9jYWxlLCBjKTsKK30KKworc3RhdGljIGlubGluZQoraW50IGlzcHVuY3RfbChpbnQgYywgbG9jYWxlX3QgbG9jYWxlKQoreworICByZXR1cm4gX194aXNwdW5jdChsb2NhbGUsIGMpOworfQorc3RhdGljIGlubGluZQoraW50IGlzc3BhY2VfbChpbnQgYywgbG9jYWxlX3QgbG9jYWxlKQoreworICByZXR1cm4gX194aXNzcGFjZShsb2NhbGUsIGMpOworfQorc3RhdGljIGlubGluZQoraW50IGlzdXBwZXJfbChpbnQgYywgbG9jYWxlX3QgbG9jYWxlKQoreworICByZXR1cm4gX194aXN1cHBlcihsb2NhbGUsIGMpOworfQorCitzdGF0aWMgaW5saW5lCitpbnQgaXN4ZGlnaXRfbChpbnQgYywgbG9jYWxlX3QgbG9jYWxlKQoreworICByZXR1cm4gX194aXN4ZGlnaXQobG9jYWxlLCBjKTsKK30KKworc3RhdGljIGlubGluZQoraW50IGlzd2FsbnVtX2wod2NoYXJfdCB3YywgbG9jYWxlX3QgbG9jYWxlKQoreworICByZXR1cm4gX194aXN3YWxudW0obG9jYWxlLCB3Yyk7IAorfQorCitzdGF0aWMgaW5saW5lCitpbnQgaXN3YWxwaGFfbCh3Y2hhcl90IHdjLCBsb2NhbGVfdCBsb2NhbGUpCit7CisgIHJldHVybiBfX3hpc3dhbHBoYShsb2NhbGUsIHdjKTsKK30KKworc3RhdGljIGlubGluZQoraW50IGlzd2JsYW5rX2wod2NoYXJfdCB3YywgbG9jYWxlX3QgbG9jYWxlKQoreworICByZXR1cm4gX194aXN3YmxhbmsobG9jYWxlLCB3Yyk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK2ludCBpc3djbnRybF9sKHdjaGFyX3Qgd2MsIGxvY2FsZV90IGxvY2FsZSkKK3sKKyAgcmV0dXJuIF9feGlzd2NudHJsKGxvY2FsZSwgd2MpOworfQorCitzdGF0aWMgaW5saW5lCitpbnQgaXN3ZGlnaXRfbCh3Y2hhcl90IHdjLCBsb2NhbGVfdCBsb2NhbGUpCit7CisgIHJldHVybiBfX3hpc3dkaWdpdChsb2NhbGUsIHdjKTsKK30KKworc3RhdGljIGlubGluZQoraW50IGlzd2dyYXBoX2wod2NoYXJfdCB3YywgbG9jYWxlX3QgbG9jYWxlKQoreworICByZXR1cm4gX194aXN3Z3JhcGgobG9jYWxlLCB3Yyk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK2ludCBpc3dsb3dlcl9sKHdjaGFyX3Qgd2MsIGxvY2FsZV90IGxvY2FsZSkKK3sKKyAgcmV0dXJuIF9feGlzd2xvd2VyKGxvY2FsZSwgd2MpOworfQorCitzdGF0aWMgaW5saW5lCitpbnQgaXN3cHJpbnRfbCh3Y2hhcl90IHdjLCBsb2NhbGVfdCBsb2NhbGUpCit7CisgIHJldHVybiBfX3hpc3dwcmludChsb2NhbGUsIHdjKTsKK30KKworc3RhdGljIGlubGluZQoraW50IGlzd3B1bmN0X2wod2NoYXJfdCB3YywgbG9jYWxlX3QgbG9jYWxlKQoreworICByZXR1cm4gX194aXN3cHVuY3QobG9jYWxlLCB3Yyk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK2ludCBpc3dzcGFjZV9sKHdjaGFyX3Qgd2MsIGxvY2FsZV90IGxvY2FsZSkKK3sKKyAgcmV0dXJuIF9feGlzd3NwYWNlKGxvY2FsZSwgd2MpOworfQorCitzdGF0aWMgaW5saW5lCitpbnQgaXN3dXBwZXJfbCh3Y2hhcl90IHdjLCBsb2NhbGVfdCBsb2NhbGUpCit7CisgIHJldHVybiBfX3hpc3d1cHBlcihsb2NhbGUsIHdjKTsKK30KKworc3RhdGljIGlubGluZQoraW50IGlzd3hkaWdpdF9sKHdjaGFyX3Qgd2MsIGxvY2FsZV90IGxvY2FsZSkKK3sKKyAgcmV0dXJuIF9feGlzd3hkaWdpdChsb2NhbGUsIHdjKTsKK30KKworc3RhdGljIGlubGluZQoraW50IGlzd2N0eXBlX2wod2ludF90IHdjLCB3Y3R5cGVfdCBkZXNjLCBsb2NhbGVfdCBsb2NhbGUpCit7CisgIHJldHVybiBfX3hpc3djdHlwZShsb2NhbGUsIHdjLCBkZXNjKTsgCit9CisKK3N0YXRpYyBpbmxpbmUKK2ludCB0b3VwcGVyX2woaW50IGMsIGxvY2FsZV90IGxvY2FsZSkKK3sKKyAgcmV0dXJuIF9feHRvdXBwZXIobG9jYWxlLCBjKTsKK30KK3N0YXRpYyBpbmxpbmUKK2ludCB0b2xvd2VyX2woaW50IGMsIGxvY2FsZV90IGxvY2FsZSkKK3sKKyAgcmV0dXJuIF9feHRvbG93ZXIobG9jYWxlLCBjKTsKK30KK3N0YXRpYyBpbmxpbmUKK3dpbnRfdCB0b3d1cHBlcl9sKHdpbnRfdCB3YywgbG9jYWxlX3QgbG9jYWxlKQoreworICByZXR1cm4gX194dG93dXBwZXIobG9jYWxlLCB3Yyk7Cit9CitzdGF0aWMgaW5saW5lCit3aW50X3QgdG93bG93ZXJfbCh3aW50X3Qgd2MsIGxvY2FsZV90IGxvY2FsZSkKK3sKKyAgcmV0dXJuIF9feHRvd2xvd2VyKGxvY2FsZSwgd2MpOworfQorCitzdGF0aWMgaW5saW5lCitpbnQgc3RyY29sbF9sKGNvbnN0IGNoYXIgKl9fczEsIGNvbnN0IGNoYXIgKl9fczIsIGxvY2FsZV90IGxvY2FsZSkKK3sKKyAgcmV0dXJuIF9feHN0cmNvbGwobG9jYWxlLCBfX3MxLCBfX3MyKTsKK30KK3N0YXRpYyBpbmxpbmUKK2ludCB3Y3Njb2xsX2woY29uc3Qgd2NoYXJfdCAqX19zMSwgY29uc3Qgd2NoYXJfdCAqX19zMiwgbG9jYWxlX3QgbG9jYWxlKQoreworICByZXR1cm4gX194d2NzY29sbChsb2NhbGUsIF9fczEsIF9fczIpOworfQorc3RhdGljIGlubGluZQorc2l6ZV90IHN0cnhmcm1fbChjaGFyICpfX3MxLCBjb25zdCBjaGFyICpfX3MyLCBzaXplX3QgX19uLCBsb2NhbGVfdCBsb2NhbGUpCit7CisgIHJldHVybiBfX3hzdHJ4ZnJtKGxvY2FsZSwgX19zMSwgX19zMiwgX19uKTsKK30KKworc3RhdGljIGlubGluZQorc2l6ZV90IHdjc3hmcm1fbCh3Y2hhcl90ICpfX3dzMSwgY29uc3Qgd2NoYXJfdCAqX193czIsIHNpemVfdCBfX24sCisgICAgbG9jYWxlX3QgbG9jYWxlKQoreworICByZXR1cm4gX194d2NzeGZybShsb2NhbGUsIF9fd3MxLCBfX3dzMiwgX19uKTsKK30KKyNlbmRpZiAvLyAhZGVmaW5lZChfQUlYNzEpCisKKy8vIHN0cmZ0aW1lX2woKSBpcyBkZWZpbmVkIGJ5IFBPU0lYLiBIb3dldmVyLCBBSVggNy4xIGRvZXMgbm90IGhhdmUgaXQKKy8vIGltcGxlbWVudGVkIHlldC4KK3N0YXRpYyBpbmxpbmUKK3NpemVfdCBzdHJmdGltZV9sKGNoYXIgKl9fcywgc2l6ZV90IF9fc2l6ZSwgY29uc3QgY2hhciAqX19mbXQsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdG0gKl9fdG0sIGxvY2FsZV90IGxvY2FsZSkgeworICByZXR1cm4gX194c3RyZnRpbWUobG9jYWxlLCBfX3MsIF9fc2l6ZSwgX19mbXQsIF9fdG0pOworfQorCisvLyBUaGUgZm9sbG93aW5nIGFyZSBub3QgUE9TSVggcm91dGluZXMuICBUaGVzZSBhcmUgcXVpY2stYW5kLWRpcnR5IGhhY2tzCisvLyB0byBtYWtlIHRoaW5ncyBwcmV0ZW5kIHRvIHdvcmsKK3N0YXRpYyBpbmxpbmUKK2xvbmcgbG9uZyBzdHJ0b2xsX2woY29uc3QgY2hhciAqX19ucHRyLCBjaGFyICoqX19lbmRwdHIsCisgICAgaW50IF9fYmFzZSwgbG9jYWxlX3QgbG9jYWxlKSB7CisgIHJldHVybiBzdHJ0b2xsKF9fbnB0ciwgX19lbmRwdHIsIF9fYmFzZSk7Cit9CitzdGF0aWMgaW5saW5lCitsb25nIHN0cnRvbF9sKGNvbnN0IGNoYXIgKl9fbnB0ciwgY2hhciAqKl9fZW5kcHRyLAorICAgIGludCBfX2Jhc2UsIGxvY2FsZV90IGxvY2FsZSkgeworICByZXR1cm4gc3RydG9sKF9fbnB0ciwgX19lbmRwdHIsIF9fYmFzZSk7Cit9CitzdGF0aWMgaW5saW5lCitsb25nIGRvdWJsZSBzdHJ0b2xkX2woY29uc3QgY2hhciAqX19ucHRyLCBjaGFyICoqX19lbmRwdHIsCisgICAgbG9jYWxlX3QgbG9jYWxlKSB7CisgIHJldHVybiBzdHJ0b2xkKF9fbnB0ciwgX19lbmRwdHIpOworfQorc3RhdGljIGlubGluZQordW5zaWduZWQgbG9uZyBsb25nIHN0cnRvdWxsX2woY29uc3QgY2hhciAqX19ucHRyLCBjaGFyICoqX19lbmRwdHIsCisgICAgaW50IF9fYmFzZSwgbG9jYWxlX3QgbG9jYWxlKSB7CisgIHJldHVybiBzdHJ0b3VsbChfX25wdHIsIF9fZW5kcHRyLCBfX2Jhc2UpOworfQorc3RhdGljIGlubGluZQordW5zaWduZWQgbG9uZyBzdHJ0b3VsX2woY29uc3QgY2hhciAqX19ucHRyLCBjaGFyICoqX19lbmRwdHIsCisgICAgaW50IF9fYmFzZSwgbG9jYWxlX3QgbG9jYWxlKSB7CisgIHJldHVybiBzdHJ0b3VsKF9fbnB0ciwgX19lbmRwdHIsIF9fYmFzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK2ludCB2YXNwcmludGYoY2hhciAqKnN0cnAsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKyAgY29uc3Qgc2l6ZV90IGJ1ZmZfc2l6ZSA9IDI1NjsKKyAgaW50IHN0cl9zaXplOworICBpZiAoKCpzdHJwID0gKGNoYXIgKiltYWxsb2MoYnVmZl9zaXplKSkgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoKHN0cl9zaXplID0gdnNucHJpbnRmKCpzdHJwLCBidWZmX3NpemUsIGZtdCwgIGFwKSkgPj0gYnVmZl9zaXplKQorICB7CisgICAgaWYgKCgqc3RycCA9IChjaGFyICopcmVhbGxvYygqc3RycCwgc3RyX3NpemUgKyAxKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHN0cl9zaXplID0gdnNucHJpbnRmKCpzdHJwLCBzdHJfc2l6ZSArIDEsIGZtdCwgIGFwKTsKKyAgfQorICByZXR1cm4gc3RyX3NpemU7Cit9ICAKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvLyBkZWZpbmVkKF9BSVgpCisjZW5kaWYgLy8gX0xJQkNQUF9TVVBQT1JUX0lCTV9YTE9DQUxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdXBwb3J0L211c2wveGxvY2FsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvbXVzbC94bG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzMWM5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdXBwb3J0L211c2wveGxvY2FsZS5oCkBAIC0wLDAgKzEsNTggQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0gc3VwcG9ydC9tdXNsL3hsb2NhbGUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGhpcyBhZGRzIHN1cHBvcnQgZm9yIHRoZSBleHRlbmRlZCBsb2NhbGUgZnVuY3Rpb25zIHRoYXQgYXJlIGN1cnJlbnRseQorLy8gbWlzc2luZyBmcm9tIHRoZSBNdXNsIEMgbGlicmFyeS4KKy8vCisvLyBUaGlzIG9ubHkgd29ya3Mgd2hlbiB0aGUgc3BlY2lmaWVkIGxvY2FsZSBpcyAiQyIgb3IgIlBPU0lYIiwgYnV0IHRoYXQncworLy8gYWJvdXQgYXMgZ29vZCBhcyB3ZSBjYW4gZG8gd2l0aG91dCBpbXBsZW1lbnRpbmcgZnVsbCB4bG9jYWxlIHN1cHBvcnQKKy8vIGluIE11c2wuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfU1VQUE9SVF9NVVNMX1hMT0NBTEVfSAorI2RlZmluZSBfTElCQ1BQX1NVUFBPUlRfTVVTTF9YTE9DQUxFX0gKKworI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3djaGFyPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgbG9uZyBsb25nIHN0cnRvbGxfbChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVfdCkgeworICByZXR1cm4gc3RydG9sbChucHRyLCBlbmRwdHIsIGJhc2UpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBzdHJ0b3VsbF9sKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiYXNlLCBsb2NhbGVfdCkgeworICByZXR1cm4gc3RydG91bGwobnB0ciwgZW5kcHRyLCBiYXNlKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIGxvbmcgd2NzdG9sbF9sKGNvbnN0IHdjaGFyX3QgKm5wdHIsIHdjaGFyX3QgKiplbmRwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhc2UsIGxvY2FsZV90KSB7CisgIHJldHVybiB3Y3N0b2xsKG5wdHIsIGVuZHB0ciwgYmFzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIHdjc3RvdWxsX2woY29uc3Qgd2NoYXJfdCAqbnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCAqKmVuZHB0ciwgaW50IGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZV90KSB7CisgIHJldHVybiB3Y3N0b3VsbChucHRyLCBlbmRwdHIsIGJhc2UpOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgZG91YmxlIHdjc3RvbGRfbChjb25zdCB3Y2hhcl90ICpucHRyLCB3Y2hhcl90ICoqZW5kcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlX3QpIHsKKyAgcmV0dXJuIHdjc3RvbGQobnB0ciwgZW5kcHRyKTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8vIF9MSUJDUFBfU1VQUE9SVF9NVVNMX1hMT0NBTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvbmV3bGliL3hsb2NhbGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdXBwb3J0L25ld2xpYi94bG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3ZTliNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdXBwb3J0L25ld2xpYi94bG9jYWxlLmgKQEAgLTAsMCArMSwyOCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX1NVUFBPUlRfTkVXTElCX1hMT0NBTEVfSAorI2RlZmluZSBfTElCQ1BQX1NVUFBPUlRfTkVXTElCX1hMT0NBTEVfSAorCisjaWYgZGVmaW5lZChfTkVXTElCX1ZFUlNJT04pCisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNsb2NhbGU+CisjaW5jbHVkZSA8Y3djdHlwZT4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2lmICFkZWZpbmVkKF9fTkVXTElCX18pIHx8IF9fTkVXTElCX18gPCAyIHx8IFwKKyAgICBfX05FV0xJQl9fID09IDIgJiYgX19ORVdMSUJfTUlOT1JfXyA8IDUKKyNpbmNsdWRlIDxzdXBwb3J0L3hsb2NhbGUvX19ub3BfbG9jYWxlX21nbXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN1cHBvcnQveGxvY2FsZS9fX3Bvc2l4X2xfZmFsbGJhY2suaD4KKyNpbmNsdWRlIDxzdXBwb3J0L3hsb2NhbGUvX19zdHJ0b251bV9mYWxsYmFjay5oPgorCisjZW5kaWYgLy8gX05FV0xJQl9WRVJTSU9OCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvc29sYXJpcy9mbG9hdGluZ3BvaW50LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3VwcG9ydC9zb2xhcmlzL2Zsb2F0aW5ncG9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTlkMTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvc29sYXJpcy9mbG9hdGluZ3BvaW50LmgKQEAgLTAsMCArMSwxNCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBhdG9mIHN1bl9hdG9mCisjZGVmaW5lIHN0cnRvZCBzdW5fc3RydG9kCisjaW5jbHVkZV9uZXh0ICJmbG9hdGluZ3BvaW50LmgiCisjdW5kZWYgYXRvZgorI3VuZGVmIHN0cnRvZApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvc29sYXJpcy93Y2hhci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvc29sYXJpcy93Y2hhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOGU2NjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3VwcG9ydC9zb2xhcmlzL3djaGFyLmgKQEAgLTAsMCArMSw0NyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBpc3dhbHBoYSBzdW5faXN3YWxwaGEKKyNkZWZpbmUgaXN3dXBwZXIgc3VuX2lzd3VwcGVyCisjZGVmaW5lIGlzd2xvd2VyIHN1bl9pc3dsb3dlcgorI2RlZmluZSBpc3dkaWdpdCBzdW5faXN3ZGlnaXQKKyNkZWZpbmUgaXN3eGRpZ2l0IHN1bl9pc3d4ZGlnaXQKKyNkZWZpbmUgaXN3YWxudW0gc3VuX2lzd2FsbnVtCisjZGVmaW5lIGlzd3NwYWNlIHN1bl9pc3dzcGFjZQorI2RlZmluZSBpc3dwdW5jdCBzdW5faXN3cHVuY3QKKyNkZWZpbmUgaXN3cHJpbnQgc3VuX2lzd3ByaW50CisjZGVmaW5lIGlzd2dyYXBoIHN1bl9pc3dncmFwaAorI2RlZmluZSBpc3djbnRybCBzdW5faXN3Y250cmwKKyNkZWZpbmUgaXN3Y3R5cGUgc3VuX2lzd2N0eXBlCisjZGVmaW5lIHRvd2xvd2VyIHN1bl90b3dsb3dlcgorI2RlZmluZSB0b3d1cHBlciBzdW5fdG93dXBwZXIKKyNkZWZpbmUgd2Nzd2NzIHN1bl93Y3N3Y3MKKyNkZWZpbmUgd2Nzd2lkdGggc3VuX3djc3dpZHRoCisjZGVmaW5lIHdjd2lkdGggc3VuX3djd2lkdGgKKyNkZWZpbmUgd2N0eXBlIHN1bl93Y3R5cGUKKyNkZWZpbmUgX1dDSEFSX1QgMQorI2luY2x1ZGVfbmV4dCAid2NoYXIuaCIKKyN1bmRlZiBpc3dhbHBoYSAKKyN1bmRlZiBpc3d1cHBlcgorI3VuZGVmIGlzd2xvd2VyCisjdW5kZWYgaXN3ZGlnaXQKKyN1bmRlZiBpc3d4ZGlnaXQKKyN1bmRlZiBpc3dhbG51bQorI3VuZGVmIGlzd3NwYWNlCisjdW5kZWYgaXN3cHVuY3QKKyN1bmRlZiBpc3dwcmludAorI3VuZGVmIGlzd2dyYXBoCisjdW5kZWYgaXN3Y250cmwKKyN1bmRlZiBpc3djdHlwZQorI3VuZGVmIHRvd2xvd2VyCisjdW5kZWYgdG93dXBwZXIKKyN1bmRlZiB3Y3N3Y3MKKyN1bmRlZiB3Y3N3aWR0aAorI3VuZGVmIHdjd2lkdGgKKyN1bmRlZiB3Y3R5cGUKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdXBwb3J0L3NvbGFyaXMveGxvY2FsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvc29sYXJpcy94bG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwZWY3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdXBwb3J0L3NvbGFyaXMveGxvY2FsZS5oCkBAIC0wLDAgKzEsNzcgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNaW5pbWFsIHhsb2NhbGUgaW1wbGVtZW50YXRpb24gZm9yIFNvbGFyaXMuICBUaGlzIGltcGxlbWVudHMgdGhlIHN1YnNldCBvZgorLy8gdGhlIHhsb2NhbGUgQVBJcyB0aGF0IGxpYmMrKyBkZXBlbmRzIG9uLgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNpZm5kZWYgX19YTE9DQUxFX0hfSU5DTFVERUQKKyNkZWZpbmUgX19YTE9DQUxFX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworaW50IHNucHJpbnRmX2woY2hhciAqX19zLCBzaXplX3QgX19uLCBsb2NhbGVfdCBfX2wsIGNvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pOworaW50IGFzcHJpbnRmX2woY2hhciAqKl9fcywgbG9jYWxlX3QgX19sLCBjb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKTsKKworaW50IHNzY2FuZl9sKGNvbnN0IGNoYXIgKl9fcywgbG9jYWxlX3QgX19sLCBjb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKTsKKworaW50IHRvdXBwZXJfbChpbnQgX19jLCBsb2NhbGVfdCBfX2wpOworaW50IHRvbG93ZXJfbChpbnQgX19jLCBsb2NhbGVfdCBfX2wpOworCitzdHJ1Y3QgbGNvbnYgKmxvY2FsZWNvbnYodm9pZCk7CitzdHJ1Y3QgbGNvbnYgKmxvY2FsZWNvbnZfbChsb2NhbGVfdCBfX2wpOworCisvLyBGSVhNRTogVGhlc2UgYXJlIHF1aWNrLWFuZC1kaXJ0eSBoYWNrcyB0byBtYWtlIHRoaW5ncyBwcmV0ZW5kIHRvIHdvcmsKK3N0YXRpYyBpbmxpbmUKK2xvbmcgbG9uZyBzdHJ0b2xsX2woY29uc3QgY2hhciAqX19ucHRyLCBjaGFyICoqX19lbmRwdHIsCisgICAgaW50IF9fYmFzZSwgbG9jYWxlX3QgX19sb2MpIHsKKyAgcmV0dXJuIHN0cnRvbGwoX19ucHRyLCBfX2VuZHB0ciwgX19iYXNlKTsKK30KK3N0YXRpYyBpbmxpbmUKK2xvbmcgc3RydG9sX2woY29uc3QgY2hhciAqX19ucHRyLCBjaGFyICoqX19lbmRwdHIsCisgICAgaW50IF9fYmFzZSwgbG9jYWxlX3QgX19sb2MpIHsKKyAgcmV0dXJuIHN0cnRvbChfX25wdHIsIF9fZW5kcHRyLCBfX2Jhc2UpOworfQorc3RhdGljIGlubGluZQordW5zaWduZWQgbG9uZyBsb25nIHN0cnRvdWxsX2woY29uc3QgY2hhciAqX19ucHRyLCBjaGFyICoqX19lbmRwdHIsCisgICAgaW50IF9fYmFzZSwgbG9jYWxlX3QgX19sb2MpIHsKKyAgcmV0dXJuIHN0cnRvdWxsKF9fbnB0ciwgX19lbmRwdHIsIF9fYmFzZSk7Cit9CitzdGF0aWMgaW5saW5lCit1bnNpZ25lZCBsb25nIHN0cnRvdWxfbChjb25zdCBjaGFyICpfX25wdHIsIGNoYXIgKipfX2VuZHB0ciwKKyAgICBpbnQgX19iYXNlLCBsb2NhbGVfdCBfX2xvYykgeworICByZXR1cm4gc3RydG91bChfX25wdHIsIF9fZW5kcHRyLCBfX2Jhc2UpOworfQorc3RhdGljIGlubGluZQorZmxvYXQgc3RydG9mX2woY29uc3QgY2hhciAqX19ucHRyLCBjaGFyICoqX19lbmRwdHIsCisgICAgbG9jYWxlX3QgX19sb2MpIHsKKyAgcmV0dXJuIHN0cnRvZihfX25wdHIsIF9fZW5kcHRyKTsKK30KK3N0YXRpYyBpbmxpbmUKK2RvdWJsZSBzdHJ0b2RfbChjb25zdCBjaGFyICpfX25wdHIsIGNoYXIgKipfX2VuZHB0ciwKKyAgICBsb2NhbGVfdCBfX2xvYykgeworICByZXR1cm4gc3RydG9kKF9fbnB0ciwgX19lbmRwdHIpOworfQorc3RhdGljIGlubGluZQorbG9uZyBkb3VibGUgc3RydG9sZF9sKGNvbnN0IGNoYXIgKl9fbnB0ciwgY2hhciAqKl9fZW5kcHRyLAorICAgIGxvY2FsZV90IF9fbG9jKSB7CisgIHJldHVybiBzdHJ0b2xkKF9fbnB0ciwgX19lbmRwdHIpOworfQorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvd2luMzIvbGltaXRzX21zdmNfd2luMzIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdXBwb3J0L3dpbjMyL2xpbWl0c19tc3ZjX3dpbjMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFiMmUwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdXBwb3J0L3dpbjMyL2xpbWl0c19tc3ZjX3dpbjMyLmgKQEAgLTAsMCArMSw3MiBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tIHN1cHBvcnQvd2luMzIvbGltaXRzX21zdmNfd2luMzIuaCAtLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9TVVBQT1JUX1dJTjMyX0xJTUlUU19NU1ZDX1dJTjMyX0gKKyNkZWZpbmUgX0xJQkNQUF9TVVBQT1JUX1dJTjMyX0xJTUlUU19NU1ZDX1dJTjMyX0gKKworI2lmICFkZWZpbmVkKF9MSUJDUFBfTVNWQ1JUKQorI2Vycm9yICJUaGlzIGhlYWRlciBjb21wbGVtZW50cyB0aGUgTWljcm9zb2Z0IEMgUnVudGltZSBsaWJyYXJ5LCBhbmQgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBvdGhlcndpc2UuIgorI2VuZGlmCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisjZXJyb3IgIlRoaXMgaGVhZGVyIHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIHdoZW4gdXNpbmcgTWljcm9zb2Z0cyBDMVhYIGZyb250ZW5kIgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4gLy8gQ0hBUl9CSVQKKyNpbmNsdWRlIDxmbG9hdC5oPiAvLyBsaW1pdCBjb25zdGFudHMKKyNpbmNsdWRlIDxtYXRoLmg+IC8vIEhVR0VfVkFMCisjaW5jbHVkZSA8eW1hdGguaD4gLy8gaW50ZXJuYWwgTVNWQyBoZWFkZXIgcHJvdmlkaW5nIHRoZSBuZWVkZWQgZnVuY3Rpb25hbGl0eQorCisjZGVmaW5lIF9fQ0hBUl9CSVRfXyAgICAgICBDSEFSX0JJVAorCisjZGVmaW5lIF9fRkxUX01BTlRfRElHX18gICBGTFRfTUFOVF9ESUcKKyNkZWZpbmUgX19GTFRfRElHX18gICAgICAgIEZMVF9ESUcKKyNkZWZpbmUgX19GTFRfUkFESVhfXyAgICAgIEZMVF9SQURJWAorI2RlZmluZSBfX0ZMVF9NSU5fRVhQX18gICAgRkxUX01JTl9FWFAKKyNkZWZpbmUgX19GTFRfTUlOXzEwX0VYUF9fIEZMVF9NSU5fMTBfRVhQCisjZGVmaW5lIF9fRkxUX01BWF9FWFBfXyAgICBGTFRfTUFYX0VYUAorI2RlZmluZSBfX0ZMVF9NQVhfMTBfRVhQX18gRkxUX01BWF8xMF9FWFAKKyNkZWZpbmUgX19GTFRfTUlOX18gICAgICAgIEZMVF9NSU4KKyNkZWZpbmUgX19GTFRfTUFYX18gICAgICAgIEZMVF9NQVgKKyNkZWZpbmUgX19GTFRfRVBTSUxPTl9fICAgIEZMVF9FUFNJTE9OCisvLyBwcmVkZWZpbmVkIGJ5IE1pbkdXIEdDQworI2RlZmluZSBfX0ZMVF9ERU5PUk1fTUlOX18gMS40MDEyOTg0NjQzMjQ4MTcwNzA5MmUtNDVGCisKKyNkZWZpbmUgX19EQkxfTUFOVF9ESUdfXyAgIERCTF9NQU5UX0RJRworI2RlZmluZSBfX0RCTF9ESUdfXyAgICAgICAgREJMX0RJRworI2RlZmluZSBfX0RCTF9SQURJWF9fICAgICAgREJMX1JBRElYCisjZGVmaW5lIF9fREJMX01JTl9FWFBfXyAgICBEQkxfTUlOX0VYUAorI2RlZmluZSBfX0RCTF9NSU5fMTBfRVhQX18gREJMX01JTl8xMF9FWFAKKyNkZWZpbmUgX19EQkxfTUFYX0VYUF9fICAgIERCTF9NQVhfRVhQCisjZGVmaW5lIF9fREJMX01BWF8xMF9FWFBfXyBEQkxfTUFYXzEwX0VYUAorI2RlZmluZSBfX0RCTF9NSU5fXyAgICAgICAgREJMX01JTgorI2RlZmluZSBfX0RCTF9NQVhfXyAgICAgICAgREJMX01BWAorI2RlZmluZSBfX0RCTF9FUFNJTE9OX18gICAgREJMX0VQU0lMT04KKy8vIHByZWRlZmluZWQgYnkgTWluR1cgR0NDCisjZGVmaW5lIF9fREJMX0RFTk9STV9NSU5fXyBkb3VibGUoNC45NDA2NTY0NTg0MTI0NjU0NDE3N2UtMzI0TCkKKworI2RlZmluZSBfX0xEQkxfTUFOVF9ESUdfXyAgIExEQkxfTUFOVF9ESUcKKyNkZWZpbmUgX19MREJMX0RJR19fICAgICAgICBMREJMX0RJRworI2RlZmluZSBfX0xEQkxfUkFESVhfXyAgICAgIExEQkxfUkFESVgKKyNkZWZpbmUgX19MREJMX01JTl9FWFBfXyAgICBMREJMX01JTl9FWFAKKyNkZWZpbmUgX19MREJMX01JTl8xMF9FWFBfXyBMREJMX01JTl8xMF9FWFAKKyNkZWZpbmUgX19MREJMX01BWF9FWFBfXyAgICBMREJMX01BWF9FWFAKKyNkZWZpbmUgX19MREJMX01BWF8xMF9FWFBfXyBMREJMX01BWF8xMF9FWFAKKyNkZWZpbmUgX19MREJMX01JTl9fICAgICAgICBMREJMX01JTgorI2RlZmluZSBfX0xEQkxfTUFYX18gICAgICAgIExEQkxfTUFYCisjZGVmaW5lIF9fTERCTF9FUFNJTE9OX18gICAgTERCTF9FUFNJTE9OCisvLyBwcmVkZWZpbmVkIGJ5IE1pbkdXIEdDQworI2RlZmluZSBfX0xEQkxfREVOT1JNX01JTl9fIDMuNjQ1MTk5NTMxODgyNDc0NjAyNTNlLTQ5NTFMCisKKy8vIF9fYnVpbHRpbiByZXBsYWNlbWVudHMvd29ya2Fyb3VuZHMKKyNkZWZpbmUgX19idWlsdGluX2h1Z2VfdmFsbCgpICAgIF9MSW5mLl9Mb25nX2RvdWJsZQorI2RlZmluZSBfX2J1aWx0aW5fbmFubChfX2R1bW1teSkgX0xOYW4uX0xvbmdfZG91YmxlCisjZGVmaW5lIF9fYnVpbHRpbl9uYW5zbChfX2R1bW15KSBfTFNuYW4uX0xvbmdfZG91YmxlCisKKyNlbmRpZiAvLyBfTElCQ1BQX1NVUFBPUlRfV0lOMzJfTElNSVRTX01TVkNfV0lOMzJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvd2luMzIvbG9jYWxlX3dpbjMyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3VwcG9ydC93aW4zMi9sb2NhbGVfd2luMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWJmZmYyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQvd2luMzIvbG9jYWxlX3dpbjMyLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdXBwb3J0L3dpbjMyL2xvY2FsZV93aW4zMi5oIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfU1VQUE9SVF9XSU4zMl9MT0NBTEVfV0lOMzJfSAorI2RlZmluZSBfTElCQ1BQX1NVUFBPUlRfV0lOMzJfTE9DQUxFX1dJTjMyX0gKKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8eGxvY2luZm8uaD4gLy8gX2xvY2FsZV90CisjaW5jbHVkZSA8X19udWxscHRyPgorCisjZGVmaW5lIExDX0NPTExBVEVfTUFTSyBfTV9DT0xMQVRFCisjZGVmaW5lIExDX0NUWVBFX01BU0sgX01fQ1RZUEUKKyNkZWZpbmUgTENfTU9ORVRBUllfTUFTSyBfTV9NT05FVEFSWQorI2RlZmluZSBMQ19OVU1FUklDX01BU0sgX01fTlVNRVJJQworI2RlZmluZSBMQ19USU1FX01BU0sgX01fVElNRQorI2RlZmluZSBMQ19NRVNTQUdFU19NQVNLIF9NX01FU1NBR0VTCisjZGVmaW5lIExDX0FMTF9NQVNLICggIExDX0NPTExBVEVfTUFTSyBcCisgICAgICAgICAgICAgICAgICAgICB8IExDX0NUWVBFX01BU0sgXAorICAgICAgICAgICAgICAgICAgICAgfCBMQ19NRVNTQUdFU19NQVNLIFwKKyAgICAgICAgICAgICAgICAgICAgIHwgTENfTU9ORVRBUllfTUFTSyBcCisgICAgICAgICAgICAgICAgICAgICB8IExDX05VTUVSSUNfTUFTSyBcCisgICAgICAgICAgICAgICAgICAgICB8IExDX1RJTUVfTUFTSyApCisKK2NsYXNzIGxvY2FsZV90IHsKK3B1YmxpYzoKKyAgICBsb2NhbGVfdCgpCisgICAgICAgIDogX19sb2NhbGUobnVsbHB0ciksIF9fbG9jYWxlX3N0cihudWxscHRyKSB7fQorICAgIGxvY2FsZV90KHN0ZDo6bnVsbHB0cl90KQorICAgICAgICA6IF9fbG9jYWxlKG51bGxwdHIpLCBfX2xvY2FsZV9zdHIobnVsbHB0cikge30KKyAgICBsb2NhbGVfdChfbG9jYWxlX3QgX19sb2NhbGUsIGNvbnN0IGNoYXIqIF9fbG9jYWxlX3N0cikKKyAgICAgICAgOiBfX2xvY2FsZShfX2xvY2FsZSksIF9fbG9jYWxlX3N0cihfX2xvY2FsZV9zdHIpIHt9CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGxvY2FsZV90JiBfX2xlZnQsIGNvbnN0IGxvY2FsZV90JiBfX3JpZ2h0KSB7CisgICAgICAgIHJldHVybiBfX2xlZnQuX19sb2NhbGUgPT0gX19yaWdodC5fX2xvY2FsZTsKKyAgICB9CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGxvY2FsZV90JiBfX2xlZnQsIGludCBfX3JpZ2h0KSB7CisgICAgICAgIHJldHVybiBfX2xlZnQuX19sb2NhbGUgPT0gbnVsbHB0ciAmJiBfX3JpZ2h0ID09IDA7CisgICAgfQorCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBsb2NhbGVfdCYgX19sZWZ0LCBzdGQ6Om51bGxwdHJfdCkgeworICAgICAgICByZXR1cm4gX19sZWZ0Ll9fbG9jYWxlID09IG51bGxwdHI7CisgICAgfQorCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShpbnQgX19sZWZ0LCBjb25zdCBsb2NhbGVfdCYgX19yaWdodCkgeworICAgICAgICByZXR1cm4gX19sZWZ0ID09IDAgJiYgbnVsbHB0ciA9PSBfX3JpZ2h0Ll9fbG9jYWxlOworICAgIH0KKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oc3RkOjpudWxscHRyX3QsIGNvbnN0IGxvY2FsZV90JiBfX3JpZ2h0KSB7CisgICAgICAgIHJldHVybiBudWxscHRyID09IF9fcmlnaHQuX19sb2NhbGU7CisgICAgfQorCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBsb2NhbGVfdCYgX19sZWZ0LCBjb25zdCBsb2NhbGVfdCYgX19yaWdodCkgeworICAgICAgICByZXR1cm4gIShfX2xlZnQgPT0gX19yaWdodCk7CisgICAgfQorCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBsb2NhbGVfdCYgX19sZWZ0LCBpbnQgX19yaWdodCkgeworICAgICAgICByZXR1cm4gIShfX2xlZnQgPT0gX19yaWdodCk7CisgICAgfQorCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBsb2NhbGVfdCYgX19sZWZ0LCBzdGQ6Om51bGxwdHJfdCBfX3JpZ2h0KSB7CisgICAgICAgIHJldHVybiAhKF9fbGVmdCA9PSBfX3JpZ2h0KTsKKyAgICB9CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGludCBfX2xlZnQsIGNvbnN0IGxvY2FsZV90JiBfX3JpZ2h0KSB7CisgICAgICAgIHJldHVybiAhKF9fbGVmdCA9PSBfX3JpZ2h0KTsKKyAgICB9CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KHN0ZDo6bnVsbHB0cl90IF9fbGVmdCwgY29uc3QgbG9jYWxlX3QmIF9fcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuICEoX19sZWZ0ID09IF9fcmlnaHQpOworICAgIH0KKworICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfX2xvY2FsZSAhPSBudWxscHRyOworICAgIH0KKworICAgIGNvbnN0IGNoYXIqIF9fZ2V0X2xvY2FsZSgpIGNvbnN0IHsgcmV0dXJuIF9fbG9jYWxlX3N0cjsgfQorCisgICAgb3BlcmF0b3IgX2xvY2FsZV90KCkgY29uc3QgeworICAgICAgICByZXR1cm4gX19sb2NhbGU7CisgICAgfQorcHJpdmF0ZToKKyAgICBfbG9jYWxlX3QgX19sb2NhbGU7CisgICAgY29uc3QgY2hhciogX19sb2NhbGVfc3RyOworfTsKKworLy8gTG9jYWxlIG1hbmFnZW1lbnQgZnVuY3Rpb25zCisjZGVmaW5lIGZyZWVsb2NhbGUgX2ZyZWVfbG9jYWxlCisvLyBGSVhNRTogYmFzZSBjdXJyZW50bHkgdW51c2VkLiBOZWVkcyBtYW51YWwgd29yayB0byBjb25zdHJ1Y3QgdGhlIG5ldyBsb2NhbGUKK2xvY2FsZV90IG5ld2xvY2FsZSggaW50IG1hc2ssIGNvbnN0IGNoYXIgKiBsb2NhbGUsIGxvY2FsZV90IGJhc2UgKTsKKy8vIHVzZWxvY2FsZSBjYW4ndCBiZSBpbXBsZW1lbnRlZCBvbiBXaW5kb3dzIGJlY2F1c2UgV2luZG93cyBhbGxvd3MgcGFydGlhbCBtb2RpZmljYXRpb24KKy8vIG9mIHRocmVhZC1sb2NhbCBsb2NhbGUgYW5kIHNvIF9nZXRfY3VycmVudF9sb2NhbGUoKSByZXR1cm5zIGEgY29weSB3aGlsZSB1c2Vsb2NhbGUgZG9lcworLy8gbm90IGNyZWF0ZSBhbnkgY29waWVzLgorLy8gV2UgY2FuIHN0aWxsIGltcGxlbWVudCByYWlpIGV2ZW4gd2l0aG91dCB1c2Vsb2NhbGUgdGhvdWdoLgorCisKK2xjb252ICpsb2NhbGVjb252X2woIGxvY2FsZV90IGxvYyApOworc2l6ZV90IG1icmxlbl9sKCBjb25zdCBjaGFyICpfX3Jlc3RyaWN0IHMsIHNpemVfdCBuLAorICAgICAgICAgICAgICAgICBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgcHMsIGxvY2FsZV90IGxvYyk7CitzaXplX3QgbWJzcnRvd2NzX2woIHdjaGFyX3QgKl9fcmVzdHJpY3QgZHN0LCBjb25zdCBjaGFyICoqX19yZXN0cmljdCBzcmMsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBwcywgbG9jYWxlX3QgbG9jICk7CitzaXplX3Qgd2NydG9tYl9sKCBjaGFyICpfX3Jlc3RyaWN0IHMsIHdjaGFyX3Qgd2MsIG1ic3RhdGVfdCAqX19yZXN0cmljdCBwcywKKyAgICAgICAgICAgICAgICAgIGxvY2FsZV90IGxvYyk7CitzaXplX3QgbWJydG93Y19sKCB3Y2hhcl90ICpfX3Jlc3RyaWN0IHB3YywgY29uc3QgY2hhciAqX19yZXN0cmljdCBzLAorICAgICAgICAgICAgICAgICAgc2l6ZV90IG4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBwcywgbG9jYWxlX3QgbG9jKTsKK3NpemVfdCBtYnNucnRvd2NzX2woIHdjaGFyX3QgKl9fcmVzdHJpY3QgZHN0LCBjb25zdCBjaGFyICoqX19yZXN0cmljdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgbm1zLCBzaXplX3QgbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgcHMsIGxvY2FsZV90IGxvYyk7CitzaXplX3Qgd2NzbnJ0b21ic19sKCBjaGFyICpfX3Jlc3RyaWN0IGRzdCwgY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG53Yywgc2l6ZV90IGxlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IHBzLCBsb2NhbGVfdCBsb2MpOword2ludF90IGJ0b3djX2woIGludCBjLCBsb2NhbGVfdCBsb2MgKTsKK2ludCB3Y3RvYl9sKCB3aW50X3QgYywgbG9jYWxlX3QgbG9jICk7CisKK2RlY2x0eXBlKE1CX0NVUl9NQVgpIE1CX0NVUl9NQVhfTCggbG9jYWxlX3QgX19sICk7CisKKy8vIHRoZSAqX2wgZnVuY3Rpb25zIGFyZSBwcmVmaXhlZCBvbiBXaW5kb3dzLCBvbmx5IGF2YWlsYWJsZSBmb3IgbXN2Y3I4MCssIFZTMjAwNSsKKyNkZWZpbmUgbWJ0b3djX2wgX21idG93Y19sCisjZGVmaW5lIHN0cnRvbGxfbCBfc3RydG9pNjRfbAorI2RlZmluZSBzdHJ0b3VsbF9sIF9zdHJ0b3VpNjRfbAorI2RlZmluZSBzdHJ0b2RfbCBfc3RydG9kX2wKKyNpZiBkZWZpbmVkKF9MSUJDUFBfTVNWQ1JUKQorI2RlZmluZSBzdHJ0b2ZfbCBfc3RydG9mX2wKKyNkZWZpbmUgc3RydG9sZF9sIF9zdHJ0b2xkX2wKKyNlbHNlCitmbG9hdCBzdHJ0b2ZfbChjb25zdCBjaGFyKiwgY2hhcioqLCBsb2NhbGVfdCk7Citsb25nIGRvdWJsZSBzdHJ0b2xkX2woY29uc3QgY2hhciosIGNoYXIqKiwgbG9jYWxlX3QpOworI2VuZGlmCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW50Citpc2xvd2VyX2woaW50IGMsIF9sb2NhbGVfdCBsb2MpCit7CisgcmV0dXJuIF9pc2xvd2VyX2woKGludCljLCBsb2MpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW50Citpc3VwcGVyX2woaW50IGMsIF9sb2NhbGVfdCBsb2MpCit7CisgcmV0dXJuIF9pc3VwcGVyX2woKGludCljLCBsb2MpOworfQorCisjZGVmaW5lIGlzZGlnaXRfbCBfaXNkaWdpdF9sCisjZGVmaW5lIGlzeGRpZ2l0X2wgX2lzeGRpZ2l0X2wKKyNkZWZpbmUgc3RyY29sbF9sIF9zdHJjb2xsX2wKKyNkZWZpbmUgc3RyeGZybV9sIF9zdHJ4ZnJtX2wKKyNkZWZpbmUgd2NzY29sbF9sIF93Y3Njb2xsX2wKKyNkZWZpbmUgd2NzeGZybV9sIF93Y3N4ZnJtX2wKKyNkZWZpbmUgdG91cHBlcl9sIF90b3VwcGVyX2wKKyNkZWZpbmUgdG9sb3dlcl9sIF90b2xvd2VyX2wKKyNkZWZpbmUgaXN3c3BhY2VfbCBfaXN3c3BhY2VfbAorI2RlZmluZSBpc3dwcmludF9sIF9pc3dwcmludF9sCisjZGVmaW5lIGlzd2NudHJsX2wgX2lzd2NudHJsX2wKKyNkZWZpbmUgaXN3dXBwZXJfbCBfaXN3dXBwZXJfbAorI2RlZmluZSBpc3dsb3dlcl9sIF9pc3dsb3dlcl9sCisjZGVmaW5lIGlzd2FscGhhX2wgX2lzd2FscGhhX2wKKyNkZWZpbmUgaXN3ZGlnaXRfbCBfaXN3ZGlnaXRfbAorI2RlZmluZSBpc3dwdW5jdF9sIF9pc3dwdW5jdF9sCisjZGVmaW5lIGlzd3hkaWdpdF9sIF9pc3d4ZGlnaXRfbAorI2RlZmluZSB0b3d1cHBlcl9sIF90b3d1cHBlcl9sCisjZGVmaW5lIHRvd2xvd2VyX2wgX3Rvd2xvd2VyX2wKKyNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKSAmJiBfX01TVkNSVF9WRVJTSU9OX18gPCAweDA4MDAKKyNkZWZpbmUgc3RyZnRpbWVfbCggX19zLCBfX2wsIF9fZiwgX190bSwgX19sb2MgKSBzdHJmdGltZSggX19zLCBfX2wsIF9fZiwgX190bSApCisjZWxzZQorI2RlZmluZSBzdHJmdGltZV9sIF9zdHJmdGltZV9sCisjZW5kaWYKKyNkZWZpbmUgc3NjYW5mX2woIF9fcywgX19sLCBfX2YsIC4uLikgX3NzY2FuZl9sKCBfX3MsIF9fZiwgX19sLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIHNwcmludGZfbCggX19zLCBfX2wsIF9fZiwgLi4uICkgX3NwcmludGZfbCggX19zLCBfX2YsIF9fbCwgX19WQV9BUkdTX18gKQorI2RlZmluZSB2c3ByaW50Zl9sKCBfX3MsIF9fbCwgX19mLCAuLi4gKSBfdnNwcmludGZfbCggX19zLCBfX2YsIF9fbCwgX19WQV9BUkdTX18gKQorI2RlZmluZSB2c25wcmludGZfbCggX19zLCBfX24sIF9fbCwgX19mLCAuLi4gKSBfdnNucHJpbnRmX2woIF9fcywgX19uLCBfX2YsIF9fbCwgX19WQV9BUkdTX18gKQorX0xJQkNQUF9GVU5DX1ZJUyBpbnQgc25wcmludGZfbChjaGFyICpyZXQsIHNpemVfdCBuLCBsb2NhbGVfdCBsb2MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKK19MSUJDUFBfRlVOQ19WSVMgaW50IGFzcHJpbnRmX2woIGNoYXIgKipyZXQsIGxvY2FsZV90IGxvYywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4gKTsKK19MSUJDUFBfRlVOQ19WSVMgaW50IHZhc3ByaW50Zl9sKCBjaGFyICoqcmV0LCBsb2NhbGVfdCBsb2MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCApOworCisvLyBub3Qtc28tcHJlc3NpbmcgRklYTUU6IHVzZSBsb2NhbGUgdG8gZGV0ZXJtaW5lIGJsYW5rIGNoYXJhY3RlcnMKK2lubGluZSBpbnQgaXNibGFua19sKCBpbnQgYywgbG9jYWxlX3QgLypsb2MqLyApCit7CisgICAgcmV0dXJuICggYyA9PSAnICcgfHwgYyA9PSAnXHQnICk7Cit9CitpbmxpbmUgaW50IGlzd2JsYW5rX2woIHdpbnRfdCBjLCBsb2NhbGVfdCAvKmxvYyovICkKK3sKKyAgICByZXR1cm4gKCBjID09IEwnICcgfHwgYyA9PSBMJ1x0JyApOworfQorCisjZW5kaWYgLy8gX0xJQkNQUF9TVVBQT1JUX1dJTjMyX0xPQ0FMRV9XSU4zMl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3VwcG9ydC94bG9jYWxlL19fbm9wX2xvY2FsZV9tZ210LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3VwcG9ydC94bG9jYWxlL19fbm9wX2xvY2FsZV9tZ210LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzZjIzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdXBwb3J0L3hsb2NhbGUvX19ub3BfbG9jYWxlX21nbXQuaApAQCAtMCwwICsxLDUyIEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0gIHN1cHBvcnQveGxvY2FsZS9fX25vcF9sb2NhbGVfbWdtdC5oIC0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX1NVUFBPUlRfWExPQ0FMRV9OT1BfTE9DQUxFX01HTVRfSAorI2RlZmluZSBfTElCQ1BQX1NVUFBPUlRfWExPQ0FMRV9OT1BfTE9DQUxFX01HTVRfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIFBhdGNoIG92ZXIgbGFjayBvZiBleHRlbmRlZCBsb2NhbGUgc3VwcG9ydAordHlwZWRlZiB2b2lkICpsb2NhbGVfdDsKK3N0YXRpYyBpbmxpbmUgbG9jYWxlX3QgZHVwbG9jYWxlKGxvY2FsZV90KSB7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZWxvY2FsZShsb2NhbGVfdCkgeworfQorCitzdGF0aWMgaW5saW5lIGxvY2FsZV90IG5ld2xvY2FsZShpbnQsIGNvbnN0IGNoYXIgKiwgbG9jYWxlX3QpIHsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9jYWxlX3QgdXNlbG9jYWxlKGxvY2FsZV90KSB7CisgIHJldHVybiBOVUxMOworfQorCisjZGVmaW5lIExDX0NPTExBVEVfTUFTSyAgKDEgPDwgTENfQ09MTEFURSkKKyNkZWZpbmUgTENfQ1RZUEVfTUFTSyAgICAoMSA8PCBMQ19DVFlQRSkKKyNkZWZpbmUgTENfTUVTU0FHRVNfTUFTSyAoMSA8PCBMQ19NRVNTQUdFUykKKyNkZWZpbmUgTENfTU9ORVRBUllfTUFTSyAoMSA8PCBMQ19NT05FVEFSWSkKKyNkZWZpbmUgTENfTlVNRVJJQ19NQVNLICAoMSA8PCBMQ19OVU1FUklDKQorI2RlZmluZSBMQ19USU1FX01BU0sgICAgICgxIDw8IExDX1RJTUUpCisjZGVmaW5lIExDX0FMTF9NQVNLIChMQ19DT0xMQVRFX01BU0t8XAorICAgICAgICAgICAgICAgICAgICAgTENfQ1RZUEVfTUFTS3xcCisgICAgICAgICAgICAgICAgICAgICBMQ19NT05FVEFSWV9NQVNLfFwKKyAgICAgICAgICAgICAgICAgICAgIExDX05VTUVSSUNfTUFTS3xcCisgICAgICAgICAgICAgICAgICAgICBMQ19USU1FX01BU0t8XAorICAgICAgICAgICAgICAgICAgICAgTENfTUVTU0FHRVNfTUFTSykKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy8gX0xJQkNQUF9TVVBQT1JUX1hMT0NBTEVfTk9QX0xPQ0FMRV9NR01UX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zdXBwb3J0L3hsb2NhbGUvX19wb3NpeF9sX2ZhbGxiYWNrLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3VwcG9ydC94bG9jYWxlL19fcG9zaXhfbF9mYWxsYmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OTNhNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3VwcG9ydC94bG9jYWxlL19fcG9zaXhfbF9mYWxsYmFjay5oCkBAIC0wLDAgKzEsMTY1IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0gc3VwcG9ydC94bG9jYWxlL19fcG9zaXhfbF9mYWxsYmFjay5oIC0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoZXNlIGFyZSByZWltcGxlbWVudGF0aW9ucyBvZiBzb21lIGV4dGVuZGVkIGxvY2FsZSBmdW5jdGlvbnMgKCAqX2wgKSB0aGF0CisvLyBhcmUgbm9ybWFsbHkgcGFydCBvZiBQT1NJWC4gIFRoaXMgc2hhcmVkIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIHBhcnRzIG9mIHRoZQorLy8gZXh0ZW5kZWQgbG9jYWxlIHN1cHBvcnQgZm9yIGxpYmMncyB0aGF0IG5vcm1hbGx5IGRvbid0IGhhdmUgYW55IChsaWtlCisvLyBBbmRyb2lkJ3MgYmlvbmljIGFuZCBOZXdsaWIpLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX1NVUFBPUlRfWExPQ0FMRV9QT1NJWF9MX0ZBTExCQUNLX0gKKyNkZWZpbmUgX0xJQkNQUF9TVVBQT1JUX1hMT0NBTEVfUE9TSVhfTF9GQUxMQkFDS19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORSBpbnQgaXNhbG51bV9sKGludCBjLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjppc2FsbnVtKGMpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGludCBpc2FscGhhX2woaW50IGMsIGxvY2FsZV90KSB7CisgIHJldHVybiA6OmlzYWxwaGEoYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgaW50IGlzYmxhbmtfbChpbnQgYywgbG9jYWxlX3QpIHsKKyAgcmV0dXJuIDo6aXNibGFuayhjKTsKK30KKworaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORSBpbnQgaXNjbnRybF9sKGludCBjLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjppc2NudHJsKGMpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGludCBpc2RpZ2l0X2woaW50IGMsIGxvY2FsZV90KSB7CisgIHJldHVybiA6OmlzZGlnaXQoYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgaW50IGlzZ3JhcGhfbChpbnQgYywgbG9jYWxlX3QpIHsKKyAgcmV0dXJuIDo6aXNncmFwaChjKTsKK30KKworaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORSBpbnQgaXNsb3dlcl9sKGludCBjLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjppc2xvd2VyKGMpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGludCBpc3ByaW50X2woaW50IGMsIGxvY2FsZV90KSB7CisgIHJldHVybiA6OmlzcHJpbnQoYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgaW50IGlzcHVuY3RfbChpbnQgYywgbG9jYWxlX3QpIHsKKyAgcmV0dXJuIDo6aXNwdW5jdChjKTsKK30KKworaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORSBpbnQgaXNzcGFjZV9sKGludCBjLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjppc3NwYWNlKGMpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGludCBpc3VwcGVyX2woaW50IGMsIGxvY2FsZV90KSB7CisgIHJldHVybiA6OmlzdXBwZXIoYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgaW50IGlzeGRpZ2l0X2woaW50IGMsIGxvY2FsZV90KSB7CisgIHJldHVybiA6OmlzeGRpZ2l0KGMpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGludCBpc3dhbG51bV9sKHdpbnRfdCBjLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjppc3dhbG51bShjKTsKK30KKworaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORSBpbnQgaXN3YWxwaGFfbCh3aW50X3QgYywgbG9jYWxlX3QpIHsKKyAgcmV0dXJuIDo6aXN3YWxwaGEoYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgaW50IGlzd2JsYW5rX2wod2ludF90IGMsIGxvY2FsZV90KSB7CisgIHJldHVybiA6Omlzd2JsYW5rKGMpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGludCBpc3djbnRybF9sKHdpbnRfdCBjLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjppc3djbnRybChjKTsKK30KKworaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORSBpbnQgaXN3ZGlnaXRfbCh3aW50X3QgYywgbG9jYWxlX3QpIHsKKyAgcmV0dXJuIDo6aXN3ZGlnaXQoYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgaW50IGlzd2dyYXBoX2wod2ludF90IGMsIGxvY2FsZV90KSB7CisgIHJldHVybiA6Omlzd2dyYXBoKGMpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGludCBpc3dsb3dlcl9sKHdpbnRfdCBjLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjppc3dsb3dlcihjKTsKK30KKworaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORSBpbnQgaXN3cHJpbnRfbCh3aW50X3QgYywgbG9jYWxlX3QpIHsKKyAgcmV0dXJuIDo6aXN3cHJpbnQoYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgaW50IGlzd3B1bmN0X2wod2ludF90IGMsIGxvY2FsZV90KSB7CisgIHJldHVybiA6Omlzd3B1bmN0KGMpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGludCBpc3dzcGFjZV9sKHdpbnRfdCBjLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjppc3dzcGFjZShjKTsKK30KKworaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORSBpbnQgaXN3dXBwZXJfbCh3aW50X3QgYywgbG9jYWxlX3QpIHsKKyAgcmV0dXJuIDo6aXN3dXBwZXIoYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgaW50IGlzd3hkaWdpdF9sKHdpbnRfdCBjLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjppc3d4ZGlnaXQoYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgaW50IHRvdXBwZXJfbChpbnQgYywgbG9jYWxlX3QpIHsKKyAgcmV0dXJuIDo6dG91cHBlcihjKTsKK30KKworaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORSBpbnQgdG9sb3dlcl9sKGludCBjLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjp0b2xvd2VyKGMpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIHdpbnRfdCB0b3d1cHBlcl9sKHdpbnRfdCBjLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjp0b3d1cHBlcihjKTsKK30KKworaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORSB3aW50X3QgdG93bG93ZXJfbCh3aW50X3QgYywgbG9jYWxlX3QpIHsKKyAgcmV0dXJuIDo6dG93bG93ZXIoYyk7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgaW50IHN0cmNvbGxfbChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlX3QpIHsKKyAgcmV0dXJuIDo6c3RyY29sbChzMSwgczIpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIHNpemVfdCBzdHJ4ZnJtX2woY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjpzdHJ4ZnJtKGRlc3QsIHNyYywgbik7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgc2l6ZV90IHN0cmZ0aW1lX2woY2hhciAqcywgc2l6ZV90IG1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdG0gKnRtLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjpzdHJmdGltZShzLCBtYXgsIGZvcm1hdCwgdG0pOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGludCB3Y3Njb2xsX2woY29uc3Qgd2NoYXJfdCAqd3MxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QgKndzMiwgbG9jYWxlX3QpIHsKKyAgcmV0dXJuIDo6d2NzY29sbCh3czEsIHdzMik7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgc2l6ZV90IHdjc3hmcm1fbCh3Y2hhcl90ICpkZXN0LCBjb25zdCB3Y2hhcl90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG4sIGxvY2FsZV90KSB7CisgIHJldHVybiA6Ondjc3hmcm0oZGVzdCwgc3JjLCBuKTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8vIF9MSUJDUFBfU1VQUE9SVF9YTE9DQUxFX1BPU0lYX0xfRkFMTEJBQ0tfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQveGxvY2FsZS9fX3N0cnRvbnVtX2ZhbGxiYWNrLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3VwcG9ydC94bG9jYWxlL19fc3RydG9udW1fZmFsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWUzOTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQveGxvY2FsZS9fX3N0cnRvbnVtX2ZhbGxiYWNrLmgKQEAgLTAsMCArMSw2NyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0gc3VwcG9ydC94bG9jYWxlL19fc3RydG9udW1fZmFsbGJhY2suaCAtLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUaGVzZSBhcmUgcmVpbXBsZW1lbnRhdGlvbnMgb2Ygc29tZSBleHRlbmRlZCBsb2NhbGUgZnVuY3Rpb25zICggKl9sICkgdGhhdAorLy8gYXJlbid0IHBhcnQgb2YgUE9TSVguICBUaGV5IGFyZSB3aWRlbHkgYXZhaWxhYmxlIHRob3VnaCAoR0xJQkMsIEJTRCwgbWF5YmUKKy8vIG90aGVycykuICBUaGUgdW5pZnlpbmcgYXNwZWN0IGluIHRoaXMgY2FzZSBpcyB0aGF0IGFsbCBvZiB0aGVzZSBmdW5jdGlvbnMKKy8vIGNvbnZlcnQgc3RyaW5ncyB0byBzb21lIG51bWVyaWMgdHlwZS4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9TVVBQT1JUX1hMT0NBTEVfU1RSVE9OVU1fRkFMTEJBQ0tfSAorI2RlZmluZSBfTElCQ1BQX1NVUFBPUlRfWExPQ0FMRV9TVFJUT05VTV9GQUxMQkFDS19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORSBmbG9hdCBzdHJ0b2ZfbChjb25zdCBjaGFyICpucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqZW5kcHRyLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjpzdHJ0b2YobnB0ciwgZW5kcHRyKTsKK30KKworaW5saW5lIF9MSUJDUFBfQUxXQVlTX0lOTElORSBkb3VibGUgc3RydG9kX2woY29uc3QgY2hhciAqbnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiplbmRwdHIsIGxvY2FsZV90KSB7CisgIHJldHVybiA6OnN0cnRvZChucHRyLCBlbmRwdHIpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGxvbmcgZG91YmxlIHN0cnRvbGRfbChjb25zdCBjaGFyICpucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmVuZHB0ciwgbG9jYWxlX3QpIHsKKyAgcmV0dXJuIDo6c3RydG9sZChucHRyLCBlbmRwdHIpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGxvbmcgbG9uZworc3RydG9sbF9sKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjpzdHJ0b2xsKG5wdHIsIGVuZHB0ciwgYmFzZSk7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgdW5zaWduZWQgbG9uZyBsb25nCitzdHJ0b3VsbF9sKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjpzdHJ0b3VsbChucHRyLCBlbmRwdHIsIGJhc2UpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGxvbmcgbG9uZword2NzdG9sbF9sKGNvbnN0IHdjaGFyX3QgKm5wdHIsIHdjaGFyX3QgKiplbmRwdHIsIGludCBiYXNlLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjp3Y3N0b2xsKG5wdHIsIGVuZHB0ciwgYmFzZSk7Cit9CisKK2lubGluZSBfTElCQ1BQX0FMV0FZU19JTkxJTkUgdW5zaWduZWQgbG9uZyBsb25nCit3Y3N0b3VsbF9sKGNvbnN0IHdjaGFyX3QgKm5wdHIsIHdjaGFyX3QgKiplbmRwdHIsIGludCBiYXNlLCBsb2NhbGVfdCkgeworICByZXR1cm4gOjp3Y3N0b3VsbChucHRyLCBlbmRwdHIsIGJhc2UpOworfQorCitpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGxvbmcgZG91YmxlIHdjc3RvbGRfbChjb25zdCB3Y2hhcl90ICpucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCAqKmVuZHB0ciwgbG9jYWxlX3QpIHsKKyAgcmV0dXJuIDo6d2NzdG9sZChucHRyLCBlbmRwdHIpOworfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gX0xJQkNQUF9TVVBQT1JUX1hMT0NBTEVfU1RSVE9OVU1fRkFMTEJBQ0tfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQveGxvY2FsZS94bG9jYWxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3VwcG9ydC94bG9jYWxlL3hsb2NhbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3N1cHBvcnQveGxvY2FsZS94bG9jYWxlLmgKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS9zeXN0ZW1fZXJyb3IgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3lzdGVtX2Vycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzdlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvc3lzdGVtX2Vycm9yCkBAIC0wLDAgKzEsNjczIEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN5c3RlbV9lcnJvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX1NZU1RFTV9FUlJPUgorI2RlZmluZSBfTElCQ1BQX1NZU1RFTV9FUlJPUgorCisvKgorICAgIHN5c3RlbV9lcnJvciBzeW5vcHNpcworCituYW1lc3BhY2Ugc3RkCit7CisKK2NsYXNzIGVycm9yX2NhdGVnb3J5Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+ZXJyb3JfY2F0ZWdvcnkoKSBub2V4Y2VwdDsKKworICAgIGNvbnN0ZXhwciBlcnJvcl9jYXRlZ29yeSgpOworICAgIGVycm9yX2NhdGVnb3J5KGNvbnN0IGVycm9yX2NhdGVnb3J5JikgPSBkZWxldGU7CisgICAgZXJyb3JfY2F0ZWdvcnkmIG9wZXJhdG9yPShjb25zdCBlcnJvcl9jYXRlZ29yeSYpID0gZGVsZXRlOworCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Qgbm9leGNlcHQgPSAwOworICAgIHZpcnR1YWwgZXJyb3JfY29uZGl0aW9uIGRlZmF1bHRfZXJyb3JfY29uZGl0aW9uKGludCBldikgY29uc3Qgbm9leGNlcHQ7CisgICAgdmlydHVhbCBib29sIGVxdWl2YWxlbnQoaW50IGNvZGUsIGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgY29uZGl0aW9uKSBjb25zdCBub2V4Y2VwdDsKKyAgICB2aXJ0dWFsIGJvb2wgZXF1aXZhbGVudChjb25zdCBlcnJvcl9jb2RlJiBjb2RlLCBpbnQgY29uZGl0aW9uKSBjb25zdCBub2V4Y2VwdDsKKyAgICB2aXJ0dWFsIHN0cmluZyBtZXNzYWdlKGludCBldikgY29uc3QgPSAwOworCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGVycm9yX2NhdGVnb3J5JiByaHMpIGNvbnN0IG5vZXhjZXB0OworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBlcnJvcl9jYXRlZ29yeSYgcmhzKSBjb25zdCBub2V4Y2VwdDsKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBlcnJvcl9jYXRlZ29yeSYgcmhzKSBjb25zdCBub2V4Y2VwdDsKK307CisKK2NvbnN0IGVycm9yX2NhdGVnb3J5JiBnZW5lcmljX2NhdGVnb3J5KCkgbm9leGNlcHQ7Citjb25zdCBlcnJvcl9jYXRlZ29yeSYgc3lzdGVtX2NhdGVnb3J5KCkgbm9leGNlcHQ7CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfZXJyb3JfY29kZV9lbnVtCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19lcnJvcl9jb25kaXRpb25fZW51bQorICAgIDogcHVibGljIGZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgY29uc3RleHByIHNpemVfdCBpc19lcnJvcl9jb25kaXRpb25fZW51bV92ID0gaXNfZXJyb3JfY29uZGl0aW9uX2VudW08X1RwPjo6dmFsdWU7IC8vIEMrKzE3CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgY29uc3RleHByIHNpemVfdCBpc19lcnJvcl9jb2RlX2VudW1fdiA9IGlzX2Vycm9yX2NvZGVfZW51bTxfVHA+Ojp2YWx1ZTsgLy8gQysrMTcKKworY2xhc3MgZXJyb3JfY29kZQoreworcHVibGljOgorICAgIC8vIGNvbnN0cnVjdG9yczoKKyAgICBlcnJvcl9jb2RlKCkgbm9leGNlcHQ7CisgICAgZXJyb3JfY29kZShpbnQgdmFsLCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgY2F0KSBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgRXJyb3JDb2RlRW51bT4KKyAgICAgICAgZXJyb3JfY29kZShFcnJvckNvZGVFbnVtIGUpIG5vZXhjZXB0OworCisgICAgLy8gbW9kaWZpZXJzOgorICAgIHZvaWQgYXNzaWduKGludCB2YWwsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBjYXQpIG5vZXhjZXB0OworICAgIHRlbXBsYXRlIDxjbGFzcyBFcnJvckNvZGVFbnVtPgorICAgICAgICBlcnJvcl9jb2RlJiBvcGVyYXRvcj0oRXJyb3JDb2RlRW51bSBlKSBub2V4Y2VwdDsKKyAgICB2b2lkIGNsZWFyKCkgbm9leGNlcHQ7CisKKyAgICAvLyBvYnNlcnZlcnM6CisgICAgaW50IHZhbHVlKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIGNhdGVnb3J5KCkgY29uc3Qgbm9leGNlcHQ7CisgICAgZXJyb3JfY29uZGl0aW9uIGRlZmF1bHRfZXJyb3JfY29uZGl0aW9uKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgc3RyaW5nIG1lc3NhZ2UoKSBjb25zdDsKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3Qgbm9leGNlcHQ7Cit9OworCisvLyBub24tbWVtYmVyIGZ1bmN0aW9uczoKK2Jvb2wgb3BlcmF0b3I8KGNvbnN0IGVycm9yX2NvZGUmIGxocywgY29uc3QgZXJyb3JfY29kZSYgcmhzKSBub2V4Y2VwdDsKK3RlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGJhc2ljX29zdHJlYW08Y2hhclQsdHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhclQsdHJhaXRzPiYgb3MsIGNvbnN0IGVycm9yX2NvZGUmIGVjKTsKKworY2xhc3MgZXJyb3JfY29uZGl0aW9uCit7CitwdWJsaWM6CisgICAgLy8gY29uc3RydWN0b3JzOgorICAgIGVycm9yX2NvbmRpdGlvbigpIG5vZXhjZXB0OworICAgIGVycm9yX2NvbmRpdGlvbihpbnQgdmFsLCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgY2F0KSBub2V4Y2VwdDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgRXJyb3JDb25kaXRpb25FbnVtPgorICAgICAgICBlcnJvcl9jb25kaXRpb24oRXJyb3JDb25kaXRpb25FbnVtIGUpIG5vZXhjZXB0OworCisgICAgLy8gbW9kaWZpZXJzOgorICAgIHZvaWQgYXNzaWduKGludCB2YWwsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBjYXQpIG5vZXhjZXB0OworICAgIHRlbXBsYXRlIDxjbGFzcyBFcnJvckNvbmRpdGlvbkVudW0+CisgICAgICAgIGVycm9yX2NvbmRpdGlvbiYgb3BlcmF0b3I9KEVycm9yQ29uZGl0aW9uRW51bSBlKSBub2V4Y2VwdDsKKyAgICB2b2lkIGNsZWFyKCkgbm9leGNlcHQ7CisKKyAgICAvLyBvYnNlcnZlcnM6CisgICAgaW50IHZhbHVlKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIGNhdGVnb3J5KCkgY29uc3Qgbm9leGNlcHQ7CisgICAgc3RyaW5nIG1lc3NhZ2UoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3Qgbm9leGNlcHQ7Cit9OworCitib29sIG9wZXJhdG9yPChjb25zdCBlcnJvcl9jb25kaXRpb24mIGxocywgY29uc3QgZXJyb3JfY29uZGl0aW9uJiByaHMpIG5vZXhjZXB0OworCitjbGFzcyBzeXN0ZW1fZXJyb3IKKyAgICA6IHB1YmxpYyBydW50aW1lX2Vycm9yCit7CitwdWJsaWM6CisgICAgc3lzdGVtX2Vycm9yKGVycm9yX2NvZGUgZWMsIGNvbnN0IHN0cmluZyYgd2hhdF9hcmcpOworICAgIHN5c3RlbV9lcnJvcihlcnJvcl9jb2RlIGVjLCBjb25zdCBjaGFyKiB3aGF0X2FyZyk7CisgICAgc3lzdGVtX2Vycm9yKGVycm9yX2NvZGUgZWMpOworICAgIHN5c3RlbV9lcnJvcihpbnQgZXYsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBlY2F0LCBjb25zdCBzdHJpbmcmIHdoYXRfYXJnKTsKKyAgICBzeXN0ZW1fZXJyb3IoaW50IGV2LCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgZWNhdCwgY29uc3QgY2hhciogd2hhdF9hcmcpOworICAgIHN5c3RlbV9lcnJvcihpbnQgZXYsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBlY2F0KTsKKworICAgIGNvbnN0IGVycm9yX2NvZGUmIGNvZGUoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQ7Cit9OworCitlbnVtIGNsYXNzIGVycmMKK3sKKyAgICBhZGRyZXNzX2ZhbWlseV9ub3Rfc3VwcG9ydGVkLCAgICAgICAvLyBFQUZOT1NVUFBPUlQKKyAgICBhZGRyZXNzX2luX3VzZSwgICAgICAgICAgICAgICAgICAgICAvLyBFQUREUklOVVNFCisgICAgYWRkcmVzc19ub3RfYXZhaWxhYmxlLCAgICAgICAgICAgICAgLy8gRUFERFJOT1RBVkFJTAorICAgIGFscmVhZHlfY29ubmVjdGVkLCAgICAgICAgICAgICAgICAgIC8vIEVJU0NPTk4KKyAgICBhcmd1bWVudF9saXN0X3Rvb19sb25nLCAgICAgICAgICAgICAvLyBFMkJJRworICAgIGFyZ3VtZW50X291dF9vZl9kb21haW4sICAgICAgICAgICAgIC8vIEVET00KKyAgICBiYWRfYWRkcmVzcywgICAgICAgICAgICAgICAgICAgICAgICAvLyBFRkFVTFQKKyAgICBiYWRfZmlsZV9kZXNjcmlwdG9yLCAgICAgICAgICAgICAgICAvLyBFQkFERgorICAgIGJhZF9tZXNzYWdlLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVCQURNU0cKKyAgICBicm9rZW5fcGlwZSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBFUElQRQorICAgIGNvbm5lY3Rpb25fYWJvcnRlZCwgICAgICAgICAgICAgICAgIC8vIEVDT05OQUJPUlRFRAorICAgIGNvbm5lY3Rpb25fYWxyZWFkeV9pbl9wcm9ncmVzcywgICAgIC8vIEVBTFJFQURZCisgICAgY29ubmVjdGlvbl9yZWZ1c2VkLCAgICAgICAgICAgICAgICAgLy8gRUNPTk5SRUZVU0VECisgICAgY29ubmVjdGlvbl9yZXNldCwgICAgICAgICAgICAgICAgICAgLy8gRUNPTk5SRVNFVAorICAgIGNyb3NzX2RldmljZV9saW5rLCAgICAgICAgICAgICAgICAgIC8vIEVYREVWCisgICAgZGVzdGluYXRpb25fYWRkcmVzc19yZXF1aXJlZCwgICAgICAgLy8gRURFU1RBRERSUkVRCisgICAgZGV2aWNlX29yX3Jlc291cmNlX2J1c3ksICAgICAgICAgICAgLy8gRUJVU1kKKyAgICBkaXJlY3Rvcnlfbm90X2VtcHR5LCAgICAgICAgICAgICAgICAvLyBFTk9URU1QVFkKKyAgICBleGVjdXRhYmxlX2Zvcm1hdF9lcnJvciwgICAgICAgICAgICAvLyBFTk9FWEVDCisgICAgZmlsZV9leGlzdHMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gRUVYSVNUCisgICAgZmlsZV90b29fbGFyZ2UsICAgICAgICAgICAgICAgICAgICAgLy8gRUZCSUcKKyAgICBmaWxlbmFtZV90b29fbG9uZywgICAgICAgICAgICAgICAgICAvLyBFTkFNRVRPT0xPTkcKKyAgICBmdW5jdGlvbl9ub3Rfc3VwcG9ydGVkLCAgICAgICAgICAgICAvLyBFTk9TWVMKKyAgICBob3N0X3VucmVhY2hhYmxlLCAgICAgICAgICAgICAgICAgICAvLyBFSE9TVFVOUkVBQ0gKKyAgICBpZGVudGlmaWVyX3JlbW92ZWQsICAgICAgICAgICAgICAgICAvLyBFSURSTQorICAgIGlsbGVnYWxfYnl0ZV9zZXF1ZW5jZSwgICAgICAgICAgICAgIC8vIEVJTFNFUQorICAgIGluYXBwcm9wcmlhdGVfaW9fY29udHJvbF9vcGVyYXRpb24sIC8vIEVOT1RUWQorICAgIGludGVycnVwdGVkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVJTlRSCisgICAgaW52YWxpZF9hcmd1bWVudCwgICAgICAgICAgICAgICAgICAgLy8gRUlOVkFMCisgICAgaW52YWxpZF9zZWVrLCAgICAgICAgICAgICAgICAgICAgICAgLy8gRVNQSVBFCisgICAgaW9fZXJyb3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRUlPCisgICAgaXNfYV9kaXJlY3RvcnksICAgICAgICAgICAgICAgICAgICAgLy8gRUlTRElSCisgICAgbWVzc2FnZV9zaXplLCAgICAgICAgICAgICAgICAgICAgICAgLy8gRU1TR1NJWkUKKyAgICBuZXR3b3JrX2Rvd24sICAgICAgICAgICAgICAgICAgICAgICAvLyBFTkVURE9XTgorICAgIG5ldHdvcmtfcmVzZXQsICAgICAgICAgICAgICAgICAgICAgIC8vIEVORVRSRVNFVAorICAgIG5ldHdvcmtfdW5yZWFjaGFibGUsICAgICAgICAgICAgICAgIC8vIEVORVRVTlJFQUNICisgICAgbm9fYnVmZmVyX3NwYWNlLCAgICAgICAgICAgICAgICAgICAgLy8gRU5PQlVGUworICAgIG5vX2NoaWxkX3Byb2Nlc3MsICAgICAgICAgICAgICAgICAgIC8vIEVDSElMRAorICAgIG5vX2xpbmssICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVOT0xJTksKKyAgICBub19sb2NrX2F2YWlsYWJsZSwgICAgICAgICAgICAgICAgICAvLyBFTk9MQ0sKKyAgICBub19tZXNzYWdlX2F2YWlsYWJsZSwgICAgICAgICAgICAgICAvLyBFTk9EQVRBCisgICAgbm9fbWVzc2FnZSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRU5PTVNHCisgICAgbm9fcHJvdG9jb2xfb3B0aW9uLCAgICAgICAgICAgICAgICAgLy8gRU5PUFJPVE9PUFQKKyAgICBub19zcGFjZV9vbl9kZXZpY2UsICAgICAgICAgICAgICAgICAvLyBFTk9TUEMKKyAgICBub19zdHJlYW1fcmVzb3VyY2VzLCAgICAgICAgICAgICAgICAvLyBFTk9TUgorICAgIG5vX3N1Y2hfZGV2aWNlX29yX2FkZHJlc3MsICAgICAgICAgIC8vIEVOWElPCisgICAgbm9fc3VjaF9kZXZpY2UsICAgICAgICAgICAgICAgICAgICAgLy8gRU5PREVWCisgICAgbm9fc3VjaF9maWxlX29yX2RpcmVjdG9yeSwgICAgICAgICAgLy8gRU5PRU5UCisgICAgbm9fc3VjaF9wcm9jZXNzLCAgICAgICAgICAgICAgICAgICAgLy8gRVNSQ0gKKyAgICBub3RfYV9kaXJlY3RvcnksICAgICAgICAgICAgICAgICAgICAvLyBFTk9URElSCisgICAgbm90X2Ffc29ja2V0LCAgICAgICAgICAgICAgICAgICAgICAgLy8gRU5PVFNPQ0sKKyAgICBub3RfYV9zdHJlYW0sICAgICAgICAgICAgICAgICAgICAgICAvLyBFTk9TVFIKKyAgICBub3RfY29ubmVjdGVkLCAgICAgICAgICAgICAgICAgICAgICAvLyBFTk9UQ09OTgorICAgIG5vdF9lbm91Z2hfbWVtb3J5LCAgICAgICAgICAgICAgICAgIC8vIEVOT01FTQorICAgIG5vdF9zdXBwb3J0ZWQsICAgICAgICAgICAgICAgICAgICAgIC8vIEVOT1RTVVAKKyAgICBvcGVyYXRpb25fY2FuY2VsZWQsICAgICAgICAgICAgICAgICAvLyBFQ0FOQ0VMRUQKKyAgICBvcGVyYXRpb25faW5fcHJvZ3Jlc3MsICAgICAgICAgICAgICAvLyBFSU5QUk9HUkVTUworICAgIG9wZXJhdGlvbl9ub3RfcGVybWl0dGVkLCAgICAgICAgICAgIC8vIEVQRVJNCisgICAgb3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQsICAgICAgICAgICAgLy8gRU9QTk9UU1VQUAorICAgIG9wZXJhdGlvbl93b3VsZF9ibG9jaywgICAgICAgICAgICAgIC8vIEVXT1VMREJMT0NLCisgICAgb3duZXJfZGVhZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRU9XTkVSREVBRAorICAgIHBlcm1pc3Npb25fZGVuaWVkLCAgICAgICAgICAgICAgICAgIC8vIEVBQ0NFUworICAgIHByb3RvY29sX2Vycm9yLCAgICAgICAgICAgICAgICAgICAgIC8vIEVQUk9UTworICAgIHByb3RvY29sX25vdF9zdXBwb3J0ZWQsICAgICAgICAgICAgIC8vIEVQUk9UT05PU1VQUE9SVAorICAgIHJlYWRfb25seV9maWxlX3N5c3RlbSwgICAgICAgICAgICAgIC8vIEVST0ZTCisgICAgcmVzb3VyY2VfZGVhZGxvY2tfd291bGRfb2NjdXIsICAgICAgLy8gRURFQURMSworICAgIHJlc291cmNlX3VuYXZhaWxhYmxlX3RyeV9hZ2FpbiwgICAgIC8vIEVBR0FJTgorICAgIHJlc3VsdF9vdXRfb2ZfcmFuZ2UsICAgICAgICAgICAgICAgIC8vIEVSQU5HRQorICAgIHN0YXRlX25vdF9yZWNvdmVyYWJsZSwgICAgICAgICAgICAgIC8vIEVOT1RSRUNPVkVSQUJMRQorICAgIHN0cmVhbV90aW1lb3V0LCAgICAgICAgICAgICAgICAgICAgIC8vIEVUSU1FCisgICAgdGV4dF9maWxlX2J1c3ksICAgICAgICAgICAgICAgICAgICAgLy8gRVRYVEJTWQorICAgIHRpbWVkX291dCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVUSU1FRE9VVAorICAgIHRvb19tYW55X2ZpbGVzX29wZW5faW5fc3lzdGVtLCAgICAgIC8vIEVORklMRQorICAgIHRvb19tYW55X2ZpbGVzX29wZW4sICAgICAgICAgICAgICAgIC8vIEVNRklMRQorICAgIHRvb19tYW55X2xpbmtzLCAgICAgICAgICAgICAgICAgICAgIC8vIEVNTElOSworICAgIHRvb19tYW55X3N5bWJvbGljX2xpbmtfbGV2ZWxzLCAgICAgIC8vIEVMT09QCisgICAgdmFsdWVfdG9vX2xhcmdlLCAgICAgICAgICAgICAgICAgICAgLy8gRU9WRVJGTE9XCisgICAgd3JvbmdfcHJvdG9jb2xfdHlwZSAgICAgICAgICAgICAgICAgLy8gRVBST1RPVFlQRQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzX2Vycm9yX2NvbmRpdGlvbl9lbnVtPGVycmM+CisgICAgOiB0cnVlX3R5cGUgeyB9CisKK2Vycm9yX2NvZGUgbWFrZV9lcnJvcl9jb2RlKGVycmMgZSkgbm9leGNlcHQ7CitlcnJvcl9jb25kaXRpb24gbWFrZV9lcnJvcl9jb25kaXRpb24oZXJyYyBlKSBub2V4Y2VwdDsKKworLy8gQ29tcGFyaXNvbiBvcGVyYXRvcnM6Citib29sIG9wZXJhdG9yPT0oY29uc3QgZXJyb3JfY29kZSYgbGhzLCBjb25zdCBlcnJvcl9jb2RlJiByaHMpIG5vZXhjZXB0OworYm9vbCBvcGVyYXRvcj09KGNvbnN0IGVycm9yX2NvZGUmIGxocywgY29uc3QgZXJyb3JfY29uZGl0aW9uJiByaHMpIG5vZXhjZXB0OworYm9vbCBvcGVyYXRvcj09KGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgbGhzLCBjb25zdCBlcnJvcl9jb2RlJiByaHMpIG5vZXhjZXB0OworYm9vbCBvcGVyYXRvcj09KGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgbGhzLCBjb25zdCBlcnJvcl9jb25kaXRpb24mIHJocykgbm9leGNlcHQ7Citib29sIG9wZXJhdG9yIT0oY29uc3QgZXJyb3JfY29kZSYgbGhzLCBjb25zdCBlcnJvcl9jb2RlJiByaHMpIG5vZXhjZXB0OworYm9vbCBvcGVyYXRvciE9KGNvbnN0IGVycm9yX2NvZGUmIGxocywgY29uc3QgZXJyb3JfY29uZGl0aW9uJiByaHMpIG5vZXhjZXB0OworYm9vbCBvcGVyYXRvciE9KGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgbGhzLCBjb25zdCBlcnJvcl9jb2RlJiByaHMpIG5vZXhjZXB0OworYm9vbCBvcGVyYXRvciE9KGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgbGhzLCBjb25zdCBlcnJvcl9jb25kaXRpb24mIHJocykgbm9leGNlcHQ7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBoYXNoPHN0ZDo6ZXJyb3JfY29kZT47Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaGFzaDxzdGQ6OmVycm9yX2NvbmRpdGlvbj47CisKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8Y2Vycm5vPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxfX2Z1bmN0aW9uYWxfYmFzZT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKworLy8gaXNfZXJyb3JfY29kZV9lbnVtCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfZXJyb3JfY29kZV9lbnVtCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIGNvbnN0ZXhwciBzaXplX3QgaXNfZXJyb3JfY29kZV9lbnVtX3YgPSBpc19lcnJvcl9jb2RlX2VudW08X1RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfZXJyb3JfY29uZGl0aW9uX2VudW0KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19lcnJvcl9jb25kaXRpb25fZW51bQorICAgIDogcHVibGljIGZhbHNlX3R5cGUge307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBjb25zdGV4cHIgc2l6ZV90IGlzX2Vycm9yX2NvbmRpdGlvbl9lbnVtX3YgPSBpc19lcnJvcl9jb25kaXRpb25fZW51bTxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBTb21lIGVycm9yIGNvZGVzIGFyZSBub3QgcHJlc2VudCBvbiBhbGwgcGxhdGZvcm1zLCBzbyB3ZSBwcm92aWRlIGVxdWl2YWxlbnRzCisvLyBmb3IgdGhlbToKKworLy9lbnVtIGNsYXNzIGVycmMKK19MSUJDUFBfREVDTEFSRV9TVFJPTkdfRU5VTShlcnJjKQoreworICAgIGFkZHJlc3NfZmFtaWx5X25vdF9zdXBwb3J0ZWQgICAgICAgID0gRUFGTk9TVVBQT1JULAorICAgIGFkZHJlc3NfaW5fdXNlICAgICAgICAgICAgICAgICAgICAgID0gRUFERFJJTlVTRSwKKyAgICBhZGRyZXNzX25vdF9hdmFpbGFibGUgICAgICAgICAgICAgICA9IEVBRERSTk9UQVZBSUwsCisgICAgYWxyZWFkeV9jb25uZWN0ZWQgICAgICAgICAgICAgICAgICAgPSBFSVNDT05OLAorICAgIGFyZ3VtZW50X2xpc3RfdG9vX2xvbmcgICAgICAgICAgICAgID0gRTJCSUcsCisgICAgYXJndW1lbnRfb3V0X29mX2RvbWFpbiAgICAgICAgICAgICAgPSBFRE9NLAorICAgIGJhZF9hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgID0gRUZBVUxULAorICAgIGJhZF9maWxlX2Rlc2NyaXB0b3IgICAgICAgICAgICAgICAgID0gRUJBREYsCisgICAgYmFkX21lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgPSBFQkFETVNHLAorICAgIGJyb2tlbl9waXBlICAgICAgICAgICAgICAgICAgICAgICAgID0gRVBJUEUsCisgICAgY29ubmVjdGlvbl9hYm9ydGVkICAgICAgICAgICAgICAgICAgPSBFQ09OTkFCT1JURUQsCisgICAgY29ubmVjdGlvbl9hbHJlYWR5X2luX3Byb2dyZXNzICAgICAgPSBFQUxSRUFEWSwKKyAgICBjb25uZWN0aW9uX3JlZnVzZWQgICAgICAgICAgICAgICAgICA9IEVDT05OUkVGVVNFRCwKKyAgICBjb25uZWN0aW9uX3Jlc2V0ICAgICAgICAgICAgICAgICAgICA9IEVDT05OUkVTRVQsCisgICAgY3Jvc3NfZGV2aWNlX2xpbmsgICAgICAgICAgICAgICAgICAgPSBFWERFViwKKyAgICBkZXN0aW5hdGlvbl9hZGRyZXNzX3JlcXVpcmVkICAgICAgICA9IEVERVNUQUREUlJFUSwKKyAgICBkZXZpY2Vfb3JfcmVzb3VyY2VfYnVzeSAgICAgICAgICAgICA9IEVCVVNZLAorICAgIGRpcmVjdG9yeV9ub3RfZW1wdHkgICAgICAgICAgICAgICAgID0gRU5PVEVNUFRZLAorICAgIGV4ZWN1dGFibGVfZm9ybWF0X2Vycm9yICAgICAgICAgICAgID0gRU5PRVhFQywKKyAgICBmaWxlX2V4aXN0cyAgICAgICAgICAgICAgICAgICAgICAgICA9IEVFWElTVCwKKyAgICBmaWxlX3Rvb19sYXJnZSAgICAgICAgICAgICAgICAgICAgICA9IEVGQklHLAorICAgIGZpbGVuYW1lX3Rvb19sb25nICAgICAgICAgICAgICAgICAgID0gRU5BTUVUT09MT05HLAorICAgIGZ1bmN0aW9uX25vdF9zdXBwb3J0ZWQgICAgICAgICAgICAgID0gRU5PU1lTLAorICAgIGhvc3RfdW5yZWFjaGFibGUgICAgICAgICAgICAgICAgICAgID0gRUhPU1RVTlJFQUNILAorICAgIGlkZW50aWZpZXJfcmVtb3ZlZCAgICAgICAgICAgICAgICAgID0gRUlEUk0sCisgICAgaWxsZWdhbF9ieXRlX3NlcXVlbmNlICAgICAgICAgICAgICAgPSBFSUxTRVEsCisgICAgaW5hcHByb3ByaWF0ZV9pb19jb250cm9sX29wZXJhdGlvbiAgPSBFTk9UVFksCisgICAgaW50ZXJydXB0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgPSBFSU5UUiwKKyAgICBpbnZhbGlkX2FyZ3VtZW50ICAgICAgICAgICAgICAgICAgICA9IEVJTlZBTCwKKyAgICBpbnZhbGlkX3NlZWsgICAgICAgICAgICAgICAgICAgICAgICA9IEVTUElQRSwKKyAgICBpb19lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVJTywKKyAgICBpc19hX2RpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgICA9IEVJU0RJUiwKKyAgICBtZXNzYWdlX3NpemUgICAgICAgICAgICAgICAgICAgICAgICA9IEVNU0dTSVpFLAorICAgIG5ldHdvcmtfZG93biAgICAgICAgICAgICAgICAgICAgICAgID0gRU5FVERPV04sCisgICAgbmV0d29ya19yZXNldCAgICAgICAgICAgICAgICAgICAgICAgPSBFTkVUUkVTRVQsCisgICAgbmV0d29ya191bnJlYWNoYWJsZSAgICAgICAgICAgICAgICAgPSBFTkVUVU5SRUFDSCwKKyAgICBub19idWZmZXJfc3BhY2UgICAgICAgICAgICAgICAgICAgICA9IEVOT0JVRlMsCisgICAgbm9fY2hpbGRfcHJvY2VzcyAgICAgICAgICAgICAgICAgICAgPSBFQ0hJTEQsCisgICAgbm9fbGluayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFTk9MSU5LLAorICAgIG5vX2xvY2tfYXZhaWxhYmxlICAgICAgICAgICAgICAgICAgID0gRU5PTENLLAorI2lmZGVmIEVOT0RBVEEKKyAgICBub19tZXNzYWdlX2F2YWlsYWJsZSAgICAgICAgICAgICAgICA9IEVOT0RBVEEsCisjZWxzZQorICAgIG5vX21lc3NhZ2VfYXZhaWxhYmxlICAgICAgICAgICAgICAgID0gRU5PTVNHLAorI2VuZGlmCisgICAgbm9fbWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFTk9NU0csCisgICAgbm9fcHJvdG9jb2xfb3B0aW9uICAgICAgICAgICAgICAgICAgPSBFTk9QUk9UT09QVCwKKyAgICBub19zcGFjZV9vbl9kZXZpY2UgICAgICAgICAgICAgICAgICA9IEVOT1NQQywKKyNpZmRlZiBFTk9TUgorICAgIG5vX3N0cmVhbV9yZXNvdXJjZXMgICAgICAgICAgICAgICAgID0gRU5PU1IsCisjZWxzZQorICAgIG5vX3N0cmVhbV9yZXNvdXJjZXMgICAgICAgICAgICAgICAgID0gRU5PTUVNLAorI2VuZGlmCisgICAgbm9fc3VjaF9kZXZpY2Vfb3JfYWRkcmVzcyAgICAgICAgICAgPSBFTlhJTywKKyAgICBub19zdWNoX2RldmljZSAgICAgICAgICAgICAgICAgICAgICA9IEVOT0RFViwKKyAgICBub19zdWNoX2ZpbGVfb3JfZGlyZWN0b3J5ICAgICAgICAgICA9IEVOT0VOVCwKKyAgICBub19zdWNoX3Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICA9IEVTUkNILAorICAgIG5vdF9hX2RpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgID0gRU5PVERJUiwKKyAgICBub3RfYV9zb2NrZXQgICAgICAgICAgICAgICAgICAgICAgICA9IEVOT1RTT0NLLAorI2lmZGVmIEVOT1NUUgorICAgIG5vdF9hX3N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgID0gRU5PU1RSLAorI2Vsc2UKKyAgICBub3RfYV9zdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICA9IEVJTlZBTCwKKyNlbmRpZgorICAgIG5vdF9jb25uZWN0ZWQgICAgICAgICAgICAgICAgICAgICAgID0gRU5PVENPTk4sCisgICAgbm90X2Vub3VnaF9tZW1vcnkgICAgICAgICAgICAgICAgICAgPSBFTk9NRU0sCisgICAgbm90X3N1cHBvcnRlZCAgICAgICAgICAgICAgICAgICAgICAgPSBFTk9UU1VQLAorICAgIG9wZXJhdGlvbl9jYW5jZWxlZCAgICAgICAgICAgICAgICAgID0gRUNBTkNFTEVELAorICAgIG9wZXJhdGlvbl9pbl9wcm9ncmVzcyAgICAgICAgICAgICAgID0gRUlOUFJPR1JFU1MsCisgICAgb3BlcmF0aW9uX25vdF9wZXJtaXR0ZWQgICAgICAgICAgICAgPSBFUEVSTSwKKyAgICBvcGVyYXRpb25fbm90X3N1cHBvcnRlZCAgICAgICAgICAgICA9IEVPUE5PVFNVUFAsCisgICAgb3BlcmF0aW9uX3dvdWxkX2Jsb2NrICAgICAgICAgICAgICAgPSBFV09VTERCTE9DSywKKyAgICBvd25lcl9kZWFkICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVPV05FUkRFQUQsCisgICAgcGVybWlzc2lvbl9kZW5pZWQgICAgICAgICAgICAgICAgICAgPSBFQUNDRVMsCisgICAgcHJvdG9jb2xfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgPSBFUFJPVE8sCisgICAgcHJvdG9jb2xfbm90X3N1cHBvcnRlZCAgICAgICAgICAgICAgPSBFUFJPVE9OT1NVUFBPUlQsCisgICAgcmVhZF9vbmx5X2ZpbGVfc3lzdGVtICAgICAgICAgICAgICAgPSBFUk9GUywKKyAgICByZXNvdXJjZV9kZWFkbG9ja193b3VsZF9vY2N1ciAgICAgICA9IEVERUFETEssCisgICAgcmVzb3VyY2VfdW5hdmFpbGFibGVfdHJ5X2FnYWluICAgICAgPSBFQUdBSU4sCisgICAgcmVzdWx0X291dF9vZl9yYW5nZSAgICAgICAgICAgICAgICAgPSBFUkFOR0UsCisgICAgc3RhdGVfbm90X3JlY292ZXJhYmxlICAgICAgICAgICAgICAgPSBFTk9UUkVDT1ZFUkFCTEUsCisjaWZkZWYgRVRJTUUKKyAgICBzdHJlYW1fdGltZW91dCAgICAgICAgICAgICAgICAgICAgICA9IEVUSU1FLAorI2Vsc2UKKyAgICBzdHJlYW1fdGltZW91dCAgICAgICAgICAgICAgICAgICAgICA9IEVUSU1FRE9VVCwKKyNlbmRpZgorICAgIHRleHRfZmlsZV9idXN5ICAgICAgICAgICAgICAgICAgICAgID0gRVRYVEJTWSwKKyAgICB0aW1lZF9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVUSU1FRE9VVCwKKyAgICB0b29fbWFueV9maWxlc19vcGVuX2luX3N5c3RlbSAgICAgICA9IEVORklMRSwKKyAgICB0b29fbWFueV9maWxlc19vcGVuICAgICAgICAgICAgICAgICA9IEVNRklMRSwKKyAgICB0b29fbWFueV9saW5rcyAgICAgICAgICAgICAgICAgICAgICA9IEVNTElOSywKKyAgICB0b29fbWFueV9zeW1ib2xpY19saW5rX2xldmVscyAgICAgICA9IEVMT09QLAorICAgIHZhbHVlX3Rvb19sYXJnZSAgICAgICAgICAgICAgICAgICAgID0gRU9WRVJGTE9XLAorICAgIHdyb25nX3Byb3RvY29sX3R5cGUgICAgICAgICAgICAgICAgID0gRVBST1RPVFlQRQorfTsKK19MSUJDUFBfREVDTEFSRV9TVFJPTkdfRU5VTV9FUElMT0coZXJyYykKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19lcnJvcl9jb25kaXRpb25fZW51bTxlcnJjPgorICAgIDogdHJ1ZV90eXBlIHsgfTsKKworI2lmZGVmIF9MSUJDUFBfSEFTX05PX1NUUk9OR19FTlVNUwordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19lcnJvcl9jb25kaXRpb25fZW51bTxlcnJjOjpfX2x4PgorICAgIDogdHJ1ZV90eXBlIHsgfTsKKyNlbmRpZgorCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIGVycm9yX2NvbmRpdGlvbjsKK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgZXJyb3JfY29kZTsKKworLy8gY2xhc3MgZXJyb3JfY2F0ZWdvcnkKKworY2xhc3MgX0xJQkNQUF9ISURERU4gX19kb19tZXNzYWdlOworCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIGVycm9yX2NhdGVnb3J5Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+ZXJyb3JfY2F0ZWdvcnkoKSBfTk9FWENFUFQ7CisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfQlVJTERJTkdfU1lTVEVNX0VSUk9SKSAmJiBcCisgICAgZGVmaW5lZChfTElCQ1BQX0RFUFJFQ0FURURfQUJJX0xFR0FDWV9MSUJSQVJZX0RFRklOSVRJT05TX0ZPUl9JTkxJTkVfRlVOQ1RJT05TKQorICAgIGVycm9yX2NhdGVnb3J5KCkgX05PRVhDRVBUOworI2Vsc2UKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBlcnJvcl9jYXRlZ29yeSgpIF9OT0VYQ0VQVCBfTElCQ1BQX0RFRkFVTFQKKyNlbmRpZgorcHJpdmF0ZToKKyAgICBlcnJvcl9jYXRlZ29yeShjb25zdCBlcnJvcl9jYXRlZ29yeSYpOy8vID0gZGVsZXRlOworICAgIGVycm9yX2NhdGVnb3J5JiBvcGVyYXRvcj0oY29uc3QgZXJyb3JfY2F0ZWdvcnkmKTsvLyA9IGRlbGV0ZTsKKworcHVibGljOgorICAgIHZpcnR1YWwgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IF9OT0VYQ0VQVCA9IDA7CisgICAgdmlydHVhbCBlcnJvcl9jb25kaXRpb24gZGVmYXVsdF9lcnJvcl9jb25kaXRpb24oaW50IF9fZXYpIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICB2aXJ0dWFsIGJvb2wgZXF1aXZhbGVudChpbnQgX19jb2RlLCBjb25zdCBlcnJvcl9jb25kaXRpb24mIF9fY29uZGl0aW9uKSBjb25zdCBfTk9FWENFUFQ7CisgICAgdmlydHVhbCBib29sIGVxdWl2YWxlbnQoY29uc3QgZXJyb3JfY29kZSYgX19jb2RlLCBpbnQgX19jb25kaXRpb24pIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICB2aXJ0dWFsIHN0cmluZyBtZXNzYWdlKGludCBfX2V2KSBjb25zdCA9IDA7CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgZXJyb3JfY2F0ZWdvcnkmIF9fcmhzKSBjb25zdCBfTk9FWENFUFQge3JldHVybiB0aGlzID09ICZfX3Joczt9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgZXJyb3JfY2F0ZWdvcnkmIF9fcmhzKSBjb25zdCBfTk9FWENFUFQge3JldHVybiAhKCp0aGlzID09IF9fcmhzKTt9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBib29sIG9wZXJhdG9yPCAoY29uc3QgZXJyb3JfY2F0ZWdvcnkmIF9fcmhzKSBjb25zdCBfTk9FWENFUFQge3JldHVybiB0aGlzIDwgJl9fcmhzO30KKworICAgIGZyaWVuZCBjbGFzcyBfTElCQ1BQX0hJRERFTiBfX2RvX21lc3NhZ2U7Cit9OworCitjbGFzcyBfTElCQ1BQX0hJRERFTiBfX2RvX21lc3NhZ2UKKyAgICA6IHB1YmxpYyBlcnJvcl9jYXRlZ29yeQoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RyaW5nIG1lc3NhZ2UoaW50IGV2KSBjb25zdDsKK307CisKK19MSUJDUFBfRlVOQ19WSVMgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIGdlbmVyaWNfY2F0ZWdvcnkoKSBfTk9FWENFUFQ7CitfTElCQ1BQX0ZVTkNfVklTIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBzeXN0ZW1fY2F0ZWdvcnkoKSBfTk9FWENFUFQ7CisKK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgZXJyb3JfY29uZGl0aW9uCit7CisgICAgaW50IF9fdmFsXzsKKyAgICBjb25zdCBlcnJvcl9jYXRlZ29yeSogX19jYXRfOworcHVibGljOgorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGVycm9yX2NvbmRpdGlvbigpIF9OT0VYQ0VQVCA6IF9fdmFsXygwKSwgX19jYXRfKCZnZW5lcmljX2NhdGVnb3J5KCkpIHt9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBlcnJvcl9jb25kaXRpb24oaW50IF9fdmFsLCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19jYXQpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fdmFsXyhfX3ZhbCksIF9fY2F0XygmX19jYXQpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0VwPgorICAgICAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICAgICAgZXJyb3JfY29uZGl0aW9uKF9FcCBfX2UsCisgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19lcnJvcl9jb25kaXRpb25fZW51bTxfRXA+Ojp2YWx1ZT46OnR5cGUqID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBfTk9FWENFUFQKKyAgICAgICAgICAgIHsqdGhpcyA9IG1ha2VfZXJyb3JfY29uZGl0aW9uKF9fZSk7fQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgdm9pZCBhc3NpZ24oaW50IF9fdmFsLCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19jYXQpIF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgX192YWxfID0gX192YWw7CisgICAgICAgIF9fY2F0XyA9ICZfX2NhdDsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0VwPgorICAgICAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIGlzX2Vycm9yX2NvbmRpdGlvbl9lbnVtPF9FcD46OnZhbHVlLAorICAgICAgICAgICAgZXJyb3JfY29uZGl0aW9uJgorICAgICAgICA+Ojp0eXBlCisgICAgICAgIG9wZXJhdG9yPShfRXAgX19lKSBfTk9FWENFUFQKKyAgICAgICAgICAgIHsqdGhpcyA9IG1ha2VfZXJyb3JfY29uZGl0aW9uKF9fZSk7IHJldHVybiAqdGhpczt9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICB2b2lkIGNsZWFyKCkgX05PRVhDRVBUCisgICAgeworICAgICAgICBfX3ZhbF8gPSAwOworICAgICAgICBfX2NhdF8gPSAmZ2VuZXJpY19jYXRlZ29yeSgpOworICAgIH0KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGludCB2YWx1ZSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdmFsXzt9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBjb25zdCBlcnJvcl9jYXRlZ29yeSYgY2F0ZWdvcnkoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiAqX19jYXRfO30KKyAgICBzdHJpbmcgbWVzc2FnZSgpIGNvbnN0OworCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgICAgIF9MSUJDUFBfRVhQTElDSVQKKyAgICAgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdmFsXyAhPSAwO30KK307CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitlcnJvcl9jb25kaXRpb24KK21ha2VfZXJyb3JfY29uZGl0aW9uKGVycmMgX19lKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gZXJyb3JfY29uZGl0aW9uKHN0YXRpY19jYXN0PGludD4oX19lKSwgZ2VuZXJpY19jYXRlZ29yeSgpKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPChjb25zdCBlcnJvcl9jb25kaXRpb24mIF9feCwgY29uc3QgZXJyb3JfY29uZGl0aW9uJiBfX3kpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX3guY2F0ZWdvcnkoKSA8IF9feS5jYXRlZ29yeSgpCisgICAgICAgIHx8IChfX3guY2F0ZWdvcnkoKSA9PSBfX3kuY2F0ZWdvcnkoKSAmJiBfX3gudmFsdWUoKSA8IF9feS52YWx1ZSgpKTsKK30KKworLy8gZXJyb3JfY29kZQorCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIGVycm9yX2NvZGUKK3sKKyAgICBpbnQgX192YWxfOworICAgIGNvbnN0IGVycm9yX2NhdGVnb3J5KiBfX2NhdF87CitwdWJsaWM6CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgZXJyb3JfY29kZSgpIF9OT0VYQ0VQVCA6IF9fdmFsXygwKSwgX19jYXRfKCZzeXN0ZW1fY2F0ZWdvcnkoKSkge30KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIGVycm9yX2NvZGUoaW50IF9fdmFsLCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19jYXQpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fdmFsXyhfX3ZhbCksIF9fY2F0XygmX19jYXQpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0VwPgorICAgICAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICAgICAgZXJyb3JfY29kZShfRXAgX19lLAorICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19lcnJvcl9jb2RlX2VudW08X0VwPjo6dmFsdWU+Ojp0eXBlKiA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgX05PRVhDRVBUCisgICAgICAgICAgICB7KnRoaXMgPSBtYWtlX2Vycm9yX2NvZGUoX19lKTt9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICB2b2lkIGFzc2lnbihpbnQgX192YWwsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBfX2NhdCkgX05PRVhDRVBUCisgICAgeworICAgICAgICBfX3ZhbF8gPSBfX3ZhbDsKKyAgICAgICAgX19jYXRfID0gJl9fY2F0OworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXA+CisgICAgICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgaXNfZXJyb3JfY29kZV9lbnVtPF9FcD46OnZhbHVlLAorICAgICAgICAgICAgZXJyb3JfY29kZSYKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBvcGVyYXRvcj0oX0VwIF9fZSkgX05PRVhDRVBUCisgICAgICAgICAgICB7KnRoaXMgPSBtYWtlX2Vycm9yX2NvZGUoX19lKTsgcmV0dXJuICp0aGlzO30KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIHZvaWQgY2xlYXIoKSBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIF9fdmFsXyA9IDA7CisgICAgICAgIF9fY2F0XyA9ICZzeXN0ZW1fY2F0ZWdvcnkoKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBpbnQgdmFsdWUoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3ZhbF87fQorCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIGNhdGVnb3J5KCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gKl9fY2F0Xzt9CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKKyAgICBlcnJvcl9jb25kaXRpb24gZGVmYXVsdF9lcnJvcl9jb25kaXRpb24oKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2NhdF8tPmRlZmF1bHRfZXJyb3JfY29uZGl0aW9uKF9fdmFsXyk7fQorCisgICAgc3RyaW5nIG1lc3NhZ2UoKSBjb25zdDsKKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgICAgICBfTElCQ1BQX0VYUExJQ0lUCisgICAgICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3ZhbF8gIT0gMDt9Cit9OworCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorZXJyb3JfY29kZQorbWFrZV9lcnJvcl9jb2RlKGVycmMgX19lKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gZXJyb3JfY29kZShzdGF0aWNfY2FzdDxpbnQ+KF9fZSksIGdlbmVyaWNfY2F0ZWdvcnkoKSk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjwoY29uc3QgZXJyb3JfY29kZSYgX194LCBjb25zdCBlcnJvcl9jb2RlJiBfX3kpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX3guY2F0ZWdvcnkoKSA8IF9feS5jYXRlZ29yeSgpCisgICAgICAgIHx8IChfX3guY2F0ZWdvcnkoKSA9PSBfX3kuY2F0ZWdvcnkoKSAmJiBfX3gudmFsdWUoKSA8IF9feS52YWx1ZSgpKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgZXJyb3JfY29kZSYgX194LCBjb25zdCBlcnJvcl9jb2RlJiBfX3kpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX3guY2F0ZWdvcnkoKSA9PSBfX3kuY2F0ZWdvcnkoKSAmJiBfX3gudmFsdWUoKSA9PSBfX3kudmFsdWUoKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgZXJyb3JfY29kZSYgX194LCBjb25zdCBlcnJvcl9jb25kaXRpb24mIF9feSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9feC5jYXRlZ29yeSgpLmVxdWl2YWxlbnQoX194LnZhbHVlKCksIF9feSkKKyAgICAgICAgfHwgX195LmNhdGVnb3J5KCkuZXF1aXZhbGVudChfX3gsIF9feS52YWx1ZSgpKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgZXJyb3JfY29uZGl0aW9uJiBfX3gsIGNvbnN0IGVycm9yX2NvZGUmIF9feSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9feSA9PSBfX3g7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcj09KGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX194LCBjb25zdCBlcnJvcl9jb25kaXRpb24mIF9feSkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9feC5jYXRlZ29yeSgpID09IF9feS5jYXRlZ29yeSgpICYmIF9feC52YWx1ZSgpID09IF9feS52YWx1ZSgpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBlcnJvcl9jb2RlJiBfX3gsIGNvbnN0IGVycm9yX2NvZGUmIF9feSkgX05PRVhDRVBUCit7cmV0dXJuICEoX194ID09IF9feSk7fQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBlcnJvcl9jb2RlJiBfX3gsIGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX195KSBfTk9FWENFUFQKK3tyZXR1cm4gIShfX3ggPT0gX195KTt9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX194LCBjb25zdCBlcnJvcl9jb2RlJiBfX3kpIF9OT0VYQ0VQVAore3JldHVybiAhKF9feCA9PSBfX3kpO30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yIT0oY29uc3QgZXJyb3JfY29uZGl0aW9uJiBfX3gsIGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX195KSBfTk9FWENFUFQKK3tyZXR1cm4gIShfX3ggPT0gX195KTt9CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDxlcnJvcl9jb2RlPgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGVycm9yX2NvZGUsIHNpemVfdD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgZXJyb3JfY29kZSYgX19lYykgY29uc3QgX05PRVhDRVBUCisgICAgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX2VjLnZhbHVlKCkpOworICAgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDxlcnJvcl9jb25kaXRpb24+CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248ZXJyb3JfY29uZGl0aW9uLCBzaXplX3Q+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX19lYykgY29uc3QgX05PRVhDRVBUCisgICAgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX2VjLnZhbHVlKCkpOworICAgIH0KK307CisKKy8vIHN5c3RlbV9lcnJvcgorCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIHN5c3RlbV9lcnJvcgorICAgIDogcHVibGljIHJ1bnRpbWVfZXJyb3IKK3sKKyAgICBlcnJvcl9jb2RlIF9fZWNfOworcHVibGljOgorICAgIHN5c3RlbV9lcnJvcihlcnJvcl9jb2RlIF9fZWMsIGNvbnN0IHN0cmluZyYgX193aGF0X2FyZyk7CisgICAgc3lzdGVtX2Vycm9yKGVycm9yX2NvZGUgX19lYywgY29uc3QgY2hhciogX193aGF0X2FyZyk7CisgICAgc3lzdGVtX2Vycm9yKGVycm9yX2NvZGUgX19lYyk7CisgICAgc3lzdGVtX2Vycm9yKGludCBfX2V2LCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19lY2F0LCBjb25zdCBzdHJpbmcmIF9fd2hhdF9hcmcpOworICAgIHN5c3RlbV9lcnJvcihpbnQgX19ldiwgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIF9fZWNhdCwgY29uc3QgY2hhciogX193aGF0X2FyZyk7CisgICAgc3lzdGVtX2Vycm9yKGludCBfX2V2LCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19lY2F0KTsKKyAgICB+c3lzdGVtX2Vycm9yKCkgX05PRVhDRVBUOworCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgY29uc3QgZXJyb3JfY29kZSYgY29kZSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fZWNfO30KKworcHJpdmF0ZToKKyAgICBzdGF0aWMgc3RyaW5nIF9faW5pdChjb25zdCBlcnJvcl9jb2RlJiwgc3RyaW5nKTsKK307CisKK19MSUJDUFBfTk9SRVRVUk4gX0xJQkNQUF9GVU5DX1ZJUwordm9pZCBfX3Rocm93X3N5c3RlbV9lcnJvcihpbnQgZXYsIGNvbnN0IGNoYXIqIHdoYXRfYXJnKTsKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCisjZW5kaWYgIC8vIF9MSUJDUFBfU1lTVEVNX0VSUk9SCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvdGdtYXRoLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvdGdtYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhODc0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS90Z21hdGguaApAQCAtMCwwICsxLDM3IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0Z21hdGguaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX1RHTUFUSF9ICisjZGVmaW5lIF9MSUJDUFBfVEdNQVRIX0gKKworLyoKKyAgICB0Z21hdGguaCBzeW5vcHNpcworCisjaW5jbHVkZSA8Y3RnbWF0aD4KKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKyNpbmNsdWRlIDxjdGdtYXRoPgorCisjZWxzZSAgLy8gX19jcGx1c3BsdXMKKworI2luY2x1ZGVfbmV4dCA8dGdtYXRoLmg+CisKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmICAvLyBfTElCQ1BQX1RHTUFUSF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvdGhyZWFkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3RocmVhZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjI5ZDcwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3RocmVhZApAQCAtMCwwICsxLDQ4NCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRocmVhZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9USFJFQUQKKyNkZWZpbmUgX0xJQkNQUF9USFJFQUQKKworLyoKKworICAgIHRocmVhZCBzeW5vcHNpcworCisjZGVmaW5lIF9fU1REQ1BQX1RIUkVBRFNfXyBfX2NwbHVzcGx1cworCituYW1lc3BhY2Ugc3RkCit7CisKK2NsYXNzIHRocmVhZAoreworcHVibGljOgorICAgIGNsYXNzIGlkOworICAgIHR5cGVkZWYgcHRocmVhZF90IG5hdGl2ZV9oYW5kbGVfdHlwZTsKKworICAgIHRocmVhZCgpIG5vZXhjZXB0OworICAgIHRlbXBsYXRlIDxjbGFzcyBGLCBjbGFzcyAuLi5BcmdzPiBleHBsaWNpdCB0aHJlYWQoRiYmIGYsIEFyZ3MmJi4uLiBhcmdzKTsKKyAgICB+dGhyZWFkKCk7CisKKyAgICB0aHJlYWQoY29uc3QgdGhyZWFkJikgPSBkZWxldGU7CisgICAgdGhyZWFkKHRocmVhZCYmIHQpIG5vZXhjZXB0OworCisgICAgdGhyZWFkJiBvcGVyYXRvcj0oY29uc3QgdGhyZWFkJikgPSBkZWxldGU7CisgICAgdGhyZWFkJiBvcGVyYXRvcj0odGhyZWFkJiYgdCkgbm9leGNlcHQ7CisKKyAgICB2b2lkIHN3YXAodGhyZWFkJiB0KSBub2V4Y2VwdDsKKworICAgIGJvb2wgam9pbmFibGUoKSBjb25zdCBub2V4Y2VwdDsKKyAgICB2b2lkIGpvaW4oKTsKKyAgICB2b2lkIGRldGFjaCgpOworICAgIGlkIGdldF9pZCgpIGNvbnN0IG5vZXhjZXB0OworICAgIG5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlKCk7CisKKyAgICBzdGF0aWMgdW5zaWduZWQgaGFyZHdhcmVfY29uY3VycmVuY3koKSBub2V4Y2VwdDsKK307CisKK3ZvaWQgc3dhcCh0aHJlYWQmIHgsIHRocmVhZCYgeSkgbm9leGNlcHQ7CisKK2NsYXNzIHRocmVhZDo6aWQKK3sKK3B1YmxpYzoKKyAgICBpZCgpIG5vZXhjZXB0OworfTsKKworYm9vbCBvcGVyYXRvcj09KHRocmVhZDo6aWQgeCwgdGhyZWFkOjppZCB5KSBub2V4Y2VwdDsKK2Jvb2wgb3BlcmF0b3IhPSh0aHJlYWQ6OmlkIHgsIHRocmVhZDo6aWQgeSkgbm9leGNlcHQ7Citib29sIG9wZXJhdG9yPCAodGhyZWFkOjppZCB4LCB0aHJlYWQ6OmlkIHkpIG5vZXhjZXB0OworYm9vbCBvcGVyYXRvcjw9KHRocmVhZDo6aWQgeCwgdGhyZWFkOjppZCB5KSBub2V4Y2VwdDsKK2Jvb2wgb3BlcmF0b3I+ICh0aHJlYWQ6OmlkIHgsIHRocmVhZDo6aWQgeSkgbm9leGNlcHQ7Citib29sIG9wZXJhdG9yPj0odGhyZWFkOjppZCB4LCB0aHJlYWQ6OmlkIHkpIG5vZXhjZXB0OworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYgb3V0LCB0aHJlYWQ6OmlkIGlkKTsKKworbmFtZXNwYWNlIHRoaXNfdGhyZWFkCit7CisKK3RocmVhZDo6aWQgZ2V0X2lkKCkgbm9leGNlcHQ7CisKK3ZvaWQgeWllbGQoKSBub2V4Y2VwdDsKKwordGVtcGxhdGUgPGNsYXNzIENsb2NrLCBjbGFzcyBEdXJhdGlvbj4KK3ZvaWQgc2xlZXBfdW50aWwoY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PENsb2NrLCBEdXJhdGlvbj4mIGFic190aW1lKTsKKwordGVtcGxhdGUgPGNsYXNzIFJlcCwgY2xhc3MgUGVyaW9kPgordm9pZCBzbGVlcF9mb3IoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxSZXAsIFBlcmlvZD4mIHJlbF90aW1lKTsKKworfSAgLy8gdGhpc190aHJlYWQKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8X19mdW5jdGlvbmFsX2Jhc2U+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPF9fbXV0ZXhfYmFzZT4KKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisjaW5jbHVkZSA8dHVwbGU+CisjZW5kaWYKKyNpbmNsdWRlIDxfX3RocmVhZGluZ19zdXBwb3J0PgorI2luY2x1ZGUgPF9fZGVidWc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX1BVU0hfTUFDUk9TCisjaW5jbHVkZSA8X191bmRlZl9tYWNyb3M+CisKKyNkZWZpbmUgX19TVERDUFBfVEhSRUFEU19fIF9fY3BsdXNwbHVzCisKKyNpZmRlZiBfTElCQ1BQX0hBU19OT19USFJFQURTCisjZXJyb3IgPHRocmVhZD4gaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHNpbmdsZSB0aHJlYWRlZCBzeXN0ZW0KKyNlbHNlIC8vICFfTElCQ1BQX0hBU19OT19USFJFQURTCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBjbGFzcyBfX3RocmVhZF9zcGVjaWZpY19wdHI7CitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIF9fdGhyZWFkX3N0cnVjdDsKK2NsYXNzIF9MSUJDUFBfSElEREVOIF9fdGhyZWFkX3N0cnVjdF9pbXA7CitjbGFzcyBfX2Fzc29jX3N1Yl9zdGF0ZTsKKworX0xJQkNQUF9GVU5DX1ZJUyBfX3RocmVhZF9zcGVjaWZpY19wdHI8X190aHJlYWRfc3RydWN0PiYgX190aHJlYWRfbG9jYWxfZGF0YSgpOworCitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIF9fdGhyZWFkX3N0cnVjdAoreworICAgIF9fdGhyZWFkX3N0cnVjdF9pbXAqIF9fcF87CisKKyAgICBfX3RocmVhZF9zdHJ1Y3QoY29uc3QgX190aHJlYWRfc3RydWN0Jik7CisgICAgX190aHJlYWRfc3RydWN0JiBvcGVyYXRvcj0oY29uc3QgX190aHJlYWRfc3RydWN0Jik7CitwdWJsaWM6CisgICAgX190aHJlYWRfc3RydWN0KCk7CisgICAgfl9fdGhyZWFkX3N0cnVjdCgpOworCisgICAgdm9pZCBub3RpZnlfYWxsX2F0X3RocmVhZF9leGl0KGNvbmRpdGlvbl92YXJpYWJsZSosIG11dGV4Kik7CisgICAgdm9pZCBfX21ha2VfcmVhZHlfYXRfdGhyZWFkX2V4aXQoX19hc3NvY19zdWJfc3RhdGUqKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjbGFzcyBfX3RocmVhZF9zcGVjaWZpY19wdHIKK3sKKyAgICBfX2xpYmNwcF90bHNfa2V5IF9fa2V5XzsKKworICAgICAvLyBPbmx5IF9fdGhyZWFkX2xvY2FsX2RhdGEoKSBtYXkgY29uc3RydWN0IGEgX190aHJlYWRfc3BlY2lmaWNfcHRyCisgICAgIC8vIGFuZCBvbmx5IHdpdGggX1RwID09IF9fdGhyZWFkX3N0cnVjdC4KKyAgICBzdGF0aWNfYXNzZXJ0KChpc19zYW1lPF9UcCwgX190aHJlYWRfc3RydWN0Pjo6dmFsdWUpLCAiIik7CisgICAgX190aHJlYWRfc3BlY2lmaWNfcHRyKCk7CisgICAgZnJpZW5kIF9MSUJDUFBfRlVOQ19WSVMgX190aHJlYWRfc3BlY2lmaWNfcHRyPF9fdGhyZWFkX3N0cnVjdD4mIF9fdGhyZWFkX2xvY2FsX2RhdGEoKTsKKworICAgIF9fdGhyZWFkX3NwZWNpZmljX3B0cihjb25zdCBfX3RocmVhZF9zcGVjaWZpY19wdHImKTsKKyAgICBfX3RocmVhZF9zcGVjaWZpY19wdHImIG9wZXJhdG9yPShjb25zdCBfX3RocmVhZF9zcGVjaWZpY19wdHImKTsKKworICAgIHN0YXRpYyB2b2lkIF9MSUJDUFBfVExTX0RFU1RSVUNUT1JfQ0MgX19hdF90aHJlYWRfZXhpdCh2b2lkKik7CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9UcCogcG9pbnRlcjsKKworICAgIH5fX3RocmVhZF9zcGVjaWZpY19wdHIoKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwb2ludGVyIGdldCgpIGNvbnN0IHtyZXR1cm4gc3RhdGljX2Nhc3Q8X1RwKj4oX19saWJjcHBfdGxzX2dldChfX2tleV8pKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBvaW50ZXIgb3BlcmF0b3IqKCkgY29uc3Qge3JldHVybiAqZ2V0KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7cmV0dXJuIGdldCgpO30KKyAgICB2b2lkIHNldF9wb2ludGVyKHBvaW50ZXIgX19wKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit2b2lkIF9MSUJDUFBfVExTX0RFU1RSVUNUT1JfQ0MKK19fdGhyZWFkX3NwZWNpZmljX3B0cjxfVHA+OjpfX2F0X3RocmVhZF9leGl0KHZvaWQqIF9fcCkKK3sKKyAgICBkZWxldGUgc3RhdGljX2Nhc3Q8cG9pbnRlcj4oX19wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19fdGhyZWFkX3NwZWNpZmljX3B0cjxfVHA+OjpfX3RocmVhZF9zcGVjaWZpY19wdHIoKQoreworICBpbnQgX19lYyA9CisgICAgICBfX2xpYmNwcF90bHNfY3JlYXRlKCZfX2tleV8sICZfX3RocmVhZF9zcGVjaWZpY19wdHI6Ol9fYXRfdGhyZWFkX2V4aXQpOworICBpZiAoX19lYykKKyAgICBfX3Rocm93X3N5c3RlbV9lcnJvcihfX2VjLCAiX190aHJlYWRfc3BlY2lmaWNfcHRyIGNvbnN0cnVjdGlvbiBmYWlsZWQiKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19fdGhyZWFkX3NwZWNpZmljX3B0cjxfVHA+Ojp+X190aHJlYWRfc3BlY2lmaWNfcHRyKCkKK3sKKyAgICAvLyBfX3RocmVhZF9zcGVjaWZpY19wdHIgaXMgb25seSBjcmVhdGVkIHdpdGggYSBzdGF0aWMgc3RvcmFnZSBkdXJhdGlvbgorICAgIC8vIHNvIHRoaXMgZGVzdHJ1Y3RvciBpcyBvbmx5IGludm9rZWQgZHVyaW5nIHByb2dyYW0gdGVybWluYXRpb24uIEludm9raW5nCisgICAgLy8gcHRocmVhZF9rZXlfZGVsZXRlKF9fa2V5XykgbWF5IHByZXZlbnQgb3RoZXIgdGhyZWFkcyBmcm9tIGRlbGV0aW5nIHRoZWlyCisgICAgLy8gdGhyZWFkIGxvY2FsIGRhdGEuIEZvciB0aGlzIHJlYXNvbiB3ZSBsZWFrIHRoZSBrZXkuCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit2b2lkCitfX3RocmVhZF9zcGVjaWZpY19wdHI8X1RwPjo6c2V0X3BvaW50ZXIocG9pbnRlciBfX3ApCit7CisgICAgX0xJQkNQUF9BU1NFUlQoZ2V0KCkgPT0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGluZyB0byBvdmVyd3JpdGUgdGhyZWFkIGxvY2FsIGRhdGEiKTsKKyAgICBfX2xpYmNwcF90bHNfc2V0KF9fa2V5XywgX19wKTsKK30KKworY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyB0aHJlYWQ7CitjbGFzcyBfTElCQ1BQX1RZUEVfVklTIF9fdGhyZWFkX2lkOworCituYW1lc3BhY2UgdGhpc190aHJlYWQKK3sKKworX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX3RocmVhZF9pZCBnZXRfaWQoKSBfTk9FWENFUFQ7CisKK30gIC8vIHRoaXNfdGhyZWFkCisKK3RlbXBsYXRlPD4gc3RydWN0IGhhc2g8X190aHJlYWRfaWQ+OworCitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX3RocmVhZF9pZAoreworICAgIC8vIEZJWE1FOiBwdGhyZWFkX3QgaXMgYSBwb2ludGVyIG9uIERhcndpbiBidXQgYSBsb25nIG9uIExpbnV4LgorICAgIC8vIE5VTEwgaXMgdGhlIG5vLXRocmVhZCB2YWx1ZSBvbiBEYXJ3aW4uICBTb21lb25lIG5lZWRzIHRvIGNoZWNrCisgICAgLy8gb24gb3RoZXIgcGxhdGZvcm1zLiAgV2UgYXNzdW1lIDAgd29ya3MgZXZlcnl3aGVyZSBmb3Igbm93LgorICAgIF9fbGliY3BwX3RocmVhZF9pZCBfX2lkXzsKKworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3RocmVhZF9pZCgpIF9OT0VYQ0VQVCA6IF9faWRfKDApIHt9CisKKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yPT0oX190aHJlYWRfaWQgX194LCBfX3RocmVhZF9pZCBfX3kpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fbGliY3BwX3RocmVhZF9pZF9lcXVhbChfX3guX19pZF8sIF9feS5fX2lkXyk7fQorICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShfX3RocmVhZF9pZCBfX3gsIF9fdGhyZWFkX2lkIF9feSkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gIShfX3ggPT0gX195KTt9CisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvcjwgKF9fdGhyZWFkX2lkIF9feCwgX190aHJlYWRfaWQgX195KSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiAgX19saWJjcHBfdGhyZWFkX2lkX2xlc3MoX194Ll9faWRfLCBfX3kuX19pZF8pO30KKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yPD0oX190aHJlYWRfaWQgX194LCBfX3RocmVhZF9pZCBfX3kpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuICEoX195IDwgX194KTt9CisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvcj4gKF9fdGhyZWFkX2lkIF9feCwgX190aHJlYWRfaWQgX195KSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiAgIF9feSA8IF9feCA7fQorICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgb3BlcmF0b3I+PShfX3RocmVhZF9pZCBfX3gsIF9fdGhyZWFkX2lkIF9feSkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gIShfX3ggPCBfX3kpO30KKworICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICBmcmllbmQKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBfX3RocmVhZF9pZCBfX2lkKQorICAgICAgICB7cmV0dXJuIF9fb3MgPDwgX19pZC5fX2lkXzt9CisKK3ByaXZhdGU6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fdGhyZWFkX2lkKF9fbGliY3BwX3RocmVhZF9pZCBfX2lkKSA6IF9faWRfKF9faWQpIHt9CisKKyAgICBmcmllbmQgX190aHJlYWRfaWQgdGhpc190aHJlYWQ6OmdldF9pZCgpIF9OT0VYQ0VQVDsKKyAgICBmcmllbmQgY2xhc3MgX0xJQkNQUF9UWVBFX1ZJUyB0aHJlYWQ7CisgICAgZnJpZW5kIHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBoYXNoPF9fdGhyZWFkX2lkPjsKK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBoYXNoPF9fdGhyZWFkX2lkPgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9fdGhyZWFkX2lkLCBzaXplX3Q+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBvcGVyYXRvcigpKF9fdGhyZWFkX2lkIF9fdikgY29uc3QgX05PRVhDRVBUCisgICAgeworICAgICAgICByZXR1cm4gaGFzaDxfX2xpYmNwcF90aHJlYWRfaWQ+KCkoX192Ll9faWRfKTsKKyAgICB9Cit9OworCituYW1lc3BhY2UgdGhpc190aHJlYWQKK3sKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19fdGhyZWFkX2lkCitnZXRfaWQoKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19saWJjcHBfdGhyZWFkX2dldF9jdXJyZW50X2lkKCk7Cit9CisKK30gIC8vIHRoaXNfdGhyZWFkCisKK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgdGhyZWFkCit7CisgICAgX19saWJjcHBfdGhyZWFkX3QgX190XzsKKworICAgIHRocmVhZChjb25zdCB0aHJlYWQmKTsKKyAgICB0aHJlYWQmIG9wZXJhdG9yPShjb25zdCB0aHJlYWQmKTsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9fdGhyZWFkX2lkIGlkOworICAgIHR5cGVkZWYgX19saWJjcHBfdGhyZWFkX3QgbmF0aXZlX2hhbmRsZV90eXBlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHRocmVhZCgpIF9OT0VYQ0VQVCA6IF9fdF8oX0xJQkNQUF9OVUxMX1RIUkVBRCkge30KKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MgLi4uX0FyZ3MsCisgICAgICAgICAgICAgIGNsYXNzID0gdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICAgICAhaXNfc2FtZTx0eXBlbmFtZSBfX3VuY3ZyZWY8X0ZwPjo6dHlwZSwgdGhyZWFkPjo6dmFsdWUKKyAgICAgICAgICAgICAgPjo6dHlwZQorICAgICAgICAgICAgID4KKyAgICAgICAgX0xJQkNQUF9NRVRIT0RfVEVNUExBVEVfSU1QTElDSVRfSU5TVEFOVElBVElPTl9WSVMKKyAgICAgICAgZXhwbGljaXQgdGhyZWFkKF9GcCYmIF9fZiwgX0FyZ3MmJi4uLiBfX2FyZ3MpOworI2Vsc2UgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHRlbXBsYXRlIDxjbGFzcyBfRnA+CisgICAgX0xJQkNQUF9NRVRIT0RfVEVNUExBVEVfSU1QTElDSVRfSU5TVEFOVElBVElPTl9WSVMKKyAgICBleHBsaWNpdCB0aHJlYWQoX0ZwIF9fZik7CisjZW5kaWYKKyAgICB+dGhyZWFkKCk7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHRocmVhZCh0aHJlYWQmJiBfX3QpIF9OT0VYQ0VQVCA6IF9fdF8oX190Ll9fdF8pIHtfX3QuX190XyA9IF9MSUJDUFBfTlVMTF9USFJFQUQ7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0aHJlYWQmIG9wZXJhdG9yPSh0aHJlYWQmJiBfX3QpIF9OT0VYQ0VQVDsKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKHRocmVhZCYgX190KSBfTk9FWENFUFQge19WU1REOjpzd2FwKF9fdF8sIF9fdC5fX3RfKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBqb2luYWJsZSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuICFfX2xpYmNwcF90aHJlYWRfaXNudWxsKCZfX3RfKTt9CisgICAgdm9pZCBqb2luKCk7CisgICAgdm9pZCBkZXRhY2goKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaWQgZ2V0X2lkKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX19saWJjcHBfdGhyZWFkX2dldF9pZCgmX190Xyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZSgpIF9OT0VYQ0VQVCB7cmV0dXJuIF9fdF87fQorCisgICAgc3RhdGljIHVuc2lnbmVkIGhhcmR3YXJlX2NvbmN1cnJlbmN5KCkgX05PRVhDRVBUOworfTsKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UU3AsIGNsYXNzIF9GcCwgY2xhc3MgLi4uX0FyZ3MsIHNpemVfdCAuLi5fSW5kaWNlcz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitfX3RocmVhZF9leGVjdXRlKHR1cGxlPF9UU3AsIF9GcCwgX0FyZ3MuLi4+JiBfX3QsIF9fdHVwbGVfaW5kaWNlczxfSW5kaWNlcy4uLj4pCit7CisgICAgX19pbnZva2UoX1ZTVEQ6Om1vdmUoX1ZTVEQ6OmdldDwxPihfX3QpKSwgX1ZTVEQ6Om1vdmUoX1ZTVEQ6OmdldDxfSW5kaWNlcz4oX190KSkuLi4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwPgordm9pZCogX190aHJlYWRfcHJveHkodm9pZCogX192cCkKK3sKKyAgICAvLyBfRnAgPSBzdGQ6OnR1cGxlPCB1bmlxdWVfcHRyPF9fdGhyZWFkX3N0cnVjdD4sIEZ1bmN0b3IsIEFyZ3MuLi4+CisgICAgc3RkOjp1bmlxdWVfcHRyPF9GcD4gX19wKHN0YXRpY19jYXN0PF9GcCo+KF9fdnApKTsKKyAgICBfX3RocmVhZF9sb2NhbF9kYXRhKCkuc2V0X3BvaW50ZXIoX1ZTVEQ6OmdldDwwPigqX19wKS5yZWxlYXNlKCkpOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19tYWtlX3R1cGxlX2luZGljZXM8dHVwbGVfc2l6ZTxfRnA+Ojp2YWx1ZSwgMj46OnR5cGUgX0luZGV4OworICAgIF9fdGhyZWFkX2V4ZWN1dGUoKl9fcCwgX0luZGV4KCkpOworICAgIHJldHVybiBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcyAuLi5fQXJncywKKyAgICAgICAgICBjbGFzcworICAgICAgICAgPgordGhyZWFkOjp0aHJlYWQoX0ZwJiYgX19mLCBfQXJncyYmLi4uIF9fYXJncykKK3sKKyAgICB0eXBlZGVmIHVuaXF1ZV9wdHI8X190aHJlYWRfc3RydWN0PiBfVFNQdHI7CisgICAgX1RTUHRyIF9fdHNwKG5ldyBfX3RocmVhZF9zdHJ1Y3QpOworICAgIHR5cGVkZWYgdHVwbGU8X1RTUHRyLCB0eXBlbmFtZSBkZWNheTxfRnA+Ojp0eXBlLCB0eXBlbmFtZSBkZWNheTxfQXJncz46OnR5cGUuLi4+IF9HcDsKKyAgICBfVlNURDo6dW5pcXVlX3B0cjxfR3A+IF9fcCgKKyAgICAgICAgICAgIG5ldyBfR3Aoc3RkOjptb3ZlKF9fdHNwKSwKKyAgICAgICAgICAgICAgICAgICAgX19kZWNheV9jb3B5KF9WU1REOjpmb3J3YXJkPF9GcD4oX19mKSksCisgICAgICAgICAgICAgICAgICAgIF9fZGVjYXlfY29weShfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKSkuLi4pKTsKKyAgICBpbnQgX19lYyA9IF9fbGliY3BwX3RocmVhZF9jcmVhdGUoJl9fdF8sICZfX3RocmVhZF9wcm94eTxfR3A+LCBfX3AuZ2V0KCkpOworICAgIGlmIChfX2VjID09IDApCisgICAgICAgIF9fcC5yZWxlYXNlKCk7CisgICAgZWxzZQorICAgICAgICBfX3Rocm93X3N5c3RlbV9lcnJvcihfX2VjLCAidGhyZWFkIGNvbnN0cnVjdG9yIGZhaWxlZCIpOworfQorCitpbmxpbmUKK3RocmVhZCYKK3RocmVhZDo6b3BlcmF0b3I9KHRocmVhZCYmIF9fdCkgX05PRVhDRVBUCit7CisgICAgaWYgKCFfX2xpYmNwcF90aHJlYWRfaXNudWxsKCZfX3RfKSkKKyAgICAgICAgdGVybWluYXRlKCk7CisgICAgX190XyA9IF9fdC5fX3RfOworICAgIF9fdC5fX3RfID0gX0xJQkNQUF9OVUxMX1RIUkVBRDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKyNlbHNlICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9GcD4KK3N0cnVjdCBfX3RocmVhZF9pbnZva2VfcGFpciB7CisgICAgLy8gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcGFzcyBtZW1vcnkgZm9yIHRocmVhZCBsb2NhbCBzdG9yYWdlIGFuZCBhIGZ1bmN0b3IKKyAgICAvLyB0byBhIG5ld2x5IGNyZWF0ZWQgdGhyZWFkIGJlY2F1c2Ugc3RkOjpwYWlyIGRvZXNuJ3Qgd29yayB3aXRoCisgICAgLy8gc3RkOjp1bmlxdWVfcHRyIGluIEMrKzAzLgorICAgIF9fdGhyZWFkX2ludm9rZV9wYWlyKF9GcCYgX19mKSA6IF9fdHNwXyhuZXcgX190aHJlYWRfc3RydWN0KSwgX19mbl8oX19mKSB7fQorICAgIHVuaXF1ZV9wdHI8X190aHJlYWRfc3RydWN0PiBfX3RzcF87CisgICAgX0ZwIF9fZm5fOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9GcD4KK3ZvaWQqIF9fdGhyZWFkX3Byb3h5X2N4eDAzKHZvaWQqIF9fdnApCit7CisgICAgc3RkOjp1bmlxdWVfcHRyPF9GcD4gX19wKHN0YXRpY19jYXN0PF9GcCo+KF9fdnApKTsKKyAgICBfX3RocmVhZF9sb2NhbF9kYXRhKCkuc2V0X3BvaW50ZXIoX19wLT5fX3RzcF8ucmVsZWFzZSgpKTsKKyAgICAoX19wLT5fX2ZuXykoKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9GcD4KK3RocmVhZDo6dGhyZWFkKF9GcCBfX2YpCit7CisKKyAgICB0eXBlZGVmIF9fdGhyZWFkX2ludm9rZV9wYWlyPF9GcD4gX0ludm9rZVBhaXI7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9wdHI8X0ludm9rZVBhaXI+IF9QYWlyUHRyOworICAgIF9QYWlyUHRyIF9fcHAobmV3IF9JbnZva2VQYWlyKF9fZikpOworICAgIGludCBfX2VjID0gX19saWJjcHBfdGhyZWFkX2NyZWF0ZSgmX190XywgJl9fdGhyZWFkX3Byb3h5X2N4eDAzPF9JbnZva2VQYWlyPiwgX19wcC5nZXQoKSk7CisgICAgaWYgKF9fZWMgPT0gMCkKKyAgICAgICAgX19wcC5yZWxlYXNlKCk7CisgICAgZWxzZQorICAgICAgICBfX3Rocm93X3N5c3RlbV9lcnJvcihfX2VjLCAidGhyZWFkIGNvbnN0cnVjdG9yIGZhaWxlZCIpOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCBzd2FwKHRocmVhZCYgX194LCB0aHJlYWQmIF9feSkgX05PRVhDRVBUIHtfX3guc3dhcChfX3kpO30KKworbmFtZXNwYWNlIHRoaXNfdGhyZWFkCit7CisKK19MSUJDUFBfRlVOQ19WSVMgdm9pZCBzbGVlcF9mb3IoY29uc3QgY2hyb25vOjpuYW5vc2Vjb25kcyYgX19ucyk7CisKK3RlbXBsYXRlIDxjbGFzcyBfUmVwLCBjbGFzcyBfUGVyaW9kPgordm9pZAorc2xlZXBfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fZCkKK3sKKyAgICB1c2luZyBuYW1lc3BhY2UgY2hyb25vOworICAgIGlmIChfX2QgPiBkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPjo6emVybygpKQorICAgIHsKKyAgICAgICAgX0xJQkNQUF9DT05TVEVYUFIgZHVyYXRpb248bG9uZyBkb3VibGU+IF9NYXggPSBuYW5vc2Vjb25kczo6bWF4KCk7CisgICAgICAgIG5hbm9zZWNvbmRzIF9fbnM7CisgICAgICAgIGlmIChfX2QgPCBfTWF4KQorICAgICAgICB7CisgICAgICAgICAgICBfX25zID0gZHVyYXRpb25fY2FzdDxuYW5vc2Vjb25kcz4oX19kKTsKKyAgICAgICAgICAgIGlmIChfX25zIDwgX19kKQorICAgICAgICAgICAgICAgICsrX19uczsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBfX25zID0gbmFub3NlY29uZHM6Om1heCgpOworICAgICAgICBzbGVlcF9mb3IoX19ucyk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0Nsb2NrLCBjbGFzcyBfRHVyYXRpb24+Cit2b2lkCitzbGVlcF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX3QpCit7CisgICAgdXNpbmcgbmFtZXNwYWNlIGNocm9ubzsKKyAgICBtdXRleCBfX211dDsKKyAgICBjb25kaXRpb25fdmFyaWFibGUgX19jdjsKKyAgICB1bmlxdWVfbG9jazxtdXRleD4gX19sayhfX211dCk7CisgICAgd2hpbGUgKF9DbG9jazo6bm93KCkgPCBfX3QpCisgICAgICAgIF9fY3Yud2FpdF91bnRpbChfX2xrLCBfX3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0R1cmF0aW9uPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3NsZWVwX3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxjaHJvbm86OnN0ZWFkeV9jbG9jaywgX0R1cmF0aW9uPiYgX190KQoreworICAgIHVzaW5nIG5hbWVzcGFjZSBjaHJvbm87CisgICAgc2xlZXBfZm9yKF9fdCAtIHN0ZWFkeV9jbG9jazo6bm93KCkpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCB5aWVsZCgpIF9OT0VYQ0VQVCB7X19saWJjcHBfdGhyZWFkX3lpZWxkKCk7fQorCit9ICAvLyB0aGlzX3RocmVhZAorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKKyNlbmRpZiAvLyAhX0xJQkNQUF9IQVNfTk9fVEhSRUFEUworCitfTElCQ1BQX1BPUF9NQUNST1MKKworI2VuZGlmICAvLyBfTElCQ1BQX1RIUkVBRApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3R1cGxlIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3R1cGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYTE3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvdHVwbGUKQEAgLTAsMCArMSwxNDEyIEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHVwbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX1RVUExFCisjZGVmaW5lIF9MSUJDUFBfVFVQTEUKKworLyoKKyAgICB0dXBsZSBzeW5vcHNpcworCituYW1lc3BhY2Ugc3RkCit7CisKK3RlbXBsYXRlIDxjbGFzcy4uLiBUPgorY2xhc3MgdHVwbGUgeworcHVibGljOgorICAgIGNvbnN0ZXhwciB0dXBsZSgpOworICAgIGV4cGxpY2l0IHR1cGxlKGNvbnN0IFQmLi4uKTsgIC8vIGNvbnN0ZXhwciBpbiBDKysxNAorICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBVPgorICAgICAgICBleHBsaWNpdCB0dXBsZShVJiYuLi4pOyAgLy8gY29uc3RleHByIGluIEMrKzE0CisgICAgdHVwbGUoY29uc3QgdHVwbGUmKSA9IGRlZmF1bHQ7CisgICAgdHVwbGUodHVwbGUmJikgPSBkZWZhdWx0OworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBVPgorICAgICAgICB0dXBsZShjb25zdCB0dXBsZTxVLi4uPiYpOyAgLy8gY29uc3RleHByIGluIEMrKzE0CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIFU+CisgICAgICAgIHR1cGxlKHR1cGxlPFUuLi4+JiYpOyAgLy8gY29uc3RleHByIGluIEMrKzE0CisgICAgdGVtcGxhdGUgPGNsYXNzIFUxLCBjbGFzcyBVMj4KKyAgICAgICAgdHVwbGUoY29uc3QgcGFpcjxVMSwgVTI+Jik7IC8vIGlmZiBzaXplb2YuLi4oVCkgPT0gMiAvLyBjb25zdGV4cHIgaW4gQysrMTQKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVTEsIGNsYXNzIFUyPgorICAgICAgICB0dXBsZShwYWlyPFUxLCBVMj4mJik7IC8vIGlmZiBzaXplb2YuLi4oVCkgPT0gMiAgLy8gY29uc3RleHByIGluIEMrKzE0CisKKyAgICAvLyBhbGxvY2F0b3ItZXh0ZW5kZWQgY29uc3RydWN0b3JzCisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jPgorICAgICAgICB0dXBsZShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IEFsbG9jJiBhKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgQWxsb2M+CisgICAgICAgIHR1cGxlKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgQWxsb2MmIGEsIGNvbnN0IFQmLi4uKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgQWxsb2MsIGNsYXNzLi4uIFU+CisgICAgICAgIHR1cGxlKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgQWxsb2MmIGEsIFUmJi4uLik7CisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jPgorICAgICAgICB0dXBsZShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IEFsbG9jJiBhLCBjb25zdCB0dXBsZSYpOworICAgIHRlbXBsYXRlIDxjbGFzcyBBbGxvYz4KKyAgICAgICAgdHVwbGUoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBBbGxvYyYgYSwgdHVwbGUmJik7CisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jLCBjbGFzcy4uLiBVPgorICAgICAgICB0dXBsZShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IEFsbG9jJiBhLCBjb25zdCB0dXBsZTxVLi4uPiYpOworICAgIHRlbXBsYXRlIDxjbGFzcyBBbGxvYywgY2xhc3MuLi4gVT4KKyAgICAgICAgdHVwbGUoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBBbGxvYyYgYSwgdHVwbGU8VS4uLj4mJik7CisgICAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jLCBjbGFzcyBVMSwgY2xhc3MgVTI+CisgICAgICAgIHR1cGxlKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgQWxsb2MmIGEsIGNvbnN0IHBhaXI8VTEsIFUyPiYpOworICAgIHRlbXBsYXRlIDxjbGFzcyBBbGxvYywgY2xhc3MgVTEsIGNsYXNzIFUyPgorICAgICAgICB0dXBsZShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IEFsbG9jJiBhLCBwYWlyPFUxLCBVMj4mJik7CisKKyAgICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJik7CisgICAgdHVwbGUmCisgICAgICAgIG9wZXJhdG9yPSh0dXBsZSYmKSBub2V4Y2VwdChBTkQoaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8VD46OnZhbHVlIC4uLikpOworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBVPgorICAgICAgICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlPFUuLi4+Jik7CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIFU+CisgICAgICAgIHR1cGxlJiBvcGVyYXRvcj0odHVwbGU8VS4uLj4mJik7CisgICAgdGVtcGxhdGUgPGNsYXNzIFUxLCBjbGFzcyBVMj4KKyAgICAgICAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBwYWlyPFUxLCBVMj4mKTsgLy8gaWZmIHNpemVvZi4uLihUKSA9PSAyCisgICAgdGVtcGxhdGUgPGNsYXNzIFUxLCBjbGFzcyBVMj4KKyAgICAgICAgdHVwbGUmIG9wZXJhdG9yPShwYWlyPFUxLCBVMj4mJik7IC8vaWZmc2l6ZW9mLi4uKFQpID09IDIKKworICAgIHZvaWQgc3dhcCh0dXBsZSYpIG5vZXhjZXB0KEFORChzd2FwKGRlY2x2YWw8VCY+KCksIGRlY2x2YWw8VCY+KCkpLi4uKSk7Cit9OworCitpbmxpbmUgY29uc3RleHByIHVuc3BlY2lmaWVkIGlnbm9yZTsKKwordGVtcGxhdGUgPGNsYXNzLi4uIFQ+IHR1cGxlPFYuLi4+ICBtYWtlX3R1cGxlKFQmJi4uLik7IC8vIGNvbnN0ZXhwciBpbiBDKysxNAordGVtcGxhdGUgPGNsYXNzLi4uIFQ+IHR1cGxlPEFUeXBlcy4uLj4gZm9yd2FyZF9hc190dXBsZShUJiYuLi4pIG5vZXhjZXB0OyAvLyBjb25zdGV4cHIgaW4gQysrMTQKK3RlbXBsYXRlIDxjbGFzcy4uLiBUPiB0dXBsZTxUJi4uLj4gdGllKFQmLi4uKSBub2V4Y2VwdDsgLy8gY29uc3RleHByIGluIEMrKzE0Cit0ZW1wbGF0ZSA8Y2xhc3MuLi4gVHVwbGVzPiB0dXBsZTxDVHlwZXMuLi4+IHR1cGxlX2NhdChUdXBsZXMmJi4uLiB0cGxzKTsgLy8gY29uc3RleHByIGluIEMrKzE0CisKKy8vIFt0dXBsZS5hcHBseV0sIGNhbGxpbmcgYSBmdW5jdGlvbiB3aXRoIGEgdHVwbGUgb2YgYXJndW1lbnRzOgordGVtcGxhdGUgPGNsYXNzIEYsIGNsYXNzIFR1cGxlPgorICBjb25zdGV4cHIgZGVjbHR5cGUoYXV0bykgYXBwbHkoRiYmIGYsIFR1cGxlJiYgdCk7IC8vIEMrKzE3Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVHVwbGU+CisgIGNvbnN0ZXhwciBUIG1ha2VfZnJvbV90dXBsZShUdXBsZSYmIHQpOyAvLyBDKysxNworCisvLyAyMC40LjEuNCwgdHVwbGUgaGVscGVyIGNsYXNzZXM6Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgdHVwbGVfc2l6ZTsgLy8gdW5kZWZpbmVkCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gVD4gY2xhc3MgdHVwbGVfc2l6ZTx0dXBsZTxULi4uPj47Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyBpbmxpbmUgY29uc3RleHByIHNpemVfdCB0dXBsZV9zaXplX3YgPSB0dXBsZV9zaXplPFQ+Ojp2YWx1ZTsgLy8gQysrMTcKK3RlbXBsYXRlIDxzaXplX3QgSSwgY2xhc3MgVD4gY2xhc3MgdHVwbGVfZWxlbWVudDsgLy8gdW5kZWZpbmVkCit0ZW1wbGF0ZSA8c2l6ZV90IEksIGNsYXNzLi4uIFQ+IGNsYXNzIHR1cGxlX2VsZW1lbnQ8SSwgdHVwbGU8VC4uLj4+OwordGVtcGxhdGUgPHNpemVfdCBJLCBjbGFzcyBUPgorICB1c2luZyB0dXBsZV9lbGVtZW50X3QgPSB0eXBlbmFtZSB0dXBsZV9lbGVtZW50IDxJLCBUPjo6dHlwZTsgLy8gQysrMTQKKworLy8gMjAuNC4xLjUsIGVsZW1lbnQgYWNjZXNzOgordGVtcGxhdGUgPHNpemVfdCBJLCBjbGFzcy4uLiBUPgorICAgIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8SSwgdHVwbGU8VC4uLj4+Ojp0eXBlJgorICAgIGdldCh0dXBsZTxULi4uPiYpIG5vZXhjZXB0OyAvLyBjb25zdGV4cHIgaW4gQysrMTQKK3RlbXBsYXRlIDxzaXplX3QgSSwgY2xhc3MuLi4gVD4KKyAgICBjb25zdCB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PEksIHR1cGxlPFQuLi4+Pjo6dHlwZSYKKyAgICBnZXQoY29uc3QgdHVwbGU8VC4uLj4mKSBub2V4Y2VwdDsgLy8gY29uc3RleHByIGluIEMrKzE0Cit0ZW1wbGF0ZSA8c2l6ZV90IEksIGNsYXNzLi4uIFQ+CisgICAgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxJLCB0dXBsZTxULi4uPj46OnR5cGUmJgorICAgIGdldCh0dXBsZTxULi4uPiYmKSBub2V4Y2VwdDsgLy8gY29uc3RleHByIGluIEMrKzE0Cit0ZW1wbGF0ZSA8c2l6ZV90IEksIGNsYXNzLi4uIFQ+CisgICAgY29uc3QgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxJLCB0dXBsZTxULi4uPj46OnR5cGUmJgorICAgIGdldChjb25zdCB0dXBsZTxULi4uPiYmKSBub2V4Y2VwdDsgLy8gY29uc3RleHByIGluIEMrKzE0CisKK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MuLi4gVD4KKyAgICBjb25zdGV4cHIgVDEmIGdldCh0dXBsZTxULi4uPiYpIG5vZXhjZXB0OyAgLy8gQysrMTQKK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MuLi4gVD4KKyAgICBjb25zdGV4cHIgY29uc3QgVDEmIGdldChjb25zdCB0dXBsZTxULi4uPiYpIG5vZXhjZXB0OyAgIC8vIEMrKzE0Cit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzLi4uIFQ+CisgICAgY29uc3RleHByIFQxJiYgZ2V0KHR1cGxlPFQuLi4+JiYpIG5vZXhjZXB0OyAgIC8vIEMrKzE0Cit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzLi4uIFQ+CisgICAgY29uc3RleHByIGNvbnN0IFQxJiYgZ2V0KGNvbnN0IHR1cGxlPFQuLi4+JiYpIG5vZXhjZXB0OyAgIC8vIEMrKzE0CisKKy8vIDIwLjQuMS42LCByZWxhdGlvbmFsIG9wZXJhdG9yczoKK3RlbXBsYXRlPGNsYXNzLi4uIFQsIGNsYXNzLi4uIFU+IGJvb2wgb3BlcmF0b3I9PShjb25zdCB0dXBsZTxULi4uPiYsIGNvbnN0IHR1cGxlPFUuLi4+Jik7IC8vIGNvbnN0ZXhwciBpbiBDKysxNAordGVtcGxhdGU8Y2xhc3MuLi4gVCwgY2xhc3MuLi4gVT4gYm9vbCBvcGVyYXRvcjwoY29uc3QgdHVwbGU8VC4uLj4mLCBjb25zdCB0dXBsZTxVLi4uPiYpOyAgLy8gY29uc3RleHByIGluIEMrKzE0Cit0ZW1wbGF0ZTxjbGFzcy4uLiBULCBjbGFzcy4uLiBVPiBib29sIG9wZXJhdG9yIT0oY29uc3QgdHVwbGU8VC4uLj4mLCBjb25zdCB0dXBsZTxVLi4uPiYpOyAvLyBjb25zdGV4cHIgaW4gQysrMTQKK3RlbXBsYXRlPGNsYXNzLi4uIFQsIGNsYXNzLi4uIFU+IGJvb2wgb3BlcmF0b3I+KGNvbnN0IHR1cGxlPFQuLi4+JiwgY29uc3QgdHVwbGU8VS4uLj4mKTsgIC8vIGNvbnN0ZXhwciBpbiBDKysxNAordGVtcGxhdGU8Y2xhc3MuLi4gVCwgY2xhc3MuLi4gVT4gYm9vbCBvcGVyYXRvcjw9KGNvbnN0IHR1cGxlPFQuLi4+JiwgY29uc3QgdHVwbGU8VS4uLj4mKTsgLy8gY29uc3RleHByIGluIEMrKzE0Cit0ZW1wbGF0ZTxjbGFzcy4uLiBULCBjbGFzcy4uLiBVPiBib29sIG9wZXJhdG9yPj0oY29uc3QgdHVwbGU8VC4uLj4mLCBjb25zdCB0dXBsZTxVLi4uPiYpOyAvLyBjb25zdGV4cHIgaW4gQysrMTQKKwordGVtcGxhdGUgPGNsYXNzLi4uIFR5cGVzLCBjbGFzcyBBbGxvYz4KKyAgc3RydWN0IHVzZXNfYWxsb2NhdG9yPHR1cGxlPFR5cGVzLi4uPiwgQWxsb2M+OworCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gVHlwZXM+CisgIHZvaWQKKyAgc3dhcCh0dXBsZTxUeXBlcy4uLj4mIHgsIHR1cGxlPFR5cGVzLi4uPiYgeSkgbm9leGNlcHQobm9leGNlcHQoeC5zd2FwKHkpKSk7CisKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8X190dXBsZT4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPF9fZnVuY3Rpb25hbF9iYXNlPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKworCisvLyBfX3R1cGxlX2xlYWYKKwordGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIF9IcCwKKyAgICAgICAgICBib29sPWlzX2VtcHR5PF9IcD46OnZhbHVlICYmICFfX2xpYmNwcF9pc19maW5hbDxfSHA+Ojp2YWx1ZQorICAgICAgICAgPgorY2xhc3MgX190dXBsZV9sZWFmOworCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX0hwLCBib29sIF9FcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIHN3YXAoX190dXBsZV9sZWFmPF9JcCwgX0hwLCBfRXA+JiBfX3gsIF9fdHVwbGVfbGVhZjxfSXAsIF9IcCwgX0VwPiYgX195KQorICAgIF9OT0VYQ0VQVF8oX19pc19ub3Rocm93X3N3YXBwYWJsZTxfSHA+Ojp2YWx1ZSkKK3sKKyAgICBzd2FwKF9feC5nZXQoKSwgX195LmdldCgpKTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIF9IcCwgYm9vbD4KK2NsYXNzIF9fdHVwbGVfbGVhZgoreworICAgIF9IcCBfX3ZhbHVlXzsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9fY2FuX2JpbmRfcmVmZXJlbmNlKCkgeworI2lmIF9faGFzX2tleXdvcmQoX19yZWZlcmVuY2VfYmluZHNfdG9fdGVtcG9yYXJ5KQorICAgICAgcmV0dXJuICFfX3JlZmVyZW5jZV9iaW5kc190b190ZW1wb3JhcnkoX0hwLCBfVHApOworI2Vsc2UKKyAgICAgIHJldHVybiB0cnVlOworI2VuZGlmCisgICAgfQorCisgICAgX190dXBsZV9sZWFmJiBvcGVyYXRvcj0oY29uc3QgX190dXBsZV9sZWFmJik7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUiBfX3R1cGxlX2xlYWYoKQorICAgICAgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8X0hwPjo6dmFsdWUpIDogX192YWx1ZV8oKQorICAgICAgIHtzdGF0aWNfYXNzZXJ0KCFpc19yZWZlcmVuY2U8X0hwPjo6dmFsdWUsCisgICAgICAgICAgICAgICJBdHRlbXB0ZWQgdG8gZGVmYXVsdCBjb25zdHJ1Y3QgYSByZWZlcmVuY2UgZWxlbWVudCBpbiBhIHR1cGxlIik7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBfX3R1cGxlX2xlYWYoaW50ZWdyYWxfY29uc3RhbnQ8aW50LCAwPiwgY29uc3QgX0FsbG9jJikKKyAgICAgICAgICAgIDogX192YWx1ZV8oKQorICAgICAgICB7c3RhdGljX2Fzc2VydCghaXNfcmVmZXJlbmNlPF9IcD46OnZhbHVlLAorICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIGRlZmF1bHQgY29uc3RydWN0IGEgcmVmZXJlbmNlIGVsZW1lbnQgaW4gYSB0dXBsZSIpO30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgX190dXBsZV9sZWFmKGludGVncmFsX2NvbnN0YW50PGludCwgMT4sIGNvbnN0IF9BbGxvYyYgX19hKQorICAgICAgICAgICAgOiBfX3ZhbHVlXyhhbGxvY2F0b3JfYXJnX3QoKSwgX19hKQorICAgICAgICB7c3RhdGljX2Fzc2VydCghaXNfcmVmZXJlbmNlPF9IcD46OnZhbHVlLAorICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIGRlZmF1bHQgY29uc3RydWN0IGEgcmVmZXJlbmNlIGVsZW1lbnQgaW4gYSB0dXBsZSIpO30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgX190dXBsZV9sZWFmKGludGVncmFsX2NvbnN0YW50PGludCwgMj4sIGNvbnN0IF9BbGxvYyYgX19hKQorICAgICAgICAgICAgOiBfX3ZhbHVlXyhfX2EpCisgICAgICAgIHtzdGF0aWNfYXNzZXJ0KCFpc19yZWZlcmVuY2U8X0hwPjo6dmFsdWUsCisgICAgICAgICAgICAgICJBdHRlbXB0ZWQgdG8gZGVmYXVsdCBjb25zdHJ1Y3QgYSByZWZlcmVuY2UgZWxlbWVudCBpbiBhIHR1cGxlIik7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwKKyAgICAgICAgICAgICAgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgICAgICAgICAgICAgICBfX2xhenlfYW5kPAorICAgICAgICAgICAgICAgICAgICAgIF9fbGF6eV9ub3Q8aXNfc2FtZTx0eXBlbmFtZSBfX3VuY3ZyZWY8X1RwPjo6dHlwZSwgX190dXBsZV9sZWFmPj4KKyAgICAgICAgICAgICAgICAgICAgLCBpc19jb25zdHJ1Y3RpYmxlPF9IcCwgX1RwPgorICAgICAgICAgICAgICAgICAgICA+Ojp2YWx1ZQorICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICAgICAgICAgID4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorICAgICAgICBleHBsaWNpdCBfX3R1cGxlX2xlYWYoX1RwJiYgX190KSBfTk9FWENFUFRfKChpc19ub3Rocm93X2NvbnN0cnVjdGlibGU8X0hwLCBfVHA+Ojp2YWx1ZSkpCisgICAgICAgICAgICA6IF9fdmFsdWVfKF9WU1REOjpmb3J3YXJkPF9UcD4oX190KSkKKyAgICAgICAge3N0YXRpY19hc3NlcnQoX19jYW5fYmluZF9yZWZlcmVuY2U8X1RwJiY+KCksCisgICAgICAgIkF0dGVtcHRlZCBjb25zdHJ1Y3Rpb24gb2YgcmVmZXJlbmNlIGVsZW1lbnQgYmluZHMgdG8gYSB0ZW1wb3Jhcnkgd2hvc2UgbGlmZXRpbWUgaGFzIGVuZGVkIik7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGV4cGxpY2l0IF9fdHVwbGVfbGVhZihpbnRlZ3JhbF9jb25zdGFudDxpbnQsIDA+LCBjb25zdCBfQWxsb2MmLCBfVHAmJiBfX3QpCisgICAgICAgICAgICA6IF9fdmFsdWVfKF9WU1REOjpmb3J3YXJkPF9UcD4oX190KSkKKyAgICAgICAge3N0YXRpY19hc3NlcnQoX19jYW5fYmluZF9yZWZlcmVuY2U8X1RwJiY+KCksCisgICAgICAgIkF0dGVtcHRlZCBjb25zdHJ1Y3Rpb24gb2YgcmVmZXJlbmNlIGVsZW1lbnQgYmluZHMgdG8gYSB0ZW1wb3Jhcnkgd2hvc2UgbGlmZXRpbWUgaGFzIGVuZGVkIik7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGV4cGxpY2l0IF9fdHVwbGVfbGVhZihpbnRlZ3JhbF9jb25zdGFudDxpbnQsIDE+LCBjb25zdCBfQWxsb2MmIF9fYSwgX1RwJiYgX190KQorICAgICAgICAgICAgOiBfX3ZhbHVlXyhhbGxvY2F0b3JfYXJnX3QoKSwgX19hLCBfVlNURDo6Zm9yd2FyZDxfVHA+KF9fdCkpCisgICAgICAgIHtzdGF0aWNfYXNzZXJ0KCFpc19yZWZlcmVuY2U8X0hwPjo6dmFsdWUsCisgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIHVzZXMtYWxsb2NhdG9yIGNvbnN0cnVjdCBhIHJlZmVyZW5jZSBlbGVtZW50IGluIGEgdHVwbGUiKTt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZXhwbGljaXQgX190dXBsZV9sZWFmKGludGVncmFsX2NvbnN0YW50PGludCwgMj4sIGNvbnN0IF9BbGxvYyYgX19hLCBfVHAmJiBfX3QpCisgICAgICAgICAgICA6IF9fdmFsdWVfKF9WU1REOjpmb3J3YXJkPF9UcD4oX190KSwgX19hKQorICAgICAgICB7c3RhdGljX2Fzc2VydCghaXNfcmVmZXJlbmNlPF9IcD46OnZhbHVlLAorICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIHVzZXMtYWxsb2NhdG9yIGNvbnN0cnVjdCBhIHJlZmVyZW5jZSBlbGVtZW50IGluIGEgdHVwbGUiKTt9CisKKyAgICBfX3R1cGxlX2xlYWYoY29uc3QgX190dXBsZV9sZWFmJiBfX3QpID0gZGVmYXVsdDsKKyAgICBfX3R1cGxlX2xlYWYoX190dXBsZV9sZWFmJiYgX190KSA9IGRlZmF1bHQ7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIF9fdHVwbGVfbGVhZiYKKyAgICAgICAgb3BlcmF0b3I9KF9UcCYmIF9fdCkgX05PRVhDRVBUXygoaXNfbm90aHJvd19hc3NpZ25hYmxlPF9IcCYsIF9UcD46OnZhbHVlKSkKKyAgICAgICAgeworICAgICAgICAgICAgX192YWx1ZV8gPSBfVlNURDo6Zm9yd2FyZDxfVHA+KF9fdCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpbnQgc3dhcChfX3R1cGxlX2xlYWYmIF9fdCkgX05PRVhDRVBUXyhfX2lzX25vdGhyb3dfc3dhcHBhYmxlPF9fdHVwbGVfbGVhZj46OnZhbHVlKQorICAgIHsKKyAgICAgICAgX1ZTVEQ6OnN3YXAoKnRoaXMsIF9fdCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgICAgICAgX0hwJiBnZXQoKSAgICAgICBfTk9FWENFUFQge3JldHVybiBfX3ZhbHVlXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBjb25zdCBfSHAmIGdldCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdmFsdWVfO30KK307CisKK3RlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcyBfSHA+CitjbGFzcyBfX3R1cGxlX2xlYWY8X0lwLCBfSHAsIHRydWU+CisgICAgOiBwcml2YXRlIF9IcAoreworCisgICAgX190dXBsZV9sZWFmJiBvcGVyYXRvcj0oY29uc3QgX190dXBsZV9sZWFmJik7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUiBfX3R1cGxlX2xlYWYoKQorICAgICAgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8X0hwPjo6dmFsdWUpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIF9fdHVwbGVfbGVhZihpbnRlZ3JhbF9jb25zdGFudDxpbnQsIDA+LCBjb25zdCBfQWxsb2MmKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBfX3R1cGxlX2xlYWYoaW50ZWdyYWxfY29uc3RhbnQ8aW50LCAxPiwgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgICAgICAgICA6IF9IcChhbGxvY2F0b3JfYXJnX3QoKSwgX19hKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBfX3R1cGxlX2xlYWYoaW50ZWdyYWxfY29uc3RhbnQ8aW50LCAyPiwgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgICAgICAgICA6IF9IcChfX2EpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLAorICAgICAgICAgICAgICBjbGFzcyA9IHR5cGVuYW1lIGVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgIF9fbGF6eV9hbmQ8CisgICAgICAgICAgICAgICAgICAgICAgICBfX2xhenlfbm90PGlzX3NhbWU8dHlwZW5hbWUgX191bmN2cmVmPF9UcD46OnR5cGUsIF9fdHVwbGVfbGVhZj4+CisgICAgICAgICAgICAgICAgICAgICAgLCBpc19jb25zdHJ1Y3RpYmxlPF9IcCwgX1RwPgorICAgICAgICAgICAgICAgICAgICA+Ojp2YWx1ZQorICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICAgICAgICAgID4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorICAgICAgICBleHBsaWNpdCBfX3R1cGxlX2xlYWYoX1RwJiYgX190KSBfTk9FWENFUFRfKChpc19ub3Rocm93X2NvbnN0cnVjdGlibGU8X0hwLCBfVHA+Ojp2YWx1ZSkpCisgICAgICAgICAgICA6IF9IcChfVlNURDo6Zm9yd2FyZDxfVHA+KF9fdCkpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZXhwbGljaXQgX190dXBsZV9sZWFmKGludGVncmFsX2NvbnN0YW50PGludCwgMD4sIGNvbnN0IF9BbGxvYyYsIF9UcCYmIF9fdCkKKyAgICAgICAgICAgIDogX0hwKF9WU1REOjpmb3J3YXJkPF9UcD4oX190KSkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBleHBsaWNpdCBfX3R1cGxlX2xlYWYoaW50ZWdyYWxfY29uc3RhbnQ8aW50LCAxPiwgY29uc3QgX0FsbG9jJiBfX2EsIF9UcCYmIF9fdCkKKyAgICAgICAgICAgIDogX0hwKGFsbG9jYXRvcl9hcmdfdCgpLCBfX2EsIF9WU1REOjpmb3J3YXJkPF9UcD4oX190KSkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBleHBsaWNpdCBfX3R1cGxlX2xlYWYoaW50ZWdyYWxfY29uc3RhbnQ8aW50LCAyPiwgY29uc3QgX0FsbG9jJiBfX2EsIF9UcCYmIF9fdCkKKyAgICAgICAgICAgIDogX0hwKF9WU1REOjpmb3J3YXJkPF9UcD4oX190KSwgX19hKSB7fQorCisgICAgX190dXBsZV9sZWFmKF9fdHVwbGVfbGVhZiBjb25zdCAmKSA9IGRlZmF1bHQ7CisgICAgX190dXBsZV9sZWFmKF9fdHVwbGVfbGVhZiAmJikgPSBkZWZhdWx0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBfX3R1cGxlX2xlYWYmCisgICAgICAgIG9wZXJhdG9yPShfVHAmJiBfX3QpIF9OT0VYQ0VQVF8oKGlzX25vdGhyb3dfYXNzaWduYWJsZTxfSHAmLCBfVHA+Ojp2YWx1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9IcDo6b3BlcmF0b3I9KF9WU1REOjpmb3J3YXJkPF9UcD4oX190KSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpbnQKKyAgICBzd2FwKF9fdHVwbGVfbGVhZiYgX190KSBfTk9FWENFUFRfKF9faXNfbm90aHJvd19zd2FwcGFibGU8X190dXBsZV9sZWFmPjo6dmFsdWUpCisgICAgeworICAgICAgICBfVlNURDo6c3dhcCgqdGhpcywgX190KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSAgICAgICBfSHAmIGdldCgpICAgICAgIF9OT0VYQ0VQVCB7cmV0dXJuIHN0YXRpY19jYXN0PF9IcCY+KCp0aGlzKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMSBjb25zdCBfSHAmIGdldCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9IcCY+KCp0aGlzKTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX1RwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZCBfX3N3YWxsb3coX1RwJiYuLi4pIF9OT0VYQ0VQVCB7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX1RwPgorc3RydWN0IF9fbGF6eV9hbGwgOiBfX2FsbDxfVHA6OnZhbHVlLi4uPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2FsbF9kZWZhdWx0X2NvbnN0cnVjdGlibGU7CisKK3RlbXBsYXRlIDxjbGFzcyAuLi5fVHA+CitzdHJ1Y3QgX19hbGxfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9fdHVwbGVfdHlwZXM8X1RwLi4uPj4KKyAgICA6IF9fYWxsPGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZS4uLj4KK3sgfTsKKworLy8gX190dXBsZV9pbXBsCisKK3RlbXBsYXRlPGNsYXNzIF9JbmR4LCBjbGFzcyAuLi5fVHA+IHN0cnVjdCBfX3R1cGxlX2ltcGw7CisKK3RlbXBsYXRlPHNpemVfdCAuLi5fSW5keCwgY2xhc3MgLi4uX1RwPgorc3RydWN0IF9MSUJDUFBfREVDTFNQRUNfRU1QVFlfQkFTRVMgX190dXBsZV9pbXBsPF9fdHVwbGVfaW5kaWNlczxfSW5keC4uLj4sIF9UcC4uLj4KKyAgICA6IHB1YmxpYyBfX3R1cGxlX2xlYWY8X0luZHgsIF9UcD4uLi4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX0xJQkNQUF9DT05TVEVYUFIgX190dXBsZV9pbXBsKCkKKyAgICAgICAgX05PRVhDRVBUXyhfX2FsbDxpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZS4uLj46OnZhbHVlKSB7fQorCisgICAgdGVtcGxhdGUgPHNpemVfdCAuLi5fVWYsIGNsYXNzIC4uLl9UZiwKKyAgICAgICAgICAgICAgc2l6ZV90IC4uLl9VbCwgY2xhc3MgLi4uX1RsLCBjbGFzcyAuLi5fVXA+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgX190dXBsZV9pbXBsKF9fdHVwbGVfaW5kaWNlczxfVWYuLi4+LCBfX3R1cGxlX3R5cGVzPF9UZi4uLj4sCisgICAgICAgICAgICAgICAgICAgICBfX3R1cGxlX2luZGljZXM8X1VsLi4uPiwgX190dXBsZV90eXBlczxfVGwuLi4+LAorICAgICAgICAgICAgICAgICAgICAgX1VwJiYuLi4gX191KQorICAgICAgICAgICAgICAgICAgICAgX05PRVhDRVBUXygoX19hbGw8aXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlPF9UZiwgX1VwPjo6dmFsdWUuLi4+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hbGw8aXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8X1RsPjo6dmFsdWUuLi4+Ojp2YWx1ZSkpIDoKKyAgICAgICAgICAgIF9fdHVwbGVfbGVhZjxfVWYsIF9UZj4oX1ZTVEQ6OmZvcndhcmQ8X1VwPihfX3UpKS4uLiwKKyAgICAgICAgICAgIF9fdHVwbGVfbGVhZjxfVWwsIF9UbD4oKS4uLgorICAgICAgICAgICAge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2MsIHNpemVfdCAuLi5fVWYsIGNsYXNzIC4uLl9UZiwKKyAgICAgICAgICAgICAgc2l6ZV90IC4uLl9VbCwgY2xhc3MgLi4uX1RsLCBjbGFzcyAuLi5fVXA+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgX190dXBsZV9pbXBsKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiBfX2EsCisgICAgICAgICAgICAgICAgICAgICBfX3R1cGxlX2luZGljZXM8X1VmLi4uPiwgX190dXBsZV90eXBlczxfVGYuLi4+LAorICAgICAgICAgICAgICAgICAgICAgX190dXBsZV9pbmRpY2VzPF9VbC4uLj4sIF9fdHVwbGVfdHlwZXM8X1RsLi4uPiwKKyAgICAgICAgICAgICAgICAgICAgIF9VcCYmLi4uIF9fdSkgOgorICAgICAgICAgICAgX190dXBsZV9sZWFmPF9VZiwgX1RmPihfX3VzZXNfYWxsb2NfY3RvcjxfVGYsIF9BbGxvYywgX1VwPigpLCBfX2EsCisgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZDxfVXA+KF9fdSkpLi4uLAorICAgICAgICAgICAgX190dXBsZV9sZWFmPF9VbCwgX1RsPihfX3VzZXNfYWxsb2NfY3RvcjxfVGwsIF9BbGxvYz4oKSwgX19hKS4uLgorICAgICAgICAgICAge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHVwbGUsCisgICAgICAgICAgICAgIGNsYXNzID0gdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fdHVwbGVfY29uc3RydWN0aWJsZTxfVHVwbGUsIHR1cGxlPF9UcC4uLj4gPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgICAgICAgICAgPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgICAgIF9fdHVwbGVfaW1wbChfVHVwbGUmJiBfX3QpIF9OT0VYQ0VQVF8oKF9fYWxsPGlzX25vdGhyb3dfY29uc3RydWN0aWJsZTxfVHAsIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0luZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX21ha2VfdHVwbGVfdHlwZXM8X1R1cGxlPjo6dHlwZT46OnR5cGU+Ojp2YWx1ZS4uLj46OnZhbHVlKSkKKyAgICAgICAgICAgIDogX190dXBsZV9sZWFmPF9JbmR4LCBfVHA+KF9WU1REOjpmb3J3YXJkPHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0luZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX21ha2VfdHVwbGVfdHlwZXM8X1R1cGxlPjo6dHlwZT46OnR5cGU+KF9WU1REOjpnZXQ8X0luZHg+KF9fdCkpKS4uLgorICAgICAgICAgICAge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2MsIGNsYXNzIF9UdXBsZSwKKyAgICAgICAgICAgICAgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgICAgICAgICAgICAgICA8CisgICAgICAgICAgICAgICAgICAgICAgICAgX190dXBsZV9jb25zdHJ1Y3RpYmxlPF9UdXBsZSwgdHVwbGU8X1RwLi4uPiA+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICAgICAgICAgICA+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgX190dXBsZV9pbXBsKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiBfX2EsIF9UdXBsZSYmIF9fdCkKKyAgICAgICAgICAgIDogX190dXBsZV9sZWFmPF9JbmR4LCBfVHA+KF9fdXNlc19hbGxvY19jdG9yPF9UcCwgX0FsbG9jLCB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9JbmR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPF9UdXBsZT46OnR5cGU+Ojp0eXBlPigpLCBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZDx0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9JbmR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPF9UdXBsZT46OnR5cGU+Ojp0eXBlPihfVlNURDo6Z2V0PF9JbmR4PihfX3QpKSkuLi4KKyAgICAgICAgICAgIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1R1cGxlPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICBfX3R1cGxlX2Fzc2lnbmFibGU8X1R1cGxlLCB0dXBsZTxfVHAuLi4+ID46OnZhbHVlLAorICAgICAgICAgICAgX190dXBsZV9pbXBsJgorICAgICAgICA+Ojp0eXBlCisgICAgICAgIG9wZXJhdG9yPShfVHVwbGUmJiBfX3QpIF9OT0VYQ0VQVF8oKF9fYWxsPGlzX25vdGhyb3dfYXNzaWduYWJsZTxfVHAmLCB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9JbmR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPF9UdXBsZT46OnR5cGU+Ojp0eXBlPjo6dmFsdWUuLi4+Ojp2YWx1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fc3dhbGxvdyhfX3R1cGxlX2xlYWY8X0luZHgsIF9UcD46Om9wZXJhdG9yPShfVlNURDo6Zm9yd2FyZDx0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9JbmR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPF9UdXBsZT46OnR5cGU+Ojp0eXBlPihfVlNURDo6Z2V0PF9JbmR4PihfX3QpKSkuLi4pOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICBfX3R1cGxlX2ltcGwoY29uc3QgX190dXBsZV9pbXBsJikgPSBkZWZhdWx0OworICAgIF9fdHVwbGVfaW1wbChfX3R1cGxlX2ltcGwmJikgPSBkZWZhdWx0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fdHVwbGVfaW1wbCYKKyAgICBvcGVyYXRvcj0oY29uc3QgX190dXBsZV9pbXBsJiBfX3QpIF9OT0VYQ0VQVF8oKF9fYWxsPGlzX25vdGhyb3dfY29weV9hc3NpZ25hYmxlPF9UcD46OnZhbHVlLi4uPjo6dmFsdWUpKQorICAgIHsKKyAgICAgICAgX19zd2FsbG93KF9fdHVwbGVfbGVhZjxfSW5keCwgX1RwPjo6b3BlcmF0b3I9KHN0YXRpY19jYXN0PGNvbnN0IF9fdHVwbGVfbGVhZjxfSW5keCwgX1RwPiY+KF9fdCkuZ2V0KCkpLi4uKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3R1cGxlX2ltcGwmCisgICAgb3BlcmF0b3I9KF9fdHVwbGVfaW1wbCYmIF9fdCkgX05PRVhDRVBUXygoX19hbGw8aXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8X1RwPjo6dmFsdWUuLi4+Ojp2YWx1ZSkpCisgICAgeworICAgICAgICBfX3N3YWxsb3coX190dXBsZV9sZWFmPF9JbmR4LCBfVHA+OjpvcGVyYXRvcj0oX1ZTVEQ6OmZvcndhcmQ8X1RwPihzdGF0aWNfY2FzdDxfX3R1cGxlX2xlYWY8X0luZHgsIF9UcD4mPihfX3QpLmdldCgpKSkuLi4pOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc3dhcChfX3R1cGxlX2ltcGwmIF9fdCkKKyAgICAgICAgX05PRVhDRVBUXyhfX2FsbDxfX2lzX25vdGhyb3dfc3dhcHBhYmxlPF9UcD46OnZhbHVlLi4uPjo6dmFsdWUpCisgICAgeworICAgICAgICBfX3N3YWxsb3coX190dXBsZV9sZWFmPF9JbmR4LCBfVHA+Ojpzd2FwKHN0YXRpY19jYXN0PF9fdHVwbGVfbGVhZjxfSW5keCwgX1RwPiY+KF9fdCkpLi4uKTsKKyAgICB9Cit9OworCisKKwordGVtcGxhdGUgPGNsYXNzIC4uLl9UcD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHR1cGxlCit7CisgICAgdHlwZWRlZiBfX3R1cGxlX2ltcGw8dHlwZW5hbWUgX19tYWtlX3R1cGxlX2luZGljZXM8c2l6ZW9mLi4uKF9UcCk+Ojp0eXBlLCBfVHAuLi4+IF9CYXNlVDsKKworICAgIF9CYXNlVCBfX2Jhc2VfOworCisjaWYgZGVmaW5lZChfTElCQ1BQX0VOQUJMRV9UVVBMRV9JTVBMSUNJVF9SRURVQ0VEX0FSSVRZX0VYVEVOU0lPTikKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgX0VuYWJsZUltcGxpY2l0UmVkdWNlZEFyaXR5RXh0ZW5zaW9uID0gdHJ1ZTsKKyNlbHNlCisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9FbmFibGVJbXBsaWNpdFJlZHVjZWRBcml0eUV4dGVuc2lvbiA9IGZhbHNlOworI2VuZGlmCisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FyZ3M+CisgICAgc3RydWN0IF9QYWNrRXhwYW5kc1RvVGhpc1R1cGxlIDogZmFsc2VfdHlwZSB7fTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQXJnPgorICAgIHN0cnVjdCBfUGFja0V4cGFuZHNUb1RoaXNUdXBsZTxfQXJnPgorICAgICAgICA6IGlzX3NhbWU8dHlwZW5hbWUgX191bmN2cmVmPF9Bcmc+Ojp0eXBlLCB0dXBsZT4ge307CisKKyAgICB0ZW1wbGF0ZSA8Ym9vbCBfTWF5YmVFbmFibGUsIGNsYXNzIF9EdW1teSA9IHZvaWQ+CisgICAgc3RydWN0IF9DaGVja0FyZ3NDb25zdHJ1Y3RvciA6IF9fY2hlY2tfdHVwbGVfY29uc3RydWN0b3JfZmFpbCB7fTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRHVtbXk+CisgICAgc3RydWN0IF9DaGVja0FyZ3NDb25zdHJ1Y3Rvcjx0cnVlLCBfRHVtbXk+CisgICAgeworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FyZ3M+CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfX2VuYWJsZV9kZWZhdWx0KCkgeworICAgICAgICAgICAgcmV0dXJuIF9fYWxsPGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxfQXJncz46OnZhbHVlLi4uPjo6dmFsdWU7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FyZ3M+CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfX2VuYWJsZV9leHBsaWNpdCgpIHsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIF9fdHVwbGVfY29uc3RydWN0aWJsZTwKKyAgICAgICAgICAgICAgICAgICAgdHVwbGU8X0FyZ3MuLi4+LAorICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX21ha2VfdHVwbGVfdHlwZXM8dHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZi4uLihfQXJncykgPCBzaXplb2YuLi4oX1RwKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YuLi4oX0FyZ3MpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZi4uLihfVHApPjo6dHlwZQorICAgICAgICAgICAgICAgID46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgIV9fdHVwbGVfY29udmVydGlibGU8CisgICAgICAgICAgICAgICAgICAgIHR1cGxlPF9BcmdzLi4uPiwKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPHR1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YuLi4oX0FyZ3MpIDwgc2l6ZW9mLi4uKF9UcCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mLi4uKF9BcmdzKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YuLi4oX1RwKT46OnR5cGUKKyAgICAgICAgICAgICAgICA+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgIF9fYWxsX2RlZmF1bHRfY29uc3RydWN0aWJsZTwKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPHR1cGxlLCBzaXplb2YuLi4oX1RwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mLi4uKF9BcmdzKSA8IHNpemVvZi4uLihfVHApID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZi4uLihfQXJncykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mLi4uKF9UcCk+Ojp0eXBlCisgICAgICAgICAgICAgICAgPjo6dmFsdWU7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FyZ3M+CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfX2VuYWJsZV9pbXBsaWNpdCgpIHsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIF9fdHVwbGVfY29udmVydGlibGU8CisgICAgICAgICAgICAgICAgICAgIHR1cGxlPF9BcmdzLi4uPiwKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPHR1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YuLi4oX0FyZ3MpIDwgc2l6ZW9mLi4uKF9UcCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mLi4uKF9BcmdzKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YuLi4oX1RwKT46OnR5cGUKKyAgICAgICAgICAgICAgICA+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgIF9fYWxsX2RlZmF1bHRfY29uc3RydWN0aWJsZTwKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPHR1cGxlLCBzaXplb2YuLi4oX1RwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mLi4uKF9BcmdzKSA8IHNpemVvZi4uLihfVHApID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZi4uLihfQXJncykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mLi4uKF9UcCk+Ojp0eXBlCisgICAgICAgICAgICAgICAgPjo6dmFsdWU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGUgPGJvb2wgX01heWJlRW5hYmxlLAorICAgICAgICAgICAgICBib29sID0gc2l6ZW9mLi4uKF9UcCkgPT0gMSwKKyAgICAgICAgICAgICAgY2xhc3MgX0R1bW15ID0gdm9pZD4KKyAgICBzdHJ1Y3QgX0NoZWNrVHVwbGVMaWtlQ29uc3RydWN0b3IgOiBfX2NoZWNrX3R1cGxlX2NvbnN0cnVjdG9yX2ZhaWwge307CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15PgorICAgIHN0cnVjdCBfQ2hlY2tUdXBsZUxpa2VDb25zdHJ1Y3Rvcjx0cnVlLCBmYWxzZSwgX0R1bW15PgorICAgIHsKKyAgICAgICAgdGVtcGxhdGUgPGNsYXNzIF9UdXBsZT4KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9fZW5hYmxlX2ltcGxpY2l0KCkgeworICAgICAgICAgICAgcmV0dXJuIF9fdHVwbGVfY29udmVydGlibGU8X1R1cGxlLCB0dXBsZT46OnZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPGNsYXNzIF9UdXBsZT4KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9fZW5hYmxlX2V4cGxpY2l0KCkgeworICAgICAgICAgICAgcmV0dXJuIF9fdHVwbGVfY29uc3RydWN0aWJsZTxfVHVwbGUsIHR1cGxlPjo6dmFsdWUKKyAgICAgICAgICAgICAgICYmICFfX3R1cGxlX2NvbnZlcnRpYmxlPF9UdXBsZSwgdHVwbGU+Ojp2YWx1ZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0R1bW15PgorICAgIHN0cnVjdCBfQ2hlY2tUdXBsZUxpa2VDb25zdHJ1Y3Rvcjx0cnVlLCB0cnVlLCBfRHVtbXk+CisgICAgeworICAgICAgICAvLyBUaGlzIHRyYWl0IGlzIHVzZWQgdG8gZGlzYWJsZSB0aGUgdHVwbGUtbGlrZSBjb25zdHJ1Y3RvciB3aGVuCisgICAgICAgIC8vIHRoZSBVVHlwZXMuLi4gY29uc3RydWN0b3Igc2hvdWxkIGJlIHNlbGVjdGVkIGluc3RlYWQuCisgICAgICAgIC8vIFNlZSBMV0cgaXNzdWUgIzI1NDkuCisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBfVHVwbGU+CisgICAgICAgIHVzaW5nIF9QcmVmZXJUdXBsZUxpa2VDb25zdHJ1Y3RvciA9IF9fbGF6eV9vcjwKKyAgICAgICAgICAgIC8vIERvbid0IGF0dGVtcHQgdGhlIHR3byBjaGVja3MgYmVsb3cgaWYgdGhlIHR1cGxlIHdlIGFyZSBnaXZlbgorICAgICAgICAgICAgLy8gaGFzIHRoZSBzYW1lIHR5cGUgYXMgdGhpcyB0dXBsZS4KKyAgICAgICAgICAgIGlzX3NhbWU8dHlwZW5hbWUgX191bmN2cmVmPF9UdXBsZT46OnR5cGUsIHR1cGxlPiwKKyAgICAgICAgICAgIF9fbGF6eV9hbmQ8CisgICAgICAgICAgICAgICAgX19sYXp5X25vdDxpc19jb25zdHJ1Y3RpYmxlPF9UcC4uLiwgX1R1cGxlPj4sCisgICAgICAgICAgICAgICAgX19sYXp5X25vdDxpc19jb252ZXJ0aWJsZTxfVHVwbGUsIF9UcC4uLj4+CisgICAgICAgICAgICA+CisgICAgICAgID47CisKKyAgICAgICAgdGVtcGxhdGUgPGNsYXNzIF9UdXBsZT4KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9fZW5hYmxlX2ltcGxpY2l0KCkgeworICAgICAgICAgICAgcmV0dXJuIF9fbGF6eV9hbmQ8CisgICAgICAgICAgICAgICAgX190dXBsZV9jb252ZXJ0aWJsZTxfVHVwbGUsIHR1cGxlPiwKKyAgICAgICAgICAgICAgICBfUHJlZmVyVHVwbGVMaWtlQ29uc3RydWN0b3I8X1R1cGxlPgorICAgICAgICAgICAgPjo6dmFsdWU7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1R1cGxlPgorICAgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgX19lbmFibGVfZXhwbGljaXQoKSB7CisgICAgICAgICAgICByZXR1cm4gX19sYXp5X2FuZDwKKyAgICAgICAgICAgICAgICBfX3R1cGxlX2NvbnN0cnVjdGlibGU8X1R1cGxlLCB0dXBsZT4sCisgICAgICAgICAgICAgICAgX1ByZWZlclR1cGxlTGlrZUNvbnN0cnVjdG9yPF9UdXBsZT4sCisgICAgICAgICAgICAgICAgX19sYXp5X25vdDxfX3R1cGxlX2NvbnZlcnRpYmxlPF9UdXBsZSwgdHVwbGU+PgorICAgICAgICAgICAgPjo6dmFsdWU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGUgPHNpemVfdCBfSnAsIGNsYXNzIC4uLl9VcD4gZnJpZW5kIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgICAgIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0pwLCB0dXBsZTxfVXAuLi4+ID46OnR5cGUmIGdldCh0dXBsZTxfVXAuLi4+JikgX05PRVhDRVBUOworICAgIHRlbXBsYXRlIDxzaXplX3QgX0pwLCBjbGFzcyAuLi5fVXA+IGZyaWVuZCBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorICAgICAgICBjb25zdCB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9KcCwgdHVwbGU8X1VwLi4uPiA+Ojp0eXBlJiBnZXQoY29uc3QgdHVwbGU8X1VwLi4uPiYpIF9OT0VYQ0VQVDsKKyAgICB0ZW1wbGF0ZSA8c2l6ZV90IF9KcCwgY2xhc3MgLi4uX1VwPiBmcmllbmQgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICAgICAgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSnAsIHR1cGxlPF9VcC4uLj4gPjo6dHlwZSYmIGdldCh0dXBsZTxfVXAuLi4+JiYpIF9OT0VYQ0VQVDsKKyAgICB0ZW1wbGF0ZSA8c2l6ZV90IF9KcCwgY2xhc3MgLi4uX1VwPiBmcmllbmQgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICAgICAgY29uc3QgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSnAsIHR1cGxlPF9VcC4uLj4gPjo6dHlwZSYmIGdldChjb25zdCB0dXBsZTxfVXAuLi4+JiYpIF9OT0VYQ0VQVDsKK3B1YmxpYzoKKworICAgIHRlbXBsYXRlIDxib29sIF9EdW1teSA9IHRydWUsIGNsYXNzID0gdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgICBfQ2hlY2tBcmdzQ29uc3RydWN0b3I8X0R1bW15Pjo6dGVtcGxhdGUgX19lbmFibGVfZGVmYXVsdDxfVHAuLi4+KCkKKyAgICA+Ojp0eXBlPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfTElCQ1BQX0NPTlNURVhQUiB0dXBsZSgpCisgICAgICAgIF9OT0VYQ0VQVF8oX19hbGw8aXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8X1RwPjo6dmFsdWUuLi4+Ojp2YWx1ZSkge30KKworICAgIHR1cGxlKHR1cGxlIGNvbnN0JikgPSBkZWZhdWx0OworICAgIHR1cGxlKHR1cGxlJiYpID0gZGVmYXVsdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2NBcmdULCBjbGFzcyBfQWxsb2MsIGJvb2wgX0R1bW15ID0gdHJ1ZSwgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgICAgIF9fbGF6eV9hbmQ8CisgICAgICAgICAgICBpc19zYW1lPGFsbG9jYXRvcl9hcmdfdCwgX0FsbG9jQXJnVD4sCisgICAgICAgICAgICBfX2xhenlfYWxsPF9fZGVwZW5kZW50X3R5cGU8aXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9UcD4sIF9EdW1teT4uLi4+CisgICAgICAgPjo6dmFsdWUKKyAgICA+Ojp0eXBlPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0dXBsZShfQWxsb2NBcmdULCBfQWxsb2MgY29uc3QmIF9fYSkKKyAgICAgIDogX19iYXNlXyhhbGxvY2F0b3JfYXJnX3QoKSwgX19hLAorICAgICAgICAgICAgICAgICAgICBfX3R1cGxlX2luZGljZXM8PigpLCBfX3R1cGxlX3R5cGVzPD4oKSwKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX2luZGljZXM8c2l6ZW9mLi4uKF9UcCksIDA+Ojp0eXBlKCksCisgICAgICAgICAgICAgICAgICAgIF9fdHVwbGVfdHlwZXM8X1RwLi4uPigpKSB7fQorCisgICAgdGVtcGxhdGUgPGJvb2wgX0R1bW15ID0gdHJ1ZSwKKyAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGVja0FyZ3NDb25zdHJ1Y3RvcjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRHVtbXkKKyAgICAgICAgICAgICAgICAgICAgICAgICA+Ojp0ZW1wbGF0ZSBfX2VuYWJsZV9pbXBsaWNpdDxfVHAgY29uc3QmLi4uPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wKKyAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlID0gZmFsc2UKKyAgICAgICAgPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICB0dXBsZShjb25zdCBfVHAmIC4uLiBfX3QpIF9OT0VYQ0VQVF8oKF9fYWxsPGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPF9UcD46OnZhbHVlLi4uPjo6dmFsdWUpKQorICAgICAgICA6IF9fYmFzZV8odHlwZW5hbWUgX19tYWtlX3R1cGxlX2luZGljZXM8c2l6ZW9mLi4uKF9UcCk+Ojp0eXBlKCksCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPHR1cGxlLCBzaXplb2YuLi4oX1RwKT46OnR5cGUoKSwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX21ha2VfdHVwbGVfaW5kaWNlczwwPjo6dHlwZSgpLAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV90eXBlczx0dXBsZSwgMD46OnR5cGUoKSwKKyAgICAgICAgICAgICAgICBfX3QuLi4KKyAgICAgICAgICAgICAgICkge30KKworICAgIHRlbXBsYXRlIDxib29sIF9EdW1teSA9IHRydWUsCisgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICAgICAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hlY2tBcmdzQ29uc3RydWN0b3I8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0R1bW15CisgICAgICAgICAgICAgICAgICAgICAgICAgPjo6dGVtcGxhdGUgX19lbmFibGVfZXhwbGljaXQ8X1RwIGNvbnN0Ji4uLj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sCisgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSA9IGZhbHNlCisgICAgICAgID4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgZXhwbGljaXQgdHVwbGUoY29uc3QgX1RwJiAuLi4gX190KSBfTk9FWENFUFRfKChfX2FsbDxpc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZS4uLj46OnZhbHVlKSkKKyAgICAgICAgOiBfX2Jhc2VfKHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPHNpemVvZi4uLihfVHApPjo6dHlwZSgpLAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV90eXBlczx0dXBsZSwgc2l6ZW9mLi4uKF9UcCk+Ojp0eXBlKCksCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX2luZGljZXM8MD46OnR5cGUoKSwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX21ha2VfdHVwbGVfdHlwZXM8dHVwbGUsIDA+Ojp0eXBlKCksCisgICAgICAgICAgICAgICAgX190Li4uCisgICAgICAgICAgICAgICApIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jLCBib29sIF9EdW1teSA9IHRydWUsCisgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICAgICAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hlY2tBcmdzQ29uc3RydWN0b3I8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0R1bW15CisgICAgICAgICAgICAgICAgICAgICAgICAgPjo6dGVtcGxhdGUgX19lbmFibGVfaW1wbGljaXQ8X1RwIGNvbnN0Ji4uLj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sCisgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSA9IGZhbHNlCisgICAgICAgID4KKyAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgIHR1cGxlKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiBfX2EsIGNvbnN0IF9UcCYgLi4uIF9fdCkKKyAgICAgICAgOiBfX2Jhc2VfKGFsbG9jYXRvcl9hcmdfdCgpLCBfX2EsCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX2luZGljZXM8c2l6ZW9mLi4uKF9UcCk+Ojp0eXBlKCksCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPHR1cGxlLCBzaXplb2YuLi4oX1RwKT46OnR5cGUoKSwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX21ha2VfdHVwbGVfaW5kaWNlczwwPjo6dHlwZSgpLAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV90eXBlczx0dXBsZSwgMD46OnR5cGUoKSwKKyAgICAgICAgICAgICAgICBfX3QuLi4KKyAgICAgICAgICAgICAgICkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2MsIGJvb2wgX0R1bW15ID0gdHJ1ZSwKKyAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGVja0FyZ3NDb25zdHJ1Y3RvcjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRHVtbXkKKyAgICAgICAgICAgICAgICAgICAgICAgICA+Ojp0ZW1wbGF0ZSBfX2VuYWJsZV9leHBsaWNpdDxfVHAgY29uc3QmLi4uPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wKKyAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlID0gZmFsc2UKKyAgICAgICAgPgorICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgZXhwbGljaXQKKyAgICAgIHR1cGxlKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiBfX2EsIGNvbnN0IF9UcCYgLi4uIF9fdCkKKyAgICAgICAgOiBfX2Jhc2VfKGFsbG9jYXRvcl9hcmdfdCgpLCBfX2EsCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX2luZGljZXM8c2l6ZW9mLi4uKF9UcCk+Ojp0eXBlKCksCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPHR1cGxlLCBzaXplb2YuLi4oX1RwKT46OnR5cGUoKSwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX21ha2VfdHVwbGVfaW5kaWNlczwwPjo6dHlwZSgpLAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV90eXBlczx0dXBsZSwgMD46OnR5cGUoKSwKKyAgICAgICAgICAgICAgICBfX3QuLi4KKyAgICAgICAgICAgICAgICkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyAuLi5fVXAsCisgICAgICAgICAgICAgIGJvb2wgX1BhY2tJc1R1cGxlID0gX1BhY2tFeHBhbmRzVG9UaGlzVHVwbGU8X1VwLi4uPjo6dmFsdWUsCisgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICAgICAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hlY2tBcmdzQ29uc3RydWN0b3I8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZi4uLihfVXApID09IHNpemVvZi4uLihfVHApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFfUGFja0lzVHVwbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICA+Ojp0ZW1wbGF0ZSBfX2VuYWJsZV9pbXBsaWNpdDxfVXAuLi4+KCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9DaGVja0FyZ3NDb25zdHJ1Y3RvcjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRW5hYmxlSW1wbGljaXRSZWR1Y2VkQXJpdHlFeHRlbnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzaXplb2YuLi4oX1VwKSA8IHNpemVvZi4uLihfVHApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIV9QYWNrSXNUdXBsZQorICAgICAgICAgICAgICAgICAgICAgICAgID46OnRlbXBsYXRlIF9fZW5hYmxlX2ltcGxpY2l0PF9VcC4uLj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sCisgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSA9IGZhbHNlCisgICAgICAgICAgICAgPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgICAgIHR1cGxlKF9VcCYmLi4uIF9fdSkKKyAgICAgICAgICAgIF9OT0VYQ0VQVF8oKAorICAgICAgICAgICAgICAgIGlzX25vdGhyb3dfY29uc3RydWN0aWJsZTxfQmFzZVQsCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPHNpemVvZi4uLihfVXApPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPHR1cGxlLCBzaXplb2YuLi4oX1VwKT46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPHNpemVvZi4uLihfVHApLCBzaXplb2YuLi4oX1VwKT46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV90eXBlczx0dXBsZSwgc2l6ZW9mLi4uKF9UcCksIHNpemVvZi4uLihfVXApPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgX1VwLi4uCisgICAgICAgICAgICAgICAgPjo6dmFsdWUKKyAgICAgICAgICAgICkpCisgICAgICAgICAgICA6IF9fYmFzZV8odHlwZW5hbWUgX19tYWtlX3R1cGxlX2luZGljZXM8c2l6ZW9mLi4uKF9VcCk+Ojp0eXBlKCksCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV90eXBlczx0dXBsZSwgc2l6ZW9mLi4uKF9VcCk+Ojp0eXBlKCksCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPHNpemVvZi4uLihfVHApLCBzaXplb2YuLi4oX1VwKT46OnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPHR1cGxlLCBzaXplb2YuLi4oX1RwKSwgc2l6ZW9mLi4uKF9VcCk+Ojp0eXBlKCksCisgICAgICAgICAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkPF9VcD4oX191KS4uLikge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyAuLi5fVXAsCisgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICAgICAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hlY2tBcmdzQ29uc3RydWN0b3I8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZi4uLihfVXApIDw9IHNpemVvZi4uLihfVHApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFfUGFja0V4cGFuZHNUb1RoaXNUdXBsZTxfVXAuLi4+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgID46OnRlbXBsYXRlIF9fZW5hYmxlX2V4cGxpY2l0PF9VcC4uLj4oKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGVja0FyZ3NDb25zdHJ1Y3RvcjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhX0VuYWJsZUltcGxpY2l0UmVkdWNlZEFyaXR5RXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2l6ZW9mLi4uKF9VcCkgPCBzaXplb2YuLi4oX1RwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFfUGFja0V4cGFuZHNUb1RoaXNUdXBsZTxfVXAuLi4+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgID46OnRlbXBsYXRlIF9fZW5hYmxlX2ltcGxpY2l0PF9VcC4uLj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sCisgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSA9IGZhbHNlCisgICAgICAgICAgICAgPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIHR1cGxlKF9VcCYmLi4uIF9fdSkKKyAgICAgICAgICAgIF9OT0VYQ0VQVF8oKAorICAgICAgICAgICAgICAgIGlzX25vdGhyb3dfY29uc3RydWN0aWJsZTxfQmFzZVQsCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPHNpemVvZi4uLihfVXApPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPHR1cGxlLCBzaXplb2YuLi4oX1VwKT46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPHNpemVvZi4uLihfVHApLCBzaXplb2YuLi4oX1VwKT46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV90eXBlczx0dXBsZSwgc2l6ZW9mLi4uKF9UcCksIHNpemVvZi4uLihfVXApPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgX1VwLi4uCisgICAgICAgICAgICAgICAgPjo6dmFsdWUKKyAgICAgICAgICAgICkpCisgICAgICAgICAgICA6IF9fYmFzZV8odHlwZW5hbWUgX19tYWtlX3R1cGxlX2luZGljZXM8c2l6ZW9mLi4uKF9VcCk+Ojp0eXBlKCksCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV90eXBlczx0dXBsZSwgc2l6ZW9mLi4uKF9VcCk+Ojp0eXBlKCksCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPHNpemVvZi4uLihfVHApLCBzaXplb2YuLi4oX1VwKT46OnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPHR1cGxlLCBzaXplb2YuLi4oX1RwKSwgc2l6ZW9mLi4uKF9VcCk+Ojp0eXBlKCksCisgICAgICAgICAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkPF9VcD4oX191KS4uLikge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2MsIGNsYXNzIC4uLl9VcCwKKyAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGVja0FyZ3NDb25zdHJ1Y3RvcjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mLi4uKF9VcCkgPT0gc2l6ZW9mLi4uKF9UcCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIV9QYWNrRXhwYW5kc1RvVGhpc1R1cGxlPF9VcC4uLj46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgPjo6dGVtcGxhdGUgX19lbmFibGVfaW1wbGljaXQ8X1VwLi4uPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wKKyAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlID0gZmFsc2UKKyAgICAgICAgICAgICA+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdHVwbGUoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2MmIF9fYSwgX1VwJiYuLi4gX191KQorICAgICAgICAgICAgOiBfX2Jhc2VfKGFsbG9jYXRvcl9hcmdfdCgpLCBfX2EsCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPHNpemVvZi4uLihfVXApPjo6dHlwZSgpLAorICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX21ha2VfdHVwbGVfdHlwZXM8dHVwbGUsIHNpemVvZi4uLihfVXApPjo6dHlwZSgpLAorICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX21ha2VfdHVwbGVfaW5kaWNlczxzaXplb2YuLi4oX1RwKSwgc2l6ZW9mLi4uKF9VcCk+Ojp0eXBlKCksCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV90eXBlczx0dXBsZSwgc2l6ZW9mLi4uKF9UcCksIHNpemVvZi4uLihfVXApPjo6dHlwZSgpLAorICAgICAgICAgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZDxfVXA+KF9fdSkuLi4pIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jLCBjbGFzcyAuLi5fVXAsCisgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICAgICAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hlY2tBcmdzQ29uc3RydWN0b3I8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZi4uLihfVXApID09IHNpemVvZi4uLihfVHApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFfUGFja0V4cGFuZHNUb1RoaXNUdXBsZTxfVXAuLi4+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgID46OnRlbXBsYXRlIF9fZW5hYmxlX2V4cGxpY2l0PF9VcC4uLj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sCisgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSA9IGZhbHNlCisgICAgICAgICAgICAgPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIHR1cGxlKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiBfX2EsIF9VcCYmLi4uIF9fdSkKKyAgICAgICAgICAgIDogX19iYXNlXyhhbGxvY2F0b3JfYXJnX3QoKSwgX19hLAorICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX21ha2VfdHVwbGVfaW5kaWNlczxzaXplb2YuLi4oX1VwKT46OnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3R5cGVzPHR1cGxlLCBzaXplb2YuLi4oX1VwKT46OnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX2luZGljZXM8c2l6ZW9mLi4uKF9UcCksIHNpemVvZi4uLihfVXApPjo6dHlwZSgpLAorICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX21ha2VfdHVwbGVfdHlwZXM8dHVwbGUsIHNpemVvZi4uLihfVHApLCBzaXplb2YuLi4oX1VwKT46OnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X1VwPihfX3UpLi4uKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UdXBsZSwKKyAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGVja1R1cGxlTGlrZUNvbnN0cnVjdG9yPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3R1cGxlX2xpa2Vfd2l0aF9zaXplPF9UdXBsZSwgc2l6ZW9mLi4uKF9UcCk+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhX1BhY2tFeHBhbmRzVG9UaGlzVHVwbGU8X1R1cGxlPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICA+Ojp0ZW1wbGF0ZSBfX2VuYWJsZV9pbXBsaWNpdDxfVHVwbGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbAorICAgICAgICAgICAgICAgICAgICAgID46OnR5cGUgPSBmYWxzZQorICAgICAgICAgICAgID4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorICAgICAgICB0dXBsZShfVHVwbGUmJiBfX3QpIF9OT0VYQ0VQVF8oKGlzX25vdGhyb3dfY29uc3RydWN0aWJsZTxfQmFzZVQsIF9UdXBsZT46OnZhbHVlKSkKKyAgICAgICAgICAgIDogX19iYXNlXyhfVlNURDo6Zm9yd2FyZDxfVHVwbGU+KF9fdCkpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1R1cGxlLAorICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgICAgICAgICAgICAgICA8CisgICAgICAgICAgICAgICAgICAgICAgICAgX0NoZWNrVHVwbGVMaWtlQ29uc3RydWN0b3I8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdHVwbGVfbGlrZV93aXRoX3NpemU8X1R1cGxlLCBzaXplb2YuLi4oX1RwKT46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFfUGFja0V4cGFuZHNUb1RoaXNUdXBsZTxfVHVwbGU+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgID46OnRlbXBsYXRlIF9fZW5hYmxlX2V4cGxpY2l0PF9UdXBsZT4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sCisgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSA9IGZhbHNlCisgICAgICAgICAgICAgPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIHR1cGxlKF9UdXBsZSYmIF9fdCkgX05PRVhDRVBUXygoaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlPF9CYXNlVCwgX1R1cGxlPjo6dmFsdWUpKQorICAgICAgICAgICAgOiBfX2Jhc2VfKF9WU1REOjpmb3J3YXJkPF9UdXBsZT4oX190KSkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2MsIGNsYXNzIF9UdXBsZSwKKyAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgICAgICAgICAgIF9DaGVja1R1cGxlTGlrZUNvbnN0cnVjdG9yPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3R1cGxlX2xpa2Vfd2l0aF9zaXplPF9UdXBsZSwgc2l6ZW9mLi4uKF9UcCk+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgID46OnRlbXBsYXRlIF9fZW5hYmxlX2ltcGxpY2l0PF9UdXBsZT4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sCisgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSA9IGZhbHNlCisgICAgICAgICAgICAgPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHR1cGxlKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiBfX2EsIF9UdXBsZSYmIF9fdCkKKyAgICAgICAgICAgIDogX19iYXNlXyhhbGxvY2F0b3JfYXJnX3QoKSwgX19hLCBfVlNURDo6Zm9yd2FyZDxfVHVwbGU+KF9fdCkpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jLCBjbGFzcyBfVHVwbGUsCisgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICAgICAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hlY2tUdXBsZUxpa2VDb25zdHJ1Y3RvcjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190dXBsZV9saWtlX3dpdGhfc2l6ZTxfVHVwbGUsIHNpemVvZi4uLihfVHApPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICA+Ojp0ZW1wbGF0ZSBfX2VuYWJsZV9leHBsaWNpdDxfVHVwbGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbAorICAgICAgICAgICAgICAgICAgICAgID46OnR5cGUgPSBmYWxzZQorICAgICAgICAgICAgID4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBleHBsaWNpdAorICAgICAgICB0dXBsZShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYgX19hLCBfVHVwbGUmJiBfX3QpCisgICAgICAgICAgICA6IF9fYmFzZV8oYWxsb2NhdG9yX2FyZ190KCksIF9fYSwgX1ZTVEQ6OmZvcndhcmQ8X1R1cGxlPihfX3QpKSB7fQorCisgICAgdXNpbmcgX0NhbkNvcHlBc3NpZ24gPSBfX2FsbDxpc19jb3B5X2Fzc2lnbmFibGU8X1RwPjo6dmFsdWUuLi4+OworICAgIHVzaW5nIF9DYW5Nb3ZlQXNzaWduID0gX19hbGw8aXNfbW92ZV9hc3NpZ25hYmxlPF9UcD46OnZhbHVlLi4uPjsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0dXBsZSYgb3BlcmF0b3I9KHR5cGVuYW1lIGNvbmRpdGlvbmFsPF9DYW5Db3B5QXNzaWduOjp2YWx1ZSwgdHVwbGUsIF9fbmF0Pjo6dHlwZSBjb25zdCYgX190KQorICAgICAgICBfTk9FWENFUFRfKChfX2FsbDxpc19ub3Rocm93X2NvcHlfYXNzaWduYWJsZTxfVHA+Ojp2YWx1ZS4uLj46OnZhbHVlKSkKKyAgICB7CisgICAgICAgIF9fYmFzZV8ub3BlcmF0b3I9KF9fdC5fX2Jhc2VfKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB0dXBsZSYgb3BlcmF0b3I9KHR5cGVuYW1lIGNvbmRpdGlvbmFsPF9DYW5Nb3ZlQXNzaWduOjp2YWx1ZSwgdHVwbGUsIF9fbmF0Pjo6dHlwZSYmIF9fdCkKKyAgICAgICAgX05PRVhDRVBUXygoX19hbGw8aXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8X1RwPjo6dmFsdWUuLi4+Ojp2YWx1ZSkpCisgICAgeworICAgICAgICBfX2Jhc2VfLm9wZXJhdG9yPShzdGF0aWNfY2FzdDxfQmFzZVQmJj4oX190Ll9fYmFzZV8pKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHVwbGUsCisgICAgICAgICAgICAgIGNsYXNzID0gdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgICAgICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fdHVwbGVfYXNzaWduYWJsZTxfVHVwbGUsIHR1cGxlPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgICAgICAgICAgPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHR1cGxlJgorICAgICAgICBvcGVyYXRvcj0oX1R1cGxlJiYgX190KSBfTk9FWENFUFRfKChpc19ub3Rocm93X2Fzc2lnbmFibGU8X0Jhc2VUJiwgX1R1cGxlPjo6dmFsdWUpKQorICAgICAgICB7CisgICAgICAgICAgICBfX2Jhc2VfLm9wZXJhdG9yPShfVlNURDo6Zm9yd2FyZDxfVHVwbGU+KF9fdCkpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKHR1cGxlJiBfX3QpIF9OT0VYQ0VQVF8oX19hbGw8X19pc19ub3Rocm93X3N3YXBwYWJsZTxfVHA+Ojp2YWx1ZS4uLj46OnZhbHVlKQorICAgICAgICB7X19iYXNlXy5zd2FwKF9fdC5fX2Jhc2VfKTt9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdHVwbGU8PgoreworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfTElCQ1BQX0NPTlNURVhQUiB0dXBsZSgpIF9OT0VYQ0VQVCB7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB0dXBsZShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYpIF9OT0VYQ0VQVCB7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICB0dXBsZShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYsIGNvbnN0IHR1cGxlJikgX05PRVhDRVBUIHt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHR1cGxlKGFycmF5PF9VcCwgMD4pIF9OT0VYQ0VQVCB7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfQWxsb2MsIGNsYXNzIF9VcD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHR1cGxlKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiwgYXJyYXk8X1VwLCAwPikgX05PRVhDRVBUIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgc3dhcCh0dXBsZSYpIF9OT0VYQ0VQVCB7fQorfTsKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19ERURVQ1RJT05fR1VJREVTCisvLyBOT1RFOiBUaGVzZSBhcmUgbm90IHlldCBzdGFuZGFyZGl6ZWQsIGJ1dCBhcmUgcmVxdWlyZWQgdG8gc2ltdWxhdGUgdGhlCisvLyBpbXBsaWNpdCBkZWR1Y3Rpb24gZ3VpZGUgdGhhdCBzaG91bGQgYmUgZ2VuZXJhdGVkIGhhZCBsaWJjKysgZGVjbGFyZWQgdGhlCisvLyB0dXBsZS1saWtlIGNvbnN0cnVjdG9ycyAiY29ycmVjdGx5IgordGVtcGxhdGUgPGNsYXNzIF9BbGxvYywgY2xhc3MgLi4uX0FyZ3M+Cit0dXBsZShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYsIHR1cGxlPF9BcmdzLi4uPiBjb25zdCYpIC0+IHR1cGxlPF9BcmdzLi4uPjsKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2MsIGNsYXNzIC4uLl9BcmdzPgordHVwbGUoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2MmLCB0dXBsZTxfQXJncy4uLj4mJikgLT4gdHVwbGU8X0FyZ3MuLi4+OworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyAuLi5fVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19hbGw8X19pc19zd2FwcGFibGU8X1RwPjo6dmFsdWUuLi4+Ojp2YWx1ZSwKKyAgICB2b2lkCis+Ojp0eXBlCitzd2FwKHR1cGxlPF9UcC4uLj4mIF9fdCwgdHVwbGU8X1RwLi4uPiYgX191KQorICAgICAgICAgICAgICAgICBfTk9FWENFUFRfKF9fYWxsPF9faXNfbm90aHJvd19zd2FwcGFibGU8X1RwPjo6dmFsdWUuLi4+Ojp2YWx1ZSkKKyAgICB7X190LnN3YXAoX191KTt9CisKKy8vIGdldAorCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgLi4uX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK3R5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0lwLCB0dXBsZTxfVHAuLi4+ID46OnR5cGUmCitnZXQodHVwbGU8X1RwLi4uPiYgX190KSBfTk9FWENFUFQKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0lwLCB0dXBsZTxfVHAuLi4+ID46OnR5cGUgdHlwZTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X190dXBsZV9sZWFmPF9JcCwgdHlwZT4mPihfX3QuX19iYXNlXykuZ2V0KCk7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcyAuLi5fVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorY29uc3QgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSXAsIHR1cGxlPF9UcC4uLj4gPjo6dHlwZSYKK2dldChjb25zdCB0dXBsZTxfVHAuLi4+JiBfX3QpIF9OT0VYQ0VQVAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSXAsIHR1cGxlPF9UcC4uLj4gPjo6dHlwZSB0eXBlOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBfX3R1cGxlX2xlYWY8X0lwLCB0eXBlPiY+KF9fdC5fX2Jhc2VfKS5nZXQoKTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIC4uLl9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCit0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9JcCwgdHVwbGU8X1RwLi4uPiA+Ojp0eXBlJiYKK2dldCh0dXBsZTxfVHAuLi4+JiYgX190KSBfTk9FWENFUFQKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0lwLCB0dXBsZTxfVHAuLi4+ID46OnR5cGUgdHlwZTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dHlwZSYmPigKKyAgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX3R1cGxlX2xlYWY8X0lwLCB0eXBlPiYmPihfX3QuX19iYXNlXykuZ2V0KCkpOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgLi4uX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK2NvbnN0IHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0lwLCB0dXBsZTxfVHAuLi4+ID46OnR5cGUmJgorZ2V0KGNvbnN0IHR1cGxlPF9UcC4uLj4mJiBfX3QpIF9OT0VYQ0VQVAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSXAsIHR1cGxlPF9UcC4uLj4gPjo6dHlwZSB0eXBlOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCB0eXBlJiY+KAorICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IF9fdHVwbGVfbGVhZjxfSXAsIHR5cGU+JiY+KF9fdC5fX2Jhc2VfKS5nZXQoKSk7Cit9CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorCituYW1lc3BhY2UgX19maW5kX2RldGFpbCB7CisKK3N0YXRpYyBjb25zdGV4cHIgc2l6ZV90IF9fbm90X2ZvdW5kID0gLTE7CitzdGF0aWMgY29uc3RleHByIHNpemVfdCBfX2FtYmlndW91cyA9IF9fbm90X2ZvdW5kIC0gMTsKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBzaXplX3QgX19maW5kX2lkeF9yZXR1cm4oc2l6ZV90IF9fY3Vycl9pLCBzaXplX3QgX19yZXMsIGJvb2wgX19tYXRjaGVzKSB7CisgICAgcmV0dXJuICFfX21hdGNoZXMgPyBfX3JlcyA6CisgICAgICAgIChfX3JlcyA9PSBfX25vdF9mb3VuZCA/IF9fY3Vycl9pIDogX19hbWJpZ3VvdXMpOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9OeD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdGV4cHIgc2l6ZV90IF9fZmluZF9pZHgoc2l6ZV90IF9faSwgY29uc3QgYm9vbCAoJl9fbWF0Y2hlcylbX054XSkgeworICByZXR1cm4gX19pID09IF9OeCA/IF9fbm90X2ZvdW5kIDoKKyAgICAgIF9fZmluZF9pZHhfcmV0dXJuKF9faSwgX19maW5kX2lkeChfX2kgKyAxLCBfX21hdGNoZXMpLCBfX21hdGNoZXNbX19pXSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIC4uLl9BcmdzPgorc3RydWN0IF9fZmluZF9leGFjdGx5X29uZV9jaGVja2VkIHsKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgX19tYXRjaGVzW3NpemVvZi4uLihfQXJncyldID0ge2lzX3NhbWU8X1QxLCBfQXJncz46OnZhbHVlLi4ufTsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCB2YWx1ZSA9IF9fZmluZF9kZXRhaWw6Ol9fZmluZF9pZHgoMCwgX19tYXRjaGVzKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHZhbHVlICE9IF9fbm90X2ZvdW5kLCAidHlwZSBub3QgZm91bmQgaW4gdHlwZSBsaXN0IiApOworICAgIHN0YXRpY19hc3NlcnQodmFsdWUgIT0gX19hbWJpZ3VvdXMsICJ0eXBlIG9jY3VycyBtb3JlIHRoYW4gb25jZSBpbiB0eXBlIGxpc3QiKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVDE+CitzdHJ1Y3QgX19maW5kX2V4YWN0bHlfb25lX2NoZWNrZWQ8X1QxPiB7CisgICAgc3RhdGljX2Fzc2VydCghaXNfc2FtZTxfVDEsIF9UMT46OnZhbHVlLCAidHlwZSBub3QgaW4gZW1wdHkgdHlwZSBsaXN0Iik7Cit9OworCit9IC8vIG5hbWVzcGFjZSBfX2ZpbmRfZGV0YWlsOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZS4uLiBfQXJncz4KK3N0cnVjdCBfX2ZpbmRfZXhhY3RseV9vbmVfdAorICAgIDogcHVibGljIF9fZmluZF9kZXRhaWw6Ol9fZmluZF9leGFjdGx5X29uZV9jaGVja2VkPF9UMSwgX0FyZ3MuLi4+IHsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzLi4uIF9BcmdzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBfVDEmIGdldCh0dXBsZTxfQXJncy4uLj4mIF9fdHVwKSBub2V4Y2VwdAoreworICAgIHJldHVybiBfVlNURDo6Z2V0PF9fZmluZF9leGFjdGx5X29uZV90PF9UMSwgX0FyZ3MuLi4+Ojp2YWx1ZT4oX190dXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcy4uLiBfQXJncz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdGV4cHIgX1QxIGNvbnN0JiBnZXQodHVwbGU8X0FyZ3MuLi4+IGNvbnN0JiBfX3R1cCkgbm9leGNlcHQKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OmdldDxfX2ZpbmRfZXhhY3RseV9vbmVfdDxfVDEsIF9BcmdzLi4uPjo6dmFsdWU+KF9fdHVwKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MuLi4gX0FyZ3M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RleHByIF9UMSYmIGdldCh0dXBsZTxfQXJncy4uLj4mJiBfX3R1cCkgbm9leGNlcHQKK3sKKyAgICByZXR1cm4gX1ZTVEQ6OmdldDxfX2ZpbmRfZXhhY3RseV9vbmVfdDxfVDEsIF9BcmdzLi4uPjo6dmFsdWU+KF9WU1REOjptb3ZlKF9fdHVwKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzLi4uIF9BcmdzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBfVDEgY29uc3QmJiBnZXQodHVwbGU8X0FyZ3MuLi4+IGNvbnN0JiYgX190dXApIG5vZXhjZXB0Cit7CisgICAgcmV0dXJuIF9WU1REOjpnZXQ8X19maW5kX2V4YWN0bHlfb25lX3Q8X1QxLCBfQXJncy4uLj46OnZhbHVlPihfVlNURDo6bW92ZShfX3R1cCkpOworfQorCisjZW5kaWYKKworLy8gdGllCisKK3RlbXBsYXRlIDxjbGFzcyAuLi5fVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQordHVwbGU8X1RwJi4uLj4KK3RpZShfVHAmLi4uIF9fdCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIHR1cGxlPF9UcCYuLi4+KF9fdC4uLik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVXA+CitzdHJ1Y3QgX19pZ25vcmVfdAoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorICAgIGNvbnN0IF9faWdub3JlX3QmIG9wZXJhdG9yPShfVHAmJikgY29uc3Qge3JldHVybiAqdGhpczt9Cit9OworCituYW1lc3BhY2UgeworICBfTElCQ1BQX0lOTElORV9WQVIgY29uc3RleHByIF9faWdub3JlX3Q8dW5zaWduZWQgY2hhcj4gaWdub3JlID0gX19pZ25vcmVfdDx1bnNpZ25lZCBjaGFyPigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fbWFrZV90dXBsZV9yZXR1cm5faW1wbAoreworICAgIHR5cGVkZWYgX1RwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fbWFrZV90dXBsZV9yZXR1cm5faW1wbDxyZWZlcmVuY2Vfd3JhcHBlcjxfVHA+ID4KK3sKKyAgICB0eXBlZGVmIF9UcCYgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19tYWtlX3R1cGxlX3JldHVybgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19tYWtlX3R1cGxlX3JldHVybl9pbXBsPHR5cGVuYW1lIGRlY2F5PF9UcD46OnR5cGU+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK3R1cGxlPHR5cGVuYW1lIF9fbWFrZV90dXBsZV9yZXR1cm48X1RwPjo6dHlwZS4uLj4KK21ha2VfdHVwbGUoX1RwJiYuLi4gX190KQoreworICAgIHJldHVybiB0dXBsZTx0eXBlbmFtZSBfX21ha2VfdHVwbGVfcmV0dXJuPF9UcD46OnR5cGUuLi4+KF9WU1REOjpmb3J3YXJkPF9UcD4oX190KS4uLik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcy4uLiBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQordHVwbGU8X1RwJiYuLi4+Citmb3J3YXJkX2FzX3R1cGxlKF9UcCYmLi4uIF9fdCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIHR1cGxlPF9UcCYmLi4uPihfVlNURDo6Zm9yd2FyZDxfVHA+KF9fdCkuLi4pOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcD4KK3N0cnVjdCBfX3R1cGxlX2VxdWFsCit7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9VcCYgX195KQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9fdHVwbGVfZXF1YWw8X0lwIC0gMT4oKShfX3gsIF9feSkgJiYgX1ZTVEQ6OmdldDxfSXAtMT4oX194KSA9PSBfVlNURDo6Z2V0PF9JcC0xPihfX3kpOworICAgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX190dXBsZV9lcXVhbDwwPgoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYsIGNvbnN0IF9VcCYpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX1RwLCBjbGFzcyAuLi5fVXA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorYm9vbAorb3BlcmF0b3I9PShjb25zdCB0dXBsZTxfVHAuLi4+JiBfX3gsIGNvbnN0IHR1cGxlPF9VcC4uLj4mIF9feSkKK3sKKyAgICByZXR1cm4gX190dXBsZV9lcXVhbDxzaXplb2YuLi4oX1RwKT4oKShfX3gsIF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyAuLi5fVHAsIGNsYXNzIC4uLl9VcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitib29sCitvcGVyYXRvciE9KGNvbnN0IHR1cGxlPF9UcC4uLj4mIF9feCwgY29uc3QgdHVwbGU8X1VwLi4uPiYgX195KQoreworICAgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcD4KK3N0cnVjdCBfX3R1cGxlX2xlc3MKK3sKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1VwJiBfX3kpCisgICAgeworICAgICAgICBjb25zdCBzaXplX3QgX19pZHggPSB0dXBsZV9zaXplPF9UcD46OnZhbHVlIC0gX0lwOworICAgICAgICBpZiAoX1ZTVEQ6OmdldDxfX2lkeD4oX194KSA8IF9WU1REOjpnZXQ8X19pZHg+KF9feSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKF9WU1REOjpnZXQ8X19pZHg+KF9feSkgPCBfVlNURDo6Z2V0PF9faWR4PihfX3gpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gX190dXBsZV9sZXNzPF9JcC0xPigpKF9feCwgX195KTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9fdHVwbGVfbGVzczwwPgoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYsIGNvbnN0IF9VcCYpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIC4uLl9UcCwgY2xhc3MgLi4uX1VwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK2Jvb2wKK29wZXJhdG9yPChjb25zdCB0dXBsZTxfVHAuLi4+JiBfX3gsIGNvbnN0IHR1cGxlPF9VcC4uLj4mIF9feSkKK3sKKyAgICByZXR1cm4gX190dXBsZV9sZXNzPHNpemVvZi4uLihfVHApPigpKF9feCwgX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIC4uLl9UcCwgY2xhc3MgLi4uX1VwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK2Jvb2wKK29wZXJhdG9yPihjb25zdCB0dXBsZTxfVHAuLi4+JiBfX3gsIGNvbnN0IHR1cGxlPF9VcC4uLj4mIF9feSkKK3sKKyAgICByZXR1cm4gX195IDwgX194OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX1RwLCBjbGFzcyAuLi5fVXA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorYm9vbAorb3BlcmF0b3I+PShjb25zdCB0dXBsZTxfVHAuLi4+JiBfX3gsIGNvbnN0IHR1cGxlPF9VcC4uLj4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPCBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX1RwLCBjbGFzcyAuLi5fVXA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorYm9vbAorb3BlcmF0b3I8PShjb25zdCB0dXBsZTxfVHAuLi4+JiBfX3gsIGNvbnN0IHR1cGxlPF9VcC4uLj4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3kgPCBfX3gpOworfQorCisvLyB0dXBsZV9jYXQKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPiBzdHJ1Y3QgX190dXBsZV9jYXRfdHlwZTsKKwordGVtcGxhdGUgPGNsYXNzIC4uLl9UdHlwZXMsIGNsYXNzIC4uLl9VdHlwZXM+CitzdHJ1Y3QgX190dXBsZV9jYXRfdHlwZTx0dXBsZTxfVHR5cGVzLi4uPiwgX190dXBsZV90eXBlczxfVXR5cGVzLi4uPiA+Cit7CisgICAgdHlwZWRlZiB0dXBsZTxfVHR5cGVzLi4uLCBfVXR5cGVzLi4uPiB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXN1bHRUdXBsZSwgYm9vbCBfSXNfVHVwbGUwVHVwbGVMaWtlLCBjbGFzcyAuLi5fVHVwbGVzPgorc3RydWN0IF9fdHVwbGVfY2F0X3JldHVybl8xCit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX1R5cGVzLCBjbGFzcyBfVHVwbGUwPgorc3RydWN0IF9fdHVwbGVfY2F0X3JldHVybl8xPHR1cGxlPF9UeXBlcy4uLj4sIHRydWUsIF9UdXBsZTA+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3R1cGxlX2NhdF90eXBlPHR1cGxlPF9UeXBlcy4uLj4sCisgICAgICAgICAgICB0eXBlbmFtZSBfX21ha2VfdHVwbGVfdHlwZXM8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHVwbGUwPjo6dHlwZT46OnR5cGU+Ojp0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIC4uLl9UeXBlcywgY2xhc3MgX1R1cGxlMCwgY2xhc3MgX1R1cGxlMSwgY2xhc3MgLi4uX1R1cGxlcz4KK3N0cnVjdCBfX3R1cGxlX2NhdF9yZXR1cm5fMTx0dXBsZTxfVHlwZXMuLi4+LCB0cnVlLCBfVHVwbGUwLCBfVHVwbGUxLCBfVHVwbGVzLi4uPgorICAgIDogcHVibGljIF9fdHVwbGVfY2F0X3JldHVybl8xPAorICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX3R1cGxlX2NhdF90eXBlPAorICAgICAgICAgICAgICAgICAgICAgdHVwbGU8X1R5cGVzLi4uPiwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV90eXBlczx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UdXBsZTA+Ojp0eXBlPjo6dHlwZQorICAgICAgICAgICAgICAgICA+Ojp0eXBlLAorICAgICAgICAgICAgICAgICBfX3R1cGxlX2xpa2U8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHVwbGUxPjo6dHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICBfVHVwbGUxLCBfVHVwbGVzLi4uPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIC4uLl9UdXBsZXM+IHN0cnVjdCBfX3R1cGxlX2NhdF9yZXR1cm47CisKK3RlbXBsYXRlIDxjbGFzcyBfVHVwbGUwLCBjbGFzcyAuLi5fVHVwbGVzPgorc3RydWN0IF9fdHVwbGVfY2F0X3JldHVybjxfVHVwbGUwLCBfVHVwbGVzLi4uPgorICAgIDogcHVibGljIF9fdHVwbGVfY2F0X3JldHVybl8xPHR1cGxlPD4sCisgICAgICAgICBfX3R1cGxlX2xpa2U8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHVwbGUwPjo6dHlwZT46OnZhbHVlLCBfVHVwbGUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1R1cGxlcy4uLj4KK3sKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX190dXBsZV9jYXRfcmV0dXJuPD4KK3sKKyAgICB0eXBlZGVmIHR1cGxlPD4gdHlwZTsKK307CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCit0dXBsZTw+Cit0dXBsZV9jYXQoKQoreworICAgIHJldHVybiB0dXBsZTw+KCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9JbmRpY2VzLCBjbGFzcyBfVHVwbGUwLCBjbGFzcyAuLi5fVHVwbGVzPgorc3RydWN0IF9fdHVwbGVfY2F0X3JldHVybl9yZWZfaW1wOworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX1R5cGVzLCBzaXplX3QgLi4uX0kwLCBjbGFzcyBfVHVwbGUwPgorc3RydWN0IF9fdHVwbGVfY2F0X3JldHVybl9yZWZfaW1wPHR1cGxlPF9UeXBlcy4uLj4sIF9fdHVwbGVfaW5kaWNlczxfSTAuLi4+LCBfVHVwbGUwPgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHVwbGUwPjo6dHlwZSBfVDA7CisgICAgdHlwZWRlZiB0dXBsZTxfVHlwZXMuLi4sIHR5cGVuYW1lIF9fYXBwbHlfY3Y8X1R1cGxlMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSTAsIF9UMD46OnR5cGU+Ojp0eXBlJiYuLi4+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX1R5cGVzLCBzaXplX3QgLi4uX0kwLCBjbGFzcyBfVHVwbGUwLCBjbGFzcyBfVHVwbGUxLCBjbGFzcyAuLi5fVHVwbGVzPgorc3RydWN0IF9fdHVwbGVfY2F0X3JldHVybl9yZWZfaW1wPHR1cGxlPF9UeXBlcy4uLj4sIF9fdHVwbGVfaW5kaWNlczxfSTAuLi4+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UdXBsZTAsIF9UdXBsZTEsIF9UdXBsZXMuLi4+CisgICAgOiBwdWJsaWMgX190dXBsZV9jYXRfcmV0dXJuX3JlZl9pbXA8CisgICAgICAgICB0dXBsZTxfVHlwZXMuLi4sIHR5cGVuYW1lIF9fYXBwbHlfY3Y8X1R1cGxlMCwKKyAgICAgICAgICAgICAgIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0kwLAorICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHVwbGUwPjo6dHlwZT46OnR5cGU+Ojp0eXBlJiYuLi4+LAorICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX2luZGljZXM8dHVwbGVfc2l6ZTx0eXBlbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX3JlZmVyZW5jZTxfVHVwbGUxPjo6dHlwZT46OnZhbHVlPjo6dHlwZSwKKyAgICAgICAgIF9UdXBsZTEsIF9UdXBsZXMuLi4+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1R1cGxlMCwgY2xhc3MgLi4uX1R1cGxlcz4KK3N0cnVjdCBfX3R1cGxlX2NhdF9yZXR1cm5fcmVmCisgICAgOiBwdWJsaWMgX190dXBsZV9jYXRfcmV0dXJuX3JlZl9pbXA8dHVwbGU8PiwKKyAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPAorICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGVfc2l6ZTx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UdXBsZTA+Ojp0eXBlPjo6dmFsdWUKKyAgICAgICAgICAgICAgID46OnR5cGUsIF9UdXBsZTAsIF9UdXBsZXMuLi4+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1R5cGVzLCBjbGFzcyBfSTAsIGNsYXNzIF9KMD4KK3N0cnVjdCBfX3R1cGxlX2NhdDsKKwordGVtcGxhdGUgPGNsYXNzIC4uLl9UeXBlcywgc2l6ZV90IC4uLl9JMCwgc2l6ZV90IC4uLl9KMD4KK3N0cnVjdCBfX3R1cGxlX2NhdDx0dXBsZTxfVHlwZXMuLi4+LCBfX3R1cGxlX2luZGljZXM8X0kwLi4uPiwgX190dXBsZV9pbmRpY2VzPF9KMC4uLj4gPgoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHVwbGUwPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICB0eXBlbmFtZSBfX3R1cGxlX2NhdF9yZXR1cm5fcmVmPHR1cGxlPF9UeXBlcy4uLj4mJiwgX1R1cGxlMCYmPjo6dHlwZQorICAgIG9wZXJhdG9yKCkodHVwbGU8X1R5cGVzLi4uPiBfX3QsIF9UdXBsZTAmJiBfX3QwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZvcndhcmRfYXNfdHVwbGUoX1ZTVEQ6OmZvcndhcmQ8X1R5cGVzPihfVlNURDo6Z2V0PF9JMD4oX190KSkuLi4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WU1REOjpnZXQ8X0owPihfVlNURDo6Zm9yd2FyZDxfVHVwbGUwPihfX3QwKSkuLi4pOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHVwbGUwLCBjbGFzcyBfVHVwbGUxLCBjbGFzcyAuLi5fVHVwbGVzPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICB0eXBlbmFtZSBfX3R1cGxlX2NhdF9yZXR1cm5fcmVmPHR1cGxlPF9UeXBlcy4uLj4mJiwgX1R1cGxlMCYmLCBfVHVwbGUxJiYsIF9UdXBsZXMmJi4uLj46OnR5cGUKKyAgICBvcGVyYXRvcigpKHR1cGxlPF9UeXBlcy4uLj4gX190LCBfVHVwbGUwJiYgX190MCwgX1R1cGxlMSYmIF9fdDEsIF9UdXBsZXMmJiAuLi5fX3RwbHMpCisgICAgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1R1cGxlMD46OnR5cGUgX1QwOworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1R1cGxlMT46OnR5cGUgX1QxOworICAgICAgICByZXR1cm4gX190dXBsZV9jYXQ8CisgICAgICAgICAgIHR1cGxlPF9UeXBlcy4uLiwgdHlwZW5hbWUgX19hcHBseV9jdjxfVHVwbGUwLCB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9KMCwgX1QwPjo6dHlwZT46OnR5cGUmJi4uLj4sCisgICAgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPHNpemVvZiAuLi4oX1R5cGVzKSArIHR1cGxlX3NpemU8X1QwPjo6dmFsdWU+Ojp0eXBlLAorICAgICAgICAgICB0eXBlbmFtZSBfX21ha2VfdHVwbGVfaW5kaWNlczx0dXBsZV9zaXplPF9UMT46OnZhbHVlPjo6dHlwZT4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcndhcmRfYXNfdHVwbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZDxfVHlwZXM+KF9WU1REOjpnZXQ8X0kwPihfX3QpKS4uLiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WU1REOjpnZXQ8X0owPihfVlNURDo6Zm9yd2FyZDxfVHVwbGUwPihfX3QwKSkuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkPF9UdXBsZTE+KF9fdDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkPF9UdXBsZXM+KF9fdHBscykuLi4pOworICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHVwbGUwLCBjbGFzcy4uLiBfVHVwbGVzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK3R5cGVuYW1lIF9fdHVwbGVfY2F0X3JldHVybjxfVHVwbGUwLCBfVHVwbGVzLi4uPjo6dHlwZQordHVwbGVfY2F0KF9UdXBsZTAmJiBfX3QwLCBfVHVwbGVzJiYuLi4gX190cGxzKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHVwbGUwPjo6dHlwZSBfVDA7CisgICAgcmV0dXJuIF9fdHVwbGVfY2F0PHR1cGxlPD4sIF9fdHVwbGVfaW5kaWNlczw+LAorICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX2luZGljZXM8dHVwbGVfc2l6ZTxfVDA+Ojp2YWx1ZT46OnR5cGU+KCkKKyAgICAgICAgICAgICAgICAgICh0dXBsZTw+KCksIF9WU1REOjpmb3J3YXJkPF9UdXBsZTA+KF9fdDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZDxfVHVwbGVzPihfX3RwbHMpLi4uKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIC4uLl9UcCwgY2xhc3MgX0FsbG9jPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHVzZXNfYWxsb2NhdG9yPHR1cGxlPF9UcC4uLj4sIF9BbGxvYz4KKyAgICA6IHRydWVfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgordGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzMSwgY2xhc3MuLi4gX0FyZ3MyLCBzaXplX3QgLi4uX0kxLCBzaXplX3QgLi4uX0kyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3BhaXI8X1QxLCBfVDI+OjpwYWlyKHBpZWNld2lzZV9jb25zdHJ1Y3RfdCwKKyAgICAgICAgICAgICAgICAgICAgIHR1cGxlPF9BcmdzMS4uLj4mIF9fZmlyc3RfYXJncywgdHVwbGU8X0FyZ3MyLi4uPiYgX19zZWNvbmRfYXJncywKKyAgICAgICAgICAgICAgICAgICAgIF9fdHVwbGVfaW5kaWNlczxfSTEuLi4+LCBfX3R1cGxlX2luZGljZXM8X0kyLi4uPikKKyAgICA6ICBmaXJzdChfVlNURDo6Zm9yd2FyZDxfQXJnczE+KF9WU1REOjpnZXQ8X0kxPiggX19maXJzdF9hcmdzKSkuLi4pLAorICAgICAgc2Vjb25kKF9WU1REOjpmb3J3YXJkPF9BcmdzMj4oX1ZTVEQ6OmdldDxfSTI+KF9fc2Vjb25kX2FyZ3MpKS4uLikKK3sKK30KKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIGNvbnN0ZXhwciBzaXplX3QgdHVwbGVfc2l6ZV92ID0gdHVwbGVfc2l6ZTxfVHA+Ojp2YWx1ZTsKKworI2RlZmluZSBfTElCQ1BQX05PRVhDRVBUX1JFVFVSTiguLi4pIG5vZXhjZXB0KG5vZXhjZXB0KF9fVkFfQVJHU19fKSkgeyByZXR1cm4gX19WQV9BUkdTX187IH0KKwordGVtcGxhdGUgPGNsYXNzIF9GbiwgY2xhc3MgX1R1cGxlLCBzaXplX3QgLi4uX0lkPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBkZWNsdHlwZShhdXRvKSBfX2FwcGx5X3R1cGxlX2ltcGwoX0ZuICYmIF9fZiwgX1R1cGxlICYmIF9fdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190dXBsZV9pbmRpY2VzPF9JZC4uLj4pCitfTElCQ1BQX05PRVhDRVBUX1JFVFVSTigKKyAgICBfVlNURDo6X19pbnZva2VfY29uc3RleHByKAorICAgICAgICBfVlNURDo6Zm9yd2FyZDxfRm4+KF9fZiksCisgICAgICAgIF9WU1REOjpnZXQ8X0lkPihfVlNURDo6Zm9yd2FyZDxfVHVwbGU+KF9fdCkpLi4uKQorKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZuLCBjbGFzcyBfVHVwbGU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RleHByIGRlY2x0eXBlKGF1dG8pIGFwcGx5KF9GbiAmJiBfX2YsIF9UdXBsZSAmJiBfX3QpCitfTElCQ1BQX05PRVhDRVBUX1JFVFVSTigKKyAgICBfVlNURDo6X19hcHBseV90dXBsZV9pbXBsKAorICAgICAgICBfVlNURDo6Zm9yd2FyZDxfRm4+KF9fZiksIF9WU1REOjpmb3J3YXJkPF9UdXBsZT4oX190KSwKKyAgICAgICAgdHlwZW5hbWUgX19tYWtlX3R1cGxlX2luZGljZXM8dHVwbGVfc2l6ZV92PHJlbW92ZV9yZWZlcmVuY2VfdDxfVHVwbGU+Pj46OnR5cGV7fSkKKykKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1R1cGxlLCBzaXplX3QuLi4gX0lkeD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdGV4cHIgX1RwIF9fbWFrZV9mcm9tX3R1cGxlX2ltcGwoX1R1cGxlJiYgX190LCBfX3R1cGxlX2luZGljZXM8X0lkeC4uLj4pCitfTElCQ1BQX05PRVhDRVBUX1JFVFVSTigKKyAgICBfVHAoX1ZTVEQ6OmdldDxfSWR4PihfVlNURDo6Zm9yd2FyZDxfVHVwbGU+KF9fdCkpLi4uKQorKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHVwbGU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RleHByIF9UcCBtYWtlX2Zyb21fdHVwbGUoX1R1cGxlJiYgX190KQorX0xJQkNQUF9OT0VYQ0VQVF9SRVRVUk4oCisgICAgX1ZTVEQ6Ol9fbWFrZV9mcm9tX3R1cGxlX2ltcGw8X1RwPihfVlNURDo6Zm9yd2FyZDxfVHVwbGU+KF9fdCksCisgICAgICAgIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbmRpY2VzPHR1cGxlX3NpemVfdjxyZW1vdmVfcmVmZXJlbmNlX3Q8X1R1cGxlPj4+Ojp0eXBle30pCispCisKKyN1bmRlZiBfTElCQ1BQX05PRVhDRVBUX1JFVFVSTgorCisjZW5kaWYgLy8gX0xJQkNQUF9TVERfVkVSID4gMTQKKworI2VuZGlmIC8vICFkZWZpbmVkKF9MSUJDUFBfQ1hYMDNfTEFORykKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCisjZW5kaWYgIC8vIF9MSUJDUFBfVFVQTEUKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS90eXBlX3RyYWl0cyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS90eXBlX3RyYWl0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2IzYjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3R5cGVfdHJhaXRzCkBAIC0wLDAgKzEsNDk5MCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVfdHJhaXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9UWVBFX1RSQUlUUworI2RlZmluZSBfTElCQ1BQX1RZUEVfVFJBSVRTCisKKy8qCisgICAgdHlwZV90cmFpdHMgc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCisgICAgLy8gaGVscGVyIGNsYXNzOgorICAgIHRlbXBsYXRlIDxjbGFzcyBULCBUIHY+IHN0cnVjdCBpbnRlZ3JhbF9jb25zdGFudDsKKyAgICB0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PGJvb2wsIHRydWU+ICB0cnVlX3R5cGU7ICAgLy8gQysrMTEKKyAgICB0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PGJvb2wsIGZhbHNlPiBmYWxzZV90eXBlOyAgLy8gQysrMTEKKyAgICAKKyAgICB0ZW1wbGF0ZSA8Ym9vbCBCPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTQKKyAgICB1c2luZyBib29sX2NvbnN0YW50ID0gaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgQj47ICAgLy8gQysrMTQKKyAgICB0eXBlZGVmIGJvb2xfY29uc3RhbnQ8dHJ1ZT4gdHJ1ZV90eXBlOyAgICAgICAgICAgICAgLy8gQysrMTQKKyAgICB0eXBlZGVmIGJvb2xfY29uc3RhbnQ8ZmFsc2U+IGZhbHNlX3R5cGU7ICAgICAgICAgICAgLy8gQysrMTQKKworICAgIC8vIGhlbHBlciB0cmFpdHMKKyAgICB0ZW1wbGF0ZSA8Ym9vbCwgY2xhc3MgVCA9IHZvaWQ+IHN0cnVjdCBlbmFibGVfaWY7CisgICAgdGVtcGxhdGUgPGJvb2wsIGNsYXNzIFQsIGNsYXNzIEY+IHN0cnVjdCBjb25kaXRpb25hbDsKKworICAgIC8vIFByaW1hcnkgY2xhc3NpZmljYXRpb24gdHJhaXRzOgorICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfdm9pZDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX251bGxfcG9pbnRlcjsgIC8vIEMrKzE0CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19pbnRlZ3JhbDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX2Zsb2F0aW5nX3BvaW50OworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfYXJyYXk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19wb2ludGVyOworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfbHZhbHVlX3JlZmVyZW5jZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX3J2YWx1ZV9yZWZlcmVuY2U7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19tZW1iZXJfb2JqZWN0X3BvaW50ZXI7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcjsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX2VudW07CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc191bmlvbjsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX2NsYXNzOworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfZnVuY3Rpb247CisKKyAgICAvLyBTZWNvbmRhcnkgY2xhc3NpZmljYXRpb24gdHJhaXRzOgorICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfcmVmZXJlbmNlOworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfYXJpdGhtZXRpYzsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX2Z1bmRhbWVudGFsOworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfbWVtYmVyX3BvaW50ZXI7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19zY2FsYXI7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19vYmplY3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19jb21wb3VuZDsKKworICAgIC8vIENvbnN0LXZvbGF0aWxlIHByb3BlcnRpZXMgYW5kIHRyYW5zZm9ybWF0aW9uczoKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX2NvbnN0OworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfdm9sYXRpbGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCByZW1vdmVfY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCByZW1vdmVfdm9sYXRpbGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCByZW1vdmVfY3Y7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBhZGRfY29uc3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBhZGRfdm9sYXRpbGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBhZGRfY3Y7CisKKyAgICAvLyBSZWZlcmVuY2UgdHJhbnNmb3JtYXRpb25zOgorICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgcmVtb3ZlX3JlZmVyZW5jZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGFkZF9sdmFsdWVfcmVmZXJlbmNlOworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgYWRkX3J2YWx1ZV9yZWZlcmVuY2U7CisKKyAgICAvLyBQb2ludGVyIHRyYW5zZm9ybWF0aW9uczoKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IHJlbW92ZV9wb2ludGVyOworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgYWRkX3BvaW50ZXI7CisKKyAgICAvLyBJbnRlZ3JhbCBwcm9wZXJ0aWVzOgorICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfc2lnbmVkOworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfdW5zaWduZWQ7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBtYWtlX3NpZ25lZDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IG1ha2VfdW5zaWduZWQ7CisKKyAgICAvLyBBcnJheSBwcm9wZXJ0aWVzIGFuZCB0cmFuc2Zvcm1hdGlvbnM6CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCByYW5rOworICAgIHRlbXBsYXRlIDxjbGFzcyBULCB1bnNpZ25lZCBJID0gMD4gc3RydWN0IGV4dGVudDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IHJlbW92ZV9leHRlbnQ7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCByZW1vdmVfYWxsX2V4dGVudHM7CisKKyAgICAvLyBNZW1iZXIgaW50cm9zcGVjdGlvbjoKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX3BvZDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX3RyaXZpYWw7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc190cml2aWFsbHlfY29weWFibGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19zdGFuZGFyZF9sYXlvdXQ7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19saXRlcmFsX3R5cGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19lbXB0eTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX3BvbHltb3JwaGljOworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfYWJzdHJhY3Q7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19maW5hbDsgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX2FnZ3JlZ2F0ZTsgLy8gQysrMTcKKworICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBBcmdzPiBzdHJ1Y3QgaXNfY29uc3RydWN0aWJsZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gICAgICAgICAgICAgICAgc3RydWN0IGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gICAgICAgICAgICAgICAgc3RydWN0IGlzX2NvcHlfY29uc3RydWN0aWJsZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gICAgICAgICAgICAgICAgc3RydWN0IGlzX21vdmVfY29uc3RydWN0aWJsZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gICAgICAgc3RydWN0IGlzX2Fzc2lnbmFibGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+ICAgICAgICAgICAgICAgIHN0cnVjdCBpc19jb3B5X2Fzc2lnbmFibGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+ICAgICAgICAgICAgICAgIHN0cnVjdCBpc19tb3ZlX2Fzc2lnbmFibGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+ICAgICAgIHN0cnVjdCBpc19zd2FwcGFibGVfd2l0aDsgICAgICAgLy8gQysrMTcKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gICAgICAgICAgICAgICAgc3RydWN0IGlzX3N3YXBwYWJsZTsgICAgICAgICAgICAvLyBDKysxNworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiAgICAgICAgICAgICAgICBzdHJ1Y3QgaXNfZGVzdHJ1Y3RpYmxlOworCisgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzLi4uIEFyZ3M+IHN0cnVjdCBpc190cml2aWFsbHlfY29uc3RydWN0aWJsZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gICAgICAgICAgICAgICAgc3RydWN0IGlzX3RyaXZpYWxseV9kZWZhdWx0X2NvbnN0cnVjdGlibGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+ICAgICAgICAgICAgICAgIHN0cnVjdCBpc190cml2aWFsbHlfY29weV9jb25zdHJ1Y3RpYmxlOworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiAgICAgICAgICAgICAgICBzdHJ1Y3QgaXNfdHJpdmlhbGx5X21vdmVfY29uc3RydWN0aWJsZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gICAgICAgc3RydWN0IGlzX3RyaXZpYWxseV9hc3NpZ25hYmxlOworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiAgICAgICAgICAgICAgICBzdHJ1Y3QgaXNfdHJpdmlhbGx5X2NvcHlfYXNzaWduYWJsZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gICAgICAgICAgICAgICAgc3RydWN0IGlzX3RyaXZpYWxseV9tb3ZlX2Fzc2lnbmFibGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+ICAgICAgICAgICAgICAgIHN0cnVjdCBpc190cml2aWFsbHlfZGVzdHJ1Y3RpYmxlOworCisgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzLi4uIEFyZ3M+IHN0cnVjdCBpc19ub3Rocm93X2NvbnN0cnVjdGlibGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+ICAgICAgICAgICAgICAgIHN0cnVjdCBpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gICAgICAgICAgICAgICAgc3RydWN0IGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlOworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiAgICAgICAgICAgICAgICBzdHJ1Y3QgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+ICAgICAgIHN0cnVjdCBpc19ub3Rocm93X2Fzc2lnbmFibGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+ICAgICAgICAgICAgICAgIHN0cnVjdCBpc19ub3Rocm93X2NvcHlfYXNzaWduYWJsZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gICAgICAgICAgICAgICAgc3RydWN0IGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlOworICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiAgICAgICBzdHJ1Y3QgaXNfbm90aHJvd19zd2FwcGFibGVfd2l0aDsgLy8gQysrMTcKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gICAgICAgICAgICAgICAgc3RydWN0IGlzX25vdGhyb3dfc3dhcHBhYmxlOyAgICAgIC8vIEMrKzE3CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+ICAgICAgICAgICAgICAgIHN0cnVjdCBpc19ub3Rocm93X2Rlc3RydWN0aWJsZTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvcjsKKworICAgIHRlbXBsYXRlPGNsYXNzIFQ+IHN0cnVjdCBoYXNfdW5pcXVlX29iamVjdF9yZXByZXNlbnRhdGlvbnM7ICAgICAgICAgLy8gQysrMTcKKworICAgIC8vIFJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0eXBlczoKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gc3RydWN0IGlzX3NhbWU7CisgICAgdGVtcGxhdGUgPGNsYXNzIEJhc2UsIGNsYXNzIERlcml2ZWQ+IHN0cnVjdCBpc19iYXNlX29mOworICAgIHRlbXBsYXRlIDxjbGFzcyBGcm9tLCBjbGFzcyBUbz4gc3RydWN0IGlzX2NvbnZlcnRpYmxlOworCisgICAgdGVtcGxhdGUgPGNsYXNzIEZuLCBjbGFzcy4uLiBBcmdUeXBlcz4gc3RydWN0IGlzX2ludm9jYWJsZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgRm4sIGNsYXNzLi4uIEFyZ1R5cGVzPiBzdHJ1Y3QgaXNfaW52b2NhYmxlX3I7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgRm4sIGNsYXNzLi4uIEFyZ1R5cGVzPiBzdHJ1Y3QgaXNfbm90aHJvd19pbnZvY2FibGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIEZuLCBjbGFzcy4uLiBBcmdUeXBlcz4gc3RydWN0IGlzX25vdGhyb3dfaW52b2NhYmxlX3I7CisKKyAgICAvLyBBbGlnbm1lbnQgcHJvcGVydGllcyBhbmQgdHJhbnNmb3JtYXRpb25zOgorICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgYWxpZ25tZW50X29mOworICAgIHRlbXBsYXRlIDxzaXplX3QgTGVuLCBzaXplX3QgQWxpZ24gPSBtb3N0X3N0cmluZ2VudF9hbGlnbm1lbnRfcmVxdWlyZW1lbnQ+CisgICAgICAgIHN0cnVjdCBhbGlnbmVkX3N0b3JhZ2U7CisgICAgdGVtcGxhdGUgPHNpemVfdCBMZW4sIGNsYXNzLi4uIFR5cGVzPiBzdHJ1Y3QgYWxpZ25lZF91bmlvbjsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IHJlbW92ZV9jdnJlZjsgLy8gQysrMjAKKworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgZGVjYXk7CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIFQ+IHN0cnVjdCBjb21tb25fdHlwZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IHVuZGVybHlpbmdfdHlwZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIHJlc3VsdF9vZjsgLy8gdW5kZWZpbmVkCisgICAgdGVtcGxhdGUgPGNsYXNzIEZuLCBjbGFzcy4uLiBBcmdUeXBlcz4gY2xhc3MgcmVzdWx0X29mPEZuKEFyZ1R5cGVzLi4uKT47CisgICAgdGVtcGxhdGUgPGNsYXNzIEZuLCBjbGFzcy4uLiBBcmdUeXBlcz4gc3RydWN0IGludm9rZV9yZXN1bHQ7ICAvLyBDKysxNworCisgICAgLy8gY29uc3Qtdm9sYXRpbGUgbW9kaWZpY2F0aW9uczoKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgIHVzaW5nIHJlbW92ZV9jb25zdF90ICAgID0gdHlwZW5hbWUgcmVtb3ZlX2NvbnN0PFQ+Ojp0eXBlOyAgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgIHVzaW5nIHJlbW92ZV92b2xhdGlsZV90ID0gdHlwZW5hbWUgcmVtb3ZlX3ZvbGF0aWxlPFQ+Ojp0eXBlOyAgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgIHVzaW5nIHJlbW92ZV9jdl90ICAgICAgID0gdHlwZW5hbWUgcmVtb3ZlX2N2PFQ+Ojp0eXBlOyAgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgIHVzaW5nIGFkZF9jb25zdF90ICAgICAgID0gdHlwZW5hbWUgYWRkX2NvbnN0PFQ+Ojp0eXBlOyAgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgIHVzaW5nIGFkZF92b2xhdGlsZV90ICAgID0gdHlwZW5hbWUgYWRkX3ZvbGF0aWxlPFQ+Ojp0eXBlOyAgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgIHVzaW5nIGFkZF9jdl90ICAgICAgICAgID0gdHlwZW5hbWUgYWRkX2N2PFQ+Ojp0eXBlOyAgLy8gQysrMTQKKyAgCisgICAgLy8gcmVmZXJlbmNlIG1vZGlmaWNhdGlvbnM6CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgICB1c2luZyByZW1vdmVfcmVmZXJlbmNlX3QgICAgID0gdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZTsgIC8vIEMrKzE0CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgICB1c2luZyBhZGRfbHZhbHVlX3JlZmVyZW5jZV90ID0gdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8VD46OnR5cGU7ICAvLyBDKysxNAorICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgICAgdXNpbmcgYWRkX3J2YWx1ZV9yZWZlcmVuY2VfdCA9IHR5cGVuYW1lIGFkZF9ydmFsdWVfcmVmZXJlbmNlPFQ+Ojp0eXBlOyAgLy8gQysrMTQKKyAgCisgICAgLy8gc2lnbiBtb2RpZmljYXRpb25zOgorICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgICAgdXNpbmcgbWFrZV9zaWduZWRfdCAgID0gdHlwZW5hbWUgbWFrZV9zaWduZWQ8VD46OnR5cGU7ICAvLyBDKysxNAorICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgICAgdXNpbmcgbWFrZV91bnNpZ25lZF90ID0gdHlwZW5hbWUgbWFrZV91bnNpZ25lZDxUPjo6dHlwZTsgIC8vIEMrKzE0CisgIAorICAgIC8vIGFycmF5IG1vZGlmaWNhdGlvbnM6CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgICB1c2luZyByZW1vdmVfZXh0ZW50X3QgICAgICA9IHR5cGVuYW1lIHJlbW92ZV9leHRlbnQ8VD46OnR5cGU7ICAvLyBDKysxNAorICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgICAgdXNpbmcgcmVtb3ZlX2FsbF9leHRlbnRzX3QgPSB0eXBlbmFtZSByZW1vdmVfYWxsX2V4dGVudHM8VD46OnR5cGU7ICAvLyBDKysxNAorCisgICAgLy8gcG9pbnRlciBtb2RpZmljYXRpb25zOgorICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgICAgdXNpbmcgcmVtb3ZlX3BvaW50ZXJfdCA9IHR5cGVuYW1lIHJlbW92ZV9wb2ludGVyPFQ+Ojp0eXBlOyAgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgIHVzaW5nIGFkZF9wb2ludGVyX3QgICAgPSB0eXBlbmFtZSBhZGRfcG9pbnRlcjxUPjo6dHlwZTsgIC8vIEMrKzE0CisKKyAgICAvLyBvdGhlciB0cmFuc2Zvcm1hdGlvbnM6CisgICAgdGVtcGxhdGUgPHNpemVfdCBMZW4sIHN0ZDo6c2l6ZV90IEFsaWduPWRlZmF1bHQtYWxpZ25tZW50PgorICAgICAgdXNpbmcgYWxpZ25lZF9zdG9yYWdlX3QgPSB0eXBlbmFtZSBhbGlnbmVkX3N0b3JhZ2U8TGVuLEFsaWduPjo6dHlwZTsgIC8vIEMrKzE0CisgICAgdGVtcGxhdGUgPHN0ZDo6c2l6ZV90IExlbiwgY2xhc3MuLi4gVHlwZXM+CisgICAgICB1c2luZyBhbGlnbmVkX3VuaW9uX3QgICA9IHR5cGVuYW1lIGFsaWduZWRfdW5pb248TGVuLFR5cGVzLi4uPjo6dHlwZTsgIC8vIEMrKzE0CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgICB1c2luZyByZW1vdmVfY3ZyZWZfdCAgICA9IHR5cGVuYW1lIHJlbW92ZV9jdnJlZjxUPjo6dHlwZTsgIC8vIEMrKzIwCisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgICB1c2luZyBkZWNheV90ICAgICAgICAgICA9IHR5cGVuYW1lIGRlY2F5PFQ+Ojp0eXBlOyAgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZSA8Ym9vbCBiLCBjbGFzcyBUPXZvaWQ+CisgICAgICB1c2luZyBlbmFibGVfaWZfdCAgICAgICA9IHR5cGVuYW1lIGVuYWJsZV9pZjxiLFQ+Ojp0eXBlOyAgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZSA8Ym9vbCBiLCBjbGFzcyBULCBjbGFzcyBGPgorICAgICAgdXNpbmcgY29uZGl0aW9uYWxfdCAgICAgPSB0eXBlbmFtZSBjb25kaXRpb25hbDxiLFQsRj46OnR5cGU7ICAvLyBDKysxNAorICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBUPgorICAgICAgdXNpbmcgY29tbW9uX3R5cGVfdCAgICAgPSB0eXBlbmFtZSBjb21tb25fdHlwZTxULi4uPjo6dHlwZTsgIC8vIEMrKzE0CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgICB1c2luZyB1bmRlcmx5aW5nX3R5cGVfdCA9IHR5cGVuYW1lIHVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZTsgIC8vIEMrKzE0CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgICB1c2luZyByZXN1bHRfb2ZfdCAgICAgICA9IHR5cGVuYW1lIHJlc3VsdF9vZjxUPjo6dHlwZTsgIC8vIEMrKzE0CisgICAgdGVtcGxhdGUgPGNsYXNzIEZuLCBjbGFzcy4uLiBBcmdUeXBlcz4KKyAgICAgIHVzaW5nIGludm9rZV9yZXN1bHRfdCAgID0gdHlwZW5hbWUgaW52b2tlX3Jlc3VsdDxGbiwgQXJnVHlwZXMuLi4+Ojp0eXBlOyAgLy8gQysrMTcKKworICAgIHRlbXBsYXRlIDxjbGFzcy4uLj4KKyAgICAgIHVzaW5nIHZvaWRfdCA9IHZvaWQ7ICAgLy8gQysrMTcKKyAgICAgIAorICAgICAgLy8gU2VlIEMrKzE0IDIwLjEwLjQuMSwgcHJpbWFyeSB0eXBlIGNhdGVnb3JpZXMKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfdm9pZF92CisgICAgICAgID0gaXNfdm9pZDxUPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfbnVsbF9wb2ludGVyX3YKKyAgICAgICAgPSBpc19udWxsX3BvaW50ZXI8VD46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19pbnRlZ3JhbF92CisgICAgICAgID0gaXNfaW50ZWdyYWw8VD46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfZmxvYXRpbmdfcG9pbnRfdgorICAgICAgICA9IGlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX2FycmF5X3YKKyAgICAgICAgPSBpc19hcnJheTxUPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19wb2ludGVyX3YKKyAgICAgICAgPSBpc19wb2ludGVyPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19sdmFsdWVfcmVmZXJlbmNlX3YKKyAgICAgICAgPSBpc19sdmFsdWVfcmVmZXJlbmNlPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19ydmFsdWVfcmVmZXJlbmNlX3YKKyAgICAgICAgPSBpc19ydmFsdWVfcmVmZXJlbmNlPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19tZW1iZXJfb2JqZWN0X3BvaW50ZXJfdgorICAgICAgICA9IGlzX21lbWJlcl9vYmplY3RfcG9pbnRlcjxUPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyX3YKKyAgICAgICAgPSBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcjxUPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19lbnVtX3YKKyAgICAgICAgPSBpc19lbnVtPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc191bmlvbl92CisgICAgICAgID0gaXNfdW5pb248VD46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfY2xhc3NfdgorICAgICAgICA9IGlzX2NsYXNzPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX2Z1bmN0aW9uX3YKKyAgICAgICAgPSBpc19mdW5jdGlvbjxUPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworCisgICAgICAvLyBTZWUgQysrMTQgMjAuMTAuNC4yLCBjb21wb3NpdGUgdHlwZSBjYXRlZ29yaWVzCisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX3JlZmVyZW5jZV92CisgICAgICAgID0gaXNfcmVmZXJlbmNlPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfYXJpdGhtZXRpY192CisgICAgICAgID0gaXNfYXJpdGhtZXRpYzxUPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfZnVuZGFtZW50YWxfdgorICAgICAgICA9IGlzX2Z1bmRhbWVudGFsPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX29iamVjdF92CisgICAgICAgID0gaXNfb2JqZWN0PFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfc2NhbGFyX3YKKyAgICAgICAgPSBpc19zY2FsYXI8VD46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19jb21wb3VuZF92CisgICAgICAgID0gaXNfY29tcG91bmQ8VD46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfbWVtYmVyX3BvaW50ZXJfdgorICAgICAgICA9IGlzX21lbWJlcl9wb2ludGVyPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisKKyAgICAgIC8vIFNlZSBDKysxNCAyMC4xMC40LjMsIHR5cGUgcHJvcGVydGllcworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19jb25zdF92CisgICAgICAgID0gaXNfY29uc3Q8VD46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfdm9sYXRpbGVfdgorICAgICAgICA9IGlzX3ZvbGF0aWxlPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX3RyaXZpYWxfdgorICAgICAgICA9IGlzX3RyaXZpYWw8VD46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX3RyaXZpYWxseV9jb3B5YWJsZV92CisgICAgICAgID0gaXNfdHJpdmlhbGx5X2NvcHlhYmxlPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfc3RhbmRhcmRfbGF5b3V0X3YKKyAgICAgICAgPSBpc19zdGFuZGFyZF9sYXlvdXQ8VD46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19wb2RfdgorICAgICAgICA9IGlzX3BvZDxUPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX2xpdGVyYWxfdHlwZV92CisgICAgICAgID0gaXNfbGl0ZXJhbF90eXBlPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfZW1wdHlfdgorICAgICAgICA9IGlzX2VtcHR5PFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX3BvbHltb3JwaGljX3YKKyAgICAgICAgPSBpc19wb2x5bW9ycGhpYzxUPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19hYnN0cmFjdF92CisgICAgICAgID0gaXNfYWJzdHJhY3Q8VD46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfZmluYWxfdgorICAgICAgICA9IGlzX2ZpbmFsPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX2FnZ3JlZ2F0ZV92CisgICAgICAgID0gaXNfYWdncmVnYXRlPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfc2lnbmVkX3YKKyAgICAgICAgPSBpc19zaWduZWQ8VD46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc191bnNpZ25lZF92CisgICAgICAgID0gaXNfdW5zaWduZWQ8VD46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBBcmdzPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfY29uc3RydWN0aWJsZV92CisgICAgICAgID0gaXNfY29uc3RydWN0aWJsZTxULCBBcmdzLi4uPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX3YKKyAgICAgICAgPSBpc19kZWZhdWx0X2NvbnN0cnVjdGlibGU8VD46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19jb3B5X2NvbnN0cnVjdGlibGVfdgorICAgICAgICA9IGlzX2NvcHlfY29uc3RydWN0aWJsZTxUPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX21vdmVfY29uc3RydWN0aWJsZV92CisgICAgICAgID0gaXNfbW92ZV9jb25zdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfYXNzaWduYWJsZV92CisgICAgICAgID0gaXNfYXNzaWduYWJsZTxULCBVPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfY29weV9hc3NpZ25hYmxlX3YKKyAgICAgICAgPSBpc19jb3B5X2Fzc2lnbmFibGU8VD46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19tb3ZlX2Fzc2lnbmFibGVfdgorICAgICAgICA9IGlzX21vdmVfYXNzaWduYWJsZTxUPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX3N3YXBwYWJsZV93aXRoX3YKKyAgICAgICAgPSBpc19zd2FwcGFibGVfd2l0aDxULCBVPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19zd2FwcGFibGVfdgorICAgICAgICA9IGlzX3N3YXBwYWJsZTxUPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX2Rlc3RydWN0aWJsZV92CisgICAgICAgID0gaXNfZGVzdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBBcmdzPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGVfdgorICAgICAgICA9IGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlPFQsIEFyZ3MuLi4+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX3RyaXZpYWxseV9kZWZhdWx0X2NvbnN0cnVjdGlibGVfdgorICAgICAgICA9IGlzX3RyaXZpYWxseV9kZWZhdWx0X2NvbnN0cnVjdGlibGU8VD46OnZhbHVlOyAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX3RyaXZpYWxseV9jb3B5X2NvbnN0cnVjdGlibGVfdgorICAgICAgICA9IGlzX3RyaXZpYWxseV9jb3B5X2NvbnN0cnVjdGlibGU8VD46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX3RyaXZpYWxseV9tb3ZlX2NvbnN0cnVjdGlibGVfdgorICAgICAgICA9IGlzX3RyaXZpYWxseV9tb3ZlX2NvbnN0cnVjdGlibGU8VD46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX3RyaXZpYWxseV9hc3NpZ25hYmxlX3YKKyAgICAgICAgPSBpc190cml2aWFsbHlfYXNzaWduYWJsZTxULCBVPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc190cml2aWFsbHlfY29weV9hc3NpZ25hYmxlX3YKKyAgICAgICAgPSBpc190cml2aWFsbHlfY29weV9hc3NpZ25hYmxlPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc190cml2aWFsbHlfbW92ZV9hc3NpZ25hYmxlX3YKKyAgICAgICAgPSBpc190cml2aWFsbHlfbW92ZV9hc3NpZ25hYmxlPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc190cml2aWFsbHlfZGVzdHJ1Y3RpYmxlX3YKKyAgICAgICAgPSBpc190cml2aWFsbHlfZGVzdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzLi4uIEFyZ3M+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19ub3Rocm93X2NvbnN0cnVjdGlibGVfdgorICAgICAgICA9IGlzX25vdGhyb3dfY29uc3RydWN0aWJsZTxULCBBcmdzLi4uPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX3YKKyAgICAgICAgPSBpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxUPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZV92CisgICAgICAgID0gaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8VD46OnZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGVfdgorICAgICAgICA9IGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX25vdGhyb3dfYXNzaWduYWJsZV92CisgICAgICAgID0gaXNfbm90aHJvd19hc3NpZ25hYmxlPFQsIFU+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfbm90aHJvd19jb3B5X2Fzc2lnbmFibGVfdgorICAgICAgICA9IGlzX25vdGhyb3dfY29weV9hc3NpZ25hYmxlPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlX3YKKyAgICAgICAgPSBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxUPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19ub3Rocm93X3N3YXBwYWJsZV93aXRoX3YKKyAgICAgICAgPSBpc19ub3Rocm93X3N3YXBwYWJsZV93aXRoPFQsIFU+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX25vdGhyb3dfc3dhcHBhYmxlX3YKKyAgICAgICAgPSBpc19ub3Rocm93X3N3YXBwYWJsZTxUPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX25vdGhyb3dfZGVzdHJ1Y3RpYmxlX3YKKyAgICAgICAgPSBpc19ub3Rocm93X2Rlc3RydWN0aWJsZTxUPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBoYXNfdmlydHVhbF9kZXN0cnVjdG9yX3YKKyAgICAgICAgPSBoYXNfdmlydHVhbF9kZXN0cnVjdG9yPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIGNvbnN0ZXhwciBib29sIGhhc191bmlxdWVfb2JqZWN0X3JlcHJlc2VudGF0aW9uc192IC8vIEMrKzE3CisgICAgICAgID0gaGFzX3VuaXF1ZV9vYmplY3RfcmVwcmVzZW50YXRpb25zPFQ+Ojp2YWx1ZTsKKworICAgICAgLy8gU2VlIEMrKzE0IDIwLjEwLjUsIHR5cGUgcHJvcGVydHkgcXVlcmllcworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBjb25zdGV4cHIgc2l6ZV90IGFsaWdubWVudF9vZl92CisgICAgICAgID0gYWxpZ25tZW50X29mPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgY29uc3RleHByIHNpemVfdCByYW5rX3YKKyAgICAgICAgPSByYW5rPFQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQsIHVuc2lnbmVkIEkgPSAwPiBpbmxpbmUgY29uc3RleHByIHNpemVfdCBleHRlbnRfdgorICAgICAgICA9IGV4dGVudDxULCBJPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisKKyAgICAgIC8vIFNlZSBDKysxNCAyMC4xMC42LCB0eXBlIHJlbGF0aW9ucworICAgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19zYW1lX3YKKyAgICAgICAgPSBpc19zYW1lPFQsIFU+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIEJhc2UsIGNsYXNzIERlcml2ZWQ+IGlubGluZSBjb25zdGV4cHIgYm9vbCBpc19iYXNlX29mX3YKKyAgICAgICAgPSBpc19iYXNlX29mPEJhc2UsIERlcml2ZWQ+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIEZyb20sIGNsYXNzIFRvPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfY29udmVydGlibGVfdgorICAgICAgICA9IGlzX2NvbnZlcnRpYmxlPEZyb20sIFRvPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgRm4sIGNsYXNzLi4uIEFyZ1R5cGVzPiBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNfaW52b2NhYmxlX3YKKyAgICAgICAgPSBpc19pbnZvY2FibGU8Rm4sIEFyZ1R5cGVzLi4uPjo6dmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIEZuLCBjbGFzcy4uLiBBcmdUeXBlcz4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX2ludm9jYWJsZV9yX3YKKyAgICAgICAgPSBpc19pbnZvY2FibGVfcjxSLCBGbiwgQXJnVHlwZXMuLi4+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIEZuLCBjbGFzcy4uLiBBcmdUeXBlcz4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX25vdGhyb3dfaW52b2NhYmxlX3YKKyAgICAgICAgPSBpc19ub3Rocm93X2ludm9jYWJsZTxGbiwgQXJnVHlwZXMuLi4+Ojp2YWx1ZTsgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIEZuLCBjbGFzcy4uLiBBcmdUeXBlcz4gaW5saW5lIGNvbnN0ZXhwciBib29sIGlzX25vdGhyb3dfaW52b2NhYmxlX3JfdgorICAgICAgICA9IGlzX25vdGhyb3dfaW52b2NhYmxlX3I8UiwgRm4sIEFyZ1R5cGVzLi4uPjo6dmFsdWU7ICAgICAgICAgICAgIC8vIEMrKzE3CisKKyAgICAgIC8vIFttZXRhLmxvZ2ljYWxdLCBsb2dpY2FsIG9wZXJhdG9yIHRyYWl0czoKKyAgICAgIHRlbXBsYXRlPGNsYXNzLi4uIEI+IHN0cnVjdCBjb25qdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGU8Y2xhc3MuLi4gQj4gCisgICAgICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBjb25qdW5jdGlvbl92ID0gY29uanVuY3Rpb248Qi4uLj46OnZhbHVlOyAgLy8gQysrMTcKKyAgICAgIHRlbXBsYXRlPGNsYXNzLi4uIEI+IHN0cnVjdCBkaXNqdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgICAgdGVtcGxhdGU8Y2xhc3MuLi4gQj4KKyAgICAgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGRpc2p1bmN0aW9uX3YgPSBkaXNqdW5jdGlvbjxCLi4uPjo6dmFsdWU7ICAvLyBDKysxNworICAgICAgdGVtcGxhdGU8Y2xhc3MgQj4gc3RydWN0IG5lZ2F0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMrKzE3CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBCPiAKKyAgICAgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG5lZ2F0aW9uX3YgPSBuZWdhdGlvbjxCPjo6dmFsdWU7ICAgICAgICAgICAvLyBDKysxNworCit9CisKKyovCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBwYWlyOwordGVtcGxhdGUgPGNsYXNzIF9UcD4gY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgcmVmZXJlbmNlX3dyYXBwZXI7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDsKKwordGVtcGxhdGUgPGNsYXNzPgorc3RydWN0IF9fdm9pZF90IHsgdHlwZWRlZiB2b2lkIHR5cGU7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19pZGVudGl0eSB7IHR5cGVkZWYgX1RwIHR5cGU7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGJvb2w+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgX19kZXBlbmRlbnRfdHlwZSA6IHB1YmxpYyBfVHAge307CisKK3RlbXBsYXRlIDxib29sIF9CcCwgY2xhc3MgX0lmLCBjbGFzcyBfVGhlbj4KKyAgICBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgY29uZGl0aW9uYWwge3R5cGVkZWYgX0lmIHR5cGU7fTsKK3RlbXBsYXRlIDxjbGFzcyBfSWYsIGNsYXNzIF9UaGVuPgorICAgIHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBjb25kaXRpb25hbDxmYWxzZSwgX0lmLCBfVGhlbj4ge3R5cGVkZWYgX1RoZW4gdHlwZTt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxib29sIF9CcCwgY2xhc3MgX0lmLCBjbGFzcyBfVGhlbj4gdXNpbmcgY29uZGl0aW9uYWxfdCA9IHR5cGVuYW1lIGNvbmRpdGlvbmFsPF9CcCwgX0lmLCBfVGhlbj46OnR5cGU7CisjZW5kaWYKKwordGVtcGxhdGUgPGJvb2wsIGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIF9fbGF6eV9lbmFibGVfaWYge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgX19sYXp5X2VuYWJsZV9pZjx0cnVlLCBfVHA+IHt0eXBlZGVmIHR5cGVuYW1lIF9UcDo6dHlwZSB0eXBlO307CisKK3RlbXBsYXRlIDxib29sLCBjbGFzcyBfVHAgPSB2b2lkPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgZW5hYmxlX2lmIHt9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGVuYWJsZV9pZjx0cnVlLCBfVHA+IHt0eXBlZGVmIF9UcCB0eXBlO307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPGJvb2wgX0JwLCBjbGFzcyBfVHAgPSB2b2lkPiB1c2luZyBlbmFibGVfaWZfdCA9IHR5cGVuYW1lIGVuYWJsZV9pZjxfQnAsIF9UcD46OnR5cGU7CisjZW5kaWYKKworLy8gYWRkcmVzc29mCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0JVSUxUSU5fQUREUkVTU09GCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTQKK19MSUJDUFBfTk9fQ0ZJIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19UcCoKK2FkZHJlc3NvZihfVHAmIF9feCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fYnVpbHRpbl9hZGRyZXNzb2YoX194KTsKK30KKworI2Vsc2UKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX05PX0NGSSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfVHAqCithZGRyZXNzb2YoX1RwJiBfX3gpIF9OT0VYQ0VQVAoreworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxfVHAgKj4oCisgICAgICBjb25zdF9jYXN0PGNoYXIgKj4oJnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9sYXRpbGUgY2hhciAmPihfX3gpKSk7Cit9CisKKyNlbmRpZiAvLyBfTElCQ1BQX0hBU19OT19CVUlMVElOX0FERFJFU1NPRgorCisjaWYgZGVmaW5lZChfTElCQ1BQX0hBU19PQkpDX0FSQykgJiYgIWRlZmluZWQoX0xJQkNQUF9QUkVERUZJTkVEX09CSkNfQVJDX0FERFJFU1NPRikKKy8vIE9iamVjdGl2ZS1DKysgQXV0b21hdGljIFJlZmVyZW5jZSBDb3VudGluZyB1c2VzIHF1YWxpZmllZCBwb2ludGVycworLy8gdGhhdCByZXF1aXJlIHNwZWNpYWwgYWRkcmVzc29mKCkgc2lnbmF0dXJlcy4gV2hlbgorLy8gX0xJQkNQUF9QUkVERUZJTkVEX09CSkNfQVJDX0FERFJFU1NPRiBpcyBkZWZpbmVkLCB0aGUgY29tcGlsZXIKKy8vIGl0c2VsZiBpcyBwcm92aWRpbmcgdGhlc2UgZGVmaW5pdGlvbnMuIE90aGVyd2lzZSwgd2UgcHJvdmlkZSB0aGVtLgordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfX3N0cm9uZyBfVHAqCithZGRyZXNzb2YoX19zdHJvbmcgX1RwJiBfX3gpIF9OT0VYQ0VQVAoreworICByZXR1cm4gJl9feDsKK30KKworI2lmZGVmIF9MSUJDUFBfSEFTX09CSkNfQVJDX1dFQUsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX193ZWFrIF9UcCoKK2FkZHJlc3NvZihfX3dlYWsgX1RwJiBfX3gpIF9OT0VYQ0VQVAoreworICByZXR1cm4gJl9feDsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19fYXV0b3JlbGVhc2luZyBfVHAqCithZGRyZXNzb2YoX19hdXRvcmVsZWFzaW5nIF9UcCYgX194KSBfTk9FWENFUFQKK3sKKyAgcmV0dXJuICZfX3g7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX191bnNhZmVfdW5yZXRhaW5lZCBfVHAqCithZGRyZXNzb2YoX191bnNhZmVfdW5yZXRhaW5lZCBfVHAmIF9feCkgX05PRVhDRVBUCit7CisgIHJldHVybiAmX194OworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0NYWDAzX0xBTkcpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBfVHAqIGFkZHJlc3NvZihjb25zdCBfVHAmJikgbm9leGNlcHQgPSBkZWxldGU7CisjZW5kaWYKKworc3RydWN0IF9fdHdvIHtjaGFyIF9fbHhbMl07fTsKKworLy8gaGVscGVyIGNsYXNzOgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBfVHAgX192Pgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGludGVncmFsX2NvbnN0YW50Cit7CisgICAgc3RhdGljIF9MSUJDUFBfQ09OU1RFWFBSIGNvbnN0IF9UcCAgICAgIHZhbHVlID0gX192OworICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIGludGVncmFsX2NvbnN0YW50IHR5cGU7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBfTElCQ1BQX0NPTlNURVhQUiBvcGVyYXRvciB2YWx1ZV90eXBlKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gdmFsdWU7fQorI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICAgY29uc3RleHByIHZhbHVlX3R5cGUgb3BlcmF0b3IgKCkoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiB2YWx1ZTt9CisjZW5kaWYKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIF9UcCBfX3Y+CitfTElCQ1BQX0NPTlNURVhQUiBjb25zdCBfVHAgaW50ZWdyYWxfY29uc3RhbnQ8X1RwLCBfX3Y+Ojp2YWx1ZTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0Cit0ZW1wbGF0ZSA8Ym9vbCBfX2I+Cit1c2luZyBib29sX2NvbnN0YW50ID0gaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19iPjsKKyNkZWZpbmUgX0xJQkNQUF9CT09MX0NPTlNUQU5UKF9fYikgYm9vbF9jb25zdGFudDwoX19iKT4KKyNlbHNlCisjZGVmaW5lIF9MSUJDUFBfQk9PTF9DT05TVEFOVChfX2IpIGludGVncmFsX2NvbnN0YW50PGJvb2wsKF9fYik+CisjZW5kaWYKKwordHlwZWRlZiBfTElCQ1BQX0JPT0xfQ09OU1RBTlQodHJ1ZSkgIHRydWVfdHlwZTsKK3R5cGVkZWYgX0xJQkNQUF9CT09MX0NPTlNUQU5UKGZhbHNlKSBmYWxzZV90eXBlOworCisjaWYgIWRlZmluZWQoX0xJQkNQUF9DWFgwM19MQU5HKQorCisvLyBfX2xhenlfYW5kCisKK3RlbXBsYXRlIDxib29sIF9MYXN0LCBjbGFzcyAuLi5fUHJlZHM+CitzdHJ1Y3QgX19sYXp5X2FuZF9pbXBsOworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX1ByZWRzPgorc3RydWN0IF9fbGF6eV9hbmRfaW1wbDxmYWxzZSwgX1ByZWRzLi4uPiA6IGZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX19sYXp5X2FuZF9pbXBsPHRydWU+IDogdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWQ+CitzdHJ1Y3QgX19sYXp5X2FuZF9pbXBsPHRydWUsIF9QcmVkPiA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9QcmVkOjp0eXBlOjp2YWx1ZT4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBfSHAsIGNsYXNzIC4uLl9UcD4KK3N0cnVjdCBfX2xhenlfYW5kX2ltcGw8dHJ1ZSwgX0hwLCBfVHAuLi4+IDogX19sYXp5X2FuZF9pbXBsPF9IcDo6dHlwZTo6dmFsdWUsIF9UcC4uLj4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBfUDEsIGNsYXNzIC4uLl9Qcj4KK3N0cnVjdCBfX2xhenlfYW5kIDogX19sYXp5X2FuZF9pbXBsPF9QMTo6dHlwZTo6dmFsdWUsIF9Qci4uLj4ge307CisKKy8vIF9fbGF6eV9vcgorCit0ZW1wbGF0ZSA8Ym9vbCBfTGlzdCwgY2xhc3MgLi4uX1ByZWRzPgorc3RydWN0IF9fbGF6eV9vcl9pbXBsOworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX1ByZWRzPgorc3RydWN0IF9fbGF6eV9vcl9pbXBsPHRydWUsIF9QcmVkcy4uLj4gOiB0cnVlX3R5cGUge307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX19sYXp5X29yX2ltcGw8ZmFsc2U+IDogZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9IcCwgY2xhc3MgLi4uX1RwPgorc3RydWN0IF9fbGF6eV9vcl9pbXBsPGZhbHNlLCBfSHAsIF9UcC4uLj4KKyAgICAgICAgOiBfX2xhenlfb3JfaW1wbDxfSHA6OnR5cGU6OnZhbHVlLCBfVHAuLi4+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1AxLCBjbGFzcyAuLi5fUHI+CitzdHJ1Y3QgX19sYXp5X29yIDogX19sYXp5X29yX2ltcGw8X1AxOjp0eXBlOjp2YWx1ZSwgX1ByLi4uPiB7fTsKKworLy8gX19sYXp5X25vdAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWQ+CitzdHJ1Y3QgX19sYXp5X25vdCA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsICFfUHJlZDo6dHlwZTo6dmFsdWU+IHt9OworCisvLyBfX2FuZF8KK3RlbXBsYXRlPGNsYXNzLi4uPiBzdHJ1Y3QgX19hbmRfOwordGVtcGxhdGU8PiBzdHJ1Y3QgX19hbmRfPD4gOiB0cnVlX3R5cGUge307CisKK3RlbXBsYXRlPGNsYXNzIF9CMD4gc3RydWN0IF9fYW5kXzxfQjA+IDogX0IwIHt9OworCit0ZW1wbGF0ZTxjbGFzcyBfQjAsIGNsYXNzIF9CMT4KK3N0cnVjdCBfX2FuZF88X0IwLCBfQjE+IDogY29uZGl0aW9uYWw8X0IwOjp2YWx1ZSwgX0IxLCBfQjA+Ojp0eXBlIHt9OworCit0ZW1wbGF0ZTxjbGFzcyBfQjAsIGNsYXNzIF9CMSwgY2xhc3MgX0IyLCBjbGFzcy4uLiBfQm4+CitzdHJ1Y3QgX19hbmRfPF9CMCwgX0IxLCBfQjIsIF9Cbi4uLj4gCisgICAgICAgIDogY29uZGl0aW9uYWw8X0IwOjp2YWx1ZSwgX19hbmRfPF9CMSwgX0IyLCBfQm4uLi4+LCBfQjA+Ojp0eXBlIHt9OworCisvLyBfX29yXwordGVtcGxhdGU8Y2xhc3MuLi4+IHN0cnVjdCBfX29yXzsKK3RlbXBsYXRlPD4gc3RydWN0IF9fb3JfPD4gOiBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZTxjbGFzcyBfQjA+IHN0cnVjdCBfX29yXzxfQjA+IDogX0IwIHt9OworCit0ZW1wbGF0ZTxjbGFzcyBfQjAsIGNsYXNzIF9CMT4KK3N0cnVjdCBfX29yXzxfQjAsIF9CMT4gOiBjb25kaXRpb25hbDxfQjA6OnZhbHVlLCBfQjAsIF9CMT46OnR5cGUge307CisKK3RlbXBsYXRlPGNsYXNzIF9CMCwgY2xhc3MgX0IxLCBjbGFzcyBfQjIsIGNsYXNzLi4uIF9Cbj4KK3N0cnVjdCBfX29yXzxfQjAsIF9CMSwgX0IyLCBfQm4uLi4+IAorICAgICAgICA6IGNvbmRpdGlvbmFsPF9CMDo6dmFsdWUsIF9CMCwgX19vcl88X0IxLCBfQjIsIF9Cbi4uLj4gPjo6dHlwZSB7fTsKKworLy8gX19ub3RfCit0ZW1wbGF0ZTxjbGFzcyBfVHA+IAorc3RydWN0IF9fbm90XyA6IGNvbmRpdGlvbmFsPF9UcDo6dmFsdWUsIGZhbHNlX3R5cGUsIHRydWVfdHlwZT46OnR5cGUge307CisKKyNlbmRpZiAvLyAhZGVmaW5lZChfTElCQ1BQX0NYWDAzX0xBTkcpCisKKy8vIGlzX2NvbnN0CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19jb25zdCAgICAgICAgICAgIDogcHVibGljIGZhbHNlX3R5cGUge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfY29uc3Q8X1RwIGNvbnN0PiA6IHB1YmxpYyB0cnVlX3R5cGUge307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfY29uc3RfdgorICAgID0gaXNfY29uc3Q8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfdm9sYXRpbGUKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX3ZvbGF0aWxlICAgICAgICAgICAgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc192b2xhdGlsZTxfVHAgdm9sYXRpbGU+IDogcHVibGljIHRydWVfdHlwZSB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc192b2xhdGlsZV92CisgICAgPSBpc192b2xhdGlsZTxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyByZW1vdmVfY29uc3QKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHJlbW92ZV9jb25zdCAgICAgICAgICAgIHt0eXBlZGVmIF9UcCB0eXBlO307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgcmVtb3ZlX2NvbnN0PGNvbnN0IF9UcD4ge3R5cGVkZWYgX1RwIHR5cGU7fTsKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPGNsYXNzIF9UcD4gdXNpbmcgcmVtb3ZlX2NvbnN0X3QgPSB0eXBlbmFtZSByZW1vdmVfY29uc3Q8X1RwPjo6dHlwZTsKKyNlbmRpZgorCisvLyByZW1vdmVfdm9sYXRpbGUKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHJlbW92ZV92b2xhdGlsZSAgICAgICAgICAgICAgIHt0eXBlZGVmIF9UcCB0eXBlO307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgcmVtb3ZlX3ZvbGF0aWxlPHZvbGF0aWxlIF9UcD4ge3R5cGVkZWYgX1RwIHR5cGU7fTsKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPGNsYXNzIF9UcD4gdXNpbmcgcmVtb3ZlX3ZvbGF0aWxlX3QgPSB0eXBlbmFtZSByZW1vdmVfdm9sYXRpbGU8X1RwPjo6dHlwZTsKKyNlbmRpZgorCisvLyByZW1vdmVfY3YKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHJlbW92ZV9jdgore3R5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3ZvbGF0aWxlPHR5cGVuYW1lIHJlbW92ZV9jb25zdDxfVHA+Ojp0eXBlPjo6dHlwZSB0eXBlO307CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHVzaW5nIHJlbW92ZV9jdl90ID0gdHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU7CisjZW5kaWYKKworLy8gaXNfdm9pZAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX19saWJjcHBfaXNfdm9pZCAgICAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwordGVtcGxhdGUgPD4gICAgICAgICAgc3RydWN0IF9fbGliY3BwX2lzX3ZvaWQ8dm9pZD4gOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfdm9pZAorICAgIDogcHVibGljIF9fbGliY3BwX2lzX3ZvaWQ8dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+IHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX3ZvaWRfdgorICAgID0gaXNfdm9pZDxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBfX2lzX251bGxwdHJfdAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX19pc19udWxscHRyX3RfaW1wbCAgICAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwordGVtcGxhdGUgPD4gICAgICAgICAgc3RydWN0IF9faXNfbnVsbHB0cl90X2ltcGw8bnVsbHB0cl90PiA6IHB1YmxpYyB0cnVlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2lzX251bGxwdHJfdAorICAgIDogcHVibGljIF9faXNfbnVsbHB0cl90X2ltcGw8dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+IHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19udWxsX3BvaW50ZXIKKyAgICA6IHB1YmxpYyBfX2lzX251bGxwdHJfdF9pbXBsPHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPiB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc19udWxsX3BvaW50ZXJfdgorICAgID0gaXNfbnVsbF9wb2ludGVyPF9UcD46OnZhbHVlOworI2VuZGlmCisjZW5kaWYKKworLy8gaXNfaW50ZWdyYWwKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9fbGliY3BwX2lzX2ludGVncmFsICAgICAgICAgICAgICAgICAgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKK3RlbXBsYXRlIDw+ICAgICAgICAgIHN0cnVjdCBfX2xpYmNwcF9pc19pbnRlZ3JhbDxib29sPiAgICAgICAgICAgICAgIDogcHVibGljIHRydWVfdHlwZSB7fTsKK3RlbXBsYXRlIDw+ICAgICAgICAgIHN0cnVjdCBfX2xpYmNwcF9pc19pbnRlZ3JhbDxjaGFyPiAgICAgICAgICAgICAgIDogcHVibGljIHRydWVfdHlwZSB7fTsKK3RlbXBsYXRlIDw+ICAgICAgICAgIHN0cnVjdCBfX2xpYmNwcF9pc19pbnRlZ3JhbDxzaWduZWQgY2hhcj4gICAgICAgIDogcHVibGljIHRydWVfdHlwZSB7fTsKK3RlbXBsYXRlIDw+ICAgICAgICAgIHN0cnVjdCBfX2xpYmNwcF9pc19pbnRlZ3JhbDx1bnNpZ25lZCBjaGFyPiAgICAgIDogcHVibGljIHRydWVfdHlwZSB7fTsKK3RlbXBsYXRlIDw+ICAgICAgICAgIHN0cnVjdCBfX2xpYmNwcF9pc19pbnRlZ3JhbDx3Y2hhcl90PiAgICAgICAgICAgIDogcHVibGljIHRydWVfdHlwZSB7fTsKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fVU5JQ09ERV9DSEFSUwordGVtcGxhdGUgPD4gICAgICAgICAgc3RydWN0IF9fbGliY3BwX2lzX2ludGVncmFsPGNoYXIxNl90PiAgICAgICAgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OwordGVtcGxhdGUgPD4gICAgICAgICAgc3RydWN0IF9fbGliY3BwX2lzX2ludGVncmFsPGNoYXIzMl90PiAgICAgICAgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19VTklDT0RFX0NIQVJTCit0ZW1wbGF0ZSA8PiAgICAgICAgICBzdHJ1Y3QgX19saWJjcHBfaXNfaW50ZWdyYWw8c2hvcnQ+ICAgICAgICAgICAgICA6IHB1YmxpYyB0cnVlX3R5cGUge307Cit0ZW1wbGF0ZSA8PiAgICAgICAgICBzdHJ1Y3QgX19saWJjcHBfaXNfaW50ZWdyYWw8dW5zaWduZWQgc2hvcnQ+ICAgICA6IHB1YmxpYyB0cnVlX3R5cGUge307Cit0ZW1wbGF0ZSA8PiAgICAgICAgICBzdHJ1Y3QgX19saWJjcHBfaXNfaW50ZWdyYWw8aW50PiAgICAgICAgICAgICAgICA6IHB1YmxpYyB0cnVlX3R5cGUge307Cit0ZW1wbGF0ZSA8PiAgICAgICAgICBzdHJ1Y3QgX19saWJjcHBfaXNfaW50ZWdyYWw8dW5zaWduZWQgaW50PiAgICAgICA6IHB1YmxpYyB0cnVlX3R5cGUge307Cit0ZW1wbGF0ZSA8PiAgICAgICAgICBzdHJ1Y3QgX19saWJjcHBfaXNfaW50ZWdyYWw8bG9uZz4gICAgICAgICAgICAgICA6IHB1YmxpYyB0cnVlX3R5cGUge307Cit0ZW1wbGF0ZSA8PiAgICAgICAgICBzdHJ1Y3QgX19saWJjcHBfaXNfaW50ZWdyYWw8dW5zaWduZWQgbG9uZz4gICAgICA6IHB1YmxpYyB0cnVlX3R5cGUge307Cit0ZW1wbGF0ZSA8PiAgICAgICAgICBzdHJ1Y3QgX19saWJjcHBfaXNfaW50ZWdyYWw8bG9uZyBsb25nPiAgICAgICAgICA6IHB1YmxpYyB0cnVlX3R5cGUge307Cit0ZW1wbGF0ZSA8PiAgICAgICAgICBzdHJ1Y3QgX19saWJjcHBfaXNfaW50ZWdyYWw8dW5zaWduZWQgbG9uZyBsb25nPiA6IHB1YmxpYyB0cnVlX3R5cGUge307CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0lOVDEyOAordGVtcGxhdGUgPD4gICAgICAgICAgc3RydWN0IF9fbGliY3BwX2lzX2ludGVncmFsPF9faW50MTI4X3Q+ICAgICAgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OwordGVtcGxhdGUgPD4gICAgICAgICAgc3RydWN0IF9fbGliY3BwX2lzX2ludGVncmFsPF9fdWludDEyOF90PiAgICAgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19pbnRlZ3JhbAorICAgIDogcHVibGljIF9fbGliY3BwX2lzX2ludGVncmFsPHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPiB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc19pbnRlZ3JhbF92CisgICAgPSBpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBpc19mbG9hdGluZ19wb2ludAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX19saWJjcHBfaXNfZmxvYXRpbmdfcG9pbnQgICAgICAgICAgICAgIDogcHVibGljIGZhbHNlX3R5cGUge307Cit0ZW1wbGF0ZSA8PiAgICAgICAgICBzdHJ1Y3QgX19saWJjcHBfaXNfZmxvYXRpbmdfcG9pbnQ8ZmxvYXQ+ICAgICAgIDogcHVibGljIHRydWVfdHlwZSB7fTsKK3RlbXBsYXRlIDw+ICAgICAgICAgIHN0cnVjdCBfX2xpYmNwcF9pc19mbG9hdGluZ19wb2ludDxkb3VibGU+ICAgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OwordGVtcGxhdGUgPD4gICAgICAgICAgc3RydWN0IF9fbGliY3BwX2lzX2Zsb2F0aW5nX3BvaW50PGxvbmcgZG91YmxlPiA6IHB1YmxpYyB0cnVlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19mbG9hdGluZ19wb2ludAorICAgIDogcHVibGljIF9fbGliY3BwX2lzX2Zsb2F0aW5nX3BvaW50PHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPiB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc19mbG9hdGluZ19wb2ludF92CisgICAgPSBpc19mbG9hdGluZ19wb2ludDxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBpc19hcnJheQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfYXJyYXkKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX2FycmF5PF9UcFtdPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7fTsKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfTnA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19hcnJheTxfVHBbX05wXT4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUge307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfYXJyYXlfdgorICAgID0gaXNfYXJyYXk8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfcG9pbnRlcgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX19saWJjcHBfaXNfcG9pbnRlciAgICAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9fbGliY3BwX2lzX3BvaW50ZXI8X1RwKj4gOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfcG9pbnRlcgorICAgIDogcHVibGljIF9fbGliY3BwX2lzX3BvaW50ZXI8dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+IHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX3BvaW50ZXJfdgorICAgID0gaXNfcG9pbnRlcjxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBpc19yZWZlcmVuY2UKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX2x2YWx1ZV9yZWZlcmVuY2UgICAgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19sdmFsdWVfcmVmZXJlbmNlPF9UcCY+IDogcHVibGljIHRydWVfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX3J2YWx1ZV9yZWZlcmVuY2UgICAgICAgIDogcHVibGljIGZhbHNlX3R5cGUge307CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfcnZhbHVlX3JlZmVyZW5jZTxfVHAmJj4gOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19yZWZlcmVuY2UgICAgICAgIDogcHVibGljIGZhbHNlX3R5cGUge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfcmVmZXJlbmNlPF9UcCY+ICA6IHB1YmxpYyB0cnVlX3R5cGUge307CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfcmVmZXJlbmNlPF9UcCYmPiA6IHB1YmxpYyB0cnVlX3R5cGUge307CisjZW5kaWYKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc19yZWZlcmVuY2VfdgorICAgID0gaXNfcmVmZXJlbmNlPF9UcD46OnZhbHVlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfbHZhbHVlX3JlZmVyZW5jZV92CisgICAgPSBpc19sdmFsdWVfcmVmZXJlbmNlPF9UcD46OnZhbHVlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfcnZhbHVlX3JlZmVyZW5jZV92CisgICAgPSBpc19ydmFsdWVfcmVmZXJlbmNlPF9UcD46OnZhbHVlOworI2VuZGlmCisvLyBpc191bmlvbgorCisjaWYgX19oYXNfZmVhdHVyZShpc191bmlvbikgfHwgKF9HTlVDX1ZFUiA+PSA0MDMpCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc191bmlvbgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfdW5pb24oX1RwKT4ge307CisKKyNlbHNlCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfX2xpYmNwcF91bmlvbiA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX3VuaW9uCisgICAgOiBwdWJsaWMgX19saWJjcHBfdW5pb248dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+IHt9OworCisjZW5kaWYKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc191bmlvbl92CisgICAgPSBpc191bmlvbjxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBpc19jbGFzcworCisjaWYgX19oYXNfZmVhdHVyZShpc19jbGFzcykgfHwgKF9HTlVDX1ZFUiA+PSA0MDMpCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19jbGFzcworICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfY2xhc3MoX1RwKT4ge307CisKKyNlbHNlCisKK25hbWVzcGFjZSBfX2lzX2NsYXNzX2ltcAorewordGVtcGxhdGUgPGNsYXNzIF9UcD4gY2hhciAgX190ZXN0KGludCBfVHA6OiopOwordGVtcGxhdGUgPGNsYXNzIF9UcD4gX190d28gX190ZXN0KC4uLik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19jbGFzcworICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIHNpemVvZihfX2lzX2NsYXNzX2ltcDo6X190ZXN0PF9UcD4oMCkpID09IDEgJiYgIWlzX3VuaW9uPF9UcD46OnZhbHVlPiB7fTsKKworI2VuZGlmCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfY2xhc3NfdgorICAgID0gaXNfY2xhc3M8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfc2FtZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19zYW1lICAgICAgICAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4gICAgICAgICAgICBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfc2FtZTxfVHAsIF9UcD4gOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfc2FtZV92CisgICAgPSBpc19zYW1lPF9UcCwgX1VwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfZnVuY3Rpb24KKworbmFtZXNwYWNlIF9fbGliY3BwX2lzX2Z1bmN0aW9uX2ltcAoreworc3RydWN0IF9fZHVtbXlfdHlwZSB7fTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IGNoYXIgIF9fdGVzdChfVHAqKTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IGNoYXIgX190ZXN0KF9fZHVtbXlfdHlwZSk7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBfX3R3byBfX3Rlc3QoLi4uKTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IF9UcCYgIF9fc291cmNlKGludCk7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBfX2R1bW15X3R5cGUgX19zb3VyY2UoLi4uKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgYm9vbCA9IGlzX2NsYXNzPF9UcD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfdW5pb248X1RwPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc192b2lkPF9UcD46OnZhbHVlICB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXNfbnVsbHB0cl90PF9UcD46OnZhbHVlID4KK3N0cnVjdCBfX2xpYmNwcF9pc19mdW5jdGlvbgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIHNpemVvZihfX2xpYmNwcF9pc19mdW5jdGlvbl9pbXA6Ol9fdGVzdDxfVHA+KF9fbGliY3BwX2lzX2Z1bmN0aW9uX2ltcDo6X19zb3VyY2U8X1RwPigwKSkpID09IDE+CisgICAge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX19saWJjcHBfaXNfZnVuY3Rpb248X1RwLCB0cnVlPiA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfZnVuY3Rpb24KKyAgICA6IHB1YmxpYyBfX2xpYmNwcF9pc19mdW5jdGlvbjxfVHA+IHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX2Z1bmN0aW9uX3YKKyAgICA9IGlzX2Z1bmN0aW9uPF9UcD46OnZhbHVlOworI2VuZGlmCisKKy8vIGlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyCisKKy8vIHRlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCAgICAgICAgICAgIF9fbGliY3BwX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyICAgICAgICAgICAgIDogcHVibGljIGZhbHNlX3R5cGUge307CisvLyB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+IHN0cnVjdCBfX2xpYmNwcF9pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcjxfVHAgX1VwOjoqPiA6IHB1YmxpYyBpc19mdW5jdGlvbjxfVHA+IHt9OworLy8gCisKK3RlbXBsYXRlIDxjbGFzcyBfTVAsIGJvb2wgX0lzTWVtYmVyRnVuY3Rpb25QdHIsIGJvb2wgX0lzTWVtYmVyT2JqZWN0UHRyPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcAoreyAgLy8gZm9yd2FyZCBkZWNsYXJhdGlvbjsgc3BlY2lhbGl6YXRpb25zIGxhdGVyCit9OworCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfX2xpYmNwcF9pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcgorICAgIDogcHVibGljIGZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfQ2xhc3M+CitzdHJ1Y3QgX19saWJjcHBfaXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXI8X1JldCBfQ2xhc3M6Oio+CisgICAgOiBwdWJsaWMgaXNfZnVuY3Rpb248X1JldD4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcgorICAgIDogcHVibGljIF9fbGliY3BwX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyPHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPjo6dHlwZSB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcl92CisgICAgPSBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcjxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBpc19tZW1iZXJfcG9pbnRlcgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiAgICAgICAgICAgIHN0cnVjdCBfX2xpYmNwcF9pc19tZW1iZXJfcG9pbnRlciAgICAgICAgICAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPiBzdHJ1Y3QgX19saWJjcHBfaXNfbWVtYmVyX3BvaW50ZXI8X1RwIF9VcDo6Kj4gOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfbWVtYmVyX3BvaW50ZXIKKyAgICA6IHB1YmxpYyBfX2xpYmNwcF9pc19tZW1iZXJfcG9pbnRlcjx0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZT4ge307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfbWVtYmVyX3BvaW50ZXJfdgorICAgID0gaXNfbWVtYmVyX3BvaW50ZXI8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfbWVtYmVyX29iamVjdF9wb2ludGVyCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19tZW1iZXJfb2JqZWN0X3BvaW50ZXIKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19tZW1iZXJfcG9pbnRlcjxfVHA+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyPF9UcD46OnZhbHVlPiB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc19tZW1iZXJfb2JqZWN0X3BvaW50ZXJfdgorICAgID0gaXNfbWVtYmVyX29iamVjdF9wb2ludGVyPF9UcD46OnZhbHVlOworI2VuZGlmCisKKy8vIGlzX2VudW0KKworI2lmIF9faGFzX2ZlYXR1cmUoaXNfZW51bSkgfHwgKF9HTlVDX1ZFUiA+PSA0MDMpCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19lbnVtCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19lbnVtKF9UcCk+IHt9OworCisjZWxzZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfZW51bQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsICFpc192b2lkPF9UcD46OnZhbHVlICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzX2ludGVncmFsPF9UcD46OnZhbHVlICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNfZmxvYXRpbmdfcG9pbnQ8X1RwPjo6dmFsdWUgICAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc19hcnJheTxfVHA+Ojp2YWx1ZSAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzX3BvaW50ZXI8X1RwPjo6dmFsdWUgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNfcmVmZXJlbmNlPF9UcD46OnZhbHVlICAgICAgICAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc19tZW1iZXJfcG9pbnRlcjxfVHA+Ojp2YWx1ZSAgICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzX3VuaW9uPF9UcD46OnZhbHVlICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNfY2xhc3M8X1RwPjo6dmFsdWUgICAgICAgICAgICAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc19mdW5jdGlvbjxfVHA+Ojp2YWx1ZSAgICAgICAgID4ge307CisKKyNlbmRpZgorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX2VudW1fdgorICAgID0gaXNfZW51bTxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBpc19hcml0aG1ldGljCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19hcml0aG1ldGljCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUgICAgICB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Zsb2F0aW5nX3BvaW50PF9UcD46OnZhbHVlPiB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc19hcml0aG1ldGljX3YKKyAgICA9IGlzX2FyaXRobWV0aWM8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfZnVuZGFtZW50YWwKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX2Z1bmRhbWVudGFsCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfdm9pZDxfVHA+Ojp2YWx1ZSAgICAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2lzX251bGxwdHJfdDxfVHA+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2FyaXRobWV0aWM8X1RwPjo6dmFsdWU+IHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX2Z1bmRhbWVudGFsX3YKKyAgICA9IGlzX2Z1bmRhbWVudGFsPF9UcD46OnZhbHVlOworI2VuZGlmCisKKy8vIGlzX3NjYWxhcgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfc2NhbGFyCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfYXJpdGhtZXRpYzxfVHA+Ojp2YWx1ZSAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19tZW1iZXJfcG9pbnRlcjxfVHA+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3BvaW50ZXI8X1RwPjo6dmFsdWUgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pc19udWxscHRyX3Q8X1RwPjo6dmFsdWUgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19lbnVtPF9UcD46OnZhbHVlICAgICAgICAgICA+IHt9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfc2NhbGFyPG51bGxwdHJfdD4gOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX3NjYWxhcl92CisgICAgPSBpc19zY2FsYXI8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfb2JqZWN0CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19vYmplY3QKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19zY2FsYXI8X1RwPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19hcnJheTxfVHA+Ojp2YWx1ZSAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc191bmlvbjxfVHA+Ojp2YWx1ZSAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19jbGFzczxfVHA+Ojp2YWx1ZSAgPiB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc19vYmplY3RfdgorICAgID0gaXNfb2JqZWN0PF9UcD46OnZhbHVlOworI2VuZGlmCisKKy8vIGlzX2NvbXBvdW5kCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19jb21wb3VuZAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsICFpc19mdW5kYW1lbnRhbDxfVHA+Ojp2YWx1ZT4ge307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfY29tcG91bmRfdgorICAgID0gaXNfY29tcG91bmQ8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworCisvLyBfX2lzX3JlZmVyZW5jZWFibGUgIFtkZWZucy5yZWZlcmVuY2VhYmxlXQorCitzdHJ1Y3QgX19pc19yZWZlcmVuY2VhYmxlX2ltcGwgeworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+IHN0YXRpYyBfVHAmIF9fdGVzdChpbnQpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+IHN0YXRpYyBfX3R3byBfX3Rlc3QoLi4uKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19pc19yZWZlcmVuY2VhYmxlIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAhaXNfc2FtZTxkZWNsdHlwZShfX2lzX3JlZmVyZW5jZWFibGVfaW1wbDo6X190ZXN0PF9UcD4oMCkpLCBfX3R3bz46OnZhbHVlPiB7fTsKKworCisvLyBhZGRfY29uc3QKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgYm9vbCA9IGlzX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Z1bmN0aW9uPF9UcD46OnZhbHVlICB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NvbnN0PF9UcD46OnZhbHVlICAgICA+CitzdHJ1Y3QgX19hZGRfY29uc3QgICAgICAgICAgICAge3R5cGVkZWYgX1RwIHR5cGU7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2FkZF9jb25zdDxfVHAsIGZhbHNlPiB7dHlwZWRlZiBjb25zdCBfVHAgdHlwZTt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgYWRkX2NvbnN0CisgICAge3R5cGVkZWYgdHlwZW5hbWUgX19hZGRfY29uc3Q8X1RwPjo6dHlwZSB0eXBlO307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPGNsYXNzIF9UcD4gdXNpbmcgYWRkX2NvbnN0X3QgPSB0eXBlbmFtZSBhZGRfY29uc3Q8X1RwPjo6dHlwZTsKKyNlbmRpZgorCisvLyBhZGRfdm9sYXRpbGUKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgYm9vbCA9IGlzX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Z1bmN0aW9uPF9UcD46OnZhbHVlICB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3ZvbGF0aWxlPF9UcD46OnZhbHVlICA+CitzdHJ1Y3QgX19hZGRfdm9sYXRpbGUgICAgICAgICAgICAge3R5cGVkZWYgX1RwIHR5cGU7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2FkZF92b2xhdGlsZTxfVHAsIGZhbHNlPiB7dHlwZWRlZiB2b2xhdGlsZSBfVHAgdHlwZTt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgYWRkX3ZvbGF0aWxlCisgICAge3R5cGVkZWYgdHlwZW5hbWUgX19hZGRfdm9sYXRpbGU8X1RwPjo6dHlwZSB0eXBlO307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPGNsYXNzIF9UcD4gdXNpbmcgYWRkX3ZvbGF0aWxlX3QgPSB0eXBlbmFtZSBhZGRfdm9sYXRpbGU8X1RwPjo6dHlwZTsKKyNlbmRpZgorCisvLyBhZGRfY3YKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGFkZF9jdgorICAgIHt0eXBlZGVmIHR5cGVuYW1lIGFkZF9jb25zdDx0eXBlbmFtZSBhZGRfdm9sYXRpbGU8X1RwPjo6dHlwZT46OnR5cGUgdHlwZTt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHVzaW5nIGFkZF9jdl90ID0gdHlwZW5hbWUgYWRkX2N2PF9UcD46OnR5cGU7CisjZW5kaWYKKworLy8gcmVtb3ZlX3JlZmVyZW5jZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgcmVtb3ZlX3JlZmVyZW5jZSAgICAgICAge3R5cGVkZWYgX1RwIHR5cGU7fTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyByZW1vdmVfcmVmZXJlbmNlPF9UcCY+ICB7dHlwZWRlZiBfVHAgdHlwZTt9OworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHJlbW92ZV9yZWZlcmVuY2U8X1RwJiY+IHt0eXBlZGVmIF9UcCB0eXBlO307CisjZW5kaWYKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiB1c2luZyByZW1vdmVfcmVmZXJlbmNlX3QgPSB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGU7CisjZW5kaWYKKworLy8gYWRkX2x2YWx1ZV9yZWZlcmVuY2UKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgYm9vbCA9IF9faXNfcmVmZXJlbmNlYWJsZTxfVHA+Ojp2YWx1ZT4gc3RydWN0IF9fYWRkX2x2YWx1ZV9yZWZlcmVuY2VfaW1wbCAgICAgICAgICAgIHsgdHlwZWRlZiBfVHAgIHR5cGU7IH07Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBzdHJ1Y3QgX19hZGRfbHZhbHVlX3JlZmVyZW5jZV9pbXBsPF9UcCwgdHJ1ZT4geyB0eXBlZGVmIF9UcCYgdHlwZTsgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGFkZF9sdmFsdWVfcmVmZXJlbmNlCit7dHlwZWRlZiB0eXBlbmFtZSBfX2FkZF9sdmFsdWVfcmVmZXJlbmNlX2ltcGw8X1RwPjo6dHlwZSB0eXBlO307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPGNsYXNzIF9UcD4gdXNpbmcgYWRkX2x2YWx1ZV9yZWZlcmVuY2VfdCA9IHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9UcD46OnR5cGU7CisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBib29sID0gX19pc19yZWZlcmVuY2VhYmxlPF9UcD46OnZhbHVlPiBzdHJ1Y3QgX19hZGRfcnZhbHVlX3JlZmVyZW5jZV9pbXBsICAgICAgICAgICAgeyB0eXBlZGVmIF9UcCAgIHR5cGU7IH07Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBzdHJ1Y3QgX19hZGRfcnZhbHVlX3JlZmVyZW5jZV9pbXBsPF9UcCwgdHJ1ZT4geyB0eXBlZGVmIF9UcCYmIHR5cGU7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBhZGRfcnZhbHVlX3JlZmVyZW5jZQore3R5cGVkZWYgdHlwZW5hbWUgX19hZGRfcnZhbHVlX3JlZmVyZW5jZV9pbXBsPF9UcD46OnR5cGUgdHlwZTt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHVzaW5nIGFkZF9ydmFsdWVfcmVmZXJlbmNlX3QgPSB0eXBlbmFtZSBhZGRfcnZhbHVlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlOworI2VuZGlmCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBfVHAmJiBfX2RlY2x2YWwoaW50KTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IF9UcCAgIF9fZGVjbHZhbChsb25nKTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2RlY2x0eXBlKF9WU1REOjpfX2RlY2x2YWw8X1RwPigwKSkKK2RlY2x2YWwoKSBfTk9FWENFUFQ7CisKKyNlbHNlICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZQorZGVjbHZhbCgpOworCisjZW5kaWYgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKKy8vIF9fdW5jdnJlZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fdW5jdnJlZiAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2N2PHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZT46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX191bmNvbnN0cmVmIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9jb25zdDx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGU+Ojp0eXBlIHR5cGU7Cit9OworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3VzaW5nIF9fdW5jdnJlZl90ID0gdHlwZW5hbWUgX191bmN2cmVmPF9UcD46OnR5cGU7CisjZW5kaWYKKworLy8gX19pc19zYW1lX3VuY3ZyZWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorc3RydWN0IF9faXNfc2FtZV91bmN2cmVmIDogaXNfc2FtZTx0eXBlbmFtZSBfX3VuY3ZyZWY8X1RwPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX191bmN2cmVmPF9VcD46OnR5cGU+IHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTcKKy8vIGFsaWduZWRfdW5pb24gLSBzYW1lIGFzIF9fdW5jdnJlZgordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCByZW1vdmVfY3ZyZWYgOiBwdWJsaWMgX191bmN2cmVmPF9UcD4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHVzaW5nIHJlbW92ZV9jdnJlZl90ID0gdHlwZW5hbWUgcmVtb3ZlX2N2cmVmPF9UcD46OnR5cGU7CisjZW5kaWYKKworCitzdHJ1Y3QgX19hbnkKK3sKKyAgICBfX2FueSguLi4pOworfTsKKworLy8gcmVtb3ZlX3BvaW50ZXIKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHJlbW92ZV9wb2ludGVyICAgICAgICAgICAgICAgICAgICAgIHt0eXBlZGVmIF9UcCB0eXBlO307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgcmVtb3ZlX3BvaW50ZXI8X1RwKj4gICAgICAgICAgICAgICAge3R5cGVkZWYgX1RwIHR5cGU7fTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyByZW1vdmVfcG9pbnRlcjxfVHAqIGNvbnN0PiAgICAgICAgICB7dHlwZWRlZiBfVHAgdHlwZTt9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHJlbW92ZV9wb2ludGVyPF9UcCogdm9sYXRpbGU+ICAgICAgIHt0eXBlZGVmIF9UcCB0eXBlO307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgcmVtb3ZlX3BvaW50ZXI8X1RwKiBjb25zdCB2b2xhdGlsZT4ge3R5cGVkZWYgX1RwIHR5cGU7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiB1c2luZyByZW1vdmVfcG9pbnRlcl90ID0gdHlwZW5hbWUgcmVtb3ZlX3BvaW50ZXI8X1RwPjo6dHlwZTsKKyNlbmRpZgorCisvLyBhZGRfcG9pbnRlcgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCAKKyAgICAgICAgYm9vbCA9IF9faXNfcmVmZXJlbmNlYWJsZTxfVHA+Ojp2YWx1ZSB8fCAKKyAgICAgICAgICAgICAgICBpc19zYW1lPHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlLCB2b2lkPjo6dmFsdWU+CitzdHJ1Y3QgX19hZGRfcG9pbnRlcl9pbXBsCisgICAge3R5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlKiB0eXBlO307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX19hZGRfcG9pbnRlcl9pbXBsPF9UcCwgZmFsc2U+IAorICAgIHt0eXBlZGVmIF9UcCB0eXBlO307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBhZGRfcG9pbnRlcgorICAgIHt0eXBlZGVmIHR5cGVuYW1lIF9fYWRkX3BvaW50ZXJfaW1wbDxfVHA+Ojp0eXBlIHR5cGU7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiB1c2luZyBhZGRfcG9pbnRlcl90ID0gdHlwZW5hbWUgYWRkX3BvaW50ZXI8X1RwPjo6dHlwZTsKKyNlbmRpZgorCisvLyBpc19zaWduZWQKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgYm9vbCA9IGlzX2ludGVncmFsPF9UcD46OnZhbHVlPgorc3RydWN0IF9fbGliY3BwX2lzX3NpZ25lZF9pbXBsIDogcHVibGljIF9MSUJDUFBfQk9PTF9DT05TVEFOVChfVHAoLTEpIDwgX1RwKDApKSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2xpYmNwcF9pc19zaWduZWRfaW1wbDxfVHAsIGZhbHNlPiA6IHB1YmxpYyB0cnVlX3R5cGUge307ICAvLyBmbG9hdGluZyBwb2ludAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBib29sID0gaXNfYXJpdGhtZXRpYzxfVHA+Ojp2YWx1ZT4KK3N0cnVjdCBfX2xpYmNwcF9pc19zaWduZWQgOiBwdWJsaWMgX19saWJjcHBfaXNfc2lnbmVkX2ltcGw8X1RwPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9fbGliY3BwX2lzX3NpZ25lZDxfVHAsIGZhbHNlPiA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfc2lnbmVkIDogcHVibGljIF9fbGliY3BwX2lzX3NpZ25lZDxfVHA+IHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZF92CisgICAgPSBpc19zaWduZWQ8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfdW5zaWduZWQKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgYm9vbCA9IGlzX2ludGVncmFsPF9UcD46OnZhbHVlPgorc3RydWN0IF9fbGliY3BwX2lzX3Vuc2lnbmVkX2ltcGwgOiBwdWJsaWMgX0xJQkNQUF9CT09MX0NPTlNUQU5UKF9UcCgwKSA8IF9UcCgtMSkpIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fbGliY3BwX2lzX3Vuc2lnbmVkX2ltcGw8X1RwLCBmYWxzZT4gOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsgIC8vIGZsb2F0aW5nIHBvaW50CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGJvb2wgPSBpc19hcml0aG1ldGljPF9UcD46OnZhbHVlPgorc3RydWN0IF9fbGliY3BwX2lzX3Vuc2lnbmVkIDogcHVibGljIF9fbGliY3BwX2lzX3Vuc2lnbmVkX2ltcGw8X1RwPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9fbGliY3BwX2lzX3Vuc2lnbmVkPF9UcCwgZmFsc2U+IDogcHVibGljIGZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc191bnNpZ25lZCA6IHB1YmxpYyBfX2xpYmNwcF9pc191bnNpZ25lZDxfVHA+IHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX3Vuc2lnbmVkX3YKKyAgICA9IGlzX3Vuc2lnbmVkPF9UcD46OnZhbHVlOworI2VuZGlmCisKKy8vIHJhbmsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHJhbmsKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIDA+IHt9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHJhbms8X1RwW10+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c2l6ZV90LCByYW5rPF9UcD46OnZhbHVlICsgMT4ge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBzaXplX3QgX05wPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgcmFuazxfVHBbX05wXT4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIHJhbms8X1RwPjo6dmFsdWUgKyAxPiB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgc2l6ZV90IHJhbmtfdgorICAgID0gcmFuazxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBleHRlbnQKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgdW5zaWduZWQgX0lwID0gMD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGV4dGVudAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHNpemVfdCwgMD4ge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgZXh0ZW50PF9UcFtdLCAwPgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHNpemVfdCwgMD4ge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCB1bnNpZ25lZCBfSXA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBleHRlbnQ8X1RwW10sIF9JcD4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIGV4dGVudDxfVHAsIF9JcC0xPjo6dmFsdWU+IHt9OwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9OcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGV4dGVudDxfVHBbX05wXSwgMD4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIF9OcD4ge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBzaXplX3QgX05wLCB1bnNpZ25lZCBfSXA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBleHRlbnQ8X1RwW19OcF0sIF9JcD4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIGV4dGVudDxfVHAsIF9JcC0xPjo6dmFsdWU+IHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgdW5zaWduZWQgX0lwID0gMD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBzaXplX3QgZXh0ZW50X3YKKyAgICA9IGV4dGVudDxfVHAsIF9JcD46OnZhbHVlOworI2VuZGlmCisKKy8vIHJlbW92ZV9leHRlbnQKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHJlbW92ZV9leHRlbnQKKyAgICB7dHlwZWRlZiBfVHAgdHlwZTt9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHJlbW92ZV9leHRlbnQ8X1RwW10+CisgICAge3R5cGVkZWYgX1RwIHR5cGU7fTsKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfTnA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyByZW1vdmVfZXh0ZW50PF9UcFtfTnBdPgorICAgIHt0eXBlZGVmIF9UcCB0eXBlO307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPGNsYXNzIF9UcD4gdXNpbmcgcmVtb3ZlX2V4dGVudF90ID0gdHlwZW5hbWUgcmVtb3ZlX2V4dGVudDxfVHA+Ojp0eXBlOworI2VuZGlmCisKKy8vIHJlbW92ZV9hbGxfZXh0ZW50cworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgcmVtb3ZlX2FsbF9leHRlbnRzCisgICAge3R5cGVkZWYgX1RwIHR5cGU7fTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyByZW1vdmVfYWxsX2V4dGVudHM8X1RwW10+CisgICAge3R5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbF9leHRlbnRzPF9UcD46OnR5cGUgdHlwZTt9OwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9OcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHJlbW92ZV9hbGxfZXh0ZW50czxfVHBbX05wXT4KKyAgICB7dHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsX2V4dGVudHM8X1RwPjo6dHlwZSB0eXBlO307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPGNsYXNzIF9UcD4gdXNpbmcgcmVtb3ZlX2FsbF9leHRlbnRzX3QgPSB0eXBlbmFtZSByZW1vdmVfYWxsX2V4dGVudHM8X1RwPjo6dHlwZTsKKyNlbmRpZgorCisvLyBkZWNheQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1VwLCBib29sPgorc3RydWN0IF9fZGVjYXkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2N2PF9VcD46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVXA+CitzdHJ1Y3QgX19kZWNheTxfVXAsIHRydWU+IHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsCisgICAgICAgICAgICAgICAgICAgICA8CisgICAgICAgICAgICAgICAgICAgICAgICAgaXNfYXJyYXk8X1VwPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgcmVtb3ZlX2V4dGVudDxfVXA+Ojp0eXBlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBjb25kaXRpb25hbAorICAgICAgICAgICAgICAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Z1bmN0aW9uPF9VcD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgYWRkX3BvaW50ZXI8X1VwPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHJlbW92ZV9jdjxfVXA+Ojp0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBkZWNheQoreworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSBfVXA7CitwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2RlY2F5PF9VcCwgX19pc19yZWZlcmVuY2VhYmxlPF9VcD46OnZhbHVlPjo6dHlwZSB0eXBlOworfTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiB1c2luZyBkZWNheV90ID0gdHlwZW5hbWUgZGVjYXk8X1RwPjo6dHlwZTsKKyNlbmRpZgorCisvLyBpc19hYnN0cmFjdAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfYWJzdHJhY3QKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX2Fic3RyYWN0KF9UcCk+IHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX2Fic3RyYWN0X3YKKyAgICA9IGlzX2Fic3RyYWN0PF9UcD46OnZhbHVlOworI2VuZGlmCisKKy8vIGlzX2ZpbmFsCisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfSEFTX0lTX0ZJTkFMKQordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTCitfX2xpYmNwcF9pc19maW5hbCA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX2ZpbmFsKF9UcCk+IHt9OworI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUworX19saWJjcHBfaXNfZmluYWwgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTElCQ1BQX0hBU19JU19GSU5BTCkgJiYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUworaXNfZmluYWwgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19maW5hbChfVHApPiB7fTsKKyNlbmRpZgorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX2ZpbmFsX3YKKyAgICA9IGlzX2ZpbmFsPF9UcD46OnZhbHVlOworI2VuZGlmCisKKy8vIGlzX2FnZ3JlZ2F0ZQorI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX0lTX0FHR1JFR0FURSkKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTCitpc19hZ2dyZWdhdGUgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19hZ2dyZWdhdGUoX1RwKT4ge307CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIGNvbnN0ZXhwciBib29sIGlzX2FnZ3JlZ2F0ZV92CisgICAgPSBpc19hZ2dyZWdhdGU8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworI2VuZGlmIC8vIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX0lTX0FHR1JFR0FURSkKKworLy8gaXNfYmFzZV9vZgorCisjaWZkZWYgX0xJQkNQUF9IQVNfSVNfQkFTRV9PRgorCit0ZW1wbGF0ZSA8Y2xhc3MgX0JwLCBjbGFzcyBfRHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfYmFzZV9vZgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfYmFzZV9vZihfQnAsIF9EcCk+IHt9OworCisjZWxzZSAgLy8gX0xJQkNQUF9IQVNfSVNfQkFTRV9PRgorCituYW1lc3BhY2UgX19pc19iYXNlX29mX2ltcAorewordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfRHN0Cit7CisgICAgX0RzdChjb25zdCB2b2xhdGlsZSBfVHAgJik7Cit9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfU3JjCit7CisgICAgb3BlcmF0b3IgY29uc3Qgdm9sYXRpbGUgX1RwICYoKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPiBvcGVyYXRvciBjb25zdCBfRHN0PF9VcD4gJigpOworfTsKK3RlbXBsYXRlIDxzaXplX3Q+IHN0cnVjdCBfX29uZSB7IHR5cGVkZWYgY2hhciB0eXBlOyB9OwordGVtcGxhdGUgPGNsYXNzIF9CcCwgY2xhc3MgX0RwPiB0eXBlbmFtZSBfX29uZTxzaXplb2YoX0RzdDxfQnA+KGRlY2x2YWw8X1NyYzxfRHA+ID4oKSkpPjo6dHlwZSBfX3Rlc3QoaW50KTsKK3RlbXBsYXRlIDxjbGFzcyBfQnAsIGNsYXNzIF9EcD4gX190d28gX190ZXN0KC4uLik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQnAsIGNsYXNzIF9EcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19iYXNlX29mCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfY2xhc3M8X0JwPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoX19pc19iYXNlX29mX2ltcDo6X190ZXN0PF9CcCwgX0RwPigwKSkgPT0gMj4ge307CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfSVNfQkFTRV9PRgorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9CcCwgY2xhc3MgX0RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfYmFzZV9vZl92CisgICAgPSBpc19iYXNlX29mPF9CcCwgX0RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfY29udmVydGlibGUKKworI2lmIF9faGFzX2ZlYXR1cmUoaXNfY29udmVydGlibGVfdG8pICYmICFkZWZpbmVkKF9MSUJDUFBfVVNFX0lTX0NPTlZFUlRJQkxFX0ZBTExCQUNLKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19jb252ZXJ0aWJsZQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfY29udmVydGlibGVfdG8oX1QxLCBfVDIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzX2Fic3RyYWN0PF9UMj46OnZhbHVlPiB7fTsKKworI2Vsc2UgIC8vIF9faGFzX2ZlYXR1cmUoaXNfY29udmVydGlibGVfdG8pCisKK25hbWVzcGFjZSBfX2lzX2NvbnZlcnRpYmxlX2ltcAorewordGVtcGxhdGUgPGNsYXNzIF9UcD4gdm9pZCAgX190ZXN0X2NvbnZlcnQoX1RwKTsKKwordGVtcGxhdGUgPGNsYXNzIF9Gcm9tLCBjbGFzcyBfVG8sIGNsYXNzID0gdm9pZD4KK3N0cnVjdCBfX2lzX2NvbnZlcnRpYmxlX3Rlc3QgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9Gcm9tLCBjbGFzcyBfVG8+CitzdHJ1Y3QgX19pc19jb252ZXJ0aWJsZV90ZXN0PF9Gcm9tLCBfVG8sCisgICAgZGVjbHR5cGUoX1ZTVEQ6Ol9faXNfY29udmVydGlibGVfaW1wOjpfX3Rlc3RfY29udmVydDxfVG8+KF9WU1REOjpkZWNsdmFsPF9Gcm9tPigpKSk+IDogcHVibGljIHRydWVfdHlwZQore307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGJvb2wgX0lzQXJyYXkgPSAgICBpc19hcnJheTxfVHA+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgX0lzRnVuY3Rpb24gPSBpc19mdW5jdGlvbjxfVHA+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgX0lzVm9pZCA9ICAgICBpc192b2lkPF9UcD46OnZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9faXNfYXJyYXlfZnVuY3Rpb25fb3Jfdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAge2VudW0ge3ZhbHVlID0gMH07fTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfX2lzX2FycmF5X2Z1bmN0aW9uX29yX3ZvaWQ8X1RwLCB0cnVlLCBmYWxzZSwgZmFsc2U+IHtlbnVtIHt2YWx1ZSA9IDF9O307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX19pc19hcnJheV9mdW5jdGlvbl9vcl92b2lkPF9UcCwgZmFsc2UsIHRydWUsIGZhbHNlPiB7ZW51bSB7dmFsdWUgPSAyfTt9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9faXNfYXJyYXlfZnVuY3Rpb25fb3Jfdm9pZDxfVHAsIGZhbHNlLCBmYWxzZSwgdHJ1ZT4ge2VudW0ge3ZhbHVlID0gM307fTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwKKyAgICB1bnNpZ25lZCA9IF9faXNfY29udmVydGlibGVfaW1wOjpfX2lzX2FycmF5X2Z1bmN0aW9uX29yX3ZvaWQ8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlPjo6dmFsdWU+CitzdHJ1Y3QgX19pc19jb252ZXJ0aWJsZV9jaGVjaworeworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgX192ID0gMDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19pc19jb252ZXJ0aWJsZV9jaGVjazxfVHAsIDA+Cit7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBfX3YgPSBzaXplb2YoX1RwKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMiwKKyAgICB1bnNpZ25lZCBfVDFfaXNfYXJyYXlfZnVuY3Rpb25fb3Jfdm9pZCA9IF9faXNfY29udmVydGlibGVfaW1wOjpfX2lzX2FycmF5X2Z1bmN0aW9uX29yX3ZvaWQ8X1QxPjo6dmFsdWUsCisgICAgdW5zaWduZWQgX1QyX2lzX2FycmF5X2Z1bmN0aW9uX29yX3ZvaWQgPSBfX2lzX2NvbnZlcnRpYmxlX2ltcDo6X19pc19hcnJheV9mdW5jdGlvbl9vcl92b2lkPF9UMj46OnZhbHVlPgorc3RydWN0IF9faXNfY29udmVydGlibGUKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICBfX2lzX2NvbnZlcnRpYmxlX2ltcDo6X19pc19jb252ZXJ0aWJsZV90ZXN0PF9UMSwgX1QyPjo6dmFsdWUKKyNpZiBkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTKQorICAgICAgICAgJiYgISghaXNfZnVuY3Rpb248X1QxPjo6dmFsdWUgJiYgIWlzX3JlZmVyZW5jZTxfVDE+Ojp2YWx1ZSAmJiBpc19yZWZlcmVuY2U8X1QyPjo6dmFsdWUKKyAgICAgICAgICAgICAgJiYgKCFpc19jb25zdDx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UMj46OnR5cGU+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgfHwgaXNfdm9sYXRpbGU8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVDI+Ojp0eXBlPjo6dmFsdWUpCisgICAgICAgICAgICAgICAgICAmJiAoaXNfc2FtZTx0eXBlbmFtZSByZW1vdmVfY3Y8X1QxPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHJlbW92ZV9jdjx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UMj46OnR5cGU+Ojp0eXBlPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICB8fCBpc19iYXNlX29mPHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1QyPjo6dHlwZSwgX1QxPjo6dmFsdWUpKQorI2VuZGlmCisgICAgPgore307CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4gc3RydWN0IF9faXNfY29udmVydGlibGU8X1QxLCBfVDIsIDAsIDE+IDogcHVibGljIGZhbHNlX3R5cGUge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+IHN0cnVjdCBfX2lzX2NvbnZlcnRpYmxlPF9UMSwgX1QyLCAxLCAxPiA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPiBzdHJ1Y3QgX19pc19jb252ZXJ0aWJsZTxfVDEsIF9UMiwgMiwgMT4gOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4gc3RydWN0IF9faXNfY29udmVydGlibGU8X1QxLCBfVDIsIDMsIDE+IDogcHVibGljIGZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4gc3RydWN0IF9faXNfY29udmVydGlibGU8X1QxLCBfVDIsIDAsIDI+IDogcHVibGljIGZhbHNlX3R5cGUge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+IHN0cnVjdCBfX2lzX2NvbnZlcnRpYmxlPF9UMSwgX1QyLCAxLCAyPiA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPiBzdHJ1Y3QgX19pc19jb252ZXJ0aWJsZTxfVDEsIF9UMiwgMiwgMj4gOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4gc3RydWN0IF9faXNfY29udmVydGlibGU8X1QxLCBfVDIsIDMsIDI+IDogcHVibGljIGZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4gc3RydWN0IF9faXNfY29udmVydGlibGU8X1QxLCBfVDIsIDAsIDM+IDogcHVibGljIGZhbHNlX3R5cGUge307Cit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+IHN0cnVjdCBfX2lzX2NvbnZlcnRpYmxlPF9UMSwgX1QyLCAxLCAzPiA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPiBzdHJ1Y3QgX19pc19jb252ZXJ0aWJsZTxfVDEsIF9UMiwgMiwgMz4gOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4gc3RydWN0IF9faXNfY29udmVydGlibGU8X1QxLCBfVDIsIDMsIDM+IDogcHVibGljIHRydWVfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfY29udmVydGlibGUKKyAgICA6IHB1YmxpYyBfX2lzX2NvbnZlcnRpYmxlPF9UMSwgX1QyPgoreworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgX19jb21wbGV0ZV9jaGVjazEgPSBfX2lzX2NvbnZlcnRpYmxlX2NoZWNrPF9UMT46Ol9fdjsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IF9fY29tcGxldGVfY2hlY2syID0gX19pc19jb252ZXJ0aWJsZV9jaGVjazxfVDI+OjpfX3Y7Cit9OworCisjZW5kaWYgIC8vIF9faGFzX2ZlYXR1cmUoaXNfY29udmVydGlibGVfdG8pCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX0Zyb20sIGNsYXNzIF9Ubz4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX2NvbnZlcnRpYmxlX3YKKyAgICA9IGlzX2NvbnZlcnRpYmxlPF9Gcm9tLCBfVG8+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBpc19lbXB0eQorCisjaWYgX19oYXNfZmVhdHVyZShpc19lbXB0eSkgfHwgKF9HTlVDX1ZFUiA+PSA0MDcpCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfZW1wdHkKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX2VtcHR5KF9UcCk+IHt9OworCisjZWxzZSAgLy8gX19oYXNfZmVhdHVyZShpc19lbXB0eSkKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2lzX2VtcHR5MQorICAgIDogcHVibGljIF9UcAoreworICAgIGRvdWJsZSBfX2x4OworfTsKKworc3RydWN0IF9faXNfZW1wdHkyCit7CisgICAgZG91YmxlIF9fbHg7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBib29sID0gaXNfY2xhc3M8X1RwPjo6dmFsdWU+CitzdHJ1Y3QgX19saWJjcHBfZW1wdHkgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgc2l6ZW9mKF9faXNfZW1wdHkxPF9UcD4pID09IHNpemVvZihfX2lzX2VtcHR5Mik+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX19saWJjcHBfZW1wdHk8X1RwLCBmYWxzZT4gOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX2VtcHR5IDogcHVibGljIF9fbGliY3BwX2VtcHR5PF9UcD4ge307CisKKyNlbmRpZiAgLy8gX19oYXNfZmVhdHVyZShpc19lbXB0eSkKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc19lbXB0eV92CisgICAgPSBpc19lbXB0eTxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBpc19wb2x5bW9ycGhpYworCisjaWYgX19oYXNfZmVhdHVyZShpc19wb2x5bW9ycGhpYykgfHwgZGVmaW5lZChfTElCQ1BQX0NPTVBJTEVSX01TVkMpCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfcG9seW1vcnBoaWMKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX3BvbHltb3JwaGljKF9UcCk+IHt9OworCisjZWxzZQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNoYXIgJl9faXNfcG9seW1vcnBoaWNfaW1wbCgKKyAgICB0eXBlbmFtZSBlbmFibGVfaWY8c2l6ZW9mKChfVHAqKWR5bmFtaWNfY2FzdDxjb25zdCB2b2xhdGlsZSB2b2lkKj4oZGVjbHZhbDxfVHAqPigpKSkgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50Pjo6dHlwZSk7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IF9fdHdvICZfX2lzX3BvbHltb3JwaGljX2ltcGwoLi4uKTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX3BvbHltb3JwaGljCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgc2l6ZW9mKF9faXNfcG9seW1vcnBoaWNfaW1wbDxfVHA+KDApKSA9PSAxPiB7fTsKKworI2VuZGlmIC8vIF9faGFzX2ZlYXR1cmUoaXNfcG9seW1vcnBoaWMpCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfcG9seW1vcnBoaWNfdgorICAgID0gaXNfcG9seW1vcnBoaWM8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvcgorCisjaWYgX19oYXNfZmVhdHVyZShoYXNfdmlydHVhbF9kZXN0cnVjdG9yKSB8fCAoX0dOVUNfVkVSID49IDQwMykKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc192aXJ0dWFsX2Rlc3RydWN0b3IKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2hhc192aXJ0dWFsX2Rlc3RydWN0b3IoX1RwKT4ge307CisKKyNlbHNlCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBoYXNfdmlydHVhbF9kZXN0cnVjdG9yCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKKworI2VuZGlmCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaGFzX3ZpcnR1YWxfZGVzdHJ1Y3Rvcl92CisgICAgPSBoYXNfdmlydHVhbF9kZXN0cnVjdG9yPF9UcD46OnZhbHVlOworI2VuZGlmCisKKy8vIGhhc191bmlxdWVfb2JqZWN0X3JlcHJlc2VudGF0aW9ucworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgZGVmaW5lZChfTElCQ1BQX0hBU19VTklRVUVfT0JKRUNUX1JFUFJFU0VOVEFUSU9OUykKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc191bmlxdWVfb2JqZWN0X3JlcHJlc2VudGF0aW9ucworICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIAorICAgICAgIF9faGFzX3VuaXF1ZV9vYmplY3RfcmVwcmVzZW50YXRpb25zKHJlbW92ZV9jdl90PHJlbW92ZV9hbGxfZXh0ZW50c190PF9UcD4+KT4ge307CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaGFzX3VuaXF1ZV9vYmplY3RfcmVwcmVzZW50YXRpb25zX3YKKyAgICA9IGhhc191bmlxdWVfb2JqZWN0X3JlcHJlc2VudGF0aW9uczxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisjZW5kaWYKKworLy8gYWxpZ25tZW50X29mCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBhbGlnbm1lbnRfb2YKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIF9fYWxpZ25vZl9fKF9UcCk+IHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBzaXplX3QgYWxpZ25tZW50X29mX3YKKyAgICA9IGFsaWdubWVudF9vZjxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBhbGlnbmVkX3N0b3JhZ2UKKwordGVtcGxhdGUgPGNsYXNzIF9IcCwgY2xhc3MgX1RwPgorc3RydWN0IF9fdHlwZV9saXN0Cit7CisgICAgdHlwZWRlZiBfSHAgX0hlYWQ7CisgICAgdHlwZWRlZiBfVHAgX1RhaWw7Cit9OworCitzdHJ1Y3QgX19uYXQKK3sKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX19uYXQoKSA9IGRlbGV0ZTsKKyAgICBfX25hdChjb25zdCBfX25hdCYpID0gZGVsZXRlOworICAgIF9fbmF0JiBvcGVyYXRvcj0oY29uc3QgX19uYXQmKSA9IGRlbGV0ZTsKKyAgICB+X19uYXQoKSA9IGRlbGV0ZTsKKyNlbmRpZgorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2FsaWduX3R5cGUKK3sKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IHZhbHVlID0gYWxpZ25tZW50X29mPF9UcD46OnZhbHVlOworICAgIHR5cGVkZWYgX1RwIHR5cGU7Cit9OworCitzdHJ1Y3QgX19zdHJ1Y3RfZG91YmxlIHtsb25nIGRvdWJsZSBfX2x4O307CitzdHJ1Y3QgX19zdHJ1Y3RfZG91YmxlNCB7ZG91YmxlIF9fbHhbNF07fTsKKwordHlwZWRlZgorICAgIF9fdHlwZV9saXN0PF9fYWxpZ25fdHlwZTx1bnNpZ25lZCBjaGFyPiwKKyAgICBfX3R5cGVfbGlzdDxfX2FsaWduX3R5cGU8dW5zaWduZWQgc2hvcnQ+LAorICAgIF9fdHlwZV9saXN0PF9fYWxpZ25fdHlwZTx1bnNpZ25lZCBpbnQ+LAorICAgIF9fdHlwZV9saXN0PF9fYWxpZ25fdHlwZTx1bnNpZ25lZCBsb25nPiwKKyAgICBfX3R5cGVfbGlzdDxfX2FsaWduX3R5cGU8dW5zaWduZWQgbG9uZyBsb25nPiwKKyAgICBfX3R5cGVfbGlzdDxfX2FsaWduX3R5cGU8ZG91YmxlPiwKKyAgICBfX3R5cGVfbGlzdDxfX2FsaWduX3R5cGU8bG9uZyBkb3VibGU+LAorICAgIF9fdHlwZV9saXN0PF9fYWxpZ25fdHlwZTxfX3N0cnVjdF9kb3VibGU+LAorICAgIF9fdHlwZV9saXN0PF9fYWxpZ25fdHlwZTxfX3N0cnVjdF9kb3VibGU0PiwKKyAgICBfX3R5cGVfbGlzdDxfX2FsaWduX3R5cGU8aW50Kj4sCisgICAgX19uYXQKKyAgICA+ID4gPiA+ID4gPiA+ID4gPiA+IF9fYWxsX3R5cGVzOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RMLCBzaXplX3QgX0FsaWduPiBzdHJ1Y3QgX19maW5kX3BvZDsKKwordGVtcGxhdGUgPGNsYXNzIF9IcCwgc2l6ZV90IF9BbGlnbj4KK3N0cnVjdCBfX2ZpbmRfcG9kPF9fdHlwZV9saXN0PF9IcCwgX19uYXQ+LCBfQWxpZ24+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FsaWduID09IF9IcDo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9IcDo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZAorICAgICAgICAgICAgICAgICAgICAgICAgID46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfSHAsIGNsYXNzIF9UcCwgc2l6ZV90IF9BbGlnbj4KK3N0cnVjdCBfX2ZpbmRfcG9kPF9fdHlwZV9saXN0PF9IcCwgX1RwPiwgX0FsaWduPgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGlnbiA9PSBfSHA6OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfSHA6OnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fZmluZF9wb2Q8X1RwLCBfQWxpZ24+Ojp0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UTCwgc2l6ZV90IF9MZW4+IHN0cnVjdCBfX2ZpbmRfbWF4X2FsaWduOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0hwLCBzaXplX3QgX0xlbj4KK3N0cnVjdCBfX2ZpbmRfbWF4X2FsaWduPF9fdHlwZV9saXN0PF9IcCwgX19uYXQ+LCBfTGVuPiA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIF9IcDo6dmFsdWU+IHt9OworCit0ZW1wbGF0ZSA8c2l6ZV90IF9MZW4sIHNpemVfdCBfQTEsIHNpemVfdCBfQTI+CitzdHJ1Y3QgX19zZWxlY3RfYWxpZ24KK3sKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBfX21pbiA9IF9BMiA8IF9BMSA/IF9BMiA6IF9BMTsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IF9fbWF4ID0gX0ExIDwgX0EyID8gX0EyIDogX0ExOworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBzaXplX3QgdmFsdWUgPSBfTGVuIDwgX19tYXggPyBfX21pbiA6IF9fbWF4OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9IcCwgY2xhc3MgX1RwLCBzaXplX3QgX0xlbj4KK3N0cnVjdCBfX2ZpbmRfbWF4X2FsaWduPF9fdHlwZV9saXN0PF9IcCwgX1RwPiwgX0xlbj4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIF9fc2VsZWN0X2FsaWduPF9MZW4sIF9IcDo6dmFsdWUsIF9fZmluZF9tYXhfYWxpZ248X1RwLCBfTGVuPjo6dmFsdWU+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlIDxzaXplX3QgX0xlbiwgc2l6ZV90IF9BbGlnbiA9IF9fZmluZF9tYXhfYWxpZ248X19hbGxfdHlwZXMsIF9MZW4+Ojp2YWx1ZT4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBhbGlnbmVkX3N0b3JhZ2UKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZmluZF9wb2Q8X19hbGxfdHlwZXMsIF9BbGlnbj46OnR5cGUgX0FsaWduZXI7CisgICAgc3RhdGljX2Fzc2VydCghaXNfdm9pZDxfQWxpZ25lcj46OnZhbHVlLCAiIik7CisgICAgdW5pb24gdHlwZQorICAgIHsKKyAgICAgICAgX0FsaWduZXIgX19hbGlnbjsKKyAgICAgICAgdW5zaWduZWQgY2hhciBfX2RhdGFbKF9MZW4gKyBfQWxpZ24gLSAxKS9fQWxpZ24gKiBfQWxpZ25dOworICAgIH07Cit9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxzaXplX3QgX0xlbiwgc2l6ZV90IF9BbGlnbiA9IF9fZmluZF9tYXhfYWxpZ248X19hbGxfdHlwZXMsIF9MZW4+Ojp2YWx1ZT4KKyAgICB1c2luZyBhbGlnbmVkX3N0b3JhZ2VfdCA9IHR5cGVuYW1lIGFsaWduZWRfc3RvcmFnZTxfTGVuLCBfQWxpZ24+Ojp0eXBlOworI2VuZGlmCisKKyNkZWZpbmUgX0NSRUFURV9BTElHTkVEX1NUT1JBR0VfU1BFQ0lBTElaQVRJT04obikgXAordGVtcGxhdGUgPHNpemVfdCBfTGVuPlwKK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBhbGlnbmVkX3N0b3JhZ2U8X0xlbiwgbj5cCit7XAorICAgIHN0cnVjdCBfQUxJR05BUyhuKSB0eXBlXAorICAgIHtcCisgICAgICAgIHVuc2lnbmVkIGNoYXIgX19seFsoX0xlbiArIG4gLSAxKS9uICogbl07XAorICAgIH07XAorfQorCitfQ1JFQVRFX0FMSUdORURfU1RPUkFHRV9TUEVDSUFMSVpBVElPTigweDEpOworX0NSRUFURV9BTElHTkVEX1NUT1JBR0VfU1BFQ0lBTElaQVRJT04oMHgyKTsKK19DUkVBVEVfQUxJR05FRF9TVE9SQUdFX1NQRUNJQUxJWkFUSU9OKDB4NCk7CitfQ1JFQVRFX0FMSUdORURfU1RPUkFHRV9TUEVDSUFMSVpBVElPTigweDgpOworX0NSRUFURV9BTElHTkVEX1NUT1JBR0VfU1BFQ0lBTElaQVRJT04oMHgxMCk7CitfQ1JFQVRFX0FMSUdORURfU1RPUkFHRV9TUEVDSUFMSVpBVElPTigweDIwKTsKK19DUkVBVEVfQUxJR05FRF9TVE9SQUdFX1NQRUNJQUxJWkFUSU9OKDB4NDApOworX0NSRUFURV9BTElHTkVEX1NUT1JBR0VfU1BFQ0lBTElaQVRJT04oMHg4MCk7CitfQ1JFQVRFX0FMSUdORURfU1RPUkFHRV9TUEVDSUFMSVpBVElPTigweDEwMCk7CitfQ1JFQVRFX0FMSUdORURfU1RPUkFHRV9TUEVDSUFMSVpBVElPTigweDIwMCk7CitfQ1JFQVRFX0FMSUdORURfU1RPUkFHRV9TUEVDSUFMSVpBVElPTigweDQwMCk7CitfQ1JFQVRFX0FMSUdORURfU1RPUkFHRV9TUEVDSUFMSVpBVElPTigweDgwMCk7CitfQ1JFQVRFX0FMSUdORURfU1RPUkFHRV9TUEVDSUFMSVpBVElPTigweDEwMDApOworX0NSRUFURV9BTElHTkVEX1NUT1JBR0VfU1BFQ0lBTElaQVRJT04oMHgyMDAwKTsKKy8vIFBFL0NPRkYgZG9lcyBub3Qgc3VwcG9ydCBhbGlnbm1lbnQgYmV5b25kIDgxOTIgKD0weDIwMDApCisjaWYgIWRlZmluZWQoX0xJQkNQUF9PQkpFQ1RfRk9STUFUX0NPRkYpCitfQ1JFQVRFX0FMSUdORURfU1RPUkFHRV9TUEVDSUFMSVpBVElPTigweDQwMDApOworI2VuZGlmIC8vICFkZWZpbmVkKF9MSUJDUFBfT0JKRUNUX0ZPUk1BVF9DT0ZGKQorCisjdW5kZWYgX0NSRUFURV9BTElHTkVEX1NUT1JBR0VfU1BFQ0lBTElaQVRJT04KKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKKworLy8gYWxpZ25lZF91bmlvbgorCit0ZW1wbGF0ZSA8c2l6ZV90IF9JMCwgc2l6ZV90IC4uLl9Jbj4KK3N0cnVjdCBfX3N0YXRpY19tYXg7CisKK3RlbXBsYXRlIDxzaXplX3QgX0kwPgorc3RydWN0IF9fc3RhdGljX21heDxfSTA+Cit7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCB2YWx1ZSA9IF9JMDsKK307CisKK3RlbXBsYXRlIDxzaXplX3QgX0kwLCBzaXplX3QgX0kxLCBzaXplX3QgLi4uX0luPgorc3RydWN0IF9fc3RhdGljX21heDxfSTAsIF9JMSwgX0luLi4uPgoreworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgdmFsdWUgPSBfSTAgPj0gX0kxID8gX19zdGF0aWNfbWF4PF9JMCwgX0luLi4uPjo6dmFsdWUgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zdGF0aWNfbWF4PF9JMSwgX0luLi4uPjo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZSA8c2l6ZV90IF9MZW4sIGNsYXNzIF9UeXBlMCwgY2xhc3MgLi4uX1R5cGVzPgorc3RydWN0IGFsaWduZWRfdW5pb24KK3sKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsaWdubWVudF92YWx1ZSA9IF9fc3RhdGljX21heDxfX2FsaWdub2ZfXyhfVHlwZTApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYWxpZ25vZl9fKF9UeXBlcykuLi4+Ojp2YWx1ZTsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IF9fbGVuID0gX19zdGF0aWNfbWF4PF9MZW4sIHNpemVvZihfVHlwZTApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKF9UeXBlcykuLi4+Ojp2YWx1ZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsaWduZWRfc3RvcmFnZTxfX2xlbiwgYWxpZ25tZW50X3ZhbHVlPjo6dHlwZSB0eXBlOworfTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8c2l6ZV90IF9MZW4sIGNsYXNzIC4uLl9UeXBlcz4gdXNpbmcgYWxpZ25lZF91bmlvbl90ID0gdHlwZW5hbWUgYWxpZ25lZF91bmlvbjxfTGVuLCBfVHlwZXMuLi4+Ojp0eXBlOworI2VuZGlmCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19udW1lcmljX3R5cGUKK3sKKyAgIHN0YXRpYyB2b2lkIF9fdGVzdCguLi4pOworICAgc3RhdGljIGZsb2F0IF9fdGVzdChmbG9hdCk7CisgICBzdGF0aWMgZG91YmxlIF9fdGVzdChjaGFyKTsKKyAgIHN0YXRpYyBkb3VibGUgX190ZXN0KGludCk7CisgICBzdGF0aWMgZG91YmxlIF9fdGVzdCh1bnNpZ25lZCk7CisgICBzdGF0aWMgZG91YmxlIF9fdGVzdChsb25nKTsKKyAgIHN0YXRpYyBkb3VibGUgX190ZXN0KHVuc2lnbmVkIGxvbmcpOworICAgc3RhdGljIGRvdWJsZSBfX3Rlc3QobG9uZyBsb25nKTsKKyAgIHN0YXRpYyBkb3VibGUgX190ZXN0KHVuc2lnbmVkIGxvbmcgbG9uZyk7CisgICBzdGF0aWMgZG91YmxlIF9fdGVzdChkb3VibGUpOworICAgc3RhdGljIGxvbmcgZG91YmxlIF9fdGVzdChsb25nIGRvdWJsZSk7CisKKyAgIHR5cGVkZWYgZGVjbHR5cGUoX190ZXN0KGRlY2x2YWw8X1RwPigpKSkgdHlwZTsKKyAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gIWlzX3NhbWU8dHlwZSwgdm9pZD46OnZhbHVlOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfX251bWVyaWNfdHlwZTx2b2lkPgoreworICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKworLy8gX19wcm9tb3RlCisKK3RlbXBsYXRlIDxjbGFzcyBfQTEsIGNsYXNzIF9BMiA9IHZvaWQsIGNsYXNzIF9BMyA9IHZvaWQsCisgICAgICAgICAgYm9vbCA9IF9fbnVtZXJpY190eXBlPF9BMT46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgIF9fbnVtZXJpY190eXBlPF9BMj46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgIF9fbnVtZXJpY190eXBlPF9BMz46OnZhbHVlPgorY2xhc3MgX19wcm9tb3RlX2ltcAoreworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExLCBjbGFzcyBfQTIsIGNsYXNzIF9BMz4KK2NsYXNzIF9fcHJvbW90ZV9pbXA8X0ExLCBfQTIsIF9BMywgdHJ1ZT4KK3sKK3ByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3Byb21vdGVfaW1wPF9BMT46OnR5cGUgX190eXBlMTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcHJvbW90ZV9pbXA8X0EyPjo6dHlwZSBfX3R5cGUyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19wcm9tb3RlX2ltcDxfQTM+Ojp0eXBlIF9fdHlwZTM7CitwdWJsaWM6CisgICAgdHlwZWRlZiBkZWNsdHlwZShfX3R5cGUxKCkgKyBfX3R5cGUyKCkgKyBfX3R5cGUzKCkpIHR5cGU7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorY2xhc3MgX19wcm9tb3RlX2ltcDxfQTEsIF9BMiwgdm9pZCwgdHJ1ZT4KK3sKK3ByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3Byb21vdGVfaW1wPF9BMT46OnR5cGUgX190eXBlMTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcHJvbW90ZV9pbXA8X0EyPjo6dHlwZSBfX3R5cGUyOworcHVibGljOgorICAgIHR5cGVkZWYgZGVjbHR5cGUoX190eXBlMSgpICsgX190eXBlMigpKSB0eXBlOworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQTE+CitjbGFzcyBfX3Byb21vdGVfaW1wPF9BMSwgdm9pZCwgdm9pZCwgdHJ1ZT4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbnVtZXJpY190eXBlPF9BMT46OnR5cGUgdHlwZTsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ExLCBjbGFzcyBfQTIgPSB2b2lkLCBjbGFzcyBfQTMgPSB2b2lkPgorY2xhc3MgX19wcm9tb3RlIDogcHVibGljIF9fcHJvbW90ZV9pbXA8X0ExLCBfQTIsIF9BMz4ge307CisKKy8vIG1ha2Vfc2lnbmVkIC8gbWFrZV91bnNpZ25lZAorCit0eXBlZGVmCisgICAgX190eXBlX2xpc3Q8c2lnbmVkIGNoYXIsCisgICAgX190eXBlX2xpc3Q8c2lnbmVkIHNob3J0LAorICAgIF9fdHlwZV9saXN0PHNpZ25lZCBpbnQsCisgICAgX190eXBlX2xpc3Q8c2lnbmVkIGxvbmcsCisgICAgX190eXBlX2xpc3Q8c2lnbmVkIGxvbmcgbG9uZywKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fSU5UMTI4CisgICAgX190eXBlX2xpc3Q8X19pbnQxMjhfdCwKKyNlbmRpZgorICAgIF9fbmF0CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0lOVDEyOAorICAgID4KKyNlbmRpZgorICAgID4gPiA+ID4gPiBfX3NpZ25lZF90eXBlczsKKwordHlwZWRlZgorICAgIF9fdHlwZV9saXN0PHVuc2lnbmVkIGNoYXIsCisgICAgX190eXBlX2xpc3Q8dW5zaWduZWQgc2hvcnQsCisgICAgX190eXBlX2xpc3Q8dW5zaWduZWQgaW50LAorICAgIF9fdHlwZV9saXN0PHVuc2lnbmVkIGxvbmcsCisgICAgX190eXBlX2xpc3Q8dW5zaWduZWQgbG9uZyBsb25nLAorI2lmbmRlZiBfTElCQ1BQX0hBU19OT19JTlQxMjgKKyAgICBfX3R5cGVfbGlzdDxfX3VpbnQxMjhfdCwKKyNlbmRpZgorICAgIF9fbmF0CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0lOVDEyOAorICAgID4KKyNlbmRpZgorICAgID4gPiA+ID4gPiBfX3Vuc2lnbmVkX3R5cGVzOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1R5cGVMaXN0LCBzaXplX3QgX1NpemUsIGJvb2wgPSBfU2l6ZSA8PSBzaXplb2YodHlwZW5hbWUgX1R5cGVMaXN0OjpfSGVhZCk+IHN0cnVjdCBfX2ZpbmRfZmlyc3Q7CisKK3RlbXBsYXRlIDxjbGFzcyBfSHAsIGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPgorc3RydWN0IF9fZmluZF9maXJzdDxfX3R5cGVfbGlzdDxfSHAsIF9UcD4sIF9TaXplLCB0cnVlPgoreworICAgIHR5cGVkZWYgX0hwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0hwLCBjbGFzcyBfVHAsIHNpemVfdCBfU2l6ZT4KK3N0cnVjdCBfX2ZpbmRfZmlyc3Q8X190eXBlX2xpc3Q8X0hwLCBfVHA+LCBfU2l6ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2ZpbmRfZmlyc3Q8X1RwLCBfU2l6ZT46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcCwgYm9vbCA9IGlzX2NvbnN0PHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sID0gaXNfdm9sYXRpbGU8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlPjo6dmFsdWU+CitzdHJ1Y3QgX19hcHBseV9jdgoreworICAgIHR5cGVkZWYgX1VwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitzdHJ1Y3QgX19hcHBseV9jdjxfVHAsIF9VcCwgdHJ1ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBjb25zdCBfVXAgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK3N0cnVjdCBfX2FwcGx5X2N2PF9UcCwgX1VwLCBmYWxzZSwgdHJ1ZT4KK3sKKyAgICB0eXBlZGVmIHZvbGF0aWxlIF9VcCB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorc3RydWN0IF9fYXBwbHlfY3Y8X1RwLCBfVXAsIHRydWUsIHRydWU+Cit7CisgICAgdHlwZWRlZiBjb25zdCB2b2xhdGlsZSBfVXAgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK3N0cnVjdCBfX2FwcGx5X2N2PF9UcCYsIF9VcCwgZmFsc2UsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX1VwJiB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorc3RydWN0IF9fYXBwbHlfY3Y8X1RwJiwgX1VwLCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIGNvbnN0IF9VcCYgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK3N0cnVjdCBfX2FwcGx5X2N2PF9UcCYsIF9VcCwgZmFsc2UsIHRydWU+Cit7CisgICAgdHlwZWRlZiB2b2xhdGlsZSBfVXAmIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitzdHJ1Y3QgX19hcHBseV9jdjxfVHAmLCBfVXAsIHRydWUsIHRydWU+Cit7CisgICAgdHlwZWRlZiBjb25zdCB2b2xhdGlsZSBfVXAmIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBib29sID0gaXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUgfHwgaXNfZW51bTxfVHA+Ojp2YWx1ZT4KK3N0cnVjdCBfX21ha2Vfc2lnbmVkIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fbWFrZV9zaWduZWQ8X1RwLCB0cnVlPgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19maW5kX2ZpcnN0PF9fc2lnbmVkX3R5cGVzLCBzaXplb2YoX1RwKT46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBfX21ha2Vfc2lnbmVkPGJvb2wsICAgICAgICAgICAgICAgdHJ1ZT4ge307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX19tYWtlX3NpZ25lZDwgIHNpZ25lZCBzaG9ydCwgICAgIHRydWU+IHt0eXBlZGVmIHNob3J0ICAgICB0eXBlO307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX19tYWtlX3NpZ25lZDx1bnNpZ25lZCBzaG9ydCwgICAgIHRydWU+IHt0eXBlZGVmIHNob3J0ICAgICB0eXBlO307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX19tYWtlX3NpZ25lZDwgIHNpZ25lZCBpbnQsICAgICAgIHRydWU+IHt0eXBlZGVmIGludCAgICAgICB0eXBlO307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX19tYWtlX3NpZ25lZDx1bnNpZ25lZCBpbnQsICAgICAgIHRydWU+IHt0eXBlZGVmIGludCAgICAgICB0eXBlO307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX19tYWtlX3NpZ25lZDwgIHNpZ25lZCBsb25nLCAgICAgIHRydWU+IHt0eXBlZGVmIGxvbmcgICAgICB0eXBlO307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX19tYWtlX3NpZ25lZDx1bnNpZ25lZCBsb25nLCAgICAgIHRydWU+IHt0eXBlZGVmIGxvbmcgICAgICB0eXBlO307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX19tYWtlX3NpZ25lZDwgIHNpZ25lZCBsb25nIGxvbmcsIHRydWU+IHt0eXBlZGVmIGxvbmcgbG9uZyB0eXBlO307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX19tYWtlX3NpZ25lZDx1bnNpZ25lZCBsb25nIGxvbmcsIHRydWU+IHt0eXBlZGVmIGxvbmcgbG9uZyB0eXBlO307CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0lOVDEyOAordGVtcGxhdGUgPD4gc3RydWN0IF9fbWFrZV9zaWduZWQ8X19pbnQxMjhfdCwgICAgICAgICB0cnVlPiB7dHlwZWRlZiBfX2ludDEyOF90IHR5cGU7fTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBfX21ha2Vfc2lnbmVkPF9fdWludDEyOF90LCAgICAgICAgdHJ1ZT4ge3R5cGVkZWYgX19pbnQxMjhfdCB0eXBlO307CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBtYWtlX3NpZ25lZAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hcHBseV9jdjxfVHAsIHR5cGVuYW1lIF9fbWFrZV9zaWduZWQ8dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp0eXBlPjo6dHlwZSB0eXBlOworfTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiB1c2luZyBtYWtlX3NpZ25lZF90ID0gdHlwZW5hbWUgbWFrZV9zaWduZWQ8X1RwPjo6dHlwZTsKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBib29sID0gaXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUgfHwgaXNfZW51bTxfVHA+Ojp2YWx1ZT4KK3N0cnVjdCBfX21ha2VfdW5zaWduZWQge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19tYWtlX3Vuc2lnbmVkPF9UcCwgdHJ1ZT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZmluZF9maXJzdDxfX3Vuc2lnbmVkX3R5cGVzLCBzaXplb2YoX1RwKT46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBfX21ha2VfdW5zaWduZWQ8Ym9vbCwgICAgICAgICAgICAgICB0cnVlPiB7fTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBfX21ha2VfdW5zaWduZWQ8ICBzaWduZWQgc2hvcnQsICAgICB0cnVlPiB7dHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgdHlwZTt9OwordGVtcGxhdGUgPD4gc3RydWN0IF9fbWFrZV91bnNpZ25lZDx1bnNpZ25lZCBzaG9ydCwgICAgIHRydWU+IHt0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICB0eXBlO307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX19tYWtlX3Vuc2lnbmVkPCAgc2lnbmVkIGludCwgICAgICAgdHJ1ZT4ge3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgIHR5cGU7fTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBfX21ha2VfdW5zaWduZWQ8dW5zaWduZWQgaW50LCAgICAgICB0cnVlPiB7dHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgdHlwZTt9OwordGVtcGxhdGUgPD4gc3RydWN0IF9fbWFrZV91bnNpZ25lZDwgIHNpZ25lZCBsb25nLCAgICAgIHRydWU+IHt0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICB0eXBlO307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX19tYWtlX3Vuc2lnbmVkPHVuc2lnbmVkIGxvbmcsICAgICAgdHJ1ZT4ge3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgIHR5cGU7fTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBfX21ha2VfdW5zaWduZWQ8ICBzaWduZWQgbG9uZyBsb25nLCB0cnVlPiB7dHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdHlwZTt9OwordGVtcGxhdGUgPD4gc3RydWN0IF9fbWFrZV91bnNpZ25lZDx1bnNpZ25lZCBsb25nIGxvbmcsIHRydWU+IHt0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB0eXBlO307CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0lOVDEyOAordGVtcGxhdGUgPD4gc3RydWN0IF9fbWFrZV91bnNpZ25lZDxfX2ludDEyOF90LCAgICAgICAgIHRydWU+IHt0eXBlZGVmIF9fdWludDEyOF90ICAgICAgICB0eXBlO307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX19tYWtlX3Vuc2lnbmVkPF9fdWludDEyOF90LCAgICAgICAgdHJ1ZT4ge3R5cGVkZWYgX191aW50MTI4X3QgICAgICAgIHR5cGU7fTsKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIG1ha2VfdW5zaWduZWQKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYXBwbHlfY3Y8X1RwLCB0eXBlbmFtZSBfX21ha2VfdW5zaWduZWQ8dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp0eXBlPjo6dHlwZSB0eXBlOworfTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiB1c2luZyBtYWtlX3Vuc2lnbmVkX3QgPSB0eXBlbmFtZSBtYWtlX3Vuc2lnbmVkPF9UcD46OnR5cGU7CisjZW5kaWYKKworI2lmZGVmIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXAgPSB2b2lkLCBjbGFzcyBfVnAgPSB2b2lkPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGNvbW1vbl90eXBlCit7CitwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb21tb25fdHlwZTx0eXBlbmFtZSBjb21tb25fdHlwZTxfVHAsIF9VcD46OnR5cGUsIF9WcD46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgY29tbW9uX3R5cGU8dm9pZCwgdm9pZCwgdm9pZD4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHZvaWQgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgY29tbW9uX3R5cGU8X1RwLCB2b2lkLCB2b2lkPgoreworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X1RwLCBfVHA+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgY29tbW9uX3R5cGU8X1RwLCBfVXAsIHZvaWQ+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBkZWNheTxkZWNsdHlwZSgKKyAgICAgICAgdHJ1ZSA/IF9WU1REOjpkZWNsdmFsPF9UcD4oKSA6IF9WU1REOjpkZWNsdmFsPF9VcD4oKQorICAgICAgKT46OnR5cGUgdHlwZTsKK307CisKKyNlbHNlICAvLyBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKKworLy8gYnVsbGV0IDEgLSBzaXplb2YuLi4oVHApID09IDAKKwordGVtcGxhdGUgPGNsYXNzIC4uLl9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBjb21tb25fdHlwZSB7fTsKKworLy8gYnVsbGV0IDIgLSBzaXplb2YuLi4oVHApID09IDEKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBjb21tb25fdHlwZTxfVHA+CisgICAgOiBwdWJsaWMgY29tbW9uX3R5cGU8X1RwLCBfVHA+IHt9OworCisvLyBidWxsZXQgMyAtIHNpemVvZi4uLihUcCkgPT0gMgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXAsIGNsYXNzID0gdm9pZD4KK3N0cnVjdCBfX2NvbW1vbl90eXBlMl9pbXAge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK3N0cnVjdCBfX2NvbW1vbl90eXBlMl9pbXA8X1RwLCBfVXAsCisgICAgdHlwZW5hbWUgX192b2lkX3Q8ZGVjbHR5cGUoCisgICAgICAgIHRydWUgPyBfVlNURDo6ZGVjbHZhbDxfVHA+KCkgOiBfVlNURDo6ZGVjbHZhbDxfVXA+KCkKKyAgICApPjo6dHlwZT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGRlY2F5PGRlY2x0eXBlKAorICAgICAgICB0cnVlID8gX1ZTVEQ6OmRlY2x2YWw8X1RwPigpIDogX1ZTVEQ6OmRlY2x2YWw8X1VwPigpCisgICAgKT46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcCwKKyAgICAgICAgICBjbGFzcyBfRFRwID0gdHlwZW5hbWUgZGVjYXk8X1RwPjo6dHlwZSwKKyAgICAgICAgICBjbGFzcyBfRFVwID0gdHlwZW5hbWUgZGVjYXk8X1VwPjo6dHlwZT4KK3VzaW5nIF9fY29tbW9uX3R5cGUyID0KKyAgdHlwZW5hbWUgY29uZGl0aW9uYWw8CisgICAgaXNfc2FtZTxfVHAsIF9EVHA+Ojp2YWx1ZSAmJiBpc19zYW1lPF9VcCwgX0RVcD46OnZhbHVlLAorICAgIF9fY29tbW9uX3R5cGUyX2ltcDxfVHAsIF9VcD4sCisgICAgY29tbW9uX3R5cGU8X0RUcCwgX0RVcD4KKyAgPjo6dHlwZTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGNvbW1vbl90eXBlPF9UcCwgX1VwPgorICAgIDogX19jb21tb25fdHlwZTI8X1RwLCBfVXA+IHt9OworCisvLyBidWxsZXQgNCAtIHNpemVvZi4uLihUcCkgPiAyCisKK3RlbXBsYXRlIDxjbGFzcyAuLi5UcD4gc3RydWN0IF9fY29tbW9uX3R5cGVzOworCit0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzID0gdm9pZD4KK3N0cnVjdCBfX2NvbW1vbl90eXBlX2ltcGwge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK3N0cnVjdCBfX2NvbW1vbl90eXBlX2ltcGw8CisgICAgX19jb21tb25fdHlwZXM8X1RwLCBfVXA+LAorICAgIHR5cGVuYW1lIF9fdm9pZF90PHR5cGVuYW1lIGNvbW1vbl90eXBlPF9UcCwgX1VwPjo6dHlwZT46OnR5cGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X1RwLCBfVXA+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXAsIGNsYXNzIC4uLl9WcD4KK3N0cnVjdCBfX2NvbW1vbl90eXBlX2ltcGw8X19jb21tb25fdHlwZXM8X1RwLCBfVXAsIF9WcC4uLj4sCisgICAgdHlwZW5hbWUgX192b2lkX3Q8dHlwZW5hbWUgY29tbW9uX3R5cGU8X1RwLCBfVXA+Ojp0eXBlPjo6dHlwZT4KKyAgOiBfX2NvbW1vbl90eXBlX2ltcGw8CisgICAgICBfX2NvbW1vbl90eXBlczx0eXBlbmFtZSBjb21tb25fdHlwZTxfVHAsIF9VcD46OnR5cGUsIF9WcC4uLj4gPgoreworCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXAsIGNsYXNzIC4uLl9WcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBjb21tb25fdHlwZTxfVHAsIF9VcCwgX1ZwLi4uPgorICAgIDogX19jb21tb25fdHlwZV9pbXBsPF9fY29tbW9uX3R5cGVzPF9UcCwgX1VwLCBfVnAuLi4+ID4ge307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPGNsYXNzIC4uLl9UcD4gdXNpbmcgY29tbW9uX3R5cGVfdCA9IHR5cGVuYW1lIGNvbW1vbl90eXBlPF9UcC4uLj46OnR5cGU7CisjZW5kaWYKKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKKworLy8gaXNfYXNzaWduYWJsZQorCit0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWUgX1RwPiBzdHJ1Y3QgX19zZWxlY3RfMm5kIHsgdHlwZWRlZiBfVHAgdHlwZTsgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK3R5cGVuYW1lIF9fc2VsZWN0XzJuZDxkZWNsdHlwZSgoX1ZTVEQ6OmRlY2x2YWw8X1RwPigpID0gX1ZTVEQ6OmRlY2x2YWw8X0FyZz4oKSkpLCB0cnVlX3R5cGU+Ojp0eXBlCitfX2lzX2Fzc2lnbmFibGVfdGVzdChpbnQpOworCit0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzPgorZmFsc2VfdHlwZSBfX2lzX2Fzc2lnbmFibGVfdGVzdCguLi4pOworCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BcmcsIGJvb2wgPSBpc192b2lkPF9UcD46OnZhbHVlIHx8IGlzX3ZvaWQ8X0FyZz46OnZhbHVlPgorc3RydWN0IF9faXNfYXNzaWduYWJsZV9pbXAKKyAgICA6IHB1YmxpYyBkZWNsdHlwZSgoX1ZTVEQ6Ol9faXNfYXNzaWduYWJsZV90ZXN0PF9UcCwgX0FyZz4oMCkpKSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK3N0cnVjdCBfX2lzX2Fzc2lnbmFibGVfaW1wPF9UcCwgX0FyZywgdHJ1ZT4KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlCit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorc3RydWN0IGlzX2Fzc2lnbmFibGUKKyAgICA6IHB1YmxpYyBfX2lzX2Fzc2lnbmFibGVfaW1wPF9UcCwgX0FyZz4ge307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfYXNzaWduYWJsZV92CisgICAgPSBpc19hc3NpZ25hYmxlPF9UcCwgX0FyZz46OnZhbHVlOworI2VuZGlmCisKKy8vIGlzX2NvcHlfYXNzaWduYWJsZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfY29weV9hc3NpZ25hYmxlCisgICAgOiBwdWJsaWMgaXNfYXNzaWduYWJsZTx0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8dHlwZW5hbWUgYWRkX2NvbnN0PF9UcD46OnR5cGU+Ojp0eXBlPiB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc19jb3B5X2Fzc2lnbmFibGVfdgorICAgID0gaXNfY29weV9hc3NpZ25hYmxlPF9UcD46OnZhbHVlOworI2VuZGlmCisKKy8vIGlzX21vdmVfYXNzaWduYWJsZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfbW92ZV9hc3NpZ25hYmxlCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisgICAgOiBwdWJsaWMgaXNfYXNzaWduYWJsZTx0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgYWRkX3J2YWx1ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZT4ge307CisjZWxzZQorICAgIDogcHVibGljIGlzX2NvcHlfYXNzaWduYWJsZTxfVHA+IHt9OworI2VuZGlmCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfbW92ZV9hc3NpZ25hYmxlX3YKKyAgICA9IGlzX21vdmVfYXNzaWduYWJsZTxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBpc19kZXN0cnVjdGlibGUKKworLy8gIGlmIGl0J3MgYSByZWZlcmVuY2UsIHJldHVybiB0cnVlCisvLyAgaWYgaXQncyBhIGZ1bmN0aW9uLCByZXR1cm4gZmFsc2UKKy8vICBpZiBpdCdzICAgdm9pZCwgICAgIHJldHVybiBmYWxzZQorLy8gIGlmIGl0J3MgYW4gYXJyYXkgb2YgdW5rbm93biBib3VuZCwgcmV0dXJuIGZhbHNlCisvLyAgT3RoZXJ3aXNlLCByZXR1cm4gInN0ZDo6ZGVjbHZhbDxfVXAmPigpLn5fVXAoKSIgaXMgd2VsbC1mb3JtZWQKKy8vICAgIHdoZXJlIF9VcCBpcyByZW1vdmVfYWxsX2V4dGVudHM8X1RwPjo6dHlwZQorCit0ZW1wbGF0ZSA8Y2xhc3M+CitzdHJ1Y3QgX19pc19kZXN0cnVjdGlibGVfYXBwbHkgeyB0eXBlZGVmIGludCB0eXBlOyB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorc3RydWN0IF9faXNfZGVzdHJ1Y3Rvcl93ZWxsZm9ybWVkIHsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwMT4KKyAgICBzdGF0aWMgY2hhciAgX190ZXN0ICgKKyAgICAgICAgdHlwZW5hbWUgX19pc19kZXN0cnVjdGlibGVfYXBwbHk8ZGVjbHR5cGUoX1ZTVEQ6OmRlY2x2YWw8X1RwMSY+KCkufl9UcDEoKSk+Ojp0eXBlCisgICAgKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAxPgorICAgIHN0YXRpYyBfX3R3byBfX3Rlc3QgKC4uLik7CisgICAgCisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBzaXplb2YoX190ZXN0PF9UcD4oMTIpKSA9PSBzaXplb2YoY2hhcik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBib29sPgorc3RydWN0IF9fZGVzdHJ1Y3RpYmxlX2ltcDsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2Rlc3RydWN0aWJsZV9pbXA8X1RwLCBmYWxzZT4gCisgICA6IHB1YmxpYyBfVlNURDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgCisgICAgICAgIF9faXNfZGVzdHJ1Y3Rvcl93ZWxsZm9ybWVkPHR5cGVuYW1lIF9WU1REOjpyZW1vdmVfYWxsX2V4dGVudHM8X1RwPjo6dHlwZT46OnZhbHVlPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2Rlc3RydWN0aWJsZV9pbXA8X1RwLCB0cnVlPgorICAgIDogcHVibGljIF9WU1REOjp0cnVlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGJvb2w+CitzdHJ1Y3QgX19kZXN0cnVjdGlibGVfZmFsc2U7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19kZXN0cnVjdGlibGVfZmFsc2U8X1RwLCBmYWxzZT4gOiBwdWJsaWMgX19kZXN0cnVjdGlibGVfaW1wPF9UcCwgX1ZTVEQ6OmlzX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19kZXN0cnVjdGlibGVfZmFsc2U8X1RwLCB0cnVlPiA6IHB1YmxpYyBfVlNURDo6ZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBpc19kZXN0cnVjdGlibGUKKyAgICA6IHB1YmxpYyBfX2Rlc3RydWN0aWJsZV9mYWxzZTxfVHAsIF9WU1REOjppc19mdW5jdGlvbjxfVHA+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXNfZGVzdHJ1Y3RpYmxlPF9UcFtdPgorICAgIDogcHVibGljIF9WU1REOjpmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGlzX2Rlc3RydWN0aWJsZTx2b2lkPgorICAgIDogcHVibGljIF9WU1REOjpmYWxzZV90eXBlIHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX2Rlc3RydWN0aWJsZV92CisgICAgPSBpc19kZXN0cnVjdGlibGU8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gbW92ZQorCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgordHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlJiYKK21vdmUoX1RwJiYgX190KSBfTk9FWENFUFQKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSBfVXA7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9VcCYmPihfX3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIKK19UcCYmCitmb3J3YXJkKHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSYgX190KSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwJiY+KF9fdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgorX1RwJiYKK2ZvcndhcmQodHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlJiYgX190KSBfTk9FWENFUFQKK3sKKyAgICBzdGF0aWNfYXNzZXJ0KCFpc19sdmFsdWVfcmVmZXJlbmNlPF9UcD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgImNhbiBub3QgZm9yd2FyZCBhbiBydmFsdWUgYXMgYW4gbHZhbHVlIik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9UcCYmPihfX3QpOworfQorCisjZWxzZSAgLy8gX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfVHAmCittb3ZlKF9UcCYgX190KQoreworICAgIHJldHVybiBfX3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3QgX1RwJgorbW92ZShjb25zdCBfVHAmIF9fdCkKK3sKKyAgICByZXR1cm4gX190OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19UcCYKK2ZvcndhcmQodHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlJiBfX3QpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX3Q7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NsYXNzIF9fcnYKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSBfVHJyOworICAgIF9UcnImIHRfOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHJyKiBvcGVyYXRvci0+KCkge3JldHVybiAmdF87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX3J2KF9UcnImIF9fdCkgOiB0XyhfX3QpIHt9Cit9OworCisjZW5kaWYgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBkZWNheTxfVHA+Ojp0eXBlCitfX2RlY2F5X2NvcHkoX1RwJiYgX190KQoreworICAgIHJldHVybiBfVlNURDo6Zm9yd2FyZDxfVHA+KF9fdCk7Cit9CisKKyNlbHNlCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZGVjYXk8X1RwPjo6dHlwZQorX19kZWNheV9jb3B5KGNvbnN0IF9UcCYgX190KQoreworICAgIHJldHVybiBfVlNURDo6Zm9yd2FyZDxfVHA+KF9fdCk7Cit9CisKKyNlbmRpZgorCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIC4uLl9QYXJhbT4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKF9QYXJhbS4uLiksIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUGFyYW0uLi4pOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzLCBjbGFzcyAuLi5fUGFyYW0+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKShfUGFyYW0uLi4sIC4uLiksIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUGFyYW0uLi4sIC4uLik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIC4uLl9QYXJhbT4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKF9QYXJhbS4uLikgY29uc3QsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIGNvbnN0IF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUGFyYW0uLi4pOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzLCBjbGFzcyAuLi5fUGFyYW0+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKShfUGFyYW0uLi4sIC4uLikgY29uc3QsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIGNvbnN0IF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUGFyYW0uLi4sIC4uLik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIC4uLl9QYXJhbT4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKF9QYXJhbS4uLikgdm9sYXRpbGUsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIHZvbGF0aWxlIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUGFyYW0uLi4pOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzLCBjbGFzcyAuLi5fUGFyYW0+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKShfUGFyYW0uLi4sIC4uLikgdm9sYXRpbGUsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIHZvbGF0aWxlIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUGFyYW0uLi4sIC4uLik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIC4uLl9QYXJhbT4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKF9QYXJhbS4uLikgY29uc3Qgdm9sYXRpbGUsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIGNvbnN0IHZvbGF0aWxlIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUGFyYW0uLi4pOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzLCBjbGFzcyAuLi5fUGFyYW0+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKShfUGFyYW0uLi4sIC4uLikgY29uc3Qgdm9sYXRpbGUsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIGNvbnN0IHZvbGF0aWxlIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUGFyYW0uLi4sIC4uLik7Cit9OworCisjaWYgX19oYXNfZmVhdHVyZShjeHhfcmVmZXJlbmNlX3F1YWxpZmllZF9mdW5jdGlvbnMpIHx8IFwKKyAgICAoZGVmaW5lZChfR05VQ19WRVIpICYmIF9HTlVDX1ZFUiA+PSA0MDkpCisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgLi4uX1BhcmFtPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoX1BhcmFtLi4uKSAmLCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyYgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIF9ScCAoX0ZuVHlwZSkgKF9QYXJhbS4uLik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIC4uLl9QYXJhbT4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKF9QYXJhbS4uLiwgLi4uKSAmLCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyYgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIF9ScCAoX0ZuVHlwZSkgKF9QYXJhbS4uLiwgLi4uKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgLi4uX1BhcmFtPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoX1BhcmFtLi4uKSBjb25zdCYsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIGNvbnN0JiBfQ2xhc3NUeXBlOworICAgIHR5cGVkZWYgX1JwIF9SZXR1cm5UeXBlOworICAgIHR5cGVkZWYgX1JwIChfRm5UeXBlKSAoX1BhcmFtLi4uKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgLi4uX1BhcmFtPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoX1BhcmFtLi4uLCAuLi4pIGNvbnN0JiwgdHJ1ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfQ2xhc3MgY29uc3QmIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUGFyYW0uLi4sIC4uLik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIC4uLl9QYXJhbT4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKF9QYXJhbS4uLikgdm9sYXRpbGUmLCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyB2b2xhdGlsZSYgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIF9ScCAoX0ZuVHlwZSkgKF9QYXJhbS4uLik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIC4uLl9QYXJhbT4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKF9QYXJhbS4uLiwgLi4uKSB2b2xhdGlsZSYsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIHZvbGF0aWxlJiBfQ2xhc3NUeXBlOworICAgIHR5cGVkZWYgX1JwIF9SZXR1cm5UeXBlOworICAgIHR5cGVkZWYgX1JwIChfRm5UeXBlKSAoX1BhcmFtLi4uLCAuLi4pOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzLCBjbGFzcyAuLi5fUGFyYW0+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKShfUGFyYW0uLi4pIGNvbnN0IHZvbGF0aWxlJiwgdHJ1ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfQ2xhc3MgY29uc3Qgdm9sYXRpbGUmIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUGFyYW0uLi4pOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzLCBjbGFzcyAuLi5fUGFyYW0+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKShfUGFyYW0uLi4sIC4uLikgY29uc3Qgdm9sYXRpbGUmLCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyBjb25zdCB2b2xhdGlsZSYgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIF9ScCAoX0ZuVHlwZSkgKF9QYXJhbS4uLiwgLi4uKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgLi4uX1BhcmFtPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoX1BhcmFtLi4uKSAmJiwgdHJ1ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfQ2xhc3MmJiBfQ2xhc3NUeXBlOworICAgIHR5cGVkZWYgX1JwIF9SZXR1cm5UeXBlOworICAgIHR5cGVkZWYgX1JwIChfRm5UeXBlKSAoX1BhcmFtLi4uKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgLi4uX1BhcmFtPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoX1BhcmFtLi4uLCAuLi4pICYmLCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyYmIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUGFyYW0uLi4sIC4uLik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIC4uLl9QYXJhbT4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKF9QYXJhbS4uLikgY29uc3QmJiwgdHJ1ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfQ2xhc3MgY29uc3QmJiBfQ2xhc3NUeXBlOworICAgIHR5cGVkZWYgX1JwIF9SZXR1cm5UeXBlOworICAgIHR5cGVkZWYgX1JwIChfRm5UeXBlKSAoX1BhcmFtLi4uKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgLi4uX1BhcmFtPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoX1BhcmFtLi4uLCAuLi4pIGNvbnN0JiYsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIGNvbnN0JiYgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIF9ScCAoX0ZuVHlwZSkgKF9QYXJhbS4uLiwgLi4uKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgLi4uX1BhcmFtPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoX1BhcmFtLi4uKSB2b2xhdGlsZSYmLCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyB2b2xhdGlsZSYmIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUGFyYW0uLi4pOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzLCBjbGFzcyAuLi5fUGFyYW0+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKShfUGFyYW0uLi4sIC4uLikgdm9sYXRpbGUmJiwgdHJ1ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfQ2xhc3Mgdm9sYXRpbGUmJiBfQ2xhc3NUeXBlOworICAgIHR5cGVkZWYgX1JwIF9SZXR1cm5UeXBlOworICAgIHR5cGVkZWYgX1JwIChfRm5UeXBlKSAoX1BhcmFtLi4uLCAuLi4pOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzLCBjbGFzcyAuLi5fUGFyYW0+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKShfUGFyYW0uLi4pIGNvbnN0IHZvbGF0aWxlJiYsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIGNvbnN0IHZvbGF0aWxlJiYgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIF9ScCAoX0ZuVHlwZSkgKF9QYXJhbS4uLik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIC4uLl9QYXJhbT4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKF9QYXJhbS4uLiwgLi4uKSBjb25zdCB2b2xhdGlsZSYmLCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyBjb25zdCB2b2xhdGlsZSYmIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUGFyYW0uLi4sIC4uLik7Cit9OworCisjZW5kaWYgIC8vIF9faGFzX2ZlYXR1cmUoY3h4X3JlZmVyZW5jZV9xdWFsaWZpZWRfZnVuY3Rpb25zKSB8fCBfR05VQ19WRVIgPj0gNDA5CisKKyNlbHNlICAvLyBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoKSwgdHJ1ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfQ2xhc3MgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIF9ScCAoX0ZuVHlwZSkgKCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3M+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKSguLi4pLCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyBfQ2xhc3NUeXBlOworICAgIHR5cGVkZWYgX1JwIF9SZXR1cm5UeXBlOworICAgIHR5cGVkZWYgX1JwIChfRm5UeXBlKSAoLi4uKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgX1AwPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoX1AwKSwgdHJ1ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfQ2xhc3MgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIF9ScCAoX0ZuVHlwZSkgKF9QMCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIF9QMD4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKF9QMCwgLi4uKSwgdHJ1ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfQ2xhc3MgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIF9ScCAoX0ZuVHlwZSkgKF9QMCwgLi4uKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgX1AwLCBjbGFzcyBfUDE+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKShfUDAsIF9QMSksIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUDAsIF9QMSk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIF9QMCwgY2xhc3MgX1AxPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoX1AwLCBfUDEsIC4uLiksIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUDAsIF9QMSwgLi4uKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgX1AwLCBjbGFzcyBfUDEsIGNsYXNzIF9QMj4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKF9QMCwgX1AxLCBfUDIpLCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyBfQ2xhc3NUeXBlOworICAgIHR5cGVkZWYgX1JwIF9SZXR1cm5UeXBlOworICAgIHR5cGVkZWYgX1JwIChfRm5UeXBlKSAoX1AwLCBfUDEsIF9QMik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIF9QMCwgY2xhc3MgX1AxLCBjbGFzcyBfUDI+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKShfUDAsIF9QMSwgX1AyLCAuLi4pLCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyBfQ2xhc3NUeXBlOworICAgIHR5cGVkZWYgX1JwIF9SZXR1cm5UeXBlOworICAgIHR5cGVkZWYgX1JwIChfRm5UeXBlKSAoX1AwLCBfUDEsIF9QMiwgLi4uKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcz4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKCkgY29uc3QsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIGNvbnN0IF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpICgpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoLi4uKSBjb25zdCwgdHJ1ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfQ2xhc3MgY29uc3QgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIF9ScCAoX0ZuVHlwZSkgKC4uLik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIF9QMD4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKF9QMCkgY29uc3QsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIGNvbnN0IF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUDApOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzLCBjbGFzcyBfUDA+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKShfUDAsIC4uLikgY29uc3QsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIGNvbnN0IF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUDAsIC4uLik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIF9QMCwgY2xhc3MgX1AxPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoX1AwLCBfUDEpIGNvbnN0LCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyBjb25zdCBfQ2xhc3NUeXBlOworICAgIHR5cGVkZWYgX1JwIF9SZXR1cm5UeXBlOworICAgIHR5cGVkZWYgX1JwIChfRm5UeXBlKSAoX1AwLCBfUDEpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzLCBjbGFzcyBfUDAsIGNsYXNzIF9QMT4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKF9QMCwgX1AxLCAuLi4pIGNvbnN0LCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyBjb25zdCBfQ2xhc3NUeXBlOworICAgIHR5cGVkZWYgX1JwIF9SZXR1cm5UeXBlOworICAgIHR5cGVkZWYgX1JwIChfRm5UeXBlKSAoX1AwLCBfUDEsIC4uLik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIF9QMCwgY2xhc3MgX1AxLCBjbGFzcyBfUDI+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKShfUDAsIF9QMSwgX1AyKSBjb25zdCwgdHJ1ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfQ2xhc3MgY29uc3QgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIF9ScCAoX0ZuVHlwZSkgKF9QMCwgX1AxLCBfUDIpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzLCBjbGFzcyBfUDAsIGNsYXNzIF9QMSwgY2xhc3MgX1AyPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoX1AwLCBfUDEsIF9QMiwgLi4uKSBjb25zdCwgdHJ1ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfQ2xhc3MgY29uc3QgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIF9ScCAoX0ZuVHlwZSkgKF9QMCwgX1AxLCBfUDIsIC4uLik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3M+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKSgpIHZvbGF0aWxlLCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyB2b2xhdGlsZSBfQ2xhc3NUeXBlOworICAgIHR5cGVkZWYgX1JwIF9SZXR1cm5UeXBlOworICAgIHR5cGVkZWYgX1JwIChfRm5UeXBlKSAoKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcz4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKC4uLikgdm9sYXRpbGUsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIHZvbGF0aWxlIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpICguLi4pOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzLCBjbGFzcyBfUDA+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKShfUDApIHZvbGF0aWxlLCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyB2b2xhdGlsZSBfQ2xhc3NUeXBlOworICAgIHR5cGVkZWYgX1JwIF9SZXR1cm5UeXBlOworICAgIHR5cGVkZWYgX1JwIChfRm5UeXBlKSAoX1AwKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgX1AwPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoX1AwLCAuLi4pIHZvbGF0aWxlLCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyB2b2xhdGlsZSBfQ2xhc3NUeXBlOworICAgIHR5cGVkZWYgX1JwIF9SZXR1cm5UeXBlOworICAgIHR5cGVkZWYgX1JwIChfRm5UeXBlKSAoX1AwLCAuLi4pOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzLCBjbGFzcyBfUDAsIGNsYXNzIF9QMT4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKF9QMCwgX1AxKSB2b2xhdGlsZSwgdHJ1ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfQ2xhc3Mgdm9sYXRpbGUgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIF9ScCAoX0ZuVHlwZSkgKF9QMCwgX1AxKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgX1AwLCBjbGFzcyBfUDE+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKShfUDAsIF9QMSwgLi4uKSB2b2xhdGlsZSwgdHJ1ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfQ2xhc3Mgdm9sYXRpbGUgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIF9ScCAoX0ZuVHlwZSkgKF9QMCwgX1AxLCAuLi4pOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzLCBjbGFzcyBfUDAsIGNsYXNzIF9QMSwgY2xhc3MgX1AyPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoX1AwLCBfUDEsIF9QMikgdm9sYXRpbGUsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIHZvbGF0aWxlIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUDAsIF9QMSwgX1AyKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgX1AwLCBjbGFzcyBfUDEsIGNsYXNzIF9QMj4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKF9QMCwgX1AxLCBfUDIsIC4uLikgdm9sYXRpbGUsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIHZvbGF0aWxlIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUDAsIF9QMSwgX1AyLCAuLi4pOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoKSBjb25zdCB2b2xhdGlsZSwgdHJ1ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfQ2xhc3MgY29uc3Qgdm9sYXRpbGUgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIF9ScCAoX0ZuVHlwZSkgKCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3M+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKSguLi4pIGNvbnN0IHZvbGF0aWxlLCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyBjb25zdCB2b2xhdGlsZSBfQ2xhc3NUeXBlOworICAgIHR5cGVkZWYgX1JwIF9SZXR1cm5UeXBlOworICAgIHR5cGVkZWYgX1JwIChfRm5UeXBlKSAoLi4uKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgX1AwPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoX1AwKSBjb25zdCB2b2xhdGlsZSwgdHJ1ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfQ2xhc3MgY29uc3Qgdm9sYXRpbGUgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIF9ScCAoX0ZuVHlwZSkgKF9QMCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIF9QMD4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKF9QMCwgLi4uKSBjb25zdCB2b2xhdGlsZSwgdHJ1ZSwgZmFsc2U+Cit7CisgICAgdHlwZWRlZiBfQ2xhc3MgY29uc3Qgdm9sYXRpbGUgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIF9ScCAoX0ZuVHlwZSkgKF9QMCwgLi4uKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgX1AwLCBjbGFzcyBfUDE+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKShfUDAsIF9QMSkgY29uc3Qgdm9sYXRpbGUsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIGNvbnN0IHZvbGF0aWxlIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUDAsIF9QMSk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIF9QMCwgY2xhc3MgX1AxPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzX2ltcDxfUnAgKF9DbGFzczo6KikoX1AwLCBfUDEsIC4uLikgY29uc3Qgdm9sYXRpbGUsIHRydWUsIGZhbHNlPgoreworICAgIHR5cGVkZWYgX0NsYXNzIGNvbnN0IHZvbGF0aWxlIF9DbGFzc1R5cGU7CisgICAgdHlwZWRlZiBfUnAgX1JldHVyblR5cGU7CisgICAgdHlwZWRlZiBfUnAgKF9GblR5cGUpIChfUDAsIF9QMSwgLi4uKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgX1AwLCBjbGFzcyBfUDEsIGNsYXNzIF9QMj4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIChfQ2xhc3M6OiopKF9QMCwgX1AxLCBfUDIpIGNvbnN0IHZvbGF0aWxlLCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyBjb25zdCB2b2xhdGlsZSBfQ2xhc3NUeXBlOworICAgIHR5cGVkZWYgX1JwIF9SZXR1cm5UeXBlOworICAgIHR5cGVkZWYgX1JwIChfRm5UeXBlKSAoX1AwLCBfUDEsIF9QMik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIF9QMCwgY2xhc3MgX1AxLCBjbGFzcyBfUDI+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHNfaW1wPF9ScCAoX0NsYXNzOjoqKShfUDAsIF9QMSwgX1AyLCAuLi4pIGNvbnN0IHZvbGF0aWxlLCB0cnVlLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIF9DbGFzcyBjb25zdCB2b2xhdGlsZSBfQ2xhc3NUeXBlOworICAgIHR5cGVkZWYgX1JwIF9SZXR1cm5UeXBlOworICAgIHR5cGVkZWYgX1JwIChfRm5UeXBlKSAoX1AwLCBfUDEsIF9QMiwgLi4uKTsKK307CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcz4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8X1JwIF9DbGFzczo6KiwgZmFsc2UsIHRydWU+Cit7CisgICAgdHlwZWRlZiBfQ2xhc3MgX0NsYXNzVHlwZTsKKyAgICB0eXBlZGVmIF9ScCBfUmV0dXJuVHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfTVA+CitzdHJ1Y3QgX19tZW1iZXJfcG9pbnRlcl90cmFpdHMKKyAgICA6IHB1YmxpYyBfX21lbWJlcl9wb2ludGVyX3RyYWl0c19pbXA8dHlwZW5hbWUgcmVtb3ZlX2N2PF9NUD46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgIGlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyPF9NUD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICBpc19tZW1iZXJfb2JqZWN0X3BvaW50ZXI8X01QPjo6dmFsdWU+Cit7CisvLyAgICAgdHlwZWRlZiAuLi4gX0NsYXNzVHlwZTsKKy8vICAgICB0eXBlZGVmIC4uLiBfUmV0dXJuVHlwZTsKKy8vICAgICB0eXBlZGVmIC4uLiBfRm5UeXBlOworfTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0RlY2F5ZWRGcD4KK3N0cnVjdCBfX21lbWJlcl9wb2ludGVyX2NsYXNzX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfQ2xhc3NUeXBlPgorc3RydWN0IF9fbWVtYmVyX3BvaW50ZXJfY2xhc3NfdHlwZTxfUmV0IF9DbGFzc1R5cGU6Oio+IHsKKyAgdHlwZWRlZiBfQ2xhc3NUeXBlIHR5cGU7Cit9OworCisvLyByZXN1bHRfb2YKKwordGVtcGxhdGUgPGNsYXNzIF9DYWxsYWJsZT4gY2xhc3MgcmVzdWx0X29mOworCisjaWZkZWYgX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCisKK3RlbXBsYXRlIDxjbGFzcyBfRm4sIGJvb2wsIGJvb2w+CitjbGFzcyBfX3Jlc3VsdF9vZgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Gbj4KK2NsYXNzIF9fcmVzdWx0X29mPF9GbigpLCB0cnVlLCBmYWxzZT4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGRlY2x0eXBlKGRlY2x2YWw8X0ZuPigpKCkpIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZuLCBjbGFzcyBfQTA+CitjbGFzcyBfX3Jlc3VsdF9vZjxfRm4oX0EwKSwgdHJ1ZSwgZmFsc2U+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBkZWNsdHlwZShkZWNsdmFsPF9Gbj4oKShkZWNsdmFsPF9BMD4oKSkpIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZuLCBjbGFzcyBfQTAsIGNsYXNzIF9BMT4KK2NsYXNzIF9fcmVzdWx0X29mPF9GbihfQTAsIF9BMSksIHRydWUsIGZhbHNlPgoreworcHVibGljOgorICAgIHR5cGVkZWYgZGVjbHR5cGUoZGVjbHZhbDxfRm4+KCkoZGVjbHZhbDxfQTA+KCksIGRlY2x2YWw8X0ExPigpKSkgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfRm4sIGNsYXNzIF9BMCwgY2xhc3MgX0ExLCBjbGFzcyBfQTI+CitjbGFzcyBfX3Jlc3VsdF9vZjxfRm4oX0EwLCBfQTEsIF9BMiksIHRydWUsIGZhbHNlPgoreworcHVibGljOgorICAgIHR5cGVkZWYgZGVjbHR5cGUoZGVjbHZhbDxfRm4+KCkoZGVjbHZhbDxfQTA+KCksIGRlY2x2YWw8X0ExPigpLCBkZWNsdmFsPF9BMj4oKSkpIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX01QLCBjbGFzcyBfVHAsIGJvb2wgX0lzTWVtYmVyRnVuY3Rpb25QdHI+CitzdHJ1Y3QgX19yZXN1bHRfb2ZfbXA7CisKKy8vIG1lbWJlciBmdW5jdGlvbiBwb2ludGVyCisKK3RlbXBsYXRlIDxjbGFzcyBfTVAsIGNsYXNzIF9UcD4KK3N0cnVjdCBfX3Jlc3VsdF9vZl9tcDxfTVAsIF9UcCwgdHJ1ZT4KKyAgICA6IHB1YmxpYyBfX2lkZW50aXR5PHR5cGVuYW1lIF9fbWVtYmVyX3BvaW50ZXJfdHJhaXRzPF9NUD46Ol9SZXR1cm5UeXBlPgoreworfTsKKworLy8gbWVtYmVyIGRhdGEgcG9pbnRlcgorCit0ZW1wbGF0ZSA8Y2xhc3MgX01QLCBjbGFzcyBfVHAsIGJvb2w+CitzdHJ1Y3QgX19yZXN1bHRfb2ZfbWRwOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIF9UcD4KK3N0cnVjdCBfX3Jlc3VsdF9vZl9tZHA8X1JwIF9DbGFzczo6KiwgX1RwLCBmYWxzZT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYXBwbHlfY3Y8ZGVjbHR5cGUoKl9WU1REOjpkZWNsdmFsPF9UcD4oKSksIF9ScD46OnR5cGUmIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIF9UcD4KK3N0cnVjdCBfX3Jlc3VsdF9vZl9tZHA8X1JwIF9DbGFzczo6KiwgX1RwLCB0cnVlPgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hcHBseV9jdjxfVHAsIF9ScD46OnR5cGUmIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIF9UcD4KK3N0cnVjdCBfX3Jlc3VsdF9vZl9tcDxfUnAgX0NsYXNzOjoqLCBfVHAsIGZhbHNlPgorICAgIDogcHVibGljIF9fcmVzdWx0X29mX21kcDxfUnAgX0NsYXNzOjoqLCBfVHAsCisgICAgICAgICAgICBpc19iYXNlX29mPF9DbGFzcywgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlPjo6dmFsdWU+Cit7Cit9OworCisKKwordGVtcGxhdGUgPGNsYXNzIF9GbiwgY2xhc3MgX1RwPgorY2xhc3MgX19yZXN1bHRfb2Y8X0ZuKF9UcCksIGZhbHNlLCB0cnVlPiAgLy8gX0ZuIG11c3QgYmUgbWVtYmVyIHBvaW50ZXIKKyAgICA6IHB1YmxpYyBfX3Jlc3VsdF9vZl9tcDx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9Gbj46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyPHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X0ZuPjo6dHlwZT46OnZhbHVlPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9GbiwgY2xhc3MgX1RwLCBjbGFzcyBfQTA+CitjbGFzcyBfX3Jlc3VsdF9vZjxfRm4oX1RwLCBfQTApLCBmYWxzZSwgdHJ1ZT4gIC8vIF9GbiBtdXN0IGJlIG1lbWJlciBwb2ludGVyCisgICAgOiBwdWJsaWMgX19yZXN1bHRfb2ZfbXA8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfRm4+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcjx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9Gbj46OnR5cGU+Ojp2YWx1ZT4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfRm4sIGNsYXNzIF9UcCwgY2xhc3MgX0EwLCBjbGFzcyBfQTE+CitjbGFzcyBfX3Jlc3VsdF9vZjxfRm4oX1RwLCBfQTAsIF9BMSksIGZhbHNlLCB0cnVlPiAgLy8gX0ZuIG11c3QgYmUgbWVtYmVyIHBvaW50ZXIKKyAgICA6IHB1YmxpYyBfX3Jlc3VsdF9vZl9tcDx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9Gbj46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyPHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X0ZuPjo6dHlwZT46OnZhbHVlPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9GbiwgY2xhc3MgX1RwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorY2xhc3MgX19yZXN1bHRfb2Y8X0ZuKF9UcCwgX0EwLCBfQTEsIF9BMiksIGZhbHNlLCB0cnVlPiAgLy8gX0ZuIG11c3QgYmUgbWVtYmVyIHBvaW50ZXIKKyAgICA6IHB1YmxpYyBfX3Jlc3VsdF9vZl9tcDx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9Gbj46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyPHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X0ZuPjo6dHlwZT46OnZhbHVlPgoreworfTsKKworLy8gcmVzdWx0X29mCisKK3RlbXBsYXRlIDxjbGFzcyBfRm4+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyByZXN1bHRfb2Y8X0ZuKCk+CisgICAgOiBwdWJsaWMgX19yZXN1bHRfb2Y8X0ZuKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgaXNfY2xhc3M8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfRm4+Ojp0eXBlPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpc19mdW5jdGlvbjx0eXBlbmFtZSByZW1vdmVfcG9pbnRlcjx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9Gbj46OnR5cGU+Ojp0eXBlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbWVtYmVyX3BvaW50ZXI8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfRm4+Ojp0eXBlPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgID4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfRm4sIGNsYXNzIF9BMD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHJlc3VsdF9vZjxfRm4oX0EwKT4KKyAgICA6IHB1YmxpYyBfX3Jlc3VsdF9vZjxfRm4oX0EwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpc19jbGFzczx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9Gbj46OnR5cGU+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Z1bmN0aW9uPHR5cGVuYW1lIHJlbW92ZV9wb2ludGVyPHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X0ZuPjo6dHlwZT46OnR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpc19tZW1iZXJfcG9pbnRlcjx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9Gbj46OnR5cGU+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9GbiwgY2xhc3MgX0EwLCBjbGFzcyBfQTE+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyByZXN1bHRfb2Y8X0ZuKF9BMCwgX0ExKT4KKyAgICA6IHB1YmxpYyBfX3Jlc3VsdF9vZjxfRm4oX0EwLCBfQTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NsYXNzPHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X0ZuPjo6dHlwZT46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZnVuY3Rpb248dHlwZW5hbWUgcmVtb3ZlX3BvaW50ZXI8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfRm4+Ojp0eXBlPjo6dHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzX21lbWJlcl9wb2ludGVyPHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X0ZuPjo6dHlwZT46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICA+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZuLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgcmVzdWx0X29mPF9GbihfQTAsIF9BMSwgX0EyKT4KKyAgICA6IHB1YmxpYyBfX3Jlc3VsdF9vZjxfRm4oX0EwLCBfQTEsIF9BMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgaXNfY2xhc3M8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfRm4+Ojp0eXBlPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpc19mdW5jdGlvbjx0eXBlbmFtZSByZW1vdmVfcG9pbnRlcjx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9Gbj46OnR5cGU+Ojp0eXBlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbWVtYmVyX3BvaW50ZXI8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfRm4+Ojp0eXBlPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgID4KK3sKK307CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCisKKy8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBBcmdzPiBzdHJ1Y3QgaXNfY29uc3RydWN0aWJsZTsKKworbmFtZXNwYWNlIF9faXNfY29uc3RydWN0Cit7CitzdHJ1Y3QgX19uYXQge307Cit9CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0NYWDAzX0xBTkcpICYmICghX19oYXNfZmVhdHVyZShpc19jb25zdHJ1Y3RpYmxlKSB8fCBcCisgICAgZGVmaW5lZChfTElCQ1BQX1RFU1RJTkdfRkFMTEJBQ0tfSVNfQ09OU1RSVUNUSUJMRSkpCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzLi4uIF9BcmdzPgorc3RydWN0IF9fbGliY3BwX2lzX2NvbnN0cnVjdGlibGU7CisKK3RlbXBsYXRlIDxjbGFzcyBfVG8sIGNsYXNzIF9Gcm9tPgorc3RydWN0IF9faXNfaW52YWxpZF9iYXNlX3RvX2Rlcml2ZWRfY2FzdCB7CisgIHN0YXRpY19hc3NlcnQoaXNfcmVmZXJlbmNlPF9Ubz46OnZhbHVlLCAiV3Jvbmcgc3BlY2lhbGl6YXRpb24iKTsKKyAgdXNpbmcgX1Jhd0Zyb20gPSBfX3VuY3ZyZWZfdDxfRnJvbT47CisgIHVzaW5nIF9SYXdUbyA9IF9fdW5jdnJlZl90PF9Ubz47CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gX19sYXp5X2FuZDwKKyAgICAgICAgX19sYXp5X25vdDxpc19zYW1lPF9SYXdGcm9tLCBfUmF3VG8+PiwKKyAgICAgICAgaXNfYmFzZV9vZjxfUmF3RnJvbSwgX1Jhd1RvPiwKKyAgICAgICAgX19sYXp5X25vdDxfX2xpYmNwcF9pc19jb25zdHJ1Y3RpYmxlPF9SYXdUbywgX0Zyb20+PgorICA+Ojp2YWx1ZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVG8sIGNsYXNzIF9Gcm9tPgorc3RydWN0IF9faXNfaW52YWxpZF9sdmFsdWVfdG9fcnZhbHVlX2Nhc3QgOiBmYWxzZV90eXBlIHsKKyAgc3RhdGljX2Fzc2VydChpc19yZWZlcmVuY2U8X1RvPjo6dmFsdWUsICJXcm9uZyBzcGVjaWFsaXphdGlvbiIpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9Ub1JlZiwgY2xhc3MgX0Zyb21SZWY+CitzdHJ1Y3QgX19pc19pbnZhbGlkX2x2YWx1ZV90b19ydmFsdWVfY2FzdDxfVG9SZWYmJiwgX0Zyb21SZWYmPiB7CisgIHVzaW5nIF9SYXdGcm9tID0gX191bmN2cmVmX3Q8X0Zyb21SZWY+OworICB1c2luZyBfUmF3VG8gPSBfX3VuY3ZyZWZfdDxfVG9SZWY+OworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IF9fbGF6eV9hbmQ8CisgICAgICBfX2xhenlfbm90PGlzX2Z1bmN0aW9uPF9SYXdUbz4+LAorICAgICAgX19sYXp5X29yPAorICAgICAgICBpc19zYW1lPF9SYXdGcm9tLCBfUmF3VG8+LAorICAgICAgICBpc19iYXNlX29mPF9SYXdUbywgX1Jhd0Zyb20+PgorICAgID46OnZhbHVlOworfTsKKworc3RydWN0IF9faXNfY29uc3RydWN0aWJsZV9oZWxwZXIKK3sKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RvPgorICAgIHN0YXRpYyB2b2lkIF9fZWF0KF9Ubyk7CisKKyAgICAvLyBUaGlzIG92ZXJsb2FkIGlzIG5lZWRlZCB0byB3b3JrIGFyb3VuZCBhIENsYW5nIGJ1ZyB0aGF0IGRpc2FsbG93cworICAgIC8vIHN0YXRpY19jYXN0PFQmJj4oZSkgZm9yIG5vbi1yZWZlcmVuY2UtY29tcGF0aWJsZSB0eXBlcy4KKyAgICAvLyBFeGFtcGxlOiBzdGF0aWNfY2FzdDxpbnQmJj4oZGVjbHZhbDxkb3VibGU+KCkpOworICAgIC8vIE5PVEU6IFRoZSBzdGF0aWNfY2FzdCBpbXBsZW1lbnRhdGlvbiBiZWxvdyBpcyByZXF1aXJlZCB0byBzdXBwb3J0CisgICAgLy8gIGNsYXNzZXMgd2l0aCBleHBsaWNpdCBjb252ZXJzaW9uIG9wZXJhdG9ycy4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RvLCBjbGFzcyBfRnJvbSwKKyAgICAgICAgICAgICAgY2xhc3MgPSBkZWNsdHlwZShfX2VhdDxfVG8+KF9WU1REOjpkZWNsdmFsPF9Gcm9tPigpKSk+CisgICAgc3RhdGljIHRydWVfdHlwZSBfX3Rlc3RfY2FzdChpbnQpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UbywgY2xhc3MgX0Zyb20sCisgICAgICAgICAgICAgIGNsYXNzID0gZGVjbHR5cGUoc3RhdGljX2Nhc3Q8X1RvPihfVlNURDo6ZGVjbHZhbDxfRnJvbT4oKSkpPgorICAgIHN0YXRpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAhX19pc19pbnZhbGlkX2Jhc2VfdG9fZGVyaXZlZF9jYXN0PF9UbywgX0Zyb20+Ojp2YWx1ZSAmJgorICAgICAgICAhX19pc19pbnZhbGlkX2x2YWx1ZV90b19ydmFsdWVfY2FzdDxfVG8sIF9Gcm9tPjo6dmFsdWUKKyAgICA+IF9fdGVzdF9jYXN0KGxvbmcpOworCisgICAgdGVtcGxhdGUgPGNsYXNzLCBjbGFzcz4KKyAgICBzdGF0aWMgZmFsc2VfdHlwZSBfX3Rlc3RfY2FzdCguLi4pOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgLi4uX0FyZ3MsCisgICAgICAgIGNsYXNzID0gZGVjbHR5cGUoX1RwKF9WU1REOjpkZWNsdmFsPF9BcmdzPigpLi4uKSk+CisgICAgc3RhdGljIHRydWVfdHlwZSBfX3Rlc3RfbmFyeShpbnQpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzLi4uPgorICAgIHN0YXRpYyBmYWxzZV90eXBlIF9fdGVzdF9uYXJ5KC4uLik7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQTAsIGNsYXNzID0gZGVjbHR5cGUoOjpuZXcgX1RwKF9WU1REOjpkZWNsdmFsPF9BMD4oKSkpPgorICAgIHN0YXRpYyBpc19kZXN0cnVjdGlibGU8X1RwPiBfX3Rlc3RfdW5hcnkoaW50KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzPgorICAgIHN0YXRpYyBmYWxzZV90eXBlIF9fdGVzdF91bmFyeSguLi4pOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgYm9vbCA9IGlzX3ZvaWQ8X1RwPjo6dmFsdWU+CitzdHJ1Y3QgX19pc19kZWZhdWx0X2NvbnN0cnVjdGlibGUKKyAgICA6IGRlY2x0eXBlKF9faXNfY29uc3RydWN0aWJsZV9oZWxwZXI6Ol9fdGVzdF9uYXJ5PF9UcD4oMCkpCit7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2lzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxfVHAsIHRydWU+IDogZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2lzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxfVHBbXSwgZmFsc2U+IDogZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9OeD4KK3N0cnVjdCBfX2lzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxfVHBbX054XSwgZmFsc2U+CisgICAgOiBfX2lzX2RlZmF1bHRfY29uc3RydWN0aWJsZTx0eXBlbmFtZSByZW1vdmVfYWxsX2V4dGVudHM8X1RwPjo6dHlwZT4gIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcy4uLiBfQXJncz4KK3N0cnVjdCBfX2xpYmNwcF9pc19jb25zdHJ1Y3RpYmxlCit7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mLi4uKF9BcmdzKSA+IDEsICJXcm9uZyBzcGVjaWFsaXphdGlvbiIpOworICB0eXBlZGVmIGRlY2x0eXBlKF9faXNfY29uc3RydWN0aWJsZV9oZWxwZXI6Ol9fdGVzdF9uYXJ5PF9UcCwgX0FyZ3MuLi4+KDApKQorICAgICAgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19saWJjcHBfaXNfY29uc3RydWN0aWJsZTxfVHA+IDogX19pc19kZWZhdWx0X2NvbnN0cnVjdGlibGU8X1RwPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0EwPgorc3RydWN0IF9fbGliY3BwX2lzX2NvbnN0cnVjdGlibGU8X1RwLCBfQTA+CisgICAgOiBwdWJsaWMgZGVjbHR5cGUoX19pc19jb25zdHJ1Y3RpYmxlX2hlbHBlcjo6X190ZXN0X3VuYXJ5PF9UcCwgX0EwPigwKSkKK3t9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQTA+CitzdHJ1Y3QgX19saWJjcHBfaXNfY29uc3RydWN0aWJsZTxfVHAmLCBfQTA+CisgICAgOiBwdWJsaWMgZGVjbHR5cGUoX19pc19jb25zdHJ1Y3RpYmxlX2hlbHBlcjo6CisgICAgX190ZXN0X2Nhc3Q8X1RwJiwgX0EwPigwKSkKK3t9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQTA+CitzdHJ1Y3QgX19saWJjcHBfaXNfY29uc3RydWN0aWJsZTxfVHAmJiwgX0EwPgorICAgIDogcHVibGljIGRlY2x0eXBlKF9faXNfY29uc3RydWN0aWJsZV9oZWxwZXI6OgorICAgIF9fdGVzdF9jYXN0PF9UcCYmLCBfQTA+KDApKQore307CisKKyNlbmRpZgorCisjaWYgX19oYXNfZmVhdHVyZShpc19jb25zdHJ1Y3RpYmxlKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgLi4uX0FyZ3M+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfY29uc3RydWN0aWJsZQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfY29uc3RydWN0aWJsZShfVHAsIF9BcmdzLi4uKT4KKyAgICB7fTsKKyNlbGlmICFkZWZpbmVkKF9MSUJDUFBfQ1hYMDNfTEFORykKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzLi4uIF9BcmdzPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX2NvbnN0cnVjdGlibGUKKyAgICA6IHB1YmxpYyBfX2xpYmNwcF9pc19jb25zdHJ1Y3RpYmxlPF9UcCwgX0FyZ3MuLi4+Ojp0eXBlIHt9OworI2Vsc2UKKy8vIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaXNfY29uc3RydWN0aWJsZTA7CisKKy8vICAgICAgbWFpbiBpc19jb25zdHJ1Y3RpYmxlMCB0ZXN0CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitkZWNsdHlwZSgoX1RwKCksIHRydWVfdHlwZSgpKSkKK19faXNfY29uc3RydWN0aWJsZTBfdGVzdChfVHAmKTsKKworZmFsc2VfdHlwZQorX19pc19jb25zdHJ1Y3RpYmxlMF90ZXN0KF9fYW55KTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0EwPgorZGVjbHR5cGUoKF9UcChfVlNURDo6ZGVjbHZhbDxfQTA+KCkpLCB0cnVlX3R5cGUoKSkpCitfX2lzX2NvbnN0cnVjdGlibGUxX3Rlc3QoX1RwJiwgX0EwJik7CisKK3RlbXBsYXRlIDxjbGFzcyBfQTA+CitmYWxzZV90eXBlCitfX2lzX2NvbnN0cnVjdGlibGUxX3Rlc3QoX19hbnksIF9BMCYpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMT4KK2RlY2x0eXBlKChfVHAoX1ZTVEQ6OmRlY2x2YWw8X0EwPigpLCBfVlNURDo6ZGVjbHZhbDxfQTE+KCkpLCB0cnVlX3R5cGUoKSkpCitfX2lzX2NvbnN0cnVjdGlibGUyX3Rlc3QoX1RwJiwgX0EwJiwgX0ExJik7CisKK3RlbXBsYXRlIDxjbGFzcyBfQTAsIGNsYXNzIF9BMT4KK2ZhbHNlX3R5cGUKK19faXNfY29uc3RydWN0aWJsZTJfdGVzdChfX2FueSwgX0EwJiwgX0ExJik7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExLCBjbGFzcyBfQTI+CitkZWNsdHlwZSgoX1RwKF9WU1REOjpkZWNsdmFsPF9BMD4oKSwgX1ZTVEQ6OmRlY2x2YWw8X0ExPigpLCBfVlNURDo6ZGVjbHZhbDxfQTI+KCkpLCB0cnVlX3R5cGUoKSkpCitfX2lzX2NvbnN0cnVjdGlibGUzX3Rlc3QoX1RwJiwgX0EwJiwgX0ExJiwgX0EyJik7CisKK3RlbXBsYXRlIDxjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorZmFsc2VfdHlwZQorX19pc19jb25zdHJ1Y3RpYmxlM190ZXN0KF9fYW55LCBfQTAmLCBfQTEmLCBfQTImKTsKKwordGVtcGxhdGUgPGJvb2wsIGNsYXNzIF9UcD4KK3N0cnVjdCBfX2lzX2NvbnN0cnVjdGlibGUwX2ltcCAvLyBmYWxzZSwgX1RwIGlzIG5vdCBhIHNjYWxhcgorICAgIDogcHVibGljIGNvbW1vbl90eXBlCisgICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgICBkZWNsdHlwZShfX2lzX2NvbnN0cnVjdGlibGUwX3Rlc3QoZGVjbHZhbDxfVHAmPigpKSkKKyAgICAgICAgICAgICA+Ojp0eXBlCisgICAge307CisKK3RlbXBsYXRlIDxib29sLCBjbGFzcyBfVHAsIGNsYXNzIF9BMD4KK3N0cnVjdCBfX2lzX2NvbnN0cnVjdGlibGUxX2ltcCAvLyBmYWxzZSwgX1RwIGlzIG5vdCBhIHNjYWxhcgorICAgIDogcHVibGljIGNvbW1vbl90eXBlCisgICAgICAgICAgICAgPAorICAgICAgICAgICAgICAgICBkZWNsdHlwZShfX2lzX2NvbnN0cnVjdGlibGUxX3Rlc3QoZGVjbHZhbDxfVHAmPigpLCBkZWNsdmFsPF9BMCY+KCkpKQorICAgICAgICAgICAgID46OnR5cGUKKyAgICB7fTsKKwordGVtcGxhdGUgPGJvb2wsIGNsYXNzIF9UcCwgY2xhc3MgX0EwLCBjbGFzcyBfQTE+CitzdHJ1Y3QgX19pc19jb25zdHJ1Y3RpYmxlMl9pbXAgLy8gZmFsc2UsIF9UcCBpcyBub3QgYSBzY2FsYXIKKyAgICA6IHB1YmxpYyBjb21tb25fdHlwZQorICAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICAgZGVjbHR5cGUoX19pc19jb25zdHJ1Y3RpYmxlMl90ZXN0KGRlY2x2YWw8X1RwJj4oKSwgZGVjbHZhbDxfQTA+KCksIGRlY2x2YWw8X0ExPigpKSkKKyAgICAgICAgICAgICA+Ojp0eXBlCisgICAge307CisKK3RlbXBsYXRlIDxib29sLCBjbGFzcyBfVHAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExLCBjbGFzcyBfQTI+CitzdHJ1Y3QgX19pc19jb25zdHJ1Y3RpYmxlM19pbXAgLy8gZmFsc2UsIF9UcCBpcyBub3QgYSBzY2FsYXIKKyAgICA6IHB1YmxpYyBjb21tb25fdHlwZQorICAgICAgICAgICAgIDwKKyAgICAgICAgICAgICAgICAgZGVjbHR5cGUoX19pc19jb25zdHJ1Y3RpYmxlM190ZXN0KGRlY2x2YWw8X1RwJj4oKSwgZGVjbHZhbDxfQTA+KCksIGRlY2x2YWw8X0ExPigpLCBkZWNsdmFsPF9BMj4oKSkpCisgICAgICAgICAgICAgPjo6dHlwZQorICAgIHt9OworCisvLyAgICAgIGhhbmRsZSBzY2FsYXJzIGFuZCByZWZlcmVuY2UgdHlwZXMKKworLy8gICAgICBTY2FsYXJzIGFyZSBkZWZhdWx0IGNvbnN0cnVjdGlibGUsIHJlZmVyZW5jZXMgYXJlIG5vdAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9faXNfY29uc3RydWN0aWJsZTBfaW1wPHRydWUsIF9UcD4KKyAgICA6IHB1YmxpYyBpc19zY2FsYXI8X1RwPgorICAgIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQTA+CitzdHJ1Y3QgX19pc19jb25zdHJ1Y3RpYmxlMV9pbXA8dHJ1ZSwgX1RwLCBfQTA+CisgICAgOiBwdWJsaWMgaXNfY29udmVydGlibGU8X0EwLCBfVHA+CisgICAge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorc3RydWN0IF9faXNfY29uc3RydWN0aWJsZTJfaW1wPHRydWUsIF9UcCwgX0EwLCBfQTE+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZQorICAgIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorc3RydWN0IF9faXNfY29uc3RydWN0aWJsZTNfaW1wPHRydWUsIF9UcCwgX0EwLCBfQTEsIF9BMj4KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlCisgICAge307CisKKy8vICAgICAgVHJlYXQgc2NhbGFycyBhbmQgcmVmZXJlbmNlIHR5cGVzIHNlcGFyYXRlbHkKKwordGVtcGxhdGUgPGJvb2wsIGNsYXNzIF9UcD4KK3N0cnVjdCBfX2lzX2NvbnN0cnVjdGlibGUwX3ZvaWRfY2hlY2sKKyAgICA6IHB1YmxpYyBfX2lzX2NvbnN0cnVjdGlibGUwX2ltcDxpc19zY2FsYXI8X1RwPjo6dmFsdWUgfHwgaXNfcmVmZXJlbmNlPF9UcD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHA+CisgICAge307CisKK3RlbXBsYXRlIDxib29sLCBjbGFzcyBfVHAsIGNsYXNzIF9BMD4KK3N0cnVjdCBfX2lzX2NvbnN0cnVjdGlibGUxX3ZvaWRfY2hlY2sKKyAgICA6IHB1YmxpYyBfX2lzX2NvbnN0cnVjdGlibGUxX2ltcDxpc19zY2FsYXI8X1RwPjo6dmFsdWUgfHwgaXNfcmVmZXJlbmNlPF9UcD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAsIF9BMD4KKyAgICB7fTsKKwordGVtcGxhdGUgPGJvb2wsIGNsYXNzIF9UcCwgY2xhc3MgX0EwLCBjbGFzcyBfQTE+CitzdHJ1Y3QgX19pc19jb25zdHJ1Y3RpYmxlMl92b2lkX2NoZWNrCisgICAgOiBwdWJsaWMgX19pc19jb25zdHJ1Y3RpYmxlMl9pbXA8aXNfc2NhbGFyPF9UcD46OnZhbHVlIHx8IGlzX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwLCBfQTAsIF9BMT4KKyAgICB7fTsKKwordGVtcGxhdGUgPGJvb2wsIGNsYXNzIF9UcCwgY2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KK3N0cnVjdCBfX2lzX2NvbnN0cnVjdGlibGUzX3ZvaWRfY2hlY2sKKyAgICA6IHB1YmxpYyBfX2lzX2NvbnN0cnVjdGlibGUzX2ltcDxpc19zY2FsYXI8X1RwPjo6dmFsdWUgfHwgaXNfcmVmZXJlbmNlPF9UcD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAsIF9BMCwgX0ExLCBfQTI+CisgICAge307CisKKy8vICAgICAgSWYgYW55IG9mIFQgb3IgQXJncyBpcyB2b2lkLCBpc19jb25zdHJ1Y3RpYmxlIHNob3VsZCBiZSBmYWxzZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9faXNfY29uc3RydWN0aWJsZTBfdm9pZF9jaGVjazx0cnVlLCBfVHA+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZQorICAgIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQTA+CitzdHJ1Y3QgX19pc19jb25zdHJ1Y3RpYmxlMV92b2lkX2NoZWNrPHRydWUsIF9UcCwgX0EwPgorICAgIDogcHVibGljIGZhbHNlX3R5cGUKKyAgICB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0EwLCBjbGFzcyBfQTE+CitzdHJ1Y3QgX19pc19jb25zdHJ1Y3RpYmxlMl92b2lkX2NoZWNrPHRydWUsIF9UcCwgX0EwLCBfQTE+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZQorICAgIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorc3RydWN0IF9faXNfY29uc3RydWN0aWJsZTNfdm9pZF9jaGVjazx0cnVlLCBfVHAsIF9BMCwgX0ExLCBfQTI+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZQorICAgIHt9OworCisvLyAgICAgIGlzX2NvbnN0cnVjdGlibGUgZW50cnkgcG9pbnQKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0EwID0gX19pc19jb25zdHJ1Y3Q6Ol9fbmF0LAorICAgICAgICAgICAgICAgICAgICAgY2xhc3MgX0ExID0gX19pc19jb25zdHJ1Y3Q6Ol9fbmF0LAorICAgICAgICAgICAgICAgICAgICAgY2xhc3MgX0EyID0gX19pc19jb25zdHJ1Y3Q6Ol9fbmF0Pgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX2NvbnN0cnVjdGlibGUKKyAgICA6IHB1YmxpYyBfX2lzX2NvbnN0cnVjdGlibGUzX3ZvaWRfY2hlY2s8aXNfdm9pZDxfVHA+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzX2Fic3RyYWN0PF9UcD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNfZnVuY3Rpb248X1RwPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpc192b2lkPF9BMD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNfdm9pZDxfQTE+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzX3ZvaWQ8X0EyPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwLCBfQTAsIF9BMSwgX0EyPgorICAgIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX2NvbnN0cnVjdGlibGU8X1RwLCBfX2lzX2NvbnN0cnVjdDo6X19uYXQsIF9faXNfY29uc3RydWN0OjpfX25hdD4KKyAgICA6IHB1YmxpYyBfX2lzX2NvbnN0cnVjdGlibGUwX3ZvaWRfY2hlY2s8aXNfdm9pZDxfVHA+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzX2Fic3RyYWN0PF9UcD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNfZnVuY3Rpb248X1RwPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwPgorICAgIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQTA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfY29uc3RydWN0aWJsZTxfVHAsIF9BMCwgX19pc19jb25zdHJ1Y3Q6Ol9fbmF0PgorICAgIDogcHVibGljIF9faXNfY29uc3RydWN0aWJsZTFfdm9pZF9jaGVjazxpc192b2lkPF9UcD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNfYWJzdHJhY3Q8X1RwPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpc19mdW5jdGlvbjxfVHA+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzX3ZvaWQ8X0EwPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwLCBfQTA+CisgICAge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX2NvbnN0cnVjdGlibGU8X1RwLCBfQTAsIF9BMSwgX19pc19jb25zdHJ1Y3Q6Ol9fbmF0PgorICAgIDogcHVibGljIF9faXNfY29uc3RydWN0aWJsZTJfdm9pZF9jaGVjazxpc192b2lkPF9UcD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNfYWJzdHJhY3Q8X1RwPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpc19mdW5jdGlvbjxfVHA+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzX3ZvaWQ8X0EwPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpc192b2lkPF9BMT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcCwgX0EwLCBfQTE+CisgICAge307CisKKy8vICAgICAgQXJyYXkgdHlwZXMgYXJlIGRlZmF1bHQgY29uc3RydWN0aWJsZSBpZiB0aGVpciBlbGVtZW50IHR5cGUKKy8vICAgICAgaXMgZGVmYXVsdCBjb25zdHJ1Y3RpYmxlCisKK3RlbXBsYXRlIDxjbGFzcyBfQXAsIHNpemVfdCBfTnA+CitzdHJ1Y3QgX19pc19jb25zdHJ1Y3RpYmxlMF9pbXA8ZmFsc2UsIF9BcFtfTnBdPgorICAgIDogcHVibGljIGlzX2NvbnN0cnVjdGlibGU8dHlwZW5hbWUgcmVtb3ZlX2FsbF9leHRlbnRzPF9BcD46OnR5cGU+CisgICAge307CisKK3RlbXBsYXRlIDxjbGFzcyBfQXAsIHNpemVfdCBfTnAsIGNsYXNzIF9BMD4KK3N0cnVjdCBfX2lzX2NvbnN0cnVjdGlibGUxX2ltcDxmYWxzZSwgX0FwW19OcF0sIF9BMD4KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlCisgICAge307CisKK3RlbXBsYXRlIDxjbGFzcyBfQXAsIHNpemVfdCBfTnAsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorc3RydWN0IF9faXNfY29uc3RydWN0aWJsZTJfaW1wPGZhbHNlLCBfQXBbX05wXSwgX0EwLCBfQTE+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZQorICAgIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FwLCBzaXplX3QgX05wLCBjbGFzcyBfQTAsIGNsYXNzIF9BMSwgY2xhc3MgX0EyPgorc3RydWN0IF9faXNfY29uc3RydWN0aWJsZTNfaW1wPGZhbHNlLCBfQXBbX05wXSwgX0EwLCBfQTEsIF9BMj4KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlCisgICAge307CisKKy8vICAgICAgSW5jb21wbGV0ZSBhcnJheSB0eXBlcyBhcmUgbm90IGNvbnN0cnVjdGlibGUKKwordGVtcGxhdGUgPGNsYXNzIF9BcD4KK3N0cnVjdCBfX2lzX2NvbnN0cnVjdGlibGUwX2ltcDxmYWxzZSwgX0FwW10+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZQorICAgIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FwLCBjbGFzcyBfQTA+CitzdHJ1Y3QgX19pc19jb25zdHJ1Y3RpYmxlMV9pbXA8ZmFsc2UsIF9BcFtdLCBfQTA+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZQorICAgIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FwLCBjbGFzcyBfQTAsIGNsYXNzIF9BMT4KK3N0cnVjdCBfX2lzX2NvbnN0cnVjdGlibGUyX2ltcDxmYWxzZSwgX0FwW10sIF9BMCwgX0ExPgorICAgIDogcHVibGljIGZhbHNlX3R5cGUKKyAgICB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9BcCwgY2xhc3MgX0EwLCBjbGFzcyBfQTEsIGNsYXNzIF9BMj4KK3N0cnVjdCBfX2lzX2NvbnN0cnVjdGlibGUzX2ltcDxmYWxzZSwgX0FwW10sIF9BMCwgX0ExLCBfQTI+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZQorICAgIHt9OworCisjZW5kaWYgLy8gX19oYXNfZmVhdHVyZShpc19jb25zdHJ1Y3RpYmxlKQorCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUykKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIC4uLl9BcmdzPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfY29uc3RydWN0aWJsZV92CisgICAgPSBpc19jb25zdHJ1Y3RpYmxlPF9UcCwgX0FyZ3MuLi4+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBpc19kZWZhdWx0X2NvbnN0cnVjdGlibGUKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19kZWZhdWx0X2NvbnN0cnVjdGlibGUKKyAgICA6IHB1YmxpYyBpc19jb25zdHJ1Y3RpYmxlPF9UcD4KKyAgICB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfdgorICAgID0gaXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9UcD46OnZhbHVlOworI2VuZGlmCisKKy8vIGlzX2NvcHlfY29uc3RydWN0aWJsZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX2NvcHlfY29uc3RydWN0aWJsZQorICAgIDogcHVibGljIGlzX2NvbnN0cnVjdGlibGU8X1RwLCAKKyAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPHR5cGVuYW1lIGFkZF9jb25zdDxfVHA+Ojp0eXBlPjo6dHlwZT4ge307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfY29weV9jb25zdHJ1Y3RpYmxlX3YKKyAgICA9IGlzX2NvcHlfY29uc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBpc19tb3ZlX2NvbnN0cnVjdGlibGUKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19tb3ZlX2NvbnN0cnVjdGlibGUKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICA6IHB1YmxpYyBpc19jb25zdHJ1Y3RpYmxlPF9UcCwgdHlwZW5hbWUgYWRkX3J2YWx1ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZT4KKyNlbHNlCisgICAgOiBwdWJsaWMgaXNfY29weV9jb25zdHJ1Y3RpYmxlPF9UcD4KKyNlbmRpZgorICAgIHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX21vdmVfY29uc3RydWN0aWJsZV92CisgICAgPSBpc19tb3ZlX2NvbnN0cnVjdGlibGU8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKKworI2lmIF9faGFzX2ZlYXR1cmUoaXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUpIHx8IF9HTlVDX1ZFUiA+PSA1MDEKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MuLi4gX0FyZ3M+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUoX1RwLCBfQXJncy4uLik+Cit7Cit9OworCisjZWxzZSAgLy8gIV9faGFzX2ZlYXR1cmUoaXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUpCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzLi4uIF9BcmdzPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlCisgICAgOiBmYWxzZV90eXBlCit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlPF9UcD4KKyNpZiBfX2hhc19mZWF0dXJlKGhhc190cml2aWFsX2NvbnN0cnVjdG9yKSB8fCAoX0dOVUNfVkVSID49IDQwMykKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faGFzX3RyaXZpYWxfY29uc3RydWN0b3IoX1RwKT4KKyNlbHNlCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19zY2FsYXI8X1RwPjo6dmFsdWU+CisjZW5kaWYKK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGU8X1RwLCBfVHAmJj4KKyNlbHNlCitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGU8X1RwLCBfVHA+CisjZW5kaWYKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3NjYWxhcjxfVHA+Ojp2YWx1ZT4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGU8X1RwLCBjb25zdCBfVHAmPgorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfc2NhbGFyPF9UcD46OnZhbHVlPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc190cml2aWFsbHlfY29uc3RydWN0aWJsZTxfVHAsIF9UcCY+CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19zY2FsYXI8X1RwPjo6dmFsdWU+Cit7Cit9OworCisjZW5kaWYgIC8vICFfX2hhc19mZWF0dXJlKGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlKQorCisjZWxzZSAgLy8gX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BMCA9IF9faXNfY29uc3RydWN0OjpfX25hdCwKKyAgICAgICAgICAgICAgICAgICAgIGNsYXNzIF9BMSA9IF9faXNfY29uc3RydWN0OjpfX25hdD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc190cml2aWFsbHlfY29uc3RydWN0aWJsZQorICAgIDogZmFsc2VfdHlwZQoreworfTsKKworI2lmIF9faGFzX2ZlYXR1cmUoaXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUpIHx8IF9HTlVDX1ZFUiA+PSA1MDEKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc190cml2aWFsbHlfY29uc3RydWN0aWJsZTxfVHAsIF9faXNfY29uc3RydWN0OjpfX25hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2lzX2NvbnN0cnVjdDo6X19uYXQ+CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlKF9UcCk+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlPF9UcCwgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXNfY29uc3RydWN0OjpfX25hdD4KKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUoX1RwLCBfVHApPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc190cml2aWFsbHlfY29uc3RydWN0aWJsZTxfVHAsIGNvbnN0IF9UcCYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pc19jb25zdHJ1Y3Q6Ol9fbmF0PgorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc190cml2aWFsbHlfY29uc3RydWN0aWJsZShfVHAsIGNvbnN0IF9UcCYpPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc190cml2aWFsbHlfY29uc3RydWN0aWJsZTxfVHAsIF9UcCYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pc19jb25zdHJ1Y3Q6Ol9fbmF0PgorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc190cml2aWFsbHlfY29uc3RydWN0aWJsZShfVHAsIF9UcCYpPgoreworfTsKKworI2Vsc2UgIC8vICFfX2hhc19mZWF0dXJlKGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlPF9UcCwgX19pc19jb25zdHJ1Y3Q6Ol9fbmF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXNfY29uc3RydWN0OjpfX25hdD4KKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3NjYWxhcjxfVHA+Ojp2YWx1ZT4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGU8X1RwLCBfVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pc19jb25zdHJ1Y3Q6Ol9fbmF0PgorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfc2NhbGFyPF9UcD46OnZhbHVlPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc190cml2aWFsbHlfY29uc3RydWN0aWJsZTxfVHAsIGNvbnN0IF9UcCYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pc19jb25zdHJ1Y3Q6Ol9fbmF0PgorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfc2NhbGFyPF9UcD46OnZhbHVlPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc190cml2aWFsbHlfY29uc3RydWN0aWJsZTxfVHAsIF9UcCYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pc19jb25zdHJ1Y3Q6Ol9fbmF0PgorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfc2NhbGFyPF9UcD46OnZhbHVlPgoreworfTsKKworI2VuZGlmICAvLyAhX19oYXNfZmVhdHVyZShpc190cml2aWFsbHlfY29uc3RydWN0aWJsZSkKKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MuLi4gX0FyZ3M+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc190cml2aWFsbHlfY29uc3RydWN0aWJsZV92CisgICAgPSBpc190cml2aWFsbHlfY29uc3RydWN0aWJsZTxfVHAsIF9BcmdzLi4uPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfdHJpdmlhbGx5X2RlZmF1bHRfY29uc3RydWN0aWJsZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfdHJpdmlhbGx5X2RlZmF1bHRfY29uc3RydWN0aWJsZQorICAgIDogcHVibGljIGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlPF9UcD4KKyAgICB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc190cml2aWFsbHlfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX3YKKyAgICA9IGlzX3RyaXZpYWxseV9kZWZhdWx0X2NvbnN0cnVjdGlibGU8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfdHJpdmlhbGx5X2NvcHlfY29uc3RydWN0aWJsZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfdHJpdmlhbGx5X2NvcHlfY29uc3RydWN0aWJsZQorICAgIDogcHVibGljIGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlPF9UcCwgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8Y29uc3QgX1RwPjo6dHlwZT4KKyAgICB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc190cml2aWFsbHlfY29weV9jb25zdHJ1Y3RpYmxlX3YKKyAgICA9IGlzX3RyaXZpYWxseV9jb3B5X2NvbnN0cnVjdGlibGU8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfdHJpdmlhbGx5X21vdmVfY29uc3RydWN0aWJsZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfdHJpdmlhbGx5X21vdmVfY29uc3RydWN0aWJsZQorI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgIDogcHVibGljIGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlPF9UcCwgdHlwZW5hbWUgYWRkX3J2YWx1ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZT4KKyNlbHNlCisgICAgOiBwdWJsaWMgaXNfdHJpdmlhbGx5X2NvcHlfY29uc3RydWN0aWJsZTxfVHA+CisjZW5kaWYKKyAgICB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc190cml2aWFsbHlfbW92ZV9jb25zdHJ1Y3RpYmxlX3YKKyAgICA9IGlzX3RyaXZpYWxseV9tb3ZlX2NvbnN0cnVjdGlibGU8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfdHJpdmlhbGx5X2Fzc2lnbmFibGUKKworI2lmIF9faGFzX2ZlYXR1cmUoaXNfdHJpdmlhbGx5X2Fzc2lnbmFibGUpIHx8IF9HTlVDX1ZFUiA+PSA1MDEKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK3N0cnVjdCBpc190cml2aWFsbHlfYXNzaWduYWJsZQorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc190cml2aWFsbHlfYXNzaWduYWJsZShfVHAsIF9BcmcpPgoreworfTsKKworI2Vsc2UgIC8vICFfX2hhc19mZWF0dXJlKGlzX3RyaXZpYWxseV9hc3NpZ25hYmxlKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorc3RydWN0IGlzX3RyaXZpYWxseV9hc3NpZ25hYmxlCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBpc190cml2aWFsbHlfYXNzaWduYWJsZTxfVHAmLCBfVHA+CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19zY2FsYXI8X1RwPjo6dmFsdWU+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGlzX3RyaXZpYWxseV9hc3NpZ25hYmxlPF9UcCYsIF9UcCY+CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19zY2FsYXI8X1RwPjo6dmFsdWU+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IGlzX3RyaXZpYWxseV9hc3NpZ25hYmxlPF9UcCYsIGNvbnN0IF9UcCY+CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19zY2FsYXI8X1RwPjo6dmFsdWU+IHt9OworCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXNfdHJpdmlhbGx5X2Fzc2lnbmFibGU8X1RwJiwgX1RwJiY+CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19zY2FsYXI8X1RwPjo6dmFsdWU+IHt9OworCisjZW5kaWYgIC8vIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKKyNlbmRpZiAgLy8gIV9faGFzX2ZlYXR1cmUoaXNfdHJpdmlhbGx5X2Fzc2lnbmFibGUpCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfdHJpdmlhbGx5X2Fzc2lnbmFibGVfdgorICAgID0gaXNfdHJpdmlhbGx5X2Fzc2lnbmFibGU8X1RwLCBfQXJnPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfdHJpdmlhbGx5X2NvcHlfYXNzaWduYWJsZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfdHJpdmlhbGx5X2NvcHlfYXNzaWduYWJsZQorICAgIDogcHVibGljIGlzX3RyaXZpYWxseV9hc3NpZ25hYmxlPHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9UcD46OnR5cGUsCisgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTx0eXBlbmFtZSBhZGRfY29uc3Q8X1RwPjo6dHlwZT46OnR5cGU+IHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX3RyaXZpYWxseV9jb3B5X2Fzc2lnbmFibGVfdgorICAgID0gaXNfdHJpdmlhbGx5X2NvcHlfYXNzaWduYWJsZTxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBpc190cml2aWFsbHlfbW92ZV9hc3NpZ25hYmxlCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc190cml2aWFsbHlfbW92ZV9hc3NpZ25hYmxlCisgICAgOiBwdWJsaWMgaXNfdHJpdmlhbGx5X2Fzc2lnbmFibGU8dHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSwKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBhZGRfcnZhbHVlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlPgorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlPgorI2VuZGlmCisgICAge307CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfdHJpdmlhbGx5X21vdmVfYXNzaWduYWJsZV92CisgICAgPSBpc190cml2aWFsbHlfbW92ZV9hc3NpZ25hYmxlPF9UcD46OnZhbHVlOworI2VuZGlmCisKKy8vIGlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGUKKworI2lmIF9faGFzX2ZlYXR1cmUoaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcikgfHwgKF9HTlVDX1ZFUiA+PSA0MDMpCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc190cml2aWFsbHlfZGVzdHJ1Y3RpYmxlCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfZGVzdHJ1Y3RpYmxlPF9UcD46OnZhbHVlICYmIF9faGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcihfVHApPiB7fTsKKworI2Vsc2UKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9fbGliY3BwX3RyaXZpYWxfZGVzdHJ1Y3RvcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3NjYWxhcjxfVHA+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc190cml2aWFsbHlfZGVzdHJ1Y3RpYmxlCisgICAgOiBwdWJsaWMgX19saWJjcHBfdHJpdmlhbF9kZXN0cnVjdG9yPHR5cGVuYW1lIHJlbW92ZV9hbGxfZXh0ZW50czxfVHA+Ojp0eXBlPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGU8X1RwW10+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKKworI2VuZGlmCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfdHJpdmlhbGx5X2Rlc3RydWN0aWJsZV92CisgICAgPSBpc190cml2aWFsbHlfZGVzdHJ1Y3RpYmxlPF9UcD46OnZhbHVlOworI2VuZGlmCisKKy8vIGlzX25vdGhyb3dfY29uc3RydWN0aWJsZQorCisjaWYgMAordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MuLi4gX0FyZ3M+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19ub3Rocm93X2NvbnN0cnVjdGlibGUoX1RwKF9BcmdzLi4uKSk+Cit7Cit9OworCisjZWxzZQorCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUworCisjaWYgX19oYXNfZmVhdHVyZShjeHhfbm9leGNlcHQpIHx8IChfR05VQ19WRVIgPj0gNDA3ICYmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wpCisKK3RlbXBsYXRlIDxib29sLCBib29sLCBjbGFzcyBfVHAsIGNsYXNzLi4uIF9BcmdzPiBzdHJ1Y3QgX19saWJjcHBfaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcy4uLiBfQXJncz4KK3N0cnVjdCBfX2xpYmNwcF9pc19ub3Rocm93X2NvbnN0cnVjdGlibGU8LyppcyBjb25zdHJ1Y3RpYmxlKi90cnVlLCAvKmlzIHJlZmVyZW5jZSovZmFsc2UsIF9UcCwgX0FyZ3MuLi4+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgbm9leGNlcHQoX1RwKGRlY2x2YWw8X0FyZ3M+KCkuLi4pKT4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit2b2lkIF9faW1wbGljaXRfY29udmVyc2lvbl90byhfVHApIG5vZXhjZXB0IHsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorc3RydWN0IF9fbGliY3BwX2lzX25vdGhyb3dfY29uc3RydWN0aWJsZTwvKmlzIGNvbnN0cnVjdGlibGUqL3RydWUsIC8qaXMgcmVmZXJlbmNlKi90cnVlLCBfVHAsIF9Bcmc+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgbm9leGNlcHQoX19pbXBsaWNpdF9jb252ZXJzaW9uX3RvPF9UcD4oZGVjbHZhbDxfQXJnPigpKSk+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBib29sIF9Jc1JlZmVyZW5jZSwgY2xhc3MuLi4gX0FyZ3M+CitzdHJ1Y3QgX19saWJjcHBfaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlPC8qaXMgY29uc3RydWN0aWJsZSovZmFsc2UsIF9Jc1JlZmVyZW5jZSwgX1RwLCBfQXJncy4uLj4KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlCit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcy4uLiBfQXJncz4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19ub3Rocm93X2NvbnN0cnVjdGlibGUKKyAgICA6IF9fbGliY3BwX2lzX25vdGhyb3dfY29uc3RydWN0aWJsZTxpc19jb25zdHJ1Y3RpYmxlPF9UcCwgX0FyZ3MuLi4+Ojp2YWx1ZSwgaXNfcmVmZXJlbmNlPF9UcD46OnZhbHVlLCBfVHAsIF9BcmdzLi4uPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9Ocz4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19ub3Rocm93X2NvbnN0cnVjdGlibGU8X1RwW19Oc10+CisgICAgOiBfX2xpYmNwcF9pc19ub3Rocm93X2NvbnN0cnVjdGlibGU8aXNfY29uc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZSwgaXNfcmVmZXJlbmNlPF9UcD46OnZhbHVlLCBfVHA+Cit7Cit9OworCisjZWxzZSAgLy8gX19oYXNfZmVhdHVyZShjeHhfbm9leGNlcHQpCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzLi4uIF9BcmdzPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX25vdGhyb3dfY29uc3RydWN0aWJsZQorICAgIDogZmFsc2VfdHlwZQoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19ub3Rocm93X2NvbnN0cnVjdGlibGU8X1RwPgorI2lmIF9faGFzX2ZlYXR1cmUoaGFzX25vdGhyb3dfY29uc3RydWN0b3IpIHx8IChfR05VQ19WRVIgPj0gNDAzKQorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19oYXNfbm90aHJvd19jb25zdHJ1Y3RvcihfVHApPgorI2Vsc2UKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3NjYWxhcjxfVHA+Ojp2YWx1ZT4KKyNlbmRpZgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19ub3Rocm93X2NvbnN0cnVjdGlibGU8X1RwLCBfVHAmJj4KKyNlbHNlCitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlPF9UcCwgX1RwPgorI2VuZGlmCisjaWYgX19oYXNfZmVhdHVyZShoYXNfbm90aHJvd19jb3B5KSB8fCAoX0dOVUNfVkVSID49IDQwMykKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faGFzX25vdGhyb3dfY29weShfVHApPgorI2Vsc2UKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3NjYWxhcjxfVHA+Ojp2YWx1ZT4KKyNlbmRpZgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19ub3Rocm93X2NvbnN0cnVjdGlibGU8X1RwLCBjb25zdCBfVHAmPgorI2lmIF9faGFzX2ZlYXR1cmUoaGFzX25vdGhyb3dfY29weSkgfHwgKF9HTlVDX1ZFUiA+PSA0MDMpCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2hhc19ub3Rocm93X2NvcHkoX1RwKT4KKyNlbHNlCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19zY2FsYXI8X1RwPjo6dmFsdWU+CisjZW5kaWYKK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlPF9UcCwgX1RwJj4KKyNpZiBfX2hhc19mZWF0dXJlKGhhc19ub3Rocm93X2NvcHkpIHx8IChfR05VQ19WRVIgPj0gNDAzKQorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19oYXNfbm90aHJvd19jb3B5KF9UcCk+CisjZWxzZQorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfc2NhbGFyPF9UcD46OnZhbHVlPgorI2VuZGlmCit7Cit9OworCisjZW5kaWYgIC8vIF9faGFzX2ZlYXR1cmUoY3h4X25vZXhjZXB0KQorCisjZWxzZSAgLy8gX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BMCA9IF9faXNfY29uc3RydWN0OjpfX25hdCwKKyAgICAgICAgICAgICAgICAgICAgIGNsYXNzIF9BMSA9IF9faXNfY29uc3RydWN0OjpfX25hdD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19ub3Rocm93X2NvbnN0cnVjdGlibGUKKyAgICA6IGZhbHNlX3R5cGUKK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlPF9UcCwgX19pc19jb25zdHJ1Y3Q6Ol9fbmF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXNfY29uc3RydWN0OjpfX25hdD4KKyNpZiBfX2hhc19mZWF0dXJlKGhhc19ub3Rocm93X2NvbnN0cnVjdG9yKSB8fCAoX0dOVUNfVkVSID49IDQwMykKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faGFzX25vdGhyb3dfY29uc3RydWN0b3IoX1RwKT4KKyNlbHNlCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19zY2FsYXI8X1RwPjo6dmFsdWU+CisjZW5kaWYKK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlPF9UcCwgX1RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXNfY29uc3RydWN0OjpfX25hdD4KKyNpZiBfX2hhc19mZWF0dXJlKGhhc19ub3Rocm93X2NvcHkpIHx8IChfR05VQ19WRVIgPj0gNDAzKQorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19oYXNfbm90aHJvd19jb3B5KF9UcCk+CisjZWxzZQorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfc2NhbGFyPF9UcD46OnZhbHVlPgorI2VuZGlmCit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX25vdGhyb3dfY29uc3RydWN0aWJsZTxfVHAsIGNvbnN0IF9UcCYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pc19jb25zdHJ1Y3Q6Ol9fbmF0PgorI2lmIF9faGFzX2ZlYXR1cmUoaGFzX25vdGhyb3dfY29weSkgfHwgKF9HTlVDX1ZFUiA+PSA0MDMpCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2hhc19ub3Rocm93X2NvcHkoX1RwKT4KKyNlbHNlCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19zY2FsYXI8X1RwPjo6dmFsdWU+CisjZW5kaWYKK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlPF9UcCwgX1RwJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2lzX2NvbnN0cnVjdDo6X19uYXQ+CisjaWYgX19oYXNfZmVhdHVyZShoYXNfbm90aHJvd19jb3B5KSB8fCAoX0dOVUNfVkVSID49IDQwMykKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faGFzX25vdGhyb3dfY29weShfVHApPgorI2Vsc2UKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3NjYWxhcjxfVHA+Ojp2YWx1ZT4KKyNlbmRpZgoreworfTsKKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19WQVJJQURJQ1MKKyNlbmRpZiAgLy8gX19oYXNfZmVhdHVyZShpc19ub3Rocm93X2NvbnN0cnVjdGlibGUpCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUykKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIC4uLl9BcmdzPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlX3YKKyAgICA9IGlzX25vdGhyb3dfY29uc3RydWN0aWJsZTxfVHAsIF9BcmdzLi4uPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGUKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlCisgICAgOiBwdWJsaWMgaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlPF9UcD4KKyAgICB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZV92CisgICAgPSBpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBpc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGUKKyAgICA6IHB1YmxpYyBpc19ub3Rocm93X2NvbnN0cnVjdGlibGU8X1RwLAorICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8dHlwZW5hbWUgYWRkX2NvbnN0PF9UcD46OnR5cGU+Ojp0eXBlPiB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZV92CisgICAgPSBpc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGUKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fUlZBTFVFX1JFRkVSRU5DRVMKKyAgICA6IHB1YmxpYyBpc19ub3Rocm93X2NvbnN0cnVjdGlibGU8X1RwLCB0eXBlbmFtZSBhZGRfcnZhbHVlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlPgorI2Vsc2UKKyAgICA6IHB1YmxpYyBpc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZTxfVHA+CisjZW5kaWYKKyAgICB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZV92CisgICAgPSBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBpc19ub3Rocm93X2Fzc2lnbmFibGUKKworI2lmIF9faGFzX2ZlYXR1cmUoY3h4X25vZXhjZXB0KSB8fCAoX0dOVUNfVkVSID49IDQwNyAmJiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMKQorCit0ZW1wbGF0ZSA8Ym9vbCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPiBzdHJ1Y3QgX19saWJjcHBfaXNfbm90aHJvd19hc3NpZ25hYmxlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorc3RydWN0IF9fbGliY3BwX2lzX25vdGhyb3dfYXNzaWduYWJsZTxmYWxzZSwgX1RwLCBfQXJnPgorICAgIDogcHVibGljIGZhbHNlX3R5cGUKK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitzdHJ1Y3QgX19saWJjcHBfaXNfbm90aHJvd19hc3NpZ25hYmxlPHRydWUsIF9UcCwgX0FyZz4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBub2V4Y2VwdChfVlNURDo6ZGVjbHZhbDxfVHA+KCkgPSBfVlNURDo6ZGVjbHZhbDxfQXJnPigpKSA+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX25vdGhyb3dfYXNzaWduYWJsZQorICAgIDogcHVibGljIF9fbGliY3BwX2lzX25vdGhyb3dfYXNzaWduYWJsZTxpc19hc3NpZ25hYmxlPF9UcCwgX0FyZz46OnZhbHVlLCBfVHAsIF9Bcmc+Cit7Cit9OworCisjZWxzZSAgLy8gX19oYXNfZmVhdHVyZShjeHhfbm9leGNlcHQpCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfbm90aHJvd19hc3NpZ25hYmxlCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19ub3Rocm93X2Fzc2lnbmFibGU8X1RwJiwgX1RwPgorI2lmIF9faGFzX2ZlYXR1cmUoaGFzX25vdGhyb3dfYXNzaWduKSB8fCAoX0dOVUNfVkVSID49IDQwMykKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faGFzX25vdGhyb3dfYXNzaWduKF9UcCk+IHt9OworI2Vsc2UKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3NjYWxhcjxfVHA+Ojp2YWx1ZT4ge307CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19ub3Rocm93X2Fzc2lnbmFibGU8X1RwJiwgX1RwJj4KKyNpZiBfX2hhc19mZWF0dXJlKGhhc19ub3Rocm93X2Fzc2lnbikgfHwgKF9HTlVDX1ZFUiA+PSA0MDMpCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2hhc19ub3Rocm93X2Fzc2lnbihfVHApPiB7fTsKKyNlbHNlCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19zY2FsYXI8X1RwPjo6dmFsdWU+IHt9OworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfbm90aHJvd19hc3NpZ25hYmxlPF9UcCYsIGNvbnN0IF9UcCY+CisjaWYgX19oYXNfZmVhdHVyZShoYXNfbm90aHJvd19hc3NpZ24pIHx8IChfR05VQ19WRVIgPj0gNDAzKQorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19oYXNfbm90aHJvd19hc3NpZ24oX1RwKT4ge307CisjZWxzZQorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfc2NhbGFyPF9UcD46OnZhbHVlPiB7fTsKKyNlbmRpZgorCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1JWQUxVRV9SRUZFUkVOQ0VTCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgaXNfbm90aHJvd19hc3NpZ25hYmxlPF9UcCYsIF9UcCYmPgorI2lmIF9faGFzX2ZlYXR1cmUoaGFzX25vdGhyb3dfYXNzaWduKSB8fCAoX0dOVUNfVkVSID49IDQwMykKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faGFzX25vdGhyb3dfYXNzaWduKF9UcCk+IHt9OworI2Vsc2UKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3NjYWxhcjxfVHA+Ojp2YWx1ZT4ge307CisjZW5kaWYKKworI2VuZGlmICAvLyBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworCisjZW5kaWYgIC8vIF9faGFzX2ZlYXR1cmUoY3h4X25vZXhjZXB0KQorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX25vdGhyb3dfYXNzaWduYWJsZV92CisgICAgPSBpc19ub3Rocm93X2Fzc2lnbmFibGU8X1RwLCBfQXJnPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfbm90aHJvd19jb3B5X2Fzc2lnbmFibGUKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX25vdGhyb3dfY29weV9hc3NpZ25hYmxlCisgICAgOiBwdWJsaWMgaXNfbm90aHJvd19hc3NpZ25hYmxlPHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9UcD46OnR5cGUsCisgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTx0eXBlbmFtZSBhZGRfY29uc3Q8X1RwPjo6dHlwZT46OnR5cGU+IHt9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX25vdGhyb3dfY29weV9hc3NpZ25hYmxlX3YKKyAgICA9IGlzX25vdGhyb3dfY29weV9hc3NpZ25hYmxlPF9UcD46OnZhbHVlOworI2VuZGlmCisKKy8vIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZQorICAgIDogcHVibGljIGlzX25vdGhyb3dfYXNzaWduYWJsZTx0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlLAorI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGFkZF9ydmFsdWVfcmVmZXJlbmNlPF9UcD46OnR5cGU+CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9UcD46OnR5cGU+CisjZW5kaWYKKyAgICB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZV92CisgICAgPSBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBpc19ub3Rocm93X2Rlc3RydWN0aWJsZQorCisjaWYgX19oYXNfZmVhdHVyZShjeHhfbm9leGNlcHQpIHx8IChfR05VQ19WRVIgPj0gNDA3ICYmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wpCisKK3RlbXBsYXRlIDxib29sLCBjbGFzcyBfVHA+IHN0cnVjdCBfX2xpYmNwcF9pc19ub3Rocm93X2Rlc3RydWN0aWJsZTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2xpYmNwcF9pc19ub3Rocm93X2Rlc3RydWN0aWJsZTxmYWxzZSwgX1RwPgorICAgIDogcHVibGljIGZhbHNlX3R5cGUKK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19saWJjcHBfaXNfbm90aHJvd19kZXN0cnVjdGlibGU8dHJ1ZSwgX1RwPgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIG5vZXhjZXB0KF9WU1REOjpkZWNsdmFsPF9UcD4oKS5+X1RwKCkpID4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfbm90aHJvd19kZXN0cnVjdGlibGUKKyAgICA6IHB1YmxpYyBfX2xpYmNwcF9pc19ub3Rocm93X2Rlc3RydWN0aWJsZTxpc19kZXN0cnVjdGlibGU8X1RwPjo6dmFsdWUsIF9UcD4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfTnM+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfbm90aHJvd19kZXN0cnVjdGlibGU8X1RwW19Oc10+CisgICAgOiBwdWJsaWMgaXNfbm90aHJvd19kZXN0cnVjdGlibGU8X1RwPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19ub3Rocm93X2Rlc3RydWN0aWJsZTxfVHAmPgorICAgIDogcHVibGljIHRydWVfdHlwZQoreworfTsKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19SVkFMVUVfUkVGRVJFTkNFUworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX25vdGhyb3dfZGVzdHJ1Y3RpYmxlPF9UcCYmPgorICAgIDogcHVibGljIHRydWVfdHlwZQoreworfTsKKworI2VuZGlmCisKKyNlbHNlCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfX2xpYmNwcF9ub3Rocm93X2Rlc3RydWN0b3IKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19zY2FsYXI8X1RwPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWZlcmVuY2U8X1RwPjo6dmFsdWU+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfbm90aHJvd19kZXN0cnVjdGlibGUKKyAgICA6IHB1YmxpYyBfX2xpYmNwcF9ub3Rocm93X2Rlc3RydWN0b3I8dHlwZW5hbWUgcmVtb3ZlX2FsbF9leHRlbnRzPF9UcD46OnR5cGU+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX25vdGhyb3dfZGVzdHJ1Y3RpYmxlPF9UcFtdPgorICAgIDogcHVibGljIGZhbHNlX3R5cGUge307CisKKyNlbmRpZgorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX25vdGhyb3dfZGVzdHJ1Y3RpYmxlX3YKKyAgICA9IGlzX25vdGhyb3dfZGVzdHJ1Y3RpYmxlPF9UcD46OnZhbHVlOworI2VuZGlmCisKKy8vIGlzX3BvZAorCisjaWYgX19oYXNfZmVhdHVyZShpc19wb2QpIHx8IChfR05VQ19WRVIgPj0gNDAzKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfcG9kCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19wb2QoX1RwKT4ge307CisKKyNlbHNlCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19wb2QKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc190cml2aWFsbHlfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9UcD46OnZhbHVlICAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc190cml2aWFsbHlfY29weV9jb25zdHJ1Y3RpYmxlPF9UcD46OnZhbHVlICAgICAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc190cml2aWFsbHlfY29weV9hc3NpZ25hYmxlPF9UcD46OnZhbHVlICAgICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfdHJpdmlhbGx5X2Rlc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZT4ge307CisKKyNlbmRpZgorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX3BvZF92CisgICAgPSBpc19wb2Q8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfbGl0ZXJhbF90eXBlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfbGl0ZXJhbF90eXBlCisjaWZkZWYgX0xJQkNQUF9JU19MSVRFUkFMCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX0xJQkNQUF9JU19MSVRFUkFMKF9UcCk+CisjZWxzZQorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfc2NhbGFyPHR5cGVuYW1lIHJlbW92ZV9hbGxfZXh0ZW50czxfVHA+Ojp0eXBlPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JlZmVyZW5jZTx0eXBlbmFtZSByZW1vdmVfYWxsX2V4dGVudHM8X1RwPjo6dHlwZT46OnZhbHVlPgorI2VuZGlmCisgICAge307CisgICAgCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX2xpdGVyYWxfdHlwZV92CisgICAgPSBpc19saXRlcmFsX3R5cGU8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfc3RhbmRhcmRfbGF5b3V0OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaXNfc3RhbmRhcmRfbGF5b3V0CisjaWYgX19oYXNfZmVhdHVyZShpc19zdGFuZGFyZF9sYXlvdXQpIHx8IChfR05VQ19WRVIgPj0gNDA3KQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfc3RhbmRhcmRfbGF5b3V0KF9UcCk+CisjZWxzZQorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfc2NhbGFyPHR5cGVuYW1lIHJlbW92ZV9hbGxfZXh0ZW50czxfVHA+Ojp0eXBlPjo6dmFsdWU+CisjZW5kaWYKKyAgICB7fTsKKyAgICAKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNCAmJiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19WQVJJQUJMRV9URU1QTEFURVMpCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIF9MSUJDUFBfQ09OU1RFWFBSIGJvb2wgaXNfc3RhbmRhcmRfbGF5b3V0X3YKKyAgICA9IGlzX3N0YW5kYXJkX2xheW91dDxfVHA+Ojp2YWx1ZTsKKyNlbmRpZgorCisvLyBpc190cml2aWFsbHlfY29weWFibGU7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc190cml2aWFsbHlfY29weWFibGUKKyNpZiBfX2hhc19mZWF0dXJlKGlzX3RyaXZpYWxseV9jb3B5YWJsZSkKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShfVHApPgorI2VsaWYgX0dOVUNfVkVSID49IDUwMQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsICFpc192b2xhdGlsZTxfVHA+Ojp2YWx1ZSAmJiBfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShfVHApPgorI2Vsc2UKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3NjYWxhcjx0eXBlbmFtZSByZW1vdmVfYWxsX2V4dGVudHM8X1RwPjo6dHlwZT46OnZhbHVlPgorI2VuZGlmCisgICAge307CisgICAgCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQgJiYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fVkFSSUFCTEVfVEVNUExBVEVTKQordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBfTElCQ1BQX0NPTlNURVhQUiBib29sIGlzX3RyaXZpYWxseV9jb3B5YWJsZV92CisgICAgPSBpc190cml2aWFsbHlfY29weWFibGU8X1RwPjo6dmFsdWU7CisjZW5kaWYKKworLy8gaXNfdHJpdmlhbDsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX3RyaXZpYWwKKyNpZiBfX2hhc19mZWF0dXJlKGlzX3RyaXZpYWwpIHx8IF9HTlVDX1ZFUiA+PSA0MDcKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX3RyaXZpYWwoX1RwKT4KKyNlbHNlCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc190cml2aWFsbHlfY29weWFibGU8X1RwPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3RyaXZpYWxseV9kZWZhdWx0X2NvbnN0cnVjdGlibGU8X1RwPjo6dmFsdWU+CisjZW5kaWYKKyAgICB7fTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0ICYmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1ZBUklBQkxFX1RFTVBMQVRFUykKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgX0xJQkNQUF9DT05TVEVYUFIgYm9vbCBpc190cml2aWFsX3YKKyAgICA9IGlzX3RyaXZpYWw8X1RwPjo6dmFsdWU7CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9faXNfcmVmZXJlbmNlX3dyYXBwZXJfaW1wbCA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9faXNfcmVmZXJlbmNlX3dyYXBwZXJfaW1wbDxyZWZlcmVuY2Vfd3JhcHBlcjxfVHA+ID4gOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9faXNfcmVmZXJlbmNlX3dyYXBwZXIKKyAgICA6IHB1YmxpYyBfX2lzX3JlZmVyZW5jZV93cmFwcGVyX2ltcGw8dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+IHt9OworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCisvLyBDaGVjayBmb3IgY29tcGxldGUgdHlwZXMKKwordGVtcGxhdGUgPGNsYXNzIC4uLl9UcD4gc3RydWN0IF9fY2hlY2tfY29tcGxldGU7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX19jaGVja19jb21wbGV0ZTw+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0hwLCBjbGFzcyBfVDAsIGNsYXNzIC4uLl9UcD4KK3N0cnVjdCBfX2NoZWNrX2NvbXBsZXRlPF9IcCwgX1QwLCBfVHAuLi4+CisgICAgOiBwcml2YXRlIF9fY2hlY2tfY29tcGxldGU8X0hwPiwKKyAgICAgIHByaXZhdGUgX19jaGVja19jb21wbGV0ZTxfVDAsIF9UcC4uLj4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfSHA+CitzdHJ1Y3QgX19jaGVja19jb21wbGV0ZTxfSHAsIF9IcD4KKyAgICA6IHByaXZhdGUgX19jaGVja19jb21wbGV0ZTxfSHA+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fY2hlY2tfY29tcGxldGU8X1RwPgoreworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKF9UcCkgPiAwLCAiVHlwZSBtdXN0IGJlIGNvbXBsZXRlLiIpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2NoZWNrX2NvbXBsZXRlPF9UcCY+CisgICAgOiBwcml2YXRlIF9fY2hlY2tfY29tcGxldGU8X1RwPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2NoZWNrX2NvbXBsZXRlPF9UcCYmPgorICAgIDogcHJpdmF0ZSBfX2NoZWNrX2NvbXBsZXRlPF9UcD4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIC4uLl9QYXJhbT4KK3N0cnVjdCBfX2NoZWNrX2NvbXBsZXRlPF9ScCAoKikoX1BhcmFtLi4uKT4KKyAgICA6IHByaXZhdGUgX19jaGVja19jb21wbGV0ZTxfUnA+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX1BhcmFtPgorc3RydWN0IF9fY2hlY2tfY29tcGxldGU8dm9pZCAoKikoX1BhcmFtLi4uKT4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIC4uLl9QYXJhbT4KK3N0cnVjdCBfX2NoZWNrX2NvbXBsZXRlPF9ScCAoX1BhcmFtLi4uKT4KKyAgICA6IHByaXZhdGUgX19jaGVja19jb21wbGV0ZTxfUnA+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX1BhcmFtPgorc3RydWN0IF9fY2hlY2tfY29tcGxldGU8dm9pZCAoX1BhcmFtLi4uKT4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgLi4uX1BhcmFtPgorc3RydWN0IF9fY2hlY2tfY29tcGxldGU8X1JwIChfQ2xhc3M6OiopKF9QYXJhbS4uLik+CisgICAgOiBwcml2YXRlIF9fY2hlY2tfY29tcGxldGU8X0NsYXNzPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzLCBjbGFzcyAuLi5fUGFyYW0+CitzdHJ1Y3QgX19jaGVja19jb21wbGV0ZTxfUnAgKF9DbGFzczo6KikoX1BhcmFtLi4uKSBjb25zdD4KKyAgICA6IHByaXZhdGUgX19jaGVja19jb21wbGV0ZTxfQ2xhc3M+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIC4uLl9QYXJhbT4KK3N0cnVjdCBfX2NoZWNrX2NvbXBsZXRlPF9ScCAoX0NsYXNzOjoqKShfUGFyYW0uLi4pIHZvbGF0aWxlPgorICAgIDogcHJpdmF0ZSBfX2NoZWNrX2NvbXBsZXRlPF9DbGFzcz4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgLi4uX1BhcmFtPgorc3RydWN0IF9fY2hlY2tfY29tcGxldGU8X1JwIChfQ2xhc3M6OiopKF9QYXJhbS4uLikgY29uc3Qgdm9sYXRpbGU+CisgICAgOiBwcml2YXRlIF9fY2hlY2tfY29tcGxldGU8X0NsYXNzPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzLCBjbGFzcyAuLi5fUGFyYW0+CitzdHJ1Y3QgX19jaGVja19jb21wbGV0ZTxfUnAgKF9DbGFzczo6KikoX1BhcmFtLi4uKSAmPgorICAgIDogcHJpdmF0ZSBfX2NoZWNrX2NvbXBsZXRlPF9DbGFzcz4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgLi4uX1BhcmFtPgorc3RydWN0IF9fY2hlY2tfY29tcGxldGU8X1JwIChfQ2xhc3M6OiopKF9QYXJhbS4uLikgY29uc3QmPgorICAgIDogcHJpdmF0ZSBfX2NoZWNrX2NvbXBsZXRlPF9DbGFzcz4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgLi4uX1BhcmFtPgorc3RydWN0IF9fY2hlY2tfY29tcGxldGU8X1JwIChfQ2xhc3M6OiopKF9QYXJhbS4uLikgdm9sYXRpbGUmPgorICAgIDogcHJpdmF0ZSBfX2NoZWNrX2NvbXBsZXRlPF9DbGFzcz4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgLi4uX1BhcmFtPgorc3RydWN0IF9fY2hlY2tfY29tcGxldGU8X1JwIChfQ2xhc3M6OiopKF9QYXJhbS4uLikgY29uc3Qgdm9sYXRpbGUmPgorICAgIDogcHJpdmF0ZSBfX2NoZWNrX2NvbXBsZXRlPF9DbGFzcz4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgLi4uX1BhcmFtPgorc3RydWN0IF9fY2hlY2tfY29tcGxldGU8X1JwIChfQ2xhc3M6OiopKF9QYXJhbS4uLikgJiY+CisgICAgOiBwcml2YXRlIF9fY2hlY2tfY29tcGxldGU8X0NsYXNzPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzLCBjbGFzcyAuLi5fUGFyYW0+CitzdHJ1Y3QgX19jaGVja19jb21wbGV0ZTxfUnAgKF9DbGFzczo6KikoX1BhcmFtLi4uKSBjb25zdCYmPgorICAgIDogcHJpdmF0ZSBfX2NoZWNrX2NvbXBsZXRlPF9DbGFzcz4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfUnAsIGNsYXNzIF9DbGFzcywgY2xhc3MgLi4uX1BhcmFtPgorc3RydWN0IF9fY2hlY2tfY29tcGxldGU8X1JwIChfQ2xhc3M6OiopKF9QYXJhbS4uLikgdm9sYXRpbGUmJj4KKyAgICA6IHByaXZhdGUgX19jaGVja19jb21wbGV0ZTxfQ2xhc3M+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JwLCBjbGFzcyBfQ2xhc3MsIGNsYXNzIC4uLl9QYXJhbT4KK3N0cnVjdCBfX2NoZWNrX2NvbXBsZXRlPF9ScCAoX0NsYXNzOjoqKShfUGFyYW0uLi4pIGNvbnN0IHZvbGF0aWxlJiY+CisgICAgOiBwcml2YXRlIF9fY2hlY2tfY29tcGxldGU8X0NsYXNzPgoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9ScCwgY2xhc3MgX0NsYXNzPgorc3RydWN0IF9fY2hlY2tfY29tcGxldGU8X1JwIF9DbGFzczo6Kj4KKyAgICA6IHByaXZhdGUgX19jaGVja19jb21wbGV0ZTxfQ2xhc3M+Cit7Cit9OworCisKK3RlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIF9BMCwKKyAgICAgICAgIGNsYXNzIF9EZWNheUZwID0gdHlwZW5hbWUgZGVjYXk8X0ZwPjo6dHlwZSwKKyAgICAgICAgIGNsYXNzIF9EZWNheUEwID0gdHlwZW5hbWUgZGVjYXk8X0EwPjo6dHlwZSwKKyAgICAgICAgIGNsYXNzIF9DbGFzc1QgPSB0eXBlbmFtZSBfX21lbWJlcl9wb2ludGVyX2NsYXNzX3R5cGU8X0RlY2F5RnA+Ojp0eXBlPgordXNpbmcgX19lbmFibGVfaWZfYnVsbGV0MSA9IHR5cGVuYW1lIGVuYWJsZV9pZgorICAgIDwKKyAgICAgICAgaXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXI8X0RlY2F5RnA+Ojp2YWx1ZQorICAgICAgICAmJiBpc19iYXNlX29mPF9DbGFzc1QsIF9EZWNheUEwPjo6dmFsdWUKKyAgICA+Ojp0eXBlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcyBfQTAsCisgICAgICAgICBjbGFzcyBfRGVjYXlGcCA9IHR5cGVuYW1lIGRlY2F5PF9GcD46OnR5cGUsCisgICAgICAgICBjbGFzcyBfRGVjYXlBMCA9IHR5cGVuYW1lIGRlY2F5PF9BMD46OnR5cGU+Cit1c2luZyBfX2VuYWJsZV9pZl9idWxsZXQyID0gdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgPAorICAgICAgICBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcjxfRGVjYXlGcD46OnZhbHVlCisgICAgICAgICYmIF9faXNfcmVmZXJlbmNlX3dyYXBwZXI8X0RlY2F5QTA+Ojp2YWx1ZQorICAgID46OnR5cGU7CisKK3RlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIF9BMCwKKyAgICAgICAgIGNsYXNzIF9EZWNheUZwID0gdHlwZW5hbWUgZGVjYXk8X0ZwPjo6dHlwZSwKKyAgICAgICAgIGNsYXNzIF9EZWNheUEwID0gdHlwZW5hbWUgZGVjYXk8X0EwPjo6dHlwZSwKKyAgICAgICAgIGNsYXNzIF9DbGFzc1QgPSB0eXBlbmFtZSBfX21lbWJlcl9wb2ludGVyX2NsYXNzX3R5cGU8X0RlY2F5RnA+Ojp0eXBlPgordXNpbmcgX19lbmFibGVfaWZfYnVsbGV0MyA9IHR5cGVuYW1lIGVuYWJsZV9pZgorICAgIDwKKyAgICAgICAgaXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXI8X0RlY2F5RnA+Ojp2YWx1ZQorICAgICAgICAmJiAhaXNfYmFzZV9vZjxfQ2xhc3NULCBfRGVjYXlBMD46OnZhbHVlCisgICAgICAgICYmICFfX2lzX3JlZmVyZW5jZV93cmFwcGVyPF9EZWNheUEwPjo6dmFsdWUKKyAgICA+Ojp0eXBlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcyBfQTAsCisgICAgICAgICBjbGFzcyBfRGVjYXlGcCA9IHR5cGVuYW1lIGRlY2F5PF9GcD46OnR5cGUsCisgICAgICAgICBjbGFzcyBfRGVjYXlBMCA9IHR5cGVuYW1lIGRlY2F5PF9BMD46OnR5cGUsCisgICAgICAgICBjbGFzcyBfQ2xhc3NUID0gdHlwZW5hbWUgX19tZW1iZXJfcG9pbnRlcl9jbGFzc190eXBlPF9EZWNheUZwPjo6dHlwZT4KK3VzaW5nIF9fZW5hYmxlX2lmX2J1bGxldDQgPSB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIGlzX21lbWJlcl9vYmplY3RfcG9pbnRlcjxfRGVjYXlGcD46OnZhbHVlCisgICAgICAgICYmIGlzX2Jhc2Vfb2Y8X0NsYXNzVCwgX0RlY2F5QTA+Ojp2YWx1ZQorICAgID46OnR5cGU7CisKK3RlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIF9BMCwKKyAgICAgICAgIGNsYXNzIF9EZWNheUZwID0gdHlwZW5hbWUgZGVjYXk8X0ZwPjo6dHlwZSwKKyAgICAgICAgIGNsYXNzIF9EZWNheUEwID0gdHlwZW5hbWUgZGVjYXk8X0EwPjo6dHlwZT4KK3VzaW5nIF9fZW5hYmxlX2lmX2J1bGxldDUgPSB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIGlzX21lbWJlcl9vYmplY3RfcG9pbnRlcjxfRGVjYXlGcD46OnZhbHVlCisgICAgICAgICYmIF9faXNfcmVmZXJlbmNlX3dyYXBwZXI8X0RlY2F5QTA+Ojp2YWx1ZQorICAgID46OnR5cGU7CisKK3RlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIF9BMCwKKyAgICAgICAgIGNsYXNzIF9EZWNheUZwID0gdHlwZW5hbWUgZGVjYXk8X0ZwPjo6dHlwZSwKKyAgICAgICAgIGNsYXNzIF9EZWNheUEwID0gdHlwZW5hbWUgZGVjYXk8X0EwPjo6dHlwZSwKKyAgICAgICAgIGNsYXNzIF9DbGFzc1QgPSB0eXBlbmFtZSBfX21lbWJlcl9wb2ludGVyX2NsYXNzX3R5cGU8X0RlY2F5RnA+Ojp0eXBlPgordXNpbmcgX19lbmFibGVfaWZfYnVsbGV0NiA9IHR5cGVuYW1lIGVuYWJsZV9pZgorICAgIDwKKyAgICAgICAgaXNfbWVtYmVyX29iamVjdF9wb2ludGVyPF9EZWNheUZwPjo6dmFsdWUKKyAgICAgICAgJiYgIWlzX2Jhc2Vfb2Y8X0NsYXNzVCwgX0RlY2F5QTA+Ojp2YWx1ZQorICAgICAgICAmJiAhX19pc19yZWZlcmVuY2Vfd3JhcHBlcjxfRGVjYXlBMD46OnZhbHVlCisgICAgPjo6dHlwZTsKKworLy8gX19pbnZva2UgZm9yd2FyZCBkZWNsYXJhdGlvbnMKKworLy8gZmFsbCBiYWNrIC0gbm9uZSBvZiB0aGUgYnVsbGV0cworCisjZGVmaW5lIF9MSUJDUFBfSU5WT0tFX1JFVFVSTiguLi4pIFwKKyAgICBub2V4Y2VwdChub2V4Y2VwdChfX1ZBX0FSR1NfXykpIC0+IGRlY2x0eXBlKF9fVkFfQVJHU19fKSBcCisgICAgeyByZXR1cm4gX19WQV9BUkdTX187IH0KKwordGVtcGxhdGUgPGNsYXNzIC4uLl9BcmdzPgorYXV0byBfX2ludm9rZShfX2FueSwgX0FyZ3MmJiAuLi5fX2FyZ3MpIC0+IF9fbmF0OworCit0ZW1wbGF0ZSA8Y2xhc3MgLi4uX0FyZ3M+CithdXRvIF9faW52b2tlX2NvbnN0ZXhwcihfX2FueSwgX0FyZ3MmJiAuLi5fX2FyZ3MpIC0+IF9fbmF0OworCisvLyBidWxsZXRzIDEsIDIgYW5kIDMKKwordGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MgX0EwLCBjbGFzcyAuLi5fQXJncywKKyAgICAgICAgICBjbGFzcyA9IF9fZW5hYmxlX2lmX2J1bGxldDE8X0ZwLCBfQTA+PgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2F1dG8KK19faW52b2tlKF9GcCYmIF9fZiwgX0EwJiYgX19hMCwgX0FyZ3MmJiAuLi5fX2FyZ3MpCitfTElCQ1BQX0lOVk9LRV9SRVRVUk4oKF9WU1REOjpmb3J3YXJkPF9BMD4oX19hMCkuKl9fZikoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcyBfQTAsIGNsYXNzIC4uLl9BcmdzLAorICAgICAgICAgIGNsYXNzID0gX19lbmFibGVfaWZfYnVsbGV0MTxfRnAsIF9BMD4+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIgYXV0bworX19pbnZva2VfY29uc3RleHByKF9GcCYmIF9fZiwgX0EwJiYgX19hMCwgX0FyZ3MmJiAuLi5fX2FyZ3MpCitfTElCQ1BQX0lOVk9LRV9SRVRVUk4oKF9WU1REOjpmb3J3YXJkPF9BMD4oX19hMCkuKl9fZikoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcyBfQTAsIGNsYXNzIC4uLl9BcmdzLAorICAgICAgICAgIGNsYXNzID0gX19lbmFibGVfaWZfYnVsbGV0MjxfRnAsIF9BMD4+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYXV0bworX19pbnZva2UoX0ZwJiYgX19mLCBfQTAmJiBfX2EwLCBfQXJncyYmIC4uLl9fYXJncykKK19MSUJDUFBfSU5WT0tFX1JFVFVSTigoX19hMC5nZXQoKS4qX19mKShfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikpCisKK3RlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIF9BMCwgY2xhc3MgLi4uX0FyZ3MsCisgICAgICAgICAgY2xhc3MgPSBfX2VuYWJsZV9pZl9idWxsZXQyPF9GcCwgX0EwPj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0NPTlNURVhQUiBhdXRvCitfX2ludm9rZV9jb25zdGV4cHIoX0ZwJiYgX19mLCBfQTAmJiBfX2EwLCBfQXJncyYmIC4uLl9fYXJncykKK19MSUJDUFBfSU5WT0tFX1JFVFVSTigoX19hMC5nZXQoKS4qX19mKShfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikpCisKK3RlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIF9BMCwgY2xhc3MgLi4uX0FyZ3MsCisgICAgICAgICAgY2xhc3MgPSBfX2VuYWJsZV9pZl9idWxsZXQzPF9GcCwgX0EwPj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCithdXRvCitfX2ludm9rZShfRnAmJiBfX2YsIF9BMCYmIF9fYTAsIF9BcmdzJiYgLi4uX19hcmdzKQorX0xJQkNQUF9JTlZPS0VfUkVUVVJOKCgoKl9WU1REOjpmb3J3YXJkPF9BMD4oX19hMCkpLipfX2YpKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSkKKwordGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MgX0EwLCBjbGFzcyAuLi5fQXJncywKKyAgICAgICAgICBjbGFzcyA9IF9fZW5hYmxlX2lmX2J1bGxldDM8X0ZwLCBfQTA+PgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSIGF1dG8KK19faW52b2tlX2NvbnN0ZXhwcihfRnAmJiBfX2YsIF9BMCYmIF9fYTAsIF9BcmdzJiYgLi4uX19hcmdzKQorX0xJQkNQUF9JTlZPS0VfUkVUVVJOKCgoKl9WU1REOjpmb3J3YXJkPF9BMD4oX19hMCkpLipfX2YpKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSkKKworLy8gYnVsbGV0cyA0LCA1IGFuZCA2CisKK3RlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIF9BMCwKKyAgICAgICAgICBjbGFzcyA9IF9fZW5hYmxlX2lmX2J1bGxldDQ8X0ZwLCBfQTA+PgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2F1dG8KK19faW52b2tlKF9GcCYmIF9fZiwgX0EwJiYgX19hMCkKK19MSUJDUFBfSU5WT0tFX1JFVFVSTihfVlNURDo6Zm9yd2FyZDxfQTA+KF9fYTApLipfX2YpCisKK3RlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIF9BMCwKKyAgICAgICAgICBjbGFzcyA9IF9fZW5hYmxlX2lmX2J1bGxldDQ8X0ZwLCBfQTA+PgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19MSUJDUFBfQ09OU1RFWFBSIGF1dG8KK19faW52b2tlX2NvbnN0ZXhwcihfRnAmJiBfX2YsIF9BMCYmIF9fYTApCitfTElCQ1BQX0lOVk9LRV9SRVRVUk4oX1ZTVEQ6OmZvcndhcmQ8X0EwPihfX2EwKS4qX19mKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcyBfQTAsCisgICAgICAgICAgY2xhc3MgPSBfX2VuYWJsZV9pZl9idWxsZXQ1PF9GcCwgX0EwPj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCithdXRvCitfX2ludm9rZShfRnAmJiBfX2YsIF9BMCYmIF9fYTApCitfTElCQ1BQX0lOVk9LRV9SRVRVUk4oX19hMC5nZXQoKS4qX19mKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcyBfQTAsCisgICAgICAgICAgY2xhc3MgPSBfX2VuYWJsZV9pZl9idWxsZXQ1PF9GcCwgX0EwPj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfTElCQ1BQX0NPTlNURVhQUiBhdXRvCitfX2ludm9rZV9jb25zdGV4cHIoX0ZwJiYgX19mLCBfQTAmJiBfX2EwKQorX0xJQkNQUF9JTlZPS0VfUkVUVVJOKF9fYTAuZ2V0KCkuKl9fZikKKwordGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MgX0EwLAorICAgICAgICAgIGNsYXNzID0gX19lbmFibGVfaWZfYnVsbGV0NjxfRnAsIF9BMD4+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYXV0bworX19pbnZva2UoX0ZwJiYgX19mLCBfQTAmJiBfX2EwKQorX0xJQkNQUF9JTlZPS0VfUkVUVVJOKCgqX1ZTVEQ6OmZvcndhcmQ8X0EwPihfX2EwKSkuKl9fZikKKwordGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MgX0EwLAorICAgICAgICAgIGNsYXNzID0gX19lbmFibGVfaWZfYnVsbGV0NjxfRnAsIF9BMD4+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIgYXV0bworX19pbnZva2VfY29uc3RleHByKF9GcCYmIF9fZiwgX0EwJiYgX19hMCkKK19MSUJDUFBfSU5WT0tFX1JFVFVSTigoKl9WU1REOjpmb3J3YXJkPF9BMD4oX19hMCkpLipfX2YpCisKKy8vIGJ1bGxldCA3CisKK3RlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIC4uLl9BcmdzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2F1dG8KK19faW52b2tlKF9GcCYmIF9fZiwgX0FyZ3MmJiAuLi5fX2FyZ3MpCitfTElCQ1BQX0lOVk9LRV9SRVRVUk4oX1ZTVEQ6OmZvcndhcmQ8X0ZwPihfX2YpKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSkKKwordGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MgLi4uX0FyZ3M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0xJQkNQUF9DT05TVEVYUFIgYXV0bworX19pbnZva2VfY29uc3RleHByKF9GcCYmIF9fZiwgX0FyZ3MmJiAuLi5fX2FyZ3MpCitfTElCQ1BQX0lOVk9LRV9SRVRVUk4oX1ZTVEQ6OmZvcndhcmQ8X0ZwPihfX2YpKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSkKKworI3VuZGVmIF9MSUJDUFBfSU5WT0tFX1JFVFVSTgorCisvLyBfX2ludm9rYWJsZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX0ZwLCBjbGFzcyAuLi5fQXJncz4KK3N0cnVjdCBfX2ludm9rYWJsZV9yCisgICAgOiBwcml2YXRlIF9fY2hlY2tfY29tcGxldGU8X0ZwPgoreworICAgIHVzaW5nIF9SZXN1bHQgPSBkZWNsdHlwZSgKKyAgICAgICAgX1ZTVEQ6Ol9faW52b2tlKF9WU1REOjpkZWNsdmFsPF9GcD4oKSwgX1ZTVEQ6OmRlY2x2YWw8X0FyZ3M+KCkuLi4pKTsKKworICAgIHVzaW5nIHR5cGUgPQorICAgICAgICB0eXBlbmFtZSBjb25kaXRpb25hbDwKKyAgICAgICAgICAgICFpc19zYW1lPF9SZXN1bHQsIF9fbmF0Pjo6dmFsdWUsCisgICAgICAgICAgICB0eXBlbmFtZSBjb25kaXRpb25hbDwKKyAgICAgICAgICAgICAgICBpc192b2lkPF9SZXQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICB0cnVlX3R5cGUsCisgICAgICAgICAgICAgICAgaXNfY29udmVydGlibGU8X1Jlc3VsdCwgX1JldD4KKyAgICAgICAgICAgID46OnR5cGUsCisgICAgICAgICAgICBmYWxzZV90eXBlCisgICAgICAgID46OnR5cGU7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0eXBlOjp2YWx1ZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIC4uLl9BcmdzPgordXNpbmcgX19pbnZva2FibGUgPSBfX2ludm9rYWJsZV9yPHZvaWQsIF9GcCwgX0FyZ3MuLi4+OworCit0ZW1wbGF0ZSA8Ym9vbCBfSXNJbnZva2FibGUsIGJvb2wgX0lzQ1ZWb2lkLCBjbGFzcyBfUmV0LCBjbGFzcyBfRnAsIGNsYXNzIC4uLl9BcmdzPgorc3RydWN0IF9fbm90aHJvd19pbnZva2FibGVfcl9pbXAgeworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9GcCwgY2xhc3MgLi4uX0FyZ3M+CitzdHJ1Y3QgX19ub3Rocm93X2ludm9rYWJsZV9yX2ltcDx0cnVlLCBmYWxzZSwgX1JldCwgX0ZwLCBfQXJncy4uLj4KK3sKKyAgICB0eXBlZGVmIF9fbm90aHJvd19pbnZva2FibGVfcl9pbXAgX1RoaXNUOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBzdGF0aWMgdm9pZCBfX3Rlc3Rfbm9leGNlcHQoX1RwKSBub2V4Y2VwdDsKKworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gbm9leGNlcHQoX1RoaXNUOjpfX3Rlc3Rfbm9leGNlcHQ8X1JldD4oCisgICAgICAgIF9WU1REOjpfX2ludm9rZShfVlNURDo6ZGVjbHZhbDxfRnA+KCksIF9WU1REOjpkZWNsdmFsPF9BcmdzPigpLi4uKSkpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9GcCwgY2xhc3MgLi4uX0FyZ3M+CitzdHJ1Y3QgX19ub3Rocm93X2ludm9rYWJsZV9yX2ltcDx0cnVlLCB0cnVlLCBfUmV0LCBfRnAsIF9BcmdzLi4uPgoreworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gbm9leGNlcHQoCisgICAgICAgIF9WU1REOjpfX2ludm9rZShfVlNURDo6ZGVjbHZhbDxfRnA+KCksIF9WU1REOjpkZWNsdmFsPF9BcmdzPigpLi4uKSk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX0ZwLCBjbGFzcyAuLi5fQXJncz4KK3VzaW5nIF9fbm90aHJvd19pbnZva2FibGVfciA9CisgICAgX19ub3Rocm93X2ludm9rYWJsZV9yX2ltcDwKKyAgICAgICAgICAgIF9faW52b2thYmxlX3I8X1JldCwgX0ZwLCBfQXJncy4uLj46OnZhbHVlLAorICAgICAgICAgICAgaXNfdm9pZDxfUmV0Pjo6dmFsdWUsCisgICAgICAgICAgICBfUmV0LCBfRnAsIF9BcmdzLi4uCisgICAgPjsKKwordGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MgLi4uX0FyZ3M+Cit1c2luZyBfX25vdGhyb3dfaW52b2thYmxlID0KKyAgICBfX25vdGhyb3dfaW52b2thYmxlX3JfaW1wPAorICAgICAgICAgICAgX19pbnZva2FibGU8X0ZwLCBfQXJncy4uLj46OnZhbHVlLAorICAgICAgICAgICAgdHJ1ZSwgdm9pZCwgX0ZwLCBfQXJncy4uLgorICAgID47CisKK3RlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIC4uLl9BcmdzPgorc3RydWN0IF9faW52b2tlX29mCisgICAgOiBwdWJsaWMgZW5hYmxlX2lmPAorICAgICAgICBfX2ludm9rYWJsZTxfRnAsIF9BcmdzLi4uPjo6dmFsdWUsCisgICAgICAgIHR5cGVuYW1lIF9faW52b2thYmxlX3I8dm9pZCwgX0ZwLCBfQXJncy4uLj46Ol9SZXN1bHQ+Cit7Cit9OworCisvLyByZXN1bHRfb2YKKwordGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MgLi4uX0FyZ3M+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyByZXN1bHRfb2Y8X0ZwKF9BcmdzLi4uKT4KKyAgICA6IHB1YmxpYyBfX2ludm9rZV9vZjxfRnAsIF9BcmdzLi4uPgoreworfTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiB1c2luZyByZXN1bHRfb2ZfdCA9IHR5cGVuYW1lIHJlc3VsdF9vZjxfVHA+Ojp0eXBlOworI2VuZGlmCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAorCisvLyBpbnZva2VfcmVzdWx0CisKK3RlbXBsYXRlIDxjbGFzcyBfRm4sIGNsYXNzLi4uIF9BcmdzPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGludm9rZV9yZXN1bHQKKyAgICA6IF9faW52b2tlX29mPF9GbiwgX0FyZ3MuLi4+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZuLCBjbGFzcy4uLiBfQXJncz4KK3VzaW5nIGludm9rZV9yZXN1bHRfdCA9IHR5cGVuYW1lIGludm9rZV9yZXN1bHQ8X0ZuLCBfQXJncy4uLj46OnR5cGU7CisKKy8vIGlzX2ludm9jYWJsZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZuLCBjbGFzcyAuLi5fQXJncz4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19pbnZvY2FibGUKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faW52b2thYmxlPF9GbiwgX0FyZ3MuLi4+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfRm4sIGNsYXNzIC4uLl9BcmdzPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX2ludm9jYWJsZV9yCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2ludm9rYWJsZV9yPF9SZXQsIF9GbiwgX0FyZ3MuLi4+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBfRm4sIGNsYXNzIC4uLl9BcmdzPgorX0xJQkNQUF9JTkxJTkVfVkFSIGNvbnN0ZXhwciBib29sIGlzX2ludm9jYWJsZV92CisgICAgPSBpc19pbnZvY2FibGU8X0ZuLCBfQXJncy4uLj46OnZhbHVlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX0ZuLCBjbGFzcyAuLi5fQXJncz4KK19MSUJDUFBfSU5MSU5FX1ZBUiBjb25zdGV4cHIgYm9vbCBpc19pbnZvY2FibGVfcl92CisgICAgPSBpc19pbnZvY2FibGVfcjxfUmV0LCBfRm4sIF9BcmdzLi4uPjo6dmFsdWU7CisKKy8vIGlzX25vdGhyb3dfaW52b2NhYmxlCisKK3RlbXBsYXRlIDxjbGFzcyBfRm4sIGNsYXNzIC4uLl9BcmdzPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX25vdGhyb3dfaW52b2NhYmxlCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX25vdGhyb3dfaW52b2thYmxlPF9GbiwgX0FyZ3MuLi4+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfRm4sIGNsYXNzIC4uLl9BcmdzPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX25vdGhyb3dfaW52b2NhYmxlX3IKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9fbm90aHJvd19pbnZva2FibGVfcjxfUmV0LCBfRm4sIF9BcmdzLi4uPjo6dmFsdWU+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZuLCBjbGFzcyAuLi5fQXJncz4KK19MSUJDUFBfSU5MSU5FX1ZBUiBjb25zdGV4cHIgYm9vbCBpc19ub3Rocm93X2ludm9jYWJsZV92CisgICAgPSBpc19ub3Rocm93X2ludm9jYWJsZTxfRm4sIF9BcmdzLi4uPjo6dmFsdWU7CisKK3RlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfRm4sIGNsYXNzIC4uLl9BcmdzPgorX0xJQkNQUF9JTkxJTkVfVkFSIGNvbnN0ZXhwciBib29sIGlzX25vdGhyb3dfaW52b2NhYmxlX3JfdgorICAgID0gaXNfbm90aHJvd19pbnZvY2FibGVfcjxfUmV0LCBfRm4sIF9BcmdzLi4uPjo6dmFsdWU7CisKKyNlbmRpZiAvLyBfTElCQ1BQX1NURF9WRVIgPiAxNAorCisjZW5kaWYgIC8vICFkZWZpbmVkKF9MSUJDUFBfQ1hYMDNfTEFORykKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9faXNfc3dhcHBhYmxlOwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9faXNfbm90aHJvd19zd2FwcGFibGU7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIGlzX21vdmVfY29uc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZSAmJgorICAgIGlzX21vdmVfYXNzaWduYWJsZTxfVHA+Ojp2YWx1ZQorPjo6dHlwZQorI2Vsc2UKK3ZvaWQKKyNlbmRpZgorc3dhcChfVHAmIF9feCwgX1RwJiBfX3kpIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8X1RwPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPF9UcD46OnZhbHVlKQoreworICAgIF9UcCBfX3QoX1ZTVEQ6Om1vdmUoX194KSk7CisgICAgX194ID0gX1ZTVEQ6Om1vdmUoX195KTsKKyAgICBfX3kgPSBfVlNURDo6bW92ZShfX3QpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHAsIHNpemVfdCBfTnA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmPAorICAgIF9faXNfc3dhcHBhYmxlPF9UcD46OnZhbHVlCis+Ojp0eXBlCitzd2FwKF9UcCAoJl9fYSlbX05wXSwgX1RwICgmX19iKVtfTnBdKSBfTk9FWENFUFRfKF9faXNfbm90aHJvd19zd2FwcGFibGU8X1RwPjo6dmFsdWUpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK2l0ZXJfc3dhcChfRm9yd2FyZEl0ZXJhdG9yMSBfX2EsIF9Gb3J3YXJkSXRlcmF0b3IyIF9fYikKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTk9FWENFUFRfKF9OT0VYQ0VQVF8oc3dhcCgqX19hLCAqX19iKSkpCisgICAgICAgICAgICAgICBfTk9FWENFUFRfKF9OT0VYQ0VQVF8oc3dhcCgqX1ZTVEQ6OmRlY2x2YWw8X0ZvcndhcmRJdGVyYXRvcjE+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqX1ZTVEQ6OmRlY2x2YWw8X0ZvcndhcmRJdGVyYXRvcjI+KCkpKSkKK3sKKyAgICBzd2FwKCpfX2EsICpfX2IpOworfQorCisvLyBfX3N3YXBwYWJsZQorCituYW1lc3BhY2UgX19kZXRhaWwKK3sKKy8vIEFMTCBnZW5lcmljIHN3YXAgb3ZlcmxvYWRzIE1VU1QgYWxyZWFkeSBoYXZlIGEgZGVjbGFyYXRpb24gYXZhaWxhYmxlIGF0IHRoaXMgcG9pbnQuCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcCA9IF9UcCwKKyAgICAgICAgICBib29sIF9Ob3RWb2lkID0gIWlzX3ZvaWQ8X1RwPjo6dmFsdWUgJiYgIWlzX3ZvaWQ8X1VwPjo6dmFsdWU+CitzdHJ1Y3QgX19zd2FwcGFibGVfd2l0aAoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfTEhTLCBjbGFzcyBfUkhTPgorICAgIHN0YXRpYyBkZWNsdHlwZShzd2FwKF9WU1REOjpkZWNsdmFsPF9MSFM+KCksIF9WU1REOjpkZWNsdmFsPF9SSFM+KCkpKQorICAgIF9fdGVzdF9zd2FwKGludCk7CisgICAgdGVtcGxhdGUgPGNsYXNzLCBjbGFzcz4KKyAgICBzdGF0aWMgX19uYXQgX190ZXN0X3N3YXAobG9uZyk7CisKKyAgICAvLyBFeHRyYSBwYXJlbnMgYXJlIG5lZWRlZCBmb3IgdGhlIEMrKzAzIGRlZmluaXRpb24gb2YgZGVjbHR5cGUuCisgICAgdHlwZWRlZiBkZWNsdHlwZSgoX190ZXN0X3N3YXA8X1RwLCBfVXA+KDApKSkgX19zd2FwMTsKKyAgICB0eXBlZGVmIGRlY2x0eXBlKChfX3Rlc3Rfc3dhcDxfVXAsIF9UcD4oMCkpKSBfX3N3YXAyOworCisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSAhaXNfc2FtZTxfX3N3YXAxLCBfX25hdD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaXNfc2FtZTxfX3N3YXAyLCBfX25hdD46OnZhbHVlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorc3RydWN0IF9fc3dhcHBhYmxlX3dpdGg8X1RwLCBfVXAsICBmYWxzZT4gOiBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVXAgPSBfVHAsIGJvb2wgX1N3YXBwYWJsZSA9IF9fc3dhcHBhYmxlX3dpdGg8X1RwLCBfVXA+Ojp2YWx1ZT4KK3N0cnVjdCBfX25vdGhyb3dfc3dhcHBhYmxlX3dpdGggeworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9CisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX05PRVhDRVBUCisgICAgICBub2V4Y2VwdChzd2FwKF9WU1REOjpkZWNsdmFsPF9UcD4oKSwgX1ZTVEQ6OmRlY2x2YWw8X1VwPigpKSkKKyAgJiYgIG5vZXhjZXB0KHN3YXAoX1ZTVEQ6OmRlY2x2YWw8X1VwPigpLCBfVlNURDo6ZGVjbHZhbDxfVHA+KCkpKTsKKyNlbHNlCisgICAgICBmYWxzZTsKKyNlbmRpZgorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorc3RydWN0IF9fbm90aHJvd19zd2FwcGFibGVfd2l0aDxfVHAsIF9VcCwgZmFsc2U+IDogZmFsc2VfdHlwZSB7fTsKKworfSAgLy8gX19kZXRhaWwKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2lzX3N3YXBwYWJsZQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9fZGV0YWlsOjpfX3N3YXBwYWJsZV93aXRoPF9UcCY+Ojp2YWx1ZT4KK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19pc19ub3Rocm93X3N3YXBwYWJsZQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9fZGV0YWlsOjpfX25vdGhyb3dfc3dhcHBhYmxlX3dpdGg8X1RwJj46OnZhbHVlPgoreworfTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBpc19zd2FwcGFibGVfd2l0aAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9fZGV0YWlsOjpfX3N3YXBwYWJsZV93aXRoPF9UcCwgX1VwPjo6dmFsdWU+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX3N3YXBwYWJsZQorICAgIDogcHVibGljIGNvbmRpdGlvbmFsPAorICAgICAgICBfX2lzX3JlZmVyZW5jZWFibGU8X1RwPjo6dmFsdWUsCisgICAgICAgIGlzX3N3YXBwYWJsZV93aXRoPAorICAgICAgICAgICAgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSwKKyAgICAgICAgICAgIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9UcD46OnR5cGU+LAorICAgICAgICBmYWxzZV90eXBlCisgICAgPjo6dHlwZQoreworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1VwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX25vdGhyb3dfc3dhcHBhYmxlX3dpdGgKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2RldGFpbDo6X19ub3Rocm93X3N3YXBwYWJsZV93aXRoPF9UcCwgX1VwPjo6dmFsdWU+Cit7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGlzX25vdGhyb3dfc3dhcHBhYmxlCisgICAgOiBwdWJsaWMgY29uZGl0aW9uYWw8CisgICAgICAgIF9faXNfcmVmZXJlbmNlYWJsZTxfVHA+Ojp2YWx1ZSwKKyAgICAgICAgaXNfbm90aHJvd19zd2FwcGFibGVfd2l0aDwKKyAgICAgICAgICAgIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9UcD46OnR5cGUsCisgICAgICAgICAgICB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlPiwKKyAgICAgICAgZmFsc2VfdHlwZQorICAgID46OnR5cGUKK3sKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBjb25zdGV4cHIgYm9vbCBpc19zd2FwcGFibGVfd2l0aF92CisgICAgPSBpc19zd2FwcGFibGVfd2l0aDxfVHAsIF9VcD46OnZhbHVlOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVkFSIGNvbnN0ZXhwciBib29sIGlzX3N3YXBwYWJsZV92CisgICAgPSBpc19zd2FwcGFibGU8X1RwPjo6dmFsdWU7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9VcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBjb25zdGV4cHIgYm9vbCBpc19ub3Rocm93X3N3YXBwYWJsZV93aXRoX3YKKyAgICA9IGlzX25vdGhyb3dfc3dhcHBhYmxlX3dpdGg8X1RwLCBfVXA+Ojp2YWx1ZTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBjb25zdGV4cHIgYm9vbCBpc19ub3Rocm93X3N3YXBwYWJsZV92CisgICAgPSBpc19ub3Rocm93X3N3YXBwYWJsZTxfVHA+Ojp2YWx1ZTsKKworI2VuZGlmIC8vIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisKKyNpZmRlZiBfTElCQ1BQX1VOREVSTFlJTkdfVFlQRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IHVuZGVybHlpbmdfdHlwZQoreworICAgIHR5cGVkZWYgX0xJQkNQUF9VTkRFUkxZSU5HX1RZUEUoX1RwKSB0eXBlOworfTsKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiB1c2luZyB1bmRlcmx5aW5nX3R5cGVfdCA9IHR5cGVuYW1lIHVuZGVybHlpbmdfdHlwZTxfVHA+Ojp0eXBlOworI2VuZGlmCisKKyNlbHNlICAvLyBfTElCQ1BQX1VOREVSTFlJTkdfVFlQRQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBib29sIF9TdXBwb3J0ID0gZmFsc2U+CitzdHJ1Y3QgdW5kZXJseWluZ190eXBlCit7CisgICAgc3RhdGljX2Fzc2VydChfU3VwcG9ydCwgIlRoZSB1bmRlcnlsaW5nX3R5cGUgdHJhaXQgcmVxdWlyZXMgY29tcGlsZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdXBwb3J0LiBFaXRoZXIgbm8gc3VjaCBzdXBwb3J0IGV4aXN0cyBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpYmMrKyBkb2VzIG5vdCBrbm93IGhvdyB0byB1c2UgaXQuIik7Cit9OworCisjZW5kaWYgLy8gX0xJQkNQUF9VTkRFUkxZSU5HX1RZUEUKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBib29sID0gaXNfZW51bTxfVHA+Ojp2YWx1ZT4KK3N0cnVjdCBfX3NmaW5hZV91bmRlcmx5aW5nX3R5cGUKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHVuZGVybHlpbmdfdHlwZTxfVHA+Ojp0eXBlIHR5cGU7CisgICAgdHlwZWRlZiBkZWNsdHlwZSgoKHR5cGUpMSkgKyAwKSBfX3Byb21vdGVkX3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fc2ZpbmFlX3VuZGVybHlpbmdfdHlwZTxfVHAsIGZhbHNlPiB7fTsKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIKK2ludCBfX2NvbnZlcnRfdG9faW50ZWdyYWwoaW50IF9fdmFsKSB7IHJldHVybiBfX3ZhbDsgfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgordW5zaWduZWQgX19jb252ZXJ0X3RvX2ludGVncmFsKHVuc2lnbmVkIF9fdmFsKSB7IHJldHVybiBfX3ZhbDsgfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgorbG9uZyBfX2NvbnZlcnRfdG9faW50ZWdyYWwobG9uZyBfX3ZhbCkgeyByZXR1cm4gX192YWw7IH0KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIKK3Vuc2lnbmVkIGxvbmcgX19jb252ZXJ0X3RvX2ludGVncmFsKHVuc2lnbmVkIGxvbmcgX192YWwpIHsgcmV0dXJuIF9fdmFsOyB9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSCitsb25nIGxvbmcgX19jb252ZXJ0X3RvX2ludGVncmFsKGxvbmcgbG9uZyBfX3ZhbCkgeyByZXR1cm4gX192YWw7IH0KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIKK3Vuc2lnbmVkIGxvbmcgbG9uZyBfX2NvbnZlcnRfdG9faW50ZWdyYWwodW5zaWduZWQgbG9uZyBsb25nIF9fdmFsKSB7cmV0dXJuIF9fdmFsOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9GcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSCit0eXBlbmFtZSBlbmFibGVfaWY8aXNfZmxvYXRpbmdfcG9pbnQ8X0ZwPjo6dmFsdWUsIGxvbmcgbG9uZz46OnR5cGUKKyBfX2NvbnZlcnRfdG9faW50ZWdyYWwoX0ZwIF9fdmFsKSB7IHJldHVybiBfX3ZhbDsgfQorCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0lOVDEyOAoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFIKK19faW50MTI4X3QgX19jb252ZXJ0X3RvX2ludGVncmFsKF9faW50MTI4X3QgX192YWwpIHsgcmV0dXJuIF9fdmFsOyB9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSCitfX3VpbnQxMjhfdCBfX2NvbnZlcnRfdG9faW50ZWdyYWwoX191aW50MTI4X3QgX192YWwpIHsgcmV0dXJuIF9fdmFsOyB9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSCit0eXBlbmFtZSBfX3NmaW5hZV91bmRlcmx5aW5nX3R5cGU8X1RwPjo6X19wcm9tb3RlZF90eXBlCitfX2NvbnZlcnRfdG9faW50ZWdyYWwoX1RwIF9fdmFsKSB7IHJldHVybiBfX3ZhbDsgfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9faGFzX29wZXJhdG9yX2FkZHJlc3NvZl9tZW1iZXJfaW1wCit7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgICAgICAgc3RhdGljIGF1dG8gX190ZXN0KGludCkKKyAgICAgICAgICAgIC0+IHR5cGVuYW1lIF9fc2VsZWN0XzJuZDxkZWNsdHlwZShfVlNURDo6ZGVjbHZhbDxfVXA+KCkub3BlcmF0b3ImKCkpLCB0cnVlX3R5cGU+Ojp0eXBlOworICAgIHRlbXBsYXRlIDxjbGFzcz4KKyAgICAgICAgc3RhdGljIGF1dG8gX190ZXN0KGxvbmcpIC0+IGZhbHNlX3R5cGU7CisKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGRlY2x0eXBlKF9fdGVzdDxfVHA+KDApKTo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9faGFzX29wZXJhdG9yX2FkZHJlc3NvZl9mcmVlX2ltcAoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfVXA+CisgICAgICAgIHN0YXRpYyBhdXRvIF9fdGVzdChpbnQpCisgICAgICAgICAgICAtPiB0eXBlbmFtZSBfX3NlbGVjdF8ybmQ8ZGVjbHR5cGUob3BlcmF0b3ImKF9WU1REOjpkZWNsdmFsPF9VcD4oKSkpLCB0cnVlX3R5cGU+Ojp0eXBlOworICAgIHRlbXBsYXRlIDxjbGFzcz4KKyAgICAgICAgc3RhdGljIGF1dG8gX190ZXN0KGxvbmcpIC0+IGZhbHNlX3R5cGU7CisKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGRlY2x0eXBlKF9fdGVzdDxfVHA+KDApKTo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9faGFzX29wZXJhdG9yX2FkZHJlc3NvZgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faGFzX29wZXJhdG9yX2FkZHJlc3NvZl9tZW1iZXJfaW1wPF9UcD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgX19oYXNfb3BlcmF0b3JfYWRkcmVzc29mX2ZyZWVfaW1wPF9UcD46OnZhbHVlPgore307CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAorCisjZGVmaW5lIF9fY3BwX2xpYl92b2lkX3QgMjAxNDExCit0ZW1wbGF0ZSA8Y2xhc3MuLi4+IHVzaW5nIHZvaWRfdCA9IHZvaWQ7CisKKyMgaWZuZGVmIF9MSUJDUFBfSEFTX05PX1ZBUklBRElDUwordGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorc3RydWN0IGNvbmp1bmN0aW9uIDogX19hbmRfPF9BcmdzLi4uPiB7fTsKK3RlbXBsYXRlPGNsYXNzLi4uIF9BcmdzPgorX0xJQkNQUF9JTkxJTkVfVkFSIGNvbnN0ZXhwciBib29sIGNvbmp1bmN0aW9uX3YKKyAgICA9IGNvbmp1bmN0aW9uPF9BcmdzLi4uPjo6dmFsdWU7CisKK3RlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KK3N0cnVjdCBkaXNqdW5jdGlvbiA6IF9fb3JfPF9BcmdzLi4uPiB7fTsKK3RlbXBsYXRlPGNsYXNzLi4uIF9BcmdzPgorX0xJQkNQUF9JTkxJTkVfVkFSIGNvbnN0ZXhwciBib29sIGRpc2p1bmN0aW9uX3YKKyAgICA9IGRpc2p1bmN0aW9uPF9BcmdzLi4uPjo6dmFsdWU7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgbmVnYXRpb24gOiBfX25vdF88X1RwPiB7fTsKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBjb25zdGV4cHIgYm9vbCBuZWdhdGlvbl92CisgICAgPSBuZWdhdGlvbjxfVHA+Ojp2YWx1ZTsKKyMgZW5kaWYgLy8gX0xJQkNQUF9IQVNfTk9fVkFSSUFESUNTCisjZW5kaWYgIC8vIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisKKy8vIFRoZXNlIHRyYWl0cyBhcmUgdXNlZCBpbiBfX3RyZWUgYW5kIF9faGFzaF90YWJsZQorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKK3N0cnVjdCBfX2V4dHJhY3Rfa2V5X2ZhaWxfdGFnIHt9Oworc3RydWN0IF9fZXh0cmFjdF9rZXlfc2VsZl90YWcge307CitzdHJ1Y3QgX19leHRyYWN0X2tleV9maXJzdF90YWcge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsVHksIGNsYXNzIF9LZXksCisgICAgICAgICAgY2xhc3MgX1Jhd1ZhbFR5ID0gdHlwZW5hbWUgX191bmNvbnN0cmVmPF9WYWxUeT46OnR5cGU+CitzdHJ1Y3QgX19jYW5fZXh0cmFjdF9rZXkKKyAgICA6IGNvbmRpdGlvbmFsPGlzX3NhbWU8X1Jhd1ZhbFR5LCBfS2V5Pjo6dmFsdWUsIF9fZXh0cmFjdF9rZXlfc2VsZl90YWcsCisgICAgICAgICAgICAgICAgICBfX2V4dHJhY3Rfa2V5X2ZhaWxfdGFnPjo6dHlwZSB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9QYWlyLCBjbGFzcyBfS2V5LCBjbGFzcyBfRmlyc3QsIGNsYXNzIF9TZWNvbmQ+CitzdHJ1Y3QgX19jYW5fZXh0cmFjdF9rZXk8X1BhaXIsIF9LZXksIHBhaXI8X0ZpcnN0LCBfU2Vjb25kPj4KKyAgICA6IGNvbmRpdGlvbmFsPGlzX3NhbWU8dHlwZW5hbWUgcmVtb3ZlX2NvbnN0PF9GaXJzdD46OnR5cGUsIF9LZXk+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIF9fZXh0cmFjdF9rZXlfZmlyc3RfdGFnLCBfX2V4dHJhY3Rfa2V5X2ZhaWxfdGFnPjo6dHlwZSB7fTsKKworLy8gX19jYW5fZXh0cmFjdF9tYXBfa2V5IHVzZXMgdHJ1ZV90eXBlL2ZhbHNlX3R5cGUgaW5zdGVhZCBvZiB0aGUgdGFncy4KKy8vIEl0IHJldHVybnMgdHJ1ZSBpZiBfS2V5ICE9IF9Db250YWluZXJWYWx1ZVR5ICh0aGUgY29udGFpbmVyIGlzIGEgbWFwIG5vdCBhIHNldCkKKy8vIGFuZCBfVmFsVHkgPT0gX0tleS4KK3RlbXBsYXRlIDxjbGFzcyBfVmFsVHksIGNsYXNzIF9LZXksIGNsYXNzIF9Db250YWluZXJWYWx1ZVR5LAorICAgICAgICAgIGNsYXNzIF9SYXdWYWxUeSA9IHR5cGVuYW1lIF9fdW5jb25zdHJlZjxfVmFsVHk+Ojp0eXBlPgorc3RydWN0IF9fY2FuX2V4dHJhY3RfbWFwX2tleQorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfc2FtZTxfUmF3VmFsVHksIF9LZXk+Ojp2YWx1ZT4ge307CisKKy8vIFRoaXMgc3BlY2lhbGl6YXRpb24gcmV0dXJucyBfX2V4dHJhY3Rfa2V5X2ZhaWxfdGFnIGZvciBub24tbWFwIGNvbnRhaW5lcnMKKy8vIGJlY2F1c2UgX0tleSA9PSBfQ29udGFpbmVyVmFsdWVUeQordGVtcGxhdGUgPGNsYXNzIF9WYWxUeSwgY2xhc3MgX0tleSwgY2xhc3MgX1Jhd1ZhbFR5Pgorc3RydWN0IF9fY2FuX2V4dHJhY3RfbWFwX2tleTxfVmFsVHksIF9LZXksIF9LZXksIF9SYXdWYWxUeT4KKyAgICA6IGZhbHNlX3R5cGUge307CisKKyNlbmRpZgorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTcKK2VudW0gY2xhc3MgZW5kaWFuCit7CisgICAgbGl0dGxlID0gMHhERUFELAorICAgIGJpZyAgICA9IDB4RkFDRSwKKyNpZiBkZWZpbmVkKF9MSUJDUFBfTElUVExFX0VORElBTikKKyAgICBuYXRpdmUgPSBsaXR0bGUKKyNlbGlmIGRlZmluZWQoX0xJQkNQUF9CSUdfRU5ESUFOKQorICAgIG5hdGl2ZSA9IGJpZworI2Vsc2UKKyAgICBuYXRpdmUgPSAweENBRkUKKyNlbmRpZgorfTsKKyNlbmRpZgorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAorLy8gc3RkOjpieXRlCituYW1lc3BhY2Ugc3RkICAvLyBwdXJwb3NlZnVsbHkgbm90IHZlcnNpb25lZAorewordGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICBjb25zdGV4cHIgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2ludGVncmFsX3Y8X0ludGVnZXI+LCBieXRlPjo6dHlwZSAmCisgIG9wZXJhdG9yPDw9KGJ5dGUmIF9fbGhzLCBfSW50ZWdlciBfX3NoaWZ0KSBub2V4Y2VwdAorICB7IHJldHVybiBfX2xocyA9IF9fbGhzIDw8IF9fc2hpZnQ7IH0KKyAgCit0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgIGNvbnN0ZXhwciB0eXBlbmFtZSBlbmFibGVfaWY8aXNfaW50ZWdyYWxfdjxfSW50ZWdlcj4sIGJ5dGU+Ojp0eXBlCisgIG9wZXJhdG9yPDwgKGJ5dGUgIF9fbGhzLCBfSW50ZWdlciBfX3NoaWZ0KSBub2V4Y2VwdAorICB7IHJldHVybiBzdGF0aWNfY2FzdDxieXRlPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KF9fbGhzKSA8PCBfX3NoaWZ0KSk7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICBjb25zdGV4cHIgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2ludGVncmFsX3Y8X0ludGVnZXI+LCBieXRlPjo6dHlwZSAmCisgIG9wZXJhdG9yPj49KGJ5dGUmIF9fbGhzLCBfSW50ZWdlciBfX3NoaWZ0KSBub2V4Y2VwdAorICB7IHJldHVybiBfX2xocyA9IF9fbGhzID4+IF9fc2hpZnQ7IH0KKwordGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICBjb25zdGV4cHIgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2ludGVncmFsX3Y8X0ludGVnZXI+LCBieXRlPjo6dHlwZQorICBvcGVyYXRvcj4+IChieXRlICBfX2xocywgX0ludGVnZXIgX19zaGlmdCkgbm9leGNlcHQKKyAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Ynl0ZT4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihfX2xocykgPj4gX19zaGlmdCkpOyB9CisgIAordGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICBjb25zdGV4cHIgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2ludGVncmFsX3Y8X0ludGVnZXI+LCBfSW50ZWdlcj46OnR5cGUKKyAgdG9faW50ZWdlcihieXRlIF9fYikgbm9leGNlcHQgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X0ludGVnZXI+KF9fYik7IH0KKworfQorI2VuZGlmCisKKyNlbmRpZiAgLy8gX0xJQkNQUF9UWVBFX1RSQUlUUwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3R5cGVpbmRleCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS90eXBlaW5kZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU2NWNhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS90eXBlaW5kZXgKQEAgLTAsMCArMSwxMDMgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVpbmRleCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfVFlQRUlOREVYCisjZGVmaW5lIF9MSUJDUFBfVFlQRUlOREVYCisKKy8qCisKKyAgICB0eXBlaW5kZXggc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCitjbGFzcyB0eXBlX2luZGV4Cit7CitwdWJsaWM6CisgICAgdHlwZV9pbmRleChjb25zdCB0eXBlX2luZm8mIHJocykgbm9leGNlcHQ7CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgdHlwZV9pbmRleCYgcmhzKSBjb25zdCBub2V4Y2VwdDsKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgdHlwZV9pbmRleCYgcmhzKSBjb25zdCBub2V4Y2VwdDsKKyAgICBib29sIG9wZXJhdG9yPCAoY29uc3QgdHlwZV9pbmRleCYgcmhzKSBjb25zdCBub2V4Y2VwdDsKKyAgICBib29sIG9wZXJhdG9yPD0oY29uc3QgdHlwZV9pbmRleCYgcmhzKSBjb25zdCBub2V4Y2VwdDsKKyAgICBib29sIG9wZXJhdG9yPiAoY29uc3QgdHlwZV9pbmRleCYgcmhzKSBjb25zdCBub2V4Y2VwdDsKKyAgICBib29sIG9wZXJhdG9yPj0oY29uc3QgdHlwZV9pbmRleCYgcmhzKSBjb25zdCBub2V4Y2VwdDsKKworICAgIHNpemVfdCBoYXNoX2NvZGUoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Qgbm9leGNlcHQ7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGhhc2g8dHlwZV9pbmRleD4KKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlX2luZGV4LCBzaXplX3Q+Cit7CisgICAgc2l6ZV90IG9wZXJhdG9yKCkodHlwZV9pbmRleCBpbmRleCkgY29uc3Qgbm9leGNlcHQ7Cit9OworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPHR5cGVpbmZvPgorI2luY2x1ZGUgPF9fZnVuY3Rpb25hbF9iYXNlPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHR5cGVfaW5kZXgKK3sKKyAgICBjb25zdCB0eXBlX2luZm8qIF9fdF87CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHR5cGVfaW5kZXgoY29uc3QgdHlwZV9pbmZvJiBfX3kpIF9OT0VYQ0VQVCA6IF9fdF8oJl9feSkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgdHlwZV9pbmRleCYgX195KSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiAqX190XyA9PSAqX195Ll9fdF87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgdHlwZV9pbmRleCYgX195KSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiAqX190XyAhPSAqX195Ll9fdF87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yPCAoY29uc3QgdHlwZV9pbmRleCYgX195KSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiAgX190Xy0+YmVmb3JlKCpfX3kuX190Xyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yPD0oY29uc3QgdHlwZV9pbmRleCYgX195KSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiAhX195Ll9fdF8tPmJlZm9yZSgqX190Xyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yPiAoY29uc3QgdHlwZV9pbmRleCYgX195KSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiAgX195Ll9fdF8tPmJlZm9yZSgqX190Xyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yPj0oY29uc3QgdHlwZV9pbmRleCYgX195KSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiAhX190Xy0+YmVmb3JlKCpfX3kuX190Xyk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBoYXNoX2NvZGUoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RfLT5oYXNoX2NvZGUoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RfLT5uYW1lKCk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc2g7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDx0eXBlX2luZGV4PgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHR5cGVfaW5kZXgsIHNpemVfdD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IG9wZXJhdG9yKCkodHlwZV9pbmRleCBfX2luZGV4KSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2luZGV4Lmhhc2hfY29kZSgpO30KK307CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX1RZUEVJTkRFWApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3R5cGVpbmZvIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3R5cGVpbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZDk0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvdHlwZWluZm8KQEAgLTAsMCArMSwyNDAgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVpbmZvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9fTElCQ1BQX1RZUEVJTkZPCisjZGVmaW5lIF9fTElCQ1BQX1RZUEVJTkZPCisKKy8qCisKKyAgICB0eXBlaW5mbyBzeW5vcHNpcworCituYW1lc3BhY2Ugc3RkIHsKKworY2xhc3MgdHlwZV9pbmZvCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+dHlwZV9pbmZvKCk7CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgdHlwZV9pbmZvJiByaHMpIGNvbnN0IG5vZXhjZXB0OworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCB0eXBlX2luZm8mIHJocykgY29uc3Qgbm9leGNlcHQ7CisKKyAgICBib29sIGJlZm9yZShjb25zdCB0eXBlX2luZm8mIHJocykgY29uc3Qgbm9leGNlcHQ7CisgICAgc2l6ZV90IGhhc2hfY29kZSgpIGNvbnN0IG5vZXhjZXB0OworICAgIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIHR5cGVfaW5mbyhjb25zdCB0eXBlX2luZm8mIHJocykgPSBkZWxldGU7CisgICAgdHlwZV9pbmZvJiBvcGVyYXRvcj0oY29uc3QgdHlwZV9pbmZvJiByaHMpID0gZGVsZXRlOworfTsKKworY2xhc3MgYmFkX2Nhc3QKKyAgICA6IHB1YmxpYyBleGNlcHRpb24KK3sKK3B1YmxpYzoKKyAgICBiYWRfY2FzdCgpIG5vZXhjZXB0OworICAgIGJhZF9jYXN0KGNvbnN0IGJhZF9jYXN0Jikgbm9leGNlcHQ7CisgICAgYmFkX2Nhc3QmIG9wZXJhdG9yPShjb25zdCBiYWRfY2FzdCYpIG5vZXhjZXB0OworICAgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0OworfTsKKworY2xhc3MgYmFkX3R5cGVpZAorICAgIDogcHVibGljIGV4Y2VwdGlvbgoreworcHVibGljOgorICAgIGJhZF90eXBlaWQoKSBub2V4Y2VwdDsKKyAgICBiYWRfdHlwZWlkKGNvbnN0IGJhZF90eXBlaWQmKSBub2V4Y2VwdDsKKyAgICBiYWRfdHlwZWlkJiBvcGVyYXRvcj0oY29uc3QgYmFkX3R5cGVpZCYpIG5vZXhjZXB0OworICAgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0OworfTsKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxleGNlcHRpb24+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2lmZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworI2luY2x1ZGUgPGNzdGRsaWI+CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfQUJJX01JQ1JPU09GVCkgJiYgIWRlZmluZWQoX0xJQkNQUF9OT19WQ1JVTlRJTUUpCisjaW5jbHVkZSA8dmNydW50aW1lX3R5cGVpbmZvLmg+CisjZWxzZQorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9BQklfTUlDUk9TT0ZUKQorI2lmIGRlZmluZWQoX0xJQkNQUF9OT05VTklRVUVfUlRUSV9CSVQpCisjZGVmaW5lIF9MSUJDUFBfSEFTX05PTlVOSVFVRV9UWVBFSU5GTworI2Vsc2UKKyNkZWZpbmUgX0xJQkNQUF9IQVNfVU5JUVVFX1RZUEVJTkZPCisjZW5kaWYKKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkICAvLyBwdXJwb3NlZnVsbHkgbm90IHVzaW5nIHZlcnNpb25pbmcgbmFtZXNwYWNlCit7CisKK2NsYXNzIF9MSUJDUFBfRVhDRVBUSU9OX0FCSSB0eXBlX2luZm8KK3sKKyAgICB0eXBlX2luZm8mIG9wZXJhdG9yPShjb25zdCB0eXBlX2luZm8mKTsKKyAgICB0eXBlX2luZm8oY29uc3QgdHlwZV9pbmZvJik7CisKKyNpZiBkZWZpbmVkKF9MSUJDUFBfSEFTX05PTlVOSVFVRV9UWVBFSU5GTykKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaW50IF9fY29tcGFyZV9ub251bmlxdWVfbmFtZXMoY29uc3QgdHlwZV9pbmZvICZfX2FyZykgY29uc3QgX05PRVhDRVBUCisgICAgeyByZXR1cm4gX19idWlsdGluX3N0cmNtcChuYW1lKCksIF9fYXJnLm5hbWUoKSk7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTElCQ1BQX0FCSV9NSUNST1NPRlQpCisgICAgbXV0YWJsZSBzdHJ1Y3QgeworICAgICAgY29uc3QgY2hhciAqX191bmRlY29yYXRlZF9uYW1lOworICAgICAgY29uc3QgY2hhciBfX2RlY29yYXRlZF9uYW1lWzFdOworICAgIH0gX19kYXRhOworCisgICAgaW50IF9fY29tcGFyZShjb25zdCB0eXBlX2luZm8gJl9fcmhzKSBjb25zdCBfTk9FWENFUFQ7CisjZW5kaWYgLy8gX0xJQkNQUF9BQklfTUlDUk9TT0ZUCisKK3Byb3RlY3RlZDoKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0FCSV9NSUNST1NPRlQpCisjaWYgZGVmaW5lZChfTElCQ1BQX0hBU19OT05VTklRVUVfVFlQRUlORk8pCisgICAgLy8gQSBjb25zdCBjaGFyKiB3aXRoIHRoZSBub24tdW5pcXVlIFJUVEkgYml0IHBvc3NpYmx5IHNldC4KKyAgICB1aW50cHRyX3QgX190eXBlX25hbWU7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgdHlwZV9pbmZvKGNvbnN0IGNoYXIqIF9fbikKKyAgICAgIDogX190eXBlX25hbWUocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KF9fbikpIHt9CisjZWxzZQorICAgIGNvbnN0IGNoYXIgKl9fdHlwZV9uYW1lOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IHR5cGVfaW5mbyhjb25zdCBjaGFyKiBfX24pIDogX190eXBlX25hbWUoX19uKSB7fQorI2VuZGlmCisjZW5kaWYgLy8gISBfTElCQ1BQX0FCSV9NSUNST1NPRlQKKworcHVibGljOgorICAgIF9MSUJDUFBfQVZBSUxBQklMSVRZX1RZUEVJTkZPX1ZUQUJMRQorICAgIHZpcnR1YWwgfnR5cGVfaW5mbygpOworCisjaWYgZGVmaW5lZChfTElCQ1BQX0FCSV9NSUNST1NPRlQpCisgICAgY29uc3QgY2hhciAqbmFtZSgpIGNvbnN0IF9OT0VYQ0VQVDsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIGJlZm9yZShjb25zdCB0eXBlX2luZm8mIF9fYXJnKSBjb25zdCBfTk9FWENFUFQgeworICAgICAgcmV0dXJuIF9fY29tcGFyZShfX2FyZykgPCAwOworICAgIH0KKworICAgIHNpemVfdCBoYXNoX2NvZGUoKSBjb25zdCBfTk9FWENFUFQ7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHR5cGVfaW5mbyYgX19hcmcpIGNvbnN0IF9OT0VYQ0VQVCB7CisgICAgICByZXR1cm4gX19jb21wYXJlKF9fYXJnKSA9PSAwOworICAgIH0KKyNlbHNlCisjaWYgZGVmaW5lZChfTElCQ1BQX0hBU19OT05VTklRVUVfVFlQRUlORk8pCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCBfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oX190eXBlX25hbWUgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5fTElCQ1BQX05PTlVOSVFVRV9SVFRJX0JJVCk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgYmVmb3JlKGNvbnN0IHR5cGVfaW5mbyYgX19hcmcpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGlmICghKChfX3R5cGVfbmFtZSAmIF9fYXJnLl9fdHlwZV9uYW1lKSAmIF9MSUJDUFBfTk9OVU5JUVVFX1JUVElfQklUKSkKKyAgICAgICAgcmV0dXJuIF9fdHlwZV9uYW1lIDwgX19hcmcuX190eXBlX25hbWU7CisgICAgICByZXR1cm4gX19jb21wYXJlX25vbnVuaXF1ZV9uYW1lcyhfX2FyZykgPCAwOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3QgaGFzaF9jb2RlKCkgY29uc3QgX05PRVhDRVBUCisgICAgeworICAgICAgaWYgKCEoX190eXBlX25hbWUgJiBfTElCQ1BQX05PTlVOSVFVRV9SVFRJX0JJVCkpCisgICAgICAgIHJldHVybiBfX3R5cGVfbmFtZTsKKworICAgICAgY29uc3QgY2hhciogX19wdHIgPSBuYW1lKCk7CisgICAgICBzaXplX3QgX19oYXNoID0gNTM4MTsKKyAgICAgIHdoaWxlICh1bnNpZ25lZCBjaGFyIF9fYyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCpfX3B0cisrKSkKKyAgICAgICAgX19oYXNoID0gKF9faGFzaCAqIDMzKSBeIF9fYzsKKyAgICAgIHJldHVybiBfX2hhc2g7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCB0eXBlX2luZm8mIF9fYXJnKSBjb25zdCBfTk9FWENFUFQKKyAgICB7CisgICAgICBpZiAoX190eXBlX25hbWUgPT0gX19hcmcuX190eXBlX25hbWUpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBpZiAoISgoX190eXBlX25hbWUgJiBfX2FyZy5fX3R5cGVfbmFtZSkgJiBfTElCQ1BQX05PTlVOSVFVRV9SVFRJX0JJVCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiBfX2NvbXBhcmVfbm9udW5pcXVlX25hbWVzKF9fYXJnKSA9PSAwOworICAgIH0KKyNlbHNlCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCBfTk9FWENFUFQKKyAgICB7IHJldHVybiBfX3R5cGVfbmFtZTsgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgYmVmb3JlKGNvbnN0IHR5cGVfaW5mbyYgX19hcmcpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIF9fdHlwZV9uYW1lIDwgX19hcmcuX190eXBlX25hbWU7IH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3QgaGFzaF9jb2RlKCkgY29uc3QgX05PRVhDRVBUCisgICAgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KF9fdHlwZV9uYW1lKTsgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCB0eXBlX2luZm8mIF9fYXJnKSBjb25zdCBfTk9FWENFUFQKKyAgICB7IHJldHVybiBfX3R5cGVfbmFtZSA9PSBfX2FyZy5fX3R5cGVfbmFtZTsgfQorI2VuZGlmCisjZW5kaWYgLy8gX0xJQkNQUF9BQklfTUlDUk9TT0ZUCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHR5cGVfaW5mbyYgX19hcmcpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuICFvcGVyYXRvcj09KF9fYXJnKTsgfQorfTsKKworY2xhc3MgX0xJQkNQUF9FWENFUFRJT05fQUJJIGJhZF9jYXN0CisgICAgOiBwdWJsaWMgZXhjZXB0aW9uCit7CitwdWJsaWM6CisgICAgYmFkX2Nhc3QoKSBfTk9FWENFUFQ7CisgICAgdmlydHVhbCB+YmFkX2Nhc3QoKSBfTk9FWENFUFQ7CisgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgX05PRVhDRVBUOworfTsKKworY2xhc3MgX0xJQkNQUF9FWENFUFRJT05fQUJJIGJhZF90eXBlaWQKKyAgICA6IHB1YmxpYyBleGNlcHRpb24KK3sKK3B1YmxpYzoKKyAgICBiYWRfdHlwZWlkKCkgX05PRVhDRVBUOworICAgIHZpcnR1YWwgfmJhZF90eXBlaWQoKSBfTk9FWENFUFQ7CisgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgX05PRVhDRVBUOworfTsKKworfSAgLy8gc3RkCisKKyNlbmRpZiAvLyBkZWZpbmVkKF9MSUJDUFBfQUJJX01JQ1JPU09GVCkgJiYgIWRlZmluZWQoX0xJQkNQUF9OT19WQ1JVTlRJTUUpCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorX0xJQkNQUF9OT1JFVFVSTiBpbmxpbmUgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCit2b2lkIF9fdGhyb3dfYmFkX2Nhc3QoKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0aHJvdyBiYWRfY2FzdCgpOworI2Vsc2UKKwlfVlNURDo6YWJvcnQoKTsKKyNlbmRpZgorfQorX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCisjZW5kaWYgIC8vIF9fTElCQ1BQX1RZUEVJTkZPCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvdW5vcmRlcmVkX21hcCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS91bm9yZGVyZWRfbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNWNiNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvdW5vcmRlcmVkX21hcApAQCAtMCwwICsxLDIwNDMgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHVub3JkZXJlZF9tYXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfVU5PUkRFUkVEX01BUAorI2RlZmluZSBfTElCQ1BQX1VOT1JERVJFRF9NQVAKKworLyoKKworICAgIHVub3JkZXJlZF9tYXAgc3lub3BzaXMKKworI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisKK25hbWVzcGFjZSBzdGQKK3sKKwordGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVCwgY2xhc3MgSGFzaCA9IGhhc2g8S2V5PiwgY2xhc3MgUHJlZCA9IGVxdWFsX3RvPEtleT4sCisgICAgICAgICAgY2xhc3MgQWxsb2MgPSBhbGxvY2F0b3I8cGFpcjxjb25zdCBLZXksIFQ+Pj4KK2NsYXNzIHVub3JkZXJlZF9tYXAKK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICB0eXBlZGVmIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkX3R5cGU7CisgICAgdHlwZWRlZiBIYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlcjsKKyAgICB0eXBlZGVmIFByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2VxdWFsOworICAgIHR5cGVkZWYgQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHBhaXI8Y29uc3Qga2V5X3R5cGUsIG1hcHBlZF90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPjo6cG9pbnRlciAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPjo6Y29uc3RfcG9pbnRlciAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPjo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgdHlwZWRlZiAvdW5zcGVjaWZpZWQvIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgL3Vuc3BlY2lmaWVkLyBjb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIC91bnNwZWNpZmllZC8gbG9jYWxfaXRlcmF0b3I7CisgICAgdHlwZWRlZiAvdW5zcGVjaWZpZWQvIGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworCisgICAgdW5vcmRlcmVkX21hcCgpCisgICAgICAgIG5vZXhjZXB0KAorICAgICAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8aGFzaGVyPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGtleV9lcXVhbD46OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKTsKKyAgICBleHBsaWNpdCB1bm9yZGVyZWRfbWFwKHNpemVfdHlwZSBuLCBjb25zdCBoYXNoZXImIGhmID0gaGFzaGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIGVxbCA9IGtleV9lcXVhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdW5vcmRlcmVkX21hcChJbnB1dEl0ZXJhdG9yIGYsIElucHV0SXRlcmF0b3IgbCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgbiA9IDAsIGNvbnN0IGhhc2hlciYgaGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIGVxbCA9IGtleV9lcXVhbCgpLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSk7CisgICAgZXhwbGljaXQgdW5vcmRlcmVkX21hcChjb25zdCBhbGxvY2F0b3JfdHlwZSYpOworICAgIHVub3JkZXJlZF9tYXAoY29uc3QgdW5vcmRlcmVkX21hcCYpOworICAgIHVub3JkZXJlZF9tYXAoY29uc3QgdW5vcmRlcmVkX21hcCYsIGNvbnN0IEFsbG9jYXRvciYpOworICAgIHVub3JkZXJlZF9tYXAodW5vcmRlcmVkX21hcCYmKQorICAgICAgICBub2V4Y2VwdCgKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGhhc2hlcj46OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxrZXlfZXF1YWw+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisgICAgdW5vcmRlcmVkX21hcCh1bm9yZGVyZWRfbWFwJiYsIGNvbnN0IEFsbG9jYXRvciYpOworICAgIHVub3JkZXJlZF9tYXAoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiwgc2l6ZV90eXBlIG4gPSAwLAorICAgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBoZiA9IGhhc2hlcigpLCBjb25zdCBrZXlfZXF1YWwmIGVxbCA9IGtleV9lcXVhbCgpLAorICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKyAgICB1bm9yZGVyZWRfbWFwKHNpemVfdHlwZSBuLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSkKKyAgICAgIDogdW5vcmRlcmVkX21hcChuLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGEpIHt9ICAvLyBDKysxNAorICAgIHVub3JkZXJlZF9tYXAoc2l6ZV90eXBlIG4sIGNvbnN0IGhhc2hlciYgaGYsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKQorICAgICAgOiB1bm9yZGVyZWRfbWFwKG4sIGhmLCBrZXlfZXF1YWwoKSwgYSkge30gIC8vIEMrKzE0CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICB1bm9yZGVyZWRfbWFwKElucHV0SXRlcmF0b3IgZiwgSW5wdXRJdGVyYXRvciBsLCBzaXplX3R5cGUgbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpCisgICAgICA6IHVub3JkZXJlZF9tYXAoZiwgbCwgbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhKSB7fSAgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgIHVub3JkZXJlZF9tYXAoSW5wdXRJdGVyYXRvciBmLCBJbnB1dEl0ZXJhdG9yIGwsIHNpemVfdHlwZSBuLCBjb25zdCBoYXNoZXImIGhmLCAKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpCisgICAgICA6IHVub3JkZXJlZF9tYXAoZiwgbCwgbiwgaGYsIGtleV9lcXVhbCgpLCBhKSB7fSAgLy8gQysrMTQKKyAgICB1bm9yZGVyZWRfbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwsIHNpemVfdHlwZSBuLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSkKKyAgICAgIDogdW5vcmRlcmVkX21hcChpbCwgbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhKSB7fSAgLy8gQysrMTQKKyAgICB1bm9yZGVyZWRfbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwsIHNpemVfdHlwZSBuLCBjb25zdCBoYXNoZXImIGhmLCAKKyAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKQorICAgICAgOiB1bm9yZGVyZWRfbWFwKGlsLCBuLCBoZiwga2V5X2VxdWFsKCksIGEpIHt9ICAvLyBDKysxNAorICAgIH51bm9yZGVyZWRfbWFwKCk7CisgICAgdW5vcmRlcmVkX21hcCYgb3BlcmF0b3I9KGNvbnN0IHVub3JkZXJlZF9tYXAmKTsKKyAgICB1bm9yZGVyZWRfbWFwJiBvcGVyYXRvcj0odW5vcmRlcmVkX21hcCYmKQorICAgICAgICBub2V4Y2VwdCgKKyAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGhhc2hlcj46OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxrZXlfZXF1YWw+Ojp2YWx1ZSk7CisgICAgdW5vcmRlcmVkX21hcCYgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4pOworCisgICAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IG5vZXhjZXB0OworCisgICAgYm9vbCAgICAgIGVtcHR5KCkgY29uc3Qgbm9leGNlcHQ7CisgICAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIGl0ZXJhdG9yICAgICAgIGJlZ2luKCkgbm9leGNlcHQ7CisgICAgaXRlcmF0b3IgICAgICAgZW5kKCkgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSAgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICAgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgY2VuZCgpICAgY29uc3Qgbm9leGNlcHQ7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KKyAgICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gZW1wbGFjZShBcmdzJiYuLi4gYXJncyk7CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CisgICAgICAgIGl0ZXJhdG9yIGVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgQXJncyYmLi4uIGFyZ3MpOworICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBvYmopOworICAgIHRlbXBsYXRlIDxjbGFzcyBQPgorICAgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnQoUCYmIG9iaik7CisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIGhpbnQsIGNvbnN0IHZhbHVlX3R5cGUmIG9iaik7CisgICAgdGVtcGxhdGUgPGNsYXNzIFA+CisgICAgICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBoaW50LCBQJiYgb2JqKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZCBpbnNlcnQoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0KTsKKyAgICB2b2lkIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorICAgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiB0cnlfZW1wbGFjZShjb25zdCBrZXlfdHlwZSYgaywgQXJncyYmLi4uIGFyZ3MpOyAgICAgICAgICAvLyBDKysxNworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorICAgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiB0cnlfZW1wbGFjZShrZXlfdHlwZSYmIGssIEFyZ3MmJi4uLiBhcmdzKTsgICAgICAgICAgICAgICAvLyBDKysxNworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorICAgICAgICBpdGVyYXRvciB0cnlfZW1wbGFjZShjb25zdF9pdGVyYXRvciBoaW50LCBjb25zdCBrZXlfdHlwZSYgaywgQXJncyYmLi4uIGFyZ3MpOyAvLyBDKysxNworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorICAgICAgICBpdGVyYXRvciB0cnlfZW1wbGFjZShjb25zdF9pdGVyYXRvciBoaW50LCBrZXlfdHlwZSYmIGssIEFyZ3MmJi4uLiBhcmdzKTsgICAgICAvLyBDKysxNworICAgIHRlbXBsYXRlIDxjbGFzcyBNPgorICAgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnRfb3JfYXNzaWduKGNvbnN0IGtleV90eXBlJiBrLCBNJiYgb2JqKTsgICAgICAgICAgICAvLyBDKysxNworICAgIHRlbXBsYXRlIDxjbGFzcyBNPgorICAgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnRfb3JfYXNzaWduKGtleV90eXBlJiYgaywgTSYmIG9iaik7ICAgICAgICAgICAgICAgICAvLyBDKysxNworICAgIHRlbXBsYXRlIDxjbGFzcyBNPgorICAgICAgICBpdGVyYXRvciBpbnNlcnRfb3JfYXNzaWduKGNvbnN0X2l0ZXJhdG9yIGhpbnQsIGNvbnN0IGtleV90eXBlJiBrLCBNJiYgb2JqKTsgICAvLyBDKysxNworICAgIHRlbXBsYXRlIDxjbGFzcyBNPgorICAgICAgICBpdGVyYXRvciBpbnNlcnRfb3JfYXNzaWduKGNvbnN0X2l0ZXJhdG9yIGhpbnQsIGtleV90eXBlJiYgaywgTSYmIG9iaik7ICAgICAgICAvLyBDKysxNworCisgICAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24pOworICAgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIHBvc2l0aW9uKTsgIC8vIEMrKzE0CisgICAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCk7CisgICAgdm9pZCBjbGVhcigpIG5vZXhjZXB0OworCisgICAgdm9pZCBzd2FwKHVub3JkZXJlZF9tYXAmKQorICAgICAgICBub2V4Y2VwdCgKKyAgICAgICAgICAgICghYWxsb2NhdG9yX3R5cGU6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDo6dmFsdWUgfHwKKyAgICAgICAgICAgICBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpICYmCisgICAgICAgICAgICBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPGhhc2hlcj46OnZhbHVlICYmCisgICAgICAgICAgICBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPGtleV9lcXVhbD46OnZhbHVlKTsKKworICAgIGhhc2hlciBoYXNoX2Z1bmN0aW9uKCkgY29uc3Q7CisgICAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0OworCisgICAgaXRlcmF0b3IgICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgayk7CisgICAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisgICAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IGtleV90eXBlJiBrKSBjb25zdDsKKyAgICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gICAgICAgICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIGspOworICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisKKyAgICBtYXBwZWRfdHlwZSYgb3BlcmF0b3JbXShjb25zdCBrZXlfdHlwZSYgayk7CisgICAgbWFwcGVkX3R5cGUmIG9wZXJhdG9yW10oa2V5X3R5cGUmJiBrKTsKKworICAgIG1hcHBlZF90eXBlJiAgICAgICBhdChjb25zdCBrZXlfdHlwZSYgayk7CisgICAgY29uc3QgbWFwcGVkX3R5cGUmIGF0KGNvbnN0IGtleV90eXBlJiBrKSBjb25zdDsKKworICAgIHNpemVfdHlwZSBidWNrZXRfY291bnQoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0IG5vZXhjZXB0OworCisgICAgc2l6ZV90eXBlIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBuKSBjb25zdDsKKyAgICBzaXplX3R5cGUgYnVja2V0KGNvbnN0IGtleV90eXBlJiBrKSBjb25zdDsKKworICAgIGxvY2FsX2l0ZXJhdG9yICAgICAgIGJlZ2luKHNpemVfdHlwZSBuKTsKKyAgICBsb2NhbF9pdGVyYXRvciAgICAgICBlbmQoc2l6ZV90eXBlIG4pOworICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGJlZ2luKHNpemVfdHlwZSBuKSBjb25zdDsKKyAgICBjb25zdF9sb2NhbF9pdGVyYXRvciBlbmQoc2l6ZV90eXBlIG4pIGNvbnN0OworICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGNiZWdpbihzaXplX3R5cGUgbikgY29uc3Q7CisgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IgY2VuZChzaXplX3R5cGUgbikgY29uc3Q7CisKKyAgICBmbG9hdCBsb2FkX2ZhY3RvcigpIGNvbnN0IG5vZXhjZXB0OworICAgIGZsb2F0IG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IG5vZXhjZXB0OworICAgIHZvaWQgbWF4X2xvYWRfZmFjdG9yKGZsb2F0IHopOworICAgIHZvaWQgcmVoYXNoKHNpemVfdHlwZSBuKTsKKyAgICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIG4pOworfTsKKwordGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVCwgY2xhc3MgSGFzaCwgY2xhc3MgUHJlZCwgY2xhc3MgQWxsb2M+CisgICAgdm9pZCBzd2FwKHVub3JkZXJlZF9tYXA8S2V5LCBULCBIYXNoLCBQcmVkLCBBbGxvYz4mIHgsCisgICAgICAgICAgICAgIHVub3JkZXJlZF9tYXA8S2V5LCBULCBIYXNoLCBQcmVkLCBBbGxvYz4mIHkpCisgICAgICAgICAgICAgIG5vZXhjZXB0KG5vZXhjZXB0KHguc3dhcCh5KSkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBULCBjbGFzcyBIYXNoLCBjbGFzcyBQcmVkLCBjbGFzcyBBbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbWFwPEtleSwgVCwgSGFzaCwgUHJlZCwgQWxsb2M+JiB4LAorICAgICAgICAgICAgICAgY29uc3QgdW5vcmRlcmVkX21hcDxLZXksIFQsIEhhc2gsIFByZWQsIEFsbG9jPiYgeSk7CisKK3RlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIEhhc2gsIGNsYXNzIFByZWQsIGNsYXNzIEFsbG9jPgorICAgIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHVub3JkZXJlZF9tYXA8S2V5LCBULCBIYXNoLCBQcmVkLCBBbGxvYz4mIHgsCisgICAgICAgICAgICAgICBjb25zdCB1bm9yZGVyZWRfbWFwPEtleSwgVCwgSGFzaCwgUHJlZCwgQWxsb2M+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVCwgY2xhc3MgSGFzaCA9IGhhc2g8S2V5PiwgY2xhc3MgUHJlZCA9IGVxdWFsX3RvPEtleT4sCisgICAgICAgICAgY2xhc3MgQWxsb2MgPSBhbGxvY2F0b3I8cGFpcjxjb25zdCBLZXksIFQ+Pj4KK2NsYXNzIHVub3JkZXJlZF9tdWx0aW1hcAoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBLZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgIHR5cGVkZWYgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRfdHlwZTsKKyAgICB0eXBlZGVmIEhhc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaGVyOworICAgIHR5cGVkZWYgUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfZXF1YWw7CisgICAgdHlwZWRlZiBBbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgcGFpcjxjb25zdCBrZXlfdHlwZSwgbWFwcGVkX3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+Ojpwb2ludGVyICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+Ojpjb25zdF9wb2ludGVyICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+OjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICB0eXBlZGVmIC91bnNwZWNpZmllZC8gaXRlcmF0b3I7CisgICAgdHlwZWRlZiAvdW5zcGVjaWZpZWQvIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgL3Vuc3BlY2lmaWVkLyBsb2NhbF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIC91bnNwZWNpZmllZC8gY29uc3RfbG9jYWxfaXRlcmF0b3I7CisKKyAgICB1bm9yZGVyZWRfbXVsdGltYXAoKQorICAgICAgICBub2V4Y2VwdCgKKyAgICAgICAgICAgIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGhhc2hlcj46OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxrZXlfZXF1YWw+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisgICAgZXhwbGljaXQgdW5vcmRlcmVkX211bHRpbWFwKHNpemVfdHlwZSBuLCBjb25zdCBoYXNoZXImIGhmID0gaGFzaGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIGVxbCA9IGtleV9lcXVhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdW5vcmRlcmVkX211bHRpbWFwKElucHV0SXRlcmF0b3IgZiwgSW5wdXRJdGVyYXRvciBsLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBuID0gMCwgY29uc3QgaGFzaGVyJiBoZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgZXFsID0ga2V5X2VxdWFsKCksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKyAgICBleHBsaWNpdCB1bm9yZGVyZWRfbXVsdGltYXAoY29uc3QgYWxsb2NhdG9yX3R5cGUmKTsKKyAgICB1bm9yZGVyZWRfbXVsdGltYXAoY29uc3QgdW5vcmRlcmVkX211bHRpbWFwJik7CisgICAgdW5vcmRlcmVkX211bHRpbWFwKGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcCYsIGNvbnN0IEFsbG9jYXRvciYpOworICAgIHVub3JkZXJlZF9tdWx0aW1hcCh1bm9yZGVyZWRfbXVsdGltYXAmJikKKyAgICAgICAgbm9leGNlcHQoCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxoYXNoZXI+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8a2V5X2VxdWFsPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpOworICAgIHVub3JkZXJlZF9tdWx0aW1hcCh1bm9yZGVyZWRfbXVsdGltYXAmJiwgY29uc3QgQWxsb2NhdG9yJik7CisgICAgdW5vcmRlcmVkX211bHRpbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4sIHNpemVfdHlwZSBuID0gMCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hlciYgaGYgPSBoYXNoZXIoKSwgY29uc3Qga2V5X2VxdWFsJiBlcWwgPSBrZXlfZXF1YWwoKSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSk7CisgICAgdW5vcmRlcmVkX211bHRpbWFwKHNpemVfdHlwZSBuLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSkKKyAgICAgIDogdW5vcmRlcmVkX211bHRpbWFwKG4sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYSkge30gIC8vIEMrKzE0CisgICAgdW5vcmRlcmVkX211bHRpbWFwKHNpemVfdHlwZSBuLCBjb25zdCBoYXNoZXImIGhmLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSkKKyAgICAgIDogdW5vcmRlcmVkX211bHRpbWFwKG4sIGhmLCBrZXlfZXF1YWwoKSwgYSkge30gIC8vIEMrKzE0CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAoSW5wdXRJdGVyYXRvciBmLCBJbnB1dEl0ZXJhdG9yIGwsIHNpemVfdHlwZSBuLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSkKKyAgICAgIDogdW5vcmRlcmVkX211bHRpbWFwKGYsIGwsIG4sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYSkge30gIC8vIEMrKzE0CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAoSW5wdXRJdGVyYXRvciBmLCBJbnB1dEl0ZXJhdG9yIGwsIHNpemVfdHlwZSBuLCBjb25zdCBoYXNoZXImIGhmLCAKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpCisgICAgICA6IHVub3JkZXJlZF9tdWx0aW1hcChmLCBsLCBuLCBoZiwga2V5X2VxdWFsKCksIGEpIHt9ICAvLyBDKysxNAorICAgIHVub3JkZXJlZF9tdWx0aW1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IGlsLCBzaXplX3R5cGUgbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpCisgICAgICA6IHVub3JkZXJlZF9tdWx0aW1hcChpbCwgbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhKSB7fSAgLy8gQysrMTQKKyAgICB1bm9yZGVyZWRfbXVsdGltYXAoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBpbCwgc2l6ZV90eXBlIG4sIGNvbnN0IGhhc2hlciYgaGYsIAorICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpCisgICAgICA6IHVub3JkZXJlZF9tdWx0aW1hcChpbCwgbiwgaGYsIGtleV9lcXVhbCgpLCBhKSB7fSAgLy8gQysrMTQKKyAgICB+dW5vcmRlcmVkX211bHRpbWFwKCk7CisgICAgdW5vcmRlcmVkX211bHRpbWFwJiBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX211bHRpbWFwJik7CisgICAgdW5vcmRlcmVkX211bHRpbWFwJiBvcGVyYXRvcj0odW5vcmRlcmVkX211bHRpbWFwJiYpCisgICAgICAgIG5vZXhjZXB0KAorICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8aGFzaGVyPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGtleV9lcXVhbD46OnZhbHVlKTsKKyAgICB1bm9yZGVyZWRfbXVsdGltYXAmIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+KTsKKworICAgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIGJvb2wgICAgICBlbXB0eSgpIGNvbnN0IG5vZXhjZXB0OworICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICBpdGVyYXRvciAgICAgICBiZWdpbigpIG5vZXhjZXB0OworICAgIGl0ZXJhdG9yICAgICAgIGVuZCgpIG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgIGNvbnN0IG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpICAgIGNvbnN0IG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yIGNlbmQoKSAgIGNvbnN0IG5vZXhjZXB0OworCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CisgICAgICAgIGl0ZXJhdG9yIGVtcGxhY2UoQXJncyYmLi4uIGFyZ3MpOworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorICAgICAgICBpdGVyYXRvciBlbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24sIEFyZ3MmJi4uLiBhcmdzKTsKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgb2JqKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUD4KKyAgICAgICAgaXRlcmF0b3IgaW5zZXJ0KFAmJiBvYmopOworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBoaW50LCBjb25zdCB2YWx1ZV90eXBlJiBvYmopOworICAgIHRlbXBsYXRlIDxjbGFzcyBQPgorICAgICAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgaGludCwgUCYmIG9iaik7CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQgaW5zZXJ0KElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCk7CisgICAgdm9pZCBpbnNlcnQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPik7CisKKyAgICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBwb3NpdGlvbik7CisgICAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgcG9zaXRpb24pOyAgLy8gQysrMTQKKyAgICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIGspOworICAgIGl0ZXJhdG9yIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIGZpcnN0LCBjb25zdF9pdGVyYXRvciBsYXN0KTsKKyAgICB2b2lkIGNsZWFyKCkgbm9leGNlcHQ7CisKKyAgICB2b2lkIHN3YXAodW5vcmRlcmVkX211bHRpbWFwJikKKyAgICAgICAgbm9leGNlcHQoCisgICAgICAgICAgICAoIWFsbG9jYXRvcl90eXBlOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXA6OnZhbHVlIHx8CisgICAgICAgICAgICAgX19pc19ub3Rocm93X3N3YXBwYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKSAmJgorICAgICAgICAgICAgX19pc19ub3Rocm93X3N3YXBwYWJsZTxoYXNoZXI+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgX19pc19ub3Rocm93X3N3YXBwYWJsZTxrZXlfZXF1YWw+Ojp2YWx1ZSk7CisKKyAgICBoYXNoZXIgaGFzaF9mdW5jdGlvbigpIGNvbnN0OworICAgIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdDsKKworICAgIGl0ZXJhdG9yICAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIGspOworICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworICAgIHNpemVfdHlwZSBjb3VudChjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+ICAgICAgICAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworCisgICAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IG5vZXhjZXB0OworICAgIHNpemVfdHlwZSBtYXhfYnVja2V0X2NvdW50KCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICBzaXplX3R5cGUgYnVja2V0X3NpemUoc2l6ZV90eXBlIG4pIGNvbnN0OworICAgIHNpemVfdHlwZSBidWNrZXQoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworCisgICAgbG9jYWxfaXRlcmF0b3IgICAgICAgYmVnaW4oc2l6ZV90eXBlIG4pOworICAgIGxvY2FsX2l0ZXJhdG9yICAgICAgIGVuZChzaXplX3R5cGUgbik7CisgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIG4pIGNvbnN0OworICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGVuZChzaXplX3R5cGUgbikgY29uc3Q7CisgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IgY2JlZ2luKHNpemVfdHlwZSBuKSBjb25zdDsKKyAgICBjb25zdF9sb2NhbF9pdGVyYXRvciBjZW5kKHNpemVfdHlwZSBuKSBjb25zdDsKKworICAgIGZsb2F0IGxvYWRfZmFjdG9yKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgZmxvYXQgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgdm9pZCBtYXhfbG9hZF9mYWN0b3IoZmxvYXQgeik7CisgICAgdm9pZCByZWhhc2goc2l6ZV90eXBlIG4pOworICAgIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgbik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBULCBjbGFzcyBIYXNoLCBjbGFzcyBQcmVkLCBjbGFzcyBBbGxvYz4KKyAgICB2b2lkIHN3YXAodW5vcmRlcmVkX211bHRpbWFwPEtleSwgVCwgSGFzaCwgUHJlZCwgQWxsb2M+JiB4LAorICAgICAgICAgICAgICB1bm9yZGVyZWRfbXVsdGltYXA8S2V5LCBULCBIYXNoLCBQcmVkLCBBbGxvYz4mIHkpCisgICAgICAgICAgICAgIG5vZXhjZXB0KG5vZXhjZXB0KHguc3dhcCh5KSkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBULCBjbGFzcyBIYXNoLCBjbGFzcyBQcmVkLCBjbGFzcyBBbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8S2V5LCBULCBIYXNoLCBQcmVkLCBBbGxvYz4mIHgsCisgICAgICAgICAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8S2V5LCBULCBIYXNoLCBQcmVkLCBBbGxvYz4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBULCBjbGFzcyBIYXNoLCBjbGFzcyBQcmVkLCBjbGFzcyBBbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8S2V5LCBULCBIYXNoLCBQcmVkLCBBbGxvYz4mIHgsCisgICAgICAgICAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8S2V5LCBULCBIYXNoLCBQcmVkLCBBbGxvYz4mIHkpOworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPF9faGFzaF90YWJsZT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDx0dXBsZT4KKworI2luY2x1ZGUgPF9fZGVidWc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9DcCwgY2xhc3MgX0hhc2gsIGJvb2wgX0lzRW1wdHk+CitjbGFzcyBfX3Vub3JkZXJlZF9tYXBfaGFzaGVyCisgICAgOiBwcml2YXRlIF9IYXNoCit7CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fdW5vcmRlcmVkX21hcF9oYXNoZXIoKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9IYXNoPjo6dmFsdWUpCisgICAgICAgIDogX0hhc2goKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3Vub3JkZXJlZF9tYXBfaGFzaGVyKGNvbnN0IF9IYXNoJiBfX2gpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8X0hhc2g+Ojp2YWx1ZSkKKyAgICAgICAgOiBfSGFzaChfX2gpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IF9IYXNoJiBoYXNoX2Z1bmN0aW9uKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBfQ3AmIF9feCkgY29uc3QKKyAgICAgICAge3JldHVybiBzdGF0aWNfY2FzdDxjb25zdCBfSGFzaCY+KCp0aGlzKShfX3guX19jYy5maXJzdCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBfS2V5JiBfX3gpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgX0hhc2gmPigqdGhpcykoX194KTt9CisgICAgdm9pZCBzd2FwKF9fdW5vcmRlcmVkX21hcF9oYXNoZXImX195KQorICAgICAgICBfTk9FWENFUFRfKF9faXNfbm90aHJvd19zd2FwcGFibGU8X0hhc2g+Ojp2YWx1ZSkKKyAgICB7CisgICAgICAgIHVzaW5nIF9WU1REOjpzd2FwOworICAgICAgICBzd2FwKHN0YXRpY19jYXN0PF9IYXNoJj4oKnRoaXMpLCBzdGF0aWNfY2FzdDxfSGFzaCY+KF9feSkpOworICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ3AsIGNsYXNzIF9IYXNoPgorY2xhc3MgX191bm9yZGVyZWRfbWFwX2hhc2hlcjxfS2V5LCBfQ3AsIF9IYXNoLCBmYWxzZT4KK3sKKyAgICBfSGFzaCBfX2hhc2hfOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3Vub3JkZXJlZF9tYXBfaGFzaGVyKCkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxfSGFzaD46OnZhbHVlKQorICAgICAgICA6IF9faGFzaF8oKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3Vub3JkZXJlZF9tYXBfaGFzaGVyKGNvbnN0IF9IYXNoJiBfX2gpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8X0hhc2g+Ojp2YWx1ZSkKKyAgICAgICAgOiBfX2hhc2hfKF9faCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgX0hhc2gmIGhhc2hfZnVuY3Rpb24oKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX2hhc2hfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgX0NwJiBfX3gpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX19oYXNoXyhfX3guX19jYy5maXJzdCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBfS2V5JiBfX3gpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX19oYXNoXyhfX3gpO30KKyAgICB2b2lkIHN3YXAoX191bm9yZGVyZWRfbWFwX2hhc2hlciZfX3kpCisgICAgICAgIF9OT0VYQ0VQVF8oX19pc19ub3Rocm93X3N3YXBwYWJsZTxfSGFzaD46OnZhbHVlKQorICAgIHsKKyAgICAgICAgdXNpbmcgX1ZTVEQ6OnN3YXA7CisgICAgICAgIHN3YXAoX19oYXNoXywgX195Ll9faGFzaF8pOworICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ3AsIGNsYXNzIF9IYXNoLCBib29sIF9fYj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzd2FwKF9fdW5vcmRlcmVkX21hcF9oYXNoZXI8X0tleSwgX0NwLCBfSGFzaCwgX19iPiYgX194LAorICAgICBfX3Vub3JkZXJlZF9tYXBfaGFzaGVyPF9LZXksIF9DcCwgX0hhc2gsIF9fYj4mIF9feSkKKyAgICBfTk9FWENFUFRfKF9OT0VYQ0VQVF8oX194LnN3YXAoX195KSkpCit7CisgICAgX194LnN3YXAoX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9DcCwgY2xhc3MgX1ByZWQsIGJvb2wgX0lzRW1wdHk+CitjbGFzcyBfX3Vub3JkZXJlZF9tYXBfZXF1YWwKKyAgICA6IHByaXZhdGUgX1ByZWQKK3sKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX191bm9yZGVyZWRfbWFwX2VxdWFsKCkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxfUHJlZD46OnZhbHVlKQorICAgICAgICA6IF9QcmVkKCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX191bm9yZGVyZWRfbWFwX2VxdWFsKGNvbnN0IF9QcmVkJiBfX3ApCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8X1ByZWQ+Ojp2YWx1ZSkKKyAgICAgICAgOiBfUHJlZChfX3ApIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IF9QcmVkJiBrZXlfZXEoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfQ3AmIF9feCwgY29uc3QgX0NwJiBfX3kpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgX1ByZWQmPigqdGhpcykoX194Ll9fY2MuZmlyc3QsIF9feS5fX2NjLmZpcnN0KTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfQ3AmIF9feCwgY29uc3QgX0tleSYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9QcmVkJj4oKnRoaXMpKF9feC5fX2NjLmZpcnN0LCBfX3kpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9LZXkmIF9feCwgY29uc3QgX0NwJiBfX3kpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgX1ByZWQmPigqdGhpcykoX194LCBfX3kuX19jYy5maXJzdCk7fQorICAgIHZvaWQgc3dhcChfX3Vub3JkZXJlZF9tYXBfZXF1YWwmX195KQorICAgICAgICBfTk9FWENFUFRfKF9faXNfbm90aHJvd19zd2FwcGFibGU8X1ByZWQ+Ojp2YWx1ZSkKKyAgICB7CisgICAgICAgIHVzaW5nIF9WU1REOjpzd2FwOworICAgICAgICBzd2FwKHN0YXRpY19jYXN0PF9QcmVkJj4oKnRoaXMpLCBzdGF0aWNfY2FzdDxfUHJlZCY+KF9feSkpOworICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfQ3AsIGNsYXNzIF9QcmVkPgorY2xhc3MgX191bm9yZGVyZWRfbWFwX2VxdWFsPF9LZXksIF9DcCwgX1ByZWQsIGZhbHNlPgoreworICAgIF9QcmVkIF9fcHJlZF87CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fdW5vcmRlcmVkX21hcF9lcXVhbCgpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8X1ByZWQ+Ojp2YWx1ZSkKKyAgICAgICAgOiBfX3ByZWRfKCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX191bm9yZGVyZWRfbWFwX2VxdWFsKGNvbnN0IF9QcmVkJiBfX3ApCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8X1ByZWQ+Ojp2YWx1ZSkKKyAgICAgICAgOiBfX3ByZWRfKF9fcCkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgX1ByZWQmIGtleV9lcSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fcHJlZF87fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX0NwJiBfX3gsIGNvbnN0IF9DcCYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fcHJlZF8oX194Ll9fY2MuZmlyc3QsIF9feS5fX2NjLmZpcnN0KTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfQ3AmIF9feCwgY29uc3QgX0tleSYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fcHJlZF8oX194Ll9fY2MuZmlyc3QsIF9feSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX0tleSYgX194LCBjb25zdCBfQ3AmIF9feSkgY29uc3QKKyAgICAgICAge3JldHVybiBfX3ByZWRfKF9feCwgX195Ll9fY2MuZmlyc3QpO30KKyAgICB2b2lkIHN3YXAoX191bm9yZGVyZWRfbWFwX2VxdWFsJl9feSkKKyAgICAgICAgX05PRVhDRVBUXyhfX2lzX25vdGhyb3dfc3dhcHBhYmxlPF9QcmVkPjo6dmFsdWUpCisgICAgeworICAgICAgICB1c2luZyBfVlNURDo6c3dhcDsKKyAgICAgICAgc3dhcChfX3ByZWRfLCBfX3kuX19wcmVkXyk7CisgICAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9DcCwgY2xhc3MgX1ByZWQsIGJvb2wgX19iPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3N3YXAoX191bm9yZGVyZWRfbWFwX2VxdWFsPF9LZXksIF9DcCwgX1ByZWQsIF9fYj4mIF9feCwKKyAgICAgX191bm9yZGVyZWRfbWFwX2VxdWFsPF9LZXksIF9DcCwgX1ByZWQsIF9fYj4mIF9feSkKKyAgICBfTk9FWENFUFRfKF9OT0VYQ0VQVF8oX194LnN3YXAoX195KSkpCit7CisgICAgX194LnN3YXAoX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvYz4KK2NsYXNzIF9faGFzaF9tYXBfbm9kZV9kZXN0cnVjdG9yCit7CisgICAgdHlwZWRlZiBfQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+ICAgIF9fYWxsb2NfdHJhaXRzOworCitwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpwb2ludGVyICAgICAgIHBvaW50ZXI7Citwcml2YXRlOgorCisgICAgYWxsb2NhdG9yX3R5cGUmIF9fbmFfOworCisgICAgX19oYXNoX21hcF9ub2RlX2Rlc3RydWN0b3ImIG9wZXJhdG9yPShjb25zdCBfX2hhc2hfbWFwX25vZGVfZGVzdHJ1Y3RvciYpOworCitwdWJsaWM6CisgICAgYm9vbCBfX2ZpcnN0X2NvbnN0cnVjdGVkOworICAgIGJvb2wgX19zZWNvbmRfY29uc3RydWN0ZWQ7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgX19oYXNoX21hcF9ub2RlX2Rlc3RydWN0b3IoYWxsb2NhdG9yX3R5cGUmIF9fbmEpIF9OT0VYQ0VQVAorICAgICAgICA6IF9fbmFfKF9fbmEpLAorICAgICAgICAgIF9fZmlyc3RfY29uc3RydWN0ZWQoZmFsc2UpLAorICAgICAgICAgIF9fc2Vjb25kX2NvbnN0cnVjdGVkKGZhbHNlKQorICAgICAgICB7fQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2hhc2hfbWFwX25vZGVfZGVzdHJ1Y3RvcihfX2hhc2hfbm9kZV9kZXN0cnVjdG9yPGFsbG9jYXRvcl90eXBlPiYmIF9feCkKKyAgICAgICAgX05PRVhDRVBUCisgICAgICAgIDogX19uYV8oX194Ll9fbmFfKSwKKyAgICAgICAgICBfX2ZpcnN0X2NvbnN0cnVjdGVkKF9feC5fX3ZhbHVlX2NvbnN0cnVjdGVkKSwKKyAgICAgICAgICBfX3NlY29uZF9jb25zdHJ1Y3RlZChfX3guX192YWx1ZV9jb25zdHJ1Y3RlZCkKKyAgICAgICAgeworICAgICAgICAgICAgX194Ll9fdmFsdWVfY29uc3RydWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorI2Vsc2UgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2hhc2hfbWFwX25vZGVfZGVzdHJ1Y3Rvcihjb25zdCBfX2hhc2hfbm9kZV9kZXN0cnVjdG9yPGFsbG9jYXRvcl90eXBlPiYgX194KQorICAgICAgICA6IF9fbmFfKF9feC5fX25hXyksCisgICAgICAgICAgX19maXJzdF9jb25zdHJ1Y3RlZChfX3guX192YWx1ZV9jb25zdHJ1Y3RlZCksCisgICAgICAgICAgX19zZWNvbmRfY29uc3RydWN0ZWQoX194Ll9fdmFsdWVfY29uc3RydWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Ym9vbCY+KF9feC5fX3ZhbHVlX2NvbnN0cnVjdGVkKSA9IGZhbHNlOworICAgICAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgb3BlcmF0b3IoKShwb2ludGVyIF9fcCkgX05PRVhDRVBUCisgICAgeworICAgICAgICBpZiAoX19zZWNvbmRfY29uc3RydWN0ZWQpCisgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6ZGVzdHJveShfX25hXywgX1ZTVEQ6OmFkZHJlc3NvZihfX3AtPl9fdmFsdWVfLl9fY2Muc2Vjb25kKSk7CisgICAgICAgIGlmIChfX2ZpcnN0X2NvbnN0cnVjdGVkKQorICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmRlc3Ryb3koX19uYV8sIF9WU1REOjphZGRyZXNzb2YoX19wLT5fX3ZhbHVlXy5fX2NjLmZpcnN0KSk7CisgICAgICAgIGlmIChfX3ApCisgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6ZGVhbGxvY2F0ZShfX25hXywgX19wLCAxKTsKKyAgICB9Cit9OworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcD4KK3VuaW9uIF9faGFzaF92YWx1ZV90eXBlCit7CisgICAgdHlwZWRlZiBfS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRfdHlwZTsKKyAgICB0eXBlZGVmIHBhaXI8Y29uc3Qga2V5X3R5cGUsIG1hcHBlZF90eXBlPiAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHBhaXI8a2V5X3R5cGUsIG1hcHBlZF90eXBlPiAgICAgICAgICAgICAgX19uY192YWx1ZV90eXBlOworCisgICAgdmFsdWVfdHlwZSBfX2NjOworICAgIF9fbmNfdmFsdWVfdHlwZSBfX25jOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faGFzaF92YWx1ZV90eXBlJiBvcGVyYXRvcj0oY29uc3QgX19oYXNoX3ZhbHVlX3R5cGUmIF9fdikKKyAgICAgICAge19fbmMgPSBfX3YuX19jYzsgcmV0dXJuICp0aGlzO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2hhc2hfdmFsdWVfdHlwZSYgb3BlcmF0b3I9KF9faGFzaF92YWx1ZV90eXBlJiYgX192KQorICAgICAgICB7X19uYyA9IF9WU1REOjptb3ZlKF9fdi5fX25jKTsgcmV0dXJuICp0aGlzO30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVmFsdWVUcCwKKyAgICAgICAgICAgICAgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgICAgICAgICAgICAgICAgIF9faXNfc2FtZV91bmN2cmVmPF9WYWx1ZVRwLCB2YWx1ZV90eXBlPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgPjo6dHlwZQorICAgICAgICAgICAgID4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX3ZhbHVlX3R5cGUmIG9wZXJhdG9yPShfVmFsdWVUcCYmIF9fdikgeworICAgICAgICBfX25jID0gX1ZTVEQ6OmZvcndhcmQ8X1ZhbHVlVHA+KF9fdik7IHJldHVybiAqdGhpczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgX19oYXNoX3ZhbHVlX3R5cGUoY29uc3QgX19oYXNoX3ZhbHVlX3R5cGUmIF9fdikgPSBkZWxldGU7CisgICAgX19oYXNoX3ZhbHVlX3R5cGUoX19oYXNoX3ZhbHVlX3R5cGUmJiBfX3YpID0gZGVsZXRlOworICAgIHRlbXBsYXRlIDxjbGFzcyAuLi5fQXJncz4KKyAgICBleHBsaWNpdCBfX2hhc2hfdmFsdWVfdHlwZShfQXJncyYmIC4uLl9fYXJncykgPSBkZWxldGU7CisKKyAgICB+X19oYXNoX3ZhbHVlX3R5cGUoKSA9IGRlbGV0ZTsKK307CisKKyNlbHNlCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHA+CitzdHJ1Y3QgX19oYXNoX3ZhbHVlX3R5cGUKK3sKKyAgICB0eXBlZGVmIF9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CisgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZF90eXBlOworICAgIHR5cGVkZWYgcGFpcjxjb25zdCBrZXlfdHlwZSwgbWFwcGVkX3R5cGU+ICAgICAgICB2YWx1ZV90eXBlOworCisgICAgdmFsdWVfdHlwZSBfX2NjOworCitwcml2YXRlOgorICAgfl9faGFzaF92YWx1ZV90eXBlKCk7Cit9OworCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIF9IYXNoSXRlcmF0b3I+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2hhc2hfbWFwX2l0ZXJhdG9yCit7CisgICAgX0hhc2hJdGVyYXRvciBfX2lfOworCisgICAgdHlwZWRlZiAgX19oYXNoX25vZGVfdHlwZXNfZnJvbV9pdGVyYXRvcjxfSGFzaEl0ZXJhdG9yPiBfTm9kZVR5cGVzOworCitwdWJsaWM6CisgICAgdHlwZWRlZiBmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6X19tYXBfdmFsdWVfdHlwZSAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX05vZGVUeXBlczo6ZGlmZmVyZW5jZV90eXBlICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6Ol9fbWFwX3ZhbHVlX3R5cGVfcG9pbnRlciAgICAgICBwb2ludGVyOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faGFzaF9tYXBfaXRlcmF0b3IoKSBfTk9FWENFUFQge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2hhc2hfbWFwX2l0ZXJhdG9yKF9IYXNoSXRlcmF0b3IgX19pKSBfTk9FWENFUFQgOiBfX2lfKF9faSkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3Qge3JldHVybiBfX2lfLT5fX2NjO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3Qge3JldHVybiBwb2ludGVyX3RyYWl0czxwb2ludGVyPjo6cG9pbnRlcl90byhfX2lfLT5fX2NjKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX21hcF9pdGVyYXRvciYgb3BlcmF0b3IrKygpIHsrK19faV87IHJldHVybiAqdGhpczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faGFzaF9tYXBfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpCisgICAgeworICAgICAgICBfX2hhc2hfbWFwX2l0ZXJhdG9yIF9fdCgqdGhpcyk7CisgICAgICAgICsrKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuIF9fdDsKKyAgICB9CisKKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgX19oYXNoX21hcF9pdGVyYXRvciYgX194LCBjb25zdCBfX2hhc2hfbWFwX2l0ZXJhdG9yJiBfX3kpCisgICAgICAgIHtyZXR1cm4gX194Ll9faV8gPT0gX195Ll9faV87fQorICAgIGZyaWVuZCBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfX2hhc2hfbWFwX2l0ZXJhdG9yJiBfX3gsIGNvbnN0IF9faGFzaF9tYXBfaXRlcmF0b3ImIF9feSkKKyAgICAgICAge3JldHVybiBfX3guX19pXyAhPSBfX3kuX19pXzt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdW5vcmRlcmVkX21hcDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdW5vcmRlcmVkX211bHRpbWFwOworICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9faGFzaF9jb25zdF9pdGVyYXRvcjsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3M+IGZyaWVuZCBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2hhc2hfY29uc3RfbG9jYWxfaXRlcmF0b3I7CisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19oYXNoX21hcF9jb25zdF9pdGVyYXRvcjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfSGFzaEl0ZXJhdG9yPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19oYXNoX21hcF9jb25zdF9pdGVyYXRvcgoreworICAgIF9IYXNoSXRlcmF0b3IgX19pXzsKKworICAgIHR5cGVkZWYgIF9faGFzaF9ub2RlX3R5cGVzX2Zyb21faXRlcmF0b3I8X0hhc2hJdGVyYXRvcj4gX05vZGVUeXBlczsKKworcHVibGljOgorICAgIHR5cGVkZWYgZm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6Ol9fbWFwX3ZhbHVlX3R5cGUgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ob2RlVHlwZXM6OmRpZmZlcmVuY2VfdHlwZSAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTm9kZVR5cGVzOjpfX2NvbnN0X21hcF92YWx1ZV90eXBlX3BvaW50ZXIgIHBvaW50ZXI7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19oYXNoX21hcF9jb25zdF9pdGVyYXRvcigpIF9OT0VYQ0VQVCB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faGFzaF9tYXBfY29uc3RfaXRlcmF0b3IoX0hhc2hJdGVyYXRvciBfX2kpIF9OT0VYQ0VQVCA6IF9faV8oX19pKSB7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2hhc2hfbWFwX2NvbnN0X2l0ZXJhdG9yKAorICAgICAgICAgICAgX19oYXNoX21hcF9pdGVyYXRvcjx0eXBlbmFtZSBfSGFzaEl0ZXJhdG9yOjpfX25vbl9jb25zdF9pdGVyYXRvcj4gX19pKQorICAgICAgICAgICAgICAgICBfTk9FWENFUFQKKyAgICAgICAgICAgICAgICA6IF9faV8oX19pLl9faV8pIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHtyZXR1cm4gX19pXy0+X19jYzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHtyZXR1cm4gcG9pbnRlcl90cmFpdHM8cG9pbnRlcj46OnBvaW50ZXJfdG8oX19pXy0+X19jYyk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faGFzaF9tYXBfY29uc3RfaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7KytfX2lfOyByZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX2hhc2hfbWFwX2NvbnN0X2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KQorICAgIHsKKyAgICAgICAgX19oYXNoX21hcF9jb25zdF9pdGVyYXRvciBfX3QoKnRoaXMpOworICAgICAgICArKygqdGhpcyk7CisgICAgICAgIHJldHVybiBfX3Q7CisgICAgfQorCisgICAgZnJpZW5kIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9faGFzaF9tYXBfY29uc3RfaXRlcmF0b3ImIF9feCwgY29uc3QgX19oYXNoX21hcF9jb25zdF9pdGVyYXRvciYgX195KQorICAgICAgICB7cmV0dXJuIF9feC5fX2lfID09IF9feS5fX2lfO30KKyAgICBmcmllbmQgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgX19oYXNoX21hcF9jb25zdF9pdGVyYXRvciYgX194LCBjb25zdCBfX2hhc2hfbWFwX2NvbnN0X2l0ZXJhdG9yJiBfX3kpCisgICAgICAgIHtyZXR1cm4gX194Ll9faV8gIT0gX195Ll9faV87fQorCisgICAgdGVtcGxhdGUgPGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHVub3JkZXJlZF9tYXA7CisgICAgdGVtcGxhdGUgPGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzLCBjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHVub3JkZXJlZF9tdWx0aW1hcDsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3M+IGZyaWVuZCBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2hhc2hfY29uc3RfaXRlcmF0b3I7CisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19oYXNoX2NvbnN0X2xvY2FsX2l0ZXJhdG9yOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2ggPSBoYXNoPF9LZXk+LCBjbGFzcyBfUHJlZCA9IGVxdWFsX3RvPF9LZXk+LAorICAgICAgICAgIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjxwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiA+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB1bm9yZGVyZWRfbWFwCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIF9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CisgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZF90eXBlOworICAgIHR5cGVkZWYgX0hhc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXI7CisgICAgdHlwZWRlZiBfUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9lcXVhbDsKKyAgICB0eXBlZGVmIF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgdHlwZWRlZiBwYWlyPGNvbnN0IGtleV90eXBlLCBtYXBwZWRfdHlwZT4gICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBwYWlyPGtleV90eXBlLCBtYXBwZWRfdHlwZT4gICAgICAgICAgICAgICAgICAgIF9fbmNfdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgc3RhdGljX2Fzc2VydCgoaXNfc2FtZTx2YWx1ZV90eXBlLCB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6dmFsdWVfdHlwZT46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGFsbG9jYXRvcjo6dmFsdWVfdHlwZSIpOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgX19oYXNoX3ZhbHVlX3R5cGU8a2V5X3R5cGUsIG1hcHBlZF90eXBlPiAgICAgICAgICAgICAgICAgX192YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX191bm9yZGVyZWRfbWFwX2hhc2hlcjxrZXlfdHlwZSwgX192YWx1ZV90eXBlLCBoYXNoZXI+ICAgX19oYXNoZXI7CisgICAgdHlwZWRlZiBfX3Vub3JkZXJlZF9tYXBfZXF1YWw8a2V5X3R5cGUsIF9fdmFsdWVfdHlwZSwga2V5X2VxdWFsPiBfX2tleV9lcXVhbDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2FsbG9jX2hlbHBlcjxhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3ZhbHVlX3R5cGU+Ojp0eXBlIF9fYWxsb2NhdG9yX3R5cGU7CisKKyAgICB0eXBlZGVmIF9faGFzaF90YWJsZTxfX3ZhbHVlX3R5cGUsIF9faGFzaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fa2V5X2VxdWFsLCAgX19hbGxvY2F0b3JfdHlwZT4gICBfX3RhYmxlOworCisgICAgX190YWJsZSBfX3RhYmxlXzsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6X05vZGVUeXBlcyAgICAgICAgICAgICAgICAgICBfTm9kZVR5cGVzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6X19ub2RlX3BvaW50ZXIgICAgICAgICAgICAgICBfX25vZGVfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6Ol9fbm9kZV9jb25zdF9wb2ludGVyICAgICAgICAgX19ub2RlX2NvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RhYmxlOjpfX25vZGVfdHJhaXRzICAgICAgICAgICAgICAgIF9fbm9kZV90cmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RhYmxlOjpfX25vZGVfYWxsb2NhdG9yICAgICAgICAgICAgIF9fbm9kZV9hbGxvY2F0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RhYmxlOjpfX25vZGUgICAgICAgICAgICAgICAgICAgICAgIF9fbm9kZTsKKyAgICB0eXBlZGVmIF9faGFzaF9tYXBfbm9kZV9kZXN0cnVjdG9yPF9fbm9kZV9hbGxvY2F0b3I+ICAgX0RwOworICAgIHR5cGVkZWYgdW5pcXVlX3B0cjxfX25vZGUsIF9EcD4gICAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlX2hvbGRlcjsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+ICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM7CisKKyAgICBzdGF0aWNfYXNzZXJ0KChpc19zYW1lPHR5cGVuYW1lIF9fdGFibGU6Ol9fY29udGFpbmVyX3ZhbHVlX3R5cGUsIHZhbHVlX3R5cGU+Ojp2YWx1ZSksICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KChpc19zYW1lPHR5cGVuYW1lIF9fdGFibGU6Ol9fbm9kZV92YWx1ZV90eXBlLCBfX3ZhbHVlX3R5cGU+Ojp2YWx1ZSksICIiKTsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpwb2ludGVyICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpjb25zdF9wb2ludGVyICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6OnNpemVfdHlwZSAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICB0eXBlZGVmIF9faGFzaF9tYXBfaXRlcmF0b3I8dHlwZW5hbWUgX190YWJsZTo6aXRlcmF0b3I+ICAgICAgIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgX19oYXNoX21hcF9jb25zdF9pdGVyYXRvcjx0eXBlbmFtZSBfX3RhYmxlOjpjb25zdF9pdGVyYXRvcj4gY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfX2hhc2hfbWFwX2l0ZXJhdG9yPHR5cGVuYW1lIF9fdGFibGU6OmxvY2FsX2l0ZXJhdG9yPiBsb2NhbF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9faGFzaF9tYXBfY29uc3RfaXRlcmF0b3I8dHlwZW5hbWUgX190YWJsZTo6Y29uc3RfbG9jYWxfaXRlcmF0b3I+IGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVub3JkZXJlZF9tYXAoKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9fdGFibGU+Ojp2YWx1ZSkKKyAgICAgICAgeworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICAgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgZXhwbGljaXQgdW5vcmRlcmVkX21hcChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSk7CisgICAgdW5vcmRlcmVkX21hcChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsCisgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB1bm9yZGVyZWRfbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB1bm9yZGVyZWRfbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCkpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdW5vcmRlcmVkX21hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IHVub3JkZXJlZF9tYXAoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgdW5vcmRlcmVkX21hcChjb25zdCB1bm9yZGVyZWRfbWFwJiBfX3UpOworICAgIHVub3JkZXJlZF9tYXAoY29uc3QgdW5vcmRlcmVkX21hcCYgX191LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVub3JkZXJlZF9tYXAodW5vcmRlcmVkX21hcCYmIF9fdSkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxfX3RhYmxlPjo6dmFsdWUpOworICAgIHVub3JkZXJlZF9tYXAodW5vcmRlcmVkX21hcCYmIF9fdSwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgdW5vcmRlcmVkX21hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpOworICAgIHVub3JkZXJlZF9tYXAoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSk7CisgICAgdW5vcmRlcmVkX21hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIHNpemVfdHlwZSBfX24sCisgICAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5vcmRlcmVkX21hcChzaXplX3R5cGUgX19uLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiB1bm9yZGVyZWRfbWFwKF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBfX2EpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVub3JkZXJlZF9tYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiB1bm9yZGVyZWRfbWFwKF9fbiwgX19oZiwga2V5X2VxdWFsKCksIF9fYSkge30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgdW5vcmRlcmVkX21hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIHNpemVfdHlwZSBfX24sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICA6IHVub3JkZXJlZF9tYXAoX19maXJzdCwgX19sYXN0LCBfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgX19hKSB7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICB1bm9yZGVyZWRfbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCAKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogdW5vcmRlcmVkX21hcChfX2ZpcnN0LCBfX2xhc3QsIF9fbiwgX19oZiwga2V5X2VxdWFsKCksIF9fYSkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5vcmRlcmVkX21hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIHNpemVfdHlwZSBfX24sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICA6IHVub3JkZXJlZF9tYXAoX19pbCwgX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIF9fYSkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5vcmRlcmVkX21hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgCisgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiB1bm9yZGVyZWRfbWFwKF9faWwsIF9fbiwgX19oZiwga2V5X2VxdWFsKCksIF9fYSkge30KKyNlbmRpZgorICAgIC8vIH51bm9yZGVyZWRfbWFwKCkgPSBkZWZhdWx0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB1bm9yZGVyZWRfbWFwJiBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX21hcCYgX191KQorICAgIHsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgICAgIF9fdGFibGVfID0gX191Ll9fdGFibGVfOworI2Vsc2UKKyAgICAgICAgaWYgKHRoaXMgIT0gJl9fdSkgeworICAgICAgICAgICAgX190YWJsZV8uY2xlYXIoKTsKKyAgICAgICAgICAgIF9fdGFibGVfLmhhc2hfZnVuY3Rpb24oKSA9IF9fdS5fX3RhYmxlXy5oYXNoX2Z1bmN0aW9uKCk7CisgICAgICAgICAgICBfX3RhYmxlXy5rZXlfZXEoKSA9IF9fdS5fX3RhYmxlXy5rZXlfZXEoKTsKKyAgICAgICAgICAgIF9fdGFibGVfLm1heF9sb2FkX2ZhY3RvcigpID0gX191Ll9fdGFibGVfLm1heF9sb2FkX2ZhY3RvcigpOworICAgICAgICAgICAgX190YWJsZV8uX19jb3B5X2Fzc2lnbl9hbGxvYyhfX3UuX190YWJsZV8pOworICAgICAgICAgICAgaW5zZXJ0KF9fdS5iZWdpbigpLCBfX3UuZW5kKCkpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVub3JkZXJlZF9tYXAmIG9wZXJhdG9yPSh1bm9yZGVyZWRfbWFwJiYgX191KQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPF9fdGFibGU+Ojp2YWx1ZSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVub3JkZXJlZF9tYXAmIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpOworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gYWxsb2NhdG9yX3R5cGUoX190YWJsZV8uX19ub2RlX2FsbG9jKCkpO30KKworICAgIF9MSUJDUFBfTk9ESVNDQVJEX0FGVEVSX0NYWDE3IF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBib29sICAgICAgZW1wdHkoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RhYmxlXy5zaXplKCkgPT0gMDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgX05PRVhDRVBUICB7cmV0dXJuIF9fdGFibGVfLnNpemUoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdGFibGVfLm1heF9zaXplKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yICAgICAgIGJlZ2luKCkgX05PRVhDRVBUICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciAgICAgICBlbmQoKSBfTk9FWENFUFQgICAgICAgICAge3JldHVybiBfX3RhYmxlXy5lbmQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdGFibGVfLmJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSAgICBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RhYmxlXy5lbmQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdGFibGVfLmJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBjZW5kKCkgICBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RhYmxlXy5lbmQoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgICAge3JldHVybiBfX3RhYmxlXy5fX2luc2VydF91bmlxdWUoX194KTt9CisKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19maW5kX2NfZnJvbV9pKCZfX3ApID09IHRoaXMsCisgICAgICAgICAgICAidW5vcmRlcmVkX21hcDo6aW5zZXJ0KGNvbnN0X2l0ZXJhdG9yLCBjb25zdCB2YWx1ZV90eXBlJikgY2FsbGVkIHdpdGggYW4gaXRlcmF0b3Igbm90IgorICAgICAgICAgICAgIiByZWZlcnJpbmcgdG8gdGhpcyB1bm9yZGVyZWRfbWFwIik7CisjZWxzZQorICAgICAgICAoKHZvaWQpX19wKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gaW5zZXJ0KF9feCkuZmlyc3Q7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkKKyAgICAgICAge2luc2VydChfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnQodmFsdWVfdHlwZSYmIF9feCkKKyAgICAgICAge3JldHVybiBfX3RhYmxlXy5fX2luc2VydF91bmlxdWUoX1ZTVEQ6Om1vdmUoX194KSk7fQorCisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcCwgdmFsdWVfdHlwZSYmIF9feCkgeworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2ZpbmRfY19mcm9tX2koJl9fcCkgPT0gdGhpcywKKyAgICAgICAgICAgICJ1bm9yZGVyZWRfbWFwOjppbnNlcnQoY29uc3RfaXRlcmF0b3IsIGNvbnN0IHZhbHVlX3R5cGUmKSBjYWxsZWQgd2l0aCBhbiBpdGVyYXRvciBub3QiCisgICAgICAgICAgICAiIHJlZmVycmluZyB0byB0aGlzIHVub3JkZXJlZF9tYXAiKTsKKyNlbHNlCisgICAgICAgICgodm9pZClfX3ApOworI2VuZGlmCisgICAgICAgIHJldHVybiBfX3RhYmxlXy5fX2luc2VydF91bmlxdWUoX1ZTVEQ6Om1vdmUoX194KSkuZmlyc3Q7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9QcCwKKyAgICAgICAgICAgICAgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLCBfUHA+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KF9QcCYmIF9feCkKKyAgICAgICAgICAgIHtyZXR1cm4gX190YWJsZV8uX19pbnNlcnRfdW5pcXVlKF9WU1REOjpmb3J3YXJkPF9QcD4oX194KSk7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9QcCwKKyAgICAgICAgICAgICAgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLCBfUHA+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcCwgX1BwJiYgX194KQorICAgICAgICB7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgICAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2ZpbmRfY19mcm9tX2koJl9fcCkgPT0gdGhpcywKKyAgICAgICAgICAgICAgICAidW5vcmRlcmVkX21hcDo6aW5zZXJ0KGNvbnN0X2l0ZXJhdG9yLCB2YWx1ZV90eXBlJiYpIGNhbGxlZCB3aXRoIGFuIGl0ZXJhdG9yIG5vdCIKKyAgICAgICAgICAgICAgICAiIHJlZmVycmluZyB0byB0aGlzIHVub3JkZXJlZF9tYXAiKTsKKyNlbHNlCisgICAgICAgICAgKCh2b2lkKV9fcCk7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiBpbnNlcnQoX1ZTVEQ6OmZvcndhcmQ8X1BwPihfX3gpKS5maXJzdDsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBlbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKSB7CisgICAgICAgIHJldHVybiBfX3RhYmxlXy5fX2VtcGxhY2VfdW5pcXVlKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKSB7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZmluZF9jX2Zyb21faSgmX19wKSA9PSB0aGlzLAorICAgICAgICAgICAgInVub3JkZXJlZF9tYXA6OmVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciwgYXJncy4uLikgY2FsbGVkIHdpdGggYW4gaXRlcmF0b3Igbm90IgorICAgICAgICAgICAgIiByZWZlcnJpbmcgdG8gdGhpcyB1bm9yZGVyZWRfbWFwIik7CisjZWxzZQorICAgICAgICAgICgodm9pZClfX3ApOworI2VuZGlmCisgICAgICAgIHJldHVybiBfX3RhYmxlXy5fX2VtcGxhY2VfdW5pcXVlKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKS5maXJzdDsKKyAgICB9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAorICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiB0cnlfZW1wbGFjZShjb25zdCBrZXlfdHlwZSYgX19rLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICB7CisgICAgICAgIHJldHVybiBfX3RhYmxlXy5fX2VtcGxhY2VfdW5pcXVlX2tleV9hcmdzKF9faywgX1ZTVEQ6OnBpZWNld2lzZV9jb25zdHJ1Y3QsCisgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZF9hc190dXBsZShfX2spLAorICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmRfYXNfdHVwbGUoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gdHJ5X2VtcGxhY2Uoa2V5X3R5cGUmJiBfX2ssIF9BcmdzJiYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9fdGFibGVfLl9fZW1wbGFjZV91bmlxdWVfa2V5X2FyZ3MoX19rLCBfVlNURDo6cGllY2V3aXNlX2NvbnN0cnVjdCwKKyAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkX2FzX3R1cGxlKF9WU1REOjptb3ZlKF9faykpLAorICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmRfYXNfdHVwbGUoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgaXRlcmF0b3IgdHJ5X2VtcGxhY2UoY29uc3RfaXRlcmF0b3IgX19oLCBjb25zdCBrZXlfdHlwZSYgX19rLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICB7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZmluZF9jX2Zyb21faSgmX19oKSA9PSB0aGlzLAorICAgICAgICAgICAgInVub3JkZXJlZF9tYXA6OnRyeV9lbXBsYWNlKGNvbnN0X2l0ZXJhdG9yLCBrZXksIGFyZ3MuLi4pIGNhbGxlZCB3aXRoIGFuIGl0ZXJhdG9yIG5vdCIKKyAgICAgICAgICAgICIgcmVmZXJyaW5nIHRvIHRoaXMgdW5vcmRlcmVkX21hcCIpOworI2Vsc2UKKyAgICAgICAgKCh2b2lkKV9faCk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIHRyeV9lbXBsYWNlKF9faywgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLmZpcnN0OworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBpdGVyYXRvciB0cnlfZW1wbGFjZShjb25zdF9pdGVyYXRvciBfX2gsIGtleV90eXBlJiYgX19rLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICB7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZmluZF9jX2Zyb21faSgmX19oKSA9PSB0aGlzLAorICAgICAgICAgICAgInVub3JkZXJlZF9tYXA6OnRyeV9lbXBsYWNlKGNvbnN0X2l0ZXJhdG9yLCBrZXksIGFyZ3MuLi4pIGNhbGxlZCB3aXRoIGFuIGl0ZXJhdG9yIG5vdCIKKyAgICAgICAgICAgICIgcmVmZXJyaW5nIHRvIHRoaXMgdW5vcmRlcmVkX21hcCIpOworI2Vsc2UKKyAgICAgICAgKCh2b2lkKV9faCk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIHRyeV9lbXBsYWNlKF9WU1REOjptb3ZlKF9fayksIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKS5maXJzdDsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1ZwPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydF9vcl9hc3NpZ24oY29uc3Qga2V5X3R5cGUmIF9faywgX1ZwJiYgX192KQorICAgIHsKKyAgICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gX19yZXMgPSBfX3RhYmxlXy5fX2VtcGxhY2VfdW5pcXVlX2tleV9hcmdzKF9faywKKyAgICAgICAgICAgIF9faywgX1ZTVEQ6OmZvcndhcmQ8X1ZwPihfX3YpKTsKKyAgICAgICAgaWYgKCFfX3Jlcy5zZWNvbmQpIHsKKyAgICAgICAgICAgIF9fcmVzLmZpcnN0LT5zZWNvbmQgPSBfVlNURDo6Zm9yd2FyZDxfVnA+KF9fdik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fcmVzOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVnA+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0X29yX2Fzc2lnbihrZXlfdHlwZSYmIF9faywgX1ZwJiYgX192KQorICAgIHsKKyAgICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gX19yZXMgPSBfX3RhYmxlXy5fX2VtcGxhY2VfdW5pcXVlX2tleV9hcmdzKF9faywKKyAgICAgICAgICAgIF9WU1REOjptb3ZlKF9fayksIF9WU1REOjpmb3J3YXJkPF9WcD4oX192KSk7CisgICAgICAgIGlmICghX19yZXMuc2Vjb25kKSB7CisgICAgICAgICAgICBfX3Jlcy5maXJzdC0+c2Vjb25kID0gX1ZTVEQ6OmZvcndhcmQ8X1ZwPihfX3YpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfX3JlczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1ZwPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGl0ZXJhdG9yIGluc2VydF9vcl9hc3NpZ24oY29uc3RfaXRlcmF0b3IsIGNvbnN0IGtleV90eXBlJiBfX2ssIF9WcCYmIF9fdikKKyAgICAgeworICAgICAgICAgIC8vIEZJWE1FOiBBZGQgZGVidWcgbW9kZSBjaGVja2luZyBmb3IgdGhlIGl0ZXJhdG9yIGlucHV0CisgICAgICAgICAgcmV0dXJuIGluc2VydF9vcl9hc3NpZ24oX19rLCBfVlNURDo6Zm9yd2FyZDxfVnA+KF9fdikpLmZpcnN0OworICAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1ZwPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGl0ZXJhdG9yIGluc2VydF9vcl9hc3NpZ24oY29uc3RfaXRlcmF0b3IsIGtleV90eXBlJiYgX19rLCBfVnAmJiBfX3YpCisgICAgIHsKKyAgICAgICAgLy8gRklYTUU6IEFkZCBkZWJ1ZyBtb2RlIGNoZWNraW5nIGZvciB0aGUgaXRlcmF0b3IgaW5wdXQKKyAgICAgICAgcmV0dXJuIGluc2VydF9vcl9hc3NpZ24oX1ZTVEQ6Om1vdmUoX19rKSwgX1ZTVEQ6OmZvcndhcmQ8X1ZwPihfX3YpKS5maXJzdDsKKyAgICAgfQorI2VuZGlmIC8vIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wKSB7cmV0dXJuIF9fdGFibGVfLmVyYXNlKF9fcC5fX2lfKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcCkgICAgICAge3JldHVybiBfX3RhYmxlXy5lcmFzZShfX3AuX19pXyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9faykge3JldHVybiBfX3RhYmxlXy5fX2VyYXNlX3VuaXF1ZShfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmVyYXNlKF9fZmlyc3QuX19pXywgX19sYXN0Ll9faV8pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBjbGVhcigpIF9OT0VYQ0VQVCB7X190YWJsZV8uY2xlYXIoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKHVub3JkZXJlZF9tYXAmIF9fdSkKKyAgICAgICAgX05PRVhDRVBUXyhfX2lzX25vdGhyb3dfc3dhcHBhYmxlPF9fdGFibGU+Ojp2YWx1ZSkKKyAgICAgICAgeyBfX3RhYmxlXy5zd2FwKF9fdS5fX3RhYmxlXyk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGhhc2hlciBoYXNoX2Z1bmN0aW9uKCkgY29uc3QKKyAgICAgICAge3JldHVybiBfX3RhYmxlXy5oYXNoX2Z1bmN0aW9uKCkuaGFzaF9mdW5jdGlvbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX190YWJsZV8ua2V5X2VxKCkua2V5X2VxKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yICAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykgICAgICAge3JldHVybiBfX3RhYmxlXy5maW5kKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uZmluZChfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uX19jb3VudF91bmlxdWUoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiAgICAgICAgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKQorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9fZXF1YWxfcmFuZ2VfdW5pcXVlKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICAgICAge3JldHVybiBfX3RhYmxlXy5fX2VxdWFsX3JhbmdlX3VuaXF1ZShfX2spO30KKworICAgIG1hcHBlZF90eXBlJiBvcGVyYXRvcltdKGNvbnN0IGtleV90eXBlJiBfX2spOworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBtYXBwZWRfdHlwZSYgb3BlcmF0b3JbXShrZXlfdHlwZSYmIF9fayk7CisjZW5kaWYKKworICAgIG1hcHBlZF90eXBlJiAgICAgICBhdChjb25zdCBrZXlfdHlwZSYgX19rKTsKKyAgICBjb25zdCBtYXBwZWRfdHlwZSYgYXQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Q7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdGFibGVfLmJ1Y2tldF9jb3VudCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RhYmxlXy5tYXhfYnVja2V0X2NvdW50KCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBidWNrZXRfc2l6ZShzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmJ1Y2tldF9zaXplKF9fbik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgYnVja2V0KGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uYnVja2V0KF9fayk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGxvY2FsX2l0ZXJhdG9yICAgICAgIGJlZ2luKHNpemVfdHlwZSBfX24pICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmJlZ2luKF9fbik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBsb2NhbF9pdGVyYXRvciAgICAgICBlbmQoc2l6ZV90eXBlIF9fbikgICAgICAgICAge3JldHVybiBfX3RhYmxlXy5lbmQoX19uKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGJlZ2luKHNpemVfdHlwZSBfX24pIGNvbnN0ICB7cmV0dXJuIF9fdGFibGVfLmNiZWdpbihfX24pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IgZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0ICAgIHtyZXR1cm4gX190YWJsZV8uY2VuZChfX24pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IgY2JlZ2luKHNpemVfdHlwZSBfX24pIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uY2JlZ2luKF9fbik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9sb2NhbF9pdGVyYXRvciBjZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0ICAge3JldHVybiBfX3RhYmxlXy5jZW5kKF9fbik7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGZsb2F0IGxvYWRfZmFjdG9yKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190YWJsZV8ubG9hZF9mYWN0b3IoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGZsb2F0IG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdGFibGVfLm1heF9sb2FkX2ZhY3RvcigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBtYXhfbG9hZF9mYWN0b3IoZmxvYXQgX19tbGYpIHtfX3RhYmxlXy5tYXhfbG9hZF9mYWN0b3IoX19tbGYpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCByZWhhc2goc2l6ZV90eXBlIF9fbikge19fdGFibGVfLnJlaGFzaChfX24pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCByZXNlcnZlKHNpemVfdHlwZSBfX24pIHtfX3RhYmxlXy5yZXNlcnZlKF9fbik7fQorCisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisKKyAgICBib29sIF9fZGVyZWZlcmVuY2VhYmxlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yKiBfX2kpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX190YWJsZV8uX19kZXJlZmVyZW5jZWFibGUoJl9faS0+X19pXyk7fQorICAgIGJvb2wgX19kZWNyZW1lbnRhYmxlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yKiBfX2kpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX190YWJsZV8uX19kZWNyZW1lbnRhYmxlKCZfX2ktPl9faV8pO30KKyAgICBib29sIF9fYWRkYWJsZShjb25zdCBjb25zdF9pdGVyYXRvciogX19pLCBwdHJkaWZmX3QgX19uKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9fYWRkYWJsZSgmX19pLT5fX2lfLCBfX24pO30KKyAgICBib29sIF9fc3Vic2NyaXB0YWJsZShjb25zdCBjb25zdF9pdGVyYXRvciogX19pLCBwdHJkaWZmX3QgX19uKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9fYWRkYWJsZSgmX19pLT5fX2lfLCBfX24pO30KKworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKworcHJpdmF0ZToKKworI2lmZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9fbm9kZV9ob2xkZXIgX19jb25zdHJ1Y3Rfbm9kZV93aXRoX2tleShjb25zdCBrZXlfdHlwZSYgX19rKTsKKyNlbmRpZgorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojp1bm9yZGVyZWRfbWFwKAorICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwpCisgICAgOiBfX3RhYmxlXyhfX2hmLCBfX2VxbCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgX190YWJsZV8ucmVoYXNoKF9fbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX21hcCgKKyAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX190YWJsZV8oX19oZiwgX19lcWwsIHR5cGVuYW1lIF9fdGFibGU6OmFsbG9jYXRvcl90eXBlKF9fYSkpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIF9fdGFibGVfLnJlaGFzaChfX24pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK2lubGluZQordW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX21hcCgKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fdGFibGVfKHR5cGVuYW1lIF9fdGFibGU6OmFsbG9jYXRvcl90eXBlKF9fYSkpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3Vub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OnVub3JkZXJlZF9tYXAoCisgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgaW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX21hcCgKKyAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBzaXplX3R5cGUgX19uLAorICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwpCisgICAgOiBfX3RhYmxlXyhfX2hmLCBfX2VxbCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgX190YWJsZV8ucmVoYXNoKF9fbik7CisgICAgaW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX21hcCgKKyAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBzaXplX3R5cGUgX19uLAorICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX3RhYmxlXyhfX2hmLCBfX2VxbCwgdHlwZW5hbWUgX190YWJsZTo6YWxsb2NhdG9yX3R5cGUoX19hKSkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgX190YWJsZV8ucmVoYXNoKF9fbik7CisgICAgaW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX21hcCgKKyAgICAgICAgY29uc3QgdW5vcmRlcmVkX21hcCYgX191KQorICAgIDogX190YWJsZV8oX191Ll9fdGFibGVfKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBfX3RhYmxlXy5yZWhhc2goX191LmJ1Y2tldF9jb3VudCgpKTsKKyAgICBpbnNlcnQoX191LmJlZ2luKCksIF9fdS5lbmQoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX21hcCgKKyAgICAgICAgY29uc3QgdW5vcmRlcmVkX21hcCYgX191LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX190YWJsZV8oX191Ll9fdGFibGVfLCB0eXBlbmFtZSBfX3RhYmxlOjphbGxvY2F0b3JfdHlwZShfX2EpKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBfX3RhYmxlXy5yZWhhc2goX191LmJ1Y2tldF9jb3VudCgpKTsKKyAgICBpbnNlcnQoX191LmJlZ2luKCksIF9fdS5lbmQoKSk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgoraW5saW5lCit1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojp1bm9yZGVyZWRfbWFwKAorICAgICAgICB1bm9yZGVyZWRfbWFwJiYgX191KQorICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8X190YWJsZT46OnZhbHVlKQorICAgIDogX190YWJsZV8oX1ZTVEQ6Om1vdmUoX191Ll9fdGFibGVfKSkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworICAgIF9fZ2V0X2RiKCktPnN3YXAodGhpcywgJl9fdSk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojp1bm9yZGVyZWRfbWFwKAorICAgICAgICB1bm9yZGVyZWRfbWFwJiYgX191LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX190YWJsZV8oX1ZTVEQ6Om1vdmUoX191Ll9fdGFibGVfKSwgdHlwZW5hbWUgX190YWJsZTo6YWxsb2NhdG9yX3R5cGUoX19hKSkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgaWYgKF9fYSAhPSBfX3UuZ2V0X2FsbG9jYXRvcigpKQorICAgIHsKKyAgICAgICAgaXRlcmF0b3IgX19pID0gX191LmJlZ2luKCk7CisgICAgICAgIHdoaWxlIChfX3Uuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIF9fdGFibGVfLl9fZW1wbGFjZV91bmlxdWUoX1ZTVEQ6Om1vdmUoCisgICAgICAgICAgICAgICAgX191Ll9fdGFibGVfLnJlbW92ZSgoX19pKyspLl9faV8pLT5fX3ZhbHVlXy5fX25jKSk7CisgICAgICAgIH0KKyAgICB9CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgZWxzZQorICAgICAgICBfX2dldF9kYigpLT5zd2FwKHRoaXMsICZfX3UpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX21hcCgKKyAgICAgICAgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBpbnNlcnQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojp1bm9yZGVyZWRfbWFwKAorICAgICAgICBpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwKKyAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCkKKyAgICA6IF9fdGFibGVfKF9faGYsIF9fZXFsKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBfX3RhYmxlXy5yZWhhc2goX19uKTsKKyAgICBpbnNlcnQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojp1bm9yZGVyZWRfbWFwKAorICAgICAgICBpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwKKyAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fdGFibGVfKF9faGYsIF9fZXFsLCB0eXBlbmFtZSBfX3RhYmxlOjphbGxvY2F0b3JfdHlwZShfX2EpKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBfX3RhYmxlXy5yZWhhc2goX19uKTsKKyAgICBpbnNlcnQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUKK3Vub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mCit1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+OjpvcGVyYXRvcj0odW5vcmRlcmVkX21hcCYmIF9fdSkKKyAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPF9fdGFibGU+Ojp2YWx1ZSkKK3sKKyAgICBfX3RhYmxlXyA9IF9WU1REOjptb3ZlKF9fdS5fX3RhYmxlXyk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK2lubGluZQordW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYKK3Vub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46Om9wZXJhdG9yPSgKKyAgICAgICAgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQoreworICAgIF9fdGFibGVfLl9fYXNzaWduX3VuaXF1ZShfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpOworICAgIHJldHVybiAqdGhpczsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CitpbmxpbmUKK3ZvaWQKK3Vub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46Omluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgX190YWJsZV8uX19pbnNlcnRfdW5pcXVlKCpfX2ZpcnN0KTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CitfVHAmCit1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+OjpvcGVyYXRvcltdKGNvbnN0IGtleV90eXBlJiBfX2spCit7CisgICAgcmV0dXJuIF9fdGFibGVfLl9fZW1wbGFjZV91bmlxdWVfa2V5X2FyZ3MoX19rLAorICAgICAgICBzdGQ6OnBpZWNld2lzZV9jb25zdHJ1Y3QsIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShfX2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZSgpKS5maXJzdC0+X19jYy5zZWNvbmQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorX1RwJgordW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6b3BlcmF0b3JbXShrZXlfdHlwZSYmIF9faykKK3sKKyAgICByZXR1cm4gX190YWJsZV8uX19lbXBsYWNlX3VuaXF1ZV9rZXlfYXJncyhfX2ssCisgICAgICAgIHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0ZDo6bW92ZShfX2spKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoKSkuZmlyc3QtPl9fY2Muc2Vjb25kOworfQorI2Vsc2UgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordHlwZW5hbWUgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6X19ub2RlX2hvbGRlcgordW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6X19jb25zdHJ1Y3Rfbm9kZV93aXRoX2tleShjb25zdCBrZXlfdHlwZSYgX19rKQoreworICAgIF9fbm9kZV9hbGxvY2F0b3ImIF9fbmEgPSBfX3RhYmxlXy5fX25vZGVfYWxsb2MoKTsKKyAgICBfX25vZGVfaG9sZGVyIF9faChfX25vZGVfdHJhaXRzOjphbGxvY2F0ZShfX25hLCAxKSwgX0RwKF9fbmEpKTsKKyAgICBfX25vZGVfdHJhaXRzOjpjb25zdHJ1Y3QoX19uYSwgX1ZTVEQ6OmFkZHJlc3NvZihfX2gtPl9fdmFsdWVfLl9fY2MuZmlyc3QpLCBfX2spOworICAgIF9faC5nZXRfZGVsZXRlcigpLl9fZmlyc3RfY29uc3RydWN0ZWQgPSB0cnVlOworICAgIF9fbm9kZV90cmFpdHM6OmNvbnN0cnVjdChfX25hLCBfVlNURDo6YWRkcmVzc29mKF9faC0+X192YWx1ZV8uX19jYy5zZWNvbmQpKTsKKyAgICBfX2guZ2V0X2RlbGV0ZXIoKS5fX3NlY29uZF9jb25zdHJ1Y3RlZCA9IHRydWU7CisgICAgcmV0dXJuIF9MSUJDUFBfRVhQTElDSVRfTU9WRShfX2gpOyAgLy8gZXhwbGljaXRseSBtb3ZlZCBmb3IgQysrMDMKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CitfVHAmCit1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+OjpvcGVyYXRvcltdKGNvbnN0IGtleV90eXBlJiBfX2spCit7CisgICAgaXRlcmF0b3IgX19pID0gZmluZChfX2spOworICAgIGlmIChfX2kgIT0gZW5kKCkpCisgICAgICAgIHJldHVybiBfX2ktPnNlY29uZDsKKyAgICBfX25vZGVfaG9sZGVyIF9faCA9IF9fY29uc3RydWN0X25vZGVfd2l0aF9rZXkoX19rKTsKKyAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBfX3IgPSBfX3RhYmxlXy5fX25vZGVfaW5zZXJ0X3VuaXF1ZShfX2guZ2V0KCkpOworICAgIF9faC5yZWxlYXNlKCk7CisgICAgcmV0dXJuIF9fci5maXJzdC0+c2Vjb25kOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTU9ERQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK19UcCYKK3Vub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OmF0KGNvbnN0IGtleV90eXBlJiBfX2spCit7CisgICAgaXRlcmF0b3IgX19pID0gZmluZChfX2spOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICBpZiAoX19pID09IGVuZCgpKQorICAgICAgICB0aHJvdyBvdXRfb2ZfcmFuZ2UoInVub3JkZXJlZF9tYXA6OmF0OiBrZXkgbm90IGZvdW5kIik7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIHJldHVybiBfX2ktPnNlY29uZDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Citjb25zdCBfVHAmCit1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+OjphdChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAoreworICAgIGNvbnN0X2l0ZXJhdG9yIF9faSA9IGZpbmQoX19rKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgaWYgKF9faSA9PSBlbmQoKSkKKyAgICAgICAgdGhyb3cgb3V0X29mX3JhbmdlKCJ1bm9yZGVyZWRfbWFwOjphdDoga2V5IG5vdCBmb3VuZCIpOworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICByZXR1cm4gX19pLT5zZWNvbmQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3N3YXAodW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorICAgICB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgX05PRVhDRVBUXyhfTk9FWENFUFRfKF9feC5zd2FwKF9feSkpKQoreworICAgIF9feC5zd2FwKF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorYm9vbAorb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgIGNvbnN0IHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKK3sKKyAgICBpZiAoX194LnNpemUoKSAhPSBfX3kuc2l6ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICBmb3IgKGNvbnN0X2l0ZXJhdG9yIF9faSA9IF9feC5iZWdpbigpLCBfX2V4ID0gX194LmVuZCgpLCBfX2V5ID0gX195LmVuZCgpOworICAgICAgICAgICAgX19pICE9IF9fZXg7ICsrX19pKQorICAgIHsKKyAgICAgICAgY29uc3RfaXRlcmF0b3IgX19qID0gX195LmZpbmQoX19pLT5maXJzdCk7CisgICAgICAgIGlmIChfX2ogPT0gX19leSB8fCAhKCpfX2kgPT0gKl9faikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KGNvbnN0IHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgY29uc3QgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQoreworICAgIHJldHVybiAhKF9feCA9PSBfX3kpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCA9IGhhc2g8X0tleT4sIGNsYXNzIF9QcmVkID0gZXF1YWxfdG88X0tleT4sCisgICAgICAgICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPHBhaXI8Y29uc3QgX0tleSwgX1RwPiA+ID4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHVub3JkZXJlZF9tdWx0aW1hcAoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBfS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRfdHlwZTsKKyAgICB0eXBlZGVmIF9IYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaGVyOworICAgIHR5cGVkZWYgX1ByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfZXF1YWw7CisgICAgdHlwZWRlZiBfQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgcGFpcjxjb25zdCBrZXlfdHlwZSwgbWFwcGVkX3R5cGU+ICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgcGFpcjxrZXlfdHlwZSwgbWFwcGVkX3R5cGU+ICAgICAgICAgICAgICAgICAgICBfX25jX3ZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHN0YXRpY19hc3NlcnQoKGlzX3NhbWU8dmFsdWVfdHlwZSwgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnZhbHVlX3R5cGU+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAiSW52YWxpZCBhbGxvY2F0b3I6OnZhbHVlX3R5cGUiKTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIF9faGFzaF92YWx1ZV90eXBlPGtleV90eXBlLCBtYXBwZWRfdHlwZT4gICAgICAgICAgICAgICAgIF9fdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9fdW5vcmRlcmVkX21hcF9oYXNoZXI8a2V5X3R5cGUsIF9fdmFsdWVfdHlwZSwgaGFzaGVyPiAgIF9faGFzaGVyOworICAgIHR5cGVkZWYgX191bm9yZGVyZWRfbWFwX2VxdWFsPGtleV90eXBlLCBfX3ZhbHVlX3R5cGUsIGtleV9lcXVhbD4gX19rZXlfZXF1YWw7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9hbGxvY19oZWxwZXI8YWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX192YWx1ZV90eXBlPjo6dHlwZSBfX2FsbG9jYXRvcl90eXBlOworCisgICAgdHlwZWRlZiBfX2hhc2hfdGFibGU8X192YWx1ZV90eXBlLCBfX2hhc2hlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2tleV9lcXVhbCwgIF9fYWxsb2NhdG9yX3R5cGU+ICAgX190YWJsZTsKKworICAgIF9fdGFibGUgX190YWJsZV87CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6Ol9Ob2RlVHlwZXMgICAgICAgICAgICAgICAgICAgX05vZGVUeXBlczsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6Ol9fbm9kZV90cmFpdHMgICAgICAgICAgICAgICAgX19ub2RlX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6Ol9fbm9kZV9hbGxvY2F0b3IgICAgICAgICAgICAgX19ub2RlX2FsbG9jYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6Ol9fbm9kZSAgICAgICAgICAgICAgICAgICAgICAgX19ub2RlOworICAgIHR5cGVkZWYgX19oYXNoX21hcF9ub2RlX2Rlc3RydWN0b3I8X19ub2RlX2FsbG9jYXRvcj4gICBfRHA7CisgICAgdHlwZWRlZiB1bmlxdWVfcHRyPF9fbm9kZSwgX0RwPiAgICAgICAgICAgICAgICAgICAgICAgICBfX25vZGVfaG9sZGVyOworICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT4gICAgICAgICAgICAgICBfX2FsbG9jX3RyYWl0czsKKyAgICBzdGF0aWNfYXNzZXJ0KChpc19zYW1lPHR5cGVuYW1lIF9fbm9kZV90cmFpdHM6OnNpemVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnNpemVfdHlwZT46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgIkFsbG9jYXRvciB1c2VzIGRpZmZlcmVudCBzaXplX3R5cGUgZm9yIGRpZmZlcmVudCB0eXBlcyIpOworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnBvaW50ZXIgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OmNvbnN0X3BvaW50ZXIgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6c2l6ZV90eXBlICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RhYmxlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKworICAgIHR5cGVkZWYgX19oYXNoX21hcF9pdGVyYXRvcjx0eXBlbmFtZSBfX3RhYmxlOjppdGVyYXRvcj4gICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfX2hhc2hfbWFwX2NvbnN0X2l0ZXJhdG9yPHR5cGVuYW1lIF9fdGFibGU6OmNvbnN0X2l0ZXJhdG9yPiBjb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9faGFzaF9tYXBfaXRlcmF0b3I8dHlwZW5hbWUgX190YWJsZTo6bG9jYWxfaXRlcmF0b3I+IGxvY2FsX2l0ZXJhdG9yOworICAgIHR5cGVkZWYgX19oYXNoX21hcF9jb25zdF9pdGVyYXRvcjx0eXBlbmFtZSBfX3RhYmxlOjpjb25zdF9sb2NhbF9pdGVyYXRvcj4gY29uc3RfbG9jYWxfaXRlcmF0b3I7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5vcmRlcmVkX211bHRpbWFwKCkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxfX3RhYmxlPjo6dmFsdWUpCisgICAgICAgIHsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIGV4cGxpY2l0IHVub3JkZXJlZF9tdWx0aW1hcChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpKTsKKyAgICB1bm9yZGVyZWRfbXVsdGltYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdW5vcmRlcmVkX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCkpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdW5vcmRlcmVkX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZXhwbGljaXQgdW5vcmRlcmVkX211bHRpbWFwKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworICAgIHVub3JkZXJlZF9tdWx0aW1hcChjb25zdCB1bm9yZGVyZWRfbXVsdGltYXAmIF9fdSk7CisgICAgdW5vcmRlcmVkX211bHRpbWFwKGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcCYgX191LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVub3JkZXJlZF9tdWx0aW1hcCh1bm9yZGVyZWRfbXVsdGltYXAmJiBfX3UpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8X190YWJsZT46OnZhbHVlKTsKKyAgICB1bm9yZGVyZWRfbXVsdGltYXAodW5vcmRlcmVkX211bHRpbWFwJiYgX191LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyAgICB1bm9yZGVyZWRfbXVsdGltYXAoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKTsKKyAgICB1bm9yZGVyZWRfbXVsdGltYXAoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpKTsKKyAgICB1bm9yZGVyZWRfbXVsdGltYXAoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB1bm9yZGVyZWRfbXVsdGltYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogdW5vcmRlcmVkX211bHRpbWFwKF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBfX2EpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVub3JkZXJlZF9tdWx0aW1hcChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICA6IHVub3JkZXJlZF9tdWx0aW1hcChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBfX2EpIHt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIHNpemVfdHlwZSBfX24sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICA6IHVub3JkZXJlZF9tdWx0aW1hcChfX2ZpcnN0LCBfX2xhc3QsIF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBfX2EpIHt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICA6IHVub3JkZXJlZF9tdWx0aW1hcChfX2ZpcnN0LCBfX2xhc3QsIF9fbiwgX19oZiwga2V5X2VxdWFsKCksIF9fYSkge30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5vcmRlcmVkX211bHRpbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCwgc2l6ZV90eXBlIF9fbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogdW5vcmRlcmVkX211bHRpbWFwKF9faWwsIF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBfX2EpIHt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVub3JkZXJlZF9tdWx0aW1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgCisgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiB1bm9yZGVyZWRfbXVsdGltYXAoX19pbCwgX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgX19hKSB7fQorI2VuZGlmCisgICAgLy8gfnVub3JkZXJlZF9tdWx0aW1hcCgpID0gZGVmYXVsdDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5vcmRlcmVkX211bHRpbWFwJiBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX211bHRpbWFwJiBfX3UpCisgICAgeworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICAgICAgX190YWJsZV8gPSBfX3UuX190YWJsZV87CisjZWxzZQorICAgICAgICBpZiAodGhpcyAhPSAmX191KSB7CisgICAgICAgICAgICBfX3RhYmxlXy5jbGVhcigpOworICAgICAgICAgICAgX190YWJsZV8uaGFzaF9mdW5jdGlvbigpID0gX191Ll9fdGFibGVfLmhhc2hfZnVuY3Rpb24oKTsKKyAgICAgICAgICAgIF9fdGFibGVfLmtleV9lcSgpID0gX191Ll9fdGFibGVfLmtleV9lcSgpOworICAgICAgICAgICAgX190YWJsZV8ubWF4X2xvYWRfZmFjdG9yKCkgPSBfX3UuX190YWJsZV8ubWF4X2xvYWRfZmFjdG9yKCk7CisgICAgICAgICAgICBfX3RhYmxlXy5fX2NvcHlfYXNzaWduX2FsbG9jKF9fdS5fX3RhYmxlXyk7CisgICAgICAgICAgICBpbnNlcnQoX191LmJlZ2luKCksIF9fdS5lbmQoKSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5vcmRlcmVkX211bHRpbWFwJiBvcGVyYXRvcj0odW5vcmRlcmVkX211bHRpbWFwJiYgX191KQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPF9fdGFibGU+Ojp2YWx1ZSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVub3JkZXJlZF9tdWx0aW1hcCYgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCk7CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBhbGxvY2F0b3JfdHlwZShfX3RhYmxlXy5fX25vZGVfYWxsb2MoKSk7fQorCisgICAgX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgICAgICBlbXB0eSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdGFibGVfLnNpemUoKSA9PSAwO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCBfTk9FWENFUFQgIHtyZXR1cm4gX190YWJsZV8uc2l6ZSgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190YWJsZV8ubWF4X3NpemUoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgICAgICAgYmVnaW4oKSBfTk9FWENFUFQgICAgICAgIHtyZXR1cm4gX190YWJsZV8uYmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yICAgICAgIGVuZCgpIF9OT0VYQ0VQVCAgICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmVuZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSAgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190YWJsZV8uYmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpICAgIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdGFibGVfLmVuZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190YWJsZV8uYmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGNlbmQoKSAgIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdGFibGVfLmVuZCgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KSB7cmV0dXJuIF9fdGFibGVfLl9faW5zZXJ0X211bHRpKF9feCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3AsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgICAge3JldHVybiBfX3RhYmxlXy5fX2luc2VydF9tdWx0aShfX3AuX19pXywgX194KTt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkKKyAgICAgICAge2luc2VydChfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3gpIHtyZXR1cm4gX190YWJsZV8uX19pbnNlcnRfbXVsdGkoX1ZTVEQ6Om1vdmUoX194KSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3AsIHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICAgIHtyZXR1cm4gX190YWJsZV8uX19pbnNlcnRfbXVsdGkoX19wLl9faV8sIF9WU1REOjptb3ZlKF9feCkpO30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfUHAsCisgICAgICAgICAgICAgIGNsYXNzID0gdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwgX1BwPjo6dmFsdWU+Ojp0eXBlPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBpbnNlcnQoX1BwJiYgX194KQorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9faW5zZXJ0X211bHRpKF9WU1REOjpmb3J3YXJkPF9QcD4oX194KSk7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9QcCwKKyAgICAgICAgICAgICAgY2xhc3MgPSB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLCBfUHA+Ojp2YWx1ZT46OnR5cGU+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3AsIF9QcCYmIF9feCkKKyAgICAgICAge3JldHVybiBfX3RhYmxlXy5fX2luc2VydF9tdWx0aShfX3AuX19pXywgX1ZTVEQ6OmZvcndhcmQ8X1BwPihfX3gpKTt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICAgaXRlcmF0b3IgZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykgeworICAgICAgICByZXR1cm4gX190YWJsZV8uX19lbXBsYWNlX211bHRpKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICAgaXRlcmF0b3IgZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpIHsKKyAgICAgICAgcmV0dXJuIF9fdGFibGVfLl9fZW1wbGFjZV9oaW50X211bHRpKF9fcC5fX2lfLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcCkge3JldHVybiBfX3RhYmxlXy5lcmFzZShfX3AuX19pXyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX3ApICAgICAgIHtyZXR1cm4gX190YWJsZV8uZXJhc2UoX19wLl9faV8pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2spIHtyZXR1cm4gX190YWJsZV8uX19lcmFzZV9tdWx0aShfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmVyYXNlKF9fZmlyc3QuX19pXywgX19sYXN0Ll9faV8pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBjbGVhcigpIF9OT0VYQ0VQVCB7X190YWJsZV8uY2xlYXIoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKHVub3JkZXJlZF9tdWx0aW1hcCYgX191KQorICAgICAgICBfTk9FWENFUFRfKF9faXNfbm90aHJvd19zd2FwcGFibGU8X190YWJsZT46OnZhbHVlKQorICAgICAgICB7X190YWJsZV8uc3dhcChfX3UuX190YWJsZV8pO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBoYXNoZXIgaGFzaF9mdW5jdGlvbigpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX190YWJsZV8uaGFzaF9mdW5jdGlvbigpLmhhc2hfZnVuY3Rpb24oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmtleV9lcSgpLmtleV9lcSgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciAgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2spICAgICAgIHtyZXR1cm4gX190YWJsZV8uZmluZChfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdCB7cmV0dXJuIF9fdGFibGVfLmZpbmQoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdCB7cmV0dXJuIF9fdGFibGVfLl9fY291bnRfbXVsdGkoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiAgICAgICAgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKQorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9fZXF1YWxfcmFuZ2VfbXVsdGkoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9fZXF1YWxfcmFuZ2VfbXVsdGkoX19rKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdGFibGVfLmJ1Y2tldF9jb3VudCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX3RhYmxlXy5tYXhfYnVja2V0X2NvdW50KCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBidWNrZXRfc2l6ZShzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmJ1Y2tldF9zaXplKF9fbik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgYnVja2V0KGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uYnVja2V0KF9fayk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGxvY2FsX2l0ZXJhdG9yICAgICAgIGJlZ2luKHNpemVfdHlwZSBfX24pICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmJlZ2luKF9fbik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBsb2NhbF9pdGVyYXRvciAgICAgICBlbmQoc2l6ZV90eXBlIF9fbikgICAgICAgICAge3JldHVybiBfX3RhYmxlXy5lbmQoX19uKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGJlZ2luKHNpemVfdHlwZSBfX24pIGNvbnN0ICB7cmV0dXJuIF9fdGFibGVfLmNiZWdpbihfX24pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IgZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0ICAgIHtyZXR1cm4gX190YWJsZV8uY2VuZChfX24pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IgY2JlZ2luKHNpemVfdHlwZSBfX24pIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uY2JlZ2luKF9fbik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9sb2NhbF9pdGVyYXRvciBjZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0ICAge3JldHVybiBfX3RhYmxlXy5jZW5kKF9fbik7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGZsb2F0IGxvYWRfZmFjdG9yKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190YWJsZV8ubG9hZF9mYWN0b3IoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGZsb2F0IG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdGFibGVfLm1heF9sb2FkX2ZhY3RvcigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBtYXhfbG9hZF9mYWN0b3IoZmxvYXQgX19tbGYpIHtfX3RhYmxlXy5tYXhfbG9hZF9mYWN0b3IoX19tbGYpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCByZWhhc2goc2l6ZV90eXBlIF9fbikge19fdGFibGVfLnJlaGFzaChfX24pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCByZXNlcnZlKHNpemVfdHlwZSBfX24pIHtfX3RhYmxlXy5yZXNlcnZlKF9fbik7fQorCisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisKKyAgICBib29sIF9fZGVyZWZlcmVuY2VhYmxlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yKiBfX2kpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX190YWJsZV8uX19kZXJlZmVyZW5jZWFibGUoJl9faS0+X19pXyk7fQorICAgIGJvb2wgX19kZWNyZW1lbnRhYmxlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yKiBfX2kpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX190YWJsZV8uX19kZWNyZW1lbnRhYmxlKCZfX2ktPl9faV8pO30KKyAgICBib29sIF9fYWRkYWJsZShjb25zdCBjb25zdF9pdGVyYXRvciogX19pLCBwdHJkaWZmX3QgX19uKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9fYWRkYWJsZSgmX19pLT5fX2lfLCBfX24pO30KKyAgICBib29sIF9fc3Vic2NyaXB0YWJsZShjb25zdCBjb25zdF9pdGVyYXRvciogX19pLCBwdHJkaWZmX3QgX19uKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9fYWRkYWJsZSgmX19pLT5fX2lfLCBfX24pO30KKworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKworCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3Vub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX211bHRpbWFwKAorICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwpCisgICAgOiBfX3RhYmxlXyhfX2hmLCBfX2VxbCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgX190YWJsZV8ucmVoYXNoKF9fbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojp1bm9yZGVyZWRfbXVsdGltYXAoCisgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKyAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fdGFibGVfKF9faGYsIF9fZXFsLCB0eXBlbmFtZSBfX3RhYmxlOjphbGxvY2F0b3JfdHlwZShfX2EpKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBfX3RhYmxlXy5yZWhhc2goX19uKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Cit1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OnVub3JkZXJlZF9tdWx0aW1hcCgKKyAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBpbnNlcnQoX19maXJzdCwgX19sYXN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Cit1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OnVub3JkZXJlZF9tdWx0aW1hcCgKKyAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBzaXplX3R5cGUgX19uLAorICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwpCisgICAgOiBfX3RhYmxlXyhfX2hmLCBfX2VxbCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgX190YWJsZV8ucmVoYXNoKF9fbik7CisgICAgaW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojp1bm9yZGVyZWRfbXVsdGltYXAoCisgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX190YWJsZV8oX19oZiwgX19lcWwsIHR5cGVuYW1lIF9fdGFibGU6OmFsbG9jYXRvcl90eXBlKF9fYSkpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIF9fdGFibGVfLnJlaGFzaChfX24pOworICAgIGluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK2lubGluZQordW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojp1bm9yZGVyZWRfbXVsdGltYXAoCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX3RhYmxlXyh0eXBlbmFtZSBfX3RhYmxlOjphbGxvY2F0b3JfdHlwZShfX2EpKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OnVub3JkZXJlZF9tdWx0aW1hcCgKKyAgICAgICAgY29uc3QgdW5vcmRlcmVkX211bHRpbWFwJiBfX3UpCisgICAgOiBfX3RhYmxlXyhfX3UuX190YWJsZV8pCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIF9fdGFibGVfLnJlaGFzaChfX3UuYnVja2V0X2NvdW50KCkpOworICAgIGluc2VydChfX3UuYmVnaW4oKSwgX191LmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OnVub3JkZXJlZF9tdWx0aW1hcCgKKyAgICAgICAgY29uc3QgdW5vcmRlcmVkX211bHRpbWFwJiBfX3UsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX3RhYmxlXyhfX3UuX190YWJsZV8sIHR5cGVuYW1lIF9fdGFibGU6OmFsbG9jYXRvcl90eXBlKF9fYSkpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIF9fdGFibGVfLnJlaGFzaChfX3UuYnVja2V0X2NvdW50KCkpOworICAgIGluc2VydChfX3UuYmVnaW4oKSwgX191LmVuZCgpKTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUKK3Vub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX211bHRpbWFwKAorICAgICAgICB1bm9yZGVyZWRfbXVsdGltYXAmJiBfX3UpCisgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxfX3RhYmxlPjo6dmFsdWUpCisgICAgOiBfX3RhYmxlXyhfVlNURDo6bW92ZShfX3UuX190YWJsZV8pKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisgICAgX19nZXRfZGIoKS0+c3dhcCh0aGlzLCAmX191KTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3Vub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX211bHRpbWFwKAorICAgICAgICB1bm9yZGVyZWRfbXVsdGltYXAmJiBfX3UsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX3RhYmxlXyhfVlNURDo6bW92ZShfX3UuX190YWJsZV8pLCB0eXBlbmFtZSBfX3RhYmxlOjphbGxvY2F0b3JfdHlwZShfX2EpKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBpZiAoX19hICE9IF9fdS5nZXRfYWxsb2NhdG9yKCkpCisgICAgeworICAgICAgICBpdGVyYXRvciBfX2kgPSBfX3UuYmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKF9fdS5zaXplKCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgX190YWJsZV8uX19pbnNlcnRfbXVsdGkoCisgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6Om1vdmUoX191Ll9fdGFibGVfLnJlbW92ZSgoX19pKyspLl9faV8pLT5fX3ZhbHVlXy5fX25jKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIGVsc2UKKyAgICAgICAgX19nZXRfZGIoKS0+c3dhcCh0aGlzLCAmX191KTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3Vub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX211bHRpbWFwKAorICAgICAgICBpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIGluc2VydChfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3Vub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX211bHRpbWFwKAorICAgICAgICBpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwKKyAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCkKKyAgICA6IF9fdGFibGVfKF9faGYsIF9fZXFsKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBfX3RhYmxlXy5yZWhhc2goX19uKTsKKyAgICBpbnNlcnQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OnVub3JkZXJlZF9tdWx0aW1hcCgKKyAgICAgICAgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsLCBzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsCisgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX3RhYmxlXyhfX2hmLCBfX2VxbCwgdHlwZW5hbWUgX190YWJsZTo6YWxsb2NhdG9yX3R5cGUoX19hKSkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgX190YWJsZV8ucmVoYXNoKF9fbik7CisgICAgaW5zZXJ0KF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgoraW5saW5lCit1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mCit1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46Om9wZXJhdG9yPSh1bm9yZGVyZWRfbXVsdGltYXAmJiBfX3UpCisgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfX3RhYmxlPjo6dmFsdWUpCit7CisgICAgX190YWJsZV8gPSBfVlNURDo6bW92ZShfX3UuX190YWJsZV8pOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUKK3Vub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYKK3Vub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6b3BlcmF0b3I9KAorICAgICAgICBpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpCit7CisgICAgX190YWJsZV8uX19hc3NpZ25fbXVsdGkoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2lubGluZQordm9pZAordW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+OjppbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgX190YWJsZV8uX19pbnNlcnRfbXVsdGkoKl9fZmlyc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzd2FwKHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorICAgICB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICBfTk9FWENFUFRfKF9OT0VYQ0VQVF8oX194LnN3YXAoX195KSkpCit7CisgICAgX194LnN3YXAoX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Citib29sCitvcGVyYXRvcj09KGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorICAgICAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKK3sKKyAgICBpZiAoX194LnNpemUoKSAhPSBfX3kuc2l6ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IF9FcVJuZzsKKyAgICBmb3IgKGNvbnN0X2l0ZXJhdG9yIF9faSA9IF9feC5iZWdpbigpLCBfX2V4ID0gX194LmVuZCgpOyBfX2kgIT0gX19leDspCisgICAgeworICAgICAgICBfRXFSbmcgX194ZXEgPSBfX3guZXF1YWxfcmFuZ2UoX19pLT5maXJzdCk7CisgICAgICAgIF9FcVJuZyBfX3llcSA9IF9feS5lcXVhbF9yYW5nZShfX2ktPmZpcnN0KTsKKyAgICAgICAgaWYgKF9WU1REOjpkaXN0YW5jZShfX3hlcS5maXJzdCwgX194ZXEuc2Vjb25kKSAhPQorICAgICAgICAgICAgX1ZTVEQ6OmRpc3RhbmNlKF9feWVxLmZpcnN0LCBfX3llcS5zZWNvbmQpIHx8CisgICAgICAgICAgICAgICAgICAhX1ZTVEQ6OmlzX3Blcm11dGF0aW9uKF9feGVxLmZpcnN0LCBfX3hlcS5zZWNvbmQsIF9feWVxLmZpcnN0KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgX19pID0gX194ZXEuc2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgY29uc3QgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194ID09IF9feSk7Cit9CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX1VOT1JERVJFRF9NQVAKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS91bm9yZGVyZWRfc2V0IGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3Vub3JkZXJlZF9zZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlMDI0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS91bm9yZGVyZWRfc2V0CkBAIC0wLDAgKzEsMTM1MCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdW5vcmRlcmVkX3NldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9VTk9SREVSRURfU0VUCisjZGVmaW5lIF9MSUJDUFBfVU5PUkRFUkVEX1NFVAorCisvKgorCisgICAgdW5vcmRlcmVkX3NldCBzeW5vcHNpcworCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKworbmFtZXNwYWNlIHN0ZAoreworCit0ZW1wbGF0ZSA8Y2xhc3MgVmFsdWUsIGNsYXNzIEhhc2ggPSBoYXNoPFZhbHVlPiwgY2xhc3MgUHJlZCA9IGVxdWFsX3RvPFZhbHVlPiwKKyAgICAgICAgICBjbGFzcyBBbGxvYyA9IGFsbG9jYXRvcjxWYWx1ZT4+CitjbGFzcyB1bm9yZGVyZWRfc2V0Cit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CisgICAgdHlwZWRlZiBrZXlfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBIYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlcjsKKyAgICB0eXBlZGVmIFByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2VxdWFsOworICAgIHR5cGVkZWYgQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPjo6cG9pbnRlciAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPjo6Y29uc3RfcG9pbnRlciAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPGFsbG9jYXRvcl90eXBlPjo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgdHlwZWRlZiAvdW5zcGVjaWZpZWQvIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgL3Vuc3BlY2lmaWVkLyBjb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIC91bnNwZWNpZmllZC8gbG9jYWxfaXRlcmF0b3I7CisgICAgdHlwZWRlZiAvdW5zcGVjaWZpZWQvIGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworCisgICAgdW5vcmRlcmVkX3NldCgpCisgICAgICAgIG5vZXhjZXB0KAorICAgICAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8aGFzaGVyPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGtleV9lcXVhbD46OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKTsKKyAgICBleHBsaWNpdCB1bm9yZGVyZWRfc2V0KHNpemVfdHlwZSBuLCBjb25zdCBoYXNoZXImIGhmID0gaGFzaGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIGVxbCA9IGtleV9lcXVhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdW5vcmRlcmVkX3NldChJbnB1dEl0ZXJhdG9yIGYsIElucHV0SXRlcmF0b3IgbCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgbiA9IDAsIGNvbnN0IGhhc2hlciYgaGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIGVxbCA9IGtleV9lcXVhbCgpLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSk7CisgICAgZXhwbGljaXQgdW5vcmRlcmVkX3NldChjb25zdCBhbGxvY2F0b3JfdHlwZSYpOworICAgIHVub3JkZXJlZF9zZXQoY29uc3QgdW5vcmRlcmVkX3NldCYpOworICAgIHVub3JkZXJlZF9zZXQoY29uc3QgdW5vcmRlcmVkX3NldCYsIGNvbnN0IEFsbG9jYXRvciYpOworICAgIHVub3JkZXJlZF9zZXQodW5vcmRlcmVkX3NldCYmKQorICAgICAgICBub2V4Y2VwdCgKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGhhc2hlcj46OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxrZXlfZXF1YWw+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisgICAgdW5vcmRlcmVkX3NldCh1bm9yZGVyZWRfc2V0JiYsIGNvbnN0IEFsbG9jYXRvciYpOworICAgIHVub3JkZXJlZF9zZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiwgc2l6ZV90eXBlIG4gPSAwLAorICAgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBoZiA9IGhhc2hlcigpLCBjb25zdCBrZXlfZXF1YWwmIGVxbCA9IGtleV9lcXVhbCgpLAorICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKyAgICB1bm9yZGVyZWRfc2V0KHNpemVfdHlwZSBuLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7IC8vIEMrKzE0CisgICAgdW5vcmRlcmVkX3NldChzaXplX3R5cGUgbiwgY29uc3QgaGFzaGVyJiBoZiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOyAvLyBDKysxNAorICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgdW5vcmRlcmVkX3NldChJbnB1dEl0ZXJhdG9yIGYsIElucHV0SXRlcmF0b3IgbCwgc2l6ZV90eXBlIG4sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsgLy8gQysrMTQKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgIHVub3JkZXJlZF9zZXQoSW5wdXRJdGVyYXRvciBmLCBJbnB1dEl0ZXJhdG9yIGwsIHNpemVfdHlwZSBuLCAKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBoZiwgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsgLy8gQysrMTQKKyAgICB1bm9yZGVyZWRfc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwsIHNpemVfdHlwZSBuLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7IC8vIEMrKzE0CisgICAgdW5vcmRlcmVkX3NldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IGlsLCBzaXplX3R5cGUgbiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hlciYgaGYsICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7IC8vIEMrKzE0CisgICAgfnVub3JkZXJlZF9zZXQoKTsKKyAgICB1bm9yZGVyZWRfc2V0JiBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX3NldCYpOworICAgIHVub3JkZXJlZF9zZXQmIG9wZXJhdG9yPSh1bm9yZGVyZWRfc2V0JiYpCisgICAgICAgIG5vZXhjZXB0KAorICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8aGFzaGVyPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGtleV9lcXVhbD46OnZhbHVlKTsKKyAgICB1bm9yZGVyZWRfc2V0JiBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPik7CisKKyAgICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICBib29sICAgICAgZW1wdHkoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IG5vZXhjZXB0OworICAgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IG5vZXhjZXB0OworCisgICAgaXRlcmF0b3IgICAgICAgYmVnaW4oKSBub2V4Y2VwdDsKKyAgICBpdGVyYXRvciAgICAgICBlbmQoKSBub2V4Y2VwdDsKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpICBjb25zdCBub2V4Y2VwdDsKKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSAgICBjb25zdCBub2V4Y2VwdDsKKyAgICBjb25zdF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdDsKKyAgICBjb25zdF9pdGVyYXRvciBjZW5kKCkgICBjb25zdCBub2V4Y2VwdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorICAgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBlbXBsYWNlKEFyZ3MmJi4uLiBhcmdzKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KKyAgICAgICAgaXRlcmF0b3IgZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCBBcmdzJiYuLi4gYXJncyk7CisgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIG9iaik7CisgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KHZhbHVlX3R5cGUmJiBvYmopOworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBoaW50LCBjb25zdCB2YWx1ZV90eXBlJiBvYmopOworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBoaW50LCB2YWx1ZV90eXBlJiYgb2JqKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZCBpbnNlcnQoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0KTsKKyAgICB2b2lkIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+KTsKKworICAgIGl0ZXJhdG9yIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uKTsKKyAgICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBwb3NpdGlvbik7ICAvLyBDKysxNAorICAgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgayk7CisgICAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIGxhc3QpOworICAgIHZvaWQgY2xlYXIoKSBub2V4Y2VwdDsKKworICAgIHZvaWQgc3dhcCh1bm9yZGVyZWRfc2V0JikKKyAgICAgICBub2V4Y2VwdChhbGxvY2F0b3JfdHJhaXRzPEFsbG9jYXRvcj46OmlzX2Fsd2F5c19lcXVhbDo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgbm9leGNlcHQoc3dhcChkZWNsdmFsPGhhc2hlciY+KCksIGRlY2x2YWw8aGFzaGVyJj4oKSkpICYmCisgICAgICAgICAgICAgICAgIG5vZXhjZXB0KHN3YXAoZGVjbHZhbDxrZXlfZXF1YWwmPigpLCBkZWNsdmFsPGtleV9lcXVhbCY+KCkpKSk7IC8vIEMrKzE3CisKKyAgICBoYXNoZXIgaGFzaF9mdW5jdGlvbigpIGNvbnN0OworICAgIGtleV9lcXVhbCBrZXlfZXEoKSBjb25zdDsKKworICAgIGl0ZXJhdG9yICAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIGspOworICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworICAgIHNpemVfdHlwZSBjb3VudChjb25zdCBrZXlfdHlwZSYgaykgY29uc3Q7CisgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+ICAgICAgICAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworCisgICAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IG5vZXhjZXB0OworICAgIHNpemVfdHlwZSBtYXhfYnVja2V0X2NvdW50KCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICBzaXplX3R5cGUgYnVja2V0X3NpemUoc2l6ZV90eXBlIG4pIGNvbnN0OworICAgIHNpemVfdHlwZSBidWNrZXQoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworCisgICAgbG9jYWxfaXRlcmF0b3IgICAgICAgYmVnaW4oc2l6ZV90eXBlIG4pOworICAgIGxvY2FsX2l0ZXJhdG9yICAgICAgIGVuZChzaXplX3R5cGUgbik7CisgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIG4pIGNvbnN0OworICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGVuZChzaXplX3R5cGUgbikgY29uc3Q7CisgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IgY2JlZ2luKHNpemVfdHlwZSBuKSBjb25zdDsKKyAgICBjb25zdF9sb2NhbF9pdGVyYXRvciBjZW5kKHNpemVfdHlwZSBuKSBjb25zdDsKKworICAgIGZsb2F0IGxvYWRfZmFjdG9yKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgZmxvYXQgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgdm9pZCBtYXhfbG9hZF9mYWN0b3IoZmxvYXQgeik7CisgICAgdm9pZCByZWhhc2goc2l6ZV90eXBlIG4pOworICAgIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgbik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVmFsdWUsIGNsYXNzIEhhc2gsIGNsYXNzIFByZWQsIGNsYXNzIEFsbG9jPgorICAgIHZvaWQgc3dhcCh1bm9yZGVyZWRfc2V0PFZhbHVlLCBIYXNoLCBQcmVkLCBBbGxvYz4mIHgsCisgICAgICAgICAgICAgIHVub3JkZXJlZF9zZXQ8VmFsdWUsIEhhc2gsIFByZWQsIEFsbG9jPiYgeSkKKyAgICAgICAgICAgICAgbm9leGNlcHQobm9leGNlcHQoeC5zd2FwKHkpKSk7CisKK3RlbXBsYXRlIDxjbGFzcyBWYWx1ZSwgY2xhc3MgSGFzaCwgY2xhc3MgUHJlZCwgY2xhc3MgQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdW5vcmRlcmVkX3NldDxWYWx1ZSwgSGFzaCwgUHJlZCwgQWxsb2M+JiB4LAorICAgICAgICAgICAgICAgY29uc3QgdW5vcmRlcmVkX3NldDxWYWx1ZSwgSGFzaCwgUHJlZCwgQWxsb2M+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIFZhbHVlLCBjbGFzcyBIYXNoLCBjbGFzcyBQcmVkLCBjbGFzcyBBbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfc2V0PFZhbHVlLCBIYXNoLCBQcmVkLCBBbGxvYz4mIHgsCisgICAgICAgICAgICAgICBjb25zdCB1bm9yZGVyZWRfc2V0PFZhbHVlLCBIYXNoLCBQcmVkLCBBbGxvYz4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVmFsdWUsIGNsYXNzIEhhc2ggPSBoYXNoPFZhbHVlPiwgY2xhc3MgUHJlZCA9IGVxdWFsX3RvPFZhbHVlPiwKKyAgICAgICAgICBjbGFzcyBBbGxvYyA9IGFsbG9jYXRvcjxWYWx1ZT4+CitjbGFzcyB1bm9yZGVyZWRfbXVsdGlzZXQKK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICB0eXBlZGVmIGtleV90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIEhhc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaGVyOworICAgIHR5cGVkZWYgUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfZXF1YWw7CisgICAgdHlwZWRlZiBBbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+Ojpwb2ludGVyICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+Ojpjb25zdF9wb2ludGVyICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+OjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICB0eXBlZGVmIC91bnNwZWNpZmllZC8gaXRlcmF0b3I7CisgICAgdHlwZWRlZiAvdW5zcGVjaWZpZWQvIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgL3Vuc3BlY2lmaWVkLyBsb2NhbF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIC91bnNwZWNpZmllZC8gY29uc3RfbG9jYWxfaXRlcmF0b3I7CisKKyAgICB1bm9yZGVyZWRfbXVsdGlzZXQoKQorICAgICAgICBub2V4Y2VwdCgKKyAgICAgICAgICAgIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGhhc2hlcj46OnZhbHVlICYmCisgICAgICAgICAgICBpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxrZXlfZXF1YWw+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisgICAgZXhwbGljaXQgdW5vcmRlcmVkX211bHRpc2V0KHNpemVfdHlwZSBuLCBjb25zdCBoYXNoZXImIGhmID0gaGFzaGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIGVxbCA9IGtleV9lcXVhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdW5vcmRlcmVkX211bHRpc2V0KElucHV0SXRlcmF0b3IgZiwgSW5wdXRJdGVyYXRvciBsLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBuID0gMCwgY29uc3QgaGFzaGVyJiBoZiA9IGhhc2hlcigpLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgZXFsID0ga2V5X2VxdWFsKCksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKyAgICBleHBsaWNpdCB1bm9yZGVyZWRfbXVsdGlzZXQoY29uc3QgYWxsb2NhdG9yX3R5cGUmKTsKKyAgICB1bm9yZGVyZWRfbXVsdGlzZXQoY29uc3QgdW5vcmRlcmVkX211bHRpc2V0Jik7CisgICAgdW5vcmRlcmVkX211bHRpc2V0KGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldCYsIGNvbnN0IEFsbG9jYXRvciYpOworICAgIHVub3JkZXJlZF9tdWx0aXNldCh1bm9yZGVyZWRfbXVsdGlzZXQmJikKKyAgICAgICAgbm9leGNlcHQoCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxoYXNoZXI+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8a2V5X2VxdWFsPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpOworICAgIHVub3JkZXJlZF9tdWx0aXNldCh1bm9yZGVyZWRfbXVsdGlzZXQmJiwgY29uc3QgQWxsb2NhdG9yJik7CisgICAgdW5vcmRlcmVkX211bHRpc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4sIHNpemVfdHlwZSBuID0gL3NlZSBiZWxvdy8sCisgICAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIGhmID0gaGFzaGVyKCksIGNvbnN0IGtleV9lcXVhbCYgZXFsID0ga2V5X2VxdWFsKCksCisgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSA9IGFsbG9jYXRvcl90eXBlKCkpOworICAgIHVub3JkZXJlZF9tdWx0aXNldChzaXplX3R5cGUgbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOyAvLyBDKysxNAorICAgIHVub3JkZXJlZF9tdWx0aXNldChzaXplX3R5cGUgbiwgY29uc3QgaGFzaGVyJiBoZiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOyAvLyBDKysxNAorICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgdW5vcmRlcmVkX211bHRpc2V0KElucHV0SXRlcmF0b3IgZiwgSW5wdXRJdGVyYXRvciBsLCBzaXplX3R5cGUgbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOyAvLyBDKysxNAorICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgdW5vcmRlcmVkX211bHRpc2V0KElucHV0SXRlcmF0b3IgZiwgSW5wdXRJdGVyYXRvciBsLCBzaXplX3R5cGUgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNoZXImIGhmLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7IC8vIEMrKzE0CisgICAgdW5vcmRlcmVkX211bHRpc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwsIHNpemVfdHlwZSBuLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSk7IC8vIEMrKzE0CisgICAgdW5vcmRlcmVkX211bHRpc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwsIHNpemVfdHlwZSBuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBoZiwgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsgLy8gQysrMTQKKyAgICB+dW5vcmRlcmVkX211bHRpc2V0KCk7CisgICAgdW5vcmRlcmVkX211bHRpc2V0JiBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX211bHRpc2V0Jik7CisgICAgdW5vcmRlcmVkX211bHRpc2V0JiBvcGVyYXRvcj0odW5vcmRlcmVkX211bHRpc2V0JiYpCisgICAgICAgIG5vZXhjZXB0KAorICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8aGFzaGVyPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGtleV9lcXVhbD46OnZhbHVlKTsKKyAgICB1bm9yZGVyZWRfbXVsdGlzZXQmIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+KTsKKworICAgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIGJvb2wgICAgICBlbXB0eSgpIGNvbnN0IG5vZXhjZXB0OworICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICBpdGVyYXRvciAgICAgICBiZWdpbigpIG5vZXhjZXB0OworICAgIGl0ZXJhdG9yICAgICAgIGVuZCgpIG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgIGNvbnN0IG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpICAgIGNvbnN0IG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yIGNlbmQoKSAgIGNvbnN0IG5vZXhjZXB0OworCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CisgICAgICAgIGl0ZXJhdG9yIGVtcGxhY2UoQXJncyYmLi4uIGFyZ3MpOworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorICAgICAgICBpdGVyYXRvciBlbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24sIEFyZ3MmJi4uLiBhcmdzKTsKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgb2JqKTsKKyAgICBpdGVyYXRvciBpbnNlcnQodmFsdWVfdHlwZSYmIG9iaik7CisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIGhpbnQsIGNvbnN0IHZhbHVlX3R5cGUmIG9iaik7CisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIGhpbnQsIHZhbHVlX3R5cGUmJiBvYmopOworICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkIGluc2VydChJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QpOworICAgIHZvaWQgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4pOworCisgICAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24pOworICAgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIHBvc2l0aW9uKTsgIC8vIEMrKzE0CisgICAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCk7CisgICAgdm9pZCBjbGVhcigpIG5vZXhjZXB0OworCisgICAgdm9pZCBzd2FwKHVub3JkZXJlZF9tdWx0aXNldCYpCisgICAgICAgbm9leGNlcHQoYWxsb2NhdG9yX3RyYWl0czxBbGxvY2F0b3I+Ojppc19hbHdheXNfZXF1YWw6OnZhbHVlICYmCisgICAgICAgICAgICAgICAgIG5vZXhjZXB0KHN3YXAoZGVjbHZhbDxoYXNoZXImPigpLCBkZWNsdmFsPGhhc2hlciY+KCkpKSAmJgorICAgICAgICAgICAgICAgICBub2V4Y2VwdChzd2FwKGRlY2x2YWw8a2V5X2VxdWFsJj4oKSwgZGVjbHZhbDxrZXlfZXF1YWwmPigpKSkpOyAvLyBDKysxNworCisgICAgaGFzaGVyIGhhc2hfZnVuY3Rpb24oKSBjb25zdDsKKyAgICBrZXlfZXF1YWwga2V5X2VxKCkgY29uc3Q7CisKKyAgICBpdGVyYXRvciAgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBrKTsKKyAgICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IGtleV90eXBlJiBrKSBjb25zdDsKKyAgICBzaXplX3R5cGUgY291bnQoY29uc3Qga2V5X3R5cGUmIGspIGNvbnN0OworICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiAgICAgICAgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgayk7CisgICAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBrKSBjb25zdDsKKworICAgIHNpemVfdHlwZSBidWNrZXRfY291bnQoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0IG5vZXhjZXB0OworCisgICAgc2l6ZV90eXBlIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBuKSBjb25zdDsKKyAgICBzaXplX3R5cGUgYnVja2V0KGNvbnN0IGtleV90eXBlJiBrKSBjb25zdDsKKworICAgIGxvY2FsX2l0ZXJhdG9yICAgICAgIGJlZ2luKHNpemVfdHlwZSBuKTsKKyAgICBsb2NhbF9pdGVyYXRvciAgICAgICBlbmQoc2l6ZV90eXBlIG4pOworICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGJlZ2luKHNpemVfdHlwZSBuKSBjb25zdDsKKyAgICBjb25zdF9sb2NhbF9pdGVyYXRvciBlbmQoc2l6ZV90eXBlIG4pIGNvbnN0OworICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGNiZWdpbihzaXplX3R5cGUgbikgY29uc3Q7CisgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IgY2VuZChzaXplX3R5cGUgbikgY29uc3Q7CisKKyAgICBmbG9hdCBsb2FkX2ZhY3RvcigpIGNvbnN0IG5vZXhjZXB0OworICAgIGZsb2F0IG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IG5vZXhjZXB0OworICAgIHZvaWQgbWF4X2xvYWRfZmFjdG9yKGZsb2F0IHopOworICAgIHZvaWQgcmVoYXNoKHNpemVfdHlwZSBuKTsKKyAgICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIG4pOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFZhbHVlLCBjbGFzcyBIYXNoLCBjbGFzcyBQcmVkLCBjbGFzcyBBbGxvYz4KKyAgICB2b2lkIHN3YXAodW5vcmRlcmVkX211bHRpc2V0PFZhbHVlLCBIYXNoLCBQcmVkLCBBbGxvYz4mIHgsCisgICAgICAgICAgICAgIHVub3JkZXJlZF9tdWx0aXNldDxWYWx1ZSwgSGFzaCwgUHJlZCwgQWxsb2M+JiB5KQorICAgICAgICAgICAgICBub2V4Y2VwdChub2V4Y2VwdCh4LnN3YXAoeSkpKTsKKwordGVtcGxhdGUgPGNsYXNzIFZhbHVlLCBjbGFzcyBIYXNoLCBjbGFzcyBQcmVkLCBjbGFzcyBBbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8VmFsdWUsIEhhc2gsIFByZWQsIEFsbG9jPiYgeCwKKyAgICAgICAgICAgICAgIGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldDxWYWx1ZSwgSGFzaCwgUHJlZCwgQWxsb2M+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIFZhbHVlLCBjbGFzcyBIYXNoLCBjbGFzcyBQcmVkLCBjbGFzcyBBbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8VmFsdWUsIEhhc2gsIFByZWQsIEFsbG9jPiYgeCwKKyAgICAgICAgICAgICAgIGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldDxWYWx1ZSwgSGFzaCwgUHJlZCwgQWxsb2M+JiB5KTsKK30gIC8vIHN0ZAorCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisjaW5jbHVkZSA8X19oYXNoX3RhYmxlPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlIDxfX2RlYnVnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoID0gaGFzaDxfVmFsdWU+LCBjbGFzcyBfUHJlZCA9IGVxdWFsX3RvPF9WYWx1ZT4sCisgICAgICAgICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPF9WYWx1ZT4gPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdW5vcmRlcmVkX3NldAoreworcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiBfVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgIHR5cGVkZWYga2V5X3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0hhc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXI7CisgICAgdHlwZWRlZiBfUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9lcXVhbDsKKyAgICB0eXBlZGVmIF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHN0YXRpY19hc3NlcnQoKGlzX3NhbWU8dmFsdWVfdHlwZSwgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnZhbHVlX3R5cGU+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAiSW52YWxpZCBhbGxvY2F0b3I6OnZhbHVlX3R5cGUiKTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIF9faGFzaF90YWJsZTx2YWx1ZV90eXBlLCBoYXNoZXIsIGtleV9lcXVhbCwgYWxsb2NhdG9yX3R5cGU+IF9fdGFibGU7CisKKyAgICBfX3RhYmxlIF9fdGFibGVfOworCitwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RhYmxlOjpwb2ludGVyICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6OmNvbnN0X3BvaW50ZXIgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6OmNvbnN0X2l0ZXJhdG9yICAgICAgIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RhYmxlOjpjb25zdF9sb2NhbF9pdGVyYXRvciBsb2NhbF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6OmNvbnN0X2xvY2FsX2l0ZXJhdG9yIGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVub3JkZXJlZF9zZXQoKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9fdGFibGU+Ojp2YWx1ZSkKKyAgICAgICAgeworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICAgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgZXhwbGljaXQgdW5vcmRlcmVkX3NldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSk7CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVub3JkZXJlZF9zZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgICAgOiB1bm9yZGVyZWRfc2V0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBfX2EpIHt9CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB1bm9yZGVyZWRfc2V0KHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgICAgOiB1bm9yZGVyZWRfc2V0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIF9fYSkge30KKyNlbmRpZgorICAgIHVub3JkZXJlZF9zZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB1bm9yZGVyZWRfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB1bm9yZGVyZWRfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCkpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdW5vcmRlcmVkX3NldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHVub3JkZXJlZF9zZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCAKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgICAgICAgIDogdW5vcmRlcmVkX3NldChfX2ZpcnN0LCBfX2xhc3QsIF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBfX2EpIHt9CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB1bm9yZGVyZWRfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgICAgICAgOiB1bm9yZGVyZWRfc2V0KF9fZmlyc3QsIF9fbGFzdCwgX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgX19hKSB7fQorI2VuZGlmCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IHVub3JkZXJlZF9zZXQoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgdW5vcmRlcmVkX3NldChjb25zdCB1bm9yZGVyZWRfc2V0JiBfX3UpOworICAgIHVub3JkZXJlZF9zZXQoY29uc3QgdW5vcmRlcmVkX3NldCYgX191LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVub3JkZXJlZF9zZXQodW5vcmRlcmVkX3NldCYmIF9fdSkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxfX3RhYmxlPjo6dmFsdWUpOworICAgIHVub3JkZXJlZF9zZXQodW5vcmRlcmVkX3NldCYmIF9fdSwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgdW5vcmRlcmVkX3NldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpOworICAgIHVub3JkZXJlZF9zZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCkpOworICAgIHVub3JkZXJlZF9zZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVub3JkZXJlZF9zZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgICAgOiB1bm9yZGVyZWRfc2V0KF9faWwsIF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBfX2EpIHt9CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB1bm9yZGVyZWRfc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCwgc2l6ZV90eXBlIF9fbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgICA6IHVub3JkZXJlZF9zZXQoX19pbCwgX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgX19hKSB7fQorI2VuZGlmCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIC8vIH51bm9yZGVyZWRfc2V0KCkgPSBkZWZhdWx0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB1bm9yZGVyZWRfc2V0JiBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX3NldCYgX191KQorICAgIHsKKyAgICAgICAgX190YWJsZV8gPSBfX3UuX190YWJsZV87CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB1bm9yZGVyZWRfc2V0JiBvcGVyYXRvcj0odW5vcmRlcmVkX3NldCYmIF9fdSkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfX3RhYmxlPjo6dmFsdWUpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB1bm9yZGVyZWRfc2V0JiBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGFsbG9jYXRvcl90eXBlKF9fdGFibGVfLl9fbm9kZV9hbGxvYygpKTt9CisKKyAgICBfTElCQ1BQX05PRElTQ0FSRF9BRlRFUl9DWFgxNyBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCAgICAgIGVtcHR5KCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190YWJsZV8uc2l6ZSgpID09IDA7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IF9OT0VYQ0VQVCAge3JldHVybiBfX3RhYmxlXy5zaXplKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RhYmxlXy5tYXhfc2l6ZSgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciAgICAgICBiZWdpbigpIF9OT0VYQ0VQVCAgICAgICAge3JldHVybiBfX3RhYmxlXy5iZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgICAgICAgZW5kKCkgX05PRVhDRVBUICAgICAgICAgIHtyZXR1cm4gX190YWJsZV8uZW5kKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpICBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RhYmxlXy5iZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICAgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190YWJsZV8uZW5kKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RhYmxlXy5iZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgY2VuZCgpICAgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190YWJsZV8uZW5kKCk7fQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBlbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICAgICAge3JldHVybiBfX3RhYmxlXy5fX2VtcGxhY2VfdW5pcXVlKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTt9CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgIGl0ZXJhdG9yIGVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2ZpbmRfY19mcm9tX2koJl9fcCkgPT0gdGhpcywKKyAgICAgICAgICAgICAgICAidW5vcmRlcmVkX3NldDo6ZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yLCBhcmdzLi4uKSBjYWxsZWQgd2l0aCBhbiBpdGVyYXRvciBub3QiCisgICAgICAgICAgICAgICAgIiByZWZlcnJpbmcgdG8gdGhpcyB1bm9yZGVyZWRfc2V0Iik7CisgICAgICAgICAgICByZXR1cm4gX190YWJsZV8uX19lbXBsYWNlX3VuaXF1ZShfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikuZmlyc3Q7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGl0ZXJhdG9yIGVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9fZW1wbGFjZV91bmlxdWUoX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLmZpcnN0O30KKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydCh2YWx1ZV90eXBlJiYgX194KQorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9faW5zZXJ0X3VuaXF1ZShfVlNURDo6bW92ZShfX3gpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3AsIHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZmluZF9jX2Zyb21faSgmX19wKSA9PSB0aGlzLAorICAgICAgICAgICAgICAgICJ1bm9yZGVyZWRfc2V0OjppbnNlcnQoY29uc3RfaXRlcmF0b3IsIHZhbHVlX3R5cGUmJikgY2FsbGVkIHdpdGggYW4gaXRlcmF0b3Igbm90IgorICAgICAgICAgICAgICAgICIgcmVmZXJyaW5nIHRvIHRoaXMgdW5vcmRlcmVkX3NldCIpOworICAgICAgICAgICAgcmV0dXJuIGluc2VydChfVlNURDo6bW92ZShfX3gpKS5maXJzdDsKKyAgICAgICAgfQorI2Vsc2UKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IsIHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICAgIHtyZXR1cm4gaW5zZXJ0KF9WU1REOjptb3ZlKF9feCkpLmZpcnN0O30KKyNlbmRpZgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpCisgICAgICAgIHtpbnNlcnQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTt9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9faW5zZXJ0X3VuaXF1ZShfX3gpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZmluZF9jX2Zyb21faSgmX19wKSA9PSB0aGlzLAorICAgICAgICAgICAgICAgICJ1bm9yZGVyZWRfc2V0OjppbnNlcnQoY29uc3RfaXRlcmF0b3IsIGNvbnN0IHZhbHVlX3R5cGUmKSBjYWxsZWQgd2l0aCBhbiBpdGVyYXRvciBub3QiCisgICAgICAgICAgICAgICAgIiByZWZlcnJpbmcgdG8gdGhpcyB1bm9yZGVyZWRfc2V0Iik7CisgICAgICAgICAgICByZXR1cm4gaW5zZXJ0KF9feCkuZmlyc3Q7CisgICAgICAgIH0KKyNlbHNlCisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICAgIHtyZXR1cm4gaW5zZXJ0KF9feCkuZmlyc3Q7fQorI2VuZGlmCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wKSB7cmV0dXJuIF9fdGFibGVfLmVyYXNlKF9fcCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9faykge3JldHVybiBfX3RhYmxlXy5fX2VyYXNlX3VuaXF1ZShfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGNsZWFyKCkgX05PRVhDRVBUIHtfX3RhYmxlXy5jbGVhcigpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHN3YXAodW5vcmRlcmVkX3NldCYgX191KQorICAgICAgICBfTk9FWENFUFRfKF9faXNfbm90aHJvd19zd2FwcGFibGU8X190YWJsZT46OnZhbHVlKQorICAgICAgICB7X190YWJsZV8uc3dhcChfX3UuX190YWJsZV8pO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBoYXNoZXIgaGFzaF9mdW5jdGlvbigpIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uaGFzaF9mdW5jdGlvbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0IHtyZXR1cm4gX190YWJsZV8ua2V5X2VxKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yICAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykgICAgICAge3JldHVybiBfX3RhYmxlXy5maW5kKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uZmluZChfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uX19jb3VudF91bmlxdWUoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiAgICAgICAgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKQorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9fZXF1YWxfcmFuZ2VfdW5pcXVlKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICAgICAge3JldHVybiBfX3RhYmxlXy5fX2VxdWFsX3JhbmdlX3VuaXF1ZShfX2spO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgYnVja2V0X2NvdW50KCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190YWJsZV8uYnVja2V0X2NvdW50KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdGFibGVfLm1heF9idWNrZXRfY291bnQoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBfX24pIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uYnVja2V0X3NpemUoX19uKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBidWNrZXQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Qge3JldHVybiBfX3RhYmxlXy5idWNrZXQoX19rKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgbG9jYWxfaXRlcmF0b3IgICAgICAgYmVnaW4oc2l6ZV90eXBlIF9fbikgICAgICAgIHtyZXR1cm4gX190YWJsZV8uYmVnaW4oX19uKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGxvY2FsX2l0ZXJhdG9yICAgICAgIGVuZChzaXplX3R5cGUgX19uKSAgICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmVuZChfX24pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QgIHtyZXR1cm4gX190YWJsZV8uY2JlZ2luKF9fbik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9sb2NhbF9pdGVyYXRvciBlbmQoc2l6ZV90eXBlIF9fbikgY29uc3QgICAge3JldHVybiBfX3RhYmxlXy5jZW5kKF9fbik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9sb2NhbF9pdGVyYXRvciBjYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3Qge3JldHVybiBfX3RhYmxlXy5jYmVnaW4oX19uKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGNlbmQoc2l6ZV90eXBlIF9fbikgY29uc3QgICB7cmV0dXJuIF9fdGFibGVfLmNlbmQoX19uKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZmxvYXQgbG9hZF9mYWN0b3IoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RhYmxlXy5sb2FkX2ZhY3RvcigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZmxvYXQgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190YWJsZV8ubWF4X2xvYWRfZmFjdG9yKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIG1heF9sb2FkX2ZhY3RvcihmbG9hdCBfX21sZikge19fdGFibGVfLm1heF9sb2FkX2ZhY3RvcihfX21sZik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHJlaGFzaChzaXplX3R5cGUgX19uKSB7X190YWJsZV8ucmVoYXNoKF9fbik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIF9fbikge19fdGFibGVfLnJlc2VydmUoX19uKTt9CisKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKworICAgIGJvb2wgX19kZXJlZmVyZW5jZWFibGUoY29uc3QgY29uc3RfaXRlcmF0b3IqIF9faSkgY29uc3QKKyAgICAgICAge3JldHVybiBfX3RhYmxlXy5fX2RlcmVmZXJlbmNlYWJsZShfX2kpO30KKyAgICBib29sIF9fZGVjcmVtZW50YWJsZShjb25zdCBjb25zdF9pdGVyYXRvciogX19pKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9fZGVjcmVtZW50YWJsZShfX2kpO30KKyAgICBib29sIF9fYWRkYWJsZShjb25zdCBjb25zdF9pdGVyYXRvciogX19pLCBwdHJkaWZmX3QgX19uKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9fYWRkYWJsZShfX2ksIF9fbik7fQorICAgIGJvb2wgX19zdWJzY3JpcHRhYmxlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yKiBfX2ksIHB0cmRpZmZfdCBfX24pIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX190YWJsZV8uX19hZGRhYmxlKF9faSwgX19uKTt9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX3NldChzaXplX3R5cGUgX19uLAorICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwpCisgICAgOiBfX3RhYmxlXyhfX2hmLCBfX2VxbCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgX190YWJsZV8ucmVoYXNoKF9fbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX3NldChzaXplX3R5cGUgX19uLAorICAgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX3RhYmxlXyhfX2hmLCBfX2VxbCwgX19hKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBfX3RhYmxlXy5yZWhhc2goX19uKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Cit1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojp1bm9yZGVyZWRfc2V0KAorICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIGluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3Vub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OnVub3JkZXJlZF9zZXQoCisgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsKQorICAgIDogX190YWJsZV8oX19oZiwgX19lcWwpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIF9fdGFibGVfLnJlaGFzaChfX24pOworICAgIGluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3Vub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OnVub3JkZXJlZF9zZXQoCisgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX190YWJsZV8oX19oZiwgX19lcWwsIF9fYSkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgX190YWJsZV8ucmVoYXNoKF9fbik7CisgICAgaW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgoraW5saW5lCit1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojp1bm9yZGVyZWRfc2V0KAorICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX190YWJsZV8oX19hKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojp1bm9yZGVyZWRfc2V0KAorICAgICAgICBjb25zdCB1bm9yZGVyZWRfc2V0JiBfX3UpCisgICAgOiBfX3RhYmxlXyhfX3UuX190YWJsZV8pCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIF9fdGFibGVfLnJlaGFzaChfX3UuYnVja2V0X2NvdW50KCkpOworICAgIGluc2VydChfX3UuYmVnaW4oKSwgX191LmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojp1bm9yZGVyZWRfc2V0KAorICAgICAgICBjb25zdCB1bm9yZGVyZWRfc2V0JiBfX3UsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX3RhYmxlXyhfX3UuX190YWJsZV8sIF9fYSkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgX190YWJsZV8ucmVoYXNoKF9fdS5idWNrZXRfY291bnQoKSk7CisgICAgaW5zZXJ0KF9fdS5iZWdpbigpLCBfX3UuZW5kKCkpOworfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK2lubGluZQordW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX3NldCgKKyAgICAgICAgdW5vcmRlcmVkX3NldCYmIF9fdSkKKyAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPF9fdGFibGU+Ojp2YWx1ZSkKKyAgICA6IF9fdGFibGVfKF9WU1REOjptb3ZlKF9fdS5fX3RhYmxlXykpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyAgICBfX2dldF9kYigpLT5zd2FwKHRoaXMsICZfX3UpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX3NldCgKKyAgICAgICAgdW5vcmRlcmVkX3NldCYmIF9fdSwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fdGFibGVfKF9WU1REOjptb3ZlKF9fdS5fX3RhYmxlXyksIF9fYSkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgaWYgKF9fYSAhPSBfX3UuZ2V0X2FsbG9jYXRvcigpKQorICAgIHsKKyAgICAgICAgaXRlcmF0b3IgX19pID0gX191LmJlZ2luKCk7CisgICAgICAgIHdoaWxlIChfX3Uuc2l6ZSgpICE9IDApCisgICAgICAgICAgICBfX3RhYmxlXy5fX2luc2VydF91bmlxdWUoX1ZTVEQ6Om1vdmUoX191Ll9fdGFibGVfLnJlbW92ZShfX2krKyktPl9fdmFsdWVfKSk7CisgICAgfQorI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIGVsc2UKKyAgICAgICAgX19nZXRfZGIoKS0+c3dhcCh0aGlzLCAmX191KTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3Vub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OnVub3JkZXJlZF9zZXQoCisgICAgICAgIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgaW5zZXJ0KF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX3NldCgKKyAgICAgICAgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsLCBzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsCisgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwpCisgICAgOiBfX3RhYmxlXyhfX2hmLCBfX2VxbCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgX190YWJsZV8ucmVoYXNoKF9fbik7CisgICAgaW5zZXJ0KF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX3NldCgKKyAgICAgICAgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsLCBzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsCisgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX3RhYmxlXyhfX2hmLCBfX2VxbCwgX19hKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBfX3RhYmxlXy5yZWhhc2goX19uKTsKKyAgICBpbnNlcnQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUKK3Vub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mCit1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+OjpvcGVyYXRvcj0odW5vcmRlcmVkX3NldCYmIF9fdSkKKyAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPF9fdGFibGU+Ojp2YWx1ZSkKK3sKKyAgICBfX3RhYmxlXyA9IF9WU1REOjptb3ZlKF9fdS5fX3RhYmxlXyk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK2lubGluZQordW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYKK3Vub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46Om9wZXJhdG9yPSgKKyAgICAgICAgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQoreworICAgIF9fdGFibGVfLl9fYXNzaWduX3VuaXF1ZShfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpOworICAgIHJldHVybiAqdGhpczsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CitpbmxpbmUKK3ZvaWQKK3Vub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46Omluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgX190YWJsZV8uX19pbnNlcnRfdW5pcXVlKCpfX2ZpcnN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcCh1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisgICAgIHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICBfTk9FWENFUFRfKF9OT0VYQ0VQVF8oX194LnN3YXAoX195KSkpCit7CisgICAgX194LnN3YXAoX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Citib29sCitvcGVyYXRvcj09KGNvbnN0IHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgY29uc3QgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQoreworICAgIGlmIChfX3guc2l6ZSgpICE9IF9feS5zaXplKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgIGZvciAoY29uc3RfaXRlcmF0b3IgX19pID0gX194LmJlZ2luKCksIF9fZXggPSBfX3guZW5kKCksIF9fZXkgPSBfX3kuZW5kKCk7CisgICAgICAgICAgICBfX2kgIT0gX19leDsgKytfX2kpCisgICAgeworICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ogPSBfX3kuZmluZCgqX19pKTsKKyAgICAgICAgaWYgKF9faiA9PSBfX2V5IHx8ICEoKl9faSA9PSAqX19qKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yIT0oY29uc3QgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorICAgICAgICAgICBjb25zdCB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194ID09IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoID0gaGFzaDxfVmFsdWU+LCBjbGFzcyBfUHJlZCA9IGVxdWFsX3RvPF9WYWx1ZT4sCisgICAgICAgICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPF9WYWx1ZT4gPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdW5vcmRlcmVkX211bHRpc2V0Cit7CitwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIF9WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CisgICAgdHlwZWRlZiBrZXlfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfSGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlcjsKKyAgICB0eXBlZGVmIF9QcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2VxdWFsOworICAgIHR5cGVkZWYgX0FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgc3RhdGljX2Fzc2VydCgoaXNfc2FtZTx2YWx1ZV90eXBlLCB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6dmFsdWVfdHlwZT46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGFsbG9jYXRvcjo6dmFsdWVfdHlwZSIpOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgX19oYXNoX3RhYmxlPHZhbHVlX3R5cGUsIGhhc2hlciwga2V5X2VxdWFsLCBhbGxvY2F0b3JfdHlwZT4gX190YWJsZTsKKworICAgIF9fdGFibGUgX190YWJsZV87CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6OnBvaW50ZXIgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6Y29uc3RfcG9pbnRlciAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RhYmxlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RhYmxlOjpjb25zdF9pdGVyYXRvciAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdGFibGU6OmNvbnN0X2xvY2FsX2l0ZXJhdG9yIGxvY2FsX2l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX190YWJsZTo6Y29uc3RfbG9jYWxfaXRlcmF0b3IgY29uc3RfbG9jYWxfaXRlcmF0b3I7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5vcmRlcmVkX211bHRpc2V0KCkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxfX3RhYmxlPjo6dmFsdWUpCisgICAgICAgIHsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICAgICAgICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIGV4cGxpY2l0IHVub3JkZXJlZF9tdWx0aXNldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpKTsKKyAgICB1bm9yZGVyZWRfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5vcmRlcmVkX211bHRpc2V0KHNpemVfdHlwZSBfX24sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICAgIDogdW5vcmRlcmVkX211bHRpc2V0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBfX2EpIHt9CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB1bm9yZGVyZWRfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgICA6IHVub3JkZXJlZF9tdWx0aXNldChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBfX2EpIHt9CisjZW5kaWYKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHVub3JkZXJlZF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdW5vcmRlcmVkX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCkpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdW5vcmRlcmVkX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uICwgY29uc3QgaGFzaGVyJiBfX2hmLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5vcmRlcmVkX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICAgIDogdW5vcmRlcmVkX211bHRpc2V0KF9fZmlyc3QsIF9fbGFzdCwgX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIF9fYSkge30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB1bm9yZGVyZWRfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICAgIDogdW5vcmRlcmVkX211bHRpc2V0KF9fZmlyc3QsIF9fbGFzdCwgX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgX19hKSB7fQorI2VuZGlmCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IHVub3JkZXJlZF9tdWx0aXNldChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyAgICB1bm9yZGVyZWRfbXVsdGlzZXQoY29uc3QgdW5vcmRlcmVkX211bHRpc2V0JiBfX3UpOworICAgIHVub3JkZXJlZF9tdWx0aXNldChjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQmIF9fdSwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB1bm9yZGVyZWRfbXVsdGlzZXQodW5vcmRlcmVkX211bHRpc2V0JiYgX191KQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPF9fdGFibGU+Ojp2YWx1ZSk7CisgICAgdW5vcmRlcmVkX211bHRpc2V0KHVub3JkZXJlZF9tdWx0aXNldCYmIF9fdSwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgdW5vcmRlcmVkX211bHRpc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCk7CisgICAgdW5vcmRlcmVkX211bHRpc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSk7CisgICAgdW5vcmRlcmVkX211bHRpc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5vcmRlcmVkX211bHRpc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCwgc2l6ZV90eXBlIF9fbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogdW5vcmRlcmVkX211bHRpc2V0KF9faWwsIF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBfX2EpIHt9CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB1bm9yZGVyZWRfbXVsdGlzZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsLCBzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICA6IHVub3JkZXJlZF9tdWx0aXNldChfX2lsLCBfX24sIF9faGYsIGtleV9lcXVhbCgpLCBfX2EpIHt9CisjZW5kaWYKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisgICAgLy8gfnVub3JkZXJlZF9tdWx0aXNldCgpID0gZGVmYXVsdDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdW5vcmRlcmVkX211bHRpc2V0JiBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX211bHRpc2V0JiBfX3UpCisgICAgeworICAgICAgICBfX3RhYmxlXyA9IF9fdS5fX3RhYmxlXzsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHVub3JkZXJlZF9tdWx0aXNldCYgb3BlcmF0b3I9KHVub3JkZXJlZF9tdWx0aXNldCYmIF9fdSkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfX3RhYmxlPjo6dmFsdWUpOworICAgIHVub3JkZXJlZF9tdWx0aXNldCYgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCk7CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBhbGxvY2F0b3JfdHlwZShfX3RhYmxlXy5fX25vZGVfYWxsb2MoKSk7fQorCisgICAgX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgICAgICBlbXB0eSgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdGFibGVfLnNpemUoKSA9PSAwO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCBfTk9FWENFUFQgIHtyZXR1cm4gX190YWJsZV8uc2l6ZSgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190YWJsZV8ubWF4X3NpemUoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgICAgICAgYmVnaW4oKSBfTk9FWENFUFQgICAgICAgIHtyZXR1cm4gX190YWJsZV8uYmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yICAgICAgIGVuZCgpIF9OT0VYQ0VQVCAgICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmVuZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSAgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190YWJsZV8uYmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpICAgIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdGFibGVfLmVuZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190YWJsZV8uYmVnaW4oKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGNlbmQoKSAgIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdGFibGVfLmVuZCgpO30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgaXRlcmF0b3IgZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKyAgICAgICAgICAgIHtyZXR1cm4gX190YWJsZV8uX19lbXBsYWNlX211bHRpKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTt9CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIGl0ZXJhdG9yIGVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICAgICAge3JldHVybiBfX3RhYmxlXy5fX2VtcGxhY2VfaGludF9tdWx0aShfX3AsIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3gpIHtyZXR1cm4gX190YWJsZV8uX19pbnNlcnRfbXVsdGkoX1ZTVEQ6Om1vdmUoX194KSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wLCB2YWx1ZV90eXBlJiYgX194KQorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9faW5zZXJ0X211bHRpKF9fcCwgX1ZTVEQ6Om1vdmUoX194KSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpCisgICAgICAgIHtpbnNlcnQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTt9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHtyZXR1cm4gX190YWJsZV8uX19pbnNlcnRfbXVsdGkoX194KTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcCwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9faW5zZXJ0X211bHRpKF9fcCwgX194KTt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICAgICAgdm9pZCBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBfX3ApIHtyZXR1cm4gX190YWJsZV8uZXJhc2UoX19wKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rKSB7cmV0dXJuIF9fdGFibGVfLl9fZXJhc2VfbXVsdGkoX19rKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAge3JldHVybiBfX3RhYmxlXy5lcmFzZShfX2ZpcnN0LCBfX2xhc3QpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBjbGVhcigpIF9OT0VYQ0VQVCB7X190YWJsZV8uY2xlYXIoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKHVub3JkZXJlZF9tdWx0aXNldCYgX191KQorICAgICAgICBfTk9FWENFUFRfKF9faXNfbm90aHJvd19zd2FwcGFibGU8X190YWJsZT46OnZhbHVlKQorICAgICAgICB7X190YWJsZV8uc3dhcChfX3UuX190YWJsZV8pO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBoYXNoZXIgaGFzaF9mdW5jdGlvbigpIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uaGFzaF9mdW5jdGlvbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0IHtyZXR1cm4gX190YWJsZV8ua2V5X2VxKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yICAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykgICAgICAge3JldHVybiBfX3RhYmxlXy5maW5kKF9fayk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uZmluZChfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uX19jb3VudF9tdWx0aShfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+ICAgICAgICAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgICAgIHtyZXR1cm4gX190YWJsZV8uX19lcXVhbF9yYW5nZV9tdWx0aShfX2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX190YWJsZV8uX19lcXVhbF9yYW5nZV9tdWx0aShfX2spO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgYnVja2V0X2NvdW50KCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190YWJsZV8uYnVja2V0X2NvdW50KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIF9fdGFibGVfLm1heF9idWNrZXRfY291bnQoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBfX24pIGNvbnN0IHtyZXR1cm4gX190YWJsZV8uYnVja2V0X3NpemUoX19uKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBidWNrZXQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Qge3JldHVybiBfX3RhYmxlXy5idWNrZXQoX19rKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgbG9jYWxfaXRlcmF0b3IgICAgICAgYmVnaW4oc2l6ZV90eXBlIF9fbikgICAgICAgIHtyZXR1cm4gX190YWJsZV8uYmVnaW4oX19uKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGxvY2FsX2l0ZXJhdG9yICAgICAgIGVuZChzaXplX3R5cGUgX19uKSAgICAgICAgICB7cmV0dXJuIF9fdGFibGVfLmVuZChfX24pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IgYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QgIHtyZXR1cm4gX190YWJsZV8uY2JlZ2luKF9fbik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9sb2NhbF9pdGVyYXRvciBlbmQoc2l6ZV90eXBlIF9fbikgY29uc3QgICAge3JldHVybiBfX3RhYmxlXy5jZW5kKF9fbik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9sb2NhbF9pdGVyYXRvciBjYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3Qge3JldHVybiBfX3RhYmxlXy5jYmVnaW4oX19uKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yIGNlbmQoc2l6ZV90eXBlIF9fbikgY29uc3QgICB7cmV0dXJuIF9fdGFibGVfLmNlbmQoX19uKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZmxvYXQgbG9hZF9mYWN0b3IoKSBjb25zdCBfTk9FWENFUFQge3JldHVybiBfX3RhYmxlXy5sb2FkX2ZhY3RvcigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZmxvYXQgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gX190YWJsZV8ubWF4X2xvYWRfZmFjdG9yKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIG1heF9sb2FkX2ZhY3RvcihmbG9hdCBfX21sZikge19fdGFibGVfLm1heF9sb2FkX2ZhY3RvcihfX21sZik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHJlaGFzaChzaXplX3R5cGUgX19uKSB7X190YWJsZV8ucmVoYXNoKF9fbik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIF9fbikge19fdGFibGVfLnJlc2VydmUoX19uKTt9CisKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKworICAgIGJvb2wgX19kZXJlZmVyZW5jZWFibGUoY29uc3QgY29uc3RfaXRlcmF0b3IqIF9faSkgY29uc3QKKyAgICAgICAge3JldHVybiBfX3RhYmxlXy5fX2RlcmVmZXJlbmNlYWJsZShfX2kpO30KKyAgICBib29sIF9fZGVjcmVtZW50YWJsZShjb25zdCBjb25zdF9pdGVyYXRvciogX19pKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9fZGVjcmVtZW50YWJsZShfX2kpO30KKyAgICBib29sIF9fYWRkYWJsZShjb25zdCBjb25zdF9pdGVyYXRvciogX19pLCBwdHJkaWZmX3QgX19uKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdGFibGVfLl9fYWRkYWJsZShfX2ksIF9fbik7fQorICAgIGJvb2wgX19zdWJzY3JpcHRhYmxlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yKiBfX2ksIHB0cmRpZmZfdCBfX24pIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX190YWJsZV8uX19hZGRhYmxlKF9faSwgX19uKTt9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojp1bm9yZGVyZWRfbXVsdGlzZXQoCisgICAgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCkKKyAgICA6IF9fdGFibGVfKF9faGYsIF9fZXFsKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBfX3RhYmxlXy5yZWhhc2goX19uKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OnVub3JkZXJlZF9tdWx0aXNldCgKKyAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX190YWJsZV8oX19oZiwgX19lcWwsIF9fYSkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgX190YWJsZV8ucmVoYXNoKF9fbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojp1bm9yZGVyZWRfbXVsdGlzZXQoCisgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgaW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojp1bm9yZGVyZWRfbXVsdGlzZXQoCisgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgc2l6ZV90eXBlIF9fbiwKKyAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsKQorICAgIDogX190YWJsZV8oX19oZiwgX19lcWwpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIF9fdGFibGVfLnJlaGFzaChfX24pOworICAgIGluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3Vub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX211bHRpc2V0KAorICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIHNpemVfdHlwZSBfX24sCisgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fdGFibGVfKF9faGYsIF9fZXFsLCBfX2EpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIF9fdGFibGVfLnJlaGFzaChfX24pOworICAgIGluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK2lubGluZQordW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojp1bm9yZGVyZWRfbXVsdGlzZXQoCisgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX3RhYmxlXyhfX2EpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3Vub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX211bHRpc2V0KAorICAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQmIF9fdSkKKyAgICA6IF9fdGFibGVfKF9fdS5fX3RhYmxlXykKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgX190YWJsZV8ucmVoYXNoKF9fdS5idWNrZXRfY291bnQoKSk7CisgICAgaW5zZXJ0KF9fdS5iZWdpbigpLCBfX3UuZW5kKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3Vub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPjo6dW5vcmRlcmVkX211bHRpc2V0KAorICAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQmIF9fdSwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fdGFibGVfKF9fdS5fX3RhYmxlXywgX19hKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBfX3RhYmxlXy5yZWhhc2goX191LmJ1Y2tldF9jb3VudCgpKTsKKyAgICBpbnNlcnQoX191LmJlZ2luKCksIF9fdS5lbmQoKSk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgoraW5saW5lCit1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OnVub3JkZXJlZF9tdWx0aXNldCgKKyAgICAgICAgdW5vcmRlcmVkX211bHRpc2V0JiYgX191KQorICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8X190YWJsZT46OnZhbHVlKQorICAgIDogX190YWJsZV8oX1ZTVEQ6Om1vdmUoX191Ll9fdGFibGVfKSkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworICAgIF9fZ2V0X2RiKCktPnN3YXAodGhpcywgJl9fdSk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OnVub3JkZXJlZF9tdWx0aXNldCgKKyAgICAgICAgdW5vcmRlcmVkX211bHRpc2V0JiYgX191LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX190YWJsZV8oX1ZTVEQ6Om1vdmUoX191Ll9fdGFibGVfKSwgX19hKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBpZiAoX19hICE9IF9fdS5nZXRfYWxsb2NhdG9yKCkpCisgICAgeworICAgICAgICBpdGVyYXRvciBfX2kgPSBfX3UuYmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKF9fdS5zaXplKCkgIT0gMCkKKyAgICAgICAgICAgIF9fdGFibGVfLl9faW5zZXJ0X211bHRpKF9WU1REOjptb3ZlKF9fdS5fX3RhYmxlXy5yZW1vdmUoX19pKyspLT5fX3ZhbHVlXykpOworICAgIH0KKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBlbHNlCisgICAgICAgIF9fZ2V0X2RiKCktPnN3YXAodGhpcywgJl9fdSk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OnVub3JkZXJlZF9tdWx0aXNldCgKKyAgICAgICAgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBpbnNlcnQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Cit1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OnVub3JkZXJlZF9tdWx0aXNldCgKKyAgICAgICAgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsLCBzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsCisgICAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwpCisgICAgOiBfX3RhYmxlXyhfX2hmLCBfX2VxbCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgX190YWJsZV8ucmVoYXNoKF9fbik7CisgICAgaW5zZXJ0KF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgordW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+Ojp1bm9yZGVyZWRfbXVsdGlzZXQoCisgICAgICAgIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCwgc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLAorICAgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX190YWJsZV8oX19oZiwgX19lcWwsIF9fYSkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgX190YWJsZV8ucmVoYXNoKF9fbik7CisgICAgaW5zZXJ0KF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgoraW5saW5lCit1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mCit1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46Om9wZXJhdG9yPSgKKyAgICAgICAgdW5vcmRlcmVkX211bHRpc2V0JiYgX191KQorICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8X190YWJsZT46OnZhbHVlKQoreworICAgIF9fdGFibGVfID0gX1ZTVEQ6Om1vdmUoX191Ll9fdGFibGVfKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgoraW5saW5lCit1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mCit1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46Om9wZXJhdG9yPSgKKyAgICAgICAgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQoreworICAgIF9fdGFibGVfLl9fYXNzaWduX211bHRpKF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK2lubGluZQordm9pZAordW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+OjppbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgX190YWJsZV8uX19pbnNlcnRfbXVsdGkoKl9fZmlyc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzd2FwKHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorICAgICB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICBfTk9FWENFUFRfKF9OT0VYQ0VQVF8oX194LnN3YXAoX195KSkpCit7CisgICAgX194LnN3YXAoX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+Citib29sCitvcGVyYXRvcj09KGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorICAgICAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKK3sKKyAgICBpZiAoX194LnNpemUoKSAhPSBfX3kuc2l6ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IF9FcVJuZzsKKyAgICBmb3IgKGNvbnN0X2l0ZXJhdG9yIF9faSA9IF9feC5iZWdpbigpLCBfX2V4ID0gX194LmVuZCgpOyBfX2kgIT0gX19leDspCisgICAgeworICAgICAgICBfRXFSbmcgX194ZXEgPSBfX3guZXF1YWxfcmFuZ2UoKl9faSk7CisgICAgICAgIF9FcVJuZyBfX3llcSA9IF9feS5lcXVhbF9yYW5nZSgqX19pKTsKKyAgICAgICAgaWYgKF9WU1REOjpkaXN0YW5jZShfX3hlcS5maXJzdCwgX194ZXEuc2Vjb25kKSAhPQorICAgICAgICAgICAgX1ZTVEQ6OmRpc3RhbmNlKF9feWVxLmZpcnN0LCBfX3llcS5zZWNvbmQpIHx8CisgICAgICAgICAgICAgICAgICAhX1ZTVEQ6OmlzX3Blcm11dGF0aW9uKF9feGVxLmZpcnN0LCBfX3hlcS5zZWNvbmQsIF9feWVxLmZpcnN0KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgX19pID0gX194ZXEuc2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgY29uc3QgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194ID09IF9feSk7Cit9CisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX1VOT1JERVJFRF9TRVQKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS91dGlsaXR5IGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3V0aWxpdHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExZDU4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS91dGlsaXR5CkBAIC0wLDAgKzEsMTU5NCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdXRpbGl0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9VVElMSVRZCisjZGVmaW5lIF9MSUJDUFBfVVRJTElUWQorCisvKgorICAgIHV0aWxpdHkgc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICB2b2lkCisgICAgc3dhcChUJiBhLCBUJiBiKTsKKworbmFtZXNwYWNlIHJlbF9vcHMKK3sKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBib29sIG9wZXJhdG9yIT0oY29uc3QgVCYsIGNvbnN0IFQmKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBib29sIG9wZXJhdG9yPiAoY29uc3QgVCYsIGNvbnN0IFQmKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBib29sIG9wZXJhdG9yPD0oY29uc3QgVCYsIGNvbnN0IFQmKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBib29sIG9wZXJhdG9yPj0oY29uc3QgVCYsIGNvbnN0IFQmKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK3ZvaWQKK3N3YXAoVCYgYSwgVCYgYikgbm9leGNlcHQoaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8VD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPFQ+Ojp2YWx1ZSk7CisKK3RlbXBsYXRlIDxjbGFzcyBULCBzaXplX3QgTj4KK3ZvaWQKK3N3YXAoVCAoJmEpW05dLCBUICgmYilbTl0pIG5vZXhjZXB0KG5vZXhjZXB0KHN3YXAoKmEsICpiKSkpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gVCYmIGZvcndhcmQodHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZSYgdCkgbm9leGNlcHQ7ICAvLyBjb25zdGV4cHIgaW4gQysrMTQKK3RlbXBsYXRlIDxjbGFzcyBUPiBUJiYgZm9yd2FyZCh0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlJiYgdCkgbm9leGNlcHQ7IC8vIGNvbnN0ZXhwciBpbiBDKysxNAorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZSYmIG1vdmUoVCYmKSBub2V4Y2VwdDsgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMTQKKwordGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgdHlwZW5hbWUgY29uZGl0aW9uYWwKKyAgICA8CisgICAgICAgICFpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxUPjo6dmFsdWUgJiYgaXNfY29weV9jb25zdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZSwKKyAgICAgICAgY29uc3QgVCYsCisgICAgICAgIFQmJgorICAgID46OnR5cGUKKyAgICBtb3ZlX2lmX25vZXhjZXB0KFQmIHgpIG5vZXhjZXB0OyAvLyBjb25zdGV4cHIgaW4gQysrMTQKKwordGVtcGxhdGUgPGNsYXNzIFQ+IGNvbnN0ZXhwciBhZGRfY29uc3RfdDxUPiYgYXNfY29uc3QoVCYgdCkgbm9leGNlcHQ7ICAgICAgLy8gQysrMTcKK3RlbXBsYXRlIDxjbGFzcyBUPiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGFzX2NvbnN0KGNvbnN0IFQmJikgPSBkZWxldGU7IC8vIEMrKzE3CisKK3RlbXBsYXRlIDxjbGFzcyBUPiB0eXBlbmFtZSBhZGRfcnZhbHVlX3JlZmVyZW5jZTxUPjo6dHlwZSBkZWNsdmFsKCkgbm9leGNlcHQ7CisKK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+CitzdHJ1Y3QgcGFpcgoreworICAgIHR5cGVkZWYgVDEgZmlyc3RfdHlwZTsKKyAgICB0eXBlZGVmIFQyIHNlY29uZF90eXBlOworCisgICAgVDEgZmlyc3Q7CisgICAgVDIgc2Vjb25kOworCisgICAgcGFpcihjb25zdCBwYWlyJikgPSBkZWZhdWx0OworICAgIHBhaXIocGFpciYmKSA9IGRlZmF1bHQ7CisgICAgY29uc3RleHByIHBhaXIoKTsKKyAgICBwYWlyKGNvbnN0IFQxJiB4LCBjb25zdCBUMiYgeSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMTQKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVSwgY2xhc3MgVj4gcGFpcihVJiYgeCwgViYmIHkpOyAgICAgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMTQKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVSwgY2xhc3MgVj4gcGFpcihjb25zdCBwYWlyPFUsIFY+JiBwKTsgICAvLyBjb25zdGV4cHIgaW4gQysrMTQKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVSwgY2xhc3MgVj4gcGFpcihwYWlyPFUsIFY+JiYgcCk7ICAgICAgICAvLyBjb25zdGV4cHIgaW4gQysrMTQKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJnczEsIGNsYXNzLi4uIEFyZ3MyPgorICAgICAgICBwYWlyKHBpZWNld2lzZV9jb25zdHJ1Y3RfdCwgdHVwbGU8QXJnczEuLi4+IGZpcnN0X2FyZ3MsCisgICAgICAgICAgICAgdHVwbGU8QXJnczIuLi4+IHNlY29uZF9hcmdzKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBVLCBjbGFzcyBWPiBwYWlyJiBvcGVyYXRvcj0oY29uc3QgcGFpcjxVLCBWPiYgcCk7CisgICAgcGFpciYgb3BlcmF0b3I9KHBhaXImJiBwKSBub2V4Y2VwdChpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxUMT46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxUMj46OnZhbHVlKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVSwgY2xhc3MgVj4gcGFpciYgb3BlcmF0b3I9KHBhaXI8VSwgVj4mJiBwKTsKKworICAgIHZvaWQgc3dhcChwYWlyJiBwKSBub2V4Y2VwdChpc19ub3Rocm93X3N3YXBwYWJsZV92PFQxPiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19ub3Rocm93X3N3YXBwYWJsZV92PFQyPik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPiBib29sIG9wZXJhdG9yPT0oY29uc3QgcGFpcjxUMSxUMj4mLCBjb25zdCBwYWlyPFQxLFQyPiYpOyAvLyBjb25zdGV4cHIgaW4gQysrMTQKK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+IGJvb2wgb3BlcmF0b3IhPShjb25zdCBwYWlyPFQxLFQyPiYsIGNvbnN0IHBhaXI8VDEsVDI+Jik7IC8vIGNvbnN0ZXhwciBpbiBDKysxNAordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4gYm9vbCBvcGVyYXRvcjwgKGNvbnN0IHBhaXI8VDEsVDI+JiwgY29uc3QgcGFpcjxUMSxUMj4mKTsgLy8gY29uc3RleHByIGluIEMrKzE0Cit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPiBib29sIG9wZXJhdG9yPiAoY29uc3QgcGFpcjxUMSxUMj4mLCBjb25zdCBwYWlyPFQxLFQyPiYpOyAvLyBjb25zdGV4cHIgaW4gQysrMTQKK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+IGJvb2wgb3BlcmF0b3I+PShjb25zdCBwYWlyPFQxLFQyPiYsIGNvbnN0IHBhaXI8VDEsVDI+Jik7IC8vIGNvbnN0ZXhwciBpbiBDKysxNAordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4gYm9vbCBvcGVyYXRvcjw9KGNvbnN0IHBhaXI8VDEsVDI+JiwgY29uc3QgcGFpcjxUMSxUMj4mKTsgLy8gY29uc3RleHByIGluIEMrKzE0CisKK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+IHBhaXI8VjEsIFYyPiBtYWtlX3BhaXIoVDEmJiwgVDImJik7ICAgLy8gY29uc3RleHByIGluIEMrKzE0Cit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgordm9pZAorc3dhcChwYWlyPFQxLCBUMj4mIHgsIHBhaXI8VDEsIFQyPiYgeSkgbm9leGNlcHQobm9leGNlcHQoeC5zd2FwKHkpKSk7CisKK3N0cnVjdCBwaWVjZXdpc2VfY29uc3RydWN0X3QgeyB9OworaW5saW5lIGNvbnN0ZXhwciBwaWVjZXdpc2VfY29uc3RydWN0X3QgcGllY2V3aXNlX2NvbnN0cnVjdCA9IHBpZWNld2lzZV9jb25zdHJ1Y3RfdCgpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgdHVwbGVfc2l6ZTsKK3RlbXBsYXRlIDxzaXplX3QgSSwgY2xhc3MgVD4gY2xhc3MgdHVwbGVfZWxlbWVudDsKKwordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4gc3RydWN0IHR1cGxlX3NpemU8cGFpcjxUMSwgVDI+ID47Cit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPiBzdHJ1Y3QgdHVwbGVfZWxlbWVudDwwLCBwYWlyPFQxLCBUMj4gPjsKK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+IHN0cnVjdCB0dXBsZV9lbGVtZW50PDEsIHBhaXI8VDEsIFQyPiA+OworCit0ZW1wbGF0ZTxzaXplX3QgSSwgY2xhc3MgVDEsIGNsYXNzIFQyPgorICAgIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8SSwgcGFpcjxUMSwgVDI+ID46OnR5cGUmCisgICAgZ2V0KHBhaXI8VDEsIFQyPiYpIG5vZXhjZXB0OyAvLyBjb25zdGV4cHIgaW4gQysrMTQKKwordGVtcGxhdGU8c2l6ZV90IEksIGNsYXNzIFQxLCBjbGFzcyBUMj4KKyAgICBjb25zdCB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PEksIHBhaXI8VDEsIFQyPiA+Ojp0eXBlJgorICAgIGdldChjb25zdCBwYWlyPFQxLCBUMj4mKSBub2V4Y2VwdDsgLy8gY29uc3RleHByIGluIEMrKzE0CisKK3RlbXBsYXRlPHNpemVfdCBJLCBjbGFzcyBUMSwgY2xhc3MgVDI+CisgICAgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxJLCBwYWlyPFQxLCBUMj4gPjo6dHlwZSYmCisgICAgZ2V0KHBhaXI8VDEsIFQyPiYmKSBub2V4Y2VwdDsgLy8gY29uc3RleHByIGluIEMrKzE0CisKK3RlbXBsYXRlPHNpemVfdCBJLCBjbGFzcyBUMSwgY2xhc3MgVDI+CisgICAgY29uc3QgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxJLCBwYWlyPFQxLCBUMj4gPjo6dHlwZSYmCisgICAgZ2V0KGNvbnN0IHBhaXI8VDEsIFQyPiYmKSBub2V4Y2VwdDsgLy8gY29uc3RleHByIGluIEMrKzE0CisKK3RlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBUMj4KKyAgICBjb25zdGV4cHIgVDEmIGdldChwYWlyPFQxLCBUMj4mKSBub2V4Y2VwdDsgLy8gQysrMTQKKwordGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyPgorICAgIGNvbnN0ZXhwciBjb25zdCBUMSYgZ2V0KGNvbnN0IHBhaXI8VDEsIFQyPiYpIG5vZXhjZXB0OyAvLyBDKysxNAorCit0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDI+CisgICAgY29uc3RleHByIFQxJiYgZ2V0KHBhaXI8VDEsIFQyPiYmKSBub2V4Y2VwdDsgLy8gQysrMTQKKwordGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyPgorICAgIGNvbnN0ZXhwciBjb25zdCBUMSYmIGdldChjb25zdCBwYWlyPFQxLCBUMj4mJikgbm9leGNlcHQ7IC8vIEMrKzE0CisKK3RlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBUMj4KKyAgICBjb25zdGV4cHIgVDEmIGdldChwYWlyPFQyLCBUMT4mKSBub2V4Y2VwdDsgLy8gQysrMTQKKwordGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyPgorICAgIGNvbnN0ZXhwciBjb25zdCBUMSYgZ2V0KGNvbnN0IHBhaXI8VDIsIFQxPiYpIG5vZXhjZXB0OyAvLyBDKysxNAorCit0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDI+CisgICAgY29uc3RleHByIFQxJiYgZ2V0KHBhaXI8VDIsIFQxPiYmKSBub2V4Y2VwdDsgLy8gQysrMTQKKwordGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyPgorICAgIGNvbnN0ZXhwciBjb25zdCBUMSYmIGdldChjb25zdCBwYWlyPFQyLCBUMT4mJikgbm9leGNlcHQ7IC8vIEMrKzE0CisKKy8vIEMrKzE0CisKK3RlbXBsYXRlPGNsYXNzIFQsIFQuLi4gST4KK3N0cnVjdCBpbnRlZ2VyX3NlcXVlbmNlCit7CisgICAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBzaXplKCkgbm9leGNlcHQ7Cit9OworCit0ZW1wbGF0ZTxzaXplX3QuLi4gST4KKyAgdXNpbmcgaW5kZXhfc2VxdWVuY2UgPSBpbnRlZ2VyX3NlcXVlbmNlPHNpemVfdCwgSS4uLj47CisKK3RlbXBsYXRlPGNsYXNzIFQsIFQgTj4KKyAgdXNpbmcgbWFrZV9pbnRlZ2VyX3NlcXVlbmNlID0gaW50ZWdlcl9zZXF1ZW5jZTxULCAwLCAxLCAuLi4sIE4tMT47Cit0ZW1wbGF0ZTxzaXplX3QgTj4KKyAgdXNpbmcgbWFrZV9pbmRleF9zZXF1ZW5jZSA9IG1ha2VfaW50ZWdlcl9zZXF1ZW5jZTxzaXplX3QsIE4+OworCit0ZW1wbGF0ZTxjbGFzcy4uLiBUPgorICB1c2luZyBpbmRleF9zZXF1ZW5jZV9mb3IgPSBtYWtlX2luZGV4X3NlcXVlbmNlPHNpemVvZi4uLihUKT47CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU9VD4KKyAgICBUIGV4Y2hhbmdlKFQmIG9iaiwgVSYmIG5ld192YWx1ZSk7CisKKy8vIDIwLjIuNywgaW4tcGxhY2UgY29uc3RydWN0aW9uIC8vIEMrKzE3CitzdHJ1Y3QgaW5fcGxhY2VfdCB7CisgIGV4cGxpY2l0IGluX3BsYWNlX3QoKSA9IGRlZmF1bHQ7Cit9OworaW5saW5lIGNvbnN0ZXhwciBpbl9wbGFjZV90IGluX3BsYWNle307Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgc3RydWN0IGluX3BsYWNlX3R5cGVfdCB7CisgICAgZXhwbGljaXQgaW5fcGxhY2VfdHlwZV90KCkgPSBkZWZhdWx0OworICB9OwordGVtcGxhdGUgPGNsYXNzIFQ+CisgIGlubGluZSBjb25zdGV4cHIgaW5fcGxhY2VfdHlwZV90PFQ+IGluX3BsYWNlX3R5cGV7fTsKK3RlbXBsYXRlIDxzaXplX3QgST4KKyAgc3RydWN0IGluX3BsYWNlX2luZGV4X3QgeworICAgIGV4cGxpY2l0IGluX3BsYWNlX2luZGV4X3QoKSA9IGRlZmF1bHQ7CisgIH07Cit0ZW1wbGF0ZSA8c2l6ZV90IEk+CisgIGlubGluZSBjb25zdGV4cHIgaW5fcGxhY2VfaW5kZXhfdDxJPiBpbl9wbGFjZV9pbmRleHt9OworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPF9fdHVwbGU+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxfX2RlYnVnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK25hbWVzcGFjZSByZWxfb3BzCit7CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPT0gX195KTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX1RwPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPiAoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KQoreworICAgIHJldHVybiBfX3kgPCBfX3g7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvcjw9KGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3kgPCBfX3gpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+PShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpCit7CisgICAgcmV0dXJuICEoX194IDwgX195KTsKK30KKworfSAgLy8gcmVsX29wcworCisvLyBzd2FwX3JhbmdlcworCisKK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yMSwgY2xhc3MgX0ZvcndhcmRJdGVyYXRvcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0ZvcndhcmRJdGVyYXRvcjIKK3N3YXBfcmFuZ2VzKF9Gb3J3YXJkSXRlcmF0b3IxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXJhdG9yMSBfX2xhc3QxLCBfRm9yd2FyZEl0ZXJhdG9yMiBfX2ZpcnN0MikKK3sKKyAgICBmb3IoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCAodm9pZCkgKytfX2ZpcnN0MikKKyAgICAgICAgc3dhcCgqX19maXJzdDEsICpfX2ZpcnN0Mik7CisgICAgcmV0dXJuIF9fZmlyc3QyOworfQorCisvLyBmb3J3YXJkIGRlY2xhcmVkIGluIDx0eXBlX3RyYWl0cz4KK3RlbXBsYXRlPGNsYXNzIF9UcCwgc2l6ZV90IF9OcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWY8CisgICAgX19pc19zd2FwcGFibGU8X1RwPjo6dmFsdWUKKz46OnR5cGUKK3N3YXAoX1RwICgmX19hKVtfTnBdLCBfVHAgKCZfX2IpW19OcF0pIF9OT0VYQ0VQVF8oX19pc19ub3Rocm93X3N3YXBwYWJsZTxfVHA+Ojp2YWx1ZSkKK3sKKyAgICBfVlNURDo6c3dhcF9yYW5nZXMoX19hLCBfX2EgKyBfTnAsIF9fYik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKK3R5cGVuYW1lIGNvbmRpdGlvbmFsCis8CisgICAgIWlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPF9UcD46OnZhbHVlICYmIGlzX2NvcHlfY29uc3RydWN0aWJsZTxfVHA+Ojp2YWx1ZSwKKyAgICBjb25zdCBfVHAmLAorICAgIF9UcCYmCis+Ojp0eXBlCisjZWxzZSAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCitjb25zdCBfVHAmCisjZW5kaWYKK21vdmVfaWZfbm9leGNlcHQoX1RwJiBfX3gpIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfVlNURDo6bW92ZShfX3gpOworfQorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IGNvbnN0ZXhwciBhZGRfY29uc3RfdDxfVHA+JiBhc19jb25zdChfVHAmIF9fdCkgbm9leGNlcHQgeyByZXR1cm4gX190OyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYXNfY29uc3QoY29uc3QgX1RwJiYpID0gZGVsZXRlOworI2VuZGlmCisKK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBwaWVjZXdpc2VfY29uc3RydWN0X3QgeyB9OworI2lmIGRlZmluZWQoX0xJQkNQUF9DWFgwM19MQU5HKSB8fCBkZWZpbmVkKF9MSUJDUFBfQlVJTERJTkdfVVRJTElUWSkKK2V4dGVybiBjb25zdCBwaWVjZXdpc2VfY29uc3RydWN0X3QgcGllY2V3aXNlX2NvbnN0cnVjdDsvLyA9IHBpZWNld2lzZV9jb25zdHJ1Y3RfdCgpOworI2Vsc2UKKy8qIF9MSUJDUFBfSU5MSU5FX1ZBUiAqLyBjb25zdGV4cHIgcGllY2V3aXNlX2NvbnN0cnVjdF90IHBpZWNld2lzZV9jb25zdHJ1Y3QgPSBwaWVjZXdpc2VfY29uc3RydWN0X3QoKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTElCQ1BQX0RFUFJFQ0FURURfQUJJX0RJU0FCTEVfUEFJUl9UUklWSUFMX0NPUFlfQ1RPUikKK3N0cnVjdCBfX25vbl90cml2aWFsbHlfY29weWFibGVfYmFzZSB7CisgIF9MSUJDUFBfQ09OU1RFWFBSIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgX19ub25fdHJpdmlhbGx5X2NvcHlhYmxlX2Jhc2UoKSBfTk9FWENFUFQge30KKyAgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBfX25vbl90cml2aWFsbHlfY29weWFibGVfYmFzZShfX25vbl90cml2aWFsbHlfY29weWFibGVfYmFzZSBjb25zdCYpIF9OT0VYQ0VQVCB7fQorfTsKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgcGFpcgorI2lmIGRlZmluZWQoX0xJQkNQUF9ERVBSRUNBVEVEX0FCSV9ESVNBQkxFX1BBSVJfVFJJVklBTF9DT1BZX0NUT1IpCis6IHByaXZhdGUgX19ub25fdHJpdmlhbGx5X2NvcHlhYmxlX2Jhc2UKKyNlbmRpZgoreworICAgIHR5cGVkZWYgX1QxIGZpcnN0X3R5cGU7CisgICAgdHlwZWRlZiBfVDIgc2Vjb25kX3R5cGU7CisKKyAgICBfVDEgZmlyc3Q7CisgICAgX1QyIHNlY29uZDsKKworI2lmICFkZWZpbmVkKF9MSUJDUFBfQ1hYMDNfTEFORykKKyAgICBwYWlyKHBhaXIgY29uc3QmKSA9IGRlZmF1bHQ7CisgICAgcGFpcihwYWlyJiYpID0gZGVmYXVsdDsKKyNlbHNlCisgIC8vIFVzZSB0aGUgaW1wbGljaXRseSBkZWNsYXJlZCBjb3B5IGNvbnN0cnVjdG9yIGluIEMrKzAzCisjZW5kaWYKKworI2lmZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyKCkgOiBmaXJzdCgpLCBzZWNvbmQoKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBhaXIoX1QxIGNvbnN0JiBfX3QxLCBfVDIgY29uc3QmIF9fdDIpIDogZmlyc3QoX190MSksIHNlY29uZChfX3QyKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9VMSwgY2xhc3MgX1UyPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyKGNvbnN0IHBhaXI8X1UxLCBfVTI+JiBfX3ApIDogZmlyc3QoX19wLmZpcnN0KSwgc2Vjb25kKF9fcC5zZWNvbmQpIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpciYgb3BlcmF0b3I9KHBhaXIgY29uc3QmIF9fcCkgeworICAgICAgICBmaXJzdCA9IF9fcC5maXJzdDsKKyAgICAgICAgc2Vjb25kID0gX19wLnNlY29uZDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbHNlCisgICAgdGVtcGxhdGUgPGJvb2wgX1ZhbD4KKyAgICB1c2luZyBfRW5hYmxlQiA9IHR5cGVuYW1lIGVuYWJsZV9pZjxfVmFsLCBib29sPjo6dHlwZTsKKworICAgIHN0cnVjdCBfQ2hlY2tBcmdzIHsKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfVTEsIGNsYXNzIF9VMj4KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfX2VuYWJsZV9kZWZhdWx0KCkgeworICAgICAgICAgIHJldHVybiBpc19kZWZhdWx0X2NvbnN0cnVjdGlibGU8X1UxPjo6dmFsdWUKKyAgICAgICAgICAgICAgJiYgaXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9VMj46OnZhbHVlOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1UxLCBjbGFzcyBfVTI+CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgX19lbmFibGVfZXhwbGljaXQoKSB7CisgICAgICAgICAgcmV0dXJuIGlzX2NvbnN0cnVjdGlibGU8Zmlyc3RfdHlwZSwgX1UxPjo6dmFsdWUKKyAgICAgICAgICAgICAgJiYgaXNfY29uc3RydWN0aWJsZTxzZWNvbmRfdHlwZSwgX1UyPjo6dmFsdWUKKyAgICAgICAgICAgICAgJiYgKCFpc19jb252ZXJ0aWJsZTxfVTEsIGZpcnN0X3R5cGU+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgfHwgIWlzX2NvbnZlcnRpYmxlPF9VMiwgc2Vjb25kX3R5cGU+Ojp2YWx1ZSk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfVTEsIGNsYXNzIF9VMj4KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfX2VuYWJsZV9pbXBsaWNpdCgpIHsKKyAgICAgICAgICByZXR1cm4gaXNfY29uc3RydWN0aWJsZTxmaXJzdF90eXBlLCBfVTE+Ojp2YWx1ZQorICAgICAgICAgICAgICAmJiBpc19jb25zdHJ1Y3RpYmxlPHNlY29uZF90eXBlLCBfVTI+Ojp2YWx1ZQorICAgICAgICAgICAgICAmJiBpc19jb252ZXJ0aWJsZTxfVTEsIGZpcnN0X3R5cGU+Ojp2YWx1ZQorICAgICAgICAgICAgICAmJiBpc19jb252ZXJ0aWJsZTxfVTIsIHNlY29uZF90eXBlPjo6dmFsdWU7CisgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlIDxib29sIF9NYXliZUVuYWJsZT4KKyAgICB1c2luZyBfQ2hlY2tBcmdzRGVwID0gdHlwZW5hbWUgY29uZGl0aW9uYWw8CisgICAgICBfTWF5YmVFbmFibGUsIF9DaGVja0FyZ3MsIF9fY2hlY2tfdHVwbGVfY29uc3RydWN0b3JfZmFpbD46OnR5cGU7CisKKyAgICBzdHJ1Y3QgX0NoZWNrVHVwbGVMaWtlQ29uc3RydWN0b3IgeworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1R1cGxlPgorICAgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgX19lbmFibGVfaW1wbGljaXQoKSB7CisgICAgICAgICAgICByZXR1cm4gX190dXBsZV9jb252ZXJ0aWJsZTxfVHVwbGUsIHBhaXI+Ojp2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBfVHVwbGU+CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfX2VuYWJsZV9leHBsaWNpdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBfX3R1cGxlX2NvbnN0cnVjdGlibGU8X1R1cGxlLCBwYWlyPjo6dmFsdWUKKyAgICAgICAgICAgICAgICYmICFfX3R1cGxlX2NvbnZlcnRpYmxlPF9UdXBsZSwgcGFpcj46OnZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPGNsYXNzIF9UdXBsZT4KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9fZW5hYmxlX2Fzc2lnbigpIHsKKyAgICAgICAgICAgIHJldHVybiBfX3R1cGxlX2Fzc2lnbmFibGU8X1R1cGxlLCBwYWlyPjo6dmFsdWU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UdXBsZT4KKyAgICB1c2luZyBfQ2hlY2tUTEMgPSB0eXBlbmFtZSBjb25kaXRpb25hbDwKKyAgICAgICAgX190dXBsZV9saWtlX3dpdGhfc2l6ZTxfVHVwbGUsIDI+Ojp2YWx1ZQorICAgICAgICAgICAgJiYgIWlzX3NhbWU8dHlwZW5hbWUgZGVjYXk8X1R1cGxlPjo6dHlwZSwgcGFpcj46OnZhbHVlLAorICAgICAgICBfQ2hlY2tUdXBsZUxpa2VDb25zdHJ1Y3RvciwKKyAgICAgICAgX19jaGVja190dXBsZV9jb25zdHJ1Y3Rvcl9mYWlsCisgICAgPjo6dHlwZTsKKworICAgIHRlbXBsYXRlPGJvb2wgX0R1bW15ID0gdHJ1ZSwgX0VuYWJsZUI8CisgICAgICAgICAgICBfQ2hlY2tBcmdzRGVwPF9EdW1teT46OnRlbXBsYXRlIF9fZW5hYmxlX2RlZmF1bHQ8X1QxLCBfVDI+KCkKKyAgICA+ID0gZmFsc2U+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUgorICAgIHBhaXIoKSA6IGZpcnN0KCksIHNlY29uZCgpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Ym9vbCBfRHVtbXkgPSB0cnVlLCBfRW5hYmxlQjwKKyAgICAgICAgICAgICBfQ2hlY2tBcmdzRGVwPF9EdW1teT46OnRlbXBsYXRlIF9fZW5hYmxlX2V4cGxpY2l0PF9UMSBjb25zdCYsIF9UMiBjb25zdCY+KCkKKyAgICA+ID0gZmFsc2U+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorICAgIGV4cGxpY2l0IHBhaXIoX1QxIGNvbnN0JiBfX3QxLCBfVDIgY29uc3QmIF9fdDIpCisgICAgICAgIDogZmlyc3QoX190MSksIHNlY29uZChfX3QyKSB7fQorCisgICAgdGVtcGxhdGU8Ym9vbCBfRHVtbXkgPSB0cnVlLCBfRW5hYmxlQjwKKyAgICAgICAgICAgIF9DaGVja0FyZ3NEZXA8X0R1bW15Pjo6dGVtcGxhdGUgX19lbmFibGVfaW1wbGljaXQ8X1QxIGNvbnN0JiwgX1QyIGNvbnN0Jj4oKQorICAgID4gPSBmYWxzZT4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgcGFpcihfVDEgY29uc3QmIF9fdDEsIF9UMiBjb25zdCYgX190MikKKyAgICAgICAgOiBmaXJzdChfX3QxKSwgc2Vjb25kKF9fdDIpIHt9CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVTEsIGNsYXNzIF9VMiwgX0VuYWJsZUI8CisgICAgICAgICAgICAgX0NoZWNrQXJnczo6dGVtcGxhdGUgX19lbmFibGVfZXhwbGljaXQ8X1UxLCBfVTI+KCkKKyAgICA+ID0gZmFsc2U+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorICAgIGV4cGxpY2l0IHBhaXIoX1UxJiYgX191MSwgX1UyJiYgX191MikKKyAgICAgICAgOiBmaXJzdChfVlNURDo6Zm9yd2FyZDxfVTE+KF9fdTEpKSwgc2Vjb25kKF9WU1REOjpmb3J3YXJkPF9VMj4oX191MikpIHt9CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVTEsIGNsYXNzIF9VMiwgX0VuYWJsZUI8CisgICAgICAgICAgICBfQ2hlY2tBcmdzOjp0ZW1wbGF0ZSBfX2VuYWJsZV9pbXBsaWNpdDxfVTEsIF9VMj4oKQorICAgID4gPSBmYWxzZT4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgcGFpcihfVTEmJiBfX3UxLCBfVTImJiBfX3UyKQorICAgICAgICA6IGZpcnN0KF9WU1REOjpmb3J3YXJkPF9VMT4oX191MSkpLCBzZWNvbmQoX1ZTVEQ6OmZvcndhcmQ8X1UyPihfX3UyKSkge30KKworICAgIHRlbXBsYXRlPGNsYXNzIF9VMSwgY2xhc3MgX1UyLCBfRW5hYmxlQjwKKyAgICAgICAgICAgIF9DaGVja0FyZ3M6OnRlbXBsYXRlIF9fZW5hYmxlX2V4cGxpY2l0PF9VMSBjb25zdCYsIF9VMiBjb25zdCY+KCkKKyAgICA+ID0gZmFsc2U+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorICAgIGV4cGxpY2l0IHBhaXIocGFpcjxfVTEsIF9VMj4gY29uc3QmIF9fcCkKKyAgICAgICAgOiBmaXJzdChfX3AuZmlyc3QpLCBzZWNvbmQoX19wLnNlY29uZCkge30KKworICAgIHRlbXBsYXRlPGNsYXNzIF9VMSwgY2xhc3MgX1UyLCBfRW5hYmxlQjwKKyAgICAgICAgICAgIF9DaGVja0FyZ3M6OnRlbXBsYXRlIF9fZW5hYmxlX2ltcGxpY2l0PF9VMSBjb25zdCYsIF9VMiBjb25zdCY+KCkKKyAgICA+ID0gZmFsc2U+CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorICAgIHBhaXIocGFpcjxfVTEsIF9VMj4gY29uc3QmIF9fcCkKKyAgICAgICAgOiBmaXJzdChfX3AuZmlyc3QpLCBzZWNvbmQoX19wLnNlY29uZCkge30KKworICAgIHRlbXBsYXRlPGNsYXNzIF9VMSwgY2xhc3MgX1UyLCBfRW5hYmxlQjwKKyAgICAgICAgICAgIF9DaGVja0FyZ3M6OnRlbXBsYXRlIF9fZW5hYmxlX2V4cGxpY2l0PF9VMSwgX1UyPigpCisgICAgPiA9IGZhbHNlPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICBleHBsaWNpdCBwYWlyKHBhaXI8X1UxLCBfVTI+JiZfX3ApCisgICAgICAgIDogZmlyc3QoX1ZTVEQ6OmZvcndhcmQ8X1UxPihfX3AuZmlyc3QpKSwgc2Vjb25kKF9WU1REOjpmb3J3YXJkPF9VMj4oX19wLnNlY29uZCkpIHt9CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVTEsIGNsYXNzIF9VMiwgX0VuYWJsZUI8CisgICAgICAgICAgICBfQ2hlY2tBcmdzOjp0ZW1wbGF0ZSBfX2VuYWJsZV9pbXBsaWNpdDxfVTEsIF9VMj4oKQorICAgID4gPSBmYWxzZT4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgcGFpcihwYWlyPF9VMSwgX1UyPiYmIF9fcCkKKyAgICAgICAgOiBmaXJzdChfVlNURDo6Zm9yd2FyZDxfVTE+KF9fcC5maXJzdCkpLCBzZWNvbmQoX1ZTVEQ6OmZvcndhcmQ8X1UyPihfX3Auc2Vjb25kKSkge30KKworICAgIHRlbXBsYXRlPGNsYXNzIF9UdXBsZSwgX0VuYWJsZUI8CisgICAgICAgICAgICBfQ2hlY2tUTEM8X1R1cGxlPjo6dGVtcGxhdGUgX19lbmFibGVfZXhwbGljaXQ8X1R1cGxlPigpCisgICAgPiA9IGZhbHNlPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICBleHBsaWNpdCBwYWlyKF9UdXBsZSYmIF9fcCkKKyAgICAgICAgOiBmaXJzdChfVlNURDo6Z2V0PDA+KF9WU1REOjpmb3J3YXJkPF9UdXBsZT4oX19wKSkpLAorICAgICAgICAgIHNlY29uZChfVlNURDo6Z2V0PDE+KF9WU1REOjpmb3J3YXJkPF9UdXBsZT4oX19wKSkpIHt9CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVHVwbGUsIF9FbmFibGVCPAorICAgICAgICAgICAgX0NoZWNrVExDPF9UdXBsZT46OnRlbXBsYXRlIF9fZW5hYmxlX2ltcGxpY2l0PF9UdXBsZT4oKQorICAgID4gPSBmYWxzZT4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgcGFpcihfVHVwbGUmJiBfX3ApCisgICAgICAgIDogZmlyc3QoX1ZTVEQ6OmdldDwwPihfVlNURDo6Zm9yd2FyZDxfVHVwbGU+KF9fcCkpKSwKKyAgICAgICAgICBzZWNvbmQoX1ZTVEQ6OmdldDwxPihfVlNURDo6Zm9yd2FyZDxfVHVwbGU+KF9fcCkpKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzMSwgY2xhc3MuLi4gX0FyZ3MyPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyKHBpZWNld2lzZV9jb25zdHJ1Y3RfdCBfX3BjLAorICAgICAgICAgdHVwbGU8X0FyZ3MxLi4uPiBfX2ZpcnN0X2FyZ3MsIHR1cGxlPF9BcmdzMi4uLj4gX19zZWNvbmRfYXJncykKKyAgICAgICAgOiBwYWlyKF9fcGMsIF9fZmlyc3RfYXJncywgX19zZWNvbmRfYXJncywKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX21ha2VfdHVwbGVfaW5kaWNlczxzaXplb2YuLi4oX0FyZ3MxKT46OnR5cGUoKSwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX21ha2VfdHVwbGVfaW5kaWNlczxzaXplb2YuLi4oX0FyZ3MyKSA+Ojp0eXBlKCkpIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcGFpciYgb3BlcmF0b3I9KHR5cGVuYW1lIGNvbmRpdGlvbmFsPAorICAgICAgICAgICAgICAgICAgICAgICAgaXNfY29weV9hc3NpZ25hYmxlPGZpcnN0X3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgaXNfY29weV9hc3NpZ25hYmxlPHNlY29uZF90eXBlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgIHBhaXIsIF9fbmF0Pjo6dHlwZSBjb25zdCYgX19wKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfY29weV9hc3NpZ25hYmxlPGZpcnN0X3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgIGlzX25vdGhyb3dfY29weV9hc3NpZ25hYmxlPHNlY29uZF90eXBlPjo6dmFsdWUpCisgICAgeworICAgICAgICBmaXJzdCA9IF9fcC5maXJzdDsKKyAgICAgICAgc2Vjb25kID0gX19wLnNlY29uZDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyJiBvcGVyYXRvcj0odHlwZW5hbWUgY29uZGl0aW9uYWw8CisgICAgICAgICAgICAgICAgICAgICAgICBpc19tb3ZlX2Fzc2lnbmFibGU8Zmlyc3RfdHlwZT46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICBpc19tb3ZlX2Fzc2lnbmFibGU8c2Vjb25kX3R5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgcGFpciwgX19uYXQ+Ojp0eXBlJiYgX19wKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGZpcnN0X3R5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPHNlY29uZF90eXBlPjo6dmFsdWUpCisgICAgeworICAgICAgICBmaXJzdCA9IF9WU1REOjpmb3J3YXJkPGZpcnN0X3R5cGU+KF9fcC5maXJzdCk7CisgICAgICAgIHNlY29uZCA9IF9WU1REOjpmb3J3YXJkPHNlY29uZF90eXBlPihfX3Auc2Vjb25kKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHVwbGUsIF9FbmFibGVCPAorICAgICAgICAgICAgX0NoZWNrVExDPF9UdXBsZT46OnRlbXBsYXRlIF9fZW5hYmxlX2Fzc2lnbjxfVHVwbGU+KCkKKyAgICAgPiA9IGZhbHNlPgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBwYWlyJiBvcGVyYXRvcj0oX1R1cGxlJiYgX19wKSB7CisgICAgICAgIGZpcnN0ID0gX1ZTVEQ6OmdldDwwPihfVlNURDo6Zm9yd2FyZDxfVHVwbGU+KF9fcCkpOworICAgICAgICBzZWNvbmQgPSBfVlNURDo6Z2V0PDE+KF9WU1REOjpmb3J3YXJkPF9UdXBsZT4oX19wKSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkCisgICAgc3dhcChwYWlyJiBfX3ApIF9OT0VYQ0VQVF8oX19pc19ub3Rocm93X3N3YXBwYWJsZTxmaXJzdF90eXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2lzX25vdGhyb3dfc3dhcHBhYmxlPHNlY29uZF90eXBlPjo6dmFsdWUpCisgICAgeworICAgICAgICB1c2luZyBfVlNURDo6c3dhcDsKKyAgICAgICAgc3dhcChmaXJzdCwgIF9fcC5maXJzdCk7CisgICAgICAgIHN3YXAoc2Vjb25kLCBfX3Auc2Vjb25kKTsKKyAgICB9Citwcml2YXRlOgorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBfQXJnczEsIGNsYXNzLi4uIF9BcmdzMiwgc2l6ZV90Li4uIF9JMSwgc2l6ZV90Li4uIF9JMj4KKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgICBwYWlyKHBpZWNld2lzZV9jb25zdHJ1Y3RfdCwKKyAgICAgICAgICAgICB0dXBsZTxfQXJnczEuLi4+JiBfX2ZpcnN0X2FyZ3MsIHR1cGxlPF9BcmdzMi4uLj4mIF9fc2Vjb25kX2FyZ3MsCisgICAgICAgICAgICAgX190dXBsZV9pbmRpY2VzPF9JMS4uLj4sIF9fdHVwbGVfaW5kaWNlczxfSTIuLi4+KTsKKyNlbmRpZgorfTsKKworI2lmbmRlZiBfTElCQ1BQX0hBU19OT19ERURVQ1RJT05fR1VJREVTCit0ZW1wbGF0ZTxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK3BhaXIoX1QxLCBfVDIpIC0+IHBhaXI8X1QxLCBfVDI+OworI2VuZGlmIC8vIF9MSUJDUFBfSEFTX05PX0RFRFVDVElPTl9HVUlERVMKKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgcGFpcjxfVDEsX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSxfVDI+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5maXJzdCA9PSBfX3kuZmlyc3QgJiYgX194LnNlY29uZCA9PSBfX3kuc2Vjb25kOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBwYWlyPF9UMSxfVDI+JiBfX3gsIGNvbnN0IHBhaXI8X1QxLF9UMj4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPT0gX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK2Jvb2wKK29wZXJhdG9yPCAoY29uc3QgcGFpcjxfVDEsX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSxfVDI+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feC5maXJzdCA8IF9feS5maXJzdCB8fCAoIShfX3kuZmlyc3QgPCBfX3guZmlyc3QpICYmIF9feC5zZWNvbmQgPCBfX3kuc2Vjb25kKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK2Jvb2wKK29wZXJhdG9yPiAoY29uc3QgcGFpcjxfVDEsX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSxfVDI+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feSA8IF9feDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK2Jvb2wKK29wZXJhdG9yPj0oY29uc3QgcGFpcjxfVDEsX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSxfVDI+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194IDwgX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK2Jvb2wKK29wZXJhdG9yPD0oY29uc3QgcGFpcjxfVDEsX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSxfVDI+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX195IDwgX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfc3dhcHBhYmxlPF9UMT46OnZhbHVlICYmCisgICAgX19pc19zd2FwcGFibGU8X1QyPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQorc3dhcChwYWlyPF9UMSwgX1QyPiYgX194LCBwYWlyPF9UMSwgX1QyPiYgX195KQorICAgICAgICAgICAgICAgICAgICAgX05PRVhDRVBUXygoX19pc19ub3Rocm93X3N3YXBwYWJsZTxfVDE+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pc19ub3Rocm93X3N3YXBwYWJsZTxfVDI+Ojp2YWx1ZSkpCit7CisgICAgX194LnN3YXAoX195KTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX21ha2VfcGFpcl9yZXR1cm5faW1wbAoreworICAgIHR5cGVkZWYgX1RwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fbWFrZV9wYWlyX3JldHVybl9pbXBsPHJlZmVyZW5jZV93cmFwcGVyPF9UcD4+Cit7CisgICAgdHlwZWRlZiBfVHAmIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fbWFrZV9wYWlyX3JldHVybgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19tYWtlX3BhaXJfcmV0dXJuX2ltcGw8dHlwZW5hbWUgZGVjYXk8X1RwPjo6dHlwZT46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitwYWlyPHR5cGVuYW1lIF9fbWFrZV9wYWlyX3JldHVybjxfVDE+Ojp0eXBlLCB0eXBlbmFtZSBfX21ha2VfcGFpcl9yZXR1cm48X1QyPjo6dHlwZT4KK21ha2VfcGFpcihfVDEmJiBfX3QxLCBfVDImJiBfX3QyKQoreworICAgIHJldHVybiBwYWlyPHR5cGVuYW1lIF9fbWFrZV9wYWlyX3JldHVybjxfVDE+Ojp0eXBlLCB0eXBlbmFtZSBfX21ha2VfcGFpcl9yZXR1cm48X1QyPjo6dHlwZT4KKyAgICAgICAgICAgICAgIChfVlNURDo6Zm9yd2FyZDxfVDE+KF9fdDEpLCBfVlNURDo6Zm9yd2FyZDxfVDI+KF9fdDIpKTsKK30KKworI2Vsc2UgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorcGFpcjxfVDEsX1QyPgorbWFrZV9wYWlyKF9UMSBfX3gsIF9UMiBfX3kpCit7CisgICAgcmV0dXJuIHBhaXI8X1QxLCBfVDI+KF9feCwgX195KTsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB0dXBsZV9zaXplPHBhaXI8X1QxLCBfVDI+ID4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIDI+IHt9OworCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1QxLCBjbGFzcyBfVDI+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB0dXBsZV9lbGVtZW50PF9JcCwgcGFpcjxfVDEsIF9UMj4gPgoreworICAgIHN0YXRpY19hc3NlcnQoX0lwIDwgMiwgIkluZGV4IG91dCBvZiBib3VuZHMgaW4gc3RkOjp0dXBsZV9lbGVtZW50PHN0ZDo6cGFpcjxUMSwgVDI+PiIpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdHVwbGVfZWxlbWVudDwwLCBwYWlyPF9UMSwgX1QyPiA+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfVDEgdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHR1cGxlX2VsZW1lbnQ8MSwgcGFpcjxfVDEsIF9UMj4gPgoreworcHVibGljOgorICAgIHR5cGVkZWYgX1QyIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcD4gc3RydWN0IF9fZ2V0X3BhaXI7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX19nZXRfcGFpcjwwPgoreworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBzdGF0aWMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgX1QxJgorICAgIGdldChwYWlyPF9UMSwgX1QyPiYgX19wKSBfTk9FWENFUFQge3JldHVybiBfX3AuZmlyc3Q7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIHN0YXRpYworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICBjb25zdCBfVDEmCisgICAgZ2V0KGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3ApIF9OT0VYQ0VQVCB7cmV0dXJuIF9fcC5maXJzdDt9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIHN0YXRpYworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICBfVDEmJgorICAgIGdldChwYWlyPF9UMSwgX1QyPiYmIF9fcCkgX05PRVhDRVBUIHtyZXR1cm4gX1ZTVEQ6OmZvcndhcmQ8X1QxPihfX3AuZmlyc3QpO30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBzdGF0aWMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgY29uc3QgX1QxJiYKKyAgICBnZXQoY29uc3QgcGFpcjxfVDEsIF9UMj4mJiBfX3ApIF9OT0VYQ0VQVCB7cmV0dXJuIF9WU1REOjpmb3J3YXJkPGNvbnN0IF9UMT4oX19wLmZpcnN0KTt9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfX2dldF9wYWlyPDE+Cit7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIHN0YXRpYworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICBfVDImCisgICAgZ2V0KHBhaXI8X1QxLCBfVDI+JiBfX3ApIF9OT0VYQ0VQVCB7cmV0dXJuIF9fcC5zZWNvbmQ7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIHN0YXRpYworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICBjb25zdCBfVDImCisgICAgZ2V0KGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3ApIF9OT0VYQ0VQVCB7cmV0dXJuIF9fcC5zZWNvbmQ7fQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBzdGF0aWMKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCisgICAgX1QyJiYKKyAgICBnZXQocGFpcjxfVDEsIF9UMj4mJiBfX3ApIF9OT0VYQ0VQVCB7cmV0dXJuIF9WU1REOjpmb3J3YXJkPF9UMj4oX19wLnNlY29uZCk7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIHN0YXRpYworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKKyAgICBjb25zdCBfVDImJgorICAgIGdldChjb25zdCBwYWlyPF9UMSwgX1QyPiYmIF9fcCkgX05PRVhDRVBUIHtyZXR1cm4gX1ZTVEQ6OmZvcndhcmQ8Y29uc3QgX1QyPihfX3Auc2Vjb25kKTt9CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworfTsKKwordGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9DT05TVEVYUFJfQUZURVJfQ1hYMTEKK3R5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0lwLCBwYWlyPF9UMSwgX1QyPiA+Ojp0eXBlJgorZ2V0KHBhaXI8X1QxLCBfVDI+JiBfX3ApIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX2dldF9wYWlyPF9JcD46OmdldChfX3ApOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQorY29uc3QgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSXAsIHBhaXI8X1QxLCBfVDI+ID46OnR5cGUmCitnZXQoY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9fcCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fZ2V0X3BhaXI8X0lwPjo6Z2V0KF9fcCk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX0NPTlNURVhQUl9BRlRFUl9DWFgxMQordHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSXAsIHBhaXI8X1QxLCBfVDI+ID46OnR5cGUmJgorZ2V0KHBhaXI8X1QxLCBfVDI+JiYgX19wKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19nZXRfcGFpcjxfSXA+OjpnZXQoX1ZTVEQ6Om1vdmUoX19wKSk7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDExCitjb25zdCB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9JcCwgcGFpcjxfVDEsIF9UMj4gPjo6dHlwZSYmCitnZXQoY29uc3QgcGFpcjxfVDEsIF9UMj4mJiBfX3ApIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX2dldF9wYWlyPF9JcD46OmdldChfVlNURDo6bW92ZShfX3ApKTsKK30KKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBfVDEgJiBnZXQocGFpcjxfVDEsIF9UMj4mIF9fcCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fZ2V0X3BhaXI8MD46OmdldChfX3ApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RleHByIF9UMSBjb25zdCAmIGdldChwYWlyPF9UMSwgX1QyPiBjb25zdCYgX19wKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19nZXRfcGFpcjwwPjo6Z2V0KF9fcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdGV4cHIgX1QxICYmIGdldChwYWlyPF9UMSwgX1QyPiYmIF9fcCkgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fZ2V0X3BhaXI8MD46OmdldChfVlNURDo6bW92ZShfX3ApKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBfVDEgY29uc3QgJiYgZ2V0KHBhaXI8X1QxLCBfVDI+IGNvbnN0JiYgX19wKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19nZXRfcGFpcjwwPjo6Z2V0KF9WU1REOjptb3ZlKF9fcCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RleHByIF9UMSAmIGdldChwYWlyPF9UMiwgX1QxPiYgX19wKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19nZXRfcGFpcjwxPjo6Z2V0KF9fcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdGV4cHIgX1QxIGNvbnN0ICYgZ2V0KHBhaXI8X1QyLCBfVDE+IGNvbnN0JiBfX3ApIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX2dldF9wYWlyPDE+OjpnZXQoX19wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBfVDEgJiYgZ2V0KHBhaXI8X1QyLCBfVDE+JiYgX19wKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19nZXRfcGFpcjwxPjo6Z2V0KF9WU1REOjptb3ZlKF9fcCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RleHByIF9UMSBjb25zdCAmJiBnZXQocGFpcjxfVDIsIF9UMT4gY29uc3QmJiBfX3ApIF9OT0VYQ0VQVAoreworICAgIHJldHVybiBfX2dldF9wYWlyPDE+OjpnZXQoX1ZTVEQ6Om1vdmUoX19wKSk7Cit9CisKKyNlbmRpZgorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKwordGVtcGxhdGU8Y2xhc3MgX1RwLCBfVHAuLi4gX0lwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGludGVnZXJfc2VxdWVuY2UKK3sKKyAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICAgIHN0YXRpY19hc3NlcnQoIGlzX2ludGVncmFsPF9UcD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgInN0ZDo6aW50ZWdlcl9zZXF1ZW5jZSBjYW4gb25seSBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhbiBpbnRlZ3JhbCB0eXBlIiApOworICAgIHN0YXRpYworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdGV4cHIKKyAgICBzaXplX3QKKyAgICBzaXplKCkgbm9leGNlcHQgeyByZXR1cm4gc2l6ZW9mLi4uKF9JcCk7IH0KK307CisKK3RlbXBsYXRlPHNpemVfdC4uLiBfSXA+CisgICAgdXNpbmcgaW5kZXhfc2VxdWVuY2UgPSBpbnRlZ2VyX3NlcXVlbmNlPHNpemVfdCwgX0lwLi4uPjsKKworI2lmIF9faGFzX2J1aWx0aW4oX19tYWtlX2ludGVnZXJfc2VxKSAmJiAhZGVmaW5lZChfTElCQ1BQX1RFU1RJTkdfRkFMTEJBQ0tfTUFLRV9JTlRFR0VSX1NFUVVFTkNFKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBfVHAgX0VwPgordXNpbmcgX19tYWtlX2ludGVnZXJfc2VxdWVuY2UgPSBfX21ha2VfaW50ZWdlcl9zZXE8aW50ZWdlcl9zZXF1ZW5jZSwgX1RwLCBfRXA+OworCisjZWxzZQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9UcCBfTnA+IHVzaW5nIF9fbWFrZV9pbnRlZ2VyX3NlcXVlbmNlX3VuY2hlY2tlZCA9CisgIHR5cGVuYW1lIF9fZGV0YWlsOjpfX21ha2U8X05wPjo6dHlwZTo6dGVtcGxhdGUgX19jb252ZXJ0PGludGVnZXJfc2VxdWVuY2UsIF9UcD47CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIF9UcCBfRXA+CitzdHJ1Y3QgX19tYWtlX2ludGVnZXJfc2VxdWVuY2VfY2hlY2tlZAoreworICAgIHN0YXRpY19hc3NlcnQoaXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAic3RkOjptYWtlX2ludGVnZXJfc2VxdWVuY2UgY2FuIG9ubHkgYmUgaW5zdGFudGlhdGVkIHdpdGggYW4gaW50ZWdyYWwgdHlwZSIgKTsKKyAgICBzdGF0aWNfYXNzZXJ0KDAgPD0gX0VwLCAic3RkOjptYWtlX2ludGVnZXJfc2VxdWVuY2UgbXVzdCBoYXZlIGEgbm9uLW5lZ2F0aXZlIHNlcXVlbmNlIGxlbmd0aCIpOworICAgIC8vIFdvcmthcm91bmQgR0NDIGJ1ZyBieSBwcmV2ZW50aW5nIGJhZCBpbnN0YWxsYXRpb25zIHdoZW4gMCA8PSBfRXAKKyAgICAvLyBodHRwczovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD02ODkyOQorICAgIHR5cGVkZWYgX19tYWtlX2ludGVnZXJfc2VxdWVuY2VfdW5jaGVja2VkPF9UcCwgMCA8PSBfRXAgPyBfRXAgOiAwPiB0eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgX1RwIF9FcD4KK3VzaW5nIF9fbWFrZV9pbnRlZ2VyX3NlcXVlbmNlID0gdHlwZW5hbWUgX19tYWtlX2ludGVnZXJfc2VxdWVuY2VfY2hlY2tlZDxfVHAsIF9FcD46OnR5cGU7CisKKyNlbmRpZgorCit0ZW1wbGF0ZTxjbGFzcyBfVHAsIF9UcCBfTnA+CisgICAgdXNpbmcgbWFrZV9pbnRlZ2VyX3NlcXVlbmNlID0gX19tYWtlX2ludGVnZXJfc2VxdWVuY2U8X1RwLCBfTnA+OworCit0ZW1wbGF0ZTxzaXplX3QgX05wPgorICAgIHVzaW5nIG1ha2VfaW5kZXhfc2VxdWVuY2UgPSBtYWtlX2ludGVnZXJfc2VxdWVuY2U8c2l6ZV90LCBfTnA+OworCit0ZW1wbGF0ZTxjbGFzcy4uLiBfVHA+CisgICAgdXNpbmcgaW5kZXhfc2VxdWVuY2VfZm9yID0gbWFrZV9pbmRleF9zZXF1ZW5jZTxzaXplb2YuLi4oX1RwKT47CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9TVERfVkVSID4gMTEKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDExCit0ZW1wbGF0ZTxjbGFzcyBfVDEsIGNsYXNzIF9UMiA9IF9UMT4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfQ09OU1RFWFBSX0FGVEVSX0NYWDE3CitfVDEgZXhjaGFuZ2UoX1QxJiBfX29iaiwgX1QyICYmIF9fbmV3X3ZhbHVlKQoreworICAgIF9UMSBfX29sZF92YWx1ZSA9IF9WU1REOjptb3ZlKF9fb2JqKTsKKyAgICBfX29iaiA9IF9WU1REOjpmb3J3YXJkPF9UMj4oX19uZXdfdmFsdWUpOworICAgIHJldHVybiBfX29sZF92YWx1ZTsKK30KKyNlbmRpZiAgLy8gX0xJQkNQUF9TVERfVkVSID4gMTEKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisKK3N0cnVjdCBfTElCQ1BQX1RZUEVfVklTIGluX3BsYWNlX3QgeworICAgIGV4cGxpY2l0IGluX3BsYWNlX3QoKSA9IGRlZmF1bHQ7Cit9OworX0xJQkNQUF9JTkxJTkVfVkFSIGNvbnN0ZXhwciBpbl9wbGFjZV90IGluX3BsYWNle307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaW5fcGxhY2VfdHlwZV90IHsKKyAgICBleHBsaWNpdCBpbl9wbGFjZV90eXBlX3QoKSA9IGRlZmF1bHQ7Cit9OwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBjb25zdGV4cHIgaW5fcGxhY2VfdHlwZV90PF9UcD4gaW5fcGxhY2VfdHlwZXt9OworCit0ZW1wbGF0ZSA8c2l6ZV90IF9JZHg+CitzdHJ1Y3QgX0xJQkNQUF9UWVBFX1ZJUyBpbl9wbGFjZV9pbmRleF90IHsKKyAgICBleHBsaWNpdCBpbl9wbGFjZV9pbmRleF90KCkgPSBkZWZhdWx0OworfTsKK3RlbXBsYXRlIDxzaXplX3QgX0lkeD4KK19MSUJDUFBfSU5MSU5FX1ZBUiBjb25zdGV4cHIgaW5fcGxhY2VfaW5kZXhfdDxfSWR4PiBpbl9wbGFjZV9pbmRleHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX19pc19pbnBsYWNlX3R5cGVfaW1wIDogZmFsc2VfdHlwZSB7fTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfX2lzX2lucGxhY2VfdHlwZV9pbXA8aW5fcGxhY2VfdHlwZV90PF9UcD4+IDogdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordXNpbmcgX19pc19pbnBsYWNlX3R5cGUgPSBfX2lzX2lucGxhY2VfdHlwZV9pbXA8X191bmN2cmVmX3Q8X1RwPj47CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfX2lzX2lucGxhY2VfaW5kZXhfaW1wIDogZmFsc2VfdHlwZSB7fTsKK3RlbXBsYXRlIDxzaXplX3QgX0lkeD4gc3RydWN0IF9faXNfaW5wbGFjZV9pbmRleF9pbXA8aW5fcGxhY2VfaW5kZXhfdDxfSWR4Pj4gOiB0cnVlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit1c2luZyBfX2lzX2lucGxhY2VfaW5kZXggPSBfX2lzX2lucGxhY2VfaW5kZXhfaW1wPF9fdW5jdnJlZl90PF9UcD4+OworCisjZW5kaWYgLy8gX0xJQkNQUF9TVERfVkVSID4gMTQKKwordGVtcGxhdGUgPGNsYXNzIF9BcmcsIGNsYXNzIF9SZXN1bHQ+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgdW5hcnlfZnVuY3Rpb24KK3sKKyAgICB0eXBlZGVmIF9BcmcgICAgYXJndW1lbnRfdHlwZTsKKyAgICB0eXBlZGVmIF9SZXN1bHQgcmVzdWx0X3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1NpemU+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1NpemUKK19fbG9hZHdvcmQoY29uc3Qgdm9pZCogX19wKQoreworICAgIF9TaXplIF9fcjsKKyAgICBzdGQ6Om1lbWNweSgmX19yLCBfX3AsIHNpemVvZihfX3IpKTsKKyAgICByZXR1cm4gX19yOworfQorCisvLyBXZSB1c2UgbXVybXVyMiB3aGVuIHNpemVfdCBpcyAzMiBiaXRzLCBhbmQgY2l0eWhhc2g2NCB3aGVuIHNpemVfdAorLy8gaXMgNjQgYml0cy4gIFRoaXMgaXMgYmVjYXVzZSBjaXR5aGFzaDY0IHVzZXMgNjRiaXQgeCA2NGJpdAorLy8gbXVsdGlwbGljYXRpb24sIHdoaWNoIGNhbiBiZSB2ZXJ5IHNsb3cgb24gMzItYml0IHN5c3RlbXMuCit0ZW1wbGF0ZSA8Y2xhc3MgX1NpemUsIHNpemVfdCA9IHNpemVvZihfU2l6ZSkqX19DSEFSX0JJVF9fPgorc3RydWN0IF9fbXVybXVyMl9vcl9jaXR5aGFzaDsKKwordGVtcGxhdGUgPGNsYXNzIF9TaXplPgorc3RydWN0IF9fbXVybXVyMl9vcl9jaXR5aGFzaDxfU2l6ZSwgMzI+Cit7CisgICAgaW5saW5lIF9TaXplIG9wZXJhdG9yKCkoY29uc3Qgdm9pZCogX19rZXksIF9TaXplIF9fbGVuKQorICAgICAgICAgX0xJQkNQUF9ESVNBQkxFX1VCU0FOX1VOU0lHTkVEX0lOVEVHRVJfQ0hFQ0s7Cit9OworCisvLyBtdXJtdXIyCit0ZW1wbGF0ZSA8Y2xhc3MgX1NpemU+CitfU2l6ZQorX19tdXJtdXIyX29yX2NpdHloYXNoPF9TaXplLCAzMj46Om9wZXJhdG9yKCkoY29uc3Qgdm9pZCogX19rZXksIF9TaXplIF9fbGVuKQoreworICAgIGNvbnN0IF9TaXplIF9fbSA9IDB4NWJkMWU5OTU7CisgICAgY29uc3QgX1NpemUgX19yID0gMjQ7CisgICAgX1NpemUgX19oID0gX19sZW47CisgICAgY29uc3QgdW5zaWduZWQgY2hhciogX19kYXRhID0gc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KF9fa2V5KTsKKyAgICBmb3IgKDsgX19sZW4gPj0gNDsgX19kYXRhICs9IDQsIF9fbGVuIC09IDQpCisgICAgeworICAgICAgICBfU2l6ZSBfX2sgPSBfX2xvYWR3b3JkPF9TaXplPihfX2RhdGEpOworICAgICAgICBfX2sgKj0gX19tOworICAgICAgICBfX2sgXj0gX19rID4+IF9fcjsKKyAgICAgICAgX19rICo9IF9fbTsKKyAgICAgICAgX19oICo9IF9fbTsKKyAgICAgICAgX19oIF49IF9fazsKKyAgICB9CisgICAgc3dpdGNoIChfX2xlbikKKyAgICB7CisgICAgY2FzZSAzOgorICAgICAgICBfX2ggXj0gX19kYXRhWzJdIDw8IDE2OworICAgIGNhc2UgMjoKKyAgICAgICAgX19oIF49IF9fZGF0YVsxXSA8PCA4OworICAgIGNhc2UgMToKKyAgICAgICAgX19oIF49IF9fZGF0YVswXTsKKyAgICAgICAgX19oICo9IF9fbTsKKyAgICB9CisgICAgX19oIF49IF9faCA+PiAxMzsKKyAgICBfX2ggKj0gX19tOworICAgIF9faCBePSBfX2ggPj4gMTU7CisgICAgcmV0dXJuIF9faDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9TaXplPgorc3RydWN0IF9fbXVybXVyMl9vcl9jaXR5aGFzaDxfU2l6ZSwgNjQ+Cit7CisgICAgaW5saW5lIF9TaXplIG9wZXJhdG9yKCkoY29uc3Qgdm9pZCogX19rZXksIF9TaXplIF9fbGVuKSAgX0xJQkNQUF9ESVNBQkxFX1VCU0FOX1VOU0lHTkVEX0lOVEVHRVJfQ0hFQ0s7CisKKyBwcml2YXRlOgorICAvLyBTb21lIHByaW1lcyBiZXR3ZWVuIDJeNjMgYW5kIDJeNjQuCisgIHN0YXRpYyBjb25zdCBfU2l6ZSBfX2swID0gMHhjM2E1Yzg1Yzk3Y2IzMTI3VUxMOworICBzdGF0aWMgY29uc3QgX1NpemUgX19rMSA9IDB4YjQ5MmI2NmZiZTk4ZjI3M1VMTDsKKyAgc3RhdGljIGNvbnN0IF9TaXplIF9fazIgPSAweDlhZTE2YTNiMmY5MDQwNGZVTEw7CisgIHN0YXRpYyBjb25zdCBfU2l6ZSBfX2szID0gMHhjOTQ5ZDdjNzUwOWU2NTU3VUxMOworCisgIHN0YXRpYyBfU2l6ZSBfX3JvdGF0ZShfU2l6ZSBfX3ZhbCwgaW50IF9fc2hpZnQpIHsKKyAgICByZXR1cm4gX19zaGlmdCA9PSAwID8gX192YWwgOiAoKF9fdmFsID4+IF9fc2hpZnQpIHwgKF9fdmFsIDw8ICg2NCAtIF9fc2hpZnQpKSk7CisgIH0KKworICBzdGF0aWMgX1NpemUgX19yb3RhdGVfYnlfYXRfbGVhc3RfMShfU2l6ZSBfX3ZhbCwgaW50IF9fc2hpZnQpIHsKKyAgICByZXR1cm4gKF9fdmFsID4+IF9fc2hpZnQpIHwgKF9fdmFsIDw8ICg2NCAtIF9fc2hpZnQpKTsKKyAgfQorCisgIHN0YXRpYyBfU2l6ZSBfX3NoaWZ0X21peChfU2l6ZSBfX3ZhbCkgeworICAgIHJldHVybiBfX3ZhbCBeIChfX3ZhbCA+PiA0Nyk7CisgIH0KKworICBzdGF0aWMgX1NpemUgX19oYXNoX2xlbl8xNihfU2l6ZSBfX3UsIF9TaXplIF9fdikKKyAgICAgX0xJQkNQUF9ESVNBQkxFX1VCU0FOX1VOU0lHTkVEX0lOVEVHRVJfQ0hFQ0sKKyAgeworICAgIGNvbnN0IF9TaXplIF9fbXVsID0gMHg5ZGRmZWEwOGViMzgyZDY5VUxMOworICAgIF9TaXplIF9fYSA9IChfX3UgXiBfX3YpICogX19tdWw7CisgICAgX19hIF49IChfX2EgPj4gNDcpOworICAgIF9TaXplIF9fYiA9IChfX3YgXiBfX2EpICogX19tdWw7CisgICAgX19iIF49IChfX2IgPj4gNDcpOworICAgIF9fYiAqPSBfX211bDsKKyAgICByZXR1cm4gX19iOworICB9CisKKyAgc3RhdGljIF9TaXplIF9faGFzaF9sZW5fMF90b18xNihjb25zdCBjaGFyKiBfX3MsIF9TaXplIF9fbGVuKQorICAgICBfTElCQ1BQX0RJU0FCTEVfVUJTQU5fVU5TSUdORURfSU5URUdFUl9DSEVDSworICB7CisgICAgaWYgKF9fbGVuID4gOCkgeworICAgICAgY29uc3QgX1NpemUgX19hID0gX19sb2Fkd29yZDxfU2l6ZT4oX19zKTsKKyAgICAgIGNvbnN0IF9TaXplIF9fYiA9IF9fbG9hZHdvcmQ8X1NpemU+KF9fcyArIF9fbGVuIC0gOCk7CisgICAgICByZXR1cm4gX19oYXNoX2xlbl8xNihfX2EsIF9fcm90YXRlX2J5X2F0X2xlYXN0XzEoX19iICsgX19sZW4sIF9fbGVuKSkgXiBfX2I7CisgICAgfQorICAgIGlmIChfX2xlbiA+PSA0KSB7CisgICAgICBjb25zdCB1aW50MzJfdCBfX2EgPSBfX2xvYWR3b3JkPHVpbnQzMl90PihfX3MpOworICAgICAgY29uc3QgdWludDMyX3QgX19iID0gX19sb2Fkd29yZDx1aW50MzJfdD4oX19zICsgX19sZW4gLSA0KTsKKyAgICAgIHJldHVybiBfX2hhc2hfbGVuXzE2KF9fbGVuICsgKF9fYSA8PCAzKSwgX19iKTsKKyAgICB9CisgICAgaWYgKF9fbGVuID4gMCkgeworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBfX2EgPSBfX3NbMF07CisgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIF9fYiA9IF9fc1tfX2xlbiA+PiAxXTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgX19jID0gX19zW19fbGVuIC0gMV07CisgICAgICBjb25zdCB1aW50MzJfdCBfX3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oX19hKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KF9fYikgPDwgOCk7CisgICAgICBjb25zdCB1aW50MzJfdCBfX3ogPSBfX2xlbiArIChzdGF0aWNfY2FzdDx1aW50MzJfdD4oX19jKSA8PCAyKTsKKyAgICAgIHJldHVybiBfX3NoaWZ0X21peChfX3kgKiBfX2syIF4gX196ICogX19rMykgKiBfX2syOworICAgIH0KKyAgICByZXR1cm4gX19rMjsKKyAgfQorCisgIHN0YXRpYyBfU2l6ZSBfX2hhc2hfbGVuXzE3X3RvXzMyKGNvbnN0IGNoYXIgKl9fcywgX1NpemUgX19sZW4pCisgICAgIF9MSUJDUFBfRElTQUJMRV9VQlNBTl9VTlNJR05FRF9JTlRFR0VSX0NIRUNLCisgIHsKKyAgICBjb25zdCBfU2l6ZSBfX2EgPSBfX2xvYWR3b3JkPF9TaXplPihfX3MpICogX19rMTsKKyAgICBjb25zdCBfU2l6ZSBfX2IgPSBfX2xvYWR3b3JkPF9TaXplPihfX3MgKyA4KTsKKyAgICBjb25zdCBfU2l6ZSBfX2MgPSBfX2xvYWR3b3JkPF9TaXplPihfX3MgKyBfX2xlbiAtIDgpICogX19rMjsKKyAgICBjb25zdCBfU2l6ZSBfX2QgPSBfX2xvYWR3b3JkPF9TaXplPihfX3MgKyBfX2xlbiAtIDE2KSAqIF9fazA7CisgICAgcmV0dXJuIF9faGFzaF9sZW5fMTYoX19yb3RhdGUoX19hIC0gX19iLCA0MykgKyBfX3JvdGF0ZShfX2MsIDMwKSArIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2EgKyBfX3JvdGF0ZShfX2IgXiBfX2szLCAyMCkgLSBfX2MgKyBfX2xlbik7CisgIH0KKworICAvLyBSZXR1cm4gYSAxNi1ieXRlIGhhc2ggZm9yIDQ4IGJ5dGVzLiAgUXVpY2sgYW5kIGRpcnR5LgorICAvLyBDYWxsZXJzIGRvIGJlc3QgdG8gdXNlICJyYW5kb20tbG9va2luZyIgdmFsdWVzIGZvciBhIGFuZCBiLgorICBzdGF0aWMgcGFpcjxfU2l6ZSwgX1NpemU+IF9fd2Vha19oYXNoX2xlbl8zMl93aXRoX3NlZWRzKAorICAgICAgX1NpemUgX193LCBfU2l6ZSBfX3gsIF9TaXplIF9feSwgX1NpemUgX196LCBfU2l6ZSBfX2EsIF9TaXplIF9fYikKKyAgICAgICAgX0xJQkNQUF9ESVNBQkxFX1VCU0FOX1VOU0lHTkVEX0lOVEVHRVJfQ0hFQ0sKKyAgeworICAgIF9fYSArPSBfX3c7CisgICAgX19iID0gX19yb3RhdGUoX19iICsgX19hICsgX196LCAyMSk7CisgICAgY29uc3QgX1NpemUgX19jID0gX19hOworICAgIF9fYSArPSBfX3g7CisgICAgX19hICs9IF9feTsKKyAgICBfX2IgKz0gX19yb3RhdGUoX19hLCA0NCk7CisgICAgcmV0dXJuIHBhaXI8X1NpemUsIF9TaXplPihfX2EgKyBfX3osIF9fYiArIF9fYyk7CisgIH0KKworICAvLyBSZXR1cm4gYSAxNi1ieXRlIGhhc2ggZm9yIHNbMF0gLi4uIHNbMzFdLCBhLCBhbmQgYi4gIFF1aWNrIGFuZCBkaXJ0eS4KKyAgc3RhdGljIHBhaXI8X1NpemUsIF9TaXplPiBfX3dlYWtfaGFzaF9sZW5fMzJfd2l0aF9zZWVkcygKKyAgICAgIGNvbnN0IGNoYXIqIF9fcywgX1NpemUgX19hLCBfU2l6ZSBfX2IpCisgICAgX0xJQkNQUF9ESVNBQkxFX1VCU0FOX1VOU0lHTkVEX0lOVEVHRVJfQ0hFQ0sKKyAgeworICAgIHJldHVybiBfX3dlYWtfaGFzaF9sZW5fMzJfd2l0aF9zZWVkcyhfX2xvYWR3b3JkPF9TaXplPihfX3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2xvYWR3b3JkPF9TaXplPihfX3MgKyA4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19sb2Fkd29yZDxfU2l6ZT4oX19zICsgMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2xvYWR3b3JkPF9TaXplPihfX3MgKyAyNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iKTsKKyAgfQorCisgIC8vIFJldHVybiBhbiA4LWJ5dGUgaGFzaCBmb3IgMzMgdG8gNjQgYnl0ZXMuCisgIHN0YXRpYyBfU2l6ZSBfX2hhc2hfbGVuXzMzX3RvXzY0KGNvbnN0IGNoYXIgKl9fcywgc2l6ZV90IF9fbGVuKQorICAgIF9MSUJDUFBfRElTQUJMRV9VQlNBTl9VTlNJR05FRF9JTlRFR0VSX0NIRUNLCisgIHsKKyAgICBfU2l6ZSBfX3ogPSBfX2xvYWR3b3JkPF9TaXplPihfX3MgKyAyNCk7CisgICAgX1NpemUgX19hID0gX19sb2Fkd29yZDxfU2l6ZT4oX19zKSArCisgICAgICAgICAgICAgICAgKF9fbGVuICsgX19sb2Fkd29yZDxfU2l6ZT4oX19zICsgX19sZW4gLSAxNikpICogX19rMDsKKyAgICBfU2l6ZSBfX2IgPSBfX3JvdGF0ZShfX2EgKyBfX3osIDUyKTsKKyAgICBfU2l6ZSBfX2MgPSBfX3JvdGF0ZShfX2EsIDM3KTsKKyAgICBfX2EgKz0gX19sb2Fkd29yZDxfU2l6ZT4oX19zICsgOCk7CisgICAgX19jICs9IF9fcm90YXRlKF9fYSwgNyk7CisgICAgX19hICs9IF9fbG9hZHdvcmQ8X1NpemU+KF9fcyArIDE2KTsKKyAgICBfU2l6ZSBfX3ZmID0gX19hICsgX196OworICAgIF9TaXplIF9fdnMgPSBfX2IgKyBfX3JvdGF0ZShfX2EsIDMxKSArIF9fYzsKKyAgICBfX2EgPSBfX2xvYWR3b3JkPF9TaXplPihfX3MgKyAxNikgKyBfX2xvYWR3b3JkPF9TaXplPihfX3MgKyBfX2xlbiAtIDMyKTsKKyAgICBfX3ogKz0gX19sb2Fkd29yZDxfU2l6ZT4oX19zICsgX19sZW4gLSA4KTsKKyAgICBfX2IgPSBfX3JvdGF0ZShfX2EgKyBfX3osIDUyKTsKKyAgICBfX2MgPSBfX3JvdGF0ZShfX2EsIDM3KTsKKyAgICBfX2EgKz0gX19sb2Fkd29yZDxfU2l6ZT4oX19zICsgX19sZW4gLSAyNCk7CisgICAgX19jICs9IF9fcm90YXRlKF9fYSwgNyk7CisgICAgX19hICs9IF9fbG9hZHdvcmQ8X1NpemU+KF9fcyArIF9fbGVuIC0gMTYpOworICAgIF9TaXplIF9fd2YgPSBfX2EgKyBfX3o7CisgICAgX1NpemUgX193cyA9IF9fYiArIF9fcm90YXRlKF9fYSwgMzEpICsgX19jOworICAgIF9TaXplIF9fciA9IF9fc2hpZnRfbWl4KChfX3ZmICsgX193cykgKiBfX2syICsgKF9fd2YgKyBfX3ZzKSAqIF9fazApOworICAgIHJldHVybiBfX3NoaWZ0X21peChfX3IgKiBfX2swICsgX192cykgKiBfX2syOworICB9Cit9OworCisvLyBjaXR5aGFzaDY0Cit0ZW1wbGF0ZSA8Y2xhc3MgX1NpemU+CitfU2l6ZQorX19tdXJtdXIyX29yX2NpdHloYXNoPF9TaXplLCA2ND46Om9wZXJhdG9yKCkoY29uc3Qgdm9pZCogX19rZXksIF9TaXplIF9fbGVuKQoreworICBjb25zdCBjaGFyKiBfX3MgPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oX19rZXkpOworICBpZiAoX19sZW4gPD0gMzIpIHsKKyAgICBpZiAoX19sZW4gPD0gMTYpIHsKKyAgICAgIHJldHVybiBfX2hhc2hfbGVuXzBfdG9fMTYoX19zLCBfX2xlbik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBfX2hhc2hfbGVuXzE3X3RvXzMyKF9fcywgX19sZW4pOworICAgIH0KKyAgfSBlbHNlIGlmIChfX2xlbiA8PSA2NCkgeworICAgIHJldHVybiBfX2hhc2hfbGVuXzMzX3RvXzY0KF9fcywgX19sZW4pOworICB9CisKKyAgLy8gRm9yIHN0cmluZ3Mgb3ZlciA2NCBieXRlcyB3ZSBoYXNoIHRoZSBlbmQgZmlyc3QsIGFuZCB0aGVuIGFzIHdlCisgIC8vIGxvb3Agd2Uga2VlcCA1NiBieXRlcyBvZiBzdGF0ZTogdiwgdywgeCwgeSwgYW5kIHouCisgIF9TaXplIF9feCA9IF9fbG9hZHdvcmQ8X1NpemU+KF9fcyArIF9fbGVuIC0gNDApOworICBfU2l6ZSBfX3kgPSBfX2xvYWR3b3JkPF9TaXplPihfX3MgKyBfX2xlbiAtIDE2KSArCisgICAgICAgICAgICAgIF9fbG9hZHdvcmQ8X1NpemU+KF9fcyArIF9fbGVuIC0gNTYpOworICBfU2l6ZSBfX3ogPSBfX2hhc2hfbGVuXzE2KF9fbG9hZHdvcmQ8X1NpemU+KF9fcyArIF9fbGVuIC0gNDgpICsgX19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbG9hZHdvcmQ8X1NpemU+KF9fcyArIF9fbGVuIC0gMjQpKTsKKyAgcGFpcjxfU2l6ZSwgX1NpemU+IF9fdiA9IF9fd2Vha19oYXNoX2xlbl8zMl93aXRoX3NlZWRzKF9fcyArIF9fbGVuIC0gNjQsIF9fbGVuLCBfX3opOworICBwYWlyPF9TaXplLCBfU2l6ZT4gX193ID0gX193ZWFrX2hhc2hfbGVuXzMyX3dpdGhfc2VlZHMoX19zICsgX19sZW4gLSAzMiwgX195ICsgX19rMSwgX194KTsKKyAgX194ID0gX194ICogX19rMSArIF9fbG9hZHdvcmQ8X1NpemU+KF9fcyk7CisKKyAgLy8gRGVjcmVhc2UgbGVuIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDY0LCBhbmQgb3BlcmF0ZSBvbiA2NC1ieXRlIGNodW5rcy4KKyAgX19sZW4gPSAoX19sZW4gLSAxKSAmIH5zdGF0aWNfY2FzdDxfU2l6ZT4oNjMpOworICBkbyB7CisgICAgX194ID0gX19yb3RhdGUoX194ICsgX195ICsgX192LmZpcnN0ICsgX19sb2Fkd29yZDxfU2l6ZT4oX19zICsgOCksIDM3KSAqIF9fazE7CisgICAgX195ID0gX19yb3RhdGUoX195ICsgX192LnNlY29uZCArIF9fbG9hZHdvcmQ8X1NpemU+KF9fcyArIDQ4KSwgNDIpICogX19rMTsKKyAgICBfX3ggXj0gX193LnNlY29uZDsKKyAgICBfX3kgKz0gX192LmZpcnN0ICsgX19sb2Fkd29yZDxfU2l6ZT4oX19zICsgNDApOworICAgIF9feiA9IF9fcm90YXRlKF9feiArIF9fdy5maXJzdCwgMzMpICogX19rMTsKKyAgICBfX3YgPSBfX3dlYWtfaGFzaF9sZW5fMzJfd2l0aF9zZWVkcyhfX3MsIF9fdi5zZWNvbmQgKiBfX2sxLCBfX3ggKyBfX3cuZmlyc3QpOworICAgIF9fdyA9IF9fd2Vha19oYXNoX2xlbl8zMl93aXRoX3NlZWRzKF9fcyArIDMyLCBfX3ogKyBfX3cuc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9feSArIF9fbG9hZHdvcmQ8X1NpemU+KF9fcyArIDE2KSk7CisgICAgc3RkOjpzd2FwKF9feiwgX194KTsKKyAgICBfX3MgKz0gNjQ7CisgICAgX19sZW4gLT0gNjQ7CisgIH0gd2hpbGUgKF9fbGVuICE9IDApOworICByZXR1cm4gX19oYXNoX2xlbl8xNigKKyAgICAgIF9faGFzaF9sZW5fMTYoX192LmZpcnN0LCBfX3cuZmlyc3QpICsgX19zaGlmdF9taXgoX195KSAqIF9fazEgKyBfX3osCisgICAgICBfX2hhc2hfbGVuXzE2KF9fdi5zZWNvbmQsIF9fdy5zZWNvbmQpICsgX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90ID0gc2l6ZW9mKF9UcCkgLyBzaXplb2Yoc2l6ZV90KT4KK3N0cnVjdCBfX3NjYWxhcl9oYXNoOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fc2NhbGFyX2hhc2g8X1RwLCAwPgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCwgc2l6ZV90PgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShfVHAgX192KSBjb25zdCBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIHVuaW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIF9UcCAgICBfX3Q7CisgICAgICAgICAgICBzaXplX3QgX19hOworICAgICAgICB9IF9fdTsKKyAgICAgICAgX191Ll9fYSA9IDA7CisgICAgICAgIF9fdS5fX3QgPSBfX3Y7CisgICAgICAgIHJldHVybiBfX3UuX19hOworICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19zY2FsYXJfaGFzaDxfVHAsIDE+CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLCBzaXplX3Q+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBvcGVyYXRvcigpKF9UcCBfX3YpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgdW5pb24KKyAgICAgICAgeworICAgICAgICAgICAgX1RwICAgIF9fdDsKKyAgICAgICAgICAgIHNpemVfdCBfX2E7CisgICAgICAgIH0gX191OworICAgICAgICBfX3UuX190ID0gX192OworICAgICAgICByZXR1cm4gX191Ll9fYTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fc2NhbGFyX2hhc2g8X1RwLCAyPgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCwgc2l6ZV90PgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShfVHAgX192KSBjb25zdCBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIHVuaW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIF9UcCBfX3Q7CisgICAgICAgICAgICBzdHJ1Y3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgX19hOworICAgICAgICAgICAgICAgIHNpemVfdCBfX2I7CisgICAgICAgICAgICB9IF9fczsKKyAgICAgICAgfSBfX3U7CisgICAgICAgIF9fdS5fX3QgPSBfX3Y7CisgICAgICAgIHJldHVybiBfX211cm11cjJfb3JfY2l0eWhhc2g8c2l6ZV90PigpKCZfX3UsIHNpemVvZihfX3UpKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fc2NhbGFyX2hhc2g8X1RwLCAzPgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCwgc2l6ZV90PgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShfVHAgX192KSBjb25zdCBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIHVuaW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIF9UcCBfX3Q7CisgICAgICAgICAgICBzdHJ1Y3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgX19hOworICAgICAgICAgICAgICAgIHNpemVfdCBfX2I7CisgICAgICAgICAgICAgICAgc2l6ZV90IF9fYzsKKyAgICAgICAgICAgIH0gX19zOworICAgICAgICB9IF9fdTsKKyAgICAgICAgX191Ll9fdCA9IF9fdjsKKyAgICAgICAgcmV0dXJuIF9fbXVybXVyMl9vcl9jaXR5aGFzaDxzaXplX3Q+KCkoJl9fdSwgc2l6ZW9mKF9fdSkpOworICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19zY2FsYXJfaGFzaDxfVHAsIDQ+CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLCBzaXplX3Q+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBvcGVyYXRvcigpKF9UcCBfX3YpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgdW5pb24KKyAgICAgICAgeworICAgICAgICAgICAgX1RwIF9fdDsKKyAgICAgICAgICAgIHN0cnVjdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemVfdCBfX2E7CisgICAgICAgICAgICAgICAgc2l6ZV90IF9fYjsKKyAgICAgICAgICAgICAgICBzaXplX3QgX19jOworICAgICAgICAgICAgICAgIHNpemVfdCBfX2Q7CisgICAgICAgICAgICB9IF9fczsKKyAgICAgICAgfSBfX3U7CisgICAgICAgIF9fdS5fX3QgPSBfX3Y7CisgICAgICAgIHJldHVybiBfX211cm11cjJfb3JfY2l0eWhhc2g8c2l6ZV90PigpKCZfX3UsIHNpemVvZihfX3UpKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgX1BhaXJUIHsKKyAgc2l6ZV90IGZpcnN0OworICBzaXplX3Qgc2Vjb25kOworfTsKKworX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW5saW5lIHNpemVfdCBfX2hhc2hfY29tYmluZShzaXplX3QgX19saHMsIHNpemVfdCBfX3JocykgX05PRVhDRVBUIHsKKyAgICB0eXBlZGVmIF9fc2NhbGFyX2hhc2g8X1BhaXJUPiBfSGFzaFQ7CisgICAgY29uc3QgX1BhaXJUIF9fcCA9IHtfX2xocywgX19yaHN9OworICAgIHJldHVybiBfSGFzaFQoKShfX3ApOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDxfVHAqPgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCosIHNpemVfdD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IG9wZXJhdG9yKCkoX1RwKiBfX3YpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgdW5pb24KKyAgICAgICAgeworICAgICAgICAgICAgX1RwKiBfX3Q7CisgICAgICAgICAgICBzaXplX3QgX19hOworICAgICAgICB9IF9fdTsKKyAgICAgICAgX191Ll9fdCA9IF9fdjsKKyAgICAgICAgcmV0dXJuIF9fbXVybXVyMl9vcl9jaXR5aGFzaDxzaXplX3Q+KCkoJl9fdSwgc2l6ZW9mKF9fdSkpOworICAgIH0KK307CisKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBoYXNoPGJvb2w+CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248Ym9vbCwgc2l6ZV90PgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShib29sIF9fdikgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX3YpO30KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDxjaGFyPgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGNoYXIsIHNpemVfdD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IG9wZXJhdG9yKCkoY2hhciBfX3YpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4oX192KTt9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc2g8c2lnbmVkIGNoYXI+CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248c2lnbmVkIGNoYXIsIHNpemVfdD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IG9wZXJhdG9yKCkoc2lnbmVkIGNoYXIgX192KSBjb25zdCBfTk9FWENFUFQge3JldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fdik7fQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBoYXNoPHVuc2lnbmVkIGNoYXI+CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dW5zaWduZWQgY2hhciwgc2l6ZV90PgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgb3BlcmF0b3IoKSh1bnNpZ25lZCBjaGFyIF9fdikgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX3YpO30KK307CisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fVU5JQ09ERV9DSEFSUworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc2g8Y2hhcjE2X3Q+CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248Y2hhcjE2X3QsIHNpemVfdD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IG9wZXJhdG9yKCkoY2hhcjE2X3QgX192KSBjb25zdCBfTk9FWENFUFQge3JldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fdik7fQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBoYXNoPGNoYXIzMl90PgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGNoYXIzMl90LCBzaXplX3Q+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBvcGVyYXRvcigpKGNoYXIzMl90IF9fdikgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX3YpO30KK307CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9IQVNfTk9fVU5JQ09ERV9DSEFSUworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc2g8d2NoYXJfdD4KKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx3Y2hhcl90LCBzaXplX3Q+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBvcGVyYXRvcigpKHdjaGFyX3QgX192KSBjb25zdCBfTk9FWENFUFQge3JldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fdik7fQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBoYXNoPHNob3J0PgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHNob3J0LCBzaXplX3Q+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBvcGVyYXRvcigpKHNob3J0IF9fdikgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX3YpO30KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDx1bnNpZ25lZCBzaG9ydD4KKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx1bnNpZ25lZCBzaG9ydCwgc2l6ZV90PgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgb3BlcmF0b3IoKSh1bnNpZ25lZCBzaG9ydCBfX3YpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4oX192KTt9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc2g8aW50PgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGludCwgc2l6ZV90PgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShpbnQgX192KSBjb25zdCBfTk9FWENFUFQge3JldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fdik7fQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBoYXNoPHVuc2lnbmVkIGludD4KKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx1bnNpZ25lZCBpbnQsIHNpemVfdD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IG9wZXJhdG9yKCkodW5zaWduZWQgaW50IF9fdikgY29uc3QgX05PRVhDRVBUIHtyZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX3YpO30KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDxsb25nPgorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGxvbmcsIHNpemVfdD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IG9wZXJhdG9yKCkobG9uZyBfX3YpIGNvbnN0IF9OT0VYQ0VQVCB7cmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4oX192KTt9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc2g8dW5zaWduZWQgbG9uZz4KKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx1bnNpZ25lZCBsb25nLCBzaXplX3Q+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBvcGVyYXRvcigpKHVuc2lnbmVkIGxvbmcgX192KSBjb25zdCBfTk9FWENFUFQge3JldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fdik7fQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBoYXNoPGxvbmcgbG9uZz4KKyAgICA6IHB1YmxpYyBfX3NjYWxhcl9oYXNoPGxvbmcgbG9uZz4KK3sKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDx1bnNpZ25lZCBsb25nIGxvbmc+CisgICAgOiBwdWJsaWMgX19zY2FsYXJfaGFzaDx1bnNpZ25lZCBsb25nIGxvbmc+Cit7Cit9OworCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0lOVDEyOAorCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc2g8X19pbnQxMjhfdD4KKyAgICA6IHB1YmxpYyBfX3NjYWxhcl9oYXNoPF9faW50MTI4X3Q+Cit7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc2g8X191aW50MTI4X3Q+CisgICAgOiBwdWJsaWMgX19zY2FsYXJfaGFzaDxfX3VpbnQxMjhfdD4KK3sKK307CisKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc2g8ZmxvYXQ+CisgICAgOiBwdWJsaWMgX19zY2FsYXJfaGFzaDxmbG9hdD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IG9wZXJhdG9yKCkoZmxvYXQgX192KSBjb25zdCBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIC8vIC0wLjAgYW5kIDAuMCBzaG91bGQgcmV0dXJuIHNhbWUgaGFzaAorICAgICAgIGlmIChfX3YgPT0gMCkKKyAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBfX3NjYWxhcl9oYXNoPGZsb2F0Pjo6b3BlcmF0b3IoKShfX3YpOworICAgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDxkb3VibGU+CisgICAgOiBwdWJsaWMgX19zY2FsYXJfaGFzaDxkb3VibGU+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBvcGVyYXRvcigpKGRvdWJsZSBfX3YpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgLy8gLTAuMCBhbmQgMC4wIHNob3VsZCByZXR1cm4gc2FtZSBoYXNoCisgICAgICAgaWYgKF9fdiA9PSAwKQorICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIF9fc2NhbGFyX2hhc2g8ZG91YmxlPjo6b3BlcmF0b3IoKShfX3YpOworICAgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDxsb25nIGRvdWJsZT4KKyAgICA6IHB1YmxpYyBfX3NjYWxhcl9oYXNoPGxvbmcgZG91YmxlPgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShsb25nIGRvdWJsZSBfX3YpIGNvbnN0IF9OT0VYQ0VQVAorICAgIHsKKyAgICAgICAgLy8gLTAuMCBhbmQgMC4wIHNob3VsZCByZXR1cm4gc2FtZSBoYXNoCisgICAgICAgIGlmIChfX3YgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworI2lmIGRlZmluZWQoX19pMzg2X18pCisgICAgICAgIC8vIFplcm8gb3V0IHBhZGRpbmcgYml0cworICAgICAgICB1bmlvbgorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGRvdWJsZSBfX3Q7CisgICAgICAgICAgICBzdHJ1Y3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgX19hOworICAgICAgICAgICAgICAgIHNpemVfdCBfX2I7CisgICAgICAgICAgICAgICAgc2l6ZV90IF9fYzsKKyAgICAgICAgICAgICAgICBzaXplX3QgX19kOworICAgICAgICAgICAgfSBfX3M7CisgICAgICAgIH0gX191OworICAgICAgICBfX3UuX19zLl9fYSA9IDA7CisgICAgICAgIF9fdS5fX3MuX19iID0gMDsKKyAgICAgICAgX191Ll9fcy5fX2MgPSAwOworICAgICAgICBfX3UuX19zLl9fZCA9IDA7CisgICAgICAgIF9fdS5fX3QgPSBfX3Y7CisgICAgICAgIHJldHVybiBfX3UuX19zLl9fYSBeIF9fdS5fX3MuX19iIF4gX191Ll9fcy5fX2MgXiBfX3UuX19zLl9fZDsKKyNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKKyAgICAgICAgLy8gWmVybyBvdXQgcGFkZGluZyBiaXRzCisgICAgICAgIHVuaW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgZG91YmxlIF9fdDsKKyAgICAgICAgICAgIHN0cnVjdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemVfdCBfX2E7CisgICAgICAgICAgICAgICAgc2l6ZV90IF9fYjsKKyAgICAgICAgICAgIH0gX19zOworICAgICAgICB9IF9fdTsKKyAgICAgICAgX191Ll9fcy5fX2EgPSAwOworICAgICAgICBfX3UuX19zLl9fYiA9IDA7CisgICAgICAgIF9fdS5fX3QgPSBfX3Y7CisgICAgICAgIHJldHVybiBfX3UuX19zLl9fYSBeIF9fdS5fX3MuX19iOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIF9fc2NhbGFyX2hhc2g8bG9uZyBkb3VibGU+OjpvcGVyYXRvcigpKF9fdik7CisjZW5kaWYKKyAgICB9Cit9OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgYm9vbCA9IGlzX2VudW08X1RwPjo6dmFsdWU+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgX19lbnVtX2hhc2gKKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsIHNpemVfdD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IG9wZXJhdG9yKCkoX1RwIF9fdikgY29uc3QgX05PRVhDRVBUCisgICAgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHVuZGVybHlpbmdfdHlwZTxfVHA+Ojp0eXBlIHR5cGU7CisgICAgICAgIHJldHVybiBoYXNoPHR5cGU+e30oc3RhdGljX2Nhc3Q8dHlwZT4oX192KSk7CisgICAgfQorfTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgX19lbnVtX2hhc2g8X1RwLCBmYWxzZT4geworICAgIF9fZW51bV9oYXNoKCkgPSBkZWxldGU7CisgICAgX19lbnVtX2hhc2goX19lbnVtX2hhc2ggY29uc3QmKSA9IGRlbGV0ZTsKKyAgICBfX2VudW1faGFzaCYgb3BlcmF0b3I9KF9fZW51bV9oYXNoIGNvbnN0JikgPSBkZWxldGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc2ggOiBwdWJsaWMgX19lbnVtX2hhc2g8X1RwPgoreworfTsKKyNlbmRpZgorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBoYXNoPG51bGxwdHJfdD4KKyAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248bnVsbHB0cl90LCBzaXplX3Q+Cit7CisgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgc2l6ZV90IG9wZXJhdG9yKCkobnVsbHB0cl90KSBjb25zdCBfTk9FWENFUFQgeworICAgIHJldHVybiA2NjI2MDcwMDR1bGw7CisgIH0KK307CisjZW5kaWYKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfSGFzaD4KK3VzaW5nIF9fY2hlY2tfaGFzaF9yZXF1aXJlbWVudHMgPSBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgIGlzX2NvcHlfY29uc3RydWN0aWJsZTxfSGFzaD46OnZhbHVlICYmCisgICAgaXNfbW92ZV9jb25zdHJ1Y3RpYmxlPF9IYXNoPjo6dmFsdWUgJiYKKyAgICBfX2ludm9rYWJsZV9yPHNpemVfdCwgX0hhc2gsIF9LZXkgY29uc3QmPjo6dmFsdWUKKz47CisKK3RlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfSGFzaCA9IHN0ZDo6aGFzaDxfS2V5PiA+Cit1c2luZyBfX2hhc19lbmFibGVkX2hhc2ggPSBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgIF9fY2hlY2tfaGFzaF9yZXF1aXJlbWVudHM8X0tleSwgX0hhc2g+Ojp2YWx1ZSAmJgorICAgIGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxfSGFzaD46OnZhbHVlCis+OworCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKK3RlbXBsYXRlIDxjbGFzcyBfVHlwZSwgY2xhc3M+Cit1c2luZyBfX2VuYWJsZV9oYXNoX2hlbHBlcl9pbXAgPSBfVHlwZTsKKwordGVtcGxhdGUgPGNsYXNzIF9UeXBlLCBjbGFzcyAuLi5fS2V5cz4KK3VzaW5nIF9fZW5hYmxlX2hhc2hfaGVscGVyID0gX19lbmFibGVfaGFzaF9oZWxwZXJfaW1wPF9UeXBlLAorICB0eXBlbmFtZSBlbmFibGVfaWY8X19hbGw8X19oYXNfZW5hYmxlZF9oYXNoPF9LZXlzPjo6dmFsdWUuLi4+Ojp2YWx1ZT46OnR5cGUKKz47CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIF9UeXBlLCBjbGFzcyAuLi4+Cit1c2luZyBfX2VuYWJsZV9oYXNoX2hlbHBlciA9IF9UeXBlOworI2VuZGlmCisKKyNlbmRpZiAvLyAhX0xJQkNQUF9DWFgwM19MQU5HCisKK19MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKKworI2VuZGlmICAvLyBfTElCQ1BQX1VUSUxJVFkKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS92YWxhcnJheSBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS92YWxhcnJheQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDM4OTJhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3ZhbGFycmF5CkBAIC0wLDAgKzEsNDkyNyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdmFsYXJyYXkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9WQUxBUlJBWQorI2RlZmluZSBfTElCQ1BQX1ZBTEFSUkFZCisKKy8qCisgICAgdmFsYXJyYXkgc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2xhc3MgdmFsYXJyYXkKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKKworICAgIC8vIGNvbnN0cnVjdC9kZXN0cm95OgorICAgIHZhbGFycmF5KCk7CisgICAgZXhwbGljaXQgdmFsYXJyYXkoc2l6ZV90IG4pOworICAgIHZhbGFycmF5KGNvbnN0IHZhbHVlX3R5cGUmIHgsIHNpemVfdCBuKTsKKyAgICB2YWxhcnJheShjb25zdCB2YWx1ZV90eXBlKiBweCwgc2l6ZV90IG4pOworICAgIHZhbGFycmF5KGNvbnN0IHZhbGFycmF5JiB2KTsKKyAgICB2YWxhcnJheSh2YWxhcnJheSYmIHYpIG5vZXhjZXB0OworICAgIHZhbGFycmF5KGNvbnN0IHNsaWNlX2FycmF5PHZhbHVlX3R5cGU+JiBzYSk7CisgICAgdmFsYXJyYXkoY29uc3QgZ3NsaWNlX2FycmF5PHZhbHVlX3R5cGU+JiBnYSk7CisgICAgdmFsYXJyYXkoY29uc3QgbWFza19hcnJheTx2YWx1ZV90eXBlPiYgbWEpOworICAgIHZhbGFycmF5KGNvbnN0IGluZGlyZWN0X2FycmF5PHZhbHVlX3R5cGU+JiBpYSk7CisgICAgdmFsYXJyYXkoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBpbCk7CisgICAgfnZhbGFycmF5KCk7CisKKyAgICAvLyBhc3NpZ25tZW50OgorICAgIHZhbGFycmF5JiBvcGVyYXRvcj0oY29uc3QgdmFsYXJyYXkmIHYpOworICAgIHZhbGFycmF5JiBvcGVyYXRvcj0odmFsYXJyYXkmJiB2KSBub2V4Y2VwdDsKKyAgICB2YWxhcnJheSYgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwpOworICAgIHZhbGFycmF5JiBvcGVyYXRvcj0oY29uc3QgdmFsdWVfdHlwZSYgeCk7CisgICAgdmFsYXJyYXkmIG9wZXJhdG9yPShjb25zdCBzbGljZV9hcnJheTx2YWx1ZV90eXBlPiYgc2EpOworICAgIHZhbGFycmF5JiBvcGVyYXRvcj0oY29uc3QgZ3NsaWNlX2FycmF5PHZhbHVlX3R5cGU+JiBnYSk7CisgICAgdmFsYXJyYXkmIG9wZXJhdG9yPShjb25zdCBtYXNrX2FycmF5PHZhbHVlX3R5cGU+JiBtYSk7CisgICAgdmFsYXJyYXkmIG9wZXJhdG9yPShjb25zdCBpbmRpcmVjdF9hcnJheTx2YWx1ZV90eXBlPiYgaWEpOworCisgICAgLy8gZWxlbWVudCBhY2Nlc3M6CisgICAgY29uc3QgdmFsdWVfdHlwZSYgb3BlcmF0b3JbXShzaXplX3QgaSkgY29uc3Q7CisgICAgdmFsdWVfdHlwZSYgICAgICAgb3BlcmF0b3JbXShzaXplX3QgaSk7CisKKyAgICAvLyBzdWJzZXQgb3BlcmF0aW9uczoKKyAgICB2YWxhcnJheSAgICAgICAgICAgICAgICAgICBvcGVyYXRvcltdKHNsaWNlIHMpIGNvbnN0OworICAgIHNsaWNlX2FycmF5PHZhbHVlX3R5cGU+ICAgIG9wZXJhdG9yW10oc2xpY2Ugcyk7CisgICAgdmFsYXJyYXkgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JbXShjb25zdCBnc2xpY2UmIGdzKSBjb25zdDsKKyAgICBnc2xpY2VfYXJyYXk8dmFsdWVfdHlwZT4gICBvcGVyYXRvcltdKGNvbnN0IGdzbGljZSYgZ3MpOworICAgIHZhbGFycmF5ICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yW10oY29uc3QgdmFsYXJyYXk8Ym9vbD4mIHZiKSBjb25zdDsKKyAgICBtYXNrX2FycmF5PHZhbHVlX3R5cGU+ICAgICBvcGVyYXRvcltdKGNvbnN0IHZhbGFycmF5PGJvb2w+JiB2Yik7CisgICAgdmFsYXJyYXkgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxzaXplX3Q+JiB2cykgY29uc3Q7CisgICAgaW5kaXJlY3RfYXJyYXk8dmFsdWVfdHlwZT4gb3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxzaXplX3Q+JiB2cyk7CisKKyAgICAvLyB1bmFyeSBvcGVyYXRvcnM6CisgICAgdmFsYXJyYXkgICAgICAgb3BlcmF0b3IrKCkgY29uc3Q7CisgICAgdmFsYXJyYXkgICAgICAgb3BlcmF0b3ItKCkgY29uc3Q7CisgICAgdmFsYXJyYXkgICAgICAgb3BlcmF0b3J+KCkgY29uc3Q7CisgICAgdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3IhKCkgY29uc3Q7CisKKyAgICAvLyBjb21wdXRlZCBhc3NpZ25tZW50OgorICAgIHZhbGFycmF5JiBvcGVyYXRvcio9IChjb25zdCB2YWx1ZV90eXBlJiB4KTsKKyAgICB2YWxhcnJheSYgb3BlcmF0b3IvPSAoY29uc3QgdmFsdWVfdHlwZSYgeCk7CisgICAgdmFsYXJyYXkmIG9wZXJhdG9yJT0gKGNvbnN0IHZhbHVlX3R5cGUmIHgpOworICAgIHZhbGFycmF5JiBvcGVyYXRvcis9IChjb25zdCB2YWx1ZV90eXBlJiB4KTsKKyAgICB2YWxhcnJheSYgb3BlcmF0b3ItPSAoY29uc3QgdmFsdWVfdHlwZSYgeCk7CisgICAgdmFsYXJyYXkmIG9wZXJhdG9yXj0gKGNvbnN0IHZhbHVlX3R5cGUmIHgpOworICAgIHZhbGFycmF5JiBvcGVyYXRvciY9IChjb25zdCB2YWx1ZV90eXBlJiB4KTsKKyAgICB2YWxhcnJheSYgb3BlcmF0b3J8PSAoY29uc3QgdmFsdWVfdHlwZSYgeCk7CisgICAgdmFsYXJyYXkmIG9wZXJhdG9yPDw9KGNvbnN0IHZhbHVlX3R5cGUmIHgpOworICAgIHZhbGFycmF5JiBvcGVyYXRvcj4+PShjb25zdCB2YWx1ZV90eXBlJiB4KTsKKworICAgIHZhbGFycmF5JiBvcGVyYXRvcio9IChjb25zdCB2YWxhcnJheSYgdik7CisgICAgdmFsYXJyYXkmIG9wZXJhdG9yLz0gKGNvbnN0IHZhbGFycmF5JiB2KTsKKyAgICB2YWxhcnJheSYgb3BlcmF0b3IlPSAoY29uc3QgdmFsYXJyYXkmIHYpOworICAgIHZhbGFycmF5JiBvcGVyYXRvcis9IChjb25zdCB2YWxhcnJheSYgdik7CisgICAgdmFsYXJyYXkmIG9wZXJhdG9yLT0gKGNvbnN0IHZhbGFycmF5JiB2KTsKKyAgICB2YWxhcnJheSYgb3BlcmF0b3JePSAoY29uc3QgdmFsYXJyYXkmIHYpOworICAgIHZhbGFycmF5JiBvcGVyYXRvcnw9IChjb25zdCB2YWxhcnJheSYgdik7CisgICAgdmFsYXJyYXkmIG9wZXJhdG9yJj0gKGNvbnN0IHZhbGFycmF5JiB2KTsKKyAgICB2YWxhcnJheSYgb3BlcmF0b3I8PD0oY29uc3QgdmFsYXJyYXkmIHYpOworICAgIHZhbGFycmF5JiBvcGVyYXRvcj4+PShjb25zdCB2YWxhcnJheSYgdik7CisKKyAgICAvLyBtZW1iZXIgZnVuY3Rpb25zOgorICAgIHZvaWQgc3dhcCh2YWxhcnJheSYgdikgbm9leGNlcHQ7CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworCisgICAgdmFsdWVfdHlwZSBzdW0oKSBjb25zdDsKKyAgICB2YWx1ZV90eXBlIG1pbigpIGNvbnN0OworICAgIHZhbHVlX3R5cGUgbWF4KCkgY29uc3Q7CisKKyAgICB2YWxhcnJheSBzaGlmdCAoaW50IGkpIGNvbnN0OworICAgIHZhbGFycmF5IGNzaGlmdChpbnQgaSkgY29uc3Q7CisgICAgdmFsYXJyYXkgYXBwbHkodmFsdWVfdHlwZSBmKHZhbHVlX3R5cGUpKSBjb25zdDsKKyAgICB2YWxhcnJheSBhcHBseSh2YWx1ZV90eXBlIGYoY29uc3QgdmFsdWVfdHlwZSYpKSBjb25zdDsKKyAgICB2b2lkIHJlc2l6ZShzaXplX3QgbiwgdmFsdWVfdHlwZSB4ID0gdmFsdWVfdHlwZSgpKTsKK307CisKK2NsYXNzIHNsaWNlCit7CitwdWJsaWM6CisgICAgc2xpY2UoKTsKKyAgICBzbGljZShzaXplX3Qgc3RhcnQsIHNpemVfdCBzaXplLCBzaXplX3Qgc3RyaWRlKTsKKworICAgIHNpemVfdCBzdGFydCgpICBjb25zdDsKKyAgICBzaXplX3Qgc2l6ZSgpICAgY29uc3Q7CisgICAgc2l6ZV90IHN0cmlkZSgpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBzbGljZV9hcnJheQoreworcHVibGljOgorICAgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOworCisgICAgY29uc3Qgc2xpY2VfYXJyYXkmIG9wZXJhdG9yPShjb25zdCBzbGljZV9hcnJheSYgc2EpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3I9ICAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3IqPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3IvPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3IlPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3IrPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3ItPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3JePSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3ImPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3J8PSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3I8PD0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3I+Pj0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdmFsdWVfdHlwZSYgeCkgY29uc3Q7CisKKyAgICBzbGljZV9hcnJheSgpID0gZGVsZXRlOworfTsKKworY2xhc3MgZ3NsaWNlCit7CitwdWJsaWM6CisgICAgZ3NsaWNlKCk7CisgICAgZ3NsaWNlKHNpemVfdCBzdGFydCwgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBzdHJpZGUpOworCisgICAgc2l6ZV90ICAgICAgICAgICBzdGFydCgpICBjb25zdDsKKyAgICB2YWxhcnJheTxzaXplX3Q+IHNpemUoKSAgIGNvbnN0OworICAgIHZhbGFycmF5PHNpemVfdD4gc3RyaWRlKCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NsYXNzIGdzbGljZV9hcnJheQoreworcHVibGljOgorICAgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOworCisgICAgdm9pZCBvcGVyYXRvcj0gIChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvcio9IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvci89IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvciU9IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvcis9IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvci09IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvcl49IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvciY9IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvcnw9IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvcjw8PShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvcj4+PShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisKKyAgICBnc2xpY2VfYXJyYXkoY29uc3QgZ3NsaWNlX2FycmF5JiBnYSk7CisgICAgfmdzbGljZV9hcnJheSgpOworICAgIGNvbnN0IGdzbGljZV9hcnJheSYgb3BlcmF0b3I9KGNvbnN0IGdzbGljZV9hcnJheSYgZ2EpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHZhbHVlX3R5cGUmIHgpIGNvbnN0OworCisgICAgZ3NsaWNlX2FycmF5KCkgPSBkZWxldGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NsYXNzIG1hc2tfYXJyYXkKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKKworICAgIHZvaWQgb3BlcmF0b3I9ICAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3IqPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3IvPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3IlPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3IrPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3ItPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3JePSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3ImPSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3J8PSAoY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3I8PD0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3I+Pj0oY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIHYpIGNvbnN0OworCisgICAgbWFza19hcnJheShjb25zdCBtYXNrX2FycmF5JiBtYSk7CisgICAgfm1hc2tfYXJyYXkoKTsKKyAgICBjb25zdCBtYXNrX2FycmF5JiBvcGVyYXRvcj0oY29uc3QgbWFza19hcnJheSYgbWEpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHZhbHVlX3R5cGUmIHgpIGNvbnN0OworCisgICAgbWFza19hcnJheSgpID0gZGVsZXRlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBpbmRpcmVjdF9hcnJheQoreworcHVibGljOgorICAgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOworCisgICAgdm9pZCBvcGVyYXRvcj0gIChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvcio9IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvci89IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvciU9IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvcis9IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvci09IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvcl49IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvciY9IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvcnw9IChjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvcjw8PShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvcj4+PShjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgdikgY29uc3Q7CisKKyAgICBpbmRpcmVjdF9hcnJheShjb25zdCBpbmRpcmVjdF9hcnJheSYgaWEpOworICAgIH5pbmRpcmVjdF9hcnJheSgpOworICAgIGNvbnN0IGluZGlyZWN0X2FycmF5JiBvcGVyYXRvcj0oY29uc3QgaW5kaXJlY3RfYXJyYXkmIGlhKSBjb25zdDsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCB2YWx1ZV90eXBlJiB4KSBjb25zdDsKKworICAgIGluZGlyZWN0X2FycmF5KCkgPSBkZWxldGU7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIHN3YXAodmFsYXJyYXk8VD4mIHgsIHZhbGFycmF5PFQ+JiB5KSBub2V4Y2VwdDsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3IqIChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3IqIChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBvcGVyYXRvciogKGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3IvIChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3IvIChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBvcGVyYXRvci8gKGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3IlIChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3IlIChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBvcGVyYXRvciUgKGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3IrIChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3IrIChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBvcGVyYXRvcisgKGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3ItIChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3ItIChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBvcGVyYXRvci0gKGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3JeIChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3JeIChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBvcGVyYXRvcl4gKGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3ImIChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3ImIChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBvcGVyYXRvciYgKGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3J8IChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3J8IChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBvcGVyYXRvcnwgKGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3I8PChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3I8PChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBvcGVyYXRvcjw8KGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3I+Pihjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gb3BlcmF0b3I+Pihjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBvcGVyYXRvcj4+KGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3ImJihjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3ImJihjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxib29sPiBvcGVyYXRvciYmKGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3J8fChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3J8fChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxib29sPiBvcGVyYXRvcnx8KGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3I9PShjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3I9PShjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxib29sPiBvcGVyYXRvcj09KGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3IhPShjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3IhPShjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxib29sPiBvcGVyYXRvciE9KGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3I8IChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3I8IChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxib29sPiBvcGVyYXRvcjwgKGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3I+IChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3I+IChjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxib29sPiBvcGVyYXRvcj4gKGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3I8PShjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3I8PShjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxib29sPiBvcGVyYXRvcjw9KGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3I+PShjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgdmFsYXJyYXk8VD4mIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3I+PShjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxib29sPiBvcGVyYXRvcj49KGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gYWJzIChjb25zdCB2YWxhcnJheTxUPiYgeCk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBhY29zIChjb25zdCB2YWxhcnJheTxUPiYgeCk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBhc2luIChjb25zdCB2YWxhcnJheTxUPiYgeCk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBhdGFuIChjb25zdCB2YWxhcnJheTxUPiYgeCk7CisKK3RlbXBsYXRlPGNsYXNzIFQ+IHZhbGFycmF5PFQ+IGF0YW4yKGNvbnN0IHZhbGFycmF5PFQ+JiB4LCBjb25zdCB2YWxhcnJheTxUPiYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBhdGFuMihjb25zdCB2YWxhcnJheTxUPiYgeCwgY29uc3QgVCYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBhdGFuMihjb25zdCBUJiB4LCBjb25zdCB2YWxhcnJheTxUPiYgeSk7CisKK3RlbXBsYXRlPGNsYXNzIFQ+IHZhbGFycmF5PFQ+IGNvcyAoY29uc3QgdmFsYXJyYXk8VD4mIHgpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gY29zaCAoY29uc3QgdmFsYXJyYXk8VD4mIHgpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gZXhwIChjb25zdCB2YWxhcnJheTxUPiYgeCk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBsb2cgKGNvbnN0IHZhbGFycmF5PFQ+JiB4KTsKK3RlbXBsYXRlPGNsYXNzIFQ+IHZhbGFycmF5PFQ+IGxvZzEwKGNvbnN0IHZhbGFycmF5PFQ+JiB4KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gcG93KGNvbnN0IHZhbGFycmF5PFQ+JiB4LCBjb25zdCB2YWxhcnJheTxUPiYgeSk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBwb3coY29uc3QgdmFsYXJyYXk8VD4mIHgsIGNvbnN0IFQmIHkpOwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gcG93KGNvbnN0IFQmIHgsIGNvbnN0IHZhbGFycmF5PFQ+JiB5KTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gdmFsYXJyYXk8VD4gc2luIChjb25zdCB2YWxhcnJheTxUPiYgeCk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBzaW5oIChjb25zdCB2YWxhcnJheTxUPiYgeCk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiBzcXJ0IChjb25zdCB2YWxhcnJheTxUPiYgeCk7Cit0ZW1wbGF0ZTxjbGFzcyBUPiB2YWxhcnJheTxUPiB0YW4gKGNvbnN0IHZhbGFycmF5PFQ+JiB4KTsKK3RlbXBsYXRlPGNsYXNzIFQ+IHZhbGFycmF5PFQ+IHRhbmggKGNvbnN0IHZhbGFycmF5PFQ+JiB4KTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IHVuc3BlY2lmaWVkMSBiZWdpbih2YWxhcnJheTxUPiYgdik7Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gdW5zcGVjaWZpZWQyIGJlZ2luKGNvbnN0IHZhbGFycmF5PFQ+JiB2KTsKK3RlbXBsYXRlIDxjbGFzcyBUPiB1bnNwZWNpZmllZDEgZW5kKHZhbGFycmF5PFQ+JiB2KTsKK3RlbXBsYXRlIDxjbGFzcyBUPiB1bnNwZWNpZmllZDIgZW5kKGNvbnN0IHZhbGFycmF5PFQ+JiB2KTsKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bmV3PgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworX0xJQkNQUF9QVVNIX01BQ1JPUworI2luY2x1ZGUgPF9fdW5kZWZfbWFjcm9zPgorCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCit0ZW1wbGF0ZTxjbGFzcyBfVHA+IGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIHZhbGFycmF5OworCitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBzbGljZQoreworICAgIHNpemVfdCBfX3N0YXJ0XzsKKyAgICBzaXplX3QgX19zaXplXzsKKyAgICBzaXplX3QgX19zdHJpZGVfOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzbGljZSgpCisgICAgICAgIDogX19zdGFydF8oMCksCisgICAgICAgICAgX19zaXplXygwKSwKKyAgICAgICAgICBfX3N0cmlkZV8oMCkKKyAgICAgICAgICB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNsaWNlKHNpemVfdCBfX3N0YXJ0LCBzaXplX3QgX19zaXplLCBzaXplX3QgX19zdHJpZGUpCisgICAgICAgIDogX19zdGFydF8oX19zdGFydCksCisgICAgICAgICAgX19zaXplXyhfX3NpemUpLAorICAgICAgICAgIF9fc3RyaWRlXyhfX3N0cmlkZSkKKyAgICAgICAgICB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzaXplX3Qgc3RhcnQoKSAgY29uc3Qge3JldHVybiBfX3N0YXJ0Xzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzaXplX3Qgc2l6ZSgpICAgY29uc3Qge3JldHVybiBfX3NpemVfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHNpemVfdCBzdHJpZGUoKSBjb25zdCB7cmV0dXJuIF9fc3RyaWRlXzt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBzbGljZV9hcnJheTsKK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgZ3NsaWNlOwordGVtcGxhdGUgPGNsYXNzIF9UcD4gY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgZ3NsaWNlX2FycmF5OwordGVtcGxhdGUgPGNsYXNzIF9UcD4gY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgbWFza19hcnJheTsKK3RlbXBsYXRlIDxjbGFzcyBfVHA+IGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGluZGlyZWN0X2FycmF5OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwKgorYmVnaW4odmFsYXJyYXk8X1RwPiYgX192KTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0IF9UcCoKK2JlZ2luKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdik7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfVHAqCitlbmQodmFsYXJyYXk8X1RwPiYgX192KTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0IF9UcCoKK2VuZChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YpOworCit0ZW1wbGF0ZSA8Y2xhc3MgX09wLCBjbGFzcyBfQTA+CitzdHJ1Y3QgX1VuYXJ5T3AKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9PcDo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQTA6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKworICAgIF9PcCBfX29wXzsKKyAgICBfQTAgX19hMF87CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1VuYXJ5T3AoY29uc3QgX09wJiBfX29wLCBjb25zdCBfQTAmIF9fYTApIDogX19vcF8oX19vcCksIF9fYTBfKF9fYTApIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3JbXShzaXplX3QgX19pKSBjb25zdCB7cmV0dXJuIF9fb3BfKF9fYTBfW19faV0pO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHtyZXR1cm4gX19hMF8uc2l6ZSgpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfT3AsIGNsYXNzIF9BMCwgY2xhc3MgX0ExPgorc3RydWN0IF9CaW5hcnlPcAoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX09wOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BMDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgX09wIF9fb3BfOworICAgIF9BMCBfX2EwXzsKKyAgICBfQTEgX19hMV87CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX0JpbmFyeU9wKGNvbnN0IF9PcCYgX19vcCwgY29uc3QgX0EwJiBfX2EwLCBjb25zdCBfQTEmIF9fYTEpCisgICAgICAgIDogX19vcF8oX19vcCksIF9fYTBfKF9fYTApLCBfX2ExXyhfX2ExKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZhbHVlX3R5cGUgb3BlcmF0b3JbXShzaXplX3QgX19pKSBjb25zdCB7cmV0dXJuIF9fb3BfKF9fYTBfW19faV0sIF9fYTFfW19faV0pO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHtyZXR1cm4gX19hMF8uc2l6ZSgpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitjbGFzcyBfX3NjYWxhcl9leHByCit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBjb25zdCBfVHAmIHJlc3VsdF90eXBlOworcHJpdmF0ZToKKyAgICBjb25zdCB2YWx1ZV90eXBlJiBfX3RfOworICAgIHNpemVfdCBfX3NfOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX3NjYWxhcl9leHByKGNvbnN0IHZhbHVlX3R5cGUmIF9fdCwgc2l6ZV90IF9fcykgOiBfX3RfKF9fdCksIF9fc18oX19zKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yW10oc2l6ZV90KSBjb25zdCB7cmV0dXJuIF9fdF87fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBzaXplKCkgY29uc3Qge3JldHVybiBfX3NfO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX191bmFyeV9wbHVzIDogdW5hcnlfZnVuY3Rpb248X1RwLCBfVHA+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBjb25zdAorICAgICAgICB7cmV0dXJuICtfX3g7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2JpdF9ub3QgIDogdW5hcnlfZnVuY3Rpb248X1RwLCBfVHA+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBjb25zdAorICAgICAgICB7cmV0dXJuIH5fX3g7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2JpdF9zaGlmdF9sZWZ0IDogYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBfVHA+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgICAge3JldHVybiBfX3ggPDwgX195O30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19iaXRfc2hpZnRfcmlnaHQgOiBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIF9feCA+PiBfX3k7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0ZwPgorc3RydWN0IF9fYXBwbHlfZXhwciAgIDogdW5hcnlfZnVuY3Rpb248X1RwLCBfVHA+Cit7Citwcml2YXRlOgorICAgIF9GcCBfX2ZfOworcHVibGljOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBleHBsaWNpdCBfX2FwcGx5X2V4cHIoX0ZwIF9fZikgOiBfX2ZfKF9fZikge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCkgY29uc3QKKyAgICAgICAge3JldHVybiBfX2ZfKF9feCk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2Fic19leHByIDogdW5hcnlfZnVuY3Rpb248X1RwLCBfVHA+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBjb25zdAorICAgICAgICB7cmV0dXJuIGFicyhfX3gpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19hY29zX2V4cHIgOiB1bmFyeV9mdW5jdGlvbjxfVHAsIF9UcD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gYWNvcyhfX3gpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19hc2luX2V4cHIgOiB1bmFyeV9mdW5jdGlvbjxfVHAsIF9UcD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gYXNpbihfX3gpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19hdGFuX2V4cHIgOiB1bmFyeV9mdW5jdGlvbjxfVHAsIF9UcD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gYXRhbihfX3gpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19hdGFuMl9leHByIDogYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBfVHA+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgICAge3JldHVybiBhdGFuMihfX3gsIF9feSk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2Nvc19leHByIDogdW5hcnlfZnVuY3Rpb248X1RwLCBfVHA+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBjb25zdAorICAgICAgICB7cmV0dXJuIGNvcyhfX3gpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19jb3NoX2V4cHIgOiB1bmFyeV9mdW5jdGlvbjxfVHAsIF9UcD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gY29zaChfX3gpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19leHBfZXhwciA6IHVuYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwPgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCkgY29uc3QKKyAgICAgICAge3JldHVybiBleHAoX194KTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fbG9nX2V4cHIgOiB1bmFyeV9mdW5jdGlvbjxfVHAsIF9UcD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gbG9nKF9feCk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2xvZzEwX2V4cHIgOiB1bmFyeV9mdW5jdGlvbjxfVHAsIF9UcD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gbG9nMTAoX194KTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fcG93X2V4cHIgOiBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgICB7cmV0dXJuIHBvdyhfX3gsIF9feSk7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfX3Npbl9leHByIDogdW5hcnlfZnVuY3Rpb248X1RwLCBfVHA+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBjb25zdAorICAgICAgICB7cmV0dXJuIHNpbihfX3gpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19zaW5oX2V4cHIgOiB1bmFyeV9mdW5jdGlvbjxfVHAsIF9UcD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gc2luaChfX3gpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX19zcXJ0X2V4cHIgOiB1bmFyeV9mdW5jdGlvbjxfVHAsIF9UcD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gc3FydChfX3gpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX190YW5fZXhwciA6IHVuYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwPgoreworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCkgY29uc3QKKyAgICAgICAge3JldHVybiB0YW4oX194KTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9fdGFuaF9leHByIDogdW5hcnlfZnVuY3Rpb248X1RwLCBfVHA+Cit7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBjb25zdAorICAgICAgICB7cmV0dXJuIHRhbmgoX194KTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbEV4cHI+CitjbGFzcyBfX3NsaWNlX2V4cHIKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1ZhbEV4cHI+Ojp0eXBlICBfUm1FeHByOworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JtRXhwcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdmFsdWVfdHlwZSByZXN1bHRfdHlwZTsKKworcHJpdmF0ZToKKyAgICBfVmFsRXhwciBfX2V4cHJfOworICAgIHNpemVfdCBfX3N0YXJ0XzsKKyAgICBzaXplX3QgX19zaXplXzsKKyAgICBzaXplX3QgX19zdHJpZGVfOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fc2xpY2VfZXhwcihjb25zdCBzbGljZSYgX19zbCwgY29uc3QgX1JtRXhwciYgX19lKQorICAgICAgICA6IF9fZXhwcl8oX19lKSwKKyAgICAgICAgICBfX3N0YXJ0XyhfX3NsLnN0YXJ0KCkpLAorICAgICAgICAgIF9fc2l6ZV8oX19zbC5zaXplKCkpLAorICAgICAgICAgIF9fc3RyaWRlXyhfX3NsLnN0cmlkZSgpKQorICAgICAgICB7fQorcHVibGljOgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yW10oc2l6ZV90IF9faSkgY29uc3QKKyAgICAgICAge3JldHVybiBfX2V4cHJfW19fc3RhcnRfICsgX19pICogX19zdHJpZGVfXTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7cmV0dXJuIF9fc2l6ZV87fQorCisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdmFsYXJyYXk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbEV4cHI+CitjbGFzcyBfX21hc2tfZXhwcjsKKwordGVtcGxhdGUgPGNsYXNzIF9WYWxFeHByPgorY2xhc3MgX19pbmRpcmVjdF9leHByOworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbEV4cHI+CitjbGFzcyBfX3NoaWZ0X2V4cHIKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1ZhbEV4cHI+Ojp0eXBlICBfUm1FeHByOworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JtRXhwcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdmFsdWVfdHlwZSByZXN1bHRfdHlwZTsKKworcHJpdmF0ZToKKyAgICBfVmFsRXhwciBfX2V4cHJfOworICAgIHNpemVfdCBfX3NpemVfOworICAgIHB0cmRpZmZfdCBfX3VsXzsKKyAgICBwdHJkaWZmX3QgX19zbl87CisgICAgcHRyZGlmZl90IF9fbl87CisgICAgc3RhdGljIGNvbnN0IHB0cmRpZmZfdCBfTnAgPSBzdGF0aWNfY2FzdDxwdHJkaWZmX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHB0cmRpZmZfdCkgKiBfX0NIQVJfQklUX18gLSAxKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3NoaWZ0X2V4cHIoaW50IF9fbiwgY29uc3QgX1JtRXhwciYgX19lKQorICAgICAgICA6IF9fZXhwcl8oX19lKSwKKyAgICAgICAgICBfX3NpemVfKF9fZS5zaXplKCkpLAorICAgICAgICAgIF9fbl8oX19uKQorICAgICAgICB7CisgICAgICAgICAgICBwdHJkaWZmX3QgX19uZWdfbiA9IHN0YXRpY19jYXN0PHB0cmRpZmZfdD4oX19uXyA+PiBfTnApOworICAgICAgICAgICAgX19zbl8gPSBfX25lZ19uIHwgc3RhdGljX2Nhc3Q8cHRyZGlmZl90PihzdGF0aWNfY2FzdDxzaXplX3Q+KC1fX25fKSA+PiBfTnApOworICAgICAgICAgICAgX191bF8gPSAoKF9fc2l6ZV8gLSBfX25fKSAmIH5fX25lZ19uKSB8ICgoX19uXyArIDEpICYgX19uZWdfbik7CisgICAgICAgIH0KK3B1YmxpYzoKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBvcGVyYXRvcltdKHNpemVfdCBfX2opIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHB0cmRpZmZfdCBfX2kgPSBzdGF0aWNfY2FzdDxwdHJkaWZmX3Q+KF9faik7CisgICAgICAgICAgICBwdHJkaWZmX3QgX19tID0gKF9fc25fICogX19pIC0gX191bF8pID4+IF9OcDsKKyAgICAgICAgICAgIHJldHVybiAoX19leHByX1soX19pICsgX19uXykgJiBfX21dICYgX19tKSB8ICh2YWx1ZV90eXBlKCkgJiB+X19tKTsKKyAgICAgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBzaXplKCkgY29uc3Qge3JldHVybiBfX3NpemVfO30KKworICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIF9fdmFsX2V4cHI7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbEV4cHI+CitjbGFzcyBfX2NzaGlmdF9leHByCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9WYWxFeHByPjo6dHlwZSAgX1JtRXhwcjsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9SbUV4cHI6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUgcmVzdWx0X3R5cGU7CisKK3ByaXZhdGU6CisgICAgX1ZhbEV4cHIgX19leHByXzsKKyAgICBzaXplX3QgX19zaXplXzsKKyAgICBzaXplX3QgX19tXzsKKyAgICBzaXplX3QgX19vMV87CisgICAgc2l6ZV90IF9fbzJfOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fY3NoaWZ0X2V4cHIoaW50IF9fbiwgY29uc3QgX1JtRXhwciYgX19lKQorICAgICAgICA6IF9fZXhwcl8oX19lKSwKKyAgICAgICAgICBfX3NpemVfKF9fZS5zaXplKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fbiAlPSBzdGF0aWNfY2FzdDxpbnQ+KF9fc2l6ZV8pOworICAgICAgICAgICAgaWYgKF9fbiA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fbV8gPSBfX3NpemVfIC0gX19uOworICAgICAgICAgICAgICAgIF9fbzFfID0gX19uOworICAgICAgICAgICAgICAgIF9fbzJfID0gX19uIC0gX19zaXplXzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX21fID0gLV9fbjsKKyAgICAgICAgICAgICAgICBfX28xXyA9IF9fbiArIF9fc2l6ZV87CisgICAgICAgICAgICAgICAgX19vMl8gPSBfX247CisgICAgICAgICAgICB9CisgICAgICAgIH0KK3B1YmxpYzoKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBvcGVyYXRvcltdKHNpemVfdCBfX2kpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX2kgPCBfX21fKQorICAgICAgICAgICAgICAgIHJldHVybiBfX2V4cHJfW19faSArIF9fbzFfXTsKKyAgICAgICAgICAgIHJldHVybiBfX2V4cHJfW19faSArIF9fbzJfXTsKKyAgICAgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBzaXplKCkgY29uc3Qge3JldHVybiBfX3NpemVfO30KKworICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIF9fdmFsX2V4cHI7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfVmFsRXhwcj4KK2NsYXNzIF9fdmFsX2V4cHI7CisKK3RlbXBsYXRlPGNsYXNzIF9WYWxFeHByPgorc3RydWN0IF9faXNfdmFsX2V4cHIgOiBmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZTxjbGFzcyBfVmFsRXhwcj4KK3N0cnVjdCBfX2lzX3ZhbF9leHByPF9fdmFsX2V4cHI8X1ZhbEV4cHI+ID4gOiB0cnVlX3R5cGUge307CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK3N0cnVjdCBfX2lzX3ZhbF9leHByPHZhbGFycmF5PF9UcD4gPiA6IHRydWVfdHlwZSB7fTsKKwordGVtcGxhdGU8Y2xhc3MgX1RwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdmFsYXJyYXkKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX1RwIHJlc3VsdF90eXBlOworCitwcml2YXRlOgorICAgIHZhbHVlX3R5cGUqIF9fYmVnaW5fOworICAgIHZhbHVlX3R5cGUqIF9fZW5kXzsKKworcHVibGljOgorICAgIC8vIGNvbnN0cnVjdC9kZXN0cm95OgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2YWxhcnJheSgpIDogX19iZWdpbl8oMCksIF9fZW5kXygwKSB7fQorICAgIGlubGluZSBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IHZhbGFycmF5KHNpemVfdCBfX24pOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2YWxhcnJheShjb25zdCB2YWx1ZV90eXBlJiBfX3gsIHNpemVfdCBfX24pOworICAgIHZhbGFycmF5KGNvbnN0IHZhbHVlX3R5cGUqIF9fcCwgc2l6ZV90IF9fbik7CisgICAgdmFsYXJyYXkoY29uc3QgdmFsYXJyYXkmIF9fdik7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2YWxhcnJheSh2YWxhcnJheSYmIF9fdikgX05PRVhDRVBUOworICAgIHZhbGFycmF5KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCk7CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIHZhbGFycmF5KGNvbnN0IHNsaWNlX2FycmF5PHZhbHVlX3R5cGU+JiBfX3NhKTsKKyAgICB2YWxhcnJheShjb25zdCBnc2xpY2VfYXJyYXk8dmFsdWVfdHlwZT4mIF9fZ2EpOworICAgIHZhbGFycmF5KGNvbnN0IG1hc2tfYXJyYXk8dmFsdWVfdHlwZT4mIF9fbWEpOworICAgIHZhbGFycmF5KGNvbnN0IGluZGlyZWN0X2FycmF5PHZhbHVlX3R5cGU+JiBfX2lhKTsKKyAgICBpbmxpbmUgX0xJQkNQUF9FWFRFUk5fVEVNUExBVEVfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB+dmFsYXJyYXkoKTsKKworICAgIC8vIGFzc2lnbm1lbnQ6CisgICAgdmFsYXJyYXkmIG9wZXJhdG9yPShjb25zdCB2YWxhcnJheSYgX192KTsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZhbGFycmF5JiBvcGVyYXRvcj0odmFsYXJyYXkmJiBfX3YpIF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmFsYXJyYXkmIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+KTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZhbGFycmF5JiBvcGVyYXRvcj0oY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmFsYXJyYXkmIG9wZXJhdG9yPShjb25zdCBzbGljZV9hcnJheTx2YWx1ZV90eXBlPiYgX19zYSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZhbGFycmF5JiBvcGVyYXRvcj0oY29uc3QgZ3NsaWNlX2FycmF5PHZhbHVlX3R5cGU+JiBfX2dhKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmFsYXJyYXkmIG9wZXJhdG9yPShjb25zdCBtYXNrX2FycmF5PHZhbHVlX3R5cGU+JiBfX21hKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmFsYXJyYXkmIG9wZXJhdG9yPShjb25zdCBpbmRpcmVjdF9hcnJheTx2YWx1ZV90eXBlPiYgX19pYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9WYWxFeHByPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgICAgIHZhbGFycmF5JiBvcGVyYXRvcj0oY29uc3QgX192YWxfZXhwcjxfVmFsRXhwcj4mIF9fdik7CisKKyAgICAvLyBlbGVtZW50IGFjY2VzczoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgdmFsdWVfdHlwZSYgb3BlcmF0b3JbXShzaXplX3QgX19pKSBjb25zdCB7cmV0dXJuIF9fYmVnaW5fW19faV07fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZhbHVlX3R5cGUmICAgICAgIG9wZXJhdG9yW10oc2l6ZV90IF9faSkgICAgICAge3JldHVybiBfX2JlZ2luX1tfX2ldO30KKworICAgIC8vIHN1YnNldCBvcGVyYXRpb25zOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3ZhbF9leHByPF9fc2xpY2VfZXhwcjxjb25zdCB2YWxhcnJheSY+ID4gICAgb3BlcmF0b3JbXShzbGljZSBfX3MpIGNvbnN0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzbGljZV9hcnJheTx2YWx1ZV90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JbXShzbGljZSBfX3MpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3ZhbF9leHByPF9faW5kaXJlY3RfZXhwcjxjb25zdCB2YWxhcnJheSY+ID4gb3BlcmF0b3JbXShjb25zdCBnc2xpY2UmIF9fZ3MpIGNvbnN0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBnc2xpY2VfYXJyYXk8dmFsdWVfdHlwZT4gICBvcGVyYXRvcltdKGNvbnN0IGdzbGljZSYgX19ncyk7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3ZhbF9leHByPF9faW5kaXJlY3RfZXhwcjxjb25zdCB2YWxhcnJheSY+ID4gb3BlcmF0b3JbXShnc2xpY2UmJiBfX2dzKSBjb25zdDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZ3NsaWNlX2FycmF5PHZhbHVlX3R5cGU+ICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yW10oZ3NsaWNlJiYgX19ncyk7CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3ZhbF9leHByPF9fbWFza19leHByPGNvbnN0IHZhbGFycmF5Jj4gPiAgICAgb3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxib29sPiYgX192YikgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG1hc2tfYXJyYXk8dmFsdWVfdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcltdKGNvbnN0IHZhbGFycmF5PGJvb2w+JiBfX3ZiKTsKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fdmFsX2V4cHI8X19tYXNrX2V4cHI8Y29uc3QgdmFsYXJyYXkmPiA+ICAgICBvcGVyYXRvcltdKHZhbGFycmF5PGJvb2w+JiYgX192YikgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG1hc2tfYXJyYXk8dmFsdWVfdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcltdKHZhbGFycmF5PGJvb2w+JiYgX192Yik7CisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3ZhbF9leHByPF9faW5kaXJlY3RfZXhwcjxjb25zdCB2YWxhcnJheSY+ID4gb3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX3ZzKSBjb25zdDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaW5kaXJlY3RfYXJyYXk8dmFsdWVfdHlwZT4gICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yW10oY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX192cyk7CisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3ZhbF9leHByPF9faW5kaXJlY3RfZXhwcjxjb25zdCB2YWxhcnJheSY+ID4gb3BlcmF0b3JbXSh2YWxhcnJheTxzaXplX3Q+JiYgX192cykgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGluZGlyZWN0X2FycmF5PHZhbHVlX3R5cGU+ICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcltdKHZhbGFycmF5PHNpemVfdD4mJiBfX3ZzKTsKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICAvLyB1bmFyeSBvcGVyYXRvcnM6CisgICAgdmFsYXJyYXkgICAgICAgb3BlcmF0b3IrKCkgY29uc3Q7CisgICAgdmFsYXJyYXkgICAgICAgb3BlcmF0b3ItKCkgY29uc3Q7CisgICAgdmFsYXJyYXkgICAgICAgb3BlcmF0b3J+KCkgY29uc3Q7CisgICAgdmFsYXJyYXk8Ym9vbD4gb3BlcmF0b3IhKCkgY29uc3Q7CisKKyAgICAvLyBjb21wdXRlZCBhc3NpZ25tZW50OgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2YWxhcnJheSYgb3BlcmF0b3IqPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmFsYXJyYXkmIG9wZXJhdG9yLz0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZhbGFycmF5JiBvcGVyYXRvciU9IChjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2YWxhcnJheSYgb3BlcmF0b3IrPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmFsYXJyYXkmIG9wZXJhdG9yLT0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZhbGFycmF5JiBvcGVyYXRvcl49IChjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2YWxhcnJheSYgb3BlcmF0b3ImPSAoY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmFsYXJyYXkmIG9wZXJhdG9yfD0gKGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZhbGFycmF5JiBvcGVyYXRvcjw8PShjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2YWxhcnJheSYgb3BlcmF0b3I+Pj0oY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdmFsYXJyYXkmCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvcio9IChjb25zdCBfRXhwciYgX192KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdmFsYXJyYXkmCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvci89IChjb25zdCBfRXhwciYgX192KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdmFsYXJyYXkmCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvciU9IChjb25zdCBfRXhwciYgX192KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdmFsYXJyYXkmCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvcis9IChjb25zdCBfRXhwciYgX192KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdmFsYXJyYXkmCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvci09IChjb25zdCBfRXhwciYgX192KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdmFsYXJyYXkmCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvcl49IChjb25zdCBfRXhwciYgX192KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdmFsYXJyYXkmCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvcnw9IChjb25zdCBfRXhwciYgX192KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdmFsYXJyYXkmCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvciY9IChjb25zdCBfRXhwciYgX192KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdmFsYXJyYXkmCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvcjw8PSAoY29uc3QgX0V4cHImIF9fdik7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CisgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgPAorICAgICAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgICAgIHZhbGFycmF5JgorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3I+Pj0gKGNvbnN0IF9FeHByJiBfX3YpOworCisgICAgLy8gbWVtYmVyIGZ1bmN0aW9uczoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBzd2FwKHZhbGFycmF5JiBfX3YpIF9OT0VYQ0VQVDsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHtyZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX2VuZF8gLSBfX2JlZ2luXyk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZhbHVlX3R5cGUgc3VtKCkgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZhbHVlX3R5cGUgbWluKCkgY29uc3Q7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZhbHVlX3R5cGUgbWF4KCkgY29uc3Q7CisKKyAgICB2YWxhcnJheSBzaGlmdCAoaW50IF9faSkgY29uc3Q7CisgICAgdmFsYXJyYXkgY3NoaWZ0KGludCBfX2kpIGNvbnN0OworICAgIHZhbGFycmF5IGFwcGx5KHZhbHVlX3R5cGUgX19mKHZhbHVlX3R5cGUpKSBjb25zdDsKKyAgICB2YWxhcnJheSBhcHBseSh2YWx1ZV90eXBlIF9fZihjb25zdCB2YWx1ZV90eXBlJikpIGNvbnN0OworICAgIHZvaWQgICAgIHJlc2l6ZShzaXplX3QgX19uLCB2YWx1ZV90eXBlIF9feCA9IHZhbHVlX3R5cGUoKSk7CisKK3ByaXZhdGU6CisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdmFsYXJyYXk7CisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgc2xpY2VfYXJyYXk7CisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgZ3NsaWNlX2FycmF5OworICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIG1hc2tfYXJyYXk7CisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgX19tYXNrX2V4cHI7CisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgaW5kaXJlY3RfYXJyYXk7CisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgX19pbmRpcmVjdF9leHByOworICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIF9fdmFsX2V4cHI7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPgorICAgIGZyaWVuZAorICAgIF9VcCoKKyAgICBiZWdpbih2YWxhcnJheTxfVXA+JiBfX3YpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgICBmcmllbmQKKyAgICBjb25zdCBfVXAqCisgICAgYmVnaW4oY29uc3QgdmFsYXJyYXk8X1VwPiYgX192KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfVXA+CisgICAgZnJpZW5kCisgICAgX1VwKgorICAgIGVuZCh2YWxhcnJheTxfVXA+JiBfX3YpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4KKyAgICBmcmllbmQKKyAgICBjb25zdCBfVXAqCisgICAgZW5kKGNvbnN0IHZhbGFycmF5PF9VcD4mIF9fdik7CisKKyAgICB2b2lkIF9fY2xlYXIoKTsKKyAgICB2YWxhcnJheSYgX19hc3NpZ25fcmFuZ2UoY29uc3QgdmFsdWVfdHlwZSogX19mLCBjb25zdCB2YWx1ZV90eXBlKiBfX2wpOworfTsKKworX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoX0xJQkNQUF9GVU5DX1ZJUyB2YWxhcnJheTxzaXplX3Q+Ojp2YWxhcnJheShzaXplX3QpKQorX0xJQkNQUF9FWFRFUk5fVEVNUExBVEUoX0xJQkNQUF9GVU5DX1ZJUyB2YWxhcnJheTxzaXplX3Q+Ojp+dmFsYXJyYXkoKSkKK19MSUJDUFBfRVhURVJOX1RFTVBMQVRFKF9MSUJDUFBfRlVOQ19WSVMgdm9pZCB2YWxhcnJheTxzaXplX3Q+OjpyZXNpemUoc2l6ZV90LCBzaXplX3QpKQorCit0ZW1wbGF0ZSA8Y2xhc3MgX09wLCBjbGFzcyBfVHA+CitzdHJ1Y3QgX1VuYXJ5T3A8X09wLCB2YWxhcnJheTxfVHA+ID4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9PcDo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7CisgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKworICAgIF9PcCBfX29wXzsKKyAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX2EwXzsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfVW5hcnlPcChjb25zdCBfT3AmIF9fb3AsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fYTApIDogX19vcF8oX19vcCksIF9fYTBfKF9fYTApIHt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3JbXShzaXplX3QgX19pKSBjb25zdCB7cmV0dXJuIF9fb3BfKF9fYTBfW19faV0pO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHtyZXR1cm4gX19hMF8uc2l6ZSgpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfT3AsIGNsYXNzIF9UcCwgY2xhc3MgX0ExPgorc3RydWN0IF9CaW5hcnlPcDxfT3AsIHZhbGFycmF5PF9UcD4sIF9BMT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9PcDo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7CisgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKworICAgIF9PcCBfX29wXzsKKyAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX2EwXzsKKyAgICBfQTEgX19hMV87CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX0JpbmFyeU9wKGNvbnN0IF9PcCYgX19vcCwgY29uc3QgdmFsYXJyYXk8X1RwPiYgX19hMCwgY29uc3QgX0ExJiBfX2ExKQorICAgICAgICA6IF9fb3BfKF9fb3ApLCBfX2EwXyhfX2EwKSwgX19hMV8oX19hMSkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2YWx1ZV90eXBlIG9wZXJhdG9yW10oc2l6ZV90IF9faSkgY29uc3Qge3JldHVybiBfX29wXyhfX2EwX1tfX2ldLCBfX2ExX1tfX2ldKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7cmV0dXJuIF9fYTBfLnNpemUoKTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX09wLCBjbGFzcyBfQTAsIGNsYXNzIF9UcD4KK3N0cnVjdCBfQmluYXJ5T3A8X09wLCBfQTAsIHZhbGFycmF5PF9UcD4gPgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX09wOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKKyAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworCisgICAgX09wIF9fb3BfOworICAgIF9BMCBfX2EwXzsKKyAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX2ExXzsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfQmluYXJ5T3AoY29uc3QgX09wJiBfX29wLCBjb25zdCBfQTAmIF9fYTAsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fYTEpCisgICAgICAgIDogX19vcF8oX19vcCksIF9fYTBfKF9fYTApLCBfX2ExXyhfX2ExKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZhbHVlX3R5cGUgb3BlcmF0b3JbXShzaXplX3QgX19pKSBjb25zdCB7cmV0dXJuIF9fb3BfKF9fYTBfW19faV0sIF9fYTFfW19faV0pO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHtyZXR1cm4gX19hMF8uc2l6ZSgpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfT3AsIGNsYXNzIF9UcD4KK3N0cnVjdCBfQmluYXJ5T3A8X09wLCB2YWxhcnJheTxfVHA+LCB2YWxhcnJheTxfVHA+ID4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9PcDo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7CisgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKworICAgIF9PcCBfX29wXzsKKyAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX2EwXzsKKyAgICBjb25zdCB2YWxhcnJheTxfVHA+JiBfX2ExXzsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfQmluYXJ5T3AoY29uc3QgX09wJiBfX29wLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX2EwLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX2ExKQorICAgICAgICA6IF9fb3BfKF9fb3ApLCBfX2EwXyhfX2EwKSwgX19hMV8oX19hMSkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2YWx1ZV90eXBlIG9wZXJhdG9yW10oc2l6ZV90IF9faSkgY29uc3Qge3JldHVybiBfX29wXyhfX2EwX1tfX2ldLCBfX2ExX1tfX2ldKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7cmV0dXJuIF9fYTBfLnNpemUoKTt9Cit9OworCisvLyBzbGljZV9hcnJheQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgc2xpY2VfYXJyYXkKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworCitwcml2YXRlOgorICAgIHZhbHVlX3R5cGUqIF9fdnBfOworICAgIHNpemVfdCBfX3NpemVfOworICAgIHNpemVfdCBfX3N0cmlkZV87CisKK3B1YmxpYzoKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CisgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgPAorICAgICAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgICAgIHZvaWQKKyAgICA+Ojp0eXBlCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG9wZXJhdG9yPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3IqPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3IvPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3IlPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3IrPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3ItPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3JePShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3ImPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3J8PShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3I8PD0oY29uc3QgX0V4cHImIF9fdikgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CisgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgPAorICAgICAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgICAgIHZvaWQKKyAgICA+Ojp0eXBlCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG9wZXJhdG9yPj49KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IHNsaWNlX2FycmF5JiBvcGVyYXRvcj0oY29uc3Qgc2xpY2VfYXJyYXkmIF9fc2EpIGNvbnN0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNsaWNlX2FycmF5KGNvbnN0IHNsaWNlJiBfX3NsLCBjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX192KQorICAgICAgICA6IF9fdnBfKGNvbnN0X2Nhc3Q8dmFsdWVfdHlwZSo+KF9fdi5fX2JlZ2luXyArIF9fc2wuc3RhcnQoKSkpLAorICAgICAgICAgIF9fc2l6ZV8oX19zbC5zaXplKCkpLAorICAgICAgICAgIF9fc3RyaWRlXyhfX3NsLnN0cmlkZSgpKQorICAgICAgICB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgdmFsYXJyYXk7CisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3Mgc2xpY2VFeHByOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZQorY29uc3Qgc2xpY2VfYXJyYXk8X1RwPiYKK3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBzbGljZV9hcnJheSYgX19zYSkgY29uc3QKK3sKKyAgICB2YWx1ZV90eXBlKiBfX3QgPSBfX3ZwXzsKKyAgICBjb25zdCB2YWx1ZV90eXBlKiBfX3MgPSBfX3NhLl9fdnBfOworICAgIGZvciAoc2l6ZV90IF9fbiA9IF9fc2l6ZV87IF9fbjsgLS1fX24sIF9fdCArPSBfX3N0cmlkZV8sIF9fcyArPSBfX3NhLl9fc3RyaWRlXykKKyAgICAgICAgKl9fdCA9ICpfX3M7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9FeHByPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQorc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0Cit7CisgICAgdmFsdWVfdHlwZSogX190ID0gX192cF87CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19zaXplXzsgKytfX2ksIF9fdCArPSBfX3N0cmlkZV8pCisgICAgICAgICpfX3QgPSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yKj0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICB2YWx1ZV90eXBlKiBfX3QgPSBfX3ZwXzsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3NpemVfOyArK19faSwgX190ICs9IF9fc3RyaWRlXykKKyAgICAgICAgKl9fdCAqPSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yLz0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICB2YWx1ZV90eXBlKiBfX3QgPSBfX3ZwXzsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3NpemVfOyArK19faSwgX190ICs9IF9fc3RyaWRlXykKKyAgICAgICAgKl9fdCAvPSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yJT0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICB2YWx1ZV90eXBlKiBfX3QgPSBfX3ZwXzsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3NpemVfOyArK19faSwgX190ICs9IF9fc3RyaWRlXykKKyAgICAgICAgKl9fdCAlPSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yKz0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICB2YWx1ZV90eXBlKiBfX3QgPSBfX3ZwXzsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3NpemVfOyArK19faSwgX190ICs9IF9fc3RyaWRlXykKKyAgICAgICAgKl9fdCArPSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yLT0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICB2YWx1ZV90eXBlKiBfX3QgPSBfX3ZwXzsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3NpemVfOyArK19faSwgX190ICs9IF9fc3RyaWRlXykKKyAgICAgICAgKl9fdCAtPSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yXj0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICB2YWx1ZV90eXBlKiBfX3QgPSBfX3ZwXzsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3NpemVfOyArK19faSwgX190ICs9IF9fc3RyaWRlXykKKyAgICAgICAgKl9fdCBePSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yJj0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICB2YWx1ZV90eXBlKiBfX3QgPSBfX3ZwXzsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3NpemVfOyArK19faSwgX190ICs9IF9fc3RyaWRlXykKKyAgICAgICAgKl9fdCAmPSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yfD0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICB2YWx1ZV90eXBlKiBfX3QgPSBfX3ZwXzsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3NpemVfOyArK19faSwgX190ICs9IF9fc3RyaWRlXykKKyAgICAgICAgKl9fdCB8PSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yPDw9KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0Cit7CisgICAgdmFsdWVfdHlwZSogX190ID0gX192cF87CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19zaXplXzsgKytfX2ksIF9fdCArPSBfX3N0cmlkZV8pCisgICAgICAgICpfX3QgPDw9IF9fdltfX2ldOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9FeHByPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQorc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3I+Pj0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICB2YWx1ZV90eXBlKiBfX3QgPSBfX3ZwXzsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3NpemVfOyArK19faSwgX190ICs9IF9fc3RyaWRlXykKKyAgICAgICAgKl9fdCA+Pj0gX192W19faV07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK3ZvaWQKK3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCB2YWx1ZV90eXBlJiBfX3gpIGNvbnN0Cit7CisgICAgdmFsdWVfdHlwZSogX190ID0gX192cF87CisgICAgZm9yIChzaXplX3QgX19uID0gX19zaXplXzsgX19uOyAtLV9fbiwgX190ICs9IF9fc3RyaWRlXykKKyAgICAgICAgKl9fdCA9IF9feDsKK30KKworLy8gZ3NsaWNlCisKK2NsYXNzIF9MSUJDUFBfVFlQRV9WSVMgZ3NsaWNlCit7CisgICAgdmFsYXJyYXk8c2l6ZV90PiBfX3NpemVfOworICAgIHZhbGFycmF5PHNpemVfdD4gX19zdHJpZGVfOworICAgIHZhbGFycmF5PHNpemVfdD4gX18xZF87CisKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZ3NsaWNlKCkge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBnc2xpY2Uoc2l6ZV90IF9fc3RhcnQsIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9fc3RyaWRlKQorICAgICAgICA6IF9fc2l6ZV8oX19zaXplKSwKKyAgICAgICAgICBfX3N0cmlkZV8oX19zdHJpZGUpCisgICAgICAgIHtfX2luaXQoX19zdGFydCk7fQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGdzbGljZShzaXplX3QgX19zdGFydCwgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgIF9fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGFycmF5PHNpemVfdD4mJiBfX3N0cmlkZSkKKyAgICAgICAgOiBfX3NpemVfKF9fc2l6ZSksCisgICAgICAgICAgX19zdHJpZGVfKG1vdmUoX19zdHJpZGUpKQorICAgICAgICB7X19pbml0KF9fc3RhcnQpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBnc2xpY2Uoc2l6ZV90IF9fc3RhcnQsICAgICAgIHZhbGFycmF5PHNpemVfdD4mJiBfX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiAgX19zdHJpZGUpCisgICAgICAgIDogX19zaXplXyhtb3ZlKF9fc2l6ZSkpLAorICAgICAgICAgIF9fc3RyaWRlXyhfX3N0cmlkZSkKKyAgICAgICAge19faW5pdChfX3N0YXJ0KTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgZ3NsaWNlKHNpemVfdCBfX3N0YXJ0LCAgICAgICB2YWxhcnJheTxzaXplX3Q+JiYgX19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsYXJyYXk8c2l6ZV90PiYmIF9fc3RyaWRlKQorICAgICAgICA6IF9fc2l6ZV8obW92ZShfX3NpemUpKSwKKyAgICAgICAgICBfX3N0cmlkZV8obW92ZShfX3N0cmlkZSkpCisgICAgICAgIHtfX2luaXQoX19zdGFydCk7fQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCisvLyAgZ3NsaWNlKGNvbnN0IGdzbGljZSYpICAgICAgICAgICAgPSBkZWZhdWx0OworLy8gIGdzbGljZShnc2xpY2UmJikgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKy8vICBnc2xpY2UmIG9wZXJhdG9yPShjb25zdCBnc2xpY2UmKSA9IGRlZmF1bHQ7CisvLyAgZ3NsaWNlJiBvcGVyYXRvcj0oZ3NsaWNlJiYpICAgICAgPSBkZWZhdWx0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCAgICAgICAgICAgc3RhcnQoKSAgY29uc3Qge3JldHVybiBfXzFkXy5zaXplKCkgPyBfXzFkX1swXSA6IDA7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZhbGFycmF5PHNpemVfdD4gc2l6ZSgpICAgY29uc3Qge3JldHVybiBfX3NpemVfO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2YWxhcnJheTxzaXplX3Q+IHN0cmlkZSgpIGNvbnN0IHtyZXR1cm4gX19zdHJpZGVfO30KKworcHJpdmF0ZToKKyAgICB2b2lkIF9faW5pdChzaXplX3QgX19zdGFydCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3M+IGZyaWVuZCBjbGFzcyBnc2xpY2VfYXJyYXk7CisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgdmFsYXJyYXk7CisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgX192YWxfZXhwcjsKK307CisKKy8vIGdzbGljZV9hcnJheQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgZ3NsaWNlX2FycmF5Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKworcHJpdmF0ZToKKyAgICB2YWx1ZV90eXBlKiAgICAgIF9fdnBfOworICAgIHZhbGFycmF5PHNpemVfdD4gX18xZF87CisKK3B1YmxpYzoKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CisgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgPAorICAgICAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgICAgIHZvaWQKKyAgICA+Ojp0eXBlCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG9wZXJhdG9yPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3IqPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3IvPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3IlPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3IrPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3ItPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3JePShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3ImPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3J8PShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3I8PD0oY29uc3QgX0V4cHImIF9fdikgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CisgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgPAorICAgICAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgICAgIHZvaWQKKyAgICA+Ojp0eXBlCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG9wZXJhdG9yPj49KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IGdzbGljZV9hcnJheSYgb3BlcmF0b3I9KGNvbnN0IGdzbGljZV9hcnJheSYgX19nYSkgY29uc3Q7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdmFsdWVfdHlwZSYgX194KSBjb25zdDsKKworLy8gIGdzbGljZV9hcnJheShjb25zdCBnc2xpY2VfYXJyYXkmKSAgICAgICAgICAgID0gZGVmYXVsdDsKKy8vICBnc2xpY2VfYXJyYXkoZ3NsaWNlX2FycmF5JiYpICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisvLyAgZ3NsaWNlX2FycmF5JiBvcGVyYXRvcj0oY29uc3QgZ3NsaWNlX2FycmF5JikgPSBkZWZhdWx0OworLy8gIGdzbGljZV9hcnJheSYgb3BlcmF0b3I9KGdzbGljZV9hcnJheSYmKSAgICAgID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBnc2xpY2VfYXJyYXkoY29uc3QgZ3NsaWNlJiBfX2dzLCBjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX192KQorICAgICAgICA6IF9fdnBfKGNvbnN0X2Nhc3Q8dmFsdWVfdHlwZSo+KF9fdi5fX2JlZ2luXykpLAorICAgICAgICAgIF9fMWRfKF9fZ3MuX18xZF8pCisgICAgICAgIHt9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgZ3NsaWNlX2FycmF5KGdzbGljZSYmIF9fZ3MsIGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3YpCisgICAgICAgIDogX192cF8oY29uc3RfY2FzdDx2YWx1ZV90eXBlKj4oX192Ll9fYmVnaW5fKSksCisgICAgICAgICAgX18xZF8obW92ZShfX2dzLl9fMWRfKSkKKyAgICAgICAge30KKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3M+IGZyaWVuZCBjbGFzcyB2YWxhcnJheTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICB2b2lkCis+Ojp0eXBlCitnc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0Cit7CisgICAgdHlwZWRlZiBjb25zdCBzaXplX3QqIF9JcDsKKyAgICBzaXplX3QgX19qID0gMDsKKyAgICBmb3IgKF9JcCBfX2kgPSBfXzFkXy5fX2JlZ2luXywgX19lID0gX18xZF8uX19lbmRfOyBfX2kgIT0gX19lOyArK19faSwgKytfX2opCisgICAgICAgIF9fdnBfWypfX2ldID0gX192W19fal07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICB2b2lkCis+Ojp0eXBlCitnc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3IqPShjb25zdCBfRXhwciYgX192KSBjb25zdAoreworICAgIHR5cGVkZWYgY29uc3Qgc2l6ZV90KiBfSXA7CisgICAgc2l6ZV90IF9faiA9IDA7CisgICAgZm9yIChfSXAgX19pID0gX18xZF8uX19iZWdpbl8sIF9fZSA9IF9fMWRfLl9fZW5kXzsgX19pICE9IF9fZTsgKytfX2ksICsrX19qKQorICAgICAgICBfX3ZwX1sqX19pXSAqPSBfX3ZbX19qXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK2dzbGljZV9hcnJheTxfVHA+OjpvcGVyYXRvci89KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0Cit7CisgICAgdHlwZWRlZiBjb25zdCBzaXplX3QqIF9JcDsKKyAgICBzaXplX3QgX19qID0gMDsKKyAgICBmb3IgKF9JcCBfX2kgPSBfXzFkXy5fX2JlZ2luXywgX19lID0gX18xZF8uX19lbmRfOyBfX2kgIT0gX19lOyArK19faSwgKytfX2opCisgICAgICAgIF9fdnBfWypfX2ldIC89IF9fdltfX2pdOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9FeHByPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQorZ3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yJT0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICB0eXBlZGVmIGNvbnN0IHNpemVfdCogX0lwOworICAgIHNpemVfdCBfX2ogPSAwOworICAgIGZvciAoX0lwIF9faSA9IF9fMWRfLl9fYmVnaW5fLCBfX2UgPSBfXzFkXy5fX2VuZF87IF9faSAhPSBfX2U7ICsrX19pLCArK19faikKKyAgICAgICAgX192cF9bKl9faV0gJT0gX192W19fal07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICB2b2lkCis+Ojp0eXBlCitnc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3IrPShjb25zdCBfRXhwciYgX192KSBjb25zdAoreworICAgIHR5cGVkZWYgY29uc3Qgc2l6ZV90KiBfSXA7CisgICAgc2l6ZV90IF9faiA9IDA7CisgICAgZm9yIChfSXAgX19pID0gX18xZF8uX19iZWdpbl8sIF9fZSA9IF9fMWRfLl9fZW5kXzsgX19pICE9IF9fZTsgKytfX2ksICsrX19qKQorICAgICAgICBfX3ZwX1sqX19pXSArPSBfX3ZbX19qXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK2dzbGljZV9hcnJheTxfVHA+OjpvcGVyYXRvci09KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0Cit7CisgICAgdHlwZWRlZiBjb25zdCBzaXplX3QqIF9JcDsKKyAgICBzaXplX3QgX19qID0gMDsKKyAgICBmb3IgKF9JcCBfX2kgPSBfXzFkXy5fX2JlZ2luXywgX19lID0gX18xZF8uX19lbmRfOyBfX2kgIT0gX19lOyArK19faSwgKytfX2opCisgICAgICAgIF9fdnBfWypfX2ldIC09IF9fdltfX2pdOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9FeHByPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQorZ3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yXj0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICB0eXBlZGVmIGNvbnN0IHNpemVfdCogX0lwOworICAgIHNpemVfdCBfX2ogPSAwOworICAgIGZvciAoX0lwIF9faSA9IF9fMWRfLl9fYmVnaW5fLCBfX2UgPSBfXzFkXy5fX2VuZF87IF9faSAhPSBfX2U7ICsrX19pLCArK19faikKKyAgICAgICAgX192cF9bKl9faV0gXj0gX192W19fal07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICB2b2lkCis+Ojp0eXBlCitnc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3ImPShjb25zdCBfRXhwciYgX192KSBjb25zdAoreworICAgIHR5cGVkZWYgY29uc3Qgc2l6ZV90KiBfSXA7CisgICAgc2l6ZV90IF9faiA9IDA7CisgICAgZm9yIChfSXAgX19pID0gX18xZF8uX19iZWdpbl8sIF9fZSA9IF9fMWRfLl9fZW5kXzsgX19pICE9IF9fZTsgKytfX2ksICsrX19qKQorICAgICAgICBfX3ZwX1sqX19pXSAmPSBfX3ZbX19qXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK2dzbGljZV9hcnJheTxfVHA+OjpvcGVyYXRvcnw9KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0Cit7CisgICAgdHlwZWRlZiBjb25zdCBzaXplX3QqIF9JcDsKKyAgICBzaXplX3QgX19qID0gMDsKKyAgICBmb3IgKF9JcCBfX2kgPSBfXzFkXy5fX2JlZ2luXywgX19lID0gX18xZF8uX19lbmRfOyBfX2kgIT0gX19lOyArK19faSwgKytfX2opCisgICAgICAgIF9fdnBfWypfX2ldIHw9IF9fdltfX2pdOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9FeHByPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQorZ3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yPDw9KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0Cit7CisgICAgdHlwZWRlZiBjb25zdCBzaXplX3QqIF9JcDsKKyAgICBzaXplX3QgX19qID0gMDsKKyAgICBmb3IgKF9JcCBfX2kgPSBfXzFkXy5fX2JlZ2luXywgX19lID0gX18xZF8uX19lbmRfOyBfX2kgIT0gX19lOyArK19faSwgKytfX2opCisgICAgICAgIF9fdnBfWypfX2ldIDw8PSBfX3ZbX19qXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK2dzbGljZV9hcnJheTxfVHA+OjpvcGVyYXRvcj4+PShjb25zdCBfRXhwciYgX192KSBjb25zdAoreworICAgIHR5cGVkZWYgY29uc3Qgc2l6ZV90KiBfSXA7CisgICAgc2l6ZV90IF9faiA9IDA7CisgICAgZm9yIChfSXAgX19pID0gX18xZF8uX19iZWdpbl8sIF9fZSA9IF9fMWRfLl9fZW5kXzsgX19pICE9IF9fZTsgKytfX2ksICsrX19qKQorICAgICAgICBfX3ZwX1sqX19pXSA+Pj0gX192W19fal07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK2NvbnN0IGdzbGljZV9hcnJheTxfVHA+JgorZ3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBnc2xpY2VfYXJyYXkmIF9fZ2EpIGNvbnN0Cit7CisgICAgdHlwZWRlZiBjb25zdCBzaXplX3QqIF9JcDsKKyAgICBjb25zdCB2YWx1ZV90eXBlKiBfX3MgPSBfX2dhLl9fdnBfOworICAgIGZvciAoX0lwIF9faSA9IF9fMWRfLl9fYmVnaW5fLCBfX2UgPSBfXzFkXy5fX2VuZF8sIF9faiA9IF9fZ2EuX18xZF8uX19iZWdpbl87CisgICAgICAgICAgICBfX2kgIT0gX19lOyArK19faSwgKytfX2opCisgICAgICAgIF9fdnBfWypfX2ldID0gX19zWypfX2pdOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZQordm9pZAorZ3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCB2YWx1ZV90eXBlJiBfX3gpIGNvbnN0Cit7CisgICAgdHlwZWRlZiBjb25zdCBzaXplX3QqIF9JcDsKKyAgICBmb3IgKF9JcCBfX2kgPSBfXzFkXy5fX2JlZ2luXywgX19lID0gX18xZF8uX19lbmRfOyBfX2kgIT0gX19lOyArK19faSkKKyAgICAgICAgX192cF9bKl9faV0gPSBfX3g7Cit9CisKKy8vIG1hc2tfYXJyYXkKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIG1hc2tfYXJyYXkKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworCitwcml2YXRlOgorICAgIHZhbHVlX3R5cGUqICAgICAgX192cF87CisgICAgdmFsYXJyYXk8c2l6ZV90PiBfXzFkXzsKKworcHVibGljOgorICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3I9KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9FeHByPgorICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgIDwKKyAgICAgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgICAgICB2b2lkCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvcio9KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9FeHByPgorICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgIDwKKyAgICAgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgICAgICB2b2lkCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvci89KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9FeHByPgorICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgIDwKKyAgICAgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgICAgICB2b2lkCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvciU9KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9FeHByPgorICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgIDwKKyAgICAgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgICAgICB2b2lkCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvcis9KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9FeHByPgorICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgIDwKKyAgICAgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgICAgICB2b2lkCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvci09KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9FeHByPgorICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgIDwKKyAgICAgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgICAgICB2b2lkCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvcl49KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9FeHByPgorICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgIDwKKyAgICAgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgICAgICB2b2lkCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvciY9KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9FeHByPgorICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgIDwKKyAgICAgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgICAgICB2b2lkCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvcnw9KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPGNsYXNzIF9FeHByPgorICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgIDwKKyAgICAgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgICAgICB2b2lkCisgICAgPjo6dHlwZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBvcGVyYXRvcjw8PShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3I+Pj0oY29uc3QgX0V4cHImIF9fdikgY29uc3Q7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgbWFza19hcnJheSYgb3BlcmF0b3I9KGNvbnN0IG1hc2tfYXJyYXkmIF9fbWEpIGNvbnN0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgY29uc3Q7CisKKy8vICBtYXNrX2FycmF5KGNvbnN0IG1hc2tfYXJyYXkmKSAgICAgICAgICAgID0gZGVmYXVsdDsKKy8vICBtYXNrX2FycmF5KG1hc2tfYXJyYXkmJikgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKy8vICBtYXNrX2FycmF5JiBvcGVyYXRvcj0oY29uc3QgbWFza19hcnJheSYpID0gZGVmYXVsdDsKKy8vICBtYXNrX2FycmF5JiBvcGVyYXRvcj0obWFza19hcnJheSYmKSAgICAgID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgbWFza19hcnJheShjb25zdCB2YWxhcnJheTxib29sPiYgX192YiwgY29uc3QgdmFsYXJyYXk8dmFsdWVfdHlwZT4mIF9fdikKKyAgICAgICAgOiBfX3ZwXyhjb25zdF9jYXN0PHZhbHVlX3R5cGUqPihfX3YuX19iZWdpbl8pKSwKKyAgICAgICAgICBfXzFkXyhzdGF0aWNfY2FzdDxzaXplX3Q+KGNvdW50KF9fdmIuX19iZWdpbl8sIF9fdmIuX19lbmRfLCB0cnVlKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgICBzaXplX3QgX19qID0gMDsKKyAgICAgICAgICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX192Yi5zaXplKCk7ICsrX19pKQorICAgICAgICAgICAgICAgICAgaWYgKF9fdmJbX19pXSkKKyAgICAgICAgICAgICAgICAgICAgICBfXzFkX1tfX2orK10gPSBfX2k7CisgICAgICAgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgdmFsYXJyYXk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9FeHByPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQorbWFza19hcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICBzaXplX3QgX19uID0gX18xZF8uc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9fdnBfW19fMWRfW19faV1dID0gX192W19faV07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICB2b2lkCis+Ojp0eXBlCittYXNrX2FycmF5PF9UcD46Om9wZXJhdG9yKj0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICBzaXplX3QgX19uID0gX18xZF8uc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9fdnBfW19fMWRfW19faV1dICo9IF9fdltfX2ldOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9FeHByPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQorbWFza19hcnJheTxfVHA+OjpvcGVyYXRvci89KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0Cit7CisgICAgc2l6ZV90IF9fbiA9IF9fMWRfLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorICAgICAgICBfX3ZwX1tfXzFkX1tfX2ldXSAvPSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK21hc2tfYXJyYXk8X1RwPjo6b3BlcmF0b3IlPShjb25zdCBfRXhwciYgX192KSBjb25zdAoreworICAgIHNpemVfdCBfX24gPSBfXzFkXy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgICAgX192cF9bX18xZF9bX19pXV0gJT0gX192W19faV07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICB2b2lkCis+Ojp0eXBlCittYXNrX2FycmF5PF9UcD46Om9wZXJhdG9yKz0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICBzaXplX3QgX19uID0gX18xZF8uc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9fdnBfW19fMWRfW19faV1dICs9IF9fdltfX2ldOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9FeHByPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQorbWFza19hcnJheTxfVHA+OjpvcGVyYXRvci09KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0Cit7CisgICAgc2l6ZV90IF9fbiA9IF9fMWRfLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorICAgICAgICBfX3ZwX1tfXzFkX1tfX2ldXSAtPSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK21hc2tfYXJyYXk8X1RwPjo6b3BlcmF0b3JePShjb25zdCBfRXhwciYgX192KSBjb25zdAoreworICAgIHNpemVfdCBfX24gPSBfXzFkXy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgICAgX192cF9bX18xZF9bX19pXV0gXj0gX192W19faV07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICB2b2lkCis+Ojp0eXBlCittYXNrX2FycmF5PF9UcD46Om9wZXJhdG9yJj0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICBzaXplX3QgX19uID0gX18xZF8uc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9fdnBfW19fMWRfW19faV1dICY9IF9fdltfX2ldOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9FeHByPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQorbWFza19hcnJheTxfVHA+OjpvcGVyYXRvcnw9KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0Cit7CisgICAgc2l6ZV90IF9fbiA9IF9fMWRfLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorICAgICAgICBfX3ZwX1tfXzFkX1tfX2ldXSB8PSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK21hc2tfYXJyYXk8X1RwPjo6b3BlcmF0b3I8PD0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICBzaXplX3QgX19uID0gX18xZF8uc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9fdnBfW19fMWRfW19faV1dIDw8PSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK21hc2tfYXJyYXk8X1RwPjo6b3BlcmF0b3I+Pj0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICBzaXplX3QgX19uID0gX18xZF8uc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9fdnBfW19fMWRfW19faV1dID4+PSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZQorY29uc3QgbWFza19hcnJheTxfVHA+JgorbWFza19hcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgbWFza19hcnJheSYgX19tYSkgY29uc3QKK3sKKyAgICBzaXplX3QgX19uID0gX18xZF8uc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9fdnBfW19fMWRfW19faV1dID0gX19tYS5fX3ZwX1tfXzFkX1tfX2ldXTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK3ZvaWQKK21hc2tfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgY29uc3QKK3sKKyAgICBzaXplX3QgX19uID0gX18xZF8uc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9fdnBfW19fMWRfW19faV1dID0gX194OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbEV4cHI+CitjbGFzcyBfX21hc2tfZXhwcgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVmFsRXhwcj46OnR5cGUgIF9SbUV4cHI7CitwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfUm1FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlIHJlc3VsdF90eXBlOworCitwcml2YXRlOgorICAgIF9WYWxFeHByIF9fZXhwcl87CisgICAgdmFsYXJyYXk8c2l6ZV90PiBfXzFkXzsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX21hc2tfZXhwcihjb25zdCB2YWxhcnJheTxib29sPiYgX192YiwgY29uc3QgX1JtRXhwciYgX19lKQorICAgICAgICA6IF9fZXhwcl8oX19lKSwKKyAgICAgICAgICBfXzFkXyhzdGF0aWNfY2FzdDxzaXplX3Q+KGNvdW50KF9fdmIuX19iZWdpbl8sIF9fdmIuX19lbmRfLCB0cnVlKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgICBzaXplX3QgX19qID0gMDsKKyAgICAgICAgICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX192Yi5zaXplKCk7ICsrX19pKQorICAgICAgICAgICAgICAgICAgaWYgKF9fdmJbX19pXSkKKyAgICAgICAgICAgICAgICAgICAgICBfXzFkX1tfX2orK10gPSBfX2k7CisgICAgICAgICAgfQorCitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yW10oc2l6ZV90IF9faSkgY29uc3QKKyAgICAgICAge3JldHVybiBfX2V4cHJfW19fMWRfW19faV1dO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHtyZXR1cm4gX18xZF8uc2l6ZSgpO30KKworICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIHZhbGFycmF5OworfTsKKworLy8gaW5kaXJlY3RfYXJyYXkKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIGluZGlyZWN0X2FycmF5Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKworcHJpdmF0ZToKKyAgICB2YWx1ZV90eXBlKiAgICAgIF9fdnBfOworICAgIHZhbGFycmF5PHNpemVfdD4gX18xZF87CisKK3B1YmxpYzoKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CisgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgPAorICAgICAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgICAgIHZvaWQKKyAgICA+Ojp0eXBlCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG9wZXJhdG9yPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3IqPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3IvPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3IlPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3IrPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3ItPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3JePShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3ImPShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3J8PShjb25zdCBfRXhwciYgX192KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfRXhwcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICAgICAgdm9pZAorICAgID46OnR5cGUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgb3BlcmF0b3I8PD0oY29uc3QgX0V4cHImIF9fdikgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CisgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgPAorICAgICAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgICAgIHZvaWQKKyAgICA+Ojp0eXBlCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIG9wZXJhdG9yPj49KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IGluZGlyZWN0X2FycmF5JiBvcGVyYXRvcj0oY29uc3QgaW5kaXJlY3RfYXJyYXkmIF9faWEpIGNvbnN0OworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgY29uc3Q7CisKKy8vICBpbmRpcmVjdF9hcnJheShjb25zdCBpbmRpcmVjdF9hcnJheSYpICAgICAgICAgICAgPSBkZWZhdWx0OworLy8gIGluZGlyZWN0X2FycmF5KGluZGlyZWN0X2FycmF5JiYpICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisvLyAgaW5kaXJlY3RfYXJyYXkmIG9wZXJhdG9yPShjb25zdCBpbmRpcmVjdF9hcnJheSYpID0gZGVmYXVsdDsKKy8vICBpbmRpcmVjdF9hcnJheSYgb3BlcmF0b3I9KGluZGlyZWN0X2FycmF5JiYpICAgICAgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICBpbmRpcmVjdF9hcnJheShjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX2lhLCBjb25zdCB2YWxhcnJheTx2YWx1ZV90eXBlPiYgX192KQorICAgICAgICA6IF9fdnBfKGNvbnN0X2Nhc3Q8dmFsdWVfdHlwZSo+KF9fdi5fX2JlZ2luXykpLAorICAgICAgICAgIF9fMWRfKF9faWEpCisgICAgICAgIHt9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaW5kaXJlY3RfYXJyYXkodmFsYXJyYXk8c2l6ZV90PiYmIF9faWEsIGNvbnN0IHZhbGFycmF5PHZhbHVlX3R5cGU+JiBfX3YpCisgICAgICAgIDogX192cF8oY29uc3RfY2FzdDx2YWx1ZV90eXBlKj4oX192Ll9fYmVnaW5fKSksCisgICAgICAgICAgX18xZF8obW92ZShfX2lhKSkKKyAgICAgICAge30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIHZhbGFycmF5OworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK2luZGlyZWN0X2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBfRXhwciYgX192KSBjb25zdAoreworICAgIHNpemVfdCBfX24gPSBfXzFkXy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgICAgX192cF9bX18xZF9bX19pXV0gPSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK2luZGlyZWN0X2FycmF5PF9UcD46Om9wZXJhdG9yKj0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICBzaXplX3QgX19uID0gX18xZF8uc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9fdnBfW19fMWRfW19faV1dICo9IF9fdltfX2ldOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9FeHByPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQoraW5kaXJlY3RfYXJyYXk8X1RwPjo6b3BlcmF0b3IvPShjb25zdCBfRXhwciYgX192KSBjb25zdAoreworICAgIHNpemVfdCBfX24gPSBfXzFkXy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgICAgX192cF9bX18xZF9bX19pXV0gLz0gX192W19faV07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICB2b2lkCis+Ojp0eXBlCitpbmRpcmVjdF9hcnJheTxfVHA+OjpvcGVyYXRvciU9KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0Cit7CisgICAgc2l6ZV90IF9fbiA9IF9fMWRfLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorICAgICAgICBfX3ZwX1tfXzFkX1tfX2ldXSAlPSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK2luZGlyZWN0X2FycmF5PF9UcD46Om9wZXJhdG9yKz0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICBzaXplX3QgX19uID0gX18xZF8uc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9fdnBfW19fMWRfW19faV1dICs9IF9fdltfX2ldOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9FeHByPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQoraW5kaXJlY3RfYXJyYXk8X1RwPjo6b3BlcmF0b3ItPShjb25zdCBfRXhwciYgX192KSBjb25zdAoreworICAgIHNpemVfdCBfX24gPSBfXzFkXy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgICAgX192cF9bX18xZF9bX19pXV0gLT0gX192W19faV07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICB2b2lkCis+Ojp0eXBlCitpbmRpcmVjdF9hcnJheTxfVHA+OjpvcGVyYXRvcl49KGNvbnN0IF9FeHByJiBfX3YpIGNvbnN0Cit7CisgICAgc2l6ZV90IF9fbiA9IF9fMWRfLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorICAgICAgICBfX3ZwX1tfXzFkX1tfX2ldXSBePSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK2luZGlyZWN0X2FycmF5PF9UcD46Om9wZXJhdG9yJj0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICBzaXplX3QgX19uID0gX18xZF8uc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9fdnBfW19fMWRfW19faV1dICY9IF9fdltfX2ldOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9FeHByPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQoraW5kaXJlY3RfYXJyYXk8X1RwPjo6b3BlcmF0b3J8PShjb25zdCBfRXhwciYgX192KSBjb25zdAoreworICAgIHNpemVfdCBfX24gPSBfXzFkXy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgICAgX192cF9bX18xZF9bX19pXV0gfD0gX192W19faV07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICB2b2lkCis+Ojp0eXBlCitpbmRpcmVjdF9hcnJheTxfVHA+OjpvcGVyYXRvcjw8PShjb25zdCBfRXhwciYgX192KSBjb25zdAoreworICAgIHNpemVfdCBfX24gPSBfXzFkXy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgICAgX192cF9bX18xZF9bX19pXV0gPDw9IF9fdltfX2ldOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9FeHByPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQoraW5kaXJlY3RfYXJyYXk8X1RwPjo6b3BlcmF0b3I+Pj0oY29uc3QgX0V4cHImIF9fdikgY29uc3QKK3sKKyAgICBzaXplX3QgX19uID0gX18xZF8uc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIF9fdnBfW19fMWRfW19faV1dID4+PSBfX3ZbX19pXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZQorY29uc3QgaW5kaXJlY3RfYXJyYXk8X1RwPiYKK2luZGlyZWN0X2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBpbmRpcmVjdF9hcnJheSYgX19pYSkgY29uc3QKK3sKKyAgICB0eXBlZGVmIGNvbnN0IHNpemVfdCogX0lwOworICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fcyA9IF9faWEuX192cF87CisgICAgZm9yIChfSXAgX19pID0gX18xZF8uX19iZWdpbl8sIF9fZSA9IF9fMWRfLl9fZW5kXywgX19qID0gX19pYS5fXzFkXy5fX2JlZ2luXzsKKyAgICAgICAgICAgIF9faSAhPSBfX2U7ICsrX19pLCArK19faikKKyAgICAgICAgX192cF9bKl9faV0gPSBfX3NbKl9fal07CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCit2b2lkCitpbmRpcmVjdF9hcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgdmFsdWVfdHlwZSYgX194KSBjb25zdAoreworICAgIHR5cGVkZWYgY29uc3Qgc2l6ZV90KiBfSXA7CisgICAgZm9yIChfSXAgX19pID0gX18xZF8uX19iZWdpbl8sIF9fZSA9IF9fMWRfLl9fZW5kXzsgX19pICE9IF9fZTsgKytfX2kpCisgICAgICAgIF9fdnBfWypfX2ldID0gX194OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbEV4cHI+CitjbGFzcyBfX2luZGlyZWN0X2V4cHIKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1ZhbEV4cHI+Ojp0eXBlICBfUm1FeHByOworcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JtRXhwcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdmFsdWVfdHlwZSByZXN1bHRfdHlwZTsKKworcHJpdmF0ZToKKyAgICBfVmFsRXhwciBfX2V4cHJfOworICAgIHZhbGFycmF5PHNpemVfdD4gX18xZF87CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX19pbmRpcmVjdF9leHByKGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9faWEsIGNvbnN0IF9SbUV4cHImIF9fZSkKKyAgICAgICAgOiBfX2V4cHJfKF9fZSksCisgICAgICAgICAgX18xZF8oX19pYSkKKyAgICAgICAgICB7fQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9faW5kaXJlY3RfZXhwcih2YWxhcnJheTxzaXplX3Q+JiYgX19pYSwgY29uc3QgX1JtRXhwciYgX19lKQorICAgICAgICA6IF9fZXhwcl8oX19lKSwKKyAgICAgICAgICBfXzFkXyhtb3ZlKF9faWEpKQorICAgICAgICAgIHt9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9DWFgwM19MQU5HCisKK3B1YmxpYzoKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3JbXShzaXplX3QgX19pKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fZXhwcl9bX18xZF9bX19pXV07fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdCBzaXplKCkgY29uc3Qge3JldHVybiBfXzFkXy5zaXplKCk7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzPiBmcmllbmQgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdmFsYXJyYXk7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfVmFsRXhwcj4KK2NsYXNzIF9fdmFsX2V4cHIKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1ZhbEV4cHI+Ojp0eXBlICBfUm1FeHByOworCisgICAgX1ZhbEV4cHIgX19leHByXzsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9SbUV4cHI6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9SbUV4cHI6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGV4cGxpY2l0IF9fdmFsX2V4cHIoY29uc3QgX1JtRXhwciYgX19lKSA6IF9fZXhwcl8oX19lKSB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yW10oc2l6ZV90IF9faSkgY29uc3QKKyAgICAgICAge3JldHVybiBfX2V4cHJfW19faV07fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fdmFsX2V4cHI8X19zbGljZV9leHByPF9WYWxFeHByPiA+IG9wZXJhdG9yW10oc2xpY2UgX19zKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdmFsX2V4cHI8X19zbGljZV9leHByPF9WYWxFeHByPiA+KF9fZXhwcl8sIF9fcyk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fdmFsX2V4cHI8X19pbmRpcmVjdF9leHByPF9WYWxFeHByPiA+IG9wZXJhdG9yW10oY29uc3QgZ3NsaWNlJiBfX2dzKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdmFsX2V4cHI8X19pbmRpcmVjdF9leHByPF9WYWxFeHByPiA+KF9fZXhwcl8sIF9fZ3MuX18xZF8pO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3ZhbF9leHByPF9fbWFza19leHByPF9WYWxFeHByPiA+IG9wZXJhdG9yW10oY29uc3QgdmFsYXJyYXk8Ym9vbD4mIF9fdmIpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX192YWxfZXhwcjxfX21hc2tfZXhwcjxfVmFsRXhwcj4gPihfX2V4cHJfLCBfX3ZiKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX192YWxfZXhwcjxfX2luZGlyZWN0X2V4cHI8X1ZhbEV4cHI+ID4gb3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX3ZzKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9fdmFsX2V4cHI8X19pbmRpcmVjdF9leHByPF9WYWxFeHByPiA+KF9fZXhwcl8sIF9fdnMpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3ZhbF9leHByPF9VbmFyeU9wPF9fdW5hcnlfcGx1czx2YWx1ZV90eXBlPiwgX1ZhbEV4cHI+ID4KKyAgICBvcGVyYXRvcisoKSBjb25zdAorICAgIHsKKyAgICAgICAgdHlwZWRlZiBfVW5hcnlPcDxfX3VuYXJ5X3BsdXM8dmFsdWVfdHlwZT4sIF9WYWxFeHByPiBfTmV3RXhwcjsKKyAgICAgICAgcmV0dXJuIF9fdmFsX2V4cHI8X05ld0V4cHI+KF9OZXdFeHByKF9fdW5hcnlfcGx1czx2YWx1ZV90eXBlPigpLCBfX2V4cHJfKSk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fdmFsX2V4cHI8X1VuYXJ5T3A8bmVnYXRlPHZhbHVlX3R5cGU+LCBfVmFsRXhwcj4gPgorICAgIG9wZXJhdG9yLSgpIGNvbnN0CisgICAgeworICAgICAgICB0eXBlZGVmIF9VbmFyeU9wPG5lZ2F0ZTx2YWx1ZV90eXBlPiwgX1ZhbEV4cHI+IF9OZXdFeHByOworICAgICAgICByZXR1cm4gX192YWxfZXhwcjxfTmV3RXhwcj4oX05ld0V4cHIobmVnYXRlPHZhbHVlX3R5cGU+KCksIF9fZXhwcl8pKTsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX192YWxfZXhwcjxfVW5hcnlPcDxfX2JpdF9ub3Q8dmFsdWVfdHlwZT4sIF9WYWxFeHByPiA+CisgICAgb3BlcmF0b3J+KCkgY29uc3QKKyAgICB7CisgICAgICAgIHR5cGVkZWYgX1VuYXJ5T3A8X19iaXRfbm90PHZhbHVlX3R5cGU+LCBfVmFsRXhwcj4gX05ld0V4cHI7CisgICAgICAgIHJldHVybiBfX3ZhbF9leHByPF9OZXdFeHByPihfTmV3RXhwcihfX2JpdF9ub3Q8dmFsdWVfdHlwZT4oKSwgX19leHByXykpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3ZhbF9leHByPF9VbmFyeU9wPGxvZ2ljYWxfbm90PHZhbHVlX3R5cGU+LCBfVmFsRXhwcj4gPgorICAgIG9wZXJhdG9yISgpIGNvbnN0CisgICAgeworICAgICAgICB0eXBlZGVmIF9VbmFyeU9wPGxvZ2ljYWxfbm90PHZhbHVlX3R5cGU+LCBfVmFsRXhwcj4gX05ld0V4cHI7CisgICAgICAgIHJldHVybiBfX3ZhbF9leHByPF9OZXdFeHByPihfTmV3RXhwcihsb2dpY2FsX25vdDx2YWx1ZV90eXBlPigpLCBfX2V4cHJfKSk7CisgICAgfQorCisgICAgb3BlcmF0b3IgdmFsYXJyYXk8cmVzdWx0X3R5cGU+KCkgY29uc3Q7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7cmV0dXJuIF9fZXhwcl8uc2l6ZSgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICByZXN1bHRfdHlwZSBzdW0oKSBjb25zdAorICAgIHsKKyAgICAgICAgc2l6ZV90IF9fbiA9IF9fZXhwcl8uc2l6ZSgpOworICAgICAgICByZXN1bHRfdHlwZSBfX3IgPSBfX24gPyBfX2V4cHJfWzBdIDogcmVzdWx0X3R5cGUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgX19pID0gMTsgX19pIDwgX19uOyArK19faSkKKyAgICAgICAgICAgIF9fciArPSBfX2V4cHJfW19faV07CisgICAgICAgIHJldHVybiBfX3I7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlc3VsdF90eXBlIG1pbigpIGNvbnN0CisgICAgeworICAgICAgICBzaXplX3QgX19uID0gc2l6ZSgpOworICAgICAgICByZXN1bHRfdHlwZSBfX3IgPSBfX24gPyAoKnRoaXMpWzBdIDogcmVzdWx0X3R5cGUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgX19pID0gMTsgX19pIDwgX19uOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0X3R5cGUgX194ID0gX19leHByX1tfX2ldOworICAgICAgICAgICAgaWYgKF9feCA8IF9fcikKKyAgICAgICAgICAgICAgICBfX3IgPSBfX3g7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmVzdWx0X3R5cGUgbWF4KCkgY29uc3QKKyAgICB7CisgICAgICAgIHNpemVfdCBfX24gPSBzaXplKCk7CisgICAgICAgIHJlc3VsdF90eXBlIF9fciA9IF9fbiA/ICgqdGhpcylbMF0gOiByZXN1bHRfdHlwZSgpOworICAgICAgICBmb3IgKHNpemVfdCBfX2kgPSAxOyBfX2kgPCBfX247ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHRfdHlwZSBfX3ggPSBfX2V4cHJfW19faV07CisgICAgICAgICAgICBpZiAoX19yIDwgX194KQorICAgICAgICAgICAgICAgIF9fciA9IF9feDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19yOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3ZhbF9leHByPF9fc2hpZnRfZXhwcjxfVmFsRXhwcj4gPiBzaGlmdCAoaW50IF9faSkgY29uc3QKKyAgICAgICAge3JldHVybiBfX3ZhbF9leHByPF9fc2hpZnRfZXhwcjxfVmFsRXhwcj4gPihfX3NoaWZ0X2V4cHI8X1ZhbEV4cHI+KF9faSwgX19leHByXykpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3ZhbF9leHByPF9fY3NoaWZ0X2V4cHI8X1ZhbEV4cHI+ID4gY3NoaWZ0KGludCBfX2kpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX192YWxfZXhwcjxfX2NzaGlmdF9leHByPF9WYWxFeHByPiA+KF9fY3NoaWZ0X2V4cHI8X1ZhbEV4cHI+KF9faSwgX19leHByXykpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3ZhbF9leHByPF9VbmFyeU9wPF9fYXBwbHlfZXhwcjx2YWx1ZV90eXBlLCB2YWx1ZV90eXBlKCopKHZhbHVlX3R5cGUpPiwgX1ZhbEV4cHI+ID4KKyAgICBhcHBseSh2YWx1ZV90eXBlIF9fZih2YWx1ZV90eXBlKSkgY29uc3QKKyAgICB7CisgICAgICAgIHR5cGVkZWYgX19hcHBseV9leHByPHZhbHVlX3R5cGUsIHZhbHVlX3R5cGUoKikodmFsdWVfdHlwZSk+IF9PcDsKKyAgICAgICAgdHlwZWRlZiBfVW5hcnlPcDxfT3AsIF9WYWxFeHByPiBfTmV3RXhwcjsKKyAgICAgICAgcmV0dXJuIF9fdmFsX2V4cHI8X05ld0V4cHI+KF9OZXdFeHByKF9PcChfX2YpLCBfX2V4cHJfKSk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIF9fdmFsX2V4cHI8X1VuYXJ5T3A8X19hcHBseV9leHByPHZhbHVlX3R5cGUsIHZhbHVlX3R5cGUoKikoY29uc3QgdmFsdWVfdHlwZSYpPiwgX1ZhbEV4cHI+ID4KKyAgICBhcHBseSh2YWx1ZV90eXBlIF9fZihjb25zdCB2YWx1ZV90eXBlJikpIGNvbnN0CisgICAgeworICAgICAgICB0eXBlZGVmIF9fYXBwbHlfZXhwcjx2YWx1ZV90eXBlLCB2YWx1ZV90eXBlKCopKGNvbnN0IHZhbHVlX3R5cGUmKT4gX09wOworICAgICAgICB0eXBlZGVmIF9VbmFyeU9wPF9PcCwgX1ZhbEV4cHI+IF9OZXdFeHByOworICAgICAgICByZXR1cm4gX192YWxfZXhwcjxfTmV3RXhwcj4oX05ld0V4cHIoX09wKF9fZiksIF9fZXhwcl8pKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfVmFsRXhwcj4KK19fdmFsX2V4cHI8X1ZhbEV4cHI+OjpvcGVyYXRvciB2YWxhcnJheTxfX3ZhbF9leHByOjpyZXN1bHRfdHlwZT4oKSBjb25zdAoreworICAgIHZhbGFycmF5PHJlc3VsdF90eXBlPiBfX3I7CisgICAgc2l6ZV90IF9fbiA9IF9fZXhwcl8uc2l6ZSgpOworICAgIGlmIChfX24pCisgICAgeworICAgICAgICBfX3IuX19iZWdpbl8gPQorICAgICAgICAgICAgX19yLl9fZW5kXyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8cmVzdWx0X3R5cGUqPigKKyAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6Ol9fbGliY3BwX2FsbG9jYXRlKF9fbiAqIHNpemVvZihyZXN1bHRfdHlwZSksIF9fYWxpZ25vZihyZXN1bHRfdHlwZSkpKTsKKyAgICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pICE9IF9fbjsgKytfX3IuX19lbmRfLCArK19faSkKKyAgICAgICAgICAgIDo6bmV3IChfX3IuX19lbmRfKSByZXN1bHRfdHlwZShfX2V4cHJfW19faV0pOworICAgIH0KKyAgICByZXR1cm4gX19yOworfQorCisvLyB2YWxhcnJheQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCit2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShzaXplX3QgX19uKQorICAgIDogX19iZWdpbl8oMCksCisgICAgICBfX2VuZF8oMCkKK3sKKyAgICBpZiAoX19uKQorICAgIHsKKyAgICAgICAgX19iZWdpbl8gPSBfX2VuZF8gPSBzdGF0aWNfY2FzdDx2YWx1ZV90eXBlKj4oCisgICAgICAgICAgICBfVlNURDo6X19saWJjcHBfYWxsb2NhdGUoX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpLCBfX2FsaWdub2YodmFsdWVfdHlwZSkpKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHRyeQorICAgICAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgZm9yICg7IF9fbjsgLS1fX24sICsrX19lbmRfKQorICAgICAgICAgICAgICAgIDo6bmV3IChfX2VuZF8pIHZhbHVlX3R5cGUoKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKC4uLikKKyAgICAgICAgeworICAgICAgICAgICAgX19jbGVhcigpOworICAgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCit2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShjb25zdCB2YWx1ZV90eXBlJiBfX3gsIHNpemVfdCBfX24pCisgICAgOiBfX2JlZ2luXygwKSwKKyAgICAgIF9fZW5kXygwKQoreworICAgIHJlc2l6ZShfX24sIF9feCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShjb25zdCB2YWx1ZV90eXBlKiBfX3AsIHNpemVfdCBfX24pCisgICAgOiBfX2JlZ2luXygwKSwKKyAgICAgIF9fZW5kXygwKQoreworICAgIGlmIChfX24pCisgICAgeworICAgICAgICBfX2JlZ2luXyA9IF9fZW5kXyA9IHN0YXRpY19jYXN0PHZhbHVlX3R5cGUqPigKKyAgICAgICAgICAgIF9WU1REOjpfX2xpYmNwcF9hbGxvY2F0ZShfX24gKiBzaXplb2YodmFsdWVfdHlwZSksIF9fYWxpZ25vZih2YWx1ZV90eXBlKSkpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgICAgICBmb3IgKDsgX19uOyArK19fZW5kXywgKytfX3AsIC0tX19uKQorICAgICAgICAgICAgICAgIDo6bmV3IChfX2VuZF8pIHZhbHVlX3R5cGUoKl9fcCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB9CisgICAgICAgIGNhdGNoICguLi4pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fY2xlYXIoKTsKKyAgICAgICAgICAgIHRocm93OworICAgICAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3ZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IHZhbGFycmF5JiBfX3YpCisgICAgOiBfX2JlZ2luXygwKSwKKyAgICAgIF9fZW5kXygwKQoreworICAgIGlmIChfX3Yuc2l6ZSgpKQorICAgIHsKKyAgICAgICAgX19iZWdpbl8gPSBfX2VuZF8gPSBzdGF0aWNfY2FzdDx2YWx1ZV90eXBlKj4oCisgICAgICAgICAgICBfVlNURDo6X19saWJjcHBfYWxsb2NhdGUoX192LnNpemUoKSAqIHNpemVvZih2YWx1ZV90eXBlKSwgX19hbGlnbm9mKHZhbHVlX3R5cGUpKSk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0cnkKKyAgICAgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIGZvciAodmFsdWVfdHlwZSogX19wID0gX192Ll9fYmVnaW5fOyBfX3AgIT0gX192Ll9fZW5kXzsgKytfX2VuZF8sICsrX19wKQorICAgICAgICAgICAgICAgIDo6bmV3IChfX2VuZF8pIHZhbHVlX3R5cGUoKl9fcCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB9CisgICAgICAgIGNhdGNoICguLi4pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fY2xlYXIoKTsKKyAgICAgICAgICAgIHRocm93OworICAgICAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZQordmFsYXJyYXk8X1RwPjo6dmFsYXJyYXkodmFsYXJyYXkmJiBfX3YpIF9OT0VYQ0VQVAorICAgIDogX19iZWdpbl8oX192Ll9fYmVnaW5fKSwKKyAgICAgIF9fZW5kXyhfX3YuX19lbmRfKQoreworICAgIF9fdi5fX2JlZ2luXyA9IF9fdi5fX2VuZF8gPSBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordmFsYXJyYXk8X1RwPjo6dmFsYXJyYXkoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQorICAgIDogX19iZWdpbl8oMCksCisgICAgICBfX2VuZF8oMCkKK3sKKyAgICBzaXplX3QgX19uID0gX19pbC5zaXplKCk7CisgICAgaWYgKF9fbikKKyAgICB7CisgICAgICAgIF9fYmVnaW5fID0gX19lbmRfID0gc3RhdGljX2Nhc3Q8dmFsdWVfdHlwZSo+KAorX1ZTVEQ6Ol9fbGliY3BwX2FsbG9jYXRlKF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKSwgX19hbGlnbm9mKHZhbHVlX3R5cGUpKSk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0cnkKKyAgICAgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWVfdHlwZSogX19wID0gX19pbC5iZWdpbigpOyBfX247ICsrX19lbmRfLCArK19fcCwgLS1fX24pCisgICAgICAgICAgICAgICAgOjpuZXcgKF9fZW5kXykgdmFsdWVfdHlwZSgqX19wKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKC4uLikKKyAgICAgICAgeworICAgICAgICAgICAgX19jbGVhcigpOworICAgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordmFsYXJyYXk8X1RwPjo6dmFsYXJyYXkoY29uc3Qgc2xpY2VfYXJyYXk8dmFsdWVfdHlwZT4mIF9fc2EpCisgICAgOiBfX2JlZ2luXygwKSwKKyAgICAgIF9fZW5kXygwKQoreworICAgIHNpemVfdCBfX24gPSBfX3NhLl9fc2l6ZV87CisgICAgaWYgKF9fbikKKyAgICB7CisgICAgICAgIF9fYmVnaW5fID0gX19lbmRfID0gc3RhdGljX2Nhc3Q8dmFsdWVfdHlwZSo+KAorICAgICAgICAgIF9WU1REOjpfX2xpYmNwcF9hbGxvY2F0ZShfX24gKiBzaXplb2YodmFsdWVfdHlwZSksIF9fYWxpZ25vZih2YWx1ZV90eXBlKSkpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlX3R5cGUqIF9fcCA9IF9fc2EuX192cF87IF9fbjsgKytfX2VuZF8sIF9fcCArPSBfX3NhLl9fc3RyaWRlXywgLS1fX24pCisgICAgICAgICAgICAgICAgOjpuZXcgKF9fZW5kXykgdmFsdWVfdHlwZSgqX19wKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKC4uLikKKyAgICAgICAgeworICAgICAgICAgICAgX19jbGVhcigpOworICAgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordmFsYXJyYXk8X1RwPjo6dmFsYXJyYXkoY29uc3QgZ3NsaWNlX2FycmF5PHZhbHVlX3R5cGU+JiBfX2dhKQorICAgIDogX19iZWdpbl8oMCksCisgICAgICBfX2VuZF8oMCkKK3sKKyAgICBzaXplX3QgX19uID0gX19nYS5fXzFkXy5zaXplKCk7CisgICAgaWYgKF9fbikKKyAgICB7CisgICAgICAgIF9fYmVnaW5fID0gX19lbmRfID0gc3RhdGljX2Nhc3Q8dmFsdWVfdHlwZSo+KAorICAgICAgICAgICBfVlNURDo6X19saWJjcHBfYWxsb2NhdGUoX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpLCBfX2FsaWdub2YodmFsdWVfdHlwZSkpKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHRyeQorICAgICAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgdHlwZWRlZiBjb25zdCBzaXplX3QqIF9JcDsKKyAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fcyA9IF9fZ2EuX192cF87CisgICAgICAgICAgICBmb3IgKF9JcCBfX2kgPSBfX2dhLl9fMWRfLl9fYmVnaW5fLCBfX2UgPSBfX2dhLl9fMWRfLl9fZW5kXzsKKyAgICAgICAgICAgICAgICAgICAgX19pICE9IF9fZTsgKytfX2ksICsrX19lbmRfKQorICAgICAgICAgICAgICAgIDo6bmV3IChfX2VuZF8pIHZhbHVlX3R5cGUoX19zWypfX2ldKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKC4uLikKKyAgICAgICAgeworICAgICAgICAgICAgX19jbGVhcigpOworICAgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordmFsYXJyYXk8X1RwPjo6dmFsYXJyYXkoY29uc3QgbWFza19hcnJheTx2YWx1ZV90eXBlPiYgX19tYSkKKyAgICA6IF9fYmVnaW5fKDApLAorICAgICAgX19lbmRfKDApCit7CisgICAgc2l6ZV90IF9fbiA9IF9fbWEuX18xZF8uc2l6ZSgpOworICAgIGlmIChfX24pCisgICAgeworICAgICAgICBfX2JlZ2luXyA9IF9fZW5kXyA9IHN0YXRpY19jYXN0PHZhbHVlX3R5cGUqPigKKyAgICAgICAgICAgX1ZTVEQ6Ol9fbGliY3BwX2FsbG9jYXRlKF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKSwgX19hbGlnbm9mKHZhbHVlX3R5cGUpKSk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0cnkKKyAgICAgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIHR5cGVkZWYgY29uc3Qgc2l6ZV90KiBfSXA7CisgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlKiBfX3MgPSBfX21hLl9fdnBfOworICAgICAgICAgICAgZm9yIChfSXAgX19pID0gX19tYS5fXzFkXy5fX2JlZ2luXywgX19lID0gX19tYS5fXzFkXy5fX2VuZF87CisgICAgICAgICAgICAgICAgICAgIF9faSAhPSBfX2U7ICsrX19pLCArK19fZW5kXykKKyAgICAgICAgICAgICAgICA6Om5ldyAoX19lbmRfKSB2YWx1ZV90eXBlKF9fc1sqX19pXSk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB9CisgICAgICAgIGNhdGNoICguLi4pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fY2xlYXIoKTsKKyAgICAgICAgICAgIHRocm93OworICAgICAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3ZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IGluZGlyZWN0X2FycmF5PHZhbHVlX3R5cGU+JiBfX2lhKQorICAgIDogX19iZWdpbl8oMCksCisgICAgICBfX2VuZF8oMCkKK3sKKyAgICBzaXplX3QgX19uID0gX19pYS5fXzFkXy5zaXplKCk7CisgICAgaWYgKF9fbikKKyAgICB7CisgICAgICAgIF9fYmVnaW5fID0gX19lbmRfID0gc3RhdGljX2Nhc3Q8dmFsdWVfdHlwZSo+KAorICAgICAgICAgICBfVlNURDo6X19saWJjcHBfYWxsb2NhdGUoX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpLCBfX2FsaWdub2YodmFsdWVfdHlwZSkpKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHRyeQorICAgICAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgdHlwZWRlZiBjb25zdCBzaXplX3QqIF9JcDsKKyAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fcyA9IF9faWEuX192cF87CisgICAgICAgICAgICBmb3IgKF9JcCBfX2kgPSBfX2lhLl9fMWRfLl9fYmVnaW5fLCBfX2UgPSBfX2lhLl9fMWRfLl9fZW5kXzsKKyAgICAgICAgICAgICAgICAgICAgX19pICE9IF9fZTsgKytfX2ksICsrX19lbmRfKQorICAgICAgICAgICAgICAgIDo6bmV3IChfX2VuZF8pIHZhbHVlX3R5cGUoX19zWypfX2ldKTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKC4uLikKKyAgICAgICAgeworICAgICAgICAgICAgX19jbGVhcigpOworICAgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCit2YWxhcnJheTxfVHA+Ojp+dmFsYXJyYXkoKQoreworICAgIF9fY2xlYXIoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3ZhbGFycmF5PF9UcD4mCit2YWxhcnJheTxfVHA+OjpfX2Fzc2lnbl9yYW5nZShjb25zdCB2YWx1ZV90eXBlKiBfX2YsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbCkKK3sKKyAgICBzaXplX3QgX19uID0gX19sIC0gX19mOworICAgIGlmIChzaXplKCkgIT0gX19uKQorICAgIHsKKyAgICAgICAgX19jbGVhcigpOworICAgICAgICBfX2JlZ2luXyA9IHN0YXRpY19jYXN0PHZhbHVlX3R5cGUqPigKKyAgICAgICAgICAgX1ZTVEQ6Ol9fbGliY3BwX2FsbG9jYXRlKF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKSwgX19hbGlnbm9mKHZhbHVlX3R5cGUpKSk7CisgICAgICAgIF9fZW5kXyA9IF9fYmVnaW5fICsgX19uOworICAgICAgICBfVlNURDo6dW5pbml0aWFsaXplZF9jb3B5KF9fZiwgX19sLCBfX2JlZ2luXyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX1ZTVEQ6OmNvcHkoX19mLCBfX2wsIF9fYmVnaW5fKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordmFsYXJyYXk8X1RwPiYKK3ZhbGFycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCB2YWxhcnJheSYgX192KQoreworICAgIGlmICh0aGlzICE9ICZfX3YpCisgICAgICAgIHJldHVybiBfX2Fzc2lnbl9yYW5nZShfX3YuX19iZWdpbl8sIF9fdi5fX2VuZF8pOworICAgIHJldHVybiAqdGhpczsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZQordmFsYXJyYXk8X1RwPiYKK3ZhbGFycmF5PF9UcD46Om9wZXJhdG9yPSh2YWxhcnJheSYmIF9fdikgX05PRVhDRVBUCit7CisgICAgX19jbGVhcigpOworICAgIF9fYmVnaW5fID0gX192Ll9fYmVnaW5fOworICAgIF9fZW5kXyA9IF9fdi5fX2VuZF87CisgICAgX192Ll9fYmVnaW5fID0gbnVsbHB0cjsKKyAgICBfX3YuX19lbmRfID0gbnVsbHB0cjsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK3ZhbGFycmF5PF9UcD4mCit2YWxhcnJheTxfVHA+OjpvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQoreworICAgIHJldHVybiBfX2Fzc2lnbl9yYW5nZShfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCit2YWxhcnJheTxfVHA+JgordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKK3sKKyAgICBfVlNURDo6ZmlsbChfX2JlZ2luXywgX19lbmRfLCBfX3gpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZQordmFsYXJyYXk8X1RwPiYKK3ZhbGFycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBzbGljZV9hcnJheTx2YWx1ZV90eXBlPiYgX19zYSkKK3sKKyAgICB2YWx1ZV90eXBlKiBfX3QgPSBfX2JlZ2luXzsKKyAgICBjb25zdCB2YWx1ZV90eXBlKiBfX3MgPSBfX3NhLl9fdnBfOworICAgIGZvciAoc2l6ZV90IF9fbiA9IF9fc2EuX19zaXplXzsgX19uOyAtLV9fbiwgX19zICs9IF9fc2EuX19zdHJpZGVfLCArK19fdCkKKyAgICAgICAgKl9fdCA9ICpfX3M7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCit2YWxhcnJheTxfVHA+JgordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IGdzbGljZV9hcnJheTx2YWx1ZV90eXBlPiYgX19nYSkKK3sKKyAgICB0eXBlZGVmIGNvbnN0IHNpemVfdCogX0lwOworICAgIHZhbHVlX3R5cGUqIF9fdCA9IF9fYmVnaW5fOworICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fcyA9IF9fZ2EuX192cF87CisgICAgZm9yIChfSXAgX19pID0gX19nYS5fXzFkXy5fX2JlZ2luXywgX19lID0gX19nYS5fXzFkXy5fX2VuZF87CisgICAgICAgICAgICAgICAgICAgIF9faSAhPSBfX2U7ICsrX19pLCArK19fdCkKKyAgICAgICAgKl9fdCA9IF9fc1sqX19pXTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK3ZhbGFycmF5PF9UcD4mCit2YWxhcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgbWFza19hcnJheTx2YWx1ZV90eXBlPiYgX19tYSkKK3sKKyAgICB0eXBlZGVmIGNvbnN0IHNpemVfdCogX0lwOworICAgIHZhbHVlX3R5cGUqIF9fdCA9IF9fYmVnaW5fOworICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fcyA9IF9fbWEuX192cF87CisgICAgZm9yIChfSXAgX19pID0gX19tYS5fXzFkXy5fX2JlZ2luXywgX19lID0gX19tYS5fXzFkXy5fX2VuZF87CisgICAgICAgICAgICAgICAgICAgIF9faSAhPSBfX2U7ICsrX19pLCArK19fdCkKKyAgICAgICAgKl9fdCA9IF9fc1sqX19pXTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK3ZhbGFycmF5PF9UcD4mCit2YWxhcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgaW5kaXJlY3RfYXJyYXk8dmFsdWVfdHlwZT4mIF9faWEpCit7CisgICAgdHlwZWRlZiBjb25zdCBzaXplX3QqIF9JcDsKKyAgICB2YWx1ZV90eXBlKiBfX3QgPSBfX2JlZ2luXzsKKyAgICBjb25zdCB2YWx1ZV90eXBlKiBfX3MgPSBfX2lhLl9fdnBfOworICAgIGZvciAoX0lwIF9faSA9IF9faWEuX18xZF8uX19iZWdpbl8sIF9fZSA9IF9faWEuX18xZF8uX19lbmRfOworICAgICAgICAgICAgICAgICAgICBfX2kgIT0gX19lOyArK19faSwgKytfX3QpCisgICAgICAgICpfX3QgPSBfX3NbKl9faV07CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9WYWxFeHByPgoraW5saW5lCit2YWxhcnJheTxfVHA+JgordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IF9fdmFsX2V4cHI8X1ZhbEV4cHI+JiBfX3YpCit7CisgICAgc2l6ZV90IF9fbiA9IF9fdi5zaXplKCk7CisgICAgaWYgKHNpemUoKSAhPSBfX24pCisgICAgICAgIHJlc2l6ZShfX24pOworICAgIHZhbHVlX3R5cGUqIF9fdCA9IF9fYmVnaW5fOworICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSAhPSBfX247ICsrX190LCArK19faSkKKyAgICAgICAgKl9fdCA9IHJlc3VsdF90eXBlKF9fdltfX2ldKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK19fdmFsX2V4cHI8X19zbGljZV9leHByPGNvbnN0IHZhbGFycmF5PF9UcD4mPiA+Cit2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKHNsaWNlIF9fcykgY29uc3QKK3sKKyAgICByZXR1cm4gX192YWxfZXhwcjxfX3NsaWNlX2V4cHI8Y29uc3QgdmFsYXJyYXkmPiA+KF9fc2xpY2VfZXhwcjxjb25zdCB2YWxhcnJheSY+KF9fcywgKnRoaXMpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZQorc2xpY2VfYXJyYXk8X1RwPgordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShzbGljZSBfX3MpCit7CisgICAgcmV0dXJuIHNsaWNlX2FycmF5PHZhbHVlX3R5cGU+KF9fcywgKnRoaXMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCitfX3ZhbF9leHByPF9faW5kaXJlY3RfZXhwcjxjb25zdCB2YWxhcnJheTxfVHA+Jj4gPgordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShjb25zdCBnc2xpY2UmIF9fZ3MpIGNvbnN0Cit7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X19pbmRpcmVjdF9leHByPGNvbnN0IHZhbGFycmF5Jj4gPihfX2luZGlyZWN0X2V4cHI8Y29uc3QgdmFsYXJyYXkmPihfX2dzLl9fMWRfLCAqdGhpcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCitnc2xpY2VfYXJyYXk8X1RwPgordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShjb25zdCBnc2xpY2UmIF9fZ3MpCit7CisgICAgcmV0dXJuIGdzbGljZV9hcnJheTx2YWx1ZV90eXBlPihfX2dzLCAqdGhpcyk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK19fdmFsX2V4cHI8X19pbmRpcmVjdF9leHByPGNvbnN0IHZhbGFycmF5PF9UcD4mPiA+Cit2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKGdzbGljZSYmIF9fZ3MpIGNvbnN0Cit7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X19pbmRpcmVjdF9leHByPGNvbnN0IHZhbGFycmF5Jj4gPihfX2luZGlyZWN0X2V4cHI8Y29uc3QgdmFsYXJyYXkmPihtb3ZlKF9fZ3MuX18xZF8pLCAqdGhpcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCitnc2xpY2VfYXJyYXk8X1RwPgordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShnc2xpY2UmJiBfX2dzKQoreworICAgIHJldHVybiBnc2xpY2VfYXJyYXk8dmFsdWVfdHlwZT4obW92ZShfX2dzKSwgKnRoaXMpOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCitfX3ZhbF9leHByPF9fbWFza19leHByPGNvbnN0IHZhbGFycmF5PF9UcD4mPiA+Cit2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKGNvbnN0IHZhbGFycmF5PGJvb2w+JiBfX3ZiKSBjb25zdAoreworICAgIHJldHVybiBfX3ZhbF9leHByPF9fbWFza19leHByPGNvbnN0IHZhbGFycmF5Jj4gPihfX21hc2tfZXhwcjxjb25zdCB2YWxhcnJheSY+KF9fdmIsICp0aGlzKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK21hc2tfYXJyYXk8X1RwPgordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxib29sPiYgX192YikKK3sKKyAgICByZXR1cm4gbWFza19hcnJheTx2YWx1ZV90eXBlPihfX3ZiLCAqdGhpcyk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK19fdmFsX2V4cHI8X19tYXNrX2V4cHI8Y29uc3QgdmFsYXJyYXk8X1RwPiY+ID4KK3ZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10odmFsYXJyYXk8Ym9vbD4mJiBfX3ZiKSBjb25zdAoreworICAgIHJldHVybiBfX3ZhbF9leHByPF9fbWFza19leHByPGNvbnN0IHZhbGFycmF5Jj4gPihfX21hc2tfZXhwcjxjb25zdCB2YWxhcnJheSY+KG1vdmUoX192YiksICp0aGlzKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK21hc2tfYXJyYXk8X1RwPgordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXSh2YWxhcnJheTxib29sPiYmIF9fdmIpCit7CisgICAgcmV0dXJuIG1hc2tfYXJyYXk8dmFsdWVfdHlwZT4obW92ZShfX3ZiKSwgKnRoaXMpOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCitfX3ZhbF9leHByPF9faW5kaXJlY3RfZXhwcjxjb25zdCB2YWxhcnJheTxfVHA+Jj4gPgordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX3ZzKSBjb25zdAoreworICAgIHJldHVybiBfX3ZhbF9leHByPF9faW5kaXJlY3RfZXhwcjxjb25zdCB2YWxhcnJheSY+ID4oX19pbmRpcmVjdF9leHByPGNvbnN0IHZhbGFycmF5Jj4oX192cywgKnRoaXMpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZQoraW5kaXJlY3RfYXJyYXk8X1RwPgordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX3ZzKQoreworICAgIHJldHVybiBpbmRpcmVjdF9hcnJheTx2YWx1ZV90eXBlPihfX3ZzLCAqdGhpcyk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK19fdmFsX2V4cHI8X19pbmRpcmVjdF9leHByPGNvbnN0IHZhbGFycmF5PF9UcD4mPiA+Cit2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKHZhbGFycmF5PHNpemVfdD4mJiBfX3ZzKSBjb25zdAoreworICAgIHJldHVybiBfX3ZhbF9leHByPF9faW5kaXJlY3RfZXhwcjxjb25zdCB2YWxhcnJheSY+ID4oX19pbmRpcmVjdF9leHByPGNvbnN0IHZhbGFycmF5Jj4obW92ZShfX3ZzKSwgKnRoaXMpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZQoraW5kaXJlY3RfYXJyYXk8X1RwPgordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXSh2YWxhcnJheTxzaXplX3Q+JiYgX192cykKK3sKKyAgICByZXR1cm4gaW5kaXJlY3RfYXJyYXk8dmFsdWVfdHlwZT4obW92ZShfX3ZzKSwgKnRoaXMpOworfQorCisjZW5kaWYgIC8vIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordmFsYXJyYXk8X1RwPgordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3IrKCkgY29uc3QKK3sKKyAgICB2YWxhcnJheTx2YWx1ZV90eXBlPiBfX3I7CisgICAgc2l6ZV90IF9fbiA9IHNpemUoKTsKKyAgICBpZiAoX19uKQorICAgIHsKKyAgICAgICAgX19yLl9fYmVnaW5fID0KKyAgICAgICAgICAgIF9fci5fX2VuZF8gPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZhbHVlX3R5cGUqPigKKyAgICAgICAgICAgX1ZTVEQ6Ol9fbGliY3BwX2FsbG9jYXRlKF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKSwgX19hbGlnbm9mKHZhbHVlX3R5cGUpKSk7CisgICAgICAgIGZvciAoY29uc3QgdmFsdWVfdHlwZSogX19wID0gX19iZWdpbl87IF9fbjsgKytfX3IuX19lbmRfLCArK19fcCwgLS1fX24pCisgICAgICAgICAgICA6Om5ldyAoX19yLl9fZW5kXykgdmFsdWVfdHlwZSgrKl9fcCk7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit2YWxhcnJheTxfVHA+Cit2YWxhcnJheTxfVHA+OjpvcGVyYXRvci0oKSBjb25zdAoreworICAgIHZhbGFycmF5PHZhbHVlX3R5cGU+IF9fcjsKKyAgICBzaXplX3QgX19uID0gc2l6ZSgpOworICAgIGlmIChfX24pCisgICAgeworICAgICAgICBfX3IuX19iZWdpbl8gPQorICAgICAgICAgICAgX19yLl9fZW5kXyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dmFsdWVfdHlwZSo+KAorICAgICAgICAgICBfVlNURDo6X19saWJjcHBfYWxsb2NhdGUoX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpLCBfX2FsaWdub2YodmFsdWVfdHlwZSkpKTsKKyAgICAgICAgZm9yIChjb25zdCB2YWx1ZV90eXBlKiBfX3AgPSBfX2JlZ2luXzsgX19uOyArK19fci5fX2VuZF8sICsrX19wLCAtLV9fbikKKyAgICAgICAgICAgIDo6bmV3IChfX3IuX19lbmRfKSB2YWx1ZV90eXBlKC0qX19wKTsKKyAgICB9CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3ZhbGFycmF5PF9UcD4KK3ZhbGFycmF5PF9UcD46Om9wZXJhdG9yfigpIGNvbnN0Cit7CisgICAgdmFsYXJyYXk8dmFsdWVfdHlwZT4gX19yOworICAgIHNpemVfdCBfX24gPSBzaXplKCk7CisgICAgaWYgKF9fbikKKyAgICB7CisgICAgICAgIF9fci5fX2JlZ2luXyA9CisgICAgICAgICAgICBfX3IuX19lbmRfID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2YWx1ZV90eXBlKj4oCisgICAgICAgICAgIF9WU1REOjpfX2xpYmNwcF9hbGxvY2F0ZShfX24gKiBzaXplb2YodmFsdWVfdHlwZSksIF9fYWxpZ25vZih2YWx1ZV90eXBlKSkpOworICAgICAgICBmb3IgKGNvbnN0IHZhbHVlX3R5cGUqIF9fcCA9IF9fYmVnaW5fOyBfX247ICsrX19yLl9fZW5kXywgKytfX3AsIC0tX19uKQorICAgICAgICAgICAgOjpuZXcgKF9fci5fX2VuZF8pIHZhbHVlX3R5cGUofipfX3ApOworICAgIH0KKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordmFsYXJyYXk8Ym9vbD4KK3ZhbGFycmF5PF9UcD46Om9wZXJhdG9yISgpIGNvbnN0Cit7CisgICAgdmFsYXJyYXk8Ym9vbD4gX19yOworICAgIHNpemVfdCBfX24gPSBzaXplKCk7CisgICAgaWYgKF9fbikKKyAgICB7CisgICAgICAgIF9fci5fX2JlZ2luXyA9CisgICAgICAgICAgICBfX3IuX19lbmRfID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxib29sKj4oX1ZTVEQ6Ol9fbGliY3BwX2FsbG9jYXRlKF9fbiAqIHNpemVvZihib29sKSwgX19hbGlnbm9mKGJvb2wpKSk7CisgICAgICAgIGZvciAoY29uc3QgdmFsdWVfdHlwZSogX19wID0gX19iZWdpbl87IF9fbjsgKytfX3IuX19lbmRfLCArK19fcCwgLS1fX24pCisgICAgICAgICAgICA6Om5ldyAoX19yLl9fZW5kXykgYm9vbCghKl9fcCk7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK3ZhbGFycmF5PF9UcD4mCit2YWxhcnJheTxfVHA+OjpvcGVyYXRvcio9KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKK3sKKyAgICBmb3IgKHZhbHVlX3R5cGUqIF9fcCA9IF9fYmVnaW5fOyBfX3AgIT0gX19lbmRfOyArK19fcCkKKyAgICAgICAgKl9fcCAqPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCit2YWxhcnJheTxfVHA+JgordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3IvPShjb25zdCB2YWx1ZV90eXBlJiBfX3gpCit7CisgICAgZm9yICh2YWx1ZV90eXBlKiBfX3AgPSBfX2JlZ2luXzsgX19wICE9IF9fZW5kXzsgKytfX3ApCisgICAgICAgICpfX3AgLz0gX194OworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZQordmFsYXJyYXk8X1RwPiYKK3ZhbGFycmF5PF9UcD46Om9wZXJhdG9yJT0oY29uc3QgdmFsdWVfdHlwZSYgX194KQoreworICAgIGZvciAodmFsdWVfdHlwZSogX19wID0gX19iZWdpbl87IF9fcCAhPSBfX2VuZF87ICsrX19wKQorICAgICAgICAqX19wICU9IF9feDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK3ZhbGFycmF5PF9UcD4mCit2YWxhcnJheTxfVHA+OjpvcGVyYXRvcis9KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKK3sKKyAgICBmb3IgKHZhbHVlX3R5cGUqIF9fcCA9IF9fYmVnaW5fOyBfX3AgIT0gX19lbmRfOyArK19fcCkKKyAgICAgICAgKl9fcCArPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCit2YWxhcnJheTxfVHA+JgordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3ItPShjb25zdCB2YWx1ZV90eXBlJiBfX3gpCit7CisgICAgZm9yICh2YWx1ZV90eXBlKiBfX3AgPSBfX2JlZ2luXzsgX19wICE9IF9fZW5kXzsgKytfX3ApCisgICAgICAgICpfX3AgLT0gX194OworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZQordmFsYXJyYXk8X1RwPiYKK3ZhbGFycmF5PF9UcD46Om9wZXJhdG9yXj0oY29uc3QgdmFsdWVfdHlwZSYgX194KQoreworICAgIGZvciAodmFsdWVfdHlwZSogX19wID0gX19iZWdpbl87IF9fcCAhPSBfX2VuZF87ICsrX19wKQorICAgICAgICAqX19wIF49IF9feDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK3ZhbGFycmF5PF9UcD4mCit2YWxhcnJheTxfVHA+OjpvcGVyYXRvciY9KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKK3sKKyAgICBmb3IgKHZhbHVlX3R5cGUqIF9fcCA9IF9fYmVnaW5fOyBfX3AgIT0gX19lbmRfOyArK19fcCkKKyAgICAgICAgKl9fcCAmPSBfX3g7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCit2YWxhcnJheTxfVHA+JgordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3J8PShjb25zdCB2YWx1ZV90eXBlJiBfX3gpCit7CisgICAgZm9yICh2YWx1ZV90eXBlKiBfX3AgPSBfX2JlZ2luXzsgX19wICE9IF9fZW5kXzsgKytfX3ApCisgICAgICAgICpfX3AgfD0gX194OworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZQordmFsYXJyYXk8X1RwPiYKK3ZhbGFycmF5PF9UcD46Om9wZXJhdG9yPDw9KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKK3sKKyAgICBmb3IgKHZhbHVlX3R5cGUqIF9fcCA9IF9fYmVnaW5fOyBfX3AgIT0gX19lbmRfOyArK19fcCkKKyAgICAgICAgKl9fcCA8PD0gX194OworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZQordmFsYXJyYXk8X1RwPiYKK3ZhbGFycmF5PF9UcD46Om9wZXJhdG9yPj49KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKK3sKKyAgICBmb3IgKHZhbHVlX3R5cGUqIF9fcCA9IF9fYmVnaW5fOyBfX3AgIT0gX19lbmRfOyArK19fcCkKKyAgICAgICAgKl9fcCA+Pj0gX194OworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZhbGFycmF5PF9UcD4mCis+Ojp0eXBlCit2YWxhcnJheTxfVHA+OjpvcGVyYXRvcio9KGNvbnN0IF9FeHByJiBfX3YpCit7CisgICAgc2l6ZV90IF9faSA9IDA7CisgICAgZm9yICh2YWx1ZV90eXBlKiBfX3QgPSBfX2JlZ2luXzsgX190ICE9IF9fZW5kXyA7ICsrX190LCArK19faSkKKyAgICAgICAgKl9fdCAqPSBfX3ZbX19pXTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICB2YWxhcnJheTxfVHA+JgorPjo6dHlwZQordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3IvPShjb25zdCBfRXhwciYgX192KQoreworICAgIHNpemVfdCBfX2kgPSAwOworICAgIGZvciAodmFsdWVfdHlwZSogX190ID0gX19iZWdpbl87IF9fdCAhPSBfX2VuZF8gOyArK19fdCwgKytfX2kpCisgICAgICAgICpfX3QgLz0gX192W19faV07CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9FeHByPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgdmFsYXJyYXk8X1RwPiYKKz46OnR5cGUKK3ZhbGFycmF5PF9UcD46Om9wZXJhdG9yJT0oY29uc3QgX0V4cHImIF9fdikKK3sKKyAgICBzaXplX3QgX19pID0gMDsKKyAgICBmb3IgKHZhbHVlX3R5cGUqIF9fdCA9IF9fYmVnaW5fOyBfX3QgIT0gX19lbmRfIDsgKytfX3QsICsrX19pKQorICAgICAgICAqX190ICU9IF9fdltfX2ldOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZhbGFycmF5PF9UcD4mCis+Ojp0eXBlCit2YWxhcnJheTxfVHA+OjpvcGVyYXRvcis9KGNvbnN0IF9FeHByJiBfX3YpCit7CisgICAgc2l6ZV90IF9faSA9IDA7CisgICAgZm9yICh2YWx1ZV90eXBlKiBfX3QgPSBfX2JlZ2luXzsgX190ICE9IF9fZW5kXyA7ICsrX190LCArK19faSkKKyAgICAgICAgKl9fdCArPSBfX3ZbX19pXTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICB2YWxhcnJheTxfVHA+JgorPjo6dHlwZQordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3ItPShjb25zdCBfRXhwciYgX192KQoreworICAgIHNpemVfdCBfX2kgPSAwOworICAgIGZvciAodmFsdWVfdHlwZSogX190ID0gX19iZWdpbl87IF9fdCAhPSBfX2VuZF8gOyArK19fdCwgKytfX2kpCisgICAgICAgICpfX3QgLT0gX192W19faV07CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9FeHByPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgdmFsYXJyYXk8X1RwPiYKKz46OnR5cGUKK3ZhbGFycmF5PF9UcD46Om9wZXJhdG9yXj0oY29uc3QgX0V4cHImIF9fdikKK3sKKyAgICBzaXplX3QgX19pID0gMDsKKyAgICBmb3IgKHZhbHVlX3R5cGUqIF9fdCA9IF9fYmVnaW5fOyBfX3QgIT0gX19lbmRfIDsgKytfX3QsICsrX19pKQorICAgICAgICAqX190IF49IF9fdltfX2ldOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3RlbXBsYXRlIDxjbGFzcyBfRXhwcj4KK2lubGluZQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIHZhbGFycmF5PF9UcD4mCis+Ojp0eXBlCit2YWxhcnJheTxfVHA+OjpvcGVyYXRvcnw9KGNvbnN0IF9FeHByJiBfX3YpCit7CisgICAgc2l6ZV90IF9faSA9IDA7CisgICAgZm9yICh2YWx1ZV90eXBlKiBfX3QgPSBfX2JlZ2luXzsgX190ICE9IF9fZW5kXyA7ICsrX190LCArK19faSkKKyAgICAgICAgKl9fdCB8PSBfX3ZbX19pXTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0V4cHI+CitpbmxpbmUKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICB2YWxhcnJheTxfVHA+JgorPjo6dHlwZQordmFsYXJyYXk8X1RwPjo6b3BlcmF0b3ImPShjb25zdCBfRXhwciYgX192KQoreworICAgIHNpemVfdCBfX2kgPSAwOworICAgIGZvciAodmFsdWVfdHlwZSogX190ID0gX19iZWdpbl87IF9fdCAhPSBfX2VuZF8gOyArK19fdCwgKytfX2kpCisgICAgICAgICpfX3QgJj0gX192W19faV07CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9FeHByPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgdmFsYXJyYXk8X1RwPiYKKz46OnR5cGUKK3ZhbGFycmF5PF9UcD46Om9wZXJhdG9yPDw9KGNvbnN0IF9FeHByJiBfX3YpCit7CisgICAgc2l6ZV90IF9faSA9IDA7CisgICAgZm9yICh2YWx1ZV90eXBlKiBfX3QgPSBfX2JlZ2luXzsgX190ICE9IF9fZW5kXyA7ICsrX190LCArK19faSkKKyAgICAgICAgKl9fdCA8PD0gX192W19faV07CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordGVtcGxhdGUgPGNsYXNzIF9FeHByPgoraW5saW5lCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgdmFsYXJyYXk8X1RwPiYKKz46OnR5cGUKK3ZhbGFycmF5PF9UcD46Om9wZXJhdG9yPj49KGNvbnN0IF9FeHByJiBfX3YpCit7CisgICAgc2l6ZV90IF9faSA9IDA7CisgICAgZm9yICh2YWx1ZV90eXBlKiBfX3QgPSBfX2JlZ2luXzsgX190ICE9IF9fZW5kXyA7ICsrX190LCArK19faSkKKyAgICAgICAgKl9fdCA+Pj0gX192W19faV07CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCit2b2lkCit2YWxhcnJheTxfVHA+Ojpzd2FwKHZhbGFycmF5JiBfX3YpIF9OT0VYQ0VQVAoreworICAgIF9WU1REOjpzd2FwKF9fYmVnaW5fLCBfX3YuX19iZWdpbl8pOworICAgIF9WU1REOjpzd2FwKF9fZW5kXywgX192Ll9fZW5kXyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUKK19UcAordmFsYXJyYXk8X1RwPjo6c3VtKCkgY29uc3QKK3sKKyAgICBpZiAoX19iZWdpbl8gPT0gX19lbmRfKQorICAgICAgICByZXR1cm4gdmFsdWVfdHlwZSgpOworICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fcCA9IF9fYmVnaW5fOworICAgIF9UcCBfX3IgPSAqX19wOworICAgIGZvciAoKytfX3A7IF9fcCAhPSBfX2VuZF87ICsrX19wKQorICAgICAgICBfX3IgKz0gKl9fcDsKKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgoraW5saW5lCitfVHAKK3ZhbGFycmF5PF9UcD46Om1pbigpIGNvbnN0Cit7CisgICAgaWYgKF9fYmVnaW5fID09IF9fZW5kXykKKyAgICAgICAgcmV0dXJuIHZhbHVlX3R5cGUoKTsKKyAgICByZXR1cm4gKl9WU1REOjptaW5fZWxlbWVudChfX2JlZ2luXywgX19lbmRfKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZQorX1RwCit2YWxhcnJheTxfVHA+OjptYXgoKSBjb25zdAoreworICAgIGlmIChfX2JlZ2luXyA9PSBfX2VuZF8pCisgICAgICAgIHJldHVybiB2YWx1ZV90eXBlKCk7CisgICAgcmV0dXJuICpfVlNURDo6bWF4X2VsZW1lbnQoX19iZWdpbl8sIF9fZW5kXyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit2YWxhcnJheTxfVHA+Cit2YWxhcnJheTxfVHA+OjpzaGlmdChpbnQgX19pKSBjb25zdAoreworICAgIHZhbGFycmF5PHZhbHVlX3R5cGU+IF9fcjsKKyAgICBzaXplX3QgX19uID0gc2l6ZSgpOworICAgIGlmIChfX24pCisgICAgeworICAgICAgICBfX3IuX19iZWdpbl8gPQorICAgICAgICAgICAgX19yLl9fZW5kXyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dmFsdWVfdHlwZSo+KAorICAgICAgICAgICBfVlNURDo6X19saWJjcHBfYWxsb2NhdGUoX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpLCBfX2FsaWdub2YodmFsdWVfdHlwZSkpKTsKKyAgICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19zYjsKKyAgICAgICAgdmFsdWVfdHlwZSogX190YjsKKyAgICAgICAgdmFsdWVfdHlwZSogX190ZTsKKyAgICAgICAgaWYgKF9faSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBfX2kgPSBfVlNURDo6bWluKF9faSwgc3RhdGljX2Nhc3Q8aW50PihfX24pKTsKKyAgICAgICAgICAgIF9fc2IgPSBfX2JlZ2luXyArIF9faTsKKyAgICAgICAgICAgIF9fdGIgPSBfX3IuX19iZWdpbl87CisgICAgICAgICAgICBfX3RlID0gX19yLl9fYmVnaW5fICsgKF9fbiAtIF9faSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfX2kgPSBfVlNURDo6bWluKC1fX2ksIHN0YXRpY19jYXN0PGludD4oX19uKSk7CisgICAgICAgICAgICBfX3NiID0gX19iZWdpbl87CisgICAgICAgICAgICBfX3RiID0gX19yLl9fYmVnaW5fICsgX19pOworICAgICAgICAgICAgX190ZSA9IF9fci5fX2JlZ2luXyArIF9fbjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgX19yLl9fZW5kXyAhPSBfX3RiOyArK19fci5fX2VuZF8pCisgICAgICAgICAgICA6Om5ldyAoX19yLl9fZW5kXykgdmFsdWVfdHlwZSgpOworICAgICAgICBmb3IgKDsgX19yLl9fZW5kXyAhPSBfX3RlOyArK19fci5fX2VuZF8sICsrX19zYikKKyAgICAgICAgICAgIDo6bmV3IChfX3IuX19lbmRfKSB2YWx1ZV90eXBlKCpfX3NiKTsKKyAgICAgICAgZm9yIChfX3RlID0gX19yLl9fYmVnaW5fICsgX19uOyBfX3IuX19lbmRfICE9IF9fdGU7ICsrX19yLl9fZW5kXykKKyAgICAgICAgICAgIDo6bmV3IChfX3IuX19lbmRfKSB2YWx1ZV90eXBlKCk7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit2YWxhcnJheTxfVHA+Cit2YWxhcnJheTxfVHA+Ojpjc2hpZnQoaW50IF9faSkgY29uc3QKK3sKKyAgICB2YWxhcnJheTx2YWx1ZV90eXBlPiBfX3I7CisgICAgc2l6ZV90IF9fbiA9IHNpemUoKTsKKyAgICBpZiAoX19uKQorICAgIHsKKyAgICAgICAgX19yLl9fYmVnaW5fID0KKyAgICAgICAgICAgIF9fci5fX2VuZF8gPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZhbHVlX3R5cGUqPigKKyAgICAgICAgICAgX1ZTVEQ6Ol9fbGliY3BwX2FsbG9jYXRlKF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKSwgX19hbGlnbm9mKHZhbHVlX3R5cGUpKSk7CisgICAgICAgIF9faSAlPSBzdGF0aWNfY2FzdDxpbnQ+KF9fbik7CisgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fbSA9IF9faSA+PSAwID8gX19iZWdpbl8gKyBfX2kgOiBfX2VuZF8gKyBfX2k7CisgICAgICAgIGZvciAoY29uc3QgdmFsdWVfdHlwZSogX19zID0gX19tOyBfX3MgIT0gX19lbmRfOyArK19fci5fX2VuZF8sICsrX19zKQorICAgICAgICAgICAgOjpuZXcgKF9fci5fX2VuZF8pIHZhbHVlX3R5cGUoKl9fcyk7CisgICAgICAgIGZvciAoY29uc3QgdmFsdWVfdHlwZSogX19zID0gX19iZWdpbl87IF9fcyAhPSBfX207ICsrX19yLl9fZW5kXywgKytfX3MpCisgICAgICAgICAgICA6Om5ldyAoX19yLl9fZW5kXykgdmFsdWVfdHlwZSgqX19zKTsKKyAgICB9CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3ZhbGFycmF5PF9UcD4KK3ZhbGFycmF5PF9UcD46OmFwcGx5KHZhbHVlX3R5cGUgX19mKHZhbHVlX3R5cGUpKSBjb25zdAoreworICAgIHZhbGFycmF5PHZhbHVlX3R5cGU+IF9fcjsKKyAgICBzaXplX3QgX19uID0gc2l6ZSgpOworICAgIGlmIChfX24pCisgICAgeworICAgICAgICBfX3IuX19iZWdpbl8gPQorICAgICAgICAgICAgX19yLl9fZW5kXyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dmFsdWVfdHlwZSo+KAorICAgICAgICAgICBfVlNURDo6X19saWJjcHBfYWxsb2NhdGUoX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpLCBfX2FsaWdub2YodmFsdWVfdHlwZSkpKTsKKyAgICAgICAgZm9yIChjb25zdCB2YWx1ZV90eXBlKiBfX3AgPSBfX2JlZ2luXzsgX19uOyArK19fci5fX2VuZF8sICsrX19wLCAtLV9fbikKKyAgICAgICAgICAgIDo6bmV3IChfX3IuX19lbmRfKSB2YWx1ZV90eXBlKF9fZigqX19wKSk7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+Cit2YWxhcnJheTxfVHA+Cit2YWxhcnJheTxfVHA+OjphcHBseSh2YWx1ZV90eXBlIF9fZihjb25zdCB2YWx1ZV90eXBlJikpIGNvbnN0Cit7CisgICAgdmFsYXJyYXk8dmFsdWVfdHlwZT4gX19yOworICAgIHNpemVfdCBfX24gPSBzaXplKCk7CisgICAgaWYgKF9fbikKKyAgICB7CisgICAgICAgIF9fci5fX2JlZ2luXyA9CisgICAgICAgICAgICBfX3IuX19lbmRfID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2YWx1ZV90eXBlKj4oCisgICAgICAgICAgIF9WU1REOjpfX2xpYmNwcF9hbGxvY2F0ZShfX24gKiBzaXplb2YodmFsdWVfdHlwZSksIF9fYWxpZ25vZih2YWx1ZV90eXBlKSkpOworICAgICAgICBmb3IgKGNvbnN0IHZhbHVlX3R5cGUqIF9fcCA9IF9fYmVnaW5fOyBfX247ICsrX19yLl9fZW5kXywgKytfX3AsIC0tX19uKQorICAgICAgICAgICAgOjpuZXcgKF9fci5fX2VuZF8pIHZhbHVlX3R5cGUoX19mKCpfX3ApKTsKKyAgICB9CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3ZvaWQKK3ZhbGFycmF5PF9UcD46Ol9fY2xlYXIoKQoreworICAgIGlmIChfX2JlZ2luXyAhPSBudWxscHRyKQorICAgIHsKKyAgICAgICAgd2hpbGUgKF9fZW5kXyAhPSBfX2JlZ2luXykKKyAgICAgICAgICAgICgtLV9fZW5kXyktPn52YWx1ZV90eXBlKCk7CisgICAgICAgIF9WU1REOjpfX2xpYmNwcF9kZWFsbG9jYXRlKF9fYmVnaW5fLCBfX2FsaWdub2YodmFsdWVfdHlwZSkpOworICAgICAgICBfX2JlZ2luXyA9IF9fZW5kXyA9IG51bGxwdHI7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgordm9pZAordmFsYXJyYXk8X1RwPjo6cmVzaXplKHNpemVfdCBfX24sIHZhbHVlX3R5cGUgX194KQoreworICAgIF9fY2xlYXIoKTsKKyAgICBpZiAoX19uKQorICAgIHsKKyAgICAgICAgX19iZWdpbl8gPSBfX2VuZF8gPSBzdGF0aWNfY2FzdDx2YWx1ZV90eXBlKj4oCisgICAgICAgICAgIF9WU1REOjpfX2xpYmNwcF9hbGxvY2F0ZShfX24gKiBzaXplb2YodmFsdWVfdHlwZSksIF9fYWxpZ25vZih2YWx1ZV90eXBlKSkpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgICAgICBmb3IgKDsgX19uOyAtLV9fbiwgKytfX2VuZF8pCisgICAgICAgICAgICAgICAgOjpuZXcgKF9fZW5kXykgdmFsdWVfdHlwZShfX3gpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoLi4uKQorICAgICAgICB7CisgICAgICAgICAgICBfX2NsZWFyKCk7CisgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitzd2FwKHZhbGFycmF5PF9UcD4mIF9feCwgdmFsYXJyYXk8X1RwPiYgX195KSBfTk9FWENFUFQKK3sKKyAgICBfX3guc3dhcChfX3kpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8bXVsdGlwbGllczx0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gPgorPjo6dHlwZQorb3BlcmF0b3IqKGNvbnN0IF9FeHByMSYgX194LCBjb25zdCBfRXhwcjImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByMTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0JpbmFyeU9wPG11bHRpcGxpZXM8dmFsdWVfdHlwZT4sIF9FeHByMSwgX0V4cHIyPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AobXVsdGlwbGllczx2YWx1ZV90eXBlPigpLCBfX3gsIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8bXVsdGlwbGllczx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICBfRXhwciwgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4gPiA+Cis+Ojp0eXBlCitvcGVyYXRvciooY29uc3QgX0V4cHImIF9feCwgY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8bXVsdGlwbGllczx2YWx1ZV90eXBlPiwgX0V4cHIsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4gPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AobXVsdGlwbGllczx2YWx1ZV90eXBlPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX194LCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feSwgX194LnNpemUoKSkpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPG11bHRpcGxpZXM8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sIF9FeHByPiA+Cis+Ojp0eXBlCitvcGVyYXRvciooY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feCwgY29uc3QgX0V4cHImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8bXVsdGlwbGllczx2YWx1ZV90eXBlPiwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChtdWx0aXBsaWVzPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8ZGl2aWRlczx0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gPgorPjo6dHlwZQorb3BlcmF0b3IvKGNvbnN0IF9FeHByMSYgX194LCBjb25zdCBfRXhwcjImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByMTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0JpbmFyeU9wPGRpdmlkZXM8dmFsdWVfdHlwZT4sIF9FeHByMSwgX0V4cHIyPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoZGl2aWRlczx2YWx1ZV90eXBlPigpLCBfX3gsIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8ZGl2aWRlczx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICBfRXhwciwgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4gPiA+Cis+Ojp0eXBlCitvcGVyYXRvci8oY29uc3QgX0V4cHImIF9feCwgY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8ZGl2aWRlczx2YWx1ZV90eXBlPiwgX0V4cHIsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4gPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoZGl2aWRlczx2YWx1ZV90eXBlPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX194LCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feSwgX194LnNpemUoKSkpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPGRpdmlkZXM8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sIF9FeHByPiA+Cis+Ojp0eXBlCitvcGVyYXRvci8oY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feCwgY29uc3QgX0V4cHImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8ZGl2aWRlczx2YWx1ZV90eXBlPiwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChkaXZpZGVzPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8bW9kdWx1czx0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gPgorPjo6dHlwZQorb3BlcmF0b3IlKGNvbnN0IF9FeHByMSYgX194LCBjb25zdCBfRXhwcjImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByMTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0JpbmFyeU9wPG1vZHVsdXM8dmFsdWVfdHlwZT4sIF9FeHByMSwgX0V4cHIyPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AobW9kdWx1czx2YWx1ZV90eXBlPigpLCBfX3gsIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8bW9kdWx1czx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICBfRXhwciwgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4gPiA+Cis+Ojp0eXBlCitvcGVyYXRvciUoY29uc3QgX0V4cHImIF9feCwgY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8bW9kdWx1czx2YWx1ZV90eXBlPiwgX0V4cHIsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4gPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AobW9kdWx1czx2YWx1ZV90eXBlPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX194LCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feSwgX194LnNpemUoKSkpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPG1vZHVsdXM8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sIF9FeHByPiA+Cis+Ojp0eXBlCitvcGVyYXRvciUoY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feCwgY29uc3QgX0V4cHImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8bW9kdWx1czx2YWx1ZV90eXBlPiwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChtb2R1bHVzPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8cGx1czx0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gPgorPjo6dHlwZQorb3BlcmF0b3IrKGNvbnN0IF9FeHByMSYgX194LCBjb25zdCBfRXhwcjImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByMTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0JpbmFyeU9wPHBsdXM8dmFsdWVfdHlwZT4sIF9FeHByMSwgX0V4cHIyPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AocGx1czx2YWx1ZV90eXBlPigpLCBfX3gsIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8cGx1czx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICBfRXhwciwgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4gPiA+Cis+Ojp0eXBlCitvcGVyYXRvcisoY29uc3QgX0V4cHImIF9feCwgY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8cGx1czx2YWx1ZV90eXBlPiwgX0V4cHIsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4gPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AocGx1czx2YWx1ZV90eXBlPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX194LCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feSwgX194LnNpemUoKSkpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPHBsdXM8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sIF9FeHByPiA+Cis+Ojp0eXBlCitvcGVyYXRvcisoY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feCwgY29uc3QgX0V4cHImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8cGx1czx2YWx1ZV90eXBlPiwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChwbHVzPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8bWludXM8dHlwZW5hbWUgX0V4cHIxOjp2YWx1ZV90eXBlPiwgX0V4cHIxLCBfRXhwcjI+ID4KKz46OnR5cGUKK29wZXJhdG9yLShjb25zdCBfRXhwcjEmIF9feCwgY29uc3QgX0V4cHIyJiBfX3kpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9CaW5hcnlPcDxtaW51czx2YWx1ZV90eXBlPiwgX0V4cHIxLCBfRXhwcjI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChtaW51czx2YWx1ZV90eXBlPigpLCBfX3gsIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8bWludXM8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgX0V4cHIsIF9fc2NhbGFyX2V4cHI8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+ID4gPgorPjo6dHlwZQorb3BlcmF0b3ItKGNvbnN0IF9FeHByJiBfX3gsIGNvbnN0IHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlJiBfX3kpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0JpbmFyeU9wPG1pbnVzPHZhbHVlX3R5cGU+LCBfRXhwciwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiA+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChtaW51czx2YWx1ZV90eXBlPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX194LCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feSwgX194LnNpemUoKSkpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPG1pbnVzPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiwKKyAgICAgICAgICAgICAgIF9fc2NhbGFyX2V4cHI8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LCBfRXhwcj4gPgorPjo6dHlwZQorb3BlcmF0b3ItKGNvbnN0IHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlJiBfX3gsIGNvbnN0IF9FeHByJiBfX3kpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0JpbmFyeU9wPG1pbnVzPHZhbHVlX3R5cGU+LCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+LCBfRXhwcj4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKG1pbnVzPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8Yml0X3hvcjx0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gPgorPjo6dHlwZQorb3BlcmF0b3JeKGNvbnN0IF9FeHByMSYgX194LCBjb25zdCBfRXhwcjImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByMTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0JpbmFyeU9wPGJpdF94b3I8dmFsdWVfdHlwZT4sIF9FeHByMSwgX0V4cHIyPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoYml0X3hvcjx2YWx1ZV90eXBlPigpLCBfX3gsIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8Yml0X3hvcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICBfRXhwciwgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4gPiA+Cis+Ojp0eXBlCitvcGVyYXRvcl4oY29uc3QgX0V4cHImIF9feCwgY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8Yml0X3hvcjx2YWx1ZV90eXBlPiwgX0V4cHIsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4gPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoYml0X3hvcjx2YWx1ZV90eXBlPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX194LCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feSwgX194LnNpemUoKSkpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPGJpdF94b3I8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sIF9FeHByPiA+Cis+Ojp0eXBlCitvcGVyYXRvcl4oY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feCwgY29uc3QgX0V4cHImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8Yml0X3hvcjx2YWx1ZV90eXBlPiwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChiaXRfeG9yPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8Yml0X2FuZDx0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gPgorPjo6dHlwZQorb3BlcmF0b3ImKGNvbnN0IF9FeHByMSYgX194LCBjb25zdCBfRXhwcjImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByMTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0JpbmFyeU9wPGJpdF9hbmQ8dmFsdWVfdHlwZT4sIF9FeHByMSwgX0V4cHIyPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoYml0X2FuZDx2YWx1ZV90eXBlPigpLCBfX3gsIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8Yml0X2FuZDx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICBfRXhwciwgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4gPiA+Cis+Ojp0eXBlCitvcGVyYXRvciYoY29uc3QgX0V4cHImIF9feCwgY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8Yml0X2FuZDx2YWx1ZV90eXBlPiwgX0V4cHIsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4gPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoYml0X2FuZDx2YWx1ZV90eXBlPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX194LCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feSwgX194LnNpemUoKSkpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPGJpdF9hbmQ8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sIF9FeHByPiA+Cis+Ojp0eXBlCitvcGVyYXRvciYoY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feCwgY29uc3QgX0V4cHImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8Yml0X2FuZDx2YWx1ZV90eXBlPiwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChiaXRfYW5kPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8Yml0X29yPHR5cGVuYW1lIF9FeHByMTo6dmFsdWVfdHlwZT4sIF9FeHByMSwgX0V4cHIyPiA+Cis+Ojp0eXBlCitvcGVyYXRvcnwoY29uc3QgX0V4cHIxJiBfX3gsIGNvbnN0IF9FeHByMiYgX195KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0V4cHIxOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8Yml0X29yPHZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKGJpdF9vcjx2YWx1ZV90eXBlPigpLCBfX3gsIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8Yml0X29yPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiwKKyAgICAgICAgICAgICAgIF9FeHByLCBfX3NjYWxhcl9leHByPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiA+ID4KKz46OnR5cGUKK29wZXJhdG9yfChjb25zdCBfRXhwciYgX194LCBjb25zdCB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSYgX195KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9CaW5hcnlPcDxiaXRfb3I8dmFsdWVfdHlwZT4sIF9FeHByLCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+ID4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKGJpdF9vcjx2YWx1ZV90eXBlPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX194LCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feSwgX194LnNpemUoKSkpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPGJpdF9vcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiwgX0V4cHI+ID4KKz46OnR5cGUKK29wZXJhdG9yfChjb25zdCB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSYgX194LCBjb25zdCBfRXhwciYgX195KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9CaW5hcnlPcDxiaXRfb3I8dmFsdWVfdHlwZT4sIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4sIF9FeHByPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoYml0X29yPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8X19iaXRfc2hpZnRfbGVmdDx0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gPgorPjo6dHlwZQorb3BlcmF0b3I8PChjb25zdCBfRXhwcjEmIF9feCwgY29uc3QgX0V4cHIyJiBfX3kpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9CaW5hcnlPcDxfX2JpdF9zaGlmdF9sZWZ0PHZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKF9fYml0X3NoaWZ0X2xlZnQ8dmFsdWVfdHlwZT4oKSwgX194LCBfX3kpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPF9fYml0X3NoaWZ0X2xlZnQ8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgX0V4cHIsIF9fc2NhbGFyX2V4cHI8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+ID4gPgorPjo6dHlwZQorb3BlcmF0b3I8PChjb25zdCBfRXhwciYgX194LCBjb25zdCB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSYgX195KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9CaW5hcnlPcDxfX2JpdF9zaGlmdF9sZWZ0PHZhbHVlX3R5cGU+LCBfRXhwciwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiA+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChfX2JpdF9zaGlmdF9sZWZ0PHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3gsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4oX195LCBfX3guc2l6ZSgpKSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8X19iaXRfc2hpZnRfbGVmdDx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiwgX0V4cHI+ID4KKz46OnR5cGUKK29wZXJhdG9yPDwoY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feCwgY29uc3QgX0V4cHImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8X19iaXRfc2hpZnRfbGVmdDx2YWx1ZV90eXBlPiwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChfX2JpdF9zaGlmdF9sZWZ0PHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8X19iaXRfc2hpZnRfcmlnaHQ8dHlwZW5hbWUgX0V4cHIxOjp2YWx1ZV90eXBlPiwgX0V4cHIxLCBfRXhwcjI+ID4KKz46OnR5cGUKK29wZXJhdG9yPj4oY29uc3QgX0V4cHIxJiBfX3gsIGNvbnN0IF9FeHByMiYgX195KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0V4cHIxOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8X19iaXRfc2hpZnRfcmlnaHQ8dmFsdWVfdHlwZT4sIF9FeHByMSwgX0V4cHIyPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoX19iaXRfc2hpZnRfcmlnaHQ8dmFsdWVfdHlwZT4oKSwgX194LCBfX3kpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPF9fYml0X3NoaWZ0X3JpZ2h0PHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiwKKyAgICAgICAgICAgICAgIF9FeHByLCBfX3NjYWxhcl9leHByPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiA+ID4KKz46OnR5cGUKK29wZXJhdG9yPj4oY29uc3QgX0V4cHImIF9feCwgY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8X19iaXRfc2hpZnRfcmlnaHQ8dmFsdWVfdHlwZT4sIF9FeHByLCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+ID4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKF9fYml0X3NoaWZ0X3JpZ2h0PHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3gsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4oX195LCBfX3guc2l6ZSgpKSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8X19iaXRfc2hpZnRfcmlnaHQ8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sIF9FeHByPiA+Cis+Ojp0eXBlCitvcGVyYXRvcj4+KGNvbnN0IHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlJiBfX3gsIGNvbnN0IF9FeHByJiBfX3kpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0JpbmFyeU9wPF9fYml0X3NoaWZ0X3JpZ2h0PHZhbHVlX3R5cGU+LCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+LCBfRXhwcj4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKF9fYml0X3NoaWZ0X3JpZ2h0PHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8bG9naWNhbF9hbmQ8dHlwZW5hbWUgX0V4cHIxOjp2YWx1ZV90eXBlPiwgX0V4cHIxLCBfRXhwcjI+ID4KKz46OnR5cGUKK29wZXJhdG9yJiYoY29uc3QgX0V4cHIxJiBfX3gsIGNvbnN0IF9FeHByMiYgX195KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0V4cHIxOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8bG9naWNhbF9hbmQ8dmFsdWVfdHlwZT4sIF9FeHByMSwgX0V4cHIyPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AobG9naWNhbF9hbmQ8dmFsdWVfdHlwZT4oKSwgX194LCBfX3kpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPGxvZ2ljYWxfYW5kPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiwKKyAgICAgICAgICAgICAgIF9FeHByLCBfX3NjYWxhcl9leHByPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiA+ID4KKz46OnR5cGUKK29wZXJhdG9yJiYoY29uc3QgX0V4cHImIF9feCwgY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8bG9naWNhbF9hbmQ8dmFsdWVfdHlwZT4sIF9FeHByLCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+ID4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKGxvZ2ljYWxfYW5kPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3gsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4oX195LCBfX3guc2l6ZSgpKSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8bG9naWNhbF9hbmQ8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sIF9FeHByPiA+Cis+Ojp0eXBlCitvcGVyYXRvciYmKGNvbnN0IHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlJiBfX3gsIGNvbnN0IF9FeHByJiBfX3kpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0JpbmFyeU9wPGxvZ2ljYWxfYW5kPHZhbHVlX3R5cGU+LCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+LCBfRXhwcj4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKGxvZ2ljYWxfYW5kPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8bG9naWNhbF9vcjx0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gPgorPjo6dHlwZQorb3BlcmF0b3J8fChjb25zdCBfRXhwcjEmIF9feCwgY29uc3QgX0V4cHIyJiBfX3kpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9CaW5hcnlPcDxsb2dpY2FsX29yPHZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKGxvZ2ljYWxfb3I8dmFsdWVfdHlwZT4oKSwgX194LCBfX3kpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPGxvZ2ljYWxfb3I8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgX0V4cHIsIF9fc2NhbGFyX2V4cHI8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+ID4gPgorPjo6dHlwZQorb3BlcmF0b3J8fChjb25zdCBfRXhwciYgX194LCBjb25zdCB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSYgX195KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9CaW5hcnlPcDxsb2dpY2FsX29yPHZhbHVlX3R5cGU+LCBfRXhwciwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiA+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChsb2dpY2FsX29yPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3gsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4oX195LCBfX3guc2l6ZSgpKSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8bG9naWNhbF9vcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiwgX0V4cHI+ID4KKz46OnR5cGUKK29wZXJhdG9yfHwoY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feCwgY29uc3QgX0V4cHImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8bG9naWNhbF9vcjx2YWx1ZV90eXBlPiwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChsb2dpY2FsX29yPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8ZXF1YWxfdG88dHlwZW5hbWUgX0V4cHIxOjp2YWx1ZV90eXBlPiwgX0V4cHIxLCBfRXhwcjI+ID4KKz46OnR5cGUKK29wZXJhdG9yPT0oY29uc3QgX0V4cHIxJiBfX3gsIGNvbnN0IF9FeHByMiYgX195KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0V4cHIxOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8ZXF1YWxfdG88dmFsdWVfdHlwZT4sIF9FeHByMSwgX0V4cHIyPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoZXF1YWxfdG88dmFsdWVfdHlwZT4oKSwgX194LCBfX3kpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPGVxdWFsX3RvPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiwKKyAgICAgICAgICAgICAgIF9FeHByLCBfX3NjYWxhcl9leHByPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiA+ID4KKz46OnR5cGUKK29wZXJhdG9yPT0oY29uc3QgX0V4cHImIF9feCwgY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8ZXF1YWxfdG88dmFsdWVfdHlwZT4sIF9FeHByLCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+ID4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKGVxdWFsX3RvPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3gsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4oX195LCBfX3guc2l6ZSgpKSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8ZXF1YWxfdG88dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sIF9FeHByPiA+Cis+Ojp0eXBlCitvcGVyYXRvcj09KGNvbnN0IHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlJiBfX3gsIGNvbnN0IF9FeHByJiBfX3kpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0JpbmFyeU9wPGVxdWFsX3RvPHZhbHVlX3R5cGU+LCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+LCBfRXhwcj4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKGVxdWFsX3RvPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8bm90X2VxdWFsX3RvPHR5cGVuYW1lIF9FeHByMTo6dmFsdWVfdHlwZT4sIF9FeHByMSwgX0V4cHIyPiA+Cis+Ojp0eXBlCitvcGVyYXRvciE9KGNvbnN0IF9FeHByMSYgX194LCBjb25zdCBfRXhwcjImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByMTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0JpbmFyeU9wPG5vdF9lcXVhbF90bzx2YWx1ZV90eXBlPiwgX0V4cHIxLCBfRXhwcjI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChub3RfZXF1YWxfdG88dmFsdWVfdHlwZT4oKSwgX194LCBfX3kpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPG5vdF9lcXVhbF90bzx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICBfRXhwciwgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4gPiA+Cis+Ojp0eXBlCitvcGVyYXRvciE9KGNvbnN0IF9FeHByJiBfX3gsIGNvbnN0IHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlJiBfX3kpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0JpbmFyeU9wPG5vdF9lcXVhbF90bzx2YWx1ZV90eXBlPiwgX0V4cHIsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4gPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3Aobm90X2VxdWFsX3RvPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3gsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4oX195LCBfX3guc2l6ZSgpKSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8bm90X2VxdWFsX3RvPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiwKKyAgICAgICAgICAgICAgIF9fc2NhbGFyX2V4cHI8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LCBfRXhwcj4gPgorPjo6dHlwZQorb3BlcmF0b3IhPShjb25zdCB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSYgX194LCBjb25zdCBfRXhwciYgX195KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9CaW5hcnlPcDxub3RfZXF1YWxfdG88dmFsdWVfdHlwZT4sIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4sIF9FeHByPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3Aobm90X2VxdWFsX3RvPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8bGVzczx0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gPgorPjo6dHlwZQorb3BlcmF0b3I8KGNvbnN0IF9FeHByMSYgX194LCBjb25zdCBfRXhwcjImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByMTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0JpbmFyeU9wPGxlc3M8dmFsdWVfdHlwZT4sIF9FeHByMSwgX0V4cHIyPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AobGVzczx2YWx1ZV90eXBlPigpLCBfX3gsIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8bGVzczx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICBfRXhwciwgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4gPiA+Cis+Ojp0eXBlCitvcGVyYXRvcjwoY29uc3QgX0V4cHImIF9feCwgY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8bGVzczx2YWx1ZV90eXBlPiwgX0V4cHIsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4gPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AobGVzczx2YWx1ZV90eXBlPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX194LCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feSwgX194LnNpemUoKSkpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPGxlc3M8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sIF9FeHByPiA+Cis+Ojp0eXBlCitvcGVyYXRvcjwoY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feCwgY29uc3QgX0V4cHImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8bGVzczx2YWx1ZV90eXBlPiwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChsZXNzPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8Z3JlYXRlcjx0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gPgorPjo6dHlwZQorb3BlcmF0b3I+KGNvbnN0IF9FeHByMSYgX194LCBjb25zdCBfRXhwcjImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByMTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0JpbmFyeU9wPGdyZWF0ZXI8dmFsdWVfdHlwZT4sIF9FeHByMSwgX0V4cHIyPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoZ3JlYXRlcjx2YWx1ZV90eXBlPigpLCBfX3gsIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8Z3JlYXRlcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICBfRXhwciwgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4gPiA+Cis+Ojp0eXBlCitvcGVyYXRvcj4oY29uc3QgX0V4cHImIF9feCwgY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8Z3JlYXRlcjx2YWx1ZV90eXBlPiwgX0V4cHIsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4gPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoZ3JlYXRlcjx2YWx1ZV90eXBlPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX194LCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feSwgX194LnNpemUoKSkpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPGdyZWF0ZXI8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sIF9FeHByPiA+Cis+Ojp0eXBlCitvcGVyYXRvcj4oY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feCwgY29uc3QgX0V4cHImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8Z3JlYXRlcjx2YWx1ZV90eXBlPiwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChncmVhdGVyPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8bGVzc19lcXVhbDx0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gPgorPjo6dHlwZQorb3BlcmF0b3I8PShjb25zdCBfRXhwcjEmIF9feCwgY29uc3QgX0V4cHIyJiBfX3kpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9CaW5hcnlPcDxsZXNzX2VxdWFsPHZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKGxlc3NfZXF1YWw8dmFsdWVfdHlwZT4oKSwgX194LCBfX3kpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPGxlc3NfZXF1YWw8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgX0V4cHIsIF9fc2NhbGFyX2V4cHI8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+ID4gPgorPjo6dHlwZQorb3BlcmF0b3I8PShjb25zdCBfRXhwciYgX194LCBjb25zdCB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSYgX195KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9CaW5hcnlPcDxsZXNzX2VxdWFsPHZhbHVlX3R5cGU+LCBfRXhwciwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiA+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChsZXNzX2VxdWFsPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3gsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4oX195LCBfX3guc2l6ZSgpKSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8bGVzc19lcXVhbDx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiwgX0V4cHI+ID4KKz46OnR5cGUKK29wZXJhdG9yPD0oY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feCwgY29uc3QgX0V4cHImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8bGVzc19lcXVhbDx2YWx1ZV90eXBlPiwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChsZXNzX2VxdWFsPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8Z3JlYXRlcl9lcXVhbDx0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gPgorPjo6dHlwZQorb3BlcmF0b3I+PShjb25zdCBfRXhwcjEmIF9feCwgY29uc3QgX0V4cHIyJiBfX3kpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9CaW5hcnlPcDxncmVhdGVyX2VxdWFsPHZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKGdyZWF0ZXJfZXF1YWw8dmFsdWVfdHlwZT4oKSwgX194LCBfX3kpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPGdyZWF0ZXJfZXF1YWw8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgX0V4cHIsIF9fc2NhbGFyX2V4cHI8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+ID4gPgorPjo6dHlwZQorb3BlcmF0b3I+PShjb25zdCBfRXhwciYgX194LCBjb25zdCB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSYgX195KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9CaW5hcnlPcDxncmVhdGVyX2VxdWFsPHZhbHVlX3R5cGU+LCBfRXhwciwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiA+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChncmVhdGVyX2VxdWFsPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3gsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4oX195LCBfX3guc2l6ZSgpKSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8Z3JlYXRlcl9lcXVhbDx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiwgX0V4cHI+ID4KKz46OnR5cGUKK29wZXJhdG9yPj0oY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feCwgY29uc3QgX0V4cHImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8Z3JlYXRlcl9lcXVhbDx2YWx1ZV90eXBlPiwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChncmVhdGVyX2VxdWFsPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfVW5hcnlPcDxfX2Fic19leHByPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiwgX0V4cHI+ID4KKz46OnR5cGUKK2Ficyhjb25zdCBfRXhwciYgX194KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9VbmFyeU9wPF9fYWJzX2V4cHI8dmFsdWVfdHlwZT4sIF9FeHByPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoX19hYnNfZXhwcjx2YWx1ZV90eXBlPigpLCBfX3gpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X1VuYXJ5T3A8X19hY29zX2V4cHI8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LCBfRXhwcj4gPgorPjo6dHlwZQorYWNvcyhjb25zdCBfRXhwciYgX194KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9VbmFyeU9wPF9fYWNvc19leHByPHZhbHVlX3R5cGU+LCBfRXhwcj4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKF9fYWNvc19leHByPHZhbHVlX3R5cGU+KCksIF9feCkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfVW5hcnlPcDxfX2FzaW5fZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sIF9FeHByPiA+Cis+Ojp0eXBlCithc2luKGNvbnN0IF9FeHByJiBfX3gpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX1VuYXJ5T3A8X19hc2luX2V4cHI8dmFsdWVfdHlwZT4sIF9FeHByPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoX19hc2luX2V4cHI8dmFsdWVfdHlwZT4oKSwgX194KSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9FeHByPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICBfX3ZhbF9leHByPF9VbmFyeU9wPF9fYXRhbl9leHByPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiwgX0V4cHI+ID4KKz46OnR5cGUKK2F0YW4oY29uc3QgX0V4cHImIF9feCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfVW5hcnlPcDxfX2F0YW5fZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChfX2F0YW5fZXhwcjx2YWx1ZV90eXBlPigpLCBfX3gpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHIxLCBjbGFzcyBfRXhwcjI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcjE+Ojp2YWx1ZSAmJiBfX2lzX3ZhbF9leHByPF9FeHByMj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPF9fYXRhbjJfZXhwcjx0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gPgorPjo6dHlwZQorYXRhbjIoY29uc3QgX0V4cHIxJiBfX3gsIGNvbnN0IF9FeHByMiYgX195KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0V4cHIxOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8X19hdGFuMl9leHByPHZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKF9fYXRhbjJfZXhwcjx2YWx1ZV90eXBlPigpLCBfX3gsIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8X19hdGFuMl9leHByPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiwKKyAgICAgICAgICAgICAgIF9FeHByLCBfX3NjYWxhcl9leHByPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiA+ID4KKz46OnR5cGUKK2F0YW4yKGNvbnN0IF9FeHByJiBfX3gsIGNvbnN0IHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlJiBfX3kpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0JpbmFyeU9wPF9fYXRhbjJfZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHIsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4gPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoX19hdGFuMl9leHByPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3gsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4oX195LCBfX3guc2l6ZSgpKSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8X19hdGFuMl9leHByPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiwKKyAgICAgICAgICAgICAgIF9fc2NhbGFyX2V4cHI8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LCBfRXhwcj4gPgorPjo6dHlwZQorYXRhbjIoY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feCwgY29uc3QgX0V4cHImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8X19hdGFuMl9leHByPHZhbHVlX3R5cGU+LCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+LCBfRXhwcj4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKF9fYXRhbjJfZXhwcjx2YWx1ZV90eXBlPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPihfX3gsIF9feS5zaXplKCkpLCBfX3kpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X1VuYXJ5T3A8X19jb3NfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sIF9FeHByPiA+Cis+Ojp0eXBlCitjb3MoY29uc3QgX0V4cHImIF9feCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfVW5hcnlPcDxfX2Nvc19leHByPHZhbHVlX3R5cGU+LCBfRXhwcj4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKF9fY29zX2V4cHI8dmFsdWVfdHlwZT4oKSwgX194KSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9FeHByPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICBfX3ZhbF9leHByPF9VbmFyeU9wPF9fY29zaF9leHByPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiwgX0V4cHI+ID4KKz46OnR5cGUKK2Nvc2goY29uc3QgX0V4cHImIF9feCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfVW5hcnlPcDxfX2Nvc2hfZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChfX2Nvc2hfZXhwcjx2YWx1ZV90eXBlPigpLCBfX3gpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X1VuYXJ5T3A8X19leHBfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sIF9FeHByPiA+Cis+Ojp0eXBlCitleHAoY29uc3QgX0V4cHImIF9feCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfVW5hcnlPcDxfX2V4cF9leHByPHZhbHVlX3R5cGU+LCBfRXhwcj4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKF9fZXhwX2V4cHI8dmFsdWVfdHlwZT4oKSwgX194KSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9FeHByPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICBfX3ZhbF9leHByPF9VbmFyeU9wPF9fbG9nX2V4cHI8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LCBfRXhwcj4gPgorPjo6dHlwZQorbG9nKGNvbnN0IF9FeHByJiBfX3gpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX1VuYXJ5T3A8X19sb2dfZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChfX2xvZ19leHByPHZhbHVlX3R5cGU+KCksIF9feCkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfVW5hcnlPcDxfX2xvZzEwX2V4cHI8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LCBfRXhwcj4gPgorPjo6dHlwZQorbG9nMTAoY29uc3QgX0V4cHImIF9feCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfVW5hcnlPcDxfX2xvZzEwX2V4cHI8dmFsdWVfdHlwZT4sIF9FeHByPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoX19sb2cxMF9leHByPHZhbHVlX3R5cGU+KCksIF9feCkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcjEsIGNsYXNzIF9FeHByMj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByMT46OnZhbHVlICYmIF9faXNfdmFsX2V4cHI8X0V4cHIyPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8X19wb3dfZXhwcjx0eXBlbmFtZSBfRXhwcjE6OnZhbHVlX3R5cGU+LCBfRXhwcjEsIF9FeHByMj4gPgorPjo6dHlwZQorcG93KGNvbnN0IF9FeHByMSYgX194LCBjb25zdCBfRXhwcjImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByMTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0JpbmFyeU9wPF9fcG93X2V4cHI8dmFsdWVfdHlwZT4sIF9FeHByMSwgX0V4cHIyPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoX19wb3dfZXhwcjx2YWx1ZV90eXBlPigpLCBfX3gsIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfQmluYXJ5T3A8X19wb3dfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sCisgICAgICAgICAgICAgICBfRXhwciwgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4gPiA+Cis+Ojp0eXBlCitwb3coY29uc3QgX0V4cHImIF9feCwgY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8X19wb3dfZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHIsIF9fc2NhbGFyX2V4cHI8dmFsdWVfdHlwZT4gPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoX19wb3dfZXhwcjx2YWx1ZV90eXBlPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX194LCBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feSwgX194LnNpemUoKSkpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X0JpbmFyeU9wPF9fcG93X2V4cHI8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgICAgX19zY2FsYXJfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sIF9FeHByPiA+Cis+Ojp0eXBlCitwb3coY29uc3QgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUmIF9feCwgY29uc3QgX0V4cHImIF9feSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQmluYXJ5T3A8X19wb3dfZXhwcjx2YWx1ZV90eXBlPiwgX19zY2FsYXJfZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChfX3Bvd19leHByPHZhbHVlX3R5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjYWxhcl9leHByPHZhbHVlX3R5cGU+KF9feCwgX195LnNpemUoKSksIF9feSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfVW5hcnlPcDxfX3Npbl9leHByPHR5cGVuYW1lIF9FeHByOjp2YWx1ZV90eXBlPiwgX0V4cHI+ID4KKz46OnR5cGUKK3Npbihjb25zdCBfRXhwciYgX194KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9VbmFyeU9wPF9fc2luX2V4cHI8dmFsdWVfdHlwZT4sIF9FeHByPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoX19zaW5fZXhwcjx2YWx1ZV90eXBlPigpLCBfX3gpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0V4cHI+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc192YWxfZXhwcjxfRXhwcj46OnZhbHVlLAorICAgIF9fdmFsX2V4cHI8X1VuYXJ5T3A8X19zaW5oX2V4cHI8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LCBfRXhwcj4gPgorPjo6dHlwZQorc2luaChjb25zdCBfRXhwciYgX194KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9VbmFyeU9wPF9fc2luaF9leHByPHZhbHVlX3R5cGU+LCBfRXhwcj4gX09wOworICAgIHJldHVybiBfX3ZhbF9leHByPF9PcD4oX09wKF9fc2luaF9leHByPHZhbHVlX3R5cGU+KCksIF9feCkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfVW5hcnlPcDxfX3NxcnRfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sIF9FeHByPiA+Cis+Ojp0eXBlCitzcXJ0KGNvbnN0IF9FeHByJiBfX3gpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX1VuYXJ5T3A8X19zcXJ0X2V4cHI8dmFsdWVfdHlwZT4sIF9FeHByPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoX19zcXJ0X2V4cHI8dmFsdWVfdHlwZT4oKSwgX194KSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9FeHByPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfdmFsX2V4cHI8X0V4cHI+Ojp2YWx1ZSwKKyAgICBfX3ZhbF9leHByPF9VbmFyeU9wPF9fdGFuX2V4cHI8dHlwZW5hbWUgX0V4cHI6OnZhbHVlX3R5cGU+LCBfRXhwcj4gPgorPjo6dHlwZQordGFuKGNvbnN0IF9FeHByJiBfX3gpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX1VuYXJ5T3A8X190YW5fZXhwcjx2YWx1ZV90eXBlPiwgX0V4cHI+IF9PcDsKKyAgICByZXR1cm4gX192YWxfZXhwcjxfT3A+KF9PcChfX3Rhbl9leHByPHZhbHVlX3R5cGU+KCksIF9feCkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfRXhwcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX3ZhbF9leHByPF9FeHByPjo6dmFsdWUsCisgICAgX192YWxfZXhwcjxfVW5hcnlPcDxfX3RhbmhfZXhwcjx0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZT4sIF9FeHByPiA+Cis+Ojp0eXBlCit0YW5oKGNvbnN0IF9FeHByJiBfX3gpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfRXhwcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX1VuYXJ5T3A8X190YW5oX2V4cHI8dmFsdWVfdHlwZT4sIF9FeHByPiBfT3A7CisgICAgcmV0dXJuIF9fdmFsX2V4cHI8X09wPihfT3AoX190YW5oX2V4cHI8dmFsdWVfdHlwZT4oKSwgX194KSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwKgorYmVnaW4odmFsYXJyYXk8X1RwPiYgX192KQoreworICAgIHJldHVybiBfX3YuX19iZWdpbl87Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3QgX1RwKgorYmVnaW4oY29uc3QgdmFsYXJyYXk8X1RwPiYgX192KQoreworICAgIHJldHVybiBfX3YuX19iZWdpbl87Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX1RwKgorZW5kKHZhbGFycmF5PF9UcD4mIF9fdikKK3sKKyAgICByZXR1cm4gX192Ll9fZW5kXzsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdCBfVHAqCitlbmQoY29uc3QgdmFsYXJyYXk8X1RwPiYgX192KQoreworICAgIHJldHVybiBfX3YuX19lbmRfOworfQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKK19MSUJDUFBfUE9QX01BQ1JPUworCisjZW5kaWYgIC8vIF9MSUJDUFBfVkFMQVJSQVkKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS92YXJpYW50IGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3ZhcmlhbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwOThmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS92YXJpYW50CkBAIC0wLDAgKzEsMTU5NCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHZhcmlhbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9WQVJJQU5UCisjZGVmaW5lIF9MSUJDUFBfVkFSSUFOVAorCisvKgorICAgdmFyaWFudCBzeW5vcHNpcworCituYW1lc3BhY2Ugc3RkIHsKKworICAvLyAyMC43LjIsIGNsYXNzIHRlbXBsYXRlIHZhcmlhbnQKKyAgdGVtcGxhdGUgPGNsYXNzLi4uIFR5cGVzPgorICBjbGFzcyB2YXJpYW50IHsKKyAgcHVibGljOgorCisgICAgLy8gMjAuNy4yLjEsIGNvbnN0cnVjdG9ycworICAgIGNvbnN0ZXhwciB2YXJpYW50KCkgbm9leGNlcHQoc2VlIGJlbG93KTsKKyAgICB2YXJpYW50KGNvbnN0IHZhcmlhbnQmKTsKKyAgICB2YXJpYW50KHZhcmlhbnQmJikgbm9leGNlcHQoc2VlIGJlbG93KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBjb25zdGV4cHIgdmFyaWFudChUJiYpIG5vZXhjZXB0KHNlZSBiZWxvdyk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MuLi4gQXJncz4KKyAgICBjb25zdGV4cHIgZXhwbGljaXQgdmFyaWFudChpbl9wbGFjZV90eXBlX3Q8VD4sIEFyZ3MmJi4uLik7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MuLi4gQXJncz4KKyAgICBjb25zdGV4cHIgZXhwbGljaXQgdmFyaWFudCgKKyAgICAgICAgaW5fcGxhY2VfdHlwZV90PFQ+LCBpbml0aWFsaXplcl9saXN0PFU+LCBBcmdzJiYuLi4pOworCisgICAgdGVtcGxhdGUgPHNpemVfdCBJLCBjbGFzcy4uLiBBcmdzPgorICAgIGNvbnN0ZXhwciBleHBsaWNpdCB2YXJpYW50KGluX3BsYWNlX2luZGV4X3Q8ST4sIEFyZ3MmJi4uLik7CisKKyAgICB0ZW1wbGF0ZSA8c2l6ZV90IEksIGNsYXNzIFUsIGNsYXNzLi4uIEFyZ3M+CisgICAgY29uc3RleHByIGV4cGxpY2l0IHZhcmlhbnQoCisgICAgICAgIGluX3BsYWNlX2luZGV4X3Q8ST4sIGluaXRpYWxpemVyX2xpc3Q8VT4sIEFyZ3MmJi4uLik7CisKKyAgICAvLyAyMC43LjIuMiwgZGVzdHJ1Y3RvcgorICAgIH52YXJpYW50KCk7CisKKyAgICAvLyAyMC43LjIuMywgYXNzaWdubWVudAorICAgIHZhcmlhbnQmIG9wZXJhdG9yPShjb25zdCB2YXJpYW50Jik7CisgICAgdmFyaWFudCYgb3BlcmF0b3I9KHZhcmlhbnQmJikgbm9leGNlcHQoc2VlIGJlbG93KTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiB2YXJpYW50JiBvcGVyYXRvcj0oVCYmKSBub2V4Y2VwdChzZWUgYmVsb3cpOworCisgICAgLy8gMjAuNy4yLjQsIG1vZGlmaWVycworICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBBcmdzPgorICAgIFQmIGVtcGxhY2UoQXJncyYmLi4uKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcy4uLiBBcmdzPgorICAgIFQmIGVtcGxhY2UoaW5pdGlhbGl6ZXJfbGlzdDxVPiwgQXJncyYmLi4uKTsKKworICAgIHRlbXBsYXRlIDxzaXplX3QgSSwgY2xhc3MuLi4gQXJncz4KKyAgICB2YXJpYW50X2FsdGVybmF0aXZlX3Q8SSwgdmFyaWFudD4mIGVtcGxhY2UoQXJncyYmLi4uKTsKKworICAgIHRlbXBsYXRlIDxzaXplX3QgSSwgY2xhc3MgVSwgY2xhc3MuLi4gIEFyZ3M+CisgICAgdmFyaWFudF9hbHRlcm5hdGl2ZV90PEksIHZhcmlhbnQ+JiBlbXBsYWNlKGluaXRpYWxpemVyX2xpc3Q8VT4sIEFyZ3MmJi4uLik7CisKKyAgICAvLyAyMC43LjIuNSwgdmFsdWUgc3RhdHVzCisgICAgY29uc3RleHByIGJvb2wgdmFsdWVsZXNzX2J5X2V4Y2VwdGlvbigpIGNvbnN0IG5vZXhjZXB0OworICAgIGNvbnN0ZXhwciBzaXplX3QgaW5kZXgoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIC8vIDIwLjcuMi42LCBzd2FwCisgICAgdm9pZCBzd2FwKHZhcmlhbnQmKSBub2V4Y2VwdChzZWUgYmVsb3cpOworICB9OworCisgIC8vIDIwLjcuMywgdmFyaWFudCBoZWxwZXIgY2xhc3NlcworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IHZhcmlhbnRfc2l6ZTsgLy8gdW5kZWZpbmVkCisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIGlubGluZSBjb25zdGV4cHIgc2l6ZV90IHZhcmlhbnRfc2l6ZV92ID0gdmFyaWFudF9zaXplPFQ+Ojp2YWx1ZTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IHZhcmlhbnRfc2l6ZTxjb25zdCBUPjsKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCB2YXJpYW50X3NpemU8dm9sYXRpbGUgVD47CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgdmFyaWFudF9zaXplPGNvbnN0IHZvbGF0aWxlIFQ+OworCisgIHRlbXBsYXRlIDxjbGFzcy4uLiBUeXBlcz4KKyAgc3RydWN0IHZhcmlhbnRfc2l6ZTx2YXJpYW50PFR5cGVzLi4uPj47CisKKyAgdGVtcGxhdGUgPHNpemVfdCBJLCBjbGFzcyBUPiBzdHJ1Y3QgdmFyaWFudF9hbHRlcm5hdGl2ZTsgLy8gdW5kZWZpbmVkCisKKyAgdGVtcGxhdGUgPHNpemVfdCBJLCBjbGFzcyBUPgorICB1c2luZyB2YXJpYW50X2FsdGVybmF0aXZlX3QgPSB0eXBlbmFtZSB2YXJpYW50X2FsdGVybmF0aXZlPEksIFQ+Ojp0eXBlOworCisgIHRlbXBsYXRlIDxzaXplX3QgSSwgY2xhc3MgVD4gc3RydWN0IHZhcmlhbnRfYWx0ZXJuYXRpdmU8SSwgY29uc3QgVD47CisgIHRlbXBsYXRlIDxzaXplX3QgSSwgY2xhc3MgVD4gc3RydWN0IHZhcmlhbnRfYWx0ZXJuYXRpdmU8SSwgdm9sYXRpbGUgVD47CisgIHRlbXBsYXRlIDxzaXplX3QgSSwgY2xhc3MgVD4gc3RydWN0IHZhcmlhbnRfYWx0ZXJuYXRpdmU8SSwgY29uc3Qgdm9sYXRpbGUgVD47CisKKyAgdGVtcGxhdGUgPHNpemVfdCBJLCBjbGFzcy4uLiBUeXBlcz4KKyAgc3RydWN0IHZhcmlhbnRfYWx0ZXJuYXRpdmU8SSwgdmFyaWFudDxUeXBlcy4uLj4+OworCisgIGlubGluZSBjb25zdGV4cHIgc2l6ZV90IHZhcmlhbnRfbnBvcyA9IC0xOworCisgIC8vIDIwLjcuNCwgdmFsdWUgYWNjZXNzCisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBUeXBlcz4KKyAgY29uc3RleHByIGJvb2wgaG9sZHNfYWx0ZXJuYXRpdmUoY29uc3QgdmFyaWFudDxUeXBlcy4uLj4mKSBub2V4Y2VwdDsKKworICB0ZW1wbGF0ZSA8c2l6ZV90IEksIGNsYXNzLi4uIFR5cGVzPgorICBjb25zdGV4cHIgdmFyaWFudF9hbHRlcm5hdGl2ZV90PEksIHZhcmlhbnQ8VHlwZXMuLi4+PiYKKyAgZ2V0KHZhcmlhbnQ8VHlwZXMuLi4+Jik7CisKKyAgdGVtcGxhdGUgPHNpemVfdCBJLCBjbGFzcy4uLiBUeXBlcz4KKyAgY29uc3RleHByIHZhcmlhbnRfYWx0ZXJuYXRpdmVfdDxJLCB2YXJpYW50PFR5cGVzLi4uPj4mJgorICBnZXQodmFyaWFudDxUeXBlcy4uLj4mJik7CisKKyAgdGVtcGxhdGUgPHNpemVfdCBJLCBjbGFzcy4uLiBUeXBlcz4KKyAgY29uc3RleHByIHZhcmlhbnRfYWx0ZXJuYXRpdmVfdDxJLCB2YXJpYW50PFR5cGVzLi4uPj4gY29uc3QmCisgIGdldChjb25zdCB2YXJpYW50PFR5cGVzLi4uPiYpOworCisgIHRlbXBsYXRlIDxzaXplX3QgSSwgY2xhc3MuLi4gVHlwZXM+CisgIGNvbnN0ZXhwciB2YXJpYW50X2FsdGVybmF0aXZlX3Q8SSwgdmFyaWFudDxUeXBlcy4uLj4+IGNvbnN0JiYKKyAgZ2V0KGNvbnN0IHZhcmlhbnQ8VHlwZXMuLi4+JiYpOworCisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiAgVHlwZXM+CisgIGNvbnN0ZXhwciBUJiBnZXQodmFyaWFudDxUeXBlcy4uLj4mKTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MuLi4gVHlwZXM+CisgIGNvbnN0ZXhwciBUJiYgZ2V0KHZhcmlhbnQ8VHlwZXMuLi4+JiYpOworCisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBUeXBlcz4KKyAgY29uc3RleHByIGNvbnN0IFQmIGdldChjb25zdCB2YXJpYW50PFR5cGVzLi4uPiYpOworCisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBUeXBlcz4KKyAgY29uc3RleHByIGNvbnN0IFQmJiBnZXQoY29uc3QgdmFyaWFudDxUeXBlcy4uLj4mJik7CisKKyAgdGVtcGxhdGUgPHNpemVfdCBJLCBjbGFzcy4uLiBUeXBlcz4KKyAgY29uc3RleHByIGFkZF9wb2ludGVyX3Q8dmFyaWFudF9hbHRlcm5hdGl2ZV90PEksIHZhcmlhbnQ8VHlwZXMuLi4+Pj4KKyAgZ2V0X2lmKHZhcmlhbnQ8VHlwZXMuLi4+Kikgbm9leGNlcHQ7CisKKyAgdGVtcGxhdGUgPHNpemVfdCBJLCBjbGFzcy4uLiBUeXBlcz4KKyAgY29uc3RleHByIGFkZF9wb2ludGVyX3Q8Y29uc3QgdmFyaWFudF9hbHRlcm5hdGl2ZV90PEksIHZhcmlhbnQ8VHlwZXMuLi4+Pj4KKyAgZ2V0X2lmKGNvbnN0IHZhcmlhbnQ8VHlwZXMuLi4+Kikgbm9leGNlcHQ7CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzLi4uIFR5cGVzPgorICBjb25zdGV4cHIgYWRkX3BvaW50ZXJfdDxUPgorICBnZXRfaWYodmFyaWFudDxUeXBlcy4uLj4qKSBub2V4Y2VwdDsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MuLi4gVHlwZXM+CisgIGNvbnN0ZXhwciBhZGRfcG9pbnRlcl90PGNvbnN0IFQ+CisgIGdldF9pZihjb25zdCB2YXJpYW50PFR5cGVzLi4uPiopIG5vZXhjZXB0OworCisgIC8vIDIwLjcuNSwgcmVsYXRpb25hbCBvcGVyYXRvcnMKKyAgdGVtcGxhdGUgPGNsYXNzLi4uIFR5cGVzPgorICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHZhcmlhbnQ8VHlwZXMuLi4+JiwgY29uc3QgdmFyaWFudDxUeXBlcy4uLj4mKTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gVHlwZXM+CisgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgdmFyaWFudDxUeXBlcy4uLj4mLCBjb25zdCB2YXJpYW50PFR5cGVzLi4uPiYpOworCisgIHRlbXBsYXRlIDxjbGFzcy4uLiBUeXBlcz4KKyAgY29uc3RleHByIGJvb2wgb3BlcmF0b3I8KGNvbnN0IHZhcmlhbnQ8VHlwZXMuLi4+JiwgY29uc3QgdmFyaWFudDxUeXBlcy4uLj4mKTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gVHlwZXM+CisgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPihjb25zdCB2YXJpYW50PFR5cGVzLi4uPiYsIGNvbnN0IHZhcmlhbnQ8VHlwZXMuLi4+Jik7CisKKyAgdGVtcGxhdGUgPGNsYXNzLi4uIFR5cGVzPgorICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IHZhcmlhbnQ8VHlwZXMuLi4+JiwgY29uc3QgdmFyaWFudDxUeXBlcy4uLj4mKTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gVHlwZXM+CisgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPj0oY29uc3QgdmFyaWFudDxUeXBlcy4uLj4mLCBjb25zdCB2YXJpYW50PFR5cGVzLi4uPiYpOworCisgIC8vIDIwLjcuNiwgdmlzaXRhdGlvbgorICB0ZW1wbGF0ZSA8Y2xhc3MgVmlzaXRvciwgY2xhc3MuLi4gVmFyaWFudHM+CisgIGNvbnN0ZXhwciBzZWUgYmVsb3cgdmlzaXQoVmlzaXRvciYmLCBWYXJpYW50cyYmLi4uKTsKKworICAvLyAyMC43LjcsIGNsYXNzIG1vbm9zdGF0ZQorICBzdHJ1Y3QgbW9ub3N0YXRlOworCisgIC8vIDIwLjcuOCwgbW9ub3N0YXRlIHJlbGF0aW9uYWwgb3BlcmF0b3JzCisgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPChtb25vc3RhdGUsIG1vbm9zdGF0ZSkgbm9leGNlcHQ7CisgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPihtb25vc3RhdGUsIG1vbm9zdGF0ZSkgbm9leGNlcHQ7CisgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPD0obW9ub3N0YXRlLCBtb25vc3RhdGUpIG5vZXhjZXB0OworICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KG1vbm9zdGF0ZSwgbW9ub3N0YXRlKSBub2V4Y2VwdDsKKyAgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShtb25vc3RhdGUsIG1vbm9zdGF0ZSkgbm9leGNlcHQ7CisgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0obW9ub3N0YXRlLCBtb25vc3RhdGUpIG5vZXhjZXB0OworCisgIC8vIDIwLjcuOSwgc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcworICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gVHlwZXM+CisgIHZvaWQgc3dhcCh2YXJpYW50PFR5cGVzLi4uPiYsIHZhcmlhbnQ8VHlwZXMuLi4+Jikgbm9leGNlcHQoc2VlIGJlbG93KTsKKworICAvLyAyMC43LjEwLCBjbGFzcyBiYWRfdmFyaWFudF9hY2Nlc3MKKyAgY2xhc3MgYmFkX3ZhcmlhbnRfYWNjZXNzOworCisgIC8vIDIwLjcuMTEsIGhhc2ggc3VwcG9ydAorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGhhc2g7CisgIHRlbXBsYXRlIDxjbGFzcy4uLiBUeXBlcz4gc3RydWN0IGhhc2g8dmFyaWFudDxUeXBlcy4uLj4+OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaGFzaDxtb25vc3RhdGU+OworCit9IC8vIG5hbWVzcGFjZSBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPF9fdHVwbGU+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX1BVU0hfTUFDUk9TCisjaW5jbHVkZSA8X191bmRlZl9tYWNyb3M+CisKK25hbWVzcGFjZSBzdGQgeyAvLyBleHBsaWNpdGx5IG5vdCB1c2luZyB2ZXJzaW9uaW5nIG5hbWVzcGFjZQorCitjbGFzcyBfTElCQ1BQX0VYQ0VQVElPTl9BQkkgYmFkX3ZhcmlhbnRfYWNjZXNzIDogcHVibGljIGV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9OT0VYQ0VQVDsKK307CisKK30gLy8gbmFtZXNwYWNlIHN0ZAorCitfTElCQ1BQX0JFR0lOX05BTUVTUEFDRV9TVEQKKworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisKK19MSUJDUFBfTk9SRVRVUk4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkIF9fdGhyb3dfYmFkX3ZhcmlhbnRfYWNjZXNzKCkgeworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgdGhyb3cgYmFkX3ZhcmlhbnRfYWNjZXNzKCk7CisjZWxzZQorICAgICAgICBfVlNURDo6YWJvcnQoKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX1R5cGVzPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdmFyaWFudDsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB2YXJpYW50X3NpemU7CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitfTElCQ1BQX0lOTElORV9WQVIgY29uc3RleHByIHNpemVfdCB2YXJpYW50X3NpemVfdiA9IHZhcmlhbnRfc2l6ZTxfVHA+Ojp2YWx1ZTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB2YXJpYW50X3NpemU8Y29uc3QgX1RwPiA6IHZhcmlhbnRfc2l6ZTxfVHA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHZhcmlhbnRfc2l6ZTx2b2xhdGlsZSBfVHA+IDogdmFyaWFudF9zaXplPF9UcD4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgdmFyaWFudF9zaXplPGNvbnN0IHZvbGF0aWxlIF9UcD4KKyAgICA6IHZhcmlhbnRfc2l6ZTxfVHA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX1R5cGVzPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHZhcmlhbnRfc2l6ZTx2YXJpYW50PF9UeXBlcy4uLj4+CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIHNpemVvZi4uLihfVHlwZXMpPiB7fTsKKwordGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB2YXJpYW50X2FsdGVybmF0aXZlOworCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1RwPgordXNpbmcgdmFyaWFudF9hbHRlcm5hdGl2ZV90ID0gdHlwZW5hbWUgdmFyaWFudF9hbHRlcm5hdGl2ZTxfSXAsIF9UcD46OnR5cGU7CisKK3RlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcyBfVHA+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgdmFyaWFudF9hbHRlcm5hdGl2ZTxfSXAsIGNvbnN0IF9UcD4KKyAgICA6IGFkZF9jb25zdDx2YXJpYW50X2FsdGVybmF0aXZlX3Q8X0lwLCBfVHA+PiB7fTsKKwordGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIF9UcD4KK3N0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB2YXJpYW50X2FsdGVybmF0aXZlPF9JcCwgdm9sYXRpbGUgX1RwPgorICAgIDogYWRkX3ZvbGF0aWxlPHZhcmlhbnRfYWx0ZXJuYXRpdmVfdDxfSXAsIF9UcD4+IHt9OworCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1RwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIHZhcmlhbnRfYWx0ZXJuYXRpdmU8X0lwLCBjb25zdCB2b2xhdGlsZSBfVHA+CisgICAgOiBhZGRfY3Y8dmFyaWFudF9hbHRlcm5hdGl2ZV90PF9JcCwgX1RwPj4ge307CisKK3RlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcy4uLiBfVHlwZXM+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgdmFyaWFudF9hbHRlcm5hdGl2ZTxfSXAsIHZhcmlhbnQ8X1R5cGVzLi4uPj4geworICBzdGF0aWNfYXNzZXJ0KF9JcCA8IHNpemVvZi4uLihfVHlwZXMpLCAiSW5kZXggb3V0IG9mIGJvdW5kcyBpbiBzdGQ6OnZhcmlhbnRfYWx0ZXJuYXRpdmU8PiIpOworICB1c2luZyB0eXBlID0gX190eXBlX3BhY2tfZWxlbWVudDxfSXAsIF9UeXBlcy4uLj47Cit9OworCitfTElCQ1BQX0lOTElORV9WQVIgY29uc3RleHByIHNpemVfdCB2YXJpYW50X25wb3MgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KC0xKTsKKworY29uc3RleHByIGludCBfX2Nob29zZV9pbmRleF90eXBlKHVuc2lnbmVkIGludCBfX251bV9lbGVtKSB7CisgIGlmIChfX251bV9lbGVtIDwgc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZCBjaGFyPjo6bWF4KCkpCisgICAgcmV0dXJuIDA7CisgIGlmIChfX251bV9lbGVtIDwgc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZCBzaG9ydD46Om1heCgpKQorICAgIHJldHVybiAxOworICByZXR1cm4gMjsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfTnVtQWx0cz4KK3VzaW5nIF9fdmFyaWFudF9pbmRleF90ID0KKyNpZm5kZWYgX0xJQkNQUF9BQklfVkFSSUFOVF9JTkRFWF9UWVBFX09QVElNSVpBVElPTgorICB1bnNpZ25lZCBpbnQ7CisjZWxzZQorICBzdGQ6OnR1cGxlX2VsZW1lbnRfdDwKKyAgICAgIF9fY2hvb3NlX2luZGV4X3R5cGUoX051bUFsdHMpLAorICAgICAgc3RkOjp0dXBsZTx1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgaW50PgorICA+OworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfSW5kZXhUeXBlPgorY29uc3RleHByIF9JbmRleFR5cGUgX192YXJpYW50X25wb3MgPSBzdGF0aWNfY2FzdDxfSW5kZXhUeXBlPigtMSk7CisKK25hbWVzcGFjZSBfX2ZpbmRfZGV0YWlsIHsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MuLi4gX1R5cGVzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBzaXplX3QgX19maW5kX2luZGV4KCkgeworICBjb25zdGV4cHIgYm9vbCBfX21hdGNoZXNbXSA9IHtpc19zYW1lX3Y8X1RwLCBfVHlwZXM+Li4ufTsKKyAgc2l6ZV90IF9fcmVzdWx0ID0gX19ub3RfZm91bmQ7CisgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHNpemVvZi4uLihfVHlwZXMpOyArK19faSkgeworICAgIGlmIChfX21hdGNoZXNbX19pXSkgeworICAgICAgaWYgKF9fcmVzdWx0ICE9IF9fbm90X2ZvdW5kKSB7CisgICAgICAgIHJldHVybiBfX2FtYmlndW91czsKKyAgICAgIH0KKyAgICAgIF9fcmVzdWx0ID0gX19pOworICAgIH0KKyAgfQorICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX0luZGV4Pgorc3RydWN0IF9fZmluZF91bmFtYmlndW91c19pbmRleF9zZmluYWVfaW1wbAorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8c2l6ZV90LCBfSW5kZXg+IHt9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9fZmluZF91bmFtYmlndW91c19pbmRleF9zZmluYWVfaW1wbDxfX25vdF9mb3VuZD4ge307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX19maW5kX3VuYW1iaWd1b3VzX2luZGV4X3NmaW5hZV9pbXBsPF9fYW1iaWd1b3VzPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MuLi4gX1R5cGVzPgorc3RydWN0IF9fZmluZF91bmFtYmlndW91c19pbmRleF9zZmluYWUKKyAgICA6IF9fZmluZF91bmFtYmlndW91c19pbmRleF9zZmluYWVfaW1wbDxfX2ZpbmRfaW5kZXg8X1RwLCBfVHlwZXMuLi4+KCk+IHt9OworCit9IC8vIG5hbWVzcGFjZSBfX2ZpbmRfZGV0YWlsCisKK25hbWVzcGFjZSBfX3ZhcmlhbnRfZGV0YWlsIHsKKworc3RydWN0IF9fdmFsdWVsZXNzX3Qge307CisKK2VudW0gY2xhc3MgX1RyYWl0IHsgX1RyaXZpYWxseUF2YWlsYWJsZSwgX0F2YWlsYWJsZSwgX1VuYXZhaWxhYmxlIH07CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfVHAsCisgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBfSXNUcml2aWFsbHlBdmFpbGFibGUsCisgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBfSXNBdmFpbGFibGU+Citjb25zdGV4cHIgX1RyYWl0IF9fdHJhaXQgPQorICAgIF9Jc1RyaXZpYWxseUF2YWlsYWJsZTxfVHA+Ojp2YWx1ZQorICAgICAgICA/IF9UcmFpdDo6X1RyaXZpYWxseUF2YWlsYWJsZQorICAgICAgICA6IF9Jc0F2YWlsYWJsZTxfVHA+Ojp2YWx1ZSA/IF9UcmFpdDo6X0F2YWlsYWJsZSA6IF9UcmFpdDo6X1VuYXZhaWxhYmxlOworCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RleHByIF9UcmFpdCBfX2NvbW1vbl90cmFpdChpbml0aWFsaXplcl9saXN0PF9UcmFpdD4gX190cmFpdHMpIHsKKyAgX1RyYWl0IF9fcmVzdWx0ID0gX1RyYWl0OjpfVHJpdmlhbGx5QXZhaWxhYmxlOworICBmb3IgKF9UcmFpdCBfX3QgOiBfX3RyYWl0cykgeworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KF9fdCkgPiBzdGF0aWNfY2FzdDxpbnQ+KF9fcmVzdWx0KSkgeworICAgICAgX19yZXN1bHQgPSBfX3Q7CisgICAgfQorICB9CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lLi4uIF9UeXBlcz4KK3N0cnVjdCBfX3RyYWl0cyB7CisgIHN0YXRpYyBjb25zdGV4cHIgX1RyYWl0IF9fY29weV9jb25zdHJ1Y3RpYmxlX3RyYWl0ID0KKyAgICAgIF9fY29tbW9uX3RyYWl0KHtfX3RyYWl0PF9UeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3RyaXZpYWxseV9jb3B5X2NvbnN0cnVjdGlibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19jb3B5X2NvbnN0cnVjdGlibGU+Li4ufSk7CisKKyAgc3RhdGljIGNvbnN0ZXhwciBfVHJhaXQgX19tb3ZlX2NvbnN0cnVjdGlibGVfdHJhaXQgPQorICAgICAgX19jb21tb25fdHJhaXQoe19fdHJhaXQ8X1R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfdHJpdmlhbGx5X21vdmVfY29uc3RydWN0aWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX21vdmVfY29uc3RydWN0aWJsZT4uLi59KTsKKworICBzdGF0aWMgY29uc3RleHByIF9UcmFpdCBfX2NvcHlfYXNzaWduYWJsZV90cmFpdCA9IF9fY29tbW9uX3RyYWl0KAorICAgICAge19fY29weV9jb25zdHJ1Y3RpYmxlX3RyYWl0LAorICAgICAgIF9fdHJhaXQ8X1R5cGVzLCBpc190cml2aWFsbHlfY29weV9hc3NpZ25hYmxlLCBpc19jb3B5X2Fzc2lnbmFibGU+Li4ufSk7CisKKyAgc3RhdGljIGNvbnN0ZXhwciBfVHJhaXQgX19tb3ZlX2Fzc2lnbmFibGVfdHJhaXQgPSBfX2NvbW1vbl90cmFpdCgKKyAgICAgIHtfX21vdmVfY29uc3RydWN0aWJsZV90cmFpdCwKKyAgICAgICBfX3RyYWl0PF9UeXBlcywgaXNfdHJpdmlhbGx5X21vdmVfYXNzaWduYWJsZSwgaXNfbW92ZV9hc3NpZ25hYmxlPi4uLn0pOworCisgIHN0YXRpYyBjb25zdGV4cHIgX1RyYWl0IF9fZGVzdHJ1Y3RpYmxlX3RyYWl0ID0gX19jb21tb25fdHJhaXQoCisgICAgICB7X190cmFpdDxfVHlwZXMsIGlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGUsIGlzX2Rlc3RydWN0aWJsZT4uLi59KTsKK307CisKK25hbWVzcGFjZSBfX2FjY2VzcyB7CisKK3N0cnVjdCBfX3VuaW9uIHsKKyAgdGVtcGxhdGUgPGNsYXNzIF9WcD4KKyAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvJiYgX19nZXRfYWx0KF9WcCYmIF9fdiwgaW5fcGxhY2VfaW5kZXhfdDwwPikgeworICAgIHJldHVybiBfVlNURDo6Zm9yd2FyZDxfVnA+KF9fdikuX19oZWFkOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9WcCwgc2l6ZV90IF9JcD4KKyAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvJiYgX19nZXRfYWx0KF9WcCYmIF9fdiwgaW5fcGxhY2VfaW5kZXhfdDxfSXA+KSB7CisgICAgcmV0dXJuIF9fZ2V0X2FsdChfVlNURDo6Zm9yd2FyZDxfVnA+KF9fdikuX190YWlsLCBpbl9wbGFjZV9pbmRleDxfSXAgLSAxPik7CisgIH0KK307CisKK3N0cnVjdCBfX2Jhc2UgeworICB0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1ZwPgorICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgY29uc3RleHByIGF1dG8mJiBfX2dldF9hbHQoX1ZwJiYgX192KSB7CisgICAgcmV0dXJuIF9fdW5pb246Ol9fZ2V0X2FsdChfVlNURDo6Zm9yd2FyZDxfVnA+KF9fdikuX19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fcGxhY2VfaW5kZXg8X0lwPik7CisgIH0KK307CisKK3N0cnVjdCBfX3ZhcmlhbnQgeworICB0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1ZwPgorICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgY29uc3RleHByIGF1dG8mJiBfX2dldF9hbHQoX1ZwJiYgX192KSB7CisgICAgcmV0dXJuIF9fYmFzZTo6X19nZXRfYWx0PF9JcD4oX1ZTVEQ6OmZvcndhcmQ8X1ZwPihfX3YpLl9faW1wbCk7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIF9fYWNjZXNzCisKK25hbWVzcGFjZSBfX3Zpc2l0YXRpb24geworCitzdHJ1Y3QgX19iYXNlIHsKKyAgdGVtcGxhdGUgPGNsYXNzIF9WaXNpdG9yLCBjbGFzcy4uLiBfVnM+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHN0YXRpYyBjb25zdGV4cHIgZGVjbHR5cGUoYXV0bykKKyAgX192aXNpdF9hbHRfYXQoc2l6ZV90IF9faW5kZXgsIF9WaXNpdG9yJiYgX192aXNpdG9yLCBfVnMmJi4uLiBfX3ZzKSB7CisgICAgY29uc3RleHByIGF1dG8gX19mZGlhZ29uYWwgPQorICAgICAgICBfX21ha2VfZmRpYWdvbmFsPF9WaXNpdG9yJiYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbHR5cGUoX1ZTVEQ6OmZvcndhcmQ8X1ZzPihfX3ZzKS5fX2FzX2Jhc2UoKSkuLi4+KCk7CisgICAgcmV0dXJuIF9fZmRpYWdvbmFsW19faW5kZXhdKF9WU1REOjpmb3J3YXJkPF9WaXNpdG9yPihfX3Zpc2l0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZDxfVnM+KF9fdnMpLl9fYXNfYmFzZSgpLi4uKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVmlzaXRvciwgY2xhc3MuLi4gX1ZzPgorICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgY29uc3RleHByIGRlY2x0eXBlKGF1dG8pIF9fdmlzaXRfYWx0KF9WaXNpdG9yJiYgX192aXNpdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WcyYmLi4uIF9fdnMpIHsKKyAgICBjb25zdGV4cHIgYXV0byBfX2ZtYXRyaXggPQorICAgICAgICBfX21ha2VfZm1hdHJpeDxfVmlzaXRvciYmLAorICAgICAgICAgICAgICAgICAgICAgICBkZWNsdHlwZShfVlNURDo6Zm9yd2FyZDxfVnM+KF9fdnMpLl9fYXNfYmFzZSgpKS4uLj4oKTsKKyAgICByZXR1cm4gX19hdChfX2ZtYXRyaXgsIF9fdnMuaW5kZXgoKS4uLikoCisgICAgICAgIF9WU1REOjpmb3J3YXJkPF9WaXNpdG9yPihfX3Zpc2l0b3IpLAorICAgICAgICBfVlNURDo6Zm9yd2FyZDxfVnM+KF9fdnMpLl9fYXNfYmFzZSgpLi4uKTsKKyAgfQorCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgY29uc3RleHByIGNvbnN0IF9UcCYgX19hdChjb25zdCBfVHAmIF9fZWxlbSkgeyByZXR1cm4gX19lbGVtOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9OcCwgdHlwZW5hbWUuLi4gX0luZGljZXM+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byYmIF9fYXQoY29uc3QgYXJyYXk8X1RwLCBfTnA+JiBfX2VsZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX2luZGV4LCBfSW5kaWNlcy4uLiBfX2luZGljZXMpIHsKKyAgICByZXR1cm4gX19hdChfX2VsZW1zW19faW5kZXhdLCBfX2luZGljZXMuLi4pOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MuLi4gX0ZzPgorICBzdGF0aWMgY29uc3RleHByIHZvaWQgX19zdGRfdmlzaXRfdmlzaXRvcl9yZXR1cm5fdHlwZV9jaGVjaygpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBfX2FsbDxpc19zYW1lX3Y8X0ZwLCBfRnM+Li4uPjo6dmFsdWUsCisgICAgICAgICJgc3RkOjp2aXNpdGAgcmVxdWlyZXMgdGhlIHZpc2l0b3IgdG8gaGF2ZSBhIHNpbmdsZSByZXR1cm4gdHlwZS4iKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcy4uLiBfRnM+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBfX21ha2VfZmFycmF5KF9GcyYmLi4uIF9fZnMpIHsKKyAgICBfX3N0ZF92aXNpdF92aXNpdG9yX3JldHVybl90eXBlX2NoZWNrPF9fdW5jdnJlZl90PF9Gcz4uLi4+KCk7CisgICAgdXNpbmcgX19yZXN1bHQgPSBhcnJheTxjb21tb25fdHlwZV90PF9fdW5jdnJlZl90PF9Gcz4uLi4+LCBzaXplb2YuLi4oX0ZzKT47CisgICAgcmV0dXJuIF9fcmVzdWx0e3tfVlNURDo6Zm9yd2FyZDxfRnM+KF9fZnMpLi4ufX07CisgIH0KKworICB0ZW1wbGF0ZSA8c3RkOjpzaXplX3QuLi4gX0lzPgorICBzdHJ1Y3QgX19kaXNwYXRjaGVyIHsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcy4uLiBfVnM+CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgY29uc3RleHByIGRlY2x0eXBlKGF1dG8pIF9fZGlzcGF0Y2goX0ZwIF9fZiwgX1ZzLi4uIF9fdnMpIHsKKyAgICAgICAgcmV0dXJuIF9faW52b2tlX2NvbnN0ZXhwcigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PF9GcD4oX19mKSwKKyAgICAgICAgICAgIF9fYWNjZXNzOjpfX2Jhc2U6Ol9fZ2V0X2FsdDxfSXM+KHN0YXRpY19jYXN0PF9Wcz4oX192cykpLi4uKTsKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MuLi4gX1ZzLCBzaXplX3QuLi4gX0lzPgorICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgY29uc3RleHByIGF1dG8gX19tYWtlX2Rpc3BhdGNoKGluZGV4X3NlcXVlbmNlPF9Jcy4uLj4pIHsKKyAgICByZXR1cm4gX19kaXNwYXRjaGVyPF9Jcy4uLj46OnRlbXBsYXRlIF9fZGlzcGF0Y2g8X0ZwLCBfVnMuLi4+OworICB9CisKKyAgdGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIF9GcCwgY2xhc3MuLi4gX1ZzPgorICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgY29uc3RleHByIGF1dG8gX19tYWtlX2ZkaWFnb25hbF9pbXBsKCkgeworICAgIHJldHVybiBfX21ha2VfZGlzcGF0Y2g8X0ZwLCBfVnMuLi4+KAorICAgICAgICBpbmRleF9zZXF1ZW5jZTwoX19pZGVudGl0eTxfVnM+e30sIF9JcCkuLi4+e30pOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MuLi4gX1ZzLCBzaXplX3QuLi4gX0lzPgorICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgY29uc3RleHByIGF1dG8gX19tYWtlX2ZkaWFnb25hbF9pbXBsKGluZGV4X3NlcXVlbmNlPF9Jcy4uLj4pIHsKKyAgICByZXR1cm4gX19iYXNlOjpfX21ha2VfZmFycmF5KF9fbWFrZV9mZGlhZ29uYWxfaW1wbDxfSXMsIF9GcCwgX1ZzLi4uPigpLi4uKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzIF9WcCwgY2xhc3MuLi4gX1ZzPgorICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgY29uc3RleHByIGF1dG8gX19tYWtlX2ZkaWFnb25hbCgpIHsKKyAgICBjb25zdGV4cHIgc2l6ZV90IF9OcCA9IF9fdW5jdnJlZl90PF9WcD46Ol9fc2l6ZSgpOworICAgIHN0YXRpY19hc3NlcnQoX19hbGw8KF9OcCA9PSBfX3VuY3ZyZWZfdDxfVnM+OjpfX3NpemUoKSkuLi4+Ojp2YWx1ZSk7CisgICAgcmV0dXJuIF9fbWFrZV9mZGlhZ29uYWxfaW1wbDxfRnAsIF9WcCwgX1ZzLi4uPihtYWtlX2luZGV4X3NlcXVlbmNlPF9OcD57fSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZwLCBjbGFzcy4uLiBfVnMsIHNpemVfdC4uLiBfSXM+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBfX21ha2VfZm1hdHJpeF9pbXBsKGluZGV4X3NlcXVlbmNlPF9Jcy4uLj4gX19pcykgeworICAgIHJldHVybiBfX21ha2VfZGlzcGF0Y2g8X0ZwLCBfVnMuLi4+KF9faXMpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9GcCwgY2xhc3MuLi4gX1ZzLCBzaXplX3QuLi4gX0lzLCBzaXplX3QuLi4gX0pzLCBjbGFzcy4uLiBfTHM+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBfX21ha2VfZm1hdHJpeF9pbXBsKGluZGV4X3NlcXVlbmNlPF9Jcy4uLj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4X3NlcXVlbmNlPF9Kcy4uLj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Mcy4uLiBfX2xzKSB7CisgICAgcmV0dXJuIF9fYmFzZTo6X19tYWtlX2ZhcnJheShfX21ha2VfZm1hdHJpeF9pbXBsPF9GcCwgX1ZzLi4uPigKKyAgICAgICAgaW5kZXhfc2VxdWVuY2U8X0lzLi4uLCBfSnM+e30sIF9fbHMuLi4pLi4uKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfRnAsIGNsYXNzLi4uIF9Wcz4KKyAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIF9fbWFrZV9mbWF0cml4KCkgeworICAgIHJldHVybiBfX21ha2VfZm1hdHJpeF9pbXBsPF9GcCwgX1ZzLi4uPigKKyAgICAgICAgaW5kZXhfc2VxdWVuY2U8Pnt9LCBtYWtlX2luZGV4X3NlcXVlbmNlPF9fdW5jdnJlZl90PF9Wcz46Ol9fc2l6ZSgpPnt9Li4uKTsKKyAgfQorfTsKKworc3RydWN0IF9fdmFyaWFudCB7CisgIHRlbXBsYXRlIDxjbGFzcyBfVmlzaXRvciwgY2xhc3MuLi4gX1ZzPgorICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgY29uc3RleHByIGRlY2x0eXBlKGF1dG8pCisgIF9fdmlzaXRfYWx0X2F0KHNpemVfdCBfX2luZGV4LCBfVmlzaXRvciYmIF9fdmlzaXRvciwgX1ZzJiYuLi4gX192cykgeworICAgIHJldHVybiBfX2Jhc2U6Ol9fdmlzaXRfYWx0X2F0KF9faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X1Zpc2l0b3I+KF9fdmlzaXRvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X1ZzPihfX3ZzKS5fX2ltcGwuLi4pOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9WaXNpdG9yLCBjbGFzcy4uLiBfVnM+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHN0YXRpYyBjb25zdGV4cHIgZGVjbHR5cGUoYXV0bykgX192aXNpdF9hbHQoX1Zpc2l0b3ImJiBfX3Zpc2l0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZzJiYuLi4gX192cykgeworICAgIHJldHVybiBfX2Jhc2U6Ol9fdmlzaXRfYWx0KF9WU1REOjpmb3J3YXJkPF9WaXNpdG9yPihfX3Zpc2l0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkPF9Wcz4oX192cykuX19pbXBsLi4uKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVmlzaXRvciwgY2xhc3MuLi4gX1ZzPgorICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgY29uc3RleHByIGRlY2x0eXBlKGF1dG8pCisgIF9fdmlzaXRfdmFsdWVfYXQoc2l6ZV90IF9faW5kZXgsIF9WaXNpdG9yJiYgX192aXNpdG9yLCBfVnMmJi4uLiBfX3ZzKSB7CisgICAgcmV0dXJuIF9fdmlzaXRfYWx0X2F0KAorICAgICAgICBfX2luZGV4LAorICAgICAgICBfX21ha2VfdmFsdWVfdmlzaXRvcihfVlNURDo6Zm9yd2FyZDxfVmlzaXRvcj4oX192aXNpdG9yKSksCisgICAgICAgIF9WU1REOjpmb3J3YXJkPF9Wcz4oX192cykuLi4pOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9WaXNpdG9yLCBjbGFzcy4uLiBfVnM+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHN0YXRpYyBjb25zdGV4cHIgZGVjbHR5cGUoYXV0bykgX192aXNpdF92YWx1ZShfVmlzaXRvciYmIF9fdmlzaXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WcyYmLi4uIF9fdnMpIHsKKyAgICByZXR1cm4gX192aXNpdF9hbHQoCisgICAgICAgIF9fbWFrZV92YWx1ZV92aXNpdG9yKF9WU1REOjpmb3J3YXJkPF9WaXNpdG9yPihfX3Zpc2l0b3IpKSwKKyAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X1ZzPihfX3ZzKS4uLik7CisgIH0KKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIF9WaXNpdG9yLCBjbGFzcy4uLiBfVmFsdWVzPgorICBzdGF0aWMgY29uc3RleHByIHZvaWQgX19zdGRfdmlzaXRfZXhoYXVzdGl2ZV92aXNpdG9yX2NoZWNrKCkgeworICAgIHN0YXRpY19hc3NlcnQoaXNfaW52b2NhYmxlX3Y8X1Zpc2l0b3IsIF9WYWx1ZXMuLi4+LAorICAgICAgICAgICAgICAgICAgImBzdGQ6OnZpc2l0YCByZXF1aXJlcyB0aGUgdmlzaXRvciB0byBiZSBleGhhdXN0aXZlLiIpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9WaXNpdG9yPgorICBzdHJ1Y3QgX192YWx1ZV92aXNpdG9yIHsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FsdHM+CisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdGV4cHIgZGVjbHR5cGUoYXV0bykgb3BlcmF0b3IoKShfQWx0cyYmLi4uIF9fYWx0cykgY29uc3QgeworICAgICAgX19zdGRfdmlzaXRfZXhoYXVzdGl2ZV92aXNpdG9yX2NoZWNrPAorICAgICAgICAgIF9WaXNpdG9yLAorICAgICAgICAgIGRlY2x0eXBlKChfVlNURDo6Zm9yd2FyZDxfQWx0cz4oX19hbHRzKS5fX3ZhbHVlKSkuLi4+KCk7CisgICAgICByZXR1cm4gX19pbnZva2VfY29uc3RleHByKF9WU1REOjpmb3J3YXJkPF9WaXNpdG9yPihfX3Zpc2l0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZDxfQWx0cz4oX19hbHRzKS5fX3ZhbHVlLi4uKTsKKyAgICB9CisgICAgX1Zpc2l0b3ImJiBfX3Zpc2l0b3I7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9WaXNpdG9yPgorICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgY29uc3RleHByIGF1dG8gX19tYWtlX3ZhbHVlX3Zpc2l0b3IoX1Zpc2l0b3ImJiBfX3Zpc2l0b3IpIHsKKyAgICByZXR1cm4gX192YWx1ZV92aXNpdG9yPF9WaXNpdG9yPntfVlNURDo6Zm9yd2FyZDxfVmlzaXRvcj4oX192aXNpdG9yKX07CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIF9fdmlzaXRhdGlvbgorCit0ZW1wbGF0ZSA8c2l6ZV90IF9JbmRleCwgY2xhc3MgX1RwPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIF9fYWx0IHsKKyAgdXNpbmcgX192YWx1ZV90eXBlID0gX1RwOworCisgIHRlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KKyAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgZXhwbGljaXQgY29uc3RleHByIF9fYWx0KGluX3BsYWNlX3QsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgOiBfX3ZhbHVlKF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSB7fQorCisgIF9fdmFsdWVfdHlwZSBfX3ZhbHVlOworfTsKKwordGVtcGxhdGUgPF9UcmFpdCBfRGVzdHJ1Y3RpYmxlVHJhaXQsIHNpemVfdCBfSW5kZXgsIGNsYXNzLi4uIF9UeXBlcz4KK3VuaW9uIF9MSUJDUFBfVEVNUExBVEVfVklTIF9fdW5pb247CisKK3RlbXBsYXRlIDxfVHJhaXQgX0Rlc3RydWN0aWJsZVRyYWl0LCBzaXplX3QgX0luZGV4PgordW5pb24gX0xJQkNQUF9URU1QTEFURV9WSVMgX191bmlvbjxfRGVzdHJ1Y3RpYmxlVHJhaXQsIF9JbmRleD4ge307CisKKyNkZWZpbmUgX0xJQkNQUF9WQVJJQU5UX1VOSU9OKGRlc3RydWN0aWJsZV90cmFpdCwgZGVzdHJ1Y3RvcikgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDxzaXplX3QgX0luZGV4LCBjbGFzcyBfVHAsIGNsYXNzLi4uIF9UeXBlcz4gICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bmlvbiBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX3VuaW9uPGRlc3RydWN0aWJsZV90cmFpdCwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UeXBlcy4uLj4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXhwbGljaXQgY29uc3RleHByIF9fdW5pb24oX192YWx1ZWxlc3NfdCkgbm9leGNlcHQgOiBfX2R1bW15e30ge30gICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGV4cGxpY2l0IGNvbnN0ZXhwciBfX3VuaW9uKGluX3BsYWNlX2luZGV4X3Q8MD4sIF9BcmdzJiYuLi4gX19hcmdzKSAgICAgICAgIFwKKyAgICAgICAgOiBfX2hlYWQoaW5fcGxhY2UsIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSB7fSAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcy4uLiBfQXJncz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXhwbGljaXQgY29uc3RleHByIF9fdW5pb24oaW5fcGxhY2VfaW5kZXhfdDxfSXA+LCBfQXJncyYmLi4uIF9fYXJncykgICAgICAgXAorICAgICAgICA6IF9fdGFpbChpbl9wbGFjZV9pbmRleDxfSXAgLSAxPiwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pIHt9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX191bmlvbihjb25zdCBfX3VuaW9uJikgPSBkZWZhdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fdW5pb24oX191bmlvbiYmKSA9IGRlZmF1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVzdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX3VuaW9uJiBvcGVyYXRvcj0oY29uc3QgX191bmlvbiYpID0gZGVmYXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX191bmlvbiYgb3BlcmF0b3I9KF9fdW5pb24mJikgPSBkZWZhdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2hhciBfX2R1bW15OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYWx0PF9JbmRleCwgX1RwPiBfX2hlYWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX3VuaW9uPGRlc3RydWN0aWJsZV90cmFpdCwgX0luZGV4ICsgMSwgX1R5cGVzLi4uPiBfX3RhaWw7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZyaWVuZCBzdHJ1Y3QgX19hY2Nlc3M6Ol9fdW5pb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitfTElCQ1BQX1ZBUklBTlRfVU5JT04oX1RyYWl0OjpfVHJpdmlhbGx5QXZhaWxhYmxlLCB+X191bmlvbigpID0gZGVmYXVsdDspOworX0xJQkNQUF9WQVJJQU5UX1VOSU9OKF9UcmFpdDo6X0F2YWlsYWJsZSwgfl9fdW5pb24oKSB7fSk7CitfTElCQ1BQX1ZBUklBTlRfVU5JT04oX1RyYWl0OjpfVW5hdmFpbGFibGUsIH5fX3VuaW9uKCkgPSBkZWxldGU7KTsKKworI3VuZGVmIF9MSUJDUFBfVkFSSUFOVF9VTklPTgorCit0ZW1wbGF0ZSA8X1RyYWl0IF9EZXN0cnVjdGlibGVUcmFpdCwgY2xhc3MuLi4gX1R5cGVzPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19iYXNlIHsKK3B1YmxpYzoKKyAgdXNpbmcgX19pbmRleF90ID0gX192YXJpYW50X2luZGV4X3Q8c2l6ZW9mLi4uKF9UeXBlcyk+OworCisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGV4cGxpY2l0IGNvbnN0ZXhwciBfX2Jhc2UoX192YWx1ZWxlc3NfdCB0YWcpIG5vZXhjZXB0CisgICAgICA6IF9fZGF0YSh0YWcpLCBfX2luZGV4KF9fdmFyaWFudF9ucG9zPF9faW5kZXhfdD4pIHt9CisKKyAgdGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzLi4uIF9BcmdzPgorICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBleHBsaWNpdCBjb25zdGV4cHIgX19iYXNlKGluX3BsYWNlX2luZGV4X3Q8X0lwPiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICA6CisgICAgICAgIF9fZGF0YShpbl9wbGFjZV9pbmRleDxfSXA+LCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLiksCisgICAgICAgIF9faW5kZXgoX0lwKSB7fQorCisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGNvbnN0ZXhwciBib29sIHZhbHVlbGVzc19ieV9leGNlcHRpb24oKSBjb25zdCBub2V4Y2VwdCB7CisgICAgcmV0dXJuIGluZGV4KCkgPT0gdmFyaWFudF9ucG9zOworICB9CisKKyAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgY29uc3RleHByIHNpemVfdCBpbmRleCgpIGNvbnN0IG5vZXhjZXB0IHsKKyAgICByZXR1cm4gX19pbmRleCA9PSBfX3ZhcmlhbnRfbnBvczxfX2luZGV4X3Q+ID8gdmFyaWFudF9ucG9zIDogX19pbmRleDsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGNvbnN0ZXhwciBhdXRvJiYgX19hc19iYXNlKCkgJiB7IHJldHVybiAqdGhpczsgfQorCisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGNvbnN0ZXhwciBhdXRvJiYgX19hc19iYXNlKCkgJiYgeyByZXR1cm4gX1ZTVEQ6Om1vdmUoKnRoaXMpOyB9CisKKyAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgY29uc3RleHByIGF1dG8mJiBfX2FzX2Jhc2UoKSBjb25zdCAmIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgY29uc3RleHByIGF1dG8mJiBfX2FzX2Jhc2UoKSBjb25zdCAmJiB7IHJldHVybiBfVlNURDo6bW92ZSgqdGhpcyk7IH0KKworICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBfX3NpemUoKSB7IHJldHVybiBzaXplb2YuLi4oX1R5cGVzKTsgfQorCisgIF9fdW5pb248X0Rlc3RydWN0aWJsZVRyYWl0LCAwLCBfVHlwZXMuLi4+IF9fZGF0YTsKKyAgX19pbmRleF90IF9faW5kZXg7CisKKyAgZnJpZW5kIHN0cnVjdCBfX2FjY2Vzczo6X19iYXNlOworICBmcmllbmQgc3RydWN0IF9fdmlzaXRhdGlvbjo6X19iYXNlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcmFpdHMsIF9UcmFpdCA9IF9UcmFpdHM6Ol9fZGVzdHJ1Y3RpYmxlX3RyYWl0PgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19kZXN0cnVjdG9yOworCisjZGVmaW5lIF9MSUJDUFBfVkFSSUFOVF9ERVNUUlVDVE9SKGRlc3RydWN0aWJsZV90cmFpdCwgZGVzdHJ1Y3RvciwgZGVzdHJveSkgICAgXAorICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX1R5cGVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19kZXN0cnVjdG9yPF9fdHJhaXRzPF9UeXBlcy4uLj4sICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJ1Y3RpYmxlX3RyYWl0PiAgICAgICAgICAgICAgICAgXAorICAgICAgOiBwdWJsaWMgX19iYXNlPGRlc3RydWN0aWJsZV90cmFpdCwgX1R5cGVzLi4uPiB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1c2luZyBfX2Jhc2VfdHlwZSA9IF9fYmFzZTxkZXN0cnVjdGlibGVfdHJhaXQsIF9UeXBlcy4uLj47ICAgICAgICAgICAgICAgICBcCisgICAgdXNpbmcgX19pbmRleF90ID0gdHlwZW5hbWUgX19iYXNlX3R5cGU6Ol9faW5kZXhfdDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdXNpbmcgX19iYXNlX3R5cGU6Ol9fYmFzZV90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19kZXN0cnVjdG9yKGNvbnN0IF9fZGVzdHJ1Y3RvciYpID0gZGVmYXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fZGVzdHJ1Y3RvcihfX2Rlc3RydWN0b3ImJikgPSBkZWZhdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZXN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19kZXN0cnVjdG9yJiBvcGVyYXRvcj0oY29uc3QgX19kZXN0cnVjdG9yJikgPSBkZWZhdWx0OyAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fZGVzdHJ1Y3RvciYgb3BlcmF0b3I9KF9fZGVzdHJ1Y3RvciYmKSA9IGRlZmF1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZXN0cm95ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworX0xJQkNQUF9WQVJJQU5UX0RFU1RSVUNUT1IoCisgICAgX1RyYWl0OjpfVHJpdmlhbGx5QXZhaWxhYmxlLAorICAgIH5fX2Rlc3RydWN0b3IoKSA9IGRlZmF1bHQ7LAorICAgIHZvaWQgX19kZXN0cm95KCkgbm9leGNlcHQgeyB0aGlzLT5fX2luZGV4ID0gX192YXJpYW50X25wb3M8X19pbmRleF90PjsgfSk7CisKK19MSUJDUFBfVkFSSUFOVF9ERVNUUlVDVE9SKAorICAgIF9UcmFpdDo6X0F2YWlsYWJsZSwKKyAgICB+X19kZXN0cnVjdG9yKCkgeyBfX2Rlc3Ryb3koKTsgfSwKKyAgICB2b2lkIF9fZGVzdHJveSgpIG5vZXhjZXB0IHsKKyAgICAgIGlmICghdGhpcy0+dmFsdWVsZXNzX2J5X2V4Y2VwdGlvbigpKSB7CisgICAgICAgIF9fdmlzaXRhdGlvbjo6X19iYXNlOjpfX3Zpc2l0X2FsdCgKKyAgICAgICAgICAgIFtdKGF1dG8mIF9fYWx0KSBub2V4Y2VwdCB7CisgICAgICAgICAgICAgIHVzaW5nIF9fYWx0X3R5cGUgPSBfX3VuY3ZyZWZfdDxkZWNsdHlwZShfX2FsdCk+OworICAgICAgICAgICAgICBfX2FsdC5+X19hbHRfdHlwZSgpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICp0aGlzKTsKKyAgICAgIH0KKyAgICAgIHRoaXMtPl9faW5kZXggPSBfX3ZhcmlhbnRfbnBvczxfX2luZGV4X3Q+OworICAgIH0pOworCitfTElCQ1BQX1ZBUklBTlRfREVTVFJVQ1RPUigKKyAgICBfVHJhaXQ6Ol9VbmF2YWlsYWJsZSwKKyAgICB+X19kZXN0cnVjdG9yKCkgPSBkZWxldGU7LAorICAgIHZvaWQgX19kZXN0cm95KCkgbm9leGNlcHQgPSBkZWxldGU7KTsKKworI3VuZGVmIF9MSUJDUFBfVkFSSUFOVF9ERVNUUlVDVE9SCisKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19jb25zdHJ1Y3RvciA6IHB1YmxpYyBfX2Rlc3RydWN0b3I8X1RyYWl0cz4geworICB1c2luZyBfX2Jhc2VfdHlwZSA9IF9fZGVzdHJ1Y3RvcjxfVHJhaXRzPjsKKworcHVibGljOgorICB1c2luZyBfX2Jhc2VfdHlwZTo6X19iYXNlX3R5cGU7CisgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisKK3Byb3RlY3RlZDoKKyAgdGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIF9UcCwgY2xhc3MuLi4gX0FyZ3M+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHN0YXRpYyBfVHAmIF9fY29uc3RydWN0X2FsdChfX2FsdDxfSXAsIF9UcD4mIF9fYSwgX0FyZ3MmJi4uLiBfX2FyZ3MpIHsKKyAgICA6Om5ldyAoKHZvaWQqKV9WU1REOjphZGRyZXNzb2YoX19hKSkKKyAgICAgICAgX19hbHQ8X0lwLCBfVHA+KGluX3BsYWNlLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgcmV0dXJuIF9fYS5fX3ZhbHVlOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9SaHM+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHN0YXRpYyB2b2lkIF9fZ2VuZXJpY19jb25zdHJ1Y3QoX19jb25zdHJ1Y3RvciYgX19saHMsIF9SaHMmJiBfX3JocykgeworICAgIF9fbGhzLl9fZGVzdHJveSgpOworICAgIGlmICghX19yaHMudmFsdWVsZXNzX2J5X2V4Y2VwdGlvbigpKSB7CisgICAgICBfX3Zpc2l0YXRpb246Ol9fYmFzZTo6X192aXNpdF9hbHRfYXQoCisgICAgICAgICAgX19yaHMuaW5kZXgoKSwKKyAgICAgICAgICBbXShhdXRvJiBfX2xoc19hbHQsIGF1dG8mJiBfX3Joc19hbHQpIHsKKyAgICAgICAgICAgIF9fY29uc3RydWN0X2FsdCgKKyAgICAgICAgICAgICAgICBfX2xoc19hbHQsCisgICAgICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8ZGVjbHR5cGUoX19yaHNfYWx0KT4oX19yaHNfYWx0KS5fX3ZhbHVlKTsKKyAgICAgICAgICB9LAorICAgICAgICAgIF9fbGhzLCBfVlNURDo6Zm9yd2FyZDxfUmhzPihfX3JocykpOworICAgICAgX19saHMuX19pbmRleCA9IF9fcmhzLmluZGV4KCk7CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cywgX1RyYWl0ID0gX1RyYWl0czo6X19tb3ZlX2NvbnN0cnVjdGlibGVfdHJhaXQ+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX21vdmVfY29uc3RydWN0b3I7CisKKyNkZWZpbmUgX0xJQkNQUF9WQVJJQU5UX01PVkVfQ09OU1RSVUNUT1IobW92ZV9jb25zdHJ1Y3RpYmxlX3RyYWl0LCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVfY29uc3RydWN0b3IpICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX1R5cGVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19tb3ZlX2NvbnN0cnVjdG9yPF9fdHJhaXRzPF9UeXBlcy4uLj4sICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlX2NvbnN0cnVjdGlibGVfdHJhaXQ+ICAgICBcCisgICAgICA6IHB1YmxpYyBfX2NvbnN0cnVjdG9yPF9fdHJhaXRzPF9UeXBlcy4uLj4+IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVzaW5nIF9fYmFzZV90eXBlID0gX19jb25zdHJ1Y3RvcjxfX3RyYWl0czxfVHlwZXMuLi4+PjsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVzaW5nIF9fYmFzZV90eXBlOjpfX2Jhc2VfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fbW92ZV9jb25zdHJ1Y3Rvcihjb25zdCBfX21vdmVfY29uc3RydWN0b3ImKSA9IGRlZmF1bHQ7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb3ZlX2NvbnN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfl9fbW92ZV9jb25zdHJ1Y3RvcigpID0gZGVmYXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fbW92ZV9jb25zdHJ1Y3RvciYgb3BlcmF0b3I9KGNvbnN0IF9fbW92ZV9jb25zdHJ1Y3RvciYpID0gZGVmYXVsdDsgICAgICAgIFwKKyAgICBfX21vdmVfY29uc3RydWN0b3ImIG9wZXJhdG9yPShfX21vdmVfY29uc3RydWN0b3ImJikgPSBkZWZhdWx0OyAgICAgICAgICAgICBcCisgIH0KKworX0xJQkNQUF9WQVJJQU5UX01PVkVfQ09OU1RSVUNUT1IoCisgICAgX1RyYWl0OjpfVHJpdmlhbGx5QXZhaWxhYmxlLAorICAgIF9fbW92ZV9jb25zdHJ1Y3RvcihfX21vdmVfY29uc3RydWN0b3ImJiBfX3RoYXQpID0gZGVmYXVsdDspOworCitfTElCQ1BQX1ZBUklBTlRfTU9WRV9DT05TVFJVQ1RPUigKKyAgICBfVHJhaXQ6Ol9BdmFpbGFibGUsCisgICAgX19tb3ZlX2NvbnN0cnVjdG9yKF9fbW92ZV9jb25zdHJ1Y3RvciYmIF9fdGhhdCkgbm9leGNlcHQoCisgICAgICAgIF9fYWxsPGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlX3Y8X1R5cGVzPi4uLj46OnZhbHVlKQorICAgICAgICA6IF9fbW92ZV9jb25zdHJ1Y3RvcihfX3ZhbHVlbGVzc190e30pIHsKKyAgICAgIHRoaXMtPl9fZ2VuZXJpY19jb25zdHJ1Y3QoKnRoaXMsIF9WU1REOjptb3ZlKF9fdGhhdCkpOworICAgIH0pOworCitfTElCQ1BQX1ZBUklBTlRfTU9WRV9DT05TVFJVQ1RPUigKKyAgICBfVHJhaXQ6Ol9VbmF2YWlsYWJsZSwKKyAgICBfX21vdmVfY29uc3RydWN0b3IoX19tb3ZlX2NvbnN0cnVjdG9yJiYpID0gZGVsZXRlOyk7CisKKyN1bmRlZiBfTElCQ1BQX1ZBUklBTlRfTU9WRV9DT05TVFJVQ1RPUgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cywgX1RyYWl0ID0gX1RyYWl0czo6X19jb3B5X2NvbnN0cnVjdGlibGVfdHJhaXQ+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2NvcHlfY29uc3RydWN0b3I7CisKKyNkZWZpbmUgX0xJQkNQUF9WQVJJQU5UX0NPUFlfQ09OU1RSVUNUT1IoY29weV9jb25zdHJ1Y3RpYmxlX3RyYWl0LCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlfY29uc3RydWN0b3IpICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX1R5cGVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19jb3B5X2NvbnN0cnVjdG9yPF9fdHJhaXRzPF9UeXBlcy4uLj4sICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5X2NvbnN0cnVjdGlibGVfdHJhaXQ+ICAgICBcCisgICAgICA6IHB1YmxpYyBfX21vdmVfY29uc3RydWN0b3I8X190cmFpdHM8X1R5cGVzLi4uPj4geyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVzaW5nIF9fYmFzZV90eXBlID0gX19tb3ZlX2NvbnN0cnVjdG9yPF9fdHJhaXRzPF9UeXBlcy4uLj4+OyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVzaW5nIF9fYmFzZV90eXBlOjpfX2Jhc2VfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvcHlfY29uc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2NvcHlfY29uc3RydWN0b3IoX19jb3B5X2NvbnN0cnVjdG9yJiYpID0gZGVmYXVsdDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfl9fY29weV9jb25zdHJ1Y3RvcigpID0gZGVmYXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fY29weV9jb25zdHJ1Y3RvciYgb3BlcmF0b3I9KGNvbnN0IF9fY29weV9jb25zdHJ1Y3RvciYpID0gZGVmYXVsdDsgICAgICAgIFwKKyAgICBfX2NvcHlfY29uc3RydWN0b3ImIG9wZXJhdG9yPShfX2NvcHlfY29uc3RydWN0b3ImJikgPSBkZWZhdWx0OyAgICAgICAgICAgICBcCisgIH0KKworX0xJQkNQUF9WQVJJQU5UX0NPUFlfQ09OU1RSVUNUT1IoCisgICAgX1RyYWl0OjpfVHJpdmlhbGx5QXZhaWxhYmxlLAorICAgIF9fY29weV9jb25zdHJ1Y3Rvcihjb25zdCBfX2NvcHlfY29uc3RydWN0b3ImIF9fdGhhdCkgPSBkZWZhdWx0Oyk7CisKK19MSUJDUFBfVkFSSUFOVF9DT1BZX0NPTlNUUlVDVE9SKAorICAgIF9UcmFpdDo6X0F2YWlsYWJsZSwKKyAgICBfX2NvcHlfY29uc3RydWN0b3IoY29uc3QgX19jb3B5X2NvbnN0cnVjdG9yJiBfX3RoYXQpCisgICAgICAgIDogX19jb3B5X2NvbnN0cnVjdG9yKF9fdmFsdWVsZXNzX3R7fSkgeworICAgICAgdGhpcy0+X19nZW5lcmljX2NvbnN0cnVjdCgqdGhpcywgX190aGF0KTsKKyAgICB9KTsKKworX0xJQkNQUF9WQVJJQU5UX0NPUFlfQ09OU1RSVUNUT1IoCisgICAgX1RyYWl0OjpfVW5hdmFpbGFibGUsCisgICAgX19jb3B5X2NvbnN0cnVjdG9yKGNvbnN0IF9fY29weV9jb25zdHJ1Y3RvciYpID0gZGVsZXRlOyk7CisKKyN1bmRlZiBfTElCQ1BQX1ZBUklBTlRfQ09QWV9DT05TVFJVQ1RPUgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9fYXNzaWdubWVudCA6IHB1YmxpYyBfX2NvcHlfY29uc3RydWN0b3I8X1RyYWl0cz4geworICB1c2luZyBfX2Jhc2VfdHlwZSA9IF9fY29weV9jb25zdHJ1Y3RvcjxfVHJhaXRzPjsKKworcHVibGljOgorICB1c2luZyBfX2Jhc2VfdHlwZTo6X19iYXNlX3R5cGU7CisgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisKKyAgdGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzLi4uIF9BcmdzPgorICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBhdXRvJiBfX2VtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpIHsKKyAgICB0aGlzLT5fX2Rlc3Ryb3koKTsKKyAgICBhdXRvJiBfX3JlcyA9IHRoaXMtPl9fY29uc3RydWN0X2FsdChfX2FjY2Vzczo6X19iYXNlOjpfX2dldF9hbHQ8X0lwPigqdGhpcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICB0aGlzLT5fX2luZGV4ID0gX0lwOworICAgIHJldHVybiBfX3JlczsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHRlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHZvaWQgX19hc3NpZ25fYWx0KF9fYWx0PF9JcCwgX1RwPiYgX19hLCBfQXJnJiYgX19hcmcpIHsKKyAgICBpZiAodGhpcy0+aW5kZXgoKSA9PSBfSXApIHsKKyAgICAgIF9fYS5fX3ZhbHVlID0gX1ZTVEQ6OmZvcndhcmQ8X0FyZz4oX19hcmcpOworICAgIH0gZWxzZSB7CisgICAgICBzdHJ1Y3QgeworICAgICAgICB2b2lkIG9wZXJhdG9yKCkodHJ1ZV90eXBlKSBjb25zdCB7CisgICAgICAgICAgX190aGlzLT5fX2VtcGxhY2U8X0lwPihfVlNURDo6Zm9yd2FyZDxfQXJnPihfX2FyZykpOworICAgICAgICB9CisgICAgICAgIHZvaWQgb3BlcmF0b3IoKShmYWxzZV90eXBlKSBjb25zdCB7CisgICAgICAgICAgX190aGlzLT5fX2VtcGxhY2U8X0lwPihfVHAoX1ZTVEQ6OmZvcndhcmQ8X0FyZz4oX19hcmcpKSk7CisgICAgICAgIH0KKyAgICAgICAgX19hc3NpZ25tZW50KiBfX3RoaXM7CisgICAgICAgIF9BcmcmJiBfX2FyZzsKKyAgICAgIH0gX19pbXBse3RoaXMsIF9WU1REOjpmb3J3YXJkPF9Bcmc+KF9fYXJnKX07CisgICAgICBfX2ltcGwoYm9vbF9jb25zdGFudDxpc19ub3Rocm93X2NvbnN0cnVjdGlibGVfdjxfVHAsIF9Bcmc+IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGVfdjxfVHA+Pnt9KTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RoYXQ+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHZvaWQgX19nZW5lcmljX2Fzc2lnbihfVGhhdCYmIF9fdGhhdCkgeworICAgIGlmICh0aGlzLT52YWx1ZWxlc3NfYnlfZXhjZXB0aW9uKCkgJiYgX190aGF0LnZhbHVlbGVzc19ieV9leGNlcHRpb24oKSkgeworICAgICAgLy8gZG8gbm90aGluZy4KKyAgICB9IGVsc2UgaWYgKF9fdGhhdC52YWx1ZWxlc3NfYnlfZXhjZXB0aW9uKCkpIHsKKyAgICAgIHRoaXMtPl9fZGVzdHJveSgpOworICAgIH0gZWxzZSB7CisgICAgICBfX3Zpc2l0YXRpb246Ol9fYmFzZTo6X192aXNpdF9hbHRfYXQoCisgICAgICAgICAgX190aGF0LmluZGV4KCksCisgICAgICAgICAgW3RoaXNdKGF1dG8mIF9fdGhpc19hbHQsIGF1dG8mJiBfX3RoYXRfYWx0KSB7CisgICAgICAgICAgICB0aGlzLT5fX2Fzc2lnbl9hbHQoCisgICAgICAgICAgICAgICAgX190aGlzX2FsdCwKKyAgICAgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZDxkZWNsdHlwZShfX3RoYXRfYWx0KT4oX190aGF0X2FsdCkuX192YWx1ZSk7CisgICAgICAgICAgfSwKKyAgICAgICAgICAqdGhpcywgX1ZTVEQ6OmZvcndhcmQ8X1RoYXQ+KF9fdGhhdCkpOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcmFpdHMsIF9UcmFpdCA9IF9UcmFpdHM6Ol9fbW92ZV9hc3NpZ25hYmxlX3RyYWl0PgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19tb3ZlX2Fzc2lnbm1lbnQ7CisKKyNkZWZpbmUgX0xJQkNQUF9WQVJJQU5UX01PVkVfQVNTSUdOTUVOVChtb3ZlX2Fzc2lnbmFibGVfdHJhaXQsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZV9hc3NpZ25tZW50KSAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX1R5cGVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgX19tb3ZlX2Fzc2lnbm1lbnQ8X190cmFpdHM8X1R5cGVzLi4uPiwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVfYXNzaWduYWJsZV90cmFpdD4gICAgICAgICBcCisgICAgICA6IHB1YmxpYyBfX2Fzc2lnbm1lbnQ8X190cmFpdHM8X1R5cGVzLi4uPj4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVzaW5nIF9fYmFzZV90eXBlID0gX19hc3NpZ25tZW50PF9fdHJhaXRzPF9UeXBlcy4uLj4+OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVzaW5nIF9fYmFzZV90eXBlOjpfX2Jhc2VfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fbW92ZV9hc3NpZ25tZW50KGNvbnN0IF9fbW92ZV9hc3NpZ25tZW50JikgPSBkZWZhdWx0OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX21vdmVfYXNzaWdubWVudChfX21vdmVfYXNzaWdubWVudCYmKSA9IGRlZmF1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfl9fbW92ZV9hc3NpZ25tZW50KCkgPSBkZWZhdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fbW92ZV9hc3NpZ25tZW50JiBvcGVyYXRvcj0oY29uc3QgX19tb3ZlX2Fzc2lnbm1lbnQmKSA9IGRlZmF1bHQ7ICAgICAgICAgIFwKKyAgICBtb3ZlX2Fzc2lnbm1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworX0xJQkNQUF9WQVJJQU5UX01PVkVfQVNTSUdOTUVOVCgKKyAgICBfVHJhaXQ6Ol9Ucml2aWFsbHlBdmFpbGFibGUsCisgICAgX19tb3ZlX2Fzc2lnbm1lbnQmIG9wZXJhdG9yPShfX21vdmVfYXNzaWdubWVudCYmIF9fdGhhdCkgPSBkZWZhdWx0Oyk7CisKK19MSUJDUFBfVkFSSUFOVF9NT1ZFX0FTU0lHTk1FTlQoCisgICAgX1RyYWl0OjpfQXZhaWxhYmxlLAorICAgIF9fbW92ZV9hc3NpZ25tZW50JiBvcGVyYXRvcj0oX19tb3ZlX2Fzc2lnbm1lbnQmJiBfX3RoYXQpIG5vZXhjZXB0KAorICAgICAgICBfX2FsbDwoaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGVfdjxfVHlwZXM+ICYmCisgICAgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZV92PF9UeXBlcz4pLi4uPjo6dmFsdWUpIHsKKyAgICAgIHRoaXMtPl9fZ2VuZXJpY19hc3NpZ24oX1ZTVEQ6Om1vdmUoX190aGF0KSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfSk7CisKK19MSUJDUFBfVkFSSUFOVF9NT1ZFX0FTU0lHTk1FTlQoCisgICAgX1RyYWl0OjpfVW5hdmFpbGFibGUsCisgICAgX19tb3ZlX2Fzc2lnbm1lbnQmIG9wZXJhdG9yPShfX21vdmVfYXNzaWdubWVudCYmKSA9IGRlbGV0ZTspOworCisjdW5kZWYgX0xJQkNQUF9WQVJJQU5UX01PVkVfQVNTSUdOTUVOVAorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cywgX1RyYWl0ID0gX1RyYWl0czo6X19jb3B5X2Fzc2lnbmFibGVfdHJhaXQ+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2NvcHlfYXNzaWdubWVudDsKKworI2RlZmluZSBfTElCQ1BQX1ZBUklBTlRfQ09QWV9BU1NJR05NRU5UKGNvcHlfYXNzaWduYWJsZV90cmFpdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5X2Fzc2lnbm1lbnQpICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDxjbGFzcy4uLiBfVHlwZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBfX2NvcHlfYXNzaWdubWVudDxfX3RyYWl0czxfVHlwZXMuLi4+LCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weV9hc3NpZ25hYmxlX3RyYWl0PiAgICAgICAgIFwKKyAgICAgIDogcHVibGljIF9fbW92ZV9hc3NpZ25tZW50PF9fdHJhaXRzPF9UeXBlcy4uLj4+IHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdXNpbmcgX19iYXNlX3R5cGUgPSBfX21vdmVfYXNzaWdubWVudDxfX3RyYWl0czxfVHlwZXMuLi4+PjsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdXNpbmcgX19iYXNlX3R5cGU6Ol9fYmFzZV90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19jb3B5X2Fzc2lnbm1lbnQoY29uc3QgX19jb3B5X2Fzc2lnbm1lbnQmKSA9IGRlZmF1bHQ7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fY29weV9hc3NpZ25tZW50KF9fY29weV9hc3NpZ25tZW50JiYpID0gZGVmYXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB+X19jb3B5X2Fzc2lnbm1lbnQoKSA9IGRlZmF1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29weV9hc3NpZ25tZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fY29weV9hc3NpZ25tZW50JiBvcGVyYXRvcj0oX19jb3B5X2Fzc2lnbm1lbnQmJikgPSBkZWZhdWx0OyAgICAgICAgICAgICAgIFwKKyAgfQorCitfTElCQ1BQX1ZBUklBTlRfQ09QWV9BU1NJR05NRU5UKAorICAgIF9UcmFpdDo6X1RyaXZpYWxseUF2YWlsYWJsZSwKKyAgICBfX2NvcHlfYXNzaWdubWVudCYgb3BlcmF0b3I9KGNvbnN0IF9fY29weV9hc3NpZ25tZW50JiBfX3RoYXQpID0gZGVmYXVsdDspOworCitfTElCQ1BQX1ZBUklBTlRfQ09QWV9BU1NJR05NRU5UKAorICAgIF9UcmFpdDo6X0F2YWlsYWJsZSwKKyAgICBfX2NvcHlfYXNzaWdubWVudCYgb3BlcmF0b3I9KGNvbnN0IF9fY29weV9hc3NpZ25tZW50JiBfX3RoYXQpIHsKKyAgICAgIHRoaXMtPl9fZ2VuZXJpY19hc3NpZ24oX190aGF0KTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9KTsKKworX0xJQkNQUF9WQVJJQU5UX0NPUFlfQVNTSUdOTUVOVCgKKyAgICBfVHJhaXQ6Ol9VbmF2YWlsYWJsZSwKKyAgICBfX2NvcHlfYXNzaWdubWVudCYgb3BlcmF0b3I9KGNvbnN0IF9fY29weV9hc3NpZ25tZW50JikgPSBkZWxldGU7KTsKKworI3VuZGVmIF9MSUJDUFBfVkFSSUFOVF9DT1BZX0FTU0lHTk1FTlQKKwordGVtcGxhdGUgPGNsYXNzLi4uIF9UeXBlcz4KK2NsYXNzIF9MSUJDUFBfVEVNUExBVEVfVklTIF9faW1wbAorICAgIDogcHVibGljIF9fY29weV9hc3NpZ25tZW50PF9fdHJhaXRzPF9UeXBlcy4uLj4+IHsKKyAgdXNpbmcgX19iYXNlX3R5cGUgPSBfX2NvcHlfYXNzaWdubWVudDxfX3RyYWl0czxfVHlwZXMuLi4+PjsKKworcHVibGljOgorICB1c2luZyBfX2Jhc2VfdHlwZTo6X19iYXNlX3R5cGU7CisgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisKKyAgdGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIF9Bcmc+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHZvaWQgX19hc3NpZ24oX0FyZyYmIF9fYXJnKSB7CisgICAgdGhpcy0+X19hc3NpZ25fYWx0KF9fYWNjZXNzOjpfX2Jhc2U6Ol9fZ2V0X2FsdDxfSXA+KCp0aGlzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6OmZvcndhcmQ8X0FyZz4oX19hcmcpKTsKKyAgfQorCisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHZvaWQgX19zd2FwKF9faW1wbCYgX190aGF0KSAgeworICAgIGlmICh0aGlzLT52YWx1ZWxlc3NfYnlfZXhjZXB0aW9uKCkgJiYgX190aGF0LnZhbHVlbGVzc19ieV9leGNlcHRpb24oKSkgeworICAgICAgLy8gZG8gbm90aGluZy4KKyAgICB9IGVsc2UgaWYgKHRoaXMtPmluZGV4KCkgPT0gX190aGF0LmluZGV4KCkpIHsKKyAgICAgIF9fdmlzaXRhdGlvbjo6X19iYXNlOjpfX3Zpc2l0X2FsdF9hdCgKKyAgICAgICAgICB0aGlzLT5pbmRleCgpLAorICAgICAgICAgIFtdKGF1dG8mIF9fdGhpc19hbHQsIGF1dG8mIF9fdGhhdF9hbHQpIHsKKyAgICAgICAgICAgIHVzaW5nIF9WU1REOjpzd2FwOworICAgICAgICAgICAgc3dhcChfX3RoaXNfYWx0Ll9fdmFsdWUsIF9fdGhhdF9hbHQuX192YWx1ZSk7CisgICAgICAgICAgfSwKKyAgICAgICAgICAqdGhpcywKKyAgICAgICAgICBfX3RoYXQpOworICAgIH0gZWxzZSB7CisgICAgICBfX2ltcGwqIF9fbGhzID0gdGhpczsKKyAgICAgIF9faW1wbCogX19yaHMgPSBfVlNURDo6YWRkcmVzc29mKF9fdGhhdCk7CisgICAgICBpZiAoX19saHMtPl9fbW92ZV9ub3Rocm93KCkgJiYgIV9fcmhzLT5fX21vdmVfbm90aHJvdygpKSB7CisgICAgICAgIF9WU1REOjpzd2FwKF9fbGhzLCBfX3Jocyk7CisgICAgICB9CisgICAgICBfX2ltcGwgX190bXAoX1ZTVEQ6Om1vdmUoKl9fcmhzKSk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgLy8gRVhURU5TSU9OOiBXaGVuIHRoZSBtb3ZlIGNvbnN0cnVjdGlvbiBvZiBgX19saHNgIGludG8gYF9fcmhzYCB0aHJvd3MKKyAgICAgIC8vIGFuZCBgX190bXBgIGlzIG5vdGhyb3cgbW92ZSBjb25zdHJ1Y3RpYmxlIHRoZW4gd2UgbW92ZSBgX190bXBgIGJhY2sKKyAgICAgIC8vIGludG8gYF9fcmhzYCBhbmQgcHJvdmlkZSB0aGUgc3Ryb25nIGV4Y2VwdGlvbiBzYWZldHkgZ3VhcmVudGVlLgorICAgICAgdHJ5IHsKKyAgICAgICAgdGhpcy0+X19nZW5lcmljX2NvbnN0cnVjdCgqX19yaHMsIF9WU1REOjptb3ZlKCpfX2xocykpOworICAgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAgIGlmIChfX3RtcC5fX21vdmVfbm90aHJvdygpKSB7CisgICAgICAgICAgdGhpcy0+X19nZW5lcmljX2NvbnN0cnVjdCgqX19yaHMsIF9WU1REOjptb3ZlKF9fdG1wKSk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3c7CisgICAgICB9CisjZWxzZQorICAgICAgdGhpcy0+X19nZW5lcmljX2NvbnN0cnVjdCgqX19yaHMsIF9WU1REOjptb3ZlKCpfX2xocykpOworI2VuZGlmCisgICAgICB0aGlzLT5fX2dlbmVyaWNfY29uc3RydWN0KCpfX2xocywgX1ZTVEQ6Om1vdmUoX190bXApKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgYm9vbCBfX21vdmVfbm90aHJvdygpIGNvbnN0IHsKKyAgICBjb25zdGV4cHIgYm9vbCBfX3Jlc3VsdHNbXSA9IHtpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZV92PF9UeXBlcz4uLi59OworICAgIHJldHVybiB0aGlzLT52YWx1ZWxlc3NfYnlfZXhjZXB0aW9uKCkgfHwgX19yZXN1bHRzW3RoaXMtPmluZGV4KCldOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX1R5cGVzPgorc3RydWN0IF9fb3ZlcmxvYWQ7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX19vdmVybG9hZDw+IHsgdm9pZCBvcGVyYXRvcigpKCkgY29uc3Q7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzLi4uIF9UeXBlcz4KK3N0cnVjdCBfX292ZXJsb2FkPF9UcCwgX1R5cGVzLi4uPiA6IF9fb3ZlcmxvYWQ8X1R5cGVzLi4uPiB7CisgIHVzaW5nIF9fb3ZlcmxvYWQ8X1R5cGVzLi4uPjo6b3BlcmF0b3IoKTsKKyAgX19pZGVudGl0eTxfVHA+IG9wZXJhdG9yKCkoX1RwKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzLi4uIF9UeXBlcz4KK3VzaW5nIF9fYmVzdF9tYXRjaF90ID0gdHlwZW5hbWUgcmVzdWx0X29mX3Q8X19vdmVybG9hZDxfVHlwZXMuLi4+KF9UcCYmKT46OnR5cGU7CisKK30gLy8gX192YXJpYW50X2RldGFpbAorCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX1R5cGVzPgorY2xhc3MgX0xJQkNQUF9URU1QTEFURV9WSVMgdmFyaWFudAorICAgIDogcHJpdmF0ZSBfX3NmaW5hZV9jdG9yX2Jhc2U8CisgICAgICAgICAgX19hbGw8aXNfY29weV9jb25zdHJ1Y3RpYmxlX3Y8X1R5cGVzPi4uLj46OnZhbHVlLAorICAgICAgICAgIF9fYWxsPGlzX21vdmVfY29uc3RydWN0aWJsZV92PF9UeXBlcz4uLi4+Ojp2YWx1ZT4sCisgICAgICBwcml2YXRlIF9fc2ZpbmFlX2Fzc2lnbl9iYXNlPAorICAgICAgICAgIF9fYWxsPChpc19jb3B5X2NvbnN0cnVjdGlibGVfdjxfVHlwZXM+ICYmCisgICAgICAgICAgICAgICAgIGlzX2NvcHlfYXNzaWduYWJsZV92PF9UeXBlcz4pLi4uPjo6dmFsdWUsCisgICAgICAgICAgX19hbGw8KGlzX21vdmVfY29uc3RydWN0aWJsZV92PF9UeXBlcz4gJiYKKyAgICAgICAgICAgICAgICAgaXNfbW92ZV9hc3NpZ25hYmxlX3Y8X1R5cGVzPikuLi4+Ojp2YWx1ZT4geworICBzdGF0aWNfYXNzZXJ0KDAgPCBzaXplb2YuLi4oX1R5cGVzKSwKKyAgICAgICAgICAgICAgICAidmFyaWFudCBtdXN0IGNvbnNpc3Qgb2YgYXQgbGVhc3Qgb25lIGFsdGVybmF0aXZlLiIpOworCisgIHN0YXRpY19hc3NlcnQoX19hbGw8IWlzX2FycmF5X3Y8X1R5cGVzPi4uLj46OnZhbHVlLAorICAgICAgICAgICAgICAgICJ2YXJpYW50IGNhbiBub3QgaGF2ZSBhbiBhcnJheSB0eXBlIGFzIGFuIGFsdGVybmF0aXZlLiIpOworCisgIHN0YXRpY19hc3NlcnQoX19hbGw8IWlzX3JlZmVyZW5jZV92PF9UeXBlcz4uLi4+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAidmFyaWFudCBjYW4gbm90IGhhdmUgYSByZWZlcmVuY2UgdHlwZSBhcyBhbiBhbHRlcm5hdGl2ZS4iKTsKKworICBzdGF0aWNfYXNzZXJ0KF9fYWxsPCFpc192b2lkX3Y8X1R5cGVzPi4uLj46OnZhbHVlLAorICAgICAgICAgICAgICAgICJ2YXJpYW50IGNhbiBub3QgaGF2ZSBhIHZvaWQgdHlwZSBhcyBhbiBhbHRlcm5hdGl2ZS4iKTsKKworICB1c2luZyBfX2ZpcnN0X3R5cGUgPSB2YXJpYW50X2FsdGVybmF0aXZlX3Q8MCwgdmFyaWFudD47CisKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPGJvb2wgX0R1bW15ID0gdHJ1ZSwKKyAgICAgICAgICAgIGVuYWJsZV9pZl90PF9fZGVwZW5kZW50X3R5cGU8aXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9fZmlyc3RfdHlwZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EdW1teT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50PiA9IDA+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGNvbnN0ZXhwciB2YXJpYW50KCkgbm9leGNlcHQoaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGVfdjxfX2ZpcnN0X3R5cGU+KQorICAgICAgOiBfX2ltcGwoaW5fcGxhY2VfaW5kZXg8MD4pIHt9CisKKyAgdmFyaWFudChjb25zdCB2YXJpYW50JikgPSBkZWZhdWx0OworICB2YXJpYW50KHZhcmlhbnQmJikgPSBkZWZhdWx0OworCisgIHRlbXBsYXRlIDwKKyAgICAgIGNsYXNzIF9BcmcsCisgICAgICBlbmFibGVfaWZfdDwhaXNfc2FtZV92PF9fdW5jdnJlZl90PF9Bcmc+LCB2YXJpYW50PiwgaW50PiA9IDAsCisgICAgICBlbmFibGVfaWZfdDwhX19pc19pbnBsYWNlX3R5cGU8X191bmN2cmVmX3Q8X0FyZz4+Ojp2YWx1ZSwgaW50PiA9IDAsCisgICAgICBlbmFibGVfaWZfdDwhX19pc19pbnBsYWNlX2luZGV4PF9fdW5jdnJlZl90PF9Bcmc+Pjo6dmFsdWUsIGludD4gPSAwLAorICAgICAgY2xhc3MgX1RwID0gX192YXJpYW50X2RldGFpbDo6X19iZXN0X21hdGNoX3Q8X0FyZywgX1R5cGVzLi4uPiwKKyAgICAgIHNpemVfdCBfSXAgPQorICAgICAgICAgIF9fZmluZF9kZXRhaWw6Ol9fZmluZF91bmFtYmlndW91c19pbmRleF9zZmluYWU8X1RwLCBfVHlwZXMuLi4+Ojp2YWx1ZSwKKyAgICAgIGVuYWJsZV9pZl90PGlzX2NvbnN0cnVjdGlibGVfdjxfVHAsIF9Bcmc+LCBpbnQ+ID0gMD4KKyAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgY29uc3RleHByIHZhcmlhbnQoX0FyZyYmIF9fYXJnKSBub2V4Y2VwdCgKKyAgICAgIGlzX25vdGhyb3dfY29uc3RydWN0aWJsZV92PF9UcCwgX0FyZz4pCisgICAgICA6IF9faW1wbChpbl9wbGFjZV9pbmRleDxfSXA+LCBfVlNURDo6Zm9yd2FyZDxfQXJnPihfX2FyZykpIHt9CisKKyAgdGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzLi4uIF9BcmdzLAorICAgICAgICAgICAgY2xhc3MgPSBlbmFibGVfaWZfdDwoX0lwIDwgc2l6ZW9mLi4uKF9UeXBlcykpLCBpbnQ+LAorICAgICAgICAgICAgY2xhc3MgX1RwID0gdmFyaWFudF9hbHRlcm5hdGl2ZV90PF9JcCwgdmFyaWFudDxfVHlwZXMuLi4+PiwKKyAgICAgICAgICAgIGVuYWJsZV9pZl90PGlzX2NvbnN0cnVjdGlibGVfdjxfVHAsIF9BcmdzLi4uPiwgaW50PiA9IDA+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGV4cGxpY2l0IGNvbnN0ZXhwciB2YXJpYW50KAorICAgICAgaW5fcGxhY2VfaW5kZXhfdDxfSXA+LAorICAgICAgX0FyZ3MmJi4uLiBfX2FyZ3MpIG5vZXhjZXB0KGlzX25vdGhyb3dfY29uc3RydWN0aWJsZV92PF9UcCwgX0FyZ3MuLi4+KQorICAgICAgOiBfX2ltcGwoaW5fcGxhY2VfaW5kZXg8X0lwPiwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pIHt9CisKKyAgdGVtcGxhdGUgPAorICAgICAgc2l6ZV90IF9JcCwKKyAgICAgIGNsYXNzIF9VcCwKKyAgICAgIGNsYXNzLi4uIF9BcmdzLAorICAgICAgZW5hYmxlX2lmX3Q8KF9JcCA8IHNpemVvZi4uLihfVHlwZXMpKSwgaW50PiA9IDAsCisgICAgICBjbGFzcyBfVHAgPSB2YXJpYW50X2FsdGVybmF0aXZlX3Q8X0lwLCB2YXJpYW50PF9UeXBlcy4uLj4+LAorICAgICAgZW5hYmxlX2lmX3Q8aXNfY29uc3RydWN0aWJsZV92PF9UcCwgaW5pdGlhbGl6ZXJfbGlzdDxfVXA+JiwgX0FyZ3MuLi4+LAorICAgICAgICAgICAgICAgICAgaW50PiA9IDA+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGV4cGxpY2l0IGNvbnN0ZXhwciB2YXJpYW50KAorICAgICAgaW5fcGxhY2VfaW5kZXhfdDxfSXA+LAorICAgICAgaW5pdGlhbGl6ZXJfbGlzdDxfVXA+IF9faWwsCisgICAgICBfQXJncyYmLi4uIF9fYXJncykgbm9leGNlcHQoCisgICAgICBpc19ub3Rocm93X2NvbnN0cnVjdGlibGVfdjxfVHAsIGluaXRpYWxpemVyX2xpc3Q8X1VwPiYsIF9BcmdzLi4uPikKKyAgICAgIDogX19pbXBsKGluX3BsYWNlX2luZGV4PF9JcD4sIF9faWwsIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSB7fQorCisgIHRlbXBsYXRlIDwKKyAgICAgIGNsYXNzIF9UcCwKKyAgICAgIGNsYXNzLi4uIF9BcmdzLAorICAgICAgc2l6ZV90IF9JcCA9CisgICAgICAgICAgX19maW5kX2RldGFpbDo6X19maW5kX3VuYW1iaWd1b3VzX2luZGV4X3NmaW5hZTxfVHAsIF9UeXBlcy4uLj46OnZhbHVlLAorICAgICAgZW5hYmxlX2lmX3Q8aXNfY29uc3RydWN0aWJsZV92PF9UcCwgX0FyZ3MuLi4+LCBpbnQ+ID0gMD4KKyAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgZXhwbGljaXQgY29uc3RleHByIHZhcmlhbnQoaW5fcGxhY2VfdHlwZV90PF9UcD4sIF9BcmdzJiYuLi4gX19hcmdzKSBub2V4Y2VwdCgKKyAgICAgIGlzX25vdGhyb3dfY29uc3RydWN0aWJsZV92PF9UcCwgX0FyZ3MuLi4+KQorICAgICAgOiBfX2ltcGwoaW5fcGxhY2VfaW5kZXg8X0lwPiwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pIHt9CisKKyAgdGVtcGxhdGUgPAorICAgICAgY2xhc3MgX1RwLAorICAgICAgY2xhc3MgX1VwLAorICAgICAgY2xhc3MuLi4gX0FyZ3MsCisgICAgICBzaXplX3QgX0lwID0KKyAgICAgICAgICBfX2ZpbmRfZGV0YWlsOjpfX2ZpbmRfdW5hbWJpZ3VvdXNfaW5kZXhfc2ZpbmFlPF9UcCwgX1R5cGVzLi4uPjo6dmFsdWUsCisgICAgICBlbmFibGVfaWZfdDxpc19jb25zdHJ1Y3RpYmxlX3Y8X1RwLCBpbml0aWFsaXplcl9saXN0PF9VcD4mLCBfQXJncy4uLj4sCisgICAgICAgICAgICAgICAgICBpbnQ+ID0gMD4KKyAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgZXhwbGljaXQgY29uc3RleHByIHZhcmlhbnQoCisgICAgICBpbl9wbGFjZV90eXBlX3Q8X1RwPiwKKyAgICAgIGluaXRpYWxpemVyX2xpc3Q8X1VwPiBfX2lsLAorICAgICAgX0FyZ3MmJi4uLiBfX2FyZ3MpIG5vZXhjZXB0KAorICAgICAgaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlX3Y8X1RwLCBpbml0aWFsaXplcl9saXN0PCBfVXA+JiwgX0FyZ3MuLi4+KQorICAgICAgOiBfX2ltcGwoaW5fcGxhY2VfaW5kZXg8X0lwPiwgX19pbCwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pIHt9CisKKyAgfnZhcmlhbnQoKSA9IGRlZmF1bHQ7CisKKyAgdmFyaWFudCYgb3BlcmF0b3I9KGNvbnN0IHZhcmlhbnQmKSA9IGRlZmF1bHQ7CisgIHZhcmlhbnQmIG9wZXJhdG9yPSh2YXJpYW50JiYpID0gZGVmYXVsdDsKKworICB0ZW1wbGF0ZSA8CisgICAgICBjbGFzcyBfQXJnLAorICAgICAgZW5hYmxlX2lmX3Q8IWlzX3NhbWVfdjxfX3VuY3ZyZWZfdDxfQXJnPiwgdmFyaWFudD4sIGludD4gPSAwLAorICAgICAgY2xhc3MgX1RwID0gX192YXJpYW50X2RldGFpbDo6X19iZXN0X21hdGNoX3Q8X0FyZywgX1R5cGVzLi4uPiwKKyAgICAgIHNpemVfdCBfSXAgPQorICAgICAgICAgIF9fZmluZF9kZXRhaWw6Ol9fZmluZF91bmFtYmlndW91c19pbmRleF9zZmluYWU8X1RwLCBfVHlwZXMuLi4+Ojp2YWx1ZSwKKyAgICAgIGVuYWJsZV9pZl90PGlzX2Fzc2lnbmFibGVfdjxfVHAmLCBfQXJnPiAmJiBpc19jb25zdHJ1Y3RpYmxlX3Y8X1RwLCBfQXJnPiwKKyAgICAgICAgICAgICAgICAgIGludD4gPSAwPgorICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICB2YXJpYW50JiBvcGVyYXRvcj0oX0FyZyYmIF9fYXJnKSBub2V4Y2VwdCgKKyAgICAgIGlzX25vdGhyb3dfYXNzaWduYWJsZV92PF9UcCYsIF9Bcmc+ICYmCisgICAgICBpc19ub3Rocm93X2NvbnN0cnVjdGlibGVfdjxfVHAsIF9Bcmc+KSB7CisgICAgX19pbXBsLnRlbXBsYXRlIF9fYXNzaWduPF9JcD4oX1ZTVEQ6OmZvcndhcmQ8X0FyZz4oX19hcmcpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8CisgICAgICBzaXplX3QgX0lwLAorICAgICAgY2xhc3MuLi4gX0FyZ3MsCisgICAgICBlbmFibGVfaWZfdDwoX0lwIDwgc2l6ZW9mLi4uKF9UeXBlcykpLCBpbnQ+ID0gMCwKKyAgICAgIGNsYXNzIF9UcCA9IHZhcmlhbnRfYWx0ZXJuYXRpdmVfdDxfSXAsIHZhcmlhbnQ8X1R5cGVzLi4uPj4sCisgICAgICBlbmFibGVfaWZfdDxpc19jb25zdHJ1Y3RpYmxlX3Y8X1RwLCBfQXJncy4uLj4sIGludD4gPSAwPgorICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBfVHAmIGVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpIHsKKyAgICByZXR1cm4gX19pbXBsLnRlbXBsYXRlIF9fZW1wbGFjZTxfSXA+KF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgfQorCisgIHRlbXBsYXRlIDwKKyAgICAgIHNpemVfdCBfSXAsCisgICAgICBjbGFzcyBfVXAsCisgICAgICBjbGFzcy4uLiBfQXJncywKKyAgICAgIGVuYWJsZV9pZl90PChfSXAgPCBzaXplb2YuLi4oX1R5cGVzKSksIGludD4gPSAwLAorICAgICAgY2xhc3MgX1RwID0gdmFyaWFudF9hbHRlcm5hdGl2ZV90PF9JcCwgdmFyaWFudDxfVHlwZXMuLi4+PiwKKyAgICAgIGVuYWJsZV9pZl90PGlzX2NvbnN0cnVjdGlibGVfdjxfVHAsIGluaXRpYWxpemVyX2xpc3Q8X1VwPiYsIF9BcmdzLi4uPiwKKyAgICAgICAgICAgICAgICAgIGludD4gPSAwPgorICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICBfVHAmIGVtcGxhY2UoaW5pdGlhbGl6ZXJfbGlzdDxfVXA+IF9faWwsIF9BcmdzJiYuLi4gX19hcmdzKSB7CisgICAgcmV0dXJuIF9faW1wbC50ZW1wbGF0ZSBfX2VtcGxhY2U8X0lwPihfX2lsLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgIH0KKworICB0ZW1wbGF0ZSA8CisgICAgICBjbGFzcyBfVHAsCisgICAgICBjbGFzcy4uLiBfQXJncywKKyAgICAgIHNpemVfdCBfSXAgPQorICAgICAgICAgIF9fZmluZF9kZXRhaWw6Ol9fZmluZF91bmFtYmlndW91c19pbmRleF9zZmluYWU8X1RwLCBfVHlwZXMuLi4+Ojp2YWx1ZSwKKyAgICAgIGVuYWJsZV9pZl90PGlzX2NvbnN0cnVjdGlibGVfdjxfVHAsIF9BcmdzLi4uPiwgaW50PiA9IDA+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIF9UcCYgZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykgeworICAgIHJldHVybiBfX2ltcGwudGVtcGxhdGUgX19lbXBsYWNlPF9JcD4oX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICB9CisKKyAgdGVtcGxhdGUgPAorICAgICAgY2xhc3MgX1RwLAorICAgICAgY2xhc3MgX1VwLAorICAgICAgY2xhc3MuLi4gX0FyZ3MsCisgICAgICBzaXplX3QgX0lwID0KKyAgICAgICAgICBfX2ZpbmRfZGV0YWlsOjpfX2ZpbmRfdW5hbWJpZ3VvdXNfaW5kZXhfc2ZpbmFlPF9UcCwgX1R5cGVzLi4uPjo6dmFsdWUsCisgICAgICBlbmFibGVfaWZfdDxpc19jb25zdHJ1Y3RpYmxlX3Y8X1RwLCBpbml0aWFsaXplcl9saXN0PF9VcD4mLCBfQXJncy4uLj4sCisgICAgICAgICAgICAgICAgICBpbnQ+ID0gMD4KKyAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgX1RwJiBlbXBsYWNlKGluaXRpYWxpemVyX2xpc3Q8X1VwPiBfX2lsLCBfQXJncyYmLi4uIF9fYXJncykgeworICAgIHJldHVybiBfX2ltcGwudGVtcGxhdGUgX19lbXBsYWNlPF9JcD4oX19pbCwgX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICB9CisKKyAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgY29uc3RleHByIGJvb2wgdmFsdWVsZXNzX2J5X2V4Y2VwdGlvbigpIGNvbnN0IG5vZXhjZXB0IHsKKyAgICByZXR1cm4gX19pbXBsLnZhbHVlbGVzc19ieV9leGNlcHRpb24oKTsKKyAgfQorCisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIGNvbnN0ZXhwciBzaXplX3QgaW5kZXgoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBfX2ltcGwuaW5kZXgoKTsgfQorCisgIHRlbXBsYXRlIDwKKyAgICAgIGJvb2wgX0R1bW15ID0gdHJ1ZSwKKyAgICAgIGVuYWJsZV9pZl90PAorICAgICAgICAgIF9fYWxsPCgKKyAgICAgICAgICAgICAgX19kZXBlbmRlbnRfdHlwZTxpc19tb3ZlX2NvbnN0cnVjdGlibGU8X1R5cGVzPiwgX0R1bW15Pjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgX19kZXBlbmRlbnRfdHlwZTxpc19zd2FwcGFibGU8X1R5cGVzPiwgX0R1bW15Pjo6dmFsdWUpLi4uPjo6dmFsdWUsCisgICAgICAgICAgaW50PiA9IDA+CisgIGlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgIHZvaWQgc3dhcCh2YXJpYW50JiBfX3RoYXQpIG5vZXhjZXB0KAorICAgICAgX19hbGw8KGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlX3Y8X1R5cGVzPiAmJgorICAgICAgICAgICAgIGlzX25vdGhyb3dfc3dhcHBhYmxlX3Y8X1R5cGVzPikuLi4+Ojp2YWx1ZSkgeworICAgIF9faW1wbC5fX3N3YXAoX190aGF0Ll9faW1wbCk7CisgIH0KKworcHJpdmF0ZToKKyAgX192YXJpYW50X2RldGFpbDo6X19pbXBsPF9UeXBlcy4uLj4gX19pbXBsOworCisgIGZyaWVuZCBzdHJ1Y3QgX192YXJpYW50X2RldGFpbDo6X19hY2Nlc3M6Ol9fdmFyaWFudDsKKyAgZnJpZW5kIHN0cnVjdCBfX3ZhcmlhbnRfZGV0YWlsOjpfX3Zpc2l0YXRpb246Ol9fdmFyaWFudDsKK307CisKK3RlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcy4uLiBfVHlwZXM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RleHByIGJvb2wgX19ob2xkc19hbHRlcm5hdGl2ZShjb25zdCB2YXJpYW50PF9UeXBlcy4uLj4mIF9fdikgbm9leGNlcHQgeworICByZXR1cm4gX192LmluZGV4KCkgPT0gX0lwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcy4uLiBfVHlwZXM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RleHByIGJvb2wgaG9sZHNfYWx0ZXJuYXRpdmUoY29uc3QgdmFyaWFudDxfVHlwZXMuLi4+JiBfX3YpIG5vZXhjZXB0IHsKKyAgcmV0dXJuIF9faG9sZHNfYWx0ZXJuYXRpdmU8X19maW5kX2V4YWN0bHlfb25lX3Q8X1RwLCBfVHlwZXMuLi4+Ojp2YWx1ZT4oX192KTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIF9WcD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitzdGF0aWMgY29uc3RleHByIGF1dG8mJiBfX2dlbmVyaWNfZ2V0KF9WcCYmIF9fdikgeworICB1c2luZyBfX3ZhcmlhbnRfZGV0YWlsOjpfX2FjY2Vzczo6X192YXJpYW50OworICBpZiAoIV9faG9sZHNfYWx0ZXJuYXRpdmU8X0lwPihfX3YpKSB7CisgICAgX190aHJvd19iYWRfdmFyaWFudF9hY2Nlc3MoKTsKKyAgfQorICByZXR1cm4gX192YXJpYW50OjpfX2dldF9hbHQ8X0lwPihfVlNURDo6Zm9yd2FyZDxfVnA+KF9fdikpLl9fdmFsdWU7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcy4uLiBfVHlwZXM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RleHByIHZhcmlhbnRfYWx0ZXJuYXRpdmVfdDxfSXAsIHZhcmlhbnQ8X1R5cGVzLi4uPj4mIGdldCgKKyAgICB2YXJpYW50PF9UeXBlcy4uLj4mIF9fdikgeworICBzdGF0aWNfYXNzZXJ0KF9JcCA8IHNpemVvZi4uLihfVHlwZXMpKTsKKyAgc3RhdGljX2Fzc2VydCghaXNfdm9pZF92PHZhcmlhbnRfYWx0ZXJuYXRpdmVfdDxfSXAsIHZhcmlhbnQ8X1R5cGVzLi4uPj4+KTsKKyAgcmV0dXJuIF9fZ2VuZXJpY19nZXQ8X0lwPihfX3YpOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MuLi4gX1R5cGVzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciB2YXJpYW50X2FsdGVybmF0aXZlX3Q8X0lwLCB2YXJpYW50PF9UeXBlcy4uLj4+JiYgZ2V0KAorICAgIHZhcmlhbnQ8X1R5cGVzLi4uPiYmIF9fdikgeworICBzdGF0aWNfYXNzZXJ0KF9JcCA8IHNpemVvZi4uLihfVHlwZXMpKTsKKyAgc3RhdGljX2Fzc2VydCghaXNfdm9pZF92PHZhcmlhbnRfYWx0ZXJuYXRpdmVfdDxfSXAsIHZhcmlhbnQ8X1R5cGVzLi4uPj4+KTsKKyAgcmV0dXJuIF9fZ2VuZXJpY19nZXQ8X0lwPihfVlNURDo6bW92ZShfX3YpKTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzLi4uIF9UeXBlcz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdGV4cHIgY29uc3QgdmFyaWFudF9hbHRlcm5hdGl2ZV90PF9JcCwgdmFyaWFudDxfVHlwZXMuLi4+PiYgZ2V0KAorICAgIGNvbnN0IHZhcmlhbnQ8X1R5cGVzLi4uPiYgX192KSB7CisgIHN0YXRpY19hc3NlcnQoX0lwIDwgc2l6ZW9mLi4uKF9UeXBlcykpOworICBzdGF0aWNfYXNzZXJ0KCFpc192b2lkX3Y8dmFyaWFudF9hbHRlcm5hdGl2ZV90PF9JcCwgdmFyaWFudDxfVHlwZXMuLi4+Pj4pOworICByZXR1cm4gX19nZW5lcmljX2dldDxfSXA+KF9fdik7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcy4uLiBfVHlwZXM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RleHByIGNvbnN0IHZhcmlhbnRfYWx0ZXJuYXRpdmVfdDxfSXAsIHZhcmlhbnQ8X1R5cGVzLi4uPj4mJiBnZXQoCisgICAgY29uc3QgdmFyaWFudDxfVHlwZXMuLi4+JiYgX192KSB7CisgIHN0YXRpY19hc3NlcnQoX0lwIDwgc2l6ZW9mLi4uKF9UeXBlcykpOworICBzdGF0aWNfYXNzZXJ0KCFpc192b2lkX3Y8dmFyaWFudF9hbHRlcm5hdGl2ZV90PF9JcCwgdmFyaWFudDxfVHlwZXMuLi4+Pj4pOworICByZXR1cm4gX19nZW5lcmljX2dldDxfSXA+KF9WU1REOjptb3ZlKF9fdikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcy4uLiBfVHlwZXM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RleHByIF9UcCYgZ2V0KHZhcmlhbnQ8X1R5cGVzLi4uPiYgX192KSB7CisgIHN0YXRpY19hc3NlcnQoIWlzX3ZvaWRfdjxfVHA+KTsKKyAgcmV0dXJuIF9WU1REOjpnZXQ8X19maW5kX2V4YWN0bHlfb25lX3Q8X1RwLCBfVHlwZXMuLi4+Ojp2YWx1ZT4oX192KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MuLi4gX1R5cGVzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBfVHAmJiBnZXQodmFyaWFudDxfVHlwZXMuLi4+JiYgX192KSB7CisgIHN0YXRpY19hc3NlcnQoIWlzX3ZvaWRfdjxfVHA+KTsKKyAgcmV0dXJuIF9WU1REOjpnZXQ8X19maW5kX2V4YWN0bHlfb25lX3Q8X1RwLCBfVHlwZXMuLi4+Ojp2YWx1ZT4oCisgICAgICBfVlNURDo6bW92ZShfX3YpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MuLi4gX1R5cGVzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBjb25zdCBfVHAmIGdldChjb25zdCB2YXJpYW50PF9UeXBlcy4uLj4mIF9fdikgeworICBzdGF0aWNfYXNzZXJ0KCFpc192b2lkX3Y8X1RwPik7CisgIHJldHVybiBfVlNURDo6Z2V0PF9fZmluZF9leGFjdGx5X29uZV90PF9UcCwgX1R5cGVzLi4uPjo6dmFsdWU+KF9fdik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzLi4uIF9UeXBlcz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdGV4cHIgY29uc3QgX1RwJiYgZ2V0KGNvbnN0IHZhcmlhbnQ8X1R5cGVzLi4uPiYmIF9fdikgeworICBzdGF0aWNfYXNzZXJ0KCFpc192b2lkX3Y8X1RwPik7CisgIHJldHVybiBfVlNURDo6Z2V0PF9fZmluZF9leGFjdGx5X29uZV90PF9UcCwgX1R5cGVzLi4uPjo6dmFsdWU+KAorICAgICAgX1ZTVEQ6Om1vdmUoX192KSk7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcyBfVnA+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RleHByIGF1dG8qIF9fZ2VuZXJpY19nZXRfaWYoX1ZwKiBfX3YpIG5vZXhjZXB0IHsKKyAgdXNpbmcgX192YXJpYW50X2RldGFpbDo6X19hY2Nlc3M6Ol9fdmFyaWFudDsKKyAgcmV0dXJuIF9fdiAmJiBfX2hvbGRzX2FsdGVybmF0aXZlPF9JcD4oKl9fdikKKyAgICAgICAgICAgICA/IF9WU1REOjphZGRyZXNzb2YoX192YXJpYW50OjpfX2dldF9hbHQ8X0lwPigqX192KS5fX3ZhbHVlKQorICAgICAgICAgICAgIDogbnVsbHB0cjsKK30KKwordGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzLi4uIF9UeXBlcz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdGV4cHIgYWRkX3BvaW50ZXJfdDx2YXJpYW50X2FsdGVybmF0aXZlX3Q8X0lwLCB2YXJpYW50PF9UeXBlcy4uLj4+PgorZ2V0X2lmKHZhcmlhbnQ8X1R5cGVzLi4uPiogX192KSBub2V4Y2VwdCB7CisgIHN0YXRpY19hc3NlcnQoX0lwIDwgc2l6ZW9mLi4uKF9UeXBlcykpOworICBzdGF0aWNfYXNzZXJ0KCFpc192b2lkX3Y8dmFyaWFudF9hbHRlcm5hdGl2ZV90PF9JcCwgdmFyaWFudDxfVHlwZXMuLi4+Pj4pOworICByZXR1cm4gX19nZW5lcmljX2dldF9pZjxfSXA+KF9fdik7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcy4uLiBfVHlwZXM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RleHByIGFkZF9wb2ludGVyX3Q8Y29uc3QgdmFyaWFudF9hbHRlcm5hdGl2ZV90PF9JcCwgdmFyaWFudDxfVHlwZXMuLi4+Pj4KK2dldF9pZihjb25zdCB2YXJpYW50PF9UeXBlcy4uLj4qIF9fdikgbm9leGNlcHQgeworICBzdGF0aWNfYXNzZXJ0KF9JcCA8IHNpemVvZi4uLihfVHlwZXMpKTsKKyAgc3RhdGljX2Fzc2VydCghaXNfdm9pZF92PHZhcmlhbnRfYWx0ZXJuYXRpdmVfdDxfSXAsIHZhcmlhbnQ8X1R5cGVzLi4uPj4+KTsKKyAgcmV0dXJuIF9fZ2VuZXJpY19nZXRfaWY8X0lwPihfX3YpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcy4uLiBfVHlwZXM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RleHByIGFkZF9wb2ludGVyX3Q8X1RwPgorZ2V0X2lmKHZhcmlhbnQ8X1R5cGVzLi4uPiogX192KSBub2V4Y2VwdCB7CisgIHN0YXRpY19hc3NlcnQoIWlzX3ZvaWRfdjxfVHA+KTsKKyAgcmV0dXJuIF9WU1REOjpnZXRfaWY8X19maW5kX2V4YWN0bHlfb25lX3Q8X1RwLCBfVHlwZXMuLi4+Ojp2YWx1ZT4oX192KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MuLi4gX1R5cGVzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBhZGRfcG9pbnRlcl90PGNvbnN0IF9UcD4KK2dldF9pZihjb25zdCB2YXJpYW50PF9UeXBlcy4uLj4qIF9fdikgbm9leGNlcHQgeworICBzdGF0aWNfYXNzZXJ0KCFpc192b2lkX3Y8X1RwPik7CisgIHJldHVybiBfVlNURDo6Z2V0X2lmPF9fZmluZF9leGFjdGx5X29uZV90PF9UcCwgX1R5cGVzLi4uPjo6dmFsdWU+KF9fdik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcy4uLiBfVHlwZXM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCB2YXJpYW50PF9UeXBlcy4uLj4mIF9fbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YXJpYW50PF9UeXBlcy4uLj4mIF9fcmhzKSB7CisgIHVzaW5nIF9fdmFyaWFudF9kZXRhaWw6Ol9fdmlzaXRhdGlvbjo6X192YXJpYW50OworICBpZiAoX19saHMuaW5kZXgoKSAhPSBfX3Jocy5pbmRleCgpKSByZXR1cm4gZmFsc2U7CisgIGlmIChfX2xocy52YWx1ZWxlc3NfYnlfZXhjZXB0aW9uKCkpIHJldHVybiB0cnVlOworICByZXR1cm4gX192YXJpYW50OjpfX3Zpc2l0X3ZhbHVlX2F0KF9fbGhzLmluZGV4KCksIGVxdWFsX3RvPD57fSwgX19saHMsIF9fcmhzKTsKK30KKwordGVtcGxhdGUgPGNsYXNzLi4uIF9UeXBlcz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHZhcmlhbnQ8X1R5cGVzLi4uPiYgX19saHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQ8X1R5cGVzLi4uPiYgX19yaHMpIHsKKyAgdXNpbmcgX192YXJpYW50X2RldGFpbDo6X192aXNpdGF0aW9uOjpfX3ZhcmlhbnQ7CisgIGlmIChfX2xocy5pbmRleCgpICE9IF9fcmhzLmluZGV4KCkpIHJldHVybiB0cnVlOworICBpZiAoX19saHMudmFsdWVsZXNzX2J5X2V4Y2VwdGlvbigpKSByZXR1cm4gZmFsc2U7CisgIHJldHVybiBfX3ZhcmlhbnQ6Ol9fdmlzaXRfdmFsdWVfYXQoCisgICAgICBfX2xocy5pbmRleCgpLCBub3RfZXF1YWxfdG88Pnt9LCBfX2xocywgX19yaHMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX1R5cGVzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPChjb25zdCB2YXJpYW50PF9UeXBlcy4uLj4mIF9fbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQ8X1R5cGVzLi4uPiYgX19yaHMpIHsKKyAgdXNpbmcgX192YXJpYW50X2RldGFpbDo6X192aXNpdGF0aW9uOjpfX3ZhcmlhbnQ7CisgIGlmIChfX3Jocy52YWx1ZWxlc3NfYnlfZXhjZXB0aW9uKCkpIHJldHVybiBmYWxzZTsKKyAgaWYgKF9fbGhzLnZhbHVlbGVzc19ieV9leGNlcHRpb24oKSkgcmV0dXJuIHRydWU7CisgIGlmIChfX2xocy5pbmRleCgpIDwgX19yaHMuaW5kZXgoKSkgcmV0dXJuIHRydWU7CisgIGlmIChfX2xocy5pbmRleCgpID4gX19yaHMuaW5kZXgoKSkgcmV0dXJuIGZhbHNlOworICByZXR1cm4gX192YXJpYW50OjpfX3Zpc2l0X3ZhbHVlX2F0KF9fbGhzLmluZGV4KCksIGxlc3M8Pnt9LCBfX2xocywgX19yaHMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX1R5cGVzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPihjb25zdCB2YXJpYW50PF9UeXBlcy4uLj4mIF9fbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQ8X1R5cGVzLi4uPiYgX19yaHMpIHsKKyAgdXNpbmcgX192YXJpYW50X2RldGFpbDo6X192aXNpdGF0aW9uOjpfX3ZhcmlhbnQ7CisgIGlmIChfX2xocy52YWx1ZWxlc3NfYnlfZXhjZXB0aW9uKCkpIHJldHVybiBmYWxzZTsKKyAgaWYgKF9fcmhzLnZhbHVlbGVzc19ieV9leGNlcHRpb24oKSkgcmV0dXJuIHRydWU7CisgIGlmIChfX2xocy5pbmRleCgpID4gX19yaHMuaW5kZXgoKSkgcmV0dXJuIHRydWU7CisgIGlmIChfX2xocy5pbmRleCgpIDwgX19yaHMuaW5kZXgoKSkgcmV0dXJuIGZhbHNlOworICByZXR1cm4gX192YXJpYW50OjpfX3Zpc2l0X3ZhbHVlX2F0KF9fbGhzLmluZGV4KCksIGdyZWF0ZXI8Pnt9LCBfX2xocywgX19yaHMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX1R5cGVzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPD0oY29uc3QgdmFyaWFudDxfVHlwZXMuLi4+JiBfX2xocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFyaWFudDxfVHlwZXMuLi4+JiBfX3JocykgeworICB1c2luZyBfX3ZhcmlhbnRfZGV0YWlsOjpfX3Zpc2l0YXRpb246Ol9fdmFyaWFudDsKKyAgaWYgKF9fbGhzLnZhbHVlbGVzc19ieV9leGNlcHRpb24oKSkgcmV0dXJuIHRydWU7CisgIGlmIChfX3Jocy52YWx1ZWxlc3NfYnlfZXhjZXB0aW9uKCkpIHJldHVybiBmYWxzZTsKKyAgaWYgKF9fbGhzLmluZGV4KCkgPCBfX3Jocy5pbmRleCgpKSByZXR1cm4gdHJ1ZTsKKyAgaWYgKF9fbGhzLmluZGV4KCkgPiBfX3Jocy5pbmRleCgpKSByZXR1cm4gZmFsc2U7CisgIHJldHVybiBfX3ZhcmlhbnQ6Ol9fdmlzaXRfdmFsdWVfYXQoCisgICAgICBfX2xocy5pbmRleCgpLCBsZXNzX2VxdWFsPD57fSwgX19saHMsIF9fcmhzKTsKK30KKwordGVtcGxhdGUgPGNsYXNzLi4uIF9UeXBlcz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IHZhcmlhbnQ8X1R5cGVzLi4uPiYgX19saHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQ8X1R5cGVzLi4uPiYgX19yaHMpIHsKKyAgdXNpbmcgX192YXJpYW50X2RldGFpbDo6X192aXNpdGF0aW9uOjpfX3ZhcmlhbnQ7CisgIGlmIChfX3Jocy52YWx1ZWxlc3NfYnlfZXhjZXB0aW9uKCkpIHJldHVybiB0cnVlOworICBpZiAoX19saHMudmFsdWVsZXNzX2J5X2V4Y2VwdGlvbigpKSByZXR1cm4gZmFsc2U7CisgIGlmIChfX2xocy5pbmRleCgpID4gX19yaHMuaW5kZXgoKSkgcmV0dXJuIHRydWU7CisgIGlmIChfX2xocy5pbmRleCgpIDwgX19yaHMuaW5kZXgoKSkgcmV0dXJuIGZhbHNlOworICByZXR1cm4gX192YXJpYW50OjpfX3Zpc2l0X3ZhbHVlX2F0KAorICAgICAgX19saHMuaW5kZXgoKSwgZ3JlYXRlcl9lcXVhbDw+e30sIF9fbGhzLCBfX3Jocyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVmlzaXRvciwgY2xhc3MuLi4gX1ZzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBkZWNsdHlwZShhdXRvKSB2aXNpdChfVmlzaXRvciYmIF9fdmlzaXRvciwgX1ZzJiYuLi4gX192cykgeworICB1c2luZyBfX3ZhcmlhbnRfZGV0YWlsOjpfX3Zpc2l0YXRpb246Ol9fdmFyaWFudDsKKyAgYm9vbCBfX3Jlc3VsdHNbXSA9IHtfX3ZzLnZhbHVlbGVzc19ieV9leGNlcHRpb24oKS4uLn07CisgIGZvciAoYm9vbCBfX3Jlc3VsdCA6IF9fcmVzdWx0cykgeworICAgIGlmIChfX3Jlc3VsdCkgeworICAgICAgX190aHJvd19iYWRfdmFyaWFudF9hY2Nlc3MoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIF9fdmFyaWFudDo6X192aXNpdF92YWx1ZShfVlNURDo6Zm9yd2FyZDxfVmlzaXRvcj4oX192aXNpdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZDxfVnM+KF9fdnMpLi4uKTsKK30KKworc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIG1vbm9zdGF0ZSB7fTsKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPChtb25vc3RhdGUsIG1vbm9zdGF0ZSkgbm9leGNlcHQgeyByZXR1cm4gZmFsc2U7IH0KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPihtb25vc3RhdGUsIG1vbm9zdGF0ZSkgbm9leGNlcHQgeyByZXR1cm4gZmFsc2U7IH0KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPD0obW9ub3N0YXRlLCBtb25vc3RhdGUpIG5vZXhjZXB0IHsgcmV0dXJuIHRydWU7IH0KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPj0obW9ub3N0YXRlLCBtb25vc3RhdGUpIG5vZXhjZXB0IHsgcmV0dXJuIHRydWU7IH0KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPT0obW9ub3N0YXRlLCBtb25vc3RhdGUpIG5vZXhjZXB0IHsgcmV0dXJuIHRydWU7IH0KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0obW9ub3N0YXRlLCBtb25vc3RhdGUpIG5vZXhjZXB0IHsgcmV0dXJuIGZhbHNlOyB9CisKK3RlbXBsYXRlIDxjbGFzcy4uLiBfVHlwZXM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYXV0byBzd2FwKHZhcmlhbnQ8X1R5cGVzLi4uPiYgX19saHMsCisgICAgICAgICAgdmFyaWFudDxfVHlwZXMuLi4+JiBfX3Jocykgbm9leGNlcHQobm9leGNlcHQoX19saHMuc3dhcChfX3JocykpKQorICAgIC0+IGRlY2x0eXBlKF9fbGhzLnN3YXAoX19yaHMpKSB7CisgIF9fbGhzLnN3YXAoX19yaHMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX1R5cGVzPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc2g8CisgICAgX19lbmFibGVfaGFzaF9oZWxwZXI8dmFyaWFudDxfVHlwZXMuLi4+LCByZW1vdmVfY29uc3RfdDxfVHlwZXM+Li4uPj4geworICB1c2luZyBhcmd1bWVudF90eXBlID0gdmFyaWFudDxfVHlwZXMuLi4+OworICB1c2luZyByZXN1bHRfdHlwZSA9IHNpemVfdDsKKworICBpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKGNvbnN0IGFyZ3VtZW50X3R5cGUmIF9fdikgY29uc3QgeworICAgIHVzaW5nIF9fdmFyaWFudF9kZXRhaWw6Ol9fdmlzaXRhdGlvbjo6X192YXJpYW50OworICAgIHNpemVfdCBfX3JlcyA9CisgICAgICAgIF9fdi52YWx1ZWxlc3NfYnlfZXhjZXB0aW9uKCkKKyAgICAgICAgICAgICAgID8gMjk5NzkyNDU4IC8vIFJhbmRvbSB2YWx1ZSBjaG9zZW4gYnkgdGhlIHVuaXZlcnNlIHVwb24gY3JlYXRpb24KKyAgICAgICAgICAgICAgIDogX192YXJpYW50OjpfX3Zpc2l0X2FsdCgKKyAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8mIF9fYWx0KSB7CisgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIF9fYWx0X3R5cGUgPSBfX3VuY3ZyZWZfdDxkZWNsdHlwZShfX2FsdCk+OworICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBfX3ZhbHVlX3R5cGUgPSByZW1vdmVfY29uc3RfdDwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX2FsdF90eXBlOjpfX3ZhbHVlX3R5cGU+OworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzaDxfX3ZhbHVlX3R5cGU+e30oX19hbHQuX192YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgX192KTsKKyAgICByZXR1cm4gX19oYXNoX2NvbWJpbmUoX19yZXMsIGhhc2g8c2l6ZV90Pnt9KF9fdi5pbmRleCgpKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX0xJQkNQUF9URU1QTEFURV9WSVMgaGFzaDxtb25vc3RhdGU+IHsKKyAgdXNpbmcgYXJndW1lbnRfdHlwZSA9IG1vbm9zdGF0ZTsKKyAgdXNpbmcgcmVzdWx0X3R5cGUgPSBzaXplX3Q7CisKKyAgaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShjb25zdCBhcmd1bWVudF90eXBlJikgY29uc3QgX05PRVhDRVBUIHsKKyAgICByZXR1cm4gNjY3NDA4MzE7IC8vIHJldHVybiBhIGZ1bmRhbWVudGFsbHkgYXR0cmFjdGl2ZSByYW5kb20gdmFsdWUuCisgIH0KK307CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9TVERfVkVSID4gMTQKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCitfTElCQ1BQX1BPUF9NQUNST1MKKworI2VuZGlmICAvLyBfTElCQ1BQX1ZBUklBTlQKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS92ZWN0b3IgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvdmVjdG9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YjFlODgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvdmVjdG9yCkBAIC0wLDAgKzEsMzM2OCBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHZlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9WRUNUT1IKKyNkZWZpbmUgX0xJQkNQUF9WRUNUT1IKKworLyoKKyAgICB2ZWN0b3Igc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQWxsb2NhdG9yID0gYWxsb2NhdG9yPFQ+ID4KK2NsYXNzIHZlY3RvcgoreworcHVibGljOgorICAgIHR5cGVkZWYgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpyZWZlcmVuY2UgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgaW1wbGVtZW50YXRpb24tZGVmaW5lZCAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6cG9pbnRlciAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6Y29uc3RfcG9pbnRlciAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICB2ZWN0b3IoKQorICAgICAgICBub2V4Y2VwdChpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKTsKKyAgICBleHBsaWNpdCB2ZWN0b3IoY29uc3QgYWxsb2NhdG9yX3R5cGUmKTsKKyAgICBleHBsaWNpdCB2ZWN0b3Ioc2l6ZV90eXBlIG4pOworICAgIGV4cGxpY2l0IHZlY3RvcihzaXplX3R5cGUgbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmKTsgLy8gQysrMTQKKyAgICB2ZWN0b3Ioc2l6ZV90eXBlIG4sIGNvbnN0IHZhbHVlX3R5cGUmIHZhbHVlLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdmVjdG9yKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmID0gYWxsb2NhdG9yX3R5cGUoKSk7CisgICAgdmVjdG9yKGNvbnN0IHZlY3RvciYgeCk7CisgICAgdmVjdG9yKHZlY3RvciYmIHgpCisgICAgICAgIG5vZXhjZXB0KGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpOworICAgIHZlY3Rvcihpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IGlsKTsKKyAgICB2ZWN0b3IoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBpbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEpOworICAgIH52ZWN0b3IoKTsKKyAgICB2ZWN0b3ImIG9wZXJhdG9yPShjb25zdCB2ZWN0b3ImIHgpOworICAgIHZlY3RvciYgb3BlcmF0b3I9KHZlY3RvciYmIHgpCisgICAgICAgIG5vZXhjZXB0KAorICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWUgfHwKKyAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTo6aXNfYWx3YXlzX2VxdWFsOjp2YWx1ZSk7IC8vIEMrKzE3CisgICAgdmVjdG9yJiBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBpbCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQgYXNzaWduKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCk7CisgICAgdm9pZCBhc3NpZ24oc2l6ZV90eXBlIG4sIGNvbnN0IHZhbHVlX3R5cGUmIHUpOworICAgIHZvaWQgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwpOworCisgICAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IG5vZXhjZXB0OworCisgICAgaXRlcmF0b3IgICAgICAgICAgICAgICBiZWdpbigpIG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgYmVnaW4oKSAgIGNvbnN0IG5vZXhjZXB0OworICAgIGl0ZXJhdG9yICAgICAgICAgICAgICAgZW5kKCkgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgICAgICAgICBlbmQoKSAgICAgY29uc3Qgbm9leGNlcHQ7CisKKyAgICByZXZlcnNlX2l0ZXJhdG9yICAgICAgIHJiZWdpbigpIG5vZXhjZXB0OworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgIGNvbnN0IG5vZXhjZXB0OworICAgIHJldmVyc2VfaXRlcmF0b3IgICAgICAgcmVuZCgpIG5vZXhjZXB0OworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgIGNvbnN0IG5vZXhjZXB0OworCisgICAgY29uc3RfaXRlcmF0b3IgICAgICAgICBjYmVnaW4oKSAgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfaXRlcmF0b3IgICAgICAgICBjZW5kKCkgICAgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmVuZCgpICAgY29uc3Qgbm9leGNlcHQ7CisKKyAgICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IG5vZXhjZXB0OworICAgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IG5vZXhjZXB0OworICAgIHNpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0IG5vZXhjZXB0OworICAgIGJvb2wgZW1wdHkoKSBjb25zdCBub2V4Y2VwdDsKKyAgICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIG4pOworICAgIHZvaWQgc2hyaW5rX3RvX2ZpdCgpIG5vZXhjZXB0OworCisgICAgcmVmZXJlbmNlICAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIG4pOworICAgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBuKSBjb25zdDsKKyAgICByZWZlcmVuY2UgICAgICAgYXQoc2l6ZV90eXBlIG4pOworICAgIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgbikgY29uc3Q7CisKKyAgICByZWZlcmVuY2UgICAgICAgZnJvbnQoKTsKKyAgICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdDsKKyAgICByZWZlcmVuY2UgICAgICAgYmFjaygpOworICAgIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3Q7CisKKyAgICB2YWx1ZV90eXBlKiAgICAgICBkYXRhKCkgbm9leGNlcHQ7CisgICAgY29uc3QgdmFsdWVfdHlwZSogZGF0YSgpIGNvbnN0IG5vZXhjZXB0OworCisgICAgdm9pZCBwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgeCk7CisgICAgdm9pZCBwdXNoX2JhY2sodmFsdWVfdHlwZSYmIHgpOworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorICAgICAgICByZWZlcmVuY2UgZW1wbGFjZV9iYWNrKEFyZ3MmJi4uLiBhcmdzKTsgLy8gcmVmZXJlbmNlIGluIEMrKzE3CisgICAgdm9pZCBwb3BfYmFjaygpOworCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+IGl0ZXJhdG9yIGVtcGxhY2UoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24sIEFyZ3MmJi4uLiBhcmdzKTsKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIHgpOworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgdmFsdWVfdHlwZSYmIHgpOworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgc2l6ZV90eXBlIG4sIGNvbnN0IHZhbHVlX3R5cGUmIHgpOworICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24sIElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCk7CisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCBpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IGlsKTsKKworICAgIGl0ZXJhdG9yIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uKTsKKyAgICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCk7CisKKyAgICB2b2lkIGNsZWFyKCkgbm9leGNlcHQ7CisKKyAgICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgc3opOworICAgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBzeiwgY29uc3QgdmFsdWVfdHlwZSYgYyk7CisKKyAgICB2b2lkIHN3YXAodmVjdG9yJikKKyAgICAgICAgbm9leGNlcHQoYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OmlzX2Fsd2F5c19lcXVhbDo6dmFsdWUpOyAgLy8gQysrMTcKKworICAgIGJvb2wgX19pbnZhcmlhbnRzKCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgQWxsb2NhdG9yID0gYWxsb2NhdG9yPFQ+ID4KK2NsYXNzIHZlY3Rvcjxib29sLCBBbGxvY2F0b3I+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBBbGxvY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgaW1wbGVtZW50YXRpb24tZGVmaW5lZCAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIGltcGxlbWVudGF0aW9uLWRlZmluZWQgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgaXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgY2xhc3MgcmVmZXJlbmNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgcmVmZXJlbmNlKGNvbnN0IHJlZmVyZW5jZSYpIG5vZXhjZXB0OworICAgICAgICBvcGVyYXRvciBib29sKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgICAgIHJlZmVyZW5jZSYgb3BlcmF0b3I9KGNvbnN0IGJvb2wgeCkgbm9leGNlcHQ7CisgICAgICAgIHJlZmVyZW5jZSYgb3BlcmF0b3I9KGNvbnN0IHJlZmVyZW5jZSYgeCkgbm9leGNlcHQ7CisgICAgICAgIGl0ZXJhdG9yIG9wZXJhdG9yJigpIGNvbnN0IG5vZXhjZXB0OworICAgICAgICB2b2lkIGZsaXAoKSBub2V4Y2VwdDsKKyAgICB9OworCisgICAgY2xhc3MgY29uc3RfcmVmZXJlbmNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgY29uc3RfcmVmZXJlbmNlKGNvbnN0IHJlZmVyZW5jZSYpIG5vZXhjZXB0OworICAgICAgICBvcGVyYXRvciBib29sKCkgY29uc3Qgbm9leGNlcHQ7CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIG9wZXJhdG9yJigpIGNvbnN0IG5vZXhjZXB0OworICAgIH07CisKKyAgICB2ZWN0b3IoKQorICAgICAgICBub2V4Y2VwdChpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKTsKKyAgICBleHBsaWNpdCB2ZWN0b3IoY29uc3QgYWxsb2NhdG9yX3R5cGUmKTsKKyAgICBleHBsaWNpdCB2ZWN0b3Ioc2l6ZV90eXBlIG4sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSk7IC8vIEMrKzE0CisgICAgdmVjdG9yKHNpemVfdHlwZSBuLCBjb25zdCB2YWx1ZV90eXBlJiB2YWx1ZSwgY29uc3QgYWxsb2NhdG9yX3R5cGUmID0gYWxsb2NhdG9yX3R5cGUoKSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIHZlY3RvcihJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiA9IGFsbG9jYXRvcl90eXBlKCkpOworICAgIHZlY3Rvcihjb25zdCB2ZWN0b3ImIHgpOworICAgIHZlY3Rvcih2ZWN0b3ImJiB4KQorICAgICAgICBub2V4Y2VwdChpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKTsKKyAgICB2ZWN0b3IoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBpbCk7CisgICAgdmVjdG9yKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhKTsKKyAgICB+dmVjdG9yKCk7CisgICAgdmVjdG9yJiBvcGVyYXRvcj0oY29uc3QgdmVjdG9yJiB4KTsKKyAgICB2ZWN0b3ImIG9wZXJhdG9yPSh2ZWN0b3ImJiB4KQorICAgICAgICBub2V4Y2VwdCgKKyAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ6OnZhbHVlIHx8CisgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU6OmlzX2Fsd2F5c19lcXVhbDo6dmFsdWUpOyAvLyBDKysxNworICAgIHZlY3RvciYgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwpOworICAgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkIGFzc2lnbihJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QpOworICAgIHZvaWQgYXNzaWduKHNpemVfdHlwZSBuLCBjb25zdCB2YWx1ZV90eXBlJiB1KTsKKyAgICB2b2lkIGFzc2lnbihpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IGlsKTsKKworICAgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIGl0ZXJhdG9yICAgICAgICAgICAgICAgYmVnaW4oKSBub2V4Y2VwdDsKKyAgICBjb25zdF9pdGVyYXRvciAgICAgICAgIGJlZ2luKCkgICBjb25zdCBub2V4Y2VwdDsKKyAgICBpdGVyYXRvciAgICAgICAgICAgICAgIGVuZCgpIG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgZW5kKCkgICAgIGNvbnN0IG5vZXhjZXB0OworCisgICAgcmV2ZXJzZV9pdGVyYXRvciAgICAgICByYmVnaW4oKSBub2V4Y2VwdDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpICBjb25zdCBub2V4Y2VwdDsKKyAgICByZXZlcnNlX2l0ZXJhdG9yICAgICAgIHJlbmQoKSBub2V4Y2VwdDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSAgICBjb25zdCBub2V4Y2VwdDsKKworICAgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgY2JlZ2luKCkgIGNvbnN0IG5vZXhjZXB0OworICAgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgY2VuZCgpICAgIGNvbnN0IG5vZXhjZXB0OworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0OworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY3JlbmQoKSAgIGNvbnN0IG5vZXhjZXB0OworCisgICAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBzaXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdCBub2V4Y2VwdDsKKyAgICBib29sIGVtcHR5KCkgY29uc3Qgbm9leGNlcHQ7CisgICAgdm9pZCByZXNlcnZlKHNpemVfdHlwZSBuKTsKKyAgICB2b2lkIHNocmlua190b19maXQoKSBub2V4Y2VwdDsKKworICAgIHJlZmVyZW5jZSAgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBuKTsKKyAgICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgbikgY29uc3Q7CisgICAgcmVmZXJlbmNlICAgICAgIGF0KHNpemVfdHlwZSBuKTsKKyAgICBjb25zdF9yZWZlcmVuY2UgYXQoc2l6ZV90eXBlIG4pIGNvbnN0OworCisgICAgcmVmZXJlbmNlICAgICAgIGZyb250KCk7CisgICAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3Q7CisgICAgcmVmZXJlbmNlICAgICAgIGJhY2soKTsKKyAgICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0OworCisgICAgdm9pZCBwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgeCk7CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+IHJlZmVyZW5jZSBlbXBsYWNlX2JhY2soQXJncyYmLi4uIGFyZ3MpOyAgLy8gQysrMTQ7IHJlZmVyZW5jZSBpbiBDKysxNworICAgIHZvaWQgcG9wX2JhY2soKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPiBpdGVyYXRvciBlbXBsYWNlKGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCBBcmdzJiYuLi4gYXJncyk7ICAvLyBDKysxNAorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgeCk7CisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCBzaXplX3R5cGUgbiwgY29uc3QgdmFsdWVfdHlwZSYgeCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgICAgICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0KTsKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24sIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gaWwpOworCisgICAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24pOworICAgIGl0ZXJhdG9yIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIGZpcnN0LCBjb25zdF9pdGVyYXRvciBsYXN0KTsKKworICAgIHZvaWQgY2xlYXIoKSBub2V4Y2VwdDsKKworICAgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBzeik7CisgICAgdm9pZCByZXNpemUoc2l6ZV90eXBlIHN6LCB2YWx1ZV90eXBlIHgpOworCisgICAgdm9pZCBzd2FwKHZlY3RvciYpCisgICAgICAgIG5vZXhjZXB0KGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+Ojpwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXA6OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+Ojppc19hbHdheXNfZXF1YWw6OnZhbHVlKTsgIC8vIEMrKzE3CisgICAgdm9pZCBmbGlwKCkgbm9leGNlcHQ7CisKKyAgICBib29sIF9faW52YXJpYW50cygpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGNsYXNzIEFsbG9jYXRvcj4gc3RydWN0IGhhc2g8c3RkOjp2ZWN0b3I8Ym9vbCwgQWxsb2NhdG9yPj47CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBBbGxvY2F0b3I+IGJvb2wgb3BlcmF0b3I9PShjb25zdCB2ZWN0b3I8VCxBbGxvY2F0b3I+JiB4LCBjb25zdCB2ZWN0b3I8VCxBbGxvY2F0b3I+JiB5KTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBBbGxvY2F0b3I+IGJvb2wgb3BlcmF0b3I8IChjb25zdCB2ZWN0b3I8VCxBbGxvY2F0b3I+JiB4LCBjb25zdCB2ZWN0b3I8VCxBbGxvY2F0b3I+JiB5KTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBBbGxvY2F0b3I+IGJvb2wgb3BlcmF0b3IhPShjb25zdCB2ZWN0b3I8VCxBbGxvY2F0b3I+JiB4LCBjb25zdCB2ZWN0b3I8VCxBbGxvY2F0b3I+JiB5KTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBBbGxvY2F0b3I+IGJvb2wgb3BlcmF0b3I+IChjb25zdCB2ZWN0b3I8VCxBbGxvY2F0b3I+JiB4LCBjb25zdCB2ZWN0b3I8VCxBbGxvY2F0b3I+JiB5KTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBBbGxvY2F0b3I+IGJvb2wgb3BlcmF0b3I+PShjb25zdCB2ZWN0b3I8VCxBbGxvY2F0b3I+JiB4LCBjb25zdCB2ZWN0b3I8VCxBbGxvY2F0b3I+JiB5KTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBBbGxvY2F0b3I+IGJvb2wgb3BlcmF0b3I8PShjb25zdCB2ZWN0b3I8VCxBbGxvY2F0b3I+JiB4LCBjb25zdCB2ZWN0b3I8VCxBbGxvY2F0b3I+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jYXRvcj4KK3ZvaWQgc3dhcCh2ZWN0b3I8VCxBbGxvY2F0b3I+JiB4LCB2ZWN0b3I8VCxBbGxvY2F0b3I+JiB5KQorICAgIG5vZXhjZXB0KG5vZXhjZXB0KHguc3dhcCh5KSkpOworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPGlvc2Z3ZD4gLy8gZm9yIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgdmVjdG9yCisjaW5jbHVkZSA8X19iaXRfcmVmZXJlbmNlPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxfX3NwbGl0X2J1ZmZlcj4KKyNpbmNsdWRlIDxfX2Z1bmN0aW9uYWxfYmFzZT4KKworI2luY2x1ZGUgPF9fZGVidWc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCitfTElCQ1BQX1BVU0hfTUFDUk9TCisjaW5jbHVkZSA8X191bmRlZl9tYWNyb3M+CisKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3RlbXBsYXRlIDxib29sPgorY2xhc3MgX192ZWN0b3JfYmFzZV9jb21tb24KK3sKK3Byb3RlY3RlZDoKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgX192ZWN0b3JfYmFzZV9jb21tb24oKSB7fQorICAgIF9MSUJDUFBfTk9SRVRVUk4gdm9pZCBfX3Rocm93X2xlbmd0aF9lcnJvcigpIGNvbnN0OworICAgIF9MSUJDUFBfTk9SRVRVUk4gdm9pZCBfX3Rocm93X291dF9vZl9yYW5nZSgpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPGJvb2wgX19iPgordm9pZAorX192ZWN0b3JfYmFzZV9jb21tb248X19iPjo6X190aHJvd19sZW5ndGhfZXJyb3IoKSBjb25zdAoreworICAgIF9WU1REOjpfX3Rocm93X2xlbmd0aF9lcnJvcigidmVjdG9yIik7Cit9CisKK3RlbXBsYXRlIDxib29sIF9fYj4KK3ZvaWQKK19fdmVjdG9yX2Jhc2VfY29tbW9uPF9fYj46Ol9fdGhyb3dfb3V0X29mX3JhbmdlKCkgY29uc3QKK3sKKyAgICBfVlNURDo6X190aHJvd19vdXRfb2ZfcmFuZ2UoInZlY3RvciIpOworfQorCitfTElCQ1BQX0VYVEVSTl9URU1QTEFURShjbGFzcyBfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9UWVBFX1ZJUyBfX3ZlY3Rvcl9iYXNlX2NvbW1vbjx0cnVlPikKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2NsYXNzIF9fdmVjdG9yX2Jhc2UKKyAgICA6IHByb3RlY3RlZCBfX3ZlY3Rvcl9iYXNlX2NvbW1vbjx0cnVlPgoreworcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0FsbG9jYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+ICAgICAgICAgX19hbGxvY190cmFpdHM7CisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19hbGxvY190cmFpdHM6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2FsbG9jX3RyYWl0czo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpwb2ludGVyICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpjb25zdF9wb2ludGVyICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiBjb25zdF9wb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworCisgICAgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWdpbl87CisgICAgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19lbmRfOworICAgIF9fY29tcHJlc3NlZF9wYWlyPHBvaW50ZXIsIGFsbG9jYXRvcl90eXBlPiBfX2VuZF9jYXBfOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGFsbG9jYXRvcl90eXBlJiBfX2FsbG9jKCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19lbmRfY2FwXy5zZWNvbmQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2FsbG9jKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19lbmRfY2FwXy5zZWNvbmQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHBvaW50ZXImIF9fZW5kX2NhcCgpIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fZW5kX2NhcF8uZmlyc3QoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0IHBvaW50ZXImIF9fZW5kX2NhcCgpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fZW5kX2NhcF8uZmlyc3QoKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgX192ZWN0b3JfYmFzZSgpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfX3ZlY3Rvcl9iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworICAgIH5fX3ZlY3Rvcl9iYXNlKCk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBjbGVhcigpIF9OT0VYQ0VQVCB7X19kZXN0cnVjdF9hdF9lbmQoX19iZWdpbl8pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGNhcGFjaXR5KCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX2VuZF9jYXAoKSAtIF9fYmVnaW5fKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX2Rlc3RydWN0X2F0X2VuZChwb2ludGVyIF9fbmV3X2xhc3QpIF9OT0VYQ0VQVDsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fY29weV9hc3NpZ25fYWxsb2MoY29uc3QgX192ZWN0b3JfYmFzZSYgX19jKQorICAgICAgICB7X19jb3B5X2Fzc2lnbl9hbGxvYyhfX2MsIGludGVncmFsX2NvbnN0YW50PGJvb2wsCisgICAgICAgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfY29weV9hc3NpZ25tZW50Ojp2YWx1ZT4oKSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19tb3ZlX2Fzc2lnbl9hbGxvYyhfX3ZlY3Rvcl9iYXNlJiBfX2MpCisgICAgICAgIF9OT0VYQ0VQVF8oCisgICAgICAgICAgICAhX19hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50Ojp2YWx1ZSB8fAorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSkKKyAgICAgICAge19fbW92ZV9hc3NpZ25fYWxsb2MoX19jLCBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgICAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWU+KCkpO30KK3ByaXZhdGU6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19jb3B5X2Fzc2lnbl9hbGxvYyhjb25zdCBfX3ZlY3Rvcl9iYXNlJiBfX2MsIHRydWVfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9fYWxsb2MoKSAhPSBfX2MuX19hbGxvYygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsZWFyKCk7CisgICAgICAgICAgICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hbGxvYygpLCBfX2JlZ2luXywgY2FwYWNpdHkoKSk7CisgICAgICAgICAgICAgICAgX19iZWdpbl8gPSBfX2VuZF8gPSBfX2VuZF9jYXAoKSA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2FsbG9jKCkgPSBfX2MuX19hbGxvYygpOworICAgICAgICB9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX2NvcHlfYXNzaWduX2FsbG9jKGNvbnN0IF9fdmVjdG9yX2Jhc2UmLCBmYWxzZV90eXBlKQorICAgICAgICB7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19tb3ZlX2Fzc2lnbl9hbGxvYyhfX3ZlY3Rvcl9iYXNlJiBfX2MsIHRydWVfdHlwZSkKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBfX2FsbG9jKCkgPSBfVlNURDo6bW92ZShfX2MuX19hbGxvYygpKTsKKyAgICAgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19tb3ZlX2Fzc2lnbl9hbGxvYyhfX3ZlY3Rvcl9iYXNlJiwgZmFsc2VfdHlwZSkKKyAgICAgICAgX05PRVhDRVBUCisgICAgICAgIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK19fdmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2NhdG9yPjo6X19kZXN0cnVjdF9hdF9lbmQocG9pbnRlciBfX25ld19sYXN0KSBfTk9FWENFUFQKK3sKKyAgICBwb2ludGVyIF9fc29vbl90b19iZV9lbmQgPSBfX2VuZF87CisgICAgd2hpbGUgKF9fbmV3X2xhc3QgIT0gX19zb29uX3RvX2JlX2VuZCkKKyAgICAgICAgX19hbGxvY190cmFpdHM6OmRlc3Ryb3koX19hbGxvYygpLCBfVlNURDo6X190b19yYXdfcG9pbnRlcigtLV9fc29vbl90b19iZV9lbmQpKTsKKyAgICBfX2VuZF8gPSBfX25ld19sYXN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19fdmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2NhdG9yPjo6X192ZWN0b3JfYmFzZSgpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSkKKyAgICA6IF9fYmVnaW5fKG51bGxwdHIpLAorICAgICAgX19lbmRfKG51bGxwdHIpLAorICAgICAgX19lbmRfY2FwXyhudWxscHRyKQoreworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19fdmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2NhdG9yPjo6X192ZWN0b3JfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX19iZWdpbl8obnVsbHB0ciksCisgICAgICBfX2VuZF8obnVsbHB0ciksCisgICAgICBfX2VuZF9jYXBfKG51bGxwdHIsIF9fYSkKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK19fdmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2NhdG9yPjo6fl9fdmVjdG9yX2Jhc2UoKQoreworICAgIGlmIChfX2JlZ2luXyAhPSBudWxscHRyKQorICAgIHsKKyAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hbGxvYygpLCBfX2JlZ2luXywgY2FwYWNpdHkoKSk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yIC8qID0gYWxsb2NhdG9yPF9UcD4gKi8+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB2ZWN0b3IKKyAgICA6IHByaXZhdGUgX192ZWN0b3JfYmFzZTxfVHAsIF9BbGxvY2F0b3I+Cit7Citwcml2YXRlOgorICAgIHR5cGVkZWYgX192ZWN0b3JfYmFzZTxfVHAsIF9BbGxvY2F0b3I+ICAgICAgICAgICBfX2Jhc2U7CisgICAgdHlwZWRlZiBhbGxvY2F0b3I8X1RwPiAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZGVmYXVsdF9hbGxvY2F0b3JfdHlwZTsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zZWxmOworICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0FsbG9jYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYmFzZTo6X19hbGxvY190cmFpdHMgICAgICAgICAgX19hbGxvY190cmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6OnJlZmVyZW5jZSAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19iYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIF9fd3JhcF9pdGVyPHBvaW50ZXI+ICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfX3dyYXBfaXRlcjxjb25zdF9wb2ludGVyPiAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgX1ZTVEQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9WU1REOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICBzdGF0aWNfYXNzZXJ0KChpc19zYW1lPHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjp2YWx1ZV90eXBlLCB2YWx1ZV90eXBlPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgIkFsbG9jYXRvcjo6dmFsdWVfdHlwZSBtdXN0IGJlIHNhbWUgdHlwZSBhcyB2YWx1ZV90eXBlIik7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmVjdG9yKCkgX05PRVhDRVBUXyhpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKQorICAgICAgICB7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgICAgICAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IHZlY3Rvcihjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2lmIF9MSUJDUFBfU1REX1ZFUiA8PSAxNAorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpCisjZWxzZQorICAgICAgICBfTk9FWENFUFQKKyNlbmRpZgorICAgICAgICA6IF9fYmFzZShfX2EpCisgICAgeworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgfQorICAgIGV4cGxpY2l0IHZlY3RvcihzaXplX3R5cGUgX19uKTsKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorICAgIGV4cGxpY2l0IHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyNlbmRpZgorICAgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdF9yZWZlcmVuY2UgX194KTsKKyAgICB2ZWN0b3Ioc2l6ZV90eXBlIF9fbiwgY29uc3RfcmVmZXJlbmNlIF9feCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2ZWN0b3IoX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX2lucHV0X2l0ZXJhdG9yICA8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIV9faXNfZm9yd2FyZF9pdGVyYXRvcjxfSW5wdXRJdGVyYXRvcj46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19jb25zdHJ1Y3RpYmxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnJlZmVyZW5jZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3I+Ojp0eXBlIF9fbGFzdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2ZWN0b3IoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hLAorICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfaW5wdXRfaXRlcmF0b3IgIDxfSW5wdXRJdGVyYXRvcj46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NvbnN0cnVjdGlibGU8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6cmVmZXJlbmNlPjo6dmFsdWU+Ojp0eXBlKiA9IDApOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICB2ZWN0b3IoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NvbnN0cnVjdGlibGU8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjpyZWZlcmVuY2U+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3I+Ojp0eXBlIF9fbGFzdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHZlY3RvcihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hLAorICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NvbnN0cnVjdGlibGU8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjpyZWZlcmVuY2U+Ojp2YWx1ZT46OnR5cGUqID0gMCk7CisKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgfnZlY3RvcigpCisgICAgeworICAgICAgICBfX2dldF9kYigpLT5fX2VyYXNlX2ModGhpcyk7CisgICAgfQorI2VuZGlmCisKKyAgICB2ZWN0b3IoY29uc3QgdmVjdG9yJiBfX3gpOworICAgIHZlY3Rvcihjb25zdCB2ZWN0b3ImIF9feCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZlY3RvciYgb3BlcmF0b3I9KGNvbnN0IHZlY3RvciYgX194KTsKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmVjdG9yKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmVjdG9yKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmVjdG9yKHZlY3RvciYmIF9feCkKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAorICAgICAgICBfTk9FWENFUFQ7CisjZWxzZQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpOworI2VuZGlmCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmVjdG9yKHZlY3RvciYmIF9feCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZlY3RvciYgb3BlcmF0b3I9KHZlY3RvciYmIF9feCkKKyAgICAgICAgX05PRVhDRVBUXygoX19ub2V4Y2VwdF9tb3ZlX2Fzc2lnbl9jb250YWluZXI8X0FsbG9jYXRvciwgX19hbGxvY190cmFpdHM+Ojp2YWx1ZSkpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZlY3RvciYgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkKKyAgICAgICAge2Fzc2lnbihfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpOyByZXR1cm4gKnRoaXM7fQorCisjZW5kaWYgIC8vICFfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgICBfX2lzX2lucHV0X2l0ZXJhdG9yICA8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgIV9faXNfZm9yd2FyZF9pdGVyYXRvcjxfSW5wdXRJdGVyYXRvcj46OnZhbHVlICYmCisgICAgICAgICAgICBpc19jb25zdHJ1Y3RpYmxlPAorICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjpyZWZlcmVuY2U+Ojp2YWx1ZSwKKyAgICAgICAgICAgIHZvaWQKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGlzX2NvbnN0cnVjdGlibGU8CisgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6cmVmZXJlbmNlPjo6dmFsdWUsCisgICAgICAgICAgICB2b2lkCisgICAgICAgID46OnR5cGUKKyAgICAgICAgYXNzaWduKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworCisgICAgdm9pZCBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3RfcmVmZXJlbmNlIF9fdSk7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkKKyAgICAgICAge2Fzc2lnbihfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpO30KKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiB0aGlzLT5fX2FsbG9jKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpdGVyYXRvciAgICAgICAgICAgICAgIGJlZ2luKCkgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfaXRlcmF0b3IgICAgICAgICBiZWdpbigpICAgY29uc3QgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaXRlcmF0b3IgICAgICAgICAgICAgICBlbmQoKSBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9pdGVyYXRvciAgICAgICAgIGVuZCgpICAgICBjb25zdCBfTk9FWENFUFQ7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmV2ZXJzZV9pdGVyYXRvciAgICAgICByYmVnaW4oKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiAgICAgICByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmV2ZXJzZV9pdGVyYXRvciAgICAgICByZW5kKCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgY2JlZ2luKCkgIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciAgICAgICAgIGNlbmQoKSAgICBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBlbmQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY3JiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIHJiZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmVuZCgpICAgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gcmVuZCgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdHlwZT4odGhpcy0+X19lbmRfIC0gdGhpcy0+X19iZWdpbl8pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90eXBlIGNhcGFjaXR5KCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19iYXNlOjpjYXBhY2l0eSgpO30KKyAgICBfTElCQ1BQX05PRElTQ0FSRF9BRlRFUl9DWFgxNyBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIHRoaXMtPl9fYmVnaW5fID09IHRoaXMtPl9fZW5kXzt9CisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgX05PRVhDRVBUOworICAgIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgX19uKTsKKyAgICB2b2lkIHNocmlua190b19maXQoKSBfTk9FWENFUFQ7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHJlZmVyZW5jZSAgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3Q7CisgICAgcmVmZXJlbmNlICAgICAgIGF0KHNpemVfdHlwZSBfX24pOworICAgIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSBjb25zdDsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmVmZXJlbmNlICAgICAgIGZyb250KCkKKyAgICB7CisgICAgICAgIF9MSUJDUFBfQVNTRVJUKCFlbXB0eSgpLCAiZnJvbnQoKSBjYWxsZWQgZm9yIGVtcHR5IHZlY3RvciIpOworICAgICAgICByZXR1cm4gKnRoaXMtPl9fYmVnaW5fOworICAgIH0KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0CisgICAgeworICAgICAgICBfTElCQ1BQX0FTU0VSVCghZW1wdHkoKSwgImZyb250KCkgY2FsbGVkIGZvciBlbXB0eSB2ZWN0b3IiKTsKKyAgICAgICAgcmV0dXJuICp0aGlzLT5fX2JlZ2luXzsKKyAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByZWZlcmVuY2UgICAgICAgYmFjaygpCisgICAgeworICAgICAgICBfTElCQ1BQX0FTU0VSVCghZW1wdHkoKSwgImJhY2soKSBjYWxsZWQgZm9yIGVtcHR5IHZlY3RvciIpOworICAgICAgICByZXR1cm4gKih0aGlzLT5fX2VuZF8gLSAxKTsKKyAgICB9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9yZWZlcmVuY2UgYmFjaygpICBjb25zdAorICAgIHsKKyAgICAgICAgX0xJQkNQUF9BU1NFUlQoIWVtcHR5KCksICJiYWNrKCkgY2FsbGVkIGZvciBlbXB0eSB2ZWN0b3IiKTsKKyAgICAgICAgcmV0dXJuICoodGhpcy0+X19lbmRfIC0gMSk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZhbHVlX3R5cGUqICAgICAgIGRhdGEoKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfVlNURDo6X190b19yYXdfcG9pbnRlcih0aGlzLT5fX2JlZ2luXyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdCB2YWx1ZV90eXBlKiBkYXRhKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX1ZTVEQ6Ol9fdG9fcmF3X3BvaW50ZXIodGhpcy0+X19iZWdpbl8pO30KKworI2lmZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fZW1wbGFjZV9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgeyBwdXNoX2JhY2soX194KTsgfQorI2Vsc2UKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0FyZz4KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX2VtcGxhY2VfYmFjayhfQXJnJiYgX19hcmcpIHsKKyAgICAgIGVtcGxhY2VfYmFjayhfVlNURDo6Zm9yd2FyZDxfQXJnPihfX2FyZykpOworICAgIH0KKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIHB1c2hfYmFjayhjb25zdF9yZWZlcmVuY2UgX194KTsKKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgcHVzaF9iYWNrKHZhbHVlX3R5cGUmJiBfX3gpOworCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorICAgICAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKyAgICAgICAgcmVmZXJlbmNlIGVtcGxhY2VfYmFjayhfQXJncyYmLi4uIF9fYXJncyk7CisjZWxzZQorICAgICAgICB2b2lkICAgICAgZW1wbGFjZV9iYWNrKF9BcmdzJiYuLi4gX19hcmdzKTsKKyNlbmRpZgorI2VuZGlmIC8vICFfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIHBvcF9iYWNrKCk7CisKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3RfcmVmZXJlbmNlIF9feCk7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIHZhbHVlX3R5cGUmJiBfX3gpOworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IgZW1wbGFjZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncyk7CisjZW5kaWYgIC8vICFfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdF9yZWZlcmVuY2UgX194KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICAgX19pc19pbnB1dF9pdGVyYXRvciAgPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICFfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfY29uc3RydWN0aWJsZTwKKyAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6cmVmZXJlbmNlPjo6dmFsdWUsCisgICAgICAgICAgICBpdGVyYXRvcgorICAgICAgICA+Ojp0eXBlCisgICAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgaXNfY29uc3RydWN0aWJsZTwKKyAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjpyZWZlcmVuY2U+Ojp2YWx1ZSwKKyAgICAgICAgICAgIGl0ZXJhdG9yCisgICAgICAgID46OnR5cGUKKyAgICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQorICAgICAgICB7cmV0dXJuIGluc2VydChfX3Bvc2l0aW9uLCBfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpO30KKyNlbmRpZgorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKTsKKyAgICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgY2xlYXIoKSBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gc2l6ZSgpOworICAgICAgICBfX2Jhc2U6OmNsZWFyKCk7CisgICAgICAgIF9fYW5ub3RhdGVfc2hyaW5rKF9fb2xkX3NpemUpOworICAgICAgICBfX2ludmFsaWRhdGVfYWxsX2l0ZXJhdG9ycygpOworICAgIH0KKworICAgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX3N6KTsKKyAgICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19zeiwgY29uc3RfcmVmZXJlbmNlIF9feCk7CisKKyAgICB2b2lkIHN3YXAodmVjdG9yJikKKyNpZiBfTElCQ1BQX1NURF9WRVIgPj0gMTQKKyAgICAgICAgX05PRVhDRVBUX0RFQlVHOworI2Vsc2UKKyAgICAgICAgX05PRVhDRVBUX0RFQlVHXyghX19hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgX19pc19ub3Rocm93X3N3YXBwYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKTsKKyNlbmRpZgorCisgICAgYm9vbCBfX2ludmFyaWFudHMoKSBjb25zdDsKKworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorCisgICAgYm9vbCBfX2RlcmVmZXJlbmNlYWJsZShjb25zdCBjb25zdF9pdGVyYXRvciogX19pKSBjb25zdDsKKyAgICBib29sIF9fZGVjcmVtZW50YWJsZShjb25zdCBjb25zdF9pdGVyYXRvciogX19pKSBjb25zdDsKKyAgICBib29sIF9fYWRkYWJsZShjb25zdCBjb25zdF9pdGVyYXRvciogX19pLCBwdHJkaWZmX3QgX19uKSBjb25zdDsKKyAgICBib29sIF9fc3Vic2NyaXB0YWJsZShjb25zdCBjb25zdF9pdGVyYXRvciogX19pLCBwdHJkaWZmX3QgX19uKSBjb25zdDsKKworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKworcHJpdmF0ZToKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgX19pbnZhbGlkYXRlX2FsbF9pdGVyYXRvcnMoKTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgX19pbnZhbGlkYXRlX2l0ZXJhdG9yc19wYXN0KHBvaW50ZXIgX19uZXdfbGFzdCk7CisgICAgdm9pZCBhbGxvY2F0ZShzaXplX3R5cGUgX19uKTsKKyAgICB2b2lkIGRlYWxsb2NhdGUoKSBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzaXplX3R5cGUgX19yZWNvbW1lbmQoc2l6ZV90eXBlIF9fbmV3X3NpemUpIGNvbnN0OworICAgIHZvaWQgX19jb25zdHJ1Y3RfYXRfZW5kKHNpemVfdHlwZSBfX24pOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fY29uc3RydWN0X2F0X2VuZChzaXplX3R5cGUgX19uLCBjb25zdF9yZWZlcmVuY2UgX194KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgICAgICAgICB2b2lkCisgICAgICAgID46OnR5cGUKKyAgICAgICAgX19jb25zdHJ1Y3RfYXRfZW5kKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIHNpemVfdHlwZSBfX24pOworICAgIHZvaWQgX19hcHBlbmQoc2l6ZV90eXBlIF9fbik7CisgICAgdm9pZCBfX2FwcGVuZChzaXplX3R5cGUgX19uLCBjb25zdF9yZWZlcmVuY2UgX194KTsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgICAgICAgX19tYWtlX2l0ZXIocG9pbnRlciBfX3ApIF9OT0VYQ0VQVDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgX19tYWtlX2l0ZXIoY29uc3RfcG9pbnRlciBfX3ApIGNvbnN0IF9OT0VYQ0VQVDsKKyAgICB2b2lkIF9fc3dhcF9vdXRfY2lyY3VsYXJfYnVmZmVyKF9fc3BsaXRfYnVmZmVyPHZhbHVlX3R5cGUsIGFsbG9jYXRvcl90eXBlJj4mIF9fdik7CisgICAgcG9pbnRlciBfX3N3YXBfb3V0X2NpcmN1bGFyX2J1ZmZlcihfX3NwbGl0X2J1ZmZlcjx2YWx1ZV90eXBlLCBhbGxvY2F0b3JfdHlwZSY+JiBfX3YsIHBvaW50ZXIgX19wKTsKKyAgICB2b2lkIF9fbW92ZV9yYW5nZShwb2ludGVyIF9fZnJvbV9zLCBwb2ludGVyIF9fZnJvbV9lLCBwb2ludGVyIF9fdG8pOworICAgIHZvaWQgX19tb3ZlX2Fzc2lnbih2ZWN0b3ImIF9fYywgdHJ1ZV90eXBlKQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpOworICAgIHZvaWQgX19tb3ZlX2Fzc2lnbih2ZWN0b3ImIF9fYywgZmFsc2VfdHlwZSkKKyAgICAgICAgX05PRVhDRVBUXyhfX2FsbG9jX3RyYWl0czo6aXNfYWx3YXlzX2VxdWFsOjp2YWx1ZSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19kZXN0cnVjdF9hdF9lbmQocG9pbnRlciBfX25ld19sYXN0KSBfTk9FWENFUFQKKyAgICB7CisgICAgICAgIF9faW52YWxpZGF0ZV9pdGVyYXRvcnNfcGFzdChfX25ld19sYXN0KTsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBzaXplKCk7CisgICAgICAgIF9fYmFzZTo6X19kZXN0cnVjdF9hdF9lbmQoX19uZXdfbGFzdCk7CisgICAgICAgIF9fYW5ub3RhdGVfc2hyaW5rKF9fb2xkX3NpemUpOworICAgIH0KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1VwPiB2b2lkIF9fcHVzaF9iYWNrX3Nsb3dfcGF0aChfVXAmJiBfX3gpOworCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIF9BcmdzPgorICAgIHZvaWQgX19lbXBsYWNlX2JhY2tfc2xvd19wYXRoKF9BcmdzJiYuLi4gX19hcmdzKTsKKyNlbHNlCisgICAgdGVtcGxhdGUgPGNsYXNzIF9VcD4gdm9pZCBfX3B1c2hfYmFja19zbG93X3BhdGgoX1VwJiBfX3gpOworI2VuZGlmCisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgbm8tb3BzIG91dHNpZGUgb2YgQWRkcmVzc1Nhbml0aXplciBtb2RlLgorICAgIC8vIFdlIGNhbGwgYW5ub3RhdGF0aW9ucyBvbmx5IGZvciB0aGUgZGVmYXVsdCBBbGxvY2F0b3IgYmVjYXVzZSBvdGhlciBhbGxvY2F0b3JzCisgICAgLy8gbWF5IG5vdCBtZWV0IHRoZSBBZGRyZXNzU2FuaXRpemVyIGFsaWdubWVudCBjb25zdHJhaW50cy4KKyAgICAvLyBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIF9fc2FuaXRpemVyX2Fubm90YXRlX2NvbnRpZ3VvdXNfY29udGFpbmVyIGZvciBtb3JlIGRldGFpbHMuCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX0FTQU4KKyAgICB2b2lkIF9fYW5ub3RhdGVfY29udGlndW91c19jb250YWluZXIoY29uc3Qgdm9pZCAqX19iZWcsIGNvbnN0IHZvaWQgKl9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpfX29sZF9taWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKl9fbmV3X21pZCkgY29uc3QKKyAgICB7CisKKyAgICAgIGlmIChfX2JlZyAmJiBpc19zYW1lPGFsbG9jYXRvcl90eXBlLCBfX2RlZmF1bHRfYWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSkKKyAgICAgICAgX19zYW5pdGl6ZXJfYW5ub3RhdGVfY29udGlndW91c19jb250YWluZXIoX19iZWcsIF9fZW5kLCBfX29sZF9taWQsIF9fbmV3X21pZCk7CisgICAgfQorI2Vsc2UKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX2Fubm90YXRlX2NvbnRpZ3VvdXNfY29udGFpbmVyKGNvbnN0IHZvaWQqLCBjb25zdCB2b2lkKiwgY29uc3Qgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqKSBjb25zdCB7fQorI2VuZGlmCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19hbm5vdGF0ZV9uZXcoc2l6ZV90eXBlIF9fY3VycmVudF9zaXplKSBjb25zdCB7CisgICAgICBfX2Fubm90YXRlX2NvbnRpZ3VvdXNfY29udGFpbmVyKGRhdGEoKSwgZGF0YSgpICsgY2FwYWNpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSgpICsgY2FwYWNpdHkoKSwgZGF0YSgpICsgX19jdXJyZW50X3NpemUpOworICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fYW5ub3RhdGVfZGVsZXRlKCkgY29uc3QgeworICAgICAgX19hbm5vdGF0ZV9jb250aWd1b3VzX2NvbnRhaW5lcihkYXRhKCksIGRhdGEoKSArIGNhcGFjaXR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEoKSArIHNpemUoKSwgZGF0YSgpICsgY2FwYWNpdHkoKSk7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19hbm5vdGF0ZV9pbmNyZWFzZShzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fYW5ub3RhdGVfY29udGlndW91c19jb250YWluZXIoZGF0YSgpLCBkYXRhKCkgKyBjYXBhY2l0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKCkgKyBzaXplKCksIGRhdGEoKSArIHNpemUoKSArIF9fbik7CisgICAgfQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19hbm5vdGF0ZV9zaHJpbmsoc2l6ZV90eXBlIF9fb2xkX3NpemUpIGNvbnN0CisgICAgeworICAgICAgX19hbm5vdGF0ZV9jb250aWd1b3VzX2NvbnRhaW5lcihkYXRhKCksIGRhdGEoKSArIGNhcGFjaXR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEoKSArIF9fb2xkX3NpemUsIGRhdGEoKSArIHNpemUoKSk7CisgICAgfQorI2lmbmRlZiBfTElCQ1BQX0hBU19OT19BU0FOCisgICAgLy8gVGhlIGFubm90YXRpb24gZm9yIHNpemUgaW5jcmVhc2Ugc2hvdWxkIGhhcHBlbiBiZWZvcmUgdGhlIGFjdHVhbCBpbmNyZWFzZSwKKyAgICAvLyBidXQgaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBhZnRlciB0aGF0IHRoZSBhbm5vdGF0aW9uIGhhcyB0byBiZSB1bmRvbmUuCisgICAgc3RydWN0IF9fUkFJSV9JbmNyZWFzZUFubm90YXRvciB7CisgICAgICBfX1JBSUlfSW5jcmVhc2VBbm5vdGF0b3IoY29uc3QgdmVjdG9yICZfX3YsIHNpemVfdHlwZSBfX24gPSAxKQorICAgICAgICA6IF9fY29tbWl0KGZhbHNlKSwgX192KF9fdiksIF9fb2xkX3NpemUoX192LnNpemUoKSArIF9fbikgeworICAgICAgICBfX3YuX19hbm5vdGF0ZV9pbmNyZWFzZShfX24pOworICAgICAgfQorICAgICAgdm9pZCBfX2RvbmUoKSB7IF9fY29tbWl0ID0gdHJ1ZTsgfQorICAgICAgfl9fUkFJSV9JbmNyZWFzZUFubm90YXRvcigpIHsKKyAgICAgICAgaWYgKF9fY29tbWl0KSByZXR1cm47CisgICAgICAgIF9fdi5fX2Fubm90YXRlX3NocmluayhfX29sZF9zaXplKTsKKyAgICAgIH0KKyAgICAgIGJvb2wgX19jb21taXQ7CisgICAgICBjb25zdCB2ZWN0b3IgJl9fdjsKKyAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplOworICAgIH07CisjZWxzZQorICAgIHN0cnVjdCBfX1JBSUlfSW5jcmVhc2VBbm5vdGF0b3IgeworICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgICAgX19SQUlJX0luY3JlYXNlQW5ub3RhdG9yKGNvbnN0IHZlY3RvciAmLCBzaXplX3R5cGUgPSAxKSB7fQorICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIF9fZG9uZSgpIHt9CisgICAgfTsKKyNlbmRpZgorCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46Ol9fc3dhcF9vdXRfY2lyY3VsYXJfYnVmZmVyKF9fc3BsaXRfYnVmZmVyPHZhbHVlX3R5cGUsIGFsbG9jYXRvcl90eXBlJj4mIF9fdikKK3sKKyAgICBfX2Fubm90YXRlX2RlbGV0ZSgpOworICAgIF9fYWxsb2NfdHJhaXRzOjpfX2NvbnN0cnVjdF9iYWNrd2FyZCh0aGlzLT5fX2FsbG9jKCksIHRoaXMtPl9fYmVnaW5fLCB0aGlzLT5fX2VuZF8sIF9fdi5fX2JlZ2luXyk7CisgICAgX1ZTVEQ6OnN3YXAodGhpcy0+X19iZWdpbl8sIF9fdi5fX2JlZ2luXyk7CisgICAgX1ZTVEQ6OnN3YXAodGhpcy0+X19lbmRfLCBfX3YuX19lbmRfKTsKKyAgICBfVlNURDo6c3dhcCh0aGlzLT5fX2VuZF9jYXAoKSwgX192Ll9fZW5kX2NhcCgpKTsKKyAgICBfX3YuX19maXJzdF8gPSBfX3YuX19iZWdpbl87CisgICAgX19hbm5vdGF0ZV9uZXcoc2l6ZSgpKTsKKyAgICBfX2ludmFsaWRhdGVfYWxsX2l0ZXJhdG9ycygpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgdmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OnBvaW50ZXIKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjpfX3N3YXBfb3V0X2NpcmN1bGFyX2J1ZmZlcihfX3NwbGl0X2J1ZmZlcjx2YWx1ZV90eXBlLCBhbGxvY2F0b3JfdHlwZSY+JiBfX3YsIHBvaW50ZXIgX19wKQoreworICAgIF9fYW5ub3RhdGVfZGVsZXRlKCk7CisgICAgcG9pbnRlciBfX3IgPSBfX3YuX19iZWdpbl87CisgICAgX19hbGxvY190cmFpdHM6Ol9fY29uc3RydWN0X2JhY2t3YXJkKHRoaXMtPl9fYWxsb2MoKSwgdGhpcy0+X19iZWdpbl8sIF9fcCwgX192Ll9fYmVnaW5fKTsKKyAgICBfX2FsbG9jX3RyYWl0czo6X19jb25zdHJ1Y3RfZm9yd2FyZCh0aGlzLT5fX2FsbG9jKCksIF9fcCwgdGhpcy0+X19lbmRfLCBfX3YuX19lbmRfKTsKKyAgICBfVlNURDo6c3dhcCh0aGlzLT5fX2JlZ2luXywgX192Ll9fYmVnaW5fKTsKKyAgICBfVlNURDo6c3dhcCh0aGlzLT5fX2VuZF8sIF9fdi5fX2VuZF8pOworICAgIF9WU1REOjpzd2FwKHRoaXMtPl9fZW5kX2NhcCgpLCBfX3YuX19lbmRfY2FwKCkpOworICAgIF9fdi5fX2ZpcnN0XyA9IF9fdi5fX2JlZ2luXzsKKyAgICBfX2Fubm90YXRlX25ldyhzaXplKCkpOworICAgIF9faW52YWxpZGF0ZV9hbGxfaXRlcmF0b3JzKCk7CisgICAgcmV0dXJuIF9fcjsKK30KKworLy8gIEFsbG9jYXRlIHNwYWNlIGZvciBfX24gb2JqZWN0cworLy8gIHRocm93cyBsZW5ndGhfZXJyb3IgaWYgX19uID4gbWF4X3NpemUoKQorLy8gIHRocm93cyAocHJvYmFibHkgYmFkX2FsbG9jKSBpZiBtZW1vcnkgcnVuIG91dAorLy8gIFByZWNvbmRpdGlvbjogIF9fYmVnaW5fID09IF9fZW5kXyA9PSBfX2VuZF9jYXAoKSA9PSAwCisvLyAgUHJlY29uZGl0aW9uOiAgX19uID4gMAorLy8gIFBvc3Rjb25kaXRpb246ICBjYXBhY2l0eSgpID09IF9fbgorLy8gIFBvc3Rjb25kaXRpb246ICBzaXplKCkgPT0gMAordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjphbGxvY2F0ZShzaXplX3R5cGUgX19uKQoreworICAgIGlmIChfX24gPiBtYXhfc2l6ZSgpKQorICAgICAgICB0aGlzLT5fX3Rocm93X2xlbmd0aF9lcnJvcigpOworICAgIHRoaXMtPl9fYmVnaW5fID0gdGhpcy0+X19lbmRfID0gX19hbGxvY190cmFpdHM6OmFsbG9jYXRlKHRoaXMtPl9fYWxsb2MoKSwgX19uKTsKKyAgICB0aGlzLT5fX2VuZF9jYXAoKSA9IHRoaXMtPl9fYmVnaW5fICsgX19uOworICAgIF9fYW5ub3RhdGVfbmV3KDApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OmRlYWxsb2NhdGUoKSBfTk9FWENFUFQKK3sKKyAgICBpZiAodGhpcy0+X19iZWdpbl8gIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIGNsZWFyKCk7CisgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKHRoaXMtPl9fYWxsb2MoKSwgdGhpcy0+X19iZWdpbl8sIGNhcGFjaXR5KCkpOworICAgICAgICB0aGlzLT5fX2JlZ2luXyA9IHRoaXMtPl9fZW5kXyA9IHRoaXMtPl9fZW5kX2NhcCgpID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6bWF4X3NpemUoKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX1ZTVEQ6Om1pbjxzaXplX3R5cGU+KF9fYWxsb2NfdHJhaXRzOjptYXhfc2l6ZSh0aGlzLT5fX2FsbG9jKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpY19saW1pdHM8ZGlmZmVyZW5jZV90eXBlPjo6bWF4KCkpOworfQorCisvLyAgUHJlY29uZGl0aW9uOiAgX19uZXdfc2l6ZSA+IGNhcGFjaXR5KCkKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgdmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OnNpemVfdHlwZQordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46Ol9fcmVjb21tZW5kKHNpemVfdHlwZSBfX25ld19zaXplKSBjb25zdAoreworICAgIGNvbnN0IHNpemVfdHlwZSBfX21zID0gbWF4X3NpemUoKTsKKyAgICBpZiAoX19uZXdfc2l6ZSA+IF9fbXMpCisgICAgICAgIHRoaXMtPl9fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fY2FwID0gY2FwYWNpdHkoKTsKKyAgICBpZiAoX19jYXAgPj0gX19tcyAvIDIpCisgICAgICAgIHJldHVybiBfX21zOworICAgIHJldHVybiBfVlNURDo6bWF4PHNpemVfdHlwZT4oMipfX2NhcCwgX19uZXdfc2l6ZSk7Cit9CisKKy8vICBEZWZhdWx0IGNvbnN0cnVjdHMgX19uIG9iamVjdHMgc3RhcnRpbmcgYXQgX19lbmRfCisvLyAgdGhyb3dzIGlmIGNvbnN0cnVjdGlvbiB0aHJvd3MKKy8vICBQcmVjb25kaXRpb246ICBfX24gPiAwCisvLyAgUHJlY29uZGl0aW9uOiAgc2l6ZSgpICsgX19uIDw9IGNhcGFjaXR5KCkKKy8vICBQb3N0Y29uZGl0aW9uOiAgc2l6ZSgpID09IHNpemUoKSArIF9fbgordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjpfX2NvbnN0cnVjdF9hdF9lbmQoc2l6ZV90eXBlIF9fbikKK3sKKyAgICBhbGxvY2F0b3JfdHlwZSYgX19hID0gdGhpcy0+X19hbGxvYygpOworICAgIGRvCisgICAgeworICAgICAgICBfX1JBSUlfSW5jcmVhc2VBbm5vdGF0b3IgX19hbm5vdGF0b3IoKnRoaXMpOworICAgICAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX1ZTVEQ6Ol9fdG9fcmF3X3BvaW50ZXIodGhpcy0+X19lbmRfKSk7CisgICAgICAgICsrdGhpcy0+X19lbmRfOworICAgICAgICAtLV9fbjsKKyAgICAgICAgX19hbm5vdGF0b3IuX19kb25lKCk7CisgICAgfSB3aGlsZSAoX19uID4gMCk7Cit9CisKKy8vICBDb3B5IGNvbnN0cnVjdHMgX19uIG9iamVjdHMgc3RhcnRpbmcgYXQgX19lbmRfIGZyb20gX194CisvLyAgdGhyb3dzIGlmIGNvbnN0cnVjdGlvbiB0aHJvd3MKKy8vICBQcmVjb25kaXRpb246ICBfX24gPiAwCisvLyAgUHJlY29uZGl0aW9uOiAgc2l6ZSgpICsgX19uIDw9IGNhcGFjaXR5KCkKKy8vICBQb3N0Y29uZGl0aW9uOiAgc2l6ZSgpID09IG9sZCBzaXplKCkgKyBfX24KKy8vICBQb3N0Y29uZGl0aW9uOiAgW2ldID09IF9feCBmb3IgYWxsIGkgaW4gW3NpemUoKSAtIF9fbiwgX19uKQordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZQordm9pZAordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46Ol9fY29uc3RydWN0X2F0X2VuZChzaXplX3R5cGUgX19uLCBjb25zdF9yZWZlcmVuY2UgX194KQoreworICAgIGFsbG9jYXRvcl90eXBlJiBfX2EgPSB0aGlzLT5fX2FsbG9jKCk7CisgICAgZG8KKyAgICB7CisgICAgICAgIF9fUkFJSV9JbmNyZWFzZUFubm90YXRvciBfX2Fubm90YXRvcigqdGhpcyk7CisgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19hLCBfVlNURDo6X190b19yYXdfcG9pbnRlcih0aGlzLT5fX2VuZF8pLCBfX3gpOworICAgICAgICArK3RoaXMtPl9fZW5kXzsKKyAgICAgICAgLS1fX247CisgICAgICAgIF9fYW5ub3RhdG9yLl9fZG9uZSgpOworICAgIH0gd2hpbGUgKF9fbiA+IDApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Cit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjpfX2NvbnN0cnVjdF9hdF9lbmQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgc2l6ZV90eXBlIF9fbikKK3sKKyAgICBhbGxvY2F0b3JfdHlwZSYgX19hID0gdGhpcy0+X19hbGxvYygpOworICAgIF9fUkFJSV9JbmNyZWFzZUFubm90YXRvciBfX2Fubm90YXRvcigqdGhpcywgX19uKTsKKyAgICBfX2FsbG9jX3RyYWl0czo6X19jb25zdHJ1Y3RfcmFuZ2VfZm9yd2FyZChfX2EsIF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+X19lbmRfKTsKKyAgICBfX2Fubm90YXRvci5fX2RvbmUoKTsKK30KKworLy8gIERlZmF1bHQgY29uc3RydWN0cyBfX24gb2JqZWN0cyBzdGFydGluZyBhdCBfX2VuZF8KKy8vICB0aHJvd3MgaWYgY29uc3RydWN0aW9uIHRocm93cworLy8gIFBvc3Rjb25kaXRpb246ICBzaXplKCkgPT0gc2l6ZSgpICsgX19uCisvLyAgRXhjZXB0aW9uIHNhZmV0eTogc3Ryb25nLgordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjpfX2FwcGVuZChzaXplX3R5cGUgX19uKQoreworICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3R5cGU+KHRoaXMtPl9fZW5kX2NhcCgpIC0gdGhpcy0+X19lbmRfKSA+PSBfX24pCisgICAgICAgIHRoaXMtPl9fY29uc3RydWN0X2F0X2VuZChfX24pOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFsbG9jYXRvcl90eXBlJiBfX2EgPSB0aGlzLT5fX2FsbG9jKCk7CisgICAgICAgIF9fc3BsaXRfYnVmZmVyPHZhbHVlX3R5cGUsIGFsbG9jYXRvcl90eXBlJj4gX192KF9fcmVjb21tZW5kKHNpemUoKSArIF9fbiksIHNpemUoKSwgX19hKTsKKyAgICAgICAgX192Ll9fY29uc3RydWN0X2F0X2VuZChfX24pOworICAgICAgICBfX3N3YXBfb3V0X2NpcmN1bGFyX2J1ZmZlcihfX3YpOworICAgIH0KK30KKworLy8gIERlZmF1bHQgY29uc3RydWN0cyBfX24gb2JqZWN0cyBzdGFydGluZyBhdCBfX2VuZF8KKy8vICB0aHJvd3MgaWYgY29uc3RydWN0aW9uIHRocm93cworLy8gIFBvc3Rjb25kaXRpb246ICBzaXplKCkgPT0gc2l6ZSgpICsgX19uCisvLyAgRXhjZXB0aW9uIHNhZmV0eTogc3Ryb25nLgordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjpfX2FwcGVuZChzaXplX3R5cGUgX19uLCBjb25zdF9yZWZlcmVuY2UgX194KQoreworICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3R5cGU+KHRoaXMtPl9fZW5kX2NhcCgpIC0gdGhpcy0+X19lbmRfKSA+PSBfX24pCisgICAgICAgIHRoaXMtPl9fY29uc3RydWN0X2F0X2VuZChfX24sIF9feCk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IHRoaXMtPl9fYWxsb2MoKTsKKyAgICAgICAgX19zcGxpdF9idWZmZXI8dmFsdWVfdHlwZSwgYWxsb2NhdG9yX3R5cGUmPiBfX3YoX19yZWNvbW1lbmQoc2l6ZSgpICsgX19uKSwgc2l6ZSgpLCBfX2EpOworICAgICAgICBfX3YuX19jb25zdHJ1Y3RfYXRfZW5kKF9fbiwgX194KTsKKyAgICAgICAgX19zd2FwX291dF9jaXJjdWxhcl9idWZmZXIoX192KTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6dmVjdG9yKHNpemVfdHlwZSBfX24pCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIGlmIChfX24gPiAwKQorICAgIHsKKyAgICAgICAgYWxsb2NhdGUoX19uKTsKKyAgICAgICAgX19jb25zdHJ1Y3RfYXRfZW5kKF9fbik7CisgICAgfQorfQorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6dmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX2Jhc2UoX19hKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRlKF9fbik7CisgICAgICAgIF9fY29uc3RydWN0X2F0X2VuZChfX24pOworICAgIH0KK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OnZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdF9yZWZlcmVuY2UgX194KQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRlKF9fbik7CisgICAgICAgIF9fY29uc3RydWN0X2F0X2VuZChfX24sIF9feCk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OnZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdF9yZWZlcmVuY2UgX194LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX19iYXNlKF9fYSkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgaWYgKF9fbiA+IDApCisgICAgeworICAgICAgICBhbGxvY2F0ZShfX24pOworICAgICAgICBfX2NvbnN0cnVjdF9hdF9lbmQoX19uLCBfX3gpOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+Ojp2ZWN0b3IoX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKyAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19pbnB1dF9pdGVyYXRvciAgPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAhX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBpc19jb25zdHJ1Y3RpYmxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6cmVmZXJlbmNlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yPjo6dHlwZSBfX2xhc3QpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICBfX2VtcGxhY2VfYmFjaygqX19maXJzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Cit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6dmVjdG9yKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSwKKyAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19pbnB1dF9pdGVyYXRvciAgPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAhX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBpc19jb25zdHJ1Y3RpYmxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6cmVmZXJlbmNlPjo6dmFsdWU+Ojp0eXBlKikKKyAgICA6IF9fYmFzZShfX2EpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICBfX2VtcGxhY2VfYmFjaygqX19maXJzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+Ojp2ZWN0b3IoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19mb3J3YXJkX2l0ZXJhdG9yPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19jb25zdHJ1Y3RpYmxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnJlZmVyZW5jZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvcj46OnR5cGUgX19sYXN0KQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBzaXplX3R5cGUgX19uID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfVlNURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KSk7CisgICAgaWYgKF9fbiA+IDApCisgICAgeworICAgICAgICBhbGxvY2F0ZShfX24pOworICAgICAgICBfX2NvbnN0cnVjdF9hdF9lbmQoX19maXJzdCwgX19sYXN0LCBfX24pOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OnZlY3RvcihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19mb3J3YXJkX2l0ZXJhdG9yPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19jb25zdHJ1Y3RpYmxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnJlZmVyZW5jZT46OnZhbHVlPjo6dHlwZSopCisgICAgOiBfX2Jhc2UoX19hKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBzaXplX3R5cGUgX19uID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfVlNURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KSk7CisgICAgaWYgKF9fbiA+IDApCisgICAgeworICAgICAgICBhbGxvY2F0ZShfX24pOworICAgICAgICBfX2NvbnN0cnVjdF9hdF9lbmQoX19maXJzdCwgX19sYXN0LCBfX24pOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+Ojp2ZWN0b3IoY29uc3QgdmVjdG9yJiBfX3gpCisgICAgOiBfX2Jhc2UoX19hbGxvY190cmFpdHM6OnNlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb24oX194Ll9fYWxsb2MoKSkpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIHNpemVfdHlwZSBfX24gPSBfX3guc2l6ZSgpOworICAgIGlmIChfX24gPiAwKQorICAgIHsKKyAgICAgICAgYWxsb2NhdGUoX19uKTsKKyAgICAgICAgX19jb25zdHJ1Y3RfYXRfZW5kKF9feC5fX2JlZ2luXywgX194Ll9fZW5kXywgX19uKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6dmVjdG9yKGNvbnN0IHZlY3RvciYgX194LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX19iYXNlKF9fYSkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgc2l6ZV90eXBlIF9fbiA9IF9feC5zaXplKCk7CisgICAgaWYgKF9fbiA+IDApCisgICAgeworICAgICAgICBhbGxvY2F0ZShfX24pOworICAgICAgICBfX2NvbnN0cnVjdF9hdF9lbmQoX194Ll9fYmVnaW5fLCBfX3guX19lbmRfLCBfX24pOworICAgIH0KK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6dmVjdG9yKHZlY3RvciYmIF9feCkKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAorICAgICAgICBfTk9FWENFUFQKKyNlbHNlCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSkKKyNlbmRpZgorICAgIDogX19iYXNlKF9WU1REOjptb3ZlKF9feC5fX2FsbG9jKCkpKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisgICAgX19nZXRfZGIoKS0+c3dhcCh0aGlzLCAmX194KTsKKyNlbmRpZgorICAgIHRoaXMtPl9fYmVnaW5fID0gX194Ll9fYmVnaW5fOworICAgIHRoaXMtPl9fZW5kXyA9IF9feC5fX2VuZF87CisgICAgdGhpcy0+X19lbmRfY2FwKCkgPSBfX3guX19lbmRfY2FwKCk7CisgICAgX194Ll9fYmVnaW5fID0gX194Ll9fZW5kXyA9IF9feC5fX2VuZF9jYXAoKSA9IG51bGxwdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OnZlY3Rvcih2ZWN0b3ImJiBfX3gsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX2Jhc2UoX19hKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW5zZXJ0X2ModGhpcyk7CisjZW5kaWYKKyAgICBpZiAoX19hID09IF9feC5fX2FsbG9jKCkpCisgICAgeworICAgICAgICB0aGlzLT5fX2JlZ2luXyA9IF9feC5fX2JlZ2luXzsKKyAgICAgICAgdGhpcy0+X19lbmRfID0gX194Ll9fZW5kXzsKKyAgICAgICAgdGhpcy0+X19lbmRfY2FwKCkgPSBfX3guX19lbmRfY2FwKCk7CisgICAgICAgIF9feC5fX2JlZ2luXyA9IF9feC5fX2VuZF8gPSBfX3guX19lbmRfY2FwKCkgPSBudWxscHRyOworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgICAgICBfX2dldF9kYigpLT5zd2FwKHRoaXMsICZfX3gpOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHR5cGVkZWYgbW92ZV9pdGVyYXRvcjxpdGVyYXRvcj4gX0lwOworICAgICAgICBhc3NpZ24oX0lwKF9feC5iZWdpbigpKSwgX0lwKF9feC5lbmQoKSkpOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6dmVjdG9yKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfX2dldF9kYigpLT5fX2luc2VydF9jKHRoaXMpOworI2VuZGlmCisgICAgaWYgKF9faWwuc2l6ZSgpID4gMCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRlKF9faWwuc2l6ZSgpKTsKKyAgICAgICAgX19jb25zdHJ1Y3RfYXRfZW5kKF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSwgX19pbC5zaXplKCkpOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6dmVjdG9yKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fYmFzZShfX2EpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX19nZXRfZGIoKS0+X19pbnNlcnRfYyh0aGlzKTsKKyNlbmRpZgorICAgIGlmIChfX2lsLnNpemUoKSA+IDApCisgICAgeworICAgICAgICBhbGxvY2F0ZShfX2lsLnNpemUoKSk7CisgICAgICAgIF9fY29uc3RydWN0X2F0X2VuZChfX2lsLmJlZ2luKCksIF9faWwuZW5kKCksIF9faWwuc2l6ZSgpKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj4mCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6b3BlcmF0b3I9KHZlY3RvciYmIF9feCkKKyAgICBfTk9FWENFUFRfKChfX25vZXhjZXB0X21vdmVfYXNzaWduX2NvbnRhaW5lcjxfQWxsb2NhdG9yLCBfX2FsbG9jX3RyYWl0cz46OnZhbHVlKSkKK3sKKyAgICBfX21vdmVfYXNzaWduKF9feCwgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICBfX2FsbG9jX3RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ6OnZhbHVlPigpKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6X19tb3ZlX2Fzc2lnbih2ZWN0b3ImIF9fYywgZmFsc2VfdHlwZSkKKyAgICBfTk9FWENFUFRfKF9fYWxsb2NfdHJhaXRzOjppc19hbHdheXNfZXF1YWw6OnZhbHVlKQoreworICAgIGlmIChfX2Jhc2U6Ol9fYWxsb2MoKSAhPSBfX2MuX19hbGxvYygpKQorICAgIHsKKyAgICAgICAgdHlwZWRlZiBtb3ZlX2l0ZXJhdG9yPGl0ZXJhdG9yPiBfSXA7CisgICAgICAgIGFzc2lnbihfSXAoX19jLmJlZ2luKCkpLCBfSXAoX19jLmVuZCgpKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgX19tb3ZlX2Fzc2lnbihfX2MsIHRydWVfdHlwZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjpfX21vdmVfYXNzaWduKHZlY3RvciYgX19jLCB0cnVlX3R5cGUpCisgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKQoreworICAgIGRlYWxsb2NhdGUoKTsKKyAgICBfX2Jhc2U6Ol9fbW92ZV9hc3NpZ25fYWxsb2MoX19jKTsgLy8gdGhpcyBjYW4gdGhyb3cKKyAgICB0aGlzLT5fX2JlZ2luXyA9IF9fYy5fX2JlZ2luXzsKKyAgICB0aGlzLT5fX2VuZF8gPSBfX2MuX19lbmRfOworICAgIHRoaXMtPl9fZW5kX2NhcCgpID0gX19jLl9fZW5kX2NhcCgpOworICAgIF9fYy5fX2JlZ2luXyA9IF9fYy5fX2VuZF8gPSBfX2MuX19lbmRfY2FwKCkgPSBudWxscHRyOworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPnN3YXAodGhpcywgJl9fYyk7CisjZW5kaWYKK30KKworI2VuZGlmICAvLyAhX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj4mCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6b3BlcmF0b3I9KGNvbnN0IHZlY3RvciYgX194KQoreworICAgIGlmICh0aGlzICE9ICZfX3gpCisgICAgeworICAgICAgICBfX2Jhc2U6Ol9fY29weV9hc3NpZ25fYWxsb2MoX194KTsKKyAgICAgICAgYXNzaWduKF9feC5fX2JlZ2luXywgX194Ll9fZW5kXyk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgICBfX2lzX2lucHV0X2l0ZXJhdG9yICA8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSAmJgorICAgICFfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSAmJgorICAgIGlzX2NvbnN0cnVjdGlibGU8CisgICAgICAgX1RwLAorICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnJlZmVyZW5jZT46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+Ojphc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQoreworICAgIGNsZWFyKCk7CisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgIF9fZW1wbGFjZV9iYWNrKCpfX2ZpcnN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZSAmJgorICAgIGlzX2NvbnN0cnVjdGlibGU8CisgICAgICAgX1RwLAorICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6cmVmZXJlbmNlPjo6dmFsdWUsCisgICAgdm9pZAorPjo6dHlwZQordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OmFzc2lnbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworICAgIHNpemVfdHlwZSBfX25ld19zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfVlNURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KSk7CisgICAgaWYgKF9fbmV3X3NpemUgPD0gY2FwYWNpdHkoKSkKKyAgICB7CisgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBfX2xhc3Q7CisgICAgICAgIGJvb2wgX19ncm93aW5nID0gZmFsc2U7CisgICAgICAgIGlmIChfX25ld19zaXplID4gc2l6ZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBfX2dyb3dpbmcgPSB0cnVlOworICAgICAgICAgICAgX19taWQgPSAgX19maXJzdDsKKyAgICAgICAgICAgIF9WU1REOjphZHZhbmNlKF9fbWlkLCBzaXplKCkpOworICAgICAgICB9CisgICAgICAgIHBvaW50ZXIgX19tID0gX1ZTVEQ6OmNvcHkoX19maXJzdCwgX19taWQsIHRoaXMtPl9fYmVnaW5fKTsKKyAgICAgICAgaWYgKF9fZ3Jvd2luZykKKyAgICAgICAgICAgIF9fY29uc3RydWN0X2F0X2VuZChfX21pZCwgX19sYXN0LCBfX25ld19zaXplIC0gc2l6ZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy0+X19kZXN0cnVjdF9hdF9lbmQoX19tKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZGVhbGxvY2F0ZSgpOworICAgICAgICBhbGxvY2F0ZShfX3JlY29tbWVuZChfX25ld19zaXplKSk7CisgICAgICAgIF9fY29uc3RydWN0X2F0X2VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fbmV3X3NpemUpOworICAgIH0KKyAgICBfX2ludmFsaWRhdGVfYWxsX2l0ZXJhdG9ycygpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OmFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdF9yZWZlcmVuY2UgX191KQoreworICAgIGlmIChfX24gPD0gY2FwYWNpdHkoKSkKKyAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX3MgPSBzaXplKCk7CisgICAgICAgIF9WU1REOjpmaWxsX24odGhpcy0+X19iZWdpbl8sIF9WU1REOjptaW4oX19uLCBfX3MpLCBfX3UpOworICAgICAgICBpZiAoX19uID4gX19zKQorICAgICAgICAgICAgX19jb25zdHJ1Y3RfYXRfZW5kKF9fbiAtIF9fcywgX191KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy0+X19kZXN0cnVjdF9hdF9lbmQodGhpcy0+X19iZWdpbl8gKyBfX24pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkZWFsbG9jYXRlKCk7CisgICAgICAgIGFsbG9jYXRlKF9fcmVjb21tZW5kKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19uKSkpOworICAgICAgICBfX2NvbnN0cnVjdF9hdF9lbmQoX19uLCBfX3UpOworICAgIH0KKyAgICBfX2ludmFsaWRhdGVfYWxsX2l0ZXJhdG9ycygpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46Ol9fbWFrZV9pdGVyKHBvaW50ZXIgX19wKSBfTk9FWENFUFQKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICByZXR1cm4gaXRlcmF0b3IodGhpcywgX19wKTsKKyNlbHNlCisgICAgcmV0dXJuIGl0ZXJhdG9yKF9fcCk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6Y29uc3RfaXRlcmF0b3IKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjpfX21ha2VfaXRlcihjb25zdF9wb2ludGVyIF9fcCkgY29uc3QgX05PRVhDRVBUCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMsIF9fcCk7CisjZWxzZQorICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihfX3ApOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgdmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6YmVnaW4oKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19tYWtlX2l0ZXIodGhpcy0+X19iZWdpbl8pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+Ojpjb25zdF9pdGVyYXRvcgordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OmJlZ2luKCkgY29uc3QgX05PRVhDRVBUCit7CisgICAgcmV0dXJuIF9fbWFrZV9pdGVyKHRoaXMtPl9fYmVnaW5fKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjplbmQoKSBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19tYWtlX2l0ZXIodGhpcy0+X19lbmRfKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6Y29uc3RfaXRlcmF0b3IKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjplbmQoKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICByZXR1cm4gX19tYWtlX2l0ZXIodGhpcy0+X19lbmRfKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6cmVmZXJlbmNlCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6b3BlcmF0b3JbXShzaXplX3R5cGUgX19uKQoreworICAgIF9MSUJDUFBfQVNTRVJUKF9fbiA8IHNpemUoKSwgInZlY3RvcltdIGluZGV4IG91dCBvZiBib3VuZHMiKTsKKyAgICByZXR1cm4gdGhpcy0+X19iZWdpbl9bX19uXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit0eXBlbmFtZSB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6Y29uc3RfcmVmZXJlbmNlCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6b3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdAoreworICAgIF9MSUJDUFBfQVNTRVJUKF9fbiA8IHNpemUoKSwgInZlY3RvcltdIGluZGV4IG91dCBvZiBib3VuZHMiKTsKKyAgICByZXR1cm4gdGhpcy0+X19iZWdpbl9bX19uXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIHZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjpyZWZlcmVuY2UKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjphdChzaXplX3R5cGUgX19uKQoreworICAgIGlmIChfX24gPj0gc2l6ZSgpKQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiB0aGlzLT5fX2JlZ2luX1tfX25dOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgdmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OmNvbnN0X3JlZmVyZW5jZQordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OmF0KHNpemVfdHlwZSBfX24pIGNvbnN0Cit7CisgICAgaWYgKF9fbiA+PSBzaXplKCkpCisgICAgICAgIHRoaXMtPl9fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgcmV0dXJuIHRoaXMtPl9fYmVnaW5fW19fbl07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6cmVzZXJ2ZShzaXplX3R5cGUgX19uKQoreworICAgIGlmIChfX24gPiBjYXBhY2l0eSgpKQorICAgIHsKKyAgICAgICAgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IHRoaXMtPl9fYWxsb2MoKTsKKyAgICAgICAgX19zcGxpdF9idWZmZXI8dmFsdWVfdHlwZSwgYWxsb2NhdG9yX3R5cGUmPiBfX3YoX19uLCBzaXplKCksIF9fYSk7CisgICAgICAgIF9fc3dhcF9vdXRfY2lyY3VsYXJfYnVmZmVyKF9fdik7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OnNocmlua190b19maXQoKSBfTk9FWENFUFQKK3sKKyAgICBpZiAoY2FwYWNpdHkoKSA+IHNpemUoKSkKKyAgICB7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0cnkKKyAgICAgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlJiBfX2EgPSB0aGlzLT5fX2FsbG9jKCk7CisgICAgICAgICAgICBfX3NwbGl0X2J1ZmZlcjx2YWx1ZV90eXBlLCBhbGxvY2F0b3JfdHlwZSY+IF9fdihzaXplKCksIHNpemUoKSwgX19hKTsKKyAgICAgICAgICAgIF9fc3dhcF9vdXRfY2lyY3VsYXJfYnVmZmVyKF9fdik7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB9CisgICAgICAgIGNhdGNoICguLi4pCisgICAgICAgIHsKKyAgICAgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX1VwPgordm9pZAorI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjpfX3B1c2hfYmFja19zbG93X3BhdGgoX1VwJiYgX194KQorI2Vsc2UKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjpfX3B1c2hfYmFja19zbG93X3BhdGgoX1VwJiBfX3gpCisjZW5kaWYKK3sKKyAgICBhbGxvY2F0b3JfdHlwZSYgX19hID0gdGhpcy0+X19hbGxvYygpOworICAgIF9fc3BsaXRfYnVmZmVyPHZhbHVlX3R5cGUsIGFsbG9jYXRvcl90eXBlJj4gX192KF9fcmVjb21tZW5kKHNpemUoKSArIDEpLCBzaXplKCksIF9fYSk7CisgICAgLy8gX192LnB1c2hfYmFjayhfVlNURDo6Zm9yd2FyZDxfVXA+KF9feCkpOworICAgIF9fYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19hLCBfVlNURDo6X190b19yYXdfcG9pbnRlcihfX3YuX19lbmRfKSwgX1ZTVEQ6OmZvcndhcmQ8X1VwPihfX3gpKTsKKyAgICBfX3YuX19lbmRfKys7CisgICAgX19zd2FwX291dF9jaXJjdWxhcl9idWZmZXIoX192KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6cHVzaF9iYWNrKGNvbnN0X3JlZmVyZW5jZSBfX3gpCit7CisgICAgaWYgKHRoaXMtPl9fZW5kXyAhPSB0aGlzLT5fX2VuZF9jYXAoKSkKKyAgICB7CisgICAgICAgIF9fUkFJSV9JbmNyZWFzZUFubm90YXRvciBfX2Fubm90YXRvcigqdGhpcyk7CisgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QodGhpcy0+X19hbGxvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKHRoaXMtPl9fZW5kXyksIF9feCk7CisgICAgICAgIF9fYW5ub3RhdG9yLl9fZG9uZSgpOworICAgICAgICArK3RoaXMtPl9fZW5kXzsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBfX3B1c2hfYmFja19zbG93X3BhdGgoX194KTsKK30KKworI2lmbmRlZiBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6cHVzaF9iYWNrKHZhbHVlX3R5cGUmJiBfX3gpCit7CisgICAgaWYgKHRoaXMtPl9fZW5kXyA8IHRoaXMtPl9fZW5kX2NhcCgpKQorICAgIHsKKyAgICAgICAgX19SQUlJX0luY3JlYXNlQW5ub3RhdG9yIF9fYW5ub3RhdG9yKCp0aGlzKTsKKyAgICAgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdCh0aGlzLT5fX2FsbG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6Ol9fdG9fcmF3X3BvaW50ZXIodGhpcy0+X19lbmRfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6bW92ZShfX3gpKTsKKyAgICAgICAgX19hbm5vdGF0b3IuX19kb25lKCk7CisgICAgICAgICsrdGhpcy0+X19lbmRfOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIF9fcHVzaF9iYWNrX3Nsb3dfcGF0aChfVlNURDo6bW92ZShfX3gpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcy4uLiBfQXJncz4KK3ZvaWQKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjpfX2VtcGxhY2VfYmFja19zbG93X3BhdGgoX0FyZ3MmJi4uLiBfX2FyZ3MpCit7CisgICAgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IHRoaXMtPl9fYWxsb2MoKTsKKyAgICBfX3NwbGl0X2J1ZmZlcjx2YWx1ZV90eXBlLCBhbGxvY2F0b3JfdHlwZSY+IF9fdihfX3JlY29tbWVuZChzaXplKCkgKyAxKSwgc2l6ZSgpLCBfX2EpOworLy8gICAgX192LmVtcGxhY2VfYmFjayhfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKF9fdi5fX2VuZF8pLCBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgX192Ll9fZW5kXysrOworICAgIF9fc3dhcF9vdXRfY2lyY3VsYXJfYnVmZmVyKF9fdik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CitpbmxpbmUKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAordHlwZW5hbWUgdmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OnJlZmVyZW5jZQorI2Vsc2UKK3ZvaWQKKyNlbmRpZgordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OmVtcGxhY2VfYmFjayhfQXJncyYmLi4uIF9fYXJncykKK3sKKyAgICBpZiAodGhpcy0+X19lbmRfIDwgdGhpcy0+X19lbmRfY2FwKCkpCisgICAgeworICAgICAgICBfX1JBSUlfSW5jcmVhc2VBbm5vdGF0b3IgX19hbm5vdGF0b3IoKnRoaXMpOworICAgICAgICBfX2FsbG9jX3RyYWl0czo6Y29uc3RydWN0KHRoaXMtPl9fYWxsb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6X190b19yYXdfcG9pbnRlcih0aGlzLT5fX2VuZF8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICAgICAgX19hbm5vdGF0b3IuX19kb25lKCk7CisgICAgICAgICsrdGhpcy0+X19lbmRfOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIF9fZW1wbGFjZV9iYWNrX3Nsb3dfcGF0aChfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKyAgICByZXR1cm4gdGhpcy0+YmFjaygpOworI2VuZGlmCit9CisKKyNlbmRpZiAgLy8gIV9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lCit2b2lkCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6cG9wX2JhY2soKQoreworICAgIF9MSUJDUFBfQVNTRVJUKCFlbXB0eSgpLCAidmVjdG9yOjpwb3BfYmFjayBjYWxsZWQgZm9yIGVtcHR5IHZlY3RvciIpOworICAgIHRoaXMtPl9fZGVzdHJ1Y3RfYXRfZW5kKHRoaXMtPl9fZW5kXyAtIDEpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OmVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19maW5kX2NfZnJvbV9pKCZfX3Bvc2l0aW9uKSA9PSB0aGlzLAorICAgICAgICAidmVjdG9yOjplcmFzZShpdGVyYXRvcikgY2FsbGVkIHdpdGggYW4gaXRlcmF0b3Igbm90IgorICAgICAgICAiIHJlZmVycmluZyB0byB0aGlzIHZlY3RvciIpOworI2VuZGlmCisgICAgX0xJQkNQUF9BU1NFUlQoX19wb3NpdGlvbiAhPSBlbmQoKSwKKyAgICAgICAgInZlY3Rvcjo6ZXJhc2UoaXRlcmF0b3IpIGNhbGxlZCB3aXRoIGEgbm9uLWRlcmVmZXJlbmNlYWJsZSBpdGVyYXRvciIpOworICAgIGRpZmZlcmVuY2VfdHlwZSBfX3BzID0gX19wb3NpdGlvbiAtIGNiZWdpbigpOworICAgIHBvaW50ZXIgX19wID0gdGhpcy0+X19iZWdpbl8gKyBfX3BzOworICAgIHRoaXMtPl9fZGVzdHJ1Y3RfYXRfZW5kKF9WU1REOjptb3ZlKF9fcCArIDEsIHRoaXMtPl9fZW5kXywgX19wKSk7CisgICAgdGhpcy0+X19pbnZhbGlkYXRlX2l0ZXJhdG9yc19wYXN0KF9fcC0xKTsKKyAgICBpdGVyYXRvciBfX3IgPSBfX21ha2VfaXRlcihfX3ApOworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjplcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19maW5kX2NfZnJvbV9pKCZfX2ZpcnN0KSA9PSB0aGlzLAorICAgICAgICAidmVjdG9yOjplcmFzZShpdGVyYXRvciwgIGl0ZXJhdG9yKSBjYWxsZWQgd2l0aCBhbiBpdGVyYXRvciBub3QiCisgICAgICAgICIgcmVmZXJyaW5nIHRvIHRoaXMgdmVjdG9yIik7CisgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19maW5kX2NfZnJvbV9pKCZfX2xhc3QpID09IHRoaXMsCisgICAgICAgICJ2ZWN0b3I6OmVyYXNlKGl0ZXJhdG9yLCAgaXRlcmF0b3IpIGNhbGxlZCB3aXRoIGFuIGl0ZXJhdG9yIG5vdCIKKyAgICAgICAgIiByZWZlcnJpbmcgdG8gdGhpcyB2ZWN0b3IiKTsKKyNlbmRpZgorICAgIF9MSUJDUFBfQVNTRVJUKF9fZmlyc3QgPD0gX19sYXN0LCAidmVjdG9yOjplcmFzZShmaXJzdCwgbGFzdCkgY2FsbGVkIHdpdGggaW52YWxpZCByYW5nZSIpOworICAgIHBvaW50ZXIgX19wID0gdGhpcy0+X19iZWdpbl8gKyAoX19maXJzdCAtIGJlZ2luKCkpOworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgeworICAgICAgICB0aGlzLT5fX2Rlc3RydWN0X2F0X2VuZChfVlNURDo6bW92ZShfX3AgKyAoX19sYXN0IC0gX19maXJzdCksIHRoaXMtPl9fZW5kXywgX19wKSk7CisgICAgICAgIHRoaXMtPl9faW52YWxpZGF0ZV9pdGVyYXRvcnNfcGFzdChfX3AgLSAxKTsKKyAgICB9CisgICAgaXRlcmF0b3IgX19yID0gX19tYWtlX2l0ZXIoX19wKTsKKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46Ol9fbW92ZV9yYW5nZShwb2ludGVyIF9fZnJvbV9zLCBwb2ludGVyIF9fZnJvbV9lLCBwb2ludGVyIF9fdG8pCit7CisgICAgcG9pbnRlciBfX29sZF9sYXN0ID0gdGhpcy0+X19lbmRfOworICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX29sZF9sYXN0IC0gX190bzsKKyAgICBmb3IgKHBvaW50ZXIgX19pID0gX19mcm9tX3MgKyBfX247IF9faSA8IF9fZnJvbV9lOyArK19faSwgKyt0aGlzLT5fX2VuZF8pCisgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QodGhpcy0+X19hbGxvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKHRoaXMtPl9fZW5kXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZTVEQ6Om1vdmUoKl9faSkpOworICAgIF9WU1REOjptb3ZlX2JhY2t3YXJkKF9fZnJvbV9zLCBfX2Zyb21fcyArIF9fbiwgX19vbGRfbGFzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjppbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3RfcmVmZXJlbmNlIF9feCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2ZpbmRfY19mcm9tX2koJl9fcG9zaXRpb24pID09IHRoaXMsCisgICAgICAgICJ2ZWN0b3I6Omluc2VydChpdGVyYXRvciwgeCkgY2FsbGVkIHdpdGggYW4gaXRlcmF0b3Igbm90IgorICAgICAgICAiIHJlZmVycmluZyB0byB0aGlzIHZlY3RvciIpOworI2VuZGlmCisgICAgcG9pbnRlciBfX3AgPSB0aGlzLT5fX2JlZ2luXyArIChfX3Bvc2l0aW9uIC0gYmVnaW4oKSk7CisgICAgaWYgKHRoaXMtPl9fZW5kXyA8IHRoaXMtPl9fZW5kX2NhcCgpKQorICAgIHsKKyAgICAgICAgX19SQUlJX0luY3JlYXNlQW5ub3RhdG9yIF9fYW5ub3RhdG9yKCp0aGlzKTsKKyAgICAgICAgaWYgKF9fcCA9PSB0aGlzLT5fX2VuZF8pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QodGhpcy0+X19hbGxvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6X190b19yYXdfcG9pbnRlcih0aGlzLT5fX2VuZF8pLCBfX3gpOworICAgICAgICAgICAgKyt0aGlzLT5fX2VuZF87CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfX21vdmVfcmFuZ2UoX19wLCB0aGlzLT5fX2VuZF8sIF9fcCArIDEpOworICAgICAgICAgICAgY29uc3RfcG9pbnRlciBfX3hyID0gcG9pbnRlcl90cmFpdHM8Y29uc3RfcG9pbnRlcj46OnBvaW50ZXJfdG8oX194KTsKKyAgICAgICAgICAgIGlmIChfX3AgPD0gX194ciAmJiBfX3hyIDwgdGhpcy0+X19lbmRfKQorICAgICAgICAgICAgICAgICsrX194cjsKKyAgICAgICAgICAgICpfX3AgPSAqX194cjsKKyAgICAgICAgfQorICAgICAgICBfX2Fubm90YXRvci5fX2RvbmUoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IHRoaXMtPl9fYWxsb2MoKTsKKyAgICAgICAgX19zcGxpdF9idWZmZXI8dmFsdWVfdHlwZSwgYWxsb2NhdG9yX3R5cGUmPiBfX3YoX19yZWNvbW1lbmQoc2l6ZSgpICsgMSksIF9fcCAtIHRoaXMtPl9fYmVnaW5fLCBfX2EpOworICAgICAgICBfX3YucHVzaF9iYWNrKF9feCk7CisgICAgICAgIF9fcCA9IF9fc3dhcF9vdXRfY2lyY3VsYXJfYnVmZmVyKF9fdiwgX19wKTsKKyAgICB9CisgICAgcmV0dXJuIF9fbWFrZV9pdGVyKF9fcCk7Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjppbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgdmFsdWVfdHlwZSYmIF9feCkKK3sKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgICBfTElCQ1BQX0FTU0VSVChfX2dldF9jb25zdF9kYigpLT5fX2ZpbmRfY19mcm9tX2koJl9fcG9zaXRpb24pID09IHRoaXMsCisgICAgICAgICJ2ZWN0b3I6Omluc2VydChpdGVyYXRvciwgeCkgY2FsbGVkIHdpdGggYW4gaXRlcmF0b3Igbm90IgorICAgICAgICAiIHJlZmVycmluZyB0byB0aGlzIHZlY3RvciIpOworI2VuZGlmCisgICAgcG9pbnRlciBfX3AgPSB0aGlzLT5fX2JlZ2luXyArIChfX3Bvc2l0aW9uIC0gYmVnaW4oKSk7CisgICAgaWYgKHRoaXMtPl9fZW5kXyA8IHRoaXMtPl9fZW5kX2NhcCgpKQorICAgIHsKKyAgICAgICAgX19SQUlJX0luY3JlYXNlQW5ub3RhdG9yIF9fYW5ub3RhdG9yKCp0aGlzKTsKKyAgICAgICAgaWYgKF9fcCA9PSB0aGlzLT5fX2VuZF8pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QodGhpcy0+X19hbGxvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6X190b19yYXdfcG9pbnRlcih0aGlzLT5fX2VuZF8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6bW92ZShfX3gpKTsKKyAgICAgICAgICAgICsrdGhpcy0+X19lbmRfOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX19tb3ZlX3JhbmdlKF9fcCwgdGhpcy0+X19lbmRfLCBfX3AgKyAxKTsKKyAgICAgICAgICAgICpfX3AgPSBfVlNURDo6bW92ZShfX3gpOworICAgICAgICB9CisgICAgICAgIF9fYW5ub3RhdG9yLl9fZG9uZSgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhbGxvY2F0b3JfdHlwZSYgX19hID0gdGhpcy0+X19hbGxvYygpOworICAgICAgICBfX3NwbGl0X2J1ZmZlcjx2YWx1ZV90eXBlLCBhbGxvY2F0b3JfdHlwZSY+IF9fdihfX3JlY29tbWVuZChzaXplKCkgKyAxKSwgX19wIC0gdGhpcy0+X19iZWdpbl8sIF9fYSk7CisgICAgICAgIF9fdi5wdXNoX2JhY2soX1ZTVEQ6Om1vdmUoX194KSk7CisgICAgICAgIF9fcCA9IF9fc3dhcF9vdXRfY2lyY3VsYXJfYnVmZmVyKF9fdiwgX19wKTsKKyAgICB9CisgICAgcmV0dXJuIF9fbWFrZV9pdGVyKF9fcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+Cit0eXBlbmFtZSB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjplbXBsYWNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIF9BcmdzJiYuLi4gX19hcmdzKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZmluZF9jX2Zyb21faSgmX19wb3NpdGlvbikgPT0gdGhpcywKKyAgICAgICAgInZlY3Rvcjo6ZW1wbGFjZShpdGVyYXRvciwgeCkgY2FsbGVkIHdpdGggYW4gaXRlcmF0b3Igbm90IgorICAgICAgICAiIHJlZmVycmluZyB0byB0aGlzIHZlY3RvciIpOworI2VuZGlmCisgICAgcG9pbnRlciBfX3AgPSB0aGlzLT5fX2JlZ2luXyArIChfX3Bvc2l0aW9uIC0gYmVnaW4oKSk7CisgICAgaWYgKHRoaXMtPl9fZW5kXyA8IHRoaXMtPl9fZW5kX2NhcCgpKQorICAgIHsKKyAgICAgICAgX19SQUlJX0luY3JlYXNlQW5ub3RhdG9yIF9fYW5ub3RhdG9yKCp0aGlzKTsKKyAgICAgICAgaWYgKF9fcCA9PSB0aGlzLT5fX2VuZF8pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QodGhpcy0+X19hbGxvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6X190b19yYXdfcG9pbnRlcih0aGlzLT5fX2VuZF8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVlNURDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICAgICAgICArK3RoaXMtPl9fZW5kXzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fdGVtcF92YWx1ZTx2YWx1ZV90eXBlLCBfQWxsb2NhdG9yPiBfX3RtcCh0aGlzLT5fX2FsbG9jKCksIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICAgICAgICAgIF9fbW92ZV9yYW5nZShfX3AsIHRoaXMtPl9fZW5kXywgX19wICsgMSk7CisgICAgICAgICAgICAqX19wID0gX1ZTVEQ6Om1vdmUoX190bXAuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIF9fYW5ub3RhdG9yLl9fZG9uZSgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhbGxvY2F0b3JfdHlwZSYgX19hID0gdGhpcy0+X19hbGxvYygpOworICAgICAgICBfX3NwbGl0X2J1ZmZlcjx2YWx1ZV90eXBlLCBhbGxvY2F0b3JfdHlwZSY+IF9fdihfX3JlY29tbWVuZChzaXplKCkgKyAxKSwgX19wIC0gdGhpcy0+X19iZWdpbl8sIF9fYSk7CisgICAgICAgIF9fdi5lbXBsYWNlX2JhY2soX1ZTVEQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICAgICBfX3AgPSBfX3N3YXBfb3V0X2NpcmN1bGFyX2J1ZmZlcihfX3YsIF9fcCk7CisgICAgfQorICAgIHJldHVybiBfX21ha2VfaXRlcihfX3ApOworfQorCisjZW5kaWYgIC8vICFfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIHZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46Omluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdF9yZWZlcmVuY2UgX194KQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZmluZF9jX2Zyb21faSgmX19wb3NpdGlvbikgPT0gdGhpcywKKyAgICAgICAgInZlY3Rvcjo6aW5zZXJ0KGl0ZXJhdG9yLCBuLCB4KSBjYWxsZWQgd2l0aCBhbiBpdGVyYXRvciBub3QiCisgICAgICAgICIgcmVmZXJyaW5nIHRvIHRoaXMgdmVjdG9yIik7CisjZW5kaWYKKyAgICBwb2ludGVyIF9fcCA9IHRoaXMtPl9fYmVnaW5fICsgKF9fcG9zaXRpb24gLSBiZWdpbigpKTsKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIGlmIChfX24gPD0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPih0aGlzLT5fX2VuZF9jYXAoKSAtIHRoaXMtPl9fZW5kXykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdHlwZSBfX29sZF9uID0gX19uOworICAgICAgICAgICAgcG9pbnRlciBfX29sZF9sYXN0ID0gdGhpcy0+X19lbmRfOworICAgICAgICAgICAgaWYgKF9fbiA+IHN0YXRpY19jYXN0PHNpemVfdHlwZT4odGhpcy0+X19lbmRfIC0gX19wKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19jeCA9IF9fbiAtICh0aGlzLT5fX2VuZF8gLSBfX3ApOworICAgICAgICAgICAgICAgIF9fY29uc3RydWN0X2F0X2VuZChfX2N4LCBfX3gpOworICAgICAgICAgICAgICAgIF9fbiAtPSBfX2N4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9fbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19SQUlJX0luY3JlYXNlQW5ub3RhdG9yIF9fYW5ub3RhdG9yKCp0aGlzLCBfX24pOworICAgICAgICAgICAgICAgIF9fbW92ZV9yYW5nZShfX3AsIF9fb2xkX2xhc3QsIF9fcCArIF9fb2xkX24pOworICAgICAgICAgICAgICAgIF9fYW5ub3RhdG9yLl9fZG9uZSgpOworICAgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXIgX194ciA9IHBvaW50ZXJfdHJhaXRzPGNvbnN0X3BvaW50ZXI+Ojpwb2ludGVyX3RvKF9feCk7CisgICAgICAgICAgICAgICAgaWYgKF9fcCA8PSBfX3hyICYmIF9feHIgPCB0aGlzLT5fX2VuZF8pCisgICAgICAgICAgICAgICAgICAgIF9feHIgKz0gX19vbGRfbjsKKyAgICAgICAgICAgICAgICBfVlNURDo6ZmlsbF9uKF9fcCwgX19uLCAqX194cik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZSYgX19hID0gdGhpcy0+X19hbGxvYygpOworICAgICAgICAgICAgX19zcGxpdF9idWZmZXI8dmFsdWVfdHlwZSwgYWxsb2NhdG9yX3R5cGUmPiBfX3YoX19yZWNvbW1lbmQoc2l6ZSgpICsgX19uKSwgX19wIC0gdGhpcy0+X19iZWdpbl8sIF9fYSk7CisgICAgICAgICAgICBfX3YuX19jb25zdHJ1Y3RfYXRfZW5kKF9fbiwgX194KTsKKyAgICAgICAgICAgIF9fcCA9IF9fc3dhcF9vdXRfY2lyY3VsYXJfYnVmZmVyKF9fdiwgX19wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX19tYWtlX2l0ZXIoX19wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgICBfX2lzX2lucHV0X2l0ZXJhdG9yICA8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSAmJgorICAgICFfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSAmJgorICAgIGlzX2NvbnN0cnVjdGlibGU8CisgICAgICAgX1RwLAorICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnJlZmVyZW5jZT46OnZhbHVlLAorICAgIHR5cGVuYW1lIHZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorPjo6dHlwZQordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46Omluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCit7CisjaWYgX0xJQkNQUF9ERUJVR19MRVZFTCA+PSAyCisgICAgX0xJQkNQUF9BU1NFUlQoX19nZXRfY29uc3RfZGIoKS0+X19maW5kX2NfZnJvbV9pKCZfX3Bvc2l0aW9uKSA9PSB0aGlzLAorICAgICAgICAidmVjdG9yOjppbnNlcnQoaXRlcmF0b3IsIHJhbmdlKSBjYWxsZWQgd2l0aCBhbiBpdGVyYXRvciBub3QiCisgICAgICAgICIgcmVmZXJyaW5nIHRvIHRoaXMgdmVjdG9yIik7CisjZW5kaWYKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19vZmYgPSBfX3Bvc2l0aW9uIC0gYmVnaW4oKTsKKyAgICBwb2ludGVyIF9fcCA9IHRoaXMtPl9fYmVnaW5fICsgX19vZmY7CisgICAgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IHRoaXMtPl9fYWxsb2MoKTsKKyAgICBwb2ludGVyIF9fb2xkX2xhc3QgPSB0aGlzLT5fX2VuZF87CisgICAgZm9yICg7IHRoaXMtPl9fZW5kXyAhPSB0aGlzLT5fX2VuZF9jYXAoKSAmJiBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgIHsKKyAgICAgICAgX19SQUlJX0luY3JlYXNlQW5ub3RhdG9yIF9fYW5ub3RhdG9yKCp0aGlzKTsKKyAgICAgICAgX19hbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2EsIF9WU1REOjpfX3RvX3Jhd19wb2ludGVyKHRoaXMtPl9fZW5kXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKl9fZmlyc3QpOworICAgICAgICArK3RoaXMtPl9fZW5kXzsKKyAgICAgICAgX19hbm5vdGF0b3IuX19kb25lKCk7CisgICAgfQorICAgIF9fc3BsaXRfYnVmZmVyPHZhbHVlX3R5cGUsIGFsbG9jYXRvcl90eXBlJj4gX192KF9fYSk7CisgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorICAgIHsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHRyeQorICAgICAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICAgICAgX192Ll9fY29uc3RydWN0X2F0X2VuZChfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fb2xkX3NpemUgPSBfX29sZF9sYXN0IC0gdGhpcy0+X19iZWdpbl87CisgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19vbGRfcCA9IF9fcCAtIHRoaXMtPl9fYmVnaW5fOworICAgICAgICAgICAgcmVzZXJ2ZShfX3JlY29tbWVuZChzaXplKCkgKyBfX3Yuc2l6ZSgpKSk7CisgICAgICAgICAgICBfX3AgPSB0aGlzLT5fX2JlZ2luXyArIF9fb2xkX3A7CisgICAgICAgICAgICBfX29sZF9sYXN0ID0gdGhpcy0+X19iZWdpbl8gKyBfX29sZF9zaXplOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoLi4uKQorICAgICAgICB7CisgICAgICAgICAgICBlcmFzZShfX21ha2VfaXRlcihfX29sZF9sYXN0KSwgZW5kKCkpOworICAgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIF9fcCA9IF9WU1REOjpyb3RhdGUoX19wLCBfX29sZF9sYXN0LCB0aGlzLT5fX2VuZF8pOworICAgIGluc2VydChfX21ha2VfaXRlcihfX3ApLCBtYWtlX21vdmVfaXRlcmF0b3IoX192LmJlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9tb3ZlX2l0ZXJhdG9yKF9fdi5lbmQoKSkpOworICAgIHJldHVybiBiZWdpbigpICsgX19vZmY7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICBpc19jb25zdHJ1Y3RpYmxlPAorICAgICAgIF9UcCwKKyAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnJlZmVyZW5jZT46OnZhbHVlLAorICAgIHR5cGVuYW1lIHZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorPjo6dHlwZQordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46Omluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9MSUJDUFBfQVNTRVJUKF9fZ2V0X2NvbnN0X2RiKCktPl9fZmluZF9jX2Zyb21faSgmX19wb3NpdGlvbikgPT0gdGhpcywKKyAgICAgICAgInZlY3Rvcjo6aW5zZXJ0KGl0ZXJhdG9yLCByYW5nZSkgY2FsbGVkIHdpdGggYW4gaXRlcmF0b3Igbm90IgorICAgICAgICAiIHJlZmVycmluZyB0byB0aGlzIHZlY3RvciIpOworI2VuZGlmCisgICAgcG9pbnRlciBfX3AgPSB0aGlzLT5fX2JlZ2luXyArIChfX3Bvc2l0aW9uIC0gYmVnaW4oKSk7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9WU1REOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgIGlmIChfX24gPiAwKQorICAgIHsKKyAgICAgICAgaWYgKF9fbiA8PSB0aGlzLT5fX2VuZF9jYXAoKSAtIHRoaXMtPl9fZW5kXykKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90eXBlIF9fb2xkX24gPSBfX247CisgICAgICAgICAgICBwb2ludGVyIF9fb2xkX2xhc3QgPSB0aGlzLT5fX2VuZF87CisgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbSA9IF9fbGFzdDsKKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2R4ID0gdGhpcy0+X19lbmRfIC0gX19wOworICAgICAgICAgICAgaWYgKF9fbiA+IF9fZHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19tID0gX19maXJzdDsKKyAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19kaWZmID0gdGhpcy0+X19lbmRfIC0gX19wOworICAgICAgICAgICAgICAgIF9WU1REOjphZHZhbmNlKF9fbSwgX19kaWZmKTsKKyAgICAgICAgICAgICAgICBfX2NvbnN0cnVjdF9hdF9lbmQoX19tLCBfX2xhc3QsIF9fbiAtIF9fZGlmZik7CisgICAgICAgICAgICAgICAgX19uID0gX19keDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfX24gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fUkFJSV9JbmNyZWFzZUFubm90YXRvciBfX2Fubm90YXRvcigqdGhpcywgX19uKTsKKyAgICAgICAgICAgICAgICBfX21vdmVfcmFuZ2UoX19wLCBfX29sZF9sYXN0LCBfX3AgKyBfX29sZF9uKTsKKyAgICAgICAgICAgICAgICBfX2Fubm90YXRvci5fX2RvbmUoKTsKKyAgICAgICAgICAgICAgICBfVlNURDo6Y29weShfX2ZpcnN0LCBfX20sIF9fcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZSYgX19hID0gdGhpcy0+X19hbGxvYygpOworICAgICAgICAgICAgX19zcGxpdF9idWZmZXI8dmFsdWVfdHlwZSwgYWxsb2NhdG9yX3R5cGUmPiBfX3YoX19yZWNvbW1lbmQoc2l6ZSgpICsgX19uKSwgX19wIC0gdGhpcy0+X19iZWdpbl8sIF9fYSk7CisgICAgICAgICAgICBfX3YuX19jb25zdHJ1Y3RfYXRfZW5kKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgICAgICBfX3AgPSBfX3N3YXBfb3V0X2NpcmN1bGFyX2J1ZmZlcihfX3YsIF9fcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9fbWFrZV9pdGVyKF9fcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6cmVzaXplKHNpemVfdHlwZSBfX3N6KQoreworICAgIHNpemVfdHlwZSBfX2NzID0gc2l6ZSgpOworICAgIGlmIChfX2NzIDwgX19zeikKKyAgICAgICAgdGhpcy0+X19hcHBlbmQoX19zeiAtIF9fY3MpOworICAgIGVsc2UgaWYgKF9fY3MgPiBfX3N6KQorICAgICAgICB0aGlzLT5fX2Rlc3RydWN0X2F0X2VuZCh0aGlzLT5fX2JlZ2luXyArIF9fc3opOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OnJlc2l6ZShzaXplX3R5cGUgX19zeiwgY29uc3RfcmVmZXJlbmNlIF9feCkKK3sKKyAgICBzaXplX3R5cGUgX19jcyA9IHNpemUoKTsKKyAgICBpZiAoX19jcyA8IF9fc3opCisgICAgICAgIHRoaXMtPl9fYXBwZW5kKF9fc3ogLSBfX2NzLCBfX3gpOworICAgIGVsc2UgaWYgKF9fY3MgPiBfX3N6KQorICAgICAgICB0aGlzLT5fX2Rlc3RydWN0X2F0X2VuZCh0aGlzLT5fX2JlZ2luXyArIF9fc3opOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46OnN3YXAodmVjdG9yJiBfX3gpCisjaWYgX0xJQkNQUF9TVERfVkVSID49IDE0CisgICAgX05PRVhDRVBUX0RFQlVHCisjZWxzZQorICAgIF9OT0VYQ0VQVF9ERUJVR18oIV9fYWxsb2NfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXA6OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgX19pc19ub3Rocm93X3N3YXBwYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKQorI2VuZGlmCit7CisgICAgX0xJQkNQUF9BU1NFUlQoX19hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICB0aGlzLT5fX2FsbG9jKCkgPT0gX194Ll9fYWxsb2MoKSwKKyAgICAgICAgICAgICAgICAgICAidmVjdG9yOjpzd2FwOiBFaXRoZXIgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwIG11c3QgYmUgdHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAiIG9yIHRoZSBhbGxvY2F0b3JzIG11c3QgY29tcGFyZSBlcXVhbCIpOworICAgIF9WU1REOjpzd2FwKHRoaXMtPl9fYmVnaW5fLCBfX3guX19iZWdpbl8pOworICAgIF9WU1REOjpzd2FwKHRoaXMtPl9fZW5kXywgX194Ll9fZW5kXyk7CisgICAgX1ZTVEQ6OnN3YXAodGhpcy0+X19lbmRfY2FwKCksIF9feC5fX2VuZF9jYXAoKSk7CisgICAgX19zd2FwX2FsbG9jYXRvcih0aGlzLT5fX2FsbG9jKCksIF9feC5fX2FsbG9jKCksCisgICAgICAgIGludGVncmFsX2NvbnN0YW50PGJvb2wsX19hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDo6dmFsdWU+KCkpOworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPnN3YXAodGhpcywgJl9feCk7CisjZW5kaWYgIC8vIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgorYm9vbAordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46Ol9faW52YXJpYW50cygpIGNvbnN0Cit7CisgICAgaWYgKHRoaXMtPl9fYmVnaW5fID09IG51bGxwdHIpCisgICAgeworICAgICAgICBpZiAodGhpcy0+X19lbmRfICE9IG51bGxwdHIgfHwgdGhpcy0+X19lbmRfY2FwKCkgIT0gbnVsbHB0cikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPl9fYmVnaW5fID4gdGhpcy0+X19lbmRfKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAodGhpcy0+X19iZWdpbl8gPT0gdGhpcy0+X19lbmRfY2FwKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICh0aGlzLT5fX2VuZF8gPiB0aGlzLT5fX2VuZF9jYXAoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2Jvb2wKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjpfX2RlcmVmZXJlbmNlYWJsZShjb25zdCBjb25zdF9pdGVyYXRvciogX19pKSBjb25zdAoreworICAgIHJldHVybiB0aGlzLT5fX2JlZ2luXyA8PSBfX2ktPmJhc2UoKSAmJiBfX2ktPmJhc2UoKSA8IHRoaXMtPl9fZW5kXzsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2Jvb2wKK3ZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+OjpfX2RlY3JlbWVudGFibGUoY29uc3QgY29uc3RfaXRlcmF0b3IqIF9faSkgY29uc3QKK3sKKyAgICByZXR1cm4gdGhpcy0+X19iZWdpbl8gPCBfX2ktPmJhc2UoKSAmJiBfX2ktPmJhc2UoKSA8PSB0aGlzLT5fX2VuZF87Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Citib29sCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6X19hZGRhYmxlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yKiBfX2ksIHB0cmRpZmZfdCBfX24pIGNvbnN0Cit7CisgICAgY29uc3RfcG9pbnRlciBfX3AgPSBfX2ktPmJhc2UoKSArIF9fbjsKKyAgICByZXR1cm4gdGhpcy0+X19iZWdpbl8gPD0gX19wICYmIF9fcCA8PSB0aGlzLT5fX2VuZF87Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+Citib29sCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6X19zdWJzY3JpcHRhYmxlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yKiBfX2ksIHB0cmRpZmZfdCBfX24pIGNvbnN0Cit7CisgICAgY29uc3RfcG9pbnRlciBfX3AgPSBfX2ktPmJhc2UoKSArIF9fbjsKKyAgICByZXR1cm4gdGhpcy0+X19iZWdpbl8gPD0gX19wICYmIF9fcCA8IHRoaXMtPl9fZW5kXzsKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCit2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6X19pbnZhbGlkYXRlX2FsbF9pdGVyYXRvcnMoKQoreworI2lmIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorICAgIF9fZ2V0X2RiKCktPl9faW52YWxpZGF0ZV9hbGwodGhpcyk7CisjZW5kaWYgIC8vIF9MSUJDUFBfREVCVUdfTEVWRUwgPj0gMgorfQorCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAordmVjdG9yPF9UcCwgX0FsbG9jYXRvcj46Ol9faW52YWxpZGF0ZV9pdGVyYXRvcnNfcGFzdChwb2ludGVyIF9fbmV3X2xhc3QpIHsKKyNpZiBfTElCQ1BQX0RFQlVHX0xFVkVMID49IDIKKyAgX19jX25vZGUqIF9fYyA9IF9fZ2V0X2RiKCktPl9fZmluZF9jX2FuZF9sb2NrKHRoaXMpOworICBmb3IgKF9faV9ub2RlKiogX19wID0gX19jLT5lbmRfOyBfX3AgIT0gX19jLT5iZWdfOyApIHsKKyAgICAtLV9fcDsKKyAgICBjb25zdF9pdGVyYXRvciogX19pID0gc3RhdGljX2Nhc3Q8Y29uc3RfaXRlcmF0b3IqPigoKl9fcCktPl9faV8pOworICAgIGlmIChfX2ktPmJhc2UoKSA+IF9fbmV3X2xhc3QpIHsKKyAgICAgICgqX19wKS0+X19jXyA9IG51bGxwdHI7CisgICAgICBpZiAoLS1fX2MtPmVuZF8gIT0gX19wKQorICAgICAgICBtZW1tb3ZlKF9fcCwgX19wKzEsIChfX2MtPmVuZF8gLSBfX3ApKnNpemVvZihfX2lfbm9kZSopKTsKKyAgICB9CisgIH0KKyAgX19nZXRfZGIoKS0+dW5sb2NrKCk7CisjZWxzZQorICAoKHZvaWQpX19uZXdfbGFzdCk7CisjZW5kaWYKK30KKworLy8gdmVjdG9yPGJvb2w+CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPiBjbGFzcyB2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj47CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPiBzdHJ1Y3QgaGFzaDx2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj4gPjsKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+CitzdHJ1Y3QgX19oYXNfc3RvcmFnZV90eXBlPHZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPiA+Cit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+CitjbGFzcyBfTElCQ1BQX1RFTVBMQVRFX1ZJUyB2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj4KKyAgICA6IHByaXZhdGUgX192ZWN0b3JfYmFzZV9jb21tb248dHJ1ZT4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zZWxmOworICAgIHR5cGVkZWYgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0FsbG9jYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+ICAgICAgICAgX19hbGxvY190cmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2FsbG9jX3RyYWl0czo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fYWxsb2NfdHJhaXRzOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgc2l6ZV90eXBlIF9fc3RvcmFnZV90eXBlOworICAgIHR5cGVkZWYgX19iaXRfaXRlcmF0b3I8dmVjdG9yLCBmYWxzZT4gICAgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgX19iaXRfaXRlcmF0b3I8dmVjdG9yLCB0cnVlPiAgICAgICAgICAgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIGNvbnN0X3BvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfVlNURDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgIHR5cGVkZWYgX1ZTVEQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2FsbG9jX2hlbHBlcjxfX2FsbG9jX3RyYWl0cywgX19zdG9yYWdlX3R5cGU+Ojp0eXBlIF9fc3RvcmFnZV9hbGxvY2F0b3I7CisgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPF9fc3RvcmFnZV9hbGxvY2F0b3I+ICAgIF9fc3RvcmFnZV90cmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3N0b3JhZ2VfdHJhaXRzOjpwb2ludGVyICAgICAgIF9fc3RvcmFnZV9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19zdG9yYWdlX3RyYWl0czo6Y29uc3RfcG9pbnRlciBfX2NvbnN0X3N0b3JhZ2VfcG9pbnRlcjsKKworICAgIF9fc3RvcmFnZV9wb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luXzsKKyAgICBzaXplX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zaXplXzsKKyAgICBfX2NvbXByZXNzZWRfcGFpcjxzaXplX3R5cGUsIF9fc3RvcmFnZV9hbGxvY2F0b3I+IF9fY2FwX2FsbG9jXzsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9fYml0X3JlZmVyZW5jZTx2ZWN0b3I+ICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgX19iaXRfY29uc3RfcmVmZXJlbmNlPHZlY3Rvcj4gICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7Citwcml2YXRlOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUmIF9fY2FwKCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19jYXBfYWxsb2NfLmZpcnN0KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdCBzaXplX3R5cGUmIF9fY2FwKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19jYXBfYWxsb2NfLmZpcnN0KCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBfX3N0b3JhZ2VfYWxsb2NhdG9yJiBfX2FsbG9jKCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19jYXBfYWxsb2NfLnNlY29uZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3QgX19zdG9yYWdlX2FsbG9jYXRvciYgX19hbGxvYygpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIF9fY2FwX2FsbG9jXy5zZWNvbmQoKTt9CisKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgX19iaXRzX3Blcl93b3JkID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHNpemVvZihfX3N0b3JhZ2VfdHlwZSkgKiBDSEFSX0JJVCk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc3RhdGljIHNpemVfdHlwZSBfX2ludGVybmFsX2NhcF90b19leHRlcm5hbChzaXplX3R5cGUgX19uKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX24gKiBfX2JpdHNfcGVyX3dvcmQ7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzdGF0aWMgc2l6ZV90eXBlIF9fZXh0ZXJuYWxfY2FwX3RvX2ludGVybmFsKHNpemVfdHlwZSBfX24pIF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIChfX24gLSAxKSAvIF9fYml0c19wZXJfd29yZCArIDE7fQorCitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZlY3RvcigpIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGV4cGxpY2l0IHZlY3Rvcihjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2lmIF9MSUJDUFBfU1REX1ZFUiA8PSAxNAorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpOworI2Vsc2UKKyAgICAgICAgX05PRVhDRVBUOworI2VuZGlmCisgICAgfnZlY3RvcigpOworICAgIGV4cGxpY2l0IHZlY3RvcihzaXplX3R5cGUgX19uKTsKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQorICAgIGV4cGxpY2l0IHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyNlbmRpZgorICAgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpOworICAgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdmVjdG9yKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX2lucHV0X2l0ZXJhdG9yICA8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIV9faXNfZm9yd2FyZF9pdGVyYXRvcjxfSW5wdXRJdGVyYXRvcj46OnZhbHVlPjo6dHlwZSogPSAwKTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZlY3RvcihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EsCisgICAgICAgICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19pbnB1dF9pdGVyYXRvciAgPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZT46OnR5cGUqID0gMCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHZlY3RvcihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWU+Ojp0eXBlKiA9IDApOworICAgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICB2ZWN0b3IoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSwKKyAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlPjo6dHlwZSogPSAwKTsKKworICAgIHZlY3Rvcihjb25zdCB2ZWN0b3ImIF9fdik7CisgICAgdmVjdG9yKGNvbnN0IHZlY3RvciYgX192LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyAgICB2ZWN0b3ImIG9wZXJhdG9yPShjb25zdCB2ZWN0b3ImIF9fdik7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgdmVjdG9yKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCk7CisgICAgdmVjdG9yKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdmVjdG9yKHZlY3RvciYmIF9fdikKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNAorICAgICAgICBfTk9FWENFUFQ7CisjZWxzZQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpOworI2VuZGlmCisgICAgdmVjdG9yKHZlY3RvciYmIF9fdiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZlY3RvciYgb3BlcmF0b3I9KHZlY3RvciYmIF9fdikKKyAgICAgICAgX05PRVhDRVBUXygoX19ub2V4Y2VwdF9tb3ZlX2Fzc2lnbl9jb250YWluZXI8X0FsbG9jYXRvciwgX19hbGxvY190cmFpdHM+Ojp2YWx1ZSkpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZlY3RvciYgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkKKyAgICAgICAge2Fzc2lnbihfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpOyByZXR1cm4gKnRoaXM7fQorCisjZW5kaWYgIC8vICFfTElCQ1BQX0NYWDAzX0xBTkcKKworICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIF9faXNfaW5wdXRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSAmJgorICAgICAgICAgICAhX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgICAgICAgIHZvaWQKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgICAgICAgIHZvaWQKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBhc3NpZ24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICB2b2lkIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIGFzc2lnbihpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpCisgICAgICAgIHthc3NpZ24oX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTt9CisjZW5kaWYKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGFsbG9jYXRvcl90eXBlKHRoaXMtPl9fYWxsb2MoKSk7fQorCisgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgX05PRVhDRVBUOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBzaXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX2ludGVybmFsX2NhcF90b19leHRlcm5hbChfX2NhcCgpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19zaXplXzt9CisgICAgX0xJQkNQUF9OT0RJU0NBUkRfQUZURVJfQ1hYMTcgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGJvb2wgZW1wdHkoKSBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX3NpemVfID09IDA7fQorICAgIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgX19uKTsKKyAgICB2b2lkIHNocmlua190b19maXQoKSBfTk9FWENFUFQ7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgYmVnaW4oKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX21ha2VfaXRlcigwKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19tYWtlX2l0ZXIoMCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBpdGVyYXRvciBlbmQoKSBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX21ha2VfaXRlcihfX3NpemVfKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpICAgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19tYWtlX2l0ZXIoX19zaXplXyk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfaXRlcmF0b3IgICAgICAgICBjYmVnaW4oKSAgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19tYWtlX2l0ZXIoMCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciAgICAgICAgIGNlbmQoKSAgICBjb25zdCBfTk9FWENFUFQKKyAgICAgICAge3JldHVybiBfX21ha2VfaXRlcihfX3NpemVfKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY3JiZWdpbigpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIHJiZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmVuZCgpICAgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gcmVuZCgpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmVmZXJlbmNlICAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgICAgICAge3JldHVybiBfX21ha2VfcmVmKF9fbik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3Qge3JldHVybiBfX21ha2VfcmVmKF9fbik7fQorICAgIHJlZmVyZW5jZSAgICAgICBhdChzaXplX3R5cGUgX19uKTsKKyAgICBjb25zdF9yZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikgY29uc3Q7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHJlZmVyZW5jZSAgICAgICBmcm9udCgpICAgICAgIHtyZXR1cm4gX19tYWtlX3JlZigwKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7cmV0dXJuIF9fbWFrZV9yZWYoMCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmVmZXJlbmNlICAgICAgIGJhY2soKSAgICAgICAge3JldHVybiBfX21ha2VfcmVmKF9fc2l6ZV8gLSAxKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9yZWZlcmVuY2UgYmFjaygpICBjb25zdCB7cmV0dXJuIF9fbWFrZV9yZWYoX19zaXplXyAtIDEpO30KKworICAgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHJlZmVyZW5jZSBlbXBsYWNlX2JhY2soX0FyZ3MmJi4uLiBfX2FyZ3MpCisjZWxzZQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCAgICAgIGVtcGxhY2VfYmFjayhfQXJncyYmLi4uIF9fYXJncykKKyNlbmRpZgorICAgIHsKKyAgICAgICAgcHVzaF9iYWNrICggdmFsdWVfdHlwZSAoIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uICkpOworI2lmIF9MSUJDUFBfU1REX1ZFUiA+IDE0CisgICAgICAgIHJldHVybiB0aGlzLT5iYWNrKCk7CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCBwb3BfYmFjaygpIHstLV9fc2l6ZV87fQorCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTEKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gX0FyZ3M+CisgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGl0ZXJhdG9yIGVtcGxhY2UoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24sIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICB7IHJldHVybiBpbnNlcnQgKCBwb3NpdGlvbiwgdmFsdWVfdHlwZSAoIF9WU1REOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uICkpOyB9CisjZW5kaWYKKworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdF9yZWZlcmVuY2UgX194KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICAgX19pc19pbnB1dF9pdGVyYXRvciAgPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICFfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICAgICAgICAgIGl0ZXJhdG9yCisgICAgICAgID46OnR5cGUKKyAgICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICBfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlLAorICAgICAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCk7CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpCisgICAgICAgIHtyZXR1cm4gaW5zZXJ0KF9fcG9zaXRpb24sIF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7fQorI2VuZGlmCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGl0ZXJhdG9yIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pOworICAgIGl0ZXJhdG9yIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBjbGVhcigpIF9OT0VYQ0VQVCB7X19zaXplXyA9IDA7fQorCisgICAgdm9pZCBzd2FwKHZlY3RvciYpCisjaWYgX0xJQkNQUF9TVERfVkVSID49IDE0CisgICAgICAgIF9OT0VYQ0VQVDsKKyNlbHNlCisgICAgICAgIF9OT0VYQ0VQVF8oIV9fYWxsb2NfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXA6OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgIF9faXNfbm90aHJvd19zd2FwcGFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisjZW5kaWYKKyAgICBzdGF0aWMgdm9pZCBzd2FwKHJlZmVyZW5jZSBfX3gsIHJlZmVyZW5jZSBfX3kpIF9OT0VYQ0VQVCB7IF9WU1REOjpzd2FwKF9feCwgX195KTsgfQorCisgICAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fc3osIHZhbHVlX3R5cGUgX194ID0gZmFsc2UpOworICAgIHZvaWQgZmxpcCgpIF9OT0VYQ0VQVDsKKworICAgIGJvb2wgX19pbnZhcmlhbnRzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIF9faW52YWxpZGF0ZV9hbGxfaXRlcmF0b3JzKCk7CisgICAgdm9pZCBhbGxvY2F0ZShzaXplX3R5cGUgX19uKTsKKyAgICB2b2lkIGRlYWxsb2NhdGUoKSBfTk9FWENFUFQ7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHN0YXRpYyBzaXplX3R5cGUgX19hbGlnbl9pdChzaXplX3R5cGUgX19uZXdfc2l6ZSkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX19uZXdfc2l6ZSArIChfX2JpdHNfcGVyX3dvcmQtMSkgJiB+KChzaXplX3R5cGUpX19iaXRzX3Blcl93b3JkLTEpO307CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSAgc2l6ZV90eXBlIF9fcmVjb21tZW5kKHNpemVfdHlwZSBfX25ld19zaXplKSBjb25zdDsKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgX19jb25zdHJ1Y3RfYXRfZW5kKHNpemVfdHlwZSBfX24sIGJvb2wgX194KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCisgICAgICAgIDwKKyAgICAgICAgICAgIF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgICAgICAgICB2b2lkCisgICAgICAgID46OnR5cGUKKyAgICAgICAgX19jb25zdHJ1Y3RfYXRfZW5kKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworICAgIHZvaWQgX19hcHBlbmQoc2l6ZV90eXBlIF9fbiwgY29uc3RfcmVmZXJlbmNlIF9feCk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHJlZmVyZW5jZSBfX21ha2VfcmVmKHNpemVfdHlwZSBfX3BvcykgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gcmVmZXJlbmNlKF9fYmVnaW5fICsgX19wb3MgLyBfX2JpdHNfcGVyX3dvcmQsIF9fc3RvcmFnZV90eXBlKDEpIDw8IF9fcG9zICUgX19iaXRzX3Blcl93b3JkKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGNvbnN0X3JlZmVyZW5jZSBfX21ha2VfcmVmKHNpemVfdHlwZSBfX3BvcykgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gY29uc3RfcmVmZXJlbmNlKF9fYmVnaW5fICsgX19wb3MgLyBfX2JpdHNfcGVyX3dvcmQsIF9fc3RvcmFnZV90eXBlKDEpIDw8IF9fcG9zICUgX19iaXRzX3Blcl93b3JkKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIGl0ZXJhdG9yIF9fbWFrZV9pdGVyKHNpemVfdHlwZSBfX3BvcykgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gaXRlcmF0b3IoX19iZWdpbl8gKyBfX3BvcyAvIF9fYml0c19wZXJfd29yZCwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KF9fcG9zICUgX19iaXRzX3Blcl93b3JkKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICBjb25zdF9pdGVyYXRvciBfX21ha2VfaXRlcihzaXplX3R5cGUgX19wb3MpIGNvbnN0IF9OT0VYQ0VQVAorICAgICAgICB7cmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9fYmVnaW5fICsgX19wb3MgLyBfX2JpdHNfcGVyX3dvcmQsIHN0YXRpY19jYXN0PHVuc2lnbmVkPihfX3BvcyAlIF9fYml0c19wZXJfd29yZCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgaXRlcmF0b3IgX19jb25zdF9pdGVyYXRvcl9jYXN0KGNvbnN0X2l0ZXJhdG9yIF9fcCkgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gYmVnaW4oKSArIChfX3AgLSBjYmVnaW4oKSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19jb3B5X2Fzc2lnbl9hbGxvYyhjb25zdCB2ZWN0b3ImIF9fdikKKyAgICAgICAge19fY29weV9hc3NpZ25fYWxsb2MoX192LCBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgICAgICAgICAgICAgIF9fc3RvcmFnZV90cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfY29weV9hc3NpZ25tZW50Ojp2YWx1ZT4oKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fY29weV9hc3NpZ25fYWxsb2MoY29uc3QgdmVjdG9yJiBfX2MsIHRydWVfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9fYWxsb2MoKSAhPSBfX2MuX19hbGxvYygpKQorICAgICAgICAgICAgICAgIGRlYWxsb2NhdGUoKTsKKyAgICAgICAgICAgIF9fYWxsb2MoKSA9IF9fYy5fX2FsbG9jKCk7CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fY29weV9hc3NpZ25fYWxsb2MoY29uc3QgdmVjdG9yJiwgZmFsc2VfdHlwZSkKKyAgICAgICAge30KKworICAgIHZvaWQgX19tb3ZlX2Fzc2lnbih2ZWN0b3ImIF9fYywgZmFsc2VfdHlwZSk7CisgICAgdm9pZCBfX21vdmVfYXNzaWduKHZlY3RvciYgX19jLCB0cnVlX3R5cGUpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorICAgIHZvaWQgX19tb3ZlX2Fzc2lnbl9hbGxvYyh2ZWN0b3ImIF9fYykKKyAgICAgICAgX05PRVhDRVBUXygKKyAgICAgICAgICAgICFfX3N0b3JhZ2VfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWUgfHwKKyAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpCisgICAgICAgIHtfX21vdmVfYXNzaWduX2FsbG9jKF9fYywgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgICAgICAgICAgICBfX3N0b3JhZ2VfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWU+KCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgdm9pZCBfX21vdmVfYXNzaWduX2FsbG9jKHZlY3RvciYgX19jLCB0cnVlX3R5cGUpCisgICAgICAgIF9OT0VYQ0VQVF8oaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgX19hbGxvYygpID0gX1ZTVEQ6Om1vdmUoX19jLl9fYWxsb2MoKSk7CisgICAgICAgIH0KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKKyAgICB2b2lkIF9fbW92ZV9hc3NpZ25fYWxsb2ModmVjdG9yJiwgZmFsc2VfdHlwZSkKKyAgICAgICAgX05PRVhDRVBUCisgICAgICAgIHt9CisKKyAgICBzaXplX3QgX19oYXNoX2NvZGUoKSBjb25zdCBfTk9FWENFUFQ7CisKKyAgICBmcmllbmQgY2xhc3MgX19iaXRfcmVmZXJlbmNlPHZlY3Rvcj47CisgICAgZnJpZW5kIGNsYXNzIF9fYml0X2NvbnN0X3JlZmVyZW5jZTx2ZWN0b3I+OworICAgIGZyaWVuZCBjbGFzcyBfX2JpdF9pdGVyYXRvcjx2ZWN0b3IsIGZhbHNlPjsKKyAgICBmcmllbmQgY2xhc3MgX19iaXRfaXRlcmF0b3I8dmVjdG9yLCB0cnVlPjsKKyAgICBmcmllbmQgc3RydWN0IF9fYml0X2FycmF5PHZlY3Rvcj47CisgICAgZnJpZW5kIHN0cnVjdCBfTElCQ1BQX1RFTVBMQVRFX1ZJUyBoYXNoPHZlY3Rvcj47Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCit2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46Ol9faW52YWxpZGF0ZV9hbGxfaXRlcmF0b3JzKCkKK3sKK30KKworLy8gIEFsbG9jYXRlIHNwYWNlIGZvciBfX24gb2JqZWN0cworLy8gIHRocm93cyBsZW5ndGhfZXJyb3IgaWYgX19uID4gbWF4X3NpemUoKQorLy8gIHRocm93cyAocHJvYmFibHkgYmFkX2FsbG9jKSBpZiBtZW1vcnkgcnVuIG91dAorLy8gIFByZWNvbmRpdGlvbjogIF9fYmVnaW5fID09IF9fZW5kXyA9PSBfX2NhcCgpID09IDAKKy8vICBQcmVjb25kaXRpb246ICBfX24gPiAwCisvLyAgUG9zdGNvbmRpdGlvbjogIGNhcGFjaXR5KCkgPT0gX19uCisvLyAgUG9zdGNvbmRpdGlvbjogIHNpemUoKSA9PSAwCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK3ZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6YWxsb2NhdGUoc2l6ZV90eXBlIF9fbikKK3sKKyAgICBpZiAoX19uID4gbWF4X3NpemUoKSkKKyAgICAgICAgdGhpcy0+X190aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICBfX24gPSBfX2V4dGVybmFsX2NhcF90b19pbnRlcm5hbChfX24pOworICAgIHRoaXMtPl9fYmVnaW5fID0gX19zdG9yYWdlX3RyYWl0czo6YWxsb2NhdGUodGhpcy0+X19hbGxvYygpLCBfX24pOworICAgIHRoaXMtPl9fc2l6ZV8gPSAwOworICAgIHRoaXMtPl9fY2FwKCkgPSBfX247Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgordm9pZAordmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+OjpkZWFsbG9jYXRlKCkgX05PRVhDRVBUCit7CisgICAgaWYgKHRoaXMtPl9fYmVnaW5fICE9IG51bGxwdHIpCisgICAgeworICAgICAgICBfX3N0b3JhZ2VfdHJhaXRzOjpkZWFsbG9jYXRlKHRoaXMtPl9fYWxsb2MoKSwgdGhpcy0+X19iZWdpbl8sIF9fY2FwKCkpOworICAgICAgICBfX2ludmFsaWRhdGVfYWxsX2l0ZXJhdG9ycygpOworICAgICAgICB0aGlzLT5fX2JlZ2luXyA9IG51bGxwdHI7CisgICAgICAgIHRoaXMtPl9fc2l6ZV8gPSB0aGlzLT5fX2NhcCgpID0gMDsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgdmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK3ZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6bWF4X3NpemUoKSBjb25zdCBfTk9FWENFUFQKK3sKKyAgICBzaXplX3R5cGUgX19hbWF4ID0gX19zdG9yYWdlX3RyYWl0czo6bWF4X3NpemUoX19hbGxvYygpKTsKKyAgICBzaXplX3R5cGUgX19ubWF4ID0gbnVtZXJpY19saW1pdHM8c2l6ZV90eXBlPjo6bWF4KCkgLyAyOyAgLy8gZW5kKCkgPj0gYmVnaW4oKSwgYWx3YXlzCisgICAgaWYgKF9fbm1heCAvIF9fYml0c19wZXJfd29yZCA8PSBfX2FtYXgpCisgICAgICAgIHJldHVybiBfX25tYXg7CisgICAgcmV0dXJuIF9faW50ZXJuYWxfY2FwX3RvX2V4dGVybmFsKF9fYW1heCk7Cit9CisKKy8vICBQcmVjb25kaXRpb246ICBfX25ld19zaXplID4gY2FwYWNpdHkoKQordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordHlwZW5hbWUgdmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK3ZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6X19yZWNvbW1lbmQoc2l6ZV90eXBlIF9fbmV3X3NpemUpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90eXBlIF9fbXMgPSBtYXhfc2l6ZSgpOworICAgIGlmIChfX25ld19zaXplID4gX19tcykKKyAgICAgICAgdGhpcy0+X190aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICBjb25zdCBzaXplX3R5cGUgX19jYXAgPSBjYXBhY2l0eSgpOworICAgIGlmIChfX2NhcCA+PSBfX21zIC8gMikKKyAgICAgICAgcmV0dXJuIF9fbXM7CisgICAgcmV0dXJuIF9WU1REOjptYXgoMipfX2NhcCwgX19hbGlnbl9pdChfX25ld19zaXplKSk7Cit9CisKKy8vICBEZWZhdWx0IGNvbnN0cnVjdHMgX19uIG9iamVjdHMgc3RhcnRpbmcgYXQgX19lbmRfCisvLyAgUHJlY29uZGl0aW9uOiAgX19uID4gMAorLy8gIFByZWNvbmRpdGlvbjogIHNpemUoKSArIF9fbiA8PSBjYXBhY2l0eSgpCisvLyAgUG9zdGNvbmRpdGlvbjogIHNpemUoKSA9PSBzaXplKCkgKyBfX24KK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK3ZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6X19jb25zdHJ1Y3RfYXRfZW5kKHNpemVfdHlwZSBfX24sIGJvb2wgX194KQoreworICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gdGhpcy0+X19zaXplXzsKKyAgICB0aGlzLT5fX3NpemVfICs9IF9fbjsKKyAgICBfVlNURDo6ZmlsbF9uKF9fbWFrZV9pdGVyKF9fb2xkX3NpemUpLCBfX24sIF9feCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Cit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK3ZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6X19jb25zdHJ1Y3RfYXRfZW5kKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5fX3NpemVfOworICAgIHRoaXMtPl9fc2l6ZV8gKz0gX1ZTVEQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgX1ZTVEQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX21ha2VfaXRlcihfX29sZF9zaXplKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6dmVjdG9yKCkKKyAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpCisgICAgOiBfX2JlZ2luXyhudWxscHRyKSwKKyAgICAgIF9fc2l6ZV8oMCksCisgICAgICBfX2NhcF9hbGxvY18oMCkKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+Ojp2ZWN0b3IoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyNpZiBfTElCQ1BQX1NURF9WRVIgPD0gMTQKKyAgICAgICAgX05PRVhDRVBUXyhpc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKQorI2Vsc2UKKyAgICAgICAgX05PRVhDRVBUCisjZW5kaWYKKyAgICA6IF9fYmVnaW5fKG51bGxwdHIpLAorICAgICAgX19zaXplXygwKSwKKyAgICAgIF9fY2FwX2FsbG9jXygwLCBzdGF0aWNfY2FzdDxfX3N0b3JhZ2VfYWxsb2NhdG9yPihfX2EpKQoreworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KK3ZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6dmVjdG9yKHNpemVfdHlwZSBfX24pCisgICAgOiBfX2JlZ2luXyhudWxscHRyKSwKKyAgICAgIF9fc2l6ZV8oMCksCisgICAgICBfX2NhcF9hbGxvY18oMCkKK3sKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRlKF9fbik7CisgICAgICAgIF9fY29uc3RydWN0X2F0X2VuZChfX24sIGZhbHNlKTsKKyAgICB9Cit9CisKKyNpZiBfTElCQ1BQX1NURF9WRVIgPiAxMQordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+Cit2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46OnZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX19iZWdpbl8obnVsbHB0ciksCisgICAgICBfX3NpemVfKDApLAorICAgICAgX19jYXBfYWxsb2NfKDAsIHN0YXRpY19jYXN0PF9fc3RvcmFnZV9hbGxvY2F0b3I+KF9fYSkpCit7CisgICAgaWYgKF9fbiA+IDApCisgICAgeworICAgICAgICBhbGxvY2F0ZShfX24pOworICAgICAgICBfX2NvbnN0cnVjdF9hdF9lbmQoX19uLCBmYWxzZSk7CisgICAgfQorfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgordmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+Ojp2ZWN0b3Ioc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgIDogX19iZWdpbl8obnVsbHB0ciksCisgICAgICBfX3NpemVfKDApLAorICAgICAgX19jYXBfYWxsb2NfKDApCit7CisgICAgaWYgKF9fbiA+IDApCisgICAgeworICAgICAgICBhbGxvY2F0ZShfX24pOworICAgICAgICBfX2NvbnN0cnVjdF9hdF9lbmQoX19uLCBfX3gpOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+Cit2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46OnZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX2JlZ2luXyhudWxscHRyKSwKKyAgICAgIF9fc2l6ZV8oMCksCisgICAgICBfX2NhcF9hbGxvY18oMCwgc3RhdGljX2Nhc3Q8X19zdG9yYWdlX2FsbG9jYXRvcj4oX19hKSkKK3sKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRlKF9fbik7CisgICAgICAgIF9fY29uc3RydWN0X2F0X2VuZChfX24sIF9feCk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3ZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6dmVjdG9yKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19pbnB1dF9pdGVyYXRvciAgPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAhX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWU+Ojp0eXBlKikKKyAgICA6IF9fYmVnaW5fKG51bGxwdHIpLAorICAgICAgX19zaXplXygwKSwKKyAgICAgIF9fY2FwX2FsbG9jXygwKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgICAgIHB1c2hfYmFjaygqX19maXJzdCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgaWYgKF9fYmVnaW5fICE9IG51bGxwdHIpCisgICAgICAgICAgICBfX3N0b3JhZ2VfdHJhaXRzOjpkZWFsbG9jYXRlKF9fYWxsb2MoKSwgX19iZWdpbl8sIF9fY2FwKCkpOworICAgICAgICBfX2ludmFsaWRhdGVfYWxsX2l0ZXJhdG9ycygpOworICAgICAgICB0aHJvdzsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3ZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6dmVjdG9yKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSwKKyAgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19pbnB1dF9pdGVyYXRvciAgPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAhX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWU+Ojp0eXBlKikKKyAgICA6IF9fYmVnaW5fKG51bGxwdHIpLAorICAgICAgX19zaXplXygwKSwKKyAgICAgIF9fY2FwX2FsbG9jXygwLCBzdGF0aWNfY2FzdDxfX3N0b3JhZ2VfYWxsb2NhdG9yPihfX2EpKQoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgICAgIHB1c2hfYmFjaygqX19maXJzdCk7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgIH0KKyAgICBjYXRjaCAoLi4uKQorICAgIHsKKyAgICAgICAgaWYgKF9fYmVnaW5fICE9IG51bGxwdHIpCisgICAgICAgICAgICBfX3N0b3JhZ2VfdHJhaXRzOjpkZWFsbG9jYXRlKF9fYWxsb2MoKSwgX19iZWdpbl8sIF9fY2FwKCkpOworICAgICAgICBfX2ludmFsaWRhdGVfYWxsX2l0ZXJhdG9ycygpOworICAgICAgICB0aHJvdzsKKyAgICB9CisjZW5kaWYgIC8vIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgordmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+Ojp2ZWN0b3IoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWU+Ojp0eXBlKikKKyAgICA6IF9fYmVnaW5fKG51bGxwdHIpLAorICAgICAgX19zaXplXygwKSwKKyAgICAgIF9fY2FwX2FsbG9jXygwKQoreworICAgIHNpemVfdHlwZSBfX24gPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9WU1REOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpKTsKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRlKF9fbik7CisgICAgICAgIF9fY29uc3RydWN0X2F0X2VuZChfX2ZpcnN0LCBfX2xhc3QpOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK3ZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6dmVjdG9yKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlPjo6dHlwZSopCisgICAgOiBfX2JlZ2luXyhudWxscHRyKSwKKyAgICAgIF9fc2l6ZV8oMCksCisgICAgICBfX2NhcF9hbGxvY18oMCwgc3RhdGljX2Nhc3Q8X19zdG9yYWdlX2FsbG9jYXRvcj4oX19hKSkKK3sKKyAgICBzaXplX3R5cGUgX19uID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfVlNURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KSk7CisgICAgaWYgKF9fbiA+IDApCisgICAgeworICAgICAgICBhbGxvY2F0ZShfX24pOworICAgICAgICBfX2NvbnN0cnVjdF9hdF9lbmQoX19maXJzdCwgX19sYXN0KTsKKyAgICB9Cit9CisKKyNpZm5kZWYgX0xJQkNQUF9DWFgwM19MQU5HCisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgordmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+Ojp2ZWN0b3IoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQorICAgIDogX19iZWdpbl8obnVsbHB0ciksCisgICAgICBfX3NpemVfKDApLAorICAgICAgX19jYXBfYWxsb2NfKDApCit7CisgICAgc2l6ZV90eXBlIF9fbiA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19pbC5zaXplKCkpOworICAgIGlmIChfX24gPiAwKQorICAgIHsKKyAgICAgICAgYWxsb2NhdGUoX19uKTsKKyAgICAgICAgX19jb25zdHJ1Y3RfYXRfZW5kKF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KK3ZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6dmVjdG9yKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fYmVnaW5fKG51bGxwdHIpLAorICAgICAgX19zaXplXygwKSwKKyAgICAgIF9fY2FwX2FsbG9jXygwLCBzdGF0aWNfY2FzdDxfX3N0b3JhZ2VfYWxsb2NhdG9yPihfX2EpKQoreworICAgIHNpemVfdHlwZSBfX24gPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9faWwuc2l6ZSgpKTsKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRlKF9fbik7CisgICAgICAgIF9fY29uc3RydWN0X2F0X2VuZChfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpOworICAgIH0KK30KKworI2VuZGlmICAvLyBfTElCQ1BQX0NYWDAzX0xBTkcKKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+Cit2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46On52ZWN0b3IoKQoreworICAgIGlmIChfX2JlZ2luXyAhPSBudWxscHRyKQorICAgICAgICBfX3N0b3JhZ2VfdHJhaXRzOjpkZWFsbG9jYXRlKF9fYWxsb2MoKSwgX19iZWdpbl8sIF9fY2FwKCkpOworICAgIF9faW52YWxpZGF0ZV9hbGxfaXRlcmF0b3JzKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgordmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+Ojp2ZWN0b3IoY29uc3QgdmVjdG9yJiBfX3YpCisgICAgOiBfX2JlZ2luXyhudWxscHRyKSwKKyAgICAgIF9fc2l6ZV8oMCksCisgICAgICBfX2NhcF9hbGxvY18oMCwgX19zdG9yYWdlX3RyYWl0czo6c2VsZWN0X29uX2NvbnRhaW5lcl9jb3B5X2NvbnN0cnVjdGlvbihfX3YuX19hbGxvYygpKSkKK3sKKyAgICBpZiAoX192LnNpemUoKSA+IDApCisgICAgeworICAgICAgICBhbGxvY2F0ZShfX3Yuc2l6ZSgpKTsKKyAgICAgICAgX19jb25zdHJ1Y3RfYXRfZW5kKF9fdi5iZWdpbigpLCBfX3YuZW5kKCkpOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+Cit2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46OnZlY3Rvcihjb25zdCB2ZWN0b3ImIF9fdiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fYmVnaW5fKG51bGxwdHIpLAorICAgICAgX19zaXplXygwKSwKKyAgICAgIF9fY2FwX2FsbG9jXygwLCBfX2EpCit7CisgICAgaWYgKF9fdi5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgYWxsb2NhdGUoX192LnNpemUoKSk7CisgICAgICAgIF9fY29uc3RydWN0X2F0X2VuZChfX3YuYmVnaW4oKSwgX192LmVuZCgpKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgordmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+JgordmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+OjpvcGVyYXRvcj0oY29uc3QgdmVjdG9yJiBfX3YpCit7CisgICAgaWYgKHRoaXMgIT0gJl9fdikKKyAgICB7CisgICAgICAgIF9fY29weV9hc3NpZ25fYWxsb2MoX192KTsKKyAgICAgICAgaWYgKF9fdi5fX3NpemVfKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX192Ll9fc2l6ZV8gPiBjYXBhY2l0eSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlYWxsb2NhdGUoKTsKKyAgICAgICAgICAgICAgICBhbGxvY2F0ZShfX3YuX19zaXplXyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfVlNURDo6Y29weShfX3YuX19iZWdpbl8sIF9fdi5fX2JlZ2luXyArIF9fZXh0ZXJuYWxfY2FwX3RvX2ludGVybmFsKF9fdi5fX3NpemVfKSwgX19iZWdpbl8pOworICAgICAgICB9CisgICAgICAgIF9fc2l6ZV8gPSBfX3YuX19zaXplXzsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworfQorCisjaWZuZGVmIF9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46OnZlY3Rvcih2ZWN0b3ImJiBfX3YpCisjaWYgX0xJQkNQUF9TVERfVkVSID4gMTQKKyAgICAgICAgX05PRVhDRVBUCisjZWxzZQorICAgICAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpCisjZW5kaWYKKyAgICA6IF9fYmVnaW5fKF9fdi5fX2JlZ2luXyksCisgICAgICBfX3NpemVfKF9fdi5fX3NpemVfKSwKKyAgICAgIF9fY2FwX2FsbG9jXyhfX3YuX19jYXBfYWxsb2NfKQoreworICAgIF9fdi5fX2JlZ2luXyA9IG51bGxwdHI7CisgICAgX192Ll9fc2l6ZV8gPSAwOworICAgIF9fdi5fX2NhcCgpID0gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+Cit2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46OnZlY3Rvcih2ZWN0b3ImJiBfX3YsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX2JlZ2luXyhudWxscHRyKSwKKyAgICAgIF9fc2l6ZV8oMCksCisgICAgICBfX2NhcF9hbGxvY18oMCwgX19hKQoreworICAgIGlmIChfX2EgPT0gYWxsb2NhdG9yX3R5cGUoX192Ll9fYWxsb2MoKSkpCisgICAgeworICAgICAgICB0aGlzLT5fX2JlZ2luXyA9IF9fdi5fX2JlZ2luXzsKKyAgICAgICAgdGhpcy0+X19zaXplXyA9IF9fdi5fX3NpemVfOworICAgICAgICB0aGlzLT5fX2NhcCgpID0gX192Ll9fY2FwKCk7CisgICAgICAgIF9fdi5fX2JlZ2luXyA9IG51bGxwdHI7CisgICAgICAgIF9fdi5fX2NhcCgpID0gX192Ll9fc2l6ZV8gPSAwOworICAgIH0KKyAgICBlbHNlIGlmIChfX3Yuc2l6ZSgpID4gMCkKKyAgICB7CisgICAgICAgIGFsbG9jYXRlKF9fdi5zaXplKCkpOworICAgICAgICBfX2NvbnN0cnVjdF9hdF9lbmQoX192LmJlZ2luKCksIF9fdi5lbmQoKSk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj4mCit2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46Om9wZXJhdG9yPSh2ZWN0b3ImJiBfX3YpCisgICAgX05PRVhDRVBUXygoX19ub2V4Y2VwdF9tb3ZlX2Fzc2lnbl9jb250YWluZXI8X0FsbG9jYXRvciwgX19hbGxvY190cmFpdHM+Ojp2YWx1ZSkpCit7CisgICAgX19tb3ZlX2Fzc2lnbihfX3YsIGludGVncmFsX2NvbnN0YW50PGJvb2wsCisgICAgICAgICAgX19zdG9yYWdlX3RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ6OnZhbHVlPigpKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgordm9pZAordmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+OjpfX21vdmVfYXNzaWduKHZlY3RvciYgX19jLCBmYWxzZV90eXBlKQoreworICAgIGlmIChfX2FsbG9jKCkgIT0gX19jLl9fYWxsb2MoKSkKKyAgICAgICAgYXNzaWduKF9fYy5iZWdpbigpLCBfX2MuZW5kKCkpOworICAgIGVsc2UKKyAgICAgICAgX19tb3ZlX2Fzc2lnbihfX2MsIHRydWVfdHlwZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCit2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46Ol9fbW92ZV9hc3NpZ24odmVjdG9yJiBfX2MsIHRydWVfdHlwZSkKKyAgICBfTk9FWENFUFRfKGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpCit7CisgICAgZGVhbGxvY2F0ZSgpOworICAgIF9fbW92ZV9hc3NpZ25fYWxsb2MoX19jKTsKKyAgICB0aGlzLT5fX2JlZ2luXyA9IF9fYy5fX2JlZ2luXzsKKyAgICB0aGlzLT5fX3NpemVfID0gX19jLl9fc2l6ZV87CisgICAgdGhpcy0+X19jYXAoKSA9IF9fYy5fX2NhcCgpOworICAgIF9fYy5fX2JlZ2luXyA9IG51bGxwdHI7CisgICAgX19jLl9fY2FwKCkgPSBfX2MuX19zaXplXyA9IDA7Cit9CisKKyNlbmRpZiAgLy8gIV9MSUJDUFBfQ1hYMDNfTEFORworCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK3ZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6YXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKK3sKKyAgICBfX3NpemVfID0gMDsKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX2MgPSBjYXBhY2l0eSgpOworICAgICAgICBpZiAoX19uIDw9IF9fYykKKyAgICAgICAgICAgIF9fc2l6ZV8gPSBfX247CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmVjdG9yIF9fdihfX2FsbG9jKCkpOworICAgICAgICAgICAgX192LnJlc2VydmUoX19yZWNvbW1lbmQoX19uKSk7CisgICAgICAgICAgICBfX3YuX19zaXplXyA9IF9fbjsKKyAgICAgICAgICAgIHN3YXAoX192KTsKKyAgICAgICAgfQorICAgICAgICBfVlNURDo6ZmlsbF9uKGJlZ2luKCksIF9fbiwgX194KTsKKyAgICB9CisgIF9faW52YWxpZGF0ZV9hbGxfaXRlcmF0b3JzKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc19pbnB1dF9pdGVyYXRvcjxfSW5wdXRJdGVyYXRvcj46OnZhbHVlICYmCisgICAhX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUsCisgICB2b2lkCis+Ojp0eXBlCit2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46OmFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgY2xlYXIoKTsKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgcHVzaF9iYWNrKCpfX2ZpcnN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWUsCisgICB2b2lkCis+Ojp0eXBlCit2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46OmFzc2lnbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworICAgIGNsZWFyKCk7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fbnMgPSBfVlNURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICBfTElCQ1BQX0FTU0VSVChfX25zID49IDAsICJpbnZhbGlkIHJhbmdlIHNwZWNpZmllZCIpOworICAgIGNvbnN0IHNpemVfdCBfX24gPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fbnMpOworICAgIGlmIChfX24pCisgICAgeworICAgICAgICBpZiAoX19uID4gY2FwYWNpdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVhbGxvY2F0ZSgpOworICAgICAgICAgICAgYWxsb2NhdGUoX19uKTsKKyAgICAgICAgfQorICAgICAgICBfX2NvbnN0cnVjdF9hdF9lbmQoX19maXJzdCwgX19sYXN0KTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgordm9pZAordmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+OjpyZXNlcnZlKHNpemVfdHlwZSBfX24pCit7CisgICAgaWYgKF9fbiA+IGNhcGFjaXR5KCkpCisgICAgeworICAgICAgICB2ZWN0b3IgX192KHRoaXMtPl9fYWxsb2MoKSk7CisgICAgICAgIF9fdi5hbGxvY2F0ZShfX24pOworICAgICAgICBfX3YuX19jb25zdHJ1Y3RfYXRfZW5kKHRoaXMtPmJlZ2luKCksIHRoaXMtPmVuZCgpKTsKKyAgICAgICAgc3dhcChfX3YpOworICAgICAgICBfX2ludmFsaWRhdGVfYWxsX2l0ZXJhdG9ycygpOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCit2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46OnNocmlua190b19maXQoKSBfTk9FWENFUFQKK3sKKyAgICBpZiAoX19leHRlcm5hbF9jYXBfdG9faW50ZXJuYWwoc2l6ZSgpKSA+IF9fY2FwKCkpCisgICAgeworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgICAgICB2ZWN0b3IoKnRoaXMsIGFsbG9jYXRvcl90eXBlKF9fYWxsb2MoKSkpLnN3YXAoKnRoaXMpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoLi4uKQorICAgICAgICB7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIHZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6cmVmZXJlbmNlCit2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46OmF0KHNpemVfdHlwZSBfX24pCit7CisgICAgaWYgKF9fbiA+PSBzaXplKCkpCisgICAgICAgIHRoaXMtPl9fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgcmV0dXJuICgqdGhpcylbX19uXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSB2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46OmNvbnN0X3JlZmVyZW5jZQordmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+OjphdChzaXplX3R5cGUgX19uKSBjb25zdAoreworICAgIGlmIChfX24gPj0gc2l6ZSgpKQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiAoKnRoaXMpW19fbl07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgordm9pZAordmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+OjpwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgX194KQoreworICAgIGlmICh0aGlzLT5fX3NpemVfID09IHRoaXMtPmNhcGFjaXR5KCkpCisgICAgICAgIHJlc2VydmUoX19yZWNvbW1lbmQodGhpcy0+X19zaXplXyArIDEpKTsKKyAgICArK3RoaXMtPl9fc2l6ZV87CisgICAgYmFjaygpID0gX194OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIHZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IKK3ZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6aW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKK3sKKyAgICBpdGVyYXRvciBfX3I7CisgICAgaWYgKHNpemUoKSA8IGNhcGFjaXR5KCkpCisgICAgeworICAgICAgICBjb25zdF9pdGVyYXRvciBfX29sZF9lbmQgPSBlbmQoKTsKKyAgICAgICAgKytfX3NpemVfOworICAgICAgICBfVlNURDo6Y29weV9iYWNrd2FyZChfX3Bvc2l0aW9uLCBfX29sZF9lbmQsIGVuZCgpKTsKKyAgICAgICAgX19yID0gX19jb25zdF9pdGVyYXRvcl9jYXN0KF9fcG9zaXRpb24pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2ZWN0b3IgX192KF9fYWxsb2MoKSk7CisgICAgICAgIF9fdi5yZXNlcnZlKF9fcmVjb21tZW5kKF9fc2l6ZV8gKyAxKSk7CisgICAgICAgIF9fdi5fX3NpemVfID0gX19zaXplXyArIDE7CisgICAgICAgIF9fciA9IF9WU1REOjpjb3B5KGNiZWdpbigpLCBfX3Bvc2l0aW9uLCBfX3YuYmVnaW4oKSk7CisgICAgICAgIF9WU1REOjpjb3B5X2JhY2t3YXJkKF9fcG9zaXRpb24sIGNlbmQoKSwgX192LmVuZCgpKTsKKyAgICAgICAgc3dhcChfX3YpOworICAgIH0KKyAgICAqX19yID0gX194OworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgdmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgordmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+OjppbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQoreworICAgIGl0ZXJhdG9yIF9fcjsKKyAgICBzaXplX3R5cGUgX19jID0gY2FwYWNpdHkoKTsKKyAgICBpZiAoX19uIDw9IF9fYyAmJiBzaXplKCkgPD0gX19jIC0gX19uKQorICAgIHsKKyAgICAgICAgY29uc3RfaXRlcmF0b3IgX19vbGRfZW5kID0gZW5kKCk7CisgICAgICAgIF9fc2l6ZV8gKz0gX19uOworICAgICAgICBfVlNURDo6Y29weV9iYWNrd2FyZChfX3Bvc2l0aW9uLCBfX29sZF9lbmQsIGVuZCgpKTsKKyAgICAgICAgX19yID0gX19jb25zdF9pdGVyYXRvcl9jYXN0KF9fcG9zaXRpb24pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2ZWN0b3IgX192KF9fYWxsb2MoKSk7CisgICAgICAgIF9fdi5yZXNlcnZlKF9fcmVjb21tZW5kKF9fc2l6ZV8gKyBfX24pKTsKKyAgICAgICAgX192Ll9fc2l6ZV8gPSBfX3NpemVfICsgX19uOworICAgICAgICBfX3IgPSBfVlNURDo6Y29weShjYmVnaW4oKSwgX19wb3NpdGlvbiwgX192LmJlZ2luKCkpOworICAgICAgICBfVlNURDo6Y29weV9iYWNrd2FyZChfX3Bvc2l0aW9uLCBjZW5kKCksIF9fdi5lbmQoKSk7CisgICAgICAgIHN3YXAoX192KTsKKyAgICB9CisgICAgX1ZTVEQ6OmZpbGxfbihfX3IsIF9fbiwgX194KTsKKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgICBfX2lzX2lucHV0X2l0ZXJhdG9yICA8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSAmJgorICAgICFfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICB0eXBlbmFtZSB2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCis+Ojp0eXBlCit2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46Omluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fb2ZmID0gX19wb3NpdGlvbiAtIGJlZ2luKCk7CisgICAgaXRlcmF0b3IgX19wID0gX19jb25zdF9pdGVyYXRvcl9jYXN0KF9fcG9zaXRpb24pOworICAgIGl0ZXJhdG9yIF9fb2xkX2VuZCA9IGVuZCgpOworICAgIGZvciAoOyBzaXplKCkgIT0gY2FwYWNpdHkoKSAmJiBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgIHsKKyAgICAgICAgKyt0aGlzLT5fX3NpemVfOworICAgICAgICBiYWNrKCkgPSAqX19maXJzdDsKKyAgICB9CisgICAgdmVjdG9yIF9fdihfX2FsbG9jKCkpOworICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKyAgICB7CisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0cnkKKyAgICAgICAgeworI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIF9fdi5hc3NpZ24oX19maXJzdCwgX19sYXN0KTsKKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX29sZF9zaXplID0gc3RhdGljX2Nhc3Q8ZGlmZmVyZW5jZV90eXBlPihfX29sZF9lbmQgLSBiZWdpbigpKTsKKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX29sZF9wID0gX19wIC0gYmVnaW4oKTsKKyAgICAgICAgICAgIHJlc2VydmUoX19yZWNvbW1lbmQoc2l6ZSgpICsgX192LnNpemUoKSkpOworICAgICAgICAgICAgX19wID0gYmVnaW4oKSArIF9fb2xkX3A7CisgICAgICAgICAgICBfX29sZF9lbmQgPSBiZWdpbigpICsgX19vbGRfc2l6ZTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKC4uLikKKyAgICAgICAgeworICAgICAgICAgICAgZXJhc2UoX19vbGRfZW5kLCBlbmQoKSk7CisgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgfQorI2VuZGlmICAvLyBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB9CisgICAgX19wID0gX1ZTVEQ6OnJvdGF0ZShfX3AsIF9fb2xkX2VuZCwgZW5kKCkpOworICAgIGluc2VydChfX3AsIF9fdi5iZWdpbigpLCBfX3YuZW5kKCkpOworICAgIHJldHVybiBiZWdpbigpICsgX19vZmY7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Cit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlLAorICAgIHR5cGVuYW1lIHZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IKKz46OnR5cGUKK3ZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6aW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fbl9zaWduZWQgPSBfVlNURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICBfTElCQ1BQX0FTU0VSVChfX25fc2lnbmVkID49IDAsICJpbnZhbGlkIHJhbmdlIHNwZWNpZmllZCIpOworICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fbl9zaWduZWQpOworICAgIGl0ZXJhdG9yIF9fcjsKKyAgICBzaXplX3R5cGUgX19jID0gY2FwYWNpdHkoKTsKKyAgICBpZiAoX19uIDw9IF9fYyAmJiBzaXplKCkgPD0gX19jIC0gX19uKQorICAgIHsKKyAgICAgICAgY29uc3RfaXRlcmF0b3IgX19vbGRfZW5kID0gZW5kKCk7CisgICAgICAgIF9fc2l6ZV8gKz0gX19uOworICAgICAgICBfVlNURDo6Y29weV9iYWNrd2FyZChfX3Bvc2l0aW9uLCBfX29sZF9lbmQsIGVuZCgpKTsKKyAgICAgICAgX19yID0gX19jb25zdF9pdGVyYXRvcl9jYXN0KF9fcG9zaXRpb24pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2ZWN0b3IgX192KF9fYWxsb2MoKSk7CisgICAgICAgIF9fdi5yZXNlcnZlKF9fcmVjb21tZW5kKF9fc2l6ZV8gKyBfX24pKTsKKyAgICAgICAgX192Ll9fc2l6ZV8gPSBfX3NpemVfICsgX19uOworICAgICAgICBfX3IgPSBfVlNURDo6Y29weShjYmVnaW4oKSwgX19wb3NpdGlvbiwgX192LmJlZ2luKCkpOworICAgICAgICBfVlNURDo6Y29weV9iYWNrd2FyZChfX3Bvc2l0aW9uLCBjZW5kKCksIF9fdi5lbmQoKSk7CisgICAgICAgIHN3YXAoX192KTsKKyAgICB9CisgICAgX1ZTVEQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX3IpOworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3R5cGVuYW1lIHZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IKK3ZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6ZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKK3sKKyAgICBpdGVyYXRvciBfX3IgPSBfX2NvbnN0X2l0ZXJhdG9yX2Nhc3QoX19wb3NpdGlvbik7CisgICAgX1ZTVEQ6OmNvcHkoX19wb3NpdGlvbiArIDEsIHRoaXMtPmNlbmQoKSwgX19yKTsKKyAgICAtLV9fc2l6ZV87CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSB2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCit2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46OmVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBpdGVyYXRvciBfX3IgPSBfX2NvbnN0X2l0ZXJhdG9yX2Nhc3QoX19maXJzdCk7CisgICAgZGlmZmVyZW5jZV90eXBlIF9fZCA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgX1ZTVEQ6OmNvcHkoX19sYXN0LCB0aGlzLT5jZW5kKCksIF9fcik7CisgICAgX19zaXplXyAtPSBfX2Q7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCit2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj46OnN3YXAodmVjdG9yJiBfX3gpCisjaWYgX0xJQkNQUF9TVERfVkVSID49IDE0CisgICAgX05PRVhDRVBUCisjZWxzZQorICAgIF9OT0VYQ0VQVF8oIV9fYWxsb2NfdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXA6OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgX19pc19ub3Rocm93X3N3YXBwYWJsZTxhbGxvY2F0b3JfdHlwZT46OnZhbHVlKQorI2VuZGlmCit7CisgICAgX1ZTVEQ6OnN3YXAodGhpcy0+X19iZWdpbl8sIF9feC5fX2JlZ2luXyk7CisgICAgX1ZTVEQ6OnN3YXAodGhpcy0+X19zaXplXywgX194Ll9fc2l6ZV8pOworICAgIF9WU1REOjpzd2FwKHRoaXMtPl9fY2FwKCksIF9feC5fX2NhcCgpKTsKKyAgICBfX3N3YXBfYWxsb2NhdG9yKHRoaXMtPl9fYWxsb2MoKSwgX194Ll9fYWxsb2MoKSwKKyAgICAgICAgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19hbGxvY190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDo6dmFsdWU+KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK3ZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6cmVzaXplKHNpemVfdHlwZSBfX3N6LCB2YWx1ZV90eXBlIF9feCkKK3sKKyAgICBzaXplX3R5cGUgX19jcyA9IHNpemUoKTsKKyAgICBpZiAoX19jcyA8IF9fc3opCisgICAgeworICAgICAgICBpdGVyYXRvciBfX3I7CisgICAgICAgIHNpemVfdHlwZSBfX2MgPSBjYXBhY2l0eSgpOworICAgICAgICBzaXplX3R5cGUgX19uID0gX19zeiAtIF9fY3M7CisgICAgICAgIGlmIChfX24gPD0gX19jICYmIF9fY3MgPD0gX19jIC0gX19uKQorICAgICAgICB7CisgICAgICAgICAgICBfX3IgPSBlbmQoKTsKKyAgICAgICAgICAgIF9fc2l6ZV8gKz0gX19uOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmVjdG9yIF9fdihfX2FsbG9jKCkpOworICAgICAgICAgICAgX192LnJlc2VydmUoX19yZWNvbW1lbmQoX19zaXplXyArIF9fbikpOworICAgICAgICAgICAgX192Ll9fc2l6ZV8gPSBfX3NpemVfICsgX19uOworICAgICAgICAgICAgX19yID0gX1ZTVEQ6OmNvcHkoY2JlZ2luKCksIGNlbmQoKSwgX192LmJlZ2luKCkpOworICAgICAgICAgICAgc3dhcChfX3YpOworICAgICAgICB9CisgICAgICAgIF9WU1REOjpmaWxsX24oX19yLCBfX24sIF9feCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgX19zaXplXyA9IF9fc3o7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgordm9pZAordmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+OjpmbGlwKCkgX05PRVhDRVBUCit7CisgICAgLy8gZG8gbWlkZGxlIHdob2xlIHdvcmRzCisgICAgc2l6ZV90eXBlIF9fbiA9IF9fc2l6ZV87CisgICAgX19zdG9yYWdlX3BvaW50ZXIgX19wID0gX19iZWdpbl87CisgICAgZm9yICg7IF9fbiA+PSBfX2JpdHNfcGVyX3dvcmQ7ICsrX19wLCBfX24gLT0gX19iaXRzX3Blcl93b3JkKQorICAgICAgICAqX19wID0gfipfX3A7CisgICAgLy8gZG8gbGFzdCBwYXJ0aWFsIHdvcmQKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIF9fc3RvcmFnZV90eXBlIF9fbSA9IH5fX3N0b3JhZ2VfdHlwZSgwKSA+PiAoX19iaXRzX3Blcl93b3JkIC0gX19uKTsKKyAgICAgICAgX19zdG9yYWdlX3R5cGUgX19iID0gKl9fcCAmIF9fbTsKKyAgICAgICAgKl9fcCAmPSB+X19tOworICAgICAgICAqX19wIHw9IH5fX2IgJiBfX207CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KK2Jvb2wKK3ZlY3Rvcjxib29sLCBfQWxsb2NhdG9yPjo6X19pbnZhcmlhbnRzKCkgY29uc3QKK3sKKyAgICBpZiAodGhpcy0+X19iZWdpbl8gPT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5fX3NpemVfICE9IDAgfHwgdGhpcy0+X19jYXAoKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAodGhpcy0+X19jYXAoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAodGhpcy0+X19zaXplXyA+IHRoaXMtPmNhcGFjaXR5KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KK3NpemVfdAordmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+OjpfX2hhc2hfY29kZSgpIGNvbnN0IF9OT0VYQ0VQVAoreworICAgIHNpemVfdCBfX2ggPSAwOworICAgIC8vIGRvIG1pZGRsZSB3aG9sZSB3b3JkcworICAgIHNpemVfdHlwZSBfX24gPSBfX3NpemVfOworICAgIF9fc3RvcmFnZV9wb2ludGVyIF9fcCA9IF9fYmVnaW5fOworICAgIGZvciAoOyBfX24gPj0gX19iaXRzX3Blcl93b3JkOyArK19fcCwgX19uIC09IF9fYml0c19wZXJfd29yZCkKKyAgICAgICAgX19oIF49ICpfX3A7CisgICAgLy8gZG8gbGFzdCBwYXJ0aWFsIHdvcmQKKyAgICBpZiAoX19uID4gMCkKKyAgICB7CisgICAgICAgIGNvbnN0IF9fc3RvcmFnZV90eXBlIF9fbSA9IH5fX3N0b3JhZ2VfdHlwZSgwKSA+PiAoX19iaXRzX3Blcl93b3JkIC0gX19uKTsKKyAgICAgICAgX19oIF49ICpfX3AgJiBfX207CisgICAgfQorICAgIHJldHVybiBfX2g7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgorc3RydWN0IF9MSUJDUFBfVEVNUExBVEVfVklTIGhhc2g8dmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+ID4KKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx2ZWN0b3I8Ym9vbCwgX0FsbG9jYXRvcj4sIHNpemVfdD4KK3sKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCisgICAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgdmVjdG9yPGJvb2wsIF9BbGxvY2F0b3I+JiBfX3ZlYykgY29uc3QgX05PRVhDRVBUCisgICAgICAgIHtyZXR1cm4gX192ZWMuX19oYXNoX2NvZGUoKTt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jYXRvcj4mIF9feCwgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jYXRvcj4mIF9feSkKK3sKKyAgICBjb25zdCB0eXBlbmFtZSB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlIF9fc3ogPSBfX3guc2l6ZSgpOworICAgIHJldHVybiBfX3N6ID09IF9feS5zaXplKCkgJiYgX1ZTVEQ6OmVxdWFsKF9feC5iZWdpbigpLCBfX3guZW5kKCksIF9feS5iZWdpbigpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitvcGVyYXRvciE9KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+JiBfX3gsIGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194ID09IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8IChjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPiYgX194LCBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPiYgX195KQoreworICAgIHJldHVybiBfVlNURDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX194LmJlZ2luKCksIF9feC5lbmQoKSwgX195LmJlZ2luKCksIF9feS5lbmQoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+IChjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPiYgX194LCBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPiYgX195KQoreworICAgIHJldHVybiBfX3kgPCBfX3g7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I+PShjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPiYgX194LCBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPiYgX195KQoreworICAgIHJldHVybiAhKF9feCA8IF9feSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAorb3BlcmF0b3I8PShjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPiYgX194LCBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPiYgX195KQoreworICAgIHJldHVybiAhKF9feSA8IF9feCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorc3dhcCh2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPiYgX194LCB2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPiYgX195KQorICAgIF9OT0VYQ0VQVF8oX05PRVhDRVBUXyhfX3guc3dhcChfX3kpKSkKK3sKKyAgICBfX3guc3dhcChfX3kpOworfQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKK19MSUJDUFBfUE9QX01BQ1JPUworCisjZW5kaWYgIC8vIF9MSUJDUFBfVkVDVE9SCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvd2NoYXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS93Y2hhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NGZlNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jKysvdjEvd2NoYXIuaApAQCAtMCwwICsxLDE4MiBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHdjaGFyLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZiBkZWZpbmVkKF9fbmVlZF93aW50X3QpIHx8IGRlZmluZWQoX19uZWVkX21ic3RhdGVfdCkKKworI2lmICFkZWZpbmVkKF9MSUJDUFBfSEFTX05PX1BSQUdNQV9TWVNURU1fSEVBREVSKQorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKKyNpbmNsdWRlX25leHQgPHdjaGFyLmg+CisKKyNlbGlmICFkZWZpbmVkKF9MSUJDUFBfV0NIQVJfSCkKKyNkZWZpbmUgX0xJQkNQUF9XQ0hBUl9ICisKKy8qCisgICAgd2NoYXIuaCBzeW5vcHNpcworCitNYWNyb3M6CisKKyAgICBOVUxMCisgICAgV0NIQVJfTUFYCisgICAgV0NIQVJfTUlOCisgICAgV0VPRgorCitUeXBlczoKKworICAgIG1ic3RhdGVfdAorICAgIHNpemVfdAorICAgIHRtCisgICAgd2ludF90CisKK2ludCBmd3ByaW50ZihGSUxFKiByZXN0cmljdCBzdHJlYW0sIGNvbnN0IHdjaGFyX3QqIHJlc3RyaWN0IGZvcm1hdCwgLi4uKTsKK2ludCBmd3NjYW5mKEZJTEUqIHJlc3RyaWN0IHN0cmVhbSwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgZm9ybWF0LCAuLi4pOworaW50IHN3cHJpbnRmKHdjaGFyX3QqIHJlc3RyaWN0IHMsIHNpemVfdCBuLCBjb25zdCB3Y2hhcl90KiByZXN0cmljdCBmb3JtYXQsIC4uLik7CitpbnQgc3dzY2FuZihjb25zdCB3Y2hhcl90KiByZXN0cmljdCBzLCBjb25zdCB3Y2hhcl90KiByZXN0cmljdCBmb3JtYXQsIC4uLik7CitpbnQgdmZ3cHJpbnRmKEZJTEUqIHJlc3RyaWN0IHN0cmVhbSwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgZm9ybWF0LCB2YV9saXN0IGFyZyk7CitpbnQgdmZ3c2NhbmYoRklMRSogcmVzdHJpY3Qgc3RyZWFtLCBjb25zdCB3Y2hhcl90KiByZXN0cmljdCBmb3JtYXQsIHZhX2xpc3QgYXJnKTsgIC8vIEM5OQoraW50IHZzd3ByaW50Zih3Y2hhcl90KiByZXN0cmljdCBzLCBzaXplX3QgbiwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgZm9ybWF0LCB2YV9saXN0IGFyZyk7CitpbnQgdnN3c2NhbmYoY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgcywgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgZm9ybWF0LCB2YV9saXN0IGFyZyk7ICAvLyBDOTkKK2ludCB2d3ByaW50Zihjb25zdCB3Y2hhcl90KiByZXN0cmljdCBmb3JtYXQsIHZhX2xpc3QgYXJnKTsKK2ludCB2d3NjYW5mKGNvbnN0IHdjaGFyX3QqIHJlc3RyaWN0IGZvcm1hdCwgdmFfbGlzdCBhcmcpOyAgLy8gQzk5CitpbnQgd3ByaW50Zihjb25zdCB3Y2hhcl90KiByZXN0cmljdCBmb3JtYXQsIC4uLik7CitpbnQgd3NjYW5mKGNvbnN0IHdjaGFyX3QqIHJlc3RyaWN0IGZvcm1hdCwgLi4uKTsKK3dpbnRfdCBmZ2V0d2MoRklMRSogc3RyZWFtKTsKK3djaGFyX3QqIGZnZXR3cyh3Y2hhcl90KiByZXN0cmljdCBzLCBpbnQgbiwgRklMRSogcmVzdHJpY3Qgc3RyZWFtKTsKK3dpbnRfdCBmcHV0d2Mod2NoYXJfdCBjLCBGSUxFKiBzdHJlYW0pOworaW50IGZwdXR3cyhjb25zdCB3Y2hhcl90KiByZXN0cmljdCBzLCBGSUxFKiByZXN0cmljdCBzdHJlYW0pOworaW50IGZ3aWRlKEZJTEUqIHN0cmVhbSwgaW50IG1vZGUpOword2ludF90IGdldHdjKEZJTEUqIHN0cmVhbSk7Cit3aW50X3QgZ2V0d2NoYXIoKTsKK3dpbnRfdCBwdXR3Yyh3Y2hhcl90IGMsIEZJTEUqIHN0cmVhbSk7Cit3aW50X3QgcHV0d2NoYXIod2NoYXJfdCBjKTsKK3dpbnRfdCB1bmdldHdjKHdpbnRfdCBjLCBGSUxFKiBzdHJlYW0pOworZG91YmxlIHdjc3RvZChjb25zdCB3Y2hhcl90KiByZXN0cmljdCBucHRyLCB3Y2hhcl90KiogcmVzdHJpY3QgZW5kcHRyKTsKK2Zsb2F0IHdjc3RvZihjb25zdCB3Y2hhcl90KiByZXN0cmljdCBucHRyLCB3Y2hhcl90KiogcmVzdHJpY3QgZW5kcHRyKTsgICAgICAgICAvLyBDOTkKK2xvbmcgZG91YmxlIHdjc3RvbGQoY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgbnB0ciwgd2NoYXJfdCoqIHJlc3RyaWN0IGVuZHB0cik7ICAvLyBDOTkKK2xvbmcgd2NzdG9sKGNvbnN0IHdjaGFyX3QqIHJlc3RyaWN0IG5wdHIsIHdjaGFyX3QqKiByZXN0cmljdCBlbmRwdHIsIGludCBiYXNlKTsKK2xvbmcgbG9uZyB3Y3N0b2xsKGNvbnN0IHdjaGFyX3QqIHJlc3RyaWN0IG5wdHIsIHdjaGFyX3QqKiByZXN0cmljdCBlbmRwdHIsIGludCBiYXNlKTsgIC8vIEM5OQordW5zaWduZWQgbG9uZyB3Y3N0b3VsKGNvbnN0IHdjaGFyX3QqIHJlc3RyaWN0IG5wdHIsIHdjaGFyX3QqKiByZXN0cmljdCBlbmRwdHIsIGludCBiYXNlKTsKK3Vuc2lnbmVkIGxvbmcgbG9uZyB3Y3N0b3VsbChjb25zdCB3Y2hhcl90KiByZXN0cmljdCBucHRyLCB3Y2hhcl90KiogcmVzdHJpY3QgZW5kcHRyLCBpbnQgYmFzZSk7ICAvLyBDOTkKK3djaGFyX3QqIHdjc2NweSh3Y2hhcl90KiByZXN0cmljdCBzMSwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgczIpOword2NoYXJfdCogd2NzbmNweSh3Y2hhcl90KiByZXN0cmljdCBzMSwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgczIsIHNpemVfdCBuKTsKK3djaGFyX3QqIHdjc2NhdCh3Y2hhcl90KiByZXN0cmljdCBzMSwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgczIpOword2NoYXJfdCogd2NzbmNhdCh3Y2hhcl90KiByZXN0cmljdCBzMSwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgczIsIHNpemVfdCBuKTsKK2ludCB3Y3NjbXAoY29uc3Qgd2NoYXJfdCogczEsIGNvbnN0IHdjaGFyX3QqIHMyKTsKK2ludCB3Y3Njb2xsKGNvbnN0IHdjaGFyX3QqIHMxLCBjb25zdCB3Y2hhcl90KiBzMik7CitpbnQgd2NzbmNtcChjb25zdCB3Y2hhcl90KiBzMSwgY29uc3Qgd2NoYXJfdCogczIsIHNpemVfdCBuKTsKK3NpemVfdCB3Y3N4ZnJtKHdjaGFyX3QqIHJlc3RyaWN0IHMxLCBjb25zdCB3Y2hhcl90KiByZXN0cmljdCBzMiwgc2l6ZV90IG4pOworY29uc3Qgd2NoYXJfdCogd2NzY2hyKGNvbnN0IHdjaGFyX3QqIHMsIHdjaGFyX3QgYyk7CisgICAgICB3Y2hhcl90KiB3Y3NjaHIoICAgICAgd2NoYXJfdCogcywgd2NoYXJfdCBjKTsKK3NpemVfdCB3Y3Njc3BuKGNvbnN0IHdjaGFyX3QqIHMxLCBjb25zdCB3Y2hhcl90KiBzMik7CitzaXplX3Qgd2NzbGVuKGNvbnN0IHdjaGFyX3QqIHMpOworY29uc3Qgd2NoYXJfdCogd2NzcGJyayhjb25zdCB3Y2hhcl90KiBzMSwgY29uc3Qgd2NoYXJfdCogczIpOworICAgICAgd2NoYXJfdCogd2NzcGJyayggICAgICB3Y2hhcl90KiBzMSwgY29uc3Qgd2NoYXJfdCogczIpOworY29uc3Qgd2NoYXJfdCogd2NzcmNocihjb25zdCB3Y2hhcl90KiBzLCB3Y2hhcl90IGMpOworICAgICAgd2NoYXJfdCogd2NzcmNociggICAgICB3Y2hhcl90KiBzLCB3Y2hhcl90IGMpOworc2l6ZV90IHdjc3Nwbihjb25zdCB3Y2hhcl90KiBzMSwgY29uc3Qgd2NoYXJfdCogczIpOworY29uc3Qgd2NoYXJfdCogd2Nzc3RyKGNvbnN0IHdjaGFyX3QqIHMxLCBjb25zdCB3Y2hhcl90KiBzMik7CisgICAgICB3Y2hhcl90KiB3Y3NzdHIoICAgICAgd2NoYXJfdCogczEsIGNvbnN0IHdjaGFyX3QqIHMyKTsKK3djaGFyX3QqIHdjc3Rvayh3Y2hhcl90KiByZXN0cmljdCBzMSwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgczIsIHdjaGFyX3QqKiByZXN0cmljdCBwdHIpOworY29uc3Qgd2NoYXJfdCogd21lbWNocihjb25zdCB3Y2hhcl90KiBzLCB3Y2hhcl90IGMsIHNpemVfdCBuKTsKKyAgICAgIHdjaGFyX3QqIHdtZW1jaHIoICAgICAgd2NoYXJfdCogcywgd2NoYXJfdCBjLCBzaXplX3Qgbik7CitpbnQgd21lbWNtcCh3Y2hhcl90KiByZXN0cmljdCBzMSwgY29uc3Qgd2NoYXJfdCogcmVzdHJpY3QgczIsIHNpemVfdCBuKTsKK3djaGFyX3QqIHdtZW1jcHkod2NoYXJfdCogcmVzdHJpY3QgczEsIGNvbnN0IHdjaGFyX3QqIHJlc3RyaWN0IHMyLCBzaXplX3Qgbik7Cit3Y2hhcl90KiB3bWVtbW92ZSh3Y2hhcl90KiBzMSwgY29uc3Qgd2NoYXJfdCogczIsIHNpemVfdCBuKTsKK3djaGFyX3QqIHdtZW1zZXQod2NoYXJfdCogcywgd2NoYXJfdCBjLCBzaXplX3Qgbik7CitzaXplX3Qgd2NzZnRpbWUod2NoYXJfdCogcmVzdHJpY3Qgcywgc2l6ZV90IG1heHNpemUsIGNvbnN0IHdjaGFyX3QqIHJlc3RyaWN0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICBjb25zdCB0bSogcmVzdHJpY3QgdGltZXB0cik7Cit3aW50X3QgYnRvd2MoaW50IGMpOworaW50IHdjdG9iKHdpbnRfdCBjKTsKK2ludCBtYnNpbml0KGNvbnN0IG1ic3RhdGVfdCogcHMpOworc2l6ZV90IG1icmxlbihjb25zdCBjaGFyKiByZXN0cmljdCBzLCBzaXplX3QgbiwgbWJzdGF0ZV90KiByZXN0cmljdCBwcyk7CitzaXplX3QgbWJydG93Yyh3Y2hhcl90KiByZXN0cmljdCBwd2MsIGNvbnN0IGNoYXIqIHJlc3RyaWN0IHMsIHNpemVfdCBuLCBtYnN0YXRlX3QqIHJlc3RyaWN0IHBzKTsKK3NpemVfdCB3Y3J0b21iKGNoYXIqIHJlc3RyaWN0IHMsIHdjaGFyX3Qgd2MsIG1ic3RhdGVfdCogcmVzdHJpY3QgcHMpOworc2l6ZV90IG1ic3J0b3djcyh3Y2hhcl90KiByZXN0cmljdCBkc3QsIGNvbnN0IGNoYXIqKiByZXN0cmljdCBzcmMsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgIG1ic3RhdGVfdCogcmVzdHJpY3QgcHMpOworc2l6ZV90IHdjc3J0b21icyhjaGFyKiByZXN0cmljdCBkc3QsIGNvbnN0IHdjaGFyX3QqKiByZXN0cmljdCBzcmMsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgIG1ic3RhdGVfdCogcmVzdHJpY3QgcHMpOworCisqLworCisjaW5jbHVkZSA8X19jb25maWc+CisKKyNpZiAhZGVmaW5lZChfTElCQ1BQX0hBU19OT19QUkFHTUFfU1lTVEVNX0hFQURFUikKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgX19DT1JSRUNUX0lTT19DUFBfV0NIQVJfSF9QUk9UTworI2VuZGlmCisKKyNpbmNsdWRlX25leHQgPHdjaGFyLmg+CisKKy8vIERldGVybWluZSB3aGV0aGVyIHdlIGhhdmUgY29uc3QtY29ycmVjdCBvdmVybG9hZHMgZm9yIHdjc2NociBhbmQgZnJpZW5kcy4KKyNpZiBkZWZpbmVkKF9XQ0hBUl9IX0NQTFVTUExVU185OF9DT05GT1JNQU5DRV8pCisjICBkZWZpbmUgX0xJQkNQUF9XQ0hBUl9IX0hBU19DT05TVF9PVkVSTE9BRFMgMQorI2VsaWYgZGVmaW5lZChfX0dMSUJDX1BSRVJFUSkKKyMgIGlmIF9fR0xJQkNfUFJFUkVRKDIsIDEwKQorIyAgICBkZWZpbmUgX0xJQkNQUF9XQ0hBUl9IX0hBU19DT05TVF9PVkVSTE9BRFMgMQorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQoX0xJQkNQUF9NU1ZDUlQpCisjICBpZiBkZWZpbmVkKF9DUlRfQ09OU1RfQ09SUkVDVF9PVkVSTE9BRFMpCisjICAgIGRlZmluZSBfTElCQ1BQX1dDSEFSX0hfSEFTX0NPTlNUX09WRVJMT0FEUyAxCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChfTElCQ1BQX1dDSEFSX0hfSEFTX0NPTlNUX09WRVJMT0FEUykgJiYgZGVmaW5lZChfTElCQ1BQX1BSRUZFUlJFRF9PVkVSTE9BRCkKK2V4dGVybiAiQysrIiB7CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQord2NoYXJfdCogX19saWJjcHBfd2NzY2hyKGNvbnN0IHdjaGFyX3QqIF9fcywgd2NoYXJfdCBfX2MpIHtyZXR1cm4gKHdjaGFyX3QqKXdjc2NocihfX3MsIF9fYyk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9QUkVGRVJSRURfT1ZFUkxPQUQKK2NvbnN0IHdjaGFyX3QqIHdjc2Nocihjb25zdCB3Y2hhcl90KiBfX3MsIHdjaGFyX3QgX19jKSB7cmV0dXJuIF9fbGliY3BwX3djc2NocihfX3MsIF9fYyk7fQoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgX0xJQkNQUF9QUkVGRVJSRURfT1ZFUkxPQUQKKyAgICAgIHdjaGFyX3QqIHdjc2NociggICAgICB3Y2hhcl90KiBfX3MsIHdjaGFyX3QgX19jKSB7cmV0dXJuIF9fbGliY3BwX3djc2NocihfX3MsIF9fYyk7fQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQord2NoYXJfdCogX19saWJjcHBfd2NzcGJyayhjb25zdCB3Y2hhcl90KiBfX3MxLCBjb25zdCB3Y2hhcl90KiBfX3MyKSB7cmV0dXJuICh3Y2hhcl90Kil3Y3NwYnJrKF9fczEsIF9fczIpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfUFJFRkVSUkVEX09WRVJMT0FECitjb25zdCB3Y2hhcl90KiB3Y3NwYnJrKGNvbnN0IHdjaGFyX3QqIF9fczEsIGNvbnN0IHdjaGFyX3QqIF9fczIpIHtyZXR1cm4gX19saWJjcHBfd2NzcGJyayhfX3MxLCBfX3MyKTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX1BSRUZFUlJFRF9PVkVSTE9BRAorICAgICAgd2NoYXJfdCogd2NzcGJyayggICAgICB3Y2hhcl90KiBfX3MxLCBjb25zdCB3Y2hhcl90KiBfX3MyKSB7cmV0dXJuIF9fbGliY3BwX3djc3BicmsoX19zMSwgX19zMik7fQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQord2NoYXJfdCogX19saWJjcHBfd2NzcmNocihjb25zdCB3Y2hhcl90KiBfX3MsIHdjaGFyX3QgX19jKSB7cmV0dXJuICh3Y2hhcl90Kil3Y3NyY2hyKF9fcywgX19jKTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX1BSRUZFUlJFRF9PVkVSTE9BRAorY29uc3Qgd2NoYXJfdCogd2NzcmNocihjb25zdCB3Y2hhcl90KiBfX3MsIHdjaGFyX3QgX19jKSB7cmV0dXJuIF9fbGliY3BwX3djc3JjaHIoX19zLCBfX2MpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfUFJFRkVSUkVEX09WRVJMT0FECisgICAgICB3Y2hhcl90KiB3Y3NyY2hyKCAgICAgIHdjaGFyX3QqIF9fcywgd2NoYXJfdCBfX2MpIHtyZXR1cm4gX19saWJjcHBfd2NzcmNocihfX3MsIF9fYyk7fQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQord2NoYXJfdCogX19saWJjcHBfd2Nzc3RyKGNvbnN0IHdjaGFyX3QqIF9fczEsIGNvbnN0IHdjaGFyX3QqIF9fczIpIHtyZXR1cm4gKHdjaGFyX3QqKXdjc3N0cihfX3MxLCBfX3MyKTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX1BSRUZFUlJFRF9PVkVSTE9BRAorY29uc3Qgd2NoYXJfdCogd2Nzc3RyKGNvbnN0IHdjaGFyX3QqIF9fczEsIGNvbnN0IHdjaGFyX3QqIF9fczIpIHtyZXR1cm4gX19saWJjcHBfd2Nzc3RyKF9fczEsIF9fczIpO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfUFJFRkVSUkVEX09WRVJMT0FECisgICAgICB3Y2hhcl90KiB3Y3NzdHIoICAgICAgd2NoYXJfdCogX19zMSwgY29uc3Qgd2NoYXJfdCogX19zMikge3JldHVybiBfX2xpYmNwcF93Y3NzdHIoX19zMSwgX19zMik7fQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQord2NoYXJfdCogX19saWJjcHBfd21lbWNocihjb25zdCB3Y2hhcl90KiBfX3MsIHdjaGFyX3QgX19jLCBzaXplX3QgX19uKSB7cmV0dXJuICh3Y2hhcl90Kil3bWVtY2hyKF9fcywgX19jLCBfX24pO30KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIF9MSUJDUFBfUFJFRkVSUkVEX09WRVJMT0FECitjb25zdCB3Y2hhcl90KiB3bWVtY2hyKGNvbnN0IHdjaGFyX3QqIF9fcywgd2NoYXJfdCBfX2MsIHNpemVfdCBfX24pIHtyZXR1cm4gX19saWJjcHBfd21lbWNocihfX3MsIF9fYywgX19uKTt9CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfTElCQ1BQX1BSRUZFUlJFRF9PVkVSTE9BRAorICAgICAgd2NoYXJfdCogd21lbWNociggICAgICB3Y2hhcl90KiBfX3MsIHdjaGFyX3QgX19jLCBzaXplX3QgX19uKSB7cmV0dXJuIF9fbGliY3BwX3dtZW1jaHIoX19zLCBfX2MsIF9fbik7fQorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiBkZWZpbmVkKF9MSUJDUFBfTVNWQ1JUX0xJS0UpCitleHRlcm4gIkMiIHsKK3NpemVfdCBtYnNucnRvd2NzKHdjaGFyX3QgKl9fcmVzdHJpY3QgZHN0LCBjb25zdCBjaGFyICoqX19yZXN0cmljdCBzcmMsCisgICAgICAgICAgICAgICAgICBzaXplX3Qgbm1jLCBzaXplX3QgbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgcHMpOworc2l6ZV90IHdjc25ydG9tYnMoY2hhciAqX19yZXN0cmljdCBkc3QsIGNvbnN0IHdjaGFyX3QgKipfX3Jlc3RyaWN0IHNyYywKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBud2MsIHNpemVfdCBsZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBwcyk7Cit9ICAvLyBleHRlcm4gIkMrKyIKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMgJiYgX0xJQkNQUF9NU1ZDUlQKKworI2VuZGlmICAvLyBfTElCQ1BQX1dDSEFSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS93Y3R5cGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2MrKy92MS93Y3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWM1YTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvYysrL3YxL3djdHlwZS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8vIC0qLSBDKysgLSotCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB3Y3R5cGUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9MSUJDUFBfV0NUWVBFX0gKKyNkZWZpbmUgX0xJQkNQUF9XQ1RZUEVfSAorCisvKgorICAgIHdjdHlwZS5oIHN5bm9wc2lzCisKK01hY3JvczoKKworICAgIFdFT0YKKworVHlwZXM6CisKKyAgICB3aW50X3QKKyAgICB3Y3RyYW5zX3QKKyAgICB3Y3R5cGVfdAorCitpbnQgaXN3YWxudW0od2ludF90IHdjKTsKK2ludCBpc3dhbHBoYSh3aW50X3Qgd2MpOworaW50IGlzd2JsYW5rKHdpbnRfdCB3Yyk7ICAvLyBDOTkKK2ludCBpc3djbnRybCh3aW50X3Qgd2MpOworaW50IGlzd2RpZ2l0KHdpbnRfdCB3Yyk7CitpbnQgaXN3Z3JhcGgod2ludF90IHdjKTsKK2ludCBpc3dsb3dlcih3aW50X3Qgd2MpOworaW50IGlzd3ByaW50KHdpbnRfdCB3Yyk7CitpbnQgaXN3cHVuY3Qod2ludF90IHdjKTsKK2ludCBpc3dzcGFjZSh3aW50X3Qgd2MpOworaW50IGlzd3VwcGVyKHdpbnRfdCB3Yyk7CitpbnQgaXN3eGRpZ2l0KHdpbnRfdCB3Yyk7CitpbnQgaXN3Y3R5cGUod2ludF90IHdjLCB3Y3R5cGVfdCBkZXNjKTsKK3djdHlwZV90IHdjdHlwZShjb25zdCBjaGFyKiBwcm9wZXJ0eSk7Cit3aW50X3QgdG93bG93ZXIod2ludF90IHdjKTsKK3dpbnRfdCB0b3d1cHBlcih3aW50X3Qgd2MpOword2ludF90IHRvd2N0cmFucyh3aW50X3Qgd2MsIHdjdHJhbnNfdCBkZXNjKTsKK3djdHJhbnNfdCB3Y3RyYW5zKGNvbnN0IGNoYXIqIHByb3BlcnR5KTsKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorCisjaWYgIWRlZmluZWQoX0xJQkNQUF9IQVNfTk9fUFJBR01BX1NZU1RFTV9IRUFERVIpCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworI2luY2x1ZGVfbmV4dCA8d2N0eXBlLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisjdW5kZWYgaXN3YWxudW0KKyN1bmRlZiBpc3dhbHBoYQorI3VuZGVmIGlzd2JsYW5rCisjdW5kZWYgaXN3Y250cmwKKyN1bmRlZiBpc3dkaWdpdAorI3VuZGVmIGlzd2dyYXBoCisjdW5kZWYgaXN3bG93ZXIKKyN1bmRlZiBpc3dwcmludAorI3VuZGVmIGlzd3B1bmN0CisjdW5kZWYgaXN3c3BhY2UKKyN1bmRlZiBpc3d1cHBlcgorI3VuZGVmIGlzd3hkaWdpdAorI3VuZGVmIGlzd2N0eXBlCisjdW5kZWYgd2N0eXBlCisjdW5kZWYgdG93bG93ZXIKKyN1bmRlZiB0b3d1cHBlcgorI3VuZGVmIHRvd2N0cmFucworI3VuZGVmIHdjdHJhbnMKKworI2VuZGlmICAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgIC8vIF9MSUJDUFBfV0NUWVBFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nLWMvQnVpbGRTeXN0ZW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nLWMvQnVpbGRTeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDMyM2E0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmctYy9CdWlsZFN5c3RlbS5oCkBAIC0wLDAgKzEsMTU2IEBACisvKj09LS0gY2xhbmctYy9CdWlsZFN5c3RlbS5oIC0gVXRpbGl0aWVzIGZvciB1c2UgYnkgYnVpbGQgc3lzdGVtcyAtKi0gQyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGhlYWRlciBwcm92aWRlcyB2YXJpb3VzIHV0aWxpdGllcyBmb3IgdXNlIGJ5IGJ1aWxkIHN5c3RlbXMuICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9DTEFOR19DX0JVSUxEU1lTVEVNX0gKKyNkZWZpbmUgTExWTV9DTEFOR19DX0JVSUxEU1lTVEVNX0gKKworI2luY2x1ZGUgImNsYW5nLWMvUGxhdGZvcm0uaCIKKyNpbmNsdWRlICJjbGFuZy1jL0NYRXJyb3JDb2RlLmgiCisjaW5jbHVkZSAiY2xhbmctYy9DWFN0cmluZy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogXGRlZmdyb3VwIEJVSUxEX1NZU1RFTSBCdWlsZCBzeXN0ZW0gdXRpbGl0aWVzCisgKiBAeworICovCisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgdGltZXN0YW1wIGZvciB1c2Ugd2l0aCBDbGFuZydzCisgKiBcYyAtZmJ1aWxkLXNlc3Npb24tdGltZXN0YW1wPSBvcHRpb24uCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGxvbmcgbG9uZyBjbGFuZ19nZXRCdWlsZFNlc3Npb25UaW1lc3RhbXAodm9pZCk7CisKKy8qKgorICogXGJyaWVmIE9iamVjdCBlbmNhcHN1bGF0aW5nIGluZm9ybWF0aW9uIGFib3V0IG92ZXJsYXlpbmcgdmlydHVhbAorICogZmlsZS9kaXJlY3RvcmllcyBvdmVyIHRoZSByZWFsIGZpbGUgc3lzdGVtLgorICovCit0eXBlZGVmIHN0cnVjdCBDWFZpcnR1YWxGaWxlT3ZlcmxheUltcGwgKkNYVmlydHVhbEZpbGVPdmVybGF5OworCisvKioKKyAqIFxicmllZiBDcmVhdGUgYSBcYyBDWFZpcnR1YWxGaWxlT3ZlcmxheSBvYmplY3QuCisgKiBNdXN0IGJlIGRpc3Bvc2VkIHdpdGggXGMgY2xhbmdfVmlydHVhbEZpbGVPdmVybGF5X2Rpc3Bvc2UoKS4KKyAqCisgKiBccGFyYW0gb3B0aW9ucyBpcyByZXNlcnZlZCwgYWx3YXlzIHBhc3MgMC4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hWaXJ0dWFsRmlsZU92ZXJsYXkKK2NsYW5nX1ZpcnR1YWxGaWxlT3ZlcmxheV9jcmVhdGUodW5zaWduZWQgb3B0aW9ucyk7CisKKy8qKgorICogXGJyaWVmIE1hcCBhbiBhYnNvbHV0ZSB2aXJ0dWFsIGZpbGUgcGF0aCB0byBhbiBhYnNvbHV0ZSByZWFsIG9uZS4KKyAqIFRoZSB2aXJ0dWFsIHBhdGggbXVzdCBiZSBjYW5vbmljYWxpemVkIChub3QgY29udGFpbiAiLiIvIi4uIikuCisgKiBccmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyB0byBpbmRpY2F0ZSBhbiBlcnJvci4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWEVycm9yQ29kZQorY2xhbmdfVmlydHVhbEZpbGVPdmVybGF5X2FkZEZpbGVNYXBwaW5nKENYVmlydHVhbEZpbGVPdmVybGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZpcnR1YWxQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYWxQYXRoKTsKKworLyoqCisgKiBcYnJpZWYgU2V0IHRoZSBjYXNlIHNlbnNpdGl2aXR5IGZvciB0aGUgXGMgQ1hWaXJ0dWFsRmlsZU92ZXJsYXkgb2JqZWN0LgorICogVGhlIFxjIENYVmlydHVhbEZpbGVPdmVybGF5IG9iamVjdCBpcyBjYXNlLXNlbnNpdGl2ZSBieSBkZWZhdWx0LCB0aGlzCisgKiBvcHRpb24gY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQuCisgKiBccmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyB0byBpbmRpY2F0ZSBhbiBlcnJvci4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWEVycm9yQ29kZQorY2xhbmdfVmlydHVhbEZpbGVPdmVybGF5X3NldENhc2VTZW5zaXRpdml0eShDWFZpcnR1YWxGaWxlT3ZlcmxheSwKKwkJCQkJCQkJCQkJaW50IGNhc2VTZW5zaXRpdmUpOworCisvKioKKyAqIFxicmllZiBXcml0ZSBvdXQgdGhlIFxjIENYVmlydHVhbEZpbGVPdmVybGF5IG9iamVjdCB0byBhIGNoYXIgYnVmZmVyLgorICoKKyAqIFxwYXJhbSBvcHRpb25zIGlzIHJlc2VydmVkLCBhbHdheXMgcGFzcyAwLgorICogXHBhcmFtIG91dF9idWZmZXJfcHRyIHBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgYnVmZmVyIHBvaW50ZXIsIHdoaWNoIHNob3VsZCBiZQorICogZGlzcG9zZWQgdXNpbmcgXGMgY2xhbmdfZnJlZSgpLgorICogXHBhcmFtIG91dF9idWZmZXJfc2l6ZSBwb2ludGVyIHRvIHJlY2VpdmUgdGhlIGJ1ZmZlciBzaXplLgorICogXHJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gdG8gaW5kaWNhdGUgYW4gZXJyb3IuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGVudW0gQ1hFcnJvckNvZGUKK2NsYW5nX1ZpcnR1YWxGaWxlT3ZlcmxheV93cml0ZVRvQnVmZmVyKENYVmlydHVhbEZpbGVPdmVybGF5LCB1bnNpZ25lZCBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKm91dF9idWZmZXJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKm91dF9idWZmZXJfc2l6ZSk7CisKKy8qKgorICogXGJyaWVmIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSBsaWJjbGFuZywgc3VjaCBhcyB0aGUgYnVmZmVyIHJldHVybmVkIGJ5CisgKiBcYyBDWFZpcnR1YWxGaWxlT3ZlcmxheSgpIG9yIFxjIGNsYW5nX01vZHVsZU1hcERlc2NyaXB0b3Jfd3JpdGVUb0J1ZmZlcigpLgorICoKKyAqIFxwYXJhbSBidWZmZXIgbWVtb3J5IHBvaW50ZXIgdG8gZnJlZS4KKyAqLworQ0lOREVYX0xJTktBR0Ugdm9pZCBjbGFuZ19mcmVlKHZvaWQgKmJ1ZmZlcik7CisKKy8qKgorICogXGJyaWVmIERpc3Bvc2UgYSBcYyBDWFZpcnR1YWxGaWxlT3ZlcmxheSBvYmplY3QuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHZvaWQgY2xhbmdfVmlydHVhbEZpbGVPdmVybGF5X2Rpc3Bvc2UoQ1hWaXJ0dWFsRmlsZU92ZXJsYXkpOworCisvKioKKyAqIFxicmllZiBPYmplY3QgZW5jYXBzdWxhdGluZyBpbmZvcm1hdGlvbiBhYm91dCBhIG1vZHVsZS5tYXAgZmlsZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ1hNb2R1bGVNYXBEZXNjcmlwdG9ySW1wbCAqQ1hNb2R1bGVNYXBEZXNjcmlwdG9yOworCisvKioKKyAqIFxicmllZiBDcmVhdGUgYSBcYyBDWE1vZHVsZU1hcERlc2NyaXB0b3Igb2JqZWN0LgorICogTXVzdCBiZSBkaXNwb3NlZCB3aXRoIFxjIGNsYW5nX01vZHVsZU1hcERlc2NyaXB0b3JfZGlzcG9zZSgpLgorICoKKyAqIFxwYXJhbSBvcHRpb25zIGlzIHJlc2VydmVkLCBhbHdheXMgcGFzcyAwLgorICovCitDSU5ERVhfTElOS0FHRSBDWE1vZHVsZU1hcERlc2NyaXB0b3IKK2NsYW5nX01vZHVsZU1hcERlc2NyaXB0b3JfY3JlYXRlKHVuc2lnbmVkIG9wdGlvbnMpOworCisvKioKKyAqIFxicmllZiBTZXRzIHRoZSBmcmFtZXdvcmsgbW9kdWxlIG5hbWUgdGhhdCB0aGUgbW9kdWxlLm1hcCBkZXNjcmliZXMuCisgKiBccmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyB0byBpbmRpY2F0ZSBhbiBlcnJvci4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWEVycm9yQ29kZQorY2xhbmdfTW9kdWxlTWFwRGVzY3JpcHRvcl9zZXRGcmFtZXdvcmtNb2R1bGVOYW1lKENYTW9kdWxlTWFwRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBcYnJpZWYgU2V0cyB0aGUgdW1icmVhbGxhIGhlYWRlciBuYW1lIHRoYXQgdGhlIG1vZHVsZS5tYXAgZGVzY3JpYmVzLgorICogXHJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gdG8gaW5kaWNhdGUgYW4gZXJyb3IuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGVudW0gQ1hFcnJvckNvZGUKK2NsYW5nX01vZHVsZU1hcERlc2NyaXB0b3Jfc2V0VW1icmVsbGFIZWFkZXIoQ1hNb2R1bGVNYXBEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBcYnJpZWYgV3JpdGUgb3V0IHRoZSBcYyBDWE1vZHVsZU1hcERlc2NyaXB0b3Igb2JqZWN0IHRvIGEgY2hhciBidWZmZXIuCisgKgorICogXHBhcmFtIG9wdGlvbnMgaXMgcmVzZXJ2ZWQsIGFsd2F5cyBwYXNzIDAuCisgKiBccGFyYW0gb3V0X2J1ZmZlcl9wdHIgcG9pbnRlciB0byByZWNlaXZlIHRoZSBidWZmZXIgcG9pbnRlciwgd2hpY2ggc2hvdWxkIGJlCisgKiBkaXNwb3NlZCB1c2luZyBcYyBjbGFuZ19mcmVlKCkuCisgKiBccGFyYW0gb3V0X2J1ZmZlcl9zaXplIHBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgYnVmZmVyIHNpemUuCisgKiBccmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyB0byBpbmRpY2F0ZSBhbiBlcnJvci4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWEVycm9yQ29kZQorY2xhbmdfTW9kdWxlTWFwRGVzY3JpcHRvcl93cml0ZVRvQnVmZmVyKENYTW9kdWxlTWFwRGVzY3JpcHRvciwgdW5zaWduZWQgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipvdXRfYnVmZmVyX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpvdXRfYnVmZmVyX3NpemUpOworCisvKioKKyAqIFxicmllZiBEaXNwb3NlIGEgXGMgQ1hNb2R1bGVNYXBEZXNjcmlwdG9yIG9iamVjdC4KKyAqLworQ0lOREVYX0xJTktBR0Ugdm9pZCBjbGFuZ19Nb2R1bGVNYXBEZXNjcmlwdG9yX2Rpc3Bvc2UoQ1hNb2R1bGVNYXBEZXNjcmlwdG9yKTsKKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBDTEFOR19DX0JVSUxEX1NZU1RFTV9IICovCisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nLWMvQ1hDb21waWxhdGlvbkRhdGFiYXNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy1jL0NYQ29tcGlsYXRpb25EYXRhYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5Zjg5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy1jL0NYQ29tcGlsYXRpb25EYXRhYmFzZS5oCkBAIC0wLDAgKzEsMTc2IEBACisvKj09PS0tIGNsYW5nLWMvQ1hDb21waWxhdGlvbkRhdGFiYXNlLmggLSBDb21waWxhdGlvbiBkYXRhYmFzZSAgLS0tKi0gQyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGhlYWRlciBwcm92aWRlcyBhIHB1YmxpYyBpbnRlcmZhY2UgdG8gdXNlIENvbXBpbGF0aW9uRGF0YWJhc2Ugd2l0aG91dCAqfAorfCogdGhlIGZ1bGwgQ2xhbmcgQysrIEFQSS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQ19DWENPTVBJTEFUSU9OREFUQUJBU0VfSAorI2RlZmluZSBMTFZNX0NMQU5HX0NfQ1hDT01QSUxBVElPTkRBVEFCQVNFX0gKKworI2luY2x1ZGUgImNsYW5nLWMvUGxhdGZvcm0uaCIKKyNpbmNsdWRlICJjbGFuZy1jL0NYU3RyaW5nLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIFxkZWZncm91cCBDT01QSUxBVElPTkRCIENvbXBpbGF0aW9uRGF0YWJhc2UgZnVuY3Rpb25zCisgKiBcaW5ncm91cCBDSU5ERVgKKyAqCisgKiBAeworICovCisKKy8qKgorICogQSBjb21waWxhdGlvbiBkYXRhYmFzZSBob2xkcyBhbGwgaW5mb3JtYXRpb24gdXNlZCB0byBjb21waWxlIGZpbGVzIGluIGEKKyAqIHByb2plY3QuIEZvciBlYWNoIGZpbGUgaW4gdGhlIGRhdGFiYXNlLCBpdCBjYW4gYmUgcXVlcmllZCBmb3IgdGhlIHdvcmtpbmcKKyAqIGRpcmVjdG9yeSBvciB0aGUgY29tbWFuZCBsaW5lIHVzZWQgZm9yIHRoZSBjb21waWxlciBpbnZvY2F0aW9uLgorICoKKyAqIE11c3QgYmUgZnJlZWQgYnkgXGMgY2xhbmdfQ29tcGlsYXRpb25EYXRhYmFzZV9kaXNwb3NlCisgKi8KK3R5cGVkZWYgdm9pZCAqIENYQ29tcGlsYXRpb25EYXRhYmFzZTsKKworLyoqCisgKiBcYnJpZWYgQ29udGFpbnMgdGhlIHJlc3VsdHMgb2YgYSBzZWFyY2ggaW4gdGhlIGNvbXBpbGF0aW9uIGRhdGFiYXNlCisgKgorICogV2hlbiBzZWFyY2hpbmcgZm9yIHRoZSBjb21waWxlIGNvbW1hbmQgZm9yIGEgZmlsZSwgdGhlIGNvbXBpbGF0aW9uIGRiIGNhbgorICogcmV0dXJuIHNldmVyYWwgY29tbWFuZHMsIGFzIHRoZSBmaWxlIG1heSBoYXZlIGJlZW4gY29tcGlsZWQgd2l0aAorICogZGlmZmVyZW50IG9wdGlvbnMgaW4gZGlmZmVyZW50IHBsYWNlcyBvZiB0aGUgcHJvamVjdC4gVGhpcyBjaG9pY2Ugb2YgY29tcGlsZQorICogY29tbWFuZHMgaXMgd3JhcHBlZCBpbiB0aGlzIG9wYXF1ZSBkYXRhIHN0cnVjdHVyZS4gSXQgbXVzdCBiZSBmcmVlZCBieQorICogXGMgY2xhbmdfQ29tcGlsZUNvbW1hbmRzX2Rpc3Bvc2UuCisgKi8KK3R5cGVkZWYgdm9pZCAqIENYQ29tcGlsZUNvbW1hbmRzOworCisvKioKKyAqIFxicmllZiBSZXByZXNlbnRzIHRoZSBjb21tYW5kIGxpbmUgaW52b2NhdGlvbiB0byBjb21waWxlIGEgc3BlY2lmaWMgZmlsZS4KKyAqLwordHlwZWRlZiB2b2lkICogQ1hDb21waWxlQ29tbWFuZDsKKworLyoqCisgKiBcYnJpZWYgRXJyb3IgY29kZXMgZm9yIENvbXBpbGF0aW9uIERhdGFiYXNlCisgKi8KK3R5cGVkZWYgZW51bSAgeworICAvKgorICAgKiBcYnJpZWYgTm8gZXJyb3Igb2NjdXJyZWQKKyAgICovCisgIENYQ29tcGlsYXRpb25EYXRhYmFzZV9Ob0Vycm9yID0gMCwKKworICAvKgorICAgKiBcYnJpZWYgRGF0YWJhc2UgY2FuIG5vdCBiZSBsb2FkZWQKKyAgICovCisgIENYQ29tcGlsYXRpb25EYXRhYmFzZV9DYW5Ob3RMb2FkRGF0YWJhc2UgPSAxCisKK30gQ1hDb21waWxhdGlvbkRhdGFiYXNlX0Vycm9yOworCisvKioKKyAqIFxicmllZiBDcmVhdGVzIGEgY29tcGlsYXRpb24gZGF0YWJhc2UgZnJvbSB0aGUgZGF0YWJhc2UgZm91bmQgaW4gZGlyZWN0b3J5CisgKiBidWlsZERpci4gRm9yIGV4YW1wbGUsIENNYWtlIGNhbiBvdXRwdXQgYSBjb21waWxlX2NvbW1hbmRzLmpzb24gd2hpY2ggY2FuCisgKiBiZSB1c2VkIHRvIGJ1aWxkIHRoZSBkYXRhYmFzZS4KKyAqCisgKiBJdCBtdXN0IGJlIGZyZWVkIGJ5IFxjIGNsYW5nX0NvbXBpbGF0aW9uRGF0YWJhc2VfZGlzcG9zZS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hDb21waWxhdGlvbkRhdGFiYXNlCitjbGFuZ19Db21waWxhdGlvbkRhdGFiYXNlX2Zyb21EaXJlY3RvcnkoY29uc3QgY2hhciAqQnVpbGREaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hDb21waWxhdGlvbkRhdGFiYXNlX0Vycm9yICpFcnJvckNvZGUpOworCisvKioKKyAqIFxicmllZiBGcmVlIHRoZSBnaXZlbiBjb21waWxhdGlvbiBkYXRhYmFzZQorICovCitDSU5ERVhfTElOS0FHRSB2b2lkCitjbGFuZ19Db21waWxhdGlvbkRhdGFiYXNlX2Rpc3Bvc2UoQ1hDb21waWxhdGlvbkRhdGFiYXNlKTsKKworLyoqCisgKiBcYnJpZWYgRmluZCB0aGUgY29tcGlsZSBjb21tYW5kcyB1c2VkIGZvciBhIGZpbGUuIFRoZSBjb21waWxlIGNvbW1hbmRzCisgKiBtdXN0IGJlIGZyZWVkIGJ5IFxjIGNsYW5nX0NvbXBpbGVDb21tYW5kc19kaXNwb3NlLgorICovCitDSU5ERVhfTElOS0FHRSBDWENvbXBpbGVDb21tYW5kcworY2xhbmdfQ29tcGlsYXRpb25EYXRhYmFzZV9nZXRDb21waWxlQ29tbWFuZHMoQ1hDb21waWxhdGlvbkRhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqQ29tcGxldGVGaWxlTmFtZSk7CisKKy8qKgorICogXGJyaWVmIEdldCBhbGwgdGhlIGNvbXBpbGUgY29tbWFuZHMgaW4gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIGRhdGFiYXNlLgorICovCitDSU5ERVhfTElOS0FHRSBDWENvbXBpbGVDb21tYW5kcworY2xhbmdfQ29tcGlsYXRpb25EYXRhYmFzZV9nZXRBbGxDb21waWxlQ29tbWFuZHMoQ1hDb21waWxhdGlvbkRhdGFiYXNlKTsKKworLyoqCisgKiBcYnJpZWYgRnJlZSB0aGUgZ2l2ZW4gQ29tcGlsZUNvbW1hbmRzCisgKi8KK0NJTkRFWF9MSU5LQUdFIHZvaWQgY2xhbmdfQ29tcGlsZUNvbW1hbmRzX2Rpc3Bvc2UoQ1hDb21waWxlQ29tbWFuZHMpOworCisvKioKKyAqIFxicmllZiBHZXQgdGhlIG51bWJlciBvZiBDb21waWxlQ29tbWFuZCB3ZSBoYXZlIGZvciBhIGZpbGUKKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQKK2NsYW5nX0NvbXBpbGVDb21tYW5kc19nZXRTaXplKENYQ29tcGlsZUNvbW1hbmRzKTsKKworLyoqCisgKiBcYnJpZWYgR2V0IHRoZSBJJ3RoIENvbXBpbGVDb21tYW5kIGZvciBhIGZpbGUKKyAqCisgKiBOb3RlIDogMCA8PSBpIDwgY2xhbmdfQ29tcGlsZUNvbW1hbmRzX2dldFNpemUoQ1hDb21waWxlQ29tbWFuZHMpCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYQ29tcGlsZUNvbW1hbmQKK2NsYW5nX0NvbXBpbGVDb21tYW5kc19nZXRDb21tYW5kKENYQ29tcGlsZUNvbW1hbmRzLCB1bnNpZ25lZCBJKTsKKworLyoqCisgKiBcYnJpZWYgR2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVyZSB0aGUgQ29tcGlsZUNvbW1hbmQgd2FzIGV4ZWN1dGVkIGZyb20KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcKK2NsYW5nX0NvbXBpbGVDb21tYW5kX2dldERpcmVjdG9yeShDWENvbXBpbGVDb21tYW5kKTsKKworLyoqCisgKiBcYnJpZWYgR2V0IHRoZSBmaWxlbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIENvbXBpbGVDb21tYW5kLgorICovCitDSU5ERVhfTElOS0FHRSBDWFN0cmluZworY2xhbmdfQ29tcGlsZUNvbW1hbmRfZ2V0RmlsZW5hbWUoQ1hDb21waWxlQ29tbWFuZCk7CisKKy8qKgorICogXGJyaWVmIEdldCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiB0aGUgY29tcGlsZXIgaW52b2NhdGlvbi4KKyAqCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkCitjbGFuZ19Db21waWxlQ29tbWFuZF9nZXROdW1BcmdzKENYQ29tcGlsZUNvbW1hbmQpOworCisvKioKKyAqIFxicmllZiBHZXQgdGhlIEkndGggYXJndW1lbnQgdmFsdWUgaW4gdGhlIGNvbXBpbGVyIGludm9jYXRpb25zCisgKgorICogSW52YXJpYW50IDoKKyAqICAtIGFyZ3VtZW50IDAgaXMgdGhlIGNvbXBpbGVyIGV4ZWN1dGFibGUKKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcKK2NsYW5nX0NvbXBpbGVDb21tYW5kX2dldEFyZyhDWENvbXBpbGVDb21tYW5kLCB1bnNpZ25lZCBJKTsKKworLyoqCisgKiBcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2Ygc291cmNlIG1hcHBpbmdzIGZvciB0aGUgY29tcGlsZXIgaW52b2NhdGlvbi4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQKK2NsYW5nX0NvbXBpbGVDb21tYW5kX2dldE51bU1hcHBlZFNvdXJjZXMoQ1hDb21waWxlQ29tbWFuZCk7CisKKy8qKgorICogXGJyaWVmIEdldCB0aGUgSSd0aCBtYXBwZWQgc291cmNlIHBhdGggZm9yIHRoZSBjb21waWxlciBpbnZvY2F0aW9uLgorICovCitDSU5ERVhfTElOS0FHRSBDWFN0cmluZworY2xhbmdfQ29tcGlsZUNvbW1hbmRfZ2V0TWFwcGVkU291cmNlUGF0aChDWENvbXBpbGVDb21tYW5kLCB1bnNpZ25lZCBJKTsKKworLyoqCisgKiBcYnJpZWYgR2V0IHRoZSBJJ3RoIG1hcHBlZCBzb3VyY2UgY29udGVudCBmb3IgdGhlIGNvbXBpbGVyIGludm9jYXRpb24uCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU3RyaW5nCitjbGFuZ19Db21waWxlQ29tbWFuZF9nZXRNYXBwZWRTb3VyY2VDb250ZW50KENYQ29tcGlsZUNvbW1hbmQsIHVuc2lnbmVkIEkpOworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy1jL0NYRXJyb3JDb2RlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy1jL0NYRXJyb3JDb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZmNzNiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nLWMvQ1hFcnJvckNvZGUuaApAQCAtMCwwICsxLDY0IEBACisvKj09PS0tIGNsYW5nLWMvQ1hFcnJvckNvZGUuaCAtIEMgSW5kZXggRXJyb3IgQ29kZXMgIC0tLS0tLS0tLS0tLS0tKi0gQyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGhlYWRlciBwcm92aWRlcyB0aGUgQ1hFcnJvckNvZGUgZW51bWVyYXRvcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9DTEFOR19DX0NYRVJST1JDT0RFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19DX0NYRVJST1JDT0RFX0gKKworI2luY2x1ZGUgImNsYW5nLWMvUGxhdGZvcm0uaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIFxicmllZiBFcnJvciBjb2RlcyByZXR1cm5lZCBieSBsaWJjbGFuZyByb3V0aW5lcy4KKyAqCisgKiBaZXJvIChcYyBDWEVycm9yX1N1Y2Nlc3MpIGlzIHRoZSBvbmx5IGVycm9yIGNvZGUgaW5kaWNhdGluZyBzdWNjZXNzLiAgT3RoZXIKKyAqIGVycm9yIGNvZGVzLCBpbmNsdWRpbmcgbm90IHlldCBhc3NpZ25lZCBub24temVybyB2YWx1ZXMsIGluZGljYXRlIGVycm9ycy4KKyAqLworZW51bSBDWEVycm9yQ29kZSB7CisgIC8qKgorICAgKiBcYnJpZWYgTm8gZXJyb3IuCisgICAqLworICBDWEVycm9yX1N1Y2Nlc3MgPSAwLAorCisgIC8qKgorICAgKiBcYnJpZWYgQSBnZW5lcmljIGVycm9yIGNvZGUsIG5vIGZ1cnRoZXIgZGV0YWlscyBhcmUgYXZhaWxhYmxlLgorICAgKgorICAgKiBFcnJvcnMgb2YgdGhpcyBraW5kIGNhbiBnZXQgdGhlaXIgb3duIHNwZWNpZmljIGVycm9yIGNvZGVzIGluIGZ1dHVyZQorICAgKiBsaWJjbGFuZyB2ZXJzaW9ucy4KKyAgICovCisgIENYRXJyb3JfRmFpbHVyZSA9IDEsCisKKyAgLyoqCisgICAqIFxicmllZiBsaWJjbGFuZyBjcmFzaGVkIHdoaWxlIHBlcmZvcm1pbmcgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uCisgICAqLworICBDWEVycm9yX0NyYXNoZWQgPSAyLAorCisgIC8qKgorICAgKiBcYnJpZWYgVGhlIGZ1bmN0aW9uIGRldGVjdGVkIHRoYXQgdGhlIGFyZ3VtZW50cyB2aW9sYXRlIHRoZSBmdW5jdGlvbgorICAgKiBjb250cmFjdC4KKyAgICovCisgIENYRXJyb3JfSW52YWxpZEFyZ3VtZW50cyA9IDMsCisKKyAgLyoqCisgICAqIFxicmllZiBBbiBBU1QgZGVzZXJpYWxpemF0aW9uIGVycm9yIGhhcyBvY2N1cnJlZC4KKyAgICovCisgIENYRXJyb3JfQVNUUmVhZEVycm9yID0gNAorfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy1jL0NYU3RyaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy1jL0NYU3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhhYjdiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nLWMvQ1hTdHJpbmcuaApAQCAtMCwwICsxLDcxIEBACisvKj09PS0tIGNsYW5nLWMvQ1hTdHJpbmcuaCAtIEMgSW5kZXggc3RyaW5ncyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqfAorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgaGVhZGVyIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgdG8gQyBJbmRleCBzdHJpbmdzLiAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0NfQ1hTVFJJTkdfSAorI2RlZmluZSBMTFZNX0NMQU5HX0NfQ1hTVFJJTkdfSAorCisjaW5jbHVkZSAiY2xhbmctYy9QbGF0Zm9ybS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogXGRlZmdyb3VwIENJTkRFWF9TVFJJTkcgU3RyaW5nIG1hbmlwdWxhdGlvbiByb3V0aW5lcworICogXGluZ3JvdXAgQ0lOREVYCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFxicmllZiBBIGNoYXJhY3RlciBzdHJpbmcuCisgKgorICogVGhlIFxjIENYU3RyaW5nIHR5cGUgaXMgdXNlZCB0byByZXR1cm4gc3RyaW5ncyBmcm9tIHRoZSBpbnRlcmZhY2Ugd2hlbgorICogdGhlIG93bmVyc2hpcCBvZiB0aGF0IHN0cmluZyBtaWdodCBkaWZmZXIgZnJvbSBvbmUgY2FsbCB0byB0aGUgbmV4dC4KKyAqIFVzZSBcYyBjbGFuZ19nZXRDU3RyaW5nKCkgdG8gcmV0cmlldmUgdGhlIHN0cmluZyBkYXRhIGFuZCwgb25jZSBmaW5pc2hlZAorICogd2l0aCB0aGUgc3RyaW5nIGRhdGEsIGNhbGwgXGMgY2xhbmdfZGlzcG9zZVN0cmluZygpIHRvIGZyZWUgdGhlIHN0cmluZy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCB2b2lkICpkYXRhOworICB1bnNpZ25lZCBwcml2YXRlX2ZsYWdzOworfSBDWFN0cmluZzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBDWFN0cmluZyAqU3RyaW5nczsKKyAgdW5zaWduZWQgQ291bnQ7Cit9IENYU3RyaW5nU2V0OworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgY2hhcmFjdGVyIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBzdHJpbmcuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGNvbnN0IGNoYXIgKmNsYW5nX2dldENTdHJpbmcoQ1hTdHJpbmcgc3RyaW5nKTsKKworLyoqCisgKiBcYnJpZWYgRnJlZSB0aGUgZ2l2ZW4gc3RyaW5nLgorICovCitDSU5ERVhfTElOS0FHRSB2b2lkIGNsYW5nX2Rpc3Bvc2VTdHJpbmcoQ1hTdHJpbmcgc3RyaW5nKTsKKworLyoqCisgKiBcYnJpZWYgRnJlZSB0aGUgZ2l2ZW4gc3RyaW5nIHNldC4KKyAqLworQ0lOREVYX0xJTktBR0Ugdm9pZCBjbGFuZ19kaXNwb3NlU3RyaW5nU2V0KENYU3RyaW5nU2V0ICpzZXQpOworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy1jL0RvY3VtZW50YXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nLWMvRG9jdW1lbnRhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MzczYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy1jL0RvY3VtZW50YXRpb24uaApAQCAtMCwwICsxLDU1NCBAQAorLyo9PS0tIGNsYW5nLWMvRG9jdW1lbnRhdGlvbi5oIC0gVXRpbGl0aWVzIGZvciBjb21tZW50IHByb2Nlc3NpbmcgLSotIEMgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICp8Cit8KiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBoZWFkZXIgcHJvdmlkZXMgYSBzdXBwbGVtZW50YXJ5IGludGVyZmFjZSBmb3IgaW5zcGVjdGluZyAgICAgICAgICAgICAgKnwKK3wqIGRvY3VtZW50YXRpb24gY29tbWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0NfRE9DVU1FTlRBVElPTl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQ19ET0NVTUVOVEFUSU9OX0gKKworI2luY2x1ZGUgImNsYW5nLWMvSW5kZXguaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIFxkZWZncm91cCBDSU5ERVhfQ09NTUVOVCBDb21tZW50IGludHJvc3BlY3Rpb24KKyAqCisgKiBUaGUgcm91dGluZXMgaW4gdGhpcyBncm91cCBwcm92aWRlIGFjY2VzcyB0byBpbmZvcm1hdGlvbiBpbiBkb2N1bWVudGF0aW9uCisgKiBjb21tZW50cy4gVGhlc2UgZmFjaWxpdGllcyBhcmUgZGlzdGluY3QgZnJvbSB0aGUgY29yZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8KKyAqIHRoZWlyIG93biBzY2hlZHVsZSBvZiBzdGFiaWxpdHkgYW5kIGRlcHJlY2F0aW9uLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBcYnJpZWYgQSBwYXJzZWQgY29tbWVudC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCB2b2lkICpBU1ROb2RlOworICBDWFRyYW5zbGF0aW9uVW5pdCBUcmFuc2xhdGlvblVuaXQ7Cit9IENYQ29tbWVudDsKKworLyoqCisgKiBcYnJpZWYgR2l2ZW4gYSBjdXJzb3IgdGhhdCByZXByZXNlbnRzIGEgZG9jdW1lbnRhYmxlIGVudGl0eSAoZS5nLiwKKyAqIGRlY2xhcmF0aW9uKSwgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIHBhcnNlZCBjb21tZW50IGFzIGEKKyAqIFxjIENYQ29tbWVudF9GdWxsQ29tbWVudCBBU1Qgbm9kZS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hDb21tZW50IGNsYW5nX0N1cnNvcl9nZXRQYXJzZWRDb21tZW50KENYQ3Vyc29yIEMpOworCisvKioKKyAqIFxicmllZiBEZXNjcmliZXMgdGhlIHR5cGUgb2YgdGhlIGNvbW1lbnQgQVNUIG5vZGUgKFxjIENYQ29tbWVudCkuICBBIGNvbW1lbnQKKyAqIG5vZGUgY2FuIGJlIGNvbnNpZGVyZWQgYmxvY2sgY29udGVudCAoZS4gZy4sIHBhcmFncmFwaCksIGlubGluZSBjb250ZW50CisgKiAocGxhaW4gdGV4dCkgb3IgbmVpdGhlciAodGhlIHJvb3QgQVNUIG5vZGUpLgorICovCitlbnVtIENYQ29tbWVudEtpbmQgeworICAvKioKKyAgICogXGJyaWVmIE51bGwgY29tbWVudC4gIE5vIEFTVCBub2RlIGlzIGNvbnN0cnVjdGVkIGF0IHRoZSByZXF1ZXN0ZWQgbG9jYXRpb24KKyAgICogYmVjYXVzZSB0aGVyZSBpcyBubyB0ZXh0IG9yIGEgc3ludGF4IGVycm9yLgorICAgKi8KKyAgQ1hDb21tZW50X051bGwgPSAwLAorCisgIC8qKgorICAgKiBcYnJpZWYgUGxhaW4gdGV4dC4gIElubGluZSBjb250ZW50LgorICAgKi8KKyAgQ1hDb21tZW50X1RleHQgPSAxLAorCisgIC8qKgorICAgKiBcYnJpZWYgQSBjb21tYW5kIHdpdGggd29yZC1saWtlIGFyZ3VtZW50cyB0aGF0IGlzIGNvbnNpZGVyZWQgaW5saW5lIGNvbnRlbnQuCisgICAqCisgICAqIEZvciBleGFtcGxlOiBcXGMgY29tbWFuZC4KKyAgICovCisgIENYQ29tbWVudF9JbmxpbmVDb21tYW5kID0gMiwKKworICAvKioKKyAgICogXGJyaWVmIEhUTUwgc3RhcnQgdGFnIHdpdGggYXR0cmlidXRlcyAobmFtZS12YWx1ZSBwYWlycykuICBDb25zaWRlcmVkCisgICAqIGlubGluZSBjb250ZW50LgorICAgKgorICAgKiBGb3IgZXhhbXBsZToKKyAgICogXHZlcmJhdGltCisgICAqIDxicj4gPGJyIC8+IDxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLm9yZy8iPgorICAgKiBcZW5kdmVyYmF0aW0KKyAgICovCisgIENYQ29tbWVudF9IVE1MU3RhcnRUYWcgPSAzLAorCisgIC8qKgorICAgKiBcYnJpZWYgSFRNTCBlbmQgdGFnLiAgQ29uc2lkZXJlZCBpbmxpbmUgY29udGVudC4KKyAgICoKKyAgICogRm9yIGV4YW1wbGU6CisgICAqIFx2ZXJiYXRpbQorICAgKiA8L2E+CisgICAqIFxlbmR2ZXJiYXRpbQorICAgKi8KKyAgQ1hDb21tZW50X0hUTUxFbmRUYWcgPSA0LAorCisgIC8qKgorICAgKiBcYnJpZWYgQSBwYXJhZ3JhcGgsIGNvbnRhaW5zIGlubGluZSBjb21tZW50LiAgVGhlIHBhcmFncmFwaCBpdHNlbGYgaXMKKyAgICogYmxvY2sgY29udGVudC4KKyAgICovCisgIENYQ29tbWVudF9QYXJhZ3JhcGggPSA1LAorCisgIC8qKgorICAgKiBcYnJpZWYgQSBjb21tYW5kIHRoYXQgaGFzIHplcm8gb3IgbW9yZSB3b3JkLWxpa2UgYXJndW1lbnRzIChudW1iZXIgb2YKKyAgICogd29yZC1saWtlIGFyZ3VtZW50cyBkZXBlbmRzIG9uIGNvbW1hbmQgbmFtZSkgYW5kIGEgcGFyYWdyYXBoIGFzIGFuCisgICAqIGFyZ3VtZW50LiAgQmxvY2sgY29tbWFuZCBpcyBibG9jayBjb250ZW50LgorICAgKgorICAgKiBQYXJhZ3JhcGggYXJndW1lbnQgaXMgYWxzbyBhIGNoaWxkIG9mIHRoZSBibG9jayBjb21tYW5kLgorICAgKgorICAgKiBGb3IgZXhhbXBsZTogXFxicmllZiBoYXMgMCB3b3JkLWxpa2UgYXJndW1lbnRzIGFuZCBhIHBhcmFncmFwaCBhcmd1bWVudC4KKyAgICoKKyAgICogQVNUIG5vZGVzIG9mIHNwZWNpYWwga2luZHMgdGhhdCBwYXJzZXIga25vd3MgYWJvdXQgKGUuIGcuLCBcXHBhcmFtCisgICAqIGNvbW1hbmQpIGhhdmUgdGhlaXIgb3duIG5vZGUga2luZHMuCisgICAqLworICBDWENvbW1lbnRfQmxvY2tDb21tYW5kID0gNiwKKworICAvKioKKyAgICogXGJyaWVmIEEgXFxwYXJhbSBvciBcXGFyZyBjb21tYW5kIHRoYXQgZGVzY3JpYmVzIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIKKyAgICogKG5hbWUsIHBhc3NpbmcgZGlyZWN0aW9uLCBkZXNjcmlwdGlvbikuCisgICAqCisgICAqIEZvciBleGFtcGxlOiBcXHBhcmFtIFtpbl0gUGFyYW1OYW1lIGRlc2NyaXB0aW9uLgorICAgKi8KKyAgQ1hDb21tZW50X1BhcmFtQ29tbWFuZCA9IDcsCisKKyAgLyoqCisgICAqIFxicmllZiBBIFxcdHBhcmFtIGNvbW1hbmQgdGhhdCBkZXNjcmliZXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgKG5hbWUgYW5kCisgICAqIGRlc2NyaXB0aW9uKS4KKyAgICoKKyAgICogRm9yIGV4YW1wbGU6IFxcdHBhcmFtIFQgZGVzY3JpcHRpb24uCisgICAqLworICBDWENvbW1lbnRfVFBhcmFtQ29tbWFuZCA9IDgsCisKKyAgLyoqCisgICAqIFxicmllZiBBIHZlcmJhdGltIGJsb2NrIGNvbW1hbmQgKGUuIGcuLCBwcmVmb3JtYXR0ZWQgY29kZSkuICBWZXJiYXRpbQorICAgKiBibG9jayBoYXMgYW4gb3BlbmluZyBhbmQgYSBjbG9zaW5nIGNvbW1hbmQgYW5kIGNvbnRhaW5zIG11bHRpcGxlIGxpbmVzIG9mCisgICAqIHRleHQgKFxjIENYQ29tbWVudF9WZXJiYXRpbUJsb2NrTGluZSBjaGlsZCBub2RlcykuCisgICAqCisgICAqIEZvciBleGFtcGxlOgorICAgKiBcXHZlcmJhdGltCisgICAqIGFhYQorICAgKiBcXGVuZHZlcmJhdGltCisgICAqLworICBDWENvbW1lbnRfVmVyYmF0aW1CbG9ja0NvbW1hbmQgPSA5LAorCisgIC8qKgorICAgKiBcYnJpZWYgQSBsaW5lIG9mIHRleHQgdGhhdCBpcyBjb250YWluZWQgd2l0aGluIGEKKyAgICogQ1hDb21tZW50X1ZlcmJhdGltQmxvY2tDb21tYW5kIG5vZGUuCisgICAqLworICBDWENvbW1lbnRfVmVyYmF0aW1CbG9ja0xpbmUgPSAxMCwKKworICAvKioKKyAgICogXGJyaWVmIEEgdmVyYmF0aW0gbGluZSBjb21tYW5kLiAgVmVyYmF0aW0gbGluZSBoYXMgYW4gb3BlbmluZyBjb21tYW5kLAorICAgKiBhIHNpbmdsZSBsaW5lIG9mIHRleHQgKHVwIHRvIHRoZSBuZXdsaW5lIGFmdGVyIHRoZSBvcGVuaW5nIGNvbW1hbmQpIGFuZAorICAgKiBoYXMgbm8gY2xvc2luZyBjb21tYW5kLgorICAgKi8KKyAgQ1hDb21tZW50X1ZlcmJhdGltTGluZSA9IDExLAorCisgIC8qKgorICAgKiBcYnJpZWYgQSBmdWxsIGNvbW1lbnQgYXR0YWNoZWQgdG8gYSBkZWNsYXJhdGlvbiwgY29udGFpbnMgYmxvY2sgY29udGVudC4KKyAgICovCisgIENYQ29tbWVudF9GdWxsQ29tbWVudCA9IDEyCit9OworCisvKioKKyAqIFxicmllZiBUaGUgbW9zdCBhcHByb3ByaWF0ZSByZW5kZXJpbmcgbW9kZSBmb3IgYW4gaW5saW5lIGNvbW1hbmQsIGNob3NlbiBvbgorICogY29tbWFuZCBzZW1hbnRpY3MgaW4gRG94eWdlbi4KKyAqLworZW51bSBDWENvbW1lbnRJbmxpbmVDb21tYW5kUmVuZGVyS2luZCB7CisgIC8qKgorICAgKiBcYnJpZWYgQ29tbWFuZCBhcmd1bWVudCBzaG91bGQgYmUgcmVuZGVyZWQgaW4gYSBub3JtYWwgZm9udC4KKyAgICovCisgIENYQ29tbWVudElubGluZUNvbW1hbmRSZW5kZXJLaW5kX05vcm1hbCwKKworICAvKioKKyAgICogXGJyaWVmIENvbW1hbmQgYXJndW1lbnQgc2hvdWxkIGJlIHJlbmRlcmVkIGluIGEgYm9sZCBmb250LgorICAgKi8KKyAgQ1hDb21tZW50SW5saW5lQ29tbWFuZFJlbmRlcktpbmRfQm9sZCwKKworICAvKioKKyAgICogXGJyaWVmIENvbW1hbmQgYXJndW1lbnQgc2hvdWxkIGJlIHJlbmRlcmVkIGluIGEgbW9ub3NwYWNlZCBmb250LgorICAgKi8KKyAgQ1hDb21tZW50SW5saW5lQ29tbWFuZFJlbmRlcktpbmRfTW9ub3NwYWNlZCwKKworICAvKioKKyAgICogXGJyaWVmIENvbW1hbmQgYXJndW1lbnQgc2hvdWxkIGJlIHJlbmRlcmVkIGVtcGhhc2l6ZWQgKHR5cGljYWxseSBpdGFsaWMKKyAgICogZm9udCkuCisgICAqLworICBDWENvbW1lbnRJbmxpbmVDb21tYW5kUmVuZGVyS2luZF9FbXBoYXNpemVkCit9OworCisvKioKKyAqIFxicmllZiBEZXNjcmliZXMgcGFyYW1ldGVyIHBhc3NpbmcgZGlyZWN0aW9uIGZvciBcXHBhcmFtIG9yIFxcYXJnIGNvbW1hbmQuCisgKi8KK2VudW0gQ1hDb21tZW50UGFyYW1QYXNzRGlyZWN0aW9uIHsKKyAgLyoqCisgICAqIFxicmllZiBUaGUgcGFyYW1ldGVyIGlzIGFuIGlucHV0IHBhcmFtZXRlci4KKyAgICovCisgIENYQ29tbWVudFBhcmFtUGFzc0RpcmVjdGlvbl9JbiwKKworICAvKioKKyAgICogXGJyaWVmIFRoZSBwYXJhbWV0ZXIgaXMgYW4gb3V0cHV0IHBhcmFtZXRlci4KKyAgICovCisgIENYQ29tbWVudFBhcmFtUGFzc0RpcmVjdGlvbl9PdXQsCisKKyAgLyoqCisgICAqIFxicmllZiBUaGUgcGFyYW1ldGVyIGlzIGFuIGlucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyLgorICAgKi8KKyAgQ1hDb21tZW50UGFyYW1QYXNzRGlyZWN0aW9uX0luT3V0Cit9OworCisvKioKKyAqIFxwYXJhbSBDb21tZW50IEFTVCBub2RlIG9mIGFueSBraW5kLgorICoKKyAqIFxyZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBBU1Qgbm9kZS4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWENvbW1lbnRLaW5kIGNsYW5nX0NvbW1lbnRfZ2V0S2luZChDWENvbW1lbnQgQ29tbWVudCk7CisKKy8qKgorICogXHBhcmFtIENvbW1lbnQgQVNUIG5vZGUgb2YgYW55IGtpbmQuCisgKgorICogXHJldHVybnMgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoZSBBU1Qgbm9kZS4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfQ29tbWVudF9nZXROdW1DaGlsZHJlbihDWENvbW1lbnQgQ29tbWVudCk7CisKKy8qKgorICogXHBhcmFtIENvbW1lbnQgQVNUIG5vZGUgb2YgYW55IGtpbmQuCisgKgorICogXHBhcmFtIENoaWxkSWR4IGNoaWxkIGluZGV4ICh6ZXJvLWJhc2VkKS4KKyAqCisgKiBccmV0dXJucyB0aGUgc3BlY2lmaWVkIGNoaWxkIG9mIHRoZSBBU1Qgbm9kZS4KKyAqLworQ0lOREVYX0xJTktBR0UKK0NYQ29tbWVudCBjbGFuZ19Db21tZW50X2dldENoaWxkKENYQ29tbWVudCBDb21tZW50LCB1bnNpZ25lZCBDaGlsZElkeCk7CisKKy8qKgorICogXGJyaWVmIEEgXGMgQ1hDb21tZW50X1BhcmFncmFwaCBub2RlIGlzIGNvbnNpZGVyZWQgd2hpdGVzcGFjZSBpZiBpdCBjb250YWlucworICogb25seSBcYyBDWENvbW1lbnRfVGV4dCBub2RlcyB0aGF0IGFyZSBlbXB0eSBvciB3aGl0ZXNwYWNlLgorICoKKyAqIE90aGVyIEFTVCBub2RlcyAoZXhjZXB0IFxjIENYQ29tbWVudF9QYXJhZ3JhcGggYW5kIFxjIENYQ29tbWVudF9UZXh0KSBhcmUKKyAqIG5ldmVyIGNvbnNpZGVyZWQgd2hpdGVzcGFjZS4KKyAqCisgKiBccmV0dXJucyBub24temVybyBpZiBcYyBDb21tZW50IGlzIHdoaXRlc3BhY2UuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX0NvbW1lbnRfaXNXaGl0ZXNwYWNlKENYQ29tbWVudCBDb21tZW50KTsKKworLyoqCisgKiBccmV0dXJucyBub24temVybyBpZiBcYyBDb21tZW50IGlzIGlubGluZSBjb250ZW50IGFuZCBoYXMgYSBuZXdsaW5lCisgKiBpbW1lZGlhdGVseSBmb2xsb3dpbmcgaXQgaW4gdGhlIGNvbW1lbnQgdGV4dC4gIE5ld2xpbmVzIGJldHdlZW4gcGFyYWdyYXBocworICogZG8gbm90IGNvdW50LgorICovCitDSU5ERVhfTElOS0FHRQordW5zaWduZWQgY2xhbmdfSW5saW5lQ29udGVudENvbW1lbnRfaGFzVHJhaWxpbmdOZXdsaW5lKENYQ29tbWVudCBDb21tZW50KTsKKworLyoqCisgKiBccGFyYW0gQ29tbWVudCBhIFxjIENYQ29tbWVudF9UZXh0IEFTVCBub2RlLgorICoKKyAqIFxyZXR1cm5zIHRleHQgY29udGFpbmVkIGluIHRoZSBBU1Qgbm9kZS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfVGV4dENvbW1lbnRfZ2V0VGV4dChDWENvbW1lbnQgQ29tbWVudCk7CisKKy8qKgorICogXHBhcmFtIENvbW1lbnQgYSBcYyBDWENvbW1lbnRfSW5saW5lQ29tbWFuZCBBU1Qgbm9kZS4KKyAqCisgKiBccmV0dXJucyBuYW1lIG9mIHRoZSBpbmxpbmUgY29tbWFuZC4KKyAqLworQ0lOREVYX0xJTktBR0UKK0NYU3RyaW5nIGNsYW5nX0lubGluZUNvbW1hbmRDb21tZW50X2dldENvbW1hbmROYW1lKENYQ29tbWVudCBDb21tZW50KTsKKworLyoqCisgKiBccGFyYW0gQ29tbWVudCBhIFxjIENYQ29tbWVudF9JbmxpbmVDb21tYW5kIEFTVCBub2RlLgorICoKKyAqIFxyZXR1cm5zIHRoZSBtb3N0IGFwcHJvcHJpYXRlIHJlbmRlcmluZyBtb2RlLCBjaG9zZW4gb24gY29tbWFuZAorICogc2VtYW50aWNzIGluIERveHlnZW4uCisgKi8KK0NJTkRFWF9MSU5LQUdFIGVudW0gQ1hDb21tZW50SW5saW5lQ29tbWFuZFJlbmRlcktpbmQKK2NsYW5nX0lubGluZUNvbW1hbmRDb21tZW50X2dldFJlbmRlcktpbmQoQ1hDb21tZW50IENvbW1lbnQpOworCisvKioKKyAqIFxwYXJhbSBDb21tZW50IGEgXGMgQ1hDb21tZW50X0lubGluZUNvbW1hbmQgQVNUIG5vZGUuCisgKgorICogXHJldHVybnMgbnVtYmVyIG9mIGNvbW1hbmQgYXJndW1lbnRzLgorICovCitDSU5ERVhfTElOS0FHRQordW5zaWduZWQgY2xhbmdfSW5saW5lQ29tbWFuZENvbW1lbnRfZ2V0TnVtQXJncyhDWENvbW1lbnQgQ29tbWVudCk7CisKKy8qKgorICogXHBhcmFtIENvbW1lbnQgYSBcYyBDWENvbW1lbnRfSW5saW5lQ29tbWFuZCBBU1Qgbm9kZS4KKyAqCisgKiBccGFyYW0gQXJnSWR4IGFyZ3VtZW50IGluZGV4ICh6ZXJvLWJhc2VkKS4KKyAqCisgKiBccmV0dXJucyB0ZXh0IG9mIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQuCisgKi8KK0NJTkRFWF9MSU5LQUdFCitDWFN0cmluZyBjbGFuZ19JbmxpbmVDb21tYW5kQ29tbWVudF9nZXRBcmdUZXh0KENYQ29tbWVudCBDb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBcmdJZHgpOworCisvKioKKyAqIFxwYXJhbSBDb21tZW50IGEgXGMgQ1hDb21tZW50X0hUTUxTdGFydFRhZyBvciBcYyBDWENvbW1lbnRfSFRNTEVuZFRhZyBBU1QKKyAqIG5vZGUuCisgKgorICogXHJldHVybnMgSFRNTCB0YWcgbmFtZS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfSFRNTFRhZ0NvbW1lbnRfZ2V0VGFnTmFtZShDWENvbW1lbnQgQ29tbWVudCk7CisKKy8qKgorICogXHBhcmFtIENvbW1lbnQgYSBcYyBDWENvbW1lbnRfSFRNTFN0YXJ0VGFnIEFTVCBub2RlLgorICoKKyAqIFxyZXR1cm5zIG5vbi16ZXJvIGlmIHRhZyBpcyBzZWxmLWNsb3NpbmcgKGZvciBleGFtcGxlLCAmbHQ7YnIgLyZndDspLgorICovCitDSU5ERVhfTElOS0FHRQordW5zaWduZWQgY2xhbmdfSFRNTFN0YXJ0VGFnQ29tbWVudF9pc1NlbGZDbG9zaW5nKENYQ29tbWVudCBDb21tZW50KTsKKworLyoqCisgKiBccGFyYW0gQ29tbWVudCBhIFxjIENYQ29tbWVudF9IVE1MU3RhcnRUYWcgQVNUIG5vZGUuCisgKgorICogXHJldHVybnMgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgKG5hbWUtdmFsdWUgcGFpcnMpIGF0dGFjaGVkIHRvIHRoZSBzdGFydCB0YWcuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX0hUTUxTdGFydFRhZ19nZXROdW1BdHRycyhDWENvbW1lbnQgQ29tbWVudCk7CisKKy8qKgorICogXHBhcmFtIENvbW1lbnQgYSBcYyBDWENvbW1lbnRfSFRNTFN0YXJ0VGFnIEFTVCBub2RlLgorICoKKyAqIFxwYXJhbSBBdHRySWR4IGF0dHJpYnV0ZSBpbmRleCAoemVyby1iYXNlZCkuCisgKgorICogXHJldHVybnMgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZS4KKyAqLworQ0lOREVYX0xJTktBR0UKK0NYU3RyaW5nIGNsYW5nX0hUTUxTdGFydFRhZ19nZXRBdHRyTmFtZShDWENvbW1lbnQgQ29tbWVudCwgdW5zaWduZWQgQXR0cklkeCk7CisKKy8qKgorICogXHBhcmFtIENvbW1lbnQgYSBcYyBDWENvbW1lbnRfSFRNTFN0YXJ0VGFnIEFTVCBub2RlLgorICoKKyAqIFxwYXJhbSBBdHRySWR4IGF0dHJpYnV0ZSBpbmRleCAoemVyby1iYXNlZCkuCisgKgorICogXHJldHVybnMgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUuCisgKi8KK0NJTkRFWF9MSU5LQUdFCitDWFN0cmluZyBjbGFuZ19IVE1MU3RhcnRUYWdfZ2V0QXR0clZhbHVlKENYQ29tbWVudCBDb21tZW50LCB1bnNpZ25lZCBBdHRySWR4KTsKKworLyoqCisgKiBccGFyYW0gQ29tbWVudCBhIFxjIENYQ29tbWVudF9CbG9ja0NvbW1hbmQgQVNUIG5vZGUuCisgKgorICogXHJldHVybnMgbmFtZSBvZiB0aGUgYmxvY2sgY29tbWFuZC4KKyAqLworQ0lOREVYX0xJTktBR0UKK0NYU3RyaW5nIGNsYW5nX0Jsb2NrQ29tbWFuZENvbW1lbnRfZ2V0Q29tbWFuZE5hbWUoQ1hDb21tZW50IENvbW1lbnQpOworCisvKioKKyAqIFxwYXJhbSBDb21tZW50IGEgXGMgQ1hDb21tZW50X0Jsb2NrQ29tbWFuZCBBU1Qgbm9kZS4KKyAqCisgKiBccmV0dXJucyBudW1iZXIgb2Ygd29yZC1saWtlIGFyZ3VtZW50cy4KKyAqLworQ0lOREVYX0xJTktBR0UKK3Vuc2lnbmVkIGNsYW5nX0Jsb2NrQ29tbWFuZENvbW1lbnRfZ2V0TnVtQXJncyhDWENvbW1lbnQgQ29tbWVudCk7CisKKy8qKgorICogXHBhcmFtIENvbW1lbnQgYSBcYyBDWENvbW1lbnRfQmxvY2tDb21tYW5kIEFTVCBub2RlLgorICoKKyAqIFxwYXJhbSBBcmdJZHggYXJndW1lbnQgaW5kZXggKHplcm8tYmFzZWQpLgorICoKKyAqIFxyZXR1cm5zIHRleHQgb2YgdGhlIHNwZWNpZmllZCB3b3JkLWxpa2UgYXJndW1lbnQuCisgKi8KK0NJTkRFWF9MSU5LQUdFCitDWFN0cmluZyBjbGFuZ19CbG9ja0NvbW1hbmRDb21tZW50X2dldEFyZ1RleHQoQ1hDb21tZW50IENvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXJnSWR4KTsKKworLyoqCisgKiBccGFyYW0gQ29tbWVudCBhIFxjIENYQ29tbWVudF9CbG9ja0NvbW1hbmQgb3IKKyAqIFxjIENYQ29tbWVudF9WZXJiYXRpbUJsb2NrQ29tbWFuZCBBU1Qgbm9kZS4KKyAqCisgKiBccmV0dXJucyBwYXJhZ3JhcGggYXJndW1lbnQgb2YgdGhlIGJsb2NrIGNvbW1hbmQuCisgKi8KK0NJTkRFWF9MSU5LQUdFCitDWENvbW1lbnQgY2xhbmdfQmxvY2tDb21tYW5kQ29tbWVudF9nZXRQYXJhZ3JhcGgoQ1hDb21tZW50IENvbW1lbnQpOworCisvKioKKyAqIFxwYXJhbSBDb21tZW50IGEgXGMgQ1hDb21tZW50X1BhcmFtQ29tbWFuZCBBU1Qgbm9kZS4KKyAqCisgKiBccmV0dXJucyBwYXJhbWV0ZXIgbmFtZS4KKyAqLworQ0lOREVYX0xJTktBR0UKK0NYU3RyaW5nIGNsYW5nX1BhcmFtQ29tbWFuZENvbW1lbnRfZ2V0UGFyYW1OYW1lKENYQ29tbWVudCBDb21tZW50KTsKKworLyoqCisgKiBccGFyYW0gQ29tbWVudCBhIFxjIENYQ29tbWVudF9QYXJhbUNvbW1hbmQgQVNUIG5vZGUuCisgKgorICogXHJldHVybnMgbm9uLXplcm8gaWYgdGhlIHBhcmFtZXRlciB0aGF0IHRoaXMgQVNUIG5vZGUgcmVwcmVzZW50cyB3YXMgZm91bmQKKyAqIGluIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUgYW5kIFxjIGNsYW5nX1BhcmFtQ29tbWFuZENvbW1lbnRfZ2V0UGFyYW1JbmRleAorICogZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlLgorICovCitDSU5ERVhfTElOS0FHRQordW5zaWduZWQgY2xhbmdfUGFyYW1Db21tYW5kQ29tbWVudF9pc1BhcmFtSW5kZXhWYWxpZChDWENvbW1lbnQgQ29tbWVudCk7CisKKy8qKgorICogXHBhcmFtIENvbW1lbnQgYSBcYyBDWENvbW1lbnRfUGFyYW1Db21tYW5kIEFTVCBub2RlLgorICoKKyAqIFxyZXR1cm5zIHplcm8tYmFzZWQgcGFyYW1ldGVyIGluZGV4IGluIGZ1bmN0aW9uIHByb3RvdHlwZS4KKyAqLworQ0lOREVYX0xJTktBR0UKK3Vuc2lnbmVkIGNsYW5nX1BhcmFtQ29tbWFuZENvbW1lbnRfZ2V0UGFyYW1JbmRleChDWENvbW1lbnQgQ29tbWVudCk7CisKKy8qKgorICogXHBhcmFtIENvbW1lbnQgYSBcYyBDWENvbW1lbnRfUGFyYW1Db21tYW5kIEFTVCBub2RlLgorICoKKyAqIFxyZXR1cm5zIG5vbi16ZXJvIGlmIHBhcmFtZXRlciBwYXNzaW5nIGRpcmVjdGlvbiB3YXMgc3BlY2lmaWVkIGV4cGxpY2l0bHkgaW4KKyAqIHRoZSBjb21tZW50LgorICovCitDSU5ERVhfTElOS0FHRQordW5zaWduZWQgY2xhbmdfUGFyYW1Db21tYW5kQ29tbWVudF9pc0RpcmVjdGlvbkV4cGxpY2l0KENYQ29tbWVudCBDb21tZW50KTsKKworLyoqCisgKiBccGFyYW0gQ29tbWVudCBhIFxjIENYQ29tbWVudF9QYXJhbUNvbW1hbmQgQVNUIG5vZGUuCisgKgorICogXHJldHVybnMgcGFyYW1ldGVyIHBhc3NpbmcgZGlyZWN0aW9uLgorICovCitDSU5ERVhfTElOS0FHRQorZW51bSBDWENvbW1lbnRQYXJhbVBhc3NEaXJlY3Rpb24gY2xhbmdfUGFyYW1Db21tYW5kQ29tbWVudF9nZXREaXJlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWENvbW1lbnQgQ29tbWVudCk7CisKKy8qKgorICogXHBhcmFtIENvbW1lbnQgYSBcYyBDWENvbW1lbnRfVFBhcmFtQ29tbWFuZCBBU1Qgbm9kZS4KKyAqCisgKiBccmV0dXJucyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbmFtZS4KKyAqLworQ0lOREVYX0xJTktBR0UKK0NYU3RyaW5nIGNsYW5nX1RQYXJhbUNvbW1hbmRDb21tZW50X2dldFBhcmFtTmFtZShDWENvbW1lbnQgQ29tbWVudCk7CisKKy8qKgorICogXHBhcmFtIENvbW1lbnQgYSBcYyBDWENvbW1lbnRfVFBhcmFtQ29tbWFuZCBBU1Qgbm9kZS4KKyAqCisgKiBccmV0dXJucyBub24temVybyBpZiB0aGUgcGFyYW1ldGVyIHRoYXQgdGhpcyBBU1Qgbm9kZSByZXByZXNlbnRzIHdhcyBmb3VuZAorICogaW4gdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0IGFuZAorICogXGMgY2xhbmdfVFBhcmFtQ29tbWFuZENvbW1lbnRfZ2V0RGVwdGggYW5kCisgKiBcYyBjbGFuZ19UUGFyYW1Db21tYW5kQ29tbWVudF9nZXRJbmRleCBmdW5jdGlvbnMgd2lsbCByZXR1cm4gYSBtZWFuaW5nZnVsCisgKiB2YWx1ZS4KKyAqLworQ0lOREVYX0xJTktBR0UKK3Vuc2lnbmVkIGNsYW5nX1RQYXJhbUNvbW1hbmRDb21tZW50X2lzUGFyYW1Qb3NpdGlvblZhbGlkKENYQ29tbWVudCBDb21tZW50KTsKKworLyoqCisgKiBccGFyYW0gQ29tbWVudCBhIFxjIENYQ29tbWVudF9UUGFyYW1Db21tYW5kIEFTVCBub2RlLgorICoKKyAqIFxyZXR1cm5zIHplcm8tYmFzZWQgbmVzdGluZyBkZXB0aCBvZiB0aGlzIHBhcmFtZXRlciBpbiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3QuCisgKgorICogRm9yIGV4YW1wbGUsCisgKiBcdmVyYmF0aW0KKyAqICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUVD4KKyAqICAgICB2b2lkIHRlc3QoVFQ8aW50PiBhYWEpOworICogXGVuZHZlcmJhdGltCisgKiBmb3IgQyBhbmQgVFQgbmVzdGluZyBkZXB0aCBpcyAwLAorICogZm9yIFQgbmVzdGluZyBkZXB0aCBpcyAxLgorICovCitDSU5ERVhfTElOS0FHRQordW5zaWduZWQgY2xhbmdfVFBhcmFtQ29tbWFuZENvbW1lbnRfZ2V0RGVwdGgoQ1hDb21tZW50IENvbW1lbnQpOworCisvKioKKyAqIFxwYXJhbSBDb21tZW50IGEgXGMgQ1hDb21tZW50X1RQYXJhbUNvbW1hbmQgQVNUIG5vZGUuCisgKgorICogXHJldHVybnMgemVyby1iYXNlZCBwYXJhbWV0ZXIgaW5kZXggaW4gdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0IGF0IGEKKyAqIGdpdmVuIG5lc3RpbmcgZGVwdGguCisgKgorICogRm9yIGV4YW1wbGUsCisgKiBcdmVyYmF0aW0KKyAqICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUVD4KKyAqICAgICB2b2lkIHRlc3QoVFQ8aW50PiBhYWEpOworICogXGVuZHZlcmJhdGltCisgKiBmb3IgQyBhbmQgVFQgbmVzdGluZyBkZXB0aCBpcyAwLCBzbyB3ZSBjYW4gYXNrIGZvciBpbmRleCBhdCBkZXB0aCAwOgorICogYXQgZGVwdGggMCBDJ3MgaW5kZXggaXMgMCwgVFQncyBpbmRleCBpcyAxLgorICoKKyAqIEZvciBUIG5lc3RpbmcgZGVwdGggaXMgMSwgc28gd2UgY2FuIGFzayBmb3IgaW5kZXggYXQgZGVwdGggMCBhbmQgMToKKyAqIGF0IGRlcHRoIDAgVCdzIGluZGV4IGlzIDEgKHNhbWUgYXMgVFQncyksCisgKiBhdCBkZXB0aCAxIFQncyBpbmRleCBpcyAwLgorICovCitDSU5ERVhfTElOS0FHRQordW5zaWduZWQgY2xhbmdfVFBhcmFtQ29tbWFuZENvbW1lbnRfZ2V0SW5kZXgoQ1hDb21tZW50IENvbW1lbnQsIHVuc2lnbmVkIERlcHRoKTsKKworLyoqCisgKiBccGFyYW0gQ29tbWVudCBhIFxjIENYQ29tbWVudF9WZXJiYXRpbUJsb2NrTGluZSBBU1Qgbm9kZS4KKyAqCisgKiBccmV0dXJucyB0ZXh0IGNvbnRhaW5lZCBpbiB0aGUgQVNUIG5vZGUuCisgKi8KK0NJTkRFWF9MSU5LQUdFCitDWFN0cmluZyBjbGFuZ19WZXJiYXRpbUJsb2NrTGluZUNvbW1lbnRfZ2V0VGV4dChDWENvbW1lbnQgQ29tbWVudCk7CisKKy8qKgorICogXHBhcmFtIENvbW1lbnQgYSBcYyBDWENvbW1lbnRfVmVyYmF0aW1MaW5lIEFTVCBub2RlLgorICoKKyAqIFxyZXR1cm5zIHRleHQgY29udGFpbmVkIGluIHRoZSBBU1Qgbm9kZS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfVmVyYmF0aW1MaW5lQ29tbWVudF9nZXRUZXh0KENYQ29tbWVudCBDb21tZW50KTsKKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBhbiBIVE1MIHRhZyBBU1Qgbm9kZSB0byBzdHJpbmcuCisgKgorICogXHBhcmFtIENvbW1lbnQgYSBcYyBDWENvbW1lbnRfSFRNTFN0YXJ0VGFnIG9yIFxjIENYQ29tbWVudF9IVE1MRW5kVGFnIEFTVAorICogbm9kZS4KKyAqCisgKiBccmV0dXJucyBzdHJpbmcgY29udGFpbmluZyBhbiBIVE1MIHRhZy4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfSFRNTFRhZ0NvbW1lbnRfZ2V0QXNTdHJpbmcoQ1hDb21tZW50IENvbW1lbnQpOworCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGEgZ2l2ZW4gZnVsbCBwYXJzZWQgY29tbWVudCB0byBhbiBIVE1MIGZyYWdtZW50LgorICoKKyAqIFNwZWNpZmljIGRldGFpbHMgb2YgSFRNTCBsYXlvdXQgYXJlIHN1YmplY3QgdG8gY2hhbmdlLiAgRG9uJ3QgdHJ5IHRvIHBhcnNlCisgKiB0aGlzIEhUTUwgYmFjayBpbnRvIGFuIEFTVCwgdXNlIG90aGVyIEFQSXMgaW5zdGVhZC4KKyAqCisgKiBDdXJyZW50bHkgdGhlIGZvbGxvd2luZyBDU1MgY2xhc3NlcyBhcmUgdXNlZDoKKyAqIFxsaSAicGFyYS1icmllZiIgZm9yIFxcYnJpZWYgcGFyYWdyYXBoIGFuZCBlcXVpdmFsZW50IGNvbW1hbmRzOworICogXGxpICJwYXJhLXJldHVybnMiIGZvciBcXHJldHVybnMgcGFyYWdyYXBoIGFuZCBlcXVpdmFsZW50IGNvbW1hbmRzOworICogXGxpICJ3b3JkLXJldHVybnMiIGZvciB0aGUgIlJldHVybnMiIHdvcmQgaW4gXFxyZXR1cm5zIHBhcmFncmFwaC4KKyAqCisgKiBGdW5jdGlvbiBhcmd1bWVudCBkb2N1bWVudGF0aW9uIGlzIHJlbmRlcmVkIGFzIGEgXDxkbFw+IGxpc3Qgd2l0aCBhcmd1bWVudHMKKyAqIHNvcnRlZCBpbiBmdW5jdGlvbiBwcm90b3R5cGUgb3JkZXIuICBDU1MgY2xhc3NlcyB1c2VkOgorICogXGxpICJwYXJhbS1uYW1lLWluZGV4LU5VTUJFUiIgZm9yIHBhcmFtZXRlciBuYW1lIChcPGR0XD4pOworICogXGxpICJwYXJhbS1kZXNjci1pbmRleC1OVU1CRVIiIGZvciBwYXJhbWV0ZXIgZGVzY3JpcHRpb24gKFw8ZGRcPik7CisgKiBcbGkgInBhcmFtLW5hbWUtaW5kZXgtaW52YWxpZCIgYW5kICJwYXJhbS1kZXNjci1pbmRleC1pbnZhbGlkIiBhcmUgdXNlZCBpZgorICogcGFyYW1ldGVyIGluZGV4IGlzIGludmFsaWQuCisgKgorICogVGVtcGxhdGUgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24gaXMgcmVuZGVyZWQgYXMgYSBcPGRsXD4gbGlzdCB3aXRoCisgKiBwYXJhbWV0ZXJzIHNvcnRlZCBpbiB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdCBvcmRlci4gIENTUyBjbGFzc2VzIHVzZWQ6CisgKiBcbGkgInRwYXJhbS1uYW1lLWluZGV4LU5VTUJFUiIgZm9yIHBhcmFtZXRlciBuYW1lIChcPGR0XD4pOworICogXGxpICJ0cGFyYW0tZGVzY3ItaW5kZXgtTlVNQkVSIiBmb3IgcGFyYW1ldGVyIGRlc2NyaXB0aW9uIChcPGRkXD4pOworICogXGxpICJ0cGFyYW0tbmFtZS1pbmRleC1vdGhlciIgYW5kICJ0cGFyYW0tZGVzY3ItaW5kZXgtb3RoZXIiIGFyZSB1c2VkIGZvcgorICogbmFtZXMgaW5zaWRlIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlcnM7CisgKiBcbGkgInRwYXJhbS1uYW1lLWluZGV4LWludmFsaWQiIGFuZCAidHBhcmFtLWRlc2NyLWluZGV4LWludmFsaWQiIGFyZSB1c2VkIGlmCisgKiBwYXJhbWV0ZXIgcG9zaXRpb24gaXMgaW52YWxpZC4KKyAqCisgKiBccGFyYW0gQ29tbWVudCBhIFxjIENYQ29tbWVudF9GdWxsQ29tbWVudCBBU1Qgbm9kZS4KKyAqCisgKiBccmV0dXJucyBzdHJpbmcgY29udGFpbmluZyBhbiBIVE1MIGZyYWdtZW50LgorICovCitDSU5ERVhfTElOS0FHRSBDWFN0cmluZyBjbGFuZ19GdWxsQ29tbWVudF9nZXRBc0hUTUwoQ1hDb21tZW50IENvbW1lbnQpOworCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGEgZ2l2ZW4gZnVsbCBwYXJzZWQgY29tbWVudCB0byBhbiBYTUwgZG9jdW1lbnQuCisgKgorICogQSBSZWxheCBORyBzY2hlbWEgZm9yIHRoZSBYTUwgY2FuIGJlIGZvdW5kIGluIGNvbW1lbnQteG1sLXNjaGVtYS5ybmcgZmlsZQorICogaW5zaWRlIGNsYW5nIHNvdXJjZSB0cmVlLgorICoKKyAqIFxwYXJhbSBDb21tZW50IGEgXGMgQ1hDb21tZW50X0Z1bGxDb21tZW50IEFTVCBub2RlLgorICoKKyAqIFxyZXR1cm5zIHN0cmluZyBjb250YWluaW5nIGFuIFhNTCBkb2N1bWVudC4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfRnVsbENvbW1lbnRfZ2V0QXNYTUwoQ1hDb21tZW50IENvbW1lbnQpOworCisvKioKKyAqIEB9CisgKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQ0xBTkdfQ19ET0NVTUVOVEFUSU9OX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmctYy9JbmRleC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmctYy9JbmRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NjhkMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy1jL0luZGV4LmgKQEAgLTAsMCArMSw2NDcyIEBACisvKj09PS0tIGNsYW5nLWMvSW5kZXguaCAtIEluZGV4aW5nIFB1YmxpYyBDIEludGVyZmFjZSAtLS0tLS0tLS0tLS0tKi0gQyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGhlYWRlciBwcm92aWRlcyBhIHB1YmxpYyBpbnRlcmZhY2UgdG8gYSBDbGFuZyBsaWJyYXJ5IGZvciBleHRyYWN0aW5nICAqfAorfCogaGlnaC1sZXZlbCBzeW1ib2wgaW5mb3JtYXRpb24gZnJvbSBzb3VyY2UgZmlsZXMgd2l0aG91dCBleHBvc2luZyB0aGUgZnVsbCAgKnwKK3wqIENsYW5nIEMrKyBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0NfSU5ERVhfSAorI2RlZmluZSBMTFZNX0NMQU5HX0NfSU5ERVhfSAorCisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAiY2xhbmctYy9QbGF0Zm9ybS5oIgorI2luY2x1ZGUgImNsYW5nLWMvQ1hFcnJvckNvZGUuaCIKKyNpbmNsdWRlICJjbGFuZy1jL0NYU3RyaW5nLmgiCisjaW5jbHVkZSAiY2xhbmctYy9CdWlsZFN5c3RlbS5oIgorCisvKioKKyAqIFxicmllZiBUaGUgdmVyc2lvbiBjb25zdGFudHMgZm9yIHRoZSBsaWJjbGFuZyBBUEkuCisgKiBDSU5ERVhfVkVSU0lPTl9NSU5PUiBzaG91bGQgaW5jcmVhc2Ugd2hlbiB0aGVyZSBhcmUgQVBJIGFkZGl0aW9ucy4KKyAqIENJTkRFWF9WRVJTSU9OX01BSk9SIGlzIGludGVuZGVkIGZvciAibWFqb3IiIHNvdXJjZS9BQkkgYnJlYWtpbmcgY2hhbmdlcy4KKyAqCisgKiBUaGUgcG9saWN5IGFib3V0IHRoZSBsaWJjbGFuZyBBUEkgd2FzIGFsd2F5cyB0byBrZWVwIGl0IHNvdXJjZSBhbmQgQUJJCisgKiBjb21wYXRpYmxlLCB0aHVzIENJTkRFWF9WRVJTSU9OX01BSk9SIGlzIGV4cGVjdGVkIHRvIHJlbWFpbiBzdGFibGUuCisgKi8KKyNkZWZpbmUgQ0lOREVYX1ZFUlNJT05fTUFKT1IgMAorI2RlZmluZSBDSU5ERVhfVkVSU0lPTl9NSU5PUiA0OAorCisjZGVmaW5lIENJTkRFWF9WRVJTSU9OX0VOQ09ERShtYWpvciwgbWlub3IpICggXAorICAgICAgKChtYWpvcikgKiAxMDAwMCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICArICgobWlub3IpICogICAgIDEpKQorCisjZGVmaW5lIENJTkRFWF9WRVJTSU9OIENJTkRFWF9WRVJTSU9OX0VOQ09ERSggXAorICAgIENJTkRFWF9WRVJTSU9OX01BSk9SLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDSU5ERVhfVkVSU0lPTl9NSU5PUiApCisKKyNkZWZpbmUgQ0lOREVYX1ZFUlNJT05fU1RSSU5HSVpFXyhtYWpvciwgbWlub3IpICAgXAorICAgICNtYWpvciIuIiNtaW5vcgorI2RlZmluZSBDSU5ERVhfVkVSU0lPTl9TVFJJTkdJWkUobWFqb3IsIG1pbm9yKSAgICBcCisgICAgQ0lOREVYX1ZFUlNJT05fU1RSSU5HSVpFXyhtYWpvciwgbWlub3IpCisKKyNkZWZpbmUgQ0lOREVYX1ZFUlNJT05fU1RSSU5HIENJTkRFWF9WRVJTSU9OX1NUUklOR0laRSggXAorICAgIENJTkRFWF9WRVJTSU9OX01BSk9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0lOREVYX1ZFUlNJT05fTUlOT1IpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIFxkZWZncm91cCBDSU5ERVggbGliY2xhbmc6IEMgSW50ZXJmYWNlIHRvIENsYW5nCisgKgorICogVGhlIEMgSW50ZXJmYWNlIHRvIENsYW5nIHByb3ZpZGVzIGEgcmVsYXRpdmVseSBzbWFsbCBBUEkgdGhhdCBleHBvc2VzCisgKiBmYWNpbGl0aWVzIGZvciBwYXJzaW5nIHNvdXJjZSBjb2RlIGludG8gYW4gYWJzdHJhY3Qgc3ludGF4IHRyZWUgKEFTVCksCisgKiBsb2FkaW5nIGFscmVhZHktcGFyc2VkIEFTVHMsIHRyYXZlcnNpbmcgdGhlIEFTVCwgYXNzb2NpYXRpbmcKKyAqIHBoeXNpY2FsIHNvdXJjZSBsb2NhdGlvbnMgd2l0aCBlbGVtZW50cyB3aXRoaW4gdGhlIEFTVCwgYW5kIG90aGVyCisgKiBmYWNpbGl0aWVzIHRoYXQgc3VwcG9ydCBDbGFuZy1iYXNlZCBkZXZlbG9wbWVudCB0b29scy4KKyAqCisgKiBUaGlzIEMgaW50ZXJmYWNlIHRvIENsYW5nIHdpbGwgbmV2ZXIgcHJvdmlkZSBhbGwgb2YgdGhlIGluZm9ybWF0aW9uCisgKiByZXByZXNlbnRhdGlvbiBzdG9yZWQgaW4gQ2xhbmcncyBDKysgQVNULCBub3Igc2hvdWxkIGl0OiB0aGUgaW50ZW50IGlzIHRvCisgKiBtYWludGFpbiBhbiBBUEkgdGhhdCBpcyByZWxhdGl2ZWx5IHN0YWJsZSBmcm9tIG9uZSByZWxlYXNlIHRvIHRoZSBuZXh0LAorICogcHJvdmlkaW5nIG9ubHkgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIHRvIHN1cHBvcnQgZGV2ZWxvcG1lbnQgdG9vbHMuCisgKgorICogVG8gYXZvaWQgbmFtZXNwYWNlIHBvbGx1dGlvbiwgZGF0YSB0eXBlcyBhcmUgcHJlZml4ZWQgd2l0aCAiQ1giIGFuZAorICogZnVuY3Rpb25zIGFyZSBwcmVmaXhlZCB3aXRoICJjbGFuZ18iLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBcYnJpZWYgQW4gImluZGV4IiB0aGF0IGNvbnNpc3RzIG9mIGEgc2V0IG9mIHRyYW5zbGF0aW9uIHVuaXRzIHRoYXQgd291bGQKKyAqIHR5cGljYWxseSBiZSBsaW5rZWQgdG9nZXRoZXIgaW50byBhbiBleGVjdXRhYmxlIG9yIGxpYnJhcnkuCisgKi8KK3R5cGVkZWYgdm9pZCAqQ1hJbmRleDsKKworLyoqCisgKiBcYnJpZWYgQW4gb3BhcXVlIHR5cGUgcmVwcmVzZW50aW5nIHRhcmdldCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiB0cmFuc2xhdGlvbgorICogdW5pdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ1hUYXJnZXRJbmZvSW1wbCAqQ1hUYXJnZXRJbmZvOworCisvKioKKyAqIFxicmllZiBBIHNpbmdsZSB0cmFuc2xhdGlvbiB1bml0LCB3aGljaCByZXNpZGVzIGluIGFuIGluZGV4LgorICovCit0eXBlZGVmIHN0cnVjdCBDWFRyYW5zbGF0aW9uVW5pdEltcGwgKkNYVHJhbnNsYXRpb25Vbml0OworCisvKioKKyAqIFxicmllZiBPcGFxdWUgcG9pbnRlciByZXByZXNlbnRpbmcgY2xpZW50IGRhdGEgdGhhdCB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoCisgKiB0byB2YXJpb3VzIGNhbGxiYWNrcyBhbmQgdmlzaXRvcnMuCisgKi8KK3R5cGVkZWYgdm9pZCAqQ1hDbGllbnREYXRhOworCisvKioKKyAqIFxicmllZiBQcm92aWRlcyB0aGUgY29udGVudHMgb2YgYSBmaWxlIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBzYXZlZCB0byBkaXNrLgorICoKKyAqIEVhY2ggQ1hVbnNhdmVkRmlsZSBpbnN0YW5jZSBwcm92aWRlcyB0aGUgbmFtZSBvZiBhIGZpbGUgb24gdGhlCisgKiBzeXN0ZW0gYWxvbmcgd2l0aCB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGF0IGZpbGUgdGhhdCBoYXZlIG5vdAorICogeWV0IGJlZW4gc2F2ZWQgdG8gZGlzay4KKyAqLworc3RydWN0IENYVW5zYXZlZEZpbGUgeworICAvKioKKyAgICogXGJyaWVmIFRoZSBmaWxlIHdob3NlIGNvbnRlbnRzIGhhdmUgbm90IHlldCBiZWVuIHNhdmVkLgorICAgKgorICAgKiBUaGlzIGZpbGUgbXVzdCBhbHJlYWR5IGV4aXN0IGluIHRoZSBmaWxlIHN5c3RlbS4KKyAgICovCisgIGNvbnN0IGNoYXIgKkZpbGVuYW1lOworCisgIC8qKgorICAgKiBcYnJpZWYgQSBidWZmZXIgY29udGFpbmluZyB0aGUgdW5zYXZlZCBjb250ZW50cyBvZiB0aGlzIGZpbGUuCisgICAqLworICBjb25zdCBjaGFyICpDb250ZW50czsKKworICAvKioKKyAgICogXGJyaWVmIFRoZSBsZW5ndGggb2YgdGhlIHVuc2F2ZWQgY29udGVudHMgb2YgdGhpcyBidWZmZXIuCisgICAqLworICB1bnNpZ25lZCBsb25nIExlbmd0aDsKK307CisKKy8qKgorICogXGJyaWVmIERlc2NyaWJlcyB0aGUgYXZhaWxhYmlsaXR5IG9mIGEgcGFydGljdWxhciBlbnRpdHksIHdoaWNoIGluZGljYXRlcworICogd2hldGhlciB0aGUgdXNlIG9mIHRoaXMgZW50aXR5IHdpbGwgcmVzdWx0IGluIGEgd2FybmluZyBvciBlcnJvciBkdWUgdG8KKyAqIGl0IGJlaW5nIGRlcHJlY2F0ZWQgb3IgdW5hdmFpbGFibGUuCisgKi8KK2VudW0gQ1hBdmFpbGFiaWxpdHlLaW5kIHsKKyAgLyoqCisgICAqIFxicmllZiBUaGUgZW50aXR5IGlzIGF2YWlsYWJsZS4KKyAgICovCisgIENYQXZhaWxhYmlsaXR5X0F2YWlsYWJsZSwKKyAgLyoqCisgICAqIFxicmllZiBUaGUgZW50aXR5IGlzIGF2YWlsYWJsZSwgYnV0IGhhcyBiZWVuIGRlcHJlY2F0ZWQgKGFuZCBpdHMgdXNlIGlzCisgICAqIG5vdCByZWNvbW1lbmRlZCkuCisgICAqLworICBDWEF2YWlsYWJpbGl0eV9EZXByZWNhdGVkLAorICAvKioKKyAgICogXGJyaWVmIFRoZSBlbnRpdHkgaXMgbm90IGF2YWlsYWJsZTsgYW55IHVzZSBvZiBpdCB3aWxsIGJlIGFuIGVycm9yLgorICAgKi8KKyAgQ1hBdmFpbGFiaWxpdHlfTm90QXZhaWxhYmxlLAorICAvKioKKyAgICogXGJyaWVmIFRoZSBlbnRpdHkgaXMgYXZhaWxhYmxlLCBidXQgbm90IGFjY2Vzc2libGU7IGFueSB1c2Ugb2YgaXQgd2lsbCBiZQorICAgKiBhbiBlcnJvci4KKyAgICovCisgIENYQXZhaWxhYmlsaXR5X05vdEFjY2Vzc2libGUKK307CisKKy8qKgorICogXGJyaWVmIERlc2NyaWJlcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBmb3JtIG1ham9yLm1pbm9yLnN1Ym1pbm9yLgorICovCit0eXBlZGVmIHN0cnVjdCBDWFZlcnNpb24geworICAvKioKKyAgICogXGJyaWVmIFRoZSBtYWpvciB2ZXJzaW9uIG51bWJlciwgZS5nLiwgdGhlICcxMCcgaW4gJzEwLjcuMycuIEEgbmVnYXRpdmUKKyAgICogdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm8gdmVyc2lvbiBudW1iZXIgYXQgYWxsLgorICAgKi8KKyAgaW50IE1ham9yOworICAvKioKKyAgICogXGJyaWVmIFRoZSBtaW5vciB2ZXJzaW9uIG51bWJlciwgZS5nLiwgdGhlICc3JyBpbiAnMTAuNy4zJy4gVGhpcyB2YWx1ZQorICAgKiB3aWxsIGJlIG5lZ2F0aXZlIGlmIG5vIG1pbm9yIHZlcnNpb24gbnVtYmVyIHdhcyBwcm92aWRlZCwgZS5nLiwgZm9yIAorICAgKiB2ZXJzaW9uICcxMCcuCisgICAqLworICBpbnQgTWlub3I7CisgIC8qKgorICAgKiBcYnJpZWYgVGhlIHN1Ym1pbm9yIHZlcnNpb24gbnVtYmVyLCBlLmcuLCB0aGUgJzMnIGluICcxMC43LjMnLiBUaGlzIHZhbHVlCisgICAqIHdpbGwgYmUgbmVnYXRpdmUgaWYgbm8gbWlub3Igb3Igc3VibWlub3IgdmVyc2lvbiBudW1iZXIgd2FzIHByb3ZpZGVkLAorICAgKiBlLmcuLCBpbiB2ZXJzaW9uICcxMCcgb3IgJzEwLjcnLgorICAgKi8KKyAgaW50IFN1Ym1pbm9yOworfSBDWFZlcnNpb247CisKKy8qKgorICogXGJyaWVmIERlc2NyaWJlcyB0aGUgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gb2YgYSBjdXJzb3IuCisgKgorICogQSBuZWdhdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY3Vyc29yIGlzIG5vdCBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgorICovCitlbnVtIENYQ3Vyc29yX0V4Y2VwdGlvblNwZWNpZmljYXRpb25LaW5kIHsKKworICAvKioKKyAgICogXGJyaWVmIFRoZSBjdXJzb3IgaGFzIG5vIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLgorICAgKi8KKyAgQ1hDdXJzb3JfRXhjZXB0aW9uU3BlY2lmaWNhdGlvbktpbmRfTm9uZSwKKworICAvKioKKyAgICogXGJyaWVmIFRoZSBjdXJzb3IgaGFzIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIHRocm93KCkKKyAgICovCisgIENYQ3Vyc29yX0V4Y2VwdGlvblNwZWNpZmljYXRpb25LaW5kX0R5bmFtaWNOb25lLAorCisgIC8qKgorICAgKiBcYnJpZWYgVGhlIGN1cnNvciBoYXMgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gdGhyb3coVDEsIFQyKQorICAgKi8KKyAgQ1hDdXJzb3JfRXhjZXB0aW9uU3BlY2lmaWNhdGlvbktpbmRfRHluYW1pYywKKworICAvKioKKyAgICogXGJyaWVmIFRoZSBjdXJzb3IgaGFzIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIHRocm93KC4uLikuCisgICAqLworICBDWEN1cnNvcl9FeGNlcHRpb25TcGVjaWZpY2F0aW9uS2luZF9NU0FueSwKKworICAvKioKKyAgICogXGJyaWVmIFRoZSBjdXJzb3IgaGFzIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGJhc2ljIG5vZXhjZXB0LgorICAgKi8KKyAgQ1hDdXJzb3JfRXhjZXB0aW9uU3BlY2lmaWNhdGlvbktpbmRfQmFzaWNOb2V4Y2VwdCwKKworICAvKioKKyAgICogXGJyaWVmIFRoZSBjdXJzb3IgaGFzIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGNvbXB1dGVkIG5vZXhjZXB0LgorICAgKi8KKyAgQ1hDdXJzb3JfRXhjZXB0aW9uU3BlY2lmaWNhdGlvbktpbmRfQ29tcHV0ZWROb2V4Y2VwdCwKKworICAvKioKKyAgICogXGJyaWVmIFRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBoYXMgbm90IHlldCBiZWVuIGV2YWx1YXRlZC4KKyAgICovCisgIENYQ3Vyc29yX0V4Y2VwdGlvblNwZWNpZmljYXRpb25LaW5kX1VuZXZhbHVhdGVkLAorCisgIC8qKgorICAgKiBcYnJpZWYgVGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGhhcyBub3QgeWV0IGJlZW4gaW5zdGFudGlhdGVkLgorICAgKi8KKyAgQ1hDdXJzb3JfRXhjZXB0aW9uU3BlY2lmaWNhdGlvbktpbmRfVW5pbnN0YW50aWF0ZWQsCisKKyAgLyoqCisgICAqIFxicmllZiBUaGUgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gaGFzIG5vdCBiZWVuIHBhcnNlZCB5ZXQuCisgICAqLworICBDWEN1cnNvcl9FeGNlcHRpb25TcGVjaWZpY2F0aW9uS2luZF9VbnBhcnNlZAorfTsKKworLyoqCisgKiBcYnJpZWYgUHJvdmlkZXMgYSBzaGFyZWQgY29udGV4dCBmb3IgY3JlYXRpbmcgdHJhbnNsYXRpb24gdW5pdHMuCisgKgorICogSXQgcHJvdmlkZXMgdHdvIG9wdGlvbnM6CisgKgorICogLSBleGNsdWRlRGVjbGFyYXRpb25zRnJvbVBDSDogV2hlbiBub24temVybywgYWxsb3dzIGVudW1lcmF0aW9uIG9mICJsb2NhbCIKKyAqIGRlY2xhcmF0aW9ucyAod2hlbiBsb2FkaW5nIGFueSBuZXcgdHJhbnNsYXRpb24gdW5pdHMpLiBBICJsb2NhbCIgZGVjbGFyYXRpb24KKyAqIGlzIG9uZSB0aGF0IGJlbG9uZ3MgaW4gdGhlIHRyYW5zbGF0aW9uIHVuaXQgaXRzZWxmIGFuZCBub3QgaW4gYSBwcmVjb21waWxlZAorICogaGVhZGVyIHRoYXQgd2FzIHVzZWQgYnkgdGhlIHRyYW5zbGF0aW9uIHVuaXQuIElmIHplcm8sIGFsbCBkZWNsYXJhdGlvbnMKKyAqIHdpbGwgYmUgZW51bWVyYXRlZC4KKyAqCisgKiBIZXJlIGlzIGFuIGV4YW1wbGU6CisgKgorICogXGNvZGUKKyAqICAgLy8gZXhjbHVkZURlY2xzRnJvbVBDSCA9IDEsIGRpc3BsYXlEaWFnbm9zdGljcz0xCisgKiAgIElkeCA9IGNsYW5nX2NyZWF0ZUluZGV4KDEsIDEpOworICoKKyAqICAgLy8gSW5kZXhUZXN0LnBjaCB3YXMgcHJvZHVjZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisgKiAgIC8vICJjbGFuZyAteCBjIEluZGV4VGVzdC5oIC1lbWl0LWFzdCAtbyBJbmRleFRlc3QucGNoIgorICogICBUVSA9IGNsYW5nX2NyZWF0ZVRyYW5zbGF0aW9uVW5pdChJZHgsICJJbmRleFRlc3QucGNoIik7CisgKgorICogICAvLyBUaGlzIHdpbGwgbG9hZCBhbGwgdGhlIHN5bWJvbHMgZnJvbSAnSW5kZXhUZXN0LnBjaCcKKyAqICAgY2xhbmdfdmlzaXRDaGlsZHJlbihjbGFuZ19nZXRUcmFuc2xhdGlvblVuaXRDdXJzb3IoVFUpLAorICogICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uVW5pdFZpc2l0b3IsIDApOworICogICBjbGFuZ19kaXNwb3NlVHJhbnNsYXRpb25Vbml0KFRVKTsKKyAqCisgKiAgIC8vIFRoaXMgd2lsbCBsb2FkIGFsbCB0aGUgc3ltYm9scyBmcm9tICdJbmRleFRlc3QuYycsIGV4Y2x1ZGluZyBzeW1ib2xzCisgKiAgIC8vIGZyb20gJ0luZGV4VGVzdC5wY2gnLgorICogICBjaGFyICphcmdzW10gPSB7ICItWGNsYW5nIiwgIi1pbmNsdWRlLXBjaD1JbmRleFRlc3QucGNoIiB9OworICogICBUVSA9IGNsYW5nX2NyZWF0ZVRyYW5zbGF0aW9uVW5pdEZyb21Tb3VyY2VGaWxlKElkeCwgIkluZGV4VGVzdC5jIiwgMiwgYXJncywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKyAqICAgY2xhbmdfdmlzaXRDaGlsZHJlbihjbGFuZ19nZXRUcmFuc2xhdGlvblVuaXRDdXJzb3IoVFUpLAorICogICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uVW5pdFZpc2l0b3IsIDApOworICogICBjbGFuZ19kaXNwb3NlVHJhbnNsYXRpb25Vbml0KFRVKTsKKyAqIFxlbmRjb2RlCisgKgorICogVGhpcyBwcm9jZXNzIG9mIGNyZWF0aW5nIHRoZSAncGNoJywgbG9hZGluZyBpdCBzZXBhcmF0ZWx5LCBhbmQgdXNpbmcgaXQgKHZpYQorICogLWluY2x1ZGUtcGNoKSBhbGxvd3MgJ2V4Y2x1ZGVEZWNsc0Zyb21QQ0gnIHRvIHJlbW92ZSByZWR1bmRhbnQgY2FsbGJhY2tzCisgKiAod2hpY2ggZ2l2ZXMgdGhlIGluZGV4ZXIgdGhlIHNhbWUgcGVyZm9ybWFuY2UgYmVuZWZpdCBhcyB0aGUgY29tcGlsZXIpLgorICovCitDSU5ERVhfTElOS0FHRSBDWEluZGV4IGNsYW5nX2NyZWF0ZUluZGV4KGludCBleGNsdWRlRGVjbGFyYXRpb25zRnJvbVBDSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3BsYXlEaWFnbm9zdGljcyk7CisKKy8qKgorICogXGJyaWVmIERlc3Ryb3kgdGhlIGdpdmVuIGluZGV4LgorICoKKyAqIFRoZSBpbmRleCBtdXN0IG5vdCBiZSBkZXN0cm95ZWQgdW50aWwgYWxsIG9mIHRoZSB0cmFuc2xhdGlvbiB1bml0cyBjcmVhdGVkCisgKiB3aXRoaW4gdGhhdCBpbmRleCBoYXZlIGJlZW4gZGVzdHJveWVkLgorICovCitDSU5ERVhfTElOS0FHRSB2b2lkIGNsYW5nX2Rpc3Bvc2VJbmRleChDWEluZGV4IGluZGV4KTsKKwordHlwZWRlZiBlbnVtIHsKKyAgLyoqCisgICAqIFxicmllZiBVc2VkIHRvIGluZGljYXRlIHRoYXQgbm8gc3BlY2lhbCBDWEluZGV4IG9wdGlvbnMgYXJlIG5lZWRlZC4KKyAgICovCisgIENYR2xvYmFsT3B0X05vbmUgPSAweDAsCisKKyAgLyoqCisgICAqIFxicmllZiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhyZWFkcyB0aGF0IGxpYmNsYW5nIGNyZWF0ZXMgZm9yIGluZGV4aW5nCisgICAqIHB1cnBvc2VzIHNob3VsZCB1c2UgYmFja2dyb3VuZCBwcmlvcml0eS4KKyAgICoKKyAgICogQWZmZWN0cyAjY2xhbmdfaW5kZXhTb3VyY2VGaWxlLCAjY2xhbmdfaW5kZXhUcmFuc2xhdGlvblVuaXQsCisgICAqICNjbGFuZ19wYXJzZVRyYW5zbGF0aW9uVW5pdCwgI2NsYW5nX3NhdmVUcmFuc2xhdGlvblVuaXQuCisgICAqLworICBDWEdsb2JhbE9wdF9UaHJlYWRCYWNrZ3JvdW5kUHJpb3JpdHlGb3JJbmRleGluZyA9IDB4MSwKKworICAvKioKKyAgICogXGJyaWVmIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aHJlYWRzIHRoYXQgbGliY2xhbmcgY3JlYXRlcyBmb3IgZWRpdGluZworICAgKiBwdXJwb3NlcyBzaG91bGQgdXNlIGJhY2tncm91bmQgcHJpb3JpdHkuCisgICAqCisgICAqIEFmZmVjdHMgI2NsYW5nX3JlcGFyc2VUcmFuc2xhdGlvblVuaXQsICNjbGFuZ19jb2RlQ29tcGxldGVBdCwKKyAgICogI2NsYW5nX2Fubm90YXRlVG9rZW5zCisgICAqLworICBDWEdsb2JhbE9wdF9UaHJlYWRCYWNrZ3JvdW5kUHJpb3JpdHlGb3JFZGl0aW5nID0gMHgyLAorCisgIC8qKgorICAgKiBcYnJpZWYgVXNlZCB0byBpbmRpY2F0ZSB0aGF0IGFsbCB0aHJlYWRzIHRoYXQgbGliY2xhbmcgY3JlYXRlcyBzaG91bGQgdXNlCisgICAqIGJhY2tncm91bmQgcHJpb3JpdHkuCisgICAqLworICBDWEdsb2JhbE9wdF9UaHJlYWRCYWNrZ3JvdW5kUHJpb3JpdHlGb3JBbGwgPQorICAgICAgQ1hHbG9iYWxPcHRfVGhyZWFkQmFja2dyb3VuZFByaW9yaXR5Rm9ySW5kZXhpbmcgfAorICAgICAgQ1hHbG9iYWxPcHRfVGhyZWFkQmFja2dyb3VuZFByaW9yaXR5Rm9yRWRpdGluZworCit9IENYR2xvYmFsT3B0RmxhZ3M7CisKKy8qKgorICogXGJyaWVmIFNldHMgZ2VuZXJhbCBvcHRpb25zIGFzc29jaWF0ZWQgd2l0aCBhIENYSW5kZXguCisgKgorICogRm9yIGV4YW1wbGU6CisgKiBcY29kZQorICogQ1hJbmRleCBpZHggPSAuLi47CisgKiBjbGFuZ19DWEluZGV4X3NldEdsb2JhbE9wdGlvbnMoaWR4LAorICogICAgIGNsYW5nX0NYSW5kZXhfZ2V0R2xvYmFsT3B0aW9ucyhpZHgpIHwKKyAqICAgICBDWEdsb2JhbE9wdF9UaHJlYWRCYWNrZ3JvdW5kUHJpb3JpdHlGb3JJbmRleGluZyk7CisgKiBcZW5kY29kZQorICoKKyAqIFxwYXJhbSBvcHRpb25zIEEgYml0bWFzayBvZiBvcHRpb25zLCBhIGJpdHdpc2UgT1Igb2YgQ1hHbG9iYWxPcHRfWFhYIGZsYWdzLgorICovCitDSU5ERVhfTElOS0FHRSB2b2lkIGNsYW5nX0NYSW5kZXhfc2V0R2xvYmFsT3B0aW9ucyhDWEluZGV4LCB1bnNpZ25lZCBvcHRpb25zKTsKKworLyoqCisgKiBcYnJpZWYgR2V0cyB0aGUgZ2VuZXJhbCBvcHRpb25zIGFzc29jaWF0ZWQgd2l0aCBhIENYSW5kZXguCisgKgorICogXHJldHVybnMgQSBiaXRtYXNrIG9mIG9wdGlvbnMsIGEgYml0d2lzZSBPUiBvZiBDWEdsb2JhbE9wdF9YWFggZmxhZ3MgdGhhdAorICogYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gQ1hJbmRleCBvYmplY3QuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX0NYSW5kZXhfZ2V0R2xvYmFsT3B0aW9ucyhDWEluZGV4KTsKKworLyoqCisgKiBcYnJpZWYgU2V0cyB0aGUgaW52b2NhdGlvbiBlbWlzc2lvbiBwYXRoIG9wdGlvbiBpbiBhIENYSW5kZXguCisgKgorICogVGhlIGludm9jYXRpb24gZW1pc3Npb24gcGF0aCBzcGVjaWZpZXMgYSBwYXRoIHdoaWNoIHdpbGwgY29udGFpbiBsb2cKKyAqIGZpbGVzIGZvciBjZXJ0YWluIGxpYmNsYW5nIGludm9jYXRpb25zLiBBIG51bGwgdmFsdWUgKGRlZmF1bHQpIGltcGxpZXMgdGhhdAorICogbGliY2xhbmcgaW52b2NhdGlvbnMgYXJlIG5vdCBsb2dnZWQuLgorICovCitDSU5ERVhfTElOS0FHRSB2b2lkCitjbGFuZ19DWEluZGV4X3NldEludm9jYXRpb25FbWlzc2lvblBhdGhPcHRpb24oQ1hJbmRleCwgY29uc3QgY2hhciAqUGF0aCk7CisKKy8qKgorICogXGRlZmdyb3VwIENJTkRFWF9GSUxFUyBGaWxlIG1hbmlwdWxhdGlvbiByb3V0aW5lcworICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBcYnJpZWYgQSBwYXJ0aWN1bGFyIHNvdXJjZSBmaWxlIHRoYXQgaXMgcGFydCBvZiBhIHRyYW5zbGF0aW9uIHVuaXQuCisgKi8KK3R5cGVkZWYgdm9pZCAqQ1hGaWxlOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgY29tcGxldGUgZmlsZSBhbmQgcGF0aCBuYW1lIG9mIHRoZSBnaXZlbiBmaWxlLgorICovCitDSU5ERVhfTElOS0FHRSBDWFN0cmluZyBjbGFuZ19nZXRGaWxlTmFtZShDWEZpbGUgU0ZpbGUpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgbGFzdCBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgZ2l2ZW4gZmlsZS4KKyAqLworQ0lOREVYX0xJTktBR0UgdGltZV90IGNsYW5nX2dldEZpbGVUaW1lKENYRmlsZSBTRmlsZSk7CisKKy8qKgorICogXGJyaWVmIFVuaXF1ZWx5IGlkZW50aWZpZXMgYSBDWEZpbGUsIHRoYXQgcmVmZXJzIHRvIHRoZSBzYW1lIHVuZGVybHlpbmcgZmlsZSwKKyAqIGFjcm9zcyBhbiBpbmRleGluZyBzZXNzaW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBkYXRhWzNdOworfSBDWEZpbGVVbmlxdWVJRDsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIHVuaXF1ZSBJRCBmb3IgdGhlIGdpdmVuIFxjIGZpbGUuCisgKgorICogXHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gZ2V0IHRoZSBJRCBmb3IuCisgKiBccGFyYW0gb3V0SUQgc3RvcmVzIHRoZSByZXR1cm5lZCBDWEZpbGVVbmlxdWVJRC4KKyAqIFxyZXR1cm5zIElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgZ2V0dGluZyB0aGUgdW5pcXVlIElELCByZXR1cm5zIG5vbi16ZXJvLAorICogb3RoZXJ3aXNlIHJldHVybnMgMC4KKyovCitDSU5ERVhfTElOS0FHRSBpbnQgY2xhbmdfZ2V0RmlsZVVuaXF1ZUlEKENYRmlsZSBmaWxlLCBDWEZpbGVVbmlxdWVJRCAqb3V0SUQpOworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gaGVhZGVyIGlzIGd1YXJkZWQgYWdhaW5zdAorICogbXVsdGlwbGUgaW5jbHVzaW9ucywgZWl0aGVyIHdpdGggdGhlIGNvbnZlbnRpb25hbAorICogXCNpZm5kZWYvXCNkZWZpbmUvXCNlbmRpZiBtYWNybyBndWFyZHMgb3Igd2l0aCBcI3ByYWdtYSBvbmNlLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCAKK2NsYW5nX2lzRmlsZU11bHRpcGxlSW5jbHVkZUd1YXJkZWQoQ1hUcmFuc2xhdGlvblVuaXQgdHUsIENYRmlsZSBmaWxlKTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgYSBmaWxlIGhhbmRsZSB3aXRoaW4gdGhlIGdpdmVuIHRyYW5zbGF0aW9uIHVuaXQuCisgKgorICogXHBhcmFtIHR1IHRoZSB0cmFuc2xhdGlvbiB1bml0CisgKgorICogXHBhcmFtIGZpbGVfbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAqCisgKiBccmV0dXJucyB0aGUgZmlsZSBoYW5kbGUgZm9yIHRoZSBuYW1lZCBmaWxlIGluIHRoZSB0cmFuc2xhdGlvbiB1bml0IFxwIHR1LAorICogb3IgYSBOVUxMIGZpbGUgaGFuZGxlIGlmIHRoZSBmaWxlIHdhcyBub3QgYSBwYXJ0IG9mIHRoaXMgdHJhbnNsYXRpb24gdW5pdC4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hGaWxlIGNsYW5nX2dldEZpbGUoQ1hUcmFuc2xhdGlvblVuaXQgdHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlX25hbWUpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmlsZS4KKyAqCisgKiBccGFyYW0gdHUgdGhlIHRyYW5zbGF0aW9uIHVuaXQKKyAqCisgKiBccGFyYW0gZmlsZSB0aGUgZmlsZSBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIGJ1ZmZlci4KKyAqCisgKiBccGFyYW0gc2l6ZSBbb3V0XSBpZiBub24tTlVMTCwgd2lsbCBiZSBzZXQgdG8gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAqCisgKiBccmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBpbiBtZW1vcnkgdGhhdCBob2xkcyB0aGUgY29udGVudHMgb2YKKyAqIFxwIGZpbGUsIG9yIGEgTlVMTCBwb2ludGVyIHdoZW4gdGhlIGZpbGUgaXMgbm90IGxvYWRlZC4KKyAqLworQ0lOREVYX0xJTktBR0UgY29uc3QgY2hhciAqY2xhbmdfZ2V0RmlsZUNvbnRlbnRzKENYVHJhbnNsYXRpb25Vbml0IHR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRmlsZSBmaWxlLCBzaXplX3QgKnNpemUpOworCisvKioKKyAqIFxicmllZiBSZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBcYyBmaWxlMSBhbmQgXGMgZmlsZTIgcG9pbnQgdG8gdGhlIHNhbWUgZmlsZSwKKyAqIG9yIHRoZXkgYXJlIGJvdGggTlVMTC4KKyAqLworQ0lOREVYX0xJTktBR0UgaW50IGNsYW5nX0ZpbGVfaXNFcXVhbChDWEZpbGUgZmlsZTEsIENYRmlsZSBmaWxlMik7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIFxkZWZncm91cCBDSU5ERVhfTE9DQVRJT05TIFBoeXNpY2FsIHNvdXJjZSBsb2NhdGlvbnMKKyAqCisgKiBDbGFuZyByZXByZXNlbnRzIHBoeXNpY2FsIHNvdXJjZSBsb2NhdGlvbnMgaW4gaXRzIGFic3RyYWN0IHN5bnRheCB0cmVlIGluCisgKiBncmVhdCBkZXRhaWwsIHdpdGggZmlsZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG1ham9yaXR5IG9mCisgKiB0aGUgdG9rZW5zIHBhcnNlZCBpbiB0aGUgc291cmNlIGNvZGUuIFRoZXNlIGRhdGEgdHlwZXMgYW5kIGZ1bmN0aW9ucyBhcmUKKyAqIHVzZWQgdG8gcmVwcmVzZW50IHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiwgZWl0aGVyIGZvciBhIHBhcnRpY3VsYXIKKyAqIHBvaW50IGluIHRoZSBwcm9ncmFtIG9yIGZvciBhIHJhbmdlIG9mIHBvaW50cyBpbiB0aGUgcHJvZ3JhbSwgYW5kIGV4dHJhY3QKKyAqIHNwZWNpZmljIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhvc2UgZGF0YSB0eXBlcy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogXGJyaWVmIElkZW50aWZpZXMgYSBzcGVjaWZpYyBzb3VyY2UgbG9jYXRpb24gd2l0aGluIGEgdHJhbnNsYXRpb24KKyAqIHVuaXQuCisgKgorICogVXNlIGNsYW5nX2dldEV4cGFuc2lvbkxvY2F0aW9uKCkgb3IgY2xhbmdfZ2V0U3BlbGxpbmdMb2NhdGlvbigpCisgKiB0byBtYXAgYSBzb3VyY2UgbG9jYXRpb24gdG8gYSBwYXJ0aWN1bGFyIGZpbGUsIGxpbmUsIGFuZCBjb2x1bW4uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3Qgdm9pZCAqcHRyX2RhdGFbMl07CisgIHVuc2lnbmVkIGludF9kYXRhOworfSBDWFNvdXJjZUxvY2F0aW9uOworCisvKioKKyAqIFxicmllZiBJZGVudGlmaWVzIGEgaGFsZi1vcGVuIGNoYXJhY3RlciByYW5nZSBpbiB0aGUgc291cmNlIGNvZGUuCisgKgorICogVXNlIGNsYW5nX2dldFJhbmdlU3RhcnQoKSBhbmQgY2xhbmdfZ2V0UmFuZ2VFbmQoKSB0byByZXRyaWV2ZSB0aGUKKyAqIHN0YXJ0aW5nIGFuZCBlbmQgbG9jYXRpb25zIGZyb20gYSBzb3VyY2UgcmFuZ2UsIHJlc3BlY3RpdmVseS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCB2b2lkICpwdHJfZGF0YVsyXTsKKyAgdW5zaWduZWQgYmVnaW5faW50X2RhdGE7CisgIHVuc2lnbmVkIGVuZF9pbnRfZGF0YTsKK30gQ1hTb3VyY2VSYW5nZTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgYSBOVUxMIChpbnZhbGlkKSBzb3VyY2UgbG9jYXRpb24uCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU291cmNlTG9jYXRpb24gY2xhbmdfZ2V0TnVsbExvY2F0aW9uKHZvaWQpOworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0d28gc291cmNlIGxvY2F0aW9ucywgd2hpY2ggbXVzdCByZWZlciBpbnRvCisgKiB0aGUgc2FtZSB0cmFuc2xhdGlvbiB1bml0LCByZWZlciB0byBleGFjdGx5IHRoZSBzYW1lIHBvaW50IGluIHRoZSBzb3VyY2UKKyAqIGNvZGUuCisgKgorICogXHJldHVybnMgbm9uLXplcm8gaWYgdGhlIHNvdXJjZSBsb2NhdGlvbnMgcmVmZXIgdG8gdGhlIHNhbWUgbG9jYXRpb24sIHplcm8KKyAqIGlmIHRoZXkgcmVmZXIgdG8gZGlmZmVyZW50IGxvY2F0aW9ucy4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfZXF1YWxMb2NhdGlvbnMoQ1hTb3VyY2VMb2NhdGlvbiBsb2MxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hTb3VyY2VMb2NhdGlvbiBsb2MyKTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmVzIHRoZSBzb3VyY2UgbG9jYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZmlsZS9saW5lL2NvbHVtbgorICogaW4gYSBwYXJ0aWN1bGFyIHRyYW5zbGF0aW9uIHVuaXQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU291cmNlTG9jYXRpb24gY2xhbmdfZ2V0TG9jYXRpb24oQ1hUcmFuc2xhdGlvblVuaXQgdHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb2x1bW4pOworLyoqCisgKiBcYnJpZWYgUmV0cmlldmVzIHRoZSBzb3VyY2UgbG9jYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gY2hhcmFjdGVyIG9mZnNldAorICogaW4gYSBwYXJ0aWN1bGFyIHRyYW5zbGF0aW9uIHVuaXQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU291cmNlTG9jYXRpb24gY2xhbmdfZ2V0TG9jYXRpb25Gb3JPZmZzZXQoQ1hUcmFuc2xhdGlvblVuaXQgdHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBvZmZzZXQpOworCisvKioKKyAqIFxicmllZiBSZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBnaXZlbiBzb3VyY2UgbG9jYXRpb24gaXMgaW4gYSBzeXN0ZW0gaGVhZGVyLgorICovCitDSU5ERVhfTElOS0FHRSBpbnQgY2xhbmdfTG9jYXRpb25faXNJblN5c3RlbUhlYWRlcihDWFNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJucyBub24temVybyBpZiB0aGUgZ2l2ZW4gc291cmNlIGxvY2F0aW9uIGlzIGluIHRoZSBtYWluIGZpbGUgb2YKKyAqIHRoZSBjb3JyZXNwb25kaW5nIHRyYW5zbGF0aW9uIHVuaXQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGludCBjbGFuZ19Mb2NhdGlvbl9pc0Zyb21NYWluRmlsZShDWFNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uKTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgYSBOVUxMIChpbnZhbGlkKSBzb3VyY2UgcmFuZ2UuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU291cmNlUmFuZ2UgY2xhbmdfZ2V0TnVsbFJhbmdlKHZvaWQpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSBhIHNvdXJjZSByYW5nZSBnaXZlbiB0aGUgYmVnaW5uaW5nIGFuZCBlbmRpbmcgc291cmNlCisgKiBsb2NhdGlvbnMuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU291cmNlUmFuZ2UgY2xhbmdfZ2V0UmFuZ2UoQ1hTb3VyY2VMb2NhdGlvbiBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hTb3VyY2VMb2NhdGlvbiBlbmQpOworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0d28gcmFuZ2VzIGFyZSBlcXVpdmFsZW50LgorICoKKyAqIFxyZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSByYW5nZXMgYXJlIHRoZSBzYW1lLCB6ZXJvIGlmIHRoZXkgZGlmZmVyLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19lcXVhbFJhbmdlcyhDWFNvdXJjZVJhbmdlIHJhbmdlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYU291cmNlUmFuZ2UgcmFuZ2UyKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJucyBub24temVybyBpZiBccCByYW5nZSBpcyBudWxsLgorICovCitDSU5ERVhfTElOS0FHRSBpbnQgY2xhbmdfUmFuZ2VfaXNOdWxsKENYU291cmNlUmFuZ2UgcmFuZ2UpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgZmlsZSwgbGluZSwgY29sdW1uLCBhbmQgb2Zmc2V0IHJlcHJlc2VudGVkIGJ5CisgKiB0aGUgZ2l2ZW4gc291cmNlIGxvY2F0aW9uLgorICoKKyAqIElmIHRoZSBsb2NhdGlvbiByZWZlcnMgaW50byBhIG1hY3JvIGV4cGFuc2lvbiwgcmV0cmlldmVzIHRoZQorICogbG9jYXRpb24gb2YgdGhlIG1hY3JvIGV4cGFuc2lvbi4KKyAqCisgKiBccGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIHdpdGhpbiBhIHNvdXJjZSBmaWxlIHRoYXQgd2lsbCBiZSBkZWNvbXBvc2VkCisgKiBpbnRvIGl0cyBwYXJ0cy4KKyAqCisgKiBccGFyYW0gZmlsZSBbb3V0XSBpZiBub24tTlVMTCwgd2lsbCBiZSBzZXQgdG8gdGhlIGZpbGUgdG8gd2hpY2ggdGhlIGdpdmVuCisgKiBzb3VyY2UgbG9jYXRpb24gcG9pbnRzLgorICoKKyAqIFxwYXJhbSBsaW5lIFtvdXRdIGlmIG5vbi1OVUxMLCB3aWxsIGJlIHNldCB0byB0aGUgbGluZSB0byB3aGljaCB0aGUgZ2l2ZW4KKyAqIHNvdXJjZSBsb2NhdGlvbiBwb2ludHMuCisgKgorICogXHBhcmFtIGNvbHVtbiBbb3V0XSBpZiBub24tTlVMTCwgd2lsbCBiZSBzZXQgdG8gdGhlIGNvbHVtbiB0byB3aGljaCB0aGUgZ2l2ZW4KKyAqIHNvdXJjZSBsb2NhdGlvbiBwb2ludHMuCisgKgorICogXHBhcmFtIG9mZnNldCBbb3V0XSBpZiBub24tTlVMTCwgd2lsbCBiZSBzZXQgdG8gdGhlIG9mZnNldCBpbnRvIHRoZQorICogYnVmZmVyIHRvIHdoaWNoIHRoZSBnaXZlbiBzb3VyY2UgbG9jYXRpb24gcG9pbnRzLgorICovCitDSU5ERVhfTElOS0FHRSB2b2lkIGNsYW5nX2dldEV4cGFuc2lvbkxvY2F0aW9uKENYU291cmNlTG9jYXRpb24gbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRmlsZSAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpjb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpvZmZzZXQpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgZmlsZSwgbGluZSBhbmQgY29sdW1uIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBzb3VyY2UKKyAqIGxvY2F0aW9uLCBhcyBzcGVjaWZpZWQgaW4gYSAjIGxpbmUgZGlyZWN0aXZlLgorICoKKyAqIEV4YW1wbGU6IGdpdmVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGNvZGUgaW4gYSBmaWxlIHNvbWVmaWxlLmMKKyAqCisgKiBcY29kZQorICogIzEyMyAiZHVtbXkuYyIgMQorICoKKyAqIHN0YXRpYyBpbnQgZnVuYyh2b2lkKQorICogeworICogICAgIHJldHVybiAwOworICogfQorICogXGVuZGNvZGUKKyAqCisgKiB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiB3b3VsZCBiZQorICoKKyAqIEZpbGU6IGR1bW15LmMgTGluZTogMTI0IENvbHVtbjogMTIKKyAqCisgKiB3aGVyZWFzIGNsYW5nX2dldEV4cGFuc2lvbkxvY2F0aW9uIHdvdWxkIGhhdmUgcmV0dXJuZWQKKyAqCisgKiBGaWxlOiBzb21lZmlsZS5jIExpbmU6IDMgQ29sdW1uOiAxMgorICoKKyAqIFxwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gd2l0aGluIGEgc291cmNlIGZpbGUgdGhhdCB3aWxsIGJlIGRlY29tcG9zZWQKKyAqIGludG8gaXRzIHBhcnRzLgorICoKKyAqIFxwYXJhbSBmaWxlbmFtZSBbb3V0XSBpZiBub24tTlVMTCwgd2lsbCBiZSBzZXQgdG8gdGhlIGZpbGVuYW1lIG9mIHRoZQorICogc291cmNlIGxvY2F0aW9uLiBOb3RlIHRoYXQgZmlsZW5hbWVzIHJldHVybmVkIHdpbGwgYmUgZm9yICJ2aXJ0dWFsIiBmaWxlcywKKyAqIHdoaWNoIGRvbid0IG5lY2Vzc2FyaWx5IGV4aXN0IG9uIHRoZSBtYWNoaW5lIHJ1bm5pbmcgY2xhbmcgLSBlLmcuIHdoZW4KKyAqIHBhcnNpbmcgcHJlcHJvY2Vzc2VkIG91dHB1dCBvYnRhaW5lZCBmcm9tIGEgZGlmZmVyZW50IGVudmlyb25tZW50LiBJZgorICogYSBub24tTlVMTCB2YWx1ZSBpcyBwYXNzZWQgaW4sIHJlbWVtYmVyIHRvIGRpc3Bvc2Ugb2YgdGhlIHJldHVybmVkIHZhbHVlCisgKiB1c2luZyBcYyBjbGFuZ19kaXNwb3NlU3RyaW5nKCkgb25jZSB5b3UndmUgZmluaXNoZWQgd2l0aCBpdC4gRm9yIGFuIGludmFsaWQKKyAqIHNvdXJjZSBsb2NhdGlvbiwgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgorICoKKyAqIFxwYXJhbSBsaW5lIFtvdXRdIGlmIG5vbi1OVUxMLCB3aWxsIGJlIHNldCB0byB0aGUgbGluZSBudW1iZXIgb2YgdGhlCisgKiBzb3VyY2UgbG9jYXRpb24uIEZvciBhbiBpbnZhbGlkIHNvdXJjZSBsb2NhdGlvbiwgemVybyBpcyByZXR1cm5lZC4KKyAqCisgKiBccGFyYW0gY29sdW1uIFtvdXRdIGlmIG5vbi1OVUxMLCB3aWxsIGJlIHNldCB0byB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUKKyAqIHNvdXJjZSBsb2NhdGlvbi4gRm9yIGFuIGludmFsaWQgc291cmNlIGxvY2F0aW9uLCB6ZXJvIGlzIHJldHVybmVkLgorICovCitDSU5ERVhfTElOS0FHRSB2b2lkIGNsYW5nX2dldFByZXN1bWVkTG9jYXRpb24oQ1hTb3VyY2VMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFN0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmNvbHVtbik7CisKKy8qKgorICogXGJyaWVmIExlZ2FjeSBBUEkgdG8gcmV0cmlldmUgdGhlIGZpbGUsIGxpbmUsIGNvbHVtbiwgYW5kIG9mZnNldCByZXByZXNlbnRlZAorICogYnkgdGhlIGdpdmVuIHNvdXJjZSBsb2NhdGlvbi4KKyAqCisgKiBUaGlzIGludGVyZmFjZSBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgbmV3ZXIgaW50ZXJmYWNlCisgKiAjY2xhbmdfZ2V0RXhwYW5zaW9uTG9jYXRpb24oKS4gU2VlIHRoYXQgaW50ZXJmYWNlJ3MgZG9jdW1lbnRhdGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHZvaWQgY2xhbmdfZ2V0SW5zdGFudGlhdGlvbkxvY2F0aW9uKENYU291cmNlTG9jYXRpb24gbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZpbGUgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpjb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqb2Zmc2V0KTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIGZpbGUsIGxpbmUsIGNvbHVtbiwgYW5kIG9mZnNldCByZXByZXNlbnRlZCBieQorICogdGhlIGdpdmVuIHNvdXJjZSBsb2NhdGlvbi4KKyAqCisgKiBJZiB0aGUgbG9jYXRpb24gcmVmZXJzIGludG8gYSBtYWNybyBpbnN0YW50aWF0aW9uLCByZXR1cm4gd2hlcmUgdGhlCisgKiBsb2NhdGlvbiB3YXMgb3JpZ2luYWxseSBzcGVsbGVkIGluIHRoZSBzb3VyY2UgZmlsZS4KKyAqCisgKiBccGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIHdpdGhpbiBhIHNvdXJjZSBmaWxlIHRoYXQgd2lsbCBiZSBkZWNvbXBvc2VkCisgKiBpbnRvIGl0cyBwYXJ0cy4KKyAqCisgKiBccGFyYW0gZmlsZSBbb3V0XSBpZiBub24tTlVMTCwgd2lsbCBiZSBzZXQgdG8gdGhlIGZpbGUgdG8gd2hpY2ggdGhlIGdpdmVuCisgKiBzb3VyY2UgbG9jYXRpb24gcG9pbnRzLgorICoKKyAqIFxwYXJhbSBsaW5lIFtvdXRdIGlmIG5vbi1OVUxMLCB3aWxsIGJlIHNldCB0byB0aGUgbGluZSB0byB3aGljaCB0aGUgZ2l2ZW4KKyAqIHNvdXJjZSBsb2NhdGlvbiBwb2ludHMuCisgKgorICogXHBhcmFtIGNvbHVtbiBbb3V0XSBpZiBub24tTlVMTCwgd2lsbCBiZSBzZXQgdG8gdGhlIGNvbHVtbiB0byB3aGljaCB0aGUgZ2l2ZW4KKyAqIHNvdXJjZSBsb2NhdGlvbiBwb2ludHMuCisgKgorICogXHBhcmFtIG9mZnNldCBbb3V0XSBpZiBub24tTlVMTCwgd2lsbCBiZSBzZXQgdG8gdGhlIG9mZnNldCBpbnRvIHRoZQorICogYnVmZmVyIHRvIHdoaWNoIHRoZSBnaXZlbiBzb3VyY2UgbG9jYXRpb24gcG9pbnRzLgorICovCitDSU5ERVhfTElOS0FHRSB2b2lkIGNsYW5nX2dldFNwZWxsaW5nTG9jYXRpb24oQ1hTb3VyY2VMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZpbGUgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqb2Zmc2V0KTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIGZpbGUsIGxpbmUsIGNvbHVtbiwgYW5kIG9mZnNldCByZXByZXNlbnRlZCBieQorICogdGhlIGdpdmVuIHNvdXJjZSBsb2NhdGlvbi4KKyAqCisgKiBJZiB0aGUgbG9jYXRpb24gcmVmZXJzIGludG8gYSBtYWNybyBleHBhbnNpb24sIHJldHVybiB3aGVyZSB0aGUgbWFjcm8gd2FzCisgKiBleHBhbmRlZCBvciB3aGVyZSB0aGUgbWFjcm8gYXJndW1lbnQgd2FzIHdyaXR0ZW4sIGlmIHRoZSBsb2NhdGlvbiBwb2ludHMgYXQKKyAqIGEgbWFjcm8gYXJndW1lbnQuCisgKgorICogXHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiB3aXRoaW4gYSBzb3VyY2UgZmlsZSB0aGF0IHdpbGwgYmUgZGVjb21wb3NlZAorICogaW50byBpdHMgcGFydHMuCisgKgorICogXHBhcmFtIGZpbGUgW291dF0gaWYgbm9uLU5VTEwsIHdpbGwgYmUgc2V0IHRvIHRoZSBmaWxlIHRvIHdoaWNoIHRoZSBnaXZlbgorICogc291cmNlIGxvY2F0aW9uIHBvaW50cy4KKyAqCisgKiBccGFyYW0gbGluZSBbb3V0XSBpZiBub24tTlVMTCwgd2lsbCBiZSBzZXQgdG8gdGhlIGxpbmUgdG8gd2hpY2ggdGhlIGdpdmVuCisgKiBzb3VyY2UgbG9jYXRpb24gcG9pbnRzLgorICoKKyAqIFxwYXJhbSBjb2x1bW4gW291dF0gaWYgbm9uLU5VTEwsIHdpbGwgYmUgc2V0IHRvIHRoZSBjb2x1bW4gdG8gd2hpY2ggdGhlIGdpdmVuCisgKiBzb3VyY2UgbG9jYXRpb24gcG9pbnRzLgorICoKKyAqIFxwYXJhbSBvZmZzZXQgW291dF0gaWYgbm9uLU5VTEwsIHdpbGwgYmUgc2V0IHRvIHRoZSBvZmZzZXQgaW50byB0aGUKKyAqIGJ1ZmZlciB0byB3aGljaCB0aGUgZ2l2ZW4gc291cmNlIGxvY2F0aW9uIHBvaW50cy4KKyAqLworQ0lOREVYX0xJTktBR0Ugdm9pZCBjbGFuZ19nZXRGaWxlTG9jYXRpb24oQ1hTb3VyY2VMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRmlsZSAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpvZmZzZXQpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSBhIHNvdXJjZSBsb2NhdGlvbiByZXByZXNlbnRpbmcgdGhlIGZpcnN0IGNoYXJhY3RlciB3aXRoaW4gYQorICogc291cmNlIHJhbmdlLgorICovCitDSU5ERVhfTElOS0FHRSBDWFNvdXJjZUxvY2F0aW9uIGNsYW5nX2dldFJhbmdlU3RhcnQoQ1hTb3VyY2VSYW5nZSByYW5nZSk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIGEgc291cmNlIGxvY2F0aW9uIHJlcHJlc2VudGluZyB0aGUgbGFzdCBjaGFyYWN0ZXIgd2l0aGluIGEKKyAqIHNvdXJjZSByYW5nZS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTb3VyY2VMb2NhdGlvbiBjbGFuZ19nZXRSYW5nZUVuZChDWFNvdXJjZVJhbmdlIHJhbmdlKTsKKworLyoqCisgKiBcYnJpZWYgSWRlbnRpZmllcyBhbiBhcnJheSBvZiByYW5nZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgLyoqIFxicmllZiBUaGUgbnVtYmVyIG9mIHJhbmdlcyBpbiB0aGUgXGMgcmFuZ2VzIGFycmF5LiAqLworICB1bnNpZ25lZCBjb3VudDsKKyAgLyoqCisgICAqIFxicmllZiBBbiBhcnJheSBvZiBcYyBDWFNvdXJjZVJhbmdlcy4KKyAgICovCisgIENYU291cmNlUmFuZ2UgKnJhbmdlczsKK30gQ1hTb3VyY2VSYW5nZUxpc3Q7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIGFsbCByYW5nZXMgdGhhdCB3ZXJlIHNraXBwZWQgYnkgdGhlIHByZXByb2Nlc3Nvci4KKyAqCisgKiBUaGUgcHJlcHJvY2Vzc29yIHdpbGwgc2tpcCBsaW5lcyB3aGVuIHRoZXkgYXJlIHN1cnJvdW5kZWQgYnkgYW4KKyAqIGlmL2lmZGVmL2lmbmRlZiBkaXJlY3RpdmUgd2hvc2UgY29uZGl0aW9uIGRvZXMgbm90IGV2YWx1YXRlIHRvIHRydWUuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU291cmNlUmFuZ2VMaXN0ICpjbGFuZ19nZXRTa2lwcGVkUmFuZ2VzKENYVHJhbnNsYXRpb25Vbml0IHR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGaWxlIGZpbGUpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSBhbGwgcmFuZ2VzIGZyb20gYWxsIGZpbGVzIHRoYXQgd2VyZSBza2lwcGVkIGJ5IHRoZQorICogcHJlcHJvY2Vzc29yLgorICoKKyAqIFRoZSBwcmVwcm9jZXNzb3Igd2lsbCBza2lwIGxpbmVzIHdoZW4gdGhleSBhcmUgc3Vycm91bmRlZCBieSBhbgorICogaWYvaWZkZWYvaWZuZGVmIGRpcmVjdGl2ZSB3aG9zZSBjb25kaXRpb24gZG9lcyBub3QgZXZhbHVhdGUgdG8gdHJ1ZS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTb3VyY2VSYW5nZUxpc3QgKmNsYW5nX2dldEFsbFNraXBwZWRSYW5nZXMoQ1hUcmFuc2xhdGlvblVuaXQgdHUpOworCisvKioKKyAqIFxicmllZiBEZXN0cm95IHRoZSBnaXZlbiBcYyBDWFNvdXJjZVJhbmdlTGlzdC4KKyAqLworQ0lOREVYX0xJTktBR0Ugdm9pZCBjbGFuZ19kaXNwb3NlU291cmNlUmFuZ2VMaXN0KENYU291cmNlUmFuZ2VMaXN0ICpyYW5nZXMpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgQ0lOREVYX0RJQUcgRGlhZ25vc3RpYyByZXBvcnRpbmcKKyAqCisgKiBAeworICovCisKKy8qKgorICogXGJyaWVmIERlc2NyaWJlcyB0aGUgc2V2ZXJpdHkgb2YgYSBwYXJ0aWN1bGFyIGRpYWdub3N0aWMuCisgKi8KK2VudW0gQ1hEaWFnbm9zdGljU2V2ZXJpdHkgeworICAvKioKKyAgICogXGJyaWVmIEEgZGlhZ25vc3RpYyB0aGF0IGhhcyBiZWVuIHN1cHByZXNzZWQsIGUuZy4sIGJ5IGEgY29tbWFuZC1saW5lCisgICAqIG9wdGlvbi4KKyAgICovCisgIENYRGlhZ25vc3RpY19JZ25vcmVkID0gMCwKKworICAvKioKKyAgICogXGJyaWVmIFRoaXMgZGlhZ25vc3RpYyBpcyBhIG5vdGUgdGhhdCBzaG91bGQgYmUgYXR0YWNoZWQgdG8gdGhlCisgICAqIHByZXZpb3VzIChub24tbm90ZSkgZGlhZ25vc3RpYy4KKyAgICovCisgIENYRGlhZ25vc3RpY19Ob3RlICAgID0gMSwKKworICAvKioKKyAgICogXGJyaWVmIFRoaXMgZGlhZ25vc3RpYyBpbmRpY2F0ZXMgc3VzcGljaW91cyBjb2RlIHRoYXQgbWF5IG5vdCBiZQorICAgKiB3cm9uZy4KKyAgICovCisgIENYRGlhZ25vc3RpY19XYXJuaW5nID0gMiwKKworICAvKioKKyAgICogXGJyaWVmIFRoaXMgZGlhZ25vc3RpYyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29kZSBpcyBpbGwtZm9ybWVkLgorICAgKi8KKyAgQ1hEaWFnbm9zdGljX0Vycm9yICAgPSAzLAorCisgIC8qKgorICAgKiBcYnJpZWYgVGhpcyBkaWFnbm9zdGljIGluZGljYXRlcyB0aGF0IHRoZSBjb2RlIGlzIGlsbC1mb3JtZWQgc3VjaAorICAgKiB0aGF0IGZ1dHVyZSBwYXJzZXIgcmVjb3ZlcnkgaXMgdW5saWtlbHkgdG8gcHJvZHVjZSB1c2VmdWwKKyAgICogcmVzdWx0cy4KKyAgICovCisgIENYRGlhZ25vc3RpY19GYXRhbCAgID0gNAorfTsKKworLyoqCisgKiBcYnJpZWYgQSBzaW5nbGUgZGlhZ25vc3RpYywgY29udGFpbmluZyB0aGUgZGlhZ25vc3RpYydzIHNldmVyaXR5LAorICogbG9jYXRpb24sIHRleHQsIHNvdXJjZSByYW5nZXMsIGFuZCBmaXgtaXQgaGludHMuCisgKi8KK3R5cGVkZWYgdm9pZCAqQ1hEaWFnbm9zdGljOworCisvKioKKyAqIFxicmllZiBBIGdyb3VwIG9mIENYRGlhZ25vc3RpY3MuCisgKi8KK3R5cGVkZWYgdm9pZCAqQ1hEaWFnbm9zdGljU2V0OworICAKKy8qKgorICogXGJyaWVmIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGRpYWdub3N0aWNzIGluIGEgQ1hEaWFnbm9zdGljU2V0LgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19nZXROdW1EaWFnbm9zdGljc0luU2V0KENYRGlhZ25vc3RpY1NldCBEaWFncyk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIGEgZGlhZ25vc3RpYyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIENYRGlhZ25vc3RpY1NldC4KKyAqCisgKiBccGFyYW0gRGlhZ3MgdGhlIENYRGlhZ25vc3RpY1NldCB0byBxdWVyeS4KKyAqIFxwYXJhbSBJbmRleCB0aGUgemVyby1iYXNlZCBkaWFnbm9zdGljIG51bWJlciB0byByZXRyaWV2ZS4KKyAqCisgKiBccmV0dXJucyB0aGUgcmVxdWVzdGVkIGRpYWdub3N0aWMuIFRoaXMgZGlhZ25vc3RpYyBtdXN0IGJlIGZyZWVkCisgKiB2aWEgYSBjYWxsIHRvIFxjIGNsYW5nX2Rpc3Bvc2VEaWFnbm9zdGljKCkuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYRGlhZ25vc3RpYyBjbGFuZ19nZXREaWFnbm9zdGljSW5TZXQoQ1hEaWFnbm9zdGljU2V0IERpYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRleCk7ICAKKworLyoqCisgKiBcYnJpZWYgRGVzY3JpYmVzIHRoZSBraW5kIG9mIGVycm9yIHRoYXQgb2NjdXJyZWQgKGlmIGFueSkgaW4gYSBjYWxsIHRvCisgKiBcYyBjbGFuZ19sb2FkRGlhZ25vc3RpY3MuCisgKi8KK2VudW0gQ1hMb2FkRGlhZ19FcnJvciB7CisgIC8qKgorICAgKiBcYnJpZWYgSW5kaWNhdGVzIHRoYXQgbm8gZXJyb3Igb2NjdXJyZWQuCisgICAqLworICBDWExvYWREaWFnX05vbmUgPSAwLAorICAKKyAgLyoqCisgICAqIFxicmllZiBJbmRpY2F0ZXMgdGhhdCBhbiB1bmtub3duIGVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8KKyAgICogZGVzZXJpYWxpemUgZGlhZ25vc3RpY3MuCisgICAqLworICBDWExvYWREaWFnX1Vua25vd24gPSAxLAorICAKKyAgLyoqCisgICAqIFxicmllZiBJbmRpY2F0ZXMgdGhhdCB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBzZXJpYWxpemVkIGRpYWdub3N0aWNzCisgICAqIGNvdWxkIG5vdCBiZSBvcGVuZWQuCisgICAqLworICBDWExvYWREaWFnX0Nhbm5vdExvYWQgPSAyLAorICAKKyAgLyoqCisgICAqIFxicmllZiBJbmRpY2F0ZXMgdGhhdCB0aGUgc2VyaWFsaXplZCBkaWFnbm9zdGljcyBmaWxlIGlzIGludmFsaWQgb3IKKyAgICogY29ycnVwdC4KKyAgICovCisgIENYTG9hZERpYWdfSW52YWxpZEZpbGUgPSAzCit9OworICAKKy8qKgorICogXGJyaWVmIERlc2VyaWFsaXplIGEgc2V0IG9mIGRpYWdub3N0aWNzIGZyb20gYSBDbGFuZyBkaWFnbm9zdGljcyBiaXRjb2RlCisgKiBmaWxlLgorICoKKyAqIFxwYXJhbSBmaWxlIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGRlc2VyaWFsaXplLgorICogXHBhcmFtIGVycm9yIEEgcG9pbnRlciB0byBhIGVudW0gdmFsdWUgcmVjb3JkaW5nIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0KKyAqICAgICAgICBkZXNlcmlhbGl6aW5nIHRoZSBkaWFnbm9zdGljcy4KKyAqIFxwYXJhbSBlcnJvclN0cmluZyBBIHBvaW50ZXIgdG8gYSBDWFN0cmluZyBmb3IgcmVjb3JkaW5nIHRoZSBlcnJvciBzdHJpbmcKKyAqICAgICAgICBpZiB0aGUgZmlsZSB3YXMgbm90IHN1Y2Nlc3NmdWxseSBsb2FkZWQuCisgKgorICogXHJldHVybnMgQSBsb2FkZWQgQ1hEaWFnbm9zdGljU2V0IGlmIHN1Y2Nlc3NmdWwsIGFuZCBOVUxMIG90aGVyd2lzZS4gIFRoZXNlCisgKiBkaWFnbm9zdGljcyBzaG91bGQgYmUgcmVsZWFzZWQgdXNpbmcgY2xhbmdfZGlzcG9zZURpYWdub3N0aWNTZXQoKS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hEaWFnbm9zdGljU2V0IGNsYW5nX2xvYWREaWFnbm9zdGljcyhjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIENYTG9hZERpYWdfRXJyb3IgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFN0cmluZyAqZXJyb3JTdHJpbmcpOworCisvKioKKyAqIFxicmllZiBSZWxlYXNlIGEgQ1hEaWFnbm9zdGljU2V0IGFuZCBhbGwgb2YgaXRzIGNvbnRhaW5lZCBkaWFnbm9zdGljcy4KKyAqLworQ0lOREVYX0xJTktBR0Ugdm9pZCBjbGFuZ19kaXNwb3NlRGlhZ25vc3RpY1NldChDWERpYWdub3N0aWNTZXQgRGlhZ3MpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgY2hpbGQgZGlhZ25vc3RpY3Mgb2YgYSBDWERpYWdub3N0aWMuIAorICoKKyAqIFRoaXMgQ1hEaWFnbm9zdGljU2V0IGRvZXMgbm90IG5lZWQgdG8gYmUgcmVsZWFzZWQgYnkKKyAqIGNsYW5nX2Rpc3Bvc2VEaWFnbm9zdGljU2V0LgorICovCitDSU5ERVhfTElOS0FHRSBDWERpYWdub3N0aWNTZXQgY2xhbmdfZ2V0Q2hpbGREaWFnbm9zdGljcyhDWERpYWdub3N0aWMgRCk7CisKKy8qKgorICogXGJyaWVmIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGRpYWdub3N0aWNzIHByb2R1Y2VkIGZvciB0aGUgZ2l2ZW4KKyAqIHRyYW5zbGF0aW9uIHVuaXQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX2dldE51bURpYWdub3N0aWNzKENYVHJhbnNsYXRpb25Vbml0IFVuaXQpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSBhIGRpYWdub3N0aWMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB1bml0LgorICoKKyAqIFxwYXJhbSBVbml0IHRoZSB0cmFuc2xhdGlvbiB1bml0IHRvIHF1ZXJ5LgorICogXHBhcmFtIEluZGV4IHRoZSB6ZXJvLWJhc2VkIGRpYWdub3N0aWMgbnVtYmVyIHRvIHJldHJpZXZlLgorICoKKyAqIFxyZXR1cm5zIHRoZSByZXF1ZXN0ZWQgZGlhZ25vc3RpYy4gVGhpcyBkaWFnbm9zdGljIG11c3QgYmUgZnJlZWQKKyAqIHZpYSBhIGNhbGwgdG8gXGMgY2xhbmdfZGlzcG9zZURpYWdub3N0aWMoKS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hEaWFnbm9zdGljIGNsYW5nX2dldERpYWdub3N0aWMoQ1hUcmFuc2xhdGlvblVuaXQgVW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGV4KTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIGNvbXBsZXRlIHNldCBvZiBkaWFnbm9zdGljcyBhc3NvY2lhdGVkIHdpdGggYQorICogICAgICAgIHRyYW5zbGF0aW9uIHVuaXQuCisgKgorICogXHBhcmFtIFVuaXQgdGhlIHRyYW5zbGF0aW9uIHVuaXQgdG8gcXVlcnkuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYRGlhZ25vc3RpY1NldAorICBjbGFuZ19nZXREaWFnbm9zdGljU2V0RnJvbVRVKENYVHJhbnNsYXRpb25Vbml0IFVuaXQpOyAgCisKKy8qKgorICogXGJyaWVmIERlc3Ryb3kgYSBkaWFnbm9zdGljLgorICovCitDSU5ERVhfTElOS0FHRSB2b2lkIGNsYW5nX2Rpc3Bvc2VEaWFnbm9zdGljKENYRGlhZ25vc3RpYyBEaWFnbm9zdGljKTsKKworLyoqCisgKiBcYnJpZWYgT3B0aW9ucyB0byBjb250cm9sIHRoZSBkaXNwbGF5IG9mIGRpYWdub3N0aWNzLgorICoKKyAqIFRoZSB2YWx1ZXMgaW4gdGhpcyBlbnVtIGFyZSBtZWFudCB0byBiZSBjb21iaW5lZCB0byBjdXN0b21pemUgdGhlCisgKiBiZWhhdmlvciBvZiBcYyBjbGFuZ19mb3JtYXREaWFnbm9zdGljKCkuCisgKi8KK2VudW0gQ1hEaWFnbm9zdGljRGlzcGxheU9wdGlvbnMgeworICAvKioKKyAgICogXGJyaWVmIERpc3BsYXkgdGhlIHNvdXJjZS1sb2NhdGlvbiBpbmZvcm1hdGlvbiB3aGVyZSB0aGUKKyAgICogZGlhZ25vc3RpYyB3YXMgbG9jYXRlZC4KKyAgICoKKyAgICogV2hlbiBzZXQsIGRpYWdub3N0aWNzIHdpbGwgYmUgcHJlZml4ZWQgYnkgdGhlIGZpbGUsIGxpbmUsIGFuZAorICAgKiAob3B0aW9uYWxseSkgY29sdW1uIHRvIHdoaWNoIHRoZSBkaWFnbm9zdGljIHJlZmVycy4gRm9yIGV4YW1wbGUsCisgICAqCisgICAqIFxjb2RlCisgICAqIHRlc3QuYzoyODogd2FybmluZzogZXh0cmEgdG9rZW5zIGF0IGVuZCBvZiAjZW5kaWYgZGlyZWN0aXZlCisgICAqIFxlbmRjb2RlCisgICAqCisgICAqIFRoaXMgb3B0aW9uIGNvcnJlc3BvbmRzIHRvIHRoZSBjbGFuZyBmbGFnIFxjIC1mc2hvdy1zb3VyY2UtbG9jYXRpb24uCisgICAqLworICBDWERpYWdub3N0aWNfRGlzcGxheVNvdXJjZUxvY2F0aW9uID0gMHgwMSwKKworICAvKioKKyAgICogXGJyaWVmIElmIGRpc3BsYXlpbmcgdGhlIHNvdXJjZS1sb2NhdGlvbiBpbmZvcm1hdGlvbiBvZiB0aGUKKyAgICogZGlhZ25vc3RpYywgYWxzbyBpbmNsdWRlIHRoZSBjb2x1bW4gbnVtYmVyLgorICAgKgorICAgKiBUaGlzIG9wdGlvbiBjb3JyZXNwb25kcyB0byB0aGUgY2xhbmcgZmxhZyBcYyAtZnNob3ctY29sdW1uLgorICAgKi8KKyAgQ1hEaWFnbm9zdGljX0Rpc3BsYXlDb2x1bW4gPSAweDAyLAorCisgIC8qKgorICAgKiBcYnJpZWYgSWYgZGlzcGxheWluZyB0aGUgc291cmNlLWxvY2F0aW9uIGluZm9ybWF0aW9uIG9mIHRoZQorICAgKiBkaWFnbm9zdGljLCBhbHNvIGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgc291cmNlIHJhbmdlcyBpbiBhCisgICAqIG1hY2hpbmUtcGFyc2FibGUgZm9ybWF0LgorICAgKgorICAgKiBUaGlzIG9wdGlvbiBjb3JyZXNwb25kcyB0byB0aGUgY2xhbmcgZmxhZworICAgKiBcYyAtZmRpYWdub3N0aWNzLXByaW50LXNvdXJjZS1yYW5nZS1pbmZvLgorICAgKi8KKyAgQ1hEaWFnbm9zdGljX0Rpc3BsYXlTb3VyY2VSYW5nZXMgPSAweDA0LAorICAKKyAgLyoqCisgICAqIFxicmllZiBEaXNwbGF5IHRoZSBvcHRpb24gbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBkaWFnbm9zdGljLCBpZiBhbnkuCisgICAqCisgICAqIFRoZSBvcHRpb24gbmFtZSBkaXNwbGF5ZWQgKGUuZy4sIC1XY29udmVyc2lvbikgd2lsbCBiZSBwbGFjZWQgaW4gYnJhY2tldHMKKyAgICogYWZ0ZXIgdGhlIGRpYWdub3N0aWMgdGV4dC4gVGhpcyBvcHRpb24gY29ycmVzcG9uZHMgdG8gdGhlIGNsYW5nIGZsYWcKKyAgICogXGMgLWZkaWFnbm9zdGljcy1zaG93LW9wdGlvbi4KKyAgICovCisgIENYRGlhZ25vc3RpY19EaXNwbGF5T3B0aW9uID0gMHgwOCwKKyAgCisgIC8qKgorICAgKiBcYnJpZWYgRGlzcGxheSB0aGUgY2F0ZWdvcnkgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRpYWdub3N0aWMsIGlmIGFueS4KKyAgICoKKyAgICogVGhlIGNhdGVnb3J5IG51bWJlciBpcyBkaXNwbGF5ZWQgd2l0aGluIGJyYWNrZXRzIGFmdGVyIHRoZSBkaWFnbm9zdGljIHRleHQuCisgICAqIFRoaXMgb3B0aW9uIGNvcnJlc3BvbmRzIHRvIHRoZSBjbGFuZyBmbGFnIAorICAgKiBcYyAtZmRpYWdub3N0aWNzLXNob3ctY2F0ZWdvcnk9aWQuCisgICAqLworICBDWERpYWdub3N0aWNfRGlzcGxheUNhdGVnb3J5SWQgPSAweDEwLAorCisgIC8qKgorICAgKiBcYnJpZWYgRGlzcGxheSB0aGUgY2F0ZWdvcnkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBkaWFnbm9zdGljLCBpZiBhbnkuCisgICAqCisgICAqIFRoZSBjYXRlZ29yeSBuYW1lIGlzIGRpc3BsYXllZCB3aXRoaW4gYnJhY2tldHMgYWZ0ZXIgdGhlIGRpYWdub3N0aWMgdGV4dC4KKyAgICogVGhpcyBvcHRpb24gY29ycmVzcG9uZHMgdG8gdGhlIGNsYW5nIGZsYWcgCisgICAqIFxjIC1mZGlhZ25vc3RpY3Mtc2hvdy1jYXRlZ29yeT1uYW1lLgorICAgKi8KKyAgQ1hEaWFnbm9zdGljX0Rpc3BsYXlDYXRlZ29yeU5hbWUgPSAweDIwCit9OworCisvKioKKyAqIFxicmllZiBGb3JtYXQgdGhlIGdpdmVuIGRpYWdub3N0aWMgaW4gYSBtYW5uZXIgdGhhdCBpcyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBmb3JtYXQgdGhlIGdpdmVuIGRpYWdub3N0aWMgdG8gYSBzdHJpbmcsIHJlbmRlcmluZworICogdGhlIGRpYWdub3N0aWMgYWNjb3JkaW5nIHRvIHRoZSB2YXJpb3VzIG9wdGlvbnMgZ2l2ZW4uIFRoZQorICogXGMgY2xhbmdfZGVmYXVsdERpYWdub3N0aWNEaXNwbGF5T3B0aW9ucygpIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNldCBvZgorICogb3B0aW9ucyB0aGF0IG1vc3QgY2xvc2VseSBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIHRoZSBjbGFuZyBjb21waWxlci4KKyAqCisgKiBccGFyYW0gRGlhZ25vc3RpYyBUaGUgZGlhZ25vc3RpYyB0byBwcmludC4KKyAqCisgKiBccGFyYW0gT3B0aW9ucyBBIHNldCBvZiBvcHRpb25zIHRoYXQgY29udHJvbCB0aGUgZGlhZ25vc3RpYyBkaXNwbGF5LAorICogY3JlYXRlZCBieSBjb21iaW5pbmcgXGMgQ1hEaWFnbm9zdGljRGlzcGxheU9wdGlvbnMgdmFsdWVzLgorICoKKyAqIFxyZXR1cm5zIEEgbmV3IHN0cmluZyBjb250YWluaW5nIGZvciBmb3JtYXR0ZWQgZGlhZ25vc3RpYy4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfZm9ybWF0RGlhZ25vc3RpYyhDWERpYWdub3N0aWMgRGlhZ25vc3RpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3B0aW9ucyk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBzZXQgb2YgZGlzcGxheSBvcHRpb25zIG1vc3Qgc2ltaWxhciB0byB0aGUKKyAqIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlIGNsYW5nIGNvbXBpbGVyLgorICoKKyAqIFxyZXR1cm5zIEEgc2V0IG9mIGRpc3BsYXkgb3B0aW9ucyBzdWl0YWJsZSBmb3IgdXNlIHdpdGggXGMKKyAqIGNsYW5nX2Zvcm1hdERpYWdub3N0aWMoKS4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfZGVmYXVsdERpYWdub3N0aWNEaXNwbGF5T3B0aW9ucyh2b2lkKTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBzZXZlcml0eSBvZiB0aGUgZ2l2ZW4gZGlhZ25vc3RpYy4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWERpYWdub3N0aWNTZXZlcml0eQorY2xhbmdfZ2V0RGlhZ25vc3RpY1NldmVyaXR5KENYRGlhZ25vc3RpYyk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGdpdmVuIGRpYWdub3N0aWMuCisgKgorICogVGhpcyBsb2NhdGlvbiBpcyB3aGVyZSBDbGFuZyB3b3VsZCBwcmludCB0aGUgY2FyZXQgKCdeJykgd2hlbgorICogZGlzcGxheWluZyB0aGUgZGlhZ25vc3RpYyBvbiB0aGUgY29tbWFuZCBsaW5lLgorICovCitDSU5ERVhfTElOS0FHRSBDWFNvdXJjZUxvY2F0aW9uIGNsYW5nX2dldERpYWdub3N0aWNMb2NhdGlvbihDWERpYWdub3N0aWMpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgdGV4dCBvZiB0aGUgZ2l2ZW4gZGlhZ25vc3RpYy4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfZ2V0RGlhZ25vc3RpY1NwZWxsaW5nKENYRGlhZ25vc3RpYyk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9uIHRoYXQgZW5hYmxlZCB0aGlzCisgKiBkaWFnbm9zdGljLgorICoKKyAqIFxwYXJhbSBEaWFnIFRoZSBkaWFnbm9zdGljIHRvIGJlIHF1ZXJpZWQuCisgKgorICogXHBhcmFtIERpc2FibGUgSWYgbm9uLU5VTEwsIHdpbGwgYmUgc2V0IHRvIHRoZSBvcHRpb24gdGhhdCBkaXNhYmxlcyB0aGlzCisgKiBkaWFnbm9zdGljIChpZiBhbnkpLgorICoKKyAqIFxyZXR1cm5zIEEgc3RyaW5nIHRoYXQgY29udGFpbnMgdGhlIGNvbW1hbmQtbGluZSBvcHRpb24gdXNlZCB0byBlbmFibGUgdGhpcworICogd2FybmluZywgc3VjaCBhcyAiLVdjb252ZXJzaW9uIiBvciAiLXBlZGFudGljIi4gCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU3RyaW5nIGNsYW5nX2dldERpYWdub3N0aWNPcHRpb24oQ1hEaWFnbm9zdGljIERpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYU3RyaW5nICpEaXNhYmxlKTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIGNhdGVnb3J5IG51bWJlciBmb3IgdGhpcyBkaWFnbm9zdGljLgorICoKKyAqIERpYWdub3N0aWNzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIGdyb3VwcyBhbG9uZyB3aXRoIG90aGVyLCByZWxhdGVkCisgKiBkaWFnbm9zdGljcyAoZS5nLiwgZGlhZ25vc3RpY3MgdW5kZXIgdGhlIHNhbWUgd2FybmluZyBmbGFnKS4gVGhpcyByb3V0aW5lIAorICogcmV0cmlldmVzIHRoZSBjYXRlZ29yeSBudW1iZXIgZm9yIHRoZSBnaXZlbiBkaWFnbm9zdGljLgorICoKKyAqIFxyZXR1cm5zIFRoZSBudW1iZXIgb2YgdGhlIGNhdGVnb3J5IHRoYXQgY29udGFpbnMgdGhpcyBkaWFnbm9zdGljLCBvciB6ZXJvCisgKiBpZiB0aGlzIGRpYWdub3N0aWMgaXMgdW5jYXRlZ29yaXplZC4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfZ2V0RGlhZ25vc3RpY0NhdGVnb3J5KENYRGlhZ25vc3RpYyk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBuYW1lIG9mIGEgcGFydGljdWxhciBkaWFnbm9zdGljIGNhdGVnb3J5LiAgVGhpcworICogIGlzIG5vdyBkZXByZWNhdGVkLiAgVXNlIGNsYW5nX2dldERpYWdub3N0aWNDYXRlZ29yeVRleHQoKQorICogIGluc3RlYWQuCisgKgorICogXHBhcmFtIENhdGVnb3J5IEEgZGlhZ25vc3RpYyBjYXRlZ29yeSBudW1iZXIsIGFzIHJldHVybmVkIGJ5IAorICogXGMgY2xhbmdfZ2V0RGlhZ25vc3RpY0NhdGVnb3J5KCkuCisgKgorICogXHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIGdpdmVuIGRpYWdub3N0aWMgY2F0ZWdvcnkuCisgKi8KK0NJTkRFWF9ERVBSRUNBVEVEIENJTkRFWF9MSU5LQUdFCitDWFN0cmluZyBjbGFuZ19nZXREaWFnbm9zdGljQ2F0ZWdvcnlOYW1lKHVuc2lnbmVkIENhdGVnb3J5KTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIGRpYWdub3N0aWMgY2F0ZWdvcnkgdGV4dCBmb3IgYSBnaXZlbiBkaWFnbm9zdGljLgorICoKKyAqIFxyZXR1cm5zIFRoZSB0ZXh0IG9mIHRoZSBnaXZlbiBkaWFnbm9zdGljIGNhdGVnb3J5LgorICovCitDSU5ERVhfTElOS0FHRSBDWFN0cmluZyBjbGFuZ19nZXREaWFnbm9zdGljQ2F0ZWdvcnlUZXh0KENYRGlhZ25vc3RpYyk7CisgIAorLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygc291cmNlIHJhbmdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuCisgKiBkaWFnbm9zdGljLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19nZXREaWFnbm9zdGljTnVtUmFuZ2VzKENYRGlhZ25vc3RpYyk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIGEgc291cmNlIHJhbmdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlhZ25vc3RpYy4KKyAqCisgKiBBIGRpYWdub3N0aWMncyBzb3VyY2UgcmFuZ2VzIGhpZ2hsaWdodCBpbXBvcnRhbnQgZWxlbWVudHMgaW4gdGhlIHNvdXJjZQorICogY29kZS4gT24gdGhlIGNvbW1hbmQgbGluZSwgQ2xhbmcgZGlzcGxheXMgc291cmNlIHJhbmdlcyBieQorICogdW5kZXJsaW5pbmcgdGhlbSB3aXRoICd+JyBjaGFyYWN0ZXJzLgorICoKKyAqIFxwYXJhbSBEaWFnbm9zdGljIHRoZSBkaWFnbm9zdGljIHdob3NlIHJhbmdlIGlzIGJlaW5nIGV4dHJhY3RlZC4KKyAqCisgKiBccGFyYW0gUmFuZ2UgdGhlIHplcm8tYmFzZWQgaW5kZXggc3BlY2lmeWluZyB3aGljaCByYW5nZSB0bworICoKKyAqIFxyZXR1cm5zIHRoZSByZXF1ZXN0ZWQgc291cmNlIHJhbmdlLgorICovCitDSU5ERVhfTElOS0FHRSBDWFNvdXJjZVJhbmdlIGNsYW5nX2dldERpYWdub3N0aWNSYW5nZShDWERpYWdub3N0aWMgRGlhZ25vc3RpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJhbmdlKTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZml4LWl0IGhpbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAqIGdpdmVuIGRpYWdub3N0aWMuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX2dldERpYWdub3N0aWNOdW1GaXhJdHMoQ1hEaWFnbm9zdGljIERpYWdub3N0aWMpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgcmVwbGFjZW1lbnQgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gZml4LWl0LgorICoKKyAqIEZpeC1pdHMgYXJlIGRlc2NyaWJlZCBpbiB0ZXJtcyBvZiBhIHNvdXJjZSByYW5nZSB3aG9zZSBjb250ZW50cworICogc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgc3RyaW5nLiBUaGlzIGFwcHJvYWNoIGdlbmVyYWxpemVzIG92ZXIKKyAqIHRocmVlIGtpbmRzIG9mIG9wZXJhdGlvbnM6IHJlbW92YWwgb2Ygc291cmNlIGNvZGUgKHRoZSByYW5nZSBjb3ZlcnMKKyAqIHRoZSBjb2RlIHRvIGJlIHJlbW92ZWQgYW5kIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgaXMgZW1wdHkpLAorICogcmVwbGFjZW1lbnQgb2Ygc291cmNlIGNvZGUgKHRoZSByYW5nZSBjb3ZlcnMgdGhlIGNvZGUgdG8gYmUKKyAqIHJlcGxhY2VkIGFuZCB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nIHByb3ZpZGVzIHRoZSBuZXcgY29kZSksIGFuZAorICogaW5zZXJ0aW9uIChib3RoIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSByYW5nZSBwb2ludCBhdCB0aGUKKyAqIGluc2VydGlvbiBsb2NhdGlvbiwgYW5kIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgcHJvdmlkZXMgdGhlIHRleHQgdG8KKyAqIGluc2VydCkuCisgKgorICogXHBhcmFtIERpYWdub3N0aWMgVGhlIGRpYWdub3N0aWMgd2hvc2UgZml4LWl0cyBhcmUgYmVpbmcgcXVlcmllZC4KKyAqCisgKiBccGFyYW0gRml4SXQgVGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGZpeC1pdC4KKyAqCisgKiBccGFyYW0gUmVwbGFjZW1lbnRSYW5nZSBUaGUgc291cmNlIHJhbmdlIHdob3NlIGNvbnRlbnRzIHdpbGwgYmUKKyAqIHJlcGxhY2VkIHdpdGggdGhlIHJldHVybmVkIHJlcGxhY2VtZW50IHN0cmluZy4gTm90ZSB0aGF0IHNvdXJjZQorICogcmFuZ2VzIGFyZSBoYWxmLW9wZW4gcmFuZ2VzIFthLCBiKSwgc28gdGhlIHNvdXJjZSBjb2RlIHNob3VsZCBiZQorICogcmVwbGFjZWQgZnJvbSBhIGFuZCB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIGIuCisgKgorICogXHJldHVybnMgQSBzdHJpbmcgY29udGFpbmluZyB0ZXh0IHRoYXQgc2hvdWxkIGJlIHJlcGxhY2UgdGhlIHNvdXJjZQorICogY29kZSBpbmRpY2F0ZWQgYnkgdGhlIFxjIFJlcGxhY2VtZW50UmFuZ2UuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU3RyaW5nIGNsYW5nX2dldERpYWdub3N0aWNGaXhJdChDWERpYWdub3N0aWMgRGlhZ25vc3RpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGaXhJdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hTb3VyY2VSYW5nZSAqUmVwbGFjZW1lbnRSYW5nZSk7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIFxkZWZncm91cCBDSU5ERVhfVFJBTlNMQVRJT05fVU5JVCBUcmFuc2xhdGlvbiB1bml0IG1hbmlwdWxhdGlvbgorICoKKyAqIFRoZSByb3V0aW5lcyBpbiB0aGlzIGdyb3VwIHByb3ZpZGUgdGhlIGFiaWxpdHkgdG8gY3JlYXRlIGFuZCBkZXN0cm95CisgKiB0cmFuc2xhdGlvbiB1bml0cyBmcm9tIGZpbGVzLCBlaXRoZXIgYnkgcGFyc2luZyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVzIG9yCisgKiBieSByZWFkaW5nIGluIGEgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zbGF0aW9uIHVuaXQuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFxicmllZiBHZXQgdGhlIG9yaWdpbmFsIHRyYW5zbGF0aW9uIHVuaXQgc291cmNlIGZpbGUgbmFtZS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcKK2NsYW5nX2dldFRyYW5zbGF0aW9uVW5pdFNwZWxsaW5nKENYVHJhbnNsYXRpb25Vbml0IENUVW5pdCk7CisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgQ1hUcmFuc2xhdGlvblVuaXQgZm9yIGEgZ2l2ZW4gc291cmNlIGZpbGUgYW5kIHRoZSBwcm92aWRlZAorICogY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBvbmUgd291bGQgcGFzcyB0byB0aGUgY29tcGlsZXIuCisgKgorICogTm90ZTogVGhlICdzb3VyY2VfZmlsZW5hbWUnIGFyZ3VtZW50IGlzIG9wdGlvbmFsLiAgSWYgdGhlIGNhbGxlciBwcm92aWRlcyBhCisgKiBOVUxMIHBvaW50ZXIsIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBpcyBleHBlY3RlZCB0byByZXNpZGUgaW4gdGhlCisgKiBzcGVjaWZpZWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAqCisgKiBOb3RlOiBXaGVuIGVuY291bnRlcmVkIGluICdjbGFuZ19jb21tYW5kX2xpbmVfYXJncycsIHRoZSBmb2xsb3dpbmcgb3B0aW9ucworICogYXJlIGlnbm9yZWQ6CisgKgorICogICAnLWMnCisgKiAgICctZW1pdC1hc3QnCisgKiAgICctZnN5bnRheC1vbmx5JworICogICAnLW8gXDxvdXRwdXQgZmlsZT4nICAoYm90aCAnLW8nIGFuZCAnXDxvdXRwdXQgZmlsZT4nIGFyZSBpZ25vcmVkKQorICoKKyAqIFxwYXJhbSBDSWR4IFRoZSBpbmRleCBvYmplY3Qgd2l0aCB3aGljaCB0aGUgdHJhbnNsYXRpb24gdW5pdCB3aWxsIGJlCisgKiBhc3NvY2lhdGVkLgorICoKKyAqIFxwYXJhbSBzb3VyY2VfZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIGxvYWQsIG9yIE5VTEwgaWYgdGhlCisgKiBzb3VyY2UgZmlsZSBpcyBpbmNsdWRlZCBpbiBccCBjbGFuZ19jb21tYW5kX2xpbmVfYXJncy4KKyAqCisgKiBccGFyYW0gbnVtX2NsYW5nX2NvbW1hbmRfbGluZV9hcmdzIFRoZSBudW1iZXIgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBpbgorICogXHAgY2xhbmdfY29tbWFuZF9saW5lX2FyZ3MuCisgKgorICogXHBhcmFtIGNsYW5nX2NvbW1hbmRfbGluZV9hcmdzIFRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRoYXQgd291bGQgYmUKKyAqIHBhc3NlZCB0byB0aGUgXGMgY2xhbmcgZXhlY3V0YWJsZSBpZiBpdCB3ZXJlIGJlaW5nIGludm9rZWQgb3V0LW9mLXByb2Nlc3MuCisgKiBUaGVzZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB3aWxsIGJlIHBhcnNlZCBhbmQgd2lsbCBhZmZlY3QgaG93IHRoZSB0cmFuc2xhdGlvbgorICogdW5pdCBpcyBwYXJzZWQuIE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGlnbm9yZWQ6ICctYycsCisgKiAnLWVtaXQtYXN0JywgJy1mc3ludGF4LW9ubHknICh3aGljaCBpcyB0aGUgZGVmYXVsdCksIGFuZCAnLW8gXDxvdXRwdXQgZmlsZT4nLgorICoKKyAqIFxwYXJhbSBudW1fdW5zYXZlZF9maWxlcyB0aGUgbnVtYmVyIG9mIHVuc2F2ZWQgZmlsZSBlbnRyaWVzIGluIFxwCisgKiB1bnNhdmVkX2ZpbGVzLgorICoKKyAqIFxwYXJhbSB1bnNhdmVkX2ZpbGVzIHRoZSBmaWxlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHNhdmVkIHRvIGRpc2sKKyAqIGJ1dCBtYXkgYmUgcmVxdWlyZWQgZm9yIGNvZGUgY29tcGxldGlvbiwgaW5jbHVkaW5nIHRoZSBjb250ZW50cyBvZgorICogdGhvc2UgZmlsZXMuICBUaGUgY29udGVudHMgYW5kIG5hbWUgb2YgdGhlc2UgZmlsZXMgKGFzIHNwZWNpZmllZCBieQorICogQ1hVbnNhdmVkRmlsZSkgYXJlIGNvcGllZCB3aGVuIG5lY2Vzc2FyeSwgc28gdGhlIGNsaWVudCBvbmx5IG5lZWRzIHRvCisgKiBndWFyYW50ZWUgdGhlaXIgdmFsaWRpdHkgdW50aWwgdGhlIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiByZXR1cm5zLgorICovCitDSU5ERVhfTElOS0FHRSBDWFRyYW5zbGF0aW9uVW5pdCBjbGFuZ19jcmVhdGVUcmFuc2xhdGlvblVuaXRGcm9tU291cmNlRmlsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hJbmRleCBDSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzb3VyY2VfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY2xhbmdfY29tbWFuZF9saW5lX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqY2xhbmdfY29tbWFuZF9saW5lX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV91bnNhdmVkX2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ1hVbnNhdmVkRmlsZSAqdW5zYXZlZF9maWxlcyk7CisKKy8qKgorICogXGJyaWVmIFNhbWUgYXMgXGMgY2xhbmdfY3JlYXRlVHJhbnNsYXRpb25Vbml0MiwgYnV0IHJldHVybnMKKyAqIHRoZSBcYyBDWFRyYW5zbGF0aW9uVW5pdCBpbnN0ZWFkIG9mIGFuIGVycm9yIGNvZGUuICBJbiBjYXNlIG9mIGFuIGVycm9yIHRoaXMKKyAqIHJvdXRpbmUgcmV0dXJucyBhIFxjIE5VTEwgXGMgQ1hUcmFuc2xhdGlvblVuaXQsIHdpdGhvdXQgZnVydGhlciBkZXRhaWxlZAorICogZXJyb3IgY29kZXMuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYVHJhbnNsYXRpb25Vbml0IGNsYW5nX2NyZWF0ZVRyYW5zbGF0aW9uVW5pdCgKKyAgICBDWEluZGV4IENJZHgsCisgICAgY29uc3QgY2hhciAqYXN0X2ZpbGVuYW1lKTsKKworLyoqCisgKiBcYnJpZWYgQ3JlYXRlIGEgdHJhbnNsYXRpb24gdW5pdCBmcm9tIGFuIEFTVCBmaWxlIChcYyAtZW1pdC1hc3QpLgorICoKKyAqIFxwYXJhbVtvdXRdIG91dF9UVSBBIG5vbi1OVUxMIHBvaW50ZXIgdG8gc3RvcmUgdGhlIGNyZWF0ZWQKKyAqIFxjIENYVHJhbnNsYXRpb25Vbml0LgorICoKKyAqIFxyZXR1cm5zIFplcm8gb24gc3VjY2Vzcywgb3RoZXJ3aXNlIHJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWEVycm9yQ29kZSBjbGFuZ19jcmVhdGVUcmFuc2xhdGlvblVuaXQyKAorICAgIENYSW5kZXggQ0lkeCwKKyAgICBjb25zdCBjaGFyICphc3RfZmlsZW5hbWUsCisgICAgQ1hUcmFuc2xhdGlvblVuaXQgKm91dF9UVSk7CisKKy8qKgorICogXGJyaWVmIEZsYWdzIHRoYXQgY29udHJvbCB0aGUgY3JlYXRpb24gb2YgdHJhbnNsYXRpb24gdW5pdHMuCisgKgorICogVGhlIGVudW1lcmF0b3JzIGluIHRoaXMgZW51bWVyYXRpb24gdHlwZSBhcmUgbWVhbnQgdG8gYmUgYml0d2lzZQorICogT1JlZCB0b2dldGhlciB0byBzcGVjaWZ5IHdoaWNoIG9wdGlvbnMgc2hvdWxkIGJlIHVzZWQgd2hlbgorICogY29uc3RydWN0aW5nIHRoZSB0cmFuc2xhdGlvbiB1bml0LgorICovCitlbnVtIENYVHJhbnNsYXRpb25Vbml0X0ZsYWdzIHsKKyAgLyoqCisgICAqIFxicmllZiBVc2VkIHRvIGluZGljYXRlIHRoYXQgbm8gc3BlY2lhbCB0cmFuc2xhdGlvbi11bml0IG9wdGlvbnMgYXJlCisgICAqIG5lZWRlZC4KKyAgICovCisgIENYVHJhbnNsYXRpb25Vbml0X05vbmUgPSAweDAsCisKKyAgLyoqCisgICAqIFxicmllZiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHBhcnNlciBzaG91bGQgY29uc3RydWN0IGEgImRldGFpbGVkIgorICAgKiBwcmVwcm9jZXNzaW5nIHJlY29yZCwgaW5jbHVkaW5nIGFsbCBtYWNybyBkZWZpbml0aW9ucyBhbmQgaW5zdGFudGlhdGlvbnMuCisgICAqCisgICAqIENvbnN0cnVjdGluZyBhIGRldGFpbGVkIHByZXByb2Nlc3NpbmcgcmVjb3JkIHJlcXVpcmVzIG1vcmUgbWVtb3J5CisgICAqIGFuZCB0aW1lIHRvIHBhcnNlLCBzaW5jZSB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSByZWNvcmQKKyAgICogaXMgdXN1YWxseSBub3QgcmV0YWluZWQuIEhvd2V2ZXIsIGl0IGNhbiBiZSB1c2VmdWwgZm9yCisgICAqIGFwcGxpY2F0aW9ucyB0aGF0IHJlcXVpcmUgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICogYmVoYXZpb3Igb2YgdGhlIHByZXByb2Nlc3Nvci4KKyAgICovCisgIENYVHJhbnNsYXRpb25Vbml0X0RldGFpbGVkUHJlcHJvY2Vzc2luZ1JlY29yZCA9IDB4MDEsCisKKyAgLyoqCisgICAqIFxicmllZiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRyYW5zbGF0aW9uIHVuaXQgaXMgaW5jb21wbGV0ZS4KKyAgICoKKyAgICogV2hlbiBhIHRyYW5zbGF0aW9uIHVuaXQgaXMgY29uc2lkZXJlZCAiaW5jb21wbGV0ZSIsIHNlbWFudGljCisgICAqIGFuYWx5c2lzIHRoYXQgaXMgdHlwaWNhbGx5IHBlcmZvcm1lZCBhdCB0aGUgZW5kIG9mIHRoZQorICAgKiB0cmFuc2xhdGlvbiB1bml0IHdpbGwgYmUgc3VwcHJlc3NlZC4gRm9yIGV4YW1wbGUsIHRoaXMgc3VwcHJlc3NlcworICAgKiB0aGUgY29tcGxldGlvbiBvZiB0ZW50YXRpdmUgZGVjbGFyYXRpb25zIGluIEMgYW5kIG9mCisgICAqIGluc3RhbnRpYXRpb24gb2YgaW1wbGljaXRseS1pbnN0YW50aWF0aW9uIGZ1bmN0aW9uIHRlbXBsYXRlcyBpbgorICAgKiBDKysuIFRoaXMgb3B0aW9uIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gcGFyc2luZyBhIGhlYWRlciB3aXRoIHRoZQorICAgKiBpbnRlbnQgb2YgcHJvZHVjaW5nIGEgcHJlY29tcGlsZWQgaGVhZGVyLgorICAgKi8KKyAgQ1hUcmFuc2xhdGlvblVuaXRfSW5jb21wbGV0ZSA9IDB4MDIsCisgIAorICAvKioKKyAgICogXGJyaWVmIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdHJhbnNsYXRpb24gdW5pdCBzaG91bGQgYmUgYnVpbHQgd2l0aCBhbiAKKyAgICogaW1wbGljaXQgcHJlY29tcGlsZWQgaGVhZGVyIGZvciB0aGUgcHJlYW1ibGUuCisgICAqCisgICAqIEFuIGltcGxpY2l0IHByZWNvbXBpbGVkIGhlYWRlciBpcyB1c2VkIGFzIGFuIG9wdGltaXphdGlvbiB3aGVuIGEKKyAgICogcGFydGljdWxhciB0cmFuc2xhdGlvbiB1bml0IGlzIGxpa2VseSB0byBiZSByZXBhcnNlZCBtYW55IHRpbWVzCisgICAqIHdoZW4gdGhlIHNvdXJjZXMgYXJlbid0IGNoYW5naW5nIHRoYXQgb2Z0ZW4uIEluIHRoaXMgY2FzZSwgYW4KKyAgICogaW1wbGljaXQgcHJlY29tcGlsZWQgaGVhZGVyIHdpbGwgYmUgYnVpbHQgY29udGFpbmluZyBhbGwgb2YgdGhlCisgICAqIGluaXRpYWwgaW5jbHVkZXMgYXQgdGhlIHRvcCBvZiB0aGUgbWFpbiBmaWxlICh3aGF0IHdlIHJlZmVyIHRvIGFzCisgICAqIHRoZSAicHJlYW1ibGUiIG9mIHRoZSBmaWxlKS4gSW4gc3Vic2VxdWVudCBwYXJzZXMsIGlmIHRoZQorICAgKiBwcmVhbWJsZSBvciB0aGUgZmlsZXMgaW4gaXQgaGF2ZSBub3QgY2hhbmdlZCwgXGMKKyAgICogY2xhbmdfcmVwYXJzZVRyYW5zbGF0aW9uVW5pdCgpIHdpbGwgcmUtdXNlIHRoZSBpbXBsaWNpdAorICAgKiBwcmVjb21waWxlZCBoZWFkZXIgdG8gaW1wcm92ZSBwYXJzaW5nIHBlcmZvcm1hbmNlLgorICAgKi8KKyAgQ1hUcmFuc2xhdGlvblVuaXRfUHJlY29tcGlsZWRQcmVhbWJsZSA9IDB4MDQsCisgIAorICAvKioKKyAgICogXGJyaWVmIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdHJhbnNsYXRpb24gdW5pdCBzaG91bGQgY2FjaGUgc29tZQorICAgKiBjb2RlLWNvbXBsZXRpb24gcmVzdWx0cyB3aXRoIGVhY2ggcmVwYXJzZSBvZiB0aGUgc291cmNlIGZpbGUuCisgICAqCisgICAqIENhY2hpbmcgb2YgY29kZS1jb21wbGV0aW9uIHJlc3VsdHMgaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdGhhdAorICAgKiBpbnRyb2R1Y2VzIHNvbWUgb3ZlcmhlYWQgdG8gcmVwYXJzaW5nIGJ1dCBpbXByb3ZlcyB0aGUgcGVyZm9ybWFuY2Ugb2YKKyAgICogY29kZS1jb21wbGV0aW9uIG9wZXJhdGlvbnMuCisgICAqLworICBDWFRyYW5zbGF0aW9uVW5pdF9DYWNoZUNvbXBsZXRpb25SZXN1bHRzID0gMHgwOCwKKworICAvKioKKyAgICogXGJyaWVmIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdHJhbnNsYXRpb24gdW5pdCB3aWxsIGJlIHNlcmlhbGl6ZWQgd2l0aAorICAgKiBcYyBjbGFuZ19zYXZlVHJhbnNsYXRpb25Vbml0LgorICAgKgorICAgKiBUaGlzIG9wdGlvbiBpcyB0eXBpY2FsbHkgdXNlZCB3aGVuIHBhcnNpbmcgYSBoZWFkZXIgd2l0aCB0aGUgaW50ZW50IG9mCisgICAqIHByb2R1Y2luZyBhIHByZWNvbXBpbGVkIGhlYWRlci4KKyAgICovCisgIENYVHJhbnNsYXRpb25Vbml0X0ZvclNlcmlhbGl6YXRpb24gPSAweDEwLAorCisgIC8qKgorICAgKiBcYnJpZWYgREVQUkVDQVRFRDogRW5hYmxlZCBjaGFpbmVkIHByZWNvbXBpbGVkIHByZWFtYmxlcyBpbiBDKysuCisgICAqCisgICAqIE5vdGU6IHRoaXMgaXMgYSAqdGVtcG9yYXJ5KiBvcHRpb24gdGhhdCBpcyBhdmFpbGFibGUgb25seSB3aGlsZQorICAgKiB3ZSBhcmUgdGVzdGluZyBDKysgcHJlY29tcGlsZWQgcHJlYW1ibGUgc3VwcG9ydC4gSXQgaXMgZGVwcmVjYXRlZC4KKyAgICovCisgIENYVHJhbnNsYXRpb25Vbml0X0NYWENoYWluZWRQQ0ggPSAweDIwLAorCisgIC8qKgorICAgKiBcYnJpZWYgVXNlZCB0byBpbmRpY2F0ZSB0aGF0IGZ1bmN0aW9uL21ldGhvZCBib2RpZXMgc2hvdWxkIGJlIHNraXBwZWQgd2hpbGUKKyAgICogcGFyc2luZy4KKyAgICoKKyAgICogVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc2VhcmNoIGZvciBkZWNsYXJhdGlvbnMvZGVmaW5pdGlvbnMgd2hpbGUKKyAgICogaWdub3JpbmcgdGhlIHVzYWdlcy4KKyAgICovCisgIENYVHJhbnNsYXRpb25Vbml0X1NraXBGdW5jdGlvbkJvZGllcyA9IDB4NDAsCisKKyAgLyoqCisgICAqIFxicmllZiBVc2VkIHRvIGluZGljYXRlIHRoYXQgYnJpZWYgZG9jdW1lbnRhdGlvbiBjb21tZW50cyBzaG91bGQgYmUKKyAgICogaW5jbHVkZWQgaW50byB0aGUgc2V0IG9mIGNvZGUgY29tcGxldGlvbnMgcmV0dXJuZWQgZnJvbSB0aGlzIHRyYW5zbGF0aW9uCisgICAqIHVuaXQuCisgICAqLworICBDWFRyYW5zbGF0aW9uVW5pdF9JbmNsdWRlQnJpZWZDb21tZW50c0luQ29kZUNvbXBsZXRpb24gPSAweDgwLAorCisgIC8qKgorICAgKiBcYnJpZWYgVXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwcmVjb21waWxlZCBwcmVhbWJsZSBzaG91bGQgYmUgY3JlYXRlZCBvbgorICAgKiB0aGUgZmlyc3QgcGFyc2UuIE90aGVyd2lzZSBpdCB3aWxsIGJlIGNyZWF0ZWQgb24gdGhlIGZpcnN0IHJlcGFyc2UuIFRoaXMKKyAgICogdHJhZGVzIHJ1bnRpbWUgb24gdGhlIGZpcnN0IHBhcnNlIChzZXJpYWxpemluZyB0aGUgcHJlYW1ibGUgdGFrZXMgdGltZSkgZm9yCisgICAqIHJlZHVjZWQgcnVudGltZSBvbiB0aGUgc2Vjb25kIHBhcnNlIChjYW4gbm93IHJldXNlIHRoZSBwcmVhbWJsZSkuCisgICAqLworICBDWFRyYW5zbGF0aW9uVW5pdF9DcmVhdGVQcmVhbWJsZU9uRmlyc3RQYXJzZSA9IDB4MTAwLAorCisgIC8qKgorICAgKiBcYnJpZWYgRG8gbm90IHN0b3AgcHJvY2Vzc2luZyB3aGVuIGZhdGFsIGVycm9ycyBhcmUgZW5jb3VudGVyZWQuCisgICAqCisgICAqIFdoZW4gZmF0YWwgZXJyb3JzIGFyZSBlbmNvdW50ZXJlZCB3aGlsZSBwYXJzaW5nIGEgdHJhbnNsYXRpb24gdW5pdCwKKyAgICogc2VtYW50aWMgYW5hbHlzaXMgaXMgdHlwaWNhbGx5IHN0b3BwZWQgZWFybHkgd2hlbiBjb21waWxpbmcgY29kZS4gQSBjb21tb24KKyAgICogc291cmNlIGZvciBmYXRhbCBlcnJvcnMgYXJlIHVucmVzb2x2YWJsZSBpbmNsdWRlIGZpbGVzLiBGb3IgdGhlCisgICAqIHB1cnBvc2VzIG9mIGFuIElERSwgdGhpcyBpcyB1bmRlc2lyYWJsZSBiZWhhdmlvciBhbmQgYXMgbXVjaCBpbmZvcm1hdGlvbgorICAgKiBhcyBwb3NzaWJsZSBzaG91bGQgYmUgcmVwb3J0ZWQuIFVzZSB0aGlzIGZsYWcgdG8gZW5hYmxlIHRoaXMgYmVoYXZpb3IuCisgICAqLworICBDWFRyYW5zbGF0aW9uVW5pdF9LZWVwR29pbmcgPSAweDIwMCwKKworICAvKioKKyAgICogXGJyaWVmIFNldHMgdGhlIHByZXByb2Nlc3NvciBpbiBhIG1vZGUgZm9yIHBhcnNpbmcgYSBzaW5nbGUgZmlsZSBvbmx5LgorICAgKi8KKyAgQ1hUcmFuc2xhdGlvblVuaXRfU2luZ2xlRmlsZVBhcnNlID0gMHg0MDAKK307CisKKy8qKgorICogXGJyaWVmIFJldHVybnMgdGhlIHNldCBvZiBmbGFncyB0aGF0IGlzIHN1aXRhYmxlIGZvciBwYXJzaW5nIGEgdHJhbnNsYXRpb24KKyAqIHVuaXQgdGhhdCBpcyBiZWluZyBlZGl0ZWQuCisgKgorICogVGhlIHNldCBvZiBmbGFncyByZXR1cm5lZCBwcm92aWRlIG9wdGlvbnMgZm9yIFxjIGNsYW5nX3BhcnNlVHJhbnNsYXRpb25Vbml0KCkKKyAqIHRvIGluZGljYXRlIHRoYXQgdGhlIHRyYW5zbGF0aW9uIHVuaXQgaXMgbGlrZWx5IHRvIGJlIHJlcGFyc2VkIG1hbnkgdGltZXMsCisgKiBlaXRoZXIgZXhwbGljaXRseSAodmlhIFxjIGNsYW5nX3JlcGFyc2VUcmFuc2xhdGlvblVuaXQoKSkgb3IgaW1wbGljaXRseQorICogKGUuZy4sIGJ5IGNvZGUgY29tcGxldGlvbiAoXGMgY2xhbmdfY29kZUNvbXBsZXRpb25BdCgpKSkuIFRoZSByZXR1cm5lZCBmbGFnCisgKiBzZXQgY29udGFpbnMgYW4gdW5zcGVjaWZpZWQgc2V0IG9mIG9wdGltaXphdGlvbnMgKGUuZy4sIHRoZSBwcmVjb21waWxlZCAKKyAqIHByZWFtYmxlKSBnZWFyZWQgdG93YXJkIGltcHJvdmluZyB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlc2Ugcm91dGluZXMuIFRoZQorICogc2V0IG9mIG9wdGltaXphdGlvbnMgZW5hYmxlZCBtYXkgY2hhbmdlIGZyb20gb25lIHZlcnNpb24gdG8gdGhlIG5leHQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX2RlZmF1bHRFZGl0aW5nVHJhbnNsYXRpb25Vbml0T3B0aW9ucyh2b2lkKTsKKworLyoqCisgKiBcYnJpZWYgU2FtZSBhcyBcYyBjbGFuZ19wYXJzZVRyYW5zbGF0aW9uVW5pdDIsIGJ1dCByZXR1cm5zCisgKiB0aGUgXGMgQ1hUcmFuc2xhdGlvblVuaXQgaW5zdGVhZCBvZiBhbiBlcnJvciBjb2RlLiAgSW4gY2FzZSBvZiBhbiBlcnJvciB0aGlzCisgKiByb3V0aW5lIHJldHVybnMgYSBcYyBOVUxMIFxjIENYVHJhbnNsYXRpb25Vbml0LCB3aXRob3V0IGZ1cnRoZXIgZGV0YWlsZWQKKyAqIGVycm9yIGNvZGVzLgorICovCitDSU5ERVhfTElOS0FHRSBDWFRyYW5zbGF0aW9uVW5pdAorY2xhbmdfcGFyc2VUcmFuc2xhdGlvblVuaXQoQ1hJbmRleCBDSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc291cmNlX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29uc3QgKmNvbW1hbmRfbGluZV9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9jb21tYW5kX2xpbmVfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDWFVuc2F2ZWRGaWxlICp1bnNhdmVkX2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3Vuc2F2ZWRfZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBvcHRpb25zKTsKKworLyoqCisgKiBcYnJpZWYgUGFyc2UgdGhlIGdpdmVuIHNvdXJjZSBmaWxlIGFuZCB0aGUgdHJhbnNsYXRpb24gdW5pdCBjb3JyZXNwb25kaW5nCisgKiB0byB0aGF0IGZpbGUuCisgKgorICogVGhpcyByb3V0aW5lIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgQ2xhbmcgQyBBUEksIHByb3ZpZGluZyB0aGUKKyAqIGFiaWxpdHkgdG8gcGFyc2UgYSBzb3VyY2UgZmlsZSBpbnRvIGEgdHJhbnNsYXRpb24gdW5pdCB0aGF0IGNhbiB0aGVuIGJlCisgKiBxdWVyaWVkIGJ5IG90aGVyIGZ1bmN0aW9ucyBpbiB0aGUgQVBJLiBUaGlzIHJvdXRpbmUgYWNjZXB0cyBhIHNldCBvZgorICogY29tbWFuZC1saW5lIGFyZ3VtZW50cyBzbyB0aGF0IHRoZSBjb21waWxhdGlvbiBjYW4gYmUgY29uZmlndXJlZCBpbiB0aGUgc2FtZQorICogd2F5IHRoYXQgdGhlIGNvbXBpbGVyIGlzIGNvbmZpZ3VyZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAqCisgKiBccGFyYW0gQ0lkeCBUaGUgaW5kZXggb2JqZWN0IHdpdGggd2hpY2ggdGhlIHRyYW5zbGF0aW9uIHVuaXQgd2lsbCBiZSAKKyAqIGFzc29jaWF0ZWQuCisgKgorICogXHBhcmFtIHNvdXJjZV9maWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgdG8gbG9hZCwgb3IgTlVMTCBpZiB0aGUKKyAqIHNvdXJjZSBmaWxlIGlzIGluY2x1ZGVkIGluIFxjIGNvbW1hbmRfbGluZV9hcmdzLgorICoKKyAqIFxwYXJhbSBjb21tYW5kX2xpbmVfYXJncyBUaGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyB0aGF0IHdvdWxkIGJlCisgKiBwYXNzZWQgdG8gdGhlIFxjIGNsYW5nIGV4ZWN1dGFibGUgaWYgaXQgd2VyZSBiZWluZyBpbnZva2VkIG91dC1vZi1wcm9jZXNzLgorICogVGhlc2UgY29tbWFuZC1saW5lIG9wdGlvbnMgd2lsbCBiZSBwYXJzZWQgYW5kIHdpbGwgYWZmZWN0IGhvdyB0aGUgdHJhbnNsYXRpb24KKyAqIHVuaXQgaXMgcGFyc2VkLiBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBpZ25vcmVkOiAnLWMnLCAKKyAqICctZW1pdC1hc3QnLCAnLWZzeW50YXgtb25seScgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KSwgYW5kICctbyBcPG91dHB1dCBmaWxlPicuCisgKgorICogXHBhcmFtIG51bV9jb21tYW5kX2xpbmVfYXJncyBUaGUgbnVtYmVyIG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgaW4KKyAqIFxjIGNvbW1hbmRfbGluZV9hcmdzLgorICoKKyAqIFxwYXJhbSB1bnNhdmVkX2ZpbGVzIHRoZSBmaWxlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHNhdmVkIHRvIGRpc2sKKyAqIGJ1dCBtYXkgYmUgcmVxdWlyZWQgZm9yIHBhcnNpbmcsIGluY2x1ZGluZyB0aGUgY29udGVudHMgb2YKKyAqIHRob3NlIGZpbGVzLiAgVGhlIGNvbnRlbnRzIGFuZCBuYW1lIG9mIHRoZXNlIGZpbGVzIChhcyBzcGVjaWZpZWQgYnkKKyAqIENYVW5zYXZlZEZpbGUpIGFyZSBjb3BpZWQgd2hlbiBuZWNlc3NhcnksIHNvIHRoZSBjbGllbnQgb25seSBuZWVkcyB0bworICogZ3VhcmFudGVlIHRoZWlyIHZhbGlkaXR5IHVudGlsIHRoZSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKyAqCisgKiBccGFyYW0gbnVtX3Vuc2F2ZWRfZmlsZXMgdGhlIG51bWJlciBvZiB1bnNhdmVkIGZpbGUgZW50cmllcyBpbiBccAorICogdW5zYXZlZF9maWxlcy4KKyAqCisgKiBccGFyYW0gb3B0aW9ucyBBIGJpdG1hc2sgb2Ygb3B0aW9ucyB0aGF0IGFmZmVjdHMgaG93IHRoZSB0cmFuc2xhdGlvbiB1bml0CisgKiBpcyBtYW5hZ2VkIGJ1dCBub3QgaXRzIGNvbXBpbGF0aW9uLiBUaGlzIHNob3VsZCBiZSBhIGJpdHdpc2UgT1Igb2YgdGhlCisgKiBDWFRyYW5zbGF0aW9uVW5pdF9YWFggZmxhZ3MuCisgKgorICogXHBhcmFtW291dF0gb3V0X1RVIEEgbm9uLU5VTEwgcG9pbnRlciB0byBzdG9yZSB0aGUgY3JlYXRlZAorICogXGMgQ1hUcmFuc2xhdGlvblVuaXQsIGRlc2NyaWJpbmcgdGhlIHBhcnNlZCBjb2RlIGFuZCBjb250YWluaW5nIGFueQorICogZGlhZ25vc3RpY3MgcHJvZHVjZWQgYnkgdGhlIGNvbXBpbGVyLgorICoKKyAqIFxyZXR1cm5zIFplcm8gb24gc3VjY2Vzcywgb3RoZXJ3aXNlIHJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWEVycm9yQ29kZQorY2xhbmdfcGFyc2VUcmFuc2xhdGlvblVuaXQyKENYSW5kZXggQ0lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzb3VyY2VfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29uc3QgKmNvbW1hbmRfbGluZV9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY29tbWFuZF9saW5lX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENYVW5zYXZlZEZpbGUgKnVuc2F2ZWRfZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3Vuc2F2ZWRfZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFRyYW5zbGF0aW9uVW5pdCAqb3V0X1RVKTsKKworLyoqCisgKiBcYnJpZWYgU2FtZSBhcyBjbGFuZ19wYXJzZVRyYW5zbGF0aW9uVW5pdDIgYnV0IHJlcXVpcmVzIGEgZnVsbCBjb21tYW5kIGxpbmUKKyAqIGZvciBcYyBjb21tYW5kX2xpbmVfYXJncyBpbmNsdWRpbmcgYXJndlswXS4gVGhpcyBpcyB1c2VmdWwgaWYgdGhlIHN0YW5kYXJkCisgKiBsaWJyYXJ5IHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmluYXJ5LgorICovCitDSU5ERVhfTElOS0FHRSBlbnVtIENYRXJyb3JDb2RlIGNsYW5nX3BhcnNlVHJhbnNsYXRpb25Vbml0MkZ1bGxBcmd2KAorICAgIENYSW5kZXggQ0lkeCwgY29uc3QgY2hhciAqc291cmNlX2ZpbGVuYW1lLAorICAgIGNvbnN0IGNoYXIgKmNvbnN0ICpjb21tYW5kX2xpbmVfYXJncywgaW50IG51bV9jb21tYW5kX2xpbmVfYXJncywKKyAgICBzdHJ1Y3QgQ1hVbnNhdmVkRmlsZSAqdW5zYXZlZF9maWxlcywgdW5zaWduZWQgbnVtX3Vuc2F2ZWRfZmlsZXMsCisgICAgdW5zaWduZWQgb3B0aW9ucywgQ1hUcmFuc2xhdGlvblVuaXQgKm91dF9UVSk7CisKKy8qKgorICogXGJyaWVmIEZsYWdzIHRoYXQgY29udHJvbCBob3cgdHJhbnNsYXRpb24gdW5pdHMgYXJlIHNhdmVkLgorICoKKyAqIFRoZSBlbnVtZXJhdG9ycyBpbiB0aGlzIGVudW1lcmF0aW9uIHR5cGUgYXJlIG1lYW50IHRvIGJlIGJpdHdpc2UKKyAqIE9SZWQgdG9nZXRoZXIgdG8gc3BlY2lmeSB3aGljaCBvcHRpb25zIHNob3VsZCBiZSB1c2VkIHdoZW4KKyAqIHNhdmluZyB0aGUgdHJhbnNsYXRpb24gdW5pdC4KKyAqLworZW51bSBDWFNhdmVUcmFuc2xhdGlvblVuaXRfRmxhZ3MgeworICAvKioKKyAgICogXGJyaWVmIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBzcGVjaWFsIHNhdmluZyBvcHRpb25zIGFyZSBuZWVkZWQuCisgICAqLworICBDWFNhdmVUcmFuc2xhdGlvblVuaXRfTm9uZSA9IDB4MAorfTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJucyB0aGUgc2V0IG9mIGZsYWdzIHRoYXQgaXMgc3VpdGFibGUgZm9yIHNhdmluZyBhIHRyYW5zbGF0aW9uCisgKiB1bml0LgorICoKKyAqIFRoZSBzZXQgb2YgZmxhZ3MgcmV0dXJuZWQgcHJvdmlkZSBvcHRpb25zIGZvcgorICogXGMgY2xhbmdfc2F2ZVRyYW5zbGF0aW9uVW5pdCgpIGJ5IGRlZmF1bHQuIFRoZSByZXR1cm5lZCBmbGFnCisgKiBzZXQgY29udGFpbnMgYW4gdW5zcGVjaWZpZWQgc2V0IG9mIG9wdGlvbnMgdGhhdCBzYXZlIHRyYW5zbGF0aW9uIHVuaXRzIHdpdGgKKyAqIHRoZSBtb3N0IGNvbW1vbmx5LXJlcXVlc3RlZCBkYXRhLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19kZWZhdWx0U2F2ZU9wdGlvbnMoQ1hUcmFuc2xhdGlvblVuaXQgVFUpOworCisvKioKKyAqIFxicmllZiBEZXNjcmliZXMgdGhlIGtpbmQgb2YgZXJyb3IgdGhhdCBvY2N1cnJlZCAoaWYgYW55KSBpbiBhIGNhbGwgdG8KKyAqIFxjIGNsYW5nX3NhdmVUcmFuc2xhdGlvblVuaXQoKS4KKyAqLworZW51bSBDWFNhdmVFcnJvciB7CisgIC8qKgorICAgKiBcYnJpZWYgSW5kaWNhdGVzIHRoYXQgbm8gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2F2aW5nIGEgdHJhbnNsYXRpb24gdW5pdC4KKyAgICovCisgIENYU2F2ZUVycm9yX05vbmUgPSAwLAorICAKKyAgLyoqCisgICAqIFxicmllZiBJbmRpY2F0ZXMgdGhhdCBhbiB1bmtub3duIGVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gc2F2ZQorICAgKiB0aGUgZmlsZS4KKyAgICoKKyAgICogVGhpcyBlcnJvciB0eXBpY2FsbHkgaW5kaWNhdGVzIHRoYXQgZmlsZSBJL08gZmFpbGVkIHdoZW4gYXR0ZW1wdGluZyB0byAKKyAgICogd3JpdGUgdGhlIGZpbGUuCisgICAqLworICBDWFNhdmVFcnJvcl9Vbmtub3duID0gMSwKKyAgCisgIC8qKgorICAgKiBcYnJpZWYgSW5kaWNhdGVzIHRoYXQgZXJyb3JzIGR1cmluZyB0cmFuc2xhdGlvbiBwcmV2ZW50ZWQgdGhpcyBhdHRlbXB0CisgICAqIHRvIHNhdmUgdGhlIHRyYW5zbGF0aW9uIHVuaXQuCisgICAqIAorICAgKiBFcnJvcnMgdGhhdCBwcmV2ZW50IHRoZSB0cmFuc2xhdGlvbiB1bml0IGZyb20gYmVpbmcgc2F2ZWQgY2FuIGJlCisgICAqIGV4dHJhY3RlZCB1c2luZyBcYyBjbGFuZ19nZXROdW1EaWFnbm9zdGljcygpIGFuZCBcYyBjbGFuZ19nZXREaWFnbm9zdGljKCkuCisgICAqLworICBDWFNhdmVFcnJvcl9UcmFuc2xhdGlvbkVycm9ycyA9IDIsCisgIAorICAvKioKKyAgICogXGJyaWVmIEluZGljYXRlcyB0aGF0IHRoZSB0cmFuc2xhdGlvbiB1bml0IHRvIGJlIHNhdmVkIHdhcyBzb21laG93CisgICAqIGludmFsaWQgKGUuZy4sIE5VTEwpLgorICAgKi8KKyAgQ1hTYXZlRXJyb3JfSW52YWxpZFRVID0gMworfTsKKyAgCisvKioKKyAqIFxicmllZiBTYXZlcyBhIHRyYW5zbGF0aW9uIHVuaXQgaW50byBhIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YKKyAqIHRoYXQgdHJhbnNsYXRpb24gdW5pdCBvbiBkaXNrLgorICoKKyAqIEFueSB0cmFuc2xhdGlvbiB1bml0IHRoYXQgd2FzIHBhcnNlZCB3aXRob3V0IGVycm9yIGNhbiBiZSBzYXZlZAorICogaW50byBhIGZpbGUuIFRoZSB0cmFuc2xhdGlvbiB1bml0IGNhbiB0aGVuIGJlIGRlc2VyaWFsaXplZCBpbnRvIGEKKyAqIG5ldyBcYyBDWFRyYW5zbGF0aW9uVW5pdCB3aXRoIFxjIGNsYW5nX2NyZWF0ZVRyYW5zbGF0aW9uVW5pdCgpIG9yLAorICogaWYgaXQgaXMgYW4gaW5jb21wbGV0ZSB0cmFuc2xhdGlvbiB1bml0IHRoYXQgY29ycmVzcG9uZHMgdG8gYQorICogaGVhZGVyLCB1c2VkIGFzIGEgcHJlY29tcGlsZWQgaGVhZGVyIHdoZW4gcGFyc2luZyBvdGhlciB0cmFuc2xhdGlvbgorICogdW5pdHMuCisgKgorICogXHBhcmFtIFRVIFRoZSB0cmFuc2xhdGlvbiB1bml0IHRvIHNhdmUuCisgKgorICogXHBhcmFtIEZpbGVOYW1lIFRoZSBmaWxlIHRvIHdoaWNoIHRoZSB0cmFuc2xhdGlvbiB1bml0IHdpbGwgYmUgc2F2ZWQuCisgKgorICogXHBhcmFtIG9wdGlvbnMgQSBiaXRtYXNrIG9mIG9wdGlvbnMgdGhhdCBhZmZlY3RzIGhvdyB0aGUgdHJhbnNsYXRpb24gdW5pdAorICogaXMgc2F2ZWQuIFRoaXMgc2hvdWxkIGJlIGEgYml0d2lzZSBPUiBvZiB0aGUKKyAqIENYU2F2ZVRyYW5zbGF0aW9uVW5pdF9YWFggZmxhZ3MuCisgKgorICogXHJldHVybnMgQSB2YWx1ZSB0aGF0IHdpbGwgbWF0Y2ggb25lIG9mIHRoZSBlbnVtZXJhdG9ycyBvZiB0aGUgQ1hTYXZlRXJyb3IKKyAqIGVudW1lcmF0aW9uLiBaZXJvIChDWFNhdmVFcnJvcl9Ob25lKSBpbmRpY2F0ZXMgdGhhdCB0aGUgdHJhbnNsYXRpb24gdW5pdCB3YXMgCisgKiBzYXZlZCBzdWNjZXNzZnVsbHksIHdoaWxlIGEgbm9uLXplcm8gdmFsdWUgaW5kaWNhdGVzIHRoYXQgYSBwcm9ibGVtIG9jY3VycmVkLgorICovCitDSU5ERVhfTElOS0FHRSBpbnQgY2xhbmdfc2F2ZVRyYW5zbGF0aW9uVW5pdChDWFRyYW5zbGF0aW9uVW5pdCBUVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgb3B0aW9ucyk7CisKKy8qKgorICogXGJyaWVmIFN1c3BlbmQgYSB0cmFuc2xhdGlvbiB1bml0IGluIG9yZGVyIHRvIGZyZWUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAqCisgKiBBIHN1c3BlbmRlZCB0cmFuc2xhdGlvbiB1bml0IHVzZXMgc2lnbmlmaWNhbnRseSBsZXNzIG1lbW9yeSBidXQgb24gdGhlIG90aGVyCisgKiBzaWRlIGRvZXMgbm90IHN1cHBvcnQgYW55IG90aGVyIGNhbGxzIHRoYW4gXGMgY2xhbmdfcmVwYXJzZVRyYW5zbGF0aW9uVW5pdAorICogdG8gcmVzdW1lIGl0IG9yIFxjIGNsYW5nX2Rpc3Bvc2VUcmFuc2xhdGlvblVuaXQgdG8gZGlzcG9zZSBpdCBjb21wbGV0ZWx5LgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19zdXNwZW5kVHJhbnNsYXRpb25Vbml0KENYVHJhbnNsYXRpb25Vbml0KTsKKworLyoqCisgKiBcYnJpZWYgRGVzdHJveSB0aGUgc3BlY2lmaWVkIENYVHJhbnNsYXRpb25Vbml0IG9iamVjdC4KKyAqLworQ0lOREVYX0xJTktBR0Ugdm9pZCBjbGFuZ19kaXNwb3NlVHJhbnNsYXRpb25Vbml0KENYVHJhbnNsYXRpb25Vbml0KTsKKworLyoqCisgKiBcYnJpZWYgRmxhZ3MgdGhhdCBjb250cm9sIHRoZSByZXBhcnNpbmcgb2YgdHJhbnNsYXRpb24gdW5pdHMuCisgKgorICogVGhlIGVudW1lcmF0b3JzIGluIHRoaXMgZW51bWVyYXRpb24gdHlwZSBhcmUgbWVhbnQgdG8gYmUgYml0d2lzZQorICogT1JlZCB0b2dldGhlciB0byBzcGVjaWZ5IHdoaWNoIG9wdGlvbnMgc2hvdWxkIGJlIHVzZWQgd2hlbgorICogcmVwYXJzaW5nIHRoZSB0cmFuc2xhdGlvbiB1bml0LgorICovCitlbnVtIENYUmVwYXJzZV9GbGFncyB7CisgIC8qKgorICAgKiBcYnJpZWYgVXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIHNwZWNpYWwgcmVwYXJzaW5nIG9wdGlvbnMgYXJlIG5lZWRlZC4KKyAgICovCisgIENYUmVwYXJzZV9Ob25lID0gMHgwCit9OworIAorLyoqCisgKiBcYnJpZWYgUmV0dXJucyB0aGUgc2V0IG9mIGZsYWdzIHRoYXQgaXMgc3VpdGFibGUgZm9yIHJlcGFyc2luZyBhIHRyYW5zbGF0aW9uCisgKiB1bml0LgorICoKKyAqIFRoZSBzZXQgb2YgZmxhZ3MgcmV0dXJuZWQgcHJvdmlkZSBvcHRpb25zIGZvcgorICogXGMgY2xhbmdfcmVwYXJzZVRyYW5zbGF0aW9uVW5pdCgpIGJ5IGRlZmF1bHQuIFRoZSByZXR1cm5lZCBmbGFnCisgKiBzZXQgY29udGFpbnMgYW4gdW5zcGVjaWZpZWQgc2V0IG9mIG9wdGltaXphdGlvbnMgZ2VhcmVkIHRvd2FyZCBjb21tb24gdXNlcworICogb2YgcmVwYXJzaW5nLiBUaGUgc2V0IG9mIG9wdGltaXphdGlvbnMgZW5hYmxlZCBtYXkgY2hhbmdlIGZyb20gb25lIHZlcnNpb24gCisgKiB0byB0aGUgbmV4dC4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfZGVmYXVsdFJlcGFyc2VPcHRpb25zKENYVHJhbnNsYXRpb25Vbml0IFRVKTsKKworLyoqCisgKiBcYnJpZWYgUmVwYXJzZSB0aGUgc291cmNlIGZpbGVzIHRoYXQgcHJvZHVjZWQgdGhpcyB0cmFuc2xhdGlvbiB1bml0LgorICoKKyAqIFRoaXMgcm91dGluZSBjYW4gYmUgdXNlZCB0byByZS1wYXJzZSB0aGUgc291cmNlIGZpbGVzIHRoYXQgb3JpZ2luYWxseQorICogY3JlYXRlZCB0aGUgZ2l2ZW4gdHJhbnNsYXRpb24gdW5pdCwgZm9yIGV4YW1wbGUgYmVjYXVzZSB0aG9zZSBzb3VyY2UgZmlsZXMKKyAqIGhhdmUgY2hhbmdlZCAoZWl0aGVyIG9uIGRpc2sgb3IgYXMgcGFzc2VkIHZpYSBccCB1bnNhdmVkX2ZpbGVzKS4gVGhlCisgKiBzb3VyY2UgY29kZSB3aWxsIGJlIHJlcGFyc2VkIHdpdGggdGhlIHNhbWUgY29tbWFuZC1saW5lIG9wdGlvbnMgYXMgaXQKKyAqIHdhcyBvcmlnaW5hbGx5IHBhcnNlZC4gCisgKgorICogUmVwYXJzaW5nIGEgdHJhbnNsYXRpb24gdW5pdCBpbnZhbGlkYXRlcyBhbGwgY3Vyc29ycyBhbmQgc291cmNlIGxvY2F0aW9ucworICogdGhhdCByZWZlciBpbnRvIHRoYXQgdHJhbnNsYXRpb24gdW5pdC4gVGhpcyBtYWtlcyByZXBhcnNpbmcgYSB0cmFuc2xhdGlvbgorICogdW5pdCBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byBkZXN0cm95aW5nIHRoZSB0cmFuc2xhdGlvbiB1bml0IGFuZCB0aGVuCisgKiBjcmVhdGluZyBhIG5ldyB0cmFuc2xhdGlvbiB1bml0IHdpdGggdGhlIHNhbWUgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KKyAqIEhvd2V2ZXIsIGl0IG1heSBiZSBtb3JlIGVmZmljaWVudCB0byByZXBhcnNlIGEgdHJhbnNsYXRpb24gCisgKiB1bml0IHVzaW5nIHRoaXMgcm91dGluZS4KKyAqCisgKiBccGFyYW0gVFUgVGhlIHRyYW5zbGF0aW9uIHVuaXQgd2hvc2UgY29udGVudHMgd2lsbCBiZSByZS1wYXJzZWQuIFRoZQorICogdHJhbnNsYXRpb24gdW5pdCBtdXN0IG9yaWdpbmFsbHkgaGF2ZSBiZWVuIGJ1aWx0IHdpdGggCisgKiBcYyBjbGFuZ19jcmVhdGVUcmFuc2xhdGlvblVuaXRGcm9tU291cmNlRmlsZSgpLgorICoKKyAqIFxwYXJhbSBudW1fdW5zYXZlZF9maWxlcyBUaGUgbnVtYmVyIG9mIHVuc2F2ZWQgZmlsZSBlbnRyaWVzIGluIFxwCisgKiB1bnNhdmVkX2ZpbGVzLgorICoKKyAqIFxwYXJhbSB1bnNhdmVkX2ZpbGVzIFRoZSBmaWxlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHNhdmVkIHRvIGRpc2sKKyAqIGJ1dCBtYXkgYmUgcmVxdWlyZWQgZm9yIHBhcnNpbmcsIGluY2x1ZGluZyB0aGUgY29udGVudHMgb2YKKyAqIHRob3NlIGZpbGVzLiAgVGhlIGNvbnRlbnRzIGFuZCBuYW1lIG9mIHRoZXNlIGZpbGVzIChhcyBzcGVjaWZpZWQgYnkKKyAqIENYVW5zYXZlZEZpbGUpIGFyZSBjb3BpZWQgd2hlbiBuZWNlc3NhcnksIHNvIHRoZSBjbGllbnQgb25seSBuZWVkcyB0bworICogZ3VhcmFudGVlIHRoZWlyIHZhbGlkaXR5IHVudGlsIHRoZSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKyAqIAorICogXHBhcmFtIG9wdGlvbnMgQSBiaXRzZXQgb2Ygb3B0aW9ucyBjb21wb3NlZCBvZiB0aGUgZmxhZ3MgaW4gQ1hSZXBhcnNlX0ZsYWdzLgorICogVGhlIGZ1bmN0aW9uIFxjIGNsYW5nX2RlZmF1bHRSZXBhcnNlT3B0aW9ucygpIHByb2R1Y2VzIGEgZGVmYXVsdCBzZXQgb2YKKyAqIG9wdGlvbnMgcmVjb21tZW5kZWQgZm9yIG1vc3QgdXNlcywgYmFzZWQgb24gdGhlIHRyYW5zbGF0aW9uIHVuaXQuCisgKgorICogXHJldHVybnMgMCBpZiB0aGUgc291cmNlcyBjb3VsZCBiZSByZXBhcnNlZC4gIEEgbm9uLXplcm8gZXJyb3IgY29kZSB3aWxsIGJlCisgKiByZXR1cm5lZCBpZiByZXBhcnNpbmcgd2FzIGltcG9zc2libGUsIHN1Y2ggdGhhdCB0aGUgdHJhbnNsYXRpb24gdW5pdCBpcworICogaW52YWxpZC4gSW4gc3VjaCBjYXNlcywgdGhlIG9ubHkgdmFsaWQgY2FsbCBmb3IgXGMgVFUgaXMKKyAqIFxjIGNsYW5nX2Rpc3Bvc2VUcmFuc2xhdGlvblVuaXQoVFUpLiAgVGhlIGVycm9yIGNvZGVzIHJldHVybmVkIGJ5IHRoaXMKKyAqIHJvdXRpbmUgYXJlIGRlc2NyaWJlZCBieSB0aGUgXGMgQ1hFcnJvckNvZGUgZW51bS4KKyAqLworQ0lOREVYX0xJTktBR0UgaW50IGNsYW5nX3JlcGFyc2VUcmFuc2xhdGlvblVuaXQoQ1hUcmFuc2xhdGlvblVuaXQgVFUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1fdW5zYXZlZF9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDWFVuc2F2ZWRGaWxlICp1bnNhdmVkX2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgb3B0aW9ucyk7CisKKy8qKgorICAqIFxicmllZiBDYXRlZ29yaXplcyBob3cgbWVtb3J5IGlzIGJlaW5nIHVzZWQgYnkgYSB0cmFuc2xhdGlvbiB1bml0LgorICAqLworZW51bSBDWFRVUmVzb3VyY2VVc2FnZUtpbmQgeworICBDWFRVUmVzb3VyY2VVc2FnZV9BU1QgPSAxLAorICBDWFRVUmVzb3VyY2VVc2FnZV9JZGVudGlmaWVycyA9IDIsCisgIENYVFVSZXNvdXJjZVVzYWdlX1NlbGVjdG9ycyA9IDMsCisgIENYVFVSZXNvdXJjZVVzYWdlX0dsb2JhbENvbXBsZXRpb25SZXN1bHRzID0gNCwKKyAgQ1hUVVJlc291cmNlVXNhZ2VfU291cmNlTWFuYWdlckNvbnRlbnRDYWNoZSA9IDUsCisgIENYVFVSZXNvdXJjZVVzYWdlX0FTVF9TaWRlVGFibGVzID0gNiwKKyAgQ1hUVVJlc291cmNlVXNhZ2VfU291cmNlTWFuYWdlcl9NZW1idWZmZXJfTWFsbG9jID0gNywKKyAgQ1hUVVJlc291cmNlVXNhZ2VfU291cmNlTWFuYWdlcl9NZW1idWZmZXJfTU1hcCA9IDgsCisgIENYVFVSZXNvdXJjZVVzYWdlX0V4dGVybmFsQVNUU291cmNlX01lbWJ1ZmZlcl9NYWxsb2MgPSA5LCAKKyAgQ1hUVVJlc291cmNlVXNhZ2VfRXh0ZXJuYWxBU1RTb3VyY2VfTWVtYnVmZmVyX01NYXAgPSAxMCwgCisgIENYVFVSZXNvdXJjZVVzYWdlX1ByZXByb2Nlc3NvciA9IDExLAorICBDWFRVUmVzb3VyY2VVc2FnZV9QcmVwcm9jZXNzaW5nUmVjb3JkID0gMTIsCisgIENYVFVSZXNvdXJjZVVzYWdlX1NvdXJjZU1hbmFnZXJfRGF0YVN0cnVjdHVyZXMgPSAxMywKKyAgQ1hUVVJlc291cmNlVXNhZ2VfUHJlcHJvY2Vzc29yX0hlYWRlclNlYXJjaCA9IDE0LAorICBDWFRVUmVzb3VyY2VVc2FnZV9NRU1PUllfSU5fQllURVNfQkVHSU4gPSBDWFRVUmVzb3VyY2VVc2FnZV9BU1QsCisgIENYVFVSZXNvdXJjZVVzYWdlX01FTU9SWV9JTl9CWVRFU19FTkQgPQorICAgIENYVFVSZXNvdXJjZVVzYWdlX1ByZXByb2Nlc3Nvcl9IZWFkZXJTZWFyY2gsCisKKyAgQ1hUVVJlc291cmNlVXNhZ2VfRmlyc3QgPSBDWFRVUmVzb3VyY2VVc2FnZV9BU1QsCisgIENYVFVSZXNvdXJjZVVzYWdlX0xhc3QgPSBDWFRVUmVzb3VyY2VVc2FnZV9QcmVwcm9jZXNzb3JfSGVhZGVyU2VhcmNoCit9OworCisvKioKKyAgKiBcYnJpZWYgUmV0dXJucyB0aGUgaHVtYW4tcmVhZGFibGUgbnVsbC10ZXJtaW5hdGVkIEMgc3RyaW5nIHRoYXQgcmVwcmVzZW50cworICAqICB0aGUgbmFtZSBvZiB0aGUgbWVtb3J5IGNhdGVnb3J5LiAgVGhpcyBzdHJpbmcgc2hvdWxkIG5ldmVyIGJlIGZyZWVkLgorICAqLworQ0lOREVYX0xJTktBR0UKK2NvbnN0IGNoYXIgKmNsYW5nX2dldFRVUmVzb3VyY2VVc2FnZU5hbWUoZW51bSBDWFRVUmVzb3VyY2VVc2FnZUtpbmQga2luZCk7CisKK3R5cGVkZWYgc3RydWN0IENYVFVSZXNvdXJjZVVzYWdlRW50cnkgeworICAvKiBcYnJpZWYgVGhlIG1lbW9yeSB1c2FnZSBjYXRlZ29yeS4gKi8KKyAgZW51bSBDWFRVUmVzb3VyY2VVc2FnZUtpbmQga2luZDsgIAorICAvKiBcYnJpZWYgQW1vdW50IG9mIHJlc291cmNlcyB1c2VkLiAKKyAgICAgIFRoZSB1bml0cyB3aWxsIGRlcGVuZCBvbiB0aGUgcmVzb3VyY2Uga2luZC4gKi8KKyAgdW5zaWduZWQgbG9uZyBhbW91bnQ7Cit9IENYVFVSZXNvdXJjZVVzYWdlRW50cnk7CisKKy8qKgorICAqIFxicmllZiBUaGUgbWVtb3J5IHVzYWdlIG9mIGEgQ1hUcmFuc2xhdGlvblVuaXQsIGJyb2tlbiBpbnRvIGNhdGVnb3JpZXMuCisgICovCit0eXBlZGVmIHN0cnVjdCBDWFRVUmVzb3VyY2VVc2FnZSB7CisgIC8qIFxicmllZiBQcml2YXRlIGRhdGEgbWVtYmVyLCB1c2VkIGZvciBxdWVyaWVzLiAqLworICB2b2lkICpkYXRhOworCisgIC8qIFxicmllZiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlICdlbnRyaWVzJyBhcnJheS4gKi8KKyAgdW5zaWduZWQgbnVtRW50cmllczsKKworICAvKiBcYnJpZWYgQW4gYXJyYXkgb2Yga2V5LXZhbHVlIHBhaXJzLCByZXByZXNlbnRpbmcgdGhlIGJyZWFrZG93biBvZiBtZW1vcnkKKyAgICAgICAgICAgIHVzYWdlLiAqLworICBDWFRVUmVzb3VyY2VVc2FnZUVudHJ5ICplbnRyaWVzOworCit9IENYVFVSZXNvdXJjZVVzYWdlOworCisvKioKKyAgKiBcYnJpZWYgUmV0dXJuIHRoZSBtZW1vcnkgdXNhZ2Ugb2YgYSB0cmFuc2xhdGlvbiB1bml0LiAgVGhpcyBvYmplY3QKKyAgKiAgc2hvdWxkIGJlIHJlbGVhc2VkIHdpdGggY2xhbmdfZGlzcG9zZUNYVFVSZXNvdXJjZVVzYWdlKCkuCisgICovCitDSU5ERVhfTElOS0FHRSBDWFRVUmVzb3VyY2VVc2FnZSBjbGFuZ19nZXRDWFRVUmVzb3VyY2VVc2FnZShDWFRyYW5zbGF0aW9uVW5pdCBUVSk7CisKK0NJTkRFWF9MSU5LQUdFIHZvaWQgY2xhbmdfZGlzcG9zZUNYVFVSZXNvdXJjZVVzYWdlKENYVFVSZXNvdXJjZVVzYWdlIHVzYWdlKTsKKworLyoqCisgKiBcYnJpZWYgR2V0IHRhcmdldCBpbmZvcm1hdGlvbiBmb3IgdGhpcyB0cmFuc2xhdGlvbiB1bml0LgorICoKKyAqIFRoZSBDWFRhcmdldEluZm8gb2JqZWN0IGNhbm5vdCBvdXRsaXZlIHRoZSBDWFRyYW5zbGF0aW9uVW5pdCBvYmplY3QuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYVGFyZ2V0SW5mbworY2xhbmdfZ2V0VHJhbnNsYXRpb25Vbml0VGFyZ2V0SW5mbyhDWFRyYW5zbGF0aW9uVW5pdCBDVFVuaXQpOworCisvKioKKyAqIFxicmllZiBEZXN0cm95IHRoZSBDWFRhcmdldEluZm8gb2JqZWN0LgorICovCitDSU5ERVhfTElOS0FHRSB2b2lkCitjbGFuZ19UYXJnZXRJbmZvX2Rpc3Bvc2UoQ1hUYXJnZXRJbmZvIEluZm8pOworCisvKioKKyAqIFxicmllZiBHZXQgdGhlIG5vcm1hbGl6ZWQgdGFyZ2V0IHRyaXBsZSBhcyBhIHN0cmluZy4KKyAqCisgKiBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaW4gY2FzZSBvZiBhbnkgZXJyb3IuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU3RyaW5nCitjbGFuZ19UYXJnZXRJbmZvX2dldFRyaXBsZShDWFRhcmdldEluZm8gSW5mbyk7CisKKy8qKgorICogXGJyaWVmIEdldCB0aGUgcG9pbnRlciB3aWR0aCBvZiB0aGUgdGFyZ2V0IGluIGJpdHMuCisgKgorICogUmV0dXJucyAtMSBpbiBjYXNlIG9mIGVycm9yLgorICovCitDSU5ERVhfTElOS0FHRSBpbnQKK2NsYW5nX1RhcmdldEluZm9fZ2V0UG9pbnRlcldpZHRoKENYVGFyZ2V0SW5mbyBJbmZvKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogXGJyaWVmIERlc2NyaWJlcyB0aGUga2luZCBvZiBlbnRpdHkgdGhhdCBhIGN1cnNvciByZWZlcnMgdG8uCisgKi8KK2VudW0gQ1hDdXJzb3JLaW5kIHsKKyAgLyogRGVjbGFyYXRpb25zICovCisgIC8qKgorICAgKiBcYnJpZWYgQSBkZWNsYXJhdGlvbiB3aG9zZSBzcGVjaWZpYyBraW5kIGlzIG5vdCBleHBvc2VkIHZpYSB0aGlzCisgICAqIGludGVyZmFjZS4KKyAgICoKKyAgICogVW5leHBvc2VkIGRlY2xhcmF0aW9ucyBoYXZlIHRoZSBzYW1lIG9wZXJhdGlvbnMgYXMgYW55IG90aGVyIGtpbmQKKyAgICogb2YgZGVjbGFyYXRpb247IG9uZSBjYW4gZXh0cmFjdCB0aGVpciBsb2NhdGlvbiBpbmZvcm1hdGlvbiwKKyAgICogc3BlbGxpbmcsIGZpbmQgdGhlaXIgZGVmaW5pdGlvbnMsIGV0Yy4gSG93ZXZlciwgdGhlIHNwZWNpZmljIGtpbmQKKyAgICogb2YgdGhlIGRlY2xhcmF0aW9uIGlzIG5vdCByZXBvcnRlZC4KKyAgICovCisgIENYQ3Vyc29yX1VuZXhwb3NlZERlY2wgICAgICAgICAgICAgICAgID0gMSwKKyAgLyoqIFxicmllZiBBIEMgb3IgQysrIHN0cnVjdC4gKi8KKyAgQ1hDdXJzb3JfU3RydWN0RGVjbCAgICAgICAgICAgICAgICAgICAgPSAyLAorICAvKiogXGJyaWVmIEEgQyBvciBDKysgdW5pb24uICovCisgIENYQ3Vyc29yX1VuaW9uRGVjbCAgICAgICAgICAgICAgICAgICAgID0gMywKKyAgLyoqIFxicmllZiBBIEMrKyBjbGFzcy4gKi8KKyAgQ1hDdXJzb3JfQ2xhc3NEZWNsICAgICAgICAgICAgICAgICAgICAgPSA0LAorICAvKiogXGJyaWVmIEFuIGVudW1lcmF0aW9uLiAqLworICBDWEN1cnNvcl9FbnVtRGVjbCAgICAgICAgICAgICAgICAgICAgICA9IDUsCisgIC8qKgorICAgKiBcYnJpZWYgQSBmaWVsZCAoaW4gQykgb3Igbm9uLXN0YXRpYyBkYXRhIG1lbWJlciAoaW4gQysrKSBpbiBhCisgICAqIHN0cnVjdCwgdW5pb24sIG9yIEMrKyBjbGFzcy4KKyAgICovCisgIENYQ3Vyc29yX0ZpZWxkRGVjbCAgICAgICAgICAgICAgICAgICAgID0gNiwKKyAgLyoqIFxicmllZiBBbiBlbnVtZXJhdG9yIGNvbnN0YW50LiAqLworICBDWEN1cnNvcl9FbnVtQ29uc3RhbnREZWNsICAgICAgICAgICAgICA9IDcsCisgIC8qKiBcYnJpZWYgQSBmdW5jdGlvbi4gKi8KKyAgQ1hDdXJzb3JfRnVuY3Rpb25EZWNsICAgICAgICAgICAgICAgICAgPSA4LAorICAvKiogXGJyaWVmIEEgdmFyaWFibGUuICovCisgIENYQ3Vyc29yX1ZhckRlY2wgICAgICAgICAgICAgICAgICAgICAgID0gOSwKKyAgLyoqIFxicmllZiBBIGZ1bmN0aW9uIG9yIG1ldGhvZCBwYXJhbWV0ZXIuICovCisgIENYQ3Vyc29yX1Bhcm1EZWNsICAgICAgICAgICAgICAgICAgICAgID0gMTAsCisgIC8qKiBcYnJpZWYgQW4gT2JqZWN0aXZlLUMgXEBpbnRlcmZhY2UuICovCisgIENYQ3Vyc29yX09iakNJbnRlcmZhY2VEZWNsICAgICAgICAgICAgID0gMTEsCisgIC8qKiBcYnJpZWYgQW4gT2JqZWN0aXZlLUMgXEBpbnRlcmZhY2UgZm9yIGEgY2F0ZWdvcnkuICovCisgIENYQ3Vyc29yX09iakNDYXRlZ29yeURlY2wgICAgICAgICAgICAgID0gMTIsCisgIC8qKiBcYnJpZWYgQW4gT2JqZWN0aXZlLUMgXEBwcm90b2NvbCBkZWNsYXJhdGlvbi4gKi8KKyAgQ1hDdXJzb3JfT2JqQ1Byb3RvY29sRGVjbCAgICAgICAgICAgICAgPSAxMywKKyAgLyoqIFxicmllZiBBbiBPYmplY3RpdmUtQyBcQHByb3BlcnR5IGRlY2xhcmF0aW9uLiAqLworICBDWEN1cnNvcl9PYmpDUHJvcGVydHlEZWNsICAgICAgICAgICAgICA9IDE0LAorICAvKiogXGJyaWVmIEFuIE9iamVjdGl2ZS1DIGluc3RhbmNlIHZhcmlhYmxlLiAqLworICBDWEN1cnNvcl9PYmpDSXZhckRlY2wgICAgICAgICAgICAgICAgICA9IDE1LAorICAvKiogXGJyaWVmIEFuIE9iamVjdGl2ZS1DIGluc3RhbmNlIG1ldGhvZC4gKi8KKyAgQ1hDdXJzb3JfT2JqQ0luc3RhbmNlTWV0aG9kRGVjbCAgICAgICAgPSAxNiwKKyAgLyoqIFxicmllZiBBbiBPYmplY3RpdmUtQyBjbGFzcyBtZXRob2QuICovCisgIENYQ3Vyc29yX09iakNDbGFzc01ldGhvZERlY2wgICAgICAgICAgID0gMTcsCisgIC8qKiBcYnJpZWYgQW4gT2JqZWN0aXZlLUMgXEBpbXBsZW1lbnRhdGlvbi4gKi8KKyAgQ1hDdXJzb3JfT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAgICAgICAgPSAxOCwKKyAgLyoqIFxicmllZiBBbiBPYmplY3RpdmUtQyBcQGltcGxlbWVudGF0aW9uIGZvciBhIGNhdGVnb3J5LiAqLworICBDWEN1cnNvcl9PYmpDQ2F0ZWdvcnlJbXBsRGVjbCAgICAgICAgICA9IDE5LAorICAvKiogXGJyaWVmIEEgdHlwZWRlZi4gKi8KKyAgQ1hDdXJzb3JfVHlwZWRlZkRlY2wgICAgICAgICAgICAgICAgICAgPSAyMCwKKyAgLyoqIFxicmllZiBBIEMrKyBjbGFzcyBtZXRob2QuICovCisgIENYQ3Vyc29yX0NYWE1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMjEsCisgIC8qKiBcYnJpZWYgQSBDKysgbmFtZXNwYWNlLiAqLworICBDWEN1cnNvcl9OYW1lc3BhY2UgICAgICAgICAgICAgICAgICAgICA9IDIyLAorICAvKiogXGJyaWVmIEEgbGlua2FnZSBzcGVjaWZpY2F0aW9uLCBlLmcuICdleHRlcm4gIkMiJy4gKi8KKyAgQ1hDdXJzb3JfTGlua2FnZVNwZWMgICAgICAgICAgICAgICAgICAgPSAyMywKKyAgLyoqIFxicmllZiBBIEMrKyBjb25zdHJ1Y3Rvci4gKi8KKyAgQ1hDdXJzb3JfQ29uc3RydWN0b3IgICAgICAgICAgICAgICAgICAgPSAyNCwKKyAgLyoqIFxicmllZiBBIEMrKyBkZXN0cnVjdG9yLiAqLworICBDWEN1cnNvcl9EZXN0cnVjdG9yICAgICAgICAgICAgICAgICAgICA9IDI1LAorICAvKiogXGJyaWVmIEEgQysrIGNvbnZlcnNpb24gZnVuY3Rpb24uICovCisgIENYQ3Vyc29yX0NvbnZlcnNpb25GdW5jdGlvbiAgICAgICAgICAgID0gMjYsCisgIC8qKiBcYnJpZWYgQSBDKysgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXIuICovCisgIENYQ3Vyc29yX1RlbXBsYXRlVHlwZVBhcmFtZXRlciAgICAgICAgID0gMjcsCisgIC8qKiBcYnJpZWYgQSBDKysgbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVyLiAqLworICBDWEN1cnNvcl9Ob25UeXBlVGVtcGxhdGVQYXJhbWV0ZXIgICAgICA9IDI4LAorICAvKiogXGJyaWVmIEEgQysrIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlci4gKi8KKyAgQ1hDdXJzb3JfVGVtcGxhdGVUZW1wbGF0ZVBhcmFtZXRlciAgICAgPSAyOSwKKyAgLyoqIFxicmllZiBBIEMrKyBmdW5jdGlvbiB0ZW1wbGF0ZS4gKi8KKyAgQ1hDdXJzb3JfRnVuY3Rpb25UZW1wbGF0ZSAgICAgICAgICAgICAgPSAzMCwKKyAgLyoqIFxicmllZiBBIEMrKyBjbGFzcyB0ZW1wbGF0ZS4gKi8KKyAgQ1hDdXJzb3JfQ2xhc3NUZW1wbGF0ZSAgICAgICAgICAgICAgICAgPSAzMSwKKyAgLyoqIFxicmllZiBBIEMrKyBjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLiAqLworICBDWEN1cnNvcl9DbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uID0gMzIsCisgIC8qKiBcYnJpZWYgQSBDKysgbmFtZXNwYWNlIGFsaWFzIGRlY2xhcmF0aW9uLiAqLworICBDWEN1cnNvcl9OYW1lc3BhY2VBbGlhcyAgICAgICAgICAgICAgICA9IDMzLAorICAvKiogXGJyaWVmIEEgQysrIHVzaW5nIGRpcmVjdGl2ZS4gKi8KKyAgQ1hDdXJzb3JfVXNpbmdEaXJlY3RpdmUgICAgICAgICAgICAgICAgPSAzNCwKKyAgLyoqIFxicmllZiBBIEMrKyB1c2luZyBkZWNsYXJhdGlvbi4gKi8KKyAgQ1hDdXJzb3JfVXNpbmdEZWNsYXJhdGlvbiAgICAgICAgICAgICAgPSAzNSwKKyAgLyoqIFxicmllZiBBIEMrKyBhbGlhcyBkZWNsYXJhdGlvbiAqLworICBDWEN1cnNvcl9UeXBlQWxpYXNEZWNsICAgICAgICAgICAgICAgICA9IDM2LAorICAvKiogXGJyaWVmIEFuIE9iamVjdGl2ZS1DIFxAc3ludGhlc2l6ZSBkZWZpbml0aW9uLiAqLworICBDWEN1cnNvcl9PYmpDU3ludGhlc2l6ZURlY2wgICAgICAgICAgICA9IDM3LAorICAvKiogXGJyaWVmIEFuIE9iamVjdGl2ZS1DIFxAZHluYW1pYyBkZWZpbml0aW9uLiAqLworICBDWEN1cnNvcl9PYmpDRHluYW1pY0RlY2wgICAgICAgICAgICAgICA9IDM4LAorICAvKiogXGJyaWVmIEFuIGFjY2VzcyBzcGVjaWZpZXIuICovCisgIENYQ3Vyc29yX0NYWEFjY2Vzc1NwZWNpZmllciAgICAgICAgICAgID0gMzksCisKKyAgQ1hDdXJzb3JfRmlyc3REZWNsICAgICAgICAgICAgICAgICAgICAgPSBDWEN1cnNvcl9VbmV4cG9zZWREZWNsLAorICBDWEN1cnNvcl9MYXN0RGVjbCAgICAgICAgICAgICAgICAgICAgICA9IENYQ3Vyc29yX0NYWEFjY2Vzc1NwZWNpZmllciwKKworICAvKiBSZWZlcmVuY2VzICovCisgIENYQ3Vyc29yX0ZpcnN0UmVmICAgICAgICAgICAgICAgICAgICAgID0gNDAsIC8qIERlY2wgcmVmZXJlbmNlcyAqLworICBDWEN1cnNvcl9PYmpDU3VwZXJDbGFzc1JlZiAgICAgICAgICAgICA9IDQwLAorICBDWEN1cnNvcl9PYmpDUHJvdG9jb2xSZWYgICAgICAgICAgICAgICA9IDQxLAorICBDWEN1cnNvcl9PYmpDQ2xhc3NSZWYgICAgICAgICAgICAgICAgICA9IDQyLAorICAvKioKKyAgICogXGJyaWVmIEEgcmVmZXJlbmNlIHRvIGEgdHlwZSBkZWNsYXJhdGlvbi4KKyAgICoKKyAgICogQSB0eXBlIHJlZmVyZW5jZSBvY2N1cnMgYW55d2hlcmUgd2hlcmUgYSB0eXBlIGlzIG5hbWVkIGJ1dCBub3QKKyAgICogZGVjbGFyZWQuIEZvciBleGFtcGxlLCBnaXZlbjoKKyAgICoKKyAgICogXGNvZGUKKyAgICogdHlwZWRlZiB1bnNpZ25lZCBzaXplX3R5cGU7CisgICAqIHNpemVfdHlwZSBzaXplOworICAgKiBcZW5kY29kZQorICAgKgorICAgKiBUaGUgdHlwZWRlZiBpcyBhIGRlY2xhcmF0aW9uIG9mIHNpemVfdHlwZSAoQ1hDdXJzb3JfVHlwZWRlZkRlY2wpLAorICAgKiB3aGlsZSB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUgInNpemUiIGlzIHJlZmVyZW5jZWQuIFRoZSBjdXJzb3IKKyAgICogcmVmZXJlbmNlZCBieSB0aGUgdHlwZSBvZiBzaXplIGlzIHRoZSB0eXBlZGVmIGZvciBzaXplX3R5cGUuCisgICAqLworICBDWEN1cnNvcl9UeXBlUmVmICAgICAgICAgICAgICAgICAgICAgICA9IDQzLAorICBDWEN1cnNvcl9DWFhCYXNlU3BlY2lmaWVyICAgICAgICAgICAgICA9IDQ0LAorICAvKiogCisgICAqIFxicmllZiBBIHJlZmVyZW5jZSB0byBhIGNsYXNzIHRlbXBsYXRlLCBmdW5jdGlvbiB0ZW1wbGF0ZSwgdGVtcGxhdGUKKyAgICogdGVtcGxhdGUgcGFyYW1ldGVyLCBvciBjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLgorICAgKi8KKyAgQ1hDdXJzb3JfVGVtcGxhdGVSZWYgICAgICAgICAgICAgICAgICAgPSA0NSwKKyAgLyoqCisgICAqIFxicmllZiBBIHJlZmVyZW5jZSB0byBhIG5hbWVzcGFjZSBvciBuYW1lc3BhY2UgYWxpYXMuCisgICAqLworICBDWEN1cnNvcl9OYW1lc3BhY2VSZWYgICAgICAgICAgICAgICAgICA9IDQ2LAorICAvKioKKyAgICogXGJyaWVmIEEgcmVmZXJlbmNlIHRvIGEgbWVtYmVyIG9mIGEgc3RydWN0LCB1bmlvbiwgb3IgY2xhc3MgdGhhdCBvY2N1cnMgaW4gCisgICAqIHNvbWUgbm9uLWV4cHJlc3Npb24gY29udGV4dCwgZS5nLiwgYSBkZXNpZ25hdGVkIGluaXRpYWxpemVyLgorICAgKi8KKyAgQ1hDdXJzb3JfTWVtYmVyUmVmICAgICAgICAgICAgICAgICAgICAgPSA0NywKKyAgLyoqCisgICAqIFxicmllZiBBIHJlZmVyZW5jZSB0byBhIGxhYmVsZWQgc3RhdGVtZW50LgorICAgKgorICAgKiBUaGlzIGN1cnNvciBraW5kIGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGp1bXAgdG8gInN0YXJ0X292ZXIiIGluIHRoZSAKKyAgICogZ290byBzdGF0ZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorICAgKgorICAgKiBcY29kZQorICAgKiAgIHN0YXJ0X292ZXI6CisgICAqICAgICArK2NvdW50ZXI7CisgICAqCisgICAqICAgICBnb3RvIHN0YXJ0X292ZXI7CisgICAqIFxlbmRjb2RlCisgICAqCisgICAqIEEgbGFiZWwgcmVmZXJlbmNlIGN1cnNvciByZWZlcnMgdG8gYSBsYWJlbCBzdGF0ZW1lbnQuCisgICAqLworICBDWEN1cnNvcl9MYWJlbFJlZiAgICAgICAgICAgICAgICAgICAgICA9IDQ4LAorICAKKyAgLyoqCisgICAqIFxicmllZiBBIHJlZmVyZW5jZSB0byBhIHNldCBvZiBvdmVybG9hZGVkIGZ1bmN0aW9ucyBvciBmdW5jdGlvbiB0ZW1wbGF0ZXMKKyAgICogdGhhdCBoYXMgbm90IHlldCBiZWVuIHJlc29sdmVkIHRvIGEgc3BlY2lmaWMgZnVuY3Rpb24gb3IgZnVuY3Rpb24gdGVtcGxhdGUuCisgICAqCisgICAqIEFuIG92ZXJsb2FkZWQgZGVjbGFyYXRpb24gcmVmZXJlbmNlIGN1cnNvciBvY2N1cnMgaW4gQysrIHRlbXBsYXRlcyB3aGVyZQorICAgKiBhIGRlcGVuZGVudCBuYW1lIHJlZmVycyB0byBhIGZ1bmN0aW9uLiBGb3IgZXhhbXBsZToKKyAgICoKKyAgICogXGNvZGUKKyAgICogdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBzd2FwKFQmLCBUJik7CisgICAqCisgICAqIHN0cnVjdCBYIHsgLi4uIH07CisgICAqIHZvaWQgc3dhcChYJiwgWCYpOworICAgKgorICAgKiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgKiB2b2lkIHJldmVyc2UoVCogZmlyc3QsIFQqIGxhc3QpIHsKKyAgICogICB3aGlsZSAoZmlyc3QgPCBsYXN0IC0gMSkgeworICAgKiAgICAgc3dhcCgqZmlyc3QsICotLWxhc3QpOworICAgKiAgICAgKytmaXJzdDsKKyAgICogICB9CisgICAqIH0KKyAgICoKKyAgICogc3RydWN0IFkgeyB9OworICAgKiB2b2lkIHN3YXAoWSYsIFkmKTsKKyAgICogXGVuZGNvZGUKKyAgICoKKyAgICogSGVyZSwgdGhlIGlkZW50aWZpZXIgInN3YXAiIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBvdmVybG9hZGVkIGRlY2xhcmF0aW9uCisgICAqIHJlZmVyZW5jZS4gSW4gdGhlIHRlbXBsYXRlIGRlZmluaXRpb24sICJzd2FwIiByZWZlcnMgdG8gZWl0aGVyIG9mIHRoZSB0d28KKyAgICogInN3YXAiIGZ1bmN0aW9ucyBkZWNsYXJlZCBhYm92ZSwgc28gYm90aCByZXN1bHRzIHdpbGwgYmUgYXZhaWxhYmxlLiBBdAorICAgKiBpbnN0YW50aWF0aW9uIHRpbWUsICJzd2FwIiBtYXkgYWxzbyByZWZlciB0byBvdGhlciBmdW5jdGlvbnMgZm91bmQgdmlhCisgICAqIGFyZ3VtZW50LWRlcGVuZGVudCBsb29rdXAgKGUuZy4sIHRoZSAic3dhcCIgZnVuY3Rpb24gYXQgdGhlIGVuZCBvZiB0aGUKKyAgICogZXhhbXBsZSkuCisgICAqCisgICAqIFRoZSBmdW5jdGlvbnMgXGMgY2xhbmdfZ2V0TnVtT3ZlcmxvYWRlZERlY2xzKCkgYW5kIAorICAgKiBcYyBjbGFuZ19nZXRPdmVybG9hZGVkRGVjbCgpIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBkZWZpbml0aW9ucworICAgKiByZWZlcmVuY2VkIGJ5IHRoaXMgY3Vyc29yLgorICAgKi8KKyAgQ1hDdXJzb3JfT3ZlcmxvYWRlZERlY2xSZWYgICAgICAgICAgICAgPSA0OSwKKyAgCisgIC8qKgorICAgKiBcYnJpZWYgQSByZWZlcmVuY2UgdG8gYSB2YXJpYWJsZSB0aGF0IG9jY3VycyBpbiBzb21lIG5vbi1leHByZXNzaW9uIAorICAgKiBjb250ZXh0LCBlLmcuLCBhIEMrKyBsYW1iZGEgY2FwdHVyZSBsaXN0LgorICAgKi8KKyAgQ1hDdXJzb3JfVmFyaWFibGVSZWYgICAgICAgICAgICAgICAgICAgPSA1MCwKKyAgCisgIENYQ3Vyc29yX0xhc3RSZWYgICAgICAgICAgICAgICAgICAgICAgID0gQ1hDdXJzb3JfVmFyaWFibGVSZWYsCisKKyAgLyogRXJyb3IgY29uZGl0aW9ucyAqLworICBDWEN1cnNvcl9GaXJzdEludmFsaWQgICAgICAgICAgICAgICAgICA9IDcwLAorICBDWEN1cnNvcl9JbnZhbGlkRmlsZSAgICAgICAgICAgICAgICAgICA9IDcwLAorICBDWEN1cnNvcl9Ob0RlY2xGb3VuZCAgICAgICAgICAgICAgICAgICA9IDcxLAorICBDWEN1cnNvcl9Ob3RJbXBsZW1lbnRlZCAgICAgICAgICAgICAgICA9IDcyLAorICBDWEN1cnNvcl9JbnZhbGlkQ29kZSAgICAgICAgICAgICAgICAgICA9IDczLAorICBDWEN1cnNvcl9MYXN0SW52YWxpZCAgICAgICAgICAgICAgICAgICA9IENYQ3Vyc29yX0ludmFsaWRDb2RlLAorCisgIC8qIEV4cHJlc3Npb25zICovCisgIENYQ3Vyc29yX0ZpcnN0RXhwciAgICAgICAgICAgICAgICAgICAgID0gMTAwLAorCisgIC8qKgorICAgKiBcYnJpZWYgQW4gZXhwcmVzc2lvbiB3aG9zZSBzcGVjaWZpYyBraW5kIGlzIG5vdCBleHBvc2VkIHZpYSB0aGlzCisgICAqIGludGVyZmFjZS4KKyAgICoKKyAgICogVW5leHBvc2VkIGV4cHJlc3Npb25zIGhhdmUgdGhlIHNhbWUgb3BlcmF0aW9ucyBhcyBhbnkgb3RoZXIga2luZAorICAgKiBvZiBleHByZXNzaW9uOyBvbmUgY2FuIGV4dHJhY3QgdGhlaXIgbG9jYXRpb24gaW5mb3JtYXRpb24sCisgICAqIHNwZWxsaW5nLCBjaGlsZHJlbiwgZXRjLiBIb3dldmVyLCB0aGUgc3BlY2lmaWMga2luZCBvZiB0aGUKKyAgICogZXhwcmVzc2lvbiBpcyBub3QgcmVwb3J0ZWQuCisgICAqLworICBDWEN1cnNvcl9VbmV4cG9zZWRFeHByICAgICAgICAgICAgICAgICA9IDEwMCwKKworICAvKioKKyAgICogXGJyaWVmIEFuIGV4cHJlc3Npb24gdGhhdCByZWZlcnMgdG8gc29tZSB2YWx1ZSBkZWNsYXJhdGlvbiwgc3VjaAorICAgKiBhcyBhIGZ1bmN0aW9uLCB2YXJpYWJsZSwgb3IgZW51bWVyYXRvci4KKyAgICovCisgIENYQ3Vyc29yX0RlY2xSZWZFeHByICAgICAgICAgICAgICAgICAgID0gMTAxLAorCisgIC8qKgorICAgKiBcYnJpZWYgQW4gZXhwcmVzc2lvbiB0aGF0IHJlZmVycyB0byBhIG1lbWJlciBvZiBhIHN0cnVjdCwgdW5pb24sCisgICAqIGNsYXNzLCBPYmplY3RpdmUtQyBjbGFzcywgZXRjLgorICAgKi8KKyAgQ1hDdXJzb3JfTWVtYmVyUmVmRXhwciAgICAgICAgICAgICAgICAgPSAxMDIsCisKKyAgLyoqIFxicmllZiBBbiBleHByZXNzaW9uIHRoYXQgY2FsbHMgYSBmdW5jdGlvbi4gKi8KKyAgQ1hDdXJzb3JfQ2FsbEV4cHIgICAgICAgICAgICAgICAgICAgICAgPSAxMDMsCisKKyAgLyoqIFxicmllZiBBbiBleHByZXNzaW9uIHRoYXQgc2VuZHMgYSBtZXNzYWdlIHRvIGFuIE9iamVjdGl2ZS1DCisgICBvYmplY3Qgb3IgY2xhc3MuICovCisgIENYQ3Vyc29yX09iakNNZXNzYWdlRXhwciAgICAgICAgICAgICAgID0gMTA0LAorCisgIC8qKiBcYnJpZWYgQW4gZXhwcmVzc2lvbiB0aGF0IHJlcHJlc2VudHMgYSBibG9jayBsaXRlcmFsLiAqLworICBDWEN1cnNvcl9CbG9ja0V4cHIgICAgICAgICAgICAgICAgICAgICA9IDEwNSwKKworICAvKiogXGJyaWVmIEFuIGludGVnZXIgbGl0ZXJhbC4KKyAgICovCisgIENYQ3Vyc29yX0ludGVnZXJMaXRlcmFsICAgICAgICAgICAgICAgID0gMTA2LAorCisgIC8qKiBcYnJpZWYgQSBmbG9hdGluZyBwb2ludCBudW1iZXIgbGl0ZXJhbC4KKyAgICovCisgIENYQ3Vyc29yX0Zsb2F0aW5nTGl0ZXJhbCAgICAgICAgICAgICAgID0gMTA3LAorCisgIC8qKiBcYnJpZWYgQW4gaW1hZ2luYXJ5IG51bWJlciBsaXRlcmFsLgorICAgKi8KKyAgQ1hDdXJzb3JfSW1hZ2luYXJ5TGl0ZXJhbCAgICAgICAgICAgICAgPSAxMDgsCisKKyAgLyoqIFxicmllZiBBIHN0cmluZyBsaXRlcmFsLgorICAgKi8KKyAgQ1hDdXJzb3JfU3RyaW5nTGl0ZXJhbCAgICAgICAgICAgICAgICAgPSAxMDksCisKKyAgLyoqIFxicmllZiBBIGNoYXJhY3RlciBsaXRlcmFsLgorICAgKi8KKyAgQ1hDdXJzb3JfQ2hhcmFjdGVyTGl0ZXJhbCAgICAgICAgICAgICAgPSAxMTAsCisKKyAgLyoqIFxicmllZiBBIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiwgZS5nLiAiKDEpIi4KKyAgICoKKyAgICogVGhpcyBBU1Qgbm9kZSBpcyBvbmx5IGZvcm1lZCBpZiBmdWxsIGxvY2F0aW9uIGluZm9ybWF0aW9uIGlzIHJlcXVlc3RlZC4KKyAgICovCisgIENYQ3Vyc29yX1BhcmVuRXhwciAgICAgICAgICAgICAgICAgICAgID0gMTExLAorCisgIC8qKiBcYnJpZWYgVGhpcyByZXByZXNlbnRzIHRoZSB1bmFyeS1leHByZXNzaW9uJ3MgKGV4Y2VwdCBzaXplb2YgYW5kCisgICAqIGFsaWdub2YpLgorICAgKi8KKyAgQ1hDdXJzb3JfVW5hcnlPcGVyYXRvciAgICAgICAgICAgICAgICAgPSAxMTIsCisKKyAgLyoqIFxicmllZiBbQzk5IDYuNS4yLjFdIEFycmF5IFN1YnNjcmlwdGluZy4KKyAgICovCisgIENYQ3Vyc29yX0FycmF5U3Vic2NyaXB0RXhwciAgICAgICAgICAgID0gMTEzLAorCisgIC8qKiBcYnJpZWYgQSBidWlsdGluIGJpbmFyeSBvcGVyYXRpb24gZXhwcmVzc2lvbiBzdWNoIGFzICJ4ICsgeSIgb3IKKyAgICogInggPD0geSIuCisgICAqLworICBDWEN1cnNvcl9CaW5hcnlPcGVyYXRvciAgICAgICAgICAgICAgICA9IDExNCwKKworICAvKiogXGJyaWVmIENvbXBvdW5kIGFzc2lnbm1lbnQgc3VjaCBhcyAiKz0iLgorICAgKi8KKyAgQ1hDdXJzb3JfQ29tcG91bmRBc3NpZ25PcGVyYXRvciAgICAgICAgPSAxMTUsCisKKyAgLyoqIFxicmllZiBUaGUgPzogdGVybmFyeSBvcGVyYXRvci4KKyAgICovCisgIENYQ3Vyc29yX0NvbmRpdGlvbmFsT3BlcmF0b3IgICAgICAgICAgID0gMTE2LAorCisgIC8qKiBcYnJpZWYgQW4gZXhwbGljaXQgY2FzdCBpbiBDIChDOTkgNi41LjQpIG9yIGEgQy1zdHlsZSBjYXN0IGluIEMrKworICAgKiAoQysrIFtleHByLmNhc3RdKSwgd2hpY2ggdXNlcyB0aGUgc3ludGF4IChUeXBlKWV4cHIuCisgICAqCisgICAqIEZvciBleGFtcGxlOiAoaW50KWYuCisgICAqLworICBDWEN1cnNvcl9DU3R5bGVDYXN0RXhwciAgICAgICAgICAgICAgICA9IDExNywKKworICAvKiogXGJyaWVmIFtDOTkgNi41LjIuNV0KKyAgICovCisgIENYQ3Vyc29yX0NvbXBvdW5kTGl0ZXJhbEV4cHIgICAgICAgICAgID0gMTE4LAorCisgIC8qKiBcYnJpZWYgRGVzY3JpYmVzIGFuIEMgb3IgQysrIGluaXRpYWxpemVyIGxpc3QuCisgICAqLworICBDWEN1cnNvcl9Jbml0TGlzdEV4cHIgICAgICAgICAgICAgICAgICA9IDExOSwKKworICAvKiogXGJyaWVmIFRoZSBHTlUgYWRkcmVzcyBvZiBsYWJlbCBleHRlbnNpb24sIHJlcHJlc2VudGluZyAmJmxhYmVsLgorICAgKi8KKyAgQ1hDdXJzb3JfQWRkckxhYmVsRXhwciAgICAgICAgICAgICAgICAgPSAxMjAsCisKKyAgLyoqIFxicmllZiBUaGlzIGlzIHRoZSBHTlUgU3RhdGVtZW50IEV4cHJlc3Npb24gZXh0ZW5zaW9uOiAoe2ludCBYPTQ7IFg7fSkKKyAgICovCisgIENYQ3Vyc29yX1N0bXRFeHByICAgICAgICAgICAgICAgICAgICAgID0gMTIxLAorCisgIC8qKiBcYnJpZWYgUmVwcmVzZW50cyBhIEMxMSBnZW5lcmljIHNlbGVjdGlvbi4KKyAgICovCisgIENYQ3Vyc29yX0dlbmVyaWNTZWxlY3Rpb25FeHByICAgICAgICAgID0gMTIyLAorCisgIC8qKiBcYnJpZWYgSW1wbGVtZW50cyB0aGUgR05VIF9fbnVsbCBleHRlbnNpb24sIHdoaWNoIGlzIGEgbmFtZSBmb3IgYSBudWxsCisgICAqIHBvaW50ZXIgY29uc3RhbnQgdGhhdCBoYXMgaW50ZWdyYWwgdHlwZSAoZS5nLiwgaW50IG9yIGxvbmcpIGFuZCBpcyB0aGUgc2FtZQorICAgKiBzaXplIGFuZCBhbGlnbm1lbnQgYXMgYSBwb2ludGVyLgorICAgKgorICAgKiBUaGUgX19udWxsIGV4dGVuc2lvbiBpcyB0eXBpY2FsbHkgb25seSB1c2VkIGJ5IHN5c3RlbSBoZWFkZXJzLCB3aGljaCBkZWZpbmUKKyAgICogTlVMTCBhcyBfX251bGwgaW4gQysrIHJhdGhlciB0aGFuIHVzaW5nIDAgKHdoaWNoIGlzIGFuIGludGVnZXIgdGhhdCBtYXkgbm90CisgICAqIG1hdGNoIHRoZSBzaXplIG9mIGEgcG9pbnRlcikuCisgICAqLworICBDWEN1cnNvcl9HTlVOdWxsRXhwciAgICAgICAgICAgICAgICAgICA9IDEyMywKKworICAvKiogXGJyaWVmIEMrKydzIHN0YXRpY19jYXN0PD4gZXhwcmVzc2lvbi4KKyAgICovCisgIENYQ3Vyc29yX0NYWFN0YXRpY0Nhc3RFeHByICAgICAgICAgICAgID0gMTI0LAorCisgIC8qKiBcYnJpZWYgQysrJ3MgZHluYW1pY19jYXN0PD4gZXhwcmVzc2lvbi4KKyAgICovCisgIENYQ3Vyc29yX0NYWER5bmFtaWNDYXN0RXhwciAgICAgICAgICAgID0gMTI1LAorCisgIC8qKiBcYnJpZWYgQysrJ3MgcmVpbnRlcnByZXRfY2FzdDw+IGV4cHJlc3Npb24uCisgICAqLworICBDWEN1cnNvcl9DWFhSZWludGVycHJldENhc3RFeHByICAgICAgICA9IDEyNiwKKworICAvKiogXGJyaWVmIEMrKydzIGNvbnN0X2Nhc3Q8PiBleHByZXNzaW9uLgorICAgKi8KKyAgQ1hDdXJzb3JfQ1hYQ29uc3RDYXN0RXhwciAgICAgICAgICAgICAgPSAxMjcsCisKKyAgLyoqIFxicmllZiBSZXByZXNlbnRzIGFuIGV4cGxpY2l0IEMrKyB0eXBlIGNvbnZlcnNpb24gdGhhdCB1c2VzICJmdW5jdGlvbmFsIgorICAgKiBub3Rpb24gKEMrKyBbZXhwci50eXBlLmNvbnZdKS4KKyAgICoKKyAgICogRXhhbXBsZToKKyAgICogXGNvZGUKKyAgICogICB4ID0gaW50KDAuNSk7CisgICAqIFxlbmRjb2RlCisgICAqLworICBDWEN1cnNvcl9DWFhGdW5jdGlvbmFsQ2FzdEV4cHIgICAgICAgICA9IDEyOCwKKworICAvKiogXGJyaWVmIEEgQysrIHR5cGVpZCBleHByZXNzaW9uIChDKysgW2V4cHIudHlwZWlkXSkuCisgICAqLworICBDWEN1cnNvcl9DWFhUeXBlaWRFeHByICAgICAgICAgICAgICAgICA9IDEyOSwKKworICAvKiogXGJyaWVmIFtDKysgMi4xMy41XSBDKysgQm9vbGVhbiBMaXRlcmFsLgorICAgKi8KKyAgQ1hDdXJzb3JfQ1hYQm9vbExpdGVyYWxFeHByICAgICAgICAgICAgPSAxMzAsCisKKyAgLyoqIFxicmllZiBbQysrMHggMi4xNC43XSBDKysgUG9pbnRlciBMaXRlcmFsLgorICAgKi8KKyAgQ1hDdXJzb3JfQ1hYTnVsbFB0ckxpdGVyYWxFeHByICAgICAgICAgPSAxMzEsCisKKyAgLyoqIFxicmllZiBSZXByZXNlbnRzIHRoZSAidGhpcyIgZXhwcmVzc2lvbiBpbiBDKysKKyAgICovCisgIENYQ3Vyc29yX0NYWFRoaXNFeHByICAgICAgICAgICAgICAgICAgID0gMTMyLAorCisgIC8qKiBcYnJpZWYgW0MrKyAxNV0gQysrIFRocm93IEV4cHJlc3Npb24uCisgICAqCisgICAqIFRoaXMgaGFuZGxlcyAndGhyb3cnIGFuZCAndGhyb3cnIGFzc2lnbm1lbnQtZXhwcmVzc2lvbi4gV2hlbgorICAgKiBhc3NpZ25tZW50LWV4cHJlc3Npb24gaXNuJ3QgcHJlc2VudCwgT3Agd2lsbCBiZSBudWxsLgorICAgKi8KKyAgQ1hDdXJzb3JfQ1hYVGhyb3dFeHByICAgICAgICAgICAgICAgICAgPSAxMzMsCisKKyAgLyoqIFxicmllZiBBIG5ldyBleHByZXNzaW9uIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgY29uc3RydWN0b3IgY2FsbHMsIGUuZzoKKyAgICogIm5ldyBDWFhOZXdFeHByKGZvbykiLgorICAgKi8KKyAgQ1hDdXJzb3JfQ1hYTmV3RXhwciAgICAgICAgICAgICAgICAgICAgPSAxMzQsCisKKyAgLyoqIFxicmllZiBBIGRlbGV0ZSBleHByZXNzaW9uIGZvciBtZW1vcnkgZGVhbGxvY2F0aW9uIGFuZCBkZXN0cnVjdG9yIGNhbGxzLAorICAgKiBlLmcuICJkZWxldGVbXSBwQXJyYXkiLgorICAgKi8KKyAgQ1hDdXJzb3JfQ1hYRGVsZXRlRXhwciAgICAgICAgICAgICAgICAgPSAxMzUsCisKKyAgLyoqIFxicmllZiBBIHVuYXJ5IGV4cHJlc3Npb24uIChub2V4Y2VwdCwgc2l6ZW9mLCBvciBvdGhlciB0cmFpdHMpCisgICAqLworICBDWEN1cnNvcl9VbmFyeUV4cHIgICAgICAgICAgICAgICAgICAgICA9IDEzNiwKKworICAvKiogXGJyaWVmIEFuIE9iamVjdGl2ZS1DIHN0cmluZyBsaXRlcmFsIGkuZS4gQCJmb28iLgorICAgKi8KKyAgQ1hDdXJzb3JfT2JqQ1N0cmluZ0xpdGVyYWwgICAgICAgICAgICAgPSAxMzcsCisKKyAgLyoqIFxicmllZiBBbiBPYmplY3RpdmUtQyBcQGVuY29kZSBleHByZXNzaW9uLgorICAgKi8KKyAgQ1hDdXJzb3JfT2JqQ0VuY29kZUV4cHIgICAgICAgICAgICAgICAgPSAxMzgsCisKKyAgLyoqIFxicmllZiBBbiBPYmplY3RpdmUtQyBcQHNlbGVjdG9yIGV4cHJlc3Npb24uCisgICAqLworICBDWEN1cnNvcl9PYmpDU2VsZWN0b3JFeHByICAgICAgICAgICAgICA9IDEzOSwKKworICAvKiogXGJyaWVmIEFuIE9iamVjdGl2ZS1DIFxAcHJvdG9jb2wgZXhwcmVzc2lvbi4KKyAgICovCisgIENYQ3Vyc29yX09iakNQcm90b2NvbEV4cHIgICAgICAgICAgICAgID0gMTQwLAorCisgIC8qKiBcYnJpZWYgQW4gT2JqZWN0aXZlLUMgImJyaWRnZWQiIGNhc3QgZXhwcmVzc2lvbiwgd2hpY2ggY2FzdHMgYmV0d2VlbgorICAgKiBPYmplY3RpdmUtQyBwb2ludGVycyBhbmQgQyBwb2ludGVycywgdHJhbnNmZXJyaW5nIG93bmVyc2hpcCBpbiB0aGUgcHJvY2Vzcy4KKyAgICoKKyAgICogXGNvZGUKKyAgICogICBOU1N0cmluZyAqc3RyID0gKF9fYnJpZGdlX3RyYW5zZmVyIE5TU3RyaW5nICopQ0ZDcmVhdGVTdHJpbmcoKTsKKyAgICogXGVuZGNvZGUKKyAgICovCisgIENYQ3Vyc29yX09iakNCcmlkZ2VkQ2FzdEV4cHIgICAgICAgICAgID0gMTQxLAorCisgIC8qKiBcYnJpZWYgUmVwcmVzZW50cyBhIEMrKzB4IHBhY2sgZXhwYW5zaW9uIHRoYXQgcHJvZHVjZXMgYSBzZXF1ZW5jZSBvZgorICAgKiBleHByZXNzaW9ucy4KKyAgICoKKyAgICogQSBwYWNrIGV4cGFuc2lvbiBleHByZXNzaW9uIGNvbnRhaW5zIGEgcGF0dGVybiAod2hpY2ggaXRzZWxmIGlzIGFuCisgICAqIGV4cHJlc3Npb24pIGZvbGxvd2VkIGJ5IGFuIGVsbGlwc2lzLiBGb3IgZXhhbXBsZToKKyAgICoKKyAgICogXGNvZGUKKyAgICogdGVtcGxhdGU8dHlwZW5hbWUgRiwgdHlwZW5hbWUgLi4uVHlwZXM+CisgICAqIHZvaWQgZm9yd2FyZChGIGYsIFR5cGVzICYmLi4uYXJncykgeworICAgKiAgZihzdGF0aWNfY2FzdDxUeXBlcyYmPihhcmdzKS4uLik7CisgICAqIH0KKyAgICogXGVuZGNvZGUKKyAgICovCisgIENYQ3Vyc29yX1BhY2tFeHBhbnNpb25FeHByICAgICAgICAgICAgID0gMTQyLAorCisgIC8qKiBcYnJpZWYgUmVwcmVzZW50cyBhbiBleHByZXNzaW9uIHRoYXQgY29tcHV0ZXMgdGhlIGxlbmd0aCBvZiBhIHBhcmFtZXRlcgorICAgKiBwYWNrLgorICAgKgorICAgKiBcY29kZQorICAgKiB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5UeXBlcz4KKyAgICogc3RydWN0IGNvdW50IHsKKyAgICogICBzdGF0aWMgY29uc3QgdW5zaWduZWQgdmFsdWUgPSBzaXplb2YuLi4oVHlwZXMpOworICAgKiB9OworICAgKiBcZW5kY29kZQorICAgKi8KKyAgQ1hDdXJzb3JfU2l6ZU9mUGFja0V4cHIgICAgICAgICAgICAgICAgPSAxNDMsCisKKyAgLyogXGJyaWVmIFJlcHJlc2VudHMgYSBDKysgbGFtYmRhIGV4cHJlc3Npb24gdGhhdCBwcm9kdWNlcyBhIGxvY2FsIGZ1bmN0aW9uCisgICAqIG9iamVjdC4KKyAgICoKKyAgICogXGNvZGUKKyAgICogdm9pZCBhYnNzb3J0KGZsb2F0ICp4LCB1bnNpZ25lZCBOKSB7CisgICAqICAgc3RkOjpzb3J0KHgsIHggKyBOLAorICAgKiAgICAgICAgICAgICBbXShmbG9hdCBhLCBmbG9hdCBiKSB7CisgICAqICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YWJzKGEpIDwgc3RkOjphYnMoYik7CisgICAqICAgICAgICAgICAgIH0pOworICAgKiB9CisgICAqIFxlbmRjb2RlCisgICAqLworICBDWEN1cnNvcl9MYW1iZGFFeHByICAgICAgICAgICAgICAgICAgICA9IDE0NCwKKyAgCisgIC8qKiBcYnJpZWYgT2JqZWN0aXZlLWMgQm9vbGVhbiBMaXRlcmFsLgorICAgKi8KKyAgQ1hDdXJzb3JfT2JqQ0Jvb2xMaXRlcmFsRXhwciAgICAgICAgICAgPSAxNDUsCisKKyAgLyoqIFxicmllZiBSZXByZXNlbnRzIHRoZSAic2VsZiIgZXhwcmVzc2lvbiBpbiBhbiBPYmplY3RpdmUtQyBtZXRob2QuCisgICAqLworICBDWEN1cnNvcl9PYmpDU2VsZkV4cHIgICAgICAgICAgICAgICAgICA9IDE0NiwKKworICAvKiogXGJyaWVmIE9wZW5NUCA0LjAgWzIuNCwgQXJyYXkgU2VjdGlvbl0uCisgICAqLworICBDWEN1cnNvcl9PTVBBcnJheVNlY3Rpb25FeHByICAgICAgICAgICA9IDE0NywKKworICAvKiogXGJyaWVmIFJlcHJlc2VudHMgYW4gQGF2YWlsYWJsZSguLi4pIGNoZWNrLgorICAgKi8KKyAgQ1hDdXJzb3JfT2JqQ0F2YWlsYWJpbGl0eUNoZWNrRXhwciAgICAgPSAxNDgsCisKKyAgQ1hDdXJzb3JfTGFzdEV4cHIgICAgICAgICAgICAgICAgICAgICAgPSBDWEN1cnNvcl9PYmpDQXZhaWxhYmlsaXR5Q2hlY2tFeHByLAorCisgIC8qIFN0YXRlbWVudHMgKi8KKyAgQ1hDdXJzb3JfRmlyc3RTdG10ICAgICAgICAgICAgICAgICAgICAgPSAyMDAsCisgIC8qKgorICAgKiBcYnJpZWYgQSBzdGF0ZW1lbnQgd2hvc2Ugc3BlY2lmaWMga2luZCBpcyBub3QgZXhwb3NlZCB2aWEgdGhpcworICAgKiBpbnRlcmZhY2UuCisgICAqCisgICAqIFVuZXhwb3NlZCBzdGF0ZW1lbnRzIGhhdmUgdGhlIHNhbWUgb3BlcmF0aW9ucyBhcyBhbnkgb3RoZXIga2luZCBvZgorICAgKiBzdGF0ZW1lbnQ7IG9uZSBjYW4gZXh0cmFjdCB0aGVpciBsb2NhdGlvbiBpbmZvcm1hdGlvbiwgc3BlbGxpbmcsCisgICAqIGNoaWxkcmVuLCBldGMuIEhvd2V2ZXIsIHRoZSBzcGVjaWZpYyBraW5kIG9mIHRoZSBzdGF0ZW1lbnQgaXMgbm90CisgICAqIHJlcG9ydGVkLgorICAgKi8KKyAgQ1hDdXJzb3JfVW5leHBvc2VkU3RtdCAgICAgICAgICAgICAgICAgPSAyMDAsCisgIAorICAvKiogXGJyaWVmIEEgbGFiZWxsZWQgc3RhdGVtZW50IGluIGEgZnVuY3Rpb24uIAorICAgKgorICAgKiBUaGlzIGN1cnNvciBraW5kIGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlICJzdGFydF9vdmVyOiIgbGFiZWwgc3RhdGVtZW50IGluIAorICAgKiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgICAqCisgICAqIFxjb2RlCisgICAqICAgc3RhcnRfb3ZlcjoKKyAgICogICAgICsrY291bnRlcjsKKyAgICogXGVuZGNvZGUKKyAgICoKKyAgICovCisgIENYQ3Vyc29yX0xhYmVsU3RtdCAgICAgICAgICAgICAgICAgICAgID0gMjAxLAorCisgIC8qKiBcYnJpZWYgQSBncm91cCBvZiBzdGF0ZW1lbnRzIGxpa2UgeyBzdG10IHN0bXQgfS4KKyAgICoKKyAgICogVGhpcyBjdXJzb3Iga2luZCBpcyB1c2VkIHRvIGRlc2NyaWJlIGNvbXBvdW5kIHN0YXRlbWVudHMsIGUuZy4gZnVuY3Rpb24KKyAgICogYm9kaWVzLgorICAgKi8KKyAgQ1hDdXJzb3JfQ29tcG91bmRTdG10ICAgICAgICAgICAgICAgICAgPSAyMDIsCisKKyAgLyoqIFxicmllZiBBIGNhc2Ugc3RhdGVtZW50LgorICAgKi8KKyAgQ1hDdXJzb3JfQ2FzZVN0bXQgICAgICAgICAgICAgICAgICAgICAgPSAyMDMsCisKKyAgLyoqIFxicmllZiBBIGRlZmF1bHQgc3RhdGVtZW50LgorICAgKi8KKyAgQ1hDdXJzb3JfRGVmYXVsdFN0bXQgICAgICAgICAgICAgICAgICAgPSAyMDQsCisKKyAgLyoqIFxicmllZiBBbiBpZiBzdGF0ZW1lbnQKKyAgICovCisgIENYQ3Vyc29yX0lmU3RtdCAgICAgICAgICAgICAgICAgICAgICAgID0gMjA1LAorCisgIC8qKiBcYnJpZWYgQSBzd2l0Y2ggc3RhdGVtZW50LgorICAgKi8KKyAgQ1hDdXJzb3JfU3dpdGNoU3RtdCAgICAgICAgICAgICAgICAgICAgPSAyMDYsCisKKyAgLyoqIFxicmllZiBBIHdoaWxlIHN0YXRlbWVudC4KKyAgICovCisgIENYQ3Vyc29yX1doaWxlU3RtdCAgICAgICAgICAgICAgICAgICAgID0gMjA3LAorCisgIC8qKiBcYnJpZWYgQSBkbyBzdGF0ZW1lbnQuCisgICAqLworICBDWEN1cnNvcl9Eb1N0bXQgICAgICAgICAgICAgICAgICAgICAgICA9IDIwOCwKKworICAvKiogXGJyaWVmIEEgZm9yIHN0YXRlbWVudC4KKyAgICovCisgIENYQ3Vyc29yX0ZvclN0bXQgICAgICAgICAgICAgICAgICAgICAgID0gMjA5LAorCisgIC8qKiBcYnJpZWYgQSBnb3RvIHN0YXRlbWVudC4KKyAgICovCisgIENYQ3Vyc29yX0dvdG9TdG10ICAgICAgICAgICAgICAgICAgICAgID0gMjEwLAorCisgIC8qKiBcYnJpZWYgQW4gaW5kaXJlY3QgZ290byBzdGF0ZW1lbnQuCisgICAqLworICBDWEN1cnNvcl9JbmRpcmVjdEdvdG9TdG10ICAgICAgICAgICAgICA9IDIxMSwKKworICAvKiogXGJyaWVmIEEgY29udGludWUgc3RhdGVtZW50LgorICAgKi8KKyAgQ1hDdXJzb3JfQ29udGludWVTdG10ICAgICAgICAgICAgICAgICAgPSAyMTIsCisKKyAgLyoqIFxicmllZiBBIGJyZWFrIHN0YXRlbWVudC4KKyAgICovCisgIENYQ3Vyc29yX0JyZWFrU3RtdCAgICAgICAgICAgICAgICAgICAgID0gMjEzLAorCisgIC8qKiBcYnJpZWYgQSByZXR1cm4gc3RhdGVtZW50LgorICAgKi8KKyAgQ1hDdXJzb3JfUmV0dXJuU3RtdCAgICAgICAgICAgICAgICAgICAgPSAyMTQsCisKKyAgLyoqIFxicmllZiBBIEdDQyBpbmxpbmUgYXNzZW1ibHkgc3RhdGVtZW50IGV4dGVuc2lvbi4KKyAgICovCisgIENYQ3Vyc29yX0dDQ0FzbVN0bXQgICAgICAgICAgICAgICAgICAgID0gMjE1LAorICBDWEN1cnNvcl9Bc21TdG10ICAgICAgICAgICAgICAgICAgICAgICA9IENYQ3Vyc29yX0dDQ0FzbVN0bXQsCisKKyAgLyoqIFxicmllZiBPYmplY3RpdmUtQydzIG92ZXJhbGwgXEB0cnktXEBjYXRjaC1cQGZpbmFsbHkgc3RhdGVtZW50LgorICAgKi8KKyAgQ1hDdXJzb3JfT2JqQ0F0VHJ5U3RtdCAgICAgICAgICAgICAgICAgPSAyMTYsCisKKyAgLyoqIFxicmllZiBPYmplY3RpdmUtQydzIFxAY2F0Y2ggc3RhdGVtZW50LgorICAgKi8KKyAgQ1hDdXJzb3JfT2JqQ0F0Q2F0Y2hTdG10ICAgICAgICAgICAgICAgPSAyMTcsCisKKyAgLyoqIFxicmllZiBPYmplY3RpdmUtQydzIFxAZmluYWxseSBzdGF0ZW1lbnQuCisgICAqLworICBDWEN1cnNvcl9PYmpDQXRGaW5hbGx5U3RtdCAgICAgICAgICAgICA9IDIxOCwKKworICAvKiogXGJyaWVmIE9iamVjdGl2ZS1DJ3MgXEB0aHJvdyBzdGF0ZW1lbnQuCisgICAqLworICBDWEN1cnNvcl9PYmpDQXRUaHJvd1N0bXQgICAgICAgICAgICAgICA9IDIxOSwKKworICAvKiogXGJyaWVmIE9iamVjdGl2ZS1DJ3MgXEBzeW5jaHJvbml6ZWQgc3RhdGVtZW50LgorICAgKi8KKyAgQ1hDdXJzb3JfT2JqQ0F0U3luY2hyb25pemVkU3RtdCAgICAgICAgPSAyMjAsCisKKyAgLyoqIFxicmllZiBPYmplY3RpdmUtQydzIGF1dG9yZWxlYXNlIHBvb2wgc3RhdGVtZW50LgorICAgKi8KKyAgQ1hDdXJzb3JfT2JqQ0F1dG9yZWxlYXNlUG9vbFN0bXQgICAgICAgPSAyMjEsCisKKyAgLyoqIFxicmllZiBPYmplY3RpdmUtQydzIGNvbGxlY3Rpb24gc3RhdGVtZW50LgorICAgKi8KKyAgQ1hDdXJzb3JfT2JqQ0ZvckNvbGxlY3Rpb25TdG10ICAgICAgICAgPSAyMjIsCisKKyAgLyoqIFxicmllZiBDKysncyBjYXRjaCBzdGF0ZW1lbnQuCisgICAqLworICBDWEN1cnNvcl9DWFhDYXRjaFN0bXQgICAgICAgICAgICAgICAgICA9IDIyMywKKworICAvKiogXGJyaWVmIEMrKydzIHRyeSBzdGF0ZW1lbnQuCisgICAqLworICBDWEN1cnNvcl9DWFhUcnlTdG10ICAgICAgICAgICAgICAgICAgICA9IDIyNCwKKworICAvKiogXGJyaWVmIEMrKydzIGZvciAoKiA6ICopIHN0YXRlbWVudC4KKyAgICovCisgIENYQ3Vyc29yX0NYWEZvclJhbmdlU3RtdCAgICAgICAgICAgICAgID0gMjI1LAorCisgIC8qKiBcYnJpZWYgV2luZG93cyBTdHJ1Y3R1cmVkIEV4Y2VwdGlvbiBIYW5kbGluZydzIHRyeSBzdGF0ZW1lbnQuCisgICAqLworICBDWEN1cnNvcl9TRUhUcnlTdG10ICAgICAgICAgICAgICAgICAgICA9IDIyNiwKKworICAvKiogXGJyaWVmIFdpbmRvd3MgU3RydWN0dXJlZCBFeGNlcHRpb24gSGFuZGxpbmcncyBleGNlcHQgc3RhdGVtZW50LgorICAgKi8KKyAgQ1hDdXJzb3JfU0VIRXhjZXB0U3RtdCAgICAgICAgICAgICAgICAgPSAyMjcsCisKKyAgLyoqIFxicmllZiBXaW5kb3dzIFN0cnVjdHVyZWQgRXhjZXB0aW9uIEhhbmRsaW5nJ3MgZmluYWxseSBzdGF0ZW1lbnQuCisgICAqLworICBDWEN1cnNvcl9TRUhGaW5hbGx5U3RtdCAgICAgICAgICAgICAgICA9IDIyOCwKKworICAvKiogXGJyaWVmIEEgTVMgaW5saW5lIGFzc2VtYmx5IHN0YXRlbWVudCBleHRlbnNpb24uCisgICAqLworICBDWEN1cnNvcl9NU0FzbVN0bXQgICAgICAgICAgICAgICAgICAgICA9IDIyOSwKKworICAvKiogXGJyaWVmIFRoZSBudWxsIHN0YXRlbWVudCAiOyI6IEM5OSA2LjguM3AzLgorICAgKgorICAgKiBUaGlzIGN1cnNvciBraW5kIGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIG51bGwgc3RhdGVtZW50LgorICAgKi8KKyAgQ1hDdXJzb3JfTnVsbFN0bXQgICAgICAgICAgICAgICAgICAgICAgPSAyMzAsCisKKyAgLyoqIFxicmllZiBBZGFwdG9yIGNsYXNzIGZvciBtaXhpbmcgZGVjbGFyYXRpb25zIHdpdGggc3RhdGVtZW50cyBhbmQKKyAgICogZXhwcmVzc2lvbnMuCisgICAqLworICBDWEN1cnNvcl9EZWNsU3RtdCAgICAgICAgICAgICAgICAgICAgICA9IDIzMSwKKworICAvKiogXGJyaWVmIE9wZW5NUCBwYXJhbGxlbCBkaXJlY3RpdmUuCisgICAqLworICBDWEN1cnNvcl9PTVBQYXJhbGxlbERpcmVjdGl2ZSAgICAgICAgICA9IDIzMiwKKworICAvKiogXGJyaWVmIE9wZW5NUCBTSU1EIGRpcmVjdGl2ZS4KKyAgICovCisgIENYQ3Vyc29yX09NUFNpbWREaXJlY3RpdmUgICAgICAgICAgICAgID0gMjMzLAorCisgIC8qKiBcYnJpZWYgT3Blbk1QIGZvciBkaXJlY3RpdmUuCisgICAqLworICBDWEN1cnNvcl9PTVBGb3JEaXJlY3RpdmUgICAgICAgICAgICAgICA9IDIzNCwKKworICAvKiogXGJyaWVmIE9wZW5NUCBzZWN0aW9ucyBkaXJlY3RpdmUuCisgICAqLworICBDWEN1cnNvcl9PTVBTZWN0aW9uc0RpcmVjdGl2ZSAgICAgICAgICA9IDIzNSwKKworICAvKiogXGJyaWVmIE9wZW5NUCBzZWN0aW9uIGRpcmVjdGl2ZS4KKyAgICovCisgIENYQ3Vyc29yX09NUFNlY3Rpb25EaXJlY3RpdmUgICAgICAgICAgID0gMjM2LAorCisgIC8qKiBcYnJpZWYgT3Blbk1QIHNpbmdsZSBkaXJlY3RpdmUuCisgICAqLworICBDWEN1cnNvcl9PTVBTaW5nbGVEaXJlY3RpdmUgICAgICAgICAgICA9IDIzNywKKworICAvKiogXGJyaWVmIE9wZW5NUCBwYXJhbGxlbCBmb3IgZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QUGFyYWxsZWxGb3JEaXJlY3RpdmUgICAgICAgPSAyMzgsCisKKyAgLyoqIFxicmllZiBPcGVuTVAgcGFyYWxsZWwgc2VjdGlvbnMgZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QUGFyYWxsZWxTZWN0aW9uc0RpcmVjdGl2ZSAgPSAyMzksCisKKyAgLyoqIFxicmllZiBPcGVuTVAgdGFzayBkaXJlY3RpdmUuCisgICAqLworICBDWEN1cnNvcl9PTVBUYXNrRGlyZWN0aXZlICAgICAgICAgICAgICA9IDI0MCwKKworICAvKiogXGJyaWVmIE9wZW5NUCBtYXN0ZXIgZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QTWFzdGVyRGlyZWN0aXZlICAgICAgICAgICAgPSAyNDEsCisKKyAgLyoqIFxicmllZiBPcGVuTVAgY3JpdGljYWwgZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QQ3JpdGljYWxEaXJlY3RpdmUgICAgICAgICAgPSAyNDIsCisKKyAgLyoqIFxicmllZiBPcGVuTVAgdGFza3lpZWxkIGRpcmVjdGl2ZS4KKyAgICovCisgIENYQ3Vyc29yX09NUFRhc2t5aWVsZERpcmVjdGl2ZSAgICAgICAgID0gMjQzLAorCisgIC8qKiBcYnJpZWYgT3Blbk1QIGJhcnJpZXIgZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QQmFycmllckRpcmVjdGl2ZSAgICAgICAgICAgPSAyNDQsCisKKyAgLyoqIFxicmllZiBPcGVuTVAgdGFza3dhaXQgZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QVGFza3dhaXREaXJlY3RpdmUgICAgICAgICAgPSAyNDUsCisKKyAgLyoqIFxicmllZiBPcGVuTVAgZmx1c2ggZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QRmx1c2hEaXJlY3RpdmUgICAgICAgICAgICAgPSAyNDYsCisKKyAgLyoqIFxicmllZiBXaW5kb3dzIFN0cnVjdHVyZWQgRXhjZXB0aW9uIEhhbmRsaW5nJ3MgbGVhdmUgc3RhdGVtZW50LgorICAgKi8KKyAgQ1hDdXJzb3JfU0VITGVhdmVTdG10ICAgICAgICAgICAgICAgICAgPSAyNDcsCisKKyAgLyoqIFxicmllZiBPcGVuTVAgb3JkZXJlZCBkaXJlY3RpdmUuCisgICAqLworICBDWEN1cnNvcl9PTVBPcmRlcmVkRGlyZWN0aXZlICAgICAgICAgICA9IDI0OCwKKworICAvKiogXGJyaWVmIE9wZW5NUCBhdG9taWMgZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QQXRvbWljRGlyZWN0aXZlICAgICAgICAgICAgPSAyNDksCisKKyAgLyoqIFxicmllZiBPcGVuTVAgZm9yIFNJTUQgZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QRm9yU2ltZERpcmVjdGl2ZSAgICAgICAgICAgPSAyNTAsCisKKyAgLyoqIFxicmllZiBPcGVuTVAgcGFyYWxsZWwgZm9yIFNJTUQgZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QUGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlICAgPSAyNTEsCisKKyAgLyoqIFxicmllZiBPcGVuTVAgdGFyZ2V0IGRpcmVjdGl2ZS4KKyAgICovCisgIENYQ3Vyc29yX09NUFRhcmdldERpcmVjdGl2ZSAgICAgICAgICAgID0gMjUyLAorCisgIC8qKiBcYnJpZWYgT3Blbk1QIHRlYW1zIGRpcmVjdGl2ZS4KKyAgICovCisgIENYQ3Vyc29yX09NUFRlYW1zRGlyZWN0aXZlICAgICAgICAgICAgID0gMjUzLAorCisgIC8qKiBcYnJpZWYgT3Blbk1QIHRhc2tncm91cCBkaXJlY3RpdmUuCisgICAqLworICBDWEN1cnNvcl9PTVBUYXNrZ3JvdXBEaXJlY3RpdmUgICAgICAgICA9IDI1NCwKKworICAvKiogXGJyaWVmIE9wZW5NUCBjYW5jZWxsYXRpb24gcG9pbnQgZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QQ2FuY2VsbGF0aW9uUG9pbnREaXJlY3RpdmUgPSAyNTUsCisKKyAgLyoqIFxicmllZiBPcGVuTVAgY2FuY2VsIGRpcmVjdGl2ZS4KKyAgICovCisgIENYQ3Vyc29yX09NUENhbmNlbERpcmVjdGl2ZSAgICAgICAgICAgID0gMjU2LAorCisgIC8qKiBcYnJpZWYgT3Blbk1QIHRhcmdldCBkYXRhIGRpcmVjdGl2ZS4KKyAgICovCisgIENYQ3Vyc29yX09NUFRhcmdldERhdGFEaXJlY3RpdmUgICAgICAgID0gMjU3LAorCisgIC8qKiBcYnJpZWYgT3Blbk1QIHRhc2tsb29wIGRpcmVjdGl2ZS4KKyAgICovCisgIENYQ3Vyc29yX09NUFRhc2tMb29wRGlyZWN0aXZlICAgICAgICAgID0gMjU4LAorCisgIC8qKiBcYnJpZWYgT3Blbk1QIHRhc2tsb29wIHNpbWQgZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QVGFza0xvb3BTaW1kRGlyZWN0aXZlICAgICAgPSAyNTksCisKKyAgLyoqIFxicmllZiBPcGVuTVAgZGlzdHJpYnV0ZSBkaXJlY3RpdmUuCisgICAqLworICBDWEN1cnNvcl9PTVBEaXN0cmlidXRlRGlyZWN0aXZlICAgICAgICA9IDI2MCwKKworICAvKiogXGJyaWVmIE9wZW5NUCB0YXJnZXQgZW50ZXIgZGF0YSBkaXJlY3RpdmUuCisgICAqLworICBDWEN1cnNvcl9PTVBUYXJnZXRFbnRlckRhdGFEaXJlY3RpdmUgICA9IDI2MSwKKworICAvKiogXGJyaWVmIE9wZW5NUCB0YXJnZXQgZXhpdCBkYXRhIGRpcmVjdGl2ZS4KKyAgICovCisgIENYQ3Vyc29yX09NUFRhcmdldEV4aXREYXRhRGlyZWN0aXZlICAgID0gMjYyLAorCisgIC8qKiBcYnJpZWYgT3Blbk1QIHRhcmdldCBwYXJhbGxlbCBkaXJlY3RpdmUuCisgICAqLworICBDWEN1cnNvcl9PTVBUYXJnZXRQYXJhbGxlbERpcmVjdGl2ZSAgICA9IDI2MywKKworICAvKiogXGJyaWVmIE9wZW5NUCB0YXJnZXQgcGFyYWxsZWwgZm9yIGRpcmVjdGl2ZS4KKyAgICovCisgIENYQ3Vyc29yX09NUFRhcmdldFBhcmFsbGVsRm9yRGlyZWN0aXZlID0gMjY0LAorCisgIC8qKiBcYnJpZWYgT3Blbk1QIHRhcmdldCB1cGRhdGUgZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QVGFyZ2V0VXBkYXRlRGlyZWN0aXZlICAgICAgPSAyNjUsCisKKyAgLyoqIFxicmllZiBPcGVuTVAgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3IgZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QRGlzdHJpYnV0ZVBhcmFsbGVsRm9yRGlyZWN0aXZlID0gMjY2LAorCisgIC8qKiBcYnJpZWYgT3Blbk1QIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yIHNpbWQgZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QRGlzdHJpYnV0ZVBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZSA9IDI2NywKKworICAvKiogXGJyaWVmIE9wZW5NUCBkaXN0cmlidXRlIHNpbWQgZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QRGlzdHJpYnV0ZVNpbWREaXJlY3RpdmUgPSAyNjgsCisKKyAgLyoqIFxicmllZiBPcGVuTVAgdGFyZ2V0IHBhcmFsbGVsIGZvciBzaW1kIGRpcmVjdGl2ZS4KKyAgICovCisgIENYQ3Vyc29yX09NUFRhcmdldFBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZSA9IDI2OSwKKworICAvKiogXGJyaWVmIE9wZW5NUCB0YXJnZXQgc2ltZCBkaXJlY3RpdmUuCisgICAqLworICBDWEN1cnNvcl9PTVBUYXJnZXRTaW1kRGlyZWN0aXZlID0gMjcwLAorCisgIC8qKiBcYnJpZWYgT3Blbk1QIHRlYW1zIGRpc3RyaWJ1dGUgZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QVGVhbXNEaXN0cmlidXRlRGlyZWN0aXZlID0gMjcxLAorCisgIC8qKiBcYnJpZWYgT3Blbk1QIHRlYW1zIGRpc3RyaWJ1dGUgc2ltZCBkaXJlY3RpdmUuCisgICAqLworICBDWEN1cnNvcl9PTVBUZWFtc0Rpc3RyaWJ1dGVTaW1kRGlyZWN0aXZlID0gMjcyLAorCisgIC8qKiBcYnJpZWYgT3Blbk1QIHRlYW1zIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yIHNpbWQgZGlyZWN0aXZlLgorICAgKi8KKyAgQ1hDdXJzb3JfT01QVGVhbXNEaXN0cmlidXRlUGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlID0gMjczLAorCisgIC8qKiBcYnJpZWYgT3Blbk1QIHRlYW1zIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yIGRpcmVjdGl2ZS4KKyAgICovCisgIENYQ3Vyc29yX09NUFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yRGlyZWN0aXZlID0gMjc0LAorCisgIC8qKiBcYnJpZWYgT3Blbk1QIHRhcmdldCB0ZWFtcyBkaXJlY3RpdmUuCisgICAqLworICBDWEN1cnNvcl9PTVBUYXJnZXRUZWFtc0RpcmVjdGl2ZSA9IDI3NSwKKworICAvKiogXGJyaWVmIE9wZW5NUCB0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSBkaXJlY3RpdmUuCisgICAqLworICBDWEN1cnNvcl9PTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVEaXJlY3RpdmUgPSAyNzYsCisKKyAgLyoqIFxicmllZiBPcGVuTVAgdGFyZ2V0IHRlYW1zIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yIGRpcmVjdGl2ZS4KKyAgICovCisgIENYQ3Vyc29yX09NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yRGlyZWN0aXZlID0gMjc3LAorCisgIC8qKiBcYnJpZWYgT3Blbk1QIHRhcmdldCB0ZWFtcyBkaXN0cmlidXRlIHBhcmFsbGVsIGZvciBzaW1kIGRpcmVjdGl2ZS4KKyAgICovCisgIENYQ3Vyc29yX09NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZSA9IDI3OCwKKworICAvKiogXGJyaWVmIE9wZW5NUCB0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSBzaW1kIGRpcmVjdGl2ZS4KKyAgICovCisgIENYQ3Vyc29yX09NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZVNpbWREaXJlY3RpdmUgPSAyNzksCisKKyAgQ1hDdXJzb3JfTGFzdFN0bXQgPSBDWEN1cnNvcl9PTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVTaW1kRGlyZWN0aXZlLAorCisgIC8qKgorICAgKiBcYnJpZWYgQ3Vyc29yIHRoYXQgcmVwcmVzZW50cyB0aGUgdHJhbnNsYXRpb24gdW5pdCBpdHNlbGYuCisgICAqCisgICAqIFRoZSB0cmFuc2xhdGlvbiB1bml0IGN1cnNvciBleGlzdHMgcHJpbWFyaWx5IHRvIGFjdCBhcyB0aGUgcm9vdAorICAgKiBjdXJzb3IgZm9yIHRyYXZlcnNpbmcgdGhlIGNvbnRlbnRzIG9mIGEgdHJhbnNsYXRpb24gdW5pdC4KKyAgICovCisgIENYQ3Vyc29yX1RyYW5zbGF0aW9uVW5pdCAgICAgICAgICAgICAgID0gMzAwLAorCisgIC8qIEF0dHJpYnV0ZXMgKi8KKyAgQ1hDdXJzb3JfRmlyc3RBdHRyICAgICAgICAgICAgICAgICAgICAgPSA0MDAsCisgIC8qKgorICAgKiBcYnJpZWYgQW4gYXR0cmlidXRlIHdob3NlIHNwZWNpZmljIGtpbmQgaXMgbm90IGV4cG9zZWQgdmlhIHRoaXMKKyAgICogaW50ZXJmYWNlLgorICAgKi8KKyAgQ1hDdXJzb3JfVW5leHBvc2VkQXR0ciAgICAgICAgICAgICAgICAgPSA0MDAsCisKKyAgQ1hDdXJzb3JfSUJBY3Rpb25BdHRyICAgICAgICAgICAgICAgICAgPSA0MDEsCisgIENYQ3Vyc29yX0lCT3V0bGV0QXR0ciAgICAgICAgICAgICAgICAgID0gNDAyLAorICBDWEN1cnNvcl9JQk91dGxldENvbGxlY3Rpb25BdHRyICAgICAgICA9IDQwMywKKyAgQ1hDdXJzb3JfQ1hYRmluYWxBdHRyICAgICAgICAgICAgICAgICAgPSA0MDQsCisgIENYQ3Vyc29yX0NYWE92ZXJyaWRlQXR0ciAgICAgICAgICAgICAgID0gNDA1LAorICBDWEN1cnNvcl9Bbm5vdGF0ZUF0dHIgICAgICAgICAgICAgICAgICA9IDQwNiwKKyAgQ1hDdXJzb3JfQXNtTGFiZWxBdHRyICAgICAgICAgICAgICAgICAgPSA0MDcsCisgIENYQ3Vyc29yX1BhY2tlZEF0dHIgICAgICAgICAgICAgICAgICAgID0gNDA4LAorICBDWEN1cnNvcl9QdXJlQXR0ciAgICAgICAgICAgICAgICAgICAgICA9IDQwOSwKKyAgQ1hDdXJzb3JfQ29uc3RBdHRyICAgICAgICAgICAgICAgICAgICAgPSA0MTAsCisgIENYQ3Vyc29yX05vRHVwbGljYXRlQXR0ciAgICAgICAgICAgICAgID0gNDExLAorICBDWEN1cnNvcl9DVURBQ29uc3RhbnRBdHRyICAgICAgICAgICAgICA9IDQxMiwKKyAgQ1hDdXJzb3JfQ1VEQURldmljZUF0dHIgICAgICAgICAgICAgICAgPSA0MTMsCisgIENYQ3Vyc29yX0NVREFHbG9iYWxBdHRyICAgICAgICAgICAgICAgID0gNDE0LAorICBDWEN1cnNvcl9DVURBSG9zdEF0dHIgICAgICAgICAgICAgICAgICA9IDQxNSwKKyAgQ1hDdXJzb3JfQ1VEQVNoYXJlZEF0dHIgICAgICAgICAgICAgICAgPSA0MTYsCisgIENYQ3Vyc29yX1Zpc2liaWxpdHlBdHRyICAgICAgICAgICAgICAgID0gNDE3LAorICBDWEN1cnNvcl9ETExFeHBvcnQgICAgICAgICAgICAgICAgICAgICA9IDQxOCwKKyAgQ1hDdXJzb3JfRExMSW1wb3J0ICAgICAgICAgICAgICAgICAgICAgPSA0MTksCisgIENYQ3Vyc29yX0xhc3RBdHRyICAgICAgICAgICAgICAgICAgICAgID0gQ1hDdXJzb3JfRExMSW1wb3J0LAorCisgIC8qIFByZXByb2Nlc3NpbmcgKi8KKyAgQ1hDdXJzb3JfUHJlcHJvY2Vzc2luZ0RpcmVjdGl2ZSAgICAgICAgPSA1MDAsCisgIENYQ3Vyc29yX01hY3JvRGVmaW5pdGlvbiAgICAgICAgICAgICAgID0gNTAxLAorICBDWEN1cnNvcl9NYWNyb0V4cGFuc2lvbiAgICAgICAgICAgICAgICA9IDUwMiwKKyAgQ1hDdXJzb3JfTWFjcm9JbnN0YW50aWF0aW9uICAgICAgICAgICAgPSBDWEN1cnNvcl9NYWNyb0V4cGFuc2lvbiwKKyAgQ1hDdXJzb3JfSW5jbHVzaW9uRGlyZWN0aXZlICAgICAgICAgICAgPSA1MDMsCisgIENYQ3Vyc29yX0ZpcnN0UHJlcHJvY2Vzc2luZyAgICAgICAgICAgID0gQ1hDdXJzb3JfUHJlcHJvY2Vzc2luZ0RpcmVjdGl2ZSwKKyAgQ1hDdXJzb3JfTGFzdFByZXByb2Nlc3NpbmcgICAgICAgICAgICAgPSBDWEN1cnNvcl9JbmNsdXNpb25EaXJlY3RpdmUsCisKKyAgLyogRXh0cmEgRGVjbGFyYXRpb25zICovCisgIC8qKgorICAgKiBcYnJpZWYgQSBtb2R1bGUgaW1wb3J0IGRlY2xhcmF0aW9uLgorICAgKi8KKyAgQ1hDdXJzb3JfTW9kdWxlSW1wb3J0RGVjbCAgICAgICAgICAgICAgPSA2MDAsCisgIENYQ3Vyc29yX1R5cGVBbGlhc1RlbXBsYXRlRGVjbCAgICAgICAgID0gNjAxLAorICAvKioKKyAgICogXGJyaWVmIEEgc3RhdGljX2Fzc2VydCBvciBfU3RhdGljX2Fzc2VydCBub2RlCisgICAqLworICBDWEN1cnNvcl9TdGF0aWNBc3NlcnQgICAgICAgICAgICAgICAgICA9IDYwMiwKKyAgLyoqCisgICAqIFxicmllZiBhIGZyaWVuZCBkZWNsYXJhdGlvbi4KKyAgICovCisgIENYQ3Vyc29yX0ZyaWVuZERlY2wgICAgICAgICAgICAgICAgICAgID0gNjAzLAorICBDWEN1cnNvcl9GaXJzdEV4dHJhRGVjbCAgICAgICAgICAgICAgICA9IENYQ3Vyc29yX01vZHVsZUltcG9ydERlY2wsCisgIENYQ3Vyc29yX0xhc3RFeHRyYURlY2wgICAgICAgICAgICAgICAgID0gQ1hDdXJzb3JfRnJpZW5kRGVjbCwKKworICAvKioKKyAgICogXGJyaWVmIEEgY29kZSBjb21wbGV0aW9uIG92ZXJsb2FkIGNhbmRpZGF0ZS4KKyAgICovCisgIENYQ3Vyc29yX092ZXJsb2FkQ2FuZGlkYXRlICAgICAgICAgICAgID0gNzAwCit9OworCisvKioKKyAqIFxicmllZiBBIGN1cnNvciByZXByZXNlbnRpbmcgc29tZSBlbGVtZW50IGluIHRoZSBhYnN0cmFjdCBzeW50YXggdHJlZSBmb3IKKyAqIGEgdHJhbnNsYXRpb24gdW5pdC4KKyAqCisgKiBUaGUgY3Vyc29yIGFic3RyYWN0aW9uIHVuaWZpZXMgdGhlIGRpZmZlcmVudCBraW5kcyBvZiBlbnRpdGllcyBpbiBhCisgKiBwcm9ncmFtLS1kZWNsYXJhdGlvbiwgc3RhdGVtZW50cywgZXhwcmVzc2lvbnMsIHJlZmVyZW5jZXMgdG8gZGVjbGFyYXRpb25zLAorICogZXRjLi0tdW5kZXIgYSBzaW5nbGUgImN1cnNvciIgYWJzdHJhY3Rpb24gd2l0aCBhIGNvbW1vbiBzZXQgb2Ygb3BlcmF0aW9ucy4KKyAqIENvbW1vbiBvcGVyYXRpb24gZm9yIGEgY3Vyc29yIGluY2x1ZGU6IGdldHRpbmcgdGhlIHBoeXNpY2FsIGxvY2F0aW9uIGluCisgKiBhIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSBjdXJzb3IgcG9pbnRzLCBnZXR0aW5nIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBhCisgKiBjdXJzb3IsIGFuZCByZXRyaWV2aW5nIGN1cnNvcnMgZm9yIGFueSBjaGlsZCBub2RlcyBvZiBhIHBhcnRpY3VsYXIgY3Vyc29yLgorICoKKyAqIEN1cnNvcnMgY2FuIGJlIHByb2R1Y2VkIGluIHR3byBzcGVjaWZpYyB3YXlzLgorICogY2xhbmdfZ2V0VHJhbnNsYXRpb25Vbml0Q3Vyc29yKCkgcHJvZHVjZXMgYSBjdXJzb3IgZm9yIGEgdHJhbnNsYXRpb24gdW5pdCwKKyAqIGZyb20gd2hpY2ggb25lIGNhbiB1c2UgY2xhbmdfdmlzaXRDaGlsZHJlbigpIHRvIGV4cGxvcmUgdGhlIHJlc3Qgb2YgdGhlCisgKiB0cmFuc2xhdGlvbiB1bml0LiBjbGFuZ19nZXRDdXJzb3IoKSBtYXBzIGZyb20gYSBwaHlzaWNhbCBzb3VyY2UgbG9jYXRpb24KKyAqIHRvIHRoZSBlbnRpdHkgdGhhdCByZXNpZGVzIGF0IHRoYXQgbG9jYXRpb24sIGFsbG93aW5nIG9uZSB0byBtYXAgZnJvbSB0aGUKKyAqIHNvdXJjZSBjb2RlIGludG8gdGhlIEFTVC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBlbnVtIENYQ3Vyc29yS2luZCBraW5kOworICBpbnQgeGRhdGE7CisgIGNvbnN0IHZvaWQgKmRhdGFbM107Cit9IENYQ3Vyc29yOworCisvKioKKyAqIFxkZWZncm91cCBDSU5ERVhfQ1VSU09SX01BTklQIEN1cnNvciBtYW5pcHVsYXRpb25zCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgTlVMTCBjdXJzb3IsIHdoaWNoIHJlcHJlc2VudHMgbm8gZW50aXR5LgorICovCitDSU5ERVhfTElOS0FHRSBDWEN1cnNvciBjbGFuZ19nZXROdWxsQ3Vyc29yKHZvaWQpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgY3Vyc29yIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gdHJhbnNsYXRpb24gdW5pdC4KKyAqCisgKiBUaGUgdHJhbnNsYXRpb24gdW5pdCBjdXJzb3IgY2FuIGJlIHVzZWQgdG8gc3RhcnQgdHJhdmVyc2luZyB0aGUKKyAqIHZhcmlvdXMgZGVjbGFyYXRpb25zIHdpdGhpbiB0aGUgZ2l2ZW4gdHJhbnNsYXRpb24gdW5pdC4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hDdXJzb3IgY2xhbmdfZ2V0VHJhbnNsYXRpb25Vbml0Q3Vyc29yKENYVHJhbnNsYXRpb25Vbml0KTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdHdvIGN1cnNvcnMgYXJlIGVxdWl2YWxlbnQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX2VxdWFsQ3Vyc29ycyhDWEN1cnNvciwgQ1hDdXJzb3IpOworCisvKioKKyAqIFxicmllZiBSZXR1cm5zIG5vbi16ZXJvIGlmIFxwIGN1cnNvciBpcyBudWxsLgorICovCitDSU5ERVhfTElOS0FHRSBpbnQgY2xhbmdfQ3Vyc29yX2lzTnVsbChDWEN1cnNvciBjdXJzb3IpOworCisvKioKKyAqIFxicmllZiBDb21wdXRlIGEgaGFzaCB2YWx1ZSBmb3IgdGhlIGdpdmVuIGN1cnNvci4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfaGFzaEN1cnNvcihDWEN1cnNvcik7CisgIAorLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIGtpbmQgb2YgdGhlIGdpdmVuIGN1cnNvci4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWEN1cnNvcktpbmQgY2xhbmdfZ2V0Q3Vyc29yS2luZChDWEN1cnNvcik7CisKKy8qKgorICogXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBjdXJzb3Iga2luZCByZXByZXNlbnRzIGEgZGVjbGFyYXRpb24uCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX2lzRGVjbGFyYXRpb24oZW51bSBDWEN1cnNvcktpbmQpOworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gZGVjbGFyYXRpb24gaXMgaW52YWxpZC4KKyAqCisgKiBBIGRlY2xhcmF0aW9uIGlzIGludmFsaWQgaWYgaXQgY291bGQgbm90IGJlIHBhcnNlZCBzdWNjZXNzZnVsbHkuCisgKgorICogXHJldHVybnMgbm9uLXplcm8gaWYgdGhlIGN1cnNvciByZXByZXNlbnRzIGEgZGVjbGFyYXRpb24gYW5kIGl0IGlzCisgKiBpbnZhbGlkLCBvdGhlcndpc2UgTlVMTC4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfaXNJbnZhbGlkRGVjbGFyYXRpb24oQ1hDdXJzb3IpOworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gY3Vyc29yIGtpbmQgcmVwcmVzZW50cyBhIHNpbXBsZQorICogcmVmZXJlbmNlLgorICoKKyAqIE5vdGUgdGhhdCBvdGhlciBraW5kcyBvZiBjdXJzb3JzIChzdWNoIGFzIGV4cHJlc3Npb25zKSBjYW4gYWxzbyByZWZlciB0bworICogb3RoZXIgY3Vyc29ycy4gVXNlIGNsYW5nX2dldEN1cnNvclJlZmVyZW5jZWQoKSB0byBkZXRlcm1pbmUgd2hldGhlciBhCisgKiBwYXJ0aWN1bGFyIGN1cnNvciByZWZlcnMgdG8gYW5vdGhlciBlbnRpdHkuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX2lzUmVmZXJlbmNlKGVudW0gQ1hDdXJzb3JLaW5kKTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGN1cnNvciBraW5kIHJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbi4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfaXNFeHByZXNzaW9uKGVudW0gQ1hDdXJzb3JLaW5kKTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGN1cnNvciBraW5kIHJlcHJlc2VudHMgYSBzdGF0ZW1lbnQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX2lzU3RhdGVtZW50KGVudW0gQ1hDdXJzb3JLaW5kKTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGN1cnNvciBraW5kIHJlcHJlc2VudHMgYW4gYXR0cmlidXRlLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19pc0F0dHJpYnV0ZShlbnVtIENYQ3Vyc29yS2luZCk7CisKKy8qKgorICogXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBjdXJzb3IgaGFzIGFueSBhdHRyaWJ1dGVzLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19DdXJzb3JfaGFzQXR0cnMoQ1hDdXJzb3IgQyk7CisKKy8qKgorICogXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBjdXJzb3Iga2luZCByZXByZXNlbnRzIGFuIGludmFsaWQKKyAqIGN1cnNvci4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfaXNJbnZhbGlkKGVudW0gQ1hDdXJzb3JLaW5kKTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGN1cnNvciBraW5kIHJlcHJlc2VudHMgYSB0cmFuc2xhdGlvbgorICogdW5pdC4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfaXNUcmFuc2xhdGlvblVuaXQoZW51bSBDWEN1cnNvcktpbmQpOworCisvKioqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGN1cnNvciByZXByZXNlbnRzIGEgcHJlcHJvY2Vzc2luZworICogZWxlbWVudCwgc3VjaCBhcyBhIHByZXByb2Nlc3NvciBkaXJlY3RpdmUgb3IgbWFjcm8gaW5zdGFudGlhdGlvbi4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfaXNQcmVwcm9jZXNzaW5nKGVudW0gQ1hDdXJzb3JLaW5kKTsKKyAgCisvKioqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGN1cnNvciByZXByZXNlbnRzIGEgY3VycmVudGx5CisgKiAgdW5leHBvc2VkIHBpZWNlIG9mIHRoZSBBU1QgKGUuZy4sIENYQ3Vyc29yX1VuZXhwb3NlZFN0bXQpLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19pc1VuZXhwb3NlZChlbnVtIENYQ3Vyc29yS2luZCk7CisKKy8qKgorICogXGJyaWVmIERlc2NyaWJlIHRoZSBsaW5rYWdlIG9mIHRoZSBlbnRpdHkgcmVmZXJyZWQgdG8gYnkgYSBjdXJzb3IuCisgKi8KK2VudW0gQ1hMaW5rYWdlS2luZCB7CisgIC8qKiBcYnJpZWYgVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBubyBsaW5rYWdlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQorICAgKiBmb3IgYSBwcm92aWRlZCBDWEN1cnNvci4gKi8KKyAgQ1hMaW5rYWdlX0ludmFsaWQsCisgIC8qKgorICAgKiBcYnJpZWYgVGhpcyBpcyB0aGUgbGlua2FnZSBmb3IgdmFyaWFibGVzLCBwYXJhbWV0ZXJzLCBhbmQgc28gb24gdGhhdAorICAgKiAgaGF2ZSBhdXRvbWF0aWMgc3RvcmFnZS4gIFRoaXMgY292ZXJzIG5vcm1hbCAobm9uLWV4dGVybikgbG9jYWwgdmFyaWFibGVzLgorICAgKi8KKyAgQ1hMaW5rYWdlX05vTGlua2FnZSwKKyAgLyoqIFxicmllZiBUaGlzIGlzIHRoZSBsaW5rYWdlIGZvciBzdGF0aWMgdmFyaWFibGVzIGFuZCBzdGF0aWMgZnVuY3Rpb25zLiAqLworICBDWExpbmthZ2VfSW50ZXJuYWwsCisgIC8qKiBcYnJpZWYgVGhpcyBpcyB0aGUgbGlua2FnZSBmb3IgZW50aXRpZXMgd2l0aCBleHRlcm5hbCBsaW5rYWdlIHRoYXQgbGl2ZQorICAgKiBpbiBDKysgYW5vbnltb3VzIG5hbWVzcGFjZXMuKi8KKyAgQ1hMaW5rYWdlX1VuaXF1ZUV4dGVybmFsLAorICAvKiogXGJyaWVmIFRoaXMgaXMgdGhlIGxpbmthZ2UgZm9yIGVudGl0aWVzIHdpdGggdHJ1ZSwgZXh0ZXJuYWwgbGlua2FnZS4gKi8KKyAgQ1hMaW5rYWdlX0V4dGVybmFsCit9OworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgdGhlIGxpbmthZ2Ugb2YgdGhlIGVudGl0eSByZWZlcnJlZCB0byBieSBhIGdpdmVuIGN1cnNvci4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWExpbmthZ2VLaW5kIGNsYW5nX2dldEN1cnNvckxpbmthZ2UoQ1hDdXJzb3IgY3Vyc29yKTsKKworZW51bSBDWFZpc2liaWxpdHlLaW5kIHsKKyAgLyoqIFxicmllZiBUaGlzIHZhbHVlIGluZGljYXRlcyB0aGF0IG5vIHZpc2liaWxpdHkgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlCisgICAqIGZvciBhIHByb3ZpZGVkIENYQ3Vyc29yLiAqLworICBDWFZpc2liaWxpdHlfSW52YWxpZCwKKworICAvKiogXGJyaWVmIFN5bWJvbCBub3Qgc2VlbiBieSB0aGUgbGlua2VyLiAqLworICBDWFZpc2liaWxpdHlfSGlkZGVuLAorICAvKiogXGJyaWVmIFN5bWJvbCBzZWVuIGJ5IHRoZSBsaW5rZXIgYnV0IHJlc29sdmVzIHRvIGEgc3ltYm9sIGluc2lkZSB0aGlzIG9iamVjdC4gKi8KKyAgQ1hWaXNpYmlsaXR5X1Byb3RlY3RlZCwKKyAgLyoqIFxicmllZiBTeW1ib2wgc2VlbiBieSB0aGUgbGlua2VyIGFuZCBhY3RzIGxpa2UgYSBub3JtYWwgc3ltYm9sLiAqLworICBDWFZpc2liaWxpdHlfRGVmYXVsdAorfTsKKworLyoqCisgKiBcYnJpZWYgRGVzY3JpYmUgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGVudGl0eSByZWZlcnJlZCB0byBieSBhIGN1cnNvci4KKyAqCisgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgdmlzaWJpbGl0eSBpZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQgYnkKKyAqIGEgdmlzaWJpbGl0eSBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZpc2liaWxpdHkgbWF5IGJlIGNoYW5nZWQgYnkKKyAqIGNvbW1hbmRsaW5lIGFyZ3VtZW50cy4KKyAqCisgKiBccGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgdG8gcXVlcnkuCisgKgorICogXHJldHVybnMgVGhlIHZpc2liaWxpdHkgb2YgdGhlIGN1cnNvci4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWFZpc2liaWxpdHlLaW5kIGNsYW5nX2dldEN1cnNvclZpc2liaWxpdHkoQ1hDdXJzb3IgY3Vyc29yKTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIGVudGl0eSB0aGF0IHRoaXMgY3Vyc29yIHJlZmVycyB0bywKKyAqIHRha2luZyB0aGUgY3VycmVudCB0YXJnZXQgcGxhdGZvcm0gaW50byBhY2NvdW50LgorICoKKyAqIFxwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB0byBxdWVyeS4KKyAqCisgKiBccmV0dXJucyBUaGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBjdXJzb3IuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGVudW0gQ1hBdmFpbGFiaWxpdHlLaW5kIAorY2xhbmdfZ2V0Q3Vyc29yQXZhaWxhYmlsaXR5KENYQ3Vyc29yIGN1cnNvcik7CisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBhdmFpbGFiaWxpdHkgb2YgYSBnaXZlbiBlbnRpdHkgb24gYSBwYXJ0aWN1bGFyIHBsYXRmb3JtLCBlLmcuLAorICogYSBwYXJ0aWN1bGFyIGNsYXNzIG1pZ2h0IG9ubHkgYmUgYXZhaWxhYmxlIG9uIE1hYyBPUyAxMC43IG9yIG5ld2VyLgorICovCit0eXBlZGVmIHN0cnVjdCBDWFBsYXRmb3JtQXZhaWxhYmlsaXR5IHsKKyAgLyoqCisgICAqIFxicmllZiBBIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgcGxhdGZvcm0gZm9yIHdoaWNoIHRoaXMgc3RydWN0dXJlCisgICAqIHByb3ZpZGVzIGF2YWlsYWJpbGl0eSBpbmZvcm1hdGlvbi4KKyAgICoKKyAgICogUG9zc2libGUgdmFsdWVzIGFyZSAiaW9zIiBvciAibWFjb3MiLgorICAgKi8KKyAgQ1hTdHJpbmcgUGxhdGZvcm07CisgIC8qKgorICAgKiBcYnJpZWYgVGhlIHZlcnNpb24gbnVtYmVyIGluIHdoaWNoIHRoaXMgZW50aXR5IHdhcyBpbnRyb2R1Y2VkLgorICAgKi8KKyAgQ1hWZXJzaW9uIEludHJvZHVjZWQ7CisgIC8qKgorICAgKiBcYnJpZWYgVGhlIHZlcnNpb24gbnVtYmVyIGluIHdoaWNoIHRoaXMgZW50aXR5IHdhcyBkZXByZWNhdGVkIChidXQgaXMKKyAgICogc3RpbGwgYXZhaWxhYmxlKS4KKyAgICovCisgIENYVmVyc2lvbiBEZXByZWNhdGVkOworICAvKioKKyAgICogXGJyaWVmIFRoZSB2ZXJzaW9uIG51bWJlciBpbiB3aGljaCB0aGlzIGVudGl0eSB3YXMgb2Jzb2xldGVkLCBhbmQgdGhlcmVmb3JlCisgICAqIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuCisgICAqLworICBDWFZlcnNpb24gT2Jzb2xldGVkOworICAvKioKKyAgICogXGJyaWVmIFdoZXRoZXIgdGhlIGVudGl0eSBpcyB1bmNvbmRpdGlvbmFsbHkgdW5hdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybS4KKyAgICovCisgIGludCBVbmF2YWlsYWJsZTsKKyAgLyoqCisgICAqIFxicmllZiBBbiBvcHRpb25hbCBtZXNzYWdlIHRvIHByb3ZpZGUgdG8gYSB1c2VyIG9mIHRoaXMgQVBJLCBlLmcuLCB0bworICAgKiBzdWdnZXN0IHJlcGxhY2VtZW50IEFQSXMuCisgICAqLworICBDWFN0cmluZyBNZXNzYWdlOworfSBDWFBsYXRmb3JtQXZhaWxhYmlsaXR5OworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgZW50aXR5IHRoYXQgdGhpcyBjdXJzb3IgcmVmZXJzIHRvCisgKiBvbiBhbnkgcGxhdGZvcm1zIGZvciB3aGljaCBhdmFpbGFiaWxpdHkgaW5mb3JtYXRpb24gaXMga25vd24uCisgKgorICogXHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRvIHF1ZXJ5LgorICoKKyAqIFxwYXJhbSBhbHdheXNfZGVwcmVjYXRlZCBJZiBub24tTlVMTCwgd2lsbCBiZSBzZXQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgCisgKiBlbnRpdHkgaXMgZGVwcmVjYXRlZCBvbiBhbGwgcGxhdGZvcm1zLgorICoKKyAqIFxwYXJhbSBkZXByZWNhdGVkX21lc3NhZ2UgSWYgbm9uLU5VTEwsIHdpbGwgYmUgc2V0IHRvIHRoZSBtZXNzYWdlIHRleHQgCisgKiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSB1bmNvbmRpdGlvbmFsIGRlcHJlY2F0aW9uIG9mIHRoaXMgZW50aXR5LiBUaGUgY2xpZW50CisgKiBpcyByZXNwb25zaWJsZSBmb3IgZGVhbGxvY2F0aW5nIHRoaXMgc3RyaW5nLgorICoKKyAqIFxwYXJhbSBhbHdheXNfdW5hdmFpbGFibGUgSWYgbm9uLU5VTEwsIHdpbGwgYmUgc2V0IHRvIGluZGljYXRlIHdoZXRoZXIgdGhlCisgKiBlbnRpdHkgaXMgdW5hdmFpbGFibGUgb24gYWxsIHBsYXRmb3Jtcy4KKyAqCisgKiBccGFyYW0gdW5hdmFpbGFibGVfbWVzc2FnZSBJZiBub24tTlVMTCwgd2lsbCBiZSBzZXQgdG8gdGhlIG1lc3NhZ2UgdGV4dAorICogcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgdW5jb25kaXRpb25hbCB1bmF2YWlsYWJpbGl0eSBvZiB0aGlzIGVudGl0eS4gVGhlIAorICogY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBkZWFsbG9jYXRpbmcgdGhpcyBzdHJpbmcuCisgKgorICogXHBhcmFtIGF2YWlsYWJpbGl0eSBJZiBub24tTlVMTCwgYW4gYXJyYXkgb2YgQ1hQbGF0Zm9ybUF2YWlsYWJpbGl0eSBpbnN0YW5jZXMKKyAqIHRoYXQgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBwbGF0Zm9ybSBhdmFpbGFiaWxpdHkgaW5mb3JtYXRpb24sIHVwIHRvIGVpdGhlcgorICogdGhlIG51bWJlciBvZiBwbGF0Zm9ybXMgZm9yIHdoaWNoIGF2YWlsYWJpbGl0eSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgKGFzCisgKiByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uKSBvciBcYyBhdmFpbGFiaWxpdHlfc2l6ZSwgd2hpY2hldmVyIGlzIHNtYWxsZXIuCisgKgorICogXHBhcmFtIGF2YWlsYWJpbGl0eV9zaXplIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYXZhaWxhYmxlIGluIHRoZSAKKyAqIFxjIGF2YWlsYWJpbGl0eSBhcnJheS4KKyAqCisgKiBccmV0dXJucyBUaGUgbnVtYmVyIG9mIHBsYXRmb3JtcyAoTikgZm9yIHdoaWNoIGF2YWlsYWJpbGl0eSBpbmZvcm1hdGlvbiBpcworICogYXZhaWxhYmxlICh3aGljaCBpcyB1bnJlbGF0ZWQgdG8gXGMgYXZhaWxhYmlsaXR5X3NpemUpLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIAorICogXGMgY2xhbmdfZGlzcG9zZUNYUGxhdGZvcm1BdmFpbGFiaWxpdHkgdG8gZnJlZSBlYWNoIG9mIHRoZSAKKyAqIHBsYXRmb3JtLWF2YWlsYWJpbGl0eSBzdHJ1Y3R1cmVzIHJldHVybmVkLiBUaGVyZSBhcmUgCisgKiBcYyBtaW4oTiwgYXZhaWxhYmlsaXR5X3NpemUpIHN1Y2ggc3RydWN0dXJlcy4KKyAqLworQ0lOREVYX0xJTktBR0UgaW50CitjbGFuZ19nZXRDdXJzb3JQbGF0Zm9ybUF2YWlsYWJpbGl0eShDWEN1cnNvciBjdXJzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmFsd2F5c19kZXByZWNhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hTdHJpbmcgKmRlcHJlY2F0ZWRfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYWx3YXlzX3VuYXZhaWxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hTdHJpbmcgKnVuYXZhaWxhYmxlX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFBsYXRmb3JtQXZhaWxhYmlsaXR5ICphdmFpbGFiaWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXZhaWxhYmlsaXR5X3NpemUpOworCisvKioKKyAqIFxicmllZiBGcmVlIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGEgXGMgQ1hQbGF0Zm9ybUF2YWlsYWJpbGl0eSBzdHJ1Y3R1cmUuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHZvaWQKK2NsYW5nX2Rpc3Bvc2VDWFBsYXRmb3JtQXZhaWxhYmlsaXR5KENYUGxhdGZvcm1BdmFpbGFiaWxpdHkgKmF2YWlsYWJpbGl0eSk7CisgIAorLyoqCisgKiBcYnJpZWYgRGVzY3JpYmUgdGhlICJsYW5ndWFnZSIgb2YgdGhlIGVudGl0eSByZWZlcnJlZCB0byBieSBhIGN1cnNvci4KKyAqLworZW51bSBDWExhbmd1YWdlS2luZCB7CisgIENYTGFuZ3VhZ2VfSW52YWxpZCA9IDAsCisgIENYTGFuZ3VhZ2VfQywKKyAgQ1hMYW5ndWFnZV9PYmpDLAorICBDWExhbmd1YWdlX0NQbHVzUGx1cworfTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHRoZSAibGFuZ3VhZ2UiIG9mIHRoZSBlbnRpdHkgcmVmZXJyZWQgdG8gYnkgYSBnaXZlbiBjdXJzb3IuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGVudW0gQ1hMYW5ndWFnZUtpbmQgY2xhbmdfZ2V0Q3Vyc29yTGFuZ3VhZ2UoQ1hDdXJzb3IgY3Vyc29yKTsKKworLyoqCisgKiBcYnJpZWYgRGVzY3JpYmUgdGhlICJ0aHJlYWQtbG9jYWwgc3RvcmFnZSAoVExTKSBraW5kIiBvZiB0aGUgZGVjbGFyYXRpb24KKyAqIHJlZmVycmVkIHRvIGJ5IGEgY3Vyc29yLgorICovCitlbnVtIENYVExTS2luZCB7CisgIENYVExTX05vbmUgPSAwLAorICBDWFRMU19EeW5hbWljLAorICBDWFRMU19TdGF0aWMKK307CisKKy8qKgorICogXGJyaWVmIERldGVybWluZSB0aGUgInRocmVhZC1sb2NhbCBzdG9yYWdlIChUTFMpIGtpbmQiIG9mIHRoZSBkZWNsYXJhdGlvbgorICogcmVmZXJyZWQgdG8gYnkgYSBjdXJzb3IuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGVudW0gQ1hUTFNLaW5kIGNsYW5nX2dldEN1cnNvclRMU0tpbmQoQ1hDdXJzb3IgY3Vyc29yKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJucyB0aGUgdHJhbnNsYXRpb24gdW5pdCB0aGF0IGEgY3Vyc29yIG9yaWdpbmF0ZWQgZnJvbS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hUcmFuc2xhdGlvblVuaXQgY2xhbmdfQ3Vyc29yX2dldFRyYW5zbGF0aW9uVW5pdChDWEN1cnNvcik7CisKKy8qKgorICogXGJyaWVmIEEgZmFzdCBjb250YWluZXIgcmVwcmVzZW50aW5nIGEgc2V0IG9mIENYQ3Vyc29ycy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ1hDdXJzb3JTZXRJbXBsICpDWEN1cnNvclNldDsKKworLyoqCisgKiBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBDWEN1cnNvclNldC4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hDdXJzb3JTZXQgY2xhbmdfY3JlYXRlQ1hDdXJzb3JTZXQodm9pZCk7CisKKy8qKgorICogXGJyaWVmIERpc3Bvc2VzIGEgQ1hDdXJzb3JTZXQgYW5kIHJlbGVhc2VzIGl0cyBhc3NvY2lhdGVkIG1lbW9yeS4KKyAqLworQ0lOREVYX0xJTktBR0Ugdm9pZCBjbGFuZ19kaXNwb3NlQ1hDdXJzb3JTZXQoQ1hDdXJzb3JTZXQgY3NldCk7CisKKy8qKgorICogXGJyaWVmIFF1ZXJpZXMgYSBDWEN1cnNvclNldCB0byBzZWUgaWYgaXQgY29udGFpbnMgYSBzcGVjaWZpYyBDWEN1cnNvci4KKyAqCisgKiBccmV0dXJucyBub24temVybyBpZiB0aGUgc2V0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY3Vyc29yLgorKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX0NYQ3Vyc29yU2V0X2NvbnRhaW5zKENYQ3Vyc29yU2V0IGNzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEN1cnNvciBjdXJzb3IpOworCisvKioKKyAqIFxicmllZiBJbnNlcnRzIGEgQ1hDdXJzb3IgaW50byBhIENYQ3Vyc29yU2V0LgorICoKKyAqIFxyZXR1cm5zIHplcm8gaWYgdGhlIENYQ3Vyc29yIHdhcyBhbHJlYWR5IGluIHRoZSBzZXQsIGFuZCBub24temVybyBvdGhlcndpc2UuCisqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfQ1hDdXJzb3JTZXRfaW5zZXJ0KENYQ3Vyc29yU2V0IGNzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hDdXJzb3IgY3Vyc29yKTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBzZW1hbnRpYyBwYXJlbnQgb2YgdGhlIGdpdmVuIGN1cnNvci4KKyAqCisgKiBUaGUgc2VtYW50aWMgcGFyZW50IG9mIGEgY3Vyc29yIGlzIHRoZSBjdXJzb3IgdGhhdCBzZW1hbnRpY2FsbHkgY29udGFpbnMKKyAqIHRoZSBnaXZlbiBccCBjdXJzb3IuIEZvciBtYW55IGRlY2xhcmF0aW9ucywgdGhlIGxleGljYWwgYW5kIHNlbWFudGljIHBhcmVudHMKKyAqIGFyZSBlcXVpdmFsZW50ICh0aGUgbGV4aWNhbCBwYXJlbnQgaXMgcmV0dXJuZWQgYnkgCisgKiBcYyBjbGFuZ19nZXRDdXJzb3JMZXhpY2FsUGFyZW50KCkpLiBUaGV5IGRpdmVyZ2Ugd2hlbiBkZWNsYXJhdGlvbnMgb3IKKyAqIGRlZmluaXRpb25zIGFyZSBwcm92aWRlZCBvdXQtb2YtbGluZS4gRm9yIGV4YW1wbGU6CisgKgorICogXGNvZGUKKyAqIGNsYXNzIEMgeworICogIHZvaWQgZigpOworICogfTsKKyAqCisgKiB2b2lkIEM6OmYoKSB7IH0KKyAqIFxlbmRjb2RlCisgKgorICogSW4gdGhlIG91dC1vZi1saW5lIGRlZmluaXRpb24gb2YgXGMgQzo6ZiwgdGhlIHNlbWFudGljIHBhcmVudCBpcworICogdGhlIGNsYXNzIFxjIEMsIG9mIHdoaWNoIHRoaXMgZnVuY3Rpb24gaXMgYSBtZW1iZXIuIFRoZSBsZXhpY2FsIHBhcmVudCBpcworICogdGhlIHBsYWNlIHdoZXJlIHRoZSBkZWNsYXJhdGlvbiBhY3R1YWxseSBvY2N1cnMgaW4gdGhlIHNvdXJjZSBjb2RlOyBpbiB0aGlzCisgKiBjYXNlLCB0aGUgZGVmaW5pdGlvbiBvY2N1cnMgaW4gdGhlIHRyYW5zbGF0aW9uIHVuaXQuIEluIGdlbmVyYWwsIHRoZQorICogbGV4aWNhbCBwYXJlbnQgZm9yIGEgZ2l2ZW4gZW50aXR5IGNhbiBjaGFuZ2Ugd2l0aG91dCBhZmZlY3RpbmcgdGhlIHNlbWFudGljcworICogb2YgdGhlIHByb2dyYW0sIGFuZCB0aGUgbGV4aWNhbCBwYXJlbnQgb2YgZGlmZmVyZW50IGRlY2xhcmF0aW9ucyBvZiB0aGUKKyAqIHNhbWUgZW50aXR5IG1heSBiZSBkaWZmZXJlbnQuIENoYW5naW5nIHRoZSBzZW1hbnRpYyBwYXJlbnQgb2YgYSBkZWNsYXJhdGlvbiwKKyAqIG9uIHRoZSBvdGhlciBoYW5kLCBjYW4gaGF2ZSBhIG1ham9yIGltcGFjdCBvbiBzZW1hbnRpY3MsIGFuZCByZWRlY2xhcmF0aW9ucworICogb2YgYSBwYXJ0aWN1bGFyIGVudGl0eSBzaG91bGQgYWxsIGhhdmUgdGhlIHNhbWUgc2VtYW50aWMgY29udGV4dC4KKyAqCisgKiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgYm90aCBkZWNsYXJhdGlvbnMgb2YgXGMgQzo6ZiBoYXZlIFxjIEMgYXMgdGhlaXIKKyAqIHNlbWFudGljIGNvbnRleHQsIHdoaWxlIHRoZSBsZXhpY2FsIGNvbnRleHQgb2YgdGhlIGZpcnN0IFxjIEM6OmYgaXMgXGMgQworICogYW5kIHRoZSBsZXhpY2FsIGNvbnRleHQgb2YgdGhlIHNlY29uZCBcYyBDOjpmIGlzIHRoZSB0cmFuc2xhdGlvbiB1bml0LgorICoKKyAqIEZvciBnbG9iYWwgZGVjbGFyYXRpb25zLCB0aGUgc2VtYW50aWMgcGFyZW50IGlzIHRoZSB0cmFuc2xhdGlvbiB1bml0LgorICovCitDSU5ERVhfTElOS0FHRSBDWEN1cnNvciBjbGFuZ19nZXRDdXJzb3JTZW1hbnRpY1BhcmVudChDWEN1cnNvciBjdXJzb3IpOworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgdGhlIGxleGljYWwgcGFyZW50IG9mIHRoZSBnaXZlbiBjdXJzb3IuCisgKgorICogVGhlIGxleGljYWwgcGFyZW50IG9mIGEgY3Vyc29yIGlzIHRoZSBjdXJzb3IgaW4gd2hpY2ggdGhlIGdpdmVuIFxwIGN1cnNvcgorICogd2FzIGFjdHVhbGx5IHdyaXR0ZW4uIEZvciBtYW55IGRlY2xhcmF0aW9ucywgdGhlIGxleGljYWwgYW5kIHNlbWFudGljIHBhcmVudHMKKyAqIGFyZSBlcXVpdmFsZW50ICh0aGUgc2VtYW50aWMgcGFyZW50IGlzIHJldHVybmVkIGJ5IAorICogXGMgY2xhbmdfZ2V0Q3Vyc29yU2VtYW50aWNQYXJlbnQoKSkuIFRoZXkgZGl2ZXJnZSB3aGVuIGRlY2xhcmF0aW9ucyBvcgorICogZGVmaW5pdGlvbnMgYXJlIHByb3ZpZGVkIG91dC1vZi1saW5lLiBGb3IgZXhhbXBsZToKKyAqCisgKiBcY29kZQorICogY2xhc3MgQyB7CisgKiAgdm9pZCBmKCk7CisgKiB9OworICoKKyAqIHZvaWQgQzo6ZigpIHsgfQorICogXGVuZGNvZGUKKyAqCisgKiBJbiB0aGUgb3V0LW9mLWxpbmUgZGVmaW5pdGlvbiBvZiBcYyBDOjpmLCB0aGUgc2VtYW50aWMgcGFyZW50IGlzCisgKiB0aGUgY2xhc3MgXGMgQywgb2Ygd2hpY2ggdGhpcyBmdW5jdGlvbiBpcyBhIG1lbWJlci4gVGhlIGxleGljYWwgcGFyZW50IGlzCisgKiB0aGUgcGxhY2Ugd2hlcmUgdGhlIGRlY2xhcmF0aW9uIGFjdHVhbGx5IG9jY3VycyBpbiB0aGUgc291cmNlIGNvZGU7IGluIHRoaXMKKyAqIGNhc2UsIHRoZSBkZWZpbml0aW9uIG9jY3VycyBpbiB0aGUgdHJhbnNsYXRpb24gdW5pdC4gSW4gZ2VuZXJhbCwgdGhlCisgKiBsZXhpY2FsIHBhcmVudCBmb3IgYSBnaXZlbiBlbnRpdHkgY2FuIGNoYW5nZSB3aXRob3V0IGFmZmVjdGluZyB0aGUgc2VtYW50aWNzCisgKiBvZiB0aGUgcHJvZ3JhbSwgYW5kIHRoZSBsZXhpY2FsIHBhcmVudCBvZiBkaWZmZXJlbnQgZGVjbGFyYXRpb25zIG9mIHRoZQorICogc2FtZSBlbnRpdHkgbWF5IGJlIGRpZmZlcmVudC4gQ2hhbmdpbmcgdGhlIHNlbWFudGljIHBhcmVudCBvZiBhIGRlY2xhcmF0aW9uLAorICogb24gdGhlIG90aGVyIGhhbmQsIGNhbiBoYXZlIGEgbWFqb3IgaW1wYWN0IG9uIHNlbWFudGljcywgYW5kIHJlZGVjbGFyYXRpb25zCisgKiBvZiBhIHBhcnRpY3VsYXIgZW50aXR5IHNob3VsZCBhbGwgaGF2ZSB0aGUgc2FtZSBzZW1hbnRpYyBjb250ZXh0LgorICoKKyAqIEluIHRoZSBleGFtcGxlIGFib3ZlLCBib3RoIGRlY2xhcmF0aW9ucyBvZiBcYyBDOjpmIGhhdmUgXGMgQyBhcyB0aGVpcgorICogc2VtYW50aWMgY29udGV4dCwgd2hpbGUgdGhlIGxleGljYWwgY29udGV4dCBvZiB0aGUgZmlyc3QgXGMgQzo6ZiBpcyBcYyBDCisgKiBhbmQgdGhlIGxleGljYWwgY29udGV4dCBvZiB0aGUgc2Vjb25kIFxjIEM6OmYgaXMgdGhlIHRyYW5zbGF0aW9uIHVuaXQuCisgKgorICogRm9yIGRlY2xhcmF0aW9ucyB3cml0dGVuIGluIHRoZSBnbG9iYWwgc2NvcGUsIHRoZSBsZXhpY2FsIHBhcmVudCBpcworICogdGhlIHRyYW5zbGF0aW9uIHVuaXQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYQ3Vyc29yIGNsYW5nX2dldEN1cnNvckxleGljYWxQYXJlbnQoQ1hDdXJzb3IgY3Vyc29yKTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBzZXQgb2YgbWV0aG9kcyB0aGF0IGFyZSBvdmVycmlkZGVuIGJ5IHRoZSBnaXZlbgorICogbWV0aG9kLgorICoKKyAqIEluIGJvdGggT2JqZWN0aXZlLUMgYW5kIEMrKywgYSBtZXRob2QgKGFrYSB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbiwKKyAqIGluIEMrKykgY2FuIG92ZXJyaWRlIGEgdmlydHVhbCBtZXRob2QgaW4gYSBiYXNlIGNsYXNzLiBGb3IKKyAqIE9iamVjdGl2ZS1DLCBhIG1ldGhvZCBpcyBzYWlkIHRvIG92ZXJyaWRlIGFueSBtZXRob2QgaW4gdGhlIGNsYXNzJ3MKKyAqIGJhc2UgY2xhc3MsIGl0cyBwcm90b2NvbHMsIG9yIGl0cyBjYXRlZ29yaWVzJyBwcm90b2NvbHMsIHRoYXQgaGFzIHRoZSBzYW1lCisgKiBzZWxlY3RvciBhbmQgaXMgb2YgdGhlIHNhbWUga2luZCAoY2xhc3Mgb3IgaW5zdGFuY2UpLgorICogSWYgbm8gc3VjaCBtZXRob2QgZXhpc3RzLCB0aGUgc2VhcmNoIGNvbnRpbnVlcyB0byB0aGUgY2xhc3MncyBzdXBlcmNsYXNzLAorICogaXRzIHByb3RvY29scywgYW5kIGl0cyBjYXRlZ29yaWVzLCBhbmQgc28gb24uIEEgbWV0aG9kIGZyb20gYW4gT2JqZWN0aXZlLUMKKyAqIGltcGxlbWVudGF0aW9uIGlzIGNvbnNpZGVyZWQgdG8gb3ZlcnJpZGUgdGhlIHNhbWUgbWV0aG9kcyBhcyBpdHMKKyAqIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGluIHRoZSBpbnRlcmZhY2UuCisgKgorICogRm9yIEMrKywgYSB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbiBvdmVycmlkZXMgYW55IHZpcnR1YWwgbWVtYmVyCisgKiBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSB0aGF0IG9jY3VycyBpbiBpdHMgYmFzZQorICogY2xhc3Nlcy4gV2l0aCBtdWx0aXBsZSBpbmhlcml0YW5jZSwgYSB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbiBjYW4KKyAqIG92ZXJyaWRlIHNldmVyYWwgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zIGNvbWluZyBmcm9tIGRpZmZlcmVudAorICogYmFzZSBjbGFzc2VzLgorICoKKyAqIEluIGFsbCBjYXNlcywgdGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIHRoZSBpbW1lZGlhdGUgb3ZlcnJpZGRlbgorICogbWV0aG9kLCByYXRoZXIgdGhhbiBhbGwgb2YgdGhlIG92ZXJyaWRkZW4gbWV0aG9kcy4gRm9yIGV4YW1wbGUsIGlmCisgKiBhIG1ldGhvZCBpcyBvcmlnaW5hbGx5IGRlY2xhcmVkIGluIGEgY2xhc3MgQSwgdGhlbiBvdmVycmlkZGVuIGluIEIKKyAqICh3aGljaCBpbiBpbmhlcml0cyBmcm9tIEEpIGFuZCBhbHNvIGluIEMgKHdoaWNoIGluaGVyaXRlZCBmcm9tIEIpLAorICogdGhlbiB0aGUgb25seSBvdmVycmlkZGVuIG1ldGhvZCByZXR1cm5lZCBmcm9tIHRoaXMgZnVuY3Rpb24gd2hlbgorICogaW52b2tlZCBvbiBDJ3MgbWV0aG9kIHdpbGwgYmUgQidzIG1ldGhvZC4gVGhlIGNsaWVudCBtYXkgdGhlbgorICogaW52b2tlIHRoaXMgZnVuY3Rpb24gYWdhaW4sIGdpdmVuIHRoZSBwcmV2aW91c2x5LWZvdW5kIG92ZXJyaWRkZW4KKyAqIG1ldGhvZHMsIHRvIG1hcCBvdXQgdGhlIGNvbXBsZXRlIG1ldGhvZC1vdmVycmlkZSBzZXQuCisgKgorICogXHBhcmFtIGN1cnNvciBBIGN1cnNvciByZXByZXNlbnRpbmcgYW4gT2JqZWN0aXZlLUMgb3IgQysrCisgKiBtZXRob2QuIFRoaXMgcm91dGluZSB3aWxsIGNvbXB1dGUgdGhlIHNldCBvZiBtZXRob2RzIHRoYXQgdGhpcworICogbWV0aG9kIG92ZXJyaWRlcy4KKyAqIAorICogXHBhcmFtIG92ZXJyaWRkZW4gQSBwb2ludGVyIHdob3NlIHBvaW50ZWUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGEKKyAqIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY3Vyc29ycywgcmVwcmVzZW50aW5nIHRoZSBzZXQgb2Ygb3ZlcnJpZGRlbgorICogbWV0aG9kcy4gSWYgdGhlcmUgYXJlIG5vIG92ZXJyaWRkZW4gbWV0aG9kcywgdGhlIHBvaW50ZWUgd2lsbCBiZQorICogc2V0IHRvIE5VTEwuIFRoZSBwb2ludGVlIG11c3QgYmUgZnJlZWQgdmlhIGEgY2FsbCB0byAKKyAqIFxjIGNsYW5nX2Rpc3Bvc2VPdmVycmlkZGVuQ3Vyc29ycygpLgorICoKKyAqIFxwYXJhbSBudW1fb3ZlcnJpZGRlbiBBIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBvdmVycmlkZGVuCisgKiBmdW5jdGlvbnMsIHdpbGwgYmUgc2V0IHRvIHRoZSBudW1iZXIgb2Ygb3ZlcnJpZGRlbiBmdW5jdGlvbnMgaW4gdGhlCisgKiBhcnJheSBwb2ludGVkIHRvIGJ5IFxwIG92ZXJyaWRkZW4uCisgKi8KK0NJTkRFWF9MSU5LQUdFIHZvaWQgY2xhbmdfZ2V0T3ZlcnJpZGRlbkN1cnNvcnMoQ1hDdXJzb3IgY3Vyc29yLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hDdXJzb3IgKipvdmVycmlkZGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqbnVtX292ZXJyaWRkZW4pOworCisvKioKKyAqIFxicmllZiBGcmVlIHRoZSBzZXQgb2Ygb3ZlcnJpZGRlbiBjdXJzb3JzIHJldHVybmVkIGJ5IFxjCisgKiBjbGFuZ19nZXRPdmVycmlkZGVuQ3Vyc29ycygpLgorICovCitDSU5ERVhfTElOS0FHRSB2b2lkIGNsYW5nX2Rpc3Bvc2VPdmVycmlkZGVuQ3Vyc29ycyhDWEN1cnNvciAqb3ZlcnJpZGRlbik7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBmaWxlIHRoYXQgaXMgaW5jbHVkZWQgYnkgdGhlIGdpdmVuIGluY2x1c2lvbiBkaXJlY3RpdmUKKyAqIGN1cnNvci4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hGaWxlIGNsYW5nX2dldEluY2x1ZGVkRmlsZShDWEN1cnNvciBjdXJzb3IpOworICAKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIFxkZWZncm91cCBDSU5ERVhfQ1VSU09SX1NPVVJDRSBNYXBwaW5nIGJldHdlZW4gY3Vyc29ycyBhbmQgc291cmNlIGNvZGUKKyAqCisgKiBDdXJzb3JzIHJlcHJlc2VudCBhIGxvY2F0aW9uIHdpdGhpbiB0aGUgQWJzdHJhY3QgU3ludGF4IFRyZWUgKEFTVCkuIFRoZXNlCisgKiByb3V0aW5lcyBoZWxwIG1hcCBiZXR3ZWVuIGN1cnNvcnMgYW5kIHRoZSBwaHlzaWNhbCBsb2NhdGlvbnMgd2hlcmUgdGhlCisgKiBkZXNjcmliZWQgZW50aXRpZXMgb2NjdXIgaW4gdGhlIHNvdXJjZSBjb2RlLiBUaGUgbWFwcGluZyBpcyBwcm92aWRlZCBpbgorICogYm90aCBkaXJlY3Rpb25zLCBzbyBvbmUgY2FuIG1hcCBmcm9tIHNvdXJjZSBjb2RlIHRvIHRoZSBBU1QgYW5kIGJhY2suCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFxicmllZiBNYXAgYSBzb3VyY2UgbG9jYXRpb24gdG8gdGhlIGN1cnNvciB0aGF0IGRlc2NyaWJlcyB0aGUgZW50aXR5IGF0IHRoYXQKKyAqIGxvY2F0aW9uIGluIHRoZSBzb3VyY2UgY29kZS4KKyAqCisgKiBjbGFuZ19nZXRDdXJzb3IoKSBtYXBzIGFuIGFyYml0cmFyeSBzb3VyY2UgbG9jYXRpb24gd2l0aGluIGEgdHJhbnNsYXRpb24KKyAqIHVuaXQgZG93biB0byB0aGUgbW9zdCBzcGVjaWZpYyBjdXJzb3IgdGhhdCBkZXNjcmliZXMgdGhlIGVudGl0eSBhdCB0aGF0CisgKiBsb2NhdGlvbi4gRm9yIGV4YW1wbGUsIGdpdmVuIGFuIGV4cHJlc3Npb24gXGMgeCArIHksIGludm9raW5nCisgKiBjbGFuZ19nZXRDdXJzb3IoKSB3aXRoIGEgc291cmNlIGxvY2F0aW9uIHBvaW50aW5nIHRvICJ4IiB3aWxsIHJldHVybiB0aGUKKyAqIGN1cnNvciBmb3IgIngiOyBzaW1pbGFybHkgZm9yICJ5Ii4gSWYgdGhlIGN1cnNvciBwb2ludHMgYW55d2hlcmUgYmV0d2VlbgorICogIngiIG9yICJ5IiAoZS5nLiwgb24gdGhlICsgb3IgdGhlIHdoaXRlc3BhY2UgYXJvdW5kIGl0KSwgY2xhbmdfZ2V0Q3Vyc29yKCkKKyAqIHdpbGwgcmV0dXJuIGEgY3Vyc29yIHJlZmVycmluZyB0byB0aGUgIisiIGV4cHJlc3Npb24uCisgKgorICogXHJldHVybnMgYSBjdXJzb3IgcmVwcmVzZW50aW5nIHRoZSBlbnRpdHkgYXQgdGhlIGdpdmVuIHNvdXJjZSBsb2NhdGlvbiwgb3IKKyAqIGEgTlVMTCBjdXJzb3IgaWYgbm8gc3VjaCBlbnRpdHkgY2FuIGJlIGZvdW5kLgorICovCitDSU5ERVhfTElOS0FHRSBDWEN1cnNvciBjbGFuZ19nZXRDdXJzb3IoQ1hUcmFuc2xhdGlvblVuaXQsIENYU291cmNlTG9jYXRpb24pOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgcGh5c2ljYWwgbG9jYXRpb24gb2YgdGhlIHNvdXJjZSBjb25zdHJ1Y3RvciByZWZlcmVuY2VkCisgKiBieSB0aGUgZ2l2ZW4gY3Vyc29yLgorICoKKyAqIFRoZSBsb2NhdGlvbiBvZiBhIGRlY2xhcmF0aW9uIGlzIHR5cGljYWxseSB0aGUgbG9jYXRpb24gb2YgdGhlIG5hbWUgb2YgdGhhdAorICogZGVjbGFyYXRpb24sIHdoZXJlIHRoZSBuYW1lIG9mIHRoYXQgZGVjbGFyYXRpb24gd291bGQgb2NjdXIgaWYgaXQgaXMKKyAqIHVubmFtZWQsIG9yIHNvbWUga2V5d29yZCB0aGF0IGludHJvZHVjZXMgdGhhdCBwYXJ0aWN1bGFyIGRlY2xhcmF0aW9uLgorICogVGhlIGxvY2F0aW9uIG9mIGEgcmVmZXJlbmNlIGlzIHdoZXJlIHRoYXQgcmVmZXJlbmNlIG9jY3VycyB3aXRoaW4gdGhlCisgKiBzb3VyY2UgY29kZS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTb3VyY2VMb2NhdGlvbiBjbGFuZ19nZXRDdXJzb3JMb2NhdGlvbihDWEN1cnNvcik7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBwaHlzaWNhbCBleHRlbnQgb2YgdGhlIHNvdXJjZSBjb25zdHJ1Y3QgcmVmZXJlbmNlZCBieQorICogdGhlIGdpdmVuIGN1cnNvci4KKyAqCisgKiBUaGUgZXh0ZW50IG9mIGEgY3Vyc29yIHN0YXJ0cyB3aXRoIHRoZSBmaWxlL2xpbmUvY29sdW1uIHBvaW50aW5nIGF0IHRoZQorICogZmlyc3QgY2hhcmFjdGVyIHdpdGhpbiB0aGUgc291cmNlIGNvbnN0cnVjdCB0aGF0IHRoZSBjdXJzb3IgcmVmZXJzIHRvIGFuZAorICogZW5kcyB3aXRoIHRoZSBsYXN0IGNoYXJhY3RlciB3aXRoaW4gdGhhdCBzb3VyY2UgY29uc3RydWN0LiBGb3IgYQorICogZGVjbGFyYXRpb24sIHRoZSBleHRlbnQgY292ZXJzIHRoZSBkZWNsYXJhdGlvbiBpdHNlbGYuIEZvciBhIHJlZmVyZW5jZSwKKyAqIHRoZSBleHRlbnQgY292ZXJzIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVmZXJlbmNlIChlLmcuLCB3aGVyZSB0aGUgcmVmZXJlbmNlZAorICogZW50aXR5IHdhcyBhY3R1YWxseSB1c2VkKS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTb3VyY2VSYW5nZSBjbGFuZ19nZXRDdXJzb3JFeHRlbnQoQ1hDdXJzb3IpOworCisvKioKKyAqIEB9CisgKi8KKyAgICAKKy8qKgorICogXGRlZmdyb3VwIENJTkRFWF9UWVBFUyBUeXBlIGluZm9ybWF0aW9uIGZvciBDWEN1cnNvcnMKKyAqCisgKiBAeworICovCisKKy8qKgorICogXGJyaWVmIERlc2NyaWJlcyB0aGUga2luZCBvZiB0eXBlCisgKi8KK2VudW0gQ1hUeXBlS2luZCB7CisgIC8qKgorICAgKiBcYnJpZWYgUmVwcmVzZW50cyBhbiBpbnZhbGlkIHR5cGUgKGUuZy4sIHdoZXJlIG5vIHR5cGUgaXMgYXZhaWxhYmxlKS4KKyAgICovCisgIENYVHlwZV9JbnZhbGlkID0gMCwKKworICAvKioKKyAgICogXGJyaWVmIEEgdHlwZSB3aG9zZSBzcGVjaWZpYyBraW5kIGlzIG5vdCBleHBvc2VkIHZpYSB0aGlzCisgICAqIGludGVyZmFjZS4KKyAgICovCisgIENYVHlwZV9VbmV4cG9zZWQgPSAxLAorCisgIC8qIEJ1aWx0aW4gdHlwZXMgKi8KKyAgQ1hUeXBlX1ZvaWQgPSAyLAorICBDWFR5cGVfQm9vbCA9IDMsCisgIENYVHlwZV9DaGFyX1UgPSA0LAorICBDWFR5cGVfVUNoYXIgPSA1LAorICBDWFR5cGVfQ2hhcjE2ID0gNiwKKyAgQ1hUeXBlX0NoYXIzMiA9IDcsCisgIENYVHlwZV9VU2hvcnQgPSA4LAorICBDWFR5cGVfVUludCA9IDksCisgIENYVHlwZV9VTG9uZyA9IDEwLAorICBDWFR5cGVfVUxvbmdMb25nID0gMTEsCisgIENYVHlwZV9VSW50MTI4ID0gMTIsCisgIENYVHlwZV9DaGFyX1MgPSAxMywKKyAgQ1hUeXBlX1NDaGFyID0gMTQsCisgIENYVHlwZV9XQ2hhciA9IDE1LAorICBDWFR5cGVfU2hvcnQgPSAxNiwKKyAgQ1hUeXBlX0ludCA9IDE3LAorICBDWFR5cGVfTG9uZyA9IDE4LAorICBDWFR5cGVfTG9uZ0xvbmcgPSAxOSwKKyAgQ1hUeXBlX0ludDEyOCA9IDIwLAorICBDWFR5cGVfRmxvYXQgPSAyMSwKKyAgQ1hUeXBlX0RvdWJsZSA9IDIyLAorICBDWFR5cGVfTG9uZ0RvdWJsZSA9IDIzLAorICBDWFR5cGVfTnVsbFB0ciA9IDI0LAorICBDWFR5cGVfT3ZlcmxvYWQgPSAyNSwKKyAgQ1hUeXBlX0RlcGVuZGVudCA9IDI2LAorICBDWFR5cGVfT2JqQ0lkID0gMjcsCisgIENYVHlwZV9PYmpDQ2xhc3MgPSAyOCwKKyAgQ1hUeXBlX09iakNTZWwgPSAyOSwKKyAgQ1hUeXBlX0Zsb2F0MTI4ID0gMzAsCisgIENYVHlwZV9IYWxmID0gMzEsCisgIENYVHlwZV9GbG9hdDE2ID0gMzIsCisgIENYVHlwZV9GaXJzdEJ1aWx0aW4gPSBDWFR5cGVfVm9pZCwKKyAgQ1hUeXBlX0xhc3RCdWlsdGluICA9IENYVHlwZV9GbG9hdDE2LAorCisgIENYVHlwZV9Db21wbGV4ID0gMTAwLAorICBDWFR5cGVfUG9pbnRlciA9IDEwMSwKKyAgQ1hUeXBlX0Jsb2NrUG9pbnRlciA9IDEwMiwKKyAgQ1hUeXBlX0xWYWx1ZVJlZmVyZW5jZSA9IDEwMywKKyAgQ1hUeXBlX1JWYWx1ZVJlZmVyZW5jZSA9IDEwNCwKKyAgQ1hUeXBlX1JlY29yZCA9IDEwNSwKKyAgQ1hUeXBlX0VudW0gPSAxMDYsCisgIENYVHlwZV9UeXBlZGVmID0gMTA3LAorICBDWFR5cGVfT2JqQ0ludGVyZmFjZSA9IDEwOCwKKyAgQ1hUeXBlX09iakNPYmplY3RQb2ludGVyID0gMTA5LAorICBDWFR5cGVfRnVuY3Rpb25Ob1Byb3RvID0gMTEwLAorICBDWFR5cGVfRnVuY3Rpb25Qcm90byA9IDExMSwKKyAgQ1hUeXBlX0NvbnN0YW50QXJyYXkgPSAxMTIsCisgIENYVHlwZV9WZWN0b3IgPSAxMTMsCisgIENYVHlwZV9JbmNvbXBsZXRlQXJyYXkgPSAxMTQsCisgIENYVHlwZV9WYXJpYWJsZUFycmF5ID0gMTE1LAorICBDWFR5cGVfRGVwZW5kZW50U2l6ZWRBcnJheSA9IDExNiwKKyAgQ1hUeXBlX01lbWJlclBvaW50ZXIgPSAxMTcsCisgIENYVHlwZV9BdXRvID0gMTE4LAorCisgIC8qKgorICAgKiBcYnJpZWYgUmVwcmVzZW50cyBhIHR5cGUgdGhhdCB3YXMgcmVmZXJyZWQgdG8gdXNpbmcgYW4gZWxhYm9yYXRlZCB0eXBlIGtleXdvcmQuCisgICAqCisgICAqIEUuZy4sIHN0cnVjdCBTLCBvciB2aWEgYSBxdWFsaWZpZWQgbmFtZSwgZS5nLiwgTjo6TTo6dHlwZSwgb3IgYm90aC4KKyAgICovCisgIENYVHlwZV9FbGFib3JhdGVkID0gMTE5LAorCisgIC8qIE9wZW5DTCBQaXBlVHlwZS4gKi8KKyAgQ1hUeXBlX1BpcGUgPSAxMjAsCisKKyAgLyogT3BlbkNMIGJ1aWx0aW4gdHlwZXMuICovCisgIENYVHlwZV9PQ0xJbWFnZTFkUk8gPSAxMjEsCisgIENYVHlwZV9PQ0xJbWFnZTFkQXJyYXlSTyA9IDEyMiwKKyAgQ1hUeXBlX09DTEltYWdlMWRCdWZmZXJSTyA9IDEyMywKKyAgQ1hUeXBlX09DTEltYWdlMmRSTyA9IDEyNCwKKyAgQ1hUeXBlX09DTEltYWdlMmRBcnJheVJPID0gMTI1LAorICBDWFR5cGVfT0NMSW1hZ2UyZERlcHRoUk8gPSAxMjYsCisgIENYVHlwZV9PQ0xJbWFnZTJkQXJyYXlEZXB0aFJPID0gMTI3LAorICBDWFR5cGVfT0NMSW1hZ2UyZE1TQUFSTyA9IDEyOCwKKyAgQ1hUeXBlX09DTEltYWdlMmRBcnJheU1TQUFSTyA9IDEyOSwKKyAgQ1hUeXBlX09DTEltYWdlMmRNU0FBRGVwdGhSTyA9IDEzMCwKKyAgQ1hUeXBlX09DTEltYWdlMmRBcnJheU1TQUFEZXB0aFJPID0gMTMxLAorICBDWFR5cGVfT0NMSW1hZ2UzZFJPID0gMTMyLAorICBDWFR5cGVfT0NMSW1hZ2UxZFdPID0gMTMzLAorICBDWFR5cGVfT0NMSW1hZ2UxZEFycmF5V08gPSAxMzQsCisgIENYVHlwZV9PQ0xJbWFnZTFkQnVmZmVyV08gPSAxMzUsCisgIENYVHlwZV9PQ0xJbWFnZTJkV08gPSAxMzYsCisgIENYVHlwZV9PQ0xJbWFnZTJkQXJyYXlXTyA9IDEzNywKKyAgQ1hUeXBlX09DTEltYWdlMmREZXB0aFdPID0gMTM4LAorICBDWFR5cGVfT0NMSW1hZ2UyZEFycmF5RGVwdGhXTyA9IDEzOSwKKyAgQ1hUeXBlX09DTEltYWdlMmRNU0FBV08gPSAxNDAsCisgIENYVHlwZV9PQ0xJbWFnZTJkQXJyYXlNU0FBV08gPSAxNDEsCisgIENYVHlwZV9PQ0xJbWFnZTJkTVNBQURlcHRoV08gPSAxNDIsCisgIENYVHlwZV9PQ0xJbWFnZTJkQXJyYXlNU0FBRGVwdGhXTyA9IDE0MywKKyAgQ1hUeXBlX09DTEltYWdlM2RXTyA9IDE0NCwKKyAgQ1hUeXBlX09DTEltYWdlMWRSVyA9IDE0NSwKKyAgQ1hUeXBlX09DTEltYWdlMWRBcnJheVJXID0gMTQ2LAorICBDWFR5cGVfT0NMSW1hZ2UxZEJ1ZmZlclJXID0gMTQ3LAorICBDWFR5cGVfT0NMSW1hZ2UyZFJXID0gMTQ4LAorICBDWFR5cGVfT0NMSW1hZ2UyZEFycmF5UlcgPSAxNDksCisgIENYVHlwZV9PQ0xJbWFnZTJkRGVwdGhSVyA9IDE1MCwKKyAgQ1hUeXBlX09DTEltYWdlMmRBcnJheURlcHRoUlcgPSAxNTEsCisgIENYVHlwZV9PQ0xJbWFnZTJkTVNBQVJXID0gMTUyLAorICBDWFR5cGVfT0NMSW1hZ2UyZEFycmF5TVNBQVJXID0gMTUzLAorICBDWFR5cGVfT0NMSW1hZ2UyZE1TQUFEZXB0aFJXID0gMTU0LAorICBDWFR5cGVfT0NMSW1hZ2UyZEFycmF5TVNBQURlcHRoUlcgPSAxNTUsCisgIENYVHlwZV9PQ0xJbWFnZTNkUlcgPSAxNTYsCisgIENYVHlwZV9PQ0xTYW1wbGVyID0gMTU3LAorICBDWFR5cGVfT0NMRXZlbnQgPSAxNTgsCisgIENYVHlwZV9PQ0xRdWV1ZSA9IDE1OSwKKyAgQ1hUeXBlX09DTFJlc2VydmVJRCA9IDE2MAorfTsKKworLyoqCisgKiBcYnJpZWYgRGVzY3JpYmVzIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gb2YgYSBmdW5jdGlvbiB0eXBlCisgKi8KK2VudW0gQ1hDYWxsaW5nQ29udiB7CisgIENYQ2FsbGluZ0NvbnZfRGVmYXVsdCA9IDAsCisgIENYQ2FsbGluZ0NvbnZfQyA9IDEsCisgIENYQ2FsbGluZ0NvbnZfWDg2U3RkQ2FsbCA9IDIsCisgIENYQ2FsbGluZ0NvbnZfWDg2RmFzdENhbGwgPSAzLAorICBDWENhbGxpbmdDb252X1g4NlRoaXNDYWxsID0gNCwKKyAgQ1hDYWxsaW5nQ29udl9YODZQYXNjYWwgPSA1LAorICBDWENhbGxpbmdDb252X0FBUENTID0gNiwKKyAgQ1hDYWxsaW5nQ29udl9BQVBDU19WRlAgPSA3LAorICBDWENhbGxpbmdDb252X1g4NlJlZ0NhbGwgPSA4LAorICBDWENhbGxpbmdDb252X0ludGVsT2NsQmljYyA9IDksCisgIENYQ2FsbGluZ0NvbnZfV2luNjQgPSAxMCwKKyAgLyogQWxpYXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBBUEkuICovCisgIENYQ2FsbGluZ0NvbnZfWDg2XzY0V2luNjQgPSBDWENhbGxpbmdDb252X1dpbjY0LAorICBDWENhbGxpbmdDb252X1g4Nl82NFN5c1YgPSAxMSwKKyAgQ1hDYWxsaW5nQ29udl9YODZWZWN0b3JDYWxsID0gMTIsCisgIENYQ2FsbGluZ0NvbnZfU3dpZnQgPSAxMywKKyAgQ1hDYWxsaW5nQ29udl9QcmVzZXJ2ZU1vc3QgPSAxNCwKKyAgQ1hDYWxsaW5nQ29udl9QcmVzZXJ2ZUFsbCA9IDE1LAorCisgIENYQ2FsbGluZ0NvbnZfSW52YWxpZCA9IDEwMCwKKyAgQ1hDYWxsaW5nQ29udl9VbmV4cG9zZWQgPSAyMDAKK307CisKKy8qKgorICogXGJyaWVmIFRoZSB0eXBlIG9mIGFuIGVsZW1lbnQgaW4gdGhlIGFic3RyYWN0IHN5bnRheCB0cmVlLgorICoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBlbnVtIENYVHlwZUtpbmQga2luZDsKKyAgdm9pZCAqZGF0YVsyXTsKK30gQ1hUeXBlOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgdHlwZSBvZiBhIENYQ3Vyc29yIChpZiBhbnkpLgorICovCitDSU5ERVhfTElOS0FHRSBDWFR5cGUgY2xhbmdfZ2V0Q3Vyc29yVHlwZShDWEN1cnNvciBDKTsKKworLyoqCisgKiBcYnJpZWYgUHJldHR5LXByaW50IHRoZSB1bmRlcmx5aW5nIHR5cGUgdXNpbmcgdGhlIHJ1bGVzIG9mIHRoZQorICogbGFuZ3VhZ2Ugb2YgdGhlIHRyYW5zbGF0aW9uIHVuaXQgZnJvbSB3aGljaCBpdCBjYW1lLgorICoKKyAqIElmIHRoZSB0eXBlIGlzIGludmFsaWQsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfZ2V0VHlwZVNwZWxsaW5nKENYVHlwZSBDVCk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSB1bmRlcmx5aW5nIHR5cGUgb2YgYSB0eXBlZGVmIGRlY2xhcmF0aW9uLgorICoKKyAqIElmIHRoZSBjdXJzb3IgZG9lcyBub3QgcmVmZXJlbmNlIGEgdHlwZWRlZiBkZWNsYXJhdGlvbiwgYW4gaW52YWxpZCB0eXBlIGlzCisgKiByZXR1cm5lZC4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hUeXBlIGNsYW5nX2dldFR5cGVkZWZEZWNsVW5kZXJseWluZ1R5cGUoQ1hDdXJzb3IgQyk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBpbnRlZ2VyIHR5cGUgb2YgYW4gZW51bSBkZWNsYXJhdGlvbi4KKyAqCisgKiBJZiB0aGUgY3Vyc29yIGRvZXMgbm90IHJlZmVyZW5jZSBhbiBlbnVtIGRlY2xhcmF0aW9uLCBhbiBpbnZhbGlkIHR5cGUgaXMKKyAqIHJldHVybmVkLgorICovCitDSU5ERVhfTElOS0FHRSBDWFR5cGUgY2xhbmdfZ2V0RW51bURlY2xJbnRlZ2VyVHlwZShDWEN1cnNvciBDKTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIGludGVnZXIgdmFsdWUgb2YgYW4gZW51bSBjb25zdGFudCBkZWNsYXJhdGlvbiBhcyBhIHNpZ25lZAorICogIGxvbmcgbG9uZy4KKyAqCisgKiBJZiB0aGUgY3Vyc29yIGRvZXMgbm90IHJlZmVyZW5jZSBhbiBlbnVtIGNvbnN0YW50IGRlY2xhcmF0aW9uLCBMTE9OR19NSU4gaXMgcmV0dXJuZWQuCisgKiBTaW5jZSB0aGlzIGlzIGFsc28gcG90ZW50aWFsbHkgYSB2YWxpZCBjb25zdGFudCB2YWx1ZSwgdGhlIGtpbmQgb2YgdGhlIGN1cnNvcgorICogbXVzdCBiZSB2ZXJpZmllZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICovCitDSU5ERVhfTElOS0FHRSBsb25nIGxvbmcgY2xhbmdfZ2V0RW51bUNvbnN0YW50RGVjbFZhbHVlKENYQ3Vyc29yIEMpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgaW50ZWdlciB2YWx1ZSBvZiBhbiBlbnVtIGNvbnN0YW50IGRlY2xhcmF0aW9uIGFzIGFuIHVuc2lnbmVkCisgKiAgbG9uZyBsb25nLgorICoKKyAqIElmIHRoZSBjdXJzb3IgZG9lcyBub3QgcmVmZXJlbmNlIGFuIGVudW0gY29uc3RhbnQgZGVjbGFyYXRpb24sIFVMTE9OR19NQVggaXMgcmV0dXJuZWQuCisgKiBTaW5jZSB0aGlzIGlzIGFsc28gcG90ZW50aWFsbHkgYSB2YWxpZCBjb25zdGFudCB2YWx1ZSwgdGhlIGtpbmQgb2YgdGhlIGN1cnNvcgorICogbXVzdCBiZSB2ZXJpZmllZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBsb25nIGxvbmcgY2xhbmdfZ2V0RW51bUNvbnN0YW50RGVjbFVuc2lnbmVkVmFsdWUoQ1hDdXJzb3IgQyk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBiaXQgd2lkdGggb2YgYSBiaXQgZmllbGQgZGVjbGFyYXRpb24gYXMgYW4gaW50ZWdlci4KKyAqCisgKiBJZiBhIGN1cnNvciB0aGF0IGlzIG5vdCBhIGJpdCBmaWVsZCBkZWNsYXJhdGlvbiBpcyBwYXNzZWQgaW4sIC0xIGlzIHJldHVybmVkLgorICovCitDSU5ERVhfTElOS0FHRSBpbnQgY2xhbmdfZ2V0RmllbGREZWNsQml0V2lkdGgoQ1hDdXJzb3IgQyk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBudW1iZXIgb2Ygbm9uLXZhcmlhZGljIGFyZ3VtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbgorICogY3Vyc29yLgorICoKKyAqIFRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGNhbiBiZSBkZXRlcm1pbmVkIGZvciBjYWxscyBhcyB3ZWxsIGFzIGZvcgorICogZGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9ucyBvciBtZXRob2RzLiBGb3Igb3RoZXIgY3Vyc29ycyAtMSBpcyByZXR1cm5lZC4KKyAqLworQ0lOREVYX0xJTktBR0UgaW50IGNsYW5nX0N1cnNvcl9nZXROdW1Bcmd1bWVudHMoQ1hDdXJzb3IgQyk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBhcmd1bWVudCBjdXJzb3Igb2YgYSBmdW5jdGlvbiBvciBtZXRob2QuCisgKgorICogVGhlIGFyZ3VtZW50IGN1cnNvciBjYW4gYmUgZGV0ZXJtaW5lZCBmb3IgY2FsbHMgYXMgd2VsbCBhcyBmb3IgZGVjbGFyYXRpb25zCisgKiBvZiBmdW5jdGlvbnMgb3IgbWV0aG9kcy4gRm9yIG90aGVyIGN1cnNvcnMgYW5kIGZvciBpbnZhbGlkIGluZGljZXMsIGFuCisgKiBpbnZhbGlkIGN1cnNvciBpcyByZXR1cm5lZC4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hDdXJzb3IgY2xhbmdfQ3Vyc29yX2dldEFyZ3VtZW50KENYQ3Vyc29yIEMsIHVuc2lnbmVkIGkpOworCisvKioKKyAqIFxicmllZiBEZXNjcmliZXMgdGhlIGtpbmQgb2YgYSB0ZW1wbGF0ZSBhcmd1bWVudC4KKyAqCisgKiBTZWUgdGhlIGRlZmluaXRpb24gb2YgbGx2bTo6Y2xhbmc6OlRlbXBsYXRlQXJndW1lbnQ6OkFyZ0tpbmQgZm9yIGZ1bGwKKyAqIGVsZW1lbnQgZGVzY3JpcHRpb25zLgorICovCitlbnVtIENYVGVtcGxhdGVBcmd1bWVudEtpbmQgeworICBDWFRlbXBsYXRlQXJndW1lbnRLaW5kX051bGwsCisgIENYVGVtcGxhdGVBcmd1bWVudEtpbmRfVHlwZSwKKyAgQ1hUZW1wbGF0ZUFyZ3VtZW50S2luZF9EZWNsYXJhdGlvbiwKKyAgQ1hUZW1wbGF0ZUFyZ3VtZW50S2luZF9OdWxsUHRyLAorICBDWFRlbXBsYXRlQXJndW1lbnRLaW5kX0ludGVncmFsLAorICBDWFRlbXBsYXRlQXJndW1lbnRLaW5kX1RlbXBsYXRlLAorICBDWFRlbXBsYXRlQXJndW1lbnRLaW5kX1RlbXBsYXRlRXhwYW5zaW9uLAorICBDWFRlbXBsYXRlQXJndW1lbnRLaW5kX0V4cHJlc3Npb24sCisgIENYVGVtcGxhdGVBcmd1bWVudEtpbmRfUGFjaywKKyAgLyogSW5kaWNhdGVzIGFuIGVycm9yIGNhc2UsIHByZXZlbnRpbmcgdGhlIGtpbmQgZnJvbSBiZWluZyBkZWR1Y2VkLiAqLworICBDWFRlbXBsYXRlQXJndW1lbnRLaW5kX0ludmFsaWQKK307CisKKy8qKgorICpcYnJpZWYgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlIGFyZ3Mgb2YgYSBmdW5jdGlvbiBkZWNsIHJlcHJlc2VudGluZyBhCisgKiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi4KKyAqCisgKiBJZiB0aGUgYXJndW1lbnQgY3Vyc29yIGNhbm5vdCBiZSBjb252ZXJ0ZWQgaW50byBhIHRlbXBsYXRlIGZ1bmN0aW9uCisgKiBkZWNsYXJhdGlvbiwgLTEgaXMgcmV0dXJuZWQuCisgKgorICogRm9yIGV4YW1wbGUsIGZvciB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uIGFuZCBzcGVjaWFsaXphdGlvbjoKKyAqICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBrSW50LCBib29sIGtCb29sPgorICogICB2b2lkIGZvbygpIHsgLi4uIH0KKyAqCisgKiAgIHRlbXBsYXRlIDw+CisgKiAgIHZvaWQgZm9vPGZsb2F0LCAtNywgdHJ1ZT4oKTsKKyAqCisgKiBUaGUgdmFsdWUgMyB3b3VsZCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4KKyAqLworQ0lOREVYX0xJTktBR0UgaW50IGNsYW5nX0N1cnNvcl9nZXROdW1UZW1wbGF0ZUFyZ3VtZW50cyhDWEN1cnNvciBDKTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIGtpbmQgb2YgdGhlIEkndGggdGVtcGxhdGUgYXJndW1lbnQgb2YgdGhlIENYQ3Vyc29yIEMuCisgKgorICogSWYgdGhlIGFyZ3VtZW50IENYQ3Vyc29yIGRvZXMgbm90IHJlcHJlc2VudCBhIEZ1bmN0aW9uRGVjbCwgYW4gaW52YWxpZAorICogdGVtcGxhdGUgYXJndW1lbnQga2luZCBpcyByZXR1cm5lZC4KKyAqCisgKiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gYW5kIHNwZWNpYWxpemF0aW9uOgorICogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IGtJbnQsIGJvb2wga0Jvb2w+CisgKiAgIHZvaWQgZm9vKCkgeyAuLi4gfQorICoKKyAqICAgdGVtcGxhdGUgPD4KKyAqICAgdm9pZCBmb288ZmxvYXQsIC03LCB0cnVlPigpOworICoKKyAqIEZvciBJID0gMCwgMSwgYW5kIDIsIFR5cGUsIEludGVncmFsLCBhbmQgSW50ZWdyYWwgd2lsbCBiZSByZXR1cm5lZCwKKyAqIHJlc3BlY3RpdmVseS4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWFRlbXBsYXRlQXJndW1lbnRLaW5kIGNsYW5nX0N1cnNvcl9nZXRUZW1wbGF0ZUFyZ3VtZW50S2luZCgKKyAgICBDWEN1cnNvciBDLCB1bnNpZ25lZCBJKTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgYSBDWFR5cGUgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIGEgVGVtcGxhdGVBcmd1bWVudCBvZiBhCisgKiAgZnVuY3Rpb24gZGVjbCByZXByZXNlbnRpbmcgYSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi4KKyAqCisgKiBJZiB0aGUgYXJndW1lbnQgQ1hDdXJzb3IgZG9lcyBub3QgcmVwcmVzZW50IGEgRnVuY3Rpb25EZWNsIHdob3NlIEkndGgKKyAqIHRlbXBsYXRlIGFyZ3VtZW50IGhhcyBhIGtpbmQgb2YgQ1hUZW1wbGF0ZUFyZ0tpbmRfSW50ZWdyYWwsIGFuIGludmFsaWQgdHlwZQorICogaXMgcmV0dXJuZWQuCisgKgorICogRm9yIGV4YW1wbGUsIGZvciB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uIGFuZCBzcGVjaWFsaXphdGlvbjoKKyAqICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBrSW50LCBib29sIGtCb29sPgorICogICB2b2lkIGZvbygpIHsgLi4uIH0KKyAqCisgKiAgIHRlbXBsYXRlIDw+CisgKiAgIHZvaWQgZm9vPGZsb2F0LCAtNywgdHJ1ZT4oKTsKKyAqCisgKiBJZiBjYWxsZWQgd2l0aCBJID0gMCwgImZsb2F0Iiwgd2lsbCBiZSByZXR1cm5lZC4KKyAqIEludmFsaWQgdHlwZXMgd2lsbCBiZSByZXR1cm5lZCBmb3IgSSA9PSAxIG9yIDIuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYVHlwZSBjbGFuZ19DdXJzb3JfZ2V0VGVtcGxhdGVBcmd1bWVudFR5cGUoQ1hDdXJzb3IgQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSSk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhbiBJbnRlZ3JhbCBUZW1wbGF0ZUFyZ3VtZW50IChvZiBhIGZ1bmN0aW9uCisgKiAgZGVjbCByZXByZXNlbnRpbmcgYSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbikgYXMgYSBzaWduZWQgbG9uZyBsb25nLgorICoKKyAqIEl0IGlzIHVuZGVmaW5lZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gb24gYSBDWEN1cnNvciB0aGF0IGRvZXMgbm90IHJlcHJlc2VudCBhCisgKiBGdW5jdGlvbkRlY2wgb3Igd2hvc2UgSSd0aCB0ZW1wbGF0ZSBhcmd1bWVudCBpcyBub3QgYW4gaW50ZWdyYWwgdmFsdWUuCisgKgorICogRm9yIGV4YW1wbGUsIGZvciB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uIGFuZCBzcGVjaWFsaXphdGlvbjoKKyAqICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBrSW50LCBib29sIGtCb29sPgorICogICB2b2lkIGZvbygpIHsgLi4uIH0KKyAqCisgKiAgIHRlbXBsYXRlIDw+CisgKiAgIHZvaWQgZm9vPGZsb2F0LCAtNywgdHJ1ZT4oKTsKKyAqCisgKiBJZiBjYWxsZWQgd2l0aCBJID0gMSBvciAyLCAtNyBvciB0cnVlIHdpbGwgYmUgcmV0dXJuZWQsIHJlc3BlY3RpdmVseS4KKyAqIEZvciBJID09IDAsIHRoaXMgZnVuY3Rpb24ncyBiZWhhdmlvciBpcyB1bmRlZmluZWQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGxvbmcgbG9uZyBjbGFuZ19DdXJzb3JfZ2V0VGVtcGxhdGVBcmd1bWVudFZhbHVlKENYQ3Vyc29yIEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJKTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIHZhbHVlIG9mIGFuIEludGVncmFsIFRlbXBsYXRlQXJndW1lbnQgKG9mIGEgZnVuY3Rpb24KKyAqICBkZWNsIHJlcHJlc2VudGluZyBhIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uKSBhcyBhbiB1bnNpZ25lZCBsb25nIGxvbmcuCisgKgorICogSXQgaXMgdW5kZWZpbmVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBvbiBhIENYQ3Vyc29yIHRoYXQgZG9lcyBub3QgcmVwcmVzZW50IGEKKyAqIEZ1bmN0aW9uRGVjbCBvciB3aG9zZSBJJ3RoIHRlbXBsYXRlIGFyZ3VtZW50IGlzIG5vdCBhbiBpbnRlZ3JhbCB2YWx1ZS4KKyAqCisgKiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gYW5kIHNwZWNpYWxpemF0aW9uOgorICogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IGtJbnQsIGJvb2wga0Jvb2w+CisgKiAgIHZvaWQgZm9vKCkgeyAuLi4gfQorICoKKyAqICAgdGVtcGxhdGUgPD4KKyAqICAgdm9pZCBmb288ZmxvYXQsIDIxNDc0ODM2NDksIHRydWU+KCk7CisgKgorICogSWYgY2FsbGVkIHdpdGggSSA9IDEgb3IgMiwgMjE0NzQ4MzY0OSBvciB0cnVlIHdpbGwgYmUgcmV0dXJuZWQsIHJlc3BlY3RpdmVseS4KKyAqIEZvciBJID09IDAsIHRoaXMgZnVuY3Rpb24ncyBiZWhhdmlvciBpcyB1bmRlZmluZWQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGxvbmcgbG9uZyBjbGFuZ19DdXJzb3JfZ2V0VGVtcGxhdGVBcmd1bWVudFVuc2lnbmVkVmFsdWUoCisgICAgQ1hDdXJzb3IgQywgdW5zaWduZWQgSSk7CisKKy8qKgorICogXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHR3byBDWFR5cGVzIHJlcHJlc2VudCB0aGUgc2FtZSB0eXBlLgorICoKKyAqIFxyZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBDWFR5cGVzIHJlcHJlc2VudCB0aGUgc2FtZSB0eXBlIGFuZAorICogICAgICAgICAgemVybyBvdGhlcndpc2UuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX2VxdWFsVHlwZXMoQ1hUeXBlIEEsIENYVHlwZSBCKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBjYW5vbmljYWwgdHlwZSBmb3IgYSBDWFR5cGUuCisgKgorICogQ2xhbmcncyB0eXBlIHN5c3RlbSBleHBsaWNpdGx5IG1vZGVscyB0eXBlZGVmcyBhbmQgYWxsIHRoZSB3YXlzCisgKiBhIHNwZWNpZmljIHR5cGUgY2FuIGJlIHJlcHJlc2VudGVkLiAgVGhlIGNhbm9uaWNhbCB0eXBlIGlzIHRoZSB1bmRlcmx5aW5nCisgKiB0eXBlIHdpdGggYWxsIHRoZSAic3VnYXIiIHJlbW92ZWQuICBGb3IgZXhhbXBsZSwgaWYgJ1QnIGlzIGEgdHlwZWRlZgorICogZm9yICdpbnQnLCB0aGUgY2Fub25pY2FsIHR5cGUgZm9yICdUJyB3b3VsZCBiZSAnaW50Jy4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hUeXBlIGNsYW5nX2dldENhbm9uaWNhbFR5cGUoQ1hUeXBlIFQpOworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciBhIENYVHlwZSBoYXMgdGhlICJjb25zdCIgcXVhbGlmaWVyIHNldCwKKyAqIHdpdGhvdXQgbG9va2luZyB0aHJvdWdoIHR5cGVkZWZzIHRoYXQgbWF5IGhhdmUgYWRkZWQgImNvbnN0IiBhdCBhCisgKiBkaWZmZXJlbnQgbGV2ZWwuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX2lzQ29uc3RRdWFsaWZpZWRUeXBlKENYVHlwZSBUKTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgYSAgQ1hDdXJzb3IgdGhhdCBpcyBhIG1hY3JvLCBpcworICogZnVuY3Rpb24gbGlrZS4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfQ3Vyc29yX2lzTWFjcm9GdW5jdGlvbkxpa2UoQ1hDdXJzb3IgQyk7CisKKy8qKgorICogXGJyaWVmIERldGVybWluZSB3aGV0aGVyIGEgIENYQ3Vyc29yIHRoYXQgaXMgYSBtYWNybywgaXMgYQorICogYnVpbHRpbiBvbmUuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX0N1cnNvcl9pc01hY3JvQnVpbHRpbihDWEN1cnNvciBDKTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgYSAgQ1hDdXJzb3IgdGhhdCBpcyBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLCBpcyBhbgorICogaW5saW5lIGRlY2xhcmF0aW9uLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19DdXJzb3JfaXNGdW5jdGlvbklubGluZWQoQ1hDdXJzb3IgQyk7CisKKy8qKgorICogXGJyaWVmIERldGVybWluZSB3aGV0aGVyIGEgQ1hUeXBlIGhhcyB0aGUgInZvbGF0aWxlIiBxdWFsaWZpZXIgc2V0LAorICogd2l0aG91dCBsb29raW5nIHRocm91Z2ggdHlwZWRlZnMgdGhhdCBtYXkgaGF2ZSBhZGRlZCAidm9sYXRpbGUiIGF0CisgKiBhIGRpZmZlcmVudCBsZXZlbC4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfaXNWb2xhdGlsZVF1YWxpZmllZFR5cGUoQ1hUeXBlIFQpOworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciBhIENYVHlwZSBoYXMgdGhlICJyZXN0cmljdCIgcXVhbGlmaWVyIHNldCwKKyAqIHdpdGhvdXQgbG9va2luZyB0aHJvdWdoIHR5cGVkZWZzIHRoYXQgbWF5IGhhdmUgYWRkZWQgInJlc3RyaWN0IiBhdCBhCisgKiBkaWZmZXJlbnQgbGV2ZWwuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX2lzUmVzdHJpY3RRdWFsaWZpZWRUeXBlKENYVHlwZSBUKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJucyB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfZ2V0QWRkcmVzc1NwYWNlKENYVHlwZSBUKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJucyB0aGUgdHlwZWRlZiBuYW1lIG9mIHRoZSBnaXZlbiB0eXBlLgorICovCitDSU5ERVhfTElOS0FHRSBDWFN0cmluZyBjbGFuZ19nZXRUeXBlZGVmTmFtZShDWFR5cGUgQ1QpOworCisvKioKKyAqIFxicmllZiBGb3IgcG9pbnRlciB0eXBlcywgcmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgcG9pbnRlZS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hUeXBlIGNsYW5nX2dldFBvaW50ZWVUeXBlKENYVHlwZSBUKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBjdXJzb3IgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hDdXJzb3IgY2xhbmdfZ2V0VHlwZURlY2xhcmF0aW9uKENYVHlwZSBUKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBPYmplY3RpdmUtQyB0eXBlIGVuY29kaW5nIGZvciB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLgorICovCitDSU5ERVhfTElOS0FHRSBDWFN0cmluZyBjbGFuZ19nZXREZWNsT2JqQ1R5cGVFbmNvZGluZyhDWEN1cnNvciBDKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBPYmplY3RpdmUtQyB0eXBlIGVuY29kaW5nIGZvciB0aGUgc3BlY2lmaWVkIENYVHlwZS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfVHlwZV9nZXRPYmpDRW5jb2RpbmcoQ1hUeXBlIHR5cGUpOyAKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIHNwZWxsaW5nIG9mIGEgZ2l2ZW4gQ1hUeXBlS2luZC4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfZ2V0VHlwZUtpbmRTcGVsbGluZyhlbnVtIENYVHlwZUtpbmQgSyk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gYXNzb2NpYXRlZCB3aXRoIGEgZnVuY3Rpb24gdHlwZS4KKyAqCisgKiBJZiBhIG5vbi1mdW5jdGlvbiB0eXBlIGlzIHBhc3NlZCBpbiwgQ1hDYWxsaW5nQ29udl9JbnZhbGlkIGlzIHJldHVybmVkLgorICovCitDSU5ERVhfTElOS0FHRSBlbnVtIENYQ2FsbGluZ0NvbnYgY2xhbmdfZ2V0RnVuY3Rpb25UeXBlQ2FsbGluZ0NvbnYoQ1hUeXBlIFQpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgcmV0dXJuIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGEgZnVuY3Rpb24gdHlwZS4KKyAqCisgKiBJZiBhIG5vbi1mdW5jdGlvbiB0eXBlIGlzIHBhc3NlZCBpbiwgYW4gaW52YWxpZCB0eXBlIGlzIHJldHVybmVkLgorICovCitDSU5ERVhfTElOS0FHRSBDWFR5cGUgY2xhbmdfZ2V0UmVzdWx0VHlwZShDWFR5cGUgVCk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiB0eXBlIGFzc29jaWF0ZWQgd2l0aCBhIGZ1bmN0aW9uIHR5cGUuCisgKgorICogSWYgYSBub24tZnVuY3Rpb24gdHlwZSBpcyBwYXNzZWQgaW4sIGFuIGVycm9yIGNvZGUgb2YgLTEgaXMgcmV0dXJuZWQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGludCBjbGFuZ19nZXRFeGNlcHRpb25TcGVjaWZpY2F0aW9uVHlwZShDWFR5cGUgVCk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBudW1iZXIgb2Ygbm9uLXZhcmlhZGljIHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIGEKKyAqIGZ1bmN0aW9uIHR5cGUuCisgKgorICogSWYgYSBub24tZnVuY3Rpb24gdHlwZSBpcyBwYXNzZWQgaW4sIC0xIGlzIHJldHVybmVkLgorICovCitDSU5ERVhfTElOS0FHRSBpbnQgY2xhbmdfZ2V0TnVtQXJnVHlwZXMoQ1hUeXBlIFQpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgdHlwZSBvZiBhIHBhcmFtZXRlciBvZiBhIGZ1bmN0aW9uIHR5cGUuCisgKgorICogSWYgYSBub24tZnVuY3Rpb24gdHlwZSBpcyBwYXNzZWQgaW4gb3IgdGhlIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgZW5vdWdoCisgKiBwYXJhbWV0ZXJzLCBhbiBpbnZhbGlkIHR5cGUgaXMgcmV0dXJuZWQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYVHlwZSBjbGFuZ19nZXRBcmdUeXBlKENYVHlwZSBULCB1bnNpZ25lZCBpKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIDEgaWYgdGhlIENYVHlwZSBpcyBhIHZhcmlhZGljIGZ1bmN0aW9uIHR5cGUsIGFuZCAwIG90aGVyd2lzZS4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfaXNGdW5jdGlvblR5cGVWYXJpYWRpYyhDWFR5cGUgVCk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSByZXR1cm4gdHlwZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBjdXJzb3IuCisgKgorICogVGhpcyBvbmx5IHJldHVybnMgYSB2YWxpZCB0eXBlIGlmIHRoZSBjdXJzb3IgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgbWV0aG9kLgorICovCitDSU5ERVhfTElOS0FHRSBDWFR5cGUgY2xhbmdfZ2V0Q3Vyc29yUmVzdWx0VHlwZShDWEN1cnNvciBDKTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gY3Vyc29yLgorICoKKyAqIFRoaXMgb25seSByZXR1cm5zIGEgdmFsaWQgcmVzdWx0IGlmIHRoZSBjdXJzb3IgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgbWV0aG9kLgorICovCitDSU5ERVhfTElOS0FHRSBpbnQgY2xhbmdfZ2V0Q3Vyc29yRXhjZXB0aW9uU3BlY2lmaWNhdGlvblR5cGUoQ1hDdXJzb3IgQyk7CisKKy8qKgorICogXGJyaWVmIFJldHVybiAxIGlmIHRoZSBDWFR5cGUgaXMgYSBQT0QgKHBsYWluIG9sZCBkYXRhKSB0eXBlLCBhbmQgMAorICogIG90aGVyd2lzZS4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfaXNQT0RUeXBlKENYVHlwZSBUKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBlbGVtZW50IHR5cGUgb2YgYW4gYXJyYXksIGNvbXBsZXgsIG9yIHZlY3RvciB0eXBlLgorICoKKyAqIElmIGEgdHlwZSBpcyBwYXNzZWQgaW4gdGhhdCBpcyBub3QgYW4gYXJyYXksIGNvbXBsZXgsIG9yIHZlY3RvciB0eXBlLAorICogYW4gaW52YWxpZCB0eXBlIGlzIHJldHVybmVkLgorICovCitDSU5ERVhfTElOS0FHRSBDWFR5cGUgY2xhbmdfZ2V0RWxlbWVudFR5cGUoQ1hUeXBlIFQpOworCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiBhbiBhcnJheSBvciB2ZWN0b3IgdHlwZS4KKyAqCisgKiBJZiBhIHR5cGUgaXMgcGFzc2VkIGluIHRoYXQgaXMgbm90IGFuIGFycmF5IG9yIHZlY3RvciB0eXBlLAorICogLTEgaXMgcmV0dXJuZWQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGxvbmcgbG9uZyBjbGFuZ19nZXROdW1FbGVtZW50cyhDWFR5cGUgVCk7CisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgZWxlbWVudCB0eXBlIG9mIGFuIGFycmF5IHR5cGUuCisgKgorICogSWYgYSBub24tYXJyYXkgdHlwZSBpcyBwYXNzZWQgaW4sIGFuIGludmFsaWQgdHlwZSBpcyByZXR1cm5lZC4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hUeXBlIGNsYW5nX2dldEFycmF5RWxlbWVudFR5cGUoQ1hUeXBlIFQpOworCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIGFycmF5IHNpemUgb2YgYSBjb25zdGFudCBhcnJheS4KKyAqCisgKiBJZiBhIG5vbi1hcnJheSB0eXBlIGlzIHBhc3NlZCBpbiwgLTEgaXMgcmV0dXJuZWQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGxvbmcgbG9uZyBjbGFuZ19nZXRBcnJheVNpemUoQ1hUeXBlIFQpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgdHlwZSBuYW1lZCBieSB0aGUgcXVhbGlmaWVkLWlkLgorICoKKyAqIElmIGEgbm9uLWVsYWJvcmF0ZWQgdHlwZSBpcyBwYXNzZWQgaW4sIGFuIGludmFsaWQgdHlwZSBpcyByZXR1cm5lZC4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hUeXBlIGNsYW5nX1R5cGVfZ2V0TmFtZWRUeXBlKENYVHlwZSBUKTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIGlmIGEgdHlwZWRlZiBpcyAndHJhbnNwYXJlbnQnIHRhZy4KKyAqCisgKiBBIHR5cGVkZWYgaXMgY29uc2lkZXJlZCAndHJhbnNwYXJlbnQnIGlmIGl0IHNoYXJlcyBhIG5hbWUgYW5kIHNwZWxsaW5nCisgKiBsb2NhdGlvbiB3aXRoIGl0cyB1bmRlcmx5aW5nIHRhZyB0eXBlLCBhcyBpcyB0aGUgY2FzZSB3aXRoIHRoZSBOU19FTlVNIG1hY3JvLgorICoKKyAqIFxyZXR1cm5zIG5vbi16ZXJvIGlmIHRyYW5zcGFyZW50IGFuZCB6ZXJvIG90aGVyd2lzZS4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfVHlwZV9pc1RyYW5zcGFyZW50VGFnVHlwZWRlZihDWFR5cGUgVCk7CisKKy8qKgorICogXGJyaWVmIExpc3QgdGhlIHBvc3NpYmxlIGVycm9yIGNvZGVzIGZvciBcYyBjbGFuZ19UeXBlX2dldFNpemVPZiwKKyAqICAgXGMgY2xhbmdfVHlwZV9nZXRBbGlnbk9mLCBcYyBjbGFuZ19UeXBlX2dldE9mZnNldE9mIGFuZAorICogICBcYyBjbGFuZ19DdXJzb3JfZ2V0T2Zmc2V0T2YuCisgKgorICogQSB2YWx1ZSBvZiB0aGlzIGVudW1lcmF0aW9uIHR5cGUgY2FuIGJlIHJldHVybmVkIGlmIHRoZSB0YXJnZXQgdHlwZSBpcyBub3QKKyAqIGEgdmFsaWQgYXJndW1lbnQgdG8gc2l6ZW9mLCBhbGlnbm9mIG9yIG9mZnNldG9mLgorICovCitlbnVtIENYVHlwZUxheW91dEVycm9yIHsKKyAgLyoqCisgICAqIFxicmllZiBUeXBlIGlzIG9mIGtpbmQgQ1hUeXBlX0ludmFsaWQuCisgICAqLworICBDWFR5cGVMYXlvdXRFcnJvcl9JbnZhbGlkID0gLTEsCisgIC8qKgorICAgKiBcYnJpZWYgVGhlIHR5cGUgaXMgYW4gaW5jb21wbGV0ZSBUeXBlLgorICAgKi8KKyAgQ1hUeXBlTGF5b3V0RXJyb3JfSW5jb21wbGV0ZSA9IC0yLAorICAvKioKKyAgICogXGJyaWVmIFRoZSB0eXBlIGlzIGEgZGVwZW5kZW50IFR5cGUuCisgICAqLworICBDWFR5cGVMYXlvdXRFcnJvcl9EZXBlbmRlbnQgPSAtMywKKyAgLyoqCisgICAqIFxicmllZiBUaGUgdHlwZSBpcyBub3QgYSBjb25zdGFudCBzaXplIHR5cGUuCisgICAqLworICBDWFR5cGVMYXlvdXRFcnJvcl9Ob3RDb25zdGFudFNpemUgPSAtNCwKKyAgLyoqCisgICAqIFxicmllZiBUaGUgRmllbGQgbmFtZSBpcyBub3QgdmFsaWQgZm9yIHRoaXMgcmVjb3JkLgorICAgKi8KKyAgQ1hUeXBlTGF5b3V0RXJyb3JfSW52YWxpZEZpZWxkTmFtZSA9IC01Cit9OworCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIGFsaWdubWVudCBvZiBhIHR5cGUgaW4gYnl0ZXMgYXMgcGVyIEMrK1tleHByLmFsaWdub2ZdCisgKiAgIHN0YW5kYXJkLgorICoKKyAqIElmIHRoZSB0eXBlIGRlY2xhcmF0aW9uIGlzIGludmFsaWQsIENYVHlwZUxheW91dEVycm9yX0ludmFsaWQgaXMgcmV0dXJuZWQuCisgKiBJZiB0aGUgdHlwZSBkZWNsYXJhdGlvbiBpcyBhbiBpbmNvbXBsZXRlIHR5cGUsIENYVHlwZUxheW91dEVycm9yX0luY29tcGxldGUKKyAqICAgaXMgcmV0dXJuZWQuCisgKiBJZiB0aGUgdHlwZSBkZWNsYXJhdGlvbiBpcyBhIGRlcGVuZGVudCB0eXBlLCBDWFR5cGVMYXlvdXRFcnJvcl9EZXBlbmRlbnQgaXMKKyAqICAgcmV0dXJuZWQuCisgKiBJZiB0aGUgdHlwZSBkZWNsYXJhdGlvbiBpcyBub3QgYSBjb25zdGFudCBzaXplIHR5cGUsCisgKiAgIENYVHlwZUxheW91dEVycm9yX05vdENvbnN0YW50U2l6ZSBpcyByZXR1cm5lZC4KKyAqLworQ0lOREVYX0xJTktBR0UgbG9uZyBsb25nIGNsYW5nX1R5cGVfZ2V0QWxpZ25PZihDWFR5cGUgVCk7CisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgY2xhc3MgdHlwZSBvZiBhbiBtZW1iZXIgcG9pbnRlciB0eXBlLgorICoKKyAqIElmIGEgbm9uLW1lbWJlci1wb2ludGVyIHR5cGUgaXMgcGFzc2VkIGluLCBhbiBpbnZhbGlkIHR5cGUgaXMgcmV0dXJuZWQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYVHlwZSBjbGFuZ19UeXBlX2dldENsYXNzVHlwZShDWFR5cGUgVCk7CisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiBhIHR5cGUgaW4gYnl0ZXMgYXMgcGVyIEMrK1tleHByLnNpemVvZl0gc3RhbmRhcmQuCisgKgorICogSWYgdGhlIHR5cGUgZGVjbGFyYXRpb24gaXMgaW52YWxpZCwgQ1hUeXBlTGF5b3V0RXJyb3JfSW52YWxpZCBpcyByZXR1cm5lZC4KKyAqIElmIHRoZSB0eXBlIGRlY2xhcmF0aW9uIGlzIGFuIGluY29tcGxldGUgdHlwZSwgQ1hUeXBlTGF5b3V0RXJyb3JfSW5jb21wbGV0ZQorICogICBpcyByZXR1cm5lZC4KKyAqIElmIHRoZSB0eXBlIGRlY2xhcmF0aW9uIGlzIGEgZGVwZW5kZW50IHR5cGUsIENYVHlwZUxheW91dEVycm9yX0RlcGVuZGVudCBpcworICogICByZXR1cm5lZC4KKyAqLworQ0lOREVYX0xJTktBR0UgbG9uZyBsb25nIGNsYW5nX1R5cGVfZ2V0U2l6ZU9mKENYVHlwZSBUKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBvZmZzZXQgb2YgYSBmaWVsZCBuYW1lZCBTIGluIGEgcmVjb3JkIG9mIHR5cGUgVCBpbiBiaXRzCisgKiAgIGFzIGl0IHdvdWxkIGJlIHJldHVybmVkIGJ5IF9fb2Zmc2V0b2ZfXyBhcyBwZXIgQysrMTFbMTguMnA0XQorICoKKyAqIElmIHRoZSBjdXJzb3IgaXMgbm90IGEgcmVjb3JkIGZpZWxkIGRlY2xhcmF0aW9uLCBDWFR5cGVMYXlvdXRFcnJvcl9JbnZhbGlkCisgKiAgIGlzIHJldHVybmVkLgorICogSWYgdGhlIGZpZWxkJ3MgdHlwZSBkZWNsYXJhdGlvbiBpcyBhbiBpbmNvbXBsZXRlIHR5cGUsCisgKiAgIENYVHlwZUxheW91dEVycm9yX0luY29tcGxldGUgaXMgcmV0dXJuZWQuCisgKiBJZiB0aGUgZmllbGQncyB0eXBlIGRlY2xhcmF0aW9uIGlzIGEgZGVwZW5kZW50IHR5cGUsCisgKiAgIENYVHlwZUxheW91dEVycm9yX0RlcGVuZGVudCBpcyByZXR1cm5lZC4KKyAqIElmIHRoZSBmaWVsZCdzIG5hbWUgUyBpcyBub3QgZm91bmQsCisgKiAgIENYVHlwZUxheW91dEVycm9yX0ludmFsaWRGaWVsZE5hbWUgaXMgcmV0dXJuZWQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGxvbmcgbG9uZyBjbGFuZ19UeXBlX2dldE9mZnNldE9mKENYVHlwZSBULCBjb25zdCBjaGFyICpTKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIGZpZWxkIHJlcHJlc2VudGVkIGJ5IHRoZSBDdXJzb3IuCisgKgorICogSWYgdGhlIGN1cnNvciBpcyBub3QgYSBmaWVsZCBkZWNsYXJhdGlvbiwgLTEgaXMgcmV0dXJuZWQuCisgKiBJZiB0aGUgY3Vyc29yIHNlbWFudGljIHBhcmVudCBpcyBub3QgYSByZWNvcmQgZmllbGQgZGVjbGFyYXRpb24sCisgKiAgIENYVHlwZUxheW91dEVycm9yX0ludmFsaWQgaXMgcmV0dXJuZWQuCisgKiBJZiB0aGUgZmllbGQncyB0eXBlIGRlY2xhcmF0aW9uIGlzIGFuIGluY29tcGxldGUgdHlwZSwKKyAqICAgQ1hUeXBlTGF5b3V0RXJyb3JfSW5jb21wbGV0ZSBpcyByZXR1cm5lZC4KKyAqIElmIHRoZSBmaWVsZCdzIHR5cGUgZGVjbGFyYXRpb24gaXMgYSBkZXBlbmRlbnQgdHlwZSwKKyAqICAgQ1hUeXBlTGF5b3V0RXJyb3JfRGVwZW5kZW50IGlzIHJldHVybmVkLgorICogSWYgdGhlIGZpZWxkJ3MgbmFtZSBTIGlzIG5vdCBmb3VuZCwKKyAqICAgQ1hUeXBlTGF5b3V0RXJyb3JfSW52YWxpZEZpZWxkTmFtZSBpcyByZXR1cm5lZC4KKyAqLworQ0lOREVYX0xJTktBR0UgbG9uZyBsb25nIGNsYW5nX0N1cnNvcl9nZXRPZmZzZXRPZkZpZWxkKENYQ3Vyc29yIEMpOworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gY3Vyc29yIHJlcHJlc2VudHMgYW4gYW5vbnltb3VzIHJlY29yZAorICogZGVjbGFyYXRpb24uCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX0N1cnNvcl9pc0Fub255bW91cyhDWEN1cnNvciBDKTsKKworZW51bSBDWFJlZlF1YWxpZmllcktpbmQgeworICAvKiogXGJyaWVmIE5vIHJlZi1xdWFsaWZpZXIgd2FzIHByb3ZpZGVkLiAqLworICBDWFJlZlF1YWxpZmllcl9Ob25lID0gMCwKKyAgLyoqIFxicmllZiBBbiBsdmFsdWUgcmVmLXF1YWxpZmllciB3YXMgcHJvdmlkZWQgKFxjICYpLiAqLworICBDWFJlZlF1YWxpZmllcl9MVmFsdWUsCisgIC8qKiBcYnJpZWYgQW4gcnZhbHVlIHJlZi1xdWFsaWZpZXIgd2FzIHByb3ZpZGVkIChcYyAmJikuICovCisgIENYUmVmUXVhbGlmaWVyX1JWYWx1ZQorfTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlIGFyZ3VtZW50cyBmb3IgZ2l2ZW4gdGVtcGxhdGUKKyAqIHNwZWNpYWxpemF0aW9uLCBvciAtMSBpZiB0eXBlIFxjIFQgaXMgbm90IGEgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uCisgKi8KK0NJTkRFWF9MSU5LQUdFIGludCBjbGFuZ19UeXBlX2dldE51bVRlbXBsYXRlQXJndW1lbnRzKENYVHlwZSBUKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJucyB0aGUgdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCBvZiBhIHRlbXBsYXRlIGNsYXNzIHNwZWNpYWxpemF0aW9uCisgKiBhdCBnaXZlbiBpbmRleC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgcmV0dXJucyB0ZW1wbGF0ZSB0eXBlIGFyZ3VtZW50cyBhbmQgZG9lcyBub3QgaGFuZGxlCisgKiB0ZW1wbGF0ZSB0ZW1wbGF0ZSBhcmd1bWVudHMgb3IgdmFyaWFkaWMgcGFja3MuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYVHlwZSBjbGFuZ19UeXBlX2dldFRlbXBsYXRlQXJndW1lbnRBc1R5cGUoQ1hUeXBlIFQsIHVuc2lnbmVkIGkpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgcmVmLXF1YWxpZmllciBraW5kIG9mIGEgZnVuY3Rpb24gb3IgbWV0aG9kLgorICoKKyAqIFRoZSByZWYtcXVhbGlmaWVyIGlzIHJldHVybmVkIGZvciBDKysgZnVuY3Rpb25zIG9yIG1ldGhvZHMuIEZvciBvdGhlciB0eXBlcworICogb3Igbm9uLUMrKyBkZWNsYXJhdGlvbnMsIENYUmVmUXVhbGlmaWVyX05vbmUgaXMgcmV0dXJuZWQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGVudW0gQ1hSZWZRdWFsaWZpZXJLaW5kIGNsYW5nX1R5cGVfZ2V0Q1hYUmVmUXVhbGlmaWVyKENYVHlwZSBUKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJucyBub24temVybyBpZiB0aGUgY3Vyc29yIHNwZWNpZmllcyBhIFJlY29yZCBtZW1iZXIgdGhhdCBpcyBhCisgKiAgIGJpdGZpZWxkLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19DdXJzb3JfaXNCaXRGaWVsZChDWEN1cnNvciBDKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJucyAxIGlmIHRoZSBiYXNlIGNsYXNzIHNwZWNpZmllZCBieSB0aGUgY3Vyc29yIHdpdGgga2luZAorICogICBDWF9DWFhCYXNlU3BlY2lmaWVyIGlzIHZpcnR1YWwuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX2lzVmlydHVhbEJhc2UoQ1hDdXJzb3IpOworICAgIAorLyoqCisgKiBcYnJpZWYgUmVwcmVzZW50cyB0aGUgQysrIGFjY2VzcyBjb250cm9sIGxldmVsIHRvIGEgYmFzZSBjbGFzcyBmb3IgYQorICogY3Vyc29yIHdpdGgga2luZCBDWF9DWFhCYXNlU3BlY2lmaWVyLgorICovCitlbnVtIENYX0NYWEFjY2Vzc1NwZWNpZmllciB7CisgIENYX0NYWEludmFsaWRBY2Nlc3NTcGVjaWZpZXIsCisgIENYX0NYWFB1YmxpYywKKyAgQ1hfQ1hYUHJvdGVjdGVkLAorICBDWF9DWFhQcml2YXRlCit9OworCisvKioKKyAqIFxicmllZiBSZXR1cm5zIHRoZSBhY2Nlc3MgY29udHJvbCBsZXZlbCBmb3IgdGhlIHJlZmVyZW5jZWQgb2JqZWN0LgorICoKKyAqIElmIHRoZSBjdXJzb3IgcmVmZXJzIHRvIGEgQysrIGRlY2xhcmF0aW9uLCBpdHMgYWNjZXNzIGNvbnRyb2wgbGV2ZWwgd2l0aGluIGl0cworICogcGFyZW50IHNjb3BlIGlzIHJldHVybmVkLiBPdGhlcndpc2UsIGlmIHRoZSBjdXJzb3IgcmVmZXJzIHRvIGEgYmFzZSBzcGVjaWZpZXIgb3IKKyAqIGFjY2VzcyBzcGVjaWZpZXIsIHRoZSBzcGVjaWZpZXIgaXRzZWxmIGlzIHJldHVybmVkLgorICovCitDSU5ERVhfTElOS0FHRSBlbnVtIENYX0NYWEFjY2Vzc1NwZWNpZmllciBjbGFuZ19nZXRDWFhBY2Nlc3NTcGVjaWZpZXIoQ1hDdXJzb3IpOworCisvKioKKyAqIFxicmllZiBSZXByZXNlbnRzIHRoZSBzdG9yYWdlIGNsYXNzZXMgYXMgZGVjbGFyZWQgaW4gdGhlIHNvdXJjZS4gQ1hfU0NfSW52YWxpZAorICogd2FzIGFkZGVkIGZvciB0aGUgY2FzZSB0aGF0IHRoZSBwYXNzZWQgY3Vyc29yIGluIG5vdCBhIGRlY2xhcmF0aW9uLgorICovCitlbnVtIENYX1N0b3JhZ2VDbGFzcyB7CisgIENYX1NDX0ludmFsaWQsCisgIENYX1NDX05vbmUsCisgIENYX1NDX0V4dGVybiwKKyAgQ1hfU0NfU3RhdGljLAorICBDWF9TQ19Qcml2YXRlRXh0ZXJuLAorICBDWF9TQ19PcGVuQ0xXb3JrR3JvdXBMb2NhbCwKKyAgQ1hfU0NfQXV0bywKKyAgQ1hfU0NfUmVnaXN0ZXIKK307CisKKy8qKgorICogXGJyaWVmIFJldHVybnMgdGhlIHN0b3JhZ2UgY2xhc3MgZm9yIGEgZnVuY3Rpb24gb3IgdmFyaWFibGUgZGVjbGFyYXRpb24uCisgKgorICogSWYgdGhlIHBhc3NlZCBpbiBDdXJzb3IgaXMgbm90IGEgZnVuY3Rpb24gb3IgdmFyaWFibGUgZGVjbGFyYXRpb24sCisgKiBDWF9TQ19JbnZhbGlkIGlzIHJldHVybmVkIGVsc2UgdGhlIHN0b3JhZ2UgY2xhc3MuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGVudW0gQ1hfU3RvcmFnZUNsYXNzIGNsYW5nX0N1cnNvcl9nZXRTdG9yYWdlQ2xhc3MoQ1hDdXJzb3IpOworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBvdmVybG9hZGVkIGRlY2xhcmF0aW9ucyByZWZlcmVuY2VkIGJ5IGEgCisgKiBcYyBDWEN1cnNvcl9PdmVybG9hZGVkRGVjbFJlZiBjdXJzb3IuCisgKgorICogXHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHdob3NlIG92ZXJsb2FkZWQgZGVjbGFyYXRpb25zIGFyZSBiZWluZyBxdWVyaWVkLgorICoKKyAqIFxyZXR1cm5zIFRoZSBudW1iZXIgb2Ygb3ZlcmxvYWRlZCBkZWNsYXJhdGlvbnMgcmVmZXJlbmNlZCBieSBcYyBjdXJzb3IuIElmIGl0CisgKiBpcyBub3QgYSBcYyBDWEN1cnNvcl9PdmVybG9hZGVkRGVjbFJlZiBjdXJzb3IsIHJldHVybnMgMC4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfZ2V0TnVtT3ZlcmxvYWRlZERlY2xzKENYQ3Vyc29yIGN1cnNvcik7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIGEgY3Vyc29yIGZvciBvbmUgb2YgdGhlIG92ZXJsb2FkZWQgZGVjbGFyYXRpb25zIHJlZmVyZW5jZWQKKyAqIGJ5IGEgXGMgQ1hDdXJzb3JfT3ZlcmxvYWRlZERlY2xSZWYgY3Vyc29yLgorICoKKyAqIFxwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB3aG9zZSBvdmVybG9hZGVkIGRlY2xhcmF0aW9ucyBhcmUgYmVpbmcgcXVlcmllZC4KKyAqCisgKiBccGFyYW0gaW5kZXggVGhlIHplcm8tYmFzZWQgaW5kZXggaW50byB0aGUgc2V0IG9mIG92ZXJsb2FkZWQgZGVjbGFyYXRpb25zIGluCisgKiB0aGUgY3Vyc29yLgorICoKKyAqIFxyZXR1cm5zIEEgY3Vyc29yIHJlcHJlc2VudGluZyB0aGUgZGVjbGFyYXRpb24gcmVmZXJlbmNlZCBieSB0aGUgZ2l2ZW4gCisgKiBcYyBjdXJzb3IgYXQgdGhlIHNwZWNpZmllZCBcYyBpbmRleC4gSWYgdGhlIGN1cnNvciBkb2VzIG5vdCBoYXZlIGFuIAorICogYXNzb2NpYXRlZCBzZXQgb2Ygb3ZlcmxvYWRlZCBkZWNsYXJhdGlvbnMsIG9yIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzLAorICogcmV0dXJucyBcYyBjbGFuZ19nZXROdWxsQ3Vyc29yKCk7CisgKi8KK0NJTkRFWF9MSU5LQUdFIENYQ3Vyc29yIGNsYW5nX2dldE92ZXJsb2FkZWREZWNsKENYQ3Vyc29yIGN1cnNvciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRleCk7CisgIAorLyoqCisgKiBAfQorICovCisgIAorLyoqCisgKiBcZGVmZ3JvdXAgQ0lOREVYX0FUVFJJQlVURVMgSW5mb3JtYXRpb24gZm9yIGF0dHJpYnV0ZXMKKyAqCisgKiBAeworICovCisKKy8qKgorICogXGJyaWVmIEZvciBjdXJzb3JzIHJlcHJlc2VudGluZyBhbiBpYm91dGxldGNvbGxlY3Rpb24gYXR0cmlidXRlLAorICogIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29sbGVjdGlvbiBlbGVtZW50IHR5cGUuCisgKgorICovCitDSU5ERVhfTElOS0FHRSBDWFR5cGUgY2xhbmdfZ2V0SUJPdXRsZXRDb2xsZWN0aW9uVHlwZShDWEN1cnNvcik7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIFxkZWZncm91cCBDSU5ERVhfQ1VSU09SX1RSQVZFUlNBTCBUcmF2ZXJzaW5nIHRoZSBBU1Qgd2l0aCBjdXJzb3JzCisgKgorICogVGhlc2Ugcm91dGluZXMgcHJvdmlkZSB0aGUgYWJpbGl0eSB0byB0cmF2ZXJzZSB0aGUgYWJzdHJhY3Qgc3ludGF4IHRyZWUKKyAqIHVzaW5nIGN1cnNvcnMuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFxicmllZiBEZXNjcmliZXMgaG93IHRoZSB0cmF2ZXJzYWwgb2YgdGhlIGNoaWxkcmVuIG9mIGEgcGFydGljdWxhcgorICogY3Vyc29yIHNob3VsZCBwcm9jZWVkIGFmdGVyIHZpc2l0aW5nIGEgcGFydGljdWxhciBjaGlsZCBjdXJzb3IuCisgKgorICogQSB2YWx1ZSBvZiB0aGlzIGVudW1lcmF0aW9uIHR5cGUgc2hvdWxkIGJlIHJldHVybmVkIGJ5IGVhY2gKKyAqIFxjIENYQ3Vyc29yVmlzaXRvciB0byBpbmRpY2F0ZSBob3cgY2xhbmdfdmlzaXRDaGlsZHJlbigpIHByb2NlZWQuCisgKi8KK2VudW0gQ1hDaGlsZFZpc2l0UmVzdWx0IHsKKyAgLyoqCisgICAqIFxicmllZiBUZXJtaW5hdGVzIHRoZSBjdXJzb3IgdHJhdmVyc2FsLgorICAgKi8KKyAgQ1hDaGlsZFZpc2l0X0JyZWFrLAorICAvKioKKyAgICogXGJyaWVmIENvbnRpbnVlcyB0aGUgY3Vyc29yIHRyYXZlcnNhbCB3aXRoIHRoZSBuZXh0IHNpYmxpbmcgb2YKKyAgICogdGhlIGN1cnNvciBqdXN0IHZpc2l0ZWQsIHdpdGhvdXQgdmlzaXRpbmcgaXRzIGNoaWxkcmVuLgorICAgKi8KKyAgQ1hDaGlsZFZpc2l0X0NvbnRpbnVlLAorICAvKioKKyAgICogXGJyaWVmIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGN1cnNvciwgdXNpbmcKKyAgICogdGhlIHNhbWUgdmlzaXRvciBhbmQgY2xpZW50IGRhdGEuCisgICAqLworICBDWENoaWxkVmlzaXRfUmVjdXJzZQorfTsKKworLyoqCisgKiBcYnJpZWYgVmlzaXRvciBpbnZva2VkIGZvciBlYWNoIGN1cnNvciBmb3VuZCBieSBhIHRyYXZlcnNhbC4KKyAqCisgKiBUaGlzIHZpc2l0b3IgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIGZvciBlYWNoIGN1cnNvciBmb3VuZCBieQorICogY2xhbmdfdmlzaXRDdXJzb3JDaGlsZHJlbigpLiBJdHMgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGN1cnNvciBiZWluZworICogdmlzaXRlZCwgaXRzIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgcGFyZW50IHZpc2l0b3IgZm9yIHRoYXQgY3Vyc29yLAorICogYW5kIGl0cyB0aGlyZCBhcmd1bWVudCBpcyB0aGUgY2xpZW50IGRhdGEgcHJvdmlkZWQgdG8KKyAqIGNsYW5nX3Zpc2l0Q3Vyc29yQ2hpbGRyZW4oKS4KKyAqCisgKiBUaGUgdmlzaXRvciBzaG91bGQgcmV0dXJuIG9uZSBvZiB0aGUgXGMgQ1hDaGlsZFZpc2l0UmVzdWx0IHZhbHVlcworICogdG8gZGlyZWN0IGNsYW5nX3Zpc2l0Q3Vyc29yQ2hpbGRyZW4oKS4KKyAqLwordHlwZWRlZiBlbnVtIENYQ2hpbGRWaXNpdFJlc3VsdCAoKkNYQ3Vyc29yVmlzaXRvcikoQ1hDdXJzb3IgY3Vyc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hDdXJzb3IgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hDbGllbnREYXRhIGNsaWVudF9kYXRhKTsKKworLyoqCisgKiBcYnJpZWYgVmlzaXQgdGhlIGNoaWxkcmVuIG9mIGEgcGFydGljdWxhciBjdXJzb3IuCisgKgorICogVGhpcyBmdW5jdGlvbiB2aXNpdHMgYWxsIHRoZSBkaXJlY3QgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGN1cnNvciwKKyAqIGludm9raW5nIHRoZSBnaXZlbiBccCB2aXNpdG9yIGZ1bmN0aW9uIHdpdGggdGhlIGN1cnNvcnMgb2YgZWFjaAorICogdmlzaXRlZCBjaGlsZC4gVGhlIHRyYXZlcnNhbCBtYXkgYmUgcmVjdXJzaXZlLCBpZiB0aGUgdmlzaXRvciByZXR1cm5zCisgKiBcYyBDWENoaWxkVmlzaXRfUmVjdXJzZS4gVGhlIHRyYXZlcnNhbCBtYXkgYWxzbyBiZSBlbmRlZCBwcmVtYXR1cmVseSwgaWYKKyAqIHRoZSB2aXNpdG9yIHJldHVybnMgXGMgQ1hDaGlsZFZpc2l0X0JyZWFrLgorICoKKyAqIFxwYXJhbSBwYXJlbnQgdGhlIGN1cnNvciB3aG9zZSBjaGlsZCBtYXkgYmUgdmlzaXRlZC4gQWxsIGtpbmRzIG9mCisgKiBjdXJzb3JzIGNhbiBiZSB2aXNpdGVkLCBpbmNsdWRpbmcgaW52YWxpZCBjdXJzb3JzICh3aGljaCwgYnkKKyAqIGRlZmluaXRpb24sIGhhdmUgbm8gY2hpbGRyZW4pLgorICoKKyAqIFxwYXJhbSB2aXNpdG9yIHRoZSB2aXNpdG9yIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkIGZvciBlYWNoCisgKiBjaGlsZCBvZiBccCBwYXJlbnQuCisgKgorICogXHBhcmFtIGNsaWVudF9kYXRhIHBvaW50ZXIgZGF0YSBzdXBwbGllZCBieSB0aGUgY2xpZW50LCB3aGljaCB3aWxsCisgKiBiZSBwYXNzZWQgdG8gdGhlIHZpc2l0b3IgZWFjaCB0aW1lIGl0IGlzIGludm9rZWQuCisgKgorICogXHJldHVybnMgYSBub24temVybyB2YWx1ZSBpZiB0aGUgdHJhdmVyc2FsIHdhcyB0ZXJtaW5hdGVkCisgKiBwcmVtYXR1cmVseSBieSB0aGUgdmlzaXRvciByZXR1cm5pbmcgXGMgQ1hDaGlsZFZpc2l0X0JyZWFrLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ192aXNpdENoaWxkcmVuKENYQ3Vyc29yIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hDdXJzb3JWaXNpdG9yIHZpc2l0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYQ2xpZW50RGF0YSBjbGllbnRfZGF0YSk7CisjaWZkZWYgX19oYXNfZmVhdHVyZQorIyAgaWYgX19oYXNfZmVhdHVyZShibG9ja3MpCisvKioKKyAqIFxicmllZiBWaXNpdG9yIGludm9rZWQgZm9yIGVhY2ggY3Vyc29yIGZvdW5kIGJ5IGEgdHJhdmVyc2FsLgorICoKKyAqIFRoaXMgdmlzaXRvciBibG9jayB3aWxsIGJlIGludm9rZWQgZm9yIGVhY2ggY3Vyc29yIGZvdW5kIGJ5CisgKiBjbGFuZ192aXNpdENoaWxkcmVuV2l0aEJsb2NrKCkuIEl0cyBmaXJzdCBhcmd1bWVudCBpcyB0aGUgY3Vyc29yIGJlaW5nCisgKiB2aXNpdGVkLCBpdHMgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBwYXJlbnQgdmlzaXRvciBmb3IgdGhhdCBjdXJzb3IuCisgKgorICogVGhlIHZpc2l0b3Igc2hvdWxkIHJldHVybiBvbmUgb2YgdGhlIFxjIENYQ2hpbGRWaXNpdFJlc3VsdCB2YWx1ZXMKKyAqIHRvIGRpcmVjdCBjbGFuZ192aXNpdENoaWxkcmVuV2l0aEJsb2NrKCkuCisgKi8KK3R5cGVkZWYgZW51bSBDWENoaWxkVmlzaXRSZXN1bHQgCisgICAgICheQ1hDdXJzb3JWaXNpdG9yQmxvY2spKENYQ3Vyc29yIGN1cnNvciwgQ1hDdXJzb3IgcGFyZW50KTsKKworLyoqCisgKiBWaXNpdHMgdGhlIGNoaWxkcmVuIG9mIGEgY3Vyc29yIHVzaW5nIHRoZSBzcGVjaWZpZWQgYmxvY2suICBCZWhhdmVzCisgKiBpZGVudGljYWxseSB0byBjbGFuZ192aXNpdENoaWxkcmVuKCkgaW4gYWxsIG90aGVyIHJlc3BlY3RzLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ192aXNpdENoaWxkcmVuV2l0aEJsb2NrKENYQ3Vyc29yIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEN1cnNvclZpc2l0b3JCbG9jayBibG9jayk7CisjICBlbmRpZgorI2VuZGlmCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIFxkZWZncm91cCBDSU5ERVhfQ1VSU09SX1hSRUYgQ3Jvc3MtcmVmZXJlbmNpbmcgaW4gdGhlIEFTVAorICoKKyAqIFRoZXNlIHJvdXRpbmVzIHByb3ZpZGUgdGhlIGFiaWxpdHkgdG8gZGV0ZXJtaW5lIHJlZmVyZW5jZXMgd2l0aGluIGFuZAorICogYWNyb3NzIHRyYW5zbGF0aW9uIHVuaXRzLCBieSBwcm92aWRpbmcgdGhlIG5hbWVzIG9mIHRoZSBlbnRpdGllcyByZWZlcmVuY2VkCisgKiBieSBjdXJzb3JzLCBmb2xsb3cgcmVmZXJlbmNlIGN1cnNvcnMgdG8gdGhlIGRlY2xhcmF0aW9ucyB0aGV5IHJlZmVyZW5jZSwKKyAqIGFuZCBhc3NvY2lhdGUgZGVjbGFyYXRpb25zIHdpdGggdGhlaXIgZGVmaW5pdGlvbnMuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSBhIFVuaWZpZWQgU3ltYm9sIFJlc29sdXRpb24gKFVTUikgZm9yIHRoZSBlbnRpdHkgcmVmZXJlbmNlZAorICogYnkgdGhlIGdpdmVuIGN1cnNvci4KKyAqCisgKiBBIFVuaWZpZWQgU3ltYm9sIFJlc29sdXRpb24gKFVTUikgaXMgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIGEgcGFydGljdWxhcgorICogZW50aXR5IChmdW5jdGlvbiwgY2xhc3MsIHZhcmlhYmxlLCBldGMuKSB3aXRoaW4gYSBwcm9ncmFtLiBVU1JzIGNhbiBiZQorICogY29tcGFyZWQgYWNyb3NzIHRyYW5zbGF0aW9uIHVuaXRzIHRvIGRldGVybWluZSwgZS5nLiwgd2hlbiByZWZlcmVuY2VzIGluCisgKiBvbmUgdHJhbnNsYXRpb24gcmVmZXIgdG8gYW4gZW50aXR5IGRlZmluZWQgaW4gYW5vdGhlciB0cmFuc2xhdGlvbiB1bml0LgorICovCitDSU5ERVhfTElOS0FHRSBDWFN0cmluZyBjbGFuZ19nZXRDdXJzb3JVU1IoQ1hDdXJzb3IpOworCisvKioKKyAqIFxicmllZiBDb25zdHJ1Y3QgYSBVU1IgZm9yIGEgc3BlY2lmaWVkIE9iamVjdGl2ZS1DIGNsYXNzLgorICovCitDSU5ERVhfTElOS0FHRSBDWFN0cmluZyBjbGFuZ19jb25zdHJ1Y3RVU1JfT2JqQ0NsYXNzKGNvbnN0IGNoYXIgKmNsYXNzX25hbWUpOworCisvKioKKyAqIFxicmllZiBDb25zdHJ1Y3QgYSBVU1IgZm9yIGEgc3BlY2lmaWVkIE9iamVjdGl2ZS1DIGNhdGVnb3J5LgorICovCitDSU5ERVhfTElOS0FHRSBDWFN0cmluZworICBjbGFuZ19jb25zdHJ1Y3RVU1JfT2JqQ0NhdGVnb3J5KGNvbnN0IGNoYXIgKmNsYXNzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjYXRlZ29yeV9uYW1lKTsKKworLyoqCisgKiBcYnJpZWYgQ29uc3RydWN0IGEgVVNSIGZvciBhIHNwZWNpZmllZCBPYmplY3RpdmUtQyBwcm90b2NvbC4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcKKyAgY2xhbmdfY29uc3RydWN0VVNSX09iakNQcm90b2NvbChjb25zdCBjaGFyICpwcm90b2NvbF9uYW1lKTsKKworLyoqCisgKiBcYnJpZWYgQ29uc3RydWN0IGEgVVNSIGZvciBhIHNwZWNpZmllZCBPYmplY3RpdmUtQyBpbnN0YW5jZSB2YXJpYWJsZSBhbmQKKyAqICAgdGhlIFVTUiBmb3IgaXRzIGNvbnRhaW5pbmcgY2xhc3MuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU3RyaW5nIGNsYW5nX2NvbnN0cnVjdFVTUl9PYmpDSXZhcihjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYU3RyaW5nIGNsYXNzVVNSKTsKKworLyoqCisgKiBcYnJpZWYgQ29uc3RydWN0IGEgVVNSIGZvciBhIHNwZWNpZmllZCBPYmplY3RpdmUtQyBtZXRob2QgYW5kCisgKiAgIHRoZSBVU1IgZm9yIGl0cyBjb250YWluaW5nIGNsYXNzLgorICovCitDSU5ERVhfTElOS0FHRSBDWFN0cmluZyBjbGFuZ19jb25zdHJ1Y3RVU1JfT2JqQ01ldGhvZChjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaXNJbnN0YW5jZU1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYU3RyaW5nIGNsYXNzVVNSKTsKKworLyoqCisgKiBcYnJpZWYgQ29uc3RydWN0IGEgVVNSIGZvciBhIHNwZWNpZmllZCBPYmplY3RpdmUtQyBwcm9wZXJ0eSBhbmQgdGhlIFVTUgorICogIGZvciBpdHMgY29udGFpbmluZyBjbGFzcy4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfY29uc3RydWN0VVNSX09iakNQcm9wZXJ0eShjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hTdHJpbmcgY2xhc3NVU1IpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSBhIG5hbWUgZm9yIHRoZSBlbnRpdHkgcmVmZXJlbmNlZCBieSB0aGlzIGN1cnNvci4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfZ2V0Q3Vyc29yU3BlbGxpbmcoQ1hDdXJzb3IpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSBhIHJhbmdlIGZvciBhIHBpZWNlIHRoYXQgZm9ybXMgdGhlIGN1cnNvcnMgc3BlbGxpbmcgbmFtZS4KKyAqIE1vc3Qgb2YgdGhlIHRpbWVzIHRoZXJlIGlzIG9ubHkgb25lIHJhbmdlIGZvciB0aGUgY29tcGxldGUgc3BlbGxpbmcgYnV0IGZvcgorICogT2JqZWN0aXZlLUMgbWV0aG9kcyBhbmQgT2JqZWN0aXZlLUMgbWVzc2FnZSBleHByZXNzaW9ucywgdGhlcmUgYXJlIG11bHRpcGxlCisgKiBwaWVjZXMgZm9yIGVhY2ggc2VsZWN0b3IgaWRlbnRpZmllci4KKyAqIAorICogXHBhcmFtIHBpZWNlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBzcGVsbGluZyBuYW1lIHBpZWNlLiBJZiB0aGlzIGlzIGdyZWF0ZXIKKyAqIHRoYW4gdGhlIGFjdHVhbCBudW1iZXIgb2YgcGllY2VzLCBpdCB3aWxsIHJldHVybiBhIE5VTEwgKGludmFsaWQpIHJhbmdlLgorICogIAorICogXHBhcmFtIG9wdGlvbnMgUmVzZXJ2ZWQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU291cmNlUmFuZ2UgY2xhbmdfQ3Vyc29yX2dldFNwZWxsaW5nTmFtZVJhbmdlKENYQ3Vyc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBpZWNlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgb3B0aW9ucyk7CisKKy8qKgorICogXGJyaWVmIE9wYXF1ZSBwb2ludGVyIHJlcHJlc2VudGluZyBhIHBvbGljeSB0aGF0IGNvbnRyb2xzIHByZXR0eSBwcmludGluZworICogZm9yIFxjIGNsYW5nX2dldEN1cnNvclByZXR0eVByaW50ZWQuCisgKi8KK3R5cGVkZWYgdm9pZCAqQ1hQcmludGluZ1BvbGljeTsKKworLyoqCisgKiBcYnJpZWYgUHJvcGVydGllcyBmb3IgdGhlIHByaW50aW5nIHBvbGljeS4KKyAqCisgKiBTZWUgXGMgY2xhbmc6OlByaW50aW5nUG9saWN5IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCitlbnVtIENYUHJpbnRpbmdQb2xpY3lQcm9wZXJ0eSB7CisgIENYUHJpbnRpbmdQb2xpY3lfSW5kZW50YXRpb24sCisgIENYUHJpbnRpbmdQb2xpY3lfU3VwcHJlc3NTcGVjaWZpZXJzLAorICBDWFByaW50aW5nUG9saWN5X1N1cHByZXNzVGFnS2V5d29yZCwKKyAgQ1hQcmludGluZ1BvbGljeV9JbmNsdWRlVGFnRGVmaW5pdGlvbiwKKyAgQ1hQcmludGluZ1BvbGljeV9TdXBwcmVzc1Njb3BlLAorICBDWFByaW50aW5nUG9saWN5X1N1cHByZXNzVW53cml0dGVuU2NvcGUsCisgIENYUHJpbnRpbmdQb2xpY3lfU3VwcHJlc3NJbml0aWFsaXplcnMsCisgIENYUHJpbnRpbmdQb2xpY3lfQ29uc3RhbnRBcnJheVNpemVBc1dyaXR0ZW4sCisgIENYUHJpbnRpbmdQb2xpY3lfQW5vbnltb3VzVGFnTG9jYXRpb25zLAorICBDWFByaW50aW5nUG9saWN5X1N1cHByZXNzU3Ryb25nTGlmZXRpbWUsCisgIENYUHJpbnRpbmdQb2xpY3lfU3VwcHJlc3NMaWZldGltZVF1YWxpZmllcnMsCisgIENYUHJpbnRpbmdQb2xpY3lfU3VwcHJlc3NUZW1wbGF0ZUFyZ3NJbkNYWENvbnN0cnVjdG9ycywKKyAgQ1hQcmludGluZ1BvbGljeV9Cb29sLAorICBDWFByaW50aW5nUG9saWN5X1Jlc3RyaWN0LAorICBDWFByaW50aW5nUG9saWN5X0FsaWdub2YsCisgIENYUHJpbnRpbmdQb2xpY3lfVW5kZXJzY29yZUFsaWdub2YsCisgIENYUHJpbnRpbmdQb2xpY3lfVXNlVm9pZEZvclplcm9QYXJhbXMsCisgIENYUHJpbnRpbmdQb2xpY3lfVGVyc2VPdXRwdXQsCisgIENYUHJpbnRpbmdQb2xpY3lfUG9saXNoRm9yRGVjbGFyYXRpb24sCisgIENYUHJpbnRpbmdQb2xpY3lfSGFsZiwKKyAgQ1hQcmludGluZ1BvbGljeV9NU1dDaGFyLAorICBDWFByaW50aW5nUG9saWN5X0luY2x1ZGVOZXdsaW5lcywKKyAgQ1hQcmludGluZ1BvbGljeV9NU1ZDRm9ybWF0dGluZywKKyAgQ1hQcmludGluZ1BvbGljeV9Db25zdGFudHNBc1dyaXR0ZW4sCisgIENYUHJpbnRpbmdQb2xpY3lfU3VwcHJlc3NJbXBsaWNpdEJhc2UsCisgIENYUHJpbnRpbmdQb2xpY3lfRnVsbHlRdWFsaWZpZWROYW1lLAorCisgIENYUHJpbnRpbmdQb2xpY3lfTGFzdFByb3BlcnR5ID0gQ1hQcmludGluZ1BvbGljeV9GdWxseVF1YWxpZmllZE5hbWUKK307CisKKy8qKgorICogXGJyaWVmIEdldCBhIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJpbnRpbmcgcG9saWN5LgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZAorY2xhbmdfUHJpbnRpbmdQb2xpY3lfZ2V0UHJvcGVydHkoQ1hQcmludGluZ1BvbGljeSBQb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIENYUHJpbnRpbmdQb2xpY3lQcm9wZXJ0eSBQcm9wZXJ0eSk7CisKKy8qKgorICogXGJyaWVmIFNldCBhIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJpbnRpbmcgcG9saWN5LgorICovCitDSU5ERVhfTElOS0FHRSB2b2lkIGNsYW5nX1ByaW50aW5nUG9saWN5X3NldFByb3BlcnR5KENYUHJpbnRpbmdQb2xpY3kgUG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIENYUHJpbnRpbmdQb2xpY3lQcm9wZXJ0eSBQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmFsdWUpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgZGVmYXVsdCBwb2xpY3kgZm9yIHRoZSBjdXJzb3IuCisgKgorICogVGhlIHBvbGljeSBzaG91bGQgYmUgcmVsZWFzZWQgYWZ0ZXIgdXNlIHdpdGggXGMKKyAqIGNsYW5nX1ByaW50aW5nUG9saWN5X2Rpc3Bvc2UuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYUHJpbnRpbmdQb2xpY3kgY2xhbmdfZ2V0Q3Vyc29yUHJpbnRpbmdQb2xpY3koQ1hDdXJzb3IpOworCisvKioKKyAqIFxicmllZiBSZWxlYXNlIGEgcHJpbnRpbmcgcG9saWN5LgorICovCitDSU5ERVhfTElOS0FHRSB2b2lkIGNsYW5nX1ByaW50aW5nUG9saWN5X2Rpc3Bvc2UoQ1hQcmludGluZ1BvbGljeSBQb2xpY3kpOworCisvKioKKyAqIFxicmllZiBQcmV0dHkgcHJpbnQgZGVjbGFyYXRpb25zLgorICoKKyAqIFxwYXJhbSBDdXJzb3IgVGhlIGN1cnNvciByZXByZXNlbnRpbmcgYSBkZWNsYXJhdGlvbi4KKyAqCisgKiBccGFyYW0gUG9saWN5IFRoZSBwb2xpY3kgdG8gY29udHJvbCB0aGUgZW50aXRpZXMgYmVpbmcgcHJpbnRlZC4gSWYKKyAqIE5VTEwsIGEgZGVmYXVsdCBwb2xpY3kgaXMgdXNlZC4KKyAqCisgKiBccmV0dXJucyBUaGUgcHJldHR5IHByaW50ZWQgZGVjbGFyYXRpb24gb3IgdGhlIGVtcHR5IHN0cmluZyBmb3IKKyAqIG90aGVyIGN1cnNvcnMuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU3RyaW5nIGNsYW5nX2dldEN1cnNvclByZXR0eVByaW50ZWQoQ1hDdXJzb3IgQ3Vyc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFByaW50aW5nUG9saWN5IFBvbGljeSk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoZSBlbnRpdHkgcmVmZXJlbmNlZCBieSB0aGlzIGN1cnNvci4KKyAqCisgKiBUaGUgZGlzcGxheSBuYW1lIGNvbnRhaW5zIGV4dHJhIGluZm9ybWF0aW9uIHRoYXQgaGVscHMgaWRlbnRpZnkgdGhlIGN1cnNvciwKKyAqIHN1Y2ggYXMgdGhlIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBvciB0ZW1wbGF0ZSBvciB0aGUgYXJndW1lbnRzIG9mIGEgCisgKiBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfZ2V0Q3Vyc29yRGlzcGxheU5hbWUoQ1hDdXJzb3IpOworICAKKy8qKiBcYnJpZWYgRm9yIGEgY3Vyc29yIHRoYXQgaXMgYSByZWZlcmVuY2UsIHJldHJpZXZlIGEgY3Vyc29yIHJlcHJlc2VudGluZyB0aGUKKyAqIGVudGl0eSB0aGF0IGl0IHJlZmVyZW5jZXMuCisgKgorICogUmVmZXJlbmNlIGN1cnNvcnMgcmVmZXIgdG8gb3RoZXIgZW50aXRpZXMgaW4gdGhlIEFTVC4gRm9yIGV4YW1wbGUsIGFuCisgKiBPYmplY3RpdmUtQyBzdXBlcmNsYXNzIHJlZmVyZW5jZSBjdXJzb3IgcmVmZXJzIHRvIGFuIE9iamVjdGl2ZS1DIGNsYXNzLgorICogVGhpcyBmdW5jdGlvbiBwcm9kdWNlcyB0aGUgY3Vyc29yIGZvciB0aGUgT2JqZWN0aXZlLUMgY2xhc3MgZnJvbSB0aGUKKyAqIGN1cnNvciBmb3IgdGhlIHN1cGVyY2xhc3MgcmVmZXJlbmNlLiBJZiB0aGUgaW5wdXQgY3Vyc29yIGlzIGEgZGVjbGFyYXRpb24gb3IKKyAqIGRlZmluaXRpb24sIGl0IHJldHVybnMgdGhhdCBkZWNsYXJhdGlvbiBvciBkZWZpbml0aW9uIHVuY2hhbmdlZC4KKyAqIE90aGVyd2lzZSwgcmV0dXJucyB0aGUgTlVMTCBjdXJzb3IuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYQ3Vyc29yIGNsYW5nX2dldEN1cnNvclJlZmVyZW5jZWQoQ1hDdXJzb3IpOworCisvKioKKyAqICBcYnJpZWYgRm9yIGEgY3Vyc29yIHRoYXQgaXMgZWl0aGVyIGEgcmVmZXJlbmNlIHRvIG9yIGEgZGVjbGFyYXRpb24KKyAqICBvZiBzb21lIGVudGl0eSwgcmV0cmlldmUgYSBjdXJzb3IgdGhhdCBkZXNjcmliZXMgdGhlIGRlZmluaXRpb24gb2YKKyAqICB0aGF0IGVudGl0eS4KKyAqCisgKiAgU29tZSBlbnRpdGllcyBjYW4gYmUgZGVjbGFyZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgdHJhbnNsYXRpb24KKyAqICB1bml0LCBidXQgb25seSBvbmUgb2YgdGhvc2UgZGVjbGFyYXRpb25zIGNhbiBhbHNvIGJlIGEKKyAqICBkZWZpbml0aW9uLiBGb3IgZXhhbXBsZSwgZ2l2ZW46CisgKgorICogIFxjb2RlCisgKiAgaW50IGYoaW50LCBpbnQpOworICogIGludCBnKGludCB4LCBpbnQgeSkgeyByZXR1cm4gZih4LCB5KTsgfQorICogIGludCBmKGludCBhLCBpbnQgYikgeyByZXR1cm4gYSArIGI7IH0KKyAqICBpbnQgZihpbnQsIGludCk7CisgKiAgXGVuZGNvZGUKKyAqCisgKiAgdGhlcmUgYXJlIHRocmVlIGRlY2xhcmF0aW9ucyBvZiB0aGUgZnVuY3Rpb24gImYiLCBidXQgb25seSB0aGUKKyAqICBzZWNvbmQgb25lIGlzIGEgZGVmaW5pdGlvbi4gVGhlIGNsYW5nX2dldEN1cnNvckRlZmluaXRpb24oKQorICogIGZ1bmN0aW9uIHdpbGwgdGFrZSBhbnkgY3Vyc29yIHBvaW50aW5nIHRvIGEgZGVjbGFyYXRpb24gb2YgImYiCisgKiAgKHRoZSBmaXJzdCBvciBmb3VydGggbGluZXMgb2YgdGhlIGV4YW1wbGUpIG9yIGEgY3Vyc29yIHJlZmVyZW5jZWQKKyAqICB0aGF0IHVzZXMgImYiICh0aGUgY2FsbCB0byAiZicgaW5zaWRlICJnIikgYW5kIHdpbGwgcmV0dXJuIGEKKyAqICBkZWNsYXJhdGlvbiBjdXJzb3IgcG9pbnRpbmcgdG8gdGhlIGRlZmluaXRpb24gKHRoZSBzZWNvbmQgImYiCisgKiAgZGVjbGFyYXRpb24pLgorICoKKyAqICBJZiBnaXZlbiBhIGN1cnNvciBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBkZWZpbml0aW9uLAorICogIGUuZy4sIGJlY2F1c2UgdGhlcmUgaXMgbm8gZGVmaW5pdGlvbiBvZiB0aGF0IGVudGl0eSB3aXRoaW4gdGhpcworICogIHRyYW5zbGF0aW9uIHVuaXQsIHJldHVybnMgYSBOVUxMIGN1cnNvci4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hDdXJzb3IgY2xhbmdfZ2V0Q3Vyc29yRGVmaW5pdGlvbihDWEN1cnNvcik7CisKKy8qKgorICogXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBwb2ludGVkIHRvIGJ5IHRoaXMgY3Vyc29yCisgKiBpcyBhbHNvIGEgZGVmaW5pdGlvbiBvZiB0aGF0IGVudGl0eS4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfaXNDdXJzb3JEZWZpbml0aW9uKENYQ3Vyc29yKTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIGNhbm9uaWNhbCBjdXJzb3IgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gY3Vyc29yLgorICoKKyAqIEluIHRoZSBDIGZhbWlseSBvZiBsYW5ndWFnZXMsIG1hbnkga2luZHMgb2YgZW50aXRpZXMgY2FuIGJlIGRlY2xhcmVkIHNldmVyYWwKKyAqIHRpbWVzIHdpdGhpbiBhIHNpbmdsZSB0cmFuc2xhdGlvbiB1bml0LiBGb3IgZXhhbXBsZSwgYSBzdHJ1Y3R1cmUgdHlwZSBjYW4KKyAqIGJlIGZvcndhcmQtZGVjbGFyZWQgKHBvc3NpYmx5IG11bHRpcGxlIHRpbWVzKSBhbmQgbGF0ZXIgZGVmaW5lZDoKKyAqCisgKiBcY29kZQorICogc3RydWN0IFg7CisgKiBzdHJ1Y3QgWDsKKyAqIHN0cnVjdCBYIHsKKyAqICAgaW50IG1lbWJlcjsKKyAqIH07CisgKiBcZW5kY29kZQorICoKKyAqIFRoZSBkZWNsYXJhdGlvbnMgYW5kIHRoZSBkZWZpbml0aW9uIG9mIFxjIFggYXJlIHJlcHJlc2VudGVkIGJ5IHRocmVlIAorICogZGlmZmVyZW50IGN1cnNvcnMsIGFsbCBvZiB3aGljaCBhcmUgZGVjbGFyYXRpb25zIG9mIHRoZSBzYW1lIHVuZGVybHlpbmcgCisgKiBlbnRpdHkuIE9uZSBvZiB0aGVzZSBjdXJzb3IgaXMgY29uc2lkZXJlZCB0aGUgImNhbm9uaWNhbCIgY3Vyc29yLCB3aGljaAorICogaXMgZWZmZWN0aXZlbHkgdGhlIHJlcHJlc2VudGF0aXZlIGZvciB0aGUgdW5kZXJseWluZyBlbnRpdHkuIE9uZSBjYW4gCisgKiBkZXRlcm1pbmUgaWYgdHdvIGN1cnNvcnMgYXJlIGRlY2xhcmF0aW9ucyBvZiB0aGUgc2FtZSB1bmRlcmx5aW5nIGVudGl0eSBieQorICogY29tcGFyaW5nIHRoZWlyIGNhbm9uaWNhbCBjdXJzb3JzLgorICoKKyAqIFxyZXR1cm5zIFRoZSBjYW5vbmljYWwgY3Vyc29yIGZvciB0aGUgZW50aXR5IHJlZmVycmVkIHRvIGJ5IHRoZSBnaXZlbiBjdXJzb3IuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYQ3Vyc29yIGNsYW5nX2dldENhbm9uaWNhbEN1cnNvcihDWEN1cnNvcik7CisKKy8qKgorICogXGJyaWVmIElmIHRoZSBjdXJzb3IgcG9pbnRzIHRvIGEgc2VsZWN0b3IgaWRlbnRpZmllciBpbiBhbiBPYmplY3RpdmUtQworICogbWV0aG9kIG9yIG1lc3NhZ2UgZXhwcmVzc2lvbiwgdGhpcyByZXR1cm5zIHRoZSBzZWxlY3RvciBpbmRleC4KKyAqCisgKiBBZnRlciBnZXR0aW5nIGEgY3Vyc29yIHdpdGggI2NsYW5nX2dldEN1cnNvciwgdGhpcyBjYW4gYmUgY2FsbGVkIHRvCisgKiBkZXRlcm1pbmUgaWYgdGhlIGxvY2F0aW9uIHBvaW50cyB0byBhIHNlbGVjdG9yIGlkZW50aWZpZXIuCisgKgorICogXHJldHVybnMgVGhlIHNlbGVjdG9yIGluZGV4IGlmIHRoZSBjdXJzb3IgaXMgYW4gT2JqZWN0aXZlLUMgbWV0aG9kIG9yIG1lc3NhZ2UKKyAqIGV4cHJlc3Npb24gYW5kIHRoZSBjdXJzb3IgaXMgcG9pbnRpbmcgdG8gYSBzZWxlY3RvciBpZGVudGlmaWVyLCBvciAtMQorICogb3RoZXJ3aXNlLgorICovCitDSU5ERVhfTElOS0FHRSBpbnQgY2xhbmdfQ3Vyc29yX2dldE9iakNTZWxlY3RvckluZGV4KENYQ3Vyc29yKTsKKworLyoqCisgKiBcYnJpZWYgR2l2ZW4gYSBjdXJzb3IgcG9pbnRpbmcgdG8gYSBDKysgbWV0aG9kIGNhbGwgb3IgYW4gT2JqZWN0aXZlLUMKKyAqIG1lc3NhZ2UsIHJldHVybnMgbm9uLXplcm8gaWYgdGhlIG1ldGhvZC9tZXNzYWdlIGlzICJkeW5hbWljIiwgbWVhbmluZzoKKyAqIAorICogRm9yIGEgQysrIG1ldGhvZDogdGhlIGNhbGwgaXMgdmlydHVhbC4KKyAqIEZvciBhbiBPYmplY3RpdmUtQyBtZXNzYWdlOiB0aGUgcmVjZWl2ZXIgaXMgYW4gb2JqZWN0IGluc3RhbmNlLCBub3QgJ3N1cGVyJworICogb3IgYSBzcGVjaWZpYyBjbGFzcy4KKyAqIAorICogSWYgdGhlIG1ldGhvZC9tZXNzYWdlIGlzICJzdGF0aWMiIG9yIHRoZSBjdXJzb3IgZG9lcyBub3QgcG9pbnQgdG8gYQorICogbWV0aG9kL21lc3NhZ2UsIGl0IHdpbGwgcmV0dXJuIHplcm8uCisgKi8KK0NJTkRFWF9MSU5LQUdFIGludCBjbGFuZ19DdXJzb3JfaXNEeW5hbWljQ2FsbChDWEN1cnNvciBDKTsKKworLyoqCisgKiBcYnJpZWYgR2l2ZW4gYSBjdXJzb3IgcG9pbnRpbmcgdG8gYW4gT2JqZWN0aXZlLUMgbWVzc2FnZSBvciBwcm9wZXJ0eQorICogcmVmZXJlbmNlLCBvciBDKysgbWV0aG9kIGNhbGwsIHJldHVybnMgdGhlIENYVHlwZSBvZiB0aGUgcmVjZWl2ZXIuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYVHlwZSBjbGFuZ19DdXJzb3JfZ2V0UmVjZWl2ZXJUeXBlKENYQ3Vyc29yIEMpOworCisvKioKKyAqIFxicmllZiBQcm9wZXJ0eSBhdHRyaWJ1dGVzIGZvciBhIFxjIENYQ3Vyc29yX09iakNQcm9wZXJ0eURlY2wuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIENYT2JqQ1Byb3BlcnR5QXR0cl9ub2F0dHIgICAgPSAweDAwLAorICBDWE9iakNQcm9wZXJ0eUF0dHJfcmVhZG9ubHkgID0gMHgwMSwKKyAgQ1hPYmpDUHJvcGVydHlBdHRyX2dldHRlciAgICA9IDB4MDIsCisgIENYT2JqQ1Byb3BlcnR5QXR0cl9hc3NpZ24gICAgPSAweDA0LAorICBDWE9iakNQcm9wZXJ0eUF0dHJfcmVhZHdyaXRlID0gMHgwOCwKKyAgQ1hPYmpDUHJvcGVydHlBdHRyX3JldGFpbiAgICA9IDB4MTAsCisgIENYT2JqQ1Byb3BlcnR5QXR0cl9jb3B5ICAgICAgPSAweDIwLAorICBDWE9iakNQcm9wZXJ0eUF0dHJfbm9uYXRvbWljID0gMHg0MCwKKyAgQ1hPYmpDUHJvcGVydHlBdHRyX3NldHRlciAgICA9IDB4ODAsCisgIENYT2JqQ1Byb3BlcnR5QXR0cl9hdG9taWMgICAgPSAweDEwMCwKKyAgQ1hPYmpDUHJvcGVydHlBdHRyX3dlYWsgICAgICA9IDB4MjAwLAorICBDWE9iakNQcm9wZXJ0eUF0dHJfc3Ryb25nICAgID0gMHg0MDAsCisgIENYT2JqQ1Byb3BlcnR5QXR0cl91bnNhZmVfdW5yZXRhaW5lZCA9IDB4ODAwLAorICBDWE9iakNQcm9wZXJ0eUF0dHJfY2xhc3MgPSAweDEwMDAKK30gQ1hPYmpDUHJvcGVydHlBdHRyS2luZDsKKworLyoqCisgKiBcYnJpZWYgR2l2ZW4gYSBjdXJzb3IgdGhhdCByZXByZXNlbnRzIGEgcHJvcGVydHkgZGVjbGFyYXRpb24sIHJldHVybiB0aGUKKyAqIGFzc29jaWF0ZWQgcHJvcGVydHkgYXR0cmlidXRlcy4gVGhlIGJpdHMgYXJlIGZvcm1lZCBmcm9tCisgKiBcYyBDWE9iakNQcm9wZXJ0eUF0dHJLaW5kLgorICoKKyAqIFxwYXJhbSByZXNlcnZlZCBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSwgcGFzcyAwLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19DdXJzb3JfZ2V0T2JqQ1Byb3BlcnR5QXR0cmlidXRlcyhDWEN1cnNvciBDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlc2VydmVkKTsKKworLyoqCisgKiBcYnJpZWYgJ1F1YWxpZmllcnMnIHdyaXR0ZW4gbmV4dCB0byB0aGUgcmV0dXJuIGFuZCBwYXJhbWV0ZXIgdHlwZXMgaW4KKyAqIE9iamVjdGl2ZS1DIG1ldGhvZCBkZWNsYXJhdGlvbnMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIENYT2JqQ0RlY2xRdWFsaWZpZXJfTm9uZSA9IDB4MCwKKyAgQ1hPYmpDRGVjbFF1YWxpZmllcl9JbiA9IDB4MSwKKyAgQ1hPYmpDRGVjbFF1YWxpZmllcl9Jbm91dCA9IDB4MiwKKyAgQ1hPYmpDRGVjbFF1YWxpZmllcl9PdXQgPSAweDQsCisgIENYT2JqQ0RlY2xRdWFsaWZpZXJfQnljb3B5ID0gMHg4LAorICBDWE9iakNEZWNsUXVhbGlmaWVyX0J5cmVmID0gMHgxMCwKKyAgQ1hPYmpDRGVjbFF1YWxpZmllcl9PbmV3YXkgPSAweDIwCit9IENYT2JqQ0RlY2xRdWFsaWZpZXJLaW5kOworCisvKioKKyAqIFxicmllZiBHaXZlbiBhIGN1cnNvciB0aGF0IHJlcHJlc2VudHMgYW4gT2JqZWN0aXZlLUMgbWV0aG9kIG9yIHBhcmFtZXRlcgorICogZGVjbGFyYXRpb24sIHJldHVybiB0aGUgYXNzb2NpYXRlZCBPYmplY3RpdmUtQyBxdWFsaWZpZXJzIGZvciB0aGUgcmV0dXJuCisgKiB0eXBlIG9yIHRoZSBwYXJhbWV0ZXIgcmVzcGVjdGl2ZWx5LiBUaGUgYml0cyBhcmUgZm9ybWVkIGZyb20KKyAqIENYT2JqQ0RlY2xRdWFsaWZpZXJLaW5kLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19DdXJzb3JfZ2V0T2JqQ0RlY2xRdWFsaWZpZXJzKENYQ3Vyc29yIEMpOworCisvKioKKyAqIFxicmllZiBHaXZlbiBhIGN1cnNvciB0aGF0IHJlcHJlc2VudHMgYW4gT2JqZWN0aXZlLUMgbWV0aG9kIG9yIHByb3BlcnR5CisgKiBkZWNsYXJhdGlvbiwgcmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBkZWNsYXJhdGlvbiB3YXMgYWZmZWN0ZWQgYnkgIlxAb3B0aW9uYWwiLgorICogUmV0dXJucyB6ZXJvIGlmIHRoZSBjdXJzb3IgaXMgbm90IHN1Y2ggYSBkZWNsYXJhdGlvbiBvciBpdCBpcyAiXEByZXF1aXJlZCIuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX0N1cnNvcl9pc09iakNPcHRpb25hbChDWEN1cnNvciBDKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJucyBub24temVybyBpZiB0aGUgZ2l2ZW4gY3Vyc29yIGlzIGEgdmFyaWFkaWMgZnVuY3Rpb24gb3IgbWV0aG9kLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19DdXJzb3JfaXNWYXJpYWRpYyhDWEN1cnNvciBDKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJucyBub24temVybyBpZiB0aGUgZ2l2ZW4gY3Vyc29yIHBvaW50cyB0byBhIHN5bWJvbCBtYXJrZWQgd2l0aAorICogZXh0ZXJuYWxfc291cmNlX3N5bWJvbCBhdHRyaWJ1dGUuCisgKgorICogXHBhcmFtIGxhbmd1YWdlIElmIG5vbi1OVUxMLCBhbmQgdGhlIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB3aWxsIGJlIHNldCB0bworICogdGhlICdsYW5ndWFnZScgc3RyaW5nIGZyb20gdGhlIGF0dHJpYnV0ZS4KKyAqCisgKiBccGFyYW0gZGVmaW5lZEluIElmIG5vbi1OVUxMLCBhbmQgdGhlIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB3aWxsIGJlIHNldCB0bworICogdGhlICdkZWZpbmVkSW4nIHN0cmluZyBmcm9tIHRoZSBhdHRyaWJ1dGUuCisgKgorICogXHBhcmFtIGlzR2VuZXJhdGVkIElmIG5vbi1OVUxMLCBhbmQgdGhlIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB3aWxsIGJlIHNldCB0bworICogbm9uLXplcm8gaWYgdGhlICdnZW5lcmF0ZWRfZGVjbGFyYXRpb24nIGlzIHNldCBpbiB0aGUgYXR0cmlidXRlLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19DdXJzb3JfaXNFeHRlcm5hbFN5bWJvbChDWEN1cnNvciBDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hTdHJpbmcgKmxhbmd1YWdlLCBDWFN0cmluZyAqZGVmaW5lZEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmlzR2VuZXJhdGVkKTsKKworLyoqCisgKiBcYnJpZWYgR2l2ZW4gYSBjdXJzb3IgdGhhdCByZXByZXNlbnRzIGEgZGVjbGFyYXRpb24sIHJldHVybiB0aGUgYXNzb2NpYXRlZAorICogY29tbWVudCdzIHNvdXJjZSByYW5nZS4gIFRoZSByYW5nZSBtYXkgaW5jbHVkZSBtdWx0aXBsZSBjb25zZWN1dGl2ZSBjb21tZW50cworICogd2l0aCB3aGl0ZXNwYWNlIGluIGJldHdlZW4uCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU291cmNlUmFuZ2UgY2xhbmdfQ3Vyc29yX2dldENvbW1lbnRSYW5nZShDWEN1cnNvciBDKTsKKworLyoqCisgKiBcYnJpZWYgR2l2ZW4gYSBjdXJzb3IgdGhhdCByZXByZXNlbnRzIGEgZGVjbGFyYXRpb24sIHJldHVybiB0aGUgYXNzb2NpYXRlZAorICogY29tbWVudCB0ZXh0LCBpbmNsdWRpbmcgY29tbWVudCBtYXJrZXJzLgorICovCitDSU5ERVhfTElOS0FHRSBDWFN0cmluZyBjbGFuZ19DdXJzb3JfZ2V0UmF3Q29tbWVudFRleHQoQ1hDdXJzb3IgQyk7CisKKy8qKgorICogXGJyaWVmIEdpdmVuIGEgY3Vyc29yIHRoYXQgcmVwcmVzZW50cyBhIGRvY3VtZW50YWJsZSBlbnRpdHkgKGUuZy4sCisgKiBkZWNsYXJhdGlvbiksIHJldHVybiB0aGUgYXNzb2NpYXRlZCBcXGJyaWVmIHBhcmFncmFwaDsgb3RoZXJ3aXNlIHJldHVybiB0aGUKKyAqIGZpcnN0IHBhcmFncmFwaC4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfQ3Vyc29yX2dldEJyaWVmQ29tbWVudFRleHQoQ1hDdXJzb3IgQyk7CisKKy8qKgorICogQH0KKyAqLworCisvKiogXGRlZmdyb3VwIENJTkRFWF9NQU5HTEUgTmFtZSBNYW5nbGluZyBBUEkgRnVuY3Rpb25zCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgQ1hTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBtYW5nbGVkIG5hbWUgb2YgdGhlIGN1cnNvci4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfQ3Vyc29yX2dldE1hbmdsaW5nKENYQ3Vyc29yKTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIENYU3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIG1hbmdsZWQgc3ltYm9scyBvZiB0aGUgQysrCisgKiBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIGF0IHRoZSBjdXJzb3IuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU3RyaW5nU2V0ICpjbGFuZ19DdXJzb3JfZ2V0Q1hYTWFuZ2xpbmdzKENYQ3Vyc29yKTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIENYU3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIG1hbmdsZWQgc3ltYm9scyBvZiB0aGUgT2JqQworICogY2xhc3MgaW50ZXJmYWNlIG9yIGltcGxlbWVudGF0aW9uIGF0IHRoZSBjdXJzb3IuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU3RyaW5nU2V0ICpjbGFuZ19DdXJzb3JfZ2V0T2JqQ01hbmdsaW5ncyhDWEN1cnNvcik7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIFxkZWZncm91cCBDSU5ERVhfTU9EVUxFIE1vZHVsZSBpbnRyb3NwZWN0aW9uCisgKgorICogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGdyb3VwIHByb3ZpZGUgYWNjZXNzIHRvIGluZm9ybWF0aW9uIGFib3V0IG1vZHVsZXMuCisgKgorICogQHsKKyAqLworCit0eXBlZGVmIHZvaWQgKkNYTW9kdWxlOworCisvKioKKyAqIFxicmllZiBHaXZlbiBhIENYQ3Vyc29yX01vZHVsZUltcG9ydERlY2wgY3Vyc29yLCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgbW9kdWxlLgorICovCitDSU5ERVhfTElOS0FHRSBDWE1vZHVsZSBjbGFuZ19DdXJzb3JfZ2V0TW9kdWxlKENYQ3Vyc29yIEMpOworCisvKioKKyAqIFxicmllZiBHaXZlbiBhIENYRmlsZSBoZWFkZXIgZmlsZSwgcmV0dXJuIHRoZSBtb2R1bGUgdGhhdCBjb250YWlucyBpdCwgaWYgb25lCisgKiBleGlzdHMuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYTW9kdWxlIGNsYW5nX2dldE1vZHVsZUZvckZpbGUoQ1hUcmFuc2xhdGlvblVuaXQsIENYRmlsZSk7CisKKy8qKgorICogXHBhcmFtIE1vZHVsZSBhIG1vZHVsZSBvYmplY3QuCisgKgorICogXHJldHVybnMgdGhlIG1vZHVsZSBmaWxlIHdoZXJlIHRoZSBwcm92aWRlZCBtb2R1bGUgb2JqZWN0IGNhbWUgZnJvbS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hGaWxlIGNsYW5nX01vZHVsZV9nZXRBU1RGaWxlKENYTW9kdWxlIE1vZHVsZSk7CisKKy8qKgorICogXHBhcmFtIE1vZHVsZSBhIG1vZHVsZSBvYmplY3QuCisgKgorICogXHJldHVybnMgdGhlIHBhcmVudCBvZiBhIHN1Yi1tb2R1bGUgb3IgTlVMTCBpZiB0aGUgZ2l2ZW4gbW9kdWxlIGlzIHRvcC1sZXZlbCwKKyAqIGUuZy4gZm9yICdzdGQudmVjdG9yJyBpdCB3aWxsIHJldHVybiB0aGUgJ3N0ZCcgbW9kdWxlLgorICovCitDSU5ERVhfTElOS0FHRSBDWE1vZHVsZSBjbGFuZ19Nb2R1bGVfZ2V0UGFyZW50KENYTW9kdWxlIE1vZHVsZSk7CisKKy8qKgorICogXHBhcmFtIE1vZHVsZSBhIG1vZHVsZSBvYmplY3QuCisgKgorICogXHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgZS5nLiBmb3IgdGhlICdzdGQudmVjdG9yJyBzdWItbW9kdWxlIGl0CisgKiB3aWxsIHJldHVybiAidmVjdG9yIi4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfTW9kdWxlX2dldE5hbWUoQ1hNb2R1bGUgTW9kdWxlKTsKKworLyoqCisgKiBccGFyYW0gTW9kdWxlIGEgbW9kdWxlIG9iamVjdC4KKyAqCisgKiBccmV0dXJucyB0aGUgZnVsbCBuYW1lIG9mIHRoZSBtb2R1bGUsIGUuZy4gInN0ZC52ZWN0b3IiLgorICovCitDSU5ERVhfTElOS0FHRSBDWFN0cmluZyBjbGFuZ19Nb2R1bGVfZ2V0RnVsbE5hbWUoQ1hNb2R1bGUgTW9kdWxlKTsKKworLyoqCisgKiBccGFyYW0gTW9kdWxlIGEgbW9kdWxlIG9iamVjdC4KKyAqCisgKiBccmV0dXJucyBub24temVybyBpZiB0aGUgbW9kdWxlIGlzIGEgc3lzdGVtIG9uZS4KKyAqLworQ0lOREVYX0xJTktBR0UgaW50IGNsYW5nX01vZHVsZV9pc1N5c3RlbShDWE1vZHVsZSBNb2R1bGUpOworCisvKioKKyAqIFxwYXJhbSBNb2R1bGUgYSBtb2R1bGUgb2JqZWN0LgorICoKKyAqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgdG9wIGxldmVsIGhlYWRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbW9kdWxlLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19Nb2R1bGVfZ2V0TnVtVG9wTGV2ZWxIZWFkZXJzKENYVHJhbnNsYXRpb25Vbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWE1vZHVsZSBNb2R1bGUpOworCisvKioKKyAqIFxwYXJhbSBNb2R1bGUgYSBtb2R1bGUgb2JqZWN0LgorICoKKyAqIFxwYXJhbSBJbmRleCB0b3AgbGV2ZWwgaGVhZGVyIGluZGV4ICh6ZXJvLWJhc2VkKS4KKyAqCisgKiBccmV0dXJucyB0aGUgc3BlY2lmaWVkIHRvcCBsZXZlbCBoZWFkZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2R1bGUuCisgKi8KK0NJTkRFWF9MSU5LQUdFCitDWEZpbGUgY2xhbmdfTW9kdWxlX2dldFRvcExldmVsSGVhZGVyKENYVHJhbnNsYXRpb25Vbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWE1vZHVsZSBNb2R1bGUsIHVuc2lnbmVkIEluZGV4KTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogXGRlZmdyb3VwIENJTkRFWF9DUFAgQysrIEFTVCBpbnRyb3NwZWN0aW9uCisgKgorICogVGhlIHJvdXRpbmVzIGluIHRoaXMgZ3JvdXAgcHJvdmlkZSBhY2Nlc3MgaW5mb3JtYXRpb24gaW4gdGhlIEFTVHMgc3BlY2lmaWMKKyAqIHRvIEMrKyBsYW5ndWFnZSBmZWF0dXJlcy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogXGJyaWVmIERldGVybWluZSBpZiBhIEMrKyBjb25zdHJ1Y3RvciBpcyBhIGNvbnZlcnRpbmcgY29uc3RydWN0b3IuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX0NYWENvbnN0cnVjdG9yX2lzQ29udmVydGluZ0NvbnN0cnVjdG9yKENYQ3Vyc29yIEMpOworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgaWYgYSBDKysgY29uc3RydWN0b3IgaXMgYSBjb3B5IGNvbnN0cnVjdG9yLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19DWFhDb25zdHJ1Y3Rvcl9pc0NvcHlDb25zdHJ1Y3RvcihDWEN1cnNvciBDKTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIGlmIGEgQysrIGNvbnN0cnVjdG9yIGlzIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19DWFhDb25zdHJ1Y3Rvcl9pc0RlZmF1bHRDb25zdHJ1Y3RvcihDWEN1cnNvciBDKTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIGlmIGEgQysrIGNvbnN0cnVjdG9yIGlzIGEgbW92ZSBjb25zdHJ1Y3Rvci4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfQ1hYQ29uc3RydWN0b3JfaXNNb3ZlQ29uc3RydWN0b3IoQ1hDdXJzb3IgQyk7CisKKy8qKgorICogXGJyaWVmIERldGVybWluZSBpZiBhIEMrKyBmaWVsZCBpcyBkZWNsYXJlZCAnbXV0YWJsZScuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX0NYWEZpZWxkX2lzTXV0YWJsZShDWEN1cnNvciBDKTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIGlmIGEgQysrIG1ldGhvZCBpcyBkZWNsYXJlZCAnPSBkZWZhdWx0Jy4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfQ1hYTWV0aG9kX2lzRGVmYXVsdGVkKENYQ3Vyc29yIEMpOworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgaWYgYSBDKysgbWVtYmVyIGZ1bmN0aW9uIG9yIG1lbWJlciBmdW5jdGlvbiB0ZW1wbGF0ZSBpcworICogcHVyZSB2aXJ0dWFsLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19DWFhNZXRob2RfaXNQdXJlVmlydHVhbChDWEN1cnNvciBDKTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIGlmIGEgQysrIG1lbWJlciBmdW5jdGlvbiBvciBtZW1iZXIgZnVuY3Rpb24gdGVtcGxhdGUgaXMgCisgKiBkZWNsYXJlZCAnc3RhdGljJy4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfQ1hYTWV0aG9kX2lzU3RhdGljKENYQ3Vyc29yIEMpOworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgaWYgYSBDKysgbWVtYmVyIGZ1bmN0aW9uIG9yIG1lbWJlciBmdW5jdGlvbiB0ZW1wbGF0ZSBpcworICogZXhwbGljaXRseSBkZWNsYXJlZCAndmlydHVhbCcgb3IgaWYgaXQgb3ZlcnJpZGVzIGEgdmlydHVhbCBtZXRob2QgZnJvbQorICogb25lIG9mIHRoZSBiYXNlIGNsYXNzZXMuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX0NYWE1ldGhvZF9pc1ZpcnR1YWwoQ1hDdXJzb3IgQyk7CisKKy8qKgorICogXGJyaWVmIERldGVybWluZSBpZiBhIEMrKyByZWNvcmQgaXMgYWJzdHJhY3QsIGkuZS4gd2hldGhlciBhIGNsYXNzIG9yIHN0cnVjdAorICogaGFzIGEgcHVyZSB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbi4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfQ1hYUmVjb3JkX2lzQWJzdHJhY3QoQ1hDdXJzb3IgQyk7CisKKy8qKgorICogXGJyaWVmIERldGVybWluZSBpZiBhbiBlbnVtIGRlY2xhcmF0aW9uIHJlZmVycyB0byBhIHNjb3BlZCBlbnVtLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19FbnVtRGVjbF9pc1Njb3BlZChDWEN1cnNvciBDKTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIGlmIGEgQysrIG1lbWJlciBmdW5jdGlvbiBvciBtZW1iZXIgZnVuY3Rpb24gdGVtcGxhdGUgaXMKKyAqIGRlY2xhcmVkICdjb25zdCcuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX0NYWE1ldGhvZF9pc0NvbnN0KENYQ3Vyc29yIEMpOworCisvKioKKyAqIFxicmllZiBHaXZlbiBhIGN1cnNvciB0aGF0IHJlcHJlc2VudHMgYSB0ZW1wbGF0ZSwgZGV0ZXJtaW5lCisgKiB0aGUgY3Vyc29yIGtpbmQgb2YgdGhlIHNwZWNpYWxpemF0aW9ucyB3b3VsZCBiZSBnZW5lcmF0ZWQgYnkgaW5zdGFudGlhdGluZworICogdGhlIHRlbXBsYXRlLgorICoKKyAqIFRoaXMgcm91dGluZSBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBmbGF2b3Igb2YgZnVuY3Rpb24gdGVtcGxhdGUsCisgKiBjbGFzcyB0ZW1wbGF0ZSwgb3IgY2xhc3MgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBpcyBzdG9yZWQgaW4gdGhlCisgKiBjdXJzb3IuIEZvciBleGFtcGxlLCBpdCBjYW4gZGVzY3JpYmUgd2hldGhlciBhIGNsYXNzIHRlbXBsYXRlIGN1cnNvciBpcworICogZGVjbGFyZWQgd2l0aCAic3RydWN0IiwgImNsYXNzIiBvciAidW5pb24iLgorICoKKyAqIFxwYXJhbSBDIFRoZSBjdXJzb3IgdG8gcXVlcnkuIFRoaXMgY3Vyc29yIHNob3VsZCByZXByZXNlbnQgYSB0ZW1wbGF0ZQorICogZGVjbGFyYXRpb24uCisgKgorICogXHJldHVybnMgVGhlIGN1cnNvciBraW5kIG9mIHRoZSBzcGVjaWFsaXphdGlvbnMgdGhhdCB3b3VsZCBiZSBnZW5lcmF0ZWQKKyAqIGJ5IGluc3RhbnRpYXRpbmcgdGhlIHRlbXBsYXRlIFxwIEMuIElmIFxwIEMgaXMgbm90IGEgdGVtcGxhdGUsIHJldHVybnMKKyAqIFxjIENYQ3Vyc29yX05vRGVjbEZvdW5kLgorICovCitDSU5ERVhfTElOS0FHRSBlbnVtIENYQ3Vyc29yS2luZCBjbGFuZ19nZXRUZW1wbGF0ZUN1cnNvcktpbmQoQ1hDdXJzb3IgQyk7CisgIAorLyoqCisgKiBcYnJpZWYgR2l2ZW4gYSBjdXJzb3IgdGhhdCBtYXkgcmVwcmVzZW50IGEgc3BlY2lhbGl6YXRpb24gb3IgaW5zdGFudGlhdGlvbgorICogb2YgYSB0ZW1wbGF0ZSwgcmV0cmlldmUgdGhlIGN1cnNvciB0aGF0IHJlcHJlc2VudHMgdGhlIHRlbXBsYXRlIHRoYXQgaXQKKyAqIHNwZWNpYWxpemVzIG9yIGZyb20gd2hpY2ggaXQgd2FzIGluc3RhbnRpYXRlZC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgZGV0ZXJtaW5lcyB0aGUgdGVtcGxhdGUgaW52b2x2ZWQgYm90aCBmb3IgZXhwbGljaXQgCisgKiBzcGVjaWFsaXphdGlvbnMgb2YgdGVtcGxhdGVzIGFuZCBmb3IgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgb2YgdGhlIHRlbXBsYXRlLAorICogYm90aCBvZiB3aGljaCBhcmUgcmVmZXJyZWQgdG8gYXMgInNwZWNpYWxpemF0aW9ucyIuIEZvciBhIGNsYXNzIHRlbXBsYXRlCisgKiBzcGVjaWFsaXphdGlvbiAoZS5nLiwgXGMgc3RkOjp2ZWN0b3I8Ym9vbD4pLCB0aGlzIHJvdXRpbmUgd2lsbCByZXR1cm4gCisgKiBlaXRoZXIgdGhlIHByaW1hcnkgdGVtcGxhdGUgKFxjIHN0ZDo6dmVjdG9yKSBvciwgaWYgdGhlIHNwZWNpYWxpemF0aW9uIHdhcworICogaW5zdGFudGlhdGVkIGZyb20gYSBjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLCB0aGUgY2xhc3MgdGVtcGxhdGUKKyAqIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uIEZvciBhIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYW5kIGEKKyAqIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIChpbmNsdWRpbmcgaW5zdGFudGlhdGlvbnMpLCB0aGlzCisgKiB0aGlzIHJvdXRpbmUgd2lsbCByZXR1cm4gdGhlIHNwZWNpYWxpemVkIHRlbXBsYXRlLgorICoKKyAqIEZvciBtZW1iZXJzIG9mIGEgY2xhc3MgdGVtcGxhdGUgKGUuZy4sIG1lbWJlciBmdW5jdGlvbnMsIG1lbWJlciBjbGFzc2VzLCBvcgorICogc3RhdGljIGRhdGEgbWVtYmVycyksIHJldHVybnMgdGhlIHNwZWNpYWxpemVkIG9yIGluc3RhbnRpYXRlZCBtZW1iZXIuIAorICogQWx0aG91Z2ggbm90IHN0cmljdGx5ICJ0ZW1wbGF0ZXMiIGluIHRoZSBDKysgbGFuZ3VhZ2UsIG1lbWJlcnMgb2YgY2xhc3MKKyAqIHRlbXBsYXRlcyBoYXZlIHRoZSBzYW1lIG5vdGlvbnMgb2Ygc3BlY2lhbGl6YXRpb25zIGFuZCBpbnN0YW50aWF0aW9ucyB0aGF0CisgKiB0ZW1wbGF0ZXMgZG8sIHNvIHRoaXMgcm91dGluZSB0cmVhdHMgdGhlbSBzaW1pbGFybHkuCisgKgorICogXHBhcmFtIEMgQSBjdXJzb3IgdGhhdCBtYXkgYmUgYSBzcGVjaWFsaXphdGlvbiBvZiBhIHRlbXBsYXRlIG9yIGEgbWVtYmVyCisgKiBvZiBhIHRlbXBsYXRlLgorICoKKyAqIFxyZXR1cm5zIElmIHRoZSBnaXZlbiBjdXJzb3IgaXMgYSBzcGVjaWFsaXphdGlvbiBvciBpbnN0YW50aWF0aW9uIG9mIGEgCisgKiB0ZW1wbGF0ZSBvciBhIG1lbWJlciB0aGVyZW9mLCB0aGUgdGVtcGxhdGUgb3IgbWVtYmVyIHRoYXQgaXQgc3BlY2lhbGl6ZXMgb3IKKyAqIGZyb20gd2hpY2ggaXQgd2FzIGluc3RhbnRpYXRlZC4gT3RoZXJ3aXNlLCByZXR1cm5zIGEgTlVMTCBjdXJzb3IuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYQ3Vyc29yIGNsYW5nX2dldFNwZWNpYWxpemVkQ3Vyc29yVGVtcGxhdGUoQ1hDdXJzb3IgQyk7CisKKy8qKgorICogXGJyaWVmIEdpdmVuIGEgY3Vyc29yIHRoYXQgcmVmZXJlbmNlcyBzb21ldGhpbmcgZWxzZSwgcmV0dXJuIHRoZSBzb3VyY2UgcmFuZ2UKKyAqIGNvdmVyaW5nIHRoYXQgcmVmZXJlbmNlLgorICoKKyAqIFxwYXJhbSBDIEEgY3Vyc29yIHBvaW50aW5nIHRvIGEgbWVtYmVyIHJlZmVyZW5jZSwgYSBkZWNsYXJhdGlvbiByZWZlcmVuY2UsIG9yCisgKiBhbiBvcGVyYXRvciBjYWxsLgorICogXHBhcmFtIE5hbWVGbGFncyBBIGJpdHNldCB3aXRoIHRocmVlIGluZGVwZW5kZW50IGZsYWdzOiAKKyAqIENYTmFtZVJhbmdlX1dhbnRRdWFsaWZpZXIsIENYTmFtZVJhbmdlX1dhbnRUZW1wbGF0ZUFyZ3MsIGFuZAorICogQ1hOYW1lUmFuZ2VfV2FudFNpbmdsZVBpZWNlLgorICogXHBhcmFtIFBpZWNlSW5kZXggRm9yIGNvbnRpZ3VvdXMgbmFtZXMgb3Igd2hlbiBwYXNzaW5nIHRoZSBmbGFnIAorICogQ1hOYW1lUmFuZ2VfV2FudFNpbmdsZVBpZWNlLCBvbmx5IG9uZSBwaWVjZSB3aXRoIGluZGV4IDAgaXMgCisgKiBhdmFpbGFibGUuIFdoZW4gdGhlIENYTmFtZVJhbmdlX1dhbnRTaW5nbGVQaWVjZSBmbGFnIGlzIG5vdCBwYXNzZWQgZm9yIGEKKyAqIG5vbi1jb250aWd1b3VzIG5hbWVzLCB0aGlzIGluZGV4IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBpbmRpdmlkdWFsCisgKiBwaWVjZXMgb2YgdGhlIG5hbWUuIFNlZSBhbHNvIENYTmFtZVJhbmdlX1dhbnRTaW5nbGVQaWVjZS4KKyAqCisgKiBccmV0dXJucyBUaGUgcGllY2Ugb2YgdGhlIG5hbWUgcG9pbnRlZCB0byBieSB0aGUgZ2l2ZW4gY3Vyc29yLiBJZiB0aGVyZSBpcyBubworICogbmFtZSwgb3IgaWYgdGhlIFBpZWNlSW5kZXggaXMgb3V0LW9mLXJhbmdlLCBhIG51bGwtY3Vyc29yIHdpbGwgYmUgcmV0dXJuZWQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU291cmNlUmFuZ2UgY2xhbmdfZ2V0Q3Vyc29yUmVmZXJlbmNlTmFtZVJhbmdlKENYQ3Vyc29yIEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOYW1lRmxhZ3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUGllY2VJbmRleCk7CisKK2VudW0gQ1hOYW1lUmVmRmxhZ3MgeworICAvKioKKyAgICogXGJyaWVmIEluY2x1ZGUgdGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciwgZS5nLiBGb286OiBpbiB4LkZvbzo6eSwgaW4gdGhlCisgICAqIHJhbmdlLgorICAgKi8KKyAgQ1hOYW1lUmFuZ2VfV2FudFF1YWxpZmllciA9IDB4MSwKKyAgCisgIC8qKgorICAgKiBcYnJpZWYgSW5jbHVkZSB0aGUgZXhwbGljaXQgdGVtcGxhdGUgYXJndW1lbnRzLCBlLmcuIFw8aW50PiBpbiB4LmY8aW50PiwKKyAgICogaW4gdGhlIHJhbmdlLgorICAgKi8KKyAgQ1hOYW1lUmFuZ2VfV2FudFRlbXBsYXRlQXJncyA9IDB4MiwKKworICAvKioKKyAgICogXGJyaWVmIElmIHRoZSBuYW1lIGlzIG5vbi1jb250aWd1b3VzLCByZXR1cm4gdGhlIGZ1bGwgc3Bhbm5pbmcgcmFuZ2UuCisgICAqCisgICAqIE5vbi1jb250aWd1b3VzIG5hbWVzIG9jY3VyIGluIE9iamVjdGl2ZS1DIHdoZW4gYSBzZWxlY3RvciB3aXRoIHR3byBvciBtb3JlCisgICAqIHBhcmFtZXRlcnMgaXMgdXNlZCwgb3IgaW4gQysrIHdoZW4gdXNpbmcgYW4gb3BlcmF0b3I6CisgICAqIFxjb2RlCisgICAqIFtvYmplY3QgZG9Tb21ldGhpbmc6aGVyZSB3aXRoVmFsdWU6dGhlcmVdOyAvLyBPYmplY3RpdmUtQworICAgKiByZXR1cm4gc29tZV92ZWN0b3JbMV07IC8vIEMrKworICAgKiBcZW5kY29kZQorICAgKi8KKyAgQ1hOYW1lUmFuZ2VfV2FudFNpbmdsZVBpZWNlID0gMHg0Cit9OworICAKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIFxkZWZncm91cCBDSU5ERVhfTEVYIFRva2VuIGV4dHJhY3Rpb24gYW5kIG1hbmlwdWxhdGlvbgorICoKKyAqIFRoZSByb3V0aW5lcyBpbiB0aGlzIGdyb3VwIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSB0b2tlbnMgd2l0aGluIGEKKyAqIHRyYW5zbGF0aW9uIHVuaXQsIGFsb25nIHdpdGggYSBzZW1hbnRpYyBtYXBwaW5nIG9mIHRob3NlIHRva2VucyB0bworICogdGhlaXIgY29ycmVzcG9uZGluZyBjdXJzb3JzLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBcYnJpZWYgRGVzY3JpYmVzIGEga2luZCBvZiB0b2tlbi4KKyAqLwordHlwZWRlZiBlbnVtIENYVG9rZW5LaW5kIHsKKyAgLyoqCisgICAqIFxicmllZiBBIHRva2VuIHRoYXQgY29udGFpbnMgc29tZSBraW5kIG9mIHB1bmN0dWF0aW9uLgorICAgKi8KKyAgQ1hUb2tlbl9QdW5jdHVhdGlvbiwKKworICAvKioKKyAgICogXGJyaWVmIEEgbGFuZ3VhZ2Uga2V5d29yZC4KKyAgICovCisgIENYVG9rZW5fS2V5d29yZCwKKworICAvKioKKyAgICogXGJyaWVmIEFuIGlkZW50aWZpZXIgKHRoYXQgaXMgbm90IGEga2V5d29yZCkuCisgICAqLworICBDWFRva2VuX0lkZW50aWZpZXIsCisKKyAgLyoqCisgICAqIFxicmllZiBBIG51bWVyaWMsIHN0cmluZywgb3IgY2hhcmFjdGVyIGxpdGVyYWwuCisgICAqLworICBDWFRva2VuX0xpdGVyYWwsCisKKyAgLyoqCisgICAqIFxicmllZiBBIGNvbW1lbnQuCisgICAqLworICBDWFRva2VuX0NvbW1lbnQKK30gQ1hUb2tlbktpbmQ7CisKKy8qKgorICogXGJyaWVmIERlc2NyaWJlcyBhIHNpbmdsZSBwcmVwcm9jZXNzaW5nIHRva2VuLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludF9kYXRhWzRdOworICB2b2lkICpwdHJfZGF0YTsKK30gQ1hUb2tlbjsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBraW5kIG9mIHRoZSBnaXZlbiB0b2tlbi4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hUb2tlbktpbmQgY2xhbmdfZ2V0VG9rZW5LaW5kKENYVG9rZW4pOworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgdGhlIHNwZWxsaW5nIG9mIHRoZSBnaXZlbiB0b2tlbi4KKyAqCisgKiBUaGUgc3BlbGxpbmcgb2YgYSB0b2tlbiBpcyB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGF0IHRva2VuLCBlLmcuLAorICogdGhlIHRleHQgb2YgYW4gaWRlbnRpZmllciBvciBrZXl3b3JkLgorICovCitDSU5ERVhfTElOS0FHRSBDWFN0cmluZyBjbGFuZ19nZXRUb2tlblNwZWxsaW5nKENYVHJhbnNsYXRpb25Vbml0LCBDWFRva2VuKTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgZ2l2ZW4gdG9rZW4uCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYU291cmNlTG9jYXRpb24gY2xhbmdfZ2V0VG9rZW5Mb2NhdGlvbihDWFRyYW5zbGF0aW9uVW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFRva2VuKTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgYSBzb3VyY2UgcmFuZ2UgdGhhdCBjb3ZlcnMgdGhlIGdpdmVuIHRva2VuLgorICovCitDSU5ERVhfTElOS0FHRSBDWFNvdXJjZVJhbmdlIGNsYW5nX2dldFRva2VuRXh0ZW50KENYVHJhbnNsYXRpb25Vbml0LCBDWFRva2VuKTsKKworLyoqCisgKiBcYnJpZWYgVG9rZW5pemUgdGhlIHNvdXJjZSBjb2RlIGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4gcmFuZ2UgaW50byByYXcKKyAqIGxleGljYWwgdG9rZW5zLgorICoKKyAqIFxwYXJhbSBUVSB0aGUgdHJhbnNsYXRpb24gdW5pdCB3aG9zZSB0ZXh0IGlzIGJlaW5nIHRva2VuaXplZC4KKyAqCisgKiBccGFyYW0gUmFuZ2UgdGhlIHNvdXJjZSByYW5nZSBpbiB3aGljaCB0ZXh0IHNob3VsZCBiZSB0b2tlbml6ZWQuIEFsbCBvZiB0aGUKKyAqIHRva2VucyBwcm9kdWNlZCBieSB0b2tlbml6YXRpb24gd2lsbCBmYWxsIHdpdGhpbiB0aGlzIHNvdXJjZSByYW5nZSwKKyAqCisgKiBccGFyYW0gVG9rZW5zIHRoaXMgcG9pbnRlciB3aWxsIGJlIHNldCB0byBwb2ludCB0byB0aGUgYXJyYXkgb2YgdG9rZW5zCisgKiB0aGF0IG9jY3VyIHdpdGhpbiB0aGUgZ2l2ZW4gc291cmNlIHJhbmdlLiBUaGUgcmV0dXJuZWQgcG9pbnRlciBtdXN0IGJlCisgKiBmcmVlZCB3aXRoIGNsYW5nX2Rpc3Bvc2VUb2tlbnMoKSBiZWZvcmUgdGhlIHRyYW5zbGF0aW9uIHVuaXQgaXMgZGVzdHJveWVkLgorICoKKyAqIFxwYXJhbSBOdW1Ub2tlbnMgd2lsbCBiZSBzZXQgdG8gdGhlIG51bWJlciBvZiB0b2tlbnMgaW4gdGhlIFxjICpUb2tlbnMKKyAqIGFycmF5LgorICoKKyAqLworQ0lOREVYX0xJTktBR0Ugdm9pZCBjbGFuZ190b2tlbml6ZShDWFRyYW5zbGF0aW9uVW5pdCBUVSwgQ1hTb3VyY2VSYW5nZSBSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hUb2tlbiAqKlRva2VucywgdW5zaWduZWQgKk51bVRva2Vucyk7CisKKy8qKgorICogXGJyaWVmIEFubm90YXRlIHRoZSBnaXZlbiBzZXQgb2YgdG9rZW5zIGJ5IHByb3ZpZGluZyBjdXJzb3JzIGZvciBlYWNoIHRva2VuCisgKiB0aGF0IGNhbiBiZSBtYXBwZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgd2l0aGluIHRoZSBhYnN0cmFjdCBzeW50YXggdHJlZS4KKyAqCisgKiBUaGlzIHRva2VuLWFubm90YXRpb24gcm91dGluZSBpcyBlcXVpdmFsZW50IHRvIGludm9raW5nCisgKiBjbGFuZ19nZXRDdXJzb3IoKSBmb3IgdGhlIHNvdXJjZSBsb2NhdGlvbnMgb2YgZWFjaCBvZiB0aGUKKyAqIHRva2Vucy4gVGhlIGN1cnNvcnMgcHJvdmlkZWQgYXJlIGZpbHRlcmVkLCBzbyB0aGF0IG9ubHkgdGhvc2UKKyAqIGN1cnNvcnMgdGhhdCBoYXZlIGEgZGlyZWN0IGNvcnJlc3BvbmRlbmNlIHRvIHRoZSB0b2tlbiBhcmUKKyAqIGFjY2VwdGVkLiBGb3IgZXhhbXBsZSwgZ2l2ZW4gYSBmdW5jdGlvbiBjYWxsIFxjIGYoeCksCisgKiBjbGFuZ19nZXRDdXJzb3IoKSB3b3VsZCBwcm92aWRlIHRoZSBmb2xsb3dpbmcgY3Vyc29yczoKKyAqCisgKiAgICogd2hlbiB0aGUgY3Vyc29yIGlzIG92ZXIgdGhlICdmJywgYSBEZWNsUmVmRXhwciBjdXJzb3IgcmVmZXJyaW5nIHRvICdmJy4KKyAqICAgKiB3aGVuIHRoZSBjdXJzb3IgaXMgb3ZlciB0aGUgJygnIG9yIHRoZSAnKScsIGEgQ2FsbEV4cHIgcmVmZXJyaW5nIHRvICdmJy4KKyAqICAgKiB3aGVuIHRoZSBjdXJzb3IgaXMgb3ZlciB0aGUgJ3gnLCBhIERlY2xSZWZFeHByIGN1cnNvciByZWZlcnJpbmcgdG8gJ3gnLgorICoKKyAqIE9ubHkgdGhlIGZpcnN0IGFuZCBsYXN0IG9mIHRoZXNlIGN1cnNvcnMgd2lsbCBvY2N1ciB3aXRoaW4gdGhlCisgKiBhbm5vdGF0ZSwgc2luY2UgdGhlIHRva2VucyAiZiIgYW5kICJ4JyBkaXJlY3RseSByZWZlciB0byBhIGZ1bmN0aW9uCisgKiBhbmQgYSB2YXJpYWJsZSwgcmVzcGVjdGl2ZWx5LCBidXQgdGhlIHBhcmVudGhlc2VzIGFyZSBqdXN0IGEgc21hbGwKKyAqIHBhcnQgb2YgdGhlIGZ1bGwgc3ludGF4IG9mIHRoZSBmdW5jdGlvbiBjYWxsIGV4cHJlc3Npb24sIHdoaWNoIGlzCisgKiBub3QgcHJvdmlkZWQgYXMgYW4gYW5ub3RhdGlvbi4KKyAqCisgKiBccGFyYW0gVFUgdGhlIHRyYW5zbGF0aW9uIHVuaXQgdGhhdCBvd25zIHRoZSBnaXZlbiB0b2tlbnMuCisgKgorICogXHBhcmFtIFRva2VucyB0aGUgc2V0IG9mIHRva2VucyB0byBhbm5vdGF0ZS4KKyAqCisgKiBccGFyYW0gTnVtVG9rZW5zIHRoZSBudW1iZXIgb2YgdG9rZW5zIGluIFxwIFRva2Vucy4KKyAqCisgKiBccGFyYW0gQ3Vyc29ycyBhbiBhcnJheSBvZiBccCBOdW1Ub2tlbnMgY3Vyc29ycywgd2hvc2UgY29udGVudHMgd2lsbCBiZQorICogcmVwbGFjZWQgd2l0aCB0aGUgY3Vyc29ycyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggdG9rZW4uCisgKi8KK0NJTkRFWF9MSU5LQUdFIHZvaWQgY2xhbmdfYW5ub3RhdGVUb2tlbnMoQ1hUcmFuc2xhdGlvblVuaXQgVFUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYVG9rZW4gKlRva2VucywgdW5zaWduZWQgTnVtVG9rZW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEN1cnNvciAqQ3Vyc29ycyk7CisKKy8qKgorICogXGJyaWVmIEZyZWUgdGhlIGdpdmVuIHNldCBvZiB0b2tlbnMuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHZvaWQgY2xhbmdfZGlzcG9zZVRva2VucyhDWFRyYW5zbGF0aW9uVW5pdCBUVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFRva2VuICpUb2tlbnMsIHVuc2lnbmVkIE51bVRva2Vucyk7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIFxkZWZncm91cCBDSU5ERVhfREVCVUcgRGVidWdnaW5nIGZhY2lsaXRpZXMKKyAqCisgKiBUaGVzZSByb3V0aW5lcyBhcmUgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLCBvbmx5LCBhbmQgc2hvdWxkIG5vdAorICogYmUgcmVsaWVkIHVwb24uCisgKgorICogQHsKKyAqLworCisvKiBmb3IgZGVidWcvdGVzdGluZyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfZ2V0Q3Vyc29yS2luZFNwZWxsaW5nKGVudW0gQ1hDdXJzb3JLaW5kIEtpbmQpOworQ0lOREVYX0xJTktBR0Ugdm9pZCBjbGFuZ19nZXREZWZpbml0aW9uU3BlbGxpbmdBbmRFeHRlbnQoQ1hDdXJzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqc3RhcnRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5kQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKnN0YXJ0TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpzdGFydENvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICplbmRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmVuZENvbHVtbik7CitDSU5ERVhfTElOS0FHRSB2b2lkIGNsYW5nX2VuYWJsZVN0YWNrVHJhY2VzKHZvaWQpOworQ0lOREVYX0xJTktBR0Ugdm9pZCBjbGFuZ19leGVjdXRlT25UaHJlYWQodm9pZCAoKmZuKSh2b2lkKiksIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHN0YWNrX3NpemUpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgQ0lOREVYX0NPREVfQ09NUExFVCBDb2RlIGNvbXBsZXRpb24KKyAqCisgKiBDb2RlIGNvbXBsZXRpb24gaW52b2x2ZXMgdGFraW5nIGFuIChpbmNvbXBsZXRlKSBzb3VyY2UgZmlsZSwgYWxvbmcgd2l0aAorICoga25vd2xlZGdlIG9mIHdoZXJlIHRoZSB1c2VyIGlzIGFjdGl2ZWx5IGVkaXRpbmcgdGhhdCBmaWxlLCBhbmQgc3VnZ2VzdGluZworICogc3ludGFjdGljYWxseS0gYW5kIHNlbWFudGljYWxseS12YWxpZCBjb25zdHJ1Y3RzIHRoYXQgdGhlIHVzZXIgbWlnaHQgd2FudCB0bworICogdXNlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aGUgc291cmNlIGNvZGUuIFRoZXNlIGRhdGEgc3RydWN0dXJlcyBhbmQKKyAqIHJvdXRpbmVzIHByb3ZpZGUgc3VwcG9ydCBmb3IgY29kZSBjb21wbGV0aW9uLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBcYnJpZWYgQSBzZW1hbnRpYyBzdHJpbmcgdGhhdCBkZXNjcmliZXMgYSBjb2RlLWNvbXBsZXRpb24gcmVzdWx0LgorICoKKyAqIEEgc2VtYW50aWMgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBmb3JtYXR0aW5nIG9mIGEgY29kZS1jb21wbGV0aW9uCisgKiByZXN1bHQgYXMgYSBzaW5nbGUgInRlbXBsYXRlIiBvZiB0ZXh0IHRoYXQgc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlCisgKiBzb3VyY2UgYnVmZmVyIHdoZW4gYSBwYXJ0aWN1bGFyIGNvZGUtY29tcGxldGlvbiByZXN1bHQgaXMgc2VsZWN0ZWQuCisgKiBFYWNoIHNlbWFudGljIHN0cmluZyBpcyBtYWRlIHVwIG9mIHNvbWUgbnVtYmVyIG9mICJjaHVua3MiLCBlYWNoIG9mIHdoaWNoCisgKiBjb250YWlucyBzb21lIHRleHQgYWxvbmcgd2l0aCBhIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhhdCB0ZXh0IG1lYW5zLCBlLmcuLAorICogdGhlIG5hbWUgb2YgdGhlIGVudGl0eSBiZWluZyByZWZlcmVuY2VkLCB3aGV0aGVyIHRoZSB0ZXh0IGNodW5rIGlzIHBhcnQgb2YKKyAqIHRoZSB0ZW1wbGF0ZSwgb3Igd2hldGhlciBpdCBpcyBhICJwbGFjZWhvbGRlciIgdGhhdCB0aGUgdXNlciBzaG91bGQgcmVwbGFjZQorICogd2l0aCBhY3R1YWwgY29kZSxvZiBhIHNwZWNpZmljIGtpbmQuIFNlZSBcYyBDWENvbXBsZXRpb25DaHVua0tpbmQgZm9yIGEKKyAqIGRlc2NyaXB0aW9uIG9mIHRoZSBkaWZmZXJlbnQga2luZHMgb2YgY2h1bmtzLgorICovCit0eXBlZGVmIHZvaWQgKkNYQ29tcGxldGlvblN0cmluZzsKKworLyoqCisgKiBcYnJpZWYgQSBzaW5nbGUgcmVzdWx0IG9mIGNvZGUgY29tcGxldGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAvKioKKyAgICogXGJyaWVmIFRoZSBraW5kIG9mIGVudGl0eSB0aGF0IHRoaXMgY29tcGxldGlvbiByZWZlcnMgdG8uCisgICAqCisgICAqIFRoZSBjdXJzb3Iga2luZCB3aWxsIGJlIGEgbWFjcm8sIGtleXdvcmQsIG9yIGEgZGVjbGFyYXRpb24gKG9uZSBvZiB0aGUKKyAgICogKkRlY2wgY3Vyc29yIGtpbmRzKSwgZGVzY3JpYmluZyB0aGUgZW50aXR5IHRoYXQgdGhlIGNvbXBsZXRpb24gaXMKKyAgICogcmVmZXJyaW5nIHRvLgorICAgKgorICAgKiBcdG9kbyBJbiB0aGUgZnV0dXJlLCB3ZSB3b3VsZCBsaWtlIHRvIHByb3ZpZGUgYSBmdWxsIGN1cnNvciwgdG8gYWxsb3cKKyAgICogdGhlIGNsaWVudCB0byBleHRyYWN0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZnJvbSBkZWNsYXJhdGlvbi4KKyAgICovCisgIGVudW0gQ1hDdXJzb3JLaW5kIEN1cnNvcktpbmQ7CisKKyAgLyoqCisgICAqIFxicmllZiBUaGUgY29kZS1jb21wbGV0aW9uIHN0cmluZyB0aGF0IGRlc2NyaWJlcyBob3cgdG8gaW5zZXJ0IHRoaXMKKyAgICogY29kZS1jb21wbGV0aW9uIHJlc3VsdCBpbnRvIHRoZSBlZGl0aW5nIGJ1ZmZlci4KKyAgICovCisgIENYQ29tcGxldGlvblN0cmluZyBDb21wbGV0aW9uU3RyaW5nOworfSBDWENvbXBsZXRpb25SZXN1bHQ7CisKKy8qKgorICogXGJyaWVmIERlc2NyaWJlcyBhIHNpbmdsZSBwaWVjZSBvZiB0ZXh0IHdpdGhpbiBhIGNvZGUtY29tcGxldGlvbiBzdHJpbmcuCisgKgorICogRWFjaCAiY2h1bmsiIHdpdGhpbiBhIGNvZGUtY29tcGxldGlvbiBzdHJpbmcgKFxjIENYQ29tcGxldGlvblN0cmluZykgaXMKKyAqIGVpdGhlciBhIHBpZWNlIG9mIHRleHQgd2l0aCBhIHNwZWNpZmljICJraW5kIiB0aGF0IGRlc2NyaWJlcyBob3cgdGhhdCB0ZXh0CisgKiBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIGNsaWVudCBvciBpcyBhbm90aGVyIGNvbXBsZXRpb24gc3RyaW5nLgorICovCitlbnVtIENYQ29tcGxldGlvbkNodW5rS2luZCB7CisgIC8qKgorICAgKiBcYnJpZWYgQSBjb2RlLWNvbXBsZXRpb24gc3RyaW5nIHRoYXQgZGVzY3JpYmVzICJvcHRpb25hbCIgdGV4dCB0aGF0CisgICAqIGNvdWxkIGJlIGEgcGFydCBvZiB0aGUgdGVtcGxhdGUgKGJ1dCBpcyBub3QgcmVxdWlyZWQpLgorICAgKgorICAgKiBUaGUgT3B0aW9uYWwgY2h1bmsgaXMgdGhlIG9ubHkga2luZCBvZiBjaHVuayB0aGF0IGhhcyBhIGNvZGUtY29tcGxldGlvbgorICAgKiBzdHJpbmcgZm9yIGl0cyByZXByZXNlbnRhdGlvbiwgd2hpY2ggaXMgYWNjZXNzaWJsZSB2aWEKKyAgICogXGMgY2xhbmdfZ2V0Q29tcGxldGlvbkNodW5rQ29tcGxldGlvblN0cmluZygpLiBUaGUgY29kZS1jb21wbGV0aW9uIHN0cmluZworICAgKiBkZXNjcmliZXMgYW4gYWRkaXRpb25hbCBwYXJ0IG9mIHRoZSB0ZW1wbGF0ZSB0aGF0IGlzIGNvbXBsZXRlbHkgb3B0aW9uYWwuCisgICAqIEZvciBleGFtcGxlLCBvcHRpb25hbCBjaHVua3MgY2FuIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHBsYWNlaG9sZGVycyBmb3IKKyAgICogYXJndW1lbnRzIHRoYXQgbWF0Y2ggdXAgd2l0aCBkZWZhdWx0ZWQgZnVuY3Rpb24gcGFyYW1ldGVycywgZS5nLiBnaXZlbjoKKyAgICoKKyAgICogXGNvZGUKKyAgICogdm9pZCBmKGludCB4LCBmbG9hdCB5ID0gMy4xNCwgZG91YmxlIHogPSAyLjcxODI4KTsKKyAgICogXGVuZGNvZGUKKyAgICoKKyAgICogVGhlIGNvZGUtY29tcGxldGlvbiBzdHJpbmcgZm9yIHRoaXMgZnVuY3Rpb24gd291bGQgY29udGFpbjoKKyAgICogICAtIGEgVHlwZWRUZXh0IGNodW5rIGZvciAiZiIuCisgICAqICAgLSBhIExlZnRQYXJlbiBjaHVuayBmb3IgIigiLgorICAgKiAgIC0gYSBQbGFjZWhvbGRlciBjaHVuayBmb3IgImludCB4IgorICAgKiAgIC0gYW4gT3B0aW9uYWwgY2h1bmsgY29udGFpbmluZyB0aGUgcmVtYWluaW5nIGRlZmF1bHRlZCBhcmd1bWVudHMsIGUuZy4sCisgICAqICAgICAgIC0gYSBDb21tYSBjaHVuayBmb3IgIiwiCisgICAqICAgICAgIC0gYSBQbGFjZWhvbGRlciBjaHVuayBmb3IgImZsb2F0IHkiCisgICAqICAgICAgIC0gYW4gT3B0aW9uYWwgY2h1bmsgY29udGFpbmluZyB0aGUgbGFzdCBkZWZhdWx0ZWQgYXJndW1lbnQ6CisgICAqICAgICAgICAgICAtIGEgQ29tbWEgY2h1bmsgZm9yICIsIgorICAgKiAgICAgICAgICAgLSBhIFBsYWNlaG9sZGVyIGNodW5rIGZvciAiZG91YmxlIHoiCisgICAqICAgLSBhIFJpZ2h0UGFyZW4gY2h1bmsgZm9yICIpIgorICAgKgorICAgKiBUaGVyZSBhcmUgbWFueSB3YXlzIHRvIGhhbmRsZSBPcHRpb25hbCBjaHVua3MuIFR3byBzaW1wbGUgYXBwcm9hY2hlcyBhcmU6CisgICAqICAgLSBDb21wbGV0ZWx5IGlnbm9yZSBvcHRpb25hbCBjaHVua3MsIGluIHdoaWNoIGNhc2UgdGhlIHRlbXBsYXRlIGZvciB0aGUKKyAgICogICAgIGZ1bmN0aW9uICJmIiB3b3VsZCBvbmx5IGluY2x1ZGUgdGhlIGZpcnN0IHBhcmFtZXRlciAoImludCB4IikuCisgICAqICAgLSBGdWxseSBleHBhbmQgYWxsIG9wdGlvbmFsIGNodW5rcywgaW4gd2hpY2ggY2FzZSB0aGUgdGVtcGxhdGUgZm9yIHRoZQorICAgKiAgICAgZnVuY3Rpb24gImYiIHdvdWxkIGhhdmUgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzLgorICAgKi8KKyAgQ1hDb21wbGV0aW9uQ2h1bmtfT3B0aW9uYWwsCisgIC8qKgorICAgKiBcYnJpZWYgVGV4dCB0aGF0IGEgdXNlciB3b3VsZCBiZSBleHBlY3RlZCB0byB0eXBlIHRvIGdldCB0aGlzCisgICAqIGNvZGUtY29tcGxldGlvbiByZXN1bHQuCisgICAqCisgICAqIFRoZXJlIHdpbGwgYmUgZXhhY3RseSBvbmUgInR5cGVkIHRleHQiIGNodW5rIGluIGEgc2VtYW50aWMgc3RyaW5nLCB3aGljaAorICAgKiB3aWxsIHR5cGljYWxseSBwcm92aWRlIHRoZSBzcGVsbGluZyBvZiBhIGtleXdvcmQgb3IgdGhlIG5hbWUgb2YgYQorICAgKiBkZWNsYXJhdGlvbiB0aGF0IGNvdWxkIGJlIHVzZWQgYXQgdGhlIGN1cnJlbnQgY29kZSBwb2ludC4gQ2xpZW50cyBhcmUKKyAgICogZXhwZWN0ZWQgdG8gZmlsdGVyIHRoZSBjb2RlLWNvbXBsZXRpb24gcmVzdWx0cyBiYXNlZCBvbiB0aGUgdGV4dCBpbiB0aGlzCisgICAqIGNodW5rLgorICAgKi8KKyAgQ1hDb21wbGV0aW9uQ2h1bmtfVHlwZWRUZXh0LAorICAvKioKKyAgICogXGJyaWVmIFRleHQgdGhhdCBzaG91bGQgYmUgaW5zZXJ0ZWQgYXMgcGFydCBvZiBhIGNvZGUtY29tcGxldGlvbiByZXN1bHQuCisgICAqCisgICAqIEEgInRleHQiIGNodW5rIHJlcHJlc2VudHMgdGV4dCB0aGF0IGlzIHBhcnQgb2YgdGhlIHRlbXBsYXRlIHRvIGJlCisgICAqIGluc2VydGVkIGludG8gdXNlciBjb2RlIHNob3VsZCB0aGlzIHBhcnRpY3VsYXIgY29kZS1jb21wbGV0aW9uIHJlc3VsdAorICAgKiBiZSBzZWxlY3RlZC4KKyAgICovCisgIENYQ29tcGxldGlvbkNodW5rX1RleHQsCisgIC8qKgorICAgKiBcYnJpZWYgUGxhY2Vob2xkZXIgdGV4dCB0aGF0IHNob3VsZCBiZSByZXBsYWNlZCBieSB0aGUgdXNlci4KKyAgICoKKyAgICogQSAicGxhY2Vob2xkZXIiIGNodW5rIG1hcmtzIGEgcGxhY2Ugd2hlcmUgdGhlIHVzZXIgc2hvdWxkIGluc2VydCB0ZXh0CisgICAqIGludG8gdGhlIGNvZGUtY29tcGxldGlvbiB0ZW1wbGF0ZS4gRm9yIGV4YW1wbGUsIHBsYWNlaG9sZGVycyBtaWdodCBtYXJrCisgICAqIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGZvciBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLCB0byBpbmRpY2F0ZSB0aGF0IHRoZQorICAgKiB1c2VyIHNob3VsZCBwcm92aWRlIGFyZ3VtZW50cyBmb3IgZWFjaCBvZiB0aG9zZSBwYXJhbWV0ZXJzLiBUaGUgYWN0dWFsCisgICAqIHRleHQgaW4gYSBwbGFjZWhvbGRlciBpcyBhIHN1Z2dlc3Rpb24gZm9yIHRoZSB0ZXh0IHRvIGRpc3BsYXkgYmVmb3JlCisgICAqIHRoZSB1c2VyIHJlcGxhY2VzIHRoZSBwbGFjZWhvbGRlciB3aXRoIHJlYWwgY29kZS4KKyAgICovCisgIENYQ29tcGxldGlvbkNodW5rX1BsYWNlaG9sZGVyLAorICAvKioKKyAgICogXGJyaWVmIEluZm9ybWF0aXZlIHRleHQgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGJ1dCBuZXZlciBpbnNlcnRlZCBhcworICAgKiBwYXJ0IG9mIHRoZSB0ZW1wbGF0ZS4KKyAgICoKKyAgICogQW4gImluZm9ybWF0aXZlIiBjaHVuayBjb250YWlucyBhbm5vdGF0aW9ucyB0aGF0IGNhbiBiZSBkaXNwbGF5ZWQgdG8KKyAgICogaGVscCB0aGUgdXNlciBkZWNpZGUgd2hldGhlciBhIHBhcnRpY3VsYXIgY29kZS1jb21wbGV0aW9uIHJlc3VsdCBpcyB0aGUKKyAgICogcmlnaHQgb3B0aW9uLCBidXQgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhlIGFjdHVhbCB0ZW1wbGF0ZSB0byBiZSBpbnNlcnRlZAorICAgKiBieSBjb2RlIGNvbXBsZXRpb24uCisgICAqLworICBDWENvbXBsZXRpb25DaHVua19JbmZvcm1hdGl2ZSwKKyAgLyoqCisgICAqIFxicmllZiBUZXh0IHRoYXQgZGVzY3JpYmVzIHRoZSBjdXJyZW50IHBhcmFtZXRlciB3aGVuIGNvZGUtY29tcGxldGlvbiBpcworICAgKiByZWZlcnJpbmcgdG8gZnVuY3Rpb24gY2FsbCwgbWVzc2FnZSBzZW5kLCBvciB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi4KKyAgICoKKyAgICogQSAiY3VycmVudCBwYXJhbWV0ZXIiIGNodW5rIG9jY3VycyB3aGVuIGNvZGUtY29tcGxldGlvbiBpcyBwcm92aWRpbmcKKyAgICogaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJhbWV0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgYXJndW1lbnQgYXQgdGhlCisgICAqIGNvZGUtY29tcGxldGlvbiBwb2ludC4gRm9yIGV4YW1wbGUsIGdpdmVuIGEgZnVuY3Rpb24KKyAgICoKKyAgICogXGNvZGUKKyAgICogaW50IGFkZChpbnQgeCwgaW50IHkpOworICAgKiBcZW5kY29kZQorICAgKgorICAgKiBhbmQgdGhlIHNvdXJjZSBjb2RlIFxjIGFkZCgsIHdoZXJlIHRoZSBjb2RlLWNvbXBsZXRpb24gcG9pbnQgaXMgYWZ0ZXIgdGhlCisgICAqICIoIiwgdGhlIGNvZGUtY29tcGxldGlvbiBzdHJpbmcgd2lsbCBjb250YWluIGEgImN1cnJlbnQgcGFyYW1ldGVyIiBjaHVuaworICAgKiBmb3IgImludCB4IiwgaW5kaWNhdGluZyB0aGF0IHRoZSBjdXJyZW50IGFyZ3VtZW50IHdpbGwgaW5pdGlhbGl6ZSB0aGF0CisgICAqIHBhcmFtZXRlci4gQWZ0ZXIgdHlwaW5nIGZ1cnRoZXIsIHRvIFxjIGFkZCgxNywgKHdoZXJlIHRoZSBjb2RlLWNvbXBsZXRpb24KKyAgICogcG9pbnQgaXMgYWZ0ZXIgdGhlICIsIiksIHRoZSBjb2RlLWNvbXBsZXRpb24gc3RyaW5nIHdpbGwgY29udGFpbiBhCisgICAqICJjdXJyZW50IHBhcmVtZXRlciIgY2h1bmsgdG8gImludCB5Ii4KKyAgICovCisgIENYQ29tcGxldGlvbkNodW5rX0N1cnJlbnRQYXJhbWV0ZXIsCisgIC8qKgorICAgKiBcYnJpZWYgQSBsZWZ0IHBhcmVudGhlc2lzICgnKCcpLCB1c2VkIHRvIGluaXRpYXRlIGEgZnVuY3Rpb24gY2FsbCBvcgorICAgKiBzaWduYWwgdGhlIGJlZ2lubmluZyBvZiBhIGZ1bmN0aW9uIHBhcmFtZXRlciBsaXN0LgorICAgKi8KKyAgQ1hDb21wbGV0aW9uQ2h1bmtfTGVmdFBhcmVuLAorICAvKioKKyAgICogXGJyaWVmIEEgcmlnaHQgcGFyZW50aGVzaXMgKCcpJyksIHVzZWQgdG8gZmluaXNoIGEgZnVuY3Rpb24gY2FsbCBvcgorICAgKiBzaWduYWwgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uIHBhcmFtZXRlciBsaXN0LgorICAgKi8KKyAgQ1hDb21wbGV0aW9uQ2h1bmtfUmlnaHRQYXJlbiwKKyAgLyoqCisgICAqIFxicmllZiBBIGxlZnQgYnJhY2tldCAoJ1snKS4KKyAgICovCisgIENYQ29tcGxldGlvbkNodW5rX0xlZnRCcmFja2V0LAorICAvKioKKyAgICogXGJyaWVmIEEgcmlnaHQgYnJhY2tldCAoJ10nKS4KKyAgICovCisgIENYQ29tcGxldGlvbkNodW5rX1JpZ2h0QnJhY2tldCwKKyAgLyoqCisgICAqIFxicmllZiBBIGxlZnQgYnJhY2UgKCd7JykuCisgICAqLworICBDWENvbXBsZXRpb25DaHVua19MZWZ0QnJhY2UsCisgIC8qKgorICAgKiBcYnJpZWYgQSByaWdodCBicmFjZSAoJ30nKS4KKyAgICovCisgIENYQ29tcGxldGlvbkNodW5rX1JpZ2h0QnJhY2UsCisgIC8qKgorICAgKiBcYnJpZWYgQSBsZWZ0IGFuZ2xlIGJyYWNrZXQgKCc8JykuCisgICAqLworICBDWENvbXBsZXRpb25DaHVua19MZWZ0QW5nbGUsCisgIC8qKgorICAgKiBcYnJpZWYgQSByaWdodCBhbmdsZSBicmFja2V0ICgnPicpLgorICAgKi8KKyAgQ1hDb21wbGV0aW9uQ2h1bmtfUmlnaHRBbmdsZSwKKyAgLyoqCisgICAqIFxicmllZiBBIGNvbW1hIHNlcGFyYXRvciAoJywnKS4KKyAgICovCisgIENYQ29tcGxldGlvbkNodW5rX0NvbW1hLAorICAvKioKKyAgICogXGJyaWVmIFRleHQgdGhhdCBzcGVjaWZpZXMgdGhlIHJlc3VsdCB0eXBlIG9mIGEgZ2l2ZW4gcmVzdWx0LgorICAgKgorICAgKiBUaGlzIHNwZWNpYWwga2luZCBvZiBpbmZvcm1hdGl2ZSBjaHVuayBpcyBub3QgbWVhbnQgdG8gYmUgaW5zZXJ0ZWQgaW50bworICAgKiB0aGUgdGV4dCBidWZmZXIuIFJhdGhlciwgaXQgaXMgbWVhbnQgdG8gaWxsdXN0cmF0ZSB0aGUgdHlwZSB0aGF0IGFuCisgICAqIGV4cHJlc3Npb24gdXNpbmcgdGhlIGdpdmVuIGNvbXBsZXRpb24gc3RyaW5nIHdvdWxkIGhhdmUuCisgICAqLworICBDWENvbXBsZXRpb25DaHVua19SZXN1bHRUeXBlLAorICAvKioKKyAgICogXGJyaWVmIEEgY29sb24gKCc6JykuCisgICAqLworICBDWENvbXBsZXRpb25DaHVua19Db2xvbiwKKyAgLyoqCisgICAqIFxicmllZiBBIHNlbWljb2xvbiAoJzsnKS4KKyAgICovCisgIENYQ29tcGxldGlvbkNodW5rX1NlbWlDb2xvbiwKKyAgLyoqCisgICAqIFxicmllZiBBbiAnPScgc2lnbi4KKyAgICovCisgIENYQ29tcGxldGlvbkNodW5rX0VxdWFsLAorICAvKioKKyAgICogSG9yaXpvbnRhbCBzcGFjZSAoJyAnKS4KKyAgICovCisgIENYQ29tcGxldGlvbkNodW5rX0hvcml6b250YWxTcGFjZSwKKyAgLyoqCisgICAqIFZlcnRpY2FsIHNwYWNlICgnXFxuJyksIGFmdGVyIHdoaWNoIGl0IGlzIGdlbmVyYWxseSBhIGdvb2QgaWRlYSB0bworICAgKiBwZXJmb3JtIGluZGVudGF0aW9uLgorICAgKi8KKyAgQ1hDb21wbGV0aW9uQ2h1bmtfVmVydGljYWxTcGFjZQorfTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBraW5kIG9mIGEgcGFydGljdWxhciBjaHVuayB3aXRoaW4gYSBjb21wbGV0aW9uIHN0cmluZy4KKyAqCisgKiBccGFyYW0gY29tcGxldGlvbl9zdHJpbmcgdGhlIGNvbXBsZXRpb24gc3RyaW5nIHRvIHF1ZXJ5LgorICoKKyAqIFxwYXJhbSBjaHVua19udW1iZXIgdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIGNodW5rIGluIHRoZSBjb21wbGV0aW9uIHN0cmluZy4KKyAqCisgKiBccmV0dXJucyB0aGUga2luZCBvZiB0aGUgY2h1bmsgYXQgdGhlIGluZGV4IFxjIGNodW5rX251bWJlci4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWENvbXBsZXRpb25DaHVua0tpbmQKK2NsYW5nX2dldENvbXBsZXRpb25DaHVua0tpbmQoQ1hDb21wbGV0aW9uU3RyaW5nIGNvbXBsZXRpb25fc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaHVua19udW1iZXIpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGNodW5rIHdpdGhpbiBhCisgKiBjb21wbGV0aW9uIHN0cmluZy4KKyAqCisgKiBccGFyYW0gY29tcGxldGlvbl9zdHJpbmcgdGhlIGNvbXBsZXRpb24gc3RyaW5nIHRvIHF1ZXJ5LgorICoKKyAqIFxwYXJhbSBjaHVua19udW1iZXIgdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIGNodW5rIGluIHRoZSBjb21wbGV0aW9uIHN0cmluZy4KKyAqCisgKiBccmV0dXJucyB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIGNodW5rIGF0IGluZGV4IFxjIGNodW5rX251bWJlci4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcKK2NsYW5nX2dldENvbXBsZXRpb25DaHVua1RleHQoQ1hDb21wbGV0aW9uU3RyaW5nIGNvbXBsZXRpb25fc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaHVua19udW1iZXIpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgY29tcGxldGlvbiBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBjaHVuaworICogd2l0aGluIGEgY29tcGxldGlvbiBzdHJpbmcuCisgKgorICogXHBhcmFtIGNvbXBsZXRpb25fc3RyaW5nIHRoZSBjb21wbGV0aW9uIHN0cmluZyB0byBxdWVyeS4KKyAqCisgKiBccGFyYW0gY2h1bmtfbnVtYmVyIHRoZSAwLWJhc2VkIGluZGV4IG9mIHRoZSBjaHVuayBpbiB0aGUgY29tcGxldGlvbiBzdHJpbmcuCisgKgorICogXHJldHVybnMgdGhlIGNvbXBsZXRpb24gc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2h1bmsgYXQgaW5kZXgKKyAqIFxjIGNodW5rX251bWJlci4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hDb21wbGV0aW9uU3RyaW5nCitjbGFuZ19nZXRDb21wbGV0aW9uQ2h1bmtDb21wbGV0aW9uU3RyaW5nKENYQ29tcGxldGlvblN0cmluZyBjb21wbGV0aW9uX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2h1bmtfbnVtYmVyKTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIG51bWJlciBvZiBjaHVua3MgaW4gdGhlIGdpdmVuIGNvZGUtY29tcGxldGlvbiBzdHJpbmcuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkCitjbGFuZ19nZXROdW1Db21wbGV0aW9uQ2h1bmtzKENYQ29tcGxldGlvblN0cmluZyBjb21wbGV0aW9uX3N0cmluZyk7CisKKy8qKgorICogXGJyaWVmIERldGVybWluZSB0aGUgcHJpb3JpdHkgb2YgdGhpcyBjb2RlIGNvbXBsZXRpb24uCisgKgorICogVGhlIHByaW9yaXR5IG9mIGEgY29kZSBjb21wbGV0aW9uIGluZGljYXRlcyBob3cgbGlrZWx5IGl0IGlzIHRoYXQgdGhpcyAKKyAqIHBhcnRpY3VsYXIgY29tcGxldGlvbiBpcyB0aGUgY29tcGxldGlvbiB0aGF0IHRoZSB1c2VyIHdpbGwgc2VsZWN0LiBUaGUKKyAqIHByaW9yaXR5IGlzIHNlbGVjdGVkIGJ5IHZhcmlvdXMgaW50ZXJuYWwgaGV1cmlzdGljcy4KKyAqCisgKiBccGFyYW0gY29tcGxldGlvbl9zdHJpbmcgVGhlIGNvbXBsZXRpb24gc3RyaW5nIHRvIHF1ZXJ5LgorICoKKyAqIFxyZXR1cm5zIFRoZSBwcmlvcml0eSBvZiB0aGlzIGNvbXBsZXRpb24gc3RyaW5nLiBTbWFsbGVyIHZhbHVlcyBpbmRpY2F0ZQorICogaGlnaGVyLXByaW9yaXR5IChtb3JlIGxpa2VseSkgY29tcGxldGlvbnMuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkCitjbGFuZ19nZXRDb21wbGV0aW9uUHJpb3JpdHkoQ1hDb21wbGV0aW9uU3RyaW5nIGNvbXBsZXRpb25fc3RyaW5nKTsKKyAgCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgZW50aXR5IHRoYXQgdGhpcyBjb2RlLWNvbXBsZXRpb24KKyAqIHN0cmluZyByZWZlcnMgdG8uCisgKgorICogXHBhcmFtIGNvbXBsZXRpb25fc3RyaW5nIFRoZSBjb21wbGV0aW9uIHN0cmluZyB0byBxdWVyeS4KKyAqCisgKiBccmV0dXJucyBUaGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBjb21wbGV0aW9uIHN0cmluZy4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWEF2YWlsYWJpbGl0eUtpbmQgCitjbGFuZ19nZXRDb21wbGV0aW9uQXZhaWxhYmlsaXR5KENYQ29tcGxldGlvblN0cmluZyBjb21wbGV0aW9uX3N0cmluZyk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBudW1iZXIgb2YgYW5ub3RhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbgorICogY29tcGxldGlvbiBzdHJpbmcuCisgKgorICogXHBhcmFtIGNvbXBsZXRpb25fc3RyaW5nIHRoZSBjb21wbGV0aW9uIHN0cmluZyB0byBxdWVyeS4KKyAqCisgKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGFubm90YXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29tcGxldGlvbgorICogc3RyaW5nLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZAorY2xhbmdfZ2V0Q29tcGxldGlvbk51bUFubm90YXRpb25zKENYQ29tcGxldGlvblN0cmluZyBjb21wbGV0aW9uX3N0cmluZyk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBhbm5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29tcGxldGlvbiBzdHJpbmcuCisgKgorICogXHBhcmFtIGNvbXBsZXRpb25fc3RyaW5nIHRoZSBjb21wbGV0aW9uIHN0cmluZyB0byBxdWVyeS4KKyAqCisgKiBccGFyYW0gYW5ub3RhdGlvbl9udW1iZXIgdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIGFubm90YXRpb24gb2YgdGhlCisgKiBjb21wbGV0aW9uIHN0cmluZy4KKyAqCisgKiBccmV0dXJucyBhbm5vdGF0aW9uIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbXBsZXRpb24gYXQgaW5kZXgKKyAqIFxjIGFubm90YXRpb25fbnVtYmVyLCBvciBhIE5VTEwgc3RyaW5nIGlmIHRoYXQgYW5ub3RhdGlvbiBpcyBub3QgYXZhaWxhYmxlLgorICovCitDSU5ERVhfTElOS0FHRSBDWFN0cmluZworY2xhbmdfZ2V0Q29tcGxldGlvbkFubm90YXRpb24oQ1hDb21wbGV0aW9uU3RyaW5nIGNvbXBsZXRpb25fc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYW5ub3RhdGlvbl9udW1iZXIpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgcGFyZW50IGNvbnRleHQgb2YgdGhlIGdpdmVuIGNvbXBsZXRpb24gc3RyaW5nLgorICoKKyAqIFRoZSBwYXJlbnQgY29udGV4dCBvZiBhIGNvbXBsZXRpb24gc3RyaW5nIGlzIHRoZSBzZW1hbnRpYyBwYXJlbnQgb2YgCisgKiB0aGUgZGVjbGFyYXRpb24gKGlmIGFueSkgdGhhdCB0aGUgY29kZSBjb21wbGV0aW9uIHJlcHJlc2VudHMuIEZvciBleGFtcGxlLAorICogYSBjb2RlIGNvbXBsZXRpb24gZm9yIGFuIE9iamVjdGl2ZS1DIG1ldGhvZCB3b3VsZCBoYXZlIHRoZSBtZXRob2QncyBjbGFzcworICogb3IgcHJvdG9jb2wgYXMgaXRzIGNvbnRleHQuCisgKgorICogXHBhcmFtIGNvbXBsZXRpb25fc3RyaW5nIFRoZSBjb2RlIGNvbXBsZXRpb24gc3RyaW5nIHdob3NlIHBhcmVudCBpcworICogYmVpbmcgcXVlcmllZC4KKyAqCisgKiBccGFyYW0ga2luZCBERVBSRUNBVEVEOiBhbHdheXMgc2V0IHRvIENYQ3Vyc29yX05vdEltcGxlbWVudGVkIGlmIG5vbi1OVUxMLgorICoKKyAqIFxyZXR1cm5zIFRoZSBuYW1lIG9mIHRoZSBjb21wbGV0aW9uIHBhcmVudCwgZS5nLiwgIk5TT2JqZWN0IiBpZgorICogdGhlIGNvbXBsZXRpb24gc3RyaW5nIHJlcHJlc2VudHMgYSBtZXRob2QgaW4gdGhlIE5TT2JqZWN0IGNsYXNzLgorICovCitDSU5ERVhfTElOS0FHRSBDWFN0cmluZworY2xhbmdfZ2V0Q29tcGxldGlvblBhcmVudChDWENvbXBsZXRpb25TdHJpbmcgY29tcGxldGlvbl9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQ1hDdXJzb3JLaW5kICpraW5kKTsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIGJyaWVmIGRvY3VtZW50YXRpb24gY29tbWVudCBhdHRhY2hlZCB0byB0aGUgZGVjbGFyYXRpb24KKyAqIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIGNvbXBsZXRpb24gc3RyaW5nLgorICovCitDSU5ERVhfTElOS0FHRSBDWFN0cmluZworY2xhbmdfZ2V0Q29tcGxldGlvbkJyaWVmQ29tbWVudChDWENvbXBsZXRpb25TdHJpbmcgY29tcGxldGlvbl9zdHJpbmcpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSBhIGNvbXBsZXRpb24gc3RyaW5nIGZvciBhbiBhcmJpdHJhcnkgZGVjbGFyYXRpb24gb3IgbWFjcm8KKyAqIGRlZmluaXRpb24gY3Vyc29yLgorICoKKyAqIFxwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB0byBxdWVyeS4KKyAqCisgKiBccmV0dXJucyBBIG5vbi1jb250ZXh0LXNlbnNpdGl2ZSBjb21wbGV0aW9uIHN0cmluZyBmb3IgZGVjbGFyYXRpb24gYW5kIG1hY3JvCisgKiBkZWZpbml0aW9uIGN1cnNvcnMsIG9yIE5VTEwgZm9yIG90aGVyIGtpbmRzIG9mIGN1cnNvcnMuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYQ29tcGxldGlvblN0cmluZworY2xhbmdfZ2V0Q3Vyc29yQ29tcGxldGlvblN0cmluZyhDWEN1cnNvciBjdXJzb3IpOworICAKKy8qKgorICogXGJyaWVmIENvbnRhaW5zIHRoZSByZXN1bHRzIG9mIGNvZGUtY29tcGxldGlvbi4KKyAqCisgKiBUaGlzIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSByZXN1bHRzIG9mIGNvZGUgY29tcGxldGlvbiwgYXMKKyAqIHByb2R1Y2VkIGJ5IFxjIGNsYW5nX2NvZGVDb21wbGV0ZUF0KCkuIEl0cyBjb250ZW50cyBtdXN0IGJlIGZyZWVkIGJ5CisgKiBcYyBjbGFuZ19kaXNwb3NlQ29kZUNvbXBsZXRlUmVzdWx0cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAvKioKKyAgICogXGJyaWVmIFRoZSBjb2RlLWNvbXBsZXRpb24gcmVzdWx0cy4KKyAgICovCisgIENYQ29tcGxldGlvblJlc3VsdCAqUmVzdWx0czsKKworICAvKioKKyAgICogXGJyaWVmIFRoZSBudW1iZXIgb2YgY29kZS1jb21wbGV0aW9uIHJlc3VsdHMgc3RvcmVkIGluIHRoZQorICAgKiBcYyBSZXN1bHRzIGFycmF5LgorICAgKi8KKyAgdW5zaWduZWQgTnVtUmVzdWx0czsKK30gQ1hDb2RlQ29tcGxldGVSZXN1bHRzOworCisvKioKKyAqIFxicmllZiBGbGFncyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gXGMgY2xhbmdfY29kZUNvbXBsZXRlQXQoKSB0bworICogbW9kaWZ5IGl0cyBiZWhhdmlvci4KKyAqCisgKiBUaGUgZW51bWVyYXRvcnMgaW4gdGhpcyBlbnVtZXJhdGlvbiBjYW4gYmUgYml0d2lzZS1PUidkIHRvZ2V0aGVyIHRvCisgKiBwcm92aWRlIG11bHRpcGxlIG9wdGlvbnMgdG8gXGMgY2xhbmdfY29kZUNvbXBsZXRlQXQoKS4KKyAqLworZW51bSBDWENvZGVDb21wbGV0ZV9GbGFncyB7CisgIC8qKgorICAgKiBcYnJpZWYgV2hldGhlciB0byBpbmNsdWRlIG1hY3JvcyB3aXRoaW4gdGhlIHNldCBvZiBjb2RlCisgICAqIGNvbXBsZXRpb25zIHJldHVybmVkLgorICAgKi8KKyAgQ1hDb2RlQ29tcGxldGVfSW5jbHVkZU1hY3JvcyA9IDB4MDEsCisKKyAgLyoqCisgICAqIFxicmllZiBXaGV0aGVyIHRvIGluY2x1ZGUgY29kZSBwYXR0ZXJucyBmb3IgbGFuZ3VhZ2UgY29uc3RydWN0cworICAgKiB3aXRoaW4gdGhlIHNldCBvZiBjb2RlIGNvbXBsZXRpb25zLCBlLmcuLCBmb3IgbG9vcHMuCisgICAqLworICBDWENvZGVDb21wbGV0ZV9JbmNsdWRlQ29kZVBhdHRlcm5zID0gMHgwMiwKKworICAvKioKKyAgICogXGJyaWVmIFdoZXRoZXIgdG8gaW5jbHVkZSBicmllZiBkb2N1bWVudGF0aW9uIHdpdGhpbiB0aGUgc2V0IG9mIGNvZGUKKyAgICogY29tcGxldGlvbnMgcmV0dXJuZWQuCisgICAqLworICBDWENvZGVDb21wbGV0ZV9JbmNsdWRlQnJpZWZDb21tZW50cyA9IDB4MDQsCisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gc3BlZWQgdXAgY29tcGxldGlvbiBieSBvbWl0dGluZyB0b3AtIG9yIG5hbWVzcGFjZS1sZXZlbCBlbnRpdGllcworICAgKiBkZWZpbmVkIGluIHRoZSBwcmVhbWJsZS4gVGhlcmUncyBubyBndWFyYW50ZWUgYW55IHBhcnRpY3VsYXIgZW50aXR5IGlzCisgICAqIG9taXR0ZWQuIFRoaXMgbWF5IGJlIHVzZWZ1bCBpZiB0aGUgaGVhZGVycyBhcmUgaW5kZXhlZCBleHRlcm5hbGx5LgorICAgKi8KKyAgQ1hDb2RlQ29tcGxldGVfU2tpcFByZWFtYmxlID0gMHgwOAorfTsKKworLyoqCisgKiBcYnJpZWYgQml0cyB0aGF0IHJlcHJlc2VudCB0aGUgY29udGV4dCB1bmRlciB3aGljaCBjb21wbGV0aW9uIGlzIG9jY3VycmluZy4KKyAqCisgKiBUaGUgZW51bWVyYXRvcnMgaW4gdGhpcyBlbnVtZXJhdGlvbiBtYXkgYmUgYml0d2lzZS1PUidkIHRvZ2V0aGVyIGlmIG11bHRpcGxlCisgKiBjb250ZXh0cyBhcmUgb2NjdXJyaW5nIHNpbXVsdGFuZW91c2x5LgorICovCitlbnVtIENYQ29tcGxldGlvbkNvbnRleHQgeworICAvKioKKyAgICogXGJyaWVmIFRoZSBjb250ZXh0IGZvciBjb21wbGV0aW9ucyBpcyB1bmV4cG9zZWQsIGFzIG9ubHkgQ2xhbmcgcmVzdWx0cworICAgKiBzaG91bGQgYmUgaW5jbHVkZWQuIChUaGlzIGlzIGVxdWl2YWxlbnQgdG8gaGF2aW5nIG5vIGNvbnRleHQgYml0cyBzZXQuKQorICAgKi8KKyAgQ1hDb21wbGV0aW9uQ29udGV4dF9VbmV4cG9zZWQgPSAwLAorICAKKyAgLyoqCisgICAqIFxicmllZiBDb21wbGV0aW9ucyBmb3IgYW55IHBvc3NpYmxlIHR5cGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzLgorICAgKi8KKyAgQ1hDb21wbGV0aW9uQ29udGV4dF9BbnlUeXBlID0gMSA8PCAwLAorICAKKyAgLyoqCisgICAqIFxicmllZiBDb21wbGV0aW9ucyBmb3IgYW55IHBvc3NpYmxlIHZhbHVlICh2YXJpYWJsZXMsIGZ1bmN0aW9uIGNhbGxzLCBldGMuKQorICAgKiBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMuCisgICAqLworICBDWENvbXBsZXRpb25Db250ZXh0X0FueVZhbHVlID0gMSA8PCAxLAorICAvKioKKyAgICogXGJyaWVmIENvbXBsZXRpb25zIGZvciB2YWx1ZXMgdGhhdCByZXNvbHZlIHRvIGFuIE9iamVjdGl2ZS1DIG9iamVjdCBzaG91bGQKKyAgICogYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMuCisgICAqLworICBDWENvbXBsZXRpb25Db250ZXh0X09iakNPYmplY3RWYWx1ZSA9IDEgPDwgMiwKKyAgLyoqCisgICAqIFxicmllZiBDb21wbGV0aW9ucyBmb3IgdmFsdWVzIHRoYXQgcmVzb2x2ZSB0byBhbiBPYmplY3RpdmUtQyBzZWxlY3RvcgorICAgKiBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMuCisgICAqLworICBDWENvbXBsZXRpb25Db250ZXh0X09iakNTZWxlY3RvclZhbHVlID0gMSA8PCAzLAorICAvKioKKyAgICogXGJyaWVmIENvbXBsZXRpb25zIGZvciB2YWx1ZXMgdGhhdCByZXNvbHZlIHRvIGEgQysrIGNsYXNzIHR5cGUgc2hvdWxkIGJlCisgICAqIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzLgorICAgKi8KKyAgQ1hDb21wbGV0aW9uQ29udGV4dF9DWFhDbGFzc1R5cGVWYWx1ZSA9IDEgPDwgNCwKKyAgCisgIC8qKgorICAgKiBcYnJpZWYgQ29tcGxldGlvbnMgZm9yIGZpZWxkcyBvZiB0aGUgbWVtYmVyIGJlaW5nIGFjY2Vzc2VkIHVzaW5nIHRoZSBkb3QKKyAgICogb3BlcmF0b3Igc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzLgorICAgKi8KKyAgQ1hDb21wbGV0aW9uQ29udGV4dF9Eb3RNZW1iZXJBY2Nlc3MgPSAxIDw8IDUsCisgIC8qKgorICAgKiBcYnJpZWYgQ29tcGxldGlvbnMgZm9yIGZpZWxkcyBvZiB0aGUgbWVtYmVyIGJlaW5nIGFjY2Vzc2VkIHVzaW5nIHRoZSBhcnJvdworICAgKiBvcGVyYXRvciBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMuCisgICAqLworICBDWENvbXBsZXRpb25Db250ZXh0X0Fycm93TWVtYmVyQWNjZXNzID0gMSA8PCA2LAorICAvKioKKyAgICogXGJyaWVmIENvbXBsZXRpb25zIGZvciBwcm9wZXJ0aWVzIG9mIHRoZSBPYmplY3RpdmUtQyBvYmplY3QgYmVpbmcgYWNjZXNzZWQKKyAgICogdXNpbmcgdGhlIGRvdCBvcGVyYXRvciBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMuCisgICAqLworICBDWENvbXBsZXRpb25Db250ZXh0X09iakNQcm9wZXJ0eUFjY2VzcyA9IDEgPDwgNywKKyAgCisgIC8qKgorICAgKiBcYnJpZWYgQ29tcGxldGlvbnMgZm9yIGVudW0gdGFncyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMuCisgICAqLworICBDWENvbXBsZXRpb25Db250ZXh0X0VudW1UYWcgPSAxIDw8IDgsCisgIC8qKgorICAgKiBcYnJpZWYgQ29tcGxldGlvbnMgZm9yIHVuaW9uIHRhZ3Mgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzLgorICAgKi8KKyAgQ1hDb21wbGV0aW9uQ29udGV4dF9VbmlvblRhZyA9IDEgPDwgOSwKKyAgLyoqCisgICAqIFxicmllZiBDb21wbGV0aW9ucyBmb3Igc3RydWN0IHRhZ3Mgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzLgorICAgKi8KKyAgQ1hDb21wbGV0aW9uQ29udGV4dF9TdHJ1Y3RUYWcgPSAxIDw8IDEwLAorICAKKyAgLyoqCisgICAqIFxicmllZiBDb21wbGV0aW9ucyBmb3IgQysrIGNsYXNzIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0cy4KKyAgICovCisgIENYQ29tcGxldGlvbkNvbnRleHRfQ2xhc3NUYWcgPSAxIDw8IDExLAorICAvKioKKyAgICogXGJyaWVmIENvbXBsZXRpb25zIGZvciBDKysgbmFtZXNwYWNlcyBhbmQgbmFtZXNwYWNlIGFsaWFzZXMgc2hvdWxkIGJlCisgICAqIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzLgorICAgKi8KKyAgQ1hDb21wbGV0aW9uQ29udGV4dF9OYW1lc3BhY2UgPSAxIDw8IDEyLAorICAvKioKKyAgICogXGJyaWVmIENvbXBsZXRpb25zIGZvciBDKysgbmVzdGVkIG5hbWUgc3BlY2lmaWVycyBzaG91bGQgYmUgaW5jbHVkZWQgaW4KKyAgICogdGhlIHJlc3VsdHMuCisgICAqLworICBDWENvbXBsZXRpb25Db250ZXh0X05lc3RlZE5hbWVTcGVjaWZpZXIgPSAxIDw8IDEzLAorICAKKyAgLyoqCisgICAqIFxicmllZiBDb21wbGV0aW9ucyBmb3IgT2JqZWN0aXZlLUMgaW50ZXJmYWNlcyAoY2xhc3Nlcykgc2hvdWxkIGJlIGluY2x1ZGVkCisgICAqIGluIHRoZSByZXN1bHRzLgorICAgKi8KKyAgQ1hDb21wbGV0aW9uQ29udGV4dF9PYmpDSW50ZXJmYWNlID0gMSA8PCAxNCwKKyAgLyoqCisgICAqIFxicmllZiBDb21wbGV0aW9ucyBmb3IgT2JqZWN0aXZlLUMgcHJvdG9jb2xzIHNob3VsZCBiZSBpbmNsdWRlZCBpbgorICAgKiB0aGUgcmVzdWx0cy4KKyAgICovCisgIENYQ29tcGxldGlvbkNvbnRleHRfT2JqQ1Byb3RvY29sID0gMSA8PCAxNSwKKyAgLyoqCisgICAqIFxicmllZiBDb21wbGV0aW9ucyBmb3IgT2JqZWN0aXZlLUMgY2F0ZWdvcmllcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4KKyAgICogdGhlIHJlc3VsdHMuCisgICAqLworICBDWENvbXBsZXRpb25Db250ZXh0X09iakNDYXRlZ29yeSA9IDEgPDwgMTYsCisgIC8qKgorICAgKiBcYnJpZWYgQ29tcGxldGlvbnMgZm9yIE9iamVjdGl2ZS1DIGluc3RhbmNlIG1lc3NhZ2VzIHNob3VsZCBiZSBpbmNsdWRlZAorICAgKiBpbiB0aGUgcmVzdWx0cy4KKyAgICovCisgIENYQ29tcGxldGlvbkNvbnRleHRfT2JqQ0luc3RhbmNlTWVzc2FnZSA9IDEgPDwgMTcsCisgIC8qKgorICAgKiBcYnJpZWYgQ29tcGxldGlvbnMgZm9yIE9iamVjdGl2ZS1DIGNsYXNzIG1lc3NhZ2VzIHNob3VsZCBiZSBpbmNsdWRlZCBpbgorICAgKiB0aGUgcmVzdWx0cy4KKyAgICovCisgIENYQ29tcGxldGlvbkNvbnRleHRfT2JqQ0NsYXNzTWVzc2FnZSA9IDEgPDwgMTgsCisgIC8qKgorICAgKiBcYnJpZWYgQ29tcGxldGlvbnMgZm9yIE9iamVjdGl2ZS1DIHNlbGVjdG9yIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBpbgorICAgKiB0aGUgcmVzdWx0cy4KKyAgICovCisgIENYQ29tcGxldGlvbkNvbnRleHRfT2JqQ1NlbGVjdG9yTmFtZSA9IDEgPDwgMTksCisgIAorICAvKioKKyAgICogXGJyaWVmIENvbXBsZXRpb25zIGZvciBwcmVwcm9jZXNzb3IgbWFjcm8gbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluCisgICAqIHRoZSByZXN1bHRzLgorICAgKi8KKyAgQ1hDb21wbGV0aW9uQ29udGV4dF9NYWNyb05hbWUgPSAxIDw8IDIwLAorICAKKyAgLyoqCisgICAqIFxicmllZiBOYXR1cmFsIGxhbmd1YWdlIGNvbXBsZXRpb25zIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0cy4KKyAgICovCisgIENYQ29tcGxldGlvbkNvbnRleHRfTmF0dXJhbExhbmd1YWdlID0gMSA8PCAyMSwKKyAgCisgIC8qKgorICAgKiBcYnJpZWYgVGhlIGN1cnJlbnQgY29udGV4dCBpcyB1bmtub3duLCBzbyBzZXQgYWxsIGNvbnRleHRzLgorICAgKi8KKyAgQ1hDb21wbGV0aW9uQ29udGV4dF9Vbmtub3duID0gKCgxIDw8IDIyKSAtIDEpCit9OworICAKKy8qKgorICogXGJyaWVmIFJldHVybnMgYSBkZWZhdWx0IHNldCBvZiBjb2RlLWNvbXBsZXRpb24gb3B0aW9ucyB0aGF0IGNhbiBiZQorICogcGFzc2VkIHRvXGMgY2xhbmdfY29kZUNvbXBsZXRlQXQoKS4gCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX2RlZmF1bHRDb2RlQ29tcGxldGVPcHRpb25zKHZvaWQpOworCisvKioKKyAqIFxicmllZiBQZXJmb3JtIGNvZGUgY29tcGxldGlvbiBhdCBhIGdpdmVuIGxvY2F0aW9uIGluIGEgdHJhbnNsYXRpb24gdW5pdC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNvZGUgY29tcGxldGlvbiBhdCBhIHBhcnRpY3VsYXIgZmlsZSwgbGluZSwgYW5kCisgKiBjb2x1bW4gd2l0aGluIHNvdXJjZSBjb2RlLCBwcm92aWRpbmcgcmVzdWx0cyB0aGF0IHN1Z2dlc3QgcG90ZW50aWFsCisgKiBjb2RlIHNuaXBwZXRzIGJhc2VkIG9uIHRoZSBjb250ZXh0IG9mIHRoZSBjb21wbGV0aW9uLiBUaGUgYmFzaWMgbW9kZWwKKyAqIGZvciBjb2RlIGNvbXBsZXRpb24gaXMgdGhhdCBDbGFuZyB3aWxsIHBhcnNlIGEgY29tcGxldGUgc291cmNlIGZpbGUsCisgKiBwZXJmb3JtaW5nIHN5bnRheCBjaGVja2luZyB1cCB0byB0aGUgbG9jYXRpb24gd2hlcmUgY29kZS1jb21wbGV0aW9uIGhhcworICogYmVlbiByZXF1ZXN0ZWQuIEF0IHRoYXQgcG9pbnQsIGEgc3BlY2lhbCBjb2RlLWNvbXBsZXRpb24gdG9rZW4gaXMgcGFzc2VkCisgKiB0byB0aGUgcGFyc2VyLCB3aGljaCByZWNvZ25pemVzIHRoaXMgdG9rZW4gYW5kIGRldGVybWluZXMsIGJhc2VkIG9uIHRoZQorICogY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgQy9PYmplY3RpdmUtQy9DKysgZ3JhbW1hciBhbmQgdGhlIHN0YXRlIG9mCisgKiBzZW1hbnRpYyBhbmFseXNpcywgd2hhdCBjb21wbGV0aW9ucyB0byBwcm92aWRlLiBUaGVzZSBjb21wbGV0aW9ucyBhcmUKKyAqIHJldHVybmVkIHZpYSBhIG5ldyBcYyBDWENvZGVDb21wbGV0ZVJlc3VsdHMgc3RydWN0dXJlLgorICoKKyAqIENvZGUgY29tcGxldGlvbiBpdHNlbGYgaXMgbWVhbnQgdG8gYmUgdHJpZ2dlcmVkIGJ5IHRoZSBjbGllbnQgd2hlbiB0aGUKKyAqIHVzZXIgdHlwZXMgcHVuY3R1YXRpb24gY2hhcmFjdGVycyBvciB3aGl0ZXNwYWNlLCBhdCB3aGljaCBwb2ludCB0aGUKKyAqIGNvZGUtY29tcGxldGlvbiBsb2NhdGlvbiB3aWxsIGNvaW5jaWRlIHdpdGggdGhlIGN1cnNvci4gRm9yIGV4YW1wbGUsIGlmIFxjIHAKKyAqIGlzIGEgcG9pbnRlciwgY29kZS1jb21wbGV0aW9uIG1pZ2h0IGJlIHRyaWdnZXJlZCBhZnRlciB0aGUgIi0iIGFuZCB0aGVuCisgKiBhZnRlciB0aGUgIj4iIGluIFxjIHAtPi4gV2hlbiB0aGUgY29kZS1jb21wbGV0aW9uIGxvY2F0aW9uIGlzIGFmZXIgdGhlICI+IiwKKyAqIHRoZSBjb21wbGV0aW9uIHJlc3VsdHMgd2lsbCBwcm92aWRlLCBlLmcuLCB0aGUgbWVtYmVycyBvZiB0aGUgc3RydWN0IHRoYXQKKyAqICJwIiBwb2ludHMgdG8uIFRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIHBsYWNpbmcgdGhlIGN1cnNvciBhdCB0aGUKKyAqIGJlZ2lubmluZyBvZiB0aGUgdG9rZW4gY3VycmVudGx5IGJlaW5nIHR5cGVkLCB0aGVuIGZpbHRlcmluZyB0aGUgcmVzdWx0cworICogYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSB0b2tlbi4gRm9yIGV4YW1wbGUsIHdoZW4gY29kZS1jb21wbGV0aW5nIGZvcgorICogdGhlIGV4cHJlc3Npb24gXGMgcC0+Z2V0LCB0aGUgY2xpZW50IHNob3VsZCBwcm92aWRlIHRoZSBsb2NhdGlvbiBqdXN0IGFmdGVyCisgKiB0aGUgIj4iIChlLmcuLCBwb2ludGluZyBhdCB0aGUgImciKSB0byB0aGlzIGNvZGUtY29tcGxldGlvbiBob29rLiBUaGVuLCB0aGUKKyAqIGNsaWVudCBjYW4gZmlsdGVyIHRoZSByZXN1bHRzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRva2VuIHRleHQgKCJnZXQiKSwgb25seQorICogc2hvd2luZyB0aG9zZSByZXN1bHRzIHRoYXQgc3RhcnQgd2l0aCAiZ2V0Ii4gVGhlIGludGVudCBvZiB0aGlzIGludGVyZmFjZQorICogaXMgdG8gc2VwYXJhdGUgdGhlIHJlbGF0aXZlbHkgaGlnaC1sYXRlbmN5IGFjcXVpc2l0aW9uIG9mIGNvZGUtY29tcGxldGlvbgorICogcmVzdWx0cyBmcm9tIHRoZSBmaWx0ZXJpbmcgb2YgcmVzdWx0cyBvbiBhIHBlci1jaGFyYWN0ZXIgYmFzaXMsIHdoaWNoIG11c3QKKyAqIGhhdmUgYSBsb3dlciBsYXRlbmN5LgorICoKKyAqIFxwYXJhbSBUVSBUaGUgdHJhbnNsYXRpb24gdW5pdCBpbiB3aGljaCBjb2RlLWNvbXBsZXRpb24gc2hvdWxkCisgKiBvY2N1ci4gVGhlIHNvdXJjZSBmaWxlcyBmb3IgdGhpcyB0cmFuc2xhdGlvbiB1bml0IG5lZWQgbm90IGJlCisgKiBjb21wbGV0ZWx5IHVwLXRvLWRhdGUgKGFuZCB0aGUgY29udGVudHMgb2YgdGhvc2Ugc291cmNlIGZpbGVzIG1heQorICogYmUgb3ZlcnJpZGRlbiB2aWEgXHAgdW5zYXZlZF9maWxlcykuIEN1cnNvcnMgcmVmZXJyaW5nIGludG8gdGhlCisgKiB0cmFuc2xhdGlvbiB1bml0IG1heSBiZSBpbnZhbGlkYXRlZCBieSB0aGlzIGludm9jYXRpb24uCisgKgorICogXHBhcmFtIGNvbXBsZXRlX2ZpbGVuYW1lIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSBjb2RlCisgKiBjb21wbGV0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQuIFRoaXMgZmlsZW5hbWUgbWF5IGJlIGFueSBmaWxlCisgKiBpbmNsdWRlZCBpbiB0aGUgdHJhbnNsYXRpb24gdW5pdC4KKyAqCisgKiBccGFyYW0gY29tcGxldGVfbGluZSBUaGUgbGluZSBhdCB3aGljaCBjb2RlLWNvbXBsZXRpb24gc2hvdWxkIG9jY3VyLgorICoKKyAqIFxwYXJhbSBjb21wbGV0ZV9jb2x1bW4gVGhlIGNvbHVtbiBhdCB3aGljaCBjb2RlLWNvbXBsZXRpb24gc2hvdWxkIG9jY3VyLgorICogTm90ZSB0aGF0IHRoZSBjb2x1bW4gc2hvdWxkIHBvaW50IGp1c3QgYWZ0ZXIgdGhlIHN5bnRhY3RpYyBjb25zdHJ1Y3QgdGhhdAorICogaW5pdGlhdGVkIGNvZGUgY29tcGxldGlvbiwgYW5kIG5vdCBpbiB0aGUgbWlkZGxlIG9mIGEgbGV4aWNhbCB0b2tlbi4KKyAqCisgKiBccGFyYW0gdW5zYXZlZF9maWxlcyB0aGUgRmlsZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBzYXZlZCB0byBkaXNrCisgKiBidXQgbWF5IGJlIHJlcXVpcmVkIGZvciBwYXJzaW5nIG9yIGNvZGUgY29tcGxldGlvbiwgaW5jbHVkaW5nIHRoZQorICogY29udGVudHMgb2YgdGhvc2UgZmlsZXMuICBUaGUgY29udGVudHMgYW5kIG5hbWUgb2YgdGhlc2UgZmlsZXMgKGFzCisgKiBzcGVjaWZpZWQgYnkgQ1hVbnNhdmVkRmlsZSkgYXJlIGNvcGllZCB3aGVuIG5lY2Vzc2FyeSwgc28gdGhlCisgKiBjbGllbnQgb25seSBuZWVkcyB0byBndWFyYW50ZWUgdGhlaXIgdmFsaWRpdHkgdW50aWwgdGhlIGNhbGwgdG8KKyAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKyAqCisgKiBccGFyYW0gbnVtX3Vuc2F2ZWRfZmlsZXMgVGhlIG51bWJlciBvZiB1bnNhdmVkIGZpbGUgZW50cmllcyBpbiBccAorICogdW5zYXZlZF9maWxlcy4KKyAqCisgKiBccGFyYW0gb3B0aW9ucyBFeHRyYSBvcHRpb25zIHRoYXQgY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgY29kZQorICogY29tcGxldGlvbiwgZXhwcmVzc2VkIGFzIGEgYml0d2lzZSBPUiBvZiB0aGUgZW51bWVyYXRvcnMgb2YgdGhlCisgKiBDWENvZGVDb21wbGV0ZV9GbGFncyBlbnVtZXJhdGlvbi4gVGhlIAorICogXGMgY2xhbmdfZGVmYXVsdENvZGVDb21wbGV0ZU9wdGlvbnMoKSBmdW5jdGlvbiByZXR1cm5zIGEgZGVmYXVsdCBzZXQKKyAqIG9mIGNvZGUtY29tcGxldGlvbiBvcHRpb25zLgorICoKKyAqIFxyZXR1cm5zIElmIHN1Y2Nlc3NmdWwsIGEgbmV3IFxjIENYQ29kZUNvbXBsZXRlUmVzdWx0cyBzdHJ1Y3R1cmUKKyAqIGNvbnRhaW5pbmcgY29kZS1jb21wbGV0aW9uIHJlc3VsdHMsIHdoaWNoIHNob3VsZCBldmVudHVhbGx5IGJlCisgKiBmcmVlZCB3aXRoIFxjIGNsYW5nX2Rpc3Bvc2VDb2RlQ29tcGxldGVSZXN1bHRzKCkuIElmIGNvZGUKKyAqIGNvbXBsZXRpb24gZmFpbHMsIHJldHVybnMgTlVMTC4KKyAqLworQ0lOREVYX0xJTktBR0UKK0NYQ29kZUNvbXBsZXRlUmVzdWx0cyAqY2xhbmdfY29kZUNvbXBsZXRlQXQoQ1hUcmFuc2xhdGlvblVuaXQgVFUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBsZXRlX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb21wbGV0ZV9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb21wbGV0ZV9jb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDWFVuc2F2ZWRGaWxlICp1bnNhdmVkX2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1fdW5zYXZlZF9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgb3B0aW9ucyk7CisKKy8qKgorICogXGJyaWVmIFNvcnQgdGhlIGNvZGUtY29tcGxldGlvbiByZXN1bHRzIGluIGNhc2UtaW5zZW5zaXRpdmUgYWxwaGFiZXRpY2FsIAorICogb3JkZXIuCisgKgorICogXHBhcmFtIFJlc3VsdHMgVGhlIHNldCBvZiByZXN1bHRzIHRvIHNvcnQuCisgKiBccGFyYW0gTnVtUmVzdWx0cyBUaGUgbnVtYmVyIG9mIHJlc3VsdHMgaW4gXHAgUmVzdWx0cy4KKyAqLworQ0lOREVYX0xJTktBR0UKK3ZvaWQgY2xhbmdfc29ydENvZGVDb21wbGV0aW9uUmVzdWx0cyhDWENvbXBsZXRpb25SZXN1bHQgKlJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUmVzdWx0cyk7CisgIAorLyoqCisgKiBcYnJpZWYgRnJlZSB0aGUgZ2l2ZW4gc2V0IG9mIGNvZGUtY29tcGxldGlvbiByZXN1bHRzLgorICovCitDSU5ERVhfTElOS0FHRQordm9pZCBjbGFuZ19kaXNwb3NlQ29kZUNvbXBsZXRlUmVzdWx0cyhDWENvZGVDb21wbGV0ZVJlc3VsdHMgKlJlc3VsdHMpOworICAKKy8qKgorICogXGJyaWVmIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGRpYWdub3N0aWNzIHByb2R1Y2VkIHByaW9yIHRvIHRoZQorICogbG9jYXRpb24gd2hlcmUgY29kZSBjb21wbGV0aW9uIHdhcyBwZXJmb3JtZWQuCisgKi8KK0NJTkRFWF9MSU5LQUdFCit1bnNpZ25lZCBjbGFuZ19jb2RlQ29tcGxldGVHZXROdW1EaWFnbm9zdGljcyhDWENvZGVDb21wbGV0ZVJlc3VsdHMgKlJlc3VsdHMpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSBhIGRpYWdub3N0aWMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb2RlIGNvbXBsZXRpb24uCisgKgorICogXHBhcmFtIFJlc3VsdHMgdGhlIGNvZGUgY29tcGxldGlvbiByZXN1bHRzIHRvIHF1ZXJ5LgorICogXHBhcmFtIEluZGV4IHRoZSB6ZXJvLWJhc2VkIGRpYWdub3N0aWMgbnVtYmVyIHRvIHJldHJpZXZlLgorICoKKyAqIFxyZXR1cm5zIHRoZSByZXF1ZXN0ZWQgZGlhZ25vc3RpYy4gVGhpcyBkaWFnbm9zdGljIG11c3QgYmUgZnJlZWQKKyAqIHZpYSBhIGNhbGwgdG8gXGMgY2xhbmdfZGlzcG9zZURpYWdub3N0aWMoKS4KKyAqLworQ0lOREVYX0xJTktBR0UKK0NYRGlhZ25vc3RpYyBjbGFuZ19jb2RlQ29tcGxldGVHZXREaWFnbm9zdGljKENYQ29kZUNvbXBsZXRlUmVzdWx0cyAqUmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGV4KTsKKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lcyB3aGF0IGNvbXBsZXRpb25zIGFyZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGNvbnRleHQKKyAqIHRoZSBnaXZlbiBjb2RlIGNvbXBsZXRpb24uCisgKiAKKyAqIFxwYXJhbSBSZXN1bHRzIHRoZSBjb2RlIGNvbXBsZXRpb24gcmVzdWx0cyB0byBxdWVyeQorICoKKyAqIFxyZXR1cm5zIHRoZSBraW5kcyBvZiBjb21wbGV0aW9ucyB0aGF0IGFyZSBhcHByb3ByaWF0ZSBmb3IgdXNlCisgKiBhbG9uZyB3aXRoIHRoZSBnaXZlbiBjb2RlIGNvbXBsZXRpb24gcmVzdWx0cy4KKyAqLworQ0lOREVYX0xJTktBR0UKK3Vuc2lnbmVkIGxvbmcgbG9uZyBjbGFuZ19jb2RlQ29tcGxldGVHZXRDb250ZXh0cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYQ29kZUNvbXBsZXRlUmVzdWx0cyAqUmVzdWx0cyk7CisKKy8qKgorICogXGJyaWVmIFJldHVybnMgdGhlIGN1cnNvciBraW5kIGZvciB0aGUgY29udGFpbmVyIGZvciB0aGUgY3VycmVudCBjb2RlCisgKiBjb21wbGV0aW9uIGNvbnRleHQuIFRoZSBjb250YWluZXIgaXMgb25seSBndWFyYW50ZWVkIHRvIGJlIHNldCBmb3IKKyAqIGNvbnRleHRzIHdoZXJlIGEgY29udGFpbmVyIGV4aXN0cyAoaS5lLiBtZW1iZXIgYWNjZXNzZXMgb3IgT2JqZWN0aXZlLUMKKyAqIG1lc3NhZ2Ugc2VuZHMpOyBpZiB0aGVyZSBpcyBub3QgYSBjb250YWluZXIsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4KKyAqIENYQ3Vyc29yX0ludmFsaWRDb2RlLgorICoKKyAqIFxwYXJhbSBSZXN1bHRzIHRoZSBjb2RlIGNvbXBsZXRpb24gcmVzdWx0cyB0byBxdWVyeQorICoKKyAqIFxwYXJhbSBJc0luY29tcGxldGUgb24gcmV0dXJuLCB0aGlzIHZhbHVlIHdpbGwgYmUgZmFsc2UgaWYgQ2xhbmcgaGFzIGNvbXBsZXRlCisgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udGFpbmVyLiBJZiBDbGFuZyBkb2VzIG5vdCBoYXZlIGNvbXBsZXRlCisgKiBpbmZvcm1hdGlvbiwgdGhpcyB2YWx1ZSB3aWxsIGJlIHRydWUuCisgKgorICogXHJldHVybnMgdGhlIGNvbnRhaW5lciBraW5kLCBvciBDWEN1cnNvcl9JbnZhbGlkQ29kZSBpZiB0aGVyZSBpcyBub3QgYQorICogY29udGFpbmVyCisgKi8KK0NJTkRFWF9MSU5LQUdFCitlbnVtIENYQ3Vyc29yS2luZCBjbGFuZ19jb2RlQ29tcGxldGVHZXRDb250YWluZXJLaW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYQ29kZUNvbXBsZXRlUmVzdWx0cyAqUmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKklzSW5jb21wbGV0ZSk7CisKKy8qKgorICogXGJyaWVmIFJldHVybnMgdGhlIFVTUiBmb3IgdGhlIGNvbnRhaW5lciBmb3IgdGhlIGN1cnJlbnQgY29kZSBjb21wbGV0aW9uCisgKiBjb250ZXh0LiBJZiB0aGVyZSBpcyBub3QgYSBjb250YWluZXIgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQsIHRoaXMKKyAqIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcuCisgKgorICogXHBhcmFtIFJlc3VsdHMgdGhlIGNvZGUgY29tcGxldGlvbiByZXN1bHRzIHRvIHF1ZXJ5CisgKgorICogXHJldHVybnMgdGhlIFVTUiBmb3IgdGhlIGNvbnRhaW5lcgorICovCitDSU5ERVhfTElOS0FHRQorQ1hTdHJpbmcgY2xhbmdfY29kZUNvbXBsZXRlR2V0Q29udGFpbmVyVVNSKENYQ29kZUNvbXBsZXRlUmVzdWx0cyAqUmVzdWx0cyk7CisKKy8qKgorICogXGJyaWVmIFJldHVybnMgdGhlIGN1cnJlbnRseS1lbnRlcmVkIHNlbGVjdG9yIGZvciBhbiBPYmplY3RpdmUtQyBtZXNzYWdlCisgKiBzZW5kLCBmb3JtYXR0ZWQgbGlrZSAiaW5pdFdpdGhGb286YmFyOiIuIE9ubHkgZ3VhcmFudGVlZCB0byByZXR1cm4gYQorICogbm9uLWVtcHR5IHN0cmluZyBmb3IgQ1hDb21wbGV0aW9uQ29udGV4dF9PYmpDSW5zdGFuY2VNZXNzYWdlIGFuZAorICogQ1hDb21wbGV0aW9uQ29udGV4dF9PYmpDQ2xhc3NNZXNzYWdlLgorICoKKyAqIFxwYXJhbSBSZXN1bHRzIHRoZSBjb2RlIGNvbXBsZXRpb24gcmVzdWx0cyB0byBxdWVyeQorICoKKyAqIFxyZXR1cm5zIHRoZSBzZWxlY3RvciAob3IgcGFydGlhbCBzZWxlY3RvcikgdGhhdCBoYXMgYmVlbiBlbnRlcmVkIHRodXMgZmFyCisgKiBmb3IgYW4gT2JqZWN0aXZlLUMgbWVzc2FnZSBzZW5kLgorICovCitDSU5ERVhfTElOS0FHRQorQ1hTdHJpbmcgY2xhbmdfY29kZUNvbXBsZXRlR2V0T2JqQ1NlbGVjdG9yKENYQ29kZUNvbXBsZXRlUmVzdWx0cyAqUmVzdWx0cyk7CisgIAorLyoqCisgKiBAfQorICovCisKKy8qKgorICogXGRlZmdyb3VwIENJTkRFWF9NSVNDIE1pc2NlbGxhbmVvdXMgdXRpbGl0eSBmdW5jdGlvbnMKKyAqCisgKiBAeworICovCisKKy8qKgorICogXGJyaWVmIFJldHVybiBhIHZlcnNpb24gc3RyaW5nLCBzdWl0YWJsZSBmb3Igc2hvd2luZyB0byBhIHVzZXIsIGJ1dCBub3QKKyAqICAgICAgICBpbnRlbmRlZCB0byBiZSBwYXJzZWQgKHRoZSBmb3JtYXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgc3RhYmxlKS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTdHJpbmcgY2xhbmdfZ2V0Q2xhbmdWZXJzaW9uKHZvaWQpOworCisvKioKKyAqIFxicmllZiBFbmFibGUvZGlzYWJsZSBjcmFzaCByZWNvdmVyeS4KKyAqCisgKiBccGFyYW0gaXNFbmFibGVkIEZsYWcgdG8gaW5kaWNhdGUgaWYgY3Jhc2ggcmVjb3ZlcnkgaXMgZW5hYmxlZC4gIEEgbm9uLXplcm8KKyAqICAgICAgICB2YWx1ZSBlbmFibGVzIGNyYXNoIHJlY292ZXJ5LCB3aGlsZSAwIGRpc2FibGVzIGl0LgorICovCitDSU5ERVhfTElOS0FHRSB2b2lkIGNsYW5nX3RvZ2dsZUNyYXNoUmVjb3ZlcnkodW5zaWduZWQgaXNFbmFibGVkKTsKKyAgCisgLyoqCisgICogXGJyaWVmIFZpc2l0b3IgaW52b2tlZCBmb3IgZWFjaCBmaWxlIGluIGEgdHJhbnNsYXRpb24gdW5pdAorICAqICAgICAgICAodXNlZCB3aXRoIGNsYW5nX2dldEluY2x1c2lvbnMoKSkuCisgICoKKyAgKiBUaGlzIHZpc2l0b3IgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIGJ5IGNsYW5nX2dldEluY2x1c2lvbnMoKSBmb3IgZWFjaAorICAqIGZpbGUgaW5jbHVkZWQgKGVpdGhlciBhdCB0aGUgdG9wLWxldmVsIG9yIGJ5IFwjaW5jbHVkZSBkaXJlY3RpdmVzKSB3aXRoaW4KKyAgKiBhIHRyYW5zbGF0aW9uIHVuaXQuICBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGZpbGUgYmVpbmcgaW5jbHVkZWQsIGFuZAorICAqIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGFyZ3VtZW50cyBwcm92aWRlIHRoZSBpbmNsdXNpb24gc3RhY2suICBUaGUKKyAgKiBhcnJheSBpcyBzb3J0ZWQgaW4gb3JkZXIgb2YgaW1tZWRpYXRlIGluY2x1c2lvbi4gIEZvciBleGFtcGxlLAorICAqIHRoZSBmaXJzdCBlbGVtZW50IHJlZmVycyB0byB0aGUgbG9jYXRpb24gdGhhdCBpbmNsdWRlZCAnaW5jbHVkZWRfZmlsZScuCisgICovCit0eXBlZGVmIHZvaWQgKCpDWEluY2x1c2lvblZpc2l0b3IpKENYRmlsZSBpbmNsdWRlZF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFNvdXJjZUxvY2F0aW9uKiBpbmNsdXNpb25fc3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluY2x1ZGVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWENsaWVudERhdGEgY2xpZW50X2RhdGEpOworCisvKioKKyAqIFxicmllZiBWaXNpdCB0aGUgc2V0IG9mIHByZXByb2Nlc3NvciBpbmNsdXNpb25zIGluIGEgdHJhbnNsYXRpb24gdW5pdC4KKyAqICAgVGhlIHZpc2l0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIHByb3ZpZGVkIGRhdGEgZm9yIGV2ZXJ5IGluY2x1ZGVkCisgKiAgIGZpbGUuICBUaGlzIGRvZXMgbm90IGluY2x1ZGUgaGVhZGVycyBpbmNsdWRlZCBieSB0aGUgUENIIGZpbGUgKHVubGVzcyBvbmUKKyAqICAgaXMgaW5zcGVjdGluZyB0aGUgaW5jbHVzaW9ucyBpbiB0aGUgUENIIGZpbGUgaXRzZWxmKS4KKyAqLworQ0lOREVYX0xJTktBR0Ugdm9pZCBjbGFuZ19nZXRJbmNsdXNpb25zKENYVHJhbnNsYXRpb25Vbml0IHR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYSW5jbHVzaW9uVmlzaXRvciB2aXNpdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYQ2xpZW50RGF0YSBjbGllbnRfZGF0YSk7CisKK3R5cGVkZWYgZW51bSB7CisgIENYRXZhbF9JbnQgPSAxICwKKyAgQ1hFdmFsX0Zsb2F0ID0gMiwKKyAgQ1hFdmFsX09iakNTdHJMaXRlcmFsID0gMywKKyAgQ1hFdmFsX1N0ckxpdGVyYWwgPSA0LAorICBDWEV2YWxfQ0ZTdHIgPSA1LAorICBDWEV2YWxfT3RoZXIgPSA2LAorCisgIENYRXZhbF9VbkV4cG9zZWQgPSAwCisKK30gQ1hFdmFsUmVzdWx0S2luZCA7CisKKy8qKgorICogXGJyaWVmIEV2YWx1YXRpb24gcmVzdWx0IG9mIGEgY3Vyc29yCisgKi8KK3R5cGVkZWYgdm9pZCAqIENYRXZhbFJlc3VsdDsKKworLyoqCisgKiBcYnJpZWYgSWYgY3Vyc29yIGlzIGEgc3RhdGVtZW50IGRlY2xhcmF0aW9uIHRyaWVzIHRvIGV2YWx1YXRlIHRoZSAKKyAqIHN0YXRlbWVudCBhbmQgaWYgaXRzIHZhcmlhYmxlLCB0cmllcyB0byBldmFsdWF0ZSBpdHMgaW5pdGlhbGl6ZXIsCisgKiBpbnRvIGl0cyBjb3JyZXNwb25kaW5nIHR5cGUuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYRXZhbFJlc3VsdCBjbGFuZ19DdXJzb3JfRXZhbHVhdGUoQ1hDdXJzb3IgQyk7CisKKy8qKgorICogXGJyaWVmIFJldHVybnMgdGhlIGtpbmQgb2YgdGhlIGV2YWx1YXRlZCByZXN1bHQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYRXZhbFJlc3VsdEtpbmQgY2xhbmdfRXZhbFJlc3VsdF9nZXRLaW5kKENYRXZhbFJlc3VsdCBFKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJucyB0aGUgZXZhbHVhdGlvbiByZXN1bHQgYXMgaW50ZWdlciBpZiB0aGUKKyAqIGtpbmQgaXMgSW50LgorICovCitDSU5ERVhfTElOS0FHRSBpbnQgY2xhbmdfRXZhbFJlc3VsdF9nZXRBc0ludChDWEV2YWxSZXN1bHQgRSk7CisKKy8qKgorICogXGJyaWVmIFJldHVybnMgdGhlIGV2YWx1YXRpb24gcmVzdWx0IGFzIGEgbG9uZyBsb25nIGludGVnZXIgaWYgdGhlCisgKiBraW5kIGlzIEludC4gVGhpcyBwcmV2ZW50cyBvdmVyZmxvd3MgdGhhdCBtYXkgaGFwcGVuIGlmIHRoZSByZXN1bHQgaXMKKyAqIHJldHVybmVkIHdpdGggY2xhbmdfRXZhbFJlc3VsdF9nZXRBc0ludC4KKyAqLworQ0lOREVYX0xJTktBR0UgbG9uZyBsb25nIGNsYW5nX0V2YWxSZXN1bHRfZ2V0QXNMb25nTG9uZyhDWEV2YWxSZXN1bHQgRSk7CisKKy8qKgorICogXGJyaWVmIFJldHVybnMgYSBub24temVybyB2YWx1ZSBpZiB0aGUga2luZCBpcyBJbnQgYW5kIHRoZSBldmFsdWF0aW9uCisgKiByZXN1bHQgcmVzdWx0ZWQgaW4gYW4gdW5zaWduZWQgaW50ZWdlci4KKyAqLworQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfRXZhbFJlc3VsdF9pc1Vuc2lnbmVkSW50KENYRXZhbFJlc3VsdCBFKTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJucyB0aGUgZXZhbHVhdGlvbiByZXN1bHQgYXMgYW4gdW5zaWduZWQgaW50ZWdlciBpZgorICogdGhlIGtpbmQgaXMgSW50IGFuZCBjbGFuZ19FdmFsUmVzdWx0X2lzVW5zaWduZWRJbnQgaXMgbm9uLXplcm8uCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGxvbmcgbG9uZyBjbGFuZ19FdmFsUmVzdWx0X2dldEFzVW5zaWduZWQoQ1hFdmFsUmVzdWx0IEUpOworCisvKioKKyAqIFxicmllZiBSZXR1cm5zIHRoZSBldmFsdWF0aW9uIHJlc3VsdCBhcyBkb3VibGUgaWYgdGhlCisgKiBraW5kIGlzIGRvdWJsZS4KKyAqLworQ0lOREVYX0xJTktBR0UgZG91YmxlIGNsYW5nX0V2YWxSZXN1bHRfZ2V0QXNEb3VibGUoQ1hFdmFsUmVzdWx0IEUpOworCisvKioKKyAqIFxicmllZiBSZXR1cm5zIHRoZSBldmFsdWF0aW9uIHJlc3VsdCBhcyBhIGNvbnN0YW50IHN0cmluZyBpZiB0aGUKKyAqIGtpbmQgaXMgb3RoZXIgdGhhbiBJbnQgb3IgZmxvYXQuIFVzZXIgbXVzdCBub3QgZnJlZSB0aGlzIHBvaW50ZXIsCisgKiBpbnN0ZWFkIGNhbGwgY2xhbmdfRXZhbFJlc3VsdF9kaXNwb3NlIG9uIHRoZSBDWEV2YWxSZXN1bHQgcmV0dXJuZWQKKyAqIGJ5IGNsYW5nX0N1cnNvcl9FdmFsdWF0ZS4KKyAqLworQ0lOREVYX0xJTktBR0UgY29uc3QgY2hhciogY2xhbmdfRXZhbFJlc3VsdF9nZXRBc1N0cihDWEV2YWxSZXN1bHQgRSk7CisKKy8qKgorICogXGJyaWVmIERpc3Bvc2VzIHRoZSBjcmVhdGVkIEV2YWwgbWVtb3J5LgorICovCitDSU5ERVhfTElOS0FHRSB2b2lkIGNsYW5nX0V2YWxSZXN1bHRfZGlzcG9zZShDWEV2YWxSZXN1bHQgRSk7CisvKioKKyAqIEB9CisgKi8KKworLyoqIFxkZWZncm91cCBDSU5ERVhfUkVNQVBQSU5HIFJlbWFwcGluZyBmdW5jdGlvbnMKKyAqCisgKiBAeworICovCisKKy8qKgorICogXGJyaWVmIEEgcmVtYXBwaW5nIG9mIG9yaWdpbmFsIHNvdXJjZSBmaWxlcyBhbmQgdGhlaXIgdHJhbnNsYXRlZCBmaWxlcy4KKyAqLwordHlwZWRlZiB2b2lkICpDWFJlbWFwcGluZzsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgYSByZW1hcHBpbmcuCisgKgorICogXHBhcmFtIHBhdGggdGhlIHBhdGggdGhhdCBjb250YWlucyBtZXRhZGF0YSBhYm91dCByZW1hcHBpbmdzLgorICoKKyAqIFxyZXR1cm5zIHRoZSByZXF1ZXN0ZWQgcmVtYXBwaW5nLiBUaGlzIHJlbWFwcGluZyBtdXN0IGJlIGZyZWVkCisgKiB2aWEgYSBjYWxsIHRvIFxjIGNsYW5nX3JlbWFwX2Rpc3Bvc2UoKS4gQ2FuIHJldHVybiBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitDSU5ERVhfTElOS0FHRSBDWFJlbWFwcGluZyBjbGFuZ19nZXRSZW1hcHBpbmdzKGNvbnN0IGNoYXIgKnBhdGgpOworCisvKioKKyAqIFxicmllZiBSZXRyaWV2ZSBhIHJlbWFwcGluZy4KKyAqCisgKiBccGFyYW0gZmlsZVBhdGhzIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZmlsZSBwYXRocyBjb250YWluaW5nIHJlbWFwcGluZyBpbmZvLgorICoKKyAqIFxwYXJhbSBudW1GaWxlcyBudW1iZXIgb2YgZmlsZSBwYXRocy4KKyAqCisgKiBccmV0dXJucyB0aGUgcmVxdWVzdGVkIHJlbWFwcGluZy4gVGhpcyByZW1hcHBpbmcgbXVzdCBiZSBmcmVlZAorICogdmlhIGEgY2FsbCB0byBcYyBjbGFuZ19yZW1hcF9kaXNwb3NlKCkuIENhbiByZXR1cm4gTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworQ0lOREVYX0xJTktBR0UKK0NYUmVtYXBwaW5nIGNsYW5nX2dldFJlbWFwcGluZ3NGcm9tRmlsZUxpc3QoY29uc3QgY2hhciAqKmZpbGVQYXRocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtRmlsZXMpOworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiByZW1hcHBpbmdzLgorICovCitDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19yZW1hcF9nZXROdW1GaWxlcyhDWFJlbWFwcGluZyk7CisKKy8qKgorICogXGJyaWVmIEdldCB0aGUgb3JpZ2luYWwgYW5kIHRoZSBhc3NvY2lhdGVkIGZpbGVuYW1lIGZyb20gdGhlIHJlbWFwcGluZy4KKyAqIAorICogXHBhcmFtIG9yaWdpbmFsIElmIG5vbi1OVUxMLCB3aWxsIGJlIHNldCB0byB0aGUgb3JpZ2luYWwgZmlsZW5hbWUuCisgKgorICogXHBhcmFtIHRyYW5zZm9ybWVkIElmIG5vbi1OVUxMLCB3aWxsIGJlIHNldCB0byB0aGUgZmlsZW5hbWUgdGhhdCB0aGUgb3JpZ2luYWwKKyAqIGlzIGFzc29jaWF0ZWQgd2l0aC4KKyAqLworQ0lOREVYX0xJTktBR0Ugdm9pZCBjbGFuZ19yZW1hcF9nZXRGaWxlbmFtZXMoQ1hSZW1hcHBpbmcsIHVuc2lnbmVkIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYU3RyaW5nICpvcmlnaW5hbCwgQ1hTdHJpbmcgKnRyYW5zZm9ybWVkKTsKKworLyoqCisgKiBcYnJpZWYgRGlzcG9zZSB0aGUgcmVtYXBwaW5nLgorICovCitDSU5ERVhfTElOS0FHRSB2b2lkIGNsYW5nX3JlbWFwX2Rpc3Bvc2UoQ1hSZW1hcHBpbmcpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqIFxkZWZncm91cCBDSU5ERVhfSElHSCBIaWdoZXIgbGV2ZWwgQVBJIGZ1bmN0aW9ucworICoKKyAqIEB7CisgKi8KKworZW51bSBDWFZpc2l0b3JSZXN1bHQgeworICBDWFZpc2l0X0JyZWFrLAorICBDWFZpc2l0X0NvbnRpbnVlCit9OworCit0eXBlZGVmIHN0cnVjdCBDWEN1cnNvckFuZFJhbmdlVmlzaXRvciB7CisgIHZvaWQgKmNvbnRleHQ7CisgIGVudW0gQ1hWaXNpdG9yUmVzdWx0ICgqdmlzaXQpKHZvaWQgKmNvbnRleHQsIENYQ3Vyc29yLCBDWFNvdXJjZVJhbmdlKTsKK30gQ1hDdXJzb3JBbmRSYW5nZVZpc2l0b3I7CisKK3R5cGVkZWYgZW51bSB7CisgIC8qKgorICAgKiBcYnJpZWYgRnVuY3Rpb24gcmV0dXJuZWQgc3VjY2Vzc2Z1bGx5LgorICAgKi8KKyAgQ1hSZXN1bHRfU3VjY2VzcyA9IDAsCisgIC8qKgorICAgKiBcYnJpZWYgT25lIG9mIHRoZSBwYXJhbWV0ZXJzIHdhcyBpbnZhbGlkIGZvciB0aGUgZnVuY3Rpb24uCisgICAqLworICBDWFJlc3VsdF9JbnZhbGlkID0gMSwKKyAgLyoqCisgICAqIFxicmllZiBUaGUgZnVuY3Rpb24gd2FzIHRlcm1pbmF0ZWQgYnkgYSBjYWxsYmFjayAoZS5nLiBpdCByZXR1cm5lZAorICAgKiBDWFZpc2l0X0JyZWFrKQorICAgKi8KKyAgQ1hSZXN1bHRfVmlzaXRCcmVhayA9IDIKKworfSBDWFJlc3VsdDsKKworLyoqCisgKiBcYnJpZWYgRmluZCByZWZlcmVuY2VzIG9mIGEgZGVjbGFyYXRpb24gaW4gYSBzcGVjaWZpYyBmaWxlLgorICogCisgKiBccGFyYW0gY3Vyc29yIHBvaW50aW5nIHRvIGEgZGVjbGFyYXRpb24gb3IgYSByZWZlcmVuY2Ugb2Ygb25lLgorICoKKyAqIFxwYXJhbSBmaWxlIHRvIHNlYXJjaCBmb3IgcmVmZXJlbmNlcy4KKyAqCisgKiBccGFyYW0gdmlzaXRvciBjYWxsYmFjayB0aGF0IHdpbGwgcmVjZWl2ZSBwYWlycyBvZiBDWEN1cnNvci9DWFNvdXJjZVJhbmdlIGZvcgorICogZWFjaCByZWZlcmVuY2UgZm91bmQuCisgKiBUaGUgQ1hTb3VyY2VSYW5nZSB3aWxsIHBvaW50IGluc2lkZSB0aGUgZmlsZTsgaWYgdGhlIHJlZmVyZW5jZSBpcyBpbnNpZGUKKyAqIGEgbWFjcm8gKGFuZCBub3QgYSBtYWNybyBhcmd1bWVudCkgdGhlIENYU291cmNlUmFuZ2Ugd2lsbCBiZSBpbnZhbGlkLgorICoKKyAqIFxyZXR1cm5zIG9uZSBvZiB0aGUgQ1hSZXN1bHQgZW51bWVyYXRvcnMuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYUmVzdWx0IGNsYW5nX2ZpbmRSZWZlcmVuY2VzSW5GaWxlKENYQ3Vyc29yIGN1cnNvciwgQ1hGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYQ3Vyc29yQW5kUmFuZ2VWaXNpdG9yIHZpc2l0b3IpOworCisvKioKKyAqIFxicmllZiBGaW5kICNpbXBvcnQvI2luY2x1ZGUgZGlyZWN0aXZlcyBpbiBhIHNwZWNpZmljIGZpbGUuCisgKgorICogXHBhcmFtIFRVIHRyYW5zbGF0aW9uIHVuaXQgY29udGFpbmluZyB0aGUgZmlsZSB0byBxdWVyeS4KKyAqCisgKiBccGFyYW0gZmlsZSB0byBzZWFyY2ggZm9yICNpbXBvcnQvI2luY2x1ZGUgZGlyZWN0aXZlcy4KKyAqCisgKiBccGFyYW0gdmlzaXRvciBjYWxsYmFjayB0aGF0IHdpbGwgcmVjZWl2ZSBwYWlycyBvZiBDWEN1cnNvci9DWFNvdXJjZVJhbmdlIGZvcgorICogZWFjaCBkaXJlY3RpdmUgZm91bmQuCisgKgorICogXHJldHVybnMgb25lIG9mIHRoZSBDWFJlc3VsdCBlbnVtZXJhdG9ycy4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hSZXN1bHQgY2xhbmdfZmluZEluY2x1ZGVzSW5GaWxlKENYVHJhbnNsYXRpb25Vbml0IFRVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYQ3Vyc29yQW5kUmFuZ2VWaXNpdG9yIHZpc2l0b3IpOworCisjaWZkZWYgX19oYXNfZmVhdHVyZQorIyAgaWYgX19oYXNfZmVhdHVyZShibG9ja3MpCisKK3R5cGVkZWYgZW51bSBDWFZpc2l0b3JSZXN1bHQKKyAgICAoXkNYQ3Vyc29yQW5kUmFuZ2VWaXNpdG9yQmxvY2spKENYQ3Vyc29yLCBDWFNvdXJjZVJhbmdlKTsKKworQ0lOREVYX0xJTktBR0UKK0NYUmVzdWx0IGNsYW5nX2ZpbmRSZWZlcmVuY2VzSW5GaWxlV2l0aEJsb2NrKENYQ3Vyc29yLCBDWEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEN1cnNvckFuZFJhbmdlVmlzaXRvckJsb2NrKTsKKworQ0lOREVYX0xJTktBR0UKK0NYUmVzdWx0IGNsYW5nX2ZpbmRJbmNsdWRlc0luRmlsZVdpdGhCbG9jayhDWFRyYW5zbGF0aW9uVW5pdCwgQ1hGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYQ3Vyc29yQW5kUmFuZ2VWaXNpdG9yQmxvY2spOworCisjICBlbmRpZgorI2VuZGlmCisKKy8qKgorICogXGJyaWVmIFRoZSBjbGllbnQncyBkYXRhIG9iamVjdCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIENYRmlsZS4KKyAqLwordHlwZWRlZiB2b2lkICpDWElkeENsaWVudEZpbGU7CisKKy8qKgorICogXGJyaWVmIFRoZSBjbGllbnQncyBkYXRhIG9iamVjdCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHNlbWFudGljIGVudGl0eS4KKyAqLwordHlwZWRlZiB2b2lkICpDWElkeENsaWVudEVudGl0eTsKKworLyoqCisgKiBcYnJpZWYgVGhlIGNsaWVudCdzIGRhdGEgb2JqZWN0IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgc2VtYW50aWMgY29udGFpbmVyCisgKiBvZiBlbnRpdGllcy4KKyAqLwordHlwZWRlZiB2b2lkICpDWElkeENsaWVudENvbnRhaW5lcjsKKworLyoqCisgKiBcYnJpZWYgVGhlIGNsaWVudCdzIGRhdGEgb2JqZWN0IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIEFTVCBmaWxlIChQQ0gKKyAqIG9yIG1vZHVsZSkuCisgKi8KK3R5cGVkZWYgdm9pZCAqQ1hJZHhDbGllbnRBU1RGaWxlOworCisvKioKKyAqIFxicmllZiBTb3VyY2UgbG9jYXRpb24gcGFzc2VkIHRvIGluZGV4IGNhbGxiYWNrcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB2b2lkICpwdHJfZGF0YVsyXTsKKyAgdW5zaWduZWQgaW50X2RhdGE7Cit9IENYSWR4TG9jOworCisvKioKKyAqIFxicmllZiBEYXRhIGZvciBwcEluY2x1ZGVkRmlsZSBjYWxsYmFjay4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAvKioKKyAgICogXGJyaWVmIExvY2F0aW9uIG9mICcjJyBpbiB0aGUgXCNpbmNsdWRlL1wjaW1wb3J0IGRpcmVjdGl2ZS4KKyAgICovCisgIENYSWR4TG9jIGhhc2hMb2M7CisgIC8qKgorICAgKiBcYnJpZWYgRmlsZW5hbWUgYXMgd3JpdHRlbiBpbiB0aGUgXCNpbmNsdWRlL1wjaW1wb3J0IGRpcmVjdGl2ZS4KKyAgICovCisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICAvKioKKyAgICogXGJyaWVmIFRoZSBhY3R1YWwgZmlsZSB0aGF0IHRoZSBcI2luY2x1ZGUvXCNpbXBvcnQgZGlyZWN0aXZlIHJlc29sdmVkIHRvLgorICAgKi8KKyAgQ1hGaWxlIGZpbGU7CisgIGludCBpc0ltcG9ydDsKKyAgaW50IGlzQW5nbGVkOworICAvKioKKyAgICogXGJyaWVmIE5vbi16ZXJvIGlmIHRoZSBkaXJlY3RpdmUgd2FzIGF1dG9tYXRpY2FsbHkgdHVybmVkIGludG8gYSBtb2R1bGUKKyAgICogaW1wb3J0LgorICAgKi8KKyAgaW50IGlzTW9kdWxlSW1wb3J0OworfSBDWElkeEluY2x1ZGVkRmlsZUluZm87CisKKy8qKgorICogXGJyaWVmIERhdGEgZm9yIEluZGV4ZXJDYWxsYmFja3MjaW1wb3J0ZWRBU1RGaWxlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qKgorICAgKiBcYnJpZWYgVG9wIGxldmVsIEFTVCBmaWxlIGNvbnRhaW5pbmcgdGhlIGltcG9ydGVkIFBDSCwgbW9kdWxlIG9yIHN1Ym1vZHVsZS4KKyAgICovCisgIENYRmlsZSBmaWxlOworICAvKioKKyAgICogXGJyaWVmIFRoZSBpbXBvcnRlZCBtb2R1bGUgb3IgTlVMTCBpZiB0aGUgQVNUIGZpbGUgaXMgYSBQQ0guCisgICAqLworICBDWE1vZHVsZSBtb2R1bGU7CisgIC8qKgorICAgKiBcYnJpZWYgTG9jYXRpb24gd2hlcmUgdGhlIGZpbGUgaXMgaW1wb3J0ZWQuIEFwcGxpY2FibGUgb25seSBmb3IgbW9kdWxlcy4KKyAgICovCisgIENYSWR4TG9jIGxvYzsKKyAgLyoqCisgICAqIFxicmllZiBOb24temVybyBpZiBhbiBpbmNsdXNpb24gZGlyZWN0aXZlIHdhcyBhdXRvbWF0aWNhbGx5IHR1cm5lZCBpbnRvCisgICAqIGEgbW9kdWxlIGltcG9ydC4gQXBwbGljYWJsZSBvbmx5IGZvciBtb2R1bGVzLgorICAgKi8KKyAgaW50IGlzSW1wbGljaXQ7CisKK30gQ1hJZHhJbXBvcnRlZEFTVEZpbGVJbmZvOworCit0eXBlZGVmIGVudW0geworICBDWElkeEVudGl0eV9VbmV4cG9zZWQgICAgID0gMCwKKyAgQ1hJZHhFbnRpdHlfVHlwZWRlZiAgICAgICA9IDEsCisgIENYSWR4RW50aXR5X0Z1bmN0aW9uICAgICAgPSAyLAorICBDWElkeEVudGl0eV9WYXJpYWJsZSAgICAgID0gMywKKyAgQ1hJZHhFbnRpdHlfRmllbGQgICAgICAgICA9IDQsCisgIENYSWR4RW50aXR5X0VudW1Db25zdGFudCAgPSA1LAorCisgIENYSWR4RW50aXR5X09iakNDbGFzcyAgICAgPSA2LAorICBDWElkeEVudGl0eV9PYmpDUHJvdG9jb2wgID0gNywKKyAgQ1hJZHhFbnRpdHlfT2JqQ0NhdGVnb3J5ICA9IDgsCisKKyAgQ1hJZHhFbnRpdHlfT2JqQ0luc3RhbmNlTWV0aG9kID0gOSwKKyAgQ1hJZHhFbnRpdHlfT2JqQ0NsYXNzTWV0aG9kICAgID0gMTAsCisgIENYSWR4RW50aXR5X09iakNQcm9wZXJ0eSAgPSAxMSwKKyAgQ1hJZHhFbnRpdHlfT2JqQ0l2YXIgICAgICA9IDEyLAorCisgIENYSWR4RW50aXR5X0VudW0gICAgICAgICAgPSAxMywKKyAgQ1hJZHhFbnRpdHlfU3RydWN0ICAgICAgICA9IDE0LAorICBDWElkeEVudGl0eV9VbmlvbiAgICAgICAgID0gMTUsCisKKyAgQ1hJZHhFbnRpdHlfQ1hYQ2xhc3MgICAgICAgICAgICAgID0gMTYsCisgIENYSWR4RW50aXR5X0NYWE5hbWVzcGFjZSAgICAgICAgICA9IDE3LAorICBDWElkeEVudGl0eV9DWFhOYW1lc3BhY2VBbGlhcyAgICAgPSAxOCwKKyAgQ1hJZHhFbnRpdHlfQ1hYU3RhdGljVmFyaWFibGUgICAgID0gMTksCisgIENYSWR4RW50aXR5X0NYWFN0YXRpY01ldGhvZCAgICAgICA9IDIwLAorICBDWElkeEVudGl0eV9DWFhJbnN0YW5jZU1ldGhvZCAgICAgPSAyMSwKKyAgQ1hJZHhFbnRpdHlfQ1hYQ29uc3RydWN0b3IgICAgICAgID0gMjIsCisgIENYSWR4RW50aXR5X0NYWERlc3RydWN0b3IgICAgICAgICA9IDIzLAorICBDWElkeEVudGl0eV9DWFhDb252ZXJzaW9uRnVuY3Rpb24gPSAyNCwKKyAgQ1hJZHhFbnRpdHlfQ1hYVHlwZUFsaWFzICAgICAgICAgID0gMjUsCisgIENYSWR4RW50aXR5X0NYWEludGVyZmFjZSAgICAgICAgICA9IDI2CisKK30gQ1hJZHhFbnRpdHlLaW5kOworCit0eXBlZGVmIGVudW0geworICBDWElkeEVudGl0eUxhbmdfTm9uZSA9IDAsCisgIENYSWR4RW50aXR5TGFuZ19DICAgID0gMSwKKyAgQ1hJZHhFbnRpdHlMYW5nX09iakMgPSAyLAorICBDWElkeEVudGl0eUxhbmdfQ1hYICA9IDMsCisgIENYSWR4RW50aXR5TGFuZ19Td2lmdCAgPSA0Cit9IENYSWR4RW50aXR5TGFuZ3VhZ2U7CisKKy8qKgorICogXGJyaWVmIEV4dHJhIEMrKyB0ZW1wbGF0ZSBpbmZvcm1hdGlvbiBmb3IgYW4gZW50aXR5LiBUaGlzIGNhbiBhcHBseSB0bzoKKyAqIENYSWR4RW50aXR5X0Z1bmN0aW9uCisgKiBDWElkeEVudGl0eV9DWFhDbGFzcworICogQ1hJZHhFbnRpdHlfQ1hYU3RhdGljTWV0aG9kCisgKiBDWElkeEVudGl0eV9DWFhJbnN0YW5jZU1ldGhvZAorICogQ1hJZHhFbnRpdHlfQ1hYQ29uc3RydWN0b3IKKyAqIENYSWR4RW50aXR5X0NYWENvbnZlcnNpb25GdW5jdGlvbgorICogQ1hJZHhFbnRpdHlfQ1hYVHlwZUFsaWFzCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIENYSWR4RW50aXR5X05vblRlbXBsYXRlICAgPSAwLAorICBDWElkeEVudGl0eV9UZW1wbGF0ZSAgICAgID0gMSwKKyAgQ1hJZHhFbnRpdHlfVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb24gPSAyLAorICBDWElkeEVudGl0eV9UZW1wbGF0ZVNwZWNpYWxpemF0aW9uID0gMworfSBDWElkeEVudGl0eUNYWFRlbXBsYXRlS2luZDsKKwordHlwZWRlZiBlbnVtIHsKKyAgQ1hJZHhBdHRyX1VuZXhwb3NlZCAgICAgPSAwLAorICBDWElkeEF0dHJfSUJBY3Rpb24gICAgICA9IDEsCisgIENYSWR4QXR0cl9JQk91dGxldCAgICAgID0gMiwKKyAgQ1hJZHhBdHRyX0lCT3V0bGV0Q29sbGVjdGlvbiA9IDMKK30gQ1hJZHhBdHRyS2luZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBDWElkeEF0dHJLaW5kIGtpbmQ7CisgIENYQ3Vyc29yIGN1cnNvcjsKKyAgQ1hJZHhMb2MgbG9jOworfSBDWElkeEF0dHJJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisgIENYSWR4RW50aXR5S2luZCBraW5kOworICBDWElkeEVudGl0eUNYWFRlbXBsYXRlS2luZCB0ZW1wbGF0ZUtpbmQ7CisgIENYSWR4RW50aXR5TGFuZ3VhZ2UgbGFuZzsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY29uc3QgY2hhciAqVVNSOworICBDWEN1cnNvciBjdXJzb3I7CisgIGNvbnN0IENYSWR4QXR0ckluZm8gKmNvbnN0ICphdHRyaWJ1dGVzOworICB1bnNpZ25lZCBudW1BdHRyaWJ1dGVzOworfSBDWElkeEVudGl0eUluZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgQ1hDdXJzb3IgY3Vyc29yOworfSBDWElkeENvbnRhaW5lckluZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgQ1hJZHhBdHRySW5mbyAqYXR0ckluZm87CisgIGNvbnN0IENYSWR4RW50aXR5SW5mbyAqb2JqY0NsYXNzOworICBDWEN1cnNvciBjbGFzc0N1cnNvcjsKKyAgQ1hJZHhMb2MgY2xhc3NMb2M7Cit9IENYSWR4SUJPdXRsZXRDb2xsZWN0aW9uQXR0ckluZm87CisKK3R5cGVkZWYgZW51bSB7CisgIENYSWR4RGVjbEZsYWdfU2tpcHBlZCA9IDB4MQorfSBDWElkeERlY2xJbmZvRmxhZ3M7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgQ1hJZHhFbnRpdHlJbmZvICplbnRpdHlJbmZvOworICBDWEN1cnNvciBjdXJzb3I7CisgIENYSWR4TG9jIGxvYzsKKyAgY29uc3QgQ1hJZHhDb250YWluZXJJbmZvICpzZW1hbnRpY0NvbnRhaW5lcjsKKyAgLyoqCisgICAqIFxicmllZiBHZW5lcmFsbHkgc2FtZSBhcyAjc2VtYW50aWNDb250YWluZXIgYnV0IGNhbiBiZSBkaWZmZXJlbnQgaW4KKyAgICogY2FzZXMgbGlrZSBvdXQtb2YtbGluZSBDKysgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgICovCisgIGNvbnN0IENYSWR4Q29udGFpbmVySW5mbyAqbGV4aWNhbENvbnRhaW5lcjsKKyAgaW50IGlzUmVkZWNsYXJhdGlvbjsKKyAgaW50IGlzRGVmaW5pdGlvbjsKKyAgaW50IGlzQ29udGFpbmVyOworICBjb25zdCBDWElkeENvbnRhaW5lckluZm8gKmRlY2xBc0NvbnRhaW5lcjsKKyAgLyoqCisgICAqIFxicmllZiBXaGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBleGlzdHMgaW4gY29kZSBvciB3YXMgY3JlYXRlZCBpbXBsaWNpdGx5CisgICAqIGJ5IHRoZSBjb21waWxlciwgZS5nLiBpbXBsaWNpdCBPYmplY3RpdmUtQyBtZXRob2RzIGZvciBwcm9wZXJ0aWVzLgorICAgKi8KKyAgaW50IGlzSW1wbGljaXQ7CisgIGNvbnN0IENYSWR4QXR0ckluZm8gKmNvbnN0ICphdHRyaWJ1dGVzOworICB1bnNpZ25lZCBudW1BdHRyaWJ1dGVzOworCisgIHVuc2lnbmVkIGZsYWdzOworCit9IENYSWR4RGVjbEluZm87CisKK3R5cGVkZWYgZW51bSB7CisgIENYSWR4T2JqQ0NvbnRhaW5lcl9Gb3J3YXJkUmVmID0gMCwKKyAgQ1hJZHhPYmpDQ29udGFpbmVyX0ludGVyZmFjZSA9IDEsCisgIENYSWR4T2JqQ0NvbnRhaW5lcl9JbXBsZW1lbnRhdGlvbiA9IDIKK30gQ1hJZHhPYmpDQ29udGFpbmVyS2luZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBDWElkeERlY2xJbmZvICpkZWNsSW5mbzsKKyAgQ1hJZHhPYmpDQ29udGFpbmVyS2luZCBraW5kOworfSBDWElkeE9iakNDb250YWluZXJEZWNsSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBDWElkeEVudGl0eUluZm8gKmJhc2U7CisgIENYQ3Vyc29yIGN1cnNvcjsKKyAgQ1hJZHhMb2MgbG9jOworfSBDWElkeEJhc2VDbGFzc0luZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgQ1hJZHhFbnRpdHlJbmZvICpwcm90b2NvbDsKKyAgQ1hDdXJzb3IgY3Vyc29yOworICBDWElkeExvYyBsb2M7Cit9IENYSWR4T2JqQ1Byb3RvY29sUmVmSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBDWElkeE9iakNQcm90b2NvbFJlZkluZm8gKmNvbnN0ICpwcm90b2NvbHM7CisgIHVuc2lnbmVkIG51bVByb3RvY29sczsKK30gQ1hJZHhPYmpDUHJvdG9jb2xSZWZMaXN0SW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBDWElkeE9iakNDb250YWluZXJEZWNsSW5mbyAqY29udGFpbmVySW5mbzsKKyAgY29uc3QgQ1hJZHhCYXNlQ2xhc3NJbmZvICpzdXBlckluZm87CisgIGNvbnN0IENYSWR4T2JqQ1Byb3RvY29sUmVmTGlzdEluZm8gKnByb3RvY29sczsKK30gQ1hJZHhPYmpDSW50ZXJmYWNlRGVjbEluZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgQ1hJZHhPYmpDQ29udGFpbmVyRGVjbEluZm8gKmNvbnRhaW5lckluZm87CisgIGNvbnN0IENYSWR4RW50aXR5SW5mbyAqb2JqY0NsYXNzOworICBDWEN1cnNvciBjbGFzc0N1cnNvcjsKKyAgQ1hJZHhMb2MgY2xhc3NMb2M7CisgIGNvbnN0IENYSWR4T2JqQ1Byb3RvY29sUmVmTGlzdEluZm8gKnByb3RvY29sczsKK30gQ1hJZHhPYmpDQ2F0ZWdvcnlEZWNsSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBDWElkeERlY2xJbmZvICpkZWNsSW5mbzsKKyAgY29uc3QgQ1hJZHhFbnRpdHlJbmZvICpnZXR0ZXI7CisgIGNvbnN0IENYSWR4RW50aXR5SW5mbyAqc2V0dGVyOworfSBDWElkeE9iakNQcm9wZXJ0eURlY2xJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IENYSWR4RGVjbEluZm8gKmRlY2xJbmZvOworICBjb25zdCBDWElkeEJhc2VDbGFzc0luZm8gKmNvbnN0ICpiYXNlczsKKyAgdW5zaWduZWQgbnVtQmFzZXM7Cit9IENYSWR4Q1hYQ2xhc3NEZWNsSW5mbzsKKworLyoqCisgKiBcYnJpZWYgRGF0YSBmb3IgSW5kZXhlckNhbGxiYWNrcyNpbmRleEVudGl0eVJlZmVyZW5jZS4KKyAqCisgKiBUaGlzIG1heSBiZSBkZXByZWNhdGVkIGluIGEgZnV0dXJlIHZlcnNpb24gYXMgdGhpcyBkdXBsaWNhdGVzCisgKiB0aGUgXGMgQ1hTeW1ib2xSb2xlX0ltcGxpY2l0IGJpdCBpbiBcYyBDWFN5bWJvbFJvbGUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIC8qKgorICAgKiBcYnJpZWYgVGhlIGVudGl0eSBpcyByZWZlcmVuY2VkIGRpcmVjdGx5IGluIHVzZXIncyBjb2RlLgorICAgKi8KKyAgQ1hJZHhFbnRpdHlSZWZfRGlyZWN0ID0gMSwKKyAgLyoqCisgICAqIFxicmllZiBBbiBpbXBsaWNpdCByZWZlcmVuY2UsIGUuZy4gYSByZWZlcmVuY2Ugb2YgYW4gT2JqZWN0aXZlLUMgbWV0aG9kCisgICAqIHZpYSB0aGUgZG90IHN5bnRheC4KKyAgICovCisgIENYSWR4RW50aXR5UmVmX0ltcGxpY2l0ID0gMgorfSBDWElkeEVudGl0eVJlZktpbmQ7CisKKy8qKgorICogXGJyaWVmIFJvbGVzIHRoYXQgYXJlIGF0dHJpYnV0ZWQgdG8gc3ltYm9sIG9jY3VycmVuY2VzLgorICoKKyAqIEludGVybmFsOiB0aGlzIGN1cnJlbnRseSBtaXJyb3JzIGxvdyA5IGJpdHMgb2YgY2xhbmc6OmluZGV4OjpTeW1ib2xSb2xlIHdpdGgKKyAqIGhpZ2hlciBiaXRzIHplcm9lZC4gVGhlc2UgaGlnaCBiaXRzIG1heSBiZSBleHBvc2VkIGluIHRoZSBmdXR1cmUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIENYU3ltYm9sUm9sZV9Ob25lID0gMCwKKyAgQ1hTeW1ib2xSb2xlX0RlY2xhcmF0aW9uID0gMSA8PCAwLAorICBDWFN5bWJvbFJvbGVfRGVmaW5pdGlvbiA9IDEgPDwgMSwKKyAgQ1hTeW1ib2xSb2xlX1JlZmVyZW5jZSA9IDEgPDwgMiwKKyAgQ1hTeW1ib2xSb2xlX1JlYWQgPSAxIDw8IDMsCisgIENYU3ltYm9sUm9sZV9Xcml0ZSA9IDEgPDwgNCwKKyAgQ1hTeW1ib2xSb2xlX0NhbGwgPSAxIDw8IDUsCisgIENYU3ltYm9sUm9sZV9EeW5hbWljID0gMSA8PCA2LAorICBDWFN5bWJvbFJvbGVfQWRkcmVzc09mID0gMSA8PCA3LAorICBDWFN5bWJvbFJvbGVfSW1wbGljaXQgPSAxIDw8IDgKK30gQ1hTeW1ib2xSb2xlOworCisvKioKKyAqIFxicmllZiBEYXRhIGZvciBJbmRleGVyQ2FsbGJhY2tzI2luZGV4RW50aXR5UmVmZXJlbmNlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIENYSWR4RW50aXR5UmVmS2luZCBraW5kOworICAvKioKKyAgICogXGJyaWVmIFJlZmVyZW5jZSBjdXJzb3IuCisgICAqLworICBDWEN1cnNvciBjdXJzb3I7CisgIENYSWR4TG9jIGxvYzsKKyAgLyoqCisgICAqIFxicmllZiBUaGUgZW50aXR5IHRoYXQgZ2V0cyByZWZlcmVuY2VkLgorICAgKi8KKyAgY29uc3QgQ1hJZHhFbnRpdHlJbmZvICpyZWZlcmVuY2VkRW50aXR5OworICAvKioKKyAgICogXGJyaWVmIEltbWVkaWF0ZSAicGFyZW50IiBvZiB0aGUgcmVmZXJlbmNlLiBGb3IgZXhhbXBsZToKKyAgICogCisgICAqIFxjb2RlCisgICAqIEZvbyAqdmFyOworICAgKiBcZW5kY29kZQorICAgKiAKKyAgICogVGhlIHBhcmVudCBvZiByZWZlcmVuY2Ugb2YgdHlwZSAnRm9vJyBpcyB0aGUgdmFyaWFibGUgJ3ZhcicuCisgICAqIEZvciByZWZlcmVuY2VzIGluc2lkZSBzdGF0ZW1lbnQgYm9kaWVzIG9mIGZ1bmN0aW9ucy9tZXRob2RzLAorICAgKiB0aGUgcGFyZW50RW50aXR5IHdpbGwgYmUgdGhlIGZ1bmN0aW9uL21ldGhvZC4KKyAgICovCisgIGNvbnN0IENYSWR4RW50aXR5SW5mbyAqcGFyZW50RW50aXR5OworICAvKioKKyAgICogXGJyaWVmIExleGljYWwgY29udGFpbmVyIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jZS4KKyAgICovCisgIGNvbnN0IENYSWR4Q29udGFpbmVySW5mbyAqY29udGFpbmVyOworICAvKioKKyAgICogXGJyaWVmIFNldHMgb2Ygc3ltYm9sIHJvbGVzIG9mIHRoZSByZWZlcmVuY2UuCisgICAqLworICBDWFN5bWJvbFJvbGUgcm9sZTsKK30gQ1hJZHhFbnRpdHlSZWZJbmZvOworCisvKioKKyAqIFxicmllZiBBIGdyb3VwIG9mIGNhbGxiYWNrcyB1c2VkIGJ5ICNjbGFuZ19pbmRleFNvdXJjZUZpbGUgYW5kCisgKiAjY2xhbmdfaW5kZXhUcmFuc2xhdGlvblVuaXQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgLyoqCisgICAqIFxicmllZiBDYWxsZWQgcGVyaW9kaWNhbGx5IHRvIGNoZWNrIHdoZXRoZXIgaW5kZXhpbmcgc2hvdWxkIGJlIGFib3J0ZWQuCisgICAqIFNob3VsZCByZXR1cm4gMCB0byBjb250aW51ZSwgYW5kIG5vbi16ZXJvIHRvIGFib3J0LgorICAgKi8KKyAgaW50ICgqYWJvcnRRdWVyeSkoQ1hDbGllbnREYXRhIGNsaWVudF9kYXRhLCB2b2lkICpyZXNlcnZlZCk7CisKKyAgLyoqCisgICAqIFxicmllZiBDYWxsZWQgYXQgdGhlIGVuZCBvZiBpbmRleGluZzsgcGFzc2VzIHRoZSBjb21wbGV0ZSBkaWFnbm9zdGljIHNldC4KKyAgICovCisgIHZvaWQgKCpkaWFnbm9zdGljKShDWENsaWVudERhdGEgY2xpZW50X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICBDWERpYWdub3N0aWNTZXQsIHZvaWQgKnJlc2VydmVkKTsKKworICBDWElkeENsaWVudEZpbGUgKCplbnRlcmVkTWFpbkZpbGUpKENYQ2xpZW50RGF0YSBjbGllbnRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZpbGUgbWFpbkZpbGUsIHZvaWQgKnJlc2VydmVkKTsKKyAgCisgIC8qKgorICAgKiBcYnJpZWYgQ2FsbGVkIHdoZW4gYSBmaWxlIGdldHMgXCNpbmNsdWRlZC9cI2ltcG9ydGVkLgorICAgKi8KKyAgQ1hJZHhDbGllbnRGaWxlICgqcHBJbmNsdWRlZEZpbGUpKENYQ2xpZW50RGF0YSBjbGllbnRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYSWR4SW5jbHVkZWRGaWxlSW5mbyAqKTsKKyAgCisgIC8qKgorICAgKiBcYnJpZWYgQ2FsbGVkIHdoZW4gYSBBU1QgZmlsZSAoUENIIG9yIG1vZHVsZSkgZ2V0cyBpbXBvcnRlZC4KKyAgICogCisgICAqIEFTVCBmaWxlcyB3aWxsIG5vdCBnZXQgaW5kZXhlZCAodGhlcmUgd2lsbCBub3QgYmUgY2FsbGJhY2tzIHRvIGluZGV4IGFsbAorICAgKiB0aGUgZW50aXRpZXMgaW4gYW4gQVNUIGZpbGUpLiBUaGUgcmVjb21tZW5kZWQgYWN0aW9uIGlzIHRoYXQsIGlmIHRoZSBBU1QKKyAgICogZmlsZSBpcyBub3QgYWxyZWFkeSBpbmRleGVkLCB0byBpbml0aWF0ZSBhIG5ldyBpbmRleGluZyBqb2Igc3BlY2lmaWMgdG8KKyAgICogdGhlIEFTVCBmaWxlLgorICAgKi8KKyAgQ1hJZHhDbGllbnRBU1RGaWxlICgqaW1wb3J0ZWRBU1RGaWxlKShDWENsaWVudERhdGEgY2xpZW50X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hJZHhJbXBvcnRlZEFTVEZpbGVJbmZvICopOworCisgIC8qKgorICAgKiBcYnJpZWYgQ2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgaW5kZXhpbmcgYSB0cmFuc2xhdGlvbiB1bml0LgorICAgKi8KKyAgQ1hJZHhDbGllbnRDb250YWluZXIgKCpzdGFydGVkVHJhbnNsYXRpb25Vbml0KShDWENsaWVudERhdGEgY2xpZW50X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVzZXJ2ZWQpOworCisgIHZvaWQgKCppbmRleERlY2xhcmF0aW9uKShDWENsaWVudERhdGEgY2xpZW50X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWElkeERlY2xJbmZvICopOworCisgIC8qKgorICAgKiBcYnJpZWYgQ2FsbGVkIHRvIGluZGV4IGEgcmVmZXJlbmNlIG9mIGFuIGVudGl0eS4KKyAgICovCisgIHZvaWQgKCppbmRleEVudGl0eVJlZmVyZW5jZSkoQ1hDbGllbnREYXRhIGNsaWVudF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYSWR4RW50aXR5UmVmSW5mbyAqKTsKKworfSBJbmRleGVyQ2FsbGJhY2tzOworCitDSU5ERVhfTElOS0FHRSBpbnQgY2xhbmdfaW5kZXhfaXNFbnRpdHlPYmpDQ29udGFpbmVyS2luZChDWElkeEVudGl0eUtpbmQpOworQ0lOREVYX0xJTktBR0UgY29uc3QgQ1hJZHhPYmpDQ29udGFpbmVyRGVjbEluZm8gKgorY2xhbmdfaW5kZXhfZ2V0T2JqQ0NvbnRhaW5lckRlY2xJbmZvKGNvbnN0IENYSWR4RGVjbEluZm8gKik7CisKK0NJTkRFWF9MSU5LQUdFIGNvbnN0IENYSWR4T2JqQ0ludGVyZmFjZURlY2xJbmZvICoKK2NsYW5nX2luZGV4X2dldE9iakNJbnRlcmZhY2VEZWNsSW5mbyhjb25zdCBDWElkeERlY2xJbmZvICopOworCitDSU5ERVhfTElOS0FHRQorY29uc3QgQ1hJZHhPYmpDQ2F0ZWdvcnlEZWNsSW5mbyAqCitjbGFuZ19pbmRleF9nZXRPYmpDQ2F0ZWdvcnlEZWNsSW5mbyhjb25zdCBDWElkeERlY2xJbmZvICopOworCitDSU5ERVhfTElOS0FHRSBjb25zdCBDWElkeE9iakNQcm90b2NvbFJlZkxpc3RJbmZvICoKK2NsYW5nX2luZGV4X2dldE9iakNQcm90b2NvbFJlZkxpc3RJbmZvKGNvbnN0IENYSWR4RGVjbEluZm8gKik7CisKK0NJTkRFWF9MSU5LQUdFIGNvbnN0IENYSWR4T2JqQ1Byb3BlcnR5RGVjbEluZm8gKgorY2xhbmdfaW5kZXhfZ2V0T2JqQ1Byb3BlcnR5RGVjbEluZm8oY29uc3QgQ1hJZHhEZWNsSW5mbyAqKTsKKworQ0lOREVYX0xJTktBR0UgY29uc3QgQ1hJZHhJQk91dGxldENvbGxlY3Rpb25BdHRySW5mbyAqCitjbGFuZ19pbmRleF9nZXRJQk91dGxldENvbGxlY3Rpb25BdHRySW5mbyhjb25zdCBDWElkeEF0dHJJbmZvICopOworCitDSU5ERVhfTElOS0FHRSBjb25zdCBDWElkeENYWENsYXNzRGVjbEluZm8gKgorY2xhbmdfaW5kZXhfZ2V0Q1hYQ2xhc3NEZWNsSW5mbyhjb25zdCBDWElkeERlY2xJbmZvICopOworCisvKioKKyAqIFxicmllZiBGb3IgcmV0cmlldmluZyBhIGN1c3RvbSBDWElkeENsaWVudENvbnRhaW5lciBhdHRhY2hlZCB0byBhCisgKiBjb250YWluZXIuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYSWR4Q2xpZW50Q29udGFpbmVyCitjbGFuZ19pbmRleF9nZXRDbGllbnRDb250YWluZXIoY29uc3QgQ1hJZHhDb250YWluZXJJbmZvICopOworCisvKioKKyAqIFxicmllZiBGb3Igc2V0dGluZyBhIGN1c3RvbSBDWElkeENsaWVudENvbnRhaW5lciBhdHRhY2hlZCB0byBhCisgKiBjb250YWluZXIuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHZvaWQKK2NsYW5nX2luZGV4X3NldENsaWVudENvbnRhaW5lcihjb25zdCBDWElkeENvbnRhaW5lckluZm8gKixDWElkeENsaWVudENvbnRhaW5lcik7CisKKy8qKgorICogXGJyaWVmIEZvciByZXRyaWV2aW5nIGEgY3VzdG9tIENYSWR4Q2xpZW50RW50aXR5IGF0dGFjaGVkIHRvIGFuIGVudGl0eS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hJZHhDbGllbnRFbnRpdHkKK2NsYW5nX2luZGV4X2dldENsaWVudEVudGl0eShjb25zdCBDWElkeEVudGl0eUluZm8gKik7CisKKy8qKgorICogXGJyaWVmIEZvciBzZXR0aW5nIGEgY3VzdG9tIENYSWR4Q2xpZW50RW50aXR5IGF0dGFjaGVkIHRvIGFuIGVudGl0eS4KKyAqLworQ0lOREVYX0xJTktBR0Ugdm9pZAorY2xhbmdfaW5kZXhfc2V0Q2xpZW50RW50aXR5KGNvbnN0IENYSWR4RW50aXR5SW5mbyAqLCBDWElkeENsaWVudEVudGl0eSk7CisKKy8qKgorICogXGJyaWVmIEFuIGluZGV4aW5nIGFjdGlvbi9zZXNzaW9uLCB0byBiZSBhcHBsaWVkIHRvIG9uZSBvciBtdWx0aXBsZQorICogdHJhbnNsYXRpb24gdW5pdHMuCisgKi8KK3R5cGVkZWYgdm9pZCAqQ1hJbmRleEFjdGlvbjsKKworLyoqCisgKiBcYnJpZWYgQW4gaW5kZXhpbmcgYWN0aW9uL3Nlc3Npb24sIHRvIGJlIGFwcGxpZWQgdG8gb25lIG9yIG11bHRpcGxlCisgKiB0cmFuc2xhdGlvbiB1bml0cy4KKyAqCisgKiBccGFyYW0gQ0lkeCBUaGUgaW5kZXggb2JqZWN0IHdpdGggd2hpY2ggdGhlIGluZGV4IGFjdGlvbiB3aWxsIGJlIGFzc29jaWF0ZWQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIENYSW5kZXhBY3Rpb24gY2xhbmdfSW5kZXhBY3Rpb25fY3JlYXRlKENYSW5kZXggQ0lkeCk7CisKKy8qKgorICogXGJyaWVmIERlc3Ryb3kgdGhlIGdpdmVuIGluZGV4IGFjdGlvbi4KKyAqCisgKiBUaGUgaW5kZXggYWN0aW9uIG11c3Qgbm90IGJlIGRlc3Ryb3llZCB1bnRpbCBhbGwgb2YgdGhlIHRyYW5zbGF0aW9uIHVuaXRzCisgKiBjcmVhdGVkIHdpdGhpbiB0aGF0IGluZGV4IGFjdGlvbiBoYXZlIGJlZW4gZGVzdHJveWVkLgorICovCitDSU5ERVhfTElOS0FHRSB2b2lkIGNsYW5nX0luZGV4QWN0aW9uX2Rpc3Bvc2UoQ1hJbmRleEFjdGlvbik7CisKK3R5cGVkZWYgZW51bSB7CisgIC8qKgorICAgKiBcYnJpZWYgVXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIHNwZWNpYWwgaW5kZXhpbmcgb3B0aW9ucyBhcmUgbmVlZGVkLgorICAgKi8KKyAgQ1hJbmRleE9wdF9Ob25lID0gMHgwLAorICAKKyAgLyoqCisgICAqIFxicmllZiBVc2VkIHRvIGluZGljYXRlIHRoYXQgSW5kZXhlckNhbGxiYWNrcyNpbmRleEVudGl0eVJlZmVyZW5jZSBzaG91bGQKKyAgICogYmUgaW52b2tlZCBmb3Igb25seSBvbmUgcmVmZXJlbmNlIG9mIGFuIGVudGl0eSBwZXIgc291cmNlIGZpbGUgdGhhdCBkb2VzCisgICAqIG5vdCBhbHNvIGluY2x1ZGUgYSBkZWNsYXJhdGlvbi9kZWZpbml0aW9uIG9mIHRoZSBlbnRpdHkuCisgICAqLworICBDWEluZGV4T3B0X1N1cHByZXNzUmVkdW5kYW50UmVmcyA9IDB4MSwKKworICAvKioKKyAgICogXGJyaWVmIEZ1bmN0aW9uLWxvY2FsIHN5bWJvbHMgc2hvdWxkIGJlIGluZGV4ZWQuIElmIHRoaXMgaXMgbm90IHNldAorICAgKiBmdW5jdGlvbi1sb2NhbCBzeW1ib2xzIHdpbGwgYmUgaWdub3JlZC4KKyAgICovCisgIENYSW5kZXhPcHRfSW5kZXhGdW5jdGlvbkxvY2FsU3ltYm9scyA9IDB4MiwKKworICAvKioKKyAgICogXGJyaWVmIEltcGxpY2l0IGZ1bmN0aW9uL2NsYXNzIHRlbXBsYXRlIGluc3RhbnRpYXRpb25zIHNob3VsZCBiZSBpbmRleGVkLgorICAgKiBJZiB0aGlzIGlzIG5vdCBzZXQsIGltcGxpY2l0IGluc3RhbnRpYXRpb25zIHdpbGwgYmUgaWdub3JlZC4KKyAgICovCisgIENYSW5kZXhPcHRfSW5kZXhJbXBsaWNpdFRlbXBsYXRlSW5zdGFudGlhdGlvbnMgPSAweDQsCisKKyAgLyoqCisgICAqIFxicmllZiBTdXBwcmVzcyBhbGwgY29tcGlsZXIgd2FybmluZ3Mgd2hlbiBwYXJzaW5nIGZvciBpbmRleGluZy4KKyAgICovCisgIENYSW5kZXhPcHRfU3VwcHJlc3NXYXJuaW5ncyA9IDB4OCwKKworICAvKioKKyAgICogXGJyaWVmIFNraXAgYSBmdW5jdGlvbi9tZXRob2QgYm9keSB0aGF0IHdhcyBhbHJlYWR5IHBhcnNlZCBkdXJpbmcgYW4KKyAgICogaW5kZXhpbmcgc2Vzc2lvbiBhc3NvY2lhdGVkIHdpdGggYSBcYyBDWEluZGV4QWN0aW9uIG9iamVjdC4KKyAgICogQm9kaWVzIGluIHN5c3RlbSBoZWFkZXJzIGFyZSBhbHdheXMgc2tpcHBlZC4KKyAgICovCisgIENYSW5kZXhPcHRfU2tpcFBhcnNlZEJvZGllc0luU2Vzc2lvbiA9IDB4MTAKKworfSBDWEluZGV4T3B0RmxhZ3M7CisKKy8qKgorICogXGJyaWVmIEluZGV4IHRoZSBnaXZlbiBzb3VyY2UgZmlsZSBhbmQgdGhlIHRyYW5zbGF0aW9uIHVuaXQgY29ycmVzcG9uZGluZworICogdG8gdGhhdCBmaWxlIHZpYSBjYWxsYmFja3MgaW1wbGVtZW50ZWQgdGhyb3VnaCAjSW5kZXhlckNhbGxiYWNrcy4KKyAqCisgKiBccGFyYW0gY2xpZW50X2RhdGEgcG9pbnRlciBkYXRhIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQsIHdoaWNoIHdpbGwKKyAqIGJlIHBhc3NlZCB0byB0aGUgaW52b2tlZCBjYWxsYmFja3MuCisgKgorICogXHBhcmFtIGluZGV4X2NhbGxiYWNrcyBQb2ludGVyIHRvIGluZGV4aW5nIGNhbGxiYWNrcyB0aGF0IHRoZSBjbGllbnQKKyAqIGltcGxlbWVudHMuCisgKgorICogXHBhcmFtIGluZGV4X2NhbGxiYWNrc19zaXplIFNpemUgb2YgI0luZGV4ZXJDYWxsYmFja3Mgc3RydWN0dXJlIHRoYXQgZ2V0cworICogcGFzc2VkIGluIGluZGV4X2NhbGxiYWNrcy4KKyAqCisgKiBccGFyYW0gaW5kZXhfb3B0aW9ucyBBIGJpdG1hc2sgb2Ygb3B0aW9ucyB0aGF0IGFmZmVjdHMgaG93IGluZGV4aW5nIGlzCisgKiBwZXJmb3JtZWQuIFRoaXMgc2hvdWxkIGJlIGEgYml0d2lzZSBPUiBvZiB0aGUgQ1hJbmRleE9wdF9YWFggZmxhZ3MuCisgKgorICogXHBhcmFtW291dF0gb3V0X1RVIHBvaW50ZXIgdG8gc3RvcmUgYSBcYyBDWFRyYW5zbGF0aW9uVW5pdCB0aGF0IGNhbiBiZQorICogcmV1c2VkIGFmdGVyIGluZGV4aW5nIGlzIGZpbmlzaGVkLiBTZXQgdG8gXGMgTlVMTCBpZiB5b3UgZG8gbm90IHJlcXVpcmUgaXQuCisgKgorICogXHJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGlmIHRoZXJlIHdlcmUgZXJyb3JzIGZyb20gd2hpY2ggdGhlIGNvbXBpbGVyIGNvdWxkCisgKiByZWNvdmVyLiAgSWYgdGhlcmUgaXMgYSBmYWlsdXJlIGZyb20gd2hpY2ggdGhlcmUgaXMgbm8gcmVjb3ZlcnksIHJldHVybnMKKyAqIGEgbm9uLXplcm8gXGMgQ1hFcnJvckNvZGUuCisgKgorICogVGhlIHJlc3Qgb2YgdGhlIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIGFzICNjbGFuZ19wYXJzZVRyYW5zbGF0aW9uVW5pdC4KKyAqLworQ0lOREVYX0xJTktBR0UgaW50IGNsYW5nX2luZGV4U291cmNlRmlsZShDWEluZGV4QWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWENsaWVudERhdGEgY2xpZW50X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4ZXJDYWxsYmFja3MgKmluZGV4X2NhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5kZXhfY2FsbGJhY2tzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4X29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNvdXJjZV9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICpjb21tYW5kX2xpbmVfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9jb21tYW5kX2xpbmVfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENYVW5zYXZlZEZpbGUgKnVuc2F2ZWRfZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV91bnNhdmVkX2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFRyYW5zbGF0aW9uVW5pdCAqb3V0X1RVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUVV9vcHRpb25zKTsKKworLyoqCisgKiBcYnJpZWYgU2FtZSBhcyBjbGFuZ19pbmRleFNvdXJjZUZpbGUgYnV0IHJlcXVpcmVzIGEgZnVsbCBjb21tYW5kIGxpbmUKKyAqIGZvciBcYyBjb21tYW5kX2xpbmVfYXJncyBpbmNsdWRpbmcgYXJndlswXS4gVGhpcyBpcyB1c2VmdWwgaWYgdGhlIHN0YW5kYXJkCisgKiBsaWJyYXJ5IHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmluYXJ5LgorICovCitDSU5ERVhfTElOS0FHRSBpbnQgY2xhbmdfaW5kZXhTb3VyY2VGaWxlRnVsbEFyZ3YoCisgICAgQ1hJbmRleEFjdGlvbiwgQ1hDbGllbnREYXRhIGNsaWVudF9kYXRhLCBJbmRleGVyQ2FsbGJhY2tzICppbmRleF9jYWxsYmFja3MsCisgICAgdW5zaWduZWQgaW5kZXhfY2FsbGJhY2tzX3NpemUsIHVuc2lnbmVkIGluZGV4X29wdGlvbnMsCisgICAgY29uc3QgY2hhciAqc291cmNlX2ZpbGVuYW1lLCBjb25zdCBjaGFyICpjb25zdCAqY29tbWFuZF9saW5lX2FyZ3MsCisgICAgaW50IG51bV9jb21tYW5kX2xpbmVfYXJncywgc3RydWN0IENYVW5zYXZlZEZpbGUgKnVuc2F2ZWRfZmlsZXMsCisgICAgdW5zaWduZWQgbnVtX3Vuc2F2ZWRfZmlsZXMsIENYVHJhbnNsYXRpb25Vbml0ICpvdXRfVFUsIHVuc2lnbmVkIFRVX29wdGlvbnMpOworCisvKioKKyAqIFxicmllZiBJbmRleCB0aGUgZ2l2ZW4gdHJhbnNsYXRpb24gdW5pdCB2aWEgY2FsbGJhY2tzIGltcGxlbWVudGVkIHRocm91Z2gKKyAqICNJbmRleGVyQ2FsbGJhY2tzLgorICogCisgKiBUaGUgb3JkZXIgb2YgY2FsbGJhY2sgaW52b2NhdGlvbnMgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUgYXMKKyAqIHdoZW4gaW5kZXhpbmcgYSBzb3VyY2UgZmlsZS4gVGhlIGhpZ2ggbGV2ZWwgb3JkZXIgd2lsbCBiZToKKyAqIAorICogICAtUHJlcHJvY2Vzc29yIGNhbGxiYWNrcyBpbnZvY2F0aW9ucworICogICAtRGVjbGFyYXRpb24vcmVmZXJlbmNlIGNhbGxiYWNrcyBpbnZvY2F0aW9ucworICogICAtRGlhZ25vc3RpYyBjYWxsYmFjayBpbnZvY2F0aW9ucworICoKKyAqIFRoZSBwYXJhbWV0ZXJzIGFyZSB0aGUgc2FtZSBhcyAjY2xhbmdfaW5kZXhTb3VyY2VGaWxlLgorICogCisgKiBccmV0dXJucyBJZiB0aGVyZSBpcyBhIGZhaWx1cmUgZnJvbSB3aGljaCB0aGVyZSBpcyBubyByZWNvdmVyeSwgcmV0dXJucworICogbm9uLXplcm8sIG90aGVyd2lzZSByZXR1cm5zIDAuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGludCBjbGFuZ19pbmRleFRyYW5zbGF0aW9uVW5pdChDWEluZGV4QWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYQ2xpZW50RGF0YSBjbGllbnRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleGVyQ2FsbGJhY2tzICppbmRleF9jYWxsYmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5kZXhfY2FsbGJhY2tzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5kZXhfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFRyYW5zbGF0aW9uVW5pdCk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBDWElkeEZpbGUsIGZpbGUsIGxpbmUsIGNvbHVtbiwgYW5kIG9mZnNldCByZXByZXNlbnRlZCBieQorICogdGhlIGdpdmVuIENYSWR4TG9jLgorICoKKyAqIElmIHRoZSBsb2NhdGlvbiByZWZlcnMgaW50byBhIG1hY3JvIGV4cGFuc2lvbiwgcmV0cmlldmVzIHRoZQorICogbG9jYXRpb24gb2YgdGhlIG1hY3JvIGV4cGFuc2lvbiBhbmQgaWYgaXQgcmVmZXJzIGludG8gYSBtYWNybyBhcmd1bWVudAorICogcmV0cmlldmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgYXJndW1lbnQuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHZvaWQgY2xhbmdfaW5kZXhMb2NfZ2V0RmlsZUxvY2F0aW9uKENYSWR4TG9jIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYSWR4Q2xpZW50RmlsZSAqaW5kZXhGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGaWxlICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKm9mZnNldCk7CisKKy8qKgorICogXGJyaWVmIFJldHJpZXZlIHRoZSBDWFNvdXJjZUxvY2F0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBDWElkeExvYy4KKyAqLworQ0lOREVYX0xJTktBR0UKK0NYU291cmNlTG9jYXRpb24gY2xhbmdfaW5kZXhMb2NfZ2V0Q1hTb3VyY2VMb2NhdGlvbihDWElkeExvYyBsb2MpOworCisvKioKKyAqIFxicmllZiBWaXNpdG9yIGludm9rZWQgZm9yIGVhY2ggZmllbGQgZm91bmQgYnkgYSB0cmF2ZXJzYWwuCisgKgorICogVGhpcyB2aXNpdG9yIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBmb3IgZWFjaCBmaWVsZCBmb3VuZCBieQorICogXGMgY2xhbmdfVHlwZV92aXNpdEZpZWxkcy4gSXRzIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjdXJzb3IgYmVpbmcKKyAqIHZpc2l0ZWQsIGl0cyBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIGNsaWVudCBkYXRhIHByb3ZpZGVkIHRvCisgKiBcYyBjbGFuZ19UeXBlX3Zpc2l0RmllbGRzLgorICoKKyAqIFRoZSB2aXNpdG9yIHNob3VsZCByZXR1cm4gb25lIG9mIHRoZSBcYyBDWFZpc2l0b3JSZXN1bHQgdmFsdWVzCisgKiB0byBkaXJlY3QgXGMgY2xhbmdfVHlwZV92aXNpdEZpZWxkcy4KKyAqLwordHlwZWRlZiBlbnVtIENYVmlzaXRvclJlc3VsdCAoKkNYRmllbGRWaXNpdG9yKShDWEN1cnNvciBDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWENsaWVudERhdGEgY2xpZW50X2RhdGEpOworCisvKioKKyAqIFxicmllZiBWaXNpdCB0aGUgZmllbGRzIG9mIGEgcGFydGljdWxhciB0eXBlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdmlzaXRzIGFsbCB0aGUgZGlyZWN0IGZpZWxkcyBvZiB0aGUgZ2l2ZW4gY3Vyc29yLAorICogaW52b2tpbmcgdGhlIGdpdmVuIFxwIHZpc2l0b3IgZnVuY3Rpb24gd2l0aCB0aGUgY3Vyc29ycyBvZiBlYWNoCisgKiB2aXNpdGVkIGZpZWxkLiBUaGUgdHJhdmVyc2FsIG1heSBiZSBlbmRlZCBwcmVtYXR1cmVseSwgaWYKKyAqIHRoZSB2aXNpdG9yIHJldHVybnMgXGMgQ1hGaWVsZFZpc2l0X0JyZWFrLgorICoKKyAqIFxwYXJhbSBUIHRoZSByZWNvcmQgdHlwZSB3aG9zZSBmaWVsZCBtYXkgYmUgdmlzaXRlZC4KKyAqCisgKiBccGFyYW0gdmlzaXRvciB0aGUgdmlzaXRvciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBmb3IgZWFjaAorICogZmllbGQgb2YgXHAgVC4KKyAqCisgKiBccGFyYW0gY2xpZW50X2RhdGEgcG9pbnRlciBkYXRhIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQsIHdoaWNoIHdpbGwKKyAqIGJlIHBhc3NlZCB0byB0aGUgdmlzaXRvciBlYWNoIHRpbWUgaXQgaXMgaW52b2tlZC4KKyAqCisgKiBccmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlIGlmIHRoZSB0cmF2ZXJzYWwgd2FzIHRlcm1pbmF0ZWQKKyAqIHByZW1hdHVyZWx5IGJ5IHRoZSB2aXNpdG9yIHJldHVybmluZyBcYyBDWEZpZWxkVmlzaXRfQnJlYWsuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGNsYW5nX1R5cGVfdmlzaXRGaWVsZHMoQ1hUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRmllbGRWaXNpdG9yIHZpc2l0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYQ2xpZW50RGF0YSBjbGllbnRfZGF0YSk7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmctYy9QbGF0Zm9ybS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmctYy9QbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYTRkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy1jL1BsYXRmb3JtLmgKQEAgLTAsMCArMSw0NSBAQAorLyo9PT0tLSBjbGFuZy1jL1BsYXRmb3JtLmggLSBDIEluZGV4IHBsYXRmb3JtIGRlY2xzICAgLS0tLS0tLS0tLS0tLSotIEMgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICp8Cit8KiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBoZWFkZXIgcHJvdmlkZXMgcGxhdGZvcm0gc3BlY2lmaWMgbWFjcm9zIChkbGxpbXBvcnQsIGRlcHJlY2F0ZWQsIC4uLikgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQ19QTEFURk9STV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQ19QTEFURk9STV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogTVNWQyBETEwgaW1wb3J0L2V4cG9ydC4gKi8KKyNpZmRlZiBfTVNDX1ZFUgorICAjaWZkZWYgX0NJTkRFWF9MSUJfCisgICAgI2RlZmluZSBDSU5ERVhfTElOS0FHRSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyAgI2Vsc2UKKyAgICAjZGVmaW5lIENJTkRFWF9MSU5LQUdFIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorICAjZW5kaWYKKyNlbHNlCisgICNkZWZpbmUgQ0lOREVYX0xJTktBR0UKKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18KKyAgI2RlZmluZSBDSU5ERVhfREVQUkVDQVRFRCBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkKKyNlbHNlCisgICNpZmRlZiBfTVNDX1ZFUgorICAgICNkZWZpbmUgQ0lOREVYX0RFUFJFQ0FURUQgX19kZWNsc3BlYyhkZXByZWNhdGVkKQorICAjZWxzZQorICAgICNkZWZpbmUgQ0lOREVYX0RFUFJFQ0FURUQKKyAgI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVJDTWlncmF0ZS9BUkNNVC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVJDTWlncmF0ZS9BUkNNVC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MDgxODYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BUkNNaWdyYXRlL0FSQ01ULmgKQEAgLTAsMCArMSwxMzEgQEAKKy8vPT09LS0gQVJDTVQuaCAtIEFSQyBNaWdyYXRpb24gUmV3cml0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BUkNNSUdSQVRFX0FSQ01UX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BUkNNSUdSQVRFX0FSQ01UX0gKKworI2luY2x1ZGUgImNsYW5nL0FSQ01pZ3JhdGUvRmlsZVJlbWFwcGVyLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Db21waWxlckludm9jYXRpb24uaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgY2xhc3MgQVNUQ29udGV4dDsKKyAgY2xhc3MgRGlhZ25vc3RpY0NvbnN1bWVyOworICBjbGFzcyBQQ0hDb250YWluZXJPcGVyYXRpb25zOworCituYW1lc3BhY2UgYXJjbXQgeworICBjbGFzcyBNaWdyYXRpb25QYXNzOworCisvLy8gXGJyaWVmIENyZWF0ZXMgYW4gQVNUIHdpdGggdGhlIHByb3ZpZGVkIENvbXBpbGVySW52b2NhdGlvbiBidXQgd2l0aCB0aGVzZQorLy8vIGNoYW5nZXM6CisvLy8gICAtaWYgYSBQQ0gvUFRIIGlzIHNldCwgdGhlIG9yaWdpbmFsIGhlYWRlciBpcyB1c2VkIGluc3RlYWQKKy8vLyAgIC1BdXRvbWF0aWMgUmVmZXJlbmNlIENvdW50aW5nIG1vZGUgaXMgZW5hYmxlZAorLy8vCisvLy8gSXQgdGhlbiBjaGVja3MgdGhlIEFTVCBhbmQgcHJvZHVjZXMgZXJyb3JzL3dhcm5pbmcgZm9yIEFSQyBtaWdyYXRpb24gaXNzdWVzCisvLy8gdGhhdCB0aGUgdXNlciBuZWVkcyB0byBoYW5kbGUgbWFudWFsbHkuCisvLy8KKy8vLyBccGFyYW0gZW1pdFByZW1pZ3JhdGlvbkFSQ0Vycm9ycyBpZiB0cnVlIGFsbCBBUkMgZXJyb3JzIHdpbGwgZ2V0IGVtaXR0ZWQKKy8vLyBldmVuIGlmIHRoZSBtaWdyYXRvciBjYW4gZml4IHRoZW0sIGJ1dCB0aGUgZnVuY3Rpb24gd2lsbCBzdGlsbCByZXR1cm4gZmFsc2UKKy8vLyBpZiBhbGwgQVJDIGVycm9ycyBjYW4gYmUgZml4ZWQuCisvLy8KKy8vLyBccGFyYW0gcGxpc3RPdXQgaWYgbm9uLWVtcHR5LCBpdCBpcyB0aGUgZmlsZSBwYXRoIHRvIHN0b3JlIHRoZSBwbGlzdCB3aXRoCisvLy8gdGhlIHByZS1taWdyYXRpb24gQVJDIGRpYWdub3N0aWNzLgorLy8vCisvLy8gXHJldHVybnMgZmFsc2UgaWYgbm8gZXJyb3IgaXMgcHJvZHVjZWQsIHRydWUgb3RoZXJ3aXNlLgorYm9vbAorY2hlY2tGb3JNYW51YWxJc3N1ZXMoQ29tcGlsZXJJbnZvY2F0aW9uICZDSSwgY29uc3QgRnJvbnRlbmRJbnB1dEZpbGUgJklucHV0LAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBDSENvbnRhaW5lck9wZXJhdGlvbnM+IFBDSENvbnRhaW5lck9wcywKKyAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNDb25zdW1lciAqRGlhZ0NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW1pdFByZW1pZ3JhdGlvbkFSQ0Vycm9ycyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIHBsaXN0T3V0ID0gU3RyaW5nUmVmKCkpOworCisvLy8gXGJyaWVmIFdvcmtzIHNpbWlsYXIgdG8gY2hlY2tGb3JNYW51YWxJc3N1ZXMgYnV0IGluc3RlYWQgb2YgY2hlY2tpbmcsIGl0CisvLy8gYXBwbGllcyBhdXRvbWF0aWMgbW9kaWZpY2F0aW9ucyB0byBzb3VyY2UgZmlsZXMgdG8gY29uZm9ybSB0byBBUkMuCisvLy8KKy8vLyBccmV0dXJucyBmYWxzZSBpZiBubyBlcnJvciBpcyBwcm9kdWNlZCwgdHJ1ZSBvdGhlcndpc2UuCitib29sCithcHBseVRyYW5zZm9ybWF0aW9ucyhDb21waWxlckludm9jYXRpb24gJm9yaWdDSSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZyb250ZW5kSW5wdXRGaWxlICZJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQQ0hDb250YWluZXJPcGVyYXRpb25zPiBQQ0hDb250YWluZXJPcHMsCisgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljQ29uc3VtZXIgKkRpYWdDbGllbnQpOworCisvLy8gXGJyaWVmIEFwcGxpZXMgYXV0b21hdGljIG1vZGlmaWNhdGlvbnMgYW5kIHByb2R1Y2VzIHRlbXBvcmFyeSBmaWxlcworLy8vIGFuZCBtZXRhZGF0YSBpbnRvIHRoZSBccCBvdXRwdXREaXIgcGF0aC4KKy8vLworLy8vIFxwYXJhbSBlbWl0UHJlbWlncmF0aW9uQVJDRXJyb3JzIGlmIHRydWUgYWxsIEFSQyBlcnJvcnMgd2lsbCBnZXQgZW1pdHRlZAorLy8vIGV2ZW4gaWYgdGhlIG1pZ3JhdG9yIGNhbiBmaXggdGhlbSwgYnV0IHRoZSBmdW5jdGlvbiB3aWxsIHN0aWxsIHJldHVybiBmYWxzZQorLy8vIGlmIGFsbCBBUkMgZXJyb3JzIGNhbiBiZSBmaXhlZC4KKy8vLworLy8vIFxwYXJhbSBwbGlzdE91dCBpZiBub24tZW1wdHksIGl0IGlzIHRoZSBmaWxlIHBhdGggdG8gc3RvcmUgdGhlIHBsaXN0IHdpdGgKKy8vLyB0aGUgcHJlLW1pZ3JhdGlvbiBBUkMgZGlhZ25vc3RpY3MuCisvLy8KKy8vLyBccmV0dXJucyBmYWxzZSBpZiBubyBlcnJvciBpcyBwcm9kdWNlZCwgdHJ1ZSBvdGhlcndpc2UuCitib29sIG1pZ3JhdGVXaXRoVGVtcG9yYXJ5RmlsZXMoCisgICAgQ29tcGlsZXJJbnZvY2F0aW9uICZvcmlnQ0ksIGNvbnN0IEZyb250ZW5kSW5wdXRGaWxlICZJbnB1dCwKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UENIQ29udGFpbmVyT3BlcmF0aW9ucz4gUENIQ29udGFpbmVyT3BzLAorICAgIERpYWdub3N0aWNDb25zdW1lciAqRGlhZ0NsaWVudCwgU3RyaW5nUmVmIG91dHB1dERpciwKKyAgICBib29sIGVtaXRQcmVtaWdyYXRpb25BUkNFcnJvcnMsIFN0cmluZ1JlZiBwbGlzdE91dCk7CisKKy8vLyBcYnJpZWYgR2V0IHRoZSBzZXQgb2YgZmlsZSByZW1hcHBpbmdzIGZyb20gdGhlIFxwIG91dHB1dERpciBwYXRoIHRoYXQKKy8vLyBtaWdyYXRlV2l0aFRlbXBvcmFyeUZpbGVzIHByb2R1Y2VkLgorLy8vCisvLy8gXHJldHVybnMgZmFsc2UgaWYgbm8gZXJyb3IgaXMgcHJvZHVjZWQsIHRydWUgb3RoZXJ3aXNlLgorYm9vbCBnZXRGaWxlUmVtYXBwaW5ncyhzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsc3RkOjpzdHJpbmc+ID4gJnJlbWFwLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgb3V0cHV0RGlyLAorICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljQ29uc3VtZXIgKkRpYWdDbGllbnQpOworCisvLy8gXGJyaWVmIEdldCB0aGUgc2V0IG9mIGZpbGUgcmVtYXBwaW5ncyBmcm9tIGEgbGlzdCBvZiBmaWxlcyB3aXRoIHJlbWFwcGluZworLy8vIGluZm8uCisvLy8KKy8vLyBccmV0dXJucyBmYWxzZSBpZiBubyBlcnJvciBpcyBwcm9kdWNlZCwgdHJ1ZSBvdGhlcndpc2UuCitib29sIGdldEZpbGVSZW1hcHBpbmdzRnJvbUZpbGVMaXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLHN0ZDo6c3RyaW5nPiA+ICZyZW1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFN0cmluZ1JlZj4gcmVtYXBGaWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNDb25zdW1lciAqRGlhZ0NsaWVudCk7CisKK3R5cGVkZWYgdm9pZCAoKlRyYW5zZm9ybUZuKShNaWdyYXRpb25QYXNzICZwYXNzKTsKKworc3RkOjp2ZWN0b3I8VHJhbnNmb3JtRm4+IGdldEFsbFRyYW5zZm9ybWF0aW9ucyhMYW5nT3B0aW9uczo6R0NNb2RlIE9yaWdHQ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTm9GaW5hbGl6ZVJlbW92YWwpOworCitjbGFzcyBNaWdyYXRpb25Qcm9jZXNzIHsKKyAgQ29tcGlsZXJJbnZvY2F0aW9uIE9yaWdDSTsKKyAgc3RkOjpzaGFyZWRfcHRyPFBDSENvbnRhaW5lck9wZXJhdGlvbnM+IFBDSENvbnRhaW5lck9wczsKKyAgRGlhZ25vc3RpY0NvbnN1bWVyICpEaWFnQ2xpZW50OworICBGaWxlUmVtYXBwZXIgUmVtYXBwZXI7CisKK3B1YmxpYzoKKyAgYm9vbCBIYWRBUkNFcnJvcnM7CisKKyAgTWlncmF0aW9uUHJvY2Vzcyhjb25zdCBDb21waWxlckludm9jYXRpb24gJkNJLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQQ0hDb250YWluZXJPcGVyYXRpb25zPiBQQ0hDb250YWluZXJPcHMsCisgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY0NvbnN1bWVyICpkaWFnQ2xpZW50LAorICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBvdXRwdXREaXIgPSBTdHJpbmdSZWYoKSk7CisKKyAgY2xhc3MgUmV3cml0ZUxpc3RlbmVyIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgflJld3JpdGVMaXN0ZW5lcigpOworCisgICAgdmlydHVhbCB2b2lkIHN0YXJ0KEFTVENvbnRleHQgJkN0eCkgeyB9CisgICAgdmlydHVhbCB2b2lkIGZpbmlzaCgpIHsgfQorCisgICAgdmlydHVhbCB2b2lkIGluc2VydChTb3VyY2VMb2NhdGlvbiBsb2MsIFN0cmluZ1JlZiB0ZXh0KSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKENoYXJTb3VyY2VSYW5nZSByYW5nZSkgeyB9CisgIH07CisKKyAgYm9vbCBhcHBseVRyYW5zZm9ybShUcmFuc2Zvcm1GbiB0cmFucywgUmV3cml0ZUxpc3RlbmVyICpsaXN0ZW5lciA9IG51bGxwdHIpOworCisgIEZpbGVSZW1hcHBlciAmZ2V0UmVtYXBwZXIoKSB7IHJldHVybiBSZW1hcHBlcjsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGFyY210CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BUkNNaWdyYXRlL0FSQ01UQWN0aW9ucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVJDTWlncmF0ZS9BUkNNVEFjdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTRlMGMwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVJDTWlncmF0ZS9BUkNNVEFjdGlvbnMuaApAQCAtMCwwICsxLDc3IEBACisvLz09PS0tLSBBUkNNVEFjdGlvbnMuaCAtIEFSQyBNaWdyYXRlIFRvb2wgRnJvbnRlbmQgQWN0aW9ucyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVJDTUlHUkFURV9BUkNNVEFDVElPTlNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FSQ01JR1JBVEVfQVJDTVRBQ1RJT05TX0gKKworI2luY2x1ZGUgImNsYW5nL0FSQ01pZ3JhdGUvRmlsZVJlbWFwcGVyLmgiCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb24uaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgYXJjbXQgeworCitjbGFzcyBDaGVja0FjdGlvbiA6IHB1YmxpYyBXcmFwcGVyRnJvbnRlbmRBY3Rpb24geworcHJvdGVjdGVkOgorICBib29sIEJlZ2luSW52b2NhdGlvbihDb21waWxlckluc3RhbmNlICZDSSkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgQ2hlY2tBY3Rpb24oc3RkOjp1bmlxdWVfcHRyPEZyb250ZW5kQWN0aW9uPiBXcmFwcGVkQWN0aW9uKTsKK307CisKK2NsYXNzIE1vZGlmeUFjdGlvbiA6IHB1YmxpYyBXcmFwcGVyRnJvbnRlbmRBY3Rpb24geworcHJvdGVjdGVkOgorICBib29sIEJlZ2luSW52b2NhdGlvbihDb21waWxlckluc3RhbmNlICZDSSkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgTW9kaWZ5QWN0aW9uKHN0ZDo6dW5pcXVlX3B0cjxGcm9udGVuZEFjdGlvbj4gV3JhcHBlZEFjdGlvbik7Cit9OworCitjbGFzcyBNaWdyYXRlU291cmNlQWN0aW9uIDogcHVibGljIEFTVEZyb250ZW5kQWN0aW9uIHsKKyAgRmlsZVJlbWFwcGVyIFJlbWFwcGVyOworcHJvdGVjdGVkOgorICBib29sIEJlZ2luSW52b2NhdGlvbihDb21waWxlckluc3RhbmNlICZDSSkgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RDb25zdW1lcj4gQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBNaWdyYXRlQWN0aW9uIDogcHVibGljIFdyYXBwZXJGcm9udGVuZEFjdGlvbiB7CisgIHN0ZDo6c3RyaW5nIE1pZ3JhdGVEaXI7CisgIHN0ZDo6c3RyaW5nIFBsaXN0T3V0OworICBib29sIEVtaXRQcmVtaWdyYXRpb25BUkNFcnJvczsKK3Byb3RlY3RlZDoKKyAgYm9vbCBCZWdpbkludm9jYXRpb24oQ29tcGlsZXJJbnN0YW5jZSAmQ0kpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIE1pZ3JhdGVBY3Rpb24oc3RkOjp1bmlxdWVfcHRyPEZyb250ZW5kQWN0aW9uPiBXcmFwcGVkQWN0aW9uLAorICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBtaWdyYXRlRGlyLAorICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBwbGlzdE91dCwKKyAgICAgICAgICAgICAgICBib29sIGVtaXRQcmVtaWdyYXRpb25BUkNFcnJvcnMpOworfTsKKworLy8vIFxicmllZiBNaWdyYXRlcyB0byBtb2Rlcm4gT2JqQyBzeW50YXguCitjbGFzcyBPYmpDTWlncmF0ZUFjdGlvbiA6IHB1YmxpYyBXcmFwcGVyRnJvbnRlbmRBY3Rpb24geworICBzdGQ6OnN0cmluZyBNaWdyYXRlRGlyOworICB1bnNpZ25lZCAgICBPYmpDTWlnQWN0aW9uOworICBGaWxlUmVtYXBwZXIgUmVtYXBwZXI7CisgIENvbXBpbGVySW5zdGFuY2UgKkNvbXBJbnN0OworcHVibGljOgorICBPYmpDTWlncmF0ZUFjdGlvbihzdGQ6OnVuaXF1ZV9wdHI8RnJvbnRlbmRBY3Rpb24+IFdyYXBwZWRBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBtaWdyYXRlRGlyLCB1bnNpZ25lZCBtaWdyYXRlQWN0aW9uKTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnVuaXF1ZV9wdHI8QVNUQ29uc3VtZXI+IENyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIG92ZXJyaWRlOworICBib29sIEJlZ2luSW52b2NhdGlvbihDb21waWxlckluc3RhbmNlICZDSSkgb3ZlcnJpZGU7Cit9OworCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVJDTWlncmF0ZS9GaWxlUmVtYXBwZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FSQ01pZ3JhdGUvRmlsZVJlbWFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiODhlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FSQ01pZ3JhdGUvRmlsZVJlbWFwcGVyLmgKQEAgLTAsMCArMSw3NyBAQAorLy89PT0tLSBGaWxlUmVtYXBwZXIuaCAtIEZpbGUgUmVtYXBwaW5nIEhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FSQ01JR1JBVEVfRklMRVJFTUFQUEVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BUkNNSUdSQVRFX0ZJTEVSRU1BUFBFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTWVtb3J5QnVmZmVyOworfQorCituYW1lc3BhY2UgY2xhbmcgeworICBjbGFzcyBGaWxlTWFuYWdlcjsKKyAgY2xhc3MgRmlsZUVudHJ5OworICBjbGFzcyBEaWFnbm9zdGljc0VuZ2luZTsKKyAgY2xhc3MgUHJlcHJvY2Vzc29yT3B0aW9uczsKKworbmFtZXNwYWNlIGFyY210IHsKKworY2xhc3MgRmlsZVJlbWFwcGVyIHsKKyAgLy8gRklYTUU6IFJldXNlIHRoZSBzYW1lIEZpbGVNYW5hZ2VyIGZvciBtdWx0aXBsZSBBU1RDb250ZXh0cy4KKyAgc3RkOjp1bmlxdWVfcHRyPEZpbGVNYW5hZ2VyPiBGaWxlTWdyOworCisgIHR5cGVkZWYgbGx2bTo6UG9pbnRlclVuaW9uPGNvbnN0IEZpbGVFbnRyeSAqLCBsbHZtOjpNZW1vcnlCdWZmZXIgKj4gVGFyZ2V0OworICB0eXBlZGVmIGxsdm06OkRlbnNlTWFwPGNvbnN0IEZpbGVFbnRyeSAqLCBUYXJnZXQ+IE1hcHBpbmdzVHk7CisgIE1hcHBpbmdzVHkgRnJvbVRvTWFwcGluZ3M7CisKKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgRmlsZUVudHJ5ICosIGNvbnN0IEZpbGVFbnRyeSAqPiBUb0Zyb21NYXBwaW5nczsKKworcHVibGljOgorICBGaWxlUmVtYXBwZXIoKTsKKyAgfkZpbGVSZW1hcHBlcigpOworICAKKyAgYm9vbCBpbml0RnJvbURpc2soU3RyaW5nUmVmIG91dHB1dERpciwgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWcsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaWdub3JlSWZGaWxlc0NoYW5nZWQpOworICBib29sIGluaXRGcm9tRmlsZShTdHJpbmdSZWYgZmlsZVBhdGgsIERpYWdub3N0aWNzRW5naW5lICZEaWFnLAorICAgICAgICAgICAgICAgICAgICBib29sIGlnbm9yZUlmRmlsZXNDaGFuZ2VkKTsKKyAgYm9vbCBmbHVzaFRvRGlzayhTdHJpbmdSZWYgb3V0cHV0RGlyLCBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZyk7CisgIGJvb2wgZmx1c2hUb0ZpbGUoU3RyaW5nUmVmIG91dHB1dFBhdGgsIERpYWdub3N0aWNzRW5naW5lICZEaWFnKTsKKworICBib29sIG92ZXJ3cml0ZU9yaWdpbmFsKERpYWdub3N0aWNzRW5naW5lICZEaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBvdXRwdXREaXIgPSBTdHJpbmdSZWYoKSk7CisKKyAgdm9pZCByZW1hcChTdHJpbmdSZWYgZmlsZVBhdGgsIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+IG1lbUJ1Zik7CisKKyAgdm9pZCBhcHBseU1hcHBpbmdzKFByZXByb2Nlc3Nvck9wdGlvbnMgJlBQT3B0cykgY29uc3Q7CisKKyAgdm9pZCBjbGVhcihTdHJpbmdSZWYgb3V0cHV0RGlyID0gU3RyaW5nUmVmKCkpOworCitwcml2YXRlOgorICB2b2lkIHJlbWFwKGNvbnN0IEZpbGVFbnRyeSAqZmlsZSwgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gbWVtQnVmKTsKKyAgdm9pZCByZW1hcChjb25zdCBGaWxlRW50cnkgKmZpbGUsIGNvbnN0IEZpbGVFbnRyeSAqbmV3ZmlsZSk7CisKKyAgY29uc3QgRmlsZUVudHJ5ICpnZXRPcmlnaW5hbEZpbGUoU3RyaW5nUmVmIGZpbGVQYXRoKTsKKyAgdm9pZCByZXNldFRhcmdldChUYXJnZXQgJnRhcmcpOworCisgIGJvb2wgcmVwb3J0KGNvbnN0IFR3aW5lICZlcnIsIERpYWdub3N0aWNzRW5naW5lICZEaWFnKTsKKworICBzdGQ6OnN0cmluZyBnZXRSZW1hcEluZm9GaWxlKFN0cmluZ1JlZiBvdXRwdXREaXIpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGFyY210CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQVBWYWx1ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0FQVmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzQzMWYzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0FQVmFsdWUuaApAQCAtMCwwICsxLDQ1NCBAQAorLy89PT0tLS0gQVBWYWx1ZS5oIC0gVW5pb24gY2xhc3MgZm9yIEFQRmxvYXQvQVBTSW50L0NvbXBsZXggLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIEFQVmFsdWUgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9BUFZBTFVFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfQVBWQUxVRV9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQVBGbG9hdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FQU0ludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlclVuaW9uLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisgIGNsYXNzIEFkZHJMYWJlbEV4cHI7CisgIGNsYXNzIEFTVENvbnRleHQ7CisgIGNsYXNzIENoYXJVbml0czsKKyAgY2xhc3MgRGlhZ25vc3RpY0J1aWxkZXI7CisgIGNsYXNzIEV4cHI7CisgIGNsYXNzIEZpZWxkRGVjbDsKKyAgY2xhc3MgRGVjbDsKKyAgY2xhc3MgVmFsdWVEZWNsOworICBjbGFzcyBDWFhSZWNvcmREZWNsOworICBjbGFzcyBRdWFsVHlwZTsKKworLy8vIEFQVmFsdWUgLSBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBkaXNjcmltaW5hdGVkIHVuaW9uIG9mIFt1bmluaXRpYWxpemVkXQorLy8vIFtBUFNJbnRdIFtBUEZsb2F0XSwgW0NvbXBsZXggQVBTSW50XSBbQ29tcGxleCBBUEZsb2F0XSwgW0V4cHIgKyBPZmZzZXRdLAorLy8vIFtWZWN0b3I6IE4gKiBBUFZhbHVlXSwgW0FycmF5OiBOICogQVBWYWx1ZV0KK2NsYXNzIEFQVmFsdWUgeworICB0eXBlZGVmIGxsdm06OkFQU0ludCBBUFNJbnQ7CisgIHR5cGVkZWYgbGx2bTo6QVBGbG9hdCBBUEZsb2F0OworcHVibGljOgorICBlbnVtIFZhbHVlS2luZCB7CisgICAgVW5pbml0aWFsaXplZCwKKyAgICBJbnQsCisgICAgRmxvYXQsCisgICAgQ29tcGxleEludCwKKyAgICBDb21wbGV4RmxvYXQsCisgICAgTFZhbHVlLAorICAgIFZlY3RvciwKKyAgICBBcnJheSwKKyAgICBTdHJ1Y3QsCisgICAgVW5pb24sCisgICAgTWVtYmVyUG9pbnRlciwKKyAgICBBZGRyTGFiZWxEaWZmCisgIH07CisgIHR5cGVkZWYgbGx2bTo6UG9pbnRlclVuaW9uPGNvbnN0IFZhbHVlRGVjbCAqLCBjb25zdCBFeHByICo+IExWYWx1ZUJhc2U7CisgIHR5cGVkZWYgbGx2bTo6UG9pbnRlckludFBhaXI8Y29uc3QgRGVjbCAqLCAxLCBib29sPiBCYXNlT3JNZW1iZXJUeXBlOworICB1bmlvbiBMVmFsdWVQYXRoRW50cnkgeworICAgIC8vLyBCYXNlT3JNZW1iZXIgLSBUaGUgRmllbGREZWNsIG9yIENYWFJlY29yZERlY2wgaW5kaWNhdGluZyB0aGUgbmV4dCBpdGVtCisgICAgLy8vIGluIHRoZSBwYXRoLiBBbiBvcGFxdWUgdmFsdWUgb2YgdHlwZSBCYXNlT3JNZW1iZXJUeXBlLgorICAgIHZvaWQgKkJhc2VPck1lbWJlcjsKKyAgICAvLy8gQXJyYXlJbmRleCAtIFRoZSBhcnJheSBpbmRleCBvZiB0aGUgbmV4dCBpdGVtIGluIHRoZSBwYXRoLgorICAgIHVpbnQ2NF90IEFycmF5SW5kZXg7CisgIH07CisgIHN0cnVjdCBOb0xWYWx1ZVBhdGgge307CisgIHN0cnVjdCBVbmluaXRBcnJheSB7fTsKKyAgc3RydWN0IFVuaW5pdFN0cnVjdCB7fTsKK3ByaXZhdGU6CisgIFZhbHVlS2luZCBLaW5kOworCisgIHN0cnVjdCBDb21wbGV4QVBTSW50IHsKKyAgICBBUFNJbnQgUmVhbCwgSW1hZzsKKyAgICBDb21wbGV4QVBTSW50KCkgOiBSZWFsKDEpLCBJbWFnKDEpIHt9CisgIH07CisgIHN0cnVjdCBDb21wbGV4QVBGbG9hdCB7CisgICAgQVBGbG9hdCBSZWFsLCBJbWFnOworICAgIENvbXBsZXhBUEZsb2F0KCkgOiBSZWFsKDAuMCksIEltYWcoMC4wKSB7fQorICB9OworICBzdHJ1Y3QgTFY7CisgIHN0cnVjdCBWZWMgeworICAgIEFQVmFsdWUgKkVsdHM7CisgICAgdW5zaWduZWQgTnVtRWx0czsKKyAgICBWZWMoKSA6IEVsdHMobnVsbHB0ciksIE51bUVsdHMoMCkge30KKyAgICB+VmVjKCkgeyBkZWxldGVbXSBFbHRzOyB9CisgIH07CisgIHN0cnVjdCBBcnIgeworICAgIEFQVmFsdWUgKkVsdHM7CisgICAgdW5zaWduZWQgTnVtRWx0cywgQXJyU2l6ZTsKKyAgICBBcnIodW5zaWduZWQgTnVtRWx0cywgdW5zaWduZWQgQXJyU2l6ZSk7CisgICAgfkFycigpOworICB9OworICBzdHJ1Y3QgU3RydWN0RGF0YSB7CisgICAgQVBWYWx1ZSAqRWx0czsKKyAgICB1bnNpZ25lZCBOdW1CYXNlczsKKyAgICB1bnNpZ25lZCBOdW1GaWVsZHM7CisgICAgU3RydWN0RGF0YSh1bnNpZ25lZCBOdW1CYXNlcywgdW5zaWduZWQgTnVtRmllbGRzKTsKKyAgICB+U3RydWN0RGF0YSgpOworICB9OworICBzdHJ1Y3QgVW5pb25EYXRhIHsKKyAgICBjb25zdCBGaWVsZERlY2wgKkZpZWxkOworICAgIEFQVmFsdWUgKlZhbHVlOworICAgIFVuaW9uRGF0YSgpOworICAgIH5VbmlvbkRhdGEoKTsKKyAgfTsKKyAgc3RydWN0IEFkZHJMYWJlbERpZmZEYXRhIHsKKyAgICBjb25zdCBBZGRyTGFiZWxFeHByKiBMSFNFeHByOworICAgIGNvbnN0IEFkZHJMYWJlbEV4cHIqIFJIU0V4cHI7CisgIH07CisgIHN0cnVjdCBNZW1iZXJQb2ludGVyRGF0YTsKKworICAvLyBXZSBlbnN1cmUgZWxzZXdoZXJlIHRoYXQgRGF0YSBpcyBiaWcgZW5vdWdoIGZvciBMViBhbmQgTWVtYmVyUG9pbnRlckRhdGEuCisgIHR5cGVkZWYgbGx2bTo6QWxpZ25lZENoYXJBcnJheVVuaW9uPHZvaWQgKiwgQVBTSW50LCBBUEZsb2F0LCBDb21wbGV4QVBTSW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV4QVBGbG9hdCwgVmVjLCBBcnIsIFN0cnVjdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaW9uRGF0YSwgQWRkckxhYmVsRGlmZkRhdGE+IERhdGFUeXBlOworICBzdGF0aWMgY29uc3Qgc2l6ZV90IERhdGFTaXplID0gc2l6ZW9mKERhdGFUeXBlKTsKKworICBEYXRhVHlwZSBEYXRhOworCitwdWJsaWM6CisgIEFQVmFsdWUoKSA6IEtpbmQoVW5pbml0aWFsaXplZCkge30KKyAgZXhwbGljaXQgQVBWYWx1ZShBUFNJbnQgSSkgOiBLaW5kKFVuaW5pdGlhbGl6ZWQpIHsKKyAgICBNYWtlSW50KCk7IHNldEludChzdGQ6Om1vdmUoSSkpOworICB9CisgIGV4cGxpY2l0IEFQVmFsdWUoQVBGbG9hdCBGKSA6IEtpbmQoVW5pbml0aWFsaXplZCkgeworICAgIE1ha2VGbG9hdCgpOyBzZXRGbG9hdChzdGQ6Om1vdmUoRikpOworICB9CisgIGV4cGxpY2l0IEFQVmFsdWUoY29uc3QgQVBWYWx1ZSAqRSwgdW5zaWduZWQgTikgOiBLaW5kKFVuaW5pdGlhbGl6ZWQpIHsKKyAgICBNYWtlVmVjdG9yKCk7IHNldFZlY3RvcihFLCBOKTsKKyAgfQorICBBUFZhbHVlKEFQU0ludCBSLCBBUFNJbnQgSSkgOiBLaW5kKFVuaW5pdGlhbGl6ZWQpIHsKKyAgICBNYWtlQ29tcGxleEludCgpOyBzZXRDb21wbGV4SW50KHN0ZDo6bW92ZShSKSwgc3RkOjptb3ZlKEkpKTsKKyAgfQorICBBUFZhbHVlKEFQRmxvYXQgUiwgQVBGbG9hdCBJKSA6IEtpbmQoVW5pbml0aWFsaXplZCkgeworICAgIE1ha2VDb21wbGV4RmxvYXQoKTsgc2V0Q29tcGxleEZsb2F0KHN0ZDo6bW92ZShSKSwgc3RkOjptb3ZlKEkpKTsKKyAgfQorICBBUFZhbHVlKGNvbnN0IEFQVmFsdWUgJlJIUyk7CisgIEFQVmFsdWUoQVBWYWx1ZSAmJlJIUykgOiBLaW5kKFVuaW5pdGlhbGl6ZWQpIHsgc3dhcChSSFMpOyB9CisgIEFQVmFsdWUoTFZhbHVlQmFzZSBCLCBjb25zdCBDaGFyVW5pdHMgJk8sIE5vTFZhbHVlUGF0aCBOLCB1bnNpZ25lZCBDYWxsSW5kZXgsCisgICAgICAgICAgYm9vbCBJc051bGxQdHIgPSBmYWxzZSkKKyAgICAgIDogS2luZChVbmluaXRpYWxpemVkKSB7CisgICAgTWFrZUxWYWx1ZSgpOyBzZXRMVmFsdWUoQiwgTywgTiwgQ2FsbEluZGV4LCBJc051bGxQdHIpOworICB9CisgIEFQVmFsdWUoTFZhbHVlQmFzZSBCLCBjb25zdCBDaGFyVW5pdHMgJk8sIEFycmF5UmVmPExWYWx1ZVBhdGhFbnRyeT4gUGF0aCwKKyAgICAgICAgICBib29sIE9uZVBhc3RUaGVFbmQsIHVuc2lnbmVkIENhbGxJbmRleCwgYm9vbCBJc051bGxQdHIgPSBmYWxzZSkKKyAgICAgIDogS2luZChVbmluaXRpYWxpemVkKSB7CisgICAgTWFrZUxWYWx1ZSgpOyBzZXRMVmFsdWUoQiwgTywgUGF0aCwgT25lUGFzdFRoZUVuZCwgQ2FsbEluZGV4LCBJc051bGxQdHIpOworICB9CisgIEFQVmFsdWUoVW5pbml0QXJyYXksIHVuc2lnbmVkIEluaXRFbHRzLCB1bnNpZ25lZCBTaXplKSA6IEtpbmQoVW5pbml0aWFsaXplZCkgeworICAgIE1ha2VBcnJheShJbml0RWx0cywgU2l6ZSk7CisgIH0KKyAgQVBWYWx1ZShVbmluaXRTdHJ1Y3QsIHVuc2lnbmVkIEIsIHVuc2lnbmVkIE0pIDogS2luZChVbmluaXRpYWxpemVkKSB7CisgICAgTWFrZVN0cnVjdChCLCBNKTsKKyAgfQorICBleHBsaWNpdCBBUFZhbHVlKGNvbnN0IEZpZWxkRGVjbCAqRCwgY29uc3QgQVBWYWx1ZSAmViA9IEFQVmFsdWUoKSkKKyAgICAgIDogS2luZChVbmluaXRpYWxpemVkKSB7CisgICAgTWFrZVVuaW9uKCk7IHNldFVuaW9uKEQsIFYpOworICB9CisgIEFQVmFsdWUoY29uc3QgVmFsdWVEZWNsICpNZW1iZXIsIGJvb2wgSXNEZXJpdmVkTWVtYmVyLAorICAgICAgICAgIEFycmF5UmVmPGNvbnN0IENYWFJlY29yZERlY2wqPiBQYXRoKSA6IEtpbmQoVW5pbml0aWFsaXplZCkgeworICAgIE1ha2VNZW1iZXJQb2ludGVyKE1lbWJlciwgSXNEZXJpdmVkTWVtYmVyLCBQYXRoKTsKKyAgfQorICBBUFZhbHVlKGNvbnN0IEFkZHJMYWJlbEV4cHIqIExIU0V4cHIsIGNvbnN0IEFkZHJMYWJlbEV4cHIqIFJIU0V4cHIpCisgICAgICA6IEtpbmQoVW5pbml0aWFsaXplZCkgeworICAgIE1ha2VBZGRyTGFiZWxEaWZmKCk7IHNldEFkZHJMYWJlbERpZmYoTEhTRXhwciwgUkhTRXhwcik7CisgIH0KKworICB+QVBWYWx1ZSgpIHsKKyAgICBNYWtlVW5pbml0KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgd2hldGhlciB0aGUgb2JqZWN0IHBlcmZvcm1lZCBhbGxvY2F0aW9ucy4KKyAgLy8vCisgIC8vLyBJZiBBUFZhbHVlcyBhcmUgY29uc3RydWN0ZWQgdmlhIHBsYWNlbWVudCBuZXcsIFxjIG5lZWRzQ2xlYW51cCgpCisgIC8vLyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGVzdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCBpbiBvcmRlciB0byBjb3JyZWN0bHkKKyAgLy8vIGZyZWUgYWxsIGFsbG9jYXRlZCBtZW1vcnkuCisgIGJvb2wgbmVlZHNDbGVhbnVwKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTd2FwcyB0aGUgY29udGVudHMgb2YgdGhpcyBhbmQgdGhlIGdpdmVuIEFQVmFsdWUuCisgIHZvaWQgc3dhcChBUFZhbHVlICZSSFMpOworCisgIFZhbHVlS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorICBib29sIGlzVW5pbml0KCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBVbmluaXRpYWxpemVkOyB9CisgIGJvb2wgaXNJbnQoKSBjb25zdCB7IHJldHVybiBLaW5kID09IEludDsgfQorICBib29sIGlzRmxvYXQoKSBjb25zdCB7IHJldHVybiBLaW5kID09IEZsb2F0OyB9CisgIGJvb2wgaXNDb21wbGV4SW50KCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBDb21wbGV4SW50OyB9CisgIGJvb2wgaXNDb21wbGV4RmxvYXQoKSBjb25zdCB7IHJldHVybiBLaW5kID09IENvbXBsZXhGbG9hdDsgfQorICBib29sIGlzTFZhbHVlKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBMVmFsdWU7IH0KKyAgYm9vbCBpc1ZlY3RvcigpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gVmVjdG9yOyB9CisgIGJvb2wgaXNBcnJheSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gQXJyYXk7IH0KKyAgYm9vbCBpc1N0cnVjdCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gU3RydWN0OyB9CisgIGJvb2wgaXNVbmlvbigpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gVW5pb247IH0KKyAgYm9vbCBpc01lbWJlclBvaW50ZXIoKSBjb25zdCB7IHJldHVybiBLaW5kID09IE1lbWJlclBvaW50ZXI7IH0KKyAgYm9vbCBpc0FkZHJMYWJlbERpZmYoKSBjb25zdCB7IHJldHVybiBLaW5kID09IEFkZHJMYWJlbERpZmY7IH0KKworICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIEFTVENvbnRleHQgJkN0eCwgUXVhbFR5cGUgVHkpIGNvbnN0OworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZyhBU1RDb250ZXh0ICZDdHgsIFF1YWxUeXBlIFR5KSBjb25zdDsKKworICBBUFNJbnQgJmdldEludCgpIHsKKyAgICBhc3NlcnQoaXNJbnQoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOworICAgIHJldHVybiAqKEFQU0ludCopKGNoYXIqKURhdGEuYnVmZmVyOworICB9CisgIGNvbnN0IEFQU0ludCAmZ2V0SW50KCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PEFQVmFsdWUqPih0aGlzKS0+Z2V0SW50KCk7CisgIH0KKworICBBUEZsb2F0ICZnZXRGbG9hdCgpIHsKKyAgICBhc3NlcnQoaXNGbG9hdCgpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7CisgICAgcmV0dXJuICooQVBGbG9hdCopKGNoYXIqKURhdGEuYnVmZmVyOworICB9CisgIGNvbnN0IEFQRmxvYXQgJmdldEZsb2F0KCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PEFQVmFsdWUqPih0aGlzKS0+Z2V0RmxvYXQoKTsKKyAgfQorCisgIEFQU0ludCAmZ2V0Q29tcGxleEludFJlYWwoKSB7CisgICAgYXNzZXJ0KGlzQ29tcGxleEludCgpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7CisgICAgcmV0dXJuICgoQ29tcGxleEFQU0ludCopKGNoYXIqKURhdGEuYnVmZmVyKS0+UmVhbDsKKyAgfQorICBjb25zdCBBUFNJbnQgJmdldENvbXBsZXhJbnRSZWFsKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PEFQVmFsdWUqPih0aGlzKS0+Z2V0Q29tcGxleEludFJlYWwoKTsKKyAgfQorCisgIEFQU0ludCAmZ2V0Q29tcGxleEludEltYWcoKSB7CisgICAgYXNzZXJ0KGlzQ29tcGxleEludCgpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7CisgICAgcmV0dXJuICgoQ29tcGxleEFQU0ludCopKGNoYXIqKURhdGEuYnVmZmVyKS0+SW1hZzsKKyAgfQorICBjb25zdCBBUFNJbnQgJmdldENvbXBsZXhJbnRJbWFnKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PEFQVmFsdWUqPih0aGlzKS0+Z2V0Q29tcGxleEludEltYWcoKTsKKyAgfQorCisgIEFQRmxvYXQgJmdldENvbXBsZXhGbG9hdFJlYWwoKSB7CisgICAgYXNzZXJ0KGlzQ29tcGxleEZsb2F0KCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gKChDb21wbGV4QVBGbG9hdCopKGNoYXIqKURhdGEuYnVmZmVyKS0+UmVhbDsKKyAgfQorICBjb25zdCBBUEZsb2F0ICZnZXRDb21wbGV4RmxvYXRSZWFsKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PEFQVmFsdWUqPih0aGlzKS0+Z2V0Q29tcGxleEZsb2F0UmVhbCgpOworICB9CisKKyAgQVBGbG9hdCAmZ2V0Q29tcGxleEZsb2F0SW1hZygpIHsKKyAgICBhc3NlcnQoaXNDb21wbGV4RmxvYXQoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOworICAgIHJldHVybiAoKENvbXBsZXhBUEZsb2F0KikoY2hhciopRGF0YS5idWZmZXIpLT5JbWFnOworICB9CisgIGNvbnN0IEFQRmxvYXQgJmdldENvbXBsZXhGbG9hdEltYWcoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QVBWYWx1ZSo+KHRoaXMpLT5nZXRDb21wbGV4RmxvYXRJbWFnKCk7CisgIH0KKworICBjb25zdCBMVmFsdWVCYXNlIGdldExWYWx1ZUJhc2UoKSBjb25zdDsKKyAgQ2hhclVuaXRzICZnZXRMVmFsdWVPZmZzZXQoKTsKKyAgY29uc3QgQ2hhclVuaXRzICZnZXRMVmFsdWVPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QVBWYWx1ZSo+KHRoaXMpLT5nZXRMVmFsdWVPZmZzZXQoKTsKKyAgfQorICBib29sIGlzTFZhbHVlT25lUGFzdFRoZUVuZCgpIGNvbnN0OworICBib29sIGhhc0xWYWx1ZVBhdGgoKSBjb25zdDsKKyAgQXJyYXlSZWY8TFZhbHVlUGF0aEVudHJ5PiBnZXRMVmFsdWVQYXRoKCkgY29uc3Q7CisgIHVuc2lnbmVkIGdldExWYWx1ZUNhbGxJbmRleCgpIGNvbnN0OworICBib29sIGlzTnVsbFBvaW50ZXIoKSBjb25zdDsKKworICBBUFZhbHVlICZnZXRWZWN0b3JFbHQodW5zaWduZWQgSSkgeworICAgIGFzc2VydChpc1ZlY3RvcigpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7CisgICAgYXNzZXJ0KEkgPCBnZXRWZWN0b3JMZW5ndGgoKSAmJiAiSW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgcmV0dXJuICgoVmVjKikoY2hhciopRGF0YS5idWZmZXIpLT5FbHRzW0ldOworICB9CisgIGNvbnN0IEFQVmFsdWUgJmdldFZlY3RvckVsdCh1bnNpZ25lZCBJKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QVBWYWx1ZSo+KHRoaXMpLT5nZXRWZWN0b3JFbHQoSSk7CisgIH0KKyAgdW5zaWduZWQgZ2V0VmVjdG9yTGVuZ3RoKCkgY29uc3QgeworICAgIGFzc2VydChpc1ZlY3RvcigpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7CisgICAgcmV0dXJuICgoY29uc3QgVmVjKikoY29uc3Qgdm9pZCAqKURhdGEuYnVmZmVyKS0+TnVtRWx0czsKKyAgfQorCisgIEFQVmFsdWUgJmdldEFycmF5SW5pdGlhbGl6ZWRFbHQodW5zaWduZWQgSSkgeworICAgIGFzc2VydChpc0FycmF5KCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKKyAgICBhc3NlcnQoSSA8IGdldEFycmF5SW5pdGlhbGl6ZWRFbHRzKCkgJiYgIkluZGV4IG91dCBvZiByYW5nZSIpOworICAgIHJldHVybiAoKEFyciopKGNoYXIqKURhdGEuYnVmZmVyKS0+RWx0c1tJXTsKKyAgfQorICBjb25zdCBBUFZhbHVlICZnZXRBcnJheUluaXRpYWxpemVkRWx0KHVuc2lnbmVkIEkpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxBUFZhbHVlKj4odGhpcyktPmdldEFycmF5SW5pdGlhbGl6ZWRFbHQoSSk7CisgIH0KKyAgYm9vbCBoYXNBcnJheUZpbGxlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QXJyYXlJbml0aWFsaXplZEVsdHMoKSAhPSBnZXRBcnJheVNpemUoKTsKKyAgfQorICBBUFZhbHVlICZnZXRBcnJheUZpbGxlcigpIHsKKyAgICBhc3NlcnQoaXNBcnJheSgpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7CisgICAgYXNzZXJ0KGhhc0FycmF5RmlsbGVyKCkgJiYgIk5vIGFycmF5IGZpbGxlciIpOworICAgIHJldHVybiAoKEFyciopKGNoYXIqKURhdGEuYnVmZmVyKS0+RWx0c1tnZXRBcnJheUluaXRpYWxpemVkRWx0cygpXTsKKyAgfQorICBjb25zdCBBUFZhbHVlICZnZXRBcnJheUZpbGxlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxBUFZhbHVlKj4odGhpcyktPmdldEFycmF5RmlsbGVyKCk7CisgIH0KKyAgdW5zaWduZWQgZ2V0QXJyYXlJbml0aWFsaXplZEVsdHMoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQXJyYXkoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOworICAgIHJldHVybiAoKGNvbnN0IEFyciopKGNvbnN0IHZvaWQgKilEYXRhLmJ1ZmZlciktPk51bUVsdHM7CisgIH0KKyAgdW5zaWduZWQgZ2V0QXJyYXlTaXplKCkgY29uc3QgeworICAgIGFzc2VydChpc0FycmF5KCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gKChjb25zdCBBcnIqKShjb25zdCB2b2lkICopRGF0YS5idWZmZXIpLT5BcnJTaXplOworICB9CisKKyAgdW5zaWduZWQgZ2V0U3RydWN0TnVtQmFzZXMoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzU3RydWN0KCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gKChjb25zdCBTdHJ1Y3REYXRhKikoY29uc3QgY2hhciopRGF0YS5idWZmZXIpLT5OdW1CYXNlczsKKyAgfQorICB1bnNpZ25lZCBnZXRTdHJ1Y3ROdW1GaWVsZHMoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzU3RydWN0KCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gKChjb25zdCBTdHJ1Y3REYXRhKikoY29uc3QgY2hhciopRGF0YS5idWZmZXIpLT5OdW1GaWVsZHM7CisgIH0KKyAgQVBWYWx1ZSAmZ2V0U3RydWN0QmFzZSh1bnNpZ25lZCBpKSB7CisgICAgYXNzZXJ0KGlzU3RydWN0KCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gKChTdHJ1Y3REYXRhKikoY2hhciopRGF0YS5idWZmZXIpLT5FbHRzW2ldOworICB9CisgIEFQVmFsdWUgJmdldFN0cnVjdEZpZWxkKHVuc2lnbmVkIGkpIHsKKyAgICBhc3NlcnQoaXNTdHJ1Y3QoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOworICAgIHJldHVybiAoKFN0cnVjdERhdGEqKShjaGFyKilEYXRhLmJ1ZmZlciktPkVsdHNbZ2V0U3RydWN0TnVtQmFzZXMoKSArIGldOworICB9CisgIGNvbnN0IEFQVmFsdWUgJmdldFN0cnVjdEJhc2UodW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PEFQVmFsdWUqPih0aGlzKS0+Z2V0U3RydWN0QmFzZShpKTsKKyAgfQorICBjb25zdCBBUFZhbHVlICZnZXRTdHJ1Y3RGaWVsZCh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QVBWYWx1ZSo+KHRoaXMpLT5nZXRTdHJ1Y3RGaWVsZChpKTsKKyAgfQorCisgIGNvbnN0IEZpZWxkRGVjbCAqZ2V0VW5pb25GaWVsZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNVbmlvbigpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7CisgICAgcmV0dXJuICgoY29uc3QgVW5pb25EYXRhKikoY29uc3QgY2hhciopRGF0YS5idWZmZXIpLT5GaWVsZDsKKyAgfQorICBBUFZhbHVlICZnZXRVbmlvblZhbHVlKCkgeworICAgIGFzc2VydChpc1VuaW9uKCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gKigoVW5pb25EYXRhKikoY2hhciopRGF0YS5idWZmZXIpLT5WYWx1ZTsKKyAgfQorICBjb25zdCBBUFZhbHVlICZnZXRVbmlvblZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PEFQVmFsdWUqPih0aGlzKS0+Z2V0VW5pb25WYWx1ZSgpOworICB9CisKKyAgY29uc3QgVmFsdWVEZWNsICpnZXRNZW1iZXJQb2ludGVyRGVjbCgpIGNvbnN0OworICBib29sIGlzTWVtYmVyUG9pbnRlclRvRGVyaXZlZE1lbWJlcigpIGNvbnN0OworICBBcnJheVJlZjxjb25zdCBDWFhSZWNvcmREZWNsKj4gZ2V0TWVtYmVyUG9pbnRlclBhdGgoKSBjb25zdDsKKworICBjb25zdCBBZGRyTGFiZWxFeHByKiBnZXRBZGRyTGFiZWxEaWZmTEhTKCkgY29uc3QgeworICAgIGFzc2VydChpc0FkZHJMYWJlbERpZmYoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOworICAgIHJldHVybiAoKGNvbnN0IEFkZHJMYWJlbERpZmZEYXRhKikoY29uc3QgY2hhciopRGF0YS5idWZmZXIpLT5MSFNFeHByOworICB9CisgIGNvbnN0IEFkZHJMYWJlbEV4cHIqIGdldEFkZHJMYWJlbERpZmZSSFMoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQWRkckxhYmVsRGlmZigpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7CisgICAgcmV0dXJuICgoY29uc3QgQWRkckxhYmVsRGlmZkRhdGEqKShjb25zdCBjaGFyKilEYXRhLmJ1ZmZlciktPlJIU0V4cHI7CisgIH0KKworICB2b2lkIHNldEludChBUFNJbnQgSSkgeworICAgIGFzc2VydChpc0ludCgpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7CisgICAgKihBUFNJbnQgKikoY2hhciAqKURhdGEuYnVmZmVyID0gc3RkOjptb3ZlKEkpOworICB9CisgIHZvaWQgc2V0RmxvYXQoQVBGbG9hdCBGKSB7CisgICAgYXNzZXJ0KGlzRmxvYXQoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOworICAgICooQVBGbG9hdCAqKShjaGFyICopRGF0YS5idWZmZXIgPSBzdGQ6Om1vdmUoRik7CisgIH0KKyAgdm9pZCBzZXRWZWN0b3IoY29uc3QgQVBWYWx1ZSAqRSwgdW5zaWduZWQgTikgeworICAgIGFzc2VydChpc1ZlY3RvcigpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7CisgICAgKChWZWMqKShjaGFyKilEYXRhLmJ1ZmZlciktPkVsdHMgPSBuZXcgQVBWYWx1ZVtOXTsKKyAgICAoKFZlYyopKGNoYXIqKURhdGEuYnVmZmVyKS0+TnVtRWx0cyA9IE47CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOOyArK2kpCisgICAgICAoKFZlYyopKGNoYXIqKURhdGEuYnVmZmVyKS0+RWx0c1tpXSA9IEVbaV07CisgIH0KKyAgdm9pZCBzZXRDb21wbGV4SW50KEFQU0ludCBSLCBBUFNJbnQgSSkgeworICAgIGFzc2VydChSLmdldEJpdFdpZHRoKCkgPT0gSS5nZXRCaXRXaWR0aCgpICYmCisgICAgICAgICAgICJJbnZhbGlkIGNvbXBsZXggaW50ICh0eXBlIG1pc21hdGNoKS4iKTsKKyAgICBhc3NlcnQoaXNDb21wbGV4SW50KCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKKyAgICAoKENvbXBsZXhBUFNJbnQgKikoY2hhciAqKURhdGEuYnVmZmVyKS0+UmVhbCA9IHN0ZDo6bW92ZShSKTsKKyAgICAoKENvbXBsZXhBUFNJbnQgKikoY2hhciAqKURhdGEuYnVmZmVyKS0+SW1hZyA9IHN0ZDo6bW92ZShJKTsKKyAgfQorICB2b2lkIHNldENvbXBsZXhGbG9hdChBUEZsb2F0IFIsIEFQRmxvYXQgSSkgeworICAgIGFzc2VydCgmUi5nZXRTZW1hbnRpY3MoKSA9PSAmSS5nZXRTZW1hbnRpY3MoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBjb21wbGV4IGZsb2F0ICh0eXBlIG1pc21hdGNoKS4iKTsKKyAgICBhc3NlcnQoaXNDb21wbGV4RmxvYXQoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOworICAgICgoQ29tcGxleEFQRmxvYXQgKikoY2hhciAqKURhdGEuYnVmZmVyKS0+UmVhbCA9IHN0ZDo6bW92ZShSKTsKKyAgICAoKENvbXBsZXhBUEZsb2F0ICopKGNoYXIgKilEYXRhLmJ1ZmZlciktPkltYWcgPSBzdGQ6Om1vdmUoSSk7CisgIH0KKyAgdm9pZCBzZXRMVmFsdWUoTFZhbHVlQmFzZSBCLCBjb25zdCBDaGFyVW5pdHMgJk8sIE5vTFZhbHVlUGF0aCwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2FsbEluZGV4LCBib29sIElzTnVsbFB0cik7CisgIHZvaWQgc2V0TFZhbHVlKExWYWx1ZUJhc2UgQiwgY29uc3QgQ2hhclVuaXRzICZPLAorICAgICAgICAgICAgICAgICBBcnJheVJlZjxMVmFsdWVQYXRoRW50cnk+IFBhdGgsIGJvb2wgT25lUGFzdFRoZUVuZCwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2FsbEluZGV4LCBib29sIElzTnVsbFB0cik7CisgIHZvaWQgc2V0VW5pb24oY29uc3QgRmllbGREZWNsICpGaWVsZCwgY29uc3QgQVBWYWx1ZSAmVmFsdWUpIHsKKyAgICBhc3NlcnQoaXNVbmlvbigpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7CisgICAgKChVbmlvbkRhdGEqKShjaGFyKilEYXRhLmJ1ZmZlciktPkZpZWxkID0gRmllbGQ7CisgICAgKigoVW5pb25EYXRhKikoY2hhciopRGF0YS5idWZmZXIpLT5WYWx1ZSA9IFZhbHVlOworICB9CisgIHZvaWQgc2V0QWRkckxhYmVsRGlmZihjb25zdCBBZGRyTGFiZWxFeHByKiBMSFNFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWRkckxhYmVsRXhwciogUkhTRXhwcikgeworICAgICgoQWRkckxhYmVsRGlmZkRhdGEqKShjaGFyKilEYXRhLmJ1ZmZlciktPkxIU0V4cHIgPSBMSFNFeHByOworICAgICgoQWRkckxhYmVsRGlmZkRhdGEqKShjaGFyKilEYXRhLmJ1ZmZlciktPlJIU0V4cHIgPSBSSFNFeHByOworICB9CisKKyAgLy8vIEFzc2lnbiBieSBzd2FwcGluZyBmcm9tIGEgY29weSBvZiB0aGUgUkhTLgorICBBUFZhbHVlICZvcGVyYXRvcj0oQVBWYWx1ZSBSSFMpIHsKKyAgICBzd2FwKFJIUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgRGVzdHJveURhdGFBbmRNYWtlVW5pbml0KCk7CisgIHZvaWQgTWFrZVVuaW5pdCgpIHsKKyAgICBpZiAoS2luZCAhPSBVbmluaXRpYWxpemVkKQorICAgICAgRGVzdHJveURhdGFBbmRNYWtlVW5pbml0KCk7CisgIH0KKyAgdm9pZCBNYWtlSW50KCkgeworICAgIGFzc2VydChpc1VuaW5pdCgpICYmICJCYWQgc3RhdGUgY2hhbmdlIik7CisgICAgbmV3ICgodm9pZCopRGF0YS5idWZmZXIpIEFQU0ludCgxKTsKKyAgICBLaW5kID0gSW50OworICB9CisgIHZvaWQgTWFrZUZsb2F0KCkgeworICAgIGFzc2VydChpc1VuaW5pdCgpICYmICJCYWQgc3RhdGUgY2hhbmdlIik7CisgICAgbmV3ICgodm9pZCopKGNoYXIqKURhdGEuYnVmZmVyKSBBUEZsb2F0KDAuMCk7CisgICAgS2luZCA9IEZsb2F0OworICB9CisgIHZvaWQgTWFrZVZlY3RvcigpIHsKKyAgICBhc3NlcnQoaXNVbmluaXQoKSAmJiAiQmFkIHN0YXRlIGNoYW5nZSIpOworICAgIG5ldyAoKHZvaWQqKShjaGFyKilEYXRhLmJ1ZmZlcikgVmVjKCk7CisgICAgS2luZCA9IFZlY3RvcjsKKyAgfQorICB2b2lkIE1ha2VDb21wbGV4SW50KCkgeworICAgIGFzc2VydChpc1VuaW5pdCgpICYmICJCYWQgc3RhdGUgY2hhbmdlIik7CisgICAgbmV3ICgodm9pZCopKGNoYXIqKURhdGEuYnVmZmVyKSBDb21wbGV4QVBTSW50KCk7CisgICAgS2luZCA9IENvbXBsZXhJbnQ7CisgIH0KKyAgdm9pZCBNYWtlQ29tcGxleEZsb2F0KCkgeworICAgIGFzc2VydChpc1VuaW5pdCgpICYmICJCYWQgc3RhdGUgY2hhbmdlIik7CisgICAgbmV3ICgodm9pZCopKGNoYXIqKURhdGEuYnVmZmVyKSBDb21wbGV4QVBGbG9hdCgpOworICAgIEtpbmQgPSBDb21wbGV4RmxvYXQ7CisgIH0KKyAgdm9pZCBNYWtlTFZhbHVlKCk7CisgIHZvaWQgTWFrZUFycmF5KHVuc2lnbmVkIEluaXRFbHRzLCB1bnNpZ25lZCBTaXplKTsKKyAgdm9pZCBNYWtlU3RydWN0KHVuc2lnbmVkIEIsIHVuc2lnbmVkIE0pIHsKKyAgICBhc3NlcnQoaXNVbmluaXQoKSAmJiAiQmFkIHN0YXRlIGNoYW5nZSIpOworICAgIG5ldyAoKHZvaWQqKShjaGFyKilEYXRhLmJ1ZmZlcikgU3RydWN0RGF0YShCLCBNKTsKKyAgICBLaW5kID0gU3RydWN0OworICB9CisgIHZvaWQgTWFrZVVuaW9uKCkgeworICAgIGFzc2VydChpc1VuaW5pdCgpICYmICJCYWQgc3RhdGUgY2hhbmdlIik7CisgICAgbmV3ICgodm9pZCopKGNoYXIqKURhdGEuYnVmZmVyKSBVbmlvbkRhdGEoKTsKKyAgICBLaW5kID0gVW5pb247CisgIH0KKyAgdm9pZCBNYWtlTWVtYmVyUG9pbnRlcihjb25zdCBWYWx1ZURlY2wgKk1lbWJlciwgYm9vbCBJc0Rlcml2ZWRNZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgQ1hYUmVjb3JkRGVjbCo+IFBhdGgpOworICB2b2lkIE1ha2VBZGRyTGFiZWxEaWZmKCkgeworICAgIGFzc2VydChpc1VuaW5pdCgpICYmICJCYWQgc3RhdGUgY2hhbmdlIik7CisgICAgbmV3ICgodm9pZCopKGNoYXIqKURhdGEuYnVmZmVyKSBBZGRyTGFiZWxEaWZmRGF0YSgpOworICAgIEtpbmQgPSBBZGRyTGFiZWxEaWZmOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcuCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0FTVC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0FTVC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjM1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQVNULmgKQEAgLTAsMCArMSwyOCBAQAorLy89PT0tLS0gQVNULmggLSAiVW1icmVsbGEiIGhlYWRlciBmb3IgQVNUIGxpYnJhcnkgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSB0byB0aGUgQVNUIGNsYXNzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9BU1RfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9BU1RfSAorCisvLyBUaGlzIGhlYWRlciBleHBvcnRzIGFsbCBBU1QgaW50ZXJmYWNlcy4KKyNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDWFguaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbE9iakMuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbFRlbXBsYXRlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHIuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXhwck9iakMuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdFZpc2l0b3IuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BU1RDb25zdW1lci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0FTVENvbnN1bWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQzNjhjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BU1RDb25zdW1lci5oCkBAIC0wLDAgKzEsMTQ2IEBACisvLz09PS0tLSBBU1RDb25zdW1lci5oIC0gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciByZWFkaW5nIEFTVHMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQVNUQ29uc3VtZXIgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9BU1RDT05TVU1FUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX0FTVENPTlNVTUVSX0gKKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgY2xhc3MgQVNUQ29udGV4dDsKKyAgY2xhc3MgQ1hYTWV0aG9kRGVjbDsKKyAgY2xhc3MgQ1hYUmVjb3JkRGVjbDsKKyAgY2xhc3MgRGVjbDsKKyAgY2xhc3MgRGVjbEdyb3VwUmVmOworICBjbGFzcyBBU1RNdXRhdGlvbkxpc3RlbmVyOworICBjbGFzcyBBU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lcjsgLy8gbGF5ZXJpbmcgdmlvbGF0aW9uIGJlY2F1c2Ugdm9pZCogaXMgdWdseQorICBjbGFzcyBTZW1hQ29uc3VtZXI7IC8vIGxheWVyaW5nIHZpb2xhdGlvbiByZXF1aXJlZCBmb3Igc2FmZSBTZW1hQ29uc3VtZXIKKyAgY2xhc3MgVGFnRGVjbDsKKyAgY2xhc3MgVmFyRGVjbDsKKyAgY2xhc3MgRnVuY3Rpb25EZWNsOworICBjbGFzcyBJbXBvcnREZWNsOworCisvLy8gQVNUQ29uc3VtZXIgLSBUaGlzIGlzIGFuIGFic3RyYWN0IGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieQorLy8vIGNsaWVudHMgdGhhdCByZWFkIEFTVHMuICBUaGlzIGFic3RyYWN0aW9uIGxheWVyIGFsbG93cyB0aGUgY2xpZW50IHRvIGJlCisvLy8gaW5kZXBlbmRlbnQgb2YgdGhlIEFTVCBwcm9kdWNlciAoZS5nLiBwYXJzZXIgdnMgQVNUIGR1bXAgZmlsZSByZWFkZXIsIGV0YykuCitjbGFzcyBBU1RDb25zdW1lciB7CisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIEFTVCBjb25zdW1lciBhbHNvIHJlcXVpcmVzIGluZm9ybWF0aW9uIGFib3V0CisgIC8vLyBzZW1hbnRpYyBhbmFseXNpcy4KKyAgYm9vbCBTZW1hQ29uc3VtZXI7CisKKyAgZnJpZW5kIGNsYXNzIFNlbWFDb25zdW1lcjsKKworcHVibGljOgorICBBU1RDb25zdW1lcigpIDogU2VtYUNvbnN1bWVyKGZhbHNlKSB7IH0KKworICB2aXJ0dWFsIH5BU1RDb25zdW1lcigpIHt9CisKKyAgLy8vIEluaXRpYWxpemUgLSBUaGlzIGlzIGNhbGxlZCB0byBpbml0aWFsaXplIHRoZSBjb25zdW1lciwgcHJvdmlkaW5nIHRoZQorICAvLy8gQVNUQ29udGV4dC4KKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoQVNUQ29udGV4dCAmQ29udGV4dCkge30KKworICAvLy8gSGFuZGxlVG9wTGV2ZWxEZWNsIC0gSGFuZGxlIHRoZSBzcGVjaWZpZWQgdG9wLWxldmVsIGRlY2xhcmF0aW9uLiAgVGhpcyBpcworICAvLy8gY2FsbGVkIGJ5IHRoZSBwYXJzZXIgdG8gcHJvY2VzcyBldmVyeSB0b3AtbGV2ZWwgRGVjbCouCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSB0byBjb250aW51ZSBwYXJzaW5nLCBvciBmYWxzZSB0byBhYm9ydCBwYXJzaW5nLgorICB2aXJ0dWFsIGJvb2wgSGFuZGxlVG9wTGV2ZWxEZWNsKERlY2xHcm91cFJlZiBEKTsKKworICAvLy8gXGJyaWVmIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBlYWNoIHRpbWUgYW4gaW5saW5lIChtZXRob2Qgb3IgZnJpZW5kKQorICAvLy8gZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBhIGNsYXNzIGlzIGNvbXBsZXRlZC4KKyAgdmlydHVhbCB2b2lkIEhhbmRsZUlubGluZUZ1bmN0aW9uRGVmaW5pdGlvbihGdW5jdGlvbkRlY2wgKkQpIHt9CisKKyAgLy8vIEhhbmRsZUludGVyZXN0aW5nRGVjbCAtIEhhbmRsZSB0aGUgc3BlY2lmaWVkIGludGVyZXN0aW5nIGRlY2xhcmF0aW9uLiBUaGlzCisgIC8vLyBpcyBjYWxsZWQgYnkgdGhlIEFTVCByZWFkZXIgd2hlbiBkZXNlcmlhbGl6aW5nIHRoaW5ncyB0aGF0IG1pZ2h0IGludGVyZXN0CisgIC8vLyB0aGUgY29uc3VtZXIuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvcndhcmRzIHRvIEhhbmRsZVRvcExldmVsRGVjbC4KKyAgdmlydHVhbCB2b2lkIEhhbmRsZUludGVyZXN0aW5nRGVjbChEZWNsR3JvdXBSZWYgRCk7CisKKyAgLy8vIEhhbmRsZVRyYW5zbGF0aW9uVW5pdCAtIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBBU1RzIGZvciBlbnRpcmUKKyAgLy8vIHRyYW5zbGF0aW9uIHVuaXQgaGF2ZSBiZWVuIHBhcnNlZC4KKyAgdmlydHVhbCB2b2lkIEhhbmRsZVRyYW5zbGF0aW9uVW5pdChBU1RDb250ZXh0ICZDdHgpIHt9CisKKyAgLy8vIEhhbmRsZVRhZ0RlY2xEZWZpbml0aW9uIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGVhY2ggdGltZSBhIFRhZ0RlY2wKKyAgLy8vIChlLmcuIHN0cnVjdCwgdW5pb24sIGVudW0sIGNsYXNzKSBpcyBjb21wbGV0ZWQuICBUaGlzIGFsbG93cyB0aGUgY2xpZW50IHRvCisgIC8vLyBoYWNrIG9uIHRoZSB0eXBlLCB3aGljaCBjYW4gb2NjdXIgYXQgYW55IHBvaW50IGluIHRoZSBmaWxlIChiZWNhdXNlIHRoZXNlCisgIC8vLyBjYW4gYmUgZGVmaW5lZCBpbiBkZWNsc3BlY3MpLgorICB2aXJ0dWFsIHZvaWQgSGFuZGxlVGFnRGVjbERlZmluaXRpb24oVGFnRGVjbCAqRCkge30KKworICAvLy8gXGJyaWVmIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB0aGUgZmlyc3QgdGltZSBlYWNoIFRhZ0RlY2wgaXMgcmVxdWlyZWQgdG8KKyAgLy8vIGJlIGNvbXBsZXRlLgorICB2aXJ0dWFsIHZvaWQgSGFuZGxlVGFnRGVjbFJlcXVpcmVkRGVmaW5pdGlvbihjb25zdCBUYWdEZWNsICpEKSB7fQorCisgIC8vLyBcYnJpZWYgSW52b2tlZCB3aGVuIGEgZnVuY3Rpb24gaXMgaW1wbGljaXRseSBpbnN0YW50aWF0ZWQuCisgIC8vLyBOb3RlIHRoYXQgYXQgdGhpcyBwb2ludCBwb2ludCBpdCBkb2VzIG5vdCBoYXZlIGEgYm9keSwgaXRzIGJvZHkgaXMKKyAgLy8vIGluc3RhbnRpYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSB0cmFuc2xhdGlvbiB1bml0IGFuZCBwYXNzZWQgdG8KKyAgLy8vIEhhbmRsZVRvcExldmVsRGVjbC4KKyAgdmlydHVhbCB2b2lkIEhhbmRsZUNYWEltcGxpY2l0RnVuY3Rpb25JbnN0YW50aWF0aW9uKEZ1bmN0aW9uRGVjbCAqRCkge30KKworICAvLy8gXGJyaWVmIEhhbmRsZSB0aGUgc3BlY2lmaWVkIHRvcC1sZXZlbCBkZWNsYXJhdGlvbiB0aGF0IG9jY3VycmVkIGluc2lkZQorICAvLy8gYW5kIE9iakMgY29udGFpbmVyLgorICAvLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaWdub3JlZCB0aGVtLgorICB2aXJ0dWFsIHZvaWQgSGFuZGxlVG9wTGV2ZWxEZWNsSW5PYmpDQ29udGFpbmVyKERlY2xHcm91cFJlZiBEKTsKKworICAvLy8gXGJyaWVmIEhhbmRsZSBhbiBJbXBvcnREZWNsIHRoYXQgd2FzIGltcGxpY2l0bHkgY3JlYXRlZCBkdWUgdG8gYW4KKyAgLy8vIGluY2x1c2lvbiBkaXJlY3RpdmUuCisgIC8vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwYXNzZXMgaXQgdG8gSGFuZGxlVG9wTGV2ZWxEZWNsLgorICB2aXJ0dWFsIHZvaWQgSGFuZGxlSW1wbGljaXRJbXBvcnREZWNsKEltcG9ydERlY2wgKkQpOworCisgIC8vLyBDb21wbGV0ZVRlbnRhdGl2ZURlZmluaXRpb24gLSBDYWxsYmFjayBpbnZva2VkIGF0IHRoZSBlbmQgb2YgYSB0cmFuc2xhdGlvbgorICAvLy8gdW5pdCB0byBub3RpZnkgdGhlIGNvbnN1bWVyIHRoYXQgdGhlIGdpdmVuIHRlbnRhdGl2ZSBkZWZpbml0aW9uIHNob3VsZCBiZQorICAvLy8gY29tcGxldGVkLgorICAvLy8KKyAgLy8vIFRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBpdHNlbGYgd2lsbCBiZSBhIHRlbnRhdGl2ZQorICAvLy8gZGVmaW5pdGlvbi4gSWYgaXQgaGFkIGFuIGluY29tcGxldGUgYXJyYXkgdHlwZSwgaXRzIHR5cGUgd2lsbAorICAvLy8gaGF2ZSBhbHJlYWR5IGJlZW4gY2hhbmdlZCB0byBhbiBhcnJheSBvZiBzaXplIDEuIEhvd2V2ZXIsIHRoZQorICAvLy8gZGVjbGFyYXRpb24gcmVtYWlucyBhIHRlbnRhdGl2ZSBkZWZpbml0aW9uIGFuZCBoYXMgbm90IGJlZW4KKyAgLy8vIG1vZGlmaWVkIGJ5IHRoZSBpbnRyb2R1Y3Rpb24gb2YgYW4gaW1wbGljaXQgemVybyBpbml0aWFsaXplci4KKyAgdmlydHVhbCB2b2lkIENvbXBsZXRlVGVudGF0aXZlRGVmaW5pdGlvbihWYXJEZWNsICpEKSB7fQorCisgIC8vLyBcYnJpZWYgQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGFuIE1TSW5oZXJpdGFuY2VBdHRyIGhhcyBiZWVuIGF0dGFjaGVkIHRvIGEKKyAgLy8vIENYWFJlY29yZERlY2wuCisgIHZpcnR1YWwgdm9pZCBBc3NpZ25Jbmhlcml0YW5jZU1vZGVsKENYWFJlY29yZERlY2wgKlJEKSB7fQorCisgIC8vLyBIYW5kbGVDWFhTdGF0aWNNZW1iZXJWYXJJbnN0YW50aWF0aW9uIC0gVGVsbCB0aGUgY29uc3VtZXIgdGhhdCB0aGlzCisgIC8vIHZhcmlhYmxlIGhhcyBiZWVuIGluc3RhbnRpYXRlZC4KKyAgdmlydHVhbCB2b2lkIEhhbmRsZUNYWFN0YXRpY01lbWJlclZhckluc3RhbnRpYXRpb24oVmFyRGVjbCAqRCkge30KKworICAvLy8gXGJyaWVmIENhbGxiYWNrIGludm9sdmVkIGF0IHRoZSBlbmQgb2YgYSB0cmFuc2xhdGlvbiB1bml0IHRvCisgIC8vLyBub3RpZnkgdGhlIGNvbnN1bWVyIHRoYXQgYSB2dGFibGUgZm9yIHRoZSBnaXZlbiBDKysgY2xhc3MgaXMKKyAgLy8vIHJlcXVpcmVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSRCBUaGUgY2xhc3Mgd2hvc2UgdnRhYmxlIHdhcyB1c2VkLgorICB2aXJ0dWFsIHZvaWQgSGFuZGxlVlRhYmxlKENYWFJlY29yZERlY2wgKlJEKSB7fQorCisgIC8vLyBcYnJpZWYgSWYgdGhlIGNvbnN1bWVyIGlzIGludGVyZXN0ZWQgaW4gZW50aXRpZXMgZ2V0dGluZyBtb2RpZmllZCBhZnRlcgorICAvLy8gdGhlaXIgaW5pdGlhbCBjcmVhdGlvbiwgaXQgc2hvdWxkIHJldHVybiBhIHBvaW50ZXIgdG8KKyAgLy8vIGFuIEFTVE11dGF0aW9uTGlzdGVuZXIgaGVyZS4KKyAgdmlydHVhbCBBU1RNdXRhdGlvbkxpc3RlbmVyICpHZXRBU1RNdXRhdGlvbkxpc3RlbmVyKCkgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgIC8vLyBcYnJpZWYgSWYgdGhlIGNvbnN1bWVyIGlzIGludGVyZXN0ZWQgaW4gZW50aXRpZXMgYmVpbmcgZGVzZXJpYWxpemVkIGZyb20KKyAgLy8vIEFTVCBmaWxlcywgaXQgc2hvdWxkIHJldHVybiBhIHBvaW50ZXIgdG8gYSBBU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lciBoZXJlCisgIHZpcnR1YWwgQVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXIgKkdldEFTVERlc2VyaWFsaXphdGlvbkxpc3RlbmVyKCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFByaW50U3RhdHMgLSBJZiBkZXNpcmVkLCBwcmludCBhbnkgc3RhdGlzdGljcy4KKyAgdmlydHVhbCB2b2lkIFByaW50U3RhdHMoKSB7fQorCisgIC8vLyBcYnJpZWYgVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgZm9yIGVhY2ggZnVuY3Rpb24gaWYgdGhlIFBhcnNlciB3YXMKKyAgLy8vIGluaXRpYWxpemVkIHdpdGggXGMgU2tpcEZ1bmN0aW9uQm9kaWVzIHNldCB0byBcYyB0cnVlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gXGMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24ncyBib2R5IHNob3VsZCBiZSBza2lwcGVkLiBUaGUgZnVuY3Rpb24KKyAgLy8vIGJvZHkgbWF5IGJlIHBhcnNlZCBhbnl3YXkgaWYgaXQgaXMgbmVlZGVkIChmb3IgaW5zdGFuY2UsIGlmIGl0IGNvbnRhaW5zCisgIC8vLyB0aGUgY29kZSBjb21wbGV0aW9uIHBvaW50IG9yIGlzIGNvbnN0ZXhwcikuCisgIHZpcnR1YWwgYm9vbCBzaG91bGRTa2lwRnVuY3Rpb25Cb2R5KERlY2wgKkQpIHsgcmV0dXJuIHRydWU7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZy4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQVNUQ29udGV4dC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0FTVENvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWIwOTBkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0FTVENvbnRleHQuaApAQCAtMCwwICsxLDI5NzIgQEAKKy8vPT09LSBBU1RDb250ZXh0LmggLSBDb250ZXh0IHRvIGhvbGQgbG9uZy1saXZlZCBBU1Qgbm9kZXMgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgdGhlIGNsYW5nOjpBU1RDb250ZXh0IGludGVyZmFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0FTVENPTlRFWFRfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9BU1RDT05URVhUX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RUeXBlVHJhaXRzLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0Nhbm9uaWNhbFR5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvQ29tbWVudENvbW1hbmRUcmFpdHMuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQmFzZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsYXJhdGlvbk5hbWUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXh0ZXJuYWxBU1RTb3VyY2UuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvTmVzdGVkTmFtZVNwZWNpZmllci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9QcmV0dHlQcmludGVyLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1Jhd0NvbW1lbnRMaXN0LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1RlbXBsYXRlQmFzZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UZW1wbGF0ZU5hbWUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0FkZHJlc3NTcGFjZXMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MaW5rYWdlLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3BlcmF0b3JLaW5kcy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1BhcnRpYWxEaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU2FuaXRpemVyQmxhY2tsaXN0LmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9TcGVjaWZpZXJzLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVGFyZ2V0SW5mby5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1hSYXlMaXN0cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FQU0ludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTWFwVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1RpbnlQdHJWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGlnbk9mLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitzdHJ1Y3QgZmx0U2VtYW50aWNzOworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFQVmFsdWU7CitjbGFzcyBBU1RNdXRhdGlvbkxpc3RlbmVyOworY2xhc3MgQVNUUmVjb3JkTGF5b3V0OworY2xhc3MgQXRvbWljRXhwcjsKK2NsYXNzIEJsb2NrRXhwcjsKK2NsYXNzIEJ1aWx0aW5UZW1wbGF0ZURlY2w7CitjbGFzcyBDaGFyVW5pdHM7CitjbGFzcyBDWFhBQkk7CitjbGFzcyBDWFhDb25zdHJ1Y3RvckRlY2w7CitjbGFzcyBDWFhNZXRob2REZWNsOworY2xhc3MgQ1hYUmVjb3JkRGVjbDsKK2NsYXNzIERpYWdub3N0aWNzRW5naW5lOworY2xhc3MgRXhwcjsKK2NsYXNzIE1hbmdsZUNvbnRleHQ7CitjbGFzcyBNYW5nbGVOdW1iZXJpbmdDb250ZXh0OworY2xhc3MgTWF0ZXJpYWxpemVUZW1wb3JhcnlFeHByOworY2xhc3MgTWVtYmVyU3BlY2lhbGl6YXRpb25JbmZvOworY2xhc3MgTW9kdWxlOworY2xhc3MgT2JqQ0NhdGVnb3J5RGVjbDsKK2NsYXNzIE9iakNDYXRlZ29yeUltcGxEZWNsOworY2xhc3MgT2JqQ0NvbnRhaW5lckRlY2w7CitjbGFzcyBPYmpDSW1wbERlY2w7CitjbGFzcyBPYmpDSW1wbGVtZW50YXRpb25EZWNsOworY2xhc3MgT2JqQ0ludGVyZmFjZURlY2w7CitjbGFzcyBPYmpDSXZhckRlY2w7CitjbGFzcyBPYmpDTWV0aG9kRGVjbDsKK2NsYXNzIE9iakNQcm9wZXJ0eURlY2w7CitjbGFzcyBPYmpDUHJvcGVydHlJbXBsRGVjbDsKK2NsYXNzIE9iakNQcm90b2NvbERlY2w7CitjbGFzcyBPYmpDVHlwZVBhcmFtRGVjbDsKK2NsYXNzIFByZXByb2Nlc3NvcjsKK2NsYXNzIFN0bXQ7CitjbGFzcyBTdG9yZWREZWNsc01hcDsKK2NsYXNzIFRlbXBsYXRlRGVjbDsKK2NsYXNzIFRlbXBsYXRlUGFyYW1ldGVyTGlzdDsKK2NsYXNzIFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbDsKK2NsYXNzIFRlbXBsYXRlVHlwZVBhcm1EZWNsOworY2xhc3MgVW5yZXNvbHZlZFNldEl0ZXJhdG9yOworY2xhc3MgVXNpbmdTaGFkb3dEZWNsOworY2xhc3MgVmFyVGVtcGxhdGVEZWNsOworY2xhc3MgVlRhYmxlQ29udGV4dEJhc2U7CisKK25hbWVzcGFjZSBCdWlsdGluIHsKKworY2xhc3MgQ29udGV4dDsKKworfSAvLyBuYW1lc3BhY2UgQnVpbHRpbgorCitlbnVtIEJ1aWx0aW5UZW1wbGF0ZUtpbmQgOiBpbnQ7CisKK25hbWVzcGFjZSBjb21tZW50cyB7CisKK2NsYXNzIEZ1bGxDb21tZW50OworCit9IC8vIG5hbWVzcGFjZSBjb21tZW50cworCitzdHJ1Y3QgVHlwZUluZm8geworICB1aW50NjRfdCBXaWR0aCA9IDA7CisgIHVuc2lnbmVkIEFsaWduID0gMDsKKyAgYm9vbCBBbGlnbklzUmVxdWlyZWQgOiAxOworCisgIFR5cGVJbmZvKCkgOiBBbGlnbklzUmVxdWlyZWQoZmFsc2UpIHt9CisgIFR5cGVJbmZvKHVpbnQ2NF90IFdpZHRoLCB1bnNpZ25lZCBBbGlnbiwgYm9vbCBBbGlnbklzUmVxdWlyZWQpCisgICAgICA6IFdpZHRoKFdpZHRoKSwgQWxpZ24oQWxpZ24pLCBBbGlnbklzUmVxdWlyZWQoQWxpZ25Jc1JlcXVpcmVkKSB7fQorfTsKKworLy8vIFxicmllZiBIb2xkcyBsb25nLWxpdmVkIEFTVCBub2RlcyAoc3VjaCBhcyB0eXBlcyBhbmQgZGVjbHMpIHRoYXQgY2FuIGJlCisvLy8gcmVmZXJyZWQgdG8gdGhyb3VnaG91dCB0aGUgc2VtYW50aWMgYW5hbHlzaXMgb2YgYSBmaWxlLgorY2xhc3MgQVNUQ29udGV4dCA6IHB1YmxpYyBSZWZDb3VudGVkQmFzZTxBU1RDb250ZXh0PiB7CisgIGZyaWVuZCBjbGFzcyBOZXN0ZWROYW1lU3BlY2lmaWVyOworCisgIG11dGFibGUgU21hbGxWZWN0b3I8VHlwZSAqLCAwPiBUeXBlczsKKyAgbXV0YWJsZSBsbHZtOjpGb2xkaW5nU2V0PEV4dFF1YWxzPiBFeHRRdWFsTm9kZXM7CisgIG11dGFibGUgbGx2bTo6Rm9sZGluZ1NldDxDb21wbGV4VHlwZT4gQ29tcGxleFR5cGVzOworICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8UG9pbnRlclR5cGU+IFBvaW50ZXJUeXBlczsKKyAgbXV0YWJsZSBsbHZtOjpGb2xkaW5nU2V0PEFkanVzdGVkVHlwZT4gQWRqdXN0ZWRUeXBlczsKKyAgbXV0YWJsZSBsbHZtOjpGb2xkaW5nU2V0PEJsb2NrUG9pbnRlclR5cGU+IEJsb2NrUG9pbnRlclR5cGVzOworICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8TFZhbHVlUmVmZXJlbmNlVHlwZT4gTFZhbHVlUmVmZXJlbmNlVHlwZXM7CisgIG11dGFibGUgbGx2bTo6Rm9sZGluZ1NldDxSVmFsdWVSZWZlcmVuY2VUeXBlPiBSVmFsdWVSZWZlcmVuY2VUeXBlczsKKyAgbXV0YWJsZSBsbHZtOjpGb2xkaW5nU2V0PE1lbWJlclBvaW50ZXJUeXBlPiBNZW1iZXJQb2ludGVyVHlwZXM7CisgIG11dGFibGUgbGx2bTo6Rm9sZGluZ1NldDxDb25zdGFudEFycmF5VHlwZT4gQ29uc3RhbnRBcnJheVR5cGVzOworICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8SW5jb21wbGV0ZUFycmF5VHlwZT4gSW5jb21wbGV0ZUFycmF5VHlwZXM7CisgIG11dGFibGUgc3RkOjp2ZWN0b3I8VmFyaWFibGVBcnJheVR5cGUqPiBWYXJpYWJsZUFycmF5VHlwZXM7CisgIG11dGFibGUgbGx2bTo6Rm9sZGluZ1NldDxEZXBlbmRlbnRTaXplZEFycmF5VHlwZT4gRGVwZW5kZW50U2l6ZWRBcnJheVR5cGVzOworICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8RGVwZW5kZW50U2l6ZWRFeHRWZWN0b3JUeXBlPgorICAgIERlcGVuZGVudFNpemVkRXh0VmVjdG9yVHlwZXM7CisgIG11dGFibGUgbGx2bTo6Rm9sZGluZ1NldDxEZXBlbmRlbnRBZGRyZXNzU3BhY2VUeXBlPgorICAgICAgRGVwZW5kZW50QWRkcmVzc1NwYWNlVHlwZXM7CisgIG11dGFibGUgbGx2bTo6Rm9sZGluZ1NldDxWZWN0b3JUeXBlPiBWZWN0b3JUeXBlczsKKyAgbXV0YWJsZSBsbHZtOjpGb2xkaW5nU2V0PEZ1bmN0aW9uTm9Qcm90b1R5cGU+IEZ1bmN0aW9uTm9Qcm90b1R5cGVzOworICBtdXRhYmxlIGxsdm06OkNvbnRleHR1YWxGb2xkaW5nU2V0PEZ1bmN0aW9uUHJvdG9UeXBlLCBBU1RDb250ZXh0Jj4KKyAgICBGdW5jdGlvblByb3RvVHlwZXM7CisgIG11dGFibGUgbGx2bTo6Rm9sZGluZ1NldDxEZXBlbmRlbnRUeXBlT2ZFeHByVHlwZT4gRGVwZW5kZW50VHlwZU9mRXhwclR5cGVzOworICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8RGVwZW5kZW50RGVjbHR5cGVUeXBlPiBEZXBlbmRlbnREZWNsdHlwZVR5cGVzOworICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8VGVtcGxhdGVUeXBlUGFybVR5cGU+IFRlbXBsYXRlVHlwZVBhcm1UeXBlczsKKyAgbXV0YWJsZSBsbHZtOjpGb2xkaW5nU2V0PE9iakNUeXBlUGFyYW1UeXBlPiBPYmpDVHlwZVBhcmFtVHlwZXM7CisgIG11dGFibGUgbGx2bTo6Rm9sZGluZ1NldDxTdWJzdFRlbXBsYXRlVHlwZVBhcm1UeXBlPgorICAgIFN1YnN0VGVtcGxhdGVUeXBlUGFybVR5cGVzOworICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8U3Vic3RUZW1wbGF0ZVR5cGVQYXJtUGFja1R5cGU+CisgICAgU3Vic3RUZW1wbGF0ZVR5cGVQYXJtUGFja1R5cGVzOworICBtdXRhYmxlIGxsdm06OkNvbnRleHR1YWxGb2xkaW5nU2V0PFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlLCBBU1RDb250ZXh0Jj4KKyAgICBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZXM7CisgIG11dGFibGUgbGx2bTo6Rm9sZGluZ1NldDxQYXJlblR5cGU+IFBhcmVuVHlwZXM7CisgIG11dGFibGUgbGx2bTo6Rm9sZGluZ1NldDxFbGFib3JhdGVkVHlwZT4gRWxhYm9yYXRlZFR5cGVzOworICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8RGVwZW5kZW50TmFtZVR5cGU+IERlcGVuZGVudE5hbWVUeXBlczsKKyAgbXV0YWJsZSBsbHZtOjpDb250ZXh0dWFsRm9sZGluZ1NldDxEZXBlbmRlbnRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RDb250ZXh0Jj4KKyAgICBEZXBlbmRlbnRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZXM7CisgIGxsdm06OkZvbGRpbmdTZXQ8UGFja0V4cGFuc2lvblR5cGU+IFBhY2tFeHBhbnNpb25UeXBlczsKKyAgbXV0YWJsZSBsbHZtOjpGb2xkaW5nU2V0PE9iakNPYmplY3RUeXBlSW1wbD4gT2JqQ09iamVjdFR5cGVzOworICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8T2JqQ09iamVjdFBvaW50ZXJUeXBlPiBPYmpDT2JqZWN0UG9pbnRlclR5cGVzOworICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8RGVwZW5kZW50VW5hcnlUcmFuc2Zvcm1UeXBlPgorICAgIERlcGVuZGVudFVuYXJ5VHJhbnNmb3JtVHlwZXM7CisgIG11dGFibGUgbGx2bTo6Rm9sZGluZ1NldDxBdXRvVHlwZT4gQXV0b1R5cGVzOworICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8RGVkdWNlZFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlPgorICAgIERlZHVjZWRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZXM7CisgIG11dGFibGUgbGx2bTo6Rm9sZGluZ1NldDxBdG9taWNUeXBlPiBBdG9taWNUeXBlczsKKyAgbGx2bTo6Rm9sZGluZ1NldDxBdHRyaWJ1dGVkVHlwZT4gQXR0cmlidXRlZFR5cGVzOworICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8UGlwZVR5cGU+IFBpcGVUeXBlczsKKworICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8UXVhbGlmaWVkVGVtcGxhdGVOYW1lPiBRdWFsaWZpZWRUZW1wbGF0ZU5hbWVzOworICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8RGVwZW5kZW50VGVtcGxhdGVOYW1lPiBEZXBlbmRlbnRUZW1wbGF0ZU5hbWVzOworICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8U3Vic3RUZW1wbGF0ZVRlbXBsYXRlUGFybVN0b3JhZ2U+CisgICAgU3Vic3RUZW1wbGF0ZVRlbXBsYXRlUGFybXM7CisgIG11dGFibGUgbGx2bTo6Q29udGV4dHVhbEZvbGRpbmdTZXQ8U3Vic3RUZW1wbGF0ZVRlbXBsYXRlUGFybVBhY2tTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVENvbnRleHQmPgorICAgIFN1YnN0VGVtcGxhdGVUZW1wbGF0ZVBhcm1QYWNrczsKKworICAvLy8gXGJyaWVmIFRoZSBzZXQgb2YgbmVzdGVkIG5hbWUgc3BlY2lmaWVycy4KKyAgLy8vCisgIC8vLyBUaGlzIHNldCBpcyBtYW5hZ2VkIGJ5IHRoZSBOZXN0ZWROYW1lU3BlY2lmaWVyIGNsYXNzLgorICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8TmVzdGVkTmFtZVNwZWNpZmllcj4gTmVzdGVkTmFtZVNwZWNpZmllcnM7CisgIG11dGFibGUgTmVzdGVkTmFtZVNwZWNpZmllciAqR2xvYmFsTmVzdGVkTmFtZVNwZWNpZmllciA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBBIGNhY2hlIG1hcHBpbmcgZnJvbSBSZWNvcmREZWNscyB0byBBU1RSZWNvcmRMYXlvdXRzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgbGF6aWx5IGNyZWF0ZWQuICBUaGlzIGlzIGludGVudGlvbmFsbHkgbm90IHNlcmlhbGl6ZWQuCisgIG11dGFibGUgbGx2bTo6RGVuc2VNYXA8Y29uc3QgUmVjb3JkRGVjbCosIGNvbnN0IEFTVFJlY29yZExheW91dCo+CisgICAgQVNUUmVjb3JkTGF5b3V0czsKKyAgbXV0YWJsZSBsbHZtOjpEZW5zZU1hcDxjb25zdCBPYmpDQ29udGFpbmVyRGVjbCosIGNvbnN0IEFTVFJlY29yZExheW91dCo+CisgICAgT2JqQ0xheW91dHM7CisKKyAgLy8vIFxicmllZiBBIGNhY2hlIGZyb20gdHlwZXMgdG8gc2l6ZSBhbmQgYWxpZ25tZW50IGluZm9ybWF0aW9uLgorICB1c2luZyBUeXBlSW5mb01hcCA9IGxsdm06OkRlbnNlTWFwPGNvbnN0IFR5cGUgKiwgc3RydWN0IFR5cGVJbmZvPjsKKyAgbXV0YWJsZSBUeXBlSW5mb01hcCBNZW1vaXplZFR5cGVJbmZvOworCisgIC8vLyBcYnJpZWYgQSBjYWNoZSBtYXBwaW5nIGZyb20gQ1hYUmVjb3JkRGVjbHMgdG8ga2V5IGZ1bmN0aW9ucy4KKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYUmVjb3JkRGVjbCosIExhenlEZWNsUHRyPiBLZXlGdW5jdGlvbnM7CisKKyAgLy8vIFxicmllZiBNYXBwaW5nIGZyb20gT2JqQ0NvbnRhaW5lcnMgdG8gdGhlaXIgT2JqQ0ltcGxlbWVudGF0aW9ucy4KKyAgbGx2bTo6RGVuc2VNYXA8T2JqQ0NvbnRhaW5lckRlY2wqLCBPYmpDSW1wbERlY2wqPiBPYmpDSW1wbHM7CisKKyAgLy8vIFxicmllZiBNYXBwaW5nIGZyb20gT2JqQ01ldGhvZCB0byBpdHMgZHVwbGljYXRlIGRlY2xhcmF0aW9uIGluIHRoZSBzYW1lCisgIC8vLyBpbnRlcmZhY2UuCisgIGxsdm06OkRlbnNlTWFwPGNvbnN0IE9iakNNZXRob2REZWNsKixjb25zdCBPYmpDTWV0aG9kRGVjbCo+IE9iakNNZXRob2RSZWRlY2xzOworCisgIC8vLyBcYnJpZWYgTWFwcGluZyBmcm9tIF9fYmxvY2sgVmFyRGVjbHMgdG8gdGhlaXIgY29weSBpbml0aWFsaXphdGlvbiBleHByLgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBWYXJEZWNsKiwgRXhwcio+IEJsb2NrVmFyQ29weUluaXRzOworCisgIC8vLyBcYnJpZWYgTWFwcGluZyBmcm9tIGNsYXNzIHNjb3BlIGZ1bmN0aW9ucyBzcGVjaWFsaXphdGlvbiB0byB0aGVpcgorICAvLy8gdGVtcGxhdGUgcGF0dGVybnMuCisgIGxsdm06OkRlbnNlTWFwPGNvbnN0IEZ1bmN0aW9uRGVjbCosIEZ1bmN0aW9uRGVjbCo+CisgICAgQ2xhc3NTY29wZVNwZWNpYWxpemF0aW9uUGF0dGVybjsKKworICAvLy8gXGJyaWVmIE1hcHBpbmcgZnJvbSBtYXRlcmlhbGl6ZWQgdGVtcG9yYXJpZXMgd2l0aCBzdGF0aWMgc3RvcmFnZSBkdXJhdGlvbgorICAvLy8gdGhhdCBhcHBlYXIgaW4gY29uc3RhbnQgaW5pdGlhbGl6ZXJzIHRvIHRoZWlyIGV2YWx1YXRlZCB2YWx1ZXMuICBUaGVzZSBhcmUKKyAgLy8vIGFsbG9jYXRlZCBpbiBhIHN0ZDo6bWFwIGJlY2F1c2UgdGhlaXIgYWRkcmVzcyBtdXN0IGJlIHN0YWJsZS4KKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgTWF0ZXJpYWxpemVUZW1wb3JhcnlFeHByICosIEFQVmFsdWUgKj4KKyAgICBNYXRlcmlhbGl6ZWRUZW1wb3JhcnlWYWx1ZXM7CisKKyAgLy8vIFxicmllZiBSZXByZXNlbnRhdGlvbiBvZiBhICJjYW5vbmljYWwiIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlciB0aGF0CisgIC8vLyBpcyB1c2VkIGluIGNhbm9uaWNhbCB0ZW1wbGF0ZSBuYW1lcy4KKyAgY2xhc3MgQ2Fub25pY2FsVGVtcGxhdGVUZW1wbGF0ZVBhcm0gOiBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworICAgIFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCAqUGFybTsKKworICBwdWJsaWM6CisgICAgQ2Fub25pY2FsVGVtcGxhdGVUZW1wbGF0ZVBhcm0oVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsICpQYXJtKQorICAgICAgICA6IFBhcm0oUGFybSkge30KKworICAgIFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCAqZ2V0UGFyYW0oKSBjb25zdCB7IHJldHVybiBQYXJtOyB9CisKKyAgICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIHsgUHJvZmlsZShJRCwgUGFybSk7IH0KKworICAgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2wgKlBhcm0pOworICB9OworICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8Q2Fub25pY2FsVGVtcGxhdGVUZW1wbGF0ZVBhcm0+CisgICAgQ2Fub25UZW1wbGF0ZVRlbXBsYXRlUGFybXM7CisKKyAgVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsICoKKyAgICBnZXRDYW5vbmljYWxUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2woVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsICpUVFApIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVGhlIHR5cGVkZWYgZm9yIHRoZSBfX2ludDEyOF90IHR5cGUuCisgIG11dGFibGUgVHlwZWRlZkRlY2wgKkludDEyOERlY2wgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIHR5cGVkZWYgZm9yIHRoZSBfX3VpbnQxMjhfdCB0eXBlLgorICBtdXRhYmxlIFR5cGVkZWZEZWNsICpVSW50MTI4RGVjbCA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBUaGUgdHlwZWRlZiBmb3IgdGhlIHRhcmdldCBzcGVjaWZpYyBwcmVkZWZpbmVkCisgIC8vLyBfX2J1aWx0aW5fdmFfbGlzdCB0eXBlLgorICBtdXRhYmxlIFR5cGVkZWZEZWNsICpCdWlsdGluVmFMaXN0RGVjbCA9IG51bGxwdHI7CisKKyAgLy8vIFRoZSB0eXBlZGVmIGZvciB0aGUgcHJlZGVmaW5lZCBcYyBfX2J1aWx0aW5fbXNfdmFfbGlzdCB0eXBlLgorICBtdXRhYmxlIFR5cGVkZWZEZWNsICpCdWlsdGluTVNWYUxpc3REZWNsID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFRoZSB0eXBlZGVmIGZvciB0aGUgcHJlZGVmaW5lZCBcYyBpZCB0eXBlLgorICBtdXRhYmxlIFR5cGVkZWZEZWNsICpPYmpDSWREZWNsID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFRoZSB0eXBlZGVmIGZvciB0aGUgcHJlZGVmaW5lZCBcYyBTRUwgdHlwZS4KKyAgbXV0YWJsZSBUeXBlZGVmRGVjbCAqT2JqQ1NlbERlY2wgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIHR5cGVkZWYgZm9yIHRoZSBwcmVkZWZpbmVkIFxjIENsYXNzIHR5cGUuCisgIG11dGFibGUgVHlwZWRlZkRlY2wgKk9iakNDbGFzc0RlY2wgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIHR5cGVkZWYgZm9yIHRoZSBwcmVkZWZpbmVkIFxjIFByb3RvY29sIGNsYXNzIGluIE9iamVjdGl2ZS1DLgorICBtdXRhYmxlIE9iakNJbnRlcmZhY2VEZWNsICpPYmpDUHJvdG9jb2xDbGFzc0RlY2wgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIHR5cGVkZWYgZm9yIHRoZSBwcmVkZWZpbmVkICdCT09MJyB0eXBlLgorICBtdXRhYmxlIFR5cGVkZWZEZWNsICpCT09MRGVjbCA9IG51bGxwdHI7CisKKyAgLy8gVHlwZWRlZnMgd2hpY2ggbWF5IGJlIHByb3ZpZGVkIGRlZmluaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgT2JqZWN0aXZlLUMKKyAgLy8gcHNldWRvLWJ1aWx0aW5zCisgIFF1YWxUeXBlIE9iakNJZFJlZGVmaW5pdGlvblR5cGU7CisgIFF1YWxUeXBlIE9iakNDbGFzc1JlZGVmaW5pdGlvblR5cGU7CisgIFF1YWxUeXBlIE9iakNTZWxSZWRlZmluaXRpb25UeXBlOworCisgIC8vLyBUaGUgaWRlbnRpZmllciAnYm9vbCcuCisgIG11dGFibGUgSWRlbnRpZmllckluZm8gKkJvb2xOYW1lID0gbnVsbHB0cjsKKworICAvLy8gVGhlIGlkZW50aWZpZXIgJ05TT2JqZWN0Jy4KKyAgSWRlbnRpZmllckluZm8gKk5TT2JqZWN0TmFtZSA9IG51bGxwdHI7CisKKyAgLy8vIFRoZSBpZGVudGlmaWVyICdOU0NvcHlpbmcnLgorICBJZGVudGlmaWVySW5mbyAqTlNDb3B5aW5nTmFtZSA9IG51bGxwdHI7CisKKyAgLy8vIFRoZSBpZGVudGlmaWVyICdfX21ha2VfaW50ZWdlcl9zZXEnLgorICBtdXRhYmxlIElkZW50aWZpZXJJbmZvICpNYWtlSW50ZWdlclNlcU5hbWUgPSBudWxscHRyOworCisgIC8vLyBUaGUgaWRlbnRpZmllciAnX190eXBlX3BhY2tfZWxlbWVudCcuCisgIG11dGFibGUgSWRlbnRpZmllckluZm8gKlR5cGVQYWNrRWxlbWVudE5hbWUgPSBudWxscHRyOworCisgIFF1YWxUeXBlIE9iakNDb25zdGFudFN0cmluZ1R5cGU7CisgIG11dGFibGUgUmVjb3JkRGVjbCAqQ0ZDb25zdGFudFN0cmluZ1RhZ0RlY2wgPSBudWxscHRyOworICBtdXRhYmxlIFR5cGVkZWZEZWNsICpDRkNvbnN0YW50U3RyaW5nVHlwZURlY2wgPSBudWxscHRyOworCisgIG11dGFibGUgUXVhbFR5cGUgT2JqQ1N1cGVyVHlwZTsKKworICBRdWFsVHlwZSBPYmpDTlNTdHJpbmdUeXBlOworCisgIC8vLyBcYnJpZWYgVGhlIHR5cGVkZWYgZGVjbGFyYXRpb24gZm9yIHRoZSBPYmplY3RpdmUtQyAiaW5zdGFuY2V0eXBlIiB0eXBlLgorICBUeXBlZGVmRGVjbCAqT2JqQ0luc3RhbmNlVHlwZURlY2wgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIHR5cGUgZm9yIHRoZSBDIEZJTEUgdHlwZS4KKyAgVHlwZURlY2wgKkZJTEVEZWNsID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFRoZSB0eXBlIGZvciB0aGUgQyBqbXBfYnVmIHR5cGUuCisgIFR5cGVEZWNsICpqbXBfYnVmRGVjbCA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBUaGUgdHlwZSBmb3IgdGhlIEMgc2lnam1wX2J1ZiB0eXBlLgorICBUeXBlRGVjbCAqc2lnam1wX2J1ZkRlY2wgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIHR5cGUgZm9yIHRoZSBDIHVjb250ZXh0X3QgdHlwZS4KKyAgVHlwZURlY2wgKnVjb250ZXh0X3REZWNsID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFR5cGUgZm9yIHRoZSBCbG9jayBkZXNjcmlwdG9yIGZvciBCbG9ja3MgQ29kZUdlbi4KKyAgLy8vCisgIC8vLyBTaW5jZSB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgZ2VuZXJhdGlvbiBvZiBkZWJ1ZyBpbmZvLCBpdCBpcyBub3QKKyAgLy8vIHNlcmlhbGl6ZWQuCisgIG11dGFibGUgUmVjb3JkRGVjbCAqQmxvY2tEZXNjcmlwdG9yVHlwZSA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBUeXBlIGZvciB0aGUgQmxvY2sgZGVzY3JpcHRvciBmb3IgQmxvY2tzIENvZGVHZW4uCisgIC8vLworICAvLy8gU2luY2UgdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGdlbmVyYXRpb24gb2YgZGVidWcgaW5mbywgaXQgaXMgbm90CisgIC8vLyBzZXJpYWxpemVkLgorICBtdXRhYmxlIFJlY29yZERlY2wgKkJsb2NrRGVzY3JpcHRvckV4dGVuZGVkVHlwZSA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBEZWNsYXJhdGlvbiBmb3IgdGhlIENVREEgY3VkYUNvbmZpZ3VyZUNhbGwgZnVuY3Rpb24uCisgIEZ1bmN0aW9uRGVjbCAqY3VkYUNvbmZpZ3VyZUNhbGxEZWNsID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIEtlZXBzIHRyYWNrIG9mIGFsbCBkZWNsYXJhdGlvbiBhdHRyaWJ1dGVzLgorICAvLy8KKyAgLy8vIFNpbmNlIHNvIGZldyBkZWNscyBoYXZlIGF0dHJzLCB3ZSBrZWVwIHRoZW0gaW4gYSBoYXNoIG1hcCBpbnN0ZWFkIG9mCisgIC8vLyB3YXN0aW5nIHNwYWNlIGluIHRoZSBEZWNsIGNsYXNzLgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBEZWNsKiwgQXR0clZlYyo+IERlY2xBdHRyczsKKworICAvLy8gXGJyaWVmIEEgbWFwcGluZyBmcm9tIG5vbi1yZWRlY2xhcmFibGUgZGVjbGFyYXRpb25zIGluIG1vZHVsZXMgdGhhdCB3ZXJlCisgIC8vLyBtZXJnZWQgd2l0aCBvdGhlciBkZWNsYXJhdGlvbnMgdG8gdGhlIGNhbm9uaWNhbCBkZWNsYXJhdGlvbiB0aGF0IHRoZXkgd2VyZQorICAvLy8gbWVyZ2VkIGludG8uCisgIGxsdm06OkRlbnNlTWFwPERlY2wqLCBEZWNsKj4gTWVyZ2VkRGVjbHM7CisKKyAgLy8vIFxicmllZiBBIG1hcHBpbmcgZnJvbSBhIGRlZmluaW5nIGRlY2xhcmF0aW9uIHRvIGEgbGlzdCBvZiBtb2R1bGVzIChvdGhlcgorICAvLy8gdGhhbiB0aGUgb3duaW5nIG1vZHVsZSBvZiB0aGUgZGVjbGFyYXRpb24pIHRoYXQgY29udGFpbiBtZXJnZWQKKyAgLy8vIGRlZmluaXRpb25zIG9mIHRoYXQgZW50aXR5LgorICBsbHZtOjpEZW5zZU1hcDxOYW1lZERlY2wqLCBsbHZtOjpUaW55UHRyVmVjdG9yPE1vZHVsZSo+PiBNZXJnZWREZWZNb2R1bGVzOworCisgIC8vLyBcYnJpZWYgSW5pdGlhbGl6ZXJzIGZvciBhIG1vZHVsZSwgaW4gb3JkZXIuIEVhY2ggRGVjbCB3aWxsIGJlIGVpdGhlcgorICAvLy8gc29tZXRoaW5nIHRoYXQgaGFzIGEgc2VtYW50aWMgZWZmZWN0IG9uIHN0YXJ0dXAgKHN1Y2ggYXMgYSB2YXJpYWJsZSB3aXRoCisgIC8vLyBhIG5vbi1jb25zdGFudCBpbml0aWFsaXplciksIG9yIGFuIEltcG9ydERlY2wgKHdoaWNoIHJlY3Vyc2l2ZWx5IHRyaWdnZXJzCisgIC8vLyBpbml0aWFsaXphdGlvbiBvZiBhbm90aGVyIG1vZHVsZSkuCisgIHN0cnVjdCBQZXJNb2R1bGVJbml0aWFsaXplcnMgeworICAgIGxsdm06OlNtYWxsVmVjdG9yPERlY2wqLCA0PiBJbml0aWFsaXplcnM7CisgICAgbGx2bTo6U21hbGxWZWN0b3I8dWludDMyX3QsIDQ+IExhenlJbml0aWFsaXplcnM7CisKKyAgICB2b2lkIHJlc29sdmUoQVNUQ29udGV4dCAmQ3R4KTsKKyAgfTsKKyAgbGx2bTo6RGVuc2VNYXA8TW9kdWxlKiwgUGVyTW9kdWxlSW5pdGlhbGl6ZXJzKj4gTW9kdWxlSW5pdGlhbGl6ZXJzOworCisgIEFTVENvbnRleHQgJnRoaXNfKCkgeyByZXR1cm4gKnRoaXM7IH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIEEgdHlwZSBzeW5vbnltIGZvciB0aGUgVGVtcGxhdGVPckluc3RhbnRpYXRpb24gbWFwcGluZy4KKyAgdXNpbmcgVGVtcGxhdGVPclNwZWNpYWxpemF0aW9uSW5mbyA9CisgICAgICBsbHZtOjpQb2ludGVyVW5pb248VmFyVGVtcGxhdGVEZWNsICosIE1lbWJlclNwZWNpYWxpemF0aW9uSW5mbyAqPjsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RXcml0ZXI7CisgIGZyaWVuZCBjbGFzcyBDWFhSZWNvcmREZWNsOworCisgIC8vLyBcYnJpZWYgQSBtYXBwaW5nIHRvIGNvbnRhaW4gdGhlIHRlbXBsYXRlIG9yIGRlY2xhcmF0aW9uIHRoYXQKKyAgLy8vIGEgdmFyaWFibGUgZGVjbGFyYXRpb24gZGVzY3JpYmVzIG9yIHdhcyBpbnN0YW50aWF0ZWQgZnJvbSwKKyAgLy8vIHJlc3BlY3RpdmVseS4KKyAgLy8vCisgIC8vLyBGb3Igbm9uLXRlbXBsYXRlcywgdGhpcyB2YWx1ZSB3aWxsIGJlIE5VTEwuIEZvciB2YXJpYWJsZQorICAvLy8gZGVjbGFyYXRpb25zIHRoYXQgZGVzY3JpYmUgYSB2YXJpYWJsZSB0ZW1wbGF0ZSwgdGhpcyB3aWxsIGJlIGEKKyAgLy8vIHBvaW50ZXIgdG8gYSBWYXJUZW1wbGF0ZURlY2wuIEZvciBzdGF0aWMgZGF0YSBtZW1iZXJzCisgIC8vLyBvZiBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMsIHRoaXMgd2lsbCBiZSB0aGUKKyAgLy8vIE1lbWJlclNwZWNpYWxpemF0aW9uSW5mbyByZWZlcnJpbmcgdG8gdGhlIG1lbWJlciB2YXJpYWJsZSB0aGF0IHdhcworICAvLy8gaW5zdGFudGlhdGVkIG9yIHNwZWNpYWxpemVkLiBUaHVzLCB0aGUgbWFwcGluZyB3aWxsIGtlZXAgdHJhY2sgb2YKKyAgLy8vIHRoZSBzdGF0aWMgZGF0YSBtZW1iZXIgdGVtcGxhdGVzIGZyb20gd2hpY2ggc3RhdGljIGRhdGEgbWVtYmVycyBvZgorICAvLy8gY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIHdlcmUgaW5zdGFudGlhdGVkLgorICAvLy8KKyAgLy8vIEdpdmVuIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgLy8vIHN0cnVjdCBYIHsKKyAgLy8vICAgc3RhdGljIFQgdmFsdWU7CisgIC8vLyB9OworICAvLy8KKyAgLy8vIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIC8vLyAgIFQgWDxUPjo6dmFsdWUgPSBUKDE3KTsKKyAgLy8vCisgIC8vLyBpbnQgKnggPSAmWDxpbnQ+Ojp2YWx1ZTsKKyAgLy8vIFxlbmRjb2RlCisgIC8vLworICAvLy8gVGhpcyBtYXBwaW5nIHdpbGwgY29udGFpbiBhbiBlbnRyeSB0aGF0IG1hcHMgZnJvbSB0aGUgVmFyRGVjbCBmb3IKKyAgLy8vIFg8aW50Pjo6dmFsdWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgVmFyRGVjbCBmb3IgWDxUPjo6dmFsdWUgKHdpdGhpbiB0aGUKKyAgLy8vIGNsYXNzIHRlbXBsYXRlIFgpIGFuZCB3aWxsIGJlIG1hcmtlZCBUU0tfSW1wbGljaXRJbnN0YW50aWF0aW9uLgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBWYXJEZWNsICosIFRlbXBsYXRlT3JTcGVjaWFsaXphdGlvbkluZm8+CisgIFRlbXBsYXRlT3JJbnN0YW50aWF0aW9uOworCisgIC8vLyBcYnJpZWYgS2VlcHMgdHJhY2sgb2YgdGhlIGRlY2xhcmF0aW9uIGZyb20gd2hpY2ggYSB1c2luZyBkZWNsYXJhdGlvbiB3YXMKKyAgLy8vIGNyZWF0ZWQgZHVyaW5nIGluc3RhbnRpYXRpb24uCisgIC8vLworICAvLy8gVGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGRlY2xhcmF0aW9ucyBhcmUgYWx3YXlzIGEgVXNpbmdEZWNsLCBhbgorICAvLy8gVW5yZXNvbHZlZFVzaW5nVmFsdWVEZWNsLCBvciBhbiBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGU6CisgIC8vLyBcY29kZQorICAvLy8gdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgLy8vIHN0cnVjdCBBIHsKKyAgLy8vICAgdm9pZCBmKCk7CisgIC8vLyB9OworICAvLy8KKyAgLy8vIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIC8vLyBzdHJ1Y3QgQiA6IEE8VD4geworICAvLy8gICB1c2luZyBBPFQ+OjpmOworICAvLy8gfTsKKyAgLy8vCisgIC8vLyB0ZW1wbGF0ZSBzdHJ1Y3QgQjxpbnQ+OworICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBUaGlzIG1hcHBpbmcgd2lsbCBjb250YWluIGFuIGVudHJ5IHRoYXQgbWFwcyBmcm9tIHRoZSBVc2luZ0RlY2wgaW4KKyAgLy8vIEI8aW50PiB0byB0aGUgVW5yZXNvbHZlZFVzaW5nRGVjbCBpbiBCPFQ+LgorICBsbHZtOjpEZW5zZU1hcDxOYW1lZERlY2wgKiwgTmFtZWREZWNsICo+IEluc3RhbnRpYXRlZEZyb21Vc2luZ0RlY2w7CisKKyAgbGx2bTo6RGVuc2VNYXA8VXNpbmdTaGFkb3dEZWNsKiwgVXNpbmdTaGFkb3dEZWNsKj4KKyAgICBJbnN0YW50aWF0ZWRGcm9tVXNpbmdTaGFkb3dEZWNsOworCisgIGxsdm06OkRlbnNlTWFwPEZpZWxkRGVjbCAqLCBGaWVsZERlY2wgKj4gSW5zdGFudGlhdGVkRnJvbVVubmFtZWRGaWVsZERlY2w7CisKKyAgLy8vIFxicmllZiBNYXBwaW5nIHRoYXQgc3RvcmVzIHRoZSBtZXRob2RzIG92ZXJyaWRkZW4gYnkgYSBnaXZlbiBDKysKKyAgLy8vIG1lbWJlciBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBTaW5jZSBtb3N0IEMrKyBtZW1iZXIgZnVuY3Rpb25zIGFyZW4ndCB2aXJ0dWFsIGFuZCB0aGVyZWZvcmUKKyAgLy8vIGRvbid0IG92ZXJyaWRlIGFueXRoaW5nLCB3ZSBzdG9yZSB0aGUgb3ZlcnJpZGRlbiBmdW5jdGlvbnMgaW4KKyAgLy8vIHRoaXMgbWFwIG9uIHRoZSBzaWRlIHJhdGhlciB0aGFuIHdpdGhpbiB0aGUgQ1hYTWV0aG9kRGVjbCBzdHJ1Y3R1cmUuCisgIHVzaW5nIENYWE1ldGhvZFZlY3RvciA9IGxsdm06OlRpbnlQdHJWZWN0b3I8Y29uc3QgQ1hYTWV0aG9kRGVjbCAqPjsKKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYTWV0aG9kRGVjbCAqLCBDWFhNZXRob2RWZWN0b3I+IE92ZXJyaWRkZW5NZXRob2RzOworCisgIC8vLyBcYnJpZWYgTWFwcGluZyBmcm9tIGVhY2ggZGVjbGFyYXRpb24gY29udGV4dCB0byBpdHMgY29ycmVzcG9uZGluZworICAvLy8gbWFuZ2xpbmcgbnVtYmVyaW5nIGNvbnRleHQgKHVzZWQgZm9yIGNvbnN0cnVjdHMgbGlrZSBsYW1iZGFzIHdoaWNoCisgIC8vLyBuZWVkIHRvIGJlIGNvbnNpc3RlbnRseSBudW1iZXJlZCBmb3IgdGhlIG1hbmdsZXIpLgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBEZWNsQ29udGV4dCAqLCBzdGQ6OnVuaXF1ZV9wdHI8TWFuZ2xlTnVtYmVyaW5nQ29udGV4dD4+CisgICAgICBNYW5nbGVOdW1iZXJpbmdDb250ZXh0czsKKworICAvLy8gXGJyaWVmIFNpZGUtdGFibGUgb2YgbWFuZ2xpbmcgbnVtYmVycyBmb3IgZGVjbGFyYXRpb25zIHdoaWNoIHJhcmVseQorICAvLy8gbmVlZCB0aGVtIChsaWtlIHN0YXRpYyBsb2NhbCB2YXJzKS4KKyAgbGx2bTo6TWFwVmVjdG9yPGNvbnN0IE5hbWVkRGVjbCAqLCB1bnNpZ25lZD4gTWFuZ2xlTnVtYmVyczsKKyAgbGx2bTo6TWFwVmVjdG9yPGNvbnN0IFZhckRlY2wgKiwgdW5zaWduZWQ+IFN0YXRpY0xvY2FsTnVtYmVyczsKKworICAvLy8gXGJyaWVmIE1hcHBpbmcgdGhhdCBzdG9yZXMgcGFyYW1ldGVySW5kZXggdmFsdWVzIGZvciBQYXJtVmFyRGVjbHMgd2hlbgorICAvLy8gdGhhdCB2YWx1ZSBleGNlZWRzIHRoZSBiaXRmaWVsZCBzaXplIG9mIFBhcm1WYXJEZWNsQml0cy5QYXJhbWV0ZXJJbmRleC4KKyAgdXNpbmcgUGFyYW1ldGVySW5kZXhUYWJsZSA9IGxsdm06OkRlbnNlTWFwPGNvbnN0IFZhckRlY2wgKiwgdW5zaWduZWQ+OworICBQYXJhbWV0ZXJJbmRleFRhYmxlIFBhcmFtSW5kaWNlczsKKworICBJbXBvcnREZWNsICpGaXJzdExvY2FsSW1wb3J0ID0gbnVsbHB0cjsKKyAgSW1wb3J0RGVjbCAqTGFzdExvY2FsSW1wb3J0ID0gbnVsbHB0cjsKKworICBUcmFuc2xhdGlvblVuaXREZWNsICpUVURlY2w7CisgIG11dGFibGUgRXh0ZXJuQ0NvbnRleHREZWNsICpFeHRlcm5DQ29udGV4dCA9IG51bGxwdHI7CisgIG11dGFibGUgQnVpbHRpblRlbXBsYXRlRGVjbCAqTWFrZUludGVnZXJTZXFEZWNsID0gbnVsbHB0cjsKKyAgbXV0YWJsZSBCdWlsdGluVGVtcGxhdGVEZWNsICpUeXBlUGFja0VsZW1lbnREZWNsID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFRoZSBhc3NvY2lhdGVkIFNvdXJjZU1hbmFnZXIgb2JqZWN0LgorICBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3I7CisKKyAgLy8vIFxicmllZiBUaGUgbGFuZ3VhZ2Ugb3B0aW9ucyB1c2VkIHRvIGNyZWF0ZSB0aGUgQVNUIGFzc29jaWF0ZWQgd2l0aAorICAvLy8gIHRoaXMgQVNUQ29udGV4dCBvYmplY3QuCisgIExhbmdPcHRpb25zICZMYW5nT3B0czsKKworICAvLy8gXGJyaWVmIEJsYWNrbGlzdCBvYmplY3QgdGhhdCBpcyB1c2VkIGJ5IHNhbml0aXplcnMgdG8gZGVjaWRlIHdoaWNoCisgIC8vLyBlbnRpdGllcyBzaG91bGQgbm90IGJlIGluc3RydW1lbnRlZC4KKyAgc3RkOjp1bmlxdWVfcHRyPFNhbml0aXplckJsYWNrbGlzdD4gU2FuaXRpemVyQkw7CisKKyAgLy8vIFxicmllZiBGdW5jdGlvbiBmaWx0ZXJpbmcgbWVjaGFuaXNtIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4gZnVuY3Rpb24KKyAgLy8vIHNob3VsZCBiZSBpbWJ1ZWQgd2l0aCB0aGUgWFJheSAiYWx3YXlzIiBvciAibmV2ZXIiIGF0dHJpYnV0ZXMuCisgIHN0ZDo6dW5pcXVlX3B0cjxYUmF5RnVuY3Rpb25GaWx0ZXI+IFhSYXlGaWx0ZXI7CisKKyAgLy8vIFxicmllZiBUaGUgYWxsb2NhdG9yIHVzZWQgdG8gY3JlYXRlIEFTVCBvYmplY3RzLgorICAvLy8KKyAgLy8vIEFTVCBvYmplY3RzIGFyZSBuZXZlciBkZXN0cnVjdGVkOyByYXRoZXIsIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAvLy8gQVNUIG9iamVjdHMgd2lsbCBiZSByZWxlYXNlZCB3aGVuIHRoZSBBU1RDb250ZXh0IGl0c2VsZiBpcyBkZXN0cm95ZWQuCisgIG11dGFibGUgbGx2bTo6QnVtcFB0ckFsbG9jYXRvciBCdW1wQWxsb2M7CisKKyAgLy8vIFxicmllZiBBbGxvY2F0b3IgZm9yIHBhcnRpYWwgZGlhZ25vc3RpY3MuCisgIFBhcnRpYWxEaWFnbm9zdGljOjpTdG9yYWdlQWxsb2NhdG9yIERpYWdBbGxvY2F0b3I7CisKKyAgLy8vIFxicmllZiBUaGUgY3VycmVudCBDKysgQUJJLgorICBzdGQ6OnVuaXF1ZV9wdHI8Q1hYQUJJPiBBQkk7CisgIENYWEFCSSAqY3JlYXRlQ1hYQUJJKGNvbnN0IFRhcmdldEluZm8gJlQpOworCisgIC8vLyBcYnJpZWYgVGhlIGxvZ2ljYWwgLT4gcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSBtYXAuCisgIGNvbnN0IExhbmdBU01hcCAqQWRkclNwYWNlTWFwID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIEFkZHJlc3Mgc3BhY2UgbWFwIG1hbmdsaW5nIG11c3QgYmUgdXNlZCB3aXRoIGxhbmd1YWdlIHNwZWNpZmljCisgIC8vLyBhZGRyZXNzIHNwYWNlcyAoZS5nLiBPcGVuQ0wvQ1VEQSkKKyAgYm9vbCBBZGRyU3BhY2VNYXBNYW5nbGluZzsKKworICBjb25zdCBUYXJnZXRJbmZvICpUYXJnZXQgPSBudWxscHRyOworICBjb25zdCBUYXJnZXRJbmZvICpBdXhUYXJnZXQgPSBudWxscHRyOworICBjbGFuZzo6UHJpbnRpbmdQb2xpY3kgUHJpbnRpbmdQb2xpY3k7CisKK3B1YmxpYzoKKyAgSWRlbnRpZmllclRhYmxlICZJZGVudHM7CisgIFNlbGVjdG9yVGFibGUgJlNlbGVjdG9yczsKKyAgQnVpbHRpbjo6Q29udGV4dCAmQnVpbHRpbkluZm87CisgIG11dGFibGUgRGVjbGFyYXRpb25OYW1lVGFibGUgRGVjbGFyYXRpb25OYW1lczsKKyAgSW50cnVzaXZlUmVmQ250UHRyPEV4dGVybmFsQVNUU291cmNlPiBFeHRlcm5hbFNvdXJjZTsKKyAgQVNUTXV0YXRpb25MaXN0ZW5lciAqTGlzdGVuZXIgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgQ29udGFpbnMgcGFyZW50cyBvZiBhIG5vZGUuCisgIHVzaW5nIFBhcmVudFZlY3RvciA9IGxsdm06OlNtYWxsVmVjdG9yPGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlLCAyPjsKKworICAvLy8gXGJyaWVmIE1hcHMgZnJvbSBhIG5vZGUgdG8gaXRzIHBhcmVudHMuIFRoaXMgaXMgdXNlZCBmb3Igbm9kZXMgdGhhdCBoYXZlCisgIC8vLyBwb2ludGVyIGlkZW50aXR5IG9ubHksIHdoaWNoIGFyZSBtb3JlIGNvbW1vbiBhbmQgd2UgY2FuIHNhdmUgc3BhY2UgYnkKKyAgLy8vIG9ubHkgc3RvcmluZyBhIHVuaXF1ZSBwb2ludGVyIHRvIHRoZW0uCisgIHVzaW5nIFBhcmVudE1hcFBvaW50ZXJzID0KKyAgICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IHZvaWQgKiwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm06OlBvaW50ZXJVbmlvbjQ8Y29uc3QgRGVjbCAqLCBjb25zdCBTdG10ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmVudFZlY3RvciAqPj47CisKKyAgLy8vIFBhcmVudCBtYXAgZm9yIG5vZGVzIHdpdGhvdXQgcG9pbnRlciBpZGVudGl0eS4gV2Ugc3RvcmUgYSBmdWxsCisgIC8vLyBEeW5UeXBlZE5vZGUgZm9yIGFsbCBrZXlzLgorICB1c2luZyBQYXJlbnRNYXBPdGhlck5vZGVzID0KKyAgICAgIGxsdm06OkRlbnNlTWFwPGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlLAorICAgICAgICAgICAgICAgICAgICAgbGx2bTo6UG9pbnRlclVuaW9uNDxjb25zdCBEZWNsICosIGNvbnN0IFN0bXQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGUgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyZW50VmVjdG9yICo+PjsKKworICAvLy8gQ29udGFpbmVyIGZvciBlaXRoZXIgYSBzaW5nbGUgRHluVHlwZWROb2RlIG9yIGZvciBhbiBBcnJheVJlZiB0bworICAvLy8gRHluVHlwZWROb2RlLiBGb3IgdXNlIHdpdGggUGFyZW50TWFwLgorICBjbGFzcyBEeW5UeXBlZE5vZGVMaXN0IHsKKyAgICB1c2luZyBEeW5UeXBlZE5vZGUgPSBhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZTsKKworICAgIGxsdm06OkFsaWduZWRDaGFyQXJyYXlVbmlvbjxhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RHluVHlwZWROb2RlPj4gU3RvcmFnZTsKKyAgICBib29sIElzU2luZ2xlTm9kZTsKKworICBwdWJsaWM6CisgICAgRHluVHlwZWROb2RlTGlzdChjb25zdCBEeW5UeXBlZE5vZGUgJk4pIDogSXNTaW5nbGVOb2RlKHRydWUpIHsKKyAgICAgIG5ldyAoU3RvcmFnZS5idWZmZXIpIER5blR5cGVkTm9kZShOKTsKKyAgICB9CisKKyAgICBEeW5UeXBlZE5vZGVMaXN0KEFycmF5UmVmPER5blR5cGVkTm9kZT4gQSkgOiBJc1NpbmdsZU5vZGUoZmFsc2UpIHsKKyAgICAgIG5ldyAoU3RvcmFnZS5idWZmZXIpIEFycmF5UmVmPER5blR5cGVkTm9kZT4oQSk7CisgICAgfQorCisgICAgY29uc3QgYXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGUgKmJlZ2luKCkgY29uc3QgeworICAgICAgaWYgKCFJc1NpbmdsZU5vZGUpCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEFycmF5UmVmPER5blR5cGVkTm9kZT4gKj4oU3RvcmFnZS5idWZmZXIpCisgICAgICAgICAgICAtPmJlZ2luKCk7CisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBEeW5UeXBlZE5vZGUgKj4oU3RvcmFnZS5idWZmZXIpOworICAgIH0KKworICAgIGNvbnN0IGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlICplbmQoKSBjb25zdCB7CisgICAgICBpZiAoIUlzU2luZ2xlTm9kZSkKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQXJyYXlSZWY8RHluVHlwZWROb2RlPiAqPihTdG9yYWdlLmJ1ZmZlcikKKyAgICAgICAgICAgIC0+ZW5kKCk7CisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBEeW5UeXBlZE5vZGUgKj4oU3RvcmFnZS5idWZmZXIpICsgMTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGVuZCgpIC0gYmVnaW4oKTsgfQorICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBiZWdpbigpID09IGVuZCgpOyB9CisKKyAgICBjb25zdCBEeW5UeXBlZE5vZGUgJm9wZXJhdG9yW10oc2l6ZV90IE4pIGNvbnN0IHsKKyAgICAgIGFzc2VydChOIDwgc2l6ZSgpICYmICJPdXQgb2YgYm91bmRzISIpOworICAgICAgcmV0dXJuICooYmVnaW4oKSArIE4pOworICAgIH0KKyAgfTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHBhcmVudHMgb2YgdGhlIGdpdmVuIG5vZGUuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgd2lsbCBsYXppbHkgY29tcHV0ZSB0aGUgcGFyZW50cyBvZiBhbGwgbm9kZXMKKyAgLy8vIGFuZCBzdG9yZSB0aGVtIGZvciBsYXRlciByZXRyaWV2YWwuIFRodXMsIHRoZSBmaXJzdCBjYWxsIGlzIE8obikKKyAgLy8vIGluIHRoZSBudW1iZXIgb2YgQVNUIG5vZGVzLgorICAvLy8KKyAgLy8vIENhdmVhdHMgYW5kIEZJWE1FczoKKyAgLy8vIENhbGN1bGF0aW5nIHRoZSBwYXJlbnQgbWFwIG92ZXIgYWxsIEFTVCBub2RlcyB3aWxsIG5lZWQgdG8gbG9hZCB0aGUKKyAgLy8vIGZ1bGwgQVNULiBUaGlzIGNhbiBiZSB1bmRlc2lyYWJsZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgZnVsbCBBU1QgaXMKKyAgLy8vIGV4cGVuc2l2ZSB0byBjcmVhdGUgKGZvciBleGFtcGxlLCB3aGVuIHVzaW5nIHByZWNvbXBpbGVkIGhlYWRlcgorICAvLy8gcHJlYW1ibGVzKS4gVGh1cywgdGhlcmUgYXJlIGdvb2Qgb3Bwb3J0dW5pdGllcyBmb3Igb3B0aW1pemF0aW9uIGhlcmUuCisgIC8vLyBPbmUgaWRlYSBpcyB0byB3YWxrIHRoZSBnaXZlbiBub2RlIGRvd253YXJkcywgbG9va2luZyBmb3IgcmVmZXJlbmNlcworICAvLy8gdG8gZGVjbGFyYXRpb24gY29udGV4dHMgLSBvbmNlIGEgZGVjbGFyYXRpb24gY29udGV4dCBpcyBmb3VuZCwgY29tcHV0ZQorICAvLy8gdGhlIHBhcmVudCBtYXAgZm9yIHRoZSBkZWNsYXJhdGlvbiBjb250ZXh0OyBpZiB0aGF0IGNhbiBzYXRpc2Z5IHRoZQorICAvLy8gcmVxdWVzdCwgbG9hZGluZyB0aGUgd2hvbGUgQVNUIGNhbiBiZSBhdm9pZGVkLiBOb3RlIHRoYXQgdGhpcyBpcyBtYWRlCisgIC8vLyBtb3JlIGNvbXBsZXggYnkgc3RhdGVtZW50cyBpbiB0ZW1wbGF0ZXMgaGF2aW5nIG11bHRpcGxlIHBhcmVudHMgLSB0aG9zZQorICAvLy8gcHJvYmxlbXMgY2FuIGJlIHNvbHZlZCBieSBidWlsZGluZyBjbG9zdXJlIG92ZXIgdGhlIHRlbXBsYXRlZCBwYXJ0cyBvZgorICAvLy8gdGhlIEFTVCwgd2hpY2ggYWxzbyBhdm9pZHMgdG91Y2hpbmcgbGFyZ2UgcGFydHMgb2YgdGhlIEFTVC4KKyAgLy8vIEFkZGl0aW9uYWxseSwgd2Ugd2lsbCB3YW50IHRvIGFkZCBhbiBpbnRlcmZhY2UgdG8gYWxyZWFkeSBnaXZlIGEgaGludAorICAvLy8gd2hlcmUgdG8gc2VhcmNoIGZvciB0aGUgcGFyZW50cywgZm9yIGV4YW1wbGUgd2hlbiBsb29raW5nIGF0IGEgc3RhdGVtZW50CisgIC8vLyBpbnNpZGUgYSBjZXJ0YWluIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vICdOb2RlVCcgY2FuIGJlIG9uZSBvZiBEZWNsLCBTdG10LCBUeXBlLCBUeXBlTG9jLAorICAvLy8gTmVzdGVkTmFtZVNwZWNpZmllciBvciBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVQ+IER5blR5cGVkTm9kZUxpc3QgZ2V0UGFyZW50cyhjb25zdCBOb2RlVCAmTm9kZSkgeworICAgIHJldHVybiBnZXRQYXJlbnRzKGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlOjpjcmVhdGUoTm9kZSkpOworICB9CisKKyAgRHluVHlwZWROb2RlTGlzdCBnZXRQYXJlbnRzKGNvbnN0IGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlICZOb2RlKTsKKworICBjb25zdCBjbGFuZzo6UHJpbnRpbmdQb2xpY3kgJmdldFByaW50aW5nUG9saWN5KCkgY29uc3QgeworICAgIHJldHVybiBQcmludGluZ1BvbGljeTsKKyAgfQorCisgIHZvaWQgc2V0UHJpbnRpbmdQb2xpY3koY29uc3QgY2xhbmc6OlByaW50aW5nUG9saWN5ICZQb2xpY3kpIHsKKyAgICBQcmludGluZ1BvbGljeSA9IFBvbGljeTsKKyAgfQorCisgIFNvdXJjZU1hbmFnZXImIGdldFNvdXJjZU1hbmFnZXIoKSB7IHJldHVybiBTb3VyY2VNZ3I7IH0KKyAgY29uc3QgU291cmNlTWFuYWdlciYgZ2V0U291cmNlTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZU1ncjsgfQorCisgIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgJmdldEFsbG9jYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gQnVtcEFsbG9jOworICB9CisKKyAgdm9pZCAqQWxsb2NhdGUoc2l6ZV90IFNpemUsIHVuc2lnbmVkIEFsaWduID0gOCkgY29uc3QgeworICAgIHJldHVybiBCdW1wQWxsb2MuQWxsb2NhdGUoU2l6ZSwgQWxpZ24pOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUICpBbGxvY2F0ZShzaXplX3QgTnVtID0gMSkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KEFsbG9jYXRlKE51bSAqIHNpemVvZihUKSwgYWxpZ25vZihUKSkpOworICB9CisgIHZvaWQgRGVhbGxvY2F0ZSh2b2lkICpQdHIpIGNvbnN0IHt9CisKKyAgLy8vIFJldHVybiB0aGUgdG90YWwgYW1vdW50IG9mIHBoeXNpY2FsIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHJlcHJlc2VudGluZworICAvLy8gQVNUIG5vZGVzIGFuZCB0eXBlIGluZm9ybWF0aW9uLgorICBzaXplX3QgZ2V0QVNUQWxsb2NhdGVkTWVtb3J5KCkgY29uc3QgeworICAgIHJldHVybiBCdW1wQWxsb2MuZ2V0VG90YWxNZW1vcnkoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHRvdGFsIG1lbW9yeSB1c2VkIGZvciB2YXJpb3VzIHNpZGUgdGFibGVzLgorICBzaXplX3QgZ2V0U2lkZVRhYmxlQWxsb2NhdGVkTWVtb3J5KCkgY29uc3Q7CisKKyAgUGFydGlhbERpYWdub3N0aWM6OlN0b3JhZ2VBbGxvY2F0b3IgJmdldERpYWdBbGxvY2F0b3IoKSB7CisgICAgcmV0dXJuIERpYWdBbGxvY2F0b3I7CisgIH0KKworICBjb25zdCBUYXJnZXRJbmZvICZnZXRUYXJnZXRJbmZvKCkgY29uc3QgeyByZXR1cm4gKlRhcmdldDsgfQorICBjb25zdCBUYXJnZXRJbmZvICpnZXRBdXhUYXJnZXRJbmZvKCkgY29uc3QgeyByZXR1cm4gQXV4VGFyZ2V0OyB9CisKKyAgLy8vIGdldEludFR5cGVGb3JCaXR3aWR0aCAtCisgIC8vLyBzZXRzIGludGVnZXIgUXVhbFR5IGFjY29yZGluZyB0byBzcGVjaWZpZWQgZGV0YWlsczoKKyAgLy8vIGJpdHdpZHRoLCBzaWduZWQvdW5zaWduZWQuCisgIC8vLyBSZXR1cm5zIGVtcHR5IHR5cGUgaWYgdGhlcmUgaXMgbm8gYXBwcm9wcmlhdGUgdGFyZ2V0IHR5cGVzLgorICBRdWFsVHlwZSBnZXRJbnRUeXBlRm9yQml0d2lkdGgodW5zaWduZWQgRGVzdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2lnbmVkKSBjb25zdDsKKworICAvLy8gZ2V0UmVhbFR5cGVGb3JCaXR3aWR0aCAtCisgIC8vLyBzZXRzIGZsb2F0aW5nIHBvaW50IFF1YWxUeSBhY2NvcmRpbmcgdG8gc3BlY2lmaWVkIGJpdHdpZHRoLgorICAvLy8gUmV0dXJucyBlbXB0eSB0eXBlIGlmIHRoZXJlIGlzIG5vIGFwcHJvcHJpYXRlIHRhcmdldCB0eXBlcy4KKyAgUXVhbFR5cGUgZ2V0UmVhbFR5cGVGb3JCaXR3aWR0aCh1bnNpZ25lZCBEZXN0V2lkdGgpIGNvbnN0OworCisgIGJvb2wgQXRvbWljVXNlc1Vuc3VwcG9ydGVkTGliY2FsbChjb25zdCBBdG9taWNFeHByICpFKSBjb25zdDsKKworICBjb25zdCBMYW5nT3B0aW9ucyYgZ2V0TGFuZ09wdHMoKSBjb25zdCB7IHJldHVybiBMYW5nT3B0czsgfQorCisgIGNvbnN0IFNhbml0aXplckJsYWNrbGlzdCAmZ2V0U2FuaXRpemVyQmxhY2tsaXN0KCkgY29uc3QgeworICAgIHJldHVybiAqU2FuaXRpemVyQkw7CisgIH0KKworICBjb25zdCBYUmF5RnVuY3Rpb25GaWx0ZXIgJmdldFhSYXlGaWx0ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuICpYUmF5RmlsdGVyOworICB9CisKKyAgRGlhZ25vc3RpY3NFbmdpbmUgJmdldERpYWdub3N0aWNzKCkgY29uc3Q7CisKKyAgRnVsbFNvdXJjZUxvYyBnZXRGdWxsTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3QgeworICAgIHJldHVybiBGdWxsU291cmNlTG9jKExvYyxTb3VyY2VNZ3IpOworICB9CisKKyAgLy8vIFxicmllZiBBbGwgY29tbWVudHMgaW4gdGhpcyB0cmFuc2xhdGlvbiB1bml0LgorICBSYXdDb21tZW50TGlzdCBDb21tZW50czsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgY29tbWVudHMgYXJlIGFscmVhZHkgbG9hZGVkIGZyb20gRXh0ZXJuYWxBU1RTb3VyY2UuCisgIG11dGFibGUgYm9vbCBDb21tZW50c0xvYWRlZCA9IGZhbHNlOworCisgIGNsYXNzIFJhd0NvbW1lbnRBbmRDYWNoZUZsYWdzIHsKKyAgcHVibGljOgorICAgIGVudW0gS2luZCB7CisgICAgICAvLy8gV2Ugc2VhcmNoZWQgZm9yIGEgY29tbWVudCBhdHRhY2hlZCB0byB0aGUgcGFydGljdWxhciBkZWNsYXJhdGlvbiwgYnV0CisgICAgICAvLy8gZGlkbid0IGZpbmQgYW55LgorICAgICAgLy8vCisgICAgICAvLy8gZ2V0UmF3KCkgPT0gMC4KKyAgICAgIE5vQ29tbWVudEluRGVjbCA9IDAsCisKKyAgICAgIC8vLyBXZSBoYXZlIGZvdW5kIGEgY29tbWVudCBhdHRhY2hlZCB0byB0aGlzIHBhcnRpY3VsYXIgZGVjbGFyYXRpb24uCisgICAgICAvLy8KKyAgICAgIC8vLyBnZXRSYXcoKSAhPSAwLgorICAgICAgRnJvbURlY2wsCisKKyAgICAgIC8vLyBUaGlzIGRlY2xhcmF0aW9uIGRvZXMgbm90IGhhdmUgYW4gYXR0YWNoZWQgY29tbWVudCwgYW5kIHdlIGhhdmUKKyAgICAgIC8vLyBzZWFyY2hlZCB0aGUgcmVkZWNsYXJhdGlvbiBjaGFpbi4KKyAgICAgIC8vLworICAgICAgLy8vIElmIGdldFJhdygpID09IDAsIHRoZSB3aG9sZSByZWRlY2xhcmF0aW9uIGNoYWluIGRvZXMgbm90IGhhdmUgYW55CisgICAgICAvLy8gY29tbWVudHMuCisgICAgICAvLy8KKyAgICAgIC8vLyBJZiBnZXRSYXcoKSAhPSAwLCBpdCBpcyBhIGNvbW1lbnQgcHJvcGFnYXRlZCBmcm9tIG90aGVyCisgICAgICAvLy8gcmVkZWNsYXJhdGlvbi4KKyAgICAgIEZyb21SZWRlY2wKKyAgICB9OworCisgICAgS2luZCBnZXRLaW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgICByZXR1cm4gRGF0YS5nZXRJbnQoKTsKKyAgICB9CisKKyAgICB2b2lkIHNldEtpbmQoS2luZCBLKSB7CisgICAgICBEYXRhLnNldEludChLKTsKKyAgICB9CisKKyAgICBjb25zdCBSYXdDb21tZW50ICpnZXRSYXcoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICAgIHJldHVybiBEYXRhLmdldFBvaW50ZXIoKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFJhdyhjb25zdCBSYXdDb21tZW50ICpSQykgeworICAgICAgRGF0YS5zZXRQb2ludGVyKFJDKTsKKyAgICB9CisKKyAgICBjb25zdCBEZWNsICpnZXRPcmlnaW5hbERlY2woKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICAgIHJldHVybiBPcmlnaW5hbERlY2w7CisgICAgfQorCisgICAgdm9pZCBzZXRPcmlnaW5hbERlY2woY29uc3QgRGVjbCAqT3JpZykgeworICAgICAgT3JpZ2luYWxEZWNsID0gT3JpZzsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBsbHZtOjpQb2ludGVySW50UGFpcjxjb25zdCBSYXdDb21tZW50ICosIDIsIEtpbmQ+IERhdGE7CisgICAgY29uc3QgRGVjbCAqT3JpZ2luYWxEZWNsOworICB9OworCisgIC8vLyBcYnJpZWYgTWFwcGluZyBmcm9tIGRlY2xhcmF0aW9ucyB0byBjb21tZW50cyBhdHRhY2hlZCB0byBhbnkKKyAgLy8vIHJlZGVjbGFyYXRpb24uCisgIC8vLworICAvLy8gUmF3IGNvbW1lbnRzIGFyZSBvd25lZCBieSBDb21tZW50cyBsaXN0LiAgVGhpcyBtYXBwaW5nIGlzIHBvcHVsYXRlZAorICAvLy8gbGF6aWx5LgorICBtdXRhYmxlIGxsdm06OkRlbnNlTWFwPGNvbnN0IERlY2wgKiwgUmF3Q29tbWVudEFuZENhY2hlRmxhZ3M+IFJlZGVjbENvbW1lbnRzOworCisgIC8vLyBcYnJpZWYgTWFwcGluZyBmcm9tIGRlY2xhcmF0aW9ucyB0byBwYXJzZWQgY29tbWVudHMgYXR0YWNoZWQgdG8gYW55CisgIC8vLyByZWRlY2xhcmF0aW9uLgorICBtdXRhYmxlIGxsdm06OkRlbnNlTWFwPGNvbnN0IERlY2wgKiwgY29tbWVudHM6OkZ1bGxDb21tZW50ICo+IFBhcnNlZENvbW1lbnRzOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBkb2N1bWVudGF0aW9uIGNvbW1lbnQgYXR0YWNoZWQgdG8gYSBnaXZlbiBkZWNsYXJhdGlvbiwKKyAgLy8vIHdpdGhvdXQgbG9va2luZyBpbnRvIGNhY2hlLgorICBSYXdDb21tZW50ICpnZXRSYXdDb21tZW50Rm9yRGVjbE5vQ2FjaGUoY29uc3QgRGVjbCAqRCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgUmF3Q29tbWVudExpc3QgJmdldFJhd0NvbW1lbnRMaXN0KCkgeworICAgIHJldHVybiBDb21tZW50czsKKyAgfQorCisgIHZvaWQgYWRkQ29tbWVudChjb25zdCBSYXdDb21tZW50ICZSQykgeworICAgIGFzc2VydChMYW5nT3B0cy5SZXRhaW5Db21tZW50c0Zyb21TeXN0ZW1IZWFkZXJzIHx8CisgICAgICAgICAgICFTb3VyY2VNZ3IuaXNJblN5c3RlbUhlYWRlcihSQy5nZXRTb3VyY2VSYW5nZSgpLmdldEJlZ2luKCkpKTsKKyAgICBDb21tZW50cy5hZGRDb21tZW50KFJDLCBMYW5nT3B0cy5Db21tZW50T3B0cywgQnVtcEFsbG9jKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBkb2N1bWVudGF0aW9uIGNvbW1lbnQgYXR0YWNoZWQgdG8gYSBnaXZlbiBkZWNsYXJhdGlvbi4KKyAgLy8vIFJldHVybnMgbnVsbHB0ciBpZiBubyBjb21tZW50IGlzIGF0dGFjaGVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBPcmlnaW5hbERlY2wgaWYgbm90IG51bGxwdHIsIGlzIHNldCB0byBkZWNsYXJhdGlvbiBBU1Qgbm9kZSB0aGF0CisgIC8vLyBoYWQgdGhlIGNvbW1lbnQsIGlmIHRoZSBjb21tZW50IHdlIGZvdW5kIGNvbWVzIGZyb20gYSByZWRlY2xhcmF0aW9uLgorICBjb25zdCBSYXdDb21tZW50ICoKKyAgZ2V0UmF3Q29tbWVudEZvckFueVJlZGVjbChjb25zdCBEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2wgKipPcmlnaW5hbERlY2wgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHBhcnNlZCBkb2N1bWVudGF0aW9uIGNvbW1lbnQgYXR0YWNoZWQgdG8gYSBnaXZlbiBkZWNsYXJhdGlvbi4KKyAgLy8vIFJldHVybnMgbnVsbHB0ciBpZiBubyBjb21tZW50IGlzIGF0dGFjaGVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBQUCB0aGUgUHJlcHJvY2Vzc29yIHVzZWQgd2l0aCB0aGlzIFRVLiAgQ291bGQgYmUgbnVsbHB0ciBpZgorICAvLy8gcHJlcHJvY2Vzc29yIGlzIG5vdCBhdmFpbGFibGUuCisgIGNvbW1lbnRzOjpGdWxsQ29tbWVudCAqZ2V0Q29tbWVudEZvckRlY2woY29uc3QgRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVwcm9jZXNzb3IgKlBQKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHBhcnNlZCBkb2N1bWVudGF0aW9uIGNvbW1lbnQgYXR0YWNoZWQgdG8gYSBnaXZlbiBkZWNsYXJhdGlvbi4KKyAgLy8vIFJldHVybnMgbnVsbHB0ciBpZiBubyBjb21tZW50IGlzIGF0dGFjaGVkLiBEb2VzIG5vdCBsb29rIGF0IGFueQorICAvLy8gcmVkZWNsYXJhdGlvbnMgb2YgdGhlIGRlY2xhcmF0aW9uLgorICBjb21tZW50czo6RnVsbENvbW1lbnQgKmdldExvY2FsQ29tbWVudEZvckRlY2xVbmNhY2hlZChjb25zdCBEZWNsICpEKSBjb25zdDsKKworICBjb21tZW50czo6RnVsbENvbW1lbnQgKmNsb25lRnVsbENvbW1lbnQoY29tbWVudHM6OkZ1bGxDb21tZW50ICpGQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbCAqRCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIG11dGFibGUgY29tbWVudHM6OkNvbW1hbmRUcmFpdHMgQ29tbWVudENvbW1hbmRUcmFpdHM7CisKKyAgLy8vIFxicmllZiBJdGVyYXRvciB0aGF0IHZpc2l0cyBpbXBvcnQgZGVjbGFyYXRpb25zLgorICBjbGFzcyBpbXBvcnRfaXRlcmF0b3IgeworICAgIEltcG9ydERlY2wgKkltcG9ydCA9IG51bGxwdHI7CisKKyAgcHVibGljOgorICAgIHVzaW5nIHZhbHVlX3R5cGUgPSBJbXBvcnREZWNsICo7CisgICAgdXNpbmcgcmVmZXJlbmNlID0gSW1wb3J0RGVjbCAqOworICAgIHVzaW5nIHBvaW50ZXIgPSBJbXBvcnREZWNsICo7CisgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gaW50OworICAgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZzsKKworICAgIGltcG9ydF9pdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCBpbXBvcnRfaXRlcmF0b3IoSW1wb3J0RGVjbCAqSW1wb3J0KSA6IEltcG9ydChJbXBvcnQpIHt9CisKKyAgICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gSW1wb3J0OyB9CisgICAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gSW1wb3J0OyB9CisKKyAgICBpbXBvcnRfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgICBJbXBvcnQgPSBBU1RDb250ZXh0OjpnZXROZXh0TG9jYWxJbXBvcnQoSW1wb3J0KTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpbXBvcnRfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKKyAgICAgIGltcG9ydF9pdGVyYXRvciBPdGhlcigqdGhpcyk7CisgICAgICArKygqdGhpcyk7CisgICAgICByZXR1cm4gT3RoZXI7CisgICAgfQorCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShpbXBvcnRfaXRlcmF0b3IgWCwgaW1wb3J0X2l0ZXJhdG9yIFkpIHsKKyAgICAgIHJldHVybiBYLkltcG9ydCA9PSBZLkltcG9ydDsKKyAgICB9CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGltcG9ydF9pdGVyYXRvciBYLCBpbXBvcnRfaXRlcmF0b3IgWSkgeworICAgICAgcmV0dXJuIFguSW1wb3J0ICE9IFkuSW1wb3J0OworICAgIH0KKyAgfTsKKworcHVibGljOgorICBjb21tZW50czo6Q29tbWFuZFRyYWl0cyAmZ2V0Q29tbWVudENvbW1hbmRUcmFpdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIENvbW1lbnRDb21tYW5kVHJhaXRzOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuIGRlY2xhcmF0aW9uLgorICBBdHRyVmVjJiBnZXREZWNsQXR0cnMoY29uc3QgRGVjbCAqRCk7CisKKyAgLy8vIFxicmllZiBFcmFzZSB0aGUgYXR0cmlidXRlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBkZWNsYXJhdGlvbi4KKyAgdm9pZCBlcmFzZURlY2xBdHRycyhjb25zdCBEZWNsICpEKTsKKworICAvLy8gXGJyaWVmIElmIHRoaXMgdmFyaWFibGUgaXMgYW4gaW5zdGFudGlhdGVkIHN0YXRpYyBkYXRhIG1lbWJlciBvZiBhCisgIC8vLyBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiwgcmV0dXJucyB0aGUgdGVtcGxhdGVkIHN0YXRpYyBkYXRhIG1lbWJlcgorICAvLy8gZnJvbSB3aGljaCBpdCB3YXMgaW5zdGFudGlhdGVkLgorICAvLyBGSVhNRTogUmVtb3ZlID8KKyAgTWVtYmVyU3BlY2lhbGl6YXRpb25JbmZvICpnZXRJbnN0YW50aWF0ZWRGcm9tU3RhdGljRGF0YU1lbWJlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFyRGVjbCAqVmFyKTsKKworICBUZW1wbGF0ZU9yU3BlY2lhbGl6YXRpb25JbmZvCisgIGdldFRlbXBsYXRlT3JTcGVjaWFsaXphdGlvbkluZm8oY29uc3QgVmFyRGVjbCAqVmFyKTsKKworICBGdW5jdGlvbkRlY2wgKmdldENsYXNzU2NvcGVTcGVjaWFsaXphdGlvblBhdHRlcm4oY29uc3QgRnVuY3Rpb25EZWNsICpGRCk7CisKKyAgdm9pZCBzZXRDbGFzc1Njb3BlU3BlY2lhbGl6YXRpb25QYXR0ZXJuKEZ1bmN0aW9uRGVjbCAqRkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkRlY2wgKlBhdHRlcm4pOworCisgIC8vLyBcYnJpZWYgTm90ZSB0aGF0IHRoZSBzdGF0aWMgZGF0YSBtZW1iZXIgXHAgSW5zdCBpcyBhbiBpbnN0YW50aWF0aW9uIG9mCisgIC8vLyB0aGUgc3RhdGljIGRhdGEgbWVtYmVyIHRlbXBsYXRlIFxwIFRtcGwgb2YgYSBjbGFzcyB0ZW1wbGF0ZS4KKyAgdm9pZCBzZXRJbnN0YW50aWF0ZWRGcm9tU3RhdGljRGF0YU1lbWJlcihWYXJEZWNsICpJbnN0LCBWYXJEZWNsICpUbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kIFRTSywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFBvaW50T2ZJbnN0YW50aWF0aW9uID0gU291cmNlTG9jYXRpb24oKSk7CisKKyAgdm9pZCBzZXRUZW1wbGF0ZU9yU3BlY2lhbGl6YXRpb25JbmZvKFZhckRlY2wgKkluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZU9yU3BlY2lhbGl6YXRpb25JbmZvIFRTSSk7CisKKyAgLy8vIFxicmllZiBJZiB0aGUgZ2l2ZW4gdXNpbmcgZGVjbCBccCBJbnN0IGlzIGFuIGluc3RhbnRpYXRpb24gb2YgYQorICAvLy8gKHBvc3NpYmx5IHVucmVzb2x2ZWQpIHVzaW5nIGRlY2wgZnJvbSBhIHRlbXBsYXRlIGluc3RhbnRpYXRpb24sCisgIC8vLyByZXR1cm4gaXQuCisgIE5hbWVkRGVjbCAqZ2V0SW5zdGFudGlhdGVkRnJvbVVzaW5nRGVjbChOYW1lZERlY2wgKkluc3QpOworCisgIC8vLyBcYnJpZWYgUmVtZW1iZXIgdGhhdCB0aGUgdXNpbmcgZGVjbCBccCBJbnN0IGlzIGFuIGluc3RhbnRpYXRpb24KKyAgLy8vIG9mIHRoZSB1c2luZyBkZWNsIFxwIFBhdHRlcm4gb2YgYSBjbGFzcyB0ZW1wbGF0ZS4KKyAgdm9pZCBzZXRJbnN0YW50aWF0ZWRGcm9tVXNpbmdEZWNsKE5hbWVkRGVjbCAqSW5zdCwgTmFtZWREZWNsICpQYXR0ZXJuKTsKKworICB2b2lkIHNldEluc3RhbnRpYXRlZEZyb21Vc2luZ1NoYWRvd0RlY2woVXNpbmdTaGFkb3dEZWNsICpJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNpbmdTaGFkb3dEZWNsICpQYXR0ZXJuKTsKKyAgVXNpbmdTaGFkb3dEZWNsICpnZXRJbnN0YW50aWF0ZWRGcm9tVXNpbmdTaGFkb3dEZWNsKFVzaW5nU2hhZG93RGVjbCAqSW5zdCk7CisKKyAgRmllbGREZWNsICpnZXRJbnN0YW50aWF0ZWRGcm9tVW5uYW1lZEZpZWxkRGVjbChGaWVsZERlY2wgKkZpZWxkKTsKKworICB2b2lkIHNldEluc3RhbnRpYXRlZEZyb21Vbm5hbWVkRmllbGREZWNsKEZpZWxkRGVjbCAqSW5zdCwgRmllbGREZWNsICpUbXBsKTsKKworICAvLyBBY2Nlc3MgdG8gdGhlIHNldCBvZiBtZXRob2RzIG92ZXJyaWRkZW4gYnkgdGhlIGdpdmVuIEMrKyBtZXRob2QuCisgIHVzaW5nIG92ZXJyaWRkZW5fY3h4X21ldGhvZF9pdGVyYXRvciA9IENYWE1ldGhvZFZlY3Rvcjo6Y29uc3RfaXRlcmF0b3I7CisgIG92ZXJyaWRkZW5fY3h4X21ldGhvZF9pdGVyYXRvcgorICBvdmVycmlkZGVuX21ldGhvZHNfYmVnaW4oY29uc3QgQ1hYTWV0aG9kRGVjbCAqTWV0aG9kKSBjb25zdDsKKworICBvdmVycmlkZGVuX2N4eF9tZXRob2RfaXRlcmF0b3IKKyAgb3ZlcnJpZGRlbl9tZXRob2RzX2VuZChjb25zdCBDWFhNZXRob2REZWNsICpNZXRob2QpIGNvbnN0OworCisgIHVuc2lnbmVkIG92ZXJyaWRkZW5fbWV0aG9kc19zaXplKGNvbnN0IENYWE1ldGhvZERlY2wgKk1ldGhvZCkgY29uc3Q7CisKKyAgdXNpbmcgb3ZlcnJpZGRlbl9tZXRob2RfcmFuZ2UgPQorICAgICAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8b3ZlcnJpZGRlbl9jeHhfbWV0aG9kX2l0ZXJhdG9yPjsKKworICBvdmVycmlkZGVuX21ldGhvZF9yYW5nZSBvdmVycmlkZGVuX21ldGhvZHMoY29uc3QgQ1hYTWV0aG9kRGVjbCAqTWV0aG9kKSBjb25zdDsKKworICAvLy8gXGJyaWVmIE5vdGUgdGhhdCB0aGUgZ2l2ZW4gQysrIFxwIE1ldGhvZCBvdmVycmlkZXMgdGhlIGdpdmVuIFxwCisgIC8vLyBPdmVycmlkZGVuIG1ldGhvZC4KKyAgdm9pZCBhZGRPdmVycmlkZGVuTWV0aG9kKGNvbnN0IENYWE1ldGhvZERlY2wgKk1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWE1ldGhvZERlY2wgKk92ZXJyaWRkZW4pOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIEMrKyBvciBPYmpDIG92ZXJyaWRkZW4gbWV0aG9kcyBmb3IgdGhlIGdpdmVuIFxwIE1ldGhvZC4KKyAgLy8vCisgIC8vLyBBbiBPYmpDIG1ldGhvZCBpcyBjb25zaWRlcmVkIHRvIG92ZXJyaWRlIGFueSBtZXRob2QgaW4gdGhlIGNsYXNzJ3MKKyAgLy8vIGJhc2UgY2xhc3NlcywgaXRzIHByb3RvY29scywgb3IgaXRzIGNhdGVnb3JpZXMnIHByb3RvY29scywgdGhhdCBoYXMKKyAgLy8vIHRoZSBzYW1lIHNlbGVjdG9yIGFuZCBpcyBvZiB0aGUgc2FtZSBraW5kIChjbGFzcyBvciBpbnN0YW5jZSkuCisgIC8vLyBBIG1ldGhvZCBpbiBhbiBpbXBsZW1lbnRhdGlvbiBpcyBub3QgY29uc2lkZXJlZCBhcyBvdmVycmlkaW5nIHRoZSBzYW1lCisgIC8vLyBtZXRob2QgaW4gdGhlIGludGVyZmFjZSBvciBpdHMgY2F0ZWdvcmllcy4KKyAgdm9pZCBnZXRPdmVycmlkZGVuTWV0aG9kcygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWVkRGVjbCAqTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IE5hbWVkRGVjbCAqPiAmT3ZlcnJpZGRlbikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBOb3RpZnkgdGhlIEFTVCBjb250ZXh0IHRoYXQgYSBuZXcgaW1wb3J0IGRlY2xhcmF0aW9uIGhhcyBiZWVuCisgIC8vLyBwYXJzZWQgb3IgaW1wbGljaXRseSBjcmVhdGVkIHdpdGhpbiB0aGlzIHRyYW5zbGF0aW9uIHVuaXQuCisgIHZvaWQgYWRkZWRMb2NhbEltcG9ydERlY2woSW1wb3J0RGVjbCAqSW1wb3J0KTsKKworICBzdGF0aWMgSW1wb3J0RGVjbCAqZ2V0TmV4dExvY2FsSW1wb3J0KEltcG9ydERlY2wgKkltcG9ydCkgeworICAgIHJldHVybiBJbXBvcnQtPk5leHRMb2NhbEltcG9ydDsKKyAgfQorCisgIHVzaW5nIGltcG9ydF9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGltcG9ydF9pdGVyYXRvcj47CisKKyAgaW1wb3J0X3JhbmdlIGxvY2FsX2ltcG9ydHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGltcG9ydF9yYW5nZShpbXBvcnRfaXRlcmF0b3IoRmlyc3RMb2NhbEltcG9ydCksIGltcG9ydF9pdGVyYXRvcigpKTsKKyAgfQorCisgIERlY2wgKmdldFByaW1hcnlNZXJnZWREZWNsKERlY2wgKkQpIHsKKyAgICBEZWNsICpSZXN1bHQgPSBNZXJnZWREZWNscy5sb29rdXAoRCk7CisgICAgcmV0dXJuIFJlc3VsdCA/IFJlc3VsdCA6IEQ7CisgIH0KKyAgdm9pZCBzZXRQcmltYXJ5TWVyZ2VkRGVjbChEZWNsICpELCBEZWNsICpQcmltYXJ5KSB7CisgICAgTWVyZ2VkRGVjbHNbRF0gPSBQcmltYXJ5OworICB9CisKKyAgLy8vIFxicmllZiBOb3RlIHRoYXQgdGhlIGRlZmluaXRpb24gXHAgTkQgaGFzIGJlZW4gbWVyZ2VkIGludG8gbW9kdWxlIFxwIE0sCisgIC8vLyBhbmQgc2hvdWxkIGJlIHZpc2libGUgd2hlbmV2ZXIgXHAgTSBpcyB2aXNpYmxlLgorICB2b2lkIG1lcmdlRGVmaW5pdGlvbkludG9Nb2R1bGUoTmFtZWREZWNsICpORCwgTW9kdWxlICpNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb3RpZnlMaXN0ZW5lcnMgPSB0cnVlKTsKKworICAvLy8gXGJyaWVmIENsZWFuIHVwIHRoZSBtZXJnZWQgZGVmaW5pdGlvbiBsaXN0LiBDYWxsIHRoaXMgaWYgeW91IG1pZ2h0IGhhdmUKKyAgLy8vIGFkZGVkIGR1cGxpY2F0ZXMgaW50byB0aGUgbGlzdC4KKyAgdm9pZCBkZWR1cGxpY2F0ZU1lcmdlZERlZmluaXRvbnNGb3IoTmFtZWREZWNsICpORCk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGFkZGl0aW9uYWwgbW9kdWxlcyBpbiB3aGljaCB0aGUgZGVmaW5pdGlvbiBccCBEZWYgaGFzCisgIC8vLyBiZWVuIG1lcmdlZC4KKyAgQXJyYXlSZWY8TW9kdWxlKj4gZ2V0TW9kdWxlc1dpdGhNZXJnZWREZWZpbml0aW9uKGNvbnN0IE5hbWVkRGVjbCAqRGVmKSB7CisgICAgYXV0byBNZXJnZWRJdCA9IE1lcmdlZERlZk1vZHVsZXMuZmluZChEZWYpOworICAgIGlmIChNZXJnZWRJdCA9PSBNZXJnZWREZWZNb2R1bGVzLmVuZCgpKQorICAgICAgcmV0dXJuIE5vbmU7CisgICAgcmV0dXJuIE1lcmdlZEl0LT5zZWNvbmQ7CisgIH0KKworICAvLy8gQWRkIGEgZGVjbGFyYXRpb24gdG8gdGhlIGxpc3Qgb2YgZGVjbGFyYXRpb25zIHRoYXQgYXJlIGluaXRpYWxpemVkCisgIC8vLyBmb3IgYSBtb2R1bGUuIFRoaXMgd2lsbCB0eXBpY2FsbHkgYmUgYSBnbG9iYWwgdmFyaWFibGUgKHdpdGggaW50ZXJuYWwKKyAgLy8vIGxpbmthZ2UpIHRoYXQgcnVucyBtb2R1bGUgaW5pdGlhbGl6ZXJzLCBzdWNoIGFzIHRoZSBpb3N0cmVhbSBpbml0aWFsaXplciwKKyAgLy8vIG9yIGFuIEltcG9ydERlY2wgbm9taW5hdGluZyBhbm90aGVyIG1vZHVsZSB0aGF0IGhhcyBpbml0aWFsaXplcnMuCisgIHZvaWQgYWRkTW9kdWxlSW5pdGlhbGl6ZXIoTW9kdWxlICpNLCBEZWNsICpJbml0KTsKKworICB2b2lkIGFkZExhenlNb2R1bGVJbml0aWFsaXplcnMoTW9kdWxlICpNLCBBcnJheVJlZjx1aW50MzJfdD4gSURzKTsKKworICAvLy8gR2V0IHRoZSBpbml0aWFsaXphdGlvbnMgdG8gcGVyZm9ybSB3aGVuIGltcG9ydGluZyBhIG1vZHVsZSwgaWYgYW55LgorICBBcnJheVJlZjxEZWNsKj4gZ2V0TW9kdWxlSW5pdGlhbGl6ZXJzKE1vZHVsZSAqTSk7CisKKyAgVHJhbnNsYXRpb25Vbml0RGVjbCAqZ2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpIGNvbnN0IHsgcmV0dXJuIFRVRGVjbDsgfQorCisgIEV4dGVybkNDb250ZXh0RGVjbCAqZ2V0RXh0ZXJuQ0NvbnRleHREZWNsKCkgY29uc3Q7CisgIEJ1aWx0aW5UZW1wbGF0ZURlY2wgKmdldE1ha2VJbnRlZ2VyU2VxRGVjbCgpIGNvbnN0OworICBCdWlsdGluVGVtcGxhdGVEZWNsICpnZXRUeXBlUGFja0VsZW1lbnREZWNsKCkgY29uc3Q7CisKKyAgLy8gQnVpbHRpbiBUeXBlcy4KKyAgQ2FuUXVhbFR5cGUgVm9pZFR5OworICBDYW5RdWFsVHlwZSBCb29sVHk7CisgIENhblF1YWxUeXBlIENoYXJUeTsKKyAgQ2FuUXVhbFR5cGUgV0NoYXJUeTsgIC8vIFtDKysgMy45LjFwNV0uCisgIENhblF1YWxUeXBlIFdpZGVDaGFyVHk7IC8vIFNhbWUgYXMgV0NoYXJUeSBpbiBDKyssIGludGVnZXIgdHlwZSBpbiBDOTkuCisgIENhblF1YWxUeXBlIFdJbnRUeTsgICAvLyBbQzk5IDcuMjQuMV0sIGludGVnZXIgdHlwZSB1bmNoYW5nZWQgYnkgZGVmYXVsdCBwcm9tb3Rpb25zLgorICBDYW5RdWFsVHlwZSBDaGFyMTZUeTsgLy8gW0MrKzB4IDMuOS4xcDVdLCBpbnRlZ2VyIHR5cGUgaW4gQzk5LgorICBDYW5RdWFsVHlwZSBDaGFyMzJUeTsgLy8gW0MrKzB4IDMuOS4xcDVdLCBpbnRlZ2VyIHR5cGUgaW4gQzk5LgorICBDYW5RdWFsVHlwZSBTaWduZWRDaGFyVHksIFNob3J0VHksIEludFR5LCBMb25nVHksIExvbmdMb25nVHksIEludDEyOFR5OworICBDYW5RdWFsVHlwZSBVbnNpZ25lZENoYXJUeSwgVW5zaWduZWRTaG9ydFR5LCBVbnNpZ25lZEludFR5LCBVbnNpZ25lZExvbmdUeTsKKyAgQ2FuUXVhbFR5cGUgVW5zaWduZWRMb25nTG9uZ1R5LCBVbnNpZ25lZEludDEyOFR5OworICBDYW5RdWFsVHlwZSBGbG9hdFR5LCBEb3VibGVUeSwgTG9uZ0RvdWJsZVR5LCBGbG9hdDEyOFR5OworICBDYW5RdWFsVHlwZSBIYWxmVHk7IC8vIFtPcGVuQ0wgNi4xLjEuMV0sIEFSTSBORU9OCisgIENhblF1YWxUeXBlIEZsb2F0MTZUeTsgLy8gQzExIGV4dGVuc2lvbiBJU08vSUVDIFRTIDE4NjYxLTMKKyAgQ2FuUXVhbFR5cGUgRmxvYXRDb21wbGV4VHksIERvdWJsZUNvbXBsZXhUeSwgTG9uZ0RvdWJsZUNvbXBsZXhUeTsKKyAgQ2FuUXVhbFR5cGUgRmxvYXQxMjhDb21wbGV4VHk7CisgIENhblF1YWxUeXBlIFZvaWRQdHJUeSwgTnVsbFB0clR5OworICBDYW5RdWFsVHlwZSBEZXBlbmRlbnRUeSwgT3ZlcmxvYWRUeSwgQm91bmRNZW1iZXJUeSwgVW5rbm93bkFueVR5OworICBDYW5RdWFsVHlwZSBCdWlsdGluRm5UeTsKKyAgQ2FuUXVhbFR5cGUgUHNldWRvT2JqZWN0VHksIEFSQ1VuYnJpZGdlZENhc3RUeTsKKyAgQ2FuUXVhbFR5cGUgT2JqQ0J1aWx0aW5JZFR5LCBPYmpDQnVpbHRpbkNsYXNzVHksIE9iakNCdWlsdGluU2VsVHk7CisgIENhblF1YWxUeXBlIE9iakNCdWlsdGluQm9vbFR5OworI2RlZmluZSBJTUFHRV9UWVBFKEltZ1R5cGUsIElkLCBTaW5nbGV0b25JZCwgQWNjZXNzLCBTdWZmaXgpIFwKKyAgQ2FuUXVhbFR5cGUgU2luZ2xldG9uSWQ7CisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3BlbkNMSW1hZ2VUeXBlcy5kZWYiCisgIENhblF1YWxUeXBlIE9DTFNhbXBsZXJUeSwgT0NMRXZlbnRUeSwgT0NMQ2xrRXZlbnRUeTsKKyAgQ2FuUXVhbFR5cGUgT0NMUXVldWVUeSwgT0NMUmVzZXJ2ZUlEVHk7CisgIENhblF1YWxUeXBlIE9NUEFycmF5U2VjdGlvblR5OworCisgIC8vIFR5cGVzIGZvciBkZWR1Y3Rpb25zIGluIEMrKzB4IFtzdG10LnJhbmdlZF0ncyBkZXN1Z2FyaW5nLiBCdWlsdCBvbiBkZW1hbmQuCisgIG11dGFibGUgUXVhbFR5cGUgQXV0b0RlZHVjdFR5OyAgICAgLy8gRGVkdWN0aW9uIGFnYWluc3QgJ2F1dG8nLgorICBtdXRhYmxlIFF1YWxUeXBlIEF1dG9SUmVmRGVkdWN0VHk7IC8vIERlZHVjdGlvbiBhZ2FpbnN0ICdhdXRvICYmJy4KKworICAvLyBEZWNsIHVzZWQgdG8gaGVscCBkZWZpbmUgX19idWlsdGluX3ZhX2xpc3QgZm9yIHNvbWUgdGFyZ2V0cy4KKyAgLy8gVGhlIGRlY2wgaXMgYnVpbHQgd2hlbiBjb25zdHJ1Y3RpbmcgJ0J1aWx0aW5WYUxpc3REZWNsJy4KKyAgbXV0YWJsZSBEZWNsICpWYUxpc3RUYWdEZWNsOworCisgIEFTVENvbnRleHQoTGFuZ09wdGlvbnMgJkxPcHRzLCBTb3VyY2VNYW5hZ2VyICZTTSwgSWRlbnRpZmllclRhYmxlICZpZGVudHMsCisgICAgICAgICAgICAgU2VsZWN0b3JUYWJsZSAmc2VscywgQnVpbHRpbjo6Q29udGV4dCAmYnVpbHRpbnMpOworICBBU1RDb250ZXh0KGNvbnN0IEFTVENvbnRleHQgJikgPSBkZWxldGU7CisgIEFTVENvbnRleHQgJm9wZXJhdG9yPShjb25zdCBBU1RDb250ZXh0ICYpID0gZGVsZXRlOworICB+QVNUQ29udGV4dCgpOworCisgIC8vLyBcYnJpZWYgQXR0YWNoIGFuIGV4dGVybmFsIEFTVCBzb3VyY2UgdG8gdGhlIEFTVCBjb250ZXh0LgorICAvLy8KKyAgLy8vIFRoZSBleHRlcm5hbCBBU1Qgc291cmNlIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGxvYWQgcGFydHMgb2YKKyAgLy8vIHRoZSBhYnN0cmFjdCBzeW50YXggdHJlZSBhcyBuZWVkZWQgZnJvbSBzb21lIGV4dGVybmFsIHN0b3JhZ2UsCisgIC8vLyBlLmcuLCBhIHByZWNvbXBpbGVkIGhlYWRlci4KKyAgdm9pZCBzZXRFeHRlcm5hbFNvdXJjZShJbnRydXNpdmVSZWZDbnRQdHI8RXh0ZXJuYWxBU1RTb3VyY2U+IFNvdXJjZSk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBhIHBvaW50ZXIgdG8gdGhlIGV4dGVybmFsIEFTVCBzb3VyY2UgYXNzb2NpYXRlZAorICAvLy8gd2l0aCB0aGlzIEFTVCBjb250ZXh0LCBpZiBhbnkuCisgIEV4dGVybmFsQVNUU291cmNlICpnZXRFeHRlcm5hbFNvdXJjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRXh0ZXJuYWxTb3VyY2UuZ2V0KCk7CisgIH0KKworICAvLy8gXGJyaWVmIEF0dGFjaCBhbiBBU1QgbXV0YXRpb24gbGlzdGVuZXIgdG8gdGhlIEFTVCBjb250ZXh0LgorICAvLy8KKyAgLy8vIFRoZSBBU1QgbXV0YXRpb24gbGlzdGVuZXIgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gdHJhY2sgbW9kaWZpY2F0aW9ucyB0bworICAvLy8gdGhlIGFic3RyYWN0IHN5bnRheCB0cmVlIGVudGl0aWVzIGNvbW1pdHRlZCBhZnRlciB0aGV5IHdlcmUgaW5pdGlhbGx5CisgIC8vLyBjcmVhdGVkLgorICB2b2lkIHNldEFTVE11dGF0aW9uTGlzdGVuZXIoQVNUTXV0YXRpb25MaXN0ZW5lciAqTGlzdGVuZXIpIHsKKyAgICB0aGlzLT5MaXN0ZW5lciA9IExpc3RlbmVyOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBhIHBvaW50ZXIgdG8gdGhlIEFTVCBtdXRhdGlvbiBsaXN0ZW5lciBhc3NvY2lhdGVkCisgIC8vLyB3aXRoIHRoaXMgQVNUIGNvbnRleHQsIGlmIGFueS4KKyAgQVNUTXV0YXRpb25MaXN0ZW5lciAqZ2V0QVNUTXV0YXRpb25MaXN0ZW5lcigpIGNvbnN0IHsgcmV0dXJuIExpc3RlbmVyOyB9CisKKyAgdm9pZCBQcmludFN0YXRzKCkgY29uc3Q7CisgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxUeXBlICo+JiBnZXRUeXBlcygpIGNvbnN0IHsgcmV0dXJuIFR5cGVzOyB9CisKKyAgQnVpbHRpblRlbXBsYXRlRGVjbCAqYnVpbGRCdWlsdGluVGVtcGxhdGVEZWNsKEJ1aWx0aW5UZW1wbGF0ZUtpbmQgQlRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSWRlbnRpZmllckluZm8gKklJKSBjb25zdDsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyBpbXBsaWNpdCBUVS1sZXZlbCBDWFhSZWNvcmREZWNsIG9yIFJlY29yZERlY2wKKyAgLy8vIGRlY2xhcmF0aW9uLgorICBSZWNvcmREZWNsICpidWlsZEltcGxpY2l0UmVjb3JkKFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZERlY2w6OlRhZ0tpbmQgVEsgPSBUVEtfU3RydWN0KSBjb25zdDsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyBpbXBsaWNpdCBUVS1sZXZlbCB0eXBlZGVmIGRlY2xhcmF0aW9uLgorICBUeXBlZGVmRGVjbCAqYnVpbGRJbXBsaWNpdFR5cGVkZWYoUXVhbFR5cGUgVCwgU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGRlY2xhcmF0aW9uIGZvciB0aGUgMTI4LWJpdCBzaWduZWQgaW50ZWdlciB0eXBlLgorICBUeXBlZGVmRGVjbCAqZ2V0SW50MTI4RGVjbCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGRlY2xhcmF0aW9uIGZvciB0aGUgMTI4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuCisgIFR5cGVkZWZEZWNsICpnZXRVSW50MTI4RGVjbCgpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgQ29uc3RydWN0b3JzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIFJldHVybiBhIHR5cGUgd2l0aCBleHRlbmRlZCBxdWFsaWZpZXJzLgorICBRdWFsVHlwZSBnZXRFeHRRdWFsVHlwZShjb25zdCBUeXBlICpCYXNlLCBRdWFsaWZpZXJzIFF1YWxzKSBjb25zdDsKKworICBRdWFsVHlwZSBnZXRUeXBlRGVjbFR5cGVTbG93KGNvbnN0IFR5cGVEZWNsICpEZWNsKSBjb25zdDsKKworICBRdWFsVHlwZSBnZXRQaXBlVHlwZShRdWFsVHlwZSBULCBib29sIFJlYWRPbmx5KSBjb25zdDsKKworcHVibGljOgorICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdW5pcXVlZCByZWZlcmVuY2UgdG8gdGhlIHR5cGUgZm9yIGFuIGFkZHJlc3Mgc3BhY2UKKyAgLy8vIHF1YWxpZmllZCB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCB0eXBlIGFuZCBhZGRyZXNzIHNwYWNlLgorICAvLy8KKyAgLy8vIFRoZSByZXN1bHRpbmcgdHlwZSBoYXMgYSB1bmlvbiBvZiB0aGUgcXVhbGlmaWVycyBmcm9tIFQgYW5kIHRoZSBhZGRyZXNzCisgIC8vLyBzcGFjZS4gSWYgVCBhbHJlYWR5IGhhcyBhbiBhZGRyZXNzIHNwYWNlIHNwZWNpZmllciwgaXQgaXMgc2lsZW50bHkKKyAgLy8vIHJlcGxhY2VkLgorICBRdWFsVHlwZSBnZXRBZGRyU3BhY2VRdWFsVHlwZShRdWFsVHlwZSBULCBMYW5nQVMgQWRkcmVzc1NwYWNlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJlbW92ZSBhbnkgZXhpc3RpbmcgYWRkcmVzcyBzcGFjZSBvbiB0aGUgdHlwZSBhbmQgcmV0dXJucyB0aGUgdHlwZQorICAvLy8gd2l0aCBxdWFsaWZpZXJzIGludGFjdCAob3IgdGhhdCdzIHRoZSBpZGVhIGFueXdheSkKKyAgLy8vCisgIC8vLyBUaGUgcmV0dXJuIHR5cGUgc2hvdWxkIGJlIFQgd2l0aCBhbGwgcHJpb3IgcXVhbGlmaWVycyBtaW51cyB0aGUgYWRkcmVzcworICAvLy8gc3BhY2UuCisgIFF1YWxUeXBlIHJlbW92ZUFkZHJTcGFjZVF1YWxUeXBlKFF1YWxUeXBlIFQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQXBwbHkgT2JqZWN0aXZlLUMgcHJvdG9jb2wgcXVhbGlmaWVycyB0byB0aGUgZ2l2ZW4gdHlwZS4KKyAgLy8vIFxwYXJhbSBhbGxvd09uUG9pbnRlclR5cGUgc3BlY2lmaWVzIGlmIHdlIGNhbiBhcHBseSBwcm90b2NvbAorICAvLy8gcXVhbGlmaWVycyBvbiBPYmpDT2JqZWN0UG9pbnRlclR5cGUuIEl0IGNhbiBiZSBzZXQgdG8gdHJ1ZSB3aGVuCisgIC8vLyBjb250cnVjdGluZyB0aGUgY2Fub25pY2FsIHR5cGUgb2YgYSBPYmplY3RpdmUtQyB0eXBlIHBhcmFtZXRlci4KKyAgUXVhbFR5cGUgYXBwbHlPYmpDUHJvdG9jb2xRdWFsaWZpZXJzKFF1YWxUeXBlIHR5cGUsCisgICAgICBBcnJheVJlZjxPYmpDUHJvdG9jb2xEZWNsICo+IHByb3RvY29scywgYm9vbCAmaGFzRXJyb3IsCisgICAgICBib29sIGFsbG93T25Qb2ludGVyVHlwZSA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdW5pcXVlZCByZWZlcmVuY2UgdG8gdGhlIHR5cGUgZm9yIGFuIE9iamVjdGl2ZS1DCisgIC8vLyBnYy1xdWFsaWZpZWQgdHlwZS4KKyAgLy8vCisgIC8vLyBUaGUgcmV0dWx0aW5nIHR5cGUgaGFzIGEgdW5pb24gb2YgdGhlIHF1YWxpZmllcnMgZnJvbSBUIGFuZCB0aGUgZ2MKKyAgLy8vIGF0dHJpYnV0ZS4KKyAgUXVhbFR5cGUgZ2V0T2JqQ0dDUXVhbFR5cGUoUXVhbFR5cGUgVCwgUXVhbGlmaWVyczo6R0MgZ2NBdHRyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdW5pcXVlZCByZWZlcmVuY2UgdG8gdGhlIHR5cGUgZm9yIGEgXGMgcmVzdHJpY3QKKyAgLy8vIHF1YWxpZmllZCB0eXBlLgorICAvLy8KKyAgLy8vIFRoZSByZXN1bHRpbmcgdHlwZSBoYXMgYSB1bmlvbiBvZiB0aGUgcXVhbGlmaWVycyBmcm9tIFxwIFQgYW5kCisgIC8vLyBcYyByZXN0cmljdC4KKyAgUXVhbFR5cGUgZ2V0UmVzdHJpY3RUeXBlKFF1YWxUeXBlIFQpIGNvbnN0IHsKKyAgICByZXR1cm4gVC53aXRoRmFzdFF1YWxpZmllcnMoUXVhbGlmaWVyczo6UmVzdHJpY3QpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHVuaXF1ZWQgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIGZvciBhIFxjIHZvbGF0aWxlCisgIC8vLyBxdWFsaWZpZWQgdHlwZS4KKyAgLy8vCisgIC8vLyBUaGUgcmVzdWx0aW5nIHR5cGUgaGFzIGEgdW5pb24gb2YgdGhlIHF1YWxpZmllcnMgZnJvbSBccCBUIGFuZAorICAvLy8gXGMgdm9sYXRpbGUuCisgIFF1YWxUeXBlIGdldFZvbGF0aWxlVHlwZShRdWFsVHlwZSBUKSBjb25zdCB7CisgICAgcmV0dXJuIFQud2l0aEZhc3RRdWFsaWZpZXJzKFF1YWxpZmllcnM6OlZvbGF0aWxlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB1bmlxdWVkIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBmb3IgYSBcYyBjb25zdAorICAvLy8gcXVhbGlmaWVkIHR5cGUuCisgIC8vLworICAvLy8gVGhlIHJlc3VsdGluZyB0eXBlIGhhcyBhIHVuaW9uIG9mIHRoZSBxdWFsaWZpZXJzIGZyb20gXHAgVCBhbmQgXGMgY29uc3QuCisgIC8vLworICAvLy8gSXQgY2FuIGJlIHJlYXNvbmFibHkgZXhwZWN0ZWQgdGhhdCB0aGlzIHdpbGwgYWx3YXlzIGJlIGVxdWl2YWxlbnQgdG8KKyAgLy8vIGNhbGxpbmcgVC53aXRoQ29uc3QoKS4KKyAgUXVhbFR5cGUgZ2V0Q29uc3RUeXBlKFF1YWxUeXBlIFQpIGNvbnN0IHsgcmV0dXJuIFQud2l0aENvbnN0KCk7IH0KKworICAvLy8gXGJyaWVmIENoYW5nZSB0aGUgRXh0SW5mbyBvbiBhIGZ1bmN0aW9uIHR5cGUuCisgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqYWRqdXN0RnVuY3Rpb25UeXBlKGNvbnN0IEZ1bmN0aW9uVHlwZSAqRm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbyBFSW5mbyk7CisKKyAgLy8vIEFkanVzdCB0aGUgZ2l2ZW4gZnVuY3Rpb24gcmVzdWx0IHR5cGUuCisgIENhblF1YWxUeXBlIGdldENhbm9uaWNhbEZ1bmN0aW9uUmVzdWx0VHlwZShRdWFsVHlwZSBSZXN1bHRUeXBlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIENoYW5nZSB0aGUgcmVzdWx0IHR5cGUgb2YgYSBmdW5jdGlvbiB0eXBlIG9uY2UgaXQgaXMgZGVkdWNlZC4KKyAgdm9pZCBhZGp1c3REZWR1Y2VkRnVuY3Rpb25SZXN1bHRUeXBlKEZ1bmN0aW9uRGVjbCAqRkQsIFF1YWxUeXBlIFJlc3VsdFR5cGUpOworCisgIC8vLyBHZXQgYSBmdW5jdGlvbiB0eXBlIGFuZCBwcm9kdWNlIHRoZSBlcXVpdmFsZW50IGZ1bmN0aW9uIHR5cGUgd2l0aCB0aGUKKyAgLy8vIHNwZWNpZmllZCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4gVHlwZSBzdWdhciB0aGF0IGNhbiBiZSBwcmVzZW50IG9uIGEKKyAgLy8vIGRlY2xhcmF0aW9uIG9mIGEgZnVuY3Rpb24gd2l0aCBhbiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBpcyBwZXJtaXR0ZWQKKyAgLy8vIGFuZCBwcmVzZXJ2ZWQuIE90aGVyIHR5cGUgc3VnYXIgKGZvciBpbnN0YW5jZSwgdHlwZWRlZnMpIGlzIG5vdC4KKyAgUXVhbFR5cGUgZ2V0RnVuY3Rpb25UeXBlV2l0aEV4Y2VwdGlvblNwZWMoCisgICAgICBRdWFsVHlwZSBPcmlnLCBjb25zdCBGdW5jdGlvblByb3RvVHlwZTo6RXhjZXB0aW9uU3BlY0luZm8gJkVTSSk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0d28gZnVuY3Rpb24gdHlwZXMgYXJlIHRoZSBzYW1lLCBpZ25vcmluZworICAvLy8gZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIGluIGNhc2VzIHdoZXJlIHRoZXkncmUgcGFydCBvZiB0aGUgdHlwZS4KKyAgYm9vbCBoYXNTYW1lRnVuY3Rpb25UeXBlSWdub3JpbmdFeGNlcHRpb25TcGVjKFF1YWxUeXBlIFQsIFF1YWxUeXBlIFUpOworCisgIC8vLyBcYnJpZWYgQ2hhbmdlIHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBvbiBhIGZ1bmN0aW9uIG9uY2UgaXQgaXMKKyAgLy8vIGRlbGF5LXBhcnNlZCwgaW5zdGFudGlhdGVkLCBvciBjb21wdXRlZC4KKyAgdm9pZCBhZGp1c3RFeGNlcHRpb25TcGVjKEZ1bmN0aW9uRGVjbCAqRkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZTo6RXhjZXB0aW9uU3BlY0luZm8gJkVTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQXNXcml0dGVuID0gZmFsc2UpOworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciBhIHR5cGUgaXMgYSBjbGFzcyB0aGF0IHNob3VsZCBiZSBkZXRydWN0ZWQgaW4gdGhlCisgIC8vLyBjYWxsZWUgZnVuY3Rpb24uCisgIGJvb2wgaXNQYXJhbURlc3Ryb3llZEluQ2FsbGVlKFF1YWxUeXBlIFQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB1bmlxdWVkIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBmb3IgYSBjb21wbGV4CisgIC8vLyBudW1iZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdHlwZS4KKyAgUXVhbFR5cGUgZ2V0Q29tcGxleFR5cGUoUXVhbFR5cGUgVCkgY29uc3Q7CisgIENhblF1YWxUeXBlIGdldENvbXBsZXhUeXBlKENhblF1YWxUeXBlIFQpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2FuUXVhbFR5cGU6OkNyZWF0ZVVuc2FmZShnZXRDb21wbGV4VHlwZSgoUXVhbFR5cGUpIFQpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB1bmlxdWVkIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBmb3IgYSBwb2ludGVyIHRvCisgIC8vLyB0aGUgc3BlY2lmaWVkIHR5cGUuCisgIFF1YWxUeXBlIGdldFBvaW50ZXJUeXBlKFF1YWxUeXBlIFQpIGNvbnN0OworICBDYW5RdWFsVHlwZSBnZXRQb2ludGVyVHlwZShDYW5RdWFsVHlwZSBUKSBjb25zdCB7CisgICAgcmV0dXJuIENhblF1YWxUeXBlOjpDcmVhdGVVbnNhZmUoZ2V0UG9pbnRlclR5cGUoKFF1YWxUeXBlKSBUKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdW5pcXVlZCByZWZlcmVuY2UgdG8gYSB0eXBlIGFkanVzdGVkIGZyb20gdGhlIG9yaWdpbmFsCisgIC8vLyB0eXBlIHRvIGEgbmV3IHR5cGUuCisgIFF1YWxUeXBlIGdldEFkanVzdGVkVHlwZShRdWFsVHlwZSBPcmlnLCBRdWFsVHlwZSBOZXcpIGNvbnN0OworICBDYW5RdWFsVHlwZSBnZXRBZGp1c3RlZFR5cGUoQ2FuUXVhbFR5cGUgT3JpZywgQ2FuUXVhbFR5cGUgTmV3KSBjb25zdCB7CisgICAgcmV0dXJuIENhblF1YWxUeXBlOjpDcmVhdGVVbnNhZmUoCisgICAgICAgIGdldEFkanVzdGVkVHlwZSgoUXVhbFR5cGUpT3JpZywgKFF1YWxUeXBlKU5ldykpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHVuaXF1ZWQgcmVmZXJlbmNlIHRvIHRoZSBkZWNheWVkIHZlcnNpb24gb2YgdGhlIGdpdmVuCisgIC8vLyB0eXBlLiAgQ2FuIG9ubHkgYmUgY2FsbGVkIG9uIGFycmF5IGFuZCBmdW5jdGlvbiB0eXBlcyB3aGljaCBkZWNheSB0bworICAvLy8gcG9pbnRlciB0eXBlcy4KKyAgUXVhbFR5cGUgZ2V0RGVjYXllZFR5cGUoUXVhbFR5cGUgVCkgY29uc3Q7CisgIENhblF1YWxUeXBlIGdldERlY2F5ZWRUeXBlKENhblF1YWxUeXBlIFQpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2FuUXVhbFR5cGU6OkNyZWF0ZVVuc2FmZShnZXREZWNheWVkVHlwZSgoUXVhbFR5cGUpIFQpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB1bmlxdWVkIHJlZmVyZW5jZSB0byB0aGUgYXRvbWljIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHR5cGUuCisgIFF1YWxUeXBlIGdldEF0b21pY1R5cGUoUXVhbFR5cGUgVCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHVuaXF1ZWQgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIGZvciBhIGJsb2NrIG9mIHRoZQorICAvLy8gc3BlY2lmaWVkIHR5cGUuCisgIFF1YWxUeXBlIGdldEJsb2NrUG9pbnRlclR5cGUoUXVhbFR5cGUgVCkgY29uc3Q7CisKKyAgLy8vIEdldHMgdGhlIHN0cnVjdCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGRlc2NyaXB0b3IgZm9yIHBvaW50ZXIgdG8KKyAgLy8vIGJsb2Nrcy4KKyAgUXVhbFR5cGUgZ2V0QmxvY2tEZXNjcmlwdG9yVHlwZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgcmVhZF9vbmx5IHBpcGUgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLgorICBRdWFsVHlwZSBnZXRSZWFkUGlwZVR5cGUoUXVhbFR5cGUgVCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSB3cml0ZV9vbmx5IHBpcGUgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLgorICBRdWFsVHlwZSBnZXRXcml0ZVBpcGVUeXBlKFF1YWxUeXBlIFQpIGNvbnN0OworCisgIC8vLyBHZXRzIHRoZSBzdHJ1Y3QgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBleHRlbmRlZCBkZXNjcmlwdG9yIGZvcgorICAvLy8gcG9pbnRlciB0byBibG9ja3MuCisgIFF1YWxUeXBlIGdldEJsb2NrRGVzY3JpcHRvckV4dGVuZGVkVHlwZSgpIGNvbnN0OworCisgIC8vLyBNYXAgYW4gQVNUIFR5cGUgdG8gYW4gT3BlbkNMVHlwZUtpbmQgZW51bSB2YWx1ZS4KKyAgVGFyZ2V0SW5mbzo6T3BlbkNMVHlwZUtpbmQgZ2V0T3BlbkNMVHlwZUtpbmQoY29uc3QgVHlwZSAqVCkgY29uc3Q7CisKKyAgLy8vIEdldCBhZGRyZXNzIHNwYWNlIGZvciBPcGVuQ0wgdHlwZS4KKyAgTGFuZ0FTIGdldE9wZW5DTFR5cGVBZGRyU3BhY2UoY29uc3QgVHlwZSAqVCkgY29uc3Q7CisKKyAgdm9pZCBzZXRjdWRhQ29uZmlndXJlQ2FsbERlY2woRnVuY3Rpb25EZWNsICpGRCkgeworICAgIGN1ZGFDb25maWd1cmVDYWxsRGVjbCA9IEZEOworICB9CisKKyAgRnVuY3Rpb25EZWNsICpnZXRjdWRhQ29uZmlndXJlQ2FsbERlY2woKSB7CisgICAgcmV0dXJuIGN1ZGFDb25maWd1cmVDYWxsRGVjbDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWZmIHdlIG5lZWQgY29weS9kaXNwb3NlIGhlbHBlcnMgZm9yIHRoZSBnaXZlbiB0eXBlLgorICBib29sIEJsb2NrUmVxdWlyZXNDb3B5aW5nKFF1YWxUeXBlIFR5LCBjb25zdCBWYXJEZWNsICpEKTsKKworICAvLy8gUmV0dXJucyB0cnVlLCBpZiBnaXZlbiB0eXBlIGhhcyBhIGtub3duIGxpZmV0aW1lLiBIYXNCeXJlZkV4dGVuZGVkTGF5b3V0IGlzIHNldAorICAvLy8gdG8gZmFsc2UgaW4gdGhpcyBjYXNlLiBJZiBIYXNCeXJlZkV4dGVuZGVkTGF5b3V0IHJldHVybnMgdHJ1ZSwgYnlyZWYgdmFyaWFibGUKKyAgLy8vIGhhcyBleHRlbmRlZCBsaWZldGltZS4KKyAgYm9vbCBnZXRCeXJlZkxpZmV0aW1lKFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgUXVhbGlmaWVyczo6T2JqQ0xpZmV0aW1lICZMaWZldGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkhhc0J5cmVmRXh0ZW5kZWRMYXlvdXQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB1bmlxdWVkIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBmb3IgYW4gbHZhbHVlIHJlZmVyZW5jZQorICAvLy8gdG8gdGhlIHNwZWNpZmllZCB0eXBlLgorICBRdWFsVHlwZSBnZXRMVmFsdWVSZWZlcmVuY2VUeXBlKFF1YWxUeXBlIFQsIGJvb2wgU3BlbGxlZEFzTFZhbHVlID0gdHJ1ZSkKKyAgICBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdW5pcXVlZCByZWZlcmVuY2UgdG8gdGhlIHR5cGUgZm9yIGFuIHJ2YWx1ZSByZWZlcmVuY2UKKyAgLy8vIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgUXVhbFR5cGUgZ2V0UlZhbHVlUmVmZXJlbmNlVHlwZShRdWFsVHlwZSBUKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdW5pcXVlZCByZWZlcmVuY2UgdG8gdGhlIHR5cGUgZm9yIGEgbWVtYmVyIHBvaW50ZXIgdG8KKyAgLy8vIHRoZSBzcGVjaWZpZWQgdHlwZSBpbiB0aGUgc3BlY2lmaWVkIGNsYXNzLgorICAvLy8KKyAgLy8vIFRoZSBjbGFzcyBccCBDbHMgaXMgYSBcYyBUeXBlIGJlY2F1c2UgaXQgY291bGQgYmUgYSBkZXBlbmRlbnQgbmFtZS4KKyAgUXVhbFR5cGUgZ2V0TWVtYmVyUG9pbnRlclR5cGUoUXVhbFR5cGUgVCwgY29uc3QgVHlwZSAqQ2xzKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiBhIG5vbi11bmlxdWUgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIGZvciBhIHZhcmlhYmxlIGFycmF5IG9mCisgIC8vLyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdHlwZS4KKyAgUXVhbFR5cGUgZ2V0VmFyaWFibGVBcnJheVR5cGUoUXVhbFR5cGUgRWx0VHksIEV4cHIgKk51bUVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5VHlwZTo6QXJyYXlTaXplTW9kaWZpZXIgQVNNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRleFR5cGVRdWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgQnJhY2tldHMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgbm9uLXVuaXF1ZSByZWZlcmVuY2UgdG8gdGhlIHR5cGUgZm9yIGEgZGVwZW5kZW50bHktc2l6ZWQKKyAgLy8vIGFycmF5IG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0eXBlLgorICAvLy8KKyAgLy8vIEZJWE1FOiBXZSB3aWxsIG5lZWQgdGhlc2UgdG8gYmUgdW5pcXVlZCwgb3IgYXQgbGVhc3QgY29tcGFyYWJsZSwgYXQgc29tZQorICAvLy8gcG9pbnQuCisgIFF1YWxUeXBlIGdldERlcGVuZGVudFNpemVkQXJyYXlUeXBlKFF1YWxUeXBlIEVsdFR5LCBFeHByICpOdW1FbHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVR5cGU6OkFycmF5U2l6ZU1vZGlmaWVyIEFTTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZXhUeXBlUXVhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEJyYWNrZXRzKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiBhIHVuaXF1ZSByZWZlcmVuY2UgdG8gdGhlIHR5cGUgZm9yIGFuIGluY29tcGxldGUgYXJyYXkgb2YKKyAgLy8vIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0eXBlLgorICBRdWFsVHlwZSBnZXRJbmNvbXBsZXRlQXJyYXlUeXBlKFF1YWxUeXBlIEVsdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5VHlwZTo6QXJyYXlTaXplTW9kaWZpZXIgQVNNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGV4VHlwZVF1YWxzKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdW5pcXVlIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBmb3IgYSBjb25zdGFudCBhcnJheSBvZgorICAvLy8gdGhlIHNwZWNpZmllZCBlbGVtZW50IHR5cGUuCisgIFF1YWxUeXBlIGdldENvbnN0YW50QXJyYXlUeXBlKFF1YWxUeXBlIEVsdFR5LCBjb25zdCBsbHZtOjpBUEludCAmQXJ5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlUeXBlOjpBcnJheVNpemVNb2RpZmllciBBU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGV4VHlwZVF1YWxzKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgYSB2bGEgdHlwZSB3aGVyZSBrbm93biBzaXplcyBhcmUgcmVwbGFjZWQgd2l0aCBbKl0uCisgIFF1YWxUeXBlIGdldFZhcmlhYmxlQXJyYXlEZWNheWVkVHlwZShRdWFsVHlwZSBUeSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHVuaXF1ZSByZWZlcmVuY2UgdG8gYSB2ZWN0b3IgdHlwZSBvZiB0aGUgc3BlY2lmaWVkCisgIC8vLyBlbGVtZW50IHR5cGUgYW5kIHNpemUuCisgIC8vLworICAvLy8gXHByZSBccCBWZWN0b3JUeXBlIG11c3QgYmUgYSBidWlsdC1pbiB0eXBlLgorICBRdWFsVHlwZSBnZXRWZWN0b3JUeXBlKFF1YWxUeXBlIFZlY3RvclR5cGUsIHVuc2lnbmVkIE51bUVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZTo6VmVjdG9yS2luZCBWZWNLaW5kKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdW5pcXVlIHJlZmVyZW5jZSB0byBhbiBleHRlbmRlZCB2ZWN0b3IgdHlwZQorICAvLy8gb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IHR5cGUgYW5kIHNpemUuCisgIC8vLworICAvLy8gXHByZSBccCBWZWN0b3JUeXBlIG11c3QgYmUgYSBidWlsdC1pbiB0eXBlLgorICBRdWFsVHlwZSBnZXRFeHRWZWN0b3JUeXBlKFF1YWxUeXBlIFZlY3RvclR5cGUsIHVuc2lnbmVkIE51bUVsdHMpIGNvbnN0OworCisgIC8vLyBccHJlIFJldHVybiBhIG5vbi11bmlxdWUgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIGZvciBhIGRlcGVuZGVudGx5LXNpemVkCisgIC8vLyB2ZWN0b3Igb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IHR5cGUuCisgIC8vLworICAvLy8gRklYTUU6IFdlIHdpbGwgbmVlZCB0aGVzZSB0byBiZSB1bmlxdWVkLCBvciBhdCBsZWFzdCBjb21wYXJhYmxlLCBhdCBzb21lCisgIC8vLyBwb2ludC4KKyAgUXVhbFR5cGUgZ2V0RGVwZW5kZW50U2l6ZWRFeHRWZWN0b3JUeXBlKFF1YWxUeXBlIFZlY3RvclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpTaXplRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEF0dHJMb2MpIGNvbnN0OworCisgIFF1YWxUeXBlIGdldERlcGVuZGVudEFkZHJlc3NTcGFjZVR5cGUoUXVhbFR5cGUgUG9pbnRlZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqQWRkclNwYWNlRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdHRyTG9jKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiBhIEsmUiBzdHlsZSBDIGZ1bmN0aW9uIHR5cGUgbGlrZSAnaW50KCknLgorICBRdWFsVHlwZSBnZXRGdW5jdGlvbk5vUHJvdG9UeXBlKFF1YWxUeXBlIFJlc3VsdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uVHlwZTo6RXh0SW5mbyAmSW5mbykgY29uc3Q7CisKKyAgUXVhbFR5cGUgZ2V0RnVuY3Rpb25Ob1Byb3RvVHlwZShRdWFsVHlwZSBSZXN1bHRUeSkgY29uc3QgeworICAgIHJldHVybiBnZXRGdW5jdGlvbk5vUHJvdG9UeXBlKFJlc3VsdFR5LCBGdW5jdGlvblR5cGU6OkV4dEluZm8oKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhIG5vcm1hbCBmdW5jdGlvbiB0eXBlIHdpdGggYSB0eXBlZCBhcmd1bWVudCBsaXN0LgorICBRdWFsVHlwZSBnZXRGdW5jdGlvblR5cGUoUXVhbFR5cGUgUmVzdWx0VHksIEFycmF5UmVmPFF1YWxUeXBlPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFByb3RvSW5mbyAmRVBJKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEZ1bmN0aW9uVHlwZUludGVybmFsKFJlc3VsdFR5LCBBcmdzLCBFUEksIGZhbHNlKTsKKyAgfQorCitwcml2YXRlOgorICAvLy8gXGJyaWVmIFJldHVybiBhIG5vcm1hbCBmdW5jdGlvbiB0eXBlIHdpdGggYSB0eXBlZCBhcmd1bWVudCBsaXN0LgorICBRdWFsVHlwZSBnZXRGdW5jdGlvblR5cGVJbnRlcm5hbChRdWFsVHlwZSBSZXN1bHRUeSwgQXJyYXlSZWY8UXVhbFR5cGU+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlOjpFeHRQcm90b0luZm8gJkVQSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPbmx5V2FudENhbm9uaWNhbCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHVuaXF1ZSByZWZlcmVuY2UgdG8gdGhlIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZQorICAvLy8gZGVjbGFyYXRpb24uCisgIFF1YWxUeXBlIGdldFR5cGVEZWNsVHlwZShjb25zdCBUeXBlRGVjbCAqRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGVEZWNsICpQcmV2RGVjbCA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICBhc3NlcnQoRGVjbCAmJiAiUGFzc2VkIG51bGwgZm9yIERlY2wgcGFyYW0iKTsKKyAgICBpZiAoRGVjbC0+VHlwZUZvckRlY2wpIHJldHVybiBRdWFsVHlwZShEZWNsLT5UeXBlRm9yRGVjbCwgMCk7CisKKyAgICBpZiAoUHJldkRlY2wpIHsKKyAgICAgIGFzc2VydChQcmV2RGVjbC0+VHlwZUZvckRlY2wgJiYgInByZXZpb3VzIGRlY2wgaGFzIG5vIFR5cGVGb3JEZWNsIik7CisgICAgICBEZWNsLT5UeXBlRm9yRGVjbCA9IFByZXZEZWNsLT5UeXBlRm9yRGVjbDsKKyAgICAgIHJldHVybiBRdWFsVHlwZShQcmV2RGVjbC0+VHlwZUZvckRlY2wsIDApOworICAgIH0KKworICAgIHJldHVybiBnZXRUeXBlRGVjbFR5cGVTbG93KERlY2wpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHVuaXF1ZSByZWZlcmVuY2UgdG8gdGhlIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHR5cGVkZWYtbmFtZSBkZWNsLgorICBRdWFsVHlwZSBnZXRUeXBlZGVmVHlwZShjb25zdCBUeXBlZGVmTmFtZURlY2wgKkRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIENhbm9uID0gUXVhbFR5cGUoKSkgY29uc3Q7CisKKyAgUXVhbFR5cGUgZ2V0UmVjb3JkVHlwZShjb25zdCBSZWNvcmREZWNsICpEZWNsKSBjb25zdDsKKworICBRdWFsVHlwZSBnZXRFbnVtVHlwZShjb25zdCBFbnVtRGVjbCAqRGVjbCkgY29uc3Q7CisKKyAgUXVhbFR5cGUgZ2V0SW5qZWN0ZWRDbGFzc05hbWVUeXBlKENYWFJlY29yZERlY2wgKkRlY2wsIFF1YWxUeXBlIFRTVCkgY29uc3Q7CisKKyAgUXVhbFR5cGUgZ2V0QXR0cmlidXRlZFR5cGUoQXR0cmlidXRlZFR5cGU6OktpbmQgYXR0cktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIG1vZGlmaWVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgZXF1aXZhbGVudFR5cGUpOworCisgIFF1YWxUeXBlIGdldFN1YnN0VGVtcGxhdGVUeXBlUGFybVR5cGUoY29uc3QgVGVtcGxhdGVUeXBlUGFybVR5cGUgKlJlcGxhY2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFJlcGxhY2VtZW50KSBjb25zdDsKKyAgUXVhbFR5cGUgZ2V0U3Vic3RUZW1wbGF0ZVR5cGVQYXJtUGFja1R5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZVR5cGVQYXJtVHlwZSAqUmVwbGFjZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJkFyZ1BhY2spOworCisgIFF1YWxUeXBlCisgIGdldFRlbXBsYXRlVHlwZVBhcm1UeXBlKHVuc2lnbmVkIERlcHRoLCB1bnNpZ25lZCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQYXJhbWV0ZXJQYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVR5cGVQYXJtRGVjbCAqUGFybURlY2wgPSBudWxscHRyKSBjb25zdDsKKworICBRdWFsVHlwZSBnZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZShUZW1wbGF0ZU5hbWUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgQ2Fub24gPSBRdWFsVHlwZSgpKSBjb25zdDsKKworICBRdWFsVHlwZQorICBnZXRDYW5vbmljYWxUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZShUZW1wbGF0ZU5hbWUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gQXJncykgY29uc3Q7CisKKyAgUXVhbFR5cGUgZ2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUoVGVtcGxhdGVOYW1lIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgQ2Fub24gPSBRdWFsVHlwZSgpKSBjb25zdDsKKworICBUeXBlU291cmNlSW5mbyAqCisgIGdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlSW5mbyhUZW1wbGF0ZU5hbWUgVCwgU291cmNlTG9jYXRpb24gVExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIENhbm9uID0gUXVhbFR5cGUoKSkgY29uc3Q7CisKKyAgUXVhbFR5cGUgZ2V0UGFyZW5UeXBlKFF1YWxUeXBlIE5hbWVkVHlwZSkgY29uc3Q7CisKKyAgUXVhbFR5cGUgZ2V0RWxhYm9yYXRlZFR5cGUoRWxhYm9yYXRlZFR5cGVLZXl3b3JkIEtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgTmFtZWRUeXBlKSBjb25zdDsKKyAgUXVhbFR5cGUgZ2V0RGVwZW5kZW50TmFtZVR5cGUoRWxhYm9yYXRlZFR5cGVLZXl3b3JkIEtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSWRlbnRpZmllckluZm8gKk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIENhbm9uID0gUXVhbFR5cGUoKSkgY29uc3Q7CisKKyAgUXVhbFR5cGUgZ2V0RGVwZW5kZW50VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUoRWxhYm9yYXRlZFR5cGVLZXl3b3JkIEtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSWRlbnRpZmllckluZm8gKk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gJkFyZ3MpIGNvbnN0OworICBRdWFsVHlwZSBnZXREZXBlbmRlbnRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZSgKKyAgICAgIEVsYWJvcmF0ZWRUeXBlS2V5d29yZCBLZXl3b3JkLCBOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlMsCisgICAgICBjb25zdCBJZGVudGlmaWVySW5mbyAqTmFtZSwgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gQXJncykgY29uc3Q7CisKKyAgVGVtcGxhdGVBcmd1bWVudCBnZXRJbmplY3RlZFRlbXBsYXRlQXJnKE5hbWVkRGVjbCAqUGFyYW1EZWNsKTsKKworICAvLy8gR2V0IGEgdGVtcGxhdGUgYXJndW1lbnQgbGlzdCB3aXRoIG9uZSBhcmd1bWVudCBwZXIgdGVtcGxhdGUgcGFyYW1ldGVyCisgIC8vLyBpbiBhIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0LCBzdWNoIGFzIGZvciB0aGUgaW5qZWN0ZWQgY2xhc3MgbmFtZSBvZgorICAvLy8gYSBjbGFzcyB0ZW1wbGF0ZS4KKyAgdm9pZCBnZXRJbmplY3RlZFRlbXBsYXRlQXJncyhjb25zdCBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VGVtcGxhdGVBcmd1bWVudD4gJkFyZ3MpOworCisgIFF1YWxUeXBlIGdldFBhY2tFeHBhbnNpb25UeXBlKFF1YWxUeXBlIFBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHVuc2lnbmVkPiBOdW1FeHBhbnNpb25zKTsKKworICBRdWFsVHlwZSBnZXRPYmpDSW50ZXJmYWNlVHlwZShjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ludGVyZmFjZURlY2wgKlByZXZEZWNsID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIExlZ2FjeSBpbnRlcmZhY2U6IGNhbm5vdCBwcm92aWRlIHR5cGUgYXJndW1lbnRzIG9yIF9fa2luZG9mLgorICBRdWFsVHlwZSBnZXRPYmpDT2JqZWN0VHlwZShRdWFsVHlwZSBCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDUHJvdG9jb2xEZWNsICogY29uc3QgKlByb3RvY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUHJvdG9jb2xzKSBjb25zdDsKKworICBRdWFsVHlwZSBnZXRPYmpDT2JqZWN0VHlwZShRdWFsVHlwZSBCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxRdWFsVHlwZT4gdHlwZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9iakNQcm90b2NvbERlY2wgKj4gcHJvdG9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzS2luZE9mKSBjb25zdDsKKworICBRdWFsVHlwZSBnZXRPYmpDVHlwZVBhcmFtVHlwZShjb25zdCBPYmpDVHlwZVBhcmFtRGVjbCAqRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T2JqQ1Byb3RvY29sRGVjbCAqPiBwcm90b2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIENhbm9uaWNhbCA9IFF1YWxUeXBlKCkpIGNvbnN0OworCisgIGJvb2wgT2JqQ09iamVjdEFkb3B0c1FUeXBlUHJvdG9jb2xzKFF1YWxUeXBlIFFULCBPYmpDSW50ZXJmYWNlRGVjbCAqRGVjbCk7CisKKyAgLy8vIFFJZFByb3RvY29sc0Fkb3B0T2JqQ09iamVjdFByb3RvY29scyAtIENoZWNrcyB0aGF0IHByb3RvY29scyBpbgorICAvLy8gUVQncyBxdWFsaWZpZWQtaWQgcHJvdG9jb2wgbGlzdCBhZG9wdCBhbGwgcHJvdG9jb2xzIGluIElEZWNsJ3MgbGlzdAorICAvLy8gb2YgcHJvdG9jb2xzLgorICBib29sIFFJZFByb3RvY29sc0Fkb3B0T2JqQ09iamVjdFByb3RvY29scyhRdWFsVHlwZSBRVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ludGVyZmFjZURlY2wgKklEZWNsKTsKKworICAvLy8gXGJyaWVmIFJldHVybiBhIE9iakNPYmplY3RQb2ludGVyVHlwZSB0eXBlIGZvciB0aGUgZ2l2ZW4gT2JqQ09iamVjdFR5cGUuCisgIFF1YWxUeXBlIGdldE9iakNPYmplY3RQb2ludGVyVHlwZShRdWFsVHlwZSBPSVQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR0NDIGV4dGVuc2lvbi4KKyAgUXVhbFR5cGUgZ2V0VHlwZU9mRXhwclR5cGUoRXhwciAqZSkgY29uc3Q7CisgIFF1YWxUeXBlIGdldFR5cGVPZlR5cGUoUXVhbFR5cGUgdCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDKysxMSBkZWNsdHlwZS4KKyAgUXVhbFR5cGUgZ2V0RGVjbHR5cGVUeXBlKEV4cHIgKmUsIFF1YWxUeXBlIFVuZGVybHlpbmdUeXBlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFVuYXJ5IHR5cGUgdHJhbnNmb3JtcworICBRdWFsVHlwZSBnZXRVbmFyeVRyYW5zZm9ybVR5cGUoUXVhbFR5cGUgQmFzZVR5cGUsIFF1YWxUeXBlIFVuZGVybHlpbmdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5hcnlUcmFuc2Zvcm1UeXBlOjpVVFRLaW5kIFVLaW5kKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEMrKzExIGRlZHVjZWQgYXV0byB0eXBlLgorICBRdWFsVHlwZSBnZXRBdXRvVHlwZShRdWFsVHlwZSBEZWR1Y2VkVHlwZSwgQXV0b1R5cGVLZXl3b3JkIEtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNEZXBlbmRlbnQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQysrMTEgZGVkdWN0aW9uIHBhdHRlcm4gZm9yICdhdXRvJyB0eXBlLgorICBRdWFsVHlwZSBnZXRBdXRvRGVkdWN0VHlwZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQysrMTEgZGVkdWN0aW9uIHBhdHRlcm4gZm9yICdhdXRvICYmJyB0eXBlLgorICBRdWFsVHlwZSBnZXRBdXRvUlJlZkRlZHVjdFR5cGUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEMrKzE3IGRlZHVjZWQgY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdHlwZS4KKyAgUXVhbFR5cGUgZ2V0RGVkdWNlZFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlKFRlbXBsYXRlTmFtZSBUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIERlZHVjZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0RlcGVuZGVudCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHVuaXF1ZSByZWZlcmVuY2UgdG8gdGhlIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgVGFnRGVjbAorICAvLy8gKHN0cnVjdC91bmlvbi9jbGFzcy9lbnVtKSBkZWNsLgorICBRdWFsVHlwZSBnZXRUYWdEZWNsVHlwZShjb25zdCBUYWdEZWNsICpEZWNsKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdW5pcXVlIHR5cGUgZm9yICJzaXplX3QiIChDOTkgNy4xNyksIGRlZmluZWQgaW4KKyAgLy8vIDxzdGRkZWYuaD4uCisgIC8vLworICAvLy8gVGhlIHNpemVvZiBvcGVyYXRvciByZXF1aXJlcyB0aGlzIChDOTkgNi41LjMuNHA0KS4KKyAgQ2FuUXVhbFR5cGUgZ2V0U2l6ZVR5cGUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdW5pcXVlIHNpZ25lZCBjb3VudGVycGFydCBvZiAKKyAgLy8vIHRoZSBpbnRlZ2VyIHR5cGUgY29ycmVzcG9uZGluZyB0byBzaXplX3QuCisgIENhblF1YWxUeXBlIGdldFNpZ25lZFNpemVUeXBlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHVuaXF1ZSB0eXBlIGZvciAiaW50bWF4X3QiIChDOTkgNy4xOC4xLjUpLCBkZWZpbmVkIGluCisgIC8vLyA8c3RkaW50Lmg+LgorICBDYW5RdWFsVHlwZSBnZXRJbnRNYXhUeXBlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHVuaXF1ZSB0eXBlIGZvciAidWludG1heF90IiAoQzk5IDcuMTguMS41KSwgZGVmaW5lZCBpbgorICAvLy8gPHN0ZGludC5oPi4KKyAgQ2FuUXVhbFR5cGUgZ2V0VUludE1heFR5cGUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdW5pcXVlIHdjaGFyX3QgdHlwZSBhdmFpbGFibGUgaW4gQysrIChhbmQgYXZhaWxhYmxlIGFzCisgIC8vLyBfX3djaGFyX3QgYXMgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uKS4KKyAgUXVhbFR5cGUgZ2V0V0NoYXJUeXBlKCkgY29uc3QgeyByZXR1cm4gV0NoYXJUeTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB0eXBlIG9mIHdpZGUgY2hhcmFjdGVycy4gSW4gQysrLCB0aGlzIHJldHVybnMgdGhlCisgIC8vLyB1bmlxdWUgd2NoYXJfdCB0eXBlLiBJbiBDOTksIHRoaXMgcmV0dXJucyBhIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlCisgIC8vLyBkZWZpbmVkIGluIDxzdGRkZWYuaD4gYXMgZGVmaW5lZCBieSB0aGUgdGFyZ2V0LgorICBRdWFsVHlwZSBnZXRXaWRlQ2hhclR5cGUoKSBjb25zdCB7IHJldHVybiBXaWRlQ2hhclR5OyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHR5cGUgb2YgInNpZ25lZCB3Y2hhcl90Ii4KKyAgLy8vCisgIC8vLyBVc2VkIHdoZW4gaW4gQysrLCBhcyBhIEdDQyBleHRlbnNpb24uCisgIFF1YWxUeXBlIGdldFNpZ25lZFdDaGFyVHlwZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB0eXBlIG9mICJ1bnNpZ25lZCB3Y2hhcl90Ii4KKyAgLy8vCisgIC8vLyBVc2VkIHdoZW4gaW4gQysrLCBhcyBhIEdDQyBleHRlbnNpb24uCisgIFF1YWxUeXBlIGdldFVuc2lnbmVkV0NoYXJUeXBlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJbiBDOTksIHRoaXMgcmV0dXJucyBhIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlCisgIC8vLyBkZWZpbmVkIGluIDxzdGRkZWYuaD4gYXMgZGVmaW5lZCBieSB0aGUgdGFyZ2V0LgorICBRdWFsVHlwZSBnZXRXSW50VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFdJbnRUeTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgdHlwZSBjb21wYXRpYmxlIHdpdGggImludHB0cl90IiAoQzk5IDcuMTguMS40KSwKKyAgLy8vIGFzIGRlZmluZWQgYnkgdGhlIHRhcmdldC4KKyAgUXVhbFR5cGUgZ2V0SW50UHRyVHlwZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgdHlwZSBjb21wYXRpYmxlIHdpdGggInVpbnRwdHJfdCIgKEM5OSA3LjE4LjEuNCksCisgIC8vLyBhcyBkZWZpbmVkIGJ5IHRoZSB0YXJnZXQuCisgIFF1YWxUeXBlIGdldFVJbnRQdHJUeXBlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHVuaXF1ZSB0eXBlIGZvciAicHRyZGlmZl90IiAoQzk5IDcuMTcpIGRlZmluZWQgaW4KKyAgLy8vIDxzdGRkZWYuaD4uIFBvaW50ZXIgLSBwb2ludGVyIHJlcXVpcmVzIHRoaXMgKEM5OSA2LjUuNnA5KS4KKyAgUXVhbFR5cGUgZ2V0UG9pbnRlckRpZmZUeXBlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHVuaXF1ZSB1bnNpZ25lZCBjb3VudGVycGFydCBvZiAicHRyZGlmZl90IgorICAvLy8gaW50ZWdlciB0eXBlLiBUaGUgc3RhbmRhcmQgKEMxMSA3LjIxLjYuMXA3KSByZWZlcnMgdG8gdGhpcyB0eXBlCisgIC8vLyBpbiB0aGUgZGVmaW5pdGlvbiBvZiAldHUgZm9ybWF0IHNwZWNpZmllci4KKyAgUXVhbFR5cGUgZ2V0VW5zaWduZWRQb2ludGVyRGlmZlR5cGUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdW5pcXVlIHR5cGUgZm9yICJwaWRfdCIgZGVmaW5lZCBpbgorICAvLy8gPHN5cy90eXBlcy5oPi4gV2UgbmVlZCB0aGlzIHRvIGNvbXB1dGUgdGhlIGNvcnJlY3QgdHlwZSBmb3IgdmZvcmsoKS4KKyAgUXVhbFR5cGUgZ2V0UHJvY2Vzc0lEVHlwZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBDIHN0cnVjdHVyZSB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IGNvbnN0YW50IENGU3RyaW5ncy4KKyAgUXVhbFR5cGUgZ2V0Q0ZDb25zdGFudFN0cmluZ1R5cGUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIEMgc3RydWN0IHR5cGUgZm9yIG9iamNfc3VwZXIKKyAgUXVhbFR5cGUgZ2V0T2JqQ1N1cGVyVHlwZSgpIGNvbnN0OworICB2b2lkIHNldE9iakNTdXBlclR5cGUoUXVhbFR5cGUgU1QpIHsgT2JqQ1N1cGVyVHlwZSA9IFNUOyB9CisKKyAgLy8vIEdldCB0aGUgc3RydWN0dXJlIHR5cGUgdXNlZCB0byByZXByZXNlbnRhdGlvbiBDRlN0cmluZ3MsIG9yIE5VTEwKKyAgLy8vIGlmIGl0IGhhc24ndCB5ZXQgYmVlbiBidWlsdC4KKyAgUXVhbFR5cGUgZ2V0UmF3Q0ZDb25zdGFudFN0cmluZ1R5cGUoKSBjb25zdCB7CisgICAgaWYgKENGQ29uc3RhbnRTdHJpbmdUeXBlRGVjbCkKKyAgICAgIHJldHVybiBnZXRUeXBlZGVmVHlwZShDRkNvbnN0YW50U3RyaW5nVHlwZURlY2wpOworICAgIHJldHVybiBRdWFsVHlwZSgpOworICB9CisgIHZvaWQgc2V0Q0ZDb25zdGFudFN0cmluZ1R5cGUoUXVhbFR5cGUgVCk7CisgIFR5cGVkZWZEZWNsICpnZXRDRkNvbnN0YW50U3RyaW5nRGVjbCgpIGNvbnN0OworICBSZWNvcmREZWNsICpnZXRDRkNvbnN0YW50U3RyaW5nVGFnRGVjbCgpIGNvbnN0OworCisgIC8vIFRoaXMgc2V0dGVyL2dldHRlciByZXByZXNlbnRzIHRoZSBPYmpDIHR5cGUgZm9yIGFuIE5TQ29uc3RhbnRTdHJpbmcuCisgIHZvaWQgc2V0T2JqQ0NvbnN0YW50U3RyaW5nSW50ZXJmYWNlKE9iakNJbnRlcmZhY2VEZWNsICpEZWNsKTsKKyAgUXVhbFR5cGUgZ2V0T2JqQ0NvbnN0YW50U3RyaW5nSW50ZXJmYWNlKCkgY29uc3QgeworICAgIHJldHVybiBPYmpDQ29uc3RhbnRTdHJpbmdUeXBlOworICB9CisKKyAgUXVhbFR5cGUgZ2V0T2JqQ05TU3RyaW5nVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gT2JqQ05TU3RyaW5nVHlwZTsKKyAgfQorCisgIHZvaWQgc2V0T2JqQ05TU3RyaW5nVHlwZShRdWFsVHlwZSBUKSB7CisgICAgT2JqQ05TU3RyaW5nVHlwZSA9IFQ7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0eXBlIHRoYXQgXGMgaWQgaGFzIGJlZW4gZGVmaW5lZCB0bywgd2hpY2ggbWF5IGJlCisgIC8vLyBkaWZmZXJlbnQgZnJvbSB0aGUgYnVpbHQtaW4gXGMgaWQgaWYgXGMgaWQgaGFzIGJlZW4gdHlwZWRlZidkLgorICBRdWFsVHlwZSBnZXRPYmpDSWRSZWRlZmluaXRpb25UeXBlKCkgY29uc3QgeworICAgIGlmIChPYmpDSWRSZWRlZmluaXRpb25UeXBlLmlzTnVsbCgpKQorICAgICAgcmV0dXJuIGdldE9iakNJZFR5cGUoKTsKKyAgICByZXR1cm4gT2JqQ0lkUmVkZWZpbml0aW9uVHlwZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSB1c2VyLXdyaXR0ZW4gdHlwZSB0aGF0IHJlZGVmaW5lcyBcYyBpZC4KKyAgdm9pZCBzZXRPYmpDSWRSZWRlZmluaXRpb25UeXBlKFF1YWxUeXBlIFJlZGVmVHlwZSkgeworICAgIE9iakNJZFJlZGVmaW5pdGlvblR5cGUgPSBSZWRlZlR5cGU7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0eXBlIHRoYXQgXGMgQ2xhc3MgaGFzIGJlZW4gZGVmaW5lZCB0bywgd2hpY2ggbWF5IGJlCisgIC8vLyBkaWZmZXJlbnQgZnJvbSB0aGUgYnVpbHQtaW4gXGMgQ2xhc3MgaWYgXGMgQ2xhc3MgaGFzIGJlZW4gdHlwZWRlZidkLgorICBRdWFsVHlwZSBnZXRPYmpDQ2xhc3NSZWRlZmluaXRpb25UeXBlKCkgY29uc3QgeworICAgIGlmIChPYmpDQ2xhc3NSZWRlZmluaXRpb25UeXBlLmlzTnVsbCgpKQorICAgICAgcmV0dXJuIGdldE9iakNDbGFzc1R5cGUoKTsKKyAgICByZXR1cm4gT2JqQ0NsYXNzUmVkZWZpbml0aW9uVHlwZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSB1c2VyLXdyaXR0ZW4gdHlwZSB0aGF0IHJlZGVmaW5lcyAnU0VMJy4KKyAgdm9pZCBzZXRPYmpDQ2xhc3NSZWRlZmluaXRpb25UeXBlKFF1YWxUeXBlIFJlZGVmVHlwZSkgeworICAgIE9iakNDbGFzc1JlZGVmaW5pdGlvblR5cGUgPSBSZWRlZlR5cGU7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0eXBlIHRoYXQgJ1NFTCcgaGFzIGJlZW4gZGVmaW5lZCB0bywgd2hpY2ggbWF5IGJlCisgIC8vLyBkaWZmZXJlbnQgZnJvbSB0aGUgYnVpbHQtaW4gJ1NFTCcgaWYgJ1NFTCcgaGFzIGJlZW4gdHlwZWRlZidkLgorICBRdWFsVHlwZSBnZXRPYmpDU2VsUmVkZWZpbml0aW9uVHlwZSgpIGNvbnN0IHsKKyAgICBpZiAoT2JqQ1NlbFJlZGVmaW5pdGlvblR5cGUuaXNOdWxsKCkpCisgICAgICByZXR1cm4gZ2V0T2JqQ1NlbFR5cGUoKTsKKyAgICByZXR1cm4gT2JqQ1NlbFJlZGVmaW5pdGlvblR5cGU7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgdXNlci13cml0dGVuIHR5cGUgdGhhdCByZWRlZmluZXMgJ1NFTCcuCisgIHZvaWQgc2V0T2JqQ1NlbFJlZGVmaW5pdGlvblR5cGUoUXVhbFR5cGUgUmVkZWZUeXBlKSB7CisgICAgT2JqQ1NlbFJlZGVmaW5pdGlvblR5cGUgPSBSZWRlZlR5cGU7CisgIH0KKworICAvLy8gUmV0cmlldmUgdGhlIGlkZW50aWZpZXIgJ05TT2JqZWN0Jy4KKyAgSWRlbnRpZmllckluZm8gKmdldE5TT2JqZWN0TmFtZSgpIHsKKyAgICBpZiAoIU5TT2JqZWN0TmFtZSkgeworICAgICAgTlNPYmplY3ROYW1lID0gJklkZW50cy5nZXQoIk5TT2JqZWN0Iik7CisgICAgfQorCisgICAgcmV0dXJuIE5TT2JqZWN0TmFtZTsKKyAgfQorCisgIC8vLyBSZXRyaWV2ZSB0aGUgaWRlbnRpZmllciAnTlNDb3B5aW5nJy4KKyAgSWRlbnRpZmllckluZm8gKmdldE5TQ29weWluZ05hbWUoKSB7CisgICAgaWYgKCFOU0NvcHlpbmdOYW1lKSB7CisgICAgICBOU0NvcHlpbmdOYW1lID0gJklkZW50cy5nZXQoIk5TQ29weWluZyIpOworICAgIH0KKworICAgIHJldHVybiBOU0NvcHlpbmdOYW1lOworICB9CisKKyAgQ2FuUXVhbFR5cGUgZ2V0TlNVSW50ZWdlclR5cGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KFRhcmdldCAmJiAiRXhwZWN0ZWQgdGFyZ2V0IHRvIGJlIGluaXRpYWxpemVkIik7CisgICAgY29uc3QgbGx2bTo6VHJpcGxlICZUID0gVGFyZ2V0LT5nZXRUcmlwbGUoKTsKKyAgICAvLyBXaW5kb3dzIGlzIExMUDY0IHJhdGhlciB0aGFuIExQNjQKKyAgICBpZiAoVC5pc09TV2luZG93cygpICYmIFQuaXNBcmNoNjRCaXQoKSkKKyAgICAgIHJldHVybiBVbnNpZ25lZExvbmdMb25nVHk7CisgICAgcmV0dXJuIFVuc2lnbmVkTG9uZ1R5OworICB9CisKKyAgQ2FuUXVhbFR5cGUgZ2V0TlNJbnRlZ2VyVHlwZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoVGFyZ2V0ICYmICJFeHBlY3RlZCB0YXJnZXQgdG8gYmUgaW5pdGlhbGl6ZWQiKTsKKyAgICBjb25zdCBsbHZtOjpUcmlwbGUgJlQgPSBUYXJnZXQtPmdldFRyaXBsZSgpOworICAgIC8vIFdpbmRvd3MgaXMgTExQNjQgcmF0aGVyIHRoYW4gTFA2NAorICAgIGlmIChULmlzT1NXaW5kb3dzKCkgJiYgVC5pc0FyY2g2NEJpdCgpKQorICAgICAgcmV0dXJuIExvbmdMb25nVHk7CisgICAgcmV0dXJuIExvbmdUeTsKKyAgfQorCisgIC8vLyBSZXRyaWV2ZSB0aGUgaWRlbnRpZmllciAnYm9vbCcuCisgIElkZW50aWZpZXJJbmZvICpnZXRCb29sTmFtZSgpIGNvbnN0IHsKKyAgICBpZiAoIUJvb2xOYW1lKQorICAgICAgQm9vbE5hbWUgPSAmSWRlbnRzLmdldCgiYm9vbCIpOworICAgIHJldHVybiBCb29sTmFtZTsKKyAgfQorCisgIElkZW50aWZpZXJJbmZvICpnZXRNYWtlSW50ZWdlclNlcU5hbWUoKSBjb25zdCB7CisgICAgaWYgKCFNYWtlSW50ZWdlclNlcU5hbWUpCisgICAgICBNYWtlSW50ZWdlclNlcU5hbWUgPSAmSWRlbnRzLmdldCgiX19tYWtlX2ludGVnZXJfc2VxIik7CisgICAgcmV0dXJuIE1ha2VJbnRlZ2VyU2VxTmFtZTsKKyAgfQorCisgIElkZW50aWZpZXJJbmZvICpnZXRUeXBlUGFja0VsZW1lbnROYW1lKCkgY29uc3QgeworICAgIGlmICghVHlwZVBhY2tFbGVtZW50TmFtZSkKKyAgICAgIFR5cGVQYWNrRWxlbWVudE5hbWUgPSAmSWRlbnRzLmdldCgiX190eXBlX3BhY2tfZWxlbWVudCIpOworICAgIHJldHVybiBUeXBlUGFja0VsZW1lbnROYW1lOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgT2JqZWN0aXZlLUMgImluc3RhbmNldHlwZSIgdHlwZSwgaWYgYWxyZWFkeSBrbm93bjsKKyAgLy8vIG90aGVyd2lzZSwgcmV0dXJucyBhIE5VTEwgdHlwZTsKKyAgUXVhbFR5cGUgZ2V0T2JqQ0luc3RhbmNlVHlwZSgpIHsKKyAgICByZXR1cm4gZ2V0VHlwZURlY2xUeXBlKGdldE9iakNJbnN0YW5jZVR5cGVEZWNsKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdHlwZWRlZiBkZWNsYXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBPYmplY3RpdmUtQworICAvLy8gImluc3RhbmNldHlwZSIgdHlwZS4KKyAgVHlwZWRlZkRlY2wgKmdldE9iakNJbnN0YW5jZVR5cGVEZWNsKCk7CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIHR5cGUgZm9yIHRoZSBDIEZJTEUgdHlwZS4KKyAgdm9pZCBzZXRGSUxFRGVjbChUeXBlRGVjbCAqRklMRURlY2wpIHsgdGhpcy0+RklMRURlY2wgPSBGSUxFRGVjbDsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIEMgRklMRSB0eXBlLgorICBRdWFsVHlwZSBnZXRGSUxFVHlwZSgpIGNvbnN0IHsKKyAgICBpZiAoRklMRURlY2wpCisgICAgICByZXR1cm4gZ2V0VHlwZURlY2xUeXBlKEZJTEVEZWNsKTsKKyAgICByZXR1cm4gUXVhbFR5cGUoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSB0eXBlIGZvciB0aGUgQyBqbXBfYnVmIHR5cGUuCisgIHZvaWQgc2V0am1wX2J1ZkRlY2woVHlwZURlY2wgKmptcF9idWZEZWNsKSB7CisgICAgdGhpcy0+am1wX2J1ZkRlY2wgPSBqbXBfYnVmRGVjbDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIEMgam1wX2J1ZiB0eXBlLgorICBRdWFsVHlwZSBnZXRqbXBfYnVmVHlwZSgpIGNvbnN0IHsKKyAgICBpZiAoam1wX2J1ZkRlY2wpCisgICAgICByZXR1cm4gZ2V0VHlwZURlY2xUeXBlKGptcF9idWZEZWNsKTsKKyAgICByZXR1cm4gUXVhbFR5cGUoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSB0eXBlIGZvciB0aGUgQyBzaWdqbXBfYnVmIHR5cGUuCisgIHZvaWQgc2V0c2lnam1wX2J1ZkRlY2woVHlwZURlY2wgKnNpZ2ptcF9idWZEZWNsKSB7CisgICAgdGhpcy0+c2lnam1wX2J1ZkRlY2wgPSBzaWdqbXBfYnVmRGVjbDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIEMgc2lnam1wX2J1ZiB0eXBlLgorICBRdWFsVHlwZSBnZXRzaWdqbXBfYnVmVHlwZSgpIGNvbnN0IHsKKyAgICBpZiAoc2lnam1wX2J1ZkRlY2wpCisgICAgICByZXR1cm4gZ2V0VHlwZURlY2xUeXBlKHNpZ2ptcF9idWZEZWNsKTsKKyAgICByZXR1cm4gUXVhbFR5cGUoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSB0eXBlIGZvciB0aGUgQyB1Y29udGV4dF90IHR5cGUuCisgIHZvaWQgc2V0dWNvbnRleHRfdERlY2woVHlwZURlY2wgKnVjb250ZXh0X3REZWNsKSB7CisgICAgdGhpcy0+dWNvbnRleHRfdERlY2wgPSB1Y29udGV4dF90RGVjbDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIEMgdWNvbnRleHRfdCB0eXBlLgorICBRdWFsVHlwZSBnZXR1Y29udGV4dF90VHlwZSgpIGNvbnN0IHsKKyAgICBpZiAodWNvbnRleHRfdERlY2wpCisgICAgICByZXR1cm4gZ2V0VHlwZURlY2xUeXBlKHVjb250ZXh0X3REZWNsKTsKKyAgICByZXR1cm4gUXVhbFR5cGUoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGhlIHJlc3VsdCB0eXBlIG9mIGxvZ2ljYWwgb3BlcmF0aW9ucywgJzwnLCAnPicsICchPScsIGV0Yy4KKyAgUXVhbFR5cGUgZ2V0TG9naWNhbE9wZXJhdGlvblR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzID8gQm9vbFR5IDogSW50VHk7CisgIH0KKworICAvLy8gXGJyaWVmIEVtaXQgdGhlIE9iamVjdGl2ZS1DQyB0eXBlIGVuY29kaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZSBccCBUIGludG8KKyAgLy8vIFxwIFMuCisgIC8vLworICAvLy8gSWYgXHAgRmllbGQgaXMgc3BlY2lmaWVkIHRoZW4gcmVjb3JkIGZpZWxkIG5hbWVzIGFyZSBhbHNvIGVuY29kZWQuCisgIHZvaWQgZ2V0T2JqQ0VuY29kaW5nRm9yVHlwZShRdWFsVHlwZSBULCBzdGQ6OnN0cmluZyAmUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVjbCAqRmllbGQ9bnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlICpOb3RFbmNvZGVkVD1udWxscHRyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEVtaXQgdGhlIE9iamVjdGl2ZS1DIHByb3BlcnR5IHR5cGUgZW5jb2RpbmcgZm9yIHRoZSBnaXZlbgorICAvLy8gdHlwZSBccCBUIGludG8gXHAgUy4KKyAgdm9pZCBnZXRPYmpDRW5jb2RpbmdGb3JQcm9wZXJ0eVR5cGUoUXVhbFR5cGUgVCwgc3RkOjpzdHJpbmcgJlMpIGNvbnN0OworCisgIHZvaWQgZ2V0TGVnYWN5SW50ZWdyYWxUeXBlRW5jb2RpbmcoUXVhbFR5cGUgJnQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUHV0IHRoZSBzdHJpbmcgdmVyc2lvbiBvZiB0aGUgdHlwZSBxdWFsaWZpZXJzIFxwIFFUIGludG8gXHAgUy4KKyAgdm9pZCBnZXRPYmpDRW5jb2RpbmdGb3JUeXBlUXVhbGlmaWVyKERlY2w6Ok9iakNEZWNsUXVhbGlmaWVyIFFULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJlMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRW1pdCB0aGUgZW5jb2RlZCB0eXBlIGZvciB0aGUgZnVuY3Rpb24gXHAgRGVjbCBpbnRvIFxwIFMuCisgIC8vLworICAvLy8gVGhpcyBpcyBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgT2JqZWN0aXZlLUMgbWV0aG9kIGVuY29kaW5ncy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkIChlLmcuLCBiZWNhdXNlIG9uZSBvZiB0aGUgcGFyYW1ldGVyCisgIC8vLyB0eXBlcyBpcyBpbmNvbXBsZXRlKSwgZmFsc2Ugb3RoZXJ3aXNlLgorICBzdGQ6OnN0cmluZyBnZXRPYmpDRW5jb2RpbmdGb3JGdW5jdGlvbkRlY2woY29uc3QgRnVuY3Rpb25EZWNsICpEZWNsKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEVtaXQgdGhlIGVuY29kZWQgdHlwZSBmb3IgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbiBccCBEZWNsIGludG8KKyAgLy8vIFxwIFMuCisgIHN0ZDo6c3RyaW5nIGdldE9iakNFbmNvZGluZ0Zvck1ldGhvZERlY2woY29uc3QgT2JqQ01ldGhvZERlY2wgKkRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHRlbmRlZCA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZW5jb2RlZCB0eXBlIGZvciB0aGlzIGJsb2NrIGRlY2xhcmF0aW9uLgorICBzdGQ6OnN0cmluZyBnZXRPYmpDRW5jb2RpbmdGb3JCbG9jayhjb25zdCBCbG9ja0V4cHIgKmJsb2NrRXhwcikgY29uc3Q7CisKKyAgLy8vIGdldE9iakNFbmNvZGluZ0ZvclByb3BlcnR5RGVjbCAtIFJldHVybiB0aGUgZW5jb2RlZCB0eXBlIGZvcgorICAvLy8gdGhpcyBtZXRob2QgZGVjbGFyYXRpb24uIElmIG5vbi1OVUxMLCBDb250YWluZXIgbXVzdCBiZSBlaXRoZXIKKyAgLy8vIGFuIE9iakNDYXRlZ29yeUltcGxEZWNsIG9yIE9iakNJbXBsZW1lbnRhdGlvbkRlY2w7IGl0IHNob3VsZAorICAvLy8gb25seSBiZSBOVUxMIHdoZW4gZ2V0dGluZyBlbmNvZGluZ3MgZm9yIHByb3RvY29sIHByb3BlcnRpZXMuCisgIHN0ZDo6c3RyaW5nIGdldE9iakNFbmNvZGluZ0ZvclByb3BlcnR5RGVjbChjb25zdCBPYmpDUHJvcGVydHlEZWNsICpQRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2wgKkNvbnRhaW5lcikgY29uc3Q7CisKKyAgYm9vbCBQcm90b2NvbENvbXBhdGlibGVXaXRoUHJvdG9jb2woT2JqQ1Byb3RvY29sRGVjbCAqbFByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDUHJvdG9jb2xEZWNsICpyUHJvdG8pIGNvbnN0OworCisgIE9iakNQcm9wZXJ0eUltcGxEZWNsICpnZXRPYmpDUHJvcGVydHlJbXBsRGVjbEZvclByb3BlcnR5RGVjbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ1Byb3BlcnR5RGVjbCAqUEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2wgKkNvbnRhaW5lcikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdHlwZSBccCBUIGZvciBPYmplY3RpdmUtQyBlbmNvZGluZyBwdXJwb3NlLAorICAvLy8gaW4gY2hhcmFjdGVycy4KKyAgQ2hhclVuaXRzIGdldE9iakNFbmNvZGluZ1R5cGVTaXplKFF1YWxUeXBlIFQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHR5cGVkZWYgY29ycmVzcG9uZGluZyB0byB0aGUgcHJlZGVmaW5lZCBcYyBpZCB0eXBlCisgIC8vLyBpbiBPYmplY3RpdmUtQy4KKyAgVHlwZWRlZkRlY2wgKmdldE9iakNJZERlY2woKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJlcHJlc2VudHMgdGhlIE9iamVjdGl2ZS1DQyBcYyBpZCB0eXBlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgc2V0IHVwIGxhemlseSwgYnkgU2VtYS4gIFxjIGlkIGlzIGFsd2F5cyBhICh0eXBlZGVmIGZvciBhKQorICAvLy8gcG9pbnRlciB0eXBlLCBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QuCisgIFF1YWxUeXBlIGdldE9iakNJZFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGVEZWNsVHlwZShnZXRPYmpDSWREZWNsKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdHlwZWRlZiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcmVkZWZpbmVkICdTRUwnIHR5cGUKKyAgLy8vIGluIE9iamVjdGl2ZS1DLgorICBUeXBlZGVmRGVjbCAqZ2V0T2JqQ1NlbERlY2woKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHByZWRlZmluZWQgT2JqZWN0aXZlLUMKKyAgLy8vICdTRUwnIHR5cGUuCisgIFF1YWxUeXBlIGdldE9iakNTZWxUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUeXBlRGVjbFR5cGUoZ2V0T2JqQ1NlbERlY2woKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0eXBlZGVmIGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByZWRlZmluZWQKKyAgLy8vIE9iamVjdGl2ZS1DICdDbGFzcycgdHlwZS4KKyAgVHlwZWRlZkRlY2wgKmdldE9iakNDbGFzc0RlY2woKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJlcHJlc2VudHMgdGhlIE9iamVjdGl2ZS1DIFxjIENsYXNzIHR5cGUuCisgIC8vLworICAvLy8gVGhpcyBpcyBzZXQgdXAgbGF6aWx5LCBieSBTZW1hLiAgXGMgQ2xhc3MgaXMgYWx3YXlzIGEgKHR5cGVkZWYgZm9yIGEpCisgIC8vLyBwb2ludGVyIHR5cGUsIGEgcG9pbnRlciB0byBhIHN0cnVjdC4KKyAgUXVhbFR5cGUgZ2V0T2JqQ0NsYXNzVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHlwZURlY2xUeXBlKGdldE9iakNDbGFzc0RlY2woKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBPYmplY3RpdmUtQyBjbGFzcyBkZWNsYXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvCisgIC8vLyB0aGUgcHJlZGVmaW5lZCBcYyBQcm90b2NvbCBjbGFzcy4KKyAgT2JqQ0ludGVyZmFjZURlY2wgKmdldE9iakNQcm90b2NvbERlY2woKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIGRlY2xhcmF0aW9uIG9mICdCT09MJyB0eXBlZGVmCisgIFR5cGVkZWZEZWNsICpnZXRCT09MRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQk9PTERlY2w7CisgIH0KKworICAvLy8gXGJyaWVmIFNhdmUgZGVjbGFyYXRpb24gb2YgJ0JPT0wnIHR5cGVkZWYKKyAgdm9pZCBzZXRCT09MRGVjbChUeXBlZGVmRGVjbCAqVEQpIHsKKyAgICBCT09MRGVjbCA9IFREOworICB9CisKKyAgLy8vIFxicmllZiB0eXBlIG9mICdCT09MJyB0eXBlLgorICBRdWFsVHlwZSBnZXRCT09MVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHlwZURlY2xUeXBlKGdldEJPT0xEZWNsKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdHlwZSBvZiB0aGUgT2JqZWN0aXZlLUMgXGMgUHJvdG9jb2wgY2xhc3MuCisgIFF1YWxUeXBlIGdldE9iakNQcm90b1R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9iakNJbnRlcmZhY2VUeXBlKGdldE9iakNQcm90b2NvbERlY2woKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBDIHR5cGUgZGVjbGFyYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgcHJlZGVmaW5lZAorICAvLy8gXGMgX19idWlsdGluX3ZhX2xpc3QgdHlwZS4KKyAgVHlwZWRlZkRlY2wgKmdldEJ1aWx0aW5WYUxpc3REZWNsKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdHlwZSBvZiB0aGUgXGMgX19idWlsdGluX3ZhX2xpc3QgdHlwZS4KKyAgUXVhbFR5cGUgZ2V0QnVpbHRpblZhTGlzdFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGVEZWNsVHlwZShnZXRCdWlsdGluVmFMaXN0RGVjbCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIEMgdHlwZSBkZWNsYXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcmVkZWZpbmVkCisgIC8vLyBcYyBfX3ZhX2xpc3RfdGFnIHR5cGUgdXNlZCB0byBoZWxwIGRlZmluZSB0aGUgXGMgX19idWlsdGluX3ZhX2xpc3QgdHlwZQorICAvLy8gZm9yIHNvbWUgdGFyZ2V0cy4KKyAgRGVjbCAqZ2V0VmFMaXN0VGFnRGVjbCgpIGNvbnN0OworCisgIC8vLyBSZXRyaWV2ZSB0aGUgQyB0eXBlIGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByZWRlZmluZWQKKyAgLy8vIFxjIF9fYnVpbHRpbl9tc192YV9saXN0IHR5cGUuCisgIFR5cGVkZWZEZWNsICpnZXRCdWlsdGluTVNWYUxpc3REZWNsKCkgY29uc3Q7CisKKyAgLy8vIFJldHJpZXZlIHRoZSB0eXBlIG9mIHRoZSBcYyBfX2J1aWx0aW5fbXNfdmFfbGlzdCB0eXBlLgorICBRdWFsVHlwZSBnZXRCdWlsdGluTVNWYUxpc3RUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUeXBlRGVjbFR5cGUoZ2V0QnVpbHRpbk1TVmFMaXN0RGVjbCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgdHlwZSB3aXRoIGFkZGl0aW9uYWwgXGMgY29uc3QsIFxjIHZvbGF0aWxlLCBvcgorICAvLy8gXGMgcmVzdHJpY3QgcXVhbGlmaWVycy4KKyAgUXVhbFR5cGUgZ2V0Q1ZSUXVhbGlmaWVkVHlwZShRdWFsVHlwZSBULCB1bnNpZ25lZCBDVlIpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UXVhbGlmaWVkVHlwZShULCBRdWFsaWZpZXJzOjpmcm9tQ1ZSTWFzayhDVlIpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVW4tc3BsaXQgYSBTcGxpdFF1YWxUeXBlLgorICBRdWFsVHlwZSBnZXRRdWFsaWZpZWRUeXBlKFNwbGl0UXVhbFR5cGUgc3BsaXQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UXVhbGlmaWVkVHlwZShzcGxpdC5UeSwgc3BsaXQuUXVhbHMpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSB0eXBlIHdpdGggYWRkaXRpb25hbCBxdWFsaWZpZXJzLgorICBRdWFsVHlwZSBnZXRRdWFsaWZpZWRUeXBlKFF1YWxUeXBlIFQsIFF1YWxpZmllcnMgUXMpIGNvbnN0IHsKKyAgICBpZiAoIVFzLmhhc05vbkZhc3RRdWFsaWZpZXJzKCkpCisgICAgICByZXR1cm4gVC53aXRoRmFzdFF1YWxpZmllcnMoUXMuZ2V0RmFzdFF1YWxpZmllcnMoKSk7CisgICAgUXVhbGlmaWVyQ29sbGVjdG9yIFFjKFFzKTsKKyAgICBjb25zdCBUeXBlICpQdHIgPSBRYy5zdHJpcChUKTsKKyAgICByZXR1cm4gZ2V0RXh0UXVhbFR5cGUoUHRyLCBRYyk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhIHR5cGUgd2l0aCBhZGRpdGlvbmFsIHF1YWxpZmllcnMuCisgIFF1YWxUeXBlIGdldFF1YWxpZmllZFR5cGUoY29uc3QgVHlwZSAqVCwgUXVhbGlmaWVycyBRcykgY29uc3QgeworICAgIGlmICghUXMuaGFzTm9uRmFzdFF1YWxpZmllcnMoKSkKKyAgICAgIHJldHVybiBRdWFsVHlwZShULCBRcy5nZXRGYXN0UXVhbGlmaWVycygpKTsKKyAgICByZXR1cm4gZ2V0RXh0UXVhbFR5cGUoVCwgUXMpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSB0eXBlIHdpdGggdGhlIGdpdmVuIGxpZmV0aW1lIHF1YWxpZmllci4KKyAgLy8vCisgIC8vLyBccHJlIE5laXRoZXIgdHlwZS5PYmpDTGlmZXRpbWUoKSBub3IgXHAgbGlmZXRpbWUgbWF5IGJlIFxjIE9DTF9Ob25lLgorICBRdWFsVHlwZSBnZXRMaWZldGltZVF1YWxpZmllZFR5cGUoUXVhbFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxpZmllcnM6Ok9iakNMaWZldGltZSBsaWZldGltZSkgeworICAgIGFzc2VydCh0eXBlLmdldE9iakNMaWZldGltZSgpID09IFF1YWxpZmllcnM6Ok9DTF9Ob25lKTsKKyAgICBhc3NlcnQobGlmZXRpbWUgIT0gUXVhbGlmaWVyczo6T0NMX05vbmUpOworCisgICAgUXVhbGlmaWVycyBxczsKKyAgICBxcy5hZGRPYmpDTGlmZXRpbWUobGlmZXRpbWUpOworICAgIHJldHVybiBnZXRRdWFsaWZpZWRUeXBlKHR5cGUsIHFzKTsKKyAgfQorCisgIC8vLyBnZXRVbnF1YWxpZmllZE9iakNQb2ludGVyVHlwZSAtIFJldHVybnMgdmVyc2lvbiBvZgorICAvLy8gT2JqZWN0aXZlLUMgcG9pbnRlciB0eXBlIHdpdGggbGlmZXRpbWUgcXVhbGlmaWVyIHJlbW92ZWQuCisgIFF1YWxUeXBlIGdldFVucXVhbGlmaWVkT2JqQ1BvaW50ZXJUeXBlKFF1YWxUeXBlIHR5cGUpIGNvbnN0IHsKKyAgICBpZiAoIXR5cGUuZ2V0VHlwZVB0cigpLT5pc09iakNPYmplY3RQb2ludGVyVHlwZSgpIHx8CisgICAgICAgICF0eXBlLmdldFF1YWxpZmllcnMoKS5oYXNPYmpDTGlmZXRpbWUoKSkKKyAgICAgIHJldHVybiB0eXBlOworICAgIFF1YWxpZmllcnMgUXMgPSB0eXBlLmdldFF1YWxpZmllcnMoKTsKKyAgICBRcy5yZW1vdmVPYmpDTGlmZXRpbWUoKTsKKyAgICByZXR1cm4gZ2V0UXVhbGlmaWVkVHlwZSh0eXBlLmdldFVucXVhbGlmaWVkVHlwZSgpLCBRcyk7CisgIH0KKworICBEZWNsYXJhdGlvbk5hbWVJbmZvIGdldE5hbWVGb3JUZW1wbGF0ZShUZW1wbGF0ZU5hbWUgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTmFtZUxvYykgY29uc3Q7CisKKyAgVGVtcGxhdGVOYW1lIGdldE92ZXJsb2FkZWRUZW1wbGF0ZU5hbWUoVW5yZXNvbHZlZFNldEl0ZXJhdG9yIEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJlc29sdmVkU2V0SXRlcmF0b3IgRW5kKSBjb25zdDsKKworICBUZW1wbGF0ZU5hbWUgZ2V0UXVhbGlmaWVkVGVtcGxhdGVOYW1lKE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFRlbXBsYXRlS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZURlY2wgKlRlbXBsYXRlKSBjb25zdDsKKworICBUZW1wbGF0ZU5hbWUgZ2V0RGVwZW5kZW50VGVtcGxhdGVOYW1lKE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJZGVudGlmaWVySW5mbyAqTmFtZSkgY29uc3Q7CisgIFRlbXBsYXRlTmFtZSBnZXREZXBlbmRlbnRUZW1wbGF0ZU5hbWUoTmVzdGVkTmFtZVNwZWNpZmllciAqTk5TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJsb2FkZWRPcGVyYXRvcktpbmQgT3BlcmF0b3IpIGNvbnN0OworICBUZW1wbGF0ZU5hbWUgZ2V0U3Vic3RUZW1wbGF0ZVRlbXBsYXRlUGFybShUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2wgKnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZU5hbWUgcmVwbGFjZW1lbnQpIGNvbnN0OworICBUZW1wbGF0ZU5hbWUgZ2V0U3Vic3RUZW1wbGF0ZVRlbXBsYXRlUGFybVBhY2soVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsICpQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICZBcmdQYWNrKSBjb25zdDsKKworICBlbnVtIEdldEJ1aWx0aW5UeXBlRXJyb3IgeworICAgIC8vLyBObyBlcnJvcgorICAgIEdFX05vbmUsCisKKyAgICAvLy8gTWlzc2luZyBhIHR5cGUgZnJvbSA8c3RkaW8uaD4KKyAgICBHRV9NaXNzaW5nX3N0ZGlvLAorCisgICAgLy8vIE1pc3NpbmcgYSB0eXBlIGZyb20gPHNldGptcC5oPgorICAgIEdFX01pc3Npbmdfc2V0am1wLAorCisgICAgLy8vIE1pc3NpbmcgYSB0eXBlIGZyb20gPHVjb250ZXh0Lmg+CisgICAgR0VfTWlzc2luZ191Y29udGV4dAorICB9OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIGJ1aWx0aW4uCisgIC8vLworICAvLy8gSWYgXHAgSW50ZWdlckNvbnN0YW50QXJncyBpcyBub24tbnVsbCwgaXQgaXMgZmlsbGVkIGluIHdpdGggYSBiaXRtYXNrIG9mCisgIC8vLyBhcmd1bWVudHMgdG8gdGhlIGJ1aWx0aW4gdGhhdCBhcmUgcmVxdWlyZWQgdG8gYmUgaW50ZWdlciBjb25zdGFudAorICAvLy8gZXhwcmVzc2lvbnMuCisgIFF1YWxUeXBlIEdldEJ1aWx0aW5UeXBlKHVuc2lnbmVkIElELCBHZXRCdWlsdGluVHlwZUVycm9yICZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKkludGVnZXJDb25zdGFudEFyZ3MgPSBudWxscHRyKSBjb25zdDsKKworcHJpdmF0ZToKKyAgQ2FuUXVhbFR5cGUgZ2V0RnJvbVRhcmdldFR5cGUodW5zaWduZWQgVHlwZSkgY29uc3Q7CisgIFR5cGVJbmZvIGdldFR5cGVJbmZvSW1wbChjb25zdCBUeXBlICpUKSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBQcmVkaWNhdGVzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworcHVibGljOgorICAvLy8gXGJyaWVmIFJldHVybiBvbmUgb2YgdGhlIEdDTm9uZSwgV2VhayBvciBTdHJvbmcgT2JqZWN0aXZlLUMgZ2FyYmFnZQorICAvLy8gY29sbGVjdGlvbiBhdHRyaWJ1dGVzLgorICBRdWFsaWZpZXJzOjpHQyBnZXRPYmpDR0NBdHRyS2luZChRdWFsVHlwZSBUeSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmVjdG9yIHR5cGVzIGFyZSBvZiB0aGUgc2FtZSB1bnF1YWxpZmllZAorICAvLy8gdHlwZSBvciBpZiB0aGV5IGFyZSBlcXVpdmFsZW50IHRvIHRoZSBzYW1lIEdDQyB2ZWN0b3IgdHlwZS4KKyAgLy8vCisgIC8vLyBcbm90ZSBUaGlzIGlnbm9yZXMgd2hldGhlciB0aGV5IGFyZSB0YXJnZXQtc3BlY2lmaWMgKEFsdGlWZWMgb3IgTmVvbikKKyAgLy8vIHR5cGVzLgorICBib29sIGFyZUNvbXBhdGlibGVWZWN0b3JUeXBlcyhRdWFsVHlwZSBGaXJzdFZlYywgUXVhbFR5cGUgU2Vjb25kVmVjKTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gXGMgTlNPYmplY3Qgb2JqZWN0IHdpdGggaXRzIFxjIE5TT2JqZWN0CisgIC8vLyBhdHRyaWJ1dGUgc2V0LgorICBzdGF0aWMgYm9vbCBpc09iakNOU09iamVjdFR5cGUoUXVhbFR5cGUgVHkpIHsKKyAgICByZXR1cm4gVHktPmlzT2JqQ05TT2JqZWN0VHlwZSgpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgU2l6aW5nIGFuZCBBbmFseXNpcworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgQVBGbG9hdCAnc2VtYW50aWNzJyBmb3IgdGhlIHNwZWNpZmllZCBzY2FsYXIgZmxvYXRpbmcKKyAgLy8vIHBvaW50IHR5cGUuCisgIGNvbnN0IGxsdm06OmZsdFNlbWFudGljcyAmZ2V0RmxvYXRUeXBlU2VtYW50aWNzKFF1YWxUeXBlIFQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBzaXplIGFuZCBhbGlnbm1lbnQgb2YgdGhlIHNwZWNpZmllZCBjb21wbGV0ZSB0eXBlIGluIGJpdHMuCisgIFR5cGVJbmZvIGdldFR5cGVJbmZvKGNvbnN0IFR5cGUgKlQpIGNvbnN0OworICBUeXBlSW5mbyBnZXRUeXBlSW5mbyhRdWFsVHlwZSBUKSBjb25zdCB7IHJldHVybiBnZXRUeXBlSW5mbyhULmdldFR5cGVQdHIoKSk7IH0KKworICAvLy8gXGJyaWVmIEdldCBkZWZhdWx0IHNpbWQgYWxpZ25tZW50IG9mIHRoZSBzcGVjaWZpZWQgY29tcGxldGUgdHlwZSBpbiBiaXRzLgorICB1bnNpZ25lZCBnZXRPcGVuTVBEZWZhdWx0U2ltZEFsaWduKFF1YWxUeXBlIFQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzcGVjaWZpZWQgKGNvbXBsZXRlKSB0eXBlIFxwIFQsIGluIGJpdHMuCisgIHVpbnQ2NF90IGdldFR5cGVTaXplKFF1YWxUeXBlIFQpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVJbmZvKFQpLldpZHRoOyB9CisgIHVpbnQ2NF90IGdldFR5cGVTaXplKGNvbnN0IFR5cGUgKlQpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVJbmZvKFQpLldpZHRoOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGNoYXJhY3RlciB0eXBlLCBpbiBiaXRzLgorICB1aW50NjRfdCBnZXRDaGFyV2lkdGgoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGVTaXplKENoYXJUeSk7CisgIH0KKworICAvLy8gXGJyaWVmIENvbnZlcnQgYSBzaXplIGluIGJpdHMgdG8gYSBzaXplIGluIGNoYXJhY3RlcnMuCisgIENoYXJVbml0cyB0b0NoYXJVbml0c0Zyb21CaXRzKGludDY0X3QgQml0U2l6ZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDb252ZXJ0IGEgc2l6ZSBpbiBjaGFyYWN0ZXJzIHRvIGEgc2l6ZSBpbiBiaXRzLgorICBpbnQ2NF90IHRvQml0cyhDaGFyVW5pdHMgQ2hhclNpemUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzcGVjaWZpZWQgKGNvbXBsZXRlKSB0eXBlIFxwIFQsIGluCisgIC8vLyBjaGFyYWN0ZXJzLgorICBDaGFyVW5pdHMgZ2V0VHlwZVNpemVJbkNoYXJzKFF1YWxUeXBlIFQpIGNvbnN0OworICBDaGFyVW5pdHMgZ2V0VHlwZVNpemVJbkNoYXJzKGNvbnN0IFR5cGUgKlQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBBQkktc3BlY2lmaWVkIGFsaWdubWVudCBvZiBhIChjb21wbGV0ZSkgdHlwZSBccCBULCBpbgorICAvLy8gYml0cy4KKyAgdW5zaWduZWQgZ2V0VHlwZUFsaWduKFF1YWxUeXBlIFQpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVJbmZvKFQpLkFsaWduOyB9CisgIHVuc2lnbmVkIGdldFR5cGVBbGlnbihjb25zdCBUeXBlICpUKSBjb25zdCB7IHJldHVybiBnZXRUeXBlSW5mbyhUKS5BbGlnbjsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBBQkktc3BlY2lmaWVkIGFsaWdubWVudCBvZiBhIHR5cGUsIGluIGJpdHMsIG9yIDAgaWYKKyAgLy8vIHRoZSB0eXBlIGlzIGluY29tcGxldGUgYW5kIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGFsaWdubWVudCAoZm9yCisgIC8vLyBleGFtcGxlLCBmcm9tIGFsaWdubWVudCBhdHRyaWJ1dGVzKS4KKyAgdW5zaWduZWQgZ2V0VHlwZUFsaWduSWZLbm93bihRdWFsVHlwZSBUKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgQUJJLXNwZWNpZmllZCBhbGlnbm1lbnQgb2YgYSAoY29tcGxldGUpIHR5cGUgXHAgVCwgaW4KKyAgLy8vIGNoYXJhY3RlcnMuCisgIENoYXJVbml0cyBnZXRUeXBlQWxpZ25JbkNoYXJzKFF1YWxUeXBlIFQpIGNvbnN0OworICBDaGFyVW5pdHMgZ2V0VHlwZUFsaWduSW5DaGFycyhjb25zdCBUeXBlICpUKSBjb25zdDsKKworICAvLyBnZXRUeXBlSW5mb0RhdGFTaXplSW5DaGFycyAtIFJldHVybiB0aGUgc2l6ZSBvZiBhIHR5cGUsIGluIGNoYXJzLiBJZiB0aGUKKyAgLy8gdHlwZSBpcyBhIHJlY29yZCwgaXRzIGRhdGEgc2l6ZSBpcyByZXR1cm5lZC4KKyAgc3RkOjpwYWlyPENoYXJVbml0cywgQ2hhclVuaXRzPiBnZXRUeXBlSW5mb0RhdGFTaXplSW5DaGFycyhRdWFsVHlwZSBUKSBjb25zdDsKKworICBzdGQ6OnBhaXI8Q2hhclVuaXRzLCBDaGFyVW5pdHM+IGdldFR5cGVJbmZvSW5DaGFycyhjb25zdCBUeXBlICpUKSBjb25zdDsKKyAgc3RkOjpwYWlyPENoYXJVbml0cywgQ2hhclVuaXRzPiBnZXRUeXBlSW5mb0luQ2hhcnMoUXVhbFR5cGUgVCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgaWYgdGhlIGFsaWdubWVudCB0aGUgdHlwZSBoYXMgd2FzIHJlcXVpcmVkIHVzaW5nIGFuCisgIC8vLyBhbGlnbm1lbnQgYXR0cmlidXRlLgorICBib29sIGlzQWxpZ25tZW50UmVxdWlyZWQoY29uc3QgVHlwZSAqVCkgY29uc3Q7CisgIGJvb2wgaXNBbGlnbm1lbnRSZXF1aXJlZChRdWFsVHlwZSBUKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgInByZWZlcnJlZCIgYWxpZ25tZW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBccCBUIGZvcgorICAvLy8gdGhlIGN1cnJlbnQgdGFyZ2V0LCBpbiBiaXRzLgorICAvLy8KKyAgLy8vIFRoaXMgY2FuIGJlIGRpZmZlcmVudCB0aGFuIHRoZSBBQkkgYWxpZ25tZW50IGluIGNhc2VzIHdoZXJlIGl0IGlzCisgIC8vLyBiZW5lZmljaWFsIGZvciBwZXJmb3JtYW5jZSB0byBvdmVyYWxpZ24gYSBkYXRhIHR5cGUuCisgIHVuc2lnbmVkIGdldFByZWZlcnJlZFR5cGVBbGlnbihjb25zdCBUeXBlICpUKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZGVmYXVsdCBhbGlnbm1lbnQgZm9yIF9fYXR0cmlidXRlX18oKGFsaWduZWQpKSBvbgorICAvLy8gdGhpcyB0YXJnZXQsIHRvIGJlIHVzZWQgaWYgbm8gYWxpZ25tZW50IHZhbHVlIGlzIHNwZWNpZmllZC4KKyAgdW5zaWduZWQgZ2V0VGFyZ2V0RGVmYXVsdEFsaWduRm9yQXR0cmlidXRlQWxpZ25lZCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBhbGlnbm1lbnQgaW4gYml0cyB0aGF0IHNob3VsZCBiZSBnaXZlbiB0byBhCisgIC8vLyBnbG9iYWwgdmFyaWFibGUgd2l0aCB0eXBlIFxwIFQuCisgIHVuc2lnbmVkIGdldEFsaWduT2ZHbG9iYWxWYXIoUXVhbFR5cGUgVCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGFsaWdubWVudCBpbiBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIGJlIGdpdmVuIHRvIGEKKyAgLy8vIGdsb2JhbCB2YXJpYWJsZSB3aXRoIHR5cGUgXHAgVC4KKyAgQ2hhclVuaXRzIGdldEFsaWduT2ZHbG9iYWxWYXJJbkNoYXJzKFF1YWxUeXBlIFQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgY29uc2VydmF0aXZlIGVzdGltYXRlIG9mIHRoZSBhbGlnbm1lbnQgb2YgdGhlIHNwZWNpZmllZAorICAvLy8gZGVjbCBccCBELgorICAvLy8KKyAgLy8vIFxwcmUgXHAgRCBtdXN0IG5vdCBiZSBhIGJpdGZpZWxkIHR5cGUsIGFzIGJpdGZpZWxkcyBkbyBub3QgaGF2ZSBhIHZhbGlkCisgIC8vLyBhbGlnbm1lbnQuCisgIC8vLworICAvLy8gSWYgXHAgRm9yQWxpZ25vZiwgcmVmZXJlbmNlcyBhcmUgdHJlYXRlZCBsaWtlIHRoZWlyIHVuZGVybHlpbmcgdHlwZQorICAvLy8gYW5kICBsYXJnZSBhcnJheXMgZG9uJ3QgZ2V0IGFueSBzcGVjaWFsIHRyZWF0bWVudC4gSWYgbm90IFxwIEZvckFsaWdub2YKKyAgLy8vIGl0IGNvbXB1dGVzIHRoZSB2YWx1ZSBleHBlY3RlZCBieSBDb2RlR2VuOiByZWZlcmVuY2VzIGFyZSB0cmVhdGVkIGxpa2UKKyAgLy8vIHBvaW50ZXJzIGFuZCBsYXJnZSBhcnJheXMgZ2V0IGV4dHJhIGFsaWdubWVudC4KKyAgQ2hhclVuaXRzIGdldERlY2xBbGlnbihjb25zdCBEZWNsICpELCBib29sIEZvckFsaWdub2YgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgb3IgY29tcHV0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGF5b3V0IG9mIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHJlY29yZCAoc3RydWN0L3VuaW9uL2NsYXNzKSBccCBELCB3aGljaCBpbmRpY2F0ZXMgaXRzIHNpemUgYW5kIGZpZWxkCisgIC8vLyBwb3NpdGlvbiBpbmZvcm1hdGlvbi4KKyAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZnZXRBU1RSZWNvcmRMYXlvdXQoY29uc3QgUmVjb3JkRGVjbCAqRCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgb3IgY29tcHV0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGF5b3V0IG9mIHRoZSBzcGVjaWZpZWQKKyAgLy8vIE9iamVjdGl2ZS1DIGludGVyZmFjZS4KKyAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZnZXRBU1RPYmpDSW50ZXJmYWNlTGF5b3V0KGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpEKQorICAgIGNvbnN0OworCisgIHZvaWQgRHVtcFJlY29yZExheW91dChjb25zdCBSZWNvcmREZWNsICpSRCwgcmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaW1wbGUgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgb3IgY29tcHV0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGF5b3V0IG9mIHRoZSBzcGVjaWZpZWQKKyAgLy8vIE9iamVjdGl2ZS1DIGltcGxlbWVudGF0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgbWF5IGRpZmZlciBmcm9tIHRoZSBpbnRlcmZhY2UgaWYgc3ludGhlc2l6ZWQgaXZhcnMgYXJlIHByZXNlbnQuCisgIGNvbnN0IEFTVFJlY29yZExheW91dCAmCisgIGdldEFTVE9iakNJbXBsZW1lbnRhdGlvbkxheW91dChjb25zdCBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpEKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCBvdXIgY3VycmVudCBiZXN0IGlkZWEgZm9yIHRoZSBrZXkgZnVuY3Rpb24gb2YgdGhlCisgIC8vLyBnaXZlbiByZWNvcmQgZGVjbCwgb3IgbnVsbHB0ciBpZiB0aGVyZSBpc24ndCBvbmUuCisgIC8vLworICAvLy8gVGhlIGtleSBmdW5jdGlvbiBpcywgYWNjb3JkaW5nIHRvIHRoZSBJdGFuaXVtIEMrKyBBQkkgc2VjdGlvbiA1LjIuMzoKKyAgLy8vICAgLi4udGhlIGZpcnN0IG5vbi1wdXJlIHZpcnR1YWwgZnVuY3Rpb24gdGhhdCBpcyBub3QgaW5saW5lIGF0IHRoZQorICAvLy8gICBwb2ludCBvZiBjbGFzcyBkZWZpbml0aW9uLgorICAvLy8KKyAgLy8vIE90aGVyIEFCSXMgdXNlIHRoZSBzYW1lIGlkZWEuICBIb3dldmVyLCB0aGUgQVJNIEMrKyBBQkkgaWdub3JlcworICAvLy8gdmlydHVhbCBmdW5jdGlvbnMgdGhhdCBhcmUgZGVmaW5lZCAnaW5saW5lJywgd2hpY2ggbWVhbnMgdGhhdAorICAvLy8gdGhlIHJlc3VsdCBvZiB0aGlzIGNvbXB1dGF0aW9uIGNhbiBjaGFuZ2UuCisgIGNvbnN0IENYWE1ldGhvZERlY2wgKmdldEN1cnJlbnRLZXlGdW5jdGlvbihjb25zdCBDWFhSZWNvcmREZWNsICpSRCk7CisKKyAgLy8vIFxicmllZiBPYnNlcnZlIHRoYXQgdGhlIGdpdmVuIG1ldGhvZCBjYW5ub3QgYmUgYSBrZXkgZnVuY3Rpb24uCisgIC8vLyBDaGVja3MgdGhlIGtleS1mdW5jdGlvbiBjYWNoZSBmb3IgdGhlIG1ldGhvZCdzIGNsYXNzIGFuZCBjbGVhcnMgaXQKKyAgLy8vIGlmIG1hdGNoZXMgdGhlIGdpdmVuIGRlY2xhcmF0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCBpbiBBQklzIHdoZXJlIG91dC1vZi1saW5lIGRlZmluaXRpb25zIG1hcmtlZAorICAvLy8gaW5saW5lIGFyZSBub3QgY29uc2lkZXJlZCB0byBiZSBrZXkgZnVuY3Rpb25zLgorICAvLy8KKyAgLy8vIFxwYXJhbSBtZXRob2Qgc2hvdWxkIGJlIHRoZSBkZWNsYXJhdGlvbiBmcm9tIHRoZSBjbGFzcyBkZWZpbml0aW9uCisgIHZvaWQgc2V0Tm9uS2V5RnVuY3Rpb24oY29uc3QgQ1hYTWV0aG9kRGVjbCAqbWV0aG9kKTsKKworICAvLy8gTG9hZGluZyB2aXJ0dWFsIG1lbWJlciBwb2ludGVycyB1c2luZyB0aGUgdmlydHVhbCBpbmhlcml0YW5jZSBtb2RlbAorICAvLy8gYWx3YXlzIHJlc3VsdHMgaW4gYW4gYWRqdXN0bWVudCB1c2luZyB0aGUgdmJ0YWJsZSBldmVuIGlmIHRoZSBpbmRleCBpcworICAvLy8gemVyby4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzdWFsbHkgT0sgYmVjYXVzZSB0aGUgZmlyc3Qgc2xvdCBpbiB0aGUgdmJ0YWJsZSBwb2ludHMKKyAgLy8vIGJhY2t3YXJkcyB0byB0aGUgdG9wIG9mIHRoZSBNREMuICBIb3dldmVyLCB0aGUgTURDIG1pZ2h0IGJlIHJldXNpbmcgYQorICAvLy8gdmJwdHIgZnJvbSBhbiBudi1iYXNlLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmlyc3Qgc2xvdCBpbiB0aGUgdmJ0YWJsZQorICAvLy8gcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgbnYtYmFzZSB3aGljaCBpbnRyb2R1Y2VkIHRoZSB2YnB0ciBhbmQgKm5vdCoKKyAgLy8vIHRoZSBNREMuICBNb2RpZnkgdGhlIE5vblZpcnR1YWxCYXNlQWRqdXN0bWVudCB0byBhY2NvdW50IGZvciB0aGlzLgorICBDaGFyVW5pdHMgZ2V0T2Zmc2V0T2ZCYXNlV2l0aFZCUHRyKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBvZmZzZXQgb2YgYSBGaWVsZERlY2wgb3IgSW5kaXJlY3RGaWVsZERlY2wsIGluIGJpdHMuCisgIHVpbnQ2NF90IGdldEZpZWxkT2Zmc2V0KGNvbnN0IFZhbHVlRGVjbCAqRkQpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIG9mZnNldCBvZiBhbiBPYmpDSXZhckRlY2wgaW4gYml0cy4KKyAgdWludDY0X3QgbG9va3VwRmllbGRCaXRPZmZzZXQoY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKk9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJdmFyRGVjbCAqSXZhcikgY29uc3Q7CisKKyAgYm9vbCBpc05lYXJseUVtcHR5KGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSBjb25zdDsKKworICBWVGFibGVDb250ZXh0QmFzZSAqZ2V0VlRhYmxlQ29udGV4dCgpOworCisgIE1hbmdsZUNvbnRleHQgKmNyZWF0ZU1hbmdsZUNvbnRleHQoKTsKKworICB2b2lkIERlZXBDb2xsZWN0T2JqQ0l2YXJzKGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpPSSwgYm9vbCBsZWFmQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IE9iakNJdmFyRGVjbCo+ICZJdmFycykgY29uc3Q7CisKKyAgdW5zaWduZWQgQ291bnROb25DbGFzc0l2YXJzKGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpPSSkgY29uc3Q7CisgIHZvaWQgQ29sbGVjdEluaGVyaXRlZFByb3RvY29scyhjb25zdCBEZWNsICpDRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxQdHJTZXQ8T2JqQ1Byb3RvY29sRGVjbCosIDg+ICZQcm90b2NvbHMpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB0eXBlIGhhcyB1bmlxdWUgb2JqZWN0IHJlcHJlc2VudGF0aW9ucworICAvLy8gYWNjb3JkaW5nIHRvIChDKysxNyBbbWV0YS51bmFyeS5wcm9wXXA5KQorICBib29sIGhhc1VuaXF1ZU9iamVjdFJlcHJlc2VudGF0aW9ucyhRdWFsVHlwZSBUeSkgY29uc3Q7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgT3BlcmF0b3JzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBjYW5vbmljYWwgKHN0cnVjdHVyYWwpIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgLy8vIHNwZWNpZmllZCBwb3RlbnRpYWxseSBub24tY2Fub25pY2FsIHR5cGUgXHAgVC4KKyAgLy8vCisgIC8vLyBUaGUgbm9uLWNhbm9uaWNhbCB2ZXJzaW9uIG9mIGEgdHlwZSBtYXkgaGF2ZSBtYW55ICJkZWNvcmF0ZWQiIHZlcnNpb25zIG9mCisgIC8vLyB0eXBlcy4gIERlY29yYXRvcnMgY2FuIGluY2x1ZGUgdHlwZWRlZnMsICd0eXBlb2YnIG9wZXJhdG9ycywgZXRjLiBUaGUKKyAgLy8vIHJldHVybmVkIHR5cGUgaXMgZ3VhcmFudGVlZCB0byBiZSBmcmVlIG9mIGFueSBvZiB0aGVzZSwgYWxsb3dpbmcgdHdvCisgIC8vLyBjYW5vbmljYWwgdHlwZXMgdG8gYmUgY29tcGFyZWQgZm9yIGV4YWN0IGVxdWFsaXR5IHdpdGggYSBzaW1wbGUgcG9pbnRlcgorICAvLy8gY29tcGFyaXNvbi4KKyAgQ2FuUXVhbFR5cGUgZ2V0Q2Fub25pY2FsVHlwZShRdWFsVHlwZSBUKSBjb25zdCB7CisgICAgcmV0dXJuIENhblF1YWxUeXBlOjpDcmVhdGVVbnNhZmUoVC5nZXRDYW5vbmljYWxUeXBlKCkpOworICB9CisKKyAgY29uc3QgVHlwZSAqZ2V0Q2Fub25pY2FsVHlwZShjb25zdCBUeXBlICpUKSBjb25zdCB7CisgICAgcmV0dXJuIFQtPmdldENhbm9uaWNhbFR5cGVJbnRlcm5hbCgpLmdldFR5cGVQdHIoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBjYW5vbmljYWwgcGFyYW1ldGVyIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWMKKyAgLy8vIHBvdGVudGlhbGx5IG5vbi1jYW5vbmljYWwgb25lLgorICAvLy8KKyAgLy8vIFF1YWxpZmllcnMgYXJlIHN0cmlwcGVkIG9mZiwgZnVuY3Rpb25zIGFyZSB0dXJuZWQgaW50byBmdW5jdGlvbgorICAvLy8gcG9pbnRlcnMsIGFuZCBhcnJheXMgZGVjYXkgb25lIGxldmVsIGludG8gcG9pbnRlcnMuCisgIENhblF1YWxUeXBlIGdldENhbm9uaWNhbFBhcmFtVHlwZShRdWFsVHlwZSBUKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiB0eXBlcyBccCBUMSBhbmQgXHAgVDIgYXJlIGVxdWl2YWxlbnQuCisgIGJvb2wgaGFzU2FtZVR5cGUoUXVhbFR5cGUgVDEsIFF1YWxUeXBlIFQyKSBjb25zdCB7CisgICAgcmV0dXJuIGdldENhbm9uaWNhbFR5cGUoVDEpID09IGdldENhbm9uaWNhbFR5cGUoVDIpOworICB9CisgIGJvb2wgaGFzU2FtZVR5cGUoY29uc3QgVHlwZSAqVDEsIGNvbnN0IFR5cGUgKlQyKSBjb25zdCB7CisgICAgcmV0dXJuIGdldENhbm9uaWNhbFR5cGUoVDEpID09IGdldENhbm9uaWNhbFR5cGUoVDIpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhpcyB0eXBlIGFzIGEgY29tcGxldGVseS11bnF1YWxpZmllZCBhcnJheSB0eXBlLAorICAvLy8gY2FwdHVyaW5nIHRoZSBxdWFsaWZpZXJzIGluIFxwIFF1YWxzLgorICAvLy8KKyAgLy8vIFRoaXMgd2lsbCByZW1vdmUgdGhlIG1pbmltYWwgYW1vdW50IG9mIHN1Z2FyaW5nIGZyb20gdGhlIHR5cGVzLCBzaW1pbGFyCisgIC8vLyB0byB0aGUgYmVoYXZpb3Igb2YgUXVhbFR5cGU6OmdldFVucXVhbGlmaWVkVHlwZSgpLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUIGlzIHRoZSBxdWFsaWZpZWQgdHlwZSwgd2hpY2ggbWF5IGJlIGFuIEFycmF5VHlwZQorICAvLy8KKyAgLy8vIFxwYXJhbSBRdWFscyB3aWxsIHJlY2VpdmUgdGhlIGZ1bGwgc2V0IG9mIHF1YWxpZmllcnMgdGhhdCB3ZXJlCisgIC8vLyBhcHBsaWVkIHRvIHRoZSBhcnJheS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBpZiB0aGlzIGlzIGFuIGFycmF5IHR5cGUsIHRoZSBjb21wbGV0ZWx5IHVucXVhbGlmaWVkIGFycmF5IHR5cGUKKyAgLy8vIHRoYXQgY29ycmVzcG9uZHMgdG8gaXQuIE90aGVyd2lzZSwgcmV0dXJucyBULmdldFVucXVhbGlmaWVkVHlwZSgpLgorICBRdWFsVHlwZSBnZXRVbnF1YWxpZmllZEFycmF5VHlwZShRdWFsVHlwZSBULCBRdWFsaWZpZXJzICZRdWFscyk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gdHlwZXMgYXJlIGVxdWl2YWxlbnQgYWZ0ZXIKKyAgLy8vIGN2ci1xdWFsaWZpZXJzIGhhdmUgYmVlbiByZW1vdmVkLgorICBib29sIGhhc1NhbWVVbnF1YWxpZmllZFR5cGUoUXVhbFR5cGUgVDEsIFF1YWxUeXBlIFQyKSBjb25zdCB7CisgICAgcmV0dXJuIGdldENhbm9uaWNhbFR5cGUoVDEpLmdldFR5cGVQdHIoKSA9PQorICAgICAgICAgICBnZXRDYW5vbmljYWxUeXBlKFQyKS5nZXRUeXBlUHRyKCk7CisgIH0KKworICBib29sIGhhc1NhbWVOdWxsYWJpbGl0eVR5cGVRdWFsaWZpZXIoUXVhbFR5cGUgU3ViVCwgUXVhbFR5cGUgU3VwZXJULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1BhcmFtKSBjb25zdCB7CisgICAgYXV0byBTdWJUbnVsbGFiaWxpdHkgPSBTdWJULT5nZXROdWxsYWJpbGl0eSgqdGhpcyk7CisgICAgYXV0byBTdXBlclRudWxsYWJpbGl0eSA9IFN1cGVyVC0+Z2V0TnVsbGFiaWxpdHkoKnRoaXMpOworICAgIGlmIChTdWJUbnVsbGFiaWxpdHkuaGFzVmFsdWUoKSA9PSBTdXBlclRudWxsYWJpbGl0eS5oYXNWYWx1ZSgpKSB7CisgICAgICAvLyBOZWl0aGVyIGhhcyBudWxsYWJpbGl0eTsgcmV0dXJuIHRydWUKKyAgICAgIGlmICghU3ViVG51bGxhYmlsaXR5KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIC8vIEJvdGggaGF2ZSBudWxsYWJpbGl0eSBxdWFsaWZpZXIuCisgICAgICBpZiAoKlN1YlRudWxsYWJpbGl0eSA9PSAqU3VwZXJUbnVsbGFiaWxpdHkgfHwKKyAgICAgICAgICAqU3ViVG51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5S2luZDo6VW5zcGVjaWZpZWQgfHwKKyAgICAgICAgICAqU3VwZXJUbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlLaW5kOjpVbnNwZWNpZmllZCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIGlmIChJc1BhcmFtKSB7CisgICAgICAgIC8vIE9rIGZvciB0aGUgc3VwZXJjbGFzcyBtZXRob2QgcGFyYW1ldGVyIHRvIGJlICJub25udWxsIiBhbmQgdGhlIHN1YmNsYXNzCisgICAgICAgIC8vIG1ldGhvZCBwYXJhbWV0ZXIgdG8gYmUgIm51bGxhYmxlIgorICAgICAgICByZXR1cm4gKCpTdXBlclRudWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eUtpbmQ6Ok5vbk51bGwgJiYKKyAgICAgICAgICAgICAgICAqU3ViVG51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5S2luZDo6TnVsbGFibGUpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8vIEZvciB0aGUgcmV0dXJuIHR5cGUsIGl0J3Mgb2theSBmb3IgdGhlIHN1cGVyY2xhc3MgbWV0aG9kIHRvIHNwZWNpZnkKKyAgICAgICAgLy8gIm51bGxhYmxlIiBhbmQgdGhlIHN1YmNsYXNzIG1ldGhvZCBzcGVjaWZ5ICJub25udWxsIgorICAgICAgICByZXR1cm4gKCpTdXBlclRudWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eUtpbmQ6Ok51bGxhYmxlICYmCisgICAgICAgICAgICAgICAgKlN1YlRudWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eUtpbmQ6Ok5vbk51bGwpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgT2JqQ01ldGhvZHNBcmVFcXVhbChjb25zdCBPYmpDTWV0aG9kRGVjbCAqTWV0aG9kRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNNZXRob2REZWNsICpNZXRob2RJbXApOworCisgIGJvb2wgVW53cmFwU2ltaWxhclBvaW50ZXJUeXBlcyhRdWFsVHlwZSAmVDEsIFF1YWxUeXBlICZUMik7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZXMgdGhlICJjYW5vbmljYWwiIG5lc3RlZCBuYW1lIHNwZWNpZmllciBmb3IgYQorICAvLy8gZ2l2ZW4gbmVzdGVkIG5hbWUgc3BlY2lmaWVyLgorICAvLy8KKyAgLy8vIFRoZSBjYW5vbmljYWwgbmVzdGVkIG5hbWUgc3BlY2lmaWVyIGlzIGEgbmVzdGVkIG5hbWUgc3BlY2lmaWVyCisgIC8vLyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgYSB0eXBlIG9yIG5hbWVzcGFjZSB3aXRoaW4gdGhlIHR5cGUKKyAgLy8vIHN5c3RlbS4gRm9yIGV4YW1wbGUsIGdpdmVuOgorICAvLy8KKyAgLy8vIFxjb2RlCisgIC8vLyBuYW1lc3BhY2UgTiB7CisgIC8vLyAgIHN0cnVjdCBTIHsKKyAgLy8vICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWCB7IHR5cGVuYW1lIFQqIHR5cGU7IH07CisgIC8vLyAgIH07CisgIC8vLyB9CisgIC8vLworICAvLy8gdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFkgeworICAvLy8gICB0eXBlbmFtZSBOOjpTOjpYPFQ+Ojp0eXBlIG1lbWJlcjsKKyAgLy8vIH07CisgIC8vLyBcZW5kY29kZQorICAvLy8KKyAgLy8vIEhlcmUsIHRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgZm9yIE46OlM6Olg8VD46OiB3aWxsIGJlCisgIC8vLyBTOjpYPHRlbXBsYXRlLXBhcmFtLTAtMD4sIHNpbmNlICdTJyBhbmQgJ1gnIGFyZSB1bmlxdWVseSBkZWZpbmVkCisgIC8vLyBieSBkZWNsYXJhdGlvbnMgaW4gdGhlIHR5cGUgc3lzdGVtIGFuZCB0aGUgY2Fub25pY2FsIHR5cGUgZm9yCisgIC8vLyB0aGUgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXIgJ1QnIGlzIHRlbXBsYXRlLXBhcmFtLTAtMC4KKyAgTmVzdGVkTmFtZVNwZWNpZmllciAqCisgIGdldENhbm9uaWNhbE5lc3RlZE5hbWVTcGVjaWZpZXIoTmVzdGVkTmFtZVNwZWNpZmllciAqTk5TKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlcyB0aGUgZGVmYXVsdCBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIHRoZSBjdXJyZW50IHRhcmdldC4KKyAgQ2FsbGluZ0NvbnYgZ2V0RGVmYXVsdENhbGxpbmdDb252ZW50aW9uKGJvb2wgSXNWYXJpYWRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNDWFhNZXRob2QpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmVzIHRoZSAiY2Fub25pY2FsIiB0ZW1wbGF0ZSBuYW1lIHRoYXQgcmVmZXJzIHRvIGEKKyAgLy8vIGdpdmVuIHRlbXBsYXRlLgorICAvLy8KKyAgLy8vIFRoZSBjYW5vbmljYWwgdGVtcGxhdGUgbmFtZSBpcyB0aGUgc2ltcGxlc3QgZXhwcmVzc2lvbiB0aGF0IGNhbgorICAvLy8gYmUgdXNlZCB0byByZWZlciB0byBhIGdpdmVuIHRlbXBsYXRlLiBGb3IgbW9zdCB0ZW1wbGF0ZXMsIHRoaXMKKyAgLy8vIGV4cHJlc3Npb24gaXMganVzdCB0aGUgdGVtcGxhdGUgZGVjbGFyYXRpb24gaXRzZWxmLiBGb3IgZXhhbXBsZSwKKyAgLy8vIHRoZSB0ZW1wbGF0ZSBzdGQ6OnZlY3RvciBjYW4gYmUgcmVmZXJyZWQgdG8gdmlhIGEgdmFyaWV0eSBvZgorICAvLy8gbmFtZXMtLS1zdGQ6OnZlY3RvciwgXDo6c3RkOjp2ZWN0b3IsIHZlY3RvciAoaWYgdmVjdG9yIGlzIGluCisgIC8vLyBzY29wZSksIGV0Yy4tLS1idXQgYWxsIG9mIHRoZXNlIG5hbWVzIG1hcCBkb3duIHRvIHRoZSBzYW1lCisgIC8vLyBUZW1wbGF0ZURlY2wsIHdoaWNoIGlzIHVzZWQgdG8gZm9ybSB0aGUgY2Fub25pY2FsIHRlbXBsYXRlIG5hbWUuCisgIC8vLworICAvLy8gRGVwZW5kZW50IHRlbXBsYXRlIG5hbWVzIGFyZSBtb3JlIGludGVyZXN0aW5nLiBIZXJlLCB0aGUKKyAgLy8vIHRlbXBsYXRlIG5hbWUgY291bGQgYmUgc29tZXRoaW5nIGxpa2UgVDo6dGVtcGxhdGUgYXBwbHkgb3IKKyAgLy8vIHN0ZDo6YWxsb2NhdG9yPFQ+Ojp0ZW1wbGF0ZSByZWJpbmQsIHdoZXJlIHRoZSBuZXN0ZWQgbmFtZQorICAvLy8gc3BlY2lmaWVyIGl0c2VsZiBpcyBkZXBlbmRlbnQuIEluIHRoaXMgY2FzZSwgdGhlIGNhbm9uaWNhbAorICAvLy8gdGVtcGxhdGUgbmFtZSB1c2VzIHRoZSBzaG9ydGVzdCBmb3JtIG9mIHRoZSBkZXBlbmRlbnQKKyAgLy8vIG5lc3RlZC1uYW1lLXNwZWNpZmllciwgd2hpY2ggaXRzZWxmIGNvbnRhaW5zIGFsbCBjYW5vbmljYWwKKyAgLy8vIHR5cGVzLCB2YWx1ZXMsIGFuZCB0ZW1wbGF0ZXMuCisgIFRlbXBsYXRlTmFtZSBnZXRDYW5vbmljYWxUZW1wbGF0ZU5hbWUoVGVtcGxhdGVOYW1lIE5hbWUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIHRlbXBsYXRlIG5hbWVzIHJlZmVyIHRvIHRoZSBzYW1lCisgIC8vLyB0ZW1wbGF0ZS4KKyAgYm9vbCBoYXNTYW1lVGVtcGxhdGVOYW1lKFRlbXBsYXRlTmFtZSBYLCBUZW1wbGF0ZU5hbWUgWSk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgImNhbm9uaWNhbCIgdGVtcGxhdGUgYXJndW1lbnQuCisgIC8vLworICAvLy8gVGhlIGNhbm9uaWNhbCB0ZW1wbGF0ZSBhcmd1bWVudCBpcyB0aGUgc2ltcGxlc3QgdGVtcGxhdGUgYXJndW1lbnQKKyAgLy8vICh3aGljaCBtYXkgYmUgYSB0eXBlLCB2YWx1ZSwgZXhwcmVzc2lvbiwgb3IgZGVjbGFyYXRpb24pIHRoYXQKKyAgLy8vIGV4cHJlc3NlcyB0aGUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50LgorICBUZW1wbGF0ZUFyZ3VtZW50IGdldENhbm9uaWNhbFRlbXBsYXRlQXJndW1lbnQoY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmQXJnKQorICAgIGNvbnN0OworCisgIC8vLyBUeXBlIFF1ZXJ5IGZ1bmN0aW9ucy4gIElmIHRoZSB0eXBlIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCisgIC8vLyByZXR1cm4gdGhlIFR5cGUgcG9pbnRlciBmb3IgdGhlIHVuZGVybHlpbmcgbWF4aW1hbGx5IHByZXR0eSB0eXBlLiAgVGhpcworICAvLy8gaXMgYSBtZW1iZXIgb2YgQVNUQ29udGV4dCBiZWNhdXNlIHRoaXMgbWF5IG5lZWQgdG8gZG8gc29tZSBhbW91bnQgb2YKKyAgLy8vIGNhbm9uaWNhbGl6YXRpb24sIGUuZy4gdG8gbW92ZSB0eXBlIHF1YWxpZmllcnMgaW50byB0aGUgZWxlbWVudCB0eXBlLgorICBjb25zdCBBcnJheVR5cGUgKmdldEFzQXJyYXlUeXBlKFF1YWxUeXBlIFQpIGNvbnN0OworICBjb25zdCBDb25zdGFudEFycmF5VHlwZSAqZ2V0QXNDb25zdGFudEFycmF5VHlwZShRdWFsVHlwZSBUKSBjb25zdCB7CisgICAgcmV0dXJuIGR5bl9jYXN0X29yX251bGw8Q29uc3RhbnRBcnJheVR5cGU+KGdldEFzQXJyYXlUeXBlKFQpKTsKKyAgfQorICBjb25zdCBWYXJpYWJsZUFycmF5VHlwZSAqZ2V0QXNWYXJpYWJsZUFycmF5VHlwZShRdWFsVHlwZSBUKSBjb25zdCB7CisgICAgcmV0dXJuIGR5bl9jYXN0X29yX251bGw8VmFyaWFibGVBcnJheVR5cGU+KGdldEFzQXJyYXlUeXBlKFQpKTsKKyAgfQorICBjb25zdCBJbmNvbXBsZXRlQXJyYXlUeXBlICpnZXRBc0luY29tcGxldGVBcnJheVR5cGUoUXVhbFR5cGUgVCkgY29uc3QgeworICAgIHJldHVybiBkeW5fY2FzdF9vcl9udWxsPEluY29tcGxldGVBcnJheVR5cGU+KGdldEFzQXJyYXlUeXBlKFQpKTsKKyAgfQorICBjb25zdCBEZXBlbmRlbnRTaXplZEFycmF5VHlwZSAqZ2V0QXNEZXBlbmRlbnRTaXplZEFycmF5VHlwZShRdWFsVHlwZSBUKQorICAgIGNvbnN0IHsKKyAgICByZXR1cm4gZHluX2Nhc3Rfb3JfbnVsbDxEZXBlbmRlbnRTaXplZEFycmF5VHlwZT4oZ2V0QXNBcnJheVR5cGUoVCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGlubmVybW9zdCBlbGVtZW50IHR5cGUgb2YgYW4gYXJyYXkgdHlwZS4KKyAgLy8vCisgIC8vLyBGb3IgZXhhbXBsZSwgd2lsbCByZXR1cm4gImludCIgZm9yIGludFttXVtuXQorICBRdWFsVHlwZSBnZXRCYXNlRWxlbWVudFR5cGUoY29uc3QgQXJyYXlUeXBlICpWQVQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBpbm5lcm1vc3QgZWxlbWVudCB0eXBlIG9mIGEgdHlwZSAod2hpY2ggbmVlZG4ndAorICAvLy8gYWN0dWFsbHkgYmUgYW4gYXJyYXkgdHlwZSkuCisgIFF1YWxUeXBlIGdldEJhc2VFbGVtZW50VHlwZShRdWFsVHlwZSBRVCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gbnVtYmVyIG9mIGNvbnN0YW50IGFycmF5IGVsZW1lbnRzLgorICB1aW50NjRfdCBnZXRDb25zdGFudEFycmF5RWxlbWVudENvdW50KGNvbnN0IENvbnN0YW50QXJyYXlUeXBlICpDQSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBQZXJmb3JtIGFkanVzdG1lbnQgb24gdGhlIHBhcmFtZXRlciB0eXBlIG9mIGEgZnVuY3Rpb24uCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIGFkanVzdHMgdGhlIGdpdmVuIHBhcmFtZXRlciB0eXBlIEBwIFQgdG8gdGhlIGFjdHVhbAorICAvLy8gcGFyYW1ldGVyIHR5cGUgdXNlZCBieSBzZW1hbnRpYyBhbmFseXNpcyAoQzk5IDYuNy41LjNwWzcsOF0sCisgIC8vLyBDKysgW2RjbC5mY3RdcDMpLiBUaGUgYWRqdXN0ZWQgcGFyYW1ldGVyIHR5cGUgaXMgcmV0dXJuZWQuCisgIFF1YWxUeXBlIGdldEFkanVzdGVkUGFyYW1ldGVyVHlwZShRdWFsVHlwZSBUKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBwYXJhbWV0ZXIgdHlwZSBhcyBhZGp1c3RlZCBmb3IgdXNlIGluIHRoZSBzaWduYXR1cmUKKyAgLy8vIG9mIGEgZnVuY3Rpb24sIGRlY2F5aW5nIGFycmF5IGFuZCBmdW5jdGlvbiB0eXBlcyBhbmQgcmVtb3ZpbmcgdG9wLWxldmVsCisgIC8vLyBjdi1xdWFsaWZpZXJzLgorICBRdWFsVHlwZSBnZXRTaWduYXR1cmVQYXJhbWV0ZXJUeXBlKFF1YWxUeXBlIFQpIGNvbnN0OworCisgIFF1YWxUeXBlIGdldEV4Y2VwdGlvbk9iamVjdFR5cGUoUXVhbFR5cGUgVCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHByb3Blcmx5IHF1YWxpZmllZCByZXN1bHQgb2YgZGVjYXlpbmcgdGhlIHNwZWNpZmllZAorICAvLy8gYXJyYXkgdHlwZSB0byBhIHBvaW50ZXIuCisgIC8vLworICAvLy8gVGhpcyBvcGVyYXRpb24gaXMgbm9uLXRyaXZpYWwgd2hlbiBoYW5kbGluZyB0eXBlZGVmcyBldGMuICBUaGUgY2Fub25pY2FsCisgIC8vLyB0eXBlIG9mIFxwIFQgbXVzdCBiZSBhbiBhcnJheSB0eXBlLCB0aGlzIHJldHVybnMgYSBwb2ludGVyIHRvIGEgcHJvcGVybHkKKyAgLy8vIHF1YWxpZmllZCBlbGVtZW50IG9mIHRoZSBhcnJheS4KKyAgLy8vCisgIC8vLyBTZWUgQzk5IDYuNy41LjNwNyBhbmQgQzk5IDYuMy4yLjFwMy4KKyAgUXVhbFR5cGUgZ2V0QXJyYXlEZWNheWVkVHlwZShRdWFsVHlwZSBUKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdHlwZSB0aGF0IFxwIFByb21vdGFibGVUeXBlIHdpbGwgcHJvbW90ZSB0bzogQzk5CisgIC8vLyA2LjMuMS4xcDIsIGFzc3VtaW5nIHRoYXQgXHAgUHJvbW90YWJsZVR5cGUgaXMgYSBwcm9tb3RhYmxlIGludGVnZXIgdHlwZS4KKyAgUXVhbFR5cGUgZ2V0UHJvbW90ZWRJbnRlZ2VyVHlwZShRdWFsVHlwZSBQcm9tb3RhYmxlVHlwZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZWN1cnNlcyBpbiBwb2ludGVyL2FycmF5IHR5cGVzIHVudGlsIGl0IGZpbmRzIGFuIE9iamVjdGl2ZS1DCisgIC8vLyByZXRhaW5hYmxlIHR5cGUgYW5kIHJldHVybnMgaXRzIG93bmVyc2hpcC4KKyAgUXVhbGlmaWVyczo6T2JqQ0xpZmV0aW1lIGdldElubmVyT2JqQ093bmVyc2hpcChRdWFsVHlwZSBUKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBpcyBhIHByb21vdGFibGUgYml0ZmllbGQgcmVmZXJlbmNlIGFjY29yZGluZworICAvLy8gdG8gQzk5IDYuMy4xLjFwMiwgYnVsbGV0IDIgKGFuZCBHQ0MgZXh0ZW5zaW9ucykuCisgIC8vLworICAvLy8gXHJldHVybnMgdGhlIHR5cGUgdGhpcyBiaXQtZmllbGQgd2lsbCBwcm9tb3RlIHRvLCBvciBOVUxMIGlmIG5vCisgIC8vLyBwcm9tb3Rpb24gb2NjdXJzLgorICBRdWFsVHlwZSBpc1Byb21vdGFibGVCaXRGaWVsZChFeHByICpFKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgaGlnaGVzdCByYW5rZWQgaW50ZWdlciB0eXBlLCBzZWUgQzk5IDYuMy4xLjhwMS4KKyAgLy8vCisgIC8vLyBJZiBccCBMSFMgPiBccCBSSFMsIHJldHVybnMgMS4gIElmIFxwIExIUyA9PSBccCBSSFMsIHJldHVybnMgMC4gIElmCisgIC8vLyBccCBMSFMgPCBccCBSSFMsIHJldHVybiAtMS4KKyAgaW50IGdldEludGVnZXJUeXBlT3JkZXIoUXVhbFR5cGUgTEhTLCBRdWFsVHlwZSBSSFMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQ29tcGFyZSB0aGUgcmFuayBvZiB0aGUgdHdvIHNwZWNpZmllZCBmbG9hdGluZyBwb2ludCB0eXBlcywKKyAgLy8vIGlnbm9yaW5nIHRoZSBkb21haW4gb2YgdGhlIHR5cGUgKGkuZS4gJ2RvdWJsZScgPT0gJ19Db21wbGV4IGRvdWJsZScpLgorICAvLy8KKyAgLy8vIElmIFxwIExIUyA+IFxwIFJIUywgcmV0dXJucyAxLiAgSWYgXHAgTEhTID09IFxwIFJIUywgcmV0dXJucyAwLiAgSWYKKyAgLy8vIFxwIExIUyA8IFxwIFJIUywgcmV0dXJuIC0xLgorICBpbnQgZ2V0RmxvYXRpbmdUeXBlT3JkZXIoUXVhbFR5cGUgTEhTLCBRdWFsVHlwZSBSSFMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgcmVhbCBmbG9hdGluZyBwb2ludCBvciBhIGNvbXBsZXggdHlwZSAoYmFzZWQgb24KKyAgLy8vIFxwIHR5cGVEb21haW4vXHAgdHlwZVNpemUpLgorICAvLy8KKyAgLy8vIFxwYXJhbSB0eXBlRG9tYWluIGEgcmVhbCBmbG9hdGluZyBwb2ludCBvciBjb21wbGV4IHR5cGUuCisgIC8vLyBccGFyYW0gdHlwZVNpemUgYSByZWFsIGZsb2F0aW5nIHBvaW50IG9yIGNvbXBsZXggdHlwZS4KKyAgUXVhbFR5cGUgZ2V0RmxvYXRpbmdUeXBlT2ZTaXplV2l0aGluRG9tYWluKFF1YWxUeXBlIHR5cGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgdHlwZURvbWFpbikgY29uc3Q7CisKKyAgdW5zaWduZWQgZ2V0VGFyZ2V0QWRkcmVzc1NwYWNlKFF1YWxUeXBlIFQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGFyZ2V0QWRkcmVzc1NwYWNlKFQuZ2V0UXVhbGlmaWVycygpKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFRhcmdldEFkZHJlc3NTcGFjZShRdWFsaWZpZXJzIFEpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGFyZ2V0QWRkcmVzc1NwYWNlKFEuZ2V0QWRkcmVzc1NwYWNlKCkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0VGFyZ2V0QWRkcmVzc1NwYWNlKExhbmdBUyBBUykgY29uc3Q7CisKKyAgLy8vIEdldCB0YXJnZXQtZGVwZW5kZW50IGludGVnZXIgdmFsdWUgZm9yIG51bGwgcG9pbnRlciB3aGljaCBpcyB1c2VkIGZvcgorICAvLy8gY29uc3RhbnQgZm9sZGluZy4KKyAgdWludDY0X3QgZ2V0VGFyZ2V0TnVsbFBvaW50ZXJWYWx1ZShRdWFsVHlwZSBRVCkgY29uc3Q7CisKKyAgYm9vbCBhZGRyZXNzU3BhY2VNYXBNYW5nbGluZ0ZvcihMYW5nQVMgQVMpIGNvbnN0IHsKKyAgICByZXR1cm4gQWRkclNwYWNlTWFwTWFuZ2xpbmcgfHwgaXNUYXJnZXRBZGRyZXNzU3BhY2UoQVMpOworICB9CisKK3ByaXZhdGU6CisgIC8vIEhlbHBlciBmb3IgaW50ZWdlciBvcmRlcmluZworICB1bnNpZ25lZCBnZXRJbnRlZ2VyUmFuayhjb25zdCBUeXBlICpUKSBjb25zdDsKKworcHVibGljOgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gICAgICAgICAgICAgICAgICAgIFR5cGUgQ29tcGF0aWJpbGl0eSBQcmVkaWNhdGVzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBDb21wYXRpYmlsaXR5IHByZWRpY2F0ZXMgdXNlZCB0byBjaGVjayBhc3NpZ25tZW50IGV4cHJlc3Npb25zLgorICBib29sIHR5cGVzQXJlQ29tcGF0aWJsZShRdWFsVHlwZSBUMSwgUXVhbFR5cGUgVDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGFyZVVucXVhbGlmaWVkID0gZmFsc2UpOyAvLyBDOTkgNi4yLjdwMQorCisgIGJvb2wgcHJvcGVydHlUeXBlc0FyZUNvbXBhdGlibGUoUXVhbFR5cGUsIFF1YWxUeXBlKTsKKyAgYm9vbCB0eXBlc0FyZUJsb2NrUG9pbnRlckNvbXBhdGlibGUoUXVhbFR5cGUsIFF1YWxUeXBlKTsKKworICBib29sIGlzT2JqQ0lkVHlwZShRdWFsVHlwZSBUKSBjb25zdCB7CisgICAgcmV0dXJuIFQgPT0gZ2V0T2JqQ0lkVHlwZSgpOworICB9CisKKyAgYm9vbCBpc09iakNDbGFzc1R5cGUoUXVhbFR5cGUgVCkgY29uc3QgeworICAgIHJldHVybiBUID09IGdldE9iakNDbGFzc1R5cGUoKTsKKyAgfQorCisgIGJvb2wgaXNPYmpDU2VsVHlwZShRdWFsVHlwZSBUKSBjb25zdCB7CisgICAgcmV0dXJuIFQgPT0gZ2V0T2JqQ1NlbFR5cGUoKTsKKyAgfQorCisgIGJvb2wgT2JqQ1F1YWxpZmllZElkVHlwZXNBcmVDb21wYXRpYmxlKFF1YWxUeXBlIExIUywgUXVhbFR5cGUgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEZvckNvbXBhcmUpOworCisgIGJvb2wgT2JqQ1F1YWxpZmllZENsYXNzVHlwZXNBcmVDb21wYXRpYmxlKFF1YWxUeXBlIExIUywgUXVhbFR5cGUgUkhTKTsKKworICAvLyBDaGVjayB0aGUgc2FmZXR5IG9mIGFzc2lnbm1lbnQgZnJvbSBMSFMgdG8gUkhTCisgIGJvb2wgY2FuQXNzaWduT2JqQ0ludGVyZmFjZXMoY29uc3QgT2JqQ09iamVjdFBvaW50ZXJUeXBlICpMSFNPUFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ09iamVjdFBvaW50ZXJUeXBlICpSSFNPUFQpOworICBib29sIGNhbkFzc2lnbk9iakNJbnRlcmZhY2VzKGNvbnN0IE9iakNPYmplY3RUeXBlICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ09iamVjdFR5cGUgKlJIUyk7CisgIGJvb2wgY2FuQXNzaWduT2JqQ0ludGVyZmFjZXNJbkJsb2NrUG9pbnRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNPYmplY3RQb2ludGVyVHlwZSAqTEhTT1BULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ09iamVjdFBvaW50ZXJUeXBlICpSSFNPUFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEJsb2NrUmV0dXJuVHlwZSk7CisgIGJvb2wgYXJlQ29tcGFyYWJsZU9iakNQb2ludGVyVHlwZXMoUXVhbFR5cGUgTEhTLCBRdWFsVHlwZSBSSFMpOworICBRdWFsVHlwZSBhcmVDb21tb25CYXNlQ29tcGF0aWJsZShjb25zdCBPYmpDT2JqZWN0UG9pbnRlclR5cGUgKkxIU09QVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ09iamVjdFBvaW50ZXJUeXBlICpSSFNPUFQpOworICBib29sIGNhbkJpbmRPYmpDT2JqZWN0VHlwZShRdWFsVHlwZSBUbywgUXVhbFR5cGUgRnJvbSk7CisKKyAgLy8gRnVuY3Rpb25zIGZvciBjYWxjdWxhdGluZyBjb21wb3NpdGUgdHlwZXMKKyAgUXVhbFR5cGUgbWVyZ2VUeXBlcyhRdWFsVHlwZSwgUXVhbFR5cGUsIGJvb2wgT2ZCbG9ja1BvaW50ZXI9ZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVbnF1YWxpZmllZCA9IGZhbHNlLCBib29sIEJsb2NrUmV0dXJuVHlwZSA9IGZhbHNlKTsKKyAgUXVhbFR5cGUgbWVyZ2VGdW5jdGlvblR5cGVzKFF1YWxUeXBlLCBRdWFsVHlwZSwgYm9vbCBPZkJsb2NrUG9pbnRlcj1mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVW5xdWFsaWZpZWQgPSBmYWxzZSk7CisgIFF1YWxUeXBlIG1lcmdlRnVuY3Rpb25QYXJhbWV0ZXJUeXBlcyhRdWFsVHlwZSwgUXVhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9mQmxvY2tQb2ludGVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVucXVhbGlmaWVkID0gZmFsc2UpOworICBRdWFsVHlwZSBtZXJnZVRyYW5zcGFyZW50VW5pb25UeXBlKFF1YWxUeXBlLCBRdWFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9mQmxvY2tQb2ludGVyPWZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVW5xdWFsaWZpZWQgPSBmYWxzZSk7CisKKyAgUXVhbFR5cGUgbWVyZ2VPYmpDR0NRdWFsaWZpZXJzKFF1YWxUeXBlLCBRdWFsVHlwZSk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gbWVyZ2VzIHRoZSBFeHRQYXJhbWV0ZXJJbmZvIGxpc3RzIG9mIHR3byBmdW5jdGlvbnMuIEl0CisgIC8vLyByZXR1cm5zIHRydWUgaWYgdGhlIGxpc3RzIGFyZSBjb21wYXRpYmxlLiBUaGUgbWVyZ2VkIGxpc3QgaXMgcmV0dXJuZWQgaW4KKyAgLy8vIE5ld1BhcmFtSW5mb3MuCisgIC8vLworICAvLy8gXHBhcmFtIEZpcnN0Rm5UeXBlIFRoZSB0eXBlIG9mIHRoZSBmaXJzdCBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU2Vjb25kRm5UeXBlIFRoZSB0eXBlIG9mIHRoZSBzZWNvbmQgZnVuY3Rpb24uCisgIC8vLworICAvLy8gXHBhcmFtIENhblVzZUZpcnN0IFRoaXMgZmxhZyBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGUgZmlyc3QgZnVuY3Rpb24ncworICAvLy8gRXh0UGFyYW1ldGVySW5mbyBsaXN0IGNhbiBiZSB1c2VkIGFzIHRoZSBjb21wb3NpdGUgbGlzdCBvZgorICAvLy8gRXh0UGFyYW1ldGVySW5mby4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ2FuVXNlU2Vjb25kIFRoaXMgZmxhZyBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGUgc2Vjb25kIGZ1bmN0aW9uJ3MKKyAgLy8vIEV4dFBhcmFtZXRlckluZm8gbGlzdCBjYW4gYmUgdXNlZCBhcyB0aGUgY29tcG9zaXRlIGxpc3Qgb2YKKyAgLy8vIEV4dFBhcmFtZXRlckluZm8uCisgIC8vLworICAvLy8gXHBhcmFtIE5ld1BhcmFtSW5mb3MgVGhlIGNvbXBvc2l0ZSBsaXN0IG9mIEV4dFBhcmFtZXRlckluZm8uIFRoZSBsaXN0IGlzCisgIC8vLyBlbXB0eSBpZiBub25lIG9mIHRoZSBmbGFncyBhcmUgc2V0LgorICAvLy8KKyAgYm9vbCBtZXJnZUV4dFBhcmFtZXRlckluZm8oCisgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRmlyc3RGblR5cGUsCisgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqU2Vjb25kRm5UeXBlLAorICAgICAgYm9vbCAmQ2FuVXNlRmlyc3QsIGJvb2wgJkNhblVzZVNlY29uZCwKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxGdW5jdGlvblByb3RvVHlwZTo6RXh0UGFyYW1ldGVySW5mbz4gJk5ld1BhcmFtSW5mb3MpOworCisgIHZvaWQgUmVzZXRPYmpDTGF5b3V0KGNvbnN0IE9iakNDb250YWluZXJEZWNsICpDRCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIFByZWRpY2F0ZXMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8gVGhlIHdpZHRoIG9mIGFuIGludGVnZXIsIGFzIGRlZmluZWQgaW4gQzk5IDYuMi42LjIuIFRoaXMgaXMgdGhlIG51bWJlcgorICAvLyBvZiBiaXRzIGluIGFuIGludGVnZXIgdHlwZSBleGNsdWRpbmcgYW55IHBhZGRpbmcgYml0cy4KKyAgdW5zaWduZWQgZ2V0SW50V2lkdGgoUXVhbFR5cGUgVCkgY29uc3Q7CisKKyAgLy8gUGVyIEM5OSA2LjIuNXA2LCBmb3IgZXZlcnkgc2lnbmVkIGludGVnZXIgdHlwZSwgdGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nCisgIC8vIHVuc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoaXMgbWV0aG9kIHRha2VzIGEgc2lnbmVkIHR5cGUsIGFuZCByZXR1cm5zIHRoZQorICAvLyBjb3JyZXNwb25kaW5nIHVuc2lnbmVkIGludGVnZXIgdHlwZS4KKyAgUXVhbFR5cGUgZ2V0Q29ycmVzcG9uZGluZ1Vuc2lnbmVkVHlwZShRdWFsVHlwZSBUKSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gICAgICAgICAgICAgICAgICAgIEludGVnZXIgVmFsdWVzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgTWFrZSBhbiBBUFNJbnQgb2YgdGhlIGFwcHJvcHJpYXRlIHdpZHRoIGFuZCBzaWduZWRuZXNzIGZvciB0aGUKKyAgLy8vIGdpdmVuIFxwIFZhbHVlIGFuZCBpbnRlZ2VyIFxwIFR5cGUuCisgIGxsdm06OkFQU0ludCBNYWtlSW50VmFsdWUodWludDY0X3QgVmFsdWUsIFF1YWxUeXBlIFR5cGUpIGNvbnN0IHsKKyAgICAvLyBJZiBUeXBlIGlzIGEgc2lnbmVkIGludGVnZXIgdHlwZSBsYXJnZXIgdGhhbiA2NCBiaXRzLCB3ZSBuZWVkIHRvIGJlIHN1cmUKKyAgICAvLyB0byBzaWduIGV4dGVuZCBSZXMgYXBwcm9wcmlhdGVseS4KKyAgICBsbHZtOjpBUFNJbnQgUmVzKDY0LCAhVHlwZS0+aXNTaWduZWRJbnRlZ2VyT3JFbnVtZXJhdGlvblR5cGUoKSk7CisgICAgUmVzID0gVmFsdWU7CisgICAgdW5zaWduZWQgV2lkdGggPSBnZXRJbnRXaWR0aChUeXBlKTsKKyAgICBpZiAoV2lkdGggIT0gUmVzLmdldEJpdFdpZHRoKCkpCisgICAgICByZXR1cm4gUmVzLmV4dE9yVHJ1bmMoV2lkdGgpOworICAgIHJldHVybiBSZXM7CisgIH0KKworICBib29sIGlzU2VudGluZWxOdWxsRXhwcihjb25zdCBFeHByICpFKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIE9iakNJbnRlcmZhY2VEZWNsIFxwIEQsIG9yIG51bGxwdHIgaWYKKyAgLy8vIG5vbmUgZXhpc3RzLgorICBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpnZXRPYmpDSW1wbGVtZW50YXRpb24oT2JqQ0ludGVyZmFjZURlY2wgKkQpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgT2JqQ0NhdGVnb3J5RGVjbCBccCBELCBvciBudWxscHRyIGlmCisgIC8vLyBub25lIGV4aXN0cy4KKyAgT2JqQ0NhdGVnb3J5SW1wbERlY2wgKmdldE9iakNJbXBsZW1lbnRhdGlvbihPYmpDQ2F0ZWdvcnlEZWNsICpEKTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBcQGltcGxlbWVudGF0aW9uIGluIHRoZSBUVS4KKyAgYm9vbCBBbnlPYmpDSW1wbGVtZW50YXRpb24oKSB7CisgICAgcmV0dXJuICFPYmpDSW1wbHMuZW1wdHkoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBPYmpDSW50ZXJmYWNlRGVjbC4KKyAgdm9pZCBzZXRPYmpDSW1wbGVtZW50YXRpb24oT2JqQ0ludGVyZmFjZURlY2wgKklGYWNlRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqSW1wbEQpOworCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBPYmpDQ2F0ZWdvcnlEZWNsLgorICB2b2lkIHNldE9iakNJbXBsZW1lbnRhdGlvbihPYmpDQ2F0ZWdvcnlEZWNsICpDYXRELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDQ2F0ZWdvcnlJbXBsRGVjbCAqSW1wbEQpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBkdXBsaWNhdGUgZGVjbGFyYXRpb24gb2YgYSBPYmpDTWV0aG9kIGluIHRoZSBzYW1lCisgIC8vLyBpbnRlcmZhY2UsIG9yIG51bGwgaWYgbm9uZSBleGlzdHMuCisgIGNvbnN0IE9iakNNZXRob2REZWNsICoKKyAgZ2V0T2JqQ01ldGhvZFJlZGVjbGFyYXRpb24oY29uc3QgT2JqQ01ldGhvZERlY2wgKk1EKSBjb25zdDsKKworICB2b2lkIHNldE9iakNNZXRob2RSZWRlY2xhcmF0aW9uKGNvbnN0IE9iakNNZXRob2REZWNsICpNRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqUmVkZWNsKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0aGF0IFxwIE5EIGJlbG9uZ3MgdG8gaWYgaXQgaXMKKyAgLy8vIGFuIE9iamVjdGl2ZS1DIG1ldGhvZC9wcm9wZXJ0eS9pdmFyIGV0Yy4gdGhhdCBpcyBwYXJ0IG9mIGFuIGludGVyZmFjZSwKKyAgLy8vIG90aGVyd2lzZSByZXR1cm5zIG51bGwuCisgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpnZXRPYmpDb250YWluaW5nSW50ZXJmYWNlKGNvbnN0IE5hbWVkRGVjbCAqTkQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBjb3B5IGluaWFsaXphdGlvbiBleHByZXNzaW9uIG9mIGEgYmxvY2sgdmFyIGRlY2wuCisgIHZvaWQgc2V0QmxvY2tWYXJDb3B5SW5pdHMoVmFyRGVjbCpWRCwgRXhwciogSW5pdCk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGNvcHkgaW5pdGlhbGl6YXRpb24gZXhwcmVzc2lvbiBvZiB0aGUgVmFyRGVjbCBccCBWRCwgb3IKKyAgLy8vIG51bGxwdHIgaWYgbm9uZSBleGlzdHMuCisgIEV4cHIgKmdldEJsb2NrVmFyQ29weUluaXRzKGNvbnN0IFZhckRlY2wqIFZEKTsKKworICAvLy8gXGJyaWVmIEFsbG9jYXRlIGFuIHVuaW5pdGlhbGl6ZWQgVHlwZVNvdXJjZUluZm8uCisgIC8vLworICAvLy8gVGhlIGNhbGxlciBzaG91bGQgaW5pdGlhbGl6ZSB0aGUgbWVtb3J5IGhlbGQgYnkgVHlwZVNvdXJjZUluZm8gdXNpbmcKKyAgLy8vIHRoZSBUeXBlTG9jIHdyYXBwZXJzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUIHRoZSB0eXBlIHRoYXQgd2lsbCBiZSB0aGUgYmFzaXMgZm9yIHR5cGUgc291cmNlIGluZm8uIFRoaXMgdHlwZQorICAvLy8gc2hvdWxkIHJlZmVyIHRvIGhvdyB0aGUgZGVjbGFyYXRvciB3YXMgd3JpdHRlbiBpbiBzb3VyY2UgY29kZSwgbm90IHRvCisgIC8vLyB3aGF0IHR5cGUgc2VtYW50aWMgYW5hbHlzaXMgcmVzb2x2ZWQgdGhlIGRlY2xhcmF0b3IgdG8uCisgIC8vLworICAvLy8gXHBhcmFtIFNpemUgdGhlIHNpemUgb2YgdGhlIHR5cGUgaW5mbyB0byBjcmVhdGUsIG9yIDAgaWYgdGhlIHNpemUKKyAgLy8vIHNob3VsZCBiZSBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSB0eXBlLgorICBUeXBlU291cmNlSW5mbyAqQ3JlYXRlVHlwZVNvdXJjZUluZm8oUXVhbFR5cGUgVCwgdW5zaWduZWQgU2l6ZSA9IDApIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQWxsb2NhdGUgYSBUeXBlU291cmNlSW5mbyB3aGVyZSBhbGwgbG9jYXRpb25zIGhhdmUgYmVlbgorICAvLy8gaW5pdGlhbGl6ZWQgdG8gYSBnaXZlbiBsb2NhdGlvbiwgd2hpY2ggZGVmYXVsdHMgdG8gdGhlIGVtcHR5CisgIC8vLyBsb2NhdGlvbi4KKyAgVHlwZVNvdXJjZUluZm8gKgorICBnZXRUcml2aWFsVHlwZVNvdXJjZUluZm8oUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYyA9IFNvdXJjZUxvY2F0aW9uKCkpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQWRkIGEgZGVhbGxvY2F0aW9uIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlCisgIC8vLyBBU1RDb250ZXh0IGlzIGRlc3Ryb3llZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ2FsbGJhY2sgQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBkZXN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gRGF0YSBQb2ludGVyIGRhdGEgdGhhdCB3aWxsIGJlIHByb3ZpZGVkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorICAvLy8gd2hlbiBpdCBpcyBjYWxsZWQuCisgIHZvaWQgQWRkRGVhbGxvY2F0aW9uKHZvaWQgKCpDYWxsYmFjaykodm9pZCopLCB2b2lkICpEYXRhKTsKKworICAvLy8gSWYgVCBpc24ndCB0cml2aWFsbHkgZGVzdHJ1Y3RpYmxlLCBjYWxscyBBZGREZWFsbG9jYXRpb24gdG8gcmVnaXN0ZXIgaXQKKyAgLy8vIGZvciBkZXN0cnVjdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgYWRkRGVzdHJ1Y3Rpb24oVCAqUHRyKSB7CisgICAgaWYgKCFzdGQ6OmlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGU8VD46OnZhbHVlKSB7CisgICAgICBhdXRvIERlc3Ryb3lQdHIgPSBbXSh2b2lkICpWKSB7IHN0YXRpY19jYXN0PFQgKj4oViktPn5UKCk7IH07CisgICAgICBBZGREZWFsbG9jYXRpb24oRGVzdHJveVB0ciwgUHRyKTsKKyAgICB9CisgIH0KKworICBHVkFMaW5rYWdlIEdldEdWQUxpbmthZ2VGb3JGdW5jdGlvbihjb25zdCBGdW5jdGlvbkRlY2wgKkZEKSBjb25zdDsKKyAgR1ZBTGlua2FnZSBHZXRHVkFMaW5rYWdlRm9yVmFyaWFibGUoY29uc3QgVmFyRGVjbCAqVkQpOworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGUgZGVjbCBjYW4gYmUgQ29kZUdlbidlZCBvciBkZXNlcmlhbGl6ZWQgZnJvbSBQQ0gKKyAgLy8vIGxhemlseSwgb25seSB3aGVuIHVzZWQ7IHRoaXMgaXMgb25seSByZWxldmFudCBmb3IgZnVuY3Rpb24gb3IgZmlsZSBzY29wZWQKKyAgLy8vIHZhciBkZWZpbml0aW9ucy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZSBmdW5jdGlvbi92YXIgbXVzdCBiZSBDb2RlR2VuJ2VkL2Rlc2VyaWFsaXplZCBldmVuIGlmCisgIC8vLyBpdCBpcyBub3QgdXNlZC4KKyAgYm9vbCBEZWNsTXVzdEJlRW1pdHRlZChjb25zdCBEZWNsICpEKTsKKworICAvLy8gXGJyaWVmIFZpc2l0cyBhbGwgdmVyc2lvbnMgb2YgYSBtdWx0aXZlcnNpb25lZCBmdW5jdGlvbiB3aXRoIHRoZSBwYXNzZWQKKyAgLy8vIHByZWRpY2F0ZS4KKyAgdm9pZCBmb3JFYWNoTXVsdGl2ZXJzaW9uZWRGdW5jdGlvblZlcnNpb24oCisgICAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkZELAorICAgICAgbGx2bTo6ZnVuY3Rpb25fcmVmPHZvaWQoY29uc3QgRnVuY3Rpb25EZWNsICopPiBQcmVkKSBjb25zdDsKKworICBjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKgorICBnZXRDb3B5Q29uc3RydWN0b3JGb3JFeGNlcHRpb25PYmplY3QoQ1hYUmVjb3JkRGVjbCAqUkQpOworCisgIHZvaWQgYWRkQ29weUNvbnN0cnVjdG9yRm9yRXhjZXB0aW9uT2JqZWN0KENYWFJlY29yZERlY2wgKlJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhDb25zdHJ1Y3RvckRlY2wgKkNEKTsKKworICB2b2lkIGFkZFR5cGVkZWZOYW1lRm9yVW5uYW1lZFRhZ0RlY2woVGFnRGVjbCAqVEQsIFR5cGVkZWZOYW1lRGVjbCAqVE5EKTsKKworICBUeXBlZGVmTmFtZURlY2wgKmdldFR5cGVkZWZOYW1lRm9yVW5uYW1lZFRhZ0RlY2woY29uc3QgVGFnRGVjbCAqVEQpOworCisgIHZvaWQgYWRkRGVjbGFyYXRvckZvclVubmFtZWRUYWdEZWNsKFRhZ0RlY2wgKlRELCBEZWNsYXJhdG9yRGVjbCAqREQpOworCisgIERlY2xhcmF0b3JEZWNsICpnZXREZWNsYXJhdG9yRm9yVW5uYW1lZFRhZ0RlY2woY29uc3QgVGFnRGVjbCAqVEQpOworCisgIHZvaWQgc2V0TWFuZ2xpbmdOdW1iZXIoY29uc3QgTmFtZWREZWNsICpORCwgdW5zaWduZWQgTnVtYmVyKTsKKyAgdW5zaWduZWQgZ2V0TWFuZ2xpbmdOdW1iZXIoY29uc3QgTmFtZWREZWNsICpORCkgY29uc3Q7CisKKyAgdm9pZCBzZXRTdGF0aWNMb2NhbE51bWJlcihjb25zdCBWYXJEZWNsICpWRCwgdW5zaWduZWQgTnVtYmVyKTsKKyAgdW5zaWduZWQgZ2V0U3RhdGljTG9jYWxOdW1iZXIoY29uc3QgVmFyRGVjbCAqVkQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGNvbnRleHQgZm9yIGNvbXB1dGluZyBtYW5nbGluZyBudW1iZXJzIGluIHRoZSBnaXZlbgorICAvLy8gRGVjbENvbnRleHQuCisgIE1hbmdsZU51bWJlcmluZ0NvbnRleHQgJmdldE1hbmdsaW5nTnVtYmVyQ29udGV4dChjb25zdCBEZWNsQ29udGV4dCAqREMpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxNYW5nbGVOdW1iZXJpbmdDb250ZXh0PiBjcmVhdGVNYW5nbGVOdW1iZXJpbmdDb250ZXh0KCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBVc2VkIGJ5IFBhcm1WYXJEZWNsIHRvIHN0b3JlIG9uIHRoZSBzaWRlIHRoZQorICAvLy8gaW5kZXggb2YgdGhlIHBhcmFtZXRlciB3aGVuIGl0IGV4Y2VlZHMgdGhlIHNpemUgb2YgdGhlIG5vcm1hbCBiaXRmaWVsZC4KKyAgdm9pZCBzZXRQYXJhbWV0ZXJJbmRleChjb25zdCBQYXJtVmFyRGVjbCAqRCwgdW5zaWduZWQgaW5kZXgpOworCisgIC8vLyBcYnJpZWYgVXNlZCBieSBQYXJtVmFyRGVjbCB0byByZXRyaWV2ZSBvbiB0aGUgc2lkZSB0aGUKKyAgLy8vIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgd2hlbiBpdCBleGNlZWRzIHRoZSBzaXplIG9mIHRoZSBub3JtYWwgYml0ZmllbGQuCisgIHVuc2lnbmVkIGdldFBhcmFtZXRlckluZGV4KGNvbnN0IFBhcm1WYXJEZWNsICpEKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgc3RvcmFnZSBmb3IgdGhlIGNvbnN0YW50IHZhbHVlIG9mIGEgbWF0ZXJpYWxpemVkIHRlbXBvcmFyeQorICAvLy8gb2Ygc3RhdGljIHN0b3JhZ2UgZHVyYXRpb24uCisgIEFQVmFsdWUgKmdldE1hdGVyaWFsaXplZFRlbXBvcmFyeVZhbHVlKGNvbnN0IE1hdGVyaWFsaXplVGVtcG9yYXJ5RXhwciAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNYXlDcmVhdGUpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyAgICAgICAgICAgICAgICAgICAgU3RhdGlzdGljcworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgaW1wbGljaXRseS1kZWNsYXJlZCBkZWZhdWx0IGNvbnN0cnVjdG9ycy4KKyAgc3RhdGljIHVuc2lnbmVkIE51bUltcGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yczsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgaW1wbGljaXRseS1kZWNsYXJlZCBkZWZhdWx0IGNvbnN0cnVjdG9ycyBmb3IKKyAgLy8vIHdoaWNoIGRlY2xhcmF0aW9ucyB3ZXJlIGJ1aWx0LgorICBzdGF0aWMgdW5zaWduZWQgTnVtSW1wbGljaXREZWZhdWx0Q29uc3RydWN0b3JzRGVjbGFyZWQ7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGltcGxpY2l0bHktZGVjbGFyZWQgY29weSBjb25zdHJ1Y3RvcnMuCisgIHN0YXRpYyB1bnNpZ25lZCBOdW1JbXBsaWNpdENvcHlDb25zdHJ1Y3RvcnM7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGltcGxpY2l0bHktZGVjbGFyZWQgY29weSBjb25zdHJ1Y3RvcnMgZm9yCisgIC8vLyB3aGljaCBkZWNsYXJhdGlvbnMgd2VyZSBidWlsdC4KKyAgc3RhdGljIHVuc2lnbmVkIE51bUltcGxpY2l0Q29weUNvbnN0cnVjdG9yc0RlY2xhcmVkOworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBpbXBsaWNpdGx5LWRlY2xhcmVkIG1vdmUgY29uc3RydWN0b3JzLgorICBzdGF0aWMgdW5zaWduZWQgTnVtSW1wbGljaXRNb3ZlQ29uc3RydWN0b3JzOworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBpbXBsaWNpdGx5LWRlY2xhcmVkIG1vdmUgY29uc3RydWN0b3JzIGZvcgorICAvLy8gd2hpY2ggZGVjbGFyYXRpb25zIHdlcmUgYnVpbHQuCisgIHN0YXRpYyB1bnNpZ25lZCBOdW1JbXBsaWNpdE1vdmVDb25zdHJ1Y3RvcnNEZWNsYXJlZDsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgaW1wbGljaXRseS1kZWNsYXJlZCBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3JzLgorICBzdGF0aWMgdW5zaWduZWQgTnVtSW1wbGljaXRDb3B5QXNzaWdubWVudE9wZXJhdG9yczsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgaW1wbGljaXRseS1kZWNsYXJlZCBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3JzIGZvcgorICAvLy8gd2hpY2ggZGVjbGFyYXRpb25zIHdlcmUgYnVpbHQuCisgIHN0YXRpYyB1bnNpZ25lZCBOdW1JbXBsaWNpdENvcHlBc3NpZ25tZW50T3BlcmF0b3JzRGVjbGFyZWQ7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGltcGxpY2l0bHktZGVjbGFyZWQgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9ycy4KKyAgc3RhdGljIHVuc2lnbmVkIE51bUltcGxpY2l0TW92ZUFzc2lnbm1lbnRPcGVyYXRvcnM7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGltcGxpY2l0bHktZGVjbGFyZWQgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9ycyBmb3IKKyAgLy8vIHdoaWNoIGRlY2xhcmF0aW9ucyB3ZXJlIGJ1aWx0LgorICBzdGF0aWMgdW5zaWduZWQgTnVtSW1wbGljaXRNb3ZlQXNzaWdubWVudE9wZXJhdG9yc0RlY2xhcmVkOworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBpbXBsaWNpdGx5LWRlY2xhcmVkIGRlc3RydWN0b3JzLgorICBzdGF0aWMgdW5zaWduZWQgTnVtSW1wbGljaXREZXN0cnVjdG9yczsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgaW1wbGljaXRseS1kZWNsYXJlZCBkZXN0cnVjdG9ycyBmb3Igd2hpY2gKKyAgLy8vIGRlY2xhcmF0aW9ucyB3ZXJlIGJ1aWx0LgorICBzdGF0aWMgdW5zaWduZWQgTnVtSW1wbGljaXREZXN0cnVjdG9yc0RlY2xhcmVkOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgSW5pdGlhbGl6ZSBidWlsdC1pbiB0eXBlcy4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgbWF5IG9ubHkgYmUgaW52b2tlZCBvbmNlIGZvciBhIGdpdmVuIEFTVENvbnRleHQgb2JqZWN0LgorICAvLy8gSXQgaXMgbm9ybWFsbHkgaW52b2tlZCBhZnRlciBBU1RDb250ZXh0IGNvbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gVGFyZ2V0IFRoZSB0YXJnZXQKKyAgdm9pZCBJbml0QnVpbHRpblR5cGVzKGNvbnN0IFRhcmdldEluZm8gJlRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluZm8gKkF1eFRhcmdldCA9IG51bGxwdHIpOworCitwcml2YXRlOgorICB2b2lkIEluaXRCdWlsdGluVHlwZShDYW5RdWFsVHlwZSAmUiwgQnVpbHRpblR5cGU6OktpbmQgSyk7CisKKyAgLy8gUmV0dXJuIHRoZSBPYmplY3RpdmUtQyB0eXBlIGVuY29kaW5nIGZvciBhIGdpdmVuIHR5cGUuCisgIHZvaWQgZ2V0T2JqQ0VuY29kaW5nRm9yVHlwZUltcGwoUXVhbFR5cGUgdCwgc3RkOjpzdHJpbmcgJlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHBhbmRQb2ludGVkVG9TdHJ1Y3R1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhwYW5kU3RydWN0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlY2wgKkZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT3V0ZXJtb3N0VHlwZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRW5jb2RpbmdQcm9wZXJ0eSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3RydWN0RmllbGQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEVuY29kZUJsb2NrUGFyYW1ldGVycyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRW5jb2RlQ2xhc3NOYW1lcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRW5jb2RlUG9pbnRlclRvT2JqQ1R5cGVkZWYgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSAqTm90RW5jb2RlZFQ9bnVsbHB0cikgY29uc3Q7CisKKyAgLy8gQWRkcyB0aGUgZW5jb2Rpbmcgb2YgdGhlIHN0cnVjdHVyZSdzIG1lbWJlcnMuCisgIHZvaWQgZ2V0T2JqQ0VuY29kaW5nRm9yU3RydWN0dXJlSW1wbChSZWNvcmREZWNsICpSRCwgc3RkOjpzdHJpbmcgJlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlY2wgKkZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlVkJhc2VzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlICpOb3RFbmNvZGVkVD1udWxscHRyKSBjb25zdDsKKworcHVibGljOgorICAvLyBBZGRzIHRoZSBlbmNvZGluZyBvZiBhIG1ldGhvZCBwYXJhbWV0ZXIgb3IgcmV0dXJuIHR5cGUuCisgIHZvaWQgZ2V0T2JqQ0VuY29kaW5nRm9yTWV0aG9kUGFyYW1ldGVyKERlY2w6Ok9iakNEZWNsUXVhbGlmaWVyIFFULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULCBzdGQ6OnN0cmluZyYgUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHRlbmRlZCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhbiBpbmxpbmUtaW5pdGlhbGl6ZWQgc3RhdGljIGRhdGEgbWVtYmVyCisgIC8vLyB3aGljaCBpcyB0cmVhdGVkIGFzIGEgZGVmaW5pdGlvbiBmb3IgTVNWQyBjb21wYXRpYmlsaXR5LgorICBib29sIGlzTVNTdGF0aWNEYXRhTWVtYmVySW5saW5lRGVmaW5pdGlvbihjb25zdCBWYXJEZWNsICpWRCkgY29uc3Q7CisKKyAgZW51bSBjbGFzcyBJbmxpbmVWYXJpYWJsZURlZmluaXRpb25LaW5kIHsKKyAgICAvLy8gTm90IGFuIGlubGluZSB2YXJpYWJsZS4KKyAgICBOb25lLAorCisgICAgLy8vIFdlYWsgZGVmaW5pdGlvbiBvZiBpbmxpbmUgdmFyaWFibGUuCisgICAgV2VhaywKKworICAgIC8vLyBXZWFrIGZvciBub3csIG1pZ2h0IGJlY29tZSBzdHJvbmcgbGF0ZXIgaW4gdGhpcyBUVS4KKyAgICBXZWFrVW5rbm93biwKKworICAgIC8vLyBTdHJvbmcgZGVmaW5pdGlvbi4KKyAgICBTdHJvbmcKKyAgfTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIGEgZGVmaW5pdGlvbiBvZiB0aGlzIGlubGluZSB2YXJpYWJsZSBzaG91bGQKKyAgLy8vIGJlIHRyZWF0ZWQgYXMgYSB3ZWFrIG9yIHN0cm9uZyBkZWZpbml0aW9uLiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoCisgIC8vLyBDKysxNCBhbmQgYmVmb3JlLCBmb3IgYSBjb25zdGV4cHIgc3RhdGljIGRhdGEgbWVtYmVyLCBpZiB0aGVyZSBpcyBhbgorICAvLy8gb3V0LW9mLWxpbmUgZGVjbGFyYXRpb24gb2YgdGhlIG1lbWJlciwgd2UgbWF5IHByb21vdGUgaXQgZnJvbSB3ZWFrIHRvCisgIC8vLyBzdHJvbmcuCisgIElubGluZVZhcmlhYmxlRGVmaW5pdGlvbktpbmQKKyAgZ2V0SW5saW5lVmFyaWFibGVEZWZpbml0aW9uS2luZChjb25zdCBWYXJEZWNsICpWRCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBEZWNsYXJhdGlvbk5hbWVUYWJsZTsKKyAgZnJpZW5kIGNsYXNzIERlY2xDb250ZXh0OworCisgIGNvbnN0IEFTVFJlY29yZExheW91dCAmCisgIGdldE9iakNMYXlvdXQoY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKkQsCisgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqSW1wbCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBBIHNldCBvZiBkZWFsbG9jYXRpb25zIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCB3aGVuIHRoZQorICAvLy8gQVNUQ29udGV4dCBpcyBkZXN0cm95ZWQuCisgIC8vIEZJWE1FOiBXZSByZWFsbHkgc2hvdWxkIGhhdmUgYSBiZXR0ZXIgbWVjaGFuaXNtIGluIHRoZSBBU1RDb250ZXh0IHRvCisgIC8vIG1hbmFnZSBydW5uaW5nIGRlc3RydWN0b3JzIGZvciB0eXBlcyB3aGljaCBkbyB2YXJpYWJsZSBzaXplZCBhbGxvY2F0aW9uCisgIC8vIHdpdGhpbiB0aGUgQVNULiBJbiBzb21lIHBsYWNlcyB3ZSB0aHJlYWQgdGhlIEFTVCBidW1wIHBvaW50ZXIgYWxsb2NhdG9yCisgIC8vIGludG8gdGhlIGRhdGFzdHJ1Y3R1cmVzIHdoaWNoIGF2b2lkcyB0aGlzIG1lc3MgZHVyaW5nIGRlYWxsb2NhdGlvbiBidXQgaXMKKyAgLy8gd2FzdGVmdWwgb2YgbWVtb3J5LCBhbmQgaGVyZSB3ZSByZXF1aXJlIGEgbG90IG9mIGVycm9yIHByb25lIGJvb2sga2VlcGluZworICAvLyBpbiBvcmRlciB0byB0cmFjayBhbmQgcnVuIGRlc3RydWN0b3JzIHdoaWxlIHdlJ3JlIHRlYXJpbmcgdGhpbmdzIGRvd24uCisgIHVzaW5nIERlYWxsb2NhdGlvbkZ1bmN0aW9uc0FuZEFyZ3VtZW50cyA9CisgICAgICBsbHZtOjpTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dm9pZCAoKikodm9pZCAqKSwgdm9pZCAqPiwgMTY+OworICBEZWFsbG9jYXRpb25GdW5jdGlvbnNBbmRBcmd1bWVudHMgRGVhbGxvY2F0aW9uczsKKworICAvLyBGSVhNRTogVGhpcyBjdXJyZW50bHkgY29udGFpbnMgdGhlIHNldCBvZiBTdG9yZWREZWNsTWFwcyB1c2VkCisgIC8vIGJ5IERlY2xDb250ZXh0IG9iamVjdHMuICBUaGlzIHByb2JhYmx5IHNob3VsZCBub3QgYmUgaW4gQVNUQ29udGV4dCwKKyAgLy8gYnV0IHdlIGluY2x1ZGUgaXQgaGVyZSBzbyB0aGF0IEFTVENvbnRleHQgY2FuIHF1aWNrbHkgZGVhbGxvY2F0ZSB0aGVtLgorICBsbHZtOjpQb2ludGVySW50UGFpcjxTdG9yZWREZWNsc01hcCAqLCAxPiBMYXN0U0RNOworCisgIHN0ZDo6dW5pcXVlX3B0cjxQYXJlbnRNYXBQb2ludGVycz4gUG9pbnRlclBhcmVudHM7CisgIHN0ZDo6dW5pcXVlX3B0cjxQYXJlbnRNYXBPdGhlck5vZGVzPiBPdGhlclBhcmVudHM7CisKKyAgc3RkOjp1bmlxdWVfcHRyPFZUYWJsZUNvbnRleHRCYXNlPiBWVENvbnRleHQ7CisKKyAgdm9pZCBSZWxlYXNlRGVjbENvbnRleHRNYXBzKCk7CisgIHZvaWQgUmVsZWFzZVBhcmVudE1hcEVudHJpZXMoKTsKKworcHVibGljOgorICBlbnVtIFByYWdtYVNlY3Rpb25GbGFnIDogdW5zaWduZWQgeworICAgIFBTRl9Ob25lID0gMCwKKyAgICBQU0ZfUmVhZCA9IDB4MSwKKyAgICBQU0ZfV3JpdGUgPSAweDIsCisgICAgUFNGX0V4ZWN1dGUgPSAweDQsCisgICAgUFNGX0ltcGxpY2l0ID0gMHg4LAorICAgIFBTRl9JbnZhbGlkID0gMHg4MDAwMDAwMFUsCisgIH07CisKKyAgc3RydWN0IFNlY3Rpb25JbmZvIHsKKyAgICBEZWNsYXJhdG9yRGVjbCAqRGVjbDsKKyAgICBTb3VyY2VMb2NhdGlvbiBQcmFnbWFTZWN0aW9uTG9jYXRpb247CisgICAgaW50IFNlY3Rpb25GbGFnczsKKworICAgIFNlY3Rpb25JbmZvKCkgPSBkZWZhdWx0OworICAgIFNlY3Rpb25JbmZvKERlY2xhcmF0b3JEZWNsICpEZWNsLAorICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFByYWdtYVNlY3Rpb25Mb2NhdGlvbiwKKyAgICAgICAgICAgICAgICBpbnQgU2VjdGlvbkZsYWdzKQorICAgICAgICA6IERlY2woRGVjbCksIFByYWdtYVNlY3Rpb25Mb2NhdGlvbihQcmFnbWFTZWN0aW9uTG9jYXRpb24pLAorICAgICAgICAgIFNlY3Rpb25GbGFncyhTZWN0aW9uRmxhZ3MpIHt9CisgIH07CisKKyAgbGx2bTo6U3RyaW5nTWFwPFNlY3Rpb25JbmZvPiBTZWN0aW9uSW5mb3M7Cit9OworCisvLy8gXGJyaWVmIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGNvbnN0cnVjdGluZyBhIG51bGxhcnkgc2VsZWN0b3IuCitpbmxpbmUgU2VsZWN0b3IgR2V0TnVsbGFyeVNlbGVjdG9yKFN0cmluZ1JlZiBuYW1lLCBBU1RDb250ZXh0ICZDdHgpIHsKKyAgSWRlbnRpZmllckluZm8qIElJID0gJkN0eC5JZGVudHMuZ2V0KG5hbWUpOworICByZXR1cm4gQ3R4LlNlbGVjdG9ycy5nZXRTZWxlY3RvcigwLCAmSUkpOworfQorCisvLy8gXGJyaWVmIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGNvbnN0cnVjdGluZyBhbiB1bmFyeSBzZWxlY3Rvci4KK2lubGluZSBTZWxlY3RvciBHZXRVbmFyeVNlbGVjdG9yKFN0cmluZ1JlZiBuYW1lLCBBU1RDb250ZXh0ICZDdHgpIHsKKyAgSWRlbnRpZmllckluZm8qIElJID0gJkN0eC5JZGVudHMuZ2V0KG5hbWUpOworICByZXR1cm4gQ3R4LlNlbGVjdG9ycy5nZXRTZWxlY3RvcigxLCAmSUkpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisvLyBvcGVyYXRvciBuZXcgYW5kIGRlbGV0ZSBhcmVuJ3QgYWxsb3dlZCBpbnNpZGUgbmFtZXNwYWNlcy4KKworLy8vIEBicmllZiBQbGFjZW1lbnQgbmV3IGZvciB1c2luZyB0aGUgQVNUQ29udGV4dCdzIGFsbG9jYXRvci4KKy8vLworLy8vIFRoaXMgcGxhY2VtZW50IGZvcm0gb2Ygb3BlcmF0b3IgbmV3IHVzZXMgdGhlIEFTVENvbnRleHQncyBhbGxvY2F0b3IgZm9yCisvLy8gb2J0YWluaW5nIG1lbW9yeS4KKy8vLworLy8vIElNUE9SVEFOVDogVGhlc2UgYXJlIGFsc28gZGVjbGFyZWQgaW4gY2xhbmcvQVNUL0F0dHJJdGVyYXRvci5oISBBbnkgY2hhbmdlcworLy8vIGhlcmUgbmVlZCB0byBhbHNvIGJlIG1hZGUgdGhlcmUuCisvLy8KKy8vLyBXZSBpbnRlbnRpb25hbGx5IGF2b2lkIHVzaW5nIGEgbm90aHJvdyBzcGVjaWZpY2F0aW9uIGhlcmUgc28gdGhhdCB0aGUgY2FsbHMKKy8vLyB0byB0aGlzIG9wZXJhdG9yIHdpbGwgbm90IHBlcmZvcm0gYSBudWxsIGNoZWNrIG9uIHRoZSByZXN1bHQgLS0gdGhlCisvLy8gdW5kZXJseWluZyBhbGxvY2F0b3IgbmV2ZXIgcmV0dXJucyBudWxsIHBvaW50ZXJzLgorLy8vCisvLy8gVXNhZ2UgbG9va3MgbGlrZSB0aGlzIChhc3N1bWluZyB0aGVyZSdzIGFuIEFTVENvbnRleHQgJ0NvbnRleHQnIGluIHNjb3BlKToKKy8vLyBAY29kZQorLy8vIC8vIERlZmF1bHQgYWxpZ25tZW50ICg4KQorLy8vIEludGVnZXJMaXRlcmFsICpFeCA9IG5ldyAoQ29udGV4dCkgSW50ZWdlckxpdGVyYWwoYXJndW1lbnRzKTsKKy8vLyAvLyBTcGVjaWZpYyBhbGlnbm1lbnQKKy8vLyBJbnRlZ2VyTGl0ZXJhbCAqRXgyID0gbmV3IChDb250ZXh0LCA0KSBJbnRlZ2VyTGl0ZXJhbChhcmd1bWVudHMpOworLy8vIEBlbmRjb2RlCisvLy8gTWVtb3J5IGFsbG9jYXRlZCB0aHJvdWdoIHRoaXMgcGxhY2VtZW50IG5ldyBvcGVyYXRvciBkb2VzIG5vdCBuZWVkIHRvIGJlCisvLy8gZXhwbGljaXRseSBmcmVlZCwgYXMgQVNUQ29udGV4dCB3aWxsIGZyZWUgYWxsIG9mIHRoaXMgbWVtb3J5IHdoZW4gaXQgZ2V0cworLy8vIGRlc3Ryb3llZC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgY2Fubm90IHVzZSBkZWxldGUgb24gdGhlIHBvaW50ZXIuCisvLy8KKy8vLyBAcGFyYW0gQnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZS4gQ2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIuCisvLy8gQHBhcmFtIEMgVGhlIEFTVENvbnRleHQgdGhhdCBwcm92aWRlcyB0aGUgYWxsb2NhdG9yLgorLy8vIEBwYXJhbSBBbGlnbm1lbnQgVGhlIGFsaWdubWVudCBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSAoaWYgdGhlIHVuZGVybHlpbmcKKy8vLyAgICAgICAgICAgICAgICAgIGFsbG9jYXRvciBzdXBwb3J0cyBpdCkuCisvLy8gQHJldHVybiBUaGUgYWxsb2NhdGVkIG1lbW9yeS4gQ291bGQgYmUgbnVsbHB0ci4KK2lubGluZSB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IEJ5dGVzLCBjb25zdCBjbGFuZzo6QVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEFsaWdubWVudCkgeworICByZXR1cm4gQy5BbGxvY2F0ZShCeXRlcywgQWxpZ25tZW50KTsKK30KKworLy8vIEBicmllZiBQbGFjZW1lbnQgZGVsZXRlIGNvbXBhbmlvbiB0byB0aGUgbmV3IGFib3ZlLgorLy8vCisvLy8gVGhpcyBvcGVyYXRvciBpcyBqdXN0IGEgY29tcGFuaW9uIHRvIHRoZSBuZXcgYWJvdmUuIFRoZXJlIGlzIG5vIHdheSBvZgorLy8vIGludm9raW5nIGl0IGRpcmVjdGx5OyBzZWUgdGhlIG5ldyBvcGVyYXRvciBmb3IgbW9yZSBkZXRhaWxzLiBUaGlzIG9wZXJhdG9yCisvLy8gaXMgY2FsbGVkIGltcGxpY2l0bHkgYnkgdGhlIGNvbXBpbGVyIGlmIGEgcGxhY2VtZW50IG5ldyBleHByZXNzaW9uIHVzaW5nCisvLy8gdGhlIEFTVENvbnRleHQgdGhyb3dzIGluIHRoZSBvYmplY3QgY29uc3RydWN0b3IuCitpbmxpbmUgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqUHRyLCBjb25zdCBjbGFuZzo6QVNUQ29udGV4dCAmQywgc2l6ZV90KSB7CisgIEMuRGVhbGxvY2F0ZShQdHIpOworfQorCisvLy8gVGhpcyBwbGFjZW1lbnQgZm9ybSBvZiBvcGVyYXRvciBuZXdbXSB1c2VzIHRoZSBBU1RDb250ZXh0J3MgYWxsb2NhdG9yIGZvcgorLy8vIG9idGFpbmluZyBtZW1vcnkuCisvLy8KKy8vLyBXZSBpbnRlbnRpb25hbGx5IGF2b2lkIHVzaW5nIGEgbm90aHJvdyBzcGVjaWZpY2F0aW9uIGhlcmUgc28gdGhhdCB0aGUgY2FsbHMKKy8vLyB0byB0aGlzIG9wZXJhdG9yIHdpbGwgbm90IHBlcmZvcm0gYSBudWxsIGNoZWNrIG9uIHRoZSByZXN1bHQgLS0gdGhlCisvLy8gdW5kZXJseWluZyBhbGxvY2F0b3IgbmV2ZXIgcmV0dXJucyBudWxsIHBvaW50ZXJzLgorLy8vCisvLy8gVXNhZ2UgbG9va3MgbGlrZSB0aGlzIChhc3N1bWluZyB0aGVyZSdzIGFuIEFTVENvbnRleHQgJ0NvbnRleHQnIGluIHNjb3BlKToKKy8vLyBAY29kZQorLy8vIC8vIERlZmF1bHQgYWxpZ25tZW50ICg4KQorLy8vIGNoYXIgKmRhdGEgPSBuZXcgKENvbnRleHQpIGNoYXJbMTBdOworLy8vIC8vIFNwZWNpZmljIGFsaWdubWVudAorLy8vIGNoYXIgKmRhdGEgPSBuZXcgKENvbnRleHQsIDQpIGNoYXJbMTBdOworLy8vIEBlbmRjb2RlCisvLy8gTWVtb3J5IGFsbG9jYXRlZCB0aHJvdWdoIHRoaXMgcGxhY2VtZW50IG5ld1tdIG9wZXJhdG9yIGRvZXMgbm90IG5lZWQgdG8gYmUKKy8vLyBleHBsaWNpdGx5IGZyZWVkLCBhcyBBU1RDb250ZXh0IHdpbGwgZnJlZSBhbGwgb2YgdGhpcyBtZW1vcnkgd2hlbiBpdCBnZXRzCisvLy8gZGVzdHJveWVkLiBQbGVhc2Ugbm90ZSB0aGF0IHlvdSBjYW5ub3QgdXNlIGRlbGV0ZSBvbiB0aGUgcG9pbnRlci4KKy8vLworLy8vIEBwYXJhbSBCeXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlLiBDYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlci4KKy8vLyBAcGFyYW0gQyBUaGUgQVNUQ29udGV4dCB0aGF0IHByb3ZpZGVzIHRoZSBhbGxvY2F0b3IuCisvLy8gQHBhcmFtIEFsaWdubWVudCBUaGUgYWxpZ25tZW50IG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IChpZiB0aGUgdW5kZXJseWluZworLy8vICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yIHN1cHBvcnRzIGl0KS4KKy8vLyBAcmV0dXJuIFRoZSBhbGxvY2F0ZWQgbWVtb3J5LiBDb3VsZCBiZSBudWxscHRyLgoraW5saW5lIHZvaWQgKm9wZXJhdG9yIG5ld1tdKHNpemVfdCBCeXRlcywgY29uc3QgY2xhbmc6OkFTVENvbnRleHQmIEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEFsaWdubWVudCA9IDgpIHsKKyAgcmV0dXJuIEMuQWxsb2NhdGUoQnl0ZXMsIEFsaWdubWVudCk7Cit9CisKKy8vLyBAYnJpZWYgUGxhY2VtZW50IGRlbGV0ZVtdIGNvbXBhbmlvbiB0byB0aGUgbmV3W10gYWJvdmUuCisvLy8KKy8vLyBUaGlzIG9wZXJhdG9yIGlzIGp1c3QgYSBjb21wYW5pb24gdG8gdGhlIG5ld1tdIGFib3ZlLiBUaGVyZSBpcyBubyB3YXkgb2YKKy8vLyBpbnZva2luZyBpdCBkaXJlY3RseTsgc2VlIHRoZSBuZXdbXSBvcGVyYXRvciBmb3IgbW9yZSBkZXRhaWxzLiBUaGlzIG9wZXJhdG9yCisvLy8gaXMgY2FsbGVkIGltcGxpY2l0bHkgYnkgdGhlIGNvbXBpbGVyIGlmIGEgcGxhY2VtZW50IG5ld1tdIGV4cHJlc3Npb24gdXNpbmcKKy8vLyB0aGUgQVNUQ29udGV4dCB0aHJvd3MgaW4gdGhlIG9iamVjdCBjb25zdHJ1Y3Rvci4KK2lubGluZSB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQgKlB0ciwgY29uc3QgY2xhbmc6OkFTVENvbnRleHQgJkMsIHNpemVfdCkgeworICBDLkRlYWxsb2NhdGUoUHRyKTsKK30KKworLy8vIFxicmllZiBDcmVhdGUgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGEgTGF6eUdlbmVyYXRpb25hbFVwZGF0ZVB0ci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBPd25lciwgdHlwZW5hbWUgVCwKKyAgICAgICAgICB2b2lkIChjbGFuZzo6RXh0ZXJuYWxBU1RTb3VyY2U6OipVcGRhdGUpKE93bmVyKT4KK3R5cGVuYW1lIGNsYW5nOjpMYXp5R2VuZXJhdGlvbmFsVXBkYXRlUHRyPE93bmVyLCBULCBVcGRhdGU+OjpWYWx1ZVR5cGUKKyAgICBjbGFuZzo6TGF6eUdlbmVyYXRpb25hbFVwZGF0ZVB0cjxPd25lciwgVCwgVXBkYXRlPjo6bWFrZVZhbHVlKAorICAgICAgICBjb25zdCBjbGFuZzo6QVNUQ29udGV4dCAmQ3R4LCBUIFZhbHVlKSB7CisgIC8vIE5vdGUsIHRoaXMgaXMgaW1wbGVtZW50ZWQgaGVyZSBzbyB0aGF0IEV4dGVybmFsQVNUU291cmNlLmggZG9lc24ndCBuZWVkIHRvCisgIC8vIGluY2x1ZGUgQVNUQ29udGV4dC5oLiBXZSBleHBsaWNpdGx5IGluc3RhbnRpYXRlIGl0IGZvciBhbGwgcmVsZXZhbnQgdHlwZXMKKyAgLy8gaW4gQVNUQ29udGV4dC5jcHAuCisgIGlmIChhdXRvICpTb3VyY2UgPSBDdHguZ2V0RXh0ZXJuYWxTb3VyY2UoKSkKKyAgICByZXR1cm4gbmV3IChDdHgpIExhenlEYXRhKFNvdXJjZSwgVmFsdWUpOworICByZXR1cm4gVmFsdWU7Cit9CisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9BU1RDT05URVhUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BU1REaWFnbm9zdGljLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQVNURGlhZ25vc3RpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3Yzg1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQVNURGlhZ25vc3RpYy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vPT09LS0tIEFTVERpYWdub3N0aWMuaCAtIERpYWdub3N0aWNzIGZvciB0aGUgQVNUIGxpYnJhcnkgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfQVNURElBR05PU1RJQ19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX0FTVERJQUdOT1NUSUNfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworICBuYW1lc3BhY2UgZGlhZyB7CisgICAgZW51bSB7CisjZGVmaW5lIERJQUcoRU5VTSxGTEFHUyxERUZBVUxUX01BUFBJTkcsREVTQyxHUk9VUCxcCisgICAgICAgICAgICAgU0ZJTkFFLE5PV0VSUk9SLFNIT1dJTlNZU0hFQURFUixDQVRFR09SWSkgRU5VTSwKKyNkZWZpbmUgQVNUU1RBUlQKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljQVNUS2luZHMuaW5jIgorI3VuZGVmIERJQUcKKyAgICAgIE5VTV9CVUlMVElOX0FTVF9ESUFHTk9TVElDUworICAgIH07CisgIH0gIC8vIGVuZCBuYW1lc3BhY2UgZGlhZworICAKKyAgLy8vIFxicmllZiBEaWFnbm9zdGljc0VuZ2luZSBhcmd1bWVudCBmb3JtYXR0aW5nIGZ1bmN0aW9uIGZvciBkaWFnbm9zdGljcyB0aGF0CisgIC8vLyBpbnZvbHZlIEFTVCBub2Rlcy4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGZvcm1hdHMgZGlhZ25vc3RpYyBhcmd1bWVudHMgZm9yIHZhcmlvdXMgQVNUIG5vZGVzLCAKKyAgLy8vIGluY2x1ZGluZyB0eXBlcywgZGVjbGFyYXRpb24gbmFtZXMsIG5lc3RlZCBuYW1lIHNwZWNpZmllcnMsIGFuZAorICAvLy8gZGVjbGFyYXRpb24gY29udGV4dHMsIGludG8gc3RyaW5ncyB0aGF0IGNhbiBiZSBwcmludGVkIGFzIHBhcnQgb2YKKyAgLy8vIGRpYWdub3N0aWNzLiBJdCBpcyBtZWFudCB0byBiZSB1c2VkIGFzIHRoZSBhcmd1bWVudCB0bworICAvLy8gXGMgRGlhZ25vc3RpY3NFbmdpbmU6OlNldEFyZ1RvU3RyaW5nRm4oKSwgd2hlcmUgdGhlIGNvb2tpZSBpcyBhbiBcYworICAvLy8gQVNUQ29udGV4dCBwb2ludGVyLgorICB2b2lkIEZvcm1hdEFTVE5vZGVEaWFnbm9zdGljQXJndW1lbnQoCisgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6QXJndW1lbnRLaW5kIEtpbmQsCisgICAgICBpbnRwdHJfdCBWYWwsCisgICAgICBTdHJpbmdSZWYgTW9kaWZpZXIsCisgICAgICBTdHJpbmdSZWYgQXJndW1lbnQsCisgICAgICBBcnJheVJlZjxEaWFnbm9zdGljc0VuZ2luZTo6QXJndW1lbnRWYWx1ZT4gUHJldkFyZ3MsCisgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk91dHB1dCwKKyAgICAgIHZvaWQgKkNvb2tpZSwKKyAgICAgIEFycmF5UmVmPGludHB0cl90PiBRdWFsVHlwZVZhbHMpOworfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BU1RGd2QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BU1RGd2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDNkNDg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0FTVEZ3ZC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vPT09LS0tIEFTVEZ3ZC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGFsbCBBU1Qgbm9kZSB0eXBlcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9BU1RGV0RfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9BU1RGV0RfSAorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBEZWNsOworI2RlZmluZSBERUNMKERFUklWRUQsIEJBU0UpIGNsYXNzIERFUklWRUQjI0RlY2w7CisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xOb2Rlcy5pbmMiCitjbGFzcyBTdG10OworI2RlZmluZSBTVE1UKERFUklWRUQsIEJBU0UpIGNsYXNzIERFUklWRUQ7CisjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXROb2Rlcy5pbmMiCitjbGFzcyBUeXBlOworI2RlZmluZSBUWVBFKERFUklWRUQsIEJBU0UpIGNsYXNzIERFUklWRUQjI1R5cGU7CisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGVOb2Rlcy5kZWYiCitjbGFzcyBDWFhDdG9ySW5pdGlhbGl6ZXI7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BU1RJbXBvcnRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0FTVEltcG9ydGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZiOWNkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BU1RJbXBvcnRlci5oCkBAIC0wLDAgKzEsMzE3IEBACisvLz09PS0tLSBBU1RJbXBvcnRlci5oIC0gSW1wb3J0aW5nIEFTVHMgZnJvbSBvdGhlciBDb250ZXh0cyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQVNUSW1wb3J0ZXIgY2xhc3Mgd2hpY2ggaW1wb3J0cyBBU1Qgbm9kZXMgZnJvbSBvbmUKKy8vICBjb250ZXh0IGludG8gYW5vdGhlciBjb250ZXh0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0FTVElNUE9SVEVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfQVNUSU1QT1JURVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xhcmF0aW9uTmFtZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgY2xhc3MgQVNUQ29udGV4dDsKKyAgY2xhc3MgQ1hYQ3RvckluaXRpYWxpemVyOworICBjbGFzcyBDWFhCYXNlU3BlY2lmaWVyOworICBjbGFzcyBEZWNsOworICBjbGFzcyBEZWNsQ29udGV4dDsKKyAgY2xhc3MgRGlhZ25vc3RpY3NFbmdpbmU7CisgIGNsYXNzIEV4cHI7CisgIGNsYXNzIEZpbGVNYW5hZ2VyOworICBjbGFzcyBJZGVudGlmaWVySW5mbzsKKyAgY2xhc3MgTmVzdGVkTmFtZVNwZWNpZmllcjsKKyAgY2xhc3MgU3RtdDsKKyAgY2xhc3MgVHlwZVNvdXJjZUluZm87CisgIAorICAvLy8gXGJyaWVmIEltcG9ydHMgc2VsZWN0ZWQgbm9kZXMgZnJvbSBvbmUgQVNUIGNvbnRleHQgaW50byBhbm90aGVyIGNvbnRleHQsCisgIC8vLyBtZXJnaW5nIEFTVCBub2RlcyB3aGVyZSBhcHByb3ByaWF0ZS4KKyAgY2xhc3MgQVNUSW1wb3J0ZXIgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBsbHZtOjpEZW5zZVNldDxzdGQ6OnBhaXI8RGVjbCAqLCBEZWNsICo+ID4gTm9uRXF1aXZhbGVudERlY2xTZXQ7CisgICAgdHlwZWRlZiBsbHZtOjpEZW5zZU1hcDxjb25zdCBDWFhCYXNlU3BlY2lmaWVyICosIENYWEJhc2VTcGVjaWZpZXIgKj4KKyAgICBJbXBvcnRlZENYWEJhc2VTcGVjaWZpZXJNYXA7CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gXGJyaWVmIFRoZSBjb250ZXh0cyB3ZSdyZSBpbXBvcnRpbmcgdG8gYW5kIGZyb20uCisgICAgQVNUQ29udGV4dCAmVG9Db250ZXh0LCAmRnJvbUNvbnRleHQ7CisgICAgCisgICAgLy8vIFxicmllZiBUaGUgZmlsZSBtYW5hZ2VycyB3ZSdyZSBpbXBvcnRpbmcgdG8gYW5kIGZyb20uCisgICAgRmlsZU1hbmFnZXIgJlRvRmlsZU1hbmFnZXIsICZGcm9tRmlsZU1hbmFnZXI7CisKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdG8gcGVyZm9ybSBhIG1pbmltYWwgaW1wb3J0LgorICAgIGJvb2wgTWluaW1hbDsKKworICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgbGFzdCBkaWFnbm9zdGljIGNhbWUgZnJvbSB0aGUgImZyb20iIGNvbnRleHQuCisgICAgYm9vbCBMYXN0RGlhZ0Zyb21Gcm9tOworICAgIAorICAgIC8vLyBcYnJpZWYgTWFwcGluZyBmcm9tIHRoZSBhbHJlYWR5LWltcG9ydGVkIHR5cGVzIGluIHRoZSAiZnJvbSIgY29udGV4dAorICAgIC8vLyB0byB0aGUgY29ycmVzcG9uZGluZyB0eXBlcyBpbiB0aGUgInRvIiBjb250ZXh0LgorICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IFR5cGUgKiwgY29uc3QgVHlwZSAqPiBJbXBvcnRlZFR5cGVzOworICAgIAorICAgIC8vLyBcYnJpZWYgTWFwcGluZyBmcm9tIHRoZSBhbHJlYWR5LWltcG9ydGVkIGRlY2xhcmF0aW9ucyBpbiB0aGUgImZyb20iCisgICAgLy8vIGNvbnRleHQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGVjbGFyYXRpb25zIGluIHRoZSAidG8iIGNvbnRleHQuCisgICAgbGx2bTo6RGVuc2VNYXA8RGVjbCAqLCBEZWNsICo+IEltcG9ydGVkRGVjbHM7CisKKyAgICAvLy8gXGJyaWVmIE1hcHBpbmcgZnJvbSB0aGUgYWxyZWFkeS1pbXBvcnRlZCBzdGF0ZW1lbnRzIGluIHRoZSAiZnJvbSIKKyAgICAvLy8gY29udGV4dCB0byB0aGUgY29ycmVzcG9uZGluZyBzdGF0ZW1lbnRzIGluIHRoZSAidG8iIGNvbnRleHQuCisgICAgbGx2bTo6RGVuc2VNYXA8U3RtdCAqLCBTdG10ICo+IEltcG9ydGVkU3RtdHM7CisKKyAgICAvLy8gXGJyaWVmIE1hcHBpbmcgZnJvbSB0aGUgYWxyZWFkeS1pbXBvcnRlZCBGaWxlSURzIGluIHRoZSAiZnJvbSIgc291cmNlCisgICAgLy8vIG1hbmFnZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgRmlsZUlEcyBpbiB0aGUgInRvIiBzb3VyY2UgbWFuYWdlci4KKyAgICBsbHZtOjpEZW5zZU1hcDxGaWxlSUQsIEZpbGVJRD4gSW1wb3J0ZWRGaWxlSURzOworCisgICAgLy8vIFxicmllZiBNYXBwaW5nIGZyb20gdGhlIGFscmVhZHktaW1wb3J0ZWQgQ1hYQmFzZXNTcGVjaWZpZXIgaW4KKyAgICAvLy8gIHRoZSAiZnJvbSIgc291cmNlIG1hbmFnZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgQ1hYQmFzZXNTcGVjaWZpZXIKKyAgICAvLy8gIGluIHRoZSAidG8iIHNvdXJjZSBtYW5hZ2VyLgorICAgIEltcG9ydGVkQ1hYQmFzZVNwZWNpZmllck1hcCBJbXBvcnRlZENYWEJhc2VTcGVjaWZpZXJzOworCisgICAgLy8vIFxicmllZiBJbXBvcnRlZCwgYW5vbnltb3VzIHRhZyBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgbWlzc2luZyB0aGVpciAKKyAgICAvLy8gY29ycmVzcG9uZGluZyB0eXBlZGVmcy4KKyAgICBTbWFsbFZlY3RvcjxUYWdEZWNsICosIDQ+IEFub25UYWdzV2l0aFBlbmRpbmdUeXBlZGVmczsKKyAgICAKKyAgICAvLy8gXGJyaWVmIERlY2xhcmF0aW9uIChmcm9tLCB0bykgcGFpcnMgdGhhdCBhcmUga25vd24gbm90IHRvIGJlIGVxdWl2YWxlbnQKKyAgICAvLy8gKHdoaWNoIHdlIGhhdmUgYWxyZWFkeSBjb21wbGFpbmVkIGFib3V0KS4KKyAgICBOb25FcXVpdmFsZW50RGVjbFNldCBOb25FcXVpdmFsZW50RGVjbHM7CisgICAgCisgIHB1YmxpYzoKKyAgICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyBBU1QgaW1wb3J0ZXIuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBUb0NvbnRleHQgVGhlIGNvbnRleHQgd2UnbGwgYmUgaW1wb3J0aW5nIGludG8uCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBUb0ZpbGVNYW5hZ2VyIFRoZSBmaWxlIG1hbmFnZXIgd2UnbGwgYmUgaW1wb3J0aW5nIGludG8uCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBGcm9tQ29udGV4dCBUaGUgY29udGV4dCB3ZSdsbCBiZSBpbXBvcnRpbmcgZnJvbS4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIEZyb21GaWxlTWFuYWdlciBUaGUgZmlsZSBtYW5hZ2VyIHdlJ2xsIGJlIGltcG9ydGluZyBpbnRvLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gTWluaW1hbEltcG9ydCBJZiB0cnVlLCB0aGUgaW1wb3J0ZXIgd2lsbCBhdHRlbXB0IHRvIGltcG9ydAorICAgIC8vLyBhcyBsaXR0bGUgYXMgaXQgY2FuLCBlLmcuLCBieSBpbXBvcnRpbmcgZGVjbGFyYXRpb25zIGFzIGZvcndhcmQKKyAgICAvLy8gZGVjbGFyYXRpb25zIHRoYXQgY2FuIGJlIGNvbXBsZXRlZCBhdCBhIGxhdGVyIHBvaW50LgorICAgIEFTVEltcG9ydGVyKEFTVENvbnRleHQgJlRvQ29udGV4dCwgRmlsZU1hbmFnZXIgJlRvRmlsZU1hbmFnZXIsCisgICAgICAgICAgICAgICAgQVNUQ29udGV4dCAmRnJvbUNvbnRleHQsIEZpbGVNYW5hZ2VyICZGcm9tRmlsZU1hbmFnZXIsCisgICAgICAgICAgICAgICAgYm9vbCBNaW5pbWFsSW1wb3J0KTsKKyAgICAKKyAgICB2aXJ0dWFsIH5BU1RJbXBvcnRlcigpOworICAgIAorICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgaW1wb3J0ZXIgd2lsbCBwZXJmb3JtIGEgbWluaW1hbCBpbXBvcnQsIGNyZWF0aW5nCisgICAgLy8vIHRvLWJlLWNvbXBsZXRlZCBmb3J3YXJkIGRlY2xhcmF0aW9ucyB3aGVuIHBvc3NpYmxlLgorICAgIGJvb2wgaXNNaW5pbWFsSW1wb3J0KCkgY29uc3QgeyByZXR1cm4gTWluaW1hbDsgfQorICAgIAorICAgIC8vLyBcYnJpZWYgSW1wb3J0IHRoZSBnaXZlbiB0eXBlIGZyb20gdGhlICJmcm9tIiBjb250ZXh0IGludG8gdGhlICJ0byIKKyAgICAvLy8gY29udGV4dC4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgdGhlIGVxdWl2YWxlbnQgdHlwZSBpbiB0aGUgInRvIiBjb250ZXh0LCBvciBhIE5VTEwgdHlwZSBpZgorICAgIC8vLyBhbiBlcnJvciBvY2N1cnJlZC4KKyAgICBRdWFsVHlwZSBJbXBvcnQoUXVhbFR5cGUgRnJvbVQpOworCisgICAgLy8vIFxicmllZiBJbXBvcnQgdGhlIGdpdmVuIHR5cGUgc291cmNlIGluZm9ybWF0aW9uIGZyb20gdGhlCisgICAgLy8vICJmcm9tIiBjb250ZXh0IGludG8gdGhlICJ0byIgY29udGV4dC4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgdGhlIGVxdWl2YWxlbnQgdHlwZSBzb3VyY2UgaW5mb3JtYXRpb24gaW4gdGhlICJ0byIKKyAgICAvLy8gY29udGV4dCwgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAgICBUeXBlU291cmNlSW5mbyAqSW1wb3J0KFR5cGVTb3VyY2VJbmZvICpGcm9tVFNJKTsKKworICAgIC8vLyBcYnJpZWYgSW1wb3J0IHRoZSBnaXZlbiBkZWNsYXJhdGlvbiBmcm9tIHRoZSAiZnJvbSIgY29udGV4dCBpbnRvIHRoZSAKKyAgICAvLy8gInRvIiBjb250ZXh0LgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyB0aGUgZXF1aXZhbGVudCBkZWNsYXJhdGlvbiBpbiB0aGUgInRvIiBjb250ZXh0LCBvciBhIE5VTEwgdHlwZSAKKyAgICAvLy8gaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgICAgRGVjbCAqSW1wb3J0KERlY2wgKkZyb21EKTsKKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBjb3B5IG9mIHRoZSBnaXZlbiBkZWNsYXJhdGlvbiBpbiB0aGUgInRvIiBjb250ZXh0IGlmCisgICAgLy8vIGl0IGhhcyBhbHJlYWR5IGJlZW4gaW1wb3J0ZWQgZnJvbSB0aGUgImZyb20iIGNvbnRleHQuICBPdGhlcndpc2UgcmV0dXJuCisgICAgLy8vIE5VTEwuCisgICAgRGVjbCAqR2V0QWxyZWFkeUltcG9ydGVkT3JOdWxsKERlY2wgKkZyb21EKTsKKworICAgIC8vLyBcYnJpZWYgSW1wb3J0IHRoZSBnaXZlbiBkZWNsYXJhdGlvbiBjb250ZXh0IGZyb20gdGhlICJmcm9tIgorICAgIC8vLyBBU1QgY29udGV4dCBpbnRvIHRoZSAidG8iIEFTVCBjb250ZXh0LgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyB0aGUgZXF1aXZhbGVudCBkZWNsYXJhdGlvbiBjb250ZXh0IGluIHRoZSAidG8iCisgICAgLy8vIGNvbnRleHQsIG9yIGEgTlVMTCB0eXBlIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICAgIERlY2xDb250ZXh0ICpJbXBvcnRDb250ZXh0KERlY2xDb250ZXh0ICpGcm9tREMpOworICAgIAorICAgIC8vLyBcYnJpZWYgSW1wb3J0IHRoZSBnaXZlbiBleHByZXNzaW9uIGZyb20gdGhlICJmcm9tIiBjb250ZXh0IGludG8gdGhlCisgICAgLy8vICJ0byIgY29udGV4dC4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgdGhlIGVxdWl2YWxlbnQgZXhwcmVzc2lvbiBpbiB0aGUgInRvIiBjb250ZXh0LCBvciBOVUxMIGlmCisgICAgLy8vIGFuIGVycm9yIG9jY3VycmVkLgorICAgIEV4cHIgKkltcG9ydChFeHByICpGcm9tRSk7CisKKyAgICAvLy8gXGJyaWVmIEltcG9ydCB0aGUgZ2l2ZW4gc3RhdGVtZW50IGZyb20gdGhlICJmcm9tIiBjb250ZXh0IGludG8gdGhlCisgICAgLy8vICJ0byIgY29udGV4dC4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgdGhlIGVxdWl2YWxlbnQgc3RhdGVtZW50IGluIHRoZSAidG8iIGNvbnRleHQsIG9yIE5VTEwgaWYKKyAgICAvLy8gYW4gZXJyb3Igb2NjdXJyZWQuCisgICAgU3RtdCAqSW1wb3J0KFN0bXQgKkZyb21TKTsKKworICAgIC8vLyBcYnJpZWYgSW1wb3J0IHRoZSBnaXZlbiBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgZnJvbSB0aGUgImZyb20iCisgICAgLy8vIGNvbnRleHQgaW50byB0aGUgInRvIiBjb250ZXh0LgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyB0aGUgZXF1aXZhbGVudCBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgaW4gdGhlICJ0byIKKyAgICAvLy8gY29udGV4dCwgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAgICBOZXN0ZWROYW1lU3BlY2lmaWVyICpJbXBvcnQoTmVzdGVkTmFtZVNwZWNpZmllciAqRnJvbU5OUyk7CisKKyAgICAvLy8gXGJyaWVmIEltcG9ydCB0aGUgZ2l2ZW4gbmVzdGVkLW5hbWUtc3BlY2lmaWVyIGZyb20gdGhlICJmcm9tIgorICAgIC8vLyBjb250ZXh0IGludG8gdGhlICJ0byIgY29udGV4dC4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgdGhlIGVxdWl2YWxlbnQgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIGluIHRoZSAidG8iCisgICAgLy8vIGNvbnRleHQuCisgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBJbXBvcnQoTmVzdGVkTmFtZVNwZWNpZmllckxvYyBGcm9tTk5TKTsKKworICAgIC8vLyBcYnJpZWYgSW1wb3J0IHRoZSBnb3ZlbiB0ZW1wbGF0ZSBuYW1lIGZyb20gdGhlICJmcm9tIiBjb250ZXh0IGludG8gdGhlCisgICAgLy8vICJ0byIgY29udGV4dC4KKyAgICBUZW1wbGF0ZU5hbWUgSW1wb3J0KFRlbXBsYXRlTmFtZSBGcm9tKTsKKyAgICAKKyAgICAvLy8gXGJyaWVmIEltcG9ydCB0aGUgZ2l2ZW4gc291cmNlIGxvY2F0aW9uIGZyb20gdGhlICJmcm9tIiBjb250ZXh0IGludG8KKyAgICAvLy8gdGhlICJ0byIgY29udGV4dC4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgdGhlIGVxdWl2YWxlbnQgc291cmNlIGxvY2F0aW9uIGluIHRoZSAidG8iIGNvbnRleHQsIG9yIGFuCisgICAgLy8vIGludmFsaWQgc291cmNlIGxvY2F0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICAgIFNvdXJjZUxvY2F0aW9uIEltcG9ydChTb3VyY2VMb2NhdGlvbiBGcm9tTG9jKTsKKworICAgIC8vLyBcYnJpZWYgSW1wb3J0IHRoZSBnaXZlbiBzb3VyY2UgcmFuZ2UgZnJvbSB0aGUgImZyb20iIGNvbnRleHQgaW50bworICAgIC8vLyB0aGUgInRvIiBjb250ZXh0LgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyB0aGUgZXF1aXZhbGVudCBzb3VyY2UgcmFuZ2UgaW4gdGhlICJ0byIgY29udGV4dCwgb3IgYW4KKyAgICAvLy8gaW52YWxpZCBzb3VyY2UgbG9jYXRpb24gaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgICAgU291cmNlUmFuZ2UgSW1wb3J0KFNvdXJjZVJhbmdlIEZyb21SYW5nZSk7CisKKyAgICAvLy8gXGJyaWVmIEltcG9ydCB0aGUgZ2l2ZW4gZGVjbGFyYXRpb24gbmFtZSBmcm9tIHRoZSAiZnJvbSIKKyAgICAvLy8gY29udGV4dCBpbnRvIHRoZSAidG8iIGNvbnRleHQuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm5zIHRoZSBlcXVpdmFsZW50IGRlY2xhcmF0aW9uIG5hbWUgaW4gdGhlICJ0byIgY29udGV4dCwKKyAgICAvLy8gb3IgYW4gZW1wdHkgZGVjbGFyYXRpb24gbmFtZSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAgICBEZWNsYXJhdGlvbk5hbWUgSW1wb3J0KERlY2xhcmF0aW9uTmFtZSBGcm9tTmFtZSk7CisKKyAgICAvLy8gXGJyaWVmIEltcG9ydCB0aGUgZ2l2ZW4gaWRlbnRpZmllciBmcm9tIHRoZSAiZnJvbSIgY29udGV4dAorICAgIC8vLyBpbnRvIHRoZSAidG8iIGNvbnRleHQuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm5zIHRoZSBlcXVpdmFsZW50IGlkZW50aWZpZXIgaW4gdGhlICJ0byIgY29udGV4dC4KKyAgICBJZGVudGlmaWVySW5mbyAqSW1wb3J0KGNvbnN0IElkZW50aWZpZXJJbmZvICpGcm9tSWQpOworCisgICAgLy8vIFxicmllZiBJbXBvcnQgdGhlIGdpdmVuIE9iamVjdGl2ZS1DIHNlbGVjdG9yIGZyb20gdGhlICJmcm9tIgorICAgIC8vLyBjb250ZXh0IGludG8gdGhlICJ0byIgY29udGV4dC4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgdGhlIGVxdWl2YWxlbnQgc2VsZWN0b3IgaW4gdGhlICJ0byIgY29udGV4dC4KKyAgICBTZWxlY3RvciBJbXBvcnQoU2VsZWN0b3IgRnJvbVNlbCk7CisKKyAgICAvLy8gXGJyaWVmIEltcG9ydCB0aGUgZ2l2ZW4gZmlsZSBJRCBmcm9tIHRoZSAiZnJvbSIgY29udGV4dCBpbnRvIHRoZSAKKyAgICAvLy8gInRvIiBjb250ZXh0LgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyB0aGUgZXF1aXZhbGVudCBmaWxlIElEIGluIHRoZSBzb3VyY2UgbWFuYWdlciBvZiB0aGUgInRvIgorICAgIC8vLyBjb250ZXh0LgorICAgIEZpbGVJRCBJbXBvcnQoRmlsZUlEKTsKKworICAgIC8vLyBcYnJpZWYgSW1wb3J0IHRoZSBnaXZlbiBDKysgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXIgZnJvbSB0aGUgImZyb20iCisgICAgLy8vIGNvbnRleHQgaW50byB0aGUgInRvIiBjb250ZXh0LgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyB0aGUgZXF1aXZhbGVudCBpbml0aWFsaXplciBpbiB0aGUgInRvIiBjb250ZXh0LgorICAgIENYWEN0b3JJbml0aWFsaXplciAqSW1wb3J0KENYWEN0b3JJbml0aWFsaXplciAqRnJvbUluaXQpOworCisgICAgLy8vIFxicmllZiBJbXBvcnQgdGhlIGdpdmVuIENYWEJhc2VTcGVjaWZpZXIgZnJvbSB0aGUgImZyb20iIGNvbnRleHQgaW50bworICAgIC8vLyB0aGUgInRvIiBjb250ZXh0LgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyB0aGUgZXF1aXZhbGVudCBDWFhCYXNlU3BlY2lmaWVyIGluIHRoZSBzb3VyY2UgbWFuYWdlciBvZiB0aGUKKyAgICAvLy8gInRvIiBjb250ZXh0LgorICAgIENYWEJhc2VTcGVjaWZpZXIgKkltcG9ydChjb25zdCBDWFhCYXNlU3BlY2lmaWVyICpGcm9tU3BlYyk7CisKKyAgICAvLy8gXGJyaWVmIEltcG9ydCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZ2l2ZW4gZGVjbGFyYXRpb24sIGluY2x1ZGluZyBhbGwgb2YKKyAgICAvLy8gdGhlIGRlY2xhcmF0aW9ucyBpdCBjb250YWlucy4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyByb3V0aW5lIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgCisgICAgdm9pZCBJbXBvcnREZWZpbml0aW9uKERlY2wgKkZyb20pOworCisgICAgLy8vIFxicmllZiBDb3BlIHdpdGggYSBuYW1lIGNvbmZsaWN0IHdoZW4gaW1wb3J0aW5nIGEgZGVjbGFyYXRpb24gaW50byB0aGUKKyAgICAvLy8gZ2l2ZW4gY29udGV4dC4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyByb3V0aW5lIGlzIGludm9rZWQgd2hlbmV2ZXIgdGhlcmUgaXMgYSBuYW1lIGNvbmZsaWN0IHdoaWxlIAorICAgIC8vLyBpbXBvcnRpbmcgYSBkZWNsYXJhdGlvbi4gVGhlIHJldHVybmVkIG5hbWUgd2lsbCBiZWNvbWUgdGhlIG5hbWUgb2YgdGhlCisgICAgLy8vIGltcG9ydGVkIGRlY2xhcmF0aW9uLiBCeSBkZWZhdWx0LCB0aGUgcmV0dXJuZWQgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUKKyAgICAvLy8gb3JpZ2luYWwgbmFtZSwgbGVhdmluZyB0aGUgY29uZmxpY3QgdW5yZXNvbHZlIHN1Y2ggdGhhdCBuYW1lIGxvb2t1cAorICAgIC8vLyBmb3IgdGhpcyBuYW1lIGlzIGxpa2VseSB0byBmaW5kIGFuIGFtYmlndWl0eSBsYXRlci4KKyAgICAvLy8KKyAgICAvLy8gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyByb3V0aW5lIHRvIHJlc29sdmUgdGhlIGNvbmZsaWN0LCBlLmcuLCBieQorICAgIC8vLyByZW5hbWluZyB0aGUgZGVjbGFyYXRpb24gYmVpbmcgaW1wb3J0ZWQuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBOYW1lIHRoZSBuYW1lIG9mIHRoZSBkZWNsYXJhdGlvbiBiZWluZyBpbXBvcnRlZCwgd2hpY2ggY29uZmxpY3RzCisgICAgLy8vIHdpdGggb3RoZXIgZGVjbGFyYXRpb25zLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gREMgdGhlIGRlY2xhcmF0aW9uIGNvbnRleHQgKGluIHRoZSAidG8iIEFTVCBjb250ZXh0KSBpbiB3aGljaCAKKyAgICAvLy8gdGhlIG5hbWUgaXMgYmVpbmcgaW1wb3J0ZWQuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBJRE5TIHRoZSBpZGVudGlmaWVyIG5hbWVzcGFjZSBpbiB3aGljaCB0aGUgbmFtZSB3aWxsIGJlIGZvdW5kLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gRGVjbHMgdGhlIHNldCBvZiBkZWNsYXJhdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZQorICAgIC8vLyBkZWNsYXJhdGlvbiBiZWluZyBpbXBvcnRlZC4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIE51bURlY2xzIHRoZSBudW1iZXIgb2YgY29uZmxpY3RpbmcgZGVjbGFyYXRpb25zIGluIFxwIERlY2xzLgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyB0aGUgbmFtZSB0aGF0IHRoZSBuZXdseS1pbXBvcnRlZCBkZWNsYXJhdGlvbiBzaG91bGQgaGF2ZS4KKyAgICB2aXJ0dWFsIERlY2xhcmF0aW9uTmFtZSBIYW5kbGVOYW1lQ29uZmxpY3QoRGVjbGFyYXRpb25OYW1lIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUROUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICoqRGVjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bURlY2xzKTsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBjb250ZXh0IHRoYXQgQVNUIG5vZGVzIGFyZSBiZWluZyBpbXBvcnRlZCBpbnRvLgorICAgIEFTVENvbnRleHQgJmdldFRvQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIFRvQ29udGV4dDsgfQorICAgIAorICAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGNvbnRleHQgdGhhdCBBU1Qgbm9kZXMgYXJlIGJlaW5nIGltcG9ydGVkIGZyb20uCisgICAgQVNUQ29udGV4dCAmZ2V0RnJvbUNvbnRleHQoKSBjb25zdCB7IHJldHVybiBGcm9tQ29udGV4dDsgfQorICAgIAorICAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGZpbGUgbWFuYWdlciB0aGF0IEFTVCBub2RlcyBhcmUgYmVpbmcgaW1wb3J0ZWQgaW50by4KKyAgICBGaWxlTWFuYWdlciAmZ2V0VG9GaWxlTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIFRvRmlsZU1hbmFnZXI7IH0KKworICAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGZpbGUgbWFuYWdlciB0aGF0IEFTVCBub2RlcyBhcmUgYmVpbmcgaW1wb3J0ZWQgZnJvbS4KKyAgICBGaWxlTWFuYWdlciAmZ2V0RnJvbUZpbGVNYW5hZ2VyKCkgY29uc3QgeyByZXR1cm4gRnJvbUZpbGVNYW5hZ2VyOyB9CisgICAgCisgICAgLy8vIFxicmllZiBSZXBvcnQgYSBkaWFnbm9zdGljIGluIHRoZSAidG8iIGNvbnRleHQuCisgICAgRGlhZ25vc3RpY0J1aWxkZXIgVG9EaWFnKFNvdXJjZUxvY2F0aW9uIExvYywgdW5zaWduZWQgRGlhZ0lEKTsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFJlcG9ydCBhIGRpYWdub3N0aWMgaW4gdGhlICJmcm9tIiBjb250ZXh0LgorICAgIERpYWdub3N0aWNCdWlsZGVyIEZyb21EaWFnKFNvdXJjZUxvY2F0aW9uIExvYywgdW5zaWduZWQgRGlhZ0lEKTsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFJldHVybiB0aGUgc2V0IG9mIGRlY2xhcmF0aW9ucyB0aGF0IHdlIGtub3cgYXJlIG5vdCBlcXVpdmFsZW50LgorICAgIE5vbkVxdWl2YWxlbnREZWNsU2V0ICZnZXROb25FcXVpdmFsZW50RGVjbHMoKSB7IHJldHVybiBOb25FcXVpdmFsZW50RGVjbHM7IH0KKworICAgIC8vLyBcYnJpZWYgQ2FsbGVkIGZvciBPYmpDSW50ZXJmYWNlRGVjbCwgT2JqQ1Byb3RvY29sRGVjbCwgYW5kIFRhZ0RlY2wuCisgICAgLy8vIE1hcmsgdGhlIERlY2wgYXMgY29tcGxldGUsIGZpbGxpbmcgaXQgaW4gYXMgbXVjaCBhcyBwb3NzaWJsZS4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIEQgQSBkZWNsYXJhdGlvbiBpbiB0aGUgInRvIiBjb250ZXh0LgorICAgIHZpcnR1YWwgdm9pZCBDb21wbGV0ZURlY2woRGVjbCogRCk7CisgICAgCisgICAgLy8vIFxicmllZiBOb3RlIHRoYXQgd2UgaGF2ZSBpbXBvcnRlZCB0aGUgImZyb20iIGRlY2xhcmF0aW9uIGJ5IG1hcHBpbmcgaXQKKyAgICAvLy8gdG8gdGhlIChwb3RlbnRpYWxseS1uZXdseS1jcmVhdGVkKSAidG8iIGRlY2xhcmF0aW9uLgorICAgIC8vLworICAgIC8vLyBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIG9ic2VydmUgYWxsIG9mIHRoZSBcYyBGcm9tIC0+CisgICAgLy8vIFxjIFRvIGRlY2xhcmF0aW9uIG1hcHBpbmdzIGFzIHRoZXkgYXJlIGltcG9ydGVkLgorICAgIHZpcnR1YWwgRGVjbCAqSW1wb3J0ZWQoRGVjbCAqRnJvbSwgRGVjbCAqVG8pOworICAgICAgCisgICAgLy8vIFxicmllZiBDYWxsZWQgYnkgU3RydWN0dXJhbEVxdWl2YWxlbmNlQ29udGV4dC4gIElmIGEgUmVjb3JkRGVjbCBpcworICAgIC8vLyBiZWluZyBjb21wYXJlZCB0byBhbm90aGVyIFJlY29yZERlY2wgYXMgcGFydCBvZiBpbXBvcnQsIGNvbXBsZXRpbmcgdGhlCisgICAgLy8vIG90aGVyIFJlY29yZERlY2wgbWF5IHRyaWdnZXIgaW1wb3J0YXRpb24gb2YgdGhlIGZpcnN0IFJlY29yZERlY2wuIFRoaXMKKyAgICAvLy8gaGFwcGVucyBlc3BlY2lhbGx5IGZvciBhbm9ueW1vdXMgc3RydWN0cy4gIElmIHRoZSBvcmlnaW5hbCBvZiB0aGUgc2Vjb25kCisgICAgLy8vIFJlY29yZERlY2wgY2FuIGJlIGZvdW5kLCB3ZSBjYW4gY29tcGxldGUgaXQgd2l0aG91dCB0aGUgbmVlZCBmb3IKKyAgICAvLy8gaW1wb3J0YXRpb24sIGVsaW1pbmF0aW5nIHRoaXMgbG9vcC4KKyAgICB2aXJ0dWFsIERlY2wgKkdldE9yaWdpbmFsRGVjbChEZWNsICpUbykgeyByZXR1cm4gbnVsbHB0cjsgfQorICAgIAorICAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIHR5cGVzIGFyZSBzdHJ1Y3R1cmFsbHkKKyAgICAvLy8gZXF1aXZhbGVudC4KKyAgICBib29sIElzU3RydWN0dXJhbGx5RXF1aXZhbGVudChRdWFsVHlwZSBGcm9tLCBRdWFsVHlwZSBUbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluID0gdHJ1ZSk7CisgIH07Cit9CisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9BU1RJTVBPUlRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQVNUTGFtYmRhLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQVNUTGFtYmRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkZjJkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BU1RMYW1iZGEuaApAQCAtMCwwICsxLDgwIEBACisvLz09PS0tLSBBU1RMYW1iZGEuaCAtIExhbWJkYSBIZWxwZXIgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBUaGlzIGZpbGUgcHJvdmlkZXMgc29tZSBjb21tb24gdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcKKy8vLyBMYW1iZGEgcmVsYXRlZCBBU1QgQ29uc3RydWN0cy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9BU1RMQU1CREFfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9BU1RMQU1CREFfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDWFguaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbFRlbXBsYXRlLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CitpbmxpbmUgU3RyaW5nUmVmIGdldExhbWJkYVN0YXRpY0ludm9rZXJOYW1lKCkgeworICByZXR1cm4gIl9faW52b2tlIjsKK30KKy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIE0gaXMgYSBzcGVjaWFsaXphdGlvbiwgYSB0ZW1wbGF0ZSwKKy8vIG9yIGEgbm9uLWdlbmVyaWMgbGFtYmRhIGNhbGwgb3BlcmF0b3IuCitpbmxpbmUgYm9vbCBpc0xhbWJkYUNhbGxPcGVyYXRvcihjb25zdCBDWFhNZXRob2REZWNsICpNRCkgeworICBjb25zdCBDWFhSZWNvcmREZWNsICpMYW1iZGFDbGFzcyA9IE1ELT5nZXRQYXJlbnQoKTsKKyAgaWYgKCFMYW1iZGFDbGFzcyB8fCAhTGFtYmRhQ2xhc3MtPmlzTGFtYmRhKCkpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIE1ELT5nZXRPdmVybG9hZGVkT3BlcmF0b3IoKSA9PSBPT19DYWxsOworfQorCitpbmxpbmUgYm9vbCBpc0xhbWJkYUNhbGxPcGVyYXRvcihjb25zdCBEZWNsQ29udGV4dCAqREMpIHsKKyAgaWYgKCFEQyB8fCAhaXNhPENYWE1ldGhvZERlY2w+KERDKSkgcmV0dXJuIGZhbHNlOworICByZXR1cm4gaXNMYW1iZGFDYWxsT3BlcmF0b3IoY2FzdDxDWFhNZXRob2REZWNsPihEQykpOworfQorCitpbmxpbmUgYm9vbCBpc0dlbmVyaWNMYW1iZGFDYWxsT3BlcmF0b3JTcGVjaWFsaXphdGlvbihjb25zdCBDWFhNZXRob2REZWNsICpNRCkgeworICBpZiAoIU1EKSByZXR1cm4gZmFsc2U7CisgIGNvbnN0IENYWFJlY29yZERlY2wgKkxhbWJkYUNsYXNzID0gTUQtPmdldFBhcmVudCgpOworICBpZiAoTGFtYmRhQ2xhc3MgJiYgTGFtYmRhQ2xhc3MtPmlzR2VuZXJpY0xhbWJkYSgpKQorICAgIHJldHVybiBpc0xhbWJkYUNhbGxPcGVyYXRvcihNRCkgJiYgCisgICAgICAgICAgICAgICAgICAgIE1ELT5pc0Z1bmN0aW9uVGVtcGxhdGVTcGVjaWFsaXphdGlvbigpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSBib29sIGlzTGFtYmRhQ29udmVyc2lvbk9wZXJhdG9yKENYWENvbnZlcnNpb25EZWNsICpDKSB7CisgIHJldHVybiBDID8gQy0+Z2V0UGFyZW50KCktPmlzTGFtYmRhKCkgOiBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgaXNMYW1iZGFDb252ZXJzaW9uT3BlcmF0b3IoRGVjbCAqRCkgeworICBpZiAoIUQpIHJldHVybiBmYWxzZTsKKyAgaWYgKENYWENvbnZlcnNpb25EZWNsICpDb252ID0gZHluX2Nhc3Q8Q1hYQ29udmVyc2lvbkRlY2w+KEQpKSAKKyAgICByZXR1cm4gaXNMYW1iZGFDb252ZXJzaW9uT3BlcmF0b3IoQ29udik7ICAKKyAgaWYgKEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpGID0gZHluX2Nhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KEQpKSAKKyAgICBpZiAoQ1hYQ29udmVyc2lvbkRlY2wgKkNvbnYgPSAKKyAgICAgICAgZHluX2Nhc3Rfb3JfbnVsbDxDWFhDb252ZXJzaW9uRGVjbD4oRi0+Z2V0VGVtcGxhdGVkRGVjbCgpKSkgCisgICAgICByZXR1cm4gaXNMYW1iZGFDb252ZXJzaW9uT3BlcmF0b3IoQ29udik7CisgIHJldHVybiBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgaXNHZW5lcmljTGFtYmRhQ2FsbE9wZXJhdG9yU3BlY2lhbGl6YXRpb24oRGVjbENvbnRleHQgKkRDKSB7CisgIHJldHVybiBpc0dlbmVyaWNMYW1iZGFDYWxsT3BlcmF0b3JTcGVjaWFsaXphdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bl9jYXN0PENYWE1ldGhvZERlY2w+KERDKSk7Cit9CisKKworLy8gVGhpcyByZXR1cm5zIHRoZSBwYXJlbnQgRGVjbENvbnRleHQgZW5zdXJpbmcgdGhhdCB0aGUgY29ycmVjdAorLy8gcGFyZW50IERlY2xDb250ZXh0IGlzIHJldHVybmVkIGZvciBMYW1iZGFzCitpbmxpbmUgRGVjbENvbnRleHQgKmdldExhbWJkYUF3YXJlUGFyZW50T2ZEZWNsQ29udGV4dChEZWNsQ29udGV4dCAqREMpIHsKKyAgaWYgKGlzTGFtYmRhQ2FsbE9wZXJhdG9yKERDKSkKKyAgICByZXR1cm4gREMtPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgZWxzZSAKKyAgICByZXR1cm4gREMtPmdldFBhcmVudCgpOworfQorCit9IC8vIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0FTVE11dGF0aW9uTGlzdGVuZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BU1RNdXRhdGlvbkxpc3RlbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5NWQzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BU1RNdXRhdGlvbkxpc3RlbmVyLmgKQEAgLTAsMCArMSwxNTIgQEAKKy8vPT09LS0tIEFTVE11dGF0aW9uTGlzdGVuZXIuaCAtIEFTVCBNdXRhdGlvbiBJbnRlcmZhY2UgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIEFTVE11dGF0aW9uTGlzdGVuZXIgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0FTVE1VVEFUSU9OTElTVEVORVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9BU1RNVVRBVElPTkxJU1RFTkVSX0gKKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgY2xhc3MgQXR0cjsKKyAgY2xhc3MgQ2xhc3NUZW1wbGF0ZURlY2w7CisgIGNsYXNzIENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w7CisgIGNsYXNzIENvbnN0cnVjdG9yVXNpbmdTaGFkb3dEZWNsOworICBjbGFzcyBDWFhEZXN0cnVjdG9yRGVjbDsKKyAgY2xhc3MgQ1hYUmVjb3JkRGVjbDsKKyAgY2xhc3MgRGVjbDsKKyAgY2xhc3MgRGVjbENvbnRleHQ7CisgIGNsYXNzIEV4cHI7CisgIGNsYXNzIEZpZWxkRGVjbDsKKyAgY2xhc3MgRnVuY3Rpb25EZWNsOworICBjbGFzcyBGdW5jdGlvblRlbXBsYXRlRGVjbDsKKyAgY2xhc3MgTW9kdWxlOworICBjbGFzcyBOYW1lZERlY2w7CisgIGNsYXNzIE9iakNDYXRlZ29yeURlY2w7CisgIGNsYXNzIE9iakNDb250YWluZXJEZWNsOworICBjbGFzcyBPYmpDSW50ZXJmYWNlRGVjbDsKKyAgY2xhc3MgT2JqQ1Byb3BlcnR5RGVjbDsKKyAgY2xhc3MgUGFybVZhckRlY2w7CisgIGNsYXNzIFF1YWxUeXBlOworICBjbGFzcyBSZWNvcmREZWNsOworICBjbGFzcyBUYWdEZWNsOworICBjbGFzcyBWYWx1ZURlY2w7CisgIGNsYXNzIFZhckRlY2w7CisgIGNsYXNzIFZhclRlbXBsYXRlRGVjbDsKKyAgY2xhc3MgVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w7CisKKy8vLyBcYnJpZWYgQW4gYWJzdHJhY3QgaW50ZXJmYWNlIHRoYXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGxpc3RlbmVycworLy8vIHRoYXQgd2FudCB0byBiZSBub3RpZmllZCB3aGVuIGFuIEFTVCBlbnRpdHkgZ2V0cyBtb2RpZmllZCBhZnRlciBpdHMKKy8vLyBpbml0aWFsIGNyZWF0aW9uLgorY2xhc3MgQVNUTXV0YXRpb25MaXN0ZW5lciB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkFTVE11dGF0aW9uTGlzdGVuZXIoKTsKKworICAvLy8gXGJyaWVmIEEgbmV3IFRhZ0RlY2wgZGVmaW5pdGlvbiB3YXMgY29tcGxldGVkLgorICB2aXJ0dWFsIHZvaWQgQ29tcGxldGVkVGFnRGVmaW5pdGlvbihjb25zdCBUYWdEZWNsICpEKSB7IH0KKworICAvLy8gXGJyaWVmIEEgbmV3IGRlY2xhcmF0aW9uIHdpdGggbmFtZSBoYXMgYmVlbiBhZGRlZCB0byBhIERlY2xDb250ZXh0LgorICB2aXJ0dWFsIHZvaWQgQWRkZWRWaXNpYmxlRGVjbChjb25zdCBEZWNsQ29udGV4dCAqREMsIGNvbnN0IERlY2wgKkQpIHt9CisKKyAgLy8vIFxicmllZiBBbiBpbXBsaWNpdCBtZW1iZXIgd2FzIGFkZGVkIGFmdGVyIHRoZSBkZWZpbml0aW9uIHdhcyBjb21wbGV0ZWQuCisgIHZpcnR1YWwgdm9pZCBBZGRlZENYWEltcGxpY2l0TWVtYmVyKGNvbnN0IENYWFJlY29yZERlY2wgKlJELCBjb25zdCBEZWNsICpEKSB7fQorCisgIC8vLyBcYnJpZWYgQSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiAob3IgcGFydGlhbCBvbmUpIHdhcyBhZGRlZCB0byB0aGUKKyAgLy8vIHRlbXBsYXRlIGRlY2xhcmF0aW9uLgorICB2aXJ0dWFsIHZvaWQgQWRkZWRDWFhUZW1wbGF0ZVNwZWNpYWxpemF0aW9uKGNvbnN0IENsYXNzVGVtcGxhdGVEZWNsICpURCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKkQpIHt9CisKKyAgLy8vIFxicmllZiBBIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIChvciBwYXJ0aWFsIG9uZSkgd2FzIGFkZGVkIHRvIHRoZQorICAvLy8gdGVtcGxhdGUgZGVjbGFyYXRpb24uCisgIHZpcnR1YWwgdm9pZAorICBBZGRlZENYWFRlbXBsYXRlU3BlY2lhbGl6YXRpb24oY29uc3QgVmFyVGVtcGxhdGVEZWNsICpURCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICpEKSB7fQorCisgIC8vLyBcYnJpZWYgQSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiAob3IgcGFydGlhbCBvbmUpIHdhcyBhZGRlZCB0byB0aGUKKyAgLy8vIHRlbXBsYXRlIGRlY2xhcmF0aW9uLgorICB2aXJ0dWFsIHZvaWQgQWRkZWRDWFhUZW1wbGF0ZVNwZWNpYWxpemF0aW9uKGNvbnN0IEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpURCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkQpIHt9CisKKyAgLy8vIFxicmllZiBBIGZ1bmN0aW9uJ3MgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gaGFzIGJlZW4gZXZhbHVhdGVkIG9yCisgIC8vLyBpbnN0YW50aWF0ZWQuCisgIHZpcnR1YWwgdm9pZCBSZXNvbHZlZEV4Y2VwdGlvblNwZWMoY29uc3QgRnVuY3Rpb25EZWNsICpGRCkge30KKworICAvLy8gXGJyaWVmIEEgZnVuY3Rpb24ncyByZXR1cm4gdHlwZSBoYXMgYmVlbiBkZWR1Y2VkLgorICB2aXJ0dWFsIHZvaWQgRGVkdWNlZFJldHVyblR5cGUoY29uc3QgRnVuY3Rpb25EZWNsICpGRCwgUXVhbFR5cGUgUmV0dXJuVHlwZSk7CisKKyAgLy8vIFxicmllZiBBIHZpcnR1YWwgZGVzdHJ1Y3RvcidzIG9wZXJhdG9yIGRlbGV0ZSBoYXMgYmVlbiByZXNvbHZlZC4KKyAgdmlydHVhbCB2b2lkIFJlc29sdmVkT3BlcmF0b3JEZWxldGUoY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkRELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkRlbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqVGhpc0FyZykge30KKworICAvLy8gXGJyaWVmIEFuIGltcGxpY2l0IG1lbWJlciBnb3QgYSBkZWZpbml0aW9uLgorICB2aXJ0dWFsIHZvaWQgQ29tcGxldGVkSW1wbGljaXREZWZpbml0aW9uKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRCkge30KKworICAvLy8gXGJyaWVmIFRoZSBpbnN0YW50aWF0aW9uIG9mIGEgdGVtcGxhdGVkIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIHdhcworICAvLy8gcmVxdWVzdGVkLiBJbiBwYXJ0aWN1bGFyLCB0aGUgcG9pbnQgb2YgaW5zdGFudGlhdGlvbiBhbmQgdGVtcGxhdGUKKyAgLy8vIHNwZWNpYWxpemF0aW9uIGtpbmQgb2YgXHAgRCBtYXkgaGF2ZSBjaGFuZ2VkLgorICB2aXJ0dWFsIHZvaWQgSW5zdGFudGlhdGlvblJlcXVlc3RlZChjb25zdCBWYWx1ZURlY2wgKkQpIHt9CisKKyAgLy8vIFxicmllZiBBIHRlbXBsYXRlZCB2YXJpYWJsZSdzIGRlZmluaXRpb24gd2FzIGltcGxpY2l0bHkgaW5zdGFudGlhdGVkLgorICB2aXJ0dWFsIHZvaWQgVmFyaWFibGVEZWZpbml0aW9uSW5zdGFudGlhdGVkKGNvbnN0IFZhckRlY2wgKkQpIHt9CisKKyAgLy8vIFxicmllZiBBIGZ1bmN0aW9uIHRlbXBsYXRlJ3MgZGVmaW5pdGlvbiB3YXMgaW5zdGFudGlhdGVkLgorICB2aXJ0dWFsIHZvaWQgRnVuY3Rpb25EZWZpbml0aW9uSW5zdGFudGlhdGVkKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRCkge30KKworICAvLy8gXGJyaWVmIEEgZGVmYXVsdCBhcmd1bWVudCB3YXMgaW5zdGFudGlhdGVkLgorICB2aXJ0dWFsIHZvaWQgRGVmYXVsdEFyZ3VtZW50SW5zdGFudGlhdGVkKGNvbnN0IFBhcm1WYXJEZWNsICpEKSB7fQorCisgIC8vLyBcYnJpZWYgQSBkZWZhdWx0IG1lbWJlciBpbml0aWFsaXplciB3YXMgaW5zdGFudGlhdGVkLgorICB2aXJ0dWFsIHZvaWQgRGVmYXVsdE1lbWJlckluaXRpYWxpemVySW5zdGFudGlhdGVkKGNvbnN0IEZpZWxkRGVjbCAqRCkge30KKworICAvLy8gXGJyaWVmIEEgbmV3IG9iamMgY2F0ZWdvcnkgY2xhc3Mgd2FzIGFkZGVkIGZvciBhbiBpbnRlcmZhY2UuCisgIHZpcnR1YWwgdm9pZCBBZGRlZE9iakNDYXRlZ29yeVRvSW50ZXJmYWNlKGNvbnN0IE9iakNDYXRlZ29yeURlY2wgKkNhdEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJRkQpIHt9CisKKyAgLy8vIFxicmllZiBBIGRlY2xhcmF0aW9uIGlzIG1hcmtlZCB1c2VkIHdoaWNoIHdhcyBub3QgcHJldmlvdXNseSBtYXJrZWQgdXNlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRCB0aGUgZGVjbGFyYXRpb24gbWFya2VkIHVzZWQKKyAgdmlydHVhbCB2b2lkIERlY2xhcmF0aW9uTWFya2VkVXNlZChjb25zdCBEZWNsICpEKSB7fQorCisgIC8vLyBcYnJpZWYgQSBkZWNsYXJhdGlvbiBpcyBtYXJrZWQgYXMgT3Blbk1QIHRocmVhZHByaXZhdGUgd2hpY2ggd2FzIG5vdAorICAvLy8gcHJldmlvdXNseSBtYXJrZWQgYXMgdGhyZWFkcHJpdmF0ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gRCB0aGUgZGVjbGFyYXRpb24gbWFya2VkIE9wZW5NUCB0aHJlYWRwcml2YXRlLgorICB2aXJ0dWFsIHZvaWQgRGVjbGFyYXRpb25NYXJrZWRPcGVuTVBUaHJlYWRQcml2YXRlKGNvbnN0IERlY2wgKkQpIHt9CisKKyAgLy8vIFxicmllZiBBIGRlY2xhcmF0aW9uIGlzIG1hcmtlZCBhcyBPcGVuTVAgZGVjbGFyZXRhcmdldCB3aGljaCB3YXMgbm90CisgIC8vLyBwcmV2aW91c2x5IG1hcmtlZCBhcyBkZWNsYXJldGFyZ2V0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBEIHRoZSBkZWNsYXJhdGlvbiBtYXJrZWQgT3Blbk1QIGRlY2xhcmV0YXJnZXQuCisgIC8vLyBccGFyYW0gQXR0ciB0aGUgYWRkZWQgYXR0cmlidXRlLgorICB2aXJ0dWFsIHZvaWQgRGVjbGFyYXRpb25NYXJrZWRPcGVuTVBEZWNsYXJlVGFyZ2V0KGNvbnN0IERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0ciAqQXR0cikge30KKworICAvLy8gXGJyaWVmIEEgZGVmaW5pdGlvbiBoYXMgYmVlbiBtYWRlIHZpc2libGUgYnkgYmVpbmcgcmVkZWZpbmVkIGxvY2FsbHkuCisgIC8vLworICAvLy8gXHBhcmFtIEQgVGhlIGRlZmluaXRpb24gdGhhdCB3YXMgcHJldmlvdXNseSBub3QgdmlzaWJsZS4KKyAgLy8vIFxwYXJhbSBNIFRoZSBjb250YWluaW5nIG1vZHVsZSBpbiB3aGljaCB0aGUgZGVmaW5pdGlvbiB3YXMgbWFkZSB2aXNpYmxlLAorICAvLy8gICAgICAgIGlmIGFueS4KKyAgdmlydHVhbCB2b2lkIFJlZGVmaW5lZEhpZGRlbkRlZmluaXRpb24oY29uc3QgTmFtZWREZWNsICpELCBNb2R1bGUgKk0pIHt9CisgIAorICAvLy8gXGJyaWVmIEFuIGF0dHJpYnV0ZSB3YXMgYWRkZWQgdG8gYSBSZWNvcmREZWNsCisgIC8vLworICAvLy8gXHBhcmFtIEF0dHIgVGhlIGF0dHJpYnV0ZSB0aGF0IHdhcyBhZGRlZCB0byB0aGUgUmVjb3JkCisgIC8vLworICAvLy8gXHBhcmFtIFJlY29yZCBUaGUgUmVjb3JkRGVjbCB0aGF0IGdvdCBhIG5ldyBhdHRyaWJ1dGUKKyAgdmlydHVhbCB2b2lkIEFkZGVkQXR0cmlidXRlVG9SZWNvcmQoY29uc3QgQXR0ciAqQXR0ciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlY29yZERlY2wgKlJlY29yZCkge30KKworICAvLyBOT1RFOiBJZiBuZXcgbWV0aG9kcyBhcmUgYWRkZWQgdGhleSBzaG91bGQgYWxzbyBiZSBhZGRlZCB0bworICAvLyBNdWx0aXBsZXhBU1RNdXRhdGlvbkxpc3RlbmVyLgorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0FTVFN0cnVjdHVyYWxFcXVpdmFsZW5jZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0FTVFN0cnVjdHVyYWxFcXVpdmFsZW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNjc0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQVNUU3RydWN0dXJhbEVxdWl2YWxlbmNlLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8vPT09LS0tIEFTVFN0cnVjdHVyYWxFcXVpdmFsZW5jZS5oIC0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBTdHJ1Y3R1cmFsRXF1aXZhbGVuY2VDb250ZXh0IGNsYXNzIHdoaWNoIGNoZWNrcyBmb3IKKy8vICBzdHJ1Y3R1cmFsIGVxdWl2YWxlbmNlIGJldHdlZW4gdHlwZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9BU1RTVFJVQ1RVUkFMRVFVSVZBTEVOQ0VfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9BU1RTVFJVQ1RVUkFMRVFVSVZBTEVOQ0VfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSA8ZGVxdWU+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBEZWNsOworY2xhc3MgRGlhZ25vc3RpY0J1aWxkZXI7CitjbGFzcyBRdWFsVHlwZTsKK2NsYXNzIFJlY29yZERlY2w7CitjbGFzcyBTb3VyY2VMb2NhdGlvbjsKKworc3RydWN0IFN0cnVjdHVyYWxFcXVpdmFsZW5jZUNvbnRleHQgeworICAvLy8gQVNUIGNvbnRleHRzIGZvciB3aGljaCB3ZSBhcmUgY2hlY2tpbmcgc3RydWN0dXJhbCBlcXVpdmFsZW5jZS4KKyAgQVNUQ29udGV4dCAmRnJvbUN0eCwgJlRvQ3R4OworCisgIC8vLyBUaGUgc2V0IG9mICJ0ZW50YXRpdmUiIGVxdWl2YWxlbmNlcyBiZXR3ZWVuIHR3byBjYW5vbmljYWwKKyAgLy8vIGRlY2xhcmF0aW9ucywgbWFwcGluZyBmcm9tIGEgZGVjbGFyYXRpb24gaW4gdGhlIGZpcnN0IGNvbnRleHQgdG8gdGhlCisgIC8vLyBkZWNsYXJhdGlvbiBpbiB0aGUgc2Vjb25kIGNvbnRleHQgdGhhdCB3ZSBiZWxpZXZlIHRvIGJlIGVxdWl2YWxlbnQuCisgIGxsdm06OkRlbnNlTWFwPERlY2wgKiwgRGVjbCAqPiBUZW50YXRpdmVFcXVpdmFsZW5jZXM7CisKKyAgLy8vIFF1ZXVlIG9mIGRlY2xhcmF0aW9ucyBpbiB0aGUgZmlyc3QgY29udGV4dCB3aG9zZSBlcXVpdmFsZW5jZQorICAvLy8gd2l0aCBhIGRlY2xhcmF0aW9uIGluIHRoZSBzZWNvbmQgY29udGV4dCBzdGlsbCBuZWVkcyB0byBiZSB2ZXJpZmllZC4KKyAgc3RkOjpkZXF1ZTxEZWNsICo+IERlY2xzVG9DaGVjazsKKworICAvLy8gRGVjbGFyYXRpb24gKGZyb20sIHRvKSBwYWlycyB0aGF0IGFyZSBrbm93biBub3QgdG8gYmUgZXF1aXZhbGVudAorICAvLy8gKHdoaWNoIHdlIGhhdmUgYWxyZWFkeSBjb21wbGFpbmVkIGFib3V0KS4KKyAgbGx2bTo6RGVuc2VTZXQ8c3RkOjpwYWlyPERlY2wgKiwgRGVjbCAqPj4gJk5vbkVxdWl2YWxlbnREZWNsczsKKworICAvLy8gV2hldGhlciB3ZSdyZSBiZWluZyBzdHJpY3QgYWJvdXQgdGhlIHNwZWxsaW5nIG9mIHR5cGVzIHdoZW4KKyAgLy8vIHVuaWZ5aW5nIHR3byB0eXBlcy4KKyAgYm9vbCBTdHJpY3RUeXBlU3BlbGxpbmc7CisKKyAgLy8vIFdoZXRoZXIgd2FybiBvciBlcnJvciBvbiB0YWcgdHlwZSBtaXNtYXRjaGVzLgorICBib29sIEVycm9yT25UYWdUeXBlTWlzbWF0Y2g7CisKKyAgLy8vIFdoZXRoZXIgdG8gY29tcGxhaW4gYWJvdXQgZmFpbHVyZXMuCisgIGJvb2wgQ29tcGxhaW47CisKKyAgLy8vIFxjIHRydWUgaWYgdGhlIGxhc3QgZGlhZ25vc3RpYyBjYW1lIGZyb20gVG9DdHguCisgIGJvb2wgTGFzdERpYWdGcm9tQzI7CisKKyAgU3RydWN0dXJhbEVxdWl2YWxlbmNlQ29udGV4dCgKKyAgICAgIEFTVENvbnRleHQgJkZyb21DdHgsIEFTVENvbnRleHQgJlRvQ3R4LAorICAgICAgbGx2bTo6RGVuc2VTZXQ8c3RkOjpwYWlyPERlY2wgKiwgRGVjbCAqPj4gJk5vbkVxdWl2YWxlbnREZWNscywKKyAgICAgIGJvb2wgU3RyaWN0VHlwZVNwZWxsaW5nID0gZmFsc2UsIGJvb2wgQ29tcGxhaW4gPSB0cnVlLAorICAgICAgYm9vbCBFcnJvck9uVGFnVHlwZU1pc21hdGNoID0gZmFsc2UpCisgICAgICA6IEZyb21DdHgoRnJvbUN0eCksIFRvQ3R4KFRvQ3R4KSwgTm9uRXF1aXZhbGVudERlY2xzKE5vbkVxdWl2YWxlbnREZWNscyksCisgICAgICAgIFN0cmljdFR5cGVTcGVsbGluZyhTdHJpY3RUeXBlU3BlbGxpbmcpLAorICAgICAgICBFcnJvck9uVGFnVHlwZU1pc21hdGNoKEVycm9yT25UYWdUeXBlTWlzbWF0Y2gpLCBDb21wbGFpbihDb21wbGFpbiksCisgICAgICAgIExhc3REaWFnRnJvbUMyKGZhbHNlKSB7fQorCisgIERpYWdub3N0aWNCdWlsZGVyIERpYWcxKFNvdXJjZUxvY2F0aW9uIExvYywgdW5zaWduZWQgRGlhZ0lEKTsKKyAgRGlhZ25vc3RpY0J1aWxkZXIgRGlhZzIoU291cmNlTG9jYXRpb24gTG9jLCB1bnNpZ25lZCBEaWFnSUQpOworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgdHdvIGRlY2xhcmF0aW9ucyBhcmUgc3RydWN0dXJhbGx5CisgIC8vLyBlcXVpdmFsZW50LgorICBib29sIElzU3RydWN0dXJhbGx5RXF1aXZhbGVudChEZWNsICpEMSwgRGVjbCAqRDIpOworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgdHdvIHR5cGVzIGFyZSBzdHJ1Y3R1cmFsbHkgZXF1aXZhbGVudC4KKyAgYm9vbCBJc1N0cnVjdHVyYWxseUVxdWl2YWxlbnQoUXVhbFR5cGUgVDEsIFF1YWxUeXBlIFQyKTsKKworICAvLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIGFub255bW91cyBzdHJ1Y3QvdW5pb24gd2l0aGluIGl0cworICAvLy8gY29udGV4dC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGlzIGFub255bW91cyBzdHJ1Y3QvdW5pb24gaW4gaXRzIGNvbnRleHQsCisgIC8vLyBpbmNsdWRpbmcgdGhlIG5leHQgYXNzaWduZWQgaW5kZXggKGlmIG5vbmUgb2YgdGhlbSBtYXRjaCkuIFJldHVybnMgYW4KKyAgLy8vIGVtcHR5IG9wdGlvbiBpZiB0aGUgY29udGV4dCBpcyBub3QgYSByZWNvcmQsIGkuZS4uIGlmIHRoZSBhbm9ueW1vdXMKKyAgLy8vIHN0cnVjdC91bmlvbiBpcyBhdCBuYW1lc3BhY2Ugb3IgYmxvY2sgc2NvcGUuCisgIC8vLworICAvLy8gRklYTUU6IFRoaXMgaXMgbmVlZGVkIGJ5IEFTVEltcG9ydGVyIGFuZCBBU1RTdHJ1Y3R1cmVFcXVpdmFsZW5jZS4gSXQKKyAgLy8vIHByb2JhYmx5IG1ha2VzIG1vcmUgc2Vuc2UgaW4gc29tZSBvdGhlciBjb21tb24gcGxhY2UgdGhlbiBoZXJlLgorICBzdGF0aWMgbGx2bTo6T3B0aW9uYWw8dW5zaWduZWQ+CisgIGZpbmRVbnRhZ2dlZFN0cnVjdE9yVW5pb25JbmRleChSZWNvcmREZWNsICpBbm9uKTsKKworcHJpdmF0ZToKKyAgLy8vIEZpbmlzaCBjaGVja2luZyBhbGwgb2YgdGhlIHN0cnVjdHVyYWwgZXF1aXZhbGVuY2VzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBGaW5pc2goKTsKK307Cit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19BU1RfQVNUU1RSVUNUVVJBTEVRVUlWQUxFTkNFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BU1RUeXBlVHJhaXRzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQVNUVHlwZVRyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZDYwYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQVNUVHlwZVRyYWl0cy5oCkBAIC0wLDAgKzEsNTE3IEBACisvLz09PS0tLSBBU1RUeXBlVHJhaXRzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBQcm92aWRlcyBhIGR5bmFtaWMgdHlwZSBpZGVudGlmaWVyIGFuZCBhIGR5bmFtaWNhbGx5IHR5cGVkIG5vZGUgY29udGFpbmVyCisvLyAgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhbiBBU1QgYmFzZSBub2RlIGF0IHJ1bnRpbWUgaW4gdGhlIHNhbWUgc3RvcmFnZSBpbgorLy8gIGEgdHlwZSBzYWZlIHdheS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0FTVFRZUEVUUkFJVFNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9BU1RUWVBFVFJBSVRTX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RGd2QuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9OZXN0ZWROYW1lU3BlY2lmaWVyLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXQuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVGVtcGxhdGVCYXNlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGVMb2MuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsaWduT2YuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworfQorCituYW1lc3BhY2UgY2xhbmcgeworCitzdHJ1Y3QgUHJpbnRpbmdQb2xpY3k7CisKK25hbWVzcGFjZSBhc3RfdHlwZV90cmFpdHMgeworCisvLy8gXGJyaWVmIEtpbmQgaWRlbnRpZmllci4KKy8vLworLy8vIEl0IGNhbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIGFueSBub2RlIGtpbmQgYW5kIGFsbG93cyBmb3IgcnVudGltZSB0eXBlCisvLy8gaGllcmFyY2h5IGNoZWNrcy4KKy8vLyBVc2UgZ2V0RnJvbU5vZGVLaW5kPFQ+KCkgdG8gY29uc3RydWN0IHRoZW0uCitjbGFzcyBBU1ROb2RlS2luZCB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgRW1wdHkgaWRlbnRpZmllci4gSXQgbWF0Y2hlcyBub3RoaW5nLgorICBBU1ROb2RlS2luZCgpIDogS2luZElkKE5LSV9Ob25lKSB7fQorCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIGlkZW50aWZpZXIgZm9yIFQuCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICBzdGF0aWMgQVNUTm9kZUtpbmQgZ2V0RnJvbU5vZGVLaW5kKCkgeworICAgIHJldHVybiBBU1ROb2RlS2luZChLaW5kVG9LaW5kSWQ8VD46OklkKTsKKyAgfQorCisgIC8vLyBceworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBpZGVudGlmaWVyIGZvciB0aGUgZHluYW1pYyB0eXBlIG9mIHRoZSBub2RlCisgIHN0YXRpYyBBU1ROb2RlS2luZCBnZXRGcm9tTm9kZShjb25zdCBEZWNsICZEKTsKKyAgc3RhdGljIEFTVE5vZGVLaW5kIGdldEZyb21Ob2RlKGNvbnN0IFN0bXQgJlMpOworICBzdGF0aWMgQVNUTm9kZUtpbmQgZ2V0RnJvbU5vZGUoY29uc3QgVHlwZSAmVCk7CisgIC8vLyBcfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBcYyB0cnVlIGlmIFxjIHRoaXMgYW5kIFxjIE90aGVyIHJlcHJlc2VudCB0aGUgc2FtZSBraW5kLgorICBib29sIGlzU2FtZShBU1ROb2RlS2luZCBPdGhlcikgY29uc3QgeworICAgIHJldHVybiBLaW5kSWQgIT0gTktJX05vbmUgJiYgS2luZElkID09IE90aGVyLktpbmRJZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBcYyB0cnVlIG9ubHkgZm9yIHRoZSBkZWZhdWx0IFxjIEFTVE5vZGVLaW5kKCkKKyAgYm9vbCBpc05vbmUoKSBjb25zdCB7IHJldHVybiBLaW5kSWQgPT0gTktJX05vbmU7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgXGMgdHJ1ZSBpZiBcYyB0aGlzIGlzIGEgYmFzZSBraW5kIG9mIChvciBzYW1lIGFzKSBcYyBPdGhlci4KKyAgLy8vIFxwYXJhbSBEaXN0YW5jZSBJZiBub24tbnVsbCwgdXNlZCB0byByZXR1cm4gdGhlIGRpc3RhbmNlIGJldHdlZW4gXGMgdGhpcworICAvLy8gYW5kIFxjIE90aGVyIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuCisgIGJvb2wgaXNCYXNlT2YoQVNUTm9kZUtpbmQgT3RoZXIsIHVuc2lnbmVkICpEaXN0YW5jZSA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBraW5kLgorICBTdHJpbmdSZWYgYXNTdHJpbmdSZWYoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFN0cmljdCB3ZWFrIG9yZGVyaW5nIGZvciBBU1ROb2RlS2luZC4KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQVNUTm9kZUtpbmQgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIEtpbmRJZCA8IE90aGVyLktpbmRJZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBtb3N0IGRlcml2ZWQgdHlwZSBiZXR3ZWVuIFxwIEtpbmQxIGFuZCBccCBLaW5kMi4KKyAgLy8vCisgIC8vLyBSZXR1cm4gQVNUTm9kZUtpbmQoKSBpZiB0aGV5IGFyZSBub3QgcmVsYXRlZC4KKyAgc3RhdGljIEFTVE5vZGVLaW5kIGdldE1vc3REZXJpdmVkVHlwZShBU1ROb2RlS2luZCBLaW5kMSwgQVNUTm9kZUtpbmQgS2luZDIpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBtb3N0IGRlcml2ZWQgY29tbW9uIGFuY2VzdG9yIGJldHdlZW4gS2luZDEgYW5kIEtpbmQyLgorICAvLy8KKyAgLy8vIFJldHVybiBBU1ROb2RlS2luZCgpIGlmIHRoZXkgYXJlIG5vdCByZWxhdGVkLgorICBzdGF0aWMgQVNUTm9kZUtpbmQgZ2V0TW9zdERlcml2ZWRDb21tb25BbmNlc3RvcihBU1ROb2RlS2luZCBLaW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUTm9kZUtpbmQgS2luZDIpOworCisgIC8vLyBcYnJpZWYgSG9va3MgZm9yIHVzaW5nIEFTVE5vZGVLaW5kIGFzIGEga2V5IGluIGEgRGVuc2VNYXAuCisgIHN0cnVjdCBEZW5zZU1hcEluZm8geworICAgIC8vIEFTVE5vZGVLaW5kKCkgaXMgYSBnb29kIGVtcHR5IGtleSBiZWNhdXNlIGl0IGlzIHJlcHJlc2VudGVkIGFzIGEgMC4KKyAgICBzdGF0aWMgaW5saW5lIEFTVE5vZGVLaW5kIGdldEVtcHR5S2V5KCkgeyByZXR1cm4gQVNUTm9kZUtpbmQoKTsgfQorICAgIC8vIE5LSV9OdW1iZXJPZktpbmRzIGlzIG5vdCBhIHZhbGlkIHZhbHVlLCBzbyBpdCBpcyBnb29kIGZvciBhCisgICAgLy8gdG9tYnN0b25lIGtleS4KKyAgICBzdGF0aWMgaW5saW5lIEFTVE5vZGVLaW5kIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICAgIHJldHVybiBBU1ROb2RlS2luZChOS0lfTnVtYmVyT2ZLaW5kcyk7CisgICAgfQorICAgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgQVNUTm9kZUtpbmQgJlZhbCkgeyByZXR1cm4gVmFsLktpbmRJZDsgfQorICAgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgQVNUTm9kZUtpbmQgJkxIUywgY29uc3QgQVNUTm9kZUtpbmQgJlJIUykgeworICAgICAgcmV0dXJuIExIUy5LaW5kSWQgPT0gUkhTLktpbmRJZDsKKyAgICB9CisgIH07CisKKyAgLy8vIENoZWNrIGlmIHRoZSBnaXZlbiBBU1ROb2RlS2luZCBpZGVudGlmaWVzIGEgdHlwZSB0aGF0IG9mZmVycyBwb2ludGVyCisgIC8vLyBpZGVudGl0eS4gVGhpcyBpcyB1c2VmdWwgZm9yIHRoZSBmYXN0IHBhdGggaW4gRHluVHlwZWROb2RlLgorICBib29sIGhhc1BvaW50ZXJJZGVudGl0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gS2luZElkID4gTktJX0xhc3RLaW5kV2l0aG91dFBvaW50ZXJJZGVudGl0eTsKKyAgfQorCitwcml2YXRlOgorICAvLy8gXGJyaWVmIEtpbmQgaWRzLgorICAvLy8KKyAgLy8vIEluY2x1ZGVzIGFsbCBwb3NzaWJsZSBiYXNlIGFuZCBkZXJpdmVkIGtpbmRzLgorICBlbnVtIE5vZGVLaW5kSWQgeworICAgIE5LSV9Ob25lLAorICAgIE5LSV9UZW1wbGF0ZUFyZ3VtZW50LAorICAgIE5LSV9UZW1wbGF0ZU5hbWUsCisgICAgTktJX05lc3RlZE5hbWVTcGVjaWZpZXJMb2MsCisgICAgTktJX1F1YWxUeXBlLAorICAgIE5LSV9UeXBlTG9jLAorICAgIE5LSV9MYXN0S2luZFdpdGhvdXRQb2ludGVySWRlbnRpdHkgPSBOS0lfVHlwZUxvYywKKyAgICBOS0lfQ1hYQ3RvckluaXRpYWxpemVyLAorICAgIE5LSV9OZXN0ZWROYW1lU3BlY2lmaWVyLAorICAgIE5LSV9EZWNsLAorI2RlZmluZSBERUNMKERFUklWRUQsIEJBU0UpIE5LSV8jI0RFUklWRUQjI0RlY2wsCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xOb2Rlcy5pbmMiCisgICAgTktJX1N0bXQsCisjZGVmaW5lIFNUTVQoREVSSVZFRCwgQkFTRSkgTktJXyMjREVSSVZFRCwKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdE5vZGVzLmluYyIKKyAgICBOS0lfVHlwZSwKKyNkZWZpbmUgVFlQRShERVJJVkVELCBCQVNFKSBOS0lfIyNERVJJVkVEIyNUeXBlLAorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTm9kZXMuZGVmIgorICAgIE5LSV9OdW1iZXJPZktpbmRzCisgIH07CisKKyAgLy8vIFxicmllZiBVc2UgZ2V0RnJvbU5vZGVLaW5kPFQ+KCkgdG8gY29uc3RydWN0IHRoZSBraW5kLgorICBBU1ROb2RlS2luZChOb2RlS2luZElkIEtpbmRJZCkgOiBLaW5kSWQoS2luZElkKSB7fQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBcYyB0cnVlIGlmIFxjIEJhc2UgaXMgYSBiYXNlIGtpbmQgb2YgKG9yIHNhbWUgYXMpIFxjCisgIC8vLyAgIERlcml2ZWQuCisgIC8vLyBccGFyYW0gRGlzdGFuY2UgSWYgbm9uLW51bGwsIHVzZWQgdG8gcmV0dXJuIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIFxjIEJhc2UKKyAgLy8vIGFuZCBcYyBEZXJpdmVkIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuCisgIHN0YXRpYyBib29sIGlzQmFzZU9mKE5vZGVLaW5kSWQgQmFzZSwgTm9kZUtpbmRJZCBEZXJpdmVkLCB1bnNpZ25lZCAqRGlzdGFuY2UpOworCisgIC8vLyBcYnJpZWYgSGVscGVyIG1ldGEtZnVuY3Rpb24gdG8gY29udmVydCBhIGtpbmQgVCB0byBpdHMgZW51bSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBUaGlzIHN0cnVjdCBpcyBzcGVjaWFsaXplZCBiZWxvdyBmb3IgYWxsIGtub3duIGtpbmRzLgorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IEtpbmRUb0tpbmRJZCB7CisgICAgc3RhdGljIGNvbnN0IE5vZGVLaW5kSWQgSWQgPSBOS0lfTm9uZTsKKyAgfTsKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHN0cnVjdCBLaW5kVG9LaW5kSWQ8Y29uc3QgVD4gOiBLaW5kVG9LaW5kSWQ8VD4ge307CisKKyAgLy8vIFxicmllZiBQZXIga2luZCBpbmZvLgorICBzdHJ1Y3QgS2luZEluZm8geworICAgIC8vLyBcYnJpZWYgVGhlIGlkIG9mIHRoZSBwYXJlbnQga2luZCwgb3IgTm9uZSBpZiBpdCBoYXMgbm8gcGFyZW50LgorICAgIE5vZGVLaW5kSWQgUGFyZW50SWQ7CisgICAgLy8vIFxicmllZiBOYW1lIG9mIHRoZSBraW5kLgorICAgIGNvbnN0IGNoYXIgKk5hbWU7CisgIH07CisgIHN0YXRpYyBjb25zdCBLaW5kSW5mbyBBbGxLaW5kSW5mb1tOS0lfTnVtYmVyT2ZLaW5kc107CisKKyAgTm9kZUtpbmRJZCBLaW5kSWQ7Cit9OworCisjZGVmaW5lIEtJTkRfVE9fS0lORF9JRChDbGFzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgQVNUTm9kZUtpbmQ6OktpbmRUb0tpbmRJZDxDbGFzcz4geyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgY29uc3QgTm9kZUtpbmRJZCBJZCA9IE5LSV8jI0NsYXNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07CitLSU5EX1RPX0tJTkRfSUQoQ1hYQ3RvckluaXRpYWxpemVyKQorS0lORF9UT19LSU5EX0lEKFRlbXBsYXRlQXJndW1lbnQpCitLSU5EX1RPX0tJTkRfSUQoVGVtcGxhdGVOYW1lKQorS0lORF9UT19LSU5EX0lEKE5lc3RlZE5hbWVTcGVjaWZpZXIpCitLSU5EX1RPX0tJTkRfSUQoTmVzdGVkTmFtZVNwZWNpZmllckxvYykKK0tJTkRfVE9fS0lORF9JRChRdWFsVHlwZSkKK0tJTkRfVE9fS0lORF9JRChUeXBlTG9jKQorS0lORF9UT19LSU5EX0lEKERlY2wpCitLSU5EX1RPX0tJTkRfSUQoU3RtdCkKK0tJTkRfVE9fS0lORF9JRChUeXBlKQorI2RlZmluZSBERUNMKERFUklWRUQsIEJBU0UpIEtJTkRfVE9fS0lORF9JRChERVJJVkVEIyNEZWNsKQorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsTm9kZXMuaW5jIgorI2RlZmluZSBTVE1UKERFUklWRUQsIEJBU0UpIEtJTkRfVE9fS0lORF9JRChERVJJVkVEKQorI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10Tm9kZXMuaW5jIgorI2RlZmluZSBUWVBFKERFUklWRUQsIEJBU0UpIEtJTkRfVE9fS0lORF9JRChERVJJVkVEIyNUeXBlKQorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTm9kZXMuZGVmIgorI3VuZGVmIEtJTkRfVE9fS0lORF9JRAorCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBBU1ROb2RlS2luZCBLKSB7CisgIE9TIDw8IEsuYXNTdHJpbmdSZWYoKTsKKyAgcmV0dXJuIE9TOworfQorCisvLy8gXGJyaWVmIEEgZHluYW1pY2FsbHkgdHlwZWQgQVNUIG5vZGUgY29udGFpbmVyLgorLy8vCisvLy8gU3RvcmVzIGFuIEFTVCBub2RlIGluIGEgdHlwZSBzYWZlIHdheS4gVGhpcyBhbGxvd3Mgd3JpdGluZyBjb2RlIHRoYXQKKy8vLyB3b3JrcyB3aXRoIGRpZmZlcmVudCBraW5kcyBvZiBBU1Qgbm9kZXMsIGRlc3BpdGUgdGhlIGZhY3QgdGhhdCB0aGV5IGRvbid0CisvLy8gaGF2ZSBhIGNvbW1vbiBiYXNlIGNsYXNzLgorLy8vCisvLy8gVXNlIFxjIGNyZWF0ZShOb2RlKSB0byBjcmVhdGUgYSBcYyBEeW5UeXBlZE5vZGUgZnJvbSBhbiBBU1Qgbm9kZSwKKy8vLyBhbmQgXGMgZ2V0PFQ+KCkgdG8gcmV0cmlldmUgdGhlIG5vZGUgYXMgdHlwZSBUIGlmIHRoZSB0eXBlcyBtYXRjaC4KKy8vLworLy8vIFNlZSBcYyBBU1ROb2RlS2luZCBmb3Igd2hpY2ggbm9kZSBiYXNlIHR5cGVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkOworLy8vIFlvdSBjYW4gY3JlYXRlIER5blR5cGVkTm9kZXMgZm9yIGFsbCBub2RlcyBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IG9mCisvLy8gdGhlIHN1cHBvcnRlZCBiYXNlIHR5cGVzLgorY2xhc3MgRHluVHlwZWROb2RlIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGEgXGMgRHluVHlwZWROb2RlIGZyb20gXGMgTm9kZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyBEeW5UeXBlZE5vZGUgY3JlYXRlKGNvbnN0IFQgJk5vZGUpIHsKKyAgICByZXR1cm4gQmFzZUNvbnZlcnRlcjxUPjo6Y3JlYXRlKE5vZGUpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc3RvcmVkIG5vZGUgYXMgdHlwZSBcYyBULgorICAvLy8KKyAgLy8vIFJldHVybnMgTlVMTCBpZiB0aGUgc3RvcmVkIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHR5cGUgdGhhdCBpcworICAvLy8gY29udmVydGlibGUgdG8gXGMgVC4KKyAgLy8vCisgIC8vLyBGb3IgdHlwZXMgdGhhdCBoYXZlIGlkZW50aXR5IHZpYSB0aGVpciBwb2ludGVyIGluIHRoZSBBU1QKKyAgLy8vIChsaWtlIFxjIFN0bXQsIFxjIERlY2wsIFxjIFR5cGUgYW5kIFxjIE5lc3RlZE5hbWVTcGVjaWZpZXIpIHRoZSByZXR1cm5lZAorICAvLy8gcG9pbnRlciBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZWQgQVNUIG5vZGUuCisgIC8vLyBGb3Igb3RoZXIgdHlwZXMgKGxpa2UgXGMgUXVhbFR5cGUpIHRoZSB2YWx1ZSBpcyBzdG9yZWQgZGlyZWN0bHkKKyAgLy8vIGluIHRoZSBcYyBEeW5UeXBlZE5vZGUsIGFuZCB0aGUgcmV0dXJuZWQgcG9pbnRlciBwb2ludHMgYXQKKyAgLy8vIHRoZSBzdG9yYWdlIGluc2lkZSBEeW5UeXBlZE5vZGUuIEZvciB0aG9zZSBub2RlcywgZG8gbm90CisgIC8vLyB1c2UgdGhlIHBvaW50ZXIgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhlIER5blR5cGVkTm9kZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGNvbnN0IFQgKmdldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQmFzZUNvbnZlcnRlcjxUPjo6Z2V0KE5vZGVLaW5kLCBTdG9yYWdlLmJ1ZmZlcik7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzdG9yZWQgbm9kZSBhcyB0eXBlIFxjIFQuCisgIC8vLworICAvLy8gU2ltaWxhciB0byBcYyBnZXQoKSwgYnV0IGFzc2VydHMgdGhhdCB0aGUgdHlwZSBpcyB3aGF0IHdlIGFyZSBleHBlY3RpbmcuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBjb25zdCBUICZnZXRVbmNoZWNrZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIEJhc2VDb252ZXJ0ZXI8VD46OmdldFVuY2hlY2tlZChOb2RlS2luZCwgU3RvcmFnZS5idWZmZXIpOworICB9CisKKyAgQVNUTm9kZUtpbmQgZ2V0Tm9kZUtpbmQoKSBjb25zdCB7IHJldHVybiBOb2RlS2luZDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhIHBvaW50ZXIgdGhhdCBpZGVudGlmaWVzIHRoZSBzdG9yZWQgQVNUIG5vZGUuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgQVNUIG5vZGVzLiBGb3IgQVNUIG5vZGVzCisgIC8vLyB0aGF0IGRvbid0IGhhdmUgYSBwb2ludGVyLWRlZmluZWQgaWRlbnRpdHkgaW5zaWRlIHRoZSBBU1QsIHRoaXMKKyAgLy8vIG1ldGhvZCByZXR1cm5zIE5VTEwuCisgIGNvbnN0IHZvaWQgKmdldE1lbW9pemF0aW9uRGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9kZUtpbmQuaGFzUG9pbnRlcklkZW50aXR5KCkKKyAgICAgICAgICAgICAgID8gKnJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqY29uc3QgKj4oU3RvcmFnZS5idWZmZXIpCisgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIFByaW50cyB0aGUgbm9kZSB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KKyAgdm9pZCBwcmludChsbHZtOjpyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQUCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEdW1wcyB0aGUgbm9kZSB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KKyAgdm9pZCBkdW1wKGxsdm06OnJhd19vc3RyZWFtICZPUywgU291cmNlTWFuYWdlciAmU00pIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRm9yIG5vZGVzIHdoaWNoIHJlcHJlc2VudCB0ZXh0dWFsIGVudGl0aWVzIGluIHRoZSBzb3VyY2UgY29kZSwKKyAgLy8vIHJldHVybiB0aGVpciBTb3VyY2VSYW5nZS4gIEZvciBhbGwgb3RoZXIgbm9kZXMsIHJldHVybiBTb3VyY2VSYW5nZSgpLgorICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0OworCisgIC8vLyBAeworICAvLy8gXGJyaWVmIEltcG9zZXMgYW4gb3JkZXIgb24gXGMgRHluVHlwZWROb2RlLgorICAvLy8KKyAgLy8vIFN1cHBvcnRzIGNvbXBhcmlzb24gb2Ygbm9kZXMgdGhhdCBzdXBwb3J0IG1lbW9pemF0aW9uLgorICAvLy8gRklYTUU6IEltcGxlbWVudCBjb21wYXJzaW9uIGZvciBvdGhlciBub2RlIHR5cGVzIChjdXJyZW50bHkKKyAgLy8vIG9ubHkgU3RtdCwgRGVjbCwgVHlwZSBhbmQgTmVzdGVkTmFtZVNwZWNpZmllciByZXR1cm4gbWVtb2l6YXRpb24gZGF0YSkuCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IER5blR5cGVkTm9kZSAmT3RoZXIpIGNvbnN0IHsKKyAgICBpZiAoIU5vZGVLaW5kLmlzU2FtZShPdGhlci5Ob2RlS2luZCkpCisgICAgICByZXR1cm4gTm9kZUtpbmQgPCBPdGhlci5Ob2RlS2luZDsKKworICAgIGlmIChBU1ROb2RlS2luZDo6Z2V0RnJvbU5vZGVLaW5kPFF1YWxUeXBlPigpLmlzU2FtZShOb2RlS2luZCkpCisgICAgICByZXR1cm4gZ2V0VW5jaGVja2VkPFF1YWxUeXBlPigpLmdldEFzT3BhcXVlUHRyKCkgPAorICAgICAgICAgICAgIE90aGVyLmdldFVuY2hlY2tlZDxRdWFsVHlwZT4oKS5nZXRBc09wYXF1ZVB0cigpOworCisgICAgaWYgKEFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZUtpbmQ8VHlwZUxvYz4oKS5pc1NhbWUoTm9kZUtpbmQpKSB7CisgICAgICBhdXRvIFRMQSA9IGdldFVuY2hlY2tlZDxUeXBlTG9jPigpOworICAgICAgYXV0byBUTEIgPSBPdGhlci5nZXRVbmNoZWNrZWQ8VHlwZUxvYz4oKTsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihUTEEuZ2V0VHlwZSgpLmdldEFzT3BhcXVlUHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVExBLmdldE9wYXF1ZURhdGEoKSkgPAorICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFRMQi5nZXRUeXBlKCkuZ2V0QXNPcGFxdWVQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTEIuZ2V0T3BhcXVlRGF0YSgpKTsKKyAgICB9CisKKyAgICBpZiAoQVNUTm9kZUtpbmQ6OmdldEZyb21Ob2RlS2luZDxOZXN0ZWROYW1lU3BlY2lmaWVyTG9jPigpLmlzU2FtZSgKKyAgICAgICAgICAgIE5vZGVLaW5kKSkgeworICAgICAgYXV0byBOTlNMQSA9IGdldFVuY2hlY2tlZDxOZXN0ZWROYW1lU3BlY2lmaWVyTG9jPigpOworICAgICAgYXV0byBOTlNMQiA9IE90aGVyLmdldFVuY2hlY2tlZDxOZXN0ZWROYW1lU3BlY2lmaWVyTG9jPigpOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKE5OU0xBLmdldE5lc3RlZE5hbWVTcGVjaWZpZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTlNMQS5nZXRPcGFxdWVEYXRhKCkpIDwKKyAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihOTlNMQi5nZXROZXN0ZWROYW1lU3BlY2lmaWVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk5TTEIuZ2V0T3BhcXVlRGF0YSgpKTsKKyAgICB9CisKKyAgICBhc3NlcnQoZ2V0TWVtb2l6YXRpb25EYXRhKCkgJiYgT3RoZXIuZ2V0TWVtb2l6YXRpb25EYXRhKCkpOworICAgIHJldHVybiBnZXRNZW1vaXphdGlvbkRhdGEoKSA8IE90aGVyLmdldE1lbW9pemF0aW9uRGF0YSgpOworICB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEeW5UeXBlZE5vZGUgJk90aGVyKSBjb25zdCB7CisgICAgLy8gRHluVHlwZWROb2RlOjpjcmVhdGUoKSBzdG9yZXMgdGhlIGV4YWN0IGtpbmQgb2YgdGhlIG5vZGUgaW4gTm9kZUtpbmQuCisgICAgLy8gSWYgdGhleSBjb250YWluIHRoZSBzYW1lIG5vZGUsIHRoZWlyIE5vZGVLaW5kIG11c3QgYmUgdGhlIHNhbWUuCisgICAgaWYgKCFOb2RlS2luZC5pc1NhbWUoT3RoZXIuTm9kZUtpbmQpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRklYTUU6IEltcGxlbWVudCBmb3Igb3RoZXIgdHlwZXMuCisgICAgaWYgKEFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZUtpbmQ8UXVhbFR5cGU+KCkuaXNTYW1lKE5vZGVLaW5kKSkKKyAgICAgIHJldHVybiBnZXRVbmNoZWNrZWQ8UXVhbFR5cGU+KCkgPT0gT3RoZXIuZ2V0VW5jaGVja2VkPFF1YWxUeXBlPigpOworCisgICAgaWYgKEFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZUtpbmQ8VHlwZUxvYz4oKS5pc1NhbWUoTm9kZUtpbmQpKQorICAgICAgcmV0dXJuIGdldFVuY2hlY2tlZDxUeXBlTG9jPigpID09IE90aGVyLmdldFVuY2hlY2tlZDxUeXBlTG9jPigpOworCisgICAgaWYgKEFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZUtpbmQ8TmVzdGVkTmFtZVNwZWNpZmllckxvYz4oKS5pc1NhbWUoTm9kZUtpbmQpKQorICAgICAgcmV0dXJuIGdldFVuY2hlY2tlZDxOZXN0ZWROYW1lU3BlY2lmaWVyTG9jPigpID09CisgICAgICAgICAgICAgT3RoZXIuZ2V0VW5jaGVja2VkPE5lc3RlZE5hbWVTcGVjaWZpZXJMb2M+KCk7CisKKyAgICBhc3NlcnQoZ2V0TWVtb2l6YXRpb25EYXRhKCkgJiYgT3RoZXIuZ2V0TWVtb2l6YXRpb25EYXRhKCkpOworICAgIHJldHVybiBnZXRNZW1vaXphdGlvbkRhdGEoKSA9PSBPdGhlci5nZXRNZW1vaXphdGlvbkRhdGEoKTsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgRHluVHlwZWROb2RlICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiAhb3BlcmF0b3I9PShPdGhlcik7CisgIH0KKyAgLy8vIEB9CisKKyAgLy8vIFxicmllZiBIb29rcyBmb3IgdXNpbmcgRHluVHlwZWROb2RlIGFzIGEga2V5IGluIGEgRGVuc2VNYXAuCisgIHN0cnVjdCBEZW5zZU1hcEluZm8geworICAgIHN0YXRpYyBpbmxpbmUgRHluVHlwZWROb2RlIGdldEVtcHR5S2V5KCkgeworICAgICAgRHluVHlwZWROb2RlIE5vZGU7CisgICAgICBOb2RlLk5vZGVLaW5kID0gQVNUTm9kZUtpbmQ6OkRlbnNlTWFwSW5mbzo6Z2V0RW1wdHlLZXkoKTsKKyAgICAgIHJldHVybiBOb2RlOworICAgIH0KKyAgICBzdGF0aWMgaW5saW5lIER5blR5cGVkTm9kZSBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgICBEeW5UeXBlZE5vZGUgTm9kZTsKKyAgICAgIE5vZGUuTm9kZUtpbmQgPSBBU1ROb2RlS2luZDo6RGVuc2VNYXBJbmZvOjpnZXRUb21ic3RvbmVLZXkoKTsKKyAgICAgIHJldHVybiBOb2RlOworICAgIH0KKyAgICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IER5blR5cGVkTm9kZSAmVmFsKSB7CisgICAgICAvLyBGSVhNRTogQWRkIGhhc2hpbmcgc3VwcG9ydCBmb3IgdGhlIHJlbWFpbmluZyB0eXBlcy4KKyAgICAgIGlmIChBU1ROb2RlS2luZDo6Z2V0RnJvbU5vZGVLaW5kPFR5cGVMb2M+KCkuaXNTYW1lKFZhbC5Ob2RlS2luZCkpIHsKKyAgICAgICAgYXV0byBUTCA9IFZhbC5nZXRVbmNoZWNrZWQ8VHlwZUxvYz4oKTsKKyAgICAgICAgcmV0dXJuIGxsdm06Omhhc2hfY29tYmluZShUTC5nZXRUeXBlKCkuZ2V0QXNPcGFxdWVQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTC5nZXRPcGFxdWVEYXRhKCkpOworICAgICAgfQorCisgICAgICBpZiAoQVNUTm9kZUtpbmQ6OmdldEZyb21Ob2RlS2luZDxOZXN0ZWROYW1lU3BlY2lmaWVyTG9jPigpLmlzU2FtZSgKKyAgICAgICAgICAgICAgVmFsLk5vZGVLaW5kKSkgeworICAgICAgICBhdXRvIE5OU0wgPSBWYWwuZ2V0VW5jaGVja2VkPE5lc3RlZE5hbWVTcGVjaWZpZXJMb2M+KCk7CisgICAgICAgIHJldHVybiBsbHZtOjpoYXNoX2NvbWJpbmUoTk5TTC5nZXROZXN0ZWROYW1lU3BlY2lmaWVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk5TTC5nZXRPcGFxdWVEYXRhKCkpOworICAgICAgfQorCisgICAgICBhc3NlcnQoVmFsLmdldE1lbW9pemF0aW9uRGF0YSgpKTsKKyAgICAgIHJldHVybiBsbHZtOjpoYXNoX3ZhbHVlKFZhbC5nZXRNZW1vaXphdGlvbkRhdGEoKSk7CisgICAgfQorICAgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgRHluVHlwZWROb2RlICZMSFMsIGNvbnN0IER5blR5cGVkTm9kZSAmUkhTKSB7CisgICAgICBhdXRvIEVtcHR5ID0gQVNUTm9kZUtpbmQ6OkRlbnNlTWFwSW5mbzo6Z2V0RW1wdHlLZXkoKTsKKyAgICAgIGF1dG8gVG9tYlN0b25lID0gQVNUTm9kZUtpbmQ6OkRlbnNlTWFwSW5mbzo6Z2V0VG9tYnN0b25lS2V5KCk7CisgICAgICByZXR1cm4gKEFTVE5vZGVLaW5kOjpEZW5zZU1hcEluZm86OmlzRXF1YWwoTEhTLk5vZGVLaW5kLCBFbXB0eSkgJiYKKyAgICAgICAgICAgICAgQVNUTm9kZUtpbmQ6OkRlbnNlTWFwSW5mbzo6aXNFcXVhbChSSFMuTm9kZUtpbmQsIEVtcHR5KSkgfHwKKyAgICAgICAgICAgICAoQVNUTm9kZUtpbmQ6OkRlbnNlTWFwSW5mbzo6aXNFcXVhbChMSFMuTm9kZUtpbmQsIFRvbWJTdG9uZSkgJiYKKyAgICAgICAgICAgICAgQVNUTm9kZUtpbmQ6OkRlbnNlTWFwSW5mbzo6aXNFcXVhbChSSFMuTm9kZUtpbmQsIFRvbWJTdG9uZSkpIHx8CisgICAgICAgICAgICAgTEhTID09IFJIUzsKKyAgICB9CisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgVGFrZXMgY2FyZSBvZiBjb252ZXJ0aW5nIGZyb20gYW5kIHRvIFxjIFQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBFbmFibGVyVCA9IHZvaWQ+IHN0cnVjdCBCYXNlQ29udmVydGVyOworCisgIC8vLyBcYnJpZWYgQ29udmVydGVyIHRoYXQgdXNlcyBkeW5fY2FzdDxUPiBmcm9tIGEgc3RvcmVkIEJhc2VUKi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEJhc2VUPiBzdHJ1Y3QgRHluQ2FzdFB0ckNvbnZlcnRlciB7CisgICAgc3RhdGljIGNvbnN0IFQgKmdldChBU1ROb2RlS2luZCBOb2RlS2luZCwgY29uc3QgY2hhciBTdG9yYWdlW10pIHsKKyAgICAgIGlmIChBU1ROb2RlS2luZDo6Z2V0RnJvbU5vZGVLaW5kPFQ+KCkuaXNCYXNlT2YoTm9kZUtpbmQpKQorICAgICAgICByZXR1cm4gJmdldFVuY2hlY2tlZChOb2RlS2luZCwgU3RvcmFnZSk7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RhdGljIGNvbnN0IFQgJmdldFVuY2hlY2tlZChBU1ROb2RlS2luZCBOb2RlS2luZCwgY29uc3QgY2hhciBTdG9yYWdlW10pIHsKKyAgICAgIGFzc2VydChBU1ROb2RlS2luZDo6Z2V0RnJvbU5vZGVLaW5kPFQ+KCkuaXNCYXNlT2YoTm9kZUtpbmQpKTsKKyAgICAgIHJldHVybiAqY2FzdDxUPihzdGF0aWNfY2FzdDxjb25zdCBCYXNlVCAqPigKKyAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkICpjb25zdCAqPihTdG9yYWdlKSkpOworICAgIH0KKyAgICBzdGF0aWMgRHluVHlwZWROb2RlIGNyZWF0ZShjb25zdCBCYXNlVCAmTm9kZSkgeworICAgICAgRHluVHlwZWROb2RlIFJlc3VsdDsKKyAgICAgIFJlc3VsdC5Ob2RlS2luZCA9IEFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZShOb2RlKTsKKyAgICAgIG5ldyAoUmVzdWx0LlN0b3JhZ2UuYnVmZmVyKSBjb25zdCB2b2lkICooJk5vZGUpOworICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgIH07CisKKyAgLy8vIFxicmllZiBDb252ZXJ0ZXIgdGhhdCBzdG9yZXMgVCogKGJ5IHBvaW50ZXIpLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFB0ckNvbnZlcnRlciB7CisgICAgc3RhdGljIGNvbnN0IFQgKmdldChBU1ROb2RlS2luZCBOb2RlS2luZCwgY29uc3QgY2hhciBTdG9yYWdlW10pIHsKKyAgICAgIGlmIChBU1ROb2RlS2luZDo6Z2V0RnJvbU5vZGVLaW5kPFQ+KCkuaXNTYW1lKE5vZGVLaW5kKSkKKyAgICAgICAgcmV0dXJuICZnZXRVbmNoZWNrZWQoTm9kZUtpbmQsIFN0b3JhZ2UpOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHN0YXRpYyBjb25zdCBUICZnZXRVbmNoZWNrZWQoQVNUTm9kZUtpbmQgTm9kZUtpbmQsIGNvbnN0IGNoYXIgU3RvcmFnZVtdKSB7CisgICAgICBhc3NlcnQoQVNUTm9kZUtpbmQ6OmdldEZyb21Ob2RlS2luZDxUPigpLmlzU2FtZShOb2RlS2luZCkpOworICAgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBUICo+KAorICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQgKmNvbnN0ICo+KFN0b3JhZ2UpKTsKKyAgICB9CisgICAgc3RhdGljIER5blR5cGVkTm9kZSBjcmVhdGUoY29uc3QgVCAmTm9kZSkgeworICAgICAgRHluVHlwZWROb2RlIFJlc3VsdDsKKyAgICAgIFJlc3VsdC5Ob2RlS2luZCA9IEFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZUtpbmQ8VD4oKTsKKyAgICAgIG5ldyAoUmVzdWx0LlN0b3JhZ2UuYnVmZmVyKSBjb25zdCB2b2lkICooJk5vZGUpOworICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgIH07CisKKyAgLy8vIFxicmllZiBDb252ZXJ0ZXIgdGhhdCBzdG9yZXMgVCAoYnkgdmFsdWUpLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFZhbHVlQ29udmVydGVyIHsKKyAgICBzdGF0aWMgY29uc3QgVCAqZ2V0KEFTVE5vZGVLaW5kIE5vZGVLaW5kLCBjb25zdCBjaGFyIFN0b3JhZ2VbXSkgeworICAgICAgaWYgKEFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZUtpbmQ8VD4oKS5pc1NhbWUoTm9kZUtpbmQpKQorICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUICo+KFN0b3JhZ2UpOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHN0YXRpYyBjb25zdCBUICZnZXRVbmNoZWNrZWQoQVNUTm9kZUtpbmQgTm9kZUtpbmQsIGNvbnN0IGNoYXIgU3RvcmFnZVtdKSB7CisgICAgICBhc3NlcnQoQVNUTm9kZUtpbmQ6OmdldEZyb21Ob2RlS2luZDxUPigpLmlzU2FtZShOb2RlS2luZCkpOworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4oU3RvcmFnZSk7CisgICAgfQorICAgIHN0YXRpYyBEeW5UeXBlZE5vZGUgY3JlYXRlKGNvbnN0IFQgJk5vZGUpIHsKKyAgICAgIER5blR5cGVkTm9kZSBSZXN1bHQ7CisgICAgICBSZXN1bHQuTm9kZUtpbmQgPSBBU1ROb2RlS2luZDo6Z2V0RnJvbU5vZGVLaW5kPFQ+KCk7CisgICAgICBuZXcgKFJlc3VsdC5TdG9yYWdlLmJ1ZmZlcikgVChOb2RlKTsKKyAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorICB9OworCisgIEFTVE5vZGVLaW5kIE5vZGVLaW5kOworCisgIC8vLyBcYnJpZWYgU3RvcmVzIHRoZSBkYXRhIG9mIHRoZSBub2RlLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB3ZSBjYW4gc3RvcmUgXGMgRGVjbHMsIFxjIFN0bXRzLCBcYyBUeXBlcywKKyAgLy8vIFxjIE5lc3RlZE5hbWVTcGVjaWZpZXJzIGFuZCBcYyBDWFhDdG9ySW5pdGlhbGl6ZXIgYnkgcG9pbnRlciBhcyB0aGV5IGFyZQorICAvLy8gZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgcG9pbnRlcnMgcG9pbnRpbmcgdG8gZGVkaWNhdGVkIHN0b3JhZ2UgaW4gdGhlIEFTVC4KKyAgLy8vIFxjIFF1YWxUeXBlcywgXGMgTmVzdGVkTmFtZVNwZWNpZmllckxvY3MsIFxjIFR5cGVMb2NzIGFuZAorICAvLy8gXGMgVGVtcGxhdGVBcmd1bWVudHMgb24gdGhlIG90aGVyIGhhbmQgZG8gbm90IGhhdmUgc3RvcmFnZSBvciB1bmlxdWUKKyAgLy8vIHBvaW50ZXJzIGFuZCB0aHVzIG5lZWQgdG8gYmUgc3RvcmVkIGJ5IHZhbHVlLgorICBsbHZtOjpBbGlnbmVkQ2hhckFycmF5VW5pb248Y29uc3Qgdm9pZCAqLCBUZW1wbGF0ZUFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYywgUXVhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlTG9jPiBTdG9yYWdlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgRHluVHlwZWROb2RlOjpCYXNlQ29udmVydGVyPAorICAgIFQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfYmFzZV9vZjxEZWNsLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgIDogcHVibGljIER5bkNhc3RQdHJDb252ZXJ0ZXI8VCwgRGVjbD4ge307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IER5blR5cGVkTm9kZTo6QmFzZUNvbnZlcnRlcjwKKyAgICBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Jhc2Vfb2Y8U3RtdCwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICA6IHB1YmxpYyBEeW5DYXN0UHRyQ29udmVydGVyPFQsIFN0bXQ+IHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBEeW5UeXBlZE5vZGU6OkJhc2VDb252ZXJ0ZXI8CisgICAgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19iYXNlX29mPFR5cGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgOiBwdWJsaWMgRHluQ2FzdFB0ckNvbnZlcnRlcjxULCBUeXBlPiB7fTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBEeW5UeXBlZE5vZGU6OkJhc2VDb252ZXJ0ZXI8CisgICAgTmVzdGVkTmFtZVNwZWNpZmllciwgdm9pZD4gOiBwdWJsaWMgUHRyQ29udmVydGVyPE5lc3RlZE5hbWVTcGVjaWZpZXI+IHt9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IER5blR5cGVkTm9kZTo6QmFzZUNvbnZlcnRlcjwKKyAgICBDWFhDdG9ySW5pdGlhbGl6ZXIsIHZvaWQ+IDogcHVibGljIFB0ckNvbnZlcnRlcjxDWFhDdG9ySW5pdGlhbGl6ZXI+IHt9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IER5blR5cGVkTm9kZTo6QmFzZUNvbnZlcnRlcjwKKyAgICBUZW1wbGF0ZUFyZ3VtZW50LCB2b2lkPiA6IHB1YmxpYyBWYWx1ZUNvbnZlcnRlcjxUZW1wbGF0ZUFyZ3VtZW50PiB7fTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBEeW5UeXBlZE5vZGU6OkJhc2VDb252ZXJ0ZXI8CisgICAgVGVtcGxhdGVOYW1lLCB2b2lkPiA6IHB1YmxpYyBWYWx1ZUNvbnZlcnRlcjxUZW1wbGF0ZU5hbWU+IHt9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IER5blR5cGVkTm9kZTo6QmFzZUNvbnZlcnRlcjwKKyAgICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jLAorICAgIHZvaWQ+IDogcHVibGljIFZhbHVlQ29udmVydGVyPE5lc3RlZE5hbWVTcGVjaWZpZXJMb2M+IHt9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IER5blR5cGVkTm9kZTo6QmFzZUNvbnZlcnRlcjxRdWFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZD4gOiBwdWJsaWMgVmFsdWVDb252ZXJ0ZXI8UXVhbFR5cGU+IHt9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IER5blR5cGVkTm9kZTo6QmFzZUNvbnZlcnRlcjwKKyAgICBUeXBlTG9jLCB2b2lkPiA6IHB1YmxpYyBWYWx1ZUNvbnZlcnRlcjxUeXBlTG9jPiB7fTsKKworLy8gVGhlIG9ubHkgb3BlcmF0aW9uIHdlIGFsbG93IG9uIHVuc3VwcG9ydGVkIHR5cGVzIGlzIFxjIGdldC4KKy8vIFRoaXMgYWxsb3dzIHRvIGNvbnZlbmllbnRseSB1c2UgXGMgRHluVHlwZWROb2RlIHdoZW4gaGF2aW5nIGFuIGFyYml0cmFyeQorLy8gQVNUIG5vZGUgdGhhdCBpcyBub3Qgc3VwcG9ydGVkLCBidXQgcHJldmVudHMgbWlzdXNlIC0gYSB1c2VyIGNhbm5vdCBjcmVhdGUKKy8vIGEgRHluVHlwZWROb2RlIGZyb20gYXJiaXRyYXJ5IHR5cGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEVuYWJsZXJUPiBzdHJ1Y3QgRHluVHlwZWROb2RlOjpCYXNlQ29udmVydGVyIHsKKyAgc3RhdGljIGNvbnN0IFQgKmdldChBU1ROb2RlS2luZCBOb2RlS2luZCwgY29uc3QgY2hhciBTdG9yYWdlW10pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGFzdF90eXBlX3RyYWl0cworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBEZW5zZU1hcEluZm88Y2xhbmc6OmFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQ+CisgICAgOiBjbGFuZzo6YXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZDo6RGVuc2VNYXBJbmZvIHt9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IERlbnNlTWFwSW5mbzxjbGFuZzo6YXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGU+CisgICAgOiBjbGFuZzo6YXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGU6OkRlbnNlTWFwSW5mbyB7fTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0FTVFVucmVzb2x2ZWRTZXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BU1RVbnJlc29sdmVkU2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5M2FlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BU1RVbnJlc29sdmVkU2V0LmgKQEAgLTAsMCArMSwxMTcgQEAKKy8vPT09LSBBU1RVbnJlc29sdmVkU2V0LmggLSBVbnJlc29sdmVkIHNldHMgb2YgZGVjbGFyYXRpb25zIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBwcm92aWRlcyBhbiBVbnJlc29sdmVkU2V0LWxpa2UgY2xhc3MsIHdob3NlIGNvbnRlbnRzIGFyZQorLy8gIGFsbG9jYXRlZCB1c2luZyB0aGUgYWxsb2NhdG9yIGFzc29jaWF0ZWQgd2l0aCBhbiBBU1RDb250ZXh0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfQVNUVU5SRVNPTFZFRFNFVF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX0FTVFVOUkVTT0xWRURTRVRfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVFZlY3Rvci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQWNjZXNzUGFpci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9VbnJlc29sdmVkU2V0LmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU3BlY2lmaWVycy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgTmFtZWREZWNsOworCisvLy8gXGJyaWVmIEFuIFVucmVzb2x2ZWRTZXQtbGlrZSBjbGFzcyB3aGljaCB1c2VzIHRoZSBBU1RDb250ZXh0J3MgYWxsb2NhdG9yLgorY2xhc3MgQVNUVW5yZXNvbHZlZFNldCB7CisgIGZyaWVuZCBjbGFzcyBMYXp5QVNUVW5yZXNvbHZlZFNldDsKKworICBzdHJ1Y3QgRGVjbHNUeSA6IEFTVFZlY3RvcjxEZWNsQWNjZXNzUGFpcj4geworICAgIERlY2xzVHkoKSA9IGRlZmF1bHQ7CisgICAgRGVjbHNUeShBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBOKSA6IEFTVFZlY3RvcjxEZWNsQWNjZXNzUGFpcj4oQywgTikge30KKworICAgIGJvb2wgaXNMYXp5KCkgY29uc3QgeyByZXR1cm4gZ2V0VGFnKCk7IH0KKyAgICB2b2lkIHNldExhenkoYm9vbCBMYXp5KSB7IHNldFRhZyhMYXp5KTsgfQorICB9OworCisgIERlY2xzVHkgRGVjbHM7CisKK3B1YmxpYzoKKyAgQVNUVW5yZXNvbHZlZFNldCgpID0gZGVmYXVsdDsKKyAgQVNUVW5yZXNvbHZlZFNldChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBOKSA6IERlY2xzKEMsIE4pIHt9CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBVbnJlc29sdmVkU2V0SXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gVW5yZXNvbHZlZFNldEl0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gaXRlcmF0b3IoRGVjbHMuYmVnaW4oKSk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IoRGVjbHMuZW5kKCkpOyB9CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihEZWNscy5iZWdpbigpKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihEZWNscy5lbmQoKSk7IH0KKworICB2b2lkIGFkZERlY2woQVNUQ29udGV4dCAmQywgTmFtZWREZWNsICpELCBBY2Nlc3NTcGVjaWZpZXIgQVMpIHsKKyAgICBEZWNscy5wdXNoX2JhY2soRGVjbEFjY2Vzc1BhaXI6Om1ha2UoRCwgQVMpLCBDKTsKKyAgfQorCisgIC8vLyBSZXBsYWNlcyB0aGUgZ2l2ZW4gZGVjbGFyYXRpb24gd2l0aCB0aGUgbmV3IG9uZSwgb25jZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIHRydWUgaWYgdGhlIHNldCBjaGFuZ2VkCisgIGJvb2wgcmVwbGFjZShjb25zdCBOYW1lZERlY2wgKk9sZCwgTmFtZWREZWNsICpOZXcsIEFjY2Vzc1NwZWNpZmllciBBUykgeworICAgIGZvciAoRGVjbHNUeTo6aXRlcmF0b3IgSSA9IERlY2xzLmJlZ2luKCksIEUgPSBEZWNscy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmIChJLT5nZXREZWNsKCkgPT0gT2xkKSB7CisgICAgICAgIEktPnNldChOZXcsIEFTKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZvaWQgZXJhc2UodW5zaWduZWQgSSkgeyBEZWNsc1tJXSA9IERlY2xzLnBvcF9iYWNrX3ZhbCgpOyB9CisKKyAgdm9pZCBjbGVhcigpIHsgRGVjbHMuY2xlYXIoKTsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBEZWNscy5lbXB0eSgpOyB9CisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBEZWNscy5zaXplKCk7IH0KKworICB2b2lkIHJlc2VydmUoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgTikgeworICAgIERlY2xzLnJlc2VydmUoQywgTik7CisgIH0KKworICB2b2lkIGFwcGVuZChBU1RDb250ZXh0ICZDLCBpdGVyYXRvciBJLCBpdGVyYXRvciBFKSB7CisgICAgRGVjbHMuYXBwZW5kKEMsIEkuSSwgRS5JKTsKKyAgfQorCisgIERlY2xBY2Nlc3NQYWlyICZvcGVyYXRvcltdKHVuc2lnbmVkIEkpIHsgcmV0dXJuIERlY2xzW0ldOyB9CisgIGNvbnN0IERlY2xBY2Nlc3NQYWlyICZvcGVyYXRvcltdKHVuc2lnbmVkIEkpIGNvbnN0IHsgcmV0dXJuIERlY2xzW0ldOyB9Cit9OworCisvLy8gXGJyaWVmIEFuIFVucmVzb2x2ZWRTZXQtbGlrZSBjbGFzcyB0aGF0IG1pZ2h0IG5vdCBoYXZlIGJlZW4gbG9hZGVkIGZyb20gdGhlCisvLy8gZXh0ZXJuYWwgQVNUIHNvdXJjZSB5ZXQuCitjbGFzcyBMYXp5QVNUVW5yZXNvbHZlZFNldCB7CisgIG11dGFibGUgQVNUVW5yZXNvbHZlZFNldCBJbXBsOworCisgIHZvaWQgZ2V0RnJvbUV4dGVybmFsU291cmNlKEFTVENvbnRleHQgJkMpIGNvbnN0OworCitwdWJsaWM6CisgIEFTVFVucmVzb2x2ZWRTZXQgJmdldChBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgICAgaWYgKEltcGwuRGVjbHMuaXNMYXp5KCkpCisgICAgICBnZXRGcm9tRXh0ZXJuYWxTb3VyY2UoQyk7CisgICAgcmV0dXJuIEltcGw7CisgIH0KKworICB2b2lkIHJlc2VydmUoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgTikgeyBJbXBsLnJlc2VydmUoQywgTik7IH0KKworICB2b2lkIGFkZExhenlEZWNsKEFTVENvbnRleHQgJkMsIHVpbnRwdHJfdCBJRCwgQWNjZXNzU3BlY2lmaWVyIEFTKSB7CisgICAgYXNzZXJ0KEltcGwuZW1wdHkoKSB8fCBJbXBsLkRlY2xzLmlzTGF6eSgpKTsKKyAgICBJbXBsLkRlY2xzLnNldExhenkodHJ1ZSk7CisgICAgSW1wbC5hZGREZWNsKEMsIHJlaW50ZXJwcmV0X2Nhc3Q8TmFtZWREZWNsICo+KElEIDw8IDIpLCBBUyk7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9BU1RVTlJFU09MVkVEU0VUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BU1RWZWN0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BU1RWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGNkNmI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0FTVFZlY3Rvci5oCkBAIC0wLDAgKzEsNDEwIEBACisvLz09PS0gQVNUVmVjdG9yLmggLSBWZWN0b3IgdGhhdCB1c2VzIEFTVENvbnRleHQgZm9yIGFsbG9jYXRpb24gLS0tKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgcHJvdmlkZXMgQVNUVmVjdG9yLCBhIHZlY3RvciAgQURUIHdob3NlIGNvbnRlbnRzIGFyZQorLy8gIGFsbG9jYXRlZCB1c2luZyB0aGUgYWxsb2NhdG9yIGFzc29jaWF0ZWQgd2l0aCBhbiBBU1RDb250ZXh0Li4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBGSVhNRTogTW9zdCBvZiB0aGlzIGlzIGNvcHktYW5kLXBhc3RlIGZyb20gQnVtcFZlY3Rvci5oIGFuZCBTbWFsbFZlY3Rvci5oLgorLy8gV2UgY2FuIHJlZmFjdG9yIHRoaXMgY29yZSBsb2dpYyBpbnRvIHNvbWV0aGluZyBjb21tb24uCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfQVNUVkVDVE9SX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfQVNUVkVDVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBU1RDb250ZXh0OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQVNUVmVjdG9yIHsKK3ByaXZhdGU6CisgIFQgKkJlZ2luID0gbnVsbHB0cjsKKyAgVCAqRW5kID0gbnVsbHB0cjsKKyAgbGx2bTo6UG9pbnRlckludFBhaXI8VCAqLCAxLCBib29sPiBDYXBhY2l0eTsKKworICB2b2lkIHNldEVuZChUICpQKSB7IHRoaXMtPkVuZCA9IFA7IH0KKworcHJvdGVjdGVkOgorICAvLyBNYWtlIGEgdGFnIGJpdCBhdmFpbGFibGUgdG8gdXNlcnMgb2YgdGhpcyBjbGFzcy4KKyAgLy8gRklYTUU6IFRoaXMgaXMgYSBob3JyaWJsZSBoYWNrLgorICBib29sIGdldFRhZygpIGNvbnN0IHsgcmV0dXJuIENhcGFjaXR5LmdldEludCgpOyB9CisgIHZvaWQgc2V0VGFnKGJvb2wgQikgeyBDYXBhY2l0eS5zZXRJbnQoQik7IH0KKworcHVibGljOgorICAvLyBEZWZhdWx0IGN0b3IgLSBJbml0aWFsaXplIHRvIGVtcHR5LgorICBBU1RWZWN0b3IoKSA6IENhcGFjaXR5KG51bGxwdHIsIGZhbHNlKSB7fQorCisgIEFTVFZlY3RvcihBU1RWZWN0b3IgJiZPKSA6IEJlZ2luKE8uQmVnaW4pLCBFbmQoTy5FbmQpLCBDYXBhY2l0eShPLkNhcGFjaXR5KSB7CisgICAgTy5CZWdpbiA9IE8uRW5kID0gbnVsbHB0cjsKKyAgICBPLkNhcGFjaXR5LnNldFBvaW50ZXIobnVsbHB0cik7CisgICAgTy5DYXBhY2l0eS5zZXRJbnQoZmFsc2UpOworICB9CisKKyAgQVNUVmVjdG9yKGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE4pIDogQ2FwYWNpdHkobnVsbHB0ciwgZmFsc2UpIHsKKyAgICByZXNlcnZlKEMsIE4pOworICB9CisKKyAgQVNUVmVjdG9yICZvcGVyYXRvcj0oQVNUVmVjdG9yICYmUkhTKSB7CisgICAgQVNUVmVjdG9yIE8oc3RkOjptb3ZlKFJIUykpOworCisgICAgdXNpbmcgc3RkOjpzd2FwOworCisgICAgc3dhcChCZWdpbiwgTy5CZWdpbik7CisgICAgc3dhcChFbmQsIE8uRW5kKTsKKyAgICBzd2FwKENhcGFjaXR5LCBPLkNhcGFjaXR5KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB+QVNUVmVjdG9yKCkgeworICAgIGlmIChzdGQ6OmlzX2NsYXNzPFQ+Ojp2YWx1ZSkgeworICAgICAgLy8gRGVzdHJveSB0aGUgY29uc3RydWN0ZWQgZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KKyAgICAgIGRlc3Ryb3lfcmFuZ2UoQmVnaW4sIEVuZCk7CisgICAgfQorICB9CisKKyAgdXNpbmcgc2l6ZV90eXBlID0gc2l6ZV90OworICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBwdHJkaWZmX3Q7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBUOworICB1c2luZyBpdGVyYXRvciA9IFQgKjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBjb25zdCBUICo7CisKKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciA9IHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj47CisgIHVzaW5nIHJldmVyc2VfaXRlcmF0b3IgPSBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+OworCisgIHVzaW5nIHJlZmVyZW5jZSA9IFQgJjsKKyAgdXNpbmcgY29uc3RfcmVmZXJlbmNlID0gY29uc3QgVCAmOworICB1c2luZyBwb2ludGVyID0gVCAqOworICB1c2luZyBjb25zdF9wb2ludGVyID0gY29uc3QgVCAqOworCisgIC8vIGZvcndhcmQgaXRlcmF0b3IgY3JlYXRpb24gbWV0aG9kcy4KKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBCZWdpbjsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEJlZ2luOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIEVuZDsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBFbmQ7IH0KKworICAvLyByZXZlcnNlIGl0ZXJhdG9yIGNyZWF0aW9uIG1ldGhvZHMuCisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0eyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgICAgICAgICAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTt9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEJlZ2luID09IEVuZDsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEVuZC1CZWdpbjsgfQorCisgIHJlZmVyZW5jZSBvcGVyYXRvcltdKHVuc2lnbmVkIGlkeCkgeworICAgIGFzc2VydChCZWdpbiArIGlkeCA8IEVuZCk7CisgICAgcmV0dXJuIEJlZ2luW2lkeF07CisgIH0KKyAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10odW5zaWduZWQgaWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KEJlZ2luICsgaWR4IDwgRW5kKTsKKyAgICByZXR1cm4gQmVnaW5baWR4XTsKKyAgfQorCisgIHJlZmVyZW5jZSBmcm9udCgpIHsKKyAgICByZXR1cm4gYmVnaW4oKVswXTsKKyAgfQorICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGJlZ2luKClbMF07CisgIH0KKworICByZWZlcmVuY2UgYmFjaygpIHsKKyAgICByZXR1cm4gZW5kKClbLTFdOworICB9CisgIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgeworICAgIHJldHVybiBlbmQoKVstMV07CisgIH0KKworICB2b2lkIHBvcF9iYWNrKCkgeworICAgIC0tRW5kOworICAgIEVuZC0+flQoKTsKKyAgfQorCisgIFQgcG9wX2JhY2tfdmFsKCkgeworICAgIFQgUmVzdWx0ID0gYmFjaygpOworICAgIHBvcF9iYWNrKCk7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgaWYgKHN0ZDo6aXNfY2xhc3M8VD46OnZhbHVlKSB7CisgICAgICBkZXN0cm95X3JhbmdlKEJlZ2luLCBFbmQpOworICAgIH0KKyAgICBFbmQgPSBCZWdpbjsKKyAgfQorCisgIC8vLyBkYXRhIC0gUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgdmVjdG9yJ3MgYnVmZmVyLCBldmVuIGlmIGVtcHR5KCkuCisgIHBvaW50ZXIgZGF0YSgpIHsKKyAgICByZXR1cm4gcG9pbnRlcihCZWdpbik7CisgIH0KKworICAvLy8gZGF0YSAtIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHZlY3RvcidzIGJ1ZmZlciwgZXZlbiBpZiBlbXB0eSgpLgorICBjb25zdF9wb2ludGVyIGRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3BvaW50ZXIoQmVnaW4pOworICB9CisKKyAgdm9pZCBwdXNoX2JhY2soY29uc3RfcmVmZXJlbmNlIEVsdCwgY29uc3QgQVNUQ29udGV4dCAmQykgeworICAgIGlmIChFbmQgPCB0aGlzLT5jYXBhY2l0eV9wdHIoKSkgeworICAgIFJldHJ5OgorICAgICAgbmV3IChFbmQpIFQoRWx0KTsKKyAgICAgICsrRW5kOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBncm93KEMpOworICAgIGdvdG8gUmV0cnk7CisgIH0KKworICB2b2lkIHJlc2VydmUoY29uc3QgQVNUQ29udGV4dCAmQywgdW5zaWduZWQgTikgeworICAgIGlmICh1bnNpZ25lZCh0aGlzLT5jYXBhY2l0eV9wdHIoKS1CZWdpbikgPCBOKQorICAgICAgZ3JvdyhDLCBOKTsKKyAgfQorCisgIC8vLyBjYXBhY2l0eSAtIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50bHkgYWxsb2NhdGVkCisgIC8vLyBidWZmZXIuCisgIHNpemVfdCBjYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmNhcGFjaXR5X3B0cigpIC0gQmVnaW47IH0KKworICAvLy8gYXBwZW5kIC0gQWRkIHRoZSBzcGVjaWZpZWQgcmFuZ2UgdG8gdGhlIGVuZCBvZiB0aGUgU21hbGxWZWN0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIGluX2l0ZXI+CisgIHZvaWQgYXBwZW5kKGNvbnN0IEFTVENvbnRleHQgJkMsIGluX2l0ZXIgaW5fc3RhcnQsIGluX2l0ZXIgaW5fZW5kKSB7CisgICAgc2l6ZV90eXBlIE51bUlucHV0cyA9IHN0ZDo6ZGlzdGFuY2UoaW5fc3RhcnQsIGluX2VuZCk7CisKKyAgICBpZiAoTnVtSW5wdXRzID09IDApCisgICAgICByZXR1cm47CisKKyAgICAvLyBHcm93IGFsbG9jYXRlZCBzcGFjZSBpZiBuZWVkZWQuCisgICAgaWYgKE51bUlucHV0cyA+IHNpemVfdHlwZSh0aGlzLT5jYXBhY2l0eV9wdHIoKS10aGlzLT5lbmQoKSkpCisgICAgICB0aGlzLT5ncm93KEMsIHRoaXMtPnNpemUoKStOdW1JbnB1dHMpOworCisgICAgLy8gQ29weSB0aGUgbmV3IGVsZW1lbnRzIG92ZXIuCisgICAgLy8gVE9ETzogTkVFRCBUbyBjb21waWxlIHRpbWUgZGlzcGF0Y2ggb24gd2hldGhlciBpbl9pdGVyIGlzIGEgcmFuZG9tIGFjY2VzcworICAgIC8vIGl0ZXJhdG9yIHRvIHVzZSB0aGUgZmFzdCB1bmluaXRpYWxpemVkX2NvcHkuCisgICAgc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoaW5fc3RhcnQsIGluX2VuZCwgdGhpcy0+ZW5kKCkpOworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSArIE51bUlucHV0cyk7CisgIH0KKworICAvLy8gYXBwZW5kIC0gQWRkIHRoZSBzcGVjaWZpZWQgcmFuZ2UgdG8gdGhlIGVuZCBvZiB0aGUgU21hbGxWZWN0b3IuCisgIHZvaWQgYXBwZW5kKGNvbnN0IEFTVENvbnRleHQgJkMsIHNpemVfdHlwZSBOdW1JbnB1dHMsIGNvbnN0IFQgJkVsdCkgeworICAgIC8vIEdyb3cgYWxsb2NhdGVkIHNwYWNlIGlmIG5lZWRlZC4KKyAgICBpZiAoTnVtSW5wdXRzID4gc2l6ZV90eXBlKHRoaXMtPmNhcGFjaXR5X3B0cigpLXRoaXMtPmVuZCgpKSkKKyAgICAgIHRoaXMtPmdyb3coQywgdGhpcy0+c2l6ZSgpK051bUlucHV0cyk7CisKKyAgICAvLyBDb3B5IHRoZSBuZXcgZWxlbWVudHMgb3Zlci4KKyAgICBzdGQ6OnVuaW5pdGlhbGl6ZWRfZmlsbF9uKHRoaXMtPmVuZCgpLCBOdW1JbnB1dHMsIEVsdCk7CisgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmVuZCgpICsgTnVtSW5wdXRzKTsKKyAgfQorCisgIC8vLyB1bmluaXRpYWxpemVkX2NvcHkgLSBDb3B5IHRoZSByYW5nZSBbSSwgRSkgb250byB0aGUgdW5pbml0aWFsaXplZCBtZW1vcnkKKyAgLy8vIHN0YXJ0aW5nIHdpdGggIkRlc3QiLCBjb25zdHJ1Y3RpbmcgZWxlbWVudHMgaW50byBpdCBhcyBuZWVkZWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEl0MSwgdHlwZW5hbWUgSXQyPgorICBzdGF0aWMgdm9pZCB1bmluaXRpYWxpemVkX2NvcHkoSXQxIEksIEl0MSBFLCBJdDIgRGVzdCkgeworICAgIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KEksIEUsIERlc3QpOworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IEFTVENvbnRleHQgJkMsIGl0ZXJhdG9yIEksIGNvbnN0IFQgJkVsdCkgeworICAgIGlmIChJID09IHRoaXMtPmVuZCgpKSB7ICAvLyBJbXBvcnRhbnQgc3BlY2lhbCBjYXNlIGZvciBlbXB0eSB2ZWN0b3IuCisgICAgICBwdXNoX2JhY2soRWx0LCBDKTsKKyAgICAgIHJldHVybiB0aGlzLT5lbmQoKS0xOworICAgIH0KKworICAgIGlmICh0aGlzLT5FbmQgPCB0aGlzLT5jYXBhY2l0eV9wdHIoKSkgeworICAgIFJldHJ5OgorICAgICAgbmV3ICh0aGlzLT5lbmQoKSkgVCh0aGlzLT5iYWNrKCkpOworICAgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmVuZCgpKzEpOworICAgICAgLy8gUHVzaCBldmVyeXRoaW5nIGVsc2Ugb3Zlci4KKyAgICAgIHN0ZDo6Y29weV9iYWNrd2FyZChJLCB0aGlzLT5lbmQoKS0xLCB0aGlzLT5lbmQoKSk7CisgICAgICAqSSA9IEVsdDsKKyAgICAgIHJldHVybiBJOworICAgIH0KKyAgICBzaXplX3QgRWx0Tm8gPSBJLXRoaXMtPmJlZ2luKCk7CisgICAgdGhpcy0+Z3JvdyhDKTsKKyAgICBJID0gdGhpcy0+YmVnaW4oKStFbHRObzsKKyAgICBnb3RvIFJldHJ5OworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IEFTVENvbnRleHQgJkMsIGl0ZXJhdG9yIEksIHNpemVfdHlwZSBOdW1Ub0luc2VydCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQgJkVsdCkgeworICAgIC8vIENvbnZlcnQgaXRlcmF0b3IgdG8gZWx0IyB0byBhdm9pZCBpbnZhbGlkYXRpbmcgaXRlcmF0b3Igd2hlbiB3ZSByZXNlcnZlKCkKKyAgICBzaXplX3QgSW5zZXJ0RWx0ID0gSSAtIHRoaXMtPmJlZ2luKCk7CisKKyAgICBpZiAoSSA9PSB0aGlzLT5lbmQoKSkgeyAvLyBJbXBvcnRhbnQgc3BlY2lhbCBjYXNlIGZvciBlbXB0eSB2ZWN0b3IuCisgICAgICBhcHBlbmQoQywgTnVtVG9JbnNlcnQsIEVsdCk7CisgICAgICByZXR1cm4gdGhpcy0+YmVnaW4oKSArIEluc2VydEVsdDsKKyAgICB9CisKKyAgICAvLyBFbnN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlLgorICAgIHJlc2VydmUoQywgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXMtPnNpemUoKSArIE51bVRvSW5zZXJ0KSk7CisKKyAgICAvLyBVbmludmFsaWRhdGUgdGhlIGl0ZXJhdG9yLgorICAgIEkgPSB0aGlzLT5iZWdpbigpK0luc2VydEVsdDsKKworICAgIC8vIElmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIGJldHdlZW4gdGhlIGluc2VydGlvbiBwb2ludCBhbmQgdGhlIGVuZCBvZiB0aGUKKyAgICAvLyByYW5nZSB0aGFuIHRoZXJlIGFyZSBiZWluZyBpbnNlcnRlZCwgd2UgY2FuIHVzZSBhIHNpbXBsZSBhcHByb2FjaCB0bworICAgIC8vIGluc2VydGlvbi4gIFNpbmNlIHdlIGFscmVhZHkgcmVzZXJ2ZWQgc3BhY2UsIHdlIGtub3cgdGhhdCB0aGlzIHdvbid0CisgICAgLy8gcmVhbGxvY2F0ZSB0aGUgdmVjdG9yLgorICAgIGlmIChzaXplX3QodGhpcy0+ZW5kKCktSSkgPj0gTnVtVG9JbnNlcnQpIHsKKyAgICAgIFQgKk9sZEVuZCA9IHRoaXMtPmVuZCgpOworICAgICAgYXBwZW5kKEMsIHRoaXMtPmVuZCgpLU51bVRvSW5zZXJ0LCB0aGlzLT5lbmQoKSk7CisKKyAgICAgIC8vIENvcHkgdGhlIGV4aXN0aW5nIGVsZW1lbnRzIHRoYXQgZ2V0IHJlcGxhY2VkLgorICAgICAgc3RkOjpjb3B5X2JhY2t3YXJkKEksIE9sZEVuZC1OdW1Ub0luc2VydCwgT2xkRW5kKTsKKworICAgICAgc3RkOjpmaWxsX24oSSwgTnVtVG9JbnNlcnQsIEVsdCk7CisgICAgICByZXR1cm4gSTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIHdlJ3JlIGluc2VydGluZyBtb3JlIGVsZW1lbnRzIHRoYW4gZXhpc3QgYWxyZWFkeSwgYW5kIHdlJ3JlCisgICAgLy8gbm90IGluc2VydGluZyBhdCB0aGUgZW5kLgorCisgICAgLy8gQ29weSBvdmVyIHRoZSBlbGVtZW50cyB0aGF0IHdlJ3JlIGFib3V0IHRvIG92ZXJ3cml0ZS4KKyAgICBUICpPbGRFbmQgPSB0aGlzLT5lbmQoKTsKKyAgICB0aGlzLT5zZXRFbmQodGhpcy0+ZW5kKCkgKyBOdW1Ub0luc2VydCk7CisgICAgc2l6ZV90IE51bU92ZXJ3cml0dGVuID0gT2xkRW5kLUk7CisgICAgdGhpcy0+dW5pbml0aWFsaXplZF9jb3B5KEksIE9sZEVuZCwgdGhpcy0+ZW5kKCktTnVtT3ZlcndyaXR0ZW4pOworCisgICAgLy8gUmVwbGFjZSB0aGUgb3ZlcndyaXR0ZW4gcGFydC4KKyAgICBzdGQ6OmZpbGxfbihJLCBOdW1PdmVyd3JpdHRlbiwgRWx0KTsKKworICAgIC8vIEluc2VydCB0aGUgbm9uLW92ZXJ3cml0dGVuIG1pZGRsZSBwYXJ0LgorICAgIHN0ZDo6dW5pbml0aWFsaXplZF9maWxsX24oT2xkRW5kLCBOdW1Ub0luc2VydC1OdW1PdmVyd3JpdHRlbiwgRWx0KTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIEl0VHk+CisgIGl0ZXJhdG9yIGluc2VydChjb25zdCBBU1RDb250ZXh0ICZDLCBpdGVyYXRvciBJLCBJdFR5IEZyb20sIEl0VHkgVG8pIHsKKyAgICAvLyBDb252ZXJ0IGl0ZXJhdG9yIHRvIGVsdCMgdG8gYXZvaWQgaW52YWxpZGF0aW5nIGl0ZXJhdG9yIHdoZW4gd2UgcmVzZXJ2ZSgpCisgICAgc2l6ZV90IEluc2VydEVsdCA9IEkgLSB0aGlzLT5iZWdpbigpOworCisgICAgaWYgKEkgPT0gdGhpcy0+ZW5kKCkpIHsgLy8gSW1wb3J0YW50IHNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgdmVjdG9yLgorICAgICAgYXBwZW5kKEMsIEZyb20sIFRvKTsKKyAgICAgIHJldHVybiB0aGlzLT5iZWdpbigpICsgSW5zZXJ0RWx0OworICAgIH0KKworICAgIHNpemVfdCBOdW1Ub0luc2VydCA9IHN0ZDo6ZGlzdGFuY2UoRnJvbSwgVG8pOworCisgICAgLy8gRW5zdXJlIHRoZXJlIGlzIGVub3VnaCBzcGFjZS4KKyAgICByZXNlcnZlKEMsIHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzLT5zaXplKCkgKyBOdW1Ub0luc2VydCkpOworCisgICAgLy8gVW5pbnZhbGlkYXRlIHRoZSBpdGVyYXRvci4KKyAgICBJID0gdGhpcy0+YmVnaW4oKStJbnNlcnRFbHQ7CisKKyAgICAvLyBJZiB0aGVyZSBhcmUgbW9yZSBlbGVtZW50cyBiZXR3ZWVuIHRoZSBpbnNlcnRpb24gcG9pbnQgYW5kIHRoZSBlbmQgb2YgdGhlCisgICAgLy8gcmFuZ2UgdGhhbiB0aGVyZSBhcmUgYmVpbmcgaW5zZXJ0ZWQsIHdlIGNhbiB1c2UgYSBzaW1wbGUgYXBwcm9hY2ggdG8KKyAgICAvLyBpbnNlcnRpb24uICBTaW5jZSB3ZSBhbHJlYWR5IHJlc2VydmVkIHNwYWNlLCB3ZSBrbm93IHRoYXQgdGhpcyB3b24ndAorICAgIC8vIHJlYWxsb2NhdGUgdGhlIHZlY3Rvci4KKyAgICBpZiAoc2l6ZV90KHRoaXMtPmVuZCgpLUkpID49IE51bVRvSW5zZXJ0KSB7CisgICAgICBUICpPbGRFbmQgPSB0aGlzLT5lbmQoKTsKKyAgICAgIGFwcGVuZChDLCB0aGlzLT5lbmQoKS1OdW1Ub0luc2VydCwgdGhpcy0+ZW5kKCkpOworCisgICAgICAvLyBDb3B5IHRoZSBleGlzdGluZyBlbGVtZW50cyB0aGF0IGdldCByZXBsYWNlZC4KKyAgICAgIHN0ZDo6Y29weV9iYWNrd2FyZChJLCBPbGRFbmQtTnVtVG9JbnNlcnQsIE9sZEVuZCk7CisKKyAgICAgIHN0ZDo6Y29weShGcm9tLCBUbywgSSk7CisgICAgICByZXR1cm4gSTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIHdlJ3JlIGluc2VydGluZyBtb3JlIGVsZW1lbnRzIHRoYW4gZXhpc3QgYWxyZWFkeSwgYW5kIHdlJ3JlCisgICAgLy8gbm90IGluc2VydGluZyBhdCB0aGUgZW5kLgorCisgICAgLy8gQ29weSBvdmVyIHRoZSBlbGVtZW50cyB0aGF0IHdlJ3JlIGFib3V0IHRvIG92ZXJ3cml0ZS4KKyAgICBUICpPbGRFbmQgPSB0aGlzLT5lbmQoKTsKKyAgICB0aGlzLT5zZXRFbmQodGhpcy0+ZW5kKCkgKyBOdW1Ub0luc2VydCk7CisgICAgc2l6ZV90IE51bU92ZXJ3cml0dGVuID0gT2xkRW5kLUk7CisgICAgdGhpcy0+dW5pbml0aWFsaXplZF9jb3B5KEksIE9sZEVuZCwgdGhpcy0+ZW5kKCktTnVtT3ZlcndyaXR0ZW4pOworCisgICAgLy8gUmVwbGFjZSB0aGUgb3ZlcndyaXR0ZW4gcGFydC4KKyAgICBmb3IgKDsgTnVtT3ZlcndyaXR0ZW4gPiAwOyAtLU51bU92ZXJ3cml0dGVuKSB7CisgICAgICAqSSA9ICpGcm9tOworICAgICAgKytJOyArK0Zyb207CisgICAgfQorCisgICAgLy8gSW5zZXJ0IHRoZSBub24tb3ZlcndyaXR0ZW4gbWlkZGxlIHBhcnQuCisgICAgdGhpcy0+dW5pbml0aWFsaXplZF9jb3B5KEZyb20sIFRvLCBPbGRFbmQpOworICAgIHJldHVybiBJOworICB9CisKKyAgdm9pZCByZXNpemUoY29uc3QgQVNUQ29udGV4dCAmQywgdW5zaWduZWQgTiwgY29uc3QgVCAmTlYpIHsKKyAgICBpZiAoTiA8IHRoaXMtPnNpemUoKSkgeworICAgICAgdGhpcy0+ZGVzdHJveV9yYW5nZSh0aGlzLT5iZWdpbigpK04sIHRoaXMtPmVuZCgpKTsKKyAgICAgIHRoaXMtPnNldEVuZCh0aGlzLT5iZWdpbigpK04pOworICAgIH0gZWxzZSBpZiAoTiA+IHRoaXMtPnNpemUoKSkgeworICAgICAgaWYgKHRoaXMtPmNhcGFjaXR5KCkgPCBOKQorICAgICAgICB0aGlzLT5ncm93KEMsIE4pOworICAgICAgY29uc3RydWN0X3JhbmdlKHRoaXMtPmVuZCgpLCB0aGlzLT5iZWdpbigpK04sIE5WKTsKKyAgICAgIHRoaXMtPnNldEVuZCh0aGlzLT5iZWdpbigpK04pOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICAvLy8gZ3JvdyAtIGRvdWJsZSB0aGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSwgZ3VhcmFudGVlaW5nIHNwYWNlIGZvciBhdAorICAvLy8gbGVhc3Qgb25lIG1vcmUgZWxlbWVudCBvciBNaW5TaXplIGlmIHNwZWNpZmllZC4KKyAgdm9pZCBncm93KGNvbnN0IEFTVENvbnRleHQgJkMsIHNpemVfdHlwZSBNaW5TaXplID0gMSk7CisKKyAgdm9pZCBjb25zdHJ1Y3RfcmFuZ2UoVCAqUywgVCAqRSwgY29uc3QgVCAmRWx0KSB7CisgICAgZm9yICg7IFMgIT0gRTsgKytTKQorICAgICAgbmV3IChTKSBUKEVsdCk7CisgIH0KKworICB2b2lkIGRlc3Ryb3lfcmFuZ2UoVCAqUywgVCAqRSkgeworICAgIHdoaWxlIChTICE9IEUpIHsKKyAgICAgIC0tRTsKKyAgICAgIEUtPn5UKCk7CisgICAgfQorICB9CisKK3Byb3RlY3RlZDoKKyAgY29uc3RfaXRlcmF0b3IgY2FwYWNpdHlfcHRyKCkgY29uc3QgeworICAgIHJldHVybiAoaXRlcmF0b3IpIENhcGFjaXR5LmdldFBvaW50ZXIoKTsKKyAgfQorCisgIGl0ZXJhdG9yIGNhcGFjaXR5X3B0cigpIHsgcmV0dXJuIChpdGVyYXRvcilDYXBhY2l0eS5nZXRQb2ludGVyKCk7IH0KK307CisKKy8vIERlZmluZSB0aGlzIG91dC1vZi1saW5lIHRvIGRpc3N1YWRlIHRoZSBDKysgY29tcGlsZXIgZnJvbSBpbmxpbmluZyBpdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBBU1RWZWN0b3I8VD46Omdyb3coY29uc3QgQVNUQ29udGV4dCAmQywgc2l6ZV90IE1pblNpemUpIHsKKyAgc2l6ZV90IEN1ckNhcGFjaXR5ID0gdGhpcy0+Y2FwYWNpdHkoKTsKKyAgc2l6ZV90IEN1clNpemUgPSBzaXplKCk7CisgIHNpemVfdCBOZXdDYXBhY2l0eSA9IDIqQ3VyQ2FwYWNpdHk7CisgIGlmIChOZXdDYXBhY2l0eSA8IE1pblNpemUpCisgICAgTmV3Q2FwYWNpdHkgPSBNaW5TaXplOworCisgIC8vIEFsbG9jYXRlIHRoZSBtZW1vcnkgZnJvbSB0aGUgQVNUQ29udGV4dC4KKyAgVCAqTmV3RWx0cyA9IG5ldyAoQywgYWxpZ25vZihUKSkgVFtOZXdDYXBhY2l0eV07CisKKyAgLy8gQ29weSB0aGUgZWxlbWVudHMgb3Zlci4KKyAgaWYgKEJlZ2luICE9IEVuZCkgeworICAgIGlmIChzdGQ6OmlzX2NsYXNzPFQ+Ojp2YWx1ZSkgeworICAgICAgc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoQmVnaW4sIEVuZCwgTmV3RWx0cyk7CisgICAgICAvLyBEZXN0cm95IHRoZSBvcmlnaW5hbCBlbGVtZW50cy4KKyAgICAgIGRlc3Ryb3lfcmFuZ2UoQmVnaW4sIEVuZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFVzZSBtZW1jcHkgZm9yIFBPRHMgKHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5IG9wdGltaXplcyB0byBtZW1tb3ZlKS4KKyAgICAgIG1lbWNweShOZXdFbHRzLCBCZWdpbiwgQ3VyU2l6ZSAqIHNpemVvZihUKSk7CisgICAgfQorICB9CisKKyAgLy8gQVNUQ29udGV4dCBuZXZlciBmcmVlcyBhbnkgbWVtb3J5LgorICBCZWdpbiA9IE5ld0VsdHM7CisgIEVuZCA9IE5ld0VsdHMrQ3VyU2l6ZTsKKyAgQ2FwYWNpdHkuc2V0UG9pbnRlcihCZWdpbitOZXdDYXBhY2l0eSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9BU1RWRUNUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0F0dHIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BdHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiNzhiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BdHRyLmgKQEAgLTAsMCArMSwzMzcgQEAKKy8vPT09LS0tIEF0dHIuaCAtIENsYXNzZXMgZm9yIHJlcHJlc2VudGluZyBhdHRyaWJ1dGVzIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIEF0dHIgaW50ZXJmYWNlIGFuZCBzdWJjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfQVRUUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX0FUVFJfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0F0dHJJdGVyYXRvci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHIuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0F0dHJLaW5kcy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9PcGVuTVBLaW5kcy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Nhbml0aXplcnMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1ZlcnNpb25UdXBsZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1N3aXRjaC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBjbGFuZyB7CisgIGNsYXNzIEFTVENvbnRleHQ7CisgIGNsYXNzIElkZW50aWZpZXJJbmZvOworICBjbGFzcyBPYmpDSW50ZXJmYWNlRGVjbDsKKyAgY2xhc3MgRXhwcjsKKyAgY2xhc3MgUXVhbFR5cGU7CisgIGNsYXNzIEZ1bmN0aW9uRGVjbDsKKyAgY2xhc3MgVHlwZVNvdXJjZUluZm87CisKKy8vLyBBdHRyIC0gVGhpcyByZXByZXNlbnRzIG9uZSBhdHRyaWJ1dGUuCitjbGFzcyBBdHRyIHsKK3ByaXZhdGU6CisgIFNvdXJjZVJhbmdlIFJhbmdlOworICB1bnNpZ25lZCBBdHRyS2luZCA6IDE2OworCitwcm90ZWN0ZWQ6CisgIC8vLyBBbiBpbmRleCBpbnRvIHRoZSBzcGVsbGluZyBsaXN0IG9mIGFuCisgIC8vLyBhdHRyaWJ1dGUgZGVmaW5lZCBpbiBBdHRyLnRkIGZpbGUuCisgIHVuc2lnbmVkIFNwZWxsaW5nTGlzdEluZGV4IDogNDsKKyAgdW5zaWduZWQgSW5oZXJpdGVkIDogMTsKKyAgdW5zaWduZWQgSXNQYWNrRXhwYW5zaW9uIDogMTsKKyAgdW5zaWduZWQgSW1wbGljaXQgOiAxOworICAvLyBGSVhNRTogVGhlc2UgYXJlIHByb3BlcnRpZXMgb2YgdGhlIGF0dHJpYnV0ZSBraW5kLCBub3Qgc3RhdGUgZm9yIHRoaXMKKyAgLy8gaW5zdGFuY2Ugb2YgdGhlIGF0dHJpYnV0ZS4KKyAgdW5zaWduZWQgSXNMYXRlUGFyc2VkIDogMTsKKyAgdW5zaWduZWQgSW5oZXJpdEV2ZW5JZkFscmVhZHlQcmVzZW50IDogMTsKKworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IGJ5dGVzKSBub2V4Y2VwdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiQXR0cnMgY2Fubm90IGJlIGFsbG9jYXRlZCB3aXRoIHJlZ3VsYXIgJ25ldycuIik7CisgIH0KKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqZGF0YSkgbm9leGNlcHQgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIkF0dHJzIGNhbm5vdCBiZSByZWxlYXNlZCB3aXRoIHJlZ3VsYXIgJ2RlbGV0ZScuIik7CisgIH0KKworcHVibGljOgorICAvLyBGb3J3YXJkIHNvIHRoYXQgdGhlIHJlZ3VsYXIgbmV3IGFuZCBkZWxldGUgZG8gbm90IGhpZGUgZ2xvYmFsIG9uZXMuCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgQnl0ZXMsIEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QgQWxpZ25tZW50ID0gOCkgbm9leGNlcHQgeworICAgIHJldHVybiA6Om9wZXJhdG9yIG5ldyhCeXRlcywgQywgQWxpZ25tZW50KTsKKyAgfQorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpQdHIsIEFTVENvbnRleHQgJkMsIHNpemVfdCBBbGlnbm1lbnQpIG5vZXhjZXB0IHsKKyAgICByZXR1cm4gOjpvcGVyYXRvciBkZWxldGUoUHRyLCBDLCBBbGlnbm1lbnQpOworICB9CisKK3Byb3RlY3RlZDoKKyAgQXR0cihhdHRyOjpLaW5kIEFLLCBTb3VyY2VSYW5nZSBSLCB1bnNpZ25lZCBTcGVsbGluZ0xpc3RJbmRleCwKKyAgICAgICBib29sIElzTGF0ZVBhcnNlZCkKKyAgICA6IFJhbmdlKFIpLCBBdHRyS2luZChBSyksIFNwZWxsaW5nTGlzdEluZGV4KFNwZWxsaW5nTGlzdEluZGV4KSwKKyAgICAgIEluaGVyaXRlZChmYWxzZSksIElzUGFja0V4cGFuc2lvbihmYWxzZSksIEltcGxpY2l0KGZhbHNlKSwKKyAgICAgIElzTGF0ZVBhcnNlZChJc0xhdGVQYXJzZWQpLCBJbmhlcml0RXZlbklmQWxyZWFkeVByZXNlbnQoZmFsc2UpIHt9CisKK3B1YmxpYzoKKworICBhdHRyOjpLaW5kIGdldEtpbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGF0dHI6OktpbmQ+KEF0dHJLaW5kKTsKKyAgfQorICAKKyAgdW5zaWduZWQgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSBjb25zdCB7IHJldHVybiBTcGVsbGluZ0xpc3RJbmRleDsgfQorICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gUmFuZ2UuZ2V0QmVnaW4oKTsgfQorICBTb3VyY2VSYW5nZSBnZXRSYW5nZSgpIGNvbnN0IHsgcmV0dXJuIFJhbmdlOyB9CisgIHZvaWQgc2V0UmFuZ2UoU291cmNlUmFuZ2UgUikgeyBSYW5nZSA9IFI7IH0KKworICBib29sIGlzSW5oZXJpdGVkKCkgY29uc3QgeyByZXR1cm4gSW5oZXJpdGVkOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIGF0dHJpYnV0ZSBoYXMgYmVlbiBpbXBsaWNpdGx5IGNyZWF0ZWQgaW5zdGVhZAorICAvLy8gb2YgZXhwbGljaXRseSB3cml0dGVuIGJ5IHRoZSB1c2VyLgorICBib29sIGlzSW1wbGljaXQoKSBjb25zdCB7IHJldHVybiBJbXBsaWNpdDsgfQorICB2b2lkIHNldEltcGxpY2l0KGJvb2wgSSkgeyBJbXBsaWNpdCA9IEk7IH0KKworICB2b2lkIHNldFBhY2tFeHBhbnNpb24oYm9vbCBQRSkgeyBJc1BhY2tFeHBhbnNpb24gPSBQRTsgfQorICBib29sIGlzUGFja0V4cGFuc2lvbigpIGNvbnN0IHsgcmV0dXJuIElzUGFja0V4cGFuc2lvbjsgfQorCisgIC8vIENsb25lIHRoaXMgYXR0cmlidXRlLgorICBBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKworICBib29sIGlzTGF0ZVBhcnNlZCgpIGNvbnN0IHsgcmV0dXJuIElzTGF0ZVBhcnNlZDsgfQorCisgIC8vIFByZXR0eSBwcmludCB0aGlzIGF0dHJpYnV0ZS4KKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworfTsKKworY2xhc3MgU3RtdEF0dHIgOiBwdWJsaWMgQXR0ciB7Citwcm90ZWN0ZWQ6CisgIFN0bXRBdHRyKGF0dHI6OktpbmQgQUssIFNvdXJjZVJhbmdlIFIsIHVuc2lnbmVkIFNwZWxsaW5nTGlzdEluZGV4LAorICAgICAgICAgICAgICAgICAgYm9vbCBJc0xhdGVQYXJzZWQpCisgICAgICA6IEF0dHIoQUssIFIsIFNwZWxsaW5nTGlzdEluZGV4LCBJc0xhdGVQYXJzZWQpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7CisgICAgcmV0dXJuIEEtPmdldEtpbmQoKSA+PSBhdHRyOjpGaXJzdFN0bXRBdHRyICYmCisgICAgICAgICAgIEEtPmdldEtpbmQoKSA8PSBhdHRyOjpMYXN0U3RtdEF0dHI7CisgIH0KK307CisKK2NsYXNzIEluaGVyaXRhYmxlQXR0ciA6IHB1YmxpYyBBdHRyIHsKK3Byb3RlY3RlZDoKKyAgSW5oZXJpdGFibGVBdHRyKGF0dHI6OktpbmQgQUssIFNvdXJjZVJhbmdlIFIsIHVuc2lnbmVkIFNwZWxsaW5nTGlzdEluZGV4LAorICAgICAgICAgICAgICAgICAgYm9vbCBJc0xhdGVQYXJzZWQsIGJvb2wgSW5oZXJpdEV2ZW5JZkFscmVhZHlQcmVzZW50KQorICAgICAgOiBBdHRyKEFLLCBSLCBTcGVsbGluZ0xpc3RJbmRleCwgSXNMYXRlUGFyc2VkKSB7CisgICAgdGhpcy0+SW5oZXJpdEV2ZW5JZkFscmVhZHlQcmVzZW50ID0gSW5oZXJpdEV2ZW5JZkFscmVhZHlQcmVzZW50OworICB9CisKK3B1YmxpYzoKKyAgdm9pZCBzZXRJbmhlcml0ZWQoYm9vbCBJKSB7IEluaGVyaXRlZCA9IEk7IH0KKworICAvLy8gU2hvdWxkIHRoaXMgYXR0cmlidXRlIGJlIGluaGVyaXRlZCBmcm9tIGEgcHJpb3IgZGVjbGFyYXRpb24gZXZlbiBpZiBpdCdzCisgIC8vLyBleHBsaWNpdGx5IHByb3ZpZGVkIGluIHRoZSBjdXJyZW50IGRlY2xhcmF0aW9uPworICBib29sIHNob3VsZEluaGVyaXRFdmVuSWZBbHJlYWR5UHJlc2VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5oZXJpdEV2ZW5JZkFscmVhZHlQcmVzZW50OworICB9CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsKKyAgICByZXR1cm4gQS0+Z2V0S2luZCgpID49IGF0dHI6OkZpcnN0SW5oZXJpdGFibGVBdHRyICYmCisgICAgICAgICAgIEEtPmdldEtpbmQoKSA8PSBhdHRyOjpMYXN0SW5oZXJpdGFibGVBdHRyOworICB9Cit9OworCitjbGFzcyBJbmhlcml0YWJsZVBhcmFtQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHJvdGVjdGVkOgorICBJbmhlcml0YWJsZVBhcmFtQXR0cihhdHRyOjpLaW5kIEFLLCBTb3VyY2VSYW5nZSBSLCB1bnNpZ25lZCBTcGVsbGluZ0xpc3RJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0xhdGVQYXJzZWQsIGJvb2wgSW5oZXJpdEV2ZW5JZkFscmVhZHlQcmVzZW50KQorICAgICAgOiBJbmhlcml0YWJsZUF0dHIoQUssIFIsIFNwZWxsaW5nTGlzdEluZGV4LCBJc0xhdGVQYXJzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBJbmhlcml0RXZlbklmQWxyZWFkeVByZXNlbnQpIHt9CisKK3B1YmxpYzoKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsKKyAgICByZXR1cm4gQS0+Z2V0S2luZCgpID49IGF0dHI6OkZpcnN0SW5oZXJpdGFibGVQYXJhbUF0dHIgJiYKKyAgICAgICAgICAgQS0+Z2V0S2luZCgpIDw9IGF0dHI6Okxhc3RJbmhlcml0YWJsZVBhcmFtQXR0cjsKKyAgfQorfTsKKworLy8vIEEgcGFyYW1ldGVyIGF0dHJpYnV0ZSB3aGljaCBjaGFuZ2VzIHRoZSBhcmd1bWVudC1wYXNzaW5nIEFCSSBydWxlCisvLy8gZm9yIHRoZSBwYXJhbWV0ZXIuCitjbGFzcyBQYXJhbWV0ZXJBQklBdHRyIDogcHVibGljIEluaGVyaXRhYmxlUGFyYW1BdHRyIHsKK3Byb3RlY3RlZDoKKyAgUGFyYW1ldGVyQUJJQXR0cihhdHRyOjpLaW5kIEFLLCBTb3VyY2VSYW5nZSBSLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNwZWxsaW5nTGlzdEluZGV4LCBib29sIElzTGF0ZVBhcnNlZCwKKyAgICAgICAgICAgICAgICAgICBib29sIEluaGVyaXRFdmVuSWZBbHJlYWR5UHJlc2VudCkKKyAgICA6IEluaGVyaXRhYmxlUGFyYW1BdHRyKEFLLCBSLCBTcGVsbGluZ0xpc3RJbmRleCwgSXNMYXRlUGFyc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5oZXJpdEV2ZW5JZkFscmVhZHlQcmVzZW50KSB7fQorCitwdWJsaWM6CisgIFBhcmFtZXRlckFCSSBnZXRBQkkoKSBjb25zdCB7CisgICAgc3dpdGNoIChnZXRLaW5kKCkpIHsKKyAgICBjYXNlIGF0dHI6OlN3aWZ0Q29udGV4dDoKKyAgICAgIHJldHVybiBQYXJhbWV0ZXJBQkk6OlN3aWZ0Q29udGV4dDsKKyAgICBjYXNlIGF0dHI6OlN3aWZ0RXJyb3JSZXN1bHQ6CisgICAgICByZXR1cm4gUGFyYW1ldGVyQUJJOjpTd2lmdEVycm9yUmVzdWx0OworICAgIGNhc2UgYXR0cjo6U3dpZnRJbmRpcmVjdFJlc3VsdDoKKyAgICAgIHJldHVybiBQYXJhbWV0ZXJBQkk6OlN3aWZ0SW5kaXJlY3RSZXN1bHQ7CisgICAgZGVmYXVsdDoKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoImJhZCBwYXJhbWV0ZXIgQUJJIGF0dHJpYnV0ZSBraW5kIik7CisgICAgfQorICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7CisgICAgcmV0dXJuIEEtPmdldEtpbmQoKSA+PSBhdHRyOjpGaXJzdFBhcmFtZXRlckFCSUF0dHIgJiYKKyAgICAgICAgICAgQS0+Z2V0S2luZCgpIDw9IGF0dHI6Okxhc3RQYXJhbWV0ZXJBQklBdHRyOworICAgfQorfTsKKworLy8vIEEgc2luZ2xlIHBhcmFtZXRlciBpbmRleCB3aG9zZSBhY2Nlc3NvcnMgcmVxdWlyZSBlYWNoIHVzZSB0byBtYWtlIGV4cGxpY2l0CisvLy8gdGhlIHBhcmFtZXRlciBpbmRleCBlbmNvZGluZyBuZWVkZWQuCitjbGFzcyBQYXJhbUlkeCB7CisgIC8vIElkeCBpcyBleHBvc2VkIG9ubHkgdmlhIGFjY2Vzc29ycyB0aGF0IHNwZWNpZnkgc3BlY2lmaWMgZW5jb2RpbmdzLgorICB1bnNpZ25lZCBJZHggOiAzMDsKKyAgdW5zaWduZWQgSGFzVGhpcyA6IDE7CisgIHVuc2lnbmVkIElzVmFsaWQgOiAxOworCisgIHZvaWQgYXNzZXJ0Q29tcGFyYWJsZShjb25zdCBQYXJhbUlkeCAmSSkgY29uc3QgeworICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgSS5pc1ZhbGlkKCkgJiYKKyAgICAgICAgICAgIlBhcmFtSWR4IG11c3QgYmUgdmFsaWQgdG8gYmUgY29tcGFyZWQiKTsKKyAgICAvLyBJdCdzIHBvc3NpYmxlIHRvIGNvbXBhcmUgaW5kaWNlcyBmcm9tIHNlcGFyYXRlIGZ1bmN0aW9ucywgYnV0IHNvIGZhcgorICAgIC8vIGl0J3Mgbm90IHByb3ZlbiB1c2VmdWwuICBNb3Jlb3ZlciwgaXQgbWlnaHQgYmUgY29uZnVzaW5nIGJlY2F1c2UgYQorICAgIC8vIGNvbXBhcmlzb24gb24gdGhlIHJlc3VsdHMgb2YgZ2V0QVNUSW5kZXggbWlnaHQgYmUgaW5jb25zaXN0ZW50IHdpdGggYQorICAgIC8vIGNvbXBhcmlzb24gb24gdGhlIFBhcmFtSWR4IG9iamVjdHMgdGhlbXNlbHZlcy4KKyAgICBhc3NlcnQoSGFzVGhpcyA9PSBJLkhhc1RoaXMgJiYKKyAgICAgICAgICAgIlBhcmFtSWR4IG11c3QgYmUgZm9yIHRoZSBzYW1lIGZ1bmN0aW9uIHRvIGJlIGNvbXBhcmVkIik7CisgIH0KKworcHVibGljOgorICAvLy8gQ29uc3RydWN0IGFuIGludmFsaWQgcGFyYW1ldGVyIGluZGV4IChcYyBpc1ZhbGlkIHJldHVybnMgZmFsc2UgYW5kCisgIC8vLyBhY2Nlc3NvcnMgZmFpbCBhbiBhc3NlcnQpLgorICBQYXJhbUlkeCgpIDogSWR4KDApLCBIYXNUaGlzKGZhbHNlKSwgSXNWYWxpZChmYWxzZSkge30KKworICAvLy8gXHBhcmFtIElkeCBpcyB0aGUgcGFyYW1ldGVyIGluZGV4IGFzIGl0IGlzIG5vcm1hbGx5IHNwZWNpZmllZCBpbgorICAvLy8gYXR0cmlidXRlcyBpbiB0aGUgc291cmNlOiBvbmUtb3JpZ2luIGluY2x1ZGluZyBhbnkgQysrIGltcGxpY2l0IHRoaXMKKyAgLy8vIHBhcmFtZXRlci4KKyAgLy8vCisgIC8vLyBccGFyYW0gRCBpcyB0aGUgZGVjbGFyYXRpb24gY29udGFpbmluZyB0aGUgcGFyYW1ldGVycy4gIEl0IGlzIHVzZWQgdG8KKyAgLy8vIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIEMrKyBpbXBsaWNpdCB0aGlzIHBhcmFtZXRlci4KKyAgUGFyYW1JZHgodW5zaWduZWQgSWR4LCBjb25zdCBEZWNsICpEKQorICAgICAgOiBJZHgoSWR4KSwgSGFzVGhpcyhmYWxzZSksIElzVmFsaWQodHJ1ZSkgeworICAgIGFzc2VydChJZHggPj0gMSAmJiAiSWR4IG11c3QgYmUgb25lLW9yaWdpbiIpOworICAgIGlmIChjb25zdCBhdXRvICpGRCA9IGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oRCkpCisgICAgICBIYXNUaGlzID0gRkQtPmlzQ1hYSW5zdGFuY2VNZW1iZXIoKTsKKyAgfQorCisgIC8vLyBBIHR5cGUgaW50byB3aGljaCBcYyBQYXJhbUlkeCBjYW4gYmUgc2VyaWFsaXplZC4KKyAgLy8vCisgIC8vLyBBIHN0YXRpYyBhc3NlcnRpb24gdGhhdCBpdCdzIG9mIHRoZSBjb3JyZWN0IHNpemUgZm9sbG93cyB0aGUgXGMgUGFyYW1JZHgKKyAgLy8vIGNsYXNzIGRlZmluaXRpb24uCisgIHR5cGVkZWYgdWludDMyX3QgU2VyaWFsVHlwZTsKKworICAvLy8gUHJvZHVjZSBhIHJlcHJlc2VudGF0aW9uIHRoYXQgY2FuIGxhdGVyIGJlIHBhc3NlZCB0byBcYyBkZXNlcmlhbGl6ZSB0bworICAvLy8gY29uc3RydWN0IGFuIGVxdWl2YWxlbnQgXGMgUGFyYW1JZHguCisgIFNlcmlhbFR5cGUgc2VyaWFsaXplKCkgY29uc3QgeworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTZXJpYWxUeXBlICo+KHRoaXMpOworICB9CisKKyAgLy8vIENvbnN0cnVjdCBmcm9tIGEgcmVzdWx0IGZyb20gXGMgc2VyaWFsaXplLgorICBzdGF0aWMgUGFyYW1JZHggZGVzZXJpYWxpemUoU2VyaWFsVHlwZSBTKSB7CisgICAgUGFyYW1JZHggUCgqcmVpbnRlcnByZXRfY2FzdDxQYXJhbUlkeCAqPigmUykpOworICAgIGFzc2VydCgoIVAuSXNWYWxpZCB8fCBQLklkeCA+PSAxKSAmJiAidmFsaWQgSWR4IG11c3QgYmUgb25lLW9yaWdpbiIpOworICAgIHJldHVybiBQOworICB9CisKKyAgLy8vIElzIHRoaXMgcGFyYW1ldGVyIGluZGV4IHZhbGlkPworICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBJc1ZhbGlkOyB9CisKKyAgLy8vIEdldCB0aGUgcGFyYW1ldGVyIGluZGV4IGFzIGl0IHdvdWxkIG5vcm1hbGx5IGJlIGVuY29kZWQgZm9yIGF0dHJpYnV0ZXMgYXQKKyAgLy8vIHRoZSBzb3VyY2UgbGV2ZWwgb2YgcmVwcmVzZW50YXRpb246IG9uZS1vcmlnaW4gaW5jbHVkaW5nIGFueSBDKysgaW1wbGljaXQKKyAgLy8vIHRoaXMgcGFyYW1ldGVyLgorICAvLy8KKyAgLy8vIFRoaXMgZW5jb2RpbmcgdGh1cyBtYWtlcyBzZW5zZSBmb3IgZGlhZ25vc3RpY3MsIHByZXR0eSBwcmludGluZywgYW5kCisgIC8vLyBjb25zdHJ1Y3RpbmcgbmV3IGF0dHJpYnV0ZXMgZnJvbSBhIHNvdXJjZS1saWtlIHNwZWNpZmljYXRpb24uCisgIHVuc2lnbmVkIGdldFNvdXJjZUluZGV4KCkgY29uc3QgeworICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIlBhcmFtSWR4IG11c3QgYmUgdmFsaWQiKTsKKyAgICByZXR1cm4gSWR4OworICB9CisKKyAgLy8vIEdldCB0aGUgcGFyYW1ldGVyIGluZGV4IGFzIGl0IHdvdWxkIG5vcm1hbGx5IGJlIGVuY29kZWQgYXQgdGhlIEFTVCBsZXZlbAorICAvLy8gb2YgcmVwcmVzZW50YXRpb246IHplcm8tb3JpZ2luIG5vdCBpbmNsdWRpbmcgYW55IEMrKyBpbXBsaWNpdCB0aGlzCisgIC8vLyBwYXJhbWV0ZXIuCisgIC8vLworICAvLy8gVGhpcyBpcyB0aGUgZW5jb2RpbmcgcHJpbWFyaWx5IHVzZWQgaW4gU2VtYS4gIEhvd2V2ZXIsIGluIGRpYWdub3N0aWNzLAorICAvLy8gU2VtYSB1c2VzIFxjIGdldFNvdXJjZUluZGV4IGluc3RlYWQuCisgIHVuc2lnbmVkIGdldEFTVEluZGV4KCkgY29uc3QgeworICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIlBhcmFtSWR4IG11c3QgYmUgdmFsaWQiKTsKKyAgICBhc3NlcnQoSWR4ID49IDEgKyBIYXNUaGlzICYmCisgICAgICAgICAgICJzdG9yZWQgaW5kZXggbXVzdCBiZSBiYXNlLTEgYW5kIG5vdCBzcGVjaWZ5IEMrKyBpbXBsaWNpdCB0aGlzIik7CisgICAgcmV0dXJuIElkeCAtIDEgLSBIYXNUaGlzOworICB9CisKKyAgLy8vIEdldCB0aGUgcGFyYW1ldGVyIGluZGV4IGFzIGl0IHdvdWxkIG5vcm1hbGx5IGJlIGVuY29kZWQgYXQgdGhlIExMVk0gbGV2ZWwKKyAgLy8vIG9mIHJlcHJlc2VudGF0aW9uOiB6ZXJvLW9yaWdpbiBpbmNsdWRpbmcgYW55IEMrKyBpbXBsaWNpdCB0aGlzIHBhcmFtZXRlci4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHRoZSBlbmNvZGluZyBwcmltYXJpbHkgdXNlZCBpbiBDb2RlR2VuLgorICB1bnNpZ25lZCBnZXRMTFZNSW5kZXgoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiUGFyYW1JZHggbXVzdCBiZSB2YWxpZCIpOworICAgIGFzc2VydChJZHggPj0gMSAmJiAic3RvcmVkIGluZGV4IG11c3QgYmUgYmFzZS0xIik7CisgICAgcmV0dXJuIElkeCAtIDE7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgUGFyYW1JZHggJkkpIGNvbnN0IHsKKyAgICBhc3NlcnRDb21wYXJhYmxlKEkpOworICAgIHJldHVybiBJZHggPT0gSS5JZHg7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFBhcmFtSWR4ICZJKSBjb25zdCB7CisgICAgYXNzZXJ0Q29tcGFyYWJsZShJKTsKKyAgICByZXR1cm4gSWR4ICE9IEkuSWR4OworICB9CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFBhcmFtSWR4ICZJKSBjb25zdCB7CisgICAgYXNzZXJ0Q29tcGFyYWJsZShJKTsKKyAgICByZXR1cm4gSWR4IDwgSS5JZHg7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj4oY29uc3QgUGFyYW1JZHggJkkpIGNvbnN0IHsKKyAgICBhc3NlcnRDb21wYXJhYmxlKEkpOworICAgIHJldHVybiBJZHggPiBJLklkeDsKKyAgfQorICBib29sIG9wZXJhdG9yPD0oY29uc3QgUGFyYW1JZHggJkkpIGNvbnN0IHsKKyAgICBhc3NlcnRDb21wYXJhYmxlKEkpOworICAgIHJldHVybiBJZHggPD0gSS5JZHg7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFBhcmFtSWR4ICZJKSBjb25zdCB7CisgICAgYXNzZXJ0Q29tcGFyYWJsZShJKTsKKyAgICByZXR1cm4gSWR4ID49IEkuSWR4OworICB9Cit9OworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihQYXJhbUlkeCkgPT0gc2l6ZW9mKFBhcmFtSWR4OjpTZXJpYWxUeXBlKSwKKyAgICAgICAgICAgICAgIlBhcmFtSWR4IGRvZXMgbm90IGZpdCBpdHMgc2VyaWFsaXphdGlvbiB0eXBlIik7CisKKyNpbmNsdWRlICJjbGFuZy9BU1QvQXR0cnMuaW5jIgorCitpbmxpbmUgY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJm9wZXJhdG9yPDwoY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJkRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHIgKkF0KSB7CisgIERCLkFkZFRhZ2dlZFZhbChyZWludGVycHJldF9jYXN0PGludHB0cl90PihBdCksCisgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6YWtfYXR0cik7CisgIHJldHVybiBEQjsKK30KKworaW5saW5lIGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZvcGVyYXRvcjw8KGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZQRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyICpBdCkgeworICBQRC5BZGRUYWdnZWRWYWwocmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oQXQpLAorICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OmFrX2F0dHIpOworICByZXR1cm4gUEQ7Cit9Cit9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0F0dHJEdW1wLmluYyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BdHRyRHVtcC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhN2Y5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BdHRyRHVtcC5pbmMKQEAgLTAsMCArMSwxMjQ1IEBACisvKj09PS0gVGFibGVHZW4nZXJhdGVkIGZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIEF0dHJpYnV0ZSBkdW1wZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZSwgZG8gbm90IGVkaXQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisgIHN3aXRjaCAoQS0+Z2V0S2luZCgpKSB7CisgIGNhc2UgYXR0cjo6QU1ER1BVRmxhdFdvcmtHcm91cFNpemU6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QU1ER1BVRmxhdFdvcmtHcm91cFNpemVBdHRyPihBKTsKKyAgICBPUyA8PCAiICIgPDwgU0EtPmdldE1pbigpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0TWF4KCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBTURHUFVOdW1TR1BSOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEFNREdQVU51bVNHUFJBdHRyPihBKTsKKyAgICBPUyA8PCAiICIgPDwgU0EtPmdldE51bVNHUFIoKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFNREdQVU51bVZHUFI6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QU1ER1BVTnVtVkdQUkF0dHI+KEEpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0TnVtVkdQUigpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QU1ER1BVV2F2ZXNQZXJFVTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBTURHUFVXYXZlc1BlckVVQXR0cj4oQSk7CisgICAgT1MgPDwgIiAiIDw8IFNBLT5nZXRNaW4oKTsKKyAgICBPUyA8PCAiICIgPDwgU0EtPmdldE1heCgpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QVJNSW50ZXJydXB0OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEFSTUludGVycnVwdEF0dHI+KEEpOworICAgIHN3aXRjaChTQS0+Z2V0SW50ZXJydXB0KCkpIHsKKyAgICBjYXNlIEFSTUludGVycnVwdEF0dHI6OklSUToKKyAgICAgIE9TIDw8ICIgSVJRIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJNSW50ZXJydXB0QXR0cjo6RklROgorICAgICAgT1MgPDwgIiBGSVEiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUk1JbnRlcnJ1cHRBdHRyOjpTV0k6CisgICAgICBPUyA8PCAiIFNXSSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSTUludGVycnVwdEF0dHI6OkFCT1JUOgorICAgICAgT1MgPDwgIiBBQk9SVCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSTUludGVycnVwdEF0dHI6OlVOREVGOgorICAgICAgT1MgPDwgIiBVTkRFRiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSTUludGVycnVwdEF0dHI6OkdlbmVyaWM6CisgICAgICBPUyA8PCAiIEdlbmVyaWMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QVZSSW50ZXJydXB0OiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBVlJTaWduYWw6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFiaVRhZzogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBYmlUYWdBdHRyPihBKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IFNBLT50YWdzKCkpCisgICAgICBPUyA8PCAiICIgPDwgVmFsOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QWNxdWlyZUNhcGFiaWxpdHk6IHsKKyAgICBPUyA8PCAiICIgPDwgQS0+Z2V0U3BlbGxpbmcoKTsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QWNxdWlyZUNhcGFiaWxpdHlBdHRyPihBKTsKKyAgICBmb3IgKEFjcXVpcmVDYXBhYmlsaXR5QXR0cjo6YXJnc19pdGVyYXRvciBJID0gU0EtPmFyZ3NfYmVnaW4oKSwgRSA9IFNBLT5hcmdzX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGR1bXBTdG10KCpJKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFjcXVpcmVkQWZ0ZXI6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QWNxdWlyZWRBZnRlckF0dHI+KEEpOworICAgIGZvciAoQWNxdWlyZWRBZnRlckF0dHI6OmFyZ3NfaXRlcmF0b3IgSSA9IFNBLT5hcmdzX2JlZ2luKCksIEUgPSBTQS0+YXJnc19lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBkdW1wU3RtdCgqSSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBY3F1aXJlZEJlZm9yZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBY3F1aXJlZEJlZm9yZUF0dHI+KEEpOworICAgIGZvciAoQWNxdWlyZWRCZWZvcmVBdHRyOjphcmdzX2l0ZXJhdG9yIEkgPSBTQS0+YXJnc19iZWdpbigpLCBFID0gU0EtPmFyZ3NfZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgZHVtcFN0bXQoKkkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QWxpYXM6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QWxpYXNBdHRyPihBKTsKKyAgICBPUyA8PCAiIFwiIiA8PCBTQS0+Z2V0QWxpYXNlZSgpIDw8ICJcIiI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBbGlnbk1hYzY4azogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QWxpZ25WYWx1ZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBbGlnblZhbHVlQXR0cj4oQSk7CisgICAgZHVtcFN0bXQoU0EtPmdldEFsaWdubWVudCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFsaWduZWQ6IHsKKyAgICBPUyA8PCAiICIgPDwgQS0+Z2V0U3BlbGxpbmcoKTsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QWxpZ25lZEF0dHI+KEEpOworICAgIGlmIChTQS0+aXNBbGlnbm1lbnRFeHByKCkpCisgICAgICBkdW1wU3RtdChTQS0+Z2V0QWxpZ25tZW50RXhwcigpKTsKKyAgICBlbHNlCisgICAgICBkdW1wVHlwZShTQS0+Z2V0QWxpZ25tZW50VHlwZSgpLT5nZXRUeXBlKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QWxsb2NBbGlnbjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBbGxvY0FsaWduQXR0cj4oQSk7CisgICAgT1MgPDwgIiAiIDw8IFNBLT5nZXRQYXJhbUluZGV4KCkuZ2V0U291cmNlSW5kZXgoKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFsbG9jU2l6ZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBbGxvY1NpemVBdHRyPihBKTsKKyAgICBPUyA8PCAiICIgPDwgU0EtPmdldEVsZW1TaXplUGFyYW0oKS5nZXRTb3VyY2VJbmRleCgpOworICAgIGlmIChTQS0+Z2V0TnVtRWxlbXNQYXJhbSgpLmlzVmFsaWQoKSkKKyAgICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0TnVtRWxlbXNQYXJhbSgpLmdldFNvdXJjZUluZGV4KCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBbHdheXNJbmxpbmU6IHsKKyAgICBPUyA8PCAiICIgPDwgQS0+Z2V0U3BlbGxpbmcoKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFuYWx5emVyTm9SZXR1cm46IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFubm90YXRlOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEFubm90YXRlQXR0cj4oQSk7CisgICAgT1MgPDwgIiBcIiIgPDwgU0EtPmdldEFubm90YXRpb24oKSA8PCAiXCIiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QW55WDg2SW50ZXJydXB0OiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBbnlYODZOb0NhbGxlclNhdmVkUmVnaXN0ZXJzOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBbnlYODZOb0NmQ2hlY2s6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFyY1dlYWtyZWZVbmF2YWlsYWJsZTogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QXJndW1lbnRXaXRoVHlwZVRhZzogeworICAgIE9TIDw8ICIgIiA8PCBBLT5nZXRTcGVsbGluZygpOworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBcmd1bWVudFdpdGhUeXBlVGFnQXR0cj4oQSk7CisgICAgaWYgKFNBLT5nZXRBcmd1bWVudEtpbmQoKSkKKyAgICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0QXJndW1lbnRLaW5kKCktPmdldE5hbWUoKTsKKyAgICBPUyA8PCAiICIgPDwgU0EtPmdldEFyZ3VtZW50SWR4KCkuZ2V0U291cmNlSW5kZXgoKTsKKyAgICBPUyA8PCAiICIgPDwgU0EtPmdldFR5cGVUYWdJZHgoKS5nZXRTb3VyY2VJbmRleCgpOworICAgIGlmIChTQS0+Z2V0SXNQb2ludGVyKCkpIE9TIDw8ICIgSXNQb2ludGVyIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFydGlmaWNpYWw6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFzbUxhYmVsOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEFzbUxhYmVsQXR0cj4oQSk7CisgICAgT1MgPDwgIiBcIiIgPDwgU0EtPmdldExhYmVsKCkgPDwgIlwiIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFzc2VydENhcGFiaWxpdHk6IHsKKyAgICBPUyA8PCAiICIgPDwgQS0+Z2V0U3BlbGxpbmcoKTsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QXNzZXJ0Q2FwYWJpbGl0eUF0dHI+KEEpOworICAgIGZvciAoQXNzZXJ0Q2FwYWJpbGl0eUF0dHI6OmFyZ3NfaXRlcmF0b3IgSSA9IFNBLT5hcmdzX2JlZ2luKCksIEUgPSBTQS0+YXJnc19lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBkdW1wU3RtdCgqSSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBc3NlcnRFeGNsdXNpdmVMb2NrOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEFzc2VydEV4Y2x1c2l2ZUxvY2tBdHRyPihBKTsKKyAgICBmb3IgKEFzc2VydEV4Y2x1c2l2ZUxvY2tBdHRyOjphcmdzX2l0ZXJhdG9yIEkgPSBTQS0+YXJnc19iZWdpbigpLCBFID0gU0EtPmFyZ3NfZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgZHVtcFN0bXQoKkkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QXNzZXJ0U2hhcmVkTG9jazogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBc3NlcnRTaGFyZWRMb2NrQXR0cj4oQSk7CisgICAgZm9yIChBc3NlcnRTaGFyZWRMb2NrQXR0cjo6YXJnc19pdGVyYXRvciBJID0gU0EtPmFyZ3NfYmVnaW4oKSwgRSA9IFNBLT5hcmdzX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGR1bXBTdG10KCpJKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFzc3VtZUFsaWduZWQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QXNzdW1lQWxpZ25lZEF0dHI+KEEpOworICAgIGR1bXBTdG10KFNBLT5nZXRBbGlnbm1lbnQoKSk7CisgICAgZHVtcFN0bXQoU0EtPmdldE9mZnNldCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkF2YWlsYWJpbGl0eTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBdmFpbGFiaWxpdHlBdHRyPihBKTsKKyAgICBpZiAoU0EtPmdldFBsYXRmb3JtKCkpCisgICAgICBPUyA8PCAiICIgPDwgU0EtPmdldFBsYXRmb3JtKCktPmdldE5hbWUoKTsKKyAgICBPUyA8PCAiICIgPDwgU0EtPmdldEludHJvZHVjZWQoKTsKKyAgICBPUyA8PCAiICIgPDwgU0EtPmdldERlcHJlY2F0ZWQoKTsKKyAgICBPUyA8PCAiICIgPDwgU0EtPmdldE9ic29sZXRlZCgpOworICAgIGlmIChTQS0+Z2V0VW5hdmFpbGFibGUoKSkgT1MgPDwgIiBVbmF2YWlsYWJsZSI7CisgICAgT1MgPDwgIiBcIiIgPDwgU0EtPmdldE1lc3NhZ2UoKSA8PCAiXCIiOworICAgIGlmIChTQS0+Z2V0U3RyaWN0KCkpIE9TIDw8ICIgU3RyaWN0IjsKKyAgICBPUyA8PCAiIFwiIiA8PCBTQS0+Z2V0UmVwbGFjZW1lbnQoKSA8PCAiXCIiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QmxvY2tzOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEJsb2Nrc0F0dHI+KEEpOworICAgIHN3aXRjaChTQS0+Z2V0VHlwZSgpKSB7CisgICAgY2FzZSBCbG9ja3NBdHRyOjpCeVJlZjoKKyAgICAgIE9TIDw8ICIgQnlSZWYiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QzExTm9SZXR1cm46IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNEZWNsOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDRkF1ZGl0ZWRUcmFuc2ZlcjogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q0ZDb25zdW1lZDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q0ZSZXR1cm5zTm90UmV0YWluZWQ6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNGUmV0dXJuc1JldGFpbmVkOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDRlVua25vd25UcmFuc2ZlcjogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q1VEQUNvbnN0YW50OiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDVURBRGV2aWNlOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDVURBR2xvYmFsOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDVURBSG9zdDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q1VEQUludmFsaWRUYXJnZXQ6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNVREFMYXVuY2hCb3VuZHM6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8Q1VEQUxhdW5jaEJvdW5kc0F0dHI+KEEpOworICAgIGR1bXBTdG10KFNBLT5nZXRNYXhUaHJlYWRzKCkpOworICAgIGR1bXBTdG10KFNBLT5nZXRNaW5CbG9ja3MoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDVURBU2hhcmVkOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDWFgxMU5vUmV0dXJuOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDYWxsYWJsZVdoZW46IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8Q2FsbGFibGVXaGVuQXR0cj4oQSk7CisgICAgZm9yIChDYWxsYWJsZVdoZW5BdHRyOjpjYWxsYWJsZVN0YXRlc19pdGVyYXRvciBJID0gU0EtPmNhbGxhYmxlU3RhdGVzX2JlZ2luKCksIEUgPSBTQS0+Y2FsbGFibGVTdGF0ZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBzd2l0Y2goKkkpIHsKKyAgICBjYXNlIENhbGxhYmxlV2hlbkF0dHI6OlVua25vd246CisgICAgICBPUyA8PCAiIFVua25vd24iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDYWxsYWJsZVdoZW5BdHRyOjpDb25zdW1lZDoKKyAgICAgIE9TIDw8ICIgQ29uc3VtZWQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDYWxsYWJsZVdoZW5BdHRyOjpVbmNvbnN1bWVkOgorICAgICAgT1MgPDwgIiBVbmNvbnN1bWVkIjsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNhcGFiaWxpdHk6IHsKKyAgICBPUyA8PCAiICIgPDwgQS0+Z2V0U3BlbGxpbmcoKTsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8Q2FwYWJpbGl0eUF0dHI+KEEpOworICAgIE9TIDw8ICIgXCIiIDw8IFNBLT5nZXROYW1lKCkgPDwgIlwiIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNhcHR1cmVkUmVjb3JkOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDYXJyaWVzRGVwZW5kZW5jeTogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q2xlYW51cDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxDbGVhbnVwQXR0cj4oQSk7CisgICAgT1MgPDwgIiAiOworICAgIGR1bXBCYXJlRGVjbFJlZihTQS0+Z2V0RnVuY3Rpb25EZWNsKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q29sZDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q29tbW9uOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDb25zdDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q29uc3RydWN0b3I6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8Q29uc3RydWN0b3JBdHRyPihBKTsKKyAgICBPUyA8PCAiICIgPDwgU0EtPmdldFByaW9yaXR5KCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDb25zdW1hYmxlOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PENvbnN1bWFibGVBdHRyPihBKTsKKyAgICBzd2l0Y2goU0EtPmdldERlZmF1bHRTdGF0ZSgpKSB7CisgICAgY2FzZSBDb25zdW1hYmxlQXR0cjo6VW5rbm93bjoKKyAgICAgIE9TIDw8ICIgVW5rbm93biI7CisgICAgICBicmVhazsKKyAgICBjYXNlIENvbnN1bWFibGVBdHRyOjpDb25zdW1lZDoKKyAgICAgIE9TIDw8ICIgQ29uc3VtZWQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDb25zdW1hYmxlQXR0cjo6VW5jb25zdW1lZDoKKyAgICAgIE9TIDw8ICIgVW5jb25zdW1lZCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDb25zdW1hYmxlQXV0b0Nhc3Q6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNvbnN1bWFibGVTZXRPblJlYWQ6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNvbnZlcmdlbnQ6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkRMTEV4cG9ydDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6RExMSW1wb3J0OiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpEZXByZWNhdGVkOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PERlcHJlY2F0ZWRBdHRyPihBKTsKKyAgICBPUyA8PCAiIFwiIiA8PCBTQS0+Z2V0TWVzc2FnZSgpIDw8ICJcIiI7CisgICAgT1MgPDwgIiBcIiIgPDwgU0EtPmdldFJlcGxhY2VtZW50KCkgPDwgIlwiIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkRlc3RydWN0b3I6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8RGVzdHJ1Y3RvckF0dHI+KEEpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0UHJpb3JpdHkoKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkRpYWdub3NlSWY6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8RGlhZ25vc2VJZkF0dHI+KEEpOworICAgIE9TIDw8ICIgXCIiIDw8IFNBLT5nZXRNZXNzYWdlKCkgPDwgIlwiIjsKKyAgICBzd2l0Y2goU0EtPmdldERpYWdub3N0aWNUeXBlKCkpIHsKKyAgICBjYXNlIERpYWdub3NlSWZBdHRyOjpEVF9FcnJvcjoKKyAgICAgIE9TIDw8ICIgRFRfRXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEaWFnbm9zZUlmQXR0cjo6RFRfV2FybmluZzoKKyAgICAgIE9TIDw8ICIgRFRfV2FybmluZyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKFNBLT5nZXRBcmdEZXBlbmRlbnQoKSkgT1MgPDwgIiBBcmdEZXBlbmRlbnQiOworICAgIE9TIDw8ICIgIjsKKyAgICBkdW1wQmFyZURlY2xSZWYoU0EtPmdldFBhcmVudCgpKTsKKyAgICBkdW1wU3RtdChTQS0+Z2V0Q29uZCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkRpc2FibGVUYWlsQ2FsbHM6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkVtcHR5QmFzZXM6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkVuYWJsZUlmOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEVuYWJsZUlmQXR0cj4oQSk7CisgICAgT1MgPDwgIiBcIiIgPDwgU0EtPmdldE1lc3NhZ2UoKSA8PCAiXCIiOworICAgIGR1bXBTdG10KFNBLT5nZXRDb25kKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6RW51bUV4dGVuc2liaWxpdHk6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8RW51bUV4dGVuc2liaWxpdHlBdHRyPihBKTsKKyAgICBzd2l0Y2goU0EtPmdldEV4dGVuc2liaWxpdHkoKSkgeworICAgIGNhc2UgRW51bUV4dGVuc2liaWxpdHlBdHRyOjpDbG9zZWQ6CisgICAgICBPUyA8PCAiIENsb3NlZCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVudW1FeHRlbnNpYmlsaXR5QXR0cjo6T3BlbjoKKyAgICAgIE9TIDw8ICIgT3BlbiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb246IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8RXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uQXR0cj4oQSk7CisgICAgZHVtcFN0bXQoU0EtPmdldFN1Y2Nlc3NWYWx1ZSgpKTsKKyAgICBmb3IgKEV4Y2x1c2l2ZVRyeWxvY2tGdW5jdGlvbkF0dHI6OmFyZ3NfaXRlcmF0b3IgSSA9IFNBLT5hcmdzX2JlZ2luKCksIEUgPSBTQS0+YXJnc19lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBkdW1wU3RtdCgqSSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpFeHRlcm5hbFNvdXJjZVN5bWJvbDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxFeHRlcm5hbFNvdXJjZVN5bWJvbEF0dHI+KEEpOworICAgIE9TIDw8ICIgXCIiIDw8IFNBLT5nZXRMYW5ndWFnZSgpIDw8ICJcIiI7CisgICAgT1MgPDwgIiBcIiIgPDwgU0EtPmdldERlZmluZWRJbigpIDw8ICJcIiI7CisgICAgaWYgKFNBLT5nZXRHZW5lcmF0ZWREZWNsYXJhdGlvbigpKSBPUyA8PCAiIEdlbmVyYXRlZERlY2xhcmF0aW9uIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkZhbGxUaHJvdWdoOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpGYXN0Q2FsbDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6RmluYWw6IHsKKyAgICBPUyA8PCAiICIgPDwgQS0+Z2V0U3BlbGxpbmcoKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkZsYWdFbnVtOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpGbGF0dGVuOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpGb3JtYXQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8Rm9ybWF0QXR0cj4oQSk7CisgICAgaWYgKFNBLT5nZXRUeXBlKCkpCisgICAgICBPUyA8PCAiICIgPDwgU0EtPmdldFR5cGUoKS0+Z2V0TmFtZSgpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0Rm9ybWF0SWR4KCk7CisgICAgT1MgPDwgIiAiIDw8IFNBLT5nZXRGaXJzdEFyZygpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Rm9ybWF0QXJnOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEZvcm1hdEFyZ0F0dHI+KEEpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0Rm9ybWF0SWR4KCkuZ2V0U291cmNlSW5kZXgoKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkdOVUlubGluZTogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6R3VhcmRlZEJ5OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEd1YXJkZWRCeUF0dHI+KEEpOworICAgIGR1bXBTdG10KFNBLT5nZXRBcmcoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpHdWFyZGVkVmFyOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpIb3Q6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OklCQWN0aW9uOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpJQk91dGxldDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6SUJPdXRsZXRDb2xsZWN0aW9uOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PElCT3V0bGV0Q29sbGVjdGlvbkF0dHI+KEEpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0SW50ZXJmYWNlKCkuZ2V0QXNTdHJpbmcoKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OklGdW5jOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PElGdW5jQXR0cj4oQSk7CisgICAgT1MgPDwgIiBcIiIgPDwgU0EtPmdldFJlc29sdmVyKCkgPDwgIlwiIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkluaXRQcmlvcml0eTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxJbml0UHJpb3JpdHlBdHRyPihBKTsKKyAgICBPUyA8PCAiICIgPDwgU0EtPmdldFByaW9yaXR5KCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpJbml0U2VnOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEluaXRTZWdBdHRyPihBKTsKKyAgICBPUyA8PCAiIFwiIiA8PCBTQS0+Z2V0U2VjdGlvbigpIDw8ICJcIiI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpJbnRlbE9jbEJpY2M6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkludGVybmFsTGlua2FnZTogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TFRPVmlzaWJpbGl0eVB1YmxpYzogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TGF5b3V0VmVyc2lvbjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxMYXlvdXRWZXJzaW9uQXR0cj4oQSk7CisgICAgT1MgPDwgIiAiIDw8IFNBLT5nZXRWZXJzaW9uKCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpMb2NrUmV0dXJuZWQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8TG9ja1JldHVybmVkQXR0cj4oQSk7CisgICAgZHVtcFN0bXQoU0EtPmdldEFyZygpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkxvY2tzRXhjbHVkZWQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8TG9ja3NFeGNsdWRlZEF0dHI+KEEpOworICAgIGZvciAoTG9ja3NFeGNsdWRlZEF0dHI6OmFyZ3NfaXRlcmF0b3IgSSA9IFNBLT5hcmdzX2JlZ2luKCksIEUgPSBTQS0+YXJnc19lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBkdW1wU3RtdCgqSSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpMb29wSGludDogeworICAgIE9TIDw8ICIgIiA8PCBBLT5nZXRTcGVsbGluZygpOworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxMb29wSGludEF0dHI+KEEpOworICAgIHN3aXRjaChTQS0+Z2V0T3B0aW9uKCkpIHsKKyAgICBjYXNlIExvb3BIaW50QXR0cjo6VmVjdG9yaXplOgorICAgICAgT1MgPDwgIiBWZWN0b3JpemUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMb29wSGludEF0dHI6OlZlY3Rvcml6ZVdpZHRoOgorICAgICAgT1MgPDwgIiBWZWN0b3JpemVXaWR0aCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIExvb3BIaW50QXR0cjo6SW50ZXJsZWF2ZToKKyAgICAgIE9TIDw8ICIgSW50ZXJsZWF2ZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIExvb3BIaW50QXR0cjo6SW50ZXJsZWF2ZUNvdW50OgorICAgICAgT1MgPDwgIiBJbnRlcmxlYXZlQ291bnQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMb29wSGludEF0dHI6OlVucm9sbDoKKyAgICAgIE9TIDw8ICIgVW5yb2xsIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTG9vcEhpbnRBdHRyOjpVbnJvbGxDb3VudDoKKyAgICAgIE9TIDw8ICIgVW5yb2xsQ291bnQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMb29wSGludEF0dHI6OkRpc3RyaWJ1dGU6CisgICAgICBPUyA8PCAiIERpc3RyaWJ1dGUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHN3aXRjaChTQS0+Z2V0U3RhdGUoKSkgeworICAgIGNhc2UgTG9vcEhpbnRBdHRyOjpFbmFibGU6CisgICAgICBPUyA8PCAiIEVuYWJsZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIExvb3BIaW50QXR0cjo6RGlzYWJsZToKKyAgICAgIE9TIDw8ICIgRGlzYWJsZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIExvb3BIaW50QXR0cjo6TnVtZXJpYzoKKyAgICAgIE9TIDw8ICIgTnVtZXJpYyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIExvb3BIaW50QXR0cjo6QXNzdW1lU2FmZXR5OgorICAgICAgT1MgPDwgIiBBc3N1bWVTYWZldHkiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMb29wSGludEF0dHI6OkZ1bGw6CisgICAgICBPUyA8PCAiIEZ1bGwiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGR1bXBTdG10KFNBLT5nZXRWYWx1ZSgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok1TQUJJOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpNU0luaGVyaXRhbmNlOiB7CisgICAgT1MgPDwgIiAiIDw8IEEtPmdldFNwZWxsaW5nKCk7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE1TSW5oZXJpdGFuY2VBdHRyPihBKTsKKyAgICBpZiAoU0EtPmdldEJlc3RDYXNlKCkpIE9TIDw8ICIgQmVzdENhc2UiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TVNOb1ZUYWJsZTogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TVNQNDMwSW50ZXJydXB0OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE1TUDQzMEludGVycnVwdEF0dHI+KEEpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0TnVtYmVyKCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpNU1N0cnVjdDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TVNWdG9yRGlzcDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxNU1Z0b3JEaXNwQXR0cj4oQSk7CisgICAgT1MgPDwgIiAiIDw8IFNBLT5nZXRWZG0oKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok1heEZpZWxkQWxpZ25tZW50OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE1heEZpZWxkQWxpZ25tZW50QXR0cj4oQSk7CisgICAgT1MgPDwgIiAiIDw8IFNBLT5nZXRBbGlnbm1lbnQoKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok1heUFsaWFzOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpNaWNyb01pcHM6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok1pblNpemU6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok1pcHMxNjogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TWlwc0ludGVycnVwdDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxNaXBzSW50ZXJydXB0QXR0cj4oQSk7CisgICAgc3dpdGNoKFNBLT5nZXRJbnRlcnJ1cHQoKSkgeworICAgIGNhc2UgTWlwc0ludGVycnVwdEF0dHI6OnN3MDoKKyAgICAgIE9TIDw8ICIgc3cwIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWlwc0ludGVycnVwdEF0dHI6OnN3MToKKyAgICAgIE9TIDw8ICIgc3cxIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWlwc0ludGVycnVwdEF0dHI6Omh3MDoKKyAgICAgIE9TIDw8ICIgaHcwIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWlwc0ludGVycnVwdEF0dHI6Omh3MToKKyAgICAgIE9TIDw8ICIgaHcxIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWlwc0ludGVycnVwdEF0dHI6Omh3MjoKKyAgICAgIE9TIDw8ICIgaHcyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWlwc0ludGVycnVwdEF0dHI6Omh3MzoKKyAgICAgIE9TIDw8ICIgaHczIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWlwc0ludGVycnVwdEF0dHI6Omh3NDoKKyAgICAgIE9TIDw8ICIgaHc0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWlwc0ludGVycnVwdEF0dHI6Omh3NToKKyAgICAgIE9TIDw8ICIgaHc1IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTWlwc0ludGVycnVwdEF0dHI6OmVpYzoKKyAgICAgIE9TIDw8ICIgZWljIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok1pcHNMb25nQ2FsbDogeworICAgIE9TIDw8ICIgIiA8PCBBLT5nZXRTcGVsbGluZygpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TWlwc1Nob3J0Q2FsbDogeworICAgIE9TIDw8ICIgIiA8PCBBLT5nZXRTcGVsbGluZygpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TW9kZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxNb2RlQXR0cj4oQSk7CisgICAgaWYgKFNBLT5nZXRNb2RlKCkpCisgICAgICBPUyA8PCAiICIgPDwgU0EtPmdldE1vZGUoKS0+Z2V0TmFtZSgpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TlNDb25zdW1lZDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TlNDb25zdW1lc1NlbGY6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5TUmV0dXJuc0F1dG9yZWxlYXNlZDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TlNSZXR1cm5zTm90UmV0YWluZWQ6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5TUmV0dXJuc1JldGFpbmVkOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOYWtlZDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Tm9BbGlhczogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Tm9Db21tb246IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5vRGVidWc6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5vRHVwbGljYXRlOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb0VzY2FwZTogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Tm9JbmxpbmU6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5vSW5zdHJ1bWVudEZ1bmN0aW9uOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb01pY3JvTWlwczogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Tm9NaXBzMTY6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5vUmV0dXJuOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb1Nhbml0aXplOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE5vU2FuaXRpemVBdHRyPihBKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IFNBLT5zYW5pdGl6ZXJzKCkpCisgICAgICBPUyA8PCAiICIgPDwgVmFsOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Tm9TcGxpdFN0YWNrOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb1RocmVhZFNhZmV0eUFuYWx5c2lzOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb1Rocm93OiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb25OdWxsOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE5vbk51bGxBdHRyPihBKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IFNBLT5hcmdzKCkpCisgICAgICBPUyA8PCAiICIgPDwgVmFsLmdldFNvdXJjZUluZGV4KCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb3RUYWlsQ2FsbGVkOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPTVBDYXB0dXJlS2luZDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxPTVBDYXB0dXJlS2luZEF0dHI+KEEpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0Q2FwdHVyZUtpbmQoKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9NUENhcHR1cmVOb0luaXQ6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9NUERlY2xhcmVTaW1kRGVjbDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxPTVBEZWNsYXJlU2ltZERlY2xBdHRyPihBKTsKKyAgICBzd2l0Y2goU0EtPmdldEJyYW5jaFN0YXRlKCkpIHsKKyAgICBjYXNlIE9NUERlY2xhcmVTaW1kRGVjbEF0dHI6OkJTX1VuZGVmaW5lZDoKKyAgICAgIE9TIDw8ICIgQlNfVW5kZWZpbmVkIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT01QRGVjbGFyZVNpbWREZWNsQXR0cjo6QlNfSW5icmFuY2g6CisgICAgICBPUyA8PCAiIEJTX0luYnJhbmNoIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT01QRGVjbGFyZVNpbWREZWNsQXR0cjo6QlNfTm90aW5icmFuY2g6CisgICAgICBPUyA8PCAiIEJTX05vdGluYnJhbmNoIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IFNBLT5tb2RpZmllcnMoKSkKKyAgICAgIE9TIDw8ICIgIiA8PCBWYWw7CisgICAgZHVtcFN0bXQoU0EtPmdldFNpbWRsZW4oKSk7CisgICAgZm9yIChPTVBEZWNsYXJlU2ltZERlY2xBdHRyOjp1bmlmb3Jtc19pdGVyYXRvciBJID0gU0EtPnVuaWZvcm1zX2JlZ2luKCksIEUgPSBTQS0+dW5pZm9ybXNfZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgZHVtcFN0bXQoKkkpOworICAgIGZvciAoT01QRGVjbGFyZVNpbWREZWNsQXR0cjo6YWxpZ25lZHNfaXRlcmF0b3IgSSA9IFNBLT5hbGlnbmVkc19iZWdpbigpLCBFID0gU0EtPmFsaWduZWRzX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGR1bXBTdG10KCpJKTsKKyAgICBmb3IgKE9NUERlY2xhcmVTaW1kRGVjbEF0dHI6OmFsaWdubWVudHNfaXRlcmF0b3IgSSA9IFNBLT5hbGlnbm1lbnRzX2JlZ2luKCksIEUgPSBTQS0+YWxpZ25tZW50c19lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBkdW1wU3RtdCgqSSk7CisgICAgZm9yIChPTVBEZWNsYXJlU2ltZERlY2xBdHRyOjpsaW5lYXJzX2l0ZXJhdG9yIEkgPSBTQS0+bGluZWFyc19iZWdpbigpLCBFID0gU0EtPmxpbmVhcnNfZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgZHVtcFN0bXQoKkkpOworICAgIGZvciAoT01QRGVjbGFyZVNpbWREZWNsQXR0cjo6c3RlcHNfaXRlcmF0b3IgSSA9IFNBLT5zdGVwc19iZWdpbigpLCBFID0gU0EtPnN0ZXBzX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGR1bXBTdG10KCpJKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9NUERlY2xhcmVUYXJnZXREZWNsOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE9NUERlY2xhcmVUYXJnZXREZWNsQXR0cj4oQSk7CisgICAgc3dpdGNoKFNBLT5nZXRNYXBUeXBlKCkpIHsKKyAgICBjYXNlIE9NUERlY2xhcmVUYXJnZXREZWNsQXR0cjo6TVRfVG86CisgICAgICBPUyA8PCAiIE1UX1RvIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT01QRGVjbGFyZVRhcmdldERlY2xBdHRyOjpNVF9MaW5rOgorICAgICAgT1MgPDwgIiBNVF9MaW5rIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9NUFJlZmVyZW5jZWRWYXI6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8T01QUmVmZXJlbmNlZFZhckF0dHI+KEEpOworICAgIGR1bXBTdG10KFNBLT5nZXRSZWYoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPTVBUaHJlYWRQcml2YXRlRGVjbDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T2JqQ0JveGFibGU6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNCcmlkZ2U6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8T2JqQ0JyaWRnZUF0dHI+KEEpOworICAgIGlmIChTQS0+Z2V0QnJpZGdlZFR5cGUoKSkKKyAgICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0QnJpZGdlZFR5cGUoKS0+Z2V0TmFtZSgpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T2JqQ0JyaWRnZU11dGFibGU6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8T2JqQ0JyaWRnZU11dGFibGVBdHRyPihBKTsKKyAgICBpZiAoU0EtPmdldEJyaWRnZWRUeXBlKCkpCisgICAgICBPUyA8PCAiICIgPDwgU0EtPmdldEJyaWRnZWRUeXBlKCktPmdldE5hbWUoKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNCcmlkZ2VSZWxhdGVkOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE9iakNCcmlkZ2VSZWxhdGVkQXR0cj4oQSk7CisgICAgaWYgKFNBLT5nZXRSZWxhdGVkQ2xhc3MoKSkKKyAgICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0UmVsYXRlZENsYXNzKCktPmdldE5hbWUoKTsKKyAgICBpZiAoU0EtPmdldENsYXNzTWV0aG9kKCkpCisgICAgICBPUyA8PCAiICIgPDwgU0EtPmdldENsYXNzTWV0aG9kKCktPmdldE5hbWUoKTsKKyAgICBpZiAoU0EtPmdldEluc3RhbmNlTWV0aG9kKCkpCisgICAgICBPUyA8PCAiICIgPDwgU0EtPmdldEluc3RhbmNlTWV0aG9kKCktPmdldE5hbWUoKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNEZXNpZ25hdGVkSW5pdGlhbGl6ZXI6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNFeGNlcHRpb246IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNFeHBsaWNpdFByb3RvY29sSW1wbDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T2JqQ0luZGVwZW5kZW50Q2xhc3M6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNNZXRob2RGYW1pbHk6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8T2JqQ01ldGhvZEZhbWlseUF0dHI+KEEpOworICAgIHN3aXRjaChTQS0+Z2V0RmFtaWx5KCkpIHsKKyAgICBjYXNlIE9iakNNZXRob2RGYW1pbHlBdHRyOjpPTUZfTm9uZToKKyAgICAgIE9TIDw8ICIgT01GX05vbmUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPYmpDTWV0aG9kRmFtaWx5QXR0cjo6T01GX2FsbG9jOgorICAgICAgT1MgPDwgIiBPTUZfYWxsb2MiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPYmpDTWV0aG9kRmFtaWx5QXR0cjo6T01GX2NvcHk6CisgICAgICBPUyA8PCAiIE9NRl9jb3B5IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT2JqQ01ldGhvZEZhbWlseUF0dHI6Ok9NRl9pbml0OgorICAgICAgT1MgPDwgIiBPTUZfaW5pdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9iakNNZXRob2RGYW1pbHlBdHRyOjpPTUZfbXV0YWJsZUNvcHk6CisgICAgICBPUyA8PCAiIE9NRl9tdXRhYmxlQ29weSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9iakNNZXRob2RGYW1pbHlBdHRyOjpPTUZfbmV3OgorICAgICAgT1MgPDwgIiBPTUZfbmV3IjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNOU09iamVjdDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T2JqQ1ByZWNpc2VMaWZldGltZTogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDUmVxdWlyZXNTdXBlcjogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T2JqQ1JldHVybnNJbm5lclBvaW50ZXI6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNSb290Q2xhc3M6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNSdW50aW1lTmFtZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxPYmpDUnVudGltZU5hbWVBdHRyPihBKTsKKyAgICBPUyA8PCAiIFwiIiA8PCBTQS0+Z2V0TWV0YWRhdGFOYW1lKCkgPDwgIlwiIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNSdW50aW1lVmlzaWJsZTogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T2JqQ1N1YmNsYXNzaW5nUmVzdHJpY3RlZDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T3BlbkNMQWNjZXNzOiB7CisgICAgT1MgPDwgIiAiIDw8IEEtPmdldFNwZWxsaW5nKCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPcGVuQ0xJbnRlbFJlcWRTdWJHcm91cFNpemU6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8T3BlbkNMSW50ZWxSZXFkU3ViR3JvdXBTaXplQXR0cj4oQSk7CisgICAgT1MgPDwgIiAiIDw8IFNBLT5nZXRTdWJHcm91cFNpemUoKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9wZW5DTEtlcm5lbDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T3BlbkNMVW5yb2xsSGludDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxPcGVuQ0xVbnJvbGxIaW50QXR0cj4oQSk7CisgICAgT1MgPDwgIiAiIDw8IFNBLT5nZXRVbnJvbGxIaW50KCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPcHRpbWl6ZU5vbmU6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok92ZXJsb2FkYWJsZTogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T3ZlcnJpZGU6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok93bmVyc2hpcDogeworICAgIE9TIDw8ICIgIiA8PCBBLT5nZXRTcGVsbGluZygpOworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxPd25lcnNoaXBBdHRyPihBKTsKKyAgICBpZiAoU0EtPmdldE1vZHVsZSgpKQorICAgICAgT1MgPDwgIiAiIDw8IFNBLT5nZXRNb2R1bGUoKS0+Z2V0TmFtZSgpOworICAgIGZvciAoY29uc3QgYXV0byAmVmFsIDogU0EtPmFyZ3MoKSkKKyAgICAgIE9TIDw8ICIgIiA8PCBWYWwuZ2V0U291cmNlSW5kZXgoKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlBhY2tlZDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UGFyYW1UeXBlc3RhdGU6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8UGFyYW1UeXBlc3RhdGVBdHRyPihBKTsKKyAgICBzd2l0Y2goU0EtPmdldFBhcmFtU3RhdGUoKSkgeworICAgIGNhc2UgUGFyYW1UeXBlc3RhdGVBdHRyOjpVbmtub3duOgorICAgICAgT1MgPDwgIiBVbmtub3duIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUGFyYW1UeXBlc3RhdGVBdHRyOjpDb25zdW1lZDoKKyAgICAgIE9TIDw8ICIgQ29uc3VtZWQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQYXJhbVR5cGVzdGF0ZUF0dHI6OlVuY29uc3VtZWQ6CisgICAgICBPUyA8PCAiIFVuY29uc3VtZWQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UGFzY2FsOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpQYXNzT2JqZWN0U2l6ZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxQYXNzT2JqZWN0U2l6ZUF0dHI+KEEpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0VHlwZSgpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UGNzOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFBjc0F0dHI+KEEpOworICAgIHN3aXRjaChTQS0+Z2V0UENTKCkpIHsKKyAgICBjYXNlIFBjc0F0dHI6OkFBUENTOgorICAgICAgT1MgPDwgIiBBQVBDUyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBjc0F0dHI6OkFBUENTX1ZGUDoKKyAgICAgIE9TIDw8ICIgQUFQQ1NfVkZQIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlByYWdtYUNsYW5nQlNTU2VjdGlvbjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxQcmFnbWFDbGFuZ0JTU1NlY3Rpb25BdHRyPihBKTsKKyAgICBPUyA8PCAiIFwiIiA8PCBTQS0+Z2V0TmFtZSgpIDw8ICJcIiI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpQcmFnbWFDbGFuZ0RhdGFTZWN0aW9uOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFByYWdtYUNsYW5nRGF0YVNlY3Rpb25BdHRyPihBKTsKKyAgICBPUyA8PCAiIFwiIiA8PCBTQS0+Z2V0TmFtZSgpIDw8ICJcIiI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb246IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8UHJhZ21hQ2xhbmdSb2RhdGFTZWN0aW9uQXR0cj4oQSk7CisgICAgT1MgPDwgIiBcIiIgPDwgU0EtPmdldE5hbWUoKSA8PCAiXCIiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UHJhZ21hQ2xhbmdUZXh0U2VjdGlvbjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxQcmFnbWFDbGFuZ1RleHRTZWN0aW9uQXR0cj4oQSk7CisgICAgT1MgPDwgIiBcIiIgPDwgU0EtPmdldE5hbWUoKSA8PCAiXCIiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UHJlc2VydmVBbGw6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlByZXNlcnZlTW9zdDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UHRHdWFyZGVkQnk6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8UHRHdWFyZGVkQnlBdHRyPihBKTsKKyAgICBkdW1wU3RtdChTQS0+Z2V0QXJnKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UHRHdWFyZGVkVmFyOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpQdXJlOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpSZWdDYWxsOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpSZWxlYXNlQ2FwYWJpbGl0eTogeworICAgIE9TIDw8ICIgIiA8PCBBLT5nZXRTcGVsbGluZygpOworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxSZWxlYXNlQ2FwYWJpbGl0eUF0dHI+KEEpOworICAgIGZvciAoUmVsZWFzZUNhcGFiaWxpdHlBdHRyOjphcmdzX2l0ZXJhdG9yIEkgPSBTQS0+YXJnc19iZWdpbigpLCBFID0gU0EtPmFyZ3NfZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgZHVtcFN0bXQoKkkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UmVuZGVyU2NyaXB0S2VybmVsOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpSZXFkV29ya0dyb3VwU2l6ZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxSZXFkV29ya0dyb3VwU2l6ZUF0dHI+KEEpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0WERpbSgpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0WURpbSgpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0WkRpbSgpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UmVxdWlyZUNvbnN0YW50SW5pdDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UmVxdWlyZXNDYXBhYmlsaXR5OiB7CisgICAgT1MgPDwgIiAiIDw8IEEtPmdldFNwZWxsaW5nKCk7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFJlcXVpcmVzQ2FwYWJpbGl0eUF0dHI+KEEpOworICAgIGZvciAoUmVxdWlyZXNDYXBhYmlsaXR5QXR0cjo6YXJnc19pdGVyYXRvciBJID0gU0EtPmFyZ3NfYmVnaW4oKSwgRSA9IFNBLT5hcmdzX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGR1bXBTdG10KCpJKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlJlc3RyaWN0OiB7CisgICAgT1MgPDwgIiAiIDw8IEEtPmdldFNwZWxsaW5nKCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpSZXR1cm5UeXBlc3RhdGU6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8UmV0dXJuVHlwZXN0YXRlQXR0cj4oQSk7CisgICAgc3dpdGNoKFNBLT5nZXRTdGF0ZSgpKSB7CisgICAgY2FzZSBSZXR1cm5UeXBlc3RhdGVBdHRyOjpVbmtub3duOgorICAgICAgT1MgPDwgIiBVbmtub3duIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUmV0dXJuVHlwZXN0YXRlQXR0cjo6Q29uc3VtZWQ6CisgICAgICBPUyA8PCAiIENvbnN1bWVkIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUmV0dXJuVHlwZXN0YXRlQXR0cjo6VW5jb25zdW1lZDoKKyAgICAgIE9TIDw8ICIgVW5jb25zdW1lZCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpSZXR1cm5zTm9uTnVsbDogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UmV0dXJuc1R3aWNlOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpTY29wZWRMb2NrYWJsZTogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6U2VjdGlvbjogeworICAgIE9TIDw8ICIgIiA8PCBBLT5nZXRTcGVsbGluZygpOworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxTZWN0aW9uQXR0cj4oQSk7CisgICAgT1MgPDwgIiBcIiIgPDwgU0EtPmdldE5hbWUoKSA8PCAiXCIiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6U2VsZWN0QW55OiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpTZW50aW5lbDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxTZW50aW5lbEF0dHI+KEEpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0U2VudGluZWwoKTsKKyAgICBPUyA8PCAiICIgPDwgU0EtPmdldE51bGxQb3MoKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlNldFR5cGVzdGF0ZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxTZXRUeXBlc3RhdGVBdHRyPihBKTsKKyAgICBzd2l0Y2goU0EtPmdldE5ld1N0YXRlKCkpIHsKKyAgICBjYXNlIFNldFR5cGVzdGF0ZUF0dHI6OlVua25vd246CisgICAgICBPUyA8PCAiIFVua25vd24iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXRUeXBlc3RhdGVBdHRyOjpDb25zdW1lZDoKKyAgICAgIE9TIDw8ICIgQ29uc3VtZWQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXRUeXBlc3RhdGVBdHRyOjpVbmNvbnN1bWVkOgorICAgICAgT1MgPDwgIiBVbmNvbnN1bWVkIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlNoYXJlZFRyeWxvY2tGdW5jdGlvbjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxTaGFyZWRUcnlsb2NrRnVuY3Rpb25BdHRyPihBKTsKKyAgICBkdW1wU3RtdChTQS0+Z2V0U3VjY2Vzc1ZhbHVlKCkpOworICAgIGZvciAoU2hhcmVkVHJ5bG9ja0Z1bmN0aW9uQXR0cjo6YXJnc19pdGVyYXRvciBJID0gU0EtPmFyZ3NfYmVnaW4oKSwgRSA9IFNBLT5hcmdzX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGR1bXBTdG10KCpJKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlN0ZENhbGw6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlN1cHByZXNzOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFN1cHByZXNzQXR0cj4oQSk7CisgICAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBTQS0+ZGlhZ25vc3RpY0lkZW50aWZpZXJzKCkpCisgICAgICBPUyA8PCAiICIgPDwgVmFsOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6U3dpZnRDYWxsOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpTd2lmdENvbnRleHQ6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlN3aWZ0RXJyb3JSZXN1bHQ6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlN3aWZ0SW5kaXJlY3RSZXN1bHQ6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlN5c1ZBQkk6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlRMU01vZGVsOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFRMU01vZGVsQXR0cj4oQSk7CisgICAgT1MgPDwgIiBcIiIgPDwgU0EtPmdldE1vZGVsKCkgPDwgIlwiIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlRhcmdldDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxUYXJnZXRBdHRyPihBKTsKKyAgICBPUyA8PCAiIFwiIiA8PCBTQS0+Z2V0RmVhdHVyZXNTdHIoKSA8PCAiXCIiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6VGVzdFR5cGVzdGF0ZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxUZXN0VHlwZXN0YXRlQXR0cj4oQSk7CisgICAgc3dpdGNoKFNBLT5nZXRUZXN0U3RhdGUoKSkgeworICAgIGNhc2UgVGVzdFR5cGVzdGF0ZUF0dHI6OkNvbnN1bWVkOgorICAgICAgT1MgPDwgIiBDb25zdW1lZCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRlc3RUeXBlc3RhdGVBdHRyOjpVbmNvbnN1bWVkOgorICAgICAgT1MgPDwgIiBVbmNvbnN1bWVkIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlRoaXNDYWxsOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpUaHJlYWQ6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlRyYW5zcGFyZW50VW5pb246IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlRyaXZpYWxBQkk6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlRyeUFjcXVpcmVDYXBhYmlsaXR5OiB7CisgICAgT1MgPDwgIiAiIDw8IEEtPmdldFNwZWxsaW5nKCk7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFRyeUFjcXVpcmVDYXBhYmlsaXR5QXR0cj4oQSk7CisgICAgZHVtcFN0bXQoU0EtPmdldFN1Y2Nlc3NWYWx1ZSgpKTsKKyAgICBmb3IgKFRyeUFjcXVpcmVDYXBhYmlsaXR5QXR0cjo6YXJnc19pdGVyYXRvciBJID0gU0EtPmFyZ3NfYmVnaW4oKSwgRSA9IFNBLT5hcmdzX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGR1bXBTdG10KCpJKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlR5cGVUYWdGb3JEYXRhdHlwZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxUeXBlVGFnRm9yRGF0YXR5cGVBdHRyPihBKTsKKyAgICBpZiAoU0EtPmdldEFyZ3VtZW50S2luZCgpKQorICAgICAgT1MgPDwgIiAiIDw8IFNBLT5nZXRBcmd1bWVudEtpbmQoKS0+Z2V0TmFtZSgpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0TWF0Y2hpbmdDVHlwZSgpLmdldEFzU3RyaW5nKCk7CisgICAgaWYgKFNBLT5nZXRMYXlvdXRDb21wYXRpYmxlKCkpIE9TIDw8ICIgTGF5b3V0Q29tcGF0aWJsZSI7CisgICAgaWYgKFNBLT5nZXRNdXN0QmVOdWxsKCkpIE9TIDw8ICIgTXVzdEJlTnVsbCI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpUeXBlVmlzaWJpbGl0eTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxUeXBlVmlzaWJpbGl0eUF0dHI+KEEpOworICAgIHN3aXRjaChTQS0+Z2V0VmlzaWJpbGl0eSgpKSB7CisgICAgY2FzZSBUeXBlVmlzaWJpbGl0eUF0dHI6OkRlZmF1bHQ6CisgICAgICBPUyA8PCAiIERlZmF1bHQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlVmlzaWJpbGl0eUF0dHI6OkhpZGRlbjoKKyAgICAgIE9TIDw8ICIgSGlkZGVuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZVZpc2liaWxpdHlBdHRyOjpQcm90ZWN0ZWQ6CisgICAgICBPUyA8PCAiIFByb3RlY3RlZCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpVbmF2YWlsYWJsZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxVbmF2YWlsYWJsZUF0dHI+KEEpOworICAgIE9TIDw8ICIgXCIiIDw8IFNBLT5nZXRNZXNzYWdlKCkgPDwgIlwiIjsKKyAgICBzd2l0Y2goU0EtPmdldEltcGxpY2l0UmVhc29uKCkpIHsKKyAgICBjYXNlIFVuYXZhaWxhYmxlQXR0cjo6SVJfTm9uZToKKyAgICAgIE9TIDw8ICIgSVJfTm9uZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVuYXZhaWxhYmxlQXR0cjo6SVJfQVJDRm9yYmlkZGVuVHlwZToKKyAgICAgIE9TIDw8ICIgSVJfQVJDRm9yYmlkZGVuVHlwZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVuYXZhaWxhYmxlQXR0cjo6SVJfRm9yYmlkZGVuV2VhazoKKyAgICAgIE9TIDw8ICIgSVJfRm9yYmlkZGVuV2VhayI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVuYXZhaWxhYmxlQXR0cjo6SVJfQVJDRm9yYmlkZGVuQ29udmVyc2lvbjoKKyAgICAgIE9TIDw8ICIgSVJfQVJDRm9yYmlkZGVuQ29udmVyc2lvbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVuYXZhaWxhYmxlQXR0cjo6SVJfQVJDSW5pdFJldHVybnNVbnJlbGF0ZWQ6CisgICAgICBPUyA8PCAiIElSX0FSQ0luaXRSZXR1cm5zVW5yZWxhdGVkIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVW5hdmFpbGFibGVBdHRyOjpJUl9BUkNGaWVsZFdpdGhPd25lcnNoaXA6CisgICAgICBPUyA8PCAiIElSX0FSQ0ZpZWxkV2l0aE93bmVyc2hpcCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpVbnVzZWQ6IHsKKyAgICBPUyA8PCAiICIgPDwgQS0+Z2V0U3BlbGxpbmcoKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlVzZWQ6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlV1aWQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8VXVpZEF0dHI+KEEpOworICAgIE9TIDw8ICIgXCIiIDw8IFNBLT5nZXRHdWlkKCkgPDwgIlwiIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlZlY1JldHVybjogeworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6VmVjVHlwZUhpbnQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8VmVjVHlwZUhpbnRBdHRyPihBKTsKKyAgICBPUyA8PCAiICIgPDwgU0EtPmdldFR5cGVIaW50KCkuZ2V0QXNTdHJpbmcoKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlZlY3RvckNhbGw6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlZpc2liaWxpdHk6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8VmlzaWJpbGl0eUF0dHI+KEEpOworICAgIHN3aXRjaChTQS0+Z2V0VmlzaWJpbGl0eSgpKSB7CisgICAgY2FzZSBWaXNpYmlsaXR5QXR0cjo6RGVmYXVsdDoKKyAgICAgIE9TIDw8ICIgRGVmYXVsdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFZpc2liaWxpdHlBdHRyOjpIaWRkZW46CisgICAgICBPUyA8PCAiIEhpZGRlbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFZpc2liaWxpdHlBdHRyOjpQcm90ZWN0ZWQ6CisgICAgICBPUyA8PCAiIFByb3RlY3RlZCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpXYXJuVW51c2VkOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpXYXJuVW51c2VkUmVzdWx0OiB7CisgICAgT1MgPDwgIiAiIDw8IEEtPmdldFNwZWxsaW5nKCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpXZWFrOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpXZWFrSW1wb3J0OiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpXZWFrUmVmOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFdlYWtSZWZBdHRyPihBKTsKKyAgICBPUyA8PCAiIFwiIiA8PCBTQS0+Z2V0QWxpYXNlZSgpIDw8ICJcIiI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpXb3JrR3JvdXBTaXplSGludDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxXb3JrR3JvdXBTaXplSGludEF0dHI+KEEpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0WERpbSgpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0WURpbSgpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0WkRpbSgpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6WDg2Rm9yY2VBbGlnbkFyZ1BvaW50ZXI6IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlhSYXlJbnN0cnVtZW50OiB7CisgICAgT1MgPDwgIiAiIDw8IEEtPmdldFNwZWxsaW5nKCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpYUmF5TG9nQXJnczogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxYUmF5TG9nQXJnc0F0dHI+KEEpOworICAgIE9TIDw8ICIgIiA8PCBTQS0+Z2V0QXJndW1lbnRDb3VudCgpOworICAgIGJyZWFrOworICB9CisgIH0KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BdHRySW1wbC5pbmMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQXR0ckltcGwuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2FiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQXR0ckltcGwuaW5jCkBAIC0wLDAgKzEsMTA1OTggQEAKKy8qPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogQXR0cmlidXRlIGNsYXNzZXMnIG1lbWJlciBmdW5jdGlvbiBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLCBkbyBub3QgZWRpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKK0FNREdQVUZsYXRXb3JrR3JvdXBTaXplQXR0ciAqQU1ER1BVRmxhdFdvcmtHcm91cFNpemVBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEFNREdQVUZsYXRXb3JrR3JvdXBTaXplQXR0cihnZXRMb2NhdGlvbigpLCBDLCBtaW4sIG1heCwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBBTURHUFVGbGF0V29ya0dyb3VwU2l6ZUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGFtZGdwdV9mbGF0X3dvcmtfZ3JvdXBfc2l6ZSgiIDw8IGdldE1pbigpIDw8ICIsICIgPDwgZ2V0TWF4KCkgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6YW1kZ3B1X2ZsYXRfd29ya19ncm91cF9zaXplKCIgPDwgZ2V0TWluKCkgPDwgIiwgIiA8PCBnZXRNYXgoKSA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpBTURHUFVGbGF0V29ya0dyb3VwU2l6ZUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiYW1kZ3B1X2ZsYXRfd29ya19ncm91cF9zaXplIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiYW1kZ3B1X2ZsYXRfd29ya19ncm91cF9zaXplIjsKKyAgfQorfQorCitBTURHUFVOdW1TR1BSQXR0ciAqQU1ER1BVTnVtU0dQUkF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQU1ER1BVTnVtU0dQUkF0dHIoZ2V0TG9jYXRpb24oKSwgQywgbnVtU0dQUiwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBBTURHUFVOdW1TR1BSQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoYW1kZ3B1X251bV9zZ3ByKCIgPDwgZ2V0TnVtU0dQUigpIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OmFtZGdwdV9udW1fc2dwcigiIDw8IGdldE51bVNHUFIoKSA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpBTURHUFVOdW1TR1BSQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJhbWRncHVfbnVtX3NncHIiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJhbWRncHVfbnVtX3NncHIiOworICB9Cit9CisKK0FNREdQVU51bVZHUFJBdHRyICpBTURHUFVOdW1WR1BSQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBBTURHUFVOdW1WR1BSQXR0cihnZXRMb2NhdGlvbigpLCBDLCBudW1WR1BSLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEFNREdQVU51bVZHUFJBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChhbWRncHVfbnVtX3ZncHIoIiA8PCBnZXROdW1WR1BSKCkgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6YW1kZ3B1X251bV92Z3ByKCIgPDwgZ2V0TnVtVkdQUigpIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkFNREdQVU51bVZHUFJBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImFtZGdwdV9udW1fdmdwciI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImFtZGdwdV9udW1fdmdwciI7CisgIH0KK30KKworQU1ER1BVV2F2ZXNQZXJFVUF0dHIgKkFNREdQVVdhdmVzUGVyRVVBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEFNREdQVVdhdmVzUGVyRVVBdHRyKGdldExvY2F0aW9uKCksIEMsIG1pbiwgbWF4LCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEFNREdQVVdhdmVzUGVyRVVBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChhbWRncHVfd2F2ZXNfcGVyX2V1KCIgPDwgZ2V0TWluKCkgPDwgIiwgIiA8PCBnZXRNYXgoKSA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjphbWRncHVfd2F2ZXNfcGVyX2V1KCIgPDwgZ2V0TWluKCkgPDwgIiwgIiA8PCBnZXRNYXgoKSA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpBTURHUFVXYXZlc1BlckVVQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJhbWRncHVfd2F2ZXNfcGVyX2V1IjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiYW1kZ3B1X3dhdmVzX3Blcl9ldSI7CisgIH0KK30KKworQVJNSW50ZXJydXB0QXR0ciAqQVJNSW50ZXJydXB0QXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBBUk1JbnRlcnJ1cHRBdHRyKGdldExvY2F0aW9uKCksIEMsIGludGVycnVwdCwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBBUk1JbnRlcnJ1cHRBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChpbnRlcnJ1cHQoXCIiIDw8IEFSTUludGVycnVwdEF0dHI6OkNvbnZlcnRJbnRlcnJ1cHRUeXBlVG9TdHIoZ2V0SW50ZXJydXB0KCkpIDw8ICJcIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6OmludGVycnVwdChcIiIgPDwgQVJNSW50ZXJydXB0QXR0cjo6Q29udmVydEludGVycnVwdFR5cGVUb1N0cihnZXRJbnRlcnJ1cHQoKSkgPDwgIlwiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpBUk1JbnRlcnJ1cHRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImludGVycnVwdCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImludGVycnVwdCI7CisgIH0KK30KKworQVZSSW50ZXJydXB0QXR0ciAqQVZSSW50ZXJydXB0QXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBBVlJJbnRlcnJ1cHRBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQVZSSW50ZXJydXB0QXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoaW50ZXJydXB0KSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251OjppbnRlcnJ1cHRdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqQVZSSW50ZXJydXB0QXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJpbnRlcnJ1cHQiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJpbnRlcnJ1cHQiOworICB9Cit9CisKK0FWUlNpZ25hbEF0dHIgKkFWUlNpZ25hbEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQVZSU2lnbmFsQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEFWUlNpZ25hbEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHNpZ25hbCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6c2lnbmFsXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkFWUlNpZ25hbEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAic2lnbmFsIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAic2lnbmFsIjsKKyAgfQorfQorCitBYmlUYWdBdHRyICpBYmlUYWdBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEFiaVRhZ0F0dHIoZ2V0TG9jYXRpb24oKSwgQywgdGFnc18sIHRhZ3NfU2l6ZSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBBYmlUYWdBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChhYmlfdGFnKCI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogdGFncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgIlwiIiA8PCBWYWwgPDwgIlwiIjsKKyAgfQorICBPUyA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6YWJpX3RhZygiOworICBib29sIGlzRmlyc3QgPSB0cnVlOworICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IHRhZ3MoKSkgeworICAgIGlmIChpc0ZpcnN0KSBpc0ZpcnN0ID0gZmFsc2U7CisgICAgZWxzZSBPUyA8PCAiLCAiOworICAgIE9TIDw8ICJcIiIgPDwgVmFsIDw8ICJcIiI7CisgIH0KKyAgT1MgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqQWJpVGFnQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJhYmlfdGFnIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiYWJpX3RhZyI7CisgIH0KK30KKworQWNxdWlyZUNhcGFiaWxpdHlBdHRyICpBY3F1aXJlQ2FwYWJpbGl0eUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQWNxdWlyZUNhcGFiaWxpdHlBdHRyKGdldExvY2F0aW9uKCksIEMsIGFyZ3NfLCBhcmdzX1NpemUsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQWNxdWlyZUNhcGFiaWxpdHlBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChhY3F1aXJlX2NhcGFiaWxpdHkoIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBhcmdzKCkpIHsKKyAgICBpZiAoaXNGaXJzdCkgaXNGaXJzdCA9IGZhbHNlOworICAgIGVsc2UgT1MgPDwgIiwgIjsKKyAgICBPUyA8PCBWYWw7CisgIH0KKyAgT1MgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6YWNxdWlyZV9jYXBhYmlsaXR5KCI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsOworICB9CisgIE9TIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGFjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkoIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBhcmdzKCkpIHsKKyAgICBpZiAoaXNGaXJzdCkgaXNGaXJzdCA9IGZhbHNlOworICAgIGVsc2UgT1MgPDwgIiwgIjsKKyAgICBPUyA8PCBWYWw7CisgIH0KKyAgT1MgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAzIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6YWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSgiOworICBib29sIGlzRmlyc3QgPSB0cnVlOworICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IGFyZ3MoKSkgeworICAgIGlmIChpc0ZpcnN0KSBpc0ZpcnN0ID0gZmFsc2U7CisgICAgZWxzZSBPUyA8PCAiLCAiOworICAgIE9TIDw8IFZhbDsKKyAgfQorICBPUyA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDQgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChleGNsdXNpdmVfbG9ja19mdW5jdGlvbigiOworICBib29sIGlzRmlyc3QgPSB0cnVlOworICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IGFyZ3MoKSkgeworICAgIGlmIChpc0ZpcnN0KSBpc0ZpcnN0ID0gZmFsc2U7CisgICAgZWxzZSBPUyA8PCAiLCAiOworICAgIE9TIDw8IFZhbDsKKyAgfQorICBPUyA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDUgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChzaGFyZWRfbG9ja19mdW5jdGlvbigiOworICBib29sIGlzRmlyc3QgPSB0cnVlOworICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IGFyZ3MoKSkgeworICAgIGlmIChpc0ZpcnN0KSBpc0ZpcnN0ID0gZmFsc2U7CisgICAgZWxzZSBPUyA8PCAiLCAiOworICAgIE9TIDw8IFZhbDsKKyAgfQorICBPUyA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpBY3F1aXJlQ2FwYWJpbGl0eUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiYWNxdWlyZV9jYXBhYmlsaXR5IjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiYWNxdWlyZV9jYXBhYmlsaXR5IjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAiYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSI7CisgIGNhc2UgMzoKKyAgICByZXR1cm4gImFjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkiOworICBjYXNlIDQ6CisgICAgcmV0dXJuICJleGNsdXNpdmVfbG9ja19mdW5jdGlvbiI7CisgIGNhc2UgNToKKyAgICByZXR1cm4gInNoYXJlZF9sb2NrX2Z1bmN0aW9uIjsKKyAgfQorfQorCitBY3F1aXJlZEFmdGVyQXR0ciAqQWNxdWlyZWRBZnRlckF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQWNxdWlyZWRBZnRlckF0dHIoZ2V0TG9jYXRpb24oKSwgQywgYXJnc18sIGFyZ3NfU2l6ZSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBBY3F1aXJlZEFmdGVyQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoYWNxdWlyZWRfYWZ0ZXIoIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBhcmdzKCkpIHsKKyAgICBpZiAoaXNGaXJzdCkgaXNGaXJzdCA9IGZhbHNlOworICAgIGVsc2UgT1MgPDwgIiwgIjsKKyAgICBPUyA8PCBWYWw7CisgIH0KKyAgT1MgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqQWNxdWlyZWRBZnRlckF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiYWNxdWlyZWRfYWZ0ZXIiOworICB9Cit9CisKK0FjcXVpcmVkQmVmb3JlQXR0ciAqQWNxdWlyZWRCZWZvcmVBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEFjcXVpcmVkQmVmb3JlQXR0cihnZXRMb2NhdGlvbigpLCBDLCBhcmdzXywgYXJnc19TaXplLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEFjcXVpcmVkQmVmb3JlQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoYWNxdWlyZWRfYmVmb3JlKCI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsOworICB9CisgIE9TIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkFjcXVpcmVkQmVmb3JlQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJhY3F1aXJlZF9iZWZvcmUiOworICB9Cit9CisKK0FsaWFzQXR0ciAqQWxpYXNBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEFsaWFzQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRBbGlhc2VlKCksIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQWxpYXNBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChhbGlhcyhcIiIgPDwgZ2V0QWxpYXNlZSgpIDw8ICJcIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6OmFsaWFzKFwiIiA8PCBnZXRBbGlhc2VlKCkgPDwgIlwiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpBbGlhc0F0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiYWxpYXMiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJhbGlhcyI7CisgIH0KK30KKworQWxpZ25NYWM2OGtBdHRyICpBbGlnbk1hYzY4a0F0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQWxpZ25NYWM2OGtBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQWxpZ25NYWM2OGtBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKK30KKworY29uc3QgY2hhciAqQWxpZ25NYWM2OGtBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKK30KKworQWxpZ25WYWx1ZUF0dHIgKkFsaWduVmFsdWVBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEFsaWduVmFsdWVBdHRyKGdldExvY2F0aW9uKCksIEMsIGFsaWdubWVudCwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBBbGlnblZhbHVlQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoYWxpZ25fdmFsdWUoIiA8PCBnZXRBbGlnbm1lbnQoKSA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpBbGlnblZhbHVlQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJhbGlnbl92YWx1ZSI7CisgIH0KK30KKworYm9vbCBBbGlnbmVkQXR0cjo6aXNBbGlnbm1lbnREZXBlbmRlbnQoKSBjb25zdCB7CisgIGlmIChpc2FsaWdubWVudEV4cHIpCisgICAgcmV0dXJuIGFsaWdubWVudEV4cHIgJiYgKGFsaWdubWVudEV4cHItPmlzVmFsdWVEZXBlbmRlbnQoKSB8fCBhbGlnbm1lbnRFeHByLT5pc1R5cGVEZXBlbmRlbnQoKSk7CisgIGVsc2UKKyAgICByZXR1cm4gYWxpZ25tZW50VHlwZS0+Z2V0VHlwZSgpLT5pc0RlcGVuZGVudFR5cGUoKTsKK30KK3Vuc2lnbmVkIEFsaWduZWRBdHRyOjpnZXRBbGlnbm1lbnQoQVNUQ29udGV4dCAmQ3R4KSBjb25zdCB7CisgIGFzc2VydCghaXNBbGlnbm1lbnREZXBlbmRlbnQoKSk7CisgIGlmIChpc2FsaWdubWVudEV4cHIpCisgICAgcmV0dXJuIGFsaWdubWVudEV4cHIgPyBhbGlnbm1lbnRFeHByLT5FdmFsdWF0ZUtub3duQ29uc3RJbnQoQ3R4KS5nZXRaRXh0VmFsdWUoKSAqIEN0eC5nZXRDaGFyV2lkdGgoKSA6IEN0eC5nZXRUYXJnZXREZWZhdWx0QWxpZ25Gb3JBdHRyaWJ1dGVBbGlnbmVkKCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsgLy8gRklYTUUKK30KK0FsaWduZWRBdHRyICpBbGlnbmVkQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBBbGlnbmVkQXR0cihnZXRMb2NhdGlvbigpLCBDLCBpc2FsaWdubWVudEV4cHIsIGlzYWxpZ25tZW50RXhwciA/IHN0YXRpY19jYXN0PHZvaWQqPihhbGlnbm1lbnRFeHByKSA6IGFsaWdubWVudFR5cGUsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQWxpZ25lZEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGFsaWduZWQiOworICAgIHVuc2lnbmVkIFRyYWlsaW5nT21pdHRlZEFyZ3MgPSAwOworICAgIGlmICghaXNhbGlnbm1lbnRFeHByIHx8ICFhbGlnbm1lbnRFeHByKQorICAgICAgKytUcmFpbGluZ09taXR0ZWRBcmdzOworICAgIE9TIDw8ICIiOworICAgIGlmIChUcmFpbGluZ09taXR0ZWRBcmdzIDwgMSkKKyAgICAgICBPUyA8PCAiKCI7CisgICAgT1MgPDwgIiI7CisgICAgaWYgKCEoIWlzYWxpZ25tZW50RXhwciB8fCAhYWxpZ25tZW50RXhwcikpIHsKKyAgICAgIE9TIDw8ICIiOworICAgIGFsaWdubWVudEV4cHItPnByaW50UHJldHR5KE9TLCBudWxscHRyLCBQb2xpY3kpOworICAgIE9TIDw8ICIiOworICAgIH0KKyAgICBPUyA8PCAiIjsKKyAgICBpZiAoVHJhaWxpbmdPbWl0dGVkQXJncyA8IDEpCisgICAgICAgT1MgPDwgIikiOworICAgIE9TIDw8ICIpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6OmFsaWduZWQiOworICAgIHVuc2lnbmVkIFRyYWlsaW5nT21pdHRlZEFyZ3MgPSAwOworICAgIGlmICghaXNhbGlnbm1lbnRFeHByIHx8ICFhbGlnbm1lbnRFeHByKQorICAgICAgKytUcmFpbGluZ09taXR0ZWRBcmdzOworICAgIE9TIDw8ICIiOworICAgIGlmIChUcmFpbGluZ09taXR0ZWRBcmdzIDwgMSkKKyAgICAgICBPUyA8PCAiKCI7CisgICAgT1MgPDwgIiI7CisgICAgaWYgKCEoIWlzYWxpZ25tZW50RXhwciB8fCAhYWxpZ25tZW50RXhwcikpIHsKKyAgICAgIE9TIDw8ICIiOworICAgIGFsaWdubWVudEV4cHItPnByaW50UHJldHR5KE9TLCBudWxscHRyLCBQb2xpY3kpOworICAgIE9TIDw8ICIiOworICAgIH0KKyAgICBPUyA8PCAiIjsKKyAgICBpZiAoVHJhaWxpbmdPbWl0dGVkQXJncyA8IDEpCisgICAgICAgT1MgPDwgIikiOworICAgIE9TIDw8ICJdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgX19kZWNsc3BlYyhhbGlnbiI7CisgICAgdW5zaWduZWQgVHJhaWxpbmdPbWl0dGVkQXJncyA9IDA7CisgICAgaWYgKCFpc2FsaWdubWVudEV4cHIgfHwgIWFsaWdubWVudEV4cHIpCisgICAgICArK1RyYWlsaW5nT21pdHRlZEFyZ3M7CisgICAgT1MgPDwgIiI7CisgICAgaWYgKFRyYWlsaW5nT21pdHRlZEFyZ3MgPCAxKQorICAgICAgIE9TIDw8ICIoIjsKKyAgICBPUyA8PCAiIjsKKyAgICBpZiAoISghaXNhbGlnbm1lbnRFeHByIHx8ICFhbGlnbm1lbnRFeHByKSkgeworICAgICAgT1MgPDwgIiI7CisgICAgYWxpZ25tZW50RXhwci0+cHJpbnRQcmV0dHkoT1MsIG51bGxwdHIsIFBvbGljeSk7CisgICAgT1MgPDwgIiI7CisgICAgfQorICAgIE9TIDw8ICIiOworICAgIGlmIChUcmFpbGluZ09taXR0ZWRBcmdzIDwgMSkKKyAgICAgICBPUyA8PCAiKSI7CisgICAgT1MgPDwgIikiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMyA6IHsKKyAgICBPUyA8PCAiIGFsaWduYXMiOworICAgIHVuc2lnbmVkIFRyYWlsaW5nT21pdHRlZEFyZ3MgPSAwOworICAgIGlmICghaXNhbGlnbm1lbnRFeHByIHx8ICFhbGlnbm1lbnRFeHByKQorICAgICAgKytUcmFpbGluZ09taXR0ZWRBcmdzOworICAgIE9TIDw8ICIiOworICAgIGlmIChUcmFpbGluZ09taXR0ZWRBcmdzIDwgMSkKKyAgICAgICBPUyA8PCAiKCI7CisgICAgT1MgPDwgIiI7CisgICAgaWYgKCEoIWlzYWxpZ25tZW50RXhwciB8fCAhYWxpZ25tZW50RXhwcikpIHsKKyAgICAgIE9TIDw8ICIiOworICAgIGFsaWdubWVudEV4cHItPnByaW50UHJldHR5KE9TLCBudWxscHRyLCBQb2xpY3kpOworICAgIE9TIDw8ICIiOworICAgIH0KKyAgICBPUyA8PCAiIjsKKyAgICBpZiAoVHJhaWxpbmdPbWl0dGVkQXJncyA8IDEpCisgICAgICAgT1MgPDwgIikiOworICAgIE9TIDw8ICIiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgNCA6IHsKKyAgICBPUyA8PCAiIF9BbGlnbmFzIjsKKyAgICB1bnNpZ25lZCBUcmFpbGluZ09taXR0ZWRBcmdzID0gMDsKKyAgICBpZiAoIWlzYWxpZ25tZW50RXhwciB8fCAhYWxpZ25tZW50RXhwcikKKyAgICAgICsrVHJhaWxpbmdPbWl0dGVkQXJnczsKKyAgICBPUyA8PCAiIjsKKyAgICBpZiAoVHJhaWxpbmdPbWl0dGVkQXJncyA8IDEpCisgICAgICAgT1MgPDwgIigiOworICAgIE9TIDw8ICIiOworICAgIGlmICghKCFpc2FsaWdubWVudEV4cHIgfHwgIWFsaWdubWVudEV4cHIpKSB7CisgICAgICBPUyA8PCAiIjsKKyAgICBhbGlnbm1lbnRFeHByLT5wcmludFByZXR0eShPUywgbnVsbHB0ciwgUG9saWN5KTsKKyAgICBPUyA8PCAiIjsKKyAgICB9CisgICAgT1MgPDwgIiI7CisgICAgaWYgKFRyYWlsaW5nT21pdHRlZEFyZ3MgPCAxKQorICAgICAgIE9TIDw8ICIpIjsKKyAgICBPUyA8PCAiIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpBbGlnbmVkQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJhbGlnbmVkIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiYWxpZ25lZCI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gImFsaWduIjsKKyAgY2FzZSAzOgorICAgIHJldHVybiAiYWxpZ25hcyI7CisgIGNhc2UgNDoKKyAgICByZXR1cm4gIl9BbGlnbmFzIjsKKyAgfQorfQorCitBbGxvY0FsaWduQXR0ciAqQWxsb2NBbGlnbkF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQWxsb2NBbGlnbkF0dHIoZ2V0TG9jYXRpb24oKSwgQywgcGFyYW1JbmRleCwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBBbGxvY0FsaWduQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoYWxsb2NfYWxpZ24oIiA8PCBnZXRQYXJhbUluZGV4KCkuZ2V0U291cmNlSW5kZXgoKSA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6YWxsb2NfYWxpZ24oIiA8PCBnZXRQYXJhbUluZGV4KCkuZ2V0U291cmNlSW5kZXgoKSA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpBbGxvY0FsaWduQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJhbGxvY19hbGlnbiI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImFsbG9jX2FsaWduIjsKKyAgfQorfQorCitBbGxvY1NpemVBdHRyICpBbGxvY1NpemVBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEFsbG9jU2l6ZUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZWxlbVNpemVQYXJhbSwgbnVtRWxlbXNQYXJhbSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBBbGxvY1NpemVBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChhbGxvY19zaXplIjsKKyAgICB1bnNpZ25lZCBUcmFpbGluZ09taXR0ZWRBcmdzID0gMDsKKyAgICBpZiAoIWdldE51bUVsZW1zUGFyYW0oKS5pc1ZhbGlkKCkpCisgICAgICArK1RyYWlsaW5nT21pdHRlZEFyZ3M7CisgICAgT1MgPDwgIigiIDw8IGdldEVsZW1TaXplUGFyYW0oKS5nZXRTb3VyY2VJbmRleCgpIDw8ICIiOworICAgIGlmICgxIDwgMiAtIFRyYWlsaW5nT21pdHRlZEFyZ3MpCisgICAgICBPUyA8PCAiLCAiOworICAgIE9TIDw8ICIiOworICAgIGlmICghKCFnZXROdW1FbGVtc1BhcmFtKCkuaXNWYWxpZCgpKSkgeworICAgICAgT1MgPDwgIiIgPDwgZ2V0TnVtRWxlbXNQYXJhbSgpLmdldFNvdXJjZUluZGV4KCkgPDwgIiI7CisgICAgfQorICAgIE9TIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251OjphbGxvY19zaXplIjsKKyAgICB1bnNpZ25lZCBUcmFpbGluZ09taXR0ZWRBcmdzID0gMDsKKyAgICBpZiAoIWdldE51bUVsZW1zUGFyYW0oKS5pc1ZhbGlkKCkpCisgICAgICArK1RyYWlsaW5nT21pdHRlZEFyZ3M7CisgICAgT1MgPDwgIigiIDw8IGdldEVsZW1TaXplUGFyYW0oKS5nZXRTb3VyY2VJbmRleCgpIDw8ICIiOworICAgIGlmICgxIDwgMiAtIFRyYWlsaW5nT21pdHRlZEFyZ3MpCisgICAgICBPUyA8PCAiLCAiOworICAgIE9TIDw8ICIiOworICAgIGlmICghKCFnZXROdW1FbGVtc1BhcmFtKCkuaXNWYWxpZCgpKSkgeworICAgICAgT1MgPDwgIiIgPDwgZ2V0TnVtRWxlbXNQYXJhbSgpLmdldFNvdXJjZUluZGV4KCkgPDwgIiI7CisgICAgfQorICAgIE9TIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkFsbG9jU2l6ZUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiYWxsb2Nfc2l6ZSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImFsbG9jX3NpemUiOworICB9Cit9CisKK0Fsd2F5c0lubGluZUF0dHIgKkFsd2F5c0lubGluZUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQWx3YXlzSW5saW5lQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEFsd2F5c0lubGluZUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6OmFsd2F5c19pbmxpbmVdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgX19mb3JjZWlubGluZSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqQWx3YXlzSW5saW5lQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJhbHdheXNfaW5saW5lIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiYWx3YXlzX2lubGluZSI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIl9fZm9yY2VpbmxpbmUiOworICB9Cit9CisKK0FuYWx5emVyTm9SZXR1cm5BdHRyICpBbmFseXplck5vUmV0dXJuQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBBbmFseXplck5vUmV0dXJuQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEFuYWx5emVyTm9SZXR1cm5BdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChhbmFseXplcl9ub3JldHVybikpIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpBbmFseXplck5vUmV0dXJuQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJhbmFseXplcl9ub3JldHVybiI7CisgIH0KK30KKworQW5ub3RhdGVBdHRyICpBbm5vdGF0ZUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQW5ub3RhdGVBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldEFubm90YXRpb24oKSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBBbm5vdGF0ZUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGFubm90YXRlKFwiIiA8PCBnZXRBbm5vdGF0aW9uKCkgPDwgIlwiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjphbm5vdGF0ZShcIiIgPDwgZ2V0QW5ub3RhdGlvbigpIDw8ICJcIildXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6YW5ub3RhdGUoXCIiIDw8IGdldEFubm90YXRpb24oKSA8PCAiXCIpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkFubm90YXRlQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJhbm5vdGF0ZSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImFubm90YXRlIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAiYW5ub3RhdGUiOworICB9Cit9CisKK0FueVg4NkludGVycnVwdEF0dHIgKkFueVg4NkludGVycnVwdEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQW55WDg2SW50ZXJydXB0QXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEFueVg4NkludGVycnVwdEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGludGVycnVwdCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6aW50ZXJydXB0XV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkFueVg4NkludGVycnVwdEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiaW50ZXJydXB0IjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiaW50ZXJydXB0IjsKKyAgfQorfQorCitBbnlYODZOb0NhbGxlclNhdmVkUmVnaXN0ZXJzQXR0ciAqQW55WDg2Tm9DYWxsZXJTYXZlZFJlZ2lzdGVyc0F0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQW55WDg2Tm9DYWxsZXJTYXZlZFJlZ2lzdGVyc0F0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBBbnlYODZOb0NhbGxlclNhdmVkUmVnaXN0ZXJzQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygobm9fY2FsbGVyX3NhdmVkX3JlZ2lzdGVycykpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6bm9fY2FsbGVyX3NhdmVkX3JlZ2lzdGVyc11dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpBbnlYODZOb0NhbGxlclNhdmVkUmVnaXN0ZXJzQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJub19jYWxsZXJfc2F2ZWRfcmVnaXN0ZXJzIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAibm9fY2FsbGVyX3NhdmVkX3JlZ2lzdGVycyI7CisgIH0KK30KKworQW55WDg2Tm9DZkNoZWNrQXR0ciAqQW55WDg2Tm9DZkNoZWNrQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBBbnlYODZOb0NmQ2hlY2tBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQW55WDg2Tm9DZkNoZWNrQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygobm9jZl9jaGVjaykpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6bm9jZl9jaGVja11dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpBbnlYODZOb0NmQ2hlY2tBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm5vY2ZfY2hlY2siOworICBjYXNlIDE6CisgICAgcmV0dXJuICJub2NmX2NoZWNrIjsKKyAgfQorfQorCitBcmNXZWFrcmVmVW5hdmFpbGFibGVBdHRyICpBcmNXZWFrcmVmVW5hdmFpbGFibGVBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEFyY1dlYWtyZWZVbmF2YWlsYWJsZUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBBcmNXZWFrcmVmVW5hdmFpbGFibGVBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChvYmpjX2FyY193ZWFrX3JlZmVyZW5jZV91bmF2YWlsYWJsZSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvYmpjX2FyY193ZWFrX3JlZmVyZW5jZV91bmF2YWlsYWJsZV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvYmpjX2FyY193ZWFrX3JlZmVyZW5jZV91bmF2YWlsYWJsZV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpBcmNXZWFrcmVmVW5hdmFpbGFibGVBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm9iamNfYXJjX3dlYWtfcmVmZXJlbmNlX3VuYXZhaWxhYmxlIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAib2JqY19hcmNfd2Vha19yZWZlcmVuY2VfdW5hdmFpbGFibGUiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJvYmpjX2FyY193ZWFrX3JlZmVyZW5jZV91bmF2YWlsYWJsZSI7CisgIH0KK30KKworQXJndW1lbnRXaXRoVHlwZVRhZ0F0dHIgKkFyZ3VtZW50V2l0aFR5cGVUYWdBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEFyZ3VtZW50V2l0aFR5cGVUYWdBdHRyKGdldExvY2F0aW9uKCksIEMsIGFyZ3VtZW50S2luZCwgYXJndW1lbnRJZHgsIHR5cGVUYWdJZHgsIGlzUG9pbnRlciwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBBcmd1bWVudFdpdGhUeXBlVGFnQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoYXJndW1lbnRfd2l0aF90eXBlX3RhZygiIDw8IChnZXRBcmd1bWVudEtpbmQoKSA/IGdldEFyZ3VtZW50S2luZCgpLT5nZXROYW1lKCkgOiAiIikgPDwgIiwgIiA8PCBnZXRBcmd1bWVudElkeCgpLmdldFNvdXJjZUluZGV4KCkgPDwgIiwgIiA8PCBnZXRUeXBlVGFnSWR4KCkuZ2V0U291cmNlSW5kZXgoKSA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjphcmd1bWVudF93aXRoX3R5cGVfdGFnKCIgPDwgKGdldEFyZ3VtZW50S2luZCgpID8gZ2V0QXJndW1lbnRLaW5kKCktPmdldE5hbWUoKSA6ICIiKSA8PCAiLCAiIDw8IGdldEFyZ3VtZW50SWR4KCkuZ2V0U291cmNlSW5kZXgoKSA8PCAiLCAiIDw8IGdldFR5cGVUYWdJZHgoKS5nZXRTb3VyY2VJbmRleCgpIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OmFyZ3VtZW50X3dpdGhfdHlwZV90YWcoIiA8PCAoZ2V0QXJndW1lbnRLaW5kKCkgPyBnZXRBcmd1bWVudEtpbmQoKS0+Z2V0TmFtZSgpIDogIiIpIDw8ICIsICIgPDwgZ2V0QXJndW1lbnRJZHgoKS5nZXRTb3VyY2VJbmRleCgpIDw8ICIsICIgPDwgZ2V0VHlwZVRhZ0lkeCgpLmdldFNvdXJjZUluZGV4KCkgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAzIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygocG9pbnRlcl93aXRoX3R5cGVfdGFnKCIgPDwgKGdldEFyZ3VtZW50S2luZCgpID8gZ2V0QXJndW1lbnRLaW5kKCktPmdldE5hbWUoKSA6ICIiKSA8PCAiLCAiIDw8IGdldEFyZ3VtZW50SWR4KCkuZ2V0U291cmNlSW5kZXgoKSA8PCAiLCAiIDw8IGdldFR5cGVUYWdJZHgoKS5nZXRTb3VyY2VJbmRleCgpIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgNCA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OnBvaW50ZXJfd2l0aF90eXBlX3RhZygiIDw8IChnZXRBcmd1bWVudEtpbmQoKSA/IGdldEFyZ3VtZW50S2luZCgpLT5nZXROYW1lKCkgOiAiIikgPDwgIiwgIiA8PCBnZXRBcmd1bWVudElkeCgpLmdldFNvdXJjZUluZGV4KCkgPDwgIiwgIiA8PCBnZXRUeXBlVGFnSWR4KCkuZ2V0U291cmNlSW5kZXgoKSA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDUgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpwb2ludGVyX3dpdGhfdHlwZV90YWcoIiA8PCAoZ2V0QXJndW1lbnRLaW5kKCkgPyBnZXRBcmd1bWVudEtpbmQoKS0+Z2V0TmFtZSgpIDogIiIpIDw8ICIsICIgPDwgZ2V0QXJndW1lbnRJZHgoKS5nZXRTb3VyY2VJbmRleCgpIDw8ICIsICIgPDwgZ2V0VHlwZVRhZ0lkeCgpLmdldFNvdXJjZUluZGV4KCkgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqQXJndW1lbnRXaXRoVHlwZVRhZ0F0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiYXJndW1lbnRfd2l0aF90eXBlX3RhZyI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImFyZ3VtZW50X3dpdGhfdHlwZV90YWciOworICBjYXNlIDI6CisgICAgcmV0dXJuICJhcmd1bWVudF93aXRoX3R5cGVfdGFnIjsKKyAgY2FzZSAzOgorICAgIHJldHVybiAicG9pbnRlcl93aXRoX3R5cGVfdGFnIjsKKyAgY2FzZSA0OgorICAgIHJldHVybiAicG9pbnRlcl93aXRoX3R5cGVfdGFnIjsKKyAgY2FzZSA1OgorICAgIHJldHVybiAicG9pbnRlcl93aXRoX3R5cGVfdGFnIjsKKyAgfQorfQorCitBcnRpZmljaWFsQXR0ciAqQXJ0aWZpY2lhbEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQXJ0aWZpY2lhbEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBBcnRpZmljaWFsQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoYXJ0aWZpY2lhbCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6YXJ0aWZpY2lhbF1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpBcnRpZmljaWFsQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJhcnRpZmljaWFsIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiYXJ0aWZpY2lhbCI7CisgIH0KK30KKworQXNtTGFiZWxBdHRyICpBc21MYWJlbEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQXNtTGFiZWxBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldExhYmVsKCksIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQXNtTGFiZWxBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBhc20oXCIiIDw8IGdldExhYmVsKCkgPDwgIlwiKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgX19hc21fXyhcIiIgPDwgZ2V0TGFiZWwoKSA8PCAiXCIpIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpBc21MYWJlbEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiYXNtIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiX19hc21fXyI7CisgIH0KK30KKworQXNzZXJ0Q2FwYWJpbGl0eUF0dHIgKkFzc2VydENhcGFiaWxpdHlBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEFzc2VydENhcGFiaWxpdHlBdHRyKGdldExvY2F0aW9uKCksIEMsIGFyZ3NfLCBhcmdzX1NpemUsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQXNzZXJ0Q2FwYWJpbGl0eUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGFzc2VydF9jYXBhYmlsaXR5KCI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsOworICB9CisgIE9TIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OmFzc2VydF9jYXBhYmlsaXR5KCI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsOworICB9CisgIE9TIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGFzc2VydF9zaGFyZWRfY2FwYWJpbGl0eSgiOworICBib29sIGlzRmlyc3QgPSB0cnVlOworICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IGFyZ3MoKSkgeworICAgIGlmIChpc0ZpcnN0KSBpc0ZpcnN0ID0gZmFsc2U7CisgICAgZWxzZSBPUyA8PCAiLCAiOworICAgIE9TIDw8IFZhbDsKKyAgfQorICBPUyA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDMgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjphc3NlcnRfc2hhcmVkX2NhcGFiaWxpdHkoIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBhcmdzKCkpIHsKKyAgICBpZiAoaXNGaXJzdCkgaXNGaXJzdCA9IGZhbHNlOworICAgIGVsc2UgT1MgPDwgIiwgIjsKKyAgICBPUyA8PCBWYWw7CisgIH0KKyAgT1MgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqQXNzZXJ0Q2FwYWJpbGl0eUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiYXNzZXJ0X2NhcGFiaWxpdHkiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJhc3NlcnRfY2FwYWJpbGl0eSI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gImFzc2VydF9zaGFyZWRfY2FwYWJpbGl0eSI7CisgIGNhc2UgMzoKKyAgICByZXR1cm4gImFzc2VydF9zaGFyZWRfY2FwYWJpbGl0eSI7CisgIH0KK30KKworQXNzZXJ0RXhjbHVzaXZlTG9ja0F0dHIgKkFzc2VydEV4Y2x1c2l2ZUxvY2tBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEFzc2VydEV4Y2x1c2l2ZUxvY2tBdHRyKGdldExvY2F0aW9uKCksIEMsIGFyZ3NfLCBhcmdzX1NpemUsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQXNzZXJ0RXhjbHVzaXZlTG9ja0F0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGFzc2VydF9leGNsdXNpdmVfbG9jaygiOworICBib29sIGlzRmlyc3QgPSB0cnVlOworICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IGFyZ3MoKSkgeworICAgIGlmIChpc0ZpcnN0KSBpc0ZpcnN0ID0gZmFsc2U7CisgICAgZWxzZSBPUyA8PCAiLCAiOworICAgIE9TIDw8IFZhbDsKKyAgfQorICBPUyA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpBc3NlcnRFeGNsdXNpdmVMb2NrQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJhc3NlcnRfZXhjbHVzaXZlX2xvY2siOworICB9Cit9CisKK0Fzc2VydFNoYXJlZExvY2tBdHRyICpBc3NlcnRTaGFyZWRMb2NrQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBBc3NlcnRTaGFyZWRMb2NrQXR0cihnZXRMb2NhdGlvbigpLCBDLCBhcmdzXywgYXJnc19TaXplLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEFzc2VydFNoYXJlZExvY2tBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChhc3NlcnRfc2hhcmVkX2xvY2soIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBhcmdzKCkpIHsKKyAgICBpZiAoaXNGaXJzdCkgaXNGaXJzdCA9IGZhbHNlOworICAgIGVsc2UgT1MgPDwgIiwgIjsKKyAgICBPUyA8PCBWYWw7CisgIH0KKyAgT1MgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqQXNzZXJ0U2hhcmVkTG9ja0F0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiYXNzZXJ0X3NoYXJlZF9sb2NrIjsKKyAgfQorfQorCitBc3N1bWVBbGlnbmVkQXR0ciAqQXNzdW1lQWxpZ25lZEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQXNzdW1lQWxpZ25lZEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgYWxpZ25tZW50LCBvZmZzZXQsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQXNzdW1lQWxpZ25lZEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGFzc3VtZV9hbGlnbmVkKCIgPDwgZ2V0QWxpZ25tZW50KCkgPDwgIiwgIiA8PCBnZXRPZmZzZXQoKSA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6YXNzdW1lX2FsaWduZWQoIiA8PCBnZXRBbGlnbm1lbnQoKSA8PCAiLCAiIDw8IGdldE9mZnNldCgpIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkFzc3VtZUFsaWduZWRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImFzc3VtZV9hbGlnbmVkIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiYXNzdW1lX2FsaWduZWQiOworICB9Cit9CisKK0F2YWlsYWJpbGl0eUF0dHIgKkF2YWlsYWJpbGl0eUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQXZhaWxhYmlsaXR5QXR0cihnZXRMb2NhdGlvbigpLCBDLCBwbGF0Zm9ybSwgZ2V0SW50cm9kdWNlZCgpLCBnZXREZXByZWNhdGVkKCksIGdldE9ic29sZXRlZCgpLCB1bmF2YWlsYWJsZSwgZ2V0TWVzc2FnZSgpLCBzdHJpY3QsIGdldFJlcGxhY2VtZW50KCksIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQXZhaWxhYmlsaXR5QXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KCIgPDwgZ2V0UGxhdGZvcm0oKS0+Z2V0TmFtZSgpOworICBpZiAoZ2V0U3RyaWN0KCkpIE9TIDw8ICIsIHN0cmljdCI7CisgIGlmICghZ2V0SW50cm9kdWNlZCgpLmVtcHR5KCkpIE9TIDw8ICIsIGludHJvZHVjZWQ9IiA8PCBnZXRJbnRyb2R1Y2VkKCk7CisgIGlmICghZ2V0RGVwcmVjYXRlZCgpLmVtcHR5KCkpIE9TIDw8ICIsIGRlcHJlY2F0ZWQ9IiA8PCBnZXREZXByZWNhdGVkKCk7CisgIGlmICghZ2V0T2Jzb2xldGVkKCkuZW1wdHkoKSkgT1MgPDwgIiwgb2Jzb2xldGVkPSIgPDwgZ2V0T2Jzb2xldGVkKCk7CisgIGlmIChnZXRVbmF2YWlsYWJsZSgpKSBPUyA8PCAiLCB1bmF2YWlsYWJsZSI7CisgIE9TIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OmF2YWlsYWJpbGl0eSgiIDw8IChnZXRQbGF0Zm9ybSgpID8gZ2V0UGxhdGZvcm0oKS0+Z2V0TmFtZSgpIDogIiIpIDw8ICIsIGludHJvZHVjZWQ9IiA8PCBnZXRJbnRyb2R1Y2VkKCkgPDwgIiwgZGVwcmVjYXRlZD0iIDw8IGdldERlcHJlY2F0ZWQoKSA8PCAiLCBvYnNvbGV0ZWQ9IiA8PCBnZXRPYnNvbGV0ZWQoKSA8PCAiLCAiIDw8IGdldFVuYXZhaWxhYmxlKCkgPDwgIiwgXCIiIDw8IGdldE1lc3NhZ2UoKSA8PCAiXCIsICIgPDwgZ2V0U3RyaWN0KCkgPDwgIiwgXCIiIDw8IGdldFJlcGxhY2VtZW50KCkgPDwgIlwiKV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjphdmFpbGFiaWxpdHkoIiA8PCAoZ2V0UGxhdGZvcm0oKSA/IGdldFBsYXRmb3JtKCktPmdldE5hbWUoKSA6ICIiKSA8PCAiLCBpbnRyb2R1Y2VkPSIgPDwgZ2V0SW50cm9kdWNlZCgpIDw8ICIsIGRlcHJlY2F0ZWQ9IiA8PCBnZXREZXByZWNhdGVkKCkgPDwgIiwgb2Jzb2xldGVkPSIgPDwgZ2V0T2Jzb2xldGVkKCkgPDwgIiwgIiA8PCBnZXRVbmF2YWlsYWJsZSgpIDw8ICIsIFwiIiA8PCBnZXRNZXNzYWdlKCkgPDwgIlwiLCAiIDw8IGdldFN0cmljdCgpIDw8ICIsIFwiIiA8PCBnZXRSZXBsYWNlbWVudCgpIDw8ICJcIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqQXZhaWxhYmlsaXR5QXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJhdmFpbGFiaWxpdHkiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJhdmFpbGFiaWxpdHkiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJhdmFpbGFiaWxpdHkiOworICB9Cit9CisKK0Jsb2Nrc0F0dHIgKkJsb2Nrc0F0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQmxvY2tzQXR0cihnZXRMb2NhdGlvbigpLCBDLCB0eXBlLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEJsb2Nrc0F0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGJsb2NrcyhcIiIgPDwgQmxvY2tzQXR0cjo6Q29udmVydEJsb2NrVHlwZVRvU3RyKGdldFR5cGUoKSkgPDwgIlwiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpibG9ja3MoXCIiIDw8IEJsb2Nrc0F0dHI6OkNvbnZlcnRCbG9ja1R5cGVUb1N0cihnZXRUeXBlKCkpIDw8ICJcIildXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6YmxvY2tzKFwiIiA8PCBCbG9ja3NBdHRyOjpDb252ZXJ0QmxvY2tUeXBlVG9TdHIoZ2V0VHlwZSgpKSA8PCAiXCIpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkJsb2Nrc0F0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiYmxvY2tzIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiYmxvY2tzIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAiYmxvY2tzIjsKKyAgfQorfQorCitDMTFOb1JldHVybkF0dHIgKkMxMU5vUmV0dXJuQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBDMTFOb1JldHVybkF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBDMTFOb1JldHVybkF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9Ob3JldHVybiI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqQzExTm9SZXR1cm5BdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIl9Ob3JldHVybiI7CisgIH0KK30KKworQ0RlY2xBdHRyICpDRGVjbEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQ0RlY2xBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQ0RlY2xBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChjZGVjbCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6Y2RlY2xdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgX19jZGVjbCI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAzIDogeworICAgIE9TIDw8ICIgX2NkZWNsIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpDRGVjbEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiY2RlY2wiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJjZGVjbCI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIl9fY2RlY2wiOworICBjYXNlIDM6CisgICAgcmV0dXJuICJfY2RlY2wiOworICB9Cit9CisKK0NGQXVkaXRlZFRyYW5zZmVyQXR0ciAqQ0ZBdWRpdGVkVHJhbnNmZXJBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIENGQXVkaXRlZFRyYW5zZmVyQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIENGQXVkaXRlZFRyYW5zZmVyQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoY2ZfYXVkaXRlZF90cmFuc2ZlcikpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpjZl9hdWRpdGVkX3RyYW5zZmVyXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OmNmX2F1ZGl0ZWRfdHJhbnNmZXJdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqQ0ZBdWRpdGVkVHJhbnNmZXJBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImNmX2F1ZGl0ZWRfdHJhbnNmZXIiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJjZl9hdWRpdGVkX3RyYW5zZmVyIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAiY2ZfYXVkaXRlZF90cmFuc2ZlciI7CisgIH0KK30KKworQ0ZDb25zdW1lZEF0dHIgKkNGQ29uc3VtZWRBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIENGQ29uc3VtZWRBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQ0ZDb25zdW1lZEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGNmX2NvbnN1bWVkKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OmNmX2NvbnN1bWVkXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OmNmX2NvbnN1bWVkXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkNGQ29uc3VtZWRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImNmX2NvbnN1bWVkIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiY2ZfY29uc3VtZWQiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJjZl9jb25zdW1lZCI7CisgIH0KK30KKworQ0ZSZXR1cm5zTm90UmV0YWluZWRBdHRyICpDRlJldHVybnNOb3RSZXRhaW5lZEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQ0ZSZXR1cm5zTm90UmV0YWluZWRBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQ0ZSZXR1cm5zTm90UmV0YWluZWRBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChjZl9yZXR1cm5zX25vdF9yZXRhaW5lZCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpjZl9yZXR1cm5zX25vdF9yZXRhaW5lZF1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpjZl9yZXR1cm5zX25vdF9yZXRhaW5lZF1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpDRlJldHVybnNOb3RSZXRhaW5lZEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiY2ZfcmV0dXJuc19ub3RfcmV0YWluZWQiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJjZl9yZXR1cm5zX25vdF9yZXRhaW5lZCI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gImNmX3JldHVybnNfbm90X3JldGFpbmVkIjsKKyAgfQorfQorCitDRlJldHVybnNSZXRhaW5lZEF0dHIgKkNGUmV0dXJuc1JldGFpbmVkQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBDRlJldHVybnNSZXRhaW5lZEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBDRlJldHVybnNSZXRhaW5lZEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGNmX3JldHVybnNfcmV0YWluZWQpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6Y2ZfcmV0dXJuc19yZXRhaW5lZF1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpjZl9yZXR1cm5zX3JldGFpbmVkXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkNGUmV0dXJuc1JldGFpbmVkQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJjZl9yZXR1cm5zX3JldGFpbmVkIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiY2ZfcmV0dXJuc19yZXRhaW5lZCI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gImNmX3JldHVybnNfcmV0YWluZWQiOworICB9Cit9CisKK0NGVW5rbm93blRyYW5zZmVyQXR0ciAqQ0ZVbmtub3duVHJhbnNmZXJBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIENGVW5rbm93blRyYW5zZmVyQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIENGVW5rbm93blRyYW5zZmVyQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoY2ZfdW5rbm93bl90cmFuc2ZlcikpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpjZl91bmtub3duX3RyYW5zZmVyXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OmNmX3Vua25vd25fdHJhbnNmZXJdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqQ0ZVbmtub3duVHJhbnNmZXJBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImNmX3Vua25vd25fdHJhbnNmZXIiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJjZl91bmtub3duX3RyYW5zZmVyIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAiY2ZfdW5rbm93bl90cmFuc2ZlciI7CisgIH0KK30KKworQ1VEQUNvbnN0YW50QXR0ciAqQ1VEQUNvbnN0YW50QXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBDVURBQ29uc3RhbnRBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQ1VEQUNvbnN0YW50QXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoY29uc3RhbnQpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgX19kZWNsc3BlYyhfX2NvbnN0YW50X18pIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpDVURBQ29uc3RhbnRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImNvbnN0YW50IjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiX19jb25zdGFudF9fIjsKKyAgfQorfQorCitDVURBRGV2aWNlQXR0ciAqQ1VEQURldmljZUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQ1VEQURldmljZUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBDVURBRGV2aWNlQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoZGV2aWNlKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIF9fZGVjbHNwZWMoX19kZXZpY2VfXykiOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkNVREFEZXZpY2VBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImRldmljZSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIl9fZGV2aWNlX18iOworICB9Cit9CisKK0NVREFHbG9iYWxBdHRyICpDVURBR2xvYmFsQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBDVURBR2xvYmFsQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIENVREFHbG9iYWxBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChnbG9iYWwpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgX19kZWNsc3BlYyhfX2dsb2JhbF9fKSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqQ1VEQUdsb2JhbEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiZ2xvYmFsIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiX19nbG9iYWxfXyI7CisgIH0KK30KKworQ1VEQUhvc3RBdHRyICpDVURBSG9zdEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQ1VEQUhvc3RBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQ1VEQUhvc3RBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChob3N0KSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIF9fZGVjbHNwZWMoX19ob3N0X18pIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpDVURBSG9zdEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiaG9zdCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIl9faG9zdF9fIjsKKyAgfQorfQorCitDVURBSW52YWxpZFRhcmdldEF0dHIgKkNVREFJbnZhbGlkVGFyZ2V0QXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBDVURBSW52YWxpZFRhcmdldEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBDVURBSW52YWxpZFRhcmdldEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworfQorCitjb25zdCBjaGFyICpDVURBSW52YWxpZFRhcmdldEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICByZXR1cm4gIihObyBzcGVsbGluZykiOworfQorCitDVURBTGF1bmNoQm91bmRzQXR0ciAqQ1VEQUxhdW5jaEJvdW5kc0F0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQ1VEQUxhdW5jaEJvdW5kc0F0dHIoZ2V0TG9jYXRpb24oKSwgQywgbWF4VGhyZWFkcywgbWluQmxvY2tzLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIENVREFMYXVuY2hCb3VuZHNBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChsYXVuY2hfYm91bmRzKCIgPDwgZ2V0TWF4VGhyZWFkcygpIDw8ICIsICIgPDwgZ2V0TWluQmxvY2tzKCkgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgX19kZWNsc3BlYyhfX2xhdW5jaF9ib3VuZHNfXygiIDw8IGdldE1heFRocmVhZHMoKSA8PCAiLCAiIDw8IGdldE1pbkJsb2NrcygpIDw8ICIpKSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqQ1VEQUxhdW5jaEJvdW5kc0F0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAibGF1bmNoX2JvdW5kcyI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIl9fbGF1bmNoX2JvdW5kc19fIjsKKyAgfQorfQorCitDVURBU2hhcmVkQXR0ciAqQ1VEQVNoYXJlZEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQ1VEQVNoYXJlZEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBDVURBU2hhcmVkQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoc2hhcmVkKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIF9fZGVjbHNwZWMoX19zaGFyZWRfXykiOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkNVREFTaGFyZWRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gInNoYXJlZCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIl9fc2hhcmVkX18iOworICB9Cit9CisKK0NYWDExTm9SZXR1cm5BdHRyICpDWFgxMU5vUmV0dXJuQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBDWFgxMU5vUmV0dXJuQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIENYWDExTm9SZXR1cm5BdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBbW25vcmV0dXJuXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkNYWDExTm9SZXR1cm5BdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm5vcmV0dXJuIjsKKyAgfQorfQorCitDYWxsYWJsZVdoZW5BdHRyICpDYWxsYWJsZVdoZW5BdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIENhbGxhYmxlV2hlbkF0dHIoZ2V0TG9jYXRpb24oKSwgQywgY2FsbGFibGVTdGF0ZXNfLCBjYWxsYWJsZVN0YXRlc19TaXplLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIENhbGxhYmxlV2hlbkF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGNhbGxhYmxlX3doZW4oIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBjYWxsYWJsZVN0YXRlcygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgIlwiIiA8PCBDYWxsYWJsZVdoZW5BdHRyOjpDb252ZXJ0Q29uc3VtZWRTdGF0ZVRvU3RyKFZhbCk8PCAiXCIiOworICB9CisgIE9TIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OmNhbGxhYmxlX3doZW4oIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBjYWxsYWJsZVN0YXRlcygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgIlwiIiA8PCBDYWxsYWJsZVdoZW5BdHRyOjpDb252ZXJ0Q29uc3VtZWRTdGF0ZVRvU3RyKFZhbCk8PCAiXCIiOworICB9CisgIE9TIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkNhbGxhYmxlV2hlbkF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiY2FsbGFibGVfd2hlbiI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImNhbGxhYmxlX3doZW4iOworICB9Cit9CisKK0NhcGFiaWxpdHlBdHRyICpDYXBhYmlsaXR5QXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBDYXBhYmlsaXR5QXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXROYW1lKCksIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQ2FwYWJpbGl0eUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGNhcGFiaWxpdHkoXCIiIDw8IGdldE5hbWUoKSA8PCAiXCIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OmNhcGFiaWxpdHkoXCIiIDw8IGdldE5hbWUoKSA8PCAiXCIpXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHNoYXJlZF9jYXBhYmlsaXR5KFwiIiA8PCBnZXROYW1lKCkgPDwgIlwiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDMgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpzaGFyZWRfY2FwYWJpbGl0eShcIiIgPDwgZ2V0TmFtZSgpIDw8ICJcIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqQ2FwYWJpbGl0eUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiY2FwYWJpbGl0eSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImNhcGFiaWxpdHkiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJzaGFyZWRfY2FwYWJpbGl0eSI7CisgIGNhc2UgMzoKKyAgICByZXR1cm4gInNoYXJlZF9jYXBhYmlsaXR5IjsKKyAgfQorfQorCitDYXB0dXJlZFJlY29yZEF0dHIgKkNhcHR1cmVkUmVjb3JkQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBDYXB0dXJlZFJlY29yZEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBDYXB0dXJlZFJlY29yZEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworfQorCitjb25zdCBjaGFyICpDYXB0dXJlZFJlY29yZEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICByZXR1cm4gIihObyBzcGVsbGluZykiOworfQorCitDYXJyaWVzRGVwZW5kZW5jeUF0dHIgKkNhcnJpZXNEZXBlbmRlbmN5QXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBDYXJyaWVzRGVwZW5kZW5jeUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBDYXJyaWVzRGVwZW5kZW5jeUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGNhcnJpZXNfZGVwZW5kZW5jeSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NhcnJpZXNfZGVwZW5kZW5jeV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpDYXJyaWVzRGVwZW5kZW5jeUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiY2Fycmllc19kZXBlbmRlbmN5IjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiY2Fycmllc19kZXBlbmRlbmN5IjsKKyAgfQorfQorCitDbGVhbnVwQXR0ciAqQ2xlYW51cEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQ2xlYW51cEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZnVuY3Rpb25EZWNsLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIENsZWFudXBBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChjbGVhbnVwKCIgPDwgZ2V0RnVuY3Rpb25EZWNsKCktPmdldE5hbWVJbmZvKCkuZ2V0QXNTdHJpbmcoKSA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6Y2xlYW51cCgiIDw8IGdldEZ1bmN0aW9uRGVjbCgpLT5nZXROYW1lSW5mbygpLmdldEFzU3RyaW5nKCkgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqQ2xlYW51cEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiY2xlYW51cCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImNsZWFudXAiOworICB9Cit9CisKK0NvbGRBdHRyICpDb2xkQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBDb2xkQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIENvbGRBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChjb2xkKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251Ojpjb2xkXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkNvbGRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImNvbGQiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJjb2xkIjsKKyAgfQorfQorCitDb21tb25BdHRyICpDb21tb25BdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIENvbW1vbkF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBDb21tb25BdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChjb21tb24pKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6OmNvbW1vbl1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpDb21tb25BdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImNvbW1vbiI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImNvbW1vbiI7CisgIH0KK30KKworQ29uc3RBdHRyICpDb25zdEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQ29uc3RBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQ29uc3RBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChjb25zdCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6Y29uc3RdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoX19jb25zdCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDMgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6X19jb25zdF1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpDb25zdEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiY29uc3QiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJjb25zdCI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIl9fY29uc3QiOworICBjYXNlIDM6CisgICAgcmV0dXJuICJfX2NvbnN0IjsKKyAgfQorfQorCitDb25zdHJ1Y3RvckF0dHIgKkNvbnN0cnVjdG9yQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBDb25zdHJ1Y3RvckF0dHIoZ2V0TG9jYXRpb24oKSwgQywgcHJpb3JpdHksIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQ29uc3RydWN0b3JBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcigiIDw8IGdldFByaW9yaXR5KCkgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6OmNvbnN0cnVjdG9yKCIgPDwgZ2V0UHJpb3JpdHkoKSA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpDb25zdHJ1Y3RvckF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiY29uc3RydWN0b3IiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJjb25zdHJ1Y3RvciI7CisgIH0KK30KKworQ29uc3VtYWJsZUF0dHIgKkNvbnN1bWFibGVBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIENvbnN1bWFibGVBdHRyKGdldExvY2F0aW9uKCksIEMsIGRlZmF1bHRTdGF0ZSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBDb25zdW1hYmxlQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoY29uc3VtYWJsZShcIiIgPDwgQ29uc3VtYWJsZUF0dHI6OkNvbnZlcnRDb25zdW1lZFN0YXRlVG9TdHIoZ2V0RGVmYXVsdFN0YXRlKCkpIDw8ICJcIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6Y29uc3VtYWJsZShcIiIgPDwgQ29uc3VtYWJsZUF0dHI6OkNvbnZlcnRDb25zdW1lZFN0YXRlVG9TdHIoZ2V0RGVmYXVsdFN0YXRlKCkpIDw8ICJcIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqQ29uc3VtYWJsZUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiY29uc3VtYWJsZSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImNvbnN1bWFibGUiOworICB9Cit9CisKK0NvbnN1bWFibGVBdXRvQ2FzdEF0dHIgKkNvbnN1bWFibGVBdXRvQ2FzdEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgQ29uc3VtYWJsZUF1dG9DYXN0QXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIENvbnN1bWFibGVBdXRvQ2FzdEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGNvbnN1bWFibGVfYXV0b19jYXN0X3N0YXRlKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OmNvbnN1bWFibGVfYXV0b19jYXN0X3N0YXRlXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkNvbnN1bWFibGVBdXRvQ2FzdEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiY29uc3VtYWJsZV9hdXRvX2Nhc3Rfc3RhdGUiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJjb25zdW1hYmxlX2F1dG9fY2FzdF9zdGF0ZSI7CisgIH0KK30KKworQ29uc3VtYWJsZVNldE9uUmVhZEF0dHIgKkNvbnN1bWFibGVTZXRPblJlYWRBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIENvbnN1bWFibGVTZXRPblJlYWRBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQ29uc3VtYWJsZVNldE9uUmVhZEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGNvbnN1bWFibGVfc2V0X3N0YXRlX29uX3JlYWQpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6Y29uc3VtYWJsZV9zZXRfc3RhdGVfb25fcmVhZF1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpDb25zdW1hYmxlU2V0T25SZWFkQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJjb25zdW1hYmxlX3NldF9zdGF0ZV9vbl9yZWFkIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiY29uc3VtYWJsZV9zZXRfc3RhdGVfb25fcmVhZCI7CisgIH0KK30KKworQ29udmVyZ2VudEF0dHIgKkNvbnZlcmdlbnRBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIENvbnZlcmdlbnRBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgQ29udmVyZ2VudEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGNvbnZlcmdlbnQpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6Y29udmVyZ2VudF1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpjb252ZXJnZW50XV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkNvbnZlcmdlbnRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImNvbnZlcmdlbnQiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJjb252ZXJnZW50IjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAiY29udmVyZ2VudCI7CisgIH0KK30KKworRExMRXhwb3J0QXR0ciAqRExMRXhwb3J0QXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBETExFeHBvcnRBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgRExMRXhwb3J0QXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19kZWNsc3BlYyhkbGxleHBvcnQpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChkbGxleHBvcnQpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tnbnU6OmRsbGV4cG9ydF1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpETExFeHBvcnRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImRsbGV4cG9ydCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImRsbGV4cG9ydCI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gImRsbGV4cG9ydCI7CisgIH0KK30KKworRExMSW1wb3J0QXR0ciAqRExMSW1wb3J0QXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBETExJbXBvcnRBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgRExMSW1wb3J0QXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19kZWNsc3BlYyhkbGxpbXBvcnQpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChkbGxpbXBvcnQpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tnbnU6OmRsbGltcG9ydF1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpETExJbXBvcnRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImRsbGltcG9ydCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImRsbGltcG9ydCI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gImRsbGltcG9ydCI7CisgIH0KK30KKworRGVwcmVjYXRlZEF0dHIgKkRlcHJlY2F0ZWRBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIERlcHJlY2F0ZWRBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldE1lc3NhZ2UoKSwgZ2V0UmVwbGFjZW1lbnQoKSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBEZXByZWNhdGVkQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZChcIiIgPDwgZ2V0TWVzc2FnZSgpIDw8ICJcIiI7CisgICAgaWYgKCFnZXRSZXBsYWNlbWVudCgpLmVtcHR5KCkpIE9TIDw8ICIsIFwiIiA8PCBnZXRSZXBsYWNlbWVudCgpIDw8ICJcIiI7CisgICAgT1MgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6OmRlcHJlY2F0ZWQoXCIiIDw8IGdldE1lc3NhZ2UoKSA8PCAiXCIiOworICAgIE9TIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIF9fZGVjbHNwZWMoZGVwcmVjYXRlZChcIiIgPDwgZ2V0TWVzc2FnZSgpIDw8ICJcIiI7CisgICAgT1MgPDwgIikpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDMgOiB7CisgICAgT1MgPDwgIiBbW2RlcHJlY2F0ZWQoXCIiIDw8IGdldE1lc3NhZ2UoKSA8PCAiXCIiOworICAgIE9TIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgNCA6IHsKKyAgICBPUyA8PCAiIFtbZGVwcmVjYXRlZChcIiIgPDwgZ2V0TWVzc2FnZSgpIDw8ICJcIiI7CisgICAgT1MgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqRGVwcmVjYXRlZEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiZGVwcmVjYXRlZCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImRlcHJlY2F0ZWQiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJkZXByZWNhdGVkIjsKKyAgY2FzZSAzOgorICAgIHJldHVybiAiZGVwcmVjYXRlZCI7CisgIGNhc2UgNDoKKyAgICByZXR1cm4gImRlcHJlY2F0ZWQiOworICB9Cit9CisKK0Rlc3RydWN0b3JBdHRyICpEZXN0cnVjdG9yQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBEZXN0cnVjdG9yQXR0cihnZXRMb2NhdGlvbigpLCBDLCBwcmlvcml0eSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBEZXN0cnVjdG9yQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoZGVzdHJ1Y3RvcigiIDw8IGdldFByaW9yaXR5KCkgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6OmRlc3RydWN0b3IoIiA8PCBnZXRQcmlvcml0eSgpIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkRlc3RydWN0b3JBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImRlc3RydWN0b3IiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJkZXN0cnVjdG9yIjsKKyAgfQorfQorCitEaWFnbm9zZUlmQXR0ciAqRGlhZ25vc2VJZkF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgRGlhZ25vc2VJZkF0dHIoZ2V0TG9jYXRpb24oKSwgQywgY29uZCwgZ2V0TWVzc2FnZSgpLCBkaWFnbm9zdGljVHlwZSwgYXJnRGVwZW5kZW50LCBwYXJlbnQsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgRGlhZ25vc2VJZkF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGRpYWdub3NlX2lmKCIgPDwgZ2V0Q29uZCgpIDw8ICIsIFwiIiA8PCBnZXRNZXNzYWdlKCkgPDwgIlwiLCBcIiIgPDwgRGlhZ25vc2VJZkF0dHI6OkNvbnZlcnREaWFnbm9zdGljVHlwZVRvU3RyKGdldERpYWdub3N0aWNUeXBlKCkpIDw8ICJcIikpKSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqRGlhZ25vc2VJZkF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiZGlhZ25vc2VfaWYiOworICB9Cit9CisKK0Rpc2FibGVUYWlsQ2FsbHNBdHRyICpEaXNhYmxlVGFpbENhbGxzQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBEaXNhYmxlVGFpbENhbGxzQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIERpc2FibGVUYWlsQ2FsbHNBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChkaXNhYmxlX3RhaWxfY2FsbHMpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6ZGlzYWJsZV90YWlsX2NhbGxzXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OmRpc2FibGVfdGFpbF9jYWxsc11dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpEaXNhYmxlVGFpbENhbGxzQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJkaXNhYmxlX3RhaWxfY2FsbHMiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJkaXNhYmxlX3RhaWxfY2FsbHMiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJkaXNhYmxlX3RhaWxfY2FsbHMiOworICB9Cit9CisKK0VtcHR5QmFzZXNBdHRyICpFbXB0eUJhc2VzQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBFbXB0eUJhc2VzQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEVtcHR5QmFzZXNBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2RlY2xzcGVjKGVtcHR5X2Jhc2VzKSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqRW1wdHlCYXNlc0F0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiZW1wdHlfYmFzZXMiOworICB9Cit9CisKK0VuYWJsZUlmQXR0ciAqRW5hYmxlSWZBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEVuYWJsZUlmQXR0cihnZXRMb2NhdGlvbigpLCBDLCBjb25kLCBnZXRNZXNzYWdlKCksIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgRW5hYmxlSWZBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChlbmFibGVfaWYoIiA8PCBnZXRDb25kKCkgPDwgIiwgXCIiIDw8IGdldE1lc3NhZ2UoKSA8PCAiXCIpKSkiOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkVuYWJsZUlmQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJlbmFibGVfaWYiOworICB9Cit9CisKK0VudW1FeHRlbnNpYmlsaXR5QXR0ciAqRW51bUV4dGVuc2liaWxpdHlBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEVudW1FeHRlbnNpYmlsaXR5QXR0cihnZXRMb2NhdGlvbigpLCBDLCBleHRlbnNpYmlsaXR5LCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEVudW1FeHRlbnNpYmlsaXR5QXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoZW51bV9leHRlbnNpYmlsaXR5KFwiIiA8PCBFbnVtRXh0ZW5zaWJpbGl0eUF0dHI6OkNvbnZlcnRLaW5kVG9TdHIoZ2V0RXh0ZW5zaWJpbGl0eSgpKSA8PCAiXCIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OmVudW1fZXh0ZW5zaWJpbGl0eShcIiIgPDwgRW51bUV4dGVuc2liaWxpdHlBdHRyOjpDb252ZXJ0S2luZFRvU3RyKGdldEV4dGVuc2liaWxpdHkoKSkgPDwgIlwiKV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjplbnVtX2V4dGVuc2liaWxpdHkoXCIiIDw8IEVudW1FeHRlbnNpYmlsaXR5QXR0cjo6Q29udmVydEtpbmRUb1N0cihnZXRFeHRlbnNpYmlsaXR5KCkpIDw8ICJcIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqRW51bUV4dGVuc2liaWxpdHlBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImVudW1fZXh0ZW5zaWJpbGl0eSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImVudW1fZXh0ZW5zaWJpbGl0eSI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gImVudW1fZXh0ZW5zaWJpbGl0eSI7CisgIH0KK30KKworRXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uQXR0ciAqRXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb25BdHRyKGdldExvY2F0aW9uKCksIEMsIHN1Y2Nlc3NWYWx1ZSwgYXJnc18sIGFyZ3NfU2l6ZSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb25BdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChleGNsdXNpdmVfdHJ5bG9ja19mdW5jdGlvbigiIDw8IGdldFN1Y2Nlc3NWYWx1ZSgpIDw8ICIsICI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsOworICB9CisgIE9TIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkV4Y2x1c2l2ZVRyeWxvY2tGdW5jdGlvbkF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiZXhjbHVzaXZlX3RyeWxvY2tfZnVuY3Rpb24iOworICB9Cit9CisKK0V4dGVybmFsU291cmNlU3ltYm9sQXR0ciAqRXh0ZXJuYWxTb3VyY2VTeW1ib2xBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEV4dGVybmFsU291cmNlU3ltYm9sQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRMYW5ndWFnZSgpLCBnZXREZWZpbmVkSW4oKSwgZ2VuZXJhdGVkRGVjbGFyYXRpb24sIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgRXh0ZXJuYWxTb3VyY2VTeW1ib2xBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChleHRlcm5hbF9zb3VyY2Vfc3ltYm9sKFwiIiA8PCBnZXRMYW5ndWFnZSgpIDw8ICJcIiwgXCIiIDw8IGdldERlZmluZWRJbigpIDw8ICJcIiwgIiA8PCBnZXRHZW5lcmF0ZWREZWNsYXJhdGlvbigpIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OmV4dGVybmFsX3NvdXJjZV9zeW1ib2woXCIiIDw8IGdldExhbmd1YWdlKCkgPDwgIlwiLCBcIiIgPDwgZ2V0RGVmaW5lZEluKCkgPDwgIlwiLCAiIDw8IGdldEdlbmVyYXRlZERlY2xhcmF0aW9uKCkgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6ZXh0ZXJuYWxfc291cmNlX3N5bWJvbChcIiIgPDwgZ2V0TGFuZ3VhZ2UoKSA8PCAiXCIsIFwiIiA8PCBnZXREZWZpbmVkSW4oKSA8PCAiXCIsICIgPDwgZ2V0R2VuZXJhdGVkRGVjbGFyYXRpb24oKSA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpFeHRlcm5hbFNvdXJjZVN5bWJvbEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiZXh0ZXJuYWxfc291cmNlX3N5bWJvbCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImV4dGVybmFsX3NvdXJjZV9zeW1ib2wiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJleHRlcm5hbF9zb3VyY2Vfc3ltYm9sIjsKKyAgfQorfQorCitGYWxsVGhyb3VnaEF0dHIgKkZhbGxUaHJvdWdoQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBGYWxsVGhyb3VnaEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBGYWxsVGhyb3VnaEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIFtbZmFsbHRocm91Z2hdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tmYWxsdGhyb3VnaF1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpmYWxsdGhyb3VnaF1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpGYWxsVGhyb3VnaEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiZmFsbHRocm91Z2giOworICBjYXNlIDE6CisgICAgcmV0dXJuICJmYWxsdGhyb3VnaCI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gImZhbGx0aHJvdWdoIjsKKyAgfQorfQorCitGYXN0Q2FsbEF0dHIgKkZhc3RDYWxsQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBGYXN0Q2FsbEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBGYXN0Q2FsbEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGZhc3RjYWxsKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251OjpmYXN0Y2FsbF1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBfX2Zhc3RjYWxsIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDMgOiB7CisgICAgT1MgPDwgIiBfZmFzdGNhbGwiOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkZhc3RDYWxsQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJmYXN0Y2FsbCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImZhc3RjYWxsIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAiX19mYXN0Y2FsbCI7CisgIGNhc2UgMzoKKyAgICByZXR1cm4gIl9mYXN0Y2FsbCI7CisgIH0KK30KKworRmluYWxBdHRyICpGaW5hbEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgRmluYWxBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgRmluYWxBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBmaW5hbCI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgc2VhbGVkIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpGaW5hbEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiZmluYWwiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJzZWFsZWQiOworICB9Cit9CisKK0ZsYWdFbnVtQXR0ciAqRmxhZ0VudW1BdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEZsYWdFbnVtQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEZsYWdFbnVtQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoZmxhZ19lbnVtKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OmZsYWdfZW51bV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpmbGFnX2VudW1dXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqRmxhZ0VudW1BdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImZsYWdfZW51bSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImZsYWdfZW51bSI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gImZsYWdfZW51bSI7CisgIH0KK30KKworRmxhdHRlbkF0dHIgKkZsYXR0ZW5BdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEZsYXR0ZW5BdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgRmxhdHRlbkF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGZsYXR0ZW4pKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6OmZsYXR0ZW5dXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqRmxhdHRlbkF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiZmxhdHRlbiI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImZsYXR0ZW4iOworICB9Cit9CisKK0Zvcm1hdEF0dHIgKkZvcm1hdEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgRm9ybWF0QXR0cihnZXRMb2NhdGlvbigpLCBDLCB0eXBlLCBmb3JtYXRJZHgsIGZpcnN0QXJnLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEZvcm1hdEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGZvcm1hdCgiIDw8IChnZXRUeXBlKCkgPyBnZXRUeXBlKCktPmdldE5hbWUoKSA6ICIiKSA8PCAiLCAiIDw8IGdldEZvcm1hdElkeCgpIDw8ICIsICIgPDwgZ2V0Rmlyc3RBcmcoKSA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6Zm9ybWF0KCIgPDwgKGdldFR5cGUoKSA/IGdldFR5cGUoKS0+Z2V0TmFtZSgpIDogIiIpIDw8ICIsICIgPDwgZ2V0Rm9ybWF0SWR4KCkgPDwgIiwgIiA8PCBnZXRGaXJzdEFyZygpIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkZvcm1hdEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiZm9ybWF0IjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiZm9ybWF0IjsKKyAgfQorfQorCitGb3JtYXRBcmdBdHRyICpGb3JtYXRBcmdBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEZvcm1hdEFyZ0F0dHIoZ2V0TG9jYXRpb24oKSwgQywgZm9ybWF0SWR4LCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEZvcm1hdEFyZ0F0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGZvcm1hdF9hcmcoIiA8PCBnZXRGb3JtYXRJZHgoKS5nZXRTb3VyY2VJbmRleCgpIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251Ojpmb3JtYXRfYXJnKCIgPDwgZ2V0Rm9ybWF0SWR4KCkuZ2V0U291cmNlSW5kZXgoKSA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpGb3JtYXRBcmdBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImZvcm1hdF9hcmciOworICBjYXNlIDE6CisgICAgcmV0dXJuICJmb3JtYXRfYXJnIjsKKyAgfQorfQorCitHTlVJbmxpbmVBdHRyICpHTlVJbmxpbmVBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEdOVUlubGluZUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBHTlVJbmxpbmVBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChnbnVfaW5saW5lKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251OjpnbnVfaW5saW5lXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkdOVUlubGluZUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiZ251X2lubGluZSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImdudV9pbmxpbmUiOworICB9Cit9CisKK0d1YXJkZWRCeUF0dHIgKkd1YXJkZWRCeUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgR3VhcmRlZEJ5QXR0cihnZXRMb2NhdGlvbigpLCBDLCBhcmcsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgR3VhcmRlZEJ5QXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoZ3VhcmRlZF9ieSgiIDw8IGdldEFyZygpIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkd1YXJkZWRCeUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiZ3VhcmRlZF9ieSI7CisgIH0KK30KKworR3VhcmRlZFZhckF0dHIgKkd1YXJkZWRWYXJBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEd1YXJkZWRWYXJBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgR3VhcmRlZFZhckF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGd1YXJkZWRfdmFyKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Omd1YXJkZWRfdmFyXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkd1YXJkZWRWYXJBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImd1YXJkZWRfdmFyIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiZ3VhcmRlZF92YXIiOworICB9Cit9CisKK0hvdEF0dHIgKkhvdEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgSG90QXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEhvdEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGhvdCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6aG90XV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkhvdEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiaG90IjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiaG90IjsKKyAgfQorfQorCitJQkFjdGlvbkF0dHIgKklCQWN0aW9uQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBJQkFjdGlvbkF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBJQkFjdGlvbkF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGliYWN0aW9uKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OmliYWN0aW9uXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OmliYWN0aW9uXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKklCQWN0aW9uQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJpYmFjdGlvbiI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImliYWN0aW9uIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAiaWJhY3Rpb24iOworICB9Cit9CisKK0lCT3V0bGV0QXR0ciAqSUJPdXRsZXRBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIElCT3V0bGV0QXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIElCT3V0bGV0QXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoaWJvdXRsZXQpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6aWJvdXRsZXRdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6aWJvdXRsZXRdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqSUJPdXRsZXRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImlib3V0bGV0IjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiaWJvdXRsZXQiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJpYm91dGxldCI7CisgIH0KK30KKworSUJPdXRsZXRDb2xsZWN0aW9uQXR0ciAqSUJPdXRsZXRDb2xsZWN0aW9uQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBJQk91dGxldENvbGxlY3Rpb25BdHRyKGdldExvY2F0aW9uKCksIEMsIGludGVyZmFjZV8sIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgSUJPdXRsZXRDb2xsZWN0aW9uQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoaWJvdXRsZXRjb2xsZWN0aW9uKCIgPDwgZ2V0SW50ZXJmYWNlKCkuZ2V0QXNTdHJpbmcoKSA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjppYm91dGxldGNvbGxlY3Rpb24oIiA8PCBnZXRJbnRlcmZhY2UoKS5nZXRBc1N0cmluZygpIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Omlib3V0bGV0Y29sbGVjdGlvbigiIDw8IGdldEludGVyZmFjZSgpLmdldEFzU3RyaW5nKCkgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqSUJPdXRsZXRDb2xsZWN0aW9uQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJpYm91dGxldGNvbGxlY3Rpb24iOworICBjYXNlIDE6CisgICAgcmV0dXJuICJpYm91dGxldGNvbGxlY3Rpb24iOworICBjYXNlIDI6CisgICAgcmV0dXJuICJpYm91dGxldGNvbGxlY3Rpb24iOworICB9Cit9CisKK0lGdW5jQXR0ciAqSUZ1bmNBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIElGdW5jQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRSZXNvbHZlcigpLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIElGdW5jQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoaWZ1bmMoXCIiIDw8IGdldFJlc29sdmVyKCkgPDwgIlwiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6aWZ1bmMoXCIiIDw8IGdldFJlc29sdmVyKCkgPDwgIlwiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpJRnVuY0F0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiaWZ1bmMiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJpZnVuYyI7CisgIH0KK30KKworSW5pdFByaW9yaXR5QXR0ciAqSW5pdFByaW9yaXR5QXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBJbml0UHJpb3JpdHlBdHRyKGdldExvY2F0aW9uKCksIEMsIHByaW9yaXR5LCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEluaXRQcmlvcml0eUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGluaXRfcHJpb3JpdHkoIiA8PCBnZXRQcmlvcml0eSgpIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251Ojppbml0X3ByaW9yaXR5KCIgPDwgZ2V0UHJpb3JpdHkoKSA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpJbml0UHJpb3JpdHlBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImluaXRfcHJpb3JpdHkiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJpbml0X3ByaW9yaXR5IjsKKyAgfQorfQorCitJbml0U2VnQXR0ciAqSW5pdFNlZ0F0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgSW5pdFNlZ0F0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U2VjdGlvbigpLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEluaXRTZWdBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiNwcmFnbWEgaW5pdF9zZWciOworICAgIHByaW50UHJldHR5UHJhZ21hKE9TLCBQb2xpY3kpOworICAgIE9TIDw8ICJcbiI7ICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkluaXRTZWdBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImluaXRfc2VnIjsKKyAgfQorfQorCitJbnRlbE9jbEJpY2NBdHRyICpJbnRlbE9jbEJpY2NBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIEludGVsT2NsQmljY0F0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBJbnRlbE9jbEJpY2NBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChpbnRlbF9vY2xfYmljYykpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjppbnRlbF9vY2xfYmljY11dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpJbnRlbE9jbEJpY2NBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImludGVsX29jbF9iaWNjIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAiaW50ZWxfb2NsX2JpY2MiOworICB9Cit9CisKK0ludGVybmFsTGlua2FnZUF0dHIgKkludGVybmFsTGlua2FnZUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgSW50ZXJuYWxMaW5rYWdlQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIEludGVybmFsTGlua2FnZUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGludGVybmFsX2xpbmthZ2UpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6aW50ZXJuYWxfbGlua2FnZV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjppbnRlcm5hbF9saW5rYWdlXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkludGVybmFsTGlua2FnZUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiaW50ZXJuYWxfbGlua2FnZSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImludGVybmFsX2xpbmthZ2UiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJpbnRlcm5hbF9saW5rYWdlIjsKKyAgfQorfQorCitMVE9WaXNpYmlsaXR5UHVibGljQXR0ciAqTFRPVmlzaWJpbGl0eVB1YmxpY0F0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgTFRPVmlzaWJpbGl0eVB1YmxpY0F0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBMVE9WaXNpYmlsaXR5UHVibGljQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygobHRvX3Zpc2liaWxpdHlfcHVibGljKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Omx0b192aXNpYmlsaXR5X3B1YmxpY11dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpsdG9fdmlzaWJpbGl0eV9wdWJsaWNdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqTFRPVmlzaWJpbGl0eVB1YmxpY0F0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAibHRvX3Zpc2liaWxpdHlfcHVibGljIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAibHRvX3Zpc2liaWxpdHlfcHVibGljIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAibHRvX3Zpc2liaWxpdHlfcHVibGljIjsKKyAgfQorfQorCitMYXlvdXRWZXJzaW9uQXR0ciAqTGF5b3V0VmVyc2lvbkF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgTGF5b3V0VmVyc2lvbkF0dHIoZ2V0TG9jYXRpb24oKSwgQywgdmVyc2lvbiwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBMYXlvdXRWZXJzaW9uQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19kZWNsc3BlYyhsYXlvdXRfdmVyc2lvbigiIDw8IGdldFZlcnNpb24oKSA8PCAiKSkiOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKkxheW91dFZlcnNpb25BdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImxheW91dF92ZXJzaW9uIjsKKyAgfQorfQorCitMb2NrUmV0dXJuZWRBdHRyICpMb2NrUmV0dXJuZWRBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIExvY2tSZXR1cm5lZEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgYXJnLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIExvY2tSZXR1cm5lZEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGxvY2tfcmV0dXJuZWQoIiA8PCBnZXRBcmcoKSA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpMb2NrUmV0dXJuZWRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImxvY2tfcmV0dXJuZWQiOworICB9Cit9CisKK0xvY2tzRXhjbHVkZWRBdHRyICpMb2Nrc0V4Y2x1ZGVkQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBMb2Nrc0V4Y2x1ZGVkQXR0cihnZXRMb2NhdGlvbigpLCBDLCBhcmdzXywgYXJnc19TaXplLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIExvY2tzRXhjbHVkZWRBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChsb2Nrc19leGNsdWRlZCgiOworICBib29sIGlzRmlyc3QgPSB0cnVlOworICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IGFyZ3MoKSkgeworICAgIGlmIChpc0ZpcnN0KSBpc0ZpcnN0ID0gZmFsc2U7CisgICAgZWxzZSBPUyA8PCAiLCAiOworICAgIE9TIDw8IFZhbDsKKyAgfQorICBPUyA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpMb2Nrc0V4Y2x1ZGVkQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJsb2Nrc19leGNsdWRlZCI7CisgIH0KK30KKworTG9vcEhpbnRBdHRyICpMb29wSGludEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgTG9vcEhpbnRBdHRyKGdldExvY2F0aW9uKCksIEMsIG9wdGlvbiwgc3RhdGUsIHZhbHVlLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIExvb3BIaW50QXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIjcHJhZ21hIGNsYW5nIGxvb3AiOworICAgIHByaW50UHJldHR5UHJhZ21hKE9TLCBQb2xpY3kpOworICAgIE9TIDw8ICJcbiI7ICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiI3ByYWdtYSB1bnJvbGwiOworICAgIHByaW50UHJldHR5UHJhZ21hKE9TLCBQb2xpY3kpOworICAgIE9TIDw8ICJcbiI7ICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiI3ByYWdtYSBub3Vucm9sbCI7CisgICAgcHJpbnRQcmV0dHlQcmFnbWEoT1MsIFBvbGljeSk7CisgICAgT1MgPDwgIlxuIjsgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqTG9vcEhpbnRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImxvb3AiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJ1bnJvbGwiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJub3Vucm9sbCI7CisgIH0KK30KKworTVNBQklBdHRyICpNU0FCSUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgTVNBQklBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgTVNBQklBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChtc19hYmkpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6Om1zX2FiaV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpNU0FCSUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAibXNfYWJpIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAibXNfYWJpIjsKKyAgfQorfQorCitNU0luaGVyaXRhbmNlQXR0ciAqTVNJbmhlcml0YW5jZUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgTVNJbmhlcml0YW5jZUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgYmVzdENhc2UsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgTVNJbmhlcml0YW5jZUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fc2luZ2xlX2luaGVyaXRhbmNlKCIgPDwgZ2V0QmVzdENhc2UoKSA8PCAiKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgX19tdWx0aXBsZV9pbmhlcml0YW5jZSgiIDw8IGdldEJlc3RDYXNlKCkgPDwgIikiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIF9fdmlydHVhbF9pbmhlcml0YW5jZSgiIDw8IGdldEJlc3RDYXNlKCkgPDwgIikiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMyA6IHsKKyAgICBPUyA8PCAiIF9fdW5zcGVjaWZpZWRfaW5oZXJpdGFuY2UoIiA8PCBnZXRCZXN0Q2FzZSgpIDw8ICIpIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpNU0luaGVyaXRhbmNlQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJfX3NpbmdsZV9pbmhlcml0YW5jZSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIl9fbXVsdGlwbGVfaW5oZXJpdGFuY2UiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJfX3ZpcnR1YWxfaW5oZXJpdGFuY2UiOworICBjYXNlIDM6CisgICAgcmV0dXJuICJfX3Vuc3BlY2lmaWVkX2luaGVyaXRhbmNlIjsKKyAgfQorfQorCitNU05vVlRhYmxlQXR0ciAqTVNOb1ZUYWJsZUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgTVNOb1ZUYWJsZUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBNU05vVlRhYmxlQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19kZWNsc3BlYyhub3Z0YWJsZSkiOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk1TTm9WVGFibGVBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm5vdnRhYmxlIjsKKyAgfQorfQorCitNU1A0MzBJbnRlcnJ1cHRBdHRyICpNU1A0MzBJbnRlcnJ1cHRBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE1TUDQzMEludGVycnVwdEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgbnVtYmVyLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE1TUDQzMEludGVycnVwdEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGludGVycnVwdCgiIDw8IGdldE51bWJlcigpIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251OjppbnRlcnJ1cHQoIiA8PCBnZXROdW1iZXIoKSA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpNU1A0MzBJbnRlcnJ1cHRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImludGVycnVwdCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImludGVycnVwdCI7CisgIH0KK30KKworTVNTdHJ1Y3RBdHRyICpNU1N0cnVjdEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgTVNTdHJ1Y3RBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgTVNTdHJ1Y3RBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChtc19zdHJ1Y3QpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6Om1zX3N0cnVjdF1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpNU1N0cnVjdEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAibXNfc3RydWN0IjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAibXNfc3RydWN0IjsKKyAgfQorfQorCitNU1Z0b3JEaXNwQXR0ciAqTVNWdG9yRGlzcEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgTVNWdG9yRGlzcEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgdmRtLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE1TVnRvckRpc3BBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKK30KKworY29uc3QgY2hhciAqTVNWdG9yRGlzcEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICByZXR1cm4gIihObyBzcGVsbGluZykiOworfQorCitNYXhGaWVsZEFsaWdubWVudEF0dHIgKk1heEZpZWxkQWxpZ25tZW50QXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBNYXhGaWVsZEFsaWdubWVudEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgYWxpZ25tZW50LCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE1heEZpZWxkQWxpZ25tZW50QXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7Cit9CisKK2NvbnN0IGNoYXIgKk1heEZpZWxkQWxpZ25tZW50QXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7Cit9CisKK01heUFsaWFzQXR0ciAqTWF5QWxpYXNBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE1heUFsaWFzQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE1heUFsaWFzQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygobWF5X2FsaWFzKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251OjptYXlfYWxpYXNdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqTWF5QWxpYXNBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm1heV9hbGlhcyI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm1heV9hbGlhcyI7CisgIH0KK30KKworTWljcm9NaXBzQXR0ciAqTWljcm9NaXBzQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBNaWNyb01pcHNBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgTWljcm9NaXBzQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygobWljcm9taXBzKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251OjptaWNyb21pcHNdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqTWljcm9NaXBzQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJtaWNyb21pcHMiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJtaWNyb21pcHMiOworICB9Cit9CisKK01pblNpemVBdHRyICpNaW5TaXplQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBNaW5TaXplQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE1pblNpemVBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChtaW5zaXplKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Om1pbnNpemVdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6bWluc2l6ZV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpNaW5TaXplQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJtaW5zaXplIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAibWluc2l6ZSI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm1pbnNpemUiOworICB9Cit9CisKK01pcHMxNkF0dHIgKk1pcHMxNkF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgTWlwczE2QXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE1pcHMxNkF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG1pcHMxNikpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6bWlwczE2XV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk1pcHMxNkF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAibWlwczE2IjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAibWlwczE2IjsKKyAgfQorfQorCitNaXBzSW50ZXJydXB0QXR0ciAqTWlwc0ludGVycnVwdEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgTWlwc0ludGVycnVwdEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgaW50ZXJydXB0LCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE1pcHNJbnRlcnJ1cHRBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChpbnRlcnJ1cHQoXCIiIDw8IE1pcHNJbnRlcnJ1cHRBdHRyOjpDb252ZXJ0SW50ZXJydXB0VHlwZVRvU3RyKGdldEludGVycnVwdCgpKSA8PCAiXCIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251OjppbnRlcnJ1cHQoXCIiIDw8IE1pcHNJbnRlcnJ1cHRBdHRyOjpDb252ZXJ0SW50ZXJydXB0VHlwZVRvU3RyKGdldEludGVycnVwdCgpKSA8PCAiXCIpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk1pcHNJbnRlcnJ1cHRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImludGVycnVwdCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImludGVycnVwdCI7CisgIH0KK30KKworTWlwc0xvbmdDYWxsQXR0ciAqTWlwc0xvbmdDYWxsQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBNaXBzTG9uZ0NhbGxBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgTWlwc0xvbmdDYWxsQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygobG9uZ19jYWxsKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251Ojpsb25nX2NhbGxdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoZmFyKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMyA6IHsKKyAgICBPUyA8PCAiIFtbZ251OjpmYXJdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqTWlwc0xvbmdDYWxsQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJsb25nX2NhbGwiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJsb25nX2NhbGwiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJmYXIiOworICBjYXNlIDM6CisgICAgcmV0dXJuICJmYXIiOworICB9Cit9CisKK01pcHNTaG9ydENhbGxBdHRyICpNaXBzU2hvcnRDYWxsQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBNaXBzU2hvcnRDYWxsQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE1pcHNTaG9ydENhbGxBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChzaG9ydF9jYWxsKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251OjpzaG9ydF9jYWxsXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG5lYXIpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAzIDogeworICAgIE9TIDw8ICIgW1tnbnU6Om5lYXJdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqTWlwc1Nob3J0Q2FsbEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAic2hvcnRfY2FsbCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gInNob3J0X2NhbGwiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJuZWFyIjsKKyAgY2FzZSAzOgorICAgIHJldHVybiAibmVhciI7CisgIH0KK30KKworTW9kZUF0dHIgKk1vZGVBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE1vZGVBdHRyKGdldExvY2F0aW9uKCksIEMsIG1vZGUsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgTW9kZUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG1vZGUoIiA8PCAoZ2V0TW9kZSgpID8gZ2V0TW9kZSgpLT5nZXROYW1lKCkgOiAiIikgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6Om1vZGUoIiA8PCAoZ2V0TW9kZSgpID8gZ2V0TW9kZSgpLT5nZXROYW1lKCkgOiAiIikgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqTW9kZUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAibW9kZSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm1vZGUiOworICB9Cit9CisKK05TQ29uc3VtZWRBdHRyICpOU0NvbnN1bWVkQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBOU0NvbnN1bWVkQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE5TQ29uc3VtZWRBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChuc19jb25zdW1lZCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpuc19jb25zdW1lZF1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpuc19jb25zdW1lZF1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpOU0NvbnN1bWVkQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJuc19jb25zdW1lZCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm5zX2NvbnN1bWVkIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAibnNfY29uc3VtZWQiOworICB9Cit9CisKK05TQ29uc3VtZXNTZWxmQXR0ciAqTlNDb25zdW1lc1NlbGZBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE5TQ29uc3VtZXNTZWxmQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE5TQ29uc3VtZXNTZWxmQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygobnNfY29uc3VtZXNfc2VsZikpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpuc19jb25zdW1lc19zZWxmXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Om5zX2NvbnN1bWVzX3NlbGZdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqTlNDb25zdW1lc1NlbGZBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm5zX2NvbnN1bWVzX3NlbGYiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJuc19jb25zdW1lc19zZWxmIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAibnNfY29uc3VtZXNfc2VsZiI7CisgIH0KK30KKworTlNSZXR1cm5zQXV0b3JlbGVhc2VkQXR0ciAqTlNSZXR1cm5zQXV0b3JlbGVhc2VkQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBOU1JldHVybnNBdXRvcmVsZWFzZWRBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgTlNSZXR1cm5zQXV0b3JlbGVhc2VkQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygobnNfcmV0dXJuc19hdXRvcmVsZWFzZWQpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6bnNfcmV0dXJuc19hdXRvcmVsZWFzZWRdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6bnNfcmV0dXJuc19hdXRvcmVsZWFzZWRdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqTlNSZXR1cm5zQXV0b3JlbGVhc2VkQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJuc19yZXR1cm5zX2F1dG9yZWxlYXNlZCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm5zX3JldHVybnNfYXV0b3JlbGVhc2VkIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAibnNfcmV0dXJuc19hdXRvcmVsZWFzZWQiOworICB9Cit9CisKK05TUmV0dXJuc05vdFJldGFpbmVkQXR0ciAqTlNSZXR1cm5zTm90UmV0YWluZWRBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE5TUmV0dXJuc05vdFJldGFpbmVkQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE5TUmV0dXJuc05vdFJldGFpbmVkQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygobnNfcmV0dXJuc19ub3RfcmV0YWluZWQpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6bnNfcmV0dXJuc19ub3RfcmV0YWluZWRdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6bnNfcmV0dXJuc19ub3RfcmV0YWluZWRdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqTlNSZXR1cm5zTm90UmV0YWluZWRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm5zX3JldHVybnNfbm90X3JldGFpbmVkIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAibnNfcmV0dXJuc19ub3RfcmV0YWluZWQiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJuc19yZXR1cm5zX25vdF9yZXRhaW5lZCI7CisgIH0KK30KKworTlNSZXR1cm5zUmV0YWluZWRBdHRyICpOU1JldHVybnNSZXRhaW5lZEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgTlNSZXR1cm5zUmV0YWluZWRBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgTlNSZXR1cm5zUmV0YWluZWRBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChuc19yZXR1cm5zX3JldGFpbmVkKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Om5zX3JldHVybnNfcmV0YWluZWRdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6bnNfcmV0dXJuc19yZXRhaW5lZF1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpOU1JldHVybnNSZXRhaW5lZEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAibnNfcmV0dXJuc19yZXRhaW5lZCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm5zX3JldHVybnNfcmV0YWluZWQiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJuc19yZXR1cm5zX3JldGFpbmVkIjsKKyAgfQorfQorCitOYWtlZEF0dHIgKk5ha2VkQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBOYWtlZEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBOYWtlZEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG5ha2VkKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251OjpuYWtlZF1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBfX2RlY2xzcGVjKG5ha2VkKSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqTmFrZWRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm5ha2VkIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAibmFrZWQiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJuYWtlZCI7CisgIH0KK30KKworTm9BbGlhc0F0dHIgKk5vQWxpYXNBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE5vQWxpYXNBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgTm9BbGlhc0F0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fZGVjbHNwZWMobm9hbGlhcykiOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk5vQWxpYXNBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm5vYWxpYXMiOworICB9Cit9CisKK05vQ29tbW9uQXR0ciAqTm9Db21tb25BdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE5vQ29tbW9uQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE5vQ29tbW9uQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygobm9jb21tb24pKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6Om5vY29tbW9uXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk5vQ29tbW9uQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJub2NvbW1vbiI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm5vY29tbW9uIjsKKyAgfQorfQorCitOb0RlYnVnQXR0ciAqTm9EZWJ1Z0F0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgTm9EZWJ1Z0F0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBOb0RlYnVnQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygobm9kZWJ1ZykpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6bm9kZWJ1Z11dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpOb0RlYnVnQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJub2RlYnVnIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAibm9kZWJ1ZyI7CisgIH0KK30KKworTm9EdXBsaWNhdGVBdHRyICpOb0R1cGxpY2F0ZUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgTm9EdXBsaWNhdGVBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgTm9EdXBsaWNhdGVBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChub2R1cGxpY2F0ZSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpub2R1cGxpY2F0ZV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpub2R1cGxpY2F0ZV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpOb0R1cGxpY2F0ZUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAibm9kdXBsaWNhdGUiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJub2R1cGxpY2F0ZSI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm5vZHVwbGljYXRlIjsKKyAgfQorfQorCitOb0VzY2FwZUF0dHIgKk5vRXNjYXBlQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBOb0VzY2FwZUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBOb0VzY2FwZUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG5vZXNjYXBlKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Om5vZXNjYXBlXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Om5vZXNjYXBlXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk5vRXNjYXBlQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJub2VzY2FwZSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm5vZXNjYXBlIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAibm9lc2NhcGUiOworICB9Cit9CisKK05vSW5saW5lQXR0ciAqTm9JbmxpbmVBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE5vSW5saW5lQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE5vSW5saW5lQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6Om5vaW5saW5lXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIF9fZGVjbHNwZWMobm9pbmxpbmUpIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpOb0lubGluZUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAibm9pbmxpbmUiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJub2lubGluZSI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm5vaW5saW5lIjsKKyAgfQorfQorCitOb0luc3RydW1lbnRGdW5jdGlvbkF0dHIgKk5vSW5zdHJ1bWVudEZ1bmN0aW9uQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBOb0luc3RydW1lbnRGdW5jdGlvbkF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBOb0luc3RydW1lbnRGdW5jdGlvbkF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG5vX2luc3RydW1lbnRfZnVuY3Rpb24pKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6Om5vX2luc3RydW1lbnRfZnVuY3Rpb25dXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqTm9JbnN0cnVtZW50RnVuY3Rpb25BdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm5vX2luc3RydW1lbnRfZnVuY3Rpb24iOworICBjYXNlIDE6CisgICAgcmV0dXJuICJub19pbnN0cnVtZW50X2Z1bmN0aW9uIjsKKyAgfQorfQorCitOb01pY3JvTWlwc0F0dHIgKk5vTWljcm9NaXBzQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBOb01pY3JvTWlwc0F0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBOb01pY3JvTWlwc0F0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG5vbWljcm9taXBzKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251Ojpub21pY3JvbWlwc11dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpOb01pY3JvTWlwc0F0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAibm9taWNyb21pcHMiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJub21pY3JvbWlwcyI7CisgIH0KK30KKworTm9NaXBzMTZBdHRyICpOb01pcHMxNkF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgTm9NaXBzMTZBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgTm9NaXBzMTZBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChub21pcHMxNikpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6bm9taXBzMTZdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqTm9NaXBzMTZBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm5vbWlwczE2IjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAibm9taXBzMTYiOworICB9Cit9CisKK05vUmV0dXJuQXR0ciAqTm9SZXR1cm5BdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE5vUmV0dXJuQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE5vUmV0dXJuQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6Om5vcmV0dXJuXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIF9fZGVjbHNwZWMobm9yZXR1cm4pIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpOb1JldHVybkF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAibm9yZXR1cm4iOworICBjYXNlIDE6CisgICAgcmV0dXJuICJub3JldHVybiI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm5vcmV0dXJuIjsKKyAgfQorfQorCitOb1Nhbml0aXplQXR0ciAqTm9TYW5pdGl6ZUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgTm9TYW5pdGl6ZUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgc2FuaXRpemVyc18sIHNhbml0aXplcnNfU2l6ZSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBOb1Nhbml0aXplQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBzYW5pdGl6ZXJzKCkpIHsKKyAgICBpZiAoaXNGaXJzdCkgaXNGaXJzdCA9IGZhbHNlOworICAgIGVsc2UgT1MgPDwgIiwgIjsKKyAgICBPUyA8PCAiXCIiIDw8IFZhbCA8PCAiXCIiOworICB9CisgIE9TIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Om5vX3Nhbml0aXplKCI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogc2FuaXRpemVycygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgIlwiIiA8PCBWYWwgPDwgIlwiIjsKKyAgfQorICBPUyA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpub19zYW5pdGl6ZSgiOworICBib29sIGlzRmlyc3QgPSB0cnVlOworICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IHNhbml0aXplcnMoKSkgeworICAgIGlmIChpc0ZpcnN0KSBpc0ZpcnN0ID0gZmFsc2U7CisgICAgZWxzZSBPUyA8PCAiLCAiOworICAgIE9TIDw8ICJcIiIgPDwgVmFsIDw8ICJcIiI7CisgIH0KKyAgT1MgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqTm9TYW5pdGl6ZUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAibm9fc2FuaXRpemUiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJub19zYW5pdGl6ZSI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm5vX3Nhbml0aXplIjsKKyAgfQorfQorCitOb1NwbGl0U3RhY2tBdHRyICpOb1NwbGl0U3RhY2tBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE5vU3BsaXRTdGFja0F0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBOb1NwbGl0U3RhY2tBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChub19zcGxpdF9zdGFjaykpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6bm9fc3BsaXRfc3RhY2tdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqTm9TcGxpdFN0YWNrQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJub19zcGxpdF9zdGFjayI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm5vX3NwbGl0X3N0YWNrIjsKKyAgfQorfQorCitOb1RocmVhZFNhZmV0eUFuYWx5c2lzQXR0ciAqTm9UaHJlYWRTYWZldHlBbmFseXNpc0F0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgTm9UaHJlYWRTYWZldHlBbmFseXNpc0F0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBOb1RocmVhZFNhZmV0eUFuYWx5c2lzQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygobm9fdGhyZWFkX3NhZmV0eV9hbmFseXNpcykpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpub190aHJlYWRfc2FmZXR5X2FuYWx5c2lzXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Om5vX3RocmVhZF9zYWZldHlfYW5hbHlzaXNdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqTm9UaHJlYWRTYWZldHlBbmFseXNpc0F0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAibm9fdGhyZWFkX3NhZmV0eV9hbmFseXNpcyI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm5vX3RocmVhZF9zYWZldHlfYW5hbHlzaXMiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJub190aHJlYWRfc2FmZXR5X2FuYWx5c2lzIjsKKyAgfQorfQorCitOb1Rocm93QXR0ciAqTm9UaHJvd0F0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgTm9UaHJvd0F0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBOb1Rocm93QXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygobm90aHJvdykpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6bm90aHJvd11dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBfX2RlY2xzcGVjKG5vdGhyb3cpIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpOb1Rocm93QXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJub3Rocm93IjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAibm90aHJvdyI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm5vdGhyb3ciOworICB9Cit9CisKK05vbk51bGxBdHRyICpOb25OdWxsQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBOb25OdWxsQXR0cihnZXRMb2NhdGlvbigpLCBDLCBhcmdzXywgYXJnc19TaXplLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE5vbk51bGxBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChub25udWxsKCI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsLmdldFNvdXJjZUluZGV4KCk7CisgIH0KKyAgT1MgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6Om5vbm51bGwoIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBhcmdzKCkpIHsKKyAgICBpZiAoaXNGaXJzdCkgaXNGaXJzdCA9IGZhbHNlOworICAgIGVsc2UgT1MgPDwgIiwgIjsKKyAgICBPUyA8PCBWYWwuZ2V0U291cmNlSW5kZXgoKTsKKyAgfQorICBPUyA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpOb25OdWxsQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJub25udWxsIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAibm9ubnVsbCI7CisgIH0KK30KKworTm90VGFpbENhbGxlZEF0dHIgKk5vdFRhaWxDYWxsZWRBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE5vdFRhaWxDYWxsZWRBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgTm90VGFpbENhbGxlZEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG5vdF90YWlsX2NhbGxlZCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpub3RfdGFpbF9jYWxsZWRdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6bm90X3RhaWxfY2FsbGVkXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk5vdFRhaWxDYWxsZWRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm5vdF90YWlsX2NhbGxlZCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm5vdF90YWlsX2NhbGxlZCI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm5vdF90YWlsX2NhbGxlZCI7CisgIH0KK30KKworT01QQ2FwdHVyZUtpbmRBdHRyICpPTVBDYXB0dXJlS2luZEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgT01QQ2FwdHVyZUtpbmRBdHRyKGdldExvY2F0aW9uKCksIEMsIGNhcHR1cmVLaW5kLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE9NUENhcHR1cmVLaW5kQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7Cit9CisKK2NvbnN0IGNoYXIgKk9NUENhcHR1cmVLaW5kQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7Cit9CisKK09NUENhcHR1cmVOb0luaXRBdHRyICpPTVBDYXB0dXJlTm9Jbml0QXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBPTVBDYXB0dXJlTm9Jbml0QXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE9NUENhcHR1cmVOb0luaXRBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKK30KKworY29uc3QgY2hhciAqT01QQ2FwdHVyZU5vSW5pdEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICByZXR1cm4gIihObyBzcGVsbGluZykiOworfQorCitPTVBEZWNsYXJlU2ltZERlY2xBdHRyICpPTVBEZWNsYXJlU2ltZERlY2xBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE9NUERlY2xhcmVTaW1kRGVjbEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgYnJhbmNoU3RhdGUsIHNpbWRsZW4sIHVuaWZvcm1zXywgdW5pZm9ybXNfU2l6ZSwgYWxpZ25lZHNfLCBhbGlnbmVkc19TaXplLCBhbGlnbm1lbnRzXywgYWxpZ25tZW50c19TaXplLCBsaW5lYXJzXywgbGluZWFyc19TaXplLCBtb2RpZmllcnNfLCBtb2RpZmllcnNfU2l6ZSwgc3RlcHNfLCBzdGVwc19TaXplLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE9NUERlY2xhcmVTaW1kRGVjbEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiI3ByYWdtYSBvbXAgZGVjbGFyZSBzaW1kIjsKKyAgICBwcmludFByZXR0eVByYWdtYShPUywgUG9saWN5KTsKKyAgICBPUyA8PCAiXG4iOyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpPTVBEZWNsYXJlU2ltZERlY2xBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImRlY2xhcmUgc2ltZCI7CisgIH0KK30KKworT01QRGVjbGFyZVRhcmdldERlY2xBdHRyICpPTVBEZWNsYXJlVGFyZ2V0RGVjbEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgT01QRGVjbGFyZVRhcmdldERlY2xBdHRyKGdldExvY2F0aW9uKCksIEMsIG1hcFR5cGUsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgT01QRGVjbGFyZVRhcmdldERlY2xBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiNwcmFnbWEgb21wIGRlY2xhcmUgdGFyZ2V0IjsKKyAgICBwcmludFByZXR0eVByYWdtYShPUywgUG9saWN5KTsKKyAgICBPUyA8PCAiXG4iOyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpPTVBEZWNsYXJlVGFyZ2V0RGVjbEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiZGVjbGFyZSB0YXJnZXQiOworICB9Cit9CisKK09NUFJlZmVyZW5jZWRWYXJBdHRyICpPTVBSZWZlcmVuY2VkVmFyQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBPTVBSZWZlcmVuY2VkVmFyQXR0cihnZXRMb2NhdGlvbigpLCBDLCByZWYsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgT01QUmVmZXJlbmNlZFZhckF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworfQorCitjb25zdCBjaGFyICpPTVBSZWZlcmVuY2VkVmFyQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7Cit9CisKK09NUFRocmVhZFByaXZhdGVEZWNsQXR0ciAqT01QVGhyZWFkUHJpdmF0ZURlY2xBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE9NUFRocmVhZFByaXZhdGVEZWNsQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE9NUFRocmVhZFByaXZhdGVEZWNsQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7Cit9CisKK2NvbnN0IGNoYXIgKk9NUFRocmVhZFByaXZhdGVEZWNsQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7Cit9CisKK09iakNCb3hhYmxlQXR0ciAqT2JqQ0JveGFibGVBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE9iakNCb3hhYmxlQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE9iakNCb3hhYmxlQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygob2JqY19ib3hhYmxlKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Om9iamNfYm94YWJsZV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvYmpjX2JveGFibGVdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqT2JqQ0JveGFibGVBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm9iamNfYm94YWJsZSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm9iamNfYm94YWJsZSI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm9iamNfYm94YWJsZSI7CisgIH0KK30KKworT2JqQ0JyaWRnZUF0dHIgKk9iakNCcmlkZ2VBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE9iakNCcmlkZ2VBdHRyKGdldExvY2F0aW9uKCksIEMsIGJyaWRnZWRUeXBlLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE9iakNCcmlkZ2VBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZSgiIDw8IChnZXRCcmlkZ2VkVHlwZSgpID8gZ2V0QnJpZGdlZFR5cGUoKS0+Z2V0TmFtZSgpIDogIiIpIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Om9iamNfYnJpZGdlKCIgPDwgKGdldEJyaWRnZWRUeXBlKCkgPyBnZXRCcmlkZ2VkVHlwZSgpLT5nZXROYW1lKCkgOiAiIikgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6b2JqY19icmlkZ2UoIiA8PCAoZ2V0QnJpZGdlZFR5cGUoKSA/IGdldEJyaWRnZWRUeXBlKCktPmdldE5hbWUoKSA6ICIiKSA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpPYmpDQnJpZGdlQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJvYmpjX2JyaWRnZSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm9iamNfYnJpZGdlIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAib2JqY19icmlkZ2UiOworICB9Cit9CisKK09iakNCcmlkZ2VNdXRhYmxlQXR0ciAqT2JqQ0JyaWRnZU11dGFibGVBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE9iakNCcmlkZ2VNdXRhYmxlQXR0cihnZXRMb2NhdGlvbigpLCBDLCBicmlkZ2VkVHlwZSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBPYmpDQnJpZGdlTXV0YWJsZUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlX211dGFibGUoIiA8PCAoZ2V0QnJpZGdlZFR5cGUoKSA/IGdldEJyaWRnZWRUeXBlKCktPmdldE5hbWUoKSA6ICIiKSA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvYmpjX2JyaWRnZV9tdXRhYmxlKCIgPDwgKGdldEJyaWRnZWRUeXBlKCkgPyBnZXRCcmlkZ2VkVHlwZSgpLT5nZXROYW1lKCkgOiAiIikgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6b2JqY19icmlkZ2VfbXV0YWJsZSgiIDw8IChnZXRCcmlkZ2VkVHlwZSgpID8gZ2V0QnJpZGdlZFR5cGUoKS0+Z2V0TmFtZSgpIDogIiIpIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk9iakNCcmlkZ2VNdXRhYmxlQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJvYmpjX2JyaWRnZV9tdXRhYmxlIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAib2JqY19icmlkZ2VfbXV0YWJsZSI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm9iamNfYnJpZGdlX211dGFibGUiOworICB9Cit9CisKK09iakNCcmlkZ2VSZWxhdGVkQXR0ciAqT2JqQ0JyaWRnZVJlbGF0ZWRBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE9iakNCcmlkZ2VSZWxhdGVkQXR0cihnZXRMb2NhdGlvbigpLCBDLCByZWxhdGVkQ2xhc3MsIGNsYXNzTWV0aG9kLCBpbnN0YW5jZU1ldGhvZCwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBPYmpDQnJpZGdlUmVsYXRlZEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlX3JlbGF0ZWQoIiA8PCAoZ2V0UmVsYXRlZENsYXNzKCkgPyBnZXRSZWxhdGVkQ2xhc3MoKS0+Z2V0TmFtZSgpIDogIiIpIDw8ICIsICIgPDwgKGdldENsYXNzTWV0aG9kKCkgPyBnZXRDbGFzc01ldGhvZCgpLT5nZXROYW1lKCkgOiAiIikgPDwgIiwgIiA8PCAoZ2V0SW5zdGFuY2VNZXRob2QoKSA/IGdldEluc3RhbmNlTWV0aG9kKCktPmdldE5hbWUoKSA6ICIiKSA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvYmpjX2JyaWRnZV9yZWxhdGVkKCIgPDwgKGdldFJlbGF0ZWRDbGFzcygpID8gZ2V0UmVsYXRlZENsYXNzKCktPmdldE5hbWUoKSA6ICIiKSA8PCAiLCAiIDw8IChnZXRDbGFzc01ldGhvZCgpID8gZ2V0Q2xhc3NNZXRob2QoKS0+Z2V0TmFtZSgpIDogIiIpIDw8ICIsICIgPDwgKGdldEluc3RhbmNlTWV0aG9kKCkgPyBnZXRJbnN0YW5jZU1ldGhvZCgpLT5nZXROYW1lKCkgOiAiIikgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6b2JqY19icmlkZ2VfcmVsYXRlZCgiIDw8IChnZXRSZWxhdGVkQ2xhc3MoKSA/IGdldFJlbGF0ZWRDbGFzcygpLT5nZXROYW1lKCkgOiAiIikgPDwgIiwgIiA8PCAoZ2V0Q2xhc3NNZXRob2QoKSA/IGdldENsYXNzTWV0aG9kKCktPmdldE5hbWUoKSA6ICIiKSA8PCAiLCAiIDw8IChnZXRJbnN0YW5jZU1ldGhvZCgpID8gZ2V0SW5zdGFuY2VNZXRob2QoKS0+Z2V0TmFtZSgpIDogIiIpIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk9iakNCcmlkZ2VSZWxhdGVkQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJvYmpjX2JyaWRnZV9yZWxhdGVkIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAib2JqY19icmlkZ2VfcmVsYXRlZCI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm9iamNfYnJpZGdlX3JlbGF0ZWQiOworICB9Cit9CisKK09iakNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJBdHRyICpPYmpDRGVzaWduYXRlZEluaXRpYWxpemVyQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBPYmpDRGVzaWduYXRlZEluaXRpYWxpemVyQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE9iakNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChvYmpjX2Rlc2lnbmF0ZWRfaW5pdGlhbGl6ZXIpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6b2JqY19kZXNpZ25hdGVkX2luaXRpYWxpemVyXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Om9iamNfZGVzaWduYXRlZF9pbml0aWFsaXplcl1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpPYmpDRGVzaWduYXRlZEluaXRpYWxpemVyQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJvYmpjX2Rlc2lnbmF0ZWRfaW5pdGlhbGl6ZXIiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJvYmpjX2Rlc2lnbmF0ZWRfaW5pdGlhbGl6ZXIiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJvYmpjX2Rlc2lnbmF0ZWRfaW5pdGlhbGl6ZXIiOworICB9Cit9CisKK09iakNFeGNlcHRpb25BdHRyICpPYmpDRXhjZXB0aW9uQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBPYmpDRXhjZXB0aW9uQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE9iakNFeGNlcHRpb25BdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChvYmpjX2V4Y2VwdGlvbikpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvYmpjX2V4Y2VwdGlvbl1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvYmpjX2V4Y2VwdGlvbl1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpPYmpDRXhjZXB0aW9uQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJvYmpjX2V4Y2VwdGlvbiI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm9iamNfZXhjZXB0aW9uIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAib2JqY19leGNlcHRpb24iOworICB9Cit9CisKK09iakNFeHBsaWNpdFByb3RvY29sSW1wbEF0dHIgKk9iakNFeHBsaWNpdFByb3RvY29sSW1wbEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgT2JqQ0V4cGxpY2l0UHJvdG9jb2xJbXBsQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE9iakNFeHBsaWNpdFByb3RvY29sSW1wbEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG9iamNfcHJvdG9jb2xfcmVxdWlyZXNfZXhwbGljaXRfaW1wbGVtZW50YXRpb24pKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6b2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbl1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvYmpjX3Byb3RvY29sX3JlcXVpcmVzX2V4cGxpY2l0X2ltcGxlbWVudGF0aW9uXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk9iakNFeHBsaWNpdFByb3RvY29sSW1wbEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAib2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbiI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm9iamNfcHJvdG9jb2xfcmVxdWlyZXNfZXhwbGljaXRfaW1wbGVtZW50YXRpb24iOworICBjYXNlIDI6CisgICAgcmV0dXJuICJvYmpjX3Byb3RvY29sX3JlcXVpcmVzX2V4cGxpY2l0X2ltcGxlbWVudGF0aW9uIjsKKyAgfQorfQorCitPYmpDSW5kZXBlbmRlbnRDbGFzc0F0dHIgKk9iakNJbmRlcGVuZGVudENsYXNzQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBPYmpDSW5kZXBlbmRlbnRDbGFzc0F0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBPYmpDSW5kZXBlbmRlbnRDbGFzc0F0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG9iamNfaW5kZXBlbmRlbnRfY2xhc3MpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6b2JqY19pbmRlcGVuZGVudF9jbGFzc11dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvYmpjX2luZGVwZW5kZW50X2NsYXNzXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk9iakNJbmRlcGVuZGVudENsYXNzQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJvYmpjX2luZGVwZW5kZW50X2NsYXNzIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAib2JqY19pbmRlcGVuZGVudF9jbGFzcyI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm9iamNfaW5kZXBlbmRlbnRfY2xhc3MiOworICB9Cit9CisKK09iakNNZXRob2RGYW1pbHlBdHRyICpPYmpDTWV0aG9kRmFtaWx5QXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBPYmpDTWV0aG9kRmFtaWx5QXR0cihnZXRMb2NhdGlvbigpLCBDLCBmYW1pbHksIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgT2JqQ01ldGhvZEZhbWlseUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG9iamNfbWV0aG9kX2ZhbWlseShcIiIgPDwgT2JqQ01ldGhvZEZhbWlseUF0dHI6OkNvbnZlcnRGYW1pbHlLaW5kVG9TdHIoZ2V0RmFtaWx5KCkpIDw8ICJcIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6b2JqY19tZXRob2RfZmFtaWx5KFwiIiA8PCBPYmpDTWV0aG9kRmFtaWx5QXR0cjo6Q29udmVydEZhbWlseUtpbmRUb1N0cihnZXRGYW1pbHkoKSkgPDwgIlwiKV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvYmpjX21ldGhvZF9mYW1pbHkoXCIiIDw8IE9iakNNZXRob2RGYW1pbHlBdHRyOjpDb252ZXJ0RmFtaWx5S2luZFRvU3RyKGdldEZhbWlseSgpKSA8PCAiXCIpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk9iakNNZXRob2RGYW1pbHlBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm9iamNfbWV0aG9kX2ZhbWlseSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm9iamNfbWV0aG9kX2ZhbWlseSI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm9iamNfbWV0aG9kX2ZhbWlseSI7CisgIH0KK30KKworT2JqQ05TT2JqZWN0QXR0ciAqT2JqQ05TT2JqZWN0QXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBPYmpDTlNPYmplY3RBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgT2JqQ05TT2JqZWN0QXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoTlNPYmplY3QpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6TlNPYmplY3RdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6TlNPYmplY3RdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqT2JqQ05TT2JqZWN0QXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJOU09iamVjdCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIk5TT2JqZWN0IjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAiTlNPYmplY3QiOworICB9Cit9CisKK09iakNQcmVjaXNlTGlmZXRpbWVBdHRyICpPYmpDUHJlY2lzZUxpZmV0aW1lQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBPYmpDUHJlY2lzZUxpZmV0aW1lQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE9iakNQcmVjaXNlTGlmZXRpbWVBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChvYmpjX3ByZWNpc2VfbGlmZXRpbWUpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6b2JqY19wcmVjaXNlX2xpZmV0aW1lXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Om9iamNfcHJlY2lzZV9saWZldGltZV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpPYmpDUHJlY2lzZUxpZmV0aW1lQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJvYmpjX3ByZWNpc2VfbGlmZXRpbWUiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJvYmpjX3ByZWNpc2VfbGlmZXRpbWUiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJvYmpjX3ByZWNpc2VfbGlmZXRpbWUiOworICB9Cit9CisKK09iakNSZXF1aXJlc1Byb3BlcnR5RGVmc0F0dHIgKk9iakNSZXF1aXJlc1Byb3BlcnR5RGVmc0F0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgT2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE9iakNSZXF1aXJlc1Byb3BlcnR5RGVmc0F0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG9iamNfcmVxdWlyZXNfcHJvcGVydHlfZGVmaW5pdGlvbnMpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6b2JqY19yZXF1aXJlc19wcm9wZXJ0eV9kZWZpbml0aW9uc11dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvYmpjX3JlcXVpcmVzX3Byb3BlcnR5X2RlZmluaXRpb25zXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk9iakNSZXF1aXJlc1Byb3BlcnR5RGVmc0F0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAib2JqY19yZXF1aXJlc19wcm9wZXJ0eV9kZWZpbml0aW9ucyI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm9iamNfcmVxdWlyZXNfcHJvcGVydHlfZGVmaW5pdGlvbnMiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJvYmpjX3JlcXVpcmVzX3Byb3BlcnR5X2RlZmluaXRpb25zIjsKKyAgfQorfQorCitPYmpDUmVxdWlyZXNTdXBlckF0dHIgKk9iakNSZXF1aXJlc1N1cGVyQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBPYmpDUmVxdWlyZXNTdXBlckF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBPYmpDUmVxdWlyZXNTdXBlckF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG9iamNfcmVxdWlyZXNfc3VwZXIpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6b2JqY19yZXF1aXJlc19zdXBlcl1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvYmpjX3JlcXVpcmVzX3N1cGVyXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk9iakNSZXF1aXJlc1N1cGVyQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJvYmpjX3JlcXVpcmVzX3N1cGVyIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAib2JqY19yZXF1aXJlc19zdXBlciI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm9iamNfcmVxdWlyZXNfc3VwZXIiOworICB9Cit9CisKK09iakNSZXR1cm5zSW5uZXJQb2ludGVyQXR0ciAqT2JqQ1JldHVybnNJbm5lclBvaW50ZXJBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE9iakNSZXR1cm5zSW5uZXJQb2ludGVyQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE9iakNSZXR1cm5zSW5uZXJQb2ludGVyQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygob2JqY19yZXR1cm5zX2lubmVyX3BvaW50ZXIpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6b2JqY19yZXR1cm5zX2lubmVyX3BvaW50ZXJdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6b2JqY19yZXR1cm5zX2lubmVyX3BvaW50ZXJdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqT2JqQ1JldHVybnNJbm5lclBvaW50ZXJBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm9iamNfcmV0dXJuc19pbm5lcl9wb2ludGVyIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAib2JqY19yZXR1cm5zX2lubmVyX3BvaW50ZXIiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJvYmpjX3JldHVybnNfaW5uZXJfcG9pbnRlciI7CisgIH0KK30KKworT2JqQ1Jvb3RDbGFzc0F0dHIgKk9iakNSb290Q2xhc3NBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE9iakNSb290Q2xhc3NBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgT2JqQ1Jvb3RDbGFzc0F0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG9iamNfcm9vdF9jbGFzcykpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvYmpjX3Jvb3RfY2xhc3NdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6b2JqY19yb290X2NsYXNzXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk9iakNSb290Q2xhc3NBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm9iamNfcm9vdF9jbGFzcyI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm9iamNfcm9vdF9jbGFzcyI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm9iamNfcm9vdF9jbGFzcyI7CisgIH0KK30KKworT2JqQ1J1bnRpbWVOYW1lQXR0ciAqT2JqQ1J1bnRpbWVOYW1lQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBPYmpDUnVudGltZU5hbWVBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldE1ldGFkYXRhTmFtZSgpLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE9iakNSdW50aW1lTmFtZUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG9iamNfcnVudGltZV9uYW1lKFwiIiA8PCBnZXRNZXRhZGF0YU5hbWUoKSA8PCAiXCIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Om9iamNfcnVudGltZV9uYW1lKFwiIiA8PCBnZXRNZXRhZGF0YU5hbWUoKSA8PCAiXCIpXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Om9iamNfcnVudGltZV9uYW1lKFwiIiA8PCBnZXRNZXRhZGF0YU5hbWUoKSA8PCAiXCIpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk9iakNSdW50aW1lTmFtZUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAib2JqY19ydW50aW1lX25hbWUiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJvYmpjX3J1bnRpbWVfbmFtZSI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm9iamNfcnVudGltZV9uYW1lIjsKKyAgfQorfQorCitPYmpDUnVudGltZVZpc2libGVBdHRyICpPYmpDUnVudGltZVZpc2libGVBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE9iakNSdW50aW1lVmlzaWJsZUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBPYmpDUnVudGltZVZpc2libGVBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChvYmpjX3J1bnRpbWVfdmlzaWJsZSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvYmpjX3J1bnRpbWVfdmlzaWJsZV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvYmpjX3J1bnRpbWVfdmlzaWJsZV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpPYmpDUnVudGltZVZpc2libGVBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm9iamNfcnVudGltZV92aXNpYmxlIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAib2JqY19ydW50aW1lX3Zpc2libGUiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJvYmpjX3J1bnRpbWVfdmlzaWJsZSI7CisgIH0KK30KKworT2JqQ1N1YmNsYXNzaW5nUmVzdHJpY3RlZEF0dHIgKk9iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWRBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE9iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWRBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgT2JqQ1N1YmNsYXNzaW5nUmVzdHJpY3RlZEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG9iamNfc3ViY2xhc3NpbmdfcmVzdHJpY3RlZCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvYmpjX3N1YmNsYXNzaW5nX3Jlc3RyaWN0ZWRdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6b2JqY19zdWJjbGFzc2luZ19yZXN0cmljdGVkXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk9iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm9iamNfc3ViY2xhc3NpbmdfcmVzdHJpY3RlZCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm9iamNfc3ViY2xhc3NpbmdfcmVzdHJpY3RlZCI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm9iamNfc3ViY2xhc3NpbmdfcmVzdHJpY3RlZCI7CisgIH0KK30KKworT3BlbkNMQWNjZXNzQXR0ciAqT3BlbkNMQWNjZXNzQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBPcGVuQ0xBY2Nlc3NBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgT3BlbkNMQWNjZXNzQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19yZWFkX29ubHkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIHJlYWRfb25seSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgX193cml0ZV9vbmx5IjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDMgOiB7CisgICAgT1MgPDwgIiB3cml0ZV9vbmx5IjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDQgOiB7CisgICAgT1MgPDwgIiBfX3JlYWRfd3JpdGUiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgNSA6IHsKKyAgICBPUyA8PCAiIHJlYWRfd3JpdGUiOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk9wZW5DTEFjY2Vzc0F0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAiX19yZWFkX29ubHkiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJyZWFkX29ubHkiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJfX3dyaXRlX29ubHkiOworICBjYXNlIDM6CisgICAgcmV0dXJuICJ3cml0ZV9vbmx5IjsKKyAgY2FzZSA0OgorICAgIHJldHVybiAiX19yZWFkX3dyaXRlIjsKKyAgY2FzZSA1OgorICAgIHJldHVybiAicmVhZF93cml0ZSI7CisgIH0KK30KKworT3BlbkNMSW50ZWxSZXFkU3ViR3JvdXBTaXplQXR0ciAqT3BlbkNMSW50ZWxSZXFkU3ViR3JvdXBTaXplQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBPcGVuQ0xJbnRlbFJlcWRTdWJHcm91cFNpemVBdHRyKGdldExvY2F0aW9uKCksIEMsIHN1Ykdyb3VwU2l6ZSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBPcGVuQ0xJbnRlbFJlcWRTdWJHcm91cFNpemVBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChpbnRlbF9yZXFkX3N1Yl9ncm91cF9zaXplKCIgPDwgZ2V0U3ViR3JvdXBTaXplKCkgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqT3BlbkNMSW50ZWxSZXFkU3ViR3JvdXBTaXplQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJpbnRlbF9yZXFkX3N1Yl9ncm91cF9zaXplIjsKKyAgfQorfQorCitPcGVuQ0xLZXJuZWxBdHRyICpPcGVuQ0xLZXJuZWxBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIE9wZW5DTEtlcm5lbEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBPcGVuQ0xLZXJuZWxBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2tlcm5lbCI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIga2VybmVsIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpPcGVuQ0xLZXJuZWxBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIl9fa2VybmVsIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAia2VybmVsIjsKKyAgfQorfQorCitPcGVuQ0xVbnJvbGxIaW50QXR0ciAqT3BlbkNMVW5yb2xsSGludEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgT3BlbkNMVW5yb2xsSGludEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgdW5yb2xsSGludCwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBPcGVuQ0xVbnJvbGxIaW50QXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygob3BlbmNsX3Vucm9sbF9oaW50KCIgPDwgZ2V0VW5yb2xsSGludCgpIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk9wZW5DTFVucm9sbEhpbnRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm9wZW5jbF91bnJvbGxfaGludCI7CisgIH0KK30KKworT3B0aW1pemVOb25lQXR0ciAqT3B0aW1pemVOb25lQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBPcHRpbWl6ZU5vbmVBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgT3B0aW1pemVOb25lQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygob3B0bm9uZSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvcHRub25lXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Om9wdG5vbmVdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqT3B0aW1pemVOb25lQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJvcHRub25lIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAib3B0bm9uZSI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm9wdG5vbmUiOworICB9Cit9CisKK092ZXJsb2FkYWJsZUF0dHIgKk92ZXJsb2FkYWJsZUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgT3ZlcmxvYWRhYmxlQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIE92ZXJsb2FkYWJsZUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvdmVybG9hZGFibGVdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6b3ZlcmxvYWRhYmxlXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKk92ZXJsb2FkYWJsZUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAib3ZlcmxvYWRhYmxlIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAib3ZlcmxvYWRhYmxlIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAib3ZlcmxvYWRhYmxlIjsKKyAgfQorfQorCitPdmVycmlkZUF0dHIgKk92ZXJyaWRlQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBPdmVycmlkZUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBPdmVycmlkZUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIG92ZXJyaWRlIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpPdmVycmlkZUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAib3ZlcnJpZGUiOworICB9Cit9CisKK093bmVyc2hpcEF0dHIgKk93bmVyc2hpcEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgT3duZXJzaGlwQXR0cihnZXRMb2NhdGlvbigpLCBDLCBtb2R1bGUsIGFyZ3NfLCBhcmdzX1NpemUsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgT3duZXJzaGlwQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygob3duZXJzaGlwX2hvbGRzKCIgPDwgKGdldE1vZHVsZSgpID8gZ2V0TW9kdWxlKCktPmdldE5hbWUoKSA6ICIiKSA8PCAiLCAiOworICBib29sIGlzRmlyc3QgPSB0cnVlOworICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IGFyZ3MoKSkgeworICAgIGlmIChpc0ZpcnN0KSBpc0ZpcnN0ID0gZmFsc2U7CisgICAgZWxzZSBPUyA8PCAiLCAiOworICAgIE9TIDw8IFZhbC5nZXRTb3VyY2VJbmRleCgpOworICB9CisgIE9TIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Om93bmVyc2hpcF9ob2xkcygiIDw8IChnZXRNb2R1bGUoKSA/IGdldE1vZHVsZSgpLT5nZXROYW1lKCkgOiAiIikgPDwgIiwgIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBhcmdzKCkpIHsKKyAgICBpZiAoaXNGaXJzdCkgaXNGaXJzdCA9IGZhbHNlOworICAgIGVsc2UgT1MgPDwgIiwgIjsKKyAgICBPUyA8PCBWYWwuZ2V0U291cmNlSW5kZXgoKTsKKyAgfQorICBPUyA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvd25lcnNoaXBfaG9sZHMoIiA8PCAoZ2V0TW9kdWxlKCkgPyBnZXRNb2R1bGUoKS0+Z2V0TmFtZSgpIDogIiIpIDw8ICIsICI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsLmdldFNvdXJjZUluZGV4KCk7CisgIH0KKyAgT1MgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAzIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygob3duZXJzaGlwX3JldHVybnMoIiA8PCAoZ2V0TW9kdWxlKCkgPyBnZXRNb2R1bGUoKS0+Z2V0TmFtZSgpIDogIiIpIDw8ICIsICI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsLmdldFNvdXJjZUluZGV4KCk7CisgIH0KKyAgT1MgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSA0IDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6b3duZXJzaGlwX3JldHVybnMoIiA8PCAoZ2V0TW9kdWxlKCkgPyBnZXRNb2R1bGUoKS0+Z2V0TmFtZSgpIDogIiIpIDw8ICIsICI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsLmdldFNvdXJjZUluZGV4KCk7CisgIH0KKyAgT1MgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSA1IDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6b3duZXJzaGlwX3JldHVybnMoIiA8PCAoZ2V0TW9kdWxlKCkgPyBnZXRNb2R1bGUoKS0+Z2V0TmFtZSgpIDogIiIpIDw8ICIsICI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsLmdldFNvdXJjZUluZGV4KCk7CisgIH0KKyAgT1MgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSA2IDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygob3duZXJzaGlwX3Rha2VzKCIgPDwgKGdldE1vZHVsZSgpID8gZ2V0TW9kdWxlKCktPmdldE5hbWUoKSA6ICIiKSA8PCAiLCAiOworICBib29sIGlzRmlyc3QgPSB0cnVlOworICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IGFyZ3MoKSkgeworICAgIGlmIChpc0ZpcnN0KSBpc0ZpcnN0ID0gZmFsc2U7CisgICAgZWxzZSBPUyA8PCAiLCAiOworICAgIE9TIDw8IFZhbC5nZXRTb3VyY2VJbmRleCgpOworICB9CisgIE9TIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgNyA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6Om93bmVyc2hpcF90YWtlcygiIDw8IChnZXRNb2R1bGUoKSA/IGdldE1vZHVsZSgpLT5nZXROYW1lKCkgOiAiIikgPDwgIiwgIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBhcmdzKCkpIHsKKyAgICBpZiAoaXNGaXJzdCkgaXNGaXJzdCA9IGZhbHNlOworICAgIGVsc2UgT1MgPDwgIiwgIjsKKyAgICBPUyA8PCBWYWwuZ2V0U291cmNlSW5kZXgoKTsKKyAgfQorICBPUyA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDggOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpvd25lcnNoaXBfdGFrZXMoIiA8PCAoZ2V0TW9kdWxlKCkgPyBnZXRNb2R1bGUoKS0+Z2V0TmFtZSgpIDogIiIpIDw8ICIsICI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsLmdldFNvdXJjZUluZGV4KCk7CisgIH0KKyAgT1MgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqT3duZXJzaGlwQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJvd25lcnNoaXBfaG9sZHMiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJvd25lcnNoaXBfaG9sZHMiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJvd25lcnNoaXBfaG9sZHMiOworICBjYXNlIDM6CisgICAgcmV0dXJuICJvd25lcnNoaXBfcmV0dXJucyI7CisgIGNhc2UgNDoKKyAgICByZXR1cm4gIm93bmVyc2hpcF9yZXR1cm5zIjsKKyAgY2FzZSA1OgorICAgIHJldHVybiAib3duZXJzaGlwX3JldHVybnMiOworICBjYXNlIDY6CisgICAgcmV0dXJuICJvd25lcnNoaXBfdGFrZXMiOworICBjYXNlIDc6CisgICAgcmV0dXJuICJvd25lcnNoaXBfdGFrZXMiOworICBjYXNlIDg6CisgICAgcmV0dXJuICJvd25lcnNoaXBfdGFrZXMiOworICB9Cit9CisKK1BhY2tlZEF0dHIgKlBhY2tlZEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgUGFja2VkQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFBhY2tlZEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6cGFja2VkXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlBhY2tlZEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAicGFja2VkIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAicGFja2VkIjsKKyAgfQorfQorCitQYXJhbVR5cGVzdGF0ZUF0dHIgKlBhcmFtVHlwZXN0YXRlQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBQYXJhbVR5cGVzdGF0ZUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgcGFyYW1TdGF0ZSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBQYXJhbVR5cGVzdGF0ZUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHBhcmFtX3R5cGVzdGF0ZShcIiIgPDwgUGFyYW1UeXBlc3RhdGVBdHRyOjpDb252ZXJ0Q29uc3VtZWRTdGF0ZVRvU3RyKGdldFBhcmFtU3RhdGUoKSkgPDwgIlwiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpwYXJhbV90eXBlc3RhdGUoXCIiIDw8IFBhcmFtVHlwZXN0YXRlQXR0cjo6Q29udmVydENvbnN1bWVkU3RhdGVUb1N0cihnZXRQYXJhbVN0YXRlKCkpIDw8ICJcIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqUGFyYW1UeXBlc3RhdGVBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gInBhcmFtX3R5cGVzdGF0ZSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gInBhcmFtX3R5cGVzdGF0ZSI7CisgIH0KK30KKworUGFzY2FsQXR0ciAqUGFzY2FsQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBQYXNjYWxBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgUGFzY2FsQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygocGFzY2FsKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OnBhc2NhbF1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpwYXNjYWxdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAzIDogeworICAgIE9TIDw8ICIgX19wYXNjYWwiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgNCA6IHsKKyAgICBPUyA8PCAiIF9wYXNjYWwiOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlBhc2NhbEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAicGFzY2FsIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAicGFzY2FsIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAicGFzY2FsIjsKKyAgY2FzZSAzOgorICAgIHJldHVybiAiX19wYXNjYWwiOworICBjYXNlIDQ6CisgICAgcmV0dXJuICJfcGFzY2FsIjsKKyAgfQorfQorCitQYXNzT2JqZWN0U2l6ZUF0dHIgKlBhc3NPYmplY3RTaXplQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBQYXNzT2JqZWN0U2l6ZUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgdHlwZSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBQYXNzT2JqZWN0U2l6ZUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHBhc3Nfb2JqZWN0X3NpemUoIiA8PCBnZXRUeXBlKCkgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6cGFzc19vYmplY3Rfc2l6ZSgiIDw8IGdldFR5cGUoKSA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpwYXNzX29iamVjdF9zaXplKCIgPDwgZ2V0VHlwZSgpIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlBhc3NPYmplY3RTaXplQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJwYXNzX29iamVjdF9zaXplIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAicGFzc19vYmplY3Rfc2l6ZSI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gInBhc3Nfb2JqZWN0X3NpemUiOworICB9Cit9CisKK1Bjc0F0dHIgKlBjc0F0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgUGNzQXR0cihnZXRMb2NhdGlvbigpLCBDLCBwQ1MsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgUGNzQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygocGNzKFwiIiA8PCBQY3NBdHRyOjpDb252ZXJ0UENTVHlwZVRvU3RyKGdldFBDUygpKSA8PCAiXCIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251OjpwY3MoXCIiIDw8IFBjc0F0dHI6OkNvbnZlcnRQQ1NUeXBlVG9TdHIoZ2V0UENTKCkpIDw8ICJcIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqUGNzQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJwY3MiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJwY3MiOworICB9Cit9CisKK1ByYWdtYUNsYW5nQlNTU2VjdGlvbkF0dHIgKlByYWdtYUNsYW5nQlNTU2VjdGlvbkF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgUHJhZ21hQ2xhbmdCU1NTZWN0aW9uQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXROYW1lKCksIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgUHJhZ21hQ2xhbmdCU1NTZWN0aW9uQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7Cit9CisKK2NvbnN0IGNoYXIgKlByYWdtYUNsYW5nQlNTU2VjdGlvbkF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICByZXR1cm4gIihObyBzcGVsbGluZykiOworfQorCitQcmFnbWFDbGFuZ0RhdGFTZWN0aW9uQXR0ciAqUHJhZ21hQ2xhbmdEYXRhU2VjdGlvbkF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgUHJhZ21hQ2xhbmdEYXRhU2VjdGlvbkF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0TmFtZSgpLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFByYWdtYUNsYW5nRGF0YVNlY3Rpb25BdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKK30KKworY29uc3QgY2hhciAqUHJhZ21hQ2xhbmdEYXRhU2VjdGlvbkF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICByZXR1cm4gIihObyBzcGVsbGluZykiOworfQorCitQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb25BdHRyICpQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb25BdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFByYWdtYUNsYW5nUm9kYXRhU2VjdGlvbkF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0TmFtZSgpLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFByYWdtYUNsYW5nUm9kYXRhU2VjdGlvbkF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworfQorCitjb25zdCBjaGFyICpQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb25BdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKK30KKworUHJhZ21hQ2xhbmdUZXh0U2VjdGlvbkF0dHIgKlByYWdtYUNsYW5nVGV4dFNlY3Rpb25BdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFByYWdtYUNsYW5nVGV4dFNlY3Rpb25BdHRyKGdldExvY2F0aW9uKCksIEMsIGdldE5hbWUoKSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBQcmFnbWFDbGFuZ1RleHRTZWN0aW9uQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7Cit9CisKK2NvbnN0IGNoYXIgKlByYWdtYUNsYW5nVGV4dFNlY3Rpb25BdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKK30KKworUHJlc2VydmVBbGxBdHRyICpQcmVzZXJ2ZUFsbEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgUHJlc2VydmVBbGxBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgUHJlc2VydmVBbGxBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChwcmVzZXJ2ZV9hbGwpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6cHJlc2VydmVfYWxsXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OnByZXNlcnZlX2FsbF1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpQcmVzZXJ2ZUFsbEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAicHJlc2VydmVfYWxsIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAicHJlc2VydmVfYWxsIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAicHJlc2VydmVfYWxsIjsKKyAgfQorfQorCitQcmVzZXJ2ZU1vc3RBdHRyICpQcmVzZXJ2ZU1vc3RBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFByZXNlcnZlTW9zdEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBQcmVzZXJ2ZU1vc3RBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChwcmVzZXJ2ZV9tb3N0KSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OnByZXNlcnZlX21vc3RdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6cHJlc2VydmVfbW9zdF1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpQcmVzZXJ2ZU1vc3RBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gInByZXNlcnZlX21vc3QiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJwcmVzZXJ2ZV9tb3N0IjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAicHJlc2VydmVfbW9zdCI7CisgIH0KK30KKworUHRHdWFyZGVkQnlBdHRyICpQdEd1YXJkZWRCeUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgUHRHdWFyZGVkQnlBdHRyKGdldExvY2F0aW9uKCksIEMsIGFyZywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBQdEd1YXJkZWRCeUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHB0X2d1YXJkZWRfYnkoIiA8PCBnZXRBcmcoKSA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpQdEd1YXJkZWRCeUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAicHRfZ3VhcmRlZF9ieSI7CisgIH0KK30KKworUHRHdWFyZGVkVmFyQXR0ciAqUHRHdWFyZGVkVmFyQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBQdEd1YXJkZWRWYXJBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgUHRHdWFyZGVkVmFyQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygocHRfZ3VhcmRlZF92YXIpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6cHRfZ3VhcmRlZF92YXJdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqUHRHdWFyZGVkVmFyQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJwdF9ndWFyZGVkX3ZhciI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gInB0X2d1YXJkZWRfdmFyIjsKKyAgfQorfQorCitQdXJlQXR0ciAqUHVyZUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgUHVyZUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBQdXJlQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygocHVyZSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6cHVyZV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpQdXJlQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJwdXJlIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAicHVyZSI7CisgIH0KK30KKworUmVnQ2FsbEF0dHIgKlJlZ0NhbGxBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFJlZ0NhbGxBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgUmVnQ2FsbEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHJlZ2NhbGwpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6OnJlZ2NhbGxdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgX19yZWdjYWxsIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpSZWdDYWxsQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJyZWdjYWxsIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAicmVnY2FsbCI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIl9fcmVnY2FsbCI7CisgIH0KK30KKworUmVsZWFzZUNhcGFiaWxpdHlBdHRyICpSZWxlYXNlQ2FwYWJpbGl0eUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgUmVsZWFzZUNhcGFiaWxpdHlBdHRyKGdldExvY2F0aW9uKCksIEMsIGFyZ3NfLCBhcmdzX1NpemUsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgUmVsZWFzZUNhcGFiaWxpdHlBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChyZWxlYXNlX2NhcGFiaWxpdHkoIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBhcmdzKCkpIHsKKyAgICBpZiAoaXNGaXJzdCkgaXNGaXJzdCA9IGZhbHNlOworICAgIGVsc2UgT1MgPDwgIiwgIjsKKyAgICBPUyA8PCBWYWw7CisgIH0KKyAgT1MgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6cmVsZWFzZV9jYXBhYmlsaXR5KCI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsOworICB9CisgIE9TIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHJlbGVhc2Vfc2hhcmVkX2NhcGFiaWxpdHkoIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBhcmdzKCkpIHsKKyAgICBpZiAoaXNGaXJzdCkgaXNGaXJzdCA9IGZhbHNlOworICAgIGVsc2UgT1MgPDwgIiwgIjsKKyAgICBPUyA8PCBWYWw7CisgIH0KKyAgT1MgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAzIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6cmVsZWFzZV9zaGFyZWRfY2FwYWJpbGl0eSgiOworICBib29sIGlzRmlyc3QgPSB0cnVlOworICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IGFyZ3MoKSkgeworICAgIGlmIChpc0ZpcnN0KSBpc0ZpcnN0ID0gZmFsc2U7CisgICAgZWxzZSBPUyA8PCAiLCAiOworICAgIE9TIDw8IFZhbDsKKyAgfQorICBPUyA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDQgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChyZWxlYXNlX2dlbmVyaWNfY2FwYWJpbGl0eSgiOworICBib29sIGlzRmlyc3QgPSB0cnVlOworICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IGFyZ3MoKSkgeworICAgIGlmIChpc0ZpcnN0KSBpc0ZpcnN0ID0gZmFsc2U7CisgICAgZWxzZSBPUyA8PCAiLCAiOworICAgIE9TIDw8IFZhbDsKKyAgfQorICBPUyA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDUgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpyZWxlYXNlX2dlbmVyaWNfY2FwYWJpbGl0eSgiOworICBib29sIGlzRmlyc3QgPSB0cnVlOworICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IGFyZ3MoKSkgeworICAgIGlmIChpc0ZpcnN0KSBpc0ZpcnN0ID0gZmFsc2U7CisgICAgZWxzZSBPUyA8PCAiLCAiOworICAgIE9TIDw8IFZhbDsKKyAgfQorICBPUyA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDYgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKCh1bmxvY2tfZnVuY3Rpb24oIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBhcmdzKCkpIHsKKyAgICBpZiAoaXNGaXJzdCkgaXNGaXJzdCA9IGZhbHNlOworICAgIGVsc2UgT1MgPDwgIiwgIjsKKyAgICBPUyA8PCBWYWw7CisgIH0KKyAgT1MgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSA3IDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6dW5sb2NrX2Z1bmN0aW9uKCI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsOworICB9CisgIE9TIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlJlbGVhc2VDYXBhYmlsaXR5QXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJyZWxlYXNlX2NhcGFiaWxpdHkiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJyZWxlYXNlX2NhcGFiaWxpdHkiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5IjsKKyAgY2FzZSAzOgorICAgIHJldHVybiAicmVsZWFzZV9zaGFyZWRfY2FwYWJpbGl0eSI7CisgIGNhc2UgNDoKKyAgICByZXR1cm4gInJlbGVhc2VfZ2VuZXJpY19jYXBhYmlsaXR5IjsKKyAgY2FzZSA1OgorICAgIHJldHVybiAicmVsZWFzZV9nZW5lcmljX2NhcGFiaWxpdHkiOworICBjYXNlIDY6CisgICAgcmV0dXJuICJ1bmxvY2tfZnVuY3Rpb24iOworICBjYXNlIDc6CisgICAgcmV0dXJuICJ1bmxvY2tfZnVuY3Rpb24iOworICB9Cit9CisKK1JlbmRlclNjcmlwdEtlcm5lbEF0dHIgKlJlbmRlclNjcmlwdEtlcm5lbEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgUmVuZGVyU2NyaXB0S2VybmVsQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFJlbmRlclNjcmlwdEtlcm5lbEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKGtlcm5lbCkpIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpSZW5kZXJTY3JpcHRLZXJuZWxBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gImtlcm5lbCI7CisgIH0KK30KKworUmVxZFdvcmtHcm91cFNpemVBdHRyICpSZXFkV29ya0dyb3VwU2l6ZUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgUmVxZFdvcmtHcm91cFNpemVBdHRyKGdldExvY2F0aW9uKCksIEMsIHhEaW0sIHlEaW0sIHpEaW0sIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgUmVxZFdvcmtHcm91cFNpemVBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChyZXFkX3dvcmtfZ3JvdXBfc2l6ZSgiIDw8IGdldFhEaW0oKSA8PCAiLCAiIDw8IGdldFlEaW0oKSA8PCAiLCAiIDw8IGdldFpEaW0oKSA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpSZXFkV29ya0dyb3VwU2l6ZUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAicmVxZF93b3JrX2dyb3VwX3NpemUiOworICB9Cit9CisKK1JlcXVpcmVDb25zdGFudEluaXRBdHRyICpSZXF1aXJlQ29uc3RhbnRJbml0QXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBSZXF1aXJlQ29uc3RhbnRJbml0QXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFJlcXVpcmVDb25zdGFudEluaXRBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChyZXF1aXJlX2NvbnN0YW50X2luaXRpYWxpemF0aW9uKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OnJlcXVpcmVfY29uc3RhbnRfaW5pdGlhbGl6YXRpb25dXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqUmVxdWlyZUNvbnN0YW50SW5pdEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAicmVxdWlyZV9jb25zdGFudF9pbml0aWFsaXphdGlvbiI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gInJlcXVpcmVfY29uc3RhbnRfaW5pdGlhbGl6YXRpb24iOworICB9Cit9CisKK1JlcXVpcmVzQ2FwYWJpbGl0eUF0dHIgKlJlcXVpcmVzQ2FwYWJpbGl0eUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgUmVxdWlyZXNDYXBhYmlsaXR5QXR0cihnZXRMb2NhdGlvbigpLCBDLCBhcmdzXywgYXJnc19TaXplLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFJlcXVpcmVzQ2FwYWJpbGl0eUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHJlcXVpcmVzX2NhcGFiaWxpdHkoIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBhcmdzKCkpIHsKKyAgICBpZiAoaXNGaXJzdCkgaXNGaXJzdCA9IGZhbHNlOworICAgIGVsc2UgT1MgPDwgIiwgIjsKKyAgICBPUyA8PCBWYWw7CisgIH0KKyAgT1MgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6cmVxdWlyZXNfY2FwYWJpbGl0eSgiOworICBib29sIGlzRmlyc3QgPSB0cnVlOworICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IGFyZ3MoKSkgeworICAgIGlmIChpc0ZpcnN0KSBpc0ZpcnN0ID0gZmFsc2U7CisgICAgZWxzZSBPUyA8PCAiLCAiOworICAgIE9TIDw8IFZhbDsKKyAgfQorICBPUyA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChleGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQoIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBhcmdzKCkpIHsKKyAgICBpZiAoaXNGaXJzdCkgaXNGaXJzdCA9IGZhbHNlOworICAgIGVsc2UgT1MgPDwgIiwgIjsKKyAgICBPUyA8PCBWYWw7CisgIH0KKyAgT1MgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAzIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6ZXhjbHVzaXZlX2xvY2tzX3JlcXVpcmVkKCI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsOworICB9CisgIE9TIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgNCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHJlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5KCI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsOworICB9CisgIE9TIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgNSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OnJlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5KCI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsOworICB9CisgIE9TIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgNiA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHNoYXJlZF9sb2Nrc19yZXF1aXJlZCgiOworICBib29sIGlzRmlyc3QgPSB0cnVlOworICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IGFyZ3MoKSkgeworICAgIGlmIChpc0ZpcnN0KSBpc0ZpcnN0ID0gZmFsc2U7CisgICAgZWxzZSBPUyA8PCAiLCAiOworICAgIE9TIDw8IFZhbDsKKyAgfQorICBPUyA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDcgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpzaGFyZWRfbG9ja3NfcmVxdWlyZWQoIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBhcmdzKCkpIHsKKyAgICBpZiAoaXNGaXJzdCkgaXNGaXJzdCA9IGZhbHNlOworICAgIGVsc2UgT1MgPDwgIiwgIjsKKyAgICBPUyA8PCBWYWw7CisgIH0KKyAgT1MgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqUmVxdWlyZXNDYXBhYmlsaXR5QXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJyZXF1aXJlc19jYXBhYmlsaXR5IjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAicmVxdWlyZXNfY2FwYWJpbGl0eSI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gImV4Y2x1c2l2ZV9sb2Nrc19yZXF1aXJlZCI7CisgIGNhc2UgMzoKKyAgICByZXR1cm4gImV4Y2x1c2l2ZV9sb2Nrc19yZXF1aXJlZCI7CisgIGNhc2UgNDoKKyAgICByZXR1cm4gInJlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5IjsKKyAgY2FzZSA1OgorICAgIHJldHVybiAicmVxdWlyZXNfc2hhcmVkX2NhcGFiaWxpdHkiOworICBjYXNlIDY6CisgICAgcmV0dXJuICJzaGFyZWRfbG9ja3NfcmVxdWlyZWQiOworICBjYXNlIDc6CisgICAgcmV0dXJuICJzaGFyZWRfbG9ja3NfcmVxdWlyZWQiOworICB9Cit9CisKK1Jlc3RyaWN0QXR0ciAqUmVzdHJpY3RBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFJlc3RyaWN0QXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFJlc3RyaWN0QXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19kZWNsc3BlYyhyZXN0cmljdCkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKG1hbGxvYykpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6bWFsbG9jXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlJlc3RyaWN0QXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJyZXN0cmljdCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm1hbGxvYyI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIm1hbGxvYyI7CisgIH0KK30KKworUmV0dXJuVHlwZXN0YXRlQXR0ciAqUmV0dXJuVHlwZXN0YXRlQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBSZXR1cm5UeXBlc3RhdGVBdHRyKGdldExvY2F0aW9uKCksIEMsIHN0YXRlLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFJldHVyblR5cGVzdGF0ZUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHJldHVybl90eXBlc3RhdGUoXCIiIDw8IFJldHVyblR5cGVzdGF0ZUF0dHI6OkNvbnZlcnRDb25zdW1lZFN0YXRlVG9TdHIoZ2V0U3RhdGUoKSkgPDwgIlwiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpyZXR1cm5fdHlwZXN0YXRlKFwiIiA8PCBSZXR1cm5UeXBlc3RhdGVBdHRyOjpDb252ZXJ0Q29uc3VtZWRTdGF0ZVRvU3RyKGdldFN0YXRlKCkpIDw8ICJcIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqUmV0dXJuVHlwZXN0YXRlQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJyZXR1cm5fdHlwZXN0YXRlIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAicmV0dXJuX3R5cGVzdGF0ZSI7CisgIH0KK30KKworUmV0dXJuc05vbk51bGxBdHRyICpSZXR1cm5zTm9uTnVsbEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgUmV0dXJuc05vbk51bGxBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgUmV0dXJuc05vbk51bGxBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChyZXR1cm5zX25vbm51bGwpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6OnJldHVybnNfbm9ubnVsbF1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpSZXR1cm5zTm9uTnVsbEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAicmV0dXJuc19ub25udWxsIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAicmV0dXJuc19ub25udWxsIjsKKyAgfQorfQorCitSZXR1cm5zVHdpY2VBdHRyICpSZXR1cm5zVHdpY2VBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFJldHVybnNUd2ljZUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBSZXR1cm5zVHdpY2VBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChyZXR1cm5zX3R3aWNlKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251OjpyZXR1cm5zX3R3aWNlXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlJldHVybnNUd2ljZUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAicmV0dXJuc190d2ljZSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gInJldHVybnNfdHdpY2UiOworICB9Cit9CisKK1Njb3BlZExvY2thYmxlQXR0ciAqU2NvcGVkTG9ja2FibGVBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFNjb3BlZExvY2thYmxlQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFNjb3BlZExvY2thYmxlQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoc2NvcGVkX2xvY2thYmxlKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OnNjb3BlZF9sb2NrYWJsZV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpTY29wZWRMb2NrYWJsZUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAic2NvcGVkX2xvY2thYmxlIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAic2NvcGVkX2xvY2thYmxlIjsKKyAgfQorfQorCitTZWN0aW9uQXR0ciAqU2VjdGlvbkF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgU2VjdGlvbkF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0TmFtZSgpLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFNlY3Rpb25BdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKFwiIiA8PCBnZXROYW1lKCkgPDwgIlwiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6c2VjdGlvbihcIiIgPDwgZ2V0TmFtZSgpIDw8ICJcIildXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgX19kZWNsc3BlYyhhbGxvY2F0ZShcIiIgPDwgZ2V0TmFtZSgpIDw8ICJcIikpIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpTZWN0aW9uQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJzZWN0aW9uIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAic2VjdGlvbiI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gImFsbG9jYXRlIjsKKyAgfQorfQorCitTZWxlY3RBbnlBdHRyICpTZWxlY3RBbnlBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFNlbGVjdEFueUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBTZWxlY3RBbnlBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2RlY2xzcGVjKHNlbGVjdGFueSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHNlbGVjdGFueSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6c2VsZWN0YW55XV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlNlbGVjdEFueUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAic2VsZWN0YW55IjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAic2VsZWN0YW55IjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAic2VsZWN0YW55IjsKKyAgfQorfQorCitTZW50aW5lbEF0dHIgKlNlbnRpbmVsQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBTZW50aW5lbEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgc2VudGluZWwsIG51bGxQb3MsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgU2VudGluZWxBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChzZW50aW5lbCgiIDw8IGdldFNlbnRpbmVsKCkgPDwgIiwgIiA8PCBnZXROdWxsUG9zKCkgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6OnNlbnRpbmVsKCIgPDwgZ2V0U2VudGluZWwoKSA8PCAiLCAiIDw8IGdldE51bGxQb3MoKSA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpTZW50aW5lbEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAic2VudGluZWwiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJzZW50aW5lbCI7CisgIH0KK30KKworU2V0VHlwZXN0YXRlQXR0ciAqU2V0VHlwZXN0YXRlQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBTZXRUeXBlc3RhdGVBdHRyKGdldExvY2F0aW9uKCksIEMsIG5ld1N0YXRlLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFNldFR5cGVzdGF0ZUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHNldF90eXBlc3RhdGUoXCIiIDw8IFNldFR5cGVzdGF0ZUF0dHI6OkNvbnZlcnRDb25zdW1lZFN0YXRlVG9TdHIoZ2V0TmV3U3RhdGUoKSkgPDwgIlwiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpzZXRfdHlwZXN0YXRlKFwiIiA8PCBTZXRUeXBlc3RhdGVBdHRyOjpDb252ZXJ0Q29uc3VtZWRTdGF0ZVRvU3RyKGdldE5ld1N0YXRlKCkpIDw8ICJcIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqU2V0VHlwZXN0YXRlQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJzZXRfdHlwZXN0YXRlIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAic2V0X3R5cGVzdGF0ZSI7CisgIH0KK30KKworU2hhcmVkVHJ5bG9ja0Z1bmN0aW9uQXR0ciAqU2hhcmVkVHJ5bG9ja0Z1bmN0aW9uQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBTaGFyZWRUcnlsb2NrRnVuY3Rpb25BdHRyKGdldExvY2F0aW9uKCksIEMsIHN1Y2Nlc3NWYWx1ZSwgYXJnc18sIGFyZ3NfU2l6ZSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBTaGFyZWRUcnlsb2NrRnVuY3Rpb25BdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChzaGFyZWRfdHJ5bG9ja19mdW5jdGlvbigiIDw8IGdldFN1Y2Nlc3NWYWx1ZSgpIDw8ICIsICI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsOworICB9CisgIE9TIDw8ICIpKSkiOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlNoYXJlZFRyeWxvY2tGdW5jdGlvbkF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAic2hhcmVkX3RyeWxvY2tfZnVuY3Rpb24iOworICB9Cit9CisKK1N0ZENhbGxBdHRyICpTdGRDYWxsQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBTdGRDYWxsQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFN0ZENhbGxBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChzdGRjYWxsKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251OjpzdGRjYWxsXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIF9fc3RkY2FsbCI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAzIDogeworICAgIE9TIDw8ICIgX3N0ZGNhbGwiOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlN0ZENhbGxBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gInN0ZGNhbGwiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJzdGRjYWxsIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAiX19zdGRjYWxsIjsKKyAgY2FzZSAzOgorICAgIHJldHVybiAiX3N0ZGNhbGwiOworICB9Cit9CisKK1N1cHByZXNzQXR0ciAqU3VwcHJlc3NBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFN1cHByZXNzQXR0cihnZXRMb2NhdGlvbigpLCBDLCBkaWFnbm9zdGljSWRlbnRpZmllcnNfLCBkaWFnbm9zdGljSWRlbnRpZmllcnNfU2l6ZSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBTdXBwcmVzc0F0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIFtbZ3NsOjpzdXBwcmVzcygiOworICBib29sIGlzRmlyc3QgPSB0cnVlOworICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IGRpYWdub3N0aWNJZGVudGlmaWVycygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgIlwiIiA8PCBWYWwgPDwgIlwiIjsKKyAgfQorICBPUyA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpTdXBwcmVzc0F0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAic3VwcHJlc3MiOworICB9Cit9CisKK1N3aWZ0Q2FsbEF0dHIgKlN3aWZ0Q2FsbEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgU3dpZnRDYWxsQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFN3aWZ0Q2FsbEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHN3aWZ0Y2FsbCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpzd2lmdGNhbGxdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6c3dpZnRjYWxsXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlN3aWZ0Q2FsbEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAic3dpZnRjYWxsIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAic3dpZnRjYWxsIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAic3dpZnRjYWxsIjsKKyAgfQorfQorCitTd2lmdENvbnRleHRBdHRyICpTd2lmdENvbnRleHRBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFN3aWZ0Q29udGV4dEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBTd2lmdENvbnRleHRBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChzd2lmdF9jb250ZXh0KSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OnN3aWZ0X2NvbnRleHRdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6c3dpZnRfY29udGV4dF1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpTd2lmdENvbnRleHRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gInN3aWZ0X2NvbnRleHQiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJzd2lmdF9jb250ZXh0IjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAic3dpZnRfY29udGV4dCI7CisgIH0KK30KKworU3dpZnRFcnJvclJlc3VsdEF0dHIgKlN3aWZ0RXJyb3JSZXN1bHRBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFN3aWZ0RXJyb3JSZXN1bHRBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgU3dpZnRFcnJvclJlc3VsdEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHN3aWZ0X2Vycm9yX3Jlc3VsdCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpzd2lmdF9lcnJvcl9yZXN1bHRdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6c3dpZnRfZXJyb3JfcmVzdWx0XV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlN3aWZ0RXJyb3JSZXN1bHRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gInN3aWZ0X2Vycm9yX3Jlc3VsdCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gInN3aWZ0X2Vycm9yX3Jlc3VsdCI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gInN3aWZ0X2Vycm9yX3Jlc3VsdCI7CisgIH0KK30KKworU3dpZnRJbmRpcmVjdFJlc3VsdEF0dHIgKlN3aWZ0SW5kaXJlY3RSZXN1bHRBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFN3aWZ0SW5kaXJlY3RSZXN1bHRBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgU3dpZnRJbmRpcmVjdFJlc3VsdEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHN3aWZ0X2luZGlyZWN0X3Jlc3VsdCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjpzd2lmdF9pbmRpcmVjdF9yZXN1bHRdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6c3dpZnRfaW5kaXJlY3RfcmVzdWx0XV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlN3aWZ0SW5kaXJlY3RSZXN1bHRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gInN3aWZ0X2luZGlyZWN0X3Jlc3VsdCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gInN3aWZ0X2luZGlyZWN0X3Jlc3VsdCI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gInN3aWZ0X2luZGlyZWN0X3Jlc3VsdCI7CisgIH0KK30KKworU3lzVkFCSUF0dHIgKlN5c1ZBQklBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFN5c1ZBQklBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgU3lzVkFCSUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHN5c3ZfYWJpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251OjpzeXN2X2FiaV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpTeXNWQUJJQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJzeXN2X2FiaSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gInN5c3ZfYWJpIjsKKyAgfQorfQorCitUTFNNb2RlbEF0dHIgKlRMU01vZGVsQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBUTFNNb2RlbEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0TW9kZWwoKSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBUTFNNb2RlbEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHRsc19tb2RlbChcIiIgPDwgZ2V0TW9kZWwoKSA8PCAiXCIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251Ojp0bHNfbW9kZWwoXCIiIDw8IGdldE1vZGVsKCkgPDwgIlwiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpUTFNNb2RlbEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAidGxzX21vZGVsIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAidGxzX21vZGVsIjsKKyAgfQorfQorCitUYXJnZXRBdHRyICpUYXJnZXRBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFRhcmdldEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0RmVhdHVyZXNTdHIoKSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBUYXJnZXRBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKCh0YXJnZXQoXCIiIDw8IGdldEZlYXR1cmVzU3RyKCkgPDwgIlwiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6dGFyZ2V0KFwiIiA8PCBnZXRGZWF0dXJlc1N0cigpIDw8ICJcIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqVGFyZ2V0QXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJ0YXJnZXQiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJ0YXJnZXQiOworICB9Cit9CisKK1Rlc3RUeXBlc3RhdGVBdHRyICpUZXN0VHlwZXN0YXRlQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBUZXN0VHlwZXN0YXRlQXR0cihnZXRMb2NhdGlvbigpLCBDLCB0ZXN0U3RhdGUsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgVGVzdFR5cGVzdGF0ZUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHRlc3RfdHlwZXN0YXRlKFwiIiA8PCBUZXN0VHlwZXN0YXRlQXR0cjo6Q29udmVydENvbnN1bWVkU3RhdGVUb1N0cihnZXRUZXN0U3RhdGUoKSkgPDwgIlwiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjp0ZXN0X3R5cGVzdGF0ZShcIiIgPDwgVGVzdFR5cGVzdGF0ZUF0dHI6OkNvbnZlcnRDb25zdW1lZFN0YXRlVG9TdHIoZ2V0VGVzdFN0YXRlKCkpIDw8ICJcIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqVGVzdFR5cGVzdGF0ZUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAidGVzdF90eXBlc3RhdGUiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJ0ZXN0X3R5cGVzdGF0ZSI7CisgIH0KK30KKworVGhpc0NhbGxBdHRyICpUaGlzQ2FsbEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgVGhpc0NhbGxBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgVGhpc0NhbGxBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKCh0aGlzY2FsbCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6dGhpc2NhbGxdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgX190aGlzY2FsbCI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAzIDogeworICAgIE9TIDw8ICIgX3RoaXNjYWxsIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpUaGlzQ2FsbEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAidGhpc2NhbGwiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJ0aGlzY2FsbCI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIl9fdGhpc2NhbGwiOworICBjYXNlIDM6CisgICAgcmV0dXJuICJfdGhpc2NhbGwiOworICB9Cit9CisKK1RocmVhZEF0dHIgKlRocmVhZEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgVGhyZWFkQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFRocmVhZEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fZGVjbHNwZWModGhyZWFkKSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqVGhyZWFkQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJ0aHJlYWQiOworICB9Cit9CisKK1RyYW5zcGFyZW50VW5pb25BdHRyICpUcmFuc3BhcmVudFVuaW9uQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBUcmFuc3BhcmVudFVuaW9uQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFRyYW5zcGFyZW50VW5pb25BdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKCh0cmFuc3BhcmVudF91bmlvbikpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6dHJhbnNwYXJlbnRfdW5pb25dXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqVHJhbnNwYXJlbnRVbmlvbkF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAidHJhbnNwYXJlbnRfdW5pb24iOworICBjYXNlIDE6CisgICAgcmV0dXJuICJ0cmFuc3BhcmVudF91bmlvbiI7CisgIH0KK30KKworVHJpdmlhbEFCSUF0dHIgKlRyaXZpYWxBQklBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFRyaXZpYWxBQklBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgVHJpdmlhbEFCSUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHRyaXZpYWxfYWJpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OnRyaXZpYWxfYWJpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlRyaXZpYWxBQklBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gInRyaXZpYWxfYWJpIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAidHJpdmlhbF9hYmkiOworICB9Cit9CisKK1RyeUFjcXVpcmVDYXBhYmlsaXR5QXR0ciAqVHJ5QWNxdWlyZUNhcGFiaWxpdHlBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFRyeUFjcXVpcmVDYXBhYmlsaXR5QXR0cihnZXRMb2NhdGlvbigpLCBDLCBzdWNjZXNzVmFsdWUsIGFyZ3NfLCBhcmdzX1NpemUsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgVHJ5QWNxdWlyZUNhcGFiaWxpdHlBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKCh0cnlfYWNxdWlyZV9jYXBhYmlsaXR5KCIgPDwgZ2V0U3VjY2Vzc1ZhbHVlKCkgPDwgIiwgIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBhcmdzKCkpIHsKKyAgICBpZiAoaXNGaXJzdCkgaXNGaXJzdCA9IGZhbHNlOworICAgIGVsc2UgT1MgPDwgIiwgIjsKKyAgICBPUyA8PCBWYWw7CisgIH0KKyAgT1MgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6dHJ5X2FjcXVpcmVfY2FwYWJpbGl0eSgiIDw8IGdldFN1Y2Nlc3NWYWx1ZSgpIDw8ICIsICI7CisgIGJvb2wgaXNGaXJzdCA9IHRydWU7CisgIGZvciAoY29uc3QgYXV0byAmVmFsIDogYXJncygpKSB7CisgICAgaWYgKGlzRmlyc3QpIGlzRmlyc3QgPSBmYWxzZTsKKyAgICBlbHNlIE9TIDw8ICIsICI7CisgICAgT1MgPDwgVmFsOworICB9CisgIE9TIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHRyeV9hY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5KCIgPDwgZ2V0U3VjY2Vzc1ZhbHVlKCkgPDwgIiwgIjsKKyAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvICZWYWwgOiBhcmdzKCkpIHsKKyAgICBpZiAoaXNGaXJzdCkgaXNGaXJzdCA9IGZhbHNlOworICAgIGVsc2UgT1MgPDwgIiwgIjsKKyAgICBPUyA8PCBWYWw7CisgIH0KKyAgT1MgPDwgIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAzIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6dHJ5X2FjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkoIiA8PCBnZXRTdWNjZXNzVmFsdWUoKSA8PCAiLCAiOworICBib29sIGlzRmlyc3QgPSB0cnVlOworICBmb3IgKGNvbnN0IGF1dG8gJlZhbCA6IGFyZ3MoKSkgeworICAgIGlmIChpc0ZpcnN0KSBpc0ZpcnN0ID0gZmFsc2U7CisgICAgZWxzZSBPUyA8PCAiLCAiOworICAgIE9TIDw8IFZhbDsKKyAgfQorICBPUyA8PCAiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpUcnlBY3F1aXJlQ2FwYWJpbGl0eUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAidHJ5X2FjcXVpcmVfY2FwYWJpbGl0eSI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gInRyeV9hY3F1aXJlX2NhcGFiaWxpdHkiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJ0cnlfYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSI7CisgIGNhc2UgMzoKKyAgICByZXR1cm4gInRyeV9hY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5IjsKKyAgfQorfQorCitUeXBlVGFnRm9yRGF0YXR5cGVBdHRyICpUeXBlVGFnRm9yRGF0YXR5cGVBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFR5cGVUYWdGb3JEYXRhdHlwZUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgYXJndW1lbnRLaW5kLCBtYXRjaGluZ0NUeXBlLCBsYXlvdXRDb21wYXRpYmxlLCBtdXN0QmVOdWxsLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFR5cGVUYWdGb3JEYXRhdHlwZUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHR5cGVfdGFnX2Zvcl9kYXRhdHlwZSgiIDw8IChnZXRBcmd1bWVudEtpbmQoKSA/IGdldEFyZ3VtZW50S2luZCgpLT5nZXROYW1lKCkgOiAiIikgPDwgIiwgIiA8PCBnZXRNYXRjaGluZ0NUeXBlKCkuZ2V0QXNTdHJpbmcoKSA8PCAiLCAiIDw8IGdldExheW91dENvbXBhdGlibGUoKSA8PCAiLCAiIDw8IGdldE11c3RCZU51bGwoKSA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjp0eXBlX3RhZ19mb3JfZGF0YXR5cGUoIiA8PCAoZ2V0QXJndW1lbnRLaW5kKCkgPyBnZXRBcmd1bWVudEtpbmQoKS0+Z2V0TmFtZSgpIDogIiIpIDw8ICIsICIgPDwgZ2V0TWF0Y2hpbmdDVHlwZSgpLmdldEFzU3RyaW5nKCkgPDwgIiwgIiA8PCBnZXRMYXlvdXRDb21wYXRpYmxlKCkgPDwgIiwgIiA8PCBnZXRNdXN0QmVOdWxsKCkgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6dHlwZV90YWdfZm9yX2RhdGF0eXBlKCIgPDwgKGdldEFyZ3VtZW50S2luZCgpID8gZ2V0QXJndW1lbnRLaW5kKCktPmdldE5hbWUoKSA6ICIiKSA8PCAiLCAiIDw8IGdldE1hdGNoaW5nQ1R5cGUoKS5nZXRBc1N0cmluZygpIDw8ICIsICIgPDwgZ2V0TGF5b3V0Q29tcGF0aWJsZSgpIDw8ICIsICIgPDwgZ2V0TXVzdEJlTnVsbCgpIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlR5cGVUYWdGb3JEYXRhdHlwZUF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAidHlwZV90YWdfZm9yX2RhdGF0eXBlIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAidHlwZV90YWdfZm9yX2RhdGF0eXBlIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAidHlwZV90YWdfZm9yX2RhdGF0eXBlIjsKKyAgfQorfQorCitUeXBlVmlzaWJpbGl0eUF0dHIgKlR5cGVWaXNpYmlsaXR5QXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBUeXBlVmlzaWJpbGl0eUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgdmlzaWJpbGl0eSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBUeXBlVmlzaWJpbGl0eUF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHR5cGVfdmlzaWJpbGl0eShcIiIgPDwgVHlwZVZpc2liaWxpdHlBdHRyOjpDb252ZXJ0VmlzaWJpbGl0eVR5cGVUb1N0cihnZXRWaXNpYmlsaXR5KCkpIDw8ICJcIikpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6dHlwZV92aXNpYmlsaXR5KFwiIiA8PCBUeXBlVmlzaWJpbGl0eUF0dHI6OkNvbnZlcnRWaXNpYmlsaXR5VHlwZVRvU3RyKGdldFZpc2liaWxpdHkoKSkgPDwgIlwiKV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjp0eXBlX3Zpc2liaWxpdHkoXCIiIDw8IFR5cGVWaXNpYmlsaXR5QXR0cjo6Q29udmVydFZpc2liaWxpdHlUeXBlVG9TdHIoZ2V0VmlzaWJpbGl0eSgpKSA8PCAiXCIpXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlR5cGVWaXNpYmlsaXR5QXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJ0eXBlX3Zpc2liaWxpdHkiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJ0eXBlX3Zpc2liaWxpdHkiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJ0eXBlX3Zpc2liaWxpdHkiOworICB9Cit9CisKK1VuYXZhaWxhYmxlQXR0ciAqVW5hdmFpbGFibGVBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFVuYXZhaWxhYmxlQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRNZXNzYWdlKCksIGltcGxpY2l0UmVhc29uLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFVuYXZhaWxhYmxlQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygodW5hdmFpbGFibGUoXCIiIDw8IGdldE1lc3NhZ2UoKSA8PCAiXCIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OnVuYXZhaWxhYmxlKFwiIiA8PCBnZXRNZXNzYWdlKCkgPDwgIlwiKV1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjp1bmF2YWlsYWJsZShcIiIgPDwgZ2V0TWVzc2FnZSgpIDw8ICJcIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqVW5hdmFpbGFibGVBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gInVuYXZhaWxhYmxlIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAidW5hdmFpbGFibGUiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJ1bmF2YWlsYWJsZSI7CisgIH0KK30KKworVW51c2VkQXR0ciAqVW51c2VkQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBVbnVzZWRBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgVW51c2VkQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgW1ttYXliZV91bnVzZWRdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygodW51c2VkKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIFtbZ251Ojp1bnVzZWRdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAzIDogeworICAgIE9TIDw8ICIgW1ttYXliZV91bnVzZWRdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqVW51c2VkQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJtYXliZV91bnVzZWQiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJ1bnVzZWQiOworICBjYXNlIDI6CisgICAgcmV0dXJuICJ1bnVzZWQiOworICBjYXNlIDM6CisgICAgcmV0dXJuICJtYXliZV91bnVzZWQiOworICB9Cit9CisKK1VzZWRBdHRyICpVc2VkQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBVc2VkQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFVzZWRBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKCh1c2VkKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251Ojp1c2VkXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlVzZWRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gInVzZWQiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJ1c2VkIjsKKyAgfQorfQorCitVdWlkQXR0ciAqVXVpZEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgVXVpZEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0R3VpZCgpLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFV1aWRBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2RlY2xzcGVjKHV1aWQoXCIiIDw8IGdldEd1aWQoKSA8PCAiXCIpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICJbdXVpZChcIiIgPDwgZ2V0R3VpZCgpIDw8ICJcIildIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpVdWlkQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJ1dWlkIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAidXVpZCI7CisgIH0KK30KKworVmVjUmV0dXJuQXR0ciAqVmVjUmV0dXJuQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBWZWNSZXR1cm5BdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgVmVjUmV0dXJuQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygodmVjcmV0dXJuKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OnZlY3JldHVybl1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpWZWNSZXR1cm5BdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gInZlY3JldHVybiI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gInZlY3JldHVybiI7CisgIH0KK30KKworVmVjVHlwZUhpbnRBdHRyICpWZWNUeXBlSGludEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgVmVjVHlwZUhpbnRBdHRyKGdldExvY2F0aW9uKCksIEMsIHR5cGVIaW50LCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFZlY1R5cGVIaW50QXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygodmVjX3R5cGVfaGludCgiIDw8IGdldFR5cGVIaW50KCkuZ2V0QXNTdHJpbmcoKSA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpWZWNUeXBlSGludEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAidmVjX3R5cGVfaGludCI7CisgIH0KK30KKworVmVjdG9yQ2FsbEF0dHIgKlZlY3RvckNhbGxBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFZlY3RvckNhbGxBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgVmVjdG9yQ2FsbEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHZlY3RvcmNhbGwpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6dmVjdG9yY2FsbF1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjp2ZWN0b3JjYWxsXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMyA6IHsKKyAgICBPUyA8PCAiIF9fdmVjdG9yY2FsbCI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSA0IDogeworICAgIE9TIDw8ICIgX3ZlY3RvcmNhbGwiOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlZlY3RvckNhbGxBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gInZlY3RvcmNhbGwiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJ2ZWN0b3JjYWxsIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAidmVjdG9yY2FsbCI7CisgIGNhc2UgMzoKKyAgICByZXR1cm4gIl9fdmVjdG9yY2FsbCI7CisgIGNhc2UgNDoKKyAgICByZXR1cm4gIl92ZWN0b3JjYWxsIjsKKyAgfQorfQorCitWaXNpYmlsaXR5QXR0ciAqVmlzaWJpbGl0eUF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgVmlzaWJpbGl0eUF0dHIoZ2V0TG9jYXRpb24oKSwgQywgdmlzaWJpbGl0eSwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBWaXNpYmlsaXR5QXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eShcIiIgPDwgVmlzaWJpbGl0eUF0dHI6OkNvbnZlcnRWaXNpYmlsaXR5VHlwZVRvU3RyKGdldFZpc2liaWxpdHkoKSkgPDwgIlwiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6dmlzaWJpbGl0eShcIiIgPDwgVmlzaWJpbGl0eUF0dHI6OkNvbnZlcnRWaXNpYmlsaXR5VHlwZVRvU3RyKGdldFZpc2liaWxpdHkoKSkgPDwgIlwiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpWaXNpYmlsaXR5QXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJ2aXNpYmlsaXR5IjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAidmlzaWJpbGl0eSI7CisgIH0KK30KKworV2FyblVudXNlZEF0dHIgKldhcm5VbnVzZWRBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFdhcm5VbnVzZWRBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgV2FyblVudXNlZEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251Ojp3YXJuX3VudXNlZF1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpXYXJuVW51c2VkQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJ3YXJuX3VudXNlZCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIndhcm5fdW51c2VkIjsKKyAgfQorfQorCitXYXJuVW51c2VkUmVzdWx0QXR0ciAqV2FyblVudXNlZFJlc3VsdEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgV2FyblVudXNlZFJlc3VsdEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBXYXJuVW51c2VkUmVzdWx0QXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgW1tub2Rpc2NhcmRdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tub2Rpc2NhcmRdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAyIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6d2Fybl91bnVzZWRfcmVzdWx0XV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMyA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDQgOiB7CisgICAgT1MgPDwgIiBbW2dudTo6d2Fybl91bnVzZWRfcmVzdWx0XV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKldhcm5VbnVzZWRSZXN1bHRBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gIm5vZGlzY2FyZCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIm5vZGlzY2FyZCI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gIndhcm5fdW51c2VkX3Jlc3VsdCI7CisgIGNhc2UgMzoKKyAgICByZXR1cm4gIndhcm5fdW51c2VkX3Jlc3VsdCI7CisgIGNhc2UgNDoKKyAgICByZXR1cm4gIndhcm5fdW51c2VkX3Jlc3VsdCI7CisgIH0KK30KKworV2Vha0F0dHIgKldlYWtBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFdlYWtBdHRyKGdldExvY2F0aW9uKCksIEMsIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgV2Vha0F0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHdlYWspKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6OndlYWtdXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqV2Vha0F0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAid2VhayI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIndlYWsiOworICB9Cit9CisKK1dlYWtJbXBvcnRBdHRyICpXZWFrSW1wb3J0QXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBXZWFrSW1wb3J0QXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFdlYWtJbXBvcnRBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrX2ltcG9ydCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjp3ZWFrX2ltcG9ydF1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjp3ZWFrX2ltcG9ydF1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpXZWFrSW1wb3J0QXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJ3ZWFrX2ltcG9ydCI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gIndlYWtfaW1wb3J0IjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAid2Vha19pbXBvcnQiOworICB9Cit9CisKK1dlYWtSZWZBdHRyICpXZWFrUmVmQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBXZWFrUmVmQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRBbGlhc2VlKCksIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgV2Vha1JlZkF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHdlYWtyZWYoXCIiIDw8IGdldEFsaWFzZWUoKSA8PCAiXCIpKSkiOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMSA6IHsKKyAgICBPUyA8PCAiIFtbZ251Ojp3ZWFrcmVmKFwiIiA8PCBnZXRBbGlhc2VlKCkgPDwgIlwiKV1dIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpXZWFrUmVmQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJ3ZWFrcmVmIjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAid2Vha3JlZiI7CisgIH0KK30KKworV29ya0dyb3VwU2l6ZUhpbnRBdHRyICpXb3JrR3JvdXBTaXplSGludEF0dHI6OmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgYXV0byAqQSA9IG5ldyAoQykgV29ya0dyb3VwU2l6ZUhpbnRBdHRyKGdldExvY2F0aW9uKCksIEMsIHhEaW0sIHlEaW0sIHpEaW0sIGdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICBBLT5Jbmhlcml0ZWQgPSBJbmhlcml0ZWQ7CisgIEEtPklzUGFja0V4cGFuc2lvbiA9IElzUGFja0V4cGFuc2lvbjsKKyAgQS0+SW1wbGljaXQgPSBJbXBsaWNpdDsKKyAgcmV0dXJuIEE7Cit9CisKK3ZvaWQgV29ya0dyb3VwU2l6ZUhpbnRBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIGJyZWFrOworICBjYXNlIDAgOiB7CisgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKCh3b3JrX2dyb3VwX3NpemVfaGludCgiIDw8IGdldFhEaW0oKSA8PCAiLCAiIDw8IGdldFlEaW0oKSA8PCAiLCAiIDw8IGdldFpEaW0oKSA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorfQorfQorCitjb25zdCBjaGFyICpXb3JrR3JvdXBTaXplSGludEF0dHI6OmdldFNwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgcmV0dXJuICIoTm8gc3BlbGxpbmcpIjsKKyAgY2FzZSAwOgorICAgIHJldHVybiAid29ya19ncm91cF9zaXplX2hpbnQiOworICB9Cit9CisKK1g4NkZvcmNlQWxpZ25BcmdQb2ludGVyQXR0ciAqWDg2Rm9yY2VBbGlnbkFyZ1BvaW50ZXJBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFg4NkZvcmNlQWxpZ25BcmdQb2ludGVyQXR0cihnZXRMb2NhdGlvbigpLCBDLCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFg4NkZvcmNlQWxpZ25BcmdQb2ludGVyQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoZm9yY2VfYWxpZ25fYXJnX3BvaW50ZXIpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tnbnU6OmZvcmNlX2FsaWduX2FyZ19wb2ludGVyXV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlg4NkZvcmNlQWxpZ25BcmdQb2ludGVyQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJmb3JjZV9hbGlnbl9hcmdfcG9pbnRlciI7CisgIGNhc2UgMToKKyAgICByZXR1cm4gImZvcmNlX2FsaWduX2FyZ19wb2ludGVyIjsKKyAgfQorfQorCitYUmF5SW5zdHJ1bWVudEF0dHIgKlhSYXlJbnN0cnVtZW50QXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3QgeworICBhdXRvICpBID0gbmV3IChDKSBYUmF5SW5zdHJ1bWVudEF0dHIoZ2V0TG9jYXRpb24oKSwgQywgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgIEEtPkluaGVyaXRlZCA9IEluaGVyaXRlZDsKKyAgQS0+SXNQYWNrRXhwYW5zaW9uID0gSXNQYWNrRXhwYW5zaW9uOworICBBLT5JbXBsaWNpdCA9IEltcGxpY2l0OworICByZXR1cm4gQTsKK30KKwordm9pZCBYUmF5SW5zdHJ1bWVudEF0dHI6OnByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgIGRlZmF1bHQ6CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBhdHRyaWJ1dGUgc3BlbGxpbmchIik7CisgICAgYnJlYWs7CisgIGNhc2UgMCA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHhyYXlfYWx3YXlzX2luc3RydW1lbnQpKSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSAxIDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6eHJheV9hbHdheXNfaW5zdHJ1bWVudF1dIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDIgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjp4cmF5X2Fsd2F5c19pbnN0cnVtZW50XV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMyA6IHsKKyAgICBPUyA8PCAiIF9fYXR0cmlidXRlX18oKHhyYXlfbmV2ZXJfaW5zdHJ1bWVudCkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDQgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjp4cmF5X25ldmVyX2luc3RydW1lbnRdXSI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSA1IDogeworICAgIE9TIDw8ICIgW1tjbGFuZzo6eHJheV9uZXZlcl9pbnN0cnVtZW50XV0iOworICAgIGJyZWFrOworICB9Cit9Cit9CisKK2NvbnN0IGNoYXIgKlhSYXlJbnN0cnVtZW50QXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICByZXR1cm4gIihObyBzcGVsbGluZykiOworICBjYXNlIDA6CisgICAgcmV0dXJuICJ4cmF5X2Fsd2F5c19pbnN0cnVtZW50IjsKKyAgY2FzZSAxOgorICAgIHJldHVybiAieHJheV9hbHdheXNfaW5zdHJ1bWVudCI7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gInhyYXlfYWx3YXlzX2luc3RydW1lbnQiOworICBjYXNlIDM6CisgICAgcmV0dXJuICJ4cmF5X25ldmVyX2luc3RydW1lbnQiOworICBjYXNlIDQ6CisgICAgcmV0dXJuICJ4cmF5X25ldmVyX2luc3RydW1lbnQiOworICBjYXNlIDU6CisgICAgcmV0dXJuICJ4cmF5X25ldmVyX2luc3RydW1lbnQiOworICB9Cit9CisKK1hSYXlMb2dBcmdzQXR0ciAqWFJheUxvZ0FyZ3NBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIGF1dG8gKkEgPSBuZXcgKEMpIFhSYXlMb2dBcmdzQXR0cihnZXRMb2NhdGlvbigpLCBDLCBhcmd1bWVudENvdW50LCBnZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgQS0+SW5oZXJpdGVkID0gSW5oZXJpdGVkOworICBBLT5Jc1BhY2tFeHBhbnNpb24gPSBJc1BhY2tFeHBhbnNpb247CisgIEEtPkltcGxpY2l0ID0gSW1wbGljaXQ7CisgIHJldHVybiBBOworfQorCit2b2lkIFhSYXlMb2dBcmdzQXR0cjo6cHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSBzcGVsbGluZyEiKTsKKyAgICBicmVhazsKKyAgY2FzZSAwIDogeworICAgIE9TIDw8ICIgX19hdHRyaWJ1dGVfXygoeHJheV9sb2dfYXJncygiIDw8IGdldEFyZ3VtZW50Q291bnQoKSA8PCAiKSkpIjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIDEgOiB7CisgICAgT1MgPDwgIiBbW2NsYW5nOjp4cmF5X2xvZ19hcmdzKCIgPDwgZ2V0QXJndW1lbnRDb3VudCgpIDw8ICIpXV0iOworICAgIGJyZWFrOworICB9CisgIGNhc2UgMiA6IHsKKyAgICBPUyA8PCAiIFtbY2xhbmc6OnhyYXlfbG9nX2FyZ3MoIiA8PCBnZXRBcmd1bWVudENvdW50KCkgPDwgIildXSI7CisgICAgYnJlYWs7CisgIH0KK30KK30KKworY29uc3QgY2hhciAqWFJheUxvZ0FyZ3NBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nISIpOworICAgIHJldHVybiAiKE5vIHNwZWxsaW5nKSI7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gInhyYXlfbG9nX2FyZ3MiOworICBjYXNlIDE6CisgICAgcmV0dXJuICJ4cmF5X2xvZ19hcmdzIjsKKyAgY2FzZSAyOgorICAgIHJldHVybiAieHJheV9sb2dfYXJncyI7CisgIH0KK30KKworY29uc3QgY2hhciAqQXR0cjo6Z2V0U3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoZ2V0S2luZCgpKSB7CisgIGNhc2UgYXR0cjo6QU1ER1BVRmxhdFdvcmtHcm91cFNpemU6CisgICAgcmV0dXJuIGNhc3Q8QU1ER1BVRmxhdFdvcmtHcm91cFNpemVBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpBTURHUFVOdW1TR1BSOgorICAgIHJldHVybiBjYXN0PEFNREdQVU51bVNHUFJBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpBTURHUFVOdW1WR1BSOgorICAgIHJldHVybiBjYXN0PEFNREdQVU51bVZHUFJBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpBTURHUFVXYXZlc1BlckVVOgorICAgIHJldHVybiBjYXN0PEFNREdQVVdhdmVzUGVyRVVBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpBUk1JbnRlcnJ1cHQ6CisgICAgcmV0dXJuIGNhc3Q8QVJNSW50ZXJydXB0QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6QVZSSW50ZXJydXB0OgorICAgIHJldHVybiBjYXN0PEFWUkludGVycnVwdEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkFWUlNpZ25hbDoKKyAgICByZXR1cm4gY2FzdDxBVlJTaWduYWxBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpBYmlUYWc6CisgICAgcmV0dXJuIGNhc3Q8QWJpVGFnQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6QWNxdWlyZUNhcGFiaWxpdHk6CisgICAgcmV0dXJuIGNhc3Q8QWNxdWlyZUNhcGFiaWxpdHlBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpBY3F1aXJlZEFmdGVyOgorICAgIHJldHVybiBjYXN0PEFjcXVpcmVkQWZ0ZXJBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpBY3F1aXJlZEJlZm9yZToKKyAgICByZXR1cm4gY2FzdDxBY3F1aXJlZEJlZm9yZUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkFsaWFzOgorICAgIHJldHVybiBjYXN0PEFsaWFzQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6QWxpZ25NYWM2OGs6CisgICAgcmV0dXJuIGNhc3Q8QWxpZ25NYWM2OGtBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpBbGlnblZhbHVlOgorICAgIHJldHVybiBjYXN0PEFsaWduVmFsdWVBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpBbGlnbmVkOgorICAgIHJldHVybiBjYXN0PEFsaWduZWRBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpBbGxvY0FsaWduOgorICAgIHJldHVybiBjYXN0PEFsbG9jQWxpZ25BdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpBbGxvY1NpemU6CisgICAgcmV0dXJuIGNhc3Q8QWxsb2NTaXplQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6QWx3YXlzSW5saW5lOgorICAgIHJldHVybiBjYXN0PEFsd2F5c0lubGluZUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkFuYWx5emVyTm9SZXR1cm46CisgICAgcmV0dXJuIGNhc3Q8QW5hbHl6ZXJOb1JldHVybkF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkFubm90YXRlOgorICAgIHJldHVybiBjYXN0PEFubm90YXRlQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6QW55WDg2SW50ZXJydXB0OgorICAgIHJldHVybiBjYXN0PEFueVg4NkludGVycnVwdEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkFueVg4Nk5vQ2FsbGVyU2F2ZWRSZWdpc3RlcnM6CisgICAgcmV0dXJuIGNhc3Q8QW55WDg2Tm9DYWxsZXJTYXZlZFJlZ2lzdGVyc0F0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkFueVg4Nk5vQ2ZDaGVjazoKKyAgICByZXR1cm4gY2FzdDxBbnlYODZOb0NmQ2hlY2tBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpBcmNXZWFrcmVmVW5hdmFpbGFibGU6CisgICAgcmV0dXJuIGNhc3Q8QXJjV2Vha3JlZlVuYXZhaWxhYmxlQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6QXJndW1lbnRXaXRoVHlwZVRhZzoKKyAgICByZXR1cm4gY2FzdDxBcmd1bWVudFdpdGhUeXBlVGFnQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6QXJ0aWZpY2lhbDoKKyAgICByZXR1cm4gY2FzdDxBcnRpZmljaWFsQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6QXNtTGFiZWw6CisgICAgcmV0dXJuIGNhc3Q8QXNtTGFiZWxBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpBc3NlcnRDYXBhYmlsaXR5OgorICAgIHJldHVybiBjYXN0PEFzc2VydENhcGFiaWxpdHlBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpBc3NlcnRFeGNsdXNpdmVMb2NrOgorICAgIHJldHVybiBjYXN0PEFzc2VydEV4Y2x1c2l2ZUxvY2tBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpBc3NlcnRTaGFyZWRMb2NrOgorICAgIHJldHVybiBjYXN0PEFzc2VydFNoYXJlZExvY2tBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpBc3N1bWVBbGlnbmVkOgorICAgIHJldHVybiBjYXN0PEFzc3VtZUFsaWduZWRBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpBdmFpbGFiaWxpdHk6CisgICAgcmV0dXJuIGNhc3Q8QXZhaWxhYmlsaXR5QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6QmxvY2tzOgorICAgIHJldHVybiBjYXN0PEJsb2Nrc0F0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkMxMU5vUmV0dXJuOgorICAgIHJldHVybiBjYXN0PEMxMU5vUmV0dXJuQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6Q0RlY2w6CisgICAgcmV0dXJuIGNhc3Q8Q0RlY2xBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpDRkF1ZGl0ZWRUcmFuc2ZlcjoKKyAgICByZXR1cm4gY2FzdDxDRkF1ZGl0ZWRUcmFuc2ZlckF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkNGQ29uc3VtZWQ6CisgICAgcmV0dXJuIGNhc3Q8Q0ZDb25zdW1lZEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkNGUmV0dXJuc05vdFJldGFpbmVkOgorICAgIHJldHVybiBjYXN0PENGUmV0dXJuc05vdFJldGFpbmVkQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6Q0ZSZXR1cm5zUmV0YWluZWQ6CisgICAgcmV0dXJuIGNhc3Q8Q0ZSZXR1cm5zUmV0YWluZWRBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpDRlVua25vd25UcmFuc2ZlcjoKKyAgICByZXR1cm4gY2FzdDxDRlVua25vd25UcmFuc2ZlckF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkNVREFDb25zdGFudDoKKyAgICByZXR1cm4gY2FzdDxDVURBQ29uc3RhbnRBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpDVURBRGV2aWNlOgorICAgIHJldHVybiBjYXN0PENVREFEZXZpY2VBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpDVURBR2xvYmFsOgorICAgIHJldHVybiBjYXN0PENVREFHbG9iYWxBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpDVURBSG9zdDoKKyAgICByZXR1cm4gY2FzdDxDVURBSG9zdEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkNVREFJbnZhbGlkVGFyZ2V0OgorICAgIHJldHVybiBjYXN0PENVREFJbnZhbGlkVGFyZ2V0QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6Q1VEQUxhdW5jaEJvdW5kczoKKyAgICByZXR1cm4gY2FzdDxDVURBTGF1bmNoQm91bmRzQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6Q1VEQVNoYXJlZDoKKyAgICByZXR1cm4gY2FzdDxDVURBU2hhcmVkQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6Q1hYMTFOb1JldHVybjoKKyAgICByZXR1cm4gY2FzdDxDWFgxMU5vUmV0dXJuQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6Q2FsbGFibGVXaGVuOgorICAgIHJldHVybiBjYXN0PENhbGxhYmxlV2hlbkF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkNhcGFiaWxpdHk6CisgICAgcmV0dXJuIGNhc3Q8Q2FwYWJpbGl0eUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkNhcHR1cmVkUmVjb3JkOgorICAgIHJldHVybiBjYXN0PENhcHR1cmVkUmVjb3JkQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6Q2Fycmllc0RlcGVuZGVuY3k6CisgICAgcmV0dXJuIGNhc3Q8Q2Fycmllc0RlcGVuZGVuY3lBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpDbGVhbnVwOgorICAgIHJldHVybiBjYXN0PENsZWFudXBBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpDb2xkOgorICAgIHJldHVybiBjYXN0PENvbGRBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpDb21tb246CisgICAgcmV0dXJuIGNhc3Q8Q29tbW9uQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6Q29uc3Q6CisgICAgcmV0dXJuIGNhc3Q8Q29uc3RBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpDb25zdHJ1Y3RvcjoKKyAgICByZXR1cm4gY2FzdDxDb25zdHJ1Y3RvckF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkNvbnN1bWFibGU6CisgICAgcmV0dXJuIGNhc3Q8Q29uc3VtYWJsZUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkNvbnN1bWFibGVBdXRvQ2FzdDoKKyAgICByZXR1cm4gY2FzdDxDb25zdW1hYmxlQXV0b0Nhc3RBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpDb25zdW1hYmxlU2V0T25SZWFkOgorICAgIHJldHVybiBjYXN0PENvbnN1bWFibGVTZXRPblJlYWRBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpDb252ZXJnZW50OgorICAgIHJldHVybiBjYXN0PENvbnZlcmdlbnRBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpETExFeHBvcnQ6CisgICAgcmV0dXJuIGNhc3Q8RExMRXhwb3J0QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6RExMSW1wb3J0OgorICAgIHJldHVybiBjYXN0PERMTEltcG9ydEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkRlcHJlY2F0ZWQ6CisgICAgcmV0dXJuIGNhc3Q8RGVwcmVjYXRlZEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkRlc3RydWN0b3I6CisgICAgcmV0dXJuIGNhc3Q8RGVzdHJ1Y3RvckF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkRpYWdub3NlSWY6CisgICAgcmV0dXJuIGNhc3Q8RGlhZ25vc2VJZkF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkRpc2FibGVUYWlsQ2FsbHM6CisgICAgcmV0dXJuIGNhc3Q8RGlzYWJsZVRhaWxDYWxsc0F0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkVtcHR5QmFzZXM6CisgICAgcmV0dXJuIGNhc3Q8RW1wdHlCYXNlc0F0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkVuYWJsZUlmOgorICAgIHJldHVybiBjYXN0PEVuYWJsZUlmQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6RW51bUV4dGVuc2liaWxpdHk6CisgICAgcmV0dXJuIGNhc3Q8RW51bUV4dGVuc2liaWxpdHlBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb246CisgICAgcmV0dXJuIGNhc3Q8RXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6RXh0ZXJuYWxTb3VyY2VTeW1ib2w6CisgICAgcmV0dXJuIGNhc3Q8RXh0ZXJuYWxTb3VyY2VTeW1ib2xBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpGYWxsVGhyb3VnaDoKKyAgICByZXR1cm4gY2FzdDxGYWxsVGhyb3VnaEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkZhc3RDYWxsOgorICAgIHJldHVybiBjYXN0PEZhc3RDYWxsQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6RmluYWw6CisgICAgcmV0dXJuIGNhc3Q8RmluYWxBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpGbGFnRW51bToKKyAgICByZXR1cm4gY2FzdDxGbGFnRW51bUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkZsYXR0ZW46CisgICAgcmV0dXJuIGNhc3Q8RmxhdHRlbkF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkZvcm1hdDoKKyAgICByZXR1cm4gY2FzdDxGb3JtYXRBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpGb3JtYXRBcmc6CisgICAgcmV0dXJuIGNhc3Q8Rm9ybWF0QXJnQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6R05VSW5saW5lOgorICAgIHJldHVybiBjYXN0PEdOVUlubGluZUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Okd1YXJkZWRCeToKKyAgICByZXR1cm4gY2FzdDxHdWFyZGVkQnlBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpHdWFyZGVkVmFyOgorICAgIHJldHVybiBjYXN0PEd1YXJkZWRWYXJBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpIb3Q6CisgICAgcmV0dXJuIGNhc3Q8SG90QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6SUJBY3Rpb246CisgICAgcmV0dXJuIGNhc3Q8SUJBY3Rpb25BdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpJQk91dGxldDoKKyAgICByZXR1cm4gY2FzdDxJQk91dGxldEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OklCT3V0bGV0Q29sbGVjdGlvbjoKKyAgICByZXR1cm4gY2FzdDxJQk91dGxldENvbGxlY3Rpb25BdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpJRnVuYzoKKyAgICByZXR1cm4gY2FzdDxJRnVuY0F0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkluaXRQcmlvcml0eToKKyAgICByZXR1cm4gY2FzdDxJbml0UHJpb3JpdHlBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpJbml0U2VnOgorICAgIHJldHVybiBjYXN0PEluaXRTZWdBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpJbnRlbE9jbEJpY2M6CisgICAgcmV0dXJuIGNhc3Q8SW50ZWxPY2xCaWNjQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6SW50ZXJuYWxMaW5rYWdlOgorICAgIHJldHVybiBjYXN0PEludGVybmFsTGlua2FnZUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkxUT1Zpc2liaWxpdHlQdWJsaWM6CisgICAgcmV0dXJuIGNhc3Q8TFRPVmlzaWJpbGl0eVB1YmxpY0F0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkxheW91dFZlcnNpb246CisgICAgcmV0dXJuIGNhc3Q8TGF5b3V0VmVyc2lvbkF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OkxvY2tSZXR1cm5lZDoKKyAgICByZXR1cm4gY2FzdDxMb2NrUmV0dXJuZWRBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpMb2Nrc0V4Y2x1ZGVkOgorICAgIHJldHVybiBjYXN0PExvY2tzRXhjbHVkZWRBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpMb29wSGludDoKKyAgICByZXR1cm4gY2FzdDxMb29wSGludEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok1TQUJJOgorICAgIHJldHVybiBjYXN0PE1TQUJJQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6TVNJbmhlcml0YW5jZToKKyAgICByZXR1cm4gY2FzdDxNU0luaGVyaXRhbmNlQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6TVNOb1ZUYWJsZToKKyAgICByZXR1cm4gY2FzdDxNU05vVlRhYmxlQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6TVNQNDMwSW50ZXJydXB0OgorICAgIHJldHVybiBjYXN0PE1TUDQzMEludGVycnVwdEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok1TU3RydWN0OgorICAgIHJldHVybiBjYXN0PE1TU3RydWN0QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6TVNWdG9yRGlzcDoKKyAgICByZXR1cm4gY2FzdDxNU1Z0b3JEaXNwQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6TWF4RmllbGRBbGlnbm1lbnQ6CisgICAgcmV0dXJuIGNhc3Q8TWF4RmllbGRBbGlnbm1lbnRBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpNYXlBbGlhczoKKyAgICByZXR1cm4gY2FzdDxNYXlBbGlhc0F0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok1pY3JvTWlwczoKKyAgICByZXR1cm4gY2FzdDxNaWNyb01pcHNBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpNaW5TaXplOgorICAgIHJldHVybiBjYXN0PE1pblNpemVBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpNaXBzMTY6CisgICAgcmV0dXJuIGNhc3Q8TWlwczE2QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6TWlwc0ludGVycnVwdDoKKyAgICByZXR1cm4gY2FzdDxNaXBzSW50ZXJydXB0QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6TWlwc0xvbmdDYWxsOgorICAgIHJldHVybiBjYXN0PE1pcHNMb25nQ2FsbEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok1pcHNTaG9ydENhbGw6CisgICAgcmV0dXJuIGNhc3Q8TWlwc1Nob3J0Q2FsbEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok1vZGU6CisgICAgcmV0dXJuIGNhc3Q8TW9kZUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok5TQ29uc3VtZWQ6CisgICAgcmV0dXJuIGNhc3Q8TlNDb25zdW1lZEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok5TQ29uc3VtZXNTZWxmOgorICAgIHJldHVybiBjYXN0PE5TQ29uc3VtZXNTZWxmQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6TlNSZXR1cm5zQXV0b3JlbGVhc2VkOgorICAgIHJldHVybiBjYXN0PE5TUmV0dXJuc0F1dG9yZWxlYXNlZEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok5TUmV0dXJuc05vdFJldGFpbmVkOgorICAgIHJldHVybiBjYXN0PE5TUmV0dXJuc05vdFJldGFpbmVkQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6TlNSZXR1cm5zUmV0YWluZWQ6CisgICAgcmV0dXJuIGNhc3Q8TlNSZXR1cm5zUmV0YWluZWRBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpOYWtlZDoKKyAgICByZXR1cm4gY2FzdDxOYWtlZEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok5vQWxpYXM6CisgICAgcmV0dXJuIGNhc3Q8Tm9BbGlhc0F0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok5vQ29tbW9uOgorICAgIHJldHVybiBjYXN0PE5vQ29tbW9uQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6Tm9EZWJ1ZzoKKyAgICByZXR1cm4gY2FzdDxOb0RlYnVnQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6Tm9EdXBsaWNhdGU6CisgICAgcmV0dXJuIGNhc3Q8Tm9EdXBsaWNhdGVBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpOb0VzY2FwZToKKyAgICByZXR1cm4gY2FzdDxOb0VzY2FwZUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok5vSW5saW5lOgorICAgIHJldHVybiBjYXN0PE5vSW5saW5lQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6Tm9JbnN0cnVtZW50RnVuY3Rpb246CisgICAgcmV0dXJuIGNhc3Q8Tm9JbnN0cnVtZW50RnVuY3Rpb25BdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpOb01pY3JvTWlwczoKKyAgICByZXR1cm4gY2FzdDxOb01pY3JvTWlwc0F0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok5vTWlwczE2OgorICAgIHJldHVybiBjYXN0PE5vTWlwczE2QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6Tm9SZXR1cm46CisgICAgcmV0dXJuIGNhc3Q8Tm9SZXR1cm5BdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpOb1Nhbml0aXplOgorICAgIHJldHVybiBjYXN0PE5vU2FuaXRpemVBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpOb1NwbGl0U3RhY2s6CisgICAgcmV0dXJuIGNhc3Q8Tm9TcGxpdFN0YWNrQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6Tm9UaHJlYWRTYWZldHlBbmFseXNpczoKKyAgICByZXR1cm4gY2FzdDxOb1RocmVhZFNhZmV0eUFuYWx5c2lzQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6Tm9UaHJvdzoKKyAgICByZXR1cm4gY2FzdDxOb1Rocm93QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6Tm9uTnVsbDoKKyAgICByZXR1cm4gY2FzdDxOb25OdWxsQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6Tm90VGFpbENhbGxlZDoKKyAgICByZXR1cm4gY2FzdDxOb3RUYWlsQ2FsbGVkQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6T01QQ2FwdHVyZUtpbmQ6CisgICAgcmV0dXJuIGNhc3Q8T01QQ2FwdHVyZUtpbmRBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpPTVBDYXB0dXJlTm9Jbml0OgorICAgIHJldHVybiBjYXN0PE9NUENhcHR1cmVOb0luaXRBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpPTVBEZWNsYXJlU2ltZERlY2w6CisgICAgcmV0dXJuIGNhc3Q8T01QRGVjbGFyZVNpbWREZWNsQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6T01QRGVjbGFyZVRhcmdldERlY2w6CisgICAgcmV0dXJuIGNhc3Q8T01QRGVjbGFyZVRhcmdldERlY2xBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpPTVBSZWZlcmVuY2VkVmFyOgorICAgIHJldHVybiBjYXN0PE9NUFJlZmVyZW5jZWRWYXJBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpPTVBUaHJlYWRQcml2YXRlRGVjbDoKKyAgICByZXR1cm4gY2FzdDxPTVBUaHJlYWRQcml2YXRlRGVjbEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok9iakNCb3hhYmxlOgorICAgIHJldHVybiBjYXN0PE9iakNCb3hhYmxlQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6T2JqQ0JyaWRnZToKKyAgICByZXR1cm4gY2FzdDxPYmpDQnJpZGdlQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6T2JqQ0JyaWRnZU11dGFibGU6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ0JyaWRnZU11dGFibGVBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpPYmpDQnJpZGdlUmVsYXRlZDoKKyAgICByZXR1cm4gY2FzdDxPYmpDQnJpZGdlUmVsYXRlZEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok9iakNEZXNpZ25hdGVkSW5pdGlhbGl6ZXI6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ0Rlc2lnbmF0ZWRJbml0aWFsaXplckF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok9iakNFeGNlcHRpb246CisgICAgcmV0dXJuIGNhc3Q8T2JqQ0V4Y2VwdGlvbkF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok9iakNFeHBsaWNpdFByb3RvY29sSW1wbDoKKyAgICByZXR1cm4gY2FzdDxPYmpDRXhwbGljaXRQcm90b2NvbEltcGxBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpPYmpDSW5kZXBlbmRlbnRDbGFzczoKKyAgICByZXR1cm4gY2FzdDxPYmpDSW5kZXBlbmRlbnRDbGFzc0F0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok9iakNNZXRob2RGYW1pbHk6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ01ldGhvZEZhbWlseUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok9iakNOU09iamVjdDoKKyAgICByZXR1cm4gY2FzdDxPYmpDTlNPYmplY3RBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpPYmpDUHJlY2lzZUxpZmV0aW1lOgorICAgIHJldHVybiBjYXN0PE9iakNQcmVjaXNlTGlmZXRpbWVBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpPYmpDUmVxdWlyZXNQcm9wZXJ0eURlZnM6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6T2JqQ1JlcXVpcmVzU3VwZXI6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ1JlcXVpcmVzU3VwZXJBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpPYmpDUmV0dXJuc0lubmVyUG9pbnRlcjoKKyAgICByZXR1cm4gY2FzdDxPYmpDUmV0dXJuc0lubmVyUG9pbnRlckF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok9iakNSb290Q2xhc3M6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ1Jvb3RDbGFzc0F0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok9iakNSdW50aW1lTmFtZToKKyAgICByZXR1cm4gY2FzdDxPYmpDUnVudGltZU5hbWVBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpPYmpDUnVudGltZVZpc2libGU6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ1J1bnRpbWVWaXNpYmxlQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6T2JqQ1N1YmNsYXNzaW5nUmVzdHJpY3RlZDoKKyAgICByZXR1cm4gY2FzdDxPYmpDU3ViY2xhc3NpbmdSZXN0cmljdGVkQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6T3BlbkNMQWNjZXNzOgorICAgIHJldHVybiBjYXN0PE9wZW5DTEFjY2Vzc0F0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok9wZW5DTEludGVsUmVxZFN1Ykdyb3VwU2l6ZToKKyAgICByZXR1cm4gY2FzdDxPcGVuQ0xJbnRlbFJlcWRTdWJHcm91cFNpemVBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpPcGVuQ0xLZXJuZWw6CisgICAgcmV0dXJuIGNhc3Q8T3BlbkNMS2VybmVsQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6T3BlbkNMVW5yb2xsSGludDoKKyAgICByZXR1cm4gY2FzdDxPcGVuQ0xVbnJvbGxIaW50QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6T3B0aW1pemVOb25lOgorICAgIHJldHVybiBjYXN0PE9wdGltaXplTm9uZUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok92ZXJsb2FkYWJsZToKKyAgICByZXR1cm4gY2FzdDxPdmVybG9hZGFibGVBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpPdmVycmlkZToKKyAgICByZXR1cm4gY2FzdDxPdmVycmlkZUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6Ok93bmVyc2hpcDoKKyAgICByZXR1cm4gY2FzdDxPd25lcnNoaXBBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpQYWNrZWQ6CisgICAgcmV0dXJuIGNhc3Q8UGFja2VkQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6UGFyYW1UeXBlc3RhdGU6CisgICAgcmV0dXJuIGNhc3Q8UGFyYW1UeXBlc3RhdGVBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpQYXNjYWw6CisgICAgcmV0dXJuIGNhc3Q8UGFzY2FsQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6UGFzc09iamVjdFNpemU6CisgICAgcmV0dXJuIGNhc3Q8UGFzc09iamVjdFNpemVBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpQY3M6CisgICAgcmV0dXJuIGNhc3Q8UGNzQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6UHJhZ21hQ2xhbmdCU1NTZWN0aW9uOgorICAgIHJldHVybiBjYXN0PFByYWdtYUNsYW5nQlNTU2VjdGlvbkF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlByYWdtYUNsYW5nRGF0YVNlY3Rpb246CisgICAgcmV0dXJuIGNhc3Q8UHJhZ21hQ2xhbmdEYXRhU2VjdGlvbkF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlByYWdtYUNsYW5nUm9kYXRhU2VjdGlvbjoKKyAgICByZXR1cm4gY2FzdDxQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb25BdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpQcmFnbWFDbGFuZ1RleHRTZWN0aW9uOgorICAgIHJldHVybiBjYXN0PFByYWdtYUNsYW5nVGV4dFNlY3Rpb25BdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpQcmVzZXJ2ZUFsbDoKKyAgICByZXR1cm4gY2FzdDxQcmVzZXJ2ZUFsbEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlByZXNlcnZlTW9zdDoKKyAgICByZXR1cm4gY2FzdDxQcmVzZXJ2ZU1vc3RBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpQdEd1YXJkZWRCeToKKyAgICByZXR1cm4gY2FzdDxQdEd1YXJkZWRCeUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlB0R3VhcmRlZFZhcjoKKyAgICByZXR1cm4gY2FzdDxQdEd1YXJkZWRWYXJBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpQdXJlOgorICAgIHJldHVybiBjYXN0PFB1cmVBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpSZWdDYWxsOgorICAgIHJldHVybiBjYXN0PFJlZ0NhbGxBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpSZWxlYXNlQ2FwYWJpbGl0eToKKyAgICByZXR1cm4gY2FzdDxSZWxlYXNlQ2FwYWJpbGl0eUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlJlbmRlclNjcmlwdEtlcm5lbDoKKyAgICByZXR1cm4gY2FzdDxSZW5kZXJTY3JpcHRLZXJuZWxBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpSZXFkV29ya0dyb3VwU2l6ZToKKyAgICByZXR1cm4gY2FzdDxSZXFkV29ya0dyb3VwU2l6ZUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlJlcXVpcmVDb25zdGFudEluaXQ6CisgICAgcmV0dXJuIGNhc3Q8UmVxdWlyZUNvbnN0YW50SW5pdEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlJlcXVpcmVzQ2FwYWJpbGl0eToKKyAgICByZXR1cm4gY2FzdDxSZXF1aXJlc0NhcGFiaWxpdHlBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpSZXN0cmljdDoKKyAgICByZXR1cm4gY2FzdDxSZXN0cmljdEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlJldHVyblR5cGVzdGF0ZToKKyAgICByZXR1cm4gY2FzdDxSZXR1cm5UeXBlc3RhdGVBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpSZXR1cm5zTm9uTnVsbDoKKyAgICByZXR1cm4gY2FzdDxSZXR1cm5zTm9uTnVsbEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlJldHVybnNUd2ljZToKKyAgICByZXR1cm4gY2FzdDxSZXR1cm5zVHdpY2VBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpTY29wZWRMb2NrYWJsZToKKyAgICByZXR1cm4gY2FzdDxTY29wZWRMb2NrYWJsZUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlNlY3Rpb246CisgICAgcmV0dXJuIGNhc3Q8U2VjdGlvbkF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlNlbGVjdEFueToKKyAgICByZXR1cm4gY2FzdDxTZWxlY3RBbnlBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpTZW50aW5lbDoKKyAgICByZXR1cm4gY2FzdDxTZW50aW5lbEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlNldFR5cGVzdGF0ZToKKyAgICByZXR1cm4gY2FzdDxTZXRUeXBlc3RhdGVBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpTaGFyZWRUcnlsb2NrRnVuY3Rpb246CisgICAgcmV0dXJuIGNhc3Q8U2hhcmVkVHJ5bG9ja0Z1bmN0aW9uQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6U3RkQ2FsbDoKKyAgICByZXR1cm4gY2FzdDxTdGRDYWxsQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6U3VwcHJlc3M6CisgICAgcmV0dXJuIGNhc3Q8U3VwcHJlc3NBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpTd2lmdENhbGw6CisgICAgcmV0dXJuIGNhc3Q8U3dpZnRDYWxsQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6U3dpZnRDb250ZXh0OgorICAgIHJldHVybiBjYXN0PFN3aWZ0Q29udGV4dEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlN3aWZ0RXJyb3JSZXN1bHQ6CisgICAgcmV0dXJuIGNhc3Q8U3dpZnRFcnJvclJlc3VsdEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlN3aWZ0SW5kaXJlY3RSZXN1bHQ6CisgICAgcmV0dXJuIGNhc3Q8U3dpZnRJbmRpcmVjdFJlc3VsdEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlN5c1ZBQkk6CisgICAgcmV0dXJuIGNhc3Q8U3lzVkFCSUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlRMU01vZGVsOgorICAgIHJldHVybiBjYXN0PFRMU01vZGVsQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6VGFyZ2V0OgorICAgIHJldHVybiBjYXN0PFRhcmdldEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlRlc3RUeXBlc3RhdGU6CisgICAgcmV0dXJuIGNhc3Q8VGVzdFR5cGVzdGF0ZUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlRoaXNDYWxsOgorICAgIHJldHVybiBjYXN0PFRoaXNDYWxsQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6VGhyZWFkOgorICAgIHJldHVybiBjYXN0PFRocmVhZEF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlRyYW5zcGFyZW50VW5pb246CisgICAgcmV0dXJuIGNhc3Q8VHJhbnNwYXJlbnRVbmlvbkF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlRyaXZpYWxBQkk6CisgICAgcmV0dXJuIGNhc3Q8VHJpdmlhbEFCSUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlRyeUFjcXVpcmVDYXBhYmlsaXR5OgorICAgIHJldHVybiBjYXN0PFRyeUFjcXVpcmVDYXBhYmlsaXR5QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6VHlwZVRhZ0ZvckRhdGF0eXBlOgorICAgIHJldHVybiBjYXN0PFR5cGVUYWdGb3JEYXRhdHlwZUF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlR5cGVWaXNpYmlsaXR5OgorICAgIHJldHVybiBjYXN0PFR5cGVWaXNpYmlsaXR5QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6VW5hdmFpbGFibGU6CisgICAgcmV0dXJuIGNhc3Q8VW5hdmFpbGFibGVBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpVbnVzZWQ6CisgICAgcmV0dXJuIGNhc3Q8VW51c2VkQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6VXNlZDoKKyAgICByZXR1cm4gY2FzdDxVc2VkQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6VXVpZDoKKyAgICByZXR1cm4gY2FzdDxVdWlkQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6VmVjUmV0dXJuOgorICAgIHJldHVybiBjYXN0PFZlY1JldHVybkF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlZlY1R5cGVIaW50OgorICAgIHJldHVybiBjYXN0PFZlY1R5cGVIaW50QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6VmVjdG9yQ2FsbDoKKyAgICByZXR1cm4gY2FzdDxWZWN0b3JDYWxsQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6VmlzaWJpbGl0eToKKyAgICByZXR1cm4gY2FzdDxWaXNpYmlsaXR5QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6V2FyblVudXNlZDoKKyAgICByZXR1cm4gY2FzdDxXYXJuVW51c2VkQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6V2FyblVudXNlZFJlc3VsdDoKKyAgICByZXR1cm4gY2FzdDxXYXJuVW51c2VkUmVzdWx0QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6V2VhazoKKyAgICByZXR1cm4gY2FzdDxXZWFrQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6V2Vha0ltcG9ydDoKKyAgICByZXR1cm4gY2FzdDxXZWFrSW1wb3J0QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6V2Vha1JlZjoKKyAgICByZXR1cm4gY2FzdDxXZWFrUmVmQXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6V29ya0dyb3VwU2l6ZUhpbnQ6CisgICAgcmV0dXJuIGNhc3Q8V29ya0dyb3VwU2l6ZUhpbnRBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgY2FzZSBhdHRyOjpYODZGb3JjZUFsaWduQXJnUG9pbnRlcjoKKyAgICByZXR1cm4gY2FzdDxYODZGb3JjZUFsaWduQXJnUG9pbnRlckF0dHI+KHRoaXMpLT5nZXRTcGVsbGluZygpOworICBjYXNlIGF0dHI6OlhSYXlJbnN0cnVtZW50OgorICAgIHJldHVybiBjYXN0PFhSYXlJbnN0cnVtZW50QXR0cj4odGhpcyktPmdldFNwZWxsaW5nKCk7CisgIGNhc2UgYXR0cjo6WFJheUxvZ0FyZ3M6CisgICAgcmV0dXJuIGNhc3Q8WFJheUxvZ0FyZ3NBdHRyPih0aGlzKS0+Z2V0U3BlbGxpbmcoKTsKKyAgfQorICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIGF0dHJpYnV0ZSBraW5kISIpOworfQorCitBdHRyICpBdHRyOjpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCB7CisgIHN3aXRjaCAoZ2V0S2luZCgpKSB7CisgIGNhc2UgYXR0cjo6QU1ER1BVRmxhdFdvcmtHcm91cFNpemU6CisgICAgcmV0dXJuIGNhc3Q8QU1ER1BVRmxhdFdvcmtHcm91cFNpemVBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6QU1ER1BVTnVtU0dQUjoKKyAgICByZXR1cm4gY2FzdDxBTURHUFVOdW1TR1BSQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkFNREdQVU51bVZHUFI6CisgICAgcmV0dXJuIGNhc3Q8QU1ER1BVTnVtVkdQUkF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpBTURHUFVXYXZlc1BlckVVOgorICAgIHJldHVybiBjYXN0PEFNREdQVVdhdmVzUGVyRVVBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6QVJNSW50ZXJydXB0OgorICAgIHJldHVybiBjYXN0PEFSTUludGVycnVwdEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpBVlJJbnRlcnJ1cHQ6CisgICAgcmV0dXJuIGNhc3Q8QVZSSW50ZXJydXB0QXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkFWUlNpZ25hbDoKKyAgICByZXR1cm4gY2FzdDxBVlJTaWduYWxBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6QWJpVGFnOgorICAgIHJldHVybiBjYXN0PEFiaVRhZ0F0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpBY3F1aXJlQ2FwYWJpbGl0eToKKyAgICByZXR1cm4gY2FzdDxBY3F1aXJlQ2FwYWJpbGl0eUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpBY3F1aXJlZEFmdGVyOgorICAgIHJldHVybiBjYXN0PEFjcXVpcmVkQWZ0ZXJBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6QWNxdWlyZWRCZWZvcmU6CisgICAgcmV0dXJuIGNhc3Q8QWNxdWlyZWRCZWZvcmVBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6QWxpYXM6CisgICAgcmV0dXJuIGNhc3Q8QWxpYXNBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6QWxpZ25NYWM2OGs6CisgICAgcmV0dXJuIGNhc3Q8QWxpZ25NYWM2OGtBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6QWxpZ25WYWx1ZToKKyAgICByZXR1cm4gY2FzdDxBbGlnblZhbHVlQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkFsaWduZWQ6CisgICAgcmV0dXJuIGNhc3Q8QWxpZ25lZEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpBbGxvY0FsaWduOgorICAgIHJldHVybiBjYXN0PEFsbG9jQWxpZ25BdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6QWxsb2NTaXplOgorICAgIHJldHVybiBjYXN0PEFsbG9jU2l6ZUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpBbHdheXNJbmxpbmU6CisgICAgcmV0dXJuIGNhc3Q8QWx3YXlzSW5saW5lQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkFuYWx5emVyTm9SZXR1cm46CisgICAgcmV0dXJuIGNhc3Q8QW5hbHl6ZXJOb1JldHVybkF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpBbm5vdGF0ZToKKyAgICByZXR1cm4gY2FzdDxBbm5vdGF0ZUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpBbnlYODZJbnRlcnJ1cHQ6CisgICAgcmV0dXJuIGNhc3Q8QW55WDg2SW50ZXJydXB0QXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkFueVg4Nk5vQ2FsbGVyU2F2ZWRSZWdpc3RlcnM6CisgICAgcmV0dXJuIGNhc3Q8QW55WDg2Tm9DYWxsZXJTYXZlZFJlZ2lzdGVyc0F0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpBbnlYODZOb0NmQ2hlY2s6CisgICAgcmV0dXJuIGNhc3Q8QW55WDg2Tm9DZkNoZWNrQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkFyY1dlYWtyZWZVbmF2YWlsYWJsZToKKyAgICByZXR1cm4gY2FzdDxBcmNXZWFrcmVmVW5hdmFpbGFibGVBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6QXJndW1lbnRXaXRoVHlwZVRhZzoKKyAgICByZXR1cm4gY2FzdDxBcmd1bWVudFdpdGhUeXBlVGFnQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkFydGlmaWNpYWw6CisgICAgcmV0dXJuIGNhc3Q8QXJ0aWZpY2lhbEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpBc21MYWJlbDoKKyAgICByZXR1cm4gY2FzdDxBc21MYWJlbEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpBc3NlcnRDYXBhYmlsaXR5OgorICAgIHJldHVybiBjYXN0PEFzc2VydENhcGFiaWxpdHlBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6QXNzZXJ0RXhjbHVzaXZlTG9jazoKKyAgICByZXR1cm4gY2FzdDxBc3NlcnRFeGNsdXNpdmVMb2NrQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkFzc2VydFNoYXJlZExvY2s6CisgICAgcmV0dXJuIGNhc3Q8QXNzZXJ0U2hhcmVkTG9ja0F0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpBc3N1bWVBbGlnbmVkOgorICAgIHJldHVybiBjYXN0PEFzc3VtZUFsaWduZWRBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6QXZhaWxhYmlsaXR5OgorICAgIHJldHVybiBjYXN0PEF2YWlsYWJpbGl0eUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpCbG9ja3M6CisgICAgcmV0dXJuIGNhc3Q8QmxvY2tzQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkMxMU5vUmV0dXJuOgorICAgIHJldHVybiBjYXN0PEMxMU5vUmV0dXJuQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkNEZWNsOgorICAgIHJldHVybiBjYXN0PENEZWNsQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkNGQXVkaXRlZFRyYW5zZmVyOgorICAgIHJldHVybiBjYXN0PENGQXVkaXRlZFRyYW5zZmVyQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkNGQ29uc3VtZWQ6CisgICAgcmV0dXJuIGNhc3Q8Q0ZDb25zdW1lZEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpDRlJldHVybnNOb3RSZXRhaW5lZDoKKyAgICByZXR1cm4gY2FzdDxDRlJldHVybnNOb3RSZXRhaW5lZEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpDRlJldHVybnNSZXRhaW5lZDoKKyAgICByZXR1cm4gY2FzdDxDRlJldHVybnNSZXRhaW5lZEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpDRlVua25vd25UcmFuc2ZlcjoKKyAgICByZXR1cm4gY2FzdDxDRlVua25vd25UcmFuc2ZlckF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpDVURBQ29uc3RhbnQ6CisgICAgcmV0dXJuIGNhc3Q8Q1VEQUNvbnN0YW50QXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkNVREFEZXZpY2U6CisgICAgcmV0dXJuIGNhc3Q8Q1VEQURldmljZUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpDVURBR2xvYmFsOgorICAgIHJldHVybiBjYXN0PENVREFHbG9iYWxBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Q1VEQUhvc3Q6CisgICAgcmV0dXJuIGNhc3Q8Q1VEQUhvc3RBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Q1VEQUludmFsaWRUYXJnZXQ6CisgICAgcmV0dXJuIGNhc3Q8Q1VEQUludmFsaWRUYXJnZXRBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Q1VEQUxhdW5jaEJvdW5kczoKKyAgICByZXR1cm4gY2FzdDxDVURBTGF1bmNoQm91bmRzQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkNVREFTaGFyZWQ6CisgICAgcmV0dXJuIGNhc3Q8Q1VEQVNoYXJlZEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpDWFgxMU5vUmV0dXJuOgorICAgIHJldHVybiBjYXN0PENYWDExTm9SZXR1cm5BdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Q2FsbGFibGVXaGVuOgorICAgIHJldHVybiBjYXN0PENhbGxhYmxlV2hlbkF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpDYXBhYmlsaXR5OgorICAgIHJldHVybiBjYXN0PENhcGFiaWxpdHlBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Q2FwdHVyZWRSZWNvcmQ6CisgICAgcmV0dXJuIGNhc3Q8Q2FwdHVyZWRSZWNvcmRBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Q2Fycmllc0RlcGVuZGVuY3k6CisgICAgcmV0dXJuIGNhc3Q8Q2Fycmllc0RlcGVuZGVuY3lBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Q2xlYW51cDoKKyAgICByZXR1cm4gY2FzdDxDbGVhbnVwQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkNvbGQ6CisgICAgcmV0dXJuIGNhc3Q8Q29sZEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpDb21tb246CisgICAgcmV0dXJuIGNhc3Q8Q29tbW9uQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkNvbnN0OgorICAgIHJldHVybiBjYXN0PENvbnN0QXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkNvbnN0cnVjdG9yOgorICAgIHJldHVybiBjYXN0PENvbnN0cnVjdG9yQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkNvbnN1bWFibGU6CisgICAgcmV0dXJuIGNhc3Q8Q29uc3VtYWJsZUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpDb25zdW1hYmxlQXV0b0Nhc3Q6CisgICAgcmV0dXJuIGNhc3Q8Q29uc3VtYWJsZUF1dG9DYXN0QXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkNvbnN1bWFibGVTZXRPblJlYWQ6CisgICAgcmV0dXJuIGNhc3Q8Q29uc3VtYWJsZVNldE9uUmVhZEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpDb252ZXJnZW50OgorICAgIHJldHVybiBjYXN0PENvbnZlcmdlbnRBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6RExMRXhwb3J0OgorICAgIHJldHVybiBjYXN0PERMTEV4cG9ydEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpETExJbXBvcnQ6CisgICAgcmV0dXJuIGNhc3Q8RExMSW1wb3J0QXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkRlcHJlY2F0ZWQ6CisgICAgcmV0dXJuIGNhc3Q8RGVwcmVjYXRlZEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpEZXN0cnVjdG9yOgorICAgIHJldHVybiBjYXN0PERlc3RydWN0b3JBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6RGlhZ25vc2VJZjoKKyAgICByZXR1cm4gY2FzdDxEaWFnbm9zZUlmQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkRpc2FibGVUYWlsQ2FsbHM6CisgICAgcmV0dXJuIGNhc3Q8RGlzYWJsZVRhaWxDYWxsc0F0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpFbXB0eUJhc2VzOgorICAgIHJldHVybiBjYXN0PEVtcHR5QmFzZXNBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6RW5hYmxlSWY6CisgICAgcmV0dXJuIGNhc3Q8RW5hYmxlSWZBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6RW51bUV4dGVuc2liaWxpdHk6CisgICAgcmV0dXJuIGNhc3Q8RW51bUV4dGVuc2liaWxpdHlBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6RXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uOgorICAgIHJldHVybiBjYXN0PEV4Y2x1c2l2ZVRyeWxvY2tGdW5jdGlvbkF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpFeHRlcm5hbFNvdXJjZVN5bWJvbDoKKyAgICByZXR1cm4gY2FzdDxFeHRlcm5hbFNvdXJjZVN5bWJvbEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpGYWxsVGhyb3VnaDoKKyAgICByZXR1cm4gY2FzdDxGYWxsVGhyb3VnaEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpGYXN0Q2FsbDoKKyAgICByZXR1cm4gY2FzdDxGYXN0Q2FsbEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpGaW5hbDoKKyAgICByZXR1cm4gY2FzdDxGaW5hbEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpGbGFnRW51bToKKyAgICByZXR1cm4gY2FzdDxGbGFnRW51bUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpGbGF0dGVuOgorICAgIHJldHVybiBjYXN0PEZsYXR0ZW5BdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Rm9ybWF0OgorICAgIHJldHVybiBjYXN0PEZvcm1hdEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpGb3JtYXRBcmc6CisgICAgcmV0dXJuIGNhc3Q8Rm9ybWF0QXJnQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkdOVUlubGluZToKKyAgICByZXR1cm4gY2FzdDxHTlVJbmxpbmVBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6R3VhcmRlZEJ5OgorICAgIHJldHVybiBjYXN0PEd1YXJkZWRCeUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpHdWFyZGVkVmFyOgorICAgIHJldHVybiBjYXN0PEd1YXJkZWRWYXJBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6SG90OgorICAgIHJldHVybiBjYXN0PEhvdEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpJQkFjdGlvbjoKKyAgICByZXR1cm4gY2FzdDxJQkFjdGlvbkF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpJQk91dGxldDoKKyAgICByZXR1cm4gY2FzdDxJQk91dGxldEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpJQk91dGxldENvbGxlY3Rpb246CisgICAgcmV0dXJuIGNhc3Q8SUJPdXRsZXRDb2xsZWN0aW9uQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OklGdW5jOgorICAgIHJldHVybiBjYXN0PElGdW5jQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkluaXRQcmlvcml0eToKKyAgICByZXR1cm4gY2FzdDxJbml0UHJpb3JpdHlBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6SW5pdFNlZzoKKyAgICByZXR1cm4gY2FzdDxJbml0U2VnQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkludGVsT2NsQmljYzoKKyAgICByZXR1cm4gY2FzdDxJbnRlbE9jbEJpY2NBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6SW50ZXJuYWxMaW5rYWdlOgorICAgIHJldHVybiBjYXN0PEludGVybmFsTGlua2FnZUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpMVE9WaXNpYmlsaXR5UHVibGljOgorICAgIHJldHVybiBjYXN0PExUT1Zpc2liaWxpdHlQdWJsaWNBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6TGF5b3V0VmVyc2lvbjoKKyAgICByZXR1cm4gY2FzdDxMYXlvdXRWZXJzaW9uQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OkxvY2tSZXR1cm5lZDoKKyAgICByZXR1cm4gY2FzdDxMb2NrUmV0dXJuZWRBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6TG9ja3NFeGNsdWRlZDoKKyAgICByZXR1cm4gY2FzdDxMb2Nrc0V4Y2x1ZGVkQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Okxvb3BIaW50OgorICAgIHJldHVybiBjYXN0PExvb3BIaW50QXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok1TQUJJOgorICAgIHJldHVybiBjYXN0PE1TQUJJQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok1TSW5oZXJpdGFuY2U6CisgICAgcmV0dXJuIGNhc3Q8TVNJbmhlcml0YW5jZUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpNU05vVlRhYmxlOgorICAgIHJldHVybiBjYXN0PE1TTm9WVGFibGVBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6TVNQNDMwSW50ZXJydXB0OgorICAgIHJldHVybiBjYXN0PE1TUDQzMEludGVycnVwdEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpNU1N0cnVjdDoKKyAgICByZXR1cm4gY2FzdDxNU1N0cnVjdEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpNU1Z0b3JEaXNwOgorICAgIHJldHVybiBjYXN0PE1TVnRvckRpc3BBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6TWF4RmllbGRBbGlnbm1lbnQ6CisgICAgcmV0dXJuIGNhc3Q8TWF4RmllbGRBbGlnbm1lbnRBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6TWF5QWxpYXM6CisgICAgcmV0dXJuIGNhc3Q8TWF5QWxpYXNBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6TWljcm9NaXBzOgorICAgIHJldHVybiBjYXN0PE1pY3JvTWlwc0F0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpNaW5TaXplOgorICAgIHJldHVybiBjYXN0PE1pblNpemVBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6TWlwczE2OgorICAgIHJldHVybiBjYXN0PE1pcHMxNkF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpNaXBzSW50ZXJydXB0OgorICAgIHJldHVybiBjYXN0PE1pcHNJbnRlcnJ1cHRBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6TWlwc0xvbmdDYWxsOgorICAgIHJldHVybiBjYXN0PE1pcHNMb25nQ2FsbEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpNaXBzU2hvcnRDYWxsOgorICAgIHJldHVybiBjYXN0PE1pcHNTaG9ydENhbGxBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6TW9kZToKKyAgICByZXR1cm4gY2FzdDxNb2RlQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok5TQ29uc3VtZWQ6CisgICAgcmV0dXJuIGNhc3Q8TlNDb25zdW1lZEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpOU0NvbnN1bWVzU2VsZjoKKyAgICByZXR1cm4gY2FzdDxOU0NvbnN1bWVzU2VsZkF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpOU1JldHVybnNBdXRvcmVsZWFzZWQ6CisgICAgcmV0dXJuIGNhc3Q8TlNSZXR1cm5zQXV0b3JlbGVhc2VkQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok5TUmV0dXJuc05vdFJldGFpbmVkOgorICAgIHJldHVybiBjYXN0PE5TUmV0dXJuc05vdFJldGFpbmVkQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok5TUmV0dXJuc1JldGFpbmVkOgorICAgIHJldHVybiBjYXN0PE5TUmV0dXJuc1JldGFpbmVkQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok5ha2VkOgorICAgIHJldHVybiBjYXN0PE5ha2VkQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok5vQWxpYXM6CisgICAgcmV0dXJuIGNhc3Q8Tm9BbGlhc0F0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpOb0NvbW1vbjoKKyAgICByZXR1cm4gY2FzdDxOb0NvbW1vbkF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpOb0RlYnVnOgorICAgIHJldHVybiBjYXN0PE5vRGVidWdBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Tm9EdXBsaWNhdGU6CisgICAgcmV0dXJuIGNhc3Q8Tm9EdXBsaWNhdGVBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Tm9Fc2NhcGU6CisgICAgcmV0dXJuIGNhc3Q8Tm9Fc2NhcGVBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Tm9JbmxpbmU6CisgICAgcmV0dXJuIGNhc3Q8Tm9JbmxpbmVBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Tm9JbnN0cnVtZW50RnVuY3Rpb246CisgICAgcmV0dXJuIGNhc3Q8Tm9JbnN0cnVtZW50RnVuY3Rpb25BdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Tm9NaWNyb01pcHM6CisgICAgcmV0dXJuIGNhc3Q8Tm9NaWNyb01pcHNBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Tm9NaXBzMTY6CisgICAgcmV0dXJuIGNhc3Q8Tm9NaXBzMTZBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Tm9SZXR1cm46CisgICAgcmV0dXJuIGNhc3Q8Tm9SZXR1cm5BdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Tm9TYW5pdGl6ZToKKyAgICByZXR1cm4gY2FzdDxOb1Nhbml0aXplQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok5vU3BsaXRTdGFjazoKKyAgICByZXR1cm4gY2FzdDxOb1NwbGl0U3RhY2tBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Tm9UaHJlYWRTYWZldHlBbmFseXNpczoKKyAgICByZXR1cm4gY2FzdDxOb1RocmVhZFNhZmV0eUFuYWx5c2lzQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok5vVGhyb3c6CisgICAgcmV0dXJuIGNhc3Q8Tm9UaHJvd0F0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpOb25OdWxsOgorICAgIHJldHVybiBjYXN0PE5vbk51bGxBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6Tm90VGFpbENhbGxlZDoKKyAgICByZXR1cm4gY2FzdDxOb3RUYWlsQ2FsbGVkQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok9NUENhcHR1cmVLaW5kOgorICAgIHJldHVybiBjYXN0PE9NUENhcHR1cmVLaW5kQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok9NUENhcHR1cmVOb0luaXQ6CisgICAgcmV0dXJuIGNhc3Q8T01QQ2FwdHVyZU5vSW5pdEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpPTVBEZWNsYXJlU2ltZERlY2w6CisgICAgcmV0dXJuIGNhc3Q8T01QRGVjbGFyZVNpbWREZWNsQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok9NUERlY2xhcmVUYXJnZXREZWNsOgorICAgIHJldHVybiBjYXN0PE9NUERlY2xhcmVUYXJnZXREZWNsQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok9NUFJlZmVyZW5jZWRWYXI6CisgICAgcmV0dXJuIGNhc3Q8T01QUmVmZXJlbmNlZFZhckF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpPTVBUaHJlYWRQcml2YXRlRGVjbDoKKyAgICByZXR1cm4gY2FzdDxPTVBUaHJlYWRQcml2YXRlRGVjbEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpPYmpDQm94YWJsZToKKyAgICByZXR1cm4gY2FzdDxPYmpDQm94YWJsZUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpPYmpDQnJpZGdlOgorICAgIHJldHVybiBjYXN0PE9iakNCcmlkZ2VBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6T2JqQ0JyaWRnZU11dGFibGU6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ0JyaWRnZU11dGFibGVBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6T2JqQ0JyaWRnZVJlbGF0ZWQ6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ0JyaWRnZVJlbGF0ZWRBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6T2JqQ0Rlc2lnbmF0ZWRJbml0aWFsaXplcjoKKyAgICByZXR1cm4gY2FzdDxPYmpDRGVzaWduYXRlZEluaXRpYWxpemVyQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok9iakNFeGNlcHRpb246CisgICAgcmV0dXJuIGNhc3Q8T2JqQ0V4Y2VwdGlvbkF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpPYmpDRXhwbGljaXRQcm90b2NvbEltcGw6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ0V4cGxpY2l0UHJvdG9jb2xJbXBsQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok9iakNJbmRlcGVuZGVudENsYXNzOgorICAgIHJldHVybiBjYXN0PE9iakNJbmRlcGVuZGVudENsYXNzQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok9iakNNZXRob2RGYW1pbHk6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ01ldGhvZEZhbWlseUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpPYmpDTlNPYmplY3Q6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ05TT2JqZWN0QXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok9iakNQcmVjaXNlTGlmZXRpbWU6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ1ByZWNpc2VMaWZldGltZUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpPYmpDUmVxdWlyZXNQcm9wZXJ0eURlZnM6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok9iakNSZXF1aXJlc1N1cGVyOgorICAgIHJldHVybiBjYXN0PE9iakNSZXF1aXJlc1N1cGVyQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok9iakNSZXR1cm5zSW5uZXJQb2ludGVyOgorICAgIHJldHVybiBjYXN0PE9iakNSZXR1cm5zSW5uZXJQb2ludGVyQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok9iakNSb290Q2xhc3M6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ1Jvb3RDbGFzc0F0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpPYmpDUnVudGltZU5hbWU6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ1J1bnRpbWVOYW1lQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok9iakNSdW50aW1lVmlzaWJsZToKKyAgICByZXR1cm4gY2FzdDxPYmpDUnVudGltZVZpc2libGVBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6T2JqQ1N1YmNsYXNzaW5nUmVzdHJpY3RlZDoKKyAgICByZXR1cm4gY2FzdDxPYmpDU3ViY2xhc3NpbmdSZXN0cmljdGVkQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok9wZW5DTEFjY2VzczoKKyAgICByZXR1cm4gY2FzdDxPcGVuQ0xBY2Nlc3NBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6T3BlbkNMSW50ZWxSZXFkU3ViR3JvdXBTaXplOgorICAgIHJldHVybiBjYXN0PE9wZW5DTEludGVsUmVxZFN1Ykdyb3VwU2l6ZUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpPcGVuQ0xLZXJuZWw6CisgICAgcmV0dXJuIGNhc3Q8T3BlbkNMS2VybmVsQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok9wZW5DTFVucm9sbEhpbnQ6CisgICAgcmV0dXJuIGNhc3Q8T3BlbkNMVW5yb2xsSGludEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpPcHRpbWl6ZU5vbmU6CisgICAgcmV0dXJuIGNhc3Q8T3B0aW1pemVOb25lQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Ok92ZXJsb2FkYWJsZToKKyAgICByZXR1cm4gY2FzdDxPdmVybG9hZGFibGVBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6T3ZlcnJpZGU6CisgICAgcmV0dXJuIGNhc3Q8T3ZlcnJpZGVBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6T3duZXJzaGlwOgorICAgIHJldHVybiBjYXN0PE93bmVyc2hpcEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpQYWNrZWQ6CisgICAgcmV0dXJuIGNhc3Q8UGFja2VkQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlBhcmFtVHlwZXN0YXRlOgorICAgIHJldHVybiBjYXN0PFBhcmFtVHlwZXN0YXRlQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlBhc2NhbDoKKyAgICByZXR1cm4gY2FzdDxQYXNjYWxBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6UGFzc09iamVjdFNpemU6CisgICAgcmV0dXJuIGNhc3Q8UGFzc09iamVjdFNpemVBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6UGNzOgorICAgIHJldHVybiBjYXN0PFBjc0F0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpQcmFnbWFDbGFuZ0JTU1NlY3Rpb246CisgICAgcmV0dXJuIGNhc3Q8UHJhZ21hQ2xhbmdCU1NTZWN0aW9uQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlByYWdtYUNsYW5nRGF0YVNlY3Rpb246CisgICAgcmV0dXJuIGNhc3Q8UHJhZ21hQ2xhbmdEYXRhU2VjdGlvbkF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb246CisgICAgcmV0dXJuIGNhc3Q8UHJhZ21hQ2xhbmdSb2RhdGFTZWN0aW9uQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlByYWdtYUNsYW5nVGV4dFNlY3Rpb246CisgICAgcmV0dXJuIGNhc3Q8UHJhZ21hQ2xhbmdUZXh0U2VjdGlvbkF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpQcmVzZXJ2ZUFsbDoKKyAgICByZXR1cm4gY2FzdDxQcmVzZXJ2ZUFsbEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpQcmVzZXJ2ZU1vc3Q6CisgICAgcmV0dXJuIGNhc3Q8UHJlc2VydmVNb3N0QXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlB0R3VhcmRlZEJ5OgorICAgIHJldHVybiBjYXN0PFB0R3VhcmRlZEJ5QXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlB0R3VhcmRlZFZhcjoKKyAgICByZXR1cm4gY2FzdDxQdEd1YXJkZWRWYXJBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6UHVyZToKKyAgICByZXR1cm4gY2FzdDxQdXJlQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlJlZ0NhbGw6CisgICAgcmV0dXJuIGNhc3Q8UmVnQ2FsbEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpSZWxlYXNlQ2FwYWJpbGl0eToKKyAgICByZXR1cm4gY2FzdDxSZWxlYXNlQ2FwYWJpbGl0eUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpSZW5kZXJTY3JpcHRLZXJuZWw6CisgICAgcmV0dXJuIGNhc3Q8UmVuZGVyU2NyaXB0S2VybmVsQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlJlcWRXb3JrR3JvdXBTaXplOgorICAgIHJldHVybiBjYXN0PFJlcWRXb3JrR3JvdXBTaXplQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlJlcXVpcmVDb25zdGFudEluaXQ6CisgICAgcmV0dXJuIGNhc3Q8UmVxdWlyZUNvbnN0YW50SW5pdEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpSZXF1aXJlc0NhcGFiaWxpdHk6CisgICAgcmV0dXJuIGNhc3Q8UmVxdWlyZXNDYXBhYmlsaXR5QXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlJlc3RyaWN0OgorICAgIHJldHVybiBjYXN0PFJlc3RyaWN0QXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlJldHVyblR5cGVzdGF0ZToKKyAgICByZXR1cm4gY2FzdDxSZXR1cm5UeXBlc3RhdGVBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6UmV0dXJuc05vbk51bGw6CisgICAgcmV0dXJuIGNhc3Q8UmV0dXJuc05vbk51bGxBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6UmV0dXJuc1R3aWNlOgorICAgIHJldHVybiBjYXN0PFJldHVybnNUd2ljZUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpTY29wZWRMb2NrYWJsZToKKyAgICByZXR1cm4gY2FzdDxTY29wZWRMb2NrYWJsZUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpTZWN0aW9uOgorICAgIHJldHVybiBjYXN0PFNlY3Rpb25BdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6U2VsZWN0QW55OgorICAgIHJldHVybiBjYXN0PFNlbGVjdEFueUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpTZW50aW5lbDoKKyAgICByZXR1cm4gY2FzdDxTZW50aW5lbEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpTZXRUeXBlc3RhdGU6CisgICAgcmV0dXJuIGNhc3Q8U2V0VHlwZXN0YXRlQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlNoYXJlZFRyeWxvY2tGdW5jdGlvbjoKKyAgICByZXR1cm4gY2FzdDxTaGFyZWRUcnlsb2NrRnVuY3Rpb25BdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6U3RkQ2FsbDoKKyAgICByZXR1cm4gY2FzdDxTdGRDYWxsQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlN1cHByZXNzOgorICAgIHJldHVybiBjYXN0PFN1cHByZXNzQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlN3aWZ0Q2FsbDoKKyAgICByZXR1cm4gY2FzdDxTd2lmdENhbGxBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6U3dpZnRDb250ZXh0OgorICAgIHJldHVybiBjYXN0PFN3aWZ0Q29udGV4dEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpTd2lmdEVycm9yUmVzdWx0OgorICAgIHJldHVybiBjYXN0PFN3aWZ0RXJyb3JSZXN1bHRBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6U3dpZnRJbmRpcmVjdFJlc3VsdDoKKyAgICByZXR1cm4gY2FzdDxTd2lmdEluZGlyZWN0UmVzdWx0QXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlN5c1ZBQkk6CisgICAgcmV0dXJuIGNhc3Q8U3lzVkFCSUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpUTFNNb2RlbDoKKyAgICByZXR1cm4gY2FzdDxUTFNNb2RlbEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpUYXJnZXQ6CisgICAgcmV0dXJuIGNhc3Q8VGFyZ2V0QXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlRlc3RUeXBlc3RhdGU6CisgICAgcmV0dXJuIGNhc3Q8VGVzdFR5cGVzdGF0ZUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpUaGlzQ2FsbDoKKyAgICByZXR1cm4gY2FzdDxUaGlzQ2FsbEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpUaHJlYWQ6CisgICAgcmV0dXJuIGNhc3Q8VGhyZWFkQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlRyYW5zcGFyZW50VW5pb246CisgICAgcmV0dXJuIGNhc3Q8VHJhbnNwYXJlbnRVbmlvbkF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpUcml2aWFsQUJJOgorICAgIHJldHVybiBjYXN0PFRyaXZpYWxBQklBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6VHJ5QWNxdWlyZUNhcGFiaWxpdHk6CisgICAgcmV0dXJuIGNhc3Q8VHJ5QWNxdWlyZUNhcGFiaWxpdHlBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6VHlwZVRhZ0ZvckRhdGF0eXBlOgorICAgIHJldHVybiBjYXN0PFR5cGVUYWdGb3JEYXRhdHlwZUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpUeXBlVmlzaWJpbGl0eToKKyAgICByZXR1cm4gY2FzdDxUeXBlVmlzaWJpbGl0eUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpVbmF2YWlsYWJsZToKKyAgICByZXR1cm4gY2FzdDxVbmF2YWlsYWJsZUF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpVbnVzZWQ6CisgICAgcmV0dXJuIGNhc3Q8VW51c2VkQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OlVzZWQ6CisgICAgcmV0dXJuIGNhc3Q8VXNlZEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpVdWlkOgorICAgIHJldHVybiBjYXN0PFV1aWRBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6VmVjUmV0dXJuOgorICAgIHJldHVybiBjYXN0PFZlY1JldHVybkF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpWZWNUeXBlSGludDoKKyAgICByZXR1cm4gY2FzdDxWZWNUeXBlSGludEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpWZWN0b3JDYWxsOgorICAgIHJldHVybiBjYXN0PFZlY3RvckNhbGxBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6VmlzaWJpbGl0eToKKyAgICByZXR1cm4gY2FzdDxWaXNpYmlsaXR5QXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6Oldhcm5VbnVzZWQ6CisgICAgcmV0dXJuIGNhc3Q8V2FyblVudXNlZEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpXYXJuVW51c2VkUmVzdWx0OgorICAgIHJldHVybiBjYXN0PFdhcm5VbnVzZWRSZXN1bHRBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6V2VhazoKKyAgICByZXR1cm4gY2FzdDxXZWFrQXR0cj4odGhpcyktPmNsb25lKEMpOworICBjYXNlIGF0dHI6OldlYWtJbXBvcnQ6CisgICAgcmV0dXJuIGNhc3Q8V2Vha0ltcG9ydEF0dHI+KHRoaXMpLT5jbG9uZShDKTsKKyAgY2FzZSBhdHRyOjpXZWFrUmVmOgorICAgIHJldHVybiBjYXN0PFdlYWtSZWZBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6V29ya0dyb3VwU2l6ZUhpbnQ6CisgICAgcmV0dXJuIGNhc3Q8V29ya0dyb3VwU2l6ZUhpbnRBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6WDg2Rm9yY2VBbGlnbkFyZ1BvaW50ZXI6CisgICAgcmV0dXJuIGNhc3Q8WDg2Rm9yY2VBbGlnbkFyZ1BvaW50ZXJBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6WFJheUluc3RydW1lbnQ6CisgICAgcmV0dXJuIGNhc3Q8WFJheUluc3RydW1lbnRBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIGNhc2UgYXR0cjo6WFJheUxvZ0FyZ3M6CisgICAgcmV0dXJuIGNhc3Q8WFJheUxvZ0FyZ3NBdHRyPih0aGlzKS0+Y2xvbmUoQyk7CisgIH0KKyAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBhdHRyaWJ1dGUga2luZCEiKTsKK30KKwordm9pZCBBdHRyOjpwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgc3dpdGNoIChnZXRLaW5kKCkpIHsKKyAgY2FzZSBhdHRyOjpBTURHUFVGbGF0V29ya0dyb3VwU2l6ZToKKyAgICByZXR1cm4gY2FzdDxBTURHUFVGbGF0V29ya0dyb3VwU2l6ZUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpBTURHUFVOdW1TR1BSOgorICAgIHJldHVybiBjYXN0PEFNREdQVU51bVNHUFJBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6QU1ER1BVTnVtVkdQUjoKKyAgICByZXR1cm4gY2FzdDxBTURHUFVOdW1WR1BSQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkFNREdQVVdhdmVzUGVyRVU6CisgICAgcmV0dXJuIGNhc3Q8QU1ER1BVV2F2ZXNQZXJFVUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpBUk1JbnRlcnJ1cHQ6CisgICAgcmV0dXJuIGNhc3Q8QVJNSW50ZXJydXB0QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkFWUkludGVycnVwdDoKKyAgICByZXR1cm4gY2FzdDxBVlJJbnRlcnJ1cHRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6QVZSU2lnbmFsOgorICAgIHJldHVybiBjYXN0PEFWUlNpZ25hbEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpBYmlUYWc6CisgICAgcmV0dXJuIGNhc3Q8QWJpVGFnQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkFjcXVpcmVDYXBhYmlsaXR5OgorICAgIHJldHVybiBjYXN0PEFjcXVpcmVDYXBhYmlsaXR5QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkFjcXVpcmVkQWZ0ZXI6CisgICAgcmV0dXJuIGNhc3Q8QWNxdWlyZWRBZnRlckF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpBY3F1aXJlZEJlZm9yZToKKyAgICByZXR1cm4gY2FzdDxBY3F1aXJlZEJlZm9yZUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpBbGlhczoKKyAgICByZXR1cm4gY2FzdDxBbGlhc0F0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpBbGlnbk1hYzY4azoKKyAgICByZXR1cm4gY2FzdDxBbGlnbk1hYzY4a0F0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpBbGlnblZhbHVlOgorICAgIHJldHVybiBjYXN0PEFsaWduVmFsdWVBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6QWxpZ25lZDoKKyAgICByZXR1cm4gY2FzdDxBbGlnbmVkQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkFsbG9jQWxpZ246CisgICAgcmV0dXJuIGNhc3Q8QWxsb2NBbGlnbkF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpBbGxvY1NpemU6CisgICAgcmV0dXJuIGNhc3Q8QWxsb2NTaXplQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkFsd2F5c0lubGluZToKKyAgICByZXR1cm4gY2FzdDxBbHdheXNJbmxpbmVBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6QW5hbHl6ZXJOb1JldHVybjoKKyAgICByZXR1cm4gY2FzdDxBbmFseXplck5vUmV0dXJuQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkFubm90YXRlOgorICAgIHJldHVybiBjYXN0PEFubm90YXRlQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkFueVg4NkludGVycnVwdDoKKyAgICByZXR1cm4gY2FzdDxBbnlYODZJbnRlcnJ1cHRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6QW55WDg2Tm9DYWxsZXJTYXZlZFJlZ2lzdGVyczoKKyAgICByZXR1cm4gY2FzdDxBbnlYODZOb0NhbGxlclNhdmVkUmVnaXN0ZXJzQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkFueVg4Nk5vQ2ZDaGVjazoKKyAgICByZXR1cm4gY2FzdDxBbnlYODZOb0NmQ2hlY2tBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6QXJjV2Vha3JlZlVuYXZhaWxhYmxlOgorICAgIHJldHVybiBjYXN0PEFyY1dlYWtyZWZVbmF2YWlsYWJsZUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpBcmd1bWVudFdpdGhUeXBlVGFnOgorICAgIHJldHVybiBjYXN0PEFyZ3VtZW50V2l0aFR5cGVUYWdBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6QXJ0aWZpY2lhbDoKKyAgICByZXR1cm4gY2FzdDxBcnRpZmljaWFsQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkFzbUxhYmVsOgorICAgIHJldHVybiBjYXN0PEFzbUxhYmVsQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkFzc2VydENhcGFiaWxpdHk6CisgICAgcmV0dXJuIGNhc3Q8QXNzZXJ0Q2FwYWJpbGl0eUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpBc3NlcnRFeGNsdXNpdmVMb2NrOgorICAgIHJldHVybiBjYXN0PEFzc2VydEV4Y2x1c2l2ZUxvY2tBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6QXNzZXJ0U2hhcmVkTG9jazoKKyAgICByZXR1cm4gY2FzdDxBc3NlcnRTaGFyZWRMb2NrQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkFzc3VtZUFsaWduZWQ6CisgICAgcmV0dXJuIGNhc3Q8QXNzdW1lQWxpZ25lZEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpBdmFpbGFiaWxpdHk6CisgICAgcmV0dXJuIGNhc3Q8QXZhaWxhYmlsaXR5QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkJsb2NrczoKKyAgICByZXR1cm4gY2FzdDxCbG9ja3NBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6QzExTm9SZXR1cm46CisgICAgcmV0dXJuIGNhc3Q8QzExTm9SZXR1cm5BdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6Q0RlY2w6CisgICAgcmV0dXJuIGNhc3Q8Q0RlY2xBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6Q0ZBdWRpdGVkVHJhbnNmZXI6CisgICAgcmV0dXJuIGNhc3Q8Q0ZBdWRpdGVkVHJhbnNmZXJBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6Q0ZDb25zdW1lZDoKKyAgICByZXR1cm4gY2FzdDxDRkNvbnN1bWVkQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkNGUmV0dXJuc05vdFJldGFpbmVkOgorICAgIHJldHVybiBjYXN0PENGUmV0dXJuc05vdFJldGFpbmVkQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkNGUmV0dXJuc1JldGFpbmVkOgorICAgIHJldHVybiBjYXN0PENGUmV0dXJuc1JldGFpbmVkQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkNGVW5rbm93blRyYW5zZmVyOgorICAgIHJldHVybiBjYXN0PENGVW5rbm93blRyYW5zZmVyQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkNVREFDb25zdGFudDoKKyAgICByZXR1cm4gY2FzdDxDVURBQ29uc3RhbnRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6Q1VEQURldmljZToKKyAgICByZXR1cm4gY2FzdDxDVURBRGV2aWNlQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkNVREFHbG9iYWw6CisgICAgcmV0dXJuIGNhc3Q8Q1VEQUdsb2JhbEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpDVURBSG9zdDoKKyAgICByZXR1cm4gY2FzdDxDVURBSG9zdEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpDVURBSW52YWxpZFRhcmdldDoKKyAgICByZXR1cm4gY2FzdDxDVURBSW52YWxpZFRhcmdldEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpDVURBTGF1bmNoQm91bmRzOgorICAgIHJldHVybiBjYXN0PENVREFMYXVuY2hCb3VuZHNBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6Q1VEQVNoYXJlZDoKKyAgICByZXR1cm4gY2FzdDxDVURBU2hhcmVkQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkNYWDExTm9SZXR1cm46CisgICAgcmV0dXJuIGNhc3Q8Q1hYMTFOb1JldHVybkF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpDYWxsYWJsZVdoZW46CisgICAgcmV0dXJuIGNhc3Q8Q2FsbGFibGVXaGVuQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkNhcGFiaWxpdHk6CisgICAgcmV0dXJuIGNhc3Q8Q2FwYWJpbGl0eUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpDYXB0dXJlZFJlY29yZDoKKyAgICByZXR1cm4gY2FzdDxDYXB0dXJlZFJlY29yZEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpDYXJyaWVzRGVwZW5kZW5jeToKKyAgICByZXR1cm4gY2FzdDxDYXJyaWVzRGVwZW5kZW5jeUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpDbGVhbnVwOgorICAgIHJldHVybiBjYXN0PENsZWFudXBBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6Q29sZDoKKyAgICByZXR1cm4gY2FzdDxDb2xkQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkNvbW1vbjoKKyAgICByZXR1cm4gY2FzdDxDb21tb25BdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6Q29uc3Q6CisgICAgcmV0dXJuIGNhc3Q8Q29uc3RBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6Q29uc3RydWN0b3I6CisgICAgcmV0dXJuIGNhc3Q8Q29uc3RydWN0b3JBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6Q29uc3VtYWJsZToKKyAgICByZXR1cm4gY2FzdDxDb25zdW1hYmxlQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkNvbnN1bWFibGVBdXRvQ2FzdDoKKyAgICByZXR1cm4gY2FzdDxDb25zdW1hYmxlQXV0b0Nhc3RBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6Q29uc3VtYWJsZVNldE9uUmVhZDoKKyAgICByZXR1cm4gY2FzdDxDb25zdW1hYmxlU2V0T25SZWFkQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkNvbnZlcmdlbnQ6CisgICAgcmV0dXJuIGNhc3Q8Q29udmVyZ2VudEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpETExFeHBvcnQ6CisgICAgcmV0dXJuIGNhc3Q8RExMRXhwb3J0QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkRMTEltcG9ydDoKKyAgICByZXR1cm4gY2FzdDxETExJbXBvcnRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6RGVwcmVjYXRlZDoKKyAgICByZXR1cm4gY2FzdDxEZXByZWNhdGVkQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkRlc3RydWN0b3I6CisgICAgcmV0dXJuIGNhc3Q8RGVzdHJ1Y3RvckF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpEaWFnbm9zZUlmOgorICAgIHJldHVybiBjYXN0PERpYWdub3NlSWZBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6RGlzYWJsZVRhaWxDYWxsczoKKyAgICByZXR1cm4gY2FzdDxEaXNhYmxlVGFpbENhbGxzQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkVtcHR5QmFzZXM6CisgICAgcmV0dXJuIGNhc3Q8RW1wdHlCYXNlc0F0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpFbmFibGVJZjoKKyAgICByZXR1cm4gY2FzdDxFbmFibGVJZkF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpFbnVtRXh0ZW5zaWJpbGl0eToKKyAgICByZXR1cm4gY2FzdDxFbnVtRXh0ZW5zaWJpbGl0eUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb246CisgICAgcmV0dXJuIGNhc3Q8RXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkV4dGVybmFsU291cmNlU3ltYm9sOgorICAgIHJldHVybiBjYXN0PEV4dGVybmFsU291cmNlU3ltYm9sQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkZhbGxUaHJvdWdoOgorICAgIHJldHVybiBjYXN0PEZhbGxUaHJvdWdoQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkZhc3RDYWxsOgorICAgIHJldHVybiBjYXN0PEZhc3RDYWxsQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkZpbmFsOgorICAgIHJldHVybiBjYXN0PEZpbmFsQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkZsYWdFbnVtOgorICAgIHJldHVybiBjYXN0PEZsYWdFbnVtQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkZsYXR0ZW46CisgICAgcmV0dXJuIGNhc3Q8RmxhdHRlbkF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpGb3JtYXQ6CisgICAgcmV0dXJuIGNhc3Q8Rm9ybWF0QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkZvcm1hdEFyZzoKKyAgICByZXR1cm4gY2FzdDxGb3JtYXRBcmdBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6R05VSW5saW5lOgorICAgIHJldHVybiBjYXN0PEdOVUlubGluZUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpHdWFyZGVkQnk6CisgICAgcmV0dXJuIGNhc3Q8R3VhcmRlZEJ5QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Okd1YXJkZWRWYXI6CisgICAgcmV0dXJuIGNhc3Q8R3VhcmRlZFZhckF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpIb3Q6CisgICAgcmV0dXJuIGNhc3Q8SG90QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OklCQWN0aW9uOgorICAgIHJldHVybiBjYXN0PElCQWN0aW9uQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OklCT3V0bGV0OgorICAgIHJldHVybiBjYXN0PElCT3V0bGV0QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OklCT3V0bGV0Q29sbGVjdGlvbjoKKyAgICByZXR1cm4gY2FzdDxJQk91dGxldENvbGxlY3Rpb25BdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6SUZ1bmM6CisgICAgcmV0dXJuIGNhc3Q8SUZ1bmNBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6SW5pdFByaW9yaXR5OgorICAgIHJldHVybiBjYXN0PEluaXRQcmlvcml0eUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpJbml0U2VnOgorICAgIHJldHVybiBjYXN0PEluaXRTZWdBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6SW50ZWxPY2xCaWNjOgorICAgIHJldHVybiBjYXN0PEludGVsT2NsQmljY0F0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpJbnRlcm5hbExpbmthZ2U6CisgICAgcmV0dXJuIGNhc3Q8SW50ZXJuYWxMaW5rYWdlQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OkxUT1Zpc2liaWxpdHlQdWJsaWM6CisgICAgcmV0dXJuIGNhc3Q8TFRPVmlzaWJpbGl0eVB1YmxpY0F0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpMYXlvdXRWZXJzaW9uOgorICAgIHJldHVybiBjYXN0PExheW91dFZlcnNpb25BdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6TG9ja1JldHVybmVkOgorICAgIHJldHVybiBjYXN0PExvY2tSZXR1cm5lZEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpMb2Nrc0V4Y2x1ZGVkOgorICAgIHJldHVybiBjYXN0PExvY2tzRXhjbHVkZWRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6TG9vcEhpbnQ6CisgICAgcmV0dXJuIGNhc3Q8TG9vcEhpbnRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6TVNBQkk6CisgICAgcmV0dXJuIGNhc3Q8TVNBQklBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6TVNJbmhlcml0YW5jZToKKyAgICByZXR1cm4gY2FzdDxNU0luaGVyaXRhbmNlQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok1TTm9WVGFibGU6CisgICAgcmV0dXJuIGNhc3Q8TVNOb1ZUYWJsZUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpNU1A0MzBJbnRlcnJ1cHQ6CisgICAgcmV0dXJuIGNhc3Q8TVNQNDMwSW50ZXJydXB0QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok1TU3RydWN0OgorICAgIHJldHVybiBjYXN0PE1TU3RydWN0QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok1TVnRvckRpc3A6CisgICAgcmV0dXJuIGNhc3Q8TVNWdG9yRGlzcEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpNYXhGaWVsZEFsaWdubWVudDoKKyAgICByZXR1cm4gY2FzdDxNYXhGaWVsZEFsaWdubWVudEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpNYXlBbGlhczoKKyAgICByZXR1cm4gY2FzdDxNYXlBbGlhc0F0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpNaWNyb01pcHM6CisgICAgcmV0dXJuIGNhc3Q8TWljcm9NaXBzQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok1pblNpemU6CisgICAgcmV0dXJuIGNhc3Q8TWluU2l6ZUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpNaXBzMTY6CisgICAgcmV0dXJuIGNhc3Q8TWlwczE2QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok1pcHNJbnRlcnJ1cHQ6CisgICAgcmV0dXJuIGNhc3Q8TWlwc0ludGVycnVwdEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpNaXBzTG9uZ0NhbGw6CisgICAgcmV0dXJuIGNhc3Q8TWlwc0xvbmdDYWxsQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok1pcHNTaG9ydENhbGw6CisgICAgcmV0dXJuIGNhc3Q8TWlwc1Nob3J0Q2FsbEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpNb2RlOgorICAgIHJldHVybiBjYXN0PE1vZGVBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6TlNDb25zdW1lZDoKKyAgICByZXR1cm4gY2FzdDxOU0NvbnN1bWVkQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok5TQ29uc3VtZXNTZWxmOgorICAgIHJldHVybiBjYXN0PE5TQ29uc3VtZXNTZWxmQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok5TUmV0dXJuc0F1dG9yZWxlYXNlZDoKKyAgICByZXR1cm4gY2FzdDxOU1JldHVybnNBdXRvcmVsZWFzZWRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6TlNSZXR1cm5zTm90UmV0YWluZWQ6CisgICAgcmV0dXJuIGNhc3Q8TlNSZXR1cm5zTm90UmV0YWluZWRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6TlNSZXR1cm5zUmV0YWluZWQ6CisgICAgcmV0dXJuIGNhc3Q8TlNSZXR1cm5zUmV0YWluZWRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6TmFrZWQ6CisgICAgcmV0dXJuIGNhc3Q8TmFrZWRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6Tm9BbGlhczoKKyAgICByZXR1cm4gY2FzdDxOb0FsaWFzQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok5vQ29tbW9uOgorICAgIHJldHVybiBjYXN0PE5vQ29tbW9uQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok5vRGVidWc6CisgICAgcmV0dXJuIGNhc3Q8Tm9EZWJ1Z0F0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpOb0R1cGxpY2F0ZToKKyAgICByZXR1cm4gY2FzdDxOb0R1cGxpY2F0ZUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpOb0VzY2FwZToKKyAgICByZXR1cm4gY2FzdDxOb0VzY2FwZUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpOb0lubGluZToKKyAgICByZXR1cm4gY2FzdDxOb0lubGluZUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpOb0luc3RydW1lbnRGdW5jdGlvbjoKKyAgICByZXR1cm4gY2FzdDxOb0luc3RydW1lbnRGdW5jdGlvbkF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpOb01pY3JvTWlwczoKKyAgICByZXR1cm4gY2FzdDxOb01pY3JvTWlwc0F0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpOb01pcHMxNjoKKyAgICByZXR1cm4gY2FzdDxOb01pcHMxNkF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpOb1JldHVybjoKKyAgICByZXR1cm4gY2FzdDxOb1JldHVybkF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpOb1Nhbml0aXplOgorICAgIHJldHVybiBjYXN0PE5vU2FuaXRpemVBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6Tm9TcGxpdFN0YWNrOgorICAgIHJldHVybiBjYXN0PE5vU3BsaXRTdGFja0F0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpOb1RocmVhZFNhZmV0eUFuYWx5c2lzOgorICAgIHJldHVybiBjYXN0PE5vVGhyZWFkU2FmZXR5QW5hbHlzaXNBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6Tm9UaHJvdzoKKyAgICByZXR1cm4gY2FzdDxOb1Rocm93QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok5vbk51bGw6CisgICAgcmV0dXJuIGNhc3Q8Tm9uTnVsbEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpOb3RUYWlsQ2FsbGVkOgorICAgIHJldHVybiBjYXN0PE5vdFRhaWxDYWxsZWRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6T01QQ2FwdHVyZUtpbmQ6CisgICAgcmV0dXJuIGNhc3Q8T01QQ2FwdHVyZUtpbmRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6T01QQ2FwdHVyZU5vSW5pdDoKKyAgICByZXR1cm4gY2FzdDxPTVBDYXB0dXJlTm9Jbml0QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok9NUERlY2xhcmVTaW1kRGVjbDoKKyAgICByZXR1cm4gY2FzdDxPTVBEZWNsYXJlU2ltZERlY2xBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6T01QRGVjbGFyZVRhcmdldERlY2w6CisgICAgcmV0dXJuIGNhc3Q8T01QRGVjbGFyZVRhcmdldERlY2xBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6T01QUmVmZXJlbmNlZFZhcjoKKyAgICByZXR1cm4gY2FzdDxPTVBSZWZlcmVuY2VkVmFyQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok9NUFRocmVhZFByaXZhdGVEZWNsOgorICAgIHJldHVybiBjYXN0PE9NUFRocmVhZFByaXZhdGVEZWNsQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok9iakNCb3hhYmxlOgorICAgIHJldHVybiBjYXN0PE9iakNCb3hhYmxlQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok9iakNCcmlkZ2U6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ0JyaWRnZUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpPYmpDQnJpZGdlTXV0YWJsZToKKyAgICByZXR1cm4gY2FzdDxPYmpDQnJpZGdlTXV0YWJsZUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpPYmpDQnJpZGdlUmVsYXRlZDoKKyAgICByZXR1cm4gY2FzdDxPYmpDQnJpZGdlUmVsYXRlZEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpPYmpDRGVzaWduYXRlZEluaXRpYWxpemVyOgorICAgIHJldHVybiBjYXN0PE9iakNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6T2JqQ0V4Y2VwdGlvbjoKKyAgICByZXR1cm4gY2FzdDxPYmpDRXhjZXB0aW9uQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok9iakNFeHBsaWNpdFByb3RvY29sSW1wbDoKKyAgICByZXR1cm4gY2FzdDxPYmpDRXhwbGljaXRQcm90b2NvbEltcGxBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6T2JqQ0luZGVwZW5kZW50Q2xhc3M6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ0luZGVwZW5kZW50Q2xhc3NBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6T2JqQ01ldGhvZEZhbWlseToKKyAgICByZXR1cm4gY2FzdDxPYmpDTWV0aG9kRmFtaWx5QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok9iakNOU09iamVjdDoKKyAgICByZXR1cm4gY2FzdDxPYmpDTlNPYmplY3RBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6T2JqQ1ByZWNpc2VMaWZldGltZToKKyAgICByZXR1cm4gY2FzdDxPYmpDUHJlY2lzZUxpZmV0aW1lQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok9iakNSZXF1aXJlc1Byb3BlcnR5RGVmczoKKyAgICByZXR1cm4gY2FzdDxPYmpDUmVxdWlyZXNQcm9wZXJ0eURlZnNBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6T2JqQ1JlcXVpcmVzU3VwZXI6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ1JlcXVpcmVzU3VwZXJBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6T2JqQ1JldHVybnNJbm5lclBvaW50ZXI6CisgICAgcmV0dXJuIGNhc3Q8T2JqQ1JldHVybnNJbm5lclBvaW50ZXJBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6T2JqQ1Jvb3RDbGFzczoKKyAgICByZXR1cm4gY2FzdDxPYmpDUm9vdENsYXNzQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok9iakNSdW50aW1lTmFtZToKKyAgICByZXR1cm4gY2FzdDxPYmpDUnVudGltZU5hbWVBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6T2JqQ1J1bnRpbWVWaXNpYmxlOgorICAgIHJldHVybiBjYXN0PE9iakNSdW50aW1lVmlzaWJsZUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpPYmpDU3ViY2xhc3NpbmdSZXN0cmljdGVkOgorICAgIHJldHVybiBjYXN0PE9iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6T3BlbkNMQWNjZXNzOgorICAgIHJldHVybiBjYXN0PE9wZW5DTEFjY2Vzc0F0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpPcGVuQ0xJbnRlbFJlcWRTdWJHcm91cFNpemU6CisgICAgcmV0dXJuIGNhc3Q8T3BlbkNMSW50ZWxSZXFkU3ViR3JvdXBTaXplQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok9wZW5DTEtlcm5lbDoKKyAgICByZXR1cm4gY2FzdDxPcGVuQ0xLZXJuZWxBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6T3BlbkNMVW5yb2xsSGludDoKKyAgICByZXR1cm4gY2FzdDxPcGVuQ0xVbnJvbGxIaW50QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Ok9wdGltaXplTm9uZToKKyAgICByZXR1cm4gY2FzdDxPcHRpbWl6ZU5vbmVBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6T3ZlcmxvYWRhYmxlOgorICAgIHJldHVybiBjYXN0PE92ZXJsb2FkYWJsZUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpPdmVycmlkZToKKyAgICByZXR1cm4gY2FzdDxPdmVycmlkZUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpPd25lcnNoaXA6CisgICAgcmV0dXJuIGNhc3Q8T3duZXJzaGlwQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlBhY2tlZDoKKyAgICByZXR1cm4gY2FzdDxQYWNrZWRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6UGFyYW1UeXBlc3RhdGU6CisgICAgcmV0dXJuIGNhc3Q8UGFyYW1UeXBlc3RhdGVBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6UGFzY2FsOgorICAgIHJldHVybiBjYXN0PFBhc2NhbEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpQYXNzT2JqZWN0U2l6ZToKKyAgICByZXR1cm4gY2FzdDxQYXNzT2JqZWN0U2l6ZUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpQY3M6CisgICAgcmV0dXJuIGNhc3Q8UGNzQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlByYWdtYUNsYW5nQlNTU2VjdGlvbjoKKyAgICByZXR1cm4gY2FzdDxQcmFnbWFDbGFuZ0JTU1NlY3Rpb25BdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6UHJhZ21hQ2xhbmdEYXRhU2VjdGlvbjoKKyAgICByZXR1cm4gY2FzdDxQcmFnbWFDbGFuZ0RhdGFTZWN0aW9uQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlByYWdtYUNsYW5nUm9kYXRhU2VjdGlvbjoKKyAgICByZXR1cm4gY2FzdDxQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb25BdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6UHJhZ21hQ2xhbmdUZXh0U2VjdGlvbjoKKyAgICByZXR1cm4gY2FzdDxQcmFnbWFDbGFuZ1RleHRTZWN0aW9uQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlByZXNlcnZlQWxsOgorICAgIHJldHVybiBjYXN0PFByZXNlcnZlQWxsQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlByZXNlcnZlTW9zdDoKKyAgICByZXR1cm4gY2FzdDxQcmVzZXJ2ZU1vc3RBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6UHRHdWFyZGVkQnk6CisgICAgcmV0dXJuIGNhc3Q8UHRHdWFyZGVkQnlBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6UHRHdWFyZGVkVmFyOgorICAgIHJldHVybiBjYXN0PFB0R3VhcmRlZFZhckF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpQdXJlOgorICAgIHJldHVybiBjYXN0PFB1cmVBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6UmVnQ2FsbDoKKyAgICByZXR1cm4gY2FzdDxSZWdDYWxsQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlJlbGVhc2VDYXBhYmlsaXR5OgorICAgIHJldHVybiBjYXN0PFJlbGVhc2VDYXBhYmlsaXR5QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlJlbmRlclNjcmlwdEtlcm5lbDoKKyAgICByZXR1cm4gY2FzdDxSZW5kZXJTY3JpcHRLZXJuZWxBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6UmVxZFdvcmtHcm91cFNpemU6CisgICAgcmV0dXJuIGNhc3Q8UmVxZFdvcmtHcm91cFNpemVBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6UmVxdWlyZUNvbnN0YW50SW5pdDoKKyAgICByZXR1cm4gY2FzdDxSZXF1aXJlQ29uc3RhbnRJbml0QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlJlcXVpcmVzQ2FwYWJpbGl0eToKKyAgICByZXR1cm4gY2FzdDxSZXF1aXJlc0NhcGFiaWxpdHlBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6UmVzdHJpY3Q6CisgICAgcmV0dXJuIGNhc3Q8UmVzdHJpY3RBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6UmV0dXJuVHlwZXN0YXRlOgorICAgIHJldHVybiBjYXN0PFJldHVyblR5cGVzdGF0ZUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpSZXR1cm5zTm9uTnVsbDoKKyAgICByZXR1cm4gY2FzdDxSZXR1cm5zTm9uTnVsbEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpSZXR1cm5zVHdpY2U6CisgICAgcmV0dXJuIGNhc3Q8UmV0dXJuc1R3aWNlQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlNjb3BlZExvY2thYmxlOgorICAgIHJldHVybiBjYXN0PFNjb3BlZExvY2thYmxlQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlNlY3Rpb246CisgICAgcmV0dXJuIGNhc3Q8U2VjdGlvbkF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpTZWxlY3RBbnk6CisgICAgcmV0dXJuIGNhc3Q8U2VsZWN0QW55QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlNlbnRpbmVsOgorICAgIHJldHVybiBjYXN0PFNlbnRpbmVsQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlNldFR5cGVzdGF0ZToKKyAgICByZXR1cm4gY2FzdDxTZXRUeXBlc3RhdGVBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6U2hhcmVkVHJ5bG9ja0Z1bmN0aW9uOgorICAgIHJldHVybiBjYXN0PFNoYXJlZFRyeWxvY2tGdW5jdGlvbkF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpTdGRDYWxsOgorICAgIHJldHVybiBjYXN0PFN0ZENhbGxBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6U3VwcHJlc3M6CisgICAgcmV0dXJuIGNhc3Q8U3VwcHJlc3NBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6U3dpZnRDYWxsOgorICAgIHJldHVybiBjYXN0PFN3aWZ0Q2FsbEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpTd2lmdENvbnRleHQ6CisgICAgcmV0dXJuIGNhc3Q8U3dpZnRDb250ZXh0QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlN3aWZ0RXJyb3JSZXN1bHQ6CisgICAgcmV0dXJuIGNhc3Q8U3dpZnRFcnJvclJlc3VsdEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpTd2lmdEluZGlyZWN0UmVzdWx0OgorICAgIHJldHVybiBjYXN0PFN3aWZ0SW5kaXJlY3RSZXN1bHRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6U3lzVkFCSToKKyAgICByZXR1cm4gY2FzdDxTeXNWQUJJQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlRMU01vZGVsOgorICAgIHJldHVybiBjYXN0PFRMU01vZGVsQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlRhcmdldDoKKyAgICByZXR1cm4gY2FzdDxUYXJnZXRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6VGVzdFR5cGVzdGF0ZToKKyAgICByZXR1cm4gY2FzdDxUZXN0VHlwZXN0YXRlQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlRoaXNDYWxsOgorICAgIHJldHVybiBjYXN0PFRoaXNDYWxsQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlRocmVhZDoKKyAgICByZXR1cm4gY2FzdDxUaHJlYWRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6VHJhbnNwYXJlbnRVbmlvbjoKKyAgICByZXR1cm4gY2FzdDxUcmFuc3BhcmVudFVuaW9uQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlRyaXZpYWxBQkk6CisgICAgcmV0dXJuIGNhc3Q8VHJpdmlhbEFCSUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpUcnlBY3F1aXJlQ2FwYWJpbGl0eToKKyAgICByZXR1cm4gY2FzdDxUcnlBY3F1aXJlQ2FwYWJpbGl0eUF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpUeXBlVGFnRm9yRGF0YXR5cGU6CisgICAgcmV0dXJuIGNhc3Q8VHlwZVRhZ0ZvckRhdGF0eXBlQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlR5cGVWaXNpYmlsaXR5OgorICAgIHJldHVybiBjYXN0PFR5cGVWaXNpYmlsaXR5QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlVuYXZhaWxhYmxlOgorICAgIHJldHVybiBjYXN0PFVuYXZhaWxhYmxlQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlVudXNlZDoKKyAgICByZXR1cm4gY2FzdDxVbnVzZWRBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6VXNlZDoKKyAgICByZXR1cm4gY2FzdDxVc2VkQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlV1aWQ6CisgICAgcmV0dXJuIGNhc3Q8VXVpZEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpWZWNSZXR1cm46CisgICAgcmV0dXJuIGNhc3Q8VmVjUmV0dXJuQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlZlY1R5cGVIaW50OgorICAgIHJldHVybiBjYXN0PFZlY1R5cGVIaW50QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OlZlY3RvckNhbGw6CisgICAgcmV0dXJuIGNhc3Q8VmVjdG9yQ2FsbEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpWaXNpYmlsaXR5OgorICAgIHJldHVybiBjYXN0PFZpc2liaWxpdHlBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6V2FyblVudXNlZDoKKyAgICByZXR1cm4gY2FzdDxXYXJuVW51c2VkQXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6Oldhcm5VbnVzZWRSZXN1bHQ6CisgICAgcmV0dXJuIGNhc3Q8V2FyblVudXNlZFJlc3VsdEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpXZWFrOgorICAgIHJldHVybiBjYXN0PFdlYWtBdHRyPih0aGlzKS0+cHJpbnRQcmV0dHkoT1MsIFBvbGljeSk7CisgIGNhc2UgYXR0cjo6V2Vha0ltcG9ydDoKKyAgICByZXR1cm4gY2FzdDxXZWFrSW1wb3J0QXR0cj4odGhpcyktPnByaW50UHJldHR5KE9TLCBQb2xpY3kpOworICBjYXNlIGF0dHI6OldlYWtSZWY6CisgICAgcmV0dXJuIGNhc3Q8V2Vha1JlZkF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpXb3JrR3JvdXBTaXplSGludDoKKyAgICByZXR1cm4gY2FzdDxXb3JrR3JvdXBTaXplSGludEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpYODZGb3JjZUFsaWduQXJnUG9pbnRlcjoKKyAgICByZXR1cm4gY2FzdDxYODZGb3JjZUFsaWduQXJnUG9pbnRlckF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpYUmF5SW5zdHJ1bWVudDoKKyAgICByZXR1cm4gY2FzdDxYUmF5SW5zdHJ1bWVudEF0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgY2FzZSBhdHRyOjpYUmF5TG9nQXJnczoKKyAgICByZXR1cm4gY2FzdDxYUmF5TG9nQXJnc0F0dHI+KHRoaXMpLT5wcmludFByZXR0eShPUywgUG9saWN5KTsKKyAgfQorICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIGF0dHJpYnV0ZSBraW5kISIpOworfQorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQXR0ckl0ZXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQXR0ckl0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4MDdiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BdHRySXRlcmF0b3IuaApAQCAtMCwwICsxLDE0OCBAQAorLy89PT0tIEF0dHJJdGVyYXRvci5oIC0gQ2xhc3NlcyBmb3IgYXR0cmlidXRlIGl0ZXJhdGlvbiAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIEF0dHIgdmVjdG9yIGFuZCBzcGVjaWZpY19hdHRyX2l0ZXJhdG9yIGludGVyZmFjZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9BVFRSSVRFUkFUT1JfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9BVFRSSVRFUkFUT1JfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBBdHRyOworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisvLyBEZWZpbmVkIGluIEFTVENvbnRleHQuaAordm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBCeXRlcywgY29uc3QgY2xhbmc6OkFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgc2l6ZV90IEFsaWdubWVudCA9IDgpOworCisvLyBGSVhNRTogQmVpbmcgZm9yY2VkIHRvIG5vdCBoYXZlIGEgZGVmYXVsdCBhcmd1bWVudCBoZXJlIGR1ZSB0byByZWRlY2xhcmF0aW9uCisvLyAgICAgICAgcnVsZXMgb24gZGVmYXVsdCBhcmd1bWVudHMgc3Vja3MKK3ZvaWQgKm9wZXJhdG9yIG5ld1tdKHNpemVfdCBCeXRlcywgY29uc3QgY2xhbmc6OkFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QgQWxpZ25tZW50KTsKKworLy8gSXQgaXMgZ29vZCBwcmFjdGljZSB0byBwYWlyIG5ldy9kZWxldGUgb3BlcmF0b3JzLiAgQWxzbywgTVNWQyBnaXZlcyBtYW55CisvLyB3YXJuaW5ncyBpZiBhIG1hdGNoaW5nIGRlbGV0ZSBvdmVybG9hZCBpcyBub3QgZGVjbGFyZWQsIGV2ZW4gdGhvdWdoIHRoZQorLy8gdGhyb3coKSBzcGVjIGd1YXJhbnRlZXMgaXQgd2lsbCBub3QgYmUgaW1wbGljaXRseSBjYWxsZWQuCit2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpQdHIsIGNvbnN0IGNsYW5nOjpBU1RDb250ZXh0ICZDLCBzaXplX3QpOwordm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkICpQdHIsIGNvbnN0IGNsYW5nOjpBU1RDb250ZXh0ICZDLCBzaXplX3QpOworCituYW1lc3BhY2UgY2xhbmcgeworCisvLy8gQXR0clZlYyAtIEEgdmVjdG9yIG9mIEF0dHIsIHdoaWNoIGlzIGhvdyB0aGV5IGFyZSBzdG9yZWQgb24gdGhlIEFTVC4KK3VzaW5nIEF0dHJWZWMgPSBTbWFsbFZlY3RvcjxBdHRyICosIDQ+OworCisvLy8gc3BlY2lmaWNfYXR0cl9pdGVyYXRvciAtIEl0ZXJhdGVzIG92ZXIgYSBzdWJyYW5nZSBvZiBhbiBBdHRyVmVjLCBvbmx5CisvLy8gcHJvdmlkaW5nIGF0dHJpYnV0ZXMgdGhhdCBhcmUgb2YgYSBzcGVjaWZpYyB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFNwZWNpZmljQXR0ciwgdHlwZW5hbWUgQ29udGFpbmVyID0gQXR0clZlYz4KK2NsYXNzIHNwZWNpZmljX2F0dHJfaXRlcmF0b3IgeworICB1c2luZyBJdGVyYXRvciA9IHR5cGVuYW1lIENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgLy8vIEN1cnJlbnQgLSBUaGUgY3VycmVudCwgdW5kZXJseWluZyBpdGVyYXRvci4KKyAgLy8vIEluIG9yZGVyIHRvIGVuc3VyZSB3ZSBkb24ndCBkZXJlZmVyZW5jZSBhbiBpbnZhbGlkIGl0ZXJhdG9yIHVubGVzcworICAvLy8gc3BlY2lmaWNhbGx5IHJlcXVlc3RlZCwgd2UgZG9uJ3QgbmVjZXNzYXJpbHkgYWR2YW5jZSB0aGlzIGFsbCB0aGUKKyAgLy8vIHdheS4gSW5zdGVhZCwgd2UgYWR2YW5jZSBpdCB3aGVuIGFuIG9wZXJhdGlvbiBpcyByZXF1ZXN0ZWQ7IGlmIHRoZQorICAvLy8gb3BlcmF0aW9uIGlzIGFjdGluZyBvbiB3aGF0IHNob3VsZCBiZSBhIHBhc3QtdGhlLWVuZCBpdGVyYXRvciwKKyAgLy8vIHRoZW4gd2Ugb2ZmZXIgbm8gZ3VhcmFudGVlcywgYnV0IHRoaXMgd2F5IHdlIGRvIG5vdCBkZXJlZmVyZW5jZSBhCisgIC8vLyBwYXN0LXRoZS1lbmQgaXRlcmF0b3Igd2hlbiB3ZSBtb3ZlIHRvIGEgcGFzdC10aGUtZW5kIHBvc2l0aW9uLgorICBtdXRhYmxlIEl0ZXJhdG9yIEN1cnJlbnQ7CisKKyAgdm9pZCBBZHZhbmNlVG9OZXh0KCkgY29uc3QgeworICAgIHdoaWxlICghaXNhPFNwZWNpZmljQXR0cj4oKkN1cnJlbnQpKQorICAgICAgKytDdXJyZW50OworICB9CisKKyAgdm9pZCBBZHZhbmNlVG9OZXh0KEl0ZXJhdG9yIEkpIGNvbnN0IHsKKyAgICB3aGlsZSAoQ3VycmVudCAhPSBJICYmICFpc2E8U3BlY2lmaWNBdHRyPigqQ3VycmVudCkpCisgICAgICArK0N1cnJlbnQ7CisgIH0KKworcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0gU3BlY2lmaWNBdHRyICo7CisgIHVzaW5nIHJlZmVyZW5jZSA9IFNwZWNpZmljQXR0ciAqOworICB1c2luZyBwb2ludGVyID0gU3BlY2lmaWNBdHRyICo7CisgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZzsKKyAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gc3RkOjpwdHJkaWZmX3Q7CisKKyAgc3BlY2lmaWNfYXR0cl9pdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgc3BlY2lmaWNfYXR0cl9pdGVyYXRvcihJdGVyYXRvciBpKSA6IEN1cnJlbnQoaSkge30KKworICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeworICAgIEFkdmFuY2VUb05leHQoKTsKKyAgICByZXR1cm4gY2FzdDxTcGVjaWZpY0F0dHI+KCpDdXJyZW50KTsKKyAgfQorICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgQWR2YW5jZVRvTmV4dCgpOworICAgIHJldHVybiBjYXN0PFNwZWNpZmljQXR0cj4oKkN1cnJlbnQpOworICB9CisKKyAgc3BlY2lmaWNfYXR0cl9pdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKKyAgICArK0N1cnJlbnQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIHNwZWNpZmljX2F0dHJfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBzcGVjaWZpY19hdHRyX2l0ZXJhdG9yIFRtcCgqdGhpcyk7CisgICAgKysoKnRoaXMpOworICAgIHJldHVybiBUbXA7CisgIH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KHNwZWNpZmljX2F0dHJfaXRlcmF0b3IgTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY19hdHRyX2l0ZXJhdG9yIFJpZ2h0KSB7CisgICAgYXNzZXJ0KChMZWZ0LkN1cnJlbnQgPT0gbnVsbHB0cikgPT0gKFJpZ2h0LkN1cnJlbnQgPT0gbnVsbHB0cikpOworICAgIGlmIChMZWZ0LkN1cnJlbnQgPCBSaWdodC5DdXJyZW50KQorICAgICAgTGVmdC5BZHZhbmNlVG9OZXh0KFJpZ2h0LkN1cnJlbnQpOyAKKyAgICBlbHNlCisgICAgICBSaWdodC5BZHZhbmNlVG9OZXh0KExlZnQuQ3VycmVudCk7CisgICAgcmV0dXJuIExlZnQuQ3VycmVudCA9PSBSaWdodC5DdXJyZW50OworICB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oc3BlY2lmaWNfYXR0cl9pdGVyYXRvciBMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljX2F0dHJfaXRlcmF0b3IgUmlnaHQpIHsKKyAgICByZXR1cm4gIShMZWZ0ID09IFJpZ2h0KTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNwZWNpZmljQXR0ciwgdHlwZW5hbWUgQ29udGFpbmVyPgoraW5saW5lIHNwZWNpZmljX2F0dHJfaXRlcmF0b3I8U3BlY2lmaWNBdHRyLCBDb250YWluZXI+CisgICAgICAgICAgc3BlY2lmaWNfYXR0cl9iZWdpbihjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikgeworICByZXR1cm4gc3BlY2lmaWNfYXR0cl9pdGVyYXRvcjxTcGVjaWZpY0F0dHIsIENvbnRhaW5lcj4oY29udGFpbmVyLmJlZ2luKCkpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIFNwZWNpZmljQXR0ciwgdHlwZW5hbWUgQ29udGFpbmVyPgoraW5saW5lIHNwZWNpZmljX2F0dHJfaXRlcmF0b3I8U3BlY2lmaWNBdHRyLCBDb250YWluZXI+CisgICAgICAgICAgc3BlY2lmaWNfYXR0cl9lbmQoY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpIHsKKyAgcmV0dXJuIHNwZWNpZmljX2F0dHJfaXRlcmF0b3I8U3BlY2lmaWNBdHRyLCBDb250YWluZXI+KGNvbnRhaW5lci5lbmQoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTcGVjaWZpY0F0dHIsIHR5cGVuYW1lIENvbnRhaW5lcj4KK2lubGluZSBib29sIGhhc1NwZWNpZmljQXR0cihjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikgeworICByZXR1cm4gc3BlY2lmaWNfYXR0cl9iZWdpbjxTcGVjaWZpY0F0dHI+KGNvbnRhaW5lcikgIT0KKyAgICAgICAgICBzcGVjaWZpY19hdHRyX2VuZDxTcGVjaWZpY0F0dHI+KGNvbnRhaW5lcik7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3BlY2lmaWNBdHRyLCB0eXBlbmFtZSBDb250YWluZXI+CitpbmxpbmUgU3BlY2lmaWNBdHRyICpnZXRTcGVjaWZpY0F0dHIoY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpIHsKKyAgc3BlY2lmaWNfYXR0cl9pdGVyYXRvcjxTcGVjaWZpY0F0dHIsIENvbnRhaW5lcj4gaSA9CisgICAgICBzcGVjaWZpY19hdHRyX2JlZ2luPFNwZWNpZmljQXR0cj4oY29udGFpbmVyKTsKKyAgaWYgKGkgIT0gc3BlY2lmaWNfYXR0cl9lbmQ8U3BlY2lmaWNBdHRyPihjb250YWluZXIpKQorICAgIHJldHVybiAqaTsKKyAgZWxzZQorICAgIHJldHVybiBudWxscHRyOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19BU1RfQVRUUklURVJBVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BdHRyVmlzaXRvci5pbmMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQXR0clZpc2l0b3IuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMTczNzIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQXR0clZpc2l0b3IuaW5jCkBAIC0wLDAgKzEsMzY0MiBAQAorLyo9PT0tIFRhYmxlR2VuJ2VyYXRlZCBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBVc2VkIGJ5IFJlY3Vyc2l2ZUFTVFZpc2l0b3IgdG8gdmlzaXQgYXR0cmlidXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGUsIGRvIG5vdCBlZGl0ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmZGVmIEFUVFJfVklTSVRPUl9ERUNMU19PTkxZCisKKyAgYm9vbCBUcmF2ZXJzZUFNREdQVUZsYXRXb3JrR3JvdXBTaXplQXR0cihBTURHUFVGbGF0V29ya0dyb3VwU2l6ZUF0dHIgKkEpOworICBib29sIFZpc2l0QU1ER1BVRmxhdFdvcmtHcm91cFNpemVBdHRyKEFNREdQVUZsYXRXb3JrR3JvdXBTaXplQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQU1ER1BVTnVtU0dQUkF0dHIoQU1ER1BVTnVtU0dQUkF0dHIgKkEpOworICBib29sIFZpc2l0QU1ER1BVTnVtU0dQUkF0dHIoQU1ER1BVTnVtU0dQUkF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUFNREdQVU51bVZHUFJBdHRyKEFNREdQVU51bVZHUFJBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEFNREdQVU51bVZHUFJBdHRyKEFNREdQVU51bVZHUFJBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VBTURHUFVXYXZlc1BlckVVQXR0cihBTURHUFVXYXZlc1BlckVVQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRBTURHUFVXYXZlc1BlckVVQXR0cihBTURHUFVXYXZlc1BlckVVQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQVJNSW50ZXJydXB0QXR0cihBUk1JbnRlcnJ1cHRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEFSTUludGVycnVwdEF0dHIoQVJNSW50ZXJydXB0QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQVZSSW50ZXJydXB0QXR0cihBVlJJbnRlcnJ1cHRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEFWUkludGVycnVwdEF0dHIoQVZSSW50ZXJydXB0QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQVZSU2lnbmFsQXR0cihBVlJTaWduYWxBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEFWUlNpZ25hbEF0dHIoQVZSU2lnbmFsQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQWJpVGFnQXR0cihBYmlUYWdBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEFiaVRhZ0F0dHIoQWJpVGFnQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQWNxdWlyZUNhcGFiaWxpdHlBdHRyKEFjcXVpcmVDYXBhYmlsaXR5QXR0ciAqQSk7CisgIGJvb2wgVmlzaXRBY3F1aXJlQ2FwYWJpbGl0eUF0dHIoQWNxdWlyZUNhcGFiaWxpdHlBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VBY3F1aXJlZEFmdGVyQXR0cihBY3F1aXJlZEFmdGVyQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRBY3F1aXJlZEFmdGVyQXR0cihBY3F1aXJlZEFmdGVyQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQWNxdWlyZWRCZWZvcmVBdHRyKEFjcXVpcmVkQmVmb3JlQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRBY3F1aXJlZEJlZm9yZUF0dHIoQWNxdWlyZWRCZWZvcmVBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VBbGlhc0F0dHIoQWxpYXNBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEFsaWFzQXR0cihBbGlhc0F0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUFsaWduTWFjNjhrQXR0cihBbGlnbk1hYzY4a0F0dHIgKkEpOworICBib29sIFZpc2l0QWxpZ25NYWM2OGtBdHRyKEFsaWduTWFjNjhrQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQWxpZ25WYWx1ZUF0dHIoQWxpZ25WYWx1ZUF0dHIgKkEpOworICBib29sIFZpc2l0QWxpZ25WYWx1ZUF0dHIoQWxpZ25WYWx1ZUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUFsaWduZWRBdHRyKEFsaWduZWRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEFsaWduZWRBdHRyKEFsaWduZWRBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VBbGxvY0FsaWduQXR0cihBbGxvY0FsaWduQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRBbGxvY0FsaWduQXR0cihBbGxvY0FsaWduQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQWxsb2NTaXplQXR0cihBbGxvY1NpemVBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEFsbG9jU2l6ZUF0dHIoQWxsb2NTaXplQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQWx3YXlzSW5saW5lQXR0cihBbHdheXNJbmxpbmVBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEFsd2F5c0lubGluZUF0dHIoQWx3YXlzSW5saW5lQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQW5hbHl6ZXJOb1JldHVybkF0dHIoQW5hbHl6ZXJOb1JldHVybkF0dHIgKkEpOworICBib29sIFZpc2l0QW5hbHl6ZXJOb1JldHVybkF0dHIoQW5hbHl6ZXJOb1JldHVybkF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUFubm90YXRlQXR0cihBbm5vdGF0ZUF0dHIgKkEpOworICBib29sIFZpc2l0QW5ub3RhdGVBdHRyKEFubm90YXRlQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQW55WDg2SW50ZXJydXB0QXR0cihBbnlYODZJbnRlcnJ1cHRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEFueVg4NkludGVycnVwdEF0dHIoQW55WDg2SW50ZXJydXB0QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQW55WDg2Tm9DYWxsZXJTYXZlZFJlZ2lzdGVyc0F0dHIoQW55WDg2Tm9DYWxsZXJTYXZlZFJlZ2lzdGVyc0F0dHIgKkEpOworICBib29sIFZpc2l0QW55WDg2Tm9DYWxsZXJTYXZlZFJlZ2lzdGVyc0F0dHIoQW55WDg2Tm9DYWxsZXJTYXZlZFJlZ2lzdGVyc0F0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUFueVg4Nk5vQ2ZDaGVja0F0dHIoQW55WDg2Tm9DZkNoZWNrQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRBbnlYODZOb0NmQ2hlY2tBdHRyKEFueVg4Nk5vQ2ZDaGVja0F0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUFyY1dlYWtyZWZVbmF2YWlsYWJsZUF0dHIoQXJjV2Vha3JlZlVuYXZhaWxhYmxlQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRBcmNXZWFrcmVmVW5hdmFpbGFibGVBdHRyKEFyY1dlYWtyZWZVbmF2YWlsYWJsZUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUFyZ3VtZW50V2l0aFR5cGVUYWdBdHRyKEFyZ3VtZW50V2l0aFR5cGVUYWdBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEFyZ3VtZW50V2l0aFR5cGVUYWdBdHRyKEFyZ3VtZW50V2l0aFR5cGVUYWdBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VBcnRpZmljaWFsQXR0cihBcnRpZmljaWFsQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRBcnRpZmljaWFsQXR0cihBcnRpZmljaWFsQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQXNtTGFiZWxBdHRyKEFzbUxhYmVsQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRBc21MYWJlbEF0dHIoQXNtTGFiZWxBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VBc3NlcnRDYXBhYmlsaXR5QXR0cihBc3NlcnRDYXBhYmlsaXR5QXR0ciAqQSk7CisgIGJvb2wgVmlzaXRBc3NlcnRDYXBhYmlsaXR5QXR0cihBc3NlcnRDYXBhYmlsaXR5QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQXNzZXJ0RXhjbHVzaXZlTG9ja0F0dHIoQXNzZXJ0RXhjbHVzaXZlTG9ja0F0dHIgKkEpOworICBib29sIFZpc2l0QXNzZXJ0RXhjbHVzaXZlTG9ja0F0dHIoQXNzZXJ0RXhjbHVzaXZlTG9ja0F0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUFzc2VydFNoYXJlZExvY2tBdHRyKEFzc2VydFNoYXJlZExvY2tBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEFzc2VydFNoYXJlZExvY2tBdHRyKEFzc2VydFNoYXJlZExvY2tBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VBc3N1bWVBbGlnbmVkQXR0cihBc3N1bWVBbGlnbmVkQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRBc3N1bWVBbGlnbmVkQXR0cihBc3N1bWVBbGlnbmVkQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQXZhaWxhYmlsaXR5QXR0cihBdmFpbGFiaWxpdHlBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEF2YWlsYWJpbGl0eUF0dHIoQXZhaWxhYmlsaXR5QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQmxvY2tzQXR0cihCbG9ja3NBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEJsb2Nrc0F0dHIoQmxvY2tzQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQzExTm9SZXR1cm5BdHRyKEMxMU5vUmV0dXJuQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRDMTFOb1JldHVybkF0dHIoQzExTm9SZXR1cm5BdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VDRGVjbEF0dHIoQ0RlY2xBdHRyICpBKTsKKyAgYm9vbCBWaXNpdENEZWNsQXR0cihDRGVjbEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUNGQXVkaXRlZFRyYW5zZmVyQXR0cihDRkF1ZGl0ZWRUcmFuc2ZlckF0dHIgKkEpOworICBib29sIFZpc2l0Q0ZBdWRpdGVkVHJhbnNmZXJBdHRyKENGQXVkaXRlZFRyYW5zZmVyQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQ0ZDb25zdW1lZEF0dHIoQ0ZDb25zdW1lZEF0dHIgKkEpOworICBib29sIFZpc2l0Q0ZDb25zdW1lZEF0dHIoQ0ZDb25zdW1lZEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUNGUmV0dXJuc05vdFJldGFpbmVkQXR0cihDRlJldHVybnNOb3RSZXRhaW5lZEF0dHIgKkEpOworICBib29sIFZpc2l0Q0ZSZXR1cm5zTm90UmV0YWluZWRBdHRyKENGUmV0dXJuc05vdFJldGFpbmVkQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQ0ZSZXR1cm5zUmV0YWluZWRBdHRyKENGUmV0dXJuc1JldGFpbmVkQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRDRlJldHVybnNSZXRhaW5lZEF0dHIoQ0ZSZXR1cm5zUmV0YWluZWRBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VDRlVua25vd25UcmFuc2ZlckF0dHIoQ0ZVbmtub3duVHJhbnNmZXJBdHRyICpBKTsKKyAgYm9vbCBWaXNpdENGVW5rbm93blRyYW5zZmVyQXR0cihDRlVua25vd25UcmFuc2ZlckF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUNVREFDb25zdGFudEF0dHIoQ1VEQUNvbnN0YW50QXR0ciAqQSk7CisgIGJvb2wgVmlzaXRDVURBQ29uc3RhbnRBdHRyKENVREFDb25zdGFudEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUNVREFEZXZpY2VBdHRyKENVREFEZXZpY2VBdHRyICpBKTsKKyAgYm9vbCBWaXNpdENVREFEZXZpY2VBdHRyKENVREFEZXZpY2VBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VDVURBR2xvYmFsQXR0cihDVURBR2xvYmFsQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRDVURBR2xvYmFsQXR0cihDVURBR2xvYmFsQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQ1VEQUhvc3RBdHRyKENVREFIb3N0QXR0ciAqQSk7CisgIGJvb2wgVmlzaXRDVURBSG9zdEF0dHIoQ1VEQUhvc3RBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VDVURBSW52YWxpZFRhcmdldEF0dHIoQ1VEQUludmFsaWRUYXJnZXRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdENVREFJbnZhbGlkVGFyZ2V0QXR0cihDVURBSW52YWxpZFRhcmdldEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUNVREFMYXVuY2hCb3VuZHNBdHRyKENVREFMYXVuY2hCb3VuZHNBdHRyICpBKTsKKyAgYm9vbCBWaXNpdENVREFMYXVuY2hCb3VuZHNBdHRyKENVREFMYXVuY2hCb3VuZHNBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VDVURBU2hhcmVkQXR0cihDVURBU2hhcmVkQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRDVURBU2hhcmVkQXR0cihDVURBU2hhcmVkQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQ1hYMTFOb1JldHVybkF0dHIoQ1hYMTFOb1JldHVybkF0dHIgKkEpOworICBib29sIFZpc2l0Q1hYMTFOb1JldHVybkF0dHIoQ1hYMTFOb1JldHVybkF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUNhbGxhYmxlV2hlbkF0dHIoQ2FsbGFibGVXaGVuQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRDYWxsYWJsZVdoZW5BdHRyKENhbGxhYmxlV2hlbkF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUNhcGFiaWxpdHlBdHRyKENhcGFiaWxpdHlBdHRyICpBKTsKKyAgYm9vbCBWaXNpdENhcGFiaWxpdHlBdHRyKENhcGFiaWxpdHlBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VDYXB0dXJlZFJlY29yZEF0dHIoQ2FwdHVyZWRSZWNvcmRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdENhcHR1cmVkUmVjb3JkQXR0cihDYXB0dXJlZFJlY29yZEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUNhcnJpZXNEZXBlbmRlbmN5QXR0cihDYXJyaWVzRGVwZW5kZW5jeUF0dHIgKkEpOworICBib29sIFZpc2l0Q2Fycmllc0RlcGVuZGVuY3lBdHRyKENhcnJpZXNEZXBlbmRlbmN5QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQ2xlYW51cEF0dHIoQ2xlYW51cEF0dHIgKkEpOworICBib29sIFZpc2l0Q2xlYW51cEF0dHIoQ2xlYW51cEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUNvbGRBdHRyKENvbGRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdENvbGRBdHRyKENvbGRBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VDb21tb25BdHRyKENvbW1vbkF0dHIgKkEpOworICBib29sIFZpc2l0Q29tbW9uQXR0cihDb21tb25BdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VDb25zdEF0dHIoQ29uc3RBdHRyICpBKTsKKyAgYm9vbCBWaXNpdENvbnN0QXR0cihDb25zdEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUNvbnN0cnVjdG9yQXR0cihDb25zdHJ1Y3RvckF0dHIgKkEpOworICBib29sIFZpc2l0Q29uc3RydWN0b3JBdHRyKENvbnN0cnVjdG9yQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlQ29uc3VtYWJsZUF0dHIoQ29uc3VtYWJsZUF0dHIgKkEpOworICBib29sIFZpc2l0Q29uc3VtYWJsZUF0dHIoQ29uc3VtYWJsZUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUNvbnN1bWFibGVBdXRvQ2FzdEF0dHIoQ29uc3VtYWJsZUF1dG9DYXN0QXR0ciAqQSk7CisgIGJvb2wgVmlzaXRDb25zdW1hYmxlQXV0b0Nhc3RBdHRyKENvbnN1bWFibGVBdXRvQ2FzdEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUNvbnN1bWFibGVTZXRPblJlYWRBdHRyKENvbnN1bWFibGVTZXRPblJlYWRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdENvbnN1bWFibGVTZXRPblJlYWRBdHRyKENvbnN1bWFibGVTZXRPblJlYWRBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VDb252ZXJnZW50QXR0cihDb252ZXJnZW50QXR0ciAqQSk7CisgIGJvb2wgVmlzaXRDb252ZXJnZW50QXR0cihDb252ZXJnZW50QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlRExMRXhwb3J0QXR0cihETExFeHBvcnRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdERMTEV4cG9ydEF0dHIoRExMRXhwb3J0QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlRExMSW1wb3J0QXR0cihETExJbXBvcnRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdERMTEltcG9ydEF0dHIoRExMSW1wb3J0QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlRGVwcmVjYXRlZEF0dHIoRGVwcmVjYXRlZEF0dHIgKkEpOworICBib29sIFZpc2l0RGVwcmVjYXRlZEF0dHIoRGVwcmVjYXRlZEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZURlc3RydWN0b3JBdHRyKERlc3RydWN0b3JBdHRyICpBKTsKKyAgYm9vbCBWaXNpdERlc3RydWN0b3JBdHRyKERlc3RydWN0b3JBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VEaWFnbm9zZUlmQXR0cihEaWFnbm9zZUlmQXR0ciAqQSk7CisgIGJvb2wgVmlzaXREaWFnbm9zZUlmQXR0cihEaWFnbm9zZUlmQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlRGlzYWJsZVRhaWxDYWxsc0F0dHIoRGlzYWJsZVRhaWxDYWxsc0F0dHIgKkEpOworICBib29sIFZpc2l0RGlzYWJsZVRhaWxDYWxsc0F0dHIoRGlzYWJsZVRhaWxDYWxsc0F0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUVtcHR5QmFzZXNBdHRyKEVtcHR5QmFzZXNBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEVtcHR5QmFzZXNBdHRyKEVtcHR5QmFzZXNBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VFbmFibGVJZkF0dHIoRW5hYmxlSWZBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEVuYWJsZUlmQXR0cihFbmFibGVJZkF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUVudW1FeHRlbnNpYmlsaXR5QXR0cihFbnVtRXh0ZW5zaWJpbGl0eUF0dHIgKkEpOworICBib29sIFZpc2l0RW51bUV4dGVuc2liaWxpdHlBdHRyKEVudW1FeHRlbnNpYmlsaXR5QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlRXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uQXR0cihFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb25BdHRyICpBKTsKKyAgYm9vbCBWaXNpdEV4Y2x1c2l2ZVRyeWxvY2tGdW5jdGlvbkF0dHIoRXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlRXh0ZXJuYWxTb3VyY2VTeW1ib2xBdHRyKEV4dGVybmFsU291cmNlU3ltYm9sQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRFeHRlcm5hbFNvdXJjZVN5bWJvbEF0dHIoRXh0ZXJuYWxTb3VyY2VTeW1ib2xBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VGYWxsVGhyb3VnaEF0dHIoRmFsbFRocm91Z2hBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEZhbGxUaHJvdWdoQXR0cihGYWxsVGhyb3VnaEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUZhc3RDYWxsQXR0cihGYXN0Q2FsbEF0dHIgKkEpOworICBib29sIFZpc2l0RmFzdENhbGxBdHRyKEZhc3RDYWxsQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlRmluYWxBdHRyKEZpbmFsQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRGaW5hbEF0dHIoRmluYWxBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VGbGFnRW51bUF0dHIoRmxhZ0VudW1BdHRyICpBKTsKKyAgYm9vbCBWaXNpdEZsYWdFbnVtQXR0cihGbGFnRW51bUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUZsYXR0ZW5BdHRyKEZsYXR0ZW5BdHRyICpBKTsKKyAgYm9vbCBWaXNpdEZsYXR0ZW5BdHRyKEZsYXR0ZW5BdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VGb3JtYXRBdHRyKEZvcm1hdEF0dHIgKkEpOworICBib29sIFZpc2l0Rm9ybWF0QXR0cihGb3JtYXRBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VGb3JtYXRBcmdBdHRyKEZvcm1hdEFyZ0F0dHIgKkEpOworICBib29sIFZpc2l0Rm9ybWF0QXJnQXR0cihGb3JtYXRBcmdBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VHTlVJbmxpbmVBdHRyKEdOVUlubGluZUF0dHIgKkEpOworICBib29sIFZpc2l0R05VSW5saW5lQXR0cihHTlVJbmxpbmVBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VHdWFyZGVkQnlBdHRyKEd1YXJkZWRCeUF0dHIgKkEpOworICBib29sIFZpc2l0R3VhcmRlZEJ5QXR0cihHdWFyZGVkQnlBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VHdWFyZGVkVmFyQXR0cihHdWFyZGVkVmFyQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRHdWFyZGVkVmFyQXR0cihHdWFyZGVkVmFyQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlSG90QXR0cihIb3RBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEhvdEF0dHIoSG90QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlSUJBY3Rpb25BdHRyKElCQWN0aW9uQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRJQkFjdGlvbkF0dHIoSUJBY3Rpb25BdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VJQk91dGxldEF0dHIoSUJPdXRsZXRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdElCT3V0bGV0QXR0cihJQk91dGxldEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUlCT3V0bGV0Q29sbGVjdGlvbkF0dHIoSUJPdXRsZXRDb2xsZWN0aW9uQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRJQk91dGxldENvbGxlY3Rpb25BdHRyKElCT3V0bGV0Q29sbGVjdGlvbkF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUlGdW5jQXR0cihJRnVuY0F0dHIgKkEpOworICBib29sIFZpc2l0SUZ1bmNBdHRyKElGdW5jQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlSW5pdFByaW9yaXR5QXR0cihJbml0UHJpb3JpdHlBdHRyICpBKTsKKyAgYm9vbCBWaXNpdEluaXRQcmlvcml0eUF0dHIoSW5pdFByaW9yaXR5QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlSW5pdFNlZ0F0dHIoSW5pdFNlZ0F0dHIgKkEpOworICBib29sIFZpc2l0SW5pdFNlZ0F0dHIoSW5pdFNlZ0F0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUludGVsT2NsQmljY0F0dHIoSW50ZWxPY2xCaWNjQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRJbnRlbE9jbEJpY2NBdHRyKEludGVsT2NsQmljY0F0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUludGVybmFsTGlua2FnZUF0dHIoSW50ZXJuYWxMaW5rYWdlQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRJbnRlcm5hbExpbmthZ2VBdHRyKEludGVybmFsTGlua2FnZUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUxUT1Zpc2liaWxpdHlQdWJsaWNBdHRyKExUT1Zpc2liaWxpdHlQdWJsaWNBdHRyICpBKTsKKyAgYm9vbCBWaXNpdExUT1Zpc2liaWxpdHlQdWJsaWNBdHRyKExUT1Zpc2liaWxpdHlQdWJsaWNBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VMYXlvdXRWZXJzaW9uQXR0cihMYXlvdXRWZXJzaW9uQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRMYXlvdXRWZXJzaW9uQXR0cihMYXlvdXRWZXJzaW9uQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlTG9ja1JldHVybmVkQXR0cihMb2NrUmV0dXJuZWRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdExvY2tSZXR1cm5lZEF0dHIoTG9ja1JldHVybmVkQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlTG9ja3NFeGNsdWRlZEF0dHIoTG9ja3NFeGNsdWRlZEF0dHIgKkEpOworICBib29sIFZpc2l0TG9ja3NFeGNsdWRlZEF0dHIoTG9ja3NFeGNsdWRlZEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZUxvb3BIaW50QXR0cihMb29wSGludEF0dHIgKkEpOworICBib29sIFZpc2l0TG9vcEhpbnRBdHRyKExvb3BIaW50QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlTVNBQklBdHRyKE1TQUJJQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRNU0FCSUF0dHIoTVNBQklBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VNU0luaGVyaXRhbmNlQXR0cihNU0luaGVyaXRhbmNlQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRNU0luaGVyaXRhbmNlQXR0cihNU0luaGVyaXRhbmNlQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlTVNOb1ZUYWJsZUF0dHIoTVNOb1ZUYWJsZUF0dHIgKkEpOworICBib29sIFZpc2l0TVNOb1ZUYWJsZUF0dHIoTVNOb1ZUYWJsZUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU1TUDQzMEludGVycnVwdEF0dHIoTVNQNDMwSW50ZXJydXB0QXR0ciAqQSk7CisgIGJvb2wgVmlzaXRNU1A0MzBJbnRlcnJ1cHRBdHRyKE1TUDQzMEludGVycnVwdEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU1TU3RydWN0QXR0cihNU1N0cnVjdEF0dHIgKkEpOworICBib29sIFZpc2l0TVNTdHJ1Y3RBdHRyKE1TU3RydWN0QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlTVNWdG9yRGlzcEF0dHIoTVNWdG9yRGlzcEF0dHIgKkEpOworICBib29sIFZpc2l0TVNWdG9yRGlzcEF0dHIoTVNWdG9yRGlzcEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU1heEZpZWxkQWxpZ25tZW50QXR0cihNYXhGaWVsZEFsaWdubWVudEF0dHIgKkEpOworICBib29sIFZpc2l0TWF4RmllbGRBbGlnbm1lbnRBdHRyKE1heEZpZWxkQWxpZ25tZW50QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlTWF5QWxpYXNBdHRyKE1heUFsaWFzQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRNYXlBbGlhc0F0dHIoTWF5QWxpYXNBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VNaWNyb01pcHNBdHRyKE1pY3JvTWlwc0F0dHIgKkEpOworICBib29sIFZpc2l0TWljcm9NaXBzQXR0cihNaWNyb01pcHNBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VNaW5TaXplQXR0cihNaW5TaXplQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRNaW5TaXplQXR0cihNaW5TaXplQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlTWlwczE2QXR0cihNaXBzMTZBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE1pcHMxNkF0dHIoTWlwczE2QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlTWlwc0ludGVycnVwdEF0dHIoTWlwc0ludGVycnVwdEF0dHIgKkEpOworICBib29sIFZpc2l0TWlwc0ludGVycnVwdEF0dHIoTWlwc0ludGVycnVwdEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU1pcHNMb25nQ2FsbEF0dHIoTWlwc0xvbmdDYWxsQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRNaXBzTG9uZ0NhbGxBdHRyKE1pcHNMb25nQ2FsbEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU1pcHNTaG9ydENhbGxBdHRyKE1pcHNTaG9ydENhbGxBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE1pcHNTaG9ydENhbGxBdHRyKE1pcHNTaG9ydENhbGxBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VNb2RlQXR0cihNb2RlQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRNb2RlQXR0cihNb2RlQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlTlNDb25zdW1lZEF0dHIoTlNDb25zdW1lZEF0dHIgKkEpOworICBib29sIFZpc2l0TlNDb25zdW1lZEF0dHIoTlNDb25zdW1lZEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU5TQ29uc3VtZXNTZWxmQXR0cihOU0NvbnN1bWVzU2VsZkF0dHIgKkEpOworICBib29sIFZpc2l0TlNDb25zdW1lc1NlbGZBdHRyKE5TQ29uc3VtZXNTZWxmQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlTlNSZXR1cm5zQXV0b3JlbGVhc2VkQXR0cihOU1JldHVybnNBdXRvcmVsZWFzZWRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE5TUmV0dXJuc0F1dG9yZWxlYXNlZEF0dHIoTlNSZXR1cm5zQXV0b3JlbGVhc2VkQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlTlNSZXR1cm5zTm90UmV0YWluZWRBdHRyKE5TUmV0dXJuc05vdFJldGFpbmVkQXR0ciAqQSk7CisgIGJvb2wgVmlzaXROU1JldHVybnNOb3RSZXRhaW5lZEF0dHIoTlNSZXR1cm5zTm90UmV0YWluZWRBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VOU1JldHVybnNSZXRhaW5lZEF0dHIoTlNSZXR1cm5zUmV0YWluZWRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE5TUmV0dXJuc1JldGFpbmVkQXR0cihOU1JldHVybnNSZXRhaW5lZEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU5ha2VkQXR0cihOYWtlZEF0dHIgKkEpOworICBib29sIFZpc2l0TmFrZWRBdHRyKE5ha2VkQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlTm9BbGlhc0F0dHIoTm9BbGlhc0F0dHIgKkEpOworICBib29sIFZpc2l0Tm9BbGlhc0F0dHIoTm9BbGlhc0F0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU5vQ29tbW9uQXR0cihOb0NvbW1vbkF0dHIgKkEpOworICBib29sIFZpc2l0Tm9Db21tb25BdHRyKE5vQ29tbW9uQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlTm9EZWJ1Z0F0dHIoTm9EZWJ1Z0F0dHIgKkEpOworICBib29sIFZpc2l0Tm9EZWJ1Z0F0dHIoTm9EZWJ1Z0F0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU5vRHVwbGljYXRlQXR0cihOb0R1cGxpY2F0ZUF0dHIgKkEpOworICBib29sIFZpc2l0Tm9EdXBsaWNhdGVBdHRyKE5vRHVwbGljYXRlQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlTm9Fc2NhcGVBdHRyKE5vRXNjYXBlQXR0ciAqQSk7CisgIGJvb2wgVmlzaXROb0VzY2FwZUF0dHIoTm9Fc2NhcGVBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VOb0lubGluZUF0dHIoTm9JbmxpbmVBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE5vSW5saW5lQXR0cihOb0lubGluZUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU5vSW5zdHJ1bWVudEZ1bmN0aW9uQXR0cihOb0luc3RydW1lbnRGdW5jdGlvbkF0dHIgKkEpOworICBib29sIFZpc2l0Tm9JbnN0cnVtZW50RnVuY3Rpb25BdHRyKE5vSW5zdHJ1bWVudEZ1bmN0aW9uQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlTm9NaWNyb01pcHNBdHRyKE5vTWljcm9NaXBzQXR0ciAqQSk7CisgIGJvb2wgVmlzaXROb01pY3JvTWlwc0F0dHIoTm9NaWNyb01pcHNBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VOb01pcHMxNkF0dHIoTm9NaXBzMTZBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE5vTWlwczE2QXR0cihOb01pcHMxNkF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU5vUmV0dXJuQXR0cihOb1JldHVybkF0dHIgKkEpOworICBib29sIFZpc2l0Tm9SZXR1cm5BdHRyKE5vUmV0dXJuQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlTm9TYW5pdGl6ZUF0dHIoTm9TYW5pdGl6ZUF0dHIgKkEpOworICBib29sIFZpc2l0Tm9TYW5pdGl6ZUF0dHIoTm9TYW5pdGl6ZUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU5vU3BsaXRTdGFja0F0dHIoTm9TcGxpdFN0YWNrQXR0ciAqQSk7CisgIGJvb2wgVmlzaXROb1NwbGl0U3RhY2tBdHRyKE5vU3BsaXRTdGFja0F0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU5vVGhyZWFkU2FmZXR5QW5hbHlzaXNBdHRyKE5vVGhyZWFkU2FmZXR5QW5hbHlzaXNBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE5vVGhyZWFkU2FmZXR5QW5hbHlzaXNBdHRyKE5vVGhyZWFkU2FmZXR5QW5hbHlzaXNBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VOb1Rocm93QXR0cihOb1Rocm93QXR0ciAqQSk7CisgIGJvb2wgVmlzaXROb1Rocm93QXR0cihOb1Rocm93QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlTm9uTnVsbEF0dHIoTm9uTnVsbEF0dHIgKkEpOworICBib29sIFZpc2l0Tm9uTnVsbEF0dHIoTm9uTnVsbEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU5vdFRhaWxDYWxsZWRBdHRyKE5vdFRhaWxDYWxsZWRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE5vdFRhaWxDYWxsZWRBdHRyKE5vdFRhaWxDYWxsZWRBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VPTVBDYXB0dXJlS2luZEF0dHIoT01QQ2FwdHVyZUtpbmRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE9NUENhcHR1cmVLaW5kQXR0cihPTVBDYXB0dXJlS2luZEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU9NUENhcHR1cmVOb0luaXRBdHRyKE9NUENhcHR1cmVOb0luaXRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE9NUENhcHR1cmVOb0luaXRBdHRyKE9NUENhcHR1cmVOb0luaXRBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VPTVBEZWNsYXJlU2ltZERlY2xBdHRyKE9NUERlY2xhcmVTaW1kRGVjbEF0dHIgKkEpOworICBib29sIFZpc2l0T01QRGVjbGFyZVNpbWREZWNsQXR0cihPTVBEZWNsYXJlU2ltZERlY2xBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VPTVBEZWNsYXJlVGFyZ2V0RGVjbEF0dHIoT01QRGVjbGFyZVRhcmdldERlY2xBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE9NUERlY2xhcmVUYXJnZXREZWNsQXR0cihPTVBEZWNsYXJlVGFyZ2V0RGVjbEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU9NUFJlZmVyZW5jZWRWYXJBdHRyKE9NUFJlZmVyZW5jZWRWYXJBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE9NUFJlZmVyZW5jZWRWYXJBdHRyKE9NUFJlZmVyZW5jZWRWYXJBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VPTVBUaHJlYWRQcml2YXRlRGVjbEF0dHIoT01QVGhyZWFkUHJpdmF0ZURlY2xBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE9NUFRocmVhZFByaXZhdGVEZWNsQXR0cihPTVBUaHJlYWRQcml2YXRlRGVjbEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU9iakNCb3hhYmxlQXR0cihPYmpDQm94YWJsZUF0dHIgKkEpOworICBib29sIFZpc2l0T2JqQ0JveGFibGVBdHRyKE9iakNCb3hhYmxlQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlT2JqQ0JyaWRnZUF0dHIoT2JqQ0JyaWRnZUF0dHIgKkEpOworICBib29sIFZpc2l0T2JqQ0JyaWRnZUF0dHIoT2JqQ0JyaWRnZUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU9iakNCcmlkZ2VNdXRhYmxlQXR0cihPYmpDQnJpZGdlTXV0YWJsZUF0dHIgKkEpOworICBib29sIFZpc2l0T2JqQ0JyaWRnZU11dGFibGVBdHRyKE9iakNCcmlkZ2VNdXRhYmxlQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlT2JqQ0JyaWRnZVJlbGF0ZWRBdHRyKE9iakNCcmlkZ2VSZWxhdGVkQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRPYmpDQnJpZGdlUmVsYXRlZEF0dHIoT2JqQ0JyaWRnZVJlbGF0ZWRBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VPYmpDRGVzaWduYXRlZEluaXRpYWxpemVyQXR0cihPYmpDRGVzaWduYXRlZEluaXRpYWxpemVyQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRPYmpDRGVzaWduYXRlZEluaXRpYWxpemVyQXR0cihPYmpDRGVzaWduYXRlZEluaXRpYWxpemVyQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlT2JqQ0V4Y2VwdGlvbkF0dHIoT2JqQ0V4Y2VwdGlvbkF0dHIgKkEpOworICBib29sIFZpc2l0T2JqQ0V4Y2VwdGlvbkF0dHIoT2JqQ0V4Y2VwdGlvbkF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU9iakNFeHBsaWNpdFByb3RvY29sSW1wbEF0dHIoT2JqQ0V4cGxpY2l0UHJvdG9jb2xJbXBsQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRPYmpDRXhwbGljaXRQcm90b2NvbEltcGxBdHRyKE9iakNFeHBsaWNpdFByb3RvY29sSW1wbEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU9iakNJbmRlcGVuZGVudENsYXNzQXR0cihPYmpDSW5kZXBlbmRlbnRDbGFzc0F0dHIgKkEpOworICBib29sIFZpc2l0T2JqQ0luZGVwZW5kZW50Q2xhc3NBdHRyKE9iakNJbmRlcGVuZGVudENsYXNzQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlT2JqQ01ldGhvZEZhbWlseUF0dHIoT2JqQ01ldGhvZEZhbWlseUF0dHIgKkEpOworICBib29sIFZpc2l0T2JqQ01ldGhvZEZhbWlseUF0dHIoT2JqQ01ldGhvZEZhbWlseUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU9iakNOU09iamVjdEF0dHIoT2JqQ05TT2JqZWN0QXR0ciAqQSk7CisgIGJvb2wgVmlzaXRPYmpDTlNPYmplY3RBdHRyKE9iakNOU09iamVjdEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU9iakNQcmVjaXNlTGlmZXRpbWVBdHRyKE9iakNQcmVjaXNlTGlmZXRpbWVBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE9iakNQcmVjaXNlTGlmZXRpbWVBdHRyKE9iakNQcmVjaXNlTGlmZXRpbWVBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VPYmpDUmVxdWlyZXNQcm9wZXJ0eURlZnNBdHRyKE9iakNSZXF1aXJlc1Byb3BlcnR5RGVmc0F0dHIgKkEpOworICBib29sIFZpc2l0T2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzQXR0cihPYmpDUmVxdWlyZXNQcm9wZXJ0eURlZnNBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VPYmpDUmVxdWlyZXNTdXBlckF0dHIoT2JqQ1JlcXVpcmVzU3VwZXJBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE9iakNSZXF1aXJlc1N1cGVyQXR0cihPYmpDUmVxdWlyZXNTdXBlckF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU9iakNSZXR1cm5zSW5uZXJQb2ludGVyQXR0cihPYmpDUmV0dXJuc0lubmVyUG9pbnRlckF0dHIgKkEpOworICBib29sIFZpc2l0T2JqQ1JldHVybnNJbm5lclBvaW50ZXJBdHRyKE9iakNSZXR1cm5zSW5uZXJQb2ludGVyQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlT2JqQ1Jvb3RDbGFzc0F0dHIoT2JqQ1Jvb3RDbGFzc0F0dHIgKkEpOworICBib29sIFZpc2l0T2JqQ1Jvb3RDbGFzc0F0dHIoT2JqQ1Jvb3RDbGFzc0F0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU9iakNSdW50aW1lTmFtZUF0dHIoT2JqQ1J1bnRpbWVOYW1lQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRPYmpDUnVudGltZU5hbWVBdHRyKE9iakNSdW50aW1lTmFtZUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU9iakNSdW50aW1lVmlzaWJsZUF0dHIoT2JqQ1J1bnRpbWVWaXNpYmxlQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRPYmpDUnVudGltZVZpc2libGVBdHRyKE9iakNSdW50aW1lVmlzaWJsZUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZU9iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWRBdHRyKE9iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE9iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWRBdHRyKE9iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWRBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VPcGVuQ0xBY2Nlc3NBdHRyKE9wZW5DTEFjY2Vzc0F0dHIgKkEpOworICBib29sIFZpc2l0T3BlbkNMQWNjZXNzQXR0cihPcGVuQ0xBY2Nlc3NBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VPcGVuQ0xJbnRlbFJlcWRTdWJHcm91cFNpemVBdHRyKE9wZW5DTEludGVsUmVxZFN1Ykdyb3VwU2l6ZUF0dHIgKkEpOworICBib29sIFZpc2l0T3BlbkNMSW50ZWxSZXFkU3ViR3JvdXBTaXplQXR0cihPcGVuQ0xJbnRlbFJlcWRTdWJHcm91cFNpemVBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VPcGVuQ0xLZXJuZWxBdHRyKE9wZW5DTEtlcm5lbEF0dHIgKkEpOworICBib29sIFZpc2l0T3BlbkNMS2VybmVsQXR0cihPcGVuQ0xLZXJuZWxBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VPcGVuQ0xVbnJvbGxIaW50QXR0cihPcGVuQ0xVbnJvbGxIaW50QXR0ciAqQSk7CisgIGJvb2wgVmlzaXRPcGVuQ0xVbnJvbGxIaW50QXR0cihPcGVuQ0xVbnJvbGxIaW50QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlT3B0aW1pemVOb25lQXR0cihPcHRpbWl6ZU5vbmVBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE9wdGltaXplTm9uZUF0dHIoT3B0aW1pemVOb25lQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlT3ZlcmxvYWRhYmxlQXR0cihPdmVybG9hZGFibGVBdHRyICpBKTsKKyAgYm9vbCBWaXNpdE92ZXJsb2FkYWJsZUF0dHIoT3ZlcmxvYWRhYmxlQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlT3ZlcnJpZGVBdHRyKE92ZXJyaWRlQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRPdmVycmlkZUF0dHIoT3ZlcnJpZGVBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VPd25lcnNoaXBBdHRyKE93bmVyc2hpcEF0dHIgKkEpOworICBib29sIFZpc2l0T3duZXJzaGlwQXR0cihPd25lcnNoaXBBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VQYWNrZWRBdHRyKFBhY2tlZEF0dHIgKkEpOworICBib29sIFZpc2l0UGFja2VkQXR0cihQYWNrZWRBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VQYXJhbVR5cGVzdGF0ZUF0dHIoUGFyYW1UeXBlc3RhdGVBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFBhcmFtVHlwZXN0YXRlQXR0cihQYXJhbVR5cGVzdGF0ZUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVBhc2NhbEF0dHIoUGFzY2FsQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRQYXNjYWxBdHRyKFBhc2NhbEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVBhc3NPYmplY3RTaXplQXR0cihQYXNzT2JqZWN0U2l6ZUF0dHIgKkEpOworICBib29sIFZpc2l0UGFzc09iamVjdFNpemVBdHRyKFBhc3NPYmplY3RTaXplQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlUGNzQXR0cihQY3NBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFBjc0F0dHIoUGNzQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlUHJhZ21hQ2xhbmdCU1NTZWN0aW9uQXR0cihQcmFnbWFDbGFuZ0JTU1NlY3Rpb25BdHRyICpBKTsKKyAgYm9vbCBWaXNpdFByYWdtYUNsYW5nQlNTU2VjdGlvbkF0dHIoUHJhZ21hQ2xhbmdCU1NTZWN0aW9uQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlUHJhZ21hQ2xhbmdEYXRhU2VjdGlvbkF0dHIoUHJhZ21hQ2xhbmdEYXRhU2VjdGlvbkF0dHIgKkEpOworICBib29sIFZpc2l0UHJhZ21hQ2xhbmdEYXRhU2VjdGlvbkF0dHIoUHJhZ21hQ2xhbmdEYXRhU2VjdGlvbkF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVByYWdtYUNsYW5nUm9kYXRhU2VjdGlvbkF0dHIoUHJhZ21hQ2xhbmdSb2RhdGFTZWN0aW9uQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb25BdHRyKFByYWdtYUNsYW5nUm9kYXRhU2VjdGlvbkF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVByYWdtYUNsYW5nVGV4dFNlY3Rpb25BdHRyKFByYWdtYUNsYW5nVGV4dFNlY3Rpb25BdHRyICpBKTsKKyAgYm9vbCBWaXNpdFByYWdtYUNsYW5nVGV4dFNlY3Rpb25BdHRyKFByYWdtYUNsYW5nVGV4dFNlY3Rpb25BdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VQcmVzZXJ2ZUFsbEF0dHIoUHJlc2VydmVBbGxBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFByZXNlcnZlQWxsQXR0cihQcmVzZXJ2ZUFsbEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVByZXNlcnZlTW9zdEF0dHIoUHJlc2VydmVNb3N0QXR0ciAqQSk7CisgIGJvb2wgVmlzaXRQcmVzZXJ2ZU1vc3RBdHRyKFByZXNlcnZlTW9zdEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVB0R3VhcmRlZEJ5QXR0cihQdEd1YXJkZWRCeUF0dHIgKkEpOworICBib29sIFZpc2l0UHRHdWFyZGVkQnlBdHRyKFB0R3VhcmRlZEJ5QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlUHRHdWFyZGVkVmFyQXR0cihQdEd1YXJkZWRWYXJBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFB0R3VhcmRlZFZhckF0dHIoUHRHdWFyZGVkVmFyQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlUHVyZUF0dHIoUHVyZUF0dHIgKkEpOworICBib29sIFZpc2l0UHVyZUF0dHIoUHVyZUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVJlZ0NhbGxBdHRyKFJlZ0NhbGxBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFJlZ0NhbGxBdHRyKFJlZ0NhbGxBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VSZWxlYXNlQ2FwYWJpbGl0eUF0dHIoUmVsZWFzZUNhcGFiaWxpdHlBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFJlbGVhc2VDYXBhYmlsaXR5QXR0cihSZWxlYXNlQ2FwYWJpbGl0eUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVJlbmRlclNjcmlwdEtlcm5lbEF0dHIoUmVuZGVyU2NyaXB0S2VybmVsQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRSZW5kZXJTY3JpcHRLZXJuZWxBdHRyKFJlbmRlclNjcmlwdEtlcm5lbEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVJlcWRXb3JrR3JvdXBTaXplQXR0cihSZXFkV29ya0dyb3VwU2l6ZUF0dHIgKkEpOworICBib29sIFZpc2l0UmVxZFdvcmtHcm91cFNpemVBdHRyKFJlcWRXb3JrR3JvdXBTaXplQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlUmVxdWlyZUNvbnN0YW50SW5pdEF0dHIoUmVxdWlyZUNvbnN0YW50SW5pdEF0dHIgKkEpOworICBib29sIFZpc2l0UmVxdWlyZUNvbnN0YW50SW5pdEF0dHIoUmVxdWlyZUNvbnN0YW50SW5pdEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVJlcXVpcmVzQ2FwYWJpbGl0eUF0dHIoUmVxdWlyZXNDYXBhYmlsaXR5QXR0ciAqQSk7CisgIGJvb2wgVmlzaXRSZXF1aXJlc0NhcGFiaWxpdHlBdHRyKFJlcXVpcmVzQ2FwYWJpbGl0eUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVJlc3RyaWN0QXR0cihSZXN0cmljdEF0dHIgKkEpOworICBib29sIFZpc2l0UmVzdHJpY3RBdHRyKFJlc3RyaWN0QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlUmV0dXJuVHlwZXN0YXRlQXR0cihSZXR1cm5UeXBlc3RhdGVBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFJldHVyblR5cGVzdGF0ZUF0dHIoUmV0dXJuVHlwZXN0YXRlQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlUmV0dXJuc05vbk51bGxBdHRyKFJldHVybnNOb25OdWxsQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRSZXR1cm5zTm9uTnVsbEF0dHIoUmV0dXJuc05vbk51bGxBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VSZXR1cm5zVHdpY2VBdHRyKFJldHVybnNUd2ljZUF0dHIgKkEpOworICBib29sIFZpc2l0UmV0dXJuc1R3aWNlQXR0cihSZXR1cm5zVHdpY2VBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VTY29wZWRMb2NrYWJsZUF0dHIoU2NvcGVkTG9ja2FibGVBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFNjb3BlZExvY2thYmxlQXR0cihTY29wZWRMb2NrYWJsZUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVNlY3Rpb25BdHRyKFNlY3Rpb25BdHRyICpBKTsKKyAgYm9vbCBWaXNpdFNlY3Rpb25BdHRyKFNlY3Rpb25BdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VTZWxlY3RBbnlBdHRyKFNlbGVjdEFueUF0dHIgKkEpOworICBib29sIFZpc2l0U2VsZWN0QW55QXR0cihTZWxlY3RBbnlBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VTZW50aW5lbEF0dHIoU2VudGluZWxBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFNlbnRpbmVsQXR0cihTZW50aW5lbEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVNldFR5cGVzdGF0ZUF0dHIoU2V0VHlwZXN0YXRlQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRTZXRUeXBlc3RhdGVBdHRyKFNldFR5cGVzdGF0ZUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVNoYXJlZFRyeWxvY2tGdW5jdGlvbkF0dHIoU2hhcmVkVHJ5bG9ja0Z1bmN0aW9uQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRTaGFyZWRUcnlsb2NrRnVuY3Rpb25BdHRyKFNoYXJlZFRyeWxvY2tGdW5jdGlvbkF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVN0ZENhbGxBdHRyKFN0ZENhbGxBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFN0ZENhbGxBdHRyKFN0ZENhbGxBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VTdXBwcmVzc0F0dHIoU3VwcHJlc3NBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFN1cHByZXNzQXR0cihTdXBwcmVzc0F0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVN3aWZ0Q2FsbEF0dHIoU3dpZnRDYWxsQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRTd2lmdENhbGxBdHRyKFN3aWZ0Q2FsbEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVN3aWZ0Q29udGV4dEF0dHIoU3dpZnRDb250ZXh0QXR0ciAqQSk7CisgIGJvb2wgVmlzaXRTd2lmdENvbnRleHRBdHRyKFN3aWZ0Q29udGV4dEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVN3aWZ0RXJyb3JSZXN1bHRBdHRyKFN3aWZ0RXJyb3JSZXN1bHRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFN3aWZ0RXJyb3JSZXN1bHRBdHRyKFN3aWZ0RXJyb3JSZXN1bHRBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VTd2lmdEluZGlyZWN0UmVzdWx0QXR0cihTd2lmdEluZGlyZWN0UmVzdWx0QXR0ciAqQSk7CisgIGJvb2wgVmlzaXRTd2lmdEluZGlyZWN0UmVzdWx0QXR0cihTd2lmdEluZGlyZWN0UmVzdWx0QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlU3lzVkFCSUF0dHIoU3lzVkFCSUF0dHIgKkEpOworICBib29sIFZpc2l0U3lzVkFCSUF0dHIoU3lzVkFCSUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVRMU01vZGVsQXR0cihUTFNNb2RlbEF0dHIgKkEpOworICBib29sIFZpc2l0VExTTW9kZWxBdHRyKFRMU01vZGVsQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlVGFyZ2V0QXR0cihUYXJnZXRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFRhcmdldEF0dHIoVGFyZ2V0QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlVGVzdFR5cGVzdGF0ZUF0dHIoVGVzdFR5cGVzdGF0ZUF0dHIgKkEpOworICBib29sIFZpc2l0VGVzdFR5cGVzdGF0ZUF0dHIoVGVzdFR5cGVzdGF0ZUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVRoaXNDYWxsQXR0cihUaGlzQ2FsbEF0dHIgKkEpOworICBib29sIFZpc2l0VGhpc0NhbGxBdHRyKFRoaXNDYWxsQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlVGhyZWFkQXR0cihUaHJlYWRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFRocmVhZEF0dHIoVGhyZWFkQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlVHJhbnNwYXJlbnRVbmlvbkF0dHIoVHJhbnNwYXJlbnRVbmlvbkF0dHIgKkEpOworICBib29sIFZpc2l0VHJhbnNwYXJlbnRVbmlvbkF0dHIoVHJhbnNwYXJlbnRVbmlvbkF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVRyaXZpYWxBQklBdHRyKFRyaXZpYWxBQklBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFRyaXZpYWxBQklBdHRyKFRyaXZpYWxBQklBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VUcnlBY3F1aXJlQ2FwYWJpbGl0eUF0dHIoVHJ5QWNxdWlyZUNhcGFiaWxpdHlBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFRyeUFjcXVpcmVDYXBhYmlsaXR5QXR0cihUcnlBY3F1aXJlQ2FwYWJpbGl0eUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVR5cGVUYWdGb3JEYXRhdHlwZUF0dHIoVHlwZVRhZ0ZvckRhdGF0eXBlQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRUeXBlVGFnRm9yRGF0YXR5cGVBdHRyKFR5cGVUYWdGb3JEYXRhdHlwZUF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVR5cGVWaXNpYmlsaXR5QXR0cihUeXBlVmlzaWJpbGl0eUF0dHIgKkEpOworICBib29sIFZpc2l0VHlwZVZpc2liaWxpdHlBdHRyKFR5cGVWaXNpYmlsaXR5QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlVW5hdmFpbGFibGVBdHRyKFVuYXZhaWxhYmxlQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRVbmF2YWlsYWJsZUF0dHIoVW5hdmFpbGFibGVBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VVbnVzZWRBdHRyKFVudXNlZEF0dHIgKkEpOworICBib29sIFZpc2l0VW51c2VkQXR0cihVbnVzZWRBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VVc2VkQXR0cihVc2VkQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRVc2VkQXR0cihVc2VkQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlVXVpZEF0dHIoVXVpZEF0dHIgKkEpOworICBib29sIFZpc2l0VXVpZEF0dHIoVXVpZEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVZlY1JldHVybkF0dHIoVmVjUmV0dXJuQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRWZWNSZXR1cm5BdHRyKFZlY1JldHVybkF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVZlY1R5cGVIaW50QXR0cihWZWNUeXBlSGludEF0dHIgKkEpOworICBib29sIFZpc2l0VmVjVHlwZUhpbnRBdHRyKFZlY1R5cGVIaW50QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlVmVjdG9yQ2FsbEF0dHIoVmVjdG9yQ2FsbEF0dHIgKkEpOworICBib29sIFZpc2l0VmVjdG9yQ2FsbEF0dHIoVmVjdG9yQ2FsbEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVZpc2liaWxpdHlBdHRyKFZpc2liaWxpdHlBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFZpc2liaWxpdHlBdHRyKFZpc2liaWxpdHlBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VXYXJuVW51c2VkQXR0cihXYXJuVW51c2VkQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRXYXJuVW51c2VkQXR0cihXYXJuVW51c2VkQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlV2FyblVudXNlZFJlc3VsdEF0dHIoV2FyblVudXNlZFJlc3VsdEF0dHIgKkEpOworICBib29sIFZpc2l0V2FyblVudXNlZFJlc3VsdEF0dHIoV2FyblVudXNlZFJlc3VsdEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVdlYWtBdHRyKFdlYWtBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFdlYWtBdHRyKFdlYWtBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VXZWFrSW1wb3J0QXR0cihXZWFrSW1wb3J0QXR0ciAqQSk7CisgIGJvb2wgVmlzaXRXZWFrSW1wb3J0QXR0cihXZWFrSW1wb3J0QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlV2Vha1JlZkF0dHIoV2Vha1JlZkF0dHIgKkEpOworICBib29sIFZpc2l0V2Vha1JlZkF0dHIoV2Vha1JlZkF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVdvcmtHcm91cFNpemVIaW50QXR0cihXb3JrR3JvdXBTaXplSGludEF0dHIgKkEpOworICBib29sIFZpc2l0V29ya0dyb3VwU2l6ZUhpbnRBdHRyKFdvcmtHcm91cFNpemVIaW50QXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorICBib29sIFRyYXZlcnNlWDg2Rm9yY2VBbGlnbkFyZ1BvaW50ZXJBdHRyKFg4NkZvcmNlQWxpZ25BcmdQb2ludGVyQXR0ciAqQSk7CisgIGJvb2wgVmlzaXRYODZGb3JjZUFsaWduQXJnUG9pbnRlckF0dHIoWDg2Rm9yY2VBbGlnbkFyZ1BvaW50ZXJBdHRyICpBKSB7CisgICAgcmV0dXJuIHRydWU7IAorICB9CisgIGJvb2wgVHJhdmVyc2VYUmF5SW5zdHJ1bWVudEF0dHIoWFJheUluc3RydW1lbnRBdHRyICpBKTsKKyAgYm9vbCBWaXNpdFhSYXlJbnN0cnVtZW50QXR0cihYUmF5SW5zdHJ1bWVudEF0dHIgKkEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgCisgIH0KKyAgYm9vbCBUcmF2ZXJzZVhSYXlMb2dBcmdzQXR0cihYUmF5TG9nQXJnc0F0dHIgKkEpOworICBib29sIFZpc2l0WFJheUxvZ0FyZ3NBdHRyKFhSYXlMb2dBcmdzQXR0ciAqQSkgeworICAgIHJldHVybiB0cnVlOyAKKyAgfQorCisjZWxzZSAvLyBBVFRSX1ZJU0lUT1JfREVDTFNfT05MWQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUFNREdQVUZsYXRXb3JrR3JvdXBTaXplQXR0cihBTURHUFVGbGF0V29ya0dyb3VwU2l6ZUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBTURHUFVGbGF0V29ya0dyb3VwU2l6ZUF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VBTURHUFVOdW1TR1BSQXR0cihBTURHUFVOdW1TR1BSQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEFNREdQVU51bVNHUFJBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQU1ER1BVTnVtVkdQUkF0dHIoQU1ER1BVTnVtVkdQUkF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBTURHUFVOdW1WR1BSQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUFNREdQVVdhdmVzUGVyRVVBdHRyKEFNREdQVVdhdmVzUGVyRVVBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QU1ER1BVV2F2ZXNQZXJFVUF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VBUk1JbnRlcnJ1cHRBdHRyKEFSTUludGVycnVwdEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBUk1JbnRlcnJ1cHRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQVZSSW50ZXJydXB0QXR0cihBVlJJbnRlcnJ1cHRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QVZSSW50ZXJydXB0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUFWUlNpZ25hbEF0dHIoQVZSU2lnbmFsQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEFWUlNpZ25hbEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VBYmlUYWdBdHRyKEFiaVRhZ0F0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBYmlUYWdBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQWNxdWlyZUNhcGFiaWxpdHlBdHRyKEFjcXVpcmVDYXBhYmlsaXR5QXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEFjcXVpcmVDYXBhYmlsaXR5QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHsKKyAgICBFeHByICogKkkgPSBBLT5hcmdzX2JlZ2luKCk7CisgICAgRXhwciAqICpFID0gQS0+YXJnc19lbmQoKTsKKyAgICBmb3IgKDsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmICghZ2V0RGVyaXZlZCgpLlRyYXZlcnNlU3RtdCgqSSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQWNxdWlyZWRBZnRlckF0dHIoQWNxdWlyZWRBZnRlckF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBY3F1aXJlZEFmdGVyQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHsKKyAgICBFeHByICogKkkgPSBBLT5hcmdzX2JlZ2luKCk7CisgICAgRXhwciAqICpFID0gQS0+YXJnc19lbmQoKTsKKyAgICBmb3IgKDsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmICghZ2V0RGVyaXZlZCgpLlRyYXZlcnNlU3RtdCgqSSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQWNxdWlyZWRCZWZvcmVBdHRyKEFjcXVpcmVkQmVmb3JlQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEFjcXVpcmVkQmVmb3JlQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHsKKyAgICBFeHByICogKkkgPSBBLT5hcmdzX2JlZ2luKCk7CisgICAgRXhwciAqICpFID0gQS0+YXJnc19lbmQoKTsKKyAgICBmb3IgKDsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmICghZ2V0RGVyaXZlZCgpLlRyYXZlcnNlU3RtdCgqSSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQWxpYXNBdHRyKEFsaWFzQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEFsaWFzQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUFsaWduTWFjNjhrQXR0cihBbGlnbk1hYzY4a0F0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBbGlnbk1hYzY4a0F0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VBbGlnblZhbHVlQXR0cihBbGlnblZhbHVlQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEFsaWduVmFsdWVBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KEEtPmdldEFsaWdubWVudCgpKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUFsaWduZWRBdHRyKEFsaWduZWRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QWxpZ25lZEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoQS0+aXNBbGlnbm1lbnRFeHByKCkpIHsKKyAgICBpZiAoIWdldERlcml2ZWQoKS5UcmF2ZXJzZVN0bXQoQS0+Z2V0QWxpZ25tZW50RXhwcigpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIGlmIChhdXRvICpUU0kgPSBBLT5nZXRBbGlnbm1lbnRUeXBlKCkpIHsKKyAgICBpZiAoIWdldERlcml2ZWQoKS5UcmF2ZXJzZVR5cGVMb2MoVFNJLT5nZXRUeXBlTG9jKCkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUFsbG9jQWxpZ25BdHRyKEFsbG9jQWxpZ25BdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QWxsb2NBbGlnbkF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VBbGxvY1NpemVBdHRyKEFsbG9jU2l6ZUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBbGxvY1NpemVBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQWx3YXlzSW5saW5lQXR0cihBbHdheXNJbmxpbmVBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QWx3YXlzSW5saW5lQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUFuYWx5emVyTm9SZXR1cm5BdHRyKEFuYWx5emVyTm9SZXR1cm5BdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QW5hbHl6ZXJOb1JldHVybkF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VBbm5vdGF0ZUF0dHIoQW5ub3RhdGVBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QW5ub3RhdGVBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQW55WDg2SW50ZXJydXB0QXR0cihBbnlYODZJbnRlcnJ1cHRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QW55WDg2SW50ZXJydXB0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUFueVg4Nk5vQ2FsbGVyU2F2ZWRSZWdpc3RlcnNBdHRyKEFueVg4Nk5vQ2FsbGVyU2F2ZWRSZWdpc3RlcnNBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QW55WDg2Tm9DYWxsZXJTYXZlZFJlZ2lzdGVyc0F0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VBbnlYODZOb0NmQ2hlY2tBdHRyKEFueVg4Nk5vQ2ZDaGVja0F0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBbnlYODZOb0NmQ2hlY2tBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQXJjV2Vha3JlZlVuYXZhaWxhYmxlQXR0cihBcmNXZWFrcmVmVW5hdmFpbGFibGVBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXJjV2Vha3JlZlVuYXZhaWxhYmxlQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUFyZ3VtZW50V2l0aFR5cGVUYWdBdHRyKEFyZ3VtZW50V2l0aFR5cGVUYWdBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXJndW1lbnRXaXRoVHlwZVRhZ0F0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VBcnRpZmljaWFsQXR0cihBcnRpZmljaWFsQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEFydGlmaWNpYWxBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQXNtTGFiZWxBdHRyKEFzbUxhYmVsQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEFzbUxhYmVsQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUFzc2VydENhcGFiaWxpdHlBdHRyKEFzc2VydENhcGFiaWxpdHlBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXNzZXJ0Q2FwYWJpbGl0eUF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICB7CisgICAgRXhwciAqICpJID0gQS0+YXJnc19iZWdpbigpOworICAgIEV4cHIgKiAqRSA9IEEtPmFyZ3NfZW5kKCk7CisgICAgZm9yICg7IEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoIWdldERlcml2ZWQoKS5UcmF2ZXJzZVN0bXQoKkkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUFzc2VydEV4Y2x1c2l2ZUxvY2tBdHRyKEFzc2VydEV4Y2x1c2l2ZUxvY2tBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXNzZXJ0RXhjbHVzaXZlTG9ja0F0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICB7CisgICAgRXhwciAqICpJID0gQS0+YXJnc19iZWdpbigpOworICAgIEV4cHIgKiAqRSA9IEEtPmFyZ3NfZW5kKCk7CisgICAgZm9yICg7IEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoIWdldERlcml2ZWQoKS5UcmF2ZXJzZVN0bXQoKkkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUFzc2VydFNoYXJlZExvY2tBdHRyKEFzc2VydFNoYXJlZExvY2tBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXNzZXJ0U2hhcmVkTG9ja0F0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICB7CisgICAgRXhwciAqICpJID0gQS0+YXJnc19iZWdpbigpOworICAgIEV4cHIgKiAqRSA9IEEtPmFyZ3NfZW5kKCk7CisgICAgZm9yICg7IEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoIWdldERlcml2ZWQoKS5UcmF2ZXJzZVN0bXQoKkkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUFzc3VtZUFsaWduZWRBdHRyKEFzc3VtZUFsaWduZWRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXNzdW1lQWxpZ25lZEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5UcmF2ZXJzZVN0bXQoQS0+Z2V0QWxpZ25tZW50KCkpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KEEtPmdldE9mZnNldCgpKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUF2YWlsYWJpbGl0eUF0dHIoQXZhaWxhYmlsaXR5QXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF2YWlsYWJpbGl0eUF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VCbG9ja3NBdHRyKEJsb2Nrc0F0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRCbG9ja3NBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQzExTm9SZXR1cm5BdHRyKEMxMU5vUmV0dXJuQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEMxMU5vUmV0dXJuQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUNEZWNsQXR0cihDRGVjbEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRDRGVjbEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VDRkF1ZGl0ZWRUcmFuc2ZlckF0dHIoQ0ZBdWRpdGVkVHJhbnNmZXJBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0Q0ZBdWRpdGVkVHJhbnNmZXJBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQ0ZDb25zdW1lZEF0dHIoQ0ZDb25zdW1lZEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRDRkNvbnN1bWVkQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUNGUmV0dXJuc05vdFJldGFpbmVkQXR0cihDRlJldHVybnNOb3RSZXRhaW5lZEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRDRlJldHVybnNOb3RSZXRhaW5lZEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VDRlJldHVybnNSZXRhaW5lZEF0dHIoQ0ZSZXR1cm5zUmV0YWluZWRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0Q0ZSZXR1cm5zUmV0YWluZWRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQ0ZVbmtub3duVHJhbnNmZXJBdHRyKENGVW5rbm93blRyYW5zZmVyQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdENGVW5rbm93blRyYW5zZmVyQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUNVREFDb25zdGFudEF0dHIoQ1VEQUNvbnN0YW50QXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdENVREFDb25zdGFudEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VDVURBRGV2aWNlQXR0cihDVURBRGV2aWNlQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdENVREFEZXZpY2VBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQ1VEQUdsb2JhbEF0dHIoQ1VEQUdsb2JhbEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRDVURBR2xvYmFsQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUNVREFIb3N0QXR0cihDVURBSG9zdEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRDVURBSG9zdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VDVURBSW52YWxpZFRhcmdldEF0dHIoQ1VEQUludmFsaWRUYXJnZXRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0Q1VEQUludmFsaWRUYXJnZXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQ1VEQUxhdW5jaEJvdW5kc0F0dHIoQ1VEQUxhdW5jaEJvdW5kc0F0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRDVURBTGF1bmNoQm91bmRzQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlRyYXZlcnNlU3RtdChBLT5nZXRNYXhUaHJlYWRzKCkpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KEEtPmdldE1pbkJsb2NrcygpKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUNVREFTaGFyZWRBdHRyKENVREFTaGFyZWRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0Q1VEQVNoYXJlZEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VDWFgxMU5vUmV0dXJuQXR0cihDWFgxMU5vUmV0dXJuQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdENYWDExTm9SZXR1cm5BdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQ2FsbGFibGVXaGVuQXR0cihDYWxsYWJsZVdoZW5BdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0Q2FsbGFibGVXaGVuQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUNhcGFiaWxpdHlBdHRyKENhcGFiaWxpdHlBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0Q2FwYWJpbGl0eUF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VDYXB0dXJlZFJlY29yZEF0dHIoQ2FwdHVyZWRSZWNvcmRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0Q2FwdHVyZWRSZWNvcmRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQ2Fycmllc0RlcGVuZGVuY3lBdHRyKENhcnJpZXNEZXBlbmRlbmN5QXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdENhcnJpZXNEZXBlbmRlbmN5QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUNsZWFudXBBdHRyKENsZWFudXBBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0Q2xlYW51cEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VDb2xkQXR0cihDb2xkQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdENvbGRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQ29tbW9uQXR0cihDb21tb25BdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0Q29tbW9uQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUNvbnN0QXR0cihDb25zdEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRDb25zdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VDb25zdHJ1Y3RvckF0dHIoQ29uc3RydWN0b3JBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0Q29uc3RydWN0b3JBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQ29uc3VtYWJsZUF0dHIoQ29uc3VtYWJsZUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRDb25zdW1hYmxlQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUNvbnN1bWFibGVBdXRvQ2FzdEF0dHIoQ29uc3VtYWJsZUF1dG9DYXN0QXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdENvbnN1bWFibGVBdXRvQ2FzdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VDb25zdW1hYmxlU2V0T25SZWFkQXR0cihDb25zdW1hYmxlU2V0T25SZWFkQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdENvbnN1bWFibGVTZXRPblJlYWRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQ29udmVyZ2VudEF0dHIoQ29udmVyZ2VudEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRDb252ZXJnZW50QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZURMTEV4cG9ydEF0dHIoRExMRXhwb3J0QXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdERMTEV4cG9ydEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VETExJbXBvcnRBdHRyKERMTEltcG9ydEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRETExJbXBvcnRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlRGVwcmVjYXRlZEF0dHIoRGVwcmVjYXRlZEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXREZXByZWNhdGVkQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZURlc3RydWN0b3JBdHRyKERlc3RydWN0b3JBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0RGVzdHJ1Y3RvckF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VEaWFnbm9zZUlmQXR0cihEaWFnbm9zZUlmQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdERpYWdub3NlSWZBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KEEtPmdldENvbmQoKSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VEaXNhYmxlVGFpbENhbGxzQXR0cihEaXNhYmxlVGFpbENhbGxzQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdERpc2FibGVUYWlsQ2FsbHNBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlRW1wdHlCYXNlc0F0dHIoRW1wdHlCYXNlc0F0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRFbXB0eUJhc2VzQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUVuYWJsZUlmQXR0cihFbmFibGVJZkF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRFbmFibGVJZkF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5UcmF2ZXJzZVN0bXQoQS0+Z2V0Q29uZCgpKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUVudW1FeHRlbnNpYmlsaXR5QXR0cihFbnVtRXh0ZW5zaWJpbGl0eUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRFbnVtRXh0ZW5zaWJpbGl0eUF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb25BdHRyKEV4Y2x1c2l2ZVRyeWxvY2tGdW5jdGlvbkF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb25BdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KEEtPmdldFN1Y2Nlc3NWYWx1ZSgpKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHsKKyAgICBFeHByICogKkkgPSBBLT5hcmdzX2JlZ2luKCk7CisgICAgRXhwciAqICpFID0gQS0+YXJnc19lbmQoKTsKKyAgICBmb3IgKDsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmICghZ2V0RGVyaXZlZCgpLlRyYXZlcnNlU3RtdCgqSSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlRXh0ZXJuYWxTb3VyY2VTeW1ib2xBdHRyKEV4dGVybmFsU291cmNlU3ltYm9sQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEV4dGVybmFsU291cmNlU3ltYm9sQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUZhbGxUaHJvdWdoQXR0cihGYWxsVGhyb3VnaEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRGYWxsVGhyb3VnaEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VGYXN0Q2FsbEF0dHIoRmFzdENhbGxBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0RmFzdENhbGxBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlRmluYWxBdHRyKEZpbmFsQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEZpbmFsQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUZsYWdFbnVtQXR0cihGbGFnRW51bUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRGbGFnRW51bUF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VGbGF0dGVuQXR0cihGbGF0dGVuQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEZsYXR0ZW5BdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlRm9ybWF0QXR0cihGb3JtYXRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0Rm9ybWF0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUZvcm1hdEFyZ0F0dHIoRm9ybWF0QXJnQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEZvcm1hdEFyZ0F0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VHTlVJbmxpbmVBdHRyKEdOVUlubGluZUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRHTlVJbmxpbmVBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlR3VhcmRlZEJ5QXR0cihHdWFyZGVkQnlBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0R3VhcmRlZEJ5QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlRyYXZlcnNlU3RtdChBLT5nZXRBcmcoKSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VHdWFyZGVkVmFyQXR0cihHdWFyZGVkVmFyQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEd1YXJkZWRWYXJBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlSG90QXR0cihIb3RBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0SG90QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUlCQWN0aW9uQXR0cihJQkFjdGlvbkF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRJQkFjdGlvbkF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VJQk91dGxldEF0dHIoSUJPdXRsZXRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0SUJPdXRsZXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlSUJPdXRsZXRDb2xsZWN0aW9uQXR0cihJQk91dGxldENvbGxlY3Rpb25BdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0SUJPdXRsZXRDb2xsZWN0aW9uQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChhdXRvICpUU0kgPSBBLT5nZXRJbnRlcmZhY2VMb2MoKSkKKyAgICBpZiAoIWdldERlcml2ZWQoKS5UcmF2ZXJzZVR5cGVMb2MoVFNJLT5nZXRUeXBlTG9jKCkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VJRnVuY0F0dHIoSUZ1bmNBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0SUZ1bmNBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlSW5pdFByaW9yaXR5QXR0cihJbml0UHJpb3JpdHlBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0SW5pdFByaW9yaXR5QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUluaXRTZWdBdHRyKEluaXRTZWdBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0SW5pdFNlZ0F0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VJbnRlbE9jbEJpY2NBdHRyKEludGVsT2NsQmljY0F0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRJbnRlbE9jbEJpY2NBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlSW50ZXJuYWxMaW5rYWdlQXR0cihJbnRlcm5hbExpbmthZ2VBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0SW50ZXJuYWxMaW5rYWdlQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUxUT1Zpc2liaWxpdHlQdWJsaWNBdHRyKExUT1Zpc2liaWxpdHlQdWJsaWNBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0TFRPVmlzaWJpbGl0eVB1YmxpY0F0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VMYXlvdXRWZXJzaW9uQXR0cihMYXlvdXRWZXJzaW9uQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdExheW91dFZlcnNpb25BdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlTG9ja1JldHVybmVkQXR0cihMb2NrUmV0dXJuZWRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0TG9ja1JldHVybmVkQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlRyYXZlcnNlU3RtdChBLT5nZXRBcmcoKSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VMb2Nrc0V4Y2x1ZGVkQXR0cihMb2Nrc0V4Y2x1ZGVkQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdExvY2tzRXhjbHVkZWRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgeworICAgIEV4cHIgKiAqSSA9IEEtPmFyZ3NfYmVnaW4oKTsKKyAgICBFeHByICogKkUgPSBBLT5hcmdzX2VuZCgpOworICAgIGZvciAoOyBJICE9IEU7ICsrSSkgeworICAgICAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KCpJKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VMb29wSGludEF0dHIoTG9vcEhpbnRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0TG9vcEhpbnRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KEEtPmdldFZhbHVlKCkpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlTVNBQklBdHRyKE1TQUJJQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE1TQUJJQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU1TSW5oZXJpdGFuY2VBdHRyKE1TSW5oZXJpdGFuY2VBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0TVNJbmhlcml0YW5jZUF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VNU05vVlRhYmxlQXR0cihNU05vVlRhYmxlQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE1TTm9WVGFibGVBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlTVNQNDMwSW50ZXJydXB0QXR0cihNU1A0MzBJbnRlcnJ1cHRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0TVNQNDMwSW50ZXJydXB0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU1TU3RydWN0QXR0cihNU1N0cnVjdEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRNU1N0cnVjdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VNU1Z0b3JEaXNwQXR0cihNU1Z0b3JEaXNwQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE1TVnRvckRpc3BBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlTWF4RmllbGRBbGlnbm1lbnRBdHRyKE1heEZpZWxkQWxpZ25tZW50QXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE1heEZpZWxkQWxpZ25tZW50QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU1heUFsaWFzQXR0cihNYXlBbGlhc0F0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRNYXlBbGlhc0F0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VNaWNyb01pcHNBdHRyKE1pY3JvTWlwc0F0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRNaWNyb01pcHNBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlTWluU2l6ZUF0dHIoTWluU2l6ZUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRNaW5TaXplQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU1pcHMxNkF0dHIoTWlwczE2QXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE1pcHMxNkF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VNaXBzSW50ZXJydXB0QXR0cihNaXBzSW50ZXJydXB0QXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE1pcHNJbnRlcnJ1cHRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlTWlwc0xvbmdDYWxsQXR0cihNaXBzTG9uZ0NhbGxBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0TWlwc0xvbmdDYWxsQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU1pcHNTaG9ydENhbGxBdHRyKE1pcHNTaG9ydENhbGxBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0TWlwc1Nob3J0Q2FsbEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VNb2RlQXR0cihNb2RlQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE1vZGVBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlTlNDb25zdW1lZEF0dHIoTlNDb25zdW1lZEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXROU0NvbnN1bWVkQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU5TQ29uc3VtZXNTZWxmQXR0cihOU0NvbnN1bWVzU2VsZkF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXROU0NvbnN1bWVzU2VsZkF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VOU1JldHVybnNBdXRvcmVsZWFzZWRBdHRyKE5TUmV0dXJuc0F1dG9yZWxlYXNlZEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXROU1JldHVybnNBdXRvcmVsZWFzZWRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlTlNSZXR1cm5zTm90UmV0YWluZWRBdHRyKE5TUmV0dXJuc05vdFJldGFpbmVkQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE5TUmV0dXJuc05vdFJldGFpbmVkQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU5TUmV0dXJuc1JldGFpbmVkQXR0cihOU1JldHVybnNSZXRhaW5lZEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXROU1JldHVybnNSZXRhaW5lZEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VOYWtlZEF0dHIoTmFrZWRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0TmFrZWRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlTm9BbGlhc0F0dHIoTm9BbGlhc0F0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXROb0FsaWFzQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU5vQ29tbW9uQXR0cihOb0NvbW1vbkF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXROb0NvbW1vbkF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VOb0RlYnVnQXR0cihOb0RlYnVnQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE5vRGVidWdBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlTm9EdXBsaWNhdGVBdHRyKE5vRHVwbGljYXRlQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE5vRHVwbGljYXRlQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU5vRXNjYXBlQXR0cihOb0VzY2FwZUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXROb0VzY2FwZUF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VOb0lubGluZUF0dHIoTm9JbmxpbmVBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0Tm9JbmxpbmVBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlTm9JbnN0cnVtZW50RnVuY3Rpb25BdHRyKE5vSW5zdHJ1bWVudEZ1bmN0aW9uQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE5vSW5zdHJ1bWVudEZ1bmN0aW9uQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU5vTWljcm9NaXBzQXR0cihOb01pY3JvTWlwc0F0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXROb01pY3JvTWlwc0F0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VOb01pcHMxNkF0dHIoTm9NaXBzMTZBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0Tm9NaXBzMTZBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlTm9SZXR1cm5BdHRyKE5vUmV0dXJuQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE5vUmV0dXJuQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU5vU2FuaXRpemVBdHRyKE5vU2FuaXRpemVBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0Tm9TYW5pdGl6ZUF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VOb1NwbGl0U3RhY2tBdHRyKE5vU3BsaXRTdGFja0F0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXROb1NwbGl0U3RhY2tBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlTm9UaHJlYWRTYWZldHlBbmFseXNpc0F0dHIoTm9UaHJlYWRTYWZldHlBbmFseXNpc0F0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXROb1RocmVhZFNhZmV0eUFuYWx5c2lzQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU5vVGhyb3dBdHRyKE5vVGhyb3dBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0Tm9UaHJvd0F0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VOb25OdWxsQXR0cihOb25OdWxsQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE5vbk51bGxBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlTm90VGFpbENhbGxlZEF0dHIoTm90VGFpbENhbGxlZEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXROb3RUYWlsQ2FsbGVkQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU9NUENhcHR1cmVLaW5kQXR0cihPTVBDYXB0dXJlS2luZEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRPTVBDYXB0dXJlS2luZEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VPTVBDYXB0dXJlTm9Jbml0QXR0cihPTVBDYXB0dXJlTm9Jbml0QXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE9NUENhcHR1cmVOb0luaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlT01QRGVjbGFyZVNpbWREZWNsQXR0cihPTVBEZWNsYXJlU2ltZERlY2xBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0T01QRGVjbGFyZVNpbWREZWNsQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlRyYXZlcnNlU3RtdChBLT5nZXRTaW1kbGVuKCkpKQorICAgIHJldHVybiBmYWxzZTsKKyAgeworICAgIEV4cHIgKiAqSSA9IEEtPnVuaWZvcm1zX2JlZ2luKCk7CisgICAgRXhwciAqICpFID0gQS0+dW5pZm9ybXNfZW5kKCk7CisgICAgZm9yICg7IEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoIWdldERlcml2ZWQoKS5UcmF2ZXJzZVN0bXQoKkkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHsKKyAgICBFeHByICogKkkgPSBBLT5hbGlnbmVkc19iZWdpbigpOworICAgIEV4cHIgKiAqRSA9IEEtPmFsaWduZWRzX2VuZCgpOworICAgIGZvciAoOyBJICE9IEU7ICsrSSkgeworICAgICAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KCpJKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICB7CisgICAgRXhwciAqICpJID0gQS0+YWxpZ25tZW50c19iZWdpbigpOworICAgIEV4cHIgKiAqRSA9IEEtPmFsaWdubWVudHNfZW5kKCk7CisgICAgZm9yICg7IEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoIWdldERlcml2ZWQoKS5UcmF2ZXJzZVN0bXQoKkkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHsKKyAgICBFeHByICogKkkgPSBBLT5saW5lYXJzX2JlZ2luKCk7CisgICAgRXhwciAqICpFID0gQS0+bGluZWFyc19lbmQoKTsKKyAgICBmb3IgKDsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmICghZ2V0RGVyaXZlZCgpLlRyYXZlcnNlU3RtdCgqSSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgeworICAgIEV4cHIgKiAqSSA9IEEtPnN0ZXBzX2JlZ2luKCk7CisgICAgRXhwciAqICpFID0gQS0+c3RlcHNfZW5kKCk7CisgICAgZm9yICg7IEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoIWdldERlcml2ZWQoKS5UcmF2ZXJzZVN0bXQoKkkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU9NUERlY2xhcmVUYXJnZXREZWNsQXR0cihPTVBEZWNsYXJlVGFyZ2V0RGVjbEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRPTVBEZWNsYXJlVGFyZ2V0RGVjbEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VPTVBSZWZlcmVuY2VkVmFyQXR0cihPTVBSZWZlcmVuY2VkVmFyQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE9NUFJlZmVyZW5jZWRWYXJBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KEEtPmdldFJlZigpKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU9NUFRocmVhZFByaXZhdGVEZWNsQXR0cihPTVBUaHJlYWRQcml2YXRlRGVjbEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRPTVBUaHJlYWRQcml2YXRlRGVjbEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VPYmpDQm94YWJsZUF0dHIoT2JqQ0JveGFibGVBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0T2JqQ0JveGFibGVBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlT2JqQ0JyaWRnZUF0dHIoT2JqQ0JyaWRnZUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRPYmpDQnJpZGdlQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU9iakNCcmlkZ2VNdXRhYmxlQXR0cihPYmpDQnJpZGdlTXV0YWJsZUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRPYmpDQnJpZGdlTXV0YWJsZUF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VPYmpDQnJpZGdlUmVsYXRlZEF0dHIoT2JqQ0JyaWRnZVJlbGF0ZWRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0T2JqQ0JyaWRnZVJlbGF0ZWRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlT2JqQ0Rlc2lnbmF0ZWRJbml0aWFsaXplckF0dHIoT2JqQ0Rlc2lnbmF0ZWRJbml0aWFsaXplckF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRPYmpDRGVzaWduYXRlZEluaXRpYWxpemVyQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU9iakNFeGNlcHRpb25BdHRyKE9iakNFeGNlcHRpb25BdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0T2JqQ0V4Y2VwdGlvbkF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VPYmpDRXhwbGljaXRQcm90b2NvbEltcGxBdHRyKE9iakNFeHBsaWNpdFByb3RvY29sSW1wbEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRPYmpDRXhwbGljaXRQcm90b2NvbEltcGxBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlT2JqQ0luZGVwZW5kZW50Q2xhc3NBdHRyKE9iakNJbmRlcGVuZGVudENsYXNzQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE9iakNJbmRlcGVuZGVudENsYXNzQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU9iakNNZXRob2RGYW1pbHlBdHRyKE9iakNNZXRob2RGYW1pbHlBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0T2JqQ01ldGhvZEZhbWlseUF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VPYmpDTlNPYmplY3RBdHRyKE9iakNOU09iamVjdEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRPYmpDTlNPYmplY3RBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlT2JqQ1ByZWNpc2VMaWZldGltZUF0dHIoT2JqQ1ByZWNpc2VMaWZldGltZUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRPYmpDUHJlY2lzZUxpZmV0aW1lQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU9iakNSZXF1aXJlc1Byb3BlcnR5RGVmc0F0dHIoT2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE9iakNSZXF1aXJlc1Byb3BlcnR5RGVmc0F0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VPYmpDUmVxdWlyZXNTdXBlckF0dHIoT2JqQ1JlcXVpcmVzU3VwZXJBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0T2JqQ1JlcXVpcmVzU3VwZXJBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlT2JqQ1JldHVybnNJbm5lclBvaW50ZXJBdHRyKE9iakNSZXR1cm5zSW5uZXJQb2ludGVyQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE9iakNSZXR1cm5zSW5uZXJQb2ludGVyQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU9iakNSb290Q2xhc3NBdHRyKE9iakNSb290Q2xhc3NBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0T2JqQ1Jvb3RDbGFzc0F0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VPYmpDUnVudGltZU5hbWVBdHRyKE9iakNSdW50aW1lTmFtZUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRPYmpDUnVudGltZU5hbWVBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlT2JqQ1J1bnRpbWVWaXNpYmxlQXR0cihPYmpDUnVudGltZVZpc2libGVBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0T2JqQ1J1bnRpbWVWaXNpYmxlQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU9iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWRBdHRyKE9iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0T2JqQ1N1YmNsYXNzaW5nUmVzdHJpY3RlZEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VPcGVuQ0xBY2Nlc3NBdHRyKE9wZW5DTEFjY2Vzc0F0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRPcGVuQ0xBY2Nlc3NBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlT3BlbkNMSW50ZWxSZXFkU3ViR3JvdXBTaXplQXR0cihPcGVuQ0xJbnRlbFJlcWRTdWJHcm91cFNpemVBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0T3BlbkNMSW50ZWxSZXFkU3ViR3JvdXBTaXplQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU9wZW5DTEtlcm5lbEF0dHIoT3BlbkNMS2VybmVsQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE9wZW5DTEtlcm5lbEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VPcGVuQ0xVbnJvbGxIaW50QXR0cihPcGVuQ0xVbnJvbGxIaW50QXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE9wZW5DTFVucm9sbEhpbnRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlT3B0aW1pemVOb25lQXR0cihPcHRpbWl6ZU5vbmVBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0T3B0aW1pemVOb25lQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZU92ZXJsb2FkYWJsZUF0dHIoT3ZlcmxvYWRhYmxlQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdE92ZXJsb2FkYWJsZUF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VPdmVycmlkZUF0dHIoT3ZlcnJpZGVBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0T3ZlcnJpZGVBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlT3duZXJzaGlwQXR0cihPd25lcnNoaXBBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0T3duZXJzaGlwQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVBhY2tlZEF0dHIoUGFja2VkQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdFBhY2tlZEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VQYXJhbVR5cGVzdGF0ZUF0dHIoUGFyYW1UeXBlc3RhdGVBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0UGFyYW1UeXBlc3RhdGVBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlUGFzY2FsQXR0cihQYXNjYWxBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0UGFzY2FsQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVBhc3NPYmplY3RTaXplQXR0cihQYXNzT2JqZWN0U2l6ZUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRQYXNzT2JqZWN0U2l6ZUF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VQY3NBdHRyKFBjc0F0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRQY3NBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlUHJhZ21hQ2xhbmdCU1NTZWN0aW9uQXR0cihQcmFnbWFDbGFuZ0JTU1NlY3Rpb25BdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0UHJhZ21hQ2xhbmdCU1NTZWN0aW9uQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVByYWdtYUNsYW5nRGF0YVNlY3Rpb25BdHRyKFByYWdtYUNsYW5nRGF0YVNlY3Rpb25BdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0UHJhZ21hQ2xhbmdEYXRhU2VjdGlvbkF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb25BdHRyKFByYWdtYUNsYW5nUm9kYXRhU2VjdGlvbkF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb25BdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlUHJhZ21hQ2xhbmdUZXh0U2VjdGlvbkF0dHIoUHJhZ21hQ2xhbmdUZXh0U2VjdGlvbkF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRQcmFnbWFDbGFuZ1RleHRTZWN0aW9uQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVByZXNlcnZlQWxsQXR0cihQcmVzZXJ2ZUFsbEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRQcmVzZXJ2ZUFsbEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VQcmVzZXJ2ZU1vc3RBdHRyKFByZXNlcnZlTW9zdEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRQcmVzZXJ2ZU1vc3RBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlUHRHdWFyZGVkQnlBdHRyKFB0R3VhcmRlZEJ5QXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdFB0R3VhcmRlZEJ5QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlRyYXZlcnNlU3RtdChBLT5nZXRBcmcoKSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VQdEd1YXJkZWRWYXJBdHRyKFB0R3VhcmRlZFZhckF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRQdEd1YXJkZWRWYXJBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlUHVyZUF0dHIoUHVyZUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRQdXJlQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVJlZ0NhbGxBdHRyKFJlZ0NhbGxBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0UmVnQ2FsbEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VSZWxlYXNlQ2FwYWJpbGl0eUF0dHIoUmVsZWFzZUNhcGFiaWxpdHlBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0UmVsZWFzZUNhcGFiaWxpdHlBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgeworICAgIEV4cHIgKiAqSSA9IEEtPmFyZ3NfYmVnaW4oKTsKKyAgICBFeHByICogKkUgPSBBLT5hcmdzX2VuZCgpOworICAgIGZvciAoOyBJICE9IEU7ICsrSSkgeworICAgICAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KCpJKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VSZW5kZXJTY3JpcHRLZXJuZWxBdHRyKFJlbmRlclNjcmlwdEtlcm5lbEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRSZW5kZXJTY3JpcHRLZXJuZWxBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlUmVxZFdvcmtHcm91cFNpemVBdHRyKFJlcWRXb3JrR3JvdXBTaXplQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdFJlcWRXb3JrR3JvdXBTaXplQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVJlcXVpcmVDb25zdGFudEluaXRBdHRyKFJlcXVpcmVDb25zdGFudEluaXRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0UmVxdWlyZUNvbnN0YW50SW5pdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VSZXF1aXJlc0NhcGFiaWxpdHlBdHRyKFJlcXVpcmVzQ2FwYWJpbGl0eUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRSZXF1aXJlc0NhcGFiaWxpdHlBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgeworICAgIEV4cHIgKiAqSSA9IEEtPmFyZ3NfYmVnaW4oKTsKKyAgICBFeHByICogKkUgPSBBLT5hcmdzX2VuZCgpOworICAgIGZvciAoOyBJICE9IEU7ICsrSSkgeworICAgICAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KCpJKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VSZXN0cmljdEF0dHIoUmVzdHJpY3RBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0UmVzdHJpY3RBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlUmV0dXJuVHlwZXN0YXRlQXR0cihSZXR1cm5UeXBlc3RhdGVBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0UmV0dXJuVHlwZXN0YXRlQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVJldHVybnNOb25OdWxsQXR0cihSZXR1cm5zTm9uTnVsbEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRSZXR1cm5zTm9uTnVsbEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VSZXR1cm5zVHdpY2VBdHRyKFJldHVybnNUd2ljZUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRSZXR1cm5zVHdpY2VBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlU2NvcGVkTG9ja2FibGVBdHRyKFNjb3BlZExvY2thYmxlQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdFNjb3BlZExvY2thYmxlQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVNlY3Rpb25BdHRyKFNlY3Rpb25BdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0U2VjdGlvbkF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VTZWxlY3RBbnlBdHRyKFNlbGVjdEFueUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRTZWxlY3RBbnlBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlU2VudGluZWxBdHRyKFNlbnRpbmVsQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdFNlbnRpbmVsQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVNldFR5cGVzdGF0ZUF0dHIoU2V0VHlwZXN0YXRlQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdFNldFR5cGVzdGF0ZUF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VTaGFyZWRUcnlsb2NrRnVuY3Rpb25BdHRyKFNoYXJlZFRyeWxvY2tGdW5jdGlvbkF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRTaGFyZWRUcnlsb2NrRnVuY3Rpb25BdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KEEtPmdldFN1Y2Nlc3NWYWx1ZSgpKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHsKKyAgICBFeHByICogKkkgPSBBLT5hcmdzX2JlZ2luKCk7CisgICAgRXhwciAqICpFID0gQS0+YXJnc19lbmQoKTsKKyAgICBmb3IgKDsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmICghZ2V0RGVyaXZlZCgpLlRyYXZlcnNlU3RtdCgqSSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlU3RkQ2FsbEF0dHIoU3RkQ2FsbEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRTdGRDYWxsQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVN1cHByZXNzQXR0cihTdXBwcmVzc0F0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRTdXBwcmVzc0F0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VTd2lmdENhbGxBdHRyKFN3aWZ0Q2FsbEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRTd2lmdENhbGxBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlU3dpZnRDb250ZXh0QXR0cihTd2lmdENvbnRleHRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0U3dpZnRDb250ZXh0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVN3aWZ0RXJyb3JSZXN1bHRBdHRyKFN3aWZ0RXJyb3JSZXN1bHRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0U3dpZnRFcnJvclJlc3VsdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VTd2lmdEluZGlyZWN0UmVzdWx0QXR0cihTd2lmdEluZGlyZWN0UmVzdWx0QXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdFN3aWZ0SW5kaXJlY3RSZXN1bHRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlU3lzVkFCSUF0dHIoU3lzVkFCSUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRTeXNWQUJJQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVRMU01vZGVsQXR0cihUTFNNb2RlbEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRUTFNNb2RlbEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VUYXJnZXRBdHRyKFRhcmdldEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRUYXJnZXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlVGVzdFR5cGVzdGF0ZUF0dHIoVGVzdFR5cGVzdGF0ZUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRUZXN0VHlwZXN0YXRlQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVRoaXNDYWxsQXR0cihUaGlzQ2FsbEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRUaGlzQ2FsbEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VUaHJlYWRBdHRyKFRocmVhZEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRUaHJlYWRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlVHJhbnNwYXJlbnRVbmlvbkF0dHIoVHJhbnNwYXJlbnRVbmlvbkF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRUcmFuc3BhcmVudFVuaW9uQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVRyaXZpYWxBQklBdHRyKFRyaXZpYWxBQklBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0VHJpdmlhbEFCSUF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VUcnlBY3F1aXJlQ2FwYWJpbGl0eUF0dHIoVHJ5QWNxdWlyZUNhcGFiaWxpdHlBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0VHJ5QWNxdWlyZUNhcGFiaWxpdHlBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KEEtPmdldFN1Y2Nlc3NWYWx1ZSgpKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHsKKyAgICBFeHByICogKkkgPSBBLT5hcmdzX2JlZ2luKCk7CisgICAgRXhwciAqICpFID0gQS0+YXJnc19lbmQoKTsKKyAgICBmb3IgKDsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmICghZ2V0RGVyaXZlZCgpLlRyYXZlcnNlU3RtdCgqSSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlVHlwZVRhZ0ZvckRhdGF0eXBlQXR0cihUeXBlVGFnRm9yRGF0YXR5cGVBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0VHlwZVRhZ0ZvckRhdGF0eXBlQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChhdXRvICpUU0kgPSBBLT5nZXRNYXRjaGluZ0NUeXBlTG9jKCkpCisgICAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2VUeXBlTG9jKFRTSS0+Z2V0VHlwZUxvYygpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlVHlwZVZpc2liaWxpdHlBdHRyKFR5cGVWaXNpYmlsaXR5QXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdFR5cGVWaXNpYmlsaXR5QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVVuYXZhaWxhYmxlQXR0cihVbmF2YWlsYWJsZUF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRVbmF2YWlsYWJsZUF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VVbnVzZWRBdHRyKFVudXNlZEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRVbnVzZWRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlVXNlZEF0dHIoVXNlZEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRVc2VkQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVV1aWRBdHRyKFV1aWRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0VXVpZEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VWZWNSZXR1cm5BdHRyKFZlY1JldHVybkF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRWZWNSZXR1cm5BdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlVmVjVHlwZUhpbnRBdHRyKFZlY1R5cGVIaW50QXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdFZlY1R5cGVIaW50QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChhdXRvICpUU0kgPSBBLT5nZXRUeXBlSGludExvYygpKQorICAgIGlmICghZ2V0RGVyaXZlZCgpLlRyYXZlcnNlVHlwZUxvYyhUU0ktPmdldFR5cGVMb2MoKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVZlY3RvckNhbGxBdHRyKFZlY3RvckNhbGxBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0VmVjdG9yQ2FsbEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VWaXNpYmlsaXR5QXR0cihWaXNpYmlsaXR5QXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdFZpc2liaWxpdHlBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlV2FyblVudXNlZEF0dHIoV2FyblVudXNlZEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRXYXJuVW51c2VkQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVdhcm5VbnVzZWRSZXN1bHRBdHRyKFdhcm5VbnVzZWRSZXN1bHRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0V2FyblVudXNlZFJlc3VsdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VXZWFrQXR0cihXZWFrQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdFdlYWtBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlV2Vha0ltcG9ydEF0dHIoV2Vha0ltcG9ydEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRXZWFrSW1wb3J0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVdlYWtSZWZBdHRyKFdlYWtSZWZBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0V2Vha1JlZkF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VXb3JrR3JvdXBTaXplSGludEF0dHIoV29ya0dyb3VwU2l6ZUhpbnRBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0V29ya0dyb3VwU2l6ZUhpbnRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlWDg2Rm9yY2VBbGlnbkFyZ1BvaW50ZXJBdHRyKFg4NkZvcmNlQWxpZ25BcmdQb2ludGVyQXR0ciAqQSkgeworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWdldERlcml2ZWQoKS5WaXNpdFg4NkZvcmNlQWxpZ25BcmdQb2ludGVyQXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZVhSYXlJbnN0cnVtZW50QXR0cihYUmF5SW5zdHJ1bWVudEF0dHIgKkEpIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRYUmF5SW5zdHJ1bWVudEF0dHIoQSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFZJU0lUT1JDTEFTUzxEZXJpdmVkPjo6VHJhdmVyc2VYUmF5TG9nQXJnc0F0dHIoWFJheUxvZ0FyZ3NBdHRyICpBKSB7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0QXR0cihBKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0WFJheUxvZ0FyZ3NBdHRyKEEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBWSVNJVE9SQ0xBU1M8RGVyaXZlZD46OlRyYXZlcnNlQXR0cihBdHRyICpBKSB7CisgIGlmICghQSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBzd2l0Y2ggKEEtPmdldEtpbmQoKSkgeworICAgIGNhc2UgYXR0cjo6QU1ER1BVRmxhdFdvcmtHcm91cFNpemU6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQU1ER1BVRmxhdFdvcmtHcm91cFNpemVBdHRyKGNhc3Q8QU1ER1BVRmxhdFdvcmtHcm91cFNpemVBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpBTURHUFVOdW1TR1BSOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUFNREdQVU51bVNHUFJBdHRyKGNhc3Q8QU1ER1BVTnVtU0dQUkF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkFNREdQVU51bVZHUFI6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQU1ER1BVTnVtVkdQUkF0dHIoY2FzdDxBTURHUFVOdW1WR1BSQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6QU1ER1BVV2F2ZXNQZXJFVToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VBTURHUFVXYXZlc1BlckVVQXR0cihjYXN0PEFNREdQVVdhdmVzUGVyRVVBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpBUk1JbnRlcnJ1cHQ6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQVJNSW50ZXJydXB0QXR0cihjYXN0PEFSTUludGVycnVwdEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkFWUkludGVycnVwdDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VBVlJJbnRlcnJ1cHRBdHRyKGNhc3Q8QVZSSW50ZXJydXB0QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6QVZSU2lnbmFsOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUFWUlNpZ25hbEF0dHIoY2FzdDxBVlJTaWduYWxBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpBYmlUYWc6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQWJpVGFnQXR0cihjYXN0PEFiaVRhZ0F0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkFjcXVpcmVDYXBhYmlsaXR5OgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUFjcXVpcmVDYXBhYmlsaXR5QXR0cihjYXN0PEFjcXVpcmVDYXBhYmlsaXR5QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6QWNxdWlyZWRBZnRlcjoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VBY3F1aXJlZEFmdGVyQXR0cihjYXN0PEFjcXVpcmVkQWZ0ZXJBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpBY3F1aXJlZEJlZm9yZToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VBY3F1aXJlZEJlZm9yZUF0dHIoY2FzdDxBY3F1aXJlZEJlZm9yZUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkFsaWFzOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUFsaWFzQXR0cihjYXN0PEFsaWFzQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6QWxpZ25NYWM2OGs6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQWxpZ25NYWM2OGtBdHRyKGNhc3Q8QWxpZ25NYWM2OGtBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpBbGlnblZhbHVlOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUFsaWduVmFsdWVBdHRyKGNhc3Q8QWxpZ25WYWx1ZUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkFsaWduZWQ6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQWxpZ25lZEF0dHIoY2FzdDxBbGlnbmVkQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6QWxsb2NBbGlnbjoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VBbGxvY0FsaWduQXR0cihjYXN0PEFsbG9jQWxpZ25BdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpBbGxvY1NpemU6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQWxsb2NTaXplQXR0cihjYXN0PEFsbG9jU2l6ZUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkFsd2F5c0lubGluZToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VBbHdheXNJbmxpbmVBdHRyKGNhc3Q8QWx3YXlzSW5saW5lQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6QW5hbHl6ZXJOb1JldHVybjoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VBbmFseXplck5vUmV0dXJuQXR0cihjYXN0PEFuYWx5emVyTm9SZXR1cm5BdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpBbm5vdGF0ZToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VBbm5vdGF0ZUF0dHIoY2FzdDxBbm5vdGF0ZUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkFueVg4NkludGVycnVwdDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VBbnlYODZJbnRlcnJ1cHRBdHRyKGNhc3Q8QW55WDg2SW50ZXJydXB0QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6QW55WDg2Tm9DYWxsZXJTYXZlZFJlZ2lzdGVyczoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VBbnlYODZOb0NhbGxlclNhdmVkUmVnaXN0ZXJzQXR0cihjYXN0PEFueVg4Nk5vQ2FsbGVyU2F2ZWRSZWdpc3RlcnNBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpBbnlYODZOb0NmQ2hlY2s6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQW55WDg2Tm9DZkNoZWNrQXR0cihjYXN0PEFueVg4Nk5vQ2ZDaGVja0F0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkFyY1dlYWtyZWZVbmF2YWlsYWJsZToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VBcmNXZWFrcmVmVW5hdmFpbGFibGVBdHRyKGNhc3Q8QXJjV2Vha3JlZlVuYXZhaWxhYmxlQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6QXJndW1lbnRXaXRoVHlwZVRhZzoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VBcmd1bWVudFdpdGhUeXBlVGFnQXR0cihjYXN0PEFyZ3VtZW50V2l0aFR5cGVUYWdBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpBcnRpZmljaWFsOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUFydGlmaWNpYWxBdHRyKGNhc3Q8QXJ0aWZpY2lhbEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkFzbUxhYmVsOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUFzbUxhYmVsQXR0cihjYXN0PEFzbUxhYmVsQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6QXNzZXJ0Q2FwYWJpbGl0eToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VBc3NlcnRDYXBhYmlsaXR5QXR0cihjYXN0PEFzc2VydENhcGFiaWxpdHlBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpBc3NlcnRFeGNsdXNpdmVMb2NrOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUFzc2VydEV4Y2x1c2l2ZUxvY2tBdHRyKGNhc3Q8QXNzZXJ0RXhjbHVzaXZlTG9ja0F0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkFzc2VydFNoYXJlZExvY2s6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQXNzZXJ0U2hhcmVkTG9ja0F0dHIoY2FzdDxBc3NlcnRTaGFyZWRMb2NrQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6QXNzdW1lQWxpZ25lZDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VBc3N1bWVBbGlnbmVkQXR0cihjYXN0PEFzc3VtZUFsaWduZWRBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpBdmFpbGFiaWxpdHk6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQXZhaWxhYmlsaXR5QXR0cihjYXN0PEF2YWlsYWJpbGl0eUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkJsb2NrczoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VCbG9ja3NBdHRyKGNhc3Q8QmxvY2tzQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6QzExTm9SZXR1cm46CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQzExTm9SZXR1cm5BdHRyKGNhc3Q8QzExTm9SZXR1cm5BdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpDRGVjbDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VDRGVjbEF0dHIoY2FzdDxDRGVjbEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkNGQXVkaXRlZFRyYW5zZmVyOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUNGQXVkaXRlZFRyYW5zZmVyQXR0cihjYXN0PENGQXVkaXRlZFRyYW5zZmVyQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6Q0ZDb25zdW1lZDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VDRkNvbnN1bWVkQXR0cihjYXN0PENGQ29uc3VtZWRBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpDRlJldHVybnNOb3RSZXRhaW5lZDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VDRlJldHVybnNOb3RSZXRhaW5lZEF0dHIoY2FzdDxDRlJldHVybnNOb3RSZXRhaW5lZEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkNGUmV0dXJuc1JldGFpbmVkOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUNGUmV0dXJuc1JldGFpbmVkQXR0cihjYXN0PENGUmV0dXJuc1JldGFpbmVkQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6Q0ZVbmtub3duVHJhbnNmZXI6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQ0ZVbmtub3duVHJhbnNmZXJBdHRyKGNhc3Q8Q0ZVbmtub3duVHJhbnNmZXJBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpDVURBQ29uc3RhbnQ6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQ1VEQUNvbnN0YW50QXR0cihjYXN0PENVREFDb25zdGFudEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkNVREFEZXZpY2U6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQ1VEQURldmljZUF0dHIoY2FzdDxDVURBRGV2aWNlQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6Q1VEQUdsb2JhbDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VDVURBR2xvYmFsQXR0cihjYXN0PENVREFHbG9iYWxBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpDVURBSG9zdDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VDVURBSG9zdEF0dHIoY2FzdDxDVURBSG9zdEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkNVREFJbnZhbGlkVGFyZ2V0OgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUNVREFJbnZhbGlkVGFyZ2V0QXR0cihjYXN0PENVREFJbnZhbGlkVGFyZ2V0QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6Q1VEQUxhdW5jaEJvdW5kczoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VDVURBTGF1bmNoQm91bmRzQXR0cihjYXN0PENVREFMYXVuY2hCb3VuZHNBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpDVURBU2hhcmVkOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUNVREFTaGFyZWRBdHRyKGNhc3Q8Q1VEQVNoYXJlZEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkNYWDExTm9SZXR1cm46CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQ1hYMTFOb1JldHVybkF0dHIoY2FzdDxDWFgxMU5vUmV0dXJuQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6Q2FsbGFibGVXaGVuOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUNhbGxhYmxlV2hlbkF0dHIoY2FzdDxDYWxsYWJsZVdoZW5BdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpDYXBhYmlsaXR5OgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUNhcGFiaWxpdHlBdHRyKGNhc3Q8Q2FwYWJpbGl0eUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkNhcHR1cmVkUmVjb3JkOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUNhcHR1cmVkUmVjb3JkQXR0cihjYXN0PENhcHR1cmVkUmVjb3JkQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6Q2Fycmllc0RlcGVuZGVuY3k6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQ2Fycmllc0RlcGVuZGVuY3lBdHRyKGNhc3Q8Q2Fycmllc0RlcGVuZGVuY3lBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpDbGVhbnVwOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUNsZWFudXBBdHRyKGNhc3Q8Q2xlYW51cEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkNvbGQ6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQ29sZEF0dHIoY2FzdDxDb2xkQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6Q29tbW9uOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUNvbW1vbkF0dHIoY2FzdDxDb21tb25BdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpDb25zdDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VDb25zdEF0dHIoY2FzdDxDb25zdEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkNvbnN0cnVjdG9yOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUNvbnN0cnVjdG9yQXR0cihjYXN0PENvbnN0cnVjdG9yQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6Q29uc3VtYWJsZToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VDb25zdW1hYmxlQXR0cihjYXN0PENvbnN1bWFibGVBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpDb25zdW1hYmxlQXV0b0Nhc3Q6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQ29uc3VtYWJsZUF1dG9DYXN0QXR0cihjYXN0PENvbnN1bWFibGVBdXRvQ2FzdEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkNvbnN1bWFibGVTZXRPblJlYWQ6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlQ29uc3VtYWJsZVNldE9uUmVhZEF0dHIoY2FzdDxDb25zdW1hYmxlU2V0T25SZWFkQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6Q29udmVyZ2VudDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VDb252ZXJnZW50QXR0cihjYXN0PENvbnZlcmdlbnRBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpETExFeHBvcnQ6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlRExMRXhwb3J0QXR0cihjYXN0PERMTEV4cG9ydEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkRMTEltcG9ydDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VETExJbXBvcnRBdHRyKGNhc3Q8RExMSW1wb3J0QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6RGVwcmVjYXRlZDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VEZXByZWNhdGVkQXR0cihjYXN0PERlcHJlY2F0ZWRBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpEZXN0cnVjdG9yOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZURlc3RydWN0b3JBdHRyKGNhc3Q8RGVzdHJ1Y3RvckF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkRpYWdub3NlSWY6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlRGlhZ25vc2VJZkF0dHIoY2FzdDxEaWFnbm9zZUlmQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6RGlzYWJsZVRhaWxDYWxsczoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VEaXNhYmxlVGFpbENhbGxzQXR0cihjYXN0PERpc2FibGVUYWlsQ2FsbHNBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpFbXB0eUJhc2VzOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUVtcHR5QmFzZXNBdHRyKGNhc3Q8RW1wdHlCYXNlc0F0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkVuYWJsZUlmOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUVuYWJsZUlmQXR0cihjYXN0PEVuYWJsZUlmQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6RW51bUV4dGVuc2liaWxpdHk6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlRW51bUV4dGVuc2liaWxpdHlBdHRyKGNhc3Q8RW51bUV4dGVuc2liaWxpdHlBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb246CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlRXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uQXR0cihjYXN0PEV4Y2x1c2l2ZVRyeWxvY2tGdW5jdGlvbkF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkV4dGVybmFsU291cmNlU3ltYm9sOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUV4dGVybmFsU291cmNlU3ltYm9sQXR0cihjYXN0PEV4dGVybmFsU291cmNlU3ltYm9sQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6RmFsbFRocm91Z2g6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlRmFsbFRocm91Z2hBdHRyKGNhc3Q8RmFsbFRocm91Z2hBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpGYXN0Q2FsbDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VGYXN0Q2FsbEF0dHIoY2FzdDxGYXN0Q2FsbEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkZpbmFsOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUZpbmFsQXR0cihjYXN0PEZpbmFsQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6RmxhZ0VudW06CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlRmxhZ0VudW1BdHRyKGNhc3Q8RmxhZ0VudW1BdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpGbGF0dGVuOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUZsYXR0ZW5BdHRyKGNhc3Q8RmxhdHRlbkF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkZvcm1hdDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VGb3JtYXRBdHRyKGNhc3Q8Rm9ybWF0QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6Rm9ybWF0QXJnOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUZvcm1hdEFyZ0F0dHIoY2FzdDxGb3JtYXRBcmdBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpHTlVJbmxpbmU6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlR05VSW5saW5lQXR0cihjYXN0PEdOVUlubGluZUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Okd1YXJkZWRCeToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VHdWFyZGVkQnlBdHRyKGNhc3Q8R3VhcmRlZEJ5QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6R3VhcmRlZFZhcjoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VHdWFyZGVkVmFyQXR0cihjYXN0PEd1YXJkZWRWYXJBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpIb3Q6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlSG90QXR0cihjYXN0PEhvdEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OklCQWN0aW9uOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUlCQWN0aW9uQXR0cihjYXN0PElCQWN0aW9uQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6SUJPdXRsZXQ6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlSUJPdXRsZXRBdHRyKGNhc3Q8SUJPdXRsZXRBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpJQk91dGxldENvbGxlY3Rpb246CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlSUJPdXRsZXRDb2xsZWN0aW9uQXR0cihjYXN0PElCT3V0bGV0Q29sbGVjdGlvbkF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OklGdW5jOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUlGdW5jQXR0cihjYXN0PElGdW5jQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6SW5pdFByaW9yaXR5OgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUluaXRQcmlvcml0eUF0dHIoY2FzdDxJbml0UHJpb3JpdHlBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpJbml0U2VnOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUluaXRTZWdBdHRyKGNhc3Q8SW5pdFNlZ0F0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkludGVsT2NsQmljYzoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VJbnRlbE9jbEJpY2NBdHRyKGNhc3Q8SW50ZWxPY2xCaWNjQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6SW50ZXJuYWxMaW5rYWdlOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUludGVybmFsTGlua2FnZUF0dHIoY2FzdDxJbnRlcm5hbExpbmthZ2VBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpMVE9WaXNpYmlsaXR5UHVibGljOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUxUT1Zpc2liaWxpdHlQdWJsaWNBdHRyKGNhc3Q8TFRPVmlzaWJpbGl0eVB1YmxpY0F0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OkxheW91dFZlcnNpb246CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlTGF5b3V0VmVyc2lvbkF0dHIoY2FzdDxMYXlvdXRWZXJzaW9uQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6TG9ja1JldHVybmVkOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUxvY2tSZXR1cm5lZEF0dHIoY2FzdDxMb2NrUmV0dXJuZWRBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpMb2Nrc0V4Y2x1ZGVkOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUxvY2tzRXhjbHVkZWRBdHRyKGNhc3Q8TG9ja3NFeGNsdWRlZEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Okxvb3BIaW50OgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZUxvb3BIaW50QXR0cihjYXN0PExvb3BIaW50QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6TVNBQkk6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlTVNBQklBdHRyKGNhc3Q8TVNBQklBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpNU0luaGVyaXRhbmNlOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZU1TSW5oZXJpdGFuY2VBdHRyKGNhc3Q8TVNJbmhlcml0YW5jZUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok1TTm9WVGFibGU6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlTVNOb1ZUYWJsZUF0dHIoY2FzdDxNU05vVlRhYmxlQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6TVNQNDMwSW50ZXJydXB0OgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZU1TUDQzMEludGVycnVwdEF0dHIoY2FzdDxNU1A0MzBJbnRlcnJ1cHRBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpNU1N0cnVjdDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VNU1N0cnVjdEF0dHIoY2FzdDxNU1N0cnVjdEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok1TVnRvckRpc3A6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlTVNWdG9yRGlzcEF0dHIoY2FzdDxNU1Z0b3JEaXNwQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6TWF4RmllbGRBbGlnbm1lbnQ6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlTWF4RmllbGRBbGlnbm1lbnRBdHRyKGNhc3Q8TWF4RmllbGRBbGlnbm1lbnRBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpNYXlBbGlhczoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VNYXlBbGlhc0F0dHIoY2FzdDxNYXlBbGlhc0F0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok1pY3JvTWlwczoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VNaWNyb01pcHNBdHRyKGNhc3Q8TWljcm9NaXBzQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6TWluU2l6ZToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VNaW5TaXplQXR0cihjYXN0PE1pblNpemVBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpNaXBzMTY6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlTWlwczE2QXR0cihjYXN0PE1pcHMxNkF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok1pcHNJbnRlcnJ1cHQ6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlTWlwc0ludGVycnVwdEF0dHIoY2FzdDxNaXBzSW50ZXJydXB0QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6TWlwc0xvbmdDYWxsOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZU1pcHNMb25nQ2FsbEF0dHIoY2FzdDxNaXBzTG9uZ0NhbGxBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpNaXBzU2hvcnRDYWxsOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZU1pcHNTaG9ydENhbGxBdHRyKGNhc3Q8TWlwc1Nob3J0Q2FsbEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok1vZGU6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlTW9kZUF0dHIoY2FzdDxNb2RlQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6TlNDb25zdW1lZDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VOU0NvbnN1bWVkQXR0cihjYXN0PE5TQ29uc3VtZWRBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpOU0NvbnN1bWVzU2VsZjoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VOU0NvbnN1bWVzU2VsZkF0dHIoY2FzdDxOU0NvbnN1bWVzU2VsZkF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok5TUmV0dXJuc0F1dG9yZWxlYXNlZDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VOU1JldHVybnNBdXRvcmVsZWFzZWRBdHRyKGNhc3Q8TlNSZXR1cm5zQXV0b3JlbGVhc2VkQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6TlNSZXR1cm5zTm90UmV0YWluZWQ6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlTlNSZXR1cm5zTm90UmV0YWluZWRBdHRyKGNhc3Q8TlNSZXR1cm5zTm90UmV0YWluZWRBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpOU1JldHVybnNSZXRhaW5lZDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VOU1JldHVybnNSZXRhaW5lZEF0dHIoY2FzdDxOU1JldHVybnNSZXRhaW5lZEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok5ha2VkOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZU5ha2VkQXR0cihjYXN0PE5ha2VkQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6Tm9BbGlhczoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VOb0FsaWFzQXR0cihjYXN0PE5vQWxpYXNBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpOb0NvbW1vbjoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VOb0NvbW1vbkF0dHIoY2FzdDxOb0NvbW1vbkF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok5vRGVidWc6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlTm9EZWJ1Z0F0dHIoY2FzdDxOb0RlYnVnQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6Tm9EdXBsaWNhdGU6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlTm9EdXBsaWNhdGVBdHRyKGNhc3Q8Tm9EdXBsaWNhdGVBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpOb0VzY2FwZToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VOb0VzY2FwZUF0dHIoY2FzdDxOb0VzY2FwZUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok5vSW5saW5lOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZU5vSW5saW5lQXR0cihjYXN0PE5vSW5saW5lQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6Tm9JbnN0cnVtZW50RnVuY3Rpb246CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlTm9JbnN0cnVtZW50RnVuY3Rpb25BdHRyKGNhc3Q8Tm9JbnN0cnVtZW50RnVuY3Rpb25BdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpOb01pY3JvTWlwczoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VOb01pY3JvTWlwc0F0dHIoY2FzdDxOb01pY3JvTWlwc0F0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok5vTWlwczE2OgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZU5vTWlwczE2QXR0cihjYXN0PE5vTWlwczE2QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6Tm9SZXR1cm46CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlTm9SZXR1cm5BdHRyKGNhc3Q8Tm9SZXR1cm5BdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpOb1Nhbml0aXplOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZU5vU2FuaXRpemVBdHRyKGNhc3Q8Tm9TYW5pdGl6ZUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok5vU3BsaXRTdGFjazoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VOb1NwbGl0U3RhY2tBdHRyKGNhc3Q8Tm9TcGxpdFN0YWNrQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6Tm9UaHJlYWRTYWZldHlBbmFseXNpczoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VOb1RocmVhZFNhZmV0eUFuYWx5c2lzQXR0cihjYXN0PE5vVGhyZWFkU2FmZXR5QW5hbHlzaXNBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpOb1Rocm93OgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZU5vVGhyb3dBdHRyKGNhc3Q8Tm9UaHJvd0F0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok5vbk51bGw6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlTm9uTnVsbEF0dHIoY2FzdDxOb25OdWxsQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6Tm90VGFpbENhbGxlZDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VOb3RUYWlsQ2FsbGVkQXR0cihjYXN0PE5vdFRhaWxDYWxsZWRBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpPTVBDYXB0dXJlS2luZDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VPTVBDYXB0dXJlS2luZEF0dHIoY2FzdDxPTVBDYXB0dXJlS2luZEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok9NUENhcHR1cmVOb0luaXQ6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlT01QQ2FwdHVyZU5vSW5pdEF0dHIoY2FzdDxPTVBDYXB0dXJlTm9Jbml0QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6T01QRGVjbGFyZVNpbWREZWNsOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZU9NUERlY2xhcmVTaW1kRGVjbEF0dHIoY2FzdDxPTVBEZWNsYXJlU2ltZERlY2xBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpPTVBEZWNsYXJlVGFyZ2V0RGVjbDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VPTVBEZWNsYXJlVGFyZ2V0RGVjbEF0dHIoY2FzdDxPTVBEZWNsYXJlVGFyZ2V0RGVjbEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok9NUFJlZmVyZW5jZWRWYXI6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlT01QUmVmZXJlbmNlZFZhckF0dHIoY2FzdDxPTVBSZWZlcmVuY2VkVmFyQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6T01QVGhyZWFkUHJpdmF0ZURlY2w6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlT01QVGhyZWFkUHJpdmF0ZURlY2xBdHRyKGNhc3Q8T01QVGhyZWFkUHJpdmF0ZURlY2xBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpPYmpDQm94YWJsZToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VPYmpDQm94YWJsZUF0dHIoY2FzdDxPYmpDQm94YWJsZUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok9iakNCcmlkZ2U6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlT2JqQ0JyaWRnZUF0dHIoY2FzdDxPYmpDQnJpZGdlQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6T2JqQ0JyaWRnZU11dGFibGU6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlT2JqQ0JyaWRnZU11dGFibGVBdHRyKGNhc3Q8T2JqQ0JyaWRnZU11dGFibGVBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpPYmpDQnJpZGdlUmVsYXRlZDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VPYmpDQnJpZGdlUmVsYXRlZEF0dHIoY2FzdDxPYmpDQnJpZGdlUmVsYXRlZEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok9iakNEZXNpZ25hdGVkSW5pdGlhbGl6ZXI6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlT2JqQ0Rlc2lnbmF0ZWRJbml0aWFsaXplckF0dHIoY2FzdDxPYmpDRGVzaWduYXRlZEluaXRpYWxpemVyQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6T2JqQ0V4Y2VwdGlvbjoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VPYmpDRXhjZXB0aW9uQXR0cihjYXN0PE9iakNFeGNlcHRpb25BdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpPYmpDRXhwbGljaXRQcm90b2NvbEltcGw6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlT2JqQ0V4cGxpY2l0UHJvdG9jb2xJbXBsQXR0cihjYXN0PE9iakNFeHBsaWNpdFByb3RvY29sSW1wbEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok9iakNJbmRlcGVuZGVudENsYXNzOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZU9iakNJbmRlcGVuZGVudENsYXNzQXR0cihjYXN0PE9iakNJbmRlcGVuZGVudENsYXNzQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6T2JqQ01ldGhvZEZhbWlseToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VPYmpDTWV0aG9kRmFtaWx5QXR0cihjYXN0PE9iakNNZXRob2RGYW1pbHlBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpPYmpDTlNPYmplY3Q6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlT2JqQ05TT2JqZWN0QXR0cihjYXN0PE9iakNOU09iamVjdEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok9iakNQcmVjaXNlTGlmZXRpbWU6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlT2JqQ1ByZWNpc2VMaWZldGltZUF0dHIoY2FzdDxPYmpDUHJlY2lzZUxpZmV0aW1lQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6T2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZU9iakNSZXF1aXJlc1Byb3BlcnR5RGVmc0F0dHIoY2FzdDxPYmpDUmVxdWlyZXNQcm9wZXJ0eURlZnNBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpPYmpDUmVxdWlyZXNTdXBlcjoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VPYmpDUmVxdWlyZXNTdXBlckF0dHIoY2FzdDxPYmpDUmVxdWlyZXNTdXBlckF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok9iakNSZXR1cm5zSW5uZXJQb2ludGVyOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZU9iakNSZXR1cm5zSW5uZXJQb2ludGVyQXR0cihjYXN0PE9iakNSZXR1cm5zSW5uZXJQb2ludGVyQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6T2JqQ1Jvb3RDbGFzczoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VPYmpDUm9vdENsYXNzQXR0cihjYXN0PE9iakNSb290Q2xhc3NBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpPYmpDUnVudGltZU5hbWU6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlT2JqQ1J1bnRpbWVOYW1lQXR0cihjYXN0PE9iakNSdW50aW1lTmFtZUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok9iakNSdW50aW1lVmlzaWJsZToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VPYmpDUnVudGltZVZpc2libGVBdHRyKGNhc3Q8T2JqQ1J1bnRpbWVWaXNpYmxlQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6T2JqQ1N1YmNsYXNzaW5nUmVzdHJpY3RlZDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VPYmpDU3ViY2xhc3NpbmdSZXN0cmljdGVkQXR0cihjYXN0PE9iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWRBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpPcGVuQ0xBY2Nlc3M6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlT3BlbkNMQWNjZXNzQXR0cihjYXN0PE9wZW5DTEFjY2Vzc0F0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok9wZW5DTEludGVsUmVxZFN1Ykdyb3VwU2l6ZToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VPcGVuQ0xJbnRlbFJlcWRTdWJHcm91cFNpemVBdHRyKGNhc3Q8T3BlbkNMSW50ZWxSZXFkU3ViR3JvdXBTaXplQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6T3BlbkNMS2VybmVsOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZU9wZW5DTEtlcm5lbEF0dHIoY2FzdDxPcGVuQ0xLZXJuZWxBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpPcGVuQ0xVbnJvbGxIaW50OgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZU9wZW5DTFVucm9sbEhpbnRBdHRyKGNhc3Q8T3BlbkNMVW5yb2xsSGludEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok9wdGltaXplTm9uZToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VPcHRpbWl6ZU5vbmVBdHRyKGNhc3Q8T3B0aW1pemVOb25lQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6T3ZlcmxvYWRhYmxlOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZU92ZXJsb2FkYWJsZUF0dHIoY2FzdDxPdmVybG9hZGFibGVBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpPdmVycmlkZToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VPdmVycmlkZUF0dHIoY2FzdDxPdmVycmlkZUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Ok93bmVyc2hpcDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VPd25lcnNoaXBBdHRyKGNhc3Q8T3duZXJzaGlwQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6UGFja2VkOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVBhY2tlZEF0dHIoY2FzdDxQYWNrZWRBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpQYXJhbVR5cGVzdGF0ZToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VQYXJhbVR5cGVzdGF0ZUF0dHIoY2FzdDxQYXJhbVR5cGVzdGF0ZUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlBhc2NhbDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VQYXNjYWxBdHRyKGNhc3Q8UGFzY2FsQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6UGFzc09iamVjdFNpemU6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlUGFzc09iamVjdFNpemVBdHRyKGNhc3Q8UGFzc09iamVjdFNpemVBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpQY3M6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlUGNzQXR0cihjYXN0PFBjc0F0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlByYWdtYUNsYW5nQlNTU2VjdGlvbjoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VQcmFnbWFDbGFuZ0JTU1NlY3Rpb25BdHRyKGNhc3Q8UHJhZ21hQ2xhbmdCU1NTZWN0aW9uQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6UHJhZ21hQ2xhbmdEYXRhU2VjdGlvbjoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VQcmFnbWFDbGFuZ0RhdGFTZWN0aW9uQXR0cihjYXN0PFByYWdtYUNsYW5nRGF0YVNlY3Rpb25BdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb246CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlUHJhZ21hQ2xhbmdSb2RhdGFTZWN0aW9uQXR0cihjYXN0PFByYWdtYUNsYW5nUm9kYXRhU2VjdGlvbkF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlByYWdtYUNsYW5nVGV4dFNlY3Rpb246CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlUHJhZ21hQ2xhbmdUZXh0U2VjdGlvbkF0dHIoY2FzdDxQcmFnbWFDbGFuZ1RleHRTZWN0aW9uQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6UHJlc2VydmVBbGw6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlUHJlc2VydmVBbGxBdHRyKGNhc3Q8UHJlc2VydmVBbGxBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpQcmVzZXJ2ZU1vc3Q6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlUHJlc2VydmVNb3N0QXR0cihjYXN0PFByZXNlcnZlTW9zdEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlB0R3VhcmRlZEJ5OgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVB0R3VhcmRlZEJ5QXR0cihjYXN0PFB0R3VhcmRlZEJ5QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6UHRHdWFyZGVkVmFyOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVB0R3VhcmRlZFZhckF0dHIoY2FzdDxQdEd1YXJkZWRWYXJBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpQdXJlOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVB1cmVBdHRyKGNhc3Q8UHVyZUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlJlZ0NhbGw6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlUmVnQ2FsbEF0dHIoY2FzdDxSZWdDYWxsQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6UmVsZWFzZUNhcGFiaWxpdHk6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlUmVsZWFzZUNhcGFiaWxpdHlBdHRyKGNhc3Q8UmVsZWFzZUNhcGFiaWxpdHlBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpSZW5kZXJTY3JpcHRLZXJuZWw6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlUmVuZGVyU2NyaXB0S2VybmVsQXR0cihjYXN0PFJlbmRlclNjcmlwdEtlcm5lbEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlJlcWRXb3JrR3JvdXBTaXplOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVJlcWRXb3JrR3JvdXBTaXplQXR0cihjYXN0PFJlcWRXb3JrR3JvdXBTaXplQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6UmVxdWlyZUNvbnN0YW50SW5pdDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VSZXF1aXJlQ29uc3RhbnRJbml0QXR0cihjYXN0PFJlcXVpcmVDb25zdGFudEluaXRBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpSZXF1aXJlc0NhcGFiaWxpdHk6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlUmVxdWlyZXNDYXBhYmlsaXR5QXR0cihjYXN0PFJlcXVpcmVzQ2FwYWJpbGl0eUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlJlc3RyaWN0OgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVJlc3RyaWN0QXR0cihjYXN0PFJlc3RyaWN0QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6UmV0dXJuVHlwZXN0YXRlOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVJldHVyblR5cGVzdGF0ZUF0dHIoY2FzdDxSZXR1cm5UeXBlc3RhdGVBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpSZXR1cm5zTm9uTnVsbDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VSZXR1cm5zTm9uTnVsbEF0dHIoY2FzdDxSZXR1cm5zTm9uTnVsbEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlJldHVybnNUd2ljZToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VSZXR1cm5zVHdpY2VBdHRyKGNhc3Q8UmV0dXJuc1R3aWNlQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6U2NvcGVkTG9ja2FibGU6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlU2NvcGVkTG9ja2FibGVBdHRyKGNhc3Q8U2NvcGVkTG9ja2FibGVBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpTZWN0aW9uOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVNlY3Rpb25BdHRyKGNhc3Q8U2VjdGlvbkF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlNlbGVjdEFueToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VTZWxlY3RBbnlBdHRyKGNhc3Q8U2VsZWN0QW55QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6U2VudGluZWw6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlU2VudGluZWxBdHRyKGNhc3Q8U2VudGluZWxBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpTZXRUeXBlc3RhdGU6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlU2V0VHlwZXN0YXRlQXR0cihjYXN0PFNldFR5cGVzdGF0ZUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlNoYXJlZFRyeWxvY2tGdW5jdGlvbjoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VTaGFyZWRUcnlsb2NrRnVuY3Rpb25BdHRyKGNhc3Q8U2hhcmVkVHJ5bG9ja0Z1bmN0aW9uQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6U3RkQ2FsbDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VTdGRDYWxsQXR0cihjYXN0PFN0ZENhbGxBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpTdXBwcmVzczoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VTdXBwcmVzc0F0dHIoY2FzdDxTdXBwcmVzc0F0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlN3aWZ0Q2FsbDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VTd2lmdENhbGxBdHRyKGNhc3Q8U3dpZnRDYWxsQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6U3dpZnRDb250ZXh0OgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVN3aWZ0Q29udGV4dEF0dHIoY2FzdDxTd2lmdENvbnRleHRBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpTd2lmdEVycm9yUmVzdWx0OgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVN3aWZ0RXJyb3JSZXN1bHRBdHRyKGNhc3Q8U3dpZnRFcnJvclJlc3VsdEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlN3aWZ0SW5kaXJlY3RSZXN1bHQ6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlU3dpZnRJbmRpcmVjdFJlc3VsdEF0dHIoY2FzdDxTd2lmdEluZGlyZWN0UmVzdWx0QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6U3lzVkFCSToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VTeXNWQUJJQXR0cihjYXN0PFN5c1ZBQklBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpUTFNNb2RlbDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VUTFNNb2RlbEF0dHIoY2FzdDxUTFNNb2RlbEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlRhcmdldDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VUYXJnZXRBdHRyKGNhc3Q8VGFyZ2V0QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6VGVzdFR5cGVzdGF0ZToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VUZXN0VHlwZXN0YXRlQXR0cihjYXN0PFRlc3RUeXBlc3RhdGVBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpUaGlzQ2FsbDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VUaGlzQ2FsbEF0dHIoY2FzdDxUaGlzQ2FsbEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlRocmVhZDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VUaHJlYWRBdHRyKGNhc3Q8VGhyZWFkQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6VHJhbnNwYXJlbnRVbmlvbjoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VUcmFuc3BhcmVudFVuaW9uQXR0cihjYXN0PFRyYW5zcGFyZW50VW5pb25BdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpUcml2aWFsQUJJOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVRyaXZpYWxBQklBdHRyKGNhc3Q8VHJpdmlhbEFCSUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlRyeUFjcXVpcmVDYXBhYmlsaXR5OgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVRyeUFjcXVpcmVDYXBhYmlsaXR5QXR0cihjYXN0PFRyeUFjcXVpcmVDYXBhYmlsaXR5QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6VHlwZVRhZ0ZvckRhdGF0eXBlOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVR5cGVUYWdGb3JEYXRhdHlwZUF0dHIoY2FzdDxUeXBlVGFnRm9yRGF0YXR5cGVBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpUeXBlVmlzaWJpbGl0eToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VUeXBlVmlzaWJpbGl0eUF0dHIoY2FzdDxUeXBlVmlzaWJpbGl0eUF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlVuYXZhaWxhYmxlOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVVuYXZhaWxhYmxlQXR0cihjYXN0PFVuYXZhaWxhYmxlQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6VW51c2VkOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVVudXNlZEF0dHIoY2FzdDxVbnVzZWRBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpVc2VkOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVVzZWRBdHRyKGNhc3Q8VXNlZEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlV1aWQ6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlVXVpZEF0dHIoY2FzdDxVdWlkQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6VmVjUmV0dXJuOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVZlY1JldHVybkF0dHIoY2FzdDxWZWNSZXR1cm5BdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpWZWNUeXBlSGludDoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VWZWNUeXBlSGludEF0dHIoY2FzdDxWZWNUeXBlSGludEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlZlY3RvckNhbGw6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlVmVjdG9yQ2FsbEF0dHIoY2FzdDxWZWN0b3JDYWxsQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6VmlzaWJpbGl0eToKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VWaXNpYmlsaXR5QXR0cihjYXN0PFZpc2liaWxpdHlBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpXYXJuVW51c2VkOgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVdhcm5VbnVzZWRBdHRyKGNhc3Q8V2FyblVudXNlZEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6Oldhcm5VbnVzZWRSZXN1bHQ6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlV2FyblVudXNlZFJlc3VsdEF0dHIoY2FzdDxXYXJuVW51c2VkUmVzdWx0QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6V2VhazoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VXZWFrQXR0cihjYXN0PFdlYWtBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpXZWFrSW1wb3J0OgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVdlYWtJbXBvcnRBdHRyKGNhc3Q8V2Vha0ltcG9ydEF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OldlYWtSZWY6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlV2Vha1JlZkF0dHIoY2FzdDxXZWFrUmVmQXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6V29ya0dyb3VwU2l6ZUhpbnQ6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlV29ya0dyb3VwU2l6ZUhpbnRBdHRyKGNhc3Q8V29ya0dyb3VwU2l6ZUhpbnRBdHRyPihBKSk7CisgICAgY2FzZSBhdHRyOjpYODZGb3JjZUFsaWduQXJnUG9pbnRlcjoKKyAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VYODZGb3JjZUFsaWduQXJnUG9pbnRlckF0dHIoY2FzdDxYODZGb3JjZUFsaWduQXJnUG9pbnRlckF0dHI+KEEpKTsKKyAgICBjYXNlIGF0dHI6OlhSYXlJbnN0cnVtZW50OgorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVhSYXlJbnN0cnVtZW50QXR0cihjYXN0PFhSYXlJbnN0cnVtZW50QXR0cj4oQSkpOworICAgIGNhc2UgYXR0cjo6WFJheUxvZ0FyZ3M6CisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlWFJheUxvZ0FyZ3NBdHRyKGNhc3Q8WFJheUxvZ0FyZ3NBdHRyPihBKSk7CisgIH0KKyAgbGx2bV91bnJlYWNoYWJsZSgiYmFkIGF0dHJpYnV0ZSBraW5kIik7Cit9CisjZW5kaWYgIC8vIEFUVFJfVklTSVRPUl9ERUNMU19PTkxZCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQXR0cnMuaW5jIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0F0dHJzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODY4MjZiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0F0dHJzLmluYwpAQCAtMCwwICsxLDg3OTIgQEAKKy8qPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogQXR0cmlidXRlIGNsYXNzZXMnIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLCBkbyBub3QgZWRpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9DTEFOR19BVFRSX0NMQVNTRVNfSU5DCisjZGVmaW5lIExMVk1fQ0xBTkdfQVRUUl9DTEFTU0VTX0lOQworCitjbGFzcyBBTURHUFVGbGF0V29ya0dyb3VwU2l6ZUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3Vuc2lnbmVkIG1pbjsKKwordW5zaWduZWQgbWF4OworCitwdWJsaWM6CisgIHN0YXRpYyBBTURHUFVGbGF0V29ya0dyb3VwU2l6ZUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgdW5zaWduZWQgTWluLCB1bnNpZ25lZCBNYXgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIEFNREdQVUZsYXRXb3JrR3JvdXBTaXplQXR0cihMb2MsIEN0eCwgTWluLCBNYXgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQU1ER1BVRmxhdFdvcmtHcm91cFNpemVBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIE1pbgorICAgICAgICAgICAgICAsIHVuc2lnbmVkIE1heAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkFNREdQVUZsYXRXb3JrR3JvdXBTaXplLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIG1pbihNaW4pCisgICAgICAgICAgICAgICwgbWF4KE1heCkKKyAgeworICB9CisKKyAgQU1ER1BVRmxhdFdvcmtHcm91cFNpemVBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIHVuc2lnbmVkIGdldE1pbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbWluOworICB9CisKKyAgdW5zaWduZWQgZ2V0TWF4KCkgY29uc3QgeworICAgIHJldHVybiBtYXg7CisgIH0KKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6QU1ER1BVRmxhdFdvcmtHcm91cFNpemU7IH0KK307CisKK2NsYXNzIEFNREdQVU51bVNHUFJBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7Cit1bnNpZ25lZCBudW1TR1BSOworCitwdWJsaWM6CisgIHN0YXRpYyBBTURHUFVOdW1TR1BSQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCB1bnNpZ25lZCBOdW1TR1BSLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBBTURHUFVOdW1TR1BSQXR0cihMb2MsIEN0eCwgTnVtU0dQUiwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBBTURHUFVOdW1TR1BSQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBOdW1TR1BSCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6QU1ER1BVTnVtU0dQUiwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBudW1TR1BSKE51bVNHUFIpCisgIHsKKyAgfQorCisgIEFNREdQVU51bVNHUFJBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIHVuc2lnbmVkIGdldE51bVNHUFIoKSBjb25zdCB7CisgICAgcmV0dXJuIG51bVNHUFI7CisgIH0KKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6QU1ER1BVTnVtU0dQUjsgfQorfTsKKworY2xhc3MgQU1ER1BVTnVtVkdQUkF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3Vuc2lnbmVkIG51bVZHUFI7CisKK3B1YmxpYzoKKyAgc3RhdGljIEFNREdQVU51bVZHUFJBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIHVuc2lnbmVkIE51bVZHUFIsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIEFNREdQVU51bVZHUFJBdHRyKExvYywgQ3R4LCBOdW1WR1BSLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIEFNREdQVU51bVZHUFJBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIE51bVZHUFIKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpBTURHUFVOdW1WR1BSLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIG51bVZHUFIoTnVtVkdQUikKKyAgeworICB9CisKKyAgQU1ER1BVTnVtVkdQUkF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0TnVtVkdQUigpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVtVkdQUjsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpBTURHUFVOdW1WR1BSOyB9Cit9OworCitjbGFzcyBBTURHUFVXYXZlc1BlckVVQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgewordW5zaWduZWQgbWluOworCit1bnNpZ25lZCBtYXg7CisKK3B1YmxpYzoKKyAgc3RhdGljIEFNREdQVVdhdmVzUGVyRVVBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIHVuc2lnbmVkIE1pbiwgdW5zaWduZWQgTWF4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBBTURHUFVXYXZlc1BlckVVQXR0cihMb2MsIEN0eCwgTWluLCBNYXgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQU1ER1BVV2F2ZXNQZXJFVUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgTWluCisgICAgICAgICAgICAgICwgdW5zaWduZWQgTWF4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6QU1ER1BVV2F2ZXNQZXJFVSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBtaW4oTWluKQorICAgICAgICAgICAgICAsIG1heChNYXgpCisgIHsKKyAgfQorCisgIEFNREdQVVdhdmVzUGVyRVVBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIE1pbgorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkFNREdQVVdhdmVzUGVyRVUsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgbWluKE1pbikKKyAgICAgICAgICAgICAgLCBtYXgoKQorICB7CisgIH0KKworICBBTURHUFVXYXZlc1BlckVVQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICB1bnNpZ25lZCBnZXRNaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG1pbjsKKyAgfQorCisgIHVuc2lnbmVkIGdldE1heCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWF4OworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkFNREdQVVdhdmVzUGVyRVU7IH0KK307CisKK2NsYXNzIEFSTUludGVycnVwdEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgZW51bSBJbnRlcnJ1cHRUeXBlIHsKKyAgICBJUlEsCisgICAgRklRLAorICAgIFNXSSwKKyAgICBBQk9SVCwKKyAgICBVTkRFRiwKKyAgICBHZW5lcmljCisgIH07Citwcml2YXRlOgorICBJbnRlcnJ1cHRUeXBlIGludGVycnVwdDsKKworcHVibGljOgorICBzdGF0aWMgQVJNSW50ZXJydXB0QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBJbnRlcnJ1cHRUeXBlIEludGVycnVwdCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQVJNSW50ZXJydXB0QXR0cihMb2MsIEN0eCwgSW50ZXJydXB0LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIEFSTUludGVycnVwdEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgSW50ZXJydXB0VHlwZSBJbnRlcnJ1cHQKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpBUk1JbnRlcnJ1cHQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgaW50ZXJydXB0KEludGVycnVwdCkKKyAgeworICB9CisKKyAgQVJNSW50ZXJydXB0QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpBUk1JbnRlcnJ1cHQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgaW50ZXJydXB0KEludGVycnVwdFR5cGUoMCkpCisgIHsKKyAgfQorCisgIEFSTUludGVycnVwdEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgSW50ZXJydXB0VHlwZSBnZXRJbnRlcnJ1cHQoKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVycnVwdDsKKyAgfQorCisgIHN0YXRpYyBib29sIENvbnZlcnRTdHJUb0ludGVycnVwdFR5cGUoU3RyaW5nUmVmIFZhbCwgSW50ZXJydXB0VHlwZSAmT3V0KSB7CisgICAgT3B0aW9uYWw8SW50ZXJydXB0VHlwZT4gUiA9IGxsdm06OlN0cmluZ1N3aXRjaDxPcHRpb25hbDxJbnRlcnJ1cHRUeXBlPj4oVmFsKQorICAgICAgLkNhc2UoIklSUSIsIEFSTUludGVycnVwdEF0dHI6OklSUSkKKyAgICAgIC5DYXNlKCJGSVEiLCBBUk1JbnRlcnJ1cHRBdHRyOjpGSVEpCisgICAgICAuQ2FzZSgiU1dJIiwgQVJNSW50ZXJydXB0QXR0cjo6U1dJKQorICAgICAgLkNhc2UoIkFCT1JUIiwgQVJNSW50ZXJydXB0QXR0cjo6QUJPUlQpCisgICAgICAuQ2FzZSgiVU5ERUYiLCBBUk1JbnRlcnJ1cHRBdHRyOjpVTkRFRikKKyAgICAgIC5DYXNlKCIiLCBBUk1JbnRlcnJ1cHRBdHRyOjpHZW5lcmljKQorICAgICAgLkRlZmF1bHQoT3B0aW9uYWw8SW50ZXJydXB0VHlwZT4oKSk7CisgICAgaWYgKFIpIHsKKyAgICAgIE91dCA9ICpSOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBjaGFyICpDb252ZXJ0SW50ZXJydXB0VHlwZVRvU3RyKEludGVycnVwdFR5cGUgVmFsKSB7CisgICAgc3dpdGNoKFZhbCkgeworICAgIGNhc2UgQVJNSW50ZXJydXB0QXR0cjo6SVJROiByZXR1cm4gIklSUSI7CisgICAgY2FzZSBBUk1JbnRlcnJ1cHRBdHRyOjpGSVE6IHJldHVybiAiRklRIjsKKyAgICBjYXNlIEFSTUludGVycnVwdEF0dHI6OlNXSTogcmV0dXJuICJTV0kiOworICAgIGNhc2UgQVJNSW50ZXJydXB0QXR0cjo6QUJPUlQ6IHJldHVybiAiQUJPUlQiOworICAgIGNhc2UgQVJNSW50ZXJydXB0QXR0cjo6VU5ERUY6IHJldHVybiAiVU5ERUYiOworICAgIGNhc2UgQVJNSW50ZXJydXB0QXR0cjo6R2VuZXJpYzogcmV0dXJuICIiOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJObyBlbnVtZXJhdG9yIHdpdGggdGhhdCB2YWx1ZSIpOworICB9CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpBUk1JbnRlcnJ1cHQ7IH0KK307CisKK2NsYXNzIEFWUkludGVycnVwdEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIEFWUkludGVycnVwdEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQVZSSW50ZXJydXB0QXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBBVlJJbnRlcnJ1cHRBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkFWUkludGVycnVwdCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgQVZSSW50ZXJydXB0QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6QVZSSW50ZXJydXB0OyB9Cit9OworCitjbGFzcyBBVlJTaWduYWxBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBBVlJTaWduYWxBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIEFWUlNpZ25hbEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQVZSU2lnbmFsQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpBVlJTaWduYWwsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIEFWUlNpZ25hbEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkFWUlNpZ25hbDsgfQorfTsKKworY2xhc3MgQWJpVGFnQXR0ciA6IHB1YmxpYyBBdHRyIHsKKyAgdW5zaWduZWQgdGFnc19TaXplOworICBTdHJpbmdSZWYgKnRhZ3NfOworCitwdWJsaWM6CisgIHN0YXRpYyBBYmlUYWdBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFN0cmluZ1JlZiAqVGFncywgdW5zaWduZWQgVGFnc1NpemUsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIEFiaVRhZ0F0dHIoTG9jLCBDdHgsIFRhZ3MsIFRhZ3NTaXplLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIEFiaVRhZ0F0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgU3RyaW5nUmVmICpUYWdzLCB1bnNpZ25lZCBUYWdzU2l6ZQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogQXR0cihhdHRyOjpBYmlUYWcsIFIsIFNJLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCB0YWdzX1NpemUoVGFnc1NpemUpLCB0YWdzXyhuZXcgKEN0eCwgMTYpIFN0cmluZ1JlZlt0YWdzX1NpemVdKQorICB7CisgICAgZm9yIChzaXplX3QgSSA9IDAsIEUgPSB0YWdzX1NpemU7IEkgIT0gRTsKKyAgICAgICAgICsrSSkgeworICAgICAgU3RyaW5nUmVmIFJlZiA9IFRhZ3NbSV07CisgICAgICBpZiAoIVJlZi5lbXB0eSgpKSB7CisgICAgICAgIGNoYXIgKk1lbSA9IG5ldyAoQ3R4LCAxKSBjaGFyW1JlZi5zaXplKCldOworICAgICAgICBzdGQ6Om1lbWNweShNZW0sIFJlZi5kYXRhKCksIFJlZi5zaXplKCkpOworICAgICAgICB0YWdzX1tJXSA9IFN0cmluZ1JlZihNZW0sIFJlZi5zaXplKCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEFiaVRhZ0F0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBBdHRyKGF0dHI6OkFiaVRhZywgUiwgU0ksIGZhbHNlKQorICAgICAgICAgICAgICAsIHRhZ3NfU2l6ZSgwKSwgdGFnc18obnVsbHB0cikKKyAgeworICB9CisKKyAgQWJpVGFnQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICB0eXBlZGVmIFN0cmluZ1JlZiogdGFnc19pdGVyYXRvcjsKKyAgdGFnc19pdGVyYXRvciB0YWdzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gdGFnc187IH0KKyAgdGFnc19pdGVyYXRvciB0YWdzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIHRhZ3NfICsgdGFnc19TaXplOyB9CisgIHVuc2lnbmVkIHRhZ3Nfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHRhZ3NfU2l6ZTsgfQorICBsbHZtOjppdGVyYXRvcl9yYW5nZTx0YWdzX2l0ZXJhdG9yPiB0YWdzKCkgY29uc3QgeyByZXR1cm4gbGx2bTo6bWFrZV9yYW5nZSh0YWdzX2JlZ2luKCksIHRhZ3NfZW5kKCkpOyB9CisKKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6QWJpVGFnOyB9Cit9OworCitjbGFzcyBBY3F1aXJlQ2FwYWJpbGl0eUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKKyAgdW5zaWduZWQgYXJnc19TaXplOworICBFeHByICogKmFyZ3NfOworCitwdWJsaWM6CisgIGVudW0gU3BlbGxpbmcgeworICAgIEdOVV9hY3F1aXJlX2NhcGFiaWxpdHkgPSAwLAorICAgIENYWDExX2NsYW5nX2FjcXVpcmVfY2FwYWJpbGl0eSA9IDEsCisgICAgR05VX2FjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkgPSAyLAorICAgIENYWDExX2NsYW5nX2FjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkgPSAzLAorICAgIEdOVV9leGNsdXNpdmVfbG9ja19mdW5jdGlvbiA9IDQsCisgICAgR05VX3NoYXJlZF9sb2NrX2Z1bmN0aW9uID0gNQorICB9OworCisgIHN0YXRpYyBBY3F1aXJlQ2FwYWJpbGl0eUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU3BlbGxpbmcgUywgRXhwciAqICpBcmdzLCB1bnNpZ25lZCBBcmdzU2l6ZSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQWNxdWlyZUNhcGFiaWxpdHlBdHRyKExvYywgQ3R4LCBBcmdzLCBBcmdzU2l6ZSwgUyk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBBY3F1aXJlQ2FwYWJpbGl0eUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgRXhwciAqICpBcmdzLCB1bnNpZ25lZCBBcmdzU2l6ZQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkFjcXVpcmVDYXBhYmlsaXR5LCBSLCBTSSwgdHJ1ZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgLCBhcmdzX1NpemUoQXJnc1NpemUpLCBhcmdzXyhuZXcgKEN0eCwgMTYpIEV4cHIgKlthcmdzX1NpemVdKQorICB7CisgICAgc3RkOjpjb3B5KEFyZ3MsIEFyZ3MgKyBhcmdzX1NpemUsIGFyZ3NfKTsKKyAgfQorCisgIEFjcXVpcmVDYXBhYmlsaXR5QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpBY3F1aXJlQ2FwYWJpbGl0eSwgUiwgU0ksIHRydWUsIHRydWUpCisgICAgICAgICAgICAgICwgYXJnc19TaXplKDApLCBhcmdzXyhudWxscHRyKQorICB7CisgIH0KKworICBBY3F1aXJlQ2FwYWJpbGl0eUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgU3BlbGxpbmcgZ2V0U2VtYW50aWNTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc3BlbGxpbmcgbGlzdCBpbmRleCIpOworICAgIGNhc2UgMDogcmV0dXJuIEdOVV9hY3F1aXJlX2NhcGFiaWxpdHk7CisgICAgY2FzZSAxOiByZXR1cm4gQ1hYMTFfY2xhbmdfYWNxdWlyZV9jYXBhYmlsaXR5OworICAgIGNhc2UgMjogcmV0dXJuIEdOVV9hY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5OworICAgIGNhc2UgMzogcmV0dXJuIENYWDExX2NsYW5nX2FjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHk7CisgICAgY2FzZSA0OiByZXR1cm4gR05VX2V4Y2x1c2l2ZV9sb2NrX2Z1bmN0aW9uOworICAgIGNhc2UgNTogcmV0dXJuIEdOVV9zaGFyZWRfbG9ja19mdW5jdGlvbjsKKyAgfQorICB9CisgIGJvb2wgaXNTaGFyZWQoKSBjb25zdCB7IHJldHVybiBTcGVsbGluZ0xpc3RJbmRleCA9PSAyIHx8CisgICAgU3BlbGxpbmdMaXN0SW5kZXggPT0gMyB8fAorICAgIFNwZWxsaW5nTGlzdEluZGV4ID09IDU7IH0KKyAgdHlwZWRlZiBFeHByICoqIGFyZ3NfaXRlcmF0b3I7CisgIGFyZ3NfaXRlcmF0b3IgYXJnc19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGFyZ3NfOyB9CisgIGFyZ3NfaXRlcmF0b3IgYXJnc19lbmQoKSBjb25zdCB7IHJldHVybiBhcmdzXyArIGFyZ3NfU2l6ZTsgfQorICB1bnNpZ25lZCBhcmdzX3NpemUoKSBjb25zdCB7IHJldHVybiBhcmdzX1NpemU7IH0KKyAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8YXJnc19pdGVyYXRvcj4gYXJncygpIGNvbnN0IHsgcmV0dXJuIGxsdm06Om1ha2VfcmFuZ2UoYXJnc19iZWdpbigpLCBhcmdzX2VuZCgpKTsgfQorCisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkFjcXVpcmVDYXBhYmlsaXR5OyB9Cit9OworCitjbGFzcyBBY3F1aXJlZEFmdGVyQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworICB1bnNpZ25lZCBhcmdzX1NpemU7CisgIEV4cHIgKiAqYXJnc187CisKK3B1YmxpYzoKKyAgc3RhdGljIEFjcXVpcmVkQWZ0ZXJBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIEV4cHIgKiAqQXJncywgdW5zaWduZWQgQXJnc1NpemUsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIEFjcXVpcmVkQWZ0ZXJBdHRyKExvYywgQ3R4LCBBcmdzLCBBcmdzU2l6ZSwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBBY3F1aXJlZEFmdGVyQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBFeHByICogKkFyZ3MsIHVuc2lnbmVkIEFyZ3NTaXplCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6QWNxdWlyZWRBZnRlciwgUiwgU0ksIHRydWUsIHRydWUpCisgICAgICAgICAgICAgICwgYXJnc19TaXplKEFyZ3NTaXplKSwgYXJnc18obmV3IChDdHgsIDE2KSBFeHByICpbYXJnc19TaXplXSkKKyAgeworICAgIHN0ZDo6Y29weShBcmdzLCBBcmdzICsgYXJnc19TaXplLCBhcmdzXyk7CisgIH0KKworICBBY3F1aXJlZEFmdGVyQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpBY3F1aXJlZEFmdGVyLCBSLCBTSSwgdHJ1ZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgLCBhcmdzX1NpemUoMCksIGFyZ3NfKG51bGxwdHIpCisgIHsKKyAgfQorCisgIEFjcXVpcmVkQWZ0ZXJBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIHR5cGVkZWYgRXhwciAqKiBhcmdzX2l0ZXJhdG9yOworICBhcmdzX2l0ZXJhdG9yIGFyZ3NfYmVnaW4oKSBjb25zdCB7IHJldHVybiBhcmdzXzsgfQorICBhcmdzX2l0ZXJhdG9yIGFyZ3NfZW5kKCkgY29uc3QgeyByZXR1cm4gYXJnc18gKyBhcmdzX1NpemU7IH0KKyAgdW5zaWduZWQgYXJnc19zaXplKCkgY29uc3QgeyByZXR1cm4gYXJnc19TaXplOyB9CisgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGFyZ3NfaXRlcmF0b3I+IGFyZ3MoKSBjb25zdCB7IHJldHVybiBsbHZtOjptYWtlX3JhbmdlKGFyZ3NfYmVnaW4oKSwgYXJnc19lbmQoKSk7IH0KKworCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpBY3F1aXJlZEFmdGVyOyB9Cit9OworCitjbGFzcyBBY3F1aXJlZEJlZm9yZUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKKyAgdW5zaWduZWQgYXJnc19TaXplOworICBFeHByICogKmFyZ3NfOworCitwdWJsaWM6CisgIHN0YXRpYyBBY3F1aXJlZEJlZm9yZUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgRXhwciAqICpBcmdzLCB1bnNpZ25lZCBBcmdzU2l6ZSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQWNxdWlyZWRCZWZvcmVBdHRyKExvYywgQ3R4LCBBcmdzLCBBcmdzU2l6ZSwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBBY3F1aXJlZEJlZm9yZUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgRXhwciAqICpBcmdzLCB1bnNpZ25lZCBBcmdzU2l6ZQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkFjcXVpcmVkQmVmb3JlLCBSLCBTSSwgdHJ1ZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgLCBhcmdzX1NpemUoQXJnc1NpemUpLCBhcmdzXyhuZXcgKEN0eCwgMTYpIEV4cHIgKlthcmdzX1NpemVdKQorICB7CisgICAgc3RkOjpjb3B5KEFyZ3MsIEFyZ3MgKyBhcmdzX1NpemUsIGFyZ3NfKTsKKyAgfQorCisgIEFjcXVpcmVkQmVmb3JlQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpBY3F1aXJlZEJlZm9yZSwgUiwgU0ksIHRydWUsIHRydWUpCisgICAgICAgICAgICAgICwgYXJnc19TaXplKDApLCBhcmdzXyhudWxscHRyKQorICB7CisgIH0KKworICBBY3F1aXJlZEJlZm9yZUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgdHlwZWRlZiBFeHByICoqIGFyZ3NfaXRlcmF0b3I7CisgIGFyZ3NfaXRlcmF0b3IgYXJnc19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGFyZ3NfOyB9CisgIGFyZ3NfaXRlcmF0b3IgYXJnc19lbmQoKSBjb25zdCB7IHJldHVybiBhcmdzXyArIGFyZ3NfU2l6ZTsgfQorICB1bnNpZ25lZCBhcmdzX3NpemUoKSBjb25zdCB7IHJldHVybiBhcmdzX1NpemU7IH0KKyAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8YXJnc19pdGVyYXRvcj4gYXJncygpIGNvbnN0IHsgcmV0dXJuIGxsdm06Om1ha2VfcmFuZ2UoYXJnc19iZWdpbigpLCBhcmdzX2VuZCgpKTsgfQorCisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkFjcXVpcmVkQmVmb3JlOyB9Cit9OworCitjbGFzcyBBbGlhc0F0dHIgOiBwdWJsaWMgQXR0ciB7Cit1bnNpZ25lZCBhbGlhc2VlTGVuZ3RoOworY2hhciAqYWxpYXNlZTsKKworcHVibGljOgorICBzdGF0aWMgQWxpYXNBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIGxsdm06OlN0cmluZ1JlZiBBbGlhc2VlLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBBbGlhc0F0dHIoTG9jLCBDdHgsIEFsaWFzZWUsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQWxpYXNBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIGxsdm06OlN0cmluZ1JlZiBBbGlhc2VlCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBBdHRyKGF0dHI6OkFsaWFzLCBSLCBTSSwgZmFsc2UpCisgICAgICAgICAgICAgICwgYWxpYXNlZUxlbmd0aChBbGlhc2VlLnNpemUoKSksYWxpYXNlZShuZXcgKEN0eCwgMSkgY2hhclthbGlhc2VlTGVuZ3RoXSkKKyAgeworICAgICAgaWYgKCFBbGlhc2VlLmVtcHR5KCkpCisgICAgICAgIHN0ZDo6bWVtY3B5KGFsaWFzZWUsIEFsaWFzZWUuZGF0YSgpLCBhbGlhc2VlTGVuZ3RoKTsKKyAgfQorCisgIEFsaWFzQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBsbHZtOjpTdHJpbmdSZWYgZ2V0QWxpYXNlZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6U3RyaW5nUmVmKGFsaWFzZWUsIGFsaWFzZWVMZW5ndGgpOworICB9CisgIHVuc2lnbmVkIGdldEFsaWFzZWVMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIGFsaWFzZWVMZW5ndGg7CisgIH0KKyAgdm9pZCBzZXRBbGlhc2VlKEFTVENvbnRleHQgJkMsIGxsdm06OlN0cmluZ1JlZiBTKSB7CisgICAgYWxpYXNlZUxlbmd0aCA9IFMuc2l6ZSgpOworICAgIHRoaXMtPmFsaWFzZWUgPSBuZXcgKEMsIDEpIGNoYXIgW2FsaWFzZWVMZW5ndGhdOworICAgIGlmICghUy5lbXB0eSgpKQorICAgICAgc3RkOjptZW1jcHkodGhpcy0+YWxpYXNlZSwgUy5kYXRhKCksIGFsaWFzZWVMZW5ndGgpOworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkFsaWFzOyB9Cit9OworCitjbGFzcyBBbGlnbk1hYzY4a0F0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIEFsaWduTWFjNjhrQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBBbGlnbk1hYzY4a0F0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQWxpZ25NYWM2OGtBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkFsaWduTWFjNjhrLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBBbGlnbk1hYzY4a0F0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkFsaWduTWFjNjhrOyB9Cit9OworCitjbGFzcyBBbGlnblZhbHVlQXR0ciA6IHB1YmxpYyBBdHRyIHsKK0V4cHIgKiBhbGlnbm1lbnQ7CisKK3B1YmxpYzoKKyAgc3RhdGljIEFsaWduVmFsdWVBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIEV4cHIgKiBBbGlnbm1lbnQsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIEFsaWduVmFsdWVBdHRyKExvYywgQ3R4LCBBbGlnbm1lbnQsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQWxpZ25WYWx1ZUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgRXhwciAqIEFsaWdubWVudAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogQXR0cihhdHRyOjpBbGlnblZhbHVlLCBSLCBTSSwgZmFsc2UpCisgICAgICAgICAgICAgICwgYWxpZ25tZW50KEFsaWdubWVudCkKKyAgeworICB9CisKKyAgQWxpZ25WYWx1ZUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgRXhwciAqIGdldEFsaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gYWxpZ25tZW50OworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkFsaWduVmFsdWU7IH0KK307CisKK2NsYXNzIEFsaWduZWRBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7Citib29sIGlzYWxpZ25tZW50RXhwcjsKK3VuaW9uIHsKK0V4cHIgKmFsaWdubWVudEV4cHI7CitUeXBlU291cmNlSW5mbyAqYWxpZ25tZW50VHlwZTsKK307CisKK3B1YmxpYzoKKyAgZW51bSBTcGVsbGluZyB7CisgICAgR05VX2FsaWduZWQgPSAwLAorICAgIENYWDExX2dudV9hbGlnbmVkID0gMSwKKyAgICBEZWNsc3BlY19hbGlnbiA9IDIsCisgICAgS2V5d29yZF9hbGlnbmFzID0gMywKKyAgICBLZXl3b3JkX0FsaWduYXMgPSA0CisgIH07CisKKyAgc3RhdGljIEFsaWduZWRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNwZWxsaW5nIFMsIGJvb2wgSXNBbGlnbm1lbnRFeHByLCB2b2lkICpBbGlnbm1lbnQsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIEFsaWduZWRBdHRyKExvYywgQ3R4LCBJc0FsaWdubWVudEV4cHIsIEFsaWdubWVudCwgUyk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBBbGlnbmVkQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBib29sIElzQWxpZ25tZW50RXhwciwgdm9pZCAqQWxpZ25tZW50CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6QWxpZ25lZCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBpc2FsaWdubWVudEV4cHIoSXNBbGlnbm1lbnRFeHByKQorICB7CisgICAgaWYgKGlzYWxpZ25tZW50RXhwcikKKyAgICAgICBhbGlnbm1lbnRFeHByID0gcmVpbnRlcnByZXRfY2FzdDxFeHByICo+KEFsaWdubWVudCk7CisgICAgZWxzZQorICAgICAgIGFsaWdubWVudFR5cGUgPSByZWludGVycHJldF9jYXN0PFR5cGVTb3VyY2VJbmZvICo+KEFsaWdubWVudCk7CisgIH0KKworICBBbGlnbmVkQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpBbGlnbmVkLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIGlzYWxpZ25tZW50RXhwcihmYWxzZSkKKyAgeworICB9CisKKyAgQWxpZ25lZEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgU3BlbGxpbmcgZ2V0U2VtYW50aWNTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc3BlbGxpbmcgbGlzdCBpbmRleCIpOworICAgIGNhc2UgMDogcmV0dXJuIEdOVV9hbGlnbmVkOworICAgIGNhc2UgMTogcmV0dXJuIENYWDExX2dudV9hbGlnbmVkOworICAgIGNhc2UgMjogcmV0dXJuIERlY2xzcGVjX2FsaWduOworICAgIGNhc2UgMzogcmV0dXJuIEtleXdvcmRfYWxpZ25hczsKKyAgICBjYXNlIDQ6IHJldHVybiBLZXl3b3JkX0FsaWduYXM7CisgIH0KKyAgfQorICBib29sIGlzR05VKCkgY29uc3QgeyByZXR1cm4gU3BlbGxpbmdMaXN0SW5kZXggPT0gMCB8fAorICAgIFNwZWxsaW5nTGlzdEluZGV4ID09IDE7IH0KKyAgYm9vbCBpc0MxMSgpIGNvbnN0IHsgcmV0dXJuIFNwZWxsaW5nTGlzdEluZGV4ID09IDQ7IH0KKyAgYm9vbCBpc0FsaWduYXMoKSBjb25zdCB7IHJldHVybiBTcGVsbGluZ0xpc3RJbmRleCA9PSAzIHx8CisgICAgU3BlbGxpbmdMaXN0SW5kZXggPT0gNDsgfQorICBib29sIGlzRGVjbHNwZWMoKSBjb25zdCB7IHJldHVybiBTcGVsbGluZ0xpc3RJbmRleCA9PSAyOyB9CisgIGJvb2wgaXNBbGlnbm1lbnREZXBlbmRlbnQoKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KEFTVENvbnRleHQgJkN0eCkgY29uc3Q7CisgIGJvb2wgaXNBbGlnbm1lbnRFeHByKCkgY29uc3QgeworICAgIHJldHVybiBpc2FsaWdubWVudEV4cHI7CisgIH0KKyAgRXhwciAqZ2V0QWxpZ25tZW50RXhwcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNhbGlnbm1lbnRFeHByKTsKKyAgICByZXR1cm4gYWxpZ25tZW50RXhwcjsKKyAgfQorICBUeXBlU291cmNlSW5mbyAqZ2V0QWxpZ25tZW50VHlwZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzYWxpZ25tZW50RXhwcik7CisgICAgcmV0dXJuIGFsaWdubWVudFR5cGU7CisgIH0KKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6QWxpZ25lZDsgfQorfTsKKworY2xhc3MgQWxsb2NBbGlnbkF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK1BhcmFtSWR4IHBhcmFtSW5kZXg7CisKK3B1YmxpYzoKKyAgc3RhdGljIEFsbG9jQWxpZ25BdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFBhcmFtSWR4IFBhcmFtSW5kZXgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIEFsbG9jQWxpZ25BdHRyKExvYywgQ3R4LCBQYXJhbUluZGV4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIEFsbG9jQWxpZ25BdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIFBhcmFtSWR4IFBhcmFtSW5kZXgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpBbGxvY0FsaWduLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIHBhcmFtSW5kZXgoUGFyYW1JbmRleCkKKyAgeworICB9CisKKyAgQWxsb2NBbGlnbkF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgUGFyYW1JZHggZ2V0UGFyYW1JbmRleCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcGFyYW1JbmRleDsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpBbGxvY0FsaWduOyB9Cit9OworCitjbGFzcyBBbGxvY1NpemVBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitQYXJhbUlkeCBlbGVtU2l6ZVBhcmFtOworCitQYXJhbUlkeCBudW1FbGVtc1BhcmFtOworCitwdWJsaWM6CisgIHN0YXRpYyBBbGxvY1NpemVBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFBhcmFtSWR4IEVsZW1TaXplUGFyYW0sIFBhcmFtSWR4IE51bUVsZW1zUGFyYW0sIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIEFsbG9jU2l6ZUF0dHIoTG9jLCBDdHgsIEVsZW1TaXplUGFyYW0sIE51bUVsZW1zUGFyYW0sIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQWxsb2NTaXplQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBQYXJhbUlkeCBFbGVtU2l6ZVBhcmFtCisgICAgICAgICAgICAgICwgUGFyYW1JZHggTnVtRWxlbXNQYXJhbQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkFsbG9jU2l6ZSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBlbGVtU2l6ZVBhcmFtKEVsZW1TaXplUGFyYW0pCisgICAgICAgICAgICAgICwgbnVtRWxlbXNQYXJhbShOdW1FbGVtc1BhcmFtKQorICB7CisgIH0KKworICBBbGxvY1NpemVBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIFBhcmFtSWR4IEVsZW1TaXplUGFyYW0KKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpBbGxvY1NpemUsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgZWxlbVNpemVQYXJhbShFbGVtU2l6ZVBhcmFtKQorICAgICAgICAgICAgICAsIG51bUVsZW1zUGFyYW0oKQorICB7CisgIH0KKworICBBbGxvY1NpemVBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIFBhcmFtSWR4IGdldEVsZW1TaXplUGFyYW0oKSBjb25zdCB7CisgICAgcmV0dXJuIGVsZW1TaXplUGFyYW07CisgIH0KKworICBQYXJhbUlkeCBnZXROdW1FbGVtc1BhcmFtKCkgY29uc3QgeworICAgIHJldHVybiBudW1FbGVtc1BhcmFtOworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkFsbG9jU2l6ZTsgfQorfTsKKworY2xhc3MgQWx3YXlzSW5saW5lQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBlbnVtIFNwZWxsaW5nIHsKKyAgICBHTlVfYWx3YXlzX2lubGluZSA9IDAsCisgICAgQ1hYMTFfZ251X2Fsd2F5c19pbmxpbmUgPSAxLAorICAgIEtleXdvcmRfZm9yY2VpbmxpbmUgPSAyCisgIH07CisKKyAgc3RhdGljIEFsd2F5c0lubGluZUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU3BlbGxpbmcgUywgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQWx3YXlzSW5saW5lQXR0cihMb2MsIEN0eCwgUyk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBBbHdheXNJbmxpbmVBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkFsd2F5c0lubGluZSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgQWx3YXlzSW5saW5lQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBTcGVsbGluZyBnZXRTZW1hbnRpY1NwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzcGVsbGluZyBsaXN0IGluZGV4Iik7CisgICAgY2FzZSAwOiByZXR1cm4gR05VX2Fsd2F5c19pbmxpbmU7CisgICAgY2FzZSAxOiByZXR1cm4gQ1hYMTFfZ251X2Fsd2F5c19pbmxpbmU7CisgICAgY2FzZSAyOiByZXR1cm4gS2V5d29yZF9mb3JjZWlubGluZTsKKyAgfQorICB9CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpBbHdheXNJbmxpbmU7IH0KK307CisKK2NsYXNzIEFuYWx5emVyTm9SZXR1cm5BdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBBbmFseXplck5vUmV0dXJuQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBBbmFseXplck5vUmV0dXJuQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBBbmFseXplck5vUmV0dXJuQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpBbmFseXplck5vUmV0dXJuLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBBbmFseXplck5vUmV0dXJuQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6QW5hbHl6ZXJOb1JldHVybjsgfQorfTsKKworY2xhc3MgQW5ub3RhdGVBdHRyIDogcHVibGljIEluaGVyaXRhYmxlUGFyYW1BdHRyIHsKK3Vuc2lnbmVkIGFubm90YXRpb25MZW5ndGg7CitjaGFyICphbm5vdGF0aW9uOworCitwdWJsaWM6CisgIHN0YXRpYyBBbm5vdGF0ZUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgbGx2bTo6U3RyaW5nUmVmIEFubm90YXRpb24sIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIEFubm90YXRlQXR0cihMb2MsIEN0eCwgQW5ub3RhdGlvbiwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBBbm5vdGF0ZUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgbGx2bTo6U3RyaW5nUmVmIEFubm90YXRpb24KKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlUGFyYW1BdHRyKGF0dHI6OkFubm90YXRlLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIGFubm90YXRpb25MZW5ndGgoQW5ub3RhdGlvbi5zaXplKCkpLGFubm90YXRpb24obmV3IChDdHgsIDEpIGNoYXJbYW5ub3RhdGlvbkxlbmd0aF0pCisgIHsKKyAgICAgIGlmICghQW5ub3RhdGlvbi5lbXB0eSgpKQorICAgICAgICBzdGQ6Om1lbWNweShhbm5vdGF0aW9uLCBBbm5vdGF0aW9uLmRhdGEoKSwgYW5ub3RhdGlvbkxlbmd0aCk7CisgIH0KKworICBBbm5vdGF0ZUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgbGx2bTo6U3RyaW5nUmVmIGdldEFubm90YXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06OlN0cmluZ1JlZihhbm5vdGF0aW9uLCBhbm5vdGF0aW9uTGVuZ3RoKTsKKyAgfQorICB1bnNpZ25lZCBnZXRBbm5vdGF0aW9uTGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiBhbm5vdGF0aW9uTGVuZ3RoOworICB9CisgIHZvaWQgc2V0QW5ub3RhdGlvbihBU1RDb250ZXh0ICZDLCBsbHZtOjpTdHJpbmdSZWYgUykgeworICAgIGFubm90YXRpb25MZW5ndGggPSBTLnNpemUoKTsKKyAgICB0aGlzLT5hbm5vdGF0aW9uID0gbmV3IChDLCAxKSBjaGFyIFthbm5vdGF0aW9uTGVuZ3RoXTsKKyAgICBpZiAoIVMuZW1wdHkoKSkKKyAgICAgIHN0ZDo6bWVtY3B5KHRoaXMtPmFubm90YXRpb24sIFMuZGF0YSgpLCBhbm5vdGF0aW9uTGVuZ3RoKTsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpBbm5vdGF0ZTsgfQorfTsKKworY2xhc3MgQW55WDg2SW50ZXJydXB0QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgQW55WDg2SW50ZXJydXB0QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBBbnlYODZJbnRlcnJ1cHRBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIEFueVg4NkludGVycnVwdEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6QW55WDg2SW50ZXJydXB0LCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBBbnlYODZJbnRlcnJ1cHRBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpBbnlYODZJbnRlcnJ1cHQ7IH0KK307CisKK2NsYXNzIEFueVg4Nk5vQ2FsbGVyU2F2ZWRSZWdpc3RlcnNBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBBbnlYODZOb0NhbGxlclNhdmVkUmVnaXN0ZXJzQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBBbnlYODZOb0NhbGxlclNhdmVkUmVnaXN0ZXJzQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBBbnlYODZOb0NhbGxlclNhdmVkUmVnaXN0ZXJzQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpBbnlYODZOb0NhbGxlclNhdmVkUmVnaXN0ZXJzLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBBbnlYODZOb0NhbGxlclNhdmVkUmVnaXN0ZXJzQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6QW55WDg2Tm9DYWxsZXJTYXZlZFJlZ2lzdGVyczsgfQorfTsKKworY2xhc3MgQW55WDg2Tm9DZkNoZWNrQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgQW55WDg2Tm9DZkNoZWNrQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBBbnlYODZOb0NmQ2hlY2tBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIEFueVg4Nk5vQ2ZDaGVja0F0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6QW55WDg2Tm9DZkNoZWNrLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBBbnlYODZOb0NmQ2hlY2tBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpBbnlYODZOb0NmQ2hlY2s7IH0KK307CisKK2NsYXNzIEFyY1dlYWtyZWZVbmF2YWlsYWJsZUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIEFyY1dlYWtyZWZVbmF2YWlsYWJsZUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQXJjV2Vha3JlZlVuYXZhaWxhYmxlQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBBcmNXZWFrcmVmVW5hdmFpbGFibGVBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkFyY1dlYWtyZWZVbmF2YWlsYWJsZSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgQXJjV2Vha3JlZlVuYXZhaWxhYmxlQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6QXJjV2Vha3JlZlVuYXZhaWxhYmxlOyB9Cit9OworCitjbGFzcyBBcmd1bWVudFdpdGhUeXBlVGFnQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworSWRlbnRpZmllckluZm8gKiBhcmd1bWVudEtpbmQ7CisKK1BhcmFtSWR4IGFyZ3VtZW50SWR4OworCitQYXJhbUlkeCB0eXBlVGFnSWR4OworCitib29sIGlzUG9pbnRlcjsKKworcHVibGljOgorICBlbnVtIFNwZWxsaW5nIHsKKyAgICBHTlVfYXJndW1lbnRfd2l0aF90eXBlX3RhZyA9IDAsCisgICAgQ1hYMTFfY2xhbmdfYXJndW1lbnRfd2l0aF90eXBlX3RhZyA9IDEsCisgICAgQzJ4X2NsYW5nX2FyZ3VtZW50X3dpdGhfdHlwZV90YWcgPSAyLAorICAgIEdOVV9wb2ludGVyX3dpdGhfdHlwZV90YWcgPSAzLAorICAgIENYWDExX2NsYW5nX3BvaW50ZXJfd2l0aF90eXBlX3RhZyA9IDQsCisgICAgQzJ4X2NsYW5nX3BvaW50ZXJfd2l0aF90eXBlX3RhZyA9IDUKKyAgfTsKKworICBzdGF0aWMgQXJndW1lbnRXaXRoVHlwZVRhZ0F0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU3BlbGxpbmcgUywgSWRlbnRpZmllckluZm8gKiBBcmd1bWVudEtpbmQsIFBhcmFtSWR4IEFyZ3VtZW50SWR4LCBQYXJhbUlkeCBUeXBlVGFnSWR4LCBib29sIElzUG9pbnRlciwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQXJndW1lbnRXaXRoVHlwZVRhZ0F0dHIoTG9jLCBDdHgsIEFyZ3VtZW50S2luZCwgQXJndW1lbnRJZHgsIFR5cGVUYWdJZHgsIElzUG9pbnRlciwgUyk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBzdGF0aWMgQXJndW1lbnRXaXRoVHlwZVRhZ0F0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU3BlbGxpbmcgUywgSWRlbnRpZmllckluZm8gKiBBcmd1bWVudEtpbmQsIFBhcmFtSWR4IEFyZ3VtZW50SWR4LCBQYXJhbUlkeCBUeXBlVGFnSWR4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBBcmd1bWVudFdpdGhUeXBlVGFnQXR0cihMb2MsIEN0eCwgQXJndW1lbnRLaW5kLCBBcmd1bWVudElkeCwgVHlwZVRhZ0lkeCwgUyk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBBcmd1bWVudFdpdGhUeXBlVGFnQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBJZGVudGlmaWVySW5mbyAqIEFyZ3VtZW50S2luZAorICAgICAgICAgICAgICAsIFBhcmFtSWR4IEFyZ3VtZW50SWR4CisgICAgICAgICAgICAgICwgUGFyYW1JZHggVHlwZVRhZ0lkeAorICAgICAgICAgICAgICAsIGJvb2wgSXNQb2ludGVyCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6QXJndW1lbnRXaXRoVHlwZVRhZywgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBhcmd1bWVudEtpbmQoQXJndW1lbnRLaW5kKQorICAgICAgICAgICAgICAsIGFyZ3VtZW50SWR4KEFyZ3VtZW50SWR4KQorICAgICAgICAgICAgICAsIHR5cGVUYWdJZHgoVHlwZVRhZ0lkeCkKKyAgICAgICAgICAgICAgLCBpc1BvaW50ZXIoSXNQb2ludGVyKQorICB7CisgIH0KKworICBBcmd1bWVudFdpdGhUeXBlVGFnQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBJZGVudGlmaWVySW5mbyAqIEFyZ3VtZW50S2luZAorICAgICAgICAgICAgICAsIFBhcmFtSWR4IEFyZ3VtZW50SWR4CisgICAgICAgICAgICAgICwgUGFyYW1JZHggVHlwZVRhZ0lkeAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkFyZ3VtZW50V2l0aFR5cGVUYWcsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgYXJndW1lbnRLaW5kKEFyZ3VtZW50S2luZCkKKyAgICAgICAgICAgICAgLCBhcmd1bWVudElkeChBcmd1bWVudElkeCkKKyAgICAgICAgICAgICAgLCB0eXBlVGFnSWR4KFR5cGVUYWdJZHgpCisgICAgICAgICAgICAgICwgaXNQb2ludGVyKCkKKyAgeworICB9CisKKyAgQXJndW1lbnRXaXRoVHlwZVRhZ0F0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgU3BlbGxpbmcgZ2V0U2VtYW50aWNTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc3BlbGxpbmcgbGlzdCBpbmRleCIpOworICAgIGNhc2UgMDogcmV0dXJuIEdOVV9hcmd1bWVudF93aXRoX3R5cGVfdGFnOworICAgIGNhc2UgMTogcmV0dXJuIENYWDExX2NsYW5nX2FyZ3VtZW50X3dpdGhfdHlwZV90YWc7CisgICAgY2FzZSAyOiByZXR1cm4gQzJ4X2NsYW5nX2FyZ3VtZW50X3dpdGhfdHlwZV90YWc7CisgICAgY2FzZSAzOiByZXR1cm4gR05VX3BvaW50ZXJfd2l0aF90eXBlX3RhZzsKKyAgICBjYXNlIDQ6IHJldHVybiBDWFgxMV9jbGFuZ19wb2ludGVyX3dpdGhfdHlwZV90YWc7CisgICAgY2FzZSA1OiByZXR1cm4gQzJ4X2NsYW5nX3BvaW50ZXJfd2l0aF90eXBlX3RhZzsKKyAgfQorICB9CisgIElkZW50aWZpZXJJbmZvICogZ2V0QXJndW1lbnRLaW5kKCkgY29uc3QgeworICAgIHJldHVybiBhcmd1bWVudEtpbmQ7CisgIH0KKworICBQYXJhbUlkeCBnZXRBcmd1bWVudElkeCgpIGNvbnN0IHsKKyAgICByZXR1cm4gYXJndW1lbnRJZHg7CisgIH0KKworICBQYXJhbUlkeCBnZXRUeXBlVGFnSWR4KCkgY29uc3QgeworICAgIHJldHVybiB0eXBlVGFnSWR4OworICB9CisKKyAgYm9vbCBnZXRJc1BvaW50ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzUG9pbnRlcjsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpBcmd1bWVudFdpdGhUeXBlVGFnOyB9Cit9OworCitjbGFzcyBBcnRpZmljaWFsQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgQXJ0aWZpY2lhbEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQXJ0aWZpY2lhbEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQXJ0aWZpY2lhbEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6QXJ0aWZpY2lhbCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgQXJ0aWZpY2lhbEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkFydGlmaWNpYWw7IH0KK307CisKK2NsYXNzIEFzbUxhYmVsQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgewordW5zaWduZWQgbGFiZWxMZW5ndGg7CitjaGFyICpsYWJlbDsKKworcHVibGljOgorICBzdGF0aWMgQXNtTGFiZWxBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIGxsdm06OlN0cmluZ1JlZiBMYWJlbCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQXNtTGFiZWxBdHRyKExvYywgQ3R4LCBMYWJlbCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBBc21MYWJlbEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgbGx2bTo6U3RyaW5nUmVmIExhYmVsCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6QXNtTGFiZWwsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgbGFiZWxMZW5ndGgoTGFiZWwuc2l6ZSgpKSxsYWJlbChuZXcgKEN0eCwgMSkgY2hhcltsYWJlbExlbmd0aF0pCisgIHsKKyAgICAgIGlmICghTGFiZWwuZW1wdHkoKSkKKyAgICAgICAgc3RkOjptZW1jcHkobGFiZWwsIExhYmVsLmRhdGEoKSwgbGFiZWxMZW5ndGgpOworICB9CisKKyAgQXNtTGFiZWxBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIGxsdm06OlN0cmluZ1JlZiBnZXRMYWJlbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6U3RyaW5nUmVmKGxhYmVsLCBsYWJlbExlbmd0aCk7CisgIH0KKyAgdW5zaWduZWQgZ2V0TGFiZWxMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIGxhYmVsTGVuZ3RoOworICB9CisgIHZvaWQgc2V0TGFiZWwoQVNUQ29udGV4dCAmQywgbGx2bTo6U3RyaW5nUmVmIFMpIHsKKyAgICBsYWJlbExlbmd0aCA9IFMuc2l6ZSgpOworICAgIHRoaXMtPmxhYmVsID0gbmV3IChDLCAxKSBjaGFyIFtsYWJlbExlbmd0aF07CisgICAgaWYgKCFTLmVtcHR5KCkpCisgICAgICBzdGQ6Om1lbWNweSh0aGlzLT5sYWJlbCwgUy5kYXRhKCksIGxhYmVsTGVuZ3RoKTsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpBc21MYWJlbDsgfQorfTsKKworY2xhc3MgQXNzZXJ0Q2FwYWJpbGl0eUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKKyAgdW5zaWduZWQgYXJnc19TaXplOworICBFeHByICogKmFyZ3NfOworCitwdWJsaWM6CisgIGVudW0gU3BlbGxpbmcgeworICAgIEdOVV9hc3NlcnRfY2FwYWJpbGl0eSA9IDAsCisgICAgQ1hYMTFfY2xhbmdfYXNzZXJ0X2NhcGFiaWxpdHkgPSAxLAorICAgIEdOVV9hc3NlcnRfc2hhcmVkX2NhcGFiaWxpdHkgPSAyLAorICAgIENYWDExX2NsYW5nX2Fzc2VydF9zaGFyZWRfY2FwYWJpbGl0eSA9IDMKKyAgfTsKKworICBzdGF0aWMgQXNzZXJ0Q2FwYWJpbGl0eUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU3BlbGxpbmcgUywgRXhwciAqICpBcmdzLCB1bnNpZ25lZCBBcmdzU2l6ZSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQXNzZXJ0Q2FwYWJpbGl0eUF0dHIoTG9jLCBDdHgsIEFyZ3MsIEFyZ3NTaXplLCBTKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIEFzc2VydENhcGFiaWxpdHlBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIEV4cHIgKiAqQXJncywgdW5zaWduZWQgQXJnc1NpemUKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpBc3NlcnRDYXBhYmlsaXR5LCBSLCBTSSwgdHJ1ZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgLCBhcmdzX1NpemUoQXJnc1NpemUpLCBhcmdzXyhuZXcgKEN0eCwgMTYpIEV4cHIgKlthcmdzX1NpemVdKQorICB7CisgICAgc3RkOjpjb3B5KEFyZ3MsIEFyZ3MgKyBhcmdzX1NpemUsIGFyZ3NfKTsKKyAgfQorCisgIEFzc2VydENhcGFiaWxpdHlBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkFzc2VydENhcGFiaWxpdHksIFIsIFNJLCB0cnVlLCB0cnVlKQorICAgICAgICAgICAgICAsIGFyZ3NfU2l6ZSgwKSwgYXJnc18obnVsbHB0cikKKyAgeworICB9CisKKyAgQXNzZXJ0Q2FwYWJpbGl0eUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgU3BlbGxpbmcgZ2V0U2VtYW50aWNTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc3BlbGxpbmcgbGlzdCBpbmRleCIpOworICAgIGNhc2UgMDogcmV0dXJuIEdOVV9hc3NlcnRfY2FwYWJpbGl0eTsKKyAgICBjYXNlIDE6IHJldHVybiBDWFgxMV9jbGFuZ19hc3NlcnRfY2FwYWJpbGl0eTsKKyAgICBjYXNlIDI6IHJldHVybiBHTlVfYXNzZXJ0X3NoYXJlZF9jYXBhYmlsaXR5OworICAgIGNhc2UgMzogcmV0dXJuIENYWDExX2NsYW5nX2Fzc2VydF9zaGFyZWRfY2FwYWJpbGl0eTsKKyAgfQorICB9CisgIGJvb2wgaXNTaGFyZWQoKSBjb25zdCB7IHJldHVybiBTcGVsbGluZ0xpc3RJbmRleCA9PSAyIHx8CisgICAgU3BlbGxpbmdMaXN0SW5kZXggPT0gMzsgfQorICB0eXBlZGVmIEV4cHIgKiogYXJnc19pdGVyYXRvcjsKKyAgYXJnc19pdGVyYXRvciBhcmdzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gYXJnc187IH0KKyAgYXJnc19pdGVyYXRvciBhcmdzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGFyZ3NfICsgYXJnc19TaXplOyB9CisgIHVuc2lnbmVkIGFyZ3Nfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGFyZ3NfU2l6ZTsgfQorICBsbHZtOjppdGVyYXRvcl9yYW5nZTxhcmdzX2l0ZXJhdG9yPiBhcmdzKCkgY29uc3QgeyByZXR1cm4gbGx2bTo6bWFrZV9yYW5nZShhcmdzX2JlZ2luKCksIGFyZ3NfZW5kKCkpOyB9CisKKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6QXNzZXJ0Q2FwYWJpbGl0eTsgfQorfTsKKworY2xhc3MgQXNzZXJ0RXhjbHVzaXZlTG9ja0F0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKKyAgdW5zaWduZWQgYXJnc19TaXplOworICBFeHByICogKmFyZ3NfOworCitwdWJsaWM6CisgIHN0YXRpYyBBc3NlcnRFeGNsdXNpdmVMb2NrQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBFeHByICogKkFyZ3MsIHVuc2lnbmVkIEFyZ3NTaXplLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBBc3NlcnRFeGNsdXNpdmVMb2NrQXR0cihMb2MsIEN0eCwgQXJncywgQXJnc1NpemUsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQXNzZXJ0RXhjbHVzaXZlTG9ja0F0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgRXhwciAqICpBcmdzLCB1bnNpZ25lZCBBcmdzU2l6ZQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkFzc2VydEV4Y2x1c2l2ZUxvY2ssIFIsIFNJLCB0cnVlLCB0cnVlKQorICAgICAgICAgICAgICAsIGFyZ3NfU2l6ZShBcmdzU2l6ZSksIGFyZ3NfKG5ldyAoQ3R4LCAxNikgRXhwciAqW2FyZ3NfU2l6ZV0pCisgIHsKKyAgICBzdGQ6OmNvcHkoQXJncywgQXJncyArIGFyZ3NfU2l6ZSwgYXJnc18pOworICB9CisKKyAgQXNzZXJ0RXhjbHVzaXZlTG9ja0F0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6QXNzZXJ0RXhjbHVzaXZlTG9jaywgUiwgU0ksIHRydWUsIHRydWUpCisgICAgICAgICAgICAgICwgYXJnc19TaXplKDApLCBhcmdzXyhudWxscHRyKQorICB7CisgIH0KKworICBBc3NlcnRFeGNsdXNpdmVMb2NrQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICB0eXBlZGVmIEV4cHIgKiogYXJnc19pdGVyYXRvcjsKKyAgYXJnc19pdGVyYXRvciBhcmdzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gYXJnc187IH0KKyAgYXJnc19pdGVyYXRvciBhcmdzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGFyZ3NfICsgYXJnc19TaXplOyB9CisgIHVuc2lnbmVkIGFyZ3Nfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGFyZ3NfU2l6ZTsgfQorICBsbHZtOjppdGVyYXRvcl9yYW5nZTxhcmdzX2l0ZXJhdG9yPiBhcmdzKCkgY29uc3QgeyByZXR1cm4gbGx2bTo6bWFrZV9yYW5nZShhcmdzX2JlZ2luKCksIGFyZ3NfZW5kKCkpOyB9CisKKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6QXNzZXJ0RXhjbHVzaXZlTG9jazsgfQorfTsKKworY2xhc3MgQXNzZXJ0U2hhcmVkTG9ja0F0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKKyAgdW5zaWduZWQgYXJnc19TaXplOworICBFeHByICogKmFyZ3NfOworCitwdWJsaWM6CisgIHN0YXRpYyBBc3NlcnRTaGFyZWRMb2NrQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBFeHByICogKkFyZ3MsIHVuc2lnbmVkIEFyZ3NTaXplLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBBc3NlcnRTaGFyZWRMb2NrQXR0cihMb2MsIEN0eCwgQXJncywgQXJnc1NpemUsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQXNzZXJ0U2hhcmVkTG9ja0F0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgRXhwciAqICpBcmdzLCB1bnNpZ25lZCBBcmdzU2l6ZQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkFzc2VydFNoYXJlZExvY2ssIFIsIFNJLCB0cnVlLCB0cnVlKQorICAgICAgICAgICAgICAsIGFyZ3NfU2l6ZShBcmdzU2l6ZSksIGFyZ3NfKG5ldyAoQ3R4LCAxNikgRXhwciAqW2FyZ3NfU2l6ZV0pCisgIHsKKyAgICBzdGQ6OmNvcHkoQXJncywgQXJncyArIGFyZ3NfU2l6ZSwgYXJnc18pOworICB9CisKKyAgQXNzZXJ0U2hhcmVkTG9ja0F0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6QXNzZXJ0U2hhcmVkTG9jaywgUiwgU0ksIHRydWUsIHRydWUpCisgICAgICAgICAgICAgICwgYXJnc19TaXplKDApLCBhcmdzXyhudWxscHRyKQorICB7CisgIH0KKworICBBc3NlcnRTaGFyZWRMb2NrQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICB0eXBlZGVmIEV4cHIgKiogYXJnc19pdGVyYXRvcjsKKyAgYXJnc19pdGVyYXRvciBhcmdzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gYXJnc187IH0KKyAgYXJnc19pdGVyYXRvciBhcmdzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGFyZ3NfICsgYXJnc19TaXplOyB9CisgIHVuc2lnbmVkIGFyZ3Nfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGFyZ3NfU2l6ZTsgfQorICBsbHZtOjppdGVyYXRvcl9yYW5nZTxhcmdzX2l0ZXJhdG9yPiBhcmdzKCkgY29uc3QgeyByZXR1cm4gbGx2bTo6bWFrZV9yYW5nZShhcmdzX2JlZ2luKCksIGFyZ3NfZW5kKCkpOyB9CisKKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6QXNzZXJ0U2hhcmVkTG9jazsgfQorfTsKKworY2xhc3MgQXNzdW1lQWxpZ25lZEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK0V4cHIgKiBhbGlnbm1lbnQ7CisKK0V4cHIgKiBvZmZzZXQ7CisKK3B1YmxpYzoKKyAgc3RhdGljIEFzc3VtZUFsaWduZWRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIEV4cHIgKiBBbGlnbm1lbnQsIEV4cHIgKiBPZmZzZXQsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIEFzc3VtZUFsaWduZWRBdHRyKExvYywgQ3R4LCBBbGlnbm1lbnQsIE9mZnNldCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBBc3N1bWVBbGlnbmVkQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBFeHByICogQWxpZ25tZW50CisgICAgICAgICAgICAgICwgRXhwciAqIE9mZnNldAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkFzc3VtZUFsaWduZWQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgYWxpZ25tZW50KEFsaWdubWVudCkKKyAgICAgICAgICAgICAgLCBvZmZzZXQoT2Zmc2V0KQorICB7CisgIH0KKworICBBc3N1bWVBbGlnbmVkQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBFeHByICogQWxpZ25tZW50CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6QXNzdW1lQWxpZ25lZCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBhbGlnbm1lbnQoQWxpZ25tZW50KQorICAgICAgICAgICAgICAsIG9mZnNldCgpCisgIHsKKyAgfQorCisgIEFzc3VtZUFsaWduZWRBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIEV4cHIgKiBnZXRBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGFsaWdubWVudDsKKyAgfQorCisgIEV4cHIgKiBnZXRPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG9mZnNldDsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpBc3N1bWVBbGlnbmVkOyB9Cit9OworCitjbGFzcyBBdmFpbGFiaWxpdHlBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitJZGVudGlmaWVySW5mbyAqIHBsYXRmb3JtOworCitWZXJzaW9uVHVwbGUgaW50cm9kdWNlZDsKKworCitWZXJzaW9uVHVwbGUgZGVwcmVjYXRlZDsKKworCitWZXJzaW9uVHVwbGUgb2Jzb2xldGVkOworCisKK2Jvb2wgdW5hdmFpbGFibGU7CisKK3Vuc2lnbmVkIG1lc3NhZ2VMZW5ndGg7CitjaGFyICptZXNzYWdlOworCitib29sIHN0cmljdDsKKwordW5zaWduZWQgcmVwbGFjZW1lbnRMZW5ndGg7CitjaGFyICpyZXBsYWNlbWVudDsKKworcHVibGljOgorICBzdGF0aWMgQXZhaWxhYmlsaXR5QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBJZGVudGlmaWVySW5mbyAqIFBsYXRmb3JtLCBWZXJzaW9uVHVwbGUgSW50cm9kdWNlZCwgVmVyc2lvblR1cGxlIERlcHJlY2F0ZWQsIFZlcnNpb25UdXBsZSBPYnNvbGV0ZWQsIGJvb2wgVW5hdmFpbGFibGUsIGxsdm06OlN0cmluZ1JlZiBNZXNzYWdlLCBib29sIFN0cmljdCwgbGx2bTo6U3RyaW5nUmVmIFJlcGxhY2VtZW50LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBBdmFpbGFiaWxpdHlBdHRyKExvYywgQ3R4LCBQbGF0Zm9ybSwgSW50cm9kdWNlZCwgRGVwcmVjYXRlZCwgT2Jzb2xldGVkLCBVbmF2YWlsYWJsZSwgTWVzc2FnZSwgU3RyaWN0LCBSZXBsYWNlbWVudCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBBdmFpbGFiaWxpdHlBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIElkZW50aWZpZXJJbmZvICogUGxhdGZvcm0KKyAgICAgICAgICAgICAgLCBWZXJzaW9uVHVwbGUgSW50cm9kdWNlZAorICAgICAgICAgICAgICAsIFZlcnNpb25UdXBsZSBEZXByZWNhdGVkCisgICAgICAgICAgICAgICwgVmVyc2lvblR1cGxlIE9ic29sZXRlZAorICAgICAgICAgICAgICAsIGJvb2wgVW5hdmFpbGFibGUKKyAgICAgICAgICAgICAgLCBsbHZtOjpTdHJpbmdSZWYgTWVzc2FnZQorICAgICAgICAgICAgICAsIGJvb2wgU3RyaWN0CisgICAgICAgICAgICAgICwgbGx2bTo6U3RyaW5nUmVmIFJlcGxhY2VtZW50CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6QXZhaWxhYmlsaXR5LCBSLCBTSSwgZmFsc2UsIHRydWUpCisgICAgICAgICAgICAgICwgcGxhdGZvcm0oUGxhdGZvcm0pCisgICAgICAgICAgICAgICwgaW50cm9kdWNlZChJbnRyb2R1Y2VkKQorICAgICAgICAgICAgICAsIGRlcHJlY2F0ZWQoRGVwcmVjYXRlZCkKKyAgICAgICAgICAgICAgLCBvYnNvbGV0ZWQoT2Jzb2xldGVkKQorICAgICAgICAgICAgICAsIHVuYXZhaWxhYmxlKFVuYXZhaWxhYmxlKQorICAgICAgICAgICAgICAsIG1lc3NhZ2VMZW5ndGgoTWVzc2FnZS5zaXplKCkpLG1lc3NhZ2UobmV3IChDdHgsIDEpIGNoYXJbbWVzc2FnZUxlbmd0aF0pCisgICAgICAgICAgICAgICwgc3RyaWN0KFN0cmljdCkKKyAgICAgICAgICAgICAgLCByZXBsYWNlbWVudExlbmd0aChSZXBsYWNlbWVudC5zaXplKCkpLHJlcGxhY2VtZW50KG5ldyAoQ3R4LCAxKSBjaGFyW3JlcGxhY2VtZW50TGVuZ3RoXSkKKyAgeworICAgICAgaWYgKCFNZXNzYWdlLmVtcHR5KCkpCisgICAgICAgIHN0ZDo6bWVtY3B5KG1lc3NhZ2UsIE1lc3NhZ2UuZGF0YSgpLCBtZXNzYWdlTGVuZ3RoKTsKKyAgICAgIGlmICghUmVwbGFjZW1lbnQuZW1wdHkoKSkKKyAgICAgICAgc3RkOjptZW1jcHkocmVwbGFjZW1lbnQsIFJlcGxhY2VtZW50LmRhdGEoKSwgcmVwbGFjZW1lbnRMZW5ndGgpOworICB9CisKKyAgQXZhaWxhYmlsaXR5QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBJZGVudGlmaWVySW5mbyAqIGdldFBsYXRmb3JtKCkgY29uc3QgeworICAgIHJldHVybiBwbGF0Zm9ybTsKKyAgfQorCisgIFZlcnNpb25UdXBsZSBnZXRJbnRyb2R1Y2VkKCkgY29uc3QgeworICAgIHJldHVybiBpbnRyb2R1Y2VkOworICB9CisgIHZvaWQgc2V0SW50cm9kdWNlZChBU1RDb250ZXh0ICZDLCBWZXJzaW9uVHVwbGUgVikgeworICAgIGludHJvZHVjZWQgPSBWOworICB9CisKKyAgVmVyc2lvblR1cGxlIGdldERlcHJlY2F0ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGRlcHJlY2F0ZWQ7CisgIH0KKyAgdm9pZCBzZXREZXByZWNhdGVkKEFTVENvbnRleHQgJkMsIFZlcnNpb25UdXBsZSBWKSB7CisgICAgZGVwcmVjYXRlZCA9IFY7CisgIH0KKworICBWZXJzaW9uVHVwbGUgZ2V0T2Jzb2xldGVkKCkgY29uc3QgeworICAgIHJldHVybiBvYnNvbGV0ZWQ7CisgIH0KKyAgdm9pZCBzZXRPYnNvbGV0ZWQoQVNUQ29udGV4dCAmQywgVmVyc2lvblR1cGxlIFYpIHsKKyAgICBvYnNvbGV0ZWQgPSBWOworICB9CisKKyAgYm9vbCBnZXRVbmF2YWlsYWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdW5hdmFpbGFibGU7CisgIH0KKworICBsbHZtOjpTdHJpbmdSZWYgZ2V0TWVzc2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6U3RyaW5nUmVmKG1lc3NhZ2UsIG1lc3NhZ2VMZW5ndGgpOworICB9CisgIHVuc2lnbmVkIGdldE1lc3NhZ2VMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1lc3NhZ2VMZW5ndGg7CisgIH0KKyAgdm9pZCBzZXRNZXNzYWdlKEFTVENvbnRleHQgJkMsIGxsdm06OlN0cmluZ1JlZiBTKSB7CisgICAgbWVzc2FnZUxlbmd0aCA9IFMuc2l6ZSgpOworICAgIHRoaXMtPm1lc3NhZ2UgPSBuZXcgKEMsIDEpIGNoYXIgW21lc3NhZ2VMZW5ndGhdOworICAgIGlmICghUy5lbXB0eSgpKQorICAgICAgc3RkOjptZW1jcHkodGhpcy0+bWVzc2FnZSwgUy5kYXRhKCksIG1lc3NhZ2VMZW5ndGgpOworICB9CisKKyAgYm9vbCBnZXRTdHJpY3QoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmljdDsKKyAgfQorCisgIGxsdm06OlN0cmluZ1JlZiBnZXRSZXBsYWNlbWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6U3RyaW5nUmVmKHJlcGxhY2VtZW50LCByZXBsYWNlbWVudExlbmd0aCk7CisgIH0KKyAgdW5zaWduZWQgZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlcGxhY2VtZW50TGVuZ3RoOworICB9CisgIHZvaWQgc2V0UmVwbGFjZW1lbnQoQVNUQ29udGV4dCAmQywgbGx2bTo6U3RyaW5nUmVmIFMpIHsKKyAgICByZXBsYWNlbWVudExlbmd0aCA9IFMuc2l6ZSgpOworICAgIHRoaXMtPnJlcGxhY2VtZW50ID0gbmV3IChDLCAxKSBjaGFyIFtyZXBsYWNlbWVudExlbmd0aF07CisgICAgaWYgKCFTLmVtcHR5KCkpCisgICAgICBzdGQ6Om1lbWNweSh0aGlzLT5yZXBsYWNlbWVudCwgUy5kYXRhKCksIHJlcGxhY2VtZW50TGVuZ3RoKTsKKyAgfQorCitzdGF0aWMgbGx2bTo6U3RyaW5nUmVmIGdldFByZXR0eVBsYXRmb3JtTmFtZShsbHZtOjpTdHJpbmdSZWYgUGxhdGZvcm0pIHsKKyAgICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPGxsdm06OlN0cmluZ1JlZj4oUGxhdGZvcm0pCisgICAgICAgICAgICAgLkNhc2UoImFuZHJvaWQiLCAiQW5kcm9pZCIpCisgICAgICAgICAgICAgLkNhc2UoImlvcyIsICJpT1MiKQorICAgICAgICAgICAgIC5DYXNlKCJtYWNvcyIsICJtYWNPUyIpCisgICAgICAgICAgICAgLkNhc2UoInR2b3MiLCAidHZPUyIpCisgICAgICAgICAgICAgLkNhc2UoIndhdGNob3MiLCAid2F0Y2hPUyIpCisgICAgICAgICAgICAgLkNhc2UoImlvc19hcHBfZXh0ZW5zaW9uIiwgImlPUyAoQXBwIEV4dGVuc2lvbikiKQorICAgICAgICAgICAgIC5DYXNlKCJtYWNvc19hcHBfZXh0ZW5zaW9uIiwgIm1hY09TIChBcHAgRXh0ZW5zaW9uKSIpCisgICAgICAgICAgICAgLkNhc2UoInR2b3NfYXBwX2V4dGVuc2lvbiIsICJ0dk9TIChBcHAgRXh0ZW5zaW9uKSIpCisgICAgICAgICAgICAgLkNhc2UoIndhdGNob3NfYXBwX2V4dGVuc2lvbiIsICJ3YXRjaE9TIChBcHAgRXh0ZW5zaW9uKSIpCisgICAgICAgICAgICAgLkRlZmF1bHQobGx2bTo6U3RyaW5nUmVmKCkpOworfQorc3RhdGljIGxsdm06OlN0cmluZ1JlZiBnZXRQbGF0Zm9ybU5hbWVTb3VyY2VTcGVsbGluZyhsbHZtOjpTdHJpbmdSZWYgUGxhdGZvcm0pIHsKKyAgICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPGxsdm06OlN0cmluZ1JlZj4oUGxhdGZvcm0pCisgICAgICAgICAgICAgLkNhc2UoImlvcyIsICJpT1MiKQorICAgICAgICAgICAgIC5DYXNlKCJtYWNvcyIsICJtYWNPUyIpCisgICAgICAgICAgICAgLkNhc2UoInR2b3MiLCAidHZPUyIpCisgICAgICAgICAgICAgLkNhc2UoIndhdGNob3MiLCAid2F0Y2hPUyIpCisgICAgICAgICAgICAgLkNhc2UoImlvc19hcHBfZXh0ZW5zaW9uIiwgImlPU0FwcGxpY2F0aW9uRXh0ZW5zaW9uIikKKyAgICAgICAgICAgICAuQ2FzZSgibWFjb3NfYXBwX2V4dGVuc2lvbiIsICJtYWNPU0FwcGxpY2F0aW9uRXh0ZW5zaW9uIikKKyAgICAgICAgICAgICAuQ2FzZSgidHZvc19hcHBfZXh0ZW5zaW9uIiwgInR2T1NBcHBsaWNhdGlvbkV4dGVuc2lvbiIpCisgICAgICAgICAgICAgLkNhc2UoIndhdGNob3NfYXBwX2V4dGVuc2lvbiIsICJ3YXRjaE9TQXBwbGljYXRpb25FeHRlbnNpb24iKQorICAgICAgICAgICAgIC5EZWZhdWx0KFBsYXRmb3JtKTsKK30KK3N0YXRpYyBsbHZtOjpTdHJpbmdSZWYgY2Fub25pY2FsaXplUGxhdGZvcm1OYW1lKGxsdm06OlN0cmluZ1JlZiBQbGF0Zm9ybSkgeworICAgIHJldHVybiBsbHZtOjpTdHJpbmdTd2l0Y2g8bGx2bTo6U3RyaW5nUmVmPihQbGF0Zm9ybSkKKyAgICAgICAgICAgICAuQ2FzZSgiaU9TIiwgImlvcyIpCisgICAgICAgICAgICAgLkNhc2UoIm1hY09TIiwgIm1hY29zIikKKyAgICAgICAgICAgICAuQ2FzZSgidHZPUyIsICJ0dm9zIikKKyAgICAgICAgICAgICAuQ2FzZSgid2F0Y2hPUyIsICJ3YXRjaG9zIikKKyAgICAgICAgICAgICAuQ2FzZSgiaU9TQXBwbGljYXRpb25FeHRlbnNpb24iLCAiaW9zX2FwcF9leHRlbnNpb24iKQorICAgICAgICAgICAgIC5DYXNlKCJtYWNPU0FwcGxpY2F0aW9uRXh0ZW5zaW9uIiwgIm1hY29zX2FwcF9leHRlbnNpb24iKQorICAgICAgICAgICAgIC5DYXNlKCJ0dk9TQXBwbGljYXRpb25FeHRlbnNpb24iLCAidHZvc19hcHBfZXh0ZW5zaW9uIikKKyAgICAgICAgICAgICAuQ2FzZSgid2F0Y2hPU0FwcGxpY2F0aW9uRXh0ZW5zaW9uIiwgIndhdGNob3NfYXBwX2V4dGVuc2lvbiIpCisgICAgICAgICAgICAgLkRlZmF1bHQoUGxhdGZvcm0pOworfSAKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpBdmFpbGFiaWxpdHk7IH0KK307CisKK2NsYXNzIEJsb2Nrc0F0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgZW51bSBCbG9ja1R5cGUgeworICAgIEJ5UmVmCisgIH07Citwcml2YXRlOgorICBCbG9ja1R5cGUgdHlwZTsKKworcHVibGljOgorICBzdGF0aWMgQmxvY2tzQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBCbG9ja1R5cGUgVHlwZSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQmxvY2tzQXR0cihMb2MsIEN0eCwgVHlwZSwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBCbG9ja3NBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIEJsb2NrVHlwZSBUeXBlCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6QmxvY2tzLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIHR5cGUoVHlwZSkKKyAgeworICB9CisKKyAgQmxvY2tzQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBCbG9ja1R5cGUgZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZTsKKyAgfQorCisgIHN0YXRpYyBib29sIENvbnZlcnRTdHJUb0Jsb2NrVHlwZShTdHJpbmdSZWYgVmFsLCBCbG9ja1R5cGUgJk91dCkgeworICAgIE9wdGlvbmFsPEJsb2NrVHlwZT4gUiA9IGxsdm06OlN0cmluZ1N3aXRjaDxPcHRpb25hbDxCbG9ja1R5cGU+PihWYWwpCisgICAgICAuQ2FzZSgiYnlyZWYiLCBCbG9ja3NBdHRyOjpCeVJlZikKKyAgICAgIC5EZWZhdWx0KE9wdGlvbmFsPEJsb2NrVHlwZT4oKSk7CisgICAgaWYgKFIpIHsKKyAgICAgIE91dCA9ICpSOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBjaGFyICpDb252ZXJ0QmxvY2tUeXBlVG9TdHIoQmxvY2tUeXBlIFZhbCkgeworICAgIHN3aXRjaChWYWwpIHsKKyAgICBjYXNlIEJsb2Nrc0F0dHI6OkJ5UmVmOiByZXR1cm4gImJ5cmVmIjsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiTm8gZW51bWVyYXRvciB3aXRoIHRoYXQgdmFsdWUiKTsKKyAgfQorCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6QmxvY2tzOyB9Cit9OworCitjbGFzcyBDMTFOb1JldHVybkF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIEMxMU5vUmV0dXJuQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBDMTFOb1JldHVybkF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQzExTm9SZXR1cm5BdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkMxMU5vUmV0dXJuLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBDMTFOb1JldHVybkF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkMxMU5vUmV0dXJuOyB9Cit9OworCitjbGFzcyBDRGVjbEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIENEZWNsQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBDRGVjbEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQ0RlY2xBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkNEZWNsLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBDRGVjbEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkNEZWNsOyB9Cit9OworCitjbGFzcyBDRkF1ZGl0ZWRUcmFuc2ZlckF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIENGQXVkaXRlZFRyYW5zZmVyQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBDRkF1ZGl0ZWRUcmFuc2ZlckF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQ0ZBdWRpdGVkVHJhbnNmZXJBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkNGQXVkaXRlZFRyYW5zZmVyLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBDRkF1ZGl0ZWRUcmFuc2ZlckF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkNGQXVkaXRlZFRyYW5zZmVyOyB9Cit9OworCitjbGFzcyBDRkNvbnN1bWVkQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZVBhcmFtQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBDRkNvbnN1bWVkQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBDRkNvbnN1bWVkQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBDRkNvbnN1bWVkQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlUGFyYW1BdHRyKGF0dHI6OkNGQ29uc3VtZWQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIENGQ29uc3VtZWRBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpDRkNvbnN1bWVkOyB9Cit9OworCitjbGFzcyBDRlJldHVybnNOb3RSZXRhaW5lZEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIENGUmV0dXJuc05vdFJldGFpbmVkQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBDRlJldHVybnNOb3RSZXRhaW5lZEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQ0ZSZXR1cm5zTm90UmV0YWluZWRBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkNGUmV0dXJuc05vdFJldGFpbmVkLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBDRlJldHVybnNOb3RSZXRhaW5lZEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkNGUmV0dXJuc05vdFJldGFpbmVkOyB9Cit9OworCitjbGFzcyBDRlJldHVybnNSZXRhaW5lZEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIENGUmV0dXJuc1JldGFpbmVkQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBDRlJldHVybnNSZXRhaW5lZEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQ0ZSZXR1cm5zUmV0YWluZWRBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkNGUmV0dXJuc1JldGFpbmVkLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBDRlJldHVybnNSZXRhaW5lZEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkNGUmV0dXJuc1JldGFpbmVkOyB9Cit9OworCitjbGFzcyBDRlVua25vd25UcmFuc2ZlckF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIENGVW5rbm93blRyYW5zZmVyQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBDRlVua25vd25UcmFuc2ZlckF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQ0ZVbmtub3duVHJhbnNmZXJBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkNGVW5rbm93blRyYW5zZmVyLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBDRlVua25vd25UcmFuc2ZlckF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkNGVW5rbm93blRyYW5zZmVyOyB9Cit9OworCitjbGFzcyBDVURBQ29uc3RhbnRBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBDVURBQ29uc3RhbnRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIENVREFDb25zdGFudEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQ1VEQUNvbnN0YW50QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpDVURBQ29uc3RhbnQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIENVREFDb25zdGFudEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkNVREFDb25zdGFudDsgfQorfTsKKworY2xhc3MgQ1VEQURldmljZUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIENVREFEZXZpY2VBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIENVREFEZXZpY2VBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIENVREFEZXZpY2VBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkNVREFEZXZpY2UsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIENVREFEZXZpY2VBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpDVURBRGV2aWNlOyB9Cit9OworCitjbGFzcyBDVURBR2xvYmFsQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgQ1VEQUdsb2JhbEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQ1VEQUdsb2JhbEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQ1VEQUdsb2JhbEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6Q1VEQUdsb2JhbCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgQ1VEQUdsb2JhbEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkNVREFHbG9iYWw7IH0KK307CisKK2NsYXNzIENVREFIb3N0QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgQ1VEQUhvc3RBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIENVREFIb3N0QXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBDVURBSG9zdEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6Q1VEQUhvc3QsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIENVREFIb3N0QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6Q1VEQUhvc3Q7IH0KK307CisKK2NsYXNzIENVREFJbnZhbGlkVGFyZ2V0QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgQ1VEQUludmFsaWRUYXJnZXRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIENVREFJbnZhbGlkVGFyZ2V0QXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBDVURBSW52YWxpZFRhcmdldEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6Q1VEQUludmFsaWRUYXJnZXQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIENVREFJbnZhbGlkVGFyZ2V0QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6Q1VEQUludmFsaWRUYXJnZXQ7IH0KK307CisKK2NsYXNzIENVREFMYXVuY2hCb3VuZHNBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitFeHByICogbWF4VGhyZWFkczsKKworRXhwciAqIG1pbkJsb2NrczsKKworcHVibGljOgorICBzdGF0aWMgQ1VEQUxhdW5jaEJvdW5kc0F0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgRXhwciAqIE1heFRocmVhZHMsIEV4cHIgKiBNaW5CbG9ja3MsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIENVREFMYXVuY2hCb3VuZHNBdHRyKExvYywgQ3R4LCBNYXhUaHJlYWRzLCBNaW5CbG9ja3MsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQ1VEQUxhdW5jaEJvdW5kc0F0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgRXhwciAqIE1heFRocmVhZHMKKyAgICAgICAgICAgICAgLCBFeHByICogTWluQmxvY2tzCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6Q1VEQUxhdW5jaEJvdW5kcywgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBtYXhUaHJlYWRzKE1heFRocmVhZHMpCisgICAgICAgICAgICAgICwgbWluQmxvY2tzKE1pbkJsb2NrcykKKyAgeworICB9CisKKyAgQ1VEQUxhdW5jaEJvdW5kc0F0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgRXhwciAqIE1heFRocmVhZHMKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpDVURBTGF1bmNoQm91bmRzLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIG1heFRocmVhZHMoTWF4VGhyZWFkcykKKyAgICAgICAgICAgICAgLCBtaW5CbG9ja3MoKQorICB7CisgIH0KKworICBDVURBTGF1bmNoQm91bmRzQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBFeHByICogZ2V0TWF4VGhyZWFkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWF4VGhyZWFkczsKKyAgfQorCisgIEV4cHIgKiBnZXRNaW5CbG9ja3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1pbkJsb2NrczsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpDVURBTGF1bmNoQm91bmRzOyB9Cit9OworCitjbGFzcyBDVURBU2hhcmVkQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgQ1VEQVNoYXJlZEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQ1VEQVNoYXJlZEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQ1VEQVNoYXJlZEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6Q1VEQVNoYXJlZCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgQ1VEQVNoYXJlZEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkNVREFTaGFyZWQ7IH0KK307CisKK2NsYXNzIENYWDExTm9SZXR1cm5BdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBDWFgxMU5vUmV0dXJuQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBDWFgxMU5vUmV0dXJuQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBDWFgxMU5vUmV0dXJuQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpDWFgxMU5vUmV0dXJuLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBDWFgxMU5vUmV0dXJuQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6Q1hYMTFOb1JldHVybjsgfQorfTsKKworY2xhc3MgQ2FsbGFibGVXaGVuQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBlbnVtIENvbnN1bWVkU3RhdGUgeworICAgIFVua25vd24sCisgICAgQ29uc3VtZWQsCisgICAgVW5jb25zdW1lZAorICB9OworcHJpdmF0ZToKKyAgdW5zaWduZWQgY2FsbGFibGVTdGF0ZXNfU2l6ZTsKKyAgQ29uc3VtZWRTdGF0ZSAqY2FsbGFibGVTdGF0ZXNfOworCitwdWJsaWM6CisgIHN0YXRpYyBDYWxsYWJsZVdoZW5BdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIENvbnN1bWVkU3RhdGUgKkNhbGxhYmxlU3RhdGVzLCB1bnNpZ25lZCBDYWxsYWJsZVN0YXRlc1NpemUsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIENhbGxhYmxlV2hlbkF0dHIoTG9jLCBDdHgsIENhbGxhYmxlU3RhdGVzLCBDYWxsYWJsZVN0YXRlc1NpemUsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQ2FsbGFibGVXaGVuQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBDb25zdW1lZFN0YXRlICpDYWxsYWJsZVN0YXRlcywgdW5zaWduZWQgQ2FsbGFibGVTdGF0ZXNTaXplCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6Q2FsbGFibGVXaGVuLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIGNhbGxhYmxlU3RhdGVzX1NpemUoQ2FsbGFibGVTdGF0ZXNTaXplKSwgY2FsbGFibGVTdGF0ZXNfKG5ldyAoQ3R4LCAxNikgQ29uc3VtZWRTdGF0ZVtjYWxsYWJsZVN0YXRlc19TaXplXSkKKyAgeworICAgIHN0ZDo6Y29weShDYWxsYWJsZVN0YXRlcywgQ2FsbGFibGVTdGF0ZXMgKyBjYWxsYWJsZVN0YXRlc19TaXplLCBjYWxsYWJsZVN0YXRlc18pOworICB9CisKKyAgQ2FsbGFibGVXaGVuQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpDYWxsYWJsZVdoZW4sIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgY2FsbGFibGVTdGF0ZXNfU2l6ZSgwKSwgY2FsbGFibGVTdGF0ZXNfKG51bGxwdHIpCisgIHsKKyAgfQorCisgIENhbGxhYmxlV2hlbkF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgdHlwZWRlZiBDb25zdW1lZFN0YXRlKiBjYWxsYWJsZVN0YXRlc19pdGVyYXRvcjsKKyAgY2FsbGFibGVTdGF0ZXNfaXRlcmF0b3IgY2FsbGFibGVTdGF0ZXNfYmVnaW4oKSBjb25zdCB7IHJldHVybiBjYWxsYWJsZVN0YXRlc187IH0KKyAgY2FsbGFibGVTdGF0ZXNfaXRlcmF0b3IgY2FsbGFibGVTdGF0ZXNfZW5kKCkgY29uc3QgeyByZXR1cm4gY2FsbGFibGVTdGF0ZXNfICsgY2FsbGFibGVTdGF0ZXNfU2l6ZTsgfQorICB1bnNpZ25lZCBjYWxsYWJsZVN0YXRlc19zaXplKCkgY29uc3QgeyByZXR1cm4gY2FsbGFibGVTdGF0ZXNfU2l6ZTsgfQorICBsbHZtOjppdGVyYXRvcl9yYW5nZTxjYWxsYWJsZVN0YXRlc19pdGVyYXRvcj4gY2FsbGFibGVTdGF0ZXMoKSBjb25zdCB7IHJldHVybiBsbHZtOjptYWtlX3JhbmdlKGNhbGxhYmxlU3RhdGVzX2JlZ2luKCksIGNhbGxhYmxlU3RhdGVzX2VuZCgpKTsgfQorCisKKyAgc3RhdGljIGJvb2wgQ29udmVydFN0clRvQ29uc3VtZWRTdGF0ZShTdHJpbmdSZWYgVmFsLCBDb25zdW1lZFN0YXRlICZPdXQpIHsKKyAgICBPcHRpb25hbDxDb25zdW1lZFN0YXRlPiBSID0gbGx2bTo6U3RyaW5nU3dpdGNoPE9wdGlvbmFsPENvbnN1bWVkU3RhdGU+PihWYWwpCisgICAgICAuQ2FzZSgidW5rbm93biIsIENhbGxhYmxlV2hlbkF0dHI6OlVua25vd24pCisgICAgICAuQ2FzZSgiY29uc3VtZWQiLCBDYWxsYWJsZVdoZW5BdHRyOjpDb25zdW1lZCkKKyAgICAgIC5DYXNlKCJ1bmNvbnN1bWVkIiwgQ2FsbGFibGVXaGVuQXR0cjo6VW5jb25zdW1lZCkKKyAgICAgIC5EZWZhdWx0KE9wdGlvbmFsPENvbnN1bWVkU3RhdGU+KCkpOworICAgIGlmIChSKSB7CisgICAgICBPdXQgPSAqUjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGF0aWMgY29uc3QgY2hhciAqQ29udmVydENvbnN1bWVkU3RhdGVUb1N0cihDb25zdW1lZFN0YXRlIFZhbCkgeworICAgIHN3aXRjaChWYWwpIHsKKyAgICBjYXNlIENhbGxhYmxlV2hlbkF0dHI6OlVua25vd246IHJldHVybiAidW5rbm93biI7CisgICAgY2FzZSBDYWxsYWJsZVdoZW5BdHRyOjpDb25zdW1lZDogcmV0dXJuICJjb25zdW1lZCI7CisgICAgY2FzZSBDYWxsYWJsZVdoZW5BdHRyOjpVbmNvbnN1bWVkOiByZXR1cm4gInVuY29uc3VtZWQiOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJObyBlbnVtZXJhdG9yIHdpdGggdGhhdCB2YWx1ZSIpOworICB9CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpDYWxsYWJsZVdoZW47IH0KK307CisKK2NsYXNzIENhcGFiaWxpdHlBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7Cit1bnNpZ25lZCBuYW1lTGVuZ3RoOworY2hhciAqbmFtZTsKKworcHVibGljOgorICBlbnVtIFNwZWxsaW5nIHsKKyAgICBHTlVfY2FwYWJpbGl0eSA9IDAsCisgICAgQ1hYMTFfY2xhbmdfY2FwYWJpbGl0eSA9IDEsCisgICAgR05VX3NoYXJlZF9jYXBhYmlsaXR5ID0gMiwKKyAgICBDWFgxMV9jbGFuZ19zaGFyZWRfY2FwYWJpbGl0eSA9IDMKKyAgfTsKKworICBzdGF0aWMgQ2FwYWJpbGl0eUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU3BlbGxpbmcgUywgbGx2bTo6U3RyaW5nUmVmIE5hbWUsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIENhcGFiaWxpdHlBdHRyKExvYywgQ3R4LCBOYW1lLCBTKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIENhcGFiaWxpdHlBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIGxsdm06OlN0cmluZ1JlZiBOYW1lCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6Q2FwYWJpbGl0eSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBuYW1lTGVuZ3RoKE5hbWUuc2l6ZSgpKSxuYW1lKG5ldyAoQ3R4LCAxKSBjaGFyW25hbWVMZW5ndGhdKQorICB7CisgICAgICBpZiAoIU5hbWUuZW1wdHkoKSkKKyAgICAgICAgc3RkOjptZW1jcHkobmFtZSwgTmFtZS5kYXRhKCksIG5hbWVMZW5ndGgpOworICB9CisKKyAgQ2FwYWJpbGl0eUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgU3BlbGxpbmcgZ2V0U2VtYW50aWNTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc3BlbGxpbmcgbGlzdCBpbmRleCIpOworICAgIGNhc2UgMDogcmV0dXJuIEdOVV9jYXBhYmlsaXR5OworICAgIGNhc2UgMTogcmV0dXJuIENYWDExX2NsYW5nX2NhcGFiaWxpdHk7CisgICAgY2FzZSAyOiByZXR1cm4gR05VX3NoYXJlZF9jYXBhYmlsaXR5OworICAgIGNhc2UgMzogcmV0dXJuIENYWDExX2NsYW5nX3NoYXJlZF9jYXBhYmlsaXR5OworICB9CisgIH0KKyAgYm9vbCBpc1NoYXJlZCgpIGNvbnN0IHsgcmV0dXJuIFNwZWxsaW5nTGlzdEluZGV4ID09IDIgfHwKKyAgICBTcGVsbGluZ0xpc3RJbmRleCA9PSAzOyB9CisgIGxsdm06OlN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjpTdHJpbmdSZWYobmFtZSwgbmFtZUxlbmd0aCk7CisgIH0KKyAgdW5zaWduZWQgZ2V0TmFtZUxlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmFtZUxlbmd0aDsKKyAgfQorICB2b2lkIHNldE5hbWUoQVNUQ29udGV4dCAmQywgbGx2bTo6U3RyaW5nUmVmIFMpIHsKKyAgICBuYW1lTGVuZ3RoID0gUy5zaXplKCk7CisgICAgdGhpcy0+bmFtZSA9IG5ldyAoQywgMSkgY2hhciBbbmFtZUxlbmd0aF07CisgICAgaWYgKCFTLmVtcHR5KCkpCisgICAgICBzdGQ6Om1lbWNweSh0aGlzLT5uYW1lLCBTLmRhdGEoKSwgbmFtZUxlbmd0aCk7CisgIH0KKworCisgICAgYm9vbCBpc011dGV4KCkgY29uc3QgeyByZXR1cm4gZ2V0TmFtZSgpLmVxdWFsc19sb3dlcigibXV0ZXgiKTsgfQorICAgIGJvb2wgaXNSb2xlKCkgY29uc3QgeyByZXR1cm4gZ2V0TmFtZSgpLmVxdWFsc19sb3dlcigicm9sZSIpOyB9CisgIAorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkNhcGFiaWxpdHk7IH0KK307CisKK2NsYXNzIENhcHR1cmVkUmVjb3JkQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgQ2FwdHVyZWRSZWNvcmRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIENhcHR1cmVkUmVjb3JkQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBDYXB0dXJlZFJlY29yZEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6Q2FwdHVyZWRSZWNvcmQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIENhcHR1cmVkUmVjb3JkQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6Q2FwdHVyZWRSZWNvcmQ7IH0KK307CisKK2NsYXNzIENhcnJpZXNEZXBlbmRlbmN5QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZVBhcmFtQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBDYXJyaWVzRGVwZW5kZW5jeUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQ2Fycmllc0RlcGVuZGVuY3lBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIENhcnJpZXNEZXBlbmRlbmN5QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlUGFyYW1BdHRyKGF0dHI6OkNhcnJpZXNEZXBlbmRlbmN5LCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBDYXJyaWVzRGVwZW5kZW5jeUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkNhcnJpZXNEZXBlbmRlbmN5OyB9Cit9OworCitjbGFzcyBDbGVhbnVwQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworRnVuY3Rpb25EZWNsICogZnVuY3Rpb25EZWNsOworCitwdWJsaWM6CisgIHN0YXRpYyBDbGVhbnVwQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBGdW5jdGlvbkRlY2wgKiBGdW5jdGlvbkRlY2wsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIENsZWFudXBBdHRyKExvYywgQ3R4LCBGdW5jdGlvbkRlY2wsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQ2xlYW51cEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgRnVuY3Rpb25EZWNsICogRnVuY3Rpb25EZWNsCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6Q2xlYW51cCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBmdW5jdGlvbkRlY2woRnVuY3Rpb25EZWNsKQorICB7CisgIH0KKworICBDbGVhbnVwQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBGdW5jdGlvbkRlY2wgKiBnZXRGdW5jdGlvbkRlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGZ1bmN0aW9uRGVjbDsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpDbGVhbnVwOyB9Cit9OworCitjbGFzcyBDb2xkQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgQ29sZEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQ29sZEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQ29sZEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6Q29sZCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgQ29sZEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkNvbGQ7IH0KK307CisKK2NsYXNzIENvbW1vbkF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIENvbW1vbkF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQ29tbW9uQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBDb21tb25BdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkNvbW1vbiwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgQ29tbW9uQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6Q29tbW9uOyB9Cit9OworCitjbGFzcyBDb25zdEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIENvbnN0QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBDb25zdEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQ29uc3RBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkNvbnN0LCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBDb25zdEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkNvbnN0OyB9Cit9OworCitjbGFzcyBDb25zdHJ1Y3RvckF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK2ludCBwcmlvcml0eTsKKworcHVibGljOgorICBzdGF0aWMgQ29uc3RydWN0b3JBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIGludCBQcmlvcml0eSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQ29uc3RydWN0b3JBdHRyKExvYywgQ3R4LCBQcmlvcml0eSwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBDb25zdHJ1Y3RvckF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgaW50IFByaW9yaXR5CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6Q29uc3RydWN0b3IsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgcHJpb3JpdHkoUHJpb3JpdHkpCisgIHsKKyAgfQorCisgIENvbnN0cnVjdG9yQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpDb25zdHJ1Y3RvciwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBwcmlvcml0eSgpCisgIHsKKyAgfQorCisgIENvbnN0cnVjdG9yQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBpbnQgZ2V0UHJpb3JpdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIHByaW9yaXR5OworICB9CisKKyAgc3RhdGljIGNvbnN0IGludCBEZWZhdWx0UHJpb3JpdHkgPSA2NTUzNTsKKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6Q29uc3RydWN0b3I7IH0KK307CisKK2NsYXNzIENvbnN1bWFibGVBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIGVudW0gQ29uc3VtZWRTdGF0ZSB7CisgICAgVW5rbm93biwKKyAgICBDb25zdW1lZCwKKyAgICBVbmNvbnN1bWVkCisgIH07Citwcml2YXRlOgorICBDb25zdW1lZFN0YXRlIGRlZmF1bHRTdGF0ZTsKKworcHVibGljOgorICBzdGF0aWMgQ29uc3VtYWJsZUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgQ29uc3VtZWRTdGF0ZSBEZWZhdWx0U3RhdGUsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIENvbnN1bWFibGVBdHRyKExvYywgQ3R4LCBEZWZhdWx0U3RhdGUsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQ29uc3VtYWJsZUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgQ29uc3VtZWRTdGF0ZSBEZWZhdWx0U3RhdGUKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpDb25zdW1hYmxlLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIGRlZmF1bHRTdGF0ZShEZWZhdWx0U3RhdGUpCisgIHsKKyAgfQorCisgIENvbnN1bWFibGVBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIENvbnN1bWVkU3RhdGUgZ2V0RGVmYXVsdFN0YXRlKCkgY29uc3QgeworICAgIHJldHVybiBkZWZhdWx0U3RhdGU7CisgIH0KKworICBzdGF0aWMgYm9vbCBDb252ZXJ0U3RyVG9Db25zdW1lZFN0YXRlKFN0cmluZ1JlZiBWYWwsIENvbnN1bWVkU3RhdGUgJk91dCkgeworICAgIE9wdGlvbmFsPENvbnN1bWVkU3RhdGU+IFIgPSBsbHZtOjpTdHJpbmdTd2l0Y2g8T3B0aW9uYWw8Q29uc3VtZWRTdGF0ZT4+KFZhbCkKKyAgICAgIC5DYXNlKCJ1bmtub3duIiwgQ29uc3VtYWJsZUF0dHI6OlVua25vd24pCisgICAgICAuQ2FzZSgiY29uc3VtZWQiLCBDb25zdW1hYmxlQXR0cjo6Q29uc3VtZWQpCisgICAgICAuQ2FzZSgidW5jb25zdW1lZCIsIENvbnN1bWFibGVBdHRyOjpVbmNvbnN1bWVkKQorICAgICAgLkRlZmF1bHQoT3B0aW9uYWw8Q29uc3VtZWRTdGF0ZT4oKSk7CisgICAgaWYgKFIpIHsKKyAgICAgIE91dCA9ICpSOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBjaGFyICpDb252ZXJ0Q29uc3VtZWRTdGF0ZVRvU3RyKENvbnN1bWVkU3RhdGUgVmFsKSB7CisgICAgc3dpdGNoKFZhbCkgeworICAgIGNhc2UgQ29uc3VtYWJsZUF0dHI6OlVua25vd246IHJldHVybiAidW5rbm93biI7CisgICAgY2FzZSBDb25zdW1hYmxlQXR0cjo6Q29uc3VtZWQ6IHJldHVybiAiY29uc3VtZWQiOworICAgIGNhc2UgQ29uc3VtYWJsZUF0dHI6OlVuY29uc3VtZWQ6IHJldHVybiAidW5jb25zdW1lZCI7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIk5vIGVudW1lcmF0b3Igd2l0aCB0aGF0IHZhbHVlIik7CisgIH0KKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkNvbnN1bWFibGU7IH0KK307CisKK2NsYXNzIENvbnN1bWFibGVBdXRvQ2FzdEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIENvbnN1bWFibGVBdXRvQ2FzdEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQ29uc3VtYWJsZUF1dG9DYXN0QXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBDb25zdW1hYmxlQXV0b0Nhc3RBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkNvbnN1bWFibGVBdXRvQ2FzdCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgQ29uc3VtYWJsZUF1dG9DYXN0QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6Q29uc3VtYWJsZUF1dG9DYXN0OyB9Cit9OworCitjbGFzcyBDb25zdW1hYmxlU2V0T25SZWFkQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgQ29uc3VtYWJsZVNldE9uUmVhZEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgQ29uc3VtYWJsZVNldE9uUmVhZEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgQ29uc3VtYWJsZVNldE9uUmVhZEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6Q29uc3VtYWJsZVNldE9uUmVhZCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgQ29uc3VtYWJsZVNldE9uUmVhZEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkNvbnN1bWFibGVTZXRPblJlYWQ7IH0KK307CisKK2NsYXNzIENvbnZlcmdlbnRBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBDb252ZXJnZW50QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBDb252ZXJnZW50QXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBDb252ZXJnZW50QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpDb252ZXJnZW50LCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBDb252ZXJnZW50QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6Q29udmVyZ2VudDsgfQorfTsKKworY2xhc3MgRExMRXhwb3J0QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgRExMRXhwb3J0QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBETExFeHBvcnRBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIERMTEV4cG9ydEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6RExMRXhwb3J0LCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBETExFeHBvcnRBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpETExFeHBvcnQ7IH0KK307CisKK2NsYXNzIERMTEltcG9ydEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIERMTEltcG9ydEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgRExMSW1wb3J0QXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBETExJbXBvcnRBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkRMTEltcG9ydCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgRExMSW1wb3J0QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6RExMSW1wb3J0OyB9Cit9OworCitjbGFzcyBEZXByZWNhdGVkQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgewordW5zaWduZWQgbWVzc2FnZUxlbmd0aDsKK2NoYXIgKm1lc3NhZ2U7CisKK3Vuc2lnbmVkIHJlcGxhY2VtZW50TGVuZ3RoOworY2hhciAqcmVwbGFjZW1lbnQ7CisKK3B1YmxpYzoKKyAgc3RhdGljIERlcHJlY2F0ZWRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIGxsdm06OlN0cmluZ1JlZiBNZXNzYWdlLCBsbHZtOjpTdHJpbmdSZWYgUmVwbGFjZW1lbnQsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIERlcHJlY2F0ZWRBdHRyKExvYywgQ3R4LCBNZXNzYWdlLCBSZXBsYWNlbWVudCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBEZXByZWNhdGVkQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBsbHZtOjpTdHJpbmdSZWYgTWVzc2FnZQorICAgICAgICAgICAgICAsIGxsdm06OlN0cmluZ1JlZiBSZXBsYWNlbWVudAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkRlcHJlY2F0ZWQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgbWVzc2FnZUxlbmd0aChNZXNzYWdlLnNpemUoKSksbWVzc2FnZShuZXcgKEN0eCwgMSkgY2hhclttZXNzYWdlTGVuZ3RoXSkKKyAgICAgICAgICAgICAgLCByZXBsYWNlbWVudExlbmd0aChSZXBsYWNlbWVudC5zaXplKCkpLHJlcGxhY2VtZW50KG5ldyAoQ3R4LCAxKSBjaGFyW3JlcGxhY2VtZW50TGVuZ3RoXSkKKyAgeworICAgICAgaWYgKCFNZXNzYWdlLmVtcHR5KCkpCisgICAgICAgIHN0ZDo6bWVtY3B5KG1lc3NhZ2UsIE1lc3NhZ2UuZGF0YSgpLCBtZXNzYWdlTGVuZ3RoKTsKKyAgICAgIGlmICghUmVwbGFjZW1lbnQuZW1wdHkoKSkKKyAgICAgICAgc3RkOjptZW1jcHkocmVwbGFjZW1lbnQsIFJlcGxhY2VtZW50LmRhdGEoKSwgcmVwbGFjZW1lbnRMZW5ndGgpOworICB9CisKKyAgRGVwcmVjYXRlZEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6RGVwcmVjYXRlZCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBtZXNzYWdlTGVuZ3RoKDApLG1lc3NhZ2UobnVsbHB0cikKKyAgICAgICAgICAgICAgLCByZXBsYWNlbWVudExlbmd0aCgwKSxyZXBsYWNlbWVudChudWxscHRyKQorICB7CisgIH0KKworICBEZXByZWNhdGVkQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBsbHZtOjpTdHJpbmdSZWYgZ2V0TWVzc2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6U3RyaW5nUmVmKG1lc3NhZ2UsIG1lc3NhZ2VMZW5ndGgpOworICB9CisgIHVuc2lnbmVkIGdldE1lc3NhZ2VMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1lc3NhZ2VMZW5ndGg7CisgIH0KKyAgdm9pZCBzZXRNZXNzYWdlKEFTVENvbnRleHQgJkMsIGxsdm06OlN0cmluZ1JlZiBTKSB7CisgICAgbWVzc2FnZUxlbmd0aCA9IFMuc2l6ZSgpOworICAgIHRoaXMtPm1lc3NhZ2UgPSBuZXcgKEMsIDEpIGNoYXIgW21lc3NhZ2VMZW5ndGhdOworICAgIGlmICghUy5lbXB0eSgpKQorICAgICAgc3RkOjptZW1jcHkodGhpcy0+bWVzc2FnZSwgUy5kYXRhKCksIG1lc3NhZ2VMZW5ndGgpOworICB9CisKKyAgbGx2bTo6U3RyaW5nUmVmIGdldFJlcGxhY2VtZW50KCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjpTdHJpbmdSZWYocmVwbGFjZW1lbnQsIHJlcGxhY2VtZW50TGVuZ3RoKTsKKyAgfQorICB1bnNpZ25lZCBnZXRSZXBsYWNlbWVudExlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVwbGFjZW1lbnRMZW5ndGg7CisgIH0KKyAgdm9pZCBzZXRSZXBsYWNlbWVudChBU1RDb250ZXh0ICZDLCBsbHZtOjpTdHJpbmdSZWYgUykgeworICAgIHJlcGxhY2VtZW50TGVuZ3RoID0gUy5zaXplKCk7CisgICAgdGhpcy0+cmVwbGFjZW1lbnQgPSBuZXcgKEMsIDEpIGNoYXIgW3JlcGxhY2VtZW50TGVuZ3RoXTsKKyAgICBpZiAoIVMuZW1wdHkoKSkKKyAgICAgIHN0ZDo6bWVtY3B5KHRoaXMtPnJlcGxhY2VtZW50LCBTLmRhdGEoKSwgcmVwbGFjZW1lbnRMZW5ndGgpOworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkRlcHJlY2F0ZWQ7IH0KK307CisKK2NsYXNzIERlc3RydWN0b3JBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitpbnQgcHJpb3JpdHk7CisKK3B1YmxpYzoKKyAgc3RhdGljIERlc3RydWN0b3JBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIGludCBQcmlvcml0eSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgRGVzdHJ1Y3RvckF0dHIoTG9jLCBDdHgsIFByaW9yaXR5LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIERlc3RydWN0b3JBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIGludCBQcmlvcml0eQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkRlc3RydWN0b3IsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgcHJpb3JpdHkoUHJpb3JpdHkpCisgIHsKKyAgfQorCisgIERlc3RydWN0b3JBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkRlc3RydWN0b3IsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgcHJpb3JpdHkoKQorICB7CisgIH0KKworICBEZXN0cnVjdG9yQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBpbnQgZ2V0UHJpb3JpdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIHByaW9yaXR5OworICB9CisKKyAgc3RhdGljIGNvbnN0IGludCBEZWZhdWx0UHJpb3JpdHkgPSA2NTUzNTsKKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6RGVzdHJ1Y3RvcjsgfQorfTsKKworY2xhc3MgRGlhZ25vc2VJZkF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK0V4cHIgKiBjb25kOworCit1bnNpZ25lZCBtZXNzYWdlTGVuZ3RoOworY2hhciAqbWVzc2FnZTsKKworcHVibGljOgorICBlbnVtIERpYWdub3N0aWNUeXBlIHsKKyAgICBEVF9FcnJvciwKKyAgICBEVF9XYXJuaW5nCisgIH07Citwcml2YXRlOgorICBEaWFnbm9zdGljVHlwZSBkaWFnbm9zdGljVHlwZTsKKworYm9vbCBhcmdEZXBlbmRlbnQ7CisKK05hbWVkRGVjbCAqIHBhcmVudDsKKworcHVibGljOgorICBzdGF0aWMgRGlhZ25vc2VJZkF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgRXhwciAqIENvbmQsIGxsdm06OlN0cmluZ1JlZiBNZXNzYWdlLCBEaWFnbm9zdGljVHlwZSBEaWFnbm9zdGljVHlwZSwgYm9vbCBBcmdEZXBlbmRlbnQsIE5hbWVkRGVjbCAqIFBhcmVudCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgRGlhZ25vc2VJZkF0dHIoTG9jLCBDdHgsIENvbmQsIE1lc3NhZ2UsIERpYWdub3N0aWNUeXBlLCBBcmdEZXBlbmRlbnQsIFBhcmVudCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBzdGF0aWMgRGlhZ25vc2VJZkF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgRXhwciAqIENvbmQsIGxsdm06OlN0cmluZ1JlZiBNZXNzYWdlLCBEaWFnbm9zdGljVHlwZSBEaWFnbm9zdGljVHlwZSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgRGlhZ25vc2VJZkF0dHIoTG9jLCBDdHgsIENvbmQsIE1lc3NhZ2UsIERpYWdub3N0aWNUeXBlLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIERpYWdub3NlSWZBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIEV4cHIgKiBDb25kCisgICAgICAgICAgICAgICwgbGx2bTo6U3RyaW5nUmVmIE1lc3NhZ2UKKyAgICAgICAgICAgICAgLCBEaWFnbm9zdGljVHlwZSBEaWFnbm9zdGljVHlwZQorICAgICAgICAgICAgICAsIGJvb2wgQXJnRGVwZW5kZW50CisgICAgICAgICAgICAgICwgTmFtZWREZWNsICogUGFyZW50CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6RGlhZ25vc2VJZiwgUiwgU0ksIHRydWUsIHRydWUpCisgICAgICAgICAgICAgICwgY29uZChDb25kKQorICAgICAgICAgICAgICAsIG1lc3NhZ2VMZW5ndGgoTWVzc2FnZS5zaXplKCkpLG1lc3NhZ2UobmV3IChDdHgsIDEpIGNoYXJbbWVzc2FnZUxlbmd0aF0pCisgICAgICAgICAgICAgICwgZGlhZ25vc3RpY1R5cGUoRGlhZ25vc3RpY1R5cGUpCisgICAgICAgICAgICAgICwgYXJnRGVwZW5kZW50KEFyZ0RlcGVuZGVudCkKKyAgICAgICAgICAgICAgLCBwYXJlbnQoUGFyZW50KQorICB7CisgICAgICBpZiAoIU1lc3NhZ2UuZW1wdHkoKSkKKyAgICAgICAgc3RkOjptZW1jcHkobWVzc2FnZSwgTWVzc2FnZS5kYXRhKCksIG1lc3NhZ2VMZW5ndGgpOworICB9CisKKyAgRGlhZ25vc2VJZkF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgRXhwciAqIENvbmQKKyAgICAgICAgICAgICAgLCBsbHZtOjpTdHJpbmdSZWYgTWVzc2FnZQorICAgICAgICAgICAgICAsIERpYWdub3N0aWNUeXBlIERpYWdub3N0aWNUeXBlCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6RGlhZ25vc2VJZiwgUiwgU0ksIHRydWUsIHRydWUpCisgICAgICAgICAgICAgICwgY29uZChDb25kKQorICAgICAgICAgICAgICAsIG1lc3NhZ2VMZW5ndGgoTWVzc2FnZS5zaXplKCkpLG1lc3NhZ2UobmV3IChDdHgsIDEpIGNoYXJbbWVzc2FnZUxlbmd0aF0pCisgICAgICAgICAgICAgICwgZGlhZ25vc3RpY1R5cGUoRGlhZ25vc3RpY1R5cGUpCisgICAgICAgICAgICAgICwgYXJnRGVwZW5kZW50KCkKKyAgICAgICAgICAgICAgLCBwYXJlbnQoKQorICB7CisgICAgICBpZiAoIU1lc3NhZ2UuZW1wdHkoKSkKKyAgICAgICAgc3RkOjptZW1jcHkobWVzc2FnZSwgTWVzc2FnZS5kYXRhKCksIG1lc3NhZ2VMZW5ndGgpOworICB9CisKKyAgRGlhZ25vc2VJZkF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgRXhwciAqIGdldENvbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbmQ7CisgIH0KKworICBsbHZtOjpTdHJpbmdSZWYgZ2V0TWVzc2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6U3RyaW5nUmVmKG1lc3NhZ2UsIG1lc3NhZ2VMZW5ndGgpOworICB9CisgIHVuc2lnbmVkIGdldE1lc3NhZ2VMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1lc3NhZ2VMZW5ndGg7CisgIH0KKyAgdm9pZCBzZXRNZXNzYWdlKEFTVENvbnRleHQgJkMsIGxsdm06OlN0cmluZ1JlZiBTKSB7CisgICAgbWVzc2FnZUxlbmd0aCA9IFMuc2l6ZSgpOworICAgIHRoaXMtPm1lc3NhZ2UgPSBuZXcgKEMsIDEpIGNoYXIgW21lc3NhZ2VMZW5ndGhdOworICAgIGlmICghUy5lbXB0eSgpKQorICAgICAgc3RkOjptZW1jcHkodGhpcy0+bWVzc2FnZSwgUy5kYXRhKCksIG1lc3NhZ2VMZW5ndGgpOworICB9CisKKyAgRGlhZ25vc3RpY1R5cGUgZ2V0RGlhZ25vc3RpY1R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGRpYWdub3N0aWNUeXBlOworICB9CisKKyAgc3RhdGljIGJvb2wgQ29udmVydFN0clRvRGlhZ25vc3RpY1R5cGUoU3RyaW5nUmVmIFZhbCwgRGlhZ25vc3RpY1R5cGUgJk91dCkgeworICAgIE9wdGlvbmFsPERpYWdub3N0aWNUeXBlPiBSID0gbGx2bTo6U3RyaW5nU3dpdGNoPE9wdGlvbmFsPERpYWdub3N0aWNUeXBlPj4oVmFsKQorICAgICAgLkNhc2UoImVycm9yIiwgRGlhZ25vc2VJZkF0dHI6OkRUX0Vycm9yKQorICAgICAgLkNhc2UoIndhcm5pbmciLCBEaWFnbm9zZUlmQXR0cjo6RFRfV2FybmluZykKKyAgICAgIC5EZWZhdWx0KE9wdGlvbmFsPERpYWdub3N0aWNUeXBlPigpKTsKKyAgICBpZiAoUikgeworICAgICAgT3V0ID0gKlI7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RhdGljIGNvbnN0IGNoYXIgKkNvbnZlcnREaWFnbm9zdGljVHlwZVRvU3RyKERpYWdub3N0aWNUeXBlIFZhbCkgeworICAgIHN3aXRjaChWYWwpIHsKKyAgICBjYXNlIERpYWdub3NlSWZBdHRyOjpEVF9FcnJvcjogcmV0dXJuICJlcnJvciI7CisgICAgY2FzZSBEaWFnbm9zZUlmQXR0cjo6RFRfV2FybmluZzogcmV0dXJuICJ3YXJuaW5nIjsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiTm8gZW51bWVyYXRvciB3aXRoIHRoYXQgdmFsdWUiKTsKKyAgfQorICBib29sIGdldEFyZ0RlcGVuZGVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gYXJnRGVwZW5kZW50OworICB9CisKKyAgTmFtZWREZWNsICogZ2V0UGFyZW50KCkgY29uc3QgeworICAgIHJldHVybiBwYXJlbnQ7CisgIH0KKworCisgICAgYm9vbCBpc0Vycm9yKCkgY29uc3QgeyByZXR1cm4gZGlhZ25vc3RpY1R5cGUgPT0gRFRfRXJyb3I7IH0KKyAgICBib29sIGlzV2FybmluZygpIGNvbnN0IHsgcmV0dXJuIGRpYWdub3N0aWNUeXBlID09IERUX1dhcm5pbmc7IH0KKyAgCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6RGlhZ25vc2VJZjsgfQorfTsKKworY2xhc3MgRGlzYWJsZVRhaWxDYWxsc0F0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIERpc2FibGVUYWlsQ2FsbHNBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIERpc2FibGVUYWlsQ2FsbHNBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIERpc2FibGVUYWlsQ2FsbHNBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkRpc2FibGVUYWlsQ2FsbHMsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIERpc2FibGVUYWlsQ2FsbHNBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpEaXNhYmxlVGFpbENhbGxzOyB9Cit9OworCitjbGFzcyBFbXB0eUJhc2VzQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgRW1wdHlCYXNlc0F0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgRW1wdHlCYXNlc0F0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgRW1wdHlCYXNlc0F0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6RW1wdHlCYXNlcywgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgRW1wdHlCYXNlc0F0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkVtcHR5QmFzZXM7IH0KK307CisKK2NsYXNzIEVuYWJsZUlmQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworRXhwciAqIGNvbmQ7CisKK3Vuc2lnbmVkIG1lc3NhZ2VMZW5ndGg7CitjaGFyICptZXNzYWdlOworCitwdWJsaWM6CisgIHN0YXRpYyBFbmFibGVJZkF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgRXhwciAqIENvbmQsIGxsdm06OlN0cmluZ1JlZiBNZXNzYWdlLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBFbmFibGVJZkF0dHIoTG9jLCBDdHgsIENvbmQsIE1lc3NhZ2UsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgRW5hYmxlSWZBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIEV4cHIgKiBDb25kCisgICAgICAgICAgICAgICwgbGx2bTo6U3RyaW5nUmVmIE1lc3NhZ2UKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpFbmFibGVJZiwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBjb25kKENvbmQpCisgICAgICAgICAgICAgICwgbWVzc2FnZUxlbmd0aChNZXNzYWdlLnNpemUoKSksbWVzc2FnZShuZXcgKEN0eCwgMSkgY2hhclttZXNzYWdlTGVuZ3RoXSkKKyAgeworICAgICAgaWYgKCFNZXNzYWdlLmVtcHR5KCkpCisgICAgICAgIHN0ZDo6bWVtY3B5KG1lc3NhZ2UsIE1lc3NhZ2UuZGF0YSgpLCBtZXNzYWdlTGVuZ3RoKTsKKyAgfQorCisgIEVuYWJsZUlmQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBFeHByICogZ2V0Q29uZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uZDsKKyAgfQorCisgIGxsdm06OlN0cmluZ1JlZiBnZXRNZXNzYWdlKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjpTdHJpbmdSZWYobWVzc2FnZSwgbWVzc2FnZUxlbmd0aCk7CisgIH0KKyAgdW5zaWduZWQgZ2V0TWVzc2FnZUxlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWVzc2FnZUxlbmd0aDsKKyAgfQorICB2b2lkIHNldE1lc3NhZ2UoQVNUQ29udGV4dCAmQywgbGx2bTo6U3RyaW5nUmVmIFMpIHsKKyAgICBtZXNzYWdlTGVuZ3RoID0gUy5zaXplKCk7CisgICAgdGhpcy0+bWVzc2FnZSA9IG5ldyAoQywgMSkgY2hhciBbbWVzc2FnZUxlbmd0aF07CisgICAgaWYgKCFTLmVtcHR5KCkpCisgICAgICBzdGQ6Om1lbWNweSh0aGlzLT5tZXNzYWdlLCBTLmRhdGEoKSwgbWVzc2FnZUxlbmd0aCk7CisgIH0KKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6RW5hYmxlSWY7IH0KK307CisKK2NsYXNzIEVudW1FeHRlbnNpYmlsaXR5QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBlbnVtIEtpbmQgeworICAgIENsb3NlZCwKKyAgICBPcGVuCisgIH07Citwcml2YXRlOgorICBLaW5kIGV4dGVuc2liaWxpdHk7CisKK3B1YmxpYzoKKyAgc3RhdGljIEVudW1FeHRlbnNpYmlsaXR5QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBLaW5kIEV4dGVuc2liaWxpdHksIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIEVudW1FeHRlbnNpYmlsaXR5QXR0cihMb2MsIEN0eCwgRXh0ZW5zaWJpbGl0eSwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBFbnVtRXh0ZW5zaWJpbGl0eUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgS2luZCBFeHRlbnNpYmlsaXR5CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6RW51bUV4dGVuc2liaWxpdHksIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgZXh0ZW5zaWJpbGl0eShFeHRlbnNpYmlsaXR5KQorICB7CisgIH0KKworICBFbnVtRXh0ZW5zaWJpbGl0eUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgS2luZCBnZXRFeHRlbnNpYmlsaXR5KCkgY29uc3QgeworICAgIHJldHVybiBleHRlbnNpYmlsaXR5OworICB9CisKKyAgc3RhdGljIGJvb2wgQ29udmVydFN0clRvS2luZChTdHJpbmdSZWYgVmFsLCBLaW5kICZPdXQpIHsKKyAgICBPcHRpb25hbDxLaW5kPiBSID0gbGx2bTo6U3RyaW5nU3dpdGNoPE9wdGlvbmFsPEtpbmQ+PihWYWwpCisgICAgICAuQ2FzZSgiY2xvc2VkIiwgRW51bUV4dGVuc2liaWxpdHlBdHRyOjpDbG9zZWQpCisgICAgICAuQ2FzZSgib3BlbiIsIEVudW1FeHRlbnNpYmlsaXR5QXR0cjo6T3BlbikKKyAgICAgIC5EZWZhdWx0KE9wdGlvbmFsPEtpbmQ+KCkpOworICAgIGlmIChSKSB7CisgICAgICBPdXQgPSAqUjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGF0aWMgY29uc3QgY2hhciAqQ29udmVydEtpbmRUb1N0cihLaW5kIFZhbCkgeworICAgIHN3aXRjaChWYWwpIHsKKyAgICBjYXNlIEVudW1FeHRlbnNpYmlsaXR5QXR0cjo6Q2xvc2VkOiByZXR1cm4gImNsb3NlZCI7CisgICAgY2FzZSBFbnVtRXh0ZW5zaWJpbGl0eUF0dHI6Ok9wZW46IHJldHVybiAib3BlbiI7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIk5vIGVudW1lcmF0b3Igd2l0aCB0aGF0IHZhbHVlIik7CisgIH0KKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkVudW1FeHRlbnNpYmlsaXR5OyB9Cit9OworCitjbGFzcyBFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb25BdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitFeHByICogc3VjY2Vzc1ZhbHVlOworCisgIHVuc2lnbmVkIGFyZ3NfU2l6ZTsKKyAgRXhwciAqICphcmdzXzsKKworcHVibGljOgorICBzdGF0aWMgRXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBFeHByICogU3VjY2Vzc1ZhbHVlLCBFeHByICogKkFyZ3MsIHVuc2lnbmVkIEFyZ3NTaXplLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb25BdHRyKExvYywgQ3R4LCBTdWNjZXNzVmFsdWUsIEFyZ3MsIEFyZ3NTaXplLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIEV4Y2x1c2l2ZVRyeWxvY2tGdW5jdGlvbkF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgRXhwciAqIFN1Y2Nlc3NWYWx1ZQorICAgICAgICAgICAgICAsIEV4cHIgKiAqQXJncywgdW5zaWduZWQgQXJnc1NpemUKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb24sIFIsIFNJLCB0cnVlLCB0cnVlKQorICAgICAgICAgICAgICAsIHN1Y2Nlc3NWYWx1ZShTdWNjZXNzVmFsdWUpCisgICAgICAgICAgICAgICwgYXJnc19TaXplKEFyZ3NTaXplKSwgYXJnc18obmV3IChDdHgsIDE2KSBFeHByICpbYXJnc19TaXplXSkKKyAgeworICAgIHN0ZDo6Y29weShBcmdzLCBBcmdzICsgYXJnc19TaXplLCBhcmdzXyk7CisgIH0KKworICBFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb25BdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIEV4cHIgKiBTdWNjZXNzVmFsdWUKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb24sIFIsIFNJLCB0cnVlLCB0cnVlKQorICAgICAgICAgICAgICAsIHN1Y2Nlc3NWYWx1ZShTdWNjZXNzVmFsdWUpCisgICAgICAgICAgICAgICwgYXJnc19TaXplKDApLCBhcmdzXyhudWxscHRyKQorICB7CisgIH0KKworICBFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb25BdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIEV4cHIgKiBnZXRTdWNjZXNzVmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN1Y2Nlc3NWYWx1ZTsKKyAgfQorCisgIHR5cGVkZWYgRXhwciAqKiBhcmdzX2l0ZXJhdG9yOworICBhcmdzX2l0ZXJhdG9yIGFyZ3NfYmVnaW4oKSBjb25zdCB7IHJldHVybiBhcmdzXzsgfQorICBhcmdzX2l0ZXJhdG9yIGFyZ3NfZW5kKCkgY29uc3QgeyByZXR1cm4gYXJnc18gKyBhcmdzX1NpemU7IH0KKyAgdW5zaWduZWQgYXJnc19zaXplKCkgY29uc3QgeyByZXR1cm4gYXJnc19TaXplOyB9CisgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGFyZ3NfaXRlcmF0b3I+IGFyZ3MoKSBjb25zdCB7IHJldHVybiBsbHZtOjptYWtlX3JhbmdlKGFyZ3NfYmVnaW4oKSwgYXJnc19lbmQoKSk7IH0KKworCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb247IH0KK307CisKK2NsYXNzIEV4dGVybmFsU291cmNlU3ltYm9sQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgewordW5zaWduZWQgbGFuZ3VhZ2VMZW5ndGg7CitjaGFyICpsYW5ndWFnZTsKKwordW5zaWduZWQgZGVmaW5lZEluTGVuZ3RoOworY2hhciAqZGVmaW5lZEluOworCitib29sIGdlbmVyYXRlZERlY2xhcmF0aW9uOworCitwdWJsaWM6CisgIHN0YXRpYyBFeHRlcm5hbFNvdXJjZVN5bWJvbEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgbGx2bTo6U3RyaW5nUmVmIExhbmd1YWdlLCBsbHZtOjpTdHJpbmdSZWYgRGVmaW5lZEluLCBib29sIEdlbmVyYXRlZERlY2xhcmF0aW9uLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBFeHRlcm5hbFNvdXJjZVN5bWJvbEF0dHIoTG9jLCBDdHgsIExhbmd1YWdlLCBEZWZpbmVkSW4sIEdlbmVyYXRlZERlY2xhcmF0aW9uLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIEV4dGVybmFsU291cmNlU3ltYm9sQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBsbHZtOjpTdHJpbmdSZWYgTGFuZ3VhZ2UKKyAgICAgICAgICAgICAgLCBsbHZtOjpTdHJpbmdSZWYgRGVmaW5lZEluCisgICAgICAgICAgICAgICwgYm9vbCBHZW5lcmF0ZWREZWNsYXJhdGlvbgorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkV4dGVybmFsU291cmNlU3ltYm9sLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIGxhbmd1YWdlTGVuZ3RoKExhbmd1YWdlLnNpemUoKSksbGFuZ3VhZ2UobmV3IChDdHgsIDEpIGNoYXJbbGFuZ3VhZ2VMZW5ndGhdKQorICAgICAgICAgICAgICAsIGRlZmluZWRJbkxlbmd0aChEZWZpbmVkSW4uc2l6ZSgpKSxkZWZpbmVkSW4obmV3IChDdHgsIDEpIGNoYXJbZGVmaW5lZEluTGVuZ3RoXSkKKyAgICAgICAgICAgICAgLCBnZW5lcmF0ZWREZWNsYXJhdGlvbihHZW5lcmF0ZWREZWNsYXJhdGlvbikKKyAgeworICAgICAgaWYgKCFMYW5ndWFnZS5lbXB0eSgpKQorICAgICAgICBzdGQ6Om1lbWNweShsYW5ndWFnZSwgTGFuZ3VhZ2UuZGF0YSgpLCBsYW5ndWFnZUxlbmd0aCk7CisgICAgICBpZiAoIURlZmluZWRJbi5lbXB0eSgpKQorICAgICAgICBzdGQ6Om1lbWNweShkZWZpbmVkSW4sIERlZmluZWRJbi5kYXRhKCksIGRlZmluZWRJbkxlbmd0aCk7CisgIH0KKworICBFeHRlcm5hbFNvdXJjZVN5bWJvbEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6RXh0ZXJuYWxTb3VyY2VTeW1ib2wsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgbGFuZ3VhZ2VMZW5ndGgoMCksbGFuZ3VhZ2UobnVsbHB0cikKKyAgICAgICAgICAgICAgLCBkZWZpbmVkSW5MZW5ndGgoMCksZGVmaW5lZEluKG51bGxwdHIpCisgICAgICAgICAgICAgICwgZ2VuZXJhdGVkRGVjbGFyYXRpb24oKQorICB7CisgIH0KKworICBFeHRlcm5hbFNvdXJjZVN5bWJvbEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgbGx2bTo6U3RyaW5nUmVmIGdldExhbmd1YWdlKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjpTdHJpbmdSZWYobGFuZ3VhZ2UsIGxhbmd1YWdlTGVuZ3RoKTsKKyAgfQorICB1bnNpZ25lZCBnZXRMYW5ndWFnZUxlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbGFuZ3VhZ2VMZW5ndGg7CisgIH0KKyAgdm9pZCBzZXRMYW5ndWFnZShBU1RDb250ZXh0ICZDLCBsbHZtOjpTdHJpbmdSZWYgUykgeworICAgIGxhbmd1YWdlTGVuZ3RoID0gUy5zaXplKCk7CisgICAgdGhpcy0+bGFuZ3VhZ2UgPSBuZXcgKEMsIDEpIGNoYXIgW2xhbmd1YWdlTGVuZ3RoXTsKKyAgICBpZiAoIVMuZW1wdHkoKSkKKyAgICAgIHN0ZDo6bWVtY3B5KHRoaXMtPmxhbmd1YWdlLCBTLmRhdGEoKSwgbGFuZ3VhZ2VMZW5ndGgpOworICB9CisKKyAgbGx2bTo6U3RyaW5nUmVmIGdldERlZmluZWRJbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6U3RyaW5nUmVmKGRlZmluZWRJbiwgZGVmaW5lZEluTGVuZ3RoKTsKKyAgfQorICB1bnNpZ25lZCBnZXREZWZpbmVkSW5MZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIGRlZmluZWRJbkxlbmd0aDsKKyAgfQorICB2b2lkIHNldERlZmluZWRJbihBU1RDb250ZXh0ICZDLCBsbHZtOjpTdHJpbmdSZWYgUykgeworICAgIGRlZmluZWRJbkxlbmd0aCA9IFMuc2l6ZSgpOworICAgIHRoaXMtPmRlZmluZWRJbiA9IG5ldyAoQywgMSkgY2hhciBbZGVmaW5lZEluTGVuZ3RoXTsKKyAgICBpZiAoIVMuZW1wdHkoKSkKKyAgICAgIHN0ZDo6bWVtY3B5KHRoaXMtPmRlZmluZWRJbiwgUy5kYXRhKCksIGRlZmluZWRJbkxlbmd0aCk7CisgIH0KKworICBib29sIGdldEdlbmVyYXRlZERlY2xhcmF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBnZW5lcmF0ZWREZWNsYXJhdGlvbjsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpFeHRlcm5hbFNvdXJjZVN5bWJvbDsgfQorfTsKKworY2xhc3MgRmFsbFRocm91Z2hBdHRyIDogcHVibGljIFN0bXRBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIEZhbGxUaHJvdWdoQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBGYWxsVGhyb3VnaEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgRmFsbFRocm91Z2hBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogU3RtdEF0dHIoYXR0cjo6RmFsbFRocm91Z2gsIFIsIFNJLCBmYWxzZSkKKyAgeworICB9CisKKyAgRmFsbFRocm91Z2hBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpGYWxsVGhyb3VnaDsgfQorfTsKKworY2xhc3MgRmFzdENhbGxBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBGYXN0Q2FsbEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgRmFzdENhbGxBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIEZhc3RDYWxsQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpGYXN0Q2FsbCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgRmFzdENhbGxBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpGYXN0Q2FsbDsgfQorfTsKKworY2xhc3MgRmluYWxBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIGVudW0gU3BlbGxpbmcgeworICAgIEtleXdvcmRfZmluYWwgPSAwLAorICAgIEtleXdvcmRfc2VhbGVkID0gMQorICB9OworCisgIHN0YXRpYyBGaW5hbEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU3BlbGxpbmcgUywgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgRmluYWxBdHRyKExvYywgQ3R4LCBTKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIEZpbmFsQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpGaW5hbCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgRmluYWxBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIFNwZWxsaW5nIGdldFNlbWFudGljU3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHNwZWxsaW5nIGxpc3QgaW5kZXgiKTsKKyAgICBjYXNlIDA6IHJldHVybiBLZXl3b3JkX2ZpbmFsOworICAgIGNhc2UgMTogcmV0dXJuIEtleXdvcmRfc2VhbGVkOworICB9CisgIH0KKyAgYm9vbCBpc1NwZWxsZWRBc1NlYWxlZCgpIGNvbnN0IHsgcmV0dXJuIFNwZWxsaW5nTGlzdEluZGV4ID09IDE7IH0KKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkZpbmFsOyB9Cit9OworCitjbGFzcyBGbGFnRW51bUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIEZsYWdFbnVtQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBGbGFnRW51bUF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgRmxhZ0VudW1BdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkZsYWdFbnVtLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBGbGFnRW51bUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkZsYWdFbnVtOyB9Cit9OworCitjbGFzcyBGbGF0dGVuQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgRmxhdHRlbkF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgRmxhdHRlbkF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgRmxhdHRlbkF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6RmxhdHRlbiwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgRmxhdHRlbkF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkZsYXR0ZW47IH0KK307CisKK2NsYXNzIEZvcm1hdEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK0lkZW50aWZpZXJJbmZvICogdHlwZTsKKworaW50IGZvcm1hdElkeDsKKworaW50IGZpcnN0QXJnOworCitwdWJsaWM6CisgIHN0YXRpYyBGb3JtYXRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIElkZW50aWZpZXJJbmZvICogVHlwZSwgaW50IEZvcm1hdElkeCwgaW50IEZpcnN0QXJnLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBGb3JtYXRBdHRyKExvYywgQ3R4LCBUeXBlLCBGb3JtYXRJZHgsIEZpcnN0QXJnLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIEZvcm1hdEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgSWRlbnRpZmllckluZm8gKiBUeXBlCisgICAgICAgICAgICAgICwgaW50IEZvcm1hdElkeAorICAgICAgICAgICAgICAsIGludCBGaXJzdEFyZworICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkZvcm1hdCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCB0eXBlKFR5cGUpCisgICAgICAgICAgICAgICwgZm9ybWF0SWR4KEZvcm1hdElkeCkKKyAgICAgICAgICAgICAgLCBmaXJzdEFyZyhGaXJzdEFyZykKKyAgeworICB9CisKKyAgRm9ybWF0QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBJZGVudGlmaWVySW5mbyAqIGdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGU7CisgIH0KKworICBpbnQgZ2V0Rm9ybWF0SWR4KCkgY29uc3QgeworICAgIHJldHVybiBmb3JtYXRJZHg7CisgIH0KKworICBpbnQgZ2V0Rmlyc3RBcmcoKSBjb25zdCB7CisgICAgcmV0dXJuIGZpcnN0QXJnOworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkZvcm1hdDsgfQorfTsKKworY2xhc3MgRm9ybWF0QXJnQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworUGFyYW1JZHggZm9ybWF0SWR4OworCitwdWJsaWM6CisgIHN0YXRpYyBGb3JtYXRBcmdBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFBhcmFtSWR4IEZvcm1hdElkeCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgRm9ybWF0QXJnQXR0cihMb2MsIEN0eCwgRm9ybWF0SWR4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIEZvcm1hdEFyZ0F0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgUGFyYW1JZHggRm9ybWF0SWR4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6Rm9ybWF0QXJnLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIGZvcm1hdElkeChGb3JtYXRJZHgpCisgIHsKKyAgfQorCisgIEZvcm1hdEFyZ0F0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgUGFyYW1JZHggZ2V0Rm9ybWF0SWR4KCkgY29uc3QgeworICAgIHJldHVybiBmb3JtYXRJZHg7CisgIH0KKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6Rm9ybWF0QXJnOyB9Cit9OworCitjbGFzcyBHTlVJbmxpbmVBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBHTlVJbmxpbmVBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIEdOVUlubGluZUF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgR05VSW5saW5lQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpHTlVJbmxpbmUsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIEdOVUlubGluZUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkdOVUlubGluZTsgfQorfTsKKworY2xhc3MgR3VhcmRlZEJ5QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworRXhwciAqIGFyZzsKKworcHVibGljOgorICBzdGF0aWMgR3VhcmRlZEJ5QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBFeHByICogQXJnLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBHdWFyZGVkQnlBdHRyKExvYywgQ3R4LCBBcmcsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgR3VhcmRlZEJ5QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBFeHByICogQXJnCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6R3VhcmRlZEJ5LCBSLCBTSSwgdHJ1ZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgLCBhcmcoQXJnKQorICB7CisgIH0KKworICBHdWFyZGVkQnlBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIEV4cHIgKiBnZXRBcmcoKSBjb25zdCB7CisgICAgcmV0dXJuIGFyZzsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpHdWFyZGVkQnk7IH0KK307CisKK2NsYXNzIEd1YXJkZWRWYXJBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBHdWFyZGVkVmFyQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBHdWFyZGVkVmFyQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBHdWFyZGVkVmFyQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpHdWFyZGVkVmFyLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBHdWFyZGVkVmFyQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6R3VhcmRlZFZhcjsgfQorfTsKKworY2xhc3MgSG90QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgSG90QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBIb3RBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIEhvdEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6SG90LCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBIb3RBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpIb3Q7IH0KK307CisKK2NsYXNzIElCQWN0aW9uQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgSUJBY3Rpb25BdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIElCQWN0aW9uQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBJQkFjdGlvbkF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6SUJBY3Rpb24sIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIElCQWN0aW9uQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6SUJBY3Rpb247IH0KK307CisKK2NsYXNzIElCT3V0bGV0QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgSUJPdXRsZXRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIElCT3V0bGV0QXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBJQk91dGxldEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6SUJPdXRsZXQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIElCT3V0bGV0QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6SUJPdXRsZXQ7IH0KK307CisKK2NsYXNzIElCT3V0bGV0Q29sbGVjdGlvbkF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK1R5cGVTb3VyY2VJbmZvICogaW50ZXJmYWNlXzsKKworcHVibGljOgorICBzdGF0aWMgSUJPdXRsZXRDb2xsZWN0aW9uQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBUeXBlU291cmNlSW5mbyAqIEludGVyZmFjZSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgSUJPdXRsZXRDb2xsZWN0aW9uQXR0cihMb2MsIEN0eCwgSW50ZXJmYWNlLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIElCT3V0bGV0Q29sbGVjdGlvbkF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgVHlwZVNvdXJjZUluZm8gKiBJbnRlcmZhY2UKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpJQk91dGxldENvbGxlY3Rpb24sIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgaW50ZXJmYWNlXyhJbnRlcmZhY2UpCisgIHsKKyAgfQorCisgIElCT3V0bGV0Q29sbGVjdGlvbkF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6SUJPdXRsZXRDb2xsZWN0aW9uLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIGludGVyZmFjZV8oKQorICB7CisgIH0KKworICBJQk91dGxldENvbGxlY3Rpb25BdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIFF1YWxUeXBlIGdldEludGVyZmFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJmYWNlXy0+Z2V0VHlwZSgpOworICB9ICBUeXBlU291cmNlSW5mbyAqIGdldEludGVyZmFjZUxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJmYWNlXzsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpJQk91dGxldENvbGxlY3Rpb247IH0KK307CisKK2NsYXNzIElGdW5jQXR0ciA6IHB1YmxpYyBBdHRyIHsKK3Vuc2lnbmVkIHJlc29sdmVyTGVuZ3RoOworY2hhciAqcmVzb2x2ZXI7CisKK3B1YmxpYzoKKyAgc3RhdGljIElGdW5jQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBsbHZtOjpTdHJpbmdSZWYgUmVzb2x2ZXIsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIElGdW5jQXR0cihMb2MsIEN0eCwgUmVzb2x2ZXIsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgSUZ1bmNBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIGxsdm06OlN0cmluZ1JlZiBSZXNvbHZlcgorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogQXR0cihhdHRyOjpJRnVuYywgUiwgU0ksIGZhbHNlKQorICAgICAgICAgICAgICAsIHJlc29sdmVyTGVuZ3RoKFJlc29sdmVyLnNpemUoKSkscmVzb2x2ZXIobmV3IChDdHgsIDEpIGNoYXJbcmVzb2x2ZXJMZW5ndGhdKQorICB7CisgICAgICBpZiAoIVJlc29sdmVyLmVtcHR5KCkpCisgICAgICAgIHN0ZDo6bWVtY3B5KHJlc29sdmVyLCBSZXNvbHZlci5kYXRhKCksIHJlc29sdmVyTGVuZ3RoKTsKKyAgfQorCisgIElGdW5jQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBsbHZtOjpTdHJpbmdSZWYgZ2V0UmVzb2x2ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06OlN0cmluZ1JlZihyZXNvbHZlciwgcmVzb2x2ZXJMZW5ndGgpOworICB9CisgIHVuc2lnbmVkIGdldFJlc29sdmVyTGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiByZXNvbHZlckxlbmd0aDsKKyAgfQorICB2b2lkIHNldFJlc29sdmVyKEFTVENvbnRleHQgJkMsIGxsdm06OlN0cmluZ1JlZiBTKSB7CisgICAgcmVzb2x2ZXJMZW5ndGggPSBTLnNpemUoKTsKKyAgICB0aGlzLT5yZXNvbHZlciA9IG5ldyAoQywgMSkgY2hhciBbcmVzb2x2ZXJMZW5ndGhdOworICAgIGlmICghUy5lbXB0eSgpKQorICAgICAgc3RkOjptZW1jcHkodGhpcy0+cmVzb2x2ZXIsIFMuZGF0YSgpLCByZXNvbHZlckxlbmd0aCk7CisgIH0KKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6SUZ1bmM7IH0KK307CisKK2NsYXNzIEluaXRQcmlvcml0eUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3Vuc2lnbmVkIHByaW9yaXR5OworCitwdWJsaWM6CisgIHN0YXRpYyBJbml0UHJpb3JpdHlBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIHVuc2lnbmVkIFByaW9yaXR5LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBJbml0UHJpb3JpdHlBdHRyKExvYywgQ3R4LCBQcmlvcml0eSwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBJbml0UHJpb3JpdHlBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFByaW9yaXR5CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6SW5pdFByaW9yaXR5LCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIHByaW9yaXR5KFByaW9yaXR5KQorICB7CisgIH0KKworICBJbml0UHJpb3JpdHlBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIHVuc2lnbmVkIGdldFByaW9yaXR5KCkgY29uc3QgeworICAgIHJldHVybiBwcmlvcml0eTsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpJbml0UHJpb3JpdHk7IH0KK307CisKK2NsYXNzIEluaXRTZWdBdHRyIDogcHVibGljIEF0dHIgewordW5zaWduZWQgc2VjdGlvbkxlbmd0aDsKK2NoYXIgKnNlY3Rpb247CisKK3B1YmxpYzoKKyAgc3RhdGljIEluaXRTZWdBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIGxsdm06OlN0cmluZ1JlZiBTZWN0aW9uLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBJbml0U2VnQXR0cihMb2MsIEN0eCwgU2VjdGlvbiwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBJbml0U2VnQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBsbHZtOjpTdHJpbmdSZWYgU2VjdGlvbgorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogQXR0cihhdHRyOjpJbml0U2VnLCBSLCBTSSwgZmFsc2UpCisgICAgICAgICAgICAgICwgc2VjdGlvbkxlbmd0aChTZWN0aW9uLnNpemUoKSksc2VjdGlvbihuZXcgKEN0eCwgMSkgY2hhcltzZWN0aW9uTGVuZ3RoXSkKKyAgeworICAgICAgaWYgKCFTZWN0aW9uLmVtcHR5KCkpCisgICAgICAgIHN0ZDo6bWVtY3B5KHNlY3Rpb24sIFNlY3Rpb24uZGF0YSgpLCBzZWN0aW9uTGVuZ3RoKTsKKyAgfQorCisgIEluaXRTZWdBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIGxsdm06OlN0cmluZ1JlZiBnZXRTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjpTdHJpbmdSZWYoc2VjdGlvbiwgc2VjdGlvbkxlbmd0aCk7CisgIH0KKyAgdW5zaWduZWQgZ2V0U2VjdGlvbkxlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc2VjdGlvbkxlbmd0aDsKKyAgfQorICB2b2lkIHNldFNlY3Rpb24oQVNUQ29udGV4dCAmQywgbGx2bTo6U3RyaW5nUmVmIFMpIHsKKyAgICBzZWN0aW9uTGVuZ3RoID0gUy5zaXplKCk7CisgICAgdGhpcy0+c2VjdGlvbiA9IG5ldyAoQywgMSkgY2hhciBbc2VjdGlvbkxlbmd0aF07CisgICAgaWYgKCFTLmVtcHR5KCkpCisgICAgICBzdGQ6Om1lbWNweSh0aGlzLT5zZWN0aW9uLCBTLmRhdGEoKSwgc2VjdGlvbkxlbmd0aCk7CisgIH0KKworCisgIHZvaWQgcHJpbnRQcmV0dHlQcmFnbWEocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgICAgT1MgPDwgIiAoIiA8PCBnZXRTZWN0aW9uKCkgPDwgJyknOworICB9CisgIAorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkluaXRTZWc7IH0KK307CisKK2NsYXNzIEludGVsT2NsQmljY0F0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIEludGVsT2NsQmljY0F0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgSW50ZWxPY2xCaWNjQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBJbnRlbE9jbEJpY2NBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkludGVsT2NsQmljYywgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgSW50ZWxPY2xCaWNjQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6SW50ZWxPY2xCaWNjOyB9Cit9OworCitjbGFzcyBJbnRlcm5hbExpbmthZ2VBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBJbnRlcm5hbExpbmthZ2VBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIEludGVybmFsTGlua2FnZUF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgSW50ZXJuYWxMaW5rYWdlQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpJbnRlcm5hbExpbmthZ2UsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIEludGVybmFsTGlua2FnZUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkludGVybmFsTGlua2FnZTsgfQorfTsKKworY2xhc3MgTFRPVmlzaWJpbGl0eVB1YmxpY0F0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIExUT1Zpc2liaWxpdHlQdWJsaWNBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIExUT1Zpc2liaWxpdHlQdWJsaWNBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIExUT1Zpc2liaWxpdHlQdWJsaWNBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkxUT1Zpc2liaWxpdHlQdWJsaWMsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIExUT1Zpc2liaWxpdHlQdWJsaWNBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpMVE9WaXNpYmlsaXR5UHVibGljOyB9Cit9OworCitjbGFzcyBMYXlvdXRWZXJzaW9uQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgewordW5zaWduZWQgdmVyc2lvbjsKKworcHVibGljOgorICBzdGF0aWMgTGF5b3V0VmVyc2lvbkF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgdW5zaWduZWQgVmVyc2lvbiwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTGF5b3V0VmVyc2lvbkF0dHIoTG9jLCBDdHgsIFZlcnNpb24sIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgTGF5b3V0VmVyc2lvbkF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgVmVyc2lvbgorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkxheW91dFZlcnNpb24sIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgdmVyc2lvbihWZXJzaW9uKQorICB7CisgIH0KKworICBMYXlvdXRWZXJzaW9uQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICB1bnNpZ25lZCBnZXRWZXJzaW9uKCkgY29uc3QgeworICAgIHJldHVybiB2ZXJzaW9uOworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkxheW91dFZlcnNpb247IH0KK307CisKK2NsYXNzIExvY2tSZXR1cm5lZEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK0V4cHIgKiBhcmc7CisKK3B1YmxpYzoKKyAgc3RhdGljIExvY2tSZXR1cm5lZEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgRXhwciAqIEFyZywgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTG9ja1JldHVybmVkQXR0cihMb2MsIEN0eCwgQXJnLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIExvY2tSZXR1cm5lZEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgRXhwciAqIEFyZworICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkxvY2tSZXR1cm5lZCwgUiwgU0ksIHRydWUsIGZhbHNlKQorICAgICAgICAgICAgICAsIGFyZyhBcmcpCisgIHsKKyAgfQorCisgIExvY2tSZXR1cm5lZEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgRXhwciAqIGdldEFyZygpIGNvbnN0IHsKKyAgICByZXR1cm4gYXJnOworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OkxvY2tSZXR1cm5lZDsgfQorfTsKKworY2xhc3MgTG9ja3NFeGNsdWRlZEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKKyAgdW5zaWduZWQgYXJnc19TaXplOworICBFeHByICogKmFyZ3NfOworCitwdWJsaWM6CisgIHN0YXRpYyBMb2Nrc0V4Y2x1ZGVkQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBFeHByICogKkFyZ3MsIHVuc2lnbmVkIEFyZ3NTaXplLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBMb2Nrc0V4Y2x1ZGVkQXR0cihMb2MsIEN0eCwgQXJncywgQXJnc1NpemUsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgTG9ja3NFeGNsdWRlZEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgRXhwciAqICpBcmdzLCB1bnNpZ25lZCBBcmdzU2l6ZQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OkxvY2tzRXhjbHVkZWQsIFIsIFNJLCB0cnVlLCB0cnVlKQorICAgICAgICAgICAgICAsIGFyZ3NfU2l6ZShBcmdzU2l6ZSksIGFyZ3NfKG5ldyAoQ3R4LCAxNikgRXhwciAqW2FyZ3NfU2l6ZV0pCisgIHsKKyAgICBzdGQ6OmNvcHkoQXJncywgQXJncyArIGFyZ3NfU2l6ZSwgYXJnc18pOworICB9CisKKyAgTG9ja3NFeGNsdWRlZEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6TG9ja3NFeGNsdWRlZCwgUiwgU0ksIHRydWUsIHRydWUpCisgICAgICAgICAgICAgICwgYXJnc19TaXplKDApLCBhcmdzXyhudWxscHRyKQorICB7CisgIH0KKworICBMb2Nrc0V4Y2x1ZGVkQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICB0eXBlZGVmIEV4cHIgKiogYXJnc19pdGVyYXRvcjsKKyAgYXJnc19pdGVyYXRvciBhcmdzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gYXJnc187IH0KKyAgYXJnc19pdGVyYXRvciBhcmdzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGFyZ3NfICsgYXJnc19TaXplOyB9CisgIHVuc2lnbmVkIGFyZ3Nfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGFyZ3NfU2l6ZTsgfQorICBsbHZtOjppdGVyYXRvcl9yYW5nZTxhcmdzX2l0ZXJhdG9yPiBhcmdzKCkgY29uc3QgeyByZXR1cm4gbGx2bTo6bWFrZV9yYW5nZShhcmdzX2JlZ2luKCksIGFyZ3NfZW5kKCkpOyB9CisKKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6TG9ja3NFeGNsdWRlZDsgfQorfTsKKworY2xhc3MgTG9vcEhpbnRBdHRyIDogcHVibGljIEF0dHIgeworcHVibGljOgorICBlbnVtIE9wdGlvblR5cGUgeworICAgIFZlY3Rvcml6ZSwKKyAgICBWZWN0b3JpemVXaWR0aCwKKyAgICBJbnRlcmxlYXZlLAorICAgIEludGVybGVhdmVDb3VudCwKKyAgICBVbnJvbGwsCisgICAgVW5yb2xsQ291bnQsCisgICAgRGlzdHJpYnV0ZQorICB9OworcHJpdmF0ZToKKyAgT3B0aW9uVHlwZSBvcHRpb247CisKK3B1YmxpYzoKKyAgZW51bSBMb29wSGludFN0YXRlIHsKKyAgICBFbmFibGUsCisgICAgRGlzYWJsZSwKKyAgICBOdW1lcmljLAorICAgIEFzc3VtZVNhZmV0eSwKKyAgICBGdWxsCisgIH07Citwcml2YXRlOgorICBMb29wSGludFN0YXRlIHN0YXRlOworCitFeHByICogdmFsdWU7CisKK3B1YmxpYzoKKyAgZW51bSBTcGVsbGluZyB7CisgICAgUHJhZ21hX2NsYW5nX2xvb3AgPSAwLAorICAgIFByYWdtYV91bnJvbGwgPSAxLAorICAgIFByYWdtYV9ub3Vucm9sbCA9IDIKKyAgfTsKKworICBzdGF0aWMgTG9vcEhpbnRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNwZWxsaW5nIFMsIE9wdGlvblR5cGUgT3B0aW9uLCBMb29wSGludFN0YXRlIFN0YXRlLCBFeHByICogVmFsdWUsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIExvb3BIaW50QXR0cihMb2MsIEN0eCwgT3B0aW9uLCBTdGF0ZSwgVmFsdWUsIFMpOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgTG9vcEhpbnRBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIE9wdGlvblR5cGUgT3B0aW9uCisgICAgICAgICAgICAgICwgTG9vcEhpbnRTdGF0ZSBTdGF0ZQorICAgICAgICAgICAgICAsIEV4cHIgKiBWYWx1ZQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogQXR0cihhdHRyOjpMb29wSGludCwgUiwgU0ksIGZhbHNlKQorICAgICAgICAgICAgICAsIG9wdGlvbihPcHRpb24pCisgICAgICAgICAgICAgICwgc3RhdGUoU3RhdGUpCisgICAgICAgICAgICAgICwgdmFsdWUoVmFsdWUpCisgIHsKKyAgfQorCisgIExvb3BIaW50QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBTcGVsbGluZyBnZXRTZW1hbnRpY1NwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzcGVsbGluZyBsaXN0IGluZGV4Iik7CisgICAgY2FzZSAwOiByZXR1cm4gUHJhZ21hX2NsYW5nX2xvb3A7CisgICAgY2FzZSAxOiByZXR1cm4gUHJhZ21hX3Vucm9sbDsKKyAgICBjYXNlIDI6IHJldHVybiBQcmFnbWFfbm91bnJvbGw7CisgIH0KKyAgfQorICBPcHRpb25UeXBlIGdldE9wdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gb3B0aW9uOworICB9CisKKyAgc3RhdGljIGJvb2wgQ29udmVydFN0clRvT3B0aW9uVHlwZShTdHJpbmdSZWYgVmFsLCBPcHRpb25UeXBlICZPdXQpIHsKKyAgICBPcHRpb25hbDxPcHRpb25UeXBlPiBSID0gbGx2bTo6U3RyaW5nU3dpdGNoPE9wdGlvbmFsPE9wdGlvblR5cGU+PihWYWwpCisgICAgICAuQ2FzZSgidmVjdG9yaXplIiwgTG9vcEhpbnRBdHRyOjpWZWN0b3JpemUpCisgICAgICAuQ2FzZSgidmVjdG9yaXplX3dpZHRoIiwgTG9vcEhpbnRBdHRyOjpWZWN0b3JpemVXaWR0aCkKKyAgICAgIC5DYXNlKCJpbnRlcmxlYXZlIiwgTG9vcEhpbnRBdHRyOjpJbnRlcmxlYXZlKQorICAgICAgLkNhc2UoImludGVybGVhdmVfY291bnQiLCBMb29wSGludEF0dHI6OkludGVybGVhdmVDb3VudCkKKyAgICAgIC5DYXNlKCJ1bnJvbGwiLCBMb29wSGludEF0dHI6OlVucm9sbCkKKyAgICAgIC5DYXNlKCJ1bnJvbGxfY291bnQiLCBMb29wSGludEF0dHI6OlVucm9sbENvdW50KQorICAgICAgLkNhc2UoImRpc3RyaWJ1dGUiLCBMb29wSGludEF0dHI6OkRpc3RyaWJ1dGUpCisgICAgICAuRGVmYXVsdChPcHRpb25hbDxPcHRpb25UeXBlPigpKTsKKyAgICBpZiAoUikgeworICAgICAgT3V0ID0gKlI7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RhdGljIGNvbnN0IGNoYXIgKkNvbnZlcnRPcHRpb25UeXBlVG9TdHIoT3B0aW9uVHlwZSBWYWwpIHsKKyAgICBzd2l0Y2goVmFsKSB7CisgICAgY2FzZSBMb29wSGludEF0dHI6OlZlY3Rvcml6ZTogcmV0dXJuICJ2ZWN0b3JpemUiOworICAgIGNhc2UgTG9vcEhpbnRBdHRyOjpWZWN0b3JpemVXaWR0aDogcmV0dXJuICJ2ZWN0b3JpemVfd2lkdGgiOworICAgIGNhc2UgTG9vcEhpbnRBdHRyOjpJbnRlcmxlYXZlOiByZXR1cm4gImludGVybGVhdmUiOworICAgIGNhc2UgTG9vcEhpbnRBdHRyOjpJbnRlcmxlYXZlQ291bnQ6IHJldHVybiAiaW50ZXJsZWF2ZV9jb3VudCI7CisgICAgY2FzZSBMb29wSGludEF0dHI6OlVucm9sbDogcmV0dXJuICJ1bnJvbGwiOworICAgIGNhc2UgTG9vcEhpbnRBdHRyOjpVbnJvbGxDb3VudDogcmV0dXJuICJ1bnJvbGxfY291bnQiOworICAgIGNhc2UgTG9vcEhpbnRBdHRyOjpEaXN0cmlidXRlOiByZXR1cm4gImRpc3RyaWJ1dGUiOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJObyBlbnVtZXJhdG9yIHdpdGggdGhhdCB2YWx1ZSIpOworICB9CisgIExvb3BIaW50U3RhdGUgZ2V0U3RhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRlOworICB9CisKKyAgc3RhdGljIGJvb2wgQ29udmVydFN0clRvTG9vcEhpbnRTdGF0ZShTdHJpbmdSZWYgVmFsLCBMb29wSGludFN0YXRlICZPdXQpIHsKKyAgICBPcHRpb25hbDxMb29wSGludFN0YXRlPiBSID0gbGx2bTo6U3RyaW5nU3dpdGNoPE9wdGlvbmFsPExvb3BIaW50U3RhdGU+PihWYWwpCisgICAgICAuQ2FzZSgiZW5hYmxlIiwgTG9vcEhpbnRBdHRyOjpFbmFibGUpCisgICAgICAuQ2FzZSgiZGlzYWJsZSIsIExvb3BIaW50QXR0cjo6RGlzYWJsZSkKKyAgICAgIC5DYXNlKCJudW1lcmljIiwgTG9vcEhpbnRBdHRyOjpOdW1lcmljKQorICAgICAgLkNhc2UoImFzc3VtZV9zYWZldHkiLCBMb29wSGludEF0dHI6OkFzc3VtZVNhZmV0eSkKKyAgICAgIC5DYXNlKCJmdWxsIiwgTG9vcEhpbnRBdHRyOjpGdWxsKQorICAgICAgLkRlZmF1bHQoT3B0aW9uYWw8TG9vcEhpbnRTdGF0ZT4oKSk7CisgICAgaWYgKFIpIHsKKyAgICAgIE91dCA9ICpSOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBjaGFyICpDb252ZXJ0TG9vcEhpbnRTdGF0ZVRvU3RyKExvb3BIaW50U3RhdGUgVmFsKSB7CisgICAgc3dpdGNoKFZhbCkgeworICAgIGNhc2UgTG9vcEhpbnRBdHRyOjpFbmFibGU6IHJldHVybiAiZW5hYmxlIjsKKyAgICBjYXNlIExvb3BIaW50QXR0cjo6RGlzYWJsZTogcmV0dXJuICJkaXNhYmxlIjsKKyAgICBjYXNlIExvb3BIaW50QXR0cjo6TnVtZXJpYzogcmV0dXJuICJudW1lcmljIjsKKyAgICBjYXNlIExvb3BIaW50QXR0cjo6QXNzdW1lU2FmZXR5OiByZXR1cm4gImFzc3VtZV9zYWZldHkiOworICAgIGNhc2UgTG9vcEhpbnRBdHRyOjpGdWxsOiByZXR1cm4gImZ1bGwiOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJObyBlbnVtZXJhdG9yIHdpdGggdGhhdCB2YWx1ZSIpOworICB9CisgIEV4cHIgKiBnZXRWYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworCisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRPcHRpb25OYW1lKGludCBPcHRpb24pIHsKKyAgICBzd2l0Y2goT3B0aW9uKSB7CisgICAgY2FzZSBWZWN0b3JpemU6IHJldHVybiAidmVjdG9yaXplIjsKKyAgICBjYXNlIFZlY3Rvcml6ZVdpZHRoOiByZXR1cm4gInZlY3Rvcml6ZV93aWR0aCI7CisgICAgY2FzZSBJbnRlcmxlYXZlOiByZXR1cm4gImludGVybGVhdmUiOworICAgIGNhc2UgSW50ZXJsZWF2ZUNvdW50OiByZXR1cm4gImludGVybGVhdmVfY291bnQiOworICAgIGNhc2UgVW5yb2xsOiByZXR1cm4gInVucm9sbCI7CisgICAgY2FzZSBVbnJvbGxDb3VudDogcmV0dXJuICJ1bnJvbGxfY291bnQiOworICAgIGNhc2UgRGlzdHJpYnV0ZTogcmV0dXJuICJkaXN0cmlidXRlIjsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5oYW5kbGVkIExvb3BIaW50IG9wdGlvbi4iKTsKKyAgfQorCisgIHZvaWQgcHJpbnRQcmV0dHlQcmFnbWEocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgICAgdW5zaWduZWQgU3BlbGxpbmdJbmRleCA9IGdldFNwZWxsaW5nTGlzdEluZGV4KCk7CisgICAgLy8gRm9yICIjcHJhZ21hIHVucm9sbCIgYW5kICIjcHJhZ21hIG5vdW5yb2xsIiB0aGUgc3RyaW5nICJ1bnJvbGwiIG9yCisgICAgLy8gIm5vdW5yb2xsIiBpcyBhbHJlYWR5IGVtaXR0ZWQgYXMgdGhlIHByYWdtYSBuYW1lLgorICAgIGlmIChTcGVsbGluZ0luZGV4ID09IFByYWdtYV9ub3Vucm9sbCkKKyAgICAgIHJldHVybjsKKyAgICBlbHNlIGlmIChTcGVsbGluZ0luZGV4ID09IFByYWdtYV91bnJvbGwpIHsKKyAgICAgIE9TIDw8ICcgJyA8PCBnZXRWYWx1ZVN0cmluZyhQb2xpY3kpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFzc2VydChTcGVsbGluZ0luZGV4ID09IFByYWdtYV9jbGFuZ19sb29wICYmICJVbmV4cGVjdGVkIHNwZWxsaW5nIik7CisgICAgT1MgPDwgJyAnIDw8IGdldE9wdGlvbk5hbWUob3B0aW9uKSA8PCBnZXRWYWx1ZVN0cmluZyhQb2xpY3kpOworICB9CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGxvb3AgaGludCBhcmd1bWVudCBpbmNsdWRpbmcgdGhlCisgIC8vIGVuY2xvc2luZyBwYXJlbnRoZXNlcy4KKyAgc3RkOjpzdHJpbmcgZ2V0VmFsdWVTdHJpbmcoY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIFZhbHVlTmFtZTsKKyAgICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gT1MoVmFsdWVOYW1lKTsKKyAgICBPUyA8PCAiKCI7CisgICAgaWYgKHN0YXRlID09IE51bWVyaWMpCisgICAgICB2YWx1ZS0+cHJpbnRQcmV0dHkoT1MsIG51bGxwdHIsIFBvbGljeSk7CisgICAgZWxzZSBpZiAoc3RhdGUgPT0gRW5hYmxlKQorICAgICAgT1MgPDwgImVuYWJsZSI7CisgICAgZWxzZSBpZiAoc3RhdGUgPT0gRnVsbCkKKyAgICAgIE9TIDw8ICJmdWxsIjsKKyAgICBlbHNlIGlmIChzdGF0ZSA9PSBBc3N1bWVTYWZldHkpCisgICAgICBPUyA8PCAiYXNzdW1lX3NhZmV0eSI7CisgICAgZWxzZQorICAgICAgT1MgPDwgImRpc2FibGUiOworICAgIE9TIDw8ICIpIjsKKyAgICByZXR1cm4gT1Muc3RyKCk7CisgIH0KKworICAvLyBSZXR1cm4gYSBzdHJpbmcgc3VpdGFibGUgZm9yIGlkZW50aWZ5aW5nIHRoaXMgYXR0cmlidXRlIGluIGRpYWdub3N0aWNzLgorICBzdGQ6OnN0cmluZyBnZXREaWFnbm9zdGljTmFtZShjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgICAgdW5zaWduZWQgU3BlbGxpbmdJbmRleCA9IGdldFNwZWxsaW5nTGlzdEluZGV4KCk7CisgICAgaWYgKFNwZWxsaW5nSW5kZXggPT0gUHJhZ21hX25vdW5yb2xsKQorICAgICAgcmV0dXJuICIjcHJhZ21hIG5vdW5yb2xsIjsKKyAgICBlbHNlIGlmIChTcGVsbGluZ0luZGV4ID09IFByYWdtYV91bnJvbGwpCisgICAgICByZXR1cm4gIiNwcmFnbWEgdW5yb2xsIiArIChvcHRpb24gPT0gVW5yb2xsQ291bnQgPyBnZXRWYWx1ZVN0cmluZyhQb2xpY3kpIDogIiIpOworCisgICAgYXNzZXJ0KFNwZWxsaW5nSW5kZXggPT0gUHJhZ21hX2NsYW5nX2xvb3AgJiYgIlVuZXhwZWN0ZWQgc3BlbGxpbmciKTsKKyAgICByZXR1cm4gZ2V0T3B0aW9uTmFtZShvcHRpb24pICsgZ2V0VmFsdWVTdHJpbmcoUG9saWN5KTsKKyAgfQorICAKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpMb29wSGludDsgfQorfTsKKworY2xhc3MgTVNBQklBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBNU0FCSUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTVNBQklBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE1TQUJJQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpNU0FCSSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgTVNBQklBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpNU0FCSTsgfQorfTsKKworY2xhc3MgTVNJbmhlcml0YW5jZUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK2Jvb2wgYmVzdENhc2U7CisKK3B1YmxpYzoKKyAgZW51bSBTcGVsbGluZyB7CisgICAgS2V5d29yZF9zaW5nbGVfaW5oZXJpdGFuY2UgPSAwLAorICAgIEtleXdvcmRfbXVsdGlwbGVfaW5oZXJpdGFuY2UgPSAxLAorICAgIEtleXdvcmRfdmlydHVhbF9pbmhlcml0YW5jZSA9IDIsCisgICAgS2V5d29yZF91bnNwZWNpZmllZF9pbmhlcml0YW5jZSA9IDMKKyAgfTsKKworICBzdGF0aWMgTVNJbmhlcml0YW5jZUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU3BlbGxpbmcgUywgYm9vbCBCZXN0Q2FzZSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTVNJbmhlcml0YW5jZUF0dHIoTG9jLCBDdHgsIEJlc3RDYXNlLCBTKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE1TSW5oZXJpdGFuY2VBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIGJvb2wgQmVzdENhc2UKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpNU0luaGVyaXRhbmNlLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIGJlc3RDYXNlKEJlc3RDYXNlKQorICB7CisgIH0KKworICBNU0luaGVyaXRhbmNlQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpNU0luaGVyaXRhbmNlLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIGJlc3RDYXNlKCkKKyAgeworICB9CisKKyAgTVNJbmhlcml0YW5jZUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgU3BlbGxpbmcgZ2V0U2VtYW50aWNTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc3BlbGxpbmcgbGlzdCBpbmRleCIpOworICAgIGNhc2UgMDogcmV0dXJuIEtleXdvcmRfc2luZ2xlX2luaGVyaXRhbmNlOworICAgIGNhc2UgMTogcmV0dXJuIEtleXdvcmRfbXVsdGlwbGVfaW5oZXJpdGFuY2U7CisgICAgY2FzZSAyOiByZXR1cm4gS2V5d29yZF92aXJ0dWFsX2luaGVyaXRhbmNlOworICAgIGNhc2UgMzogcmV0dXJuIEtleXdvcmRfdW5zcGVjaWZpZWRfaW5oZXJpdGFuY2U7CisgIH0KKyAgfQorICBib29sIGdldEJlc3RDYXNlKCkgY29uc3QgeworICAgIHJldHVybiBiZXN0Q2FzZTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBib29sIERlZmF1bHRCZXN0Q2FzZSA9IHRydWU7CisKKworICBzdGF0aWMgYm9vbCBoYXNWQlB0ck9mZnNldEZpZWxkKFNwZWxsaW5nIEluaGVyaXRhbmNlKSB7CisgICAgcmV0dXJuIEluaGVyaXRhbmNlID09IEtleXdvcmRfdW5zcGVjaWZpZWRfaW5oZXJpdGFuY2U7CisgIH0KKworICAvLyBPbmx5IG1lbWJlciBwb2ludGVycyB0byBmdW5jdGlvbnMgbmVlZCBhIHRoaXMgYWRqdXN0bWVudCwgc2luY2UgaXQgY2FuIGJlCisgIC8vIGNvbWJpbmVkIHdpdGggdGhlIGZpZWxkIG9mZnNldCBmb3IgZGF0YSBwb2ludGVycy4KKyAgc3RhdGljIGJvb2wgaGFzTlZPZmZzZXRGaWVsZChib29sIElzTWVtYmVyRnVuY3Rpb24sIFNwZWxsaW5nIEluaGVyaXRhbmNlKSB7CisgICAgcmV0dXJuIElzTWVtYmVyRnVuY3Rpb24gJiYgSW5oZXJpdGFuY2UgPj0gS2V5d29yZF9tdWx0aXBsZV9pbmhlcml0YW5jZTsKKyAgfQorCisgIHN0YXRpYyBib29sIGhhc1ZCVGFibGVPZmZzZXRGaWVsZChTcGVsbGluZyBJbmhlcml0YW5jZSkgeworICAgIHJldHVybiBJbmhlcml0YW5jZSA+PSBLZXl3b3JkX3ZpcnR1YWxfaW5oZXJpdGFuY2U7CisgIH0KKworICBzdGF0aWMgYm9vbCBoYXNPbmx5T25lRmllbGQoYm9vbCBJc01lbWJlckZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlbGxpbmcgSW5oZXJpdGFuY2UpIHsKKyAgICBpZiAoSXNNZW1iZXJGdW5jdGlvbikKKyAgICAgIHJldHVybiBJbmhlcml0YW5jZSA8PSBLZXl3b3JkX3NpbmdsZV9pbmhlcml0YW5jZTsKKyAgICByZXR1cm4gSW5oZXJpdGFuY2UgPD0gS2V5d29yZF9tdWx0aXBsZV9pbmhlcml0YW5jZTsKKyAgfQorICAKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpNU0luaGVyaXRhbmNlOyB9Cit9OworCitjbGFzcyBNU05vVlRhYmxlQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgTVNOb1ZUYWJsZUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTVNOb1ZUYWJsZUF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgTVNOb1ZUYWJsZUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6TVNOb1ZUYWJsZSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgTVNOb1ZUYWJsZUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok1TTm9WVGFibGU7IH0KK307CisKK2NsYXNzIE1TUDQzMEludGVycnVwdEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3Vuc2lnbmVkIG51bWJlcjsKKworcHVibGljOgorICBzdGF0aWMgTVNQNDMwSW50ZXJydXB0QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCB1bnNpZ25lZCBOdW1iZXIsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE1TUDQzMEludGVycnVwdEF0dHIoTG9jLCBDdHgsIE51bWJlciwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBNU1A0MzBJbnRlcnJ1cHRBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIE51bWJlcgorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6Ok1TUDQzMEludGVycnVwdCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBudW1iZXIoTnVtYmVyKQorICB7CisgIH0KKworICBNU1A0MzBJbnRlcnJ1cHRBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIHVuc2lnbmVkIGdldE51bWJlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVtYmVyOworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok1TUDQzMEludGVycnVwdDsgfQorfTsKKworY2xhc3MgTVNTdHJ1Y3RBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBNU1N0cnVjdEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTVNTdHJ1Y3RBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE1TU3RydWN0QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpNU1N0cnVjdCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgTVNTdHJ1Y3RBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpNU1N0cnVjdDsgfQorfTsKKworY2xhc3MgTVNWdG9yRGlzcEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3Vuc2lnbmVkIHZkbTsKKworcHVibGljOgorICBzdGF0aWMgTVNWdG9yRGlzcEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgdW5zaWduZWQgVmRtLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBNU1Z0b3JEaXNwQXR0cihMb2MsIEN0eCwgVmRtLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE1TVnRvckRpc3BBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFZkbQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6Ok1TVnRvckRpc3AsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgdmRtKFZkbSkKKyAgeworICB9CisKKyAgTVNWdG9yRGlzcEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0VmRtKCkgY29uc3QgeworICAgIHJldHVybiB2ZG07CisgIH0KKworCisgIGVudW0gTW9kZSB7CisgICAgTmV2ZXIsCisgICAgRm9yVkJhc2VPdmVycmlkZSwKKyAgICBGb3JWRlRhYmxlCisgIH07CisKKyAgTW9kZSBnZXRWdG9yRGlzcE1vZGUoKSBjb25zdCB7IHJldHVybiBNb2RlKHZkbSk7IH0KKyAgCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6TVNWdG9yRGlzcDsgfQorfTsKKworY2xhc3MgTWF4RmllbGRBbGlnbm1lbnRBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7Cit1bnNpZ25lZCBhbGlnbm1lbnQ7CisKK3B1YmxpYzoKKyAgc3RhdGljIE1heEZpZWxkQWxpZ25tZW50QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCB1bnNpZ25lZCBBbGlnbm1lbnQsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE1heEZpZWxkQWxpZ25tZW50QXR0cihMb2MsIEN0eCwgQWxpZ25tZW50LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE1heEZpZWxkQWxpZ25tZW50QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBBbGlnbm1lbnQKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpNYXhGaWVsZEFsaWdubWVudCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBhbGlnbm1lbnQoQWxpZ25tZW50KQorICB7CisgIH0KKworICBNYXhGaWVsZEFsaWdubWVudEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBhbGlnbm1lbnQ7CisgIH0KKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6TWF4RmllbGRBbGlnbm1lbnQ7IH0KK307CisKK2NsYXNzIE1heUFsaWFzQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgTWF5QWxpYXNBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE1heUFsaWFzQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBNYXlBbGlhc0F0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6TWF5QWxpYXMsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIE1heUFsaWFzQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6TWF5QWxpYXM7IH0KK307CisKK2NsYXNzIE1pY3JvTWlwc0F0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIE1pY3JvTWlwc0F0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTWljcm9NaXBzQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBNaWNyb01pcHNBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6Ok1pY3JvTWlwcywgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgTWljcm9NaXBzQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6TWljcm9NaXBzOyB9Cit9OworCitjbGFzcyBNaW5TaXplQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgTWluU2l6ZUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTWluU2l6ZUF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgTWluU2l6ZUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6TWluU2l6ZSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgTWluU2l6ZUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok1pblNpemU7IH0KK307CisKK2NsYXNzIE1pcHMxNkF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIE1pcHMxNkF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTWlwczE2QXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBNaXBzMTZBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6Ok1pcHMxNiwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgTWlwczE2QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6TWlwczE2OyB9Cit9OworCitjbGFzcyBNaXBzSW50ZXJydXB0QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBlbnVtIEludGVycnVwdFR5cGUgeworICAgIHN3MCwKKyAgICBzdzEsCisgICAgaHcwLAorICAgIGh3MSwKKyAgICBodzIsCisgICAgaHczLAorICAgIGh3NCwKKyAgICBodzUsCisgICAgZWljCisgIH07Citwcml2YXRlOgorICBJbnRlcnJ1cHRUeXBlIGludGVycnVwdDsKKworcHVibGljOgorICBzdGF0aWMgTWlwc0ludGVycnVwdEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgSW50ZXJydXB0VHlwZSBJbnRlcnJ1cHQsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE1pcHNJbnRlcnJ1cHRBdHRyKExvYywgQ3R4LCBJbnRlcnJ1cHQsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgTWlwc0ludGVycnVwdEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgSW50ZXJydXB0VHlwZSBJbnRlcnJ1cHQKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpNaXBzSW50ZXJydXB0LCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIGludGVycnVwdChJbnRlcnJ1cHQpCisgIHsKKyAgfQorCisgIE1pcHNJbnRlcnJ1cHRBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIEludGVycnVwdFR5cGUgZ2V0SW50ZXJydXB0KCkgY29uc3QgeworICAgIHJldHVybiBpbnRlcnJ1cHQ7CisgIH0KKworICBzdGF0aWMgYm9vbCBDb252ZXJ0U3RyVG9JbnRlcnJ1cHRUeXBlKFN0cmluZ1JlZiBWYWwsIEludGVycnVwdFR5cGUgJk91dCkgeworICAgIE9wdGlvbmFsPEludGVycnVwdFR5cGU+IFIgPSBsbHZtOjpTdHJpbmdTd2l0Y2g8T3B0aW9uYWw8SW50ZXJydXB0VHlwZT4+KFZhbCkKKyAgICAgIC5DYXNlKCJ2ZWN0b3I9c3cwIiwgTWlwc0ludGVycnVwdEF0dHI6OnN3MCkKKyAgICAgIC5DYXNlKCJ2ZWN0b3I9c3cxIiwgTWlwc0ludGVycnVwdEF0dHI6OnN3MSkKKyAgICAgIC5DYXNlKCJ2ZWN0b3I9aHcwIiwgTWlwc0ludGVycnVwdEF0dHI6Omh3MCkKKyAgICAgIC5DYXNlKCJ2ZWN0b3I9aHcxIiwgTWlwc0ludGVycnVwdEF0dHI6Omh3MSkKKyAgICAgIC5DYXNlKCJ2ZWN0b3I9aHcyIiwgTWlwc0ludGVycnVwdEF0dHI6Omh3MikKKyAgICAgIC5DYXNlKCJ2ZWN0b3I9aHczIiwgTWlwc0ludGVycnVwdEF0dHI6Omh3MykKKyAgICAgIC5DYXNlKCJ2ZWN0b3I9aHc0IiwgTWlwc0ludGVycnVwdEF0dHI6Omh3NCkKKyAgICAgIC5DYXNlKCJ2ZWN0b3I9aHc1IiwgTWlwc0ludGVycnVwdEF0dHI6Omh3NSkKKyAgICAgIC5DYXNlKCJlaWMiLCBNaXBzSW50ZXJydXB0QXR0cjo6ZWljKQorICAgICAgLkNhc2UoIiIsIE1pcHNJbnRlcnJ1cHRBdHRyOjplaWMpCisgICAgICAuRGVmYXVsdChPcHRpb25hbDxJbnRlcnJ1cHRUeXBlPigpKTsKKyAgICBpZiAoUikgeworICAgICAgT3V0ID0gKlI7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RhdGljIGNvbnN0IGNoYXIgKkNvbnZlcnRJbnRlcnJ1cHRUeXBlVG9TdHIoSW50ZXJydXB0VHlwZSBWYWwpIHsKKyAgICBzd2l0Y2goVmFsKSB7CisgICAgY2FzZSBNaXBzSW50ZXJydXB0QXR0cjo6c3cwOiByZXR1cm4gInZlY3Rvcj1zdzAiOworICAgIGNhc2UgTWlwc0ludGVycnVwdEF0dHI6OnN3MTogcmV0dXJuICJ2ZWN0b3I9c3cxIjsKKyAgICBjYXNlIE1pcHNJbnRlcnJ1cHRBdHRyOjpodzA6IHJldHVybiAidmVjdG9yPWh3MCI7CisgICAgY2FzZSBNaXBzSW50ZXJydXB0QXR0cjo6aHcxOiByZXR1cm4gInZlY3Rvcj1odzEiOworICAgIGNhc2UgTWlwc0ludGVycnVwdEF0dHI6Omh3MjogcmV0dXJuICJ2ZWN0b3I9aHcyIjsKKyAgICBjYXNlIE1pcHNJbnRlcnJ1cHRBdHRyOjpodzM6IHJldHVybiAidmVjdG9yPWh3MyI7CisgICAgY2FzZSBNaXBzSW50ZXJydXB0QXR0cjo6aHc0OiByZXR1cm4gInZlY3Rvcj1odzQiOworICAgIGNhc2UgTWlwc0ludGVycnVwdEF0dHI6Omh3NTogcmV0dXJuICJ2ZWN0b3I9aHc1IjsKKyAgICBjYXNlIE1pcHNJbnRlcnJ1cHRBdHRyOjplaWM6IHJldHVybiAiZWljIjsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiTm8gZW51bWVyYXRvciB3aXRoIHRoYXQgdmFsdWUiKTsKKyAgfQorCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6TWlwc0ludGVycnVwdDsgfQorfTsKKworY2xhc3MgTWlwc0xvbmdDYWxsQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBlbnVtIFNwZWxsaW5nIHsKKyAgICBHTlVfbG9uZ19jYWxsID0gMCwKKyAgICBDWFgxMV9nbnVfbG9uZ19jYWxsID0gMSwKKyAgICBHTlVfZmFyID0gMiwKKyAgICBDWFgxMV9nbnVfZmFyID0gMworICB9OworCisgIHN0YXRpYyBNaXBzTG9uZ0NhbGxBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNwZWxsaW5nIFMsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE1pcHNMb25nQ2FsbEF0dHIoTG9jLCBDdHgsIFMpOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgTWlwc0xvbmdDYWxsQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpNaXBzTG9uZ0NhbGwsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIE1pcHNMb25nQ2FsbEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgU3BlbGxpbmcgZ2V0U2VtYW50aWNTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc3BlbGxpbmcgbGlzdCBpbmRleCIpOworICAgIGNhc2UgMDogcmV0dXJuIEdOVV9sb25nX2NhbGw7CisgICAgY2FzZSAxOiByZXR1cm4gQ1hYMTFfZ251X2xvbmdfY2FsbDsKKyAgICBjYXNlIDI6IHJldHVybiBHTlVfZmFyOworICAgIGNhc2UgMzogcmV0dXJuIENYWDExX2dudV9mYXI7CisgIH0KKyAgfQorCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6TWlwc0xvbmdDYWxsOyB9Cit9OworCitjbGFzcyBNaXBzU2hvcnRDYWxsQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBlbnVtIFNwZWxsaW5nIHsKKyAgICBHTlVfc2hvcnRfY2FsbCA9IDAsCisgICAgQ1hYMTFfZ251X3Nob3J0X2NhbGwgPSAxLAorICAgIEdOVV9uZWFyID0gMiwKKyAgICBDWFgxMV9nbnVfbmVhciA9IDMKKyAgfTsKKworICBzdGF0aWMgTWlwc1Nob3J0Q2FsbEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU3BlbGxpbmcgUywgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTWlwc1Nob3J0Q2FsbEF0dHIoTG9jLCBDdHgsIFMpOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgTWlwc1Nob3J0Q2FsbEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6TWlwc1Nob3J0Q2FsbCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgTWlwc1Nob3J0Q2FsbEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgU3BlbGxpbmcgZ2V0U2VtYW50aWNTcGVsbGluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChTcGVsbGluZ0xpc3RJbmRleCkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc3BlbGxpbmcgbGlzdCBpbmRleCIpOworICAgIGNhc2UgMDogcmV0dXJuIEdOVV9zaG9ydF9jYWxsOworICAgIGNhc2UgMTogcmV0dXJuIENYWDExX2dudV9zaG9ydF9jYWxsOworICAgIGNhc2UgMjogcmV0dXJuIEdOVV9uZWFyOworICAgIGNhc2UgMzogcmV0dXJuIENYWDExX2dudV9uZWFyOworICB9CisgIH0KKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok1pcHNTaG9ydENhbGw7IH0KK307CisKK2NsYXNzIE1vZGVBdHRyIDogcHVibGljIEF0dHIgeworSWRlbnRpZmllckluZm8gKiBtb2RlOworCitwdWJsaWM6CisgIHN0YXRpYyBNb2RlQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBJZGVudGlmaWVySW5mbyAqIE1vZGUsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE1vZGVBdHRyKExvYywgQ3R4LCBNb2RlLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE1vZGVBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIElkZW50aWZpZXJJbmZvICogTW9kZQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogQXR0cihhdHRyOjpNb2RlLCBSLCBTSSwgZmFsc2UpCisgICAgICAgICAgICAgICwgbW9kZShNb2RlKQorICB7CisgIH0KKworICBNb2RlQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBJZGVudGlmaWVySW5mbyAqIGdldE1vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1vZGU7CisgIH0KKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6TW9kZTsgfQorfTsKKworY2xhc3MgTlNDb25zdW1lZEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVQYXJhbUF0dHIgeworcHVibGljOgorICBzdGF0aWMgTlNDb25zdW1lZEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTlNDb25zdW1lZEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgTlNDb25zdW1lZEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZVBhcmFtQXR0cihhdHRyOjpOU0NvbnN1bWVkLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBOU0NvbnN1bWVkQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6TlNDb25zdW1lZDsgfQorfTsKKworY2xhc3MgTlNDb25zdW1lc1NlbGZBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBOU0NvbnN1bWVzU2VsZkF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTlNDb25zdW1lc1NlbGZBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE5TQ29uc3VtZXNTZWxmQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpOU0NvbnN1bWVzU2VsZiwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgTlNDb25zdW1lc1NlbGZBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpOU0NvbnN1bWVzU2VsZjsgfQorfTsKKworY2xhc3MgTlNSZXR1cm5zQXV0b3JlbGVhc2VkQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgTlNSZXR1cm5zQXV0b3JlbGVhc2VkQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBOU1JldHVybnNBdXRvcmVsZWFzZWRBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE5TUmV0dXJuc0F1dG9yZWxlYXNlZEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6TlNSZXR1cm5zQXV0b3JlbGVhc2VkLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBOU1JldHVybnNBdXRvcmVsZWFzZWRBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpOU1JldHVybnNBdXRvcmVsZWFzZWQ7IH0KK307CisKK2NsYXNzIE5TUmV0dXJuc05vdFJldGFpbmVkQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgTlNSZXR1cm5zTm90UmV0YWluZWRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE5TUmV0dXJuc05vdFJldGFpbmVkQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBOU1JldHVybnNOb3RSZXRhaW5lZEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6TlNSZXR1cm5zTm90UmV0YWluZWQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIE5TUmV0dXJuc05vdFJldGFpbmVkQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6TlNSZXR1cm5zTm90UmV0YWluZWQ7IH0KK307CisKK2NsYXNzIE5TUmV0dXJuc1JldGFpbmVkQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgTlNSZXR1cm5zUmV0YWluZWRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE5TUmV0dXJuc1JldGFpbmVkQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBOU1JldHVybnNSZXRhaW5lZEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6TlNSZXR1cm5zUmV0YWluZWQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIE5TUmV0dXJuc1JldGFpbmVkQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6TlNSZXR1cm5zUmV0YWluZWQ7IH0KK307CisKK2NsYXNzIE5ha2VkQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgTmFrZWRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE5ha2VkQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBOYWtlZEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6TmFrZWQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIE5ha2VkQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6TmFrZWQ7IH0KK307CisKK2NsYXNzIE5vQWxpYXNBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBOb0FsaWFzQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBOb0FsaWFzQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBOb0FsaWFzQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpOb0FsaWFzLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBOb0FsaWFzQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6Tm9BbGlhczsgfQorfTsKKworY2xhc3MgTm9Db21tb25BdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBOb0NvbW1vbkF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTm9Db21tb25BdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE5vQ29tbW9uQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpOb0NvbW1vbiwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgTm9Db21tb25BdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpOb0NvbW1vbjsgfQorfTsKKworY2xhc3MgTm9EZWJ1Z0F0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIE5vRGVidWdBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE5vRGVidWdBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE5vRGVidWdBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6Ok5vRGVidWcsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIE5vRGVidWdBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpOb0RlYnVnOyB9Cit9OworCitjbGFzcyBOb0R1cGxpY2F0ZUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIE5vRHVwbGljYXRlQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBOb0R1cGxpY2F0ZUF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgTm9EdXBsaWNhdGVBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6Ok5vRHVwbGljYXRlLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBOb0R1cGxpY2F0ZUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok5vRHVwbGljYXRlOyB9Cit9OworCitjbGFzcyBOb0VzY2FwZUF0dHIgOiBwdWJsaWMgQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBOb0VzY2FwZUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTm9Fc2NhcGVBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE5vRXNjYXBlQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEF0dHIoYXR0cjo6Tm9Fc2NhcGUsIFIsIFNJLCBmYWxzZSkKKyAgeworICB9CisKKyAgTm9Fc2NhcGVBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpOb0VzY2FwZTsgfQorfTsKKworY2xhc3MgTm9JbmxpbmVBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBOb0lubGluZUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTm9JbmxpbmVBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE5vSW5saW5lQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpOb0lubGluZSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgTm9JbmxpbmVBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpOb0lubGluZTsgfQorfTsKKworY2xhc3MgTm9JbnN0cnVtZW50RnVuY3Rpb25BdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBOb0luc3RydW1lbnRGdW5jdGlvbkF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTm9JbnN0cnVtZW50RnVuY3Rpb25BdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE5vSW5zdHJ1bWVudEZ1bmN0aW9uQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpOb0luc3RydW1lbnRGdW5jdGlvbiwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgTm9JbnN0cnVtZW50RnVuY3Rpb25BdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpOb0luc3RydW1lbnRGdW5jdGlvbjsgfQorfTsKKworY2xhc3MgTm9NaWNyb01pcHNBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBOb01pY3JvTWlwc0F0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTm9NaWNyb01pcHNBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE5vTWljcm9NaXBzQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpOb01pY3JvTWlwcywgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgTm9NaWNyb01pcHNBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpOb01pY3JvTWlwczsgfQorfTsKKworY2xhc3MgTm9NaXBzMTZBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBOb01pcHMxNkF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTm9NaXBzMTZBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE5vTWlwczE2QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpOb01pcHMxNiwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgTm9NaXBzMTZBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpOb01pcHMxNjsgfQorfTsKKworY2xhc3MgTm9SZXR1cm5BdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBOb1JldHVybkF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTm9SZXR1cm5BdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE5vUmV0dXJuQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpOb1JldHVybiwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgTm9SZXR1cm5BdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpOb1JldHVybjsgfQorfTsKKworY2xhc3MgTm9TYW5pdGl6ZUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKKyAgdW5zaWduZWQgc2FuaXRpemVyc19TaXplOworICBTdHJpbmdSZWYgKnNhbml0aXplcnNfOworCitwdWJsaWM6CisgIHN0YXRpYyBOb1Nhbml0aXplQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTdHJpbmdSZWYgKlNhbml0aXplcnMsIHVuc2lnbmVkIFNhbml0aXplcnNTaXplLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBOb1Nhbml0aXplQXR0cihMb2MsIEN0eCwgU2FuaXRpemVycywgU2FuaXRpemVyc1NpemUsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgTm9TYW5pdGl6ZUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgU3RyaW5nUmVmICpTYW5pdGl6ZXJzLCB1bnNpZ25lZCBTYW5pdGl6ZXJzU2l6ZQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6Ok5vU2FuaXRpemUsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgc2FuaXRpemVyc19TaXplKFNhbml0aXplcnNTaXplKSwgc2FuaXRpemVyc18obmV3IChDdHgsIDE2KSBTdHJpbmdSZWZbc2FuaXRpemVyc19TaXplXSkKKyAgeworICAgIGZvciAoc2l6ZV90IEkgPSAwLCBFID0gc2FuaXRpemVyc19TaXplOyBJICE9IEU7CisgICAgICAgICArK0kpIHsKKyAgICAgIFN0cmluZ1JlZiBSZWYgPSBTYW5pdGl6ZXJzW0ldOworICAgICAgaWYgKCFSZWYuZW1wdHkoKSkgeworICAgICAgICBjaGFyICpNZW0gPSBuZXcgKEN0eCwgMSkgY2hhcltSZWYuc2l6ZSgpXTsKKyAgICAgICAgc3RkOjptZW1jcHkoTWVtLCBSZWYuZGF0YSgpLCBSZWYuc2l6ZSgpKTsKKyAgICAgICAgc2FuaXRpemVyc19bSV0gPSBTdHJpbmdSZWYoTWVtLCBSZWYuc2l6ZSgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBOb1Nhbml0aXplQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpOb1Nhbml0aXplLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIHNhbml0aXplcnNfU2l6ZSgwKSwgc2FuaXRpemVyc18obnVsbHB0cikKKyAgeworICB9CisKKyAgTm9TYW5pdGl6ZUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgdHlwZWRlZiBTdHJpbmdSZWYqIHNhbml0aXplcnNfaXRlcmF0b3I7CisgIHNhbml0aXplcnNfaXRlcmF0b3Igc2FuaXRpemVyc19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIHNhbml0aXplcnNfOyB9CisgIHNhbml0aXplcnNfaXRlcmF0b3Igc2FuaXRpemVyc19lbmQoKSBjb25zdCB7IHJldHVybiBzYW5pdGl6ZXJzXyArIHNhbml0aXplcnNfU2l6ZTsgfQorICB1bnNpZ25lZCBzYW5pdGl6ZXJzX3NpemUoKSBjb25zdCB7IHJldHVybiBzYW5pdGl6ZXJzX1NpemU7IH0KKyAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c2FuaXRpemVyc19pdGVyYXRvcj4gc2FuaXRpemVycygpIGNvbnN0IHsgcmV0dXJuIGxsdm06Om1ha2VfcmFuZ2Uoc2FuaXRpemVyc19iZWdpbigpLCBzYW5pdGl6ZXJzX2VuZCgpKTsgfQorCisKKworICAgIFNhbml0aXplck1hc2sgZ2V0TWFzaygpIGNvbnN0IHsKKyAgICAgIFNhbml0aXplck1hc2sgTWFzayA9IDA7CisgICAgICBmb3IgKGF1dG8gU2FuaXRpemVyTmFtZSA6IHNhbml0aXplcnMoKSkgeworICAgICAgICBTYW5pdGl6ZXJNYXNrIFBhcnNlZE1hc2sgPQorICAgICAgICAgICAgcGFyc2VTYW5pdGl6ZXJWYWx1ZShTYW5pdGl6ZXJOYW1lLCAvKkFsbG93R3JvdXBzPSovdHJ1ZSk7CisgICAgICAgIE1hc2sgfD0gZXhwYW5kU2FuaXRpemVyR3JvdXBzKFBhcnNlZE1hc2spOworICAgICAgfQorICAgICAgcmV0dXJuIE1hc2s7CisgICAgfQorICAKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpOb1Nhbml0aXplOyB9Cit9OworCitjbGFzcyBOb1NwbGl0U3RhY2tBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBOb1NwbGl0U3RhY2tBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE5vU3BsaXRTdGFja0F0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgTm9TcGxpdFN0YWNrQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpOb1NwbGl0U3RhY2ssIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIE5vU3BsaXRTdGFja0F0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok5vU3BsaXRTdGFjazsgfQorfTsKKworY2xhc3MgTm9UaHJlYWRTYWZldHlBbmFseXNpc0F0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIE5vVGhyZWFkU2FmZXR5QW5hbHlzaXNBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE5vVGhyZWFkU2FmZXR5QW5hbHlzaXNBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE5vVGhyZWFkU2FmZXR5QW5hbHlzaXNBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6Ok5vVGhyZWFkU2FmZXR5QW5hbHlzaXMsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIE5vVGhyZWFkU2FmZXR5QW5hbHlzaXNBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpOb1RocmVhZFNhZmV0eUFuYWx5c2lzOyB9Cit9OworCitjbGFzcyBOb1Rocm93QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgTm9UaHJvd0F0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTm9UaHJvd0F0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgTm9UaHJvd0F0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6Tm9UaHJvdywgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgTm9UaHJvd0F0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok5vVGhyb3c7IH0KK307CisKK2NsYXNzIE5vbk51bGxBdHRyIDogcHVibGljIEluaGVyaXRhYmxlUGFyYW1BdHRyIHsKKyAgdW5zaWduZWQgYXJnc19TaXplOworICBQYXJhbUlkeCAqYXJnc187CisKK3B1YmxpYzoKKyAgc3RhdGljIE5vbk51bGxBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFBhcmFtSWR4ICpBcmdzLCB1bnNpZ25lZCBBcmdzU2l6ZSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgTm9uTnVsbEF0dHIoTG9jLCBDdHgsIEFyZ3MsIEFyZ3NTaXplLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE5vbk51bGxBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIFBhcmFtSWR4ICpBcmdzLCB1bnNpZ25lZCBBcmdzU2l6ZQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVQYXJhbUF0dHIoYXR0cjo6Tm9uTnVsbCwgUiwgU0ksIGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgICAsIGFyZ3NfU2l6ZShBcmdzU2l6ZSksIGFyZ3NfKG5ldyAoQ3R4LCAxNikgUGFyYW1JZHhbYXJnc19TaXplXSkKKyAgeworICAgIHN0ZDo6Y29weShBcmdzLCBBcmdzICsgYXJnc19TaXplLCBhcmdzXyk7CisgIH0KKworICBOb25OdWxsQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlUGFyYW1BdHRyKGF0dHI6Ok5vbk51bGwsIFIsIFNJLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgLCBhcmdzX1NpemUoMCksIGFyZ3NfKG51bGxwdHIpCisgIHsKKyAgfQorCisgIE5vbk51bGxBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIHR5cGVkZWYgUGFyYW1JZHgqIGFyZ3NfaXRlcmF0b3I7CisgIGFyZ3NfaXRlcmF0b3IgYXJnc19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGFyZ3NfOyB9CisgIGFyZ3NfaXRlcmF0b3IgYXJnc19lbmQoKSBjb25zdCB7IHJldHVybiBhcmdzXyArIGFyZ3NfU2l6ZTsgfQorICB1bnNpZ25lZCBhcmdzX3NpemUoKSBjb25zdCB7IHJldHVybiBhcmdzX1NpemU7IH0KKyAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8YXJnc19pdGVyYXRvcj4gYXJncygpIGNvbnN0IHsgcmV0dXJuIGxsdm06Om1ha2VfcmFuZ2UoYXJnc19iZWdpbigpLCBhcmdzX2VuZCgpKTsgfQorCisKKworICAgIGJvb2wgaXNOb25OdWxsKHVuc2lnbmVkIElkeEFTVCkgY29uc3QgeworICAgICAgaWYgKCFhcmdzX3NpemUoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gYXJnc19lbmQoKSAhPSBzdGQ6OmZpbmRfaWYoCisgICAgICAgICAgYXJnc19iZWdpbigpLCBhcmdzX2VuZCgpLAorICAgICAgICAgIFs9XShjb25zdCBQYXJhbUlkeCAmSWR4KSB7IHJldHVybiBJZHguZ2V0QVNUSW5kZXgoKSA9PSBJZHhBU1Q7IH0pOworICAgIH0KKyAgCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6Tm9uTnVsbDsgfQorfTsKKworY2xhc3MgTm90VGFpbENhbGxlZEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIE5vdFRhaWxDYWxsZWRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE5vdFRhaWxDYWxsZWRBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE5vdFRhaWxDYWxsZWRBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6Ok5vdFRhaWxDYWxsZWQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIE5vdFRhaWxDYWxsZWRBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpOb3RUYWlsQ2FsbGVkOyB9Cit9OworCitjbGFzcyBPTVBDYXB0dXJlS2luZEF0dHIgOiBwdWJsaWMgQXR0ciB7Cit1bnNpZ25lZCBjYXB0dXJlS2luZDsKKworcHVibGljOgorICBzdGF0aWMgT01QQ2FwdHVyZUtpbmRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIHVuc2lnbmVkIENhcHR1cmVLaW5kLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBPTVBDYXB0dXJlS2luZEF0dHIoTG9jLCBDdHgsIENhcHR1cmVLaW5kLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE9NUENhcHR1cmVLaW5kQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBDYXB0dXJlS2luZAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogQXR0cihhdHRyOjpPTVBDYXB0dXJlS2luZCwgUiwgU0ksIGZhbHNlKQorICAgICAgICAgICAgICAsIGNhcHR1cmVLaW5kKENhcHR1cmVLaW5kKQorICB7CisgIH0KKworICBPTVBDYXB0dXJlS2luZEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0Q2FwdHVyZUtpbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhcHR1cmVLaW5kOworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok9NUENhcHR1cmVLaW5kOyB9Cit9OworCitjbGFzcyBPTVBDYXB0dXJlTm9Jbml0QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgT01QQ2FwdHVyZU5vSW5pdEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgT01QQ2FwdHVyZU5vSW5pdEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgT01QQ2FwdHVyZU5vSW5pdEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6T01QQ2FwdHVyZU5vSW5pdCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgT01QQ2FwdHVyZU5vSW5pdEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok9NUENhcHR1cmVOb0luaXQ7IH0KK307CisKK2NsYXNzIE9NUERlY2xhcmVTaW1kRGVjbEF0dHIgOiBwdWJsaWMgQXR0ciB7CitwdWJsaWM6CisgIGVudW0gQnJhbmNoU3RhdGVUeSB7CisgICAgQlNfVW5kZWZpbmVkLAorICAgIEJTX0luYnJhbmNoLAorICAgIEJTX05vdGluYnJhbmNoCisgIH07Citwcml2YXRlOgorICBCcmFuY2hTdGF0ZVR5IGJyYW5jaFN0YXRlOworCitFeHByICogc2ltZGxlbjsKKworICB1bnNpZ25lZCB1bmlmb3Jtc19TaXplOworICBFeHByICogKnVuaWZvcm1zXzsKKworICB1bnNpZ25lZCBhbGlnbmVkc19TaXplOworICBFeHByICogKmFsaWduZWRzXzsKKworICB1bnNpZ25lZCBhbGlnbm1lbnRzX1NpemU7CisgIEV4cHIgKiAqYWxpZ25tZW50c187CisKKyAgdW5zaWduZWQgbGluZWFyc19TaXplOworICBFeHByICogKmxpbmVhcnNfOworCisgIHVuc2lnbmVkIG1vZGlmaWVyc19TaXplOworICB1bnNpZ25lZCAqbW9kaWZpZXJzXzsKKworICB1bnNpZ25lZCBzdGVwc19TaXplOworICBFeHByICogKnN0ZXBzXzsKKworcHVibGljOgorICBzdGF0aWMgT01QRGVjbGFyZVNpbWREZWNsQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBCcmFuY2hTdGF0ZVR5IEJyYW5jaFN0YXRlLCBFeHByICogU2ltZGxlbiwgRXhwciAqICpVbmlmb3JtcywgdW5zaWduZWQgVW5pZm9ybXNTaXplLCBFeHByICogKkFsaWduZWRzLCB1bnNpZ25lZCBBbGlnbmVkc1NpemUsIEV4cHIgKiAqQWxpZ25tZW50cywgdW5zaWduZWQgQWxpZ25tZW50c1NpemUsIEV4cHIgKiAqTGluZWFycywgdW5zaWduZWQgTGluZWFyc1NpemUsIHVuc2lnbmVkICpNb2RpZmllcnMsIHVuc2lnbmVkIE1vZGlmaWVyc1NpemUsIEV4cHIgKiAqU3RlcHMsIHVuc2lnbmVkIFN0ZXBzU2l6ZSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgT01QRGVjbGFyZVNpbWREZWNsQXR0cihMb2MsIEN0eCwgQnJhbmNoU3RhdGUsIFNpbWRsZW4sIFVuaWZvcm1zLCBVbmlmb3Jtc1NpemUsIEFsaWduZWRzLCBBbGlnbmVkc1NpemUsIEFsaWdubWVudHMsIEFsaWdubWVudHNTaXplLCBMaW5lYXJzLCBMaW5lYXJzU2l6ZSwgTW9kaWZpZXJzLCBNb2RpZmllcnNTaXplLCBTdGVwcywgU3RlcHNTaXplLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE9NUERlY2xhcmVTaW1kRGVjbEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgQnJhbmNoU3RhdGVUeSBCcmFuY2hTdGF0ZQorICAgICAgICAgICAgICAsIEV4cHIgKiBTaW1kbGVuCisgICAgICAgICAgICAgICwgRXhwciAqICpVbmlmb3JtcywgdW5zaWduZWQgVW5pZm9ybXNTaXplCisgICAgICAgICAgICAgICwgRXhwciAqICpBbGlnbmVkcywgdW5zaWduZWQgQWxpZ25lZHNTaXplCisgICAgICAgICAgICAgICwgRXhwciAqICpBbGlnbm1lbnRzLCB1bnNpZ25lZCBBbGlnbm1lbnRzU2l6ZQorICAgICAgICAgICAgICAsIEV4cHIgKiAqTGluZWFycywgdW5zaWduZWQgTGluZWFyc1NpemUKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCAqTW9kaWZpZXJzLCB1bnNpZ25lZCBNb2RpZmllcnNTaXplCisgICAgICAgICAgICAgICwgRXhwciAqICpTdGVwcywgdW5zaWduZWQgU3RlcHNTaXplCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBBdHRyKGF0dHI6Ok9NUERlY2xhcmVTaW1kRGVjbCwgUiwgU0ksIGZhbHNlKQorICAgICAgICAgICAgICAsIGJyYW5jaFN0YXRlKEJyYW5jaFN0YXRlKQorICAgICAgICAgICAgICAsIHNpbWRsZW4oU2ltZGxlbikKKyAgICAgICAgICAgICAgLCB1bmlmb3Jtc19TaXplKFVuaWZvcm1zU2l6ZSksIHVuaWZvcm1zXyhuZXcgKEN0eCwgMTYpIEV4cHIgKlt1bmlmb3Jtc19TaXplXSkKKyAgICAgICAgICAgICAgLCBhbGlnbmVkc19TaXplKEFsaWduZWRzU2l6ZSksIGFsaWduZWRzXyhuZXcgKEN0eCwgMTYpIEV4cHIgKlthbGlnbmVkc19TaXplXSkKKyAgICAgICAgICAgICAgLCBhbGlnbm1lbnRzX1NpemUoQWxpZ25tZW50c1NpemUpLCBhbGlnbm1lbnRzXyhuZXcgKEN0eCwgMTYpIEV4cHIgKlthbGlnbm1lbnRzX1NpemVdKQorICAgICAgICAgICAgICAsIGxpbmVhcnNfU2l6ZShMaW5lYXJzU2l6ZSksIGxpbmVhcnNfKG5ldyAoQ3R4LCAxNikgRXhwciAqW2xpbmVhcnNfU2l6ZV0pCisgICAgICAgICAgICAgICwgbW9kaWZpZXJzX1NpemUoTW9kaWZpZXJzU2l6ZSksIG1vZGlmaWVyc18obmV3IChDdHgsIDE2KSB1bnNpZ25lZFttb2RpZmllcnNfU2l6ZV0pCisgICAgICAgICAgICAgICwgc3RlcHNfU2l6ZShTdGVwc1NpemUpLCBzdGVwc18obmV3IChDdHgsIDE2KSBFeHByICpbc3RlcHNfU2l6ZV0pCisgIHsKKyAgICBzdGQ6OmNvcHkoVW5pZm9ybXMsIFVuaWZvcm1zICsgdW5pZm9ybXNfU2l6ZSwgdW5pZm9ybXNfKTsKKyAgICBzdGQ6OmNvcHkoQWxpZ25lZHMsIEFsaWduZWRzICsgYWxpZ25lZHNfU2l6ZSwgYWxpZ25lZHNfKTsKKyAgICBzdGQ6OmNvcHkoQWxpZ25tZW50cywgQWxpZ25tZW50cyArIGFsaWdubWVudHNfU2l6ZSwgYWxpZ25tZW50c18pOworICAgIHN0ZDo6Y29weShMaW5lYXJzLCBMaW5lYXJzICsgbGluZWFyc19TaXplLCBsaW5lYXJzXyk7CisgICAgc3RkOjpjb3B5KE1vZGlmaWVycywgTW9kaWZpZXJzICsgbW9kaWZpZXJzX1NpemUsIG1vZGlmaWVyc18pOworICAgIHN0ZDo6Y29weShTdGVwcywgU3RlcHMgKyBzdGVwc19TaXplLCBzdGVwc18pOworICB9CisKKyAgT01QRGVjbGFyZVNpbWREZWNsQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBCcmFuY2hTdGF0ZVR5IEJyYW5jaFN0YXRlCisgICAgICAgICAgICAgICwgRXhwciAqIFNpbWRsZW4KKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEF0dHIoYXR0cjo6T01QRGVjbGFyZVNpbWREZWNsLCBSLCBTSSwgZmFsc2UpCisgICAgICAgICAgICAgICwgYnJhbmNoU3RhdGUoQnJhbmNoU3RhdGUpCisgICAgICAgICAgICAgICwgc2ltZGxlbihTaW1kbGVuKQorICAgICAgICAgICAgICAsIHVuaWZvcm1zX1NpemUoMCksIHVuaWZvcm1zXyhudWxscHRyKQorICAgICAgICAgICAgICAsIGFsaWduZWRzX1NpemUoMCksIGFsaWduZWRzXyhudWxscHRyKQorICAgICAgICAgICAgICAsIGFsaWdubWVudHNfU2l6ZSgwKSwgYWxpZ25tZW50c18obnVsbHB0cikKKyAgICAgICAgICAgICAgLCBsaW5lYXJzX1NpemUoMCksIGxpbmVhcnNfKG51bGxwdHIpCisgICAgICAgICAgICAgICwgbW9kaWZpZXJzX1NpemUoMCksIG1vZGlmaWVyc18obnVsbHB0cikKKyAgICAgICAgICAgICAgLCBzdGVwc19TaXplKDApLCBzdGVwc18obnVsbHB0cikKKyAgeworICB9CisKKyAgT01QRGVjbGFyZVNpbWREZWNsQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBCcmFuY2hTdGF0ZVR5IGdldEJyYW5jaFN0YXRlKCkgY29uc3QgeworICAgIHJldHVybiBicmFuY2hTdGF0ZTsKKyAgfQorCisgIHN0YXRpYyBib29sIENvbnZlcnRTdHJUb0JyYW5jaFN0YXRlVHkoU3RyaW5nUmVmIFZhbCwgQnJhbmNoU3RhdGVUeSAmT3V0KSB7CisgICAgT3B0aW9uYWw8QnJhbmNoU3RhdGVUeT4gUiA9IGxsdm06OlN0cmluZ1N3aXRjaDxPcHRpb25hbDxCcmFuY2hTdGF0ZVR5Pj4oVmFsKQorICAgICAgLkNhc2UoIiIsIE9NUERlY2xhcmVTaW1kRGVjbEF0dHI6OkJTX1VuZGVmaW5lZCkKKyAgICAgIC5DYXNlKCJpbmJyYW5jaCIsIE9NUERlY2xhcmVTaW1kRGVjbEF0dHI6OkJTX0luYnJhbmNoKQorICAgICAgLkNhc2UoIm5vdGluYnJhbmNoIiwgT01QRGVjbGFyZVNpbWREZWNsQXR0cjo6QlNfTm90aW5icmFuY2gpCisgICAgICAuRGVmYXVsdChPcHRpb25hbDxCcmFuY2hTdGF0ZVR5PigpKTsKKyAgICBpZiAoUikgeworICAgICAgT3V0ID0gKlI7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RhdGljIGNvbnN0IGNoYXIgKkNvbnZlcnRCcmFuY2hTdGF0ZVR5VG9TdHIoQnJhbmNoU3RhdGVUeSBWYWwpIHsKKyAgICBzd2l0Y2goVmFsKSB7CisgICAgY2FzZSBPTVBEZWNsYXJlU2ltZERlY2xBdHRyOjpCU19VbmRlZmluZWQ6IHJldHVybiAiIjsKKyAgICBjYXNlIE9NUERlY2xhcmVTaW1kRGVjbEF0dHI6OkJTX0luYnJhbmNoOiByZXR1cm4gImluYnJhbmNoIjsKKyAgICBjYXNlIE9NUERlY2xhcmVTaW1kRGVjbEF0dHI6OkJTX05vdGluYnJhbmNoOiByZXR1cm4gIm5vdGluYnJhbmNoIjsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiTm8gZW51bWVyYXRvciB3aXRoIHRoYXQgdmFsdWUiKTsKKyAgfQorICBFeHByICogZ2V0U2ltZGxlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gc2ltZGxlbjsKKyAgfQorCisgIHR5cGVkZWYgRXhwciAqKiB1bmlmb3Jtc19pdGVyYXRvcjsKKyAgdW5pZm9ybXNfaXRlcmF0b3IgdW5pZm9ybXNfYmVnaW4oKSBjb25zdCB7IHJldHVybiB1bmlmb3Jtc187IH0KKyAgdW5pZm9ybXNfaXRlcmF0b3IgdW5pZm9ybXNfZW5kKCkgY29uc3QgeyByZXR1cm4gdW5pZm9ybXNfICsgdW5pZm9ybXNfU2l6ZTsgfQorICB1bnNpZ25lZCB1bmlmb3Jtc19zaXplKCkgY29uc3QgeyByZXR1cm4gdW5pZm9ybXNfU2l6ZTsgfQorICBsbHZtOjppdGVyYXRvcl9yYW5nZTx1bmlmb3Jtc19pdGVyYXRvcj4gdW5pZm9ybXMoKSBjb25zdCB7IHJldHVybiBsbHZtOjptYWtlX3JhbmdlKHVuaWZvcm1zX2JlZ2luKCksIHVuaWZvcm1zX2VuZCgpKTsgfQorCisKKyAgdHlwZWRlZiBFeHByICoqIGFsaWduZWRzX2l0ZXJhdG9yOworICBhbGlnbmVkc19pdGVyYXRvciBhbGlnbmVkc19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGFsaWduZWRzXzsgfQorICBhbGlnbmVkc19pdGVyYXRvciBhbGlnbmVkc19lbmQoKSBjb25zdCB7IHJldHVybiBhbGlnbmVkc18gKyBhbGlnbmVkc19TaXplOyB9CisgIHVuc2lnbmVkIGFsaWduZWRzX3NpemUoKSBjb25zdCB7IHJldHVybiBhbGlnbmVkc19TaXplOyB9CisgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGFsaWduZWRzX2l0ZXJhdG9yPiBhbGlnbmVkcygpIGNvbnN0IHsgcmV0dXJuIGxsdm06Om1ha2VfcmFuZ2UoYWxpZ25lZHNfYmVnaW4oKSwgYWxpZ25lZHNfZW5kKCkpOyB9CisKKworICB0eXBlZGVmIEV4cHIgKiogYWxpZ25tZW50c19pdGVyYXRvcjsKKyAgYWxpZ25tZW50c19pdGVyYXRvciBhbGlnbm1lbnRzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gYWxpZ25tZW50c187IH0KKyAgYWxpZ25tZW50c19pdGVyYXRvciBhbGlnbm1lbnRzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGFsaWdubWVudHNfICsgYWxpZ25tZW50c19TaXplOyB9CisgIHVuc2lnbmVkIGFsaWdubWVudHNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGFsaWdubWVudHNfU2l6ZTsgfQorICBsbHZtOjppdGVyYXRvcl9yYW5nZTxhbGlnbm1lbnRzX2l0ZXJhdG9yPiBhbGlnbm1lbnRzKCkgY29uc3QgeyByZXR1cm4gbGx2bTo6bWFrZV9yYW5nZShhbGlnbm1lbnRzX2JlZ2luKCksIGFsaWdubWVudHNfZW5kKCkpOyB9CisKKworICB0eXBlZGVmIEV4cHIgKiogbGluZWFyc19pdGVyYXRvcjsKKyAgbGluZWFyc19pdGVyYXRvciBsaW5lYXJzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gbGluZWFyc187IH0KKyAgbGluZWFyc19pdGVyYXRvciBsaW5lYXJzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGxpbmVhcnNfICsgbGluZWFyc19TaXplOyB9CisgIHVuc2lnbmVkIGxpbmVhcnNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGxpbmVhcnNfU2l6ZTsgfQorICBsbHZtOjppdGVyYXRvcl9yYW5nZTxsaW5lYXJzX2l0ZXJhdG9yPiBsaW5lYXJzKCkgY29uc3QgeyByZXR1cm4gbGx2bTo6bWFrZV9yYW5nZShsaW5lYXJzX2JlZ2luKCksIGxpbmVhcnNfZW5kKCkpOyB9CisKKworICB0eXBlZGVmIHVuc2lnbmVkKiBtb2RpZmllcnNfaXRlcmF0b3I7CisgIG1vZGlmaWVyc19pdGVyYXRvciBtb2RpZmllcnNfYmVnaW4oKSBjb25zdCB7IHJldHVybiBtb2RpZmllcnNfOyB9CisgIG1vZGlmaWVyc19pdGVyYXRvciBtb2RpZmllcnNfZW5kKCkgY29uc3QgeyByZXR1cm4gbW9kaWZpZXJzXyArIG1vZGlmaWVyc19TaXplOyB9CisgIHVuc2lnbmVkIG1vZGlmaWVyc19zaXplKCkgY29uc3QgeyByZXR1cm4gbW9kaWZpZXJzX1NpemU7IH0KKyAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8bW9kaWZpZXJzX2l0ZXJhdG9yPiBtb2RpZmllcnMoKSBjb25zdCB7IHJldHVybiBsbHZtOjptYWtlX3JhbmdlKG1vZGlmaWVyc19iZWdpbigpLCBtb2RpZmllcnNfZW5kKCkpOyB9CisKKworICB0eXBlZGVmIEV4cHIgKiogc3RlcHNfaXRlcmF0b3I7CisgIHN0ZXBzX2l0ZXJhdG9yIHN0ZXBzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gc3RlcHNfOyB9CisgIHN0ZXBzX2l0ZXJhdG9yIHN0ZXBzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIHN0ZXBzXyArIHN0ZXBzX1NpemU7IH0KKyAgdW5zaWduZWQgc3RlcHNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0ZXBzX1NpemU7IH0KKyAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c3RlcHNfaXRlcmF0b3I+IHN0ZXBzKCkgY29uc3QgeyByZXR1cm4gbGx2bTo6bWFrZV9yYW5nZShzdGVwc19iZWdpbigpLCBzdGVwc19lbmQoKSk7IH0KKworCisKKyAgICB2b2lkIHByaW50UHJldHR5UHJhZ21hKHJhd19vc3RyZWFtICYgT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpCisgICAgICAgIGNvbnN0IHsKKyAgICAgIGlmIChnZXRCcmFuY2hTdGF0ZSgpICE9IEJTX1VuZGVmaW5lZCkKKyAgICAgICAgT1MgPDwgJyAnIDw8IENvbnZlcnRCcmFuY2hTdGF0ZVR5VG9TdHIoZ2V0QnJhbmNoU3RhdGUoKSk7CisgICAgICBpZiAoYXV0byAqRSA9IGdldFNpbWRsZW4oKSkgeworICAgICAgICBPUyA8PCAiIHNpbWRsZW4oIjsKKyAgICAgICAgRS0+cHJpbnRQcmV0dHkoT1MsIG51bGxwdHIsIFBvbGljeSk7CisgICAgICAgIE9TIDw8ICIpIjsKKyAgICAgIH0KKyAgICAgIGlmICh1bmlmb3Jtc19zaXplKCkgPiAwKSB7CisgICAgICAgIE9TIDw8ICIgdW5pZm9ybSI7CisgICAgICAgIFN0cmluZ1JlZiBTZXAgPSAiKCI7CisgICAgICAgIGZvciAoYXV0byAqRSA6IHVuaWZvcm1zKCkpIHsKKyAgICAgICAgICBPUyA8PCBTZXA7CisgICAgICAgICAgRS0+cHJpbnRQcmV0dHkoT1MsIG51bGxwdHIsIFBvbGljeSk7CisgICAgICAgICAgU2VwID0gIiwgIjsKKyAgICAgICAgfQorICAgICAgICBPUyA8PCAiKSI7CisgICAgICB9CisgICAgICBhbGlnbm1lbnRzX2l0ZXJhdG9yIE5JID0gYWxpZ25tZW50c19iZWdpbigpOworICAgICAgZm9yIChhdXRvICpFIDogYWxpZ25lZHMoKSkgeworICAgICAgICBPUyA8PCAiIGFsaWduZWQoIjsKKyAgICAgICAgRS0+cHJpbnRQcmV0dHkoT1MsIG51bGxwdHIsIFBvbGljeSk7CisgICAgICAgIGlmICgqTkkpIHsKKyAgICAgICAgICBPUyA8PCAiOiAiOworICAgICAgICAgICgqTkkpLT5wcmludFByZXR0eShPUywgbnVsbHB0ciwgUG9saWN5KTsKKyAgICAgICAgfQorICAgICAgICBPUyA8PCAiKSI7CisgICAgICAgICsrTkk7CisgICAgICB9CisgICAgICBzdGVwc19pdGVyYXRvciBJID0gc3RlcHNfYmVnaW4oKTsKKyAgICAgIG1vZGlmaWVyc19pdGVyYXRvciBNSSA9IG1vZGlmaWVyc19iZWdpbigpOworICAgICAgZm9yIChhdXRvICpFIDogbGluZWFycygpKSB7CisgICAgICAgIE9TIDw8ICIgbGluZWFyKCI7CisgICAgICAgIGlmICgqTUkgIT0gT01QQ19MSU5FQVJfdW5rbm93bikKKyAgICAgICAgICBPUyA8PCBnZXRPcGVuTVBTaW1wbGVDbGF1c2VUeXBlTmFtZShPTVBDX2xpbmVhciwgKk1JKSA8PCAiKCI7CisgICAgICAgIEUtPnByaW50UHJldHR5KE9TLCBudWxscHRyLCBQb2xpY3kpOworICAgICAgICBpZiAoKk1JICE9IE9NUENfTElORUFSX3Vua25vd24pCisgICAgICAgICAgT1MgPDwgIikiOworICAgICAgICBpZiAoKkkpIHsKKyAgICAgICAgICBPUyA8PCAiOiAiOworICAgICAgICAgICgqSSktPnByaW50UHJldHR5KE9TLCBudWxscHRyLCBQb2xpY3kpOworICAgICAgICB9CisgICAgICAgIE9TIDw8ICIpIjsKKyAgICAgICAgKytJOworICAgICAgICArK01JOworICAgICAgfQorICAgIH0KKyAgCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6T01QRGVjbGFyZVNpbWREZWNsOyB9Cit9OworCitjbGFzcyBPTVBEZWNsYXJlVGFyZ2V0RGVjbEF0dHIgOiBwdWJsaWMgQXR0ciB7CitwdWJsaWM6CisgIGVudW0gTWFwVHlwZVR5IHsKKyAgICBNVF9UbywKKyAgICBNVF9MaW5rCisgIH07Citwcml2YXRlOgorICBNYXBUeXBlVHkgbWFwVHlwZTsKKworcHVibGljOgorICBzdGF0aWMgT01QRGVjbGFyZVRhcmdldERlY2xBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIE1hcFR5cGVUeSBNYXBUeXBlLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBPTVBEZWNsYXJlVGFyZ2V0RGVjbEF0dHIoTG9jLCBDdHgsIE1hcFR5cGUsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgT01QRGVjbGFyZVRhcmdldERlY2xBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIE1hcFR5cGVUeSBNYXBUeXBlCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBBdHRyKGF0dHI6Ok9NUERlY2xhcmVUYXJnZXREZWNsLCBSLCBTSSwgZmFsc2UpCisgICAgICAgICAgICAgICwgbWFwVHlwZShNYXBUeXBlKQorICB7CisgIH0KKworICBPTVBEZWNsYXJlVGFyZ2V0RGVjbEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgTWFwVHlwZVR5IGdldE1hcFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1hcFR5cGU7CisgIH0KKworICBzdGF0aWMgYm9vbCBDb252ZXJ0U3RyVG9NYXBUeXBlVHkoU3RyaW5nUmVmIFZhbCwgTWFwVHlwZVR5ICZPdXQpIHsKKyAgICBPcHRpb25hbDxNYXBUeXBlVHk+IFIgPSBsbHZtOjpTdHJpbmdTd2l0Y2g8T3B0aW9uYWw8TWFwVHlwZVR5Pj4oVmFsKQorICAgICAgLkNhc2UoInRvIiwgT01QRGVjbGFyZVRhcmdldERlY2xBdHRyOjpNVF9UbykKKyAgICAgIC5DYXNlKCJsaW5rIiwgT01QRGVjbGFyZVRhcmdldERlY2xBdHRyOjpNVF9MaW5rKQorICAgICAgLkRlZmF1bHQoT3B0aW9uYWw8TWFwVHlwZVR5PigpKTsKKyAgICBpZiAoUikgeworICAgICAgT3V0ID0gKlI7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RhdGljIGNvbnN0IGNoYXIgKkNvbnZlcnRNYXBUeXBlVHlUb1N0cihNYXBUeXBlVHkgVmFsKSB7CisgICAgc3dpdGNoKFZhbCkgeworICAgIGNhc2UgT01QRGVjbGFyZVRhcmdldERlY2xBdHRyOjpNVF9UbzogcmV0dXJuICJ0byI7CisgICAgY2FzZSBPTVBEZWNsYXJlVGFyZ2V0RGVjbEF0dHI6Ok1UX0xpbms6IHJldHVybiAibGluayI7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIk5vIGVudW1lcmF0b3Igd2l0aCB0aGF0IHZhbHVlIik7CisgIH0KKworICAgIHZvaWQgcHJpbnRQcmV0dHlQcmFnbWEocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgICAgICAvLyBVc2UgZmFrZSBzeW50YXggYmVjYXVzZSBpdCBpcyBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nIHB1cnBvc2Ugb25seS4KKyAgICAgIGlmIChnZXRNYXBUeXBlKCkgIT0gTVRfVG8pCisgICAgICAgIE9TIDw8ICcgJyA8PCBDb252ZXJ0TWFwVHlwZVR5VG9TdHIoZ2V0TWFwVHlwZSgpKTsKKyAgICB9CisgIAorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok9NUERlY2xhcmVUYXJnZXREZWNsOyB9Cit9OworCitjbGFzcyBPTVBSZWZlcmVuY2VkVmFyQXR0ciA6IHB1YmxpYyBBdHRyIHsKK0V4cHIgKiByZWY7CisKK3B1YmxpYzoKKyAgc3RhdGljIE9NUFJlZmVyZW5jZWRWYXJBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIEV4cHIgKiBSZWYsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE9NUFJlZmVyZW5jZWRWYXJBdHRyKExvYywgQ3R4LCBSZWYsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgT01QUmVmZXJlbmNlZFZhckF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgRXhwciAqIFJlZgorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogQXR0cihhdHRyOjpPTVBSZWZlcmVuY2VkVmFyLCBSLCBTSSwgZmFsc2UpCisgICAgICAgICAgICAgICwgcmVmKFJlZikKKyAgeworICB9CisKKyAgT01QUmVmZXJlbmNlZFZhckF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgRXhwciAqIGdldFJlZigpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVmOworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok9NUFJlZmVyZW5jZWRWYXI7IH0KK307CisKK2NsYXNzIE9NUFRocmVhZFByaXZhdGVEZWNsQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgT01QVGhyZWFkUHJpdmF0ZURlY2xBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE9NUFRocmVhZFByaXZhdGVEZWNsQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBPTVBUaHJlYWRQcml2YXRlRGVjbEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6T01QVGhyZWFkUHJpdmF0ZURlY2wsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIE9NUFRocmVhZFByaXZhdGVEZWNsQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6T01QVGhyZWFkUHJpdmF0ZURlY2w7IH0KK307CisKK2NsYXNzIE9iakNCb3hhYmxlQXR0ciA6IHB1YmxpYyBBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIE9iakNCb3hhYmxlQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBPYmpDQm94YWJsZUF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgT2JqQ0JveGFibGVBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogQXR0cihhdHRyOjpPYmpDQm94YWJsZSwgUiwgU0ksIGZhbHNlKQorICB7CisgIH0KKworICBPYmpDQm94YWJsZUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok9iakNCb3hhYmxlOyB9Cit9OworCitjbGFzcyBPYmpDQnJpZGdlQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworSWRlbnRpZmllckluZm8gKiBicmlkZ2VkVHlwZTsKKworcHVibGljOgorICBzdGF0aWMgT2JqQ0JyaWRnZUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgSWRlbnRpZmllckluZm8gKiBCcmlkZ2VkVHlwZSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgT2JqQ0JyaWRnZUF0dHIoTG9jLCBDdHgsIEJyaWRnZWRUeXBlLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE9iakNCcmlkZ2VBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIElkZW50aWZpZXJJbmZvICogQnJpZGdlZFR5cGUKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpPYmpDQnJpZGdlLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIGJyaWRnZWRUeXBlKEJyaWRnZWRUeXBlKQorICB7CisgIH0KKworICBPYmpDQnJpZGdlQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBJZGVudGlmaWVySW5mbyAqIGdldEJyaWRnZWRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBicmlkZ2VkVHlwZTsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpPYmpDQnJpZGdlOyB9Cit9OworCitjbGFzcyBPYmpDQnJpZGdlTXV0YWJsZUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK0lkZW50aWZpZXJJbmZvICogYnJpZGdlZFR5cGU7CisKK3B1YmxpYzoKKyAgc3RhdGljIE9iakNCcmlkZ2VNdXRhYmxlQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBJZGVudGlmaWVySW5mbyAqIEJyaWRnZWRUeXBlLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBPYmpDQnJpZGdlTXV0YWJsZUF0dHIoTG9jLCBDdHgsIEJyaWRnZWRUeXBlLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE9iakNCcmlkZ2VNdXRhYmxlQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBJZGVudGlmaWVySW5mbyAqIEJyaWRnZWRUeXBlCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6T2JqQ0JyaWRnZU11dGFibGUsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgYnJpZGdlZFR5cGUoQnJpZGdlZFR5cGUpCisgIHsKKyAgfQorCisgIE9iakNCcmlkZ2VNdXRhYmxlQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBJZGVudGlmaWVySW5mbyAqIGdldEJyaWRnZWRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBicmlkZ2VkVHlwZTsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpPYmpDQnJpZGdlTXV0YWJsZTsgfQorfTsKKworY2xhc3MgT2JqQ0JyaWRnZVJlbGF0ZWRBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitJZGVudGlmaWVySW5mbyAqIHJlbGF0ZWRDbGFzczsKKworSWRlbnRpZmllckluZm8gKiBjbGFzc01ldGhvZDsKKworSWRlbnRpZmllckluZm8gKiBpbnN0YW5jZU1ldGhvZDsKKworcHVibGljOgorICBzdGF0aWMgT2JqQ0JyaWRnZVJlbGF0ZWRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIElkZW50aWZpZXJJbmZvICogUmVsYXRlZENsYXNzLCBJZGVudGlmaWVySW5mbyAqIENsYXNzTWV0aG9kLCBJZGVudGlmaWVySW5mbyAqIEluc3RhbmNlTWV0aG9kLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBPYmpDQnJpZGdlUmVsYXRlZEF0dHIoTG9jLCBDdHgsIFJlbGF0ZWRDbGFzcywgQ2xhc3NNZXRob2QsIEluc3RhbmNlTWV0aG9kLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE9iakNCcmlkZ2VSZWxhdGVkQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBJZGVudGlmaWVySW5mbyAqIFJlbGF0ZWRDbGFzcworICAgICAgICAgICAgICAsIElkZW50aWZpZXJJbmZvICogQ2xhc3NNZXRob2QKKyAgICAgICAgICAgICAgLCBJZGVudGlmaWVySW5mbyAqIEluc3RhbmNlTWV0aG9kCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6T2JqQ0JyaWRnZVJlbGF0ZWQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgcmVsYXRlZENsYXNzKFJlbGF0ZWRDbGFzcykKKyAgICAgICAgICAgICAgLCBjbGFzc01ldGhvZChDbGFzc01ldGhvZCkKKyAgICAgICAgICAgICAgLCBpbnN0YW5jZU1ldGhvZChJbnN0YW5jZU1ldGhvZCkKKyAgeworICB9CisKKyAgT2JqQ0JyaWRnZVJlbGF0ZWRBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIElkZW50aWZpZXJJbmZvICogZ2V0UmVsYXRlZENsYXNzKCkgY29uc3QgeworICAgIHJldHVybiByZWxhdGVkQ2xhc3M7CisgIH0KKworICBJZGVudGlmaWVySW5mbyAqIGdldENsYXNzTWV0aG9kKCkgY29uc3QgeworICAgIHJldHVybiBjbGFzc01ldGhvZDsKKyAgfQorCisgIElkZW50aWZpZXJJbmZvICogZ2V0SW5zdGFuY2VNZXRob2QoKSBjb25zdCB7CisgICAgcmV0dXJuIGluc3RhbmNlTWV0aG9kOworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok9iakNCcmlkZ2VSZWxhdGVkOyB9Cit9OworCitjbGFzcyBPYmpDRGVzaWduYXRlZEluaXRpYWxpemVyQXR0ciA6IHB1YmxpYyBBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIE9iakNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE9iakNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE9iakNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogQXR0cihhdHRyOjpPYmpDRGVzaWduYXRlZEluaXRpYWxpemVyLCBSLCBTSSwgZmFsc2UpCisgIHsKKyAgfQorCisgIE9iakNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpPYmpDRGVzaWduYXRlZEluaXRpYWxpemVyOyB9Cit9OworCitjbGFzcyBPYmpDRXhjZXB0aW9uQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgT2JqQ0V4Y2VwdGlvbkF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgT2JqQ0V4Y2VwdGlvbkF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgT2JqQ0V4Y2VwdGlvbkF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6T2JqQ0V4Y2VwdGlvbiwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgT2JqQ0V4Y2VwdGlvbkF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok9iakNFeGNlcHRpb247IH0KK307CisKK2NsYXNzIE9iakNFeHBsaWNpdFByb3RvY29sSW1wbEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIE9iakNFeHBsaWNpdFByb3RvY29sSW1wbEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgT2JqQ0V4cGxpY2l0UHJvdG9jb2xJbXBsQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBPYmpDRXhwbGljaXRQcm90b2NvbEltcGxBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6Ok9iakNFeHBsaWNpdFByb3RvY29sSW1wbCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgT2JqQ0V4cGxpY2l0UHJvdG9jb2xJbXBsQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6T2JqQ0V4cGxpY2l0UHJvdG9jb2xJbXBsOyB9Cit9OworCitjbGFzcyBPYmpDSW5kZXBlbmRlbnRDbGFzc0F0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIE9iakNJbmRlcGVuZGVudENsYXNzQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBPYmpDSW5kZXBlbmRlbnRDbGFzc0F0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgT2JqQ0luZGVwZW5kZW50Q2xhc3NBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6Ok9iakNJbmRlcGVuZGVudENsYXNzLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBPYmpDSW5kZXBlbmRlbnRDbGFzc0F0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok9iakNJbmRlcGVuZGVudENsYXNzOyB9Cit9OworCitjbGFzcyBPYmpDTWV0aG9kRmFtaWx5QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBlbnVtIEZhbWlseUtpbmQgeworICAgIE9NRl9Ob25lLAorICAgIE9NRl9hbGxvYywKKyAgICBPTUZfY29weSwKKyAgICBPTUZfaW5pdCwKKyAgICBPTUZfbXV0YWJsZUNvcHksCisgICAgT01GX25ldworICB9OworcHJpdmF0ZToKKyAgRmFtaWx5S2luZCBmYW1pbHk7CisKK3B1YmxpYzoKKyAgc3RhdGljIE9iakNNZXRob2RGYW1pbHlBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIEZhbWlseUtpbmQgRmFtaWx5LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBPYmpDTWV0aG9kRmFtaWx5QXR0cihMb2MsIEN0eCwgRmFtaWx5LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE9iakNNZXRob2RGYW1pbHlBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIEZhbWlseUtpbmQgRmFtaWx5CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6T2JqQ01ldGhvZEZhbWlseSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBmYW1pbHkoRmFtaWx5KQorICB7CisgIH0KKworICBPYmpDTWV0aG9kRmFtaWx5QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBGYW1pbHlLaW5kIGdldEZhbWlseSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFtaWx5OworICB9CisKKyAgc3RhdGljIGJvb2wgQ29udmVydFN0clRvRmFtaWx5S2luZChTdHJpbmdSZWYgVmFsLCBGYW1pbHlLaW5kICZPdXQpIHsKKyAgICBPcHRpb25hbDxGYW1pbHlLaW5kPiBSID0gbGx2bTo6U3RyaW5nU3dpdGNoPE9wdGlvbmFsPEZhbWlseUtpbmQ+PihWYWwpCisgICAgICAuQ2FzZSgibm9uZSIsIE9iakNNZXRob2RGYW1pbHlBdHRyOjpPTUZfTm9uZSkKKyAgICAgIC5DYXNlKCJhbGxvYyIsIE9iakNNZXRob2RGYW1pbHlBdHRyOjpPTUZfYWxsb2MpCisgICAgICAuQ2FzZSgiY29weSIsIE9iakNNZXRob2RGYW1pbHlBdHRyOjpPTUZfY29weSkKKyAgICAgIC5DYXNlKCJpbml0IiwgT2JqQ01ldGhvZEZhbWlseUF0dHI6Ok9NRl9pbml0KQorICAgICAgLkNhc2UoIm11dGFibGVDb3B5IiwgT2JqQ01ldGhvZEZhbWlseUF0dHI6Ok9NRl9tdXRhYmxlQ29weSkKKyAgICAgIC5DYXNlKCJuZXciLCBPYmpDTWV0aG9kRmFtaWx5QXR0cjo6T01GX25ldykKKyAgICAgIC5EZWZhdWx0KE9wdGlvbmFsPEZhbWlseUtpbmQ+KCkpOworICAgIGlmIChSKSB7CisgICAgICBPdXQgPSAqUjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGF0aWMgY29uc3QgY2hhciAqQ29udmVydEZhbWlseUtpbmRUb1N0cihGYW1pbHlLaW5kIFZhbCkgeworICAgIHN3aXRjaChWYWwpIHsKKyAgICBjYXNlIE9iakNNZXRob2RGYW1pbHlBdHRyOjpPTUZfTm9uZTogcmV0dXJuICJub25lIjsKKyAgICBjYXNlIE9iakNNZXRob2RGYW1pbHlBdHRyOjpPTUZfYWxsb2M6IHJldHVybiAiYWxsb2MiOworICAgIGNhc2UgT2JqQ01ldGhvZEZhbWlseUF0dHI6Ok9NRl9jb3B5OiByZXR1cm4gImNvcHkiOworICAgIGNhc2UgT2JqQ01ldGhvZEZhbWlseUF0dHI6Ok9NRl9pbml0OiByZXR1cm4gImluaXQiOworICAgIGNhc2UgT2JqQ01ldGhvZEZhbWlseUF0dHI6Ok9NRl9tdXRhYmxlQ29weTogcmV0dXJuICJtdXRhYmxlQ29weSI7CisgICAgY2FzZSBPYmpDTWV0aG9kRmFtaWx5QXR0cjo6T01GX25ldzogcmV0dXJuICJuZXciOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJObyBlbnVtZXJhdG9yIHdpdGggdGhhdCB2YWx1ZSIpOworICB9CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpPYmpDTWV0aG9kRmFtaWx5OyB9Cit9OworCitjbGFzcyBPYmpDTlNPYmplY3RBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBPYmpDTlNPYmplY3RBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE9iakNOU09iamVjdEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgT2JqQ05TT2JqZWN0QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpPYmpDTlNPYmplY3QsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIE9iakNOU09iamVjdEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok9iakNOU09iamVjdDsgfQorfTsKKworY2xhc3MgT2JqQ1ByZWNpc2VMaWZldGltZUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIE9iakNQcmVjaXNlTGlmZXRpbWVBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE9iakNQcmVjaXNlTGlmZXRpbWVBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE9iakNQcmVjaXNlTGlmZXRpbWVBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6Ok9iakNQcmVjaXNlTGlmZXRpbWUsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIE9iakNQcmVjaXNlTGlmZXRpbWVBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpPYmpDUHJlY2lzZUxpZmV0aW1lOyB9Cit9OworCitjbGFzcyBPYmpDUmVxdWlyZXNQcm9wZXJ0eURlZnNBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBPYmpDUmVxdWlyZXNQcm9wZXJ0eURlZnNBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE9iakNSZXF1aXJlc1Byb3BlcnR5RGVmc0F0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgT2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpPYmpDUmVxdWlyZXNQcm9wZXJ0eURlZnMsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIE9iakNSZXF1aXJlc1Byb3BlcnR5RGVmc0F0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok9iakNSZXF1aXJlc1Byb3BlcnR5RGVmczsgfQorfTsKKworY2xhc3MgT2JqQ1JlcXVpcmVzU3VwZXJBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBPYmpDUmVxdWlyZXNTdXBlckF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgT2JqQ1JlcXVpcmVzU3VwZXJBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE9iakNSZXF1aXJlc1N1cGVyQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpPYmpDUmVxdWlyZXNTdXBlciwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgT2JqQ1JlcXVpcmVzU3VwZXJBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpPYmpDUmVxdWlyZXNTdXBlcjsgfQorfTsKKworY2xhc3MgT2JqQ1JldHVybnNJbm5lclBvaW50ZXJBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBPYmpDUmV0dXJuc0lubmVyUG9pbnRlckF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgT2JqQ1JldHVybnNJbm5lclBvaW50ZXJBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE9iakNSZXR1cm5zSW5uZXJQb2ludGVyQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpPYmpDUmV0dXJuc0lubmVyUG9pbnRlciwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgT2JqQ1JldHVybnNJbm5lclBvaW50ZXJBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpPYmpDUmV0dXJuc0lubmVyUG9pbnRlcjsgfQorfTsKKworY2xhc3MgT2JqQ1Jvb3RDbGFzc0F0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIE9iakNSb290Q2xhc3NBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE9iakNSb290Q2xhc3NBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE9iakNSb290Q2xhc3NBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6Ok9iakNSb290Q2xhc3MsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIE9iakNSb290Q2xhc3NBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpPYmpDUm9vdENsYXNzOyB9Cit9OworCitjbGFzcyBPYmpDUnVudGltZU5hbWVBdHRyIDogcHVibGljIEF0dHIgewordW5zaWduZWQgbWV0YWRhdGFOYW1lTGVuZ3RoOworY2hhciAqbWV0YWRhdGFOYW1lOworCitwdWJsaWM6CisgIHN0YXRpYyBPYmpDUnVudGltZU5hbWVBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIGxsdm06OlN0cmluZ1JlZiBNZXRhZGF0YU5hbWUsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE9iakNSdW50aW1lTmFtZUF0dHIoTG9jLCBDdHgsIE1ldGFkYXRhTmFtZSwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBPYmpDUnVudGltZU5hbWVBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIGxsdm06OlN0cmluZ1JlZiBNZXRhZGF0YU5hbWUKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEF0dHIoYXR0cjo6T2JqQ1J1bnRpbWVOYW1lLCBSLCBTSSwgZmFsc2UpCisgICAgICAgICAgICAgICwgbWV0YWRhdGFOYW1lTGVuZ3RoKE1ldGFkYXRhTmFtZS5zaXplKCkpLG1ldGFkYXRhTmFtZShuZXcgKEN0eCwgMSkgY2hhclttZXRhZGF0YU5hbWVMZW5ndGhdKQorICB7CisgICAgICBpZiAoIU1ldGFkYXRhTmFtZS5lbXB0eSgpKQorICAgICAgICBzdGQ6Om1lbWNweShtZXRhZGF0YU5hbWUsIE1ldGFkYXRhTmFtZS5kYXRhKCksIG1ldGFkYXRhTmFtZUxlbmd0aCk7CisgIH0KKworICBPYmpDUnVudGltZU5hbWVBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIGxsdm06OlN0cmluZ1JlZiBnZXRNZXRhZGF0YU5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06OlN0cmluZ1JlZihtZXRhZGF0YU5hbWUsIG1ldGFkYXRhTmFtZUxlbmd0aCk7CisgIH0KKyAgdW5zaWduZWQgZ2V0TWV0YWRhdGFOYW1lTGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiBtZXRhZGF0YU5hbWVMZW5ndGg7CisgIH0KKyAgdm9pZCBzZXRNZXRhZGF0YU5hbWUoQVNUQ29udGV4dCAmQywgbGx2bTo6U3RyaW5nUmVmIFMpIHsKKyAgICBtZXRhZGF0YU5hbWVMZW5ndGggPSBTLnNpemUoKTsKKyAgICB0aGlzLT5tZXRhZGF0YU5hbWUgPSBuZXcgKEMsIDEpIGNoYXIgW21ldGFkYXRhTmFtZUxlbmd0aF07CisgICAgaWYgKCFTLmVtcHR5KCkpCisgICAgICBzdGQ6Om1lbWNweSh0aGlzLT5tZXRhZGF0YU5hbWUsIFMuZGF0YSgpLCBtZXRhZGF0YU5hbWVMZW5ndGgpOworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok9iakNSdW50aW1lTmFtZTsgfQorfTsKKworY2xhc3MgT2JqQ1J1bnRpbWVWaXNpYmxlQXR0ciA6IHB1YmxpYyBBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIE9iakNSdW50aW1lVmlzaWJsZUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgT2JqQ1J1bnRpbWVWaXNpYmxlQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBPYmpDUnVudGltZVZpc2libGVBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogQXR0cihhdHRyOjpPYmpDUnVudGltZVZpc2libGUsIFIsIFNJLCBmYWxzZSkKKyAgeworICB9CisKKyAgT2JqQ1J1bnRpbWVWaXNpYmxlQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6T2JqQ1J1bnRpbWVWaXNpYmxlOyB9Cit9OworCitjbGFzcyBPYmpDU3ViY2xhc3NpbmdSZXN0cmljdGVkQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgT2JqQ1N1YmNsYXNzaW5nUmVzdHJpY3RlZEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgT2JqQ1N1YmNsYXNzaW5nUmVzdHJpY3RlZEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgT2JqQ1N1YmNsYXNzaW5nUmVzdHJpY3RlZEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6T2JqQ1N1YmNsYXNzaW5nUmVzdHJpY3RlZCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgT2JqQ1N1YmNsYXNzaW5nUmVzdHJpY3RlZEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok9iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWQ7IH0KK307CisKK2NsYXNzIE9wZW5DTEFjY2Vzc0F0dHIgOiBwdWJsaWMgQXR0ciB7CitwdWJsaWM6CisgIGVudW0gU3BlbGxpbmcgeworICAgIEtleXdvcmRfcmVhZF9vbmx5ID0gMCwKKyAgICBLZXl3b3JkX3dyaXRlX29ubHkgPSAyLAorICAgIEtleXdvcmRfcmVhZF93cml0ZSA9IDQKKyAgfTsKKworICBzdGF0aWMgT3BlbkNMQWNjZXNzQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTcGVsbGluZyBTLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBPcGVuQ0xBY2Nlc3NBdHRyKExvYywgQ3R4LCBTKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE9wZW5DTEFjY2Vzc0F0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBBdHRyKGF0dHI6Ok9wZW5DTEFjY2VzcywgUiwgU0ksIGZhbHNlKQorICB7CisgIH0KKworICBPcGVuQ0xBY2Nlc3NBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIFNwZWxsaW5nIGdldFNlbWFudGljU3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHNwZWxsaW5nIGxpc3QgaW5kZXgiKTsKKyAgICBjYXNlIDA6IHJldHVybiBLZXl3b3JkX3JlYWRfb25seTsKKyAgICBjYXNlIDE6IHJldHVybiBLZXl3b3JkX3JlYWRfb25seTsKKyAgICBjYXNlIDI6IHJldHVybiBLZXl3b3JkX3dyaXRlX29ubHk7CisgICAgY2FzZSAzOiByZXR1cm4gS2V5d29yZF93cml0ZV9vbmx5OworICAgIGNhc2UgNDogcmV0dXJuIEtleXdvcmRfcmVhZF93cml0ZTsKKyAgICBjYXNlIDU6IHJldHVybiBLZXl3b3JkX3JlYWRfd3JpdGU7CisgIH0KKyAgfQorICBib29sIGlzUmVhZE9ubHkoKSBjb25zdCB7IHJldHVybiBTcGVsbGluZ0xpc3RJbmRleCA9PSAwIHx8CisgICAgU3BlbGxpbmdMaXN0SW5kZXggPT0gMTsgfQorICBib29sIGlzUmVhZFdyaXRlKCkgY29uc3QgeyByZXR1cm4gU3BlbGxpbmdMaXN0SW5kZXggPT0gNCB8fAorICAgIFNwZWxsaW5nTGlzdEluZGV4ID09IDU7IH0KKyAgYm9vbCBpc1dyaXRlT25seSgpIGNvbnN0IHsgcmV0dXJuIFNwZWxsaW5nTGlzdEluZGV4ID09IDIgfHwKKyAgICBTcGVsbGluZ0xpc3RJbmRleCA9PSAzOyB9CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpPcGVuQ0xBY2Nlc3M7IH0KK307CisKK2NsYXNzIE9wZW5DTEludGVsUmVxZFN1Ykdyb3VwU2l6ZUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3Vuc2lnbmVkIHN1Ykdyb3VwU2l6ZTsKKworcHVibGljOgorICBzdGF0aWMgT3BlbkNMSW50ZWxSZXFkU3ViR3JvdXBTaXplQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCB1bnNpZ25lZCBTdWJHcm91cFNpemUsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE9wZW5DTEludGVsUmVxZFN1Ykdyb3VwU2l6ZUF0dHIoTG9jLCBDdHgsIFN1Ykdyb3VwU2l6ZSwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBPcGVuQ0xJbnRlbFJlcWRTdWJHcm91cFNpemVBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFN1Ykdyb3VwU2l6ZQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6Ok9wZW5DTEludGVsUmVxZFN1Ykdyb3VwU2l6ZSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBzdWJHcm91cFNpemUoU3ViR3JvdXBTaXplKQorICB7CisgIH0KKworICBPcGVuQ0xJbnRlbFJlcWRTdWJHcm91cFNpemVBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIHVuc2lnbmVkIGdldFN1Ykdyb3VwU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3ViR3JvdXBTaXplOworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok9wZW5DTEludGVsUmVxZFN1Ykdyb3VwU2l6ZTsgfQorfTsKKworY2xhc3MgT3BlbkNMS2VybmVsQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgT3BlbkNMS2VybmVsQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBPcGVuQ0xLZXJuZWxBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE9wZW5DTEtlcm5lbEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6T3BlbkNMS2VybmVsLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBPcGVuQ0xLZXJuZWxBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpPcGVuQ0xLZXJuZWw7IH0KK307CisKK2NsYXNzIE9wZW5DTFVucm9sbEhpbnRBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7Cit1bnNpZ25lZCB1bnJvbGxIaW50OworCitwdWJsaWM6CisgIHN0YXRpYyBPcGVuQ0xVbnJvbGxIaW50QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCB1bnNpZ25lZCBVbnJvbGxIaW50LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBPcGVuQ0xVbnJvbGxIaW50QXR0cihMb2MsIEN0eCwgVW5yb2xsSGludCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBPcGVuQ0xVbnJvbGxIaW50QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBVbnJvbGxIaW50CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6T3BlbkNMVW5yb2xsSGludCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCB1bnJvbGxIaW50KFVucm9sbEhpbnQpCisgIHsKKyAgfQorCisgIE9wZW5DTFVucm9sbEhpbnRBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIHVuc2lnbmVkIGdldFVucm9sbEhpbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIHVucm9sbEhpbnQ7CisgIH0KKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6T3BlbkNMVW5yb2xsSGludDsgfQorfTsKKworY2xhc3MgT3B0aW1pemVOb25lQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgT3B0aW1pemVOb25lQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBPcHRpbWl6ZU5vbmVBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE9wdGltaXplTm9uZUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6T3B0aW1pemVOb25lLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBPcHRpbWl6ZU5vbmVBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpPcHRpbWl6ZU5vbmU7IH0KK307CisKK2NsYXNzIE92ZXJsb2FkYWJsZUF0dHIgOiBwdWJsaWMgQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBPdmVybG9hZGFibGVBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIE92ZXJsb2FkYWJsZUF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgT3ZlcmxvYWRhYmxlQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEF0dHIoYXR0cjo6T3ZlcmxvYWRhYmxlLCBSLCBTSSwgZmFsc2UpCisgIHsKKyAgfQorCisgIE92ZXJsb2FkYWJsZUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Ok92ZXJsb2FkYWJsZTsgfQorfTsKKworY2xhc3MgT3ZlcnJpZGVBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBPdmVycmlkZUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgT3ZlcnJpZGVBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE92ZXJyaWRlQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpPdmVycmlkZSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgT3ZlcnJpZGVBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpPdmVycmlkZTsgfQorfTsKKworY2xhc3MgT3duZXJzaGlwQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworSWRlbnRpZmllckluZm8gKiBtb2R1bGU7CisKKyAgdW5zaWduZWQgYXJnc19TaXplOworICBQYXJhbUlkeCAqYXJnc187CisKK3B1YmxpYzoKKyAgZW51bSBTcGVsbGluZyB7CisgICAgR05VX293bmVyc2hpcF9ob2xkcyA9IDAsCisgICAgQ1hYMTFfY2xhbmdfb3duZXJzaGlwX2hvbGRzID0gMSwKKyAgICBDMnhfY2xhbmdfb3duZXJzaGlwX2hvbGRzID0gMiwKKyAgICBHTlVfb3duZXJzaGlwX3JldHVybnMgPSAzLAorICAgIENYWDExX2NsYW5nX293bmVyc2hpcF9yZXR1cm5zID0gNCwKKyAgICBDMnhfY2xhbmdfb3duZXJzaGlwX3JldHVybnMgPSA1LAorICAgIEdOVV9vd25lcnNoaXBfdGFrZXMgPSA2LAorICAgIENYWDExX2NsYW5nX293bmVyc2hpcF90YWtlcyA9IDcsCisgICAgQzJ4X2NsYW5nX293bmVyc2hpcF90YWtlcyA9IDgKKyAgfTsKKworICBzdGF0aWMgT3duZXJzaGlwQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTcGVsbGluZyBTLCBJZGVudGlmaWVySW5mbyAqIE1vZHVsZSwgUGFyYW1JZHggKkFyZ3MsIHVuc2lnbmVkIEFyZ3NTaXplLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBPd25lcnNoaXBBdHRyKExvYywgQ3R4LCBNb2R1bGUsIEFyZ3MsIEFyZ3NTaXplLCBTKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIE93bmVyc2hpcEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgSWRlbnRpZmllckluZm8gKiBNb2R1bGUKKyAgICAgICAgICAgICAgLCBQYXJhbUlkeCAqQXJncywgdW5zaWduZWQgQXJnc1NpemUKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpPd25lcnNoaXAsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgbW9kdWxlKE1vZHVsZSkKKyAgICAgICAgICAgICAgLCBhcmdzX1NpemUoQXJnc1NpemUpLCBhcmdzXyhuZXcgKEN0eCwgMTYpIFBhcmFtSWR4W2FyZ3NfU2l6ZV0pCisgIHsKKyAgICBzdGQ6OmNvcHkoQXJncywgQXJncyArIGFyZ3NfU2l6ZSwgYXJnc18pOworICB9CisKKyAgT3duZXJzaGlwQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBJZGVudGlmaWVySW5mbyAqIE1vZHVsZQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6Ok93bmVyc2hpcCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBtb2R1bGUoTW9kdWxlKQorICAgICAgICAgICAgICAsIGFyZ3NfU2l6ZSgwKSwgYXJnc18obnVsbHB0cikKKyAgeworICB9CisKKyAgT3duZXJzaGlwQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBTcGVsbGluZyBnZXRTZW1hbnRpY1NwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzcGVsbGluZyBsaXN0IGluZGV4Iik7CisgICAgY2FzZSAwOiByZXR1cm4gR05VX293bmVyc2hpcF9ob2xkczsKKyAgICBjYXNlIDE6IHJldHVybiBDWFgxMV9jbGFuZ19vd25lcnNoaXBfaG9sZHM7CisgICAgY2FzZSAyOiByZXR1cm4gQzJ4X2NsYW5nX293bmVyc2hpcF9ob2xkczsKKyAgICBjYXNlIDM6IHJldHVybiBHTlVfb3duZXJzaGlwX3JldHVybnM7CisgICAgY2FzZSA0OiByZXR1cm4gQ1hYMTFfY2xhbmdfb3duZXJzaGlwX3JldHVybnM7CisgICAgY2FzZSA1OiByZXR1cm4gQzJ4X2NsYW5nX293bmVyc2hpcF9yZXR1cm5zOworICAgIGNhc2UgNjogcmV0dXJuIEdOVV9vd25lcnNoaXBfdGFrZXM7CisgICAgY2FzZSA3OiByZXR1cm4gQ1hYMTFfY2xhbmdfb3duZXJzaGlwX3Rha2VzOworICAgIGNhc2UgODogcmV0dXJuIEMyeF9jbGFuZ19vd25lcnNoaXBfdGFrZXM7CisgIH0KKyAgfQorICBib29sIGlzSG9sZHMoKSBjb25zdCB7IHJldHVybiBTcGVsbGluZ0xpc3RJbmRleCA9PSAwIHx8CisgICAgU3BlbGxpbmdMaXN0SW5kZXggPT0gMSB8fAorICAgIFNwZWxsaW5nTGlzdEluZGV4ID09IDI7IH0KKyAgYm9vbCBpc1JldHVybnMoKSBjb25zdCB7IHJldHVybiBTcGVsbGluZ0xpc3RJbmRleCA9PSAzIHx8CisgICAgU3BlbGxpbmdMaXN0SW5kZXggPT0gNCB8fAorICAgIFNwZWxsaW5nTGlzdEluZGV4ID09IDU7IH0KKyAgYm9vbCBpc1Rha2VzKCkgY29uc3QgeyByZXR1cm4gU3BlbGxpbmdMaXN0SW5kZXggPT0gNiB8fAorICAgIFNwZWxsaW5nTGlzdEluZGV4ID09IDcgfHwKKyAgICBTcGVsbGluZ0xpc3RJbmRleCA9PSA4OyB9CisgIElkZW50aWZpZXJJbmZvICogZ2V0TW9kdWxlKCkgY29uc3QgeworICAgIHJldHVybiBtb2R1bGU7CisgIH0KKworICB0eXBlZGVmIFBhcmFtSWR4KiBhcmdzX2l0ZXJhdG9yOworICBhcmdzX2l0ZXJhdG9yIGFyZ3NfYmVnaW4oKSBjb25zdCB7IHJldHVybiBhcmdzXzsgfQorICBhcmdzX2l0ZXJhdG9yIGFyZ3NfZW5kKCkgY29uc3QgeyByZXR1cm4gYXJnc18gKyBhcmdzX1NpemU7IH0KKyAgdW5zaWduZWQgYXJnc19zaXplKCkgY29uc3QgeyByZXR1cm4gYXJnc19TaXplOyB9CisgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGFyZ3NfaXRlcmF0b3I+IGFyZ3MoKSBjb25zdCB7IHJldHVybiBsbHZtOjptYWtlX3JhbmdlKGFyZ3NfYmVnaW4oKSwgYXJnc19lbmQoKSk7IH0KKworCisKKyAgICBlbnVtIE93bmVyc2hpcEtpbmQgeyBIb2xkcywgUmV0dXJucywgVGFrZXMgfTsKKyAgICBPd25lcnNoaXBLaW5kIGdldE93bktpbmQoKSBjb25zdCB7CisgICAgICByZXR1cm4gaXNIb2xkcygpID8gSG9sZHMgOgorICAgICAgICAgICAgIGlzVGFrZXMoKSA/IFRha2VzIDoKKyAgICAgICAgICAgICBSZXR1cm5zOworICAgIH0KKyAgCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6T3duZXJzaGlwOyB9Cit9OworCitjbGFzcyBQYWNrZWRBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBQYWNrZWRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFBhY2tlZEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgUGFja2VkQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpQYWNrZWQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIFBhY2tlZEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlBhY2tlZDsgfQorfTsKKworY2xhc3MgUGFyYW1UeXBlc3RhdGVBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIGVudW0gQ29uc3VtZWRTdGF0ZSB7CisgICAgVW5rbm93biwKKyAgICBDb25zdW1lZCwKKyAgICBVbmNvbnN1bWVkCisgIH07Citwcml2YXRlOgorICBDb25zdW1lZFN0YXRlIHBhcmFtU3RhdGU7CisKK3B1YmxpYzoKKyAgc3RhdGljIFBhcmFtVHlwZXN0YXRlQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBDb25zdW1lZFN0YXRlIFBhcmFtU3RhdGUsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFBhcmFtVHlwZXN0YXRlQXR0cihMb2MsIEN0eCwgUGFyYW1TdGF0ZSwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBQYXJhbVR5cGVzdGF0ZUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgQ29uc3VtZWRTdGF0ZSBQYXJhbVN0YXRlCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6UGFyYW1UeXBlc3RhdGUsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgcGFyYW1TdGF0ZShQYXJhbVN0YXRlKQorICB7CisgIH0KKworICBQYXJhbVR5cGVzdGF0ZUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgQ29uc3VtZWRTdGF0ZSBnZXRQYXJhbVN0YXRlKCkgY29uc3QgeworICAgIHJldHVybiBwYXJhbVN0YXRlOworICB9CisKKyAgc3RhdGljIGJvb2wgQ29udmVydFN0clRvQ29uc3VtZWRTdGF0ZShTdHJpbmdSZWYgVmFsLCBDb25zdW1lZFN0YXRlICZPdXQpIHsKKyAgICBPcHRpb25hbDxDb25zdW1lZFN0YXRlPiBSID0gbGx2bTo6U3RyaW5nU3dpdGNoPE9wdGlvbmFsPENvbnN1bWVkU3RhdGU+PihWYWwpCisgICAgICAuQ2FzZSgidW5rbm93biIsIFBhcmFtVHlwZXN0YXRlQXR0cjo6VW5rbm93bikKKyAgICAgIC5DYXNlKCJjb25zdW1lZCIsIFBhcmFtVHlwZXN0YXRlQXR0cjo6Q29uc3VtZWQpCisgICAgICAuQ2FzZSgidW5jb25zdW1lZCIsIFBhcmFtVHlwZXN0YXRlQXR0cjo6VW5jb25zdW1lZCkKKyAgICAgIC5EZWZhdWx0KE9wdGlvbmFsPENvbnN1bWVkU3RhdGU+KCkpOworICAgIGlmIChSKSB7CisgICAgICBPdXQgPSAqUjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGF0aWMgY29uc3QgY2hhciAqQ29udmVydENvbnN1bWVkU3RhdGVUb1N0cihDb25zdW1lZFN0YXRlIFZhbCkgeworICAgIHN3aXRjaChWYWwpIHsKKyAgICBjYXNlIFBhcmFtVHlwZXN0YXRlQXR0cjo6VW5rbm93bjogcmV0dXJuICJ1bmtub3duIjsKKyAgICBjYXNlIFBhcmFtVHlwZXN0YXRlQXR0cjo6Q29uc3VtZWQ6IHJldHVybiAiY29uc3VtZWQiOworICAgIGNhc2UgUGFyYW1UeXBlc3RhdGVBdHRyOjpVbmNvbnN1bWVkOiByZXR1cm4gInVuY29uc3VtZWQiOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJObyBlbnVtZXJhdG9yIHdpdGggdGhhdCB2YWx1ZSIpOworICB9CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpQYXJhbVR5cGVzdGF0ZTsgfQorfTsKKworY2xhc3MgUGFzY2FsQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgUGFzY2FsQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBQYXNjYWxBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFBhc2NhbEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6UGFzY2FsLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBQYXNjYWxBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpQYXNjYWw7IH0KK307CisKK2NsYXNzIFBhc3NPYmplY3RTaXplQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZVBhcmFtQXR0ciB7CitpbnQgdHlwZTsKKworcHVibGljOgorICBzdGF0aWMgUGFzc09iamVjdFNpemVBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIGludCBUeXBlLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBQYXNzT2JqZWN0U2l6ZUF0dHIoTG9jLCBDdHgsIFR5cGUsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgUGFzc09iamVjdFNpemVBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIGludCBUeXBlCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZVBhcmFtQXR0cihhdHRyOjpQYXNzT2JqZWN0U2l6ZSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCB0eXBlKFR5cGUpCisgIHsKKyAgfQorCisgIFBhc3NPYmplY3RTaXplQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBpbnQgZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZTsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpQYXNzT2JqZWN0U2l6ZTsgfQorfTsKKworY2xhc3MgUGNzQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBlbnVtIFBDU1R5cGUgeworICAgIEFBUENTLAorICAgIEFBUENTX1ZGUAorICB9OworcHJpdmF0ZToKKyAgUENTVHlwZSBwQ1M7CisKK3B1YmxpYzoKKyAgc3RhdGljIFBjc0F0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgUENTVHlwZSBQQ1MsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFBjc0F0dHIoTG9jLCBDdHgsIFBDUywgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBQY3NBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIFBDU1R5cGUgUENTCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6UGNzLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIHBDUyhQQ1MpCisgIHsKKyAgfQorCisgIFBjc0F0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgUENTVHlwZSBnZXRQQ1MoKSBjb25zdCB7CisgICAgcmV0dXJuIHBDUzsKKyAgfQorCisgIHN0YXRpYyBib29sIENvbnZlcnRTdHJUb1BDU1R5cGUoU3RyaW5nUmVmIFZhbCwgUENTVHlwZSAmT3V0KSB7CisgICAgT3B0aW9uYWw8UENTVHlwZT4gUiA9IGxsdm06OlN0cmluZ1N3aXRjaDxPcHRpb25hbDxQQ1NUeXBlPj4oVmFsKQorICAgICAgLkNhc2UoImFhcGNzIiwgUGNzQXR0cjo6QUFQQ1MpCisgICAgICAuQ2FzZSgiYWFwY3MtdmZwIiwgUGNzQXR0cjo6QUFQQ1NfVkZQKQorICAgICAgLkRlZmF1bHQoT3B0aW9uYWw8UENTVHlwZT4oKSk7CisgICAgaWYgKFIpIHsKKyAgICAgIE91dCA9ICpSOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBjaGFyICpDb252ZXJ0UENTVHlwZVRvU3RyKFBDU1R5cGUgVmFsKSB7CisgICAgc3dpdGNoKFZhbCkgeworICAgIGNhc2UgUGNzQXR0cjo6QUFQQ1M6IHJldHVybiAiYWFwY3MiOworICAgIGNhc2UgUGNzQXR0cjo6QUFQQ1NfVkZQOiByZXR1cm4gImFhcGNzLXZmcCI7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIk5vIGVudW1lcmF0b3Igd2l0aCB0aGF0IHZhbHVlIik7CisgIH0KKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlBjczsgfQorfTsKKworY2xhc3MgUHJhZ21hQ2xhbmdCU1NTZWN0aW9uQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgewordW5zaWduZWQgbmFtZUxlbmd0aDsKK2NoYXIgKm5hbWU7CisKK3B1YmxpYzoKKyAgc3RhdGljIFByYWdtYUNsYW5nQlNTU2VjdGlvbkF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgbGx2bTo6U3RyaW5nUmVmIE5hbWUsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFByYWdtYUNsYW5nQlNTU2VjdGlvbkF0dHIoTG9jLCBDdHgsIE5hbWUsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgUHJhZ21hQ2xhbmdCU1NTZWN0aW9uQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBsbHZtOjpTdHJpbmdSZWYgTmFtZQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OlByYWdtYUNsYW5nQlNTU2VjdGlvbiwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBuYW1lTGVuZ3RoKE5hbWUuc2l6ZSgpKSxuYW1lKG5ldyAoQ3R4LCAxKSBjaGFyW25hbWVMZW5ndGhdKQorICB7CisgICAgICBpZiAoIU5hbWUuZW1wdHkoKSkKKyAgICAgICAgc3RkOjptZW1jcHkobmFtZSwgTmFtZS5kYXRhKCksIG5hbWVMZW5ndGgpOworICB9CisKKyAgUHJhZ21hQ2xhbmdCU1NTZWN0aW9uQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBsbHZtOjpTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6U3RyaW5nUmVmKG5hbWUsIG5hbWVMZW5ndGgpOworICB9CisgIHVuc2lnbmVkIGdldE5hbWVMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIG5hbWVMZW5ndGg7CisgIH0KKyAgdm9pZCBzZXROYW1lKEFTVENvbnRleHQgJkMsIGxsdm06OlN0cmluZ1JlZiBTKSB7CisgICAgbmFtZUxlbmd0aCA9IFMuc2l6ZSgpOworICAgIHRoaXMtPm5hbWUgPSBuZXcgKEMsIDEpIGNoYXIgW25hbWVMZW5ndGhdOworICAgIGlmICghUy5lbXB0eSgpKQorICAgICAgc3RkOjptZW1jcHkodGhpcy0+bmFtZSwgUy5kYXRhKCksIG5hbWVMZW5ndGgpOworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlByYWdtYUNsYW5nQlNTU2VjdGlvbjsgfQorfTsKKworY2xhc3MgUHJhZ21hQ2xhbmdEYXRhU2VjdGlvbkF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3Vuc2lnbmVkIG5hbWVMZW5ndGg7CitjaGFyICpuYW1lOworCitwdWJsaWM6CisgIHN0YXRpYyBQcmFnbWFDbGFuZ0RhdGFTZWN0aW9uQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBsbHZtOjpTdHJpbmdSZWYgTmFtZSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgUHJhZ21hQ2xhbmdEYXRhU2VjdGlvbkF0dHIoTG9jLCBDdHgsIE5hbWUsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgUHJhZ21hQ2xhbmdEYXRhU2VjdGlvbkF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgbGx2bTo6U3RyaW5nUmVmIE5hbWUKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpQcmFnbWFDbGFuZ0RhdGFTZWN0aW9uLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIG5hbWVMZW5ndGgoTmFtZS5zaXplKCkpLG5hbWUobmV3IChDdHgsIDEpIGNoYXJbbmFtZUxlbmd0aF0pCisgIHsKKyAgICAgIGlmICghTmFtZS5lbXB0eSgpKQorICAgICAgICBzdGQ6Om1lbWNweShuYW1lLCBOYW1lLmRhdGEoKSwgbmFtZUxlbmd0aCk7CisgIH0KKworICBQcmFnbWFDbGFuZ0RhdGFTZWN0aW9uQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBsbHZtOjpTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6U3RyaW5nUmVmKG5hbWUsIG5hbWVMZW5ndGgpOworICB9CisgIHVuc2lnbmVkIGdldE5hbWVMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIG5hbWVMZW5ndGg7CisgIH0KKyAgdm9pZCBzZXROYW1lKEFTVENvbnRleHQgJkMsIGxsdm06OlN0cmluZ1JlZiBTKSB7CisgICAgbmFtZUxlbmd0aCA9IFMuc2l6ZSgpOworICAgIHRoaXMtPm5hbWUgPSBuZXcgKEMsIDEpIGNoYXIgW25hbWVMZW5ndGhdOworICAgIGlmICghUy5lbXB0eSgpKQorICAgICAgc3RkOjptZW1jcHkodGhpcy0+bmFtZSwgUy5kYXRhKCksIG5hbWVMZW5ndGgpOworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlByYWdtYUNsYW5nRGF0YVNlY3Rpb247IH0KK307CisKK2NsYXNzIFByYWdtYUNsYW5nUm9kYXRhU2VjdGlvbkF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3Vuc2lnbmVkIG5hbWVMZW5ndGg7CitjaGFyICpuYW1lOworCitwdWJsaWM6CisgIHN0YXRpYyBQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb25BdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIGxsdm06OlN0cmluZ1JlZiBOYW1lLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb25BdHRyKExvYywgQ3R4LCBOYW1lLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFByYWdtYUNsYW5nUm9kYXRhU2VjdGlvbkF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgbGx2bTo6U3RyaW5nUmVmIE5hbWUKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb24sIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgbmFtZUxlbmd0aChOYW1lLnNpemUoKSksbmFtZShuZXcgKEN0eCwgMSkgY2hhcltuYW1lTGVuZ3RoXSkKKyAgeworICAgICAgaWYgKCFOYW1lLmVtcHR5KCkpCisgICAgICAgIHN0ZDo6bWVtY3B5KG5hbWUsIE5hbWUuZGF0YSgpLCBuYW1lTGVuZ3RoKTsKKyAgfQorCisgIFByYWdtYUNsYW5nUm9kYXRhU2VjdGlvbkF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgbGx2bTo6U3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06OlN0cmluZ1JlZihuYW1lLCBuYW1lTGVuZ3RoKTsKKyAgfQorICB1bnNpZ25lZCBnZXROYW1lTGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiBuYW1lTGVuZ3RoOworICB9CisgIHZvaWQgc2V0TmFtZShBU1RDb250ZXh0ICZDLCBsbHZtOjpTdHJpbmdSZWYgUykgeworICAgIG5hbWVMZW5ndGggPSBTLnNpemUoKTsKKyAgICB0aGlzLT5uYW1lID0gbmV3IChDLCAxKSBjaGFyIFtuYW1lTGVuZ3RoXTsKKyAgICBpZiAoIVMuZW1wdHkoKSkKKyAgICAgIHN0ZDo6bWVtY3B5KHRoaXMtPm5hbWUsIFMuZGF0YSgpLCBuYW1lTGVuZ3RoKTsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb247IH0KK307CisKK2NsYXNzIFByYWdtYUNsYW5nVGV4dFNlY3Rpb25BdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7Cit1bnNpZ25lZCBuYW1lTGVuZ3RoOworY2hhciAqbmFtZTsKKworcHVibGljOgorICBzdGF0aWMgUHJhZ21hQ2xhbmdUZXh0U2VjdGlvbkF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgbGx2bTo6U3RyaW5nUmVmIE5hbWUsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFByYWdtYUNsYW5nVGV4dFNlY3Rpb25BdHRyKExvYywgQ3R4LCBOYW1lLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFByYWdtYUNsYW5nVGV4dFNlY3Rpb25BdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIGxsdm06OlN0cmluZ1JlZiBOYW1lCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6UHJhZ21hQ2xhbmdUZXh0U2VjdGlvbiwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBuYW1lTGVuZ3RoKE5hbWUuc2l6ZSgpKSxuYW1lKG5ldyAoQ3R4LCAxKSBjaGFyW25hbWVMZW5ndGhdKQorICB7CisgICAgICBpZiAoIU5hbWUuZW1wdHkoKSkKKyAgICAgICAgc3RkOjptZW1jcHkobmFtZSwgTmFtZS5kYXRhKCksIG5hbWVMZW5ndGgpOworICB9CisKKyAgUHJhZ21hQ2xhbmdUZXh0U2VjdGlvbkF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgbGx2bTo6U3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06OlN0cmluZ1JlZihuYW1lLCBuYW1lTGVuZ3RoKTsKKyAgfQorICB1bnNpZ25lZCBnZXROYW1lTGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiBuYW1lTGVuZ3RoOworICB9CisgIHZvaWQgc2V0TmFtZShBU1RDb250ZXh0ICZDLCBsbHZtOjpTdHJpbmdSZWYgUykgeworICAgIG5hbWVMZW5ndGggPSBTLnNpemUoKTsKKyAgICB0aGlzLT5uYW1lID0gbmV3IChDLCAxKSBjaGFyIFtuYW1lTGVuZ3RoXTsKKyAgICBpZiAoIVMuZW1wdHkoKSkKKyAgICAgIHN0ZDo6bWVtY3B5KHRoaXMtPm5hbWUsIFMuZGF0YSgpLCBuYW1lTGVuZ3RoKTsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpQcmFnbWFDbGFuZ1RleHRTZWN0aW9uOyB9Cit9OworCitjbGFzcyBQcmVzZXJ2ZUFsbEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIFByZXNlcnZlQWxsQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBQcmVzZXJ2ZUFsbEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgUHJlc2VydmVBbGxBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OlByZXNlcnZlQWxsLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBQcmVzZXJ2ZUFsbEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlByZXNlcnZlQWxsOyB9Cit9OworCitjbGFzcyBQcmVzZXJ2ZU1vc3RBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBQcmVzZXJ2ZU1vc3RBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFByZXNlcnZlTW9zdEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgUHJlc2VydmVNb3N0QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpQcmVzZXJ2ZU1vc3QsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIFByZXNlcnZlTW9zdEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlByZXNlcnZlTW9zdDsgfQorfTsKKworY2xhc3MgUHRHdWFyZGVkQnlBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitFeHByICogYXJnOworCitwdWJsaWM6CisgIHN0YXRpYyBQdEd1YXJkZWRCeUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgRXhwciAqIEFyZywgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgUHRHdWFyZGVkQnlBdHRyKExvYywgQ3R4LCBBcmcsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgUHRHdWFyZGVkQnlBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIEV4cHIgKiBBcmcKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpQdEd1YXJkZWRCeSwgUiwgU0ksIHRydWUsIHRydWUpCisgICAgICAgICAgICAgICwgYXJnKEFyZykKKyAgeworICB9CisKKyAgUHRHdWFyZGVkQnlBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIEV4cHIgKiBnZXRBcmcoKSBjb25zdCB7CisgICAgcmV0dXJuIGFyZzsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpQdEd1YXJkZWRCeTsgfQorfTsKKworY2xhc3MgUHRHdWFyZGVkVmFyQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgUHRHdWFyZGVkVmFyQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBQdEd1YXJkZWRWYXJBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFB0R3VhcmRlZFZhckF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6UHRHdWFyZGVkVmFyLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBQdEd1YXJkZWRWYXJBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpQdEd1YXJkZWRWYXI7IH0KK307CisKK2NsYXNzIFB1cmVBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBQdXJlQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBQdXJlQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBQdXJlQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpQdXJlLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBQdXJlQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6UHVyZTsgfQorfTsKKworY2xhc3MgUmVnQ2FsbEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIFJlZ0NhbGxBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFJlZ0NhbGxBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFJlZ0NhbGxBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OlJlZ0NhbGwsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIFJlZ0NhbGxBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpSZWdDYWxsOyB9Cit9OworCitjbGFzcyBSZWxlYXNlQ2FwYWJpbGl0eUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKKyAgdW5zaWduZWQgYXJnc19TaXplOworICBFeHByICogKmFyZ3NfOworCitwdWJsaWM6CisgIGVudW0gU3BlbGxpbmcgeworICAgIEdOVV9yZWxlYXNlX2NhcGFiaWxpdHkgPSAwLAorICAgIENYWDExX2NsYW5nX3JlbGVhc2VfY2FwYWJpbGl0eSA9IDEsCisgICAgR05VX3JlbGVhc2Vfc2hhcmVkX2NhcGFiaWxpdHkgPSAyLAorICAgIENYWDExX2NsYW5nX3JlbGVhc2Vfc2hhcmVkX2NhcGFiaWxpdHkgPSAzLAorICAgIEdOVV9yZWxlYXNlX2dlbmVyaWNfY2FwYWJpbGl0eSA9IDQsCisgICAgQ1hYMTFfY2xhbmdfcmVsZWFzZV9nZW5lcmljX2NhcGFiaWxpdHkgPSA1LAorICAgIEdOVV91bmxvY2tfZnVuY3Rpb24gPSA2LAorICAgIENYWDExX2NsYW5nX3VubG9ja19mdW5jdGlvbiA9IDcKKyAgfTsKKworICBzdGF0aWMgUmVsZWFzZUNhcGFiaWxpdHlBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNwZWxsaW5nIFMsIEV4cHIgKiAqQXJncywgdW5zaWduZWQgQXJnc1NpemUsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFJlbGVhc2VDYXBhYmlsaXR5QXR0cihMb2MsIEN0eCwgQXJncywgQXJnc1NpemUsIFMpOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgUmVsZWFzZUNhcGFiaWxpdHlBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIEV4cHIgKiAqQXJncywgdW5zaWduZWQgQXJnc1NpemUKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpSZWxlYXNlQ2FwYWJpbGl0eSwgUiwgU0ksIHRydWUsIHRydWUpCisgICAgICAgICAgICAgICwgYXJnc19TaXplKEFyZ3NTaXplKSwgYXJnc18obmV3IChDdHgsIDE2KSBFeHByICpbYXJnc19TaXplXSkKKyAgeworICAgIHN0ZDo6Y29weShBcmdzLCBBcmdzICsgYXJnc19TaXplLCBhcmdzXyk7CisgIH0KKworICBSZWxlYXNlQ2FwYWJpbGl0eUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6UmVsZWFzZUNhcGFiaWxpdHksIFIsIFNJLCB0cnVlLCB0cnVlKQorICAgICAgICAgICAgICAsIGFyZ3NfU2l6ZSgwKSwgYXJnc18obnVsbHB0cikKKyAgeworICB9CisKKyAgUmVsZWFzZUNhcGFiaWxpdHlBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIFNwZWxsaW5nIGdldFNlbWFudGljU3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHNwZWxsaW5nIGxpc3QgaW5kZXgiKTsKKyAgICBjYXNlIDA6IHJldHVybiBHTlVfcmVsZWFzZV9jYXBhYmlsaXR5OworICAgIGNhc2UgMTogcmV0dXJuIENYWDExX2NsYW5nX3JlbGVhc2VfY2FwYWJpbGl0eTsKKyAgICBjYXNlIDI6IHJldHVybiBHTlVfcmVsZWFzZV9zaGFyZWRfY2FwYWJpbGl0eTsKKyAgICBjYXNlIDM6IHJldHVybiBDWFgxMV9jbGFuZ19yZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5OworICAgIGNhc2UgNDogcmV0dXJuIEdOVV9yZWxlYXNlX2dlbmVyaWNfY2FwYWJpbGl0eTsKKyAgICBjYXNlIDU6IHJldHVybiBDWFgxMV9jbGFuZ19yZWxlYXNlX2dlbmVyaWNfY2FwYWJpbGl0eTsKKyAgICBjYXNlIDY6IHJldHVybiBHTlVfdW5sb2NrX2Z1bmN0aW9uOworICAgIGNhc2UgNzogcmV0dXJuIENYWDExX2NsYW5nX3VubG9ja19mdW5jdGlvbjsKKyAgfQorICB9CisgIGJvb2wgaXNTaGFyZWQoKSBjb25zdCB7IHJldHVybiBTcGVsbGluZ0xpc3RJbmRleCA9PSAyIHx8CisgICAgU3BlbGxpbmdMaXN0SW5kZXggPT0gMzsgfQorICBib29sIGlzR2VuZXJpYygpIGNvbnN0IHsgcmV0dXJuIFNwZWxsaW5nTGlzdEluZGV4ID09IDQgfHwKKyAgICBTcGVsbGluZ0xpc3RJbmRleCA9PSA1IHx8CisgICAgU3BlbGxpbmdMaXN0SW5kZXggPT0gNiB8fAorICAgIFNwZWxsaW5nTGlzdEluZGV4ID09IDc7IH0KKyAgdHlwZWRlZiBFeHByICoqIGFyZ3NfaXRlcmF0b3I7CisgIGFyZ3NfaXRlcmF0b3IgYXJnc19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGFyZ3NfOyB9CisgIGFyZ3NfaXRlcmF0b3IgYXJnc19lbmQoKSBjb25zdCB7IHJldHVybiBhcmdzXyArIGFyZ3NfU2l6ZTsgfQorICB1bnNpZ25lZCBhcmdzX3NpemUoKSBjb25zdCB7IHJldHVybiBhcmdzX1NpemU7IH0KKyAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8YXJnc19pdGVyYXRvcj4gYXJncygpIGNvbnN0IHsgcmV0dXJuIGxsdm06Om1ha2VfcmFuZ2UoYXJnc19iZWdpbigpLCBhcmdzX2VuZCgpKTsgfQorCisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlJlbGVhc2VDYXBhYmlsaXR5OyB9Cit9OworCitjbGFzcyBSZW5kZXJTY3JpcHRLZXJuZWxBdHRyIDogcHVibGljIEF0dHIgeworcHVibGljOgorICBzdGF0aWMgUmVuZGVyU2NyaXB0S2VybmVsQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBSZW5kZXJTY3JpcHRLZXJuZWxBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFJlbmRlclNjcmlwdEtlcm5lbEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBBdHRyKGF0dHI6OlJlbmRlclNjcmlwdEtlcm5lbCwgUiwgU0ksIGZhbHNlKQorICB7CisgIH0KKworICBSZW5kZXJTY3JpcHRLZXJuZWxBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpSZW5kZXJTY3JpcHRLZXJuZWw7IH0KK307CisKK2NsYXNzIFJlcWRXb3JrR3JvdXBTaXplQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgewordW5zaWduZWQgeERpbTsKKwordW5zaWduZWQgeURpbTsKKwordW5zaWduZWQgekRpbTsKKworcHVibGljOgorICBzdGF0aWMgUmVxZFdvcmtHcm91cFNpemVBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIHVuc2lnbmVkIFhEaW0sIHVuc2lnbmVkIFlEaW0sIHVuc2lnbmVkIFpEaW0sIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFJlcWRXb3JrR3JvdXBTaXplQXR0cihMb2MsIEN0eCwgWERpbSwgWURpbSwgWkRpbSwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBSZXFkV29ya0dyb3VwU2l6ZUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgWERpbQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFlEaW0KKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBaRGltCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6UmVxZFdvcmtHcm91cFNpemUsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgeERpbShYRGltKQorICAgICAgICAgICAgICAsIHlEaW0oWURpbSkKKyAgICAgICAgICAgICAgLCB6RGltKFpEaW0pCisgIHsKKyAgfQorCisgIFJlcWRXb3JrR3JvdXBTaXplQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICB1bnNpZ25lZCBnZXRYRGltKCkgY29uc3QgeworICAgIHJldHVybiB4RGltOworICB9CisKKyAgdW5zaWduZWQgZ2V0WURpbSgpIGNvbnN0IHsKKyAgICByZXR1cm4geURpbTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFpEaW0oKSBjb25zdCB7CisgICAgcmV0dXJuIHpEaW07CisgIH0KKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6UmVxZFdvcmtHcm91cFNpemU7IH0KK307CisKK2NsYXNzIFJlcXVpcmVDb25zdGFudEluaXRBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBSZXF1aXJlQ29uc3RhbnRJbml0QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBSZXF1aXJlQ29uc3RhbnRJbml0QXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBSZXF1aXJlQ29uc3RhbnRJbml0QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpSZXF1aXJlQ29uc3RhbnRJbml0LCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBSZXF1aXJlQ29uc3RhbnRJbml0QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6UmVxdWlyZUNvbnN0YW50SW5pdDsgfQorfTsKKworY2xhc3MgUmVxdWlyZXNDYXBhYmlsaXR5QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworICB1bnNpZ25lZCBhcmdzX1NpemU7CisgIEV4cHIgKiAqYXJnc187CisKK3B1YmxpYzoKKyAgZW51bSBTcGVsbGluZyB7CisgICAgR05VX3JlcXVpcmVzX2NhcGFiaWxpdHkgPSAwLAorICAgIENYWDExX2NsYW5nX3JlcXVpcmVzX2NhcGFiaWxpdHkgPSAxLAorICAgIEdOVV9leGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQgPSAyLAorICAgIENYWDExX2NsYW5nX2V4Y2x1c2l2ZV9sb2Nrc19yZXF1aXJlZCA9IDMsCisgICAgR05VX3JlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5ID0gNCwKKyAgICBDWFgxMV9jbGFuZ19yZXF1aXJlc19zaGFyZWRfY2FwYWJpbGl0eSA9IDUsCisgICAgR05VX3NoYXJlZF9sb2Nrc19yZXF1aXJlZCA9IDYsCisgICAgQ1hYMTFfY2xhbmdfc2hhcmVkX2xvY2tzX3JlcXVpcmVkID0gNworICB9OworCisgIHN0YXRpYyBSZXF1aXJlc0NhcGFiaWxpdHlBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNwZWxsaW5nIFMsIEV4cHIgKiAqQXJncywgdW5zaWduZWQgQXJnc1NpemUsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFJlcXVpcmVzQ2FwYWJpbGl0eUF0dHIoTG9jLCBDdHgsIEFyZ3MsIEFyZ3NTaXplLCBTKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFJlcXVpcmVzQ2FwYWJpbGl0eUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgRXhwciAqICpBcmdzLCB1bnNpZ25lZCBBcmdzU2l6ZQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OlJlcXVpcmVzQ2FwYWJpbGl0eSwgUiwgU0ksIHRydWUsIHRydWUpCisgICAgICAgICAgICAgICwgYXJnc19TaXplKEFyZ3NTaXplKSwgYXJnc18obmV3IChDdHgsIDE2KSBFeHByICpbYXJnc19TaXplXSkKKyAgeworICAgIHN0ZDo6Y29weShBcmdzLCBBcmdzICsgYXJnc19TaXplLCBhcmdzXyk7CisgIH0KKworICBSZXF1aXJlc0NhcGFiaWxpdHlBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OlJlcXVpcmVzQ2FwYWJpbGl0eSwgUiwgU0ksIHRydWUsIHRydWUpCisgICAgICAgICAgICAgICwgYXJnc19TaXplKDApLCBhcmdzXyhudWxscHRyKQorICB7CisgIH0KKworICBSZXF1aXJlc0NhcGFiaWxpdHlBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIFNwZWxsaW5nIGdldFNlbWFudGljU3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHNwZWxsaW5nIGxpc3QgaW5kZXgiKTsKKyAgICBjYXNlIDA6IHJldHVybiBHTlVfcmVxdWlyZXNfY2FwYWJpbGl0eTsKKyAgICBjYXNlIDE6IHJldHVybiBDWFgxMV9jbGFuZ19yZXF1aXJlc19jYXBhYmlsaXR5OworICAgIGNhc2UgMjogcmV0dXJuIEdOVV9leGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQ7CisgICAgY2FzZSAzOiByZXR1cm4gQ1hYMTFfY2xhbmdfZXhjbHVzaXZlX2xvY2tzX3JlcXVpcmVkOworICAgIGNhc2UgNDogcmV0dXJuIEdOVV9yZXF1aXJlc19zaGFyZWRfY2FwYWJpbGl0eTsKKyAgICBjYXNlIDU6IHJldHVybiBDWFgxMV9jbGFuZ19yZXF1aXJlc19zaGFyZWRfY2FwYWJpbGl0eTsKKyAgICBjYXNlIDY6IHJldHVybiBHTlVfc2hhcmVkX2xvY2tzX3JlcXVpcmVkOworICAgIGNhc2UgNzogcmV0dXJuIENYWDExX2NsYW5nX3NoYXJlZF9sb2Nrc19yZXF1aXJlZDsKKyAgfQorICB9CisgIGJvb2wgaXNTaGFyZWQoKSBjb25zdCB7IHJldHVybiBTcGVsbGluZ0xpc3RJbmRleCA9PSA0IHx8CisgICAgU3BlbGxpbmdMaXN0SW5kZXggPT0gNSB8fAorICAgIFNwZWxsaW5nTGlzdEluZGV4ID09IDYgfHwKKyAgICBTcGVsbGluZ0xpc3RJbmRleCA9PSA3OyB9CisgIHR5cGVkZWYgRXhwciAqKiBhcmdzX2l0ZXJhdG9yOworICBhcmdzX2l0ZXJhdG9yIGFyZ3NfYmVnaW4oKSBjb25zdCB7IHJldHVybiBhcmdzXzsgfQorICBhcmdzX2l0ZXJhdG9yIGFyZ3NfZW5kKCkgY29uc3QgeyByZXR1cm4gYXJnc18gKyBhcmdzX1NpemU7IH0KKyAgdW5zaWduZWQgYXJnc19zaXplKCkgY29uc3QgeyByZXR1cm4gYXJnc19TaXplOyB9CisgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGFyZ3NfaXRlcmF0b3I+IGFyZ3MoKSBjb25zdCB7IHJldHVybiBsbHZtOjptYWtlX3JhbmdlKGFyZ3NfYmVnaW4oKSwgYXJnc19lbmQoKSk7IH0KKworCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpSZXF1aXJlc0NhcGFiaWxpdHk7IH0KK307CisKK2NsYXNzIFJlc3RyaWN0QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBlbnVtIFNwZWxsaW5nIHsKKyAgICBEZWNsc3BlY19yZXN0cmljdCA9IDAsCisgICAgR05VX21hbGxvYyA9IDEsCisgICAgQ1hYMTFfZ251X21hbGxvYyA9IDIKKyAgfTsKKworICBzdGF0aWMgUmVzdHJpY3RBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNwZWxsaW5nIFMsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFJlc3RyaWN0QXR0cihMb2MsIEN0eCwgUyk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBSZXN0cmljdEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6UmVzdHJpY3QsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIFJlc3RyaWN0QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBTcGVsbGluZyBnZXRTZW1hbnRpY1NwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzcGVsbGluZyBsaXN0IGluZGV4Iik7CisgICAgY2FzZSAwOiByZXR1cm4gRGVjbHNwZWNfcmVzdHJpY3Q7CisgICAgY2FzZSAxOiByZXR1cm4gR05VX21hbGxvYzsKKyAgICBjYXNlIDI6IHJldHVybiBDWFgxMV9nbnVfbWFsbG9jOworICB9CisgIH0KKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlJlc3RyaWN0OyB9Cit9OworCitjbGFzcyBSZXR1cm5UeXBlc3RhdGVBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIGVudW0gQ29uc3VtZWRTdGF0ZSB7CisgICAgVW5rbm93biwKKyAgICBDb25zdW1lZCwKKyAgICBVbmNvbnN1bWVkCisgIH07Citwcml2YXRlOgorICBDb25zdW1lZFN0YXRlIHN0YXRlOworCitwdWJsaWM6CisgIHN0YXRpYyBSZXR1cm5UeXBlc3RhdGVBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIENvbnN1bWVkU3RhdGUgU3RhdGUsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFJldHVyblR5cGVzdGF0ZUF0dHIoTG9jLCBDdHgsIFN0YXRlLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFJldHVyblR5cGVzdGF0ZUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgQ29uc3VtZWRTdGF0ZSBTdGF0ZQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OlJldHVyblR5cGVzdGF0ZSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBzdGF0ZShTdGF0ZSkKKyAgeworICB9CisKKyAgUmV0dXJuVHlwZXN0YXRlQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBDb25zdW1lZFN0YXRlIGdldFN0YXRlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0ZTsKKyAgfQorCisgIHN0YXRpYyBib29sIENvbnZlcnRTdHJUb0NvbnN1bWVkU3RhdGUoU3RyaW5nUmVmIFZhbCwgQ29uc3VtZWRTdGF0ZSAmT3V0KSB7CisgICAgT3B0aW9uYWw8Q29uc3VtZWRTdGF0ZT4gUiA9IGxsdm06OlN0cmluZ1N3aXRjaDxPcHRpb25hbDxDb25zdW1lZFN0YXRlPj4oVmFsKQorICAgICAgLkNhc2UoInVua25vd24iLCBSZXR1cm5UeXBlc3RhdGVBdHRyOjpVbmtub3duKQorICAgICAgLkNhc2UoImNvbnN1bWVkIiwgUmV0dXJuVHlwZXN0YXRlQXR0cjo6Q29uc3VtZWQpCisgICAgICAuQ2FzZSgidW5jb25zdW1lZCIsIFJldHVyblR5cGVzdGF0ZUF0dHI6OlVuY29uc3VtZWQpCisgICAgICAuRGVmYXVsdChPcHRpb25hbDxDb25zdW1lZFN0YXRlPigpKTsKKyAgICBpZiAoUikgeworICAgICAgT3V0ID0gKlI7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RhdGljIGNvbnN0IGNoYXIgKkNvbnZlcnRDb25zdW1lZFN0YXRlVG9TdHIoQ29uc3VtZWRTdGF0ZSBWYWwpIHsKKyAgICBzd2l0Y2goVmFsKSB7CisgICAgY2FzZSBSZXR1cm5UeXBlc3RhdGVBdHRyOjpVbmtub3duOiByZXR1cm4gInVua25vd24iOworICAgIGNhc2UgUmV0dXJuVHlwZXN0YXRlQXR0cjo6Q29uc3VtZWQ6IHJldHVybiAiY29uc3VtZWQiOworICAgIGNhc2UgUmV0dXJuVHlwZXN0YXRlQXR0cjo6VW5jb25zdW1lZDogcmV0dXJuICJ1bmNvbnN1bWVkIjsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiTm8gZW51bWVyYXRvciB3aXRoIHRoYXQgdmFsdWUiKTsKKyAgfQorCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6UmV0dXJuVHlwZXN0YXRlOyB9Cit9OworCitjbGFzcyBSZXR1cm5zTm9uTnVsbEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIFJldHVybnNOb25OdWxsQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBSZXR1cm5zTm9uTnVsbEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgUmV0dXJuc05vbk51bGxBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OlJldHVybnNOb25OdWxsLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBSZXR1cm5zTm9uTnVsbEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlJldHVybnNOb25OdWxsOyB9Cit9OworCitjbGFzcyBSZXR1cm5zVHdpY2VBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBSZXR1cm5zVHdpY2VBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFJldHVybnNUd2ljZUF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgUmV0dXJuc1R3aWNlQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpSZXR1cm5zVHdpY2UsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIFJldHVybnNUd2ljZUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlJldHVybnNUd2ljZTsgfQorfTsKKworY2xhc3MgU2NvcGVkTG9ja2FibGVBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBTY29wZWRMb2NrYWJsZUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgU2NvcGVkTG9ja2FibGVBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFNjb3BlZExvY2thYmxlQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpTY29wZWRMb2NrYWJsZSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgU2NvcGVkTG9ja2FibGVBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpTY29wZWRMb2NrYWJsZTsgfQorfTsKKworY2xhc3MgU2VjdGlvbkF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3Vuc2lnbmVkIG5hbWVMZW5ndGg7CitjaGFyICpuYW1lOworCitwdWJsaWM6CisgIGVudW0gU3BlbGxpbmcgeworICAgIEdOVV9zZWN0aW9uID0gMCwKKyAgICBDWFgxMV9nbnVfc2VjdGlvbiA9IDEsCisgICAgRGVjbHNwZWNfYWxsb2NhdGUgPSAyCisgIH07CisKKyAgc3RhdGljIFNlY3Rpb25BdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNwZWxsaW5nIFMsIGxsdm06OlN0cmluZ1JlZiBOYW1lLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBTZWN0aW9uQXR0cihMb2MsIEN0eCwgTmFtZSwgUyk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBTZWN0aW9uQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBsbHZtOjpTdHJpbmdSZWYgTmFtZQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OlNlY3Rpb24sIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgbmFtZUxlbmd0aChOYW1lLnNpemUoKSksbmFtZShuZXcgKEN0eCwgMSkgY2hhcltuYW1lTGVuZ3RoXSkKKyAgeworICAgICAgaWYgKCFOYW1lLmVtcHR5KCkpCisgICAgICAgIHN0ZDo6bWVtY3B5KG5hbWUsIE5hbWUuZGF0YSgpLCBuYW1lTGVuZ3RoKTsKKyAgfQorCisgIFNlY3Rpb25BdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIFNwZWxsaW5nIGdldFNlbWFudGljU3BlbGxpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAoU3BlbGxpbmdMaXN0SW5kZXgpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHNwZWxsaW5nIGxpc3QgaW5kZXgiKTsKKyAgICBjYXNlIDA6IHJldHVybiBHTlVfc2VjdGlvbjsKKyAgICBjYXNlIDE6IHJldHVybiBDWFgxMV9nbnVfc2VjdGlvbjsKKyAgICBjYXNlIDI6IHJldHVybiBEZWNsc3BlY19hbGxvY2F0ZTsKKyAgfQorICB9CisgIGxsdm06OlN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjpTdHJpbmdSZWYobmFtZSwgbmFtZUxlbmd0aCk7CisgIH0KKyAgdW5zaWduZWQgZ2V0TmFtZUxlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmFtZUxlbmd0aDsKKyAgfQorICB2b2lkIHNldE5hbWUoQVNUQ29udGV4dCAmQywgbGx2bTo6U3RyaW5nUmVmIFMpIHsKKyAgICBuYW1lTGVuZ3RoID0gUy5zaXplKCk7CisgICAgdGhpcy0+bmFtZSA9IG5ldyAoQywgMSkgY2hhciBbbmFtZUxlbmd0aF07CisgICAgaWYgKCFTLmVtcHR5KCkpCisgICAgICBzdGQ6Om1lbWNweSh0aGlzLT5uYW1lLCBTLmRhdGEoKSwgbmFtZUxlbmd0aCk7CisgIH0KKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6U2VjdGlvbjsgfQorfTsKKworY2xhc3MgU2VsZWN0QW55QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgU2VsZWN0QW55QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBTZWxlY3RBbnlBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFNlbGVjdEFueUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6U2VsZWN0QW55LCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBTZWxlY3RBbnlBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpTZWxlY3RBbnk7IH0KK307CisKK2NsYXNzIFNlbnRpbmVsQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworaW50IHNlbnRpbmVsOworCitpbnQgbnVsbFBvczsKKworcHVibGljOgorICBzdGF0aWMgU2VudGluZWxBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIGludCBTZW50aW5lbCwgaW50IE51bGxQb3MsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFNlbnRpbmVsQXR0cihMb2MsIEN0eCwgU2VudGluZWwsIE51bGxQb3MsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgU2VudGluZWxBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIGludCBTZW50aW5lbAorICAgICAgICAgICAgICAsIGludCBOdWxsUG9zCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6U2VudGluZWwsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgc2VudGluZWwoU2VudGluZWwpCisgICAgICAgICAgICAgICwgbnVsbFBvcyhOdWxsUG9zKQorICB7CisgIH0KKworICBTZW50aW5lbEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6U2VudGluZWwsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgc2VudGluZWwoKQorICAgICAgICAgICAgICAsIG51bGxQb3MoKQorICB7CisgIH0KKworICBTZW50aW5lbEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgaW50IGdldFNlbnRpbmVsKCkgY29uc3QgeworICAgIHJldHVybiBzZW50aW5lbDsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBpbnQgRGVmYXVsdFNlbnRpbmVsID0gMDsKKworICBpbnQgZ2V0TnVsbFBvcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbFBvczsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBpbnQgRGVmYXVsdE51bGxQb3MgPSAwOworCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpTZW50aW5lbDsgfQorfTsKKworY2xhc3MgU2V0VHlwZXN0YXRlQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBlbnVtIENvbnN1bWVkU3RhdGUgeworICAgIFVua25vd24sCisgICAgQ29uc3VtZWQsCisgICAgVW5jb25zdW1lZAorICB9OworcHJpdmF0ZToKKyAgQ29uc3VtZWRTdGF0ZSBuZXdTdGF0ZTsKKworcHVibGljOgorICBzdGF0aWMgU2V0VHlwZXN0YXRlQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBDb25zdW1lZFN0YXRlIE5ld1N0YXRlLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBTZXRUeXBlc3RhdGVBdHRyKExvYywgQ3R4LCBOZXdTdGF0ZSwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBTZXRUeXBlc3RhdGVBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIENvbnN1bWVkU3RhdGUgTmV3U3RhdGUKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpTZXRUeXBlc3RhdGUsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgbmV3U3RhdGUoTmV3U3RhdGUpCisgIHsKKyAgfQorCisgIFNldFR5cGVzdGF0ZUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgQ29uc3VtZWRTdGF0ZSBnZXROZXdTdGF0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3U3RhdGU7CisgIH0KKworICBzdGF0aWMgYm9vbCBDb252ZXJ0U3RyVG9Db25zdW1lZFN0YXRlKFN0cmluZ1JlZiBWYWwsIENvbnN1bWVkU3RhdGUgJk91dCkgeworICAgIE9wdGlvbmFsPENvbnN1bWVkU3RhdGU+IFIgPSBsbHZtOjpTdHJpbmdTd2l0Y2g8T3B0aW9uYWw8Q29uc3VtZWRTdGF0ZT4+KFZhbCkKKyAgICAgIC5DYXNlKCJ1bmtub3duIiwgU2V0VHlwZXN0YXRlQXR0cjo6VW5rbm93bikKKyAgICAgIC5DYXNlKCJjb25zdW1lZCIsIFNldFR5cGVzdGF0ZUF0dHI6OkNvbnN1bWVkKQorICAgICAgLkNhc2UoInVuY29uc3VtZWQiLCBTZXRUeXBlc3RhdGVBdHRyOjpVbmNvbnN1bWVkKQorICAgICAgLkRlZmF1bHQoT3B0aW9uYWw8Q29uc3VtZWRTdGF0ZT4oKSk7CisgICAgaWYgKFIpIHsKKyAgICAgIE91dCA9ICpSOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBjaGFyICpDb252ZXJ0Q29uc3VtZWRTdGF0ZVRvU3RyKENvbnN1bWVkU3RhdGUgVmFsKSB7CisgICAgc3dpdGNoKFZhbCkgeworICAgIGNhc2UgU2V0VHlwZXN0YXRlQXR0cjo6VW5rbm93bjogcmV0dXJuICJ1bmtub3duIjsKKyAgICBjYXNlIFNldFR5cGVzdGF0ZUF0dHI6OkNvbnN1bWVkOiByZXR1cm4gImNvbnN1bWVkIjsKKyAgICBjYXNlIFNldFR5cGVzdGF0ZUF0dHI6OlVuY29uc3VtZWQ6IHJldHVybiAidW5jb25zdW1lZCI7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIk5vIGVudW1lcmF0b3Igd2l0aCB0aGF0IHZhbHVlIik7CisgIH0KKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlNldFR5cGVzdGF0ZTsgfQorfTsKKworY2xhc3MgU2hhcmVkVHJ5bG9ja0Z1bmN0aW9uQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworRXhwciAqIHN1Y2Nlc3NWYWx1ZTsKKworICB1bnNpZ25lZCBhcmdzX1NpemU7CisgIEV4cHIgKiAqYXJnc187CisKK3B1YmxpYzoKKyAgc3RhdGljIFNoYXJlZFRyeWxvY2tGdW5jdGlvbkF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgRXhwciAqIFN1Y2Nlc3NWYWx1ZSwgRXhwciAqICpBcmdzLCB1bnNpZ25lZCBBcmdzU2l6ZSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgU2hhcmVkVHJ5bG9ja0Z1bmN0aW9uQXR0cihMb2MsIEN0eCwgU3VjY2Vzc1ZhbHVlLCBBcmdzLCBBcmdzU2l6ZSwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBTaGFyZWRUcnlsb2NrRnVuY3Rpb25BdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIEV4cHIgKiBTdWNjZXNzVmFsdWUKKyAgICAgICAgICAgICAgLCBFeHByICogKkFyZ3MsIHVuc2lnbmVkIEFyZ3NTaXplCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6U2hhcmVkVHJ5bG9ja0Z1bmN0aW9uLCBSLCBTSSwgdHJ1ZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgLCBzdWNjZXNzVmFsdWUoU3VjY2Vzc1ZhbHVlKQorICAgICAgICAgICAgICAsIGFyZ3NfU2l6ZShBcmdzU2l6ZSksIGFyZ3NfKG5ldyAoQ3R4LCAxNikgRXhwciAqW2FyZ3NfU2l6ZV0pCisgIHsKKyAgICBzdGQ6OmNvcHkoQXJncywgQXJncyArIGFyZ3NfU2l6ZSwgYXJnc18pOworICB9CisKKyAgU2hhcmVkVHJ5bG9ja0Z1bmN0aW9uQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBFeHByICogU3VjY2Vzc1ZhbHVlCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6U2hhcmVkVHJ5bG9ja0Z1bmN0aW9uLCBSLCBTSSwgdHJ1ZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgLCBzdWNjZXNzVmFsdWUoU3VjY2Vzc1ZhbHVlKQorICAgICAgICAgICAgICAsIGFyZ3NfU2l6ZSgwKSwgYXJnc18obnVsbHB0cikKKyAgeworICB9CisKKyAgU2hhcmVkVHJ5bG9ja0Z1bmN0aW9uQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBFeHByICogZ2V0U3VjY2Vzc1ZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBzdWNjZXNzVmFsdWU7CisgIH0KKworICB0eXBlZGVmIEV4cHIgKiogYXJnc19pdGVyYXRvcjsKKyAgYXJnc19pdGVyYXRvciBhcmdzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gYXJnc187IH0KKyAgYXJnc19pdGVyYXRvciBhcmdzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGFyZ3NfICsgYXJnc19TaXplOyB9CisgIHVuc2lnbmVkIGFyZ3Nfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGFyZ3NfU2l6ZTsgfQorICBsbHZtOjppdGVyYXRvcl9yYW5nZTxhcmdzX2l0ZXJhdG9yPiBhcmdzKCkgY29uc3QgeyByZXR1cm4gbGx2bTo6bWFrZV9yYW5nZShhcmdzX2JlZ2luKCksIGFyZ3NfZW5kKCkpOyB9CisKKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6U2hhcmVkVHJ5bG9ja0Z1bmN0aW9uOyB9Cit9OworCitjbGFzcyBTdGRDYWxsQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgU3RkQ2FsbEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgU3RkQ2FsbEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgU3RkQ2FsbEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6U3RkQ2FsbCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgU3RkQ2FsbEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlN0ZENhbGw7IH0KK307CisKK2NsYXNzIFN1cHByZXNzQXR0ciA6IHB1YmxpYyBTdG10QXR0ciB7CisgIHVuc2lnbmVkIGRpYWdub3N0aWNJZGVudGlmaWVyc19TaXplOworICBTdHJpbmdSZWYgKmRpYWdub3N0aWNJZGVudGlmaWVyc187CisKK3B1YmxpYzoKKyAgc3RhdGljIFN1cHByZXNzQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTdHJpbmdSZWYgKkRpYWdub3N0aWNJZGVudGlmaWVycywgdW5zaWduZWQgRGlhZ25vc3RpY0lkZW50aWZpZXJzU2l6ZSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgU3VwcHJlc3NBdHRyKExvYywgQ3R4LCBEaWFnbm9zdGljSWRlbnRpZmllcnMsIERpYWdub3N0aWNJZGVudGlmaWVyc1NpemUsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgU3VwcHJlc3NBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIFN0cmluZ1JlZiAqRGlhZ25vc3RpY0lkZW50aWZpZXJzLCB1bnNpZ25lZCBEaWFnbm9zdGljSWRlbnRpZmllcnNTaXplCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBTdG10QXR0cihhdHRyOjpTdXBwcmVzcywgUiwgU0ksIGZhbHNlKQorICAgICAgICAgICAgICAsIGRpYWdub3N0aWNJZGVudGlmaWVyc19TaXplKERpYWdub3N0aWNJZGVudGlmaWVyc1NpemUpLCBkaWFnbm9zdGljSWRlbnRpZmllcnNfKG5ldyAoQ3R4LCAxNikgU3RyaW5nUmVmW2RpYWdub3N0aWNJZGVudGlmaWVyc19TaXplXSkKKyAgeworICAgIGZvciAoc2l6ZV90IEkgPSAwLCBFID0gZGlhZ25vc3RpY0lkZW50aWZpZXJzX1NpemU7IEkgIT0gRTsKKyAgICAgICAgICsrSSkgeworICAgICAgU3RyaW5nUmVmIFJlZiA9IERpYWdub3N0aWNJZGVudGlmaWVyc1tJXTsKKyAgICAgIGlmICghUmVmLmVtcHR5KCkpIHsKKyAgICAgICAgY2hhciAqTWVtID0gbmV3IChDdHgsIDEpIGNoYXJbUmVmLnNpemUoKV07CisgICAgICAgIHN0ZDo6bWVtY3B5KE1lbSwgUmVmLmRhdGEoKSwgUmVmLnNpemUoKSk7CisgICAgICAgIGRpYWdub3N0aWNJZGVudGlmaWVyc19bSV0gPSBTdHJpbmdSZWYoTWVtLCBSZWYuc2l6ZSgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBTdXBwcmVzc0F0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBTdG10QXR0cihhdHRyOjpTdXBwcmVzcywgUiwgU0ksIGZhbHNlKQorICAgICAgICAgICAgICAsIGRpYWdub3N0aWNJZGVudGlmaWVyc19TaXplKDApLCBkaWFnbm9zdGljSWRlbnRpZmllcnNfKG51bGxwdHIpCisgIHsKKyAgfQorCisgIFN1cHByZXNzQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICB0eXBlZGVmIFN0cmluZ1JlZiogZGlhZ25vc3RpY0lkZW50aWZpZXJzX2l0ZXJhdG9yOworICBkaWFnbm9zdGljSWRlbnRpZmllcnNfaXRlcmF0b3IgZGlhZ25vc3RpY0lkZW50aWZpZXJzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gZGlhZ25vc3RpY0lkZW50aWZpZXJzXzsgfQorICBkaWFnbm9zdGljSWRlbnRpZmllcnNfaXRlcmF0b3IgZGlhZ25vc3RpY0lkZW50aWZpZXJzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGRpYWdub3N0aWNJZGVudGlmaWVyc18gKyBkaWFnbm9zdGljSWRlbnRpZmllcnNfU2l6ZTsgfQorICB1bnNpZ25lZCBkaWFnbm9zdGljSWRlbnRpZmllcnNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGRpYWdub3N0aWNJZGVudGlmaWVyc19TaXplOyB9CisgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGRpYWdub3N0aWNJZGVudGlmaWVyc19pdGVyYXRvcj4gZGlhZ25vc3RpY0lkZW50aWZpZXJzKCkgY29uc3QgeyByZXR1cm4gbGx2bTo6bWFrZV9yYW5nZShkaWFnbm9zdGljSWRlbnRpZmllcnNfYmVnaW4oKSwgZGlhZ25vc3RpY0lkZW50aWZpZXJzX2VuZCgpKTsgfQorCisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlN1cHByZXNzOyB9Cit9OworCitjbGFzcyBTd2lmdENhbGxBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBTd2lmdENhbGxBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFN3aWZ0Q2FsbEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgU3dpZnRDYWxsQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpTd2lmdENhbGwsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIFN3aWZ0Q2FsbEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlN3aWZ0Q2FsbDsgfQorfTsKKworY2xhc3MgU3dpZnRDb250ZXh0QXR0ciA6IHB1YmxpYyBQYXJhbWV0ZXJBQklBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIFN3aWZ0Q29udGV4dEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgU3dpZnRDb250ZXh0QXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBTd2lmdENvbnRleHRBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogUGFyYW1ldGVyQUJJQXR0cihhdHRyOjpTd2lmdENvbnRleHQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIFN3aWZ0Q29udGV4dEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlN3aWZ0Q29udGV4dDsgfQorfTsKKworY2xhc3MgU3dpZnRFcnJvclJlc3VsdEF0dHIgOiBwdWJsaWMgUGFyYW1ldGVyQUJJQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBTd2lmdEVycm9yUmVzdWx0QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBTd2lmdEVycm9yUmVzdWx0QXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBTd2lmdEVycm9yUmVzdWx0QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IFBhcmFtZXRlckFCSUF0dHIoYXR0cjo6U3dpZnRFcnJvclJlc3VsdCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgU3dpZnRFcnJvclJlc3VsdEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlN3aWZ0RXJyb3JSZXN1bHQ7IH0KK307CisKK2NsYXNzIFN3aWZ0SW5kaXJlY3RSZXN1bHRBdHRyIDogcHVibGljIFBhcmFtZXRlckFCSUF0dHIgeworcHVibGljOgorICBzdGF0aWMgU3dpZnRJbmRpcmVjdFJlc3VsdEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgU3dpZnRJbmRpcmVjdFJlc3VsdEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgU3dpZnRJbmRpcmVjdFJlc3VsdEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBQYXJhbWV0ZXJBQklBdHRyKGF0dHI6OlN3aWZ0SW5kaXJlY3RSZXN1bHQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIFN3aWZ0SW5kaXJlY3RSZXN1bHRBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpTd2lmdEluZGlyZWN0UmVzdWx0OyB9Cit9OworCitjbGFzcyBTeXNWQUJJQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgU3lzVkFCSUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgU3lzVkFCSUF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgU3lzVkFCSUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6U3lzVkFCSSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgU3lzVkFCSUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlN5c1ZBQkk7IH0KK307CisKK2NsYXNzIFRMU01vZGVsQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgewordW5zaWduZWQgbW9kZWxMZW5ndGg7CitjaGFyICptb2RlbDsKKworcHVibGljOgorICBzdGF0aWMgVExTTW9kZWxBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIGxsdm06OlN0cmluZ1JlZiBNb2RlbCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgVExTTW9kZWxBdHRyKExvYywgQ3R4LCBNb2RlbCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBUTFNNb2RlbEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgbGx2bTo6U3RyaW5nUmVmIE1vZGVsCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6VExTTW9kZWwsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgbW9kZWxMZW5ndGgoTW9kZWwuc2l6ZSgpKSxtb2RlbChuZXcgKEN0eCwgMSkgY2hhclttb2RlbExlbmd0aF0pCisgIHsKKyAgICAgIGlmICghTW9kZWwuZW1wdHkoKSkKKyAgICAgICAgc3RkOjptZW1jcHkobW9kZWwsIE1vZGVsLmRhdGEoKSwgbW9kZWxMZW5ndGgpOworICB9CisKKyAgVExTTW9kZWxBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIGxsdm06OlN0cmluZ1JlZiBnZXRNb2RlbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6U3RyaW5nUmVmKG1vZGVsLCBtb2RlbExlbmd0aCk7CisgIH0KKyAgdW5zaWduZWQgZ2V0TW9kZWxMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1vZGVsTGVuZ3RoOworICB9CisgIHZvaWQgc2V0TW9kZWwoQVNUQ29udGV4dCAmQywgbGx2bTo6U3RyaW5nUmVmIFMpIHsKKyAgICBtb2RlbExlbmd0aCA9IFMuc2l6ZSgpOworICAgIHRoaXMtPm1vZGVsID0gbmV3IChDLCAxKSBjaGFyIFttb2RlbExlbmd0aF07CisgICAgaWYgKCFTLmVtcHR5KCkpCisgICAgICBzdGQ6Om1lbWNweSh0aGlzLT5tb2RlbCwgUy5kYXRhKCksIG1vZGVsTGVuZ3RoKTsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpUTFNNb2RlbDsgfQorfTsKKworY2xhc3MgVGFyZ2V0QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgewordW5zaWduZWQgZmVhdHVyZXNTdHJMZW5ndGg7CitjaGFyICpmZWF0dXJlc1N0cjsKKworcHVibGljOgorICBzdGF0aWMgVGFyZ2V0QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBsbHZtOjpTdHJpbmdSZWYgRmVhdHVyZXNTdHIsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFRhcmdldEF0dHIoTG9jLCBDdHgsIEZlYXR1cmVzU3RyLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFRhcmdldEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgbGx2bTo6U3RyaW5nUmVmIEZlYXR1cmVzU3RyCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6VGFyZ2V0LCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIGZlYXR1cmVzU3RyTGVuZ3RoKEZlYXR1cmVzU3RyLnNpemUoKSksZmVhdHVyZXNTdHIobmV3IChDdHgsIDEpIGNoYXJbZmVhdHVyZXNTdHJMZW5ndGhdKQorICB7CisgICAgICBpZiAoIUZlYXR1cmVzU3RyLmVtcHR5KCkpCisgICAgICAgIHN0ZDo6bWVtY3B5KGZlYXR1cmVzU3RyLCBGZWF0dXJlc1N0ci5kYXRhKCksIGZlYXR1cmVzU3RyTGVuZ3RoKTsKKyAgfQorCisgIFRhcmdldEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgbGx2bTo6U3RyaW5nUmVmIGdldEZlYXR1cmVzU3RyKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjpTdHJpbmdSZWYoZmVhdHVyZXNTdHIsIGZlYXR1cmVzU3RyTGVuZ3RoKTsKKyAgfQorICB1bnNpZ25lZCBnZXRGZWF0dXJlc1N0ckxlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmVhdHVyZXNTdHJMZW5ndGg7CisgIH0KKyAgdm9pZCBzZXRGZWF0dXJlc1N0cihBU1RDb250ZXh0ICZDLCBsbHZtOjpTdHJpbmdSZWYgUykgeworICAgIGZlYXR1cmVzU3RyTGVuZ3RoID0gUy5zaXplKCk7CisgICAgdGhpcy0+ZmVhdHVyZXNTdHIgPSBuZXcgKEMsIDEpIGNoYXIgW2ZlYXR1cmVzU3RyTGVuZ3RoXTsKKyAgICBpZiAoIVMuZW1wdHkoKSkKKyAgICAgIHN0ZDo6bWVtY3B5KHRoaXMtPmZlYXR1cmVzU3RyLCBTLmRhdGEoKSwgZmVhdHVyZXNTdHJMZW5ndGgpOworICB9CisKKworICAgIHN0cnVjdCBQYXJzZWRUYXJnZXRBdHRyIHsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBGZWF0dXJlczsKKyAgICAgIFN0cmluZ1JlZiBBcmNoaXRlY3R1cmU7CisgICAgICBib29sIER1cGxpY2F0ZUFyY2hpdGVjdHVyZSA9IGZhbHNlOworICAgICAgYm9vbCBvcGVyYXRvciA9PShjb25zdCBQYXJzZWRUYXJnZXRBdHRyICZPdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gRHVwbGljYXRlQXJjaGl0ZWN0dXJlID09IE90aGVyLkR1cGxpY2F0ZUFyY2hpdGVjdHVyZSAmJgorICAgICAgICAgICAgICAgQXJjaGl0ZWN0dXJlID09IE90aGVyLkFyY2hpdGVjdHVyZSAmJiBGZWF0dXJlcyA9PSBPdGhlci5GZWF0dXJlczsKKyAgICAgIH0KKyAgICB9OworICAgIFBhcnNlZFRhcmdldEF0dHIgcGFyc2UoKSBjb25zdCB7CisgICAgICByZXR1cm4gcGFyc2UoZ2V0RmVhdHVyZXNTdHIoKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8Y2xhc3MgQ29tcGFyZT4KKyAgICBQYXJzZWRUYXJnZXRBdHRyIHBhcnNlKENvbXBhcmUgY21wKSBjb25zdCB7CisgICAgICBQYXJzZWRUYXJnZXRBdHRyIEF0dHJzID0gcGFyc2UoKTsKKyAgICAgIGxsdm06OnNvcnQoc3RkOjpiZWdpbihBdHRycy5GZWF0dXJlcyksIHN0ZDo6ZW5kKEF0dHJzLkZlYXR1cmVzKSwgY21wKTsKKyAgICAgIHJldHVybiBBdHRyczsKKyAgICB9CisKKyAgICBib29sIGlzRGVmYXVsdFZlcnNpb24oKSBjb25zdCB7IHJldHVybiBnZXRGZWF0dXJlc1N0cigpID09ICJkZWZhdWx0IjsgfQorCisgICAgc3RhdGljIFBhcnNlZFRhcmdldEF0dHIgcGFyc2UoU3RyaW5nUmVmIEZlYXR1cmVzKSB7CisgICAgICBQYXJzZWRUYXJnZXRBdHRyIFJldDsKKyAgICAgIGlmIChGZWF0dXJlcyA9PSAiZGVmYXVsdCIpIHJldHVybiBSZXQ7CisgICAgICBTbWFsbFZlY3RvcjxTdHJpbmdSZWYsIDE+IEF0dHJGZWF0dXJlczsKKyAgICAgIEZlYXR1cmVzLnNwbGl0KEF0dHJGZWF0dXJlcywgIiwiKTsKKworICAgICAgLy8gR3JhYiB0aGUgdmFyaW91cyBmZWF0dXJlcyBhbmQgcHJlcGVuZCBhICIrIiB0byB0dXJuIG9uIHRoZSBmZWF0dXJlIHRvCisgICAgICAvLyB0aGUgYmFja2VuZCBhbmQgYWRkIHRoZW0gdG8gb3VyIGV4aXN0aW5nIHNldCBvZiBmZWF0dXJlcy4KKyAgICAgIGZvciAoYXV0byAmRmVhdHVyZSA6IEF0dHJGZWF0dXJlcykgeworICAgICAgICAvLyBHbyBhaGVhZCBhbmQgdHJpbSB3aGl0ZXNwYWNlIHJhdGhlciB0aGFuIGVpdGhlciBlcnJvcmluZyBvcgorICAgICAgICAvLyBhY2NlcHRpbmcgaXQgd2VpcmRseS4KKyAgICAgICAgRmVhdHVyZSA9IEZlYXR1cmUudHJpbSgpOworCisgICAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgY3B1IHR1bmluZyB0aGlzIHdheSBjdXJyZW50bHkuCisgICAgICAgIC8vIFRPRE86IFN1cHBvcnQgdGhlIGZwbWF0aCBvcHRpb24uIEl0IHdpbGwgcmVxdWlyZSBjaGVja2luZworICAgICAgICAvLyBvdmVyYWxsIGZlYXR1cmUgdmFsaWRpdHkgZm9yIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSByZXN0IG9mIHRoZQorICAgICAgICAvLyBhdHRyaWJ1dGVzIG9uIHRoZSBmdW5jdGlvbi4KKyAgICAgICAgaWYgKEZlYXR1cmUuc3RhcnRzd2l0aCgiZnBtYXRoPSIpIHx8IEZlYXR1cmUuc3RhcnRzd2l0aCgidHVuZT0iKSkKKwkgIGNvbnRpbnVlOworCisgICAgICAgIC8vIFdoaWxlIHdlJ3JlIGhlcmUgaXRlcmF0aW5nIGNoZWNrIGZvciBhIGRpZmZlcmVudCB0YXJnZXQgY3B1LgorICAgICAgICBpZiAoRmVhdHVyZS5zdGFydHN3aXRoKCJhcmNoPSIpKSB7CisgICAgICAgICAgaWYgKCFSZXQuQXJjaGl0ZWN0dXJlLmVtcHR5KCkpCisgICAgICAgICAgICBSZXQuRHVwbGljYXRlQXJjaGl0ZWN0dXJlID0gdHJ1ZTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBSZXQuQXJjaGl0ZWN0dXJlID0gRmVhdHVyZS5zcGxpdCgiPSIpLnNlY29uZC50cmltKCk7CisgICAgICAgIH0gZWxzZSBpZiAoRmVhdHVyZS5zdGFydHN3aXRoKCJuby0iKSkKKyAgICAgICAgICBSZXQuRmVhdHVyZXMucHVzaF9iYWNrKCItIiArIEZlYXR1cmUuc3BsaXQoIi0iKS5zZWNvbmQuc3RyKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgUmV0LkZlYXR1cmVzLnB1c2hfYmFjaygiKyIgKyBGZWF0dXJlLnN0cigpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBSZXQ7CisgICAgfQorICAKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpUYXJnZXQ7IH0KK307CisKK2NsYXNzIFRlc3RUeXBlc3RhdGVBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIGVudW0gQ29uc3VtZWRTdGF0ZSB7CisgICAgQ29uc3VtZWQsCisgICAgVW5jb25zdW1lZAorICB9OworcHJpdmF0ZToKKyAgQ29uc3VtZWRTdGF0ZSB0ZXN0U3RhdGU7CisKK3B1YmxpYzoKKyAgc3RhdGljIFRlc3RUeXBlc3RhdGVBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIENvbnN1bWVkU3RhdGUgVGVzdFN0YXRlLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBUZXN0VHlwZXN0YXRlQXR0cihMb2MsIEN0eCwgVGVzdFN0YXRlLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFRlc3RUeXBlc3RhdGVBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIENvbnN1bWVkU3RhdGUgVGVzdFN0YXRlCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6VGVzdFR5cGVzdGF0ZSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCB0ZXN0U3RhdGUoVGVzdFN0YXRlKQorICB7CisgIH0KKworICBUZXN0VHlwZXN0YXRlQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBDb25zdW1lZFN0YXRlIGdldFRlc3RTdGF0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdGVzdFN0YXRlOworICB9CisKKyAgc3RhdGljIGJvb2wgQ29udmVydFN0clRvQ29uc3VtZWRTdGF0ZShTdHJpbmdSZWYgVmFsLCBDb25zdW1lZFN0YXRlICZPdXQpIHsKKyAgICBPcHRpb25hbDxDb25zdW1lZFN0YXRlPiBSID0gbGx2bTo6U3RyaW5nU3dpdGNoPE9wdGlvbmFsPENvbnN1bWVkU3RhdGU+PihWYWwpCisgICAgICAuQ2FzZSgiY29uc3VtZWQiLCBUZXN0VHlwZXN0YXRlQXR0cjo6Q29uc3VtZWQpCisgICAgICAuQ2FzZSgidW5jb25zdW1lZCIsIFRlc3RUeXBlc3RhdGVBdHRyOjpVbmNvbnN1bWVkKQorICAgICAgLkRlZmF1bHQoT3B0aW9uYWw8Q29uc3VtZWRTdGF0ZT4oKSk7CisgICAgaWYgKFIpIHsKKyAgICAgIE91dCA9ICpSOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBjaGFyICpDb252ZXJ0Q29uc3VtZWRTdGF0ZVRvU3RyKENvbnN1bWVkU3RhdGUgVmFsKSB7CisgICAgc3dpdGNoKFZhbCkgeworICAgIGNhc2UgVGVzdFR5cGVzdGF0ZUF0dHI6OkNvbnN1bWVkOiByZXR1cm4gImNvbnN1bWVkIjsKKyAgICBjYXNlIFRlc3RUeXBlc3RhdGVBdHRyOjpVbmNvbnN1bWVkOiByZXR1cm4gInVuY29uc3VtZWQiOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJObyBlbnVtZXJhdG9yIHdpdGggdGhhdCB2YWx1ZSIpOworICB9CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpUZXN0VHlwZXN0YXRlOyB9Cit9OworCitjbGFzcyBUaGlzQ2FsbEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIFRoaXNDYWxsQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBUaGlzQ2FsbEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgVGhpc0NhbGxBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OlRoaXNDYWxsLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBUaGlzQ2FsbEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlRoaXNDYWxsOyB9Cit9OworCitjbGFzcyBUaHJlYWRBdHRyIDogcHVibGljIEF0dHIgeworcHVibGljOgorICBzdGF0aWMgVGhyZWFkQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBUaHJlYWRBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFRocmVhZEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBBdHRyKGF0dHI6OlRocmVhZCwgUiwgU0ksIGZhbHNlKQorICB7CisgIH0KKworICBUaHJlYWRBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpUaHJlYWQ7IH0KK307CisKK2NsYXNzIFRyYW5zcGFyZW50VW5pb25BdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBUcmFuc3BhcmVudFVuaW9uQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBUcmFuc3BhcmVudFVuaW9uQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBUcmFuc3BhcmVudFVuaW9uQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpUcmFuc3BhcmVudFVuaW9uLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBUcmFuc3BhcmVudFVuaW9uQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6VHJhbnNwYXJlbnRVbmlvbjsgfQorfTsKKworY2xhc3MgVHJpdmlhbEFCSUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIFRyaXZpYWxBQklBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFRyaXZpYWxBQklBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFRyaXZpYWxBQklBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OlRyaXZpYWxBQkksIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIFRyaXZpYWxBQklBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpUcml2aWFsQUJJOyB9Cit9OworCitjbGFzcyBUcnlBY3F1aXJlQ2FwYWJpbGl0eUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK0V4cHIgKiBzdWNjZXNzVmFsdWU7CisKKyAgdW5zaWduZWQgYXJnc19TaXplOworICBFeHByICogKmFyZ3NfOworCitwdWJsaWM6CisgIGVudW0gU3BlbGxpbmcgeworICAgIEdOVV90cnlfYWNxdWlyZV9jYXBhYmlsaXR5ID0gMCwKKyAgICBDWFgxMV9jbGFuZ190cnlfYWNxdWlyZV9jYXBhYmlsaXR5ID0gMSwKKyAgICBHTlVfdHJ5X2FjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkgPSAyLAorICAgIENYWDExX2NsYW5nX3RyeV9hY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5ID0gMworICB9OworCisgIHN0YXRpYyBUcnlBY3F1aXJlQ2FwYWJpbGl0eUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU3BlbGxpbmcgUywgRXhwciAqIFN1Y2Nlc3NWYWx1ZSwgRXhwciAqICpBcmdzLCB1bnNpZ25lZCBBcmdzU2l6ZSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgVHJ5QWNxdWlyZUNhcGFiaWxpdHlBdHRyKExvYywgQ3R4LCBTdWNjZXNzVmFsdWUsIEFyZ3MsIEFyZ3NTaXplLCBTKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFRyeUFjcXVpcmVDYXBhYmlsaXR5QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBFeHByICogU3VjY2Vzc1ZhbHVlCisgICAgICAgICAgICAgICwgRXhwciAqICpBcmdzLCB1bnNpZ25lZCBBcmdzU2l6ZQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OlRyeUFjcXVpcmVDYXBhYmlsaXR5LCBSLCBTSSwgdHJ1ZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgLCBzdWNjZXNzVmFsdWUoU3VjY2Vzc1ZhbHVlKQorICAgICAgICAgICAgICAsIGFyZ3NfU2l6ZShBcmdzU2l6ZSksIGFyZ3NfKG5ldyAoQ3R4LCAxNikgRXhwciAqW2FyZ3NfU2l6ZV0pCisgIHsKKyAgICBzdGQ6OmNvcHkoQXJncywgQXJncyArIGFyZ3NfU2l6ZSwgYXJnc18pOworICB9CisKKyAgVHJ5QWNxdWlyZUNhcGFiaWxpdHlBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIEV4cHIgKiBTdWNjZXNzVmFsdWUKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpUcnlBY3F1aXJlQ2FwYWJpbGl0eSwgUiwgU0ksIHRydWUsIHRydWUpCisgICAgICAgICAgICAgICwgc3VjY2Vzc1ZhbHVlKFN1Y2Nlc3NWYWx1ZSkKKyAgICAgICAgICAgICAgLCBhcmdzX1NpemUoMCksIGFyZ3NfKG51bGxwdHIpCisgIHsKKyAgfQorCisgIFRyeUFjcXVpcmVDYXBhYmlsaXR5QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBTcGVsbGluZyBnZXRTZW1hbnRpY1NwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzcGVsbGluZyBsaXN0IGluZGV4Iik7CisgICAgY2FzZSAwOiByZXR1cm4gR05VX3RyeV9hY3F1aXJlX2NhcGFiaWxpdHk7CisgICAgY2FzZSAxOiByZXR1cm4gQ1hYMTFfY2xhbmdfdHJ5X2FjcXVpcmVfY2FwYWJpbGl0eTsKKyAgICBjYXNlIDI6IHJldHVybiBHTlVfdHJ5X2FjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHk7CisgICAgY2FzZSAzOiByZXR1cm4gQ1hYMTFfY2xhbmdfdHJ5X2FjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHk7CisgIH0KKyAgfQorICBib29sIGlzU2hhcmVkKCkgY29uc3QgeyByZXR1cm4gU3BlbGxpbmdMaXN0SW5kZXggPT0gMiB8fAorICAgIFNwZWxsaW5nTGlzdEluZGV4ID09IDM7IH0KKyAgRXhwciAqIGdldFN1Y2Nlc3NWYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3VjY2Vzc1ZhbHVlOworICB9CisKKyAgdHlwZWRlZiBFeHByICoqIGFyZ3NfaXRlcmF0b3I7CisgIGFyZ3NfaXRlcmF0b3IgYXJnc19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGFyZ3NfOyB9CisgIGFyZ3NfaXRlcmF0b3IgYXJnc19lbmQoKSBjb25zdCB7IHJldHVybiBhcmdzXyArIGFyZ3NfU2l6ZTsgfQorICB1bnNpZ25lZCBhcmdzX3NpemUoKSBjb25zdCB7IHJldHVybiBhcmdzX1NpemU7IH0KKyAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8YXJnc19pdGVyYXRvcj4gYXJncygpIGNvbnN0IHsgcmV0dXJuIGxsdm06Om1ha2VfcmFuZ2UoYXJnc19iZWdpbigpLCBhcmdzX2VuZCgpKTsgfQorCisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlRyeUFjcXVpcmVDYXBhYmlsaXR5OyB9Cit9OworCitjbGFzcyBUeXBlVGFnRm9yRGF0YXR5cGVBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitJZGVudGlmaWVySW5mbyAqIGFyZ3VtZW50S2luZDsKKworVHlwZVNvdXJjZUluZm8gKiBtYXRjaGluZ0NUeXBlOworCitib29sIGxheW91dENvbXBhdGlibGU7CisKK2Jvb2wgbXVzdEJlTnVsbDsKKworcHVibGljOgorICBzdGF0aWMgVHlwZVRhZ0ZvckRhdGF0eXBlQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBJZGVudGlmaWVySW5mbyAqIEFyZ3VtZW50S2luZCwgVHlwZVNvdXJjZUluZm8gKiBNYXRjaGluZ0NUeXBlLCBib29sIExheW91dENvbXBhdGlibGUsIGJvb2wgTXVzdEJlTnVsbCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgVHlwZVRhZ0ZvckRhdGF0eXBlQXR0cihMb2MsIEN0eCwgQXJndW1lbnRLaW5kLCBNYXRjaGluZ0NUeXBlLCBMYXlvdXRDb21wYXRpYmxlLCBNdXN0QmVOdWxsLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFR5cGVUYWdGb3JEYXRhdHlwZUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgSWRlbnRpZmllckluZm8gKiBBcmd1bWVudEtpbmQKKyAgICAgICAgICAgICAgLCBUeXBlU291cmNlSW5mbyAqIE1hdGNoaW5nQ1R5cGUKKyAgICAgICAgICAgICAgLCBib29sIExheW91dENvbXBhdGlibGUKKyAgICAgICAgICAgICAgLCBib29sIE11c3RCZU51bGwKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpUeXBlVGFnRm9yRGF0YXR5cGUsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgYXJndW1lbnRLaW5kKEFyZ3VtZW50S2luZCkKKyAgICAgICAgICAgICAgLCBtYXRjaGluZ0NUeXBlKE1hdGNoaW5nQ1R5cGUpCisgICAgICAgICAgICAgICwgbGF5b3V0Q29tcGF0aWJsZShMYXlvdXRDb21wYXRpYmxlKQorICAgICAgICAgICAgICAsIG11c3RCZU51bGwoTXVzdEJlTnVsbCkKKyAgeworICB9CisKKyAgVHlwZVRhZ0ZvckRhdGF0eXBlQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBJZGVudGlmaWVySW5mbyAqIGdldEFyZ3VtZW50S2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gYXJndW1lbnRLaW5kOworICB9CisKKyAgUXVhbFR5cGUgZ2V0TWF0Y2hpbmdDVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWF0Y2hpbmdDVHlwZS0+Z2V0VHlwZSgpOworICB9ICBUeXBlU291cmNlSW5mbyAqIGdldE1hdGNoaW5nQ1R5cGVMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1hdGNoaW5nQ1R5cGU7CisgIH0KKworICBib29sIGdldExheW91dENvbXBhdGlibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGxheW91dENvbXBhdGlibGU7CisgIH0KKworICBib29sIGdldE11c3RCZU51bGwoKSBjb25zdCB7CisgICAgcmV0dXJuIG11c3RCZU51bGw7CisgIH0KKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6VHlwZVRhZ0ZvckRhdGF0eXBlOyB9Cit9OworCitjbGFzcyBUeXBlVmlzaWJpbGl0eUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgZW51bSBWaXNpYmlsaXR5VHlwZSB7CisgICAgRGVmYXVsdCwKKyAgICBIaWRkZW4sCisgICAgUHJvdGVjdGVkCisgIH07Citwcml2YXRlOgorICBWaXNpYmlsaXR5VHlwZSB2aXNpYmlsaXR5OworCitwdWJsaWM6CisgIHN0YXRpYyBUeXBlVmlzaWJpbGl0eUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgVmlzaWJpbGl0eVR5cGUgVmlzaWJpbGl0eSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgVHlwZVZpc2liaWxpdHlBdHRyKExvYywgQ3R4LCBWaXNpYmlsaXR5LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFR5cGVWaXNpYmlsaXR5QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBWaXNpYmlsaXR5VHlwZSBWaXNpYmlsaXR5CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6VHlwZVZpc2liaWxpdHksIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgdmlzaWJpbGl0eShWaXNpYmlsaXR5KQorICB7CisgIH0KKworICBUeXBlVmlzaWJpbGl0eUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgVmlzaWJpbGl0eVR5cGUgZ2V0VmlzaWJpbGl0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdmlzaWJpbGl0eTsKKyAgfQorCisgIHN0YXRpYyBib29sIENvbnZlcnRTdHJUb1Zpc2liaWxpdHlUeXBlKFN0cmluZ1JlZiBWYWwsIFZpc2liaWxpdHlUeXBlICZPdXQpIHsKKyAgICBPcHRpb25hbDxWaXNpYmlsaXR5VHlwZT4gUiA9IGxsdm06OlN0cmluZ1N3aXRjaDxPcHRpb25hbDxWaXNpYmlsaXR5VHlwZT4+KFZhbCkKKyAgICAgIC5DYXNlKCJkZWZhdWx0IiwgVHlwZVZpc2liaWxpdHlBdHRyOjpEZWZhdWx0KQorICAgICAgLkNhc2UoImhpZGRlbiIsIFR5cGVWaXNpYmlsaXR5QXR0cjo6SGlkZGVuKQorICAgICAgLkNhc2UoImludGVybmFsIiwgVHlwZVZpc2liaWxpdHlBdHRyOjpIaWRkZW4pCisgICAgICAuQ2FzZSgicHJvdGVjdGVkIiwgVHlwZVZpc2liaWxpdHlBdHRyOjpQcm90ZWN0ZWQpCisgICAgICAuRGVmYXVsdChPcHRpb25hbDxWaXNpYmlsaXR5VHlwZT4oKSk7CisgICAgaWYgKFIpIHsKKyAgICAgIE91dCA9ICpSOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBjaGFyICpDb252ZXJ0VmlzaWJpbGl0eVR5cGVUb1N0cihWaXNpYmlsaXR5VHlwZSBWYWwpIHsKKyAgICBzd2l0Y2goVmFsKSB7CisgICAgY2FzZSBUeXBlVmlzaWJpbGl0eUF0dHI6OkRlZmF1bHQ6IHJldHVybiAiZGVmYXVsdCI7CisgICAgY2FzZSBUeXBlVmlzaWJpbGl0eUF0dHI6OkhpZGRlbjogcmV0dXJuICJoaWRkZW4iOworICAgIGNhc2UgVHlwZVZpc2liaWxpdHlBdHRyOjpQcm90ZWN0ZWQ6IHJldHVybiAicHJvdGVjdGVkIjsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiTm8gZW51bWVyYXRvciB3aXRoIHRoYXQgdmFsdWUiKTsKKyAgfQorCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6VHlwZVZpc2liaWxpdHk7IH0KK307CisKK2NsYXNzIFVuYXZhaWxhYmxlQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgewordW5zaWduZWQgbWVzc2FnZUxlbmd0aDsKK2NoYXIgKm1lc3NhZ2U7CisKK3B1YmxpYzoKKyAgZW51bSBJbXBsaWNpdFJlYXNvbiB7CisgICAgSVJfTm9uZSwKKyAgICBJUl9BUkNGb3JiaWRkZW5UeXBlLAorICAgIElSX0ZvcmJpZGRlbldlYWssCisgICAgSVJfQVJDRm9yYmlkZGVuQ29udmVyc2lvbiwKKyAgICBJUl9BUkNJbml0UmV0dXJuc1VucmVsYXRlZCwKKyAgICBJUl9BUkNGaWVsZFdpdGhPd25lcnNoaXAKKyAgfTsKK3ByaXZhdGU6CisgIEltcGxpY2l0UmVhc29uIGltcGxpY2l0UmVhc29uOworCitwdWJsaWM6CisgIHN0YXRpYyBVbmF2YWlsYWJsZUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgbGx2bTo6U3RyaW5nUmVmIE1lc3NhZ2UsIEltcGxpY2l0UmVhc29uIEltcGxpY2l0UmVhc29uLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBVbmF2YWlsYWJsZUF0dHIoTG9jLCBDdHgsIE1lc3NhZ2UsIEltcGxpY2l0UmVhc29uLCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIHN0YXRpYyBVbmF2YWlsYWJsZUF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgbGx2bTo6U3RyaW5nUmVmIE1lc3NhZ2UsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFVuYXZhaWxhYmxlQXR0cihMb2MsIEN0eCwgTWVzc2FnZSwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBVbmF2YWlsYWJsZUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgbGx2bTo6U3RyaW5nUmVmIE1lc3NhZ2UKKyAgICAgICAgICAgICAgLCBJbXBsaWNpdFJlYXNvbiBJbXBsaWNpdFJlYXNvbgorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OlVuYXZhaWxhYmxlLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIG1lc3NhZ2VMZW5ndGgoTWVzc2FnZS5zaXplKCkpLG1lc3NhZ2UobmV3IChDdHgsIDEpIGNoYXJbbWVzc2FnZUxlbmd0aF0pCisgICAgICAgICAgICAgICwgaW1wbGljaXRSZWFzb24oSW1wbGljaXRSZWFzb24pCisgIHsKKyAgICAgIGlmICghTWVzc2FnZS5lbXB0eSgpKQorICAgICAgICBzdGQ6Om1lbWNweShtZXNzYWdlLCBNZXNzYWdlLmRhdGEoKSwgbWVzc2FnZUxlbmd0aCk7CisgIH0KKworICBVbmF2YWlsYWJsZUF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgbGx2bTo6U3RyaW5nUmVmIE1lc3NhZ2UKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpVbmF2YWlsYWJsZSwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBtZXNzYWdlTGVuZ3RoKE1lc3NhZ2Uuc2l6ZSgpKSxtZXNzYWdlKG5ldyAoQ3R4LCAxKSBjaGFyW21lc3NhZ2VMZW5ndGhdKQorICAgICAgICAgICAgICAsIGltcGxpY2l0UmVhc29uKEltcGxpY2l0UmVhc29uKDApKQorICB7CisgICAgICBpZiAoIU1lc3NhZ2UuZW1wdHkoKSkKKyAgICAgICAgc3RkOjptZW1jcHkobWVzc2FnZSwgTWVzc2FnZS5kYXRhKCksIG1lc3NhZ2VMZW5ndGgpOworICB9CisKKyAgVW5hdmFpbGFibGVBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OlVuYXZhaWxhYmxlLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIG1lc3NhZ2VMZW5ndGgoMCksbWVzc2FnZShudWxscHRyKQorICAgICAgICAgICAgICAsIGltcGxpY2l0UmVhc29uKEltcGxpY2l0UmVhc29uKDApKQorICB7CisgIH0KKworICBVbmF2YWlsYWJsZUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgbGx2bTo6U3RyaW5nUmVmIGdldE1lc3NhZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06OlN0cmluZ1JlZihtZXNzYWdlLCBtZXNzYWdlTGVuZ3RoKTsKKyAgfQorICB1bnNpZ25lZCBnZXRNZXNzYWdlTGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiBtZXNzYWdlTGVuZ3RoOworICB9CisgIHZvaWQgc2V0TWVzc2FnZShBU1RDb250ZXh0ICZDLCBsbHZtOjpTdHJpbmdSZWYgUykgeworICAgIG1lc3NhZ2VMZW5ndGggPSBTLnNpemUoKTsKKyAgICB0aGlzLT5tZXNzYWdlID0gbmV3IChDLCAxKSBjaGFyIFttZXNzYWdlTGVuZ3RoXTsKKyAgICBpZiAoIVMuZW1wdHkoKSkKKyAgICAgIHN0ZDo6bWVtY3B5KHRoaXMtPm1lc3NhZ2UsIFMuZGF0YSgpLCBtZXNzYWdlTGVuZ3RoKTsKKyAgfQorCisgIEltcGxpY2l0UmVhc29uIGdldEltcGxpY2l0UmVhc29uKCkgY29uc3QgeworICAgIHJldHVybiBpbXBsaWNpdFJlYXNvbjsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpVbmF2YWlsYWJsZTsgfQorfTsKKworY2xhc3MgVW51c2VkQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBlbnVtIFNwZWxsaW5nIHsKKyAgICBDWFgxMV9tYXliZV91bnVzZWQgPSAwLAorICAgIEdOVV91bnVzZWQgPSAxLAorICAgIENYWDExX2dudV91bnVzZWQgPSAyLAorICAgIEMyeF9tYXliZV91bnVzZWQgPSAzCisgIH07CisKKyAgc3RhdGljIFVudXNlZEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU3BlbGxpbmcgUywgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgVW51c2VkQXR0cihMb2MsIEN0eCwgUyk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBVbnVzZWRBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OlVudXNlZCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgVW51c2VkQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBTcGVsbGluZyBnZXRTZW1hbnRpY1NwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzcGVsbGluZyBsaXN0IGluZGV4Iik7CisgICAgY2FzZSAwOiByZXR1cm4gQ1hYMTFfbWF5YmVfdW51c2VkOworICAgIGNhc2UgMTogcmV0dXJuIEdOVV91bnVzZWQ7CisgICAgY2FzZSAyOiByZXR1cm4gQ1hYMTFfZ251X3VudXNlZDsKKyAgICBjYXNlIDM6IHJldHVybiBDMnhfbWF5YmVfdW51c2VkOworICB9CisgIH0KKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlVudXNlZDsgfQorfTsKKworY2xhc3MgVXNlZEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIFVzZWRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFVzZWRBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFVzZWRBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OlVzZWQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIFVzZWRBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpVc2VkOyB9Cit9OworCitjbGFzcyBVdWlkQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgewordW5zaWduZWQgZ3VpZExlbmd0aDsKK2NoYXIgKmd1aWQ7CisKK3B1YmxpYzoKKyAgc3RhdGljIFV1aWRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIGxsdm06OlN0cmluZ1JlZiBHdWlkLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBVdWlkQXR0cihMb2MsIEN0eCwgR3VpZCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBVdWlkQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCBsbHZtOjpTdHJpbmdSZWYgR3VpZAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OlV1aWQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgZ3VpZExlbmd0aChHdWlkLnNpemUoKSksZ3VpZChuZXcgKEN0eCwgMSkgY2hhcltndWlkTGVuZ3RoXSkKKyAgeworICAgICAgaWYgKCFHdWlkLmVtcHR5KCkpCisgICAgICAgIHN0ZDo6bWVtY3B5KGd1aWQsIEd1aWQuZGF0YSgpLCBndWlkTGVuZ3RoKTsKKyAgfQorCisgIFV1aWRBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIGxsdm06OlN0cmluZ1JlZiBnZXRHdWlkKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjpTdHJpbmdSZWYoZ3VpZCwgZ3VpZExlbmd0aCk7CisgIH0KKyAgdW5zaWduZWQgZ2V0R3VpZExlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ3VpZExlbmd0aDsKKyAgfQorICB2b2lkIHNldEd1aWQoQVNUQ29udGV4dCAmQywgbGx2bTo6U3RyaW5nUmVmIFMpIHsKKyAgICBndWlkTGVuZ3RoID0gUy5zaXplKCk7CisgICAgdGhpcy0+Z3VpZCA9IG5ldyAoQywgMSkgY2hhciBbZ3VpZExlbmd0aF07CisgICAgaWYgKCFTLmVtcHR5KCkpCisgICAgICBzdGQ6Om1lbWNweSh0aGlzLT5ndWlkLCBTLmRhdGEoKSwgZ3VpZExlbmd0aCk7CisgIH0KKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6VXVpZDsgfQorfTsKKworY2xhc3MgVmVjUmV0dXJuQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgVmVjUmV0dXJuQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBWZWNSZXR1cm5BdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFZlY1JldHVybkF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6VmVjUmV0dXJuLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBWZWNSZXR1cm5BdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpWZWNSZXR1cm47IH0KK307CisKK2NsYXNzIFZlY1R5cGVIaW50QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworVHlwZVNvdXJjZUluZm8gKiB0eXBlSGludDsKKworcHVibGljOgorICBzdGF0aWMgVmVjVHlwZUhpbnRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFR5cGVTb3VyY2VJbmZvICogVHlwZUhpbnQsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFZlY1R5cGVIaW50QXR0cihMb2MsIEN0eCwgVHlwZUhpbnQsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgVmVjVHlwZUhpbnRBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIFR5cGVTb3VyY2VJbmZvICogVHlwZUhpbnQKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpWZWNUeXBlSGludCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCB0eXBlSGludChUeXBlSGludCkKKyAgeworICB9CisKKyAgVmVjVHlwZUhpbnRBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisgIFF1YWxUeXBlIGdldFR5cGVIaW50KCkgY29uc3QgeworICAgIHJldHVybiB0eXBlSGludC0+Z2V0VHlwZSgpOworICB9ICBUeXBlU291cmNlSW5mbyAqIGdldFR5cGVIaW50TG9jKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlSGludDsKKyAgfQorCisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpWZWNUeXBlSGludDsgfQorfTsKKworY2xhc3MgVmVjdG9yQ2FsbEF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3B1YmxpYzoKKyAgc3RhdGljIFZlY3RvckNhbGxBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFZlY3RvckNhbGxBdHRyKExvYywgQ3R4LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFZlY3RvckNhbGxBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFNJCisgICAgICAgICAgICAgKQorICAgIDogSW5oZXJpdGFibGVBdHRyKGF0dHI6OlZlY3RvckNhbGwsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIFZlY3RvckNhbGxBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisgIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3Q7CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpWZWN0b3JDYWxsOyB9Cit9OworCitjbGFzcyBWaXNpYmlsaXR5QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBlbnVtIFZpc2liaWxpdHlUeXBlIHsKKyAgICBEZWZhdWx0LAorICAgIEhpZGRlbiwKKyAgICBQcm90ZWN0ZWQKKyAgfTsKK3ByaXZhdGU6CisgIFZpc2liaWxpdHlUeXBlIHZpc2liaWxpdHk7CisKK3B1YmxpYzoKKyAgc3RhdGljIFZpc2liaWxpdHlBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFZpc2liaWxpdHlUeXBlIFZpc2liaWxpdHksIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFZpc2liaWxpdHlBdHRyKExvYywgQ3R4LCBWaXNpYmlsaXR5LCAwKTsKKyAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTsKKyAgICByZXR1cm4gQTsKKyAgfQorCisgIFZpc2liaWxpdHlBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIFZpc2liaWxpdHlUeXBlIFZpc2liaWxpdHkKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpWaXNpYmlsaXR5LCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIHZpc2liaWxpdHkoVmlzaWJpbGl0eSkKKyAgeworICB9CisKKyAgVmlzaWJpbGl0eUF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgVmlzaWJpbGl0eVR5cGUgZ2V0VmlzaWJpbGl0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdmlzaWJpbGl0eTsKKyAgfQorCisgIHN0YXRpYyBib29sIENvbnZlcnRTdHJUb1Zpc2liaWxpdHlUeXBlKFN0cmluZ1JlZiBWYWwsIFZpc2liaWxpdHlUeXBlICZPdXQpIHsKKyAgICBPcHRpb25hbDxWaXNpYmlsaXR5VHlwZT4gUiA9IGxsdm06OlN0cmluZ1N3aXRjaDxPcHRpb25hbDxWaXNpYmlsaXR5VHlwZT4+KFZhbCkKKyAgICAgIC5DYXNlKCJkZWZhdWx0IiwgVmlzaWJpbGl0eUF0dHI6OkRlZmF1bHQpCisgICAgICAuQ2FzZSgiaGlkZGVuIiwgVmlzaWJpbGl0eUF0dHI6OkhpZGRlbikKKyAgICAgIC5DYXNlKCJpbnRlcm5hbCIsIFZpc2liaWxpdHlBdHRyOjpIaWRkZW4pCisgICAgICAuQ2FzZSgicHJvdGVjdGVkIiwgVmlzaWJpbGl0eUF0dHI6OlByb3RlY3RlZCkKKyAgICAgIC5EZWZhdWx0KE9wdGlvbmFsPFZpc2liaWxpdHlUeXBlPigpKTsKKyAgICBpZiAoUikgeworICAgICAgT3V0ID0gKlI7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RhdGljIGNvbnN0IGNoYXIgKkNvbnZlcnRWaXNpYmlsaXR5VHlwZVRvU3RyKFZpc2liaWxpdHlUeXBlIFZhbCkgeworICAgIHN3aXRjaChWYWwpIHsKKyAgICBjYXNlIFZpc2liaWxpdHlBdHRyOjpEZWZhdWx0OiByZXR1cm4gImRlZmF1bHQiOworICAgIGNhc2UgVmlzaWJpbGl0eUF0dHI6OkhpZGRlbjogcmV0dXJuICJoaWRkZW4iOworICAgIGNhc2UgVmlzaWJpbGl0eUF0dHI6OlByb3RlY3RlZDogcmV0dXJuICJwcm90ZWN0ZWQiOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJObyBlbnVtZXJhdG9yIHdpdGggdGhhdCB2YWx1ZSIpOworICB9CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpWaXNpYmlsaXR5OyB9Cit9OworCitjbGFzcyBXYXJuVW51c2VkQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgV2FyblVudXNlZEF0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgV2FyblVudXNlZEF0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgV2FyblVudXNlZEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6V2FyblVudXNlZCwgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgV2FyblVudXNlZEF0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6Oldhcm5VbnVzZWQ7IH0KK307CisKK2NsYXNzIFdhcm5VbnVzZWRSZXN1bHRBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIGVudW0gU3BlbGxpbmcgeworICAgIENYWDExX25vZGlzY2FyZCA9IDAsCisgICAgQzJ4X25vZGlzY2FyZCA9IDEsCisgICAgQ1hYMTFfY2xhbmdfd2Fybl91bnVzZWRfcmVzdWx0ID0gMiwKKyAgICBHTlVfd2Fybl91bnVzZWRfcmVzdWx0ID0gMywKKyAgICBDWFgxMV9nbnVfd2Fybl91bnVzZWRfcmVzdWx0ID0gNAorICB9OworCisgIHN0YXRpYyBXYXJuVW51c2VkUmVzdWx0QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTcGVsbGluZyBTLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBXYXJuVW51c2VkUmVzdWx0QXR0cihMb2MsIEN0eCwgUyk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBXYXJuVW51c2VkUmVzdWx0QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpXYXJuVW51c2VkUmVzdWx0LCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBXYXJuVW51c2VkUmVzdWx0QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBTcGVsbGluZyBnZXRTZW1hbnRpY1NwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzcGVsbGluZyBsaXN0IGluZGV4Iik7CisgICAgY2FzZSAwOiByZXR1cm4gQ1hYMTFfbm9kaXNjYXJkOworICAgIGNhc2UgMTogcmV0dXJuIEMyeF9ub2Rpc2NhcmQ7CisgICAgY2FzZSAyOiByZXR1cm4gQ1hYMTFfY2xhbmdfd2Fybl91bnVzZWRfcmVzdWx0OworICAgIGNhc2UgMzogcmV0dXJuIEdOVV93YXJuX3VudXNlZF9yZXN1bHQ7CisgICAgY2FzZSA0OiByZXR1cm4gQ1hYMTFfZ251X3dhcm5fdW51c2VkX3Jlc3VsdDsKKyAgfQorICB9CisKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBhdHRyOjpXYXJuVW51c2VkUmVzdWx0OyB9Cit9OworCitjbGFzcyBXZWFrQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgV2Vha0F0dHIgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkN0eCwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgV2Vha0F0dHIoTG9jLCBDdHgsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgV2Vha0F0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6V2VhaywgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgeworICB9CisKKyAgV2Vha0F0dHIgKmNsb25lKEFTVENvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdDsKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OldlYWs7IH0KK307CisKK2NsYXNzIFdlYWtJbXBvcnRBdHRyIDogcHVibGljIEluaGVyaXRhYmxlQXR0ciB7CitwdWJsaWM6CisgIHN0YXRpYyBXZWFrSW1wb3J0QXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBXZWFrSW1wb3J0QXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBXZWFrSW1wb3J0QXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpXZWFrSW1wb3J0LCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICB7CisgIH0KKworICBXZWFrSW1wb3J0QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6V2Vha0ltcG9ydDsgfQorfTsKKworY2xhc3MgV2Vha1JlZkF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3Vuc2lnbmVkIGFsaWFzZWVMZW5ndGg7CitjaGFyICphbGlhc2VlOworCitwdWJsaWM6CisgIHN0YXRpYyBXZWFrUmVmQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCBsbHZtOjpTdHJpbmdSZWYgQWxpYXNlZSwgU291cmNlUmFuZ2UgTG9jID0gU291cmNlUmFuZ2UoKSkgeworICAgIGF1dG8gKkEgPSBuZXcgKEN0eCkgV2Vha1JlZkF0dHIoTG9jLCBDdHgsIEFsaWFzZWUsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgV2Vha1JlZkF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgbGx2bTo6U3RyaW5nUmVmIEFsaWFzZWUKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpXZWFrUmVmLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIGFsaWFzZWVMZW5ndGgoQWxpYXNlZS5zaXplKCkpLGFsaWFzZWUobmV3IChDdHgsIDEpIGNoYXJbYWxpYXNlZUxlbmd0aF0pCisgIHsKKyAgICAgIGlmICghQWxpYXNlZS5lbXB0eSgpKQorICAgICAgICBzdGQ6Om1lbWNweShhbGlhc2VlLCBBbGlhc2VlLmRhdGEoKSwgYWxpYXNlZUxlbmd0aCk7CisgIH0KKworICBXZWFrUmVmQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHgKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpXZWFrUmVmLCBSLCBTSSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAsIGFsaWFzZWVMZW5ndGgoMCksYWxpYXNlZShudWxscHRyKQorICB7CisgIH0KKworICBXZWFrUmVmQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBsbHZtOjpTdHJpbmdSZWYgZ2V0QWxpYXNlZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6U3RyaW5nUmVmKGFsaWFzZWUsIGFsaWFzZWVMZW5ndGgpOworICB9CisgIHVuc2lnbmVkIGdldEFsaWFzZWVMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIGFsaWFzZWVMZW5ndGg7CisgIH0KKyAgdm9pZCBzZXRBbGlhc2VlKEFTVENvbnRleHQgJkMsIGxsdm06OlN0cmluZ1JlZiBTKSB7CisgICAgYWxpYXNlZUxlbmd0aCA9IFMuc2l6ZSgpOworICAgIHRoaXMtPmFsaWFzZWUgPSBuZXcgKEMsIDEpIGNoYXIgW2FsaWFzZWVMZW5ndGhdOworICAgIGlmICghUy5lbXB0eSgpKQorICAgICAgc3RkOjptZW1jcHkodGhpcy0+YWxpYXNlZSwgUy5kYXRhKCksIGFsaWFzZWVMZW5ndGgpOworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OldlYWtSZWY7IH0KK307CisKK2NsYXNzIFdvcmtHcm91cFNpemVIaW50QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgewordW5zaWduZWQgeERpbTsKKwordW5zaWduZWQgeURpbTsKKwordW5zaWduZWQgekRpbTsKKworcHVibGljOgorICBzdGF0aWMgV29ya0dyb3VwU2l6ZUhpbnRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIHVuc2lnbmVkIFhEaW0sIHVuc2lnbmVkIFlEaW0sIHVuc2lnbmVkIFpEaW0sIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFdvcmtHcm91cFNpemVIaW50QXR0cihMb2MsIEN0eCwgWERpbSwgWURpbSwgWkRpbSwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBXb3JrR3JvdXBTaXplSGludEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgWERpbQorICAgICAgICAgICAgICAsIHVuc2lnbmVkIFlEaW0KKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBaRGltCisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6V29ya0dyb3VwU2l6ZUhpbnQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICwgeERpbShYRGltKQorICAgICAgICAgICAgICAsIHlEaW0oWURpbSkKKyAgICAgICAgICAgICAgLCB6RGltKFpEaW0pCisgIHsKKyAgfQorCisgIFdvcmtHcm91cFNpemVIaW50QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICB1bnNpZ25lZCBnZXRYRGltKCkgY29uc3QgeworICAgIHJldHVybiB4RGltOworICB9CisKKyAgdW5zaWduZWQgZ2V0WURpbSgpIGNvbnN0IHsKKyAgICByZXR1cm4geURpbTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFpEaW0oKSBjb25zdCB7CisgICAgcmV0dXJuIHpEaW07CisgIH0KKworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6V29ya0dyb3VwU2l6ZUhpbnQ7IH0KK307CisKK2NsYXNzIFg4NkZvcmNlQWxpZ25BcmdQb2ludGVyQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBzdGF0aWMgWDg2Rm9yY2VBbGlnbkFyZ1BvaW50ZXJBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFg4NkZvcmNlQWxpZ25BcmdQb2ludGVyQXR0cihMb2MsIEN0eCwgMCk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBYODZGb3JjZUFsaWduQXJnUG9pbnRlckF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6WDg2Rm9yY2VBbGlnbkFyZ1BvaW50ZXIsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIFg4NkZvcmNlQWxpZ25BcmdQb2ludGVyQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworCisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdHRyICpBKSB7IHJldHVybiBBLT5nZXRLaW5kKCkgPT0gYXR0cjo6WDg2Rm9yY2VBbGlnbkFyZ1BvaW50ZXI7IH0KK307CisKK2NsYXNzIFhSYXlJbnN0cnVtZW50QXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgeworcHVibGljOgorICBlbnVtIFNwZWxsaW5nIHsKKyAgICBHTlVfeHJheV9hbHdheXNfaW5zdHJ1bWVudCA9IDAsCisgICAgQ1hYMTFfY2xhbmdfeHJheV9hbHdheXNfaW5zdHJ1bWVudCA9IDEsCisgICAgQzJ4X2NsYW5nX3hyYXlfYWx3YXlzX2luc3RydW1lbnQgPSAyLAorICAgIEdOVV94cmF5X25ldmVyX2luc3RydW1lbnQgPSAzLAorICAgIENYWDExX2NsYW5nX3hyYXlfbmV2ZXJfaW5zdHJ1bWVudCA9IDQsCisgICAgQzJ4X2NsYW5nX3hyYXlfbmV2ZXJfaW5zdHJ1bWVudCA9IDUKKyAgfTsKKworICBzdGF0aWMgWFJheUluc3RydW1lbnRBdHRyICpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDdHgsIFNwZWxsaW5nIFMsIFNvdXJjZVJhbmdlIExvYyA9IFNvdXJjZVJhbmdlKCkpIHsKKyAgICBhdXRvICpBID0gbmV3IChDdHgpIFhSYXlJbnN0cnVtZW50QXR0cihMb2MsIEN0eCwgUyk7CisgICAgQS0+c2V0SW1wbGljaXQodHJ1ZSk7CisgICAgcmV0dXJuIEE7CisgIH0KKworICBYUmF5SW5zdHJ1bWVudEF0dHIoU291cmNlUmFuZ2UgUiwgQVNUQ29udGV4dCAmQ3R4CisgICAgICAgICAgICAgICwgdW5zaWduZWQgU0kKKyAgICAgICAgICAgICApCisgICAgOiBJbmhlcml0YWJsZUF0dHIoYXR0cjo6WFJheUluc3RydW1lbnQsIFIsIFNJLCBmYWxzZSwgZmFsc2UpCisgIHsKKyAgfQorCisgIFhSYXlJbnN0cnVtZW50QXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICBTcGVsbGluZyBnZXRTZW1hbnRpY1NwZWxsaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzcGVsbGluZyBsaXN0IGluZGV4Iik7CisgICAgY2FzZSAwOiByZXR1cm4gR05VX3hyYXlfYWx3YXlzX2luc3RydW1lbnQ7CisgICAgY2FzZSAxOiByZXR1cm4gQ1hYMTFfY2xhbmdfeHJheV9hbHdheXNfaW5zdHJ1bWVudDsKKyAgICBjYXNlIDI6IHJldHVybiBDMnhfY2xhbmdfeHJheV9hbHdheXNfaW5zdHJ1bWVudDsKKyAgICBjYXNlIDM6IHJldHVybiBHTlVfeHJheV9uZXZlcl9pbnN0cnVtZW50OworICAgIGNhc2UgNDogcmV0dXJuIENYWDExX2NsYW5nX3hyYXlfbmV2ZXJfaW5zdHJ1bWVudDsKKyAgICBjYXNlIDU6IHJldHVybiBDMnhfY2xhbmdfeHJheV9uZXZlcl9pbnN0cnVtZW50OworICB9CisgIH0KKyAgYm9vbCBhbHdheXNYUmF5SW5zdHJ1bWVudCgpIGNvbnN0IHsgcmV0dXJuIFNwZWxsaW5nTGlzdEluZGV4ID09IDAgfHwKKyAgICBTcGVsbGluZ0xpc3RJbmRleCA9PSAxIHx8CisgICAgU3BlbGxpbmdMaXN0SW5kZXggPT0gMjsgfQorICBib29sIG5ldmVyWFJheUluc3RydW1lbnQoKSBjb25zdCB7IHJldHVybiBTcGVsbGluZ0xpc3RJbmRleCA9PSAzIHx8CisgICAgU3BlbGxpbmdMaXN0SW5kZXggPT0gNCB8fAorICAgIFNwZWxsaW5nTGlzdEluZGV4ID09IDU7IH0KKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlhSYXlJbnN0cnVtZW50OyB9Cit9OworCitjbGFzcyBYUmF5TG9nQXJnc0F0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKK3Vuc2lnbmVkIGFyZ3VtZW50Q291bnQ7CisKK3B1YmxpYzoKKyAgc3RhdGljIFhSYXlMb2dBcmdzQXR0ciAqQ3JlYXRlSW1wbGljaXQoQVNUQ29udGV4dCAmQ3R4LCB1bnNpZ25lZCBBcmd1bWVudENvdW50LCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpKSB7CisgICAgYXV0byAqQSA9IG5ldyAoQ3R4KSBYUmF5TG9nQXJnc0F0dHIoTG9jLCBDdHgsIEFyZ3VtZW50Q291bnQsIDApOworICAgIEEtPnNldEltcGxpY2l0KHRydWUpOworICAgIHJldHVybiBBOworICB9CisKKyAgWFJheUxvZ0FyZ3NBdHRyKFNvdXJjZVJhbmdlIFIsIEFTVENvbnRleHQgJkN0eAorICAgICAgICAgICAgICAsIHVuc2lnbmVkIEFyZ3VtZW50Q291bnQKKyAgICAgICAgICAgICAgLCB1bnNpZ25lZCBTSQorICAgICAgICAgICAgICkKKyAgICA6IEluaGVyaXRhYmxlQXR0cihhdHRyOjpYUmF5TG9nQXJncywgUiwgU0ksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgLCBhcmd1bWVudENvdW50KEFyZ3VtZW50Q291bnQpCisgIHsKKyAgfQorCisgIFhSYXlMb2dBcmdzQXR0ciAqY2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworICBjb25zdCBjaGFyICpnZXRTcGVsbGluZygpIGNvbnN0OworICB1bnNpZ25lZCBnZXRBcmd1bWVudENvdW50KCkgY29uc3QgeworICAgIHJldHVybiBhcmd1bWVudENvdW50OworICB9CisKKworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXR0ciAqQSkgeyByZXR1cm4gQS0+Z2V0S2luZCgpID09IGF0dHI6OlhSYXlMb2dBcmdzOyB9Cit9OworCisjZW5kaWYgLy8gTExWTV9DTEFOR19BVFRSX0NMQVNTRVNfSU5DCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQXZhaWxhYmlsaXR5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQXZhaWxhYmlsaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVkODMxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9BdmFpbGFiaWxpdHkuaApAQCAtMCwwICsxLDYzIEBACisvLz09PS0tLSBBdmFpbGFiaWxpdHkuaCAtIENsYXNzZXMgZm9yIGF2YWlsYWJpbGl0eSAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZXMgZGVmaW5lcyBzb21lIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgYXZhaWxhYmlsaXR5IGNoZWNraW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfQVZBSUxBQklMSVRZX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfQVZBSUxBQklMSVRZX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVmVyc2lvblR1cGxlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKKy8vLyBcYnJpZWYgT25lIHNwZWNpZmllciBpbiBhbiBAYXZhaWxhYmxlIGV4cHJlc3Npb24uCisvLy8KKy8vLyBcY29kZQorLy8vICAgQGF2YWlsYWJsZShtYWNvcyAxMC4xMCwgKikKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gSGVyZSwgJ21hY29zIDEwLjEwJyBhbmQgJyonIGJvdGggbWFwIHRvIGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZS4KKy8vLworY2xhc3MgQXZhaWxhYmlsaXR5U3BlYyB7CisgIC8vLyBSZXByZXNlbnRzIHRoZSB2ZXJzaW9uIHRoYXQgdGhpcyBzcGVjaWZpZXIgcmVxdWlyZXMuIElmIHRoZSBob3N0IE9TCisgIC8vLyB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBWZXJzaW9uLCB0aGUgQGF2YWlsYWJsZSB3aWxsIGV2YWx1YXRlCisgIC8vLyB0byB0cnVlLgorICBWZXJzaW9uVHVwbGUgVmVyc2lvbjsKKworICAvLy8gTmFtZSBvZiB0aGUgcGxhdGZvcm0gdGhhdCBWZXJzaW9uIGNvcnJlc3BvbmRzIHRvLgorICBTdHJpbmdSZWYgUGxhdGZvcm07CisKKyAgU291cmNlTG9jYXRpb24gQmVnaW5Mb2MsIEVuZExvYzsKKworcHVibGljOgorICBBdmFpbGFiaWxpdHlTcGVjKFZlcnNpb25UdXBsZSBWZXJzaW9uLCBTdHJpbmdSZWYgUGxhdGZvcm0sCisgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQmVnaW5Mb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogVmVyc2lvbihWZXJzaW9uKSwgUGxhdGZvcm0oUGxhdGZvcm0pLCBCZWdpbkxvYyhCZWdpbkxvYyksCisgICAgICAgIEVuZExvYyhFbmRMb2MpIHt9CisKKyAgLy8vIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB3aGVuIHJlcHJlc2VudGluZyB0aGUgJyonIGNhc2UuCisgIEF2YWlsYWJpbGl0eVNwZWMoU291cmNlTG9jYXRpb24gU3RhckxvYykKKyAgICAgIDogQmVnaW5Mb2MoU3RhckxvYyksIEVuZExvYyhTdGFyTG9jKSB7fQorCisgIFZlcnNpb25UdXBsZSBnZXRWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gVmVyc2lvbjsgfQorICBTdHJpbmdSZWYgZ2V0UGxhdGZvcm0oKSBjb25zdCB7IHJldHVybiBQbGF0Zm9ybTsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRCZWdpbkxvYygpIGNvbnN0IHsgcmV0dXJuIEJlZ2luTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldEVuZExvYygpIGNvbnN0IHsgcmV0dXJuIEVuZExvYzsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgd2hlbiB0aGlzIHJlcHJlc2VudHMgdGhlICcqJyBjYXNlLgorICBib29sIGlzT3RoZXJQbGF0Zm9ybVNwZWMoKSBjb25zdCB7IHJldHVybiBWZXJzaW9uLmVtcHR5KCk7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9CYXNlU3Vib2JqZWN0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQmFzZVN1Ym9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYjdlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQmFzZVN1Ym9iamVjdC5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vPT09LSBCYXNlU3Vib2JqZWN0LmggLSBCYXNlU3Vib2JqZWN0IGNsYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGEgZGVmaW5pdGlvbiBvZiB0aGUgQmFzZVN1Ym9iamVjdCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0JBU0VTVUJPQkpFQ1RfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9CQVNFU1VCT0JKRUNUX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9DaGFyVW5pdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIENYWFJlY29yZERlY2w7CisKKy8vIEJhc2VTdWJvYmplY3QgLSBVbmlxdWVseSBpZGVudGlmaWVzIGEgZGlyZWN0IG9yIGluZGlyZWN0IGJhc2UgY2xhc3MuIAorLy8gU3RvcmVzIGJvdGggdGhlIGJhc2UgY2xhc3MgZGVjbCBhbmQgdGhlIG9mZnNldCBmcm9tIHRoZSBtb3N0IGRlcml2ZWQgY2xhc3MgdG8KKy8vIHRoZSBiYXNlIGNsYXNzLiBVc2VkIGZvciB2dGFibGUgYW5kIFZUVCBnZW5lcmF0aW9uLgorY2xhc3MgQmFzZVN1Ym9iamVjdCB7CisgIC8vLyBCYXNlIC0gVGhlIGJhc2UgY2xhc3MgZGVjbGFyYXRpb24uCisgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2U7CisgIAorICAvLy8gQmFzZU9mZnNldCAtIFRoZSBvZmZzZXQgZnJvbSB0aGUgbW9zdCBkZXJpdmVkIGNsYXNzIHRvIHRoZSBiYXNlIGNsYXNzLgorICBDaGFyVW5pdHMgQmFzZU9mZnNldDsKKyAgCitwdWJsaWM6CisgIEJhc2VTdWJvYmplY3QoKSA9IGRlZmF1bHQ7CisgIEJhc2VTdWJvYmplY3QoY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZSwgQ2hhclVuaXRzIEJhc2VPZmZzZXQpCisgICAgICA6IEJhc2UoQmFzZSksIEJhc2VPZmZzZXQoQmFzZU9mZnNldCkge30KKyAgCisgIC8vLyBnZXRCYXNlIC0gUmV0dXJucyB0aGUgYmFzZSBjbGFzcyBkZWNsYXJhdGlvbi4KKyAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqZ2V0QmFzZSgpIGNvbnN0IHsgcmV0dXJuIEJhc2U7IH0KKworICAvLy8gZ2V0QmFzZU9mZnNldCAtIFJldHVybnMgdGhlIGJhc2UgY2xhc3Mgb2Zmc2V0LgorICBDaGFyVW5pdHMgZ2V0QmFzZU9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIEJhc2VPZmZzZXQ7IH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEJhc2VTdWJvYmplY3QgJkxIUywgY29uc3QgQmFzZVN1Ym9iamVjdCAmUkhTKSB7CisgICAgcmV0dXJuIExIUy5CYXNlID09IFJIUy5CYXNlICYmIExIUy5CYXNlT2Zmc2V0ID09IFJIUy5CYXNlT2Zmc2V0OworIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPGNsYW5nOjpCYXNlU3Vib2JqZWN0PiB7CisgIHN0YXRpYyBjbGFuZzo6QmFzZVN1Ym9iamVjdCBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gY2xhbmc6OkJhc2VTdWJvYmplY3QoCisgICAgICBEZW5zZU1hcEluZm88Y29uc3QgY2xhbmc6OkNYWFJlY29yZERlY2wgKj46OmdldEVtcHR5S2V5KCksCisgICAgICBjbGFuZzo6Q2hhclVuaXRzOjpmcm9tUXVhbnRpdHkoRGVuc2VNYXBJbmZvPGludDY0X3Q+OjpnZXRFbXB0eUtleSgpKSk7CisgIH0KKworICBzdGF0aWMgY2xhbmc6OkJhc2VTdWJvYmplY3QgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiBjbGFuZzo6QmFzZVN1Ym9iamVjdCgKKyAgICAgIERlbnNlTWFwSW5mbzxjb25zdCBjbGFuZzo6Q1hYUmVjb3JkRGVjbCAqPjo6Z2V0VG9tYnN0b25lS2V5KCksCisgICAgICBjbGFuZzo6Q2hhclVuaXRzOjpmcm9tUXVhbnRpdHkoRGVuc2VNYXBJbmZvPGludDY0X3Q+OjpnZXRUb21ic3RvbmVLZXkoKSkpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBjbGFuZzo6QmFzZVN1Ym9iamVjdCAmQmFzZSkgeworICAgIHVzaW5nIFBhaXJUeSA9IHN0ZDo6cGFpcjxjb25zdCBjbGFuZzo6Q1hYUmVjb3JkRGVjbCAqLCBjbGFuZzo6Q2hhclVuaXRzPjsKKworICAgIHJldHVybiBEZW5zZU1hcEluZm88UGFpclR5Pjo6Z2V0SGFzaFZhbHVlKFBhaXJUeShCYXNlLmdldEJhc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZS5nZXRCYXNlT2Zmc2V0KCkpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgY2xhbmc6OkJhc2VTdWJvYmplY3QgJkxIUywgCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhbmc6OkJhc2VTdWJvYmplY3QgJlJIUykgeworICAgIHJldHVybiBMSFMgPT0gUkhTOworICB9Cit9OworCisvLyBJdCdzIE9LIHRvIHRyZWF0IEJhc2VTdWJvYmplY3QgYXMgYSBQT0QgdHlwZS4KK3RlbXBsYXRlIDw+IHN0cnVjdCBpc1BvZExpa2U8Y2xhbmc6OkJhc2VTdWJvYmplY3Q+IHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DTEFOR19BU1RfQkFTRVNVQk9CSkVDVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQnVpbHRpblR5cGVzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9CdWlsdGluVHlwZXMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZjVmN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQnVpbHRpblR5cGVzLmRlZgpAQCAtMCwwICsxLDI1MCBAQAorLy89PT0tLSBCdWlsdGluVHlwZXMuZGVmIC0gTWV0YWRhdGEgYWJvdXQgQnVpbHRpblR5cGVzIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGRhdGFiYXNlIGFib3V0IHZhcmlvdXMgYnVpbHRpbiBzaW5nbGV0b24gdHlwZXMuCisvLworLy8gIEJ1aWx0aW5UeXBlOjpJZCBpcyB0aGUgZW51bWVyYXRvciBkZWZpbmluZyB0aGUgdHlwZS4KKy8vCisvLyAgQ29udGV4dC5TaW5nbGV0b25JZCBpcyB0aGUgZ2xvYmFsIHNpbmdsZXRvbiBvZiB0aGlzIHR5cGUuICBTb21lIGdsb2JhbAorLy8gIHNpbmdsZXRvbnMgYXJlIHNoYXJlZCBieSBtdWx0aXBsZSB0eXBlcy4KKy8vCisvLyAgICBCVUlMVElOX1RZUEUoSWQsIFNpbmdsZXRvbklkKSAtIEEgYnVpbHRpbiB0eXBlIHRoYXQgaGFzIG5vdCBiZWVuCisvLyAgICBjb3ZlcmVkIGJ5IGFueSBvdGhlciAjZGVmaW5lLiAgRGVmaW5pbmcgdGhpcyBtYWNybyBjb3ZlcnMgYWxsCisvLyAgICB0aGUgYnVpbHRpbnMuCisvLworLy8gICAgU0lHTkVEX1RZUEUoSWQsIFNpbmdsZXRvbklkKSAtIEEgc2lnbmVkIGludGVncmFsIHR5cGUuCisvLworLy8gICAgVU5TSUdORURfVFlQRShJZCwgU2luZ2xldG9uSWQpIC0gQW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZS4KKy8vCisvLyAgICBGTE9BVElOR19UWVBFKElkLCBTaW5nbGV0b25JZCkgLSBBIGZsb2F0aW5nLXBvaW50IHR5cGUuCisvLworLy8gICAgUExBQ0VIT0xERVJfVFlQRShJZCwgU2luZ2xldG9uSWQpIC0gQSBwbGFjZWhvbGRlciB0eXBlLiAgUGxhY2Vob2xkZXIKKy8vICAgIHR5cGVzIGFyZSB1c2VkIHRvIHBlcmZvcm0gY29udGV4dC1zZW5zaXRpdmUgY2hlY2tpbmcgb2Ygc3BlY2lmaWMKKy8vICAgIGZvcm1zIG9mIGV4cHJlc3Npb24uCisvLworLy8gICAgU0hBUkVEX1NJTkdMRVRPTl9UWVBFKEV4cGFuc2lvbikgLSBUaGUgZ2l2ZW4gZXhwYW5zaW9uIGNvcnJlc3BvbmRzCisvLyAgICB0byBhIGJ1aWx0aW4gd2hpY2ggdXNlcyBhIHNoYXJlZCBzaW5nbGV0b24gdHlwZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFNJR05FRF9UWVBFCisjZGVmaW5lIFNJR05FRF9UWVBFKElkLCBTaW5nbGV0b25JZCkgQlVJTFRJTl9UWVBFKElkLCBTaW5nbGV0b25JZCkKKyNlbmRpZgorCisjaWZuZGVmIFVOU0lHTkVEX1RZUEUKKyNkZWZpbmUgVU5TSUdORURfVFlQRShJZCwgU2luZ2xldG9uSWQpIEJVSUxUSU5fVFlQRShJZCwgU2luZ2xldG9uSWQpCisjZW5kaWYKKworI2lmbmRlZiBGTE9BVElOR19UWVBFCisjZGVmaW5lIEZMT0FUSU5HX1RZUEUoSWQsIFNpbmdsZXRvbklkKSBCVUlMVElOX1RZUEUoSWQsIFNpbmdsZXRvbklkKQorI2VuZGlmCisKKyNpZm5kZWYgUExBQ0VIT0xERVJfVFlQRQorI2RlZmluZSBQTEFDRUhPTERFUl9UWVBFKElkLCBTaW5nbGV0b25JZCkgQlVJTFRJTl9UWVBFKElkLCBTaW5nbGV0b25JZCkKKyNlbmRpZgorCisjaWZuZGVmIFNIQVJFRF9TSU5HTEVUT05fVFlQRQorI2RlZmluZSBTSEFSRURfU0lOR0xFVE9OX1RZUEUoRXhwYW5zaW9uKSBFeHBhbnNpb24KKyNlbmRpZgorCisvLz09PS0gQnVpbHRpbiBUeXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyB2b2lkCitCVUlMVElOX1RZUEUoVm9pZCwgVm9pZFR5KQorCisvLz09PS0gVW5zaWduZWQgVHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyAnYm9vbCcgaW4gQysrLCAnX0Jvb2wnIGluIEM5OQorVU5TSUdORURfVFlQRShCb29sLCBCb29sVHkpCisKKy8vICdjaGFyJyBmb3IgdGFyZ2V0cyB3aGVyZSBpdCdzIHVuc2lnbmVkCitTSEFSRURfU0lOR0xFVE9OX1RZUEUoVU5TSUdORURfVFlQRShDaGFyX1UsIENoYXJUeSkpCisKKy8vICd1bnNpZ25lZCBjaGFyJywgZXhwbGljaXRseSBxdWFsaWZpZWQKK1VOU0lHTkVEX1RZUEUoVUNoYXIsIFVuc2lnbmVkQ2hhclR5KQorCisvLyAnd2NoYXJfdCcgZm9yIHRhcmdldHMgd2hlcmUgaXQncyB1bnNpZ25lZAorU0hBUkVEX1NJTkdMRVRPTl9UWVBFKFVOU0lHTkVEX1RZUEUoV0NoYXJfVSwgV0NoYXJUeSkpCisKKy8vICdjaGFyMTZfdCcgaW4gQysrCitVTlNJR05FRF9UWVBFKENoYXIxNiwgQ2hhcjE2VHkpCisKKy8vICdjaGFyMzJfdCcgaW4gQysrCitVTlNJR05FRF9UWVBFKENoYXIzMiwgQ2hhcjMyVHkpCisKKy8vICd1bnNpZ25lZCBzaG9ydCcKK1VOU0lHTkVEX1RZUEUoVVNob3J0LCBVbnNpZ25lZFNob3J0VHkpCisKKy8vICd1bnNpZ25lZCBpbnQnCitVTlNJR05FRF9UWVBFKFVJbnQsIFVuc2lnbmVkSW50VHkpCisKKy8vICd1bnNpZ25lZCBsb25nJworVU5TSUdORURfVFlQRShVTG9uZywgVW5zaWduZWRMb25nVHkpCisKKy8vICd1bnNpZ25lZCBsb25nIGxvbmcnCitVTlNJR05FRF9UWVBFKFVMb25nTG9uZywgVW5zaWduZWRMb25nTG9uZ1R5KQorCisvLyAnX191aW50MTI4X3QnCitVTlNJR05FRF9UWVBFKFVJbnQxMjgsIFVuc2lnbmVkSW50MTI4VHkpCisKKy8vPT09LSBTaWduZWQgVHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vICdjaGFyJyBmb3IgdGFyZ2V0cyB3aGVyZSBpdCdzIHNpZ25lZAorU0hBUkVEX1NJTkdMRVRPTl9UWVBFKFNJR05FRF9UWVBFKENoYXJfUywgQ2hhclR5KSkKKworLy8gJ3NpZ25lZCBjaGFyJywgZXhwbGljaXRseSBxdWFsaWZpZWQKK1NJR05FRF9UWVBFKFNDaGFyLCBTaWduZWRDaGFyVHkpCisKKy8vICd3Y2hhcl90JyBmb3IgdGFyZ2V0cyB3aGVyZSBpdCdzIHNpZ25lZAorU0hBUkVEX1NJTkdMRVRPTl9UWVBFKFNJR05FRF9UWVBFKFdDaGFyX1MsIFdDaGFyVHkpKQorCisvLyAnc2hvcnQnIG9yICdzaWduZWQgc2hvcnQnCitTSUdORURfVFlQRShTaG9ydCwgU2hvcnRUeSkKKworLy8gJ2ludCcgb3IgJ3NpZ25lZCBpbnQnCitTSUdORURfVFlQRShJbnQsIEludFR5KQorCisvLyAnbG9uZycgb3IgJ3NpZ25lZCBsb25nJworU0lHTkVEX1RZUEUoTG9uZywgTG9uZ1R5KQorCisvLyAnbG9uZyBsb25nJyBvciAnc2lnbmVkIGxvbmcgbG9uZycKK1NJR05FRF9UWVBFKExvbmdMb25nLCBMb25nTG9uZ1R5KQorCisvLyAnX19pbnQxMjhfdCcKK1NJR05FRF9UWVBFKEludDEyOCwgSW50MTI4VHkpCisKKy8vPT09LSBGbG9hdGluZyBwb2ludCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vICdoYWxmJyBpbiBPcGVuQ0wsICdfX2ZwMTYnIGluIEFSTSBORU9OLgorRkxPQVRJTkdfVFlQRShIYWxmLCBIYWxmVHkpCisKKy8vICdmbG9hdCcKK0ZMT0FUSU5HX1RZUEUoRmxvYXQsIEZsb2F0VHkpCisKKy8vICdkb3VibGUnCitGTE9BVElOR19UWVBFKERvdWJsZSwgRG91YmxlVHkpCisKKy8vICdsb25nIGRvdWJsZScKK0ZMT0FUSU5HX1RZUEUoTG9uZ0RvdWJsZSwgTG9uZ0RvdWJsZVR5KQorCisvLyAnX0Zsb2F0MTYnCitGTE9BVElOR19UWVBFKEZsb2F0MTYsIEhhbGZUeSkKKworLy8gJ19fZmxvYXQxMjgnCitGTE9BVElOR19UWVBFKEZsb2F0MTI4LCBGbG9hdDEyOFR5KQorCisvLz09PS0gTGFuZ3VhZ2Utc3BlY2lmaWMgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBUaGlzIGlzIHRoZSB0eXBlIG9mIEMrKzB4ICdudWxscHRyJy4KK0JVSUxUSU5fVFlQRShOdWxsUHRyLCBOdWxsUHRyVHkpCisKKy8vIFRoZSBwcmltaXRpdmUgT2JqZWN0aXZlIEMgJ2lkJyB0eXBlLiAgVGhlIHVzZXItdmlzaWJsZSAnaWQnCisvLyB0eXBlIGlzIGEgdHlwZWRlZiBvZiBhbiBPYmpDT2JqZWN0UG9pbnRlclR5cGUgdG8gYW4KKy8vIE9iakNPYmplY3RUeXBlIHdpdGggdGhpcyBhcyBpdHMgYmFzZS4gIEluIGZhY3QsIHRoaXMgb25seSBldmVyCisvLyBzaG93cyB1cCBpbiBhbiBBU1QgYXMgdGhlIGJhc2UgdHlwZSBvZiBhbiBPYmpDT2JqZWN0VHlwZS4KK0JVSUxUSU5fVFlQRShPYmpDSWQsIE9iakNCdWlsdGluSWRUeSkKKworLy8gVGhlIHByaW1pdGl2ZSBPYmplY3RpdmUgQyAnQ2xhc3MnIHR5cGUuICBUaGUgdXNlci12aXNpYmxlCisvLyAnQ2xhc3MnIHR5cGUgaXMgYSB0eXBlZGVmIG9mIGFuIE9iakNPYmplY3RQb2ludGVyVHlwZSB0byBhbgorLy8gT2JqQ09iamVjdFR5cGUgd2l0aCB0aGlzIGFzIGl0cyBiYXNlLiAgSW4gZmFjdCwgdGhpcyBvbmx5IGV2ZXIKKy8vIHNob3dzIHVwIGluIGFuIEFTVCBhcyB0aGUgYmFzZSB0eXBlIG9mIGFuIE9iakNPYmplY3RUeXBlLgorQlVJTFRJTl9UWVBFKE9iakNDbGFzcywgT2JqQ0J1aWx0aW5DbGFzc1R5KQorCisvLyBUaGUgcHJpbWl0aXZlIE9iamVjdGl2ZSBDICdTRUwnIHR5cGUuICBUaGUgdXNlci12aXNpYmxlICdTRUwnCisvLyB0eXBlIGlzIGEgdHlwZWRlZiBvZiBhIFBvaW50ZXJUeXBlIHRvIHRoaXMuCitCVUlMVElOX1RZUEUoT2JqQ1NlbCwgT2JqQ0J1aWx0aW5TZWxUeSkKKworLy8gT3BlbkNMIHNhbXBsZXJfdC4KK0JVSUxUSU5fVFlQRShPQ0xTYW1wbGVyLCBPQ0xTYW1wbGVyVHkpCisKKy8vIE9wZW5DTCBldmVudF90LgorQlVJTFRJTl9UWVBFKE9DTEV2ZW50LCBPQ0xFdmVudFR5KQorCisvLyBPcGVuQ0wgY2xrX2V2ZW50X3QuCitCVUlMVElOX1RZUEUoT0NMQ2xrRXZlbnQsIE9DTENsa0V2ZW50VHkpCisKKy8vIE9wZW5DTCBxdWV1ZV90LgorQlVJTFRJTl9UWVBFKE9DTFF1ZXVlLCBPQ0xRdWV1ZVR5KQorCisvLyBPcGVuQ0wgcmVzZXJ2ZV9pZF90LgorQlVJTFRJTl9UWVBFKE9DTFJlc2VydmVJRCwgT0NMUmVzZXJ2ZUlEVHkpCisKKy8vIFRoaXMgcmVwcmVzZW50cyB0aGUgdHlwZSBvZiBhbiBleHByZXNzaW9uIHdob3NlIHR5cGUgaXMKKy8vIHRvdGFsbHkgdW5rbm93biwgZS5nLiAnVDo6Zm9vJy4gIEl0IGlzIHBlcm1pdHRlZCBmb3IgdGhpcyB0bworLy8gYXBwZWFyIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHN0cnVjdHVyZSBvZiB0aGUgdHlwZSBpcworLy8gdGhlb3JldGljYWxseSBkZWR1Y2libGUuCitCVUlMVElOX1RZUEUoRGVwZW5kZW50LCBEZXBlbmRlbnRUeSkKKworLy8gVGhlIHR5cGUgb2YgYW4gdW5yZXNvbHZlZCBvdmVybG9hZCBzZXQuICBBIHBsYWNlaG9sZGVyIHR5cGUuCisvLyBFeHByZXNzaW9ucyB3aXRoIHRoaXMgdHlwZSBoYXZlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGJhc2ljCisvLyBmb3Jtcywgd2l0aCBwYXJlbnRoZXNlcyBnZW5lcmFsbHkgcGVybWl0dGVkOgorLy8gICBmb28gICAgICAgICAgIyBwb3NzaWJseSBxdWFsaWZpZWQsIG5vdCBpZiBhbiBpbXBsaWNpdCBhY2Nlc3MKKy8vICAgZm9vICAgICAgICAgICMgcG9zc2libHkgcXVhbGlmaWVkLCBub3QgaWYgYW4gaW1wbGljaXQgYWNjZXNzCisvLyAgICZmb28gICAgICAgICAjIHBvc3NpYmx5IHF1YWxpZmllZCwgbm90IGlmIGFuIGltcGxpY2l0IGFjY2VzcworLy8gICB4LT5mb28gICAgICAgIyBvbmx5IGlmIG1pZ2h0IGJlIGEgc3RhdGljIG1lbWJlciBmdW5jdGlvbgorLy8gICAmeC0+Zm9vICAgICAgIyBvbmx5IGlmIG1pZ2h0IGJlIGEgc3RhdGljIG1lbWJlciBmdW5jdGlvbgorLy8gICAmQ2xhc3M6OmZvbyAgIyB3aGVuIGEgcG9pbnRlci10by1tZW1iZXI7IHN1Yi1leHByIGFsc28gaGFzIHRoaXMgdHlwZQorLy8gT3ZlcmxvYWRFeHByOjpmaW5kIGNhbiBiZSB1c2VkIHRvIGFuYWx5emUgdGhlIGV4cHJlc3Npb24uCisvLworLy8gT3ZlcmxvYWQgc2hvdWxkIGJlIHRoZSBmaXJzdCBwbGFjZWhvbGRlciB0eXBlLCBvciBlbHNlIGNoYW5nZQorLy8gQnVpbHRpblR5cGU6OmlzTm9uT3ZlcmxvYWRQbGFjZWhvbGRlclR5cGUoKQorUExBQ0VIT0xERVJfVFlQRShPdmVybG9hZCwgT3ZlcmxvYWRUeSkKKworLy8gVGhlIHR5cGUgb2YgYSBib3VuZCBDKysgbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb24uCisvLyBBIHBsYWNlaG9sZGVyIHR5cGUuICBFeHByZXNzaW9ucyB3aXRoIHRoaXMgdHlwZSBoYXZlIG9uZSBvZiB0aGUKKy8vIGZvbGxvd2luZyBiYXNpYyBmb3JtczoKKy8vICAgZm9vICAgICAgICAgICMgaWYgYW4gaW1wbGljaXQgYWNjZXNzCisvLyAgIHgtPmZvbyAgICAgICAjIGlmIG9ubHkgY29udGFpbnMgbm9uLXN0YXRpYyBtZW1iZXJzCitQTEFDRUhPTERFUl9UWVBFKEJvdW5kTWVtYmVyLCBCb3VuZE1lbWJlclR5KQorCisvLyBUaGUgdHlwZSBvZiBhbiBleHByZXNzaW9uIHdoaWNoIHJlZmVycyB0byBhIHBzZXVkby1vYmplY3QsCisvLyBzdWNoIGFzIHRob3NlIGludHJvZHVjZWQgYnkgT2JqZWN0aXZlIEMncyBAcHJvcGVydHkgb3IKKy8vIFZTLk5FVCdzIF9fcHJvcGVydHkgZGVjbGFyYXRpb25zLiAgQSBwbGFjZWhvbGRlciB0eXBlLiAgVGhlCisvLyBwc2V1ZG8tb2JqZWN0IGlzIGFjdHVhbGx5IGFjY2Vzc2VkIGJ5IGVtaXR0aW5nIGEgY2FsbCB0bworLy8gc29tZSBzb3J0IG9mIGZ1bmN0aW9uIG9yIG1ldGhvZDsgIHR5cGljYWxseSB0aGVyZSBpcyBhIHBhaXIKKy8vIG9mIGEgc2V0dGVyIGFuZCBhIGdldHRlciwgd2l0aCB0aGUgc2V0dGVyIHVzZWQgaWYgdGhlCisvLyBwc2V1ZG8tb2JqZWN0IHJlZmVyZW5jZSBpcyB1c2VkIHN5bnRhY3RpY2FsbHkgYXMgdGhlCisvLyBsZWZ0LWhhbmQtc2lkZSBvZiBhbiBhc3NpZ25tZW50IG9wZXJhdG9yLgorLy8KKy8vIEEgcHNldWRvLW9iamVjdCByZWZlcmVuY2UgbmFtaW5nIGFuIE9iamVjdGl2ZS1DIEBwcm9wZXJ0eSBpcworLy8gYWx3YXlzIGEgZG90IGFjY2VzcyB3aXRoIGEgYmFzZSBvZiBvYmplY3QtcG9pbnRlciB0eXBlLAorLy8gZS5nLiAneC5mb28nLgorLy8KKy8vIEluIFZTLk5FVCwgYSBfX3Byb3BlcnR5IGRlY2xhcmF0aW9uIGNyZWF0ZXMgYW4gaW1wbGljaXQKKy8vIG1lbWJlciB3aXRoIGFuIGFzc29jaWF0ZWQgbmFtZSwgd2hpY2ggY2FuIHRoZW4gYmUgbmFtZWQKKy8vIGluIGFueSBvZiB0aGUgbm9ybWFsIHdheXMgYW4gb3JkaW5hcnkgbWVtYmVyIGNvdWxkIGJlLgorUExBQ0VIT0xERVJfVFlQRShQc2V1ZG9PYmplY3QsIFBzZXVkb09iamVjdFR5KQorCisvLyBfX2J1aWx0aW5fYW55X3R5cGUuICBBIHBsYWNlaG9sZGVyIHR5cGUuICBVc2VmdWwgZm9yIGNsaWVudHMKKy8vIGxpa2UgZGVidWdnZXJzIHRoYXQgZG9uJ3Qga25vdyB3aGF0IHR5cGUgdG8gZ2l2ZSBzb21ldGhpbmcuCisvLyBPbmx5IGEgc21hbGwgbnVtYmVyIG9mIG9wZXJhdGlvbnMgYXJlIHZhbGlkIG9uIGV4cHJlc3Npb25zIG9mCisvLyB1bmtub3duIHR5cGUsIG1vc3Qgbm90YWJseSBleHBsaWNpdCBjYXN0cy4KK1BMQUNFSE9MREVSX1RZUEUoVW5rbm93bkFueSwgVW5rbm93bkFueVR5KQorCitQTEFDRUhPTERFUl9UWVBFKEJ1aWx0aW5GbiwgQnVpbHRpbkZuVHkpCisKKy8vIFRoZSB0eXBlIG9mIGEgY2FzdCB3aGljaCwgaW4gQVJDLCB3b3VsZCBub3JtYWxseSByZXF1aXJlIGEKKy8vIF9fYnJpZGdlLCBidXQgd2hpY2ggbWlnaHQgYmUgb2theSBkZXBlbmRpbmcgb24gdGhlIGltbWVkaWF0ZQorLy8gY29udGV4dC4KK1BMQUNFSE9MREVSX1RZUEUoQVJDVW5icmlkZ2VkQ2FzdCwgQVJDVW5icmlkZ2VkQ2FzdFR5KQorCisvLyBBIHBsYWNlaG9sZGVyIHR5cGUgZm9yIE9wZW5NUCBhcnJheSBzZWN0aW9ucy4KK1BMQUNFSE9MREVSX1RZUEUoT01QQXJyYXlTZWN0aW9uLCBPTVBBcnJheVNlY3Rpb25UeSkKKworI2lmZGVmIExBU1RfQlVJTFRJTl9UWVBFCitMQVNUX0JVSUxUSU5fVFlQRShPTVBBcnJheVNlY3Rpb24pCisjdW5kZWYgTEFTVF9CVUlMVElOX1RZUEUKKyNlbmRpZgorCisjdW5kZWYgU0hBUkVEX1NJTkdMRVRPTl9UWVBFCisjdW5kZWYgUExBQ0VIT0xERVJfVFlQRQorI3VuZGVmIEZMT0FUSU5HX1RZUEUKKyN1bmRlZiBTSUdORURfVFlQRQorI3VuZGVmIFVOU0lHTkVEX1RZUEUKKyN1bmRlZiBCVUlMVElOX1RZUEUKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9DWFhJbmhlcml0YW5jZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0NYWEluaGVyaXRhbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmYjIyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9DWFhJbmhlcml0YW5jZS5oCkBAIC0wLDAgKzEsMzczIEBACisvLz09PS0gQ1hYSW5oZXJpdGFuY2UuaCAtIEMrKyBJbmhlcml0YW5jZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyByb3V0aW5lcyB0aGF0IGhlbHAgYW5hbHl6aW5nIEMrKyBpbmhlcml0YW5jZSBoaWVyYXJjaGllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0NYWElOSEVSSVRBTkNFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfQ1hYSU5IRVJJVEFOQ0VfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xCYXNlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDWFguaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbGFyYXRpb25OYW1lLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZU9yZGVyaW5nLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU3BlY2lmaWVycy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9NYXBWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBU1RDb250ZXh0OworY2xhc3MgTmFtZWREZWNsOworICAKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhbiBlbGVtZW50IGluIGEgcGF0aCBmcm9tIGEgZGVyaXZlZCBjbGFzcyB0byBhCisvLy8gYmFzZSBjbGFzcy4gCisvLy8gCisvLy8gRWFjaCBzdGVwIGluIHRoZSBwYXRoIHJlZmVyZW5jZXMgdGhlIGxpbmsgZnJvbSBhCisvLy8gZGVyaXZlZCBjbGFzcyB0byBvbmUgb2YgaXRzIGRpcmVjdCBiYXNlIGNsYXNzZXMsIGFsb25nIHdpdGggYQorLy8vIGJhc2UgIm51bWJlciIgdGhhdCBpZGVudGlmaWVzIHdoaWNoIGJhc2Ugc3Vib2JqZWN0IG9mIHRoZQorLy8vIG9yaWdpbmFsIGRlcml2ZWQgY2xhc3Mgd2UgYXJlIHJlZmVyZW5jaW5nLgorc3RydWN0IENYWEJhc2VQYXRoRWxlbWVudCB7CisgIC8vLyBcYnJpZWYgVGhlIGJhc2Ugc3BlY2lmaWVyIHRoYXQgc3RhdGVzIHRoZSBsaW5rIGZyb20gYSBkZXJpdmVkCisgIC8vLyBjbGFzcyB0byBhIGJhc2UgY2xhc3MsIHdoaWNoIHdpbGwgYmUgZm9sbG93ZWQgYnkgdGhpcyBiYXNlCisgIC8vLyBwYXRoIGVsZW1lbnQuCisgIGNvbnN0IENYWEJhc2VTcGVjaWZpZXIgKkJhc2U7CisgIAorICAvLy8gXGJyaWVmIFRoZSByZWNvcmQgZGVjbCBvZiB0aGUgY2xhc3MgdGhhdCB0aGUgYmFzZSBpcyBhIGJhc2Ugb2YuCisgIGNvbnN0IENYWFJlY29yZERlY2wgKkNsYXNzOworICAKKyAgLy8vIFxicmllZiBJZGVudGlmaWVzIHdoaWNoIGJhc2UgY2xhc3Mgc3Vib2JqZWN0IChvZiB0eXBlCisgIC8vLyBcYyBCYXNlLT5nZXRUeXBlKCkpIHRoaXMgYmFzZSBwYXRoIGVsZW1lbnQgcmVmZXJzIHRvLiAKKyAgLy8vCisgIC8vLyBUaGlzIHZhbHVlIGlzIG9ubHkgdmFsaWQgaWYgXGMgIUJhc2UtPmlzVmlydHVhbCgpLCBiZWNhdXNlIHRoZXJlCisgIC8vLyBpcyBubyBiYXNlIG51bWJlcmluZyBmb3IgdGhlIHplcm8gb3Igb25lIHZpcnR1YWwgYmFzZXMgb2YgYQorICAvLy8gZ2l2ZW4gdHlwZS4KKyAgaW50IFN1Ym9iamVjdE51bWJlcjsKK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIHBhdGggZnJvbSBhIHNwZWNpZmljIGRlcml2ZWQgY2xhc3MKKy8vLyAod2hpY2ggaXMgbm90IHJlcHJlc2VudGVkIGFzIHBhcnQgb2YgdGhlIHBhdGgpIHRvIGEgcGFydGljdWxhcgorLy8vIChkaXJlY3Qgb3IgaW5kaXJlY3QpIGJhc2UgY2xhc3Mgc3Vib2JqZWN0LgorLy8vCisvLy8gSW5kaXZpZHVhbCBlbGVtZW50cyBpbiB0aGUgcGF0aCBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBcYyBDWFhCYXNlUGF0aEVsZW1lbnQgCisvLy8gc3RydWN0dXJlLCB3aGljaCBjYXB0dXJlcyBib3RoIHRoZSBsaW5rIGZyb20gYSBkZXJpdmVkIGNsYXNzIHRvIG9uZSBvZiBpdHMKKy8vLyBkaXJlY3QgYmFzZXMgYW5kIGlkZW50aWZpY2F0aW9uIGRlc2NyaWJpbmcgd2hpY2ggYmFzZSBjbGFzcworLy8vIHN1Ym9iamVjdCBpcyBiZWluZyB1c2VkLgorY2xhc3MgQ1hYQmFzZVBhdGggOiBwdWJsaWMgU21hbGxWZWN0b3I8Q1hYQmFzZVBhdGhFbGVtZW50LCA0PiB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgVGhlIGFjY2VzcyBhbG9uZyB0aGlzIGluaGVyaXRhbmNlIHBhdGguICBUaGlzIGlzIG9ubHkKKyAgLy8vIGNhbGN1bGF0ZWQgd2hlbiByZWNvcmRpbmcgcGF0aHMuICBBU19ub25lIGlzIGEgc3BlY2lhbCB2YWx1ZQorICAvLy8gdXNlZCB0byBpbmRpY2F0ZSBhIHBhdGggd2hpY2ggcGVybWl0cyBubyBsZWdhbCBhY2Nlc3MuCisgIEFjY2Vzc1NwZWNpZmllciBBY2Nlc3MgPSBBU19wdWJsaWM7CisKKyAgQ1hYQmFzZVBhdGgoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBUaGUgc2V0IG9mIGRlY2xhcmF0aW9ucyBmb3VuZCBpbnNpZGUgdGhpcyBiYXNlIGNsYXNzCisgIC8vLyBzdWJvYmplY3QuCisgIERlY2xDb250ZXh0Ojpsb29rdXBfcmVzdWx0IERlY2xzOworCisgIHZvaWQgY2xlYXIoKSB7CisgICAgU21hbGxWZWN0b3JJbXBsPENYWEJhc2VQYXRoRWxlbWVudD46OmNsZWFyKCk7CisgICAgQWNjZXNzID0gQVNfcHVibGljOworICB9Cit9OworCisvLy8gQmFzZVBhdGhzIC0gUmVwcmVzZW50cyB0aGUgc2V0IG9mIHBhdGhzIGZyb20gYSBkZXJpdmVkIGNsYXNzIHRvCisvLy8gb25lIG9mIGl0cyAoZGlyZWN0IG9yIGluZGlyZWN0KSBiYXNlcy4gRm9yIGV4YW1wbGUsIGdpdmVuIHRoZQorLy8vIGZvbGxvd2luZyBjbGFzcyBoaWVyYXJjaHk6CisvLy8KKy8vLyBAY29kZQorLy8vIGNsYXNzIEEgeyB9OworLy8vIGNsYXNzIEIgOiBwdWJsaWMgQSB7IH07CisvLy8gY2xhc3MgQyA6IHB1YmxpYyBBIHsgfTsKKy8vLyBjbGFzcyBEIDogcHVibGljIEIsIHB1YmxpYyBDeyB9OworLy8vIEBlbmRjb2RlCisvLy8KKy8vLyBUaGVyZSBhcmUgdHdvIHBvdGVudGlhbCBCYXNlUGF0aHMgdG8gcmVwcmVzZW50IHBhdGhzIGZyb20gRCB0byBhCisvLy8gYmFzZSBzdWJvYmplY3Qgb2YgdHlwZSBBLiBPbmUgcGF0aCBpcyAoRCwwKSAtPiAoQiwwKSAtPiAoQSwwKQorLy8vIGFuZCBhbm90aGVyIGlzIChELDApLT4oQywwKS0+KEEsMSkuIFRoZXNlIHR3byBwYXRocyBhY3R1YWxseQorLy8vIHJlZmVyIHRvIHR3byBkaWZmZXJlbnQgYmFzZSBjbGFzcyBzdWJvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUsCisvLy8gc28gdGhlIEJhc2VQYXRocyBvYmplY3QgcmVmZXJzIHRvIGFuIGFtYmlndW91cyBwYXRoLiBPbiB0aGUKKy8vLyBvdGhlciBoYW5kLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGNsYXNzIGhpZXJhcmNoeToKKy8vLworLy8vIEBjb2RlCisvLy8gY2xhc3MgQSB7IH07CisvLy8gY2xhc3MgQiA6IHB1YmxpYyB2aXJ0dWFsIEEgeyB9OworLy8vIGNsYXNzIEMgOiBwdWJsaWMgdmlydHVhbCBBIHsgfTsKKy8vLyBjbGFzcyBEIDogcHVibGljIEIsIHB1YmxpYyBDeyB9OworLy8vIEBlbmRjb2RlCisvLy8KKy8vLyBIZXJlLCB0aGVyZSBhcmUgdHdvIHBvdGVudGlhbCBCYXNlUGF0aHMgYWdhaW4sIChELCAwKSAtPiAoQiwgMCkKKy8vLyAtPiAoQSx2KSBhbmQgKEQsIDApIC0+IChDLCAwKSAtPiAoQSwgdiksIGJ1dCBzaW5jZSBib3RoIG9mIHRoZW0KKy8vLyByZWZlciB0byB0aGUgc2FtZSBiYXNlIGNsYXNzIHN1Ym9iamVjdCBvZiB0eXBlIEEgKHRoZSB2aXJ0dWFsCisvLy8gb25lKSwgdGhlcmUgaXMgbm8gYW1iaWd1aXR5LgorY2xhc3MgQ1hYQmFzZVBhdGhzIHsKKyAgZnJpZW5kIGNsYXNzIENYWFJlY29yZERlY2w7CisKKyAgLy8vIFxicmllZiBUaGUgdHlwZSBmcm9tIHdoaWNoIHRoaXMgc2VhcmNoIG9yaWdpbmF0ZWQuCisgIENYWFJlY29yZERlY2wgKk9yaWdpbiA9IG51bGxwdHI7CisgIAorICAvLy8gUGF0aHMgLSBUaGUgYWN0dWFsIHNldCBvZiBwYXRocyB0aGF0IGNhbiBiZSB0YWtlbiBmcm9tIHRoZQorICAvLy8gZGVyaXZlZCBjbGFzcyB0byB0aGUgc2FtZSBiYXNlIGNsYXNzLgorICBzdGQ6Omxpc3Q8Q1hYQmFzZVBhdGg+IFBhdGhzOworICAKKyAgLy8vIENsYXNzU3Vib2JqZWN0cyAtIFJlY29yZHMgdGhlIGNsYXNzIHN1Ym9iamVjdHMgZm9yIGVhY2ggY2xhc3MKKyAgLy8vIHR5cGUgdGhhdCB3ZSd2ZSBzZWVuLiBUaGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgcGFpciBzYXlzCisgIC8vLyB3aGV0aGVyIHdlIGZvdW5kIGEgcGF0aCB0byBhIHZpcnR1YWwgYmFzZSBmb3IgdGhhdCBjbGFzcyB0eXBlLAorICAvLy8gd2hpbGUgdGhlIGVsZW1lbnQgY29udGFpbnMgdGhlIG51bWJlciBvZiBub24tdmlydHVhbCBiYXNlCisgIC8vLyBjbGFzcyBzdWJvYmplY3RzIGZvciB0aGF0IGNsYXNzIHR5cGUuIFRoZSBrZXkgb2YgdGhlIG1hcCBpcworICAvLy8gdGhlIGN2LXVucXVhbGlmaWVkIGNhbm9uaWNhbCB0eXBlIG9mIHRoZSBiYXNlIGNsYXNzIHN1Ym9iamVjdC4KKyAgbGx2bTo6U21hbGxEZW5zZU1hcDxRdWFsVHlwZSwgc3RkOjpwYWlyPGJvb2wsIHVuc2lnbmVkPiwgOD4gQ2xhc3NTdWJvYmplY3RzOworCisgIC8vLyBWaXNpdGVkRGVwZW5kZW50UmVjb3JkcyAtIFJlY29yZHMgdGhlIGRlcGVuZGVudCByZWNvcmRzIHRoYXQgaGF2ZSBiZWVuCisgIC8vLyBhbHJlYWR5IHZpc2l0ZWQuCisgIGxsdm06OlNtYWxsRGVuc2VTZXQ8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLCA0PiBWaXNpdGVkRGVwZW5kZW50UmVjb3JkczsKKworICAvLy8gRmluZEFtYmlndWl0aWVzIC0gV2hldGhlciBTZW1hOjpJc0Rlcml2ZWRGcm9tIHNob3VsZCB0cnkgZmluZAorICAvLy8gYW1iaWd1b3VzIHBhdGhzIHdoaWxlIGl0IGlzIGxvb2tpbmcgZm9yIGEgcGF0aCBmcm9tIGEgZGVyaXZlZAorICAvLy8gdHlwZSB0byBhIGJhc2UgdHlwZS4KKyAgYm9vbCBGaW5kQW1iaWd1aXRpZXM7CisgIAorICAvLy8gUmVjb3JkUGF0aHMgLSBXaGV0aGVyIFNlbWE6OklzRGVyaXZlZEZyb20gc2hvdWxkIHJlY29yZCBwYXRocworICAvLy8gd2hpbGUgaXQgaXMgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGVyZSBhcmUgcGF0aHMgZnJvbSBhIGRlcml2ZWQKKyAgLy8vIHR5cGUgdG8gYSBiYXNlIHR5cGUuCisgIGJvb2wgUmVjb3JkUGF0aHM7CisgIAorICAvLy8gRGV0ZWN0VmlydHVhbCAtIFdoZXRoZXIgU2VtYTo6SXNEZXJpdmVkRnJvbSBzaG91bGQgYWJvcnQgdGhlIHNlYXJjaAorICAvLy8gaWYgaXQgZmluZHMgYSBwYXRoIHRoYXQgZ29lcyBhY3Jvc3MgYSB2aXJ0dWFsIGJhc2UuIFRoZSB2aXJ0dWFsIGNsYXNzCisgIC8vLyBpcyBhbHNvIHJlY29yZGVkLgorICBib29sIERldGVjdFZpcnR1YWw7CisgIAorICAvLy8gU2NyYXRjaFBhdGggLSBBIEJhc2VQYXRoIHRoYXQgaXMgdXNlZCBieSBTZW1hOjpsb29rdXBJbkJhc2VzCisgIC8vLyB0byBoZWxwIGJ1aWxkIHRoZSBzZXQgb2YgcGF0aHMuCisgIENYWEJhc2VQYXRoIFNjcmF0Y2hQYXRoOworCisgIC8vLyBEZXRlY3RlZFZpcnR1YWwgLSBUaGUgYmFzZSBjbGFzcyB0aGF0IGlzIHZpcnR1YWwuCisgIGNvbnN0IFJlY29yZFR5cGUgKkRldGVjdGVkVmlydHVhbCA9IG51bGxwdHI7CisgIAorICAvLy8gXGJyaWVmIEFycmF5IG9mIHRoZSBkZWNsYXJhdGlvbnMgdGhhdCBoYXZlIGJlZW4gZm91bmQuIFRoaXMKKyAgLy8vIGFycmF5IGlzIGNvbnN0cnVjdGVkIG9ubHkgaWYgbmVlZGVkLCBlLmcuLCB0byBpdGVyYXRlIG92ZXIgdGhlCisgIC8vLyByZXN1bHRzIHdpdGhpbiBMb29rdXBSZXN1bHQuCisgIHN0ZDo6dW5pcXVlX3B0cjxOYW1lZERlY2wgKltdPiBEZWNsc0ZvdW5kOworICB1bnNpZ25lZCBOdW1EZWNsc0ZvdW5kID0gMDsKKyAgCisgIHZvaWQgQ29tcHV0ZURlY2xzRm91bmQoKTsKKworICBib29sIGxvb2t1cEluQmFzZXMoQVNUQ29udGV4dCAmQ29udGV4dCwgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgQ1hYUmVjb3JkRGVjbDo6QmFzZU1hdGNoZXNDYWxsYmFjayBCYXNlTWF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgTG9va3VwSW5EZXBlbmRlbnQgPSBmYWxzZSk7CisKK3B1YmxpYzoKKyAgdXNpbmcgcGF0aHNfaXRlcmF0b3IgPSBzdGQ6Omxpc3Q8Q1hYQmFzZVBhdGg+OjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfcGF0aHNfaXRlcmF0b3IgPSBzdGQ6Omxpc3Q8Q1hYQmFzZVBhdGg+Ojpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgZGVjbF9pdGVyYXRvciA9IE5hbWVkRGVjbCAqKjsKKyAgCisgIC8vLyBCYXNlUGF0aHMgLSBDb25zdHJ1Y3QgYSBuZXcgQmFzZVBhdGhzIHN0cnVjdHVyZSB0byByZWNvcmQgdGhlCisgIC8vLyBwYXRocyBmb3IgYSBkZXJpdmVkLXRvLWJhc2Ugc2VhcmNoLgorICBleHBsaWNpdCBDWFhCYXNlUGF0aHMoYm9vbCBGaW5kQW1iaWd1aXRpZXMgPSB0cnVlLCBib29sIFJlY29yZFBhdGhzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGV0ZWN0VmlydHVhbCA9IHRydWUpCisgICAgICA6IEZpbmRBbWJpZ3VpdGllcyhGaW5kQW1iaWd1aXRpZXMpLCBSZWNvcmRQYXRocyhSZWNvcmRQYXRocyksCisgICAgICAgIERldGVjdFZpcnR1YWwoRGV0ZWN0VmlydHVhbCkge30KKworICBwYXRoc19pdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIFBhdGhzLmJlZ2luKCk7IH0KKyAgcGF0aHNfaXRlcmF0b3IgZW5kKCkgICB7IHJldHVybiBQYXRocy5lbmQoKTsgfQorICBjb25zdF9wYXRoc19pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFBhdGhzLmJlZ2luKCk7IH0KKyAgY29uc3RfcGF0aHNfaXRlcmF0b3IgZW5kKCkgICBjb25zdCB7IHJldHVybiBQYXRocy5lbmQoKTsgfQorICAKKyAgQ1hYQmFzZVBhdGgmICAgICAgIGZyb250KCkgICAgICAgeyByZXR1cm4gUGF0aHMuZnJvbnQoKTsgfQorICBjb25zdCBDWFhCYXNlUGF0aCYgZnJvbnQoKSBjb25zdCB7IHJldHVybiBQYXRocy5mcm9udCgpOyB9CisgIAorICB1c2luZyBkZWNsX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8ZGVjbF9pdGVyYXRvcj47CisKKyAgZGVjbF9yYW5nZSBmb3VuZF9kZWNscygpOworICAKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgcGF0aCBmcm9tIHRoZSBtb3N0LWRlcml2ZWQgdHlwZSB0byB0aGUKKyAgLy8vIGdpdmVuIGJhc2UgdHlwZSBpcyBhbWJpZ3VvdXMgKGkuZS4sIGl0IHJlZmVycyB0byBtdWx0aXBsZSBzdWJvYmplY3RzIG9mCisgIC8vLyB0aGUgc2FtZSBiYXNlIHR5cGUpLgorICBib29sIGlzQW1iaWd1b3VzKENhblF1YWxUeXBlIEJhc2VUeXBlKTsKKyAgCisgIC8vLyBcYnJpZWYgV2hldGhlciB3ZSBhcmUgZmluZGluZyBtdWx0aXBsZSBwYXRocyB0byBkZXRlY3QgYW1iaWd1aXRpZXMuCisgIGJvb2wgaXNGaW5kaW5nQW1iaWd1aXRpZXMoKSBjb25zdCB7IHJldHVybiBGaW5kQW1iaWd1aXRpZXM7IH0KKyAgCisgIC8vLyBcYnJpZWYgV2hldGhlciB3ZSBhcmUgcmVjb3JkaW5nIHBhdGhzLgorICBib29sIGlzUmVjb3JkaW5nUGF0aHMoKSBjb25zdCB7IHJldHVybiBSZWNvcmRQYXRoczsgfQorICAKKyAgLy8vIFxicmllZiBTcGVjaWZ5IHdoZXRoZXIgd2Ugc2hvdWxkIGJlIHJlY29yZGluZyBwYXRocyBvciBub3QuCisgIHZvaWQgc2V0UmVjb3JkaW5nUGF0aHMoYm9vbCBSUCkgeyBSZWNvcmRQYXRocyA9IFJQOyB9CisgIAorICAvLy8gXGJyaWVmIFdoZXRoZXIgd2UgYXJlIGRldGVjdGluZyB2aXJ0dWFsIGJhc2VzLgorICBib29sIGlzRGV0ZWN0aW5nVmlydHVhbCgpIGNvbnN0IHsgcmV0dXJuIERldGVjdFZpcnR1YWw7IH0KKyAgCisgIC8vLyBcYnJpZWYgVGhlIHZpcnR1YWwgYmFzZSBkaXNjb3ZlcmVkIG9uIHRoZSBwYXRoIChpZiB3ZSBhcmUgbWVyZWx5CisgIC8vLyBkZXRlY3RpbmcgdmlydHVhbHMpLgorICBjb25zdCBSZWNvcmRUeXBlKiBnZXREZXRlY3RlZFZpcnR1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIERldGVjdGVkVmlydHVhbDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHR5cGUgZnJvbSB3aGljaCB0aGlzIGJhc2UtcGF0aHMgc2VhcmNoCisgIC8vLyBiZWdhbgorICBDWFhSZWNvcmREZWNsICpnZXRPcmlnaW4oKSBjb25zdCB7IHJldHVybiBPcmlnaW47IH0KKyAgdm9pZCBzZXRPcmlnaW4oQ1hYUmVjb3JkRGVjbCAqUmVjKSB7IE9yaWdpbiA9IFJlYzsgfQorICAKKyAgLy8vIFxicmllZiBDbGVhciB0aGUgYmFzZS1wYXRocyByZXN1bHRzLgorICB2b2lkIGNsZWFyKCk7CisgIAorICAvLy8gXGJyaWVmIFN3YXAgdGhpcyBkYXRhIHN0cnVjdHVyZSdzIGNvbnRlbnRzIHdpdGggYW5vdGhlciBDWFhCYXNlUGF0aHMgCisgIC8vLyBvYmplY3QuCisgIHZvaWQgc3dhcChDWFhCYXNlUGF0aHMgJk90aGVyKTsKK307CisKKy8vLyBcYnJpZWYgVW5pcXVlbHkgaWRlbnRpZmllcyBhIHZpcnR1YWwgbWV0aG9kIHdpdGhpbiBhIGNsYXNzCisvLy8gaGllcmFyY2h5IGJ5IHRoZSBtZXRob2QgaXRzZWxmIGFuZCBhIGNsYXNzIHN1Ym9iamVjdCBudW1iZXIuCitzdHJ1Y3QgVW5pcXVlVmlydHVhbE1ldGhvZCB7CisgIC8vLyBcYnJpZWYgVGhlIG92ZXJyaWRpbmcgdmlydHVhbCBtZXRob2QuCisgIENYWE1ldGhvZERlY2wgKk1ldGhvZCA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBUaGUgc3Vib2JqZWN0IGluIHdoaWNoIHRoZSBvdmVycmlkaW5nIHZpcnR1YWwgbWV0aG9kCisgIC8vLyByZXNpZGVzLgorICB1bnNpZ25lZCBTdWJvYmplY3QgPSAwOworCisgIC8vLyBcYnJpZWYgVGhlIHZpcnR1YWwgYmFzZSBjbGFzcyBzdWJvYmplY3Qgb2Ygd2hpY2ggdGhpcyBvdmVycmlkZGVuCisgIC8vLyB2aXJ0dWFsIG1ldGhvZCBpcyBhIHBhcnQuIE5vdGUgdGhhdCB0aGlzIHJlY29yZHMgdGhlIGNsb3Nlc3QKKyAgLy8vIGRlcml2ZWQgdmlydHVhbCBiYXNlIGNsYXNzIHN1Ym9iamVjdC4KKyAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqSW5WaXJ0dWFsU3Vib2JqZWN0ID0gbnVsbHB0cjsKKworICBVbmlxdWVWaXJ0dWFsTWV0aG9kKCkgPSBkZWZhdWx0OworCisgIFVuaXF1ZVZpcnR1YWxNZXRob2QoQ1hYTWV0aG9kRGVjbCAqTWV0aG9kLCB1bnNpZ25lZCBTdWJvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqSW5WaXJ0dWFsU3Vib2JqZWN0KQorICAgICAgOiBNZXRob2QoTWV0aG9kKSwgU3Vib2JqZWN0KFN1Ym9iamVjdCksCisgICAgICAgIEluVmlydHVhbFN1Ym9iamVjdChJblZpcnR1YWxTdWJvYmplY3QpIHt9CisKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBVbmlxdWVWaXJ0dWFsTWV0aG9kICZYLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaXF1ZVZpcnR1YWxNZXRob2QgJlkpIHsKKyAgICByZXR1cm4gWC5NZXRob2QgPT0gWS5NZXRob2QgJiYgWC5TdWJvYmplY3QgPT0gWS5TdWJvYmplY3QgJiYKKyAgICAgIFguSW5WaXJ0dWFsU3Vib2JqZWN0ID09IFkuSW5WaXJ0dWFsU3Vib2JqZWN0OworICB9CisKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBVbmlxdWVWaXJ0dWFsTWV0aG9kICZYLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaXF1ZVZpcnR1YWxNZXRob2QgJlkpIHsKKyAgICByZXR1cm4gIShYID09IFkpOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoZSBzZXQgb2YgbWV0aG9kcyB0aGF0IG92ZXJyaWRlIGEgZ2l2ZW4gdmlydHVhbCBtZXRob2QgaW4KKy8vLyBlYWNoIHN1Ym9iamVjdCB3aGVyZSBpdCBvY2N1cnMuCisvLy8KKy8vLyBUaGUgZmlyc3QgcGFydCBvZiB0aGUgcGFpciBpcyB0aGUgc3Vib2JqZWN0IGluIHdoaWNoIHRoZQorLy8vIG92ZXJyaWRkZW4gdmlydHVhbCBmdW5jdGlvbiBvY2N1cnMsIHdoaWxlIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUKKy8vLyBwYWlyIGlzIHRoZSB2aXJ0dWFsIG1ldGhvZCB0aGF0IG92ZXJyaWRlcyBpdCAoaW5jbHVkaW5nIHRoZQorLy8vIHN1Ym9iamVjdCBpbiB3aGljaCB0aGF0IHZpcnR1YWwgZnVuY3Rpb24gb2NjdXJzKS4KK2NsYXNzIE92ZXJyaWRpbmdNZXRob2RzIHsKKyAgdXNpbmcgVmFsdWVzVCA9IFNtYWxsVmVjdG9yPFVuaXF1ZVZpcnR1YWxNZXRob2QsIDQ+OworICB1c2luZyBNYXBUeXBlID0gbGx2bTo6TWFwVmVjdG9yPHVuc2lnbmVkLCBWYWx1ZXNUPjsKKworICBNYXBUeXBlIE92ZXJyaWRlczsKKworcHVibGljOgorICAvLyBJdGVyYXRlIG92ZXIgdGhlIHNldCBvZiBzdWJvYmplY3RzIHRoYXQgaGF2ZSBvdmVycmlkaW5nIG1ldGhvZHMuCisgIHVzaW5nIGl0ZXJhdG9yID0gTWFwVHlwZTo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gTWFwVHlwZTo6Y29uc3RfaXRlcmF0b3I7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBPdmVycmlkZXMuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIE92ZXJyaWRlcy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIE92ZXJyaWRlcy5lbmQoKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBPdmVycmlkZXMuZW5kKCk7IH0KKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE92ZXJyaWRlcy5zaXplKCk7IH0KKworICAvLyBJdGVyYXRlIG92ZXIgdGhlIHNldCBvZiBvdmVycmlkaW5nIHZpcnR1YWwgbWV0aG9kcyBpbiBhIGdpdmVuCisgIC8vIHN1Ym9iamVjdC4KKyAgdXNpbmcgb3ZlcnJpZGluZ19pdGVyYXRvciA9CisgICAgICBTbWFsbFZlY3RvckltcGw8VW5pcXVlVmlydHVhbE1ldGhvZD46Oml0ZXJhdG9yOworICB1c2luZyBvdmVycmlkaW5nX2NvbnN0X2l0ZXJhdG9yID0KKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxVbmlxdWVWaXJ0dWFsTWV0aG9kPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgLy8gQWRkIGEgbmV3IG92ZXJyaWRpbmcgbWV0aG9kIGZvciBhIHBhcnRpY3VsYXIgc3Vib2JqZWN0LgorICB2b2lkIGFkZCh1bnNpZ25lZCBPdmVycmlkZGVuU3Vib2JqZWN0LCBVbmlxdWVWaXJ0dWFsTWV0aG9kIE92ZXJyaWRpbmcpOworCisgIC8vIEFkZCBhbGwgb2YgdGhlIG92ZXJyaWRpbmcgbWV0aG9kcyBmcm9tICJvdGhlciIgaW50byBvdmVycmlkZXMgZm9yCisgIC8vIHRoaXMgbWV0aG9kLiBVc2VkIHdoZW4gbWVyZ2luZyB0aGUgb3ZlcnJpZGVzIGZyb20gbXVsdGlwbGUgYmFzZQorICAvLyBjbGFzcyBzdWJvYmplY3RzLgorICB2b2lkIGFkZChjb25zdCBPdmVycmlkaW5nTWV0aG9kcyAmT3RoZXIpOworCisgIC8vIFJlcGxhY2UgYWxsIG92ZXJyaWRpbmcgdmlydHVhbCBtZXRob2RzIGluIGFsbCBzdWJvYmplY3RzIHdpdGggdGhlCisgIC8vIGdpdmVuIHZpcnR1YWwgbWV0aG9kLgorICB2b2lkIHJlcGxhY2VBbGwoVW5pcXVlVmlydHVhbE1ldGhvZCBPdmVycmlkaW5nKTsKK307CisKKy8vLyBcYnJpZWYgQSBtYXBwaW5nIGZyb20gZWFjaCB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbiB0byBpdHMgc2V0IG9mCisvLy8gZmluYWwgb3ZlcnJpZGVycy4KKy8vLworLy8vIFdpdGhpbiBhIGNsYXNzIGhpZXJhcmNoeSBmb3IgYSBnaXZlbiBkZXJpdmVkIGNsYXNzLCBlYWNoIHZpcnR1YWwKKy8vLyBtZW1iZXIgZnVuY3Rpb24gaW4gdGhhdCBoaWVyYXJjaHkgaGFzIG9uZSBvciBtb3JlICJmaW5hbAorLy8vIG92ZXJyaWRlcnMiIChDKysgW2NsYXNzLnZpcnR1YWxdcDIpLiBBIGZpbmFsIG92ZXJyaWRlciBmb3IgYQorLy8vIHZpcnR1YWwgZnVuY3Rpb24gImYiIGlzIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRoYXQgd2lsbCBhY3R1YWxseSBiZQorLy8vIGludm9rZWQgd2hlbiBkaXNwYXRjaGluZyBhIGNhbGwgdG8gImYiIHRocm91Z2ggdGhlCisvLy8gdnRhYmxlLiBXZWxsLWZvcm1lZCBjbGFzc2VzIGhhdmUgYSBzaW5nbGUgZmluYWwgb3ZlcnJpZGVyIGZvciBlYWNoCisvLy8gdmlydHVhbCBmdW5jdGlvbjsgaW4gYWJzdHJhY3QgY2xhc3NlcywgdGhlIGZpbmFsIG92ZXJyaWRlciBmb3IgYXQKKy8vLyBsZWFzdCBvbmUgdmlydHVhbCBmdW5jdGlvbiBpcyBhIHB1cmUgdmlydHVhbCBmdW5jdGlvbi4gRHVlIHRvCisvLy8gbXVsdGlwbGUsIHZpcnR1YWwgaW5oZXJpdGFuY2UsIGl0IGlzIHBvc3NpYmxlIGZvciBhIGNsYXNzIHRvIGhhdmUKKy8vLyBtb3JlIHRoYW4gb25lIGZpbmFsIG92ZXJyaWRlci4gQXRob3VnaCB0aGlzIGlzIGFuIGVycm9yIChwZXIgQysrCisvLy8gW2NsYXNzLnZpcnR1YWxdcDIpLCBpdCBpcyBub3QgY29uc2lkZXJlZCBhbiBlcnJvciBoZXJlOiB0aGUgZmluYWwKKy8vLyBvdmVycmlkZXIgbWFwIGNhbiByZXByZXNlbnQgbXVsdGlwbGUgZmluYWwgb3ZlcnJpZGVycyBmb3IgYQorLy8vIG1ldGhvZCwgYW5kIGl0IGlzIHVwIHRvIHRoZSBjbGllbnQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhleSBhcmUKKy8vLyBwcm9ibGVtLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjbGFzcyBcYyBEIGhhcyB0d28gZmluYWwKKy8vLyBvdmVycmlkZXJzIGZvciB0aGUgdmlydHVhbCBmdW5jdGlvbiBcYyBBOjpmKCksIG9uZSBpbiBcYyBDIGFuZCBvbmUKKy8vLyBpbiBcYyBEOgorLy8vCisvLy8gXGNvZGUKKy8vLyAgIHN0cnVjdCBBIHsgdmlydHVhbCB2b2lkIGYoKTsgfTsKKy8vLyAgIHN0cnVjdCBCIDogdmlydHVhbCBBIHsgdmlydHVhbCB2b2lkIGYoKTsgfTsKKy8vLyAgIHN0cnVjdCBDIDogdmlydHVhbCBBIHsgdmlydHVhbCB2b2lkIGYoKTsgfTsKKy8vLyAgIHN0cnVjdCBEIDogQiwgQyB7IH07CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbnMgYSBtYXBwaW5nIGZyb20gZXZlcnkgdmlydHVhbAorLy8vIGZ1bmN0aW9uICp0aGF0IGRvZXMgbm90IG92ZXJyaWRlIGFuIGV4aXN0aW5nIHZpcnR1YWwgZnVuY3Rpb24qIGFuZAorLy8vIGluIGV2ZXJ5IHN1Ym9iamVjdCB3aGVyZSB0aGF0IHZpcnR1YWwgZnVuY3Rpb24gb2NjdXJzIHRvIHRoZSBzZXQKKy8vLyBvZiB2aXJ0dWFsIGZ1bmN0aW9ucyB0aGF0IG92ZXJyaWRlIGl0LiBUaHVzLCB0aGUgc2FtZSB2aXJ0dWFsCisvLy8gZnVuY3Rpb24gXGMgQTo6ZiBjYW4gYWN0dWFsbHkgb2NjdXIgaW4gbXVsdGlwbGUgc3Vib2JqZWN0cyBvZiB0eXBlCisvLy8gXGMgQSBkdWUgdG8gbXVsdGlwbGUgaW5oZXJpdGFuY2UsIGFuZCBtYXkgYmUgb3ZlcnJpZGRlbiBieQorLy8vIGRpZmZlcmVudCB2aXJ0dWFsIGZ1bmN0aW9ucyBpbiBlYWNoLCBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisvLy8KKy8vLyBcY29kZQorLy8vICAgc3RydWN0IEEgeyB2aXJ0dWFsIHZvaWQgZigpOyB9OworLy8vICAgc3RydWN0IEIgOiBBIHsgdmlydHVhbCB2b2lkIGYoKTsgfTsKKy8vLyAgIHN0cnVjdCBDIDogQSB7IHZpcnR1YWwgdm9pZCBmKCk7IH07CisvLy8gICBzdHJ1Y3QgRCA6IEIsIEMgeyB9OworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBVbmxpa2UgaW4gdGhlIHByZXZpb3VzIGV4YW1wbGUsIHdoZXJlIHRoZSB2aXJ0dWFsIGZ1bmN0aW9ucyBcYworLy8vIEI6OmYgYW5kIFxjIEM6OmYgYm90aCBvdmVycm9kZSBcYyBBOjpmIGluIHRoZSBzYW1lIHN1Ym9iamVjdCBvZgorLy8vIHR5cGUgXGMgQSwgaW4gdGhpcyBleGFtcGxlIHRoZSB0d28gdmlydHVhbCBmdW5jdGlvbnMgYm90aCBvdmVycmlkZQorLy8vIFxjIEE6OmYgYnV0IGluICpkaWZmZXJlbnQqIHN1Ym9iamVjdHMgb2YgdHlwZSBBLiBUaGlzIGlzCisvLy8gcmVwcmVzZW50ZWQgYnkgbnVtYmVyaW5nIHRoZSBzdWJvYmplY3RzIGluIHdoaWNoIHRoZSBvdmVycmlkZGVuCisvLy8gYW5kIHRoZSBvdmVycmlkaW5nIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9ucyBhcmUgbG9jYXRlZC4gU3Vib2JqZWN0CisvLy8gMCByZXByZXNlbnRzIHRoZSB2aXJ0dWFsIGJhc2UgY2xhc3Mgc3Vib2JqZWN0IG9mIHRoYXQgdHlwZSwgd2hpbGUKKy8vLyBzdWJvYmplY3QgbnVtYmVycyBncmVhdGVyIHRoYW4gMCByZWZlciB0byBub24tdmlydHVhbCBiYXNlIGNsYXNzCisvLy8gc3Vib2JqZWN0cyBvZiB0aGF0IHR5cGUuCitjbGFzcyBDWFhGaW5hbE92ZXJyaWRlck1hcAorICA6IHB1YmxpYyBsbHZtOjpNYXBWZWN0b3I8Y29uc3QgQ1hYTWV0aG9kRGVjbCAqLCBPdmVycmlkaW5nTWV0aG9kcz4ge307CisKKy8vLyBcYnJpZWYgQSBzZXQgb2YgYWxsIHRoZSBwcmltYXJ5IGJhc2VzIGZvciBhIGNsYXNzLgorY2xhc3MgQ1hYSW5kaXJlY3RQcmltYXJ5QmFzZVNldAorICA6IHB1YmxpYyBsbHZtOjpTbWFsbFNldDxjb25zdCBDWFhSZWNvcmREZWNsKiwgMzI+IHt9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19BU1RfQ1hYSU5IRVJJVEFOQ0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0Nhbm9uaWNhbFR5cGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9DYW5vbmljYWxUeXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4NzYxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9DYW5vbmljYWxUeXBlLmgKQEAgLTAsMCArMSw2ODcgQEAKKy8vPT09LSBDYW5vbmljYWxUeXBlLmggLSBDIExhbmd1YWdlIEZhbWlseSBUeXBlIFJlcHJlc2VudGF0aW9uIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBDYW5RdWFsIGNsYXNzIHRlbXBsYXRlLCB3aGljaCBwcm92aWRlcyBhY2Nlc3MgdG8KKy8vICBjYW5vbmljYWwgdHlwZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9DQU5PTklDQUxUWVBFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfQ0FOT05JQ0FMVFlQRV9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGNsYW5nIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgQ2FuUHJveHk7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQ2FuUHJveHlBZGFwdG9yOworY2xhc3MgQ1hYUmVjb3JkRGVjbDsKK2NsYXNzIEVudW1EZWNsOworY2xhc3MgRXhwcjsKK2NsYXNzIElkZW50aWZpZXJJbmZvOworY2xhc3MgT2JqQ0ludGVyZmFjZURlY2w7CitjbGFzcyBSZWNvcmREZWNsOworY2xhc3MgVGFnRGVjbDsKK2NsYXNzIFRlbXBsYXRlVHlwZVBhcm1EZWNsOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworLy8gQ2Fub25pY2FsLCBxdWFsaWZpZWQgdHlwZSB0ZW1wbGF0ZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgY2Fub25pY2FsLCBwb3RlbnRpYWxseS1xdWFsaWZpZWQgdHlwZS4KKy8vLworLy8vIFRoZSBDYW5RdWFsIHRlbXBsYXRlIGlzIGEgbGlnaHR3ZWlnaHQgc21hcnQgcG9pbnRlciB0aGF0IHByb3ZpZGVzIGFjY2VzcworLy8vIHRvIHRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gb2YgYSB0eXBlLCB3aGVyZSBhbGwgdHlwZWRlZnMgYW5kIG90aGVyCisvLy8gc3ludGFjdGljIHN1Z2FyIGhhcyBiZWVuIGVsaW1pbmF0ZWQuIEEgQ2FuUXVhbFR5cGUgbWF5IGFsc28gaGF2ZSB2YXJpb3VzCisvLy8gcXVhbGlmaWVycyAoY29uc3QsIHZvbGF0aWxlLCByZXN0cmljdCkgYXR0YWNoZWQgdG8gaXQuCisvLy8KKy8vLyBUaGUgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXIgQHAgVCBpcyBvbmUgb2YgdGhlIFR5cGUgY2xhc3NlcyAoUG9pbnRlclR5cGUsCisvLy8gQnVpbHRpblR5cGUsIGV0Yy4pLiBUaGUgdHlwZSBzdG9yZWQgd2l0aGluIEBjIENhblF1YWw8VD4gd2lsbCBiZSBvZiB0aGF0CisvLy8gdHlwZSAob3Igc29tZSBzdWJjbGFzcyBvZiB0aGF0IHR5cGUpLiBUaGUgdHlwZWRlZiBAYyBDYW5RdWFsVHlwZSBpcyBqdXN0CisvLy8gYSBzaG9ydGhhbmQgZm9yIEBjIENhblF1YWw8VHlwZT4uCisvLy8KKy8vLyBBbiBpbnN0YW5jZSBvZiBAYyBDYW5RdWFsPFQ+IGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBhCisvLy8gQGMgQ2FuUXVhbDxVPiB3aGVuIFQgaXMgZGVyaXZlZCBmcm9tIFUsIHdoaWNoIGVzc2VudGlhbGx5IHByb3ZpZGVzIGFuCisvLy8gaW1wbGljaXQgdXBjYXN0LiBGb3IgZXhhbXBsZSwgQGMgQ2FuUXVhbDxMVmFsdWVSZWZlcmVuY2VUeXBlPiBjYW4gYmUKKy8vLyBjb252ZXJ0ZWQgdG8gQGMgQ2FuUXVhbDxSZWZlcmVuY2VUeXBlPi4gTm90ZSB0aGF0IGFueSBAYyBDYW5RdWFsIHR5cGUgY2FuCisvLy8gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYSBRdWFsVHlwZSwgYnV0IHRoZSByZXZlcnNlIG9wZXJhdGlvbiByZXF1aXJlcworLy8vIGEgY2FsbCB0byBBU1RDb250ZXh0OjpnZXRDYW5vbmljYWxUeXBlKCkuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUID0gVHlwZT4KK2NsYXNzIENhblF1YWwgeworICAvLy8gXGJyaWVmIFRoZSBhY3R1YWwsIGNhbm9uaWNhbCB0eXBlLgorICBRdWFsVHlwZSBTdG9yZWQ7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3RzIGEgTlVMTCBjYW5vbmljYWwgdHlwZS4KKyAgQ2FuUXVhbCgpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIENvbnZlcnRpbmcgY29uc3RydWN0b3IgdGhhdCBwZXJtaXRzIGltcGxpY2l0IHVwY2FzdGluZyBvZgorICAvLy8gY2Fub25pY2FsIHR5cGUgcG9pbnRlcnMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBDYW5RdWFsKGNvbnN0IENhblF1YWw8VT4gJk90aGVyLAorICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfYmFzZV9vZjxULCBVPjo6dmFsdWUsIGludD46OnR5cGUgPSAwKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB1bmRlcmx5aW5nIHR5cGUgcG9pbnRlciwgd2hpY2ggcmVmZXJzIHRvIGEKKyAgLy8vIGNhbm9uaWNhbCB0eXBlLgorICAvLy8KKyAgLy8vIFRoZSB1bmRlcmx5aW5nIHBvaW50ZXIgbXVzdCBub3QgYmUgbnVsbHB0ci4KKyAgY29uc3QgVCAqZ2V0VHlwZVB0cigpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8VD4oU3RvcmVkLmdldFR5cGVQdHIoKSk7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB1bmRlcmx5aW5nIHR5cGUgcG9pbnRlciwgd2hpY2ggcmVmZXJzIHRvIGEKKyAgLy8vIGNhbm9uaWNhbCB0eXBlLCBvciBudWxscHRyLgorICBjb25zdCBUICpnZXRUeXBlUHRyT3JOdWxsKCkgY29uc3QgeyAKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPFQ+KFN0b3JlZC5nZXRUeXBlUHRyT3JOdWxsKCkpOyAKKyAgfQorCisgIC8vLyBcYnJpZWYgSW1wbGljaXQgY29udmVyc2lvbiB0byBhIHF1YWxpZmllZCB0eXBlLgorICBvcGVyYXRvciBRdWFsVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFN0b3JlZDsgfQorCisgIC8vLyBcYnJpZWYgSW1wbGljaXQgY29udmVyc2lvbiB0byBib29sLgorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gIWlzTnVsbCgpOyB9CisgIAorICBib29sIGlzTnVsbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RvcmVkLmlzTnVsbCgpOworICB9CisKKyAgU3BsaXRRdWFsVHlwZSBzcGxpdCgpIGNvbnN0IHsgcmV0dXJuIFN0b3JlZC5zcGxpdCgpOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBhIGNhbm9uaWNhbCB0eXBlIHBvaW50ZXIgd2l0aCBhIGRpZmZlcmVudCBzdGF0aWMgdHlwZSwKKyAgLy8vIHVwY2FzdGluZyBvciBkb3duY2FzdGluZyBhcyBuZWVkZWQuCisgIC8vLworICAvLy8gVGhlIGdldEFzKCkgZnVuY3Rpb24gaXMgdHlwaWNhbGx5IHVzZWQgdG8gdHJ5IHRvIGRvd25jYXN0IHRvIGEKKyAgLy8vIG1vcmUgc3BlY2lmaWMgKGNhbm9uaWNhbCkgdHlwZSBpbiB0aGUgdHlwZSBzeXN0ZW0uIEZvciBleGFtcGxlOgorICAvLy8KKyAgLy8vIEBjb2RlCisgIC8vLyB2b2lkIGYoQ2FuUXVhbDxUeXBlPiBUKSB7CisgIC8vLyAgIGlmIChDYW5RdWFsPFBvaW50ZXJUeXBlPiBQdHIgPSBULT5nZXRBczxQb2ludGVyVHlwZT4oKSkgeworICAvLy8gICAgIC8vIGxvb2sgYXQgUHRyJ3MgcG9pbnRlZSB0eXBlCisgIC8vLyAgIH0KKyAgLy8vIH0KKyAgLy8vIEBlbmRjb2RlCisgIC8vLworICAvLy8gXHJldHVybnMgQSBwcm94eSBwb2ludGVyIHRvIHRoZSBzYW1lIHR5cGUsIGJ1dCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHN0YXRpYyB0eXBlIChAcCBVKS4gSWYgdGhlIGR5bmFtaWMgdHlwZSBpcyBub3QgdGhlIHNwZWNpZmllZCBzdGF0aWMgdHlwZQorICAvLy8gb3IgYSBkZXJpdmVkIGNsYXNzIHRoZXJlb2YsIGEgTlVMTCBjYW5vbmljYWwgdHlwZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gQ2FuUHJveHk8VT4gZ2V0QXMoKSBjb25zdDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBDYW5Qcm94eTxVPiBjYXN0QXMoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIE92ZXJsb2FkZWQgYXJyb3cgb3BlcmF0b3IgdGhhdCBwcm9kdWNlcyBhIGNhbm9uaWNhbCB0eXBlCisgIC8vLyBwcm94eS4KKyAgQ2FuUHJveHk8VD4gb3BlcmF0b3ItPigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYWxsIHF1YWxpZmllcnMuCisgIFF1YWxpZmllcnMgZ2V0UXVhbGlmaWVycygpIGNvbnN0IHsgcmV0dXJuIFN0b3JlZC5nZXRMb2NhbFF1YWxpZmllcnMoKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGNvbnN0L3ZvbGF0aWxlL3Jlc3RyaWN0IHF1YWxpZmllcnMuCisgIHVuc2lnbmVkIGdldENWUlF1YWxpZmllcnMoKSBjb25zdCB7IHJldHVybiBTdG9yZWQuZ2V0TG9jYWxDVlJRdWFsaWZpZXJzKCk7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB0aGlzIHR5cGUgaGFzIGFueSBxdWFsaWZpZXJzCisgIGJvb2wgaGFzUXVhbGlmaWVycygpIGNvbnN0IHsgcmV0dXJuIFN0b3JlZC5oYXNMb2NhbFF1YWxpZmllcnMoKTsgfQorCisgIGJvb2wgaXNDb25zdFF1YWxpZmllZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RvcmVkLmlzTG9jYWxDb25zdFF1YWxpZmllZCgpOworICB9CisKKyAgYm9vbCBpc1ZvbGF0aWxlUXVhbGlmaWVkKCkgY29uc3QgeworICAgIHJldHVybiBTdG9yZWQuaXNMb2NhbFZvbGF0aWxlUXVhbGlmaWVkKCk7CisgIH0KKworICBib29sIGlzUmVzdHJpY3RRdWFsaWZpZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIFN0b3JlZC5pc0xvY2FsUmVzdHJpY3RRdWFsaWZpZWQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGlzIGNhbm9uaWNhbCB0eXBlIGlzIGZ1cnRoZXJtb3JlCisgIC8vLyBjYW5vbmljYWwgYXMgYSBwYXJhbWV0ZXIuICBUaGUgcGFyYW1ldGVyLWNhbm9uaWNhbGl6YXRpb24KKyAgLy8vIHByb2Nlc3MgZGVjYXlzIGFycmF5cyB0byBwb2ludGVycyBhbmQgZHJvcHMgdG9wLWxldmVsIHF1YWxpZmllcnMuCisgIGJvb2wgaXNDYW5vbmljYWxBc1BhcmFtKCkgY29uc3QgeworICAgIHJldHVybiBTdG9yZWQuaXNDYW5vbmljYWxBc1BhcmFtKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB1bnF1YWxpZmllZCBmb3JtIG9mIHRoaXMgdHlwZS4KKyAgQ2FuUXVhbDxUPiBnZXRVbnF1YWxpZmllZFR5cGUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlcyBhIHZlcnNpb24gb2YgdGhpcyB0eXBlIHdpdGggY29uc3QgYXBwbGllZC4KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFsd2F5cyB5aWVsZCBhIGNhbm9uaWNhbCB0eXBlLgorICBRdWFsVHlwZSB3aXRoQ29uc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIFN0b3JlZC53aXRoQ29uc3QoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgY2Fub25pY2FsIHR5cGUgaXMgbW9yZSBxdWFsaWZpZWQgdGhhbgorICAvLy8gdGhlIEBwIE90aGVyIGNhbm9uaWNhbCB0eXBlLgorICBib29sIGlzTW9yZVF1YWxpZmllZFRoYW4oQ2FuUXVhbDxUPiBPdGhlcikgY29uc3QgeworICAgIHJldHVybiBTdG9yZWQuaXNNb3JlUXVhbGlmaWVkVGhhbihPdGhlci5TdG9yZWQpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBjYW5vbmljYWwgdHlwZSBpcyBhdCBsZWFzdCBhcyBxdWFsaWZpZWQgYXMKKyAgLy8vIHRoZSBAcCBPdGhlciBjYW5vbmljYWwgdHlwZS4KKyAgYm9vbCBpc0F0TGVhc3RBc1F1YWxpZmllZEFzKENhblF1YWw8VD4gT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RvcmVkLmlzQXRMZWFzdEFzUXVhbGlmaWVkQXMoT3RoZXIuU3RvcmVkKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSWYgdGhlIGNhbm9uaWNhbCB0eXBlIGlzIGEgcmVmZXJlbmNlIHR5cGUsIHJldHVybnMgdGhlIHR5cGUgdGhhdAorICAvLy8gaXQgcmVmZXJzIHRvOyBvdGhlcndpc2UsIHJldHVybnMgdGhlIHR5cGUgaXRzZWxmLgorICBDYW5RdWFsPFR5cGU+IGdldE5vblJlZmVyZW5jZVR5cGUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNhbm9uaWNhbCB0eXBlLgorICB2b2lkICpnZXRBc09wYXF1ZVB0cigpIGNvbnN0IHsgcmV0dXJuIFN0b3JlZC5nZXRBc09wYXF1ZVB0cigpOyB9CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBjYW5vbmljYWwgdHlwZSBmcm9tIGl0cyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KKyAgc3RhdGljIENhblF1YWw8VD4gZ2V0RnJvbU9wYXF1ZVB0cih2b2lkICpQdHIpOworCisgIC8vLyBcYnJpZWYgQnVpbGRzIGEgY2Fub25pY2FsIHR5cGUgZnJvbSBhIFF1YWxUeXBlLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBpcyBpbmhlcmVudGx5IHVuc2FmZSwgYmVjYXVzZSBpdCByZXF1aXJlcyB0aGUgdXNlciB0bworICAvLy8gZW5zdXJlIHRoYXQgdGhlIGdpdmVuIHR5cGUgaXMgYSBjYW5vbmljYWwgdHlwZSB3aXRoIHRoZSBjb3JyZWN0CisgIC8vIChkeW5hbWljKSB0eXBlLgorICBzdGF0aWMgQ2FuUXVhbDxUPiBDcmVhdGVVbnNhZmUoUXVhbFR5cGUgT3RoZXIpOworCisgIHZvaWQgZHVtcCgpIGNvbnN0IHsgU3RvcmVkLmR1bXAoKTsgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3QgeworICAgIElELkFkZFBvaW50ZXIoZ2V0QXNPcGFxdWVQdHIoKSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KENhblF1YWw8VD4geCwgQ2FuUXVhbDxVPiB5KSB7CisgIHJldHVybiB4LmdldEFzT3BhcXVlUHRyKCkgPT0geS5nZXRBc09wYXF1ZVB0cigpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoraW5saW5lIGJvb2wgb3BlcmF0b3IhPShDYW5RdWFsPFQ+IHgsIENhblF1YWw8VT4geSkgeworICByZXR1cm4geC5nZXRBc09wYXF1ZVB0cigpICE9IHkuZ2V0QXNPcGFxdWVQdHIoKTsKK30KKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgY2Fub25pY2FsLCBwb3RlbnRpYWxseS1xdWFsaWZpZWQgdHlwZS4KK3VzaW5nIENhblF1YWxUeXBlID0gQ2FuUXVhbDxUeXBlPjsKKworaW5saW5lIENhblF1YWxUeXBlIFR5cGU6OmdldENhbm9uaWNhbFR5cGVVbnF1YWxpZmllZCgpIGNvbnN0IHsKKyAgcmV0dXJuIENhblF1YWxUeXBlOjpDcmVhdGVVbnNhZmUoZ2V0Q2Fub25pY2FsVHlwZUludGVybmFsKCkpOworfQorCitpbmxpbmUgY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJm9wZXJhdG9yPDwoY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJkRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhblF1YWxUeXBlIFQpIHsKKyAgREIgPDwgc3RhdGljX2Nhc3Q8UXVhbFR5cGU+KFQpOworICByZXR1cm4gREI7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisvLyBJbnRlcm5hbCBwcm94eSBjbGFzc2VzIHVzZWQgYnkgY2Fub25pY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworCisjZGVmaW5lIExMVk1fQ0xBTkdfQ0FOUFJPWFlfVFlQRV9BQ0NFU1NPUihBY2Nlc3NvcikgICAgICAgICAgICAgICAgICAgIFwKK0NhblF1YWxUeXBlIEFjY2Vzc29yKCkgY29uc3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCityZXR1cm4gQ2FuUXVhbFR5cGU6OkNyZWF0ZVVuc2FmZSh0aGlzLT5nZXRUeXBlUHRyKCktPkFjY2Vzc29yKCkpOyAgICAgIFwKK30KKworI2RlZmluZSBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihUeXBlLCBBY2Nlc3NvcikgICAgICAgICAgICAgXAorVHlwZSBBY2Nlc3NvcigpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmdldFR5cGVQdHIoKS0+QWNjZXNzb3IoKTsgfQorCisvLy8gXGJyaWVmIEJhc2UgY2xhc3Mgb2YgYWxsIGNhbm9uaWNhbCBwcm94eSB0eXBlcywgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yCisvLy8gc3RvcmluZyB0aGUgdW5kZXJseWluZyBjYW5vbmljYWwgdHlwZSBhbmQgcHJvdmlkaW5nIGJhc2ljIGNvbnZlcnNpb25zLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIENhblByb3h5QmFzZSB7Citwcm90ZWN0ZWQ6CisgIENhblF1YWw8VD4gU3RvcmVkOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHBvaW50ZXIgdG8gdGhlIHVuZGVybHlpbmcgVHlwZQorICBjb25zdCBUICpnZXRUeXBlUHRyKCkgY29uc3QgeyByZXR1cm4gU3RvcmVkLmdldFR5cGVQdHIoKTsgfQorCisgIC8vLyBcYnJpZWYgSW1wbGljaXQgY29udmVyc2lvbiB0byB0aGUgdW5kZXJseWluZyBwb2ludGVyLgorICAvLy8KKyAgLy8vIEFsc28gcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gdXNlIGNhbm9uaWNhbCB0eXBlIHByb3hpZXMgaW4gYSBCb29sZWFuCisgIC8vIGNvbnRleHQsZS5nLiwKKyAgLy8vIEBjb2RlCisgIC8vLyAgIGlmIChDYW5RdWFsPFBvaW50ZXJUeXBlPiBQdHIgPSBULT5nZXRBczxQb2ludGVyVHlwZT4oKSkgeyAuLi4gfQorICAvLy8gQGVuZGNvZGUKKyAgb3BlcmF0b3IgY29uc3QgVCooKSBjb25zdCB7IHJldHVybiB0aGlzLT5TdG9yZWQuZ2V0VHlwZVB0ck9yTnVsbCgpOyB9CisKKyAgLy8vIFxicmllZiBUcnkgdG8gY29udmVydCB0aGUgZ2l2ZW4gY2Fub25pY2FsIHR5cGUgdG8gYSBzcGVjaWZpYyBzdHJ1Y3R1cmFsCisgIC8vLyB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBDYW5Qcm94eTxVPiBnZXRBcygpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+U3RvcmVkLnRlbXBsYXRlIGdldEFzPFU+KCk7CisgIH0KKworICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihUeXBlOjpUeXBlQ2xhc3MsIGdldFR5cGVDbGFzcykKKworICAvLyBUeXBlIHByZWRpY2F0ZXMKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaXNPYmplY3RUeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc0luY29tcGxldGVUeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc0luY29tcGxldGVPck9iamVjdFR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzVmFyaWFibHlNb2RpZmllZFR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzSW50ZWdlclR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzRW51bWVyYWxUeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc0Jvb2xlYW5UeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc0NoYXJUeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc1dpZGVDaGFyVHlwZSkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaXNJbnRlZ3JhbFR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzSW50ZWdyYWxPckVudW1lcmF0aW9uVHlwZSkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaXNSZWFsRmxvYXRpbmdUeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc0NvbXBsZXhUeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc0FueUNvbXBsZXhUeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc0Zsb2F0aW5nVHlwZSkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaXNSZWFsVHlwZSkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaXNBcml0aG1ldGljVHlwZSkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaXNWb2lkVHlwZSkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaXNEZXJpdmVkVHlwZSkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaXNTY2FsYXJUeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc0FnZ3JlZ2F0ZVR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzQW55UG9pbnRlclR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzVm9pZFBvaW50ZXJUeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc0Z1bmN0aW9uUG9pbnRlclR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzTWVtYmVyRnVuY3Rpb25Qb2ludGVyVHlwZSkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaXNDbGFzc1R5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzU3RydWN0dXJlVHlwZSkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaXNJbnRlcmZhY2VUeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc1N0cnVjdHVyZU9yQ2xhc3NUeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc1VuaW9uVHlwZSkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaXNDb21wbGV4SW50ZWdlclR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzTnVsbFB0clR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzRGVwZW5kZW50VHlwZSkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaXNPdmVybG9hZGFibGVUeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc0FycmF5VHlwZSkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaGFzUG9pbnRlclJlcHJlc2VudGF0aW9uKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBoYXNPYmpDUG9pbnRlclJlcHJlc2VudGF0aW9uKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBoYXNJbnRlZ2VyUmVwcmVzZW50YXRpb24pCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGhhc1NpZ25lZEludGVnZXJSZXByZXNlbnRhdGlvbikKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaGFzVW5zaWduZWRJbnRlZ2VyUmVwcmVzZW50YXRpb24pCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGhhc0Zsb2F0aW5nUmVwcmVzZW50YXRpb24pCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzUHJvbW90YWJsZUludGVnZXJUeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc1NpZ25lZEludGVnZXJUeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc1Vuc2lnbmVkSW50ZWdlclR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzU2lnbmVkSW50ZWdlck9yRW51bWVyYXRpb25UeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc1Vuc2lnbmVkSW50ZWdlck9yRW51bWVyYXRpb25UeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc0NvbnN0YW50U2l6ZVR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzU3BlY2lmaWVyVHlwZSkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoQ1hYUmVjb3JkRGVjbCosIGdldEFzQ1hYUmVjb3JkRGVjbCkKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBwcm94eS1hZGFwdG9yIHR5cGUuCisgIC8vLworICAvLy8gVGhpcyBhcnJvdyBvcGVyYXRvciBpcyB1c2VkIHdoZW4gQ2FuUHJveHlBZGFwdG9yIGhhcyBiZWVuIHNwZWNpYWxpemVkCisgIC8vLyBmb3IgdGhlIGdpdmVuIHR5cGUgVC4gSW4gdGhhdCBjYXNlLCB3ZSByZWZlcmVuY2UgbWVtYmVycyBvZiB0aGUKKyAgLy8vIENhblByb3h5QWRhcHRvciBzcGVjaWFsaXphdGlvbi4gT3RoZXJ3aXNlLCB0aGlzIG9wZXJhdG9yIHdpbGwgYmUgaGlkZGVuCisgIC8vLyBieSB0aGUgYXJyb3cgb3BlcmF0b3IgaW4gdGhlIHByaW1hcnkgQ2FuUHJveHlBZGFwdG9yIHRlbXBsYXRlLgorICBjb25zdCBDYW5Qcm94eUFkYXB0b3I8VD4gKm9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IENhblByb3h5QWRhcHRvcjxUPiAqPih0aGlzKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXBsYWNhYmxlIGNhbm9uaWNhbCBwcm94eSBhZGFwdG9yIGNsYXNzIHRoYXQgcHJvdmlkZXMgdGhlIGxpbmsKKy8vLyBiZXR3ZWVuIGEgY2Fub25pY2FsIHR5cGUgYW5kIHRoZSBhY2Nlc3NvcnMgb2YgdGhlIHR5cGUuCisvLy8KKy8vLyBUaGUgQ2FuUHJveHlBZGFwdG9yIGlzIGEgcmVwbGFjZWFibGUgY2xhc3MgdGVtcGxhdGUgdGhhdCBpcyBpbnN0YW50aWF0ZWQKKy8vLyBhcyBwYXJ0IG9mIGVhY2ggY2Fub25pY2FsIHByb3h5IHR5cGUuIFRoZSBwcmltYXJ5IHRlbXBsYXRlIG1lcmVseSBwcm92aWRlcworLy8vIHJlZGlyZWN0aW9uIHRvIHRoZSB1bmRlcmx5aW5nIHR5cGUgKFQpLCBlLmcuLCBAYyBQb2ludGVyVHlwZS4gT25lIGNhbgorLy8vIHByb3ZpZGUgc3BlY2lhbGl6YXRpb25zIG9mIHRoaXMgY2xhc3MgdGVtcGxhdGUgZm9yIGVhY2ggdW5kZXJseWluZyB0eXBlCisvLy8gdGhhdCBwcm92aWRlIGFjY2Vzc29ycyByZXR1cm5pbmcgY2Fub25pY2FsIHR5cGVzIChAYyBDYW5RdWFsVHlwZSkgcmF0aGVyCisvLy8gdGhhbiB0aGUgbW9yZSB0eXBpY2FsIEBjIFF1YWxUeXBlLCB0byBwcm9wYWdhdGUgdGhlIG5vdGlvbiBvZiAiY2Fub25pY2FsIgorLy8vIHRocm91Z2ggdGhlIHN5c3RlbS4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQ2FuUHJveHlBZGFwdG9yIDogQ2FuUHJveHlCYXNlPFQ+IHt9OworCisvLy8gXGJyaWVmIENhbm9uaWNhbCBwcm94eSB0eXBlIHJldHVybmVkIHdoZW4gcmV0cmlldmluZyB0aGUgbWVtYmVycyBvZiBhCisvLy8gY2Fub25pY2FsIHR5cGUgb3IgYXMgdGhlIHJlc3VsdCBvZiB0aGUgQGMgQ2FuUXVhbDxUPjo6Z2V0QXMgbWVtYmVyCisvLy8gZnVuY3Rpb24uCisvLy8KKy8vLyBUaGUgQ2FuUHJveHkgdHlwZSBtYWlubHkgZXhpc3RzIGFzIGEgcHJveHkgdGhyb3VnaCB3aGljaCBvcGVyYXRvci0+IHdpbGwKKy8vLyBsb29rIHRvIGVpdGhlciBtYXAgZG93biB0byBhIHJhdyBUKiAoZS5nLiwgUG9pbnRlclR5cGUqKSBvciB0byBhIHByb3h5CisvLy8gdHlwZSB0aGF0IHByb3ZpZGVzIGNhbm9uaWNhbC10eXBlIGFjY2VzcyB0byB0aGUgZmllbGRzIG9mIHRoZSB0eXBlLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIENhblByb3h5IDogcHVibGljIENhblByb3h5QWRhcHRvcjxUPiB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQnVpbGQgYSBOVUxMIHByb3h5LgorICBDYW5Qcm94eSgpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIEJ1aWxkIGEgcHJveHkgdG8gdGhlIGdpdmVuIGNhbm9uaWNhbCB0eXBlLgorICBDYW5Qcm94eShDYW5RdWFsPFQ+IFN0b3JlZCkgeyB0aGlzLT5TdG9yZWQgPSBTdG9yZWQ7IH0KKworICAvLy8gXGJyaWVmIEltcGxpY2l0IGNvbnZlcnNpb24gdG8gdGhlIHN0b3JlZCBjYW5vbmljYWwgdHlwZS4KKyAgb3BlcmF0b3IgQ2FuUXVhbDxUPigpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPlN0b3JlZDsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gSW1wbGVtZW50IHNpbXBsaWZ5X3R5cGUgZm9yIENhblF1YWw8VD4sIHNvIHRoYXQgd2UgY2FuIGR5bl9jYXN0IGZyb20KKy8vLyBDYW5RdWFsPFQ+IHRvIGEgc3BlY2lmaWMgVHlwZSBjbGFzcy4gV2UncmUgcHJlZmVyIGlzYS9keW5fY2FzdC9jYXN0L2V0Yy4KKy8vLyB0byByZXR1cm4gc21hcnQgcG9pbnRlciAocHJveGllcz8pLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBzaW1wbGlmeV90eXBlPCA6OmNsYW5nOjpDYW5RdWFsPFQ+PiB7CisgIHVzaW5nIFNpbXBsZVR5cGUgPSBjb25zdCBUICo7CisKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKDo6Y2xhbmc6OkNhblF1YWw8VD4gVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXRUeXBlUHRyKCk7CisgIH0KK307CisKKy8vIFRlYWNoIFNtYWxsUHRyU2V0IHRoYXQgQ2FuUXVhbDxUPiBpcyAiYmFzaWNhbGx5IGEgcG9pbnRlciIuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IFBvaW50ZXJMaWtlVHlwZVRyYWl0czxjbGFuZzo6Q2FuUXVhbDxUPj4geworICBzdGF0aWMgdm9pZCAqZ2V0QXNWb2lkUG9pbnRlcihjbGFuZzo6Q2FuUXVhbDxUPiBQKSB7CisgICAgcmV0dXJuIFAuZ2V0QXNPcGFxdWVQdHIoKTsKKyAgfQorCisgIHN0YXRpYyBjbGFuZzo6Q2FuUXVhbDxUPiBnZXRGcm9tVm9pZFBvaW50ZXIodm9pZCAqUCkgeworICAgIHJldHVybiBjbGFuZzo6Q2FuUXVhbDxUPjo6Z2V0RnJvbU9wYXF1ZVB0cihQKTsKKyAgfQorCisgIC8vIHF1YWxpZmllciBpbmZvcm1hdGlvbiBpcyBlbmNvZGVkIGluIHRoZSBsb3cgYml0cy4KKyAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSAwIH07Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBjbGFuZyB7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisvLyBDYW5vbmljYWwgcHJveHkgYWRhcHRvcnMgZm9yIGNhbm9uaWNhbCB0eXBlIG5vZGVzLgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworLy8vIFxicmllZiBJdGVyYXRvciBhZGFwdG9yIHRoYXQgdHVybnMgYW4gaXRlcmF0b3Igb3ZlciBjYW5vbmljYWwgUXVhbFR5cGVzCisvLy8gaW50byBhbiBpdGVyYXRvciBvdmVyIENhblF1YWxUeXBlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPgorc3RydWN0IENhblR5cGVJdGVyYXRvcgorICAgIDogbGx2bTo6aXRlcmF0b3JfYWRhcHRvcl9iYXNlPAorICAgICAgICAgIENhblR5cGVJdGVyYXRvcjxJbnB1dEl0ZXJhdG9yPiwgSW5wdXRJdGVyYXRvciwKKyAgICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJbnB1dEl0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnksCisgICAgICAgICAgQ2FuUXVhbFR5cGUsCisgICAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SW5wdXRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSwKKyAgICAgICAgICBDYW5Qcm94eTxUeXBlPiwgQ2FuUXVhbFR5cGU+IHsKKyAgQ2FuVHlwZUl0ZXJhdG9yKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBDYW5UeXBlSXRlcmF0b3IoSW5wdXRJdGVyYXRvciBJdGVyKQorICAgICAgOiBDYW5UeXBlSXRlcmF0b3I6Oml0ZXJhdG9yX2FkYXB0b3JfYmFzZShzdGQ6Om1vdmUoSXRlcikpIHt9CisKKyAgQ2FuUXVhbFR5cGUgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQ2FuUXVhbFR5cGU6OkNyZWF0ZVVuc2FmZSgqdGhpcy0+SSk7IH0KKyAgQ2FuUHJveHk8VHlwZT4gb3BlcmF0b3ItPigpIGNvbnN0OworfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IENhblByb3h5QWRhcHRvcjxDb21wbGV4VHlwZT4gOiBwdWJsaWMgQ2FuUHJveHlCYXNlPENvbXBsZXhUeXBlPiB7CisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfVFlQRV9BQ0NFU1NPUihnZXRFbGVtZW50VHlwZSkKK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBDYW5Qcm94eUFkYXB0b3I8UG9pbnRlclR5cGU+IDogcHVibGljIENhblByb3h5QmFzZTxQb2ludGVyVHlwZT4geworICBMTFZNX0NMQU5HX0NBTlBST1hZX1RZUEVfQUNDRVNTT1IoZ2V0UG9pbnRlZVR5cGUpCit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQ2FuUHJveHlBZGFwdG9yPEJsb2NrUG9pbnRlclR5cGU+CisgIDogcHVibGljIENhblByb3h5QmFzZTxCbG9ja1BvaW50ZXJUeXBlPiB7CisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfVFlQRV9BQ0NFU1NPUihnZXRQb2ludGVlVHlwZSkKK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBDYW5Qcm94eUFkYXB0b3I8UmVmZXJlbmNlVHlwZT4gOiBwdWJsaWMgQ2FuUHJveHlCYXNlPFJlZmVyZW5jZVR5cGU+IHsKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9UWVBFX0FDQ0VTU09SKGdldFBvaW50ZWVUeXBlKQorfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IENhblByb3h5QWRhcHRvcjxMVmFsdWVSZWZlcmVuY2VUeXBlPgorICA6IHB1YmxpYyBDYW5Qcm94eUJhc2U8TFZhbHVlUmVmZXJlbmNlVHlwZT4geworICBMTFZNX0NMQU5HX0NBTlBST1hZX1RZUEVfQUNDRVNTT1IoZ2V0UG9pbnRlZVR5cGUpCit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQ2FuUHJveHlBZGFwdG9yPFJWYWx1ZVJlZmVyZW5jZVR5cGU+CisgIDogcHVibGljIENhblByb3h5QmFzZTxSVmFsdWVSZWZlcmVuY2VUeXBlPiB7CisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfVFlQRV9BQ0NFU1NPUihnZXRQb2ludGVlVHlwZSkKK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBDYW5Qcm94eUFkYXB0b3I8TWVtYmVyUG9pbnRlclR5cGU+CisgIDogcHVibGljIENhblByb3h5QmFzZTxNZW1iZXJQb2ludGVyVHlwZT4geworICBMTFZNX0NMQU5HX0NBTlBST1hZX1RZUEVfQUNDRVNTT1IoZ2V0UG9pbnRlZVR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGNvbnN0IFR5cGUgKiwgZ2V0Q2xhc3MpCit9OworCisvLyBDYW5Qcm94eUFkYXB0b3JzIGZvciBhcnJheXMgYXJlIGludGVudGlvbmFsbHkgdW5pbXBsZW1lbnRlZCBiZWNhdXNlCisvLyB0aGV5IGFyZSBub3Qgc2FmZS4KK3RlbXBsYXRlPD4gc3RydWN0IENhblByb3h5QWRhcHRvcjxBcnJheVR5cGU+OwordGVtcGxhdGU8PiBzdHJ1Y3QgQ2FuUHJveHlBZGFwdG9yPENvbnN0YW50QXJyYXlUeXBlPjsKK3RlbXBsYXRlPD4gc3RydWN0IENhblByb3h5QWRhcHRvcjxJbmNvbXBsZXRlQXJyYXlUeXBlPjsKK3RlbXBsYXRlPD4gc3RydWN0IENhblByb3h5QWRhcHRvcjxWYXJpYWJsZUFycmF5VHlwZT47Cit0ZW1wbGF0ZTw+IHN0cnVjdCBDYW5Qcm94eUFkYXB0b3I8RGVwZW5kZW50U2l6ZWRBcnJheVR5cGU+OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQ2FuUHJveHlBZGFwdG9yPERlcGVuZGVudFNpemVkRXh0VmVjdG9yVHlwZT4KKyAgOiBwdWJsaWMgQ2FuUHJveHlCYXNlPERlcGVuZGVudFNpemVkRXh0VmVjdG9yVHlwZT4geworICBMTFZNX0NMQU5HX0NBTlBST1hZX1RZUEVfQUNDRVNTT1IoZ2V0RWxlbWVudFR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGNvbnN0IEV4cHIgKiwgZ2V0U2l6ZUV4cHIpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKFNvdXJjZUxvY2F0aW9uLCBnZXRBdHRyaWJ1dGVMb2MpCit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQ2FuUHJveHlBZGFwdG9yPFZlY3RvclR5cGU+IDogcHVibGljIENhblByb3h5QmFzZTxWZWN0b3JUeXBlPiB7CisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfVFlQRV9BQ0NFU1NPUihnZXRFbGVtZW50VHlwZSkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IodW5zaWduZWQsIGdldE51bUVsZW1lbnRzKQorfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IENhblByb3h5QWRhcHRvcjxFeHRWZWN0b3JUeXBlPiA6IHB1YmxpYyBDYW5Qcm94eUJhc2U8RXh0VmVjdG9yVHlwZT4geworICBMTFZNX0NMQU5HX0NBTlBST1hZX1RZUEVfQUNDRVNTT1IoZ2V0RWxlbWVudFR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKHVuc2lnbmVkLCBnZXROdW1FbGVtZW50cykKK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBDYW5Qcm94eUFkYXB0b3I8RnVuY3Rpb25UeXBlPiA6IHB1YmxpYyBDYW5Qcm94eUJhc2U8RnVuY3Rpb25UeXBlPiB7CisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfVFlQRV9BQ0NFU1NPUihnZXRSZXR1cm5UeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihGdW5jdGlvblR5cGU6OkV4dEluZm8sIGdldEV4dEluZm8pCit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQ2FuUHJveHlBZGFwdG9yPEZ1bmN0aW9uTm9Qcm90b1R5cGU+CisgIDogcHVibGljIENhblByb3h5QmFzZTxGdW5jdGlvbk5vUHJvdG9UeXBlPiB7CisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfVFlQRV9BQ0NFU1NPUihnZXRSZXR1cm5UeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihGdW5jdGlvblR5cGU6OkV4dEluZm8sIGdldEV4dEluZm8pCit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQ2FuUHJveHlBZGFwdG9yPEZ1bmN0aW9uUHJvdG9UeXBlPgorICA6IHB1YmxpYyBDYW5Qcm94eUJhc2U8RnVuY3Rpb25Qcm90b1R5cGU+IHsKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9UWVBFX0FDQ0VTU09SKGdldFJldHVyblR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKEZ1bmN0aW9uVHlwZTo6RXh0SW5mbywgZ2V0RXh0SW5mbykKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IodW5zaWduZWQsIGdldE51bVBhcmFtcykKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaGFzRXh0UGFyYW1ldGVySW5mb3MpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKAorICAgICAgICAgICAgQXJyYXlSZWY8RnVuY3Rpb25Qcm90b1R5cGU6OkV4dFBhcmFtZXRlckluZm8+LCBnZXRFeHRQYXJhbWV0ZXJJbmZvcykKKworICBDYW5RdWFsVHlwZSBnZXRQYXJhbVR5cGUodW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBDYW5RdWFsVHlwZTo6Q3JlYXRlVW5zYWZlKHRoaXMtPmdldFR5cGVQdHIoKS0+Z2V0UGFyYW1UeXBlKGkpKTsKKyAgfQorCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzVmFyaWFkaWMpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKHVuc2lnbmVkLCBnZXRUeXBlUXVhbHMpCisKKyAgdXNpbmcgcGFyYW1fdHlwZV9pdGVyYXRvciA9CisgICAgICBDYW5UeXBlSXRlcmF0b3I8RnVuY3Rpb25Qcm90b1R5cGU6OnBhcmFtX3R5cGVfaXRlcmF0b3I+OworCisgIHBhcmFtX3R5cGVfaXRlcmF0b3IgcGFyYW1fdHlwZV9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gcGFyYW1fdHlwZV9pdGVyYXRvcih0aGlzLT5nZXRUeXBlUHRyKCktPnBhcmFtX3R5cGVfYmVnaW4oKSk7CisgIH0KKworICBwYXJhbV90eXBlX2l0ZXJhdG9yIHBhcmFtX3R5cGVfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBwYXJhbV90eXBlX2l0ZXJhdG9yKHRoaXMtPmdldFR5cGVQdHIoKS0+cGFyYW1fdHlwZV9lbmQoKSk7CisgIH0KKworICAvLyBOb3RlOiBjYW5vbmljYWwgZnVuY3Rpb24gdHlwZXMgbmV2ZXIgaGF2ZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMKK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBDYW5Qcm94eUFkYXB0b3I8VHlwZU9mVHlwZT4gOiBwdWJsaWMgQ2FuUHJveHlCYXNlPFR5cGVPZlR5cGU+IHsKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9UWVBFX0FDQ0VTU09SKGdldFVuZGVybHlpbmdUeXBlKQorfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IENhblByb3h5QWRhcHRvcjxEZWNsdHlwZVR5cGU+IDogcHVibGljIENhblByb3h5QmFzZTxEZWNsdHlwZVR5cGU+IHsKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoRXhwciAqLCBnZXRVbmRlcmx5aW5nRXhwcikKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9UWVBFX0FDQ0VTU09SKGdldFVuZGVybHlpbmdUeXBlKQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBDYW5Qcm94eUFkYXB0b3I8VW5hcnlUcmFuc2Zvcm1UeXBlPgorICAgIDogcHVibGljIENhblByb3h5QmFzZTxVbmFyeVRyYW5zZm9ybVR5cGU+IHsKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9UWVBFX0FDQ0VTU09SKGdldEJhc2VUeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1RZUEVfQUNDRVNTT1IoZ2V0VW5kZXJseWluZ1R5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKFVuYXJ5VHJhbnNmb3JtVHlwZTo6VVRUS2luZCwgZ2V0VVRUS2luZCkKK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBDYW5Qcm94eUFkYXB0b3I8VGFnVHlwZT4gOiBwdWJsaWMgQ2FuUHJveHlCYXNlPFRhZ1R5cGU+IHsKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoVGFnRGVjbCAqLCBnZXREZWNsKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc0JlaW5nRGVmaW5lZCkKK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBDYW5Qcm94eUFkYXB0b3I8UmVjb3JkVHlwZT4gOiBwdWJsaWMgQ2FuUHJveHlCYXNlPFJlY29yZFR5cGU+IHsKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoUmVjb3JkRGVjbCAqLCBnZXREZWNsKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc0JlaW5nRGVmaW5lZCkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaGFzQ29uc3RGaWVsZHMpCit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQ2FuUHJveHlBZGFwdG9yPEVudW1UeXBlPiA6IHB1YmxpYyBDYW5Qcm94eUJhc2U8RW51bVR5cGU+IHsKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoRW51bURlY2wgKiwgZ2V0RGVjbCkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaXNCZWluZ0RlZmluZWQpCit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQ2FuUHJveHlBZGFwdG9yPFRlbXBsYXRlVHlwZVBhcm1UeXBlPgorICA6IHB1YmxpYyBDYW5Qcm94eUJhc2U8VGVtcGxhdGVUeXBlUGFybVR5cGU+IHsKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IodW5zaWduZWQsIGdldERlcHRoKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUih1bnNpZ25lZCwgZ2V0SW5kZXgpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzUGFyYW1ldGVyUGFjaykKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoVGVtcGxhdGVUeXBlUGFybURlY2wgKiwgZ2V0RGVjbCkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoSWRlbnRpZmllckluZm8gKiwgZ2V0SWRlbnRpZmllcikKK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBDYW5Qcm94eUFkYXB0b3I8T2JqQ09iamVjdFR5cGU+CisgIDogcHVibGljIENhblByb3h5QmFzZTxPYmpDT2JqZWN0VHlwZT4geworICBMTFZNX0NMQU5HX0NBTlBST1hZX1RZUEVfQUNDRVNTT1IoZ2V0QmFzZVR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEludGVyZmFjZSkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaXNPYmpDVW5xdWFsaWZpZWRJZCkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaXNPYmpDVW5xdWFsaWZpZWRDbGFzcykKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaXNPYmpDUXVhbGlmaWVkSWQpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzT2JqQ1F1YWxpZmllZENsYXNzKQorCisgIHVzaW5nIHF1YWxfaXRlcmF0b3IgPSBPYmpDT2JqZWN0UG9pbnRlclR5cGU6OnF1YWxfaXRlcmF0b3I7CisKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IocXVhbF9pdGVyYXRvciwgcXVhbF9iZWdpbikKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IocXVhbF9pdGVyYXRvciwgcXVhbF9lbmQpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIHF1YWxfZW1wdHkpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKHVuc2lnbmVkLCBnZXROdW1Qcm90b2NvbHMpCit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQ2FuUHJveHlBZGFwdG9yPE9iakNPYmplY3RQb2ludGVyVHlwZT4KKyAgOiBwdWJsaWMgQ2FuUHJveHlCYXNlPE9iakNPYmplY3RQb2ludGVyVHlwZT4geworICBMTFZNX0NMQU5HX0NBTlBST1hZX1RZUEVfQUNDRVNTT1IoZ2V0UG9pbnRlZVR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGNvbnN0IE9iakNJbnRlcmZhY2VUeXBlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEludGVyZmFjZVR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzT2JqQ0lkVHlwZSkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9TSU1QTEVfQUNDRVNTT1IoYm9vbCwgaXNPYmpDQ2xhc3NUeXBlKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBpc09iakNRdWFsaWZpZWRJZFR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzT2JqQ1F1YWxpZmllZENsYXNzVHlwZSkKKworICB1c2luZyBxdWFsX2l0ZXJhdG9yID0gT2JqQ09iamVjdFBvaW50ZXJUeXBlOjpxdWFsX2l0ZXJhdG9yOworCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKHF1YWxfaXRlcmF0b3IsIHF1YWxfYmVnaW4pCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKHF1YWxfaXRlcmF0b3IsIHF1YWxfZW5kKQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihib29sLCBxdWFsX2VtcHR5KQorICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUih1bnNpZ25lZCwgZ2V0TnVtUHJvdG9jb2xzKQorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKy8vIE1ldGhvZCBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIENhblF1YWw8VD4gQ2FuUXVhbDxUPjo6Z2V0VW5xdWFsaWZpZWRUeXBlKCkgY29uc3QgeworICByZXR1cm4gQ2FuUXVhbDxUPjo6Q3JlYXRlVW5zYWZlKFN0b3JlZC5nZXRMb2NhbFVucXVhbGlmaWVkVHlwZSgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2lubGluZSBDYW5RdWFsPFR5cGU+IENhblF1YWw8VD46OmdldE5vblJlZmVyZW5jZVR5cGUoKSBjb25zdCB7CisgIGlmIChDYW5RdWFsPFJlZmVyZW5jZVR5cGU+IFJlZlR5cGUgPSBnZXRBczxSZWZlcmVuY2VUeXBlPigpKQorICAgIHJldHVybiBSZWZUeXBlLT5nZXRQb2ludGVlVHlwZSgpOworICBlbHNlCisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQ2FuUXVhbDxUPiBDYW5RdWFsPFQ+OjpnZXRGcm9tT3BhcXVlUHRyKHZvaWQgKlB0cikgeworICBDYW5RdWFsPFQ+IFJlc3VsdDsKKyAgUmVzdWx0LlN0b3JlZCA9IFF1YWxUeXBlOjpnZXRGcm9tT3BhcXVlUHRyKFB0cik7CisgIGFzc2VydCgoIVJlc3VsdCB8fCBSZXN1bHQuU3RvcmVkLmdldEFzT3BhcXVlUHRyKCkgPT0gKHZvaWQqKS0xIHx8CisgICAgICAgICAgUmVzdWx0LlN0b3JlZC5pc0Nhbm9uaWNhbCgpKSAmJiAiVHlwZSBpcyBub3QgY2Fub25pY2FsISIpOworICByZXR1cm4gUmVzdWx0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQ2FuUXVhbDxUPiBDYW5RdWFsPFQ+OjpDcmVhdGVVbnNhZmUoUXVhbFR5cGUgT3RoZXIpIHsKKyAgYXNzZXJ0KChPdGhlci5pc051bGwoKSB8fCBPdGhlci5pc0Nhbm9uaWNhbCgpKSAmJiAiVHlwZSBpcyBub3QgY2Fub25pY2FsISIpOworICBhc3NlcnQoKE90aGVyLmlzTnVsbCgpIHx8IGlzYTxUPihPdGhlci5nZXRUeXBlUHRyKCkpKSAmJgorICAgICAgICAgIkR5bmFtaWMgdHlwZSBkb2VzIG5vdCBtZWV0IHRoZSBzdGF0aWMgdHlwZSdzIHJlcXVpcmVzIik7CisgIENhblF1YWw8VD4gUmVzdWx0OworICBSZXN1bHQuU3RvcmVkID0gT3RoZXI7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorQ2FuUHJveHk8VT4gQ2FuUXVhbDxUPjo6Z2V0QXMoKSBjb25zdCB7CisgIHN0YXRpY19hc3NlcnQoIVR5cGVJc0FycmF5VHlwZTxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIkFycmF5VHlwZSBjYW5ub3QgYmUgdXNlZCB3aXRoIGdldEFzISIpOworCisgIGlmIChTdG9yZWQuaXNOdWxsKCkpCisgICAgcmV0dXJuIENhblByb3h5PFU+KCk7CisKKyAgaWYgKGlzYTxVPihTdG9yZWQuZ2V0VHlwZVB0cigpKSkKKyAgICByZXR1cm4gQ2FuUXVhbDxVPjo6Q3JlYXRlVW5zYWZlKFN0b3JlZCk7CisKKyAgcmV0dXJuIENhblByb3h5PFU+KCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorQ2FuUHJveHk8VT4gQ2FuUXVhbDxUPjo6Y2FzdEFzKCkgY29uc3QgeworICBzdGF0aWNfYXNzZXJ0KCFUeXBlSXNBcnJheVR5cGU8VT46OnZhbHVlLAorICAgICAgICAgICAgICAgICJBcnJheVR5cGUgY2Fubm90IGJlIHVzZWQgd2l0aCBjYXN0QXMhIik7CisKKyAgYXNzZXJ0KCFTdG9yZWQuaXNOdWxsKCkgJiYgaXNhPFU+KFN0b3JlZC5nZXRUeXBlUHRyKCkpKTsKKyAgcmV0dXJuIENhblF1YWw8VT46OkNyZWF0ZVVuc2FmZShTdG9yZWQpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQ2FuUHJveHk8VD4gQ2FuUXVhbDxUPjo6b3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgcmV0dXJuIENhblByb3h5PFQ+KCp0aGlzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CitDYW5Qcm94eTxUeXBlPiBDYW5UeXBlSXRlcmF0b3I8SW5wdXRJdGVyYXRvcj46Om9wZXJhdG9yLT4oKSBjb25zdCB7CisgIHJldHVybiBDYW5Qcm94eTxUeXBlPigqdGhpcyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9DQU5PTklDQUxUWVBFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9DaGFyVW5pdHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9DaGFyVW5pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGVhZDYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0NoYXJVbml0cy5oCkBAIC0wLDAgKzEsMjQ3IEBACisvLz09PS0tLSBDaGFyVW5pdHMuaCAtIENoYXJhY3RlciB1bml0cyBmb3Igc2l6ZXMgYW5kIG9mZnNldHMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQ2hhclVuaXRzIGNsYXNzCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9DSEFSVU5JVFNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9DSEFSVU5JVFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKKyAgLy8vIENoYXJVbml0cyAtIFRoaXMgaXMgYW4gb3BhcXVlIHR5cGUgZm9yIHNpemVzIGV4cHJlc3NlZCBpbiBjaGFyYWN0ZXIgdW5pdHMuCisgIC8vLyBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHJlcHJlc2VudCBhIHF1YW50aXR5IGFzIGEgbXVsdGlwbGUgb2YgdGhlIHNpemUKKyAgLy8vIG9mIHRoZSBzdGFuZGFyZCBDIHR5cGUsIGNoYXIsIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiBBcyBhbiBvcGFxdWUKKyAgLy8vIHR5cGUsIENoYXJVbml0cyBwcm90ZWN0cyB5b3UgZnJvbSBhY2NpZGVudGFsbHkgY29tYmluaW5nIG9wZXJhdGlvbnMgb24KKyAgLy8vIHF1YW50aXRpZXMgaW4gYml0IHVuaXRzIGFuZCBjaGFyYWN0ZXIgdW5pdHMuCisgIC8vLworICAvLy8gSW4gYm90aCBDIGFuZCBDKyssIGFuIG9iamVjdCBvZiB0eXBlICdjaGFyJywgJ3NpZ25lZCBjaGFyJywgb3IgJ3Vuc2lnbmVkCisgIC8vLyBjaGFyJyBvY2N1cGllcyBleGFjdGx5IG9uZSBieXRlLCBzbyAnY2hhcmFjdGVyIHVuaXQnIGFuZCAnYnl0ZScgcmVmZXIgdG8KKyAgLy8vIHRoZSBzYW1lIHF1YW50aXR5IG9mIHN0b3JhZ2UuIEhvd2V2ZXIsIHdlIHVzZSB0aGUgdGVybSAnY2hhcmFjdGVyIHVuaXQnCisgIC8vLyByYXRoZXIgdGhhbiAnYnl0ZScgdG8gYXZvaWQgYW4gaW1wbGljYXRpb24gdGhhdCBhIGNoYXJhY3RlciB1bml0IGlzCisgIC8vLyBleGFjdGx5IDggYml0cy4KKyAgLy8vCisgIC8vLyBGb3IgcG9ydGFiaWxpdHksIG5ldmVyIGFzc3VtZSB0aGF0IGEgdGFyZ2V0IGNoYXJhY3RlciBpcyA4IGJpdHMgd2lkZS4gVXNlCisgIC8vLyBDaGFyVW5pdCB2YWx1ZXMgd2hlcmV2ZXIgeW91IGNhbGN1bGF0ZSBzaXplcywgb2Zmc2V0cywgb3IgYWxpZ25tZW50cworICAvLy8gaW4gY2hhcmFjdGVyIHVuaXRzLgorICBjbGFzcyBDaGFyVW5pdHMgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgaW50NjRfdCBRdWFudGl0eVR5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgUXVhbnRpdHlUeXBlIFF1YW50aXR5ID0gMDsKKworICAgICAgZXhwbGljaXQgQ2hhclVuaXRzKFF1YW50aXR5VHlwZSBDKSA6IFF1YW50aXR5KEMpIHt9CisKKyAgICBwdWJsaWM6CisKKyAgICAgIC8vLyBDaGFyVW5pdHMgLSBBIGRlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICBDaGFyVW5pdHMoKSA9IGRlZmF1bHQ7CisKKyAgICAgIC8vLyBaZXJvIC0gQ29uc3RydWN0IGEgQ2hhclVuaXRzIHF1YW50aXR5IG9mIHplcm8uCisgICAgICBzdGF0aWMgQ2hhclVuaXRzIFplcm8oKSB7CisgICAgICAgIHJldHVybiBDaGFyVW5pdHMoMCk7CisgICAgICB9CisKKyAgICAgIC8vLyBPbmUgLSBDb25zdHJ1Y3QgYSBDaGFyVW5pdHMgcXVhbnRpdHkgb2Ygb25lLgorICAgICAgc3RhdGljIENoYXJVbml0cyBPbmUoKSB7CisgICAgICAgIHJldHVybiBDaGFyVW5pdHMoMSk7CisgICAgICB9CisKKyAgICAgIC8vLyBmcm9tUXVhbnRpdHkgLSBDb25zdHJ1Y3QgYSBDaGFyVW5pdHMgcXVhbnRpdHkgZnJvbSBhIHJhdyBpbnRlZ2VyIHR5cGUuCisgICAgICBzdGF0aWMgQ2hhclVuaXRzIGZyb21RdWFudGl0eShRdWFudGl0eVR5cGUgUXVhbnRpdHkpIHsKKyAgICAgICAgcmV0dXJuIENoYXJVbml0cyhRdWFudGl0eSk7IAorICAgICAgfQorCisgICAgICAvLyBDb21wb3VuZCBhc3NpZ25tZW50LgorICAgICAgQ2hhclVuaXRzJiBvcGVyYXRvcis9IChjb25zdCBDaGFyVW5pdHMgJk90aGVyKSB7CisgICAgICAgIFF1YW50aXR5ICs9IE90aGVyLlF1YW50aXR5OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICBDaGFyVW5pdHMmIG9wZXJhdG9yKysgKCkgeworICAgICAgICArK1F1YW50aXR5OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICBDaGFyVW5pdHMgb3BlcmF0b3IrKyAoaW50KSB7CisgICAgICAgIHJldHVybiBDaGFyVW5pdHMoUXVhbnRpdHkrKyk7CisgICAgICB9CisgICAgICBDaGFyVW5pdHMmIG9wZXJhdG9yLT0gKGNvbnN0IENoYXJVbml0cyAmT3RoZXIpIHsKKyAgICAgICAgUXVhbnRpdHkgLT0gT3RoZXIuUXVhbnRpdHk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIENoYXJVbml0cyYgb3BlcmF0b3ItLSAoKSB7CisgICAgICAgIC0tUXVhbnRpdHk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIENoYXJVbml0cyBvcGVyYXRvci0tIChpbnQpIHsKKyAgICAgICAgcmV0dXJuIENoYXJVbml0cyhRdWFudGl0eS0tKTsKKyAgICAgIH0KKyAgICAgICAKKyAgICAgIC8vIENvbXBhcmlzb24gb3BlcmF0b3JzLgorICAgICAgYm9vbCBvcGVyYXRvcj09IChjb25zdCBDaGFyVW5pdHMgJk90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBRdWFudGl0eSA9PSBPdGhlci5RdWFudGl0eTsKKyAgICAgIH0KKyAgICAgIGJvb2wgb3BlcmF0b3IhPSAoY29uc3QgQ2hhclVuaXRzICZPdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gUXVhbnRpdHkgIT0gT3RoZXIuUXVhbnRpdHk7CisgICAgICB9CisKKyAgICAgIC8vIFJlbGF0aW9uYWwgb3BlcmF0b3JzLgorICAgICAgYm9vbCBvcGVyYXRvcjwgIChjb25zdCBDaGFyVW5pdHMgJk90aGVyKSBjb25zdCB7IAorICAgICAgICByZXR1cm4gUXVhbnRpdHkgPCAgT3RoZXIuUXVhbnRpdHk7IAorICAgICAgfQorICAgICAgYm9vbCBvcGVyYXRvcjw9IChjb25zdCBDaGFyVW5pdHMgJk90aGVyKSBjb25zdCB7IAorICAgICAgICByZXR1cm4gUXVhbnRpdHkgPD0gT3RoZXIuUXVhbnRpdHk7CisgICAgICB9CisgICAgICBib29sIG9wZXJhdG9yPiAgKGNvbnN0IENoYXJVbml0cyAmT3RoZXIpIGNvbnN0IHsgCisgICAgICAgIHJldHVybiBRdWFudGl0eSA+ICBPdGhlci5RdWFudGl0eTsgCisgICAgICB9CisgICAgICBib29sIG9wZXJhdG9yPj0gKGNvbnN0IENoYXJVbml0cyAmT3RoZXIpIGNvbnN0IHsgCisgICAgICAgIHJldHVybiBRdWFudGl0eSA+PSBPdGhlci5RdWFudGl0eTsgCisgICAgICB9CisKKyAgICAgIC8vIE90aGVyIHByZWRpY2F0ZXMuCisgICAgICAKKyAgICAgIC8vLyBpc1plcm8gLSBUZXN0IHdoZXRoZXIgdGhlIHF1YW50aXR5IGVxdWFscyB6ZXJvLgorICAgICAgYm9vbCBpc1plcm8oKSBjb25zdCAgICAgeyByZXR1cm4gUXVhbnRpdHkgPT0gMDsgfQorCisgICAgICAvLy8gaXNPbmUgLSBUZXN0IHdoZXRoZXIgdGhlIHF1YW50aXR5IGVxdWFscyBvbmUuCisgICAgICBib29sIGlzT25lKCkgY29uc3QgICAgICB7IHJldHVybiBRdWFudGl0eSA9PSAxOyB9CisKKyAgICAgIC8vLyBpc1Bvc2l0aXZlIC0gVGVzdCB3aGV0aGVyIHRoZSBxdWFudGl0eSBpcyBncmVhdGVyIHRoYW4gemVyby4KKyAgICAgIGJvb2wgaXNQb3NpdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIFF1YW50aXR5ICA+IDA7IH0KKworICAgICAgLy8vIGlzTmVnYXRpdmUgLSBUZXN0IHdoZXRoZXIgdGhlIHF1YW50aXR5IGlzIGxlc3MgdGhhbiB6ZXJvLgorICAgICAgYm9vbCBpc05lZ2F0aXZlKCkgY29uc3QgeyByZXR1cm4gUXVhbnRpdHkgIDwgMDsgfQorCisgICAgICAvLy8gaXNQb3dlck9mVHdvIC0gVGVzdCB3aGV0aGVyIHRoZSBxdWFudGl0eSBpcyBhIHBvd2VyIG9mIHR3by4KKyAgICAgIC8vLyBaZXJvIGlzIG5vdCBhIHBvd2VyIG9mIHR3by4KKyAgICAgIGJvb2wgaXNQb3dlck9mVHdvKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKFF1YW50aXR5ICYgLVF1YW50aXR5KSA9PSBRdWFudGl0eTsKKyAgICAgIH0KKworICAgICAgLy8vIFRlc3Qgd2hldGhlciB0aGlzIGlzIGEgbXVsdGlwbGUgb2YgdGhlIG90aGVyIHZhbHVlLgorICAgICAgLy8vCisgICAgICAvLy8gQW1vbmcgb3RoZXIgdGhpbmdzLCB0aGlzIHByb21pc2VzIHRoYXQKKyAgICAgIC8vLyBzZWxmLmFsaWduVG8oTikgd2lsbCBqdXN0IHJldHVybiBzZWxmLgorICAgICAgYm9vbCBpc011bHRpcGxlT2YoQ2hhclVuaXRzIE4pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgqdGhpcyAlIE4pID09IDA7CisgICAgICB9CisKKyAgICAgIC8vIEFyaXRobWV0aWMgb3BlcmF0b3JzLgorICAgICAgQ2hhclVuaXRzIG9wZXJhdG9yKiAoUXVhbnRpdHlUeXBlIE4pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIENoYXJVbml0cyhRdWFudGl0eSAqIE4pOworICAgICAgfQorICAgICAgQ2hhclVuaXRzICZvcGVyYXRvcio9IChRdWFudGl0eVR5cGUgTikgeworICAgICAgICBRdWFudGl0eSAqPSBOOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICBDaGFyVW5pdHMgb3BlcmF0b3IvIChRdWFudGl0eVR5cGUgTikgY29uc3QgeworICAgICAgICByZXR1cm4gQ2hhclVuaXRzKFF1YW50aXR5IC8gTik7CisgICAgICB9CisgICAgICBDaGFyVW5pdHMgJm9wZXJhdG9yLz0gKFF1YW50aXR5VHlwZSBOKSB7CisgICAgICAgIFF1YW50aXR5IC89IE47CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIFF1YW50aXR5VHlwZSBvcGVyYXRvci8gKGNvbnN0IENoYXJVbml0cyAmT3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFF1YW50aXR5IC8gT3RoZXIuUXVhbnRpdHk7CisgICAgICB9CisgICAgICBDaGFyVW5pdHMgb3BlcmF0b3IlIChRdWFudGl0eVR5cGUgTikgY29uc3QgeworICAgICAgICByZXR1cm4gQ2hhclVuaXRzKFF1YW50aXR5ICUgTik7CisgICAgICB9CisgICAgICBRdWFudGl0eVR5cGUgb3BlcmF0b3IlIChjb25zdCBDaGFyVW5pdHMgJk90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBRdWFudGl0eSAlIE90aGVyLlF1YW50aXR5OworICAgICAgfQorICAgICAgQ2hhclVuaXRzIG9wZXJhdG9yKyAoY29uc3QgQ2hhclVuaXRzICZPdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gQ2hhclVuaXRzKFF1YW50aXR5ICsgT3RoZXIuUXVhbnRpdHkpOworICAgICAgfQorICAgICAgQ2hhclVuaXRzIG9wZXJhdG9yLSAoY29uc3QgQ2hhclVuaXRzICZPdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gQ2hhclVuaXRzKFF1YW50aXR5IC0gT3RoZXIuUXVhbnRpdHkpOworICAgICAgfQorICAgICAgQ2hhclVuaXRzIG9wZXJhdG9yLSAoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDaGFyVW5pdHMoLVF1YW50aXR5KTsKKyAgICAgIH0KKworICAgICAgCisgICAgICAvLyBDb252ZXJzaW9ucy4KKworICAgICAgLy8vIGdldFF1YW50aXR5IC0gR2V0IHRoZSByYXcgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHF1YW50aXR5LgorICAgICAgUXVhbnRpdHlUeXBlIGdldFF1YW50aXR5KCkgY29uc3QgeyByZXR1cm4gUXVhbnRpdHk7IH0KKworICAgICAgLy8vIGFsaWduVG8gLSBSZXR1cm5zIHRoZSBuZXh0IGludGVnZXIgKG1vZCAyKio2NCkgdGhhdCBpcworICAgICAgLy8vIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGlzIHF1YW50aXR5IGFuZCBpcyBhIG11bHRpcGxlIG9mIFxwIEFsaWduLgorICAgICAgLy8vIEFsaWduIG11c3QgYmUgbm9uLXplcm8uCisgICAgICBDaGFyVW5pdHMgYWxpZ25Ubyhjb25zdCBDaGFyVW5pdHMgJkFsaWduKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDaGFyVW5pdHMobGx2bTo6YWxpZ25UbyhRdWFudGl0eSwgQWxpZ24uUXVhbnRpdHkpKTsKKyAgICAgIH0KKworICAgICAgLy8vIEdpdmVuIHRoYXQgdGhpcyBpcyBhIG5vbi16ZXJvIGFsaWdubWVudCB2YWx1ZSwgd2hhdCBpcyB0aGUKKyAgICAgIC8vLyBhbGlnbm1lbnQgYXQgdGhlIGdpdmVuIG9mZnNldD8KKyAgICAgIENoYXJVbml0cyBhbGlnbm1lbnRBdE9mZnNldChDaGFyVW5pdHMgb2Zmc2V0KSBjb25zdCB7CisgICAgICAgIGFzc2VydChRdWFudGl0eSAhPSAwICYmICJvZmZzZXR0aW5nIGZyb20gdW5rbm93biBhbGlnbm1lbnQ/Iik7CisgICAgICAgIHJldHVybiBDaGFyVW5pdHMobGx2bTo6TWluQWxpZ24oUXVhbnRpdHksIG9mZnNldC5RdWFudGl0eSkpOworICAgICAgfQorCisgICAgICAvLy8gR2l2ZW4gdGhhdCB0aGlzIGlzIHRoZSBhbGlnbm1lbnQgb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYW4KKyAgICAgIC8vLyBhcnJheSwgcmV0dXJuIHRoZSBtaW5pbXVtIGFsaWdubWVudCBvZiBhbnkgZWxlbWVudCBpbiB0aGUgYXJyYXkuCisgICAgICBDaGFyVW5pdHMgYWxpZ25tZW50T2ZBcnJheUVsZW1lbnQoQ2hhclVuaXRzIGVsZW1lbnRTaXplKSBjb25zdCB7CisgICAgICAgIC8vIFNpbmNlIHdlIGRvbid0IHRyYWNrIG9mZnNldHRlZCBhbGlnbm1lbnRzLCB0aGUgYWxpZ25tZW50IG9mCisgICAgICAgIC8vIHRoZSBzZWNvbmQgZWxlbWVudCAob3IgYW55IG9kZCBlbGVtZW50KSB3aWxsIGJlIG1pbmltYWxseQorICAgICAgICAvLyBhbGlnbmVkLgorICAgICAgICByZXR1cm4gYWxpZ25tZW50QXRPZmZzZXQoZWxlbWVudFNpemUpOworICAgICAgfQorCisKKyAgfTsgLy8gY2xhc3MgQ2hhclVuaXQKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKK2lubGluZSBjbGFuZzo6Q2hhclVuaXRzIG9wZXJhdG9yKiAoY2xhbmc6OkNoYXJVbml0czo6UXVhbnRpdHlUeXBlIFNjYWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhbmc6OkNoYXJVbml0cyAmQ1UpIHsKKyAgcmV0dXJuIENVICogU2NhbGU7Cit9CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPGNsYW5nOjpDaGFyVW5pdHM+IHsKKyAgc3RhdGljIGNsYW5nOjpDaGFyVW5pdHMgZ2V0RW1wdHlLZXkoKSB7CisgICAgY2xhbmc6OkNoYXJVbml0czo6UXVhbnRpdHlUeXBlIFF1YW50aXR5ID0KKyAgICAgIERlbnNlTWFwSW5mbzxjbGFuZzo6Q2hhclVuaXRzOjpRdWFudGl0eVR5cGU+OjpnZXRFbXB0eUtleSgpOworCisgICAgcmV0dXJuIGNsYW5nOjpDaGFyVW5pdHM6OmZyb21RdWFudGl0eShRdWFudGl0eSk7CisgIH0KKworICBzdGF0aWMgY2xhbmc6OkNoYXJVbml0cyBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgY2xhbmc6OkNoYXJVbml0czo6UXVhbnRpdHlUeXBlIFF1YW50aXR5ID0KKyAgICAgIERlbnNlTWFwSW5mbzxjbGFuZzo6Q2hhclVuaXRzOjpRdWFudGl0eVR5cGU+OjpnZXRUb21ic3RvbmVLZXkoKTsKKyAgICAKKyAgICByZXR1cm4gY2xhbmc6OkNoYXJVbml0czo6ZnJvbVF1YW50aXR5KFF1YW50aXR5KTsgICAgCisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IGNsYW5nOjpDaGFyVW5pdHMgJkNVKSB7CisgICAgY2xhbmc6OkNoYXJVbml0czo6UXVhbnRpdHlUeXBlIFF1YW50aXR5ID0gQ1UuZ2V0UXVhbnRpdHkoKTsKKyAgICByZXR1cm4gRGVuc2VNYXBJbmZvPGNsYW5nOjpDaGFyVW5pdHM6OlF1YW50aXR5VHlwZT46OmdldEhhc2hWYWx1ZShRdWFudGl0eSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IGNsYW5nOjpDaGFyVW5pdHMgJkxIUywgCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhbmc6OkNoYXJVbml0cyAmUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc1BvZExpa2U8Y2xhbmc6OkNoYXJVbml0cz4geworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworICAKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9DSEFSVU5JVFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ0NzBjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50LmgKQEAgLTAsMCArMSwxMTQyIEBACisvLz09PS0tLSBDb21tZW50LmggLSBDb21tZW50IEFTVCBub2RlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyBjb21tZW50IEFTVCBub2Rlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0NPTU1FTlRfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9DT01NRU5UX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9Db21tZW50Q29tbWFuZFRyYWl0cy5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsT2JqQy5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorCituYW1lc3BhY2UgY2xhbmcgeworY2xhc3MgRGVjbDsKK2NsYXNzIFBhcm1WYXJEZWNsOworY2xhc3MgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0OworCituYW1lc3BhY2UgY29tbWVudHMgeworY2xhc3MgRnVsbENvbW1lbnQ7CisKKy8vLyBEZXNjcmliZXMgdGhlIHN5bnRheCB0aGF0IHdhcyB1c2VkIGluIGEgZG9jdW1lbnRhdGlvbiBjb21tYW5kLgorLy8vCisvLy8gRXhhY3QgdmFsdWVzIG9mIHRoaXMgZW51bWVyYXRpb24gYXJlIGltcG9ydGFudCBiZWNhdXNlIHRoZXkgdXNlZCB0byBzZWxlY3QKKy8vLyBwYXJ0cyBvZiBkaWFnbm9zdGljIG1lc3NhZ2VzLiAgQXVkaXQgZGlhZ25vc3RpY3MgYmVmb3JlIGNoYW5naW5nIG9yIGFkZGluZworLy8vIGEgbmV3IHZhbHVlLgorZW51bSBDb21tYW5kTWFya2VyS2luZCB7CisgIC8vLyBDb21tYW5kIHN0YXJ0ZWQgd2l0aCBhIGJhY2tzbGFzaCBjaGFyYWN0ZXI6CisgIC8vLyBcY29kZQorICAvLy8gICBcZm9vCisgIC8vLyBcZW5kY29kZQorICBDTUtfQmFja3NsYXNoID0gMCwKKworICAvLy8gQ29tbWFuZCBzdGFydGVkIHdpdGggYW4gJ2F0JyBjaGFyYWN0ZXI6CisgIC8vLyBcY29kZQorICAvLy8gICBAZm9vCisgIC8vLyBcZW5kY29kZQorICBDTUtfQXQgPSAxCit9OworCisvLy8gQW55IHBhcnQgb2YgdGhlIGNvbW1lbnQuCisvLy8gQWJzdHJhY3QgY2xhc3MuCitjbGFzcyBDb21tZW50IHsKK3Byb3RlY3RlZDoKKyAgLy8vIFByZWZlcnJlZCBsb2NhdGlvbiB0byBzaG93IGNhcmV0LgorICBTb3VyY2VMb2NhdGlvbiBMb2M7CisKKyAgLy8vIFNvdXJjZSByYW5nZSBvZiB0aGlzIEFTVCBub2RlLgorICBTb3VyY2VSYW5nZSBSYW5nZTsKKworICBjbGFzcyBDb21tZW50Qml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgQ29tbWVudDsKKworICAgIC8vLyBUeXBlIG9mIHRoaXMgQVNUIG5vZGUuCisgICAgdW5zaWduZWQgS2luZCA6IDg7CisgIH07CisgIGVudW0geyBOdW1Db21tZW50Qml0cyA9IDggfTsKKworICBjbGFzcyBJbmxpbmVDb250ZW50Q29tbWVudEJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIElubGluZUNvbnRlbnRDb21tZW50OworCisgICAgdW5zaWduZWQgOiBOdW1Db21tZW50Qml0czsKKworICAgIC8vLyBUcnVlIGlmIHRoZXJlIGlzIGEgbmV3bGluZSBhZnRlciB0aGlzIGlubGluZSBjb250ZW50IG5vZGUuCisgICAgLy8vIChUaGVyZSBpcyBubyBzZXBhcmF0ZSBBU1Qgbm9kZSBmb3IgYSBuZXdsaW5lLikKKyAgICB1bnNpZ25lZCBIYXNUcmFpbGluZ05ld2xpbmUgOiAxOworICB9OworICBlbnVtIHsgTnVtSW5saW5lQ29udGVudENvbW1lbnRCaXRzID0gTnVtQ29tbWVudEJpdHMgKyAxIH07CisKKyAgY2xhc3MgVGV4dENvbW1lbnRCaXRmaWVsZHMgeworICAgIGZyaWVuZCBjbGFzcyBUZXh0Q29tbWVudDsKKworICAgIHVuc2lnbmVkIDogTnVtSW5saW5lQ29udGVudENvbW1lbnRCaXRzOworCisgICAgLy8vIFRydWUgaWYgXGMgSXNXaGl0ZXNwYWNlIGZpZWxkIGNvbnRhaW5zIGEgdmFsaWQgdmFsdWUuCisgICAgbXV0YWJsZSB1bnNpZ25lZCBJc1doaXRlc3BhY2VWYWxpZCA6IDE7CisKKyAgICAvLy8gVHJ1ZSBpZiB0aGlzIGNvbW1lbnQgQVNUIG5vZGUgY29udGFpbnMgb25seSB3aGl0ZXNwYWNlLgorICAgIG11dGFibGUgdW5zaWduZWQgSXNXaGl0ZXNwYWNlIDogMTsKKyAgfTsKKyAgZW51bSB7IE51bVRleHRDb21tZW50Qml0cyA9IE51bUlubGluZUNvbnRlbnRDb21tZW50Qml0cyArIDIgfTsKKworICBjbGFzcyBJbmxpbmVDb21tYW5kQ29tbWVudEJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIElubGluZUNvbW1hbmRDb21tZW50OworCisgICAgdW5zaWduZWQgOiBOdW1JbmxpbmVDb250ZW50Q29tbWVudEJpdHM7CisKKyAgICB1bnNpZ25lZCBSZW5kZXJLaW5kIDogMjsKKyAgICB1bnNpZ25lZCBDb21tYW5kSUQgOiBDb21tYW5kSW5mbzo6TnVtQ29tbWFuZElEQml0czsKKyAgfTsKKyAgZW51bSB7IE51bUlubGluZUNvbW1hbmRDb21tZW50Qml0cyA9IE51bUlubGluZUNvbnRlbnRDb21tZW50Qml0cyArIDIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRJbmZvOjpOdW1Db21tYW5kSURCaXRzIH07CisKKyAgY2xhc3MgSFRNTFRhZ0NvbW1lbnRCaXRmaWVsZHMgeworICAgIGZyaWVuZCBjbGFzcyBIVE1MVGFnQ29tbWVudDsKKworICAgIHVuc2lnbmVkIDogTnVtSW5saW5lQ29udGVudENvbW1lbnRCaXRzOworCisgICAgLy8vIFRydWUgaWYgd2UgZm91bmQgdGhhdCB0aGlzIHRhZyBpcyBtYWxmb3JtZWQgaW4gc29tZSB3YXkuCisgICAgdW5zaWduZWQgSXNNYWxmb3JtZWQgOiAxOworICB9OworICBlbnVtIHsgTnVtSFRNTFRhZ0NvbW1lbnRCaXRzID0gTnVtSW5saW5lQ29udGVudENvbW1lbnRCaXRzICsgMSB9OworCisgIGNsYXNzIEhUTUxTdGFydFRhZ0NvbW1lbnRCaXRmaWVsZHMgeworICAgIGZyaWVuZCBjbGFzcyBIVE1MU3RhcnRUYWdDb21tZW50OworCisgICAgdW5zaWduZWQgOiBOdW1IVE1MVGFnQ29tbWVudEJpdHM7CisKKyAgICAvLy8gVHJ1ZSBpZiB0aGlzIHRhZyBpcyBzZWxmLWNsb3NpbmcgKGUuIGcuLCA8YnIgLz4pLiAgVGhpcyBpcyBiYXNlZCBvbiB0YWcKKyAgICAvLy8gc3BlbGxpbmcgaW4gY29tbWVudCAocGxhaW4gPGJyPiB3b3VsZCBub3Qgc2V0IHRoaXMgZmxhZykuCisgICAgdW5zaWduZWQgSXNTZWxmQ2xvc2luZyA6IDE7CisgIH07CisgIGVudW0geyBOdW1IVE1MU3RhcnRUYWdDb21tZW50Qml0cyA9IE51bUhUTUxUYWdDb21tZW50Qml0cyArIDEgfTsKKworICBjbGFzcyBQYXJhZ3JhcGhDb21tZW50Qml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgUGFyYWdyYXBoQ29tbWVudDsKKworICAgIHVuc2lnbmVkIDogTnVtQ29tbWVudEJpdHM7CisKKyAgICAvLy8gVHJ1ZSBpZiBcYyBJc1doaXRlc3BhY2UgZmllbGQgY29udGFpbnMgYSB2YWxpZCB2YWx1ZS4KKyAgICBtdXRhYmxlIHVuc2lnbmVkIElzV2hpdGVzcGFjZVZhbGlkIDogMTsKKworICAgIC8vLyBUcnVlIGlmIHRoaXMgY29tbWVudCBBU1Qgbm9kZSBjb250YWlucyBvbmx5IHdoaXRlc3BhY2UuCisgICAgbXV0YWJsZSB1bnNpZ25lZCBJc1doaXRlc3BhY2UgOiAxOworICB9OworICBlbnVtIHsgTnVtUGFyYWdyYXBoQ29tbWVudEJpdHMgPSBOdW1Db21tZW50Qml0cyArIDIgfTsKKworICBjbGFzcyBCbG9ja0NvbW1hbmRDb21tZW50Qml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgQmxvY2tDb21tYW5kQ29tbWVudDsKKworICAgIHVuc2lnbmVkIDogTnVtQ29tbWVudEJpdHM7CisKKyAgICB1bnNpZ25lZCBDb21tYW5kSUQgOiBDb21tYW5kSW5mbzo6TnVtQ29tbWFuZElEQml0czsKKworICAgIC8vLyBEZXNjcmliZXMgdGhlIHN5bnRheCB0aGF0IHdhcyB1c2VkIGluIGEgZG9jdW1lbnRhdGlvbiBjb21tYW5kLgorICAgIC8vLyBDb250YWlucyB2YWx1ZXMgZnJvbSBDb21tYW5kTWFya2VyS2luZCBlbnVtLgorICAgIHVuc2lnbmVkIENvbW1hbmRNYXJrZXIgOiAxOworICB9OworICBlbnVtIHsgTnVtQmxvY2tDb21tYW5kQ29tbWVudEJpdHMgPSBOdW1Db21tZW50Qml0cyArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kSW5mbzo6TnVtQ29tbWFuZElEQml0cyArIDEgfTsKKworICBjbGFzcyBQYXJhbUNvbW1hbmRDb21tZW50Qml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgUGFyYW1Db21tYW5kQ29tbWVudDsKKworICAgIHVuc2lnbmVkIDogTnVtQmxvY2tDb21tYW5kQ29tbWVudEJpdHM7CisKKyAgICAvLy8gUGFyYW1ldGVyIHBhc3NpbmcgZGlyZWN0aW9uLCBzZWUgUGFyYW1Db21tYW5kQ29tbWVudDo6UGFzc0RpcmVjdGlvbi4KKyAgICB1bnNpZ25lZCBEaXJlY3Rpb24gOiAyOworCisgICAgLy8vIFRydWUgaWYgZGlyZWN0aW9uIHdhcyBzcGVjaWZpZWQgZXhwbGljaXRseSBpbiB0aGUgY29tbWVudC4KKyAgICB1bnNpZ25lZCBJc0RpcmVjdGlvbkV4cGxpY2l0IDogMTsKKyAgfTsKKyAgZW51bSB7IE51bVBhcmFtQ29tbWFuZENvbW1lbnRCaXRzID0gTnVtQmxvY2tDb21tYW5kQ29tbWVudEJpdHMgKyAzIH07CisKKyAgdW5pb24geworICAgIENvbW1lbnRCaXRmaWVsZHMgQ29tbWVudEJpdHM7CisgICAgSW5saW5lQ29udGVudENvbW1lbnRCaXRmaWVsZHMgSW5saW5lQ29udGVudENvbW1lbnRCaXRzOworICAgIFRleHRDb21tZW50Qml0ZmllbGRzIFRleHRDb21tZW50Qml0czsKKyAgICBJbmxpbmVDb21tYW5kQ29tbWVudEJpdGZpZWxkcyBJbmxpbmVDb21tYW5kQ29tbWVudEJpdHM7CisgICAgSFRNTFRhZ0NvbW1lbnRCaXRmaWVsZHMgSFRNTFRhZ0NvbW1lbnRCaXRzOworICAgIEhUTUxTdGFydFRhZ0NvbW1lbnRCaXRmaWVsZHMgSFRNTFN0YXJ0VGFnQ29tbWVudEJpdHM7CisgICAgUGFyYWdyYXBoQ29tbWVudEJpdGZpZWxkcyBQYXJhZ3JhcGhDb21tZW50Qml0czsKKyAgICBCbG9ja0NvbW1hbmRDb21tZW50Qml0ZmllbGRzIEJsb2NrQ29tbWFuZENvbW1lbnRCaXRzOworICAgIFBhcmFtQ29tbWFuZENvbW1lbnRCaXRmaWVsZHMgUGFyYW1Db21tYW5kQ29tbWVudEJpdHM7CisgIH07CisKKyAgdm9pZCBzZXRTb3VyY2VSYW5nZShTb3VyY2VSYW5nZSBTUikgeworICAgIFJhbmdlID0gU1I7CisgIH0KKworICB2b2lkIHNldExvY2F0aW9uKFNvdXJjZUxvY2F0aW9uIEwpIHsKKyAgICBMb2MgPSBMOworICB9CisKK3B1YmxpYzoKKyAgZW51bSBDb21tZW50S2luZCB7CisgICAgTm9Db21tZW50S2luZCA9IDAsCisjZGVmaW5lIENPTU1FTlQoQ0xBU1MsIFBBUkVOVCkgQ0xBU1MjI0tpbmQsCisjZGVmaW5lIENPTU1FTlRfUkFOR0UoQkFTRSwgRklSU1QsIExBU1QpIFwKKyAgICBGaXJzdCMjQkFTRSMjQ29uc3RhbnQ9RklSU1QjI0tpbmQsIExhc3QjI0JBU0UjI0NvbnN0YW50PUxBU1QjI0tpbmQsCisjZGVmaW5lIExBU1RfQ09NTUVOVF9SQU5HRShCQVNFLCBGSVJTVCwgTEFTVCkgXAorICAgIEZpcnN0IyNCQVNFIyNDb25zdGFudD1GSVJTVCMjS2luZCwgTGFzdCMjQkFTRSMjQ29uc3RhbnQ9TEFTVCMjS2luZAorI2RlZmluZSBBQlNUUkFDVF9DT01NRU5UKENPTU1FTlQpCisjaW5jbHVkZSAiY2xhbmcvQVNUL0NvbW1lbnROb2Rlcy5pbmMiCisgIH07CisKKyAgQ29tbWVudChDb21tZW50S2luZCBLLAorICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvY0JlZ2luLAorICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvY0VuZCkgOgorICAgICAgTG9jKExvY0JlZ2luKSwgUmFuZ2UoU291cmNlUmFuZ2UoTG9jQmVnaW4sIExvY0VuZCkpIHsKKyAgICBDb21tZW50Qml0cy5LaW5kID0gSzsKKyAgfQorCisgIENvbW1lbnRLaW5kIGdldENvbW1lbnRLaW5kKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDb21tZW50S2luZD4oQ29tbWVudEJpdHMuS2luZCk7CisgIH0KKworICBjb25zdCBjaGFyICpnZXRDb21tZW50S2luZE5hbWUoKSBjb25zdDsKKworICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgdm9pZCBkdW1wQ29sb3IoKSBjb25zdDsKKyAgdm9pZCBkdW1wKGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQpIGNvbnN0OworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBjb25zdCBDb21tYW5kVHJhaXRzICpUcmFpdHMsCisgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICpTTSkgY29uc3Q7CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJhbmdlOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gUmFuZ2UuZ2V0QmVnaW4oKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBSYW5nZS5nZXRFbmQoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2M7IH0KKworICB0eXBlZGVmIENvbW1lbnQgKiBjb25zdCAqY2hpbGRfaXRlcmF0b3I7CisKKyAgY2hpbGRfaXRlcmF0b3IgY2hpbGRfYmVnaW4oKSBjb25zdDsKKyAgY2hpbGRfaXRlcmF0b3IgY2hpbGRfZW5kKCkgY29uc3Q7CisKKyAgLy8gVE9ETzogY29uc3QgY2hpbGQgaXRlcmF0b3IKKworICB1bnNpZ25lZCBjaGlsZF9jb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2hpbGRfZW5kKCkgLSBjaGlsZF9iZWdpbigpOworICB9Cit9OworCisvLy8gSW5saW5lIGNvbnRlbnQgKGNvbnRhaW5lZCB3aXRoaW4gYSBibG9jaykuCisvLy8gQWJzdHJhY3QgY2xhc3MuCitjbGFzcyBJbmxpbmVDb250ZW50Q29tbWVudCA6IHB1YmxpYyBDb21tZW50IHsKK3Byb3RlY3RlZDoKKyAgSW5saW5lQ29udGVudENvbW1lbnQoQ29tbWVudEtpbmQgSywKKyAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvY0VuZCkgOgorICAgICAgQ29tbWVudChLLCBMb2NCZWdpbiwgTG9jRW5kKSB7CisgICAgSW5saW5lQ29udGVudENvbW1lbnRCaXRzLkhhc1RyYWlsaW5nTmV3bGluZSA9IDA7CisgIH0KKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbW1lbnQgKkMpIHsKKyAgICByZXR1cm4gQy0+Z2V0Q29tbWVudEtpbmQoKSA+PSBGaXJzdElubGluZUNvbnRlbnRDb21tZW50Q29uc3RhbnQgJiYKKyAgICAgICAgICAgQy0+Z2V0Q29tbWVudEtpbmQoKSA8PSBMYXN0SW5saW5lQ29udGVudENvbW1lbnRDb25zdGFudDsKKyAgfQorCisgIHZvaWQgYWRkVHJhaWxpbmdOZXdsaW5lKCkgeworICAgIElubGluZUNvbnRlbnRDb21tZW50Qml0cy5IYXNUcmFpbGluZ05ld2xpbmUgPSAxOworICB9CisKKyAgYm9vbCBoYXNUcmFpbGluZ05ld2xpbmUoKSBjb25zdCB7CisgICAgcmV0dXJuIElubGluZUNvbnRlbnRDb21tZW50Qml0cy5IYXNUcmFpbGluZ05ld2xpbmU7CisgIH0KK307CisKKy8vLyBQbGFpbiB0ZXh0LgorY2xhc3MgVGV4dENvbW1lbnQgOiBwdWJsaWMgSW5saW5lQ29udGVudENvbW1lbnQgeworICBTdHJpbmdSZWYgVGV4dDsKKworcHVibGljOgorICBUZXh0Q29tbWVudChTb3VyY2VMb2NhdGlvbiBMb2NCZWdpbiwKKyAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jRW5kLAorICAgICAgICAgICAgICBTdHJpbmdSZWYgVGV4dCkgOgorICAgICAgSW5saW5lQ29udGVudENvbW1lbnQoVGV4dENvbW1lbnRLaW5kLCBMb2NCZWdpbiwgTG9jRW5kKSwKKyAgICAgIFRleHQoVGV4dCkgeworICAgIFRleHRDb21tZW50Qml0cy5Jc1doaXRlc3BhY2VWYWxpZCA9IGZhbHNlOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDb21tZW50ICpDKSB7CisgICAgcmV0dXJuIEMtPmdldENvbW1lbnRLaW5kKCkgPT0gVGV4dENvbW1lbnRLaW5kOworICB9CisKKyAgY2hpbGRfaXRlcmF0b3IgY2hpbGRfYmVnaW4oKSBjb25zdCB7IHJldHVybiBudWxscHRyOyB9CisKKyAgY2hpbGRfaXRlcmF0b3IgY2hpbGRfZW5kKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgIFN0cmluZ1JlZiBnZXRUZXh0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBUZXh0OyB9CisKKyAgYm9vbCBpc1doaXRlc3BhY2UoKSBjb25zdCB7CisgICAgaWYgKFRleHRDb21tZW50Qml0cy5Jc1doaXRlc3BhY2VWYWxpZCkKKyAgICAgIHJldHVybiBUZXh0Q29tbWVudEJpdHMuSXNXaGl0ZXNwYWNlOworCisgICAgVGV4dENvbW1lbnRCaXRzLklzV2hpdGVzcGFjZSA9IGlzV2hpdGVzcGFjZU5vQ2FjaGUoKTsKKyAgICBUZXh0Q29tbWVudEJpdHMuSXNXaGl0ZXNwYWNlVmFsaWQgPSB0cnVlOworICAgIHJldHVybiBUZXh0Q29tbWVudEJpdHMuSXNXaGl0ZXNwYWNlOworICB9CisKK3ByaXZhdGU6CisgIGJvb2wgaXNXaGl0ZXNwYWNlTm9DYWNoZSgpIGNvbnN0OworfTsKKworLy8vIEEgY29tbWFuZCB3aXRoIHdvcmQtbGlrZSBhcmd1bWVudHMgdGhhdCBpcyBjb25zaWRlcmVkIGlubGluZSBjb250ZW50LgorY2xhc3MgSW5saW5lQ29tbWFuZENvbW1lbnQgOiBwdWJsaWMgSW5saW5lQ29udGVudENvbW1lbnQgeworcHVibGljOgorICBzdHJ1Y3QgQXJndW1lbnQgeworICAgIFNvdXJjZVJhbmdlIFJhbmdlOworICAgIFN0cmluZ1JlZiBUZXh0OworCisgICAgQXJndW1lbnQoU291cmNlUmFuZ2UgUmFuZ2UsIFN0cmluZ1JlZiBUZXh0KSA6IFJhbmdlKFJhbmdlKSwgVGV4dChUZXh0KSB7IH0KKyAgfTsKKworICAvLy8gVGhlIG1vc3QgYXBwcm9wcmlhdGUgcmVuZGVyaW5nIG1vZGUgZm9yIHRoaXMgY29tbWFuZCwgY2hvc2VuIG9uIGNvbW1hbmQKKyAgLy8vIHNlbWFudGljcyBpbiBEb3h5Z2VuLgorICBlbnVtIFJlbmRlcktpbmQgeworICAgIFJlbmRlck5vcm1hbCwKKyAgICBSZW5kZXJCb2xkLAorICAgIFJlbmRlck1vbm9zcGFjZWQsCisgICAgUmVuZGVyRW1waGFzaXplZAorICB9OworCitwcm90ZWN0ZWQ6CisgIC8vLyBDb21tYW5kIGFyZ3VtZW50cy4KKyAgQXJyYXlSZWY8QXJndW1lbnQ+IEFyZ3M7CisKK3B1YmxpYzoKKyAgSW5saW5lQ29tbWFuZENvbW1lbnQoU291cmNlTG9jYXRpb24gTG9jQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvY0VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJLaW5kIFJLLAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxBcmd1bWVudD4gQXJncykgOgorICAgICAgSW5saW5lQ29udGVudENvbW1lbnQoSW5saW5lQ29tbWFuZENvbW1lbnRLaW5kLCBMb2NCZWdpbiwgTG9jRW5kKSwKKyAgICAgIEFyZ3MoQXJncykgeworICAgIElubGluZUNvbW1hbmRDb21tZW50Qml0cy5SZW5kZXJLaW5kID0gUks7CisgICAgSW5saW5lQ29tbWFuZENvbW1lbnRCaXRzLkNvbW1hbmRJRCA9IENvbW1hbmRJRDsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ29tbWVudCAqQykgeworICAgIHJldHVybiBDLT5nZXRDb21tZW50S2luZCgpID09IElubGluZUNvbW1hbmRDb21tZW50S2luZDsKKyAgfQorCisgIGNoaWxkX2l0ZXJhdG9yIGNoaWxkX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgIGNoaWxkX2l0ZXJhdG9yIGNoaWxkX2VuZCgpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KKworICB1bnNpZ25lZCBnZXRDb21tYW5kSUQoKSBjb25zdCB7CisgICAgcmV0dXJuIElubGluZUNvbW1hbmRDb21tZW50Qml0cy5Db21tYW5kSUQ7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0Q29tbWFuZE5hbWUoY29uc3QgQ29tbWFuZFRyYWl0cyAmVHJhaXRzKSBjb25zdCB7CisgICAgcmV0dXJuIFRyYWl0cy5nZXRDb21tYW5kSW5mbyhnZXRDb21tYW5kSUQoKSktPk5hbWU7CisgIH0KKworICBTb3VyY2VSYW5nZSBnZXRDb21tYW5kTmFtZVJhbmdlKCkgY29uc3QgeworICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRMb2NTdGFydCgpLmdldExvY1dpdGhPZmZzZXQoLTEpLAorICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NFbmQoKSk7CisgIH0KKworICBSZW5kZXJLaW5kIGdldFJlbmRlcktpbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlcktpbmQ+KElubGluZUNvbW1hbmRDb21tZW50Qml0cy5SZW5kZXJLaW5kKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUFyZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIEFyZ3Muc2l6ZSgpOworICB9CisKKyAgU3RyaW5nUmVmIGdldEFyZ1RleHQodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIEFyZ3NbSWR4XS5UZXh0OworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0QXJnUmFuZ2UodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIEFyZ3NbSWR4XS5SYW5nZTsKKyAgfQorfTsKKworLy8vIEFic3RyYWN0IGNsYXNzIGZvciBvcGVuaW5nIGFuZCBjbG9zaW5nIEhUTUwgdGFncy4gIEhUTUwgdGFncyBhcmUgYWx3YXlzCisvLy8gdHJlYXRlZCBhcyBpbmxpbmUgY29udGVudCAocmVnYXJkbGVzcyBIVE1MIHNlbWFudGljcykuCitjbGFzcyBIVE1MVGFnQ29tbWVudCA6IHB1YmxpYyBJbmxpbmVDb250ZW50Q29tbWVudCB7Citwcm90ZWN0ZWQ6CisgIFN0cmluZ1JlZiBUYWdOYW1lOworICBTb3VyY2VSYW5nZSBUYWdOYW1lUmFuZ2U7CisKKyAgSFRNTFRhZ0NvbW1lbnQoQ29tbWVudEtpbmQgSywKKyAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jQmVnaW4sCisgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvY0VuZCwKKyAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFRhZ05hbWUsCisgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRhZ05hbWVCZWdpbiwKKyAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGFnTmFtZUVuZCkgOgorICAgICAgSW5saW5lQ29udGVudENvbW1lbnQoSywgTG9jQmVnaW4sIExvY0VuZCksCisgICAgICBUYWdOYW1lKFRhZ05hbWUpLAorICAgICAgVGFnTmFtZVJhbmdlKFRhZ05hbWVCZWdpbiwgVGFnTmFtZUVuZCkgeworICAgIHNldExvY2F0aW9uKFRhZ05hbWVCZWdpbik7CisgICAgSFRNTFRhZ0NvbW1lbnRCaXRzLklzTWFsZm9ybWVkID0gMDsKKyAgfQorCitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ29tbWVudCAqQykgeworICAgIHJldHVybiBDLT5nZXRDb21tZW50S2luZCgpID49IEZpcnN0SFRNTFRhZ0NvbW1lbnRDb25zdGFudCAmJgorICAgICAgICAgICBDLT5nZXRDb21tZW50S2luZCgpIDw9IExhc3RIVE1MVGFnQ29tbWVudENvbnN0YW50OworICB9CisKKyAgU3RyaW5nUmVmIGdldFRhZ05hbWUoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFRhZ05hbWU7IH0KKworICBTb3VyY2VSYW5nZSBnZXRUYWdOYW1lU291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICBTb3VyY2VMb2NhdGlvbiBMID0gZ2V0TG9jYXRpb24oKTsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoTC5nZXRMb2NXaXRoT2Zmc2V0KDEpLAorICAgICAgICAgICAgICAgICAgICAgICBMLmdldExvY1dpdGhPZmZzZXQoMSArIFRhZ05hbWUuc2l6ZSgpKSk7CisgIH0KKworICBib29sIGlzTWFsZm9ybWVkKCkgY29uc3QgeworICAgIHJldHVybiBIVE1MVGFnQ29tbWVudEJpdHMuSXNNYWxmb3JtZWQ7CisgIH0KKworICB2b2lkIHNldElzTWFsZm9ybWVkKCkgeworICAgIEhUTUxUYWdDb21tZW50Qml0cy5Jc01hbGZvcm1lZCA9IDE7CisgIH0KK307CisKKy8vLyBBbiBvcGVuaW5nIEhUTUwgdGFnIHdpdGggYXR0cmlidXRlcy4KK2NsYXNzIEhUTUxTdGFydFRhZ0NvbW1lbnQgOiBwdWJsaWMgSFRNTFRhZ0NvbW1lbnQgeworcHVibGljOgorICBjbGFzcyBBdHRyaWJ1dGUgeworICBwdWJsaWM6CisgICAgU291cmNlTG9jYXRpb24gTmFtZUxvY0JlZ2luOworICAgIFN0cmluZ1JlZiBOYW1lOworCisgICAgU291cmNlTG9jYXRpb24gRXF1YWxzTG9jOworCisgICAgU291cmNlUmFuZ2UgVmFsdWVSYW5nZTsKKyAgICBTdHJpbmdSZWYgVmFsdWU7CisKKyAgICBBdHRyaWJ1dGUoKSB7IH0KKworICAgIEF0dHJpYnV0ZShTb3VyY2VMb2NhdGlvbiBOYW1lTG9jQmVnaW4sIFN0cmluZ1JlZiBOYW1lKSA6CisgICAgICAgIE5hbWVMb2NCZWdpbihOYW1lTG9jQmVnaW4pLCBOYW1lKE5hbWUpLAorICAgICAgICBFcXVhbHNMb2MoU291cmNlTG9jYXRpb24oKSksCisgICAgICAgIFZhbHVlUmFuZ2UoU291cmNlUmFuZ2UoKSksIFZhbHVlKFN0cmluZ1JlZigpKQorICAgIHsgfQorCisgICAgQXR0cmlidXRlKFNvdXJjZUxvY2F0aW9uIE5hbWVMb2NCZWdpbiwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVxdWFsc0xvYywKKyAgICAgICAgICAgICAgU291cmNlUmFuZ2UgVmFsdWVSYW5nZSwgU3RyaW5nUmVmIFZhbHVlKSA6CisgICAgICAgIE5hbWVMb2NCZWdpbihOYW1lTG9jQmVnaW4pLCBOYW1lKE5hbWUpLAorICAgICAgICBFcXVhbHNMb2MoRXF1YWxzTG9jKSwKKyAgICAgICAgVmFsdWVSYW5nZShWYWx1ZVJhbmdlKSwgVmFsdWUoVmFsdWUpCisgICAgeyB9CisKKyAgICBTb3VyY2VMb2NhdGlvbiBnZXROYW1lTG9jRW5kKCkgY29uc3QgeworICAgICAgcmV0dXJuIE5hbWVMb2NCZWdpbi5nZXRMb2NXaXRoT2Zmc2V0KE5hbWUuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoKSBjb25zdCB7CisgICAgICByZXR1cm4gU291cmNlUmFuZ2UoTmFtZUxvY0JlZ2luLCBnZXROYW1lTG9jRW5kKCkpOworICAgIH0KKyAgfTsKKworcHJpdmF0ZToKKyAgQXJyYXlSZWY8QXR0cmlidXRlPiBBdHRyaWJ1dGVzOworCitwdWJsaWM6CisgIEhUTUxTdGFydFRhZ0NvbW1lbnQoU291cmNlTG9jYXRpb24gTG9jQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFRhZ05hbWUpIDoKKyAgICAgIEhUTUxUYWdDb21tZW50KEhUTUxTdGFydFRhZ0NvbW1lbnRLaW5kLAorICAgICAgICAgICAgICAgICAgICAgTG9jQmVnaW4sIExvY0JlZ2luLmdldExvY1dpdGhPZmZzZXQoMSArIFRhZ05hbWUuc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgIFRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICBMb2NCZWdpbi5nZXRMb2NXaXRoT2Zmc2V0KDEpLAorICAgICAgICAgICAgICAgICAgICAgTG9jQmVnaW4uZ2V0TG9jV2l0aE9mZnNldCgxICsgVGFnTmFtZS5zaXplKCkpKSB7CisgICAgSFRNTFN0YXJ0VGFnQ29tbWVudEJpdHMuSXNTZWxmQ2xvc2luZyA9IGZhbHNlOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDb21tZW50ICpDKSB7CisgICAgcmV0dXJuIEMtPmdldENvbW1lbnRLaW5kKCkgPT0gSFRNTFN0YXJ0VGFnQ29tbWVudEtpbmQ7CisgIH0KKworICBjaGlsZF9pdGVyYXRvciBjaGlsZF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KKworICBjaGlsZF9pdGVyYXRvciBjaGlsZF9lbmQoKSBjb25zdCB7IHJldHVybiBudWxscHRyOyB9CisKKyAgdW5zaWduZWQgZ2V0TnVtQXR0cnMoKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJpYnV0ZXMuc2l6ZSgpOworICB9CisKKyAgY29uc3QgQXR0cmlidXRlICZnZXRBdHRyKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIHJldHVybiBBdHRyaWJ1dGVzW0lkeF07CisgIH0KKworICB2b2lkIHNldEF0dHJzKEFycmF5UmVmPEF0dHJpYnV0ZT4gQXR0cnMpIHsKKyAgICBBdHRyaWJ1dGVzID0gQXR0cnM7CisgICAgaWYgKCFBdHRycy5lbXB0eSgpKSB7CisgICAgICBjb25zdCBBdHRyaWJ1dGUgJkF0dHIgPSBBdHRycy5iYWNrKCk7CisgICAgICBTb3VyY2VMb2NhdGlvbiBMID0gQXR0ci5WYWx1ZVJhbmdlLmdldEVuZCgpOworICAgICAgaWYgKEwuaXNWYWxpZCgpKQorICAgICAgICBSYW5nZS5zZXRFbmQoTCk7CisgICAgICBlbHNlIHsKKyAgICAgICAgUmFuZ2Uuc2V0RW5kKEF0dHIuZ2V0TmFtZUxvY0VuZCgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2b2lkIHNldEdyZWF0ZXJMb2MoU291cmNlTG9jYXRpb24gR3JlYXRlckxvYykgeworICAgIFJhbmdlLnNldEVuZChHcmVhdGVyTG9jKTsKKyAgfQorCisgIGJvb2wgaXNTZWxmQ2xvc2luZygpIGNvbnN0IHsKKyAgICByZXR1cm4gSFRNTFN0YXJ0VGFnQ29tbWVudEJpdHMuSXNTZWxmQ2xvc2luZzsKKyAgfQorCisgIHZvaWQgc2V0U2VsZkNsb3NpbmcoKSB7CisgICAgSFRNTFN0YXJ0VGFnQ29tbWVudEJpdHMuSXNTZWxmQ2xvc2luZyA9IHRydWU7CisgIH0KK307CisKKy8vLyBBIGNsb3NpbmcgSFRNTCB0YWcuCitjbGFzcyBIVE1MRW5kVGFnQ29tbWVudCA6IHB1YmxpYyBIVE1MVGFnQ29tbWVudCB7CitwdWJsaWM6CisgIEhUTUxFbmRUYWdDb21tZW50KFNvdXJjZUxvY2F0aW9uIExvY0JlZ2luLAorICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2NFbmQsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBUYWdOYW1lKSA6CisgICAgICBIVE1MVGFnQ29tbWVudChIVE1MRW5kVGFnQ29tbWVudEtpbmQsCisgICAgICAgICAgICAgICAgICAgICBMb2NCZWdpbiwgTG9jRW5kLAorICAgICAgICAgICAgICAgICAgICAgVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIExvY0JlZ2luLmdldExvY1dpdGhPZmZzZXQoMiksCisgICAgICAgICAgICAgICAgICAgICBMb2NCZWdpbi5nZXRMb2NXaXRoT2Zmc2V0KDIgKyBUYWdOYW1lLnNpemUoKSkpCisgIHsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ29tbWVudCAqQykgeworICAgIHJldHVybiBDLT5nZXRDb21tZW50S2luZCgpID09IEhUTUxFbmRUYWdDb21tZW50S2luZDsKKyAgfQorCisgIGNoaWxkX2l0ZXJhdG9yIGNoaWxkX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgIGNoaWxkX2l0ZXJhdG9yIGNoaWxkX2VuZCgpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KK307CisKKy8vLyBCbG9jayBjb250ZW50IChjb250YWlucyBpbmxpbmUgY29udGVudCkuCisvLy8gQWJzdHJhY3QgY2xhc3MuCitjbGFzcyBCbG9ja0NvbnRlbnRDb21tZW50IDogcHVibGljIENvbW1lbnQgeworcHJvdGVjdGVkOgorICBCbG9ja0NvbnRlbnRDb21tZW50KENvbW1lbnRLaW5kIEssCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jRW5kKSA6CisgICAgICBDb21tZW50KEssIExvY0JlZ2luLCBMb2NFbmQpCisgIHsgfQorCitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ29tbWVudCAqQykgeworICAgIHJldHVybiBDLT5nZXRDb21tZW50S2luZCgpID49IEZpcnN0QmxvY2tDb250ZW50Q29tbWVudENvbnN0YW50ICYmCisgICAgICAgICAgIEMtPmdldENvbW1lbnRLaW5kKCkgPD0gTGFzdEJsb2NrQ29udGVudENvbW1lbnRDb25zdGFudDsKKyAgfQorfTsKKworLy8vIEEgc2luZ2xlIHBhcmFncmFwaCB0aGF0IGNvbnRhaW5zIGlubGluZSBjb250ZW50LgorY2xhc3MgUGFyYWdyYXBoQ29tbWVudCA6IHB1YmxpYyBCbG9ja0NvbnRlbnRDb21tZW50IHsKKyAgQXJyYXlSZWY8SW5saW5lQ29udGVudENvbW1lbnQgKj4gQ29udGVudDsKKworcHVibGljOgorICBQYXJhZ3JhcGhDb21tZW50KEFycmF5UmVmPElubGluZUNvbnRlbnRDb21tZW50ICo+IENvbnRlbnQpIDoKKyAgICAgIEJsb2NrQ29udGVudENvbW1lbnQoUGFyYWdyYXBoQ29tbWVudEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCkpLAorICAgICAgQ29udGVudChDb250ZW50KSB7CisgICAgaWYgKENvbnRlbnQuZW1wdHkoKSkgeworICAgICAgUGFyYWdyYXBoQ29tbWVudEJpdHMuSXNXaGl0ZXNwYWNlID0gdHJ1ZTsKKyAgICAgIFBhcmFncmFwaENvbW1lbnRCaXRzLklzV2hpdGVzcGFjZVZhbGlkID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQYXJhZ3JhcGhDb21tZW50Qml0cy5Jc1doaXRlc3BhY2VWYWxpZCA9IGZhbHNlOworCisgICAgc2V0U291cmNlUmFuZ2UoU291cmNlUmFuZ2UoQ29udGVudC5mcm9udCgpLT5nZXRMb2NTdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQuYmFjaygpLT5nZXRMb2NFbmQoKSkpOworICAgIHNldExvY2F0aW9uKENvbnRlbnQuZnJvbnQoKS0+Z2V0TG9jU3RhcnQoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbW1lbnQgKkMpIHsKKyAgICByZXR1cm4gQy0+Z2V0Q29tbWVudEtpbmQoKSA9PSBQYXJhZ3JhcGhDb21tZW50S2luZDsKKyAgfQorCisgIGNoaWxkX2l0ZXJhdG9yIGNoaWxkX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNoaWxkX2l0ZXJhdG9yPihDb250ZW50LmJlZ2luKCkpOworICB9CisKKyAgY2hpbGRfaXRlcmF0b3IgY2hpbGRfZW5kKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNoaWxkX2l0ZXJhdG9yPihDb250ZW50LmVuZCgpKTsKKyAgfQorCisgIGJvb2wgaXNXaGl0ZXNwYWNlKCkgY29uc3QgeworICAgIGlmIChQYXJhZ3JhcGhDb21tZW50Qml0cy5Jc1doaXRlc3BhY2VWYWxpZCkKKyAgICAgIHJldHVybiBQYXJhZ3JhcGhDb21tZW50Qml0cy5Jc1doaXRlc3BhY2U7CisKKyAgICBQYXJhZ3JhcGhDb21tZW50Qml0cy5Jc1doaXRlc3BhY2UgPSBpc1doaXRlc3BhY2VOb0NhY2hlKCk7CisgICAgUGFyYWdyYXBoQ29tbWVudEJpdHMuSXNXaGl0ZXNwYWNlVmFsaWQgPSB0cnVlOworICAgIHJldHVybiBQYXJhZ3JhcGhDb21tZW50Qml0cy5Jc1doaXRlc3BhY2U7CisgIH0KKworcHJpdmF0ZToKKyAgYm9vbCBpc1doaXRlc3BhY2VOb0NhY2hlKCkgY29uc3Q7Cit9OworCisvLy8gQSBjb21tYW5kIHRoYXQgaGFzIHplcm8gb3IgbW9yZSB3b3JkLWxpa2UgYXJndW1lbnRzIChudW1iZXIgb2Ygd29yZC1saWtlCisvLy8gYXJndW1lbnRzIGRlcGVuZHMgb24gY29tbWFuZCBuYW1lKSBhbmQgYSBwYXJhZ3JhcGggYXMgYW4gYXJndW1lbnQKKy8vLyAoZS4gZy4sIFxcYnJpZWYpLgorY2xhc3MgQmxvY2tDb21tYW5kQ29tbWVudCA6IHB1YmxpYyBCbG9ja0NvbnRlbnRDb21tZW50IHsKK3B1YmxpYzoKKyAgc3RydWN0IEFyZ3VtZW50IHsKKyAgICBTb3VyY2VSYW5nZSBSYW5nZTsKKyAgICBTdHJpbmdSZWYgVGV4dDsKKworICAgIEFyZ3VtZW50KCkgeyB9CisgICAgQXJndW1lbnQoU291cmNlUmFuZ2UgUmFuZ2UsIFN0cmluZ1JlZiBUZXh0KSA6IFJhbmdlKFJhbmdlKSwgVGV4dChUZXh0KSB7IH0KKyAgfTsKKworcHJvdGVjdGVkOgorICAvLy8gV29yZC1saWtlIGFyZ3VtZW50cy4KKyAgQXJyYXlSZWY8QXJndW1lbnQ+IEFyZ3M7CisKKyAgLy8vIFBhcmFncmFwaCBhcmd1bWVudC4KKyAgUGFyYWdyYXBoQ29tbWVudCAqUGFyYWdyYXBoOworCisgIEJsb2NrQ29tbWFuZENvbW1lbnQoQ29tbWVudEtpbmQgSywKKyAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2NCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2NFbmQsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRNYXJrZXJLaW5kIENvbW1hbmRNYXJrZXIpIDoKKyAgICAgIEJsb2NrQ29udGVudENvbW1lbnQoSywgTG9jQmVnaW4sIExvY0VuZCksCisgICAgICBQYXJhZ3JhcGgobnVsbHB0cikgeworICAgIHNldExvY2F0aW9uKGdldENvbW1hbmROYW1lQmVnaW5Mb2MoKSk7CisgICAgQmxvY2tDb21tYW5kQ29tbWVudEJpdHMuQ29tbWFuZElEID0gQ29tbWFuZElEOworICAgIEJsb2NrQ29tbWFuZENvbW1lbnRCaXRzLkNvbW1hbmRNYXJrZXIgPSBDb21tYW5kTWFya2VyOworICB9CisKK3B1YmxpYzoKKyAgQmxvY2tDb21tYW5kQ29tbWVudChTb3VyY2VMb2NhdGlvbiBMb2NCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2NFbmQsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRNYXJrZXJLaW5kIENvbW1hbmRNYXJrZXIpIDoKKyAgICAgIEJsb2NrQ29udGVudENvbW1lbnQoQmxvY2tDb21tYW5kQ29tbWVudEtpbmQsIExvY0JlZ2luLCBMb2NFbmQpLAorICAgICAgUGFyYWdyYXBoKG51bGxwdHIpIHsKKyAgICBzZXRMb2NhdGlvbihnZXRDb21tYW5kTmFtZUJlZ2luTG9jKCkpOworICAgIEJsb2NrQ29tbWFuZENvbW1lbnRCaXRzLkNvbW1hbmRJRCA9IENvbW1hbmRJRDsKKyAgICBCbG9ja0NvbW1hbmRDb21tZW50Qml0cy5Db21tYW5kTWFya2VyID0gQ29tbWFuZE1hcmtlcjsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ29tbWVudCAqQykgeworICAgIHJldHVybiBDLT5nZXRDb21tZW50S2luZCgpID49IEZpcnN0QmxvY2tDb21tYW5kQ29tbWVudENvbnN0YW50ICYmCisgICAgICAgICAgIEMtPmdldENvbW1lbnRLaW5kKCkgPD0gTGFzdEJsb2NrQ29tbWFuZENvbW1lbnRDb25zdGFudDsKKyAgfQorCisgIGNoaWxkX2l0ZXJhdG9yIGNoaWxkX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNoaWxkX2l0ZXJhdG9yPigmUGFyYWdyYXBoKTsKKyAgfQorCisgIGNoaWxkX2l0ZXJhdG9yIGNoaWxkX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjaGlsZF9pdGVyYXRvcj4oJlBhcmFncmFwaCArIDEpOworICB9CisKKyAgdW5zaWduZWQgZ2V0Q29tbWFuZElEKCkgY29uc3QgeworICAgIHJldHVybiBCbG9ja0NvbW1hbmRDb21tZW50Qml0cy5Db21tYW5kSUQ7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0Q29tbWFuZE5hbWUoY29uc3QgQ29tbWFuZFRyYWl0cyAmVHJhaXRzKSBjb25zdCB7CisgICAgcmV0dXJuIFRyYWl0cy5nZXRDb21tYW5kSW5mbyhnZXRDb21tYW5kSUQoKSktPk5hbWU7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRDb21tYW5kTmFtZUJlZ2luTG9jKCkgY29uc3QgeworICAgIHJldHVybiBnZXRMb2NTdGFydCgpLmdldExvY1dpdGhPZmZzZXQoMSk7CisgIH0KKworICBTb3VyY2VSYW5nZSBnZXRDb21tYW5kTmFtZVJhbmdlKGNvbnN0IENvbW1hbmRUcmFpdHMgJlRyYWl0cykgY29uc3QgeworICAgIFN0cmluZ1JlZiBOYW1lID0gZ2V0Q29tbWFuZE5hbWUoVHJhaXRzKTsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0Q29tbWFuZE5hbWVCZWdpbkxvYygpLAorICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NTdGFydCgpLmdldExvY1dpdGhPZmZzZXQoMSArIE5hbWUuc2l6ZSgpKSk7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3QgeworICAgIHJldHVybiBBcmdzLnNpemUoKTsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRBcmdUZXh0KHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIHJldHVybiBBcmdzW0lkeF0uVGV4dDsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldEFyZ1JhbmdlKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIHJldHVybiBBcmdzW0lkeF0uUmFuZ2U7CisgIH0KKworICB2b2lkIHNldEFyZ3MoQXJyYXlSZWY8QXJndW1lbnQ+IEEpIHsKKyAgICBBcmdzID0gQTsKKyAgICBpZiAoQXJncy5zaXplKCkgPiAwKSB7CisgICAgICBTb3VyY2VMb2NhdGlvbiBOZXdMb2NFbmQgPSBBcmdzLmJhY2soKS5SYW5nZS5nZXRFbmQoKTsKKyAgICAgIGlmIChOZXdMb2NFbmQuaXNWYWxpZCgpKQorICAgICAgICBzZXRTb3VyY2VSYW5nZShTb3VyY2VSYW5nZShnZXRMb2NTdGFydCgpLCBOZXdMb2NFbmQpKTsKKyAgICB9CisgIH0KKworICBQYXJhZ3JhcGhDb21tZW50ICpnZXRQYXJhZ3JhcGgoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gUGFyYWdyYXBoOworICB9CisKKyAgYm9vbCBoYXNOb25XaGl0ZXNwYWNlUGFyYWdyYXBoKCkgY29uc3QgeworICAgIHJldHVybiBQYXJhZ3JhcGggJiYgIVBhcmFncmFwaC0+aXNXaGl0ZXNwYWNlKCk7CisgIH0KKworICB2b2lkIHNldFBhcmFncmFwaChQYXJhZ3JhcGhDb21tZW50ICpQQykgeworICAgIFBhcmFncmFwaCA9IFBDOworICAgIFNvdXJjZUxvY2F0aW9uIE5ld0xvY0VuZCA9IFBDLT5nZXRMb2NFbmQoKTsKKyAgICBpZiAoTmV3TG9jRW5kLmlzVmFsaWQoKSkKKyAgICAgIHNldFNvdXJjZVJhbmdlKFNvdXJjZVJhbmdlKGdldExvY1N0YXJ0KCksIE5ld0xvY0VuZCkpOworICB9CisKKyAgQ29tbWFuZE1hcmtlcktpbmQgZ2V0Q29tbWFuZE1hcmtlcigpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDb21tYW5kTWFya2VyS2luZD4oCisgICAgICAgIEJsb2NrQ29tbWFuZENvbW1lbnRCaXRzLkNvbW1hbmRNYXJrZXIpOworICB9Cit9OworCisvLy8gRG94eWdlbiBcXHBhcmFtIGNvbW1hbmQuCitjbGFzcyBQYXJhbUNvbW1hbmRDb21tZW50IDogcHVibGljIEJsb2NrQ29tbWFuZENvbW1lbnQgeworcHJpdmF0ZToKKyAgLy8vIFBhcmFtZXRlciBpbmRleCBpbiB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24uCisgIHVuc2lnbmVkIFBhcmFtSW5kZXg7CisKK3B1YmxpYzoKKyAgZW51bSA6IHVuc2lnbmVkIHsKKyAgICBJbnZhbGlkUGFyYW1JbmRleCA9IH4wVSwKKyAgICBWYXJBcmdQYXJhbUluZGV4ID0gfjBVLypJbnZhbGlkUGFyYW1JbmRleCovIC0gMVUKKyAgfTsKKworICBQYXJhbUNvbW1hbmRDb21tZW50KFNvdXJjZUxvY2F0aW9uIExvY0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvY0VuZCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZE1hcmtlcktpbmQgQ29tbWFuZE1hcmtlcikgOgorICAgICAgQmxvY2tDb21tYW5kQ29tbWVudChQYXJhbUNvbW1hbmRDb21tZW50S2luZCwgTG9jQmVnaW4sIExvY0VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZElELCBDb21tYW5kTWFya2VyKSwKKyAgICAgIFBhcmFtSW5kZXgoSW52YWxpZFBhcmFtSW5kZXgpIHsKKyAgICBQYXJhbUNvbW1hbmRDb21tZW50Qml0cy5EaXJlY3Rpb24gPSBJbjsKKyAgICBQYXJhbUNvbW1hbmRDb21tZW50Qml0cy5Jc0RpcmVjdGlvbkV4cGxpY2l0ID0gZmFsc2U7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbW1lbnQgKkMpIHsKKyAgICByZXR1cm4gQy0+Z2V0Q29tbWVudEtpbmQoKSA9PSBQYXJhbUNvbW1hbmRDb21tZW50S2luZDsKKyAgfQorCisgIGVudW0gUGFzc0RpcmVjdGlvbiB7CisgICAgSW4sCisgICAgT3V0LAorICAgIEluT3V0CisgIH07CisKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmdldERpcmVjdGlvbkFzU3RyaW5nKFBhc3NEaXJlY3Rpb24gRCk7CisKKyAgUGFzc0RpcmVjdGlvbiBnZXREaXJlY3Rpb24oKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UGFzc0RpcmVjdGlvbj4oUGFyYW1Db21tYW5kQ29tbWVudEJpdHMuRGlyZWN0aW9uKTsKKyAgfQorCisgIGJvb2wgaXNEaXJlY3Rpb25FeHBsaWNpdCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBQYXJhbUNvbW1hbmRDb21tZW50Qml0cy5Jc0RpcmVjdGlvbkV4cGxpY2l0OworICB9CisKKyAgdm9pZCBzZXREaXJlY3Rpb24oUGFzc0RpcmVjdGlvbiBEaXJlY3Rpb24sIGJvb2wgRXhwbGljaXQpIHsKKyAgICBQYXJhbUNvbW1hbmRDb21tZW50Qml0cy5EaXJlY3Rpb24gPSBEaXJlY3Rpb247CisgICAgUGFyYW1Db21tYW5kQ29tbWVudEJpdHMuSXNEaXJlY3Rpb25FeHBsaWNpdCA9IEV4cGxpY2l0OworICB9CisKKyAgYm9vbCBoYXNQYXJhbU5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE51bUFyZ3MoKSA+IDA7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0UGFyYW1OYW1lKGNvbnN0IEZ1bGxDb21tZW50ICpGQykgY29uc3Q7CisKKyAgU3RyaW5nUmVmIGdldFBhcmFtTmFtZUFzV3JpdHRlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gQXJnc1swXS5UZXh0OworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0UGFyYW1OYW1lUmFuZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIEFyZ3NbMF0uUmFuZ2U7CisgIH0KKworICBib29sIGlzUGFyYW1JbmRleFZhbGlkKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIFBhcmFtSW5kZXggIT0gSW52YWxpZFBhcmFtSW5kZXg7CisgIH0KKworICBib29sIGlzVmFyQXJnUGFyYW0oKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gUGFyYW1JbmRleCA9PSBWYXJBcmdQYXJhbUluZGV4OworICB9CisKKyAgdm9pZCBzZXRJc1ZhckFyZ1BhcmFtKCkgeworICAgIFBhcmFtSW5kZXggPSBWYXJBcmdQYXJhbUluZGV4OworICAgIGFzc2VydChpc1BhcmFtSW5kZXhWYWxpZCgpKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFBhcmFtSW5kZXgoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICBhc3NlcnQoaXNQYXJhbUluZGV4VmFsaWQoKSk7CisgICAgYXNzZXJ0KCFpc1ZhckFyZ1BhcmFtKCkpOworICAgIHJldHVybiBQYXJhbUluZGV4OworICB9CisKKyAgdm9pZCBzZXRQYXJhbUluZGV4KHVuc2lnbmVkIEluZGV4KSB7CisgICAgUGFyYW1JbmRleCA9IEluZGV4OworICAgIGFzc2VydChpc1BhcmFtSW5kZXhWYWxpZCgpKTsKKyAgICBhc3NlcnQoIWlzVmFyQXJnUGFyYW0oKSk7CisgIH0KK307CisKKy8vLyBEb3h5Z2VuIFxcdHBhcmFtIGNvbW1hbmQsIGRlc2NyaWJlcyBhIHRlbXBsYXRlIHBhcmFtZXRlci4KK2NsYXNzIFRQYXJhbUNvbW1hbmRDb21tZW50IDogcHVibGljIEJsb2NrQ29tbWFuZENvbW1lbnQgeworcHJpdmF0ZToKKyAgLy8vIElmIHRoaXMgdGVtcGxhdGUgcGFyYW1ldGVyIG5hbWUgd2FzIHJlc29sdmVkIChmb3VuZCBpbiB0ZW1wbGF0ZSBwYXJhbWV0ZXIKKyAgLy8vIGxpc3QpLCB0aGVuIHRoaXMgc3RvcmVzIGEgbGlzdCBvZiBwb3NpdGlvbiBpbmRleGVzIGluIGFsbCB0ZW1wbGF0ZQorICAvLy8gcGFyYW1ldGVyIGxpc3RzLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlOgorICAvLy8gXHZlcmJhdGltCisgIC8vLyAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgVFQ+CisgIC8vLyAgICAgdm9pZCB0ZXN0KFRUPGludD4gYWFhKTsKKyAgLy8vIFxlbmR2ZXJiYXRpbQorICAvLy8gRm9yIEM6ICBQb3NpdGlvbiA9IHsgMCB9CisgIC8vLyBGb3IgVFQ6IFBvc2l0aW9uID0geyAxIH0KKyAgLy8vIEZvciBUOiAgUG9zaXRpb24gPSB7IDEsIDAgfQorICBBcnJheVJlZjx1bnNpZ25lZD4gUG9zaXRpb247CisKK3B1YmxpYzoKKyAgVFBhcmFtQ29tbWFuZENvbW1lbnQoU291cmNlTG9jYXRpb24gTG9jQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvY0VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTWFya2VyS2luZCBDb21tYW5kTWFya2VyKSA6CisgICAgICBCbG9ja0NvbW1hbmRDb21tZW50KFRQYXJhbUNvbW1hbmRDb21tZW50S2luZCwgTG9jQmVnaW4sIExvY0VuZCwgQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTWFya2VyKQorICB7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbW1lbnQgKkMpIHsKKyAgICByZXR1cm4gQy0+Z2V0Q29tbWVudEtpbmQoKSA9PSBUUGFyYW1Db21tYW5kQ29tbWVudEtpbmQ7CisgIH0KKworICBib29sIGhhc1BhcmFtTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TnVtQXJncygpID4gMDsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRQYXJhbU5hbWUoY29uc3QgRnVsbENvbW1lbnQgKkZDKSBjb25zdDsKKworICBTdHJpbmdSZWYgZ2V0UGFyYW1OYW1lQXNXcml0dGVuKCkgY29uc3QgeworICAgIHJldHVybiBBcmdzWzBdLlRleHQ7CisgIH0KKworICBTb3VyY2VSYW5nZSBnZXRQYXJhbU5hbWVSYW5nZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQXJnc1swXS5SYW5nZTsKKyAgfQorCisgIGJvb2wgaXNQb3NpdGlvblZhbGlkKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuICFQb3NpdGlvbi5lbXB0eSgpOworICB9CisKKyAgdW5zaWduZWQgZ2V0RGVwdGgoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzUG9zaXRpb25WYWxpZCgpKTsKKyAgICByZXR1cm4gUG9zaXRpb24uc2l6ZSgpOworICB9CisKKyAgdW5zaWduZWQgZ2V0SW5kZXgodW5zaWduZWQgRGVwdGgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNQb3NpdGlvblZhbGlkKCkpOworICAgIHJldHVybiBQb3NpdGlvbltEZXB0aF07CisgIH0KKworICB2b2lkIHNldFBvc2l0aW9uKEFycmF5UmVmPHVuc2lnbmVkPiBOZXdQb3NpdGlvbikgeworICAgIFBvc2l0aW9uID0gTmV3UG9zaXRpb247CisgICAgYXNzZXJ0KGlzUG9zaXRpb25WYWxpZCgpKTsKKyAgfQorfTsKKworLy8vIEEgbGluZSBvZiB0ZXh0IGNvbnRhaW5lZCBpbiBhIHZlcmJhdGltIGJsb2NrLgorY2xhc3MgVmVyYmF0aW1CbG9ja0xpbmVDb21tZW50IDogcHVibGljIENvbW1lbnQgeworICBTdHJpbmdSZWYgVGV4dDsKKworcHVibGljOgorICBWZXJiYXRpbUJsb2NrTGluZUNvbW1lbnQoU291cmNlTG9jYXRpb24gTG9jQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVGV4dCkgOgorICAgICAgQ29tbWVudChWZXJiYXRpbUJsb2NrTGluZUNvbW1lbnRLaW5kLAorICAgICAgICAgICAgICBMb2NCZWdpbiwKKyAgICAgICAgICAgICAgTG9jQmVnaW4uZ2V0TG9jV2l0aE9mZnNldChUZXh0LnNpemUoKSkpLAorICAgICAgVGV4dChUZXh0KQorICB7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbW1lbnQgKkMpIHsKKyAgICByZXR1cm4gQy0+Z2V0Q29tbWVudEtpbmQoKSA9PSBWZXJiYXRpbUJsb2NrTGluZUNvbW1lbnRLaW5kOworICB9CisKKyAgY2hpbGRfaXRlcmF0b3IgY2hpbGRfYmVnaW4oKSBjb25zdCB7IHJldHVybiBudWxscHRyOyB9CisKKyAgY2hpbGRfaXRlcmF0b3IgY2hpbGRfZW5kKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgIFN0cmluZ1JlZiBnZXRUZXh0KCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIFRleHQ7CisgIH0KK307CisKKy8vLyBBIHZlcmJhdGltIGJsb2NrIGNvbW1hbmQgKGUuIGcuLCBwcmVmb3JtYXR0ZWQgY29kZSkuICBWZXJiYXRpbSBibG9jayBoYXMgYW4KKy8vLyBvcGVuaW5nIGFuZCBhIGNsb3NpbmcgY29tbWFuZCBhbmQgY29udGFpbnMgbXVsdGlwbGUgbGluZXMgb2YgdGV4dAorLy8vIChWZXJiYXRpbUJsb2NrTGluZUNvbW1lbnQgbm9kZXMpLgorY2xhc3MgVmVyYmF0aW1CbG9ja0NvbW1lbnQgOiBwdWJsaWMgQmxvY2tDb21tYW5kQ29tbWVudCB7Citwcm90ZWN0ZWQ6CisgIFN0cmluZ1JlZiBDbG9zZU5hbWU7CisgIFNvdXJjZUxvY2F0aW9uIENsb3NlTmFtZUxvY0JlZ2luOworICBBcnJheVJlZjxWZXJiYXRpbUJsb2NrTGluZUNvbW1lbnQgKj4gTGluZXM7CisKK3B1YmxpYzoKKyAgVmVyYmF0aW1CbG9ja0NvbW1lbnQoU291cmNlTG9jYXRpb24gTG9jQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvY0VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29tbWFuZElEKSA6CisgICAgICBCbG9ja0NvbW1hbmRDb21tZW50KFZlcmJhdGltQmxvY2tDb21tZW50S2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jQmVnaW4sIExvY0VuZCwgQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDTUtfQXQpIC8vIEZJWE1FOiBpbXByb3ZlIHNvdXJjZSBmaWRlbGl0eS4KKyAgeyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDb21tZW50ICpDKSB7CisgICAgcmV0dXJuIEMtPmdldENvbW1lbnRLaW5kKCkgPT0gVmVyYmF0aW1CbG9ja0NvbW1lbnRLaW5kOworICB9CisKKyAgY2hpbGRfaXRlcmF0b3IgY2hpbGRfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hpbGRfaXRlcmF0b3I+KExpbmVzLmJlZ2luKCkpOworICB9CisKKyAgY2hpbGRfaXRlcmF0b3IgY2hpbGRfZW5kKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNoaWxkX2l0ZXJhdG9yPihMaW5lcy5lbmQoKSk7CisgIH0KKworICB2b2lkIHNldENsb3NlTmFtZShTdHJpbmdSZWYgTmFtZSwgU291cmNlTG9jYXRpb24gTG9jQmVnaW4pIHsKKyAgICBDbG9zZU5hbWUgPSBOYW1lOworICAgIENsb3NlTmFtZUxvY0JlZ2luID0gTG9jQmVnaW47CisgIH0KKworICB2b2lkIHNldExpbmVzKEFycmF5UmVmPFZlcmJhdGltQmxvY2tMaW5lQ29tbWVudCAqPiBMKSB7CisgICAgTGluZXMgPSBMOworICB9CisKKyAgU3RyaW5nUmVmIGdldENsb3NlTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2xvc2VOYW1lOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtTGluZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIExpbmVzLnNpemUoKTsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRUZXh0KHVuc2lnbmVkIExpbmVJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gTGluZXNbTGluZUlkeF0tPmdldFRleHQoKTsKKyAgfQorfTsKKworLy8vIEEgdmVyYmF0aW0gbGluZSBjb21tYW5kLiAgVmVyYmF0aW0gbGluZSBoYXMgYW4gb3BlbmluZyBjb21tYW5kLCBhIHNpbmdsZQorLy8vIGxpbmUgb2YgdGV4dCAodXAgdG8gdGhlIG5ld2xpbmUgYWZ0ZXIgdGhlIG9wZW5pbmcgY29tbWFuZCkgYW5kIGhhcyBubworLy8vIGNsb3NpbmcgY29tbWFuZC4KK2NsYXNzIFZlcmJhdGltTGluZUNvbW1lbnQgOiBwdWJsaWMgQmxvY2tDb21tYW5kQ29tbWVudCB7Citwcm90ZWN0ZWQ6CisgIFN0cmluZ1JlZiBUZXh0OworICBTb3VyY2VMb2NhdGlvbiBUZXh0QmVnaW47CisKK3B1YmxpYzoKKyAgVmVyYmF0aW1MaW5lQ29tbWVudChTb3VyY2VMb2NhdGlvbiBMb2NCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2NFbmQsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRleHRCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVGV4dCkgOgorICAgICAgQmxvY2tDb21tYW5kQ29tbWVudChWZXJiYXRpbUxpbmVDb21tZW50S2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jQmVnaW4sIExvY0VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDTUtfQXQpLCAvLyBGSVhNRTogaW1wcm92ZSBzb3VyY2UgZmlkZWxpdHkuCisgICAgICBUZXh0KFRleHQpLAorICAgICAgVGV4dEJlZ2luKFRleHRCZWdpbikKKyAgeyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDb21tZW50ICpDKSB7CisgICAgcmV0dXJuIEMtPmdldENvbW1lbnRLaW5kKCkgPT0gVmVyYmF0aW1MaW5lQ29tbWVudEtpbmQ7CisgIH0KKworICBjaGlsZF9pdGVyYXRvciBjaGlsZF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KKworICBjaGlsZF9pdGVyYXRvciBjaGlsZF9lbmQoKSBjb25zdCB7IHJldHVybiBudWxscHRyOyB9CisKKyAgU3RyaW5nUmVmIGdldFRleHQoKSBjb25zdCB7CisgICAgcmV0dXJuIFRleHQ7CisgIH0KKworICBTb3VyY2VSYW5nZSBnZXRUZXh0UmFuZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIFNvdXJjZVJhbmdlKFRleHRCZWdpbiwgZ2V0TG9jRW5kKCkpOworICB9Cit9OworCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGRlY2xhcmF0aW9uLCB1c2VmdWwgdG8gY2xpZW50cyBvZiBGdWxsQ29tbWVudC4KK3N0cnVjdCBEZWNsSW5mbyB7CisgIC8vLyBEZWNsYXJhdGlvbiB0aGUgY29tbWVudCBpcyBhY3R1YWxseSBhdHRhY2hlZCB0byAoaW4gdGhlIHNvdXJjZSkuCisgIC8vLyBTaG91bGQgbm90IGJlIE5VTEwuCisgIGNvbnN0IERlY2wgKkNvbW1lbnREZWNsOworICAKKyAgLy8vIEN1cnJlbnREZWNsIGlzIHRoZSBkZWNsYXJhdGlvbiB3aXRoIHdoaWNoIHRoZSBGdWxsQ29tbWVudCBpcyBhc3NvY2lhdGVkLgorICAvLy8KKyAgLy8vIEl0IGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBcYyBDb21tZW50RGVjbC4gIEl0IGhhcHBlbnMgd2hlbiB3ZSB3ZSBkZWNpZGUKKyAgLy8vIHRoYXQgdGhlIGNvbW1lbnQgb3JpZ2luYWxseSBhdHRhY2hlZCB0byBcYyBDb21tZW50RGVjbCBpcyBmaW5lIGZvcgorICAvLy8gXGMgQ3VycmVudERlY2wgdG9vIChmb3IgZXhhbXBsZSwgZm9yIGEgcmVkZWNsYXJhdGlvbiBvciBhbiBvdmVycmlkZXIgb2YKKyAgLy8vIFxjIENvbW1lbnREZWNsKS4KKyAgLy8vCisgIC8vLyBUaGUgaW5mb3JtYXRpb24gaW4gdGhlIERlY2xJbmZvIGNvcnJlc3BvbmRzIHRvIEN1cnJlbnREZWNsLgorICBjb25zdCBEZWNsICpDdXJyZW50RGVjbDsKKyAgCisgIC8vLyBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgYnkgXFxwYXJhbSBpZiBcYyBDb21tZW50RGVjbCBpcyBzb21ldGhpbmcKKyAgLy8vIHRoYXQgd2UgY29uc2lkZXIgYSAiZnVuY3Rpb24iLgorICBBcnJheVJlZjxjb25zdCBQYXJtVmFyRGVjbCAqPiBQYXJhbVZhcnM7CisKKyAgLy8vIEZ1bmN0aW9uIHJldHVybiB0eXBlIGlmIFxjIENvbW1lbnREZWNsIGlzIHNvbWV0aGluZyB0aGF0IHdlIGNvbnNpZGVyCisgIC8vLyBhICJmdW5jdGlvbiIuCisgIFF1YWxUeXBlIFJldHVyblR5cGU7CisKKyAgLy8vIFRlbXBsYXRlIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBieSBcXHRwYXJhbSBpZiBcYyBDb21tZW50RGVjbCBpcworICAvLy8gYSB0ZW1wbGF0ZSAoXGMgSXNUZW1wbGF0ZURlY2wgb3IgXGMgSXNUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbiBpcworICAvLy8gdHJ1ZSkuCisgIGNvbnN0IFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqVGVtcGxhdGVQYXJhbWV0ZXJzOworCisgIC8vLyBBIHNpbXBsaWZpZWQgZGVzY3JpcHRpb24gb2YgXGMgQ29tbWVudERlY2wga2luZCB0aGF0IHNob3VsZCBiZSBnb29kIGVub3VnaAorICAvLy8gZm9yIGRvY3VtZW50YXRpb24gcmVuZGVyaW5nIHB1cnBvc2VzLgorICBlbnVtIERlY2xLaW5kIHsKKyAgICAvLy8gRXZlcnl0aGluZyBlbHNlIG5vdCBleHBsaWNpdGx5IG1lbnRpb25lZCBiZWxvdy4KKyAgICBPdGhlcktpbmQsCisKKyAgICAvLy8gU29tZXRoaW5nIHRoYXQgd2UgY29uc2lkZXIgYSAiZnVuY3Rpb24iOgorICAgIC8vLyBcbGkgZnVuY3Rpb24sCisgICAgLy8vIFxsaSBmdW5jdGlvbiB0ZW1wbGF0ZSwKKyAgICAvLy8gXGxpIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLAorICAgIC8vLyBcbGkgbWVtYmVyIGZ1bmN0aW9uLAorICAgIC8vLyBcbGkgbWVtYmVyIGZ1bmN0aW9uIHRlbXBsYXRlLAorICAgIC8vLyBcbGkgbWVtYmVyIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLAorICAgIC8vLyBcbGkgT2JqQyBtZXRob2QsCisgICAgLy8vIFxsaSBhIHR5cGVkZWYgZm9yIGEgZnVuY3Rpb24gcG9pbnRlciwgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIsCisgICAgLy8vICAgICBPYmpDIGJsb2NrLgorICAgIEZ1bmN0aW9uS2luZCwKKworICAgIC8vLyBTb21ldGhpbmcgdGhhdCB3ZSBjb25zaWRlciBhICJjbGFzcyI6CisgICAgLy8vIFxsaSBjbGFzcy9zdHJ1Y3QsCisgICAgLy8vIFxsaSBjbGFzcyB0ZW1wbGF0ZSwKKyAgICAvLy8gXGxpIGNsYXNzIHRlbXBsYXRlIChwYXJ0aWFsKSBzcGVjaWFsaXphdGlvbi4KKyAgICBDbGFzc0tpbmQsCisKKyAgICAvLy8gU29tZXRoaW5nIHRoYXQgd2UgY29uc2lkZXIgYSAidmFyaWFibGUiOgorICAgIC8vLyBcbGkgbmFtZXNwYWNlIHNjb3BlIHZhcmlhYmxlczsKKyAgICAvLy8gXGxpIHN0YXRpYyBhbmQgbm9uLXN0YXRpYyBjbGFzcyBkYXRhIG1lbWJlcnM7CisgICAgLy8vIFxsaSBlbnVtZXJhdG9ycy4KKyAgICBWYXJpYWJsZUtpbmQsCisKKyAgICAvLy8gQSBDKysgbmFtZXNwYWNlLgorICAgIE5hbWVzcGFjZUtpbmQsCisKKyAgICAvLy8gQSBDKysgdHlwZWRlZi1uYW1lIChhICd0eXBlZGVmJyBkZWNsIHNwZWNpZmllciBvciBhbGlhcy1kZWNsYXJhdGlvbiksCisgICAgLy8vIHNlZSBcYyBUeXBlZGVmTmFtZURlY2wuCisgICAgVHlwZWRlZktpbmQsCisKKyAgICAvLy8gQW4gZW51bWVyYXRpb24gb3Igc2NvcGVkIGVudW1lcmF0aW9uLgorICAgIEVudW1LaW5kCisgIH07CisKKyAgLy8vIFdoYXQga2luZCBvZiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBcYyBDb21tZW50RGVjbCBpcy4KKyAgZW51bSBUZW1wbGF0ZURlY2xLaW5kIHsKKyAgICBOb3RUZW1wbGF0ZSwKKyAgICBUZW1wbGF0ZSwKKyAgICBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uLAorICAgIFRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uCisgIH07CisKKyAgLy8vIElmIGZhbHNlLCBvbmx5IFxjIENvbW1lbnREZWNsIGlzIHZhbGlkLgorICB1bnNpZ25lZCBJc0ZpbGxlZCA6IDE7CisKKyAgLy8vIFNpbXBsaWZpZWQga2luZCBvZiBcYyBDb21tZW50RGVjbCwgc2VlIFxjIERlY2xLaW5kIGVudW0uCisgIHVuc2lnbmVkIEtpbmQgOiAzOworCisgIC8vLyBJcyBcYyBDb21tZW50RGVjbCBhIHRlbXBsYXRlIGRlY2xhcmF0aW9uLgorICB1bnNpZ25lZCBUZW1wbGF0ZUtpbmQgOiAyOworCisgIC8vLyBJcyBcYyBDb21tZW50RGVjbCBhbiBPYmpDTWV0aG9kRGVjbC4KKyAgdW5zaWduZWQgSXNPYmpDTWV0aG9kIDogMTsKKworICAvLy8gSXMgXGMgQ29tbWVudERlY2wgYSBub24tc3RhdGljIG1lbWJlciBmdW5jdGlvbiBvZiBDKysgY2xhc3Mgb3IKKyAgLy8vIGluc3RhbmNlIG1ldGhvZCBvZiBPYmpDIGNsYXNzLgorICAvLy8gQ2FuIGJlIHRydWUgb25seSBpZiBcYyBJc0Z1bmN0aW9uRGVjbCBpcyB0cnVlLgorICB1bnNpZ25lZCBJc0luc3RhbmNlTWV0aG9kIDogMTsKKworICAvLy8gSXMgXGMgQ29tbWVudERlY2wgYSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIG9mIEMrKyBjbGFzcyBvcgorICAvLy8gY2xhc3MgbWV0aG9kIG9mIE9iakMgY2xhc3MuCisgIC8vLyBDYW4gYmUgdHJ1ZSBvbmx5IGlmIFxjIElzRnVuY3Rpb25EZWNsIGlzIHRydWUuCisgIHVuc2lnbmVkIElzQ2xhc3NNZXRob2QgOiAxOworCisgIHZvaWQgZmlsbCgpOworCisgIERlY2xLaW5kIGdldEtpbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVjbEtpbmQ+KEtpbmQpOworICB9CisKKyAgVGVtcGxhdGVEZWNsS2luZCBnZXRUZW1wbGF0ZUtpbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VGVtcGxhdGVEZWNsS2luZD4oVGVtcGxhdGVLaW5kKTsKKyAgfQorfTsKKworLy8vIEEgZnVsbCBjb21tZW50IGF0dGFjaGVkIHRvIGEgZGVjbGFyYXRpb24sIGNvbnRhaW5zIGJsb2NrIGNvbnRlbnQuCitjbGFzcyBGdWxsQ29tbWVudCA6IHB1YmxpYyBDb21tZW50IHsKKyAgQXJyYXlSZWY8QmxvY2tDb250ZW50Q29tbWVudCAqPiBCbG9ja3M7CisgIERlY2xJbmZvICpUaGlzRGVjbEluZm87CisKK3B1YmxpYzoKKyAgRnVsbENvbW1lbnQoQXJyYXlSZWY8QmxvY2tDb250ZW50Q29tbWVudCAqPiBCbG9ja3MsIERlY2xJbmZvICpEKSA6CisgICAgICBDb21tZW50KEZ1bGxDb21tZW50S2luZCwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSksCisgICAgICBCbG9ja3MoQmxvY2tzKSwgVGhpc0RlY2xJbmZvKEQpIHsKKyAgICBpZiAoQmxvY2tzLmVtcHR5KCkpCisgICAgICByZXR1cm47CisKKyAgICBzZXRTb3VyY2VSYW5nZShTb3VyY2VSYW5nZShCbG9ja3MuZnJvbnQoKS0+Z2V0TG9jU3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja3MuYmFjaygpLT5nZXRMb2NFbmQoKSkpOworICAgIHNldExvY2F0aW9uKEJsb2Nrcy5mcm9udCgpLT5nZXRMb2NTdGFydCgpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ29tbWVudCAqQykgeworICAgIHJldHVybiBDLT5nZXRDb21tZW50S2luZCgpID09IEZ1bGxDb21tZW50S2luZDsKKyAgfQorCisgIGNoaWxkX2l0ZXJhdG9yIGNoaWxkX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNoaWxkX2l0ZXJhdG9yPihCbG9ja3MuYmVnaW4oKSk7CisgIH0KKworICBjaGlsZF9pdGVyYXRvciBjaGlsZF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hpbGRfaXRlcmF0b3I+KEJsb2Nrcy5lbmQoKSk7IAorICB9CisKKyAgY29uc3QgRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBUaGlzRGVjbEluZm8tPkNvbW1lbnREZWNsOworICB9CisgIAorICBjb25zdCBEZWNsSW5mbyAqZ2V0RGVjbEluZm8oKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICBpZiAoIVRoaXNEZWNsSW5mby0+SXNGaWxsZWQpCisgICAgICBUaGlzRGVjbEluZm8tPmZpbGwoKTsKKyAgICByZXR1cm4gVGhpc0RlY2xJbmZvOworICB9CisgIAorICBBcnJheVJlZjxCbG9ja0NvbnRlbnRDb21tZW50ICo+IGdldEJsb2NrcygpIGNvbnN0IHsgcmV0dXJuIEJsb2NrczsgfQorICAKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgY29tbWVudHMKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRCcmllZlBhcnNlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRCcmllZlBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNWI4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudEJyaWVmUGFyc2VyLmgKQEAgLTAsMCArMSw1NSBAQAorLy89PT0tLS0gQ29tbWVudEJyaWVmUGFyc2VyLmggLSBEdW1iIGNvbW1lbnQgcGFyc2VyIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgYSB2ZXJ5IHNpbXBsZSBEb3h5Z2VuIGNvbW1lbnQgcGFyc2VyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9DT01NRU5UQlJJRUZQQVJTRVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9DT01NRU5UQlJJRUZQQVJTRVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0NvbW1lbnRMZXhlci5oIgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGNvbW1lbnRzIHsKKworLy8vIEEgdmVyeSBzaW1wbGUgY29tbWVudCBwYXJzZXIgdGhhdCBleHRyYWN0cyAiYSBicmllZiBkZXNjcmlwdGlvbiIuCisvLy8KKy8vLyBEdWUgdG8gYSB2YXJpZXR5IG9mIGNvbW1lbnQgc3R5bGVzLCBpdCBjb25zaWRlcnMgdGhlIGZvbGxvd2luZyBhcyAiYSBicmllZgorLy8vIGRlc2NyaXB0aW9uIiwgaW4gb3JkZXIgb2YgcHJpb3JpdHk6CisvLy8gXGxpIGEgXFxicmllZiBvciBcXHNob3J0IGNvbW1hbmQsCisvLy8gXGxpIHRoZSBmaXJzdCBwYXJhZ3JhcGgsCisvLy8gXGxpIGEgXFxyZXN1bHQgb3IgXFxyZXR1cm4gb3IgXFxyZXR1cm5zIHBhcmFncmFwaC4KK2NsYXNzIEJyaWVmUGFyc2VyIHsKKyAgTGV4ZXIgJkw7CisKKyAgY29uc3QgQ29tbWFuZFRyYWl0cyAmVHJhaXRzOworCisgIC8vLyBDdXJyZW50IGxvb2thaGVhZCB0b2tlbi4KKyAgVG9rZW4gVG9rOworCisgIFNvdXJjZUxvY2F0aW9uIENvbnN1bWVUb2tlbigpIHsKKyAgICBTb3VyY2VMb2NhdGlvbiBMb2MgPSBUb2suZ2V0TG9jYXRpb24oKTsKKyAgICBMLmxleChUb2spOworICAgIHJldHVybiBMb2M7CisgIH0KKworcHVibGljOgorICBCcmllZlBhcnNlcihMZXhlciAmTCwgY29uc3QgQ29tbWFuZFRyYWl0cyAmVHJhaXRzKTsKKworICAvLy8gUmV0dXJuIHRoZSBiZXN0ICJicmllZiBkZXNjcmlwdGlvbiIgd2UgY2FuIGZpbmQuCisgIHN0ZDo6c3RyaW5nIFBhcnNlKCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29tbWVudHMKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRDb21tYW5kSW5mby5pbmMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudENvbW1hbmRJbmZvLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWU3NGU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRDb21tYW5kSW5mby5pbmMKQEAgLTAsMCArMSw4MDAgQEAKKy8qPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogQSBsaXN0IG9mIGNvbW1hbmRzIHVzZWFibGUgaW4gZG9jdW1lbnRhdGlvbiBjb21tZW50cyAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLCBkbyBub3QgZWRpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKK25hbWVzcGFjZSB7Citjb25zdCBDb21tYW5kSW5mbyBDb21tYW5kc1tdID0geworICB7ICJhIiwgIiIsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAiYWJzdHJhY3QiLCAiIiwgMSwgMCwgMCwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJhZGR0b2dyb3VwIiwgIiIsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAiYXJnIiwgIiIsIDMsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAiYXR0ZW50aW9uIiwgIiIsIDQsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAiYXV0aG9yIiwgIiIsIDUsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAiYXV0aG9ycyIsICIiLCA2LCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgImIiLCAiIiwgNywgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJicmllZiIsICIiLCA4LCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgImJ1ZyIsICIiLCA5LCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgImMiLCAiIiwgMTAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAiY2FsbGJhY2siLCAiIiwgMTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDAsIDAsIDAgfSwKKyAgeyAiY2F0ZWdvcnkiLCAiIiwgMTIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIDAsIDAsIDAgfSwKKyAgeyAiY2xhc3MiLCAiIiwgMTMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIDAsIDEsIDAgfSwKKyAgeyAiY2xhc3NkZXNpZ24iLCAiIiwgMTQsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAgfSwKKyAgeyAiY29jbGFzcyIsICIiLCAxNSwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCB9LAorICB7ICJjb2RlIiwgImVuZGNvZGUiLCAxNiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJlbmRjb2RlIiwgIiIsIDE3LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgImNvbnN0IiwgIiIsIDE4LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwIH0sCisgIHsgImNvbnN0YW50IiwgIiIsIDE5LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwIH0sCisgIHsgImNvcHlyaWdodCIsICIiLCAyMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJkYXRlIiwgIiIsIDIxLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgImRlZiIsICIiLCAyMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMCwgMCB9LAorICB7ICJkZWZncm91cCIsICIiLCAyMywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJkZXBlbmRlbmN5IiwgIiIsIDI0LCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwIH0sCisgIHsgImRlcHJlY2F0ZWQiLCAiIiwgMjUsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAiZGV0YWlscyIsICIiLCAyNiwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJkaXNjdXNzaW9uIiwgIiIsIDI3LCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgImRvdCIsICJlbmRkb3QiLCAyOCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJlbmRkb3QiLCAiIiwgMjksIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAiZSIsICIiLCAzMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJlbSIsICIiLCAzMSwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJlbnVtIiwgIiIsIDMyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwIH0sCisgIHsgImV4Y2VwdGlvbiIsICIiLCAzMywgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJmeyIsICJmfSIsIDM0LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgImZ9IiwgIiIsIDM1LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgImZbIiwgImZdIiwgMzYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAiZl0iLCAiIiwgMzcsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAiZiQiLCAiZiQiLCAzOCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJmbiIsICIiLCAzOSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMCwgMCB9LAorICB7ICJmdW5jdGlvbiIsICIiLCA0MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMCwgMCwgMCB9LAorICB7ICJmdW5jdGlvbmdyb3VwIiwgIiIsIDQxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAwLCAwLCAwIH0sCisgIHsgImhlYWRlcmZpbGUiLCAiIiwgNDIsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAiaGVscGVyIiwgIiIsIDQzLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwIH0sCisgIHsgImhlbHBlcmNsYXNzIiwgIiIsIDQ0LCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwIH0sCisgIHsgImhlbHBzIiwgIiIsIDQ1LCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwIH0sCisgIHsgImh0bWxvbmx5IiwgImVuZGh0bWxvbmx5IiwgNDYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAiZW5kaHRtbG9ubHkiLCAiIiwgNDcsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAiaW5ncm91cCIsICIiLCA0OCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJpbnN0YW5jZXNpemUiLCAiIiwgNDksIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAgfSwKKyAgeyAiaW50ZXJmYWNlIiwgIiIsIDUwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAxLCAwIH0sCisgIHsgImludmFyaWFudCIsICIiLCA1MSwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJsYXRleG9ubHkiLCAiZW5kbGF0ZXhvbmx5IiwgNTIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAiZW5kbGF0ZXhvbmx5IiwgIiIsIDUzLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgImxpIiwgIiIsIDU0LCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgImxpbmsiLCAiL2xpbmsiLCA1NSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICIvbGluayIsICIiLCA1NiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJtYWlucGFnZSIsICIiLCA1NywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJtYW5vbmx5IiwgImVuZG1hbm9ubHkiLCA1OCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJlbmRtYW5vbmx5IiwgIiIsIDU5LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgIm1ldGhvZCIsICIiLCA2MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMCwgMCwgMCB9LAorICB7ICJtZXRob2Rncm91cCIsICIiLCA2MSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMCwgMCwgMCB9LAorICB7ICJtc2MiLCAiZW5kbXNjIiwgNjIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAiZW5kbXNjIiwgIiIsIDYzLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgIm5hbWUiLCAiIiwgNjQsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAibmFtZXNwYWNlIiwgIiIsIDY1LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwIH0sCisgIHsgIm5vdGUiLCAiIiwgNjYsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAib3ZlcmxvYWQiLCAiIiwgNjcsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIDAsIDAsIDAgfSwKKyAgeyAib3duZXJzaGlwIiwgIiIsIDY4LCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwIH0sCisgIHsgInAiLCAiIiwgNjksIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAicGFyIiwgIiIsIDcwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgInBhcmFncmFwaCIsICIiLCA3MSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJwYXJhbSIsICIiLCA3MiwgMCwgMCwgMSwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJwZXJmb3JtYW5jZSIsICIiLCA3MywgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCB9LAorICB7ICJwb3N0IiwgIiIsIDc0LCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgInByZSIsICIiLCA3NSwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJwcm9wZXJ0eSIsICIiLCA3NiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMCwgMCB9LAorICB7ICJwcm90b2NvbCIsICIiLCA3NywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMSwgMCB9LAorICB7ICJyZWYiLCAiIiwgNzgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAicmVsYXRlZCIsICIiLCA3OSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJyZWxhdGVkYWxzbyIsICIiLCA4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJyZWxhdGVzIiwgIiIsIDgxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgInJlbGF0ZXNhbHNvIiwgIiIsIDgyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgInJlbWFyayIsICIiLCA4MywgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJyZW1hcmtzIiwgIiIsIDg0LCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgInJlc3VsdCIsICIiLCA4NSwgMCwgMCwgMSwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJyZXR1cm4iLCAiIiwgODYsIDAsIDAsIDEsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAicmV0dXJucyIsICIiLCA4NywgMCwgMCwgMSwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJydGZvbmx5IiwgImVuZHJ0Zm9ubHkiLCA4OCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJlbmRydGZvbmx5IiwgIiIsIDg5LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgInNhIiwgIiIsIDkwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgInNlY3Rpb24iLCAiIiwgOTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAic2VjdXJpdHkiLCAiIiwgOTIsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAgfSwKKyAgeyAic2VlIiwgIiIsIDkzLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgInNlZWFsc28iLCAiIiwgOTQsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAic2hvcnQiLCAiIiwgOTUsIDAsIDAsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAic2luY2UiLCAiIiwgOTYsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAic3RydWN0IiwgIiIsIDk3LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAxLCAwIH0sCisgIHsgInN1YnBhZ2UiLCAiIiwgOTgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAic3Vic2VjdGlvbiIsICIiLCA5OSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJzdWJzdWJzZWN0aW9uIiwgIiIsIDEwMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJzdXBlcmNsYXNzIiwgIiIsIDEwMSwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCB9LAorICB7ICJ0ZW1wbGF0ZSIsICIiLCAxMDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIDAsIDAsIDAgfSwKKyAgeyAidGVtcGxhdGVmaWVsZCIsICIiLCAxMDMsIDAsIDAsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAidGV4dGJsb2NrIiwgIi90ZXh0YmxvY2siLCAxMDQsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAiL3RleHRibG9jayIsICIiLCAxMDUsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAidGhyb3ciLCAiIiwgMTA2LCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgIHsgInRocm93cyIsICIiLCAxMDcsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAidG9kbyIsICIiLCAxMDgsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAidHBhcmFtIiwgIiIsIDEwOSwgMCwgMCwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJ0eXBlZGVmIiwgIiIsIDExMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMCwgMCB9LAorICB7ICJ1bmlvbiIsICIiLCAxMTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIDAsIDEsIDAgfSwKKyAgeyAidmFyIiwgIiIsIDExMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMCwgMCB9LAorICB7ICJ2ZXJiYXRpbSIsICJlbmR2ZXJiYXRpbSIsIDExMywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJlbmR2ZXJiYXRpbSIsICIiLCAxMTQsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAidmVyc2lvbiIsICIiLCAxMTUsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAid2FybmluZyIsICIiLCAxMTYsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAid2Vha2dyb3VwIiwgIiIsIDExNywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCB9LAorICB7ICJ4bWxvbmx5IiwgImVuZHhtbG9ubHkiLCAxMTgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgeyAiZW5keG1sb25seSIsICIiLCAxMTksIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAgfQorfTsKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworY29uc3QgQ29tbWFuZEluZm8gKkNvbW1hbmRUcmFpdHM6OmdldEJ1aWx0aW5Db21tYW5kSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUpIHsKKyAgc3dpdGNoIChOYW1lLnNpemUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSAxOgkgLy8gNSBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICByZXR1cm4gJkNvbW1hbmRzWzBdOwkgLy8gImEiCisgICAgY2FzZSAnYic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIHJldHVybiAmQ29tbWFuZHNbN107CSAvLyAiYiIKKyAgICBjYXNlICdjJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgcmV0dXJuICZDb21tYW5kc1sxMF07CSAvLyAiYyIKKyAgICBjYXNlICdlJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgcmV0dXJuICZDb21tYW5kc1szMF07CSAvLyAiZSIKKyAgICBjYXNlICdwJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgcmV0dXJuICZDb21tYW5kc1s2OV07CSAvLyAicCIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjoJIC8vIDkgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdlJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKE5hbWVbMV0gIT0gJ20nKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbMzFdOwkgLy8gImVtIgorICAgIGNhc2UgJ2YnOgkgLy8gNiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJyQnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIHJldHVybiAmQ29tbWFuZHNbMzhdOwkgLy8gImYkIgorICAgICAgY2FzZSAnWyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1szNl07CSAvLyAiZlsiCisgICAgICBjYXNlICddJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICByZXR1cm4gJkNvbW1hbmRzWzM3XTsJIC8vICJmXSIKKyAgICAgIGNhc2UgJ24nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIHJldHVybiAmQ29tbWFuZHNbMzldOwkgLy8gImZuIgorICAgICAgY2FzZSAneyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1szNF07CSAvLyAiZnsiCisgICAgICBjYXNlICd9JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICByZXR1cm4gJkNvbW1hbmRzWzM1XTsJIC8vICJmfSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2wnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAoTmFtZVsxXSAhPSAnaScpCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1s1NF07CSAvLyAibGkiCisgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChOYW1lWzFdICE9ICdhJykKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzkwXTsJIC8vICJzYSIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMzoJIC8vIDEwIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInJnIiwgMikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzNdOwkgLy8gImFyZyIKKyAgICBjYXNlICdiJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAidWciLCAyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbOV07CSAvLyAiYnVnIgorICAgIGNhc2UgJ2QnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChOYW1lWzJdICE9ICdmJykKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1syMl07CSAvLyAiZGVmIgorICAgICAgY2FzZSAnbyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKE5hbWVbMl0gIT0gJ3QnKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gJkNvbW1hbmRzWzI4XTsJIC8vICJkb3QiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdtJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAic2MiLCAyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbNjJdOwkgLy8gIm1zYyIKKyAgICBjYXNlICdwJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAoTmFtZVsyXSAhPSAncicpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAmQ29tbWFuZHNbNzBdOwkgLy8gInBhciIKKyAgICAgIGNhc2UgJ3InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChOYW1lWzJdICE9ICdlJykKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1s3NV07CSAvLyAicHJlIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImVmIiwgMikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzc4XTsJIC8vICJyZWYiCisgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImVlIiwgMikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzkzXTsJIC8vICJzZWUiCisgICAgY2FzZSAndic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImFyIiwgMikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzExMl07CSAvLyAidmFyIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA0OgkgLy8gOCBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJvZGUiLCAzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbMTZdOwkgLy8gImNvZGUiCisgICAgY2FzZSAnZCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImF0ZSIsIDMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1syMV07CSAvLyAiZGF0ZSIKKyAgICBjYXNlICdlJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibnVtIiwgMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzMyXTsJIC8vICJlbnVtIgorICAgIGNhc2UgJ2wnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJpbmsiLCAzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbNTVdOwkgLy8gImxpbmsiCisgICAgY2FzZSAnbic6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAibWUiLCAyKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gJkNvbW1hbmRzWzY0XTsJIC8vICJuYW1lIgorICAgICAgY2FzZSAnbyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAidGUiLCAyKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gJkNvbW1hbmRzWzY2XTsJIC8vICJub3RlIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm9zdCIsIDMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1s3NF07CSAvLyAicG9zdCIKKyAgICBjYXNlICd0JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAib2RvIiwgMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzEwOF07CSAvLyAidG9kbyIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgNToJIC8vIDEwIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnLyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImxpbmsiLCA0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbNTZdOwkgLy8gIi9saW5rIgorICAgIGNhc2UgJ2InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJyaWVmIiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzhdOwkgLy8gImJyaWVmIgorICAgIGNhc2UgJ2MnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2wnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImFzcyIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAmQ29tbWFuZHNbMTNdOwkgLy8gImNsYXNzIgorICAgICAgY2FzZSAnbyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAibnN0IiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1sxOF07CSAvLyAiY29uc3QiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdoJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZWxwcyIsIDQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1s0NV07CSAvLyAiaGVscHMiCisgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImFyYW0iLCA0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbNzJdOwkgLy8gInBhcmFtIgorICAgIGNhc2UgJ3MnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2gnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgIm9ydCIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAmQ29tbWFuZHNbOTVdOwkgLy8gInNob3J0IgorICAgICAgY2FzZSAnaSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAibmNlIiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1s5Nl07CSAvLyAic2luY2UiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICd0JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiaHJvdyIsIDQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1sxMDZdOwkgLy8gInRocm93IgorICAgIGNhc2UgJ3UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJuaW9uIiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzExMV07CSAvLyAidW5pb24iCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDY6CSAvLyAxMSBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ1dGhvciIsIDUpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1s1XTsJIC8vICJhdXRob3IiCisgICAgY2FzZSAnZSc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJuZCIsIDIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgc3dpdGNoIChOYW1lWzNdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNCwgIm90IiwgMikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1syOV07CSAvLyAiZW5kZG90IgorICAgICAgY2FzZSAnbSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs0LCAic2MiLCAyKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gJkNvbW1hbmRzWzYzXTsJIC8vICJlbmRtc2MiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdoJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZWxwZXIiLCA1KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbNDNdOwkgLy8gImhlbHBlciIKKyAgICBjYXNlICdtJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZXRob2QiLCA1KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbNjBdOwkgLy8gIm1ldGhvZCIKKyAgICBjYXNlICdyJzoJIC8vIDMgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChOYW1lWzFdICE9ICdlJykKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbMl0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnbSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAiYXJrIiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1s4M107CSAvLyAicmVtYXJrIgorICAgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAidWx0IiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1s4NV07CSAvLyAicmVzdWx0IgorICAgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAidXJuIiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1s4Nl07CSAvLyAicmV0dXJuIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInRydWN0IiwgNSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzk3XTsJIC8vICJzdHJ1Y3QiCisgICAgY2FzZSAndCc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnaCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAicm93cyIsIDQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAmQ29tbWFuZHNbMTA3XTsJIC8vICJ0aHJvd3MiCisgICAgICBjYXNlICdwJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJhcmFtIiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1sxMDldOwkgLy8gInRwYXJhbSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA3OgkgLy8gMTggc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAidXRob3JzIiwgNikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzZdOwkgLy8gImF1dGhvcnMiCisgICAgY2FzZSAnYyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm9jbGFzcyIsIDYpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1sxNV07CSAvLyAiY29jbGFzcyIKKyAgICBjYXNlICdkJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZXRhaWxzIiwgNikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzI2XTsJIC8vICJkZXRhaWxzIgorICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJuZGNvZGUiLCA2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbMTddOwkgLy8gImVuZGNvZGUiCisgICAgY2FzZSAnaSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm5ncm91cCIsIDYpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1s0OF07CSAvLyAiaW5ncm91cCIKKyAgICBjYXNlICdtJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiYW5vbmx5IiwgNikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzU4XTsJIC8vICJtYW5vbmx5IgorICAgIGNhc2UgJ3InOgkgLy8gNSBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2UnOgkgLy8gNCBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgICBzd2l0Y2ggKE5hbWVbMl0pIHsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIGNhc2UgJ2wnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgImF0ZSIsIDMpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBzd2l0Y2ggKE5hbWVbNl0pIHsKKyAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICBjYXNlICdkJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgICAgcmV0dXJuICZDb21tYW5kc1s3OV07CSAvLyAicmVsYXRlZCIKKyAgICAgICAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgICAgcmV0dXJuICZDb21tYW5kc1s4MV07CSAvLyAicmVsYXRlcyIKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ20nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAiYXJrcyIsIDQpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gJkNvbW1hbmRzWzg0XTsJIC8vICJyZW1hcmtzIgorICAgICAgICBjYXNlICd0JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgInVybnMiLCA0KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuICZDb21tYW5kc1s4N107CSAvLyAicmV0dXJucyIKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImZvbmx5IiwgNSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1s4OF07CSAvLyAicnRmb25seSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2UnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgICBzd2l0Y2ggKE5hbWVbMl0pIHsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAidGlvbiIsIDQpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gJkNvbW1hbmRzWzkxXTsJIC8vICJzZWN0aW9uIgorICAgICAgICBjYXNlICdlJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgImFsc28iLCA0KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuICZDb21tYW5kc1s5NF07CSAvLyAic2VlYWxzbyIKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImJwYWdlIiwgNSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1s5OF07CSAvLyAic3VicGFnZSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ5cGVkZWYiLCA2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbMTEwXTsJIC8vICJ0eXBlZGVmIgorICAgIGNhc2UgJ3YnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJlcnNpb24iLCA2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbMTE1XTsJIC8vICJ2ZXJzaW9uIgorICAgIGNhc2UgJ3cnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJhcm5pbmciLCA2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbMTE2XTsJIC8vICJ3YXJuaW5nIgorICAgIGNhc2UgJ3gnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJtbG9ubHkiLCA2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbMTE4XTsJIC8vICJ4bWxvbmx5IgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA4OgkgLy8gMTQgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiYnN0cmFjdCIsIDcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1sxXTsJIC8vICJhYnN0cmFjdCIKKyAgICBjYXNlICdjJzoJIC8vIDMgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdhJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgc3dpdGNoIChOYW1lWzJdKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICBjYXNlICdsJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgImxiYWNrIiwgNSkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiAmQ29tbWFuZHNbMTFdOwkgLy8gImNhbGxiYWNrIgorICAgICAgICBjYXNlICd0JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgImVnb3J5IiwgNSkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiAmQ29tbWFuZHNbMTJdOwkgLy8gImNhdGVnb3J5IgorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnbyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAibnN0YW50IiwgNikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1sxOV07CSAvLyAiY29uc3RhbnQiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdkJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZWZncm91cCIsIDcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1syM107CSAvLyAiZGVmZ3JvdXAiCisgICAgY2FzZSAnZic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInVuY3Rpb24iLCA3KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbNDBdOwkgLy8gImZ1bmN0aW9uIgorICAgIGNhc2UgJ2gnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ0bWxvbmx5IiwgNykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzQ2XTsJIC8vICJodG1sb25seSIKKyAgICBjYXNlICdtJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiYWlucGFnZSIsIDcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1s1N107CSAvLyAibWFpbnBhZ2UiCisgICAgY2FzZSAnbyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInZlcmxvYWQiLCA3KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbNjddOwkgLy8gIm92ZXJsb2FkIgorICAgIGNhc2UgJ3AnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAicm8iLCAyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVszXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdwJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzQsICJlcnR5IiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1s3Nl07CSAvLyAicHJvcGVydHkiCisgICAgICBjYXNlICd0JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzQsICJvY29sIiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1s3N107CSAvLyAicHJvdG9jb2wiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZWN1cml0eSIsIDcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1s5Ml07CSAvLyAic2VjdXJpdHkiCisgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImVtcGxhdGUiLCA3KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbMTAyXTsJIC8vICJ0ZW1wbGF0ZSIKKyAgICBjYXNlICd2JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZXJiYXRpbSIsIDcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1sxMTNdOwkgLy8gInZlcmJhdGltIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA5OgkgLy8gMTEgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAidHRlbnRpb24iLCA4KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbNF07CSAvLyAiYXR0ZW50aW9uIgorICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJvcHlyaWdodCIsIDgpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1syMF07CSAvLyAiY29weXJpZ2h0IgorICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ4Y2VwdGlvbiIsIDgpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1szM107CSAvLyAiZXhjZXB0aW9uIgorICAgIGNhc2UgJ2knOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKE5hbWVbMV0gIT0gJ24nKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVsyXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICd0JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJlcmZhY2UiLCA2KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gJkNvbW1hbmRzWzUwXTsJIC8vICJpbnRlcmZhY2UiCisgICAgICBjYXNlICd2JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJhcmlhbnQiLCA2KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gJkNvbW1hbmRzWzUxXTsJIC8vICJpbnZhcmlhbnQiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdsJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiYXRleG9ubHkiLCA4KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbNTJdOwkgLy8gImxhdGV4b25seSIKKyAgICBjYXNlICduJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiYW1lc3BhY2UiLCA4KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbNjVdOwkgLy8gIm5hbWVzcGFjZSIKKyAgICBjYXNlICdvJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAid25lcnNoaXAiLCA4KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbNjhdOwkgLy8gIm93bmVyc2hpcCIKKyAgICBjYXNlICdwJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiYXJhZ3JhcGgiLCA4KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbNzFdOwkgLy8gInBhcmFncmFwaCIKKyAgICBjYXNlICd0JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZXh0YmxvY2siLCA4KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbMTA0XTsJIC8vICJ0ZXh0YmxvY2siCisgICAgY2FzZSAndyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImVha2dyb3VwIiwgOCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzExN107CSAvLyAid2Vha2dyb3VwIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAxMDoJIC8vIDExIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnLyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInRleHRibG9jayIsIDkpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1sxMDVdOwkgLy8gIi90ZXh0YmxvY2siCisgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImRkdG9ncm91cCIsIDkpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1syXTsJIC8vICJhZGR0b2dyb3VwIgorICAgIGNhc2UgJ2QnOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2UnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgICBpZiAoTmFtZVsyXSAhPSAncCcpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN3aXRjaCAoTmFtZVszXSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSAnZSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzQsICJuZGVuY3kiLCA2KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuICZDb21tYW5kc1syNF07CSAvLyAiZGVwZW5kZW5jeSIKKyAgICAgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzQsICJlY2F0ZWQiLCA2KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuICZDb21tYW5kc1syNV07CSAvLyAiZGVwcmVjYXRlZCIKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgInNjdXNzaW9uIiwgOCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1syN107CSAvLyAiZGlzY3Vzc2lvbiIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2UnOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibmQiLCAyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVszXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdtJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzQsICJhbm9ubHkiLCA2KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gJkNvbW1hbmRzWzU5XTsJIC8vICJlbmRtYW5vbmx5IgorICAgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs0LCAidGZvbmx5IiwgNikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1s4OV07CSAvLyAiZW5kcnRmb25seSIKKyAgICAgIGNhc2UgJ3gnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNCwgIm1sb25seSIsIDYpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAmQ29tbWFuZHNbMTE5XTsJIC8vICJlbmR4bWxvbmx5IgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnaCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImVhZGVyZmlsZSIsIDkpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1s0Ml07CSAvLyAiaGVhZGVyZmlsZSIKKyAgICBjYXNlICdzJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChOYW1lWzFdICE9ICd1JykKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbMl0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAic2VjdGlvbiIsIDcpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAmQ29tbWFuZHNbOTldOwkgLy8gInN1YnNlY3Rpb24iCisgICAgICBjYXNlICdwJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJlcmNsYXNzIiwgNykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1sxMDFdOwkgLy8gInN1cGVyY2xhc3MiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMTE6CSAvLyA4IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImxhc3NkZXNpZ24iLCAxMCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzE0XTsJIC8vICJjbGFzc2Rlc2lnbiIKKyAgICBjYXNlICdlJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm5kIiwgMikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbM10pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnaCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs0LCAidG1sb25seSIsIDcpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAmQ29tbWFuZHNbNDddOwkgLy8gImVuZGh0bWxvbmx5IgorICAgICAgY2FzZSAndic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs0LCAiZXJiYXRpbSIsIDcpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAmQ29tbWFuZHNbMTE0XTsJIC8vICJlbmR2ZXJiYXRpbSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2gnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJlbHBlcmNsYXNzIiwgMTApICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1s0NF07CSAvLyAiaGVscGVyY2xhc3MiCisgICAgY2FzZSAnbSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImV0aG9kZ3JvdXAiLCAxMCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzYxXTsJIC8vICJtZXRob2Rncm91cCIKKyAgICBjYXNlICdwJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZXJmb3JtYW5jZSIsIDEwKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbNzNdOwkgLy8gInBlcmZvcm1hbmNlIgorICAgIGNhc2UgJ3InOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZWxhdGUiLCA1KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVs2XSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdkJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzcsICJhbHNvIiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1s4MF07CSAvLyAicmVsYXRlZGFsc28iCisgICAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzcsICJhbHNvIiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICZDb21tYW5kc1s4Ml07CSAvLyAicmVsYXRlc2Fsc28iCisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMTI6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnZSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm5kbGF0ZXhvbmx5IiwgMTEpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICZDb21tYW5kc1s1M107CSAvLyAiZW5kbGF0ZXhvbmx5IgorICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJuc3RhbmNlc2l6ZSIsIDExKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbNDldOwkgLy8gImluc3RhbmNlc2l6ZSIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMTM6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnZic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInVuY3Rpb25ncm91cCIsIDEyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbNDFdOwkgLy8gImZ1bmN0aW9uZ3JvdXAiCisgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInVic3Vic2VjdGlvbiIsIDEyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAmQ29tbWFuZHNbMTAwXTsJIC8vICJzdWJzdWJzZWN0aW9uIgorICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJlbXBsYXRlZmllbGQiLCAxMikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gJkNvbW1hbmRzWzEwM107CSAvLyAidGVtcGxhdGVmaWVsZCIKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50Q29tbWFuZExpc3QuaW5jIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRDb21tYW5kTGlzdC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0Y2Q2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50Q29tbWFuZExpc3QuaW5jCkBAIC0wLDAgKzEsMTMxIEBACisvKj09PS0gVGFibGVHZW4nZXJhdGVkIGZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIEEgbGlzdCBvZiBjb21tYW5kcyB1c2VhYmxlIGluIGRvY3VtZW50YXRpb24gY29tbWVudHMgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZSwgZG8gbm90IGVkaXQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIENPTU1FTlRfQ09NTUFORAorIyAgZGVmaW5lIENPTU1FTlRfQ09NTUFORChOQU1FKQorI2VuZGlmCitDT01NRU5UX0NPTU1BTkQoYSkKK0NPTU1FTlRfQ09NTUFORChhYnN0cmFjdCkKK0NPTU1FTlRfQ09NTUFORChhZGR0b2dyb3VwKQorQ09NTUVOVF9DT01NQU5EKGFyZykKK0NPTU1FTlRfQ09NTUFORChhdHRlbnRpb24pCitDT01NRU5UX0NPTU1BTkQoYXV0aG9yKQorQ09NTUVOVF9DT01NQU5EKGF1dGhvcnMpCitDT01NRU5UX0NPTU1BTkQoYikKK0NPTU1FTlRfQ09NTUFORChicmllZikKK0NPTU1FTlRfQ09NTUFORChidWcpCitDT01NRU5UX0NPTU1BTkQoYykKK0NPTU1FTlRfQ09NTUFORChjYWxsYmFjaykKK0NPTU1FTlRfQ09NTUFORChjYXRlZ29yeSkKK0NPTU1FTlRfQ09NTUFORChjbGFzcykKK0NPTU1FTlRfQ09NTUFORChjbGFzc2Rlc2lnbikKK0NPTU1FTlRfQ09NTUFORChjb2NsYXNzKQorQ09NTUVOVF9DT01NQU5EKGNvZGUpCitDT01NRU5UX0NPTU1BTkQoZW5kY29kZSkKK0NPTU1FTlRfQ09NTUFORChjb25zdCkKK0NPTU1FTlRfQ09NTUFORChjb25zdGFudCkKK0NPTU1FTlRfQ09NTUFORChjb3B5cmlnaHQpCitDT01NRU5UX0NPTU1BTkQoZGF0ZSkKK0NPTU1FTlRfQ09NTUFORChkZWYpCitDT01NRU5UX0NPTU1BTkQoZGVmZ3JvdXApCitDT01NRU5UX0NPTU1BTkQoZGVwZW5kZW5jeSkKK0NPTU1FTlRfQ09NTUFORChkZXByZWNhdGVkKQorQ09NTUVOVF9DT01NQU5EKGRldGFpbHMpCitDT01NRU5UX0NPTU1BTkQoZGlzY3Vzc2lvbikKK0NPTU1FTlRfQ09NTUFORChkb3QpCitDT01NRU5UX0NPTU1BTkQoZW5kZG90KQorQ09NTUVOVF9DT01NQU5EKGUpCitDT01NRU5UX0NPTU1BTkQoZW0pCitDT01NRU5UX0NPTU1BTkQoZW51bSkKK0NPTU1FTlRfQ09NTUFORChleGNlcHRpb24pCitDT01NRU5UX0NPTU1BTkQoZmxicmFjZSkKK0NPTU1FTlRfQ09NTUFORChmcmJyYWNlKQorQ09NTUVOVF9DT01NQU5EKGZsc3F1YXJlKQorQ09NTUVOVF9DT01NQU5EKGZyc3F1YXJlKQorQ09NTUVOVF9DT01NQU5EKGZkb2xsYXIpCitDT01NRU5UX0NPTU1BTkQoZm4pCitDT01NRU5UX0NPTU1BTkQoZnVuY3Rpb24pCitDT01NRU5UX0NPTU1BTkQoZnVuY3Rpb25ncm91cCkKK0NPTU1FTlRfQ09NTUFORChoZWFkZXJmaWxlKQorQ09NTUVOVF9DT01NQU5EKGhlbHBlcikKK0NPTU1FTlRfQ09NTUFORChoZWxwZXJjbGFzcykKK0NPTU1FTlRfQ09NTUFORChoZWxwcykKK0NPTU1FTlRfQ09NTUFORChodG1sb25seSkKK0NPTU1FTlRfQ09NTUFORChlbmRodG1sb25seSkKK0NPTU1FTlRfQ09NTUFORChpbmdyb3VwKQorQ09NTUVOVF9DT01NQU5EKGluc3RhbmNlc2l6ZSkKK0NPTU1FTlRfQ09NTUFORChpbnRlcmZhY2UpCitDT01NRU5UX0NPTU1BTkQoaW52YXJpYW50KQorQ09NTUVOVF9DT01NQU5EKGxhdGV4b25seSkKK0NPTU1FTlRfQ09NTUFORChlbmRsYXRleG9ubHkpCitDT01NRU5UX0NPTU1BTkQobGkpCitDT01NRU5UX0NPTU1BTkQobGluaykKK0NPTU1FTlRfQ09NTUFORChzbGFzaGxpbmspCitDT01NRU5UX0NPTU1BTkQobWFpbnBhZ2UpCitDT01NRU5UX0NPTU1BTkQobWFub25seSkKK0NPTU1FTlRfQ09NTUFORChlbmRtYW5vbmx5KQorQ09NTUVOVF9DT01NQU5EKG1ldGhvZCkKK0NPTU1FTlRfQ09NTUFORChtZXRob2Rncm91cCkKK0NPTU1FTlRfQ09NTUFORChtc2MpCitDT01NRU5UX0NPTU1BTkQoZW5kbXNjKQorQ09NTUVOVF9DT01NQU5EKG5hbWUpCitDT01NRU5UX0NPTU1BTkQobmFtZXNwYWNlKQorQ09NTUVOVF9DT01NQU5EKG5vdGUpCitDT01NRU5UX0NPTU1BTkQob3ZlcmxvYWQpCitDT01NRU5UX0NPTU1BTkQob3duZXJzaGlwKQorQ09NTUVOVF9DT01NQU5EKHApCitDT01NRU5UX0NPTU1BTkQocGFyKQorQ09NTUVOVF9DT01NQU5EKHBhcmFncmFwaCkKK0NPTU1FTlRfQ09NTUFORChwYXJhbSkKK0NPTU1FTlRfQ09NTUFORChwZXJmb3JtYW5jZSkKK0NPTU1FTlRfQ09NTUFORChwb3N0KQorQ09NTUVOVF9DT01NQU5EKHByZSkKK0NPTU1FTlRfQ09NTUFORChwcm9wZXJ0eSkKK0NPTU1FTlRfQ09NTUFORChwcm90b2NvbCkKK0NPTU1FTlRfQ09NTUFORChyZWYpCitDT01NRU5UX0NPTU1BTkQocmVsYXRlZCkKK0NPTU1FTlRfQ09NTUFORChyZWxhdGVkYWxzbykKK0NPTU1FTlRfQ09NTUFORChyZWxhdGVzKQorQ09NTUVOVF9DT01NQU5EKHJlbGF0ZXNhbHNvKQorQ09NTUVOVF9DT01NQU5EKHJlbWFyaykKK0NPTU1FTlRfQ09NTUFORChyZW1hcmtzKQorQ09NTUVOVF9DT01NQU5EKHJlc3VsdCkKK0NPTU1FTlRfQ09NTUFORChyZXR1cm4pCitDT01NRU5UX0NPTU1BTkQocmV0dXJucykKK0NPTU1FTlRfQ09NTUFORChydGZvbmx5KQorQ09NTUVOVF9DT01NQU5EKGVuZHJ0Zm9ubHkpCitDT01NRU5UX0NPTU1BTkQoc2EpCitDT01NRU5UX0NPTU1BTkQoc2VjdGlvbikKK0NPTU1FTlRfQ09NTUFORChzZWN1cml0eSkKK0NPTU1FTlRfQ09NTUFORChzZWUpCitDT01NRU5UX0NPTU1BTkQoc2VlYWxzbykKK0NPTU1FTlRfQ09NTUFORChzaG9ydCkKK0NPTU1FTlRfQ09NTUFORChzaW5jZSkKK0NPTU1FTlRfQ09NTUFORChzdHJ1Y3QpCitDT01NRU5UX0NPTU1BTkQoc3VicGFnZSkKK0NPTU1FTlRfQ09NTUFORChzdWJzZWN0aW9uKQorQ09NTUVOVF9DT01NQU5EKHN1YnN1YnNlY3Rpb24pCitDT01NRU5UX0NPTU1BTkQoc3VwZXJjbGFzcykKK0NPTU1FTlRfQ09NTUFORCh0ZW1wbGF0ZSkKK0NPTU1FTlRfQ09NTUFORCh0ZW1wbGF0ZWZpZWxkKQorQ09NTUVOVF9DT01NQU5EKHRleHRibG9jaykKK0NPTU1FTlRfQ09NTUFORChzbGFzaHRleHRibG9jaykKK0NPTU1FTlRfQ09NTUFORCh0aHJvdykKK0NPTU1FTlRfQ09NTUFORCh0aHJvd3MpCitDT01NRU5UX0NPTU1BTkQodG9kbykKK0NPTU1FTlRfQ09NTUFORCh0cGFyYW0pCitDT01NRU5UX0NPTU1BTkQodHlwZWRlZikKK0NPTU1FTlRfQ09NTUFORCh1bmlvbikKK0NPTU1FTlRfQ09NTUFORCh2YXIpCitDT01NRU5UX0NPTU1BTkQodmVyYmF0aW0pCitDT01NRU5UX0NPTU1BTkQoZW5kdmVyYmF0aW0pCitDT01NRU5UX0NPTU1BTkQodmVyc2lvbikKK0NPTU1FTlRfQ09NTUFORCh3YXJuaW5nKQorQ09NTUVOVF9DT01NQU5EKHdlYWtncm91cCkKK0NPTU1FTlRfQ09NTUFORCh4bWxvbmx5KQorQ09NTUVOVF9DT01NQU5EKGVuZHhtbG9ubHkpCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudENvbW1hbmRUcmFpdHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50Q29tbWFuZFRyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OWYyZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudENvbW1hbmRUcmFpdHMuaApAQCAtMCwwICsxLDE4OSBAQAorLy89PT0tLS0gQ29tbWVudENvbW1hbmRUcmFpdHMuaCAtIENvbW1lbnQgY29tbWFuZCBwcm9wZXJ0aWVzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGNsYXNzIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgY29tbWVudAorLy8gIGNvbW1hbmRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9DT01NRU5UQ09NTUFORFRSQUlUU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX0NPTU1FTlRDT01NQU5EVFJBSVRTX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0NvbW1lbnRPcHRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgY29tbWVudHMgeworCisvLy8gXGJyaWVmIEluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGNvbW1hbmQuCisvLy8KKy8vLyBXaGVuIHJlb3JkZXJpbmcsIGFkZGluZyBvciByZW1vdmluZyBtZW1iZXJzIHBsZWFzZSB1cGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcKKy8vLyBUYWJsZUdlbiBiYWNrZW5kLgorc3RydWN0IENvbW1hbmRJbmZvIHsKKyAgdW5zaWduZWQgZ2V0SUQoKSBjb25zdCB7CisgICAgcmV0dXJuIElEOworICB9CisKKyAgY29uc3QgY2hhciAqTmFtZTsKKworICAvLy8gTmFtZSBvZiB0aGUgY29tbWFuZCB0aGF0IGVuZHMgdGhlIHZlcmJhdGltIGJsb2NrLgorICBjb25zdCBjaGFyICpFbmRDb21tYW5kTmFtZTsKKworICAvLy8gRFJZIGRlZmluaXRpb24gb2YgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgZm9yIGEgY29tbWFuZCBJRC4KKyAgZW51bSB7IE51bUNvbW1hbmRJREJpdHMgPSAyMCB9OworCisgIC8vLyBUaGUgSUQgb2YgdGhlIGNvbW1hbmQuCisgIHVuc2lnbmVkIElEIDogTnVtQ29tbWFuZElEQml0czsKKworICAvLy8gTnVtYmVyIG9mIHdvcmQtbGlrZSBhcmd1bWVudHMgZm9yIGEgZ2l2ZW4gYmxvY2sgY29tbWFuZCwgZXhjZXB0IGZvcgorICAvLy8gXFxwYXJhbSBhbmQgXFx0cGFyYW0gY29tbWFuZHMgLS0gdGhlc2UgaGF2ZSBzcGVjaWFsIGFyZ3VtZW50IHBhcnNlcnMuCisgIHVuc2lnbmVkIE51bUFyZ3MgOiA0OworCisgIC8vLyBUcnVlIGlmIHRoaXMgY29tbWFuZCBpcyBhIGlubGluZSBjb21tYW5kIChvZiBhbnkga2luZCkuCisgIHVuc2lnbmVkIElzSW5saW5lQ29tbWFuZCA6IDE7CisKKyAgLy8vIFRydWUgaWYgdGhpcyBjb21tYW5kIGlzIGEgYmxvY2sgY29tbWFuZCAob2YgYW55IGtpbmQpLgorICB1bnNpZ25lZCBJc0Jsb2NrQ29tbWFuZCA6IDE7CisKKyAgLy8vIFRydWUgaWYgdGhpcyBjb21tYW5kIGlzIGludHJvZHVjaW5nIGEgYnJpZWYgZG9jdW1lbnRhdGlvbgorICAvLy8gcGFyYWdyYXBoIChcXGJyaWVmIG9yIGFuIGFsaWFzKS4KKyAgdW5zaWduZWQgSXNCcmllZkNvbW1hbmQgOiAxOworCisgIC8vLyBUcnVlIGlmIHRoaXMgY29tbWFuZCBpcyBcXHJldHVybnMgb3IgYW4gYWxpYXMuCisgIHVuc2lnbmVkIElzUmV0dXJuc0NvbW1hbmQgOiAxOworCisgIC8vLyBUcnVlIGlmIHRoaXMgY29tbWFuZCBpcyBpbnRyb2R1Y2luZyBkb2N1bWVudGF0aW9uIGZvciBhIGZ1bmN0aW9uCisgIC8vLyBwYXJhbWV0ZXIgKFxccGFyYW0gb3IgYW4gYWxpYXMpLgorICB1bnNpZ25lZCBJc1BhcmFtQ29tbWFuZCA6IDE7CisKKyAgLy8vIFRydWUgaWYgdGhpcyBjb21tYW5kIGlzIGludHJvZHVjaW5nIGRvY3VtZW50YXRpb24gZm9yCisgIC8vLyBhIHRlbXBsYXRlIHBhcmFtZXRlciAoXFx0cGFyYW0gb3IgYW4gYWxpYXMpLgorICB1bnNpZ25lZCBJc1RQYXJhbUNvbW1hbmQgOiAxOworCisgIC8vLyBUcnVlIGlmIHRoaXMgY29tbWFuZCBpcyBcXHRocm93cyBvciBhbiBhbGlhcy4KKyAgdW5zaWduZWQgSXNUaHJvd3NDb21tYW5kIDogMTsKKworICAvLy8gVHJ1ZSBpZiB0aGlzIGNvbW1hbmQgaXMgXFxkZXByZWNhdGVkIG9yIGFuIGFsaWFzLgorICB1bnNpZ25lZCBJc0RlcHJlY2F0ZWRDb21tYW5kIDogMTsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBpcyBhIFxcaGVhZGVyZmlsZS1saWtlIGNvbW1hbmQuCisgIHVuc2lnbmVkIElzSGVhZGVyZmlsZUNvbW1hbmQgOiAxOworCisgIC8vLyBUcnVlIGlmIHdlIGRvbid0IHdhbnQgdG8gd2FybiBhYm91dCB0aGlzIGNvbW1hbmQgYmVpbmcgcGFzc2VkIGFuIGVtcHR5CisgIC8vLyBwYXJhZ3JhcGguICBNZWFuaW5nZnVsIG9ubHkgZm9yIGJsb2NrIGNvbW1hbmRzLgorICB1bnNpZ25lZCBJc0VtcHR5UGFyYWdyYXBoQWxsb3dlZCA6IDE7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgY29tbWFuZCBpcyBhIHZlcmJhdGltLWxpa2UgYmxvY2sgY29tbWFuZC4KKyAgLy8vCisgIC8vLyBBIHZlcmJhdGltLWxpa2UgYmxvY2sgY29tbWFuZCBlYXRzIGV2ZXJ5IGNoYXJhY3RlciAoZXhjZXB0IGxpbmUgc3RhcnRpbmcKKyAgLy8vIGRlY29yYXRpb25zKSB1bnRpbCBtYXRjaGluZyBlbmQgY29tbWFuZCBpcyBzZWVuIG9yIGNvbW1lbnQgZW5kIGlzIGhpdC4KKyAgdW5zaWduZWQgSXNWZXJiYXRpbUJsb2NrQ29tbWFuZCA6IDE7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgY29tbWFuZCBpcyBhbiBlbmQgY29tbWFuZCBmb3IgYSB2ZXJiYXRpbS1saWtlIGJsb2NrLgorICB1bnNpZ25lZCBJc1ZlcmJhdGltQmxvY2tFbmRDb21tYW5kIDogMTsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBjb21tYW5kIGlzIGEgdmVyYmF0aW0gbGluZSBjb21tYW5kLgorICAvLy8KKyAgLy8vIEEgdmVyYmF0aW0tbGlrZSBsaW5lIGNvbW1hbmQgZWF0cyBldmVyeXRoaW5nIHVudGlsIGEgbmV3bGluZSBpcyBzZWVuIG9yCisgIC8vLyBjb21tZW50IGVuZCBpcyBoaXQuCisgIHVuc2lnbmVkIElzVmVyYmF0aW1MaW5lQ29tbWFuZCA6IDE7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgY29tbWFuZCBjb250YWlucyBhIGRlY2xhcmF0aW9uIGZvciB0aGUgZW50aXR5IGJlaW5nCisgIC8vLyBkb2N1bWVudGVkLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlOgorICAvLy8gXGNvZGUKKyAgLy8vICAgXGZuIHZvaWQgZihpbnQgYSk7CisgIC8vLyBcZW5kY29kZQorICB1bnNpZ25lZCBJc0RlY2xhcmF0aW9uQ29tbWFuZCA6IDE7CisgIAorICAvLy8gXGJyaWVmIFRydWUgaWYgdmVyYmF0aW0tbGlrZSBsaW5lIGNvbW1hbmQgaXMgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KKyAgdW5zaWduZWQgSXNGdW5jdGlvbkRlY2xhcmF0aW9uQ29tbWFuZCA6IDE7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIGJsb2NrIGNvbW1hbmQgaXMgZnVydGhlciBkZXNjcmliaW5nIGEgY29udGFpbmVyIEFQSTsgc3VjaAorICAvLy8gYXMgXEBjb2NsYXNzLCBcQGNsYXNzZGVzaWduLCBldGMuCisgIHVuc2lnbmVkIElzUmVjb3JkTGlrZURldGFpbENvbW1hbmQgOiAxOworICAKKyAgLy8vIFxicmllZiBUcnVlIGlmIGJsb2NrIGNvbW1hbmQgaXMgYSBjb250YWluZXIgQVBJOyBzdWNoIGFzIFxAaW50ZXJmYWNlLgorICB1bnNpZ25lZCBJc1JlY29yZExpa2VEZWNsYXJhdGlvbkNvbW1hbmQgOiAxOworICAKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgY29tbWFuZCBpcyB1bmtub3duLiAgVGhpcyBcYyBDb21tYW5kSW5mbyBvYmplY3Qgd2FzCisgIC8vLyBjcmVhdGVkIGR1cmluZyBwYXJzaW5nLgorICB1bnNpZ25lZCBJc1Vua25vd25Db21tYW5kIDogMTsKK307CisKKy8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGNvbW1hbmRzIHRoYXQgY2FuIGJlIHVzZWQKKy8vLyBpbiBjb21tZW50cy4KK2NsYXNzIENvbW1hbmRUcmFpdHMgeworcHVibGljOgorICBlbnVtIEtub3duQ29tbWFuZElEcyB7CisjZGVmaW5lIENPTU1FTlRfQ09NTUFORChOQU1FKSBLQ0lfIyNOQU1FLAorI2luY2x1ZGUgImNsYW5nL0FTVC9Db21tZW50Q29tbWFuZExpc3QuaW5jIgorI3VuZGVmIENPTU1FTlRfQ09NTUFORAorICAgIEtDSV9MYXN0CisgIH07CisKKyAgQ29tbWFuZFRyYWl0cyhsbHZtOjpCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgY29uc3QgQ29tbWVudE9wdGlvbnMgJkNvbW1lbnRPcHRpb25zKTsKKworICB2b2lkIHJlZ2lzdGVyQ29tbWVudE9wdGlvbnMoY29uc3QgQ29tbWVudE9wdGlvbnMgJkNvbW1lbnRPcHRpb25zKTsKKworICAvLy8gXHJldHVybnMgYSBDb21tYW5kSW5mbyBvYmplY3QgZm9yIGEgZ2l2ZW4gY29tbWFuZCBuYW1lIG9yCisgIC8vLyBOVUxMIGlmIG5vIENvbW1hbmRJbmZvIG9iamVjdCBleGlzdHMgZm9yIHRoaXMgY29tbWFuZC4KKyAgY29uc3QgQ29tbWFuZEluZm8gKmdldENvbW1hbmRJbmZvT3JOVUxMKFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKworICBjb25zdCBDb21tYW5kSW5mbyAqZ2V0Q29tbWFuZEluZm8oU3RyaW5nUmVmIE5hbWUpIGNvbnN0IHsKKyAgICBpZiAoY29uc3QgQ29tbWFuZEluZm8gKkluZm8gPSBnZXRDb21tYW5kSW5mb09yTlVMTChOYW1lKSkKKyAgICAgIHJldHVybiBJbmZvOworICAgIGxsdm1fdW5yZWFjaGFibGUoInRoZSBjb21tYW5kIHNob3VsZCBiZSBrbm93biIpOworICB9CisKKyAgY29uc3QgQ29tbWFuZEluZm8gKmdldFR5cG9Db3JyZWN0Q29tbWFuZEluZm8oU3RyaW5nUmVmIFR5cG8pIGNvbnN0OworICAKKyAgY29uc3QgQ29tbWFuZEluZm8gKmdldENvbW1hbmRJbmZvKHVuc2lnbmVkIENvbW1hbmRJRCkgY29uc3Q7CisKKyAgY29uc3QgQ29tbWFuZEluZm8gKnJlZ2lzdGVyVW5rbm93bkNvbW1hbmQoU3RyaW5nUmVmIENvbW1hbmROYW1lKTsKKworICBjb25zdCBDb21tYW5kSW5mbyAqcmVnaXN0ZXJCbG9ja0NvbW1hbmQoU3RyaW5nUmVmIENvbW1hbmROYW1lKTsKKworICAvLy8gXHJldHVybnMgYSBDb21tYW5kSW5mbyBvYmplY3QgZm9yIGEgZ2l2ZW4gY29tbWFuZCBuYW1lIG9yCisgIC8vLyBOVUxMIGlmIFxjIE5hbWUgaXMgbm90IGEgYnVpbHRpbiBjb21tYW5kLgorICBzdGF0aWMgY29uc3QgQ29tbWFuZEluZm8gKmdldEJ1aWx0aW5Db21tYW5kSW5mbyhTdHJpbmdSZWYgTmFtZSk7CisKKyAgLy8vIFxyZXR1cm5zIGEgQ29tbWFuZEluZm8gb2JqZWN0IGZvciBhIGdpdmVuIGNvbW1hbmQgSUQgb3IKKyAgLy8vIE5VTEwgaWYgXGMgQ29tbWFuZElEIGlzIG5vdCBhIGJ1aWx0aW4gY29tbWFuZC4KKyAgc3RhdGljIGNvbnN0IENvbW1hbmRJbmZvICpnZXRCdWlsdGluQ29tbWFuZEluZm8odW5zaWduZWQgQ29tbWFuZElEKTsKKworcHJpdmF0ZToKKyAgQ29tbWFuZFRyYWl0cyhjb25zdCBDb21tYW5kVHJhaXRzICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBDb21tYW5kVHJhaXRzICYpID0gZGVsZXRlOworCisgIGNvbnN0IENvbW1hbmRJbmZvICpnZXRSZWdpc3RlcmVkQ29tbWFuZEluZm8oU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworICBjb25zdCBDb21tYW5kSW5mbyAqZ2V0UmVnaXN0ZXJlZENvbW1hbmRJbmZvKHVuc2lnbmVkIENvbW1hbmRJRCkgY29uc3Q7CisKKyAgQ29tbWFuZEluZm8gKmNyZWF0ZUNvbW1hbmRJbmZvV2l0aE5hbWUoU3RyaW5nUmVmIENvbW1hbmROYW1lKTsKKworICB1bnNpZ25lZCBOZXh0SUQ7CisKKyAgLy8vIEFsbG9jYXRvciBmb3IgQ29tbWFuZEluZm8gb2JqZWN0cy4KKyAgbGx2bTo6QnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yOworCisgIFNtYWxsVmVjdG9yPENvbW1hbmRJbmZvICosIDQ+IFJlZ2lzdGVyZWRDb21tYW5kczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb21tZW50cworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudERpYWdub3N0aWMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50RGlhZ25vc3RpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYTIwOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudERpYWdub3N0aWMuaApAQCAtMCwwICsxLDI5IEBACisvLz09PS0tLSBDb21tZW50RGlhZ25vc3RpYy5oIC0gRGlhZ25vc3RpY3MgZm9yIHRoZSBBU1QgbGlicmFyeSAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0NPTU1FTlRESUFHTk9TVElDX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfQ09NTUVOVERJQUdOT1NUSUNfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworICBuYW1lc3BhY2UgZGlhZyB7CisgICAgZW51bSB7CisjZGVmaW5lIERJQUcoRU5VTSxGTEFHUyxERUZBVUxUX01BUFBJTkcsREVTQyxHUk9VUCxcCisgICAgICAgICAgICAgU0ZJTkFFLE5PV0VSUk9SLFNIT1dJTlNZU0hFQURFUixDQVRFR09SWSkgRU5VTSwKKyNkZWZpbmUgQ09NTUVOVFNUQVJUCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0NvbW1lbnRLaW5kcy5pbmMiCisjdW5kZWYgRElBRworICAgICAgTlVNX0JVSUxUSU5fQ09NTUVOVF9ESUFHTk9TVElDUworICAgIH07CisgIH0gIC8vIGVuZCBuYW1lc3BhY2UgZGlhZworfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRIVE1MTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2VzLmluYyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50SFRNTE5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlcy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwZDE1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50SFRNTE5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlcy5pbmMKQEAgLTAsMCArMSw4MTUgQEAKKy8qPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogSFRNTCBuYW1lZCBjaGFyYWN0ZXIgcmVmZXJlbmNlIHRvIFVURi04IHRyYW5zbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLCBkbyBub3QgZWRpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKK1N0cmluZ1JlZiB0cmFuc2xhdGVIVE1MTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2VUb1VURjgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSkgeworICBzd2l0Y2ggKE5hbWUuc2l6ZSgpKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIDI6CSAvLyAxNSBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ0cnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ1QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIHJldHVybiAiXHgzZSI7CSAvLyAiR1QiCisgICAgICBjYXNlICd0JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICByZXR1cm4gIlx4M2UiOwkgLy8gIkd0IgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnTCc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnVCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgcmV0dXJuICJceDNjIjsJIC8vICJMVCIKKyAgICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIHJldHVybiAiXHgzYyI7CSAvLyAiTHQiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdQJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKE5hbWVbMV0gIT0gJ2knKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjZVx4YTAiOwkgLy8gIlBpIgorICAgIGNhc2UgJ1gnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAoTmFtZVsxXSAhPSAnaScpCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGNlXHg5ZSI7CSAvLyAiWGkiCisgICAgY2FzZSAnZyc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnZSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgcmV0dXJuICJceGUyXHg4OVx4YTUiOwkgLy8gImdlIgorICAgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgcmV0dXJuICJceDNlIjsJIC8vICJndCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2wnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIHJldHVybiAiXHhlMlx4ODlceGE0IjsJIC8vICJsZSIKKyAgICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIHJldHVybiAiXHgzYyI7CSAvLyAibHQiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdtJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKE5hbWVbMV0gIT0gJ3UnKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjZVx4YmMiOwkgLy8gIm11IgorICAgIGNhc2UgJ24nOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIHJldHVybiAiXHhlMlx4ODlceGEwIjsJIC8vICJuZSIKKyAgICAgIGNhc2UgJ3UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIHJldHVybiAiXHhjZVx4YmQiOwkgLy8gIm51IgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChOYW1lWzFdICE9ICdpJykKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gIlx4Y2ZceDgwIjsJIC8vICJwaSIKKyAgICBjYXNlICd4JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKE5hbWVbMV0gIT0gJ2knKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjZVx4YmUiOwkgLy8gInhpIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAzOgkgLy8gMTYgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdBJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiTVAiLCAyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHgyNiI7CSAvLyAiQU1QIgorICAgIGNhc2UgJ1AnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2gnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChOYW1lWzJdICE9ICdpJykKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGNlXHhhNiI7CSAvLyAiUGhpIgorICAgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKE5hbWVbMl0gIT0gJ2knKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4Y2VceGE4IjsJIC8vICJQc2kiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdSJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiRUciLCAyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjMlx4YWUiOwkgLy8gIlJFRyIKKyAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibXAiLCAyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHgyNiI7CSAvLyAiYW1wIgorICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJoaSIsIDIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGNmXHg4NyI7CSAvLyAiY2hpIgorICAgIGNhc2UgJ2QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJlZyIsIDIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGMyXHhiMCI7CSAvLyAiZGVnIgorICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ0YSIsIDIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGNlXHhiNyI7CSAvLyAiZXRhIgorICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJudCIsIDIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGUyXHg4OFx4YWIiOwkgLy8gImludCIKKyAgICBjYXNlICdwJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdoJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAoTmFtZVsyXSAhPSAnaScpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjZlx4ODYiOwkgLy8gInBoaSIKKyAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChOYW1lWzJdICE9ICdpJykKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGNmXHg4OCI7CSAvLyAicHNpIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncic6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnZSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKE5hbWVbMl0gIT0gJ2cnKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4YzJceGFlIjsJIC8vICJyZWciCisgICAgICBjYXNlICdoJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAoTmFtZVsyXSAhPSAnbycpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjZlx4ODEiOwkgLy8gInJobyIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChOYW1lWzJdICE9ICdtJykKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGUyXHg4OFx4YmMiOwkgLy8gInNpbSIKKyAgICAgIGNhc2UgJ3UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChOYW1lWzJdICE9ICdtJykKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGUyXHg4OFx4OTEiOwkgLy8gInN1bSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJhdSIsIDIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGNmXHg4NCI7CSAvLyAidGF1IgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA0OgkgLy8gMzAgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdBJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAidW1sIiwgMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gIlx4YzNceDg0IjsJIC8vICJBdW1sIgorICAgIGNhc2UgJ0MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJPUFkiLCAzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjMlx4YTkiOwkgLy8gIkNPUFkiCisgICAgY2FzZSAnRSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInVtbCIsIDMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGMzXHg4YiI7CSAvLyAiRXVtbCIKKyAgICBjYXNlICdJJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAidW1sIiwgMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gIlx4YzNceDhmIjsJIC8vICJJdW1sIgorICAgIGNhc2UgJ08nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ1bWwiLCAzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjM1x4OTYiOwkgLy8gIk91bWwiCisgICAgY2FzZSAnUSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIlVPVCIsIDMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceDIyIjsJIC8vICJRVU9UIgorICAgIGNhc2UgJ1UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ1bWwiLCAzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjM1x4OWMiOwkgLy8gIlV1bWwiCisgICAgY2FzZSAnWSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInVtbCIsIDMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGM1XHhiOCI7CSAvLyAiWXVtbCIKKyAgICBjYXNlICdhJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdwJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJvcyIsIDIpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHgyNyI7CSAvLyAiYXBvcyIKKyAgICAgIGNhc2UgJ3UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgIm1sIiwgMikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGMzXHhhNCI7CSAvLyAiYXVtbCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJldGEiLCAzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjZVx4YjIiOwkgLy8gImJldGEiCisgICAgY2FzZSAnYyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm9weSIsIDMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGMyXHhhOSI7CSAvLyAiY29weSIKKyAgICBjYXNlICdlJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAidW1sIiwgMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gIlx4YzNceGFiIjsJIC8vICJldW1sIgorICAgIGNhc2UgJ2knOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgInRhIiwgMikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGNlXHhiOSI7CSAvLyAiaW90YSIKKyAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImluIiwgMikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGUyXHg4OFx4ODgiOwkgLy8gImlzaW4iCisgICAgICBjYXNlICd1JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJtbCIsIDIpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjM1x4YWYiOwkgLy8gIml1bWwiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdsJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiYXJyIiwgMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gIlx4ZTJceDg2XHg5MCI7CSAvLyAibGFyciIKKyAgICBjYXNlICduJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiYnNwIiwgMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gIlx4YzJceGEwIjsJIC8vICJuYnNwIgorICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ1bWwiLCAzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjM1x4YjYiOwkgLy8gIm91bWwiCisgICAgY2FzZSAncCc6CSAvLyA0IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAicnQiLCAyKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4ZTJceDg4XHg4MiI7CSAvLyAicGFydCIKKyAgICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgInJwIiwgMikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGUyXHg4YVx4YTUiOwkgLy8gInBlcnAiCisgICAgICBjYXNlICdyJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgaWYgKE5hbWVbMl0gIT0gJ28nKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBzd2l0Y2ggKE5hbWVbM10pIHsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIGNhc2UgJ2QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgcmV0dXJuICJceGUyXHg4OFx4OGYiOwkgLy8gInByb2QiCisgICAgICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgcmV0dXJuICJceGUyXHg4OFx4OWQiOwkgLy8gInByb3AiCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdxJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAidW90IiwgMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gIlx4MjIiOwkgLy8gInF1b3QiCisgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImFyciIsIDMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGUyXHg4Nlx4OTIiOwkgLy8gInJhcnIiCisgICAgY2FzZSAncyc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnZCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAib3QiLCAyKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4ZTJceDhiXHg4NSI7CSAvLyAic2RvdCIKKyAgICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImN0IiwgMikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGMyXHhhNyI7CSAvLyAic2VjdCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ1bWwiLCAzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjM1x4YmMiOwkgLy8gInV1bWwiCisgICAgY2FzZSAneSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInVtbCIsIDMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGMzXHhiZiI7CSAvLyAieXVtbCIKKyAgICBjYXNlICd6JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZXRhIiwgMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gIlx4Y2VceGI2IjsJIC8vICJ6ZXRhIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA1OgkgLy8gNDggc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdBJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdjJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJpcmMiLCAzKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4YzNceDgyIjsJIC8vICJBY2lyYyIKKyAgICAgIGNhc2UgJ3InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImluZyIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjM1x4ODUiOwkgLy8gIkFyaW5nIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnRCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImVsdGEiLCA0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjZVx4OTQiOwkgLy8gIkRlbHRhIgorICAgIGNhc2UgJ0UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJjaXJjIiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gIlx4YzNceDhhIjsJIC8vICJFY2lyYyIKKyAgICBjYXNlICdHJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiYW1tYSIsIDQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGNlXHg5MyI7CSAvLyAiR2FtbWEiCisgICAgY2FzZSAnSSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImNpcmMiLCA0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjM1x4OGUiOwkgLy8gIkljaXJjIgorICAgIGNhc2UgJ08nOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImlyYyIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjM1x4OTQiOwkgLy8gIk9jaXJjIgorICAgICAgY2FzZSAnbSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiZWdhIiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGNlXHhhOSI7CSAvLyAiT21lZ2EiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdQJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAicmltZSIsIDQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGUyXHg4MFx4YjMiOwkgLy8gIlByaW1lIgorICAgIGNhc2UgJ1MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJpZ21hIiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gIlx4Y2VceGEzIjsJIC8vICJTaWdtYSIKKyAgICBjYXNlICdUJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdSJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJBREUiLCAzKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4ZTJceDg0XHhhMiI7CSAvLyAiVFJBREUiCisgICAgICBjYXNlICdoJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJldGEiLCAzKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4Y2VceDk4IjsJIC8vICJUaGV0YSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJjaXJjIiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gIlx4YzNceDliIjsJIC8vICJVY2lyYyIKKyAgICBjYXNlICdZJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiY2lyYyIsIDQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGM1XHhiNiI7CSAvLyAiWWNpcmMiCisgICAgY2FzZSAnYSc6CSAvLyA0IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiaXJjIiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGMzXHhhMiI7CSAvLyAiYWNpcmMiCisgICAgICBjYXNlICdsJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJwaGEiLCAzKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4Y2VceGIxIjsJIC8vICJhbHBoYSIKKyAgICAgIGNhc2UgJ3InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImluZyIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjM1x4YTUiOwkgLy8gImFyaW5nIgorICAgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAieW1wIiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGUyXHg4OVx4ODgiOwkgLy8gImFzeW1wIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnZCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImVsdGEiLCA0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjZVx4YjQiOwkgLy8gImRlbHRhIgorICAgIGNhc2UgJ2UnOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImlyYyIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjM1x4YWEiOwkgLy8gImVjaXJjIgorICAgICAgY2FzZSAnbSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAicHR5IiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGUyXHg4OFx4ODUiOwkgLy8gImVtcHR5IgorICAgICAgY2FzZSAncSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAidWl2IiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGUyXHg4OVx4YTEiOwkgLy8gImVxdWl2IgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnZyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImFtbWEiLCA0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjZVx4YjMiOwkgLy8gImdhbW1hIgorICAgIGNhc2UgJ2knOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImlyYyIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjM1x4YWUiOwkgLy8gImljaXJjIgorICAgICAgY2FzZSAnbic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiZmluIiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGUyXHg4OFx4OWUiOwkgLy8gImluZmluIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnayc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImFwcGEiLCA0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjZVx4YmEiOwkgLy8gImthcHBhIgorICAgIGNhc2UgJ2wnOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImVpbCIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhlMlx4OGNceDg4IjsJIC8vICJsY2VpbCIKKyAgICAgIGNhc2UgJ2QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgInF1byIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhlMlx4ODBceDljIjsJIC8vICJsZHF1byIKKyAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgInF1byIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhlMlx4ODBceDk4IjsJIC8vICJsc3F1byIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ20nOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImFzaCIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhlMlx4ODBceDk0IjsJIC8vICJtZGFzaCIKKyAgICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgIm51cyIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhlMlx4ODhceDkyIjsJIC8vICJtaW51cyIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ24nOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImJsYSIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhlMlx4ODhceDg3IjsJIC8vICJuYWJsYSIKKyAgICAgIGNhc2UgJ2QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImFzaCIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhlMlx4ODBceDkzIjsJIC8vICJuZGFzaCIKKyAgICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgInRpbiIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhlMlx4ODhceDg5IjsJIC8vICJub3RpbiIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ28nOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImlyYyIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjM1x4YjQiOwkgLy8gIm9jaXJjIgorICAgICAgY2FzZSAnbSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiZWdhIiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGNmXHg4OSI7CSAvLyAib21lZ2EiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdwJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAicmltZSIsIDQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGUyXHg4MFx4YjIiOwkgLy8gInByaW1lIgorICAgIGNhc2UgJ3InOgkgLy8gNCBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImRpYyIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhlMlx4ODhceDlhIjsJIC8vICJyYWRpYyIKKyAgICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImVpbCIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhlMlx4OGNceDg5IjsJIC8vICJyY2VpbCIKKyAgICAgIGNhc2UgJ2QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgInF1byIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhlMlx4ODBceDlkIjsJIC8vICJyZHF1byIKKyAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgInF1byIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhlMlx4ODBceDk5IjsJIC8vICJyc3F1byIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImdtYSIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjZlx4ODMiOwkgLy8gInNpZ21hIgorICAgICAgY2FzZSAneic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAibGlnIiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGMzXHg5ZiI7CSAvLyAic3psaWciCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICd0JzoJIC8vIDMgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdoJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJldGEiLCAzKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4Y2VceGI4IjsJIC8vICJ0aGV0YSIKKyAgICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgIm1lcyIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjM1x4OTciOwkgLy8gInRpbWVzIgorICAgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiYWRlIiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGUyXHg4NFx4YTIiOwkgLy8gInRyYWRlIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAndSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImNpcmMiLCA0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjM1x4YmIiOwkgLy8gInVjaXJjIgorICAgIGNhc2UgJ3knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJjaXJjIiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gIlx4YzVceGI3IjsJIC8vICJ5Y2lyYyIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgNjoJIC8vIDM3IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnQSc6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiY3V0ZSIsIDQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjM1x4ODEiOwkgLy8gIkFhY3V0ZSIKKyAgICAgIGNhc2UgJ2cnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgInJhdmUiLCA0KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4YzNceDgwIjsJIC8vICJBZ3JhdmUiCisgICAgICBjYXNlICd0JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJpbGRlIiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGMzXHg4MyI7CSAvLyAiQXRpbGRlIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnQyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImNlZGlsIiwgNSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gIlx4YzNceDg3IjsJIC8vICJDY2VkaWwiCisgICAgY2FzZSAnRSc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiY3V0ZSIsIDQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjM1x4ODkiOwkgLy8gIkVhY3V0ZSIKKyAgICAgIGNhc2UgJ2cnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgInJhdmUiLCA0KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4YzNceDg4IjsJIC8vICJFZ3JhdmUiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdJJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJjdXRlIiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGMzXHg4ZCI7CSAvLyAiSWFjdXRlIgorICAgICAgY2FzZSAnZyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAicmF2ZSIsIDQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjM1x4OGMiOwkgLy8gIklncmF2ZSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0wnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJhbWJkYSIsIDUpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGNlXHg5YiI7CSAvLyAiTGFtYmRhIgorICAgIGNhc2UgJ04nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ0aWxkZSIsIDUpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGMzXHg5MSI7CSAvLyAiTnRpbGRlIgorICAgIGNhc2UgJ08nOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImN1dGUiLCA0KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4YzNceDkzIjsJIC8vICJPYWN1dGUiCisgICAgICBjYXNlICdnJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJyYXZlIiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGMzXHg5MiI7CSAvLyAiT2dyYXZlIgorICAgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiaWxkZSIsIDQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjM1x4OTUiOwkgLy8gIk90aWxkZSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1UnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImN1dGUiLCA0KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4YzNceDlhIjsJIC8vICJVYWN1dGUiCisgICAgICBjYXNlICdnJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJyYXZlIiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGMzXHg5OSI7CSAvLyAiVWdyYXZlIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnWSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImFjdXRlIiwgNSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gIlx4YzNceDlkIjsJIC8vICJZYWN1dGUiCisgICAgY2FzZSAnYSc6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiY3V0ZSIsIDQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjM1x4YTEiOwkgLy8gImFhY3V0ZSIKKyAgICAgIGNhc2UgJ2cnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgInJhdmUiLCA0KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4YzNceGEwIjsJIC8vICJhZ3JhdmUiCisgICAgICBjYXNlICd0JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJpbGRlIiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGMzXHhhMyI7CSAvLyAiYXRpbGRlIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnYyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImNlZGlsIiwgNSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gIlx4YzNceGE3IjsJIC8vICJjY2VkaWwiCisgICAgY2FzZSAnZSc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiY3V0ZSIsIDQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjM1x4YTkiOwkgLy8gImVhY3V0ZSIKKyAgICAgIGNhc2UgJ2cnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgInJhdmUiLCA0KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4YzNceGE4IjsJIC8vICJlZ3JhdmUiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdpJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJjdXRlIiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGMzXHhhZCI7CSAvLyAiaWFjdXRlIgorICAgICAgY2FzZSAnZyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAicmF2ZSIsIDQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjM1x4YWMiOwkgLy8gImlncmF2ZSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2wnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgIm1iZGEiLCA0KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4Y2VceGJiIjsJIC8vICJsYW1iZGEiCisgICAgICBjYXNlICdmJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJsb29yIiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGUyXHg4Y1x4OGEiOwkgLy8gImxmbG9vciIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ24nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ0aWxkZSIsIDUpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGMzXHhiMSI7CSAvLyAibnRpbGRlIgorICAgIGNhc2UgJ28nOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImN1dGUiLCA0KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4YzNceGIzIjsJIC8vICJvYWN1dGUiCisgICAgICBjYXNlICdnJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJyYXZlIiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGMzXHhiMiI7CSAvLyAib2dyYXZlIgorICAgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiaWxkZSIsIDQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjM1x4YjUiOwkgLy8gIm90aWxkZSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJsdXNtbiIsIDUpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGMyXHhiMSI7CSAvLyAicGx1c21uIgorICAgIGNhc2UgJ3InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJmbG9vciIsIDUpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGUyXHg4Y1x4OGIiOwkgLy8gInJmbG9vciIKKyAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiaWdtYWYiLCA1KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjZlx4ODIiOwkgLy8gInNpZ21hZiIKKyAgICBjYXNlICd1JzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJjdXRlIiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGMzXHhiYSI7CSAvLyAidWFjdXRlIgorICAgICAgY2FzZSAnZyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAicmF2ZSIsIDQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiAiXHhjM1x4YjkiOwkgLy8gInVncmF2ZSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3knOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImN1dGUiLCA0KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gIlx4YzNceGJkIjsJIC8vICJ5YWN1dGUiCisgICAgICBjYXNlICdnJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJyYXZlIiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuICJceGUxXHhiYlx4YjMiOwkgLy8gInlncmF2ZSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA3OgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ1UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJwc2lsb24iLCA2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiAiXHhjZVx4YTUiOwkgLy8gIlVwc2lsb24iCisgICAgY2FzZSAnZSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInBzaWxvbiIsIDYpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJceGNlXHhiNSI7CSAvLyAiZXBzaWxvbiIKKyAgICBjYXNlICd1JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAicHNpbG9uIiwgNikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gIlx4Y2ZceDg1IjsJIC8vICJ1cHNpbG9uIgorICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gU3RyaW5nUmVmKCk7Cit9CisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50SFRNTFRhZ3MuaW5jIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRIVE1MVGFncy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5MjNhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50SFRNTFRhZ3MuaW5jCkBAIC0wLDAgKzEsMjI4IEBACisvKj09PS0gVGFibGVHZW4nZXJhdGVkIGZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIEhUTUwgdGFnIG5hbWUgbWF0Y2hlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZSwgZG8gbm90IGVkaXQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCitib29sIGlzSFRNTFRhZ05hbWUoU3RyaW5nUmVmIE5hbWUpIHsKKyAgc3dpdGNoIChOYW1lLnNpemUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSAxOgkgLy8gNiBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJhIgorICAgIGNhc2UgJ2InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJiIgorICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJpIgorICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJwIgorICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJzIgorICAgIGNhc2UgJ3UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJ1IgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAyOgkgLy8gMTkgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdiJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKE5hbWVbMV0gIT0gJ3InKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiB0cnVlOwkgLy8gImJyIgorICAgIGNhc2UgJ2QnOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIHJldHVybiB0cnVlOwkgLy8gImRkIgorICAgICAgY2FzZSAnbCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgcmV0dXJuIHRydWU7CSAvLyAiZGwiCisgICAgICBjYXNlICd0JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJkdCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAoTmFtZVsxXSAhPSAnbScpCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIHRydWU7CSAvLyAiZW0iCisgICAgY2FzZSAnaCc6CSAvLyA3IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnMSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgcmV0dXJuIHRydWU7CSAvLyAiaDEiCisgICAgICBjYXNlICcyJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJoMiIKKyAgICAgIGNhc2UgJzMnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIHJldHVybiB0cnVlOwkgLy8gImgzIgorICAgICAgY2FzZSAnNCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgcmV0dXJuIHRydWU7CSAvLyAiaDQiCisgICAgICBjYXNlICc1JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJoNSIKKyAgICAgIGNhc2UgJzYnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIHJldHVybiB0cnVlOwkgLy8gImg2IgorICAgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgcmV0dXJuIHRydWU7CSAvLyAiaHIiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdsJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKE5hbWVbMV0gIT0gJ2knKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiB0cnVlOwkgLy8gImxpIgorICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAoTmFtZVsxXSAhPSAnbCcpCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIHRydWU7CSAvLyAib2wiCisgICAgY2FzZSAndCc6CSAvLyA0IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnZCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgcmV0dXJuIHRydWU7CSAvLyAidGQiCisgICAgICBjYXNlICdoJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJ0aCIKKyAgICAgIGNhc2UgJ3InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIHJldHVybiB0cnVlOwkgLy8gInRyIgorICAgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgcmV0dXJuIHRydWU7CSAvLyAidHQiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICd1JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKE5hbWVbMV0gIT0gJ2wnKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiB0cnVlOwkgLy8gInVsIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAzOgkgLy8gOSBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJpZyIsIDIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIHRydWU7CSAvLyAiYmlnIgorICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJvbCIsIDIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIHRydWU7CSAvLyAiY29sIgorICAgIGNhc2UgJ2QnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChOYW1lWzJdICE9ICdsJykKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIHRydWU7CSAvLyAiZGVsIgorICAgICAgY2FzZSAnaSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKE5hbWVbMl0gIT0gJ3YnKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJkaXYiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdpJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdtJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAoTmFtZVsyXSAhPSAnZycpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiB0cnVlOwkgLy8gImltZyIKKyAgICAgIGNhc2UgJ24nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChOYW1lWzJdICE9ICdzJykKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIHRydWU7CSAvLyAiaW5zIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInJlIiwgMikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJwcmUiCisgICAgY2FzZSAncyc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAoTmFtZVsxXSAhPSAndScpCisgICAgICAgIGJyZWFrOworICAgICAgc3dpdGNoIChOYW1lWzJdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIHJldHVybiB0cnVlOwkgLy8gInN1YiIKKyAgICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIHJldHVybiB0cnVlOwkgLy8gInN1cCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA0OgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJvZGUiLCAzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiB0cnVlOwkgLy8gImNvZGUiCisgICAgY2FzZSAnZic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm9udCIsIDMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIHRydWU7CSAvLyAiZm9udCIKKyAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAicGFuIiwgMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJzcGFuIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA1OgkgLy8gNSBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJtYWxsIiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJzbWFsbCIKKyAgICBjYXNlICd0JzoJIC8vIDQgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJibGUiLCAzKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJ0YWJsZSIKKyAgICAgIGNhc2UgJ2InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgIm9keSIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiB0cnVlOwkgLy8gInRib2R5IgorICAgICAgY2FzZSAnZic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAib290IiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIHRydWU7CSAvLyAidGZvb3QiCisgICAgICBjYXNlICdoJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJlYWQiLCAzKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJ0aGVhZCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA2OgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgInN0ciIsIDMpICE9IDApCisgICAgICBicmVhazsKKyAgICBzd2l0Y2ggKE5hbWVbM10pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdpJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs0LCAia2UiLCAyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiB0cnVlOwkgLy8gInN0cmlrZSIKKyAgICBjYXNlICdvJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs0LCAibmciLCAyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiB0cnVlOwkgLy8gInN0cm9uZyIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgNzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgImNhcHRpb24iLCA3KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIHRydWU7CSAvLyAiY2FwdGlvbiIKKyAgY2FzZSA4OgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSswLCAiY29sZ3JvdXAiLCA4KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIHRydWU7CSAvLyAiY29sZ3JvdXAiCisgIGNhc2UgMTA6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJibG9ja3F1b3RlIiwgMTApICE9IDApCisgICAgICBicmVhazsKKyAgICByZXR1cm4gdHJ1ZTsJIC8vICJibG9ja3F1b3RlIgorICB9CisgIHJldHVybiBmYWxzZTsKK30KKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRIVE1MVGFnc1Byb3BlcnRpZXMuaW5jIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRIVE1MVGFnc1Byb3BlcnRpZXMuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3M2E1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudEhUTUxUYWdzUHJvcGVydGllcy5pbmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogSFRNTCB0YWcgcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLCBkbyBub3QgZWRpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKK2Jvb2wgaXNIVE1MRW5kVGFnT3B0aW9uYWwoU3RyaW5nUmVmIE5hbWUpIHsKKyAgc3dpdGNoIChOYW1lLnNpemUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSAxOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgaWYgKE5hbWVbMF0gIT0gJ3AnKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIHRydWU7CSAvLyAicCIKKyAgY2FzZSAyOgkgLy8gNiBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2QnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIHJldHVybiB0cnVlOwkgLy8gImRkIgorICAgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgcmV0dXJuIHRydWU7CSAvLyAiZHQiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdsJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKE5hbWVbMV0gIT0gJ2knKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiB0cnVlOwkgLy8gImxpIgorICAgIGNhc2UgJ3QnOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIHJldHVybiB0cnVlOwkgLy8gInRkIgorICAgICAgY2FzZSAnaCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgcmV0dXJuIHRydWU7CSAvLyAidGgiCisgICAgICBjYXNlICdyJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJ0ciIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA1OgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgIGlmIChOYW1lWzBdICE9ICd0JykKKyAgICAgIGJyZWFrOworICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJvZHkiLCAzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiB0cnVlOwkgLy8gInRib2R5IgorICAgIGNhc2UgJ2YnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJvb3QiLCAzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiB0cnVlOwkgLy8gInRmb290IgorICAgIGNhc2UgJ2gnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJlYWQiLCAzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiB0cnVlOwkgLy8gInRoZWFkIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA4OgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSswLCAiY29sZ3JvdXAiLCA4KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIHRydWU7CSAvLyAiY29sZ3JvdXAiCisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIGlzSFRNTEVuZFRhZ0ZvcmJpZGRlbihTdHJpbmdSZWYgTmFtZSkgeworICBzd2l0Y2ggKE5hbWUuc2l6ZSgpKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIDI6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChOYW1lWzFdICE9ICdyJykKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gdHJ1ZTsJIC8vICJiciIKKyAgICBjYXNlICdoJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKE5hbWVbMV0gIT0gJ3InKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiB0cnVlOwkgLy8gImhyIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAzOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJvbCIsIDIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIHRydWU7CSAvLyAiY29sIgorICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJtZyIsIDIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIHRydWU7CSAvLyAiaW1nIgorICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50TGV4ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50TGV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmIwNzU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRMZXhlci5oCkBAIC0wLDAgKzEsMzYxIEBACisvLz09PS0tLSBDb21tZW50TGV4ZXIuaCAtIExleGVyIGZvciBzdHJ1Y3R1cmVkIGNvbW1lbnRzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyBsZXhlciBmb3Igc3RydWN0dXJlZCBjb21tZW50cyBhbmQgc3VwcG9ydGluZyB0b2tlbiBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0NPTU1FTlRMRVhFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX0NPTU1FTlRMRVhFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGNvbW1lbnRzIHsKKworY2xhc3MgTGV4ZXI7CitjbGFzcyBUZXh0VG9rZW5SZXRva2VuaXplcjsKK3N0cnVjdCBDb21tYW5kSW5mbzsKK2NsYXNzIENvbW1hbmRUcmFpdHM7CisKK25hbWVzcGFjZSB0b2sgeworZW51bSBUb2tlbktpbmQgeworICBlb2YsCisgIG5ld2xpbmUsCisgIHRleHQsCisgIHVua25vd25fY29tbWFuZCwgICAvLyBDb21tYW5kIHRoYXQgZG9lcyBub3QgaGF2ZSBhbiBJRC4KKyAgYmFja3NsYXNoX2NvbW1hbmQsIC8vIENvbW1hbmQgd2l0aCBhbiBJRCwgdGhhdCB1c2VkIGJhY2tzbGFzaCBtYXJrZXIuCisgIGF0X2NvbW1hbmQsICAgICAgICAvLyBDb21tYW5kIHdpdGggYW4gSUQsIHRoYXQgdXNlZCAnYXQnIG1hcmtlci4KKyAgdmVyYmF0aW1fYmxvY2tfYmVnaW4sCisgIHZlcmJhdGltX2Jsb2NrX2xpbmUsCisgIHZlcmJhdGltX2Jsb2NrX2VuZCwKKyAgdmVyYmF0aW1fbGluZV9uYW1lLAorICB2ZXJiYXRpbV9saW5lX3RleHQsCisgIGh0bWxfc3RhcnRfdGFnLCAgICAgLy8gPHRhZworICBodG1sX2lkZW50LCAgICAgICAgIC8vIGF0dHIKKyAgaHRtbF9lcXVhbHMsICAgICAgICAvLyA9CisgIGh0bWxfcXVvdGVkX3N0cmluZywgLy8gImJsYWhcImJsYWgiIG9yICdibGFoXCdibGFoJworICBodG1sX2dyZWF0ZXIsICAgICAgIC8vID4KKyAgaHRtbF9zbGFzaF9ncmVhdGVyLCAvLyAvPgorICBodG1sX2VuZF90YWcgICAgICAgIC8vIDwvdGFnCit9OworfSAvLyBlbmQgbmFtZXNwYWNlIHRvaworCisvLy8gXGJyaWVmIENvbW1lbnQgdG9rZW4uCitjbGFzcyBUb2tlbiB7CisgIGZyaWVuZCBjbGFzcyBMZXhlcjsKKyAgZnJpZW5kIGNsYXNzIFRleHRUb2tlblJldG9rZW5pemVyOworCisgIC8vLyBUaGUgbG9jYXRpb24gb2YgdGhlIHRva2VuLgorICBTb3VyY2VMb2NhdGlvbiBMb2M7CisKKyAgLy8vIFRoZSBhY3R1YWwga2luZCBvZiB0aGUgdG9rZW4uCisgIHRvazo6VG9rZW5LaW5kIEtpbmQ7CisKKyAgLy8vIExlbmd0aCBvZiB0aGUgdG9rZW4gc3BlbGxpbmcgaW4gY29tbWVudC4gIENhbiBiZSAwIGZvciBzeW50aGVuaXplZAorICAvLy8gdG9rZW5zLgorICB1bnNpZ25lZCBMZW5ndGg7CisKKyAgLy8vIENvbnRhaW5zIHRleHQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgdG9rZW4uCisgIGNvbnN0IGNoYXIgKlRleHRQdHI7CisKKyAgLy8vIEludGVnZXIgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgdG9rZW4uCisgIC8vLworICAvLy8gSWYgdGhlIHRva2VuIGlzIGEga29ud24gY29tbWFuZCwgY29udGFpbnMgY29tbWFuZCBJRCBhbmQgVGV4dFB0ciBpcworICAvLy8gdW51c2VkIChjb21tYW5kIHNwZWxsaW5nIGNhbiBiZSBmb3VuZCB3aXRoIENvbW1hbmRUcmFpdHMpLiAgT3RoZXJ3aXNlLAorICAvLy8gY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRoYXQgc3RhcnRzIGF0IFRleHRQdHIuCisgIHVuc2lnbmVkIEludFZhbDsKKyAgCitwdWJsaWM6CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2M7IH0KKyAgdm9pZCBzZXRMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBTTCkgeyBMb2MgPSBTTDsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEVuZExvY2F0aW9uKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgaWYgKExlbmd0aCA9PSAwIHx8IExlbmd0aCA9PSAxKQorICAgICAgcmV0dXJuIExvYzsKKyAgICByZXR1cm4gTG9jLmdldExvY1dpdGhPZmZzZXQoTGVuZ3RoIC0gMSk7CisgIH0KKworICB0b2s6OlRva2VuS2luZCBnZXRLaW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBLaW5kOyB9CisgIHZvaWQgc2V0S2luZCh0b2s6OlRva2VuS2luZCBLKSB7IEtpbmQgPSBLOyB9CisKKyAgYm9vbCBpcyh0b2s6OlRva2VuS2luZCBLKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIEtpbmQgPT0gSzsgfQorICBib29sIGlzTm90KHRvazo6VG9rZW5LaW5kIEspIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gS2luZCAhPSBLOyB9CisKKyAgdW5zaWduZWQgZ2V0TGVuZ3RoKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMZW5ndGg7IH0KKyAgdm9pZCBzZXRMZW5ndGgodW5zaWduZWQgTCkgeyBMZW5ndGggPSBMOyB9CisKKyAgU3RyaW5nUmVmIGdldFRleHQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICBhc3NlcnQoaXModG9rOjp0ZXh0KSk7CisgICAgcmV0dXJuIFN0cmluZ1JlZihUZXh0UHRyLCBJbnRWYWwpOworICB9CisKKyAgdm9pZCBzZXRUZXh0KFN0cmluZ1JlZiBUZXh0KSB7CisgICAgYXNzZXJ0KGlzKHRvazo6dGV4dCkpOworICAgIFRleHRQdHIgPSBUZXh0LmRhdGEoKTsKKyAgICBJbnRWYWwgPSBUZXh0LnNpemUoKTsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRVbmtub3duQ29tbWFuZE5hbWUoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICBhc3NlcnQoaXModG9rOjp1bmtub3duX2NvbW1hbmQpKTsKKyAgICByZXR1cm4gU3RyaW5nUmVmKFRleHRQdHIsIEludFZhbCk7CisgIH0KKworICB2b2lkIHNldFVua25vd25Db21tYW5kTmFtZShTdHJpbmdSZWYgTmFtZSkgeworICAgIGFzc2VydChpcyh0b2s6OnVua25vd25fY29tbWFuZCkpOworICAgIFRleHRQdHIgPSBOYW1lLmRhdGEoKTsKKyAgICBJbnRWYWwgPSBOYW1lLnNpemUoKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldENvbW1hbmRJRCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIGFzc2VydChpcyh0b2s6OmJhY2tzbGFzaF9jb21tYW5kKSB8fCBpcyh0b2s6OmF0X2NvbW1hbmQpKTsKKyAgICByZXR1cm4gSW50VmFsOworICB9CisKKyAgdm9pZCBzZXRDb21tYW5kSUQodW5zaWduZWQgSUQpIHsKKyAgICBhc3NlcnQoaXModG9rOjpiYWNrc2xhc2hfY29tbWFuZCkgfHwgaXModG9rOjphdF9jb21tYW5kKSk7CisgICAgSW50VmFsID0gSUQ7CisgIH0KKworICB1bnNpZ25lZCBnZXRWZXJiYXRpbUJsb2NrSUQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICBhc3NlcnQoaXModG9rOjp2ZXJiYXRpbV9ibG9ja19iZWdpbikgfHwgaXModG9rOjp2ZXJiYXRpbV9ibG9ja19lbmQpKTsKKyAgICByZXR1cm4gSW50VmFsOworICB9CisKKyAgdm9pZCBzZXRWZXJiYXRpbUJsb2NrSUQodW5zaWduZWQgSUQpIHsKKyAgICBhc3NlcnQoaXModG9rOjp2ZXJiYXRpbV9ibG9ja19iZWdpbikgfHwgaXModG9rOjp2ZXJiYXRpbV9ibG9ja19lbmQpKTsKKyAgICBJbnRWYWwgPSBJRDsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRWZXJiYXRpbUJsb2NrVGV4dCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIGFzc2VydChpcyh0b2s6OnZlcmJhdGltX2Jsb2NrX2xpbmUpKTsKKyAgICByZXR1cm4gU3RyaW5nUmVmKFRleHRQdHIsIEludFZhbCk7CisgIH0KKworICB2b2lkIHNldFZlcmJhdGltQmxvY2tUZXh0KFN0cmluZ1JlZiBUZXh0KSB7CisgICAgYXNzZXJ0KGlzKHRvazo6dmVyYmF0aW1fYmxvY2tfbGluZSkpOworICAgIFRleHRQdHIgPSBUZXh0LmRhdGEoKTsKKyAgICBJbnRWYWwgPSBUZXh0LnNpemUoKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFZlcmJhdGltTGluZUlEKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgYXNzZXJ0KGlzKHRvazo6dmVyYmF0aW1fbGluZV9uYW1lKSk7CisgICAgcmV0dXJuIEludFZhbDsKKyAgfQorCisgIHZvaWQgc2V0VmVyYmF0aW1MaW5lSUQodW5zaWduZWQgSUQpIHsKKyAgICBhc3NlcnQoaXModG9rOjp2ZXJiYXRpbV9saW5lX25hbWUpKTsKKyAgICBJbnRWYWwgPSBJRDsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRWZXJiYXRpbUxpbmVUZXh0KCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgYXNzZXJ0KGlzKHRvazo6dmVyYmF0aW1fbGluZV90ZXh0KSk7CisgICAgcmV0dXJuIFN0cmluZ1JlZihUZXh0UHRyLCBJbnRWYWwpOworICB9CisKKyAgdm9pZCBzZXRWZXJiYXRpbUxpbmVUZXh0KFN0cmluZ1JlZiBUZXh0KSB7CisgICAgYXNzZXJ0KGlzKHRvazo6dmVyYmF0aW1fbGluZV90ZXh0KSk7CisgICAgVGV4dFB0ciA9IFRleHQuZGF0YSgpOworICAgIEludFZhbCA9IFRleHQuc2l6ZSgpOworICB9CisKKyAgU3RyaW5nUmVmIGdldEhUTUxUYWdTdGFydE5hbWUoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICBhc3NlcnQoaXModG9rOjpodG1sX3N0YXJ0X3RhZykpOworICAgIHJldHVybiBTdHJpbmdSZWYoVGV4dFB0ciwgSW50VmFsKTsKKyAgfQorCisgIHZvaWQgc2V0SFRNTFRhZ1N0YXJ0TmFtZShTdHJpbmdSZWYgTmFtZSkgeworICAgIGFzc2VydChpcyh0b2s6Omh0bWxfc3RhcnRfdGFnKSk7CisgICAgVGV4dFB0ciA9IE5hbWUuZGF0YSgpOworICAgIEludFZhbCA9IE5hbWUuc2l6ZSgpOworICB9CisKKyAgU3RyaW5nUmVmIGdldEhUTUxJZGVudCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIGFzc2VydChpcyh0b2s6Omh0bWxfaWRlbnQpKTsKKyAgICByZXR1cm4gU3RyaW5nUmVmKFRleHRQdHIsIEludFZhbCk7CisgIH0KKworICB2b2lkIHNldEhUTUxJZGVudChTdHJpbmdSZWYgTmFtZSkgeworICAgIGFzc2VydChpcyh0b2s6Omh0bWxfaWRlbnQpKTsKKyAgICBUZXh0UHRyID0gTmFtZS5kYXRhKCk7CisgICAgSW50VmFsID0gTmFtZS5zaXplKCk7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0SFRNTFF1b3RlZFN0cmluZygpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIGFzc2VydChpcyh0b2s6Omh0bWxfcXVvdGVkX3N0cmluZykpOworICAgIHJldHVybiBTdHJpbmdSZWYoVGV4dFB0ciwgSW50VmFsKTsKKyAgfQorCisgIHZvaWQgc2V0SFRNTFF1b3RlZFN0cmluZyhTdHJpbmdSZWYgU3RyKSB7CisgICAgYXNzZXJ0KGlzKHRvazo6aHRtbF9xdW90ZWRfc3RyaW5nKSk7CisgICAgVGV4dFB0ciA9IFN0ci5kYXRhKCk7CisgICAgSW50VmFsID0gU3RyLnNpemUoKTsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRIVE1MVGFnRW5kTmFtZSgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIGFzc2VydChpcyh0b2s6Omh0bWxfZW5kX3RhZykpOworICAgIHJldHVybiBTdHJpbmdSZWYoVGV4dFB0ciwgSW50VmFsKTsKKyAgfQorCisgIHZvaWQgc2V0SFRNTFRhZ0VuZE5hbWUoU3RyaW5nUmVmIE5hbWUpIHsKKyAgICBhc3NlcnQoaXModG9rOjpodG1sX2VuZF90YWcpKTsKKyAgICBUZXh0UHRyID0gTmFtZS5kYXRhKCk7CisgICAgSW50VmFsID0gTmFtZS5zaXplKCk7CisgIH0KKworICB2b2lkIGR1bXAoY29uc3QgTGV4ZXIgJkwsIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKSBjb25zdDsKK307CisKKy8vLyBcYnJpZWYgQ29tbWVudCBsZXhlci4KK2NsYXNzIExleGVyIHsKK3ByaXZhdGU6CisgIExleGVyKGNvbnN0IExleGVyICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBMZXhlciAmKSA9IGRlbGV0ZTsKKworICAvLy8gQWxsb2NhdG9yIGZvciBzdHJpbmdzIHRoYXQgYXJlIHNlbWFudGljIHZhbHVlcyBvZiB0b2tlbnMgYW5kIGhhdmUgdG8gYmUKKyAgLy8vIGNvbXB1dGVkIChmb3IgZXhhbXBsZSwgcmVzb2x2ZWQgZGVjaW1hbCBjaGFyYWN0ZXIgcmVmZXJlbmNlcykuCisgIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvcjsKKworICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3M7CisgIAorICBjb25zdCBDb21tYW5kVHJhaXRzICZUcmFpdHM7CisKKyAgY29uc3QgY2hhciAqY29uc3QgQnVmZmVyU3RhcnQ7CisgIGNvbnN0IGNoYXIgKmNvbnN0IEJ1ZmZlckVuZDsKKyAgU291cmNlTG9jYXRpb24gRmlsZUxvYzsKKworICBjb25zdCBjaGFyICpCdWZmZXJQdHI7CisKKyAgLy8vIE9uZSBwYXN0IGVuZCBwb2ludGVyIGZvciB0aGUgY3VycmVudCBjb21tZW50LiAgRm9yIEJDUEwgY29tbWVudHMgcG9pbnRzCisgIC8vLyB0byBuZXdsaW5lIG9yIEJ1ZmZlckVuZCwgZm9yIEMgY29tbWVudHMgcG9pbnRzIHRvIHN0YXIgaW4gJyovJy4KKyAgY29uc3QgY2hhciAqQ29tbWVudEVuZDsKKworICBlbnVtIExleGVyQ29tbWVudFN0YXRlIHsKKyAgICBMQ1NfQmVmb3JlQ29tbWVudCwKKyAgICBMQ1NfSW5zaWRlQkNQTENvbW1lbnQsCisgICAgTENTX0luc2lkZUNDb21tZW50LAorICAgIExDU19CZXR3ZWVuQ29tbWVudHMKKyAgfTsKKworICAvLy8gTG93LWxldmVsIGxleGVyIHN0YXRlLCB0cmFjayBpZiB3ZSBhcmUgaW5zaWRlIG9yIG91dHNpZGUgb2YgY29tbWVudC4KKyAgTGV4ZXJDb21tZW50U3RhdGUgQ29tbWVudFN0YXRlOworCisgIGVudW0gTGV4ZXJTdGF0ZSB7CisgICAgLy8vIExleGluZyBub3JtYWwgY29tbWVudCB0ZXh0CisgICAgTFNfTm9ybWFsLAorCisgICAgLy8vIEZpbmlzaGVkIGxleGluZyB2ZXJiYXRpbSBibG9jayBiZWdpbm5pbmcgY29tbWFuZCwgd2lsbCBsZXggZmlyc3QgYm9keQorICAgIC8vLyBsaW5lLgorICAgIExTX1ZlcmJhdGltQmxvY2tGaXJzdExpbmUsCisKKyAgICAvLy8gTGV4aW5nIHZlcmJhdGltIGJsb2NrIGJvZHkgbGluZS1ieS1saW5lLCBza2lwcGluZyBsaW5lLXN0YXJ0aW5nCisgICAgLy8vIGRlY29yYXRpb25zLgorICAgIExTX1ZlcmJhdGltQmxvY2tCb2R5LAorCisgICAgLy8vIEZpbmlzaGVkIGxleGluZyB2ZXJiYXRpbSBsaW5lIGJlZ2lubmluZyBjb21tYW5kLCB3aWxsIGxleCB0ZXh0IChvbmUKKyAgICAvLy8gbGluZSkuCisgICAgTFNfVmVyYmF0aW1MaW5lVGV4dCwKKworICAgIC8vLyBGaW5pc2hlZCBsZXhpbmcgXHZlcmJhdGltIDxUQUcgXGVuZHZlcmJhdGltIHBhcnQsIGxleGluZyB0YWcgYXR0cmlidXRlcy4KKyAgICBMU19IVE1MU3RhcnRUYWcsCisKKyAgICAvLy8gRmluaXNoZWQgbGV4aW5nIFx2ZXJiYXRpbSA8L1RBRyBcZW5kdmVyYmF0aW0gcGFydCwgbGV4aW5nICc+Jy4KKyAgICBMU19IVE1MRW5kVGFnCisgIH07CisKKyAgLy8vIEN1cnJlbnQgbGV4aW5nIG1vZGUuCisgIExleGVyU3RhdGUgU3RhdGU7CisKKyAgLy8vIElmIFN0YXRlIGlzIExTX1ZlcmJhdGltQmxvY2ssIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHZlcmJhdGltIGVuZAorICAvLy8gY29tbWFuZCwgaW5jbHVkaW5nIGNvbW1hbmQgbWFya2VyLgorICBTbWFsbFN0cmluZzwxNj4gVmVyYmF0aW1CbG9ja0VuZENvbW1hbmROYW1lOworCisgIC8vLyBHaXZlbiBhIGNoYXJhY3RlciByZWZlcmVuY2UgbmFtZSAoZS5nLiwgImx0IiksIHJldHVybiB0aGUgY2hhcmFjdGVyIHRoYXQKKyAgLy8vIGl0IHN0YW5kcyBmb3IgKGUuZy4sICI8IikuCisgIFN0cmluZ1JlZiByZXNvbHZlSFRNTE5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlKFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKworICAvLy8gR2l2ZW4gYSBVbmljb2RlIGNvZGVwb2ludCBhcyBiYXNlLTEwIGludGVnZXIsIHJldHVybiB0aGUgY2hhcmFjdGVyLgorICBTdHJpbmdSZWYgcmVzb2x2ZUhUTUxEZWNpbWFsQ2hhcmFjdGVyUmVmZXJlbmNlKFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKworICAvLy8gR2l2ZW4gYSBVbmljb2RlIGNvZGVwb2ludCBhcyBiYXNlLTE2IGludGVnZXIsIHJldHVybiB0aGUgY2hhcmFjdGVyLgorICBTdHJpbmdSZWYgcmVzb2x2ZUhUTUxIZXhDaGFyYWN0ZXJSZWZlcmVuY2UoU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworCisgIHZvaWQgZm9ybVRva2VuV2l0aENoYXJzKFRva2VuICZSZXN1bHQsIGNvbnN0IGNoYXIgKlRva0VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rOjpUb2tlbktpbmQgS2luZCk7CisKKyAgdm9pZCBmb3JtVGV4dFRva2VuKFRva2VuICZSZXN1bHQsIGNvbnN0IGNoYXIgKlRva0VuZCkgeworICAgIFN0cmluZ1JlZiBUZXh0KEJ1ZmZlclB0ciwgVG9rRW5kIC0gQnVmZmVyUHRyKTsKKyAgICBmb3JtVG9rZW5XaXRoQ2hhcnMoUmVzdWx0LCBUb2tFbmQsIHRvazo6dGV4dCk7CisgICAgUmVzdWx0LnNldFRleHQoVGV4dCk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRTb3VyY2VMb2NhdGlvbihjb25zdCBjaGFyICpMb2MpIGNvbnN0IHsKKyAgICBhc3NlcnQoTG9jID49IEJ1ZmZlclN0YXJ0ICYmIExvYyA8PSBCdWZmZXJFbmQgJiYKKyAgICAgICAgICAgIkxvY2F0aW9uIG91dCBvZiByYW5nZSBmb3IgdGhpcyBidWZmZXIhIik7CisKKyAgICBjb25zdCB1bnNpZ25lZCBDaGFyTm8gPSBMb2MgLSBCdWZmZXJTdGFydDsKKyAgICByZXR1cm4gRmlsZUxvYy5nZXRMb2NXaXRoT2Zmc2V0KENoYXJObyk7CisgIH0KKworICBEaWFnbm9zdGljQnVpbGRlciBEaWFnKFNvdXJjZUxvY2F0aW9uIExvYywgdW5zaWduZWQgRGlhZ0lEKSB7CisgICAgcmV0dXJuIERpYWdzLlJlcG9ydChMb2MsIERpYWdJRCk7CisgIH0KKworICAvLy8gRWF0IHN0cmluZyBtYXRjaGluZyByZWdleHAgXGNvZGUgXHMqXCogXGVuZGNvZGUuCisgIHZvaWQgc2tpcExpbmVTdGFydGluZ0RlY29yYXRpb25zKCk7CisKKyAgLy8vIExleCBzdHVmZiBpbnNpZGUgY29tbWVudHMuICBDb21tZW50RW5kIHNob3VsZCBiZSBzZXQgY29ycmVjdGx5LgorICB2b2lkIGxleENvbW1lbnRUZXh0KFRva2VuICZUKTsKKworICB2b2lkIHNldHVwQW5kTGV4VmVyYmF0aW1CbG9jayhUb2tlbiAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqVGV4dEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIE1hcmtlciwgY29uc3QgQ29tbWFuZEluZm8gKkluZm8pOworCisgIHZvaWQgbGV4VmVyYmF0aW1CbG9ja0ZpcnN0TGluZShUb2tlbiAmVCk7CisKKyAgdm9pZCBsZXhWZXJiYXRpbUJsb2NrQm9keShUb2tlbiAmVCk7CisKKyAgdm9pZCBzZXR1cEFuZExleFZlcmJhdGltTGluZShUb2tlbiAmVCwgY29uc3QgY2hhciAqVGV4dEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRJbmZvICpJbmZvKTsKKworICB2b2lkIGxleFZlcmJhdGltTGluZVRleHQoVG9rZW4gJlQpOworCisgIHZvaWQgbGV4SFRNTENoYXJhY3RlclJlZmVyZW5jZShUb2tlbiAmVCk7CisKKyAgdm9pZCBzZXR1cEFuZExleEhUTUxTdGFydFRhZyhUb2tlbiAmVCk7CisKKyAgdm9pZCBsZXhIVE1MU3RhcnRUYWcoVG9rZW4gJlQpOworCisgIHZvaWQgc2V0dXBBbmRMZXhIVE1MRW5kVGFnKFRva2VuICZUKTsKKworICB2b2lkIGxleEhUTUxFbmRUYWcoVG9rZW4gJlQpOworCitwdWJsaWM6CisgIExleGVyKGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvciwgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzLAorICAgICAgICBjb25zdCBDb21tYW5kVHJhaXRzICZUcmFpdHMsCisgICAgICAgIFNvdXJjZUxvY2F0aW9uIEZpbGVMb2MsCisgICAgICAgIGNvbnN0IGNoYXIgKkJ1ZmZlclN0YXJ0LCBjb25zdCBjaGFyICpCdWZmZXJFbmQpOworCisgIHZvaWQgbGV4KFRva2VuICZUKTsKKworICBTdHJpbmdSZWYgZ2V0U3BlbGxpbmcoY29uc3QgVG9rZW4gJlRvaywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNvdXJjZU1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKkludmFsaWQgPSBudWxscHRyKSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb21tZW50cworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudE5vZGVzLmluYyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50Tm9kZXMuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjA5OTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudE5vZGVzLmluYwpAQCAtMCwwICsxLDEyMyBAQAorLyo9PT0tIFRhYmxlR2VuJ2VyYXRlZCBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBMaXN0IG9mIEFTVCBub2RlcyBvZiBhIHBhcnRpY3VsYXIga2luZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGUsIGRvIG5vdCBlZGl0ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBBQlNUUkFDVF9DT01NRU5UCisjICBkZWZpbmUgQUJTVFJBQ1RfQ09NTUVOVChUeXBlKSBUeXBlCisjZW5kaWYKKyNpZm5kZWYgQ09NTUVOVF9SQU5HRQorIyAgZGVmaW5lIENPTU1FTlRfUkFOR0UoQmFzZSwgRmlyc3QsIExhc3QpCisjZW5kaWYKKworI2lmbmRlZiBMQVNUX0NPTU1FTlRfUkFOR0UKKyMgIGRlZmluZSBMQVNUX0NPTU1FTlRfUkFOR0UoQmFzZSwgRmlyc3QsIExhc3QpIENPTU1FTlRfUkFOR0UoQmFzZSwgRmlyc3QsIExhc3QpCisjZW5kaWYKKworI2lmbmRlZiBCTE9DS0NPTlRFTlRDT01NRU5UCisjICBkZWZpbmUgQkxPQ0tDT05URU5UQ09NTUVOVChUeXBlLCBCYXNlKSBDT01NRU5UKFR5cGUsIEJhc2UpCisjZW5kaWYKK0FCU1RSQUNUX0NPTU1FTlQoQkxPQ0tDT05URU5UQ09NTUVOVChCbG9ja0NvbnRlbnRDb21tZW50LCBDb21tZW50KSkKKyNpZm5kZWYgQkxPQ0tDT01NQU5EQ09NTUVOVAorIyAgZGVmaW5lIEJMT0NLQ09NTUFORENPTU1FTlQoVHlwZSwgQmFzZSkgQkxPQ0tDT05URU5UQ09NTUVOVChUeXBlLCBCYXNlKQorI2VuZGlmCitCTE9DS0NPTU1BTkRDT01NRU5UKEJsb2NrQ29tbWFuZENvbW1lbnQsIEJsb2NrQ29udGVudENvbW1lbnQpCisjaWZuZGVmIFBBUkFNQ09NTUFORENPTU1FTlQKKyMgIGRlZmluZSBQQVJBTUNPTU1BTkRDT01NRU5UKFR5cGUsIEJhc2UpIEJMT0NLQ09NTUFORENPTU1FTlQoVHlwZSwgQmFzZSkKKyNlbmRpZgorUEFSQU1DT01NQU5EQ09NTUVOVChQYXJhbUNvbW1hbmRDb21tZW50LCBCbG9ja0NvbW1hbmRDb21tZW50KQorI3VuZGVmIFBBUkFNQ09NTUFORENPTU1FTlQKKworI2lmbmRlZiBUUEFSQU1DT01NQU5EQ09NTUVOVAorIyAgZGVmaW5lIFRQQVJBTUNPTU1BTkRDT01NRU5UKFR5cGUsIEJhc2UpIEJMT0NLQ09NTUFORENPTU1FTlQoVHlwZSwgQmFzZSkKKyNlbmRpZgorVFBBUkFNQ09NTUFORENPTU1FTlQoVFBhcmFtQ29tbWFuZENvbW1lbnQsIEJsb2NrQ29tbWFuZENvbW1lbnQpCisjdW5kZWYgVFBBUkFNQ09NTUFORENPTU1FTlQKKworI2lmbmRlZiBWRVJCQVRJTUJMT0NLQ09NTUVOVAorIyAgZGVmaW5lIFZFUkJBVElNQkxPQ0tDT01NRU5UKFR5cGUsIEJhc2UpIEJMT0NLQ09NTUFORENPTU1FTlQoVHlwZSwgQmFzZSkKKyNlbmRpZgorVkVSQkFUSU1CTE9DS0NPTU1FTlQoVmVyYmF0aW1CbG9ja0NvbW1lbnQsIEJsb2NrQ29tbWFuZENvbW1lbnQpCisjdW5kZWYgVkVSQkFUSU1CTE9DS0NPTU1FTlQKKworI2lmbmRlZiBWRVJCQVRJTUxJTkVDT01NRU5UCisjICBkZWZpbmUgVkVSQkFUSU1MSU5FQ09NTUVOVChUeXBlLCBCYXNlKSBCTE9DS0NPTU1BTkRDT01NRU5UKFR5cGUsIEJhc2UpCisjZW5kaWYKK1ZFUkJBVElNTElORUNPTU1FTlQoVmVyYmF0aW1MaW5lQ29tbWVudCwgQmxvY2tDb21tYW5kQ29tbWVudCkKKyN1bmRlZiBWRVJCQVRJTUxJTkVDT01NRU5UCisKK0NPTU1FTlRfUkFOR0UoQmxvY2tDb21tYW5kQ29tbWVudCwgQmxvY2tDb21tYW5kQ29tbWVudCwgVmVyYmF0aW1MaW5lQ29tbWVudCkKKworI3VuZGVmIEJMT0NLQ09NTUFORENPTU1FTlQKKworI2lmbmRlZiBQQVJBR1JBUEhDT01NRU5UCisjICBkZWZpbmUgUEFSQUdSQVBIQ09NTUVOVChUeXBlLCBCYXNlKSBCTE9DS0NPTlRFTlRDT01NRU5UKFR5cGUsIEJhc2UpCisjZW5kaWYKK1BBUkFHUkFQSENPTU1FTlQoUGFyYWdyYXBoQ29tbWVudCwgQmxvY2tDb250ZW50Q29tbWVudCkKKyN1bmRlZiBQQVJBR1JBUEhDT01NRU5UCisKK0NPTU1FTlRfUkFOR0UoQmxvY2tDb250ZW50Q29tbWVudCwgQmxvY2tDb21tYW5kQ29tbWVudCwgUGFyYWdyYXBoQ29tbWVudCkKKworI3VuZGVmIEJMT0NLQ09OVEVOVENPTU1FTlQKKworI2lmbmRlZiBGVUxMQ09NTUVOVAorIyAgZGVmaW5lIEZVTExDT01NRU5UKFR5cGUsIEJhc2UpIENPTU1FTlQoVHlwZSwgQmFzZSkKKyNlbmRpZgorRlVMTENPTU1FTlQoRnVsbENvbW1lbnQsIENvbW1lbnQpCisjdW5kZWYgRlVMTENPTU1FTlQKKworI2lmbmRlZiBJTkxJTkVDT05URU5UQ09NTUVOVAorIyAgZGVmaW5lIElOTElORUNPTlRFTlRDT01NRU5UKFR5cGUsIEJhc2UpIENPTU1FTlQoVHlwZSwgQmFzZSkKKyNlbmRpZgorQUJTVFJBQ1RfQ09NTUVOVChJTkxJTkVDT05URU5UQ09NTUVOVChJbmxpbmVDb250ZW50Q29tbWVudCwgQ29tbWVudCkpCisjaWZuZGVmIEhUTUxUQUdDT01NRU5UCisjICBkZWZpbmUgSFRNTFRBR0NPTU1FTlQoVHlwZSwgQmFzZSkgSU5MSU5FQ09OVEVOVENPTU1FTlQoVHlwZSwgQmFzZSkKKyNlbmRpZgorQUJTVFJBQ1RfQ09NTUVOVChIVE1MVEFHQ09NTUVOVChIVE1MVGFnQ29tbWVudCwgSW5saW5lQ29udGVudENvbW1lbnQpKQorI2lmbmRlZiBIVE1MRU5EVEFHQ09NTUVOVAorIyAgZGVmaW5lIEhUTUxFTkRUQUdDT01NRU5UKFR5cGUsIEJhc2UpIEhUTUxUQUdDT01NRU5UKFR5cGUsIEJhc2UpCisjZW5kaWYKK0hUTUxFTkRUQUdDT01NRU5UKEhUTUxFbmRUYWdDb21tZW50LCBIVE1MVGFnQ29tbWVudCkKKyN1bmRlZiBIVE1MRU5EVEFHQ09NTUVOVAorCisjaWZuZGVmIEhUTUxTVEFSVFRBR0NPTU1FTlQKKyMgIGRlZmluZSBIVE1MU1RBUlRUQUdDT01NRU5UKFR5cGUsIEJhc2UpIEhUTUxUQUdDT01NRU5UKFR5cGUsIEJhc2UpCisjZW5kaWYKK0hUTUxTVEFSVFRBR0NPTU1FTlQoSFRNTFN0YXJ0VGFnQ29tbWVudCwgSFRNTFRhZ0NvbW1lbnQpCisjdW5kZWYgSFRNTFNUQVJUVEFHQ09NTUVOVAorCitDT01NRU5UX1JBTkdFKEhUTUxUYWdDb21tZW50LCBIVE1MRW5kVGFnQ29tbWVudCwgSFRNTFN0YXJ0VGFnQ29tbWVudCkKKworI3VuZGVmIEhUTUxUQUdDT01NRU5UCisKKyNpZm5kZWYgSU5MSU5FQ09NTUFORENPTU1FTlQKKyMgIGRlZmluZSBJTkxJTkVDT01NQU5EQ09NTUVOVChUeXBlLCBCYXNlKSBJTkxJTkVDT05URU5UQ09NTUVOVChUeXBlLCBCYXNlKQorI2VuZGlmCitJTkxJTkVDT01NQU5EQ09NTUVOVChJbmxpbmVDb21tYW5kQ29tbWVudCwgSW5saW5lQ29udGVudENvbW1lbnQpCisjdW5kZWYgSU5MSU5FQ09NTUFORENPTU1FTlQKKworI2lmbmRlZiBURVhUQ09NTUVOVAorIyAgZGVmaW5lIFRFWFRDT01NRU5UKFR5cGUsIEJhc2UpIElOTElORUNPTlRFTlRDT01NRU5UKFR5cGUsIEJhc2UpCisjZW5kaWYKK1RFWFRDT01NRU5UKFRleHRDb21tZW50LCBJbmxpbmVDb250ZW50Q29tbWVudCkKKyN1bmRlZiBURVhUQ09NTUVOVAorCitDT01NRU5UX1JBTkdFKElubGluZUNvbnRlbnRDb21tZW50LCBIVE1MRW5kVGFnQ29tbWVudCwgVGV4dENvbW1lbnQpCisKKyN1bmRlZiBJTkxJTkVDT05URU5UQ09NTUVOVAorCisjaWZuZGVmIFZFUkJBVElNQkxPQ0tMSU5FQ09NTUVOVAorIyAgZGVmaW5lIFZFUkJBVElNQkxPQ0tMSU5FQ09NTUVOVChUeXBlLCBCYXNlKSBDT01NRU5UKFR5cGUsIEJhc2UpCisjZW5kaWYKK1ZFUkJBVElNQkxPQ0tMSU5FQ09NTUVOVChWZXJiYXRpbUJsb2NrTGluZUNvbW1lbnQsIENvbW1lbnQpCisjdW5kZWYgVkVSQkFUSU1CTE9DS0xJTkVDT01NRU5UCisKK0xBU1RfQ09NTUVOVF9SQU5HRShDb21tZW50LCBCbG9ja0NvbW1hbmRDb21tZW50LCBWZXJiYXRpbUJsb2NrTGluZUNvbW1lbnQpCisKKyN1bmRlZiBDT01NRU5UCisjdW5kZWYgQ09NTUVOVF9SQU5HRQorI3VuZGVmIExBU1RfQ09NTUVOVF9SQU5HRQorI3VuZGVmIEFCU1RSQUNUX0NPTU1FTlQKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50UGFyc2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudFBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhODg2MjgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudFBhcnNlci5oCkBAIC0wLDAgKzEsMTIzIEBACisvLz09PS0tLSBDb21tZW50UGFyc2VyLmggLSBEb3h5Z2VuIGNvbW1lbnQgcGFyc2VyIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRG94eWdlbiBjb21tZW50IHBhcnNlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0NPTU1FTlRQQVJTRVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9DT01NRU5UUEFSU0VSX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9Db21tZW50LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0NvbW1lbnRMZXhlci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9Db21tZW50U2VtYS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CitjbGFzcyBTb3VyY2VNYW5hZ2VyOworCituYW1lc3BhY2UgY29tbWVudHMgeworY2xhc3MgQ29tbWFuZFRyYWl0czsKKworLy8vIERveHlnZW4gY29tbWVudCBwYXJzZXIuCitjbGFzcyBQYXJzZXIgeworICBQYXJzZXIoY29uc3QgUGFyc2VyICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBQYXJzZXIgJikgPSBkZWxldGU7CisKKyAgZnJpZW5kIGNsYXNzIFRleHRUb2tlblJldG9rZW5pemVyOworCisgIExleGVyICZMOworCisgIFNlbWEgJlM7CisKKyAgLy8vIEFsbG9jYXRvciBmb3IgYW55dGhpbmcgdGhhdCBnb2VzIGludG8gQVNUIG5vZGVzLgorICBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3I7CisKKyAgLy8vIFNvdXJjZSBtYW5hZ2VyIGZvciB0aGUgY29tbWVudCBiZWluZyBwYXJzZWQuCisgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNvdXJjZU1ncjsKKworICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3M7CisKKyAgRGlhZ25vc3RpY0J1aWxkZXIgRGlhZyhTb3VyY2VMb2NhdGlvbiBMb2MsIHVuc2lnbmVkIERpYWdJRCkgeworICAgIHJldHVybiBEaWFncy5SZXBvcnQoTG9jLCBEaWFnSUQpOworICB9CisKKyAgY29uc3QgQ29tbWFuZFRyYWl0cyAmVHJhaXRzOworCisgIC8vLyBDdXJyZW50IGxvb2thaGVhZCB0b2tlbi4gIFdlIGNhbiBzYWZlbHkgYXNzdW1lIHRoYXQgYWxsIHRva2VucyBhcmUgZnJvbQorICAvLy8gYSBzaW5nbGUgc291cmNlIGZpbGUuCisgIFRva2VuIFRvazsKKworICAvLy8gQSBzdGFjayBvZiBhZGRpdGlvbmFsIGxvb2thaGVhZCB0b2tlbnMuCisgIFNtYWxsVmVjdG9yPFRva2VuLCA4PiBNb3JlTEFUb2tlbnM7CisKKyAgdm9pZCBjb25zdW1lVG9rZW4oKSB7CisgICAgaWYgKE1vcmVMQVRva2Vucy5lbXB0eSgpKQorICAgICAgTC5sZXgoVG9rKTsKKyAgICBlbHNlCisgICAgICBUb2sgPSBNb3JlTEFUb2tlbnMucG9wX2JhY2tfdmFsKCk7CisgIH0KKworICB2b2lkIHB1dEJhY2soY29uc3QgVG9rZW4gJk9sZFRvaykgeworICAgIE1vcmVMQVRva2Vucy5wdXNoX2JhY2soVG9rKTsKKyAgICBUb2sgPSBPbGRUb2s7CisgIH0KKworICB2b2lkIHB1dEJhY2soQXJyYXlSZWY8VG9rZW4+IFRva3MpIHsKKyAgICBpZiAoVG9rcy5lbXB0eSgpKQorICAgICAgcmV0dXJuOworCisgICAgTW9yZUxBVG9rZW5zLnB1c2hfYmFjayhUb2spOworICAgIE1vcmVMQVRva2Vucy5hcHBlbmQoVG9rcy5yYmVnaW4oKSwgc3RkOjpwcmV2KFRva3MucmVuZCgpKSk7CisKKyAgICBUb2sgPSBUb2tzWzBdOworICB9CisKKyAgYm9vbCBpc1Rva0Jsb2NrQ29tbWFuZCgpIHsKKyAgICByZXR1cm4gKFRvay5pcyh0b2s6OmJhY2tzbGFzaF9jb21tYW5kKSB8fCBUb2suaXModG9rOjphdF9jb21tYW5kKSkgJiYKKyAgICAgICAgICAgVHJhaXRzLmdldENvbW1hbmRJbmZvKFRvay5nZXRDb21tYW5kSUQoKSktPklzQmxvY2tDb21tYW5kOworICB9CisKK3B1YmxpYzoKKyAgUGFyc2VyKExleGVyICZMLCBTZW1hICZTLCBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IsCisgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3IsIERpYWdub3N0aWNzRW5naW5lICZEaWFncywKKyAgICAgICAgIGNvbnN0IENvbW1hbmRUcmFpdHMgJlRyYWl0cyk7CisKKyAgLy8vIFBhcnNlIGFyZ3VtZW50cyBmb3IgXFxwYXJhbSBjb21tYW5kLgorICB2b2lkIHBhcnNlUGFyYW1Db21tYW5kQXJncyhQYXJhbUNvbW1hbmRDb21tZW50ICpQQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFRva2VuUmV0b2tlbml6ZXIgJlJldG9rZW5pemVyKTsKKworICAvLy8gUGFyc2UgYXJndW1lbnRzIGZvciBcXHRwYXJhbSBjb21tYW5kLgorICB2b2lkIHBhcnNlVFBhcmFtQ29tbWFuZEFyZ3MoVFBhcmFtQ29tbWFuZENvbW1lbnQgKlRQQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRUb2tlblJldG9rZW5pemVyICZSZXRva2VuaXplcik7CisKKyAgdm9pZCBwYXJzZUJsb2NrQ29tbWFuZEFyZ3MoQmxvY2tDb21tYW5kQ29tbWVudCAqQkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRUb2tlblJldG9rZW5pemVyICZSZXRva2VuaXplciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQXJncyk7CisKKyAgQmxvY2tDb21tYW5kQ29tbWVudCAqcGFyc2VCbG9ja0NvbW1hbmQoKTsKKyAgSW5saW5lQ29tbWFuZENvbW1lbnQgKnBhcnNlSW5saW5lQ29tbWFuZCgpOworCisgIEhUTUxTdGFydFRhZ0NvbW1lbnQgKnBhcnNlSFRNTFN0YXJ0VGFnKCk7CisgIEhUTUxFbmRUYWdDb21tZW50ICpwYXJzZUhUTUxFbmRUYWcoKTsKKworICBCbG9ja0NvbnRlbnRDb21tZW50ICpwYXJzZVBhcmFncmFwaE9yQmxvY2tDb21tYW5kKCk7CisKKyAgVmVyYmF0aW1CbG9ja0NvbW1lbnQgKnBhcnNlVmVyYmF0aW1CbG9jaygpOworICBWZXJiYXRpbUxpbmVDb21tZW50ICpwYXJzZVZlcmJhdGltTGluZSgpOworICBCbG9ja0NvbnRlbnRDb21tZW50ICpwYXJzZUJsb2NrQ29udGVudCgpOworICBGdWxsQ29tbWVudCAqcGFyc2VGdWxsQ29tbWVudCgpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvbW1lbnRzCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50U2VtYS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRTZW1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwZTUyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50U2VtYS5oCkBAIC0wLDAgKzEsMjU4IEBACisvLz09PS0tLSBDb21tZW50U2VtYS5oIC0gRG94eWdlbiBjb21tZW50IHNlbWFudGljIGFuYWx5c2lzIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgc2VtYW50aWMgYW5hbHlzaXMgY2xhc3MgZm9yIERveHlnZW4gY29tbWVudHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9DT01NRU5UU0VNQV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX0NPTU1FTlRTRU1BX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9Db21tZW50LmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CitjbGFzcyBEZWNsOworY2xhc3MgU291cmNlTWdyOworY2xhc3MgUHJlcHJvY2Vzc29yOworCituYW1lc3BhY2UgY29tbWVudHMgeworY2xhc3MgQ29tbWFuZFRyYWl0czsKKworY2xhc3MgU2VtYSB7CisgIFNlbWEoY29uc3QgU2VtYSAmKSA9IGRlbGV0ZTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgU2VtYSAmKSA9IGRlbGV0ZTsKKworICAvLy8gQWxsb2NhdG9yIGZvciBBU1Qgbm9kZXMuCisgIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvcjsKKworICAvLy8gU291cmNlIG1hbmFnZXIgZm9yIHRoZSBjb21tZW50IGJlaW5nIHBhcnNlZC4KKyAgY29uc3QgU291cmNlTWFuYWdlciAmU291cmNlTWdyOworCisgIERpYWdub3N0aWNzRW5naW5lICZEaWFnczsKKworICBDb21tYW5kVHJhaXRzICZUcmFpdHM7CisKKyAgY29uc3QgUHJlcHJvY2Vzc29yICpQUDsKKworICAvLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGRlY2xhcmF0aW9uIHRoaXMgY29tbWVudCBpcyBhdHRhY2hlZCB0by4KKyAgRGVjbEluZm8gKlRoaXNEZWNsSW5mbzsKKworICAvLy8gQ29tbWVudCBBU1Qgbm9kZXMgdGhhdCBjb3JyZXNwb25kIHRvIHBhcmFtZXRlciBuYW1lcyBpbgorICAvLy8gXGMgVGVtcGxhdGVQYXJhbWV0ZXJzLgorICAvLy8KKyAgLy8vIENvbnRhaW5zIGEgdmFsaWQgdmFsdWUgaWYgXGMgRGVjbEluZm8tPklzRmlsbGVkIGlzIHRydWUuCisgIGxsdm06OlN0cmluZ01hcDxUUGFyYW1Db21tYW5kQ29tbWVudCAqPiBUZW1wbGF0ZVBhcmFtZXRlckRvY3M7CisKKyAgLy8vIEFTVCBub2RlIGZvciB0aGUgXFxicmllZiBjb21tYW5kIGFuZCBpdHMgYWxpYXNlcy4KKyAgY29uc3QgQmxvY2tDb21tYW5kQ29tbWVudCAqQnJpZWZDb21tYW5kOworCisgIC8vLyBBU1Qgbm9kZSBmb3IgdGhlIFxcaGVhZGVyZmlsZSBjb21tYW5kLgorICBjb25zdCBCbG9ja0NvbW1hbmRDb21tZW50ICpIZWFkZXJmaWxlQ29tbWFuZDsKKworICBEaWFnbm9zdGljQnVpbGRlciBEaWFnKFNvdXJjZUxvY2F0aW9uIExvYywgdW5zaWduZWQgRGlhZ0lEKSB7CisgICAgcmV0dXJuIERpYWdzLlJlcG9ydChMb2MsIERpYWdJRCk7CisgIH0KKworICAvLy8gQSBzdGFjayBvZiBIVE1MIHRhZ3MgdGhhdCBhcmUgY3VycmVudGx5IG9wZW4gKG5vdCBtYXRjaGVkIHdpdGggY2xvc2luZworICAvLy8gdGFncykuCisgIFNtYWxsVmVjdG9yPEhUTUxTdGFydFRhZ0NvbW1lbnQgKiwgOD4gSFRNTE9wZW5UYWdzOworCitwdWJsaWM6CisgIFNlbWEobGx2bTo6QnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yLCBjb25zdCBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3IsCisgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzLCBDb21tYW5kVHJhaXRzICZUcmFpdHMsCisgICAgICAgY29uc3QgUHJlcHJvY2Vzc29yICpQUCk7CisKKyAgdm9pZCBzZXREZWNsKGNvbnN0IERlY2wgKkQpOworCisgIC8vLyBSZXR1cm5zIGEgY29weSBvZiBhcnJheSwgb3duZWQgYnkgU2VtYSdzIGFsbG9jYXRvci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgQXJyYXlSZWY8VD4gY29weUFycmF5KEFycmF5UmVmPFQ+IFNvdXJjZSkgeworICAgIGlmICghU291cmNlLmVtcHR5KCkpCisgICAgICByZXR1cm4gU291cmNlLmNvcHkoQWxsb2NhdG9yKTsKKyAgICByZXR1cm4gTm9uZTsKKyAgfQorCisgIFBhcmFncmFwaENvbW1lbnQgKmFjdE9uUGFyYWdyYXBoQ29tbWVudCgKKyAgICAgIEFycmF5UmVmPElubGluZUNvbnRlbnRDb21tZW50ICo+IENvbnRlbnQpOworCisgIEJsb2NrQ29tbWFuZENvbW1lbnQgKmFjdE9uQmxvY2tDb21tYW5kU3RhcnQoU291cmNlTG9jYXRpb24gTG9jQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTWFya2VyS2luZCBDb21tYW5kTWFya2VyKTsKKworICB2b2lkIGFjdE9uQmxvY2tDb21tYW5kQXJncyhCbG9ja0NvbW1hbmRDb21tZW50ICpDb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxCbG9ja0NvbW1hbmRDb21tZW50OjpBcmd1bWVudD4gQXJncyk7CisKKyAgdm9pZCBhY3RPbkJsb2NrQ29tbWFuZEZpbmlzaChCbG9ja0NvbW1hbmRDb21tZW50ICpDb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFncmFwaENvbW1lbnQgKlBhcmFncmFwaCk7CisKKyAgUGFyYW1Db21tYW5kQ29tbWVudCAqYWN0T25QYXJhbUNvbW1hbmRTdGFydChTb3VyY2VMb2NhdGlvbiBMb2NCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2NFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRNYXJrZXJLaW5kIENvbW1hbmRNYXJrZXIpOworCisgIHZvaWQgYWN0T25QYXJhbUNvbW1hbmREaXJlY3Rpb25BcmcoUGFyYW1Db21tYW5kQ29tbWVudCAqQ29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBcmdMb2NCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBcmdMb2NFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEFyZyk7CisKKyAgdm9pZCBhY3RPblBhcmFtQ29tbWFuZFBhcmFtTmFtZUFyZyhQYXJhbUNvbW1hbmRDb21tZW50ICpDb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEFyZ0xvY0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEFyZ0xvY0VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQXJnKTsKKworICB2b2lkIGFjdE9uUGFyYW1Db21tYW5kRmluaXNoKFBhcmFtQ29tbWFuZENvbW1lbnQgKkNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYWdyYXBoQ29tbWVudCAqUGFyYWdyYXBoKTsKKworICBUUGFyYW1Db21tYW5kQ29tbWVudCAqYWN0T25UUGFyYW1Db21tYW5kU3RhcnQoU291cmNlTG9jYXRpb24gTG9jQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2NFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTWFya2VyS2luZCBDb21tYW5kTWFya2VyKTsKKworICB2b2lkIGFjdE9uVFBhcmFtQ29tbWFuZFBhcmFtTmFtZUFyZyhUUGFyYW1Db21tYW5kQ29tbWVudCAqQ29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXJnTG9jQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEFyZ0xvY0VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEFyZyk7CisKKyAgdm9pZCBhY3RPblRQYXJhbUNvbW1hbmRGaW5pc2goVFBhcmFtQ29tbWFuZENvbW1lbnQgKkNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFncmFwaENvbW1lbnQgKlBhcmFncmFwaCk7CisKKyAgSW5saW5lQ29tbWFuZENvbW1lbnQgKmFjdE9uSW5saW5lQ29tbWFuZChTb3VyY2VMb2NhdGlvbiBDb21tYW5kTG9jQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQ29tbWFuZExvY0VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb21tYW5kSUQpOworCisgIElubGluZUNvbW1hbmRDb21tZW50ICphY3RPbklubGluZUNvbW1hbmQoU291cmNlTG9jYXRpb24gQ29tbWFuZExvY0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENvbW1hbmRMb2NFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEFyZ0xvY0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEFyZ0xvY0VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQXJnKTsKKworICBJbmxpbmVDb250ZW50Q29tbWVudCAqYWN0T25Vbmtub3duQ29tbWFuZChTb3VyY2VMb2NhdGlvbiBMb2NCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQ29tbWFuZE5hbWUpOworCisgIElubGluZUNvbnRlbnRDb21tZW50ICphY3RPblVua25vd25Db21tYW5kKFNvdXJjZUxvY2F0aW9uIExvY0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2NFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbW1hbmRJRCk7CisKKyAgVGV4dENvbW1lbnQgKmFjdE9uVGV4dChTb3VyY2VMb2NhdGlvbiBMb2NCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2NFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFRleHQpOworCisgIFZlcmJhdGltQmxvY2tDb21tZW50ICphY3RPblZlcmJhdGltQmxvY2tTdGFydChTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb21tYW5kSUQpOworCisgIFZlcmJhdGltQmxvY2tMaW5lQ29tbWVudCAqYWN0T25WZXJiYXRpbUJsb2NrTGluZShTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVGV4dCk7CisKKyAgdm9pZCBhY3RPblZlcmJhdGltQmxvY2tGaW5pc2goVmVyYmF0aW1CbG9ja0NvbW1lbnQgKkJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDbG9zZU5hbWVMb2NCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENsb3NlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmVyYmF0aW1CbG9ja0xpbmVDb21tZW50ICo+IExpbmVzKTsKKworICBWZXJiYXRpbUxpbmVDb21tZW50ICphY3RPblZlcmJhdGltTGluZShTb3VyY2VMb2NhdGlvbiBMb2NCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUZXh0QmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBUZXh0KTsKKworICBIVE1MU3RhcnRUYWdDb21tZW50ICphY3RPbkhUTUxTdGFydFRhZ1N0YXJ0KFNvdXJjZUxvY2F0aW9uIExvY0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBUYWdOYW1lKTsKKworICB2b2lkIGFjdE9uSFRNTFN0YXJ0VGFnRmluaXNoKEhUTUxTdGFydFRhZ0NvbW1lbnQgKlRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxIVE1MU3RhcnRUYWdDb21tZW50OjpBdHRyaWJ1dGU+IEF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEdyZWF0ZXJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1NlbGZDbG9zaW5nKTsKKworICBIVE1MRW5kVGFnQ29tbWVudCAqYWN0T25IVE1MRW5kVGFnKFNvdXJjZUxvY2F0aW9uIExvY0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvY0VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVGFnTmFtZSk7CisKKyAgRnVsbENvbW1lbnQgKmFjdE9uRnVsbENvbW1lbnQoQXJyYXlSZWY8QmxvY2tDb250ZW50Q29tbWVudCAqPiBCbG9ja3MpOworCisgIHZvaWQgY2hlY2tCbG9ja0NvbW1hbmRFbXB0eVBhcmFncmFwaChCbG9ja0NvbW1hbmRDb21tZW50ICpDb21tYW5kKTsKKworICB2b2lkIGNoZWNrUmV0dXJuc0NvbW1hbmQoY29uc3QgQmxvY2tDb21tYW5kQ29tbWVudCAqQ29tbWFuZCk7CisKKyAgLy8vIEVtaXQgZGlhZ25vc3RpY3MgYWJvdXQgZHVwbGljYXRlIGJsb2NrIGNvbW1hbmRzIHRoYXQgc2hvdWxkIGJlCisgIC8vLyB1c2VkIG9ubHkgb25jZSBwZXIgY29tbWVudCwgZS5nLiwgXFxicmllZiBhbmQgXFxyZXR1cm5zLgorICB2b2lkIGNoZWNrQmxvY2tDb21tYW5kRHVwbGljYXRlKGNvbnN0IEJsb2NrQ29tbWFuZENvbW1lbnQgKkNvbW1hbmQpOworCisgIHZvaWQgY2hlY2tEZXByZWNhdGVkQ29tbWFuZChjb25zdCBCbG9ja0NvbW1hbmRDb21tZW50ICpDb21tZW50KTsKKyAgCisgIHZvaWQgY2hlY2tGdW5jdGlvbkRlY2xWZXJiYXRpbUxpbmUoY29uc3QgQmxvY2tDb21tYW5kQ29tbWVudCAqQ29tbWVudCk7CisgIAorICB2b2lkIGNoZWNrQ29udGFpbmVyRGVjbFZlcmJhdGltTGluZShjb25zdCBCbG9ja0NvbW1hbmRDb21tZW50ICpDb21tZW50KTsKKyAgCisgIHZvaWQgY2hlY2tDb250YWluZXJEZWNsKGNvbnN0IEJsb2NrQ29tbWFuZENvbW1lbnQgKkNvbW1lbnQpOworCisgIC8vLyBSZXNvbHZlIHBhcmFtZXRlciBuYW1lcyB0byBwYXJhbWV0ZXIgaW5kZXhlcyBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KKyAgLy8vIEVtaXQgZGlhZ25vc3RpY3MgYWJvdXQgdW5rbm93biBwYXJhbWV0cnMuCisgIHZvaWQgcmVzb2x2ZVBhcmFtQ29tbWFuZEluZGV4ZXMoY29uc3QgRnVsbENvbW1lbnQgKkZDKTsKKworICBib29sIGlzRnVuY3Rpb25EZWNsKCk7CisgIGJvb2wgaXNBbnlGdW5jdGlvbkRlY2woKTsKKworICAvLy8gXHJldHVybnMgXGMgdHJ1ZSBpZiBkZWNsYXJhdGlvbiB0aGF0IHRoaXMgY29tbWVudCBpcyBhdHRhY2hlZCB0byBkZWNsYXJlcworICAvLy8gYSBmdW5jdGlvbiBwb2ludGVyLgorICBib29sIGlzRnVuY3Rpb25Qb2ludGVyVmFyRGVjbCgpOworICAvLy8gXHJldHVybnMgXGMgdHJ1ZSBpZiB0aGUgZGVjbGFyYXRpb24gdGhhdCB0aGlzIGNvbW1lbnQgaXMgYXR0YWNoZWQgdG8KKyAgLy8vIGRlY2xhcmVzIGEgdmFyaWFibGUgb3IgYSBmaWVsZCB3aG9zZSB0eXBlIGlzIGEgZnVuY3Rpb24gb3IgYSBibG9jaworICAvLy8gcG9pbnRlci4KKyAgYm9vbCBpc0Z1bmN0aW9uT3JCbG9ja1BvaW50ZXJWYXJMaWtlRGVjbCgpOworICBib29sIGlzRnVuY3Rpb25Pck1ldGhvZFZhcmlhZGljKCk7CisgIGJvb2wgaXNPYmpDTWV0aG9kRGVjbCgpOworICBib29sIGlzT2JqQ1Byb3BlcnR5RGVjbCgpOworICBib29sIGlzVGVtcGxhdGVPclNwZWNpYWxpemF0aW9uKCk7CisgIGJvb2wgaXNSZWNvcmRMaWtlRGVjbCgpOworICBib29sIGlzQ2xhc3NPclN0cnVjdERlY2woKTsKKyAgYm9vbCBpc1VuaW9uRGVjbCgpOworICBib29sIGlzT2JqQ0ludGVyZmFjZURlY2woKTsKKyAgYm9vbCBpc09iakNQcm90b2NvbERlY2woKTsKKyAgYm9vbCBpc0NsYXNzVGVtcGxhdGVEZWNsKCk7CisgIGJvb2wgaXNGdW5jdGlvblRlbXBsYXRlRGVjbCgpOworCisgIEFycmF5UmVmPGNvbnN0IFBhcm1WYXJEZWNsICo+IGdldFBhcmFtVmFycygpOworCisgIC8vLyBFeHRyYWN0IGFsbCBpbXBvcnRhbnQgc2VtYW50aWMgaW5mb3JtYXRpb24gZnJvbQorICAvLy8gXGMgVGhpc0RlY2xJbmZvLT5UaGlzRGVjbCBpbnRvIFxjIFRoaXNEZWNsSW5mbyBtZW1iZXJzLgorICB2b2lkIGluc3BlY3RUaGlzRGVjbCgpOworCisgIC8vLyBSZXR1cm5zIGluZGV4IG9mIGEgZnVuY3Rpb24gcGFyYW1ldGVyIHdpdGggYSBnaXZlbiBuYW1lLgorICB1bnNpZ25lZCByZXNvbHZlUGFybVZhclJlZmVyZW5jZShTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgUGFybVZhckRlY2wgKj4gUGFyYW1WYXJzKTsKKworICAvLy8gUmV0dXJucyBpbmRleCBvZiBhIGZ1bmN0aW9uIHBhcmFtZXRlciB3aXRoIHRoZSBuYW1lIGNsb3Nlc3QgdG8gYSBnaXZlbgorICAvLy8gdHlwby4KKyAgdW5zaWduZWQgY29ycmVjdFR5cG9JblBhcm1WYXJSZWZlcmVuY2UoU3RyaW5nUmVmIFR5cG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IFBhcm1WYXJEZWNsICo+IFBhcmFtVmFycyk7CisKKyAgYm9vbCByZXNvbHZlVFBhcmFtUmVmZXJlbmNlKFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpUZW1wbGF0ZVBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICpQb3NpdGlvbik7CisKKyAgU3RyaW5nUmVmIGNvcnJlY3RUeXBvSW5UUGFyYW1SZWZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVHlwbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqVGVtcGxhdGVQYXJhbWV0ZXJzKTsKKworICBJbmxpbmVDb21tYW5kQ29tbWVudDo6UmVuZGVyS2luZAorICBnZXRJbmxpbmVDb21tYW5kUmVuZGVyS2luZChTdHJpbmdSZWYgTmFtZSkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29tbWVudHMKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRWaXNpdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudFZpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWNjMmQwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRWaXNpdG9yLmgKQEAgLTAsMCArMSw3MCBAQAorLy89PT0tIENvbW1lbnRWaXNpdG9yLmggLSBWaXNpdG9yIGZvciBDb21tZW50IHN1YmNsYXNzZXMgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9DT01NRU5UVklTSVRPUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX0NPTU1FTlRWSVNJVE9SX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9Db21tZW50LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBjb21tZW50cyB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgbWFrZV9wdHIgeyB1c2luZyB0eXBlID0gVCAqOyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBtYWtlX2NvbnN0X3B0ciB7IHVzaW5nIHR5cGUgPSBjb25zdCBUICo7IH07CisKK3RlbXBsYXRlPHRlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgUHRyLCB0eXBlbmFtZSBJbXBsQ2xhc3MsIHR5cGVuYW1lIFJldFR5PXZvaWQ+CitjbGFzcyBDb21tZW50VmlzaXRvckJhc2UgeworcHVibGljOgorI2RlZmluZSBQVFIoQ0xBU1MpIHR5cGVuYW1lIFB0cjxDTEFTUz46OnR5cGUKKyNkZWZpbmUgRElTUEFUQ0goTkFNRSwgQ0xBU1MpIFwKKyByZXR1cm4gc3RhdGljX2Nhc3Q8SW1wbENsYXNzKj4odGhpcyktPnZpc2l0ICMjIE5BTUUoc3RhdGljX2Nhc3Q8UFRSKENMQVNTKT4oQykpCisKKyAgUmV0VHkgdmlzaXQoUFRSKENvbW1lbnQpIEMpIHsKKyAgICBpZiAoIUMpCisgICAgICByZXR1cm4gUmV0VHkoKTsKKworICAgIHN3aXRjaCAoQy0+Z2V0Q29tbWVudEtpbmQoKSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gY29tbWVudCBraW5kISIpOworI2RlZmluZSBBQlNUUkFDVF9DT01NRU5UKENPTU1FTlQpCisjZGVmaW5lIENPTU1FTlQoQ0xBU1MsIFBBUkVOVCkgXAorICAgIGNhc2UgQ29tbWVudDo6Q0xBU1MjI0tpbmQ6IERJU1BBVENIKENMQVNTLCBDTEFTUyk7CisjaW5jbHVkZSAiY2xhbmcvQVNUL0NvbW1lbnROb2Rlcy5pbmMiCisjdW5kZWYgQUJTVFJBQ1RfQ09NTUVOVAorI3VuZGVmIENPTU1FTlQKKyAgICB9CisgIH0KKworICAvLyBJZiB0aGUgZGVyaXZlZCBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQgYSBjZXJ0YWluIFZpc2l0KiBtZXRob2QsIGZhbGwgYmFjaworICAvLyBvbiBWaXNpdCogbWV0aG9kIGZvciB0aGUgc3VwZXJjbGFzcy4KKyNkZWZpbmUgQUJTVFJBQ1RfQ09NTUVOVChDT01NRU5UKSBDT01NRU5UCisjZGVmaW5lIENPTU1FTlQoQ0xBU1MsIFBBUkVOVCkgXAorICBSZXRUeSB2aXNpdCAjIyBDTEFTUyhQVFIoQ0xBU1MpIEMpIHsgRElTUEFUQ0goUEFSRU5ULCBQQVJFTlQpOyB9CisjaW5jbHVkZSAiY2xhbmcvQVNUL0NvbW1lbnROb2Rlcy5pbmMiCisjdW5kZWYgQUJTVFJBQ1RfQ09NTUVOVAorI3VuZGVmIENPTU1FTlQKKworICBSZXRUeSB2aXNpdENvbW1lbnQoUFRSKENvbW1lbnQpIEMpIHsgcmV0dXJuIFJldFR5KCk7IH0KKworI3VuZGVmIFBUUgorI3VuZGVmIERJU1BBVENICit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbXBsQ2xhc3MsIHR5cGVuYW1lIFJldFR5PXZvaWQ+CitjbGFzcyBDb21tZW50VmlzaXRvciA6CisgICAgcHVibGljIENvbW1lbnRWaXNpdG9yQmFzZTxtYWtlX3B0ciwgSW1wbENsYXNzLCBSZXRUeT4ge307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEltcGxDbGFzcywgdHlwZW5hbWUgUmV0VHk9dm9pZD4KK2NsYXNzIENvbnN0Q29tbWVudFZpc2l0b3IgOgorICAgIHB1YmxpYyBDb21tZW50VmlzaXRvckJhc2U8bWFrZV9jb25zdF9wdHIsIEltcGxDbGFzcywgUmV0VHk+IHt9OworCit9IC8vIG5hbWVzcGFjZSBjb21tZW50cworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUX0NPTU1FTlRWSVNJVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9EYXRhQ29sbGVjdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RhdGFDb2xsZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5YWMyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9EYXRhQ29sbGVjdGlvbi5oCkBAIC0wLDAgKzEsNjUgQEAKKy8vPT09LS0tIERhdGF0Q29sbGVjdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgVGhpcyBmaWxlIGRlY2xhcmVzIGhlbHBlciBtZXRob2RzIGZvciBjb2xsZWN0aW5nIGRhdGEgZnJvbSBBU1Qgbm9kZXMuCisvLy8KKy8vLyBUbyBjb2xsZWN0IGRhdGEgZnJvbSBTdG10IG5vZGVzLCBzdWJjbGFzcyBDb25zdFN0bXRWaXNpdG9yIGFuZCBpbmNsdWRlCisvLy8gU3RtdERhdGFDb2xsZWN0b3JzLmluYyBhZnRlciBkZWZpbmluZyB0aGUgbWFjcm9zIHRoYXQgeW91IG5lZWQuIFRoaXMKKy8vLyBwcm92aWRlcyBkYXRhIGNvbGxlY3Rpb24gaW1wbGVtZW50YXRpb25zIGZvciBtb3N0IFN0bXQga2luZHMuIE5vdGUKKy8vLyB0aGF0IHRoYXQgY29kZSByZXF1aXJlcyBzb21lIGNvbmRpdGlvbnMgdG8gYmUgbWV0OgorLy8vCisvLy8gICAtIFRoZXJlIG11c3QgYmUgYSBtZXRob2QgYWRkRGF0YShjb25zdCBUICZEYXRhKSB0aGF0IGFjY2VwdHMgc3RyaW5ncywKKy8vLyAgICAgaW50ZWdyYWwgdHlwZXMgYXMgd2VsbCBhcyBRdWFsVHlwZS4gQWxsIGRhdGEgaXMgZm9yd2FyZGVkIHVzaW5nCisvLy8gICAgIHRvIHRoaXMgbWV0aG9kLgorLy8vICAgLSBUaGUgQVNUQ29udGV4dCBvZiB0aGUgU3RtdCBtdXN0IGJlIGFjY2Vzc2libGUgYnkgdGhlIG5hbWUgQ29udGV4dC4KKy8vLworLy8vIEl0IGlzIGFsc28gcG9zc2libGUgdG8gb3ZlcnJpZGUgaW5kaXZpZHVhbCB2aXNpdCBtZXRob2RzLiBIYXZlIGEgbG9vayBhdAorLy8vIHRoZSBEYXRhQ29sbGVjdG9yIGluIGxpYi9BbmFseXNpcy9DbG9uZURldGVjdGlvbi5jcHAgZm9yIGEgdXNhZ2UgZXhhbXBsZS4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9EQVRBQ09MTEVDVElPTl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX0RBVEFDT0xMRUNUSU9OX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgZGF0YV9jb2xsZWN0aW9uIHsKKworLy8vIFJldHVybnMgYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIGFsbCBtYWNybyBleHBhbnNpb25zIHRoYXQgZXhwYW5kZWQgaW50byB0aGUKKy8vLyBnaXZlbiBTb3VyY2VMb2NhdGlvbi4KKy8vLworLy8vIElmICdnZXRNYWNyb1N0YWNrKEEpID09IGdldE1hY3JvU3RhY2soQiknIGlzIHRydWUsIHRoZW4gdGhlIFNvdXJjZUxvY2F0aW9ucworLy8vIEEgYW5kIEIgYXJlIGV4cGFuZGVkIGZyb20gdGhlIHNhbWUgbWFjcm9zIGluIHRoZSBzYW1lIG9yZGVyLgorc3RkOjpzdHJpbmcgZ2V0TWFjcm9TdGFjayhTb3VyY2VMb2NhdGlvbiBMb2MsIEFTVENvbnRleHQgJkNvbnRleHQpOworCisvLy8gVXRpbGl0eSBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyBhZGREYXRhKCkgZm9yIGEgY29uc3VtZXIgdGhhdCBoYXMgYQorLy8vIG1ldGhvZCB1cGRhdGUoU3RyaW5nUmVmKQordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIGFkZERhdGFUb0NvbnN1bWVyKFQgJkRhdGFDb25zdW1lciwgbGx2bTo6U3RyaW5nUmVmIFN0cikgeworICBEYXRhQ29uc3VtZXIudXBkYXRlKFN0cik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGFkZERhdGFUb0NvbnN1bWVyKFQgJkRhdGFDb25zdW1lciwgY29uc3QgUXVhbFR5cGUgJlFUKSB7CisgIGFkZERhdGFUb0NvbnN1bWVyKERhdGFDb25zdW1lciwgUVQuZ2V0QXNTdHJpbmcoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBUeXBlPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgc3RkOjppc19pbnRlZ3JhbDxUeXBlPjo6dmFsdWUgfHwgc3RkOjppc19lbnVtPFR5cGU+Ojp2YWx1ZSB8fAorICAgIHN0ZDo6aXNfY29udmVydGlibGU8VHlwZSwgc2l6ZV90Pjo6dmFsdWUgLy8gZm9yIGxsdm06Omhhc2hfY29kZQorICAgID46OnR5cGUKK2FkZERhdGFUb0NvbnN1bWVyKFQgJkRhdGFDb25zdW1lciwgVHlwZSBEYXRhKSB7CisgIERhdGFDb25zdW1lci51cGRhdGUoU3RyaW5nUmVmKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPigmRGF0YSksIHNpemVvZihEYXRhKSkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgZGF0YV9jb2xsZWN0aW9uCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUX0RBVEFDT0xMRUNUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMTY0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbC5oCkBAIC0wLDAgKzEsNDI3NiBAQAorLy89PT0tIERlY2wuaCAtIENsYXNzZXMgZm9yIHJlcHJlc2VudGluZyBkZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIERlY2wgc3ViY2xhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0RFQ0xfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9ERUNMX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BUFZhbHVlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xCYXNlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xhcmF0aW9uTmFtZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHRlcm5hbEFTVFNvdXJjZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9OZXN0ZWROYW1lU3BlY2lmaWVyLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1JlZGVjbGFyYWJsZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQWRkcmVzc1NwYWNlcy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTGlua2FnZS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZXJhdG9yS2luZHMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9QYXJ0aWFsRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1ByYWdtYUtpbmRzLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9TcGVjaWZpZXJzLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVmlzaWJpbGl0eS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FQU0ludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVHJhaWxpbmdPYmplY3RzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFTVENvbnRleHQ7CitzdHJ1Y3QgQVNUVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvOworY2xhc3MgQXR0cjsKK2NsYXNzIENvbXBvdW5kU3RtdDsKK2NsYXNzIERlcGVuZGVudEZ1bmN0aW9uVGVtcGxhdGVTcGVjaWFsaXphdGlvbkluZm87CitjbGFzcyBFbnVtRGVjbDsKK2NsYXNzIEV4cHI7CitjbGFzcyBGdW5jdGlvblRlbXBsYXRlRGVjbDsKK2NsYXNzIEZ1bmN0aW9uVGVtcGxhdGVTcGVjaWFsaXphdGlvbkluZm87CitjbGFzcyBMYWJlbFN0bXQ7CitjbGFzcyBNZW1iZXJTcGVjaWFsaXphdGlvbkluZm87CitjbGFzcyBNb2R1bGU7CitjbGFzcyBOYW1lc3BhY2VEZWNsOworY2xhc3MgUGFybVZhckRlY2w7CitjbGFzcyBSZWNvcmREZWNsOworY2xhc3MgU3RtdDsKK2NsYXNzIFN0cmluZ0xpdGVyYWw7CitjbGFzcyBUYWdEZWNsOworY2xhc3MgVGVtcGxhdGVBcmd1bWVudExpc3Q7CitjbGFzcyBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm87CitjbGFzcyBUZW1wbGF0ZVBhcmFtZXRlckxpc3Q7CitjbGFzcyBUeXBlQWxpYXNUZW1wbGF0ZURlY2w7CitjbGFzcyBUeXBlTG9jOworY2xhc3MgVW5yZXNvbHZlZFNldEltcGw7CitjbGFzcyBWYXJUZW1wbGF0ZURlY2w7CisKKy8vLyBBIGNvbnRhaW5lciBvZiB0eXBlIHNvdXJjZSBpbmZvcm1hdGlvbi4KKy8vLworLy8vIEEgY2xpZW50IGNhbiByZWFkIHRoZSByZWxldmFudCBpbmZvIHVzaW5nIFR5cGVMb2Mgd3JhcHBlcnMsIGUuZzoKKy8vLyBAY29kZQorLy8vIFR5cGVMb2MgVEwgPSBUeXBlU291cmNlSW5mby0+Z2V0VHlwZUxvYygpOworLy8vIFRMLmdldFN0YXJ0TG9jKCkucHJpbnQoT1MsIFNyY01ncik7CisvLy8gQGVuZGNvZGUKK2NsYXNzIExMVk1fQUxJR05BUyg4KSBUeXBlU291cmNlSW5mbyB7CisgIC8vIENvbnRhaW5zIGEgbWVtb3J5IGJsb2NrIGFmdGVyIHRoZSBjbGFzcywgdXNlZCBmb3IgdHlwZSBzb3VyY2UgaW5mb3JtYXRpb24sCisgIC8vIGFsbG9jYXRlZCBieSBBU1RDb250ZXh0LgorICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsKKworICBRdWFsVHlwZSBUeTsKKworICBUeXBlU291cmNlSW5mbyhRdWFsVHlwZSB0eSkgOiBUeSh0eSkge30KKworcHVibGljOgorICAvLy8gUmV0dXJuIHRoZSB0eXBlIHdyYXBwZWQgYnkgdGhpcyB0eXBlIHNvdXJjZSBpbmZvLgorICBRdWFsVHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVHk7IH0KKworICAvLy8gUmV0dXJuIHRoZSBUeXBlTG9jIHdyYXBwZXIgZm9yIHRoZSB0eXBlIHNvdXJjZSBpbmZvLgorICBUeXBlTG9jIGdldFR5cGVMb2MoKSBjb25zdDsgLy8gaW1wbGVtZW50ZWQgaW4gVHlwZUxvYy5oCisgIAorICAvLy8gT3ZlcnJpZGUgdGhlIHR5cGUgc3RvcmVkIGluIHRoaXMgVHlwZVNvdXJjZUluZm8uIFVzZSB3aXRoIGNhdXRpb24hCisgIHZvaWQgb3ZlcnJpZGVUeXBlKFF1YWxUeXBlIFQpIHsgVHkgPSBUOyB9Cit9OworCisvLy8gVGhlIHRvcCBkZWNsYXJhdGlvbiBjb250ZXh0LgorY2xhc3MgVHJhbnNsYXRpb25Vbml0RGVjbCA6IHB1YmxpYyBEZWNsLCBwdWJsaWMgRGVjbENvbnRleHQgeworICBBU1RDb250ZXh0ICZDdHg7CisKKyAgLy8vIFRoZSAobW9zdCByZWNlbnRseSBlbnRlcmVkKSBhbm9ueW1vdXMgbmFtZXNwYWNlIGZvciB0aGlzCisgIC8vLyB0cmFuc2xhdGlvbiB1bml0LCBpZiBvbmUgaGFzIGJlZW4gY3JlYXRlZC4KKyAgTmFtZXNwYWNlRGVjbCAqQW5vbnltb3VzTmFtZXNwYWNlID0gbnVsbHB0cjsKKworICBleHBsaWNpdCBUcmFuc2xhdGlvblVuaXREZWNsKEFTVENvbnRleHQgJmN0eCk7CisKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIEFTVENvbnRleHQgJmdldEFTVENvbnRleHQoKSBjb25zdCB7IHJldHVybiBDdHg7IH0KKworICBOYW1lc3BhY2VEZWNsICpnZXRBbm9ueW1vdXNOYW1lc3BhY2UoKSBjb25zdCB7IHJldHVybiBBbm9ueW1vdXNOYW1lc3BhY2U7IH0KKyAgdm9pZCBzZXRBbm9ueW1vdXNOYW1lc3BhY2UoTmFtZXNwYWNlRGVjbCAqRCkgeyBBbm9ueW1vdXNOYW1lc3BhY2UgPSBEOyB9CisKKyAgc3RhdGljIFRyYW5zbGF0aW9uVW5pdERlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDKTsKKworICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC9ldGMuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gVHJhbnNsYXRpb25Vbml0OyB9CisgIHN0YXRpYyBEZWNsQ29udGV4dCAqY2FzdFRvRGVjbENvbnRleHQoY29uc3QgVHJhbnNsYXRpb25Vbml0RGVjbCAqRCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZWNsQ29udGV4dCAqPihjb25zdF9jYXN0PFRyYW5zbGF0aW9uVW5pdERlY2wqPihEKSk7CisgIH0KKyAgc3RhdGljIFRyYW5zbGF0aW9uVW5pdERlY2wgKmNhc3RGcm9tRGVjbENvbnRleHQoY29uc3QgRGVjbENvbnRleHQgKkRDKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRyYW5zbGF0aW9uVW5pdERlY2wgKj4oY29uc3RfY2FzdDxEZWNsQ29udGV4dCo+KERDKSk7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgYCNwcmFnbWEgY29tbWVudGAgbGluZS4gQWx3YXlzIGEgY2hpbGQgb2YKKy8vLyBUcmFuc2xhdGlvblVuaXREZWNsLgorY2xhc3MgUHJhZ21hQ29tbWVudERlY2wgZmluYWwKKyAgICA6IHB1YmxpYyBEZWNsLAorICAgICAgcHJpdmF0ZSBsbHZtOjpUcmFpbGluZ09iamVjdHM8UHJhZ21hQ29tbWVudERlY2wsIGNoYXI+IHsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsV3JpdGVyOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIFByYWdtYU1TQ29tbWVudEtpbmQgQ29tbWVudEtpbmQ7CisKKyAgUHJhZ21hQ29tbWVudERlY2woVHJhbnNsYXRpb25Vbml0RGVjbCAqVFUsIFNvdXJjZUxvY2F0aW9uIENvbW1lbnRMb2MsCisgICAgICAgICAgICAgICAgICAgIFByYWdtYU1TQ29tbWVudEtpbmQgQ29tbWVudEtpbmQpCisgICAgICA6IERlY2woUHJhZ21hQ29tbWVudCwgVFUsIENvbW1lbnRMb2MpLCBDb21tZW50S2luZChDb21tZW50S2luZCkge30KKworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3B1YmxpYzoKKyAgc3RhdGljIFByYWdtYUNvbW1lbnREZWNsICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgVHJhbnNsYXRpb25Vbml0RGVjbCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENvbW1lbnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByYWdtYU1TQ29tbWVudEtpbmQgQ29tbWVudEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBBcmcpOworICBzdGF0aWMgUHJhZ21hQ29tbWVudERlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXJnU2l6ZSk7CisKKyAgUHJhZ21hTVNDb21tZW50S2luZCBnZXRDb21tZW50S2luZCgpIGNvbnN0IHsgcmV0dXJuIENvbW1lbnRLaW5kOyB9CisKKyAgU3RyaW5nUmVmIGdldEFyZygpIGNvbnN0IHsgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxjaGFyPigpOyB9CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IFByYWdtYUNvbW1lbnQ7IH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgYCNwcmFnbWEgZGV0ZWN0X21pc21hdGNoYCBsaW5lLiBBbHdheXMgYSBjaGlsZCBvZgorLy8vIFRyYW5zbGF0aW9uVW5pdERlY2wuCitjbGFzcyBQcmFnbWFEZXRlY3RNaXNtYXRjaERlY2wgZmluYWwKKyAgICA6IHB1YmxpYyBEZWNsLAorICAgICAgcHJpdmF0ZSBsbHZtOjpUcmFpbGluZ09iamVjdHM8UHJhZ21hRGV0ZWN0TWlzbWF0Y2hEZWNsLCBjaGFyPiB7CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNURGVjbFdyaXRlcjsKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKworICBzaXplX3QgVmFsdWVTdGFydDsKKworICBQcmFnbWFEZXRlY3RNaXNtYXRjaERlY2woVHJhbnNsYXRpb25Vbml0RGVjbCAqVFUsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBWYWx1ZVN0YXJ0KQorICAgICAgOiBEZWNsKFByYWdtYURldGVjdE1pc21hdGNoLCBUVSwgTG9jKSwgVmFsdWVTdGFydChWYWx1ZVN0YXJ0KSB7fQorCisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHVibGljOgorICBzdGF0aWMgUHJhZ21hRGV0ZWN0TWlzbWF0Y2hEZWNsICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uVW5pdERlY2wgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBWYWx1ZSk7CisgIHN0YXRpYyBQcmFnbWFEZXRlY3RNaXNtYXRjaERlY2wgKgorICBDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQsIHVuc2lnbmVkIE5hbWVWYWx1ZVNpemUpOworCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPGNoYXI+KCk7IH0KKyAgU3RyaW5nUmVmIGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPGNoYXI+KCkgKyBWYWx1ZVN0YXJ0OyB9CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IFByYWdtYURldGVjdE1pc21hdGNoOyB9Cit9OworCisvLy8gRGVjbGFyYXRpb24gY29udGV4dCBmb3IgbmFtZXMgZGVjbGFyZWQgYXMgZXh0ZXJuICJDIiBpbiBDKysuIFRoaXMKKy8vLyBpcyBuZWl0aGVyIHRoZSBzZW1hbnRpYyBub3IgbGV4aWNhbCBjb250ZXh0IGZvciBzdWNoIGRlY2xhcmF0aW9ucywgYnV0IGlzCisvLy8gdXNlZCB0byBjaGVjayBmb3IgY29uZmxpY3RzIHdpdGggb3RoZXIgZXh0ZXJuICJDIiBkZWNsYXJhdGlvbnMuIEV4YW1wbGU6CisvLy8KKy8vLyBcY29kZQorLy8vICAgbmFtZXNwYWNlIE4geyBleHRlcm4gIkMiIHZvaWQgZigpOyB9IC8vICMxCisvLy8gICB2b2lkIE46OmYoKSB7fSAgICAgICAgICAgICAgICAgICAgICAgLy8gIzIKKy8vLyAgIG5hbWVzcGFjZSBNIHsgZXh0ZXJuICJDIiB2b2lkIGYoKTsgfSAvLyAjMworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGUgc2VtYW50aWMgY29udGV4dCBvZiAjMSBpcyBuYW1lc3BhY2UgTiBhbmQgaXRzIGxleGljYWwgY29udGV4dCBpcyB0aGUKKy8vLyBMaW5rYWdlU3BlY0RlY2w7IHRoZSBzZW1hbnRpYyBjb250ZXh0IG9mICMyIGlzIG5hbWVzcGFjZSBOIGFuZCBpdHMgbGV4aWNhbAorLy8vIGNvbnRleHQgaXMgdGhlIFRVLiBIb3dldmVyLCBib3RoIGRlY2xhcmF0aW9ucyBhcmUgYWxzbyB2aXNpYmxlIGluIHRoZQorLy8vIGV4dGVybiAiQyIgY29udGV4dC4KKy8vLworLy8vIFRoZSBkZWNsYXJhdGlvbiBhdCAjMyBmaW5kcyBpdCBpcyBhIHJlZGVjbGFyYXRpb24gb2YgXGMgTjo6ZiB0aHJvdWdoCisvLy8gbG9va3VwIGluIHRoZSBleHRlcm4gIkMiIGNvbnRleHQuCitjbGFzcyBFeHRlcm5DQ29udGV4dERlY2wgOiBwdWJsaWMgRGVjbCwgcHVibGljIERlY2xDb250ZXh0IHsKKyAgZXhwbGljaXQgRXh0ZXJuQ0NvbnRleHREZWNsKFRyYW5zbGF0aW9uVW5pdERlY2wgKlRVKQorICAgIDogRGVjbChFeHRlcm5DQ29udGV4dCwgVFUsIFNvdXJjZUxvY2F0aW9uKCkpLAorICAgICAgRGVjbENvbnRleHQoRXh0ZXJuQ0NvbnRleHQpIHt9CisKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIHN0YXRpYyBFeHRlcm5DQ29udGV4dERlY2wgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb25Vbml0RGVjbCAqVFUpOworCisgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBFeHRlcm5DQ29udGV4dDsgfQorICBzdGF0aWMgRGVjbENvbnRleHQgKmNhc3RUb0RlY2xDb250ZXh0KGNvbnN0IEV4dGVybkNDb250ZXh0RGVjbCAqRCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZWNsQ29udGV4dCAqPihjb25zdF9jYXN0PEV4dGVybkNDb250ZXh0RGVjbCo+KEQpKTsKKyAgfQorICBzdGF0aWMgRXh0ZXJuQ0NvbnRleHREZWNsICpjYXN0RnJvbURlY2xDb250ZXh0KGNvbnN0IERlY2xDb250ZXh0ICpEQykgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxFeHRlcm5DQ29udGV4dERlY2wgKj4oY29uc3RfY2FzdDxEZWNsQ29udGV4dCo+KERDKSk7CisgIH0KK307CisKKy8vLyBUaGlzIHJlcHJlc2VudHMgYSBkZWNsIHRoYXQgbWF5IGhhdmUgYSBuYW1lLiAgTWFueSBkZWNscyBoYXZlIG5hbWVzIHN1Y2gKKy8vLyBhcyBPYmpDTWV0aG9kRGVjbCwgYnV0IG5vdCBcQGNsYXNzLCBldGMuCisvLy8KKy8vLyBOb3RlIHRoYXQgbm90IGV2ZXJ5IE5hbWVkRGVjbCBpcyBhY3R1YWxseSBuYW1lZCAoZS5nLiwgYSBzdHJ1Y3QgbWlnaHQKKy8vLyBiZSBhbm9ueW1vdXMpLCBhbmQgbm90IGV2ZXJ5IG5hbWUgaXMgYW4gaWRlbnRpZmllci4KK2NsYXNzIE5hbWVkRGVjbCA6IHB1YmxpYyBEZWNsIHsKKyAgLy8vIFRoZSBuYW1lIG9mIHRoaXMgZGVjbGFyYXRpb24sIHdoaWNoIGlzIHR5cGljYWxseSBhIG5vcm1hbAorICAvLy8gaWRlbnRpZmllciBidXQgbWF5IGFsc28gYmUgYSBzcGVjaWFsIGtpbmQgb2YgbmFtZSAoQysrCisgIC8vLyBjb25zdHJ1Y3RvciwgT2JqZWN0aXZlLUMgc2VsZWN0b3IsIGV0Yy4pCisgIERlY2xhcmF0aW9uTmFtZSBOYW1lOworCisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHJpdmF0ZToKKyAgTmFtZWREZWNsICpnZXRVbmRlcmx5aW5nRGVjbEltcGwoKSBMTFZNX1JFQURPTkxZOworCitwcm90ZWN0ZWQ6CisgIE5hbWVkRGVjbChLaW5kIERLLCBEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIEwsIERlY2xhcmF0aW9uTmFtZSBOKQorICAgICAgOiBEZWNsKERLLCBEQywgTCksIE5hbWUoTikge30KKworcHVibGljOgorICAvLy8gR2V0IHRoZSBpZGVudGlmaWVyIHRoYXQgbmFtZXMgdGhpcyBkZWNsYXJhdGlvbiwgaWYgdGhlcmUgaXMgb25lLgorICAvLy8KKyAgLy8vIFRoaXMgd2lsbCByZXR1cm4gTlVMTCBpZiB0aGlzIGRlY2xhcmF0aW9uIGhhcyBubyBuYW1lIChlLmcuLCBmb3IKKyAgLy8vIGFuIHVubmFtZWQgY2xhc3MpIG9yIGlmIHRoZSBuYW1lIGlzIGEgc3BlY2lhbCBuYW1lIChDKysgY29uc3RydWN0b3IsCisgIC8vLyBPYmplY3RpdmUtQyBzZWxlY3RvciwgZXRjLikuCisgIElkZW50aWZpZXJJbmZvICpnZXRJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gTmFtZS5nZXRBc0lkZW50aWZpZXJJbmZvKCk7IH0KKworICAvLy8gR2V0IHRoZSBuYW1lIG9mIGlkZW50aWZpZXIgZm9yIHRoaXMgZGVjbGFyYXRpb24gYXMgYSBTdHJpbmdSZWYuCisgIC8vLworICAvLy8gVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBkZWNsYXJhdGlvbiBoYXZlIGEgbmFtZSBhbmQgdGhhdCBpdCBiZSBhIHNpbXBsZQorICAvLy8gaWRlbnRpZmllci4KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7CisgICAgYXNzZXJ0KE5hbWUuaXNJZGVudGlmaWVyKCkgJiYgIk5hbWUgaXMgbm90IGEgc2ltcGxlIGlkZW50aWZpZXIiKTsKKyAgICByZXR1cm4gZ2V0SWRlbnRpZmllcigpID8gZ2V0SWRlbnRpZmllcigpLT5nZXROYW1lKCkgOiAiIjsKKyAgfQorCisgIC8vLyBHZXQgYSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciB0aGUgZGVjbGFyYXRpb24sIGV2ZW4gaWYgaXQgaXMgb25lIG9mIHRoZQorICAvLy8gc3BlY2lhbCBraW5kcyBvZiBuYW1lcyAoQysrIGNvbnN0cnVjdG9yLCBPYmplY3RpdmUtQyBzZWxlY3RvciwgZXRjKS4KKyAgLy8vCisgIC8vLyBDcmVhdGluZyB0aGlzIG5hbWUgcmVxdWlyZXMgZXhwZW5zaXZlIHN0cmluZyBtYW5pcHVsYXRpb24sIHNvIGl0IHNob3VsZAorICAvLy8gYmUgY2FsbGVkIG9ubHkgd2hlbiBwZXJmb3JtYW5jZSBkb2Vzbid0IG1hdHRlci4gRm9yIHNpbXBsZSBkZWNsYXJhdGlvbnMsCisgIC8vLyBnZXROYW1lQXNDU3RyaW5nKCkgc2hvdWxkIHN1ZmZpY2UuCisgIC8vCisgIC8vIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSByZW5hbWVkIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgbm90IGp1c3QgYW4KKyAgLy8gYWx0ZXJuYXRlIGZvcm0gb2YgZ2V0TmFtZSgpLCBhbmQgY2xpZW50cyBzaG91bGQgbW92ZSBhcyBhcHByb3ByaWF0ZS4KKyAgLy8KKyAgLy8gRklYTUU6IERlcHJlY2F0ZWQsIG1vdmUgY2xpZW50cyB0byBnZXROYW1lKCkuCisgIHN0ZDo6c3RyaW5nIGdldE5hbWVBc1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIE5hbWUuZ2V0QXNTdHJpbmcoKTsgfQorCisgIHZpcnR1YWwgdm9pZCBwcmludE5hbWUocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBhY3R1YWwsIHN0b3JlZCBuYW1lIG9mIHRoZSBkZWNsYXJhdGlvbiwgd2hpY2ggbWF5IGJlIGEgc3BlY2lhbAorICAvLy8gbmFtZS4KKyAgRGVjbGFyYXRpb25OYW1lIGdldERlY2xOYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorCisgIC8vLyBTZXQgdGhlIG5hbWUgb2YgdGhpcyBkZWNsYXJhdGlvbi4KKyAgdm9pZCBzZXREZWNsTmFtZShEZWNsYXJhdGlvbk5hbWUgTikgeyBOYW1lID0gTjsgfQorCisgIC8vLyBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoaXMgZGVjbGFyYXRpb24sIGxpa2UKKyAgLy8vIEE6OkI6OmksIGZvciBpIGJlaW5nIG1lbWJlciBvZiBuYW1lc3BhY2UgQTo6Qi4KKyAgLy8vCisgIC8vLyBJZiB0aGUgZGVjbGFyYXRpb24gaXMgbm90IGEgbWVtYmVyIG9mIGNvbnRleHQgd2hpY2ggY2FuIGJlIG5hbWVkIChyZWNvcmQsCisgIC8vLyBuYW1lc3BhY2UpLCBpdCB3aWxsIHJldHVybiB0aGUgc2FtZSByZXN1bHQgYXMgcHJpbnROYW1lKCkuCisgIC8vLworICAvLy8gQ3JlYXRpbmcgdGhpcyBuYW1lIGlzIGV4cGVuc2l2ZSwgc28gaXQgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4KKyAgLy8vIHBlcmZvcm1hbmNlIGRvZXNuJ3QgbWF0dGVyLgorICB2b2lkIHByaW50UXVhbGlmaWVkTmFtZShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIHByaW50UXVhbGlmaWVkTmFtZShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworCisgIC8vIEZJWE1FOiBSZW1vdmUgc3RyaW5nIHZlcnNpb24uCisgIHN0ZDo6c3RyaW5nIGdldFF1YWxpZmllZE5hbWVBc1N0cmluZygpIGNvbnN0OworCisgIC8vLyBBcHBlbmRzIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBkZWNsYXJhdGlvbiBpbnRvIHRoZSBnaXZlbiBzdHJlYW0uCisgIC8vLworICAvLy8gVGhpcyBpcyB0aGUgbWV0aG9kIGludm9rZWQgYnkgU2VtYSB3aGVuIGRpc3BsYXlpbmcgYSBOYW1lZERlY2wKKyAgLy8vIGluIGEgZGlhZ25vc3RpYy4gIEl0IGRvZXMgbm90IG5lY2Vzc2FyaWx5IHByb2R1Y2UgdGhlIHNhbWUKKyAgLy8vIHJlc3VsdCBhcyBwcmludE5hbWUoKTsgZm9yIGV4YW1wbGUsIGNsYXNzIHRlbXBsYXRlCisgIC8vLyBzcGVjaWFsaXphdGlvbnMgYXJlIHByaW50ZWQgd2l0aCB0aGVpciB0ZW1wbGF0ZSBhcmd1bWVudHMuCisgIHZpcnR1YWwgdm9pZCBnZXROYW1lRm9yRGlhZ25vc3RpYyhyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBRdWFsaWZpZWQpIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGRlY2xhcmF0aW9uLCBpZiBrbm93biB0byBiZSB3ZWxsLWZvcm1lZCB3aXRoaW4KKyAgLy8vIGl0cyBjb250ZXh0LCB3aWxsIHJlcGxhY2UgdGhlIGRlY2xhcmF0aW9uIE9sZEQgaWYgaW50cm9kdWNlZCBpbnRvIHNjb3BlLgorICAvLy8KKyAgLy8vIEEgZGVjbGFyYXRpb24gd2lsbCByZXBsYWNlIGFub3RoZXIgZGVjbGFyYXRpb24gaWYsIGZvciBleGFtcGxlLCBpdCBpcworICAvLy8gYSByZWRlY2xhcmF0aW9uIG9mIHRoZSBzYW1lIHZhcmlhYmxlIG9yIGZ1bmN0aW9uLCBidXQgbm90IGlmIGl0IGlzIGEKKyAgLy8vIGRlY2xhcmF0aW9uIG9mIGEgZGlmZmVyZW50IGtpbmQgKGZ1bmN0aW9uIHZzLiBjbGFzcykgb3IgYW4gb3ZlcmxvYWRlZAorICAvLy8gZnVuY3Rpb24uCisgIC8vLworICAvLy8gXHBhcmFtIElzS25vd25OZXdlciBcYyB0cnVlIGlmIHRoaXMgZGVjbGFyYXRpb24gaXMga25vd24gdG8gYmUgbmV3ZXIKKyAgLy8vIHRoYW4gXHAgT2xkRCAoZm9yIGluc3RhbmNlLCBpZiB0aGlzIGRlY2xhcmF0aW9uIGlzIG5ld2x5LWNyZWF0ZWQpLgorICBib29sIGRlY2xhcmF0aW9uUmVwbGFjZXMoTmFtZWREZWNsICpPbGRELCBib29sIElzS25vd25OZXdlciA9IHRydWUpIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGRlY2xhcmF0aW9uIGhhcyBsaW5rYWdlLgorICBib29sIGhhc0xpbmthZ2UoKSBjb25zdDsKKworICB1c2luZyBEZWNsOjppc01vZHVsZVByaXZhdGU7CisgIHVzaW5nIERlY2w6OnNldE1vZHVsZVByaXZhdGU7CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gaXMgYSBDKysgY2xhc3MgbWVtYmVyLgorICBib29sIGlzQ1hYQ2xhc3NNZW1iZXIoKSBjb25zdCB7CisgICAgY29uc3QgRGVjbENvbnRleHQgKkRDID0gZ2V0RGVjbENvbnRleHQoKTsKKworICAgIC8vIEMrKzB4IFtjbGFzcy5tZW1dcDE6CisgICAgLy8gICBUaGUgZW51bWVyYXRvcnMgb2YgYW4gdW5zY29wZWQgZW51bWVyYXRpb24gZGVmaW5lZCBpbgorICAgIC8vICAgdGhlIGNsYXNzIGFyZSBtZW1iZXJzIG9mIHRoZSBjbGFzcy4KKyAgICBpZiAoaXNhPEVudW1EZWNsPihEQykpCisgICAgICBEQyA9IERDLT5nZXRSZWRlY2xDb250ZXh0KCk7CisKKyAgICByZXR1cm4gREMtPmlzUmVjb3JkKCk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGRlY2xhcmF0aW9uIGlzIGFuIGluc3RhbmNlIG1lbWJlciBvZgorICAvLy8gYSBDKysgY2xhc3MuCisgIGJvb2wgaXNDWFhJbnN0YW5jZU1lbWJlcigpIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgd2hhdCBraW5kIG9mIGxpbmthZ2UgdGhpcyBlbnRpdHkgaGFzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgbm90IHRoZSBsaW5rYWdlIGFzIGRlZmluZWQgYnkgdGhlIHN0YW5kYXJkIG9yIHRoZSBjb2RlZ2VuIG5vdGlvbgorICAvLy8gb2YgbGlua2FnZS4gSXQgaXMganVzdCBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgdGhhdCBpcyB1c2VkIHRvIGNvbXB1dGUKKyAgLy8vIHRob3NlLgorICBMaW5rYWdlIGdldExpbmthZ2VJbnRlcm5hbCgpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIGxpbmthZ2UgZnJvbSBhIHNlbWFudGljIHBvaW50IG9mIHZpZXcuIEVudGl0aWVzIGluCisgIC8vLyBhbm9ueW1vdXMgbmFtZXNwYWNlcyBhcmUgZXh0ZXJuYWwgKGluIGMrKzk4KS4KKyAgTGlua2FnZSBnZXRGb3JtYWxMaW5rYWdlKCkgY29uc3QgeworICAgIHJldHVybiBjbGFuZzo6Z2V0Rm9ybWFsTGlua2FnZShnZXRMaW5rYWdlSW50ZXJuYWwoKSk7CisgIH0KKworICAvLy8gVHJ1ZSBpZiB0aGlzIGRlY2wgaGFzIGV4dGVybmFsIGxpbmthZ2UuCisgIGJvb2wgaGFzRXh0ZXJuYWxGb3JtYWxMaW5rYWdlKCkgY29uc3QgeworICAgIHJldHVybiBpc0V4dGVybmFsRm9ybWFsTGlua2FnZShnZXRMaW5rYWdlSW50ZXJuYWwoKSk7CisgIH0KKworICBib29sIGlzRXh0ZXJuYWxseVZpc2libGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNsYW5nOjppc0V4dGVybmFsbHlWaXNpYmxlKGdldExpbmthZ2VJbnRlcm5hbCgpKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGRlY2xhcmF0aW9uIGNhbiBiZSByZWRlY2xhcmVkIGluIGEKKyAgLy8vIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0LgorICBib29sIGlzRXh0ZXJuYWxseURlY2xhcmFibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRXh0ZXJuYWxseVZpc2libGUoKSAmJiAhZ2V0T3duaW5nTW9kdWxlRm9yTGlua2FnZSgpOworICB9CisKKyAgLy8vIERldGVybWluZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhpcyBlbnRpdHkuCisgIFZpc2liaWxpdHkgZ2V0VmlzaWJpbGl0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TGlua2FnZUFuZFZpc2liaWxpdHkoKS5nZXRWaXNpYmlsaXR5KCk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lcyB0aGUgbGlua2FnZSBhbmQgdmlzaWJpbGl0eSBvZiB0aGlzIGVudGl0eS4KKyAgTGlua2FnZUluZm8gZ2V0TGlua2FnZUFuZFZpc2liaWxpdHkoKSBjb25zdDsKKworICAvLy8gS2luZHMgb2YgZXhwbGljaXQgdmlzaWJpbGl0eS4KKyAgZW51bSBFeHBsaWNpdFZpc2liaWxpdHlLaW5kIHsKKyAgICAvLy8gRG8gYW4gTFYgY29tcHV0YXRpb24gZm9yLCB1bHRpbWF0ZWx5LCBhIHR5cGUuCisgICAgLy8vIFZpc2liaWxpdHkgbWF5IGJlIHJlc3RyaWN0ZWQgYnkgdHlwZSB2aXNpYmlsaXR5IHNldHRpbmdzIGFuZAorICAgIC8vLyB0aGUgdmlzaWJpbGl0eSBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMuCisgICAgVmlzaWJpbGl0eUZvclR5cGUsCisKKyAgICAvLy8gRG8gYW4gTFYgY29tcHV0YXRpb24gZm9yLCB1bHRpbWF0ZWx5LCBhIG5vbi10eXBlIGRlY2xhcmF0aW9uLgorICAgIC8vLyBWaXNpYmlsaXR5IG1heSBiZSByZXN0cmljdGVkIGJ5IHZhbHVlIHZpc2liaWxpdHkgc2V0dGluZ3MgYW5kCisgICAgLy8vIHRoZSB2aXNpYmlsaXR5IG9mIHRlbXBsYXRlIGFyZ3VtZW50cy4KKyAgICBWaXNpYmlsaXR5Rm9yVmFsdWUKKyAgfTsKKworICAvLy8gSWYgdmlzaWJpbGl0eSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQgZm9yIHRoaXMKKyAgLy8vIGRlY2xhcmF0aW9uLCByZXR1cm4gdGhhdCB2aXNpYmlsaXR5LgorICBPcHRpb25hbDxWaXNpYmlsaXR5PgorICBnZXRFeHBsaWNpdFZpc2liaWxpdHkoRXhwbGljaXRWaXNpYmlsaXR5S2luZCBraW5kKSBjb25zdDsKKworICAvLy8gVHJ1ZSBpZiB0aGUgY29tcHV0ZWQgbGlua2FnZSBpcyB2YWxpZC4gVXNlZCBmb3IgY29uc2lzdGVuY3kKKyAgLy8vIGNoZWNraW5nLiBTaG91bGQgYWx3YXlzIHJldHVybiB0cnVlLgorICBib29sIGlzTGlua2FnZVZhbGlkKCkgY29uc3Q7CisKKyAgLy8vIFRydWUgaWYgc29tZXRoaW5nIGhhcyByZXF1aXJlZCB1cyB0byBjb21wdXRlIHRoZSBsaW5rYWdlCisgIC8vLyBvZiB0aGlzIGRlY2xhcmF0aW9uLgorICAvLy8KKyAgLy8vIExhbmd1YWdlIGZlYXR1cmVzIHdoaWNoIGNhbiByZXRyb2FjdGl2ZWx5IGNoYW5nZSBsaW5rYWdlIChsaWtlIGEKKyAgLy8vIHR5cGVkZWYgbmFtZSBmb3IgbGlua2FnZSBwdXJwb3NlcykgbWF5IG5lZWQgdG8gY29uc2lkZXIgdGhpcywKKyAgLy8vIGJ1dCBob3BlZnVsbHkgb25seSBpbiB0cmFuc2l0b3J5IHdheXMgZHVyaW5nIHBhcnNpbmcuCisgIGJvb2wgaGFzTGlua2FnZUJlZW5Db21wdXRlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzQ2FjaGVkTGlua2FnZSgpOworICB9CisKKyAgLy8vIExvb2tzIHRocm91Z2ggVXNpbmdEZWNscyBhbmQgT2JqQ0NvbXBhdGlibGVBbGlhc0RlY2xzIGZvcgorICAvLy8gdGhlIHVuZGVybHlpbmcgbmFtZWQgZGVjbC4KKyAgTmFtZWREZWNsICpnZXRVbmRlcmx5aW5nRGVjbCgpIHsKKyAgICAvLyBGYXN0LXBhdGggdGhlIGNvbW1vbiBjYXNlLgorICAgIGlmICh0aGlzLT5nZXRLaW5kKCkgIT0gVXNpbmdTaGFkb3cgJiYKKyAgICAgICAgdGhpcy0+Z2V0S2luZCgpICE9IENvbnN0cnVjdG9yVXNpbmdTaGFkb3cgJiYKKyAgICAgICAgdGhpcy0+Z2V0S2luZCgpICE9IE9iakNDb21wYXRpYmxlQWxpYXMgJiYKKyAgICAgICAgdGhpcy0+Z2V0S2luZCgpICE9IE5hbWVzcGFjZUFsaWFzKQorICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICByZXR1cm4gZ2V0VW5kZXJseWluZ0RlY2xJbXBsKCk7CisgIH0KKyAgY29uc3QgTmFtZWREZWNsICpnZXRVbmRlcmx5aW5nRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxOYW1lZERlY2wqPih0aGlzKS0+Z2V0VW5kZXJseWluZ0RlY2woKTsKKyAgfQorCisgIE5hbWVkRGVjbCAqZ2V0TW9zdFJlY2VudERlY2woKSB7CisgICAgcmV0dXJuIGNhc3Q8TmFtZWREZWNsPihzdGF0aWNfY2FzdDxEZWNsICo+KHRoaXMpLT5nZXRNb3N0UmVjZW50RGVjbCgpKTsKKyAgfQorICBjb25zdCBOYW1lZERlY2wgKmdldE1vc3RSZWNlbnREZWNsKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PE5hbWVkRGVjbCo+KHRoaXMpLT5nZXRNb3N0UmVjZW50RGVjbCgpOworICB9CisKKyAgT2JqQ1N0cmluZ0Zvcm1hdEZhbWlseSBnZXRPYmpDRlN0cmluZ0Zvcm1hdHRpbmdGYW1pbHkoKSBjb25zdDsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID49IGZpcnN0TmFtZWQgJiYgSyA8PSBsYXN0TmFtZWQ7IH0KK307CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE5hbWVkRGVjbCAmTkQpIHsKKyAgTkQucHJpbnROYW1lKE9TKTsKKyAgcmV0dXJuIE9TOworfQorCisvLy8gUmVwcmVzZW50cyB0aGUgZGVjbGFyYXRpb24gb2YgYSBsYWJlbC4gIExhYmVscyBhbHNvIGhhdmUgYQorLy8vIGNvcnJlc3BvbmRpbmcgTGFiZWxTdG10LCB3aGljaCBpbmRpY2F0ZXMgdGhlIHBvc2l0aW9uIHRoYXQgdGhlIGxhYmVsIHdhcworLy8vIGRlZmluZWQgYXQuICBGb3Igbm9ybWFsIGxhYmVscywgdGhlIGxvY2F0aW9uIG9mIHRoZSBkZWNsIGlzIHRoZSBzYW1lIGFzIHRoZQorLy8vIGxvY2F0aW9uIG9mIHRoZSBzdGF0ZW1lbnQuICBGb3IgR05VIGxvY2FsIGxhYmVscyAoX19sYWJlbF9fKSwgdGhlIGRlY2wKKy8vLyBsb2NhdGlvbiBpcyB3aGVyZSB0aGUgX19sYWJlbF9fIGlzLgorY2xhc3MgTGFiZWxEZWNsIDogcHVibGljIE5hbWVkRGVjbCB7CisgIExhYmVsU3RtdCAqVGhlU3RtdDsKKyAgU3RyaW5nUmVmIE1TQXNtTmFtZTsKKyAgYm9vbCBNU0FzbU5hbWVSZXNvbHZlZCA9IGZhbHNlOworCisgIC8vLyBGb3Igbm9ybWFsIGxhYmVscywgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgbWFpbiBkZWNsYXJhdGlvbgorICAvLy8gbGFiZWwsIGkuZS4sIHRoZSBsb2NhdGlvbiBvZiB0aGUgaWRlbnRpZmllcjsgZm9yIEdOVSBsb2NhbCBsYWJlbHMsCisgIC8vLyB0aGlzIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgX19sYWJlbF9fIGtleXdvcmQuCisgIFNvdXJjZUxvY2F0aW9uIExvY1N0YXJ0OworCisgIExhYmVsRGVjbChEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIElkZW50TCwgSWRlbnRpZmllckluZm8gKklJLAorICAgICAgICAgICAgTGFiZWxTdG10ICpTLCBTb3VyY2VMb2NhdGlvbiBTdGFydEwpCisgICAgICA6IE5hbWVkRGVjbChMYWJlbCwgREMsIElkZW50TCwgSUkpLCBUaGVTdG10KFMpLCBMb2NTdGFydChTdGFydEwpIHt9CisKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBzdGF0aWMgTGFiZWxEZWNsICpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRlbnRMLCBJZGVudGlmaWVySW5mbyAqSUkpOworICBzdGF0aWMgTGFiZWxEZWNsICpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRlbnRMLCBJZGVudGlmaWVySW5mbyAqSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBHbnVMYWJlbEwpOworICBzdGF0aWMgTGFiZWxEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOworICAKKyAgTGFiZWxTdG10ICpnZXRTdG10KCkgY29uc3QgeyByZXR1cm4gVGhlU3RtdDsgfQorICB2b2lkIHNldFN0bXQoTGFiZWxTdG10ICpUKSB7IFRoZVN0bXQgPSBUOyB9CisKKyAgYm9vbCBpc0dudUxvY2FsKCkgY29uc3QgeyByZXR1cm4gTG9jU3RhcnQgIT0gZ2V0TG9jYXRpb24oKTsgfQorICB2b2lkIHNldExvY1N0YXJ0KFNvdXJjZUxvY2F0aW9uIEwpIHsgTG9jU3RhcnQgPSBMOyB9CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoTG9jU3RhcnQsIGdldExvY2F0aW9uKCkpOworICB9CisKKyAgYm9vbCBpc01TQXNtTGFiZWwoKSBjb25zdCB7IHJldHVybiAhTVNBc21OYW1lLmVtcHR5KCk7IH0KKyAgYm9vbCBpc1Jlc29sdmVkTVNBc21MYWJlbCgpIGNvbnN0IHsgcmV0dXJuIGlzTVNBc21MYWJlbCgpICYmIE1TQXNtTmFtZVJlc29sdmVkOyB9CisgIHZvaWQgc2V0TVNBc21MYWJlbChTdHJpbmdSZWYgTmFtZSk7CisgIFN0cmluZ1JlZiBnZXRNU0FzbUxhYmVsKCkgY29uc3QgeyByZXR1cm4gTVNBc21OYW1lOyB9CisgIHZvaWQgc2V0TVNBc21MYWJlbFJlc29sdmVkKCkgeyBNU0FzbU5hbWVSZXNvbHZlZCA9IHRydWU7IH0KKworICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC9ldGMuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gTGFiZWw7IH0KK307CisKKy8vLyBSZXByZXNlbnQgYSBDKysgbmFtZXNwYWNlLgorY2xhc3MgTmFtZXNwYWNlRGVjbCA6IHB1YmxpYyBOYW1lZERlY2wsIHB1YmxpYyBEZWNsQ29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFJlZGVjbGFyYWJsZTxOYW1lc3BhY2VEZWNsPiAKK3sKKyAgLy8vIFRoZSBzdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgc291cmNlIHJhbmdlLCBwb2ludGluZworICAvLy8gdG8gZWl0aGVyIHRoZSBuYW1lc3BhY2Ugb3IgdGhlIGlubGluZSBrZXl3b3JkLgorICBTb3VyY2VMb2NhdGlvbiBMb2NTdGFydDsKKworICAvLy8gVGhlIGVuZGluZyBsb2NhdGlvbiBvZiB0aGUgc291cmNlIHJhbmdlLgorICBTb3VyY2VMb2NhdGlvbiBSQnJhY2VMb2M7CisKKyAgLy8vIEEgcG9pbnRlciB0byBlaXRoZXIgdGhlIGFub255bW91cyBuYW1lc3BhY2UgdGhhdCBsaXZlcyBqdXN0IGluc2lkZQorICAvLy8gdGhpcyBuYW1lc3BhY2Ugb3IgdG8gdGhlIGZpcnN0IG5hbWVzcGFjZSBpbiB0aGUgY2hhaW4gKHRoZSBsYXR0ZXIgY2FzZQorICAvLy8gb25seSB3aGVuIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBpbiB0aGUgY2hhaW4pLCBhbG9uZyB3aXRoIGEgCisgIC8vLyBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGlzIGFuIGlubGluZSBuYW1lc3BhY2UuCisgIGxsdm06OlBvaW50ZXJJbnRQYWlyPE5hbWVzcGFjZURlY2wgKiwgMSwgYm9vbD4gQW5vbk9yRmlyc3ROYW1lc3BhY2VBbmRJbmxpbmU7CisKKyAgTmFtZXNwYWNlRGVjbChBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsIGJvb2wgSW5saW5lLAorICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBJZExvYywKKyAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsIE5hbWVzcGFjZURlY2wgKlByZXZEZWNsKTsKKworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZSA9IFJlZGVjbGFyYWJsZTxOYW1lc3BhY2VEZWNsPjsKKworICBOYW1lc3BhY2VEZWNsICpnZXROZXh0UmVkZWNsYXJhdGlvbkltcGwoKSBvdmVycmlkZTsKKyAgTmFtZXNwYWNlRGVjbCAqZ2V0UHJldmlvdXNEZWNsSW1wbCgpIG92ZXJyaWRlOworICBOYW1lc3BhY2VEZWNsICpnZXRNb3N0UmVjZW50RGVjbEltcGwoKSBvdmVycmlkZTsKKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisKKyAgc3RhdGljIE5hbWVzcGFjZURlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmxpbmUsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLCBJZGVudGlmaWVySW5mbyAqSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlRGVjbCAqUHJldkRlY2wpOworCisgIHN0YXRpYyBOYW1lc3BhY2VEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOworCisgIHVzaW5nIHJlZGVjbF9yYW5nZSA9IHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xfcmFuZ2U7CisgIHVzaW5nIHJlZGVjbF9pdGVyYXRvciA9IHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xfaXRlcmF0b3I7CisKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHNfYmVnaW47CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xzX2VuZDsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHM7CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpnZXRQcmV2aW91c0RlY2w7CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpnZXRNb3N0UmVjZW50RGVjbDsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmlzRmlyc3REZWNsOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhbiBhbm9ueW1vdXMgbmFtZXNwYWNlIGRlY2xhcmF0aW9uLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlOgorICAvLy8gXGNvZGUKKyAgLy8vICAgbmFtZXNwYWNlIHsKKyAgLy8vICAgICAuLi4KKyAgLy8vICAgfTsKKyAgLy8vIFxlbmRjb2RlCisgIC8vLyBxLnYuIEMrKyBbbmFtZXNwYWNlLnVubmFtZWRdCisgIGJvb2wgaXNBbm9ueW1vdXNOYW1lc3BhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuICFnZXRJZGVudGlmaWVyKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYW4gaW5saW5lIG5hbWVzcGFjZSBkZWNsYXJhdGlvbi4KKyAgYm9vbCBpc0lubGluZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQW5vbk9yRmlyc3ROYW1lc3BhY2VBbmRJbmxpbmUuZ2V0SW50KCk7CisgIH0KKworICAvLy8gU2V0IHdoZXRoZXIgdGhpcyBpcyBhbiBpbmxpbmUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uLgorICB2b2lkIHNldElubGluZShib29sIElubGluZSkgeworICAgIEFub25PckZpcnN0TmFtZXNwYWNlQW5kSW5saW5lLnNldEludChJbmxpbmUpOworICB9CisKKyAgLy8vIEdldCB0aGUgb3JpZ2luYWwgKGZpcnN0KSBuYW1lc3BhY2UgZGVjbGFyYXRpb24uCisgIE5hbWVzcGFjZURlY2wgKmdldE9yaWdpbmFsTmFtZXNwYWNlKCk7CisKKyAgLy8vIEdldCB0aGUgb3JpZ2luYWwgKGZpcnN0KSBuYW1lc3BhY2UgZGVjbGFyYXRpb24uCisgIGNvbnN0IE5hbWVzcGFjZURlY2wgKmdldE9yaWdpbmFsTmFtZXNwYWNlKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgZGVjbGFyYXRpb24gaXMgYW4gb3JpZ2luYWwgKGZpcnN0KSBkZWNsYXJhdGlvbgorICAvLy8gb2YgdGhlIG5hbWVzcGFjZS4gVGhpcyBpcyBmYWxzZSBmb3Igbm9uLW9yaWdpbmFsIChzdWJzZXF1ZW50KSBuYW1lc3BhY2UKKyAgLy8vIGRlY2xhcmF0aW9ucyBhbmQgYW5vbnltb3VzIG5hbWVzcGFjZXMuCisgIGJvb2wgaXNPcmlnaW5hbE5hbWVzcGFjZSgpIGNvbnN0OworCisgIC8vLyBSZXRyaWV2ZSB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZSBuZXN0ZWQgaW5zaWRlIHRoaXMgbmFtZXNwYWNlLAorICAvLy8gaWYgYW55LgorICBOYW1lc3BhY2VEZWNsICpnZXRBbm9ueW1vdXNOYW1lc3BhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9yaWdpbmFsTmFtZXNwYWNlKCktPkFub25PckZpcnN0TmFtZXNwYWNlQW5kSW5saW5lLmdldFBvaW50ZXIoKTsKKyAgfQorCisgIHZvaWQgc2V0QW5vbnltb3VzTmFtZXNwYWNlKE5hbWVzcGFjZURlY2wgKkQpIHsKKyAgICBnZXRPcmlnaW5hbE5hbWVzcGFjZSgpLT5Bbm9uT3JGaXJzdE5hbWVzcGFjZUFuZElubGluZS5zZXRQb2ludGVyKEQpOworICB9CisKKyAgLy8vIFJldHJpZXZlcyB0aGUgY2Fub25pY2FsIGRlY2xhcmF0aW9uIG9mIHRoaXMgbmFtZXNwYWNlLgorICBOYW1lc3BhY2VEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRPcmlnaW5hbE5hbWVzcGFjZSgpOworICB9CisgIGNvbnN0IE5hbWVzcGFjZURlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9yaWdpbmFsTmFtZXNwYWNlKCk7CisgIH0KKworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBTb3VyY2VSYW5nZShMb2NTdGFydCwgUkJyYWNlTG9jKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2NTdGFydDsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRSQnJhY2VMb2MoKSBjb25zdCB7IHJldHVybiBSQnJhY2VMb2M7IH0KKyAgdm9pZCBzZXRMb2NTdGFydChTb3VyY2VMb2NhdGlvbiBMKSB7IExvY1N0YXJ0ID0gTDsgfQorICB2b2lkIHNldFJCcmFjZUxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IFJCcmFjZUxvYyA9IEw7IH0KKworICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC9ldGMuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gTmFtZXNwYWNlOyB9CisgIHN0YXRpYyBEZWNsQ29udGV4dCAqY2FzdFRvRGVjbENvbnRleHQoY29uc3QgTmFtZXNwYWNlRGVjbCAqRCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZWNsQ29udGV4dCAqPihjb25zdF9jYXN0PE5hbWVzcGFjZURlY2wqPihEKSk7CisgIH0KKyAgc3RhdGljIE5hbWVzcGFjZURlY2wgKmNhc3RGcm9tRGVjbENvbnRleHQoY29uc3QgRGVjbENvbnRleHQgKkRDKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE5hbWVzcGFjZURlY2wgKj4oY29uc3RfY2FzdDxEZWNsQ29udGV4dCo+KERDKSk7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnQgdGhlIGRlY2xhcmF0aW9uIG9mIGEgdmFyaWFibGUgKGluIHdoaWNoIGNhc2UgaXQgaXMKKy8vLyBhbiBsdmFsdWUpIGEgZnVuY3Rpb24gKGluIHdoaWNoIGNhc2UgaXQgaXMgYSBmdW5jdGlvbiBkZXNpZ25hdG9yKSBvcgorLy8vIGFuIGVudW0gY29uc3RhbnQuCitjbGFzcyBWYWx1ZURlY2wgOiBwdWJsaWMgTmFtZWREZWNsIHsKKyAgUXVhbFR5cGUgRGVjbFR5cGU7CisKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICBWYWx1ZURlY2woS2luZCBESywgRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBMLAorICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lIE4sIFF1YWxUeXBlIFQpCisgICAgOiBOYW1lZERlY2woREssIERDLCBMLCBOKSwgRGVjbFR5cGUoVCkge30KKworcHVibGljOgorICBRdWFsVHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gRGVjbFR5cGU7IH0KKyAgdm9pZCBzZXRUeXBlKFF1YWxUeXBlIG5ld1R5cGUpIHsgRGVjbFR5cGUgPSBuZXdUeXBlOyB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgc3ltYm9sIGlzIHdlYWtseS1pbXBvcnRlZCwKKyAgLy8vICAgICAgICBvciBkZWNsYXJlZCB3aXRoIHRoZSB3ZWFrIG9yIHdlYWstcmVmIGF0dHIuCisgIGJvb2wgaXNXZWFrKCkgY29uc3Q7CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID49IGZpcnN0VmFsdWUgJiYgSyA8PSBsYXN0VmFsdWU7IH0KK307CisKKy8vLyBBIHN0cnVjdCB3aXRoIGV4dGVuZGVkIGluZm8gYWJvdXQgYSBzeW50YWN0aWMKKy8vLyBuYW1lIHF1YWxpZmllciwgdG8gYmUgdXNlZCBmb3IgdGhlIGNhc2Ugb2Ygb3V0LW9mLWxpbmUgZGVjbGFyYXRpb25zLgorc3RydWN0IFF1YWxpZmllckluZm8geworICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYzsKKworICAvLy8gVGhlIG51bWJlciBvZiAib3V0ZXIiIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0cy4KKyAgLy8vIFRoZSBjb3VudCBpbmNsdWRlcyBhbGwgb2YgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0cyB0aGF0IHdlcmUgbWF0Y2hlZAorICAvLy8gYWdhaW5zdCB0aGUgdGVtcGxhdGUtaWRzIG9jY3VycmluZyBpbnRvIHRoZSBOTlMgYW5kIHBvc3NpYmx5IChpbiB0aGUKKyAgLy8vIGNhc2Ugb2YgYW4gZXhwbGljaXQgc3BlY2lhbGl6YXRpb24pIGEgZmluYWwgInRlbXBsYXRlIDw+Ii4KKyAgdW5zaWduZWQgTnVtVGVtcGxQYXJhbUxpc3RzID0gMDsKKworICAvLy8gQSBuZXctYWxsb2NhdGVkIGFycmF5IG9mIHNpemUgTnVtVGVtcGxQYXJhbUxpc3RzLAorICAvLy8gY29udGFpbmluZyBwb2ludGVycyB0byB0aGUgIm91dGVyIiB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdHMuCisgIC8vLyBJdCBpbmNsdWRlcyBhbGwgb2YgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0cyB0aGF0IHdlcmUgbWF0Y2hlZAorICAvLy8gYWdhaW5zdCB0aGUgdGVtcGxhdGUtaWRzIG9jY3VycmluZyBpbnRvIHRoZSBOTlMgYW5kIHBvc3NpYmx5IChpbiB0aGUKKyAgLy8vIGNhc2Ugb2YgYW4gZXhwbGljaXQgc3BlY2lhbGl6YXRpb24pIGEgZmluYWwgInRlbXBsYXRlIDw+Ii4KKyAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0KiogVGVtcGxQYXJhbUxpc3RzID0gbnVsbHB0cjsKKworICBRdWFsaWZpZXJJbmZvKCkgPSBkZWZhdWx0OworICBRdWFsaWZpZXJJbmZvKGNvbnN0IFF1YWxpZmllckluZm8gJikgPSBkZWxldGU7CisgIFF1YWxpZmllckluZm8mIG9wZXJhdG9yPShjb25zdCBRdWFsaWZpZXJJbmZvICYpID0gZGVsZXRlOworCisgIC8vLyBTZXRzIGluZm8gYWJvdXQgIm91dGVyIiB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdHMuCisgIHZvaWQgc2V0VGVtcGxhdGVQYXJhbWV0ZXJMaXN0c0luZm8oQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKj4gVFBMaXN0cyk7Cit9OworCisvLy8gUmVwcmVzZW50cyBhIFZhbHVlRGVjbCB0aGF0IGNhbWUgb3V0IG9mIGEgZGVjbGFyYXRvci4KKy8vLyBDb250YWlucyB0eXBlIHNvdXJjZSBpbmZvcm1hdGlvbiB0aHJvdWdoIFR5cGVTb3VyY2VJbmZvLgorY2xhc3MgRGVjbGFyYXRvckRlY2wgOiBwdWJsaWMgVmFsdWVEZWNsIHsKKyAgLy8gQSBzdHJ1Y3QgcmVwcmVzZW50aW5nIGJvdGggYSBUSW5mbyBhbmQgYSBzeW50YWN0aWMgcXVhbGlmaWVyLAorICAvLyB0byBiZSB1c2VkIGZvciB0aGUgKHVuY29tbW9uKSBjYXNlIG9mIG91dC1vZi1saW5lIGRlY2xhcmF0aW9ucy4KKyAgc3RydWN0IEV4dEluZm8gOiBwdWJsaWMgUXVhbGlmaWVySW5mbyB7CisgICAgVHlwZVNvdXJjZUluZm8gKlRJbmZvOworICB9OworCisgIGxsdm06OlBvaW50ZXJVbmlvbjxUeXBlU291cmNlSW5mbyAqLCBFeHRJbmZvICo+IERlY2xJbmZvOworCisgIC8vLyBUaGUgc3RhcnQgb2YgdGhlIHNvdXJjZSByYW5nZSBmb3IgdGhpcyBkZWNsYXJhdGlvbiwKKyAgLy8vIGlnbm9yaW5nIG91dGVyIHRlbXBsYXRlIGRlY2xhcmF0aW9ucy4KKyAgU291cmNlTG9jYXRpb24gSW5uZXJMb2NTdGFydDsKKworICBib29sIGhhc0V4dEluZm8oKSBjb25zdCB7IHJldHVybiBEZWNsSW5mby5pczxFeHRJbmZvKj4oKTsgfQorICBFeHRJbmZvICpnZXRFeHRJbmZvKCkgeyByZXR1cm4gRGVjbEluZm8uZ2V0PEV4dEluZm8qPigpOyB9CisgIGNvbnN0IEV4dEluZm8gKmdldEV4dEluZm8oKSBjb25zdCB7IHJldHVybiBEZWNsSW5mby5nZXQ8RXh0SW5mbyo+KCk7IH0KKworcHJvdGVjdGVkOgorICBEZWNsYXJhdG9yRGVjbChLaW5kIERLLCBEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIEwsCisgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBOLCBRdWFsVHlwZSBULCBUeXBlU291cmNlSW5mbyAqVEluZm8sCisgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TCkKKyAgICAgIDogVmFsdWVEZWNsKERLLCBEQywgTCwgTiwgVCksIERlY2xJbmZvKFRJbmZvKSwgSW5uZXJMb2NTdGFydChTdGFydEwpIHt9CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsV3JpdGVyOworCisgIFR5cGVTb3VyY2VJbmZvICpnZXRUeXBlU291cmNlSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzRXh0SW5mbygpCisgICAgICA/IGdldEV4dEluZm8oKS0+VEluZm8KKyAgICAgIDogRGVjbEluZm8uZ2V0PFR5cGVTb3VyY2VJbmZvKj4oKTsKKyAgfQorCisgIHZvaWQgc2V0VHlwZVNvdXJjZUluZm8oVHlwZVNvdXJjZUluZm8gKlRJKSB7CisgICAgaWYgKGhhc0V4dEluZm8oKSkKKyAgICAgIGdldEV4dEluZm8oKS0+VEluZm8gPSBUSTsKKyAgICBlbHNlCisgICAgICBEZWNsSW5mbyA9IFRJOworICB9CisKKyAgLy8vIFJldHVybiBzdGFydCBvZiBzb3VyY2UgcmFuZ2UgaWdub3Jpbmcgb3V0ZXIgdGVtcGxhdGUgZGVjbGFyYXRpb25zLgorICBTb3VyY2VMb2NhdGlvbiBnZXRJbm5lckxvY1N0YXJ0KCkgY29uc3QgeyByZXR1cm4gSW5uZXJMb2NTdGFydDsgfQorICB2b2lkIHNldElubmVyTG9jU3RhcnQoU291cmNlTG9jYXRpb24gTCkgeyBJbm5lckxvY1N0YXJ0ID0gTDsgfQorCisgIC8vLyBSZXR1cm4gc3RhcnQgb2Ygc291cmNlIHJhbmdlIHRha2luZyBpbnRvIGFjY291bnQgYW55IG91dGVyIHRlbXBsYXRlCisgIC8vLyBkZWNsYXJhdGlvbnMuCisgIFNvdXJjZUxvY2F0aW9uIGdldE91dGVyTG9jU3RhcnQoKSBjb25zdDsKKworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFk7CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gZ2V0T3V0ZXJMb2NTdGFydCgpOworICB9CisKKyAgLy8vIFJldHJpZXZlIHRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgdGhhdCBxdWFsaWZpZXMgdGhlIG5hbWUgb2YgdGhpcworICAvLy8gZGVjbGFyYXRpb24sIGlmIGl0IHdhcyBwcmVzZW50IGluIHRoZSBzb3VyY2UuCisgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKmdldFF1YWxpZmllcigpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzRXh0SW5mbygpID8gZ2V0RXh0SW5mbygpLT5RdWFsaWZpZXJMb2MuZ2V0TmVzdGVkTmFtZVNwZWNpZmllcigpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgIH0KKworICAvLy8gUmV0cmlldmUgdGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciAod2l0aCBzb3VyY2UtbG9jYXRpb24KKyAgLy8vIGluZm9ybWF0aW9uKSB0aGF0IHF1YWxpZmllcyB0aGUgbmFtZSBvZiB0aGlzIGRlY2xhcmF0aW9uLCBpZiBpdCB3YXMKKyAgLy8vIHByZXNlbnQgaW4gdGhlIHNvdXJjZS4KKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBnZXRRdWFsaWZpZXJMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0V4dEluZm8oKSA/IGdldEV4dEluZm8oKS0+UXVhbGlmaWVyTG9jCisgICAgICAgICAgICAgICAgICAgICAgICA6IE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoKTsKKyAgfQorCisgIHZvaWQgc2V0UXVhbGlmaWVySW5mbyhOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYyk7CisKKyAgdW5zaWduZWQgZ2V0TnVtVGVtcGxhdGVQYXJhbWV0ZXJMaXN0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzRXh0SW5mbygpID8gZ2V0RXh0SW5mbygpLT5OdW1UZW1wbFBhcmFtTGlzdHMgOiAwOworICB9CisKKyAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpnZXRUZW1wbGF0ZVBhcmFtZXRlckxpc3QodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaW5kZXggPCBnZXROdW1UZW1wbGF0ZVBhcmFtZXRlckxpc3RzKCkpOworICAgIHJldHVybiBnZXRFeHRJbmZvKCktPlRlbXBsUGFyYW1MaXN0c1tpbmRleF07CisgIH0KKworICB2b2lkIHNldFRlbXBsYXRlUGFyYW1ldGVyTGlzdHNJbmZvKEFTVENvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICo+IFRQTGlzdHMpOworCisgIFNvdXJjZUxvY2F0aW9uIGdldFR5cGVTcGVjU3RhcnRMb2MoKSBjb25zdDsKKworICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC9ldGMuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsKKyAgICByZXR1cm4gSyA+PSBmaXJzdERlY2xhcmF0b3IgJiYgSyA8PSBsYXN0RGVjbGFyYXRvcjsKKyAgfQorfTsKKworLy8vIFN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgc3RhdGVtZW50LCB0aGUgY29uc3RhbnQgdmFsdWUgdG8KKy8vLyB3aGljaCBpdCB3YXMgZXZhbHVhdGVkIChpZiBhbnkpLCBhbmQgd2hldGhlciBvciBub3QgdGhlIHN0YXRlbWVudAorLy8vIGlzIGFuIGludGVncmFsIGNvbnN0YW50IGV4cHJlc3Npb24gKGlmIGtub3duKS4KK3N0cnVjdCBFdmFsdWF0ZWRTdG10IHsKKyAgLy8vIFdoZXRoZXIgdGhpcyBzdGF0ZW1lbnQgd2FzIGFscmVhZHkgZXZhbHVhdGVkLgorICBib29sIFdhc0V2YWx1YXRlZCA6IDE7CisKKyAgLy8vIFdoZXRoZXIgdGhpcyBzdGF0ZW1lbnQgaXMgYmVpbmcgZXZhbHVhdGVkLgorICBib29sIElzRXZhbHVhdGluZyA6IDE7CisKKyAgLy8vIFdoZXRoZXIgd2UgYWxyZWFkeSBjaGVja2VkIHdoZXRoZXIgdGhpcyBzdGF0ZW1lbnQgd2FzIGFuCisgIC8vLyBpbnRlZ3JhbCBjb25zdGFudCBleHByZXNzaW9uLgorICBib29sIENoZWNrZWRJQ0UgOiAxOworCisgIC8vLyBXaGV0aGVyIHdlIGFyZSBjaGVja2luZyB3aGV0aGVyIHRoaXMgc3RhdGVtZW50IGlzIGFuCisgIC8vLyBpbnRlZ3JhbCBjb25zdGFudCBleHByZXNzaW9uLgorICBib29sIENoZWNraW5nSUNFIDogMTsKKworICAvLy8gV2hldGhlciB0aGlzIHN0YXRlbWVudCBpcyBhbiBpbnRlZ3JhbCBjb25zdGFudCBleHByZXNzaW9uLAorICAvLy8gb3IgaW4gQysrMTEsIHdoZXRoZXIgdGhlIHN0YXRlbWVudCBpcyBhIGNvbnN0YW50IGV4cHJlc3Npb24uIE9ubHkKKyAgLy8vIHZhbGlkIGlmIENoZWNrZWRJQ0UgaXMgdHJ1ZS4KKyAgYm9vbCBJc0lDRSA6IDE7CisKKyAgU3RtdCAqVmFsdWU7CisgIEFQVmFsdWUgRXZhbHVhdGVkOworCisgIEV2YWx1YXRlZFN0bXQoKSA6IFdhc0V2YWx1YXRlZChmYWxzZSksIElzRXZhbHVhdGluZyhmYWxzZSksIENoZWNrZWRJQ0UoZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICBDaGVja2luZ0lDRShmYWxzZSksIElzSUNFKGZhbHNlKSB7fQorCit9OworCisvLy8gUmVwcmVzZW50cyBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG9yIGRlZmluaXRpb24uCitjbGFzcyBWYXJEZWNsIDogcHVibGljIERlY2xhcmF0b3JEZWNsLCBwdWJsaWMgUmVkZWNsYXJhYmxlPFZhckRlY2w+IHsKK3B1YmxpYzoKKyAgLy8vIEluaXRpYWxpemF0aW9uIHN0eWxlcy4KKyAgZW51bSBJbml0aWFsaXphdGlvblN0eWxlIHsKKyAgICAvLy8gQy1zdHlsZSBpbml0aWFsaXphdGlvbiB3aXRoIGFzc2lnbm1lbnQKKyAgICBDSW5pdCwKKworICAgIC8vLyBDYWxsLXN0eWxlIGluaXRpYWxpemF0aW9uIChDKys5OCkKKyAgICBDYWxsSW5pdCwKKworICAgIC8vLyBEaXJlY3QgbGlzdC1pbml0aWFsaXphdGlvbiAoQysrMTEpCisgICAgTGlzdEluaXQKKyAgfTsKKworICAvLy8gS2luZHMgb2YgdGhyZWFkLWxvY2FsIHN0b3JhZ2UuCisgIGVudW0gVExTS2luZCB7CisgICAgLy8vIE5vdCBhIFRMUyB2YXJpYWJsZS4KKyAgICBUTFNfTm9uZSwKKworICAgIC8vLyBUTFMgd2l0aCBhIGtub3duLWNvbnN0YW50IGluaXRpYWxpemVyLgorICAgIFRMU19TdGF0aWMsCisKKyAgICAvLy8gVExTIHdpdGggYSBkeW5hbWljIGluaXRpYWxpemVyLgorICAgIFRMU19EeW5hbWljCisgIH07CisKKyAgLy8vIFJldHVybiB0aGUgc3RyaW5nIHVzZWQgdG8gc3BlY2lmeSB0aGUgc3RvcmFnZSBjbGFzcyBccCBTQy4KKyAgLy8vCisgIC8vLyBJdCBpcyBpbGxlZ2FsIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIFNDID09IE5vbmUuCisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRTdG9yYWdlQ2xhc3NTcGVjaWZpZXJTdHJpbmcoU3RvcmFnZUNsYXNzIFNDKTsKKworcHJvdGVjdGVkOgorICAvLyBBIHBvaW50ZXIgdW5pb24gb2YgU3RtdCAqIGFuZCBFdmFsdWF0ZWRTdG10ICouIFdoZW4gYW4gRXZhbHVhdGVkU3RtdCwgd2UKKyAgLy8gaGF2ZSBhbGxvY2F0ZWQgdGhlIGF1eGlsaWFyeSBzdHJ1Y3Qgb2YgaW5mb3JtYXRpb24gdGhlcmUuCisgIC8vCisgIC8vIFRPRE86IEl0IGlzIGEgYml0IHVuZm9ydHVuYXRlIHRvIHVzZSBhIFBvaW50ZXJVbmlvbiBpbnNpZGUgdGhlIFZhckRlY2wgZm9yCisgIC8vIHRoaXMgYXMgKm1hbnkqIFZhckRlY2xzIGFyZSBQYXJtVmFyRGVjbHMgdGhhdCBkb24ndCBoYXZlIGRlZmF1bHQKKyAgLy8gYXJndW1lbnRzLiBXZSBjb3VsZCBzYXZlIHNvbWUgc3BhY2UgYnkgbW92aW5nIHRoaXMgcG9pbnRlciB1bmlvbiB0byBiZQorICAvLyBhbGxvY2F0ZWQgaW4gdHJhaWxpbmcgc3BhY2Ugd2hlbiBuZWNlc3NhcnkuCisgIHVzaW5nIEluaXRUeXBlID0gbGx2bTo6UG9pbnRlclVuaW9uPFN0bXQgKiwgRXZhbHVhdGVkU3RtdCAqPjsKKworICAvLy8gVGhlIGluaXRpYWxpemVyIGZvciB0aGlzIHZhcmlhYmxlIG9yLCBmb3IgYSBQYXJtVmFyRGVjbCwgdGhlCisgIC8vLyBDKysgZGVmYXVsdCBhcmd1bWVudC4KKyAgbXV0YWJsZSBJbml0VHlwZSBJbml0OworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVE5vZGVJbXBvcnRlcjsKKyAgZnJpZW5kIGNsYXNzIFN0bXRJdGVyYXRvckJhc2U7CisKKyAgY2xhc3MgVmFyRGVjbEJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgICAgZnJpZW5kIGNsYXNzIFZhckRlY2w7CisKKyAgICB1bnNpZ25lZCBTQ2xhc3MgOiAzOworICAgIHVuc2lnbmVkIFRTQ1NwZWMgOiAyOworICAgIHVuc2lnbmVkIEluaXRTdHlsZSA6IDI7CisgIH07CisgIGVudW0geyBOdW1WYXJEZWNsQml0cyA9IDcgfTsKKworcHJvdGVjdGVkOgorICBlbnVtIHsgTnVtUGFyYW1ldGVySW5kZXhCaXRzID0gOCB9OworCisgIGVudW0gRGVmYXVsdEFyZ0tpbmQgeworICAgIERBS19Ob25lLAorICAgIERBS19VbnBhcnNlZCwKKyAgICBEQUtfVW5pbnN0YW50aWF0ZWQsCisgICAgREFLX05vcm1hbAorICB9OworCisgIGNsYXNzIFBhcm1WYXJEZWNsQml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgICBmcmllbmQgY2xhc3MgUGFybVZhckRlY2w7CisKKyAgICB1bnNpZ25lZCA6IE51bVZhckRlY2xCaXRzOworCisgICAgLy8vIFdoZXRoZXIgdGhpcyBwYXJhbWV0ZXIgaW5oZXJpdHMgYSBkZWZhdWx0IGFyZ3VtZW50IGZyb20gYQorICAgIC8vLyBwcmlvciBkZWNsYXJhdGlvbi4KKyAgICB1bnNpZ25lZCBIYXNJbmhlcml0ZWREZWZhdWx0QXJnIDogMTsKKworICAgIC8vLyBEZXNjcmliZXMgdGhlIGtpbmQgb2YgZGVmYXVsdCBhcmd1bWVudCBmb3IgdGhpcyBwYXJhbWV0ZXIuIEJ5IGRlZmF1bHQKKyAgICAvLy8gdGhpcyBpcyBub25lLiBJZiB0aGlzIGlzIG5vcm1hbCwgdGhlbiB0aGUgZGVmYXVsdCBhcmd1bWVudCBpcyBzdG9yZWQgaW4KKyAgICAvLy8gdGhlIFxjIFZhckRlY2wgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbiB1bmxlc3Mgd2Ugd2VyZSB1bmFibGUgdG8gcGFyc2UKKyAgICAvLy8gKGV2ZW4gYW4gaW52YWxpZCkgZXhwcmVzc2lvbiBmb3IgdGhlIGRlZmF1bHQgYXJndW1lbnQuCisgICAgdW5zaWduZWQgRGVmYXVsdEFyZ0tpbmQgOiAyOworCisgICAgLy8vIFdoZXRoZXIgdGhpcyBwYXJhbWV0ZXIgdW5kZXJnb2VzIEsmUiBhcmd1bWVudCBwcm9tb3Rpb24uCisgICAgdW5zaWduZWQgSXNLTlJQcm9tb3RlZCA6IDE7CisKKyAgICAvLy8gV2hldGhlciB0aGlzIHBhcmFtZXRlciBpcyBhbiBPYmpDIG1ldGhvZCBwYXJhbWV0ZXIgb3Igbm90LgorICAgIHVuc2lnbmVkIElzT2JqQ01ldGhvZFBhcmFtIDogMTsKKworICAgIC8vLyBJZiBJc09iakNNZXRob2RQYXJhbSwgYSBEZWNsOjpPYmpDRGVjbFF1YWxpZmllci4KKyAgICAvLy8gT3RoZXJ3aXNlLCB0aGUgbnVtYmVyIG9mIGZ1bmN0aW9uIHBhcmFtZXRlciBzY29wZXMgZW5jbG9zaW5nCisgICAgLy8vIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgc2NvcGUgaW4gd2hpY2ggdGhpcyBwYXJhbWV0ZXIgd2FzCisgICAgLy8vIGRlY2xhcmVkLgorICAgIHVuc2lnbmVkIFNjb3BlRGVwdGhPck9iakNRdWFscyA6IDc7CisKKyAgICAvLy8gVGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIHByZWNlZGluZyB0aGlzIHBhcmFtZXRlciBpbiB0aGUKKyAgICAvLy8gZnVuY3Rpb24gcGFyYW1ldGVyIHNjb3BlIGluIHdoaWNoIGl0IHdhcyBkZWNsYXJlZC4KKyAgICB1bnNpZ25lZCBQYXJhbWV0ZXJJbmRleCA6IE51bVBhcmFtZXRlckluZGV4Qml0czsKKyAgfTsKKworICBjbGFzcyBOb25QYXJtVmFyRGVjbEJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgICAgZnJpZW5kIGNsYXNzIEltcGxpY2l0UGFyYW1EZWNsOworICAgIGZyaWVuZCBjbGFzcyBWYXJEZWNsOworCisgICAgdW5zaWduZWQgOiBOdW1WYXJEZWNsQml0czsKKworICAgIC8vIEZJWE1FOiBXZSBuZWVkIHNvbWV0aGluZyBzaW1pbGFyIHRvIENYWFJlY29yZERlY2w6OkRlZmluaXRpb25EYXRhLgorICAgIC8vLyBXaGV0aGVyIHRoaXMgdmFyaWFibGUgaXMgYSBkZWZpbml0aW9uIHdoaWNoIHdhcyBkZW1vdGVkIGR1ZSB0bworICAgIC8vLyBtb2R1bGUgbWVyZ2UuCisgICAgdW5zaWduZWQgSXNUaGlzRGVjbGFyYXRpb25BRGVtb3RlZERlZmluaXRpb24gOiAxOworCisgICAgLy8vIFdoZXRoZXIgdGhpcyB2YXJpYWJsZSBpcyB0aGUgZXhjZXB0aW9uIHZhcmlhYmxlIGluIGEgQysrIGNhdGNoCisgICAgLy8vIG9yIGFuIE9iamVjdGl2ZS1DIEBjYXRjaCBzdGF0ZW1lbnQuCisgICAgdW5zaWduZWQgRXhjZXB0aW9uVmFyIDogMTsKKworICAgIC8vLyBXaGV0aGVyIHRoaXMgbG9jYWwgdmFyaWFibGUgY291bGQgYmUgYWxsb2NhdGVkIGluIHRoZSByZXR1cm4KKyAgICAvLy8gc2xvdCBvZiBpdHMgZnVuY3Rpb24sIGVuYWJsaW5nIHRoZSBuYW1lZCByZXR1cm4gdmFsdWUgb3B0aW1pemF0aW9uCisgICAgLy8vIChOUlZPKS4KKyAgICB1bnNpZ25lZCBOUlZPVmFyaWFibGUgOiAxOworCisgICAgLy8vIFdoZXRoZXIgdGhpcyB2YXJpYWJsZSBpcyB0aGUgZm9yLXJhbmdlLWRlY2xhcmF0aW9uIGluIGEgQysrMHgKKyAgICAvLy8gZm9yLXJhbmdlIHN0YXRlbWVudC4KKyAgICB1bnNpZ25lZCBDWFhGb3JSYW5nZURlY2wgOiAxOworCisgICAgLy8vIFdoZXRoZXIgdGhpcyB2YXJpYWJsZSBpcyB0aGUgZm9yLWluIGxvb3AgZGVjbGFyYXRpb24gaW4gT2JqZWN0aXZlLUMuCisgICAgdW5zaWduZWQgT2JqQ0ZvckRlY2wgOiAxOworCisgICAgLy8vIFdoZXRoZXIgdGhpcyB2YXJpYWJsZSBpcyBhbiBBUkMgcHNldWRvLV9fc3Ryb25nCisgICAgLy8vIHZhcmlhYmxlOyAgc2VlIGlzQVJDUHNldWRvU3Ryb25nKCkgZm9yIGRldGFpbHMuCisgICAgdW5zaWduZWQgQVJDUHNldWRvU3Ryb25nIDogMTsKKworICAgIC8vLyBXaGV0aGVyIHRoaXMgdmFyaWFibGUgaXMgKEMrKzF6KSBpbmxpbmUuCisgICAgdW5zaWduZWQgSXNJbmxpbmUgOiAxOworCisgICAgLy8vIFdoZXRoZXIgdGhpcyB2YXJpYWJsZSBoYXMgKEMrKzF6KSBpbmxpbmUgZXhwbGljaXRseSBzcGVjaWZpZWQuCisgICAgdW5zaWduZWQgSXNJbmxpbmVTcGVjaWZpZWQgOiAxOworCisgICAgLy8vIFdoZXRoZXIgdGhpcyB2YXJpYWJsZSBpcyAoQysrMHgpIGNvbnN0ZXhwci4KKyAgICB1bnNpZ25lZCBJc0NvbnN0ZXhwciA6IDE7CisKKyAgICAvLy8gV2hldGhlciB0aGlzIHZhcmlhYmxlIGlzIHRoZSBpbXBsaWNpdCB2YXJpYWJsZSBmb3IgYSBsYW1iZGEKKyAgICAvLy8gaW5pdC1jYXB0dXJlLgorICAgIHVuc2lnbmVkIElzSW5pdENhcHR1cmUgOiAxOworCisgICAgLy8vIFdoZXRoZXIgdGhpcyBsb2NhbCBleHRlcm4gdmFyaWFibGUncyBwcmV2aW91cyBkZWNsYXJhdGlvbiB3YXMKKyAgICAvLy8gZGVjbGFyZWQgaW4gdGhlIHNhbWUgYmxvY2sgc2NvcGUuIFRoaXMgY29udHJvbHMgd2hldGhlciB3ZSBzaG91bGQgbWVyZ2UKKyAgICAvLy8gdGhlIHR5cGUgb2YgdGhpcyBkZWNsYXJhdGlvbiB3aXRoIGl0cyBwcmV2aW91cyBkZWNsYXJhdGlvbi4KKyAgICB1bnNpZ25lZCBQcmV2aW91c0RlY2xJblNhbWVCbG9ja1Njb3BlIDogMTsKKworICAgIC8vLyBEZWZpbmVzIGtpbmQgb2YgdGhlIEltcGxpY2l0UGFyYW1EZWNsOiAndGhpcycsICdzZWxmJywgJ3Z0dCcsICdfY21kJyBvcgorICAgIC8vLyBzb21ldGhpbmcgZWxzZS4KKyAgICB1bnNpZ25lZCBJbXBsaWNpdFBhcmFtS2luZCA6IDM7CisgIH07CisKKyAgdW5pb24geworICAgIHVuc2lnbmVkIEFsbEJpdHM7CisgICAgVmFyRGVjbEJpdGZpZWxkcyBWYXJEZWNsQml0czsKKyAgICBQYXJtVmFyRGVjbEJpdGZpZWxkcyBQYXJtVmFyRGVjbEJpdHM7CisgICAgTm9uUGFybVZhckRlY2xCaXRmaWVsZHMgTm9uUGFybVZhckRlY2xCaXRzOworICB9OworCisgIFZhckRlY2woS2luZCBESywgQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJZExvYywgSWRlbnRpZmllckluZm8gKklkLCBRdWFsVHlwZSBULAorICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUSW5mbywgU3RvcmFnZUNsYXNzIFNDKTsKKworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZSA9IFJlZGVjbGFyYWJsZTxWYXJEZWNsPjsKKworICBWYXJEZWNsICpnZXROZXh0UmVkZWNsYXJhdGlvbkltcGwoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIGdldE5leHRSZWRlY2xhcmF0aW9uKCk7CisgIH0KKworICBWYXJEZWNsICpnZXRQcmV2aW91c0RlY2xJbXBsKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRQcmV2aW91c0RlY2woKTsKKyAgfQorCisgIFZhckRlY2wgKmdldE1vc3RSZWNlbnREZWNsSW1wbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0TW9zdFJlY2VudERlY2woKTsKKyAgfQorCitwdWJsaWM6CisgIHVzaW5nIHJlZGVjbF9yYW5nZSA9IHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xfcmFuZ2U7CisgIHVzaW5nIHJlZGVjbF9pdGVyYXRvciA9IHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xfaXRlcmF0b3I7CisKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHNfYmVnaW47CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xzX2VuZDsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHM7CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpnZXRQcmV2aW91c0RlY2w7CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpnZXRNb3N0UmVjZW50RGVjbDsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmlzRmlyc3REZWNsOworCisgIHN0YXRpYyBWYXJEZWNsICpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBJZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsIFF1YWxUeXBlIFQsIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlQ2xhc3MgUyk7CisKKyAgc3RhdGljIFZhckRlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZOworCisgIC8vLyBSZXR1cm5zIHRoZSBzdG9yYWdlIGNsYXNzIGFzIHdyaXR0ZW4gaW4gdGhlIHNvdXJjZS4gRm9yIHRoZQorICAvLy8gY29tcHV0ZWQgbGlua2FnZSBvZiBzeW1ib2wsIHNlZSBnZXRMaW5rYWdlLgorICBTdG9yYWdlQ2xhc3MgZ2V0U3RvcmFnZUNsYXNzKCkgY29uc3QgeworICAgIHJldHVybiAoU3RvcmFnZUNsYXNzKSBWYXJEZWNsQml0cy5TQ2xhc3M7CisgIH0KKyAgdm9pZCBzZXRTdG9yYWdlQ2xhc3MoU3RvcmFnZUNsYXNzIFNDKTsKKworICB2b2lkIHNldFRTQ1NwZWMoVGhyZWFkU3RvcmFnZUNsYXNzU3BlY2lmaWVyIFRTQykgeworICAgIFZhckRlY2xCaXRzLlRTQ1NwZWMgPSBUU0M7CisgICAgYXNzZXJ0KFZhckRlY2xCaXRzLlRTQ1NwZWMgPT0gVFNDICYmICJ0cnVuY2F0aW9uIik7CisgIH0KKyAgVGhyZWFkU3RvcmFnZUNsYXNzU3BlY2lmaWVyIGdldFRTQ1NwZWMoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRocmVhZFN0b3JhZ2VDbGFzc1NwZWNpZmllcj4oVmFyRGVjbEJpdHMuVFNDU3BlYyk7CisgIH0KKyAgVExTS2luZCBnZXRUTFNLaW5kKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhIHZhcmlhYmxlIHdpdGggZnVuY3Rpb24gc2NvcGUgaXMgYSBub24tc3RhdGljIGxvY2FsCisgIC8vLyB2YXJpYWJsZS4KKyAgYm9vbCBoYXNMb2NhbFN0b3JhZ2UoKSBjb25zdCB7CisgICAgaWYgKGdldFN0b3JhZ2VDbGFzcygpID09IFNDX05vbmUpIHsKKyAgICAgIC8vIE9wZW5DTCB2MS4yIHM2LjUuMzogVGhlIF9fY29uc3RhbnQgb3IgY29uc3RhbnQgYWRkcmVzcyBzcGFjZSBuYW1lIGlzCisgICAgICAvLyB1c2VkIHRvIGRlc2NyaWJlIHZhcmlhYmxlcyBhbGxvY2F0ZWQgaW4gZ2xvYmFsIG1lbW9yeSBhbmQgd2hpY2ggYXJlCisgICAgICAvLyBhY2Nlc3NlZCBpbnNpZGUgYSBrZXJuZWwocykgYXMgcmVhZC1vbmx5IHZhcmlhYmxlcy4gQXMgc3VjaCwgdmFyaWFibGVzCisgICAgICAvLyBpbiBjb25zdGFudCBhZGRyZXNzIHNwYWNlIGNhbm5vdCBoYXZlIGxvY2FsIHN0b3JhZ2UuCisgICAgICBpZiAoZ2V0VHlwZSgpLmdldEFkZHJlc3NTcGFjZSgpID09IExhbmdBUzo6b3BlbmNsX2NvbnN0YW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAvLyBTZWNvbmQgY2hlY2sgaXMgZm9yIEMrKzExIFtkY2wuc3RjXXA0LgorICAgICAgcmV0dXJuICFpc0ZpbGVWYXJEZWNsKCkgJiYgZ2V0VFNDU3BlYygpID09IFRTQ1NfdW5zcGVjaWZpZWQ7CisgICAgfQorCisgICAgLy8gR2xvYmFsIE5hbWVkIFJlZ2lzdGVyIChHTlUgZXh0ZW5zaW9uKQorICAgIGlmIChnZXRTdG9yYWdlQ2xhc3MoKSA9PSBTQ19SZWdpc3RlciAmJiAhaXNMb2NhbFZhckRlY2xPclBhcm0oKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFJldHVybiB0cnVlIGZvcjogIEF1dG8sIFJlZ2lzdGVyLgorICAgIC8vIFJldHVybiBmYWxzZSBmb3I6IEV4dGVybiwgU3RhdGljLCBQcml2YXRlRXh0ZXJuLCBPcGVuQ0xXb3JrR3JvdXBMb2NhbC4KKworICAgIHJldHVybiBnZXRTdG9yYWdlQ2xhc3MoKSA+PSBTQ19BdXRvOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhIHZhcmlhYmxlIHdpdGggZnVuY3Rpb24gc2NvcGUgaXMgYSBzdGF0aWMgbG9jYWwKKyAgLy8vIHZhcmlhYmxlLgorICBib29sIGlzU3RhdGljTG9jYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRTdG9yYWdlQ2xhc3MoKSA9PSBTQ19TdGF0aWMgfHwKKyAgICAgICAgICAgIC8vIEMrKzExIFtkY2wuc3RjXXA0CisgICAgICAgICAgICAoZ2V0U3RvcmFnZUNsYXNzKCkgPT0gU0NfTm9uZSAmJiBnZXRUU0NTcGVjKCkgPT0gVFNDU190aHJlYWRfbG9jYWwpKQorICAgICAgJiYgIWlzRmlsZVZhckRlY2woKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYSB2YXJpYWJsZSBoYXMgZXh0ZXJuIG9yIF9fcHJpdmF0ZV9leHRlcm5fXworICAvLy8gc3RvcmFnZS4KKyAgYm9vbCBoYXNFeHRlcm5hbFN0b3JhZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN0b3JhZ2VDbGFzcygpID09IFNDX0V4dGVybiB8fAorICAgICAgICAgICBnZXRTdG9yYWdlQ2xhc3MoKSA9PSBTQ19Qcml2YXRlRXh0ZXJuOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBmb3IgYWxsIHZhcmlhYmxlcyB0aGF0IGRvIG5vdCBoYXZlIGxvY2FsIHN0b3JhZ2UuCisgIC8vLworICAvLy8gVGhpcyBpbmNsdWRlcyBhbGwgZ2xvYmFsIHZhcmlhYmxlcyBhcyB3ZWxsIGFzIHN0YXRpYyB2YXJpYWJsZXMgZGVjbGFyZWQKKyAgLy8vIHdpdGhpbiBhIGZ1bmN0aW9uLgorICBib29sIGhhc0dsb2JhbFN0b3JhZ2UoKSBjb25zdCB7IHJldHVybiAhaGFzTG9jYWxTdG9yYWdlKCk7IH0KKworICAvLy8gR2V0IHRoZSBzdG9yYWdlIGR1cmF0aW9uIG9mIHRoaXMgdmFyaWFibGUsIHBlciBDKysgW2Jhc2ljLnN0Y10uCisgIFN0b3JhZ2VEdXJhdGlvbiBnZXRTdG9yYWdlRHVyYXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0xvY2FsU3RvcmFnZSgpID8gU0RfQXV0b21hdGljIDoKKyAgICAgICAgICAgZ2V0VFNDU3BlYygpID8gU0RfVGhyZWFkIDogU0RfU3RhdGljOworICB9CisKKyAgLy8vIENvbXB1dGUgdGhlIGxhbmd1YWdlIGxpbmthZ2UuCisgIExhbmd1YWdlTGlua2FnZSBnZXRMYW5ndWFnZUxpbmthZ2UoKSBjb25zdDsKKworICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgdmFyaWFibGUgaXMgYSB2YXJpYWJsZSB3aXRoIGV4dGVybmFsLCBDIGxpbmthZ2UuCisgIGJvb2wgaXNFeHRlcm5DKCkgY29uc3Q7CisKKyAgLy8vIERldGVybWluZXMgd2hldGhlciB0aGlzIHZhcmlhYmxlJ3MgY29udGV4dCBpcywgb3IgaXMgbmVzdGVkIHdpdGhpbiwKKyAgLy8vIGEgQysrIGV4dGVybiAiQyIgbGlua2FnZSBzcGVjLgorICBib29sIGlzSW5FeHRlcm5DQ29udGV4dCgpIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyB2YXJpYWJsZSdzIGNvbnRleHQgaXMsIG9yIGlzIG5lc3RlZCB3aXRoaW4sCisgIC8vLyBhIEMrKyBleHRlcm4gIkMrKyIgbGlua2FnZSBzcGVjLgorICBib29sIGlzSW5FeHRlcm5DWFhDb250ZXh0KCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBmb3IgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zIG90aGVyIHRoYW4gcGFyYW1ldGVycy4KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGluY2x1ZGVzIHN0YXRpYyB2YXJpYWJsZXMgaW5zaWRlIG9mIGZ1bmN0aW9ucy4gSXQgYWxzbworICAvLy8gaW5jbHVkZXMgdmFyaWFibGVzIGluc2lkZSBibG9ja3MuCisgIC8vLworICAvLy8gICB2b2lkIGZvbygpIHsgaW50IHg7IHN0YXRpYyBpbnQgeTsgZXh0ZXJuIGludCB6OyB9CisgIGJvb2wgaXNMb2NhbFZhckRlY2woKSBjb25zdCB7CisgICAgaWYgKGdldEtpbmQoKSAhPSBEZWNsOjpWYXIgJiYgZ2V0S2luZCgpICE9IERlY2w6OkRlY29tcG9zaXRpb24pCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGNvbnN0IERlY2xDb250ZXh0ICpEQyA9IGdldExleGljYWxEZWNsQ29udGV4dCgpKQorICAgICAgcmV0dXJuIERDLT5nZXRSZWRlY2xDb250ZXh0KCktPmlzRnVuY3Rpb25Pck1ldGhvZCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBTaW1pbGFyIHRvIGlzTG9jYWxWYXJEZWNsIGJ1dCBhbHNvIGluY2x1ZGVzIHBhcmFtZXRlcnMuCisgIGJvb2wgaXNMb2NhbFZhckRlY2xPclBhcm0oKSBjb25zdCB7CisgICAgcmV0dXJuIGlzTG9jYWxWYXJEZWNsKCkgfHwgZ2V0S2luZCgpID09IERlY2w6OlBhcm1WYXI7CisgIH0KKworICAvLy8gU2ltaWxhciB0byBpc0xvY2FsVmFyRGVjbCwgYnV0IGV4Y2x1ZGVzIHZhcmlhYmxlcyBkZWNsYXJlZCBpbiBibG9ja3MuCisgIGJvb2wgaXNGdW5jdGlvbk9yTWV0aG9kVmFyRGVjbCgpIGNvbnN0IHsKKyAgICBpZiAoZ2V0S2luZCgpICE9IERlY2w6OlZhciAmJiBnZXRLaW5kKCkgIT0gRGVjbDo6RGVjb21wb3NpdGlvbikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBEZWNsQ29udGV4dCAqREMgPSBnZXRMZXhpY2FsRGVjbENvbnRleHQoKS0+Z2V0UmVkZWNsQ29udGV4dCgpOworICAgIHJldHVybiBEQy0+aXNGdW5jdGlvbk9yTWV0aG9kKCkgJiYgREMtPmdldERlY2xLaW5kKCkgIT0gRGVjbDo6QmxvY2s7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGF0aWMgZGF0YSBtZW1iZXIuCisgIC8vLworICAvLy8gVGhpcyB3aWxsIG9ubHkgYmUgdHJ1ZSBpbiBDKyssIGFuZCBhcHBsaWVzIHRvLCBlLmcuLCB0aGUKKyAgLy8vIHZhcmlhYmxlICd4JyBpbjoKKyAgLy8vIFxjb2RlCisgIC8vLyBzdHJ1Y3QgUyB7CisgIC8vLyAgIHN0YXRpYyBpbnQgeDsKKyAgLy8vIH07CisgIC8vLyBcZW5kY29kZQorICBib29sIGlzU3RhdGljRGF0YU1lbWJlcigpIGNvbnN0IHsKKyAgICAvLyBJZiBpdCB3YXNuJ3Qgc3RhdGljLCBpdCB3b3VsZCBiZSBhIEZpZWxkRGVjbC4KKyAgICByZXR1cm4gZ2V0S2luZCgpICE9IERlY2w6OlBhcm1WYXIgJiYgZ2V0RGVjbENvbnRleHQoKS0+aXNSZWNvcmQoKTsKKyAgfQorCisgIFZhckRlY2wgKmdldENhbm9uaWNhbERlY2woKSBvdmVycmlkZTsKKyAgY29uc3QgVmFyRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxWYXJEZWNsKj4odGhpcyktPmdldENhbm9uaWNhbERlY2woKTsKKyAgfQorCisgIGVudW0gRGVmaW5pdGlvbktpbmQgeworICAgIC8vLyBUaGlzIGRlY2xhcmF0aW9uIGlzIG9ubHkgYSBkZWNsYXJhdGlvbi4KKyAgICBEZWNsYXJhdGlvbk9ubHksCisKKyAgICAvLy8gVGhpcyBkZWNsYXJhdGlvbiBpcyBhIHRlbnRhdGl2ZSBkZWZpbml0aW9uLgorICAgIFRlbnRhdGl2ZURlZmluaXRpb24sCisKKyAgICAvLy8gVGhpcyBkZWNsYXJhdGlvbiBpcyBkZWZpbml0ZWx5IGEgZGVmaW5pdGlvbi4KKyAgICBEZWZpbml0aW9uCisgIH07CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgdGhpcyBkZWNsYXJhdGlvbiBpcyBhIGRlZmluaXRpb24uIElmIHRoaXMgY291bGQgYmUKKyAgLy8vIGEgdGVudGF0aXZlIGRlZmluaXRpb24gKGluIEMpLCBkb24ndCBjaGVjayB3aGV0aGVyIHRoZXJlJ3MgYW4gb3ZlcnJpZGluZworICAvLy8gZGVmaW5pdGlvbi4KKyAgRGVmaW5pdGlvbktpbmQgaXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbihBU1RDb250ZXh0ICYpIGNvbnN0OworICBEZWZpbml0aW9uS2luZCBpc1RoaXNEZWNsYXJhdGlvbkFEZWZpbml0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBpc1RoaXNEZWNsYXJhdGlvbkFEZWZpbml0aW9uKGdldEFTVENvbnRleHQoKSk7CisgIH0KKworICAvLy8gQ2hlY2sgd2hldGhlciB0aGlzIHZhcmlhYmxlIGlzIGRlZmluZWQgaW4gdGhpcyB0cmFuc2xhdGlvbiB1bml0LgorICBEZWZpbml0aW9uS2luZCBoYXNEZWZpbml0aW9uKEFTVENvbnRleHQgJikgY29uc3Q7CisgIERlZmluaXRpb25LaW5kIGhhc0RlZmluaXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0RlZmluaXRpb24oZ2V0QVNUQ29udGV4dCgpKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIHRlbnRhdGl2ZSBkZWZpbml0aW9uIHRoYXQgYWN0cyBhcyB0aGUgcmVhbCBkZWZpbml0aW9uIGluIGEgVFUuCisgIC8vLyBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgYSBwcm9wZXIgZGVmaW5pdGlvbiBhdmFpbGFibGUuCisgIFZhckRlY2wgKmdldEFjdGluZ0RlZmluaXRpb24oKTsKKyAgY29uc3QgVmFyRGVjbCAqZ2V0QWN0aW5nRGVmaW5pdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxWYXJEZWNsKj4odGhpcyktPmdldEFjdGluZ0RlZmluaXRpb24oKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIHJlYWwgKG5vdCBqdXN0IHRlbnRhdGl2ZSkgZGVmaW5pdGlvbiBmb3IgdGhpcyBkZWNsYXJhdGlvbi4KKyAgVmFyRGVjbCAqZ2V0RGVmaW5pdGlvbihBU1RDb250ZXh0ICYpOworICBjb25zdCBWYXJEZWNsICpnZXREZWZpbml0aW9uKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxWYXJEZWNsKj4odGhpcyktPmdldERlZmluaXRpb24oQyk7CisgIH0KKyAgVmFyRGVjbCAqZ2V0RGVmaW5pdGlvbigpIHsKKyAgICByZXR1cm4gZ2V0RGVmaW5pdGlvbihnZXRBU1RDb250ZXh0KCkpOworICB9CisgIGNvbnN0IFZhckRlY2wgKmdldERlZmluaXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFyRGVjbCo+KHRoaXMpLT5nZXREZWZpbml0aW9uKCk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBvciB3YXMgaW5zdGFudGlhdGVkIGZyb20gYW4gb3V0LW9mLWxpbmUKKyAgLy8vIGRlZmluaXRpb24gb2YgYSBzdGF0aWMgZGF0YSBtZW1iZXIuCisgIGJvb2wgaXNPdXRPZkxpbmUoKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gUmV0dXJucyB0cnVlIGZvciBmaWxlIHNjb3BlZCB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KKyAgYm9vbCBpc0ZpbGVWYXJEZWNsKCkgY29uc3QgeworICAgIEtpbmQgSyA9IGdldEtpbmQoKTsKKyAgICBpZiAoSyA9PSBQYXJtVmFyIHx8IEsgPT0gSW1wbGljaXRQYXJhbSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChnZXRMZXhpY2FsRGVjbENvbnRleHQoKS0+Z2V0UmVkZWNsQ29udGV4dCgpLT5pc0ZpbGVDb250ZXh0KCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmIChpc1N0YXRpY0RhdGFNZW1iZXIoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIEdldCB0aGUgaW5pdGlhbGl6ZXIgZm9yIHRoaXMgdmFyaWFibGUsIG5vIG1hdHRlciB3aGljaAorICAvLy8gZGVjbGFyYXRpb24gaXQgaXMgYXR0YWNoZWQgdG8uCisgIGNvbnN0IEV4cHIgKmdldEFueUluaXRpYWxpemVyKCkgY29uc3QgeworICAgIGNvbnN0IFZhckRlY2wgKkQ7CisgICAgcmV0dXJuIGdldEFueUluaXRpYWxpemVyKEQpOworICB9CisKKyAgLy8vIEdldCB0aGUgaW5pdGlhbGl6ZXIgZm9yIHRoaXMgdmFyaWFibGUsIG5vIG1hdHRlciB3aGljaAorICAvLy8gZGVjbGFyYXRpb24gaXQgaXMgYXR0YWNoZWQgdG8uIEFsc28gZ2V0IHRoYXQgZGVjbGFyYXRpb24uCisgIGNvbnN0IEV4cHIgKmdldEFueUluaXRpYWxpemVyKGNvbnN0IFZhckRlY2wgKiZEKSBjb25zdDsKKworICBib29sIGhhc0luaXQoKSBjb25zdDsKKyAgY29uc3QgRXhwciAqZ2V0SW5pdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxWYXJEZWNsICo+KHRoaXMpLT5nZXRJbml0KCk7CisgIH0KKyAgRXhwciAqZ2V0SW5pdCgpOworCisgIC8vLyBSZXRyaWV2ZSB0aGUgYWRkcmVzcyBvZiB0aGUgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbi4KKyAgU3RtdCAqKmdldEluaXRBZGRyZXNzKCk7CisKKyAgdm9pZCBzZXRJbml0KEV4cHIgKkkpOworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHZhcmlhYmxlJ3MgdmFsdWUgY2FuIGJlIHVzZWQgaW4gYQorICAvLy8gY29uc3RhbnQgZXhwcmVzc2lvbiwgYWNjb3JkaW5nIHRvIHRoZSByZWxldmFudCBsYW5ndWFnZSBzdGFuZGFyZC4KKyAgLy8vIFRoaXMgb25seSBjaGVja3MgcHJvcGVydGllcyBvZiB0aGUgZGVjbGFyYXRpb24sIGFuZCBkb2VzIG5vdCBjaGVjaworICAvLy8gd2hldGhlciB0aGUgaW5pdGlhbGl6ZXIgaXMgaW4gZmFjdCBhIGNvbnN0YW50IGV4cHJlc3Npb24uCisgIGJvb2wgaXNVc2FibGVJbkNvbnN0YW50RXhwcmVzc2lvbnMoQVNUQ29udGV4dCAmQykgY29uc3Q7CisKKyAgRXZhbHVhdGVkU3RtdCAqZW5zdXJlRXZhbHVhdGVkU3RtdCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQXR0ZW1wdCB0byBldmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIGluaXRpYWxpemVyIGF0dGFjaGVkIHRvIHRoaXMKKyAgLy8vIGRlY2xhcmF0aW9uLCBhbmQgcHJvZHVjZSBub3RlcyBleHBsYWluaW5nIHdoeSBpdCBjYW5ub3QgYmUgZXZhbHVhdGVkIG9yIGlzCisgIC8vLyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uLiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdmFsdWUgaWYgZXZhbHVhdGlvbgorICAvLy8gc3VjY2VlZGVkLCAwIG90aGVyd2lzZS4KKyAgQVBWYWx1ZSAqZXZhbHVhdGVWYWx1ZSgpIGNvbnN0OworICBBUFZhbHVlICpldmFsdWF0ZVZhbHVlKFNtYWxsVmVjdG9ySW1wbDxQYXJ0aWFsRGlhZ25vc3RpY0F0PiAmTm90ZXMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBhbHJlYWR5LWV2YWx1YXRlZCB2YWx1ZSBvZiB0aGlzIHZhcmlhYmxlJ3MKKyAgLy8vIGluaXRpYWxpemVyLCBvciBOVUxMIGlmIHRoZSB2YWx1ZSBpcyBub3QgeWV0IGtub3duLiBSZXR1cm5zIHBvaW50ZXIKKyAgLy8vIHRvIHVudHlwZWQgQVBWYWx1ZSBpZiB0aGUgdmFsdWUgY291bGQgbm90IGJlIGV2YWx1YXRlZC4KKyAgQVBWYWx1ZSAqZ2V0RXZhbHVhdGVkVmFsdWUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciBpdCBpcyBhbHJlYWR5IGtub3duIHdoZXRoZXIgdGhlCisgIC8vLyBpbml0aWFsaXplciBpcyBhbiBpbnRlZ3JhbCBjb25zdGFudCBleHByZXNzaW9uIG9yIG5vdC4KKyAgYm9vbCBpc0luaXRLbm93bklDRSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBpbml0aWFsaXplciBpcyBhbiBpbnRlZ3JhbCBjb25zdGFudAorICAvLy8gZXhwcmVzc2lvbiwgb3IgaW4gQysrMTEsIHdoZXRoZXIgdGhlIGluaXRpYWxpemVyIGlzIGEgY29uc3RhbnQKKyAgLy8vIGV4cHJlc3Npb24uCisgIC8vLworICAvLy8gXHByZSBpc0luaXRLbm93bklDRSgpCisgIGJvb2wgaXNJbml0SUNFKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGluaXRpYWxpemVyIGF0dGFjaGVkIHRvIHRoaXMKKyAgLy8vIGRlY2xhcmF0aW9uIGlzIGFuIGludGVncmFsIGNvbnN0YW50IGV4cHJlc3Npb24uCisgIGJvb2wgY2hlY2tJbml0SXNJQ0UoKSBjb25zdDsKKworICB2b2lkIHNldEluaXRTdHlsZShJbml0aWFsaXphdGlvblN0eWxlIFN0eWxlKSB7CisgICAgVmFyRGVjbEJpdHMuSW5pdFN0eWxlID0gU3R5bGU7CisgIH0KKworICAvLy8gXGJyaWVmIFRoZSBzdHlsZSBvZiBpbml0aWFsaXphdGlvbiBmb3IgdGhpcyBkZWNsYXJhdGlvbi4KKyAgLy8vCisgIC8vLyBDLXN0eWxlIGluaXRpYWxpemF0aW9uIGlzICJpbnQgeCA9IDE7Ii4gQ2FsbC1zdHlsZSBpbml0aWFsaXphdGlvbiBpcworICAvLy8gYSBDKys5OCBkaXJlY3QtaW5pdGlhbGl6ZXIsIGUuZy4gImludCB4KDEpOyIuIFRoZSBJbml0IGV4cHJlc3Npb24gd2lsbCBiZQorICAvLy8gdGhlIGV4cHJlc3Npb24gaW5zaWRlIHRoZSBwYXJlbnMgb3IgYSAiQ2xhc3NUeXBlKGEsYixjKSIgY2xhc3MgY29uc3RydWN0b3IKKyAgLy8vIGV4cHJlc3Npb24gZm9yIGNsYXNzIHR5cGVzLiBMaXN0LXN0eWxlIGluaXRpYWxpemF0aW9uIGlzIEMrKzExIHN5bnRheCwKKyAgLy8vIGUuZy4gImludCB4ezF9OyIuIENsaWVudHMgY2FuIGRpc3Rpbmd1aXNoIGJldHdlZW4gZGlmZmVyZW50IGZvcm1zIG9mCisgIC8vLyBpbml0aWFsaXphdGlvbiBieSBjaGVja2luZyB0aGlzIHZhbHVlLiBJbiBwYXJ0aWN1bGFyLCAiaW50IHggPSB7MX07IiBpcworICAvLy8gQy1zdHlsZSwgImludCB4KHsxfSkiIGlzIGNhbGwtc3R5bGUsIGFuZCAiaW50IHh7MX07IiBpcyBsaXN0LXN0eWxlOyB0aGUKKyAgLy8vIEluaXQgZXhwcmVzc2lvbiBpbiBhbGwgdGhyZWUgY2FzZXMgaXMgYW4gSW5pdExpc3RFeHByLgorICBJbml0aWFsaXphdGlvblN0eWxlIGdldEluaXRTdHlsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SW5pdGlhbGl6YXRpb25TdHlsZT4oVmFyRGVjbEJpdHMuSW5pdFN0eWxlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgaW5pdGlhbGl6ZXIgaXMgYSBkaXJlY3QtaW5pdGlhbGl6ZXIgKGxpc3Qgb3IgY2FsbCkuCisgIGJvb2wgaXNEaXJlY3RJbml0KCkgY29uc3QgeworICAgIHJldHVybiBnZXRJbml0U3R5bGUoKSAhPSBDSW5pdDsKKyAgfQorCisgIC8vLyBcYnJpZWYgSWYgdGhpcyBkZWZpbml0aW9uIHNob3VsZCBwcmV0ZW5kIHRvIGJlIGEgZGVjbGFyYXRpb24uCisgIGJvb2wgaXNUaGlzRGVjbGFyYXRpb25BRGVtb3RlZERlZmluaXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGlzYTxQYXJtVmFyRGVjbD4odGhpcykgPyBmYWxzZSA6CisgICAgICBOb25QYXJtVmFyRGVjbEJpdHMuSXNUaGlzRGVjbGFyYXRpb25BRGVtb3RlZERlZmluaXRpb247CisgIH0KKworICAvLy8gXGJyaWVmIFRoaXMgaXMgYSBkZWZpbml0aW9uIHdoaWNoIHNob3VsZCBiZSBkZW1vdGVkIHRvIGEgZGVjbGFyYXRpb24uCisgIC8vLworICAvLy8gSW4gc29tZSBjYXNlcyAobW9zdGx5IG1vZHVsZSBtZXJnaW5nKSB3ZSBjYW4gZW5kIHVwIHdpdGggdHdvIHZpc2libGUKKyAgLy8vIGRlZmluaXRpb25zIG9uZSBvZiB3aGljaCBuZWVkcyB0byBiZSBkZW1vdGVkIHRvIGEgZGVjbGFyYXRpb24gdG8ga2VlcAorICAvLy8gdGhlIEFTVCBpbnZhcmlhbnRzLgorICB2b2lkIGRlbW90ZVRoaXNEZWZpbml0aW9uVG9EZWNsYXJhdGlvbigpIHsKKyAgICBhc3NlcnQoaXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpICYmICJOb3QgYSBkZWZpbml0aW9uISIpOworICAgIGFzc2VydCghaXNhPFBhcm1WYXJEZWNsPih0aGlzKSAmJiAiQ2Fubm90IGRlbW90ZSBQYXJtVmFyRGVjbHMhIik7CisgICAgTm9uUGFybVZhckRlY2xCaXRzLklzVGhpc0RlY2xhcmF0aW9uQURlbW90ZWREZWZpbml0aW9uID0gMTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB2YXJpYWJsZSBpcyB0aGUgZXhjZXB0aW9uIHZhcmlhYmxlIGluIGEKKyAgLy8vIEMrKyBjYXRjaCBzdGF0ZW1lbXQgb3IgYW4gT2JqZWN0aXZlLUMgXEBjYXRjaCBzdGF0ZW1lbnQuCisgIGJvb2wgaXNFeGNlcHRpb25WYXJpYWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNhPFBhcm1WYXJEZWNsPih0aGlzKSA/IGZhbHNlIDogTm9uUGFybVZhckRlY2xCaXRzLkV4Y2VwdGlvblZhcjsKKyAgfQorICB2b2lkIHNldEV4Y2VwdGlvblZhcmlhYmxlKGJvb2wgRVYpIHsKKyAgICBhc3NlcnQoIWlzYTxQYXJtVmFyRGVjbD4odGhpcykpOworICAgIE5vblBhcm1WYXJEZWNsQml0cy5FeGNlcHRpb25WYXIgPSBFVjsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBsb2NhbCB2YXJpYWJsZSBjYW4gYmUgdXNlZCB3aXRoIHRoZSBuYW1lZAorICAvLy8gcmV0dXJuIHZhbHVlIG9wdGltaXphdGlvbiAoTlJWTykuCisgIC8vLworICAvLy8gVGhlIG5hbWVkIHJldHVybiB2YWx1ZSBvcHRpbWl6YXRpb24gKE5SVk8pIHdvcmtzIGJ5IG1hcmtpbmcgY2VydGFpbgorICAvLy8gbm9uLXZvbGF0aWxlIGxvY2FsIHZhcmlhYmxlcyBvZiBjbGFzcyB0eXBlIGFzIE5SVk8gb2JqZWN0cy4gVGhlc2UKKyAgLy8vIGxvY2FscyBjYW4gYmUgYWxsb2NhdGVkIHdpdGhpbiB0aGUgcmV0dXJuIHNsb3Qgb2YgdGhlaXIgY29udGFpbmluZworICAvLy8gZnVuY3Rpb24sIGluIHdoaWNoIGNhc2UgdGhlcmUgaXMgbm8gbmVlZCB0byBjb3B5IHRoZSBvYmplY3QgdG8gdGhlCisgIC8vLyByZXR1cm4gc2xvdCB3aGVuIHJldHVybmluZyBmcm9tIHRoZSBmdW5jdGlvbi4gV2l0aGluIHRoZSBmdW5jdGlvbiBib2R5LAorICAvLy8gZWFjaCByZXR1cm4gdGhhdCByZXR1cm5zIHRoZSBOUlZPIG9iamVjdCB3aWxsIGhhdmUgdGhpcyB2YXJpYWJsZSBhcyBpdHMKKyAgLy8vIE5SVk8gY2FuZGlkYXRlLgorICBib29sIGlzTlJWT1ZhcmlhYmxlKCkgY29uc3QgeworICAgIHJldHVybiBpc2E8UGFybVZhckRlY2w+KHRoaXMpID8gZmFsc2UgOiBOb25QYXJtVmFyRGVjbEJpdHMuTlJWT1ZhcmlhYmxlOworICB9CisgIHZvaWQgc2V0TlJWT1ZhcmlhYmxlKGJvb2wgTlJWTykgeworICAgIGFzc2VydCghaXNhPFBhcm1WYXJEZWNsPih0aGlzKSk7CisgICAgTm9uUGFybVZhckRlY2xCaXRzLk5SVk9WYXJpYWJsZSA9IE5SVk87CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgdmFyaWFibGUgaXMgdGhlIGZvci1yYW5nZS1kZWNsYXJhdGlvbiBpbgorICAvLy8gYSBDKysweCBmb3ItcmFuZ2Ugc3RhdGVtZW50LgorICBib29sIGlzQ1hYRm9yUmFuZ2VEZWNsKCkgY29uc3QgeworICAgIHJldHVybiBpc2E8UGFybVZhckRlY2w+KHRoaXMpID8gZmFsc2UgOiBOb25QYXJtVmFyRGVjbEJpdHMuQ1hYRm9yUmFuZ2VEZWNsOworICB9CisgIHZvaWQgc2V0Q1hYRm9yUmFuZ2VEZWNsKGJvb2wgRlJEKSB7CisgICAgYXNzZXJ0KCFpc2E8UGFybVZhckRlY2w+KHRoaXMpKTsKKyAgICBOb25QYXJtVmFyRGVjbEJpdHMuQ1hYRm9yUmFuZ2VEZWNsID0gRlJEOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHZhcmlhYmxlIGlzIGEgZm9yLWxvb3AgZGVjbGFyYXRpb24gZm9yIGEKKyAgLy8vIGZvci1pbiBzdGF0ZW1lbnQgaW4gT2JqZWN0aXZlLUMuCisgIGJvb2wgaXNPYmpDRm9yRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9uUGFybVZhckRlY2xCaXRzLk9iakNGb3JEZWNsOworICB9CisKKyAgdm9pZCBzZXRPYmpDRm9yRGVjbChib29sIEZSRCkgeworICAgIE5vblBhcm1WYXJEZWNsQml0cy5PYmpDRm9yRGVjbCA9IEZSRDsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB2YXJpYWJsZSBpcyBhbiBBUkMgcHNldWRvLV9fc3Ryb25nCisgIC8vLyB2YXJpYWJsZS4gIEEgcHNldWRvLV9fc3Ryb25nIHZhcmlhYmxlIGhhcyBhIF9fc3Ryb25nLXF1YWxpZmllZAorICAvLy8gdHlwZSBidXQgZG9lcyBub3QgYWN0dWFsbHkgcmV0YWluIHRoZSBvYmplY3Qgd3JpdHRlbiBpbnRvIGl0LgorICAvLy8gR2VuZXJhbGx5IHN1Y2ggdmFyaWFibGVzIGFyZSBhbHNvICdjb25zdCcgZm9yIHNhZmV0eS4KKyAgYm9vbCBpc0FSQ1BzZXVkb1N0cm9uZygpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNhPFBhcm1WYXJEZWNsPih0aGlzKSA/IGZhbHNlIDogTm9uUGFybVZhckRlY2xCaXRzLkFSQ1BzZXVkb1N0cm9uZzsKKyAgfQorICB2b2lkIHNldEFSQ1BzZXVkb1N0cm9uZyhib29sIHBzKSB7CisgICAgYXNzZXJ0KCFpc2E8UGFybVZhckRlY2w+KHRoaXMpKTsKKyAgICBOb25QYXJtVmFyRGVjbEJpdHMuQVJDUHNldWRvU3Ryb25nID0gcHM7CisgIH0KKworICAvLy8gV2hldGhlciB0aGlzIHZhcmlhYmxlIGlzIChDKysxeikgaW5saW5lLgorICBib29sIGlzSW5saW5lKCkgY29uc3QgeworICAgIHJldHVybiBpc2E8UGFybVZhckRlY2w+KHRoaXMpID8gZmFsc2UgOiBOb25QYXJtVmFyRGVjbEJpdHMuSXNJbmxpbmU7CisgIH0KKyAgYm9vbCBpc0lubGluZVNwZWNpZmllZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNhPFBhcm1WYXJEZWNsPih0aGlzKSA/IGZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOb25QYXJtVmFyRGVjbEJpdHMuSXNJbmxpbmVTcGVjaWZpZWQ7CisgIH0KKyAgdm9pZCBzZXRJbmxpbmVTcGVjaWZpZWQoKSB7CisgICAgYXNzZXJ0KCFpc2E8UGFybVZhckRlY2w+KHRoaXMpKTsKKyAgICBOb25QYXJtVmFyRGVjbEJpdHMuSXNJbmxpbmUgPSB0cnVlOworICAgIE5vblBhcm1WYXJEZWNsQml0cy5Jc0lubGluZVNwZWNpZmllZCA9IHRydWU7CisgIH0KKyAgdm9pZCBzZXRJbXBsaWNpdGx5SW5saW5lKCkgeworICAgIGFzc2VydCghaXNhPFBhcm1WYXJEZWNsPih0aGlzKSk7CisgICAgTm9uUGFybVZhckRlY2xCaXRzLklzSW5saW5lID0gdHJ1ZTsKKyAgfQorCisgIC8vLyBXaGV0aGVyIHRoaXMgdmFyaWFibGUgaXMgKEMrKzExKSBjb25zdGV4cHIuCisgIGJvb2wgaXNDb25zdGV4cHIoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzYTxQYXJtVmFyRGVjbD4odGhpcykgPyBmYWxzZSA6IE5vblBhcm1WYXJEZWNsQml0cy5Jc0NvbnN0ZXhwcjsKKyAgfQorICB2b2lkIHNldENvbnN0ZXhwcihib29sIElDKSB7CisgICAgYXNzZXJ0KCFpc2E8UGFybVZhckRlY2w+KHRoaXMpKTsKKyAgICBOb25QYXJtVmFyRGVjbEJpdHMuSXNDb25zdGV4cHIgPSBJQzsKKyAgfQorCisgIC8vLyBXaGV0aGVyIHRoaXMgdmFyaWFibGUgaXMgdGhlIGltcGxpY2l0IHZhcmlhYmxlIGZvciBhIGxhbWJkYSBpbml0LWNhcHR1cmUuCisgIGJvb2wgaXNJbml0Q2FwdHVyZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNhPFBhcm1WYXJEZWNsPih0aGlzKSA/IGZhbHNlIDogTm9uUGFybVZhckRlY2xCaXRzLklzSW5pdENhcHR1cmU7CisgIH0KKyAgdm9pZCBzZXRJbml0Q2FwdHVyZShib29sIElDKSB7CisgICAgYXNzZXJ0KCFpc2E8UGFybVZhckRlY2w+KHRoaXMpKTsKKyAgICBOb25QYXJtVmFyRGVjbEJpdHMuSXNJbml0Q2FwdHVyZSA9IElDOworICB9CisKKyAgLy8vIFdoZXRoZXIgdGhpcyBsb2NhbCBleHRlcm4gdmFyaWFibGUgZGVjbGFyYXRpb24ncyBwcmV2aW91cyBkZWNsYXJhdGlvbgorICAvLy8gd2FzIGRlY2xhcmVkIGluIHRoZSBzYW1lIGJsb2NrIHNjb3BlLiBPbmx5IGNvcnJlY3QgaW4gQysrLgorICBib29sIGlzUHJldmlvdXNEZWNsSW5TYW1lQmxvY2tTY29wZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNhPFBhcm1WYXJEZWNsPih0aGlzKQorICAgICAgICAgICAgICAgPyBmYWxzZQorICAgICAgICAgICAgICAgOiBOb25QYXJtVmFyRGVjbEJpdHMuUHJldmlvdXNEZWNsSW5TYW1lQmxvY2tTY29wZTsKKyAgfQorICB2b2lkIHNldFByZXZpb3VzRGVjbEluU2FtZUJsb2NrU2NvcGUoYm9vbCBTYW1lKSB7CisgICAgYXNzZXJ0KCFpc2E8UGFybVZhckRlY2w+KHRoaXMpKTsKKyAgICBOb25QYXJtVmFyRGVjbEJpdHMuUHJldmlvdXNEZWNsSW5TYW1lQmxvY2tTY29wZSA9IFNhbWU7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcm9tIHdoaWNoIHRoaXMgdmFyaWFibGUgY291bGQKKyAgLy8vIGJlIGluc3RhbnRpYXRlZCwgaWYgaXQgaXMgYW4gaW5zdGFudGlhdGlvbiAocmF0aGVyIHRoYW4gYSBub24tdGVtcGxhdGUpLgorICBWYXJEZWNsICpnZXRUZW1wbGF0ZUluc3RhbnRpYXRpb25QYXR0ZXJuKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJZiB0aGlzIHZhcmlhYmxlIGlzIGFuIGluc3RhbnRpYXRlZCBzdGF0aWMgZGF0YSBtZW1iZXIgb2YgYQorICAvLy8gY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24sIHJldHVybnMgdGhlIHRlbXBsYXRlZCBzdGF0aWMgZGF0YSBtZW1iZXIKKyAgLy8vIGZyb20gd2hpY2ggaXQgd2FzIGluc3RhbnRpYXRlZC4KKyAgVmFyRGVjbCAqZ2V0SW5zdGFudGlhdGVkRnJvbVN0YXRpY0RhdGFNZW1iZXIoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIElmIHRoaXMgdmFyaWFibGUgaXMgYW4gaW5zdGFudGlhdGlvbiBvZiBhIHZhcmlhYmxlIHRlbXBsYXRlIG9yIGEKKyAgLy8vIHN0YXRpYyBkYXRhIG1lbWJlciBvZiBhIGNsYXNzIHRlbXBsYXRlLCBkZXRlcm1pbmUgd2hhdCBraW5kIG9mCisgIC8vLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBvciBpbnN0YW50aWF0aW9uIHRoaXMgaXMuCisgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kIGdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJZiB0aGlzIHZhcmlhYmxlIGlzIGFuIGluc3RhbnRpYXRpb24gb2YgYSB2YXJpYWJsZSB0ZW1wbGF0ZSBvciBhCisgIC8vLyBzdGF0aWMgZGF0YSBtZW1iZXIgb2YgYSBjbGFzcyB0ZW1wbGF0ZSwgZGV0ZXJtaW5lIGl0cyBwb2ludCBvZgorICAvLy8gaW5zdGFudGlhdGlvbi4KKyAgU291cmNlTG9jYXRpb24gZ2V0UG9pbnRPZkluc3RhbnRpYXRpb24oKSBjb25zdDsKKworICAvLy8gXGJyaWVmIElmIHRoaXMgdmFyaWFibGUgaXMgYW4gaW5zdGFudGlhdGlvbiBvZiBhIHN0YXRpYyBkYXRhIG1lbWJlciBvZiBhCisgIC8vLyBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiwgcmV0cmlldmVzIHRoZSBtZW1iZXIgc3BlY2lhbGl6YXRpb24KKyAgLy8vIGluZm9ybWF0aW9uLgorICBNZW1iZXJTcGVjaWFsaXphdGlvbkluZm8gKmdldE1lbWJlclNwZWNpYWxpemF0aW9uSW5mbygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRm9yIGEgc3RhdGljIGRhdGEgbWVtYmVyIHRoYXQgd2FzIGluc3RhbnRpYXRlZCBmcm9tIGEgc3RhdGljCisgIC8vLyBkYXRhIG1lbWJlciBvZiBhIGNsYXNzIHRlbXBsYXRlLCBzZXQgdGhlIHRlbXBsYXRlIHNwZWNpYWxpYXRpb24ga2luZC4KKyAgdm9pZCBzZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZChUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCBUU0ssCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbiA9IFNvdXJjZUxvY2F0aW9uKCkpOworCisgIC8vLyBcYnJpZWYgU3BlY2lmeSB0aGF0IHRoaXMgdmFyaWFibGUgaXMgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUKKyAgLy8vIHN0YXRpYyBkYXRhIG1lbWJlciBWRC4KKyAgdm9pZCBzZXRJbnN0YW50aWF0aW9uT2ZTdGF0aWNEYXRhTWVtYmVyKFZhckRlY2wgKlZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQgVFNLKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlcyB0aGUgdmFyaWFibGUgdGVtcGxhdGUgdGhhdCBpcyBkZXNjcmliZWQgYnkgdGhpcworICAvLy8gdmFyaWFibGUgZGVjbGFyYXRpb24uCisgIC8vLworICAvLy8gRXZlcnkgdmFyaWFibGUgdGVtcGxhdGUgaXMgcmVwcmVzZW50ZWQgYXMgYSBWYXJUZW1wbGF0ZURlY2wgYW5kIGEKKyAgLy8vIFZhckRlY2wuIFRoZSBmb3JtZXIgY29udGFpbnMgdGVtcGxhdGUgcHJvcGVydGllcyAoc3VjaCBhcworICAvLy8gdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0cykgd2hpbGUgdGhlIGxhdHRlciBjb250YWlucyB0aGUKKyAgLy8vIGFjdHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgdGVtcGxhdGUncworICAvLy8gY29udGVudHMuIFZhclRlbXBsYXRlRGVjbDo6Z2V0VGVtcGxhdGVkRGVjbCgpIHJldHJpZXZlcyB0aGUKKyAgLy8vIFZhckRlY2wgdGhhdCBmcm9tIGEgVmFyVGVtcGxhdGVEZWNsLCB3aGlsZQorICAvLy8gZ2V0RGVzY3JpYmVkVmFyVGVtcGxhdGUoKSByZXRyaWV2ZXMgdGhlIFZhclRlbXBsYXRlRGVjbCBmcm9tCisgIC8vLyBhIFZhckRlY2wuCisgIFZhclRlbXBsYXRlRGVjbCAqZ2V0RGVzY3JpYmVkVmFyVGVtcGxhdGUoKSBjb25zdDsKKworICB2b2lkIHNldERlc2NyaWJlZFZhclRlbXBsYXRlKFZhclRlbXBsYXRlRGVjbCAqVGVtcGxhdGUpOworCisgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA+PSBmaXJzdFZhciAmJiBLIDw9IGxhc3RWYXI7IH0KK307CisKK2NsYXNzIEltcGxpY2l0UGFyYW1EZWNsIDogcHVibGljIFZhckRlY2wgeworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIC8vLyBEZWZpbmVzIHRoZSBraW5kIG9mIHRoZSBpbXBsaWNpdCBwYXJhbWV0ZXI6IGlzIHRoaXMgYW4gaW1wbGljaXQgcGFyYW1ldGVyCisgIC8vLyB3aXRoIHBvaW50ZXIgdG8gJ3RoaXMnLCAnc2VsZicsICdfY21kJywgdmlydHVhbCB0YWJsZSBwb2ludGVycywgY2FwdHVyZWQKKyAgLy8vIGNvbnRleHQgb3Igc29tZXRoaW5nIGVsc2UuCisgIGVudW0gSW1wbGljaXRQYXJhbUtpbmQgOiB1bnNpZ25lZCB7CisgICAgLy8vIFBhcmFtZXRlciBmb3IgT2JqZWN0aXZlLUMgJ3NlbGYnIGFyZ3VtZW50CisgICAgT2JqQ1NlbGYsCisKKyAgICAvLy8gUGFyYW1ldGVyIGZvciBPYmplY3RpdmUtQyAnX2NtZCcgYXJndW1lbnQKKyAgICBPYmpDQ21kLAorCisgICAgLy8vIFBhcmFtZXRlciBmb3IgQysrICd0aGlzJyBhcmd1bWVudAorICAgIENYWFRoaXMsCisKKyAgICAvLy8gUGFyYW1ldGVyIGZvciBDKysgdmlydHVhbCB0YWJsZSBwb2ludGVycworICAgIENYWFZUVCwKKworICAgIC8vLyBQYXJhbWV0ZXIgZm9yIGNhcHR1cmVkIGNvbnRleHQKKyAgICBDYXB0dXJlZENvbnRleHQsCisKKyAgICAvLy8gT3RoZXIgaW1wbGljaXQgcGFyYW1ldGVyCisgICAgT3RoZXIsCisgIH07CisKKyAgLy8vIENyZWF0ZSBpbXBsaWNpdCBwYXJhbWV0ZXIuCisgIHN0YXRpYyBJbXBsaWNpdFBhcmFtRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRMb2MsIElkZW50aWZpZXJJbmZvICpJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwgSW1wbGljaXRQYXJhbUtpbmQgUGFyYW1LaW5kKTsKKyAgc3RhdGljIEltcGxpY2l0UGFyYW1EZWNsICpDcmVhdGUoQVNUQ29udGV4dCAmQywgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wbGljaXRQYXJhbUtpbmQgUGFyYW1LaW5kKTsKKworICBzdGF0aWMgSW1wbGljaXRQYXJhbURlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisKKyAgSW1wbGljaXRQYXJhbURlY2woQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBJZExvYywKKyAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklkLCBRdWFsVHlwZSBUeXBlLAorICAgICAgICAgICAgICAgICAgICBJbXBsaWNpdFBhcmFtS2luZCBQYXJhbUtpbmQpCisgICAgICA6IFZhckRlY2woSW1wbGljaXRQYXJhbSwgQywgREMsIElkTG9jLCBJZExvYywgSWQsIFR5cGUsCisgICAgICAgICAgICAgICAgLypUSW5mbz0qL251bGxwdHIsIFNDX05vbmUpIHsKKyAgICBOb25QYXJtVmFyRGVjbEJpdHMuSW1wbGljaXRQYXJhbUtpbmQgPSBQYXJhbUtpbmQ7CisgICAgc2V0SW1wbGljaXQoKTsKKyAgfQorCisgIEltcGxpY2l0UGFyYW1EZWNsKEFTVENvbnRleHQgJkMsIFF1YWxUeXBlIFR5cGUsIEltcGxpY2l0UGFyYW1LaW5kIFBhcmFtS2luZCkKKyAgICAgIDogVmFyRGVjbChJbXBsaWNpdFBhcmFtLCBDLCAvKkRDPSovbnVsbHB0ciwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCAvKklkPSovbnVsbHB0ciwgVHlwZSwKKyAgICAgICAgICAgICAgICAvKlRJbmZvPSovbnVsbHB0ciwgU0NfTm9uZSkgeworICAgIE5vblBhcm1WYXJEZWNsQml0cy5JbXBsaWNpdFBhcmFtS2luZCA9IFBhcmFtS2luZDsKKyAgICBzZXRJbXBsaWNpdCgpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGltcGxpY2l0IHBhcmFtZXRlciBraW5kLgorICBJbXBsaWNpdFBhcmFtS2luZCBnZXRQYXJhbWV0ZXJLaW5kKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxJbXBsaWNpdFBhcmFtS2luZD4oTm9uUGFybVZhckRlY2xCaXRzLkltcGxpY2l0UGFyYW1LaW5kKTsKKyAgfQorCisgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBJbXBsaWNpdFBhcmFtOyB9Cit9OworCisvLy8gUmVwcmVzZW50cyBhIHBhcmFtZXRlciB0byBhIGZ1bmN0aW9uLgorY2xhc3MgUGFybVZhckRlY2wgOiBwdWJsaWMgVmFyRGVjbCB7CitwdWJsaWM6CisgIGVudW0geyBNYXhGdW5jdGlvblNjb3BlRGVwdGggPSAyNTUgfTsKKyAgZW51bSB7IE1heEZ1bmN0aW9uU2NvcGVJbmRleCA9IDI1NSB9OworCitwcm90ZWN0ZWQ6CisgIFBhcm1WYXJEZWNsKEtpbmQgREssIEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLCBJZGVudGlmaWVySW5mbyAqSWQsIFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUSW5mbywgU3RvcmFnZUNsYXNzIFMsIEV4cHIgKkRlZkFyZykKKyAgICAgIDogVmFyRGVjbChESywgQywgREMsIFN0YXJ0TG9jLCBJZExvYywgSWQsIFQsIFRJbmZvLCBTKSB7CisgICAgYXNzZXJ0KFBhcm1WYXJEZWNsQml0cy5IYXNJbmhlcml0ZWREZWZhdWx0QXJnID09IGZhbHNlKTsKKyAgICBhc3NlcnQoUGFybVZhckRlY2xCaXRzLkRlZmF1bHRBcmdLaW5kID09IERBS19Ob25lKTsKKyAgICBhc3NlcnQoUGFybVZhckRlY2xCaXRzLklzS05SUHJvbW90ZWQgPT0gZmFsc2UpOworICAgIGFzc2VydChQYXJtVmFyRGVjbEJpdHMuSXNPYmpDTWV0aG9kUGFyYW0gPT0gZmFsc2UpOworICAgIHNldERlZmF1bHRBcmcoRGVmQXJnKTsKKyAgfQorCitwdWJsaWM6CisgIHN0YXRpYyBQYXJtVmFyRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLCBJZGVudGlmaWVySW5mbyAqSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZUNsYXNzIFMsIEV4cHIgKkRlZkFyZyk7CisKKyAgc3RhdGljIFBhcm1WYXJEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOworCisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWTsKKworICB2b2lkIHNldE9iakNNZXRob2RTY29wZUluZm8odW5zaWduZWQgcGFyYW1ldGVySW5kZXgpIHsKKyAgICBQYXJtVmFyRGVjbEJpdHMuSXNPYmpDTWV0aG9kUGFyYW0gPSB0cnVlOworICAgIHNldFBhcmFtZXRlckluZGV4KHBhcmFtZXRlckluZGV4KTsKKyAgfQorCisgIHZvaWQgc2V0U2NvcGVJbmZvKHVuc2lnbmVkIHNjb3BlRGVwdGgsIHVuc2lnbmVkIHBhcmFtZXRlckluZGV4KSB7CisgICAgYXNzZXJ0KCFQYXJtVmFyRGVjbEJpdHMuSXNPYmpDTWV0aG9kUGFyYW0pOworCisgICAgUGFybVZhckRlY2xCaXRzLlNjb3BlRGVwdGhPck9iakNRdWFscyA9IHNjb3BlRGVwdGg7CisgICAgYXNzZXJ0KFBhcm1WYXJEZWNsQml0cy5TY29wZURlcHRoT3JPYmpDUXVhbHMgPT0gc2NvcGVEZXB0aAorICAgICAgICAgICAmJiAidHJ1bmNhdGlvbiEiKTsKKworICAgIHNldFBhcmFtZXRlckluZGV4KHBhcmFtZXRlckluZGV4KTsKKyAgfQorCisgIGJvb2wgaXNPYmpDTWV0aG9kUGFyYW1ldGVyKCkgY29uc3QgeworICAgIHJldHVybiBQYXJtVmFyRGVjbEJpdHMuSXNPYmpDTWV0aG9kUGFyYW07CisgIH0KKworICB1bnNpZ25lZCBnZXRGdW5jdGlvblNjb3BlRGVwdGgoKSBjb25zdCB7CisgICAgaWYgKFBhcm1WYXJEZWNsQml0cy5Jc09iakNNZXRob2RQYXJhbSkgcmV0dXJuIDA7CisgICAgcmV0dXJuIFBhcm1WYXJEZWNsQml0cy5TY29wZURlcHRoT3JPYmpDUXVhbHM7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhpcyBwYXJhbWV0ZXIgaW4gaXRzIHByb3RvdHlwZSBvciBtZXRob2Qgc2NvcGUuCisgIHVuc2lnbmVkIGdldEZ1bmN0aW9uU2NvcGVJbmRleCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UGFyYW1ldGVySW5kZXgoKTsKKyAgfQorCisgIE9iakNEZWNsUXVhbGlmaWVyIGdldE9iakNEZWNsUXVhbGlmaWVyKCkgY29uc3QgeworICAgIGlmICghUGFybVZhckRlY2xCaXRzLklzT2JqQ01ldGhvZFBhcmFtKSByZXR1cm4gT0JKQ19UUV9Ob25lOworICAgIHJldHVybiBPYmpDRGVjbFF1YWxpZmllcihQYXJtVmFyRGVjbEJpdHMuU2NvcGVEZXB0aE9yT2JqQ1F1YWxzKTsKKyAgfQorICB2b2lkIHNldE9iakNEZWNsUXVhbGlmaWVyKE9iakNEZWNsUXVhbGlmaWVyIFFUVmFsKSB7CisgICAgYXNzZXJ0KFBhcm1WYXJEZWNsQml0cy5Jc09iakNNZXRob2RQYXJhbSk7CisgICAgUGFybVZhckRlY2xCaXRzLlNjb3BlRGVwdGhPck9iakNRdWFscyA9IFFUVmFsOworICB9CisKKyAgLy8vIFRydWUgaWYgdGhlIHZhbHVlIHBhc3NlZCB0byB0aGlzIHBhcmFtZXRlciBtdXN0IHVuZGVyZ28KKyAgLy8vIEsmUi1zdHlsZSBkZWZhdWx0IGFyZ3VtZW50IHByb21vdGlvbjoKKyAgLy8vCisgIC8vLyBDOTkgNi41LjIuMi4KKyAgLy8vICAgSWYgdGhlIGV4cHJlc3Npb24gdGhhdCBkZW5vdGVzIHRoZSBjYWxsZWQgZnVuY3Rpb24gaGFzIGEgdHlwZQorICAvLy8gICB0aGF0IGRvZXMgbm90IGluY2x1ZGUgYSBwcm90b3R5cGUsIHRoZSBpbnRlZ2VyIHByb21vdGlvbnMgYXJlCisgIC8vLyAgIHBlcmZvcm1lZCBvbiBlYWNoIGFyZ3VtZW50LCBhbmQgYXJndW1lbnRzIHRoYXQgaGF2ZSB0eXBlIGZsb2F0CisgIC8vLyAgIGFyZSBwcm9tb3RlZCB0byBkb3VibGUuCisgIGJvb2wgaXNLTlJQcm9tb3RlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFybVZhckRlY2xCaXRzLklzS05SUHJvbW90ZWQ7CisgIH0KKyAgdm9pZCBzZXRLTlJQcm9tb3RlZChib29sIHByb21vdGVkKSB7CisgICAgUGFybVZhckRlY2xCaXRzLklzS05SUHJvbW90ZWQgPSBwcm9tb3RlZDsKKyAgfQorCisgIEV4cHIgKmdldERlZmF1bHRBcmcoKTsKKyAgY29uc3QgRXhwciAqZ2V0RGVmYXVsdEFyZygpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxQYXJtVmFyRGVjbCAqPih0aGlzKS0+Z2V0RGVmYXVsdEFyZygpOworICB9CisKKyAgdm9pZCBzZXREZWZhdWx0QXJnKEV4cHIgKmRlZmFyZyk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc291cmNlIHJhbmdlIHRoYXQgY292ZXJzIHRoZSBlbnRpcmUgZGVmYXVsdAorICAvLy8gYXJndW1lbnQuCisgIFNvdXJjZVJhbmdlIGdldERlZmF1bHRBcmdSYW5nZSgpIGNvbnN0OworICB2b2lkIHNldFVuaW5zdGFudGlhdGVkRGVmYXVsdEFyZyhFeHByICphcmcpOworICBFeHByICpnZXRVbmluc3RhbnRpYXRlZERlZmF1bHRBcmcoKTsKKyAgY29uc3QgRXhwciAqZ2V0VW5pbnN0YW50aWF0ZWREZWZhdWx0QXJnKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PFBhcm1WYXJEZWNsICo+KHRoaXMpLT5nZXRVbmluc3RhbnRpYXRlZERlZmF1bHRBcmcoKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBwYXJhbWV0ZXIgaGFzIGEgZGVmYXVsdCBhcmd1bWVudCwKKyAgLy8vIGVpdGhlciBwYXJzZWQgb3Igbm90LgorICBib29sIGhhc0RlZmF1bHRBcmcoKSBjb25zdDsKKworICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQgYXJndW1lbnQgdGhhdCBoYXMgbm90CisgIC8vLyB5ZXQgYmVlbiBwYXJzZWQuIFRoaXMgd2lsbCBvY2N1ciBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgYSBDKysgY2xhc3MKKyAgLy8vIHdob3NlIG1lbWJlciBmdW5jdGlvbnMgaGF2ZSBkZWZhdWx0IGFyZ3VtZW50cywgZS5nLiwKKyAgLy8vIEBjb2RlCisgIC8vLyAgIGNsYXNzIFggeworICAvLy8gICBwdWJsaWM6CisgIC8vLyAgICAgdm9pZCBmKGludCB4ID0gMTcpOyAvLyB4IGhhcyBhbiB1bnBhcnNlZCBkZWZhdWx0IGFyZ3VtZW50IG5vdworICAvLy8gICB9OyAvLyB4IGhhcyBhIHJlZ3VsYXIgZGVmYXVsdCBhcmd1bWVudCBub3cKKyAgLy8vIEBlbmRjb2RlCisgIGJvb2wgaGFzVW5wYXJzZWREZWZhdWx0QXJnKCkgY29uc3QgeworICAgIHJldHVybiBQYXJtVmFyRGVjbEJpdHMuRGVmYXVsdEFyZ0tpbmQgPT0gREFLX1VucGFyc2VkOworICB9CisKKyAgYm9vbCBoYXNVbmluc3RhbnRpYXRlZERlZmF1bHRBcmcoKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcm1WYXJEZWNsQml0cy5EZWZhdWx0QXJnS2luZCA9PSBEQUtfVW5pbnN0YW50aWF0ZWQ7CisgIH0KKworICAvLy8gU3BlY2lmeSB0aGF0IHRoaXMgcGFyYW1ldGVyIGhhcyBhbiB1bnBhcnNlZCBkZWZhdWx0IGFyZ3VtZW50LgorICAvLy8gVGhlIGFyZ3VtZW50IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBhIHJlYWwgZGVmYXVsdCBhcmd1bWVudCB2aWEKKyAgLy8vIHNldERlZmF1bHRBcmcgd2hlbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBlbmNsb3NpbmcgdGhlIGZ1bmN0aW9uCisgIC8vLyBkZWNsYXJhdGlvbiB0aGF0IG93bnMgdGhpcyBkZWZhdWx0IGFyZ3VtZW50IGlzIGNvbXBsZXRlZC4KKyAgdm9pZCBzZXRVbnBhcnNlZERlZmF1bHRBcmcoKSB7CisgICAgUGFybVZhckRlY2xCaXRzLkRlZmF1bHRBcmdLaW5kID0gREFLX1VucGFyc2VkOworICB9CisKKyAgYm9vbCBoYXNJbmhlcml0ZWREZWZhdWx0QXJnKCkgY29uc3QgeworICAgIHJldHVybiBQYXJtVmFyRGVjbEJpdHMuSGFzSW5oZXJpdGVkRGVmYXVsdEFyZzsKKyAgfQorCisgIHZvaWQgc2V0SGFzSW5oZXJpdGVkRGVmYXVsdEFyZyhib29sIEkgPSB0cnVlKSB7CisgICAgUGFybVZhckRlY2xCaXRzLkhhc0luaGVyaXRlZERlZmF1bHRBcmcgPSBJOworICB9CisKKyAgUXVhbFR5cGUgZ2V0T3JpZ2luYWxUeXBlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHBhcmFtZXRlciBpcyBhY3R1YWxseSBhIGZ1bmN0aW9uCisgIC8vLyBwYXJhbWV0ZXIgcGFjay4KKyAgYm9vbCBpc1BhcmFtZXRlclBhY2soKSBjb25zdDsKKworICAvLy8gU2V0cyB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gdGhhdCBvd25zIHRoaXMKKyAgLy8vIFBhcm1WYXJEZWNsLiBTaW5jZSBQYXJtVmFyRGVjbHMgYXJlIG9mdGVuIGNyZWF0ZWQgYmVmb3JlIHRoZQorICAvLy8gRnVuY3Rpb25EZWNscyB0aGF0IG93biB0aGVtLCB0aGlzIHJvdXRpbmUgaXMgcmVxdWlyZWQgdG8gdXBkYXRlCisgIC8vLyB0aGUgRGVjbENvbnRleHQgYXBwcm9wcmlhdGVseS4KKyAgdm9pZCBzZXRPd25pbmdGdW5jdGlvbihEZWNsQ29udGV4dCAqRkQpIHsgc2V0RGVjbENvbnRleHQoRkQpOyB9CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IFBhcm1WYXI7IH0KKworcHJpdmF0ZToKKyAgZW51bSB7IFBhcmFtZXRlckluZGV4U2VudGluZWwgPSAoMSA8PCBOdW1QYXJhbWV0ZXJJbmRleEJpdHMpIC0gMSB9OworCisgIHZvaWQgc2V0UGFyYW1ldGVySW5kZXgodW5zaWduZWQgcGFyYW1ldGVySW5kZXgpIHsKKyAgICBpZiAocGFyYW1ldGVySW5kZXggPj0gUGFyYW1ldGVySW5kZXhTZW50aW5lbCkgeworICAgICAgc2V0UGFyYW1ldGVySW5kZXhMYXJnZShwYXJhbWV0ZXJJbmRleCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgUGFybVZhckRlY2xCaXRzLlBhcmFtZXRlckluZGV4ID0gcGFyYW1ldGVySW5kZXg7CisgICAgYXNzZXJ0KFBhcm1WYXJEZWNsQml0cy5QYXJhbWV0ZXJJbmRleCA9PSBwYXJhbWV0ZXJJbmRleCAmJiAidHJ1bmNhdGlvbiEiKTsKKyAgfQorICB1bnNpZ25lZCBnZXRQYXJhbWV0ZXJJbmRleCgpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBkID0gUGFybVZhckRlY2xCaXRzLlBhcmFtZXRlckluZGV4OworICAgIHJldHVybiBkID09IFBhcmFtZXRlckluZGV4U2VudGluZWwgPyBnZXRQYXJhbWV0ZXJJbmRleExhcmdlKCkgOiBkOworICB9CisKKyAgdm9pZCBzZXRQYXJhbWV0ZXJJbmRleExhcmdlKHVuc2lnbmVkIHBhcmFtZXRlckluZGV4KTsKKyAgdW5zaWduZWQgZ2V0UGFyYW1ldGVySW5kZXhMYXJnZSgpIGNvbnN0OworfTsKKworLy8vIFJlcHJlc2VudHMgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBvciBkZWZpbml0aW9uLgorLy8vCisvLy8gU2luY2UgYSBnaXZlbiBmdW5jdGlvbiBjYW4gYmUgZGVjbGFyZWQgc2V2ZXJhbCB0aW1lcyBpbiBhIHByb2dyYW0sCisvLy8gdGhlcmUgbWF5IGJlIHNldmVyYWwgRnVuY3Rpb25EZWNscyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhhdAorLy8vIGZ1bmN0aW9uLiBPbmx5IG9uZSBvZiB0aG9zZSBGdW5jdGlvbkRlY2xzIHdpbGwgYmUgZm91bmQgd2hlbgorLy8vIHRyYXZlcnNpbmcgdGhlIGxpc3Qgb2YgZGVjbGFyYXRpb25zIGluIHRoZSBjb250ZXh0IG9mIHRoZQorLy8vIEZ1bmN0aW9uRGVjbCAoZS5nLiwgdGhlIHRyYW5zbGF0aW9uIHVuaXQpOyB0aGlzIEZ1bmN0aW9uRGVjbAorLy8vIGNvbnRhaW5zIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24ga25vd24gYWJvdXQgdGhlIGZ1bmN0aW9uLiBPdGhlciwKKy8vLyBwcmV2aW91cyBkZWNsYXJhdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGFyZSBhdmFpbGFibGUgdmlhIHRoZQorLy8vIGdldFByZXZpb3VzRGVjbCgpIGNoYWluLgorY2xhc3MgRnVuY3Rpb25EZWNsIDogcHVibGljIERlY2xhcmF0b3JEZWNsLCBwdWJsaWMgRGVjbENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUmVkZWNsYXJhYmxlPEZ1bmN0aW9uRGVjbD4geworcHVibGljOgorICAvLy8gXGJyaWVmIFRoZSBraW5kIG9mIHRlbXBsYXRlZCBmdW5jdGlvbiBhIEZ1bmN0aW9uRGVjbCBjYW4gYmUuCisgIGVudW0gVGVtcGxhdGVkS2luZCB7CisgICAgVEtfTm9uVGVtcGxhdGUsCisgICAgVEtfRnVuY3Rpb25UZW1wbGF0ZSwKKyAgICBUS19NZW1iZXJTcGVjaWFsaXphdGlvbiwKKyAgICBUS19GdW5jdGlvblRlbXBsYXRlU3BlY2lhbGl6YXRpb24sCisgICAgVEtfRGVwZW5kZW50RnVuY3Rpb25UZW1wbGF0ZVNwZWNpYWxpemF0aW9uCisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBBIG5ld1tdJ2QgYXJyYXkgb2YgcG9pbnRlcnMgdG8gVmFyRGVjbHMgZm9yIHRoZSBmb3JtYWwKKyAgLy8vIHBhcmFtZXRlcnMgb2YgdGhpcyBmdW5jdGlvbi4gIFRoaXMgaXMgbnVsbCBpZiBhIHByb3RvdHlwZSBvciBpZiB0aGVyZSBhcmUKKyAgLy8vIG5vIGZvcm1hbHMuCisgIFBhcm1WYXJEZWNsICoqUGFyYW1JbmZvID0gbnVsbHB0cjsKKworICBMYXp5RGVjbFN0bXRQdHIgQm9keTsKKworICAvLyBGSVhNRTogVGhpcyBjYW4gYmUgcGFja2VkIGludG8gdGhlIGJpdGZpZWxkcyBpbiBEZWNsQ29udGV4dC4KKyAgLy8gTk9URTogVkMrKyBwYWNrcyBiaXRmaWVsZHMgcG9vcmx5IGlmIHRoZSB0eXBlcyBkaWZmZXIuCisgIHVuc2lnbmVkIFNDbGFzcyA6IDM7CisgIHVuc2lnbmVkIElzSW5saW5lIDogMTsKKyAgdW5zaWduZWQgSXNJbmxpbmVTcGVjaWZpZWQgOiAxOworCitwcm90ZWN0ZWQ6CisgIC8vIFRoaXMgaXMgc2hhcmVkIGJ5IENYWENvbnN0cnVjdG9yRGVjbCwgQ1hYQ29udmVyc2lvbkRlY2wsIGFuZAorICAvLyBDWFhEZWR1Y3Rpb25HdWlkZURlY2wuCisgIHVuc2lnbmVkIElzRXhwbGljaXRTcGVjaWZpZWQgOiAxOworCitwcml2YXRlOgorICB1bnNpZ25lZCBJc1ZpcnR1YWxBc1dyaXR0ZW4gOiAxOworICB1bnNpZ25lZCBJc1B1cmUgOiAxOworICB1bnNpZ25lZCBIYXNJbmhlcml0ZWRQcm90b3R5cGUgOiAxOworICB1bnNpZ25lZCBIYXNXcml0dGVuUHJvdG90eXBlIDogMTsKKyAgdW5zaWduZWQgSXNEZWxldGVkIDogMTsKKyAgdW5zaWduZWQgSXNUcml2aWFsIDogMTsgLy8gc3VuayBmcm9tIENYWE1ldGhvZERlY2wKKworICAvLy8gVGhpcyBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgZnVuY3Rpb24gaXMgdHJpdmlhbCBmb3IgdGhlIHB1cnBvc2Ugb2YKKyAgLy8vIGNhbGxzLiBUaGlzIGlzIG1lYW5pbmdmdWwgb25seSB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgYSBjb3B5L21vdmUKKyAgLy8vIGNvbnN0cnVjdG9yIG9yIGEgZGVzdHJ1Y3Rvci4KKyAgdW5zaWduZWQgSXNUcml2aWFsRm9yQ2FsbCA6IDE7CisKKyAgdW5zaWduZWQgSXNEZWZhdWx0ZWQgOiAxOyAvLyBzdW5rIGZyb20gQ1hYTWV0aG9EZWNsCisgIHVuc2lnbmVkIElzRXhwbGljaXRseURlZmF1bHRlZCA6IDE7IC8vc3VuayBmcm9tIENYWE1ldGhvZERlY2wKKyAgdW5zaWduZWQgSGFzSW1wbGljaXRSZXR1cm5aZXJvIDogMTsKKyAgdW5zaWduZWQgSXNMYXRlVGVtcGxhdGVQYXJzZWQgOiAxOworICB1bnNpZ25lZCBJc0NvbnN0ZXhwciA6IDE7CisgIHVuc2lnbmVkIEluc3RhbnRpYXRpb25Jc1BlbmRpbmcgOiAxOworCisgIC8vLyBcYnJpZWYgSW5kaWNhdGVzIGlmIHRoZSBmdW5jdGlvbiB1c2VzIF9fdHJ5LgorICB1bnNpZ25lZCBVc2VzU0VIVHJ5IDogMTsKKworICAvLy8gXGJyaWVmIEluZGljYXRlcyBpZiB0aGUgZnVuY3Rpb24gd2FzIGEgZGVmaW5pdGlvbiBidXQgaXRzIGJvZHkgd2FzCisgIC8vLyBza2lwcGVkLgorICB1bnNpZ25lZCBIYXNTa2lwcGVkQm9keSA6IDE7CisKKyAgLy8vIEluZGljYXRlcyBpZiB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gd2lsbCBoYXZlIGEgYm9keSwgb25jZSB3ZSdyZSBkb25lCisgIC8vLyBwYXJzaW5nIGl0LgorICB1bnNpZ25lZCBXaWxsSGF2ZUJvZHkgOiAxOworCisgIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGEgbXVsdGl2ZXJzaW9uZWQgZnVuY3Rpb24gdXNpbmcgYXR0cmlidXRlCisgIC8vLyAndGFyZ2V0Jy4KKyAgdW5zaWduZWQgSXNNdWx0aVZlcnNpb24gOiAxOworCitwcm90ZWN0ZWQ6CisgIC8vLyBbQysrMTddIE9ubHkgdXNlZCBieSBDWFhEZWR1Y3Rpb25HdWlkZURlY2wuIERlY2xhcmVkIGhlcmUgdG8gYXZvaWQKKyAgLy8vIGluY3JlYXNpbmcgdGhlIHNpemUgb2YgQ1hYRGVkdWN0aW9uR3VpZGVEZWNsIGJ5IHRoZSBzaXplIG9mIGFuIHVuc2lnbmVkCisgIC8vLyBpbnQgYXMgb3Bwb3NlZCB0byBhZGRpbmcgYSBzaW5nbGUgYml0IHRvIEZ1bmN0aW9uRGVjbC4KKyAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSBEZWR1Y3Rpb24gR3VpZGUgaXMgdGhlIGltcGxpY2l0bHkgZ2VuZXJhdGVkICdjb3B5CisgIC8vLyBkZWR1Y3Rpb24gY2FuZGlkYXRlJyAoaXMgdXNlZCBkdXJpbmcgb3ZlcmxvYWQgcmVzb2x1dGlvbikuCisgIHVuc2lnbmVkIElzQ29weURlZHVjdGlvbkNhbmRpZGF0ZSA6IDE7CisKK3ByaXZhdGU6CisKKyAgLy8vIFN0b3JlIHRoZSBPRFJIYXNoIGFmdGVyIGZpcnN0IGNhbGN1bGF0aW9uLgorICB1bnNpZ25lZCBIYXNPRFJIYXNoIDogMTsKKyAgdW5zaWduZWQgT0RSSGFzaDsKKworICAvLy8gXGJyaWVmIEVuZCBwYXJ0IG9mIHRoaXMgRnVuY3Rpb25EZWNsJ3Mgc291cmNlIHJhbmdlLgorICAvLy8KKyAgLy8vIFdlIGNvdWxkIGNvbXB1dGUgdGhlIGZ1bGwgcmFuZ2UgaW4gZ2V0U291cmNlUmFuZ2UoKS4gSG93ZXZlciwgd2hlbiB3ZSdyZQorICAvLy8gZGVhbGluZyB3aXRoIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZXNlcmlhbGl6ZWQgZnJvbSBhIFBDSC9BU1QgZmlsZSwKKyAgLy8vIHdlIGNhbiBvbmx5IGNvbXB1dGUgdGhlIGZ1bGwgcmFuZ2Ugb25jZSB0aGUgZnVuY3Rpb24gYm9keSBoYXMgYmVlbgorICAvLy8gZGUtc2VyaWFsaXplZCwgc28gaXQncyBmYXIgYmV0dGVyIHRvIGhhdmUgdGhlIChzb21ldGltZXMtcmVkdW5kYW50KQorICAvLy8gRW5kUmFuZ2VMb2MuCisgIFNvdXJjZUxvY2F0aW9uIEVuZFJhbmdlTG9jOworCisgIC8vLyBcYnJpZWYgVGhlIHRlbXBsYXRlIG9yIGRlY2xhcmF0aW9uIHRoYXQgdGhpcyBkZWNsYXJhdGlvbgorICAvLy8gZGVzY3JpYmVzIG9yIHdhcyBpbnN0YW50aWF0ZWQgZnJvbSwgcmVzcGVjdGl2ZWx5LgorICAvLy8KKyAgLy8vIEZvciBub24tdGVtcGxhdGVzLCB0aGlzIHZhbHVlIHdpbGwgYmUgTlVMTC4gRm9yIGZ1bmN0aW9uCisgIC8vLyBkZWNsYXJhdGlvbnMgdGhhdCBkZXNjcmliZSBhIGZ1bmN0aW9uIHRlbXBsYXRlLCB0aGlzIHdpbGwgYmUgYQorICAvLy8gcG9pbnRlciB0byBhIEZ1bmN0aW9uVGVtcGxhdGVEZWNsLiBGb3IgbWVtYmVyIGZ1bmN0aW9ucworICAvLy8gb2YgY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zLCB0aGlzIHdpbGwgYmUgYSBNZW1iZXJTcGVjaWFsaXphdGlvbkluZm8KKyAgLy8vIHBvaW50ZXIgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3BlY2lhbGl6YXRpb24uCisgIC8vLyBGb3IgZnVuY3Rpb24gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zLCB0aGlzIHdpbGwgYmUgYQorICAvLy8gRnVuY3Rpb25UZW1wbGF0ZVNwZWNpYWxpemF0aW9uSW5mbywgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQKKyAgLy8vIHRoZSB0ZW1wbGF0ZSBiZWluZyBzcGVjaWFsaXplZCBhbmQgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBpbnZvbHZlZCBpbgorICAvLy8gdGhhdCBzcGVjaWFsaXphdGlvbi4KKyAgbGx2bTo6UG9pbnRlclVuaW9uNDxGdW5jdGlvblRlbXBsYXRlRGVjbCAqLAorICAgICAgICAgICAgICAgICAgICAgIE1lbWJlclNwZWNpYWxpemF0aW9uSW5mbyAqLAorICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVGVtcGxhdGVTcGVjaWFsaXphdGlvbkluZm8gKiwKKyAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRlbnRGdW5jdGlvblRlbXBsYXRlU3BlY2lhbGl6YXRpb25JbmZvICo+CisgICAgVGVtcGxhdGVPclNwZWNpYWxpemF0aW9uOworCisgIC8vLyBQcm92aWRlcyBzb3VyY2UvdHlwZSBsb2NhdGlvbiBpbmZvIGZvciB0aGUgZGVjbGFyYXRpb24gbmFtZSBlbWJlZGRlZCBpbgorICAvLy8gdGhlIERlY2xhcmF0b3JEZWNsIGJhc2UgY2xhc3MuCisgIERlY2xhcmF0aW9uTmFtZUxvYyBETkxvYzsKKworICAvLy8gXGJyaWVmIFNwZWNpZnkgdGhhdCB0aGlzIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzIGFjdHVhbGx5IGEgZnVuY3Rpb24KKyAgLy8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIHRoZSBBU1RDb250ZXh0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBUZW1wbGF0ZSB0aGUgZnVuY3Rpb24gdGVtcGxhdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHRlbXBsYXRlCisgIC8vLyBzcGVjaWFsaXphdGlvbiBzcGVjaWFsaXplcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gVGVtcGxhdGVBcmdzIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgdGhhdCBwcm9kdWNlZCB0aGlzCisgIC8vLyBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBmcm9tIHRoZSB0ZW1wbGF0ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gSW5zZXJ0UG9zIElmIG5vbi1OVUxMLCB0aGUgcG9zaXRpb24gaW4gdGhlIGZ1bmN0aW9uIHRlbXBsYXRlCisgIC8vLyBzcGVjaWFsaXphdGlvbiBzZXQgd2hlcmUgdGhlIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRhdGEgd2lsbAorICAvLy8gYmUgaW5zZXJ0ZWQuCisgIC8vLworICAvLy8gXHBhcmFtIFRTSyB0aGUga2luZCBvZiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0aGlzIGlzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUZW1wbGF0ZUFyZ3NBc1dyaXR0ZW4gbG9jYXRpb24gaW5mbyBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMuCisgIC8vLworICAvLy8gXHBhcmFtIFBvaW50T2ZJbnN0YW50aWF0aW9uIHBvaW50IGF0IHdoaWNoIHRoZSBmdW5jdGlvbiB0ZW1wbGF0ZQorICAvLy8gc3BlY2lhbGl6YXRpb24gd2FzIGZpcnN0IGluc3RhbnRpYXRlZC4KKyAgdm9pZCBzZXRGdW5jdGlvblRlbXBsYXRlU3BlY2lhbGl6YXRpb24oQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25UZW1wbGF0ZURlY2wgKlRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3QgKlRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqSW5zZXJ0UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCBUU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqVGVtcGxhdGVBcmdzQXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbik7CisKKyAgLy8vIFxicmllZiBTcGVjaWZ5IHRoYXQgdGhpcyByZWNvcmQgaXMgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUKKyAgLy8vIG1lbWJlciBmdW5jdGlvbiBGRC4KKyAgdm9pZCBzZXRJbnN0YW50aWF0aW9uT2ZNZW1iZXJGdW5jdGlvbihBU1RDb250ZXh0ICZDLCBGdW5jdGlvbkRlY2wgKkZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kIFRTSyk7CisKKyAgdm9pZCBzZXRQYXJhbXMoQVNUQ29udGV4dCAmQywgQXJyYXlSZWY8UGFybVZhckRlY2wgKj4gTmV3UGFyYW1JbmZvKTsKKworcHJvdGVjdGVkOgorICBGdW5jdGlvbkRlY2woS2luZCBESywgQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLCBRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKlRJbmZvLCBTdG9yYWdlQ2xhc3MgUywgYm9vbCBpc0lubGluZVNwZWNpZmllZCwKKyAgICAgICAgICAgICAgIGJvb2wgaXNDb25zdGV4cHJTcGVjaWZpZWQpCisgICAgICA6IERlY2xhcmF0b3JEZWNsKERLLCBEQywgTmFtZUluZm8uZ2V0TG9jKCksIE5hbWVJbmZvLmdldE5hbWUoKSwgVCwgVEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0TG9jKSwKKyAgICAgICAgRGVjbENvbnRleHQoREspLCByZWRlY2xhcmFibGVfYmFzZShDKSwgU0NsYXNzKFMpLAorICAgICAgICBJc0lubGluZShpc0lubGluZVNwZWNpZmllZCksIElzSW5saW5lU3BlY2lmaWVkKGlzSW5saW5lU3BlY2lmaWVkKSwKKyAgICAgICAgSXNFeHBsaWNpdFNwZWNpZmllZChmYWxzZSksIElzVmlydHVhbEFzV3JpdHRlbihmYWxzZSksIElzUHVyZShmYWxzZSksCisgICAgICAgIEhhc0luaGVyaXRlZFByb3RvdHlwZShmYWxzZSksIEhhc1dyaXR0ZW5Qcm90b3R5cGUodHJ1ZSksCisgICAgICAgIElzRGVsZXRlZChmYWxzZSksIElzVHJpdmlhbChmYWxzZSksIElzVHJpdmlhbEZvckNhbGwoZmFsc2UpLAorICAgICAgICBJc0RlZmF1bHRlZChmYWxzZSksCisgICAgICAgIElzRXhwbGljaXRseURlZmF1bHRlZChmYWxzZSksIEhhc0ltcGxpY2l0UmV0dXJuWmVybyhmYWxzZSksCisgICAgICAgIElzTGF0ZVRlbXBsYXRlUGFyc2VkKGZhbHNlKSwgSXNDb25zdGV4cHIoaXNDb25zdGV4cHJTcGVjaWZpZWQpLAorICAgICAgICBJbnN0YW50aWF0aW9uSXNQZW5kaW5nKGZhbHNlKSwgVXNlc1NFSFRyeShmYWxzZSksIEhhc1NraXBwZWRCb2R5KGZhbHNlKSwKKyAgICAgICAgV2lsbEhhdmVCb2R5KGZhbHNlKSwgSXNNdWx0aVZlcnNpb24oZmFsc2UpLAorICAgICAgICBJc0NvcHlEZWR1Y3Rpb25DYW5kaWRhdGUoZmFsc2UpLCBIYXNPRFJIYXNoKGZhbHNlKSwgT0RSSGFzaCgwKSwKKyAgICAgICAgRW5kUmFuZ2VMb2MoTmFtZUluZm8uZ2V0RW5kTG9jKCkpLCBETkxvYyhOYW1lSW5mby5nZXRJbmZvKCkpIHt9CisKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2UgPSBSZWRlY2xhcmFibGU8RnVuY3Rpb25EZWNsPjsKKworICBGdW5jdGlvbkRlY2wgKmdldE5leHRSZWRlY2xhcmF0aW9uSW1wbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0TmV4dFJlZGVjbGFyYXRpb24oKTsKKyAgfQorCisgIEZ1bmN0aW9uRGVjbCAqZ2V0UHJldmlvdXNEZWNsSW1wbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0UHJldmlvdXNEZWNsKCk7CisgIH0KKworICBGdW5jdGlvbkRlY2wgKmdldE1vc3RSZWNlbnREZWNsSW1wbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0TW9zdFJlY2VudERlY2woKTsKKyAgfQorCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNURGVjbFdyaXRlcjsKKworICB1c2luZyByZWRlY2xfcmFuZ2UgPSByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsX3JhbmdlOworICB1c2luZyByZWRlY2xfaXRlcmF0b3IgPSByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsX2l0ZXJhdG9yOworCisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xzX2JlZ2luOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsc19lbmQ7CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xzOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6Z2V0UHJldmlvdXNEZWNsOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6Z2V0TW9zdFJlY2VudERlY2w7CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjppc0ZpcnN0RGVjbDsKKworICBzdGF0aWMgRnVuY3Rpb25EZWNsICpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIE5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbk5hbWUgTiwgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VDbGFzcyBTQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbmxpbmVTcGVjaWZpZWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzV3JpdHRlblByb3RvdHlwZSA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQ29uc3RleHByU3BlY2lmaWVkID0gZmFsc2UpIHsKKyAgICBEZWNsYXJhdGlvbk5hbWVJbmZvIE5hbWVJbmZvKE4sIE5Mb2MpOworICAgIHJldHVybiBGdW5jdGlvbkRlY2w6OkNyZWF0ZShDLCBEQywgU3RhcnRMb2MsIE5hbWVJbmZvLCBULCBUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5saW5lU3BlY2lmaWVkLCBoYXNXcml0dGVuUHJvdG90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbnN0ZXhwclNwZWNpZmllZCk7CisgIH0KKworICBzdGF0aWMgRnVuY3Rpb25EZWNsICpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZOYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VDbGFzcyBTQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbmxpbmVTcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc1dyaXR0ZW5Qcm90b3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQ29uc3RleHByU3BlY2lmaWVkID0gZmFsc2UpOworCisgIHN0YXRpYyBGdW5jdGlvbkRlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisgICAgICAgICAgICAgICAgICAgICAgIAorICBEZWNsYXJhdGlvbk5hbWVJbmZvIGdldE5hbWVJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBEZWNsYXJhdGlvbk5hbWVJbmZvKGdldERlY2xOYW1lKCksIGdldExvY2F0aW9uKCksIEROTG9jKTsKKyAgfQorCisgIHZvaWQgZ2V0TmFtZUZvckRpYWdub3N0aWMocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUXVhbGlmaWVkKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIHNldFJhbmdlRW5kKFNvdXJjZUxvY2F0aW9uIEUpIHsgRW5kUmFuZ2VMb2MgPSBFOyB9CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZOworCisgIC8vIEZ1bmN0aW9uIGRlZmluaXRpb25zLgorICAvLworICAvLyBBIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIG1heSBiZToKKyAgLy8gLSBhIG5vbiBkZWZpbmluZyBkZWNsYXJhdGlvbiwKKyAgLy8gLSBhIGRlZmluaXRpb24uIEEgZnVuY3Rpb24gbWF5IGJlIGRlZmluZWQgYmVjYXVzZToKKyAgLy8gICAtIGl0IGhhcyBhIGJvZHksIG9yIHdpbGwgaGF2ZSBpdCBpbiB0aGUgY2FzZSBvZiBsYXRlIHBhcnNpbmcuCisgIC8vICAgLSBpdCBoYXMgYW4gdW5pbnN0YW50aWF0ZWQgYm9keS4gVGhlIGJvZHkgZG9lcyBub3QgZXhpc3QgYmVjYXVzZSB0aGUKKyAgLy8gICAgIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIHlldCwgYnV0IHRoZSBkZWNsYXJhdGlvbiBpcyBjb25zaWRlcmVkIGEKKyAgLy8gICAgIGRlZmluaXRpb24gYW5kIGRvZXMgbm90IGFsbG93IG90aGVyIGRlZmluaXRpb24gb2YgdGhpcyBmdW5jdGlvbi4KKyAgLy8gICAtIGl0IGRvZXMgbm90IGhhdmUgYSB1c2VyIHNwZWNpZmllZCBib2R5LCBidXQgaXQgZG9lcyBub3QgYWxsb3cKKyAgLy8gICAgIHJlZGVmaW5pdGlvbiwgYmVjYXVzZSBpdCBpcyBkZWxldGVkL2RlZmF1bHRlZCBvciBpcyBkZWZpbmVkIHRocm91Z2gKKyAgLy8gICAgIHNvbWUgb3RoZXIgbWVjaGFuaXNtIChhbGlhcywgaWZ1bmMpLgorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGhhcyBhIGJvZHkuCisgIC8vLworICAvLy8gVGhlIGZ1bmN0aW9uIGJvZHkgbWlnaHQgYmUgaW4gYW55IG9mIHRoZSAocmUtKWRlY2xhcmF0aW9ucyBvZiB0aGlzCisgIC8vLyBmdW5jdGlvbi4gVGhlIHZhcmlhbnQgdGhhdCBhY2NlcHRzIGEgRnVuY3Rpb25EZWNsIHBvaW50ZXIgd2lsbCBzZXQgdGhhdAorICAvLy8gZnVuY3Rpb24gZGVjbGFyYXRpb24gdG8gdGhlIGFjdHVhbCBkZWNsYXJhdGlvbiBjb250YWluaW5nIHRoZSBib2R5IChpZgorICAvLy8gdGhlcmUgaXMgb25lKS4KKyAgYm9vbCBoYXNCb2R5KGNvbnN0IEZ1bmN0aW9uRGVjbCAqJkRlZmluaXRpb24pIGNvbnN0OworCisgIGJvb2wgaGFzQm9keSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBjb25zdCBGdW5jdGlvbkRlY2wqIERlZmluaXRpb247CisgICAgcmV0dXJuIGhhc0JvZHkoRGVmaW5pdGlvbik7CisgIH0KKworICAvLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBoYXMgYSB0cml2aWFsIGJvZHkgdGhhdCBkb2VzIG5vdCByZXF1aXJlIGFueQorICAvLy8gc3BlY2lmaWMgY29kZWdlbi4KKyAgYm9vbCBoYXNUcml2aWFsQm9keSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGhhcyBhIGRlZmluaXRpb24gdGhhdCBkb2VzIG5vdCBuZWVkIHRvIGJlCisgIC8vLyBpbnN0YW50aWF0ZWQuCisgIC8vLworICAvLy8gVGhlIHZhcmlhbnQgdGhhdCBhY2NlcHRzIGEgRnVuY3Rpb25EZWNsIHBvaW50ZXIgd2lsbCBzZXQgdGhhdCBmdW5jdGlvbgorICAvLy8gZGVjbGFyYXRpb24gdG8gdGhlIGRlY2xhcmF0aW9uIHRoYXQgaXMgYSBkZWZpbml0aW9uIChpZiB0aGVyZSBpcyBvbmUpLgorICBib29sIGlzRGVmaW5lZChjb25zdCBGdW5jdGlvbkRlY2wgKiZEZWZpbml0aW9uKSBjb25zdDsKKworICB2aXJ0dWFsIGJvb2wgaXNEZWZpbmVkKCkgY29uc3QgeworICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCogRGVmaW5pdGlvbjsKKyAgICByZXR1cm4gaXNEZWZpbmVkKERlZmluaXRpb24pOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGRlZmluaXRpb24gZm9yIHRoaXMgZGVjbGFyYXRpb24uCisgIEZ1bmN0aW9uRGVjbCAqZ2V0RGVmaW5pdGlvbigpIHsKKyAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkRlZmluaXRpb247CisgICAgaWYgKGlzRGVmaW5lZChEZWZpbml0aW9uKSkKKyAgICAgIHJldHVybiBjb25zdF9jYXN0PEZ1bmN0aW9uRGVjbCAqPihEZWZpbml0aW9uKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBjb25zdCBGdW5jdGlvbkRlY2wgKmdldERlZmluaXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RnVuY3Rpb25EZWNsICo+KHRoaXMpLT5nZXREZWZpbml0aW9uKCk7CisgIH0KKworICAvLy8gUmV0cmlldmUgdGhlIGJvZHkgKGRlZmluaXRpb24pIG9mIHRoZSBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uIGJvZHkgbWlnaHQgYmUKKyAgLy8vIGluIGFueSBvZiB0aGUgKHJlLSlkZWNsYXJhdGlvbnMgb2YgdGhpcyBmdW5jdGlvbi4gVGhlIHZhcmlhbnQgdGhhdCBhY2NlcHRzCisgIC8vLyBhIEZ1bmN0aW9uRGVjbCBwb2ludGVyIHdpbGwgc2V0IHRoYXQgZnVuY3Rpb24gZGVjbGFyYXRpb24gdG8gdGhlIGFjdHVhbAorICAvLy8gZGVjbGFyYXRpb24gY29udGFpbmluZyB0aGUgYm9keSAoaWYgdGhlcmUgaXMgb25lKS4KKyAgLy8vIE5PVEU6IEZvciBjaGVja2luZyBpZiB0aGVyZSBpcyBhIGJvZHksIHVzZSBoYXNCb2R5KCkgaW5zdGVhZCwgdG8gYXZvaWQKKyAgLy8vIHVubmVjZXNzYXJ5IEFTVCBkZS1zZXJpYWxpemF0aW9uIG9mIHRoZSBib2R5LgorICBTdG10ICpnZXRCb2R5KGNvbnN0IEZ1bmN0aW9uRGVjbCAqJkRlZmluaXRpb24pIGNvbnN0OworCisgIFN0bXQgKmdldEJvZHkoKSBjb25zdCBvdmVycmlkZSB7CisgICAgY29uc3QgRnVuY3Rpb25EZWNsKiBEZWZpbml0aW9uOworICAgIHJldHVybiBnZXRCb2R5KERlZmluaXRpb24pOworICB9CisKKyAgLy8vIFJldHVybnMgd2hldGhlciB0aGlzIHNwZWNpZmljIGRlY2xhcmF0aW9uIG9mIHRoZSBmdW5jdGlvbiBpcyBhbHNvIGEKKyAgLy8vIGRlZmluaXRpb24gdGhhdCBkb2VzIG5vdCBjb250YWluIHVuaW5zdGFudGlhdGVkIGJvZHkuCisgIC8vLworICAvLy8gVGhpcyBkb2VzIG5vdCBkZXRlcm1pbmUgd2hldGhlciB0aGUgZnVuY3Rpb24gaGFzIGJlZW4gZGVmaW5lZCAoZS5nLiwgaW4gYQorICAvLy8gcHJldmlvdXMgZGVmaW5pdGlvbik7IGZvciB0aGF0IGluZm9ybWF0aW9uLCB1c2UgaXNEZWZpbmVkLgorICBib29sIGlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIElzRGVsZXRlZCB8fCBJc0RlZmF1bHRlZCB8fCBCb2R5IHx8IEhhc1NraXBwZWRCb2R5IHx8CisgICAgICAgICAgIElzTGF0ZVRlbXBsYXRlUGFyc2VkIHx8IFdpbGxIYXZlQm9keSB8fCBoYXNEZWZpbmluZ0F0dHIoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzcGVjaWZpYyBkZWNsYXJhdGlvbiBvZiB0aGUgZnVuY3Rpb24gaGFzIGEgYm9keS4KKyAgYm9vbCBkb2VzVGhpc0RlY2xhcmF0aW9uSGF2ZUFCb2R5KCkgY29uc3QgeworICAgIHJldHVybiBCb2R5IHx8IElzTGF0ZVRlbXBsYXRlUGFyc2VkOworICB9CisKKyAgdm9pZCBzZXRCb2R5KFN0bXQgKkIpOworICB2b2lkIHNldExhenlCb2R5KHVpbnQ2NF90IE9mZnNldCkgeyBCb2R5ID0gT2Zmc2V0OyB9CisKKyAgLy8vIFdoZXRoZXIgdGhpcyBmdW5jdGlvbiBpcyB2YXJpYWRpYy4KKyAgYm9vbCBpc1ZhcmlhZGljKCkgY29uc3Q7CisKKyAgLy8vIFdoZXRoZXIgdGhpcyBmdW5jdGlvbiBpcyBtYXJrZWQgYXMgdmlydHVhbCBleHBsaWNpdGx5LgorICBib29sIGlzVmlydHVhbEFzV3JpdHRlbigpIGNvbnN0IHsgcmV0dXJuIElzVmlydHVhbEFzV3JpdHRlbjsgfQorICB2b2lkIHNldFZpcnR1YWxBc1dyaXR0ZW4oYm9vbCBWKSB7IElzVmlydHVhbEFzV3JpdHRlbiA9IFY7IH0KKworICAvLy8gV2hldGhlciB0aGlzIHZpcnR1YWwgZnVuY3Rpb24gaXMgcHVyZSwgaS5lLiBtYWtlcyB0aGUgY29udGFpbmluZyBjbGFzcworICAvLy8gYWJzdHJhY3QuCisgIGJvb2wgaXNQdXJlKCkgY29uc3QgeyByZXR1cm4gSXNQdXJlOyB9CisgIHZvaWQgc2V0UHVyZShib29sIFAgPSB0cnVlKTsKKworICAvLy8gV2hldGhlciB0aGlzIHRlbXBsYXRlZCBmdW5jdGlvbiB3aWxsIGJlIGxhdGUgcGFyc2VkLgorICBib29sIGlzTGF0ZVRlbXBsYXRlUGFyc2VkKCkgY29uc3QgeyByZXR1cm4gSXNMYXRlVGVtcGxhdGVQYXJzZWQ7IH0KKyAgdm9pZCBzZXRMYXRlVGVtcGxhdGVQYXJzZWQoYm9vbCBJTFQgPSB0cnVlKSB7IElzTGF0ZVRlbXBsYXRlUGFyc2VkID0gSUxUOyB9CisKKyAgLy8vIFdoZXRoZXIgdGhpcyBmdW5jdGlvbiBpcyAidHJpdmlhbCIgaW4gc29tZSBzcGVjaWFsaXplZCBDKysgc2Vuc2VzLgorICAvLy8gQ2FuIG9ubHkgYmUgdHJ1ZSBmb3IgZGVmYXVsdCBjb25zdHJ1Y3RvcnMsIGNvcHkgY29uc3RydWN0b3JzLAorICAvLy8gY29weSBhc3NpZ25tZW50IG9wZXJhdG9ycywgYW5kIGRlc3RydWN0b3JzLiAgTm90IG1lYW5pbmdmdWwgdW50aWwKKyAgLy8vIHRoZSBjbGFzcyBoYXMgYmVlbiBmdWxseSBidWlsdCBieSBTZW1hLgorICBib29sIGlzVHJpdmlhbCgpIGNvbnN0IHsgcmV0dXJuIElzVHJpdmlhbDsgfQorICB2b2lkIHNldFRyaXZpYWwoYm9vbCBJVCkgeyBJc1RyaXZpYWwgPSBJVDsgfQorCisgIGJvb2wgaXNUcml2aWFsRm9yQ2FsbCgpIGNvbnN0IHsgcmV0dXJuIElzVHJpdmlhbEZvckNhbGw7IH0KKyAgdm9pZCBzZXRUcml2aWFsRm9yQ2FsbChib29sIElUKSB7IElzVHJpdmlhbEZvckNhbGwgPSBJVDsgfQorCisgIC8vLyBXaGV0aGVyIHRoaXMgZnVuY3Rpb24gaXMgZGVmYXVsdGVkIHBlciBDKysweC4gT25seSB2YWxpZCBmb3IKKyAgLy8vIHNwZWNpYWwgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgYm9vbCBpc0RlZmF1bHRlZCgpIGNvbnN0IHsgcmV0dXJuIElzRGVmYXVsdGVkOyB9CisgIHZvaWQgc2V0RGVmYXVsdGVkKGJvb2wgRCA9IHRydWUpIHsgSXNEZWZhdWx0ZWQgPSBEOyB9CisKKyAgLy8vIFdoZXRoZXIgdGhpcyBmdW5jdGlvbiBpcyBleHBsaWNpdGx5IGRlZmF1bHRlZCBwZXIgQysrMHguIE9ubHkgdmFsaWQKKyAgLy8vIGZvciBzcGVjaWFsIG1lbWJlciBmdW5jdGlvbnMuCisgIGJvb2wgaXNFeHBsaWNpdGx5RGVmYXVsdGVkKCkgY29uc3QgeyByZXR1cm4gSXNFeHBsaWNpdGx5RGVmYXVsdGVkOyB9CisgIHZvaWQgc2V0RXhwbGljaXRseURlZmF1bHRlZChib29sIEVEID0gdHJ1ZSkgeyBJc0V4cGxpY2l0bHlEZWZhdWx0ZWQgPSBFRDsgfQorCisgIC8vLyBXaGV0aGVyIGZhbGxpbmcgb2ZmIHRoaXMgZnVuY3Rpb24gaW1wbGljaXRseSByZXR1cm5zIG51bGwvemVyby4KKyAgLy8vIElmIGEgbW9yZSBzcGVjaWZpYyBpbXBsaWNpdCByZXR1cm4gdmFsdWUgaXMgcmVxdWlyZWQsIGZyb250LWVuZHMKKyAgLy8vIHNob3VsZCBzeW50aGVzaXplIHRoZSBhcHByb3ByaWF0ZSByZXR1cm4gc3RhdGVtZW50cy4KKyAgYm9vbCBoYXNJbXBsaWNpdFJldHVyblplcm8oKSBjb25zdCB7IHJldHVybiBIYXNJbXBsaWNpdFJldHVyblplcm87IH0KKyAgdm9pZCBzZXRIYXNJbXBsaWNpdFJldHVyblplcm8oYm9vbCBJUlopIHsgSGFzSW1wbGljaXRSZXR1cm5aZXJvID0gSVJaOyB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgZnVuY3Rpb24gaGFzIGEgcHJvdG90eXBlLCBlaXRoZXIgYmVjYXVzZSBvbmUKKyAgLy8vIHdhcyBleHBsaWNpdGx5IHdyaXR0ZW4gb3IgYmVjYXVzZSBpdCB3YXMgImluaGVyaXRlZCIgYnkgbWVyZ2luZworICAvLy8gYSBkZWNsYXJhdGlvbiB3aXRob3V0IGEgcHJvdG90eXBlIHdpdGggYSBkZWNsYXJhdGlvbiB0aGF0IGhhcyBhCisgIC8vLyBwcm90b3R5cGUuCisgIGJvb2wgaGFzUHJvdG90eXBlKCkgY29uc3QgeworICAgIHJldHVybiBIYXNXcml0dGVuUHJvdG90eXBlIHx8IEhhc0luaGVyaXRlZFByb3RvdHlwZTsKKyAgfQorCisgIGJvb2wgaGFzV3JpdHRlblByb3RvdHlwZSgpIGNvbnN0IHsgcmV0dXJuIEhhc1dyaXR0ZW5Qcm90b3R5cGU7IH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBmdW5jdGlvbiBpbmhlcml0ZWQgaXRzIHByb3RvdHlwZSBmcm9tIGEKKyAgLy8vIHByZXZpb3VzIGRlY2xhcmF0aW9uLgorICBib29sIGhhc0luaGVyaXRlZFByb3RvdHlwZSgpIGNvbnN0IHsgcmV0dXJuIEhhc0luaGVyaXRlZFByb3RvdHlwZTsgfQorICB2b2lkIHNldEhhc0luaGVyaXRlZFByb3RvdHlwZShib29sIFAgPSB0cnVlKSB7IEhhc0luaGVyaXRlZFByb3RvdHlwZSA9IFA7IH0KKworICAvLy8gV2hldGhlciB0aGlzIGlzIGEgKEMrKzExKSBjb25zdGV4cHIgZnVuY3Rpb24gb3IgY29uc3RleHByIGNvbnN0cnVjdG9yLgorICBib29sIGlzQ29uc3RleHByKCkgY29uc3QgeyByZXR1cm4gSXNDb25zdGV4cHI7IH0KKyAgdm9pZCBzZXRDb25zdGV4cHIoYm9vbCBJQykgeyBJc0NvbnN0ZXhwciA9IElDOyB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoZSBpbnN0YW50aWF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gaXMgcGVuZGluZy4KKyAgLy8vIFRoaXMgYml0IGlzIHNldCB3aGVuIHRoZSBkZWNpc2lvbiB0byBpbnN0YW50aWF0ZSB0aGlzIGZ1bmN0aW9uIGlzIG1hZGUKKyAgLy8vIGFuZCB1bnNldCBpZiBhbmQgd2hlbiB0aGUgZnVuY3Rpb24gYm9keSBpcyBjcmVhdGVkLiBUaGF0IGxlYXZlcyBvdXQKKyAgLy8vIGNhc2VzIHdoZXJlIGluc3RhbnRpYXRpb24gZGlkIG5vdCBoYXBwZW4gYmVjYXVzZSB0aGUgdGVtcGxhdGUgZGVmaW5pdGlvbgorICAvLy8gd2FzIG5vdCBzZWVuIGluIHRoaXMgVFUuIFRoaXMgYml0IHJlbWFpbnMgc2V0IGluIHRob3NlIGNhc2VzLCB1bmRlciB0aGUKKyAgLy8vIGFzc3VtcHRpb24gdGhhdCB0aGUgaW5zdGFudGlhdGlvbiB3aWxsIGhhcHBlbiBpbiBzb21lIG90aGVyIFRVLgorICBib29sIGluc3RhbnRpYXRpb25Jc1BlbmRpbmcoKSBjb25zdCB7IHJldHVybiBJbnN0YW50aWF0aW9uSXNQZW5kaW5nOyB9CisgIHZvaWQgc2V0SW5zdGFudGlhdGlvbklzUGVuZGluZyhib29sIElDKSB7IEluc3RhbnRpYXRpb25Jc1BlbmRpbmcgPSBJQzsgfQorCisgIC8vLyBcYnJpZWYgSW5kaWNhdGVzIHRoZSBmdW5jdGlvbiB1c2VzIF9fdHJ5LgorICBib29sIHVzZXNTRUhUcnkoKSBjb25zdCB7IHJldHVybiBVc2VzU0VIVHJ5OyB9CisgIHZvaWQgc2V0VXNlc1NFSFRyeShib29sIFVTVCkgeyBVc2VzU0VIVHJ5ID0gVVNUOyB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gZGVsZXRlZC4KKyAgLy8vCisgIC8vLyBBIGZ1bmN0aW9uIHRoYXQgaXMgImRlbGV0ZWQiICh2aWEgdGhlIEMrKzB4ICI9IGRlbGV0ZSIgc3ludGF4KQorICAvLy8gYWN0cyBsaWtlIGEgbm9ybWFsIGZ1bmN0aW9uLCBleGNlcHQgdGhhdCBpdCBjYW5ub3QgYWN0dWFsbHkgYmUKKyAgLy8vIGNhbGxlZCBvciBoYXZlIGl0cyBhZGRyZXNzIHRha2VuLiBEZWxldGVkIGZ1bmN0aW9ucyBhcmUKKyAgLy8vIHR5cGljYWxseSB1c2VkIGluIEMrKyBvdmVybG9hZCByZXNvbHV0aW9uIHRvIGF0dHJhY3QgYXJndW1lbnRzCisgIC8vLyB3aG9zZSB0eXBlIG9yIGx2YWx1ZS9ydmFsdWUtbmVzcyB3b3VsZCBwZXJtaXQgdGhlIHVzZSBvZiBhCisgIC8vLyBkaWZmZXJlbnQgb3ZlcmxvYWQgdGhhdCB3b3VsZCBiZWhhdmUgaW5jb3JyZWN0bHkuIEZvciBleGFtcGxlLAorICAvLy8gb25lIG1pZ2h0IHVzZSBkZWxldGVkIGZ1bmN0aW9ucyB0byBiYW4gaW1wbGljaXQgY29udmVyc2lvbiBmcm9tCisgIC8vLyBhIGZsb2F0aW5nLXBvaW50IG51bWJlciB0byBhbiBJbnRlZ2VyIHR5cGU6CisgIC8vLworICAvLy8gQGNvZGUKKyAgLy8vIHN0cnVjdCBJbnRlZ2VyIHsKKyAgLy8vICAgSW50ZWdlcihsb25nKTsgLy8gY29uc3RydWN0IGZyb20gYSBsb25nCisgIC8vLyAgIEludGVnZXIoZG91YmxlKSA9IGRlbGV0ZTsgLy8gbm8gY29uc3RydWN0aW9uIGZyb20gZmxvYXQgb3IgZG91YmxlCisgIC8vLyAgIEludGVnZXIobG9uZyBkb3VibGUpID0gZGVsZXRlOyAvLyBubyBjb25zdHJ1Y3Rpb24gZnJvbSBsb25nIGRvdWJsZQorICAvLy8gfTsKKyAgLy8vIEBlbmRjb2RlCisgIC8vIElmIGEgZnVuY3Rpb24gaXMgZGVsZXRlZCwgaXRzIGZpcnN0IGRlY2xhcmF0aW9uIG11c3QgYmUuCisgIGJvb2wgaXNEZWxldGVkKCkgY29uc3QgeyByZXR1cm4gZ2V0Q2Fub25pY2FsRGVjbCgpLT5Jc0RlbGV0ZWQ7IH0KKyAgYm9vbCBpc0RlbGV0ZWRBc1dyaXR0ZW4oKSBjb25zdCB7IHJldHVybiBJc0RlbGV0ZWQgJiYgIUlzRGVmYXVsdGVkOyB9CisgIHZvaWQgc2V0RGVsZXRlZEFzV3JpdHRlbihib29sIEQgPSB0cnVlKSB7IElzRGVsZXRlZCA9IEQ7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB0aGlzIGZ1bmN0aW9uIGlzICJtYWluIiwgd2hpY2ggaXMgdGhlCisgIC8vLyBlbnRyeSBwb2ludCBpbnRvIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4KKyAgYm9vbCBpc01haW4oKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB0aGlzIGZ1bmN0aW9uIGlzIGEgTVNWQ1JUIHVzZXIgZGVmaW5lZCBlbnRyeQorICAvLy8gcG9pbnQuCisgIGJvb2wgaXNNU1ZDUlRFbnRyeVBvaW50KCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBvcGVyYXRvciBuZXcgb3IgZGVsZXRlIGlzIG9uZQorICAvLy8gb2YgdGhlIHJlc2VydmVkIGdsb2JhbCBwbGFjZW1lbnQgb3BlcmF0b3JzOgorICAvLy8gICAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCwgdm9pZCAqKTsKKyAgLy8vICAgIHZvaWQgKm9wZXJhdG9yIG5ld1tdKHNpemVfdCwgdm9pZCAqKTsKKyAgLy8vICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKiwgdm9pZCAqKTsKKyAgLy8vICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCAqLCB2b2lkICopOworICAvLy8gVGhlc2UgZnVuY3Rpb25zIGhhdmUgc3BlY2lhbCBiZWhhdmlvciB1bmRlciBbbmV3LmRlbGV0ZS5wbGFjZW1lbnRdOgorICAvLy8gICAgVGhlc2UgZnVuY3Rpb25zIGFyZSByZXNlcnZlZCwgYSBDKysgcHJvZ3JhbSBtYXkgbm90IGRlZmluZQorICAvLy8gICAgZnVuY3Rpb25zIHRoYXQgZGlzcGxhY2UgdGhlIHZlcnNpb25zIGluIHRoZSBTdGFuZGFyZCBDKysgbGlicmFyeS4KKyAgLy8vICAgIFRoZSBwcm92aXNpb25zIG9mIFtiYXNpYy5zdGMuZHluYW1pY10gZG8gbm90IGFwcGx5IHRvIHRoZXNlCisgIC8vLyAgICByZXNlcnZlZCBwbGFjZW1lbnQgZm9ybXMgb2Ygb3BlcmF0b3IgbmV3IGFuZCBvcGVyYXRvciBkZWxldGUuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGFuIGFsbG9jYXRpb24gb3IgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uLgorICBib29sIGlzUmVzZXJ2ZWRHbG9iYWxQbGFjZW1lbnRPcGVyYXRvcigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgZnVuY3Rpb24gaXMgb25lIG9mIHRoZSByZXBsYWNlYWJsZQorICAvLy8gZ2xvYmFsIGFsbG9jYXRpb24gZnVuY3Rpb25zOgorICAvLy8gICAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCk7CisgIC8vLyAgICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90LCBjb25zdCBzdGQ6Om5vdGhyb3dfdCAmKSBub2V4Y2VwdDsKKyAgLy8vICAgIHZvaWQgKm9wZXJhdG9yIG5ld1tdKHNpemVfdCk7CisgIC8vLyAgICB2b2lkICpvcGVyYXRvciBuZXdbXShzaXplX3QsIGNvbnN0IHN0ZDo6bm90aHJvd190ICYpIG5vZXhjZXB0OworICAvLy8gICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqKSBub2V4Y2VwdDsKKyAgLy8vICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKiwgc3RkOjpzaXplX3QpIG5vZXhjZXB0OyAgICAgIFtDKysxeV0KKyAgLy8vICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKiwgY29uc3Qgc3RkOjpub3Rocm93X3QgJikgbm9leGNlcHQ7CisgIC8vLyAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQgKikgbm9leGNlcHQ7CisgIC8vLyAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQgKiwgc3RkOjpzaXplX3QpIG5vZXhjZXB0OyAgICBbQysrMXldCisgIC8vLyAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQgKiwgY29uc3Qgc3RkOjpub3Rocm93X3QgJikgbm9leGNlcHQ7CisgIC8vLyBUaGVzZSBmdW5jdGlvbnMgaGF2ZSBzcGVjaWFsIGJlaGF2aW9yIHVuZGVyIEMrKzF5IFtleHByLm5ld106CisgIC8vLyAgICBBbiBpbXBsZW1lbnRhdGlvbiBpcyBhbGxvd2VkIHRvIG9taXQgYSBjYWxsIHRvIGEgcmVwbGFjZWFibGUgZ2xvYmFsCisgIC8vLyAgICBhbGxvY2F0aW9uIGZ1bmN0aW9uLiBbLi4uXQorICAvLy8KKyAgLy8vIElmIHRoaXMgZnVuY3Rpb24gaXMgYW4gYWxpZ25lZCBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiBmdW5jdGlvbiwgcmV0dXJuCisgIC8vLyB0cnVlIHRocm91Z2ggSXNBbGlnbmVkLgorICBib29sIGlzUmVwbGFjZWFibGVHbG9iYWxBbGxvY2F0aW9uRnVuY3Rpb24oYm9vbCAqSXNBbGlnbmVkID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgZGVzdHJveWluZyBvcGVyYXRvciBkZWxldGUuCisgIGJvb2wgaXNEZXN0cm95aW5nT3BlcmF0b3JEZWxldGUoKSBjb25zdDsKKworICAvLy8gQ29tcHV0ZSB0aGUgbGFuZ3VhZ2UgbGlua2FnZS4KKyAgTGFuZ3VhZ2VMaW5rYWdlIGdldExhbmd1YWdlTGlua2FnZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgZnVuY3Rpb24gaXMgYSBmdW5jdGlvbiB3aXRoCisgIC8vLyBleHRlcm5hbCwgQyBsaW5rYWdlLgorICBib29sIGlzRXh0ZXJuQygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgZnVuY3Rpb24ncyBjb250ZXh0IGlzLCBvciBpcyBuZXN0ZWQgd2l0aGluLAorICAvLy8gYSBDKysgZXh0ZXJuICJDIiBsaW5rYWdlIHNwZWMuCisgIGJvb2wgaXNJbkV4dGVybkNDb250ZXh0KCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBmdW5jdGlvbidzIGNvbnRleHQgaXMsIG9yIGlzIG5lc3RlZCB3aXRoaW4sCisgIC8vLyBhIEMrKyBleHRlcm4gIkMrKyIgbGlua2FnZSBzcGVjLgorICBib29sIGlzSW5FeHRlcm5DWFhDb250ZXh0KCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBmdW5jdGlvbi4KKyAgYm9vbCBpc0dsb2JhbCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgZnVuY3Rpb24gaXMga25vd24gdG8gYmUgJ25vcmV0dXJuJywgdGhyb3VnaAorICAvLy8gYW4gYXR0cmlidXRlIG9uIGl0cyBkZWNsYXJhdGlvbiBvciBpdHMgdHlwZS4KKyAgYm9vbCBpc05vUmV0dXJuKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoZSBmdW5jdGlvbiB3YXMgYSBkZWZpbml0aW9uIGJ1dCBpdHMgYm9keSB3YXMgc2tpcHBlZC4KKyAgYm9vbCBoYXNTa2lwcGVkQm9keSgpIGNvbnN0IHsgcmV0dXJuIEhhc1NraXBwZWRCb2R5OyB9CisgIHZvaWQgc2V0SGFzU2tpcHBlZEJvZHkoYm9vbCBTa2lwcGVkID0gdHJ1ZSkgeyBIYXNTa2lwcGVkQm9keSA9IFNraXBwZWQ7IH0KKworICAvLy8gVHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIHdpbGwgZXZlbnR1YWxseSBoYXZlIGEgYm9keSwgb25jZSBpdCdzIGZ1bGx5IHBhcnNlZC4KKyAgYm9vbCB3aWxsSGF2ZUJvZHkoKSBjb25zdCB7IHJldHVybiBXaWxsSGF2ZUJvZHk7IH0KKyAgdm9pZCBzZXRXaWxsSGF2ZUJvZHkoYm9vbCBWID0gdHJ1ZSkgeyBXaWxsSGF2ZUJvZHkgPSBWOyB9CisKKyAgLy8vIFRydWUgaWYgdGhpcyBmdW5jdGlvbiBpcyBjb25zaWRlcmVkIGEgbXVsdGl2ZXJzaW9uZWQgZnVuY3Rpb24uCisgIGJvb2wgaXNNdWx0aVZlcnNpb24oKSBjb25zdCB7IHJldHVybiBnZXRDYW5vbmljYWxEZWNsKCktPklzTXVsdGlWZXJzaW9uOyB9CisKKyAgLy8vIFNldHMgdGhlIG11bHRpdmVyc2lvbiBzdGF0ZSBmb3IgdGhpcyBkZWNsYXJhdGlvbiBhbmQgYWxsIG9mIGl0cworICAvLy8gcmVkZWNsYXJhdGlvbnMuCisgIHZvaWQgc2V0SXNNdWx0aVZlcnNpb24oYm9vbCBWID0gdHJ1ZSkgeworICAgIGdldENhbm9uaWNhbERlY2woKS0+SXNNdWx0aVZlcnNpb24gPSBWOworICB9CisKKyAgdm9pZCBzZXRQcmV2aW91c0RlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbCAqIFByZXZEZWNsKTsKKworICBGdW5jdGlvbkRlY2wgKmdldENhbm9uaWNhbERlY2woKSBvdmVycmlkZTsKKyAgY29uc3QgRnVuY3Rpb25EZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PEZ1bmN0aW9uRGVjbCo+KHRoaXMpLT5nZXRDYW5vbmljYWxEZWNsKCk7CisgIH0KKworICB1bnNpZ25lZCBnZXRCdWlsdGluSUQoKSBjb25zdDsKKworICAvLyBBcnJheVJlZiBpbnRlcmZhY2UgdG8gcGFyYW1ldGVycy4KKyAgQXJyYXlSZWY8UGFybVZhckRlY2wgKj4gcGFyYW1ldGVycygpIGNvbnN0IHsKKyAgICByZXR1cm4ge1BhcmFtSW5mbywgZ2V0TnVtUGFyYW1zKCl9OworICB9CisgIE11dGFibGVBcnJheVJlZjxQYXJtVmFyRGVjbCAqPiBwYXJhbWV0ZXJzKCkgeworICAgIHJldHVybiB7UGFyYW1JbmZvLCBnZXROdW1QYXJhbXMoKX07CisgIH0KKworICAvLyBJdGVyYXRvciBhY2Nlc3MgdG8gZm9ybWFsIHBhcmFtZXRlcnMuCisgIHVzaW5nIHBhcmFtX2l0ZXJhdG9yID0gTXV0YWJsZUFycmF5UmVmPFBhcm1WYXJEZWNsICo+OjppdGVyYXRvcjsKKyAgdXNpbmcgcGFyYW1fY29uc3RfaXRlcmF0b3IgPSBBcnJheVJlZjxQYXJtVmFyRGVjbCAqPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgYm9vbCBwYXJhbV9lbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHBhcmFtZXRlcnMoKS5lbXB0eSgpOyB9CisgIHBhcmFtX2l0ZXJhdG9yIHBhcmFtX2JlZ2luKCkgeyByZXR1cm4gcGFyYW1ldGVycygpLmJlZ2luKCk7IH0KKyAgcGFyYW1faXRlcmF0b3IgcGFyYW1fZW5kKCkgeyByZXR1cm4gcGFyYW1ldGVycygpLmVuZCgpOyB9CisgIHBhcmFtX2NvbnN0X2l0ZXJhdG9yIHBhcmFtX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gcGFyYW1ldGVycygpLmJlZ2luKCk7IH0KKyAgcGFyYW1fY29uc3RfaXRlcmF0b3IgcGFyYW1fZW5kKCkgY29uc3QgeyByZXR1cm4gcGFyYW1ldGVycygpLmVuZCgpOyB9CisgIHNpemVfdCBwYXJhbV9zaXplKCkgY29uc3QgeyByZXR1cm4gcGFyYW1ldGVycygpLnNpemUoKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIHRoaXMgZnVuY3Rpb24gbXVzdCBoYXZlIGJhc2VkIG9uIGl0cworICAvLy8gRnVuY3Rpb25UeXBlLiAgVGhpcyBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBQYXJhbUluZm8gYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4KKyAgLy8vIGNyZWF0ZWQuCisgIHVuc2lnbmVkIGdldE51bVBhcmFtcygpIGNvbnN0OworCisgIGNvbnN0IFBhcm1WYXJEZWNsICpnZXRQYXJhbURlY2wodW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgZ2V0TnVtUGFyYW1zKCkgJiYgIklsbGVnYWwgcGFyYW0gIyIpOworICAgIHJldHVybiBQYXJhbUluZm9baV07CisgIH0KKyAgUGFybVZhckRlY2wgKmdldFBhcmFtRGVjbCh1bnNpZ25lZCBpKSB7CisgICAgYXNzZXJ0KGkgPCBnZXROdW1QYXJhbXMoKSAmJiAiSWxsZWdhbCBwYXJhbSAjIik7CisgICAgcmV0dXJuIFBhcmFtSW5mb1tpXTsKKyAgfQorICB2b2lkIHNldFBhcmFtcyhBcnJheVJlZjxQYXJtVmFyRGVjbCAqPiBOZXdQYXJhbUluZm8pIHsKKyAgICBzZXRQYXJhbXMoZ2V0QVNUQ29udGV4dCgpLCBOZXdQYXJhbUluZm8pOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyBuZWVkZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLiBUaGlzCisgIC8vLyBtYXkgYmUgZmV3ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGZ1bmN0aW9uIHBhcmFtZXRlcnMsIGlmIHNvbWUgb2YgdGhlCisgIC8vLyBwYXJhbWV0ZXJzIGhhdmUgZGVmYXVsdCBhcmd1bWVudHMgKGluIEMrKykuCisgIHVuc2lnbmVkIGdldE1pblJlcXVpcmVkQXJndW1lbnRzKCkgY29uc3Q7CisKKyAgUXVhbFR5cGUgZ2V0UmV0dXJuVHlwZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0VHlwZSgpLT5nZXRBczxGdW5jdGlvblR5cGU+KCkgJiYgIkV4cGVjdGVkIGEgRnVuY3Rpb25UeXBlISIpOworICAgIHJldHVybiBnZXRUeXBlKCktPmdldEFzPEZ1bmN0aW9uVHlwZT4oKS0+Z2V0UmV0dXJuVHlwZSgpOworICB9CisKKyAgLy8vIFxicmllZiBBdHRlbXB0IHRvIGNvbXB1dGUgYW4gaW5mb3JtYXRpdmUgc291cmNlIHJhbmdlIGNvdmVyaW5nIHRoZQorICAvLy8gZnVuY3Rpb24gcmV0dXJuIHR5cGUuIFRoaXMgbWF5IG9taXQgcXVhbGlmaWVycyBhbmQgb3RoZXIgaW5mb3JtYXRpb24gd2l0aAorICAvLy8gbGltaXRlZCByZXByZXNlbnRhdGlvbiBpbiB0aGUgQVNULgorICBTb3VyY2VSYW5nZSBnZXRSZXR1cm5UeXBlU291cmNlUmFuZ2UoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEF0dGVtcHQgdG8gY29tcHV0ZSBhbiBpbmZvcm1hdGl2ZSBzb3VyY2UgcmFuZ2UgY292ZXJpbmcgdGhlCisgIC8vLyBmdW5jdGlvbiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiwgaWYgYW55LgorICBTb3VyY2VSYW5nZSBnZXRFeGNlcHRpb25TcGVjU291cmNlUmFuZ2UoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgdHlwZSBvZiBhbiBleHByZXNzaW9uIHRoYXQgY2FsbHMgdGhpcyBmdW5jdGlvbi4KKyAgUXVhbFR5cGUgZ2V0Q2FsbFJlc3VsdFR5cGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpICYmICJFeHBlY3RlZCBhIEZ1bmN0aW9uVHlwZSEiKTsKKyAgICByZXR1cm4gZ2V0VHlwZSgpLT5nZXRBczxGdW5jdGlvblR5cGU+KCktPmdldENhbGxSZXN1bHRUeXBlKGdldEFTVENvbnRleHQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIFdhcm5VbnVzZWRSZXN1bHRBdHRyIHRoYXQgaXMgZWl0aGVyIGRlY2xhcmVkIG9uIHRoaXMKKyAgLy8vIGZ1bmN0aW9uLCBvciBpdHMgcmV0dXJuIHR5cGUgZGVjbGFyYXRpb24uCisgIGNvbnN0IEF0dHIgKmdldFVudXNlZFJlc3VsdEF0dHIoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIG9yIGl0cyByZXR1cm4gdHlwZSBoYXMgdGhlCisgIC8vLyB3YXJuX3VudXNlZF9yZXN1bHQgYXR0cmlidXRlLgorICBib29sIGhhc1VudXNlZFJlc3VsdEF0dHIoKSBjb25zdCB7IHJldHVybiBnZXRVbnVzZWRSZXN1bHRBdHRyKCkgIT0gbnVsbHB0cjsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgc3RvcmFnZSBjbGFzcyBhcyB3cml0dGVuIGluIHRoZSBzb3VyY2UuIEZvciB0aGUKKyAgLy8vIGNvbXB1dGVkIGxpbmthZ2Ugb2Ygc3ltYm9sLCBzZWUgZ2V0TGlua2FnZS4KKyAgU3RvcmFnZUNsYXNzIGdldFN0b3JhZ2VDbGFzcygpIGNvbnN0IHsgcmV0dXJuIFN0b3JhZ2VDbGFzcyhTQ2xhc3MpOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgImlubGluZSIga2V5d29yZCB3YXMgc3BlY2lmaWVkIGZvciB0aGlzCisgIC8vLyBmdW5jdGlvbi4KKyAgYm9vbCBpc0lubGluZVNwZWNpZmllZCgpIGNvbnN0IHsgcmV0dXJuIElzSW5saW5lU3BlY2lmaWVkOyB9CisKKyAgLy8vIFNldCB3aGV0aGVyIHRoZSAiaW5saW5lIiBrZXl3b3JkIHdhcyBzcGVjaWZpZWQgZm9yIHRoaXMgZnVuY3Rpb24uCisgIHZvaWQgc2V0SW5saW5lU3BlY2lmaWVkKGJvb2wgSSkgeworICAgIElzSW5saW5lU3BlY2lmaWVkID0gSTsKKyAgICBJc0lubGluZSA9IEk7CisgIH0KKworICAvLy8gRmxhZyB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgaW1wbGljaXRseSBpbmxpbmUuCisgIHZvaWQgc2V0SW1wbGljaXRseUlubGluZSgpIHsKKyAgICBJc0lubGluZSA9IHRydWU7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGlubGluZWQsIGJlY2F1c2UgaXQgaXMKKyAgLy8vIGVpdGhlciBtYXJrZWQgImlubGluZSIgb3IgImNvbnN0ZXhwciIgb3IgaXMgYSBtZW1iZXIgZnVuY3Rpb24gb2YgYSBjbGFzcworICAvLy8gdGhhdCB3YXMgZGVmaW5lZCBpbiB0aGUgY2xhc3MgYm9keS4KKyAgYm9vbCBpc0lubGluZWQoKSBjb25zdCB7IHJldHVybiBJc0lubGluZTsgfQorCisgIGJvb2wgaXNJbmxpbmVEZWZpbml0aW9uRXh0ZXJuYWxseVZpc2libGUoKSBjb25zdDsKKworICBib29sIGlzTVNFeHRlcm5JbmxpbmUoKSBjb25zdDsKKworICBib29sIGRvZXNEZWNsYXJhdGlvbkZvcmNlRXh0ZXJuYWxseVZpc2libGVEZWZpbml0aW9uKCkgY29uc3Q7CisKKyAgLy8vIFdoZXRoZXIgdGhpcyBmdW5jdGlvbiBkZWNsYXJhdGlvbiByZXByZXNlbnRzIGFuIEMrKyBvdmVybG9hZGVkCisgIC8vLyBvcGVyYXRvciwgZS5nLiwgIm9wZXJhdG9yKyIuCisgIGJvb2wgaXNPdmVybG9hZGVkT3BlcmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE92ZXJsb2FkZWRPcGVyYXRvcigpICE9IE9PX05vbmU7CisgIH0KKworICBPdmVybG9hZGVkT3BlcmF0b3JLaW5kIGdldE92ZXJsb2FkZWRPcGVyYXRvcigpIGNvbnN0OworCisgIGNvbnN0IElkZW50aWZpZXJJbmZvICpnZXRMaXRlcmFsSWRlbnRpZmllcigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgSWYgdGhpcyBmdW5jdGlvbiBpcyBhbiBpbnN0YW50aWF0aW9uIG9mIGEgbWVtYmVyIGZ1bmN0aW9uCisgIC8vLyBvZiBhIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLCByZXRyaWV2ZXMgdGhlIGZ1bmN0aW9uIGZyb20KKyAgLy8vIHdoaWNoIGl0IHdhcyBpbnN0YW50aWF0ZWQuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIHdpbGwgcmV0dXJuIG5vbi1OVUxMIGZvciAobm9uLXRlbXBsYXRlZCkgbWVtYmVyCisgIC8vLyBmdW5jdGlvbnMgb2YgY2xhc3MgdGVtcGxhdGVzIGFuZCBmb3IgaW5zdGFudGlhdGlvbnMgb2YgZnVuY3Rpb24KKyAgLy8vIHRlbXBsYXRlcy4gRm9yIGV4YW1wbGUsIGdpdmVuOgorICAvLy8KKyAgLy8vIFxjb2RlCisgIC8vLyB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAvLy8gc3RydWN0IFggeworICAvLy8gICB2b2lkIGYoVCk7CisgIC8vLyB9OworICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBUaGUgZGVjbGFyYXRpb24gZm9yIFg8aW50Pjo6ZiBpcyBhIChub24tdGVtcGxhdGVkKSBGdW5jdGlvbkRlY2wKKyAgLy8vIHdob3NlIHBhcmVudCBpcyB0aGUgY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gWDxpbnQ+LiBGb3IKKyAgLy8vIHRoaXMgZGVjbGFyYXRpb24sIGdldEluc3RhbnRpYXRlZEZyb21GdW5jdGlvbigpIHdpbGwgcmV0dXJuCisgIC8vLyB0aGUgRnVuY3Rpb25EZWNsIFg8VD46OkEuIFdoZW4gYSBjb21wbGV0ZSBkZWZpbml0aW9uIG9mCisgIC8vLyBYPGludD46OkEgaXMgcmVxdWlyZWQsIGl0IHdpbGwgYmUgaW5zdGFudGlhdGVkIGZyb20gdGhlCisgIC8vLyBkZWNsYXJhdGlvbiByZXR1cm5lZCBieSBnZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyRnVuY3Rpb24oKS4KKyAgRnVuY3Rpb25EZWNsICpnZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyRnVuY3Rpb24oKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFdoYXQga2luZCBvZiB0ZW1wbGF0ZWQgZnVuY3Rpb24gdGhpcyBpcy4KKyAgVGVtcGxhdGVkS2luZCBnZXRUZW1wbGF0ZWRLaW5kKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGFuIGluc3RhbnRpYXRpb24gb2YgYSBtZW1iZXIgZnVuY3Rpb24gb2YgYQorICAvLy8gY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24sIHJldHJpZXZlcyB0aGUgbWVtYmVyIHNwZWNpYWxpemF0aW9uCisgIC8vLyBpbmZvcm1hdGlvbi4KKyAgTWVtYmVyU3BlY2lhbGl6YXRpb25JbmZvICpnZXRNZW1iZXJTcGVjaWFsaXphdGlvbkluZm8oKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFNwZWNpZnkgdGhhdCB0aGlzIHJlY29yZCBpcyBhbiBpbnN0YW50aWF0aW9uIG9mIHRoZQorICAvLy8gbWVtYmVyIGZ1bmN0aW9uIEZELgorICB2b2lkIHNldEluc3RhbnRpYXRpb25PZk1lbWJlckZ1bmN0aW9uKEZ1bmN0aW9uRGVjbCAqRkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQgVFNLKSB7CisgICAgc2V0SW5zdGFudGlhdGlvbk9mTWVtYmVyRnVuY3Rpb24oZ2V0QVNUQ29udGV4dCgpLCBGRCwgVFNLKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmVzIHRoZSBmdW5jdGlvbiB0ZW1wbGF0ZSB0aGF0IGlzIGRlc2NyaWJlZCBieSB0aGlzCisgIC8vLyBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KKyAgLy8vCisgIC8vLyBFdmVyeSBmdW5jdGlvbiB0ZW1wbGF0ZSBpcyByZXByZXNlbnRlZCBhcyBhIEZ1bmN0aW9uVGVtcGxhdGVEZWNsCisgIC8vLyBhbmQgYSBGdW5jdGlvbkRlY2wgKG9yIHNvbWV0aGluZyBkZXJpdmVkIGZyb20gRnVuY3Rpb25EZWNsKS4gVGhlCisgIC8vLyBmb3JtZXIgY29udGFpbnMgdGVtcGxhdGUgcHJvcGVydGllcyAoc3VjaCBhcyB0aGUgdGVtcGxhdGUKKyAgLy8vIHBhcmFtZXRlciBsaXN0cykgd2hpbGUgdGhlIGxhdHRlciBjb250YWlucyB0aGUgYWN0dWFsCisgIC8vLyBkZXNjcmlwdGlvbiBvZiB0aGUgdGVtcGxhdGUncworICAvLy8gY29udGVudHMuIEZ1bmN0aW9uVGVtcGxhdGVEZWNsOjpnZXRUZW1wbGF0ZWREZWNsKCkgcmV0cmlldmVzIHRoZQorICAvLy8gRnVuY3Rpb25EZWNsIHRoYXQgZGVzY3JpYmVzIHRoZSBmdW5jdGlvbiB0ZW1wbGF0ZSwKKyAgLy8vIGdldERlc2NyaWJlZEZ1bmN0aW9uVGVtcGxhdGUoKSByZXRyaWV2ZXMgdGhlCisgIC8vLyBGdW5jdGlvblRlbXBsYXRlRGVjbCBmcm9tIGEgRnVuY3Rpb25EZWNsLgorICBGdW5jdGlvblRlbXBsYXRlRGVjbCAqZ2V0RGVzY3JpYmVkRnVuY3Rpb25UZW1wbGF0ZSgpIGNvbnN0OworCisgIHZvaWQgc2V0RGVzY3JpYmVkRnVuY3Rpb25UZW1wbGF0ZShGdW5jdGlvblRlbXBsYXRlRGVjbCAqVGVtcGxhdGUpOworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBmdW5jdGlvbiBpcyBhIGZ1bmN0aW9uIHRlbXBsYXRlCisgIC8vLyBzcGVjaWFsaXphdGlvbi4KKyAgYm9vbCBpc0Z1bmN0aW9uVGVtcGxhdGVTcGVjaWFsaXphdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UHJpbWFyeVRlbXBsYXRlKCkgIT0gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGNsYXNzIHNjb3BlIHRlbXBsYXRlIHBhdHRlcm4gdGhhdCB0aGlzIGZ1bmN0aW9uCisgIC8vLyAgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gaXMgaW5zdGFudGlhdGVkIGZyb20uCisgIEZ1bmN0aW9uRGVjbCAqZ2V0Q2xhc3NTY29wZVNwZWNpYWxpemF0aW9uUGF0dGVybigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgSWYgdGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSBhIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLAorICAvLy8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi4KKyAgLy8vIE90aGVyd2lzZSwgcmV0dXJucyBOVUxMLgorICBGdW5jdGlvblRlbXBsYXRlU3BlY2lhbGl6YXRpb25JbmZvICpnZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uSW5mbygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgZnVuY3Rpb24gaXMgYSBmdW5jdGlvbiB0ZW1wbGF0ZQorICAvLy8gc3BlY2lhbGl6YXRpb24gb3IgYSBtZW1iZXIgb2YgYSBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0aGF0IGNhbgorICAvLy8gYmUgaW1wbGljaXRseSBpbnN0YW50aWF0ZWQuCisgIGJvb2wgaXNJbXBsaWNpdGx5SW5zdGFudGlhYmxlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBmdW5jdGlvbiB3YXMgaW5zdGFudGlhdGVkIGZyb20gYQorICAvLy8gZnVuY3Rpb24gdGVtcGxhdGUuCisgIGJvb2wgaXNUZW1wbGF0ZUluc3RhbnRpYXRpb24oKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBmcm9tIHdoaWNoIHRoaXMgZnVuY3Rpb24gY291bGQKKyAgLy8vIGJlIGluc3RhbnRpYXRlZCwgaWYgaXQgaXMgYW4gaW5zdGFudGlhdGlvbiAocmF0aGVyIHRoYW4gYSBub24tdGVtcGxhdGUKKyAgLy8vIG9yIGEgc3BlY2lhbGl6YXRpb24sIGZvciBleGFtcGxlKS4KKyAgRnVuY3Rpb25EZWNsICpnZXRUZW1wbGF0ZUluc3RhbnRpYXRpb25QYXR0ZXJuKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgcHJpbWFyeSB0ZW1wbGF0ZSB0aGF0IHRoaXMgZnVuY3Rpb24gdGVtcGxhdGUKKyAgLy8vIHNwZWNpYWxpemF0aW9uIGVpdGhlciBzcGVjaWFsaXplcyBvciB3YXMgaW5zdGFudGlhdGVkIGZyb20uCisgIC8vLworICAvLy8gSWYgdGhpcyBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpcyBub3QgYSBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiwKKyAgLy8vIHJldHVybnMgTlVMTC4KKyAgRnVuY3Rpb25UZW1wbGF0ZURlY2wgKmdldFByaW1hcnlUZW1wbGF0ZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyB1c2VkIHRvIHByb2R1Y2UgdGhpcyBmdW5jdGlvbgorICAvLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZnJvbSB0aGUgcHJpbWFyeSB0ZW1wbGF0ZS4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzIG5vdCBhIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLAorICAvLy8gcmV0dXJucyBOVUxMLgorICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdCAqZ2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbkFyZ3MoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0IGFzIHdyaXR0ZW4gaW4gdGhlIHNvdXJjZXMsCisgIC8vLyBpZiBhbnkuCisgIC8vLworICAvLy8gSWYgdGhpcyBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpcyBub3QgYSBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbgorICAvLy8gb3IgaWYgaXQgaGFkIG5vIGV4cGxpY2l0IHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QsIHJldHVybnMgTlVMTC4KKyAgLy8vIE5vdGUgdGhhdCBpdCBhbiBleHBsaWNpdCB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0IG1heSBiZSB3cml0dGVuIGVtcHR5LAorICAvLy8gZS5nLiwgdGVtcGxhdGU8PiB2b2lkIGZvbzw+KGNoYXIqIHMpOworICBjb25zdCBBU1RUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8qCisgIGdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25BcmdzQXNXcml0dGVuKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTcGVjaWZ5IHRoYXQgdGhpcyBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpcyBhY3R1YWxseSBhIGZ1bmN0aW9uCisgIC8vLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gVGVtcGxhdGUgdGhlIGZ1bmN0aW9uIHRlbXBsYXRlIHRoYXQgdGhpcyBmdW5jdGlvbiB0ZW1wbGF0ZQorICAvLy8gc3BlY2lhbGl6YXRpb24gc3BlY2lhbGl6ZXMuCisgIC8vLworICAvLy8gXHBhcmFtIFRlbXBsYXRlQXJncyB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIHRoYXQgcHJvZHVjZWQgdGhpcworICAvLy8gZnVuY3Rpb24gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZnJvbSB0aGUgdGVtcGxhdGUuCisgIC8vLworICAvLy8gXHBhcmFtIEluc2VydFBvcyBJZiBub24tTlVMTCwgdGhlIHBvc2l0aW9uIGluIHRoZSBmdW5jdGlvbiB0ZW1wbGF0ZQorICAvLy8gc3BlY2lhbGl6YXRpb24gc2V0IHdoZXJlIHRoZSBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkYXRhIHdpbGwKKyAgLy8vIGJlIGluc2VydGVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUU0sgdGhlIGtpbmQgb2YgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdGhpcyBpcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gVGVtcGxhdGVBcmdzQXNXcml0dGVuIGxvY2F0aW9uIGluZm8gb2YgdGVtcGxhdGUgYXJndW1lbnRzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBQb2ludE9mSW5zdGFudGlhdGlvbiBwb2ludCBhdCB3aGljaCB0aGUgZnVuY3Rpb24gdGVtcGxhdGUKKyAgLy8vIHNwZWNpYWxpemF0aW9uIHdhcyBmaXJzdCBpbnN0YW50aWF0ZWQuCisgIHZvaWQgc2V0RnVuY3Rpb25UZW1wbGF0ZVNwZWNpYWxpemF0aW9uKEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdCAqVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgIHZvaWQgKkluc2VydFBvcywKKyAgICAgICAgICAgICAgICBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCBUU0sgPSBUU0tfSW1wbGljaXRJbnN0YW50aWF0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqVGVtcGxhdGVBcmdzQXNXcml0dGVuID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbiA9IFNvdXJjZUxvY2F0aW9uKCkpIHsKKyAgICBzZXRGdW5jdGlvblRlbXBsYXRlU3BlY2lhbGl6YXRpb24oZ2V0QVNUQ29udGV4dCgpLCBUZW1wbGF0ZSwgVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRQb3MsIFRTSywgVGVtcGxhdGVBcmdzQXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludE9mSW5zdGFudGlhdGlvbik7CisgIH0KKworICAvLy8gXGJyaWVmIFNwZWNpZmllcyB0aGF0IHRoaXMgZnVuY3Rpb24gZGVjbGFyYXRpb24gaXMgYWN0dWFsbHkgYQorICAvLy8gZGVwZW5kZW50IGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgorICB2b2lkIHNldERlcGVuZGVudFRlbXBsYXRlU3BlY2lhbGl6YXRpb24oQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5yZXNvbHZlZFNldEltcGwgJlRlbXBsYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gJlRlbXBsYXRlQXJncyk7CisKKyAgRGVwZW5kZW50RnVuY3Rpb25UZW1wbGF0ZVNwZWNpYWxpemF0aW9uSW5mbyAqCisgIGdldERlcGVuZGVudFNwZWNpYWxpemF0aW9uSW5mbygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoYXQga2luZCBvZiB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIHRoaXMgZnVuY3Rpb24KKyAgLy8vIHJlcHJlc2VudHMuCisgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kIGdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hhdCBraW5kIG9mIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gdGhpcyBmdW5jdGlvbgorICAvLy8gcmVwcmVzZW50cy4KKyAgdm9pZCBzZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZChUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCBUU0ssCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbiA9IFNvdXJjZUxvY2F0aW9uKCkpOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIChmaXJzdCkgcG9pbnQgb2YgaW5zdGFudGlhdGlvbiBvZiBhIGZ1bmN0aW9uIHRlbXBsYXRlCisgIC8vLyBzcGVjaWFsaXphdGlvbiBvciBhIG1lbWJlciBvZiBhIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSBmaXJzdCBwb2ludCBvZiBpbnN0YW50aWF0aW9uLCBpZiB0aGlzIGZ1bmN0aW9uIHdhcworICAvLy8gaW5zdGFudGlhdGVkIGZyb20gYSB0ZW1wbGF0ZTsgb3RoZXJ3aXNlLCByZXR1cm5zIGFuIGludmFsaWQgc291cmNlCisgIC8vLyBsb2NhdGlvbi4KKyAgU291cmNlTG9jYXRpb24gZ2V0UG9pbnRPZkluc3RhbnRpYXRpb24oKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgb3Igd2FzIGluc3RhbnRpYXRlZCBmcm9tIGFuIG91dC1vZi1saW5lCisgIC8vLyBkZWZpbml0aW9uIG9mIGEgbWVtYmVyIGZ1bmN0aW9uLgorICBib29sIGlzT3V0T2ZMaW5lKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBJZGVudGlmeSBhIG1lbW9yeSBjb3B5aW5nIG9yIHNldHRpbmcgZnVuY3Rpb24uCisgIC8vLyBJZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gaXMgYSBtZW1vcnkgY29weSBvciBzZXR0aW5nIGZ1bmN0aW9uLCByZXR1cm5zCisgIC8vLyB0aGUgY29ycmVzcG9uZGluZyBCdWlsdGluIElELiBJZiB0aGUgZnVuY3Rpb24gaXMgbm90IGEgbWVtb3J5IGZ1bmN0aW9uLAorICAvLy8gcmV0dXJucyAwLgorICB1bnNpZ25lZCBnZXRNZW1vcnlGdW5jdGlvbktpbmQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgT0RSSGFzaCBvZiB0aGUgZnVuY3Rpb24uICBUaGlzIHZhbHVlIGlzIGNhbGN1bGF0ZWQgYW5kCisgIC8vLyBzdG9yZWQgb24gZmlyc3QgY2FsbCwgdGhlbiB0aGUgc3RvcmVkIHZhbHVlIHJldHVybmVkIG9uIHRoZSBvdGhlciBjYWxscy4KKyAgdW5zaWduZWQgZ2V0T0RSSGFzaCgpOworCisgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeworICAgIHJldHVybiBLID49IGZpcnN0RnVuY3Rpb24gJiYgSyA8PSBsYXN0RnVuY3Rpb247CisgIH0KKyAgc3RhdGljIERlY2xDb250ZXh0ICpjYXN0VG9EZWNsQ29udGV4dChjb25zdCBGdW5jdGlvbkRlY2wgKkQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVjbENvbnRleHQgKj4oY29uc3RfY2FzdDxGdW5jdGlvbkRlY2wqPihEKSk7CisgIH0KKyAgc3RhdGljIEZ1bmN0aW9uRGVjbCAqY2FzdEZyb21EZWNsQ29udGV4dChjb25zdCBEZWNsQ29udGV4dCAqREMpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RnVuY3Rpb25EZWNsICo+KGNvbnN0X2Nhc3Q8RGVjbENvbnRleHQqPihEQykpOworICB9Cit9OworCisvLy8gUmVwcmVzZW50cyBhIG1lbWJlciBvZiBhIHN0cnVjdC91bmlvbi9jbGFzcy4KK2NsYXNzIEZpZWxkRGVjbCA6IHB1YmxpYyBEZWNsYXJhdG9yRGVjbCwgcHVibGljIE1lcmdlYWJsZTxGaWVsZERlY2w+IHsKKyAgdW5zaWduZWQgQml0RmllbGQgOiAxOworICB1bnNpZ25lZCBNdXRhYmxlIDogMTsKKyAgbXV0YWJsZSB1bnNpZ25lZCBDYWNoZWRGaWVsZEluZGV4IDogMzA7CisKKyAgLy8vIFRoZSBraW5kcyBvZiB2YWx1ZSB3ZSBjYW4gc3RvcmUgaW4gSW5pdGlhbGl6ZXJPckJpdFdpZHRoLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGlzIGNvbXBhdGlibGUgd2l0aCBJbkNsYXNzSW5pdFN0eWxlIGV4Y2VwdCBmb3IKKyAgLy8vIElTS19DYXB0dXJlZFZMQVR5cGUuCisgIGVudW0gSW5pdFN0b3JhZ2VLaW5kIHsKKyAgICAvLy8gSWYgdGhlIHBvaW50ZXIgaXMgbnVsbCwgdGhlcmUncyBub3RoaW5nIHNwZWNpYWwuICBPdGhlcndpc2UsCisgICAgLy8vIHRoaXMgaXMgYSBiaXRmaWVsZCBhbmQgdGhlIHBvaW50ZXIgaXMgdGhlIEV4cHIqIHN0b3JpbmcgdGhlCisgICAgLy8vIGJpdC13aWR0aC4KKyAgICBJU0tfTm9Jbml0ID0gKHVuc2lnbmVkKSBJQ0lTX05vSW5pdCwKKworICAgIC8vLyBUaGUgcG9pbnRlciBpcyBhbiAob3B0aW9uYWwgZHVlIHRvIGRlbGF5ZWQgcGFyc2luZykgRXhwcioKKyAgICAvLy8gaG9sZGluZyB0aGUgY29weS1pbml0aWFsaXplci4KKyAgICBJU0tfSW5DbGFzc0NvcHlJbml0ID0gKHVuc2lnbmVkKSBJQ0lTX0NvcHlJbml0LAorCisgICAgLy8vIFRoZSBwb2ludGVyIGlzIGFuIChvcHRpb25hbCBkdWUgdG8gZGVsYXllZCBwYXJzaW5nKSBFeHByKgorICAgIC8vLyBob2xkaW5nIHRoZSBsaXN0LWluaXRpYWxpemVyLgorICAgIElTS19JbkNsYXNzTGlzdEluaXQgPSAodW5zaWduZWQpIElDSVNfTGlzdEluaXQsCisKKyAgICAvLy8gVGhlIHBvaW50ZXIgaXMgYSBWYXJpYWJsZUFycmF5VHlwZSogdGhhdCdzIGJlZW4gY2FwdHVyZWQ7CisgICAgLy8vIHRoZSBlbmNsb3NpbmcgY29udGV4dCBpcyBhIGxhbWJkYSBvciBjYXB0dXJlZCBzdGF0ZW1lbnQuCisgICAgSVNLX0NhcHR1cmVkVkxBVHlwZSwKKyAgfTsKKworICAvLy8gSWYgdGhpcyBpcyBhIGJpdGZpZWxkIHdpdGggYSBkZWZhdWx0IG1lbWJlciBpbml0aWFsaXplciwgdGhpcworICAvLy8gc3RydWN0dXJlIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB0d28gZXhwcmVzc2lvbnMuCisgIHN0cnVjdCBJbml0QW5kQml0V2lkdGggeworICAgIEV4cHIgKkluaXQ7CisgICAgRXhwciAqQml0V2lkdGg7CisgIH07CisKKyAgLy8vIFxicmllZiBTdG9yYWdlIGZvciBlaXRoZXIgdGhlIGJpdC13aWR0aCwgdGhlIGluLWNsYXNzIGluaXRpYWxpemVyLCBvcgorICAvLy8gYm90aCAodmlhIEluaXRBbmRCaXRXaWR0aCksIG9yIHRoZSBjYXB0dXJlZCB2YXJpYWJsZSBsZW5ndGggYXJyYXkgYm91bmQuCisgIC8vLworICAvLy8gSWYgdGhlIHN0b3JhZ2Uga2luZCBpcyBJU0tfSW5DbGFzc0NvcHlJbml0IG9yCisgIC8vLyBJU0tfSW5DbGFzc0xpc3RJbml0LCBidXQgdGhlIGluaXRpYWxpemVyIGlzIG51bGwsIHRoZW4gdGhpcworICAvLy8gZmllbGQgaGFzIGFuIGluLWNsYXNzIGluaXRpYWxpemVyIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBwYXJzZWQKKyAgLy8vIGFuZCBhdHRhY2hlZC4KKyAgLy8gRklYTUU6IFRhaWwtYWxsb2NhdGUgdGhpcyB0byByZWR1Y2UgdGhlIHNpemUgb2YgRmllbGREZWNsIGluIHRoZQorICAvLyBvdmVyd2hlbG1pbmdseSBjb21tb24gY2FzZSB0aGF0IHdlIGhhdmUgbm9uZSBvZiB0aGVzZSB0aGluZ3MuCisgIGxsdm06OlBvaW50ZXJJbnRQYWlyPHZvaWQgKiwgMiwgSW5pdFN0b3JhZ2VLaW5kPiBJbml0U3RvcmFnZTsKKworcHJvdGVjdGVkOgorICBGaWVsZERlY2woS2luZCBESywgRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLCBJZGVudGlmaWVySW5mbyAqSWQsCisgICAgICAgICAgICBRdWFsVHlwZSBULCBUeXBlU291cmNlSW5mbyAqVEluZm8sIEV4cHIgKkJXLCBib29sIE11dGFibGUsCisgICAgICAgICAgICBJbkNsYXNzSW5pdFN0eWxlIEluaXRTdHlsZSkKKyAgICA6IERlY2xhcmF0b3JEZWNsKERLLCBEQywgSWRMb2MsIElkLCBULCBUSW5mbywgU3RhcnRMb2MpLAorICAgICAgQml0RmllbGQoZmFsc2UpLCBNdXRhYmxlKE11dGFibGUpLCBDYWNoZWRGaWVsZEluZGV4KDApLAorICAgICAgSW5pdFN0b3JhZ2UobnVsbHB0ciwgKEluaXRTdG9yYWdlS2luZCkgSW5pdFN0eWxlKSB7CisgICAgaWYgKEJXKQorICAgICAgc2V0Qml0V2lkdGgoQlcpOworICB9CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsV3JpdGVyOworCisgIHN0YXRpYyBGaWVsZERlY2wgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gSWRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsIFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqVEluZm8sIEV4cHIgKkJXLCBib29sIE11dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbkNsYXNzSW5pdFN0eWxlIEluaXRTdHlsZSk7CisKKyAgc3RhdGljIEZpZWxkRGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKKyAgCisgIC8vLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGlzIGZpZWxkIHdpdGhpbiBpdHMgcmVjb3JkLAorICAvLy8gYXMgYXBwcm9wcmlhdGUgZm9yIHBhc3NpbmcgdG8gQVNUUmVjb3JkTGF5b3V0OjpnZXRGaWVsZE9mZnNldC4KKyAgdW5zaWduZWQgZ2V0RmllbGRJbmRleCgpIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBmaWVsZCBpcyBtdXRhYmxlIChDKysgb25seSkuCisgIGJvb2wgaXNNdXRhYmxlKCkgY29uc3QgeyByZXR1cm4gTXV0YWJsZTsgfQorCisgIC8vLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBmaWVsZCBpcyBhIGJpdGZpZWxkLgorICBib29sIGlzQml0RmllbGQoKSBjb25zdCB7IHJldHVybiBCaXRGaWVsZDsgfQorCisgIC8vLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBpcyBhbiB1bm5hbWVkIGJpdGZpZWxkLgorICBib29sIGlzVW5uYW1lZEJpdGZpZWxkKCkgY29uc3QgeyByZXR1cm4gaXNCaXRGaWVsZCgpICYmICFnZXREZWNsTmFtZSgpOyB9CisKKyAgLy8vIERldGVybWluZXMgd2hldGhlciB0aGlzIGZpZWxkIGlzIGEKKyAgLy8vIHJlcHJlc2VudGF0aXZlIGZvciBhbiBhbm9ueW1vdXMgc3RydWN0IG9yIHVuaW9uLiBTdWNoIGZpZWxkcyBhcmUKKyAgLy8vIHVubmFtZWQgYW5kIGFyZSBpbXBsaWNpdGx5IGdlbmVyYXRlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gdG8KKyAgLy8vIHN0b3JlIHRoZSBkYXRhIGZvciB0aGUgYW5vbnltb3VzIHVuaW9uIG9yIHN0cnVjdC4KKyAgYm9vbCBpc0Fub255bW91c1N0cnVjdE9yVW5pb24oKSBjb25zdDsKKworICBFeHByICpnZXRCaXRXaWR0aCgpIGNvbnN0IHsKKyAgICBpZiAoIUJpdEZpZWxkKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgdm9pZCAqUHRyID0gSW5pdFN0b3JhZ2UuZ2V0UG9pbnRlcigpOworICAgIGlmIChnZXRJbkNsYXNzSW5pdFN0eWxlKCkpCisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SW5pdEFuZEJpdFdpZHRoKj4oUHRyKS0+Qml0V2lkdGg7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEV4cHIqPihQdHIpOworICB9CisKKyAgdW5zaWduZWQgZ2V0Qml0V2lkdGhWYWx1ZShjb25zdCBBU1RDb250ZXh0ICZDdHgpIGNvbnN0OworCisgIC8vLyBTZXQgdGhlIGJpdC1maWVsZCB3aWR0aCBmb3IgdGhpcyBtZW1iZXIuCisgIC8vIE5vdGU6IHVzZWQgYnkgc29tZSBjbGllbnRzIChpLmUuLCBkbyBub3QgcmVtb3ZlIGl0KS4KKyAgdm9pZCBzZXRCaXRXaWR0aChFeHByICpXaWR0aCkgeworICAgIGFzc2VydCghaGFzQ2FwdHVyZWRWTEFUeXBlKCkgJiYgIUJpdEZpZWxkICYmCisgICAgICAgICAgICJiaXQgd2lkdGggb3IgY2FwdHVyZWQgdHlwZSBhbHJlYWR5IHNldCIpOworICAgIGFzc2VydChXaWR0aCAmJiAibm8gYml0IHdpZHRoIHNwZWNpZmllZCIpOworICAgIEluaXRTdG9yYWdlLnNldFBvaW50ZXIoCisgICAgICAgIEluaXRTdG9yYWdlLmdldEludCgpCisgICAgICAgICAgICA/IG5ldyAoZ2V0QVNUQ29udGV4dCgpKQorICAgICAgICAgICAgICAgICAgSW5pdEFuZEJpdFdpZHRoe2dldEluQ2xhc3NJbml0aWFsaXplcigpLCBXaWR0aH0KKyAgICAgICAgICAgIDogc3RhdGljX2Nhc3Q8dm9pZCo+KFdpZHRoKSk7CisgICAgQml0RmllbGQgPSB0cnVlOworICB9CisKKyAgLy8vIFJlbW92ZSB0aGUgYml0LWZpZWxkIHdpZHRoIGZyb20gdGhpcyBtZW1iZXIuCisgIC8vIE5vdGU6IHVzZWQgYnkgc29tZSBjbGllbnRzIChpLmUuLCBkbyBub3QgcmVtb3ZlIGl0KS4KKyAgdm9pZCByZW1vdmVCaXRXaWR0aCgpIHsKKyAgICBhc3NlcnQoaXNCaXRGaWVsZCgpICYmICJubyBiaXRmaWVsZCB3aWR0aCB0byByZW1vdmUiKTsKKyAgICBJbml0U3RvcmFnZS5zZXRQb2ludGVyKGdldEluQ2xhc3NJbml0aWFsaXplcigpKTsKKyAgICBCaXRGaWVsZCA9IGZhbHNlOworICB9CisKKyAgLy8vIEdldCB0aGUga2luZCBvZiAoQysrMTEpIGRlZmF1bHQgbWVtYmVyIGluaXRpYWxpemVyIHRoYXQgdGhpcyBmaWVsZCBoYXMuCisgIEluQ2xhc3NJbml0U3R5bGUgZ2V0SW5DbGFzc0luaXRTdHlsZSgpIGNvbnN0IHsKKyAgICBJbml0U3RvcmFnZUtpbmQgc3RvcmFnZUtpbmQgPSBJbml0U3RvcmFnZS5nZXRJbnQoKTsKKyAgICByZXR1cm4gKHN0b3JhZ2VLaW5kID09IElTS19DYXB0dXJlZFZMQVR5cGUKKyAgICAgICAgICAgICAgPyBJQ0lTX05vSW5pdCA6IChJbkNsYXNzSW5pdFN0eWxlKSBzdG9yYWdlS2luZCk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBtZW1iZXIgaGFzIGEgQysrMTEgZGVmYXVsdCBtZW1iZXIgaW5pdGlhbGl6ZXIuCisgIGJvb2wgaGFzSW5DbGFzc0luaXRpYWxpemVyKCkgY29uc3QgeworICAgIHJldHVybiBnZXRJbkNsYXNzSW5pdFN0eWxlKCkgIT0gSUNJU19Ob0luaXQ7CisgIH0KKworICAvLy8gR2V0IHRoZSBDKysxMSBkZWZhdWx0IG1lbWJlciBpbml0aWFsaXplciBmb3IgdGhpcyBtZW1iZXIsIG9yIG51bGwgaWYgb25lCisgIC8vLyBoYXMgbm90IGJlZW4gc2V0LiBJZiBhIHZhbGlkIGRlY2xhcmF0aW9uIGhhcyBhIGRlZmF1bHQgbWVtYmVyIGluaXRpYWxpemVyLAorICAvLy8gYnV0IHRoaXMgcmV0dXJucyBudWxsLCB0aGVuIHdlIGhhdmUgbm90IHBhcnNlZCBhbmQgYXR0YWNoZWQgaXQgeWV0LgorICBFeHByICpnZXRJbkNsYXNzSW5pdGlhbGl6ZXIoKSBjb25zdCB7CisgICAgaWYgKCFoYXNJbkNsYXNzSW5pdGlhbGl6ZXIoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHZvaWQgKlB0ciA9IEluaXRTdG9yYWdlLmdldFBvaW50ZXIoKTsKKyAgICBpZiAoQml0RmllbGQpCisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SW5pdEFuZEJpdFdpZHRoKj4oUHRyKS0+SW5pdDsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RXhwcio+KFB0cik7CisgIH0KKworICAvLy8gU2V0IHRoZSBDKysxMSBpbi1jbGFzcyBpbml0aWFsaXplciBmb3IgdGhpcyBtZW1iZXIuCisgIHZvaWQgc2V0SW5DbGFzc0luaXRpYWxpemVyKEV4cHIgKkluaXQpIHsKKyAgICBhc3NlcnQoaGFzSW5DbGFzc0luaXRpYWxpemVyKCkgJiYgIWdldEluQ2xhc3NJbml0aWFsaXplcigpKTsKKyAgICBpZiAoQml0RmllbGQpCisgICAgICBzdGF0aWNfY2FzdDxJbml0QW5kQml0V2lkdGgqPihJbml0U3RvcmFnZS5nZXRQb2ludGVyKCkpLT5Jbml0ID0gSW5pdDsKKyAgICBlbHNlCisgICAgICBJbml0U3RvcmFnZS5zZXRQb2ludGVyKEluaXQpOworICB9CisKKyAgLy8vIFJlbW92ZSB0aGUgQysrMTEgaW4tY2xhc3MgaW5pdGlhbGl6ZXIgZnJvbSB0aGlzIG1lbWJlci4KKyAgdm9pZCByZW1vdmVJbkNsYXNzSW5pdGlhbGl6ZXIoKSB7CisgICAgYXNzZXJ0KGhhc0luQ2xhc3NJbml0aWFsaXplcigpICYmICJubyBpbml0aWFsaXplciB0byByZW1vdmUiKTsKKyAgICBJbml0U3RvcmFnZS5zZXRQb2ludGVyQW5kSW50KGdldEJpdFdpZHRoKCksIElTS19Ob0luaXQpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIG1lbWJlciBjYXB0dXJlcyB0aGUgdmFyaWFibGUgbGVuZ3RoIGFycmF5CisgIC8vLyB0eXBlLgorICBib29sIGhhc0NhcHR1cmVkVkxBVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5pdFN0b3JhZ2UuZ2V0SW50KCkgPT0gSVNLX0NhcHR1cmVkVkxBVHlwZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBjYXB0dXJlZCB2YXJpYWJsZSBsZW5ndGggYXJyYXkgdHlwZS4KKyAgY29uc3QgVmFyaWFibGVBcnJheVR5cGUgKmdldENhcHR1cmVkVkxBVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzQ2FwdHVyZWRWTEFUeXBlKCkgPyBzdGF0aWNfY2FzdDxjb25zdCBWYXJpYWJsZUFycmF5VHlwZSAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdFN0b3JhZ2UuZ2V0UG9pbnRlcigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgY2FwdHVyZWQgdmFyaWFibGUgbGVuZ3RoIGFycmF5IHR5cGUgZm9yIHRoaXMgZmllbGQuCisgIHZvaWQgc2V0Q2FwdHVyZWRWTEFUeXBlKGNvbnN0IFZhcmlhYmxlQXJyYXlUeXBlICpWTEFUeXBlKTsKKworICAvLy8gUmV0dXJucyB0aGUgcGFyZW50IG9mIHRoaXMgZmllbGQgZGVjbGFyYXRpb24sIHdoaWNoCisgIC8vLyBpcyB0aGUgc3RydWN0IGluIHdoaWNoIHRoaXMgZmllbGQgaXMgZGVmaW5lZC4KKyAgY29uc3QgUmVjb3JkRGVjbCAqZ2V0UGFyZW50KCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PFJlY29yZERlY2w+KGdldERlY2xDb250ZXh0KCkpOworICB9CisKKyAgUmVjb3JkRGVjbCAqZ2V0UGFyZW50KCkgeworICAgIHJldHVybiBjYXN0PFJlY29yZERlY2w+KGdldERlY2xDb250ZXh0KCkpOworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZOworCisgIC8vLyBSZXRyaWV2ZXMgdGhlIGNhbm9uaWNhbCBkZWNsYXJhdGlvbiBvZiB0aGlzIGZpZWxkLgorICBGaWVsZERlY2wgKmdldENhbm9uaWNhbERlY2woKSBvdmVycmlkZSB7IHJldHVybiBnZXRGaXJzdERlY2woKTsgfQorICBjb25zdCBGaWVsZERlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCB7IHJldHVybiBnZXRGaXJzdERlY2woKTsgfQorCisgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA+PSBmaXJzdEZpZWxkICYmIEsgPD0gbGFzdEZpZWxkOyB9Cit9OworCisvLy8gQW4gaW5zdGFuY2Ugb2YgdGhpcyBvYmplY3QgZXhpc3RzIGZvciBlYWNoIGVudW0gY29uc3RhbnQKKy8vLyB0aGF0IGlzIGRlZmluZWQuICBGb3IgZXhhbXBsZSwgaW4gImVudW0gWCB7YSxifSIsIGVhY2ggb2YgYS9iIGFyZQorLy8vIEVudW1Db25zdGFudERlY2wncywgWCBpcyBhbiBpbnN0YW5jZSBvZiBFbnVtRGVjbCwgYW5kIHRoZSB0eXBlIG9mIGEvYiBpcyBhCisvLy8gVGFnVHlwZSBmb3IgdGhlIFggRW51bURlY2wuCitjbGFzcyBFbnVtQ29uc3RhbnREZWNsIDogcHVibGljIFZhbHVlRGVjbCwgcHVibGljIE1lcmdlYWJsZTxFbnVtQ29uc3RhbnREZWNsPiB7CisgIFN0bXQgKkluaXQ7IC8vIGFuIGludGVnZXIgY29uc3RhbnQgZXhwcmVzc2lvbgorICBsbHZtOjpBUFNJbnQgVmFsOyAvLyBUaGUgdmFsdWUuCisKK3Byb3RlY3RlZDoKKyAgRW51bUNvbnN0YW50RGVjbChEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIEwsCisgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklkLCBRdWFsVHlwZSBULCBFeHByICpFLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCAmVikKKyAgICA6IFZhbHVlRGVjbChFbnVtQ29uc3RhbnQsIERDLCBMLCBJZCwgVCksIEluaXQoKFN0bXQqKUUpLCBWYWwoVikge30KKworcHVibGljOgorICBmcmllbmQgY2xhc3MgU3RtdEl0ZXJhdG9yQmFzZTsKKworICBzdGF0aWMgRW51bUNvbnN0YW50RGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIEVudW1EZWNsICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMLCBJZGVudGlmaWVySW5mbyAqSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwgRXhwciAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpBUFNJbnQgJlYpOworICBzdGF0aWMgRW51bUNvbnN0YW50RGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKKyAgCisgIGNvbnN0IEV4cHIgKmdldEluaXRFeHByKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0IEV4cHIqKSBJbml0OyB9CisgIEV4cHIgKmdldEluaXRFeHByKCkgeyByZXR1cm4gKEV4cHIqKSBJbml0OyB9CisgIGNvbnN0IGxsdm06OkFQU0ludCAmZ2V0SW5pdFZhbCgpIGNvbnN0IHsgcmV0dXJuIFZhbDsgfQorCisgIHZvaWQgc2V0SW5pdEV4cHIoRXhwciAqRSkgeyBJbml0ID0gKFN0bXQqKSBFOyB9CisgIHZvaWQgc2V0SW5pdFZhbChjb25zdCBsbHZtOjpBUFNJbnQgJlYpIHsgVmFsID0gVjsgfQorCisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWTsKKworICAvLy8gUmV0cmlldmVzIHRoZSBjYW5vbmljYWwgZGVjbGFyYXRpb24gb2YgdGhpcyBlbnVtZXJhdG9yLgorICBFbnVtQ29uc3RhbnREZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgb3ZlcnJpZGUgeyByZXR1cm4gZ2V0Rmlyc3REZWNsKCk7IH0KKyAgY29uc3QgRW51bUNvbnN0YW50RGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIGNvbnN0IHsgcmV0dXJuIGdldEZpcnN0RGVjbCgpOyB9CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IEVudW1Db25zdGFudDsgfQorfTsKKworLy8vIFJlcHJlc2VudHMgYSBmaWVsZCBpbmplY3RlZCBmcm9tIGFuIGFub255bW91cyB1bmlvbi9zdHJ1Y3QgaW50byB0aGUgcGFyZW50CisvLy8gc2NvcGUuIFRoZXNlIGFyZSBhbHdheXMgaW1wbGljaXQuCitjbGFzcyBJbmRpcmVjdEZpZWxkRGVjbCA6IHB1YmxpYyBWYWx1ZURlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZXJnZWFibGU8SW5kaXJlY3RGaWVsZERlY2w+IHsKKyAgTmFtZWREZWNsICoqQ2hhaW5pbmc7CisgIHVuc2lnbmVkIENoYWluaW5nU2l6ZTsKKworICBJbmRpcmVjdEZpZWxkRGVjbChBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIEwsCisgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBOLCBRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICBNdXRhYmxlQXJyYXlSZWY8TmFtZWREZWNsICo+IENIKTsKKworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworCisgIHN0YXRpYyBJbmRpcmVjdEZpZWxkRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCwgSWRlbnRpZmllckluZm8gKklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULCBsbHZtOjpNdXRhYmxlQXJyYXlSZWY8TmFtZWREZWNsICo+IENIKTsKKworICBzdGF0aWMgSW5kaXJlY3RGaWVsZERlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisKKyAgdXNpbmcgY2hhaW5faXRlcmF0b3IgPSBBcnJheVJlZjxOYW1lZERlY2wgKj46OmNvbnN0X2l0ZXJhdG9yOworCisgIEFycmF5UmVmPE5hbWVkRGVjbCAqPiBjaGFpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKENoYWluaW5nLCBDaGFpbmluZ1NpemUpOworICB9CisgIGNoYWluX2l0ZXJhdG9yIGNoYWluX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gY2hhaW4oKS5iZWdpbigpOyB9CisgIGNoYWluX2l0ZXJhdG9yIGNoYWluX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGNoYWluKCkuZW5kKCk7IH0KKworICB1bnNpZ25lZCBnZXRDaGFpbmluZ1NpemUoKSBjb25zdCB7IHJldHVybiBDaGFpbmluZ1NpemU7IH0KKworICBGaWVsZERlY2wgKmdldEFub25GaWVsZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoY2hhaW4oKS5zaXplKCkgPj0gMik7CisgICAgcmV0dXJuIGNhc3Q8RmllbGREZWNsPihjaGFpbigpLmJhY2soKSk7CisgIH0KKworICBWYXJEZWNsICpnZXRWYXJEZWNsKCkgY29uc3QgeworICAgIGFzc2VydChjaGFpbigpLnNpemUoKSA+PSAyKTsKKyAgICByZXR1cm4gZHluX2Nhc3Q8VmFyRGVjbD4oY2hhaW4oKS5mcm9udCgpKTsKKyAgfQorCisgIEluZGlyZWN0RmllbGREZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgb3ZlcnJpZGUgeyByZXR1cm4gZ2V0Rmlyc3REZWNsKCk7IH0KKyAgY29uc3QgSW5kaXJlY3RGaWVsZERlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCB7IHJldHVybiBnZXRGaXJzdERlY2woKTsgfQorCisgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBJbmRpcmVjdEZpZWxkOyB9Cit9OworCisvLy8gUmVwcmVzZW50cyBhIGRlY2xhcmF0aW9uIG9mIGEgdHlwZS4KK2NsYXNzIFR5cGVEZWNsIDogcHVibGljIE5hbWVkRGVjbCB7CisgIGZyaWVuZCBjbGFzcyBBU1RDb250ZXh0OworCisgIC8vLyBUaGlzIGluZGljYXRlcyB0aGUgVHlwZSBvYmplY3QgdGhhdCByZXByZXNlbnRzCisgIC8vLyB0aGlzIFR5cGVEZWNsLiAgSXQgaXMgYSBjYWNoZSBtYWludGFpbmVkIGJ5CisgIC8vLyBBU1RDb250ZXh0OjpnZXRUeXBlZGVmVHlwZSwgQVNUQ29udGV4dDo6Z2V0VGFnRGVjbFR5cGUsIGFuZAorICAvLy8gQVNUQ29udGV4dDo6Z2V0VGVtcGxhdGVUeXBlUGFybVR5cGUsIGFuZCBUZW1wbGF0ZVR5cGVQYXJtRGVjbC4KKyAgbXV0YWJsZSBjb25zdCBUeXBlICpUeXBlRm9yRGVjbCA9IG51bGxwdHI7CisKKyAgLy8vIFRoZSBzdGFydCBvZiB0aGUgc291cmNlIHJhbmdlIGZvciB0aGlzIGRlY2xhcmF0aW9uLgorICBTb3VyY2VMb2NhdGlvbiBMb2NTdGFydDsKKworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgIFR5cGVEZWNsKEtpbmQgREssIERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gTCwgSWRlbnRpZmllckluZm8gKklkLAorICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydEwgPSBTb3VyY2VMb2NhdGlvbigpKQorICAgIDogTmFtZWREZWNsKERLLCBEQywgTCwgSWQpLCBMb2NTdGFydChTdGFydEwpIHt9CisKK3B1YmxpYzoKKyAgLy8gTG93LWxldmVsIGFjY2Vzc29yLiBJZiB5b3UganVzdCB3YW50IHRoZSB0eXBlIGRlZmluZWQgYnkgdGhpcyBub2RlLAorICAvLyBjaGVjayBvdXQgQVNUQ29udGV4dDo6Z2V0VHlwZURlY2xUeXBlIG9yIG9uZSBvZgorICAvLyBBU1RDb250ZXh0OjpnZXRUeXBlZGVmVHlwZSwgQVNUQ29udGV4dDo6Z2V0UmVjb3JkVHlwZSwgZXRjLiBpZiB5b3UKKyAgLy8gYWxyZWFkeSBrbm93IHRoZSBzcGVjaWZpYyBraW5kIG9mIG5vZGUgdGhpcyBpcy4KKyAgY29uc3QgVHlwZSAqZ2V0VHlwZUZvckRlY2woKSBjb25zdCB7IHJldHVybiBUeXBlRm9yRGVjbDsgfQorICB2b2lkIHNldFR5cGVGb3JEZWNsKGNvbnN0IFR5cGUgKlREKSB7IFR5cGVGb3JEZWNsID0gVEQ7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gTG9jU3RhcnQ7IH0KKyAgdm9pZCBzZXRMb2NTdGFydChTb3VyY2VMb2NhdGlvbiBMKSB7IExvY1N0YXJ0ID0gTDsgfQorICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFkgeworICAgIGlmIChMb2NTdGFydC5pc1ZhbGlkKCkpCisgICAgICByZXR1cm4gU291cmNlUmFuZ2UoTG9jU3RhcnQsIGdldExvY2F0aW9uKCkpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRMb2NhdGlvbigpKTsKKyAgfQorCisgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA+PSBmaXJzdFR5cGUgJiYgSyA8PSBsYXN0VHlwZTsgfQorfTsKKworLy8vIEJhc2UgY2xhc3MgZm9yIGRlY2xhcmF0aW9ucyB3aGljaCBpbnRyb2R1Y2UgYSB0eXBlZGVmLW5hbWUuCitjbGFzcyBUeXBlZGVmTmFtZURlY2wgOiBwdWJsaWMgVHlwZURlY2wsIHB1YmxpYyBSZWRlY2xhcmFibGU8VHlwZWRlZk5hbWVEZWNsPiB7CisgIHN0cnVjdCBMTFZNX0FMSUdOQVMoOCkgTW9kZWRUSW5mbyB7CisgICAgVHlwZVNvdXJjZUluZm8gKmZpcnN0OworICAgIFF1YWxUeXBlIHNlY29uZDsKKyAgfTsKKworICAvLy8gSWYgaW50IHBhcnQgaXMgMCwgd2UgaGF2ZSBub3QgY29tcHV0ZWQgSXNUcmFuc3BhcmVudFRhZy4KKyAgLy8vIE90aGVyd2lzZSwgSXNUcmFuc3BhcmVudFRhZyBpcyAoZ2V0SW50KCkgPj4gMSkuCisgIG11dGFibGUgbGx2bTo6UG9pbnRlckludFBhaXI8CisgICAgICBsbHZtOjpQb2ludGVyVW5pb248VHlwZVNvdXJjZUluZm8gKiwgTW9kZWRUSW5mbyAqPiwgMj4KKyAgICAgIE1heWJlTW9kZWRUSW5mbzsKKworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgIFR5cGVkZWZOYW1lRGVjbChLaW5kIERLLCBBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gSWRMb2MsCisgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsIFR5cGVTb3VyY2VJbmZvICpUSW5mbykKKyAgICAgIDogVHlwZURlY2woREssIERDLCBJZExvYywgSWQsIFN0YXJ0TG9jKSwgcmVkZWNsYXJhYmxlX2Jhc2UoQyksCisgICAgICAgIE1heWJlTW9kZWRUSW5mbyhUSW5mbywgMCkge30KKworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZSA9IFJlZGVjbGFyYWJsZTxUeXBlZGVmTmFtZURlY2w+OworCisgIFR5cGVkZWZOYW1lRGVjbCAqZ2V0TmV4dFJlZGVjbGFyYXRpb25JbXBsKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXROZXh0UmVkZWNsYXJhdGlvbigpOworICB9CisKKyAgVHlwZWRlZk5hbWVEZWNsICpnZXRQcmV2aW91c0RlY2xJbXBsKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRQcmV2aW91c0RlY2woKTsKKyAgfQorCisgIFR5cGVkZWZOYW1lRGVjbCAqZ2V0TW9zdFJlY2VudERlY2xJbXBsKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRNb3N0UmVjZW50RGVjbCgpOworICB9CisKK3B1YmxpYzoKKyAgdXNpbmcgcmVkZWNsX3JhbmdlID0gcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbF9yYW5nZTsKKyAgdXNpbmcgcmVkZWNsX2l0ZXJhdG9yID0gcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbF9pdGVyYXRvcjsKKworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsc19iZWdpbjsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHNfZW5kOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsczsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmdldFByZXZpb3VzRGVjbDsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmdldE1vc3RSZWNlbnREZWNsOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6aXNGaXJzdERlY2w7CisKKyAgYm9vbCBpc01vZGVkKCkgY29uc3QgeworICAgIHJldHVybiBNYXliZU1vZGVkVEluZm8uZ2V0UG9pbnRlcigpLmlzPE1vZGVkVEluZm8gKj4oKTsKKyAgfQorCisgIFR5cGVTb3VyY2VJbmZvICpnZXRUeXBlU291cmNlSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNNb2RlZCgpID8gTWF5YmVNb2RlZFRJbmZvLmdldFBvaW50ZXIoKS5nZXQ8TW9kZWRUSW5mbyAqPigpLT5maXJzdAorICAgICAgICAgICAgICAgICAgICAgOiBNYXliZU1vZGVkVEluZm8uZ2V0UG9pbnRlcigpLmdldDxUeXBlU291cmNlSW5mbyAqPigpOworICB9CisKKyAgUXVhbFR5cGUgZ2V0VW5kZXJseWluZ1R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzTW9kZWQoKSA/IE1heWJlTW9kZWRUSW5mby5nZXRQb2ludGVyKCkuZ2V0PE1vZGVkVEluZm8gKj4oKS0+c2Vjb25kCisgICAgICAgICAgICAgICAgICAgICA6IE1heWJlTW9kZWRUSW5mby5nZXRQb2ludGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQ8VHlwZVNvdXJjZUluZm8gKj4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5nZXRUeXBlKCk7CisgIH0KKworICB2b2lkIHNldFR5cGVTb3VyY2VJbmZvKFR5cGVTb3VyY2VJbmZvICpuZXdUeXBlKSB7CisgICAgTWF5YmVNb2RlZFRJbmZvLnNldFBvaW50ZXIobmV3VHlwZSk7CisgIH0KKworICB2b2lkIHNldE1vZGVkVHlwZVNvdXJjZUluZm8oVHlwZVNvdXJjZUluZm8gKnVubW9kZWRUU0ksIFF1YWxUeXBlIG1vZGVkVHkpIHsKKyAgICBNYXliZU1vZGVkVEluZm8uc2V0UG9pbnRlcihuZXcgKGdldEFTVENvbnRleHQoKSwgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWRUSW5mbyh7dW5tb2RlZFRTSSwgbW9kZWRUeX0pKTsKKyAgfQorCisgIC8vLyBSZXRyaWV2ZXMgdGhlIGNhbm9uaWNhbCBkZWNsYXJhdGlvbiBvZiB0aGlzIHR5cGVkZWYtbmFtZS4KKyAgVHlwZWRlZk5hbWVEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgb3ZlcnJpZGUgeyByZXR1cm4gZ2V0Rmlyc3REZWNsKCk7IH0KKyAgY29uc3QgVHlwZWRlZk5hbWVEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgY29uc3QgeyByZXR1cm4gZ2V0Rmlyc3REZWNsKCk7IH0KKworICAvLy8gUmV0cmlldmVzIHRoZSB0YWcgZGVjbGFyYXRpb24gZm9yIHdoaWNoIHRoaXMgaXMgdGhlIHR5cGVkZWYgbmFtZSBmb3IKKyAgLy8vIGxpbmthZ2UgcHVycG9zZXMsIGlmIGFueS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQW55UmVkZWNsIExvb2sgZm9yIHRoZSB0YWcgZGVjbGFyYXRpb24gaW4gYW55IHJlZGVjbGFyYXRpb24gb2YKKyAgLy8vIHRoaXMgdHlwZWRlZiBkZWNsYXJhdGlvbi4KKyAgVGFnRGVjbCAqZ2V0QW5vbkRlY2xXaXRoVHlwZWRlZk5hbWUoYm9vbCBBbnlSZWRlY2wgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIERldGVybWluZXMgaWYgdGhpcyB0eXBlZGVmIHNoYXJlcyBhIG5hbWUgYW5kIHNwZWxsaW5nIGxvY2F0aW9uIHdpdGggaXRzCisgIC8vLyB1bmRlcmx5aW5nIHRhZyB0eXBlLCBhcyBpcyB0aGUgY2FzZSB3aXRoIHRoZSBOU19FTlVNIG1hY3JvLgorICBib29sIGlzVHJhbnNwYXJlbnRUYWcoKSBjb25zdCB7CisgICAgaWYgKE1heWJlTW9kZWRUSW5mby5nZXRJbnQoKSkKKyAgICAgIHJldHVybiBNYXliZU1vZGVkVEluZm8uZ2V0SW50KCkgJiAweDI7CisgICAgcmV0dXJuIGlzVHJhbnNwYXJlbnRUYWdTbG93KCk7CisgIH0KKworICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC9ldGMuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsKKyAgICByZXR1cm4gSyA+PSBmaXJzdFR5cGVkZWZOYW1lICYmIEsgPD0gbGFzdFR5cGVkZWZOYW1lOworICB9CisKK3ByaXZhdGU6CisgIGJvb2wgaXNUcmFuc3BhcmVudFRhZ1Nsb3coKSBjb25zdDsKK307CisKKy8vLyBSZXByZXNlbnRzIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHR5cGVkZWYtbmFtZSB2aWEgdGhlICd0eXBlZGVmJworLy8vIHR5cGUgc3BlY2lmaWVyLgorY2xhc3MgVHlwZWRlZkRlY2wgOiBwdWJsaWMgVHlwZWRlZk5hbWVEZWNsIHsKKyAgVHlwZWRlZkRlY2woQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRMb2MsIElkZW50aWZpZXJJbmZvICpJZCwgVHlwZVNvdXJjZUluZm8gKlRJbmZvKQorICAgICAgOiBUeXBlZGVmTmFtZURlY2woVHlwZWRlZiwgQywgREMsIFN0YXJ0TG9jLCBJZExvYywgSWQsIFRJbmZvKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBUeXBlZGVmRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIElkTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsIFR5cGVTb3VyY2VJbmZvICpUSW5mbyk7CisgIHN0YXRpYyBUeXBlZGVmRGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKKworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFk7CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IFR5cGVkZWY7IH0KK307CisKKy8vLyBSZXByZXNlbnRzIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHR5cGVkZWYtbmFtZSB2aWEgYSBDKysxMQorLy8vIGFsaWFzLWRlY2xhcmF0aW9uLgorY2xhc3MgVHlwZUFsaWFzRGVjbCA6IHB1YmxpYyBUeXBlZGVmTmFtZURlY2wgeworICAvLy8gVGhlIHRlbXBsYXRlIGZvciB3aGljaCB0aGlzIGlzIHRoZSBwYXR0ZXJuLCBpZiBhbnkuCisgIFR5cGVBbGlhc1RlbXBsYXRlRGVjbCAqVGVtcGxhdGU7CisKKyAgVHlwZUFsaWFzRGVjbChBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLCBJZGVudGlmaWVySW5mbyAqSWQsIFR5cGVTb3VyY2VJbmZvICpUSW5mbykKKyAgICAgIDogVHlwZWRlZk5hbWVEZWNsKFR5cGVBbGlhcywgQywgREMsIFN0YXJ0TG9jLCBJZExvYywgSWQsIFRJbmZvKSwKKyAgICAgICAgVGVtcGxhdGUobnVsbHB0cikge30KKworcHVibGljOgorICBzdGF0aWMgVHlwZUFsaWFzRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gSWRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklkLCBUeXBlU291cmNlSW5mbyAqVEluZm8pOworICBzdGF0aWMgVHlwZUFsaWFzRGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKKworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFk7CisKKyAgVHlwZUFsaWFzVGVtcGxhdGVEZWNsICpnZXREZXNjcmliZWRBbGlhc1RlbXBsYXRlKCkgY29uc3QgeyByZXR1cm4gVGVtcGxhdGU7IH0KKyAgdm9pZCBzZXREZXNjcmliZWRBbGlhc1RlbXBsYXRlKFR5cGVBbGlhc1RlbXBsYXRlRGVjbCAqVEFUKSB7IFRlbXBsYXRlID0gVEFUOyB9CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IFR5cGVBbGlhczsgfQorfTsKKworLy8vIFJlcHJlc2VudHMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgc3RydWN0L3VuaW9uL2NsYXNzL2VudW0uCitjbGFzcyBUYWdEZWNsCisgIDogcHVibGljIFR5cGVEZWNsLCBwdWJsaWMgRGVjbENvbnRleHQsIHB1YmxpYyBSZWRlY2xhcmFibGU8VGFnRGVjbD4geworcHVibGljOgorICAvLyBUaGlzIGlzIHJlYWxseSB1Z2x5LgorICB1c2luZyBUYWdLaW5kID0gVGFnVHlwZUtpbmQ7CisKK3ByaXZhdGU6CisgIC8vIEZJWE1FOiBUaGlzIGNhbiBiZSBwYWNrZWQgaW50byB0aGUgYml0ZmllbGRzIGluIERlY2wuCisgIC8vLyBUaGUgVGFnS2luZCBlbnVtLgorICB1bnNpZ25lZCBUYWdEZWNsS2luZCA6IDM7CisKKyAgLy8vIFRydWUgaWYgdGhpcyBpcyBhIGRlZmluaXRpb24gKCJzdHJ1Y3QgZm9vIHt9OyIpLCBmYWxzZSBpZiBpdCBpcyBhCisgIC8vLyBkZWNsYXJhdGlvbiAoInN0cnVjdCBmb287IikuICBJdCBpcyBub3QgY29uc2lkZXJlZCBhIGRlZmluaXRpb24KKyAgLy8vIHVudGlsIHRoZSBkZWZpbml0aW9uIGhhcyBiZWVuIGZ1bGx5IHByb2Nlc3NlZC4KKyAgdW5zaWduZWQgSXNDb21wbGV0ZURlZmluaXRpb24gOiAxOworCitwcm90ZWN0ZWQ6CisgIC8vLyBUcnVlIGlmIHRoaXMgaXMgY3VycmVudGx5IGJlaW5nIGRlZmluZWQuCisgIHVuc2lnbmVkIElzQmVpbmdEZWZpbmVkIDogMTsKKworcHJpdmF0ZToKKyAgLy8vIFRydWUgaWYgdGhpcyB0YWcgZGVjbGFyYXRpb24gaXMgImVtYmVkZGVkIiAoaS5lLiwgZGVmaW5lZCBvciBkZWNsYXJlZAorICAvLy8gZm9yIHRoZSB2ZXJ5IGZpcnN0IHRpbWUpIGluIHRoZSBzeW50YXggb2YgYSBkZWNsYXJhdG9yLgorICB1bnNpZ25lZCBJc0VtYmVkZGVkSW5EZWNsYXJhdG9yIDogMTsKKworICAvLy8gVHJ1ZSBpZiB0aGlzIHRhZyBpcyBmcmVlIHN0YW5kaW5nLCBlLmcuICJzdHJ1Y3QgZm9vOyIuCisgIHVuc2lnbmVkIElzRnJlZVN0YW5kaW5nIDogMTsKKworcHJvdGVjdGVkOgorICAvLyBUaGVzZSBhcmUgdXNlZCBieSAoYW5kIG9ubHkgZGVmaW5lZCBmb3IpIEVudW1EZWNsLgorICB1bnNpZ25lZCBOdW1Qb3NpdGl2ZUJpdHMgOiA4OworICB1bnNpZ25lZCBOdW1OZWdhdGl2ZUJpdHMgOiA4OworCisgIC8vLyBUcnVlIGlmIHRoaXMgdGFnIGRlY2xhcmF0aW9uIGlzIGEgc2NvcGVkIGVudW1lcmF0aW9uLiBPbmx5CisgIC8vLyBwb3NzaWJsZSBpbiBDKysxMSBtb2RlLgorICB1bnNpZ25lZCBJc1Njb3BlZCA6IDE7CisKKyAgLy8vIElmIHRoaXMgdGFnIGRlY2xhcmF0aW9uIGlzIGEgc2NvcGVkIGVudW0sCisgIC8vLyB0aGVuIHRoaXMgaXMgdHJ1ZSBpZiB0aGUgc2NvcGVkIGVudW0gd2FzIGRlY2xhcmVkIHVzaW5nIHRoZSBjbGFzcworICAvLy8gdGFnLCBmYWxzZSBpZiBpdCB3YXMgZGVjbGFyZWQgd2l0aCB0aGUgc3RydWN0IHRhZy4gTm8gbWVhbmluZyBpcworICAvLy8gYXNzb2NpYXRlZCBpZiB0aGlzIHRhZyBkZWNsYXJhdGlvbiBpcyBub3QgYSBzY29wZWQgZW51bS4KKyAgdW5zaWduZWQgSXNTY29wZWRVc2luZ0NsYXNzVGFnIDogMTsKKworICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIGFuIGVudW1lcmF0aW9uIHdpdGggZml4ZWQgdW5kZXJseWluZyB0eXBlLiBPbmx5CisgIC8vLyBwb3NzaWJsZSBpbiBDKysxMSwgTWljcm9zb2Z0IGV4dGVuc2lvbnMsIG9yIE9iamVjdGl2ZSBDIG1vZGUuCisgIHVuc2lnbmVkIElzRml4ZWQgOiAxOworCisgIC8vLyBJbmRpY2F0ZXMgd2hldGhlciBpdCBpcyBwb3NzaWJsZSBmb3IgZGVjbGFyYXRpb25zIG9mIHRoaXMga2luZAorICAvLy8gdG8gaGF2ZSBhbiBvdXQtb2YtZGF0ZSBkZWZpbml0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgb3B0aW9uIGlzIG9ubHkgZW5hYmxlZCB3aGVuIG1vZHVsZXMgYXJlIGVuYWJsZWQuCisgIHVuc2lnbmVkIE1heUhhdmVPdXRPZkRhdGVEZWYgOiAxOworCisgIC8vLyBIYXMgdGhlIGZ1bGwgZGVmaW5pdGlvbiBvZiB0aGlzIHR5cGUgYmVlbiByZXF1aXJlZCBieSBhIHVzZSBzb21ld2hlcmUgaW4KKyAgLy8vIHRoZSBUVS4KKyAgdW5zaWduZWQgSXNDb21wbGV0ZURlZmluaXRpb25SZXF1aXJlZCA6IDE7CisKK3ByaXZhdGU6CisgIFNvdXJjZVJhbmdlIEJyYWNlUmFuZ2U7CisKKyAgLy8gQSBzdHJ1Y3QgcmVwcmVzZW50aW5nIHN5bnRhY3RpYyBxdWFsaWZpZXIgaW5mbywKKyAgLy8gdG8gYmUgdXNlZCBmb3IgdGhlICh1bmNvbW1vbikgY2FzZSBvZiBvdXQtb2YtbGluZSBkZWNsYXJhdGlvbnMuCisgIHVzaW5nIEV4dEluZm8gPSBRdWFsaWZpZXJJbmZvOworCisgIC8vLyBcYnJpZWYgSWYgdGhlIChvdXQtb2YtbGluZSkgdGFnIGRlY2xhcmF0aW9uIG5hbWUKKyAgLy8vIGlzIHF1YWxpZmllZCwgaXQgcG9pbnRzIHRvIHRoZSBxdWFsaWZpZXIgaW5mbyAobm5zIGFuZCByYW5nZSk7CisgIC8vLyBvdGhlcndpc2UsIGlmIHRoZSB0YWcgZGVjbGFyYXRpb24gaXMgYW5vbnltb3VzIGFuZCBpdCBpcyBwYXJ0IG9mCisgIC8vLyBhIHR5cGVkZWYgb3IgYWxpYXMsIGl0IHBvaW50cyB0byB0aGUgVHlwZWRlZk5hbWVEZWNsICh1c2VkIGZvciBtYW5nbGluZyk7CisgIC8vLyBvdGhlcndpc2UsIGlmIHRoZSB0YWcgZGVjbGFyYXRpb24gaXMgYW5vbnltb3VzIGFuZCBpdCBpcyB1c2VkIGFzIGEKKyAgLy8vIGRlY2xhcmF0aW9uIHNwZWNpZmllciBmb3IgdmFyaWFibGVzLCBpdCBwb2ludHMgdG8gdGhlIGZpcnN0IFZhckRlY2wgKHVzZWQKKyAgLy8vIGZvciBtYW5nbGluZyk7CisgIC8vLyBvdGhlcndpc2UsIGl0IGlzIGEgbnVsbCAoVHlwZWRlZk5hbWVEZWNsKSBwb2ludGVyLgorICBsbHZtOjpQb2ludGVyVW5pb248VHlwZWRlZk5hbWVEZWNsICosIEV4dEluZm8gKj4gVHlwZWRlZk5hbWVEZWNsT3JRdWFsaWZpZXI7CisKKyAgYm9vbCBoYXNFeHRJbmZvKCkgY29uc3QgeyByZXR1cm4gVHlwZWRlZk5hbWVEZWNsT3JRdWFsaWZpZXIuaXM8RXh0SW5mbyAqPigpOyB9CisgIEV4dEluZm8gKmdldEV4dEluZm8oKSB7IHJldHVybiBUeXBlZGVmTmFtZURlY2xPclF1YWxpZmllci5nZXQ8RXh0SW5mbyAqPigpOyB9CisgIGNvbnN0IEV4dEluZm8gKmdldEV4dEluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIFR5cGVkZWZOYW1lRGVjbE9yUXVhbGlmaWVyLmdldDxFeHRJbmZvICo+KCk7CisgIH0KKworcHJvdGVjdGVkOgorICBUYWdEZWNsKEtpbmQgREssIFRhZ0tpbmQgVEssIGNvbnN0IEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMLCBJZGVudGlmaWVySW5mbyAqSWQsIFRhZ0RlY2wgKlByZXZEZWNsLAorICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TCkKKyAgICAgIDogVHlwZURlY2woREssIERDLCBMLCBJZCwgU3RhcnRMKSwgRGVjbENvbnRleHQoREspLCByZWRlY2xhcmFibGVfYmFzZShDKSwKKyAgICAgICAgVGFnRGVjbEtpbmQoVEspLCBJc0NvbXBsZXRlRGVmaW5pdGlvbihmYWxzZSksIElzQmVpbmdEZWZpbmVkKGZhbHNlKSwKKyAgICAgICAgSXNFbWJlZGRlZEluRGVjbGFyYXRvcihmYWxzZSksIElzRnJlZVN0YW5kaW5nKGZhbHNlKSwKKyAgICAgICAgSXNDb21wbGV0ZURlZmluaXRpb25SZXF1aXJlZChmYWxzZSksCisgICAgICAgIFR5cGVkZWZOYW1lRGVjbE9yUXVhbGlmaWVyKChUeXBlZGVmTmFtZURlY2wgKiludWxscHRyKSB7CisgICAgYXNzZXJ0KChESyAhPSBFbnVtIHx8IFRLID09IFRUS19FbnVtKSAmJgorICAgICAgICAgICAiRW51bURlY2wgbm90IG1hdGNoZWQgd2l0aCBUVEtfRW51bSIpOworICAgIHNldFByZXZpb3VzRGVjbChQcmV2RGVjbCk7CisgIH0KKworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZSA9IFJlZGVjbGFyYWJsZTxUYWdEZWNsPjsKKworICBUYWdEZWNsICpnZXROZXh0UmVkZWNsYXJhdGlvbkltcGwoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIGdldE5leHRSZWRlY2xhcmF0aW9uKCk7CisgIH0KKworICBUYWdEZWNsICpnZXRQcmV2aW91c0RlY2xJbXBsKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRQcmV2aW91c0RlY2woKTsKKyAgfQorCisgIFRhZ0RlY2wgKmdldE1vc3RSZWNlbnREZWNsSW1wbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0TW9zdFJlY2VudERlY2woKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgQ29tcGxldGVzIHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgdGFnIGRlY2xhcmF0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIGRlcml2ZWQgY2xhc3Nlcy4KKyAgdm9pZCBjb21wbGV0ZURlZmluaXRpb24oKTsKKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisKKyAgdXNpbmcgcmVkZWNsX3JhbmdlID0gcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbF9yYW5nZTsKKyAgdXNpbmcgcmVkZWNsX2l0ZXJhdG9yID0gcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbF9pdGVyYXRvcjsKKworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsc19iZWdpbjsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHNfZW5kOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsczsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmdldFByZXZpb3VzRGVjbDsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmdldE1vc3RSZWNlbnREZWNsOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6aXNGaXJzdERlY2w7CisKKyAgU291cmNlUmFuZ2UgZ2V0QnJhY2VSYW5nZSgpIGNvbnN0IHsgcmV0dXJuIEJyYWNlUmFuZ2U7IH0KKyAgdm9pZCBzZXRCcmFjZVJhbmdlKFNvdXJjZVJhbmdlIFIpIHsgQnJhY2VSYW5nZSA9IFI7IH0KKworICAvLy8gUmV0dXJuIFNvdXJjZUxvY2F0aW9uIHJlcHJlc2VudGluZyBzdGFydCBvZiBzb3VyY2UKKyAgLy8vIHJhbmdlIGlnbm9yaW5nIG91dGVyIHRlbXBsYXRlIGRlY2xhcmF0aW9ucy4KKyAgU291cmNlTG9jYXRpb24gZ2V0SW5uZXJMb2NTdGFydCgpIGNvbnN0IHsgcmV0dXJuIGdldExvY1N0YXJ0KCk7IH0KKworICAvLy8gUmV0dXJuIFNvdXJjZUxvY2F0aW9uIHJlcHJlc2VudGluZyBzdGFydCBvZiBzb3VyY2UKKyAgLy8vIHJhbmdlIHRha2luZyBpbnRvIGFjY291bnQgYW55IG91dGVyIHRlbXBsYXRlIGRlY2xhcmF0aW9ucy4KKyAgU291cmNlTG9jYXRpb24gZ2V0T3V0ZXJMb2NTdGFydCgpIGNvbnN0OworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFk7CisKKyAgVGFnRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIG92ZXJyaWRlOworICBjb25zdCBUYWdEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PFRhZ0RlY2wqPih0aGlzKS0+Z2V0Q2Fub25pY2FsRGVjbCgpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgZGVjbGFyYXRpb24gaXMgYSBjb21wbGV0aW9uIGRlZmluaXRpb24gb2YgdGhlIHR5cGUuCisgIC8vLyBQcm92aWRlZCBmb3IgY29uc2lzdGVuY3kuCisgIGJvb2wgaXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNDb21wbGV0ZURlZmluaXRpb24oKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGRlY2wgaGFzIGl0cyBib2R5IGZ1bGx5IHNwZWNpZmllZC4KKyAgYm9vbCBpc0NvbXBsZXRlRGVmaW5pdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gSXNDb21wbGV0ZURlZmluaXRpb247CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgY29tcGxldGUgZGVjbCBpcworICAvLy8gcmVxdWlyZWQgdG8gYmUgY29tcGxldGUgZm9yIHNvbWUgZXhpc3RpbmcgdXNlLgorICBib29sIGlzQ29tcGxldGVEZWZpbml0aW9uUmVxdWlyZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIElzQ29tcGxldGVEZWZpbml0aW9uUmVxdWlyZWQ7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBkZWNsIGlzIGN1cnJlbnRseSBiZWluZyBkZWZpbmVkLgorICBib29sIGlzQmVpbmdEZWZpbmVkKCkgY29uc3QgeworICAgIHJldHVybiBJc0JlaW5nRGVmaW5lZDsKKyAgfQorCisgIGJvb2wgaXNFbWJlZGRlZEluRGVjbGFyYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gSXNFbWJlZGRlZEluRGVjbGFyYXRvcjsKKyAgfQorICB2b2lkIHNldEVtYmVkZGVkSW5EZWNsYXJhdG9yKGJvb2wgaXNJbkRlY2xhcmF0b3IpIHsKKyAgICBJc0VtYmVkZGVkSW5EZWNsYXJhdG9yID0gaXNJbkRlY2xhcmF0b3I7CisgIH0KKworICBib29sIGlzRnJlZVN0YW5kaW5nKCkgY29uc3QgeyByZXR1cm4gSXNGcmVlU3RhbmRpbmc7IH0KKyAgdm9pZCBzZXRGcmVlU3RhbmRpbmcoYm9vbCBpc0ZyZWVTdGFuZGluZyA9IHRydWUpIHsKKyAgICBJc0ZyZWVTdGFuZGluZyA9IGlzRnJlZVN0YW5kaW5nOworICB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gZGVjbGFyZXMgYSB0eXBlIHRoYXQgaXMKKyAgLy8vIGRlcGVuZGVudCwgaS5lLiwgYSB0eXBlIHRoYXQgc29tZWhvdyBkZXBlbmRzIG9uIHRlbXBsYXRlCisgIC8vLyBwYXJhbWV0ZXJzLgorICBib29sIGlzRGVwZW5kZW50VHlwZSgpIGNvbnN0IHsgcmV0dXJuIGlzRGVwZW5kZW50Q29udGV4dCgpOyB9CisKKyAgLy8vIFN0YXJ0cyB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIHRhZyBkZWNsYXJhdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgaW52b2tlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkZWZpbml0aW9uCisgIC8vLyBvZiB0aGlzIHRhZyBkZWNsYXJhdGlvbi4gSXQgd2lsbCBzZXQgdGhlIHRhZyB0eXBlIGludG8gYSBzdGF0ZQorICAvLy8gd2hlcmUgaXQgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGVmaW5lZC4KKyAgdm9pZCBzdGFydERlZmluaXRpb24oKTsKKworICAvLy8gUmV0dXJucyB0aGUgVGFnRGVjbCB0aGF0IGFjdHVhbGx5IGRlZmluZXMgdGhpcworICAvLy8gIHN0cnVjdC91bmlvbi9jbGFzcy9lbnVtLiAgV2hlbiBkZXRlcm1pbmluZyB3aGV0aGVyIG9yIG5vdCBhCisgIC8vLyAgc3RydWN0L3VuaW9uL2NsYXNzL2VudW0gaGFzIGEgZGVmaW5pdGlvbiwgb25lIHNob3VsZCB1c2UgdGhpcworICAvLy8gIG1ldGhvZCBhcyBvcHBvc2VkIHRvICdpc0RlZmluaXRpb24nLiAgJ2lzRGVmaW5pdGlvbicgaW5kaWNhdGVzCisgIC8vLyAgd2hldGhlciBvciBub3QgYSBzcGVjaWZpYyBUYWdEZWNsIGlzIGRlZmluaW5nIGRlY2xhcmF0aW9uLCBub3QKKyAgLy8vICB3aGV0aGVyIG9yIG5vdCB0aGUgc3RydWN0L3VuaW9uL2NsYXNzL2VudW0gdHlwZSBpcyBkZWZpbmVkLgorICAvLy8gIFRoaXMgbWV0aG9kIHJldHVybnMgTlVMTCBpZiB0aGVyZSBpcyBubyBUYWdEZWNsIHRoYXQgZGVmaW5lcworICAvLy8gIHRoZSBzdHJ1Y3QvdW5pb24vY2xhc3MvZW51bS4KKyAgVGFnRGVjbCAqZ2V0RGVmaW5pdGlvbigpIGNvbnN0OworCisgIHZvaWQgc2V0Q29tcGxldGVEZWZpbml0aW9uKGJvb2wgVikgeyBJc0NvbXBsZXRlRGVmaW5pdGlvbiA9IFY7IH0KKworICB2b2lkIHNldENvbXBsZXRlRGVmaW5pdGlvblJlcXVpcmVkKGJvb2wgViA9IHRydWUpIHsKKyAgICBJc0NvbXBsZXRlRGVmaW5pdGlvblJlcXVpcmVkID0gVjsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRLaW5kTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVHlwZVdpdGhLZXl3b3JkOjpnZXRUYWdUeXBlS2luZE5hbWUoZ2V0VGFnS2luZCgpKTsKKyAgfQorCisgIFRhZ0tpbmQgZ2V0VGFnS2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVGFnS2luZChUYWdEZWNsS2luZCk7CisgIH0KKworICB2b2lkIHNldFRhZ0tpbmQoVGFnS2luZCBUSykgeyBUYWdEZWNsS2luZCA9IFRLOyB9CisKKyAgYm9vbCBpc1N0cnVjdCgpIGNvbnN0IHsgcmV0dXJuIGdldFRhZ0tpbmQoKSA9PSBUVEtfU3RydWN0OyB9CisgIGJvb2wgaXNJbnRlcmZhY2UoKSBjb25zdCB7IHJldHVybiBnZXRUYWdLaW5kKCkgPT0gVFRLX0ludGVyZmFjZTsgfQorICBib29sIGlzQ2xhc3MoKSAgY29uc3QgeyByZXR1cm4gZ2V0VGFnS2luZCgpID09IFRUS19DbGFzczsgfQorICBib29sIGlzVW5pb24oKSAgY29uc3QgeyByZXR1cm4gZ2V0VGFnS2luZCgpID09IFRUS19VbmlvbjsgfQorICBib29sIGlzRW51bSgpICAgY29uc3QgeyByZXR1cm4gZ2V0VGFnS2luZCgpID09IFRUS19FbnVtOyB9CisKKyAgLy8vIElzIHRoaXMgdGFnIHR5cGUgbmFtZWQsIGVpdGhlciBkaXJlY3RseSBvciB2aWEgYmVpbmcgZGVmaW5lZCBpbgorICAvLy8gYSB0eXBlZGVmIG9mIHRoaXMgdHlwZT8KKyAgLy8vCisgIC8vLyBDKysxMSBbYmFzaWMubGlua11wODoKKyAgLy8vICAgQSB0eXBlIGlzIHNhaWQgdG8gaGF2ZSBsaW5rYWdlIGlmIGFuZCBvbmx5IGlmOgorICAvLy8gICAgIC0gaXQgaXMgYSBjbGFzcyBvciBlbnVtZXJhdGlvbiB0eXBlIHRoYXQgaXMgbmFtZWQgKG9yIGhhcyBhCisgIC8vLyAgICAgICBuYW1lIGZvciBsaW5rYWdlIHB1cnBvc2VzKSBhbmQgdGhlIG5hbWUgaGFzIGxpbmthZ2U7IC4uLgorICAvLy8gQysrMTEgW2RjbC50eXBlZGVmXXA5OgorICAvLy8gICBJZiB0aGUgdHlwZWRlZiBkZWNsYXJhdGlvbiBkZWZpbmVzIGFuIHVubmFtZWQgY2xhc3MgKG9yIGVudW0pLAorICAvLy8gICB0aGUgZmlyc3QgdHlwZWRlZi1uYW1lIGRlY2xhcmVkIGJ5IHRoZSBkZWNsYXJhdGlvbiB0byBiZSB0aGF0CisgIC8vLyAgIGNsYXNzIHR5cGUgKG9yIGVudW0gdHlwZSkgaXMgdXNlZCB0byBkZW5vdGUgdGhlIGNsYXNzIHR5cGUgKG9yCisgIC8vLyAgIGVudW0gdHlwZSkgZm9yIGxpbmthZ2UgcHVycG9zZXMgb25seS4KKyAgLy8vCisgIC8vLyBDIGRvZXMgbm90IGhhdmUgYW4gYW5hbG9nb3VzIHJ1bGUsIGJ1dCB0aGUgc2FtZSBjb25jZXB0IGlzCisgIC8vLyBub25ldGhlbGVzcyB1c2VmdWwgaW4gc29tZSBwbGFjZXMuCisgIGJvb2wgaGFzTmFtZUZvckxpbmthZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXREZWNsTmFtZSgpIHx8IGdldFR5cGVkZWZOYW1lRm9yQW5vbkRlY2woKSk7CisgIH0KKworICBUeXBlZGVmTmFtZURlY2wgKmdldFR5cGVkZWZOYW1lRm9yQW5vbkRlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0V4dEluZm8oKSA/IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgIDogVHlwZWRlZk5hbWVEZWNsT3JRdWFsaWZpZXIuZ2V0PFR5cGVkZWZOYW1lRGVjbCAqPigpOworICB9CisKKyAgdm9pZCBzZXRUeXBlZGVmTmFtZUZvckFub25EZWNsKFR5cGVkZWZOYW1lRGVjbCAqVEREKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgdGhhdCBxdWFsaWZpZXMgdGhlIG5hbWUgb2YgdGhpcworICAvLy8gZGVjbGFyYXRpb24sIGlmIGl0IHdhcyBwcmVzZW50IGluIHRoZSBzb3VyY2UuCisgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKmdldFF1YWxpZmllcigpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzRXh0SW5mbygpID8gZ2V0RXh0SW5mbygpLT5RdWFsaWZpZXJMb2MuZ2V0TmVzdGVkTmFtZVNwZWNpZmllcigpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgKHdpdGggc291cmNlLWxvY2F0aW9uCisgIC8vLyBpbmZvcm1hdGlvbikgdGhhdCBxdWFsaWZpZXMgdGhlIG5hbWUgb2YgdGhpcyBkZWNsYXJhdGlvbiwgaWYgaXQgd2FzCisgIC8vLyBwcmVzZW50IGluIHRoZSBzb3VyY2UuCisgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgZ2V0UXVhbGlmaWVyTG9jKCkgY29uc3QgeworICAgIHJldHVybiBoYXNFeHRJbmZvKCkgPyBnZXRFeHRJbmZvKCktPlF1YWxpZmllckxvYworICAgICAgICAgICAgICAgICAgICAgICAgOiBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKCk7CisgIH0KKworICB2b2lkIHNldFF1YWxpZmllckluZm8oTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MpOworCisgIHVuc2lnbmVkIGdldE51bVRlbXBsYXRlUGFyYW1ldGVyTGlzdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0V4dEluZm8oKSA/IGdldEV4dEluZm8oKS0+TnVtVGVtcGxQYXJhbUxpc3RzIDogMDsKKyAgfQorCisgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqZ2V0VGVtcGxhdGVQYXJhbWV0ZXJMaXN0KHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IGdldE51bVRlbXBsYXRlUGFyYW1ldGVyTGlzdHMoKSk7CisgICAgcmV0dXJuIGdldEV4dEluZm8oKS0+VGVtcGxQYXJhbUxpc3RzW2ldOworICB9CisKKyAgdm9pZCBzZXRUZW1wbGF0ZVBhcmFtZXRlckxpc3RzSW5mbyhBU1RDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqPiBUUExpc3RzKTsKKworICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC9ldGMuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPj0gZmlyc3RUYWcgJiYgSyA8PSBsYXN0VGFnOyB9CisKKyAgc3RhdGljIERlY2xDb250ZXh0ICpjYXN0VG9EZWNsQ29udGV4dChjb25zdCBUYWdEZWNsICpEKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PERlY2xDb250ZXh0ICo+KGNvbnN0X2Nhc3Q8VGFnRGVjbCo+KEQpKTsKKyAgfQorCisgIHN0YXRpYyBUYWdEZWNsICpjYXN0RnJvbURlY2xDb250ZXh0KGNvbnN0IERlY2xDb250ZXh0ICpEQykgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUYWdEZWNsICo+KGNvbnN0X2Nhc3Q8RGVjbENvbnRleHQqPihEQykpOworICB9Cit9OworCisvLy8gUmVwcmVzZW50cyBhbiBlbnVtLiAgSW4gQysrMTEsIGVudW1zIGNhbiBiZSBmb3J3YXJkLWRlY2xhcmVkCisvLy8gd2l0aCBhIGZpeGVkIHVuZGVybHlpbmcgdHlwZSwgYW5kIGluIEMgd2UgYWxsb3cgdGhlbSB0byBiZSBmb3J3YXJkLWRlY2xhcmVkCisvLy8gd2l0aCBubyB1bmRlcmx5aW5nIHR5cGUgYXMgYW4gZXh0ZW5zaW9uLgorY2xhc3MgRW51bURlY2wgOiBwdWJsaWMgVGFnRGVjbCB7CisgIC8vLyBUaGlzIHJlcHJlc2VudCB0aGUgaW50ZWdlciB0eXBlIHRoYXQgdGhlIGVudW0gY29ycmVzcG9uZHMKKyAgLy8vIHRvIGZvciBjb2RlIGdlbmVyYXRpb24gcHVycG9zZXMuICBOb3RlIHRoYXQgdGhlIGVudW1lcmF0b3IgY29uc3RhbnRzIG1heQorICAvLy8gaGF2ZSBhIGRpZmZlcmVudCB0eXBlIHRoYW4gdGhpcyBkb2VzLgorICAvLy8KKyAgLy8vIElmIHRoZSB1bmRlcmx5aW5nIGludGVnZXIgdHlwZSB3YXMgZXhwbGljaXRseSBzdGF0ZWQgaW4gdGhlIHNvdXJjZQorICAvLy8gY29kZSwgdGhpcyBpcyBhIFR5cGVTb3VyY2VJbmZvKiBmb3IgdGhhdCB0eXBlLiBPdGhlcndpc2UgdGhpcyB0eXBlCisgIC8vLyB3YXMgYXV0b21hdGljYWxseSBkZWR1Y2VkIHNvbWVob3csIGFuZCB0aGlzIGlzIGEgVHlwZSouCisgIC8vLworICAvLy8gTm9ybWFsbHkgaWYgSXNGaXhlZCgpLCB0aGlzIHdvdWxkIGNvbnRhaW4gYSBUeXBlU291cmNlSW5mbyosIGJ1dCBpbgorICAvLy8gc29tZSBjYXNlcyBpdCB3b24ndC4KKyAgLy8vCisgIC8vLyBUaGUgdW5kZXJseWluZyB0eXBlIG9mIGFuIGVudW1lcmF0aW9uIG5ldmVyIGhhcyBhbnkgcXVhbGlmaWVycywgc28KKyAgLy8vIHdlIGNhbiBnZXQgYXdheSB3aXRoIGp1c3Qgc3RvcmluZyBhIHJhdyBUeXBlKiwgYW5kIHRodXMgc2F2ZSBhbgorICAvLy8gZXh0cmEgcG9pbnRlciB3aGVuIFR5cGVTb3VyY2VJbmZvIGlzIG5lZWRlZC4KKyAgbGx2bTo6UG9pbnRlclVuaW9uPGNvbnN0IFR5cGUgKiwgVHlwZVNvdXJjZUluZm8gKj4gSW50ZWdlclR5cGU7CisKKyAgLy8vIFRoZSBpbnRlZ2VyIHR5cGUgdGhhdCB2YWx1ZXMgb2YgdGhpcyB0eXBlIHNob3VsZAorICAvLy8gcHJvbW90ZSB0by4gIEluIEMsIGVudW1lcmF0b3JzIGFyZSBnZW5lcmFsbHkgb2YgYW4gaW50ZWdlciB0eXBlCisgIC8vLyBkaXJlY3RseSwgYnV0IGdjYy1zdHlsZSBsYXJnZSBlbnVtZXJhdG9ycyAoYW5kIGFsbCBlbnVtZXJhdG9ycworICAvLy8gaW4gQysrKSBhcmUgb2YgdGhlIGVudW0gdHlwZSBpbnN0ZWFkLgorICBRdWFsVHlwZSBQcm9tb3Rpb25UeXBlOworCisgIC8vLyBcYnJpZWYgSWYgdGhpcyBlbnVtZXJhdGlvbiBpcyBhbiBpbnN0YW50aWF0aW9uIG9mIGEgbWVtYmVyIGVudW1lcmF0aW9uCisgIC8vLyBvZiBhIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLCB0aGlzIGlzIHRoZSBtZW1iZXIgc3BlY2lhbGl6YXRpb24KKyAgLy8vIGluZm9ybWF0aW9uLgorICBNZW1iZXJTcGVjaWFsaXphdGlvbkluZm8gKlNwZWNpYWxpemF0aW9uSW5mbyA9IG51bGxwdHI7CisKKyAgRW51bURlY2woQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRMb2MsIElkZW50aWZpZXJJbmZvICpJZCwgRW51bURlY2wgKlByZXZEZWNsLAorICAgICAgICAgICBib29sIFNjb3BlZCwgYm9vbCBTY29wZWRVc2luZ0NsYXNzVGFnLCBib29sIEZpeGVkKQorICAgICAgOiBUYWdEZWNsKEVudW0sIFRUS19FbnVtLCBDLCBEQywgSWRMb2MsIElkLCBQcmV2RGVjbCwgU3RhcnRMb2MpIHsKKyAgICBhc3NlcnQoU2NvcGVkIHx8ICFTY29wZWRVc2luZ0NsYXNzVGFnKTsKKyAgICBJbnRlZ2VyVHlwZSA9IChjb25zdCBUeXBlICopbnVsbHB0cjsKKyAgICBOdW1OZWdhdGl2ZUJpdHMgPSAwOworICAgIE51bVBvc2l0aXZlQml0cyA9IDA7CisgICAgSXNTY29wZWQgPSBTY29wZWQ7CisgICAgSXNTY29wZWRVc2luZ0NsYXNzVGFnID0gU2NvcGVkVXNpbmdDbGFzc1RhZzsKKyAgICBJc0ZpeGVkID0gRml4ZWQ7CisgIH0KKworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCisgIHZvaWQgc2V0SW5zdGFudGlhdGlvbk9mTWVtYmVyRW51bShBU1RDb250ZXh0ICZDLCBFbnVtRGVjbCAqRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCBUU0spOworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKworICBFbnVtRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gY2FzdDxFbnVtRGVjbD4oVGFnRGVjbDo6Z2V0Q2Fub25pY2FsRGVjbCgpKTsKKyAgfQorICBjb25zdCBFbnVtRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFbnVtRGVjbCo+KHRoaXMpLT5nZXRDYW5vbmljYWxEZWNsKCk7CisgIH0KKworICBFbnVtRGVjbCAqZ2V0UHJldmlvdXNEZWNsKCkgeworICAgIHJldHVybiBjYXN0X29yX251bGw8RW51bURlY2w+KAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VGFnRGVjbCAqPih0aGlzKS0+Z2V0UHJldmlvdXNEZWNsKCkpOworICB9CisgIGNvbnN0IEVudW1EZWNsICpnZXRQcmV2aW91c0RlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RW51bURlY2wqPih0aGlzKS0+Z2V0UHJldmlvdXNEZWNsKCk7CisgIH0KKworICBFbnVtRGVjbCAqZ2V0TW9zdFJlY2VudERlY2woKSB7CisgICAgcmV0dXJuIGNhc3Q8RW51bURlY2w+KHN0YXRpY19jYXN0PFRhZ0RlY2wgKj4odGhpcyktPmdldE1vc3RSZWNlbnREZWNsKCkpOworICB9CisgIGNvbnN0IEVudW1EZWNsICpnZXRNb3N0UmVjZW50RGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFbnVtRGVjbCo+KHRoaXMpLT5nZXRNb3N0UmVjZW50RGVjbCgpOworICB9CisKKyAgRW51bURlY2wgKmdldERlZmluaXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxFbnVtRGVjbD4oVGFnRGVjbDo6Z2V0RGVmaW5pdGlvbigpKTsKKyAgfQorCisgIHN0YXRpYyBFbnVtRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIElkTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsIEVudW1EZWNsICpQcmV2RGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1Njb3BlZCwgYm9vbCBJc1Njb3BlZFVzaW5nQ2xhc3NUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNGaXhlZCk7CisgIHN0YXRpYyBFbnVtRGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKKworICAvLy8gV2hlbiBjcmVhdGVkLCB0aGUgRW51bURlY2wgY29ycmVzcG9uZHMgdG8gYQorICAvLy8gZm9yd2FyZC1kZWNsYXJlZCBlbnVtLiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIG1hcmsgdGhlCisgIC8vLyBkZWNsYXJhdGlvbiBhcyBiZWluZyBkZWZpbmVkOyBpdHMgZW51bWVyYXRvcnMgaGF2ZSBhbHJlYWR5IGJlZW4KKyAgLy8vIGFkZGVkICh2aWEgRGVjbENvbnRleHQ6OmFkZERlY2wpLiBOZXdUeXBlIGlzIHRoZSBuZXcgdW5kZXJseWluZworICAvLy8gdHlwZSBvZiB0aGUgZW51bWVyYXRpb24gdHlwZS4KKyAgdm9pZCBjb21wbGV0ZURlZmluaXRpb24oUXVhbFR5cGUgTmV3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgUHJvbW90aW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUG9zaXRpdmVCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1OZWdhdGl2ZUJpdHMpOworCisgIC8vIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGVudW1lcmF0b3JzIG9mIHRoaXMgZW51bWVyYXRpb24uCisgIHVzaW5nIGVudW1lcmF0b3JfaXRlcmF0b3IgPSBzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPEVudW1Db25zdGFudERlY2w+OworICB1c2luZyBlbnVtZXJhdG9yX3JhbmdlID0KKyAgICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHNwZWNpZmljX2RlY2xfaXRlcmF0b3I8RW51bUNvbnN0YW50RGVjbD4+OworCisgIGVudW1lcmF0b3JfcmFuZ2UgZW51bWVyYXRvcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGVudW1lcmF0b3JfcmFuZ2UoZW51bWVyYXRvcl9iZWdpbigpLCBlbnVtZXJhdG9yX2VuZCgpKTsKKyAgfQorCisgIGVudW1lcmF0b3JfaXRlcmF0b3IgZW51bWVyYXRvcl9iZWdpbigpIGNvbnN0IHsKKyAgICBjb25zdCBFbnVtRGVjbCAqRSA9IGdldERlZmluaXRpb24oKTsKKyAgICBpZiAoIUUpCisgICAgICBFID0gdGhpczsKKyAgICByZXR1cm4gZW51bWVyYXRvcl9pdGVyYXRvcihFLT5kZWNsc19iZWdpbigpKTsKKyAgfQorCisgIGVudW1lcmF0b3JfaXRlcmF0b3IgZW51bWVyYXRvcl9lbmQoKSBjb25zdCB7CisgICAgY29uc3QgRW51bURlY2wgKkUgPSBnZXREZWZpbml0aW9uKCk7CisgICAgaWYgKCFFKQorICAgICAgRSA9IHRoaXM7CisgICAgcmV0dXJuIGVudW1lcmF0b3JfaXRlcmF0b3IoRS0+ZGVjbHNfZW5kKCkpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgaW50ZWdlciB0eXBlIHRoYXQgZW51bWVyYXRvcnMgc2hvdWxkIHByb21vdGUgdG8uCisgIFF1YWxUeXBlIGdldFByb21vdGlvblR5cGUoKSBjb25zdCB7IHJldHVybiBQcm9tb3Rpb25UeXBlOyB9CisKKyAgLy8vIFNldCB0aGUgcHJvbW90aW9uIHR5cGUuCisgIHZvaWQgc2V0UHJvbW90aW9uVHlwZShRdWFsVHlwZSBUKSB7IFByb21vdGlvblR5cGUgPSBUOyB9CisKKyAgLy8vIFJldHVybiB0aGUgaW50ZWdlciB0eXBlIHRoaXMgZW51bSBkZWNsIGNvcnJlc3BvbmRzIHRvLgorICAvLy8gVGhpcyByZXR1cm5zIGEgbnVsbCBRdWFsVHlwZSBmb3IgYW4gZW51bSBmb3J3YXJkIGRlZmluaXRpb24gd2l0aCBubyBmaXhlZAorICAvLy8gdW5kZXJseWluZyB0eXBlLgorICBRdWFsVHlwZSBnZXRJbnRlZ2VyVHlwZSgpIGNvbnN0IHsKKyAgICBpZiAoIUludGVnZXJUeXBlKQorICAgICAgcmV0dXJuIFF1YWxUeXBlKCk7CisgICAgaWYgKGNvbnN0IFR5cGUgKlQgPSBJbnRlZ2VyVHlwZS5keW5fY2FzdDxjb25zdCBUeXBlKj4oKSkKKyAgICAgIHJldHVybiBRdWFsVHlwZShULCAwKTsKKyAgICByZXR1cm4gSW50ZWdlclR5cGUuZ2V0PFR5cGVTb3VyY2VJbmZvKj4oKS0+Z2V0VHlwZSgpLmdldFVucXVhbGlmaWVkVHlwZSgpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIHVuZGVybHlpbmcgaW50ZWdlciB0eXBlLgorICB2b2lkIHNldEludGVnZXJUeXBlKFF1YWxUeXBlIFQpIHsgSW50ZWdlclR5cGUgPSBULmdldFR5cGVQdHJPck51bGwoKTsgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSB1bmRlcmx5aW5nIGludGVnZXIgdHlwZSBzb3VyY2UgaW5mby4KKyAgdm9pZCBzZXRJbnRlZ2VyVHlwZVNvdXJjZUluZm8oVHlwZVNvdXJjZUluZm8gKlRJbmZvKSB7IEludGVnZXJUeXBlID0gVEluZm87IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdHlwZSBzb3VyY2UgaW5mbyBmb3IgdGhlIHVuZGVybHlpbmcgaW50ZWdlciB0eXBlLAorICAvLy8gaWYgbm8gdHlwZSBzb3VyY2UgaW5mbyBleGlzdHMsIHJldHVybiAwLgorICBUeXBlU291cmNlSW5mbyAqZ2V0SW50ZWdlclR5cGVTb3VyY2VJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBJbnRlZ2VyVHlwZS5keW5fY2FzdDxUeXBlU291cmNlSW5mbyo+KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzb3VyY2UgcmFuZ2UgdGhhdCBjb3ZlcnMgdGhlIHVuZGVybHlpbmcgdHlwZSBpZgorICAvLy8gc3BlY2lmaWVkLgorICBTb3VyY2VSYW5nZSBnZXRJbnRlZ2VyVHlwZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHdpZHRoIGluIGJpdHMgcmVxdWlyZWQgdG8gc3RvcmUgYWxsIHRoZQorICAvLy8gbm9uLW5lZ2F0aXZlIGVudW1lcmF0b3JzIG9mIHRoaXMgZW51bS4KKyAgdW5zaWduZWQgZ2V0TnVtUG9zaXRpdmVCaXRzKCkgY29uc3QgeworICAgIHJldHVybiBOdW1Qb3NpdGl2ZUJpdHM7CisgIH0KKyAgdm9pZCBzZXROdW1Qb3NpdGl2ZUJpdHModW5zaWduZWQgTnVtKSB7CisgICAgTnVtUG9zaXRpdmVCaXRzID0gTnVtOworICAgIGFzc2VydChOdW1Qb3NpdGl2ZUJpdHMgPT0gTnVtICYmICJjYW4ndCBzdG9yZSB0aGlzIGJpdGNvdW50Iik7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHdpZHRoIGluIGJpdHMgcmVxdWlyZWQgdG8gc3RvcmUgYWxsIHRoZQorICAvLy8gbmVnYXRpdmUgZW51bWVyYXRvcnMgb2YgdGhpcyBlbnVtLiAgVGhlc2Ugd2lkdGhzIGluY2x1ZGUKKyAgLy8vIHRoZSByaWdodG1vc3QgbGVhZGluZyAxOyAgdGhhdCBpczoKKyAgLy8vCisgIC8vLyBNT1NUIE5FR0FUSVZFIEVOVU1FUkFUT1IgICAgIFBBVFRFUk4gICAgIE5VTSBORUdBVElWRSBCSVRTCisgIC8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tCisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgLTEgICAgIDExMTExMTEgICAgICAgICAgICAgICAgICAgICAxCisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAtMTAgICAgIDExMTAxMTAgICAgICAgICAgICAgICAgICAgICA1CisgIC8vLyAgICAgICAgICAgICAgICAgICAgIC0xMDEgICAgIDEwMDEwMTEgICAgICAgICAgICAgICAgICAgICA4CisgIHVuc2lnbmVkIGdldE51bU5lZ2F0aXZlQml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtTmVnYXRpdmVCaXRzOworICB9CisgIHZvaWQgc2V0TnVtTmVnYXRpdmVCaXRzKHVuc2lnbmVkIE51bSkgeworICAgIE51bU5lZ2F0aXZlQml0cyA9IE51bTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBDKysxMSBzY29wZWQgZW51bWVyYXRpb24uCisgIGJvb2wgaXNTY29wZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIElzU2NvcGVkOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIEMrKzExIHNjb3BlZCBlbnVtZXJhdGlvbi4KKyAgYm9vbCBpc1Njb3BlZFVzaW5nQ2xhc3NUYWcoKSBjb25zdCB7CisgICAgcmV0dXJuIElzU2NvcGVkVXNpbmdDbGFzc1RhZzsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYW4gT2JqZWN0aXZlLUMsIEMrKzExLCBvcgorICAvLy8gTWljcm9zb2Z0LXN0eWxlIGVudW1lcmF0aW9uIHdpdGggYSBmaXhlZCB1bmRlcmx5aW5nIHR5cGUuCisgIGJvb2wgaXNGaXhlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSXNGaXhlZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoaXMgY2FuIGJlIGNvbnNpZGVyZWQgYSBjb21wbGV0ZSB0eXBlLgorICBib29sIGlzQ29tcGxldGUoKSBjb25zdCB7CisgICAgLy8gSW50ZWdlclR5cGUgaXMgc2V0IGZvciBmaXhlZCB0eXBlIGVudW1zIGFuZCBub24tZml4ZWQgYnV0IGltcGxpY2l0bHkKKyAgICAvLyBpbnQtc2l6ZWQgTWljcm9zb2Z0IGVudW1zLgorICAgIHJldHVybiBpc0NvbXBsZXRlRGVmaW5pdGlvbigpIHx8IEludGVnZXJUeXBlOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVudW0gaXMgZWl0aGVyIGFubm90YXRlZCB3aXRoCisgIC8vLyBlbnVtX2V4dGVuc2liaWxpdHkoY2xvc2VkKSBvciBpc24ndCBhbm5vdGF0ZWQgd2l0aCBlbnVtX2V4dGVuc2liaWxpdHkuCisgIGJvb2wgaXNDbG9zZWQoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgZW51bSBpcyBhbm5vdGF0ZWQgd2l0aCBmbGFnX2VudW0gYW5kIGlzbid0IGFubm90YXRlZAorICAvLy8gd2l0aCBlbnVtX2V4dGVuc2liaWxpdHkob3BlbikuCisgIGJvb2wgaXNDbG9zZWRGbGFnKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVudW0gaXMgYW5ub3RhdGVkIHdpdGggbmVpdGhlciBmbGFnX2VudW0gbm9yCisgIC8vLyBlbnVtX2V4dGVuc2liaWxpdHkob3BlbikuCisgIGJvb2wgaXNDbG9zZWROb25GbGFnKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgZW51bSBkZWZpbml0aW9uIGZyb20gd2hpY2ggdGhpcyBlbnVtZXJhdGlvbiBjb3VsZAorICAvLy8gYmUgaW5zdGFudGlhdGVkLCBpZiBpdCBpcyBhbiBpbnN0YW50aWF0aW9uIChyYXRoZXIgdGhhbiBhIG5vbi10ZW1wbGF0ZSkuCisgIEVudW1EZWNsICpnZXRUZW1wbGF0ZUluc3RhbnRpYXRpb25QYXR0ZXJuKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBlbnVtZXJhdGlvbiAoZGVjbGFyZWQgd2l0aGluIHRoZSB0ZW1wbGF0ZSkKKyAgLy8vIGZyb20gd2hpY2ggdGhpcyBlbnVtZXJhdGlvbiB0eXBlIHdhcyBpbnN0YW50aWF0ZWQsIG9yIE5VTEwgaWYKKyAgLy8vIHRoaXMgZW51bWVyYXRpb24gd2FzIG5vdCBpbnN0YW50aWF0ZWQgZnJvbSBhbnkgdGVtcGxhdGUuCisgIEVudW1EZWNsICpnZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyRW51bSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgSWYgdGhpcyBlbnVtZXJhdGlvbiBpcyBhIG1lbWJlciBvZiBhIHNwZWNpYWxpemF0aW9uIG9mIGEKKyAgLy8vIHRlbXBsYXRlZCBjbGFzcywgZGV0ZXJtaW5lIHdoYXQga2luZCBvZiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbgorICAvLy8gb3IgaW5zdGFudGlhdGlvbiB0aGlzIGlzLgorICBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCBnZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRm9yIGFuIGVudW1lcmF0aW9uIG1lbWJlciB0aGF0IHdhcyBpbnN0YW50aWF0ZWQgZnJvbSBhIG1lbWJlcgorICAvLy8gZW51bWVyYXRpb24gb2YgYSB0ZW1wbGF0ZWQgY2xhc3MsIHNldCB0aGUgdGVtcGxhdGUgc3BlY2lhbGlhdGlvbiBraW5kLgorICB2b2lkIHNldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kIFRTSywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFBvaW50T2ZJbnN0YW50aWF0aW9uID0gU291cmNlTG9jYXRpb24oKSk7CisKKyAgLy8vIFxicmllZiBJZiB0aGlzIGVudW1lcmF0aW9uIGlzIGFuIGluc3RhbnRpYXRpb24gb2YgYSBtZW1iZXIgZW51bWVyYXRpb24gb2YKKyAgLy8vIGEgY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24sIHJldHJpZXZlcyB0aGUgbWVtYmVyIHNwZWNpYWxpemF0aW9uCisgIC8vLyBpbmZvcm1hdGlvbi4KKyAgTWVtYmVyU3BlY2lhbGl6YXRpb25JbmZvICpnZXRNZW1iZXJTcGVjaWFsaXphdGlvbkluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIFNwZWNpYWxpemF0aW9uSW5mbzsKKyAgfQorCisgIC8vLyBcYnJpZWYgU3BlY2lmeSB0aGF0IHRoaXMgZW51bWVyYXRpb24gaXMgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUKKyAgLy8vIG1lbWJlciBlbnVtZXJhdGlvbiBFRC4KKyAgdm9pZCBzZXRJbnN0YW50aWF0aW9uT2ZNZW1iZXJFbnVtKEVudW1EZWNsICpFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kIFRTSykgeworICAgIHNldEluc3RhbnRpYXRpb25PZk1lbWJlckVudW0oZ2V0QVNUQ29udGV4dCgpLCBFRCwgVFNLKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gRW51bTsgfQorfTsKKworLy8vIFJlcHJlc2VudHMgYSBzdHJ1Y3QvdW5pb24vY2xhc3MuICBGb3IgZXhhbXBsZToKKy8vLyAgIHN0cnVjdCBYOyAgICAgICAgICAgICAgICAgIC8vIEZvcndhcmQgZGVjbGFyYXRpb24sIG5vICJib2R5Ii4KKy8vLyAgIHVuaW9uIFkgeyBpbnQgQSwgQjsgfTsgICAgIC8vIEhhcyBib2R5IHdpdGggbWVtYmVycyBBIGFuZCBCIChGaWVsZERlY2xzKS4KKy8vLyBUaGlzIGRlY2wgd2lsbCBiZSBtYXJrZWQgaW52YWxpZCBpZiAqYW55KiBtZW1iZXJzIGFyZSBpbnZhbGlkLgorY2xhc3MgUmVjb3JkRGVjbCA6IHB1YmxpYyBUYWdEZWNsIHsKKyAgZnJpZW5kIGNsYXNzIERlY2xDb250ZXh0OworCisgIC8vIEZJWE1FOiBUaGlzIGNhbiBiZSBwYWNrZWQgaW50byB0aGUgYml0ZmllbGRzIGluIERlY2wuCisgIC8vLyBUaGlzIGlzIHRydWUgaWYgdGhpcyBzdHJ1Y3QgZW5kcyB3aXRoIGEgZmxleGlibGUKKyAgLy8vIGFycmF5IG1lbWJlciAoZS5nLiBpbnQgWFtdKSBvciBpZiB0aGlzIHVuaW9uIGNvbnRhaW5zIGEgc3RydWN0IHRoYXQgZG9lcy4KKyAgLy8vIElmIHNvLCB0aGlzIGNhbm5vdCBiZSBjb250YWluZWQgaW4gYXJyYXlzIG9yIG90aGVyIHN0cnVjdHMgYXMgYSBtZW1iZXIuCisgIGJvb2wgSGFzRmxleGlibGVBcnJheU1lbWJlciA6IDE7CisKKyAgLy8vIFdoZXRoZXIgdGhpcyBpcyB0aGUgdHlwZSBvZiBhbiBhbm9ueW1vdXMgc3RydWN0IG9yIHVuaW9uLgorICBib29sIEFub255bW91c1N0cnVjdE9yVW5pb24gOiAxOworCisgIC8vLyBUaGlzIGlzIHRydWUgaWYgdGhpcyBzdHJ1Y3QgaGFzIGF0IGxlYXN0IG9uZSBtZW1iZXIKKyAgLy8vIGNvbnRhaW5pbmcgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IHBvaW50ZXIgdHlwZS4KKyAgYm9vbCBIYXNPYmplY3RNZW1iZXIgOiAxOworCisgIC8vLyBUaGlzIGlzIHRydWUgaWYgc3RydWN0IGhhcyBhdCBsZWFzdCBvbmUgbWVtYmVyIG9mCisgIC8vLyAndm9sYXRpbGUnIHR5cGUuCisgIGJvb2wgSGFzVm9sYXRpbGVNZW1iZXIgOiAxOworCisgIC8vLyBXaGV0aGVyIHRoZSBmaWVsZCBkZWNsYXJhdGlvbnMgb2YgdGhpcyByZWNvcmQgaGF2ZSBiZWVuIGxvYWRlZAorICAvLy8gZnJvbSBleHRlcm5hbCBzdG9yYWdlLiBUbyBhdm9pZCB1bm5lY2Vzc2FyeSBkZXNlcmlhbGl6YXRpb24gb2YKKyAgLy8vIG1ldGhvZHMvbmVzdGVkIHR5cGVzIHdlIGFsbG93IGRlc2VyaWFsaXphdGlvbiBvZiBqdXN0IHRoZSBmaWVsZHMKKyAgLy8vIHdoZW4gbmVlZGVkLgorICBtdXRhYmxlIGJvb2wgTG9hZGVkRmllbGRzRnJvbUV4dGVybmFsU3RvcmFnZSA6IDE7CisKKyAgLy8vIEJhc2ljIHByb3BlcnRpZXMgb2Ygbm9uLXRyaXZpYWwgQyBzdHJ1Y3RzLgorICBib29sIE5vblRyaXZpYWxUb1ByaW1pdGl2ZURlZmF1bHRJbml0aWFsaXplIDogMTsKKyAgYm9vbCBOb25Ucml2aWFsVG9QcmltaXRpdmVDb3B5IDogMTsKKyAgYm9vbCBOb25Ucml2aWFsVG9QcmltaXRpdmVEZXN0cm95IDogMTsKKworICAvLy8gVHJ1ZSBpZiB0aGlzIGNsYXNzIGNhbiBiZSBwYXNzZWQgaW4gYSBub24tYWRkcmVzcy1wcmVzZXJ2aW5nIGZhc2hpb24KKyAgLy8vIChzdWNoIGFzIGluIHJlZ2lzdGVycykuCisgIC8vLyBUaGlzIGRvZXMgbm90IGltcGx5IGFueXRoaW5nIGFib3V0IGhvdyB0aGUgQUJJIGluIHVzZSB3aWxsIGFjdHVhbGx5CisgIC8vLyBwYXNzIGFuIG9iamVjdCBvZiB0aGlzIGNsYXNzLgorICBib29sIENhblBhc3NJblJlZ2lzdGVycyA6IDE7CisKKyAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgc3RydWN0IGlzIGRlc3Ryb3llZCBpbiB0aGUgY2FsbGVlLiBUaGlzIGZsYWcgaXMKKyAgLy8vIG1lYW5pbmdsZXNzIHdoZW4gTWljcm9zb2Z0IEFCSSBpcyB1c2VkIHNpbmNlIHBhcmFtZXRlcnMgYXJlIGFsd2F5cworICAvLy8gZGVzdHJveWVkIGluIHRoZSBjYWxsZWUuCisgIGJvb2wgUGFyYW1EZXN0cm95ZWRJbkNhbGxlZSA6IDE7CisKK3Byb3RlY3RlZDoKKyAgUmVjb3JkRGVjbChLaW5kIERLLCBUYWdLaW5kIFRLLCBjb25zdCBBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIElkTG9jLAorICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpJZCwgUmVjb3JkRGVjbCAqUHJldkRlY2wpOworCitwdWJsaWM6CisgIHN0YXRpYyBSZWNvcmREZWNsICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgVGFnS2luZCBUSywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBJZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsIFJlY29yZERlY2wqIFByZXZEZWNsID0gbnVsbHB0cik7CisgIHN0YXRpYyBSZWNvcmREZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoY29uc3QgQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOworCisgIFJlY29yZERlY2wgKmdldFByZXZpb3VzRGVjbCgpIHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPFJlY29yZERlY2w+KAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VGFnRGVjbCAqPih0aGlzKS0+Z2V0UHJldmlvdXNEZWNsKCkpOworICB9CisgIGNvbnN0IFJlY29yZERlY2wgKmdldFByZXZpb3VzRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxSZWNvcmREZWNsKj4odGhpcyktPmdldFByZXZpb3VzRGVjbCgpOworICB9CisKKyAgUmVjb3JkRGVjbCAqZ2V0TW9zdFJlY2VudERlY2woKSB7CisgICAgcmV0dXJuIGNhc3Q8UmVjb3JkRGVjbD4oc3RhdGljX2Nhc3Q8VGFnRGVjbCAqPih0aGlzKS0+Z2V0TW9zdFJlY2VudERlY2woKSk7CisgIH0KKyAgY29uc3QgUmVjb3JkRGVjbCAqZ2V0TW9zdFJlY2VudERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8UmVjb3JkRGVjbCo+KHRoaXMpLT5nZXRNb3N0UmVjZW50RGVjbCgpOworICB9CisKKyAgYm9vbCBoYXNGbGV4aWJsZUFycmF5TWVtYmVyKCkgY29uc3QgeyByZXR1cm4gSGFzRmxleGlibGVBcnJheU1lbWJlcjsgfQorICB2b2lkIHNldEhhc0ZsZXhpYmxlQXJyYXlNZW1iZXIoYm9vbCBWKSB7IEhhc0ZsZXhpYmxlQXJyYXlNZW1iZXIgPSBWOyB9CisKKyAgLy8vIFdoZXRoZXIgdGhpcyBpcyBhbiBhbm9ueW1vdXMgc3RydWN0IG9yIHVuaW9uLiBUbyBiZSBhbiBhbm9ueW1vdXMKKyAgLy8vIHN0cnVjdCBvciB1bmlvbiwgaXQgbXVzdCBoYXZlIGJlZW4gZGVjbGFyZWQgd2l0aG91dCBhIG5hbWUgYW5kCisgIC8vLyB0aGVyZSBtdXN0IGJlIG5vIG9iamVjdHMgb2YgdGhpcyB0eXBlIGRlY2xhcmVkLCBlLmcuLAorICAvLy8gQGNvZGUKKyAgLy8vICAgdW5pb24geyBpbnQgaTsgZmxvYXQgZjsgfTsKKyAgLy8vIEBlbmRjb2RlCisgIC8vLyBpcyBhbiBhbm9ueW1vdXMgdW5pb24gYnV0IG5laXRoZXIgb2YgdGhlIGZvbGxvd2luZyBhcmU6CisgIC8vLyBAY29kZQorICAvLy8gIHVuaW9uIFggeyBpbnQgaTsgZmxvYXQgZjsgfTsKKyAgLy8vICB1bmlvbiB7IGludCBpOyBmbG9hdCBmOyB9IG9iajsKKyAgLy8vIEBlbmRjb2RlCisgIGJvb2wgaXNBbm9ueW1vdXNTdHJ1Y3RPclVuaW9uKCkgY29uc3QgeyByZXR1cm4gQW5vbnltb3VzU3RydWN0T3JVbmlvbjsgfQorICB2b2lkIHNldEFub255bW91c1N0cnVjdE9yVW5pb24oYm9vbCBBbm9uKSB7CisgICAgQW5vbnltb3VzU3RydWN0T3JVbmlvbiA9IEFub247CisgIH0KKworICBib29sIGhhc09iamVjdE1lbWJlcigpIGNvbnN0IHsgcmV0dXJuIEhhc09iamVjdE1lbWJlcjsgfQorICB2b2lkIHNldEhhc09iamVjdE1lbWJlciAoYm9vbCB2YWwpIHsgSGFzT2JqZWN0TWVtYmVyID0gdmFsOyB9CisKKyAgYm9vbCBoYXNWb2xhdGlsZU1lbWJlcigpIGNvbnN0IHsgcmV0dXJuIEhhc1ZvbGF0aWxlTWVtYmVyOyB9CisgIHZvaWQgc2V0SGFzVm9sYXRpbGVNZW1iZXIgKGJvb2wgdmFsKSB7IEhhc1ZvbGF0aWxlTWVtYmVyID0gdmFsOyB9CisKKyAgYm9vbCBoYXNMb2FkZWRGaWVsZHNGcm9tRXh0ZXJuYWxTdG9yYWdlKCkgY29uc3QgeworICAgIHJldHVybiBMb2FkZWRGaWVsZHNGcm9tRXh0ZXJuYWxTdG9yYWdlOworICB9CisgIHZvaWQgc2V0SGFzTG9hZGVkRmllbGRzRnJvbUV4dGVybmFsU3RvcmFnZShib29sIHZhbCkgeworICAgIExvYWRlZEZpZWxkc0Zyb21FeHRlcm5hbFN0b3JhZ2UgPSB2YWw7CisgIH0KKworICAvLy8gRnVuY3Rpb25zIHRvIHF1ZXJ5IGJhc2ljIHByb3BlcnRpZXMgb2Ygbm9uLXRyaXZpYWwgQyBzdHJ1Y3RzLgorICBib29sIGlzTm9uVHJpdmlhbFRvUHJpbWl0aXZlRGVmYXVsdEluaXRpYWxpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIE5vblRyaXZpYWxUb1ByaW1pdGl2ZURlZmF1bHRJbml0aWFsaXplOworICB9CisKKyAgdm9pZCBzZXROb25Ucml2aWFsVG9QcmltaXRpdmVEZWZhdWx0SW5pdGlhbGl6ZShib29sIFYpIHsKKyAgICBOb25Ucml2aWFsVG9QcmltaXRpdmVEZWZhdWx0SW5pdGlhbGl6ZSA9IFY7CisgIH0KKworICBib29sIGlzTm9uVHJpdmlhbFRvUHJpbWl0aXZlQ29weSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9uVHJpdmlhbFRvUHJpbWl0aXZlQ29weTsKKyAgfQorCisgIHZvaWQgc2V0Tm9uVHJpdmlhbFRvUHJpbWl0aXZlQ29weShib29sIFYpIHsKKyAgICBOb25Ucml2aWFsVG9QcmltaXRpdmVDb3B5ID0gVjsKKyAgfQorCisgIGJvb2wgaXNOb25Ucml2aWFsVG9QcmltaXRpdmVEZXN0cm95KCkgY29uc3QgeworICAgIHJldHVybiBOb25Ucml2aWFsVG9QcmltaXRpdmVEZXN0cm95OworICB9CisKKyAgdm9pZCBzZXROb25Ucml2aWFsVG9QcmltaXRpdmVEZXN0cm95KGJvb2wgVikgeworICAgIE5vblRyaXZpYWxUb1ByaW1pdGl2ZURlc3Ryb3kgPSBWOworICB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2xhc3MgY2FuIGJlIHBhc3NlZCBpbiByZWdpc3RlcnMuIEluIEMrKyBtb2RlLAorICAvLy8gaXQgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB0cml2aWFsLCBub24tZGVsZXRlZCBjb3B5IG9yIG1vdmUgY29uc3RydWN0b3IuCisgIC8vLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgc2V0IGFzIHBhcnQgb2YgY29tcGxldGVEZWZpbml0aW9uLgorICBib29sIGNhblBhc3NJblJlZ2lzdGVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2FuUGFzc0luUmVnaXN0ZXJzOworICB9CisKKyAgLy8vIFNldCB0aGF0IHdlIGNhbiBwYXNzIHRoaXMgUmVjb3JkRGVjbCBpbiByZWdpc3RlcnMuCisgIHZvaWQgc2V0Q2FuUGFzc0luUmVnaXN0ZXJzKGJvb2wgQ2FuUGFzcykgeworICAgIENhblBhc3NJblJlZ2lzdGVycyA9IENhblBhc3M7CisgIH0KKworICBib29sIGlzUGFyYW1EZXN0cm95ZWRJbkNhbGxlZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1EZXN0cm95ZWRJbkNhbGxlZTsKKyAgfQorCisgIHZvaWQgc2V0UGFyYW1EZXN0cm95ZWRJbkNhbGxlZShib29sIFYpIHsKKyAgICBQYXJhbURlc3Ryb3llZEluQ2FsbGVlID0gVjsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gcmVwcmVzZW50cyB0aGUKKyAgLy8vIGluamVjdGVkIGNsYXNzIG5hbWUuCisgIC8vLworICAvLy8gVGhlIGluamVjdGVkIGNsYXNzIG5hbWUgaW4gQysrIGlzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0CisgIC8vLyBhcHBlYXJzIGluc2lkZSB0aGUgY2xhc3MgaXRzZWxmLiBGb3IgZXhhbXBsZToKKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gc3RydWN0IEMgeworICAvLy8gICAvLyBDIGlzIGltcGxpY2l0bHkgZGVjbGFyZWQgaGVyZSBhcyBhIHN5bm9ueW0gZm9yIHRoZSBjbGFzcyBuYW1lLgorICAvLy8gfTsKKyAgLy8vCisgIC8vLyBDOjpDIGM7IC8vIHNhbWUgYXMgIkMgYzsiCisgIC8vLyBcZW5kY29kZQorICBib29sIGlzSW5qZWN0ZWRDbGFzc05hbWUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgcmVjb3JkIGlzIGEgY2xhc3MgZGVzY3JpYmluZyBhIGxhbWJkYQorICAvLy8gZnVuY3Rpb24gb2JqZWN0LgorICBib29sIGlzTGFtYmRhKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHJlY29yZCBpcyBhIHJlY29yZCBmb3IgY2FwdHVyZWQgdmFyaWFibGVzIGluCisgIC8vLyBDYXB0dXJlZFN0bXQgY29uc3RydWN0LgorICBib29sIGlzQ2FwdHVyZWRSZWNvcmQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIE1hcmsgdGhlIHJlY29yZCBhcyBhIHJlY29yZCBmb3IgY2FwdHVyZWQgdmFyaWFibGVzIGluIENhcHR1cmVkU3RtdAorICAvLy8gY29uc3RydWN0LgorICB2b2lkIHNldENhcHR1cmVkUmVjb3JkKCk7CisKKyAgLy8vIFJldHVybnMgdGhlIFJlY29yZERlY2wgdGhhdCBhY3R1YWxseSBkZWZpbmVzCisgIC8vLyAgdGhpcyBzdHJ1Y3QvdW5pb24vY2xhc3MuICBXaGVuIGRldGVybWluaW5nIHdoZXRoZXIgb3Igbm90IGEKKyAgLy8vICBzdHJ1Y3QvdW5pb24vY2xhc3MgaXMgY29tcGxldGVseSBkZWZpbmVkLCBvbmUgc2hvdWxkIHVzZSB0aGlzCisgIC8vLyAgbWV0aG9kIGFzIG9wcG9zZWQgdG8gJ2lzQ29tcGxldGVEZWZpbml0aW9uJy4KKyAgLy8vICAnaXNDb21wbGV0ZURlZmluaXRpb24nIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhIHNwZWNpZmljCisgIC8vLyAgUmVjb3JkRGVjbCBpcyBhIGNvbXBsZXRlZCBkZWZpbml0aW9uLCBub3Qgd2hldGhlciBvciBub3QgdGhlCisgIC8vLyAgcmVjb3JkIHR5cGUgaXMgZGVmaW5lZC4gIFRoaXMgbWV0aG9kIHJldHVybnMgTlVMTCBpZiB0aGVyZSBpcworICAvLy8gIG5vIFJlY29yZERlY2wgdGhhdCBkZWZpbmVzIHRoZSBzdHJ1Y3QvdW5pb24vdGFnLgorICBSZWNvcmREZWNsICpnZXREZWZpbml0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8UmVjb3JkRGVjbD4oVGFnRGVjbDo6Z2V0RGVmaW5pdGlvbigpKTsKKyAgfQorCisgIC8vIEl0ZXJhdG9yIGFjY2VzcyB0byBmaWVsZCBtZW1iZXJzLiBUaGUgZmllbGQgaXRlcmF0b3Igb25seSB2aXNpdHMKKyAgLy8gdGhlIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXJzIG9mIHRoaXMgY2xhc3MsIGlnbm9yaW5nIGFueSBzdGF0aWMKKyAgLy8gZGF0YSBtZW1iZXJzLCBmdW5jdGlvbnMsIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMsIGV0Yy4KKyAgdXNpbmcgZmllbGRfaXRlcmF0b3IgPSBzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPEZpZWxkRGVjbD47CisgIHVzaW5nIGZpZWxkX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c3BlY2lmaWNfZGVjbF9pdGVyYXRvcjxGaWVsZERlY2w+PjsKKworICBmaWVsZF9yYW5nZSBmaWVsZHMoKSBjb25zdCB7IHJldHVybiBmaWVsZF9yYW5nZShmaWVsZF9iZWdpbigpLCBmaWVsZF9lbmQoKSk7IH0KKyAgZmllbGRfaXRlcmF0b3IgZmllbGRfYmVnaW4oKSBjb25zdDsKKworICBmaWVsZF9pdGVyYXRvciBmaWVsZF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGZpZWxkX2l0ZXJhdG9yKGRlY2xfaXRlcmF0b3IoKSk7CisgIH0KKworICAvLyBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgZmllbGRzIChub24tc3RhdGljIGRhdGEgbWVtYmVycykgaW4gdGhpcyByZWNvcmQuCisgIGJvb2wgZmllbGRfZW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIGZpZWxkX2JlZ2luKCkgPT0gZmllbGRfZW5kKCk7CisgIH0KKworICAvLy8gTm90ZSB0aGF0IHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgdHlwZSBpcyBub3cgY29tcGxldGUuCisgIHZpcnR1YWwgdm9pZCBjb21wbGV0ZURlZmluaXRpb24oKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7CisgICAgcmV0dXJuIEsgPj0gZmlyc3RSZWNvcmQgJiYgSyA8PSBsYXN0UmVjb3JkOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgd2hldGhlciBvciBub3QgdGhpcyBpcyBhbiBtc19zdHJ1Y3Qgd2hpY2ggY2FuCisgIC8vLyBiZSB0dXJuZWQgb24gd2l0aCBhbiBhdHRyaWJ1dGUsIHByYWdtYSwgb3IgLW1tcy1iaXRmaWVsZHMKKyAgLy8vIGNvbW1hbmRsaW5lIG9wdGlvbi4KKyAgYm9vbCBpc01zU3RydWN0KGNvbnN0IEFTVENvbnRleHQgJkMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgV2hldGhlciB3ZSBhcmUgYWxsb3dlZCB0byBpbnNlcnQgZXh0cmEgcGFkZGluZyBiZXR3ZWVuIGZpZWxkcy4KKyAgLy8vIFRoZXNlIHBhZGRpbmcgYXJlIGFkZGVkIHRvIGhlbHAgQWRkcmVzc1Nhbml0aXplciBkZXRlY3QKKyAgLy8vIGludHJhLW9iamVjdC1vdmVyZmxvdyBidWdzLgorICBib29sIG1heUluc2VydEV4dHJhUGFkZGluZyhib29sIEVtaXRSZW1hcmsgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIEZpbmRzIHRoZSBmaXJzdCBkYXRhIG1lbWJlciB3aGljaCBoYXMgYSBuYW1lLgorICAvLy8gbnVsbHB0ciBpcyByZXR1cm5lZCBpZiBubyBuYW1lZCBkYXRhIG1lbWJlciBleGlzdHMuCisgIGNvbnN0IEZpZWxkRGVjbCAqZmluZEZpcnN0TmFtZWREYXRhTWVtYmVyKCkgY29uc3Q7ICAKKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBEZXNlcmlhbGl6ZSBqdXN0IHRoZSBmaWVsZHMuCisgIHZvaWQgTG9hZEZpZWxkc0Zyb21FeHRlcm5hbFN0b3JhZ2UoKSBjb25zdDsKK307CisKK2NsYXNzIEZpbGVTY29wZUFzbURlY2wgOiBwdWJsaWMgRGVjbCB7CisgIFN0cmluZ0xpdGVyYWwgKkFzbVN0cmluZzsKKyAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jOworCisgIEZpbGVTY29wZUFzbURlY2woRGVjbENvbnRleHQgKkRDLCBTdHJpbmdMaXRlcmFsICphc21zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMLCBTb3VyY2VMb2NhdGlvbiBFbmRMKQorICAgIDogRGVjbChGaWxlU2NvcGVBc20sIERDLCBTdGFydEwpLCBBc21TdHJpbmcoYXNtc3RyaW5nKSwgUlBhcmVuTG9jKEVuZEwpIHt9CisKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIHN0YXRpYyBGaWxlU2NvcGVBc21EZWNsICpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgKlN0ciwgU291cmNlTG9jYXRpb24gQXNtTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYyk7CisKKyAgc3RhdGljIEZpbGVTY29wZUFzbURlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisgIAorICBTb3VyY2VMb2NhdGlvbiBnZXRBc21Mb2MoKSBjb25zdCB7IHJldHVybiBnZXRMb2NhdGlvbigpOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldFJQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIFJQYXJlbkxvYzsgfQorICB2b2lkIHNldFJQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IFJQYXJlbkxvYyA9IEw7IH0KKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0QXNtTG9jKCksIGdldFJQYXJlbkxvYygpKTsKKyAgfQorCisgIGNvbnN0IFN0cmluZ0xpdGVyYWwgKmdldEFzbVN0cmluZygpIGNvbnN0IHsgcmV0dXJuIEFzbVN0cmluZzsgfQorICBTdHJpbmdMaXRlcmFsICpnZXRBc21TdHJpbmcoKSB7IHJldHVybiBBc21TdHJpbmc7IH0KKyAgdm9pZCBzZXRBc21TdHJpbmcoU3RyaW5nTGl0ZXJhbCAqQXNtKSB7IEFzbVN0cmluZyA9IEFzbTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gRmlsZVNjb3BlQXNtOyB9Cit9OworCisvLy8gUGVwcmVzZW50cyBhIGJsb2NrIGxpdGVyYWwgZGVjbGFyYXRpb24sIHdoaWNoIGlzIGxpa2UgYW4KKy8vLyB1bm5hbWVkIEZ1bmN0aW9uRGVjbC4gIEZvciBleGFtcGxlOgorLy8vIF57IHN0YXRlbWVudC1ib2R5IH0gICBvciAgIF4oaW50IGFyZzEsIGZsb2F0IGFyZzIpeyBzdGF0ZW1lbnQtYm9keSB9CitjbGFzcyBCbG9ja0RlY2wgOiBwdWJsaWMgRGVjbCwgcHVibGljIERlY2xDb250ZXh0IHsKK3B1YmxpYzoKKyAgLy8vIEEgY2xhc3Mgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIKKyAgLy8vIGNhcHR1cmVkIHZhbHVlLgorICBjbGFzcyBDYXB0dXJlIHsKKyAgICBlbnVtIHsKKyAgICAgIGZsYWdfaXNCeVJlZiA9IDB4MSwKKyAgICAgIGZsYWdfaXNOZXN0ZWQgPSAweDIKKyAgICB9OworCisgICAgLy8vIFRoZSB2YXJpYWJsZSBiZWluZyBjYXB0dXJlZC4KKyAgICBsbHZtOjpQb2ludGVySW50UGFpcjxWYXJEZWNsKiwgMj4gVmFyaWFibGVBbmRGbGFnczsKKworICAgIC8vLyBUaGUgY29weSBleHByZXNzaW9uLCBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBEZWNsUmVmIChvcgorICAgIC8vLyBCbG9ja0RlY2xSZWYpIHRvIHRoZSBjYXB0dXJlZCB2YXJpYWJsZS4gIE9ubHkgcmVxdWlyZWQgaWYgdGhlCisgICAgLy8vIHZhcmlhYmxlIGhhcyBhIEMrKyBjbGFzcyB0eXBlLgorICAgIEV4cHIgKkNvcHlFeHByOworCisgIHB1YmxpYzoKKyAgICBDYXB0dXJlKFZhckRlY2wgKnZhcmlhYmxlLCBib29sIGJ5UmVmLCBib29sIG5lc3RlZCwgRXhwciAqY29weSkKKyAgICAgIDogVmFyaWFibGVBbmRGbGFncyh2YXJpYWJsZSwKKyAgICAgICAgICAgICAgICAgIChieVJlZiA/IGZsYWdfaXNCeVJlZiA6IDApIHwgKG5lc3RlZCA/IGZsYWdfaXNOZXN0ZWQgOiAwKSksCisgICAgICAgIENvcHlFeHByKGNvcHkpIHt9CisKKyAgICAvLy8gVGhlIHZhcmlhYmxlIGJlaW5nIGNhcHR1cmVkLgorICAgIFZhckRlY2wgKmdldFZhcmlhYmxlKCkgY29uc3QgeyByZXR1cm4gVmFyaWFibGVBbmRGbGFncy5nZXRQb2ludGVyKCk7IH0KKworICAgIC8vLyBXaGV0aGVyIHRoaXMgaXMgYSAiYnkgcmVmIiBjYXB0dXJlLCBpLmUuIGEgY2FwdHVyZSBvZiBhIF9fYmxvY2sKKyAgICAvLy8gdmFyaWFibGUuCisgICAgYm9vbCBpc0J5UmVmKCkgY29uc3QgeyByZXR1cm4gVmFyaWFibGVBbmRGbGFncy5nZXRJbnQoKSAmIGZsYWdfaXNCeVJlZjsgfQorCisgICAgLy8vIFdoZXRoZXIgdGhpcyBpcyBhIG5lc3RlZCBjYXB0dXJlLCBpLmUuIHRoZSB2YXJpYWJsZSBjYXB0dXJlZAorICAgIC8vLyBpcyBub3QgZnJvbSBvdXRzaWRlIHRoZSBpbW1lZGlhdGVseSBlbmNsb3NpbmcgZnVuY3Rpb24vYmxvY2suCisgICAgYm9vbCBpc05lc3RlZCgpIGNvbnN0IHsgcmV0dXJuIFZhcmlhYmxlQW5kRmxhZ3MuZ2V0SW50KCkgJiBmbGFnX2lzTmVzdGVkOyB9CisKKyAgICBib29sIGhhc0NvcHlFeHByKCkgY29uc3QgeyByZXR1cm4gQ29weUV4cHIgIT0gbnVsbHB0cjsgfQorICAgIEV4cHIgKmdldENvcHlFeHByKCkgY29uc3QgeyByZXR1cm4gQ29weUV4cHI7IH0KKyAgICB2b2lkIHNldENvcHlFeHByKEV4cHIgKmUpIHsgQ29weUV4cHIgPSBlOyB9CisgIH07CisKK3ByaXZhdGU6CisgIC8vIEZJWE1FOiBUaGlzIGNhbiBiZSBwYWNrZWQgaW50byB0aGUgYml0ZmllbGRzIGluIERlY2wuCisgIGJvb2wgSXNWYXJpYWRpYyA6IDE7CisgIGJvb2wgQ2FwdHVyZXNDWFhUaGlzIDogMTsKKyAgYm9vbCBCbG9ja01pc3NpbmdSZXR1cm5UeXBlIDogMTsKKyAgYm9vbCBJc0NvbnZlcnNpb25Gcm9tTGFtYmRhIDogMTsKKworICAvLy8gQSBiaXQgdGhhdCBpbmRpY2F0ZXMgdGhpcyBibG9jayBpcyBwYXNzZWQgZGlyZWN0bHkgdG8gYSBmdW5jdGlvbiBhcyBhCisgIC8vLyBub24tZXNjYXBpbmcgcGFyYW1ldGVyLgorICBib29sIERvZXNOb3RFc2NhcGUgOiAxOworCisgIC8vLyBBIG5ld1tdJ2QgYXJyYXkgb2YgcG9pbnRlcnMgdG8gUGFybVZhckRlY2xzIGZvciB0aGUgZm9ybWFsCisgIC8vLyBwYXJhbWV0ZXJzIG9mIHRoaXMgZnVuY3Rpb24uICBUaGlzIGlzIG51bGwgaWYgYSBwcm90b3R5cGUgb3IgaWYgdGhlcmUgYXJlCisgIC8vLyBubyBmb3JtYWxzLgorICBQYXJtVmFyRGVjbCAqKlBhcmFtSW5mbyA9IG51bGxwdHI7CisgIHVuc2lnbmVkIE51bVBhcmFtcyA9IDA7CisKKyAgU3RtdCAqQm9keSA9IG51bGxwdHI7CisgIFR5cGVTb3VyY2VJbmZvICpTaWduYXR1cmVBc1dyaXR0ZW4gPSBudWxscHRyOworCisgIGNvbnN0IENhcHR1cmUgKkNhcHR1cmVzID0gbnVsbHB0cjsKKyAgdW5zaWduZWQgTnVtQ2FwdHVyZXMgPSAwOworCisgIHVuc2lnbmVkIE1hbmdsaW5nTnVtYmVyID0gMDsKKyAgRGVjbCAqTWFuZ2xpbmdDb250ZXh0RGVjbCA9IG51bGxwdHI7CisKK3Byb3RlY3RlZDoKKyAgQmxvY2tEZWNsKERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gQ2FyZXRMb2MpCisgICAgICA6IERlY2woQmxvY2ssIERDLCBDYXJldExvYyksIERlY2xDb250ZXh0KEJsb2NrKSwgSXNWYXJpYWRpYyhmYWxzZSksCisgICAgICAgIENhcHR1cmVzQ1hYVGhpcyhmYWxzZSksIEJsb2NrTWlzc2luZ1JldHVyblR5cGUodHJ1ZSksCisgICAgICAgIElzQ29udmVyc2lvbkZyb21MYW1iZGEoZmFsc2UpLCBEb2VzTm90RXNjYXBlKGZhbHNlKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBCbG9ja0RlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIEwpOyAKKyAgc3RhdGljIEJsb2NrRGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKKyAgCisgIFNvdXJjZUxvY2F0aW9uIGdldENhcmV0TG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBnZXRMb2NhdGlvbigpOyB9CisKKyAgYm9vbCBpc1ZhcmlhZGljKCkgY29uc3QgeyByZXR1cm4gSXNWYXJpYWRpYzsgfQorICB2b2lkIHNldElzVmFyaWFkaWMoYm9vbCB2YWx1ZSkgeyBJc1ZhcmlhZGljID0gdmFsdWU7IH0KKworICBDb21wb3VuZFN0bXQgKmdldENvbXBvdW5kQm9keSgpIGNvbnN0IHsgcmV0dXJuIChDb21wb3VuZFN0bXQqKSBCb2R5OyB9CisgIFN0bXQgKmdldEJvZHkoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAoU3RtdCopIEJvZHk7IH0KKyAgdm9pZCBzZXRCb2R5KENvbXBvdW5kU3RtdCAqQikgeyBCb2R5ID0gKFN0bXQqKSBCOyB9CisKKyAgdm9pZCBzZXRTaWduYXR1cmVBc1dyaXR0ZW4oVHlwZVNvdXJjZUluZm8gKlNpZykgeyBTaWduYXR1cmVBc1dyaXR0ZW4gPSBTaWc7IH0KKyAgVHlwZVNvdXJjZUluZm8gKmdldFNpZ25hdHVyZUFzV3JpdHRlbigpIGNvbnN0IHsgcmV0dXJuIFNpZ25hdHVyZUFzV3JpdHRlbjsgfQorCisgIC8vIEFycmF5UmVmIGFjY2VzcyB0byBmb3JtYWwgcGFyYW1ldGVycy4KKyAgQXJyYXlSZWY8UGFybVZhckRlY2wgKj4gcGFyYW1ldGVycygpIGNvbnN0IHsKKyAgICByZXR1cm4ge1BhcmFtSW5mbywgZ2V0TnVtUGFyYW1zKCl9OworICB9CisgIE11dGFibGVBcnJheVJlZjxQYXJtVmFyRGVjbCAqPiBwYXJhbWV0ZXJzKCkgeworICAgIHJldHVybiB7UGFyYW1JbmZvLCBnZXROdW1QYXJhbXMoKX07CisgIH0KKworICAvLyBJdGVyYXRvciBhY2Nlc3MgdG8gZm9ybWFsIHBhcmFtZXRlcnMuCisgIHVzaW5nIHBhcmFtX2l0ZXJhdG9yID0gTXV0YWJsZUFycmF5UmVmPFBhcm1WYXJEZWNsICo+OjppdGVyYXRvcjsKKyAgdXNpbmcgcGFyYW1fY29uc3RfaXRlcmF0b3IgPSBBcnJheVJlZjxQYXJtVmFyRGVjbCAqPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgYm9vbCBwYXJhbV9lbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHBhcmFtZXRlcnMoKS5lbXB0eSgpOyB9CisgIHBhcmFtX2l0ZXJhdG9yIHBhcmFtX2JlZ2luKCkgeyByZXR1cm4gcGFyYW1ldGVycygpLmJlZ2luKCk7IH0KKyAgcGFyYW1faXRlcmF0b3IgcGFyYW1fZW5kKCkgeyByZXR1cm4gcGFyYW1ldGVycygpLmVuZCgpOyB9CisgIHBhcmFtX2NvbnN0X2l0ZXJhdG9yIHBhcmFtX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gcGFyYW1ldGVycygpLmJlZ2luKCk7IH0KKyAgcGFyYW1fY29uc3RfaXRlcmF0b3IgcGFyYW1fZW5kKCkgY29uc3QgeyByZXR1cm4gcGFyYW1ldGVycygpLmVuZCgpOyB9CisgIHNpemVfdCBwYXJhbV9zaXplKCkgY29uc3QgeyByZXR1cm4gcGFyYW1ldGVycygpLnNpemUoKTsgfQorCisgIHVuc2lnbmVkIGdldE51bVBhcmFtcygpIGNvbnN0IHsgcmV0dXJuIE51bVBhcmFtczsgfQorCisgIGNvbnN0IFBhcm1WYXJEZWNsICpnZXRQYXJhbURlY2wodW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgZ2V0TnVtUGFyYW1zKCkgJiYgIklsbGVnYWwgcGFyYW0gIyIpOworICAgIHJldHVybiBQYXJhbUluZm9baV07CisgIH0KKyAgUGFybVZhckRlY2wgKmdldFBhcmFtRGVjbCh1bnNpZ25lZCBpKSB7CisgICAgYXNzZXJ0KGkgPCBnZXROdW1QYXJhbXMoKSAmJiAiSWxsZWdhbCBwYXJhbSAjIik7CisgICAgcmV0dXJuIFBhcmFtSW5mb1tpXTsKKyAgfQorCisgIHZvaWQgc2V0UGFyYW1zKEFycmF5UmVmPFBhcm1WYXJEZWNsICo+IE5ld1BhcmFtSW5mbyk7CisKKyAgLy8vIFRydWUgaWYgdGhpcyBibG9jayAob3IgaXRzIG5lc3RlZCBibG9ja3MpIGNhcHR1cmVzCisgIC8vLyBhbnl0aGluZyBvZiBsb2NhbCBzdG9yYWdlIGZyb20gaXRzIGVuY2xvc2luZyBzY29wZXMuCisgIGJvb2wgaGFzQ2FwdHVyZXMoKSBjb25zdCB7IHJldHVybiBOdW1DYXB0dXJlcyAhPSAwIHx8IENhcHR1cmVzQ1hYVGhpczsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2FwdHVyZWQgdmFyaWFibGVzLgorICAvLy8gRG9lcyBub3QgaW5jbHVkZSBhbiBlbnRyeSBmb3IgJ3RoaXMnLgorICB1bnNpZ25lZCBnZXROdW1DYXB0dXJlcygpIGNvbnN0IHsgcmV0dXJuIE51bUNhcHR1cmVzOyB9CisKKyAgdXNpbmcgY2FwdHVyZV9jb25zdF9pdGVyYXRvciA9IEFycmF5UmVmPENhcHR1cmU+Ojpjb25zdF9pdGVyYXRvcjsKKworICBBcnJheVJlZjxDYXB0dXJlPiBjYXB0dXJlcygpIGNvbnN0IHsgcmV0dXJuIHtDYXB0dXJlcywgTnVtQ2FwdHVyZXN9OyB9CisKKyAgY2FwdHVyZV9jb25zdF9pdGVyYXRvciBjYXB0dXJlX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gY2FwdHVyZXMoKS5iZWdpbigpOyB9CisgIGNhcHR1cmVfY29uc3RfaXRlcmF0b3IgY2FwdHVyZV9lbmQoKSBjb25zdCB7IHJldHVybiBjYXB0dXJlcygpLmVuZCgpOyB9CisKKyAgYm9vbCBjYXB0dXJlc0NYWFRoaXMoKSBjb25zdCB7IHJldHVybiBDYXB0dXJlc0NYWFRoaXM7IH0KKyAgYm9vbCBibG9ja01pc3NpbmdSZXR1cm5UeXBlKCkgY29uc3QgeyByZXR1cm4gQmxvY2tNaXNzaW5nUmV0dXJuVHlwZTsgfQorICB2b2lkIHNldEJsb2NrTWlzc2luZ1JldHVyblR5cGUoYm9vbCB2YWwpIHsgQmxvY2tNaXNzaW5nUmV0dXJuVHlwZSA9IHZhbDsgfQorCisgIGJvb2wgaXNDb252ZXJzaW9uRnJvbUxhbWJkYSgpIGNvbnN0IHsgcmV0dXJuIElzQ29udmVyc2lvbkZyb21MYW1iZGE7IH0KKyAgdm9pZCBzZXRJc0NvbnZlcnNpb25Gcm9tTGFtYmRhKGJvb2wgdmFsKSB7IElzQ29udmVyc2lvbkZyb21MYW1iZGEgPSB2YWw7IH0KKworICBib29sIGRvZXNOb3RFc2NhcGUoKSBjb25zdCB7IHJldHVybiBEb2VzTm90RXNjYXBlOyB9CisgIHZvaWQgc2V0RG9lc05vdEVzY2FwZSgpIHsgRG9lc05vdEVzY2FwZSA9IHRydWU7IH0KKworICBib29sIGNhcHR1cmVzVmFyaWFibGUoY29uc3QgVmFyRGVjbCAqdmFyKSBjb25zdDsKKworICB2b2lkIHNldENhcHR1cmVzKEFTVENvbnRleHQgJkNvbnRleHQsIEFycmF5UmVmPENhcHR1cmU+IENhcHR1cmVzLAorICAgICAgICAgICAgICAgICAgIGJvb2wgQ2FwdHVyZXNDWFhUaGlzKTsKKworICAgdW5zaWduZWQgZ2V0QmxvY2tNYW5nbGluZ051bWJlcigpIGNvbnN0IHsKKyAgICAgcmV0dXJuIE1hbmdsaW5nTnVtYmVyOworICAgfQorCisgICBEZWNsICpnZXRCbG9ja01hbmdsaW5nQ29udGV4dERlY2woKSBjb25zdCB7CisgICAgIHJldHVybiBNYW5nbGluZ0NvbnRleHREZWNsOyAgICAKKyAgIH0KKworICB2b2lkIHNldEJsb2NrTWFuZ2xpbmcodW5zaWduZWQgTnVtYmVyLCBEZWNsICpDdHgpIHsKKyAgICBNYW5nbGluZ051bWJlciA9IE51bWJlcjsKKyAgICBNYW5nbGluZ0NvbnRleHREZWNsID0gQ3R4OworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZOworCisgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBCbG9jazsgfQorICBzdGF0aWMgRGVjbENvbnRleHQgKmNhc3RUb0RlY2xDb250ZXh0KGNvbnN0IEJsb2NrRGVjbCAqRCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZWNsQ29udGV4dCAqPihjb25zdF9jYXN0PEJsb2NrRGVjbCo+KEQpKTsKKyAgfQorICBzdGF0aWMgQmxvY2tEZWNsICpjYXN0RnJvbURlY2xDb250ZXh0KGNvbnN0IERlY2xDb250ZXh0ICpEQykgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxCbG9ja0RlY2wgKj4oY29uc3RfY2FzdDxEZWNsQ29udGV4dCo+KERDKSk7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIHRoZSBib2R5IG9mIGEgQ2FwdHVyZWRTdG10LCBhbmQgc2VydmVzIGFzIGl0cyBEZWNsQ29udGV4dC4KK2NsYXNzIENhcHR1cmVkRGVjbCBmaW5hbAorICAgIDogcHVibGljIERlY2wsCisgICAgICBwdWJsaWMgRGVjbENvbnRleHQsCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxDYXB0dXJlZERlY2wsIEltcGxpY2l0UGFyYW1EZWNsICo+IHsKK3Byb3RlY3RlZDoKKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPEltcGxpY2l0UGFyYW1EZWNsPikgeworICAgIHJldHVybiBOdW1QYXJhbXM7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgdG8gdGhlIG91dGxpbmVkIGZ1bmN0aW9uLgorICB1bnNpZ25lZCBOdW1QYXJhbXM7CisKKyAgLy8vIFxicmllZiBUaGUgcG9zaXRpb24gb2YgY29udGV4dCBwYXJhbWV0ZXIgaW4gbGlzdCBvZiBwYXJhbWV0ZXJzLgorICB1bnNpZ25lZCBDb250ZXh0UGFyYW07CisKKyAgLy8vIFxicmllZiBUaGUgYm9keSBvZiB0aGUgb3V0bGluZWQgZnVuY3Rpb24uCisgIGxsdm06OlBvaW50ZXJJbnRQYWlyPFN0bXQgKiwgMSwgYm9vbD4gQm9keUFuZE5vdGhyb3c7CisKKyAgZXhwbGljaXQgQ2FwdHVyZWREZWNsKERlY2xDb250ZXh0ICpEQywgdW5zaWduZWQgTnVtUGFyYW1zKTsKKworICBJbXBsaWNpdFBhcmFtRGVjbCAqY29uc3QgKmdldFBhcmFtcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPEltcGxpY2l0UGFyYW1EZWNsICo+KCk7CisgIH0KKworICBJbXBsaWNpdFBhcmFtRGVjbCAqKmdldFBhcmFtcygpIHsKKyAgICByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPEltcGxpY2l0UGFyYW1EZWNsICo+KCk7CisgIH0KKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgc3RhdGljIENhcHR1cmVkRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVBhcmFtcyk7CisgIHN0YXRpYyBDYXB0dXJlZERlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVBhcmFtcyk7CisKKyAgU3RtdCAqZ2V0Qm9keSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIHNldEJvZHkoU3RtdCAqQik7CisKKyAgYm9vbCBpc05vdGhyb3coKSBjb25zdDsKKyAgdm9pZCBzZXROb3Rocm93KGJvb2wgTm90aHJvdyA9IHRydWUpOworCisgIHVuc2lnbmVkIGdldE51bVBhcmFtcygpIGNvbnN0IHsgcmV0dXJuIE51bVBhcmFtczsgfQorCisgIEltcGxpY2l0UGFyYW1EZWNsICpnZXRQYXJhbSh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBOdW1QYXJhbXMpOworICAgIHJldHVybiBnZXRQYXJhbXMoKVtpXTsKKyAgfQorICB2b2lkIHNldFBhcmFtKHVuc2lnbmVkIGksIEltcGxpY2l0UGFyYW1EZWNsICpQKSB7CisgICAgYXNzZXJ0KGkgPCBOdW1QYXJhbXMpOworICAgIGdldFBhcmFtcygpW2ldID0gUDsKKyAgfQorCisgIC8vIEFycmF5UmVmIGludGVyZmFjZSB0byBwYXJhbWV0ZXJzLgorICBBcnJheVJlZjxJbXBsaWNpdFBhcmFtRGVjbCAqPiBwYXJhbWV0ZXJzKCkgY29uc3QgeworICAgIHJldHVybiB7Z2V0UGFyYW1zKCksIGdldE51bVBhcmFtcygpfTsKKyAgfQorICBNdXRhYmxlQXJyYXlSZWY8SW1wbGljaXRQYXJhbURlY2wgKj4gcGFyYW1ldGVycygpIHsKKyAgICByZXR1cm4ge2dldFBhcmFtcygpLCBnZXROdW1QYXJhbXMoKX07CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBwYXJhbWV0ZXIgY29udGFpbmluZyBjYXB0dXJlZCB2YXJpYWJsZXMuCisgIEltcGxpY2l0UGFyYW1EZWNsICpnZXRDb250ZXh0UGFyYW0oKSBjb25zdCB7CisgICAgYXNzZXJ0KENvbnRleHRQYXJhbSA8IE51bVBhcmFtcyk7CisgICAgcmV0dXJuIGdldFBhcmFtKENvbnRleHRQYXJhbSk7CisgIH0KKyAgdm9pZCBzZXRDb250ZXh0UGFyYW0odW5zaWduZWQgaSwgSW1wbGljaXRQYXJhbURlY2wgKlApIHsKKyAgICBhc3NlcnQoaSA8IE51bVBhcmFtcyk7CisgICAgQ29udGV4dFBhcmFtID0gaTsKKyAgICBzZXRQYXJhbShpLCBQKTsKKyAgfQorICB1bnNpZ25lZCBnZXRDb250ZXh0UGFyYW1Qb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIENvbnRleHRQYXJhbTsgfQorCisgIHVzaW5nIHBhcmFtX2l0ZXJhdG9yID0gSW1wbGljaXRQYXJhbURlY2wgKmNvbnN0ICo7CisgIHVzaW5nIHBhcmFtX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8cGFyYW1faXRlcmF0b3I+OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IHBhcmFtZXRlciBkZWNsLgorICBwYXJhbV9pdGVyYXRvciBwYXJhbV9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGdldFBhcmFtcygpOyB9CisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYW4gaXRlcmF0b3Igb25lIHBhc3QgdGhlIGxhc3QgcGFyYW1ldGVyIGRlY2wuCisgIHBhcmFtX2l0ZXJhdG9yIHBhcmFtX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGdldFBhcmFtcygpICsgTnVtUGFyYW1zOyB9CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IENhcHR1cmVkOyB9CisgIHN0YXRpYyBEZWNsQ29udGV4dCAqY2FzdFRvRGVjbENvbnRleHQoY29uc3QgQ2FwdHVyZWREZWNsICpEKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PERlY2xDb250ZXh0ICo+KGNvbnN0X2Nhc3Q8Q2FwdHVyZWREZWNsICo+KEQpKTsKKyAgfQorICBzdGF0aWMgQ2FwdHVyZWREZWNsICpjYXN0RnJvbURlY2xDb250ZXh0KGNvbnN0IERlY2xDb250ZXh0ICpEQykgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDYXB0dXJlZERlY2wgKj4oY29uc3RfY2FzdDxEZWNsQ29udGV4dCAqPihEQykpOworICB9Cit9OworCisvLy8gXGJyaWVmIERlc2NyaWJlcyBhIG1vZHVsZSBpbXBvcnQgZGVjbGFyYXRpb24sIHdoaWNoIG1ha2VzIHRoZSBjb250ZW50cworLy8vIG9mIHRoZSBuYW1lZCBtb2R1bGUgdmlzaWJsZSBpbiB0aGUgY3VycmVudCB0cmFuc2xhdGlvbiB1bml0LgorLy8vCisvLy8gQW4gaW1wb3J0IGRlY2xhcmF0aW9uIGltcG9ydHMgdGhlIG5hbWVkIG1vZHVsZSAob3Igc3VibW9kdWxlKS4gRm9yIGV4YW1wbGU6CisvLy8gXGNvZGUKKy8vLyAgIEBpbXBvcnQgc3RkLnZlY3RvcjsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gSW1wb3J0IGRlY2xhcmF0aW9ucyBjYW4gYWxzbyBiZSBpbXBsaWNpdGx5IGdlbmVyYXRlZCBmcm9tCisvLy8gXCNpbmNsdWRlL1wjaW1wb3J0IGRpcmVjdGl2ZXMuCitjbGFzcyBJbXBvcnREZWNsIGZpbmFsIDogcHVibGljIERlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VHJhaWxpbmdPYmplY3RzPEltcG9ydERlY2wsIFNvdXJjZUxvY2F0aW9uPiB7CisgIGZyaWVuZCBjbGFzcyBBU1RDb250ZXh0OworICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVFJlYWRlcjsKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKworICAvLy8gXGJyaWVmIFRoZSBpbXBvcnRlZCBtb2R1bGUsIGFsb25nIHdpdGggYSBiaXQgdGhhdCBpbmRpY2F0ZXMgd2hldGhlcgorICAvLy8gd2UgaGF2ZSBzb3VyY2UtbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIGVhY2ggaWRlbnRpZmllciBpbiB0aGUgbW9kdWxlCisgIC8vLyBuYW1lLiAKKyAgLy8vCisgIC8vLyBXaGVuIHRoZSBiaXQgaXMgZmFsc2UsIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBzb3VyY2UgbG9jYXRpb24gZm9yIHRoZQorICAvLy8gZW5kIG9mIHRoZSBpbXBvcnQgZGVjbGFyYXRpb24uCisgIGxsdm06OlBvaW50ZXJJbnRQYWlyPE1vZHVsZSAqLCAxLCBib29sPiBJbXBvcnRlZEFuZENvbXBsZXRlOworICAKKyAgLy8vIFxicmllZiBUaGUgbmV4dCBpbXBvcnQgaW4gdGhlIGxpc3Qgb2YgaW1wb3J0cyBsb2NhbCB0byB0aGUgdHJhbnNsYXRpb24KKyAgLy8vIHVuaXQgYmVpbmcgcGFyc2VkIChub3QgbG9hZGVkIGZyb20gYW4gQVNUIGZpbGUpLgorICBJbXBvcnREZWNsICpOZXh0TG9jYWxJbXBvcnQgPSBudWxscHRyOworICAKKyAgSW1wb3J0RGVjbChEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBNb2R1bGUgKkltcG9ydGVkLAorICAgICAgICAgICAgIEFycmF5UmVmPFNvdXJjZUxvY2F0aW9uPiBJZGVudGlmaWVyTG9jcyk7CisKKyAgSW1wb3J0RGVjbChEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBNb2R1bGUgKkltcG9ydGVkLAorICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisKKyAgSW1wb3J0RGVjbChFbXB0eVNoZWxsIEVtcHR5KSA6IERlY2woSW1wb3J0LCBFbXB0eSkge30KKyAgCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbmV3IG1vZHVsZSBpbXBvcnQgZGVjbGFyYXRpb24uCisgIHN0YXRpYyBJbXBvcnREZWNsICpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgTW9kdWxlICpJbXBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTb3VyY2VMb2NhdGlvbj4gSWRlbnRpZmllckxvY3MpOworICAKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBuZXcgbW9kdWxlIGltcG9ydCBkZWNsYXJhdGlvbiBmb3IgYW4gaW1wbGljaXRseS1nZW5lcmF0ZWQKKyAgLy8vIGltcG9ydC4KKyAgc3RhdGljIEltcG9ydERlY2wgKkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgTW9kdWxlICpJbXBvcnRlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBuZXcsIGRlc2VyaWFsaXplZCBtb2R1bGUgaW1wb3J0IGRlY2xhcmF0aW9uLgorICBzdGF0aWMgSW1wb3J0RGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1Mb2NhdGlvbnMpOworICAKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbW9kdWxlIHRoYXQgd2FzIGltcG9ydGVkIGJ5IHRoZSBpbXBvcnQgZGVjbGFyYXRpb24uCisgIE1vZHVsZSAqZ2V0SW1wb3J0ZWRNb2R1bGUoKSBjb25zdCB7IHJldHVybiBJbXBvcnRlZEFuZENvbXBsZXRlLmdldFBvaW50ZXIoKTsgfQorICAKKyAgLy8vIFxicmllZiBSZXRyaWV2ZXMgdGhlIGxvY2F0aW9ucyBvZiBlYWNoIG9mIHRoZSBpZGVudGlmaWVycyB0aGF0IG1ha2UgdXAKKyAgLy8vIHRoZSBjb21wbGV0ZSBtb2R1bGUgbmFtZSBpbiB0aGUgaW1wb3J0IGRlY2xhcmF0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgd2lsbCByZXR1cm4gYW4gZW1wdHkgYXJyYXkgaWYgdGhlIGxvY2F0aW9ucyBvZiB0aGUgaW5kaXZpZHVhbAorICAvLy8gaWRlbnRpZmllcnMgYXJlbid0IGF2YWlsYWJsZS4KKyAgQXJyYXlSZWY8U291cmNlTG9jYXRpb24+IGdldElkZW50aWZpZXJMb2NzKCkgY29uc3Q7CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gSW1wb3J0OyB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBDKysgTW9kdWxlcyBUUyBtb2R1bGUgZXhwb3J0IGRlY2xhcmF0aW9uLgorLy8vCisvLy8gRm9yIGV4YW1wbGU6CisvLy8gXGNvZGUKKy8vLyAgIGV4cG9ydCB2b2lkIGZvbygpOworLy8vIFxlbmRjb2RlCitjbGFzcyBFeHBvcnREZWNsIGZpbmFsIDogcHVibGljIERlY2wsIHB1YmxpYyBEZWNsQ29udGV4dCB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisKKyAgLy8vIFxicmllZiBUaGUgc291cmNlIGxvY2F0aW9uIGZvciB0aGUgcmlnaHQgYnJhY2UgKGlmIHZhbGlkKS4KKyAgU291cmNlTG9jYXRpb24gUkJyYWNlTG9jOworCisgIEV4cG9ydERlY2woRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBFeHBvcnRMb2MpCisgICAgICA6IERlY2woRXhwb3J0LCBEQywgRXhwb3J0TG9jKSwgRGVjbENvbnRleHQoRXhwb3J0KSwKKyAgICAgICAgUkJyYWNlTG9jKFNvdXJjZUxvY2F0aW9uKCkpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIEV4cG9ydERlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRXhwb3J0TG9jKTsKKyAgc3RhdGljIEV4cG9ydERlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisgIAorICBTb3VyY2VMb2NhdGlvbiBnZXRFeHBvcnRMb2MoKSBjb25zdCB7IHJldHVybiBnZXRMb2NhdGlvbigpOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldFJCcmFjZUxvYygpIGNvbnN0IHsgcmV0dXJuIFJCcmFjZUxvYzsgfQorICB2b2lkIHNldFJCcmFjZUxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IFJCcmFjZUxvYyA9IEw7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICBpZiAoUkJyYWNlTG9jLmlzVmFsaWQoKSkKKyAgICAgIHJldHVybiBSQnJhY2VMb2M7CisgICAgLy8gTm8gYnJhY2VzOiBnZXQgdGhlIGVuZCBsb2NhdGlvbiBvZiB0aGUgKG9ubHkpIGRlY2xhcmF0aW9uIGluIGNvbnRleHQKKyAgICAvLyAoaWYgcHJlc2VudCkuCisgICAgcmV0dXJuIGRlY2xzX2VtcHR5KCkgPyBnZXRMb2NhdGlvbigpIDogZGVjbHNfYmVnaW4oKS0+Z2V0TG9jRW5kKCk7CisgIH0KKworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRMb2NhdGlvbigpLCBnZXRMb2NFbmQoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IEV4cG9ydDsgfQorICBzdGF0aWMgRGVjbENvbnRleHQgKmNhc3RUb0RlY2xDb250ZXh0KGNvbnN0IEV4cG9ydERlY2wgKkQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVjbENvbnRleHQgKj4oY29uc3RfY2FzdDxFeHBvcnREZWNsKj4oRCkpOworICB9CisgIHN0YXRpYyBFeHBvcnREZWNsICpjYXN0RnJvbURlY2xDb250ZXh0KGNvbnN0IERlY2xDb250ZXh0ICpEQykgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxFeHBvcnREZWNsICo+KGNvbnN0X2Nhc3Q8RGVjbENvbnRleHQqPihEQykpOworICB9Cit9OworCisvLy8gUmVwcmVzZW50cyBhbiBlbXB0eS1kZWNsYXJhdGlvbi4KK2NsYXNzIEVtcHR5RGVjbCA6IHB1YmxpYyBEZWNsIHsKKyAgRW1wdHlEZWNsKERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gTCkgOiBEZWNsKEVtcHR5LCBEQywgTCkge30KKworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3B1YmxpYzoKKyAgc3RhdGljIEVtcHR5RGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEwpOworICBzdGF0aWMgRW1wdHlEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gRW1wdHk7IH0KK307CisKKy8vLyBJbnNlcnRpb24gb3BlcmF0b3IgZm9yIGRpYWdub3N0aWNzLiAgVGhpcyBhbGxvd3Mgc2VuZGluZyBOYW1lZERlY2wncworLy8vIGludG8gYSBkaWFnbm9zdGljIHdpdGggPDwuCitpbmxpbmUgY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJm9wZXJhdG9yPDwoY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJkRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWVkRGVjbCogTkQpIHsKKyAgREIuQWRkVGFnZ2VkVmFsKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KE5EKSwKKyAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpha19uYW1lZGRlY2wpOworICByZXR1cm4gREI7Cit9CitpbmxpbmUgY29uc3QgUGFydGlhbERpYWdub3N0aWMgJm9wZXJhdG9yPDwoY29uc3QgUGFydGlhbERpYWdub3N0aWMgJlBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWVkRGVjbCogTkQpIHsKKyAgUEQuQWRkVGFnZ2VkVmFsKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KE5EKSwKKyAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpha19uYW1lZGRlY2wpOworICByZXR1cm4gUEQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIGRlY2xfdHlwZT4KK3ZvaWQgUmVkZWNsYXJhYmxlPGRlY2xfdHlwZT46OnNldFByZXZpb3VzRGVjbChkZWNsX3R5cGUgKlByZXZEZWNsKSB7CisgIC8vIE5vdGU6IFRoaXMgcm91dGluZSBpcyBpbXBsZW1lbnRlZCBoZXJlIGJlY2F1c2Ugd2UgbmVlZCBib3RoIE5hbWVkRGVjbAorICAvLyBhbmQgUmVkZWNsYXJhYmxlIHRvIGJlIGRlZmluZWQuCisgIGFzc2VydChSZWRlY2xMaW5rLk5leHRJc0xhdGVzdCgpICYmCisgICAgICAgICAic2V0UHJldmlvdXNEZWNsIG9uIGEgZGVjbCBhbHJlYWR5IGluIGEgcmVkZWNsYXJhdGlvbiBjaGFpbiIpOworCisgIGlmIChQcmV2RGVjbCkgeworICAgIC8vIFBvaW50IHRvIHByZXZpb3VzLiBNYWtlIHN1cmUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IHRoZSBtb3N0IHJlY2VudAorICAgIC8vIHJlZGVjbGFyYXRpb24sIG9yIHdlIGNhbiBidWlsZCBpbnZhbGlkIGNoYWlucy4gSWYgdGhlIG1vc3QgcmVjZW50CisgICAgLy8gcmVkZWNsYXJhdGlvbiBpcyBpbnZhbGlkLCBpdCB3b24ndCBiZSBQcmV2RGVjbCwgYnV0IHdlIHdhbnQgaXQgYW55d2F5LgorICAgIEZpcnN0ID0gUHJldkRlY2wtPmdldEZpcnN0RGVjbCgpOworICAgIGFzc2VydChGaXJzdC0+UmVkZWNsTGluay5OZXh0SXNMYXRlc3QoKSAmJiAiRXhwZWN0ZWQgZmlyc3QiKTsKKyAgICBkZWNsX3R5cGUgKk1vc3RSZWNlbnQgPSBGaXJzdC0+Z2V0TmV4dFJlZGVjbGFyYXRpb24oKTsKKyAgICBSZWRlY2xMaW5rID0gUHJldmlvdXNEZWNsTGluayhjYXN0PGRlY2xfdHlwZT4oTW9zdFJlY2VudCkpOworCisgICAgLy8gSWYgdGhlIGRlY2xhcmF0aW9uIHdhcyBwcmV2aW91c2x5IHZpc2libGUsIGEgcmVkZWNsYXJhdGlvbiBvZiBpdCByZW1haW5zCisgICAgLy8gdmlzaWJsZSBldmVuIGlmIGl0IHdvdWxkbid0IGJlIHZpc2libGUgYnkgaXRzZWxmLgorICAgIHN0YXRpY19jYXN0PGRlY2xfdHlwZSo+KHRoaXMpLT5JZGVudGlmaWVyTmFtZXNwYWNlIHw9CisgICAgICBNb3N0UmVjZW50LT5nZXRJZGVudGlmaWVyTmFtZXNwYWNlKCkgJgorICAgICAgKERlY2w6OklETlNfT3JkaW5hcnkgfCBEZWNsOjpJRE5TX1RhZyB8IERlY2w6OklETlNfVHlwZSk7CisgIH0gZWxzZSB7CisgICAgLy8gTWFrZSB0aGlzIGZpcnN0LgorICAgIEZpcnN0ID0gc3RhdGljX2Nhc3Q8ZGVjbF90eXBlKj4odGhpcyk7CisgIH0KKworICAvLyBGaXJzdCBvbmUgd2lsbCBwb2ludCB0byB0aGlzIG9uZSBhcyBsYXRlc3QuCisgIEZpcnN0LT5SZWRlY2xMaW5rLnNldExhdGVzdChzdGF0aWNfY2FzdDxkZWNsX3R5cGUqPih0aGlzKSk7CisKKyAgYXNzZXJ0KCFpc2E8TmFtZWREZWNsPihzdGF0aWNfY2FzdDxkZWNsX3R5cGUqPih0aGlzKSkgfHwKKyAgICAgICAgIGNhc3Q8TmFtZWREZWNsPihzdGF0aWNfY2FzdDxkZWNsX3R5cGUqPih0aGlzKSktPmlzTGlua2FnZVZhbGlkKCkpOworfQorCisvLyBJbmxpbmUgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCisKKy8vLyBDaGVjayBpZiB0aGUgZ2l2ZW4gZGVjbCBpcyBjb21wbGV0ZS4KKy8vLworLy8vIFdlIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGJyZWFrIGEgY3ljbGUgYmV0d2VlbiB0aGUgaW5saW5lIGRlZmluaXRpb25zIGluCisvLy8gVHlwZS5oIGFuZCBEZWNsLmguCitpbmxpbmUgYm9vbCBJc0VudW1EZWNsQ29tcGxldGUoRW51bURlY2wgKkVEKSB7CisgIHJldHVybiBFRC0+aXNDb21wbGV0ZSgpOworfQorCisvLy8gQ2hlY2sgaWYgdGhlIGdpdmVuIGRlY2wgaXMgc2NvcGVkLgorLy8vCisvLy8gV2UgdXNlIHRoaXMgZnVuY3Rpb24gdG8gYnJlYWsgYSBjeWNsZSBiZXR3ZWVuIHRoZSBpbmxpbmUgZGVmaW5pdGlvbnMgaW4KKy8vLyBUeXBlLmggYW5kIERlY2wuaC4KK2lubGluZSBib29sIElzRW51bURlY2xTY29wZWQoRW51bURlY2wgKkVEKSB7CisgIHJldHVybiBFRC0+aXNTY29wZWQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUX0RFQ0xfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xBY2Nlc3NQYWlyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbEFjY2Vzc1BhaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzUwNTZjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xBY2Nlc3NQYWlyLmgKQEAgLTAsMCArMSw3MiBAQAorLy89PT0tLS0gRGVjbEFjY2Vzc1BhaXIuaCAtIEEgZGVjbCBidW5kbGVkIHdpdGggaXRzIHBhdGggYWNjZXNzIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIERlY2xBY2Nlc3NQYWlyIGNsYXNzLCB3aGljaCBwcm92aWRlcyBhbgorLy8gIGVmZmljaWVudCByZXByZXNlbnRhdGlvbiBvZiBhIHBhaXIgb2YgYSBOYW1lZERlY2wqIGFuZCBhbgorLy8gIEFjY2Vzc1NwZWNpZmllci4gIEdlbmVyYWxseSB0aGUgYWNjZXNzIHNwZWNpZmllciBnaXZlcyB0aGUKKy8vICBuYXR1cmFsIGFjY2VzcyBvZiBhIGRlY2xhcmF0aW9uIHdoZW4gbmFtZWQgaW4gYSBjbGFzcywgYXMKKy8vICBkZWZpbmVkIGluIEMrKyBbY2xhc3MuYWNjZXNzLmJhc2VdcDEuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9ERUNMQUNDRVNTUEFJUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX0RFQ0xBQ0NFU1NQQUlSX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NwZWNpZmllcnMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIE5hbWVkRGVjbDsKKworLy8vIEEgUE9EIGNsYXNzIGZvciBwYWlyaW5nIGEgTmFtZWREZWNsKiB3aXRoIGFuIGFjY2VzcyBzcGVjaWZpZXIuCisvLy8gQ2FuIGJlIHB1dCBpbnRvIHVuaW9ucy4KK2NsYXNzIERlY2xBY2Nlc3NQYWlyIHsKKyAgdWludHB0cl90IFB0cjsgLy8gd2UnZCB1c2UgbGx2bTo6UG9pbnRlclVuaW9uLCBidXQgaXQgaXNuJ3QgdHJpdmlhbAorCisgIGVudW0geyBNYXNrID0gMHgzIH07CisKK3B1YmxpYzoKKyAgc3RhdGljIERlY2xBY2Nlc3NQYWlyIG1ha2UoTmFtZWREZWNsICpELCBBY2Nlc3NTcGVjaWZpZXIgQVMpIHsKKyAgICBEZWNsQWNjZXNzUGFpciBwOworICAgIHAuc2V0KEQsIEFTKTsKKyAgICByZXR1cm4gcDsKKyAgfQorCisgIE5hbWVkRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxOYW1lZERlY2wqPih+TWFzayAmIFB0cik7CisgIH0KKyAgQWNjZXNzU3BlY2lmaWVyIGdldEFjY2VzcygpIGNvbnN0IHsKKyAgICByZXR1cm4gQWNjZXNzU3BlY2lmaWVyKE1hc2sgJiBQdHIpOworICB9CisKKyAgdm9pZCBzZXREZWNsKE5hbWVkRGVjbCAqRCkgeworICAgIHNldChELCBnZXRBY2Nlc3MoKSk7CisgIH0KKyAgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzU3BlY2lmaWVyIEFTKSB7CisgICAgc2V0KGdldERlY2woKSwgQVMpOworICB9CisgIHZvaWQgc2V0KE5hbWVkRGVjbCAqRCwgQWNjZXNzU3BlY2lmaWVyIEFTKSB7CisgICAgUHRyID0gdWludHB0cl90KEFTKSB8IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihEKTsKKyAgfQorCisgIG9wZXJhdG9yIE5hbWVkRGVjbCooKSBjb25zdCB7IHJldHVybiBnZXREZWNsKCk7IH0KKyAgTmFtZWREZWNsICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gZ2V0RGVjbCgpOyB9Cit9OworfQorCisvLyBUYWtlIGEgbW9tZW50IHRvIHRlbGwgU21hbGxWZWN0b3IgdGhhdCBEZWNsQWNjZXNzUGFpciBpcyBQT0QuCituYW1lc3BhY2UgbGx2bSB7Cit0ZW1wbGF0ZTx0eXBlbmFtZT4gc3RydWN0IGlzUG9kTGlrZTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzUG9kTGlrZTxjbGFuZzo6RGVjbEFjY2Vzc1BhaXI+IHsKKyAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKK307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xCYXNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbEJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDg4OTRjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xCYXNlLmgKQEAgLTAsMCArMSwyMDYzIEBACisvLz09PS0gRGVjbEJhc2UuaCAtIEJhc2UgQ2xhc3NlcyBmb3IgcmVwcmVzZW50aW5nIGRlY2xhcmF0aW9ucyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRGVjbCBhbmQgRGVjbENvbnRleHQgaW50ZXJmYWNlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0RFQ0xCQVNFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfREVDTEJBU0VfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0F0dHJJdGVyYXRvci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsYXJhdGlvbk5hbWUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9TcGVjaWZpZXJzLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVmVyc2lvblR1cGxlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QcmV0dHlTdGFja1RyYWNlLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQVNUQ29udGV4dDsKK2NsYXNzIEFTVE11dGF0aW9uTGlzdGVuZXI7CitjbGFzcyBBdHRyOworY2xhc3MgRGVjbENvbnRleHQ7CitjbGFzcyBFeHRlcm5hbFNvdXJjZVN5bWJvbEF0dHI7CitjbGFzcyBGdW5jdGlvbkRlY2w7CitjbGFzcyBGdW5jdGlvblR5cGU7CitjbGFzcyBJZGVudGlmaWVySW5mbzsKK2VudW0gTGlua2FnZSA6IHVuc2lnbmVkIGNoYXI7CitjbGFzcyBMaW5rYWdlU3BlY0RlY2w7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBOYW1lZERlY2w7CitjbGFzcyBPYmpDQ2F0ZWdvcnlEZWNsOworY2xhc3MgT2JqQ0NhdGVnb3J5SW1wbERlY2w7CitjbGFzcyBPYmpDQ29udGFpbmVyRGVjbDsKK2NsYXNzIE9iakNJbXBsRGVjbDsKK2NsYXNzIE9iakNJbXBsZW1lbnRhdGlvbkRlY2w7CitjbGFzcyBPYmpDSW50ZXJmYWNlRGVjbDsKK2NsYXNzIE9iakNNZXRob2REZWNsOworY2xhc3MgT2JqQ1Byb3RvY29sRGVjbDsKK3N0cnVjdCBQcmludGluZ1BvbGljeTsKK2NsYXNzIFJlY29yZERlY2w7CitjbGFzcyBTb3VyY2VNYW5hZ2VyOworY2xhc3MgU3RtdDsKK2NsYXNzIFN0b3JlZERlY2xzTWFwOworY2xhc3MgVGVtcGxhdGVEZWNsOworY2xhc3MgVHJhbnNsYXRpb25Vbml0RGVjbDsKK2NsYXNzIFVzaW5nRGlyZWN0aXZlRGVjbDsKKworLy8vIFxicmllZiBDYXB0dXJlcyB0aGUgcmVzdWx0IG9mIGNoZWNraW5nIHRoZSBhdmFpbGFiaWxpdHkgb2YgYQorLy8vIGRlY2xhcmF0aW9uLgorZW51bSBBdmFpbGFiaWxpdHlSZXN1bHQgeworICBBUl9BdmFpbGFibGUgPSAwLAorICBBUl9Ob3RZZXRJbnRyb2R1Y2VkLAorICBBUl9EZXByZWNhdGVkLAorICBBUl9VbmF2YWlsYWJsZQorfTsKKworLy8vIERlY2wgLSBUaGlzIHJlcHJlc2VudHMgb25lIGRlY2xhcmF0aW9uIChvciBkZWZpbml0aW9uKSwgZS5nLiBhIHZhcmlhYmxlLAorLy8vIHR5cGVkZWYsIGZ1bmN0aW9uLCBzdHJ1Y3QsIGV0Yy4KKy8vLworLy8vIE5vdGU6IFRoZXJlIGFyZSBvYmplY3RzIHRhY2tlZCBvbiBiZWZvcmUgdGhlICpiZWdpbm5pbmcqIG9mIERlY2wKKy8vLyAoYW5kIGl0cyBzdWJjbGFzc2VzKSBpbiBpdHMgRGVjbDo6b3BlcmF0b3IgbmV3KCkuIFByb3BlciBhbGlnbm1lbnQKKy8vLyBvZiBhbGwgc3ViY2xhc3NlcyAobm90IHJlcXVpcmluZyBtb3JlIHRoYW4gdGhlIGFsaWdubWVudCBvZiBEZWNsKSBpcworLy8vIGFzc2VydGVkIGluIERlY2xCYXNlLmNwcC4KK2NsYXNzIExMVk1fQUxJR05BUygvKmFsaWdub2YodWludDY0X3QpKi8gOCkgRGVjbCB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgTGlzdHMgdGhlIGtpbmQgb2YgY29uY3JldGUgY2xhc3NlcyBvZiBEZWNsLgorICBlbnVtIEtpbmQgeworI2RlZmluZSBERUNMKERFUklWRUQsIEJBU0UpIERFUklWRUQsCisjZGVmaW5lIEFCU1RSQUNUX0RFQ0woREVDTCkKKyNkZWZpbmUgREVDTF9SQU5HRShCQVNFLCBTVEFSVCwgRU5EKSBcCisgICAgICAgIGZpcnN0IyNCQVNFID0gU1RBUlQsIGxhc3QjI0JBU0UgPSBFTkQsCisjZGVmaW5lIExBU1RfREVDTF9SQU5HRShCQVNFLCBTVEFSVCwgRU5EKSBcCisgICAgICAgIGZpcnN0IyNCQVNFID0gU1RBUlQsIGxhc3QjI0JBU0UgPSBFTkQKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbE5vZGVzLmluYyIKKyAgfTsKKworICAvLy8gXGJyaWVmIEEgcGxhY2Vob2xkZXIgdHlwZSB1c2VkIHRvIGNvbnN0cnVjdCBhbiBlbXB0eSBzaGVsbCBvZiBhCisgIC8vLyBkZWNsLWRlcml2ZWQgdHlwZSB0aGF0IHdpbGwgYmUgZmlsbGVkIGluIGxhdGVyIChlLmcuLCBieSBzb21lCisgIC8vLyBkZXNlcmlhbGl6YXRpb24gbWV0aG9kKS4KKyAgc3RydWN0IEVtcHR5U2hlbGwge307CisKKyAgLy8vIElkZW50aWZpZXJOYW1lc3BhY2UgLSBUaGUgZGlmZmVyZW50IG5hbWVzcGFjZXMgaW4gd2hpY2gKKyAgLy8vIGRlY2xhcmF0aW9ucyBtYXkgYXBwZWFyLiAgQWNjb3JkaW5nIHRvIEM5OSA2LjIuMywgdGhlcmUgYXJlCisgIC8vLyBmb3VyIG5hbWVzcGFjZXMsIGxhYmVscywgdGFncywgbWVtYmVycyBhbmQgb3JkaW5hcnkKKyAgLy8vIGlkZW50aWZpZXJzLiAgQysrIGRlc2NyaWJlcyBsb29rdXAgY29tcGxldGVseSBkaWZmZXJlbnRseToKKyAgLy8vIGNlcnRhaW4gbG9va3VwcyBtZXJlbHkgImlnbm9yZSIgY2VydGFpbiBraW5kcyBvZiBkZWNsYXJhdGlvbnMsCisgIC8vLyB1c3VhbGx5IGJhc2VkIG9uIHdoZXRoZXIgdGhlIGRlY2xhcmF0aW9uIGlzIG9mIGEgdHlwZSwgZXRjLgorICAvLy8KKyAgLy8vIFRoZXNlIGFyZSBtZWFudCBhcyBiaXRtYXNrcywgc28gdGhhdCBzZWFyY2hlcyBpbgorICAvLy8gQysrIGNhbiBsb29rIGludG8gdGhlICJ0YWciIG5hbWVzcGFjZSBkdXJpbmcgb3JkaW5hcnkgbG9va3VwLgorICAvLy8KKyAgLy8vIERlY2wgY3VycmVudGx5IHByb3ZpZGVzIDE1IGJpdHMgb2YgSUROUyBiaXRzLgorICBlbnVtIElkZW50aWZpZXJOYW1lc3BhY2UgeworICAgIC8vLyBMYWJlbHMsIGRlY2xhcmVkIHdpdGggJ3g6JyBhbmQgcmVmZXJlbmNlZCB3aXRoICdnb3RvIHgnLgorICAgIElETlNfTGFiZWwgICAgICAgICAgICAgICA9IDB4MDAwMSwKKworICAgIC8vLyBUYWdzLCBkZWNsYXJlZCB3aXRoICdzdHJ1Y3QgZm9vOycgYW5kIHJlZmVyZW5jZWQgd2l0aAorICAgIC8vLyAnc3RydWN0IGZvbycuICBBbGwgdGFncyBhcmUgYWxzbyB0eXBlcy4gIFRoaXMgaXMgd2hhdAorICAgIC8vLyBlbGFib3JhdGVkLXR5cGUtc3BlY2lmaWVycyBsb29rIGZvciBpbiBDLgorICAgIC8vLyBUaGlzIGFsc28gY29udGFpbnMgbmFtZXMgdGhhdCBjb25mbGljdCB3aXRoIHRhZ3MgaW4gdGhlCisgICAgLy8vIHNhbWUgc2NvcGUgYnV0IHRoYXQgYXJlIG90aGVyd2lzZSBvcmRpbmFyeSBuYW1lcyAobm9uLXR5cGUKKyAgICAvLy8gdGVtcGxhdGUgcGFyYW1ldGVycyBhbmQgaW5kaXJlY3QgZmllbGQgZGVjbGFyYXRpb25zKS4KKyAgICBJRE5TX1RhZyAgICAgICAgICAgICAgICAgPSAweDAwMDIsCisKKyAgICAvLy8gVHlwZXMsIGRlY2xhcmVkIHdpdGggJ3N0cnVjdCBmb28nLCB0eXBlZGVmcywgZXRjLgorICAgIC8vLyBUaGlzIGlzIHdoYXQgZWxhYm9yYXRlZC10eXBlLXNwZWNpZmllcnMgbG9vayBmb3IgaW4gQysrLAorICAgIC8vLyBidXQgbm90ZSB0aGF0IGl0J3MgaWxsLWZvcm1lZCB0byBmaW5kIGEgbm9uLXRhZy4KKyAgICBJRE5TX1R5cGUgICAgICAgICAgICAgICAgPSAweDAwMDQsCisKKyAgICAvLy8gTWVtYmVycywgZGVjbGFyZWQgd2l0aCBvYmplY3QgZGVjbGFyYXRpb25zIHdpdGhpbiB0YWcKKyAgICAvLy8gZGVmaW5pdGlvbnMuICBJbiBDLCB0aGVzZSBjYW4gb25seSBiZSBmb3VuZCBieSAicXVhbGlmaWVkIgorICAgIC8vLyBsb29rdXAgaW4gbWVtYmVyIGV4cHJlc3Npb25zLiAgSW4gQysrLCB0aGV5J3JlIGZvdW5kIGJ5CisgICAgLy8vIG5vcm1hbCBsb29rdXAuCisgICAgSUROU19NZW1iZXIgICAgICAgICAgICAgID0gMHgwMDA4LAorCisgICAgLy8vIE5hbWVzcGFjZXMsIGRlY2xhcmVkIHdpdGggJ25hbWVzcGFjZSBmb28ge30nLgorICAgIC8vLyBMb29rdXAgZm9yIG5lc3RlZC1uYW1lLXNwZWNpZmllcnMgZmluZCB0aGVzZS4KKyAgICBJRE5TX05hbWVzcGFjZSAgICAgICAgICAgPSAweDAwMTAsCisKKyAgICAvLy8gT3JkaW5hcnkgbmFtZXMuICBJbiBDLCBldmVyeXRoaW5nIHRoYXQncyBub3QgYSBsYWJlbCwgdGFnLAorICAgIC8vLyBtZW1iZXIsIG9yIGZ1bmN0aW9uLWxvY2FsIGV4dGVybiBlbmRzIHVwIGhlcmUuCisgICAgSUROU19PcmRpbmFyeSAgICAgICAgICAgID0gMHgwMDIwLAorCisgICAgLy8vIE9iamVjdGl2ZSBDIFxAcHJvdG9jb2wuCisgICAgSUROU19PYmpDUHJvdG9jb2wgICAgICAgID0gMHgwMDQwLAorCisgICAgLy8vIFRoaXMgZGVjbGFyYXRpb24gaXMgYSBmcmllbmQgZnVuY3Rpb24uICBBIGZyaWVuZCBmdW5jdGlvbgorICAgIC8vLyBkZWNsYXJhdGlvbiBpcyBhbHdheXMgaW4gdGhpcyBuYW1lc3BhY2UgYnV0IG1heSBhbHNvIGJlIGluCisgICAgLy8vIElETlNfT3JkaW5hcnkgaWYgaXQgd2FzIHByZXZpb3VzbHkgZGVjbGFyZWQuCisgICAgSUROU19PcmRpbmFyeUZyaWVuZCAgICAgID0gMHgwMDgwLAorCisgICAgLy8vIFRoaXMgZGVjbGFyYXRpb24gaXMgYSBmcmllbmQgY2xhc3MuICBBIGZyaWVuZCBjbGFzcworICAgIC8vLyBkZWNsYXJhdGlvbiBpcyBhbHdheXMgaW4gdGhpcyBuYW1lc3BhY2UgYnV0IG1heSBhbHNvIGJlIGluCisgICAgLy8vIElETlNfVGFnfElETlNfVHlwZSBpZiBpdCB3YXMgcHJldmlvdXNseSBkZWNsYXJlZC4KKyAgICBJRE5TX1RhZ0ZyaWVuZCAgICAgICAgICAgPSAweDAxMDAsCisKKyAgICAvLy8gVGhpcyBkZWNsYXJhdGlvbiBpcyBhIHVzaW5nIGRlY2xhcmF0aW9uLiAgQSB1c2luZyBkZWNsYXJhdGlvbgorICAgIC8vLyAqaW50cm9kdWNlcyogYSBudW1iZXIgb2Ygb3RoZXIgZGVjbGFyYXRpb25zIGludG8gdGhlIGN1cnJlbnQKKyAgICAvLy8gc2NvcGUsIGFuZCB0aG9zZSBkZWNsYXJhdGlvbnMgdXNlIHRoZSBJRE5TIG9mIHRoZWlyIHRhcmdldHMsCisgICAgLy8vIGJ1dCB0aGUgYWN0dWFsIHVzaW5nIGRlY2xhcmF0aW9ucyBnbyBpbiB0aGlzIG5hbWVzcGFjZS4KKyAgICBJRE5TX1VzaW5nICAgICAgICAgICAgICAgPSAweDAyMDAsCisKKyAgICAvLy8gVGhpcyBkZWNsYXJhdGlvbiBpcyBhIEMrKyBvcGVyYXRvciBkZWNsYXJlZCBpbiBhIG5vbi1jbGFzcworICAgIC8vLyBjb250ZXh0LiAgQWxsIHN1Y2ggb3BlcmF0b3JzIGFyZSBhbHNvIGluIElETlNfT3JkaW5hcnkuCisgICAgLy8vIEMrKyBsZXhpY2FsIG9wZXJhdG9yIGxvb2t1cCBsb29rcyBmb3IgdGhlc2UuCisgICAgSUROU19Ob25NZW1iZXJPcGVyYXRvciAgID0gMHgwNDAwLAorCisgICAgLy8vIFRoaXMgZGVjbGFyYXRpb24gaXMgYSBmdW5jdGlvbi1sb2NhbCBleHRlcm4gZGVjbGFyYXRpb24gb2YgYQorICAgIC8vLyB2YXJpYWJsZSBvciBmdW5jdGlvbi4gVGhpcyBtYXkgYWxzbyBiZSBJRE5TX09yZGluYXJ5IGlmIGl0CisgICAgLy8vIGhhcyBiZWVuIGRlY2xhcmVkIG91dHNpZGUgYW55IGZ1bmN0aW9uLiBUaGVzZSBhY3QgbW9zdGx5IGxpa2UKKyAgICAvLy8gaW52aXNpYmxlIGZyaWVuZCBkZWNsYXJhdGlvbnMsIGJ1dCBhcmUgYWxzbyB2aXNpYmxlIHRvIHVucXVhbGlmaWVkCisgICAgLy8vIGxvb2t1cCB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBkZWNsYXJpbmcgZnVuY3Rpb24uCisgICAgSUROU19Mb2NhbEV4dGVybiAgICAgICAgID0gMHgwODAwLAorCisgICAgLy8vIFRoaXMgZGVjbGFyYXRpb24gaXMgYW4gT3Blbk1QIHVzZXIgZGVmaW5lZCByZWR1Y3Rpb24gY29uc3RydWN0aW9uLgorICAgIElETlNfT01QUmVkdWN0aW9uICAgICAgICA9IDB4MTAwMAorICB9OworCisgIC8vLyBPYmpDRGVjbFF1YWxpZmllciAtICdRdWFsaWZpZXJzJyB3cml0dGVuIG5leHQgdG8gdGhlIHJldHVybiBhbmQKKyAgLy8vIHBhcmFtZXRlciB0eXBlcyBpbiBtZXRob2QgZGVjbGFyYXRpb25zLiAgT3RoZXIgdGhhbiByZW1lbWJlcmluZworICAvLy8gdGhlbSBhbmQgbWFuZ2xpbmcgdGhlbSBpbnRvIHRoZSBtZXRob2QncyBzaWduYXR1cmUgc3RyaW5nLCB0aGVzZQorICAvLy8gYXJlIGlnbm9yZWQgYnkgdGhlIGNvbXBpbGVyOyB0aGV5IGFyZSBjb25zdW1lZCBieSBjZXJ0YWluCisgIC8vLyByZW1vdGUtbWVzc2FnaW5nIGZyYW1ld29ya3MuCisgIC8vLworICAvLy8gaW4sIGlub3V0LCBhbmQgb3V0IGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYW5kIGFwcGx5IG9ubHkgdG8KKyAgLy8vIG1ldGhvZCBwYXJhbWV0ZXJzLiAgYnljb3B5IGFuZCBieXJlZiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIGFuZAorICAvLy8gYXBwbHkgb25seSB0byBtZXRob2QgcGFyYW1ldGVycyAoPykuICBvbmV3YXkgYXBwbGllcyBvbmx5IHRvCisgIC8vLyByZXN1bHRzLiAgQWxsIG9mIHRoZXNlIGV4cGVjdCB0aGVpciBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciB0bworICAvLy8gaGF2ZSBhIHBhcnRpY3VsYXIgdHlwZS4gIE5vbmUgb2YgdGhpcyBpcyBjdXJyZW50bHkgZW5mb3JjZWQgYnkKKyAgLy8vIGNsYW5nLgorICAvLy8KKyAgLy8vIFRoaXMgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIE9iakNEZWNsU3BlYzo6T2JqQ0RlY2xRdWFsaWZpZXIuCisgIGVudW0gT2JqQ0RlY2xRdWFsaWZpZXIgeworICAgIE9CSkNfVFFfTm9uZSA9IDB4MCwKKyAgICBPQkpDX1RRX0luID0gMHgxLAorICAgIE9CSkNfVFFfSW5vdXQgPSAweDIsCisgICAgT0JKQ19UUV9PdXQgPSAweDQsCisgICAgT0JKQ19UUV9CeWNvcHkgPSAweDgsCisgICAgT0JKQ19UUV9CeXJlZiA9IDB4MTAsCisgICAgT0JKQ19UUV9PbmV3YXkgPSAweDIwLAorCisgICAgLy8vIFRoZSBudWxsYWJpbGl0eSBxdWFsaWZpZXIgaXMgc2V0IHdoZW4gdGhlIG51bGxhYmlsaXR5IG9mIHRoZQorICAgIC8vLyByZXN1bHQgb3IgcGFyYW1ldGVyIHdhcyBleHByZXNzZWQgdmlhIGEgY29udGV4dC1zZW5zaXRpdmUKKyAgICAvLy8ga2V5d29yZC4KKyAgICBPQkpDX1RRX0NTTnVsbGFiaWxpdHkgPSAweDQwCisgIH07CisKKyAgLy8vIFRoZSBraW5kIG9mIG93bmVyc2hpcCBhIGRlY2xhcmF0aW9uIGhhcywgZm9yIHZpc2liaWxpdHkgcHVycG9zZXMuCisgIC8vLyBUaGlzIGVudW1lcmF0aW9uIGlzIGRlc2lnbmVkIHN1Y2ggdGhhdCBoaWdoZXIgdmFsdWVzIHJlcHJlc2VudCBoaWdoZXIKKyAgLy8vIGxldmVscyBvZiBuYW1lIGhpZGluZy4KKyAgZW51bSBjbGFzcyBNb2R1bGVPd25lcnNoaXBLaW5kIDogdW5zaWduZWQgeworICAgIC8vLyBUaGlzIGRlY2xhcmF0aW9uIGlzIG5vdCBvd25lZCBieSBhIG1vZHVsZS4KKyAgICBVbm93bmVkLAorCisgICAgLy8vIFRoaXMgZGVjbGFyYXRpb24gaGFzIGFuIG93bmluZyBtb2R1bGUsIGJ1dCBpcyBnbG9iYWxseSB2aXNpYmxlCisgICAgLy8vICh0eXBpY2FsbHkgYmVjYXVzZSBpdHMgb3duaW5nIG1vZHVsZSBpcyB2aXNpYmxlIGFuZCB3ZSBrbm93IHRoYXQKKyAgICAvLy8gbW9kdWxlcyBjYW5ub3QgbGF0ZXIgYmVjb21lIGhpZGRlbiBpbiB0aGlzIGNvbXBpbGF0aW9uKS4KKyAgICAvLy8gQWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLCB0aGlzIHdpbGwgYmUgY29udmVydGVkCisgICAgLy8vIHRvIFZpc2libGVXaGVuSW1wb3J0ZWQuCisgICAgVmlzaWJsZSwKKworICAgIC8vLyBUaGlzIGRlY2xhcmF0aW9uIGhhcyBhbiBvd25pbmcgbW9kdWxlLCBhbmQgaXMgdmlzaWJsZSB3aGVuIHRoYXQKKyAgICAvLy8gbW9kdWxlIGlzIGltcG9ydGVkLgorICAgIFZpc2libGVXaGVuSW1wb3J0ZWQsCisKKyAgICAvLy8gVGhpcyBkZWNsYXJhdGlvbiBoYXMgYW4gb3duaW5nIG1vZHVsZSwgYnV0IGlzIG9ubHkgdmlzaWJsZSB0bworICAgIC8vLyBsb29rdXBzIHRoYXQgb2NjdXIgd2l0aGluIHRoYXQgbW9kdWxlLgorICAgIE1vZHVsZVByaXZhdGUKKyAgfTsKKworcHJvdGVjdGVkOgorICAvLy8gXGJyaWVmIFRoZSBuZXh0IGRlY2xhcmF0aW9uIHdpdGhpbiB0aGUgc2FtZSBsZXhpY2FsCisgIC8vLyBEZWNsQ29udGV4dC4gVGhlc2UgcG9pbnRlcnMgZm9ybSB0aGUgbGlua2VkIGxpc3QgdGhhdCBpcworICAvLy8gdHJhdmVyc2VkIHZpYSBEZWNsQ29udGV4dCdzIGRlY2xzX2JlZ2luKCkvZGVjbHNfZW5kKCkuCisgIC8vLworICAvLy8gVGhlIGV4dHJhIHR3byBiaXRzIGFyZSB1c2VkIGZvciB0aGUgTW9kdWxlT3duZXJzaGlwS2luZC4KKyAgbGx2bTo6UG9pbnRlckludFBhaXI8RGVjbCAqLCAyLCBNb2R1bGVPd25lcnNoaXBLaW5kPiBOZXh0SW5Db250ZXh0QW5kQml0czsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIERlY2xDb250ZXh0OworCisgIHN0cnVjdCBNdWx0aXBsZURDIHsKKyAgICBEZWNsQ29udGV4dCAqU2VtYW50aWNEQzsKKyAgICBEZWNsQ29udGV4dCAqTGV4aWNhbERDOworICB9OworCisgIC8vLyBEZWNsQ3R4IC0gSG9sZHMgZWl0aGVyIGEgRGVjbENvbnRleHQqIG9yIGEgTXVsdGlwbGVEQyouCisgIC8vLyBGb3IgZGVjbGFyYXRpb25zIHRoYXQgZG9uJ3QgY29udGFpbiBDKysgc2NvcGUgc3BlY2lmaWVycywgaXQgY29udGFpbnMKKyAgLy8vIHRoZSBEZWNsQ29udGV4dCB3aGVyZSB0aGUgRGVjbCB3YXMgZGVjbGFyZWQuCisgIC8vLyBGb3IgZGVjbGFyYXRpb25zIHdpdGggQysrIHNjb3BlIHNwZWNpZmllcnMsIGl0IGNvbnRhaW5zIGEgTXVsdGlwbGVEQyoKKyAgLy8vIHdpdGggdGhlIGNvbnRleHQgd2hlcmUgaXQgc2VtYW50aWNhbGx5IGJlbG9uZ3MgKFNlbWFudGljREMpIGFuZCB0aGUKKyAgLy8vIGNvbnRleHQgd2hlcmUgaXQgd2FzIGxleGljYWxseSBkZWNsYXJlZCAoTGV4aWNhbERDKS4KKyAgLy8vIGUuZy46CisgIC8vLworICAvLy8gICBuYW1lc3BhY2UgQSB7CisgIC8vLyAgICAgIHZvaWQgZigpOyAvLyBTZW1hbnRpY0RDID09IExleGljYWxEQyA9PSAnbmFtZXNwYWNlIEEnCisgIC8vLyAgIH0KKyAgLy8vICAgdm9pZCBBOjpmKCk7IC8vIFNlbWFudGljREMgPT0gbmFtZXNwYWNlICdBJworICAvLy8gICAgICAgICAgICAgICAgLy8gTGV4aWNhbERDID09IGdsb2JhbCBuYW1lc3BhY2UKKyAgbGx2bTo6UG9pbnRlclVuaW9uPERlY2xDb250ZXh0KiwgTXVsdGlwbGVEQyo+IERlY2xDdHg7CisKKyAgYm9vbCBpc0luU2VtYURDKCkgY29uc3QgeyByZXR1cm4gRGVjbEN0eC5pczxEZWNsQ29udGV4dCo+KCk7IH0KKyAgYm9vbCBpc091dE9mU2VtYURDKCkgY29uc3QgeyByZXR1cm4gRGVjbEN0eC5pczxNdWx0aXBsZURDKj4oKTsgfQorCisgIE11bHRpcGxlREMgKmdldE11bHRpcGxlREMoKSBjb25zdCB7CisgICAgcmV0dXJuIERlY2xDdHguZ2V0PE11bHRpcGxlREMqPigpOworICB9CisKKyAgRGVjbENvbnRleHQgKmdldFNlbWFudGljREMoKSBjb25zdCB7CisgICAgcmV0dXJuIERlY2xDdHguZ2V0PERlY2xDb250ZXh0Kj4oKTsKKyAgfQorCisgIC8vLyBMb2MgLSBUaGUgbG9jYXRpb24gb2YgdGhpcyBkZWNsLgorICBTb3VyY2VMb2NhdGlvbiBMb2M7CisKKyAgLy8vIERlY2xLaW5kIC0gVGhpcyBpbmRpY2F0ZXMgd2hpY2ggY2xhc3MgdGhpcyBpcy4KKyAgdW5zaWduZWQgRGVjbEtpbmQgOiA3OworCisgIC8vLyBJbnZhbGlkRGVjbCAtIFRoaXMgaW5kaWNhdGVzIGEgc2VtYW50aWMgZXJyb3Igb2NjdXJyZWQuCisgIHVuc2lnbmVkIEludmFsaWREZWNsIDogIDE7CisKKyAgLy8vIEhhc0F0dHJzIC0gVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGVjbCBoYXMgYXR0cmlidXRlcyBvciBub3QuCisgIHVuc2lnbmVkIEhhc0F0dHJzIDogMTsKKworICAvLy8gSW1wbGljaXQgLSBXaGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gd2FzIGltcGxpY2l0bHkgZ2VuZXJhdGVkIGJ5CisgIC8vLyB0aGUgaW1wbGVtZW50YXRpb24gcmF0aGVyIHRoYW4gZXhwbGljaXRseSB3cml0dGVuIGJ5IHRoZSB1c2VyLgorICB1bnNpZ25lZCBJbXBsaWNpdCA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gd2FzICJ1c2VkIiwgbWVhbmluZyB0aGF0IGEgZGVmaW5pdGlvbiBpcworICAvLy8gcmVxdWlyZWQuCisgIHVuc2lnbmVkIFVzZWQgOiAxOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGRlY2xhcmF0aW9uIHdhcyAicmVmZXJlbmNlZCIuCisgIC8vLyBUaGUgZGlmZmVyZW5jZSB3aXRoICdVc2VkJyBpcyB3aGV0aGVyIHRoZSByZWZlcmVuY2UgYXBwZWFycyBpbiBhCisgIC8vLyBldmFsdWF0ZWQgY29udGV4dCBvciBub3QsIGUuZy4gZnVuY3Rpb25zIHVzZWQgaW4gdW5pbnN0YW50aWF0ZWQgdGVtcGxhdGVzCisgIC8vLyBhcmUgcmVnYXJkZWQgYXMgInJlZmVyZW5jZWQiIGJ1dCBub3QgInVzZWQiLgorICB1bnNpZ25lZCBSZWZlcmVuY2VkIDogMTsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBkZWNsYXJhdGlvbiBpcyBhIHRvcC1sZXZlbCBkZWNsYXJhdGlvbiAoZnVuY3Rpb24sCisgIC8vLyBnbG9iYWwgdmFyaWFibGUsIGV0Yy4pIHRoYXQgaXMgbGV4aWNhbGx5IGluc2lkZSBhbiBvYmpjIGNvbnRhaW5lcgorICAvLy8gZGVmaW5pdGlvbi4KKyAgdW5zaWduZWQgVG9wTGV2ZWxEZWNsSW5PYmpDQ29udGFpbmVyIDogMTsKKyAgCisgIC8vLyBcYnJpZWYgV2hldGhlciBzdGF0aXN0aWMgY29sbGVjdGlvbiBpcyBlbmFibGVkLgorICBzdGF0aWMgYm9vbCBTdGF0aXN0aWNzRW5hYmxlZDsKKworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBDWFhDbGFzc01lbWJlcldyYXBwZXI7CisgIGZyaWVuZCBjbGFzcyBMaW5rYWdlQ29tcHV0ZXI7CisgIHRlbXBsYXRlPHR5cGVuYW1lIGRlY2xfdHlwZT4gZnJpZW5kIGNsYXNzIFJlZGVjbGFyYWJsZTsKKworICAvLy8gQWNjZXNzIC0gVXNlZCBieSBDKysgZGVjbHMgZm9yIHRoZSBhY2Nlc3Mgc3BlY2lmaWVyLgorICAvLyBOT1RFOiBWQysrIHRyZWF0cyBlbnVtcyBhcyBzaWduZWQsIGF2b2lkIHVzaW5nIHRoZSBBY2Nlc3NTcGVjaWZpZXIgZW51bQorICB1bnNpZ25lZCBBY2Nlc3MgOiAyOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGRlY2xhcmF0aW9uIHdhcyBsb2FkZWQgZnJvbSBhbiBBU1QgZmlsZS4KKyAgdW5zaWduZWQgRnJvbUFTVEZpbGUgOiAxOworCisgIC8vLyBJZGVudGlmaWVyTmFtZXNwYWNlIC0gVGhpcyBzcGVjaWZpZXMgd2hhdCBJRE5TXyogbmFtZXNwYWNlIHRoaXMgbGl2ZXMgaW4uCisgIHVuc2lnbmVkIElkZW50aWZpZXJOYW1lc3BhY2UgOiAxMzsKKworICAvLy8gXGJyaWVmIElmIDAsIHdlIGhhdmUgbm90IGNvbXB1dGVkIHRoZSBsaW5rYWdlIG9mIHRoaXMgZGVjbGFyYXRpb24uCisgIC8vLyBPdGhlcndpc2UsIGl0IGlzIHRoZSBsaW5rYWdlICsgMS4KKyAgbXV0YWJsZSB1bnNpZ25lZCBDYWNoZVZhbGlkQW5kTGlua2FnZSA6IDM7CisKKyAgLy8vIFxicmllZiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgZGVzZXJpYWxpemVkIGRlY2xhcmF0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBtdXN0IGJlIHVzZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhbnkgZGVjbGFyYXRpb24gdGhhdCBpcworICAvLy8gZGVzZXJpYWxpemVkIGZyb20gYSBtb2R1bGUgZmlsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gU2l6ZSBUaGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGVkIG9iamVjdC4KKyAgLy8vIFxwYXJhbSBDdHggVGhlIGNvbnRleHQgaW4gd2hpY2ggd2Ugd2lsbCBhbGxvY2F0ZSBtZW1vcnkuCisgIC8vLyBccGFyYW0gSUQgVGhlIGdsb2JhbCBJRCBvZiB0aGUgZGVzZXJpYWxpemVkIGRlY2xhcmF0aW9uLgorICAvLy8gXHBhcmFtIEV4dHJhIFRoZSBhbW91bnQgb2YgZXh0cmEgc3BhY2UgdG8gYWxsb2NhdGUgYWZ0ZXIgdGhlIG9iamVjdC4KKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90IFNpemUsIGNvbnN0IEFTVENvbnRleHQgJkN0eCwgdW5zaWduZWQgSUQsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBFeHRyYSA9IDApOworCisgIC8vLyBcYnJpZWYgQWxsb2NhdGUgbWVtb3J5IGZvciBhIG5vbi1kZXNlcmlhbGl6ZWQgZGVjbGFyYXRpb24uCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzdGQ6OnNpemVfdCBTaXplLCBjb25zdCBBU1RDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICBEZWNsQ29udGV4dCAqUGFyZW50LCBzdGQ6OnNpemVfdCBFeHRyYSA9IDApOworCitwcml2YXRlOgorICBib29sIEFjY2Vzc0RlY2xDb250ZXh0U2FuaXR5KCkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgbW9kdWxlIG93bmVyc2hpcCBraW5kIHRvIHVzZSBmb3IgYSBsb2NhbCBsZXhpY2FsIGNoaWxkIG9mIFxwIERDLAorICAvLy8gd2hpY2ggbWF5IGJlIGVpdGhlciBhIGxvY2FsIG9yIChyYXJlbHkpIGFuIGltcG9ydGVkIGRlY2xhcmF0aW9uLgorICBzdGF0aWMgTW9kdWxlT3duZXJzaGlwS2luZCBnZXRNb2R1bGVPd25lcnNoaXBLaW5kRm9yQ2hpbGRPZihEZWNsQ29udGV4dCAqREMpIHsKKyAgICBpZiAoREMpIHsKKyAgICAgIGF1dG8gKkQgPSBjYXN0PERlY2w+KERDKTsKKyAgICAgIGF1dG8gTU9LID0gRC0+Z2V0TW9kdWxlT3duZXJzaGlwS2luZCgpOworICAgICAgaWYgKE1PSyAhPSBNb2R1bGVPd25lcnNoaXBLaW5kOjpVbm93bmVkICYmCisgICAgICAgICAgKCFELT5pc0Zyb21BU1RGaWxlKCkgfHwgRC0+aGFzTG9jYWxPd25pbmdNb2R1bGVTdG9yYWdlKCkpKQorICAgICAgICByZXR1cm4gTU9LOworICAgICAgLy8gSWYgRCBpcyBub3QgbG9jYWwgYW5kIHdlIGhhdmUgbm8gbG9jYWwgbW9kdWxlIHN0b3JhZ2UsIHRoZW4gd2UgZG9uJ3QKKyAgICAgIC8vIG5lZWQgdG8gdHJhY2sgbW9kdWxlIG93bmVyc2hpcCBhdCBhbGwuCisgICAgfQorICAgIHJldHVybiBNb2R1bGVPd25lcnNoaXBLaW5kOjpVbm93bmVkOworICB9CisKK3Byb3RlY3RlZDoKKyAgRGVjbChLaW5kIERLLCBEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIEwpCisgICAgICA6IE5leHRJbkNvbnRleHRBbmRCaXRzKG51bGxwdHIsIGdldE1vZHVsZU93bmVyc2hpcEtpbmRGb3JDaGlsZE9mKERDKSksCisgICAgICAgIERlY2xDdHgoREMpLCBMb2MoTCksIERlY2xLaW5kKERLKSwgSW52YWxpZERlY2woZmFsc2UpLCBIYXNBdHRycyhmYWxzZSksCisgICAgICAgIEltcGxpY2l0KGZhbHNlKSwgVXNlZChmYWxzZSksIFJlZmVyZW5jZWQoZmFsc2UpLAorICAgICAgICBUb3BMZXZlbERlY2xJbk9iakNDb250YWluZXIoZmFsc2UpLCBBY2Nlc3MoQVNfbm9uZSksIEZyb21BU1RGaWxlKDApLAorICAgICAgICBJZGVudGlmaWVyTmFtZXNwYWNlKGdldElkZW50aWZpZXJOYW1lc3BhY2VGb3JLaW5kKERLKSksCisgICAgICAgIENhY2hlVmFsaWRBbmRMaW5rYWdlKDApIHsKKyAgICBpZiAoU3RhdGlzdGljc0VuYWJsZWQpIGFkZChESyk7CisgIH0KKworICBEZWNsKEtpbmQgREssIEVtcHR5U2hlbGwgRW1wdHkpCisgICAgICA6IERlY2xLaW5kKERLKSwgSW52YWxpZERlY2woZmFsc2UpLCBIYXNBdHRycyhmYWxzZSksIEltcGxpY2l0KGZhbHNlKSwKKyAgICAgICAgVXNlZChmYWxzZSksIFJlZmVyZW5jZWQoZmFsc2UpLCBUb3BMZXZlbERlY2xJbk9iakNDb250YWluZXIoZmFsc2UpLAorICAgICAgICBBY2Nlc3MoQVNfbm9uZSksIEZyb21BU1RGaWxlKDApLAorICAgICAgICBJZGVudGlmaWVyTmFtZXNwYWNlKGdldElkZW50aWZpZXJOYW1lc3BhY2VGb3JLaW5kKERLKSksCisgICAgICAgIENhY2hlVmFsaWRBbmRMaW5rYWdlKDApIHsKKyAgICBpZiAoU3RhdGlzdGljc0VuYWJsZWQpIGFkZChESyk7CisgIH0KKworICB2aXJ0dWFsIH5EZWNsKCk7CisKKyAgLy8vIFxicmllZiBVcGRhdGUgYSBwb3RlbnRpYWxseSBvdXQtb2YtZGF0ZSBkZWNsYXJhdGlvbi4KKyAgdm9pZCB1cGRhdGVPdXRPZkRhdGUoSWRlbnRpZmllckluZm8gJklJKSBjb25zdDsKKworICBMaW5rYWdlIGdldENhY2hlZExpbmthZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIExpbmthZ2UoQ2FjaGVWYWxpZEFuZExpbmthZ2UgLSAxKTsKKyAgfQorCisgIHZvaWQgc2V0Q2FjaGVkTGlua2FnZShMaW5rYWdlIEwpIGNvbnN0IHsKKyAgICBDYWNoZVZhbGlkQW5kTGlua2FnZSA9IEwgKyAxOworICB9CisKKyAgYm9vbCBoYXNDYWNoZWRMaW5rYWdlKCkgY29uc3QgeworICAgIHJldHVybiBDYWNoZVZhbGlkQW5kTGlua2FnZTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgU291cmNlIHJhbmdlIHRoYXQgdGhpcyBkZWNsYXJhdGlvbiBjb3ZlcnMuCisgIHZpcnR1YWwgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0TG9jYXRpb24oKSwgZ2V0TG9jYXRpb24oKSk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBnZXRTb3VyY2VSYW5nZSgpLmdldEJlZ2luKCk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gZ2V0U291cmNlUmFuZ2UoKS5nZXRFbmQoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9CisgIHZvaWQgc2V0TG9jYXRpb24oU291cmNlTG9jYXRpb24gTCkgeyBMb2MgPSBMOyB9CisKKyAgS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8S2luZD4oRGVjbEtpbmQpOyB9CisgIGNvbnN0IGNoYXIgKmdldERlY2xLaW5kTmFtZSgpIGNvbnN0OworCisgIERlY2wgKmdldE5leHREZWNsSW5Db250ZXh0KCkgeyByZXR1cm4gTmV4dEluQ29udGV4dEFuZEJpdHMuZ2V0UG9pbnRlcigpOyB9CisgIGNvbnN0IERlY2wgKmdldE5leHREZWNsSW5Db250ZXh0KCkgY29uc3Qge3JldHVybiBOZXh0SW5Db250ZXh0QW5kQml0cy5nZXRQb2ludGVyKCk7fQorCisgIERlY2xDb250ZXh0ICpnZXREZWNsQ29udGV4dCgpIHsKKyAgICBpZiAoaXNJblNlbWFEQygpKQorICAgICAgcmV0dXJuIGdldFNlbWFudGljREMoKTsKKyAgICByZXR1cm4gZ2V0TXVsdGlwbGVEQygpLT5TZW1hbnRpY0RDOworICB9CisgIGNvbnN0IERlY2xDb250ZXh0ICpnZXREZWNsQ29udGV4dCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxEZWNsKj4odGhpcyktPmdldERlY2xDb250ZXh0KCk7CisgIH0KKworICAvLy8gRmluZCB0aGUgaW5uZXJtb3N0IG5vbi1jbG9zdXJlIGFuY2VzdG9yIG9mIHRoaXMgZGVjbGFyYXRpb24sCisgIC8vLyB3YWxraW5nIHVwIHRocm91Z2ggYmxvY2tzLCBsYW1iZGFzLCBldGMuICBJZiB0aGF0IGFuY2VzdG9yIGlzCisgIC8vLyBub3QgYSBjb2RlIGNvbnRleHQgKCFpc0Z1bmN0aW9uT3JNZXRob2QoKSksIHJldHVybnMgbnVsbC4KKyAgLy8vCisgIC8vLyBBIGRlY2xhcmF0aW9uIG1heSBiZSBpdHMgb3duIG5vbi1jbG9zdXJlIGNvbnRleHQuCisgIERlY2wgKmdldE5vbkNsb3N1cmVDb250ZXh0KCk7CisgIGNvbnN0IERlY2wgKmdldE5vbkNsb3N1cmVDb250ZXh0KCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PERlY2wqPih0aGlzKS0+Z2V0Tm9uQ2xvc3VyZUNvbnRleHQoKTsKKyAgfQorCisgIFRyYW5zbGF0aW9uVW5pdERlY2wgKmdldFRyYW5zbGF0aW9uVW5pdERlY2woKTsKKyAgY29uc3QgVHJhbnNsYXRpb25Vbml0RGVjbCAqZ2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxEZWNsKj4odGhpcyktPmdldFRyYW5zbGF0aW9uVW5pdERlY2woKTsKKyAgfQorCisgIGJvb2wgaXNJbkFub255bW91c05hbWVzcGFjZSgpIGNvbnN0OworCisgIGJvb2wgaXNJblN0ZE5hbWVzcGFjZSgpIGNvbnN0OworCisgIEFTVENvbnRleHQgJmdldEFTVENvbnRleHQoKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1NwZWNpZmllciBBUykgeworICAgIEFjY2VzcyA9IEFTOworICAgIGFzc2VydChBY2Nlc3NEZWNsQ29udGV4dFNhbml0eSgpKTsKKyAgfQorCisgIEFjY2Vzc1NwZWNpZmllciBnZXRBY2Nlc3MoKSBjb25zdCB7CisgICAgYXNzZXJ0KEFjY2Vzc0RlY2xDb250ZXh0U2FuaXR5KCkpOworICAgIHJldHVybiBBY2Nlc3NTcGVjaWZpZXIoQWNjZXNzKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGFjY2VzcyBzcGVjaWZpZXIgZm9yIHRoaXMgZGVjbGFyYXRpb24sIGV2ZW4gdGhvdWdoCisgIC8vLyBpdCBtYXkgbm90IHlldCBoYXZlIGJlZW4gcHJvcGVybHkgc2V0LgorICBBY2Nlc3NTcGVjaWZpZXIgZ2V0QWNjZXNzVW5zYWZlKCkgY29uc3QgeworICAgIHJldHVybiBBY2Nlc3NTcGVjaWZpZXIoQWNjZXNzKTsKKyAgfQorCisgIGJvb2wgaGFzQXR0cnMoKSBjb25zdCB7IHJldHVybiBIYXNBdHRyczsgfQorCisgIHZvaWQgc2V0QXR0cnMoY29uc3QgQXR0clZlYyYgQXR0cnMpIHsKKyAgICByZXR1cm4gc2V0QXR0cnNJbXBsKEF0dHJzLCBnZXRBU1RDb250ZXh0KCkpOworICB9CisKKyAgQXR0clZlYyAmZ2V0QXR0cnMoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QXR0clZlYyY+KGNvbnN0X2Nhc3Q8Y29uc3QgRGVjbCo+KHRoaXMpLT5nZXRBdHRycygpKTsKKyAgfQorCisgIGNvbnN0IEF0dHJWZWMgJmdldEF0dHJzKCkgY29uc3Q7CisgIHZvaWQgZHJvcEF0dHJzKCk7CisKKyAgdm9pZCBhZGRBdHRyKEF0dHIgKkEpIHsKKyAgICBpZiAoaGFzQXR0cnMoKSkKKyAgICAgIGdldEF0dHJzKCkucHVzaF9iYWNrKEEpOworICAgIGVsc2UKKyAgICAgIHNldEF0dHJzKEF0dHJWZWMoMSwgQSkpOworICB9CisKKyAgdXNpbmcgYXR0cl9pdGVyYXRvciA9IEF0dHJWZWM6OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBhdHRyX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8YXR0cl9pdGVyYXRvcj47CisKKyAgYXR0cl9yYW5nZSBhdHRycygpIGNvbnN0IHsKKyAgICByZXR1cm4gYXR0cl9yYW5nZShhdHRyX2JlZ2luKCksIGF0dHJfZW5kKCkpOworICB9CisKKyAgYXR0cl9pdGVyYXRvciBhdHRyX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBoYXNBdHRycygpID8gZ2V0QXR0cnMoKS5iZWdpbigpIDogbnVsbHB0cjsKKyAgfQorICBhdHRyX2l0ZXJhdG9yIGF0dHJfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBoYXNBdHRycygpID8gZ2V0QXR0cnMoKS5lbmQoKSA6IG51bGxwdHI7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCBkcm9wQXR0cigpIHsKKyAgICBpZiAoIUhhc0F0dHJzKSByZXR1cm47CisKKyAgICBBdHRyVmVjICZWZWMgPSBnZXRBdHRycygpOworICAgIFZlYy5lcmFzZShzdGQ6OnJlbW92ZV9pZihWZWMuYmVnaW4oKSwgVmVjLmVuZCgpLCBpc2E8VCwgQXR0cio+KSwgVmVjLmVuZCgpKTsKKworICAgIGlmIChWZWMuZW1wdHkoKSkKKyAgICAgIEhhc0F0dHJzID0gZmFsc2U7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c3BlY2lmaWNfYXR0cl9pdGVyYXRvcjxUPj4gc3BlY2lmaWNfYXR0cnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VfcmFuZ2Uoc3BlY2lmaWNfYXR0cl9iZWdpbjxUPigpLCBzcGVjaWZpY19hdHRyX2VuZDxUPigpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzcGVjaWZpY19hdHRyX2l0ZXJhdG9yPFQ+IHNwZWNpZmljX2F0dHJfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIHNwZWNpZmljX2F0dHJfaXRlcmF0b3I8VD4oYXR0cl9iZWdpbigpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzcGVjaWZpY19hdHRyX2l0ZXJhdG9yPFQ+IHNwZWNpZmljX2F0dHJfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBzcGVjaWZpY19hdHRyX2l0ZXJhdG9yPFQ+KGF0dHJfZW5kKCkpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gVCAqZ2V0QXR0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzQXR0cnMoKSA/IGdldFNwZWNpZmljQXR0cjxUPihnZXRBdHRycygpKSA6IG51bGxwdHI7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIGhhc0F0dHIoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0F0dHJzKCkgJiYgaGFzU3BlY2lmaWNBdHRyPFQ+KGdldEF0dHJzKCkpOworICB9CisKKyAgLy8vIGdldE1heEFsaWdubWVudCAtIHJldHVybiB0aGUgbWF4aW11bSBhbGlnbm1lbnQgc3BlY2lmaWVkIGJ5IGF0dHJpYnV0ZXMKKyAgLy8vIG9uIHRoaXMgZGVjbCwgMCBpZiB0aGVyZSBhcmUgbm9uZS4KKyAgdW5zaWduZWQgZ2V0TWF4QWxpZ25tZW50KCkgY29uc3Q7CisKKyAgLy8vIHNldEludmFsaWREZWNsIC0gSW5kaWNhdGVzIHRoZSBEZWNsIGhhZCBhIHNlbWFudGljIGVycm9yLiBUaGlzCisgIC8vLyBhbGxvd3MgZm9yIGdyYWNlZnVsIGVycm9yIHJlY292ZXJ5LgorICB2b2lkIHNldEludmFsaWREZWNsKGJvb2wgSW52YWxpZCA9IHRydWUpOworICBib29sIGlzSW52YWxpZERlY2woKSBjb25zdCB7IHJldHVybiAoYm9vbCkgSW52YWxpZERlY2w7IH0KKworICAvLy8gaXNJbXBsaWNpdCAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkZWNsYXJhdGlvbiB3YXMgaW1wbGljaXRseQorICAvLy8gZ2VuZXJhdGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi4gSWYgZmFsc2UsIHRoaXMgZGVjbGFyYXRpb24KKyAgLy8vIHdhcyB3cml0dGVuIGV4cGxpY2l0bHkgaW4gdGhlIHNvdXJjZSBjb2RlLgorICBib29sIGlzSW1wbGljaXQoKSBjb25zdCB7IHJldHVybiBJbXBsaWNpdDsgfQorICB2b2lkIHNldEltcGxpY2l0KGJvb2wgSSA9IHRydWUpIHsgSW1wbGljaXQgPSBJOyB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyICphbnkqIChyZS0pZGVjbGFyYXRpb24gb2YgdGhlIGVudGl0eSB3YXMgdXNlZCwgbWVhbmluZyB0aGF0CisgIC8vLyBhIGRlZmluaXRpb24gaXMgcmVxdWlyZWQuCisgIC8vLworICAvLy8gXHBhcmFtIENoZWNrVXNlZEF0dHIgV2hlbiB0cnVlLCBhbHNvIGNvbnNpZGVyIHRoZSAidXNlZCIgYXR0cmlidXRlCisgIC8vLyAoaW4gYWRkaXRpb24gdG8gdGhlICJ1c2VkIiBiaXQgc2V0IGJ5IFxjIHNldFVzZWQoKSkgd2hlbiBkZXRlcm1pbmluZworICAvLy8gd2hldGhlciB0aGUgZnVuY3Rpb24gaXMgdXNlZC4KKyAgYm9vbCBpc1VzZWQoYm9vbCBDaGVja1VzZWRBdHRyID0gdHJ1ZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTZXQgd2hldGhlciB0aGUgZGVjbGFyYXRpb24gaXMgdXNlZCwgaW4gdGhlIHNlbnNlIG9mIG9kci11c2UuCisgIC8vLworICAvLy8gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGltbWVkaWF0ZWx5IGFmdGVyIGNyZWF0aW5nIGEgZGVjbGFyYXRpb24uCisgIC8vLyBJdCBpbnRlbnRpb25hbGx5IGRvZXNuJ3Qgbm90aWZ5IGFueSBsaXN0ZW5lcnMuCisgIHZvaWQgc2V0SXNVc2VkKCkgeyBnZXRDYW5vbmljYWxEZWNsKCktPlVzZWQgPSB0cnVlOyB9CisKKyAgLy8vIFxicmllZiBNYXJrIHRoZSBkZWNsYXJhdGlvbiB1c2VkLCBpbiB0aGUgc2Vuc2Ugb2Ygb2RyLXVzZS4KKyAgLy8vCisgIC8vLyBUaGlzIG5vdGlmaWVzIGFueSBtdXRhdGlvbiBsaXN0ZW5lcnMgaW4gYWRkaXRpb24gdG8gc2V0dGluZyBhIGJpdAorICAvLy8gaW5kaWNhdGluZyB0aGUgZGVjbGFyYXRpb24gaXMgdXNlZC4KKyAgdm9pZCBtYXJrVXNlZChBU1RDb250ZXh0ICZDKTsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgYW55IGRlY2xhcmF0aW9uIG9mIHRoaXMgZW50aXR5IHdhcyByZWZlcmVuY2VkLgorICBib29sIGlzUmVmZXJlbmNlZCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGRlY2xhcmF0aW9uIHdhcyByZWZlcmVuY2VkLiBUaGlzIHNob3VsZCBub3QgYmUgcmVsaWVkCisgIC8vLyB1cG9uIGZvciBhbnl0aGluZyBvdGhlciB0aGFuIGRlYnVnZ2luZy4KKyAgYm9vbCBpc1RoaXNEZWNsYXJhdGlvblJlZmVyZW5jZWQoKSBjb25zdCB7IHJldHVybiBSZWZlcmVuY2VkOyB9CisKKyAgdm9pZCBzZXRSZWZlcmVuY2VkKGJvb2wgUiA9IHRydWUpIHsgUmVmZXJlbmNlZCA9IFI7IH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBkZWNsYXJhdGlvbiBpcyBhIHRvcC1sZXZlbCBkZWNsYXJhdGlvbiAoZnVuY3Rpb24sCisgIC8vLyBnbG9iYWwgdmFyaWFibGUsIGV0Yy4pIHRoYXQgaXMgbGV4aWNhbGx5IGluc2lkZSBhbiBvYmpjIGNvbnRhaW5lcgorICAvLy8gZGVmaW5pdGlvbi4KKyAgYm9vbCBpc1RvcExldmVsRGVjbEluT2JqQ0NvbnRhaW5lcigpIGNvbnN0IHsKKyAgICByZXR1cm4gVG9wTGV2ZWxEZWNsSW5PYmpDQ29udGFpbmVyOworICB9CisKKyAgdm9pZCBzZXRUb3BMZXZlbERlY2xJbk9iakNDb250YWluZXIoYm9vbCBWID0gdHJ1ZSkgeworICAgIFRvcExldmVsRGVjbEluT2JqQ0NvbnRhaW5lciA9IFY7CisgIH0KKworICAvLy8gXGJyaWVmIExvb2tzIG9uIHRoaXMgYW5kIHJlbGF0ZWQgZGVjbGFyYXRpb25zIGZvciBhbiBhcHBsaWNhYmxlCisgIC8vLyBleHRlcm5hbCBzb3VyY2Ugc3ltYm9sIGF0dHJpYnV0ZS4KKyAgRXh0ZXJuYWxTb3VyY2VTeW1ib2xBdHRyICpnZXRFeHRlcm5hbFNvdXJjZVN5bWJvbEF0dHIoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBkZWNsYXJhdGlvbiB3YXMgbWFya2VkIGFzIGJlaW5nIHByaXZhdGUgdG8gdGhlCisgIC8vLyBtb2R1bGUgaW4gd2hpY2ggaXQgd2FzIGRlZmluZWQuCisgIGJvb2wgaXNNb2R1bGVQcml2YXRlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRNb2R1bGVPd25lcnNoaXBLaW5kKCkgPT0gTW9kdWxlT3duZXJzaGlwS2luZDo6TW9kdWxlUHJpdmF0ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGRlY2xhcmF0aW9uIGlzIGV4cG9ydGVkIChieSB2aXJ0dWUgb2YgYmVpbmcgbGV4aWNhbGx5CisgIC8vLyB3aXRoaW4gYW4gRXhwb3J0RGVjbCBvciBieSBiZWluZyBhIE5hbWVzcGFjZURlY2wpLgorICBib29sIGlzRXhwb3J0ZWQoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBkZWNsYXJhdGlvbiBoYXMgYW4gYXR0cmlidXRlIHdoaWNoIGFjdHMgYXMKKyAgLy8vIGRlZmluaXRpb24gb2YgdGhlIGVudGl0eSwgc3VjaCBhcyAnYWxpYXMnIG9yICdpZnVuYycuCisgIGJvb2wgaGFzRGVmaW5pbmdBdHRyKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGlzIGRlY2xhcmF0aW9uJ3MgZGVmaW5pbmcgYXR0cmlidXRlIGlmIGl0IGhhcyBvbmUuCisgIGNvbnN0IEF0dHIgKmdldERlZmluaW5nQXR0cigpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIC8vLyBcYnJpZWYgU3BlY2lmeSB0aGF0IHRoaXMgZGVjbGFyYXRpb24gd2FzIG1hcmtlZCBhcyBiZWluZyBwcml2YXRlCisgIC8vLyB0byB0aGUgbW9kdWxlIGluIHdoaWNoIGl0IHdhcyBkZWZpbmVkLgorICB2b2lkIHNldE1vZHVsZVByaXZhdGUoKSB7CisgICAgLy8gVGhlIG1vZHVsZS1wcml2YXRlIHNwZWNpZmllciBoYXMgbm8gZWZmZWN0IG9uIHVub3duZWQgZGVjbGFyYXRpb25zLgorICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgdHJhY2sgdGhpcyBpbiBzb21lIHdheSBmb3Igc291cmNlIGZpZGVsaXR5LgorICAgIGlmIChnZXRNb2R1bGVPd25lcnNoaXBLaW5kKCkgPT0gTW9kdWxlT3duZXJzaGlwS2luZDo6VW5vd25lZCkKKyAgICAgIHJldHVybjsKKyAgICBzZXRNb2R1bGVPd25lcnNoaXBLaW5kKE1vZHVsZU93bmVyc2hpcEtpbmQ6Ok1vZHVsZVByaXZhdGUpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIG93bmluZyBtb2R1bGUgSUQuCisgIHZvaWQgc2V0T3duaW5nTW9kdWxlSUQodW5zaWduZWQgSUQpIHsKKyAgICBhc3NlcnQoaXNGcm9tQVNURmlsZSgpICYmICJPbmx5IHdvcmtzIG9uIGEgZGVzZXJpYWxpemVkIGRlY2xhcmF0aW9uIik7CisgICAgKigodW5zaWduZWQqKXRoaXMgLSAyKSA9IElEOworICB9CisgIAorcHVibGljOgorICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBnaXZlbiBkZWNsYXJhdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgd2lsbCBkZXRlcm1pbmUgdGhlIG1vc3QgcmVzdHJpY3RpdmUgYXZhaWxhYmlsaXR5IG9mCisgIC8vLyB0aGUgZ2l2ZW4gZGVjbGFyYXRpb24gKGUuZy4sIHByZWZlcnJpbmcgJ3VuYXZhaWxhYmxlJyB0bworICAvLy8gJ2RlcHJlY2F0ZWQnKS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTWVzc2FnZSBJZiBub24tTlVMTCBhbmQgdGhlIHJlc3VsdCBpcyBub3QgXGMKKyAgLy8vIEFSX0F2YWlsYWJsZSwgd2lsbCBiZSBzZXQgdG8gYSAocG9zc2libHkgZW1wdHkpIG1lc3NhZ2UKKyAgLy8vIGRlc2NyaWJpbmcgd2h5IHRoZSBkZWNsYXJhdGlvbiBoYXMgbm90IGJlZW4gaW50cm9kdWNlZCwgaXMKKyAgLy8vIGRlcHJlY2F0ZWQsIG9yIGlzIHVuYXZhaWxhYmxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBFbmNsb3NpbmdWZXJzaW9uIFRoZSB2ZXJzaW9uIHRvIGNvbXBhcmUgd2l0aC4gSWYgZW1wdHksIGFzc3VtZSB0aGUKKyAgLy8vIGRlcGxveW1lbnQgdGFyZ2V0IHZlcnNpb24uCisgIEF2YWlsYWJpbGl0eVJlc3VsdAorICBnZXRBdmFpbGFiaWxpdHkoc3RkOjpzdHJpbmcgKk1lc3NhZ2UgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgVmVyc2lvblR1cGxlIEVuY2xvc2luZ1ZlcnNpb24gPSBWZXJzaW9uVHVwbGUoKSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdmVyc2lvbiBvZiB0aGUgdGFyZ2V0IHBsYXRmb3JtIGluIHdoaWNoIHRoaXMKKyAgLy8vIGRlY2xhcmF0aW9uIHdhcyBpbnRyb2R1Y2VkLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIEFuIGVtcHR5IHZlcnNpb24gdHVwbGUgaWYgdGhpcyBkZWNsYXJhdGlvbiBoYXMgbm8gJ2ludHJvZHVjZWQnCisgIC8vLyBhdmFpbGFiaWxpdHkgYXR0cmlidXRlcywgb3IgdGhlIHZlcnNpb24gdHVwbGUgdGhhdCdzIHNwZWNpZmllZCBpbiB0aGUKKyAgLy8vIGF0dHJpYnV0ZSBvdGhlcndpc2UuCisgIFZlcnNpb25UdXBsZSBnZXRWZXJzaW9uSW50cm9kdWNlZCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBkZWNsYXJhdGlvbiBpcyBtYXJrZWQgJ2RlcHJlY2F0ZWQnLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNZXNzYWdlIElmIG5vbi1OVUxMIGFuZCB0aGUgZGVjbGFyYXRpb24gaXMgZGVwcmVjYXRlZCwKKyAgLy8vIHRoaXMgd2lsbCBiZSBzZXQgdG8gdGhlIG1lc3NhZ2UgZGVzY3JpYmluZyB3aHkgdGhlIGRlY2xhcmF0aW9uCisgIC8vLyB3YXMgZGVwcmVjYXRlZCAod2hpY2ggbWF5IGJlIGVtcHR5KS4KKyAgYm9vbCBpc0RlcHJlY2F0ZWQoc3RkOjpzdHJpbmcgKk1lc3NhZ2UgPSBudWxscHRyKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEF2YWlsYWJpbGl0eShNZXNzYWdlKSA9PSBBUl9EZXByZWNhdGVkOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGRlY2xhcmF0aW9uIGlzIG1hcmtlZCAndW5hdmFpbGFibGUnLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNZXNzYWdlIElmIG5vbi1OVUxMIGFuZCB0aGUgZGVjbGFyYXRpb24gaXMgdW5hdmFpbGFibGUsCisgIC8vLyB0aGlzIHdpbGwgYmUgc2V0IHRvIHRoZSBtZXNzYWdlIGRlc2NyaWJpbmcgd2h5IHRoZSBkZWNsYXJhdGlvbgorICAvLy8gd2FzIG1hZGUgdW5hdmFpbGFibGUgKHdoaWNoIG1heSBiZSBlbXB0eSkuCisgIGJvb2wgaXNVbmF2YWlsYWJsZShzdGQ6OnN0cmluZyAqTWVzc2FnZSA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QXZhaWxhYmlsaXR5KE1lc3NhZ2UpID09IEFSX1VuYXZhaWxhYmxlOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgd2Vhay1pbXBvcnRlZCBzeW1ib2wuCisgIC8vLworICAvLy8gV2Vhay1pbXBvcnRlZCBzeW1ib2xzIGFyZSB0eXBpY2FsbHkgbWFya2VkIHdpdGggdGhlCisgIC8vLyAnd2Vha19pbXBvcnQnIGF0dHJpYnV0ZSwgYnV0IG1heSBhbHNvIGJlIG1hcmtlZCB3aXRoIGFuCisgIC8vLyAnYXZhaWxhYmlsaXR5JyBhdHRyaWJ1dGUgd2hlcmUgd2UncmUgdGFyZ2luZyBhIHBsYXRmb3JtIHByaW9yIHRvCisgIC8vLyB0aGUgaW50cm9kdWN0aW9uIG9mIHRoaXMgZmVhdHVyZS4KKyAgYm9vbCBpc1dlYWtJbXBvcnRlZCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgc3ltYm9sIGNhbiBiZSB3ZWFrLWltcG9ydGVkLAorICAvLy8gZS5nLiwgd2hldGhlciBpdCB3b3VsZCBiZSB3ZWxsLWZvcm1lZCB0byBhZGQgdGhlIHdlYWtfaW1wb3J0CisgIC8vLyBhdHRyaWJ1dGUuCisgIC8vLworICAvLy8gXHBhcmFtIElzRGVmaW5pdGlvbiBTZXQgdG8gXGMgdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMKKyAgLy8vIGRlY2xhcmF0aW9uIGNhbm5vdCBiZSB3ZWFrLWltcG9ydGVkIGJlY2F1c2UgaXQgaGFzIGEgZGVmaW5pdGlvbi4KKyAgYm9vbCBjYW5CZVdlYWtJbXBvcnRlZChib29sICZJc0RlZmluaXRpb24pIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBkZWNsYXJhdGlvbiBjYW1lIGZyb20gYW4gQVNUIGZpbGUgKHN1Y2ggYXMKKyAgLy8vIGEgcHJlY29tcGlsZWQgaGVhZGVyIG9yIG1vZHVsZSkgcmF0aGVyIHRoYW4gaGF2aW5nIGJlZW4gcGFyc2VkLgorICBib29sIGlzRnJvbUFTVEZpbGUoKSBjb25zdCB7IHJldHVybiBGcm9tQVNURmlsZTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGdsb2JhbCBkZWNsYXJhdGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcworICAvLy8gZGVjbGFyYXRpb24sIHdoaWNoIHNwZWNpZmllcyB3aGVyZSB0aGlzIERlY2wgd2FzIGxvYWRlZCBmcm9tLgorICB1bnNpZ25lZCBnZXRHbG9iYWxJRCgpIGNvbnN0IHsKKyAgICBpZiAoaXNGcm9tQVNURmlsZSgpKQorICAgICAgcmV0dXJuICooKGNvbnN0IHVuc2lnbmVkKil0aGlzIC0gMSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBnbG9iYWwgSUQgb2YgdGhlIG1vZHVsZSB0aGF0IG93bnMgdGhpcyBwYXJ0aWN1bGFyCisgIC8vLyBkZWNsYXJhdGlvbi4KKyAgdW5zaWduZWQgZ2V0T3duaW5nTW9kdWxlSUQoKSBjb25zdCB7CisgICAgaWYgKGlzRnJvbUFTVEZpbGUoKSkKKyAgICAgIHJldHVybiAqKChjb25zdCB1bnNpZ25lZCopdGhpcyAtIDIpOworICAgIHJldHVybiAwOworICB9CisKK3ByaXZhdGU6CisgIE1vZHVsZSAqZ2V0T3duaW5nTW9kdWxlU2xvdygpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIGJvb2wgaGFzTG9jYWxPd25pbmdNb2R1bGVTdG9yYWdlKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBHZXQgdGhlIGltcG9ydGVkIG93bmluZyBtb2R1bGUsIGlmIHRoaXMgZGVjbCBpcyBmcm9tIGFuIGltcG9ydGVkCisgIC8vLyAobm9uLWxvY2FsKSBtb2R1bGUuCisgIE1vZHVsZSAqZ2V0SW1wb3J0ZWRPd25pbmdNb2R1bGUoKSBjb25zdCB7CisgICAgaWYgKCFpc0Zyb21BU1RGaWxlKCkgfHwgIWhhc093bmluZ01vZHVsZSgpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICByZXR1cm4gZ2V0T3duaW5nTW9kdWxlU2xvdygpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGxvY2FsIG93bmluZyBtb2R1bGUsIGlmIGtub3duLiBSZXR1cm5zIG51bGxwdHIgaWYgb3duZXIgaXMKKyAgLy8vIG5vdCB5ZXQga25vd24gb3IgZGVjbGFyYXRpb24gaXMgbm90IGZyb20gYSBtb2R1bGUuCisgIE1vZHVsZSAqZ2V0TG9jYWxPd25pbmdNb2R1bGUoKSBjb25zdCB7CisgICAgaWYgKGlzRnJvbUFTVEZpbGUoKSB8fCAhaGFzT3duaW5nTW9kdWxlKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIGFzc2VydChoYXNMb2NhbE93bmluZ01vZHVsZVN0b3JhZ2UoKSAmJgorICAgICAgICAgICAib3duZWQgbG9jYWwgZGVjbCBidXQgbm8gbG9jYWwgbW9kdWxlIHN0b3JhZ2UiKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxNb2R1bGUgKmNvbnN0ICo+KHRoaXMpWy0xXTsKKyAgfQorICB2b2lkIHNldExvY2FsT3duaW5nTW9kdWxlKE1vZHVsZSAqTSkgeworICAgIGFzc2VydCghaXNGcm9tQVNURmlsZSgpICYmIGhhc093bmluZ01vZHVsZSgpICYmCisgICAgICAgICAgIGhhc0xvY2FsT3duaW5nTW9kdWxlU3RvcmFnZSgpICYmCisgICAgICAgICAgICJzaG91bGQgbm90IGhhdmUgYSBjYWNoZWQgb3duaW5nIG1vZHVsZSIpOworICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TW9kdWxlICoqPih0aGlzKVstMV0gPSBNOworICB9CisKKyAgLy8vIElzIHRoaXMgZGVjbGFyYXRpb24gb3duZWQgYnkgc29tZSBtb2R1bGU/CisgIGJvb2wgaGFzT3duaW5nTW9kdWxlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRNb2R1bGVPd25lcnNoaXBLaW5kKCkgIT0gTW9kdWxlT3duZXJzaGlwS2luZDo6VW5vd25lZDsKKyAgfQorCisgIC8vLyBHZXQgdGhlIG1vZHVsZSB0aGF0IG93bnMgdGhpcyBkZWNsYXJhdGlvbiAoZm9yIHZpc2liaWxpdHkgcHVycG9zZXMpLgorICBNb2R1bGUgKmdldE93bmluZ01vZHVsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNGcm9tQVNURmlsZSgpID8gZ2V0SW1wb3J0ZWRPd25pbmdNb2R1bGUoKSA6IGdldExvY2FsT3duaW5nTW9kdWxlKCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBtb2R1bGUgdGhhdCBvd25zIHRoaXMgZGVjbGFyYXRpb24gZm9yIGxpbmthZ2UgcHVycG9zZXMuCisgIC8vLyBUaGVyZSBvbmx5IGV2ZXIgaXMgc3VjaCBhIG1vZHVsZSB1bmRlciB0aGUgQysrIE1vZHVsZXMgVFMuCisgIC8vLworICAvLy8gXHBhcmFtIElnbm9yZUxpbmthZ2UgSWdub3JlIHRoZSBsaW5rYWdlIG9mIHRoZSBlbnRpdHk7IGFzc3VtZSB0aGF0CisgIC8vLyBhbGwgZGVjbGFyYXRpb25zIGluIGEgZ2xvYmFsIG1vZHVsZSBmcmFnbWVudCBhcmUgdW5vd25lZC4KKyAgTW9kdWxlICpnZXRPd25pbmdNb2R1bGVGb3JMaW5rYWdlKGJvb2wgSWdub3JlTGlua2FnZSA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gbWlnaHQgYmUgaGlkZGVuIGZyb20gbmFtZQorICAvLy8gbG9va3VwLiBOb3RlIHRoYXQgdGhlIGRlY2xhcmF0aW9uIG1pZ2h0IGJlIHZpc2libGUgZXZlbiBpZiB0aGlzIHJldHVybnMKKyAgLy8vIFxjIGZhbHNlLCBpZiB0aGUgb3duaW5nIG1vZHVsZSBpcyB2aXNpYmxlIHdpdGhpbiB0aGUgcXVlcnkgY29udGV4dC4KKyAgLy8gRklYTUU6IFJlbmFtZSB0aGlzIHRvIG1ha2UgaXQgY2xlYXJlciB3aGF0IGl0IGRvZXMuCisgIGJvb2wgaXNIaWRkZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIChpbnQpZ2V0TW9kdWxlT3duZXJzaGlwS2luZCgpID4gKGludClNb2R1bGVPd25lcnNoaXBLaW5kOjpWaXNpYmxlOworICB9CisKKyAgLy8vIFNldCB0aGF0IHRoaXMgZGVjbGFyYXRpb24gaXMgZ2xvYmFsbHkgdmlzaWJsZSwgZXZlbiBpZiBpdCBjYW1lIGZyb20gYQorICAvLy8gbW9kdWxlIHRoYXQgaXMgbm90IHZpc2libGUuCisgIHZvaWQgc2V0VmlzaWJsZURlc3BpdGVPd25pbmdNb2R1bGUoKSB7CisgICAgaWYgKGlzSGlkZGVuKCkpCisgICAgICBzZXRNb2R1bGVPd25lcnNoaXBLaW5kKE1vZHVsZU93bmVyc2hpcEtpbmQ6OlZpc2libGUpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGtpbmQgb2YgbW9kdWxlIG93bmVyc2hpcCBmb3IgdGhpcyBkZWNsYXJhdGlvbi4KKyAgTW9kdWxlT3duZXJzaGlwS2luZCBnZXRNb2R1bGVPd25lcnNoaXBLaW5kKCkgY29uc3QgeworICAgIHJldHVybiBOZXh0SW5Db250ZXh0QW5kQml0cy5nZXRJbnQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHdoZXRoZXIgdGhpcyBkZWNsYXJhdGlvbiBpcyBoaWRkZW4gZnJvbSBuYW1lIGxvb2t1cC4KKyAgdm9pZCBzZXRNb2R1bGVPd25lcnNoaXBLaW5kKE1vZHVsZU93bmVyc2hpcEtpbmQgTU9LKSB7CisgICAgYXNzZXJ0KCEoZ2V0TW9kdWxlT3duZXJzaGlwS2luZCgpID09IE1vZHVsZU93bmVyc2hpcEtpbmQ6OlVub3duZWQgJiYKKyAgICAgICAgICAgICBNT0sgIT0gTW9kdWxlT3duZXJzaGlwS2luZDo6VW5vd25lZCAmJiAhaXNGcm9tQVNURmlsZSgpICYmCisgICAgICAgICAgICAgIWhhc0xvY2FsT3duaW5nTW9kdWxlU3RvcmFnZSgpKSAmJgorICAgICAgICAgICAibm8gc3RvcmFnZSBhdmFpbGFibGUgZm9yIG93bmluZyBtb2R1bGUgZm9yIHRoaXMgZGVjbGFyYXRpb24iKTsKKyAgICBOZXh0SW5Db250ZXh0QW5kQml0cy5zZXRJbnQoTU9LKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldElkZW50aWZpZXJOYW1lc3BhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIElkZW50aWZpZXJOYW1lc3BhY2U7CisgIH0KKworICBib29sIGlzSW5JZGVudGlmaWVyTmFtZXNwYWNlKHVuc2lnbmVkIE5TKSBjb25zdCB7CisgICAgcmV0dXJuIGdldElkZW50aWZpZXJOYW1lc3BhY2UoKSAmIE5TOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldElkZW50aWZpZXJOYW1lc3BhY2VGb3JLaW5kKEtpbmQgREspOworCisgIGJvb2wgaGFzVGFnSWRlbnRpZmllck5hbWVzcGFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNUYWdJZGVudGlmaWVyTmFtZXNwYWNlKGdldElkZW50aWZpZXJOYW1lc3BhY2UoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc1RhZ0lkZW50aWZpZXJOYW1lc3BhY2UodW5zaWduZWQgTlMpIHsKKyAgICAvLyBUYWdEZWNscyBoYXZlIFRhZyBhbmQgVHlwZSBzZXQgYW5kIG1heSBhbHNvIGhhdmUgVGFnRnJpZW5kLgorICAgIHJldHVybiAoTlMgJiB+SUROU19UYWdGcmllbmQpID09IChJRE5TX1RhZyB8IElETlNfVHlwZSk7CisgIH0KKworICAvLy8gZ2V0TGV4aWNhbERlY2xDb250ZXh0IC0gVGhlIGRlY2xhcmF0aW9uIGNvbnRleHQgd2hlcmUgdGhpcyBEZWNsIHdhcworICAvLy8gbGV4aWNhbGx5IGRlY2xhcmVkIChMZXhpY2FsREMpLiBNYXkgYmUgZGlmZmVyZW50IGZyb20KKyAgLy8vIGdldERlY2xDb250ZXh0KCkgKFNlbWFudGljREMpLgorICAvLy8gZS5nLjoKKyAgLy8vCisgIC8vLyAgIG5hbWVzcGFjZSBBIHsKKyAgLy8vICAgICAgdm9pZCBmKCk7IC8vIFNlbWFudGljREMgPT0gTGV4aWNhbERDID09ICduYW1lc3BhY2UgQScKKyAgLy8vICAgfQorICAvLy8gICB2b2lkIEE6OmYoKTsgLy8gU2VtYW50aWNEQyA9PSBuYW1lc3BhY2UgJ0EnCisgIC8vLyAgICAgICAgICAgICAgICAvLyBMZXhpY2FsREMgPT0gZ2xvYmFsIG5hbWVzcGFjZQorICBEZWNsQ29udGV4dCAqZ2V0TGV4aWNhbERlY2xDb250ZXh0KCkgeworICAgIGlmIChpc0luU2VtYURDKCkpCisgICAgICByZXR1cm4gZ2V0U2VtYW50aWNEQygpOworICAgIHJldHVybiBnZXRNdWx0aXBsZURDKCktPkxleGljYWxEQzsKKyAgfQorICBjb25zdCBEZWNsQ29udGV4dCAqZ2V0TGV4aWNhbERlY2xDb250ZXh0KCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PERlY2wqPih0aGlzKS0+Z2V0TGV4aWNhbERlY2xDb250ZXh0KCk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBkZWNsYXJhdGlvbiBpcyBkZWNsYXJlZCBvdXQgb2YgbGluZSAob3V0c2lkZSBpdHMKKyAgLy8vIHNlbWFudGljIGNvbnRleHQpLgorICB2aXJ0dWFsIGJvb2wgaXNPdXRPZkxpbmUoKSBjb25zdDsKKworICAvLy8gc2V0RGVjbENvbnRleHQgLSBTZXQgYm90aCB0aGUgc2VtYW50aWMgYW5kIGxleGljYWwgRGVjbENvbnRleHQKKyAgLy8vIHRvIERDLgorICB2b2lkIHNldERlY2xDb250ZXh0KERlY2xDb250ZXh0ICpEQyk7CisKKyAgdm9pZCBzZXRMZXhpY2FsRGVjbENvbnRleHQoRGVjbENvbnRleHQgKkRDKTsKKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBkZWNsYXJhdGlvbiBpcyBhIHRlbXBsYXRlZCBlbnRpdHkgKHdoZXRoZXIgaXQgaXMKKyAgLy8gd2l0aGluIHRoZSBzY29wZSBvZiBhIHRlbXBsYXRlIHBhcmFtZXRlcikuCisgIGJvb2wgaXNUZW1wbGF0ZWQoKSBjb25zdDsKKworICAvLy8gaXNEZWZpbmVkT3V0c2lkZUZ1bmN0aW9uT3JNZXRob2QgLSBUaGlzIHByZWRpY2F0ZSByZXR1cm5zIHRydWUgaWYgdGhpcworICAvLy8gc2NvcGVkIGRlY2wgaXMgZGVmaW5lZCBvdXRzaWRlIHRoZSBjdXJyZW50IGZ1bmN0aW9uIG9yIG1ldGhvZC4gIFRoaXMgaXMKKyAgLy8vIHJvdWdobHkgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zLCBidXQgYWxzbyBoYW5kbGVzIGVudW1zICh3aGljaAorICAvLy8gY291bGQgYmUgZGVmaW5lZCBpbnNpZGUgb3Igb3V0c2lkZSBhIGZ1bmN0aW9uIGV0YykuCisgIGJvb2wgaXNEZWZpbmVkT3V0c2lkZUZ1bmN0aW9uT3JNZXRob2QoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFBhcmVudEZ1bmN0aW9uT3JNZXRob2QoKSA9PSBudWxscHRyOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBkZWNsYXJhdGlvbiBsZXhpY2FsbHkgaXMgaW5zaWRlIGEgZnVuY3Rpb24uCisgIC8vLyBJdCByZWNvZ25pemVzIG5vbi1kZWZpbmluZyBkZWNsYXJhdGlvbnMgYXMgd2VsbCBhcyBtZW1iZXJzIG9mIGxvY2FsCisgIC8vLyBjbGFzc2VzOgorICAvLy8gXGNvZGUKKyAgLy8vICAgICB2b2lkIGZvbygpIHsgdm9pZCBiYXIoKTsgfQorICAvLy8gICAgIHZvaWQgZm9vMigpIHsgY2xhc3MgQUJDIHsgdm9pZCBiYXIoKTsgfTsgfQorICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBpc0xleGljYWxseVdpdGhpbkZ1bmN0aW9uT3JNZXRob2QoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIElmIHRoaXMgZGVjbCBpcyBkZWZpbmVkIGluc2lkZSBhIGZ1bmN0aW9uL21ldGhvZC9ibG9jayBpdCByZXR1cm5zCisgIC8vLyB0aGUgY29ycmVzcG9uZGluZyBEZWNsQ29udGV4dCwgb3RoZXJ3aXNlIGl0IHJldHVybnMgbnVsbC4KKyAgY29uc3QgRGVjbENvbnRleHQgKmdldFBhcmVudEZ1bmN0aW9uT3JNZXRob2QoKSBjb25zdDsKKyAgRGVjbENvbnRleHQgKmdldFBhcmVudEZ1bmN0aW9uT3JNZXRob2QoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RGVjbENvbnRleHQqPigKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjb25zdCBEZWNsKj4odGhpcyktPmdldFBhcmVudEZ1bmN0aW9uT3JNZXRob2QoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlcyB0aGUgImNhbm9uaWNhbCIgZGVjbGFyYXRpb24gb2YgdGhlIGdpdmVuIGRlY2xhcmF0aW9uLgorICB2aXJ0dWFsIERlY2wgKmdldENhbm9uaWNhbERlY2woKSB7IHJldHVybiB0aGlzOyB9CisgIGNvbnN0IERlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RGVjbCo+KHRoaXMpLT5nZXRDYW5vbmljYWxEZWNsKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBwYXJ0aWN1bGFyIERlY2wgaXMgYSBjYW5vbmljYWwgb25lLgorICBib29sIGlzQ2Fub25pY2FsRGVjbCgpIGNvbnN0IHsgcmV0dXJuIGdldENhbm9uaWNhbERlY2woKSA9PSB0aGlzOyB9CisgIAorcHJvdGVjdGVkOgorICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG5leHQgcmVkZWNsYXJhdGlvbiBvciBpdHNlbGYgaWYgdGhpcyBpcyB0aGUgb25seSBkZWNsLgorICAvLy8KKyAgLy8vIERlY2wgc3ViY2xhc3NlcyB0aGF0IGNhbiBiZSByZWRlY2xhcmVkIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBzbyB0aGF0CisgIC8vLyBEZWNsOjpyZWRlY2xfaXRlcmF0b3IgY2FuIGl0ZXJhdGUgb3ZlciB0aGVtLgorICB2aXJ0dWFsIERlY2wgKmdldE5leHRSZWRlY2xhcmF0aW9uSW1wbCgpIHsgcmV0dXJuIHRoaXM7IH0KKworICAvLy8gXGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIGdldFByZXZpb3VzRGVjbCgpLCB0byBiZSBvdmVycmlkZGVuIGJ5IGFueQorICAvLy8gc3ViY2xhc3MgdGhhdCBoYXMgYSByZWRlY2xhcmF0aW9uIGNoYWluLgorICB2aXJ0dWFsIERlY2wgKmdldFByZXZpb3VzRGVjbEltcGwoKSB7IHJldHVybiBudWxscHRyOyB9CisKKyAgLy8vIFxicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBnZXRNb3N0UmVjZW50RGVjbCgpLCB0byBiZSBvdmVycmlkZGVuIGJ5IGFueQorICAvLy8gc3ViY2xhc3MgdGhhdCBoYXMgYSByZWRlY2xhcmF0aW9uIGNoYWluLgorICB2aXJ0dWFsIERlY2wgKmdldE1vc3RSZWNlbnREZWNsSW1wbCgpIHsgcmV0dXJuIHRoaXM7IH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIEl0ZXJhdGVzIHRocm91Z2ggYWxsIHRoZSByZWRlY2xhcmF0aW9ucyBvZiB0aGUgc2FtZSBkZWNsLgorICBjbGFzcyByZWRlY2xfaXRlcmF0b3IgeworICAgIC8vLyBDdXJyZW50IC0gVGhlIGN1cnJlbnQgZGVjbGFyYXRpb24uCisgICAgRGVjbCAqQ3VycmVudCA9IG51bGxwdHI7CisgICAgRGVjbCAqU3RhcnRlcjsKKworICBwdWJsaWM6CisgICAgdXNpbmcgdmFsdWVfdHlwZSA9IERlY2wgKjsKKyAgICB1c2luZyByZWZlcmVuY2UgPSBjb25zdCB2YWx1ZV90eXBlICY7CisgICAgdXNpbmcgcG9pbnRlciA9IGNvbnN0IHZhbHVlX3R5cGUgKjsKKyAgICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc7CisgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gc3RkOjpwdHJkaWZmX3Q7CisKKyAgICByZWRlY2xfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgICAgZXhwbGljaXQgcmVkZWNsX2l0ZXJhdG9yKERlY2wgKkMpIDogQ3VycmVudChDKSwgU3RhcnRlcihDKSB7fQorCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIEN1cnJlbnQ7IH0KKyAgICB2YWx1ZV90eXBlIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBDdXJyZW50OyB9CisKKyAgICByZWRlY2xfaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgICBhc3NlcnQoQ3VycmVudCAmJiAiQWR2YW5jaW5nIHdoaWxlIGl0ZXJhdG9yIGhhcyByZWFjaGVkIGVuZCIpOworICAgICAgLy8gR2V0IGVpdGhlciBwcmV2aW91cyBkZWNsIG9yIGxhdGVzdCBkZWNsLgorICAgICAgRGVjbCAqTmV4dCA9IEN1cnJlbnQtPmdldE5leHRSZWRlY2xhcmF0aW9uSW1wbCgpOworICAgICAgYXNzZXJ0KE5leHQgJiYgIlNob3VsZCByZXR1cm4gbmV4dCByZWRlY2xhcmF0aW9uIG9yIGl0c2VsZiwgbmV2ZXIgbnVsbCEiKTsKKyAgICAgIEN1cnJlbnQgPSAoTmV4dCAhPSBTdGFydGVyKSA/IE5leHQgOiBudWxscHRyOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHJlZGVjbF9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgICAgcmVkZWNsX2l0ZXJhdG9yIHRtcCgqdGhpcyk7CisgICAgICArKygqdGhpcyk7CisgICAgICByZXR1cm4gdG1wOworICAgIH0KKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0ocmVkZWNsX2l0ZXJhdG9yIHgsIHJlZGVjbF9pdGVyYXRvciB5KSB7CisgICAgICByZXR1cm4geC5DdXJyZW50ID09IHkuQ3VycmVudDsKKyAgICB9CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KHJlZGVjbF9pdGVyYXRvciB4LCByZWRlY2xfaXRlcmF0b3IgeSkgeworICAgICAgcmV0dXJuIHguQ3VycmVudCAhPSB5LkN1cnJlbnQ7CisgICAgfQorICB9OworCisgIHVzaW5nIHJlZGVjbF9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPHJlZGVjbF9pdGVyYXRvcj47CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGFuIGl0ZXJhdG9yIHJhbmdlIGZvciBhbGwgdGhlIHJlZGVjbGFyYXRpb25zIG9mIHRoZSBzYW1lCisgIC8vLyBkZWNsLiBJdCB3aWxsIGl0ZXJhdGUgYXQgbGVhc3Qgb25jZSAod2hlbiB0aGlzIGRlY2wgaXMgdGhlIG9ubHkgb25lKS4KKyAgcmVkZWNsX3JhbmdlIHJlZGVjbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlZGVjbF9yYW5nZShyZWRlY2xzX2JlZ2luKCksIHJlZGVjbHNfZW5kKCkpOworICB9CisKKyAgcmVkZWNsX2l0ZXJhdG9yIHJlZGVjbHNfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIHJlZGVjbF9pdGVyYXRvcihjb25zdF9jYXN0PERlY2wgKj4odGhpcykpOworICB9CisKKyAgcmVkZWNsX2l0ZXJhdG9yIHJlZGVjbHNfZW5kKCkgY29uc3QgeyByZXR1cm4gcmVkZWNsX2l0ZXJhdG9yKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBwcmV2aW91cyBkZWNsYXJhdGlvbiB0aGF0IGRlY2xhcmVzIHRoZSBzYW1lIGVudGl0eQorICAvLy8gYXMgdGhpcyBkZWNsYXJhdGlvbiwgb3IgTlVMTCBpZiB0aGVyZSBpcyBubyBwcmV2aW91cyBkZWNsYXJhdGlvbi4KKyAgRGVjbCAqZ2V0UHJldmlvdXNEZWNsKCkgeyByZXR1cm4gZ2V0UHJldmlvdXNEZWNsSW1wbCgpOyB9CisgIAorICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtb3N0IHJlY2VudCBkZWNsYXJhdGlvbiB0aGF0IGRlY2xhcmVzIHRoZSBzYW1lIGVudGl0eQorICAvLy8gYXMgdGhpcyBkZWNsYXJhdGlvbiwgb3IgTlVMTCBpZiB0aGVyZSBpcyBubyBwcmV2aW91cyBkZWNsYXJhdGlvbi4KKyAgY29uc3QgRGVjbCAqZ2V0UHJldmlvdXNEZWNsKCkgY29uc3QgeyAKKyAgICByZXR1cm4gY29uc3RfY2FzdDxEZWNsICo+KHRoaXMpLT5nZXRQcmV2aW91c0RlY2xJbXBsKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBpcyB0aGUgZmlyc3QgZGVjbGFyYXRpb24gaW4gaXRzIHJlZGVjbGFyYXRpb24gY2hhaW4uCisgIGJvb2wgaXNGaXJzdERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFByZXZpb3VzRGVjbCgpID09IG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtb3N0IHJlY2VudCBkZWNsYXJhdGlvbiB0aGF0IGRlY2xhcmVzIHRoZSBzYW1lIGVudGl0eQorICAvLy8gYXMgdGhpcyBkZWNsYXJhdGlvbiAod2hpY2ggbWF5IGJlIHRoaXMgZGVjbGFyYXRpb24pLgorICBEZWNsICpnZXRNb3N0UmVjZW50RGVjbCgpIHsgcmV0dXJuIGdldE1vc3RSZWNlbnREZWNsSW1wbCgpOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbW9zdCByZWNlbnQgZGVjbGFyYXRpb24gdGhhdCBkZWNsYXJlcyB0aGUgc2FtZSBlbnRpdHkKKyAgLy8vIGFzIHRoaXMgZGVjbGFyYXRpb24gKHdoaWNoIG1heSBiZSB0aGlzIGRlY2xhcmF0aW9uKS4KKyAgY29uc3QgRGVjbCAqZ2V0TW9zdFJlY2VudERlY2woKSBjb25zdCB7IAorICAgIHJldHVybiBjb25zdF9jYXN0PERlY2wgKj4odGhpcyktPmdldE1vc3RSZWNlbnREZWNsSW1wbCgpOworICB9CisKKyAgLy8vIGdldEJvZHkgLSBJZiB0aGlzIERlY2wgcmVwcmVzZW50cyBhIGRlY2xhcmF0aW9uIGZvciBhIGJvZHkgb2YgY29kZSwKKyAgLy8vICBzdWNoIGFzIGEgZnVuY3Rpb24gb3IgbWV0aG9kIGRlZmluaXRpb24sIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlCisgIC8vLyAgdG9wLWxldmVsIFN0bXQqIG9mIHRoYXQgYm9keS4gIE90aGVyd2lzZSB0aGlzIG1ldGhvZCByZXR1cm5zIG51bGwuCisgIHZpcnR1YWwgU3RtdCogZ2V0Qm9keSgpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIFxjIERlY2wgcmVwcmVzZW50cyBhIGRlY2xhcmF0aW9uIGZvciBhIGJvZHkgb2YKKyAgLy8vIGNvZGUsIHN1Y2ggYXMgYSBmdW5jdGlvbiBvciBtZXRob2QgZGVmaW5pdGlvbi4KKyAgLy8vIE5vdGUgdGhhdCBcYyBoYXNCb2R5IGNhbiBhbHNvIHJldHVybiB0cnVlIGlmIGFueSByZWRlY2xhcmF0aW9uIG9mIHRoaXMKKyAgLy8vIFxjIERlY2wgcmVwcmVzZW50cyBhIGRlY2xhcmF0aW9uIGZvciBhIGJvZHkgb2YgY29kZS4KKyAgdmlydHVhbCBib29sIGhhc0JvZHkoKSBjb25zdCB7IHJldHVybiBnZXRCb2R5KCkgIT0gbnVsbHB0cjsgfQorCisgIC8vLyBnZXRCb2R5UkJyYWNlIC0gR2V0cyB0aGUgcmlnaHQgYnJhY2Ugb2YgdGhlIGJvZHksIGlmIGEgYm9keSBleGlzdHMuCisgIC8vLyBUaGlzIHdvcmtzIHdoZXRoZXIgdGhlIGJvZHkgaXMgYSBDb21wb3VuZFN0bXQgb3IgYSBDWFhUcnlTdG10LgorICBTb3VyY2VMb2NhdGlvbiBnZXRCb2R5UkJyYWNlKCkgY29uc3Q7CisKKyAgLy8gZ2xvYmFsIHRlbXAgc3RhdHMgKHVudGlsIHdlIGhhdmUgYSBwZXItbW9kdWxlIHZpc2l0b3IpCisgIHN0YXRpYyB2b2lkIGFkZChLaW5kIGspOworICBzdGF0aWMgdm9pZCBFbmFibGVTdGF0aXN0aWNzKCk7CisgIHN0YXRpYyB2b2lkIFByaW50U3RhdHMoKTsKKworICAvLy8gaXNUZW1wbGF0ZVBhcmFtZXRlciAtIERldGVybWluZXMgd2hldGhlciB0aGlzIGRlY2xhcmF0aW9uIGlzIGEKKyAgLy8vIHRlbXBsYXRlIHBhcmFtZXRlci4KKyAgYm9vbCBpc1RlbXBsYXRlUGFyYW1ldGVyKCkgY29uc3Q7CisKKyAgLy8vIGlzVGVtcGxhdGVQYXJhbWV0ZXIgLSBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBkZWNsYXJhdGlvbiBpcyBhCisgIC8vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgcGFjay4KKyAgYm9vbCBpc1RlbXBsYXRlUGFyYW1ldGVyUGFjaygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGRlY2xhcmF0aW9uIGlzIGEgcGFyYW1ldGVyIHBhY2suCisgIGJvb2wgaXNQYXJhbWV0ZXJQYWNrKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiByZXR1cm5zIHRydWUgaWYgdGhpcyBkZWNsYXJhdGlvbiBpcyBhIHRlbXBsYXRlCisgIGJvb2wgaXNUZW1wbGF0ZURlY2woKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBkZWNsYXJhdGlvbiBpcyBhIGZ1bmN0aW9uIG9yIGZ1bmN0aW9uIHRlbXBsYXRlLgorICBib29sIGlzRnVuY3Rpb25PckZ1bmN0aW9uVGVtcGxhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIChEZWNsS2luZCA+PSBEZWNsOjpmaXJzdEZ1bmN0aW9uICYmCisgICAgICAgICAgICBEZWNsS2luZCA8PSBEZWNsOjpsYXN0RnVuY3Rpb24pIHx8CisgICAgICAgICAgIERlY2xLaW5kID09IEZ1bmN0aW9uVGVtcGxhdGU7CisgIH0KKworICAvLy8gXGJyaWVmIElmIHRoaXMgaXMgYSBkZWNsYXJhdGlvbiB0aGF0IGRlc2NyaWJlcyBzb21lIHRlbXBsYXRlLCB0aGlzCisgIC8vLyBtZXRob2QgcmV0dXJucyB0aGF0IHRlbXBsYXRlIGRlY2xhcmF0aW9uLgorICBUZW1wbGF0ZURlY2wgKmdldERlc2NyaWJlZFRlbXBsYXRlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBmdW5jdGlvbiBpdHNlbGYsIG9yIHRoZSB0ZW1wbGF0ZWQgZnVuY3Rpb24gaWYgdGhpcyBpcyBhCisgIC8vLyBmdW5jdGlvbiB0ZW1wbGF0ZS4KKyAgRnVuY3Rpb25EZWNsICpnZXRBc0Z1bmN0aW9uKCkgTExWTV9SRUFET05MWTsKKworICBjb25zdCBGdW5jdGlvbkRlY2wgKmdldEFzRnVuY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RGVjbCAqPih0aGlzKS0+Z2V0QXNGdW5jdGlvbigpOworICB9CisKKyAgLy8vIFxicmllZiBDaGFuZ2VzIHRoZSBuYW1lc3BhY2Ugb2YgdGhpcyBkZWNsYXJhdGlvbiB0byByZWZsZWN0IHRoYXQgaXQncworICAvLy8gYSBmdW5jdGlvbi1sb2NhbCBleHRlcm4gZGVjbGFyYXRpb24uCisgIC8vLworICAvLy8gVGhlc2UgZGVjbGFyYXRpb25zIGFwcGVhciBpbiB0aGUgbGV4aWNhbCBjb250ZXh0IG9mIHRoZSBleHRlcm4KKyAgLy8vIGRlY2xhcmF0aW9uLCBidXQgaW4gdGhlIHNlbWFudGljIGNvbnRleHQgb2YgdGhlIGVuY2xvc2luZyBuYW1lc3BhY2UKKyAgLy8vIHNjb3BlLgorICB2b2lkIHNldExvY2FsRXh0ZXJuRGVjbCgpIHsKKyAgICBEZWNsICpQcmV2ID0gZ2V0UHJldmlvdXNEZWNsKCk7CisgICAgSWRlbnRpZmllck5hbWVzcGFjZSAmPSB+SUROU19PcmRpbmFyeTsKKworICAgIC8vIEl0J3MgT0sgZm9yIHRoZSBkZWNsYXJhdGlvbiB0byBzdGlsbCBoYXZlIHRoZSAiaW52aXNpYmxlIGZyaWVuZCIgZmxhZyBvcgorICAgIC8vIHRoZSAiY29uZmxpY3RzIHdpdGggdGFnIGRlY2xhcmF0aW9ucyBpbiB0aGlzIHNjb3BlIiBmbGFnIGZvciB0aGUgb3V0ZXIKKyAgICAvLyBzY29wZS4KKyAgICBhc3NlcnQoKElkZW50aWZpZXJOYW1lc3BhY2UgJiB+KElETlNfT3JkaW5hcnlGcmllbmQgfCBJRE5TX1RhZykpID09IDAgJiYKKyAgICAgICAgICAgIm5hbWVzcGFjZSBpcyBub3Qgb3JkaW5hcnkiKTsKKworICAgIElkZW50aWZpZXJOYW1lc3BhY2UgfD0gSUROU19Mb2NhbEV4dGVybjsKKyAgICBpZiAoUHJldiAmJiBQcmV2LT5nZXRJZGVudGlmaWVyTmFtZXNwYWNlKCkgJiBJRE5TX09yZGluYXJ5KQorICAgICAgSWRlbnRpZmllck5hbWVzcGFjZSB8PSBJRE5TX09yZGluYXJ5OworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgYmxvY2stc2NvcGUgZGVjbGFyYXRpb24gd2l0aCBsaW5rYWdlLgorICAvLy8gVGhpcyB3aWxsIGVpdGhlciBiZSBhIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGRlY2xhcmVkICdleHRlcm4nLCBvciBhCisgIC8vLyBsb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KKyAgYm9vbCBpc0xvY2FsRXh0ZXJuRGVjbCgpIHsKKyAgICByZXR1cm4gSWRlbnRpZmllck5hbWVzcGFjZSAmIElETlNfTG9jYWxFeHRlcm47CisgIH0KKworICAvLy8gXGJyaWVmIENoYW5nZXMgdGhlIG5hbWVzcGFjZSBvZiB0aGlzIGRlY2xhcmF0aW9uIHRvIHJlZmxlY3QgdGhhdCBpdCdzCisgIC8vLyB0aGUgb2JqZWN0IG9mIGEgZnJpZW5kIGRlY2xhcmF0aW9uLgorICAvLy8KKyAgLy8vIFRoZXNlIGRlY2xhcmF0aW9ucyBhcHBlYXIgaW4gdGhlIGxleGljYWwgY29udGV4dCBvZiB0aGUgZnJpZW5kaW5nCisgIC8vLyBjbGFzcywgYnV0IGluIHRoZSBzZW1hbnRpYyBjb250ZXh0IG9mIHRoZSBhY3R1YWwgZW50aXR5LiAgVGhpcyBwcm9wZXJ0eQorICAvLy8gYXBwbGllcyBvbmx5IHRvIGEgc3BlY2lmaWMgZGVjbCBvYmplY3Q7ICBvdGhlciByZWRlY2xhcmF0aW9ucyBvZiB0aGUKKyAgLy8vIHNhbWUgZW50aXR5IG1heSBub3QgKGFuZCBwcm9iYWJseSBkb24ndCkgc2hhcmUgdGhpcyBwcm9wZXJ0eS4KKyAgdm9pZCBzZXRPYmplY3RPZkZyaWVuZERlY2woYm9vbCBQZXJmb3JtRnJpZW5kSW5qZWN0aW9uID0gZmFsc2UpIHsKKyAgICB1bnNpZ25lZCBPbGROUyA9IElkZW50aWZpZXJOYW1lc3BhY2U7CisgICAgYXNzZXJ0KChPbGROUyAmIChJRE5TX1RhZyB8IElETlNfT3JkaW5hcnkgfAorICAgICAgICAgICAgICAgICAgICAgSUROU19UYWdGcmllbmQgfCBJRE5TX09yZGluYXJ5RnJpZW5kIHwKKyAgICAgICAgICAgICAgICAgICAgIElETlNfTG9jYWxFeHRlcm4pKSAmJgorICAgICAgICAgICAibmFtZXNwYWNlIGluY2x1ZGVzIG5laXRoZXIgb3JkaW5hcnkgbm9yIHRhZyIpOworICAgIGFzc2VydCghKE9sZE5TICYgfihJRE5TX1RhZyB8IElETlNfT3JkaW5hcnkgfCBJRE5TX1R5cGUgfAorICAgICAgICAgICAgICAgICAgICAgICBJRE5TX1RhZ0ZyaWVuZCB8IElETlNfT3JkaW5hcnlGcmllbmQgfAorICAgICAgICAgICAgICAgICAgICAgICBJRE5TX0xvY2FsRXh0ZXJuKSkgJiYKKyAgICAgICAgICAgIm5hbWVzcGFjZSBpbmNsdWRlcyBvdGhlciB0aGFuIG9yZGluYXJ5IG9yIHRhZyIpOworCisgICAgRGVjbCAqUHJldiA9IGdldFByZXZpb3VzRGVjbCgpOworICAgIElkZW50aWZpZXJOYW1lc3BhY2UgJj0gfihJRE5TX09yZGluYXJ5IHwgSUROU19UYWcgfCBJRE5TX1R5cGUpOworCisgICAgaWYgKE9sZE5TICYgKElETlNfVGFnIHwgSUROU19UYWdGcmllbmQpKSB7CisgICAgICBJZGVudGlmaWVyTmFtZXNwYWNlIHw9IElETlNfVGFnRnJpZW5kOworICAgICAgaWYgKFBlcmZvcm1GcmllbmRJbmplY3Rpb24gfHwKKyAgICAgICAgICAoUHJldiAmJiBQcmV2LT5nZXRJZGVudGlmaWVyTmFtZXNwYWNlKCkgJiBJRE5TX1RhZykpCisgICAgICAgIElkZW50aWZpZXJOYW1lc3BhY2UgfD0gSUROU19UYWcgfCBJRE5TX1R5cGU7CisgICAgfQorCisgICAgaWYgKE9sZE5TICYgKElETlNfT3JkaW5hcnkgfCBJRE5TX09yZGluYXJ5RnJpZW5kIHwgSUROU19Mb2NhbEV4dGVybikpIHsKKyAgICAgIElkZW50aWZpZXJOYW1lc3BhY2UgfD0gSUROU19PcmRpbmFyeUZyaWVuZDsKKyAgICAgIGlmIChQZXJmb3JtRnJpZW5kSW5qZWN0aW9uIHx8CisgICAgICAgICAgKFByZXYgJiYgUHJldi0+Z2V0SWRlbnRpZmllck5hbWVzcGFjZSgpICYgSUROU19PcmRpbmFyeSkpCisgICAgICAgIElkZW50aWZpZXJOYW1lc3BhY2UgfD0gSUROU19PcmRpbmFyeTsKKyAgICB9CisgIH0KKworICBlbnVtIEZyaWVuZE9iamVjdEtpbmQgeworICAgIEZPS19Ob25lLCAgICAgIC8vLzwgTm90IGEgZnJpZW5kIG9iamVjdC4KKyAgICBGT0tfRGVjbGFyZWQsICAvLy88IEEgZnJpZW5kIG9mIGEgcHJldmlvdXNseS1kZWNsYXJlZCBlbnRpdHkuCisgICAgRk9LX1VuZGVjbGFyZWQgLy8vPCBBIGZyaWVuZCBvZiBhIHByZXZpb3VzbHktdW5kZWNsYXJlZCBlbnRpdHkuCisgIH07CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBkZWNsYXJhdGlvbiBpcyB0aGUgb2JqZWN0IG9mIGEKKyAgLy8vIGZyaWVuZCBkZWNsYXJhdGlvbiBhbmQsIGlmIHNvLCB3aGF0IGtpbmQuCisgIC8vLworICAvLy8gVGhlcmUgaXMgY3VycmVudGx5IG5vIGRpcmVjdCB3YXkgdG8gZmluZCB0aGUgYXNzb2NpYXRlZCBGcmllbmREZWNsLgorICBGcmllbmRPYmplY3RLaW5kIGdldEZyaWVuZE9iamVjdEtpbmQoKSBjb25zdCB7CisgICAgdW5zaWduZWQgbWFzayA9CisgICAgICAgIChJZGVudGlmaWVyTmFtZXNwYWNlICYgKElETlNfVGFnRnJpZW5kIHwgSUROU19PcmRpbmFyeUZyaWVuZCkpOworICAgIGlmICghbWFzaykgcmV0dXJuIEZPS19Ob25lOworICAgIHJldHVybiAoSWRlbnRpZmllck5hbWVzcGFjZSAmIChJRE5TX1RhZyB8IElETlNfT3JkaW5hcnkpID8gRk9LX0RlY2xhcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGT0tfVW5kZWNsYXJlZCk7CisgIH0KKworICAvLy8gU3BlY2lmaWVzIHRoYXQgdGhpcyBkZWNsYXJhdGlvbiBpcyBhIEMrKyBvdmVybG9hZGVkIG5vbi1tZW1iZXIuCisgIHZvaWQgc2V0Tm9uTWVtYmVyT3BlcmF0b3IoKSB7CisgICAgYXNzZXJ0KGdldEtpbmQoKSA9PSBGdW5jdGlvbiB8fCBnZXRLaW5kKCkgPT0gRnVuY3Rpb25UZW1wbGF0ZSk7CisgICAgYXNzZXJ0KChJZGVudGlmaWVyTmFtZXNwYWNlICYgSUROU19PcmRpbmFyeSkgJiYKKyAgICAgICAgICAgInZpc2libGUgbm9uLW1lbWJlciBvcGVyYXRvcnMgc2hvdWxkIGJlIGluIG9yZGluYXJ5IG5hbWVzcGFjZSIpOworICAgIElkZW50aWZpZXJOYW1lc3BhY2UgfD0gSUROU19Ob25NZW1iZXJPcGVyYXRvcjsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgRGVjbENvbnRleHQgKmNhc3RUb0RlY2xDb250ZXh0KGNvbnN0IERlY2wgKik7CisgIHN0YXRpYyBEZWNsICpjYXN0RnJvbURlY2xDb250ZXh0KGNvbnN0IERlY2xDb250ZXh0ICopOworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk91dCwgdW5zaWduZWQgSW5kZW50YXRpb24gPSAwLAorICAgICAgICAgICAgIGJvb2wgUHJpbnRJbnN0YW50aWF0aW9uID0gZmFsc2UpIGNvbnN0OworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPdXQsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3ksCisgICAgICAgICAgICAgdW5zaWduZWQgSW5kZW50YXRpb24gPSAwLCBib29sIFByaW50SW5zdGFudGlhdGlvbiA9IGZhbHNlKSBjb25zdDsKKyAgc3RhdGljIHZvaWQgcHJpbnRHcm91cChEZWNsKiogQmVnaW4sIHVuc2lnbmVkIE51bURlY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPdXQsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZW50YXRpb24gPSAwKTsKKworICAvLyBEZWJ1Z2dlcnMgZG9uJ3QgdXN1YWxseSByZXNwZWN0IGRlZmF1bHQgYXJndW1lbnRzLgorICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLyBTYW1lIGFzIGR1bXAoKSwgYnV0IGZvcmNlcyBjb2xvciBwcmludGluZy4KKyAgdm9pZCBkdW1wQ29sb3IoKSBjb25zdDsKKworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk91dCwgYm9vbCBEZXNlcmlhbGl6ZSA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIExvb2tzIHRocm91Z2ggdGhlIERlY2wncyB1bmRlcmx5aW5nIHR5cGUgdG8gZXh0cmFjdCBhIEZ1bmN0aW9uVHlwZQorICAvLy8gd2hlbiBwb3NzaWJsZS4gV2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgdHlwZSB1bmRlcmx5aW5nIHRoZSBEZWNsIGRvZXMgbm90CisgIC8vLyBoYXZlIGEgRnVuY3Rpb25UeXBlLgorICBjb25zdCBGdW5jdGlvblR5cGUgKmdldEZ1bmN0aW9uVHlwZShib29sIEJsb2Nrc1RvbyA9IHRydWUpIGNvbnN0OworCitwcml2YXRlOgorICB2b2lkIHNldEF0dHJzSW1wbChjb25zdCBBdHRyVmVjJiBBdHRycywgQVNUQ29udGV4dCAmQ3R4KTsKKyAgdm9pZCBzZXREZWNsQ29udGV4dHNJbXBsKERlY2xDb250ZXh0ICpTZW1hREMsIERlY2xDb250ZXh0ICpMZXhpY2FsREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RDb250ZXh0ICZDdHgpOworCitwcm90ZWN0ZWQ6CisgIEFTVE11dGF0aW9uTGlzdGVuZXIgKmdldEFTVE11dGF0aW9uTGlzdGVuZXIoKSBjb25zdDsKK307CisKKy8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdHdvIGRlY2xhcmF0aW9ucyBkZWNsYXJlIHRoZSBzYW1lIGVudGl0eS4KK2lubGluZSBib29sIGRlY2xhcmVzU2FtZUVudGl0eShjb25zdCBEZWNsICpEMSwgY29uc3QgRGVjbCAqRDIpIHsKKyAgaWYgKCFEMSB8fCAhRDIpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgaWYgKEQxID09IEQyKQorICAgIHJldHVybiB0cnVlOworICAKKyAgcmV0dXJuIEQxLT5nZXRDYW5vbmljYWxEZWNsKCkgPT0gRDItPmdldENhbm9uaWNhbERlY2woKTsKK30KKyAgCisvLy8gUHJldHR5U3RhY2tUcmFjZURlY2wgLSBJZiBhIGNyYXNoIG9jY3VycywgaW5kaWNhdGUgdGhhdCBpdCBoYXBwZW5lZCB3aGVuCisvLy8gZG9pbmcgc29tZXRoaW5nIHRvIGEgc3BlY2lmaWMgZGVjbC4KK2NsYXNzIFByZXR0eVN0YWNrVHJhY2VEZWNsIDogcHVibGljIGxsdm06OlByZXR0eVN0YWNrVHJhY2VFbnRyeSB7CisgIGNvbnN0IERlY2wgKlRoZURlY2w7CisgIFNvdXJjZUxvY2F0aW9uIExvYzsKKyAgU291cmNlTWFuYWdlciAmU007CisgIGNvbnN0IGNoYXIgKk1lc3NhZ2U7CisKK3B1YmxpYzoKKyAgUHJldHR5U3RhY2tUcmFjZURlY2woY29uc3QgRGVjbCAqdGhlRGVjbCwgU291cmNlTG9jYXRpb24gTCwKKyAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTWFuYWdlciAmc20sIGNvbnN0IGNoYXIgKk1zZykKKyAgICAgIDogVGhlRGVjbCh0aGVEZWNsKSwgTG9jKEwpLCBTTShzbSksIE1lc3NhZ2UoTXNnKSB7fQorCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyBcYnJpZWYgVGhlIHJlc3VsdHMgb2YgbmFtZSBsb29rdXAgd2l0aGluIGEgRGVjbENvbnRleHQuIFRoaXMgaXMgZWl0aGVyIGEKKy8vLyBzaW5nbGUgcmVzdWx0ICh3aXRoIG5vIHN0YWJsZSBzdG9yYWdlKSBvciBhIGNvbGxlY3Rpb24gb2YgcmVzdWx0cyAod2l0aAorLy8vIHN0YWJsZSBzdG9yYWdlIHByb3ZpZGVkIGJ5IHRoZSBsb29rdXAgdGFibGUpLgorY2xhc3MgRGVjbENvbnRleHRMb29rdXBSZXN1bHQgeworICB1c2luZyBSZXN1bHRUeSA9IEFycmF5UmVmPE5hbWVkRGVjbCAqPjsKKworICBSZXN1bHRUeSBSZXN1bHQ7CisKKyAgLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgbG9va3VwIHJlc3VsdCwgaXQgd291bGQgYmUgaW52YWxpZGF0ZWQgYnkKKyAgLy8gcmVhbGxvY2F0aW9ucyBvZiB0aGUgbmFtZSB0YWJsZSwgc28gc3RvcmUgaXQgc2VwYXJhdGVseS4KKyAgTmFtZWREZWNsICpTaW5nbGUgPSBudWxscHRyOworCisgIHN0YXRpYyBOYW1lZERlY2wgKmNvbnN0IFNpbmdsZUVsZW1lbnREdW1teUxpc3Q7CisKK3B1YmxpYzoKKyAgRGVjbENvbnRleHRMb29rdXBSZXN1bHQoKSA9IGRlZmF1bHQ7CisgIERlY2xDb250ZXh0TG9va3VwUmVzdWx0KEFycmF5UmVmPE5hbWVkRGVjbCAqPiBSZXN1bHQpCisgICAgICA6IFJlc3VsdChSZXN1bHQpIHt9CisgIERlY2xDb250ZXh0TG9va3VwUmVzdWx0KE5hbWVkRGVjbCAqU2luZ2xlKQorICAgICAgOiBSZXN1bHQoU2luZ2xlRWxlbWVudER1bW15TGlzdCksIFNpbmdsZShTaW5nbGUpIHt9CisKKyAgY2xhc3MgaXRlcmF0b3I7CisKKyAgdXNpbmcgSXRlcmF0b3JCYXNlID0KKyAgICAgIGxsdm06Oml0ZXJhdG9yX2FkYXB0b3JfYmFzZTxpdGVyYXRvciwgUmVzdWx0VHk6Oml0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpjb25zdD47CisKKyAgY2xhc3MgaXRlcmF0b3IgOiBwdWJsaWMgSXRlcmF0b3JCYXNlIHsKKyAgICB2YWx1ZV90eXBlIFNpbmdsZUVsZW1lbnQ7CisKKyAgcHVibGljOgorICAgIGl0ZXJhdG9yKCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IGl0ZXJhdG9yKHBvaW50ZXIgUG9zLCB2YWx1ZV90eXBlIFNpbmdsZSA9IG51bGxwdHIpCisgICAgICAgIDogSXRlcmF0b3JCYXNlKFBvcyksIFNpbmdsZUVsZW1lbnQoU2luZ2xlKSB7fQorCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTaW5nbGVFbGVtZW50ID8gU2luZ2xlRWxlbWVudCA6IEl0ZXJhdG9yQmFzZTo6b3BlcmF0b3IqKCk7CisgICAgfQorICB9OworCisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gaXRlcmF0b3I7CisgIHVzaW5nIHBvaW50ZXIgPSBpdGVyYXRvcjo6cG9pbnRlcjsKKyAgdXNpbmcgcmVmZXJlbmNlID0gaXRlcmF0b3I6OnJlZmVyZW5jZTsKKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKFJlc3VsdC5iZWdpbigpLCBTaW5nbGUpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKFJlc3VsdC5lbmQoKSwgU2luZ2xlKTsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBSZXN1bHQuZW1wdHkoKTsgfQorICBwb2ludGVyIGRhdGEoKSBjb25zdCB7IHJldHVybiBTaW5nbGUgPyAmU2luZ2xlIDogUmVzdWx0LmRhdGEoKTsgfQorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpbmdsZSA/IDEgOiBSZXN1bHQuc2l6ZSgpOyB9CisgIHJlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsgcmV0dXJuIFNpbmdsZSA/IFNpbmdsZSA6IFJlc3VsdC5mcm9udCgpOyB9CisgIHJlZmVyZW5jZSBiYWNrKCkgY29uc3QgeyByZXR1cm4gU2luZ2xlID8gU2luZ2xlIDogUmVzdWx0LmJhY2soKTsgfQorICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3QgTikgY29uc3QgeyByZXR1cm4gU2luZ2xlID8gU2luZ2xlIDogUmVzdWx0W05dOyB9CisKKyAgLy8gRklYTUU6IFJlbW92ZSB0aGlzIGZyb20gdGhlIGludGVyZmFjZQorICBEZWNsQ29udGV4dExvb2t1cFJlc3VsdCBzbGljZShzaXplX3QgTikgY29uc3QgeworICAgIERlY2xDb250ZXh0TG9va3VwUmVzdWx0IFNsaWNlZCA9IFJlc3VsdC5zbGljZShOKTsKKyAgICBTbGljZWQuU2luZ2xlID0gU2luZ2xlOworICAgIHJldHVybiBTbGljZWQ7CisgIH0KK307CisKKy8vLyBEZWNsQ29udGV4dCAtIFRoaXMgaXMgdXNlZCBvbmx5IGFzIGJhc2UgY2xhc3Mgb2Ygc3BlY2lmaWMgZGVjbCB0eXBlcyB0aGF0CisvLy8gY2FuIGFjdCBhcyBkZWNsYXJhdGlvbiBjb250ZXh0cy4gVGhlc2UgZGVjbHMgYXJlIChvbmx5IHRoZSB0b3AgY2xhc3NlcworLy8vIHRoYXQgZGlyZWN0bHkgZGVyaXZlIGZyb20gRGVjbENvbnRleHQgYXJlIG1lbnRpb25lZCwgbm90IHRoZWlyIHN1YmNsYXNzZXMpOgorLy8vCisvLy8gICBUcmFuc2xhdGlvblVuaXREZWNsCisvLy8gICBOYW1lc3BhY2VEZWNsCisvLy8gICBGdW5jdGlvbkRlY2wKKy8vLyAgIFRhZ0RlY2wKKy8vLyAgIE9iakNNZXRob2REZWNsCisvLy8gICBPYmpDQ29udGFpbmVyRGVjbAorLy8vICAgTGlua2FnZVNwZWNEZWNsCisvLy8gICBFeHBvcnREZWNsCisvLy8gICBCbG9ja0RlY2wKKy8vLyAgIE9NUERlY2xhcmVSZWR1Y3Rpb25EZWNsCitjbGFzcyBEZWNsQ29udGV4dCB7CisgIC8vLyBEZWNsS2luZCAtIFRoaXMgaW5kaWNhdGVzIHdoaWNoIGNsYXNzIHRoaXMgaXMuCisgIHVuc2lnbmVkIERlY2xLaW5kIDogODsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBkZWNsYXJhdGlvbiBjb250ZXh0IGFsc28gaGFzIHNvbWUgZXh0ZXJuYWwKKyAgLy8vIHN0b3JhZ2UgdGhhdCBjb250YWlucyBhZGRpdGlvbmFsIGRlY2xhcmF0aW9ucyB0aGF0IGFyZSBsZXhpY2FsbHkKKyAgLy8vIHBhcnQgb2YgdGhpcyBjb250ZXh0LgorICBtdXRhYmxlIGJvb2wgRXh0ZXJuYWxMZXhpY2FsU3RvcmFnZSA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gY29udGV4dCBhbHNvIGhhcyBzb21lIGV4dGVybmFsCisgIC8vLyBzdG9yYWdlIHRoYXQgY29udGFpbnMgYWRkaXRpb25hbCBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgdmlzaWJsZQorICAvLy8gaW4gdGhpcyBjb250ZXh0LgorICBtdXRhYmxlIGJvb2wgRXh0ZXJuYWxWaXNpYmxlU3RvcmFnZSA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gY29udGV4dCBoYXMgaGFkIGV4dGVybmFsIHZpc2libGUKKyAgLy8vIHN0b3JhZ2UgYWRkZWQgc2luY2UgdGhlIGxhc3QgbG9va3VwLiBJbiB0aGlzIGNhc2UsIFxjIExvb2t1cFB0cidzCisgIC8vLyBpbnZhcmlhbnQgbWF5IG5vdCBob2xkIGFuZCBuZWVkcyB0byBiZSBmaXhlZCBiZWZvcmUgd2UgcGVyZm9ybQorICAvLy8gYW5vdGhlciBsb29rdXAuCisgIG11dGFibGUgYm9vbCBOZWVkVG9SZWNvbmNpbGVFeHRlcm5hbFZpc2libGVTdG9yYWdlIDogMTsKKworICAvLy8gXGJyaWVmIElmIFxjIHRydWUsIHRoaXMgY29udGV4dCBtYXkgaGF2ZSBsb2NhbCBsZXhpY2FsIGRlY2xhcmF0aW9ucworICAvLy8gdGhhdCBhcmUgbWlzc2luZyBmcm9tIHRoZSBsb29rdXAgdGFibGUuCisgIG11dGFibGUgYm9vbCBIYXNMYXp5TG9jYWxMZXhpY2FsTG9va3VwcyA6IDE7CisKKyAgLy8vIFxicmllZiBJZiBcYyB0cnVlLCB0aGUgZXh0ZXJuYWwgc291cmNlIG1heSBoYXZlIGxleGljYWwgZGVjbGFyYXRpb25zCisgIC8vLyB0aGF0IGFyZSBtaXNzaW5nIGZyb20gdGhlIGxvb2t1cCB0YWJsZS4KKyAgbXV0YWJsZSBib29sIEhhc0xhenlFeHRlcm5hbExleGljYWxMb29rdXBzIDogMTsKKworICAvLy8gXGJyaWVmIElmIFxjIHRydWUsIGxvb2t1cHMgc2hvdWxkIG9ubHkgcmV0dXJuIGlkZW50aWZpZXIgZnJvbQorICAvLy8gRGVjbENvbnRleHQgc2NvcGUgKGZvciBleGFtcGxlIFRyYW5zbGF0aW9uVW5pdCkuIFVzZWQgaW4KKyAgLy8vIExvb2t1cFF1YWxpZmllZE5hbWUoKQorICBtdXRhYmxlIGJvb2wgVXNlUXVhbGlmaWVkTG9va3VwIDogMTsKKworICAvLy8gXGJyaWVmIFBvaW50ZXIgdG8gdGhlIGRhdGEgc3RydWN0dXJlIHVzZWQgdG8gbG9va3VwIGRlY2xhcmF0aW9ucworICAvLy8gd2l0aGluIHRoaXMgY29udGV4dCAob3IgYSBEZXBlbmRlbnRTdG9yZWREZWNsc01hcCBpZiB0aGlzIGlzIGEKKyAgLy8vIGRlcGVuZGVudCBjb250ZXh0KS4gV2UgbWFpbnRhaW4gdGhlIGludmFyaWFudCB0aGF0LCBpZiB0aGUgbWFwCisgIC8vLyBjb250YWlucyBhbiBlbnRyeSBmb3IgYSBEZWNsYXJhdGlvbk5hbWUgKGFuZCB3ZSBoYXZlbid0IGxhemlseQorICAvLy8gb21pdHRlZCBhbnl0aGluZyksIHRoZW4gaXQgY29udGFpbnMgYWxsIHJlbGV2YW50IGVudHJpZXMgZm9yIHRoYXQKKyAgLy8vIG5hbWUgKG1vZHVsbyB0aGUgaGFzRXh0ZXJuYWxEZWNscygpIGZsYWcpLgorICBtdXRhYmxlIFN0b3JlZERlY2xzTWFwICpMb29rdXBQdHIgPSBudWxscHRyOworCitwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNUV3JpdGVyOworICBmcmllbmQgY2xhc3MgRXh0ZXJuYWxBU1RTb3VyY2U7CisKKyAgLy8vIEZpcnN0RGVjbCAtIFRoZSBmaXJzdCBkZWNsYXJhdGlvbiBzdG9yZWQgd2l0aGluIHRoaXMgZGVjbGFyYXRpb24KKyAgLy8vIGNvbnRleHQuCisgIG11dGFibGUgRGVjbCAqRmlyc3REZWNsID0gbnVsbHB0cjsKKworICAvLy8gTGFzdERlY2wgLSBUaGUgbGFzdCBkZWNsYXJhdGlvbiBzdG9yZWQgd2l0aGluIHRoaXMgZGVjbGFyYXRpb24KKyAgLy8vIGNvbnRleHQuIEZJWE1FOiBXZSBjb3VsZCBwcm9iYWJseSBjYWNoZSB0aGlzIHZhbHVlIHNvbWV3aGVyZQorICAvLy8gb3V0c2lkZSBvZiB0aGUgRGVjbENvbnRleHQsIHRvIHJlZHVjZSB0aGUgc2l6ZSBvZiBEZWNsQ29udGV4dCBieQorICAvLy8gYW5vdGhlciBwb2ludGVyLgorICBtdXRhYmxlIERlY2wgKkxhc3REZWNsID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIEJ1aWxkIHVwIGEgY2hhaW4gb2YgZGVjbGFyYXRpb25zLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSBmaXJzdC9sYXN0IHBhaXIgb2YgZGVjbGFyYXRpb25zLgorICBzdGF0aWMgc3RkOjpwYWlyPERlY2wgKiwgRGVjbCAqPgorICBCdWlsZERlY2xDaGFpbihBcnJheVJlZjxEZWNsKj4gRGVjbHMsIGJvb2wgRmllbGRzQWxyZWFkeUxvYWRlZCk7CisKKyAgRGVjbENvbnRleHQoRGVjbDo6S2luZCBLKQorICAgICAgOiBEZWNsS2luZChLKSwgRXh0ZXJuYWxMZXhpY2FsU3RvcmFnZShmYWxzZSksCisgICAgICAgIEV4dGVybmFsVmlzaWJsZVN0b3JhZ2UoZmFsc2UpLAorICAgICAgICBOZWVkVG9SZWNvbmNpbGVFeHRlcm5hbFZpc2libGVTdG9yYWdlKGZhbHNlKSwKKyAgICAgICAgSGFzTGF6eUxvY2FsTGV4aWNhbExvb2t1cHMoZmFsc2UpLCBIYXNMYXp5RXh0ZXJuYWxMZXhpY2FsTG9va3VwcyhmYWxzZSksCisgICAgICAgIFVzZVF1YWxpZmllZExvb2t1cChmYWxzZSkge30KKworcHVibGljOgorICB+RGVjbENvbnRleHQoKTsKKworICBEZWNsOjpLaW5kIGdldERlY2xLaW5kKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZWNsOjpLaW5kPihEZWNsS2luZCk7CisgIH0KKworICBjb25zdCBjaGFyICpnZXREZWNsS2luZE5hbWUoKSBjb25zdDsKKworICAvLy8gZ2V0UGFyZW50IC0gUmV0dXJucyB0aGUgY29udGFpbmluZyBEZWNsQ29udGV4dC4KKyAgRGVjbENvbnRleHQgKmdldFBhcmVudCgpIHsKKyAgICByZXR1cm4gY2FzdDxEZWNsPih0aGlzKS0+Z2V0RGVjbENvbnRleHQoKTsKKyAgfQorICBjb25zdCBEZWNsQ29udGV4dCAqZ2V0UGFyZW50KCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PERlY2xDb250ZXh0Kj4odGhpcyktPmdldFBhcmVudCgpOworICB9CisKKyAgLy8vIGdldExleGljYWxQYXJlbnQgLSBSZXR1cm5zIHRoZSBjb250YWluaW5nIGxleGljYWwgRGVjbENvbnRleHQuIE1heSBiZQorICAvLy8gZGlmZmVyZW50IGZyb20gZ2V0UGFyZW50LCBlLmcuOgorICAvLy8KKyAgLy8vICAgbmFtZXNwYWNlIEEgeworICAvLy8gICAgICBzdHJ1Y3QgUzsKKyAgLy8vICAgfQorICAvLy8gICBzdHJ1Y3QgQTo6UyB7fTsgLy8gZ2V0UGFyZW50KCkgPT0gbmFtZXNwYWNlICdBJworICAvLy8gICAgICAgICAgICAgICAgICAgLy8gZ2V0TGV4aWNhbFBhcmVudCgpID09IHRyYW5zbGF0aW9uIHVuaXQKKyAgLy8vCisgIERlY2xDb250ZXh0ICpnZXRMZXhpY2FsUGFyZW50KCkgeworICAgIHJldHVybiBjYXN0PERlY2w+KHRoaXMpLT5nZXRMZXhpY2FsRGVjbENvbnRleHQoKTsKKyAgfQorICBjb25zdCBEZWNsQ29udGV4dCAqZ2V0TGV4aWNhbFBhcmVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxEZWNsQ29udGV4dCo+KHRoaXMpLT5nZXRMZXhpY2FsUGFyZW50KCk7CisgIH0KKworICBEZWNsQ29udGV4dCAqZ2V0TG9va3VwUGFyZW50KCk7CisKKyAgY29uc3QgRGVjbENvbnRleHQgKmdldExvb2t1cFBhcmVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxEZWNsQ29udGV4dCo+KHRoaXMpLT5nZXRMb29rdXBQYXJlbnQoKTsKKyAgfQorCisgIEFTVENvbnRleHQgJmdldFBhcmVudEFTVENvbnRleHQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8RGVjbD4odGhpcyktPmdldEFTVENvbnRleHQoKTsKKyAgfQorCisgIGJvb2wgaXNDbG9zdXJlKCkgY29uc3QgeworICAgIHJldHVybiBEZWNsS2luZCA9PSBEZWNsOjpCbG9jazsKKyAgfQorCisgIGJvb2wgaXNPYmpDQ29udGFpbmVyKCkgY29uc3QgeworICAgIHN3aXRjaCAoRGVjbEtpbmQpIHsKKyAgICAgICAgY2FzZSBEZWNsOjpPYmpDQ2F0ZWdvcnk6CisgICAgICAgIGNhc2UgRGVjbDo6T2JqQ0NhdGVnb3J5SW1wbDoKKyAgICAgICAgY2FzZSBEZWNsOjpPYmpDSW1wbGVtZW50YXRpb246CisgICAgICAgIGNhc2UgRGVjbDo6T2JqQ0ludGVyZmFjZToKKyAgICAgICAgY2FzZSBEZWNsOjpPYmpDUHJvdG9jb2w6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBpc0Z1bmN0aW9uT3JNZXRob2QoKSBjb25zdCB7CisgICAgc3dpdGNoIChEZWNsS2luZCkgeworICAgIGNhc2UgRGVjbDo6QmxvY2s6CisgICAgY2FzZSBEZWNsOjpDYXB0dXJlZDoKKyAgICBjYXNlIERlY2w6Ok9iakNNZXRob2Q6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIERlY2xLaW5kID49IERlY2w6OmZpcnN0RnVuY3Rpb24gJiYgRGVjbEtpbmQgPD0gRGVjbDo6bGFzdEZ1bmN0aW9uOworICAgIH0KKyAgfQorCisgIC8vLyBcYnJpZWYgVGVzdCB3aGV0aGVyIHRoZSBjb250ZXh0IHN1cHBvcnRzIGxvb2tpbmcgdXAgbmFtZXMuCisgIGJvb2wgaXNMb29rdXBDb250ZXh0KCkgY29uc3QgeworICAgIHJldHVybiAhaXNGdW5jdGlvbk9yTWV0aG9kKCkgJiYgRGVjbEtpbmQgIT0gRGVjbDo6TGlua2FnZVNwZWMgJiYKKyAgICAgICAgICAgRGVjbEtpbmQgIT0gRGVjbDo6RXhwb3J0OworICB9CisKKyAgYm9vbCBpc0ZpbGVDb250ZXh0KCkgY29uc3QgeworICAgIHJldHVybiBEZWNsS2luZCA9PSBEZWNsOjpUcmFuc2xhdGlvblVuaXQgfHwgRGVjbEtpbmQgPT0gRGVjbDo6TmFtZXNwYWNlOworICB9CisKKyAgYm9vbCBpc1RyYW5zbGF0aW9uVW5pdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRGVjbEtpbmQgPT0gRGVjbDo6VHJhbnNsYXRpb25Vbml0OworICB9CisKKyAgYm9vbCBpc1JlY29yZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRGVjbEtpbmQgPj0gRGVjbDo6Zmlyc3RSZWNvcmQgJiYgRGVjbEtpbmQgPD0gRGVjbDo6bGFzdFJlY29yZDsKKyAgfQorCisgIGJvb2wgaXNOYW1lc3BhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIERlY2xLaW5kID09IERlY2w6Ok5hbWVzcGFjZTsKKyAgfQorCisgIGJvb2wgaXNTdGROYW1lc3BhY2UoKSBjb25zdDsKKworICBib29sIGlzSW5saW5lTmFtZXNwYWNlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBjb250ZXh0IGlzIGRlcGVuZGVudCBvbiBhCisgIC8vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCisgIGJvb2wgaXNEZXBlbmRlbnRDb250ZXh0KCkgY29uc3Q7CisKKyAgLy8vIGlzVHJhbnNwYXJlbnRDb250ZXh0IC0gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgY29udGV4dCBpcyBhCisgIC8vLyAidHJhbnNwYXJlbnQiIGNvbnRleHQsIG1lYW5pbmcgdGhhdCB0aGUgbWVtYmVycyBkZWNsYXJlZCBpbiB0aGlzCisgIC8vLyBjb250ZXh0IGFyZSBzZW1hbnRpY2FsbHkgZGVjbGFyZWQgaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nCisgIC8vLyBub24tdHJhbnNwYXJlbnQgKG9wYXF1ZSkgY29udGV4dCBidXQgYXJlIGxleGljYWxseSBkZWNsYXJlZCBpbgorICAvLy8gdGhpcyBjb250ZXh0LiBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGVudW1lcmF0b3JzIG9mIGFuCisgIC8vLyBlbnVtZXJhdGlvbiB0eXBlOgorICAvLy8gQGNvZGUKKyAgLy8vIGVudW0gRSB7CisgIC8vLyAgIFZhbDEKKyAgLy8vIH07CisgIC8vLyBAZW5kY29kZQorICAvLy8gSGVyZSwgRSBpcyBhIHRyYW5zcGFyZW50IGNvbnRleHQsIHNvIGl0cyBlbnVtZXJhdG9yIChWYWwxKSB3aWxsCisgIC8vLyBhcHBlYXIgKHNlbWFudGljYWxseSkgdGhhdCBpdCBpcyBpbiB0aGUgc2FtZSBjb250ZXh0IG9mIEUuCisgIC8vLyBFeGFtcGxlcyBvZiB0cmFuc3BhcmVudCBjb250ZXh0cyBpbmNsdWRlOiBlbnVtZXJhdGlvbnMgKGV4Y2VwdCBmb3IKKyAgLy8vIEMrKzB4IHNjb3BlZCBlbnVtcyksIGFuZCBDKysgbGlua2FnZSBzcGVjaWZpY2F0aW9ucy4KKyAgYm9vbCBpc1RyYW5zcGFyZW50Q29udGV4dCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgY29udGV4dCBvciBzb21lIG9mIGl0cyBhbmNlc3RvcnMgaXMgYQorICAvLy8gbGlua2FnZSBzcGVjaWZpY2F0aW9uIGNvbnRleHQgdGhhdCBzcGVjaWZpZXMgQyBsaW5rYWdlLgorICBib29sIGlzRXh0ZXJuQ0NvbnRleHQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBDIGxpbmthZ2Ugc3BlY2lmaWNhdGlvbiBjb250ZXh0LgorICBjb25zdCBMaW5rYWdlU3BlY0RlY2wgKmdldEV4dGVybkNDb250ZXh0KCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBjb250ZXh0IG9yIHNvbWUgb2YgaXRzIGFuY2VzdG9ycyBpcyBhCisgIC8vLyBsaW5rYWdlIHNwZWNpZmljYXRpb24gY29udGV4dCB0aGF0IHNwZWNpZmllcyBDKysgbGlua2FnZS4KKyAgYm9vbCBpc0V4dGVybkNYWENvbnRleHQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gY29udGV4dCBpcyBlcXVpdmFsZW50CisgIC8vLyB0byB0aGUgZGVjbGFyYXRpb24gY29udGV4dCBEQy4KKyAgYm9vbCBFcXVhbHMoY29uc3QgRGVjbENvbnRleHQgKkRDKSBjb25zdCB7CisgICAgcmV0dXJuIERDICYmIHRoaXMtPmdldFByaW1hcnlDb250ZXh0KCkgPT0gREMtPmdldFByaW1hcnlDb250ZXh0KCk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gY29udGV4dCBlbmNsb3NlcyB0aGUKKyAgLy8vIGRlY2xhcmF0aW9uIGNvbnRleHQgREMuCisgIGJvb2wgRW5jbG9zZXMoY29uc3QgRGVjbENvbnRleHQgKkRDKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEZpbmQgdGhlIG5lYXJlc3Qgbm9uLWNsb3N1cmUgYW5jZXN0b3Igb2YgdGhpcyBjb250ZXh0LAorICAvLy8gaS5lLiB0aGUgaW5uZXJtb3N0IHNlbWFudGljIHBhcmVudCBvZiB0aGlzIGNvbnRleHQgd2hpY2ggaXMgbm90CisgIC8vLyBhIGNsb3N1cmUuICBBIGNvbnRleHQgbWF5IGJlIGl0cyBvd24gbm9uLWNsb3N1cmUgYW5jZXN0b3IuCisgIERlY2wgKmdldE5vbkNsb3N1cmVBbmNlc3RvcigpOworICBjb25zdCBEZWNsICpnZXROb25DbG9zdXJlQW5jZXN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RGVjbENvbnRleHQqPih0aGlzKS0+Z2V0Tm9uQ2xvc3VyZUFuY2VzdG9yKCk7CisgIH0KKworICAvLy8gZ2V0UHJpbWFyeUNvbnRleHQgLSBUaGVyZSBtYXkgYmUgbWFueSBkaWZmZXJlbnQKKyAgLy8vIGRlY2xhcmF0aW9ucyBvZiB0aGUgc2FtZSBlbnRpdHkgKGluY2x1ZGluZyBmb3J3YXJkIGRlY2xhcmF0aW9ucworICAvLy8gb2YgY2xhc3NlcywgbXVsdGlwbGUgZGVmaW5pdGlvbnMgb2YgbmFtZXNwYWNlcywgZXRjLiksIGVhY2ggd2l0aAorICAvLy8gYSBkaWZmZXJlbnQgc2V0IG9mIGRlY2xhcmF0aW9ucy4gVGhpcyByb3V0aW5lIHJldHVybnMgdGhlCisgIC8vLyAicHJpbWFyeSIgRGVjbENvbnRleHQgc3RydWN0dXJlLCB3aGljaCB3aWxsIGNvbnRhaW4gdGhlCisgIC8vLyBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gcGVyZm9ybSBuYW1lIGxvb2t1cCBpbnRvIHRoaXMgY29udGV4dC4KKyAgRGVjbENvbnRleHQgKmdldFByaW1hcnlDb250ZXh0KCk7CisgIGNvbnN0IERlY2xDb250ZXh0ICpnZXRQcmltYXJ5Q29udGV4dCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxEZWNsQ29udGV4dCo+KHRoaXMpLT5nZXRQcmltYXJ5Q29udGV4dCgpOworICB9CisKKyAgLy8vIGdldFJlZGVjbENvbnRleHQgLSBSZXRyaWV2ZSB0aGUgY29udGV4dCBpbiB3aGljaCBhbiBlbnRpdHkgY29uZmxpY3RzIHdpdGgKKyAgLy8vIG90aGVyIGVudGl0aWVzIG9mIHRoZSBzYW1lIG5hbWUsIG9yIHdoZXJlIGl0IGlzIGEgcmVkZWNsYXJhdGlvbiBpZiB0aGUKKyAgLy8vIHR3byBlbnRpdGllcyBhcmUgY29tcGF0aWJsZS4gVGhpcyBza2lwcyB0aHJvdWdoIHRyYW5zcGFyZW50IGNvbnRleHRzLgorICBEZWNsQ29udGV4dCAqZ2V0UmVkZWNsQ29udGV4dCgpOworICBjb25zdCBEZWNsQ29udGV4dCAqZ2V0UmVkZWNsQ29udGV4dCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxEZWNsQ29udGV4dCAqPih0aGlzKS0+Z2V0UmVkZWNsQ29udGV4dCgpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlIGNvbnRleHQuCisgIERlY2xDb250ZXh0ICpnZXRFbmNsb3NpbmdOYW1lc3BhY2VDb250ZXh0KCk7CisgIGNvbnN0IERlY2xDb250ZXh0ICpnZXRFbmNsb3NpbmdOYW1lc3BhY2VDb250ZXh0KCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PERlY2xDb250ZXh0ICo+KHRoaXMpLT5nZXRFbmNsb3NpbmdOYW1lc3BhY2VDb250ZXh0KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBvdXRlcm1vc3QgbGV4aWNhbGx5IGVuY2xvc2luZyByZWNvcmQgY29udGV4dC4KKyAgUmVjb3JkRGVjbCAqZ2V0T3V0ZXJMZXhpY2FsUmVjb3JkQ29udGV4dCgpOworICBjb25zdCBSZWNvcmREZWNsICpnZXRPdXRlckxleGljYWxSZWNvcmRDb250ZXh0KCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PERlY2xDb250ZXh0ICo+KHRoaXMpLT5nZXRPdXRlckxleGljYWxSZWNvcmRDb250ZXh0KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFRlc3QgaWYgdGhpcyBjb250ZXh0IGlzIHBhcnQgb2YgdGhlIGVuY2xvc2luZyBuYW1lc3BhY2Ugc2V0IG9mCisgIC8vLyB0aGUgY29udGV4dCBOUywgYXMgZGVmaW5lZCBpbiBDKysweCBbbmFtZXNwYWNlLmRlZl1wOS4gSWYgZWl0aGVyIGNvbnRleHQKKyAgLy8vIGlzbid0IGEgbmFtZXNwYWNlLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gRXF1YWxzKCkuCisgIC8vLworICAvLy8gVGhlIGVuY2xvc2luZyBuYW1lc3BhY2Ugc2V0IG9mIGEgbmFtZXNwYWNlIGlzIHRoZSBuYW1lc3BhY2UgYW5kLCBpZiBpdCBpcworICAvLy8gaW5saW5lLCBpdHMgZW5jbG9zaW5nIG5hbWVzcGFjZSwgcmVjdXJzaXZlbHkuCisgIGJvb2wgSW5FbmNsb3NpbmdOYW1lc3BhY2VTZXRPZihjb25zdCBEZWNsQ29udGV4dCAqTlMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQ29sbGVjdHMgYWxsIG9mIHRoZSBkZWNsYXJhdGlvbiBjb250ZXh0cyB0aGF0IGFyZSBzZW1hbnRpY2FsbHkKKyAgLy8vIGNvbm5lY3RlZCB0byB0aGlzIGRlY2xhcmF0aW9uIGNvbnRleHQuCisgIC8vLworICAvLy8gRm9yIGRlY2xhcmF0aW9uIGNvbnRleHRzIHRoYXQgaGF2ZSBtdWx0aXBsZSBzZW1hbnRpY2FsbHkgY29ubmVjdGVkIGJ1dAorICAvLy8gc3ludGFjdGljYWxseSBkaXN0aW5jdCBjb250ZXh0cywgc3VjaCBhcyBDKysgbmFtZXNwYWNlcywgdGhpcyByb3V0aW5lIAorICAvLy8gcmV0cmlldmVzIHRoZSBjb21wbGV0ZSBzZXQgb2Ygc3VjaCBkZWNsYXJhdGlvbiBjb250ZXh0cyBpbiBzb3VyY2Ugb3JkZXIuCisgIC8vLyBGb3IgZXhhbXBsZSwgZ2l2ZW46CisgIC8vLworICAvLy8gXGNvZGUKKyAgLy8vIG5hbWVzcGFjZSBOIHsKKyAgLy8vICAgaW50IHg7CisgIC8vLyB9CisgIC8vLyBuYW1lc3BhY2UgTiB7CisgIC8vLyAgIGludCB5OworICAvLy8gfQorICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBUaGUgXGMgQ29udGV4dHMgcGFyYW1ldGVyIHdpbGwgY29udGFpbiBib3RoIGRlZmluaXRpb25zIG9mIE4uCisgIC8vLworICAvLy8gXHBhcmFtIENvbnRleHRzIFdpbGwgYmUgY2xlYXJlZCBhbmQgc2V0IHRvIHRoZSBzZXQgb2YgZGVjbGFyYXRpb24KKyAgLy8vIGNvbnRleHRzIHRoYXQgYXJlIHNlbWFudGljYWx5IGNvbm5lY3RlZCB0byB0aGlzIGRlY2xhcmF0aW9uIGNvbnRleHQsCisgIC8vLyBpbiBzb3VyY2Ugb3JkZXIsIGluY2x1ZGluZyB0aGlzIGNvbnRleHQgKHdoaWNoIG1heSBiZSB0aGUgb25seSByZXN1bHQsCisgIC8vLyBmb3Igbm9uLW5hbWVzcGFjZSBjb250ZXh0cykuCisgIHZvaWQgY29sbGVjdEFsbENvbnRleHRzKFNtYWxsVmVjdG9ySW1wbDxEZWNsQ29udGV4dCAqPiAmQ29udGV4dHMpOworCisgIC8vLyBkZWNsX2l0ZXJhdG9yIC0gSXRlcmF0ZXMgdGhyb3VnaCB0aGUgZGVjbGFyYXRpb25zIHN0b3JlZAorICAvLy8gd2l0aGluIHRoaXMgY29udGV4dC4KKyAgY2xhc3MgZGVjbF9pdGVyYXRvciB7CisgICAgLy8vIEN1cnJlbnQgLSBUaGUgY3VycmVudCBkZWNsYXJhdGlvbi4KKyAgICBEZWNsICpDdXJyZW50ID0gbnVsbHB0cjsKKworICBwdWJsaWM6CisgICAgdXNpbmcgdmFsdWVfdHlwZSA9IERlY2wgKjsKKyAgICB1c2luZyByZWZlcmVuY2UgPSBjb25zdCB2YWx1ZV90eXBlICY7CisgICAgdXNpbmcgcG9pbnRlciA9IGNvbnN0IHZhbHVlX3R5cGUgKjsKKyAgICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc7CisgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gc3RkOjpwdHJkaWZmX3Q7CisKKyAgICBkZWNsX2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IGRlY2xfaXRlcmF0b3IoRGVjbCAqQykgOiBDdXJyZW50KEMpIHt9CisKKyAgICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQ3VycmVudDsgfQorCisgICAgLy8gVGhpcyBkb2Vzbid0IG1lZXQgdGhlIGl0ZXJhdG9yIHJlcXVpcmVtZW50cywgYnV0IGl0J3MgY29udmVuaWVudAorICAgIHZhbHVlX3R5cGUgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIEN1cnJlbnQ7IH0KKworICAgIGRlY2xfaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgICBDdXJyZW50ID0gQ3VycmVudC0+Z2V0TmV4dERlY2xJbkNvbnRleHQoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBkZWNsX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CisgICAgICBkZWNsX2l0ZXJhdG9yIHRtcCgqdGhpcyk7CisgICAgICArKygqdGhpcyk7CisgICAgICByZXR1cm4gdG1wOworICAgIH0KKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oZGVjbF9pdGVyYXRvciB4LCBkZWNsX2l0ZXJhdG9yIHkpIHsKKyAgICAgIHJldHVybiB4LkN1cnJlbnQgPT0geS5DdXJyZW50OworICAgIH0KKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oZGVjbF9pdGVyYXRvciB4LCBkZWNsX2l0ZXJhdG9yIHkpIHsKKyAgICAgIHJldHVybiB4LkN1cnJlbnQgIT0geS5DdXJyZW50OworICAgIH0KKyAgfTsKKworICB1c2luZyBkZWNsX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8ZGVjbF9pdGVyYXRvcj47CisKKyAgLy8vIGRlY2xzX2JlZ2luL2RlY2xzX2VuZCAtIEl0ZXJhdGUgb3ZlciB0aGUgZGVjbGFyYXRpb25zIHN0b3JlZCBpbgorICAvLy8gdGhpcyBjb250ZXh0LgorICBkZWNsX3JhbmdlIGRlY2xzKCkgY29uc3QgeyByZXR1cm4gZGVjbF9yYW5nZShkZWNsc19iZWdpbigpLCBkZWNsc19lbmQoKSk7IH0KKyAgZGVjbF9pdGVyYXRvciBkZWNsc19iZWdpbigpIGNvbnN0OworICBkZWNsX2l0ZXJhdG9yIGRlY2xzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGRlY2xfaXRlcmF0b3IoKTsgfQorICBib29sIGRlY2xzX2VtcHR5KCkgY29uc3Q7CisKKyAgLy8vIG5vbG9hZF9kZWNsc19iZWdpbi9lbmQgLSBJdGVyYXRlIG92ZXIgdGhlIGRlY2xhcmF0aW9ucyBzdG9yZWQgaW4gdGhpcworICAvLy8gY29udGV4dCB0aGF0IGFyZSBjdXJyZW50bHkgbG9hZGVkOyBkb24ndCBhdHRlbXB0IHRvIHJldHJpZXZlIGFueXRoaW5nCisgIC8vLyBmcm9tIGFuIGV4dGVybmFsIHNvdXJjZS4KKyAgZGVjbF9yYW5nZSBub2xvYWRfZGVjbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGRlY2xfcmFuZ2Uobm9sb2FkX2RlY2xzX2JlZ2luKCksIG5vbG9hZF9kZWNsc19lbmQoKSk7CisgIH0KKyAgZGVjbF9pdGVyYXRvciBub2xvYWRfZGVjbHNfYmVnaW4oKSBjb25zdCB7IHJldHVybiBkZWNsX2l0ZXJhdG9yKEZpcnN0RGVjbCk7IH0KKyAgZGVjbF9pdGVyYXRvciBub2xvYWRfZGVjbHNfZW5kKCkgY29uc3QgeyByZXR1cm4gZGVjbF9pdGVyYXRvcigpOyB9CisKKyAgLy8vIHNwZWNpZmljX2RlY2xfaXRlcmF0b3IgLSBJdGVyYXRlcyBvdmVyIGEgc3VicmFuZ2Ugb2YKKyAgLy8vIGRlY2xhcmF0aW9ucyBzdG9yZWQgaW4gYSBEZWNsQ29udGV4dCwgcHJvdmlkaW5nIG9ubHkgdGhvc2UgdGhhdAorICAvLy8gYXJlIG9mIHR5cGUgU3BlY2lmaWNEZWNsIChvciBhIGNsYXNzIGRlcml2ZWQgZnJvbSBpdCkuIFRoaXMKKyAgLy8vIGl0ZXJhdG9yIGlzIHVzZWQsIGZvciBleGFtcGxlLCB0byBwcm92aWRlIGl0ZXJhdGlvbiBvdmVyIGp1c3QKKyAgLy8vIHRoZSBmaWVsZHMgd2l0aGluIGEgUmVjb3JkRGVjbCAod2l0aCBTcGVjaWZpY0RlY2wgPSBGaWVsZERlY2wpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTcGVjaWZpY0RlY2w+CisgIGNsYXNzIHNwZWNpZmljX2RlY2xfaXRlcmF0b3IgeworICAgIC8vLyBDdXJyZW50IC0gVGhlIGN1cnJlbnQsIHVuZGVybHlpbmcgZGVjbGFyYXRpb24gaXRlcmF0b3IsIHdoaWNoCisgICAgLy8vIHdpbGwgZWl0aGVyIGJlIE5VTEwgb3Igd2lsbCBwb2ludCB0byBhIGRlY2xhcmF0aW9uIG9mCisgICAgLy8vIHR5cGUgU3BlY2lmaWNEZWNsLgorICAgIERlY2xDb250ZXh0OjpkZWNsX2l0ZXJhdG9yIEN1cnJlbnQ7CisKKyAgICAvLy8gU2tpcFRvTmV4dERlY2wgLSBBZHZhbmNlcyB0aGUgY3VycmVudCBwb3NpdGlvbiB1cCB0byB0aGUgbmV4dAorICAgIC8vLyBkZWNsYXJhdGlvbiBvZiB0eXBlIFNwZWNpZmljRGVjbCB0aGF0IGFsc28gbWVldHMgdGhlIGNyaXRlcmlhCisgICAgLy8vIHJlcXVpcmVkIGJ5IEFjY2VwdGFibGUuCisgICAgdm9pZCBTa2lwVG9OZXh0RGVjbCgpIHsKKyAgICAgIHdoaWxlICgqQ3VycmVudCAmJiAhaXNhPFNwZWNpZmljRGVjbD4oKkN1cnJlbnQpKQorICAgICAgICArK0N1cnJlbnQ7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICB1c2luZyB2YWx1ZV90eXBlID0gU3BlY2lmaWNEZWNsICo7CisgICAgLy8gVE9ETzogQWRkIHJlZmVyZW5jZSBhbmQgcG9pbnRlciB0eXBlcyAod2l0aCBzb21lIGFwcHJvcHJpYXRlIHByb3h5IHR5cGUpCisgICAgLy8gaWYgd2UgZXZlciBoYXZlIGEgbmVlZCBmb3IgdGhlbS4KKyAgICB1c2luZyByZWZlcmVuY2UgPSB2b2lkOworICAgIHVzaW5nIHBvaW50ZXIgPSB2b2lkOworICAgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9CisgICAgICAgIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPERlY2xDb250ZXh0OjpkZWNsX2l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlOworICAgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZzsKKworICAgIHNwZWNpZmljX2RlY2xfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gc3BlY2lmaWNfZGVjbF9pdGVyYXRvciAtIENvbnN0cnVjdCBhIG5ldyBpdGVyYXRvciBvdmVyIGEKKyAgICAvLy8gc3Vic2V0IG9mIHRoZSBkZWNsYXJhdGlvbnMgdGhlIHJhbmdlIFtDLAorICAgIC8vLyBlbmQtb2YtZGVjbGFyYXRpb25zKS4gSWYgQSBpcyBub24tTlVMTCwgaXQgaXMgYSBwb2ludGVyIHRvIGEKKyAgICAvLy8gbWVtYmVyIGZ1bmN0aW9uIG9mIFNwZWNpZmljRGVjbCB0aGF0IHNob3VsZCByZXR1cm4gdHJ1ZSBmb3IKKyAgICAvLy8gYWxsIG9mIHRoZSBTcGVjaWZpY0RlY2wgaW5zdGFuY2VzIHRoYXQgd2lsbCBiZSBpbiB0aGUgc3Vic2V0CisgICAgLy8vIG9mIGl0ZXJhdG9ycy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IE9iamVjdGl2ZS1DIGluc3RhbmNlCisgICAgLy8vIG1ldGhvZHMsIFNwZWNpZmljRGVjbCB3aWxsIGJlIE9iakNNZXRob2REZWNsIGFuZCBBIHdpbGwgYmUKKyAgICAvLy8gJk9iakNNZXRob2REZWNsOjppc0luc3RhbmNlTWV0aG9kLgorICAgIGV4cGxpY2l0IHNwZWNpZmljX2RlY2xfaXRlcmF0b3IoRGVjbENvbnRleHQ6OmRlY2xfaXRlcmF0b3IgQykgOiBDdXJyZW50KEMpIHsKKyAgICAgIFNraXBUb05leHREZWNsKCk7CisgICAgfQorCisgICAgdmFsdWVfdHlwZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBjYXN0PFNwZWNpZmljRGVjbD4oKkN1cnJlbnQpOyB9CisKKyAgICAvLyBUaGlzIGRvZXNuJ3QgbWVldCB0aGUgaXRlcmF0b3IgcmVxdWlyZW1lbnRzLCBidXQgaXQncyBjb252ZW5pZW50CisgICAgdmFsdWVfdHlwZSBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gKip0aGlzOyB9CisKKyAgICBzcGVjaWZpY19kZWNsX2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeworICAgICAgKytDdXJyZW50OworICAgICAgU2tpcFRvTmV4dERlY2woKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBzcGVjaWZpY19kZWNsX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CisgICAgICBzcGVjaWZpY19kZWNsX2l0ZXJhdG9yIHRtcCgqdGhpcyk7CisgICAgICArKygqdGhpcyk7CisgICAgICByZXR1cm4gdG1wOworICAgIH0KKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3Qgc3BlY2lmaWNfZGVjbF9pdGVyYXRvciYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwZWNpZmljX2RlY2xfaXRlcmF0b3ImIHkpIHsKKyAgICAgIHJldHVybiB4LkN1cnJlbnQgPT0geS5DdXJyZW50OworICAgIH0KKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3Qgc3BlY2lmaWNfZGVjbF9pdGVyYXRvciYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwZWNpZmljX2RlY2xfaXRlcmF0b3ImIHkpIHsKKyAgICAgIHJldHVybiB4LkN1cnJlbnQgIT0geS5DdXJyZW50OworICAgIH0KKyAgfTsKKworICAvLy8gXGJyaWVmIEl0ZXJhdGVzIG92ZXIgYSBmaWx0ZXJlZCBzdWJyYW5nZSBvZiBkZWNsYXJhdGlvbnMgc3RvcmVkCisgIC8vLyBpbiBhIERlY2xDb250ZXh0LgorICAvLy8KKyAgLy8vIFRoaXMgaXRlcmF0b3IgdmlzaXRzIG9ubHkgdGhvc2UgZGVjbGFyYXRpb25zIHRoYXQgYXJlIG9mIHR5cGUKKyAgLy8vIFNwZWNpZmljRGVjbCAob3IgYSBjbGFzcyBkZXJpdmVkIGZyb20gaXQpIGFuZCB0aGF0IG1lZXQgc29tZQorICAvLy8gYWRkaXRpb25hbCBydW4tdGltZSBjcml0ZXJpYS4gVGhpcyBpdGVyYXRvciBpcyB1c2VkLCBmb3IKKyAgLy8vIGV4YW1wbGUsIHRvIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBpbnN0YW5jZSBtZXRob2RzIHdpdGhpbiBhbgorICAvLy8gT2JqZWN0aXZlLUMgaW50ZXJmYWNlICh3aXRoIFNwZWNpZmljRGVjbCA9IE9iakNNZXRob2REZWNsIGFuZAorICAvLy8gQWNjZXB0YWJsZSA9IE9iakNNZXRob2REZWNsOjppc0luc3RhbmNlTWV0aG9kKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgU3BlY2lmaWNEZWNsLCBib29sIChTcGVjaWZpY0RlY2w6OipBY2NlcHRhYmxlKSgpIGNvbnN0PgorICBjbGFzcyBmaWx0ZXJlZF9kZWNsX2l0ZXJhdG9yIHsKKyAgICAvLy8gQ3VycmVudCAtIFRoZSBjdXJyZW50LCB1bmRlcmx5aW5nIGRlY2xhcmF0aW9uIGl0ZXJhdG9yLCB3aGljaAorICAgIC8vLyB3aWxsIGVpdGhlciBiZSBOVUxMIG9yIHdpbGwgcG9pbnQgdG8gYSBkZWNsYXJhdGlvbiBvZgorICAgIC8vLyB0eXBlIFNwZWNpZmljRGVjbC4KKyAgICBEZWNsQ29udGV4dDo6ZGVjbF9pdGVyYXRvciBDdXJyZW50OworCisgICAgLy8vIFNraXBUb05leHREZWNsIC0gQWR2YW5jZXMgdGhlIGN1cnJlbnQgcG9zaXRpb24gdXAgdG8gdGhlIG5leHQKKyAgICAvLy8gZGVjbGFyYXRpb24gb2YgdHlwZSBTcGVjaWZpY0RlY2wgdGhhdCBhbHNvIG1lZXRzIHRoZSBjcml0ZXJpYQorICAgIC8vLyByZXF1aXJlZCBieSBBY2NlcHRhYmxlLgorICAgIHZvaWQgU2tpcFRvTmV4dERlY2woKSB7CisgICAgICB3aGlsZSAoKkN1cnJlbnQgJiYKKyAgICAgICAgICAgICAoIWlzYTxTcGVjaWZpY0RlY2w+KCpDdXJyZW50KSB8fAorICAgICAgICAgICAgICAoQWNjZXB0YWJsZSAmJiAhKGNhc3Q8U3BlY2lmaWNEZWNsPigqQ3VycmVudCktPipBY2NlcHRhYmxlKSgpKSkpCisgICAgICAgICsrQ3VycmVudDsKKyAgICB9CisKKyAgcHVibGljOgorICAgIHVzaW5nIHZhbHVlX3R5cGUgPSBTcGVjaWZpY0RlY2wgKjsKKyAgICAvLyBUT0RPOiBBZGQgcmVmZXJlbmNlIGFuZCBwb2ludGVyIHR5cGVzICh3aXRoIHNvbWUgYXBwcm9wcmlhdGUgcHJveHkgdHlwZSkKKyAgICAvLyBpZiB3ZSBldmVyIGhhdmUgYSBuZWVkIGZvciB0aGVtLgorICAgIHVzaW5nIHJlZmVyZW5jZSA9IHZvaWQ7CisgICAgdXNpbmcgcG9pbnRlciA9IHZvaWQ7CisgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0KKyAgICAgICAgc3RkOjppdGVyYXRvcl90cmFpdHM8RGVjbENvbnRleHQ6OmRlY2xfaXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGU7CisgICAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworCisgICAgZmlsdGVyZWRfZGVjbF9pdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgIC8vLyBmaWx0ZXJlZF9kZWNsX2l0ZXJhdG9yIC0gQ29uc3RydWN0IGEgbmV3IGl0ZXJhdG9yIG92ZXIgYQorICAgIC8vLyBzdWJzZXQgb2YgdGhlIGRlY2xhcmF0aW9ucyB0aGUgcmFuZ2UgW0MsCisgICAgLy8vIGVuZC1vZi1kZWNsYXJhdGlvbnMpLiBJZiBBIGlzIG5vbi1OVUxMLCBpdCBpcyBhIHBvaW50ZXIgdG8gYQorICAgIC8vLyBtZW1iZXIgZnVuY3Rpb24gb2YgU3BlY2lmaWNEZWNsIHRoYXQgc2hvdWxkIHJldHVybiB0cnVlIGZvcgorICAgIC8vLyBhbGwgb2YgdGhlIFNwZWNpZmljRGVjbCBpbnN0YW5jZXMgdGhhdCB3aWxsIGJlIGluIHRoZSBzdWJzZXQKKyAgICAvLy8gb2YgaXRlcmF0b3JzLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgT2JqZWN0aXZlLUMgaW5zdGFuY2UKKyAgICAvLy8gbWV0aG9kcywgU3BlY2lmaWNEZWNsIHdpbGwgYmUgT2JqQ01ldGhvZERlY2wgYW5kIEEgd2lsbCBiZQorICAgIC8vLyAmT2JqQ01ldGhvZERlY2w6OmlzSW5zdGFuY2VNZXRob2QuCisgICAgZXhwbGljaXQgZmlsdGVyZWRfZGVjbF9pdGVyYXRvcihEZWNsQ29udGV4dDo6ZGVjbF9pdGVyYXRvciBDKSA6IEN1cnJlbnQoQykgeworICAgICAgU2tpcFRvTmV4dERlY2woKTsKKyAgICB9CisKKyAgICB2YWx1ZV90eXBlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8U3BlY2lmaWNEZWNsPigqQ3VycmVudCk7IH0KKyAgICB2YWx1ZV90eXBlIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBjYXN0PFNwZWNpZmljRGVjbD4oKkN1cnJlbnQpOyB9CisKKyAgICBmaWx0ZXJlZF9kZWNsX2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeworICAgICAgKytDdXJyZW50OworICAgICAgU2tpcFRvTmV4dERlY2woKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBmaWx0ZXJlZF9kZWNsX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CisgICAgICBmaWx0ZXJlZF9kZWNsX2l0ZXJhdG9yIHRtcCgqdGhpcyk7CisgICAgICArKygqdGhpcyk7CisgICAgICByZXR1cm4gdG1wOworICAgIH0KKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgZmlsdGVyZWRfZGVjbF9pdGVyYXRvciYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkX2RlY2xfaXRlcmF0b3ImIHkpIHsKKyAgICAgIHJldHVybiB4LkN1cnJlbnQgPT0geS5DdXJyZW50OworICAgIH0KKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgZmlsdGVyZWRfZGVjbF9pdGVyYXRvciYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkX2RlY2xfaXRlcmF0b3ImIHkpIHsKKyAgICAgIHJldHVybiB4LkN1cnJlbnQgIT0geS5DdXJyZW50OworICAgIH0KKyAgfTsKKworICAvLy8gQGJyaWVmIEFkZCB0aGUgZGVjbGFyYXRpb24gRCBpbnRvIHRoaXMgY29udGV4dC4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgc2hvdWxkIGJlIGludm9rZWQgd2hlbiB0aGUgZGVjbGFyYXRpb24gRCBoYXMgZmlyc3QKKyAgLy8vIGJlZW4gZGVjbGFyZWQsIHRvIHBsYWNlIEQgaW50byB0aGUgY29udGV4dCB3aGVyZSBpdCB3YXMKKyAgLy8vIChsZXhpY2FsbHkpIGRlZmluZWQuIEV2ZXJ5IGRlY2xhcmF0aW9uIG11c3QgYmUgYWRkZWQgdG8gb25lCisgIC8vLyAoYW5kIG9ubHkgb25lISkgY29udGV4dCwgd2hlcmUgaXQgY2FuIGJlIHZpc2l0ZWQgdmlhCisgIC8vLyBbZGVjbHNfYmVnaW4oKSwgZGVjbHNfZW5kKCkpLiBPbmNlIGEgZGVjbGFyYXRpb24gaGFzIGJlZW4gYWRkZWQKKyAgLy8vIHRvIGl0cyBsZXhpY2FsIGNvbnRleHQsIHRoZSBjb3JyZXNwb25kaW5nIERlY2xDb250ZXh0IG93bnMgdGhlCisgIC8vLyBkZWNsYXJhdGlvbi4KKyAgLy8vCisgIC8vLyBJZiBEIGlzIGFsc28gYSBOYW1lZERlY2wsIGl0IHdpbGwgYmUgbWFkZSB2aXNpYmxlIHdpdGhpbiBpdHMKKyAgLy8vIHNlbWFudGljIGNvbnRleHQgdmlhIG1ha2VEZWNsVmlzaWJsZUluQ29udGV4dC4KKyAgdm9pZCBhZGREZWNsKERlY2wgKkQpOworCisgIC8vLyBAYnJpZWYgQWRkIHRoZSBkZWNsYXJhdGlvbiBEIGludG8gdGhpcyBjb250ZXh0LCBidXQgc3VwcHJlc3MKKyAgLy8vIHNlYXJjaGVzIGZvciBleHRlcm5hbCBkZWNsYXJhdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLgorICAvLy8KKyAgLy8vIEFsdGhvdWdoIGFuYWxvZ291cyBpbiBmdW5jdGlvbiB0byBhZGREZWNsLCB0aGlzIHJlbW92ZXMgYW4KKyAgLy8vIGltcG9ydGFudCBjaGVjay4gIFRoaXMgaXMgb25seSB1c2VmdWwgaWYgdGhlIERlY2wgaXMgYmVpbmcKKyAgLy8vIGFkZGVkIGluIHJlc3BvbnNlIHRvIGFuIGV4dGVybmFsIHNlYXJjaDsgaW4gYWxsIG90aGVyIGNhc2VzLAorICAvLy8gYWRkRGVjbCgpIGlzIHRoZSByaWdodCBmdW5jdGlvbiB0byB1c2UuCisgIC8vLyBTZWUgdGhlIEFTVEltcG9ydGVyIGZvciB1c2UgY2FzZXMuCisgIHZvaWQgYWRkRGVjbEludGVybmFsKERlY2wgKkQpOworCisgIC8vLyBAYnJpZWYgQWRkIHRoZSBkZWNsYXJhdGlvbiBEIHRvIHRoaXMgY29udGV4dCB3aXRob3V0IG1vZGlmeWluZworICAvLy8gYW55IGxvb2t1cCB0YWJsZXMuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VmdWwgZm9yIHNvbWUgb3BlcmF0aW9ucyBpbiBkZXBlbmRlbnQgY29udGV4dHMgd2hlcmUKKyAgLy8vIHRoZSBzZW1hbnRpYyBjb250ZXh0IG1pZ2h0IG5vdCBiZSBkZXBlbmRlbnQ7ICB0aGlzIGJhc2ljYWxseQorICAvLy8gb25seSBoYXBwZW5zIHdpdGggZnJpZW5kcy4KKyAgdm9pZCBhZGRIaWRkZW5EZWNsKERlY2wgKkQpOworCisgIC8vLyBAYnJpZWYgUmVtb3ZlcyBhIGRlY2xhcmF0aW9uIGZyb20gdGhpcyBjb250ZXh0LgorICB2b2lkIHJlbW92ZURlY2woRGVjbCAqRCk7CisgICAgCisgIC8vLyBAYnJpZWYgQ2hlY2tzIHdoZXRoZXIgYSBkZWNsYXJhdGlvbiBpcyBpbiB0aGlzIGNvbnRleHQuCisgIGJvb2wgY29udGFpbnNEZWNsKERlY2wgKkQpIGNvbnN0OworCisgIHVzaW5nIGxvb2t1cF9yZXN1bHQgPSBEZWNsQ29udGV4dExvb2t1cFJlc3VsdDsKKyAgdXNpbmcgbG9va3VwX2l0ZXJhdG9yID0gbG9va3VwX3Jlc3VsdDo6aXRlcmF0b3I7CisKKyAgLy8vIGxvb2t1cCAtIEZpbmQgdGhlIGRlY2xhcmF0aW9ucyAoaWYgYW55KSB3aXRoIHRoZSBnaXZlbiBOYW1lIGluCisgIC8vLyB0aGlzIGNvbnRleHQuIFJldHVybnMgYSByYW5nZSBvZiBpdGVyYXRvcnMgdGhhdCBjb250YWlucyBhbGwgb2YKKyAgLy8vIHRoZSBkZWNsYXJhdGlvbnMgd2l0aCB0aGlzIG5hbWUsIHdpdGggb2JqZWN0LCBmdW5jdGlvbiwgbWVtYmVyLAorICAvLy8gYW5kIGVudW1lcmF0b3IgbmFtZXMgcHJlY2VkaW5nIGFueSB0YWcgbmFtZS4gTm90ZSB0aGF0IHRoaXMKKyAgLy8vIHJvdXRpbmUgd2lsbCBub3QgbG9vayBpbnRvIHBhcmVudCBjb250ZXh0cy4KKyAgbG9va3VwX3Jlc3VsdCBsb29rdXAoRGVjbGFyYXRpb25OYW1lIE5hbWUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRmluZCB0aGUgZGVjbGFyYXRpb25zIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBhcmUgdmlzaWJsZQorICAvLy8gd2l0aGluIHRoaXMgY29udGV4dDsgZG9uJ3QgYXR0ZW1wdCB0byByZXRyaWV2ZSBhbnl0aGluZyBmcm9tIGFuCisgIC8vLyBleHRlcm5hbCBzb3VyY2UuCisgIGxvb2t1cF9yZXN1bHQgbm9sb2FkX2xvb2t1cChEZWNsYXJhdGlvbk5hbWUgTmFtZSk7CisKKyAgLy8vIFxicmllZiBBIHNpbXBsaXN0aWMgbmFtZSBsb29rdXAgbWVjaGFuaXNtIHRoYXQgcGVyZm9ybXMgbmFtZSBsb29rdXAKKyAgLy8vIGludG8gdGhpcyBkZWNsYXJhdGlvbiBjb250ZXh0IHdpdGhvdXQgY29uc3VsdGluZyB0aGUgZXh0ZXJuYWwgc291cmNlLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGFsbW9zdCBuZXZlciBiZSB1c2VkLCBiZWNhdXNlIGl0IHN1YnZlcnRzIHRoZQorICAvLy8gdXN1YWwgcmVsYXRpb25zaGlwIGJldHdlZW4gYSBEZWNsQ29udGV4dCBhbmQgdGhlIGV4dGVybmFsIHNvdXJjZS4KKyAgLy8vIFNlZSB0aGUgQVNUSW1wb3J0ZXIgZm9yIHRoZSAoZmV3LCBidXQgaW1wb3J0YW50KSB1c2UgY2FzZXMuCisgIC8vLworICAvLy8gRklYTUU6IFRoaXMgaXMgdmVyeSBpbmVmZmljaWVudDsgcmVwbGFjZSB1c2VzIG9mIGl0IHdpdGggdXNlcyBvZgorICAvLy8gbm9sb2FkX2xvb2t1cC4KKyAgdm9pZCBsb2NhbFVuY2FjaGVkTG9va3VwKERlY2xhcmF0aW9uTmFtZSBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE5hbWVkRGVjbCAqPiAmUmVzdWx0cyk7CisKKyAgLy8vIEBicmllZiBNYWtlcyBhIGRlY2xhcmF0aW9uIHZpc2libGUgd2l0aGluIHRoaXMgY29udGV4dC4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgbWFrZXMgdGhlIGRlY2xhcmF0aW9uIEQgdmlzaWJsZSB0byBuYW1lIGxvb2t1cAorICAvLy8gd2l0aGluIHRoaXMgY29udGV4dCBhbmQsIGlmIHRoaXMgaXMgYSB0cmFuc3BhcmVudCBjb250ZXh0LAorICAvLy8gd2l0aGluIGl0cyBwYXJlbnQgY29udGV4dHMgdXAgdG8gdGhlIGZpcnN0IGVuY2xvc2luZworICAvLy8gbm9uLXRyYW5zcGFyZW50IGNvbnRleHQuIE1ha2luZyBhIGRlY2xhcmF0aW9uIHZpc2libGUgd2l0aGluIGEKKyAgLy8vIGNvbnRleHQgZG9lcyBub3QgdHJhbnNmZXIgb3duZXJzaGlwIG9mIGEgZGVjbGFyYXRpb24sIGFuZCBhCisgIC8vLyBkZWNsYXJhdGlvbiBjYW4gYmUgdmlzaWJsZSBpbiBtYW55IGNvbnRleHRzIHRoYXQgYXJlbid0IGl0cworICAvLy8gbGV4aWNhbCBjb250ZXh0LgorICAvLy8KKyAgLy8vIElmIEQgaXMgYSByZWRlY2xhcmF0aW9uIG9mIGFuIGV4aXN0aW5nIGRlY2xhcmF0aW9uIHRoYXQgaXMKKyAgLy8vIHZpc2libGUgZnJvbSB0aGlzIGNvbnRleHQsIGFzIGRldGVybWluZWQgYnkKKyAgLy8vIE5hbWVkRGVjbDo6ZGVjbGFyYXRpb25SZXBsYWNlcywgdGhlIHByZXZpb3VzIGRlY2xhcmF0aW9uIHdpbGwgYmUKKyAgLy8vIHJlcGxhY2VkIHdpdGggRC4KKyAgdm9pZCBtYWtlRGVjbFZpc2libGVJbkNvbnRleHQoTmFtZWREZWNsICpEKTsKKworICAvLy8gYWxsX2xvb2t1cHNfaXRlcmF0b3IgLSBBbiBpdGVyYXRvciB0aGF0IHByb3ZpZGVzIGEgdmlldyBvdmVyIHRoZSByZXN1bHRzCisgIC8vLyBvZiBsb29raW5nIHVwIGV2ZXJ5IHBvc3NpYmxlIG5hbWUuCisgIGNsYXNzIGFsbF9sb29rdXBzX2l0ZXJhdG9yOworCisgIHVzaW5nIGxvb2t1cHNfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxhbGxfbG9va3Vwc19pdGVyYXRvcj47CisKKyAgbG9va3Vwc19yYW5nZSBsb29rdXBzKCkgY29uc3Q7CisgIC8vIExpa2UgbG9va3VwcygpLCBidXQgYXZvaWRzIGxvYWRpbmcgZXh0ZXJuYWwgZGVjbGFyYXRpb25zLgorICAvLyBJZiBQcmVzZXJ2ZUludGVybmFsU3RhdGUsIGF2b2lkcyBidWlsZGluZyBsb29rdXAgZGF0YSBzdHJ1Y3R1cmVzIHRvby4KKyAgbG9va3Vwc19yYW5nZSBub2xvYWRfbG9va3Vwcyhib29sIFByZXNlcnZlSW50ZXJuYWxTdGF0ZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJdGVyYXRvcnMgb3ZlciBhbGwgcG9zc2libGUgbG9va3VwcyB3aXRoaW4gdGhpcyBjb250ZXh0LgorICBhbGxfbG9va3Vwc19pdGVyYXRvciBsb29rdXBzX2JlZ2luKCkgY29uc3Q7CisgIGFsbF9sb29rdXBzX2l0ZXJhdG9yIGxvb2t1cHNfZW5kKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJdGVyYXRvcnMgb3ZlciBhbGwgcG9zc2libGUgbG9va3VwcyB3aXRoaW4gdGhpcyBjb250ZXh0IHRoYXQgYXJlCisgIC8vLyBjdXJyZW50bHkgbG9hZGVkOyBkb24ndCBhdHRlbXB0IHRvIHJldHJpZXZlIGFueXRoaW5nIGZyb20gYW4gZXh0ZXJuYWwKKyAgLy8vIHNvdXJjZS4KKyAgYWxsX2xvb2t1cHNfaXRlcmF0b3Igbm9sb2FkX2xvb2t1cHNfYmVnaW4oKSBjb25zdDsKKyAgYWxsX2xvb2t1cHNfaXRlcmF0b3Igbm9sb2FkX2xvb2t1cHNfZW5kKCkgY29uc3Q7CisKKyAgc3RydWN0IHVkaXJfaXRlcmF0b3I7CisKKyAgdXNpbmcgdWRpcl9pdGVyYXRvcl9iYXNlID0KKyAgICAgIGxsdm06Oml0ZXJhdG9yX2FkYXB0b3JfYmFzZTx1ZGlyX2l0ZXJhdG9yLCBsb29rdXBfaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2luZ0RpcmVjdGl2ZURlY2wgKj47CisKKyAgc3RydWN0IHVkaXJfaXRlcmF0b3IgOiB1ZGlyX2l0ZXJhdG9yX2Jhc2UgeworICAgIHVkaXJfaXRlcmF0b3IobG9va3VwX2l0ZXJhdG9yIEkpIDogdWRpcl9pdGVyYXRvcl9iYXNlKEkpIHt9CisKKyAgICBVc2luZ0RpcmVjdGl2ZURlY2wgKm9wZXJhdG9yKigpIGNvbnN0OworICB9OworCisgIHVzaW5nIHVkaXJfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTx1ZGlyX2l0ZXJhdG9yPjsKKworICB1ZGlyX3JhbmdlIHVzaW5nX2RpcmVjdGl2ZXMoKSBjb25zdDsKKworICAvLyBUaGVzZSBhcmUgYWxsIGRlZmluZWQgaW4gRGVwZW5kZW50RGlhZ25vc3RpYy5oLgorICBjbGFzcyBkZGlhZ19pdGVyYXRvcjsKKworICB1c2luZyBkZGlhZ19yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPERlY2xDb250ZXh0OjpkZGlhZ19pdGVyYXRvcj47CisKKyAgaW5saW5lIGRkaWFnX3JhbmdlIGRkaWFncygpIGNvbnN0OworCisgIC8vIExvdy1sZXZlbCBhY2Nlc3NvcnMKKworICAvLy8gXGJyaWVmIE1hcmsgdGhhdCB0aGVyZSBhcmUgZXh0ZXJuYWwgbGV4aWNhbCBkZWNsYXJhdGlvbnMgdGhhdCB3ZSBuZWVkCisgIC8vLyB0byBpbmNsdWRlIGluIG91ciBsb29rdXAgdGFibGUgKGFuZCB0aGF0IGFyZSBub3QgYXZhaWxhYmxlIGFzIGV4dGVybmFsCisgIC8vLyB2aXNpYmxlIGxvb2t1cHMpLiBUaGVzZSBleHRyYSBsb29rdXAgcmVzdWx0cyB3aWxsIGJlIGZvdW5kIGJ5IHdhbGtpbmcKKyAgLy8vIHRoZSBsZXhpY2FsIGRlY2xhcmF0aW9ucyBvZiB0aGlzIGNvbnRleHQuIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seSBpZgorICAvLy8gc2V0SGFzRXh0ZXJuYWxMZXhpY2FsU3RvcmFnZSgpIGhhcyBiZWVuIGNhbGxlZCBvbiBhbnkgZGVjbCBjb250ZXh0IGZvcgorICAvLy8gd2hpY2ggdGhpcyBpcyB0aGUgcHJpbWFyeSBjb250ZXh0LgorICB2b2lkIHNldE11c3RCdWlsZExvb2t1cFRhYmxlKCkgeworICAgIGFzc2VydCh0aGlzID09IGdldFByaW1hcnlDb250ZXh0KCkgJiYKKyAgICAgICAgICAgInNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBwcmltYXJ5IGNvbnRleHQiKTsKKyAgICBIYXNMYXp5RXh0ZXJuYWxMZXhpY2FsTG9va3VwcyA9IHRydWU7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbG9va3VwIHN0cnVjdHVyZS4KKyAgLy8vIFRoaXMgbWF5IG9taXQgc29tZSBuYW1lcyBpZiB3ZSBhcmUgbGF6aWx5IGJ1aWxkaW5nIHRoZSBzdHJ1Y3R1cmUuCisgIFN0b3JlZERlY2xzTWFwICpnZXRMb29rdXBQdHIoKSBjb25zdCB7IHJldHVybiBMb29rdXBQdHI7IH0KKworICAvLy8gXGJyaWVmIEVuc3VyZSB0aGUgbG9va3VwIHN0cnVjdHVyZSBpcyBmdWxseS1idWlsdCBhbmQgcmV0dXJuIGl0LgorICBTdG9yZWREZWNsc01hcCAqYnVpbGRMb29rdXAoKTsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBEZWNsQ29udGV4dCBoYXMgZXh0ZXJuYWwgc3RvcmFnZSBjb250YWluaW5nCisgIC8vLyBhZGRpdGlvbmFsIGRlY2xhcmF0aW9ucyB0aGF0IGFyZSBsZXhpY2FsbHkgaW4gdGhpcyBjb250ZXh0LgorICBib29sIGhhc0V4dGVybmFsTGV4aWNhbFN0b3JhZ2UoKSBjb25zdCB7IHJldHVybiBFeHRlcm5hbExleGljYWxTdG9yYWdlOyB9CisKKyAgLy8vIFxicmllZiBTdGF0ZSB3aGV0aGVyIHRoaXMgRGVjbENvbnRleHQgaGFzIGV4dGVybmFsIHN0b3JhZ2UgZm9yCisgIC8vLyBkZWNsYXJhdGlvbnMgbGV4aWNhbGx5IGluIHRoaXMgY29udGV4dC4KKyAgdm9pZCBzZXRIYXNFeHRlcm5hbExleGljYWxTdG9yYWdlKGJvb2wgRVMgPSB0cnVlKSB7CisgICAgRXh0ZXJuYWxMZXhpY2FsU3RvcmFnZSA9IEVTOworICB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgRGVjbENvbnRleHQgaGFzIGV4dGVybmFsIHN0b3JhZ2UgY29udGFpbmluZworICAvLy8gYWRkaXRpb25hbCBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgdmlzaWJsZSBpbiB0aGlzIGNvbnRleHQuCisgIGJvb2wgaGFzRXh0ZXJuYWxWaXNpYmxlU3RvcmFnZSgpIGNvbnN0IHsgcmV0dXJuIEV4dGVybmFsVmlzaWJsZVN0b3JhZ2U7IH0KKworICAvLy8gXGJyaWVmIFN0YXRlIHdoZXRoZXIgdGhpcyBEZWNsQ29udGV4dCBoYXMgZXh0ZXJuYWwgc3RvcmFnZSBmb3IKKyAgLy8vIGRlY2xhcmF0aW9ucyB2aXNpYmxlIGluIHRoaXMgY29udGV4dC4KKyAgdm9pZCBzZXRIYXNFeHRlcm5hbFZpc2libGVTdG9yYWdlKGJvb2wgRVMgPSB0cnVlKSB7CisgICAgRXh0ZXJuYWxWaXNpYmxlU3RvcmFnZSA9IEVTOworICAgIGlmIChFUyAmJiBMb29rdXBQdHIpCisgICAgICBOZWVkVG9SZWNvbmNpbGVFeHRlcm5hbFZpc2libGVTdG9yYWdlID0gdHJ1ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGRlY2xhcmF0aW9uIGlzIHN0b3JlZCBpbiB0aGUgbGlzdCBvZgorICAvLy8gZGVjbGFyYXRpb25zIGxleGljYWxseSB3aXRoaW4gdGhpcyBjb250ZXh0LgorICBib29sIGlzRGVjbEluTGV4aWNhbFRyYXZlcnNhbChjb25zdCBEZWNsICpEKSBjb25zdCB7CisgICAgcmV0dXJuIEQgJiYgKEQtPk5leHRJbkNvbnRleHRBbmRCaXRzLmdldFBvaW50ZXIoKSB8fCBEID09IEZpcnN0RGVjbCB8fCAKKyAgICAgICAgICAgICAgICAgRCA9PSBMYXN0RGVjbCk7CisgIH0KKworICBib29sIHNldFVzZVF1YWxpZmllZExvb2t1cChib29sIHVzZSA9IHRydWUpIHsKKyAgICBib29sIG9sZF92YWx1ZSA9IFVzZVF1YWxpZmllZExvb2t1cDsKKyAgICBVc2VRdWFsaWZpZWRMb29rdXAgPSB1c2U7CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKKyAgfQorCisgIGJvb2wgc2hvdWxkVXNlUXVhbGlmaWVkTG9va3VwKCkgY29uc3QgeworICAgIHJldHVybiBVc2VRdWFsaWZpZWRMb29rdXA7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpOworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2xDb250ZXh0ICpEKSB7IHJldHVybiB0cnVlOyB9CisKKyAgdm9pZCBkdW1wRGVjbENvbnRleHQoKSBjb25zdDsKKyAgdm9pZCBkdW1wTG9va3VwcygpIGNvbnN0OworICB2b2lkIGR1bXBMb29rdXBzKGxsdm06OnJhd19vc3RyZWFtICZPUywgYm9vbCBEdW1wRGVjbHMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICBib29sIERlc2VyaWFsaXplID0gZmFsc2UpIGNvbnN0OworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgRGVwZW5kZW50RGlhZ25vc3RpYzsKKworICB2b2lkIHJlY29uY2lsZUV4dGVybmFsVmlzaWJsZVN0b3JhZ2UoKSBjb25zdDsKKyAgYm9vbCBMb2FkTGV4aWNhbERlY2xzRnJvbUV4dGVybmFsU3RvcmFnZSgpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgTWFrZXMgYSBkZWNsYXJhdGlvbiB2aXNpYmxlIHdpdGhpbiB0aGlzIGNvbnRleHQsIGJ1dAorICAvLy8gc3VwcHJlc3NlcyBzZWFyY2hlcyBmb3IgZXh0ZXJuYWwgZGVjbGFyYXRpb25zIHdpdGggdGhlIHNhbWUKKyAgLy8vIG5hbWUuCisgIC8vLworICAvLy8gQW5hbG9nb3VzIHRvIG1ha2VEZWNsVmlzaWJsZUluQ29udGV4dCwgYnV0IGZvciB0aGUgZXhjbHVzaXZlCisgIC8vLyB1c2Ugb2YgYWRkRGVjbEludGVybmFsKCkuCisgIHZvaWQgbWFrZURlY2xWaXNpYmxlSW5Db250ZXh0SW50ZXJuYWwoTmFtZWREZWNsICpEKTsKKworICBTdG9yZWREZWNsc01hcCAqQ3JlYXRlU3RvcmVkRGVjbHNNYXAoQVNUQ29udGV4dCAmQykgY29uc3Q7CisKKyAgdm9pZCBsb2FkTGF6eUxvY2FsTGV4aWNhbExvb2t1cHMoKTsKKyAgdm9pZCBidWlsZExvb2t1cEltcGwoRGVjbENvbnRleHQgKkRDdHgsIGJvb2wgSW50ZXJuYWwpOworICB2b2lkIG1ha2VEZWNsVmlzaWJsZUluQ29udGV4dFdpdGhGbGFncyhOYW1lZERlY2wgKkQsIGJvb2wgSW50ZXJuYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVkaXNjb3ZlcmFibGUpOworICB2b2lkIG1ha2VEZWNsVmlzaWJsZUluQ29udGV4dEltcGwoTmFtZWREZWNsICpELCBib29sIEludGVybmFsKTsKK307CisKK2lubGluZSBib29sIERlY2w6OmlzVGVtcGxhdGVQYXJhbWV0ZXIoKSBjb25zdCB7CisgIHJldHVybiBnZXRLaW5kKCkgPT0gVGVtcGxhdGVUeXBlUGFybSB8fCBnZXRLaW5kKCkgPT0gTm9uVHlwZVRlbXBsYXRlUGFybSB8fAorICAgICAgICAgZ2V0S2luZCgpID09IFRlbXBsYXRlVGVtcGxhdGVQYXJtOworfQorCisvLyBTcGVjaWFsaXphdGlvbiBzZWxlY3RlZCB3aGVuIFRvVHkgaXMgbm90IGEga25vd24gc3ViY2xhc3Mgb2YgRGVjbENvbnRleHQuCit0ZW1wbGF0ZSA8Y2xhc3MgVG9UeSwKKyAgICAgICAgICBib29sIElzS25vd25TdWJ0eXBlID0gOjpzdGQ6OmlzX2Jhc2Vfb2Y8RGVjbENvbnRleHQsIFRvVHk+Ojp2YWx1ZT4KK3N0cnVjdCBjYXN0X2NvbnZlcnRfZGVjbF9jb250ZXh0IHsKKyAgc3RhdGljIGNvbnN0IFRvVHkgKmRvaXQoY29uc3QgRGVjbENvbnRleHQgKlZhbCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBUb1R5Kj4oRGVjbDo6Y2FzdEZyb21EZWNsQ29udGV4dChWYWwpKTsKKyAgfQorCisgIHN0YXRpYyBUb1R5ICpkb2l0KERlY2xDb250ZXh0ICpWYWwpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VG9UeSo+KERlY2w6OmNhc3RGcm9tRGVjbENvbnRleHQoVmFsKSk7CisgIH0KK307CisKKy8vIFNwZWNpYWxpemF0aW9uIHNlbGVjdGVkIHdoZW4gVG9UeSBpcyBhIGtub3duIHN1YmNsYXNzIG9mIERlY2xDb250ZXh0LgordGVtcGxhdGUgPGNsYXNzIFRvVHk+CitzdHJ1Y3QgY2FzdF9jb252ZXJ0X2RlY2xfY29udGV4dDxUb1R5LCB0cnVlPiB7CisgIHN0YXRpYyBjb25zdCBUb1R5ICpkb2l0KGNvbnN0IERlY2xDb250ZXh0ICpWYWwpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgVG9UeSo+KFZhbCk7CisgIH0KKworICBzdGF0aWMgVG9UeSAqZG9pdChEZWNsQ29udGV4dCAqVmFsKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRvVHkqPihWYWwpOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBpc2E8VD4oRGVjbENvbnRleHQqKQordGVtcGxhdGUgPHR5cGVuYW1lIFRvPgorc3RydWN0IGlzYV9pbXBsPFRvLCA6OmNsYW5nOjpEZWNsQ29udGV4dD4geworICBzdGF0aWMgYm9vbCBkb2l0KGNvbnN0IDo6Y2xhbmc6OkRlY2xDb250ZXh0ICZWYWwpIHsKKyAgICByZXR1cm4gVG86OmNsYXNzb2ZLaW5kKFZhbC5nZXREZWNsS2luZCgpKTsKKyAgfQorfTsKKworLy8vIGNhc3Q8VD4oRGVjbENvbnRleHQqKQordGVtcGxhdGU8Y2xhc3MgVG9UeT4KK3N0cnVjdCBjYXN0X2NvbnZlcnRfdmFsPFRvVHksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OmNsYW5nOjpEZWNsQ29udGV4dCxjb25zdCA6OmNsYW5nOjpEZWNsQ29udGV4dD4geworICBzdGF0aWMgY29uc3QgVG9UeSAmZG9pdChjb25zdCA6OmNsYW5nOjpEZWNsQ29udGV4dCAmVmFsKSB7CisgICAgcmV0dXJuICo6OmNsYW5nOjpjYXN0X2NvbnZlcnRfZGVjbF9jb250ZXh0PFRvVHk+Ojpkb2l0KCZWYWwpOworICB9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBUb1R5Pgorc3RydWN0IGNhc3RfY29udmVydF92YWw8VG9UeSwgOjpjbGFuZzo6RGVjbENvbnRleHQsIDo6Y2xhbmc6OkRlY2xDb250ZXh0PiB7CisgIHN0YXRpYyBUb1R5ICZkb2l0KDo6Y2xhbmc6OkRlY2xDb250ZXh0ICZWYWwpIHsKKyAgICByZXR1cm4gKjo6Y2xhbmc6OmNhc3RfY29udmVydF9kZWNsX2NvbnRleHQ8VG9UeT46OmRvaXQoJlZhbCk7CisgIH0KK307CisKK3RlbXBsYXRlPGNsYXNzIFRvVHk+CitzdHJ1Y3QgY2FzdF9jb252ZXJ0X3ZhbDxUb1R5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjpjbGFuZzo6RGVjbENvbnRleHQqLCBjb25zdCA6OmNsYW5nOjpEZWNsQ29udGV4dCo+IHsKKyAgc3RhdGljIGNvbnN0IFRvVHkgKmRvaXQoY29uc3QgOjpjbGFuZzo6RGVjbENvbnRleHQgKlZhbCkgeworICAgIHJldHVybiA6OmNsYW5nOjpjYXN0X2NvbnZlcnRfZGVjbF9jb250ZXh0PFRvVHk+Ojpkb2l0KFZhbCk7CisgIH0KK307CisKK3RlbXBsYXRlPGNsYXNzIFRvVHk+CitzdHJ1Y3QgY2FzdF9jb252ZXJ0X3ZhbDxUb1R5LCA6OmNsYW5nOjpEZWNsQ29udGV4dCosIDo6Y2xhbmc6OkRlY2xDb250ZXh0Kj4geworICBzdGF0aWMgVG9UeSAqZG9pdCg6OmNsYW5nOjpEZWNsQ29udGV4dCAqVmFsKSB7CisgICAgcmV0dXJuIDo6Y2xhbmc6OmNhc3RfY29udmVydF9kZWNsX2NvbnRleHQ8VG9UeT46OmRvaXQoVmFsKTsKKyAgfQorfTsKKworLy8vIEltcGxlbWVudCBjYXN0X2NvbnZlcnRfdmFsIGZvciBEZWNsIC0+IERlY2xDb250ZXh0IGNvbnZlcnNpb25zLgordGVtcGxhdGU8Y2xhc3MgRnJvbVR5Pgorc3RydWN0IGNhc3RfY29udmVydF92YWw8IDo6Y2xhbmc6OkRlY2xDb250ZXh0LCBGcm9tVHksIEZyb21UeT4geworICBzdGF0aWMgOjpjbGFuZzo6RGVjbENvbnRleHQgJmRvaXQoY29uc3QgRnJvbVR5ICZWYWwpIHsKKyAgICByZXR1cm4gKkZyb21UeTo6Y2FzdFRvRGVjbENvbnRleHQoJlZhbCk7CisgIH0KK307CisKK3RlbXBsYXRlPGNsYXNzIEZyb21UeT4KK3N0cnVjdCBjYXN0X2NvbnZlcnRfdmFsPCA6OmNsYW5nOjpEZWNsQ29udGV4dCwgRnJvbVR5KiwgRnJvbVR5Kj4geworICBzdGF0aWMgOjpjbGFuZzo6RGVjbENvbnRleHQgKmRvaXQoY29uc3QgRnJvbVR5ICpWYWwpIHsKKyAgICByZXR1cm4gRnJvbVR5OjpjYXN0VG9EZWNsQ29udGV4dChWYWwpOworICB9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBGcm9tVHk+CitzdHJ1Y3QgY2FzdF9jb252ZXJ0X3ZhbDwgY29uc3QgOjpjbGFuZzo6RGVjbENvbnRleHQsIEZyb21UeSwgRnJvbVR5PiB7CisgIHN0YXRpYyBjb25zdCA6OmNsYW5nOjpEZWNsQ29udGV4dCAmZG9pdChjb25zdCBGcm9tVHkgJlZhbCkgeworICAgIHJldHVybiAqRnJvbVR5OjpjYXN0VG9EZWNsQ29udGV4dCgmVmFsKTsKKyAgfQorfTsKKwordGVtcGxhdGU8Y2xhc3MgRnJvbVR5Pgorc3RydWN0IGNhc3RfY29udmVydF92YWw8IGNvbnN0IDo6Y2xhbmc6OkRlY2xDb250ZXh0LCBGcm9tVHkqLCBGcm9tVHkqPiB7CisgIHN0YXRpYyBjb25zdCA6OmNsYW5nOjpEZWNsQ29udGV4dCAqZG9pdChjb25zdCBGcm9tVHkgKlZhbCkgeworICAgIHJldHVybiBGcm9tVHk6OmNhc3RUb0RlY2xDb250ZXh0KFZhbCk7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUX0RFQ0xCQVNFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsQ1hYLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbENYWC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZTE2NzcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbENYWC5oCkBAIC0wLDAgKzEsMzkwNCBAQAorLy89PT0tIERlY2xDWFguaCAtIENsYXNzZXMgZm9yIHJlcHJlc2VudGluZyBDKysgZGVjbGFyYXRpb25zIC0tKi0gQysrIC0qLT09PT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgQysrIERlY2wgc3ViY2xhc3Nlcywgb3RoZXIgdGhhbiB0aG9zZSBmb3IgdGVtcGxhdGVzCisvLy8gKGZvdW5kIGluIERlY2xUZW1wbGF0ZS5oKSBhbmQgZnJpZW5kcyAoaW4gRGVjbEZyaWVuZC5oKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0RFQ0xDWFhfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9ERUNMQ1hYX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVFVucmVzb2x2ZWRTZXQuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvQXR0ci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xhcmF0aW9uTmFtZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0V4dGVybmFsQVNUU291cmNlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0xhbWJkYUNhcHR1cmUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvTmVzdGVkTmFtZVNwZWNpZmllci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9SZWRlY2xhcmFibGUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGVMb2MuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVW5yZXNvbHZlZFNldC5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MYW1iZGEuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MYW5nT3B0aW9ucy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZXJhdG9yS2luZHMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NwZWNpZmllcnMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BvaW50ZXJMaWtlVHlwZVRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9UcmFpbGluZ09iamVjdHMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQ2xhc3NUZW1wbGF0ZURlY2w7CitjbGFzcyBDb25zdHJ1Y3RvclVzaW5nU2hhZG93RGVjbDsKK2NsYXNzIENYWEJhc2VQYXRoOworY2xhc3MgQ1hYQmFzZVBhdGhzOworY2xhc3MgQ1hYQ29uc3RydWN0b3JEZWNsOworY2xhc3MgQ1hYRGVzdHJ1Y3RvckRlY2w7CitjbGFzcyBDWFhGaW5hbE92ZXJyaWRlck1hcDsKK2NsYXNzIENYWEluZGlyZWN0UHJpbWFyeUJhc2VTZXQ7CitjbGFzcyBDWFhNZXRob2REZWNsOworY2xhc3MgRGlhZ25vc3RpY0J1aWxkZXI7CitjbGFzcyBGcmllbmREZWNsOworY2xhc3MgRnVuY3Rpb25UZW1wbGF0ZURlY2w7CitjbGFzcyBJZGVudGlmaWVySW5mbzsKK2NsYXNzIE1lbWJlclNwZWNpYWxpemF0aW9uSW5mbzsKK2NsYXNzIFRlbXBsYXRlRGVjbDsKK2NsYXNzIFRlbXBsYXRlUGFyYW1ldGVyTGlzdDsKK2NsYXNzIFVzaW5nRGVjbDsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGFueSBraW5kIG9mIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLCB3aGV0aGVyIGl0IGlzIGEKKy8vLyBjb25jcmV0ZSBmdW5jdGlvbiBvciBhIGZ1bmN0aW9uIHRlbXBsYXRlLgorY2xhc3MgQW55RnVuY3Rpb25EZWNsIHsKKyAgTmFtZWREZWNsICpGdW5jdGlvbjsKKworICBBbnlGdW5jdGlvbkRlY2woTmFtZWREZWNsICpORCkgOiBGdW5jdGlvbihORCkge30KKworcHVibGljOgorICBBbnlGdW5jdGlvbkRlY2woRnVuY3Rpb25EZWNsICpGRCkgOiBGdW5jdGlvbihGRCkge30KKyAgQW55RnVuY3Rpb25EZWNsKEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpGVEQpOworCisgIC8vLyBcYnJpZWYgSW1wbGljaWx5IGNvbnZlcnRzIGFueSBmdW5jdGlvbiBvciBmdW5jdGlvbiB0ZW1wbGF0ZSBpbnRvIGEKKyAgLy8vIG5hbWVkIGRlY2xhcmF0aW9uLgorICBvcGVyYXRvciBOYW1lZERlY2wgKigpIGNvbnN0IHsgcmV0dXJuIEZ1bmN0aW9uOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvciBmdW5jdGlvbiB0ZW1wbGF0ZS4KKyAgTmFtZWREZWNsICpnZXQoKSBjb25zdCB7IHJldHVybiBGdW5jdGlvbjsgfQorCisgIHN0YXRpYyBBbnlGdW5jdGlvbkRlY2wgZ2V0RnJvbU5hbWVkRGVjbChOYW1lZERlY2wgKk5EKSB7CisgICAgcmV0dXJuIEFueUZ1bmN0aW9uRGVjbChORCk7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKK25hbWVzcGFjZSBsbHZtIHsKKworICAvLyBQcm92aWRlIFBvaW50ZXJMaWtlVHlwZVRyYWl0cyBmb3Igbm9uLWN2ciBwb2ludGVycy4KKyAgdGVtcGxhdGU8PgorICBzdHJ1Y3QgUG9pbnRlckxpa2VUeXBlVHJhaXRzPCA6OmNsYW5nOjpBbnlGdW5jdGlvbkRlY2w+IHsKKyAgICBzdGF0aWMgdm9pZCAqZ2V0QXNWb2lkUG9pbnRlcig6OmNsYW5nOjpBbnlGdW5jdGlvbkRlY2wgRikgeworICAgICAgcmV0dXJuIEYuZ2V0KCk7CisgICAgfQorCisgICAgc3RhdGljIDo6Y2xhbmc6OkFueUZ1bmN0aW9uRGVjbCBnZXRGcm9tVm9pZFBvaW50ZXIodm9pZCAqUCkgeworICAgICAgcmV0dXJuIDo6Y2xhbmc6OkFueUZ1bmN0aW9uRGVjbDo6Z2V0RnJvbU5hbWVkRGVjbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8IDo6Y2xhbmc6Ok5hbWVkRGVjbCo+KFApKTsKKyAgICB9CisKKyAgICBlbnVtIHsgTnVtTG93Qml0c0F2YWlsYWJsZSA9IDIgfTsKKyAgfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCituYW1lc3BhY2UgY2xhbmcgeworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYW4gYWNjZXNzIHNwZWNpZmllciBmb2xsb3dlZCBieSBjb2xvbiAnOicuCisvLy8KKy8vLyBBbiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBzdWdhciBmb3IgdGhlIHN5bnRhY3RpYyBvY2N1cnJlbmNlCisvLy8gb2YgYW4gYWNjZXNzIHNwZWNpZmllciBmb2xsb3dlZCBieSBhIGNvbG9uIGluIHRoZSBsaXN0IG9mIG1lbWJlcgorLy8vIHNwZWNpZmllcnMgb2YgYSBDKysgY2xhc3MgZGVmaW5pdGlvbi4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGV5IGRvIG5vdCByZXByZXNlbnQgb3RoZXIgdXNlcyBvZiBhY2Nlc3Mgc3BlY2lmaWVycywKKy8vLyBzdWNoIGFzIHRob3NlIG9jY3VycmluZyBpbiBhIGxpc3Qgb2YgYmFzZSBzcGVjaWZpZXJzLgorLy8vIEFsc28gbm90ZSB0aGF0IHRoaXMgY2xhc3MgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBzby1jYWxsZWQKKy8vLyAiYWNjZXNzIGRlY2xhcmF0aW9ucyIgKEMrKzk4IDExLjMgW2NsYXNzLmFjY2Vzcy5kY2xdKS4KK2NsYXNzIEFjY2Vzc1NwZWNEZWNsIDogcHVibGljIERlY2wgeworICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgJzonLgorICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYzsKKworICBBY2Nlc3NTcGVjRGVjbChBY2Nlc3NTcGVjaWZpZXIgQVMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQVNMb2MsIFNvdXJjZUxvY2F0aW9uIENvbG9uTG9jKQorICAgIDogRGVjbChBY2Nlc3NTcGVjLCBEQywgQVNMb2MpLCBDb2xvbkxvYyhDb2xvbkxvYykgeworICAgIHNldEFjY2VzcyhBUyk7CisgIH0KKworICBBY2Nlc3NTcGVjRGVjbChFbXB0eVNoZWxsIEVtcHR5KSA6IERlY2woQWNjZXNzU3BlYywgRW1wdHkpIHt9CisKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSBhY2Nlc3Mgc3BlY2lmaWVyLgorICBTb3VyY2VMb2NhdGlvbiBnZXRBY2Nlc3NTcGVjaWZpZXJMb2MoKSBjb25zdCB7IHJldHVybiBnZXRMb2NhdGlvbigpOyB9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgYWNjZXNzIHNwZWNpZmllci4KKyAgdm9pZCBzZXRBY2Nlc3NTcGVjaWZpZXJMb2MoU291cmNlTG9jYXRpb24gQVNMb2MpIHsgc2V0TG9jYXRpb24oQVNMb2MpOyB9CisKKyAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIGNvbG9uIGZvbGxvd2luZyB0aGUgYWNjZXNzIHNwZWNpZmllci4KKyAgU291cmNlTG9jYXRpb24gZ2V0Q29sb25Mb2MoKSBjb25zdCB7IHJldHVybiBDb2xvbkxvYzsgfQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIGNvbG9uLgorICB2b2lkIHNldENvbG9uTG9jKFNvdXJjZUxvY2F0aW9uIENMb2MpIHsgQ29sb25Mb2MgPSBDTG9jOyB9CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0QWNjZXNzU3BlY2lmaWVyTG9jKCksIGdldENvbG9uTG9jKCkpOworICB9CisKKyAgc3RhdGljIEFjY2Vzc1NwZWNEZWNsICpDcmVhdGUoQVNUQ29udGV4dCAmQywgQWNjZXNzU3BlY2lmaWVyIEFTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIEFTTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYykgeworICAgIHJldHVybiBuZXcgKEMsIERDKSBBY2Nlc3NTcGVjRGVjbChBUywgREMsIEFTTG9jLCBDb2xvbkxvYyk7CisgIH0KKworICBzdGF0aWMgQWNjZXNzU3BlY0RlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IEFjY2Vzc1NwZWM7IH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIGJhc2UgY2xhc3Mgb2YgYSBDKysgY2xhc3MuCisvLy8KKy8vLyBFYWNoIENYWEJhc2VTcGVjaWZpZXIgcmVwcmVzZW50cyBhIHNpbmdsZSwgZGlyZWN0IGJhc2UgY2xhc3MgKG9yCisvLy8gc3RydWN0KSBvZiBhIEMrKyBjbGFzcyAob3Igc3RydWN0KS4gSXQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoYXQKKy8vLyBiYXNlIGNsYXNzLCB3aGV0aGVyIGl0IGlzIGEgdmlydHVhbCBvciBub24tdmlydHVhbCBiYXNlLCBhbmQgd2hhdAorLy8vIGxldmVsIG9mIGFjY2VzcyAocHVibGljLCBwcm90ZWN0ZWQsIHByaXZhdGUpIGlzIHVzZWQgZm9yIHRoZQorLy8vIGRlcml2YXRpb24uIEZvciBleGFtcGxlOgorLy8vCisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIEEgeyB9OworLy8vICAgY2xhc3MgQiB7IH07CisvLy8gICBjbGFzcyBDIDogcHVibGljIHZpcnR1YWwgQSwgcHJvdGVjdGVkIEIgeyB9OworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBJbiB0aGlzIGNvZGUsIEMgd2lsbCBoYXZlIHR3byBDWFhCYXNlU3BlY2lmaWVycywgb25lIGZvciAicHVibGljCisvLy8gdmlydHVhbCBBIiBhbmQgdGhlIG90aGVyIGZvciAicHJvdGVjdGVkIEIiLgorY2xhc3MgQ1hYQmFzZVNwZWNpZmllciB7CisgIC8vLyBcYnJpZWYgVGhlIHNvdXJjZSBjb2RlIHJhbmdlIHRoYXQgY292ZXJzIHRoZSBmdWxsIGJhc2UKKyAgLy8vIHNwZWNpZmllciwgaW5jbHVkaW5nIHRoZSAidmlydHVhbCIgKGlmIHByZXNlbnQpIGFuZCBhY2Nlc3MKKyAgLy8vIHNwZWNpZmllciAoaWYgcHJlc2VudCkuCisgIFNvdXJjZVJhbmdlIFJhbmdlOworCisgIC8vLyBcYnJpZWYgVGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgZWxsaXBzaXMsIGlmIHRoaXMgaXMgYSBwYWNrCisgIC8vLyBleHBhbnNpb24uCisgIFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGlzIGEgdmlydHVhbCBiYXNlIGNsYXNzIG9yIG5vdC4KKyAgdW5zaWduZWQgVmlydHVhbCA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgaXMgdGhlIGJhc2Ugb2YgYSBjbGFzcyAodHJ1ZSkgb3Igb2YgYSBzdHJ1Y3QgKGZhbHNlKS4KKyAgLy8vCisgIC8vLyBUaGlzIGRldGVybWluZXMgdGhlIG1hcHBpbmcgZnJvbSB0aGUgYWNjZXNzIHNwZWNpZmllciBhcyB3cml0dGVuIGluIHRoZQorICAvLy8gc291cmNlIGNvZGUgdG8gdGhlIGFjY2VzcyBzcGVjaWZpZXIgdXNlZCBmb3Igc2VtYW50aWMgYW5hbHlzaXMuCisgIHVuc2lnbmVkIEJhc2VPZkNsYXNzIDogMTsKKworICAvLy8gXGJyaWVmIEFjY2VzcyBzcGVjaWZpZXIgYXMgd3JpdHRlbiBpbiB0aGUgc291cmNlIGNvZGUgKG1heSBiZSBBU19ub25lKS4KKyAgLy8vCisgIC8vLyBUaGUgYWN0dWFsIHR5cGUgb2YgZGF0YSBzdG9yZWQgaGVyZSBpcyBhbiBBY2Nlc3NTcGVjaWZpZXIsIGJ1dCB3ZSB1c2UKKyAgLy8vICJ1bnNpZ25lZCIgaGVyZSB0byB3b3JrIGFyb3VuZCBhIFZDKysgYnVnLgorICB1bnNpZ25lZCBBY2Nlc3MgOiAyOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgY2xhc3MgY29udGFpbnMgYSB1c2luZyBkZWNsYXJhdGlvbgorICAvLy8gdG8gaW5oZXJpdCB0aGUgbmFtZWQgY2xhc3MncyBjb25zdHJ1Y3RvcnMuCisgIHVuc2lnbmVkIEluaGVyaXRDb25zdHJ1Y3RvcnMgOiAxOworCisgIC8vLyBcYnJpZWYgVGhlIHR5cGUgb2YgdGhlIGJhc2UgY2xhc3MuCisgIC8vLworICAvLy8gVGhpcyB3aWxsIGJlIGEgY2xhc3Mgb3Igc3RydWN0IChvciBhIHR5cGVkZWYgb2Ygc3VjaCkuIFRoZSBzb3VyY2UgY29kZQorICAvLy8gcmFuZ2UgZG9lcyBub3QgaW5jbHVkZSB0aGUgXGMgdmlydHVhbCBvciB0aGUgYWNjZXNzIHNwZWNpZmllci4KKyAgVHlwZVNvdXJjZUluZm8gKkJhc2VUeXBlSW5mbzsKKworcHVibGljOgorICBDWFhCYXNlU3BlY2lmaWVyKCkgPSBkZWZhdWx0OworICBDWFhCYXNlU3BlY2lmaWVyKFNvdXJjZVJhbmdlIFIsIGJvb2wgViwgYm9vbCBCQywgQWNjZXNzU3BlY2lmaWVyIEEsCisgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKlRJbmZvLCBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYykKKyAgICA6IFJhbmdlKFIpLCBFbGxpcHNpc0xvYyhFbGxpcHNpc0xvYyksIFZpcnR1YWwoViksIEJhc2VPZkNsYXNzKEJDKSwKKyAgICAgIEFjY2VzcyhBKSwgSW5oZXJpdENvbnN0cnVjdG9ycyhmYWxzZSksIEJhc2VUeXBlSW5mbyhUSW5mbykge30KKworICAvLy8gXGJyaWVmIFJldHJpZXZlcyB0aGUgc291cmNlIHJhbmdlIHRoYXQgY29udGFpbnMgdGhlIGVudGlyZSBiYXNlIHNwZWNpZmllci4KKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJhbmdlOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSYW5nZS5nZXRCZWdpbigpOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUmFuZ2UuZ2V0RW5kKCk7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbG9jYXRpb24gYXQgd2hpY2ggdGhlIGJhc2UgY2xhc3MgdHlwZSB3YXMgd3JpdHRlbi4KKyAgU291cmNlTG9jYXRpb24gZ2V0QmFzZVR5cGVMb2MoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gQmFzZVR5cGVJbmZvLT5nZXRUeXBlTG9jKCkuZ2V0TG9jU3RhcnQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBiYXNlIGNsYXNzIGlzIGEgdmlydHVhbCBiYXNlIGNsYXNzIChvciBub3QpLgorICBib29sIGlzVmlydHVhbCgpIGNvbnN0IHsgcmV0dXJuIFZpcnR1YWw7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgYmFzZSBjbGFzcyBpcyBhIGJhc2Ugb2YgYSBjbGFzcyBkZWNsYXJlZAorICAvLy8gd2l0aCB0aGUgJ2NsYXNzJyBrZXl3b3JkICh2cy4gb25lIGRlY2xhcmVkIHdpdGggdGhlICdzdHJ1Y3QnIGtleXdvcmQpLgorICBib29sIGlzQmFzZU9mQ2xhc3MoKSBjb25zdCB7IHJldHVybiBCYXNlT2ZDbGFzczsgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBiYXNlIHNwZWNpZmllciBpcyBhIHBhY2sgZXhwYW5zaW9uLgorICBib29sIGlzUGFja0V4cGFuc2lvbigpIGNvbnN0IHsgcmV0dXJuIEVsbGlwc2lzTG9jLmlzVmFsaWQoKTsgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBiYXNlIGNsYXNzJ3MgY29uc3RydWN0b3JzIGdldCBpbmhlcml0ZWQuCisgIGJvb2wgZ2V0SW5oZXJpdENvbnN0cnVjdG9ycygpIGNvbnN0IHsgcmV0dXJuIEluaGVyaXRDb25zdHJ1Y3RvcnM7IH0KKworICAvLy8gXGJyaWVmIFNldCB0aGF0IHRoaXMgYmFzZSBjbGFzcydzIGNvbnN0cnVjdG9ycyBzaG91bGQgYmUgaW5oZXJpdGVkLgorICB2b2lkIHNldEluaGVyaXRDb25zdHJ1Y3RvcnMoYm9vbCBJbmhlcml0ID0gdHJ1ZSkgeworICAgIEluaGVyaXRDb25zdHJ1Y3RvcnMgPSBJbmhlcml0OworICB9CisKKyAgLy8vIFxicmllZiBGb3IgYSBwYWNrIGV4cGFuc2lvbiwgZGV0ZXJtaW5lIHRoZSBsb2NhdGlvbiBvZiB0aGUgZWxsaXBzaXMuCisgIFNvdXJjZUxvY2F0aW9uIGdldEVsbGlwc2lzTG9jKCkgY29uc3QgeworICAgIHJldHVybiBFbGxpcHNpc0xvYzsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgYWNjZXNzIHNwZWNpZmllciBmb3IgdGhpcyBiYXNlIHNwZWNpZmllci4gCisgIC8vLworICAvLy8gVGhpcyBpcyB0aGUgYWN0dWFsIGJhc2Ugc3BlY2lmaWVyIGFzIHVzZWQgZm9yIHNlbWFudGljIGFuYWx5c2lzLCBzbworICAvLy8gdGhlIHJlc3VsdCBjYW4gbmV2ZXIgYmUgQVNfbm9uZS4gVG8gcmV0cmlldmUgdGhlIGFjY2VzcyBzcGVjaWZpZXIgYXMKKyAgLy8vIHdyaXR0ZW4gaW4gdGhlIHNvdXJjZSBjb2RlLCB1c2UgZ2V0QWNjZXNzU3BlY2lmaWVyQXNXcml0dGVuKCkuCisgIEFjY2Vzc1NwZWNpZmllciBnZXRBY2Nlc3NTcGVjaWZpZXIoKSBjb25zdCB7CisgICAgaWYgKChBY2Nlc3NTcGVjaWZpZXIpQWNjZXNzID09IEFTX25vbmUpCisgICAgICByZXR1cm4gQmFzZU9mQ2xhc3M/IEFTX3ByaXZhdGUgOiBBU19wdWJsaWM7CisgICAgZWxzZQorICAgICAgcmV0dXJuIChBY2Nlc3NTcGVjaWZpZXIpQWNjZXNzOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZXMgdGhlIGFjY2VzcyBzcGVjaWZpZXIgYXMgd3JpdHRlbiBpbiB0aGUgc291cmNlIGNvZGUKKyAgLy8vICh3aGljaCBtYXkgbWVhbiB0aGF0IG5vIGFjY2VzcyBzcGVjaWZpZXIgd2FzIGV4cGxpY2l0bHkgd3JpdHRlbikuCisgIC8vLworICAvLy8gVXNlIGdldEFjY2Vzc1NwZWNpZmllcigpIHRvIHJldHJpZXZlIHRoZSBhY2Nlc3Mgc3BlY2lmaWVyIGZvciB1c2UgaW4KKyAgLy8vIHNlbWFudGljIGFuYWx5c2lzLgorICBBY2Nlc3NTcGVjaWZpZXIgZ2V0QWNjZXNzU3BlY2lmaWVyQXNXcml0dGVuKCkgY29uc3QgeworICAgIHJldHVybiAoQWNjZXNzU3BlY2lmaWVyKUFjY2VzczsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmVzIHRoZSB0eXBlIG9mIHRoZSBiYXNlIGNsYXNzLgorICAvLy8KKyAgLy8vIFRoaXMgdHlwZSB3aWxsIGFsd2F5cyBiZSBhbiB1bnF1YWxpZmllZCBjbGFzcyB0eXBlLgorICBRdWFsVHlwZSBnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBCYXNlVHlwZUluZm8tPmdldFR5cGUoKS5nZXRVbnF1YWxpZmllZFR5cGUoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmVzIHRoZSB0eXBlIGFuZCBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGJhc2UgY2xhc3MuCisgIFR5cGVTb3VyY2VJbmZvICpnZXRUeXBlU291cmNlSW5mbygpIGNvbnN0IHsgcmV0dXJuIEJhc2VUeXBlSW5mbzsgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgQysrIHN0cnVjdC91bmlvbi9jbGFzcy4KK2NsYXNzIENYWFJlY29yZERlY2wgOiBwdWJsaWMgUmVjb3JkRGVjbCB7CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNURGVjbFdyaXRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVE5vZGVJbXBvcnRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVFJlY29yZFdyaXRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVFdyaXRlcjsKKyAgZnJpZW5kIGNsYXNzIERlY2xDb250ZXh0OworICBmcmllbmQgY2xhc3MgTGFtYmRhRXhwcjsKKworICBmcmllbmQgdm9pZCBGdW5jdGlvbkRlY2w6OnNldFB1cmUoYm9vbCk7CisgIGZyaWVuZCB2b2lkIFRhZ0RlY2w6OnN0YXJ0RGVmaW5pdGlvbigpOworCisgIC8vLyBWYWx1ZXMgdXNlZCBpbiBEZWZpbml0aW9uRGF0YSBmaWVsZHMgdG8gcmVwcmVzZW50IHNwZWNpYWwgbWVtYmVycy4KKyAgZW51bSBTcGVjaWFsTWVtYmVyRmxhZ3MgeworICAgIFNNRl9EZWZhdWx0Q29uc3RydWN0b3IgPSAweDEsCisgICAgU01GX0NvcHlDb25zdHJ1Y3RvciA9IDB4MiwKKyAgICBTTUZfTW92ZUNvbnN0cnVjdG9yID0gMHg0LAorICAgIFNNRl9Db3B5QXNzaWdubWVudCA9IDB4OCwKKyAgICBTTUZfTW92ZUFzc2lnbm1lbnQgPSAweDEwLAorICAgIFNNRl9EZXN0cnVjdG9yID0gMHgyMCwKKyAgICBTTUZfQWxsID0gMHgzZgorICB9OworCisgIHN0cnVjdCBEZWZpbml0aW9uRGF0YSB7CisgICAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgY2xhc3MgaGFzIGFueSB1c2VyLWRlY2xhcmVkIGNvbnN0cnVjdG9ycy4KKyAgICB1bnNpZ25lZCBVc2VyRGVjbGFyZWRDb25zdHJ1Y3RvciA6IDE7CisKKyAgICAvLy8gXGJyaWVmIFRoZSB1c2VyLWRlY2xhcmVkIHNwZWNpYWwgbWVtYmVycyB3aGljaCB0aGlzIGNsYXNzIGhhcy4KKyAgICB1bnNpZ25lZCBVc2VyRGVjbGFyZWRTcGVjaWFsTWVtYmVycyA6IDY7CisKKyAgICAvLy8gXGJyaWVmIFRydWUgd2hlbiB0aGlzIGNsYXNzIGlzIGFuIGFnZ3JlZ2F0ZS4KKyAgICB1bnNpZ25lZCBBZ2dyZWdhdGUgOiAxOworCisgICAgLy8vIFxicmllZiBUcnVlIHdoZW4gdGhpcyBjbGFzcyBpcyBhIFBPRC10eXBlLgorICAgIHVuc2lnbmVkIFBsYWluT2xkRGF0YSA6IDE7CisKKyAgICAvLy8gdHJ1ZSB3aGVuIHRoaXMgY2xhc3MgaXMgZW1wdHkgZm9yIHRyYWl0cyBwdXJwb3NlcywKKyAgICAvLy8gaS5lLiBoYXMgbm8gZGF0YSBtZW1iZXJzIG90aGVyIHRoYW4gMC13aWR0aCBiaXQtZmllbGRzLCBoYXMgbm8KKyAgICAvLy8gdmlydHVhbCBmdW5jdGlvbi9iYXNlLCBhbmQgZG9lc24ndCBpbmhlcml0IGZyb20gYSBub24tZW1wdHkKKyAgICAvLy8gY2xhc3MuIERvZXNuJ3QgdGFrZSB1bmlvbi1uZXNzIGludG8gYWNjb3VudC4KKyAgICB1bnNpZ25lZCBFbXB0eSA6IDE7CisKKyAgICAvLy8gXGJyaWVmIFRydWUgd2hlbiB0aGlzIGNsYXNzIGlzIHBvbHltb3JwaGljLCBpLmUuLCBoYXMgYXQKKyAgICAvLy8gbGVhc3Qgb25lIHZpcnR1YWwgbWVtYmVyIG9yIGRlcml2ZXMgZnJvbSBhIHBvbHltb3JwaGljIGNsYXNzLgorICAgIHVuc2lnbmVkIFBvbHltb3JwaGljIDogMTsKKworICAgIC8vLyBcYnJpZWYgVHJ1ZSB3aGVuIHRoaXMgY2xhc3MgaXMgYWJzdHJhY3QsIGkuZS4sIGhhcyBhdCBsZWFzdAorICAgIC8vLyBvbmUgcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uLCAodGhhdCBjYW4gY29tZSBmcm9tIGEgYmFzZSBjbGFzcykuCisgICAgdW5zaWduZWQgQWJzdHJhY3QgOiAxOworCisgICAgLy8vIFxicmllZiBUcnVlIHdoZW4gdGhpcyBjbGFzcyBoYXMgc3RhbmRhcmQgbGF5b3V0LgorICAgIC8vLworICAgIC8vLyBDKysxMSBbY2xhc3NdcDcuICBBIHN0YW5kYXJkLWxheW91dCBjbGFzcyBpcyBhIGNsYXNzIHRoYXQ6CisgICAgLy8vICogaGFzIG5vIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXJzIG9mIHR5cGUgbm9uLXN0YW5kYXJkLWxheW91dCBjbGFzcyAob3IKKyAgICAvLy8gICBhcnJheSBvZiBzdWNoIHR5cGVzKSBvciByZWZlcmVuY2UsCisgICAgLy8vICogaGFzIG5vIHZpcnR1YWwgZnVuY3Rpb25zICgxMC4zKSBhbmQgbm8gdmlydHVhbCBiYXNlIGNsYXNzZXMgKDEwLjEpLAorICAgIC8vLyAqIGhhcyB0aGUgc2FtZSBhY2Nlc3MgY29udHJvbCAoQ2xhdXNlIDExKSBmb3IgYWxsIG5vbi1zdGF0aWMgZGF0YQorICAgIC8vLyAgIG1lbWJlcnMKKyAgICAvLy8gKiBoYXMgbm8gbm9uLXN0YW5kYXJkLWxheW91dCBiYXNlIGNsYXNzZXMsCisgICAgLy8vICogZWl0aGVyIGhhcyBubyBub24tc3RhdGljIGRhdGEgbWVtYmVycyBpbiB0aGUgbW9zdCBkZXJpdmVkIGNsYXNzIGFuZCBhdAorICAgIC8vLyAgIG1vc3Qgb25lIGJhc2UgY2xhc3Mgd2l0aCBub24tc3RhdGljIGRhdGEgbWVtYmVycywgb3IgaGFzIG5vIGJhc2UKKyAgICAvLy8gICBjbGFzc2VzIHdpdGggbm9uLXN0YXRpYyBkYXRhIG1lbWJlcnMsIGFuZAorICAgIC8vLyAqIGhhcyBubyBiYXNlIGNsYXNzZXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgZmlyc3Qgbm9uLXN0YXRpYyBkYXRhCisgICAgLy8vICAgbWVtYmVyLgorICAgIHVuc2lnbmVkIElzU3RhbmRhcmRMYXlvdXQgOiAxOworCisgICAgLy8vIFxicmllZiBUcnVlIHdoZW4gdGhlcmUgYXJlIG5vIG5vbi1lbXB0eSBiYXNlIGNsYXNzZXMuCisgICAgLy8vCisgICAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgYml0IG9mIHN0YXRlIHVzZWQgdG8gaW1wbGVtZW50IElzU3RhbmRhcmRMYXlvdXQgbW9yZQorICAgIC8vLyBlZmZpY2llbnRseS4KKyAgICB1bnNpZ25lZCBIYXNOb05vbkVtcHR5QmFzZXMgOiAxOworCisgICAgLy8vIFxicmllZiBUcnVlIHdoZW4gdGhlcmUgYXJlIHByaXZhdGUgbm9uLXN0YXRpYyBkYXRhIG1lbWJlcnMuCisgICAgdW5zaWduZWQgSGFzUHJpdmF0ZUZpZWxkcyA6IDE7CisKKyAgICAvLy8gXGJyaWVmIFRydWUgd2hlbiB0aGVyZSBhcmUgcHJvdGVjdGVkIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXJzLgorICAgIHVuc2lnbmVkIEhhc1Byb3RlY3RlZEZpZWxkcyA6IDE7CisKKyAgICAvLy8gXGJyaWVmIFRydWUgd2hlbiB0aGVyZSBhcmUgcHJpdmF0ZSBub24tc3RhdGljIGRhdGEgbWVtYmVycy4KKyAgICB1bnNpZ25lZCBIYXNQdWJsaWNGaWVsZHMgOiAxOworCisgICAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgY2xhc3MgKG9yIGFueSBzdWJvYmplY3QpIGhhcyBtdXRhYmxlIGZpZWxkcy4KKyAgICB1bnNpZ25lZCBIYXNNdXRhYmxlRmllbGRzIDogMTsKKworICAgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGlzIGNsYXNzIChvciBhbnkgbmVzdGVkIGFub255bW91cyBzdHJ1Y3Qgb3IgdW5pb24pCisgICAgLy8vIGhhcyB2YXJpYW50IG1lbWJlcnMuCisgICAgdW5zaWduZWQgSGFzVmFyaWFudE1lbWJlcnMgOiAxOworCisgICAgLy8vIFxicmllZiBUcnVlIGlmIHRoZXJlIG5vIG5vbi1maWVsZCBtZW1iZXJzIGRlY2xhcmVkIGJ5IHRoZSB1c2VyLgorICAgIHVuc2lnbmVkIEhhc09ubHlDTWVtYmVycyA6IDE7CisKKyAgICAvLy8gXGJyaWVmIFRydWUgaWYgYW55IGZpZWxkIGhhcyBhbiBpbi1jbGFzcyBpbml0aWFsaXplciwgaW5jbHVkaW5nIHRob3NlCisgICAgLy8vIHdpdGhpbiBhbm9ueW1vdXMgdW5pb25zIG9yIHN0cnVjdHMuCisgICAgdW5zaWduZWQgSGFzSW5DbGFzc0luaXRpYWxpemVyIDogMTsKKworICAgIC8vLyBcYnJpZWYgVHJ1ZSBpZiBhbnkgZmllbGQgaXMgb2YgcmVmZXJlbmNlIHR5cGUsIGFuZCBkb2VzIG5vdCBoYXZlIGFuCisgICAgLy8vIGluLWNsYXNzIGluaXRpYWxpemVyLgorICAgIC8vLworICAgIC8vLyBJbiB0aGlzIGNhc2UsIHZhbHVlLWluaXRpYWxpemF0aW9uIG9mIHRoaXMgY2xhc3MgaXMgaWxsZWdhbCBpbiBDKys5OAorICAgIC8vLyBldmVuIGlmIHRoZSBjbGFzcyBoYXMgYSB0cml2aWFsIGRlZmF1bHQgY29uc3RydWN0b3IuCisgICAgdW5zaWduZWQgSGFzVW5pbml0aWFsaXplZFJlZmVyZW5jZU1lbWJlciA6IDE7CisKKyAgICAvLy8gXGJyaWVmIFRydWUgaWYgYW55IG5vbi1tdXRhYmxlIGZpZWxkIHdob3NlIHR5cGUgZG9lc24ndCBoYXZlIGEgdXNlci0KKyAgICAvLy8gcHJvdmlkZWQgZGVmYXVsdCBjdG9yIGFsc28gZG9lc24ndCBoYXZlIGFuIGluLWNsYXNzIGluaXRpYWxpemVyLgorICAgIHVuc2lnbmVkIEhhc1VuaW5pdGlhbGl6ZWRGaWVsZHMgOiAxOworCisgICAgLy8vIFxicmllZiBUcnVlIGlmIHRoZXJlIGFyZSBhbnkgbWVtYmVyIHVzaW5nLWRlY2xhcmF0aW9ucyB0aGF0IGluaGVyaXQKKyAgICAvLy8gY29uc3RydWN0b3JzIGZyb20gYSBiYXNlIGNsYXNzLgorICAgIHVuc2lnbmVkIEhhc0luaGVyaXRlZENvbnN0cnVjdG9yIDogMTsKKworICAgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGVyZSBhcmUgYW55IG1lbWJlciB1c2luZy1kZWNsYXJhdGlvbnMgbmFtZWQKKyAgICAvLy8gJ29wZXJhdG9yPScuCisgICAgdW5zaWduZWQgSGFzSW5oZXJpdGVkQXNzaWdubWVudCA6IDE7CisKKyAgICAvLy8gXGJyaWVmIFRoZXNlIGZsYWdzIGFyZSBcYyB0cnVlIGlmIGEgZGVmYXVsdGVkIGNvcnJlc3BvbmRpbmcgc3BlY2lhbAorICAgIC8vLyBtZW1iZXIgY2FuJ3QgYmUgZnVsbHkgYW5hbHl6ZWQgd2l0aG91dCBwZXJmb3JtaW5nIG92ZXJsb2FkIHJlc29sdXRpb24uCisgICAgLy8vIEB7CisgICAgdW5zaWduZWQgTmVlZE92ZXJsb2FkUmVzb2x1dGlvbkZvckNvcHlDb25zdHJ1Y3RvciA6IDE7CisgICAgdW5zaWduZWQgTmVlZE92ZXJsb2FkUmVzb2x1dGlvbkZvck1vdmVDb25zdHJ1Y3RvciA6IDE7CisgICAgdW5zaWduZWQgTmVlZE92ZXJsb2FkUmVzb2x1dGlvbkZvck1vdmVBc3NpZ25tZW50IDogMTsKKyAgICB1bnNpZ25lZCBOZWVkT3ZlcmxvYWRSZXNvbHV0aW9uRm9yRGVzdHJ1Y3RvciA6IDE7CisgICAgLy8vIEB9CisKKyAgICAvLy8gXGJyaWVmIFRoZXNlIGZsYWdzIGFyZSBcYyB0cnVlIGlmIGFuIGltcGxpY2l0IGRlZmF1bHRlZCBjb3JyZXNwb25kaW5nCisgICAgLy8vIHNwZWNpYWwgbWVtYmVyIHdvdWxkIGJlIGRlZmluZWQgYXMgZGVsZXRlZC4KKyAgICAvLy8gQHsKKyAgICB1bnNpZ25lZCBEZWZhdWx0ZWRDb3B5Q29uc3RydWN0b3JJc0RlbGV0ZWQgOiAxOworICAgIHVuc2lnbmVkIERlZmF1bHRlZE1vdmVDb25zdHJ1Y3RvcklzRGVsZXRlZCA6IDE7CisgICAgdW5zaWduZWQgRGVmYXVsdGVkTW92ZUFzc2lnbm1lbnRJc0RlbGV0ZWQgOiAxOworICAgIHVuc2lnbmVkIERlZmF1bHRlZERlc3RydWN0b3JJc0RlbGV0ZWQgOiAxOworICAgIC8vLyBAfQorCisgICAgLy8vIFxicmllZiBUaGUgdHJpdmlhbCBzcGVjaWFsIG1lbWJlcnMgd2hpY2ggdGhpcyBjbGFzcyBoYXMsIHBlcgorICAgIC8vLyBDKysxMSBbY2xhc3MuY3Rvcl1wNSwgQysrMTEgW2NsYXNzLmNvcHldcDEyLCBDKysxMSBbY2xhc3MuY29weV1wMjUsCisgICAgLy8vIEMrKzExIFtjbGFzcy5kdG9yXXA1LCBvciB3b3VsZCBoYXZlIGlmIHRoZSBtZW1iZXIgd2VyZSBub3Qgc3VwcHJlc3NlZC4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBleGNsdWRlcyBhbnkgdXNlci1kZWNsYXJlZCBidXQgbm90IHVzZXItcHJvdmlkZWQgc3BlY2lhbCBtZW1iZXJzCisgICAgLy8vIHdoaWNoIGhhdmUgYmVlbiBkZWNsYXJlZCBidXQgbm90IHlldCBkZWZpbmVkLgorICAgIHVuc2lnbmVkIEhhc1RyaXZpYWxTcGVjaWFsTWVtYmVycyA6IDY7CisKKyAgICAvLy8gVGhlc2UgYml0cyBrZWVwIHRyYWNrIG9mIHRoZSB0cml2aWFsaXR5IG9mIHNwZWNpYWwgZnVuY3Rpb25zIGZvciB0aGUKKyAgICAvLy8gcHVycG9zZSBvZiBjYWxscy4gT25seSB0aGUgYml0cyBjb3JyZXNwb25kaW5nIHRvIFNNRl9Db3B5Q29uc3RydWN0b3IsCisgICAgLy8vIFNNRl9Nb3ZlQ29uc3RydWN0b3IsIGFuZCBTTUZfRGVzdHJ1Y3RvciBhcmUgbWVhbmluZ2Z1bCBoZXJlLgorICAgIHVuc2lnbmVkIEhhc1RyaXZpYWxTcGVjaWFsTWVtYmVyc0ZvckNhbGwgOiA2OworCisgICAgLy8vIFxicmllZiBUaGUgZGVjbGFyZWQgc3BlY2lhbCBtZW1iZXJzIG9mIHRoaXMgY2xhc3Mgd2hpY2ggYXJlIGtub3duIHRvIGJlCisgICAgLy8vIG5vbi10cml2aWFsLgorICAgIC8vLworICAgIC8vLyBUaGlzIGV4Y2x1ZGVzIGFueSB1c2VyLWRlY2xhcmVkIGJ1dCBub3QgdXNlci1wcm92aWRlZCBzcGVjaWFsIG1lbWJlcnMKKyAgICAvLy8gd2hpY2ggaGF2ZSBiZWVuIGRlY2xhcmVkIGJ1dCBub3QgeWV0IGRlZmluZWQsIGFuZCBhbnkgaW1wbGljaXQgc3BlY2lhbAorICAgIC8vLyBtZW1iZXJzIHdoaWNoIGhhdmUgbm90IHlldCBiZWVuIGRlY2xhcmVkLgorICAgIHVuc2lnbmVkIERlY2xhcmVkTm9uVHJpdmlhbFNwZWNpYWxNZW1iZXJzIDogNjsKKworICAgIC8vLyBUaGVzZSBiaXRzIGtlZXAgdHJhY2sgb2YgdGhlIGRlY2xhcmVkIHNwZWNpYWwgbWVtYmVycyB0aGF0IGFyZQorICAgIC8vLyBub24tdHJpdmlhbCBmb3IgdGhlIHB1cnBvc2Ugb2YgY2FsbHMuCisgICAgLy8vIE9ubHkgdGhlIGJpdHMgY29ycmVzcG9uZGluZyB0byBTTUZfQ29weUNvbnN0cnVjdG9yLAorICAgIC8vLyBTTUZfTW92ZUNvbnN0cnVjdG9yLCBhbmQgU01GX0Rlc3RydWN0b3IgYXJlIG1lYW5pbmdmdWwgaGVyZS4KKyAgICB1bnNpZ25lZCBEZWNsYXJlZE5vblRyaXZpYWxTcGVjaWFsTWVtYmVyc0ZvckNhbGwgOiA2OworCisgICAgLy8vIFxicmllZiBUcnVlIHdoZW4gdGhpcyBjbGFzcyBoYXMgYSBkZXN0cnVjdG9yIHdpdGggbm8gc2VtYW50aWMgZWZmZWN0LgorICAgIHVuc2lnbmVkIEhhc0lycmVsZXZhbnREZXN0cnVjdG9yIDogMTsKKworICAgIC8vLyBcYnJpZWYgVHJ1ZSB3aGVuIHRoaXMgY2xhc3MgaGFzIGF0IGxlYXN0IG9uZSB1c2VyLWRlY2xhcmVkIGNvbnN0ZXhwcgorICAgIC8vLyBjb25zdHJ1Y3RvciB3aGljaCBpcyBuZWl0aGVyIHRoZSBjb3B5IG5vciBtb3ZlIGNvbnN0cnVjdG9yLgorICAgIHVuc2lnbmVkIEhhc0NvbnN0ZXhwck5vbkNvcHlNb3ZlQ29uc3RydWN0b3IgOiAxOworCisgICAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgY2xhc3MgaGFzIGEgKHBvc3NpYmx5IGltcGxpY2l0KSBkZWZhdWx0ZWQgZGVmYXVsdAorICAgIC8vLyBjb25zdHJ1Y3Rvci4KKyAgICB1bnNpZ25lZCBIYXNEZWZhdWx0ZWREZWZhdWx0Q29uc3RydWN0b3IgOiAxOworCisgICAgLy8vIFxicmllZiBUcnVlIGlmIGEgZGVmYXVsdGVkIGRlZmF1bHQgY29uc3RydWN0b3IgZm9yIHRoaXMgY2xhc3Mgd291bGQKKyAgICAvLy8gYmUgY29uc3RleHByLgorICAgIHVuc2lnbmVkIERlZmF1bHRlZERlZmF1bHRDb25zdHJ1Y3RvcklzQ29uc3RleHByIDogMTsKKworICAgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGlzIGNsYXNzIGhhcyBhIGNvbnN0ZXhwciBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIC8vLworICAgIC8vLyBUaGlzIGlzIHRydWUgZm9yIGVpdGhlciBhIHVzZXItZGVjbGFyZWQgY29uc3RleHByIGRlZmF1bHQgY29uc3RydWN0b3IKKyAgICAvLy8gb3IgYW4gaW1wbGljaXRseSBkZWNsYXJlZCBjb25zdGV4cHIgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICB1bnNpZ25lZCBIYXNDb25zdGV4cHJEZWZhdWx0Q29uc3RydWN0b3IgOiAxOworCisgICAgLy8vIFxicmllZiBUcnVlIHdoZW4gdGhpcyBjbGFzcyBjb250YWlucyBhdCBsZWFzdCBvbmUgbm9uLXN0YXRpYyBkYXRhCisgICAgLy8vIG1lbWJlciBvciBiYXNlIGNsYXNzIG9mIG5vbi1saXRlcmFsIG9yIHZvbGF0aWxlIHR5cGUuCisgICAgdW5zaWduZWQgSGFzTm9uTGl0ZXJhbFR5cGVGaWVsZHNPckJhc2VzIDogMTsKKworICAgIC8vLyBcYnJpZWYgVHJ1ZSB3aGVuIHZpc2libGUgY29udmVyc2lvbiBmdW5jdGlvbnMgYXJlIGFscmVhZHkgY29tcHV0ZWQKKyAgICAvLy8gYW5kIGFyZSBhdmFpbGFibGUuCisgICAgdW5zaWduZWQgQ29tcHV0ZWRWaXNpYmxlQ29udmVyc2lvbnMgOiAxOworCisgICAgLy8vIFxicmllZiBXaGV0aGVyIHdlIGhhdmUgYSBDKysxMSB1c2VyLXByb3ZpZGVkIGRlZmF1bHQgY29uc3RydWN0b3IgKG5vdAorICAgIC8vLyBleHBsaWNpdGx5IGRlbGV0ZWQgb3IgZGVmYXVsdGVkKS4KKyAgICB1bnNpZ25lZCBVc2VyUHJvdmlkZWREZWZhdWx0Q29uc3RydWN0b3IgOiAxOworCisgICAgLy8vIFxicmllZiBUaGUgc3BlY2lhbCBtZW1iZXJzIHdoaWNoIGhhdmUgYmVlbiBkZWNsYXJlZCBmb3IgdGhpcyBjbGFzcywKKyAgICAvLy8gZWl0aGVyIGJ5IHRoZSB1c2VyIG9yIGltcGxpY2l0bHkuCisgICAgdW5zaWduZWQgRGVjbGFyZWRTcGVjaWFsTWVtYmVycyA6IDY7CisKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgYW4gaW1wbGljaXQgY29weSBjb25zdHJ1Y3RvciBjb3VsZCBoYXZlIGEgY29uc3QtcXVhbGlmaWVkCisgICAgLy8vIHBhcmFtZXRlciwgZm9yIGluaXRpYWxpemluZyB2aXJ0dWFsIGJhc2VzIGFuZCBmb3Igb3RoZXIgc3Vib2JqZWN0cy4KKyAgICB1bnNpZ25lZCBJbXBsaWNpdENvcHlDb25zdHJ1Y3RvckNhbkhhdmVDb25zdFBhcmFtRm9yVkJhc2UgOiAxOworICAgIHVuc2lnbmVkIEltcGxpY2l0Q29weUNvbnN0cnVjdG9yQ2FuSGF2ZUNvbnN0UGFyYW1Gb3JOb25WQmFzZSA6IDE7CisKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgYW4gaW1wbGljaXQgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yIHdvdWxkIGhhdmUgYQorICAgIC8vLyBjb25zdC1xdWFsaWZpZWQgcGFyYW1ldGVyLgorICAgIHVuc2lnbmVkIEltcGxpY2l0Q29weUFzc2lnbm1lbnRIYXNDb25zdFBhcmFtIDogMTsKKworICAgIC8vLyBcYnJpZWYgV2hldGhlciBhbnkgZGVjbGFyZWQgY29weSBjb25zdHJ1Y3RvciBoYXMgYSBjb25zdC1xdWFsaWZpZWQKKyAgICAvLy8gcGFyYW1ldGVyLgorICAgIHVuc2lnbmVkIEhhc0RlY2xhcmVkQ29weUNvbnN0cnVjdG9yV2l0aENvbnN0UGFyYW0gOiAxOworCisgICAgLy8vIFxicmllZiBXaGV0aGVyIGFueSBkZWNsYXJlZCBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IgaGFzIGVpdGhlciBhCisgICAgLy8vIGNvbnN0LXF1YWxpZmllZCByZWZlcmVuY2UgcGFyYW1ldGVyIG9yIGEgbm9uLXJlZmVyZW5jZSBwYXJhbWV0ZXIuCisgICAgdW5zaWduZWQgSGFzRGVjbGFyZWRDb3B5QXNzaWdubWVudFdpdGhDb25zdFBhcmFtIDogMTsKKworICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGNsYXNzIGRlc2NyaWJlcyBhIEMrKyBsYW1iZGEuCisgICAgdW5zaWduZWQgSXNMYW1iZGEgOiAxOworCisgICAgLy8vIFxicmllZiBXaGV0aGVyIHdlIGFyZSBjdXJyZW50bHkgcGFyc2luZyBiYXNlIHNwZWNpZmllcnMuCisgICAgdW5zaWduZWQgSXNQYXJzaW5nQmFzZVNwZWNpZmllcnMgOiAxOworCisgICAgdW5zaWduZWQgSGFzT0RSSGFzaCA6IDE7CisKKyAgICAvLy8gXGJyaWVmIEEgaGFzaCBvZiBwYXJ0cyBvZiB0aGUgY2xhc3MgdG8gaGVscCBpbiBPRFIgY2hlY2tpbmcuCisgICAgdW5zaWduZWQgT0RSSGFzaCA9IDA7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgYmFzZSBjbGFzcyBzcGVjaWZpZXJzIGluIEJhc2VzLgorICAgIHVuc2lnbmVkIE51bUJhc2VzID0gMDsKKworICAgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiB2aXJ0dWFsIGJhc2UgY2xhc3Mgc3BlY2lmaWVycyBpbiBWQmFzZXMuCisgICAgdW5zaWduZWQgTnVtVkJhc2VzID0gMDsKKworICAgIC8vLyBcYnJpZWYgQmFzZSBjbGFzc2VzIG9mIHRoaXMgY2xhc3MuCisgICAgLy8vCisgICAgLy8vIEZJWE1FOiBUaGlzIGlzIHdhc3RlZCBzcGFjZSBmb3IgYSB1bmlvbi4KKyAgICBMYXp5Q1hYQmFzZVNwZWNpZmllcnNQdHIgQmFzZXM7CisKKyAgICAvLy8gXGJyaWVmIGRpcmVjdCBhbmQgaW5kaXJlY3QgdmlydHVhbCBiYXNlIGNsYXNzZXMgb2YgdGhpcyBjbGFzcy4KKyAgICBMYXp5Q1hYQmFzZVNwZWNpZmllcnNQdHIgVkJhc2VzOworCisgICAgLy8vIFxicmllZiBUaGUgY29udmVyc2lvbiBmdW5jdGlvbnMgb2YgdGhpcyBDKysgY2xhc3MgKGJ1dCBub3QgaXRzCisgICAgLy8vIGluaGVyaXRlZCBjb252ZXJzaW9uIGZ1bmN0aW9ucykuCisgICAgLy8vCisgICAgLy8vIEVhY2ggb2YgdGhlIGVudHJpZXMgaW4gdGhpcyBvdmVybG9hZCBzZXQgaXMgYSBDWFhDb252ZXJzaW9uRGVjbC4KKyAgICBMYXp5QVNUVW5yZXNvbHZlZFNldCBDb252ZXJzaW9uczsKKworICAgIC8vLyBcYnJpZWYgVGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zIG9mIHRoaXMgQysrIGNsYXNzIGFuZCBhbGwgdGhvc2UKKyAgICAvLy8gaW5oZXJpdGVkIGNvbnZlcnNpb24gZnVuY3Rpb25zIHRoYXQgYXJlIHZpc2libGUgaW4gdGhpcyBjbGFzcy4KKyAgICAvLy8KKyAgICAvLy8gRWFjaCBvZiB0aGUgZW50cmllcyBpbiB0aGlzIG92ZXJsb2FkIHNldCBpcyBhIENYWENvbnZlcnNpb25EZWNsIG9yIGEKKyAgICAvLy8gRnVuY3Rpb25UZW1wbGF0ZURlY2wuCisgICAgTGF6eUFTVFVucmVzb2x2ZWRTZXQgVmlzaWJsZUNvbnZlcnNpb25zOworCisgICAgLy8vIFxicmllZiBUaGUgZGVjbGFyYXRpb24gd2hpY2ggZGVmaW5lcyB0aGlzIHJlY29yZC4KKyAgICBDWFhSZWNvcmREZWNsICpEZWZpbml0aW9uOworCisgICAgLy8vIFxicmllZiBUaGUgZmlyc3QgZnJpZW5kIGRlY2xhcmF0aW9uIGluIHRoaXMgY2xhc3MsIG9yIG51bGwgaWYgdGhlcmUKKyAgICAvLy8gYXJlbid0IGFueS4gCisgICAgLy8vCisgICAgLy8vIFRoaXMgaXMgYWN0dWFsbHkgY3VycmVudGx5IHN0b3JlZCBpbiByZXZlcnNlIG9yZGVyLgorICAgIExhenlEZWNsUHRyIEZpcnN0RnJpZW5kOworCisgICAgRGVmaW5pdGlvbkRhdGEoQ1hYUmVjb3JkRGVjbCAqRCk7CisKKyAgICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzZXQgb2YgZGlyZWN0IGJhc2UgY2xhc3Nlcy4KKyAgICBDWFhCYXNlU3BlY2lmaWVyICpnZXRCYXNlcygpIGNvbnN0IHsKKyAgICAgIGlmICghQmFzZXMuaXNPZmZzZXQoKSkKKyAgICAgICAgcmV0dXJuIEJhc2VzLmdldChudWxscHRyKTsKKyAgICAgIHJldHVybiBnZXRCYXNlc1Nsb3dDYXNlKCk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc2V0IG9mIHZpcnR1YWwgYmFzZSBjbGFzc2VzLgorICAgIENYWEJhc2VTcGVjaWZpZXIgKmdldFZCYXNlcygpIGNvbnN0IHsKKyAgICAgIGlmICghVkJhc2VzLmlzT2Zmc2V0KCkpCisgICAgICAgIHJldHVybiBWQmFzZXMuZ2V0KG51bGxwdHIpOworICAgICAgcmV0dXJuIGdldFZCYXNlc1Nsb3dDYXNlKCk7CisgICAgfQorCisgICAgQXJyYXlSZWY8Q1hYQmFzZVNwZWNpZmllcj4gYmFzZXMoKSBjb25zdCB7CisgICAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKGdldEJhc2VzKCksIE51bUJhc2VzKTsKKyAgICB9CisKKyAgICBBcnJheVJlZjxDWFhCYXNlU3BlY2lmaWVyPiB2YmFzZXMoKSBjb25zdCB7CisgICAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKGdldFZCYXNlcygpLCBOdW1WQmFzZXMpOworICAgIH0KKworICBwcml2YXRlOgorICAgIENYWEJhc2VTcGVjaWZpZXIgKmdldEJhc2VzU2xvd0Nhc2UoKSBjb25zdDsKKyAgICBDWFhCYXNlU3BlY2lmaWVyICpnZXRWQmFzZXNTbG93Q2FzZSgpIGNvbnN0OworICB9OworCisgIHN0cnVjdCBEZWZpbml0aW9uRGF0YSAqRGVmaW5pdGlvbkRhdGE7CisKKyAgLy8vIFxicmllZiBEZXNjcmliZXMgYSBDKysgY2xvc3VyZSB0eXBlIChnZW5lcmF0ZWQgYnkgYSBsYW1iZGEgZXhwcmVzc2lvbikuCisgIHN0cnVjdCBMYW1iZGFEZWZpbml0aW9uRGF0YSA6IHB1YmxpYyBEZWZpbml0aW9uRGF0YSB7CisgICAgdXNpbmcgQ2FwdHVyZSA9IExhbWJkYUNhcHR1cmU7CisKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBsYW1iZGEgaXMga25vd24gdG8gYmUgZGVwZW5kZW50LCBldmVuIGlmIGl0cworICAgIC8vLyBjb250ZXh0IGlzbid0IGRlcGVuZGVudC4KKyAgICAvLy8gCisgICAgLy8vIEEgbGFtYmRhIHdpdGggYSBub24tZGVwZW5kZW50IGNvbnRleHQgY2FuIGJlIGRlcGVuZGVudCBpZiBpdCBvY2N1cnMKKyAgICAvLy8gd2l0aGluIHRoZSBkZWZhdWx0IGFyZ3VtZW50IG9mIGEgZnVuY3Rpb24gdGVtcGxhdGUsIGJlY2F1c2UgdGhlCisgICAgLy8vIGxhbWJkYSB3aWxsIGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIGVuY2xvc2luZyBjb250ZXh0IGFzIGl0cworICAgIC8vLyBkZWNsYXJhdGlvbiBjb250ZXh0LCByYXRoZXIgdGhhbiBmdW5jdGlvbi4gVGhpcyBpcyBhbiB1bmZvcnR1bmF0ZQorICAgIC8vLyBhcnRpZmFjdCBvZiBoYXZpbmcgdG8gcGFyc2UgdGhlIGRlZmF1bHQgYXJndW1lbnRzIGJlZm9yZS4gCisgICAgdW5zaWduZWQgRGVwZW5kZW50IDogMTsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBsYW1iZGEgaXMgYSBnZW5lcmljIGxhbWJkYS4KKyAgICB1bnNpZ25lZCBJc0dlbmVyaWNMYW1iZGEgOiAxOworCisgICAgLy8vIFxicmllZiBUaGUgRGVmYXVsdCBDYXB0dXJlLgorICAgIHVuc2lnbmVkIENhcHR1cmVEZWZhdWx0IDogMjsKKworICAgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBjYXB0dXJlcyBpbiB0aGlzIGxhbWJkYSBpcyBsaW1pdGVkIDJeTnVtQ2FwdHVyZXMuCisgICAgdW5zaWduZWQgTnVtQ2FwdHVyZXMgOiAxNTsKKworICAgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBleHBsaWNpdCBjYXB0dXJlcyBpbiB0aGlzIGxhbWJkYS4KKyAgICB1bnNpZ25lZCBOdW1FeHBsaWNpdENhcHR1cmVzIDogMTM7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgdXNlZCB0byBpbmRpY2F0ZSB0aGlzIGxhbWJkYSBleHByZXNzaW9uIGZvciBuYW1lIAorICAgIC8vLyBtYW5nbGluZyBpbiB0aGUgSXRhbml1bSBDKysgQUJJLgorICAgIHVuc2lnbmVkIE1hbmdsaW5nTnVtYmVyID0gMDsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFRoZSBkZWNsYXJhdGlvbiB0aGF0IHByb3ZpZGVzIGNvbnRleHQgZm9yIHRoaXMgbGFtYmRhLCBpZiB0aGUKKyAgICAvLy8gYWN0dWFsIERlY2xDb250ZXh0IGRvZXMgbm90IHN1ZmZpY2UuIFRoaXMgaXMgdXNlZCBmb3IgbGFtYmRhcyB0aGF0CisgICAgLy8vIG9jY3VyIHdpdGhpbiBkZWZhdWx0IGFyZ3VtZW50cyBvZiBmdW5jdGlvbiBwYXJhbWV0ZXJzIHdpdGhpbiB0aGUgY2xhc3MKKyAgICAvLy8gb3Igd2l0aGluIGEgZGF0YSBtZW1iZXIgaW5pdGlhbGl6ZXIuCisgICAgTGF6eURlY2xQdHIgQ29udGV4dERlY2w7CisgICAgCisgICAgLy8vIFxicmllZiBUaGUgbGlzdCBvZiBjYXB0dXJlcywgYm90aCBleHBsaWNpdCBhbmQgaW1wbGljaXQsIGZvciB0aGlzIAorICAgIC8vLyBsYW1iZGEuCisgICAgQ2FwdHVyZSAqQ2FwdHVyZXMgPSBudWxscHRyOworCisgICAgLy8vIFxicmllZiBUaGUgdHlwZSBvZiB0aGUgY2FsbCBtZXRob2QuCisgICAgVHlwZVNvdXJjZUluZm8gKk1ldGhvZFR5SW5mbzsKKworICAgIExhbWJkYURlZmluaXRpb25EYXRhKENYWFJlY29yZERlY2wgKkQsIFR5cGVTb3VyY2VJbmZvICpJbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERlcGVuZGVudCwgYm9vbCBJc0dlbmVyaWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgIExhbWJkYUNhcHR1cmVEZWZhdWx0IENhcHR1cmVEZWZhdWx0KSAKKyAgICAgIDogRGVmaW5pdGlvbkRhdGEoRCksIERlcGVuZGVudChEZXBlbmRlbnQpLCBJc0dlbmVyaWNMYW1iZGEoSXNHZW5lcmljKSwgCisgICAgICAgIENhcHR1cmVEZWZhdWx0KENhcHR1cmVEZWZhdWx0KSwgTnVtQ2FwdHVyZXMoMCksIE51bUV4cGxpY2l0Q2FwdHVyZXMoMCksIAorICAgICAgICBNZXRob2RUeUluZm8oSW5mbykgeworICAgICAgSXNMYW1iZGEgPSB0cnVlOworCisgICAgICAvLyBDKysxeiBbZXhwci5wcmltLmxhbWJkYV1wNDoKKyAgICAgIC8vICAgVGhpcyBjbGFzcyB0eXBlIGlzIG5vdCBhbiBhZ2dyZWdhdGUgdHlwZS4KKyAgICAgIEFnZ3JlZ2F0ZSA9IGZhbHNlOworICAgICAgUGxhaW5PbGREYXRhID0gZmFsc2U7CisgICAgfQorICB9OworCisgIHN0cnVjdCBEZWZpbml0aW9uRGF0YSAqZGF0YVB0cigpIGNvbnN0IHsKKyAgICAvLyBDb21wbGV0ZSB0aGUgcmVkZWNsIGNoYWluIChpZiBuZWNlc3NhcnkpLgorICAgIGdldE1vc3RSZWNlbnREZWNsKCk7CisgICAgcmV0dXJuIERlZmluaXRpb25EYXRhOworICB9CisKKyAgc3RydWN0IERlZmluaXRpb25EYXRhICZkYXRhKCkgY29uc3QgeworICAgIGF1dG8gKkREID0gZGF0YVB0cigpOworICAgIGFzc2VydChERCAmJiAicXVlcmllZCBwcm9wZXJ0eSBvZiBjbGFzcyB3aXRoIG5vIGRlZmluaXRpb24iKTsKKyAgICByZXR1cm4gKkREOworICB9CisKKyAgc3RydWN0IExhbWJkYURlZmluaXRpb25EYXRhICZnZXRMYW1iZGFEYXRhKCkgY29uc3QgeworICAgIC8vIE5vIHVwZGF0ZSByZXF1aXJlZDogYSBtZXJnZWQgZGVmaW5pdGlvbiBjYW5ub3QgY2hhbmdlIGFueSBsYW1iZGEKKyAgICAvLyBwcm9wZXJ0aWVzLgorICAgIGF1dG8gKkREID0gRGVmaW5pdGlvbkRhdGE7CisgICAgYXNzZXJ0KEREICYmIERELT5Jc0xhbWJkYSAmJiAicXVlcmllZCBsYW1iZGEgcHJvcGVydHkgb2Ygbm9uLWxhbWJkYSBjbGFzcyIpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxMYW1iZGFEZWZpbml0aW9uRGF0YSY+KCpERCk7CisgIH0KKworICAvLy8gXGJyaWVmIFRoZSB0ZW1wbGF0ZSBvciBkZWNsYXJhdGlvbiB0aGF0IHRoaXMgZGVjbGFyYXRpb24KKyAgLy8vIGRlc2NyaWJlcyBvciB3YXMgaW5zdGFudGlhdGVkIGZyb20sIHJlc3BlY3RpdmVseS4KKyAgLy8vCisgIC8vLyBGb3Igbm9uLXRlbXBsYXRlcywgdGhpcyB2YWx1ZSB3aWxsIGJlIG51bGwuIEZvciByZWNvcmQKKyAgLy8vIGRlY2xhcmF0aW9ucyB0aGF0IGRlc2NyaWJlIGEgY2xhc3MgdGVtcGxhdGUsIHRoaXMgd2lsbCBiZSBhCisgIC8vLyBwb2ludGVyIHRvIGEgQ2xhc3NUZW1wbGF0ZURlY2wuIEZvciBtZW1iZXIKKyAgLy8vIGNsYXNzZXMgb2YgY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zLCB0aGlzIHdpbGwgYmUgdGhlCisgIC8vLyBNZW1iZXJTcGVjaWFsaXphdGlvbkluZm8gcmVmZXJyaW5nIHRvIHRoZSBtZW1iZXIgY2xhc3MgdGhhdCB3YXMKKyAgLy8vIGluc3RhbnRpYXRlZCBvciBzcGVjaWFsaXplZC4KKyAgbGx2bTo6UG9pbnRlclVuaW9uPENsYXNzVGVtcGxhdGVEZWNsICosIE1lbWJlclNwZWNpYWxpemF0aW9uSW5mbyAqPgorICAgICAgVGVtcGxhdGVPckluc3RhbnRpYXRpb247CisKKyAgLy8vIFxicmllZiBDYWxsZWQgZnJvbSBzZXRCYXNlcyBhbmQgYWRkZWRNZW1iZXIgdG8gbm90aWZ5IHRoZSBjbGFzcyB0aGF0IGEKKyAgLy8vIGRpcmVjdCBvciB2aXJ0dWFsIGJhc2UgY2xhc3Mgb3IgYSBtZW1iZXIgb2YgY2xhc3MgdHlwZSBoYXMgYmVlbiBhZGRlZC4KKyAgdm9pZCBhZGRlZENsYXNzU3Vib2JqZWN0KENYWFJlY29yZERlY2wgKkJhc2UpOworCisgIC8vLyBcYnJpZWYgTm90aWZ5IHRoZSBjbGFzcyB0aGF0IG1lbWJlciBoYXMgYmVlbiBhZGRlZC4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgaGVscHMgbWFpbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsYXNzIGJhc2VkIG9uIHdoaWNoCisgIC8vLyBtZW1iZXJzIGhhdmUgYmVlbiBhZGRlZC4gSXQgd2lsbCBiZSBpbnZva2VkIGJ5IERlY2xDb250ZXh0OjphZGREZWNsKCkKKyAgLy8vIHdoZW5ldmVyIGEgbWVtYmVyIGlzIGFkZGVkIHRvIHRoaXMgcmVjb3JkLgorICB2b2lkIGFkZGVkTWVtYmVyKERlY2wgKkQpOworCisgIHZvaWQgbWFya2VkVmlydHVhbEZ1bmN0aW9uUHVyZSgpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBoZWFkIG9mIG91ciBsaXN0IG9mIGZyaWVuZCBkZWNsYXJhdGlvbnMsIHBvc3NpYmx5CisgIC8vLyBkZXNlcmlhbGl6aW5nIHRoZSBmcmllbmRzIGZyb20gYW4gZXh0ZXJuYWwgQVNUIHNvdXJjZS4KKyAgRnJpZW5kRGVjbCAqZ2V0Rmlyc3RGcmllbmQoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICBDWFhSZWNvcmREZWNsKEtpbmQgSywgVGFnS2luZCBUSywgY29uc3QgQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBJZExvYywKKyAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsIENYWFJlY29yZERlY2wgKlByZXZEZWNsKTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIEl0ZXJhdG9yIHRoYXQgdHJhdmVyc2VzIHRoZSBiYXNlIGNsYXNzZXMgb2YgYSBjbGFzcy4KKyAgdXNpbmcgYmFzZV9jbGFzc19pdGVyYXRvciA9IENYWEJhc2VTcGVjaWZpZXIgKjsKKworICAvLy8gXGJyaWVmIEl0ZXJhdG9yIHRoYXQgdHJhdmVyc2VzIHRoZSBiYXNlIGNsYXNzZXMgb2YgYSBjbGFzcy4KKyAgdXNpbmcgYmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciA9IGNvbnN0IENYWEJhc2VTcGVjaWZpZXIgKjsKKworICBDWFhSZWNvcmREZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBjYXN0PENYWFJlY29yZERlY2w+KFJlY29yZERlY2w6OmdldENhbm9uaWNhbERlY2woKSk7CisgIH0KKworICBjb25zdCBDWFhSZWNvcmREZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PENYWFJlY29yZERlY2wqPih0aGlzKS0+Z2V0Q2Fub25pY2FsRGVjbCgpOworICB9CisKKyAgQ1hYUmVjb3JkRGVjbCAqZ2V0UHJldmlvdXNEZWNsKCkgeworICAgIHJldHVybiBjYXN0X29yX251bGw8Q1hYUmVjb3JkRGVjbD4oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxSZWNvcmREZWNsICo+KHRoaXMpLT5nZXRQcmV2aW91c0RlY2woKSk7CisgIH0KKworICBjb25zdCBDWFhSZWNvcmREZWNsICpnZXRQcmV2aW91c0RlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q1hYUmVjb3JkRGVjbCo+KHRoaXMpLT5nZXRQcmV2aW91c0RlY2woKTsKKyAgfQorCisgIENYWFJlY29yZERlY2wgKmdldE1vc3RSZWNlbnREZWNsKCkgeworICAgIHJldHVybiBjYXN0PENYWFJlY29yZERlY2w+KAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVjb3JkRGVjbCAqPih0aGlzKS0+Z2V0TW9zdFJlY2VudERlY2woKSk7CisgIH0KKworICBjb25zdCBDWFhSZWNvcmREZWNsICpnZXRNb3N0UmVjZW50RGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxDWFhSZWNvcmREZWNsKj4odGhpcyktPmdldE1vc3RSZWNlbnREZWNsKCk7CisgIH0KKworICBDWFhSZWNvcmREZWNsICpnZXREZWZpbml0aW9uKCkgY29uc3QgeworICAgIC8vIFdlIG9ubHkgbmVlZCBhbiB1cGRhdGUgaWYgd2UgZG9uJ3QgYWxyZWFkeSBrbm93IHdoaWNoCisgICAgLy8gZGVjbGFyYXRpb24gaXMgdGhlIGRlZmluaXRpb24uCisgICAgYXV0byAqREQgPSBEZWZpbml0aW9uRGF0YSA/IERlZmluaXRpb25EYXRhIDogZGF0YVB0cigpOworICAgIHJldHVybiBERCA/IERELT5EZWZpbml0aW9uIDogbnVsbHB0cjsKKyAgfQorCisgIGJvb2wgaGFzRGVmaW5pdGlvbigpIGNvbnN0IHsgcmV0dXJuIERlZmluaXRpb25EYXRhIHx8IGRhdGFQdHIoKTsgfQorCisgIHN0YXRpYyBDWFhSZWNvcmREZWNsICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgVGFnS2luZCBUSywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBJZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYUmVjb3JkRGVjbCAqUHJldkRlY2wgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVsYXlUeXBlQ3JlYXRpb24gPSBmYWxzZSk7CisgIHN0YXRpYyBDWFhSZWNvcmREZWNsICpDcmVhdGVMYW1iZGEoY29uc3QgQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpJbmZvLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZXBlbmRlbnRMYW1iZGEsIGJvb2wgSXNHZW5lcmljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhbWJkYUNhcHR1cmVEZWZhdWx0IENhcHR1cmVEZWZhdWx0KTsKKyAgc3RhdGljIENYWFJlY29yZERlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisKKyAgYm9vbCBpc0R5bmFtaWNDbGFzcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZGF0YSgpLlBvbHltb3JwaGljIHx8IGRhdGEoKS5OdW1WQmFzZXMgIT0gMDsKKyAgfQorCisgIHZvaWQgc2V0SXNQYXJzaW5nQmFzZVNwZWNpZmllcnMoKSB7IGRhdGEoKS5Jc1BhcnNpbmdCYXNlU3BlY2lmaWVycyA9IHRydWU7IH0KKworICBib29sIGlzUGFyc2luZ0Jhc2VTcGVjaWZpZXJzKCkgY29uc3QgeworICAgIHJldHVybiBkYXRhKCkuSXNQYXJzaW5nQmFzZVNwZWNpZmllcnM7CisgIH0KKworICB1bnNpZ25lZCBnZXRPRFJIYXNoKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBiYXNlIGNsYXNzZXMgb2YgdGhpcyBzdHJ1Y3Qgb3IgY2xhc3MuCisgIHZvaWQgc2V0QmFzZXMoQ1hYQmFzZVNwZWNpZmllciBjb25zdCAqIGNvbnN0ICpCYXNlcywgdW5zaWduZWQgTnVtQmFzZXMpOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmVzIHRoZSBudW1iZXIgb2YgYmFzZSBjbGFzc2VzIG9mIHRoaXMgY2xhc3MuCisgIHVuc2lnbmVkIGdldE51bUJhc2VzKCkgY29uc3QgeyByZXR1cm4gZGF0YSgpLk51bUJhc2VzOyB9CisKKyAgdXNpbmcgYmFzZV9jbGFzc19yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGJhc2VfY2xhc3NfaXRlcmF0b3I+OworICB1c2luZyBiYXNlX2NsYXNzX2NvbnN0X3JhbmdlID0KKyAgICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3I+OworCisgIGJhc2VfY2xhc3NfcmFuZ2UgYmFzZXMoKSB7CisgICAgcmV0dXJuIGJhc2VfY2xhc3NfcmFuZ2UoYmFzZXNfYmVnaW4oKSwgYmFzZXNfZW5kKCkpOworICB9CisgIGJhc2VfY2xhc3NfY29uc3RfcmFuZ2UgYmFzZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGJhc2VfY2xhc3NfY29uc3RfcmFuZ2UoYmFzZXNfYmVnaW4oKSwgYmFzZXNfZW5kKCkpOworICB9CisKKyAgYmFzZV9jbGFzc19pdGVyYXRvciBiYXNlc19iZWdpbigpIHsgcmV0dXJuIGRhdGEoKS5nZXRCYXNlcygpOyB9CisgIGJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgYmFzZXNfYmVnaW4oKSBjb25zdCB7IHJldHVybiBkYXRhKCkuZ2V0QmFzZXMoKTsgfQorICBiYXNlX2NsYXNzX2l0ZXJhdG9yIGJhc2VzX2VuZCgpIHsgcmV0dXJuIGJhc2VzX2JlZ2luKCkgKyBkYXRhKCkuTnVtQmFzZXM7IH0KKyAgYmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBiYXNlc19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGJhc2VzX2JlZ2luKCkgKyBkYXRhKCkuTnVtQmFzZXM7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIHZpcnR1YWwgYmFzZSBjbGFzc2VzIG9mIHRoaXMgY2xhc3MuCisgIHVuc2lnbmVkIGdldE51bVZCYXNlcygpIGNvbnN0IHsgcmV0dXJuIGRhdGEoKS5OdW1WQmFzZXM7IH0KKworICBiYXNlX2NsYXNzX3JhbmdlIHZiYXNlcygpIHsKKyAgICByZXR1cm4gYmFzZV9jbGFzc19yYW5nZSh2YmFzZXNfYmVnaW4oKSwgdmJhc2VzX2VuZCgpKTsKKyAgfQorICBiYXNlX2NsYXNzX2NvbnN0X3JhbmdlIHZiYXNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gYmFzZV9jbGFzc19jb25zdF9yYW5nZSh2YmFzZXNfYmVnaW4oKSwgdmJhc2VzX2VuZCgpKTsKKyAgfQorCisgIGJhc2VfY2xhc3NfaXRlcmF0b3IgdmJhc2VzX2JlZ2luKCkgeyByZXR1cm4gZGF0YSgpLmdldFZCYXNlcygpOyB9CisgIGJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgdmJhc2VzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gZGF0YSgpLmdldFZCYXNlcygpOyB9CisgIGJhc2VfY2xhc3NfaXRlcmF0b3IgdmJhc2VzX2VuZCgpIHsgcmV0dXJuIHZiYXNlc19iZWdpbigpICsgZGF0YSgpLk51bVZCYXNlczsgfQorICBiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIHZiYXNlc19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIHZiYXNlc19iZWdpbigpICsgZGF0YSgpLk51bVZCYXNlczsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBoYXMgYW55IGRlcGVuZGVudCBiYXNlIGNsYXNzZXMgd2hpY2gKKyAgLy8vIGFyZSBub3QgdGhlIGN1cnJlbnQgaW5zdGFudGlhdGlvbi4KKyAgYm9vbCBoYXNBbnlEZXBlbmRlbnRCYXNlcygpIGNvbnN0OworCisgIC8vLyBJdGVyYXRvciBhY2Nlc3MgdG8gbWV0aG9kIG1lbWJlcnMuICBUaGUgbWV0aG9kIGl0ZXJhdG9yIHZpc2l0cworICAvLy8gYWxsIG1ldGhvZCBtZW1iZXJzIG9mIHRoZSBjbGFzcywgaW5jbHVkaW5nIG5vbi1pbnN0YW5jZSBtZXRob2RzLAorICAvLy8gc3BlY2lhbCBtZXRob2RzLCBldGMuCisgIHVzaW5nIG1ldGhvZF9pdGVyYXRvciA9IHNwZWNpZmljX2RlY2xfaXRlcmF0b3I8Q1hYTWV0aG9kRGVjbD47CisgIHVzaW5nIG1ldGhvZF9yYW5nZSA9CisgICAgICBsbHZtOjppdGVyYXRvcl9yYW5nZTxzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPENYWE1ldGhvZERlY2w+PjsKKworICBtZXRob2RfcmFuZ2UgbWV0aG9kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWV0aG9kX3JhbmdlKG1ldGhvZF9iZWdpbigpLCBtZXRob2RfZW5kKCkpOworICB9CisKKyAgLy8vIFxicmllZiBNZXRob2QgYmVnaW4gaXRlcmF0b3IuICBJdGVyYXRlcyBpbiB0aGUgb3JkZXIgdGhlIG1ldGhvZHMKKyAgLy8vIHdlcmUgZGVjbGFyZWQuCisgIG1ldGhvZF9pdGVyYXRvciBtZXRob2RfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG1ldGhvZF9pdGVyYXRvcihkZWNsc19iZWdpbigpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTWV0aG9kIHBhc3QtdGhlLWVuZCBpdGVyYXRvci4KKyAgbWV0aG9kX2l0ZXJhdG9yIG1ldGhvZF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ldGhvZF9pdGVyYXRvcihkZWNsc19lbmQoKSk7CisgIH0KKworICAvLy8gSXRlcmF0b3IgYWNjZXNzIHRvIGNvbnN0cnVjdG9yIG1lbWJlcnMuCisgIHVzaW5nIGN0b3JfaXRlcmF0b3IgPSBzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPENYWENvbnN0cnVjdG9yRGVjbD47CisgIHVzaW5nIGN0b3JfcmFuZ2UgPQorICAgICAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c3BlY2lmaWNfZGVjbF9pdGVyYXRvcjxDWFhDb25zdHJ1Y3RvckRlY2w+PjsKKworICBjdG9yX3JhbmdlIGN0b3JzKCkgY29uc3QgeyByZXR1cm4gY3Rvcl9yYW5nZShjdG9yX2JlZ2luKCksIGN0b3JfZW5kKCkpOyB9CisKKyAgY3Rvcl9pdGVyYXRvciBjdG9yX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjdG9yX2l0ZXJhdG9yKGRlY2xzX2JlZ2luKCkpOworICB9CisKKyAgY3Rvcl9pdGVyYXRvciBjdG9yX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY3Rvcl9pdGVyYXRvcihkZWNsc19lbmQoKSk7CisgIH0KKworICAvLy8gQW4gaXRlcmF0b3Igb3ZlciBmcmllbmQgZGVjbGFyYXRpb25zLiAgQWxsIG9mIHRoZXNlIGFyZSBkZWZpbmVkCisgIC8vLyBpbiBEZWNsRnJpZW5kLmguCisgIGNsYXNzIGZyaWVuZF9pdGVyYXRvcjsKKyAgdXNpbmcgZnJpZW5kX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8ZnJpZW5kX2l0ZXJhdG9yPjsKKworICBmcmllbmRfcmFuZ2UgZnJpZW5kcygpIGNvbnN0OworICBmcmllbmRfaXRlcmF0b3IgZnJpZW5kX2JlZ2luKCkgY29uc3Q7CisgIGZyaWVuZF9pdGVyYXRvciBmcmllbmRfZW5kKCkgY29uc3Q7CisgIHZvaWQgcHVzaEZyaWVuZERlY2woRnJpZW5kRGVjbCAqRkQpOworCisgIC8vLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyByZWNvcmQgaGFzIGFueSBmcmllbmRzLgorICBib29sIGhhc0ZyaWVuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGRhdGEoKS5GaXJzdEZyaWVuZC5pc1ZhbGlkKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFxjIHRydWUgaWYgYSBkZWZhdWx0ZWQgY29weSBjb25zdHJ1Y3RvciBmb3IgdGhpcyBjbGFzcyB3b3VsZCBiZQorICAvLy8gZGVsZXRlZC4KKyAgYm9vbCBkZWZhdWx0ZWRDb3B5Q29uc3RydWN0b3JJc0RlbGV0ZWQoKSBjb25zdCB7CisgICAgYXNzZXJ0KCghbmVlZHNPdmVybG9hZFJlc29sdXRpb25Gb3JDb3B5Q29uc3RydWN0b3IoKSB8fAorICAgICAgICAgICAgKGRhdGEoKS5EZWNsYXJlZFNwZWNpYWxNZW1iZXJzICYgU01GX0NvcHlDb25zdHJ1Y3RvcikpICYmCisgICAgICAgICAgICJ0aGlzIHByb3BlcnR5IGhhcyBub3QgeWV0IGJlZW4gY29tcHV0ZWQgYnkgU2VtYSIpOworICAgIHJldHVybiBkYXRhKCkuRGVmYXVsdGVkQ29weUNvbnN0cnVjdG9ySXNEZWxldGVkOworICB9CisKKyAgLy8vIFxicmllZiBcYyB0cnVlIGlmIGEgZGVmYXVsdGVkIG1vdmUgY29uc3RydWN0b3IgZm9yIHRoaXMgY2xhc3Mgd291bGQgYmUKKyAgLy8vIGRlbGV0ZWQuCisgIGJvb2wgZGVmYXVsdGVkTW92ZUNvbnN0cnVjdG9ySXNEZWxldGVkKCkgY29uc3QgeworICAgIGFzc2VydCgoIW5lZWRzT3ZlcmxvYWRSZXNvbHV0aW9uRm9yTW92ZUNvbnN0cnVjdG9yKCkgfHwKKyAgICAgICAgICAgIChkYXRhKCkuRGVjbGFyZWRTcGVjaWFsTWVtYmVycyAmIFNNRl9Nb3ZlQ29uc3RydWN0b3IpKSAmJgorICAgICAgICAgICAidGhpcyBwcm9wZXJ0eSBoYXMgbm90IHlldCBiZWVuIGNvbXB1dGVkIGJ5IFNlbWEiKTsKKyAgICByZXR1cm4gZGF0YSgpLkRlZmF1bHRlZE1vdmVDb25zdHJ1Y3RvcklzRGVsZXRlZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgXGMgdHJ1ZSBpZiBhIGRlZmF1bHRlZCBkZXN0cnVjdG9yIGZvciB0aGlzIGNsYXNzIHdvdWxkIGJlIGRlbGV0ZWQuCisgIGJvb2wgZGVmYXVsdGVkRGVzdHJ1Y3RvcklzRGVsZXRlZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoKCFuZWVkc092ZXJsb2FkUmVzb2x1dGlvbkZvckRlc3RydWN0b3IoKSB8fAorICAgICAgICAgICAgKGRhdGEoKS5EZWNsYXJlZFNwZWNpYWxNZW1iZXJzICYgU01GX0Rlc3RydWN0b3IpKSAmJgorICAgICAgICAgICAidGhpcyBwcm9wZXJ0eSBoYXMgbm90IHlldCBiZWVuIGNvbXB1dGVkIGJ5IFNlbWEiKTsKKyAgICByZXR1cm4gZGF0YSgpLkRlZmF1bHRlZERlc3RydWN0b3JJc0RlbGV0ZWQ7CisgIH0KKworICAvLy8gXGJyaWVmIFxjIHRydWUgaWYgd2Uga25vdyBmb3Igc3VyZSB0aGF0IHRoaXMgY2xhc3MgaGFzIGEgc2luZ2xlLAorICAvLy8gYWNjZXNzaWJsZSwgdW5hbWJpZ3VvdXMgY29weSBjb25zdHJ1Y3RvciB0aGF0IGlzIG5vdCBkZWxldGVkLgorICBib29sIGhhc1NpbXBsZUNvcHlDb25zdHJ1Y3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gIWhhc1VzZXJEZWNsYXJlZENvcHlDb25zdHJ1Y3RvcigpICYmCisgICAgICAgICAgICFkYXRhKCkuRGVmYXVsdGVkQ29weUNvbnN0cnVjdG9ySXNEZWxldGVkOworICB9CisKKyAgLy8vIFxicmllZiBcYyB0cnVlIGlmIHdlIGtub3cgZm9yIHN1cmUgdGhhdCB0aGlzIGNsYXNzIGhhcyBhIHNpbmdsZSwKKyAgLy8vIGFjY2Vzc2libGUsIHVuYW1iaWd1b3VzIG1vdmUgY29uc3RydWN0b3IgdGhhdCBpcyBub3QgZGVsZXRlZC4KKyAgYm9vbCBoYXNTaW1wbGVNb3ZlQ29uc3RydWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuICFoYXNVc2VyRGVjbGFyZWRNb3ZlQ29uc3RydWN0b3IoKSAmJiBoYXNNb3ZlQ29uc3RydWN0b3IoKSAmJgorICAgICAgICAgICAhZGF0YSgpLkRlZmF1bHRlZE1vdmVDb25zdHJ1Y3RvcklzRGVsZXRlZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgXGMgdHJ1ZSBpZiB3ZSBrbm93IGZvciBzdXJlIHRoYXQgdGhpcyBjbGFzcyBoYXMgYSBzaW5nbGUsCisgIC8vLyBhY2Nlc3NpYmxlLCB1bmFtYmlndW91cyBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IgdGhhdCBpcyBub3QgZGVsZXRlZC4KKyAgYm9vbCBoYXNTaW1wbGVNb3ZlQXNzaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gIWhhc1VzZXJEZWNsYXJlZE1vdmVBc3NpZ25tZW50KCkgJiYgaGFzTW92ZUFzc2lnbm1lbnQoKSAmJgorICAgICAgICAgICAhZGF0YSgpLkRlZmF1bHRlZE1vdmVBc3NpZ25tZW50SXNEZWxldGVkOworICB9CisKKyAgLy8vIFxicmllZiBcYyB0cnVlIGlmIHdlIGtub3cgZm9yIHN1cmUgdGhhdCB0aGlzIGNsYXNzIGhhcyBhbiBhY2Nlc3NpYmxlCisgIC8vLyBkZXN0cnVjdG9yIHRoYXQgaXMgbm90IGRlbGV0ZWQuCisgIGJvb2wgaGFzU2ltcGxlRGVzdHJ1Y3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gIWhhc1VzZXJEZWNsYXJlZERlc3RydWN0b3IoKSAmJgorICAgICAgICAgICAhZGF0YSgpLkRlZmF1bHRlZERlc3RydWN0b3JJc0RlbGV0ZWQ7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2xhc3MgaGFzIGFueSBkZWZhdWx0IGNvbnN0cnVjdG9ycy4KKyAgYm9vbCBoYXNEZWZhdWx0Q29uc3RydWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIChkYXRhKCkuRGVjbGFyZWRTcGVjaWFsTWVtYmVycyAmIFNNRl9EZWZhdWx0Q29uc3RydWN0b3IpIHx8CisgICAgICAgICAgIG5lZWRzSW1wbGljaXREZWZhdWx0Q29uc3RydWN0b3IoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gZGVjbGFyZSBhIGRlZmF1bHQgY29uc3RydWN0b3IgZm9yCisgIC8vLyB0aGlzIGNsYXNzLgorICAvLy8KKyAgLy8vIFRoaXMgdmFsdWUgaXMgdXNlZCBmb3IgbGF6eSBjcmVhdGlvbiBvZiBkZWZhdWx0IGNvbnN0cnVjdG9ycy4KKyAgYm9vbCBuZWVkc0ltcGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiAhZGF0YSgpLlVzZXJEZWNsYXJlZENvbnN0cnVjdG9yICYmCisgICAgICAgICAgICEoZGF0YSgpLkRlY2xhcmVkU3BlY2lhbE1lbWJlcnMgJiBTTUZfRGVmYXVsdENvbnN0cnVjdG9yKSAmJgorICAgICAgICAgICAvLyBDKysxNCBbZXhwci5wcmltLmxhbWJkYV1wMjA6CisgICAgICAgICAgIC8vICAgVGhlIGNsb3N1cmUgdHlwZSBhc3NvY2lhdGVkIHdpdGggYSBsYW1iZGEtZXhwcmVzc2lvbiBoYXMgbm8KKyAgICAgICAgICAgLy8gICBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAgICAgICAhaXNMYW1iZGEoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBoYXMgYW55IHVzZXItZGVjbGFyZWQgY29uc3RydWN0b3JzLgorICAvLy8KKyAgLy8vIFdoZW4gdHJ1ZSwgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIHdpbGwgbm90IGJlIGltcGxpY2l0bHkgZGVjbGFyZWQuCisgIGJvb2wgaGFzVXNlckRlY2xhcmVkQ29uc3RydWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGRhdGEoKS5Vc2VyRGVjbGFyZWRDb25zdHJ1Y3RvcjsKKyAgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGNsYXNzIGhhcyBhIHVzZXItcHJvdmlkZWQgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICAvLy8gcGVyIEMrKzExLgorICBib29sIGhhc1VzZXJQcm92aWRlZERlZmF1bHRDb25zdHJ1Y3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZGF0YSgpLlVzZXJQcm92aWRlZERlZmF1bHRDb25zdHJ1Y3RvcjsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBoYXMgYSB1c2VyLWRlY2xhcmVkIGNvcHkgY29uc3RydWN0b3IuCisgIC8vLworICAvLy8gV2hlbiBmYWxzZSwgYSBjb3B5IGNvbnN0cnVjdG9yIHdpbGwgYmUgaW1wbGljaXRseSBkZWNsYXJlZC4KKyAgYm9vbCBoYXNVc2VyRGVjbGFyZWRDb3B5Q29uc3RydWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGRhdGEoKS5Vc2VyRGVjbGFyZWRTcGVjaWFsTWVtYmVycyAmIFNNRl9Db3B5Q29uc3RydWN0b3I7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2xhc3MgbmVlZHMgYW4gaW1wbGljaXQgY29weQorICAvLy8gY29uc3RydWN0b3IgdG8gYmUgbGF6aWx5IGRlY2xhcmVkLgorICBib29sIG5lZWRzSW1wbGljaXRDb3B5Q29uc3RydWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuICEoZGF0YSgpLkRlY2xhcmVkU3BlY2lhbE1lbWJlcnMgJiBTTUZfQ29weUNvbnN0cnVjdG9yKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgd2UgbmVlZCB0byBlYWdlcmx5IGRlY2xhcmUgYSBkZWZhdWx0ZWQgY29weQorICAvLy8gY29uc3RydWN0b3IgZm9yIHRoaXMgY2xhc3MuCisgIGJvb2wgbmVlZHNPdmVybG9hZFJlc29sdXRpb25Gb3JDb3B5Q29uc3RydWN0b3IoKSBjb25zdCB7CisgICAgLy8gQysrMTcgW2NsYXNzLmNvcHkuY3Rvcl1wNjoKKyAgICAvLyAgIElmIHRoZSBjbGFzcyBkZWZpbml0aW9uIGRlY2xhcmVzIGEgbW92ZSBjb25zdHJ1Y3RvciBvciBtb3ZlIGFzc2lnbm1lbnQKKyAgICAvLyAgIG9wZXJhdG9yLCB0aGUgaW1wbGljaXRseSBkZWNsYXJlZCBjb3B5IGNvbnN0cnVjdG9yIGlzIGRlZmluZWQgYXMKKyAgICAvLyAgIGRlbGV0ZWQuCisgICAgLy8gSW4gTVNWQyBtb2RlLCBzb21ldGltZXMgYSBkZWNsYXJlZCBtb3ZlIGFzc2lnbm1lbnQgZG9lcyBub3QgZGVsZXRlIGFuCisgICAgLy8gaW1wbGljaXQgY29weSBjb25zdHJ1Y3Rvciwgc28gZGVmZXIgdGhpcyBjaG9pY2UgdG8gU2VtYS4KKyAgICBpZiAoZGF0YSgpLlVzZXJEZWNsYXJlZFNwZWNpYWxNZW1iZXJzICYKKyAgICAgICAgKFNNRl9Nb3ZlQ29uc3RydWN0b3IgfCBTTUZfTW92ZUFzc2lnbm1lbnQpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGRhdGEoKS5OZWVkT3ZlcmxvYWRSZXNvbHV0aW9uRm9yQ29weUNvbnN0cnVjdG9yOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciBhbiBpbXBsaWNpdCBjb3B5IGNvbnN0cnVjdG9yIGZvciB0aGlzIHR5cGUKKyAgLy8vIHdvdWxkIGhhdmUgYSBwYXJhbWV0ZXIgd2l0aCBhIGNvbnN0LXF1YWxpZmllZCByZWZlcmVuY2UgdHlwZS4KKyAgYm9vbCBpbXBsaWNpdENvcHlDb25zdHJ1Y3Rvckhhc0NvbnN0UGFyYW0oKSBjb25zdCB7CisgICAgcmV0dXJuIGRhdGEoKS5JbXBsaWNpdENvcHlDb25zdHJ1Y3RvckNhbkhhdmVDb25zdFBhcmFtRm9yTm9uVkJhc2UgJiYKKyAgICAgICAgICAgKGlzQWJzdHJhY3QoKSB8fAorICAgICAgICAgICAgZGF0YSgpLkltcGxpY2l0Q29weUNvbnN0cnVjdG9yQ2FuSGF2ZUNvbnN0UGFyYW1Gb3JWQmFzZSk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2xhc3MgaGFzIGEgY29weSBjb25zdHJ1Y3RvciB3aXRoCisgIC8vLyBhIHBhcmFtZXRlciB0eXBlIHdoaWNoIGlzIGEgcmVmZXJlbmNlIHRvIGEgY29uc3QtcXVhbGlmaWVkIHR5cGUuCisgIGJvb2wgaGFzQ29weUNvbnN0cnVjdG9yV2l0aENvbnN0UGFyYW0oKSBjb25zdCB7CisgICAgcmV0dXJuIGRhdGEoKS5IYXNEZWNsYXJlZENvcHlDb25zdHJ1Y3RvcldpdGhDb25zdFBhcmFtIHx8CisgICAgICAgICAgIChuZWVkc0ltcGxpY2l0Q29weUNvbnN0cnVjdG9yKCkgJiYKKyAgICAgICAgICAgIGltcGxpY2l0Q29weUNvbnN0cnVjdG9ySGFzQ29uc3RQYXJhbSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGNsYXNzIGhhcyBhIHVzZXItZGVjbGFyZWQgbW92ZSBjb25zdHJ1Y3RvciBvcgorICAvLy8gYXNzaWdubWVudCBvcGVyYXRvci4KKyAgLy8vCisgIC8vLyBXaGVuIGZhbHNlLCBhIG1vdmUgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IgbWF5IGJlCisgIC8vLyBpbXBsaWNpdGx5IGRlY2xhcmVkLgorICBib29sIGhhc1VzZXJEZWNsYXJlZE1vdmVPcGVyYXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGRhdGEoKS5Vc2VyRGVjbGFyZWRTcGVjaWFsTWVtYmVycyAmCisgICAgICAgICAgICAgKFNNRl9Nb3ZlQ29uc3RydWN0b3IgfCBTTUZfTW92ZUFzc2lnbm1lbnQpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBoYWQgYSBtb3ZlIGNvbnN0cnVjdG9yCisgIC8vLyBkZWNsYXJlZCBieSB0aGUgdXNlci4KKyAgYm9vbCBoYXNVc2VyRGVjbGFyZWRNb3ZlQ29uc3RydWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGRhdGEoKS5Vc2VyRGVjbGFyZWRTcGVjaWFsTWVtYmVycyAmIFNNRl9Nb3ZlQ29uc3RydWN0b3I7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2xhc3MgaGFzIGEgbW92ZSBjb25zdHJ1Y3Rvci4KKyAgYm9vbCBoYXNNb3ZlQ29uc3RydWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIChkYXRhKCkuRGVjbGFyZWRTcGVjaWFsTWVtYmVycyAmIFNNRl9Nb3ZlQ29uc3RydWN0b3IpIHx8CisgICAgICAgICAgIG5lZWRzSW1wbGljaXRNb3ZlQ29uc3RydWN0b3IoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoYXQgd2UgYXR0ZW1wdGVkIHRvIGRlY2xhcmUgYW4gaW1wbGljaXQgY29weQorICAvLy8gY29uc3RydWN0b3IsIGJ1dCBvdmVybG9hZCByZXNvbHV0aW9uIGZhaWxlZCBzbyB3ZSBkZWxldGVkIGl0LgorICB2b2lkIHNldEltcGxpY2l0Q29weUNvbnN0cnVjdG9ySXNEZWxldGVkKCkgeworICAgIGFzc2VydCgoZGF0YSgpLkRlZmF1bHRlZENvcHlDb25zdHJ1Y3RvcklzRGVsZXRlZCB8fAorICAgICAgICAgICAgbmVlZHNPdmVybG9hZFJlc29sdXRpb25Gb3JDb3B5Q29uc3RydWN0b3IoKSkgJiYKKyAgICAgICAgICAgIkNvcHkgY29uc3RydWN0b3Igc2hvdWxkIG5vdCBiZSBkZWxldGVkIik7CisgICAgZGF0YSgpLkRlZmF1bHRlZENvcHlDb25zdHJ1Y3RvcklzRGVsZXRlZCA9IHRydWU7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGF0IHdlIGF0dGVtcHRlZCB0byBkZWNsYXJlIGFuIGltcGxpY2l0IG1vdmUKKyAgLy8vIGNvbnN0cnVjdG9yLCBidXQgb3ZlcmxvYWQgcmVzb2x1dGlvbiBmYWlsZWQgc28gd2UgZGVsZXRlZCBpdC4KKyAgdm9pZCBzZXRJbXBsaWNpdE1vdmVDb25zdHJ1Y3RvcklzRGVsZXRlZCgpIHsKKyAgICBhc3NlcnQoKGRhdGEoKS5EZWZhdWx0ZWRNb3ZlQ29uc3RydWN0b3JJc0RlbGV0ZWQgfHwKKyAgICAgICAgICAgIG5lZWRzT3ZlcmxvYWRSZXNvbHV0aW9uRm9yTW92ZUNvbnN0cnVjdG9yKCkpICYmCisgICAgICAgICAgICJtb3ZlIGNvbnN0cnVjdG9yIHNob3VsZCBub3QgYmUgZGVsZXRlZCIpOworICAgIGRhdGEoKS5EZWZhdWx0ZWRNb3ZlQ29uc3RydWN0b3JJc0RlbGV0ZWQgPSB0cnVlOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhhdCB3ZSBhdHRlbXB0ZWQgdG8gZGVjbGFyZSBhbiBpbXBsaWNpdCBkZXN0cnVjdG9yLAorICAvLy8gYnV0IG92ZXJsb2FkIHJlc29sdXRpb24gZmFpbGVkIHNvIHdlIGRlbGV0ZWQgaXQuCisgIHZvaWQgc2V0SW1wbGljaXREZXN0cnVjdG9ySXNEZWxldGVkKCkgeworICAgIGFzc2VydCgoZGF0YSgpLkRlZmF1bHRlZERlc3RydWN0b3JJc0RlbGV0ZWQgfHwKKyAgICAgICAgICAgIG5lZWRzT3ZlcmxvYWRSZXNvbHV0aW9uRm9yRGVzdHJ1Y3RvcigpKSAmJgorICAgICAgICAgICAiZGVzdHJ1Y3RvciBzaG91bGQgbm90IGJlIGRlbGV0ZWQiKTsKKyAgICBkYXRhKCkuRGVmYXVsdGVkRGVzdHJ1Y3RvcklzRGVsZXRlZCA9IHRydWU7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2xhc3Mgc2hvdWxkIGdldCBhbiBpbXBsaWNpdCBtb3ZlCisgIC8vLyBjb25zdHJ1Y3RvciBvciBpZiBhbnkgZXhpc3Rpbmcgc3BlY2lhbCBtZW1iZXIgZnVuY3Rpb24gaW5oaWJpdHMgdGhpcy4KKyAgYm9vbCBuZWVkc0ltcGxpY2l0TW92ZUNvbnN0cnVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiAhKGRhdGEoKS5EZWNsYXJlZFNwZWNpYWxNZW1iZXJzICYgU01GX01vdmVDb25zdHJ1Y3RvcikgJiYKKyAgICAgICAgICAgIWhhc1VzZXJEZWNsYXJlZENvcHlDb25zdHJ1Y3RvcigpICYmCisgICAgICAgICAgICFoYXNVc2VyRGVjbGFyZWRDb3B5QXNzaWdubWVudCgpICYmCisgICAgICAgICAgICFoYXNVc2VyRGVjbGFyZWRNb3ZlQXNzaWdubWVudCgpICYmCisgICAgICAgICAgICFoYXNVc2VyRGVjbGFyZWREZXN0cnVjdG9yKCk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHdlIG5lZWQgdG8gZWFnZXJseSBkZWNsYXJlIGEgZGVmYXVsdGVkIG1vdmUKKyAgLy8vIGNvbnN0cnVjdG9yIGZvciB0aGlzIGNsYXNzLgorICBib29sIG5lZWRzT3ZlcmxvYWRSZXNvbHV0aW9uRm9yTW92ZUNvbnN0cnVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBkYXRhKCkuTmVlZE92ZXJsb2FkUmVzb2x1dGlvbkZvck1vdmVDb25zdHJ1Y3RvcjsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBoYXMgYSB1c2VyLWRlY2xhcmVkIGNvcHkgYXNzaWdubWVudAorICAvLy8gb3BlcmF0b3IuCisgIC8vLworICAvLy8gV2hlbiBmYWxzZSwgYSBjb3B5IGFzc2lnbWVudCBvcGVyYXRvciB3aWxsIGJlIGltcGxpY2l0bHkgZGVjbGFyZWQuCisgIGJvb2wgaGFzVXNlckRlY2xhcmVkQ29weUFzc2lnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGRhdGEoKS5Vc2VyRGVjbGFyZWRTcGVjaWFsTWVtYmVycyAmIFNNRl9Db3B5QXNzaWdubWVudDsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBuZWVkcyBhbiBpbXBsaWNpdCBjb3B5CisgIC8vLyBhc3NpZ25tZW50IG9wZXJhdG9yIHRvIGJlIGxhemlseSBkZWNsYXJlZC4KKyAgYm9vbCBuZWVkc0ltcGxpY2l0Q29weUFzc2lnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuICEoZGF0YSgpLkRlY2xhcmVkU3BlY2lhbE1lbWJlcnMgJiBTTUZfQ29weUFzc2lnbm1lbnQpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB3ZSBuZWVkIHRvIGVhZ2VybHkgZGVjbGFyZSBhIGRlZmF1bHRlZCBjb3B5CisgIC8vLyBhc3NpZ25tZW50IG9wZXJhdG9yIGZvciB0aGlzIGNsYXNzLgorICBib29sIG5lZWRzT3ZlcmxvYWRSZXNvbHV0aW9uRm9yQ29weUFzc2lnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGRhdGEoKS5IYXNNdXRhYmxlRmllbGRzOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciBhbiBpbXBsaWNpdCBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IgZm9yIHRoaXMKKyAgLy8vIHR5cGUgd291bGQgaGF2ZSBhIHBhcmFtZXRlciB3aXRoIGEgY29uc3QtcXVhbGlmaWVkIHJlZmVyZW5jZSB0eXBlLgorICBib29sIGltcGxpY2l0Q29weUFzc2lnbm1lbnRIYXNDb25zdFBhcmFtKCkgY29uc3QgeworICAgIHJldHVybiBkYXRhKCkuSW1wbGljaXRDb3B5QXNzaWdubWVudEhhc0NvbnN0UGFyYW07CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2xhc3MgaGFzIGEgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yIHdpdGgKKyAgLy8vIGEgcGFyYW1ldGVyIHR5cGUgd2hpY2ggaXMgYSByZWZlcmVuY2UgdG8gYSBjb25zdC1xdWFsaWZpZWQgdHlwZSBvciBpcyBub3QKKyAgLy8vIGEgcmVmZXJlbmNlLgorICBib29sIGhhc0NvcHlBc3NpZ25tZW50V2l0aENvbnN0UGFyYW0oKSBjb25zdCB7CisgICAgcmV0dXJuIGRhdGEoKS5IYXNEZWNsYXJlZENvcHlBc3NpZ25tZW50V2l0aENvbnN0UGFyYW0gfHwKKyAgICAgICAgICAgKG5lZWRzSW1wbGljaXRDb3B5QXNzaWdubWVudCgpICYmCisgICAgICAgICAgICBpbXBsaWNpdENvcHlBc3NpZ25tZW50SGFzQ29uc3RQYXJhbSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBoYXMgaGFkIGEgbW92ZSBhc3NpZ25tZW50CisgIC8vLyBkZWNsYXJlZCBieSB0aGUgdXNlci4KKyAgYm9vbCBoYXNVc2VyRGVjbGFyZWRNb3ZlQXNzaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZGF0YSgpLlVzZXJEZWNsYXJlZFNwZWNpYWxNZW1iZXJzICYgU01GX01vdmVBc3NpZ25tZW50OworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBhIG1vdmUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgYm9vbCBoYXNNb3ZlQXNzaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGRhdGEoKS5EZWNsYXJlZFNwZWNpYWxNZW1iZXJzICYgU01GX01vdmVBc3NpZ25tZW50KSB8fAorICAgICAgICAgICBuZWVkc0ltcGxpY2l0TW92ZUFzc2lnbm1lbnQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoYXQgd2UgYXR0ZW1wdGVkIHRvIGRlY2xhcmUgYW4gaW1wbGljaXQgbW92ZSBhc3NpZ25tZW50CisgIC8vLyBvcGVyYXRvciwgYnV0IG92ZXJsb2FkIHJlc29sdXRpb24gZmFpbGVkIHNvIHdlIGRlbGV0ZWQgaXQuCisgIHZvaWQgc2V0SW1wbGljaXRNb3ZlQXNzaWdubWVudElzRGVsZXRlZCgpIHsKKyAgICBhc3NlcnQoKGRhdGEoKS5EZWZhdWx0ZWRNb3ZlQXNzaWdubWVudElzRGVsZXRlZCB8fAorICAgICAgICAgICAgbmVlZHNPdmVybG9hZFJlc29sdXRpb25Gb3JNb3ZlQXNzaWdubWVudCgpKSAmJgorICAgICAgICAgICAibW92ZSBhc3NpZ25tZW50IHNob3VsZCBub3QgYmUgZGVsZXRlZCIpOworICAgIGRhdGEoKS5EZWZhdWx0ZWRNb3ZlQXNzaWdubWVudElzRGVsZXRlZCA9IHRydWU7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2xhc3Mgc2hvdWxkIGdldCBhbiBpbXBsaWNpdCBtb3ZlCisgIC8vLyBhc3NpZ25tZW50IG9wZXJhdG9yIG9yIGlmIGFueSBleGlzdGluZyBzcGVjaWFsIG1lbWJlciBmdW5jdGlvbiBpbmhpYml0cworICAvLy8gdGhpcy4KKyAgYm9vbCBuZWVkc0ltcGxpY2l0TW92ZUFzc2lnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuICEoZGF0YSgpLkRlY2xhcmVkU3BlY2lhbE1lbWJlcnMgJiBTTUZfTW92ZUFzc2lnbm1lbnQpICYmCisgICAgICAgICAgICFoYXNVc2VyRGVjbGFyZWRDb3B5Q29uc3RydWN0b3IoKSAmJgorICAgICAgICAgICAhaGFzVXNlckRlY2xhcmVkQ29weUFzc2lnbm1lbnQoKSAmJgorICAgICAgICAgICAhaGFzVXNlckRlY2xhcmVkTW92ZUNvbnN0cnVjdG9yKCkgJiYKKyAgICAgICAgICAgIWhhc1VzZXJEZWNsYXJlZERlc3RydWN0b3IoKSAmJgorICAgICAgICAgICAvLyBDKysxeiBbZXhwci5wcmltLmxhbWJkYV1wMjE6ICJ0aGUgY2xvc3VyZSB0eXBlIGhhcyBhIGRlbGV0ZWQgY29weQorICAgICAgICAgICAvLyBhc3NpZ25tZW50IG9wZXJhdG9yIi4gVGhlIGludGVudCBpcyB0aGF0IHRoaXMgY291bnRzIGFzIGEgdXNlcgorICAgICAgICAgICAvLyBkZWNsYXJlZCBjb3B5IGFzc2lnbm1lbnQsIGJ1dCB3ZSBkbyBub3QgbW9kZWwgaXQgdGhhdCB3YXkuCisgICAgICAgICAgICFpc0xhbWJkYSgpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB3ZSBuZWVkIHRvIGVhZ2VybHkgZGVjbGFyZSBhIG1vdmUgYXNzaWdubWVudAorICAvLy8gb3BlcmF0b3IgZm9yIHRoaXMgY2xhc3MuCisgIGJvb2wgbmVlZHNPdmVybG9hZFJlc29sdXRpb25Gb3JNb3ZlQXNzaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZGF0YSgpLk5lZWRPdmVybG9hZFJlc29sdXRpb25Gb3JNb3ZlQXNzaWdubWVudDsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBoYXMgYSB1c2VyLWRlY2xhcmVkIGRlc3RydWN0b3IuCisgIC8vLworICAvLy8gV2hlbiBmYWxzZSwgYSBkZXN0cnVjdG9yIHdpbGwgYmUgaW1wbGljaXRseSBkZWNsYXJlZC4KKyAgYm9vbCBoYXNVc2VyRGVjbGFyZWREZXN0cnVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBkYXRhKCkuVXNlckRlY2xhcmVkU3BlY2lhbE1lbWJlcnMgJiBTTUZfRGVzdHJ1Y3RvcjsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBuZWVkcyBhbiBpbXBsaWNpdCBkZXN0cnVjdG9yIHRvCisgIC8vLyBiZSBsYXppbHkgZGVjbGFyZWQuCisgIGJvb2wgbmVlZHNJbXBsaWNpdERlc3RydWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuICEoZGF0YSgpLkRlY2xhcmVkU3BlY2lhbE1lbWJlcnMgJiBTTUZfRGVzdHJ1Y3Rvcik7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHdlIG5lZWQgdG8gZWFnZXJseSBkZWNsYXJlIGEgZGVzdHJ1Y3RvciBmb3IgdGhpcworICAvLy8gY2xhc3MuCisgIGJvb2wgbmVlZHNPdmVybG9hZFJlc29sdXRpb25Gb3JEZXN0cnVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBkYXRhKCkuTmVlZE92ZXJsb2FkUmVzb2x1dGlvbkZvckRlc3RydWN0b3I7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2xhc3MgZGVzY3JpYmVzIGEgbGFtYmRhIGZ1bmN0aW9uIG9iamVjdC4KKyAgYm9vbCBpc0xhbWJkYSgpIGNvbnN0IHsKKyAgICAvLyBBbiB1cGRhdGUgcmVjb3JkIGNhbid0IHR1cm4gYSBub24tbGFtYmRhIGludG8gYSBsYW1iZGEuCisgICAgYXV0byAqREQgPSBEZWZpbml0aW9uRGF0YTsKKyAgICByZXR1cm4gREQgJiYgREQtPklzTGFtYmRhOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGRlc2NyaWJlcyBhIGdlbmVyaWMgCisgIC8vLyBsYW1iZGEgZnVuY3Rpb24gb2JqZWN0IChpLmUuIGZ1bmN0aW9uIGNhbGwgb3BlcmF0b3IgaXMKKyAgLy8vIGEgdGVtcGxhdGUpLiAKKyAgYm9vbCBpc0dlbmVyaWNMYW1iZGEoKSBjb25zdDsgCisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbGFtYmRhIGNhbGwgb3BlcmF0b3Igb2YgdGhlIGNsb3N1cmUgdHlwZQorICAvLy8gaWYgdGhpcyBpcyBhIGNsb3N1cmUgdHlwZS4KKyAgQ1hYTWV0aG9kRGVjbCAqZ2V0TGFtYmRhQ2FsbE9wZXJhdG9yKCkgY29uc3Q7IAorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxhbWJkYSBzdGF0aWMgaW52b2tlciwgdGhlIGFkZHJlc3Mgb2Ygd2hpY2gKKyAgLy8vIGlzIHJldHVybmVkIGJ5IHRoZSBjb252ZXJzaW9uIG9wZXJhdG9yLCBhbmQgdGhlIGJvZHkgb2Ygd2hpY2gKKyAgLy8vIGlzIGZvcndhcmRlZCB0byB0aGUgbGFtYmRhIGNhbGwgb3BlcmF0b3IuIAorICBDWFhNZXRob2REZWNsICpnZXRMYW1iZGFTdGF0aWNJbnZva2VyKCkgY29uc3Q7IAorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGdlbmVyaWMgbGFtYmRhJ3MgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3QuCisgIC8vLyBSZXR1cm5zIG51bGwgaWYgdGhlIGNsYXNzIGRvZXMgbm90IHJlcHJlc2VudCBhIGxhbWJkYSBvciBhIGdlbmVyaWMgCisgIC8vLyBsYW1iZGEuCisgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqZ2V0R2VuZXJpY0xhbWJkYVRlbXBsYXRlUGFyYW1ldGVyTGlzdCgpIGNvbnN0OworCisgIExhbWJkYUNhcHR1cmVEZWZhdWx0IGdldExhbWJkYUNhcHR1cmVEZWZhdWx0KCkgY29uc3QgeworICAgIGFzc2VydChpc0xhbWJkYSgpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TGFtYmRhQ2FwdHVyZURlZmF1bHQ+KGdldExhbWJkYURhdGEoKS5DYXB0dXJlRGVmYXVsdCk7CisgIH0KKworICAvLy8gXGJyaWVmIEZvciBhIGNsb3N1cmUgdHlwZSwgcmV0cmlldmUgdGhlIG1hcHBpbmcgZnJvbSBjYXB0dXJlZAorICAvLy8gdmFyaWFibGVzIGFuZCBcYyB0aGlzIHRvIHRoZSBub24tc3RhdGljIGRhdGEgbWVtYmVycyB0aGF0IHN0b3JlIHRoZQorICAvLy8gdmFsdWVzIG9yIHJlZmVyZW5jZXMgb2YgdGhlIGNhcHR1cmVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDYXB0dXJlcyBXaWxsIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBtYXBwaW5nIGZyb20gY2FwdHVyZWQKKyAgLy8vIHZhcmlhYmxlcyB0byB0aGUgY29ycmVzcG9uZGluZyBmaWVsZHMuCisgIC8vLworICAvLy8gXHBhcmFtIFRoaXNDYXB0dXJlIFdpbGwgYmUgc2V0IHRvIHRoZSBmaWVsZCBkZWNsYXJhdGlvbiBmb3IgdGhlCisgIC8vLyBcYyB0aGlzIGNhcHR1cmUuCisgIC8vLworICAvLy8gXG5vdGUgTm8gZW50cmllcyB3aWxsIGJlIGFkZGVkIGZvciBpbml0LWNhcHR1cmVzLCBhcyB0aGV5IGRvIG5vdCBjYXB0dXJlCisgIC8vLyB2YXJpYWJsZXMuCisgIHZvaWQgZ2V0Q2FwdHVyZUZpZWxkcyhsbHZtOjpEZW5zZU1hcDxjb25zdCBWYXJEZWNsICosIEZpZWxkRGVjbCAqPiAmQ2FwdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlY2wgKiZUaGlzQ2FwdHVyZSkgY29uc3Q7CisKKyAgdXNpbmcgY2FwdHVyZV9jb25zdF9pdGVyYXRvciA9IGNvbnN0IExhbWJkYUNhcHR1cmUgKjsKKyAgdXNpbmcgY2FwdHVyZV9jb25zdF9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGNhcHR1cmVfY29uc3RfaXRlcmF0b3I+OworCisgIGNhcHR1cmVfY29uc3RfcmFuZ2UgY2FwdHVyZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhcHR1cmVfY29uc3RfcmFuZ2UoY2FwdHVyZXNfYmVnaW4oKSwgY2FwdHVyZXNfZW5kKCkpOworICB9CisKKyAgY2FwdHVyZV9jb25zdF9pdGVyYXRvciBjYXB0dXJlc19iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNMYW1iZGEoKSA/IGdldExhbWJkYURhdGEoKS5DYXB0dXJlcyA6IG51bGxwdHI7CisgIH0KKworICBjYXB0dXJlX2NvbnN0X2l0ZXJhdG9yIGNhcHR1cmVzX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNMYW1iZGEoKSA/IGNhcHR1cmVzX2JlZ2luKCkgKyBnZXRMYW1iZGFEYXRhKCkuTnVtQ2FwdHVyZXMKKyAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgIH0KKworICB1c2luZyBjb252ZXJzaW9uX2l0ZXJhdG9yID0gVW5yZXNvbHZlZFNldEl0ZXJhdG9yOworCisgIGNvbnZlcnNpb25faXRlcmF0b3IgY29udmVyc2lvbl9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZGF0YSgpLkNvbnZlcnNpb25zLmdldChnZXRBU1RDb250ZXh0KCkpLmJlZ2luKCk7CisgIH0KKworICBjb252ZXJzaW9uX2l0ZXJhdG9yIGNvbnZlcnNpb25fZW5kKCkgY29uc3QgeworICAgIHJldHVybiBkYXRhKCkuQ29udmVyc2lvbnMuZ2V0KGdldEFTVENvbnRleHQoKSkuZW5kKCk7CisgIH0KKworICAvLy8gUmVtb3ZlcyBhIGNvbnZlcnNpb24gZnVuY3Rpb24gZnJvbSB0aGlzIGNsYXNzLiAgVGhlIGNvbnZlcnNpb24KKyAgLy8vIGZ1bmN0aW9uIG11c3QgY3VycmVudGx5IGJlIGEgbWVtYmVyIG9mIHRoaXMgY2xhc3MuICBGdXJ0aGVybW9yZSwKKyAgLy8vIHRoaXMgY2xhc3MgbXVzdCBjdXJyZW50bHkgYmUgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGVmaW5lZC4KKyAgdm9pZCByZW1vdmVDb252ZXJzaW9uKGNvbnN0IE5hbWVkRGVjbCAqT2xkKTsKKworICAvLy8gXGJyaWVmIEdldCBhbGwgY29udmVyc2lvbiBmdW5jdGlvbnMgdmlzaWJsZSBpbiBjdXJyZW50IGNsYXNzLAorICAvLy8gaW5jbHVkaW5nIGNvbnZlcnNpb24gZnVuY3Rpb24gdGVtcGxhdGVzLgorICBsbHZtOjppdGVyYXRvcl9yYW5nZTxjb252ZXJzaW9uX2l0ZXJhdG9yPiBnZXRWaXNpYmxlQ29udmVyc2lvbkZ1bmN0aW9ucygpOworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGlzIGFuIGFnZ3JlZ2F0ZSAoQysrIFtkY2wuaW5pdC5hZ2dyXSksCisgIC8vLyB3aGljaCBpcyBhIGNsYXNzIHdpdGggbm8gdXNlci1kZWNsYXJlZCBjb25zdHJ1Y3RvcnMsIG5vIHByaXZhdGUKKyAgLy8vIG9yIHByb3RlY3RlZCBub24tc3RhdGljIGRhdGEgbWVtYmVycywgbm8gYmFzZSBjbGFzc2VzLCBhbmQgbm8gdmlydHVhbAorICAvLy8gZnVuY3Rpb25zIChDKysgW2RjbC5pbml0LmFnZ3JdcDEpLgorICBib29sIGlzQWdncmVnYXRlKCkgY29uc3QgeyByZXR1cm4gZGF0YSgpLkFnZ3JlZ2F0ZTsgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGNsYXNzIGhhcyBhbnkgaW4tY2xhc3MgaW5pdGlhbGl6ZXJzCisgIC8vLyBmb3Igbm9uLXN0YXRpYyBkYXRhIG1lbWJlcnMgKGluY2x1ZGluZyB0aG9zZSBpbiBhbm9ueW1vdXMgdW5pb25zIG9yCisgIC8vLyBzdHJ1Y3RzKS4KKyAgYm9vbCBoYXNJbkNsYXNzSW5pdGlhbGl6ZXIoKSBjb25zdCB7IHJldHVybiBkYXRhKCkuSGFzSW5DbGFzc0luaXRpYWxpemVyOyB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgY2xhc3Mgb3IgYW55IG9mIGl0cyBzdWJvYmplY3RzIGhhcyBhbnkgbWVtYmVycyBvZgorICAvLy8gcmVmZXJlbmNlIHR5cGUgd2hpY2ggd291bGQgbWFrZSB2YWx1ZS1pbml0aWFsaXphdGlvbiBpbGwtZm9ybWVkLgorICAvLy8KKyAgLy8vIFBlciBDKyswMyBbZGNsLmluaXRdcDU6CisgIC8vLyAgLSBpZiBUIGlzIGEgbm9uLXVuaW9uIGNsYXNzIHR5cGUgd2l0aG91dCBhIHVzZXItZGVjbGFyZWQgY29uc3RydWN0b3IsCisgIC8vLyAgICB0aGVuIGV2ZXJ5IG5vbi1zdGF0aWMgZGF0YSBtZW1iZXIgYW5kIGJhc2UtY2xhc3MgY29tcG9uZW50IG9mIFQgaXMKKyAgLy8vICAgIHZhbHVlLWluaXRpYWxpemVkIFsuLi5dIEEgcHJvZ3JhbSB0aGF0IGNhbGxzIGZvciBbLi4uXQorICAvLy8gICAgdmFsdWUtaW5pdGlhbGl6YXRpb24gb2YgYW4gZW50aXR5IG9mIHJlZmVyZW5jZSB0eXBlIGlzIGlsbC1mb3JtZWQuCisgIGJvb2wgaGFzVW5pbml0aWFsaXplZFJlZmVyZW5jZU1lbWJlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gIWlzVW5pb24oKSAmJiAhaGFzVXNlckRlY2xhcmVkQ29uc3RydWN0b3IoKSAmJgorICAgICAgICAgICBkYXRhKCkuSGFzVW5pbml0aWFsaXplZFJlZmVyZW5jZU1lbWJlcjsKKyAgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGNsYXNzIGlzIGEgUE9ELXR5cGUgKEMrKyBbY2xhc3NdcDQpCisgIC8vLworICAvLy8gRm9yIHB1cnBvc2VzIG9mIHRoaXMgZnVuY3Rpb24gYSBjbGFzcyBpcyBQT0QgaWYgaXQgaXMgYW4gYWdncmVnYXRlCisgIC8vLyB0aGF0IGhhcyBubyBub24tc3RhdGljIG5vbi1QT0QgZGF0YSBtZW1iZXJzLCBubyByZWZlcmVuY2UgZGF0YQorICAvLy8gbWVtYmVycywgbm8gdXNlci1kZWZpbmVkIGNvcHkgYXNzaWdubWVudCBvcGVyYXRvciBhbmQgbm8KKyAgLy8vIHVzZXItZGVmaW5lZCBkZXN0cnVjdG9yLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBDKysgVFIxIGRlZmluaXRpb24gb2YgUE9ELgorICBib29sIGlzUE9EKCkgY29uc3QgeyByZXR1cm4gZGF0YSgpLlBsYWluT2xkRGF0YTsgfQorCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGlzIGNsYXNzIGlzIEMtbGlrZSwgd2l0aG91dCBDKystc3BlY2lmaWMgZmVhdHVyZXMsIGUuZy4KKyAgLy8vIGl0IGNvbnRhaW5zIG9ubHkgcHVibGljIGZpZWxkcywgbm8gYmFzZXMsIHRhZyBraW5kIGlzIG5vdCAnY2xhc3MnLCBldGMuCisgIGJvb2wgaXNDTGlrZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhbiBlbXB0eSBjbGFzcyBpbiB0aGUgc2Vuc2Ugb2YKKyAgLy8vIChDKysxMSBbbWV0YS51bmFyeS5wcm9wXSkuCisgIC8vLworICAvLy8gVGhlIENYWFJlY29yZERlY2wgaXMgYSBjbGFzcyB0eXBlLCBidXQgbm90IGEgdW5pb24gdHlwZSwKKyAgLy8vIHdpdGggbm8gbm9uLXN0YXRpYyBkYXRhIG1lbWJlcnMgb3RoZXIgdGhhbiBiaXQtZmllbGRzIG9mIGxlbmd0aCAwLAorICAvLy8gbm8gdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zLCBubyB2aXJ0dWFsIGJhc2UgY2xhc3NlcywKKyAgLy8vIGFuZCBubyBiYXNlIGNsYXNzIEIgZm9yIHdoaWNoIGlzX2VtcHR5PEI+Ojp2YWx1ZSBpcyBmYWxzZS4KKyAgLy8vCisgIC8vLyBcbm90ZSBUaGlzIGRvZXMgTk9UIGluY2x1ZGUgYSBjaGVjayBmb3IgdW5pb24tbmVzcy4KKyAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gZGF0YSgpLkVtcHR5OyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBkaXJlY3Qgbm9uLXN0YXRpYyBkYXRhIG1lbWJlcnMuCisgIGJvb2wgaGFzRGlyZWN0RmllbGRzKCkgY29uc3QgeworICAgIGF1dG8gJkQgPSBkYXRhKCk7CisgICAgcmV0dXJuIEQuSGFzUHVibGljRmllbGRzIHx8IEQuSGFzUHJvdGVjdGVkRmllbGRzIHx8IEQuSGFzUHJpdmF0ZUZpZWxkczsKKyAgfQorCisgIC8vLyBXaGV0aGVyIHRoaXMgY2xhc3MgaXMgcG9seW1vcnBoaWMgKEMrKyBbY2xhc3MudmlydHVhbF0pLAorICAvLy8gd2hpY2ggbWVhbnMgdGhhdCB0aGUgY2xhc3MgY29udGFpbnMgb3IgaW5oZXJpdHMgYSB2aXJ0dWFsIGZ1bmN0aW9uLgorICBib29sIGlzUG9seW1vcnBoaWMoKSBjb25zdCB7IHJldHVybiBkYXRhKCkuUG9seW1vcnBoaWM7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2xhc3MgaGFzIGEgcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFRoZSBjbGFzcyBpcyBpcyBhYnN0cmFjdCBwZXIgKEMrKyBbY2xhc3MuYWJzdHJhY3RdcDIpIGlmIGl0IGRlY2xhcmVzCisgIC8vLyBhIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBvciBpbmhlcml0cyBhIHB1cmUgdmlydHVhbCBmdW5jdGlvbiB0aGF0IGlzCisgIC8vLyBub3Qgb3ZlcnJpZGRlbi4KKyAgYm9vbCBpc0Fic3RyYWN0KCkgY29uc3QgeyByZXR1cm4gZGF0YSgpLkFic3RyYWN0OyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBzdGFuZGFyZCBsYXlvdXQgcGVyIAorICAvLy8gKEMrKyBbY2xhc3NdcDcpCisgIGJvb2wgaXNTdGFuZGFyZExheW91dCgpIGNvbnN0IHsgcmV0dXJuIGRhdGEoKS5Jc1N0YW5kYXJkTGF5b3V0OyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzLCBvciBhbnkgb2YgaXRzIGNsYXNzIHN1Ym9iamVjdHMsCisgIC8vLyBjb250YWlucyBhIG11dGFibGUgZmllbGQuCisgIGJvb2wgaGFzTXV0YWJsZUZpZWxkcygpIGNvbnN0IHsgcmV0dXJuIGRhdGEoKS5IYXNNdXRhYmxlRmllbGRzOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBhbnkgdmFyaWFudCBtZW1iZXJzLgorICBib29sIGhhc1ZhcmlhbnRNZW1iZXJzKCkgY29uc3QgeyByZXR1cm4gZGF0YSgpLkhhc1ZhcmlhbnRNZW1iZXJzOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBhIHRyaXZpYWwgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICAvLy8gKEMrKzExIFtjbGFzcy5jdG9yXXA1KS4KKyAgYm9vbCBoYXNUcml2aWFsRGVmYXVsdENvbnN0cnVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBoYXNEZWZhdWx0Q29uc3RydWN0b3IoKSAmJgorICAgICAgICAgICAoZGF0YSgpLkhhc1RyaXZpYWxTcGVjaWFsTWVtYmVycyAmIFNNRl9EZWZhdWx0Q29uc3RydWN0b3IpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBhIG5vbi10cml2aWFsIGRlZmF1bHQgY29uc3RydWN0b3IKKyAgLy8vIChDKysxMSBbY2xhc3MuY3Rvcl1wNSkuCisgIGJvb2wgaGFzTm9uVHJpdmlhbERlZmF1bHRDb25zdHJ1Y3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gKGRhdGEoKS5EZWNsYXJlZE5vblRyaXZpYWxTcGVjaWFsTWVtYmVycyAmIFNNRl9EZWZhdWx0Q29uc3RydWN0b3IpIHx8CisgICAgICAgICAgIChuZWVkc0ltcGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yKCkgJiYKKyAgICAgICAgICAgICEoZGF0YSgpLkhhc1RyaXZpYWxTcGVjaWFsTWVtYmVycyAmIFNNRl9EZWZhdWx0Q29uc3RydWN0b3IpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBoYXMgYXQgbGVhc3Qgb25lIGNvbnN0ZXhwciBjb25zdHJ1Y3RvcgorICAvLy8gb3RoZXIgdGhhbiB0aGUgY29weSBvciBtb3ZlIGNvbnN0cnVjdG9ycy4KKyAgYm9vbCBoYXNDb25zdGV4cHJOb25Db3B5TW92ZUNvbnN0cnVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBkYXRhKCkuSGFzQ29uc3RleHByTm9uQ29weU1vdmVDb25zdHJ1Y3RvciB8fAorICAgICAgICAgICAobmVlZHNJbXBsaWNpdERlZmF1bHRDb25zdHJ1Y3RvcigpICYmCisgICAgICAgICAgICBkZWZhdWx0ZWREZWZhdWx0Q29uc3RydWN0b3JJc0NvbnN0ZXhwcigpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgYSBkZWZhdWx0ZWQgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgdGhpcyBjbGFzcworICAvLy8gd291bGQgYmUgY29uc3RleHByLgorICBib29sIGRlZmF1bHRlZERlZmF1bHRDb25zdHJ1Y3RvcklzQ29uc3RleHByKCkgY29uc3QgeworICAgIHJldHVybiBkYXRhKCkuRGVmYXVsdGVkRGVmYXVsdENvbnN0cnVjdG9ySXNDb25zdGV4cHIgJiYKKyAgICAgICAgICAgKCFpc1VuaW9uKCkgfHwgaGFzSW5DbGFzc0luaXRpYWxpemVyKCkgfHwgIWhhc1ZhcmlhbnRNZW1iZXJzKCkpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBhIGNvbnN0ZXhwciBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICBib29sIGhhc0NvbnN0ZXhwckRlZmF1bHRDb25zdHJ1Y3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZGF0YSgpLkhhc0NvbnN0ZXhwckRlZmF1bHRDb25zdHJ1Y3RvciB8fAorICAgICAgICAgICAobmVlZHNJbXBsaWNpdERlZmF1bHRDb25zdHJ1Y3RvcigpICYmCisgICAgICAgICAgICBkZWZhdWx0ZWREZWZhdWx0Q29uc3RydWN0b3JJc0NvbnN0ZXhwcigpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBoYXMgYSB0cml2aWFsIGNvcHkgY29uc3RydWN0b3IKKyAgLy8vIChDKysgW2NsYXNzLmNvcHldcDYsIEMrKzExIFtjbGFzcy5jb3B5XXAxMikKKyAgYm9vbCBoYXNUcml2aWFsQ29weUNvbnN0cnVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBkYXRhKCkuSGFzVHJpdmlhbFNwZWNpYWxNZW1iZXJzICYgU01GX0NvcHlDb25zdHJ1Y3RvcjsKKyAgfQorCisgIGJvb2wgaGFzVHJpdmlhbENvcHlDb25zdHJ1Y3RvckZvckNhbGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGRhdGEoKS5IYXNUcml2aWFsU3BlY2lhbE1lbWJlcnNGb3JDYWxsICYgU01GX0NvcHlDb25zdHJ1Y3RvcjsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBoYXMgYSBub24tdHJpdmlhbCBjb3B5IGNvbnN0cnVjdG9yCisgIC8vLyAoQysrIFtjbGFzcy5jb3B5XXA2LCBDKysxMSBbY2xhc3MuY29weV1wMTIpCisgIGJvb2wgaGFzTm9uVHJpdmlhbENvcHlDb25zdHJ1Y3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZGF0YSgpLkRlY2xhcmVkTm9uVHJpdmlhbFNwZWNpYWxNZW1iZXJzICYgU01GX0NvcHlDb25zdHJ1Y3RvciB8fAorICAgICAgICAgICAhaGFzVHJpdmlhbENvcHlDb25zdHJ1Y3RvcigpOworICB9CisKKyAgYm9vbCBoYXNOb25Ucml2aWFsQ29weUNvbnN0cnVjdG9yRm9yQ2FsbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGRhdGEoKS5EZWNsYXJlZE5vblRyaXZpYWxTcGVjaWFsTWVtYmVyc0ZvckNhbGwgJgorICAgICAgICAgICAgU01GX0NvcHlDb25zdHJ1Y3RvcikgfHwKKyAgICAgICAgICAgIWhhc1RyaXZpYWxDb3B5Q29uc3RydWN0b3JGb3JDYWxsKCk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2xhc3MgaGFzIGEgdHJpdmlhbCBtb3ZlIGNvbnN0cnVjdG9yCisgIC8vLyAoQysrMTEgW2NsYXNzLmNvcHldcDEyKQorICBib29sIGhhc1RyaXZpYWxNb3ZlQ29uc3RydWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc01vdmVDb25zdHJ1Y3RvcigpICYmCisgICAgICAgICAgIChkYXRhKCkuSGFzVHJpdmlhbFNwZWNpYWxNZW1iZXJzICYgU01GX01vdmVDb25zdHJ1Y3Rvcik7CisgIH0KKworICBib29sIGhhc1RyaXZpYWxNb3ZlQ29uc3RydWN0b3JGb3JDYWxsKCkgY29uc3QgeworICAgIHJldHVybiBoYXNNb3ZlQ29uc3RydWN0b3IoKSAmJgorICAgICAgICAgICAoZGF0YSgpLkhhc1RyaXZpYWxTcGVjaWFsTWVtYmVyc0ZvckNhbGwgJiBTTUZfTW92ZUNvbnN0cnVjdG9yKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBoYXMgYSBub24tdHJpdmlhbCBtb3ZlIGNvbnN0cnVjdG9yCisgIC8vLyAoQysrMTEgW2NsYXNzLmNvcHldcDEyKQorICBib29sIGhhc05vblRyaXZpYWxNb3ZlQ29uc3RydWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIChkYXRhKCkuRGVjbGFyZWROb25Ucml2aWFsU3BlY2lhbE1lbWJlcnMgJiBTTUZfTW92ZUNvbnN0cnVjdG9yKSB8fAorICAgICAgICAgICAobmVlZHNJbXBsaWNpdE1vdmVDb25zdHJ1Y3RvcigpICYmCisgICAgICAgICAgICAhKGRhdGEoKS5IYXNUcml2aWFsU3BlY2lhbE1lbWJlcnMgJiBTTUZfTW92ZUNvbnN0cnVjdG9yKSk7CisgIH0KKworICBib29sIGhhc05vblRyaXZpYWxNb3ZlQ29uc3RydWN0b3JGb3JDYWxsKCkgY29uc3QgeworICAgIHJldHVybiAoZGF0YSgpLkRlY2xhcmVkTm9uVHJpdmlhbFNwZWNpYWxNZW1iZXJzRm9yQ2FsbCAmCisgICAgICAgICAgICBTTUZfTW92ZUNvbnN0cnVjdG9yKSB8fAorICAgICAgICAgICAobmVlZHNJbXBsaWNpdE1vdmVDb25zdHJ1Y3RvcigpICYmCisgICAgICAgICAgICAhKGRhdGEoKS5IYXNUcml2aWFsU3BlY2lhbE1lbWJlcnNGb3JDYWxsICYgU01GX01vdmVDb25zdHJ1Y3RvcikpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBhIHRyaXZpYWwgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yCisgIC8vLyAoQysrIFtjbGFzcy5jb3B5XXAxMSwgQysrMTEgW2NsYXNzLmNvcHldcDI1KQorICBib29sIGhhc1RyaXZpYWxDb3B5QXNzaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZGF0YSgpLkhhc1RyaXZpYWxTcGVjaWFsTWVtYmVycyAmIFNNRl9Db3B5QXNzaWdubWVudDsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBoYXMgYSBub24tdHJpdmlhbCBjb3B5IGFzc2lnbm1lbnQKKyAgLy8vIG9wZXJhdG9yIChDKysgW2NsYXNzLmNvcHldcDExLCBDKysxMSBbY2xhc3MuY29weV1wMjUpCisgIGJvb2wgaGFzTm9uVHJpdmlhbENvcHlBc3NpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBkYXRhKCkuRGVjbGFyZWROb25Ucml2aWFsU3BlY2lhbE1lbWJlcnMgJiBTTUZfQ29weUFzc2lnbm1lbnQgfHwKKyAgICAgICAgICAgIWhhc1RyaXZpYWxDb3B5QXNzaWdubWVudCgpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBhIHRyaXZpYWwgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yCisgIC8vLyAoQysrMTEgW2NsYXNzLmNvcHldcDI1KQorICBib29sIGhhc1RyaXZpYWxNb3ZlQXNzaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzTW92ZUFzc2lnbm1lbnQoKSAmJgorICAgICAgICAgICAoZGF0YSgpLkhhc1RyaXZpYWxTcGVjaWFsTWVtYmVycyAmIFNNRl9Nb3ZlQXNzaWdubWVudCk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2xhc3MgaGFzIGEgbm9uLXRyaXZpYWwgbW92ZSBhc3NpZ25tZW50CisgIC8vLyBvcGVyYXRvciAoQysrMTEgW2NsYXNzLmNvcHldcDI1KQorICBib29sIGhhc05vblRyaXZpYWxNb3ZlQXNzaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGRhdGEoKS5EZWNsYXJlZE5vblRyaXZpYWxTcGVjaWFsTWVtYmVycyAmIFNNRl9Nb3ZlQXNzaWdubWVudCkgfHwKKyAgICAgICAgICAgKG5lZWRzSW1wbGljaXRNb3ZlQXNzaWdubWVudCgpICYmCisgICAgICAgICAgICAhKGRhdGEoKS5IYXNUcml2aWFsU3BlY2lhbE1lbWJlcnMgJiBTTUZfTW92ZUFzc2lnbm1lbnQpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBoYXMgYSB0cml2aWFsIGRlc3RydWN0b3IKKyAgLy8vIChDKysgW2NsYXNzLmR0b3JdcDMpCisgIGJvb2wgaGFzVHJpdmlhbERlc3RydWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGRhdGEoKS5IYXNUcml2aWFsU3BlY2lhbE1lbWJlcnMgJiBTTUZfRGVzdHJ1Y3RvcjsKKyAgfQorCisgIGJvb2wgaGFzVHJpdmlhbERlc3RydWN0b3JGb3JDYWxsKCkgY29uc3QgeworICAgIHJldHVybiBkYXRhKCkuSGFzVHJpdmlhbFNwZWNpYWxNZW1iZXJzRm9yQ2FsbCAmIFNNRl9EZXN0cnVjdG9yOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBhIG5vbi10cml2aWFsIGRlc3RydWN0b3IKKyAgLy8vIChDKysgW2NsYXNzLmR0b3JdcDMpCisgIGJvb2wgaGFzTm9uVHJpdmlhbERlc3RydWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuICEoZGF0YSgpLkhhc1RyaXZpYWxTcGVjaWFsTWVtYmVycyAmIFNNRl9EZXN0cnVjdG9yKTsKKyAgfQorCisgIGJvb2wgaGFzTm9uVHJpdmlhbERlc3RydWN0b3JGb3JDYWxsKCkgY29uc3QgeworICAgIHJldHVybiAhKGRhdGEoKS5IYXNUcml2aWFsU3BlY2lhbE1lbWJlcnNGb3JDYWxsICYgU01GX0Rlc3RydWN0b3IpOworICB9CisKKyAgdm9pZCBzZXRIYXNUcml2aWFsU3BlY2lhbE1lbWJlckZvckNhbGwoKSB7CisgICAgZGF0YSgpLkhhc1RyaXZpYWxTcGVjaWFsTWVtYmVyc0ZvckNhbGwgPQorICAgICAgICAoU01GX0NvcHlDb25zdHJ1Y3RvciB8IFNNRl9Nb3ZlQ29uc3RydWN0b3IgfCBTTUZfRGVzdHJ1Y3Rvcik7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIGRlY2xhcmluZyBhIGNvbnN0IHZhcmlhYmxlIHdpdGggdGhpcyB0eXBlIGlzIG9rCisgIC8vLyBwZXIgY29yZSBpc3N1ZSAyNTMuCisgIGJvb2wgYWxsb3dDb25zdERlZmF1bHRJbml0KCkgY29uc3QgeworICAgIHJldHVybiAhZGF0YSgpLkhhc1VuaW5pdGlhbGl6ZWRGaWVsZHMgfHwKKyAgICAgICAgICAgIShkYXRhKCkuSGFzRGVmYXVsdGVkRGVmYXVsdENvbnN0cnVjdG9yIHx8CisgICAgICAgICAgICAgbmVlZHNJbXBsaWNpdERlZmF1bHRDb25zdHJ1Y3RvcigpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBoYXMgYSBkZXN0cnVjdG9yIHdoaWNoIGhhcyBubworICAvLy8gc2VtYW50aWMgZWZmZWN0LgorICAvLy8KKyAgLy8vIEFueSBzdWNoIGRlc3RydWN0b3Igd2lsbCBiZSB0cml2aWFsLCBwdWJsaWMsIGRlZmF1bHRlZCBhbmQgbm90IGRlbGV0ZWQsCisgIC8vLyBhbmQgd2lsbCBjYWxsIG9ubHkgaXJyZWxldmFudCBkZXN0cnVjdG9ycy4KKyAgYm9vbCBoYXNJcnJlbGV2YW50RGVzdHJ1Y3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZGF0YSgpLkhhc0lycmVsZXZhbnREZXN0cnVjdG9yOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBhIG5vbi1saXRlcmFsIG9yLyB2b2xhdGlsZSB0eXBlCisgIC8vLyBub24tc3RhdGljIGRhdGEgbWVtYmVyIG9yIGJhc2UgY2xhc3MuCisgIGJvb2wgaGFzTm9uTGl0ZXJhbFR5cGVGaWVsZHNPckJhc2VzKCkgY29uc3QgeworICAgIHJldHVybiBkYXRhKCkuSGFzTm9uTGl0ZXJhbFR5cGVGaWVsZHNPckJhc2VzOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBhIHVzaW5nLWRlY2xhcmF0aW9uIHRoYXQgbmFtZXMKKyAgLy8vIGEgdXNlci1kZWNsYXJlZCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yLgorICBib29sIGhhc0luaGVyaXRlZENvbnN0cnVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBkYXRhKCkuSGFzSW5oZXJpdGVkQ29uc3RydWN0b3I7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2xhc3MgaGFzIGEgdXNpbmctZGVjbGFyYXRpb24gdGhhdCBuYW1lcworICAvLy8gYSBiYXNlIGNsYXNzIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIGJvb2wgaGFzSW5oZXJpdGVkQXNzaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZGF0YSgpLkhhc0luaGVyaXRlZEFzc2lnbm1lbnQ7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2xhc3MgaXMgY29uc2lkZXJlZCB0cml2aWFsbHkgY29weWFibGUgcGVyCisgIC8vLyAoQysrMTEgW2NsYXNzXXA2KS4KKyAgYm9vbCBpc1RyaXZpYWxseUNvcHlhYmxlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGlzIGNvbnNpZGVyZWQgdHJpdmlhbC4KKyAgLy8vCisgIC8vLyBDKysxMSBbY2xhc3NdcDY6CisgIC8vLyAgICAiQSB0cml2aWFsIGNsYXNzIGlzIGEgY2xhc3MgdGhhdCBoYXMgYSB0cml2aWFsIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kCisgIC8vLyAgICBpcyB0cml2aWFsbHkgY29waWFibGUuIgorICBib29sIGlzVHJpdmlhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNUcml2aWFsbHlDb3B5YWJsZSgpICYmIGhhc1RyaXZpYWxEZWZhdWx0Q29uc3RydWN0b3IoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBpcyBhIGxpdGVyYWwgdHlwZS4KKyAgLy8vCisgIC8vLyBDKysxMSBbYmFzaWMudHlwZXNdcDEwOgorICAvLy8gICBBIGNsYXNzIHR5cGUgdGhhdCBoYXMgYWxsIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgLy8vICAgICAtIGl0IGhhcyBhIHRyaXZpYWwgZGVzdHJ1Y3RvcgorICAvLy8gICAgIC0gZXZlcnkgY29uc3RydWN0b3IgY2FsbCBhbmQgZnVsbC1leHByZXNzaW9uIGluIHRoZQorICAvLy8gICAgICAgYnJhY2Utb3ItZXF1YWwtaW50aWFsaXplcnMgZm9yIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXJzIChpZiBhbnkpIGlzCisgIC8vLyAgICAgICBhIGNvbnN0YW50IGV4cHJlc3Npb24uCisgIC8vLyAgICAgLSBpdCBpcyBhbiBhZ2dyZWdhdGUgdHlwZSBvciBoYXMgYXQgbGVhc3Qgb25lIGNvbnN0ZXhwciBjb25zdHJ1Y3RvcgorICAvLy8gICAgICAgb3IgY29uc3RydWN0b3IgdGVtcGxhdGUgdGhhdCBpcyBub3QgYSBjb3B5IG9yIG1vdmUgY29uc3RydWN0b3IsIGFuZAorICAvLy8gICAgIC0gYWxsIG9mIGl0cyBub24tc3RhdGljIGRhdGEgbWVtYmVycyBhbmQgYmFzZSBjbGFzc2VzIGFyZSBvZiBsaXRlcmFsCisgIC8vLyAgICAgICB0eXBlcworICAvLy8KKyAgLy8vIFdlIHJlc29sdmUgRFIxMzYxIGJ5IGlnbm9yaW5nIHRoZSBzZWNvbmQgYnVsbGV0LiBXZSByZXNvbHZlIERSMTQ1MiBieQorICAvLy8gdHJlYXRpbmcgdHlwZXMgd2l0aCB0cml2aWFsIGRlZmF1bHQgY29uc3RydWN0b3JzIGFzIGxpdGVyYWwgdHlwZXMuCisgIC8vLworICAvLy8gT25seSBpbiBDKysxNyBhbmQgYmV5b25kLCBhcmUgbGFtYmRhcyBsaXRlcmFsIHR5cGVzLgorICBib29sIGlzTGl0ZXJhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzVHJpdmlhbERlc3RydWN0b3IoKSAmJgorICAgICAgICAgICAoIWlzTGFtYmRhKCkgfHwgZ2V0QVNUQ29udGV4dCgpLmdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTcpICYmCisgICAgICAgICAgICFoYXNOb25MaXRlcmFsVHlwZUZpZWxkc09yQmFzZXMoKSAmJgorICAgICAgICAgICAoaXNBZ2dyZWdhdGUoKSB8fCBpc0xhbWJkYSgpIHx8CisgICAgICAgICAgICBoYXNDb25zdGV4cHJOb25Db3B5TW92ZUNvbnN0cnVjdG9yKCkgfHwKKyAgICAgICAgICAgIGhhc1RyaXZpYWxEZWZhdWx0Q29uc3RydWN0b3IoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIElmIHRoaXMgcmVjb3JkIGlzIGFuIGluc3RhbnRpYXRpb24gb2YgYSBtZW1iZXIgY2xhc3MsCisgIC8vLyByZXRyaWV2ZXMgdGhlIG1lbWJlciBjbGFzcyBmcm9tIHdoaWNoIGl0IHdhcyBpbnN0YW50aWF0ZWQuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIHdpbGwgcmV0dXJuIG5vbi1udWxsIGZvciAobm9uLXRlbXBsYXRlZCkgbWVtYmVyCisgIC8vLyBjbGFzc2VzIG9mIGNsYXNzIHRlbXBsYXRlcy4gRm9yIGV4YW1wbGUsIGdpdmVuOgorICAvLy8KKyAgLy8vIFxjb2RlCisgIC8vLyB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAvLy8gc3RydWN0IFggeworICAvLy8gICBzdHJ1Y3QgQSB7IH07CisgIC8vLyB9OworICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBUaGUgZGVjbGFyYXRpb24gZm9yIFg8aW50Pjo6QSBpcyBhIChub24tdGVtcGxhdGVkKSBDWFhSZWNvcmREZWNsCisgIC8vLyB3aG9zZSBwYXJlbnQgaXMgdGhlIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIFg8aW50Pi4gRm9yCisgIC8vLyB0aGlzIGRlY2xhcmF0aW9uLCBnZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyQ2xhc3MoKSB3aWxsIHJldHVybgorICAvLy8gdGhlIENYWFJlY29yZERlY2wgWDxUPjo6QS4gV2hlbiBhIGNvbXBsZXRlIGRlZmluaXRpb24gb2YKKyAgLy8vIFg8aW50Pjo6QSBpcyByZXF1aXJlZCwgaXQgd2lsbCBiZSBpbnN0YW50aWF0ZWQgZnJvbSB0aGUKKyAgLy8vIGRlY2xhcmF0aW9uIHJldHVybmVkIGJ5IGdldEluc3RhbnRpYXRlZEZyb21NZW1iZXJDbGFzcygpLgorICBDWFhSZWNvcmREZWNsICpnZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyQ2xhc3MoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIElmIHRoaXMgY2xhc3MgaXMgYW4gaW5zdGFudGlhdGlvbiBvZiBhIG1lbWJlciBjbGFzcyBvZiBhCisgIC8vLyBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiwgcmV0cmlldmVzIHRoZSBtZW1iZXIgc3BlY2lhbGl6YXRpb24KKyAgLy8vIGluZm9ybWF0aW9uLgorICBNZW1iZXJTcGVjaWFsaXphdGlvbkluZm8gKmdldE1lbWJlclNwZWNpYWxpemF0aW9uSW5mbygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU3BlY2lmeSB0aGF0IHRoaXMgcmVjb3JkIGlzIGFuIGluc3RhbnRpYXRpb24gb2YgdGhlCisgIC8vLyBtZW1iZXIgY2xhc3MgXHAgUkQuCisgIHZvaWQgc2V0SW5zdGFudGlhdGlvbk9mTWVtYmVyQ2xhc3MoQ1hYUmVjb3JkRGVjbCAqUkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQgVFNLKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlcyB0aGUgY2xhc3MgdGVtcGxhdGUgdGhhdCBpcyBkZXNjcmliZWQgYnkgdGhpcworICAvLy8gY2xhc3MgZGVjbGFyYXRpb24uCisgIC8vLworICAvLy8gRXZlcnkgY2xhc3MgdGVtcGxhdGUgaXMgcmVwcmVzZW50ZWQgYXMgYSBDbGFzc1RlbXBsYXRlRGVjbCBhbmQgYQorICAvLy8gQ1hYUmVjb3JkRGVjbC4gVGhlIGZvcm1lciBjb250YWlucyB0ZW1wbGF0ZSBwcm9wZXJ0aWVzIChzdWNoIGFzCisgIC8vLyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3RzKSB3aGlsZSB0aGUgbGF0dGVyIGNvbnRhaW5zIHRoZQorICAvLy8gYWN0dWFsIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZW1wbGF0ZSdzCisgIC8vLyBjb250ZW50cy4gQ2xhc3NUZW1wbGF0ZURlY2w6OmdldFRlbXBsYXRlZERlY2woKSByZXRyaWV2ZXMgdGhlCisgIC8vLyBDWFhSZWNvcmREZWNsIHRoYXQgZnJvbSBhIENsYXNzVGVtcGxhdGVEZWNsLCB3aGlsZQorICAvLy8gZ2V0RGVzY3JpYmVkQ2xhc3NUZW1wbGF0ZSgpIHJldHJpZXZlcyB0aGUgQ2xhc3NUZW1wbGF0ZURlY2wgZnJvbQorICAvLy8gYSBDWFhSZWNvcmREZWNsLgorICBDbGFzc1RlbXBsYXRlRGVjbCAqZ2V0RGVzY3JpYmVkQ2xhc3NUZW1wbGF0ZSgpIGNvbnN0OworCisgIHZvaWQgc2V0RGVzY3JpYmVkQ2xhc3NUZW1wbGF0ZShDbGFzc1RlbXBsYXRlRGVjbCAqVGVtcGxhdGUpOworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBwYXJ0aWN1bGFyIGNsYXNzIGlzIGEgc3BlY2lhbGl6YXRpb24gb3IKKyAgLy8vIGluc3RhbnRpYXRpb24gb2YgYSBjbGFzcyB0ZW1wbGF0ZSBvciBtZW1iZXIgY2xhc3Mgb2YgYSBjbGFzcyB0ZW1wbGF0ZSwKKyAgLy8vIGFuZCBob3cgaXQgd2FzIGluc3RhbnRpYXRlZCBvciBzcGVjaWFsaXplZC4KKyAgVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQgZ2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFNldCB0aGUga2luZCBvZiBzcGVjaWFsaXphdGlvbiBvciB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIHRoaXMgaXMuCisgIHZvaWQgc2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQgVFNLKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSByZWNvcmQgZGVjbGFyYXRpb24gZnJvbSB3aGljaCB0aGlzIHJlY29yZCBjb3VsZCBiZQorICAvLy8gaW5zdGFudGlhdGVkLiBSZXR1cm5zIG51bGwgaWYgdGhpcyBjbGFzcyBpcyBub3QgYSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uLgorICBjb25zdCBDWFhSZWNvcmREZWNsICpnZXRUZW1wbGF0ZUluc3RhbnRpYXRpb25QYXR0ZXJuKCkgY29uc3Q7CisKKyAgQ1hYUmVjb3JkRGVjbCAqZ2V0VGVtcGxhdGVJbnN0YW50aWF0aW9uUGF0dGVybigpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxDWFhSZWNvcmREZWNsICo+KGNvbnN0X2Nhc3Q8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqPih0aGlzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0VGVtcGxhdGVJbnN0YW50aWF0aW9uUGF0dGVybigpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZGVzdHJ1Y3RvciBkZWNsIGZvciB0aGlzIGNsYXNzLgorICBDWFhEZXN0cnVjdG9yRGVjbCAqZ2V0RGVzdHJ1Y3RvcigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBjbGFzcyBkZXN0cnVjdG9yLCBvciBhbnkgaW1wbGljaXRseSBpbnZva2VkCisgIC8vLyBkZXN0cnVjdG9ycyBhcmUgbWFya2VkIG5vcmV0dXJuLgorICBib29sIGlzQW55RGVzdHJ1Y3Rvck5vUmV0dXJuKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJZiB0aGUgY2xhc3MgaXMgYSBsb2NhbCBjbGFzcyBbY2xhc3MubG9jYWxdLCByZXR1cm5zCisgIC8vLyB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgorICBjb25zdCBGdW5jdGlvbkRlY2wgKmlzTG9jYWxDbGFzcygpIGNvbnN0IHsKKyAgICBpZiAoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQgPSBkeW5fY2FzdDxDWFhSZWNvcmREZWNsPihnZXREZWNsQ29udGV4dCgpKSkKKyAgICAgIHJldHVybiBSRC0+aXNMb2NhbENsYXNzKCk7CisKKyAgICByZXR1cm4gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPihnZXREZWNsQ29udGV4dCgpKTsKKyAgfQorCisgIEZ1bmN0aW9uRGVjbCAqaXNMb2NhbENsYXNzKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEZ1bmN0aW9uRGVjbCo+KAorICAgICAgICBjb25zdF9jYXN0PGNvbnN0IENYWFJlY29yZERlY2wqPih0aGlzKS0+aXNMb2NhbENsYXNzKCkpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGRlcGVuZGVudCBjbGFzcyBpcyBhIGN1cnJlbnQgaW5zdGFudGlhdGlvbiwKKyAgLy8vIHdoZW4gdmlld2VkIGZyb20gd2l0aGluIHRoZSBnaXZlbiBjb250ZXh0LgorICBib29sIGlzQ3VycmVudEluc3RhbnRpYXRpb24oY29uc3QgRGVjbENvbnRleHQgKkN1ckNvbnRleHQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBpcyBkZXJpdmVkIGZyb20gdGhlIGNsYXNzIFxwIEJhc2UuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIG9ubHkgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgY2xhc3MgaXMgZGVyaXZlZCBmcm9tIFxwIEJhc2UsCisgIC8vLyBidXQgZG9lcyBub3QgYWNjb3VudCBmb3IgZmFjdG9ycyB0aGF0IG1heSBtYWtlIGEgRGVyaXZlZCAtPiBCYXNlIGNsYXNzCisgIC8vLyBpbGwtZm9ybWVkLCBzdWNoIGFzIHByaXZhdGUvcHJvdGVjdGVkIGluaGVyaXRhbmNlIG9yIG11bHRpcGxlLCBhbWJpZ3VvdXMKKyAgLy8vIGJhc2UgY2xhc3Mgc3Vib2JqZWN0cy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQmFzZSB0aGUgYmFzZSBjbGFzcyB3ZSBhcmUgc2VhcmNoaW5nIGZvci4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoaXMgY2xhc3MgaXMgZGVyaXZlZCBmcm9tIEJhc2UsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBpc0Rlcml2ZWRGcm9tKGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2UpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBpcyBkZXJpdmVkIGZyb20gdGhlIHR5cGUgXHAgQmFzZS4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgb25seSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBjbGFzcyBpcyBkZXJpdmVkIGZyb20gXHAgQmFzZSwKKyAgLy8vIGJ1dCBkb2VzIG5vdCBhY2NvdW50IGZvciBmYWN0b3JzIHRoYXQgbWF5IG1ha2UgYSBEZXJpdmVkIC0+IEJhc2UgY2xhc3MKKyAgLy8vIGlsbC1mb3JtZWQsIHN1Y2ggYXMgcHJpdmF0ZS9wcm90ZWN0ZWQgaW5oZXJpdGFuY2Ugb3IgbXVsdGlwbGUsIGFtYmlndW91cworICAvLy8gYmFzZSBjbGFzcyBzdWJvYmplY3RzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBCYXNlIHRoZSBiYXNlIGNsYXNzIHdlIGFyZSBzZWFyY2hpbmcgZm9yLgorICAvLy8KKyAgLy8vIFxwYXJhbSBQYXRocyB3aWxsIGNvbnRhaW4gdGhlIHBhdGhzIHRha2VuIGZyb20gdGhlIGN1cnJlbnQgY2xhc3MgdG8gdGhlCisgIC8vLyBnaXZlbiBccCBCYXNlIGNsYXNzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhpcyBjbGFzcyBpcyBkZXJpdmVkIGZyb20gXHAgQmFzZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAvLy8KKyAgLy8vIFx0b2RvIGFkZCBhIHNlcGFyYXRlIHBhcmFtZXRlciB0byBjb25maWd1cmUgSXNEZXJpdmVkRnJvbSwgcmF0aGVyIHRoYW4KKyAgLy8vIHRhbmdsaW5nIGlucHV0IGFuZCBvdXRwdXQgaW4gXHAgUGF0aHMKKyAgYm9vbCBpc0Rlcml2ZWRGcm9tKGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2UsIENYWEJhc2VQYXRocyAmUGF0aHMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBpcyB2aXJ0dWFsbHkgZGVyaXZlZCBmcm9tCisgIC8vLyB0aGUgY2xhc3MgXHAgQmFzZS4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgb25seSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBjbGFzcyBpcyB2aXJ0dWFsbHkKKyAgLy8vIGRlcml2ZWQgZnJvbSBccCBCYXNlLCBidXQgZG9lcyBub3QgYWNjb3VudCBmb3IgZmFjdG9ycyB0aGF0IG1heQorICAvLy8gbWFrZSBhIERlcml2ZWQgLT4gQmFzZSBjbGFzcyBpbGwtZm9ybWVkLCBzdWNoIGFzCisgIC8vLyBwcml2YXRlL3Byb3RlY3RlZCBpbmhlcml0YW5jZSBvciBtdWx0aXBsZSwgYW1iaWd1b3VzIGJhc2UgY2xhc3MKKyAgLy8vIHN1Ym9iamVjdHMuCisgIC8vLworICAvLy8gXHBhcmFtIEJhc2UgdGhlIGJhc2UgY2xhc3Mgd2UgYXJlIHNlYXJjaGluZyBmb3IuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGlzIGNsYXNzIGlzIHZpcnR1YWxseSBkZXJpdmVkIGZyb20gQmFzZSwKKyAgLy8vIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBpc1ZpcnR1YWxseURlcml2ZWRGcm9tKGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2UpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBpcyBwcm92YWJseSBub3QgZGVyaXZlZCBmcm9tCisgIC8vLyB0aGUgdHlwZSBccCBCYXNlLgorICBib29sIGlzUHJvdmFibHlOb3REZXJpdmVkRnJvbShjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEZ1bmN0aW9uIHR5cGUgdXNlZCBieSBmb3JhbGxCYXNlcygpIGFzIGEgY2FsbGJhY2suCisgIC8vLworICAvLy8gXHBhcmFtIEJhc2VEZWZpbml0aW9uIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBiYXNlIGNsYXNzCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGlzIGJhc2UgbWF0Y2hlZCB0aGUgc2VhcmNoIGNyaXRlcmlhCisgIHVzaW5nIEZvcmFsbEJhc2VzQ2FsbGJhY2sgPQorICAgICAgbGx2bTo6ZnVuY3Rpb25fcmVmPGJvb2woY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlZmluaXRpb24pPjsKKworICAvLy8gXGJyaWVmIERldGVybWluZXMgaWYgdGhlIGdpdmVuIGNhbGxiYWNrIGhvbGRzIGZvciBhbGwgdGhlIGRpcmVjdAorICAvLy8gb3IgaW5kaXJlY3QgYmFzZSBjbGFzc2VzIG9mIHRoaXMgdHlwZS4KKyAgLy8vCisgIC8vLyBUaGUgY2xhc3MgaXRzZWxmIGRvZXMgbm90IGNvdW50IGFzIGEgYmFzZSBjbGFzcy4gIFRoaXMgcm91dGluZQorICAvLy8gcmV0dXJucyBmYWxzZSBpZiB0aGUgY2xhc3MgaGFzIG5vbi1jb21wdXRhYmxlIGJhc2UgY2xhc3Nlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQmFzZU1hdGNoZXMgQ2FsbGJhY2sgaW52b2tlZCBmb3IgZWFjaCAoZGlyZWN0IG9yIGluZGlyZWN0KSBiYXNlCisgIC8vLyBjbGFzcyBvZiB0aGlzIHR5cGUsIG9yIGlmIFxwIEFsbG93U2hvcnRDaXJjdWl0IGlzIHRydWUgdGhlbiB1bnRpbCBhIGNhbGwKKyAgLy8vIHJldHVybnMgZmFsc2UuCisgIC8vLworICAvLy8gXHBhcmFtIEFsbG93U2hvcnRDaXJjdWl0IGlmIGZhbHNlLCBmb3JjZXMgdGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZAorICAvLy8gZm9yIGV2ZXJ5IGJhc2UgY2xhc3MsIGV2ZW4gaWYgYSBkZXBlbmRlbnQgb3Igbm9uLW1hdGNoaW5nIGJhc2Ugd2FzCisgIC8vLyBmb3VuZC4KKyAgYm9vbCBmb3JhbGxCYXNlcyhGb3JhbGxCYXNlc0NhbGxiYWNrIEJhc2VNYXRjaGVzLAorICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dTaG9ydENpcmN1aXQgPSB0cnVlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEZ1bmN0aW9uIHR5cGUgdXNlZCBieSBsb29rdXBJbkJhc2VzKCkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYQorICAvLy8gc3BlY2lmaWMgYmFzZSBjbGFzcyBzdWJvYmplY3QgbWF0Y2hlcyB0aGUgbG9va3VwIGNyaXRlcmlhLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTcGVjaWZpZXIgdGhlIGJhc2UtY2xhc3Mgc3BlY2lmaWVyIHRoYXQgZGVzY3JpYmVzIHRoZSBpbmhlcml0YW5jZQorICAvLy8gZnJvbSB0aGUgYmFzZSBjbGFzcyB3ZSBhcmUgdHJ5aW5nIHRvIG1hdGNoLgorICAvLy8KKyAgLy8vIFxwYXJhbSBQYXRoIHRoZSBjdXJyZW50IHBhdGgsIGZyb20gdGhlIG1vc3QtZGVyaXZlZCBjbGFzcyBkb3duIHRvIHRoZQorICAvLy8gYmFzZSBuYW1lZCBieSB0aGUgXHAgU3BlY2lmaWVyLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhpcyBiYXNlIG1hdGNoZWQgdGhlIHNlYXJjaCBjcml0ZXJpYSwgZmFsc2Ugb3RoZXJ3aXNlLgorICB1c2luZyBCYXNlTWF0Y2hlc0NhbGxiYWNrID0KKyAgICAgIGxsdm06OmZ1bmN0aW9uX3JlZjxib29sKGNvbnN0IENYWEJhc2VTcGVjaWZpZXIgKlNwZWNpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWEJhc2VQYXRoICZQYXRoKT47CisKKyAgLy8vIFxicmllZiBMb29rIGZvciBlbnRpdGllcyB3aXRoaW4gdGhlIGJhc2UgY2xhc3NlcyBvZiB0aGlzIEMrKyBjbGFzcywKKyAgLy8vIHRyYW5zaXRpdmVseSBzZWFyY2hpbmcgYWxsIGJhc2UgY2xhc3Mgc3Vib2JqZWN0cy4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgdXNlcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gXHAgQmFzZU1hdGNoZXMgdG8gZmluZCBiYXNlCisgIC8vLyBjbGFzc2VzIG1lZXRpbmcgc29tZSBzZWFyY2ggY3JpdGVyaWEsIHdhbGtpbmcgYWxsIGJhc2UgY2xhc3Mgc3Vib2JqZWN0cworICAvLy8gYW5kIHBvcHVsYXRpbmcgdGhlIGdpdmVuIFxwIFBhdGhzIHN0cnVjdHVyZSB3aXRoIHRoZSBwYXRocyB0aHJvdWdoIHRoZQorICAvLy8gaW5oZXJpdGFuY2UgaGllcmFyY2h5IHRoYXQgcmVzdWx0ZWQgaW4gYSBtYXRjaC4gT24gYSBzdWNjZXNzZnVsIHNlYXJjaCwKKyAgLy8vIHRoZSBccCBQYXRocyBzdHJ1Y3R1cmUgY2FuIGJlIHF1ZXJpZWQgdG8gcmV0cmlldmUgdGhlIG1hdGNoaW5nIHBhdGhzIGFuZAorICAvLy8gdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIHdlcmUgYW55IGFtYmlndWl0aWVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBCYXNlTWF0Y2hlcyBjYWxsYmFjayBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4KKyAgLy8vIGJhc2UgbWF0Y2hlcyB0aGUgdXNlci1kZWZpbmVkIHNlYXJjaCBjcml0ZXJpYS4KKyAgLy8vCisgIC8vLyBccGFyYW0gUGF0aHMgdXNlZCB0byByZWNvcmQgdGhlIHBhdGhzIGZyb20gdGhpcyBjbGFzcyB0byBpdHMgYmFzZSBjbGFzcworICAvLy8gc3Vib2JqZWN0cyB0aGF0IG1hdGNoIHRoZSBzZWFyY2ggY3JpdGVyaWEuCisgIC8vLworICAvLy8gXHBhcmFtIExvb2t1cEluRGVwZW5kZW50IGNhbiBiZSBzZXQgdG8gdHJ1ZSB0byBleHRlbmQgdGhlIHNlYXJjaCB0bworICAvLy8gZGVwZW5kZW50IGJhc2UgY2xhc3Nlcy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZXJlIGV4aXN0cyBhbnkgcGF0aCBmcm9tIHRoaXMgY2xhc3MgdG8gYSBiYXNlIGNsYXNzCisgIC8vLyBzdWJvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBzZWFyY2ggY3JpdGVyaWEuCisgIGJvb2wgbG9va3VwSW5CYXNlcyhCYXNlTWF0Y2hlc0NhbGxiYWNrIEJhc2VNYXRjaGVzLCBDWFhCYXNlUGF0aHMgJlBhdGhzLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBMb29rdXBJbkRlcGVuZGVudCA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEJhc2UtY2xhc3MgbG9va3VwIGNhbGxiYWNrIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbgorICAvLy8gYmFzZSBjbGFzcyBzcGVjaWZpZXIgcmVmZXJzIHRvIGEgc3BlY2lmaWMgY2xhc3MgZGVjbGFyYXRpb24uCisgIC8vLworICAvLy8gVGhpcyBjYWxsYmFjayBjYW4gYmUgdXNlZCB3aXRoIFxjIGxvb2t1cEluQmFzZXMoKSB0byBkZXRlcm1pbmUgd2hldGhlcgorICAvLy8gYSBnaXZlbiBkZXJpdmVkIGNsYXNzIGhhcyBpcyBhIGJhc2UgY2xhc3Mgc3Vib2JqZWN0IG9mIGEgcGFydGljdWxhciB0eXBlLgorICAvLy8gVGhlIGJhc2UgcmVjb3JkIHBvaW50ZXIgc2hvdWxkIHJlZmVyIHRvIHRoZSBjYW5vbmljYWwgQ1hYUmVjb3JkRGVjbCBvZiB0aGUKKyAgLy8vIGJhc2UgY2xhc3MgdGhhdCB3ZSBhcmUgc2VhcmNoaW5nIGZvci4KKyAgc3RhdGljIGJvb2wgRmluZEJhc2VDbGFzcyhjb25zdCBDWFhCYXNlU3BlY2lmaWVyICpTcGVjaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQmFzZVBhdGggJlBhdGgsIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VSZWNvcmQpOworCisgIC8vLyBcYnJpZWYgQmFzZS1jbGFzcyBsb29rdXAgY2FsbGJhY2sgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCisgIC8vLyBnaXZlbiBiYXNlIGNsYXNzIHNwZWNpZmllciByZWZlcnMgdG8gYSBzcGVjaWZpYyBjbGFzcworICAvLy8gZGVjbGFyYXRpb24gYW5kIGRlc2NyaWJlcyB2aXJ0dWFsIGRlcml2YXRpb24uCisgIC8vLworICAvLy8gVGhpcyBjYWxsYmFjayBjYW4gYmUgdXNlZCB3aXRoIFxjIGxvb2t1cEluQmFzZXMoKSB0byBkZXRlcm1pbmUKKyAgLy8vIHdoZXRoZXIgYSBnaXZlbiBkZXJpdmVkIGNsYXNzIGhhcyBpcyBhIHZpcnR1YWwgYmFzZSBjbGFzcworICAvLy8gc3Vib2JqZWN0IG9mIGEgcGFydGljdWxhciB0eXBlLiAgVGhlIGJhc2UgcmVjb3JkIHBvaW50ZXIgc2hvdWxkCisgIC8vLyByZWZlciB0byB0aGUgY2Fub25pY2FsIENYWFJlY29yZERlY2wgb2YgdGhlIGJhc2UgY2xhc3MgdGhhdCB3ZQorICAvLy8gYXJlIHNlYXJjaGluZyBmb3IuCisgIHN0YXRpYyBib29sIEZpbmRWaXJ0dWFsQmFzZUNsYXNzKGNvbnN0IENYWEJhc2VTcGVjaWZpZXIgKlNwZWNpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQmFzZVBhdGggJlBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VSZWNvcmQpOworCisgIC8vLyBcYnJpZWYgQmFzZS1jbGFzcyBsb29rdXAgY2FsbGJhY2sgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlcmUgZXhpc3RzCisgIC8vLyBhIHRhZyB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAvLy8KKyAgLy8vIFRoaXMgY2FsbGJhY2sgY2FuIGJlIHVzZWQgd2l0aCBcYyBsb29rdXBJbkJhc2VzKCkgdG8gZmluZCB0YWcgbWVtYmVycworICAvLy8gb2YgdGhlIGdpdmVuIG5hbWUgd2l0aGluIGEgQysrIGNsYXNzIGhpZXJhcmNoeS4KKyAgc3RhdGljIGJvb2wgRmluZFRhZ01lbWJlcihjb25zdCBDWFhCYXNlU3BlY2lmaWVyICpTcGVjaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQmFzZVBhdGggJlBhdGgsIERlY2xhcmF0aW9uTmFtZSBOYW1lKTsKKworICAvLy8gXGJyaWVmIEJhc2UtY2xhc3MgbG9va3VwIGNhbGxiYWNrIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZXJlIGV4aXN0cworICAvLy8gYSBtZW1iZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgLy8vCisgIC8vLyBUaGlzIGNhbGxiYWNrIGNhbiBiZSB1c2VkIHdpdGggXGMgbG9va3VwSW5CYXNlcygpIHRvIGZpbmQgbWVtYmVycworICAvLy8gb2YgdGhlIGdpdmVuIG5hbWUgd2l0aGluIGEgQysrIGNsYXNzIGhpZXJhcmNoeS4KKyAgc3RhdGljIGJvb2wgRmluZE9yZGluYXJ5TWVtYmVyKGNvbnN0IENYWEJhc2VTcGVjaWZpZXIgKlNwZWNpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWEJhc2VQYXRoICZQYXRoLCBEZWNsYXJhdGlvbk5hbWUgTmFtZSk7CisKKyAgLy8vIFxicmllZiBCYXNlLWNsYXNzIGxvb2t1cCBjYWxsYmFjayB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGVyZSBleGlzdHMKKyAgLy8vIGEgbWVtYmVyIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgIC8vLworICAvLy8gVGhpcyBjYWxsYmFjayBjYW4gYmUgdXNlZCB3aXRoIFxjIGxvb2t1cEluQmFzZXMoKSB0byBmaW5kIG1lbWJlcnMKKyAgLy8vIG9mIHRoZSBnaXZlbiBuYW1lIHdpdGhpbiBhIEMrKyBjbGFzcyBoaWVyYXJjaHksIGluY2x1ZGluZyBkZXBlbmRlbnQKKyAgLy8vIGNsYXNzZXMuCisgIHN0YXRpYyBib29sCisgIEZpbmRPcmRpbmFyeU1lbWJlckluRGVwZW5kZW50Q2xhc3Nlcyhjb25zdCBDWFhCYXNlU3BlY2lmaWVyICpTcGVjaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhCYXNlUGF0aCAmUGF0aCwgRGVjbGFyYXRpb25OYW1lIE5hbWUpOworCisgIC8vLyBcYnJpZWYgQmFzZS1jbGFzcyBsb29rdXAgY2FsbGJhY2sgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlcmUgZXhpc3RzCisgIC8vLyBhbiBPcGVuTVAgZGVjbGFyZSByZWR1Y3Rpb24gbWVtYmVyIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgIC8vLworICAvLy8gVGhpcyBjYWxsYmFjayBjYW4gYmUgdXNlZCB3aXRoIFxjIGxvb2t1cEluQmFzZXMoKSB0byBmaW5kIG1lbWJlcnMKKyAgLy8vIG9mIHRoZSBnaXZlbiBuYW1lIHdpdGhpbiBhIEMrKyBjbGFzcyBoaWVyYXJjaHkuCisgIHN0YXRpYyBib29sIEZpbmRPTVBSZWR1Y3Rpb25NZW1iZXIoY29uc3QgQ1hYQmFzZVNwZWNpZmllciAqU3BlY2lmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWEJhc2VQYXRoICZQYXRoLCBEZWNsYXJhdGlvbk5hbWUgTmFtZSk7CisKKyAgLy8vIFxicmllZiBCYXNlLWNsYXNzIGxvb2t1cCBjYWxsYmFjayB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGVyZSBleGlzdHMKKyAgLy8vIGEgbWVtYmVyIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIG5lc3RlZC1uYW1lLXNwZWNpZmllci4KKyAgLy8vCisgIC8vLyBUaGlzIGNhbGxiYWNrIGNhbiBiZSB1c2VkIHdpdGggXGMgbG9va3VwSW5CYXNlcygpIHRvIGZpbmQgbWVtYmVycyBvZgorICAvLy8gdGhlIGdpdmVuIG5hbWUgd2l0aGluIGEgQysrIGNsYXNzIGhpZXJhcmNoeSB0aGF0IGNhbiBvY2N1ciB3aXRoaW4KKyAgLy8vIG5lc3RlZC1uYW1lLXNwZWNpZmllcnMuCisgIHN0YXRpYyBib29sIEZpbmROZXN0ZWROYW1lU3BlY2lmaWVyTWVtYmVyKGNvbnN0IENYWEJhc2VTcGVjaWZpZXIgKlNwZWNpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQmFzZVBhdGggJlBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBOYW1lKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBmaW5hbCBvdmVycmlkZXJzIGZvciBlYWNoIHZpcnR1YWwgbWVtYmVyCisgIC8vLyBmdW5jdGlvbiBpbiB0aGUgY2xhc3MgaGllcmFyY2h5IHdoZXJlIHRoaXMgY2xhc3MgaXMgdGhlCisgIC8vLyBtb3N0LWRlcml2ZWQgY2xhc3MgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4KKyAgdm9pZCBnZXRGaW5hbE92ZXJyaWRlcnMoQ1hYRmluYWxPdmVycmlkZXJNYXAgJkZpbmFPdmVycmlkZXJzKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgaW5kaXJlY3QgcHJpbWFyeSBiYXNlcyBmb3IgdGhpcyBjbGFzcy4KKyAgdm9pZCBnZXRJbmRpcmVjdFByaW1hcnlCYXNlcyhDWFhJbmRpcmVjdFByaW1hcnlCYXNlU2V0JiBCYXNlcykgY29uc3Q7CisKKyAgLy8vIFBlcmZvcm1zIGFuIGltcHJlY2lzZSBsb29rdXAgb2YgYSBkZXBlbmRlbnQgbmFtZSBpbiB0aGlzIGNsYXNzLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZm9sbG93IHN0cmljdCBzZW1hbnRpYyBydWxlcyBhbmQgc2hvdWxkIGJlIHVzZWQKKyAgLy8vIG9ubHkgd2hlbiBsb29rdXAgcnVsZXMgY2FuIGJlIHJlbGF4ZWQsIGUuZy4gaW5kZXhpbmcuCisgIHN0ZDo6dmVjdG9yPGNvbnN0IE5hbWVkRGVjbCAqPgorICBsb29rdXBEZXBlbmRlbnROYW1lKGNvbnN0IERlY2xhcmF0aW9uTmFtZSAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpmdW5jdGlvbl9yZWY8Ym9vbChjb25zdCBOYW1lZERlY2wgKk5EKT4gRmlsdGVyKTsKKworICAvLy8gUmVuZGVycyBhbmQgZGlzcGxheXMgYW4gaW5oZXJpdGFuY2UgZGlhZ3JhbQorICAvLy8gZm9yIHRoaXMgQysrIGNsYXNzIGFuZCBhbGwgb2YgaXRzIGJhc2UgY2xhc3NlcyAodHJhbnNpdGl2ZWx5KSB1c2luZworICAvLy8gR3JhcGhWaXouCisgIHZvaWQgdmlld0luaGVyaXRhbmNlKEFTVENvbnRleHQmIENvbnRleHQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQ2FsY3VsYXRlcyB0aGUgYWNjZXNzIG9mIGEgZGVjbCB0aGF0IGlzIHJlYWNoZWQKKyAgLy8vIGFsb25nIGEgcGF0aC4KKyAgc3RhdGljIEFjY2Vzc1NwZWNpZmllciBNZXJnZUFjY2VzcyhBY2Nlc3NTcGVjaWZpZXIgUGF0aEFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NTcGVjaWZpZXIgRGVjbEFjY2VzcykgeworICAgIGFzc2VydChEZWNsQWNjZXNzICE9IEFTX25vbmUpOworICAgIGlmIChEZWNsQWNjZXNzID09IEFTX3ByaXZhdGUpIHJldHVybiBBU19ub25lOworICAgIHJldHVybiAoUGF0aEFjY2VzcyA+IERlY2xBY2Nlc3MgPyBQYXRoQWNjZXNzIDogRGVjbEFjY2Vzcyk7CisgIH0KKworICAvLy8gXGJyaWVmIEluZGljYXRlcyB0aGF0IHRoZSBkZWNsYXJhdGlvbiBvZiBhIGRlZmF1bHRlZCBvciBkZWxldGVkIHNwZWNpYWwKKyAgLy8vIG1lbWJlciBmdW5jdGlvbiBpcyBub3cgY29tcGxldGUuCisgIHZvaWQgZmluaXNoZWREZWZhdWx0ZWRPckRlbGV0ZWRNZW1iZXIoQ1hYTWV0aG9kRGVjbCAqTUQpOworCisgIHZvaWQgc2V0VHJpdmlhbEZvckNhbGxGbGFncyhDWFhNZXRob2REZWNsICpNRCk7CisKKyAgLy8vIFxicmllZiBJbmRpY2F0ZXMgdGhhdCB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIGNsYXNzIGlzIG5vdyBjb21wbGV0ZS4KKyAgdm9pZCBjb21wbGV0ZURlZmluaXRpb24oKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIEluZGljYXRlcyB0aGF0IHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgY2xhc3MgaXMgbm93IGNvbXBsZXRlLAorICAvLy8gYW5kIHByb3ZpZGVzIGEgZmluYWwgb3ZlcnJpZGVyIG1hcCB0byBoZWxwIGRldGVybWluZQorICAvLy8KKyAgLy8vIFxwYXJhbSBGaW5hbE92ZXJyaWRlcnMgVGhlIGZpbmFsIG92ZXJyaWRlciBtYXAgZm9yIHRoaXMgY2xhc3MsIHdoaWNoIGNhbgorICAvLy8gYmUgcHJvdmlkZWQgYXMgYW4gb3B0aW1pemF0aW9uIGZvciBhYnN0cmFjdC1jbGFzcyBjaGVja2luZy4gSWYgTlVMTCwKKyAgLy8vIGZpbmFsIG92ZXJyaWRlcnMgd2lsbCBiZSBjb21wdXRlZCBpZiB0aGV5IGFyZSBuZWVkZWQgdG8gY29tcGxldGUgdGhlCisgIC8vLyBkZWZpbml0aW9uLgorICB2b2lkIGNvbXBsZXRlRGVmaW5pdGlvbihDWFhGaW5hbE92ZXJyaWRlck1hcCAqRmluYWxPdmVycmlkZXJzKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2xhc3MgbWF5IGVuZCB1cCBiZWluZyBhYnN0cmFjdCwgZXZlbiB0aG91Z2gKKyAgLy8vIGl0IGlzIG5vdCB5ZXQga25vd24gdG8gYmUgYWJzdHJhY3QuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGlzIGNsYXNzIGlzIG5vdCBrbm93biB0byBiZSBhYnN0cmFjdCBidXQgaGFzIGFueQorICAvLy8gYmFzZSBjbGFzc2VzIHRoYXQgYXJlIGFic3RyYWN0LiBJbiB0aGlzIGNhc2UsIFxjIGNvbXBsZXRlRGVmaW5pdGlvbigpCisgIC8vLyB3aWxsIG5lZWQgdG8gY29tcHV0ZSBmaW5hbCBvdmVycmlkZXJzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjbGFzcyBpcworICAvLy8gYWN0dWFsbHkgYWJzdHJhY3QuCisgIGJvb2wgbWF5QmVBYnN0cmFjdCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgSWYgdGhpcyBpcyB0aGUgY2xvc3VyZSB0eXBlIG9mIGEgbGFtYmRhIGV4cHJlc3Npb24sIHJldHJpZXZlIHRoZQorICAvLy8gbnVtYmVyIHRvIGJlIHVzZWQgZm9yIG5hbWUgbWFuZ2xpbmcgaW4gdGhlIEl0YW5pdW0gQysrIEFCSS4KKyAgLy8vCisgIC8vLyBaZXJvIGluZGljYXRlcyB0aGF0IHRoaXMgY2xvc3VyZSB0eXBlIGhhcyBpbnRlcm5hbCBsaW5rYWdlLCBzbyB0aGUgCisgIC8vLyBtYW5nbGluZyBudW1iZXIgZG9lcyBub3QgbWF0dGVyLCB3aGlsZSBhIG5vbi16ZXJvIHZhbHVlIGluZGljYXRlcyB3aGljaAorICAvLy8gbGFtYmRhIGV4cHJlc3Npb24gdGhpcyBpcyBpbiB0aGlzIHBhcnRpY3VsYXIgY29udGV4dC4KKyAgdW5zaWduZWQgZ2V0TGFtYmRhTWFuZ2xpbmdOdW1iZXIoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzTGFtYmRhKCkgJiYgIk5vdCBhIGxhbWJkYSBjbG9zdXJlIHR5cGUhIik7CisgICAgcmV0dXJuIGdldExhbWJkYURhdGEoKS5NYW5nbGluZ051bWJlcjsKKyAgfQorICAKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgZGVjbGFyYXRpb24gdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGNvbnRleHQgZm9yIGEgCisgIC8vLyBsYW1iZGEsIHdoZW4gdGhlIG5vcm1hbCBkZWNsYXJhdGlvbiBjb250ZXh0IGlzIG5vdCBzcGVjaWZpYyBlbm91Z2guCisgIC8vLworICAvLy8gQ2VydGFpbiBjb250ZXh0cyAoZGVmYXVsdCBhcmd1bWVudHMgb2YgaW4tY2xhc3MgZnVuY3Rpb24gcGFyYW1ldGVycyBhbmQgCisgIC8vLyB0aGUgaW5pdGlhbGl6ZXJzIG9mIGRhdGEgbWVtYmVycykgaGF2ZSBzZXBhcmF0ZSBuYW1lIG1hbmdsaW5nIHJ1bGVzIGZvcgorICAvLy8gbGFtYmRhcyB3aXRoaW4gdGhlIEl0YW5pdW0gQysrIEFCSS4gRm9yIHRoZXNlIGNhc2VzLCB0aGlzIHJvdXRpbmUgcHJvdmlkZXMKKyAgLy8vIHRoZSBkZWNsYXJhdGlvbiBpbiB3aGljaCB0aGUgbGFtYmRhIG9jY3VycywgZS5nLiwgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlciAKKyAgLy8vIG9yIHRoZSBub24tc3RhdGljIGRhdGEgbWVtYmVyLiBPdGhlcndpc2UsIGl0IHJldHVybnMgTlVMTCB0byBpbXBseSB0aGF0CisgIC8vLyB0aGUgZGVjbGFyYXRpb24gY29udGV4dCBzdWZmaWNlcy4KKyAgRGVjbCAqZ2V0TGFtYmRhQ29udGV4dERlY2woKSBjb25zdDsKKyAgCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBtYW5nbGluZyBudW1iZXIgYW5kIGNvbnRleHQgZGVjbGFyYXRpb24gZm9yIGEgbGFtYmRhCisgIC8vLyBjbGFzcy4KKyAgdm9pZCBzZXRMYW1iZGFNYW5nbGluZyh1bnNpZ25lZCBNYW5nbGluZ051bWJlciwgRGVjbCAqQ29udGV4dERlY2wpIHsKKyAgICBnZXRMYW1iZGFEYXRhKCkuTWFuZ2xpbmdOdW1iZXIgPSBNYW5nbGluZ051bWJlcjsKKyAgICBnZXRMYW1iZGFEYXRhKCkuQ29udGV4dERlY2wgPSBDb250ZXh0RGVjbDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgaW5oZXJpdGFuY2UgbW9kZWwgdXNlZCBmb3IgdGhpcyByZWNvcmQuCisgIE1TSW5oZXJpdGFuY2VBdHRyOjpTcGVsbGluZyBnZXRNU0luaGVyaXRhbmNlTW9kZWwoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIENhbGN1bGF0ZSB3aGF0IHRoZSBpbmhlcml0YW5jZSBtb2RlbCB3b3VsZCBiZSBmb3IgdGhpcyBjbGFzcy4KKyAgTVNJbmhlcml0YW5jZUF0dHI6OlNwZWxsaW5nIGNhbGN1bGF0ZUluaGVyaXRhbmNlTW9kZWwoKSBjb25zdDsKKworICAvLy8gSW4gdGhlIE1pY3Jvc29mdCBDKysgQUJJLCB1c2UgemVybyBmb3IgdGhlIGZpZWxkIG9mZnNldCBvZiBhIG51bGwgZGF0YQorICAvLy8gbWVtYmVyIHBvaW50ZXIgaWYgd2UgY2FuIGd1YXJhbnRlZSB0aGF0IHplcm8gaXMgbm90IGEgdmFsaWQgZmllbGQgb2Zmc2V0LAorICAvLy8gb3IgaWYgdGhlIG1lbWJlciBwb2ludGVyIGhhcyBtdWx0aXBsZSBmaWVsZHMuICBQb2x5bW9ycGhpYyBjbGFzc2VzIGhhdmUgYQorICAvLy8gdmZwdHIgYXQgb2Zmc2V0IHplcm8sIHNvIHdlIGNhbiB1c2UgemVybyBmb3IgbnVsbC4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZQorICAvLy8gZmllbGRzLCB3ZSBjYW4gdXNlIHplcm8gZXZlbiBpZiBpdCBpcyBhIHZhbGlkIGZpZWxkIG9mZnNldCBiZWNhdXNlCisgIC8vLyBudWxsLW5lc3MgdGVzdGluZyB3aWxsIGNoZWNrIHRoZSBvdGhlciBmaWVsZHMuCisgIGJvb2wgbnVsbEZpZWxkT2Zmc2V0SXNaZXJvKCkgY29uc3QgeworICAgIHJldHVybiAhTVNJbmhlcml0YW5jZUF0dHI6Omhhc09ubHlPbmVGaWVsZCgvKklzTWVtYmVyRnVuY3Rpb249Ki9mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TVNJbmhlcml0YW5jZU1vZGVsKCkpIHx8CisgICAgICAgICAgIChoYXNEZWZpbml0aW9uKCkgJiYgaXNQb2x5bW9ycGhpYygpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29udHJvbHMgd2hlbiB2dG9yZGlzcHMgd2lsbCBiZSBlbWl0dGVkIGlmIHRoaXMgcmVjb3JkIGlzIHVzZWQgYXMgYQorICAvLy8gdmlydHVhbCBiYXNlLgorICBNU1Z0b3JEaXNwQXR0cjo6TW9kZSBnZXRNU1Z0b3JEaXNwTW9kZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBsYW1iZGEgZXhwcmVzc2lvbiB3YXMga25vd24gdG8gYmUgZGVwZW5kZW50CisgIC8vLyBhdCB0aGUgdGltZSBpdCB3YXMgY3JlYXRlZCwgZXZlbiBpZiBpdHMgY29udGV4dCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUKKyAgLy8vIGRlcGVuZGVudC4KKyAgLy8vCisgIC8vLyBUaGlzIGZsYWcgaXMgYSB3b3JrYXJvdW5kIGZvciBhbiBpc3N1ZSB3aXRoIHBhcnNpbmcsIHdoZXJlIGRlZmF1bHQKKyAgLy8vIGFyZ3VtZW50cyBhcmUgcGFyc2VkIGJlZm9yZSB0aGVpciBlbmNsb3NpbmcgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGhhdmUKKyAgLy8vIGJlZW4gY3JlYXRlZC4gVGhpcyBtZWFucyB0aGF0IGFueSBsYW1iZGEgZXhwcmVzc2lvbnMgd2l0aGluIHRob3NlCisgIC8vLyBkZWZhdWx0IGFyZ3VtZW50cyB3aWxsIGhhdmUgYXMgdGhlaXIgRGVjbENvbnRleHQgdGhlIGNvbnRleHQgZW5jbG9zaW5nCisgIC8vLyB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24sIHdoaWNoIG1heSBiZSBub24tZGVwZW5kZW50IGV2ZW4gd2hlbiB0aGUKKyAgLy8vIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGl0c2VsZiBpcyBkZXBlbmRlbnQuIFRoaXMgZmxhZyBpbmRpY2F0ZXMgd2hlbiB3ZQorICAvLy8ga25vdyB0aGF0IHRoZSBsYW1iZGEgaXMgZGVwZW5kZW50IGRlc3BpdGUgdGhhdC4KKyAgYm9vbCBpc0RlcGVuZGVudExhbWJkYSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNMYW1iZGEoKSAmJiBnZXRMYW1iZGFEYXRhKCkuRGVwZW5kZW50OworICB9CisKKyAgVHlwZVNvdXJjZUluZm8gKmdldExhbWJkYVR5cGVJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBnZXRMYW1iZGFEYXRhKCkuTWV0aG9kVHlJbmZvOworICB9CisKKyAgLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgdHlwZSBpcyBhbiBJbnRlcmZhY2UgTGlrZSB0eXBlIGZvcgorICAvLyBfX2ludGVyZmFjZSBpbmhlcml0ZW5jZSBwdXJwb3Nlcy4KKyAgYm9vbCBpc0ludGVyZmFjZUxpa2UoKSBjb25zdDsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7CisgICAgcmV0dXJuIEsgPj0gZmlyc3RDWFhSZWNvcmQgJiYgSyA8PSBsYXN0Q1hYUmVjb3JkOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBDKysgZGVkdWN0aW9uIGd1aWRlIGRlY2xhcmF0aW9uLgorLy8vCisvLy8gXGNvZGUKKy8vLyB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQSB7IEEoKTsgQShUKTsgfTsKKy8vLyBBKCkgLT4gQTxpbnQ+OworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBJbiB0aGlzIGV4YW1wbGUsIHRoZXJlIHdpbGwgYmUgYW4gZXhwbGljaXQgZGVkdWN0aW9uIGd1aWRlIGZyb20gdGhlCisvLy8gc2Vjb25kIGxpbmUsIGFuZCBpbXBsaWNpdCBkZWR1Y3Rpb24gZ3VpZGUgdGVtcGxhdGVzIHN5bnRoZXNpemVkIGZyb20KKy8vLyB0aGUgY29uc3RydWN0b3JzIG9mIFxjIEEuCitjbGFzcyBDWFhEZWR1Y3Rpb25HdWlkZURlY2wgOiBwdWJsaWMgRnVuY3Rpb25EZWNsIHsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgQ1hYRGVkdWN0aW9uR3VpZGVEZWNsKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRXhwbGljaXQsIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwgVHlwZVNvdXJjZUluZm8gKlRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jYXRpb24pCisgICAgICA6IEZ1bmN0aW9uRGVjbChDWFhEZWR1Y3Rpb25HdWlkZSwgQywgREMsIFN0YXJ0TG9jLCBOYW1lSW5mbywgVCwgVEluZm8sCisgICAgICAgICAgICAgICAgICAgICBTQ19Ob25lLCBmYWxzZSwgZmFsc2UpIHsKKyAgICBpZiAoRW5kTG9jYXRpb24uaXNWYWxpZCgpKQorICAgICAgc2V0UmFuZ2VFbmQoRW5kTG9jYXRpb24pOworICAgIElzRXhwbGljaXRTcGVjaWZpZWQgPSBJc0V4cGxpY2l0OworICB9CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsV3JpdGVyOworCisgIHN0YXRpYyBDWFhEZWR1Y3Rpb25HdWlkZURlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgYm9vbCBJc0V4cGxpY2l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmTmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULCBUeXBlU291cmNlSW5mbyAqVEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2NhdGlvbik7CisKKyAgc3RhdGljIENYWERlZHVjdGlvbkd1aWRlRGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKKworICAvLy8gV2hldGhlciB0aGlzIGRlZHVjdGlvbiBndWlkZSBpcyBleHBsaWNpdC4KKyAgYm9vbCBpc0V4cGxpY2l0KCkgY29uc3QgeyByZXR1cm4gSXNFeHBsaWNpdFNwZWNpZmllZDsgfQorCisgIC8vLyBXaGV0aGVyIHRoaXMgZGVkdWN0aW9uIGd1aWRlIHdhcyBkZWNsYXJlZCB3aXRoIHRoZSAnZXhwbGljaXQnIHNwZWNpZmllci4KKyAgYm9vbCBpc0V4cGxpY2l0U3BlY2lmaWVkKCkgY29uc3QgeyByZXR1cm4gSXNFeHBsaWNpdFNwZWNpZmllZDsgfQorCisgIC8vLyBHZXQgdGhlIHRlbXBsYXRlIGZvciB3aGljaCB0aGlzIGd1aWRlIHBlcmZvcm1zIGRlZHVjdGlvbi4KKyAgVGVtcGxhdGVEZWNsICpnZXREZWR1Y2VkVGVtcGxhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldERlY2xOYW1lKCkuZ2V0Q1hYRGVkdWN0aW9uR3VpZGVUZW1wbGF0ZSgpOworICB9CisKKyAgdm9pZCBzZXRJc0NvcHlEZWR1Y3Rpb25DYW5kaWRhdGUoKSB7CisgICAgSXNDb3B5RGVkdWN0aW9uQ2FuZGlkYXRlID0gdHJ1ZTsKKyAgfQorCisgIGJvb2wgaXNDb3B5RGVkdWN0aW9uQ2FuZGlkYXRlKCkgY29uc3QgeyByZXR1cm4gSXNDb3B5RGVkdWN0aW9uQ2FuZGlkYXRlOyB9CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IENYWERlZHVjdGlvbkd1aWRlOyB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBzdGF0aWMgb3IgaW5zdGFuY2UgbWV0aG9kIG9mIGEgc3RydWN0L3VuaW9uL2NsYXNzLgorLy8vCisvLy8gSW4gdGhlIHRlcm1pbm9sb2d5IG9mIHRoZSBDKysgU3RhbmRhcmQsIHRoZXNlIGFyZSB0aGUgKHN0YXRpYyBhbmQKKy8vLyBub24tc3RhdGljKSBtZW1iZXIgZnVuY3Rpb25zLCB3aGV0aGVyIHZpcnR1YWwgb3Igbm90LgorY2xhc3MgQ1hYTWV0aG9kRGVjbCA6IHB1YmxpYyBGdW5jdGlvbkRlY2wgeworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgIENYWE1ldGhvZERlY2woS2luZCBESywgQVNUQ29udGV4dCAmQywgQ1hYUmVjb3JkRGVjbCAqUkQsCisgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAorICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKKyAgICAgICAgICAgICAgICBTdG9yYWdlQ2xhc3MgU0MsIGJvb2wgaXNJbmxpbmUsCisgICAgICAgICAgICAgICAgYm9vbCBpc0NvbnN0ZXhwciwgU291cmNlTG9jYXRpb24gRW5kTG9jYXRpb24pCisgICAgOiBGdW5jdGlvbkRlY2woREssIEMsIFJELCBTdGFydExvYywgTmFtZUluZm8sIFQsIFRJbmZvLAorICAgICAgICAgICAgICAgICAgIFNDLCBpc0lubGluZSwgaXNDb25zdGV4cHIpIHsKKyAgICBpZiAoRW5kTG9jYXRpb24uaXNWYWxpZCgpKQorICAgICAgc2V0UmFuZ2VFbmQoRW5kTG9jYXRpb24pOworICB9CisKK3B1YmxpYzoKKyAgc3RhdGljIENYWE1ldGhvZERlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBDWFhSZWNvcmREZWNsICpSRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZOYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULCBUeXBlU291cmNlSW5mbyAqVEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZUNsYXNzIFNDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0NvbnN0ZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2NhdGlvbik7CisKKyAgc3RhdGljIENYWE1ldGhvZERlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisKKyAgYm9vbCBpc1N0YXRpYygpIGNvbnN0OworICBib29sIGlzSW5zdGFuY2UoKSBjb25zdCB7IHJldHVybiAhaXNTdGF0aWMoKTsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG9wZXJhdG9yIGlzIGltcGxpY2l0bHkgc3RhdGljIGluIGEgcmVjb3JkCisgIC8vLyBjb250ZXh0LgorICBzdGF0aWMgYm9vbCBpc1N0YXRpY092ZXJsb2FkZWRPcGVyYXRvcihPdmVybG9hZGVkT3BlcmF0b3JLaW5kIE9PSykgeworICAgIC8vIFtjbGFzcy5mcmVlXXAxOgorICAgIC8vIEFueSBhbGxvY2F0aW9uIGZ1bmN0aW9uIGZvciBhIGNsYXNzIFQgaXMgYSBzdGF0aWMgbWVtYmVyCisgICAgLy8gKGV2ZW4gaWYgbm90IGV4cGxpY2l0bHkgZGVjbGFyZWQgc3RhdGljKS4KKyAgICAvLyBbY2xhc3MuZnJlZV1wNiBBbnkgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uIGZvciBhIGNsYXNzIFggaXMgYSBzdGF0aWMgbWVtYmVyCisgICAgLy8gKGV2ZW4gaWYgbm90IGV4cGxpY2l0bHkgZGVjbGFyZWQgc3RhdGljKS4KKyAgICByZXR1cm4gT09LID09IE9PX05ldyB8fCBPT0sgPT0gT09fQXJyYXlfTmV3IHx8IE9PSyA9PSBPT19EZWxldGUgfHwKKyAgICAgICAgICAgT09LID09IE9PX0FycmF5X0RlbGV0ZTsKKyAgfQorCisgIGJvb2wgaXNDb25zdCgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uVHlwZT4oKS0+aXNDb25zdCgpOyB9CisgIGJvb2wgaXNWb2xhdGlsZSgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uVHlwZT4oKS0+aXNWb2xhdGlsZSgpOyB9CisKKyAgYm9vbCBpc1ZpcnR1YWwoKSBjb25zdCB7CisgICAgQ1hYTWV0aG9kRGVjbCAqQ0QgPSBjb25zdF9jYXN0PENYWE1ldGhvZERlY2wqPih0aGlzKS0+Z2V0Q2Fub25pY2FsRGVjbCgpOworCisgICAgLy8gTWVtYmVyIGZ1bmN0aW9uIGlzIHZpcnR1YWwgaWYgaXQgaXMgbWFya2VkIGV4cGxpY2l0bHkgc28sIG9yIGlmIGl0IGlzCisgICAgLy8gZGVjbGFyZWQgaW4gX19pbnRlcmZhY2UgLS0gdGhlbiBpdCBpcyBhdXRvbWF0aWNhbGx5IHB1cmUgdmlydHVhbC4KKyAgICBpZiAoQ0QtPmlzVmlydHVhbEFzV3JpdHRlbigpIHx8IENELT5pc1B1cmUoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIENELT5zaXplX292ZXJyaWRkZW5fbWV0aG9kcygpICE9IDA7CisgIH0KKworICAvLy8gSWYgaXQncyBwb3NzaWJsZSB0byBkZXZpcnR1YWxpemUgYSBjYWxsIHRvIHRoaXMgbWV0aG9kLCByZXR1cm4gdGhlIGNhbGxlZAorICAvLy8gZnVuY3Rpb24uIE90aGVyd2lzZSwgcmV0dXJuIG51bGwuCisKKyAgLy8vIFxwYXJhbSBCYXNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAgLy8vIFxwYXJhbSBJc0FwcGxlS2V4dCBUcnVlIGlmIHdlIGFyZSBjb21waWxpbmcgZm9yIEFwcGxlIGtleHQuCisgIENYWE1ldGhvZERlY2wgKmdldERldmlydHVhbGl6ZWRNZXRob2QoY29uc3QgRXhwciAqQmFzZSwgYm9vbCBJc0FwcGxlS2V4dCk7CisKKyAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqZ2V0RGV2aXJ0dWFsaXplZE1ldGhvZChjb25zdCBFeHByICpCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNBcHBsZUtleHQpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxDWFhNZXRob2REZWNsICo+KHRoaXMpLT5nZXREZXZpcnR1YWxpemVkTWV0aG9kKAorICAgICAgICBCYXNlLCBJc0FwcGxlS2V4dCk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSB1c3VhbCBkZWFsbG9jYXRpb24gZnVuY3Rpb24KKyAgLy8vIChDKysgW2Jhc2ljLnN0Yy5keW5hbWljLmRlYWxsb2NhdGlvbl1wMiksIHdoaWNoIGlzIGFuIG92ZXJsb2FkZWQKKyAgLy8vIGRlbGV0ZSBvciBkZWxldGVbXSBvcGVyYXRvciB3aXRoIGEgcGFydGljdWxhciBzaWduYXR1cmUuCisgIGJvb2wgaXNVc3VhbERlYWxsb2NhdGlvbkZ1bmN0aW9uKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgY29weS1hc3NpZ25tZW50IG9wZXJhdG9yLCByZWdhcmRsZXNzCisgIC8vLyBvZiB3aGV0aGVyIGl0IHdhcyBkZWNsYXJlZCBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHkuCisgIGJvb2wgaXNDb3B5QXNzaWdubWVudE9wZXJhdG9yKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICBib29sIGlzTW92ZUFzc2lnbm1lbnRPcGVyYXRvcigpIGNvbnN0OworCisgIENYWE1ldGhvZERlY2wgKmdldENhbm9uaWNhbERlY2woKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIGNhc3Q8Q1hYTWV0aG9kRGVjbD4oRnVuY3Rpb25EZWNsOjpnZXRDYW5vbmljYWxEZWNsKCkpOworICB9CisgIGNvbnN0IENYWE1ldGhvZERlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q1hYTWV0aG9kRGVjbCo+KHRoaXMpLT5nZXRDYW5vbmljYWxEZWNsKCk7CisgIH0KKworICBDWFhNZXRob2REZWNsICpnZXRNb3N0UmVjZW50RGVjbCgpIHsKKyAgICByZXR1cm4gY2FzdDxDWFhNZXRob2REZWNsPigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEZ1bmN0aW9uRGVjbCAqPih0aGlzKS0+Z2V0TW9zdFJlY2VudERlY2woKSk7CisgIH0KKyAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqZ2V0TW9zdFJlY2VudERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q1hYTWV0aG9kRGVjbCo+KHRoaXMpLT5nZXRNb3N0UmVjZW50RGVjbCgpOworICB9CisKKyAgLy8vIFRydWUgaWYgdGhpcyBtZXRob2QgaXMgdXNlci1kZWNsYXJlZCBhbmQgd2FzIG5vdAorICAvLy8gZGVsZXRlZCBvciBkZWZhdWx0ZWQgb24gaXRzIGZpcnN0IGRlY2xhcmF0aW9uLgorICBib29sIGlzVXNlclByb3ZpZGVkKCkgY29uc3QgeworICAgIGF1dG8gKkRlY2xBc1dyaXR0ZW4gPSB0aGlzOworICAgIGlmIChhdXRvICpQYXR0ZXJuID0gZ2V0VGVtcGxhdGVJbnN0YW50aWF0aW9uUGF0dGVybigpKQorICAgICAgRGVjbEFzV3JpdHRlbiA9IGNhc3Q8Q1hYTWV0aG9kRGVjbD4oUGF0dGVybik7CisgICAgcmV0dXJuICEoRGVjbEFzV3JpdHRlbi0+aXNEZWxldGVkKCkgfHwKKyAgICAgICAgICAgICBEZWNsQXNXcml0dGVuLT5nZXRDYW5vbmljYWxEZWNsKCktPmlzRGVmYXVsdGVkKCkpOworICB9CisKKyAgdm9pZCBhZGRPdmVycmlkZGVuTWV0aG9kKGNvbnN0IENYWE1ldGhvZERlY2wgKk1EKTsKKworICB1c2luZyBtZXRob2RfaXRlcmF0b3IgPSBjb25zdCBDWFhNZXRob2REZWNsICpjb25zdCAqOworCisgIG1ldGhvZF9pdGVyYXRvciBiZWdpbl9vdmVycmlkZGVuX21ldGhvZHMoKSBjb25zdDsKKyAgbWV0aG9kX2l0ZXJhdG9yIGVuZF9vdmVycmlkZGVuX21ldGhvZHMoKSBjb25zdDsKKyAgdW5zaWduZWQgc2l6ZV9vdmVycmlkZGVuX21ldGhvZHMoKSBjb25zdDsKKworICB1c2luZyBvdmVycmlkZGVuX21ldGhvZF9yYW5nZT0gQVNUQ29udGV4dDo6b3ZlcnJpZGRlbl9tZXRob2RfcmFuZ2U7CisKKyAgb3ZlcnJpZGRlbl9tZXRob2RfcmFuZ2Ugb3ZlcnJpZGRlbl9tZXRob2RzKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIHBhcmVudCBvZiB0aGlzIG1ldGhvZCBkZWNsYXJhdGlvbiwgd2hpY2gKKyAgLy8vIGlzIHRoZSBjbGFzcyBpbiB3aGljaCB0aGlzIG1ldGhvZCBpcyBkZWZpbmVkLgorICBjb25zdCBDWFhSZWNvcmREZWNsICpnZXRQYXJlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oRnVuY3Rpb25EZWNsOjpnZXRQYXJlbnQoKSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgcGFyZW50IG9mIHRoaXMgbWV0aG9kIGRlY2xhcmF0aW9uLCB3aGljaAorICAvLy8gaXMgdGhlIGNsYXNzIGluIHdoaWNoIHRoaXMgbWV0aG9kIGlzIGRlZmluZWQuCisgIENYWFJlY29yZERlY2wgKmdldFBhcmVudCgpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxDWFhSZWNvcmREZWNsICo+KAorICAgICAgICAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oRnVuY3Rpb25EZWNsOjpnZXRQYXJlbnQoKSkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBcYyB0aGlzIHBvaW50ZXIuCisgIC8vLworICAvLy8gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciBpbnN0YW5jZSAoaS5lLiwgbm9uLXN0YXRpYykgbWV0aG9kcy4gTm90ZQorICAvLy8gdGhhdCBmb3IgdGhlIGNhbGwgb3BlcmF0b3Igb2YgYSBsYW1iZGEgY2xvc3VyZSB0eXBlLCB0aGlzIHJldHVybnMgdGhlCisgIC8vLyBkZXN1Z2FyZWQgJ3RoaXMnIHR5cGUgKGEgcG9pbnRlciB0byB0aGUgY2xvc3VyZSB0eXBlKSwgbm90IHRoZSBjYXB0dXJlZAorICAvLy8gJ3RoaXMnIHR5cGUuCisgIFF1YWxUeXBlIGdldFRoaXNUeXBlKEFTVENvbnRleHQgJkMpIGNvbnN0OworCisgIHVuc2lnbmVkIGdldFR5cGVRdWFsaWZpZXJzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUeXBlKCktPmdldEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpLT5nZXRUeXBlUXVhbHMoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHJlZi1xdWFsaWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWV0aG9kLgorICAvLy8KKyAgLy8vIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgXGMgZigpIGhhcyBhbiBsdmFsdWUgcmVmLXF1YWxpZmllciwgXGMgZygpCisgIC8vLyBoYXMgYW4gcnZhbHVlIHJlZi1xdWFsaWZpZXIsIGFuZCBcYyBoKCkgaGFzIG5vIHJlZi1xdWFsaWZpZXIuCisgIC8vLyBAY29kZQorICAvLy8gc3RydWN0IFggeworICAvLy8gICB2b2lkIGYoKSAmOworICAvLy8gICB2b2lkIGcoKSAmJjsKKyAgLy8vICAgdm9pZCBoKCk7CisgIC8vLyB9OworICAvLy8gQGVuZGNvZGUKKyAgUmVmUXVhbGlmaWVyS2luZCBnZXRSZWZRdWFsaWZpZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCktPmdldFJlZlF1YWxpZmllcigpOworICB9CisKKyAgYm9vbCBoYXNJbmxpbmVCb2R5KCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgbGFtYmRhIGNsb3N1cmUgdHlwZSdzIHN0YXRpYyBtZW1iZXIKKyAgLy8vIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCBmb3IgdGhlIHJlc3VsdCBvZiB0aGUgbGFtYmRhJ3MgY29udmVyc2lvbiB0bworICAvLy8gZnVuY3Rpb24gcG9pbnRlciAoZm9yIGEgbGFtYmRhIHdpdGggbm8gY2FwdHVyZXMpLgorICAvLy8KKyAgLy8vIFRoZSBmdW5jdGlvbiBpdHNlbGYsIGlmIHVzZWQsIHdpbGwgaGF2ZSBhIHBsYWNlaG9sZGVyIGJvZHkgdGhhdCB3aWxsIGJlCisgIC8vLyBzdXBwbGllZCBieSBJUiBnZW5lcmF0aW9uIHRvIGVpdGhlciBmb3J3YXJkIHRvIHRoZSBmdW5jdGlvbiBjYWxsIG9wZXJhdG9yCisgIC8vLyBvciBjbG9uZSB0aGUgZnVuY3Rpb24gY2FsbCBvcGVyYXRvci4KKyAgYm9vbCBpc0xhbWJkYVN0YXRpY0ludm9rZXIoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEZpbmQgdGhlIG1ldGhvZCBpbiBccCBSRCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgb25lLgorICAvLy8KKyAgLy8vIEZpbmQgaWYgXHAgUkQgb3Igb25lIG9mIHRoZSBjbGFzc2VzIGl0IGluaGVyaXRzIGZyb20gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCisgIC8vLyBJZiBzbywgcmV0dXJuIGl0LiBccCBSRCBpcyBhc3N1bWVkIHRvIGJlIGEgc3ViY2xhc3Mgb2YgdGhlIGNsYXNzIGRlZmluaW5nCisgIC8vLyB0aGlzIG1ldGhvZCAob3IgYmUgdGhlIGNsYXNzIGl0c2VsZiksIHVubGVzcyBccCBNYXlCZUJhc2UgaXMgc2V0IHRvIHRydWUuCisgIENYWE1ldGhvZERlY2wgKgorICBnZXRDb3JyZXNwb25kaW5nTWV0aG9kSW5DbGFzcyhjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNYXlCZUJhc2UgPSBmYWxzZSk7CisKKyAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqCisgIGdldENvcnJlc3BvbmRpbmdNZXRob2RJbkNsYXNzKGNvbnN0IENYWFJlY29yZERlY2wgKlJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE1heUJlQmFzZSA9IGZhbHNlKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q1hYTWV0aG9kRGVjbCAqPih0aGlzKQorICAgICAgICAgICAgICAtPmdldENvcnJlc3BvbmRpbmdNZXRob2RJbkNsYXNzKFJELCBNYXlCZUJhc2UpOworICB9CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7CisgICAgcmV0dXJuIEsgPj0gZmlyc3RDWFhNZXRob2QgJiYgSyA8PSBsYXN0Q1hYTWV0aG9kOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBDKysgYmFzZSBvciBtZW1iZXIgaW5pdGlhbGl6ZXIuCisvLy8KKy8vLyBUaGlzIGlzIHBhcnQgb2YgYSBjb25zdHJ1Y3RvciBpbml0aWFsaXplciB0aGF0CisvLy8gaW5pdGlhbGl6ZXMgb25lIG5vbi1zdGF0aWMgbWVtYmVyIHZhcmlhYmxlIG9yIG9uZSBiYXNlIGNsYXNzLiBGb3IKKy8vLyBleGFtcGxlLCBpbiB0aGUgZm9sbG93aW5nLCBib3RoICdBKGEpJyBhbmQgJ2YoMy4xNDE1OSknIGFyZSBtZW1iZXIKKy8vLyBpbml0aWFsaXplcnM6CisvLy8KKy8vLyBcY29kZQorLy8vIGNsYXNzIEEgeyB9OworLy8vIGNsYXNzIEIgOiBwdWJsaWMgQSB7CisvLy8gICBmbG9hdCBmOworLy8vIHB1YmxpYzoKKy8vLyAgIEIoQSYgYSkgOiBBKGEpLCBmKDMuMTQxNTkpIHsgfQorLy8vIH07CisvLy8gXGVuZGNvZGUKK2NsYXNzIENYWEN0b3JJbml0aWFsaXplciBmaW5hbCB7CisgIC8vLyBcYnJpZWYgRWl0aGVyIHRoZSBiYXNlIGNsYXNzIG5hbWUvZGVsZWdhdGluZyBjb25zdHJ1Y3RvciB0eXBlIChzdG9yZWQgYXMKKyAgLy8vIGEgVHlwZVNvdXJjZUluZm8qKSwgYW4gbm9ybWFsIGZpZWxkIChGaWVsZERlY2wpLCBvciBhbiBhbm9ueW1vdXMgZmllbGQKKyAgLy8vIChJbmRpcmVjdEZpZWxkRGVjbCopIGJlaW5nIGluaXRpYWxpemVkLgorICBsbHZtOjpQb2ludGVyVW5pb24zPFR5cGVTb3VyY2VJbmZvICosIEZpZWxkRGVjbCAqLCBJbmRpcmVjdEZpZWxkRGVjbCAqPgorICAgIEluaXRpYWxpemVlOworCisgIC8vLyBcYnJpZWYgVGhlIHNvdXJjZSBsb2NhdGlvbiBmb3IgdGhlIGZpZWxkIG5hbWUgb3IsIGZvciBhIGJhc2UgaW5pdGlhbGl6ZXIKKyAgLy8vIHBhY2sgZXhwYW5zaW9uLCB0aGUgbG9jYXRpb24gb2YgdGhlIGVsbGlwc2lzLgorICAvLy8KKyAgLy8vIEluIHRoZSBjYXNlIG9mIGEgZGVsZWdhdGluZworICAvLy8gY29uc3RydWN0b3IsIGl0IHdpbGwgc3RpbGwgaW5jbHVkZSB0aGUgdHlwZSdzIHNvdXJjZSBsb2NhdGlvbiBhcyB0aGUKKyAgLy8vIEluaXRpYWxpemVlIHBvaW50cyB0byB0aGUgQ1hYQ29uc3RydWN0b3JEZWNsICh0byBhbGxvdyBsb29wIGRldGVjdGlvbikuCisgIFNvdXJjZUxvY2F0aW9uIE1lbWJlck9yRWxsaXBzaXNMb2NhdGlvbjsKKworICAvLy8gXGJyaWVmIFRoZSBhcmd1bWVudCB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGJhc2Ugb3IgbWVtYmVyLCB3aGljaCBtYXkKKyAgLy8vIGVuZCB1cCBjb25zdHJ1Y3RpbmcgYW4gb2JqZWN0ICh3aGVuIG11bHRpcGxlIGFyZ3VtZW50cyBhcmUgaW52b2x2ZWQpLgorICBTdG10ICpJbml0OworCisgIC8vLyBcYnJpZWYgTG9jYXRpb24gb2YgdGhlIGxlZnQgcGFyZW4gb2YgdGhlIGN0b3ItaW5pdGlhbGl6ZXIuCisgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYzsKKworICAvLy8gXGJyaWVmIExvY2F0aW9uIG9mIHRoZSByaWdodCBwYXJlbiBvZiB0aGUgY3Rvci1pbml0aWFsaXplci4KKyAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jOworCisgIC8vLyBcYnJpZWYgSWYgdGhlIGluaXRpYWxpemVlIGlzIGEgdHlwZSwgd2hldGhlciB0aGF0IHR5cGUgbWFrZXMgdGhpcworICAvLy8gYSBkZWxlZ2F0aW5nIGluaXRpYWxpemF0aW9uLgorICB1bnNpZ25lZCBJc0RlbGVnYXRpbmcgOiAxOworCisgIC8vLyBcYnJpZWYgSWYgdGhlIGluaXRpYWxpemVyIGlzIGEgYmFzZSBpbml0aWFsaXplciwgdGhpcyBrZWVwcyB0cmFjaworICAvLy8gb2Ygd2hldGhlciB0aGUgYmFzZSBpcyB2aXJ0dWFsIG9yIG5vdC4KKyAgdW5zaWduZWQgSXNWaXJ0dWFsIDogMTsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgb3Igbm90IHRoZSBpbml0aWFsaXplciBpcyBleHBsaWNpdGx5IHdyaXR0ZW4KKyAgLy8vIGluIHRoZSBzb3VyY2VzLgorICB1bnNpZ25lZCBJc1dyaXR0ZW4gOiAxOworCisgIC8vLyBJZiBJc1dyaXR0ZW4gaXMgdHJ1ZSwgdGhlbiB0aGlzIG51bWJlciBrZWVwcyB0cmFjayBvZiB0aGUgdGV4dHVhbCBvcmRlcgorICAvLy8gb2YgdGhpcyBpbml0aWFsaXplciBpbiB0aGUgb3JpZ2luYWwgc291cmNlcywgY291bnRpbmcgZnJvbSAwLgorICB1bnNpZ25lZCBTb3VyY2VPcmRlciA6IDEzOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhIG5ldyBiYXNlLWNsYXNzIGluaXRpYWxpemVyLgorICBleHBsaWNpdAorICBDWFhDdG9ySW5pdGlhbGl6ZXIoQVNUQ29udGV4dCAmQ29udGV4dCwgVHlwZVNvdXJjZUluZm8gKlRJbmZvLCBib29sIElzVmlydHVhbCwKKyAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEwsIEV4cHIgKkluaXQsIFNvdXJjZUxvY2F0aW9uIFIsCisgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYyk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGEgbmV3IG1lbWJlciBpbml0aWFsaXplci4KKyAgZXhwbGljaXQKKyAgQ1hYQ3RvckluaXRpYWxpemVyKEFTVENvbnRleHQgJkNvbnRleHQsIEZpZWxkRGVjbCAqTWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTWVtYmVyTG9jLCBTb3VyY2VMb2NhdGlvbiBMLCBFeHByICpJbml0LAorICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUik7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGEgbmV3IGFub255bW91cyBmaWVsZCBpbml0aWFsaXplci4KKyAgZXhwbGljaXQKKyAgQ1hYQ3RvckluaXRpYWxpemVyKEFTVENvbnRleHQgJkNvbnRleHQsIEluZGlyZWN0RmllbGREZWNsICpNZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBNZW1iZXJMb2MsIFNvdXJjZUxvY2F0aW9uIEwsIEV4cHIgKkluaXQsCisgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYSBuZXcgZGVsZWdhdGluZyBpbml0aWFsaXplci4KKyAgZXhwbGljaXQKKyAgQ1hYQ3RvckluaXRpYWxpemVyKEFTVENvbnRleHQgJkNvbnRleHQsIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEwsIEV4cHIgKkluaXQsIFNvdXJjZUxvY2F0aW9uIFIpOworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpbml0aWFsaXplciBpcyBpbml0aWFsaXppbmcgYSBiYXNlIGNsYXNzLgorICBib29sIGlzQmFzZUluaXRpYWxpemVyKCkgY29uc3QgeworICAgIHJldHVybiBJbml0aWFsaXplZS5pczxUeXBlU291cmNlSW5mbyo+KCkgJiYgIUlzRGVsZWdhdGluZzsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpbml0aWFsaXplciBpcyBpbml0aWFsaXppbmcgYSBub24tc3RhdGljCisgIC8vLyBkYXRhIG1lbWJlci4KKyAgYm9vbCBpc01lbWJlckluaXRpYWxpemVyKCkgY29uc3QgeyByZXR1cm4gSW5pdGlhbGl6ZWUuaXM8RmllbGREZWNsKj4oKTsgfQorCisgIGJvb2wgaXNBbnlNZW1iZXJJbml0aWFsaXplcigpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNNZW1iZXJJbml0aWFsaXplcigpIHx8IGlzSW5kaXJlY3RNZW1iZXJJbml0aWFsaXplcigpOworICB9CisKKyAgYm9vbCBpc0luZGlyZWN0TWVtYmVySW5pdGlhbGl6ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIEluaXRpYWxpemVlLmlzPEluZGlyZWN0RmllbGREZWNsKj4oKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpbml0aWFsaXplciBpcyBhbiBpbXBsaWNpdCBpbml0aWFsaXplcgorICAvLy8gZ2VuZXJhdGVkIGZvciBhIGZpZWxkIHdpdGggYW4gaW5pdGlhbGl6ZXIgZGVmaW5lZCBvbiB0aGUgbWVtYmVyCisgIC8vLyBkZWNsYXJhdGlvbi4KKyAgLy8vCisgIC8vLyBJbi1jbGFzcyBtZW1iZXIgaW5pdGlhbGl6ZXJzIChhbHNvIGtub3duIGFzICJub24tc3RhdGljIGRhdGEgbWVtYmVyCisgIC8vLyBpbml0aWFsaXphdGlvbnMiLCBOU0RNSXMpIHdlcmUgaW50cm9kdWNlZCBpbiBDKysxMS4KKyAgYm9vbCBpc0luQ2xhc3NNZW1iZXJJbml0aWFsaXplcigpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5pdC0+Z2V0U3RtdENsYXNzKCkgPT0gU3RtdDo6Q1hYRGVmYXVsdEluaXRFeHByQ2xhc3M7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgaW5pdGlhbGl6ZXIgaXMgY3JlYXRpbmcgYSBkZWxlZ2F0aW5nCisgIC8vLyBjb25zdHJ1Y3Rvci4KKyAgYm9vbCBpc0RlbGVnYXRpbmdJbml0aWFsaXplcigpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5pdGlhbGl6ZWUuaXM8VHlwZVNvdXJjZUluZm8qPigpICYmIElzRGVsZWdhdGluZzsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpbml0aWFsaXplciBpcyBhIHBhY2sgZXhwYW5zaW9uLgorICBib29sIGlzUGFja0V4cGFuc2lvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNCYXNlSW5pdGlhbGl6ZXIoKSAmJiBNZW1iZXJPckVsbGlwc2lzTG9jYXRpb24uaXNWYWxpZCgpOworICB9CisKKyAgLy8gXGJyaWVmIEZvciBhIHBhY2sgZXhwYW5zaW9uLCByZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgZWxsaXBzaXMuCisgIFNvdXJjZUxvY2F0aW9uIGdldEVsbGlwc2lzTG9jKCkgY29uc3QgeworICAgIGFzc2VydChpc1BhY2tFeHBhbnNpb24oKSAmJiAiSW5pdGlhbGl6ZXIgaXMgbm90IGEgcGFjayBleHBhbnNpb24iKTsKKyAgICByZXR1cm4gTWVtYmVyT3JFbGxpcHNpc0xvY2F0aW9uOworICB9CisKKyAgLy8vIElmIHRoaXMgaXMgYSBiYXNlIGNsYXNzIGluaXRpYWxpemVyLCByZXR1cm5zIHRoZSB0eXBlIG9mIHRoZQorICAvLy8gYmFzZSBjbGFzcyB3aXRoIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBPdGhlcndpc2UsIHJldHVybnMgYW4gTlVMTAorICAvLy8gdHlwZSBsb2NhdGlvbi4KKyAgVHlwZUxvYyBnZXRCYXNlQ2xhc3NMb2MoKSBjb25zdDsKKworICAvLy8gSWYgdGhpcyBpcyBhIGJhc2UgY2xhc3MgaW5pdGlhbGl6ZXIsIHJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGJhc2UgY2xhc3MuCisgIC8vLyBPdGhlcndpc2UsIHJldHVybnMgbnVsbC4KKyAgY29uc3QgVHlwZSAqZ2V0QmFzZUNsYXNzKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgd2hldGhlciB0aGUgYmFzZSBpcyB2aXJ0dWFsIG9yIG5vdC4KKyAgYm9vbCBpc0Jhc2VWaXJ0dWFsKCkgY29uc3QgeworICAgIGFzc2VydChpc0Jhc2VJbml0aWFsaXplcigpICYmICJNdXN0IGNhbGwgdGhpcyBvbiBiYXNlIGluaXRpYWxpemVyISIpOworCisgICAgcmV0dXJuIElzVmlydHVhbDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZGVjbGFyYXRvciBpbmZvcm1hdGlvbiBmb3IgYSBiYXNlIGNsYXNzIG9yIGRlbGVnYXRpbmcKKyAgLy8vIGluaXRpYWxpemVyLgorICBUeXBlU291cmNlSW5mbyAqZ2V0VHlwZVNvdXJjZUluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIEluaXRpYWxpemVlLmR5bl9jYXN0PFR5cGVTb3VyY2VJbmZvICo+KCk7CisgIH0KKworICAvLy8gXGJyaWVmIElmIHRoaXMgaXMgYSBtZW1iZXIgaW5pdGlhbGl6ZXIsIHJldHVybnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZQorICAvLy8gbm9uLXN0YXRpYyBkYXRhIG1lbWJlciBiZWluZyBpbml0aWFsaXplZC4gT3RoZXJ3aXNlLCByZXR1cm5zIG51bGwuCisgIEZpZWxkRGVjbCAqZ2V0TWVtYmVyKCkgY29uc3QgeworICAgIGlmIChpc01lbWJlckluaXRpYWxpemVyKCkpCisgICAgICByZXR1cm4gSW5pdGlhbGl6ZWUuZ2V0PEZpZWxkRGVjbCo+KCk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBGaWVsZERlY2wgKmdldEFueU1lbWJlcigpIGNvbnN0IHsKKyAgICBpZiAoaXNNZW1iZXJJbml0aWFsaXplcigpKQorICAgICAgcmV0dXJuIEluaXRpYWxpemVlLmdldDxGaWVsZERlY2wqPigpOworICAgIGlmIChpc0luZGlyZWN0TWVtYmVySW5pdGlhbGl6ZXIoKSkKKyAgICAgIHJldHVybiBJbml0aWFsaXplZS5nZXQ8SW5kaXJlY3RGaWVsZERlY2wqPigpLT5nZXRBbm9uRmllbGQoKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIEluZGlyZWN0RmllbGREZWNsICpnZXRJbmRpcmVjdE1lbWJlcigpIGNvbnN0IHsKKyAgICBpZiAoaXNJbmRpcmVjdE1lbWJlckluaXRpYWxpemVyKCkpCisgICAgICByZXR1cm4gSW5pdGlhbGl6ZWUuZ2V0PEluZGlyZWN0RmllbGREZWNsKj4oKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldE1lbWJlckxvY2F0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBNZW1iZXJPckVsbGlwc2lzTG9jYXRpb247CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBpbml0aWFsaXplci4KKyAgU291cmNlTG9jYXRpb24gZ2V0U291cmNlTG9jYXRpb24oKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgc291cmNlIHJhbmdlIGNvdmVyaW5nIHRoZSBlbnRpcmUgaW5pdGlhbGl6ZXIuCisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgaW5pdGlhbGl6ZXIgaXMgZXhwbGljaXRseSB3cml0dGVuCisgIC8vLyBpbiB0aGUgc291cmNlIGNvZGUuCisgIGJvb2wgaXNXcml0dGVuKCkgY29uc3QgeyByZXR1cm4gSXNXcml0dGVuOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHNvdXJjZSBwb3NpdGlvbiBvZiB0aGUgaW5pdGlhbGl6ZXIsIGNvdW50aW5nIGZyb20gMC4KKyAgLy8vIElmIHRoZSBpbml0aWFsaXplciB3YXMgaW1wbGljaXQsIC0xIGlzIHJldHVybmVkLgorICBpbnQgZ2V0U291cmNlT3JkZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIElzV3JpdHRlbiA/IHN0YXRpY19jYXN0PGludD4oU291cmNlT3JkZXIpIDogLTE7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgc291cmNlIG9yZGVyIG9mIHRoaXMgaW5pdGlhbGl6ZXIuCisgIC8vLworICAvLy8gVGhpcyBjYW4gb25seSBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBpbml0aWFsaXplcjsgaXQgY2Fubm90IGJlIGNhbGxlZAorICAvLy8gb24gYW4gaW5pdGlhbGl6ZXIgaGF2aW5nIGEgcG9zaXRpdmUgbnVtYmVyIG9mIChpbXBsaWNpdCkgYXJyYXkgaW5kaWNlcy4KKyAgLy8vCisgIC8vLyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgaW5pdGlhbGl6ZXIgd2FzIHdyaXR0ZW4gaW4gdGhlIHNvdXJjZSBjb2RlLCBhbmQKKyAgLy8vIGVuc3VyZXMgdGhhdCBpc1dyaXR0ZW4oKSByZXR1cm5zIHRydWUuCisgIHZvaWQgc2V0U291cmNlT3JkZXIoaW50IFBvcykgeworICAgIGFzc2VydCghSXNXcml0dGVuICYmCisgICAgICAgICAgICJzZXRTb3VyY2VPcmRlcigpIHVzZWQgb24gaW1wbGljaXQgaW5pdGlhbGl6ZXIiKTsKKyAgICBhc3NlcnQoU291cmNlT3JkZXIgPT0gMCAmJgorICAgICAgICAgICAiY2FsbGluZyB0d2ljZSBzZXRTb3VyY2VPcmRlcigpIG9uIHRoZSBzYW1lIGluaXRpYWxpemVyIik7CisgICAgYXNzZXJ0KFBvcyA+PSAwICYmCisgICAgICAgICAgICJzZXRTb3VyY2VPcmRlcigpIHVzZWQgdG8gbWFrZSBhbiBpbml0aWFsaXplciBpbXBsaWNpdCIpOworICAgIElzV3JpdHRlbiA9IHRydWU7CisgICAgU291cmNlT3JkZXIgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oUG9zKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIExQYXJlbkxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRSUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgaW5pdGlhbGl6ZXIuCisgIEV4cHIgKmdldEluaXQoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxFeHByKj4oSW5pdCk7IH0KK307CisKKy8vLyBEZXNjcmlwdGlvbiBvZiBhIGNvbnN0cnVjdG9yIHRoYXQgd2FzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSBjbGFzcy4KK2NsYXNzIEluaGVyaXRlZENvbnN0cnVjdG9yIHsKKyAgQ29uc3RydWN0b3JVc2luZ1NoYWRvd0RlY2wgKlNoYWRvdyA9IG51bGxwdHI7CisgIENYWENvbnN0cnVjdG9yRGVjbCAqQmFzZUN0b3IgPSBudWxscHRyOworCitwdWJsaWM6CisgIEluaGVyaXRlZENvbnN0cnVjdG9yKCkgPSBkZWZhdWx0OworICBJbmhlcml0ZWRDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvclVzaW5nU2hhZG93RGVjbCAqU2hhZG93LAorICAgICAgICAgICAgICAgICAgICAgICBDWFhDb25zdHJ1Y3RvckRlY2wgKkJhc2VDdG9yKQorICAgICAgOiBTaGFkb3coU2hhZG93KSwgQmFzZUN0b3IoQmFzZUN0b3IpIHt9CisKKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIFNoYWRvdzsgfQorCisgIENvbnN0cnVjdG9yVXNpbmdTaGFkb3dEZWNsICpnZXRTaGFkb3dEZWNsKCkgY29uc3QgeyByZXR1cm4gU2hhZG93OyB9CisgIENYWENvbnN0cnVjdG9yRGVjbCAqZ2V0Q29uc3RydWN0b3IoKSBjb25zdCB7IHJldHVybiBCYXNlQ3RvcjsgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgQysrIGNvbnN0cnVjdG9yIHdpdGhpbiBhIGNsYXNzLgorLy8vCisvLy8gRm9yIGV4YW1wbGU6CisvLy8KKy8vLyBcY29kZQorLy8vIGNsYXNzIFggeworLy8vIHB1YmxpYzoKKy8vLyAgIGV4cGxpY2l0IFgoaW50KTsgLy8gcmVwcmVzZW50ZWQgYnkgYSBDWFhDb25zdHJ1Y3RvckRlY2wuCisvLy8gfTsKKy8vLyBcZW5kY29kZQorY2xhc3MgQ1hYQ29uc3RydWN0b3JEZWNsIGZpbmFsCisgICAgOiBwdWJsaWMgQ1hYTWV0aG9kRGVjbCwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPENYWENvbnN0cnVjdG9yRGVjbCwgSW5oZXJpdGVkQ29uc3RydWN0b3I+IHsKKyAgLy8vIFxuYW1lIFN1cHBvcnQgZm9yIGJhc2UgYW5kIG1lbWJlciBpbml0aWFsaXplcnMuCisgIC8vLyBceworICAvLy8gXGJyaWVmIFRoZSBhcmd1bWVudHMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBiYXNlIG9yIG1lbWJlci4KKyAgTGF6eUNYWEN0b3JJbml0aWFsaXplcnNQdHIgQ3RvckluaXRpYWxpemVyczsKKyAgdW5zaWduZWQgTnVtQ3RvckluaXRpYWxpemVycyA6IDMxOworICAvLy8gXH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbiBpcyBhbiBpbXBsaWNpdGx5LWRlY2xhcmVkCisgIC8vLyBpbmhlcml0aW5nIGNvbnN0cnVjdG9yLgorICB1bnNpZ25lZCBJc0luaGVyaXRpbmdDb25zdHJ1Y3RvciA6IDE7CisKKyAgQ1hYQ29uc3RydWN0b3JEZWNsKEFTVENvbnRleHQgJkMsIENYWFJlY29yZERlY2wgKlJELCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwgVHlwZVNvdXJjZUluZm8gKlRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0V4cGxpY2l0U3BlY2lmaWVkLCBib29sIGlzSW5saW5lLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0ltcGxpY2l0bHlEZWNsYXJlZCwgYm9vbCBpc0NvbnN0ZXhwciwKKyAgICAgICAgICAgICAgICAgICAgIEluaGVyaXRlZENvbnN0cnVjdG9yIEluaGVyaXRlZCkKKyAgICA6IENYWE1ldGhvZERlY2woQ1hYQ29uc3RydWN0b3IsIEMsIFJELCBTdGFydExvYywgTmFtZUluZm8sIFQsIFRJbmZvLAorICAgICAgICAgICAgICAgICAgICBTQ19Ob25lLCBpc0lubGluZSwgaXNDb25zdGV4cHIsIFNvdXJjZUxvY2F0aW9uKCkpLAorICAgICAgTnVtQ3RvckluaXRpYWxpemVycygwKSwgSXNJbmhlcml0aW5nQ29uc3RydWN0b3IoKGJvb2wpSW5oZXJpdGVkKSB7CisgICAgc2V0SW1wbGljaXQoaXNJbXBsaWNpdGx5RGVjbGFyZWQpOworICAgIGlmIChJbmhlcml0ZWQpCisgICAgICAqZ2V0VHJhaWxpbmdPYmplY3RzPEluaGVyaXRlZENvbnN0cnVjdG9yPigpID0gSW5oZXJpdGVkOworICAgIElzRXhwbGljaXRTcGVjaWZpZWQgPSBpc0V4cGxpY2l0U3BlY2lmaWVkOworICB9CisKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgc3RhdGljIENYWENvbnN0cnVjdG9yRGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmhlcml0c0NvbnN0cnVjdG9yKTsKKyAgc3RhdGljIENYWENvbnN0cnVjdG9yRGVjbCAqCisgIENyZWF0ZShBU1RDb250ZXh0ICZDLCBDWFhSZWNvcmREZWNsICpSRCwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZOYW1lSW5mbywgUXVhbFR5cGUgVCwgVHlwZVNvdXJjZUluZm8gKlRJbmZvLAorICAgICAgICAgYm9vbCBpc0V4cGxpY2l0LCBib29sIGlzSW5saW5lLCBib29sIGlzSW1wbGljaXRseURlY2xhcmVkLAorICAgICAgICAgYm9vbCBpc0NvbnN0ZXhwciwKKyAgICAgICAgIEluaGVyaXRlZENvbnN0cnVjdG9yIEluaGVyaXRlZCA9IEluaGVyaXRlZENvbnN0cnVjdG9yKCkpOworCisgIC8vLyBcYnJpZWYgSXRlcmF0ZXMgdGhyb3VnaCB0aGUgbWVtYmVyL2Jhc2UgaW5pdGlhbGl6ZXIgbGlzdC4KKyAgdXNpbmcgaW5pdF9pdGVyYXRvciA9IENYWEN0b3JJbml0aWFsaXplciAqKjsKKworICAvLy8gXGJyaWVmIEl0ZXJhdGVzIHRocm91Z2ggdGhlIG1lbWJlci9iYXNlIGluaXRpYWxpemVyIGxpc3QuCisgIHVzaW5nIGluaXRfY29uc3RfaXRlcmF0b3IgPSBDWFhDdG9ySW5pdGlhbGl6ZXIgKmNvbnN0ICo7CisKKyAgdXNpbmcgaW5pdF9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGluaXRfaXRlcmF0b3I+OworICB1c2luZyBpbml0X2NvbnN0X3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8aW5pdF9jb25zdF9pdGVyYXRvcj47CisKKyAgaW5pdF9yYW5nZSBpbml0cygpIHsgcmV0dXJuIGluaXRfcmFuZ2UoaW5pdF9iZWdpbigpLCBpbml0X2VuZCgpKTsgfQorICBpbml0X2NvbnN0X3JhbmdlIGluaXRzKCkgY29uc3QgeworICAgIHJldHVybiBpbml0X2NvbnN0X3JhbmdlKGluaXRfYmVnaW4oKSwgaW5pdF9lbmQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIGFuIGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBpbml0aWFsaXplci4KKyAgaW5pdF9pdGVyYXRvciBpbml0X2JlZ2luKCkgeworICAgIGNvbnN0IGF1dG8gKkNvbnN0VGhpcyA9IHRoaXM7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8aW5pdF9pdGVyYXRvcj4oQ29uc3RUaGlzLT5pbml0X2JlZ2luKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBhbiBpdGVyYXRvciB0byB0aGUgZmlyc3QgaW5pdGlhbGl6ZXIuCisgIGluaXRfY29uc3RfaXRlcmF0b3IgaW5pdF9iZWdpbigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYW4gaXRlcmF0b3IgcGFzdCB0aGUgbGFzdCBpbml0aWFsaXplci4KKyAgaW5pdF9pdGVyYXRvciAgICAgICBpbml0X2VuZCgpICAgICAgIHsKKyAgICByZXR1cm4gaW5pdF9iZWdpbigpICsgTnVtQ3RvckluaXRpYWxpemVyczsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYW4gaXRlcmF0b3IgcGFzdCB0aGUgbGFzdCBpbml0aWFsaXplci4KKyAgaW5pdF9jb25zdF9pdGVyYXRvciBpbml0X2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaW5pdF9iZWdpbigpICsgTnVtQ3RvckluaXRpYWxpemVyczsKKyAgfQorCisgIHVzaW5nIGluaXRfcmV2ZXJzZV9pdGVyYXRvciA9IHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpbml0X2l0ZXJhdG9yPjsKKyAgdXNpbmcgaW5pdF9jb25zdF9yZXZlcnNlX2l0ZXJhdG9yID0KKyAgICAgIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpbml0X2NvbnN0X2l0ZXJhdG9yPjsKKworICBpbml0X3JldmVyc2VfaXRlcmF0b3IgaW5pdF9yYmVnaW4oKSB7CisgICAgcmV0dXJuIGluaXRfcmV2ZXJzZV9pdGVyYXRvcihpbml0X2VuZCgpKTsKKyAgfQorICBpbml0X2NvbnN0X3JldmVyc2VfaXRlcmF0b3IgaW5pdF9yYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGluaXRfY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihpbml0X2VuZCgpKTsKKyAgfQorCisgIGluaXRfcmV2ZXJzZV9pdGVyYXRvciBpbml0X3JlbmQoKSB7CisgICAgcmV0dXJuIGluaXRfcmV2ZXJzZV9pdGVyYXRvcihpbml0X2JlZ2luKCkpOworICB9CisgIGluaXRfY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpbml0X3JlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGluaXRfY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihpbml0X2JlZ2luKCkpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtZW1iZXIKKyAgLy8vIG9yIGJhc2UuCisgIHVuc2lnbmVkIGdldE51bUN0b3JJbml0aWFsaXplcnMoKSBjb25zdCB7CisgICAgICByZXR1cm4gTnVtQ3RvckluaXRpYWxpemVyczsKKyAgfQorCisgIHZvaWQgc2V0TnVtQ3RvckluaXRpYWxpemVycyh1bnNpZ25lZCBudW1DdG9ySW5pdGlhbGl6ZXJzKSB7CisgICAgTnVtQ3RvckluaXRpYWxpemVycyA9IG51bUN0b3JJbml0aWFsaXplcnM7CisgIH0KKworICB2b2lkIHNldEN0b3JJbml0aWFsaXplcnMoQ1hYQ3RvckluaXRpYWxpemVyICoqSW5pdGlhbGl6ZXJzKSB7CisgICAgQ3RvckluaXRpYWxpemVycyA9IEluaXRpYWxpemVyczsKKyAgfQorCisgIC8vLyBXaGV0aGVyIHRoaXMgZnVuY3Rpb24gaXMgbWFya2VkIGFzIGV4cGxpY2l0IGV4cGxpY2l0bHkuCisgIGJvb2wgaXNFeHBsaWNpdFNwZWNpZmllZCgpIGNvbnN0IHsgcmV0dXJuIElzRXhwbGljaXRTcGVjaWZpZWQ7IH0KKworICAvLy8gV2hldGhlciB0aGlzIGZ1bmN0aW9uIGlzIGV4cGxpY2l0LgorICBib29sIGlzRXhwbGljaXQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldENhbm9uaWNhbERlY2woKS0+aXNFeHBsaWNpdFNwZWNpZmllZCgpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNvbnN0cnVjdG9yIGlzIGEgZGVsZWdhdGluZyBjb25zdHJ1Y3Rvci4KKyAgYm9vbCBpc0RlbGVnYXRpbmdDb25zdHJ1Y3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldE51bUN0b3JJbml0aWFsaXplcnMoKSA9PSAxKSAmJgorICAgICAgICAgICBpbml0X2JlZ2luKClbMF0tPmlzRGVsZWdhdGluZ0luaXRpYWxpemVyKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFdoZW4gdGhpcyBjb25zdHJ1Y3RvciBkZWxlZ2F0ZXMgdG8gYW5vdGhlciwgcmV0cmlldmUgdGhlIHRhcmdldC4KKyAgQ1hYQ29uc3RydWN0b3JEZWNsICpnZXRUYXJnZXRDb25zdHJ1Y3RvcigpIGNvbnN0OworCisgIC8vLyBXaGV0aGVyIHRoaXMgY29uc3RydWN0b3IgaXMgYSBkZWZhdWx0CisgIC8vLyBjb25zdHJ1Y3RvciAoQysrIFtjbGFzcy5jdG9yXXA1KSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8KKyAgLy8vIGRlZmF1bHQtaW5pdGlhbGl6ZSBhIGNsYXNzIG9mIHRoaXMgdHlwZS4KKyAgYm9vbCBpc0RlZmF1bHRDb25zdHJ1Y3RvcigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGNvbnN0cnVjdG9yIGlzIGEgY29weSBjb25zdHJ1Y3RvciAoQysrIFtjbGFzcy5jb3B5XXAyLAorICAvLy8gd2hpY2ggY2FuIGJlIHVzZWQgdG8gY29weSB0aGUgY2xhc3MuCisgIC8vLworICAvLy8gXHAgVHlwZVF1YWxzIHdpbGwgYmUgc2V0IHRvIHRoZSBxdWFsaWZpZXJzIG9uIHRoZQorICAvLy8gYXJndW1lbnQgdHlwZS4gRm9yIGV4YW1wbGUsIFxwIFR5cGVRdWFscyB3b3VsZCBiZSBzZXQgdG8gXGMKKyAgLy8vIFF1YWxpZmllcnM6OkNvbnN0IGZvciB0aGUgZm9sbG93aW5nIGNvcHkgY29uc3RydWN0b3I6CisgIC8vLworICAvLy8gXGNvZGUKKyAgLy8vIGNsYXNzIFggeworICAvLy8gcHVibGljOgorICAvLy8gICBYKGNvbnN0IFgmKTsKKyAgLy8vIH07CisgIC8vLyBcZW5kY29kZQorICBib29sIGlzQ29weUNvbnN0cnVjdG9yKHVuc2lnbmVkICZUeXBlUXVhbHMpIGNvbnN0OworCisgIC8vLyBXaGV0aGVyIHRoaXMgY29uc3RydWN0b3IgaXMgYSBjb3B5CisgIC8vLyBjb25zdHJ1Y3RvciAoQysrIFtjbGFzcy5jb3B5XXAyLCB3aGljaCBjYW4gYmUgdXNlZCB0byBjb3B5IHRoZQorICAvLy8gY2xhc3MuCisgIGJvb2wgaXNDb3B5Q29uc3RydWN0b3IoKSBjb25zdCB7CisgICAgdW5zaWduZWQgVHlwZVF1YWxzID0gMDsKKyAgICByZXR1cm4gaXNDb3B5Q29uc3RydWN0b3IoVHlwZVF1YWxzKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjb25zdHJ1Y3RvciBpcyBhIG1vdmUgY29uc3RydWN0b3IKKyAgLy8vIChDKysxMSBbY2xhc3MuY29weV1wMyksIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1vdmUgdmFsdWVzIG9mIHRoZSBjbGFzcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gVHlwZVF1YWxzIElmIHRoaXMgY29uc3RydWN0b3IgaXMgYSBtb3ZlIGNvbnN0cnVjdG9yLCB3aWxsIGJlIHNldAorICAvLy8gdG8gdGhlIHR5cGUgcXVhbGlmaWVycyBvbiB0aGUgcmVmZXJlbnQgb2YgdGhlIGZpcnN0IHBhcmFtZXRlcidzIHR5cGUuCisgIGJvb2wgaXNNb3ZlQ29uc3RydWN0b3IodW5zaWduZWQgJlR5cGVRdWFscykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNvbnN0cnVjdG9yIGlzIGEgbW92ZSBjb25zdHJ1Y3RvcgorICAvLy8gKEMrKzExIFtjbGFzcy5jb3B5XXAzKSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbW92ZSB2YWx1ZXMgb2YgdGhlIGNsYXNzLgorICBib29sIGlzTW92ZUNvbnN0cnVjdG9yKCkgY29uc3QgeworICAgIHVuc2lnbmVkIFR5cGVRdWFscyA9IDA7CisgICAgcmV0dXJuIGlzTW92ZUNvbnN0cnVjdG9yKFR5cGVRdWFscyk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSBjb3B5IG9yIG1vdmUgY29uc3RydWN0b3IuCisgIC8vLworICAvLy8gXHBhcmFtIFR5cGVRdWFscyBXaWxsIGJlIHNldCB0byB0aGUgdHlwZSBxdWFsaWZpZXJzIG9uIHRoZSByZWZlcmVuY2UKKyAgLy8vIHBhcmFtZXRlciwgaWYgaW4gZmFjdCB0aGlzIGlzIGEgY29weSBvciBtb3ZlIGNvbnN0cnVjdG9yLgorICBib29sIGlzQ29weU9yTW92ZUNvbnN0cnVjdG9yKHVuc2lnbmVkICZUeXBlUXVhbHMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBhIGNvcHkgb3IgbW92ZSBjb25zdHJ1Y3Rvci4KKyAgYm9vbCBpc0NvcHlPck1vdmVDb25zdHJ1Y3RvcigpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBRdWFsczsKKyAgICByZXR1cm4gaXNDb3B5T3JNb3ZlQ29uc3RydWN0b3IoUXVhbHMpOworICB9CisKKyAgLy8vIFdoZXRoZXIgdGhpcyBjb25zdHJ1Y3RvciBpcyBhCisgIC8vLyBjb252ZXJ0aW5nIGNvbnN0cnVjdG9yIChDKysgW2NsYXNzLmNvbnYuY3Rvcl0pLCB3aGljaCBjYW4gYmUKKyAgLy8vIHVzZWQgZm9yIHVzZXItZGVmaW5lZCBjb252ZXJzaW9ucy4KKyAgYm9vbCBpc0NvbnZlcnRpbmdDb25zdHJ1Y3Rvcihib29sIEFsbG93RXhwbGljaXQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIG1lbWJlciB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0aGF0CisgIC8vLyB3b3VsZCBjb3B5IHRoZSBvYmplY3QgdG8gaXRzZWxmLiBTdWNoIGNvbnN0cnVjdG9ycyBhcmUgbmV2ZXIgdXNlZCB0byBjb3B5CisgIC8vLyBhbiBvYmplY3QuCisgIGJvb2wgaXNTcGVjaWFsaXphdGlvbkNvcHlpbmdPYmplY3QoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYW4gaW1wbGljaXQgY29uc3RydWN0b3Igc3ludGhlc2l6ZWQgdG8KKyAgLy8vIG1vZGVsIGEgY2FsbCB0byBhIGNvbnN0cnVjdG9yIGluaGVyaXRlZCBmcm9tIGEgYmFzZSBjbGFzcy4KKyAgYm9vbCBpc0luaGVyaXRpbmdDb25zdHJ1Y3RvcigpIGNvbnN0IHsgcmV0dXJuIElzSW5oZXJpdGluZ0NvbnN0cnVjdG9yOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGNvbnN0cnVjdG9yIHRoYXQgdGhpcyBpbmhlcml0aW5nIGNvbnN0cnVjdG9yIGlzIGJhc2VkIG9uLgorICBJbmhlcml0ZWRDb25zdHJ1Y3RvciBnZXRJbmhlcml0ZWRDb25zdHJ1Y3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gSXNJbmhlcml0aW5nQ29uc3RydWN0b3IgPyAqZ2V0VHJhaWxpbmdPYmplY3RzPEluaGVyaXRlZENvbnN0cnVjdG9yPigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSW5oZXJpdGVkQ29uc3RydWN0b3IoKTsKKyAgfQorCisgIENYWENvbnN0cnVjdG9yRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gY2FzdDxDWFhDb25zdHJ1Y3RvckRlY2w+KEZ1bmN0aW9uRGVjbDo6Z2V0Q2Fub25pY2FsRGVjbCgpKTsKKyAgfQorICBjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q1hYQ29uc3RydWN0b3JEZWNsKj4odGhpcyktPmdldENhbm9uaWNhbERlY2woKTsKKyAgfQorCisgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBDWFhDb25zdHJ1Y3RvcjsgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgQysrIGRlc3RydWN0b3Igd2l0aGluIGEgY2xhc3MuCisvLy8KKy8vLyBGb3IgZXhhbXBsZToKKy8vLworLy8vIFxjb2RlCisvLy8gY2xhc3MgWCB7CisvLy8gcHVibGljOgorLy8vICAgflgoKTsgLy8gcmVwcmVzZW50ZWQgYnkgYSBDWFhEZXN0cnVjdG9yRGVjbC4KKy8vLyB9OworLy8vIFxlbmRjb2RlCitjbGFzcyBDWFhEZXN0cnVjdG9yRGVjbCA6IHB1YmxpYyBDWFhNZXRob2REZWNsIHsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsV3JpdGVyOworCisgIC8vIEZJWE1FOiBEb24ndCBhbGxvY2F0ZSBzdG9yYWdlIGZvciB0aGVzZSBleGNlcHQgaW4gdGhlIGZpcnN0IGRlY2xhcmF0aW9uCisgIC8vIG9mIGEgdmlydHVhbCBkZXN0cnVjdG9yLgorICBGdW5jdGlvbkRlY2wgKk9wZXJhdG9yRGVsZXRlID0gbnVsbHB0cjsKKyAgRXhwciAqT3BlcmF0b3JEZWxldGVUaGlzQXJnID0gbnVsbHB0cjsKKworICBDWFhEZXN0cnVjdG9yRGVjbChBU1RDb250ZXh0ICZDLCBDWFhSZWNvcmREZWNsICpSRCwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULCBUeXBlU291cmNlSW5mbyAqVEluZm8sCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbmxpbmUsIGJvb2wgaXNJbXBsaWNpdGx5RGVjbGFyZWQpCisgICAgOiBDWFhNZXRob2REZWNsKENYWERlc3RydWN0b3IsIEMsIFJELCBTdGFydExvYywgTmFtZUluZm8sIFQsIFRJbmZvLAorICAgICAgICAgICAgICAgICAgICBTQ19Ob25lLCBpc0lubGluZSwgLyppc0NvbnN0ZXhwcj0qL2ZhbHNlLCBTb3VyY2VMb2NhdGlvbigpKQorICB7CisgICAgc2V0SW1wbGljaXQoaXNJbXBsaWNpdGx5RGVjbGFyZWQpOworICB9CisKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBzdGF0aWMgQ1hYRGVzdHJ1Y3RvckRlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBDWFhSZWNvcmREZWNsICpSRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULCBUeXBlU291cmNlSW5mbyogVEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbXBsaWNpdGx5RGVjbGFyZWQpOworICBzdGF0aWMgQ1hYRGVzdHJ1Y3RvckRlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICYgQywgdW5zaWduZWQgSUQpOworCisgIHZvaWQgc2V0T3BlcmF0b3JEZWxldGUoRnVuY3Rpb25EZWNsICpPRCwgRXhwciAqVGhpc0FyZyk7CisKKyAgY29uc3QgRnVuY3Rpb25EZWNsICpnZXRPcGVyYXRvckRlbGV0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Q2Fub25pY2FsRGVjbCgpLT5PcGVyYXRvckRlbGV0ZTsKKyAgfQorCisgIEV4cHIgKmdldE9wZXJhdG9yRGVsZXRlVGhpc0FyZygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Q2Fub25pY2FsRGVjbCgpLT5PcGVyYXRvckRlbGV0ZVRoaXNBcmc7CisgIH0KKworICBDWFhEZXN0cnVjdG9yRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gY2FzdDxDWFhEZXN0cnVjdG9yRGVjbD4oRnVuY3Rpb25EZWNsOjpnZXRDYW5vbmljYWxEZWNsKCkpOworICB9CisgIGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PENYWERlc3RydWN0b3JEZWNsKj4odGhpcyktPmdldENhbm9uaWNhbERlY2woKTsKKyAgfQorCisgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBDWFhEZXN0cnVjdG9yOyB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBDKysgY29udmVyc2lvbiBmdW5jdGlvbiB3aXRoaW4gYSBjbGFzcy4KKy8vLworLy8vIEZvciBleGFtcGxlOgorLy8vCisvLy8gXGNvZGUKKy8vLyBjbGFzcyBYIHsKKy8vLyBwdWJsaWM6CisvLy8gICBvcGVyYXRvciBib29sKCk7CisvLy8gfTsKKy8vLyBcZW5kY29kZQorY2xhc3MgQ1hYQ29udmVyc2lvbkRlY2wgOiBwdWJsaWMgQ1hYTWV0aG9kRGVjbCB7CisgIENYWENvbnZlcnNpb25EZWNsKEFTVENvbnRleHQgJkMsIENYWFJlY29yZERlY2wgKlJELCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmTmFtZUluZm8sIFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUSW5mbywgYm9vbCBpc0lubGluZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0V4cGxpY2l0U3BlY2lmaWVkLCBib29sIGlzQ29uc3RleHByLAorICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2NhdGlvbikKKyAgICAgIDogQ1hYTWV0aG9kRGVjbChDWFhDb252ZXJzaW9uLCBDLCBSRCwgU3RhcnRMb2MsIE5hbWVJbmZvLCBULCBUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICBTQ19Ob25lLCBpc0lubGluZSwgaXNDb25zdGV4cHIsIEVuZExvY2F0aW9uKSB7CisgICAgSXNFeHBsaWNpdFNwZWNpZmllZCA9IGlzRXhwbGljaXRTcGVjaWZpZWQ7CisgIH0KKworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNURGVjbFdyaXRlcjsKKworICBzdGF0aWMgQ1hYQ29udmVyc2lvbkRlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBDWFhSZWNvcmREZWNsICpSRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULCBUeXBlU291cmNlSW5mbyAqVEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbmxpbmUsIGJvb2wgaXNFeHBsaWNpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0NvbnN0ZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jYXRpb24pOworICBzdGF0aWMgQ1hYQ29udmVyc2lvbkRlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisKKyAgLy8vIFdoZXRoZXIgdGhpcyBmdW5jdGlvbiBpcyBtYXJrZWQgYXMgZXhwbGljaXQgZXhwbGljaXRseS4KKyAgYm9vbCBpc0V4cGxpY2l0U3BlY2lmaWVkKCkgY29uc3QgeyByZXR1cm4gSXNFeHBsaWNpdFNwZWNpZmllZDsgfQorCisgIC8vLyBXaGV0aGVyIHRoaXMgZnVuY3Rpb24gaXMgZXhwbGljaXQuCisgIGJvb2wgaXNFeHBsaWNpdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Q2Fub25pY2FsRGVjbCgpLT5pc0V4cGxpY2l0U3BlY2lmaWVkKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHR5cGUgdGhhdCB0aGlzIGNvbnZlcnNpb24gZnVuY3Rpb24gaXMgY29udmVydGluZyB0by4KKyAgUXVhbFR5cGUgZ2V0Q29udmVyc2lvblR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpLT5nZXRSZXR1cm5UeXBlKCk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY29udmVyc2lvbiBmdW5jdGlvbiBpcyBhIGNvbnZlcnNpb24gZnJvbQorICAvLy8gYSBsYW1iZGEgY2xvc3VyZSB0eXBlIHRvIGEgYmxvY2sgcG9pbnRlci4KKyAgYm9vbCBpc0xhbWJkYVRvQmxvY2tQb2ludGVyQ29udmVyc2lvbigpIGNvbnN0OworICAKKyAgQ1hYQ29udmVyc2lvbkRlY2wgKmdldENhbm9uaWNhbERlY2woKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIGNhc3Q8Q1hYQ29udmVyc2lvbkRlY2w+KEZ1bmN0aW9uRGVjbDo6Z2V0Q2Fub25pY2FsRGVjbCgpKTsKKyAgfQorICBjb25zdCBDWFhDb252ZXJzaW9uRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxDWFhDb252ZXJzaW9uRGVjbCo+KHRoaXMpLT5nZXRDYW5vbmljYWxEZWNsKCk7CisgIH0KKworICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC9ldGMuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gQ1hYQ29udmVyc2lvbjsgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgbGlua2FnZSBzcGVjaWZpY2F0aW9uLiAKKy8vLworLy8vIEZvciBleGFtcGxlOgorLy8vIFxjb2RlCisvLy8gICBleHRlcm4gIkMiIHZvaWQgZm9vKCk7CisvLy8gXGVuZGNvZGUKK2NsYXNzIExpbmthZ2VTcGVjRGVjbCA6IHB1YmxpYyBEZWNsLCBwdWJsaWMgRGVjbENvbnRleHQgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBSZXByZXNlbnRzIHRoZSBsYW5ndWFnZSBpbiBhIGxpbmthZ2Ugc3BlY2lmaWNhdGlvbi4KKyAgLy8vCisgIC8vLyBUaGUgdmFsdWVzIGFyZSBwYXJ0IG9mIHRoZSBzZXJpYWxpemF0aW9uIEFCSSBmb3IKKyAgLy8vIEFTVHMgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgYWx0ZXJpbmcgdGhhdCBBQkkuICBUbyBoZWxwCisgIC8vLyBlbnN1cmUgYSBzdGFibGUgQUJJIGZvciB0aGlzLCB3ZSBjaG9vc2UgdGhlIERXX0xBTkdfIGVuY29kaW5ncworICAvLy8gZnJvbSB0aGUgZHdhcmYgc3RhbmRhcmQuCisgIGVudW0gTGFuZ3VhZ2VJRHMgeworICAgIGxhbmdfYyA9IC8qIERXX0xBTkdfQyAqLyAweDAwMDIsCisgICAgbGFuZ19jeHggPSAvKiBEV19MQU5HX0NfcGx1c19wbHVzICovIDB4MDAwNAorICB9OworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIFRoZSBsYW5ndWFnZSBmb3IgdGhpcyBsaW5rYWdlIHNwZWNpZmljYXRpb24uCisgIHVuc2lnbmVkIExhbmd1YWdlIDogMzsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBsaW5rYWdlIHNwZWMgaGFzIGJyYWNlcy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IGhhc0JyYWNlcygpIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdoaWxlIHRoZQorICAvLy8gbGlua2FnZSBzcGVjIGJvZHkgaXMgYmVpbmcgcGFyc2VkLiAgT25jZSBSQnJhY2VMb2MgaGFzIGJlZW4gc2V0IHRoaXMgaXMKKyAgLy8vIG5vdCB1c2VkLCBzbyBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgc2VyaWFsaXplZC4KKyAgdW5zaWduZWQgSGFzQnJhY2VzIDogMTsKKworICAvLy8gXGJyaWVmIFRoZSBzb3VyY2UgbG9jYXRpb24gZm9yIHRoZSBleHRlcm4ga2V5d29yZC4KKyAgU291cmNlTG9jYXRpb24gRXh0ZXJuTG9jOworCisgIC8vLyBcYnJpZWYgVGhlIHNvdXJjZSBsb2NhdGlvbiBmb3IgdGhlIHJpZ2h0IGJyYWNlIChpZiB2YWxpZCkuCisgIFNvdXJjZUxvY2F0aW9uIFJCcmFjZUxvYzsKKworICBMaW5rYWdlU3BlY0RlY2woRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBFeHRlcm5Mb2MsCisgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMYW5nTG9jLCBMYW5ndWFnZUlEcyBsYW5nLCBib29sIEhhc0JyYWNlcykKKyAgICAgIDogRGVjbChMaW5rYWdlU3BlYywgREMsIExhbmdMb2MpLCBEZWNsQ29udGV4dChMaW5rYWdlU3BlYyksCisgICAgICAgIExhbmd1YWdlKGxhbmcpLCBIYXNCcmFjZXMoSGFzQnJhY2VzKSwgRXh0ZXJuTG9jKEV4dGVybkxvYyksCisgICAgICAgIFJCcmFjZUxvYyhTb3VyY2VMb2NhdGlvbigpKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBMaW5rYWdlU3BlY0RlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFeHRlcm5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMYW5nTG9jLCBMYW5ndWFnZUlEcyBMYW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNCcmFjZXMpOworICBzdGF0aWMgTGlua2FnZVNwZWNEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOworICAKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGxhbmd1YWdlIHNwZWNpZmllZCBieSB0aGlzIGxpbmthZ2Ugc3BlY2lmaWNhdGlvbi4KKyAgTGFuZ3VhZ2VJRHMgZ2V0TGFuZ3VhZ2UoKSBjb25zdCB7IHJldHVybiBMYW5ndWFnZUlEcyhMYW5ndWFnZSk7IH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWVkIGJ5IHRoaXMgbGlua2FnZSBzcGVjaWZpY2F0aW9uLgorICB2b2lkIHNldExhbmd1YWdlKExhbmd1YWdlSURzIEwpIHsgTGFuZ3VhZ2UgPSBMOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBsaW5rYWdlIHNwZWNpZmljYXRpb24gaGFkIGJyYWNlcyBpbgorICAvLy8gaXRzIHN5bnRhY3RpYyBmb3JtLgorICBib29sIGhhc0JyYWNlcygpIGNvbnN0IHsKKyAgICBhc3NlcnQoIVJCcmFjZUxvYy5pc1ZhbGlkKCkgfHwgSGFzQnJhY2VzKTsKKyAgICByZXR1cm4gSGFzQnJhY2VzOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0RXh0ZXJuTG9jKCkgY29uc3QgeyByZXR1cm4gRXh0ZXJuTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldFJCcmFjZUxvYygpIGNvbnN0IHsgcmV0dXJuIFJCcmFjZUxvYzsgfQorICB2b2lkIHNldEV4dGVybkxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IEV4dGVybkxvYyA9IEw7IH0KKyAgdm9pZCBzZXRSQnJhY2VMb2MoU291cmNlTG9jYXRpb24gTCkgeworICAgIFJCcmFjZUxvYyA9IEw7CisgICAgSGFzQnJhY2VzID0gUkJyYWNlTG9jLmlzVmFsaWQoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIGlmIChoYXNCcmFjZXMoKSkKKyAgICAgIHJldHVybiBnZXRSQnJhY2VMb2MoKTsKKyAgICAvLyBObyBicmFjZXM6IGdldCB0aGUgZW5kIGxvY2F0aW9uIG9mIHRoZSAob25seSkgZGVjbGFyYXRpb24gaW4gY29udGV4dAorICAgIC8vIChpZiBwcmVzZW50KS4KKyAgICByZXR1cm4gZGVjbHNfZW1wdHkoKSA/IGdldExvY2F0aW9uKCkgOiBkZWNsc19iZWdpbigpLT5nZXRMb2NFbmQoKTsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIFNvdXJjZVJhbmdlKEV4dGVybkxvYywgZ2V0TG9jRW5kKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBMaW5rYWdlU3BlYzsgfQorCisgIHN0YXRpYyBEZWNsQ29udGV4dCAqY2FzdFRvRGVjbENvbnRleHQoY29uc3QgTGlua2FnZVNwZWNEZWNsICpEKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PERlY2xDb250ZXh0ICo+KGNvbnN0X2Nhc3Q8TGlua2FnZVNwZWNEZWNsKj4oRCkpOworICB9CisKKyAgc3RhdGljIExpbmthZ2VTcGVjRGVjbCAqY2FzdEZyb21EZWNsQ29udGV4dChjb25zdCBEZWNsQ29udGV4dCAqREMpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TGlua2FnZVNwZWNEZWNsICo+KGNvbnN0X2Nhc3Q8RGVjbENvbnRleHQqPihEQykpOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgQysrIHVzaW5nLWRpcmVjdGl2ZS4KKy8vLworLy8vIEZvciBleGFtcGxlOgorLy8vIFxjb2RlCisvLy8gICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gXG5vdGUgVXNpbmdEaXJlY3RpdmVEZWNsIHNob3VsZCBiZSBEZWNsIG5vdCBOYW1lZERlY2wsIGJ1dCB3ZSBwcm92aWRlCisvLy8gYXJ0aWZpY2lhbCBuYW1lcyBmb3IgYWxsIHVzaW5nLWRpcmVjdGl2ZXMgaW4gb3JkZXIgdG8gc3RvcmUKKy8vLyB0aGVtIGluIERlY2xDb250ZXh0IGVmZmVjdGl2ZWx5LgorY2xhc3MgVXNpbmdEaXJlY3RpdmVEZWNsIDogcHVibGljIE5hbWVkRGVjbCB7CisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSBcYyB1c2luZyBrZXl3b3JkLgorICBTb3VyY2VMb2NhdGlvbiBVc2luZ0xvYzsKKworICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgXGMgbmFtZXNwYWNlIGtleXdvcmQuCisgIFNvdXJjZUxvY2F0aW9uIE5hbWVzcGFjZUxvYzsKKworICAvLy8gXGJyaWVmIFRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgdGhhdCBwcmVjZWRlcyB0aGUgbmFtZXNwYWNlLgorICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYzsKKworICAvLy8gXGJyaWVmIFRoZSBuYW1lc3BhY2Ugbm9taW5hdGVkIGJ5IHRoaXMgdXNpbmctZGlyZWN0aXZlLgorICBOYW1lZERlY2wgKk5vbWluYXRlZE5hbWVzcGFjZTsKKworICAvLy8gRW5jbG9zaW5nIGNvbnRleHQgY29udGFpbmluZyBib3RoIHVzaW5nLWRpcmVjdGl2ZSBhbmQgbm9taW5hdGVkCisgIC8vLyBuYW1lc3BhY2UuCisgIERlY2xDb250ZXh0ICpDb21tb25BbmNlc3RvcjsKKworICBVc2luZ0RpcmVjdGl2ZURlY2woRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBVc2luZ0xvYywKKyAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE5hbWVzcGNMb2MsCisgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYywKKyAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkZW50TG9jLAorICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpOb21pbmF0ZWQsCisgICAgICAgICAgICAgICAgICAgICBEZWNsQ29udGV4dCAqQ29tbW9uQW5jZXN0b3IpCisgICAgICA6IE5hbWVkRGVjbChVc2luZ0RpcmVjdGl2ZSwgREMsIElkZW50TG9jLCBnZXROYW1lKCkpLCBVc2luZ0xvYyhVc2luZ0xvYyksCisgICAgICAgIE5hbWVzcGFjZUxvYyhOYW1lc3BjTG9jKSwgUXVhbGlmaWVyTG9jKFF1YWxpZmllckxvYyksCisgICAgICAgIE5vbWluYXRlZE5hbWVzcGFjZShOb21pbmF0ZWQpLCBDb21tb25BbmNlc3RvcihDb21tb25BbmNlc3Rvcikge30KKworICAvLy8gXGJyaWVmIFJldHVybnMgc3BlY2lhbCBEZWNsYXJhdGlvbk5hbWUgdXNlZCBieSB1c2luZy1kaXJlY3RpdmVzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgb25seSB1c2VkIGJ5IERlY2xDb250ZXh0IGZvciBzdG9yaW5nIFVzaW5nRGlyZWN0aXZlRGVjbHMgaW4KKyAgLy8vIGl0cyBsb29rdXAgc3RydWN0dXJlLgorICBzdGF0aWMgRGVjbGFyYXRpb25OYW1lIGdldE5hbWUoKSB7CisgICAgcmV0dXJuIERlY2xhcmF0aW9uTmFtZTo6Z2V0VXNpbmdEaXJlY3RpdmVOYW1lKCk7CisgIH0KKworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworCisgIC8vIEZyaWVuZCBmb3IgZ2V0VXNpbmdEaXJlY3RpdmVOYW1lLgorICBmcmllbmQgY2xhc3MgRGVjbENvbnRleHQ7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHRoYXQgcXVhbGlmaWVzIHRoZQorICAvLy8gbmFtZSBvZiB0aGUgbmFtZXNwYWNlLCB3aXRoIHNvdXJjZS1sb2NhdGlvbiBpbmZvcm1hdGlvbi4KKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBnZXRRdWFsaWZpZXJMb2MoKSBjb25zdCB7IHJldHVybiBRdWFsaWZpZXJMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgdGhhdCBxdWFsaWZpZXMgdGhlCisgIC8vLyBuYW1lIG9mIHRoZSBuYW1lc3BhY2UuCisgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKmdldFF1YWxpZmllcigpIGNvbnN0IHsKKyAgICByZXR1cm4gUXVhbGlmaWVyTG9jLmdldE5lc3RlZE5hbWVTcGVjaWZpZXIoKTsKKyAgfQorCisgIE5hbWVkRGVjbCAqZ2V0Tm9taW5hdGVkTmFtZXNwYWNlQXNXcml0dGVuKCkgeyByZXR1cm4gTm9taW5hdGVkTmFtZXNwYWNlOyB9CisgIGNvbnN0IE5hbWVkRGVjbCAqZ2V0Tm9taW5hdGVkTmFtZXNwYWNlQXNXcml0dGVuKCkgY29uc3QgeworICAgIHJldHVybiBOb21pbmF0ZWROYW1lc3BhY2U7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG5hbWVzcGFjZSBub21pbmF0ZWQgYnkgdGhpcyB1c2luZy1kaXJlY3RpdmUuCisgIE5hbWVzcGFjZURlY2wgKmdldE5vbWluYXRlZE5hbWVzcGFjZSgpOworCisgIGNvbnN0IE5hbWVzcGFjZURlY2wgKmdldE5vbWluYXRlZE5hbWVzcGFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxVc2luZ0RpcmVjdGl2ZURlY2wqPih0aGlzKS0+Z2V0Tm9taW5hdGVkTmFtZXNwYWNlKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGNvbW1vbiBhbmNlc3RvciBjb250ZXh0IG9mIHRoaXMgdXNpbmctZGlyZWN0aXZlIGFuZAorICAvLy8gaXRzIG5vbWluYXRlZCBuYW1lc3BhY2UuCisgIERlY2xDb250ZXh0ICpnZXRDb21tb25BbmNlc3RvcigpIHsgcmV0dXJuIENvbW1vbkFuY2VzdG9yOyB9CisgIGNvbnN0IERlY2xDb250ZXh0ICpnZXRDb21tb25BbmNlc3RvcigpIGNvbnN0IHsgcmV0dXJuIENvbW1vbkFuY2VzdG9yOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBcYyB1c2luZyBrZXl3b3JkLgorICBTb3VyY2VMb2NhdGlvbiBnZXRVc2luZ0xvYygpIGNvbnN0IHsgcmV0dXJuIFVzaW5nTG9jOyB9CisKKyAgLy8gRklYTUU6IENvdWxkIG9taXQgJ0tleScgaW4gbmFtZS4KKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgXGMgbmFtZXNwYWNlIGtleXdvcmQuCisgIFNvdXJjZUxvY2F0aW9uIGdldE5hbWVzcGFjZUtleUxvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gTmFtZXNwYWNlTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGlzIHVzaW5nIGRlY2xhcmF0aW9uJ3MgaWRlbnRpZmllci4KKyAgU291cmNlTG9jYXRpb24gZ2V0SWRlbnRMb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIGdldExvY2F0aW9uKCk7IH0KKworICBzdGF0aWMgVXNpbmdEaXJlY3RpdmVEZWNsICpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVXNpbmdMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBOYW1lc3BhY2VMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkZW50TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpOb21pbmF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsQ29udGV4dCAqQ29tbW9uQW5jZXN0b3IpOworICBzdGF0aWMgVXNpbmdEaXJlY3RpdmVEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOworCisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIFNvdXJjZVJhbmdlKFVzaW5nTG9jLCBnZXRMb2NhdGlvbigpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gVXNpbmdEaXJlY3RpdmU7IH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIEMrKyBuYW1lc3BhY2UgYWxpYXMuCisvLy8KKy8vLyBGb3IgZXhhbXBsZToKKy8vLworLy8vIFxjb2RlCisvLy8gbmFtZXNwYWNlIEZvbyA9IEJhcjsKKy8vLyBcZW5kY29kZQorY2xhc3MgTmFtZXNwYWNlQWxpYXNEZWNsIDogcHVibGljIE5hbWVkRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBSZWRlY2xhcmFibGU8TmFtZXNwYWNlQWxpYXNEZWNsPiB7CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSBcYyBuYW1lc3BhY2Uga2V5d29yZC4KKyAgU291cmNlTG9jYXRpb24gTmFtZXNwYWNlTG9jOworCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSBuYW1lc3BhY2UncyBpZGVudGlmaWVyLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYWNjZXNzZWQgYnkgVGFyZ2V0TmFtZUxvYy4KKyAgU291cmNlTG9jYXRpb24gSWRlbnRMb2M7CisKKyAgLy8vIFxicmllZiBUaGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHRoYXQgcHJlY2VkZXMgdGhlIG5hbWVzcGFjZS4KKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2M7CisKKyAgLy8vIFxicmllZiBUaGUgRGVjbCB0aGF0IHRoaXMgYWxpYXMgcG9pbnRzIHRvLCBlaXRoZXIgYSBOYW1lc3BhY2VEZWNsIG9yCisgIC8vLyBhIE5hbWVzcGFjZUFsaWFzRGVjbC4KKyAgTmFtZWREZWNsICpOYW1lc3BhY2U7CisKKyAgTmFtZXNwYWNlQWxpYXNEZWNsKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE5hbWVzcGFjZUxvYywgU291cmNlTG9jYXRpb24gQWxpYXNMb2MsCisgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqQWxpYXMsIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgUXVhbGlmaWVyTG9jLAorICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRlbnRMb2MsIE5hbWVkRGVjbCAqTmFtZXNwYWNlKQorICAgICAgOiBOYW1lZERlY2woTmFtZXNwYWNlQWxpYXMsIERDLCBBbGlhc0xvYywgQWxpYXMpLCByZWRlY2xhcmFibGVfYmFzZShDKSwKKyAgICAgICAgTmFtZXNwYWNlTG9jKE5hbWVzcGFjZUxvYyksIElkZW50TG9jKElkZW50TG9jKSwKKyAgICAgICAgUXVhbGlmaWVyTG9jKFF1YWxpZmllckxvYyksIE5hbWVzcGFjZShOYW1lc3BhY2UpIHt9CisKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZSA9IFJlZGVjbGFyYWJsZTxOYW1lc3BhY2VBbGlhc0RlY2w+OworCisgIE5hbWVzcGFjZUFsaWFzRGVjbCAqZ2V0TmV4dFJlZGVjbGFyYXRpb25JbXBsKCkgb3ZlcnJpZGU7CisgIE5hbWVzcGFjZUFsaWFzRGVjbCAqZ2V0UHJldmlvdXNEZWNsSW1wbCgpIG92ZXJyaWRlOworICBOYW1lc3BhY2VBbGlhc0RlY2wgKmdldE1vc3RSZWNlbnREZWNsSW1wbCgpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIHN0YXRpYyBOYW1lc3BhY2VBbGlhc0RlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBOYW1lc3BhY2VMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBbGlhc0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpBbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgUXVhbGlmaWVyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRlbnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKk5hbWVzcGFjZSk7CisKKyAgc3RhdGljIE5hbWVzcGFjZUFsaWFzRGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKKworICB1c2luZyByZWRlY2xfcmFuZ2UgPSByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsX3JhbmdlOworICB1c2luZyByZWRlY2xfaXRlcmF0b3IgPSByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsX2l0ZXJhdG9yOworCisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xzX2JlZ2luOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsc19lbmQ7CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xzOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6Z2V0UHJldmlvdXNEZWNsOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6Z2V0TW9zdFJlY2VudERlY2w7CisKKyAgTmFtZXNwYWNlQWxpYXNEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRGaXJzdERlY2woKTsKKyAgfQorICBjb25zdCBOYW1lc3BhY2VBbGlhc0RlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEZpcnN0RGVjbCgpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHRoYXQgcXVhbGlmaWVzIHRoZQorICAvLy8gbmFtZSBvZiB0aGUgbmFtZXNwYWNlLCB3aXRoIHNvdXJjZS1sb2NhdGlvbiBpbmZvcm1hdGlvbi4KKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBnZXRRdWFsaWZpZXJMb2MoKSBjb25zdCB7IHJldHVybiBRdWFsaWZpZXJMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgdGhhdCBxdWFsaWZpZXMgdGhlCisgIC8vLyBuYW1lIG9mIHRoZSBuYW1lc3BhY2UuCisgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKmdldFF1YWxpZmllcigpIGNvbnN0IHsKKyAgICByZXR1cm4gUXVhbGlmaWVyTG9jLmdldE5lc3RlZE5hbWVTcGVjaWZpZXIoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBhbGlhc2VkIGJ5IHRoaXMgZGlyZWN0aXZlLgorICBOYW1lc3BhY2VEZWNsICpnZXROYW1lc3BhY2UoKSB7CisgICAgaWYgKE5hbWVzcGFjZUFsaWFzRGVjbCAqQUQgPSBkeW5fY2FzdDxOYW1lc3BhY2VBbGlhc0RlY2w+KE5hbWVzcGFjZSkpCisgICAgICByZXR1cm4gQUQtPmdldE5hbWVzcGFjZSgpOworCisgICAgcmV0dXJuIGNhc3Q8TmFtZXNwYWNlRGVjbD4oTmFtZXNwYWNlKTsKKyAgfQorCisgIGNvbnN0IE5hbWVzcGFjZURlY2wgKmdldE5hbWVzcGFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxOYW1lc3BhY2VBbGlhc0RlY2wqPih0aGlzKS0+Z2V0TmFtZXNwYWNlKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIGFsaWFzIG5hbWUsIGkuZS4gJ2ZvbycgaW4KKyAgLy8vICJuYW1lc3BhY2UgZm9vID0gbnM6OmJhcjsiLgorICBTb3VyY2VMb2NhdGlvbiBnZXRBbGlhc0xvYygpIGNvbnN0IHsgcmV0dXJuIGdldExvY2F0aW9uKCk7IH0KKworICAvLy8gUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIFxjIG5hbWVzcGFjZSBrZXl3b3JkLgorICBTb3VyY2VMb2NhdGlvbiBnZXROYW1lc3BhY2VMb2MoKSBjb25zdCB7IHJldHVybiBOYW1lc3BhY2VMb2M7IH0KKworICAvLy8gUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIGlkZW50aWZpZXIgaW4gdGhlIG5hbWVkIG5hbWVzcGFjZS4KKyAgU291cmNlTG9jYXRpb24gZ2V0VGFyZ2V0TmFtZUxvYygpIGNvbnN0IHsgcmV0dXJuIElkZW50TG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmFtZXNwYWNlIHRoYXQgdGhpcyBhbGlhcyByZWZlcnMgdG8sIHdoaWNoCisgIC8vLyBtYXkgZWl0aGVyIGJlIGEgTmFtZXNwYWNlRGVjbCBvciBhIE5hbWVzcGFjZUFsaWFzRGVjbC4KKyAgTmFtZWREZWNsICpnZXRBbGlhc2VkTmFtZXNwYWNlKCkgY29uc3QgeyByZXR1cm4gTmFtZXNwYWNlOyB9CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoTmFtZXNwYWNlTG9jLCBJZGVudExvYyk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IE5hbWVzcGFjZUFsaWFzOyB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBzaGFkb3cgZGVjbGFyYXRpb24gaW50cm9kdWNlZCBpbnRvIGEgc2NvcGUgYnkgYQorLy8vIChyZXNvbHZlZCkgdXNpbmcgZGVjbGFyYXRpb24uCisvLy8KKy8vLyBGb3IgZXhhbXBsZSwKKy8vLyBcY29kZQorLy8vIG5hbWVzcGFjZSBBIHsKKy8vLyAgIHZvaWQgZm9vKCk7CisvLy8gfQorLy8vIG5hbWVzcGFjZSBCIHsKKy8vLyAgIHVzaW5nIEE6OmZvbzsgLy8gPC0gYSBVc2luZ0RlY2wKKy8vLyAgICAgICAgICAgICAgICAgLy8gQWxzbyBjcmVhdGVzIGEgVXNpbmdTaGFkb3dEZWNsIGZvciBBOjpmb28oKSBpbiBCCisvLy8gfQorLy8vIFxlbmRjb2RlCitjbGFzcyBVc2luZ1NoYWRvd0RlY2wgOiBwdWJsaWMgTmFtZWREZWNsLCBwdWJsaWMgUmVkZWNsYXJhYmxlPFVzaW5nU2hhZG93RGVjbD4geworICBmcmllbmQgY2xhc3MgVXNpbmdEZWNsOworCisgIC8vLyBUaGUgcmVmZXJlbmNlZCBkZWNsYXJhdGlvbi4KKyAgTmFtZWREZWNsICpVbmRlcmx5aW5nID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFRoZSB1c2luZyBkZWNsYXJhdGlvbiB3aGljaCBpbnRyb2R1Y2VkIHRoaXMgZGVjbCBvciB0aGUgbmV4dCB1c2luZworICAvLy8gc2hhZG93IGRlY2xhcmF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgYWZvcmVtZW50aW9uZWQgdXNpbmcgZGVjbGFyYXRpb24uCisgIE5hbWVkRGVjbCAqVXNpbmdPck5leHRTaGFkb3cgPSBudWxscHRyOworCisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2UgPSBSZWRlY2xhcmFibGU8VXNpbmdTaGFkb3dEZWNsPjsKKworICBVc2luZ1NoYWRvd0RlY2wgKmdldE5leHRSZWRlY2xhcmF0aW9uSW1wbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0TmV4dFJlZGVjbGFyYXRpb24oKTsKKyAgfQorCisgIFVzaW5nU2hhZG93RGVjbCAqZ2V0UHJldmlvdXNEZWNsSW1wbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0UHJldmlvdXNEZWNsKCk7CisgIH0KKworICBVc2luZ1NoYWRvd0RlY2wgKmdldE1vc3RSZWNlbnREZWNsSW1wbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0TW9zdFJlY2VudERlY2woKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIFVzaW5nU2hhZG93RGVjbChLaW5kIEssIEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgVXNpbmdEZWNsICpVc2luZywgTmFtZWREZWNsICpUYXJnZXQpOworICBVc2luZ1NoYWRvd0RlY2woS2luZCBLLCBBU1RDb250ZXh0ICZDLCBFbXB0eVNoZWxsKTsKKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisKKyAgc3RhdGljIFVzaW5nU2hhZG93RGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywgVXNpbmdEZWNsICpVc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkRGVjbCAqVGFyZ2V0KSB7CisgICAgcmV0dXJuIG5ldyAoQywgREMpIFVzaW5nU2hhZG93RGVjbChVc2luZ1NoYWRvdywgQywgREMsIExvYywgVXNpbmcsIFRhcmdldCk7CisgIH0KKworICBzdGF0aWMgVXNpbmdTaGFkb3dEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOworCisgIHVzaW5nIHJlZGVjbF9yYW5nZSA9IHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xfcmFuZ2U7CisgIHVzaW5nIHJlZGVjbF9pdGVyYXRvciA9IHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xfaXRlcmF0b3I7CisKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHNfYmVnaW47CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xzX2VuZDsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHM7CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpnZXRQcmV2aW91c0RlY2w7CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpnZXRNb3N0UmVjZW50RGVjbDsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmlzRmlyc3REZWNsOworCisgIFVzaW5nU2hhZG93RGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0Rmlyc3REZWNsKCk7CisgIH0KKyAgY29uc3QgVXNpbmdTaGFkb3dEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRGaXJzdERlY2woKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0cyB0aGUgdW5kZXJseWluZyBkZWNsYXJhdGlvbiB3aGljaCBoYXMgYmVlbiBicm91Z2h0IGludG8gdGhlCisgIC8vLyBsb2NhbCBzY29wZS4KKyAgTmFtZWREZWNsICpnZXRUYXJnZXREZWNsKCkgY29uc3QgeyByZXR1cm4gVW5kZXJseWluZzsgfQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgdW5kZXJseWluZyBkZWNsYXJhdGlvbiB3aGljaCBoYXMgYmVlbiBicm91Z2h0IGludG8gdGhlCisgIC8vLyBsb2NhbCBzY29wZS4KKyAgdm9pZCBzZXRUYXJnZXREZWNsKE5hbWVkRGVjbCAqTkQpIHsKKyAgICBhc3NlcnQoTkQgJiYgIlRhcmdldCBkZWNsIGlzIG51bGwhIik7CisgICAgVW5kZXJseWluZyA9IE5EOworICAgIC8vIEEgVXNpbmdTaGFkb3dEZWNsIGlzIG5ldmVyIGEgZnJpZW5kIG9yIGxvY2FsIGV4dGVybiBkZWNsYXJhdGlvbiwgZXZlbgorICAgIC8vIGlmIGl0IGlzIGEgc2hhZG93IGRlY2xhcmF0aW9uIGZvciBvbmUuCisgICAgSWRlbnRpZmllck5hbWVzcGFjZSA9CisgICAgICAgIE5ELT5nZXRJZGVudGlmaWVyTmFtZXNwYWNlKCkgJgorICAgICAgICB+KElETlNfT3JkaW5hcnlGcmllbmQgfCBJRE5TX1RhZ0ZyaWVuZCB8IElETlNfTG9jYWxFeHRlcm4pOworICB9CisKKyAgLy8vIFxicmllZiBHZXRzIHRoZSB1c2luZyBkZWNsYXJhdGlvbiB0byB3aGljaCB0aGlzIGRlY2xhcmF0aW9uIGlzIHRpZWQuCisgIFVzaW5nRGVjbCAqZ2V0VXNpbmdEZWNsKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUaGUgbmV4dCB1c2luZyBzaGFkb3cgZGVjbGFyYXRpb24gY29udGFpbmVkIGluIHRoZSBzaGFkb3cgZGVjbAorICAvLy8gY2hhaW4gb2YgdGhlIHVzaW5nIGRlY2xhcmF0aW9uIHdoaWNoIGludHJvZHVjZWQgdGhpcyBkZWNsLgorICBVc2luZ1NoYWRvd0RlY2wgKmdldE5leHRVc2luZ1NoYWRvd0RlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGR5bl9jYXN0X29yX251bGw8VXNpbmdTaGFkb3dEZWNsPihVc2luZ09yTmV4dFNoYWRvdyk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7CisgICAgcmV0dXJuIEsgPT0gRGVjbDo6VXNpbmdTaGFkb3cgfHwgSyA9PSBEZWNsOjpDb25zdHJ1Y3RvclVzaW5nU2hhZG93OworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBzaGFkb3cgY29uc3RydWN0b3IgZGVjbGFyYXRpb24gaW50cm9kdWNlZCBpbnRvIGEKKy8vLyBjbGFzcyBieSBhIEMrKzExIHVzaW5nLWRlY2xhcmF0aW9uIHRoYXQgbmFtZXMgYSBjb25zdHJ1Y3Rvci4KKy8vLworLy8vIEZvciBleGFtcGxlOgorLy8vIFxjb2RlCisvLy8gc3RydWN0IEJhc2UgeyBCYXNlKGludCk7IH07CisvLy8gc3RydWN0IERlcml2ZWQgeworLy8vICAgIHVzaW5nIEJhc2U6OkJhc2U7IC8vIGNyZWF0ZXMgYSBVc2luZ0RlY2wgYW5kIGEgQ29uc3RydWN0b3JVc2luZ1NoYWRvd0RlY2wKKy8vLyB9OworLy8vIFxlbmRjb2RlCitjbGFzcyBDb25zdHJ1Y3RvclVzaW5nU2hhZG93RGVjbCBmaW5hbCA6IHB1YmxpYyBVc2luZ1NoYWRvd0RlY2wgeworICAvLy8gXGJyaWVmIElmIHRoaXMgY29uc3RydWN0b3IgdXNpbmcgZGVjbGFyYXRpb24gaW5oZXJ0ZWQgdGhlIGNvbnN0cnVjdG9yCisgIC8vLyBmcm9tIGFuIGluZGlyZWN0IGJhc2UgY2xhc3MsIHRoaXMgaXMgdGhlIENvbnN0cnVjdG9yVXNpbmdTaGFkb3dEZWNsCisgIC8vLyBpbiB0aGUgbmFtZWQgZGlyZWN0IGJhc2UgY2xhc3MgZnJvbSB3aGljaCB0aGUgZGVjbGFyYXRpb24gd2FzIGluaGVyaXRlZC4KKyAgQ29uc3RydWN0b3JVc2luZ1NoYWRvd0RlY2wgKk5vbWluYXRlZEJhc2VDbGFzc1NoYWRvd0RlY2wgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgSWYgdGhpcyBjb25zdHJ1Y3RvciB1c2luZyBkZWNsYXJhdGlvbiBpbmhlcnRlZCB0aGUgY29uc3RydWN0b3IKKyAgLy8vIGZyb20gYW4gaW5kaXJlY3QgYmFzZSBjbGFzcywgdGhpcyBpcyB0aGUgQ29uc3RydWN0b3JVc2luZ1NoYWRvd0RlY2wKKyAgLy8vIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgdW5pcXVlIGRpcmVjdCBvciB2aXJ0dWFsIGJhc2UgY2xhc3MKKyAgLy8vIHRoYXQgcmVjZWl2ZXMgdGhlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cy4KKyAgQ29uc3RydWN0b3JVc2luZ1NoYWRvd0RlY2wgKkNvbnN0cnVjdGVkQmFzZUNsYXNzU2hhZG93RGVjbCA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBcYyB0cnVlIGlmIHRoZSBjb25zdHJ1Y3RvciB1bHRpbWF0ZWx5IG5hbWVkIGJ5IHRoaXMgdXNpbmcgc2hhZG93CisgIC8vLyBkZWNsYXJhdGlvbiBpcyB3aXRoaW4gYSB2aXJ0dWFsIGJhc2UgY2xhc3Mgc3Vib2JqZWN0IG9mIHRoZSBjbGFzcyB0aGF0CisgIC8vLyBjb250YWlucyB0aGlzIGRlY2xhcmF0aW9uLgorICB1bnNpZ25lZCBJc1ZpcnR1YWwgOiAxOworCisgIENvbnN0cnVjdG9yVXNpbmdTaGFkb3dEZWNsKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2luZ0RlY2wgKlVzaW5nLCBOYW1lZERlY2wgKlRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBUYXJnZXRJblZpcnR1YWxCYXNlKQorICAgICAgOiBVc2luZ1NoYWRvd0RlY2woQ29uc3RydWN0b3JVc2luZ1NoYWRvdywgQywgREMsIExvYywgVXNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQtPmdldFVuZGVybHlpbmdEZWNsKCkpLAorICAgICAgICBOb21pbmF0ZWRCYXNlQ2xhc3NTaGFkb3dEZWNsKAorICAgICAgICAgICAgZHluX2Nhc3Q8Q29uc3RydWN0b3JVc2luZ1NoYWRvd0RlY2w+KFRhcmdldCkpLAorICAgICAgICBDb25zdHJ1Y3RlZEJhc2VDbGFzc1NoYWRvd0RlY2woTm9taW5hdGVkQmFzZUNsYXNzU2hhZG93RGVjbCksCisgICAgICAgIElzVmlydHVhbChUYXJnZXRJblZpcnR1YWxCYXNlKSB7CisgICAgLy8gSWYgd2UgZm91bmQgYSBjb25zdHJ1Y3RvciB0aGF0IGNoYWlucyB0byBhIGNvbnN0cnVjdG9yIGZvciBhIHZpcnR1YWwKKyAgICAvLyBiYXNlLCB3ZSBzaG91bGQgZGlyZWN0bHkgY2FsbCB0aGF0IHZpcnR1YWwgYmFzZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLgorICAgIC8vIEZJWE1FOiBUaGlzIGxvZ2ljIGJlbG9uZ3MgaW4gU2VtYS4KKyAgICBpZiAoTm9taW5hdGVkQmFzZUNsYXNzU2hhZG93RGVjbCAmJgorICAgICAgICBOb21pbmF0ZWRCYXNlQ2xhc3NTaGFkb3dEZWNsLT5jb25zdHJ1Y3RzVmlydHVhbEJhc2UoKSkgeworICAgICAgQ29uc3RydWN0ZWRCYXNlQ2xhc3NTaGFkb3dEZWNsID0KKyAgICAgICAgICBOb21pbmF0ZWRCYXNlQ2xhc3NTaGFkb3dEZWNsLT5Db25zdHJ1Y3RlZEJhc2VDbGFzc1NoYWRvd0RlY2w7CisgICAgICBJc1ZpcnR1YWwgPSB0cnVlOworICAgIH0KKyAgfQorCisgIENvbnN0cnVjdG9yVXNpbmdTaGFkb3dEZWNsKEFTVENvbnRleHQgJkMsIEVtcHR5U2hlbGwgRW1wdHkpCisgICAgICA6IFVzaW5nU2hhZG93RGVjbChDb25zdHJ1Y3RvclVzaW5nU2hhZG93LCBDLCBFbXB0eSksIElzVmlydHVhbChmYWxzZSkge30KKworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNURGVjbFdyaXRlcjsKKworICBzdGF0aWMgQ29uc3RydWN0b3JVc2luZ1NoYWRvd0RlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNpbmdEZWNsICpVc2luZywgTmFtZWREZWNsICpUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNWaXJ0dWFsKTsKKyAgc3RhdGljIENvbnN0cnVjdG9yVXNpbmdTaGFkb3dEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpOworCisgIC8vLyBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhpcyB1c2luZyBzaGFkb3cgZGVjbGFyYXRpb24sIHdoaWNoCisgIC8vLyBpcyB0aGUgY2xhc3MgaW4gd2hpY2ggdGhpcyBpcyBkZWNsYXJlZC4KKyAgLy9AeworICBjb25zdCBDWFhSZWNvcmREZWNsICpnZXRQYXJlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oZ2V0RGVjbENvbnRleHQoKSk7CisgIH0KKyAgQ1hYUmVjb3JkRGVjbCAqZ2V0UGFyZW50KCkgeworICAgIHJldHVybiBjYXN0PENYWFJlY29yZERlY2w+KGdldERlY2xDb250ZXh0KCkpOworICB9CisgIC8vQH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgaW5oZXJpdGluZyBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbiBmb3IgdGhlIGRpcmVjdCBiYXNlCisgIC8vLyBjbGFzcyBmcm9tIHdoaWNoIHRoaXMgdXNpbmcgc2hhZG93IGRlY2xhcmF0aW9uIHdhcyBpbmhlcml0ZWQsIGlmIHRoZXJlIGlzCisgIC8vLyBvbmUuIFRoaXMgY2FuIGJlIGRpZmZlcmVudCBmb3IgZWFjaCByZWRlY2xhcmF0aW9uIG9mIHRoZSBzYW1lIHNoYWRvdyBkZWNsLgorICBDb25zdHJ1Y3RvclVzaW5nU2hhZG93RGVjbCAqZ2V0Tm9taW5hdGVkQmFzZUNsYXNzU2hhZG93RGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9taW5hdGVkQmFzZUNsYXNzU2hhZG93RGVjbDsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBpbmhlcml0aW5nIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uIGZvciB0aGUgYmFzZSBjbGFzcworICAvLy8gZm9yIHdoaWNoIHdlIGRvbid0IGhhdmUgYW4gZXhwbGljaXQgaW5pdGlhbGl6ZXIsIGlmIHRoZXJlIGlzIG9uZS4KKyAgQ29uc3RydWN0b3JVc2luZ1NoYWRvd0RlY2wgKmdldENvbnN0cnVjdGVkQmFzZUNsYXNzU2hhZG93RGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RydWN0ZWRCYXNlQ2xhc3NTaGFkb3dEZWNsOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGJhc2UgY2xhc3MgdGhhdCB3YXMgbmFtZWQgaW4gdGhlIHVzaW5nIGRlY2xhcmF0aW9uLiBUaGlzCisgIC8vLyBjYW4gYmUgZGlmZmVyZW50IGZvciBlYWNoIHJlZGVjbGFyYXRpb24gb2YgdGhpcyBzYW1lIHNoYWRvdyBkZWNsLgorICBDWFhSZWNvcmREZWNsICpnZXROb21pbmF0ZWRCYXNlQ2xhc3MoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgYmFzZSBjbGFzcyB3aG9zZSBjb25zdHJ1Y3RvciBvciBjb25zdHJ1Y3RvciBzaGFkb3cKKyAgLy8vIGRlY2xhcmF0aW9uIGlzIHBhc3NlZCB0aGUgY29uc3RydWN0b3IgYXJndW1lbnRzLgorICBDWFhSZWNvcmREZWNsICpnZXRDb25zdHJ1Y3RlZEJhc2VDbGFzcygpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxDWFhSZWNvcmREZWNsPigoQ29uc3RydWN0ZWRCYXNlQ2xhc3NTaGFkb3dEZWNsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IENvbnN0cnVjdGVkQmFzZUNsYXNzU2hhZG93RGVjbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRUYXJnZXREZWNsKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0RGVjbENvbnRleHQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgXGMgdHJ1ZSBpZiB0aGUgY29uc3RydWN0ZWQgYmFzZSBjbGFzcyBpcyBhIHZpcnR1YWwgYmFzZQorICAvLy8gY2xhc3Mgc3Vib2JqZWN0IG9mIHRoaXMgZGVjbGFyYXRpb24ncyBjbGFzcy4KKyAgYm9vbCBjb25zdHJ1Y3RzVmlydHVhbEJhc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIElzVmlydHVhbDsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBjb25zdHJ1Y3RvciBvciBjb25zdHJ1Y3RvciB0ZW1wbGF0ZSBpbiB0aGUgZGVyaXZlZCBjbGFzcworICAvLy8gY29ycmVzcG5kaW5nIHRvIHRoaXMgdXNpbmcgc2hhZG93IGRlY2xhcmF0aW9uLCBpZiBpdCBoYXMgYmVlbiBpbXBsaWNpdGx5CisgIC8vLyBkZWNsYXJlZCBhbHJlYWR5LgorICBDWFhDb25zdHJ1Y3RvckRlY2wgKmdldENvbnN0cnVjdG9yKCkgY29uc3Q7CisgIHZvaWQgc2V0Q29uc3RydWN0b3IoTmFtZWREZWNsICpDdG9yKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IENvbnN0cnVjdG9yVXNpbmdTaGFkb3c7IH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIEMrKyB1c2luZy1kZWNsYXJhdGlvbi4KKy8vLworLy8vIEZvciBleGFtcGxlOgorLy8vIFxjb2RlCisvLy8gICAgdXNpbmcgc29tZU5hbWVTcGFjZTo6c29tZUlkZW50aWZpZXI7CisvLy8gXGVuZGNvZGUKK2NsYXNzIFVzaW5nRGVjbCA6IHB1YmxpYyBOYW1lZERlY2wsIHB1YmxpYyBNZXJnZWFibGU8VXNpbmdEZWNsPiB7CisgIC8vLyBcYnJpZWYgVGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgJ3VzaW5nJyBrZXl3b3JkIGl0c2VsZi4KKyAgU291cmNlTG9jYXRpb24gVXNpbmdMb2NhdGlvbjsKKworICAvLy8gXGJyaWVmIFRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgdGhhdCBwcmVjZWRlcyB0aGUgbmFtZS4KKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2M7CisKKyAgLy8vIFxicmllZiBQcm92aWRlcyBzb3VyY2UvdHlwZSBsb2NhdGlvbiBpbmZvIGZvciB0aGUgZGVjbGFyYXRpb24gbmFtZQorICAvLy8gZW1iZWRkZWQgaW4gdGhlIFZhbHVlRGVjbCBiYXNlIGNsYXNzLgorICBEZWNsYXJhdGlvbk5hbWVMb2MgRE5Mb2M7CisKKyAgLy8vIFxicmllZiBUaGUgZmlyc3Qgc2hhZG93IGRlY2xhcmF0aW9uIG9mIHRoZSBzaGFkb3cgZGVjbCBjaGFpbiBhc3NvY2lhdGVkCisgIC8vLyB3aXRoIHRoaXMgdXNpbmcgZGVjbGFyYXRpb24uCisgIC8vLworICAvLy8gVGhlIGJvb2wgbWVtYmVyIG9mIHRoZSBwYWlyIHN0b3JlIHdoZXRoZXIgdGhpcyBkZWNsIGhhcyB0aGUgXGMgdHlwZW5hbWUKKyAgLy8vIGtleXdvcmQuCisgIGxsdm06OlBvaW50ZXJJbnRQYWlyPFVzaW5nU2hhZG93RGVjbCAqLCAxLCBib29sPiBGaXJzdFVzaW5nU2hhZG93OworCisgIFVzaW5nRGVjbChEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIFVMLAorICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MsCisgICAgICAgICAgICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZOYW1lSW5mbywgYm9vbCBIYXNUeXBlbmFtZUtleXdvcmQpCisgICAgOiBOYW1lZERlY2woVXNpbmcsIERDLCBOYW1lSW5mby5nZXRMb2MoKSwgTmFtZUluZm8uZ2V0TmFtZSgpKSwKKyAgICAgIFVzaW5nTG9jYXRpb24oVUwpLCBRdWFsaWZpZXJMb2MoUXVhbGlmaWVyTG9jKSwKKyAgICAgIEROTG9jKE5hbWVJbmZvLmdldEluZm8oKSksIEZpcnN0VXNpbmdTaGFkb3cobnVsbHB0ciwgSGFzVHlwZW5hbWVLZXl3b3JkKSB7CisgIH0KKworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNURGVjbFdyaXRlcjsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSAndXNpbmcnIGtleXdvcmQuCisgIFNvdXJjZUxvY2F0aW9uIGdldFVzaW5nTG9jKCkgY29uc3QgeyByZXR1cm4gVXNpbmdMb2NhdGlvbjsgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlICd1c2luZycga2V5d29yZC4KKyAgdm9pZCBzZXRVc2luZ0xvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IFVzaW5nTG9jYXRpb24gPSBMOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHRoYXQgcXVhbGlmaWVzIHRoZSBuYW1lLAorICAvLy8gd2l0aCBzb3VyY2UtbG9jYXRpb24gaW5mb3JtYXRpb24uCisgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgZ2V0UXVhbGlmaWVyTG9jKCkgY29uc3QgeyByZXR1cm4gUXVhbGlmaWVyTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHRoYXQgcXVhbGlmaWVzIHRoZSBuYW1lLgorICBOZXN0ZWROYW1lU3BlY2lmaWVyICpnZXRRdWFsaWZpZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFF1YWxpZmllckxvYy5nZXROZXN0ZWROYW1lU3BlY2lmaWVyKCk7CisgIH0KKworICBEZWNsYXJhdGlvbk5hbWVJbmZvIGdldE5hbWVJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBEZWNsYXJhdGlvbk5hbWVJbmZvKGdldERlY2xOYW1lKCksIGdldExvY2F0aW9uKCksIEROTG9jKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgaXQgaXMgYSBDKyswMyBhY2Nlc3MgZGVjbGFyYXRpb24gKG5vICd1c2luZycpLgorICBib29sIGlzQWNjZXNzRGVjbGFyYXRpb24oKSBjb25zdCB7IHJldHVybiBVc2luZ0xvY2F0aW9uLmlzSW52YWxpZCgpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdXNpbmcgZGVjbGFyYXRpb24gaGFzICd0eXBlbmFtZScuCisgIGJvb2wgaGFzVHlwZW5hbWUoKSBjb25zdCB7IHJldHVybiBGaXJzdFVzaW5nU2hhZG93LmdldEludCgpOyB9CisKKyAgLy8vIFxicmllZiBTZXRzIHdoZXRoZXIgdGhlIHVzaW5nIGRlY2xhcmF0aW9uIGhhcyAndHlwZW5hbWUnLgorICB2b2lkIHNldFR5cGVuYW1lKGJvb2wgVE4pIHsgRmlyc3RVc2luZ1NoYWRvdy5zZXRJbnQoVE4pOyB9CisKKyAgLy8vIFxicmllZiBJdGVyYXRlcyB0aHJvdWdoIHRoZSB1c2luZyBzaGFkb3cgZGVjbGFyYXRpb25zIGFzc29jaWF0ZWQgd2l0aAorICAvLy8gdGhpcyB1c2luZyBkZWNsYXJhdGlvbi4KKyAgY2xhc3Mgc2hhZG93X2l0ZXJhdG9yIHsKKyAgICAvLy8gXGJyaWVmIFRoZSBjdXJyZW50IHVzaW5nIHNoYWRvdyBkZWNsYXJhdGlvbi4KKyAgICBVc2luZ1NoYWRvd0RlY2wgKkN1cnJlbnQgPSBudWxscHRyOworCisgIHB1YmxpYzoKKyAgICB1c2luZyB2YWx1ZV90eXBlID0gVXNpbmdTaGFkb3dEZWNsICo7CisgICAgdXNpbmcgcmVmZXJlbmNlID0gVXNpbmdTaGFkb3dEZWNsICo7CisgICAgdXNpbmcgcG9pbnRlciA9IFVzaW5nU2hhZG93RGVjbCAqOworICAgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZzsKKyAgICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBzdGQ6OnB0cmRpZmZfdDsKKworICAgIHNoYWRvd19pdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCBzaGFkb3dfaXRlcmF0b3IoVXNpbmdTaGFkb3dEZWNsICpDKSA6IEN1cnJlbnQoQykge30KKworICAgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBDdXJyZW50OyB9CisgICAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gQ3VycmVudDsgfQorCisgICAgc2hhZG93X2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeworICAgICAgQ3VycmVudCA9IEN1cnJlbnQtPmdldE5leHRVc2luZ1NoYWRvd0RlY2woKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBzaGFkb3dfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKKyAgICAgIHNoYWRvd19pdGVyYXRvciB0bXAoKnRoaXMpOworICAgICAgKysoKnRoaXMpOworICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KHNoYWRvd19pdGVyYXRvciB4LCBzaGFkb3dfaXRlcmF0b3IgeSkgeworICAgICAgcmV0dXJuIHguQ3VycmVudCA9PSB5LkN1cnJlbnQ7CisgICAgfQorICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oc2hhZG93X2l0ZXJhdG9yIHgsIHNoYWRvd19pdGVyYXRvciB5KSB7CisgICAgICByZXR1cm4geC5DdXJyZW50ICE9IHkuQ3VycmVudDsKKyAgICB9CisgIH07CisKKyAgdXNpbmcgc2hhZG93X3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c2hhZG93X2l0ZXJhdG9yPjsKKworICBzaGFkb3dfcmFuZ2Ugc2hhZG93cygpIGNvbnN0IHsKKyAgICByZXR1cm4gc2hhZG93X3JhbmdlKHNoYWRvd19iZWdpbigpLCBzaGFkb3dfZW5kKCkpOworICB9CisKKyAgc2hhZG93X2l0ZXJhdG9yIHNoYWRvd19iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gc2hhZG93X2l0ZXJhdG9yKEZpcnN0VXNpbmdTaGFkb3cuZ2V0UG9pbnRlcigpKTsKKyAgfQorCisgIHNoYWRvd19pdGVyYXRvciBzaGFkb3dfZW5kKCkgY29uc3QgeyByZXR1cm4gc2hhZG93X2l0ZXJhdG9yKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIHNoYWRvd2VkIGRlY2xhcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcworICAvLy8gdXNpbmcgZGVjbGFyYXRpb24uCisgIHVuc2lnbmVkIHNoYWRvd19zaXplKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OmRpc3RhbmNlKHNoYWRvd19iZWdpbigpLCBzaGFkb3dfZW5kKCkpOworICB9CisKKyAgdm9pZCBhZGRTaGFkb3dEZWNsKFVzaW5nU2hhZG93RGVjbCAqUyk7CisgIHZvaWQgcmVtb3ZlU2hhZG93RGVjbChVc2luZ1NoYWRvd0RlY2wgKlMpOworCisgIHN0YXRpYyBVc2luZ0RlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBVc2luZ0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNUeXBlbmFtZUtleXdvcmQpOworCisgIHN0YXRpYyBVc2luZ0RlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZOworCisgIC8vLyBSZXRyaWV2ZXMgdGhlIGNhbm9uaWNhbCBkZWNsYXJhdGlvbiBvZiB0aGlzIGRlY2xhcmF0aW9uLgorICBVc2luZ0RlY2wgKmdldENhbm9uaWNhbERlY2woKSBvdmVycmlkZSB7IHJldHVybiBnZXRGaXJzdERlY2woKTsgfQorICBjb25zdCBVc2luZ0RlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCB7IHJldHVybiBnZXRGaXJzdERlY2woKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gVXNpbmc7IH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgcGFjayBvZiB1c2luZyBkZWNsYXJhdGlvbnMgdGhhdCBhIHNpbmdsZQorLy8vIHVzaW5nLWRlY2xhcmF0b3IgcGFjay1leHBhbmRlZCBpbnRvLgorLy8vCisvLy8gXGNvZGUKKy8vLyB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5UPiBzdHJ1Y3QgWCA6IFQuLi4geworLy8vICAgdXNpbmcgVDo6b3BlcmF0b3IoKS4uLjsKKy8vLyAgIHVzaW5nIFQ6Om9wZXJhdG9yIFQuLi47CisvLy8gfTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gSW4gdGhlIHNlY29uZCBjYXNlIGFib3ZlLCB0aGUgVXNpbmdQYWNrRGVjbCB3aWxsIGhhdmUgdGhlIG5hbWUKKy8vLyAnb3BlcmF0b3IgVCcgKHdoaWNoIGNvbnRhaW5zIGFuIHVuZXhwYW5kZWQgcGFjayksIGJ1dCB0aGUgaW5kaXZpZHVhbAorLy8vIFVzaW5nRGVjbHMgYW5kIFVzaW5nU2hhZG93RGVjbHMgd2lsbCBoYXZlIG1vcmUgcmVhc29uYWJsZSBuYW1lcy4KK2NsYXNzIFVzaW5nUGFja0RlY2wgZmluYWwKKyAgICA6IHB1YmxpYyBOYW1lZERlY2wsIHB1YmxpYyBNZXJnZWFibGU8VXNpbmdQYWNrRGVjbD4sCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxVc2luZ1BhY2tEZWNsLCBOYW1lZERlY2wgKj4geworICAvLy8gVGhlIFVucmVzb2x2ZWRVc2luZ1ZhbHVlRGVjbCBvciBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wgZnJvbQorICAvLy8gd2hpY2ggdGhpcyB3YWFzIGluc3RhbnRpYXRlZC4KKyAgTmFtZWREZWNsICpJbnN0YW50aWF0ZWRGcm9tOworCisgIC8vLyBUaGUgbnVtYmVyIG9mIHVzaW5nLWRlY2xhcmF0aW9ucyBjcmVhdGVkIGJ5IHRoaXMgcGFjayBleHBhbnNpb24uCisgIHVuc2lnbmVkIE51bUV4cGFuc2lvbnM7CisKKyAgVXNpbmdQYWNrRGVjbChEZWNsQ29udGV4dCAqREMsIE5hbWVkRGVjbCAqSW5zdGFudGlhdGVkRnJvbSwKKyAgICAgICAgICAgICAgICBBcnJheVJlZjxOYW1lZERlY2wgKj4gVXNpbmdEZWNscykKKyAgICAgIDogTmFtZWREZWNsKFVzaW5nUGFjaywgREMsCisgICAgICAgICAgICAgICAgICBJbnN0YW50aWF0ZWRGcm9tID8gSW5zdGFudGlhdGVkRnJvbS0+Z2V0TG9jYXRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICBJbnN0YW50aWF0ZWRGcm9tID8gSW5zdGFudGlhdGVkRnJvbS0+Z2V0RGVjbE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IERlY2xhcmF0aW9uTmFtZSgpKSwKKyAgICAgICAgSW5zdGFudGlhdGVkRnJvbShJbnN0YW50aWF0ZWRGcm9tKSwgTnVtRXhwYW5zaW9ucyhVc2luZ0RlY2xzLnNpemUoKSkgeworICAgIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KFVzaW5nRGVjbHMuYmVnaW4oKSwgVXNpbmdEZWNscy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFpbGluZ09iamVjdHM8TmFtZWREZWNsICo+KCkpOworICB9CisKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgLy8vIEdldCB0aGUgdXNpbmcgZGVjbGFyYXRpb24gZnJvbSB3aGljaCB0aGlzIHdhcyBpbnN0YW50aWF0ZWQuIFRoaXMgd2lsbAorICAvLy8gYWx3YXlzIGJlIGFuIFVucmVzb2x2ZWRVc2luZ1ZhbHVlRGVjbCBvciBhbiBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wKKyAgLy8vIHRoYXQgaXMgYSBwYWNrIGV4cGFuc2lvbi4KKyAgTmFtZWREZWNsICpnZXRJbnN0YW50aWF0ZWRGcm9tVXNpbmdEZWNsKCkgY29uc3QgeyByZXR1cm4gSW5zdGFudGlhdGVkRnJvbTsgfQorCisgIC8vLyBHZXQgdGhlIHNldCBvZiB1c2luZyBkZWNsYXJhdGlvbnMgdGhhdCB0aGlzIHBhY2sgZXhwYW5kZWQgaW50by4gTm90ZSB0aGF0CisgIC8vLyBzb21lIG9mIHRoZXNlIG1heSBzdGlsbCBiZSB1bnJlc29sdmVkLgorICBBcnJheVJlZjxOYW1lZERlY2wgKj4gZXhwYW5zaW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKGdldFRyYWlsaW5nT2JqZWN0czxOYW1lZERlY2wgKj4oKSwgTnVtRXhwYW5zaW9ucyk7CisgIH0KKworICBzdGF0aWMgVXNpbmdQYWNrRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKkluc3RhbnRpYXRlZEZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8TmFtZWREZWNsICo+IFVzaW5nRGVjbHMpOworCisgIHN0YXRpYyBVc2luZ1BhY2tEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtRXhwYW5zaW9ucyk7CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gSW5zdGFudGlhdGVkRnJvbS0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgfQorCisgIFVzaW5nUGFja0RlY2wgKmdldENhbm9uaWNhbERlY2woKSBvdmVycmlkZSB7IHJldHVybiBnZXRGaXJzdERlY2woKTsgfQorICBjb25zdCBVc2luZ1BhY2tEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgY29uc3QgeyByZXR1cm4gZ2V0Rmlyc3REZWNsKCk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IFVzaW5nUGFjazsgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgZGVwZW5kZW50IHVzaW5nIGRlY2xhcmF0aW9uIHdoaWNoIHdhcyBub3QgbWFya2VkIHdpdGgKKy8vLyBcYyB0eXBlbmFtZS4KKy8vLworLy8vIFVubGlrZSBub24tZGVwZW5kZW50IHVzaW5nIGRlY2xhcmF0aW9ucywgdGhlc2UgKm9ubHkqIGJyaW5nIHRocm91Z2gKKy8vLyBub24tdHlwZXM7IG90aGVyd2lzZSB0aGV5IHdvdWxkIGJyZWFrIHR3by1waGFzZSBsb29rdXAuCisvLy8KKy8vLyBcY29kZQorLy8vIHRlbXBsYXRlIFw8Y2xhc3MgVD4gY2xhc3MgQSA6IHB1YmxpYyBCYXNlPFQ+IHsKKy8vLyAgIHVzaW5nIEJhc2U8VD46OmZvbzsKKy8vLyB9OworLy8vIFxlbmRjb2RlCitjbGFzcyBVbnJlc29sdmVkVXNpbmdWYWx1ZURlY2wgOiBwdWJsaWMgVmFsdWVEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE1lcmdlYWJsZTxVbnJlc29sdmVkVXNpbmdWYWx1ZURlY2w+IHsKKyAgLy8vIFxicmllZiBUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSAndXNpbmcnIGtleXdvcmQKKyAgU291cmNlTG9jYXRpb24gVXNpbmdMb2NhdGlvbjsKKworICAvLy8gXGJyaWVmIElmIHRoaXMgaXMgYSBwYWNrIGV4cGFuc2lvbiwgdGhlIGxvY2F0aW9uIG9mIHRoZSAnLi4uJy4KKyAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2M7CisKKyAgLy8vIFxicmllZiBUaGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHRoYXQgcHJlY2VkZXMgdGhlIG5hbWUuCisgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgUXVhbGlmaWVyTG9jOworCisgIC8vLyBcYnJpZWYgUHJvdmlkZXMgc291cmNlL3R5cGUgbG9jYXRpb24gaW5mbyBmb3IgdGhlIGRlY2xhcmF0aW9uIG5hbWUKKyAgLy8vIGVtYmVkZGVkIGluIHRoZSBWYWx1ZURlY2wgYmFzZSBjbGFzcy4KKyAgRGVjbGFyYXRpb25OYW1lTG9jIEROTG9jOworCisgIFVucmVzb2x2ZWRVc2luZ1ZhbHVlRGVjbChEZWNsQ29udGV4dCAqREMsIFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVXNpbmdMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MpCisgICAgICA6IFZhbHVlRGVjbChVbnJlc29sdmVkVXNpbmdWYWx1ZSwgREMsCisgICAgICAgICAgICAgICAgICBOYW1lSW5mby5nZXRMb2MoKSwgTmFtZUluZm8uZ2V0TmFtZSgpLCBUeSksCisgICAgICAgIFVzaW5nTG9jYXRpb24oVXNpbmdMb2MpLCBFbGxpcHNpc0xvYyhFbGxpcHNpc0xvYyksCisgICAgICAgIFF1YWxpZmllckxvYyhRdWFsaWZpZXJMb2MpLCBETkxvYyhOYW1lSW5mby5nZXRJbmZvKCkpIHt9CisKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlICd1c2luZycga2V5d29yZC4KKyAgU291cmNlTG9jYXRpb24gZ2V0VXNpbmdMb2MoKSBjb25zdCB7IHJldHVybiBVc2luZ0xvY2F0aW9uOyB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgJ3VzaW5nJyBrZXl3b3JkLgorICB2b2lkIHNldFVzaW5nTG9jKFNvdXJjZUxvY2F0aW9uIEwpIHsgVXNpbmdMb2NhdGlvbiA9IEw7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIGl0IGlzIGEgQysrMDMgYWNjZXNzIGRlY2xhcmF0aW9uIChubyAndXNpbmcnKS4KKyAgYm9vbCBpc0FjY2Vzc0RlY2xhcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gVXNpbmdMb2NhdGlvbi5pc0ludmFsaWQoKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciB0aGF0IHF1YWxpZmllcyB0aGUgbmFtZSwKKyAgLy8vIHdpdGggc291cmNlLWxvY2F0aW9uIGluZm9ybWF0aW9uLgorICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIGdldFF1YWxpZmllckxvYygpIGNvbnN0IHsgcmV0dXJuIFF1YWxpZmllckxvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciB0aGF0IHF1YWxpZmllcyB0aGUgbmFtZS4KKyAgTmVzdGVkTmFtZVNwZWNpZmllciAqZ2V0UXVhbGlmaWVyKCkgY29uc3QgeworICAgIHJldHVybiBRdWFsaWZpZXJMb2MuZ2V0TmVzdGVkTmFtZVNwZWNpZmllcigpOworICB9CisKKyAgRGVjbGFyYXRpb25OYW1lSW5mbyBnZXROYW1lSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gRGVjbGFyYXRpb25OYW1lSW5mbyhnZXREZWNsTmFtZSgpLCBnZXRMb2NhdGlvbigpLCBETkxvYyk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSBwYWNrIGV4cGFuc2lvbi4KKyAgYm9vbCBpc1BhY2tFeHBhbnNpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIEVsbGlwc2lzTG9jLmlzVmFsaWQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZWxsaXBzaXMgaWYgdGhpcyBpcyBhIHBhY2sgZXhwYW5zaW9uLgorICBTb3VyY2VMb2NhdGlvbiBnZXRFbGxpcHNpc0xvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gRWxsaXBzaXNMb2M7CisgIH0KKworICBzdGF0aWMgVW5yZXNvbHZlZFVzaW5nVmFsdWVEZWNsICoKKyAgICBDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBVc2luZ0xvYywKKyAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MsCisgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLCBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYyk7CisKKyAgc3RhdGljIFVucmVzb2x2ZWRVc2luZ1ZhbHVlRGVjbCAqCisgIENyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZOworCisgIC8vLyBSZXRyaWV2ZXMgdGhlIGNhbm9uaWNhbCBkZWNsYXJhdGlvbiBvZiB0aGlzIGRlY2xhcmF0aW9uLgorICBVbnJlc29sdmVkVXNpbmdWYWx1ZURlY2wgKmdldENhbm9uaWNhbERlY2woKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIGdldEZpcnN0RGVjbCgpOworICB9CisgIGNvbnN0IFVucmVzb2x2ZWRVc2luZ1ZhbHVlRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Rmlyc3REZWNsKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IFVucmVzb2x2ZWRVc2luZ1ZhbHVlOyB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBkZXBlbmRlbnQgdXNpbmcgZGVjbGFyYXRpb24gd2hpY2ggd2FzIG1hcmtlZCB3aXRoCisvLy8gXGMgdHlwZW5hbWUuCisvLy8KKy8vLyBcY29kZQorLy8vIHRlbXBsYXRlIFw8Y2xhc3MgVD4gY2xhc3MgQSA6IHB1YmxpYyBCYXNlPFQ+IHsKKy8vLyAgIHVzaW5nIHR5cGVuYW1lIEJhc2U8VD46OmZvbzsKKy8vLyB9OworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGUgdHlwZSBhc3NvY2lhdGVkIHdpdGggYW4gdW5yZXNvbHZlZCB1c2luZyB0eXBlbmFtZSBkZWNsIGlzCisvLy8gY3VycmVudGx5IGFsd2F5cyBhIHR5cGVuYW1lIHR5cGUuCitjbGFzcyBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wKKyAgICA6IHB1YmxpYyBUeXBlRGVjbCwKKyAgICAgIHB1YmxpYyBNZXJnZWFibGU8VW5yZXNvbHZlZFVzaW5nVHlwZW5hbWVEZWNsPiB7CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworCisgIC8vLyBcYnJpZWYgVGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgJ3R5cGVuYW1lJyBrZXl3b3JkCisgIFNvdXJjZUxvY2F0aW9uIFR5cGVuYW1lTG9jYXRpb247CisKKyAgLy8vIFxicmllZiBJZiB0aGlzIGlzIGEgcGFjayBleHBhbnNpb24sIHRoZSBsb2NhdGlvbiBvZiB0aGUgJy4uLicuCisgIFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jOworCisgIC8vLyBcYnJpZWYgVGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciB0aGF0IHByZWNlZGVzIHRoZSBuYW1lLgorICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYzsKKworICBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2woRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBVc2luZ0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFR5cGVuYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUYXJnZXROYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKlRhcmdldE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYykKKyAgICA6IFR5cGVEZWNsKFVucmVzb2x2ZWRVc2luZ1R5cGVuYW1lLCBEQywgVGFyZ2V0TmFtZUxvYywgVGFyZ2V0TmFtZSwKKyAgICAgICAgICAgICAgIFVzaW5nTG9jKSwKKyAgICAgIFR5cGVuYW1lTG9jYXRpb24oVHlwZW5hbWVMb2MpLCBFbGxpcHNpc0xvYyhFbGxpcHNpc0xvYyksCisgICAgICBRdWFsaWZpZXJMb2MoUXVhbGlmaWVyTG9jKSB7fQorCisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlICd1c2luZycga2V5d29yZC4KKyAgU291cmNlTG9jYXRpb24gZ2V0VXNpbmdMb2MoKSBjb25zdCB7IHJldHVybiBnZXRMb2NTdGFydCgpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlICd0eXBlbmFtZScga2V5d29yZC4KKyAgU291cmNlTG9jYXRpb24gZ2V0VHlwZW5hbWVMb2MoKSBjb25zdCB7IHJldHVybiBUeXBlbmFtZUxvY2F0aW9uOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHRoYXQgcXVhbGlmaWVzIHRoZSBuYW1lLAorICAvLy8gd2l0aCBzb3VyY2UtbG9jYXRpb24gaW5mb3JtYXRpb24uCisgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgZ2V0UXVhbGlmaWVyTG9jKCkgY29uc3QgeyByZXR1cm4gUXVhbGlmaWVyTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHRoYXQgcXVhbGlmaWVzIHRoZSBuYW1lLgorICBOZXN0ZWROYW1lU3BlY2lmaWVyICpnZXRRdWFsaWZpZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFF1YWxpZmllckxvYy5nZXROZXN0ZWROYW1lU3BlY2lmaWVyKCk7CisgIH0KKworICBEZWNsYXJhdGlvbk5hbWVJbmZvIGdldE5hbWVJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBEZWNsYXJhdGlvbk5hbWVJbmZvKGdldERlY2xOYW1lKCksIGdldExvY2F0aW9uKCkpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgcGFjayBleHBhbnNpb24uCisgIGJvb2wgaXNQYWNrRXhwYW5zaW9uKCkgY29uc3QgeworICAgIHJldHVybiBFbGxpcHNpc0xvYy5pc1ZhbGlkKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGVsbGlwc2lzIGlmIHRoaXMgaXMgYSBwYWNrIGV4cGFuc2lvbi4KKyAgU291cmNlTG9jYXRpb24gZ2V0RWxsaXBzaXNMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIEVsbGlwc2lzTG9jOworICB9CisKKyAgc3RhdGljIFVucmVzb2x2ZWRVc2luZ1R5cGVuYW1lRGVjbCAqCisgICAgQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gVXNpbmdMb2MsCisgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFR5cGVuYW1lTG9jLCBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYywKKyAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGFyZ2V0TmFtZUxvYywgRGVjbGFyYXRpb25OYW1lIFRhcmdldE5hbWUsCisgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jKTsKKworICBzdGF0aWMgVW5yZXNvbHZlZFVzaW5nVHlwZW5hbWVEZWNsICoKKyAgQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKKworICAvLy8gUmV0cmlldmVzIHRoZSBjYW5vbmljYWwgZGVjbGFyYXRpb24gb2YgdGhpcyBkZWNsYXJhdGlvbi4KKyAgVW5yZXNvbHZlZFVzaW5nVHlwZW5hbWVEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRGaXJzdERlY2woKTsKKyAgfQorICBjb25zdCBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEZpcnN0RGVjbCgpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZTsgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgQysrMTEgc3RhdGljX2Fzc2VydCBkZWNsYXJhdGlvbi4KK2NsYXNzIFN0YXRpY0Fzc2VydERlY2wgOiBwdWJsaWMgRGVjbCB7CisgIGxsdm06OlBvaW50ZXJJbnRQYWlyPEV4cHIgKiwgMSwgYm9vbD4gQXNzZXJ0RXhwckFuZEZhaWxlZDsKKyAgU3RyaW5nTGl0ZXJhbCAqTWVzc2FnZTsKKyAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jOworCisgIFN0YXRpY0Fzc2VydERlY2woRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBTdGF0aWNBc3NlcnRMb2MsCisgICAgICAgICAgICAgICAgICAgRXhwciAqQXNzZXJ0RXhwciwgU3RyaW5nTGl0ZXJhbCAqTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MsIGJvb2wgRmFpbGVkKQorICAgICAgOiBEZWNsKFN0YXRpY0Fzc2VydCwgREMsIFN0YXRpY0Fzc2VydExvYyksCisgICAgICAgIEFzc2VydEV4cHJBbmRGYWlsZWQoQXNzZXJ0RXhwciwgRmFpbGVkKSwgTWVzc2FnZShNZXNzYWdlKSwKKyAgICAgICAgUlBhcmVuTG9jKFJQYXJlbkxvYykge30KKworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisKKyAgc3RhdGljIFN0YXRpY0Fzc2VydERlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhdGljQXNzZXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkFzc2VydEV4cHIsIFN0cmluZ0xpdGVyYWwgKk1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jLCBib29sIEZhaWxlZCk7CisgIHN0YXRpYyBTdGF0aWNBc3NlcnREZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOworICAKKyAgRXhwciAqZ2V0QXNzZXJ0RXhwcigpIHsgcmV0dXJuIEFzc2VydEV4cHJBbmRGYWlsZWQuZ2V0UG9pbnRlcigpOyB9CisgIGNvbnN0IEV4cHIgKmdldEFzc2VydEV4cHIoKSBjb25zdCB7IHJldHVybiBBc3NlcnRFeHByQW5kRmFpbGVkLmdldFBvaW50ZXIoKTsgfQorCisgIFN0cmluZ0xpdGVyYWwgKmdldE1lc3NhZ2UoKSB7IHJldHVybiBNZXNzYWdlOyB9CisgIGNvbnN0IFN0cmluZ0xpdGVyYWwgKmdldE1lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBNZXNzYWdlOyB9CisKKyAgYm9vbCBpc0ZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIEFzc2VydEV4cHJBbmRGYWlsZWQuZ2V0SW50KCk7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRSUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRMb2NhdGlvbigpLCBnZXRSUGFyZW5Mb2MoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IFN0YXRpY0Fzc2VydDsgfQorfTsKKworLy8vIEEgYmluZGluZyBpbiBhIGRlY29tcG9zaXRpb24gZGVjbGFyYXRpb24uIEZvciBpbnN0YW5jZSwgZ2l2ZW46CisvLy8KKy8vLyAgIGludCBuWzNdOworLy8vICAgYXV0byAmW2EsIGIsIGNdID0gbjsKKy8vLworLy8vIGEsIGIsIGFuZCBjIGFyZSBCaW5kaW5nRGVjbHMsIHdob3NlIGJpbmRpbmdzIGFyZSB0aGUgZXhwcmVzc2lvbnMKKy8vLyB4WzBdLCB4WzFdLCBhbmQgeFsyXSByZXNwZWN0aXZlbHksIHdoZXJlIHggaXMgdGhlIGltcGxpY2l0CisvLy8gRGVjb21wb3NpdGlvbkRlY2wgb2YgdHlwZSAnaW50ICgmKVszXScuCitjbGFzcyBCaW5kaW5nRGVjbCA6IHB1YmxpYyBWYWx1ZURlY2wgeworICAvLy8gVGhlIGJpbmRpbmcgcmVwcmVzZW50ZWQgYnkgdGhpcyBkZWNsYXJhdGlvbi4gUmVmZXJlbmNlcyB0byB0aGlzCisgIC8vLyBkZWNsYXJhdGlvbiBhcmUgZWZmZWN0aXZlbHkgZXF1aXZhbGVudCB0byB0aGlzIGV4cHJlc3Npb24gKGV4Y2VwdAorICAvLy8gdGhhdCBpdCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlIGF0IHRoZSBwb2ludCBvZiBkZWNsYXJhdGlvbiBvZiB0aGUKKyAgLy8vIGJpbmRpbmcpLgorICBFeHByICpCaW5kaW5nID0gbnVsbHB0cjsKKworICBCaW5kaW5nRGVjbChEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIElkTG9jLCBJZGVudGlmaWVySW5mbyAqSWQpCisgICAgICA6IFZhbHVlRGVjbChEZWNsOjpCaW5kaW5nLCBEQywgSWRMb2MsIElkLCBRdWFsVHlwZSgpKSB7fQorCisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisKKyAgc3RhdGljIEJpbmRpbmdEZWNsICpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJZExvYywgSWRlbnRpZmllckluZm8gKklkKTsKKyAgc3RhdGljIEJpbmRpbmdEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOworCisgIC8vLyBHZXQgdGhlIGV4cHJlc3Npb24gdG8gd2hpY2ggdGhpcyBkZWNsYXJhdGlvbiBpcyBib3VuZC4gVGhpcyBtYXkgYmUgbnVsbAorICAvLy8gaW4gdHdvIGRpZmZlcmVudCBjYXNlczogd2hpbGUgcGFyc2luZyB0aGUgaW5pdGlhbGl6ZXIgZm9yIHRoZQorICAvLy8gZGVjb21wb3NpdGlvbiBkZWNsYXJhdGlvbiwgYW5kIHdoZW4gdGhlIGluaXRpYWxpemVyIGlzIHR5cGUtZGVwZW5kZW50LgorICBFeHByICpnZXRCaW5kaW5nKCkgY29uc3QgeyByZXR1cm4gQmluZGluZzsgfQorCisgIC8vLyBHZXQgdGhlIHZhcmlhYmxlIChpZiBhbnkpIHRoYXQgaG9sZHMgdGhlIHZhbHVlIG9mIGV2YWx1YXRpbmcgdGhlIGJpbmRpbmcuCisgIC8vLyBPbmx5IHByZXNlbnQgZm9yIHVzZXItZGVmaW5lZCBiaW5kaW5ncyBmb3IgdHVwbGUtbGlrZSB0eXBlcy4KKyAgVmFyRGVjbCAqZ2V0SG9sZGluZ1ZhcigpIGNvbnN0OworCisgIC8vLyBTZXQgdGhlIGJpbmRpbmcgZm9yIHRoaXMgQmluZGluZ0RlY2wsIGFsb25nIHdpdGggaXRzIGRlY2xhcmVkIHR5cGUgKHdoaWNoCisgIC8vLyBzaG91bGQgYmUgYSBwb3NzaWJseS1jdi1xdWFsaWZpZWQgZm9ybSBvZiB0aGUgdHlwZSBvZiB0aGUgYmluZGluZywgb3IgYQorICAvLy8gcmVmZXJlbmNlIHRvIHN1Y2ggYSB0eXBlKS4KKyAgdm9pZCBzZXRCaW5kaW5nKFF1YWxUeXBlIERlY2xhcmVkVHlwZSwgRXhwciAqQmluZGluZykgeworICAgIHNldFR5cGUoRGVjbGFyZWRUeXBlKTsKKyAgICB0aGlzLT5CaW5kaW5nID0gQmluZGluZzsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gRGVjbDo6QmluZGluZzsgfQorfTsKKworLy8vIEEgZGVjb21wb3NpdGlvbiBkZWNsYXJhdGlvbi4gRm9yIGluc3RhbmNlLCBnaXZlbjoKKy8vLworLy8vICAgaW50IG5bM107CisvLy8gICBhdXRvICZbYSwgYiwgY10gPSBuOworLy8vCisvLy8gdGhlIHNlY29uZCBsaW5lIGRlY2xhcmVzIGEgRGVjb21wb3NpdGlvbkRlY2wgb2YgdHlwZSAnaW50ICgmKVszXScsIGFuZAorLy8vIHRocmVlIEJpbmRpbmdEZWNscyAobmFtZWQgYSwgYiwgYW5kIGMpLiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGFsd2F5cworLy8vIHVubmFtZWQsIGJ1dCBiZWhhdmVzIGluIGFsbW9zdCBhbGwgb3RoZXIgcmVzcGVjdHMgbGlrZSBhIFZhckRlY2wuCitjbGFzcyBEZWNvbXBvc2l0aW9uRGVjbCBmaW5hbAorICAgIDogcHVibGljIFZhckRlY2wsCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxEZWNvbXBvc2l0aW9uRGVjbCwgQmluZGluZ0RlY2wgKj4geworICAvLy8gVGhlIG51bWJlciBvZiBCaW5kaW5nRGVjbCpzIGZvbGxvd2luZyB0aGlzIG9iamVjdC4KKyAgdW5zaWduZWQgTnVtQmluZGluZ3M7CisKKyAgRGVjb21wb3NpdGlvbkRlY2woQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFNxdWFyZUxvYywgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKlRJbmZvLCBTdG9yYWdlQ2xhc3MgU0MsCisgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEJpbmRpbmdEZWNsICo+IEJpbmRpbmdzKQorICAgICAgOiBWYXJEZWNsKERlY29tcG9zaXRpb24sIEMsIERDLCBTdGFydExvYywgTFNxdWFyZUxvYywgbnVsbHB0ciwgVCwgVEluZm8sCisgICAgICAgICAgICAgICAgU0MpLAorICAgICAgICBOdW1CaW5kaW5ncyhCaW5kaW5ncy5zaXplKCkpIHsKKyAgICBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weShCaW5kaW5ncy5iZWdpbigpLCBCaW5kaW5ncy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFpbGluZ09iamVjdHM8QmluZGluZ0RlY2wgKj4oKSk7CisgIH0KKworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIHN0YXRpYyBEZWNvbXBvc2l0aW9uRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExTcXVhcmVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZUNsYXNzIFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEJpbmRpbmdEZWNsICo+IEJpbmRpbmdzKTsKKyAgc3RhdGljIERlY29tcG9zaXRpb25EZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUJpbmRpbmdzKTsKKworICBBcnJheVJlZjxCaW5kaW5nRGVjbCAqPiBiaW5kaW5ncygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKGdldFRyYWlsaW5nT2JqZWN0czxCaW5kaW5nRGVjbCAqPigpLCBOdW1CaW5kaW5ncyk7CisgIH0KKworICB2b2lkIHByaW50TmFtZShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gRGVjb21wb3NpdGlvbjsgfQorfTsKKworLy8vIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgZGVjbGFyYXRpb24gb2YgYSBwcm9wZXJ0eQorLy8vIG1lbWJlci4gIFRoaXMgaXMgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uIHRvIEMrKywgZmlyc3QgaW50cm9kdWNlZCBpbgorLy8vIFZpc3VhbCBTdHVkaW8gLk5FVCAyMDAzIGFzIGEgcGFyYWxsZWwgdG8gc2ltaWxhciBmZWF0dXJlcyBpbiBDIworLy8vIGFuZCBNYW5hZ2VkIEMrKy4KKy8vLworLy8vIEEgcHJvcGVydHkgbXVzdCBhbHdheXMgYmUgYSBub24tc3RhdGljIGNsYXNzIG1lbWJlci4KKy8vLworLy8vIEEgcHJvcGVydHkgbWVtYmVyIHN1cGVyZmljaWFsbHkgcmVzZW1ibGVzIGEgbm9uLXN0YXRpYyBkYXRhCisvLy8gbWVtYmVyLCBleGNlcHQgcHJlY2VkZWQgYnkgYSBwcm9wZXJ0eSBhdHRyaWJ1dGU6CisvLy8gICBfX2RlY2xzcGVjKHByb3BlcnR5KGdldD1HZXRYLCBwdXQ9UHV0WCkpIGludCB4OworLy8vIEVpdGhlciAoYnV0IG5vdCBib3RoKSBvZiB0aGUgJ2dldCcgYW5kICdwdXQnIG5hbWVzIG1heSBiZSBvbWl0dGVkLgorLy8vCisvLy8gQSByZWZlcmVuY2UgdG8gYSBwcm9wZXJ0eSBpcyBhbHdheXMgYW4gbHZhbHVlLiAgSWYgdGhlIGx2YWx1ZQorLy8vIHVuZGVyZ29lcyBsdmFsdWUtdG8tcnZhbHVlIGNvbnZlcnNpb24sIHRoZW4gYSBnZXR0ZXIgbmFtZSBpcworLy8vIHJlcXVpcmVkLCBhbmQgdGhhdCBtZW1iZXIgaXMgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLgorLy8vIElmIHRoZSBsdmFsdWUgaXMgYXNzaWduZWQgaW50bywgdGhlbiBhIHNldHRlciBuYW1lIGlzIHJlcXVpcmVkLAorLy8vIGFuZCB0aGF0IG1lbWJlciBpcyBjYWxsZWQgd2l0aCBvbmUgYXJndW1lbnQsIHRoZSB2YWx1ZSBhc3NpZ25lZC4KKy8vLyBCb3RoIG9wZXJhdGlvbnMgYXJlIHBvdGVudGlhbGx5IG92ZXJsb2FkZWQuICBDb21wb3VuZCBhc3NpZ25tZW50cworLy8vIGFyZSBwZXJtaXR0ZWQsIGFzIGFyZSB0aGUgaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgb3BlcmF0b3JzLgorLy8vCisvLy8gVGhlIGdldHRlciBhbmQgcHV0dGVyIG1ldGhvZHMgYXJlIHBlcm1pdHRlZCB0byBiZSBvdmVybG9hZGVkLAorLy8vIGFsdGhvdWdoIHRoZWlyIHJldHVybiBhbmQgcGFyYW1ldGVyIHR5cGVzIGFyZSBzdWJqZWN0IHRvIGNlcnRhaW4KKy8vLyByZXN0cmljdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eS4KKy8vLworLy8vIEEgcHJvcGVydHkgZGVjbGFyZWQgdXNpbmcgYW4gaW5jb21wbGV0ZSBhcnJheSB0eXBlIG1heQorLy8vIGFkZGl0aW9uYWxseSBiZSBzdWJzY3JpcHRlZCwgYWRkaW5nIGV4dHJhIHBhcmFtZXRlcnMgdG8gdGhlIGdldHRlcgorLy8vIGFuZCBwdXR0ZXIgbWV0aG9kcy4KK2NsYXNzIE1TUHJvcGVydHlEZWNsIDogcHVibGljIERlY2xhcmF0b3JEZWNsIHsKKyAgSWRlbnRpZmllckluZm8gKkdldHRlcklkLCAqU2V0dGVySWQ7CisKKyAgTVNQcm9wZXJ0eURlY2woRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBMLCBEZWNsYXJhdGlvbk5hbWUgTiwKKyAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwgVHlwZVNvdXJjZUluZm8gKlRJbmZvLCBTb3VyY2VMb2NhdGlvbiBTdGFydEwsCisgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpHZXR0ZXIsIElkZW50aWZpZXJJbmZvICpTZXR0ZXIpCisgICAgICA6IERlY2xhcmF0b3JEZWNsKE1TUHJvcGVydHksIERDLCBMLCBOLCBULCBUSW5mbywgU3RhcnRMKSwKKyAgICAgICAgR2V0dGVySWQoR2V0dGVyKSwgU2V0dGVySWQoU2V0dGVyKSB7fQorCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworCisgIHN0YXRpYyBNU1Byb3BlcnR5RGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCwgRGVjbGFyYXRpb25OYW1lIE4sIFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUSW5mbywgU291cmNlTG9jYXRpb24gU3RhcnRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqR2V0dGVyLCBJZGVudGlmaWVySW5mbyAqU2V0dGVyKTsKKyAgc3RhdGljIE1TUHJvcGVydHlEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gRC0+Z2V0S2luZCgpID09IE1TUHJvcGVydHk7IH0KKworICBib29sIGhhc0dldHRlcigpIGNvbnN0IHsgcmV0dXJuIEdldHRlcklkICE9IG51bGxwdHI7IH0KKyAgSWRlbnRpZmllckluZm8qIGdldEdldHRlcklkKCkgY29uc3QgeyByZXR1cm4gR2V0dGVySWQ7IH0KKyAgYm9vbCBoYXNTZXR0ZXIoKSBjb25zdCB7IHJldHVybiBTZXR0ZXJJZCAhPSBudWxscHRyOyB9CisgIElkZW50aWZpZXJJbmZvKiBnZXRTZXR0ZXJJZCgpIGNvbnN0IHsgcmV0dXJuIFNldHRlcklkOyB9Cit9OworCisvLy8gSW5zZXJ0aW9uIG9wZXJhdG9yIGZvciBkaWFnbm9zdGljcy4gIFRoaXMgYWxsb3dzIHNlbmRpbmcgYW4gQWNjZXNzU3BlY2lmaWVyCisvLy8gaW50byBhIGRpYWdub3N0aWMgd2l0aCA8PC4KK2NvbnN0IERpYWdub3N0aWNCdWlsZGVyICZvcGVyYXRvcjw8KGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZEQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc1NwZWNpZmllciBBUyk7CisKK2NvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZvcGVyYXRvcjw8KGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZEQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc1NwZWNpZmllciBBUyk7CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9ERUNMQ1hYX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsQ29udGV4dEludGVybmFscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xDb250ZXh0SW50ZXJuYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU0NWY3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsQ29udGV4dEludGVybmFscy5oCkBAIC0wLDAgKzEsMjY1IEBACisvLz09PS0gRGVjbENvbnRleHRJbnRlcm5hbHMuaCAtIERlY2xDb250ZXh0IFJlcHJlc2VudGF0aW9uIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIHVzZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uCisvLyAgb2YgRGVjbENvbnRleHQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9ERUNMQ09OVEVYVElOVEVSTkFMU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX0RFQ0xDT05URVhUSU5URVJOQUxTX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xCYXNlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDWFguaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbGFyYXRpb25OYW1lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIERlcGVuZGVudERpYWdub3N0aWM7CisKKy8vLyBcYnJpZWYgQW4gYXJyYXkgb2YgZGVjbHMgb3B0aW1pemVkIGZvciB0aGUgY29tbW9uIGNhc2Ugb2Ygb25seSBjb250YWluaW5nCisvLy8gb25lIGVudHJ5Lgorc3RydWN0IFN0b3JlZERlY2xzTGlzdCB7CisgIC8vLyBcYnJpZWYgV2hlbiBpbiB2ZWN0b3IgZm9ybSwgdGhpcyBpcyB3aGF0IHRoZSBEYXRhIHBvaW50ZXIgcG9pbnRzIHRvLgorICB1c2luZyBEZWNsc1R5ID0gU21hbGxWZWN0b3I8TmFtZWREZWNsICosIDQ+OworCisgIC8vLyBcYnJpZWYgQSBjb2xsZWN0aW9uIG9mIGRlY2xhcmF0aW9ucywgd2l0aCBhIGZsYWcgdG8gaW5kaWNhdGUgaWYgd2UgaGF2ZQorICAvLy8gZnVydGhlciBleHRlcm5hbCBkZWNsYXJhdGlvbnMuCisgIHVzaW5nIERlY2xzQW5kSGFzRXh0ZXJuYWxUeSA9IGxsdm06OlBvaW50ZXJJbnRQYWlyPERlY2xzVHkgKiwgMSwgYm9vbD47CisKKyAgLy8vIFxicmllZiBUaGUgc3RvcmVkIGRhdGEsIHdoaWNoIHdpbGwgYmUgZWl0aGVyIGEgcG9pbnRlciB0byBhIE5hbWVkRGVjbCwKKyAgLy8vIG9yIGEgcG9pbnRlciB0byBhIHZlY3RvciB3aXRoIGEgZmxhZyB0byBpbmRpY2F0ZSBpZiB0aGVyZSBhcmUgZnVydGhlcgorICAvLy8gZXh0ZXJuYWwgZGVjbGFyYXRpb25zLgorICBsbHZtOjpQb2ludGVyVW5pb248TmFtZWREZWNsICosIERlY2xzQW5kSGFzRXh0ZXJuYWxUeT4gRGF0YTsKKworcHVibGljOgorICBTdG9yZWREZWNsc0xpc3QoKSA9IGRlZmF1bHQ7CisKKyAgU3RvcmVkRGVjbHNMaXN0KFN0b3JlZERlY2xzTGlzdCAmJlJIUykgOiBEYXRhKFJIUy5EYXRhKSB7CisgICAgUkhTLkRhdGEgPSAoTmFtZWREZWNsICopbnVsbHB0cjsKKyAgfQorCisgIH5TdG9yZWREZWNsc0xpc3QoKSB7CisgICAgLy8gSWYgdGhpcyBpcyBhIHZlY3Rvci1mb3JtLCBmcmVlIHRoZSB2ZWN0b3IuCisgICAgaWYgKERlY2xzVHkgKlZlY3RvciA9IGdldEFzVmVjdG9yKCkpCisgICAgICBkZWxldGUgVmVjdG9yOworICB9CisKKyAgU3RvcmVkRGVjbHNMaXN0ICZvcGVyYXRvcj0oU3RvcmVkRGVjbHNMaXN0ICYmUkhTKSB7CisgICAgaWYgKERlY2xzVHkgKlZlY3RvciA9IGdldEFzVmVjdG9yKCkpCisgICAgICBkZWxldGUgVmVjdG9yOworICAgIERhdGEgPSBSSFMuRGF0YTsKKyAgICBSSFMuRGF0YSA9IChOYW1lZERlY2wgKiludWxscHRyOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGJvb2wgaXNOdWxsKCkgY29uc3QgeyByZXR1cm4gRGF0YS5pc051bGwoKTsgfQorCisgIE5hbWVkRGVjbCAqZ2V0QXNEZWNsKCkgY29uc3QgeworICAgIHJldHVybiBEYXRhLmR5bl9jYXN0PE5hbWVkRGVjbCAqPigpOworICB9CisKKyAgRGVjbHNBbmRIYXNFeHRlcm5hbFR5IGdldEFzVmVjdG9yQW5kSGFzRXh0ZXJuYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIERhdGEuZHluX2Nhc3Q8RGVjbHNBbmRIYXNFeHRlcm5hbFR5PigpOworICB9CisKKyAgRGVjbHNUeSAqZ2V0QXNWZWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEFzVmVjdG9yQW5kSGFzRXh0ZXJuYWwoKS5nZXRQb2ludGVyKCk7CisgIH0KKworICBib29sIGhhc0V4dGVybmFsRGVjbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEFzVmVjdG9yQW5kSGFzRXh0ZXJuYWwoKS5nZXRJbnQoKTsKKyAgfQorCisgIHZvaWQgc2V0SGFzRXh0ZXJuYWxEZWNscygpIHsKKyAgICBpZiAoRGVjbHNUeSAqVmVjID0gZ2V0QXNWZWN0b3IoKSkKKyAgICAgIERhdGEgPSBEZWNsc0FuZEhhc0V4dGVybmFsVHkoVmVjLCB0cnVlKTsKKyAgICBlbHNlIHsKKyAgICAgIERlY2xzVHkgKlZUID0gbmV3IERlY2xzVHkoKTsKKyAgICAgIGlmIChOYW1lZERlY2wgKk9sZEQgPSBnZXRBc0RlY2woKSkKKyAgICAgICAgVlQtPnB1c2hfYmFjayhPbGREKTsKKyAgICAgIERhdGEgPSBEZWNsc0FuZEhhc0V4dGVybmFsVHkoVlQsIHRydWUpOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0T25seVZhbHVlKE5hbWVkRGVjbCAqTkQpIHsKKyAgICBhc3NlcnQoIWdldEFzVmVjdG9yKCkgJiYgIk5vdCBpbmxpbmUiKTsKKyAgICBEYXRhID0gTkQ7CisgICAgLy8gTWFrZSBzdXJlIHRoYXQgRGF0YSBpcyBhIHBsYWluIE5hbWVkRGVjbCogc28gd2UgY2FuIHVzZSBpdHMgYWRkcmVzcworICAgIC8vIGF0IGdldExvb2t1cFJlc3VsdC4KKyAgICBhc3NlcnQoKihOYW1lZERlY2wgKiopJkRhdGEgPT0gTkQgJiYKKyAgICAgICAgICAgIlBvaW50ZXJVbmlvbiBtYW5nbGVzIHRoZSBOYW1lZERlY2wgcG9pbnRlciEiKTsKKyAgfQorCisgIHZvaWQgcmVtb3ZlKE5hbWVkRGVjbCAqRCkgeworICAgIGFzc2VydCghaXNOdWxsKCkgJiYgInJlbW92aW5nIGZyb20gZW1wdHkgbGlzdCIpOworICAgIGlmIChOYW1lZERlY2wgKlNpbmdsZXRvbiA9IGdldEFzRGVjbCgpKSB7CisgICAgICBhc3NlcnQoU2luZ2xldG9uID09IEQgJiYgImxpc3QgaXMgZGlmZmVyZW50IHNpbmdsZXRvbiIpOworICAgICAgKHZvaWQpU2luZ2xldG9uOworICAgICAgRGF0YSA9IChOYW1lZERlY2wgKiludWxscHRyOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIERlY2xzVHkgJlZlYyA9ICpnZXRBc1ZlY3RvcigpOworICAgIERlY2xzVHk6Oml0ZXJhdG9yIEkgPSBzdGQ6OmZpbmQoVmVjLmJlZ2luKCksIFZlYy5lbmQoKSwgRCk7CisgICAgYXNzZXJ0KEkgIT0gVmVjLmVuZCgpICYmICJsaXN0IGRvZXMgbm90IGNvbnRhaW4gZGVjbCIpOworICAgIFZlYy5lcmFzZShJKTsKKworICAgIGFzc2VydChzdGQ6OmZpbmQoVmVjLmJlZ2luKCksIFZlYy5lbmQoKSwgRCkKKyAgICAgICAgICAgICA9PSBWZWMuZW5kKCkgJiYgImxpc3Qgc3RpbGwgY29udGFpbnMgZGVjbCIpOworICB9CisKKyAgLy8vIFxicmllZiBSZW1vdmUgYW55IGRlY2xhcmF0aW9ucyB3aGljaCB3ZXJlIGltcG9ydGVkIGZyb20gYW4gZXh0ZXJuYWwKKyAgLy8vIEFTVCBzb3VyY2UuCisgIHZvaWQgcmVtb3ZlRXh0ZXJuYWxEZWNscygpIHsKKyAgICBpZiAoaXNOdWxsKCkpIHsKKyAgICAgIC8vIE5vdGhpbmcgdG8gZG8uCisgICAgfSBlbHNlIGlmIChOYW1lZERlY2wgKlNpbmdsZXRvbiA9IGdldEFzRGVjbCgpKSB7CisgICAgICBpZiAoU2luZ2xldG9uLT5pc0Zyb21BU1RGaWxlKCkpCisgICAgICAgICp0aGlzID0gU3RvcmVkRGVjbHNMaXN0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIERlY2xzVHkgJlZlYyA9ICpnZXRBc1ZlY3RvcigpOworICAgICAgVmVjLmVyYXNlKHN0ZDo6cmVtb3ZlX2lmKFZlYy5iZWdpbigpLCBWZWMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oRGVjbCAqRCkgeyByZXR1cm4gRC0+aXNGcm9tQVNURmlsZSgpOyB9KSwKKyAgICAgICAgICAgICAgICBWZWMuZW5kKCkpOworICAgICAgLy8gRG9uJ3QgaGF2ZSBhbnkgZXh0ZXJuYWwgZGVjbHMgYW55IG1vcmUuCisgICAgICBEYXRhID0gRGVjbHNBbmRIYXNFeHRlcm5hbFR5KCZWZWMsIGZhbHNlKTsKKyAgICB9CisgIH0KKworICAvLy8gZ2V0TG9va3VwUmVzdWx0IC0gUmV0dXJuIGFuIGFycmF5IG9mIGFsbCB0aGUgZGVjbHMgdGhhdCB0aGlzIGxpc3QKKyAgLy8vIHJlcHJlc2VudHMuCisgIERlY2xDb250ZXh0Ojpsb29rdXBfcmVzdWx0IGdldExvb2t1cFJlc3VsdCgpIHsKKyAgICBpZiAoaXNOdWxsKCkpCisgICAgICByZXR1cm4gRGVjbENvbnRleHQ6Omxvb2t1cF9yZXN1bHQoKTsKKworICAgIC8vIElmIHdlIGhhdmUgYSBzaW5nbGUgTmFtZWREZWNsLCByZXR1cm4gaXQuCisgICAgaWYgKE5hbWVkRGVjbCAqTkQgPSBnZXRBc0RlY2woKSkgeworICAgICAgYXNzZXJ0KCFpc051bGwoKSAmJiAiRW1wdHkgbGlzdCBpc24ndCBhbGxvd2VkIik7CisKKyAgICAgIC8vIERhdGEgaXMgYSByYXcgcG9pbnRlciB0byBhIE5hbWVkRGVjbCosIHJldHVybiBpdC4KKyAgICAgIHJldHVybiBEZWNsQ29udGV4dDo6bG9va3VwX3Jlc3VsdChORCk7CisgICAgfQorCisgICAgYXNzZXJ0KGdldEFzVmVjdG9yKCkgJiYgIk11c3QgaGF2ZSBhIHZlY3RvciBhdCB0aGlzIHBvaW50Iik7CisgICAgRGVjbHNUeSAmVmVjdG9yID0gKmdldEFzVmVjdG9yKCk7CisKKyAgICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgYSByYW5nZSByZXN1bHQuCisgICAgcmV0dXJuIERlY2xDb250ZXh0Ojpsb29rdXBfcmVzdWx0KFZlY3Rvcik7CisgIH0KKworICAvLy8gSGFuZGxlUmVkZWNsYXJhdGlvbiAtIElmIHRoaXMgaXMgYSByZWRlY2xhcmF0aW9uIG9mIGFuIGV4aXN0aW5nIGRlY2wsCisgIC8vLyByZXBsYWNlIHRoZSBvbGQgb25lIHdpdGggRCBhbmQgcmV0dXJuIHRydWUuICBPdGhlcndpc2UgcmV0dXJuIGZhbHNlLgorICBib29sIEhhbmRsZVJlZGVjbGFyYXRpb24oTmFtZWREZWNsICpELCBib29sIElzS25vd25OZXdlcikgeworICAgIC8vIE1vc3QgZGVjbHMgb25seSBoYXZlIG9uZSBlbnRyeSBpbiB0aGVpciBsaXN0LCBzcGVjaWFsIGNhc2UgaXQuCisgICAgaWYgKE5hbWVkRGVjbCAqT2xkRCA9IGdldEFzRGVjbCgpKSB7CisgICAgICBpZiAoIUQtPmRlY2xhcmF0aW9uUmVwbGFjZXMoT2xkRCwgSXNLbm93bk5ld2VyKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgc2V0T25seVZhbHVlKEQpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgZGVjbGFyYXRpb24gaXMgYWN0dWFsbHkgYSByZWRlY2xhcmF0aW9uLgorICAgIERlY2xzVHkgJlZlYyA9ICpnZXRBc1ZlY3RvcigpOworICAgIGZvciAoRGVjbHNUeTo6aXRlcmF0b3IgT0QgPSBWZWMuYmVnaW4oKSwgT0RFbmQgPSBWZWMuZW5kKCk7CisgICAgICAgICBPRCAhPSBPREVuZDsgKytPRCkgeworICAgICAgTmFtZWREZWNsICpPbGREID0gKk9EOworICAgICAgaWYgKEQtPmRlY2xhcmF0aW9uUmVwbGFjZXMoT2xkRCwgSXNLbm93bk5ld2VyKSkgeworICAgICAgICAqT0QgPSBEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gQWRkU3Vic2VxdWVudERlY2wgLSBUaGlzIGlzIGNhbGxlZCBvbiB0aGUgc2Vjb25kIGFuZCBsYXRlciBkZWNsIHdoZW4gaXQgaXMKKyAgLy8vIG5vdCBhIHJlZGVjbGFyYXRpb24gdG8gbWVyZ2UgaXQgaW50byB0aGUgYXBwcm9wcmlhdGUgcGxhY2UgaW4gb3VyIGxpc3QuCisgIHZvaWQgQWRkU3Vic2VxdWVudERlY2woTmFtZWREZWNsICpEKSB7CisgICAgYXNzZXJ0KCFpc051bGwoKSAmJiAiZG9uJ3QgQWRkU3Vic2VxdWVudERlY2wgd2hlbiB3ZSBoYXZlIG5vIGRlY2xzIik7CisKKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBzZWNvbmQgZGVjbCBhZGRlZCB0byB0aGUgbGlzdCwgY29udmVydCB0aGlzIHRvIHZlY3RvcgorICAgIC8vIGZvcm0uCisgICAgaWYgKE5hbWVkRGVjbCAqT2xkRCA9IGdldEFzRGVjbCgpKSB7CisgICAgICBEZWNsc1R5ICpWVCA9IG5ldyBEZWNsc1R5KCk7CisgICAgICBWVC0+cHVzaF9iYWNrKE9sZEQpOworICAgICAgRGF0YSA9IERlY2xzQW5kSGFzRXh0ZXJuYWxUeShWVCwgZmFsc2UpOworICAgIH0KKworICAgIERlY2xzVHkgJlZlYyA9ICpnZXRBc1ZlY3RvcigpOworCisgICAgLy8gVXNpbmcgZGlyZWN0aXZlcyBlbmQgdXAgaW4gYSBzcGVjaWFsIGVudHJ5IHdoaWNoIGNvbnRhaW5zIG9ubHkKKyAgICAvLyBvdGhlciB1c2luZyBkaXJlY3RpdmVzLCBzbyBhbGwgdGhpcyBsb2dpYyBpcyB3YXN0ZWQgZm9yIHRoZW0uCisgICAgLy8gQnV0IGF2b2lkaW5nIHRoZSBsb2dpYyB3YXN0ZXMgdGltZSBpbiB0aGUgZmFyLW1vcmUtY29tbW9uIGNhc2UKKyAgICAvLyB0aGF0IHdlJ3JlICpub3QqIGFkZGluZyBhIG5ldyB1c2luZyBkaXJlY3RpdmUuCisKKyAgICAvLyBUYWcgZGVjbGFyYXRpb25zIGFsd2F5cyBnbyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IHNvIHRoYXQgYW4KKyAgICAvLyBpdGVyYXRvciB3aGljaCBwb2ludHMgYXQgdGhlIGZpcnN0IHRhZyB3aWxsIHN0YXJ0IGEgc3BhbiBvZgorICAgIC8vIGRlY2xzIHRoYXQgb25seSBjb250YWlucyB0YWdzLgorICAgIGlmIChELT5oYXNUYWdJZGVudGlmaWVyTmFtZXNwYWNlKCkpCisgICAgICBWZWMucHVzaF9iYWNrKEQpOworCisgICAgLy8gUmVzb2x2ZWQgdXNpbmcgZGVjbGFyYXRpb25zIGdvIGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdCBzbyB0aGF0CisgICAgLy8gdGhleSB3b24ndCBzaG93IHVwIGluIG90aGVyIGxvb2t1cCByZXN1bHRzLiAgVW5yZXNvbHZlZCB1c2luZworICAgIC8vIGRlY2xhcmF0aW9ucyAod2hpY2ggYXJlIGFsd2F5cyBpbiBJRE5TX1VzaW5nIHwgSUROU19PcmRpbmFyeSkKKyAgICAvLyBmb2xsb3cgdGhhdCBzbyB0aGF0IHRoZSB1c2luZyBkZWNsYXJhdGlvbnMgd2lsbCBiZSBjb250aWd1b3VzLgorICAgIGVsc2UgaWYgKEQtPmdldElkZW50aWZpZXJOYW1lc3BhY2UoKSAmIERlY2w6OklETlNfVXNpbmcpIHsKKyAgICAgIERlY2xzVHk6Oml0ZXJhdG9yIEkgPSBWZWMuYmVnaW4oKTsKKyAgICAgIGlmIChELT5nZXRJZGVudGlmaWVyTmFtZXNwYWNlKCkgIT0gRGVjbDo6SUROU19Vc2luZykgeworICAgICAgICB3aGlsZSAoSSAhPSBWZWMuZW5kKCkgJiYKKyAgICAgICAgICAgICAgICgqSSktPmdldElkZW50aWZpZXJOYW1lc3BhY2UoKSA9PSBEZWNsOjpJRE5TX1VzaW5nKQorICAgICAgICAgICsrSTsKKyAgICAgIH0KKyAgICAgIFZlYy5pbnNlcnQoSSwgRCk7CisKKyAgICAvLyBBbGwgb3RoZXIgZGVjbGFyYXRpb25zIGdvIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QsIGJ1dCBiZWZvcmUgYW55CisgICAgLy8gdGFnIGRlY2xhcmF0aW9ucy4gIEJ1dCB3ZSBjYW4gYmUgY2xldmVyIGFib3V0IHRhZyBkZWNsYXJhdGlvbnMKKyAgICAvLyBiZWNhdXNlIHRoZXJlIGNhbiBvbmx5IGV2ZXIgYmUgb25lIGluIGEgc2NvcGUuCisgICAgfSBlbHNlIGlmICghVmVjLmVtcHR5KCkgJiYgVmVjLmJhY2soKS0+aGFzVGFnSWRlbnRpZmllck5hbWVzcGFjZSgpKSB7CisgICAgICBOYW1lZERlY2wgKlRhZ0QgPSBWZWMuYmFjaygpOworICAgICAgVmVjLmJhY2soKSA9IEQ7CisgICAgICBWZWMucHVzaF9iYWNrKFRhZ0QpOworICAgIH0gZWxzZQorICAgICAgVmVjLnB1c2hfYmFjayhEKTsKKyAgfQorfTsKKworY2xhc3MgU3RvcmVkRGVjbHNNYXAKKyAgICA6IHB1YmxpYyBsbHZtOjpTbWFsbERlbnNlTWFwPERlY2xhcmF0aW9uTmFtZSwgU3RvcmVkRGVjbHNMaXN0LCA0PiB7CitwdWJsaWM6CisgIHN0YXRpYyB2b2lkIERlc3Ryb3lBbGwoU3RvcmVkRGVjbHNNYXAgKk1hcCwgYm9vbCBEZXBlbmRlbnQpOworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsgLy8gd2Fsa3MgdGhlIGNoYWluIGRlbGV0aW5nIHRoZXNlCisgIGZyaWVuZCBjbGFzcyBEZWNsQ29udGV4dDsKKworICBsbHZtOjpQb2ludGVySW50UGFpcjxTdG9yZWREZWNsc01hcCosIDE+IFByZXZpb3VzOworfTsKKworY2xhc3MgRGVwZW5kZW50U3RvcmVkRGVjbHNNYXAgOiBwdWJsaWMgU3RvcmVkRGVjbHNNYXAgeworcHVibGljOgorICBEZXBlbmRlbnRTdG9yZWREZWNsc01hcCgpID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIERlY2xDb250ZXh0OyAvLyBpdGVyYXRlcyBvdmVyIGRpYWdub3N0aWNzCisgIGZyaWVuZCBjbGFzcyBEZXBlbmRlbnREaWFnbm9zdGljOworCisgIERlcGVuZGVudERpYWdub3N0aWMgKkZpcnN0RGlhZ25vc3RpYyA9IG51bGxwdHI7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19BU1RfREVDTENPTlRFWFRJTlRFUk5BTFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xGcmllbmQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsRnJpZW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxYzZiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsRnJpZW5kLmgKQEAgLTAsMCArMSwyNjAgQEAKKy8vPT09LSBEZWNsRnJpZW5kLmggLSBDbGFzc2VzIGZvciBDKysgZnJpZW5kIGRlY2xhcmF0aW9ucyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIHNlY3Rpb24gb2YgdGhlIEFTVCByZXByZXNlbnRpbmcgQysrIGZyaWVuZAorLy8gZGVjbGFyYXRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfREVDTEZSSUVORF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX0RFQ0xGUklFTkRfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2wuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbEJhc2UuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbENYWC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsVGVtcGxhdGUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXh0ZXJuYWxBU1RTb3VyY2UuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZUxvYy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RyYWlsaW5nT2JqZWN0cy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFTVENvbnRleHQ7CisKKy8vLyBGcmllbmREZWNsIC0gUmVwcmVzZW50cyB0aGUgZGVjbGFyYXRpb24gb2YgYSBmcmllbmQgZW50aXR5LAorLy8vIHdoaWNoIGNhbiBiZSBhIGZ1bmN0aW9uLCBhIHR5cGUsIG9yIGEgdGVtcGxhdGVkIGZ1bmN0aW9uIG9yIHR5cGUuCisvLy8gRm9yIGV4YW1wbGU6CisvLy8KKy8vLyBAY29kZQorLy8vIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBIHsKKy8vLyAgIGZyaWVuZCBpbnQgZm9vKFQpOworLy8vICAgZnJpZW5kIGNsYXNzIEI7CisvLy8gICBmcmllbmQgVDsgLy8gb25seSBpbiBDKysweAorLy8vICAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IGZyaWVuZCBjbGFzcyBDOworLy8vICAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IGZyaWVuZCBBJiBvcGVyYXRvcis9KEEmLCBjb25zdCBVJikgeyAuLi4gfQorLy8vIH07CisvLy8gQGVuZGNvZGUKKy8vLworLy8vIFRoZSBzZW1hbnRpYyBjb250ZXh0IG9mIGEgZnJpZW5kIGRlY2wgaXMgaXRzIGRlY2xhcmluZyBjbGFzcy4KK2NsYXNzIEZyaWVuZERlY2wgZmluYWwKKyAgICA6IHB1YmxpYyBEZWNsLAorICAgICAgcHJpdmF0ZSBsbHZtOjpUcmFpbGluZ09iamVjdHM8RnJpZW5kRGVjbCwgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICo+IHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIHVzaW5nIEZyaWVuZFVuaW9uID0gbGx2bTo6UG9pbnRlclVuaW9uPE5hbWVkRGVjbCAqLCBUeXBlU291cmNlSW5mbyAqPjsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIENYWFJlY29yZERlY2w7CisgIGZyaWVuZCBjbGFzcyBDWFhSZWNvcmREZWNsOjpmcmllbmRfaXRlcmF0b3I7CisKKyAgLy8gVGhlIGRlY2xhcmF0aW9uIHRoYXQncyBhIGZyaWVuZCBvZiB0aGlzIGNsYXNzLgorICBGcmllbmRVbmlvbiBGcmllbmQ7CisKKyAgLy8gQSBwb2ludGVyIHRvIHRoZSBuZXh0IGZyaWVuZCBpbiB0aGUgc2VxdWVuY2UuCisgIExhenlEZWNsUHRyIE5leHRGcmllbmQ7CisKKyAgLy8gTG9jYXRpb24gb2YgdGhlICdmcmllbmQnIHNwZWNpZmllci4KKyAgU291cmNlTG9jYXRpb24gRnJpZW5kTG9jOworCisgIC8vLyBUcnVlIGlmIHRoaXMgJ2ZyaWVuZCcgZGVjbGFyYXRpb24gaXMgdW5zdXBwb3J0ZWQuICBFdmVudHVhbGx5IHdlCisgIC8vLyB3aWxsIHN1cHBvcnQgZXZlcnkgcG9zc2libGUgZnJpZW5kIGRlY2xhcmF0aW9uLCBidXQgZm9yIG5vdyB3ZQorICAvLy8gc2lsZW50bHkgaWdub3JlIHNvbWUgYW5kIHNldCB0aGlzIGZsYWcgdG8gYXV0aG9yaXplIGFsbCBhY2Nlc3MuCisgIHVuc2lnbmVkIFVuc3VwcG9ydGVkRnJpZW5kIDogMTsKKworICAvLyBUaGUgbnVtYmVyIG9mICJvdXRlciIgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3RzIGluIG5vbi10ZW1wbGF0aWMKKyAgLy8gKGN1cnJlbnRseSB1bnN1cHBvcnRlZCkgZnJpZW5kIHR5cGUgZGVjbGFyYXRpb25zLCBzdWNoIGFzCisgIC8vICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gZnJpZW5kIGNsYXNzIEE8VD46OkI7CisgIHVuc2lnbmVkIE51bVRQTGlzdHMgOiAzMTsKKworICBGcmllbmREZWNsKERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gTCwgRnJpZW5kVW5pb24gRnJpZW5kLAorICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEZyaWVuZEwsCisgICAgICAgICAgICAgQXJyYXlSZWY8VGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICo+IEZyaWVuZFR5cGVUUExpc3RzKQorICAgICAgOiBEZWNsKERlY2w6OkZyaWVuZCwgREMsIEwpLCBGcmllbmQoRnJpZW5kKSwgRnJpZW5kTG9jKEZyaWVuZEwpLAorICAgICAgICBVbnN1cHBvcnRlZEZyaWVuZChmYWxzZSksIE51bVRQTGlzdHMoRnJpZW5kVHlwZVRQTGlzdHMuc2l6ZSgpKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bVRQTGlzdHM7ICsraSkKKyAgICAgIGdldFRyYWlsaW5nT2JqZWN0czxUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKj4oKVtpXSA9IEZyaWVuZFR5cGVUUExpc3RzW2ldOworICB9CisKKyAgRnJpZW5kRGVjbChFbXB0eVNoZWxsIEVtcHR5LCB1bnNpZ25lZCBOdW1GcmllbmRUeXBlVFBMaXN0cykKKyAgICAgIDogRGVjbChEZWNsOjpGcmllbmQsIEVtcHR5KSwgVW5zdXBwb3J0ZWRGcmllbmQoZmFsc2UpLAorICAgICAgICBOdW1UUExpc3RzKE51bUZyaWVuZFR5cGVUUExpc3RzKSB7fQorCisgIEZyaWVuZERlY2wgKmdldE5leHRGcmllbmQoKSB7CisgICAgaWYgKCFOZXh0RnJpZW5kLmlzT2Zmc2V0KCkpCisgICAgICByZXR1cm4gY2FzdF9vcl9udWxsPEZyaWVuZERlY2w+KE5leHRGcmllbmQuZ2V0KG51bGxwdHIpKTsKKyAgICByZXR1cm4gZ2V0TmV4dEZyaWVuZFNsb3dDYXNlKCk7CisgIH0KKworICBGcmllbmREZWNsICpnZXROZXh0RnJpZW5kU2xvd0Nhc2UoKTsKKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisgIGZyaWVuZCBjbGFzcyBBU1ROb2RlSW1wb3J0ZXI7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgc3RhdGljIEZyaWVuZERlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCwgRnJpZW5kVW5pb24gRnJpZW5kXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBGcmllbmRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFRlbXBsYXRlUGFyYW1ldGVyTGlzdCo+IEZyaWVuZFR5cGVUUExpc3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBOb25lKTsKKyAgc3RhdGljIEZyaWVuZERlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGcmllbmRUeXBlTnVtVFBMaXN0cyk7CisKKyAgLy8vIElmIHRoaXMgZnJpZW5kIGRlY2xhcmF0aW9uIG5hbWVzIGFuICh1bnRlbXBsYXRlZCBidXQgcG9zc2libHkKKyAgLy8vIGRlcGVuZGVudCkgdHlwZSwgcmV0dXJuIHRoZSB0eXBlOyBvdGhlcndpc2UgcmV0dXJuIG51bGwuICBUaGlzCisgIC8vLyBpcyB1c2VkIGZvciBlbGFib3JhdGVkLXR5cGUtc3BlY2lmaWVycyBhbmQsIGluIEMrKzB4LCBmb3IKKyAgLy8vIGFyYml0cmFyeSBmcmllbmQgdHlwZSBkZWNsYXJhdGlvbnMuCisgIFR5cGVTb3VyY2VJbmZvICpnZXRGcmllbmRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBGcmllbmQuZHluX2Nhc3Q8VHlwZVNvdXJjZUluZm8qPigpOworICB9CisKKyAgdW5zaWduZWQgZ2V0RnJpZW5kVHlwZU51bVRlbXBsYXRlUGFyYW1ldGVyTGlzdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIE51bVRQTGlzdHM7CisgIH0KKworICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKmdldEZyaWVuZFR5cGVUZW1wbGF0ZVBhcmFtZXRlckxpc3QodW5zaWduZWQgTikgY29uc3QgeworICAgIGFzc2VydChOIDwgTnVtVFBMaXN0cyk7CisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKj4oKVtOXTsKKyAgfQorCisgIC8vLyBJZiB0aGlzIGZyaWVuZCBkZWNsYXJhdGlvbiBkb2Vzbid0IG5hbWUgYSB0eXBlLCByZXR1cm4gdGhlIGlubmVyCisgIC8vLyBkZWNsYXJhdGlvbi4KKyAgTmFtZWREZWNsICpnZXRGcmllbmREZWNsKCkgY29uc3QgeworICAgIHJldHVybiBGcmllbmQuZHluX2Nhc3Q8TmFtZWREZWNsICo+KCk7CisgIH0KKworICAvLy8gUmV0cmlldmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgJ2ZyaWVuZCcga2V5d29yZC4KKyAgU291cmNlTG9jYXRpb24gZ2V0RnJpZW5kTG9jKCkgY29uc3QgeworICAgIHJldHVybiBGcmllbmRMb2M7CisgIH0KKworICAvLy8gUmV0cmlldmVzIHRoZSBzb3VyY2UgcmFuZ2UgZm9yIHRoZSBmcmllbmQgZGVjbGFyYXRpb24uCisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWSB7CisgICAgaWYgKE5hbWVkRGVjbCAqTkQgPSBnZXRGcmllbmREZWNsKCkpIHsKKyAgICAgIGlmIChGdW5jdGlvbkRlY2wgKkZEID0gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPihORCkpCisgICAgICAgIHJldHVybiBGRC0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICAgIGlmIChGdW5jdGlvblRlbXBsYXRlRGVjbCAqRlREID0gZHluX2Nhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KE5EKSkKKyAgICAgICAgcmV0dXJuIEZURC0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICAgIGlmIChDbGFzc1RlbXBsYXRlRGVjbCAqQ1REID0gZHluX2Nhc3Q8Q2xhc3NUZW1wbGF0ZURlY2w+KE5EKSkKKyAgICAgICAgcmV0dXJuIENURC0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICAgIGlmIChEZWNsYXJhdG9yRGVjbCAqREQgPSBkeW5fY2FzdDxEZWNsYXJhdG9yRGVjbD4oTkQpKSB7CisgICAgICAgIGlmIChERC0+Z2V0T3V0ZXJMb2NTdGFydCgpICE9IERELT5nZXRJbm5lckxvY1N0YXJ0KCkpCisgICAgICAgICAgcmV0dXJuIERELT5nZXRTb3VyY2VSYW5nZSgpOworICAgICAgfQorICAgICAgcmV0dXJuIFNvdXJjZVJhbmdlKGdldEZyaWVuZExvYygpLCBORC0+Z2V0TG9jRW5kKCkpOworICAgIH0KKyAgICBlbHNlIGlmIChUeXBlU291cmNlSW5mbyAqVEluZm8gPSBnZXRGcmllbmRUeXBlKCkpIHsKKyAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TCA9CisgICAgICAgICAgKE51bVRQTGlzdHMgPT0gMCkgPyBnZXRGcmllbmRMb2MoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0VHJhaWxpbmdPYmplY3RzPFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqPigpWzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5nZXRUZW1wbGF0ZUxvYygpOworICAgICAgcmV0dXJuIFNvdXJjZVJhbmdlKFN0YXJ0TCwgVEluZm8tPmdldFR5cGVMb2MoKS5nZXRFbmRMb2MoKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRGcmllbmRMb2MoKSwgZ2V0TG9jYXRpb24oKSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lcyBpZiB0aGlzIGZyaWVuZCBraW5kIGlzIHVuc3VwcG9ydGVkLgorICBib29sIGlzVW5zdXBwb3J0ZWRGcmllbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIFVuc3VwcG9ydGVkRnJpZW5kOworICB9CisgIHZvaWQgc2V0VW5zdXBwb3J0ZWRGcmllbmQoYm9vbCBVbnN1cHBvcnRlZCkgeworICAgIFVuc3VwcG9ydGVkRnJpZW5kID0gVW5zdXBwb3J0ZWQ7CisgIH0KKworICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC9ldGMuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gRGVjbDo6RnJpZW5kOyB9Cit9OworCisvLy8gQW4gaXRlcmF0b3Igb3ZlciB0aGUgZnJpZW5kIGRlY2xhcmF0aW9ucyBvZiBhIGNsYXNzLgorY2xhc3MgQ1hYUmVjb3JkRGVjbDo6ZnJpZW5kX2l0ZXJhdG9yIHsKKyAgZnJpZW5kIGNsYXNzIENYWFJlY29yZERlY2w7CisKKyAgRnJpZW5kRGVjbCAqUHRyOworCisgIGV4cGxpY2l0IGZyaWVuZF9pdGVyYXRvcihGcmllbmREZWNsICpQdHIpIDogUHRyKFB0cikge30KKworcHVibGljOgorICBmcmllbmRfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IEZyaWVuZERlY2wgKjsKKyAgdXNpbmcgcmVmZXJlbmNlID0gRnJpZW5kRGVjbCAqOworICB1c2luZyBwb2ludGVyID0gRnJpZW5kRGVjbCAqOworICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBpbnQ7CisgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZzsKKworICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gUHRyOyB9CisKKyAgZnJpZW5kX2l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgIGFzc2VydChQdHIgJiYgImF0dGVtcHQgdG8gaW5jcmVtZW50IHBhc3QgZW5kIG9mIGZyaWVuZCBsaXN0Iik7CisgICAgUHRyID0gUHRyLT5nZXROZXh0RnJpZW5kKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgZnJpZW5kX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CisgICAgZnJpZW5kX2l0ZXJhdG9yIHRtcCA9ICp0aGlzOworICAgICsrKnRoaXM7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBmcmllbmRfaXRlcmF0b3IgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIFB0ciA9PSBPdGhlci5QdHI7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgZnJpZW5kX2l0ZXJhdG9yICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBQdHIgIT0gT3RoZXIuUHRyOworICB9CisKKyAgZnJpZW5kX2l0ZXJhdG9yICZvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBOKSB7CisgICAgYXNzZXJ0KE4gPj0gMCAmJiAiY2Fubm90IHJld2luZCBhIENYWFJlY29yZERlY2w6OmZyaWVuZF9pdGVyYXRvciIpOworICAgIHdoaWxlIChOLS0pCisgICAgICArKyp0aGlzOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGZyaWVuZF9pdGVyYXRvciBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIE4pIGNvbnN0IHsKKyAgICBmcmllbmRfaXRlcmF0b3IgdG1wID0gKnRoaXM7CisgICAgdG1wICs9IE47CisgICAgcmV0dXJuIHRtcDsKKyAgfQorfTsKKworaW5saW5lIENYWFJlY29yZERlY2w6OmZyaWVuZF9pdGVyYXRvciBDWFhSZWNvcmREZWNsOjpmcmllbmRfYmVnaW4oKSBjb25zdCB7CisgIHJldHVybiBmcmllbmRfaXRlcmF0b3IoZ2V0Rmlyc3RGcmllbmQoKSk7Cit9CisKK2lubGluZSBDWFhSZWNvcmREZWNsOjpmcmllbmRfaXRlcmF0b3IgQ1hYUmVjb3JkRGVjbDo6ZnJpZW5kX2VuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGZyaWVuZF9pdGVyYXRvcihudWxscHRyKTsKK30KKworaW5saW5lIENYWFJlY29yZERlY2w6OmZyaWVuZF9yYW5nZSBDWFhSZWNvcmREZWNsOjpmcmllbmRzKCkgY29uc3QgeworICByZXR1cm4gZnJpZW5kX3JhbmdlKGZyaWVuZF9iZWdpbigpLCBmcmllbmRfZW5kKCkpOworfQorCitpbmxpbmUgdm9pZCBDWFhSZWNvcmREZWNsOjpwdXNoRnJpZW5kRGVjbChGcmllbmREZWNsICpGRCkgeworICBhc3NlcnQoIUZELT5OZXh0RnJpZW5kICYmICJmcmllbmQgYWxyZWFkeSBoYXMgbmV4dCBmcmllbmQ/Iik7CisgIEZELT5OZXh0RnJpZW5kID0gZGF0YSgpLkZpcnN0RnJpZW5kOworICBkYXRhKCkuRmlyc3RGcmllbmQgPSBGRDsKK30KKyAgCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19BU1RfREVDTEZSSUVORF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbEdyb3VwLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbEdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ1YWFhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsR3JvdXAuaApAQCAtMCwwICsxLDE1NiBAQAorLy89PT0tIERlY2xHcm91cC5oIC0gQ2xhc3NlcyBmb3IgcmVwcmVzZW50aW5nIGdyb3VwcyBvZiBEZWNscyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIERlY2xHcm91cCwgRGVjbEdyb3VwUmVmLCBhbmQgT3duaW5nRGVjbEdyb3VwIGNsYXNzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9ERUNMR1JPVVBfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9ERUNMR1JPVVBfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RyYWlsaW5nT2JqZWN0cy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQVNUQ29udGV4dDsKK2NsYXNzIERlY2w7CisKK2NsYXNzIERlY2xHcm91cCBmaW5hbCA6IHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPERlY2xHcm91cCwgRGVjbCAqPiB7CisgIC8vIEZJWE1FOiBJbmNsdWRlIGEgVHlwZVNwZWNpZmllciBvYmplY3QuCisgIHVuc2lnbmVkIE51bURlY2xzID0gMDsKKworcHJpdmF0ZToKKyAgRGVjbEdyb3VwKCkgPSBkZWZhdWx0OworICBEZWNsR3JvdXAodW5zaWduZWQgbnVtZGVjbHMsIERlY2wqKiBkZWNscyk7CisKK3B1YmxpYzoKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKworICBzdGF0aWMgRGVjbEdyb3VwICpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbCAqKkRlY2xzLCB1bnNpZ25lZCBOdW1EZWNscyk7CisKKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE51bURlY2xzOyB9CisKKyAgRGVjbComIG9wZXJhdG9yW10odW5zaWduZWQgaSkgeworICAgIGFzc2VydCAoaSA8IE51bURlY2xzICYmICJPdXQtb2YtYm91bmRzIGFjY2Vzcy4iKTsKKyAgICByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPERlY2wgKj4oKVtpXTsKKyAgfQorCisgIERlY2wqIGNvbnN0JiBvcGVyYXRvcltdKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQgKGkgPCBOdW1EZWNscyAmJiAiT3V0LW9mLWJvdW5kcyBhY2Nlc3MuIik7CisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxEZWNsICo+KClbaV07CisgIH0KK307CisKK2NsYXNzIERlY2xHcm91cFJlZiB7CisgIC8vIE5vdGUgdGhpcyBpcyBub3QgYSBQb2ludGVySW50UGFpciBiZWNhdXNlIHdlIG5lZWQgdGhlIGFkZHJlc3Mgb2YgdGhlCisgIC8vIG5vbi1ncm91cCBjYXNlIHRvIGJlIHZhbGlkIGFzIGEgRGVjbCoqIGZvciBpdGVyYXRpb24uCisgIGVudW0gS2luZCB7IFNpbmdsZURlY2xLaW5kPTB4MCwgRGVjbEdyb3VwS2luZD0weDEsIE1hc2s9MHgxIH07CisKKyAgRGVjbCogRCA9IG51bGxwdHI7CisKKyAgS2luZCBnZXRLaW5kKCkgY29uc3QgeworICAgIHJldHVybiAoS2luZCkgKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihEKSAmIE1hc2spOworICB9CisKK3B1YmxpYzoKKyAgRGVjbEdyb3VwUmVmKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBEZWNsR3JvdXBSZWYoRGVjbCogZCkgOiBEKGQpIHt9CisgIGV4cGxpY2l0IERlY2xHcm91cFJlZihEZWNsR3JvdXAqIGRnKQorICAgIDogRCgoRGVjbCopIChyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZGcpIHwgRGVjbEdyb3VwS2luZCkpIHt9CisKKyAgc3RhdGljIERlY2xHcm91cFJlZiBDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbCAqKkRlY2xzLCB1bnNpZ25lZCBOdW1EZWNscykgeworICAgIGlmIChOdW1EZWNscyA9PSAwKQorICAgICAgcmV0dXJuIERlY2xHcm91cFJlZigpOworICAgIGlmIChOdW1EZWNscyA9PSAxKQorICAgICAgcmV0dXJuIERlY2xHcm91cFJlZihEZWNsc1swXSk7CisgICAgcmV0dXJuIERlY2xHcm91cFJlZihEZWNsR3JvdXA6OkNyZWF0ZShDLCBEZWNscywgTnVtRGVjbHMpKTsKKyAgfQorCisgIHVzaW5nIGl0ZXJhdG9yID0gRGVjbCAqKjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBEZWNsICogY29uc3QgKjsKKworICBib29sIGlzTnVsbCgpIGNvbnN0IHsgcmV0dXJuIEQgPT0gbnVsbHB0cjsgfQorICBib29sIGlzU2luZ2xlRGVjbCgpIGNvbnN0IHsgcmV0dXJuIGdldEtpbmQoKSA9PSBTaW5nbGVEZWNsS2luZDsgfQorICBib29sIGlzRGVjbEdyb3VwKCkgY29uc3QgeyByZXR1cm4gZ2V0S2luZCgpID09IERlY2xHcm91cEtpbmQ7IH0KKworICBEZWNsICpnZXRTaW5nbGVEZWNsKCkgeworICAgIGFzc2VydChpc1NpbmdsZURlY2woKSAmJiAiSXNuJ3QgYSBzaW5nbGUgZGVjbCIpOworICAgIHJldHVybiBEOworICB9CisgIGNvbnN0IERlY2wgKmdldFNpbmdsZURlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RGVjbEdyb3VwUmVmKj4odGhpcyktPmdldFNpbmdsZURlY2woKTsKKyAgfQorCisgIERlY2xHcm91cCAmZ2V0RGVjbEdyb3VwKCkgeworICAgIGFzc2VydChpc0RlY2xHcm91cCgpICYmICJJc24ndCBhIGRlY2xncm91cCIpOworICAgIHJldHVybiAqKChEZWNsR3JvdXAqKShyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oRCkgJiB+TWFzaykpOworICB9CisgIGNvbnN0IERlY2xHcm91cCAmZ2V0RGVjbEdyb3VwKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PERlY2xHcm91cFJlZio+KHRoaXMpLT5nZXREZWNsR3JvdXAoKTsKKyAgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeworICAgIGlmIChpc1NpbmdsZURlY2woKSkKKyAgICAgIHJldHVybiBEID8gJkQgOiBudWxscHRyOworICAgIHJldHVybiAmZ2V0RGVjbEdyb3VwKClbMF07CisgIH0KKworICBpdGVyYXRvciBlbmQoKSB7CisgICAgaWYgKGlzU2luZ2xlRGVjbCgpKQorICAgICAgcmV0dXJuIEQgPyAmRCsxIDogbnVsbHB0cjsKKyAgICBEZWNsR3JvdXAgJkcgPSBnZXREZWNsR3JvdXAoKTsKKyAgICByZXR1cm4gJkdbMF0gKyBHLnNpemUoKTsKKyAgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgIGlmIChpc1NpbmdsZURlY2woKSkKKyAgICAgIHJldHVybiBEID8gJkQgOiBudWxscHRyOworICAgIHJldHVybiAmZ2V0RGVjbEdyb3VwKClbMF07CisgIH0KKworICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7CisgICAgaWYgKGlzU2luZ2xlRGVjbCgpKQorICAgICAgcmV0dXJuIEQgPyAmRCsxIDogbnVsbHB0cjsKKyAgICBjb25zdCBEZWNsR3JvdXAgJkcgPSBnZXREZWNsR3JvdXAoKTsKKyAgICByZXR1cm4gJkdbMF0gKyBHLnNpemUoKTsKKyAgfQorCisgIHZvaWQgKmdldEFzT3BhcXVlUHRyKCkgY29uc3QgeyByZXR1cm4gRDsgfQorICBzdGF0aWMgRGVjbEdyb3VwUmVmIGdldEZyb21PcGFxdWVQdHIodm9pZCAqUHRyKSB7CisgICAgRGVjbEdyb3VwUmVmIFg7CisgICAgWC5EID0gc3RhdGljX2Nhc3Q8RGVjbCo+KFB0cik7CisgICAgcmV0dXJuIFg7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKK25hbWVzcGFjZSBsbHZtIHsKKworICAvLyBEZWNsR3JvdXBSZWYgaXMgImxpa2UgYSBwb2ludGVyIiwgaW1wbGVtZW50IFBvaW50ZXJMaWtlVHlwZVRyYWl0cy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBQb2ludGVyTGlrZVR5cGVUcmFpdHM7CisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBQb2ludGVyTGlrZVR5cGVUcmFpdHM8Y2xhbmc6OkRlY2xHcm91cFJlZj4geworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0QXNWb2lkUG9pbnRlcihjbGFuZzo6RGVjbEdyb3VwUmVmIFApIHsKKyAgICAgIHJldHVybiBQLmdldEFzT3BhcXVlUHRyKCk7CisgICAgfQorCisgICAgc3RhdGljIGlubGluZSBjbGFuZzo6RGVjbEdyb3VwUmVmIGdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7CisgICAgICByZXR1cm4gY2xhbmc6OkRlY2xHcm91cFJlZjo6Z2V0RnJvbU9wYXF1ZVB0cihQKTsKKyAgICB9CisKKyAgICBlbnVtIHsgTnVtTG93Qml0c0F2YWlsYWJsZSA9IDAgfTsKKyAgfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DTEFOR19BU1RfREVDTEdST1VQX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsTG9va3Vwcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xMb29rdXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRlYjNmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsTG9va3Vwcy5oCkBAIC0wLDAgKzEsMTA1IEBACisvLz09PS0gRGVjbExvb2t1cHMuaCAtIExvdy1sZXZlbCBpbnRlcmZhY2UgdG8gYWxsIG5hbWVzIGluIGEgREMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyBEZWNsQ29udGV4dDo6YWxsX2xvb2t1cHNfaXRlcmF0b3IuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9ERUNMTE9PS1VQU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX0RFQ0xMT09LVVBTX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xCYXNlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDb250ZXh0SW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xhcmF0aW9uTmFtZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHRlcm5hbEFTVFNvdXJjZS5oIgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKKy8vLyBhbGxfbG9va3Vwc19pdGVyYXRvciAtIEFuIGl0ZXJhdG9yIHRoYXQgcHJvdmlkZXMgYSB2aWV3IG92ZXIgdGhlIHJlc3VsdHMKKy8vLyBvZiBsb29raW5nIHVwIGV2ZXJ5IHBvc3NpYmxlIG5hbWUuCitjbGFzcyBEZWNsQ29udGV4dDo6YWxsX2xvb2t1cHNfaXRlcmF0b3IgeworICBTdG9yZWREZWNsc01hcDo6aXRlcmF0b3IgSXQsIEVuZDsKKworcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0gbG9va3VwX3Jlc3VsdDsKKyAgdXNpbmcgcmVmZXJlbmNlID0gbG9va3VwX3Jlc3VsdDsKKyAgdXNpbmcgcG9pbnRlciA9IGxvb2t1cF9yZXN1bHQ7CisgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZzsKKyAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gc3RkOjpwdHJkaWZmX3Q7CisKKyAgYWxsX2xvb2t1cHNfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgIGFsbF9sb29rdXBzX2l0ZXJhdG9yKFN0b3JlZERlY2xzTWFwOjppdGVyYXRvciBJdCwKKyAgICAgICAgICAgICAgICAgICAgICAgU3RvcmVkRGVjbHNNYXA6Oml0ZXJhdG9yIEVuZCkKKyAgICAgIDogSXQoSXQpLCBFbmQoRW5kKSB7fQorCisgIERlY2xhcmF0aW9uTmFtZSBnZXRMb29rdXBOYW1lKCkgY29uc3QgeyByZXR1cm4gSXQtPmZpcnN0OyB9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIEl0LT5zZWNvbmQuZ2V0TG9va3VwUmVzdWx0KCk7IH0KKyAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gSXQtPnNlY29uZC5nZXRMb29rdXBSZXN1bHQoKTsgfQorCisgIGFsbF9sb29rdXBzX2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeworICAgIC8vIEZpbHRlciBvdXQgdXNpbmcgZGlyZWN0aXZlcy4gVGhleSBkb24ndCBiZWxvbmcgYXMgcmVzdWx0cyBmcm9tIG5hbWUKKyAgICAvLyBsb29rdXAgYW55d2F5cywgZXhjZXB0IGFzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gVXNlcnMgb2YgdGhlIEFQSQorICAgIC8vIHNob3VsZCBub3QgZXhwZWN0IHRvIGdldCB0aGVtIChvciB3b3JzZSwgcmVseSBvbiBpdCkuCisgICAgZG8geworICAgICAgKytJdDsKKyAgICB9IHdoaWxlIChJdCAhPSBFbmQgJiYKKyAgICAgICAgICAgICBJdC0+Zmlyc3QgPT0gRGVjbGFyYXRpb25OYW1lOjpnZXRVc2luZ0RpcmVjdGl2ZU5hbWUoKSk7CisgICAgICAgICAgICAgCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgYWxsX2xvb2t1cHNfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBhbGxfbG9va3Vwc19pdGVyYXRvciB0bXAoKnRoaXMpOworICAgICsrKCp0aGlzKTsKKyAgICByZXR1cm4gdG1wOworICB9CisKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShhbGxfbG9va3Vwc19pdGVyYXRvciB4LCBhbGxfbG9va3Vwc19pdGVyYXRvciB5KSB7CisgICAgcmV0dXJuIHguSXQgPT0geS5JdDsKKyAgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oYWxsX2xvb2t1cHNfaXRlcmF0b3IgeCwgYWxsX2xvb2t1cHNfaXRlcmF0b3IgeSkgeworICAgIHJldHVybiB4Lkl0ICE9IHkuSXQ7CisgIH0KK307CisKK2lubGluZSBEZWNsQ29udGV4dDo6bG9va3Vwc19yYW5nZSBEZWNsQ29udGV4dDo6bG9va3VwcygpIGNvbnN0IHsKKyAgRGVjbENvbnRleHQgKlByaW1hcnkgPSBjb25zdF9jYXN0PERlY2xDb250ZXh0Kj4odGhpcyktPmdldFByaW1hcnlDb250ZXh0KCk7CisgIGlmIChQcmltYXJ5LT5oYXNFeHRlcm5hbFZpc2libGVTdG9yYWdlKCkpCisgICAgZ2V0UGFyZW50QVNUQ29udGV4dCgpLmdldEV4dGVybmFsU291cmNlKCktPmNvbXBsZXRlVmlzaWJsZURlY2xzTWFwKFByaW1hcnkpOworICBpZiAoU3RvcmVkRGVjbHNNYXAgKk1hcCA9IFByaW1hcnktPmJ1aWxkTG9va3VwKCkpCisgICAgcmV0dXJuIGxvb2t1cHNfcmFuZ2UoYWxsX2xvb2t1cHNfaXRlcmF0b3IoTWFwLT5iZWdpbigpLCBNYXAtPmVuZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfbG9va3Vwc19pdGVyYXRvcihNYXAtPmVuZCgpLCBNYXAtPmVuZCgpKSk7CisKKyAgLy8gU3ludGhlc2l6ZSBhbiBlbXB0eSByYW5nZS4gVGhpcyByZXF1aXJlcyB0aGF0IHR3byBkZWZhdWx0IGNvbnN0cnVjdGVkCisgIC8vIHZlcnNpb25zIG9mIHRoZXNlIGl0ZXJhdG9ycyBmb3JtIGEgdmFsaWQgZW1wdHkgcmFuZ2UuCisgIHJldHVybiBsb29rdXBzX3JhbmdlKGFsbF9sb29rdXBzX2l0ZXJhdG9yKCksIGFsbF9sb29rdXBzX2l0ZXJhdG9yKCkpOworfQorCitpbmxpbmUgRGVjbENvbnRleHQ6Omxvb2t1cHNfcmFuZ2UKK0RlY2xDb250ZXh0Ojpub2xvYWRfbG9va3Vwcyhib29sIFByZXNlcnZlSW50ZXJuYWxTdGF0ZSkgY29uc3QgeworICBEZWNsQ29udGV4dCAqUHJpbWFyeSA9IGNvbnN0X2Nhc3Q8RGVjbENvbnRleHQqPih0aGlzKS0+Z2V0UHJpbWFyeUNvbnRleHQoKTsKKyAgaWYgKCFQcmVzZXJ2ZUludGVybmFsU3RhdGUpCisgICAgUHJpbWFyeS0+bG9hZExhenlMb2NhbExleGljYWxMb29rdXBzKCk7CisgIGlmIChTdG9yZWREZWNsc01hcCAqTWFwID0gUHJpbWFyeS0+Z2V0TG9va3VwUHRyKCkpCisgICAgcmV0dXJuIGxvb2t1cHNfcmFuZ2UoYWxsX2xvb2t1cHNfaXRlcmF0b3IoTWFwLT5iZWdpbigpLCBNYXAtPmVuZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfbG9va3Vwc19pdGVyYXRvcihNYXAtPmVuZCgpLCBNYXAtPmVuZCgpKSk7CisKKyAgLy8gU3ludGhlc2l6ZSBhbiBlbXB0eSByYW5nZS4gVGhpcyByZXF1aXJlcyB0aGF0IHR3byBkZWZhdWx0IGNvbnN0cnVjdGVkCisgIC8vIHZlcnNpb25zIG9mIHRoZXNlIGl0ZXJhdG9ycyBmb3JtIGEgdmFsaWQgZW1wdHkgcmFuZ2UuCisgIHJldHVybiBsb29rdXBzX3JhbmdlKGFsbF9sb29rdXBzX2l0ZXJhdG9yKCksIGFsbF9sb29rdXBzX2l0ZXJhdG9yKCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19BU1RfREVDTExPT0tVUFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xOb2Rlcy5pbmMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbE5vZGVzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzczNDcwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xOb2Rlcy5pbmMKQEAgLTAsMCArMSw1ODkgQEAKKy8qPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogTGlzdCBvZiBBU1Qgbm9kZXMgb2YgYSBwYXJ0aWN1bGFyIGtpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLCBkbyBub3QgZWRpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgQUJTVFJBQ1RfREVDTAorIyAgZGVmaW5lIEFCU1RSQUNUX0RFQ0woVHlwZSkgVHlwZQorI2VuZGlmCisjaWZuZGVmIERFQ0xfUkFOR0UKKyMgIGRlZmluZSBERUNMX1JBTkdFKEJhc2UsIEZpcnN0LCBMYXN0KQorI2VuZGlmCisKKyNpZm5kZWYgTEFTVF9ERUNMX1JBTkdFCisjICBkZWZpbmUgTEFTVF9ERUNMX1JBTkdFKEJhc2UsIEZpcnN0LCBMYXN0KSBERUNMX1JBTkdFKEJhc2UsIEZpcnN0LCBMYXN0KQorI2VuZGlmCisKKyNpZm5kZWYgQUNDRVNTU1BFQworIyAgZGVmaW5lIEFDQ0VTU1NQRUMoVHlwZSwgQmFzZSkgREVDTChUeXBlLCBCYXNlKQorI2VuZGlmCitBQ0NFU1NTUEVDKEFjY2Vzc1NwZWMsIERlY2wpCisjdW5kZWYgQUNDRVNTU1BFQworCisjaWZuZGVmIEJMT0NLCisjICBkZWZpbmUgQkxPQ0soVHlwZSwgQmFzZSkgREVDTChUeXBlLCBCYXNlKQorI2VuZGlmCitCTE9DSyhCbG9jaywgRGVjbCkKKyN1bmRlZiBCTE9DSworCisjaWZuZGVmIENBUFRVUkVECisjICBkZWZpbmUgQ0FQVFVSRUQoVHlwZSwgQmFzZSkgREVDTChUeXBlLCBCYXNlKQorI2VuZGlmCitDQVBUVVJFRChDYXB0dXJlZCwgRGVjbCkKKyN1bmRlZiBDQVBUVVJFRAorCisjaWZuZGVmIENMQVNTU0NPUEVGVU5DVElPTlNQRUNJQUxJWkFUSU9OCisjICBkZWZpbmUgQ0xBU1NTQ09QRUZVTkNUSU9OU1BFQ0lBTElaQVRJT04oVHlwZSwgQmFzZSkgREVDTChUeXBlLCBCYXNlKQorI2VuZGlmCitDTEFTU1NDT1BFRlVOQ1RJT05TUEVDSUFMSVpBVElPTihDbGFzc1Njb3BlRnVuY3Rpb25TcGVjaWFsaXphdGlvbiwgRGVjbCkKKyN1bmRlZiBDTEFTU1NDT1BFRlVOQ1RJT05TUEVDSUFMSVpBVElPTgorCisjaWZuZGVmIEVNUFRZCisjICBkZWZpbmUgRU1QVFkoVHlwZSwgQmFzZSkgREVDTChUeXBlLCBCYXNlKQorI2VuZGlmCitFTVBUWShFbXB0eSwgRGVjbCkKKyN1bmRlZiBFTVBUWQorCisjaWZuZGVmIEVYUE9SVAorIyAgZGVmaW5lIEVYUE9SVChUeXBlLCBCYXNlKSBERUNMKFR5cGUsIEJhc2UpCisjZW5kaWYKK0VYUE9SVChFeHBvcnQsIERlY2wpCisjdW5kZWYgRVhQT1JUCisKKyNpZm5kZWYgRVhURVJOQ0NPTlRFWFQKKyMgIGRlZmluZSBFWFRFUk5DQ09OVEVYVChUeXBlLCBCYXNlKSBERUNMKFR5cGUsIEJhc2UpCisjZW5kaWYKK0VYVEVSTkNDT05URVhUKEV4dGVybkNDb250ZXh0LCBEZWNsKQorI3VuZGVmIEVYVEVSTkNDT05URVhUCisKKyNpZm5kZWYgRklMRVNDT1BFQVNNCisjICBkZWZpbmUgRklMRVNDT1BFQVNNKFR5cGUsIEJhc2UpIERFQ0woVHlwZSwgQmFzZSkKKyNlbmRpZgorRklMRVNDT1BFQVNNKEZpbGVTY29wZUFzbSwgRGVjbCkKKyN1bmRlZiBGSUxFU0NPUEVBU00KKworI2lmbmRlZiBGUklFTkQKKyMgIGRlZmluZSBGUklFTkQoVHlwZSwgQmFzZSkgREVDTChUeXBlLCBCYXNlKQorI2VuZGlmCitGUklFTkQoRnJpZW5kLCBEZWNsKQorI3VuZGVmIEZSSUVORAorCisjaWZuZGVmIEZSSUVORFRFTVBMQVRFCisjICBkZWZpbmUgRlJJRU5EVEVNUExBVEUoVHlwZSwgQmFzZSkgREVDTChUeXBlLCBCYXNlKQorI2VuZGlmCitGUklFTkRURU1QTEFURShGcmllbmRUZW1wbGF0ZSwgRGVjbCkKKyN1bmRlZiBGUklFTkRURU1QTEFURQorCisjaWZuZGVmIElNUE9SVAorIyAgZGVmaW5lIElNUE9SVChUeXBlLCBCYXNlKSBERUNMKFR5cGUsIEJhc2UpCisjZW5kaWYKK0lNUE9SVChJbXBvcnQsIERlY2wpCisjdW5kZWYgSU1QT1JUCisKKyNpZm5kZWYgTElOS0FHRVNQRUMKKyMgIGRlZmluZSBMSU5LQUdFU1BFQyhUeXBlLCBCYXNlKSBERUNMKFR5cGUsIEJhc2UpCisjZW5kaWYKK0xJTktBR0VTUEVDKExpbmthZ2VTcGVjLCBEZWNsKQorI3VuZGVmIExJTktBR0VTUEVDCisKKyNpZm5kZWYgTkFNRUQKKyMgIGRlZmluZSBOQU1FRChUeXBlLCBCYXNlKSBERUNMKFR5cGUsIEJhc2UpCisjZW5kaWYKK0FCU1RSQUNUX0RFQ0woTkFNRUQoTmFtZWQsIERlY2wpKQorI2lmbmRlZiBMQUJFTAorIyAgZGVmaW5lIExBQkVMKFR5cGUsIEJhc2UpIE5BTUVEKFR5cGUsIEJhc2UpCisjZW5kaWYKK0xBQkVMKExhYmVsLCBOYW1lZERlY2wpCisjdW5kZWYgTEFCRUwKKworI2lmbmRlZiBOQU1FU1BBQ0UKKyMgIGRlZmluZSBOQU1FU1BBQ0UoVHlwZSwgQmFzZSkgTkFNRUQoVHlwZSwgQmFzZSkKKyNlbmRpZgorTkFNRVNQQUNFKE5hbWVzcGFjZSwgTmFtZWREZWNsKQorI3VuZGVmIE5BTUVTUEFDRQorCisjaWZuZGVmIE5BTUVTUEFDRUFMSUFTCisjICBkZWZpbmUgTkFNRVNQQUNFQUxJQVMoVHlwZSwgQmFzZSkgTkFNRUQoVHlwZSwgQmFzZSkKKyNlbmRpZgorTkFNRVNQQUNFQUxJQVMoTmFtZXNwYWNlQWxpYXMsIE5hbWVkRGVjbCkKKyN1bmRlZiBOQU1FU1BBQ0VBTElBUworCisjaWZuZGVmIE9CSkNDT01QQVRJQkxFQUxJQVMKKyMgIGRlZmluZSBPQkpDQ09NUEFUSUJMRUFMSUFTKFR5cGUsIEJhc2UpIE5BTUVEKFR5cGUsIEJhc2UpCisjZW5kaWYKK09CSkNDT01QQVRJQkxFQUxJQVMoT2JqQ0NvbXBhdGlibGVBbGlhcywgTmFtZWREZWNsKQorI3VuZGVmIE9CSkNDT01QQVRJQkxFQUxJQVMKKworI2lmbmRlZiBPQkpDQ09OVEFJTkVSCisjICBkZWZpbmUgT0JKQ0NPTlRBSU5FUihUeXBlLCBCYXNlKSBOQU1FRChUeXBlLCBCYXNlKQorI2VuZGlmCitBQlNUUkFDVF9ERUNMKE9CSkNDT05UQUlORVIoT2JqQ0NvbnRhaW5lciwgTmFtZWREZWNsKSkKKyNpZm5kZWYgT0JKQ0NBVEVHT1JZCisjICBkZWZpbmUgT0JKQ0NBVEVHT1JZKFR5cGUsIEJhc2UpIE9CSkNDT05UQUlORVIoVHlwZSwgQmFzZSkKKyNlbmRpZgorT0JKQ0NBVEVHT1JZKE9iakNDYXRlZ29yeSwgT2JqQ0NvbnRhaW5lckRlY2wpCisjdW5kZWYgT0JKQ0NBVEVHT1JZCisKKyNpZm5kZWYgT0JKQ0lNUEwKKyMgIGRlZmluZSBPQkpDSU1QTChUeXBlLCBCYXNlKSBPQkpDQ09OVEFJTkVSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0FCU1RSQUNUX0RFQ0woT0JKQ0lNUEwoT2JqQ0ltcGwsIE9iakNDb250YWluZXJEZWNsKSkKKyNpZm5kZWYgT0JKQ0NBVEVHT1JZSU1QTAorIyAgZGVmaW5lIE9CSkNDQVRFR09SWUlNUEwoVHlwZSwgQmFzZSkgT0JKQ0lNUEwoVHlwZSwgQmFzZSkKKyNlbmRpZgorT0JKQ0NBVEVHT1JZSU1QTChPYmpDQ2F0ZWdvcnlJbXBsLCBPYmpDSW1wbERlY2wpCisjdW5kZWYgT0JKQ0NBVEVHT1JZSU1QTAorCisjaWZuZGVmIE9CSkNJTVBMRU1FTlRBVElPTgorIyAgZGVmaW5lIE9CSkNJTVBMRU1FTlRBVElPTihUeXBlLCBCYXNlKSBPQkpDSU1QTChUeXBlLCBCYXNlKQorI2VuZGlmCitPQkpDSU1QTEVNRU5UQVRJT04oT2JqQ0ltcGxlbWVudGF0aW9uLCBPYmpDSW1wbERlY2wpCisjdW5kZWYgT0JKQ0lNUExFTUVOVEFUSU9OCisKK0RFQ0xfUkFOR0UoT2JqQ0ltcGwsIE9iakNDYXRlZ29yeUltcGwsIE9iakNJbXBsZW1lbnRhdGlvbikKKworI3VuZGVmIE9CSkNJTVBMCisKKyNpZm5kZWYgT0JKQ0lOVEVSRkFDRQorIyAgZGVmaW5lIE9CSkNJTlRFUkZBQ0UoVHlwZSwgQmFzZSkgT0JKQ0NPTlRBSU5FUihUeXBlLCBCYXNlKQorI2VuZGlmCitPQkpDSU5URVJGQUNFKE9iakNJbnRlcmZhY2UsIE9iakNDb250YWluZXJEZWNsKQorI3VuZGVmIE9CSkNJTlRFUkZBQ0UKKworI2lmbmRlZiBPQkpDUFJPVE9DT0wKKyMgIGRlZmluZSBPQkpDUFJPVE9DT0woVHlwZSwgQmFzZSkgT0JKQ0NPTlRBSU5FUihUeXBlLCBCYXNlKQorI2VuZGlmCitPQkpDUFJPVE9DT0woT2JqQ1Byb3RvY29sLCBPYmpDQ29udGFpbmVyRGVjbCkKKyN1bmRlZiBPQkpDUFJPVE9DT0wKKworREVDTF9SQU5HRShPYmpDQ29udGFpbmVyLCBPYmpDQ2F0ZWdvcnksIE9iakNQcm90b2NvbCkKKworI3VuZGVmIE9CSkNDT05UQUlORVIKKworI2lmbmRlZiBPQkpDTUVUSE9ECisjICBkZWZpbmUgT0JKQ01FVEhPRChUeXBlLCBCYXNlKSBOQU1FRChUeXBlLCBCYXNlKQorI2VuZGlmCitPQkpDTUVUSE9EKE9iakNNZXRob2QsIE5hbWVkRGVjbCkKKyN1bmRlZiBPQkpDTUVUSE9ECisKKyNpZm5kZWYgT0JKQ1BST1BFUlRZCisjICBkZWZpbmUgT0JKQ1BST1BFUlRZKFR5cGUsIEJhc2UpIE5BTUVEKFR5cGUsIEJhc2UpCisjZW5kaWYKK09CSkNQUk9QRVJUWShPYmpDUHJvcGVydHksIE5hbWVkRGVjbCkKKyN1bmRlZiBPQkpDUFJPUEVSVFkKKworI2lmbmRlZiBURU1QTEFURQorIyAgZGVmaW5lIFRFTVBMQVRFKFR5cGUsIEJhc2UpIE5BTUVEKFR5cGUsIEJhc2UpCisjZW5kaWYKK0FCU1RSQUNUX0RFQ0woVEVNUExBVEUoVGVtcGxhdGUsIE5hbWVkRGVjbCkpCisjaWZuZGVmIEJVSUxUSU5URU1QTEFURQorIyAgZGVmaW5lIEJVSUxUSU5URU1QTEFURShUeXBlLCBCYXNlKSBURU1QTEFURShUeXBlLCBCYXNlKQorI2VuZGlmCitCVUlMVElOVEVNUExBVEUoQnVpbHRpblRlbXBsYXRlLCBUZW1wbGF0ZURlY2wpCisjdW5kZWYgQlVJTFRJTlRFTVBMQVRFCisKKyNpZm5kZWYgUkVERUNMQVJBQkxFVEVNUExBVEUKKyMgIGRlZmluZSBSRURFQ0xBUkFCTEVURU1QTEFURShUeXBlLCBCYXNlKSBURU1QTEFURShUeXBlLCBCYXNlKQorI2VuZGlmCitBQlNUUkFDVF9ERUNMKFJFREVDTEFSQUJMRVRFTVBMQVRFKFJlZGVjbGFyYWJsZVRlbXBsYXRlLCBUZW1wbGF0ZURlY2wpKQorI2lmbmRlZiBDTEFTU1RFTVBMQVRFCisjICBkZWZpbmUgQ0xBU1NURU1QTEFURShUeXBlLCBCYXNlKSBSRURFQ0xBUkFCTEVURU1QTEFURShUeXBlLCBCYXNlKQorI2VuZGlmCitDTEFTU1RFTVBMQVRFKENsYXNzVGVtcGxhdGUsIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCkKKyN1bmRlZiBDTEFTU1RFTVBMQVRFCisKKyNpZm5kZWYgRlVOQ1RJT05URU1QTEFURQorIyAgZGVmaW5lIEZVTkNUSU9OVEVNUExBVEUoVHlwZSwgQmFzZSkgUkVERUNMQVJBQkxFVEVNUExBVEUoVHlwZSwgQmFzZSkKKyNlbmRpZgorRlVOQ1RJT05URU1QTEFURShGdW5jdGlvblRlbXBsYXRlLCBSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2wpCisjdW5kZWYgRlVOQ1RJT05URU1QTEFURQorCisjaWZuZGVmIFRZUEVBTElBU1RFTVBMQVRFCisjICBkZWZpbmUgVFlQRUFMSUFTVEVNUExBVEUoVHlwZSwgQmFzZSkgUkVERUNMQVJBQkxFVEVNUExBVEUoVHlwZSwgQmFzZSkKKyNlbmRpZgorVFlQRUFMSUFTVEVNUExBVEUoVHlwZUFsaWFzVGVtcGxhdGUsIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCkKKyN1bmRlZiBUWVBFQUxJQVNURU1QTEFURQorCisjaWZuZGVmIFZBUlRFTVBMQVRFCisjICBkZWZpbmUgVkFSVEVNUExBVEUoVHlwZSwgQmFzZSkgUkVERUNMQVJBQkxFVEVNUExBVEUoVHlwZSwgQmFzZSkKKyNlbmRpZgorVkFSVEVNUExBVEUoVmFyVGVtcGxhdGUsIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCkKKyN1bmRlZiBWQVJURU1QTEFURQorCitERUNMX1JBTkdFKFJlZGVjbGFyYWJsZVRlbXBsYXRlLCBDbGFzc1RlbXBsYXRlLCBWYXJUZW1wbGF0ZSkKKworI3VuZGVmIFJFREVDTEFSQUJMRVRFTVBMQVRFCisKKyNpZm5kZWYgVEVNUExBVEVURU1QTEFURVBBUk0KKyMgIGRlZmluZSBURU1QTEFURVRFTVBMQVRFUEFSTShUeXBlLCBCYXNlKSBURU1QTEFURShUeXBlLCBCYXNlKQorI2VuZGlmCitURU1QTEFURVRFTVBMQVRFUEFSTShUZW1wbGF0ZVRlbXBsYXRlUGFybSwgVGVtcGxhdGVEZWNsKQorI3VuZGVmIFRFTVBMQVRFVEVNUExBVEVQQVJNCisKK0RFQ0xfUkFOR0UoVGVtcGxhdGUsIEJ1aWx0aW5UZW1wbGF0ZSwgVGVtcGxhdGVUZW1wbGF0ZVBhcm0pCisKKyN1bmRlZiBURU1QTEFURQorCisjaWZuZGVmIFRZUEUKKyMgIGRlZmluZSBUWVBFKFR5cGUsIEJhc2UpIE5BTUVEKFR5cGUsIEJhc2UpCisjZW5kaWYKK0FCU1RSQUNUX0RFQ0woVFlQRShUeXBlLCBOYW1lZERlY2wpKQorI2lmbmRlZiBUQUcKKyMgIGRlZmluZSBUQUcoVHlwZSwgQmFzZSkgVFlQRShUeXBlLCBCYXNlKQorI2VuZGlmCitBQlNUUkFDVF9ERUNMKFRBRyhUYWcsIFR5cGVEZWNsKSkKKyNpZm5kZWYgRU5VTQorIyAgZGVmaW5lIEVOVU0oVHlwZSwgQmFzZSkgVEFHKFR5cGUsIEJhc2UpCisjZW5kaWYKK0VOVU0oRW51bSwgVGFnRGVjbCkKKyN1bmRlZiBFTlVNCisKKyNpZm5kZWYgUkVDT1JECisjICBkZWZpbmUgUkVDT1JEKFR5cGUsIEJhc2UpIFRBRyhUeXBlLCBCYXNlKQorI2VuZGlmCitSRUNPUkQoUmVjb3JkLCBUYWdEZWNsKQorI2lmbmRlZiBDWFhSRUNPUkQKKyMgIGRlZmluZSBDWFhSRUNPUkQoVHlwZSwgQmFzZSkgUkVDT1JEKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NYWFJFQ09SRChDWFhSZWNvcmQsIFJlY29yZERlY2wpCisjaWZuZGVmIENMQVNTVEVNUExBVEVTUEVDSUFMSVpBVElPTgorIyAgZGVmaW5lIENMQVNTVEVNUExBVEVTUEVDSUFMSVpBVElPTihUeXBlLCBCYXNlKSBDWFhSRUNPUkQoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ0xBU1NURU1QTEFURVNQRUNJQUxJWkFUSU9OKENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbiwgQ1hYUmVjb3JkRGVjbCkKKyNpZm5kZWYgQ0xBU1NURU1QTEFURVBBUlRJQUxTUEVDSUFMSVpBVElPTgorIyAgZGVmaW5lIENMQVNTVEVNUExBVEVQQVJUSUFMU1BFQ0lBTElaQVRJT04oVHlwZSwgQmFzZSkgQ0xBU1NURU1QTEFURVNQRUNJQUxJWkFUSU9OKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NMQVNTVEVNUExBVEVQQVJUSUFMU1BFQ0lBTElaQVRJT04oQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbiwgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCkKKyN1bmRlZiBDTEFTU1RFTVBMQVRFUEFSVElBTFNQRUNJQUxJWkFUSU9OCisKK0RFQ0xfUkFOR0UoQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uLCBDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb24sIENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb24pCisKKyN1bmRlZiBDTEFTU1RFTVBMQVRFU1BFQ0lBTElaQVRJT04KKworREVDTF9SQU5HRShDWFhSZWNvcmQsIENYWFJlY29yZCwgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbikKKworI3VuZGVmIENYWFJFQ09SRAorCitERUNMX1JBTkdFKFJlY29yZCwgUmVjb3JkLCBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uKQorCisjdW5kZWYgUkVDT1JECisKK0RFQ0xfUkFOR0UoVGFnLCBFbnVtLCBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uKQorCisjdW5kZWYgVEFHCisKKyNpZm5kZWYgVEVNUExBVEVUWVBFUEFSTQorIyAgZGVmaW5lIFRFTVBMQVRFVFlQRVBBUk0oVHlwZSwgQmFzZSkgVFlQRShUeXBlLCBCYXNlKQorI2VuZGlmCitURU1QTEFURVRZUEVQQVJNKFRlbXBsYXRlVHlwZVBhcm0sIFR5cGVEZWNsKQorI3VuZGVmIFRFTVBMQVRFVFlQRVBBUk0KKworI2lmbmRlZiBUWVBFREVGTkFNRQorIyAgZGVmaW5lIFRZUEVERUZOQU1FKFR5cGUsIEJhc2UpIFRZUEUoVHlwZSwgQmFzZSkKKyNlbmRpZgorQUJTVFJBQ1RfREVDTChUWVBFREVGTkFNRShUeXBlZGVmTmFtZSwgVHlwZURlY2wpKQorI2lmbmRlZiBPQkpDVFlQRVBBUkFNCisjICBkZWZpbmUgT0JKQ1RZUEVQQVJBTShUeXBlLCBCYXNlKSBUWVBFREVGTkFNRShUeXBlLCBCYXNlKQorI2VuZGlmCitPQkpDVFlQRVBBUkFNKE9iakNUeXBlUGFyYW0sIFR5cGVkZWZOYW1lRGVjbCkKKyN1bmRlZiBPQkpDVFlQRVBBUkFNCisKKyNpZm5kZWYgVFlQRUFMSUFTCisjICBkZWZpbmUgVFlQRUFMSUFTKFR5cGUsIEJhc2UpIFRZUEVERUZOQU1FKFR5cGUsIEJhc2UpCisjZW5kaWYKK1RZUEVBTElBUyhUeXBlQWxpYXMsIFR5cGVkZWZOYW1lRGVjbCkKKyN1bmRlZiBUWVBFQUxJQVMKKworI2lmbmRlZiBUWVBFREVGCisjICBkZWZpbmUgVFlQRURFRihUeXBlLCBCYXNlKSBUWVBFREVGTkFNRShUeXBlLCBCYXNlKQorI2VuZGlmCitUWVBFREVGKFR5cGVkZWYsIFR5cGVkZWZOYW1lRGVjbCkKKyN1bmRlZiBUWVBFREVGCisKK0RFQ0xfUkFOR0UoVHlwZWRlZk5hbWUsIE9iakNUeXBlUGFyYW0sIFR5cGVkZWYpCisKKyN1bmRlZiBUWVBFREVGTkFNRQorCisjaWZuZGVmIFVOUkVTT0xWRURVU0lOR1RZUEVOQU1FCisjICBkZWZpbmUgVU5SRVNPTFZFRFVTSU5HVFlQRU5BTUUoVHlwZSwgQmFzZSkgVFlQRShUeXBlLCBCYXNlKQorI2VuZGlmCitVTlJFU09MVkVEVVNJTkdUWVBFTkFNRShVbnJlc29sdmVkVXNpbmdUeXBlbmFtZSwgVHlwZURlY2wpCisjdW5kZWYgVU5SRVNPTFZFRFVTSU5HVFlQRU5BTUUKKworREVDTF9SQU5HRShUeXBlLCBFbnVtLCBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZSkKKworI3VuZGVmIFRZUEUKKworI2lmbmRlZiBVU0lORworIyAgZGVmaW5lIFVTSU5HKFR5cGUsIEJhc2UpIE5BTUVEKFR5cGUsIEJhc2UpCisjZW5kaWYKK1VTSU5HKFVzaW5nLCBOYW1lZERlY2wpCisjdW5kZWYgVVNJTkcKKworI2lmbmRlZiBVU0lOR0RJUkVDVElWRQorIyAgZGVmaW5lIFVTSU5HRElSRUNUSVZFKFR5cGUsIEJhc2UpIE5BTUVEKFR5cGUsIEJhc2UpCisjZW5kaWYKK1VTSU5HRElSRUNUSVZFKFVzaW5nRGlyZWN0aXZlLCBOYW1lZERlY2wpCisjdW5kZWYgVVNJTkdESVJFQ1RJVkUKKworI2lmbmRlZiBVU0lOR1BBQ0sKKyMgIGRlZmluZSBVU0lOR1BBQ0soVHlwZSwgQmFzZSkgTkFNRUQoVHlwZSwgQmFzZSkKKyNlbmRpZgorVVNJTkdQQUNLKFVzaW5nUGFjaywgTmFtZWREZWNsKQorI3VuZGVmIFVTSU5HUEFDSworCisjaWZuZGVmIFVTSU5HU0hBRE9XCisjICBkZWZpbmUgVVNJTkdTSEFET1coVHlwZSwgQmFzZSkgTkFNRUQoVHlwZSwgQmFzZSkKKyNlbmRpZgorVVNJTkdTSEFET1coVXNpbmdTaGFkb3csIE5hbWVkRGVjbCkKKyNpZm5kZWYgQ09OU1RSVUNUT1JVU0lOR1NIQURPVworIyAgZGVmaW5lIENPTlNUUlVDVE9SVVNJTkdTSEFET1coVHlwZSwgQmFzZSkgVVNJTkdTSEFET1coVHlwZSwgQmFzZSkKKyNlbmRpZgorQ09OU1RSVUNUT1JVU0lOR1NIQURPVyhDb25zdHJ1Y3RvclVzaW5nU2hhZG93LCBVc2luZ1NoYWRvd0RlY2wpCisjdW5kZWYgQ09OU1RSVUNUT1JVU0lOR1NIQURPVworCitERUNMX1JBTkdFKFVzaW5nU2hhZG93LCBVc2luZ1NoYWRvdywgQ29uc3RydWN0b3JVc2luZ1NoYWRvdykKKworI3VuZGVmIFVTSU5HU0hBRE9XCisKKyNpZm5kZWYgVkFMVUUKKyMgIGRlZmluZSBWQUxVRShUeXBlLCBCYXNlKSBOQU1FRChUeXBlLCBCYXNlKQorI2VuZGlmCitBQlNUUkFDVF9ERUNMKFZBTFVFKFZhbHVlLCBOYW1lZERlY2wpKQorI2lmbmRlZiBCSU5ESU5HCisjICBkZWZpbmUgQklORElORyhUeXBlLCBCYXNlKSBWQUxVRShUeXBlLCBCYXNlKQorI2VuZGlmCitCSU5ESU5HKEJpbmRpbmcsIFZhbHVlRGVjbCkKKyN1bmRlZiBCSU5ESU5HCisKKyNpZm5kZWYgREVDTEFSQVRPUgorIyAgZGVmaW5lIERFQ0xBUkFUT1IoVHlwZSwgQmFzZSkgVkFMVUUoVHlwZSwgQmFzZSkKKyNlbmRpZgorQUJTVFJBQ1RfREVDTChERUNMQVJBVE9SKERlY2xhcmF0b3IsIFZhbHVlRGVjbCkpCisjaWZuZGVmIEZJRUxECisjICBkZWZpbmUgRklFTEQoVHlwZSwgQmFzZSkgREVDTEFSQVRPUihUeXBlLCBCYXNlKQorI2VuZGlmCitGSUVMRChGaWVsZCwgRGVjbGFyYXRvckRlY2wpCisjaWZuZGVmIE9CSkNBVERFRlNGSUVMRAorIyAgZGVmaW5lIE9CSkNBVERFRlNGSUVMRChUeXBlLCBCYXNlKSBGSUVMRChUeXBlLCBCYXNlKQorI2VuZGlmCitPQkpDQVRERUZTRklFTEQoT2JqQ0F0RGVmc0ZpZWxkLCBGaWVsZERlY2wpCisjdW5kZWYgT0JKQ0FUREVGU0ZJRUxECisKKyNpZm5kZWYgT0JKQ0lWQVIKKyMgIGRlZmluZSBPQkpDSVZBUihUeXBlLCBCYXNlKSBGSUVMRChUeXBlLCBCYXNlKQorI2VuZGlmCitPQkpDSVZBUihPYmpDSXZhciwgRmllbGREZWNsKQorI3VuZGVmIE9CSkNJVkFSCisKK0RFQ0xfUkFOR0UoRmllbGQsIEZpZWxkLCBPYmpDSXZhcikKKworI3VuZGVmIEZJRUxECisKKyNpZm5kZWYgRlVOQ1RJT04KKyMgIGRlZmluZSBGVU5DVElPTihUeXBlLCBCYXNlKSBERUNMQVJBVE9SKFR5cGUsIEJhc2UpCisjZW5kaWYKK0ZVTkNUSU9OKEZ1bmN0aW9uLCBEZWNsYXJhdG9yRGVjbCkKKyNpZm5kZWYgQ1hYREVEVUNUSU9OR1VJREUKKyMgIGRlZmluZSBDWFhERURVQ1RJT05HVUlERShUeXBlLCBCYXNlKSBGVU5DVElPTihUeXBlLCBCYXNlKQorI2VuZGlmCitDWFhERURVQ1RJT05HVUlERShDWFhEZWR1Y3Rpb25HdWlkZSwgRnVuY3Rpb25EZWNsKQorI3VuZGVmIENYWERFRFVDVElPTkdVSURFCisKKyNpZm5kZWYgQ1hYTUVUSE9ECisjICBkZWZpbmUgQ1hYTUVUSE9EKFR5cGUsIEJhc2UpIEZVTkNUSU9OKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NYWE1FVEhPRChDWFhNZXRob2QsIEZ1bmN0aW9uRGVjbCkKKyNpZm5kZWYgQ1hYQ09OU1RSVUNUT1IKKyMgIGRlZmluZSBDWFhDT05TVFJVQ1RPUihUeXBlLCBCYXNlKSBDWFhNRVRIT0QoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ1hYQ09OU1RSVUNUT1IoQ1hYQ29uc3RydWN0b3IsIENYWE1ldGhvZERlY2wpCisjdW5kZWYgQ1hYQ09OU1RSVUNUT1IKKworI2lmbmRlZiBDWFhDT05WRVJTSU9OCisjICBkZWZpbmUgQ1hYQ09OVkVSU0lPTihUeXBlLCBCYXNlKSBDWFhNRVRIT0QoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ1hYQ09OVkVSU0lPTihDWFhDb252ZXJzaW9uLCBDWFhNZXRob2REZWNsKQorI3VuZGVmIENYWENPTlZFUlNJT04KKworI2lmbmRlZiBDWFhERVNUUlVDVE9SCisjICBkZWZpbmUgQ1hYREVTVFJVQ1RPUihUeXBlLCBCYXNlKSBDWFhNRVRIT0QoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ1hYREVTVFJVQ1RPUihDWFhEZXN0cnVjdG9yLCBDWFhNZXRob2REZWNsKQorI3VuZGVmIENYWERFU1RSVUNUT1IKKworREVDTF9SQU5HRShDWFhNZXRob2QsIENYWE1ldGhvZCwgQ1hYRGVzdHJ1Y3RvcikKKworI3VuZGVmIENYWE1FVEhPRAorCitERUNMX1JBTkdFKEZ1bmN0aW9uLCBGdW5jdGlvbiwgQ1hYRGVzdHJ1Y3RvcikKKworI3VuZGVmIEZVTkNUSU9OCisKKyNpZm5kZWYgTVNQUk9QRVJUWQorIyAgZGVmaW5lIE1TUFJPUEVSVFkoVHlwZSwgQmFzZSkgREVDTEFSQVRPUihUeXBlLCBCYXNlKQorI2VuZGlmCitNU1BST1BFUlRZKE1TUHJvcGVydHksIERlY2xhcmF0b3JEZWNsKQorI3VuZGVmIE1TUFJPUEVSVFkKKworI2lmbmRlZiBOT05UWVBFVEVNUExBVEVQQVJNCisjICBkZWZpbmUgTk9OVFlQRVRFTVBMQVRFUEFSTShUeXBlLCBCYXNlKSBERUNMQVJBVE9SKFR5cGUsIEJhc2UpCisjZW5kaWYKK05PTlRZUEVURU1QTEFURVBBUk0oTm9uVHlwZVRlbXBsYXRlUGFybSwgRGVjbGFyYXRvckRlY2wpCisjdW5kZWYgTk9OVFlQRVRFTVBMQVRFUEFSTQorCisjaWZuZGVmIFZBUgorIyAgZGVmaW5lIFZBUihUeXBlLCBCYXNlKSBERUNMQVJBVE9SKFR5cGUsIEJhc2UpCisjZW5kaWYKK1ZBUihWYXIsIERlY2xhcmF0b3JEZWNsKQorI2lmbmRlZiBERUNPTVBPU0lUSU9OCisjICBkZWZpbmUgREVDT01QT1NJVElPTihUeXBlLCBCYXNlKSBWQVIoVHlwZSwgQmFzZSkKKyNlbmRpZgorREVDT01QT1NJVElPTihEZWNvbXBvc2l0aW9uLCBWYXJEZWNsKQorI3VuZGVmIERFQ09NUE9TSVRJT04KKworI2lmbmRlZiBJTVBMSUNJVFBBUkFNCisjICBkZWZpbmUgSU1QTElDSVRQQVJBTShUeXBlLCBCYXNlKSBWQVIoVHlwZSwgQmFzZSkKKyNlbmRpZgorSU1QTElDSVRQQVJBTShJbXBsaWNpdFBhcmFtLCBWYXJEZWNsKQorI3VuZGVmIElNUExJQ0lUUEFSQU0KKworI2lmbmRlZiBPTVBDQVBUVVJFREVYUFIKKyMgIGRlZmluZSBPTVBDQVBUVVJFREVYUFIoVHlwZSwgQmFzZSkgVkFSKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUENBUFRVUkVERVhQUihPTVBDYXB0dXJlZEV4cHIsIFZhckRlY2wpCisjdW5kZWYgT01QQ0FQVFVSRURFWFBSCisKKyNpZm5kZWYgUEFSTVZBUgorIyAgZGVmaW5lIFBBUk1WQVIoVHlwZSwgQmFzZSkgVkFSKFR5cGUsIEJhc2UpCisjZW5kaWYKK1BBUk1WQVIoUGFybVZhciwgVmFyRGVjbCkKKyN1bmRlZiBQQVJNVkFSCisKKyNpZm5kZWYgVkFSVEVNUExBVEVTUEVDSUFMSVpBVElPTgorIyAgZGVmaW5lIFZBUlRFTVBMQVRFU1BFQ0lBTElaQVRJT04oVHlwZSwgQmFzZSkgVkFSKFR5cGUsIEJhc2UpCisjZW5kaWYKK1ZBUlRFTVBMQVRFU1BFQ0lBTElaQVRJT04oVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbiwgVmFyRGVjbCkKKyNpZm5kZWYgVkFSVEVNUExBVEVQQVJUSUFMU1BFQ0lBTElaQVRJT04KKyMgIGRlZmluZSBWQVJURU1QTEFURVBBUlRJQUxTUEVDSUFMSVpBVElPTihUeXBlLCBCYXNlKSBWQVJURU1QTEFURVNQRUNJQUxJWkFUSU9OKFR5cGUsIEJhc2UpCisjZW5kaWYKK1ZBUlRFTVBMQVRFUEFSVElBTFNQRUNJQUxJWkFUSU9OKFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uLCBWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCkKKyN1bmRlZiBWQVJURU1QTEFURVBBUlRJQUxTUEVDSUFMSVpBVElPTgorCitERUNMX1JBTkdFKFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb24sIFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb24sIFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uKQorCisjdW5kZWYgVkFSVEVNUExBVEVTUEVDSUFMSVpBVElPTgorCitERUNMX1JBTkdFKFZhciwgVmFyLCBWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbikKKworI3VuZGVmIFZBUgorCitERUNMX1JBTkdFKERlY2xhcmF0b3IsIEZpZWxkLCBWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbikKKworI3VuZGVmIERFQ0xBUkFUT1IKKworI2lmbmRlZiBFTlVNQ09OU1RBTlQKKyMgIGRlZmluZSBFTlVNQ09OU1RBTlQoVHlwZSwgQmFzZSkgVkFMVUUoVHlwZSwgQmFzZSkKKyNlbmRpZgorRU5VTUNPTlNUQU5UKEVudW1Db25zdGFudCwgVmFsdWVEZWNsKQorI3VuZGVmIEVOVU1DT05TVEFOVAorCisjaWZuZGVmIElORElSRUNURklFTEQKKyMgIGRlZmluZSBJTkRJUkVDVEZJRUxEKFR5cGUsIEJhc2UpIFZBTFVFKFR5cGUsIEJhc2UpCisjZW5kaWYKK0lORElSRUNURklFTEQoSW5kaXJlY3RGaWVsZCwgVmFsdWVEZWNsKQorI3VuZGVmIElORElSRUNURklFTEQKKworI2lmbmRlZiBPTVBERUNMQVJFUkVEVUNUSU9OCisjICBkZWZpbmUgT01QREVDTEFSRVJFRFVDVElPTihUeXBlLCBCYXNlKSBWQUxVRShUeXBlLCBCYXNlKQorI2VuZGlmCitPTVBERUNMQVJFUkVEVUNUSU9OKE9NUERlY2xhcmVSZWR1Y3Rpb24sIFZhbHVlRGVjbCkKKyN1bmRlZiBPTVBERUNMQVJFUkVEVUNUSU9OCisKKyNpZm5kZWYgVU5SRVNPTFZFRFVTSU5HVkFMVUUKKyMgIGRlZmluZSBVTlJFU09MVkVEVVNJTkdWQUxVRShUeXBlLCBCYXNlKSBWQUxVRShUeXBlLCBCYXNlKQorI2VuZGlmCitVTlJFU09MVkVEVVNJTkdWQUxVRShVbnJlc29sdmVkVXNpbmdWYWx1ZSwgVmFsdWVEZWNsKQorI3VuZGVmIFVOUkVTT0xWRURVU0lOR1ZBTFVFCisKK0RFQ0xfUkFOR0UoVmFsdWUsIEJpbmRpbmcsIFVucmVzb2x2ZWRVc2luZ1ZhbHVlKQorCisjdW5kZWYgVkFMVUUKKworREVDTF9SQU5HRShOYW1lZCwgTGFiZWwsIFVucmVzb2x2ZWRVc2luZ1ZhbHVlKQorCisjdW5kZWYgTkFNRUQKKworI2lmbmRlZiBPTVBUSFJFQURQUklWQVRFCisjICBkZWZpbmUgT01QVEhSRUFEUFJJVkFURShUeXBlLCBCYXNlKSBERUNMKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUFRIUkVBRFBSSVZBVEUoT01QVGhyZWFkUHJpdmF0ZSwgRGVjbCkKKyN1bmRlZiBPTVBUSFJFQURQUklWQVRFCisKKyNpZm5kZWYgT0JKQ1BST1BFUlRZSU1QTAorIyAgZGVmaW5lIE9CSkNQUk9QRVJUWUlNUEwoVHlwZSwgQmFzZSkgREVDTChUeXBlLCBCYXNlKQorI2VuZGlmCitPQkpDUFJPUEVSVFlJTVBMKE9iakNQcm9wZXJ0eUltcGwsIERlY2wpCisjdW5kZWYgT0JKQ1BST1BFUlRZSU1QTAorCisjaWZuZGVmIFBSQUdNQUNPTU1FTlQKKyMgIGRlZmluZSBQUkFHTUFDT01NRU5UKFR5cGUsIEJhc2UpIERFQ0woVHlwZSwgQmFzZSkKKyNlbmRpZgorUFJBR01BQ09NTUVOVChQcmFnbWFDb21tZW50LCBEZWNsKQorI3VuZGVmIFBSQUdNQUNPTU1FTlQKKworI2lmbmRlZiBQUkFHTUFERVRFQ1RNSVNNQVRDSAorIyAgZGVmaW5lIFBSQUdNQURFVEVDVE1JU01BVENIKFR5cGUsIEJhc2UpIERFQ0woVHlwZSwgQmFzZSkKKyNlbmRpZgorUFJBR01BREVURUNUTUlTTUFUQ0goUHJhZ21hRGV0ZWN0TWlzbWF0Y2gsIERlY2wpCisjdW5kZWYgUFJBR01BREVURUNUTUlTTUFUQ0gKKworI2lmbmRlZiBTVEFUSUNBU1NFUlQKKyMgIGRlZmluZSBTVEFUSUNBU1NFUlQoVHlwZSwgQmFzZSkgREVDTChUeXBlLCBCYXNlKQorI2VuZGlmCitTVEFUSUNBU1NFUlQoU3RhdGljQXNzZXJ0LCBEZWNsKQorI3VuZGVmIFNUQVRJQ0FTU0VSVAorCisjaWZuZGVmIFRSQU5TTEFUSU9OVU5JVAorIyAgZGVmaW5lIFRSQU5TTEFUSU9OVU5JVChUeXBlLCBCYXNlKSBERUNMKFR5cGUsIEJhc2UpCisjZW5kaWYKK1RSQU5TTEFUSU9OVU5JVChUcmFuc2xhdGlvblVuaXQsIERlY2wpCisjdW5kZWYgVFJBTlNMQVRJT05VTklUCisKK0xBU1RfREVDTF9SQU5HRShEZWNsLCBBY2Nlc3NTcGVjLCBUcmFuc2xhdGlvblVuaXQpCisKKyN1bmRlZiBERUNMCisjdW5kZWYgREVDTF9SQU5HRQorI3VuZGVmIExBU1RfREVDTF9SQU5HRQorI3VuZGVmIEFCU1RSQUNUX0RFQ0wKKy8qPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogTGlzdCBvZiBBU1QgRGVjbCBub2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLCBkbyBub3QgZWRpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgREVDTF9DT05URVhUCisjICBkZWZpbmUgREVDTF9DT05URVhUKERFQ0wpCisjZW5kaWYKKyNpZm5kZWYgREVDTF9DT05URVhUX0JBU0UKKyMgIGRlZmluZSBERUNMX0NPTlRFWFRfQkFTRShERUNMKSBERUNMX0NPTlRFWFQoREVDTCkKKyNlbmRpZgorREVDTF9DT05URVhUX0JBU0UoRnVuY3Rpb24pCitERUNMX0NPTlRFWFRfQkFTRShUYWcpCitERUNMX0NPTlRFWFRfQkFTRShPYmpDQ29udGFpbmVyKQorREVDTF9DT05URVhUKEJsb2NrKQorREVDTF9DT05URVhUKENhcHR1cmVkKQorREVDTF9DT05URVhUKEV4cG9ydCkKK0RFQ0xfQ09OVEVYVChFeHRlcm5DQ29udGV4dCkKK0RFQ0xfQ09OVEVYVChMaW5rYWdlU3BlYykKK0RFQ0xfQ09OVEVYVChOYW1lc3BhY2UpCitERUNMX0NPTlRFWFQoT01QRGVjbGFyZVJlZHVjdGlvbikKK0RFQ0xfQ09OVEVYVChPYmpDTWV0aG9kKQorREVDTF9DT05URVhUKFRyYW5zbGF0aW9uVW5pdCkKKyN1bmRlZiBERUNMX0NPTlRFWFQKKyN1bmRlZiBERUNMX0NPTlRFWFRfQkFTRQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xPYmpDLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbE9iakMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWY3ZDkzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xPYmpDLmgKQEAgLTAsMCArMSwyOTE4IEBACisvLz09PS0gRGVjbE9iakMuaCAtIENsYXNzZXMgZm9yIHJlcHJlc2VudGluZyBkZWNsYXJhdGlvbnMgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRGVjbE9iakMgaW50ZXJmYWNlIGFuZCBzdWJjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfREVDTE9CSkNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9ERUNMT0JKQ19ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQmFzZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHRlcm5hbEFTVFNvdXJjZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9SZWRlY2xhcmFibGUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvU2VsZWN0b3JMb2NhdGlvbnNLaW5kLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9TcGVjaWZpZXJzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVHJhaWxpbmdPYmplY3RzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBDb21wb3VuZFN0bXQ7CitjbGFzcyBDWFhDdG9ySW5pdGlhbGl6ZXI7CitjbGFzcyBFeHByOworY2xhc3MgT2JqQ0NhdGVnb3J5RGVjbDsKK2NsYXNzIE9iakNDYXRlZ29yeUltcGxEZWNsOworY2xhc3MgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbDsKK2NsYXNzIE9iakNJbnRlcmZhY2VEZWNsOworY2xhc3MgT2JqQ0l2YXJEZWNsOworY2xhc3MgT2JqQ1Byb3BlcnR5RGVjbDsKK2NsYXNzIE9iakNQcm9wZXJ0eUltcGxEZWNsOworY2xhc3MgT2JqQ1Byb3RvY29sRGVjbDsKK2NsYXNzIFN0bXQ7CisKK2NsYXNzIE9iakNMaXN0QmFzZSB7Citwcm90ZWN0ZWQ6CisgIC8vLyBMaXN0IGlzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIG9iamVjdHMgdGhhdCBhcmUgbm90IG93bmVkIGJ5IHRoaXMgb2JqZWN0LgorICB2b2lkICoqTGlzdCA9IG51bGxwdHI7CisgIHVuc2lnbmVkIE51bUVsdHMgPSAwOworCitwdWJsaWM6CisgIE9iakNMaXN0QmFzZSgpID0gZGVmYXVsdDsKKyAgT2JqQ0xpc3RCYXNlKGNvbnN0IE9iakNMaXN0QmFzZSAmKSA9IGRlbGV0ZTsKKyAgT2JqQ0xpc3RCYXNlICZvcGVyYXRvcj0oY29uc3QgT2JqQ0xpc3RCYXNlICYpID0gZGVsZXRlOworCisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBOdW1FbHRzOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBOdW1FbHRzID09IDA7IH0KKworcHJvdGVjdGVkOgorICB2b2lkIHNldCh2b2lkICpjb25zdCogSW5MaXN0LCB1bnNpZ25lZCBFbHRzLCBBU1RDb250ZXh0ICZDdHgpOworfTsKKworLy8vIE9iakNMaXN0IC0gVGhpcyBpcyBhIHNpbXBsZSB0ZW1wbGF0ZSBjbGFzcyB1c2VkIHRvIGhvbGQgdmFyaW91cyBsaXN0cyBvZgorLy8vIGRlY2xzIGV0Yywgd2hpY2ggaXMgaGVhdmlseSB1c2VkIGJ5IHRoZSBPYmpDIGZyb250LWVuZC4gIFRoaXMgb25seSB1c2UgY2FzZQorLy8vIHRoaXMgc3VwcG9ydHMgaXMgc2V0dGluZyB0aGUgbGlzdCBhbGwgYXQgb25jZSBhbmQgdGhlbiByZWFkaW5nIGVsZW1lbnRzIG91dAorLy8vIG9mIGl0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBPYmpDTGlzdCA6IHB1YmxpYyBPYmpDTGlzdEJhc2UgeworcHVibGljOgorICB2b2lkIHNldChUKiBjb25zdCogSW5MaXN0LCB1bnNpZ25lZCBFbHRzLCBBU1RDb250ZXh0ICZDdHgpIHsKKyAgICBPYmpDTGlzdEJhc2U6OnNldChyZWludGVycHJldF9jYXN0PHZvaWQqY29uc3QqPihJbkxpc3QpLCBFbHRzLCBDdHgpOworICB9CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBUKiBjb25zdCAqOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gKGl0ZXJhdG9yKUxpc3Q7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gKGl0ZXJhdG9yKUxpc3QrTnVtRWx0czsgfQorCisgIFQqIG9wZXJhdG9yW10odW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KElkeCA8IE51bUVsdHMgJiYgIkludmFsaWQgYWNjZXNzIik7CisgICAgcmV0dXJuIChUKilMaXN0W0lkeF07CisgIH0KK307CisKKy8vLyBcYnJpZWYgQSBsaXN0IG9mIE9iamVjdGl2ZS1DIHByb3RvY29scywgYWxvbmcgd2l0aCB0aGUgc291cmNlCisvLy8gbG9jYXRpb25zIGF0IHdoaWNoIHRoZXkgd2VyZSByZWZlcmVuY2VkLgorY2xhc3MgT2JqQ1Byb3RvY29sTGlzdCA6IHB1YmxpYyBPYmpDTGlzdDxPYmpDUHJvdG9jb2xEZWNsPiB7CisgIFNvdXJjZUxvY2F0aW9uICpMb2NhdGlvbnMgPSBudWxscHRyOworCisgIHVzaW5nIE9iakNMaXN0PE9iakNQcm90b2NvbERlY2w+OjpzZXQ7CisKK3B1YmxpYzoKKyAgT2JqQ1Byb3RvY29sTGlzdCgpID0gZGVmYXVsdDsKKworICB1c2luZyBsb2NfaXRlcmF0b3IgPSBjb25zdCBTb3VyY2VMb2NhdGlvbiAqOworCisgIGxvY19pdGVyYXRvciBsb2NfYmVnaW4oKSBjb25zdCB7IHJldHVybiBMb2NhdGlvbnM7IH0KKyAgbG9jX2l0ZXJhdG9yIGxvY19lbmQoKSBjb25zdCB7IHJldHVybiBMb2NhdGlvbnMgKyBzaXplKCk7IH0KKworICB2b2lkIHNldChPYmpDUHJvdG9jb2xEZWNsKiBjb25zdCogSW5MaXN0LCB1bnNpZ25lZCBFbHRzLAorICAgICAgICAgICBjb25zdCBTb3VyY2VMb2NhdGlvbiAqTG9jcywgQVNUQ29udGV4dCAmQ3R4KTsKK307CisKKy8vLyBPYmpDTWV0aG9kRGVjbCAtIFJlcHJlc2VudHMgYW4gaW5zdGFuY2Ugb3IgY2xhc3MgbWV0aG9kIGRlY2xhcmF0aW9uLgorLy8vIE9iakMgbWV0aG9kcyBjYW4gYmUgZGVjbGFyZWQgd2l0aGluIDQgY29udGV4dHM6IGNsYXNzIGludGVyZmFjZXMsCisvLy8gY2F0ZWdvcmllcywgcHJvdG9jb2xzLCBhbmQgY2xhc3MgaW1wbGVtZW50YXRpb25zLiBXaGlsZSBDKysgbWVtYmVyCisvLy8gZnVuY3Rpb25zIGxldmVyYWdlIEMgc3ludGF4LCBPYmplY3RpdmUtQyBtZXRob2Qgc3ludGF4IGlzIG1vZGVsZWQgYWZ0ZXIKKy8vLyBTbWFsbHRhbGsgKHVzaW5nIGNvbG9ucyB0byBzcGVjaWZ5IGFyZ3VtZW50IHR5cGVzL2V4cHJlc3Npb25zKS4KKy8vLyBIZXJlIGFyZSBzb21lIGJyaWVmIGV4YW1wbGVzOgorLy8vCisvLy8gU2V0dGVyL2dldHRlciBpbnN0YW5jZSBtZXRob2RzOgorLy8vIC0gKHZvaWQpc2V0TWVudTooTlNNZW51ICopbWVudTsKKy8vLyAtIChOU01lbnUgKiltZW51OworLy8vCisvLy8gSW5zdGFuY2UgbWV0aG9kIHRoYXQgdGFrZXMgMiBOU1ZpZXcgYXJndW1lbnRzOgorLy8vIC0gKHZvaWQpcmVwbGFjZVN1YnZpZXc6KE5TVmlldyAqKW9sZFZpZXcgd2l0aDooTlNWaWV3ICopbmV3VmlldzsKKy8vLworLy8vIEdldHRlciBjbGFzcyBtZXRob2Q6CisvLy8gKyAoTlNNZW51ICopZGVmYXVsdE1lbnU7CisvLy8KKy8vLyBBIHNlbGVjdG9yIHJlcHJlc2VudHMgYSB1bmlxdWUgbmFtZSBmb3IgYSBtZXRob2QuIFRoZSBzZWxlY3RvciBuYW1lcyBmb3IKKy8vLyB0aGUgYWJvdmUgbWV0aG9kcyBhcmUgc2V0TWVudTosIG1lbnUsIHJlcGxhY2VTdWJ2aWV3OndpdGg6LCBhbmQgZGVmYXVsdE1lbnUuCisvLy8KK2NsYXNzIE9iakNNZXRob2REZWNsIDogcHVibGljIE5hbWVkRGVjbCwgcHVibGljIERlY2xDb250ZXh0IHsKK3B1YmxpYzoKKyAgZW51bSBJbXBsZW1lbnRhdGlvbkNvbnRyb2wgeyBOb25lLCBSZXF1aXJlZCwgT3B0aW9uYWwgfTsKKworcHJpdmF0ZToKKyAgLy8gVGhlIGNvbnZlbnRpb25hbCBtZWFuaW5nIG9mIHRoaXMgbWV0aG9kOyBhbiBPYmpDTWV0aG9kRmFtaWx5LgorICAvLyBUaGlzIGlzIG5vdCBzZXJpYWxpemVkOyBpbnN0ZWFkLCBpdCBpcyBjb21wdXRlZCBvbiBkZW1hbmQgYW5kCisgIC8vIGNhY2hlZC4KKyAgbXV0YWJsZSB1bnNpZ25lZCBGYW1pbHkgOiBPYmpDTWV0aG9kRmFtaWx5Qml0V2lkdGg7CisKKyAgLy8vIGluc3RhbmNlICh0cnVlKSBvciBjbGFzcyAoZmFsc2UpIG1ldGhvZC4KKyAgdW5zaWduZWQgSXNJbnN0YW5jZSA6IDE7CisgIHVuc2lnbmVkIElzVmFyaWFkaWMgOiAxOworCisgIC8vLyBUcnVlIGlmIHRoaXMgbWV0aG9kIGlzIHRoZSBnZXR0ZXIgb3Igc2V0dGVyIGZvciBhbiBleHBsaWNpdCBwcm9wZXJ0eS4KKyAgdW5zaWduZWQgSXNQcm9wZXJ0eUFjY2Vzc29yIDogMTsKKworICAvLyBNZXRob2QgaGFzIGEgZGVmaW5pdGlvbi4KKyAgdW5zaWduZWQgSXNEZWZpbmVkIDogMTsKKworICAvLy8gXGJyaWVmIE1ldGhvZCByZWRlY2xhcmF0aW9uIGluIHRoZSBzYW1lIGludGVyZmFjZS4KKyAgdW5zaWduZWQgSXNSZWRlY2xhcmF0aW9uIDogMTsKKworICAvLy8gXGJyaWVmIElzIHJlZGVjbGFyZWQgaW4gdGhlIHNhbWUgaW50ZXJmYWNlLgorICBtdXRhYmxlIHVuc2lnbmVkIEhhc1JlZGVjbGFyYXRpb24gOiAxOworCisgIC8vIE5PVEU6IFZDKysgdHJlYXRzIGVudW1zIGFzIHNpZ25lZCwgYXZvaWQgdXNpbmcgSW1wbGVtZW50YXRpb25Db250cm9sIGVudW0KKyAgLy8vIFxAcmVxdWlyZWQvXEBvcHRpb25hbAorICB1bnNpZ25lZCBEZWNsSW1wbGVtZW50YXRpb24gOiAyOworCisgIC8vIE5PVEU6IFZDKysgdHJlYXRzIGVudW1zIGFzIHNpZ25lZCwgYXZvaWQgdXNpbmcgdGhlIE9iakNEZWNsUXVhbGlmaWVyIGVudW0KKyAgLy8vIGluLCBpbm91dCwgZXRjLgorICB1bnNpZ25lZCBvYmpjRGVjbFF1YWxpZmllciA6IDc7CisKKyAgLy8vIFxicmllZiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG1ldGhvZCBoYXMgYSByZWxhdGVkIHJlc3VsdCB0eXBlLgorICB1bnNpZ25lZCBSZWxhdGVkUmVzdWx0VHlwZSA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoZSBsb2NhdGlvbnMgb2YgdGhlIHNlbGVjdG9yIGlkZW50aWZpZXJzIGFyZSBpbiBhCisgIC8vLyAic3RhbmRhcmQiIHBvc2l0aW9uLCBhIGVudW0gU2VsZWN0b3JMb2NhdGlvbnNLaW5kLgorICB1bnNpZ25lZCBTZWxMb2NzS2luZCA6IDI7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgbWV0aG9kIG92ZXJyaWRlcyBhbnkgb3RoZXIgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4KKyAgLy8vCisgIC8vLyBBIG1ldGhvZCBpcyBzYWlkIHRvIG92ZXJyaWRlIGFueSBtZXRob2QgaW4gdGhlIGNsYXNzJ3MKKyAgLy8vIGJhc2UgY2xhc3NlcywgaXRzIHByb3RvY29scywgb3IgaXRzIGNhdGVnb3JpZXMnIHByb3RvY29scywgdGhhdCBoYXMKKyAgLy8vIHRoZSBzYW1lIHNlbGVjdG9yIGFuZCBpcyBvZiB0aGUgc2FtZSBraW5kIChjbGFzcyBvciBpbnN0YW5jZSkuCisgIC8vLyBBIG1ldGhvZCBpbiBhbiBpbXBsZW1lbnRhdGlvbiBpcyBub3QgY29uc2lkZXJlZCBhcyBvdmVycmlkaW5nIHRoZSBzYW1lCisgIC8vLyBtZXRob2QgaW4gdGhlIGludGVyZmFjZSBvciBpdHMgY2F0ZWdvcmllcy4KKyAgdW5zaWduZWQgSXNPdmVycmlkaW5nIDogMTsKKworICAvLy8gXGJyaWVmIEluZGljYXRlcyBpZiB0aGUgbWV0aG9kIHdhcyBhIGRlZmluaXRpb24gYnV0IGl0cyBib2R5IHdhcyBza2lwcGVkLgorICB1bnNpZ25lZCBIYXNTa2lwcGVkQm9keSA6IDE7CisKKyAgLy8gUmV0dXJuIHR5cGUgb2YgdGhpcyBtZXRob2QuCisgIFF1YWxUeXBlIE1ldGhvZERlY2xUeXBlOworCisgIC8vIFR5cGUgc291cmNlIGluZm9ybWF0aW9uIGZvciB0aGUgcmV0dXJuIHR5cGUuCisgIFR5cGVTb3VyY2VJbmZvICpSZXR1cm5USW5mbzsKKworICAvLy8gXGJyaWVmIEFycmF5IG9mIFBhcm1WYXJEZWNscyBmb3IgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzIG9mIHRoaXMgbWV0aG9kCisgIC8vLyBhbmQgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBzZWxlY3RvciBsb2NhdGlvbnMuCisgIHZvaWQgKlBhcmFtc0FuZFNlbExvY3MgPSBudWxscHRyOworICB1bnNpZ25lZCBOdW1QYXJhbXMgPSAwOworCisgIC8vLyBMaXN0IG9mIGF0dHJpYnV0ZXMgZm9yIHRoaXMgbWV0aG9kIGRlY2xhcmF0aW9uLgorICBTb3VyY2VMb2NhdGlvbiBEZWNsRW5kTG9jOyAvLyB0aGUgbG9jYXRpb24gb2YgdGhlICc7JyBvciAneycuCisKKyAgLy8gVGhlIGZvbGxvd2luZyBhcmUgb25seSB1c2VkIGZvciBtZXRob2QgZGVmaW5pdGlvbnMsIG51bGwgb3RoZXJ3aXNlLgorICBMYXp5RGVjbFN0bXRQdHIgQm9keTsKKworICAvLy8gU2VsZkRlY2wgLSBEZWNsIGZvciB0aGUgaW1wbGljaXQgc2VsZiBwYXJhbWV0ZXIuIFRoaXMgaXMgbGF6aWx5CisgIC8vLyBjb25zdHJ1Y3RlZCBieSBjcmVhdGVJbXBsaWNpdFBhcmFtcy4KKyAgSW1wbGljaXRQYXJhbURlY2wgKlNlbGZEZWNsID0gbnVsbHB0cjsKKworICAvLy8gQ21kRGVjbCAtIERlY2wgZm9yIHRoZSBpbXBsaWNpdCBfY21kIHBhcmFtZXRlci4gVGhpcyBpcyBsYXppbHkKKyAgLy8vIGNvbnN0cnVjdGVkIGJ5IGNyZWF0ZUltcGxpY2l0UGFyYW1zLgorICBJbXBsaWNpdFBhcmFtRGVjbCAqQ21kRGVjbCA9IG51bGxwdHI7CisKKyAgT2JqQ01ldGhvZERlY2woU291cmNlTG9jYXRpb24gYmVnaW5Mb2MsIFNvdXJjZUxvY2F0aW9uIGVuZExvYywKKyAgICAgICAgICAgICAgICAgU2VsZWN0b3IgU2VsSW5mbywgUXVhbFR5cGUgVCwgVHlwZVNvdXJjZUluZm8gKlJldHVyblRJbmZvLAorICAgICAgICAgICAgICAgICBEZWNsQ29udGV4dCAqY29udGV4dERlY2wsIGJvb2wgaXNJbnN0YW5jZSA9IHRydWUsCisgICAgICAgICAgICAgICAgIGJvb2wgaXNWYXJpYWRpYyA9IGZhbHNlLCBib29sIGlzUHJvcGVydHlBY2Nlc3NvciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICBib29sIGlzSW1wbGljaXRseURlY2xhcmVkID0gZmFsc2UsIGJvb2wgaXNEZWZpbmVkID0gZmFsc2UsCisgICAgICAgICAgICAgICAgIEltcGxlbWVudGF0aW9uQ29udHJvbCBpbXBDb250cm9sID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBIYXNSZWxhdGVkUmVzdWx0VHlwZSA9IGZhbHNlKQorICAgICAgOiBOYW1lZERlY2woT2JqQ01ldGhvZCwgY29udGV4dERlY2wsIGJlZ2luTG9jLCBTZWxJbmZvKSwKKyAgICAgICAgRGVjbENvbnRleHQoT2JqQ01ldGhvZCksIEZhbWlseShJbnZhbGlkT2JqQ01ldGhvZEZhbWlseSksCisgICAgICAgIElzSW5zdGFuY2UoaXNJbnN0YW5jZSksIElzVmFyaWFkaWMoaXNWYXJpYWRpYyksCisgICAgICAgIElzUHJvcGVydHlBY2Nlc3Nvcihpc1Byb3BlcnR5QWNjZXNzb3IpLCBJc0RlZmluZWQoaXNEZWZpbmVkKSwKKyAgICAgICAgSXNSZWRlY2xhcmF0aW9uKDApLCBIYXNSZWRlY2xhcmF0aW9uKDApLCBEZWNsSW1wbGVtZW50YXRpb24oaW1wQ29udHJvbCksCisgICAgICAgIG9iamNEZWNsUXVhbGlmaWVyKE9CSkNfVFFfTm9uZSksCisgICAgICAgIFJlbGF0ZWRSZXN1bHRUeXBlKEhhc1JlbGF0ZWRSZXN1bHRUeXBlKSwKKyAgICAgICAgU2VsTG9jc0tpbmQoU2VsTG9jX1N0YW5kYXJkTm9TcGFjZSksIElzT3ZlcnJpZGluZygwKSwgSGFzU2tpcHBlZEJvZHkoMCksCisgICAgICAgIE1ldGhvZERlY2xUeXBlKFQpLCBSZXR1cm5USW5mbyhSZXR1cm5USW5mbyksIERlY2xFbmRMb2MoZW5kTG9jKSB7CisgICAgc2V0SW1wbGljaXQoaXNJbXBsaWNpdGx5RGVjbGFyZWQpOworICB9CisKKyAgU2VsZWN0b3JMb2NhdGlvbnNLaW5kIGdldFNlbExvY3NLaW5kKCkgY29uc3QgeworICAgIHJldHVybiAoU2VsZWN0b3JMb2NhdGlvbnNLaW5kKVNlbExvY3NLaW5kOworICB9CisKKyAgYm9vbCBoYXNTdGFuZGFyZFNlbExvY3MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFNlbExvY3NLaW5kKCkgIT0gU2VsTG9jX05vblN0YW5kYXJkOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYSBwb2ludGVyIHRvIHRoZSBzdG9yZWQgc2VsZWN0b3IgaWRlbnRpZmllcnMgbG9jYXRpb25zIGFycmF5LgorICAvLy8gTm8gbG9jYXRpb25zIHdpbGwgYmUgc3RvcmVkIGlmIEhhc1N0YW5kYXJkU2VsTG9jcyBpcyB0cnVlLgorICBTb3VyY2VMb2NhdGlvbiAqZ2V0U3RvcmVkU2VsTG9jcygpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTb3VyY2VMb2NhdGlvbio+KGdldFBhcmFtcygpICsgTnVtUGFyYW1zKTsKKyAgfQorICBjb25zdCBTb3VyY2VMb2NhdGlvbiAqZ2V0U3RvcmVkU2VsTG9jcygpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTb3VyY2VMb2NhdGlvbio+KGdldFBhcmFtcygpICsgTnVtUGFyYW1zKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGEgcG9pbnRlciB0byB0aGUgc3RvcmVkIHNlbGVjdG9yIGlkZW50aWZpZXJzIGxvY2F0aW9ucyBhcnJheS4KKyAgLy8vIE5vIGxvY2F0aW9ucyB3aWxsIGJlIHN0b3JlZCBpZiBIYXNTdGFuZGFyZFNlbExvY3MgaXMgdHJ1ZS4KKyAgUGFybVZhckRlY2wgKipnZXRQYXJhbXMoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UGFybVZhckRlY2wgKio+KFBhcmFtc0FuZFNlbExvY3MpOworICB9CisgIGNvbnN0IFBhcm1WYXJEZWNsICpjb25zdCAqZ2V0UGFyYW1zKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFBhcm1WYXJEZWNsICpjb25zdCAqPihQYXJhbXNBbmRTZWxMb2NzKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2Ygc3RvcmVkIHNlbGVjdG9yIGlkZW50aWZpZXJzIGxvY2F0aW9ucy4KKyAgLy8vIE5vIGxvY2F0aW9ucyB3aWxsIGJlIHN0b3JlZCBpZiBIYXNTdGFuZGFyZFNlbExvY3MgaXMgdHJ1ZS4KKyAgdW5zaWduZWQgZ2V0TnVtU3RvcmVkU2VsTG9jcygpIGNvbnN0IHsKKyAgICBpZiAoaGFzU3RhbmRhcmRTZWxMb2NzKCkpCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZ2V0TnVtU2VsZWN0b3JMb2NzKCk7CisgIH0KKworICB2b2lkIHNldFBhcmFtc0FuZFNlbExvY3MoQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcm1WYXJEZWNsKj4gUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U291cmNlTG9jYXRpb24+IFNlbExvY3MpOworCisgIC8vLyBcYnJpZWYgQSBkZWZpbml0aW9uIHdpbGwgcmV0dXJuIGl0cyBpbnRlcmZhY2UgZGVjbGFyYXRpb24uCisgIC8vLyBBbiBpbnRlcmZhY2UgZGVjbGFyYXRpb24gd2lsbCByZXR1cm4gaXRzIGRlZmluaXRpb24uCisgIC8vLyBPdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gaXRzZWxmLgorICBPYmpDTWV0aG9kRGVjbCAqZ2V0TmV4dFJlZGVjbGFyYXRpb25JbXBsKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsV3JpdGVyOworCisgIHN0YXRpYyBPYmpDTWV0aG9kRGVjbCAqCisgIENyZWF0ZShBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBiZWdpbkxvYywgU291cmNlTG9jYXRpb24gZW5kTG9jLAorICAgICAgICAgU2VsZWN0b3IgU2VsSW5mbywgUXVhbFR5cGUgVCwgVHlwZVNvdXJjZUluZm8gKlJldHVyblRJbmZvLAorICAgICAgICAgRGVjbENvbnRleHQgKmNvbnRleHREZWNsLCBib29sIGlzSW5zdGFuY2UgPSB0cnVlLAorICAgICAgICAgYm9vbCBpc1ZhcmlhZGljID0gZmFsc2UsIGJvb2wgaXNQcm9wZXJ0eUFjY2Vzc29yID0gZmFsc2UsCisgICAgICAgICBib29sIGlzSW1wbGljaXRseURlY2xhcmVkID0gZmFsc2UsIGJvb2wgaXNEZWZpbmVkID0gZmFsc2UsCisgICAgICAgICBJbXBsZW1lbnRhdGlvbkNvbnRyb2wgaW1wQ29udHJvbCA9IE5vbmUsCisgICAgICAgICBib29sIEhhc1JlbGF0ZWRSZXN1bHRUeXBlID0gZmFsc2UpOworCisgIHN0YXRpYyBPYmpDTWV0aG9kRGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKKworICBPYmpDTWV0aG9kRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIG92ZXJyaWRlOworICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxPYmpDTWV0aG9kRGVjbCo+KHRoaXMpLT5nZXRDYW5vbmljYWxEZWNsKCk7CisgIH0KKworICBPYmpDRGVjbFF1YWxpZmllciBnZXRPYmpDRGVjbFF1YWxpZmllcigpIGNvbnN0IHsKKyAgICByZXR1cm4gT2JqQ0RlY2xRdWFsaWZpZXIob2JqY0RlY2xRdWFsaWZpZXIpOworICB9CisgIHZvaWQgc2V0T2JqQ0RlY2xRdWFsaWZpZXIoT2JqQ0RlY2xRdWFsaWZpZXIgUVYpIHsgb2JqY0RlY2xRdWFsaWZpZXIgPSBRVjsgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBtZXRob2QgaGFzIGEgcmVzdWx0IHR5cGUgdGhhdCBpcyByZWxhdGVkCisgIC8vLyB0byB0aGUgbWVzc2FnZSByZWNlaXZlcidzIHR5cGUuCisgIGJvb2wgaGFzUmVsYXRlZFJlc3VsdFR5cGUoKSBjb25zdCB7IHJldHVybiBSZWxhdGVkUmVzdWx0VHlwZTsgfQorCisgIC8vLyBcYnJpZWYgTm90ZSB3aGV0aGVyIHRoaXMgbWV0aG9kIGhhcyBhIHJlbGF0ZWQgcmVzdWx0IHR5cGUuCisgIHZvaWQgU2V0UmVsYXRlZFJlc3VsdFR5cGUoYm9vbCBSUlQgPSB0cnVlKSB7IFJlbGF0ZWRSZXN1bHRUeXBlID0gUlJUOyB9CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgaXMgYSBtZXRob2QgcmVkZWNsYXJhdGlvbiBpbiB0aGUgc2FtZSBpbnRlcmZhY2UuCisgIGJvb2wgaXNSZWRlY2xhcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gSXNSZWRlY2xhcmF0aW9uOyB9CisgIHZvaWQgc2V0QXNSZWRlY2xhcmF0aW9uKGNvbnN0IE9iakNNZXRob2REZWNsICpQcmV2TWV0aG9kKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBkZWNsYXJhdG9yIGVuZHMuIEl0IHdpbGwgYmUKKyAgLy8vIHRoZSBsb2NhdGlvbiBvZiAnOycgZm9yIGEgbWV0aG9kIGRlY2xhcmF0aW9uIGFuZCB0aGUgbG9jYXRpb24gb2YgJ3snCisgIC8vLyBmb3IgYSBtZXRob2QgZGVmaW5pdGlvbi4KKyAgU291cmNlTG9jYXRpb24gZ2V0RGVjbGFyYXRvckVuZExvYygpIGNvbnN0IHsgcmV0dXJuIERlY2xFbmRMb2M7IH0KKworICAvLyBMb2NhdGlvbiBpbmZvcm1hdGlvbiwgbW9kZWxlZCBhZnRlciB0aGUgU3RtdCBBUEkuCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBnZXRMb2NhdGlvbigpOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIFNvdXJjZVJhbmdlKGdldExvY2F0aW9uKCksIGdldExvY0VuZCgpKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFNlbGVjdG9yU3RhcnRMb2MoKSBjb25zdCB7CisgICAgaWYgKGlzSW1wbGljaXQoKSkKKyAgICAgIHJldHVybiBnZXRMb2NTdGFydCgpOworICAgIHJldHVybiBnZXRTZWxlY3RvckxvYygwKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFNlbGVjdG9yTG9jKHVuc2lnbmVkIEluZGV4KSBjb25zdCB7CisgICAgYXNzZXJ0KEluZGV4IDwgZ2V0TnVtU2VsZWN0b3JMb2NzKCkgJiYgIkluZGV4IG91dCBvZiByYW5nZSEiKTsKKyAgICBpZiAoaGFzU3RhbmRhcmRTZWxMb2NzKCkpCisgICAgICByZXR1cm4gZ2V0U3RhbmRhcmRTZWxlY3RvckxvYyhJbmRleCwgZ2V0U2VsZWN0b3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VsTG9jc0tpbmQoKSA9PSBTZWxMb2NfU3RhbmRhcmRXaXRoU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xFbmRMb2MpOworICAgIHJldHVybiBnZXRTdG9yZWRTZWxMb2NzKClbSW5kZXhdOworICB9CisKKyAgdm9pZCBnZXRTZWxlY3RvckxvY3MoU21hbGxWZWN0b3JJbXBsPFNvdXJjZUxvY2F0aW9uPiAmU2VsTG9jcykgY29uc3Q7CisKKyAgdW5zaWduZWQgZ2V0TnVtU2VsZWN0b3JMb2NzKCkgY29uc3QgeworICAgIGlmIChpc0ltcGxpY2l0KCkpCisgICAgICByZXR1cm4gMDsKKyAgICBTZWxlY3RvciBTZWwgPSBnZXRTZWxlY3RvcigpOworICAgIGlmIChTZWwuaXNVbmFyeVNlbGVjdG9yKCkpCisgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gU2VsLmdldE51bUFyZ3MoKTsKKyAgfQorCisgIE9iakNJbnRlcmZhY2VEZWNsICpnZXRDbGFzc0ludGVyZmFjZSgpOworICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqZ2V0Q2xhc3NJbnRlcmZhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8T2JqQ01ldGhvZERlY2wqPih0aGlzKS0+Z2V0Q2xhc3NJbnRlcmZhY2UoKTsKKyAgfQorCisgIFNlbGVjdG9yIGdldFNlbGVjdG9yKCkgY29uc3QgeyByZXR1cm4gZ2V0RGVjbE5hbWUoKS5nZXRPYmpDU2VsZWN0b3IoKTsgfQorCisgIFF1YWxUeXBlIGdldFJldHVyblR5cGUoKSBjb25zdCB7IHJldHVybiBNZXRob2REZWNsVHlwZTsgfQorICB2b2lkIHNldFJldHVyblR5cGUoUXVhbFR5cGUgVCkgeyBNZXRob2REZWNsVHlwZSA9IFQ7IH0KKyAgU291cmNlUmFuZ2UgZ2V0UmV0dXJuVHlwZVNvdXJjZVJhbmdlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIHR5cGUgb2YgYW4gZXhwcmVzc2lvbiB0aGF0IHNlbmRzIGEgbWVzc2FnZSB0byB0aGlzCisgIC8vLyBmdW5jdGlvbi4gVGhpcyByZXBsYWNlcyB0aGUgdHlwZSBwYXJhbWV0ZXJzIHdpdGggdGhlIHR5cGVzIHRoZXkgd291bGQKKyAgLy8vIGdldCBpZiB0aGUgcmVjZWl2ZXIgd2FzIHBhcmFtZXRlcmxlc3MgKGUuZy4gaXQgbWF5IHJlcGxhY2UgdGhlIHR5cGUKKyAgLy8vIHBhcmFtZXRlciB3aXRoICdpZCcpLgorICBRdWFsVHlwZSBnZXRTZW5kUmVzdWx0VHlwZSgpIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgdGhlIHR5cGUgb2YgYW4gZXhwcmVzc2lvbiB0aGF0IHNlbmRzIGEgbWVzc2FnZSB0byB0aGlzCisgIC8vLyBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiByZWNlaXZlciB0eXBlLgorICBRdWFsVHlwZSBnZXRTZW5kUmVzdWx0VHlwZShRdWFsVHlwZSByZWNlaXZlclR5cGUpIGNvbnN0OworCisgIFR5cGVTb3VyY2VJbmZvICpnZXRSZXR1cm5UeXBlU291cmNlSW5mbygpIGNvbnN0IHsgcmV0dXJuIFJldHVyblRJbmZvOyB9CisgIHZvaWQgc2V0UmV0dXJuVHlwZVNvdXJjZUluZm8oVHlwZVNvdXJjZUluZm8gKlRJbmZvKSB7IFJldHVyblRJbmZvID0gVEluZm87IH0KKworICAvLyBJdGVyYXRvciBhY2Nlc3MgdG8gZm9ybWFsIHBhcmFtZXRlcnMuCisgIHVuc2lnbmVkIHBhcmFtX3NpemUoKSBjb25zdCB7IHJldHVybiBOdW1QYXJhbXM7IH0KKworICB1c2luZyBwYXJhbV9jb25zdF9pdGVyYXRvciA9IGNvbnN0IFBhcm1WYXJEZWNsICpjb25zdCAqOworICB1c2luZyBwYXJhbV9pdGVyYXRvciA9IFBhcm1WYXJEZWNsICpjb25zdCAqOworICB1c2luZyBwYXJhbV9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPHBhcmFtX2l0ZXJhdG9yPjsKKyAgdXNpbmcgcGFyYW1fY29uc3RfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxwYXJhbV9jb25zdF9pdGVyYXRvcj47CisKKyAgcGFyYW1fY29uc3RfaXRlcmF0b3IgcGFyYW1fYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIHBhcmFtX2NvbnN0X2l0ZXJhdG9yKGdldFBhcmFtcygpKTsKKyAgfQorCisgIHBhcmFtX2NvbnN0X2l0ZXJhdG9yIHBhcmFtX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcGFyYW1fY29uc3RfaXRlcmF0b3IoZ2V0UGFyYW1zKCkgKyBOdW1QYXJhbXMpOworICB9CisKKyAgcGFyYW1faXRlcmF0b3IgcGFyYW1fYmVnaW4oKSB7IHJldHVybiBwYXJhbV9pdGVyYXRvcihnZXRQYXJhbXMoKSk7IH0KKyAgcGFyYW1faXRlcmF0b3IgcGFyYW1fZW5kKCkgeyByZXR1cm4gcGFyYW1faXRlcmF0b3IoZ2V0UGFyYW1zKCkgKyBOdW1QYXJhbXMpOyB9CisKKyAgLy8gVGhpcyBtZXRob2QgcmV0dXJucyBhbmQgb2YgdGhlIHBhcmFtZXRlcnMgd2hpY2ggYXJlIHBhcnQgb2YgdGhlIHNlbGVjdG9yCisgIC8vIG5hbWUgbWFuZ2xpbmcgcmVxdWlyZW1lbnRzLgorICBwYXJhbV9jb25zdF9pdGVyYXRvciBzZWxfcGFyYW1fZW5kKCkgY29uc3QgeworICAgIHJldHVybiBwYXJhbV9iZWdpbigpICsgZ2V0U2VsZWN0b3IoKS5nZXROdW1BcmdzKCk7CisgIH0KKworICAvLyBBcnJheVJlZiBhY2Nlc3MgdG8gZm9ybWFsIHBhcmFtZXRlcnMuICBUaGlzIHNob3VsZCBldmVudHVhbGx5CisgIC8vIHJlcGxhY2UgdGhlIGl0ZXJhdG9yIGludGVyZmFjZSBhYm92ZS4KKyAgQXJyYXlSZWY8UGFybVZhckRlY2wqPiBwYXJhbWV0ZXJzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoY29uc3RfY2FzdDxQYXJtVmFyRGVjbCoqPihnZXRQYXJhbXMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1QYXJhbXMpOworICB9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBtZXRob2QncyBwYXJhbWV0ZXJzIGFuZCBzZWxlY3RvciBzb3VyY2UgbG9jYXRpb25zLgorICAvLy8gSWYgdGhlIG1ldGhvZCBpcyBpbXBsaWNpdCAobm90IGNvbWluZyBmcm9tIHNvdXJjZSkgXHAgU2VsTG9jcyBpcworICAvLy8gaWdub3JlZC4KKyAgdm9pZCBzZXRNZXRob2RQYXJhbXMoQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFybVZhckRlY2wqPiBQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNvdXJjZUxvY2F0aW9uPiBTZWxMb2NzID0gbGx2bTo6Tm9uZSk7CisKKyAgLy8gSXRlcmF0b3IgYWNjZXNzIHRvIHBhcmFtZXRlciB0eXBlcy4KKyAgc3RydWN0IEdldFR5cGVGbiB7CisgICAgUXVhbFR5cGUgb3BlcmF0b3IoKShjb25zdCBQYXJtVmFyRGVjbCAqUEQpIGNvbnN0IHsgcmV0dXJuIFBELT5nZXRUeXBlKCk7IH0KKyAgfTsKKworICB1c2luZyBwYXJhbV90eXBlX2l0ZXJhdG9yID0KKyAgICAgIGxsdm06Om1hcHBlZF9pdGVyYXRvcjxwYXJhbV9jb25zdF9pdGVyYXRvciwgR2V0VHlwZUZuPjsKKworICBwYXJhbV90eXBlX2l0ZXJhdG9yIHBhcmFtX3R5cGVfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1hcF9pdGVyYXRvcihwYXJhbV9iZWdpbigpLCBHZXRUeXBlRm4oKSk7CisgIH0KKworICBwYXJhbV90eXBlX2l0ZXJhdG9yIHBhcmFtX3R5cGVfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYXBfaXRlcmF0b3IocGFyYW1fZW5kKCksIEdldFR5cGVGbigpKTsKKyAgfQorCisgIC8vLyBjcmVhdGVJbXBsaWNpdFBhcmFtcyAtIFVzZWQgdG8gbGF6aWx5IGNyZWF0ZSB0aGUgc2VsZiBhbmQgY21kCisgIC8vLyBpbXBsaWN0IHBhcmFtZXRlcnMuIFRoaXMgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gdXNpbmcgZ2V0U2VsZkRlY2woKQorICAvLy8gb3IgZ2V0Q21kRGVjbCgpLiBUaGUgY2FsbCBpcyBpZ25vcmVkIGlmIHRoZSBpbXBsaWNpdCBwYXJhbWV0ZXJzCisgIC8vLyBoYXZlIGFscmVhZHkgYmVlbiBjcmVhdGVkLgorICB2b2lkIGNyZWF0ZUltcGxpY2l0UGFyYW1zKEFTVENvbnRleHQgJkNvbnRleHQsIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJRCk7CisKKyAgLy8vIFxyZXR1cm4gdGhlIHR5cGUgZm9yIFxjIHNlbGYgYW5kIHNldCBcYXJnIHNlbGZJc1BzZXVkb1N0cm9uZyBhbmQKKyAgLy8vIFxhcmcgc2VsZklzQ29uc3VtZWQgYWNjb3JkaW5nbHkuCisgIFF1YWxUeXBlIGdldFNlbGZUeXBlKEFTVENvbnRleHQgJkNvbnRleHQsIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpPSUQsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJnNlbGZJc1BzZXVkb1N0cm9uZywgYm9vbCAmc2VsZklzQ29uc3VtZWQpOworCisgIEltcGxpY2l0UGFyYW1EZWNsICogZ2V0U2VsZkRlY2woKSBjb25zdCB7IHJldHVybiBTZWxmRGVjbDsgfQorICB2b2lkIHNldFNlbGZEZWNsKEltcGxpY2l0UGFyYW1EZWNsICpTRCkgeyBTZWxmRGVjbCA9IFNEOyB9CisgIEltcGxpY2l0UGFyYW1EZWNsICogZ2V0Q21kRGVjbCgpIGNvbnN0IHsgcmV0dXJuIENtZERlY2w7IH0KKyAgdm9pZCBzZXRDbWREZWNsKEltcGxpY2l0UGFyYW1EZWNsICpDRCkgeyBDbWREZWNsID0gQ0Q7IH0KKworICAvLy8gRGV0ZXJtaW5lcyB0aGUgZmFtaWx5IG9mIHRoaXMgbWV0aG9kLgorICBPYmpDTWV0aG9kRmFtaWx5IGdldE1ldGhvZEZhbWlseSgpIGNvbnN0OworCisgIGJvb2wgaXNJbnN0YW5jZU1ldGhvZCgpIGNvbnN0IHsgcmV0dXJuIElzSW5zdGFuY2U7IH0KKyAgdm9pZCBzZXRJbnN0YW5jZU1ldGhvZChib29sIGlzSW5zdCkgeyBJc0luc3RhbmNlID0gaXNJbnN0OyB9CisgIGJvb2wgaXNWYXJpYWRpYygpIGNvbnN0IHsgcmV0dXJuIElzVmFyaWFkaWM7IH0KKyAgdm9pZCBzZXRWYXJpYWRpYyhib29sIGlzVmFyKSB7IElzVmFyaWFkaWMgPSBpc1ZhcjsgfQorCisgIGJvb2wgaXNDbGFzc01ldGhvZCgpIGNvbnN0IHsgcmV0dXJuICFJc0luc3RhbmNlOyB9CisKKyAgYm9vbCBpc1Byb3BlcnR5QWNjZXNzb3IoKSBjb25zdCB7IHJldHVybiBJc1Byb3BlcnR5QWNjZXNzb3I7IH0KKyAgdm9pZCBzZXRQcm9wZXJ0eUFjY2Vzc29yKGJvb2wgaXNBY2Nlc3NvcikgeyBJc1Byb3BlcnR5QWNjZXNzb3IgPSBpc0FjY2Vzc29yOyB9CisKKyAgYm9vbCBpc0RlZmluZWQoKSBjb25zdCB7IHJldHVybiBJc0RlZmluZWQ7IH0KKyAgdm9pZCBzZXREZWZpbmVkKGJvb2wgaXNEZWZpbmVkKSB7IElzRGVmaW5lZCA9IGlzRGVmaW5lZDsgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIG1ldGhvZCBvdmVycmlkZXMgYW55IG90aGVyIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuCisgIC8vLworICAvLy8gQSBtZXRob2QgaXMgc2FpZCB0byBvdmVycmlkZSBhbnkgbWV0aG9kIGluIHRoZSBjbGFzcydzCisgIC8vLyBiYXNlIGNsYXNzZXMsIGl0cyBwcm90b2NvbHMsIG9yIGl0cyBjYXRlZ29yaWVzJyBwcm90b2NvbHMsIHRoYXQgaGFzCisgIC8vLyB0aGUgc2FtZSBzZWxlY3RvciBhbmQgaXMgb2YgdGhlIHNhbWUga2luZCAoY2xhc3Mgb3IgaW5zdGFuY2UpLgorICAvLy8gQSBtZXRob2QgaW4gYW4gaW1wbGVtZW50YXRpb24gaXMgbm90IGNvbnNpZGVyZWQgYXMgb3ZlcnJpZGluZyB0aGUgc2FtZQorICAvLy8gbWV0aG9kIGluIHRoZSBpbnRlcmZhY2Ugb3IgaXRzIGNhdGVnb3JpZXMuCisgIGJvb2wgaXNPdmVycmlkaW5nKCkgY29uc3QgeyByZXR1cm4gSXNPdmVycmlkaW5nOyB9CisgIHZvaWQgc2V0T3ZlcnJpZGluZyhib29sIGlzT3ZlcnJpZGluZykgeyBJc092ZXJyaWRpbmcgPSBpc092ZXJyaWRpbmc7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiBvdmVycmlkZGVuIG1ldGhvZHMgZm9yIHRoZSBnaXZlbiBccCBNZXRob2QuCisgIC8vLworICAvLy8gQW4gT2JqQyBtZXRob2QgaXMgY29uc2lkZXJlZCB0byBvdmVycmlkZSBhbnkgbWV0aG9kIGluIHRoZSBjbGFzcydzCisgIC8vLyBiYXNlIGNsYXNzZXMgKGFuZCBiYXNlJ3MgY2F0ZWdvcmllcyksIGl0cyBwcm90b2NvbHMsIG9yIGl0cyBjYXRlZ29yaWVzJworICAvLy8gcHJvdG9jb2xzLCB0aGF0IGhhcworICAvLy8gdGhlIHNhbWUgc2VsZWN0b3IgYW5kIGlzIG9mIHRoZSBzYW1lIGtpbmQgKGNsYXNzIG9yIGluc3RhbmNlKS4KKyAgLy8vIEEgbWV0aG9kIGluIGFuIGltcGxlbWVudGF0aW9uIGlzIG5vdCBjb25zaWRlcmVkIGFzIG92ZXJyaWRpbmcgdGhlIHNhbWUKKyAgLy8vIG1ldGhvZCBpbiB0aGUgaW50ZXJmYWNlIG9yIGl0cyBjYXRlZ29yaWVzLgorICB2b2lkIGdldE92ZXJyaWRkZW5NZXRob2RzKAorICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IE9iakNNZXRob2REZWNsICo+ICZPdmVycmlkZGVuKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhlIG1ldGhvZCB3YXMgYSBkZWZpbml0aW9uIGJ1dCBpdHMgYm9keSB3YXMgc2tpcHBlZC4KKyAgYm9vbCBoYXNTa2lwcGVkQm9keSgpIGNvbnN0IHsgcmV0dXJuIEhhc1NraXBwZWRCb2R5OyB9CisgIHZvaWQgc2V0SGFzU2tpcHBlZEJvZHkoYm9vbCBTa2lwcGVkID0gdHJ1ZSkgeyBIYXNTa2lwcGVkQm9keSA9IFNraXBwZWQ7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1ldGhvZCdzIHNlbGVjdG9yLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBldmVuIGlmIHRoaXMgcGFydGljdWxhciBtZXRob2QgaXMgbm90IG1hcmtlZCBhcyBhIHByb3BlcnR5CisgIC8vLyBhY2Nlc3NvciwgaXQgaXMgc3RpbGwgcG9zc2libGUgZm9yIGl0IHRvIG1hdGNoIGEgcHJvcGVydHkgZGVjbGFyZWQgaW4gYQorICAvLy8gc3VwZXJjbGFzcy4gUGFzcyBcYyBmYWxzZSBpZiB5b3Ugb25seSB3YW50IHRvIGNoZWNrIHRoZSBjdXJyZW50IGNsYXNzLgorICBjb25zdCBPYmpDUHJvcGVydHlEZWNsICpmaW5kUHJvcGVydHlEZWNsKGJvb2wgQ2hlY2tPdmVycmlkZXMgPSB0cnVlKSBjb25zdDsKKworICAvLyBSZWxhdGVkIHRvIHByb3RvY29scyBkZWNsYXJlZCBpbiAgXEBwcm90b2NvbAorICB2b2lkIHNldERlY2xJbXBsZW1lbnRhdGlvbihJbXBsZW1lbnRhdGlvbkNvbnRyb2wgaWMpIHsKKyAgICBEZWNsSW1wbGVtZW50YXRpb24gPSBpYzsKKyAgfQorCisgIEltcGxlbWVudGF0aW9uQ29udHJvbCBnZXRJbXBsZW1lbnRhdGlvbkNvbnRyb2woKSBjb25zdCB7CisgICAgcmV0dXJuIEltcGxlbWVudGF0aW9uQ29udHJvbChEZWNsSW1wbGVtZW50YXRpb24pOworICB9CisKKyAgYm9vbCBpc09wdGlvbmFsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRJbXBsZW1lbnRhdGlvbkNvbnRyb2woKSA9PSBPcHRpb25hbDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBzcGVjaWZpYyBtZXRob2QgZGVjbGFyYXRpb24gaXMgbWFya2VkIHdpdGggdGhlCisgIC8vLyBkZXNpZ25hdGVkIGluaXRpYWxpemVyIGF0dHJpYnV0ZS4KKyAgYm9vbCBpc1RoaXNEZWNsYXJhdGlvbkFEZXNpZ25hdGVkSW5pdGlhbGl6ZXIoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtZXRob2Qgc2VsZWN0b3IgcmVzb2x2ZXMgdG8gYSBkZXNpZ25hdGVkIGluaXRpYWxpemVyCisgIC8vLyBpbiB0aGUgY2xhc3MncyBpbnRlcmZhY2UuCisgIC8vLworICAvLy8gXHBhcmFtIEluaXRNZXRob2QgaWYgbm9uLW51bGwgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUsIGl0IHJlY2VpdmVzCisgIC8vLyB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uIHRoYXQgd2FzIG1hcmtlZCB3aXRoIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVyCisgIC8vLyBhdHRyaWJ1dGUuCisgIGJvb2wgaXNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJGb3JUaGVJbnRlcmZhY2UoCisgICAgICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqKkluaXRNZXRob2QgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgbWV0aG9kIGhhcyBhIGJvZHkuCisgIGJvb2wgaGFzQm9keSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEJvZHkuaXNWYWxpZCgpOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgYm9keSBvZiB0aGlzIG1ldGhvZCwgaWYgaXQgaGFzIG9uZS4KKyAgU3RtdCAqZ2V0Qm9keSgpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgc2V0TGF6eUJvZHkodWludDY0X3QgT2Zmc2V0KSB7IEJvZHkgPSBPZmZzZXQ7IH0KKworICBDb21wb3VuZFN0bXQgKmdldENvbXBvdW5kQm9keSgpIHsgcmV0dXJuIChDb21wb3VuZFN0bXQqKWdldEJvZHkoKTsgfQorICB2b2lkIHNldEJvZHkoU3RtdCAqQikgeyBCb2R5ID0gQjsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB3aGV0aGVyIHRoaXMgc3BlY2lmaWMgbWV0aG9kIGlzIGEgZGVmaW5pdGlvbi4KKyAgYm9vbCBpc1RoaXNEZWNsYXJhdGlvbkFEZWZpbml0aW9uKCkgY29uc3QgeyByZXR1cm4gaGFzQm9keSgpOyB9CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IE9iakNNZXRob2Q7IH0KKworICBzdGF0aWMgRGVjbENvbnRleHQgKmNhc3RUb0RlY2xDb250ZXh0KGNvbnN0IE9iakNNZXRob2REZWNsICpEKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PERlY2xDb250ZXh0ICo+KGNvbnN0X2Nhc3Q8T2JqQ01ldGhvZERlY2wqPihEKSk7CisgIH0KKworICBzdGF0aWMgT2JqQ01ldGhvZERlY2wgKmNhc3RGcm9tRGVjbENvbnRleHQoY29uc3QgRGVjbENvbnRleHQgKkRDKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE9iakNNZXRob2REZWNsICo+KGNvbnN0X2Nhc3Q8RGVjbENvbnRleHQqPihEQykpOworICB9Cit9OworCisvLy8gRGVzY3JpYmVzIHRoZSB2YXJpYW5jZSBvZiBhIGdpdmVuIGdlbmVyaWMgcGFyYW1ldGVyLgorZW51bSBjbGFzcyBPYmpDVHlwZVBhcmFtVmFyaWFuY2UgOiB1aW50OF90IHsKKyAgLy8vIFRoZSBwYXJhbWV0ZXIgaXMgaW52YXJpYW50OiBtdXN0IG1hdGNoIGV4YWN0bHkuCisgIEludmFyaWFudCwKKworICAvLy8gVGhlIHBhcmFtZXRlciBpcyBjb3ZhcmlhbnQsIGUuZy4sIFg8VD4gaXMgYSBzdWJ0eXBlIG9mIFg8VT4gd2hlbgorICAvLy8gdGhlIHR5cGUgcGFyYW1ldGVyIGlzIGNvdmFyaWFudCBhbmQgVCBpcyBhIHN1YnR5cGUgb2YgVS4KKyAgQ292YXJpYW50LAorCisgIC8vLyBUaGUgcGFyYW1ldGVyIGlzIGNvbnRyYXZhcmlhbnQsIGUuZy4sIFg8VD4gaXMgYSBzdWJ0eXBlIG9mIFg8VT4KKyAgLy8vIHdoZW4gdGhlIHR5cGUgcGFyYW1ldGVyIGlzIGNvdmFyaWFudCBhbmQgVSBpcyBhIHN1YnR5cGUgb2YgVC4KKyAgQ29udHJhdmFyaWFudCwKK307CisKKy8vLyBSZXByZXNlbnRzIHRoZSBkZWNsYXJhdGlvbiBvZiBhbiBPYmplY3RpdmUtQyB0eXBlIHBhcmFtZXRlci4KKy8vLworLy8vIFxjb2RlCisvLy8gQGludGVyZmFjZSBOU0RpY3Rpb25hcnk8S2V5IDogaWQ8TlNDb3B5aW5nPiwgVmFsdWU+CisvLy8gQGVuZAorLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgYm90aCBcYyBLZXkgYW5kIFxjIFZhbHVlIGFyZSByZXByZXNlbnRlZCBieQorLy8vIFxjIE9iakNUeXBlUGFyYW1EZWNsLiBcYyBLZXkgaGFzIGFuIGV4cGxpY2l0IGJvdW5kIG9mIFxjIGlkPE5TQ29weWluZz4sCisvLy8gd2hpbGUgXGMgVmFsdWUgZ2V0cyBhbiBpbXBsaWNpdCBib3VuZCBvZiBcYyBpZC4KKy8vLworLy8vIE9iamVjdGl2ZS1DIHR5cGUgcGFyYW1ldGVycyBhcmUgdHlwZWRlZi1uYW1lcyBpbiB0aGUgZ3JhbW1hciwKK2NsYXNzIE9iakNUeXBlUGFyYW1EZWNsIDogcHVibGljIFR5cGVkZWZOYW1lRGVjbCB7CisgIC8vLyBJbmRleCBvZiB0aGlzIHR5cGUgcGFyYW1ldGVyIGluIHRoZSB0eXBlIHBhcmFtZXRlciBsaXN0LgorICB1bnNpZ25lZCBJbmRleCA6IDE0OworCisgIC8vLyBUaGUgdmFyaWFuY2Ugb2YgdGhlIHR5cGUgcGFyYW1ldGVyLgorICB1bnNpZ25lZCBWYXJpYW5jZSA6IDI7CisKKyAgLy8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgdmFyaWFuY2UsIGlmIGFueS4KKyAgU291cmNlTG9jYXRpb24gVmFyaWFuY2VMb2M7CisKKyAgLy8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgJzonLCB3aGljaCB3aWxsIGJlIHZhbGlkIHdoZW4gdGhlIGJvdW5kIHdhcworICAvLy8gZXhwbGljaXRseSBzcGVjaWZpZWQuCisgIFNvdXJjZUxvY2F0aW9uIENvbG9uTG9jOworCisgIE9iakNUeXBlUGFyYW1EZWNsKEFTVENvbnRleHQgJmN0eCwgRGVjbENvbnRleHQgKmRjLCAKKyAgICAgICAgICAgICAgICAgICAgT2JqQ1R5cGVQYXJhbVZhcmlhbmNlIHZhcmlhbmNlLCBTb3VyY2VMb2NhdGlvbiB2YXJpYW5jZUxvYywKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIG5hbWVMb2MsIElkZW50aWZpZXJJbmZvICpuYW1lLAorICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBjb2xvbkxvYywgVHlwZVNvdXJjZUluZm8gKmJvdW5kSW5mbykKKyAgICAgIDogVHlwZWRlZk5hbWVEZWNsKE9iakNUeXBlUGFyYW0sIGN0eCwgZGMsIG5hbWVMb2MsIG5hbWVMb2MsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib3VuZEluZm8pLAorICAgICAgICBJbmRleChpbmRleCksIFZhcmlhbmNlKHN0YXRpY19jYXN0PHVuc2lnbmVkPih2YXJpYW5jZSkpLAorICAgICAgICBWYXJpYW5jZUxvYyh2YXJpYW5jZUxvYyksIENvbG9uTG9jKGNvbG9uTG9jKSB7fQorCisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsV3JpdGVyOworCisgIHN0YXRpYyBPYmpDVHlwZVBhcmFtRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJmN0eCwgRGVjbENvbnRleHQgKmRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDVHlwZVBhcmFtVmFyaWFuY2UgdmFyaWFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIHZhcmlhbmNlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gbmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIGNvbG9uTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqYm91bmRJbmZvKTsKKyAgc3RhdGljIE9iakNUeXBlUGFyYW1EZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmY3R4LCB1bnNpZ25lZCBJRCk7CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZOworCisgIC8vLyBEZXRlcm1pbmUgdGhlIHZhcmlhbmNlIG9mIHRoaXMgdHlwZSBwYXJhbWV0ZXIuCisgIE9iakNUeXBlUGFyYW1WYXJpYW5jZSBnZXRWYXJpYW5jZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8T2JqQ1R5cGVQYXJhbVZhcmlhbmNlPihWYXJpYW5jZSk7CisgIH0KKworICAvLy8gU2V0IHRoZSB2YXJpYW5jZSBvZiB0aGlzIHR5cGUgcGFyYW1ldGVyLgorICB2b2lkIHNldFZhcmlhbmNlKE9iakNUeXBlUGFyYW1WYXJpYW5jZSB2YXJpYW5jZSkgeworICAgIFZhcmlhbmNlID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHZhcmlhbmNlKTsKKyAgfQorCisgIC8vLyBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIHZhcmlhbmNlIGtleXdvcmQuCisgIFNvdXJjZUxvY2F0aW9uIGdldFZhcmlhbmNlTG9jKCkgY29uc3QgeyByZXR1cm4gVmFyaWFuY2VMb2M7IH0KKworICAvLy8gUmV0cmlldmUgdGhlIGluZGV4IGludG8gaXRzIHR5cGUgcGFyYW1ldGVyIGxpc3QuCisgIHVuc2lnbmVkIGdldEluZGV4KCkgY29uc3QgeyByZXR1cm4gSW5kZXg7IH0KKworICAvLy8gV2hldGhlciB0aGlzIHR5cGUgcGFyYW1ldGVyIGhhcyBhbiBleHBsaWNpdGx5LXdyaXR0ZW4gdHlwZSBib3VuZCwgZS5nLiwKKyAgLy8vICJUIDogTlNWaWV3Ii4KKyAgYm9vbCBoYXNFeHBsaWNpdEJvdW5kKCkgY29uc3QgeyByZXR1cm4gQ29sb25Mb2MuaXNWYWxpZCgpOyB9CisKKyAgLy8vIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgJzonIHNlcGFyYXRpbmcgdGhlIHR5cGUgcGFyYW1ldGVyIG5hbWUKKyAgLy8vIGZyb20gdGhlIGV4cGxpY2l0bHktc3BlY2lmaWVkIGJvdW5kLgorICBTb3VyY2VMb2NhdGlvbiBnZXRDb2xvbkxvYygpIGNvbnN0IHsgcmV0dXJuIENvbG9uTG9jOyB9CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IE9iakNUeXBlUGFyYW07IH0KK307CisKKy8vLyBTdG9yZXMgYSBsaXN0IG9mIE9iamVjdGl2ZS1DIHR5cGUgcGFyYW1ldGVycyBmb3IgYSBwYXJhbWV0ZXJpemVkIGNsYXNzCisvLy8gb3IgYSBjYXRlZ29yeS9leHRlbnNpb24gdGhlcmVvZi4KKy8vLworLy8vIFxjb2RlCisvLy8gQGludGVyZmFjZSBOU0FycmF5PFQ+IC8vIHN0b3JlcyB0aGUgPFQ+CisvLy8gQGVuZAorLy8vIFxlbmRjb2RlCitjbGFzcyBPYmpDVHlwZVBhcmFtTGlzdCBmaW5hbAorICAgIDogcHJpdmF0ZSBsbHZtOjpUcmFpbGluZ09iamVjdHM8T2JqQ1R5cGVQYXJhbUxpc3QsIE9iakNUeXBlUGFyYW1EZWNsICo+IHsKKyAgLy8vIFN0b3JlcyB0aGUgY29tcG9uZW50cyBvZiBhIFNvdXJjZVJhbmdlIGFzIGEgUE9ELgorICBzdHJ1Y3QgUE9EU291cmNlUmFuZ2UgeworICAgIHVuc2lnbmVkIEJlZ2luOworICAgIHVuc2lnbmVkIEVuZDsKKyAgfTsKKworICB1bmlvbiB7IAorICAgIC8vLyBMb2NhdGlvbiBvZiB0aGUgbGVmdCBhbmQgcmlnaHQgYW5nbGUgYnJhY2tldHMuCisgICAgUE9EU291cmNlUmFuZ2UgQnJhY2tldHM7CisKKyAgICAvLyBVc2VkIG9ubHkgZm9yIGFsaWdubWVudC4KKyAgICBPYmpDVHlwZVBhcmFtRGVjbCAqQWxpZ25tZW50SGFjazsKKyAgfTsKKworICAvLy8gVGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGluIHRoZSBsaXN0LCB3aGljaCBhcmUgdGFpbC1hbGxvY2F0ZWQuCisgIHVuc2lnbmVkIE51bVBhcmFtczsKKworICBPYmpDVHlwZVBhcmFtTGlzdChTb3VyY2VMb2NhdGlvbiBsQW5nbGVMb2MsCisgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9iakNUeXBlUGFyYW1EZWNsICo+IHR5cGVQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIHJBbmdsZUxvYyk7CisKK3B1YmxpYzoKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKworICAvLy8gQ3JlYXRlIGEgbmV3IE9iamVjdGl2ZS1DIHR5cGUgcGFyYW1ldGVyIGxpc3QuCisgIHN0YXRpYyBPYmpDVHlwZVBhcmFtTGlzdCAqY3JlYXRlKEFTVENvbnRleHQgJmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gbEFuZ2xlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPYmpDVHlwZVBhcmFtRGVjbCAqPiB0eXBlUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiByQW5nbGVMb2MpOworCisgIC8vLyBJdGVyYXRlIHRocm91Z2ggdGhlIHR5cGUgcGFyYW1ldGVycyBpbiB0aGUgbGlzdC4KKyAgdXNpbmcgaXRlcmF0b3IgPSBPYmpDVHlwZVBhcmFtRGVjbCAqKjsKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxPYmpDVHlwZVBhcmFtRGVjbCAqPigpOyB9CisKKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gYmVnaW4oKSArIHNpemUoKTsgfQorCisgIC8vLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0eXBlIHBhcmFtZXRlcnMgaW4gdGhpcyBsaXN0LgorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gTnVtUGFyYW1zOyB9CisKKyAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSB0eXBlIHBhcmFtZXRlcnMgaW4gdGhlIGxpc3QuCisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gT2JqQ1R5cGVQYXJhbURlY2wgKiBjb25zdCAqOworCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8T2JqQ1R5cGVQYXJhbURlY2wgKj4oKTsKKyAgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gYmVnaW4oKSArIHNpemUoKTsKKyAgfQorCisgIE9iakNUeXBlUGFyYW1EZWNsICpmcm9udCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoc2l6ZSgpID4gMCAmJiAiZW1wdHkgT2JqZWN0aXZlLUMgdHlwZSBwYXJhbWV0ZXIgbGlzdCIpOworICAgIHJldHVybiAqYmVnaW4oKTsKKyAgfQorCisgIE9iakNUeXBlUGFyYW1EZWNsICpiYWNrKCkgY29uc3QgeworICAgIGFzc2VydChzaXplKCkgPiAwICYmICJlbXB0eSBPYmplY3RpdmUtQyB0eXBlIHBhcmFtZXRlciBsaXN0Iik7CisgICAgcmV0dXJuICooZW5kKCkgLSAxKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExBbmdsZUxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZyhCcmFja2V0cy5CZWdpbik7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRSQW5nbGVMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoQnJhY2tldHMuRW5kKTsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgeworICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRMQW5nbGVMb2MoKSwgZ2V0UkFuZ2xlTG9jKCkpOworICB9CisKKyAgLy8vIEdhdGhlciB0aGUgZGVmYXVsdCBzZXQgb2YgdHlwZSBhcmd1bWVudHMgdG8gYmUgc3Vic3RpdHV0ZWQgZm9yCisgIC8vLyB0aGVzZSB0eXBlIHBhcmFtZXRlcnMgd2hlbiBkZWFsaW5nIHdpdGggYW4gdW5zcGVjaWFsaXplZCB0eXBlLgorICB2b2lkIGdhdGhlckRlZmF1bHRUeXBlQXJncyhTbWFsbFZlY3RvckltcGw8UXVhbFR5cGU+ICZ0eXBlQXJncykgY29uc3Q7Cit9OworCitlbnVtIGNsYXNzIE9iakNQcm9wZXJ0eVF1ZXJ5S2luZCA6IHVpbnQ4X3QgeworICBPQkpDX1BSX3F1ZXJ5X3Vua25vd24gPSAweDAwLAorICBPQkpDX1BSX3F1ZXJ5X2luc3RhbmNlLAorICBPQkpDX1BSX3F1ZXJ5X2NsYXNzCit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgb25lIHByb3BlcnR5IGRlY2xhcmF0aW9uIGluIGFuIE9iamVjdGl2ZS1DIGludGVyZmFjZS4KKy8vLworLy8vIEZvciBleGFtcGxlOgorLy8vIFxjb2Rley5tbX0KKy8vLyBcQHByb3BlcnR5IChhc3NpZ24sIHJlYWR3cml0ZSkgaW50IE15UHJvcGVydHk7CisvLy8gXGVuZGNvZGUKK2NsYXNzIE9iakNQcm9wZXJ0eURlY2wgOiBwdWJsaWMgTmFtZWREZWNsIHsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBlbnVtIFByb3BlcnR5QXR0cmlidXRlS2luZCB7CisgICAgT0JKQ19QUl9ub2F0dHIgICAgPSAweDAwLAorICAgIE9CSkNfUFJfcmVhZG9ubHkgID0gMHgwMSwKKyAgICBPQkpDX1BSX2dldHRlciAgICA9IDB4MDIsCisgICAgT0JKQ19QUl9hc3NpZ24gICAgPSAweDA0LAorICAgIE9CSkNfUFJfcmVhZHdyaXRlID0gMHgwOCwKKyAgICBPQkpDX1BSX3JldGFpbiAgICA9IDB4MTAsCisgICAgT0JKQ19QUl9jb3B5ICAgICAgPSAweDIwLAorICAgIE9CSkNfUFJfbm9uYXRvbWljID0gMHg0MCwKKyAgICBPQkpDX1BSX3NldHRlciAgICA9IDB4ODAsCisgICAgT0JKQ19QUl9hdG9taWMgICAgPSAweDEwMCwKKyAgICBPQkpDX1BSX3dlYWsgICAgICA9IDB4MjAwLAorICAgIE9CSkNfUFJfc3Ryb25nICAgID0gMHg0MDAsCisgICAgT0JKQ19QUl91bnNhZmVfdW5yZXRhaW5lZCA9IDB4ODAwLAorICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgbnVsbGFiaWxpdHkgb2YgdGhlIHR5cGUgd2FzIHNwZWxsZWQgd2l0aCBhCisgICAgLy8vIHByb3BlcnR5IGF0dHJpYnV0ZSByYXRoZXIgdGhhbiBhIHR5cGUgcXVhbGlmaWVyLgorICAgIE9CSkNfUFJfbnVsbGFiaWxpdHkgPSAweDEwMDAsCisgICAgT0JKQ19QUl9udWxsX3Jlc2V0dGFibGUgPSAweDIwMDAsCisgICAgT0JKQ19QUl9jbGFzcyA9IDB4NDAwMAorICAgIC8vIEFkZGluZyBhIHByb3BlcnR5IHNob3VsZCBjaGFuZ2UgTnVtUHJvcGVydHlBdHRyc0JpdHMKKyAgfTsKKworICBlbnVtIHsKKyAgICAvLy8gXGJyaWVmIE51bWJlciBvZiBiaXRzIGZpdHRpbmcgYWxsIHRoZSBwcm9wZXJ0eSBhdHRyaWJ1dGVzLgorICAgIE51bVByb3BlcnR5QXR0cnNCaXRzID0gMTUKKyAgfTsKKworICBlbnVtIFNldHRlcktpbmQgeyBBc3NpZ24sIFJldGFpbiwgQ29weSwgV2VhayB9OworICBlbnVtIFByb3BlcnR5Q29udHJvbCB7IE5vbmUsIFJlcXVpcmVkLCBPcHRpb25hbCB9OworCitwcml2YXRlOgorICAvLyBsb2NhdGlvbiBvZiBcQHByb3BlcnR5CisgIFNvdXJjZUxvY2F0aW9uIEF0TG9jOworCisgIC8vIGxvY2F0aW9uIG9mICcoJyBzdGFydGluZyBhdHRyaWJ1dGUgbGlzdCBvciBudWxsLgorICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2M7CisKKyAgUXVhbFR5cGUgRGVjbFR5cGU7CisgIFR5cGVTb3VyY2VJbmZvICpEZWNsVHlwZVNvdXJjZUluZm87CisgIHVuc2lnbmVkIFByb3BlcnR5QXR0cmlidXRlcyA6IE51bVByb3BlcnR5QXR0cnNCaXRzOworICB1bnNpZ25lZCBQcm9wZXJ0eUF0dHJpYnV0ZXNBc1dyaXR0ZW4gOiBOdW1Qcm9wZXJ0eUF0dHJzQml0czsKKworICAvLyBcQHJlcXVpcmVkL1xAb3B0aW9uYWwKKyAgdW5zaWduZWQgUHJvcGVydHlJbXBsZW1lbnRhdGlvbiA6IDI7CisKKyAgLy8gZ2V0dGVyIG5hbWUgb2YgTlVMTCBpZiBubyBnZXR0ZXIKKyAgU2VsZWN0b3IgR2V0dGVyTmFtZTsKKworICAvLyBzZXR0ZXIgbmFtZSBvZiBOVUxMIGlmIG5vIHNldHRlcgorICBTZWxlY3RvciBTZXR0ZXJOYW1lOworCisgIC8vIGxvY2F0aW9uIG9mIHRoZSBnZXR0ZXIgYXR0cmlidXRlJ3MgdmFsdWUKKyAgU291cmNlTG9jYXRpb24gR2V0dGVyTmFtZUxvYzsKKworICAvLyBsb2NhdGlvbiBvZiB0aGUgc2V0dGVyIGF0dHJpYnV0ZSdzIHZhbHVlCisgIFNvdXJjZUxvY2F0aW9uIFNldHRlck5hbWVMb2M7CisKKyAgLy8gRGVjbGFyYXRpb24gb2YgZ2V0dGVyIGluc3RhbmNlIG1ldGhvZAorICBPYmpDTWV0aG9kRGVjbCAqR2V0dGVyTWV0aG9kRGVjbCA9IG51bGxwdHI7CisKKyAgLy8gRGVjbGFyYXRpb24gb2Ygc2V0dGVyIGluc3RhbmNlIG1ldGhvZAorICBPYmpDTWV0aG9kRGVjbCAqU2V0dGVyTWV0aG9kRGVjbCA9IG51bGxwdHI7CisKKyAgLy8gU3ludGhlc2l6ZSBpdmFyIGZvciB0aGlzIHByb3BlcnR5CisgIE9iakNJdmFyRGVjbCAqUHJvcGVydHlJdmFyRGVjbCA9IG51bGxwdHI7CisKKyAgT2JqQ1Byb3BlcnR5RGVjbChEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIEwsIElkZW50aWZpZXJJbmZvICpJZCwKKyAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdExvY2F0aW9uLCAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwgVHlwZVNvdXJjZUluZm8gKlRTSSwKKyAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUNvbnRyb2wgcHJvcENvbnRyb2wpCisgICAgOiBOYW1lZERlY2woT2JqQ1Byb3BlcnR5LCBEQywgTCwgSWQpLCBBdExvYyhBdExvY2F0aW9uKSwKKyAgICAgIExQYXJlbkxvYyhMUGFyZW5Mb2NhdGlvbiksIERlY2xUeXBlKFQpLCBEZWNsVHlwZVNvdXJjZUluZm8oVFNJKSwKKyAgICAgIFByb3BlcnR5QXR0cmlidXRlcyhPQkpDX1BSX25vYXR0ciksCisgICAgICBQcm9wZXJ0eUF0dHJpYnV0ZXNBc1dyaXR0ZW4oT0JKQ19QUl9ub2F0dHIpLAorICAgICAgUHJvcGVydHlJbXBsZW1lbnRhdGlvbihwcm9wQ29udHJvbCksIEdldHRlck5hbWUoU2VsZWN0b3IoKSksCisgICAgICBTZXR0ZXJOYW1lKFNlbGVjdG9yKCkpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIE9iakNQcm9wZXJ0eURlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsIFNvdXJjZUxvY2F0aW9uIEF0TG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqVFNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5Q29udHJvbCBwcm9wQ29udHJvbCA9IE5vbmUpOworCisgIHN0YXRpYyBPYmpDUHJvcGVydHlEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOworCisgIFNvdXJjZUxvY2F0aW9uIGdldEF0TG9jKCkgY29uc3QgeyByZXR1cm4gQXRMb2M7IH0KKyAgdm9pZCBzZXRBdExvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IEF0TG9jID0gTDsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIExQYXJlbkxvYzsgfQorICB2b2lkIHNldExQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IExQYXJlbkxvYyA9IEw7IH0KKworICBUeXBlU291cmNlSW5mbyAqZ2V0VHlwZVNvdXJjZUluZm8oKSBjb25zdCB7IHJldHVybiBEZWNsVHlwZVNvdXJjZUluZm87IH0KKworICBRdWFsVHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gRGVjbFR5cGU7IH0KKworICB2b2lkIHNldFR5cGUoUXVhbFR5cGUgVCwgVHlwZVNvdXJjZUluZm8gKlRTSSkgeworICAgIERlY2xUeXBlID0gVDsKKyAgICBEZWNsVHlwZVNvdXJjZUluZm8gPSBUU0k7CisgIH0KKworICAvLy8gUmV0cmlldmUgdGhlIHR5cGUgd2hlbiB0aGlzIHByb3BlcnR5IGlzIHVzZWQgd2l0aCBhIHNwZWNpZmljIGJhc2Ugb2JqZWN0CisgIC8vLyB0eXBlLgorICBRdWFsVHlwZSBnZXRVc2FnZVR5cGUoUXVhbFR5cGUgb2JqZWN0VHlwZSkgY29uc3Q7CisKKyAgUHJvcGVydHlBdHRyaWJ1dGVLaW5kIGdldFByb3BlcnR5QXR0cmlidXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJvcGVydHlBdHRyaWJ1dGVLaW5kKFByb3BlcnR5QXR0cmlidXRlcyk7CisgIH0KKworICB2b2lkIHNldFByb3BlcnR5QXR0cmlidXRlcyhQcm9wZXJ0eUF0dHJpYnV0ZUtpbmQgUFJWYWwpIHsKKyAgICBQcm9wZXJ0eUF0dHJpYnV0ZXMgfD0gUFJWYWw7CisgIH0KKworICB2b2lkIG92ZXJ3cml0ZVByb3BlcnR5QXR0cmlidXRlcyh1bnNpZ25lZCBQUlZhbCkgeworICAgIFByb3BlcnR5QXR0cmlidXRlcyA9IFBSVmFsOworICB9CisKKyAgUHJvcGVydHlBdHRyaWJ1dGVLaW5kIGdldFByb3BlcnR5QXR0cmlidXRlc0FzV3JpdHRlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJvcGVydHlBdHRyaWJ1dGVLaW5kKFByb3BlcnR5QXR0cmlidXRlc0FzV3JpdHRlbik7CisgIH0KKworICB2b2lkIHNldFByb3BlcnR5QXR0cmlidXRlc0FzV3JpdHRlbihQcm9wZXJ0eUF0dHJpYnV0ZUtpbmQgUFJWYWwpIHsKKyAgICBQcm9wZXJ0eUF0dHJpYnV0ZXNBc1dyaXR0ZW4gPSBQUlZhbDsKKyAgfQorCisgIC8vIEhlbHBlciBtZXRob2RzIGZvciBhY2Nlc3NpbmcgYXR0cmlidXRlcy4KKworICAvLy8gaXNSZWFkT25seSAtIFJldHVybiB0cnVlIGlmZiB0aGUgcHJvcGVydHkgaGFzIGEgc2V0dGVyLgorICBib29sIGlzUmVhZE9ubHkoKSBjb25zdCB7CisgICAgcmV0dXJuIChQcm9wZXJ0eUF0dHJpYnV0ZXMgJiBPQkpDX1BSX3JlYWRvbmx5KTsKKyAgfQorCisgIC8vLyBpc0F0b21pYyAtIFJldHVybiB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBhdG9taWMuCisgIGJvb2wgaXNBdG9taWMoKSBjb25zdCB7CisgICAgcmV0dXJuIChQcm9wZXJ0eUF0dHJpYnV0ZXMgJiBPQkpDX1BSX2F0b21pYyk7CisgIH0KKworICAvLy8gaXNSZXRhaW5pbmcgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgcmV0YWlucyBpdHMgdmFsdWUuCisgIGJvb2wgaXNSZXRhaW5pbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIChQcm9wZXJ0eUF0dHJpYnV0ZXMgJgorICAgICAgICAgICAgKE9CSkNfUFJfcmV0YWluIHwgT0JKQ19QUl9zdHJvbmcgfCBPQkpDX1BSX2NvcHkpKTsKKyAgfQorCisgIGJvb2wgaXNJbnN0YW5jZVByb3BlcnR5KCkgY29uc3QgeyByZXR1cm4gIWlzQ2xhc3NQcm9wZXJ0eSgpOyB9CisgIGJvb2wgaXNDbGFzc1Byb3BlcnR5KCkgY29uc3QgeyByZXR1cm4gUHJvcGVydHlBdHRyaWJ1dGVzICYgT0JKQ19QUl9jbGFzczsgfQorCisgIE9iakNQcm9wZXJ0eVF1ZXJ5S2luZCBnZXRRdWVyeUtpbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQ2xhc3NQcm9wZXJ0eSgpID8gT2JqQ1Byb3BlcnR5UXVlcnlLaW5kOjpPQkpDX1BSX3F1ZXJ5X2NsYXNzIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDUHJvcGVydHlRdWVyeUtpbmQ6Ok9CSkNfUFJfcXVlcnlfaW5zdGFuY2U7CisgIH0KKworICBzdGF0aWMgT2JqQ1Byb3BlcnR5UXVlcnlLaW5kIGdldFF1ZXJ5S2luZChib29sIGlzQ2xhc3NQcm9wZXJ0eSkgeworICAgIHJldHVybiBpc0NsYXNzUHJvcGVydHkgPyBPYmpDUHJvcGVydHlRdWVyeUtpbmQ6Ok9CSkNfUFJfcXVlcnlfY2xhc3MgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDUHJvcGVydHlRdWVyeUtpbmQ6Ok9CSkNfUFJfcXVlcnlfaW5zdGFuY2U7CisgIH0KKworICAvLy8gZ2V0U2V0dGVyS2luZCAtIFJldHVybiB0aGUgbWV0aG9kIHVzZWQgZm9yIGRvaW5nIGFzc2lnbm1lbnQgaW4KKyAgLy8vIHRoZSBwcm9wZXJ0eSBzZXR0ZXIuIFRoaXMgaXMgb25seSB2YWxpZCBpZiB0aGUgcHJvcGVydHkgaGFzIGJlZW4KKyAgLy8vIGRlZmluZWQgdG8gaGF2ZSBhIHNldHRlci4KKyAgU2V0dGVyS2luZCBnZXRTZXR0ZXJLaW5kKCkgY29uc3QgeworICAgIGlmIChQcm9wZXJ0eUF0dHJpYnV0ZXMgJiBPQkpDX1BSX3N0cm9uZykKKyAgICAgIHJldHVybiBnZXRUeXBlKCktPmlzQmxvY2tQb2ludGVyVHlwZSgpID8gQ29weSA6IFJldGFpbjsKKyAgICBpZiAoUHJvcGVydHlBdHRyaWJ1dGVzICYgT0JKQ19QUl9yZXRhaW4pCisgICAgICByZXR1cm4gUmV0YWluOworICAgIGlmIChQcm9wZXJ0eUF0dHJpYnV0ZXMgJiBPQkpDX1BSX2NvcHkpCisgICAgICByZXR1cm4gQ29weTsKKyAgICBpZiAoUHJvcGVydHlBdHRyaWJ1dGVzICYgT0JKQ19QUl93ZWFrKQorICAgICAgcmV0dXJuIFdlYWs7CisgICAgcmV0dXJuIEFzc2lnbjsKKyAgfQorCisgIFNlbGVjdG9yIGdldEdldHRlck5hbWUoKSBjb25zdCB7IHJldHVybiBHZXR0ZXJOYW1lOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldEdldHRlck5hbWVMb2MoKSBjb25zdCB7IHJldHVybiBHZXR0ZXJOYW1lTG9jOyB9CisKKyAgdm9pZCBzZXRHZXR0ZXJOYW1lKFNlbGVjdG9yIFNlbCwgU291cmNlTG9jYXRpb24gTG9jID0gU291cmNlTG9jYXRpb24oKSkgeworICAgIEdldHRlck5hbWUgPSBTZWw7CisgICAgR2V0dGVyTmFtZUxvYyA9IExvYzsKKyAgfQorCisgIFNlbGVjdG9yIGdldFNldHRlck5hbWUoKSBjb25zdCB7IHJldHVybiBTZXR0ZXJOYW1lOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldFNldHRlck5hbWVMb2MoKSBjb25zdCB7IHJldHVybiBTZXR0ZXJOYW1lTG9jOyB9CisKKyAgdm9pZCBzZXRTZXR0ZXJOYW1lKFNlbGVjdG9yIFNlbCwgU291cmNlTG9jYXRpb24gTG9jID0gU291cmNlTG9jYXRpb24oKSkgeworICAgIFNldHRlck5hbWUgPSBTZWw7CisgICAgU2V0dGVyTmFtZUxvYyA9IExvYzsKKyAgfQorCisgIE9iakNNZXRob2REZWNsICpnZXRHZXR0ZXJNZXRob2REZWNsKCkgY29uc3QgeyByZXR1cm4gR2V0dGVyTWV0aG9kRGVjbDsgfQorICB2b2lkIHNldEdldHRlck1ldGhvZERlY2woT2JqQ01ldGhvZERlY2wgKmdEZWNsKSB7IEdldHRlck1ldGhvZERlY2wgPSBnRGVjbDsgfQorCisgIE9iakNNZXRob2REZWNsICpnZXRTZXR0ZXJNZXRob2REZWNsKCkgY29uc3QgeyByZXR1cm4gU2V0dGVyTWV0aG9kRGVjbDsgfQorICB2b2lkIHNldFNldHRlck1ldGhvZERlY2woT2JqQ01ldGhvZERlY2wgKmdEZWNsKSB7IFNldHRlck1ldGhvZERlY2wgPSBnRGVjbDsgfQorCisgIC8vIFJlbGF0ZWQgdG8gXEBvcHRpb25hbC9cQHJlcXVpcmVkIGRlY2xhcmVkIGluIFxAcHJvdG9jb2wKKyAgdm9pZCBzZXRQcm9wZXJ0eUltcGxlbWVudGF0aW9uKFByb3BlcnR5Q29udHJvbCBwYykgeworICAgIFByb3BlcnR5SW1wbGVtZW50YXRpb24gPSBwYzsKKyAgfQorCisgIFByb3BlcnR5Q29udHJvbCBnZXRQcm9wZXJ0eUltcGxlbWVudGF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBQcm9wZXJ0eUNvbnRyb2woUHJvcGVydHlJbXBsZW1lbnRhdGlvbik7CisgIH0KKworICBib29sIGlzT3B0aW9uYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFByb3BlcnR5SW1wbGVtZW50YXRpb24oKSA9PSBQcm9wZXJ0eUNvbnRyb2w6Ok9wdGlvbmFsOworICB9CisKKyAgdm9pZCBzZXRQcm9wZXJ0eUl2YXJEZWNsKE9iakNJdmFyRGVjbCAqSXZhcikgeworICAgIFByb3BlcnR5SXZhckRlY2wgPSBJdmFyOworICB9CisKKyAgT2JqQ0l2YXJEZWNsICpnZXRQcm9wZXJ0eUl2YXJEZWNsKCkgY29uc3QgeworICAgIHJldHVybiBQcm9wZXJ0eUl2YXJEZWNsOworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoQXRMb2MsIGdldExvY2F0aW9uKCkpOworICB9CisKKyAgLy8vIEdldCB0aGUgZGVmYXVsdCBuYW1lIG9mIHRoZSBzeW50aGVzaXplZCBpdmFyLgorICBJZGVudGlmaWVySW5mbyAqZ2V0RGVmYXVsdFN5bnRoSXZhck5hbWUoQVNUQ29udGV4dCAmQ3R4KSBjb25zdDsKKworICAvLy8gTG9va3VwIGEgcHJvcGVydHkgYnkgbmFtZSBpbiB0aGUgc3BlY2lmaWVkIERlY2xDb250ZXh0LgorICBzdGF0aWMgT2JqQ1Byb3BlcnR5RGVjbCAqZmluZFByb3BlcnR5RGVjbChjb25zdCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElkZW50aWZpZXJJbmZvICpwcm9wZXJ0eUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDUHJvcGVydHlRdWVyeUtpbmQgcXVlcnlLaW5kKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IE9iakNQcm9wZXJ0eTsgfQorfTsKKworLy8vIE9iakNDb250YWluZXJEZWNsIC0gUmVwcmVzZW50cyBhIGNvbnRhaW5lciBmb3IgbWV0aG9kIGRlY2xhcmF0aW9ucy4KKy8vLyBDdXJyZW50IHN1Yi1jbGFzc2VzIGFyZSBPYmpDSW50ZXJmYWNlRGVjbCwgT2JqQ0NhdGVnb3J5RGVjbCwKKy8vLyBPYmpDUHJvdG9jb2xEZWNsLCBhbmQgT2JqQ0ltcGxEZWNsLgorLy8vCitjbGFzcyBPYmpDQ29udGFpbmVyRGVjbCA6IHB1YmxpYyBOYW1lZERlY2wsIHB1YmxpYyBEZWNsQ29udGV4dCB7CisgIFNvdXJjZUxvY2F0aW9uIEF0U3RhcnQ7CisKKyAgLy8gVGhlc2UgdHdvIGxvY2F0aW9ucyBpbiB0aGUgcmFuZ2UgbWFyayB0aGUgZW5kIG9mIHRoZSBtZXRob2QgY29udGFpbmVyLgorICAvLyBUaGUgZmlyc3QgcG9pbnRzIHRvIHRoZSAnQCcgdG9rZW4sIGFuZCB0aGUgc2Vjb25kIHRvIHRoZSAnZW5kJyB0b2tlbi4KKyAgU291cmNlUmFuZ2UgQXRFbmQ7CisKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBPYmpDQ29udGFpbmVyRGVjbChLaW5kIERLLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpJZCwgU291cmNlTG9jYXRpb24gbmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gYXRTdGFydExvYykKKyAgICAgIDogTmFtZWREZWNsKERLLCBEQywgbmFtZUxvYywgSWQpLCBEZWNsQ29udGV4dChESyksIEF0U3RhcnQoYXRTdGFydExvYykge30KKworICAvLyBJdGVyYXRvciBhY2Nlc3MgdG8gaW5zdGFuY2UvY2xhc3MgcHJvcGVydGllcy4KKyAgdXNpbmcgcHJvcF9pdGVyYXRvciA9IHNwZWNpZmljX2RlY2xfaXRlcmF0b3I8T2JqQ1Byb3BlcnR5RGVjbD47CisgIHVzaW5nIHByb3BfcmFuZ2UgPQorICAgICAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c3BlY2lmaWNfZGVjbF9pdGVyYXRvcjxPYmpDUHJvcGVydHlEZWNsPj47CisKKyAgcHJvcF9yYW5nZSBwcm9wZXJ0aWVzKCkgY29uc3QgeyByZXR1cm4gcHJvcF9yYW5nZShwcm9wX2JlZ2luKCksIHByb3BfZW5kKCkpOyB9CisKKyAgcHJvcF9pdGVyYXRvciBwcm9wX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBwcm9wX2l0ZXJhdG9yKGRlY2xzX2JlZ2luKCkpOworICB9CisKKyAgcHJvcF9pdGVyYXRvciBwcm9wX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcHJvcF9pdGVyYXRvcihkZWNsc19lbmQoKSk7CisgIH0KKworICB1c2luZyBpbnN0cHJvcF9pdGVyYXRvciA9CisgICAgICBmaWx0ZXJlZF9kZWNsX2l0ZXJhdG9yPE9iakNQcm9wZXJ0eURlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZPYmpDUHJvcGVydHlEZWNsOjppc0luc3RhbmNlUHJvcGVydHk+OworICB1c2luZyBpbnN0cHJvcF9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGluc3Rwcm9wX2l0ZXJhdG9yPjsKKworICBpbnN0cHJvcF9yYW5nZSBpbnN0YW5jZV9wcm9wZXJ0aWVzKCkgY29uc3QgeworICAgIHJldHVybiBpbnN0cHJvcF9yYW5nZShpbnN0cHJvcF9iZWdpbigpLCBpbnN0cHJvcF9lbmQoKSk7CisgIH0KKworICBpbnN0cHJvcF9pdGVyYXRvciBpbnN0cHJvcF9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gaW5zdHByb3BfaXRlcmF0b3IoZGVjbHNfYmVnaW4oKSk7CisgIH0KKworICBpbnN0cHJvcF9pdGVyYXRvciBpbnN0cHJvcF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGluc3Rwcm9wX2l0ZXJhdG9yKGRlY2xzX2VuZCgpKTsKKyAgfQorCisgIHVzaW5nIGNsYXNzcHJvcF9pdGVyYXRvciA9CisgICAgICBmaWx0ZXJlZF9kZWNsX2l0ZXJhdG9yPE9iakNQcm9wZXJ0eURlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZPYmpDUHJvcGVydHlEZWNsOjppc0NsYXNzUHJvcGVydHk+OworICB1c2luZyBjbGFzc3Byb3BfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxjbGFzc3Byb3BfaXRlcmF0b3I+OworCisgIGNsYXNzcHJvcF9yYW5nZSBjbGFzc19wcm9wZXJ0aWVzKCkgY29uc3QgeworICAgIHJldHVybiBjbGFzc3Byb3BfcmFuZ2UoY2xhc3Nwcm9wX2JlZ2luKCksIGNsYXNzcHJvcF9lbmQoKSk7CisgIH0KKworICBjbGFzc3Byb3BfaXRlcmF0b3IgY2xhc3Nwcm9wX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjbGFzc3Byb3BfaXRlcmF0b3IoZGVjbHNfYmVnaW4oKSk7CisgIH0KKworICBjbGFzc3Byb3BfaXRlcmF0b3IgY2xhc3Nwcm9wX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2xhc3Nwcm9wX2l0ZXJhdG9yKGRlY2xzX2VuZCgpKTsKKyAgfQorCisgIC8vIEl0ZXJhdG9yIGFjY2VzcyB0byBpbnN0YW5jZS9jbGFzcyBtZXRob2RzLgorICB1c2luZyBtZXRob2RfaXRlcmF0b3IgPSBzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPE9iakNNZXRob2REZWNsPjsKKyAgdXNpbmcgbWV0aG9kX3JhbmdlID0KKyAgICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHNwZWNpZmljX2RlY2xfaXRlcmF0b3I8T2JqQ01ldGhvZERlY2w+PjsKKworICBtZXRob2RfcmFuZ2UgbWV0aG9kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWV0aG9kX3JhbmdlKG1ldGhfYmVnaW4oKSwgbWV0aF9lbmQoKSk7CisgIH0KKworICBtZXRob2RfaXRlcmF0b3IgbWV0aF9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbWV0aG9kX2l0ZXJhdG9yKGRlY2xzX2JlZ2luKCkpOworICB9CisKKyAgbWV0aG9kX2l0ZXJhdG9yIG1ldGhfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBtZXRob2RfaXRlcmF0b3IoZGVjbHNfZW5kKCkpOworICB9CisKKyAgdXNpbmcgaW5zdG1ldGhfaXRlcmF0b3IgPQorICAgICAgZmlsdGVyZWRfZGVjbF9pdGVyYXRvcjxPYmpDTWV0aG9kRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk9iakNNZXRob2REZWNsOjppc0luc3RhbmNlTWV0aG9kPjsKKyAgdXNpbmcgaW5zdG1ldGhfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxpbnN0bWV0aF9pdGVyYXRvcj47CisKKyAgaW5zdG1ldGhfcmFuZ2UgaW5zdGFuY2VfbWV0aG9kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gaW5zdG1ldGhfcmFuZ2UoaW5zdG1ldGhfYmVnaW4oKSwgaW5zdG1ldGhfZW5kKCkpOworICB9CisKKyAgaW5zdG1ldGhfaXRlcmF0b3IgaW5zdG1ldGhfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGluc3RtZXRoX2l0ZXJhdG9yKGRlY2xzX2JlZ2luKCkpOworICB9CisKKyAgaW5zdG1ldGhfaXRlcmF0b3IgaW5zdG1ldGhfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBpbnN0bWV0aF9pdGVyYXRvcihkZWNsc19lbmQoKSk7CisgIH0KKworICB1c2luZyBjbGFzc21ldGhfaXRlcmF0b3IgPQorICAgICAgZmlsdGVyZWRfZGVjbF9pdGVyYXRvcjxPYmpDTWV0aG9kRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk9iakNNZXRob2REZWNsOjppc0NsYXNzTWV0aG9kPjsKKyAgdXNpbmcgY2xhc3NtZXRoX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8Y2xhc3NtZXRoX2l0ZXJhdG9yPjsKKworICBjbGFzc21ldGhfcmFuZ2UgY2xhc3NfbWV0aG9kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gY2xhc3NtZXRoX3JhbmdlKGNsYXNzbWV0aF9iZWdpbigpLCBjbGFzc21ldGhfZW5kKCkpOworICB9CisKKyAgY2xhc3NtZXRoX2l0ZXJhdG9yIGNsYXNzbWV0aF9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY2xhc3NtZXRoX2l0ZXJhdG9yKGRlY2xzX2JlZ2luKCkpOworICB9CisKKyAgY2xhc3NtZXRoX2l0ZXJhdG9yIGNsYXNzbWV0aF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNsYXNzbWV0aF9pdGVyYXRvcihkZWNsc19lbmQoKSk7CisgIH0KKworICAvLyBHZXQgdGhlIGxvY2FsIGluc3RhbmNlL2NsYXNzIG1ldGhvZCBkZWNsYXJlZCBpbiB0aGlzIGludGVyZmFjZS4KKyAgT2JqQ01ldGhvZERlY2wgKmdldE1ldGhvZChTZWxlY3RvciBTZWwsIGJvb2wgaXNJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93SGlkZGVuID0gZmFsc2UpIGNvbnN0OworCisgIE9iakNNZXRob2REZWNsICpnZXRJbnN0YW5jZU1ldGhvZChTZWxlY3RvciBTZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93SGlkZGVuID0gZmFsc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TWV0aG9kKFNlbCwgdHJ1ZS8qaXNJbnN0YW5jZSovLCBBbGxvd0hpZGRlbik7CisgIH0KKworICBPYmpDTWV0aG9kRGVjbCAqZ2V0Q2xhc3NNZXRob2QoU2VsZWN0b3IgU2VsLCBib29sIEFsbG93SGlkZGVuID0gZmFsc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TWV0aG9kKFNlbCwgZmFsc2UvKmlzSW5zdGFuY2UqLywgQWxsb3dIaWRkZW4pOworICB9CisKKyAgYm9vbCBIYXNVc2VyRGVjbGFyZWRTZXR0ZXJNZXRob2QoY29uc3QgT2JqQ1Byb3BlcnR5RGVjbCAqUCkgY29uc3Q7CisgIE9iakNJdmFyRGVjbCAqZ2V0SXZhckRlY2woSWRlbnRpZmllckluZm8gKklkKSBjb25zdDsKKworICBPYmpDUHJvcGVydHlEZWNsICoKKyAgRmluZFByb3BlcnR5RGVjbGFyYXRpb24oY29uc3QgSWRlbnRpZmllckluZm8gKlByb3BlcnR5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNQcm9wZXJ0eVF1ZXJ5S2luZCBRdWVyeUtpbmQpIGNvbnN0OworCisgIHVzaW5nIFByb3BlcnR5TWFwID0KKyAgICAgIGxsdm06OkRlbnNlTWFwPHN0ZDo6cGFpcjxJZGVudGlmaWVySW5mbyAqLCB1bnNpZ25lZC8qaXNDbGFzc1Byb3BlcnR5Ki8+LAorICAgICAgICAgICAgICAgICAgICAgT2JqQ1Byb3BlcnR5RGVjbCAqPjsKKyAgdXNpbmcgUHJvdG9jb2xQcm9wZXJ0eVNldCA9IGxsdm06OlNtYWxsRGVuc2VTZXQ8Y29uc3QgT2JqQ1Byb3RvY29sRGVjbCAqLCA4PjsKKyAgdXNpbmcgUHJvcGVydHlEZWNsT3JkZXIgPSBsbHZtOjpTbWFsbFZlY3RvcjxPYmpDUHJvcGVydHlEZWNsICosIDg+OworICAKKyAgLy8vIFRoaXMgcm91dGluZSBjb2xsZWN0cyBsaXN0IG9mIHByb3BlcnRpZXMgdG8gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIGNsYXNzLgorICAvLy8gVGhpcyBpbmNsdWRlcywgY2xhc3MncyBhbmQgaXRzIGNvbmZvcm1pbmcgcHJvdG9jb2xzJyBwcm9wZXJ0aWVzLgorICAvLy8gTm90ZSwgdGhlIHN1cGVyY2xhc3MncyBwcm9wZXJ0aWVzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGxpc3QuCisgIHZpcnR1YWwgdm9pZCBjb2xsZWN0UHJvcGVydGllc1RvSW1wbGVtZW50KFByb3BlcnR5TWFwICZQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZWNsT3JkZXIgJlBPKSBjb25zdCB7fQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEF0U3RhcnRMb2MoKSBjb25zdCB7IHJldHVybiBBdFN0YXJ0OyB9CisgIHZvaWQgc2V0QXRTdGFydExvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgQXRTdGFydCA9IExvYzsgfQorCisgIC8vIE1hcmtzIHRoZSBlbmQgb2YgdGhlIGNvbnRhaW5lci4KKyAgU291cmNlUmFuZ2UgZ2V0QXRFbmRSYW5nZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQXRFbmQ7CisgIH0KKworICB2b2lkIHNldEF0RW5kUmFuZ2UoU291cmNlUmFuZ2UgYXRFbmQpIHsKKyAgICBBdEVuZCA9IGF0RW5kOworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoQXRTdGFydCwgZ2V0QXRFbmRSYW5nZSgpLmdldEVuZCgpKTsKKyAgfQorCisgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7CisgICAgcmV0dXJuIEsgPj0gZmlyc3RPYmpDQ29udGFpbmVyICYmCisgICAgICAgICAgIEsgPD0gbGFzdE9iakNDb250YWluZXI7CisgIH0KKworICBzdGF0aWMgRGVjbENvbnRleHQgKmNhc3RUb0RlY2xDb250ZXh0KGNvbnN0IE9iakNDb250YWluZXJEZWNsICpEKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PERlY2xDb250ZXh0ICo+KGNvbnN0X2Nhc3Q8T2JqQ0NvbnRhaW5lckRlY2wqPihEKSk7CisgIH0KKworICBzdGF0aWMgT2JqQ0NvbnRhaW5lckRlY2wgKmNhc3RGcm9tRGVjbENvbnRleHQoY29uc3QgRGVjbENvbnRleHQgKkRDKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE9iakNDb250YWluZXJEZWNsICo+KGNvbnN0X2Nhc3Q8RGVjbENvbnRleHQqPihEQykpOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYW4gT2JqQyBjbGFzcyBkZWNsYXJhdGlvbi4KKy8vLworLy8vIEZvciBleGFtcGxlOgorLy8vCisvLy8gXGNvZGUKKy8vLyAgIC8vIE1vc3RQcmltaXRpdmUgZGVjbGFyZXMgbm8gc3VwZXIgY2xhc3MgKG5vdCBwYXJ0aWN1bGFybHkgdXNlZnVsKS4KKy8vLyAgIFxAaW50ZXJmYWNlIE1vc3RQcmltaXRpdmUKKy8vLyAgICAgLy8gbm8gaW5zdGFuY2UgdmFyaWFibGVzIG9yIG1ldGhvZHMuCisvLy8gICBcQGVuZAorLy8vCisvLy8gICAvLyBOU1Jlc3BvbmRlciBpbmhlcml0cyBmcm9tIE5TT2JqZWN0ICYgaW1wbGVtZW50cyBOU0NvZGluZyAoYSBwcm90b2NvbCkuCisvLy8gICBcQGludGVyZmFjZSBOU1Jlc3BvbmRlciA6IE5TT2JqZWN0IFw8TlNDb2Rpbmc+CisvLy8gICB7IC8vIGluc3RhbmNlIHZhcmlhYmxlcyBhcmUgcmVwcmVzZW50ZWQgYnkgT2JqQ0l2YXJEZWNsLgorLy8vICAgICBpZCBuZXh0UmVzcG9uZGVyOyAvLyBuZXh0UmVzcG9uZGVyIGluc3RhbmNlIHZhcmlhYmxlLgorLy8vICAgfQorLy8vICAgLSAoTlNSZXNwb25kZXIgKiluZXh0UmVzcG9uZGVyOyAvLyByZXR1cm4gYSBwb2ludGVyIHRvIE5TUmVzcG9uZGVyLgorLy8vICAgLSAodm9pZCltb3VzZU1vdmVkOihOU0V2ZW50ICopdGhlRXZlbnQ7IC8vIHJldHVybiB2b2lkLCB0YWtlcyBhIHBvaW50ZXIKKy8vLyAgIFxAZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYW4gTlNFdmVudC4KKy8vLyBcZW5kY29kZQorLy8vCisvLy8gICBVbmxpa2UgQy9DKyssIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zIGFyZSBhY2NvbXBsaXNoZWQgd2l0aCBcQGNsYXNzLgorLy8vICAgVW5saWtlIEMvQysrLCBcQGNsYXNzIGFsbG93cyBmb3IgYSBsaXN0IG9mIGNsYXNzZXMgdG8gYmUgZm9yd2FyZCBkZWNsYXJlZC4KKy8vLyAgIFVubGlrZSBDKyssIE9iakMgaXMgYSBzaW5nbGUtcm9vdGVkIGNsYXNzIG1vZGVsLiBJbiBDb2NvYSwgY2xhc3NlcworLy8vICAgdHlwaWNhbGx5IGluaGVyaXQgZnJvbSBOU09iamVjdCAoYW4gZXhjZXB0aW9uIGlzIE5TUHJveHkpLgorLy8vCitjbGFzcyBPYmpDSW50ZXJmYWNlRGVjbCA6IHB1YmxpYyBPYmpDQ29udGFpbmVyRGVjbAorICAgICAgICAgICAgICAgICAgICAgICAgLCBwdWJsaWMgUmVkZWNsYXJhYmxlPE9iakNJbnRlcmZhY2VEZWNsPiB7CisgIGZyaWVuZCBjbGFzcyBBU1RDb250ZXh0OworCisgIC8vLyBUeXBlRm9yRGVjbCAtIFRoaXMgaW5kaWNhdGVzIHRoZSBUeXBlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhpcworICAvLy8gVHlwZURlY2wuICBJdCBpcyBhIGNhY2hlIG1haW50YWluZWQgYnkgQVNUQ29udGV4dDo6Z2V0T2JqQ0ludGVyZmFjZVR5cGUKKyAgbXV0YWJsZSBjb25zdCBUeXBlICpUeXBlRm9yRGVjbCA9IG51bGxwdHI7CisgIAorICBzdHJ1Y3QgRGVmaW5pdGlvbkRhdGEgeworICAgIC8vLyBcYnJpZWYgVGhlIGRlZmluaXRpb24gb2YgdGhpcyBjbGFzcywgZm9yIHF1aWNrIGFjY2VzcyBmcm9tIGFueSAKKyAgICAvLy8gZGVjbGFyYXRpb24uCisgICAgT2JqQ0ludGVyZmFjZURlY2wgKkRlZmluaXRpb24gPSBudWxscHRyOworICAgIAorICAgIC8vLyBXaGVuIG5vbi1udWxsLCB0aGlzIGlzIGFsd2F5cyBhbiBPYmpDT2JqZWN0VHlwZS4KKyAgICBUeXBlU291cmNlSW5mbyAqU3VwZXJDbGFzc1RJbmZvID0gbnVsbHB0cjsKKyAgICAKKyAgICAvLy8gUHJvdG9jb2xzIHJlZmVyZW5jZWQgaW4gdGhlIFxAaW50ZXJmYWNlICBkZWNsYXJhdGlvbgorICAgIE9iakNQcm90b2NvbExpc3QgUmVmZXJlbmNlZFByb3RvY29sczsKKworICAgIC8vLyBQcm90b2NvbHMgcmVmZXJlbmNlIGluIGJvdGggdGhlIFxAaW50ZXJmYWNlIGFuZCBjbGFzcyBleHRlbnNpb25zLgorICAgIE9iakNMaXN0PE9iakNQcm90b2NvbERlY2w+IEFsbFJlZmVyZW5jZWRQcm90b2NvbHM7CisKKyAgICAvLy8gXGJyaWVmIExpc3Qgb2YgY2F0ZWdvcmllcyBhbmQgY2xhc3MgZXh0ZW5zaW9ucyBkZWZpbmVkIGZvciB0aGlzIGNsYXNzLgorICAgIC8vLworICAgIC8vLyBDYXRlZ29yaWVzIGFyZSBzdG9yZWQgYXMgYSBsaW5rZWQgbGlzdCBpbiB0aGUgQVNULCBzaW5jZSB0aGUgY2F0ZWdvcmllcworICAgIC8vLyBhbmQgY2xhc3MgZXh0ZW5zaW9ucyBjb21lIGxvbmcgYWZ0ZXIgdGhlIGluaXRpYWwgaW50ZXJmYWNlIGRlY2xhcmF0aW9uLAorICAgIC8vLyBhbmQgd2UgYXZvaWQgZHluYW1pY2FsbHktcmVzaXplZCBhcnJheXMgaW4gdGhlIEFTVCB3aGVyZXZlciBwb3NzaWJsZS4KKyAgICBPYmpDQ2F0ZWdvcnlEZWNsICpDYXRlZ29yeUxpc3QgPSBudWxscHRyOworCisgICAgLy8vIEl2YXJMaXN0IC0gTGlzdCBvZiBhbGwgaXZhcnMgZGVmaW5lZCBieSB0aGlzIGNsYXNzOyBpbmNsdWRpbmcgY2xhc3MKKyAgICAvLy8gZXh0ZW5zaW9ucyBhbmQgaW1wbGVtZW50YXRpb24uIFRoaXMgbGlzdCBpcyBidWlsdCBsYXppbHkuCisgICAgT2JqQ0l2YXJEZWNsICpJdmFyTGlzdCA9IG51bGxwdHI7CisKKyAgICAvLy8gXGJyaWVmIEluZGljYXRlcyB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGlzIE9iamVjdGl2ZS1DIGNsYXNzIHdpbGwgYmUKKyAgICAvLy8gY29tcGxldGVkIGJ5IHRoZSBleHRlcm5hbCBBU1Qgc291cmNlIHdoZW4gcmVxdWlyZWQuCisgICAgbXV0YWJsZSB1bnNpZ25lZCBFeHRlcm5hbGx5Q29tcGxldGVkIDogMTsKKworICAgIC8vLyBcYnJpZWYgSW5kaWNhdGVzIHRoYXQgdGhlIGl2YXIgY2FjaGUgZG9lcyBub3QgeWV0IGluY2x1ZGUgaXZhcnMKKyAgICAvLy8gZGVjbGFyZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uLgorICAgIG11dGFibGUgdW5zaWduZWQgSXZhckxpc3RNaXNzaW5nSW1wbGVtZW50YXRpb24gOiAxOworCisgICAgLy8vIEluZGljYXRlcyB0aGF0IHRoaXMgaW50ZXJmYWNlIGRlY2wgY29udGFpbnMgYXQgbGVhc3Qgb25lIGluaXRpYWxpemVyCisgICAgLy8vIG1hcmtlZCB3aXRoIHRoZSAnb2JqY19kZXNpZ25hdGVkX2luaXRpYWxpemVyJyBhdHRyaWJ1dGUuCisgICAgdW5zaWduZWQgSGFzRGVzaWduYXRlZEluaXRpYWxpemVycyA6IDE7CisKKyAgICBlbnVtIEluaGVyaXRlZERlc2lnbmF0ZWRJbml0aWFsaXplcnNTdGF0ZSB7CisgICAgICAvLy8gV2UgZGlkbid0IGNhbGN1bGF0ZSB3aGV0aGVyIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVycyBzaG91bGQgYmUKKyAgICAgIC8vLyBpbmhlcml0ZWQgb3Igbm90LgorICAgICAgSURJX1Vua25vd24gPSAwLAorCisgICAgICAvLy8gRGVzaWduYXRlZCBpbml0aWFsaXplcnMgYXJlIGluaGVyaXRlZCBmb3IgdGhlIHN1cGVyIGNsYXNzLgorICAgICAgSURJX0luaGVyaXRlZCA9IDEsCisKKyAgICAgIC8vLyBUaGUgY2xhc3MgZG9lcyBub3QgaW5oZXJpdCBkZXNpZ25hdGVkIGluaXRpYWxpemVycy4KKyAgICAgIElESV9Ob3RJbmhlcml0ZWQgPSAyCisgICAgfTsKKworICAgIC8vLyBPbmUgb2YgdGhlIFxjIEluaGVyaXRlZERlc2lnbmF0ZWRJbml0aWFsaXplcnNTdGF0ZSBlbnVtZXJhdG9zLgorICAgIG11dGFibGUgdW5zaWduZWQgSW5oZXJpdGVkRGVzaWduYXRlZEluaXRpYWxpemVycyA6IDI7CisgICAgCisgICAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgbG9jYXRpb24gaW4gdGhpcyBkZWNsYXJhdGlvbiwgYmVmb3JlCisgICAgLy8vIHRoZSBwcm9wZXJ0aWVzL21ldGhvZHMuIEZvciBleGFtcGxlLCB0aGlzIHdpbGwgYmUgdGhlICc+JywgJ30nLCBvciAKKyAgICAvLy8gaWRlbnRpZmllciwgCisgICAgU291cmNlTG9jYXRpb24gRW5kTG9jOyAKKworICAgIERlZmluaXRpb25EYXRhKCkKKyAgICAgICAgOiBFeHRlcm5hbGx5Q29tcGxldGVkKGZhbHNlKSwgSXZhckxpc3RNaXNzaW5nSW1wbGVtZW50YXRpb24odHJ1ZSksCisgICAgICAgICAgSGFzRGVzaWduYXRlZEluaXRpYWxpemVycyhmYWxzZSksCisgICAgICAgICAgSW5oZXJpdGVkRGVzaWduYXRlZEluaXRpYWxpemVycyhJRElfVW5rbm93bikge30KKyAgfTsKKworICAvLy8gVGhlIHR5cGUgcGFyYW1ldGVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzcywgaWYgYW55LgorICBPYmpDVHlwZVBhcmFtTGlzdCAqVHlwZVBhcmFtTGlzdCA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBDb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MsCisgIC8vLyB3aGljaCB3aWxsIGJlIE5VTEwgaWYgdGhpcyBjbGFzcyBoYXMgbm90IHlldCBiZWVuIGRlZmluZWQuCisgIC8vLworICAvLy8gVGhlIGJpdCBpbmRpY2F0ZXMgd2hlbiB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBvdXQtb2YtZGF0ZQorICAvLy8gZGVjbGFyYXRpb25zLiBJdCB3aWxsIGJlIHNldCB1bmxlc3MgbW9kdWxlcyBhcmUgZW5hYmxlZC4KKyAgbGx2bTo6UG9pbnRlckludFBhaXI8RGVmaW5pdGlvbkRhdGEgKiwgMSwgYm9vbD4gRGF0YTsKKworICBPYmpDSW50ZXJmYWNlRGVjbChjb25zdCBBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIEF0TG9jLAorICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsIE9iakNUeXBlUGFyYW1MaXN0ICp0eXBlUGFyYW1MaXN0LAorICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDTG9jLCBPYmpDSW50ZXJmYWNlRGVjbCAqUHJldkRlY2wsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbnRlcm5hbCk7CisKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworICB2b2lkIExvYWRFeHRlcm5hbERlZmluaXRpb24oKSBjb25zdDsKKworICBEZWZpbml0aW9uRGF0YSAmZGF0YSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoRGF0YS5nZXRQb2ludGVyKCkgJiYgIkRlY2xhcmF0aW9uIGhhcyBubyBkZWZpbml0aW9uISIpOworICAgIHJldHVybiAqRGF0YS5nZXRQb2ludGVyKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEFsbG9jYXRlIHRoZSBkZWZpbml0aW9uIGRhdGEgZm9yIHRoaXMgY2xhc3MuCisgIHZvaWQgYWxsb2NhdGVEZWZpbml0aW9uRGF0YSgpOworICAKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2UgPSBSZWRlY2xhcmFibGU8T2JqQ0ludGVyZmFjZURlY2w+OworCisgIE9iakNJbnRlcmZhY2VEZWNsICpnZXROZXh0UmVkZWNsYXJhdGlvbkltcGwoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIGdldE5leHRSZWRlY2xhcmF0aW9uKCk7CisgIH0KKworICBPYmpDSW50ZXJmYWNlRGVjbCAqZ2V0UHJldmlvdXNEZWNsSW1wbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0UHJldmlvdXNEZWNsKCk7CisgIH0KKworICBPYmpDSW50ZXJmYWNlRGVjbCAqZ2V0TW9zdFJlY2VudERlY2xJbXBsKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRNb3N0UmVjZW50RGVjbCgpOworICB9CisKK3B1YmxpYzoKKyAgc3RhdGljIE9iakNJbnRlcmZhY2VEZWNsICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBhdExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDVHlwZVBhcmFtTGlzdCAqdHlwZVBhcmFtTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ludGVyZmFjZURlY2wgKlByZXZEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDbGFzc0xvYyA9IFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbnRlcm5hbCA9IGZhbHNlKTsKKworICBzdGF0aWMgT2JqQ0ludGVyZmFjZURlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisKKyAgLy8vIFJldHJpZXZlIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhpcyBjbGFzcy4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGxvb2tzIGZvciBhIHR5cGUgcGFyYW1ldGVyIGxpc3QgZm9yIHRoZSBnaXZlbgorICAvLy8gY2xhc3M7IGlmIHRoZSBjbGFzcyBoYXMgYmVlbiBkZWNsYXJlZCAod2l0aCBcYyBcQGNsYXNzKSBidXQgbm90CisgIC8vLyBkZWZpbmVkICh3aXRoIFxjIFxAaW50ZXJmYWNlKSwgaXQgd2lsbCBzZWFyY2ggZm9yIGEgZGVjbGFyYXRpb24gdGhhdAorICAvLy8gaGFzIHR5cGUgcGFyYW1ldGVycywgc2tpcHBpbmcgYW55IGRlY2xhcmF0aW9ucyB0aGF0IGRvIG5vdC4KKyAgT2JqQ1R5cGVQYXJhbUxpc3QgKmdldFR5cGVQYXJhbUxpc3QoKSBjb25zdDsKKworICAvLy8gU2V0IHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhpcyBjbGFzcy4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIEFTVCBpbXBvcnRlciwgd2hpY2ggbXVzdCBpbXBvcnQgdGhlIHR5cGUKKyAgLy8vIHBhcmFtZXRlcnMgYWZ0ZXIgY3JlYXRpbmcgdGhlaXIgRGVjbENvbnRleHQgdG8gYXZvaWQgbG9vcHMuCisgIHZvaWQgc2V0VHlwZVBhcmFtTGlzdChPYmpDVHlwZVBhcmFtTGlzdCAqVFBMKTsKKworICAvLy8gUmV0cmlldmUgdGhlIHR5cGUgcGFyYW1ldGVycyB3cml0dGVuIG9uIHRoaXMgcGFydGljdWxhciBkZWNsYXJhdGlvbiBvZgorICAvLy8gdGhlIGNsYXNzLgorICBPYmpDVHlwZVBhcmFtTGlzdCAqZ2V0VHlwZVBhcmFtTGlzdEFzV3JpdHRlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gVHlwZVBhcmFtTGlzdDsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWSB7CisgICAgaWYgKGlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSkKKyAgICAgIHJldHVybiBPYmpDQ29udGFpbmVyRGVjbDo6Z2V0U291cmNlUmFuZ2UoKTsKKyAgICAKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0QXRTdGFydExvYygpLCBnZXRMb2NhdGlvbigpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSW5kaWNhdGUgdGhhdCB0aGlzIE9iamVjdGl2ZS1DIGNsYXNzIGlzIGNvbXBsZXRlLCBidXQgdGhhdAorICAvLy8gdGhlIGV4dGVybmFsIEFTVCBzb3VyY2Ugd2lsbCBiZSByZXNwb25zaWJsZSBmb3IgZmlsbGluZyBpbiBpdHMgY29udGVudHMKKyAgLy8vIHdoZW4gYSBjb21wbGV0ZSBjbGFzcyBpcyByZXF1aXJlZC4KKyAgdm9pZCBzZXRFeHRlcm5hbGx5Q29tcGxldGVkKCk7CisKKyAgLy8vIEluZGljYXRlIHRoYXQgdGhpcyBpbnRlcmZhY2UgZGVjbCBjb250YWlucyBhdCBsZWFzdCBvbmUgaW5pdGlhbGl6ZXIKKyAgLy8vIG1hcmtlZCB3aXRoIHRoZSAnb2JqY19kZXNpZ25hdGVkX2luaXRpYWxpemVyJyBhdHRyaWJ1dGUuCisgIHZvaWQgc2V0SGFzRGVzaWduYXRlZEluaXRpYWxpemVycygpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnRlcmZhY2UgZGVjbCBjb250YWlucyBhdCBsZWFzdCBvbmUgaW5pdGlhbGl6ZXIKKyAgLy8vIG1hcmtlZCB3aXRoIHRoZSAnb2JqY19kZXNpZ25hdGVkX2luaXRpYWxpemVyJyBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzRGVzaWduYXRlZEluaXRpYWxpemVycygpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnRlcmZhY2UgZGVjbCBkZWNsYXJlcyBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIKKyAgLy8vIG9yIGl0IGluaGVyaXRlcyBvbmUgZnJvbSBpdHMgc3VwZXIgY2xhc3MuCisgIGJvb2wgZGVjbGFyZXNPckluaGVyaXRzRGVzaWduYXRlZEluaXRpYWxpemVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzRGVzaWduYXRlZEluaXRpYWxpemVycygpIHx8IGluaGVyaXRzRGVzaWduYXRlZEluaXRpYWxpemVycygpOworICB9CisKKyAgY29uc3QgT2JqQ1Byb3RvY29sTGlzdCAmZ2V0UmVmZXJlbmNlZFByb3RvY29scygpIGNvbnN0IHsKKyAgICBhc3NlcnQoaGFzRGVmaW5pdGlvbigpICYmICJDYWxsZXIgZGlkIG5vdCBjaGVjayBmb3IgZm9yd2FyZCByZWZlcmVuY2UhIik7CisgICAgaWYgKGRhdGEoKS5FeHRlcm5hbGx5Q29tcGxldGVkKQorICAgICAgTG9hZEV4dGVybmFsRGVmaW5pdGlvbigpOworCisgICAgcmV0dXJuIGRhdGEoKS5SZWZlcmVuY2VkUHJvdG9jb2xzOworICB9CisKKyAgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqZ2V0SW1wbGVtZW50YXRpb24oKSBjb25zdDsKKyAgdm9pZCBzZXRJbXBsZW1lbnRhdGlvbihPYmpDSW1wbGVtZW50YXRpb25EZWNsICpJbXBsRCk7CisKKyAgT2JqQ0NhdGVnb3J5RGVjbCAqRmluZENhdGVnb3J5RGVjbGFyYXRpb24oSWRlbnRpZmllckluZm8gKkNhdGVnb3J5SWQpIGNvbnN0OworCisgIC8vIEdldCB0aGUgbG9jYWwgaW5zdGFuY2UvY2xhc3MgbWV0aG9kIGRlY2xhcmVkIGluIGEgY2F0ZWdvcnkuCisgIE9iakNNZXRob2REZWNsICpnZXRDYXRlZ29yeUluc3RhbmNlTWV0aG9kKFNlbGVjdG9yIFNlbCkgY29uc3Q7CisgIE9iakNNZXRob2REZWNsICpnZXRDYXRlZ29yeUNsYXNzTWV0aG9kKFNlbGVjdG9yIFNlbCkgY29uc3Q7CisKKyAgT2JqQ01ldGhvZERlY2wgKmdldENhdGVnb3J5TWV0aG9kKFNlbGVjdG9yIFNlbCwgYm9vbCBpc0luc3RhbmNlKSBjb25zdCB7CisgICAgcmV0dXJuIGlzSW5zdGFuY2UgPyBnZXRDYXRlZ29yeUluc3RhbmNlTWV0aG9kKFNlbCkKKyAgICAgICAgICAgICAgICAgICAgICA6IGdldENhdGVnb3J5Q2xhc3NNZXRob2QoU2VsKTsKKyAgfQorCisgIHVzaW5nIHByb3RvY29sX2l0ZXJhdG9yID0gT2JqQ1Byb3RvY29sTGlzdDo6aXRlcmF0b3I7CisgIHVzaW5nIHByb3RvY29sX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8cHJvdG9jb2xfaXRlcmF0b3I+OworCisgIHByb3RvY29sX3JhbmdlIHByb3RvY29scygpIGNvbnN0IHsKKyAgICByZXR1cm4gcHJvdG9jb2xfcmFuZ2UocHJvdG9jb2xfYmVnaW4oKSwgcHJvdG9jb2xfZW5kKCkpOworICB9CisKKyAgcHJvdG9jb2xfaXRlcmF0b3IgcHJvdG9jb2xfYmVnaW4oKSBjb25zdCB7CisgICAgLy8gRklYTUU6IFNob3VsZCBtYWtlIHN1cmUgbm8gY2FsbGVycyBldmVyIGRvIHRoaXMuCisgICAgaWYgKCFoYXNEZWZpbml0aW9uKCkpCisgICAgICByZXR1cm4gcHJvdG9jb2xfaXRlcmF0b3IoKTsKKyAgICAKKyAgICBpZiAoZGF0YSgpLkV4dGVybmFsbHlDb21wbGV0ZWQpCisgICAgICBMb2FkRXh0ZXJuYWxEZWZpbml0aW9uKCk7CisKKyAgICByZXR1cm4gZGF0YSgpLlJlZmVyZW5jZWRQcm90b2NvbHMuYmVnaW4oKTsKKyAgfQorCisgIHByb3RvY29sX2l0ZXJhdG9yIHByb3RvY29sX2VuZCgpIGNvbnN0IHsKKyAgICAvLyBGSVhNRTogU2hvdWxkIG1ha2Ugc3VyZSBubyBjYWxsZXJzIGV2ZXIgZG8gdGhpcy4KKyAgICBpZiAoIWhhc0RlZmluaXRpb24oKSkKKyAgICAgIHJldHVybiBwcm90b2NvbF9pdGVyYXRvcigpOworCisgICAgaWYgKGRhdGEoKS5FeHRlcm5hbGx5Q29tcGxldGVkKQorICAgICAgTG9hZEV4dGVybmFsRGVmaW5pdGlvbigpOworCisgICAgcmV0dXJuIGRhdGEoKS5SZWZlcmVuY2VkUHJvdG9jb2xzLmVuZCgpOworICB9CisKKyAgdXNpbmcgcHJvdG9jb2xfbG9jX2l0ZXJhdG9yID0gT2JqQ1Byb3RvY29sTGlzdDo6bG9jX2l0ZXJhdG9yOworICB1c2luZyBwcm90b2NvbF9sb2NfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxwcm90b2NvbF9sb2NfaXRlcmF0b3I+OworCisgIHByb3RvY29sX2xvY19yYW5nZSBwcm90b2NvbF9sb2NzKCkgY29uc3QgeworICAgIHJldHVybiBwcm90b2NvbF9sb2NfcmFuZ2UocHJvdG9jb2xfbG9jX2JlZ2luKCksIHByb3RvY29sX2xvY19lbmQoKSk7CisgIH0KKworICBwcm90b2NvbF9sb2NfaXRlcmF0b3IgcHJvdG9jb2xfbG9jX2JlZ2luKCkgY29uc3QgeworICAgIC8vIEZJWE1FOiBTaG91bGQgbWFrZSBzdXJlIG5vIGNhbGxlcnMgZXZlciBkbyB0aGlzLgorICAgIGlmICghaGFzRGVmaW5pdGlvbigpKQorICAgICAgcmV0dXJuIHByb3RvY29sX2xvY19pdGVyYXRvcigpOworCisgICAgaWYgKGRhdGEoKS5FeHRlcm5hbGx5Q29tcGxldGVkKQorICAgICAgTG9hZEV4dGVybmFsRGVmaW5pdGlvbigpOworCisgICAgcmV0dXJuIGRhdGEoKS5SZWZlcmVuY2VkUHJvdG9jb2xzLmxvY19iZWdpbigpOworICB9CisKKyAgcHJvdG9jb2xfbG9jX2l0ZXJhdG9yIHByb3RvY29sX2xvY19lbmQoKSBjb25zdCB7CisgICAgLy8gRklYTUU6IFNob3VsZCBtYWtlIHN1cmUgbm8gY2FsbGVycyBldmVyIGRvIHRoaXMuCisgICAgaWYgKCFoYXNEZWZpbml0aW9uKCkpCisgICAgICByZXR1cm4gcHJvdG9jb2xfbG9jX2l0ZXJhdG9yKCk7CisKKyAgICBpZiAoZGF0YSgpLkV4dGVybmFsbHlDb21wbGV0ZWQpCisgICAgICBMb2FkRXh0ZXJuYWxEZWZpbml0aW9uKCk7CisKKyAgICByZXR1cm4gZGF0YSgpLlJlZmVyZW5jZWRQcm90b2NvbHMubG9jX2VuZCgpOworICB9CisKKyAgdXNpbmcgYWxsX3Byb3RvY29sX2l0ZXJhdG9yID0gT2JqQ0xpc3Q8T2JqQ1Byb3RvY29sRGVjbD46Oml0ZXJhdG9yOworICB1c2luZyBhbGxfcHJvdG9jb2xfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxhbGxfcHJvdG9jb2xfaXRlcmF0b3I+OworCisgIGFsbF9wcm90b2NvbF9yYW5nZSBhbGxfcmVmZXJlbmNlZF9wcm90b2NvbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGFsbF9wcm90b2NvbF9yYW5nZShhbGxfcmVmZXJlbmNlZF9wcm90b2NvbF9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX3JlZmVyZW5jZWRfcHJvdG9jb2xfZW5kKCkpOworICB9CisKKyAgYWxsX3Byb3RvY29sX2l0ZXJhdG9yIGFsbF9yZWZlcmVuY2VkX3Byb3RvY29sX2JlZ2luKCkgY29uc3QgeworICAgIC8vIEZJWE1FOiBTaG91bGQgbWFrZSBzdXJlIG5vIGNhbGxlcnMgZXZlciBkbyB0aGlzLgorICAgIGlmICghaGFzRGVmaW5pdGlvbigpKQorICAgICAgcmV0dXJuIGFsbF9wcm90b2NvbF9pdGVyYXRvcigpOworCisgICAgaWYgKGRhdGEoKS5FeHRlcm5hbGx5Q29tcGxldGVkKQorICAgICAgTG9hZEV4dGVybmFsRGVmaW5pdGlvbigpOworCisgICAgcmV0dXJuIGRhdGEoKS5BbGxSZWZlcmVuY2VkUHJvdG9jb2xzLmVtcHR5KCkgIAorICAgICAgICAgICAgID8gcHJvdG9jb2xfYmVnaW4oKQorICAgICAgICAgICAgIDogZGF0YSgpLkFsbFJlZmVyZW5jZWRQcm90b2NvbHMuYmVnaW4oKTsKKyAgfQorCisgIGFsbF9wcm90b2NvbF9pdGVyYXRvciBhbGxfcmVmZXJlbmNlZF9wcm90b2NvbF9lbmQoKSBjb25zdCB7CisgICAgLy8gRklYTUU6IFNob3VsZCBtYWtlIHN1cmUgbm8gY2FsbGVycyBldmVyIGRvIHRoaXMuCisgICAgaWYgKCFoYXNEZWZpbml0aW9uKCkpCisgICAgICByZXR1cm4gYWxsX3Byb3RvY29sX2l0ZXJhdG9yKCk7CisgICAgCisgICAgaWYgKGRhdGEoKS5FeHRlcm5hbGx5Q29tcGxldGVkKQorICAgICAgTG9hZEV4dGVybmFsRGVmaW5pdGlvbigpOworCisgICAgcmV0dXJuIGRhdGEoKS5BbGxSZWZlcmVuY2VkUHJvdG9jb2xzLmVtcHR5KCkgCisgICAgICAgICAgICAgPyBwcm90b2NvbF9lbmQoKQorICAgICAgICAgICAgIDogZGF0YSgpLkFsbFJlZmVyZW5jZWRQcm90b2NvbHMuZW5kKCk7CisgIH0KKworICB1c2luZyBpdmFyX2l0ZXJhdG9yID0gc3BlY2lmaWNfZGVjbF9pdGVyYXRvcjxPYmpDSXZhckRlY2w+OworICB1c2luZyBpdmFyX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c3BlY2lmaWNfZGVjbF9pdGVyYXRvcjxPYmpDSXZhckRlY2w+PjsKKworICBpdmFyX3JhbmdlIGl2YXJzKCkgY29uc3QgeyByZXR1cm4gaXZhcl9yYW5nZShpdmFyX2JlZ2luKCksIGl2YXJfZW5kKCkpOyB9CisKKyAgaXZhcl9pdGVyYXRvciBpdmFyX2JlZ2luKCkgY29uc3QgeyAKKyAgICBpZiAoY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKkRlZiA9IGdldERlZmluaXRpb24oKSkKKyAgICAgIHJldHVybiBpdmFyX2l0ZXJhdG9yKERlZi0+ZGVjbHNfYmVnaW4oKSk7IAorICAgIAorICAgIC8vIEZJWE1FOiBTaG91bGQgbWFrZSBzdXJlIG5vIGNhbGxlcnMgZXZlciBkbyB0aGlzLgorICAgIHJldHVybiBpdmFyX2l0ZXJhdG9yKCk7CisgIH0KKworICBpdmFyX2l0ZXJhdG9yIGl2YXJfZW5kKCkgY29uc3QgeyAKKyAgICBpZiAoY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKkRlZiA9IGdldERlZmluaXRpb24oKSkKKyAgICAgIHJldHVybiBpdmFyX2l0ZXJhdG9yKERlZi0+ZGVjbHNfZW5kKCkpOyAKKworICAgIC8vIEZJWE1FOiBTaG91bGQgbWFrZSBzdXJlIG5vIGNhbGxlcnMgZXZlciBkbyB0aGlzLgorICAgIHJldHVybiBpdmFyX2l0ZXJhdG9yKCk7CisgIH0KKworICB1bnNpZ25lZCBpdmFyX3NpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6ZGlzdGFuY2UoaXZhcl9iZWdpbigpLCBpdmFyX2VuZCgpKTsKKyAgfQorCisgIGJvb2wgaXZhcl9lbXB0eSgpIGNvbnN0IHsgcmV0dXJuIGl2YXJfYmVnaW4oKSA9PSBpdmFyX2VuZCgpOyB9CisKKyAgT2JqQ0l2YXJEZWNsICphbGxfZGVjbGFyZWRfaXZhcl9iZWdpbigpOworICBjb25zdCBPYmpDSXZhckRlY2wgKmFsbF9kZWNsYXJlZF9pdmFyX2JlZ2luKCkgY29uc3QgeworICAgIC8vIEV2ZW4gdGhvdWdoIHRoaXMgbW9kaWZpZXMgSXZhckxpc3QsIGl0J3MgY29uY2VwdHVhbGx5IGNvbnN0OgorICAgIC8vIHRoZSBpdmFyIGNoYWluIGlzIGVzc2VudGlhbGx5IGEgY2FjaGVkIHByb3BlcnR5IG9mIE9iakNJbnRlcmZhY2VEZWNsLgorICAgIHJldHVybiBjb25zdF9jYXN0PE9iakNJbnRlcmZhY2VEZWNsICo+KHRoaXMpLT5hbGxfZGVjbGFyZWRfaXZhcl9iZWdpbigpOworICB9CisgIHZvaWQgc2V0SXZhckxpc3QoT2JqQ0l2YXJEZWNsICppdmFyKSB7IGRhdGEoKS5JdmFyTGlzdCA9IGl2YXI7IH0KKworICAvLy8gc2V0UHJvdG9jb2xMaXN0IC0gU2V0IHRoZSBsaXN0IG9mIHByb3RvY29scyB0aGF0IHRoaXMgaW50ZXJmYWNlCisgIC8vLyBpbXBsZW1lbnRzLgorICB2b2lkIHNldFByb3RvY29sTGlzdChPYmpDUHJvdG9jb2xEZWNsICpjb25zdCogTGlzdCwgdW5zaWduZWQgTnVtLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VMb2NhdGlvbiAqTG9jcywgQVNUQ29udGV4dCAmQykgeworICAgIGRhdGEoKS5SZWZlcmVuY2VkUHJvdG9jb2xzLnNldChMaXN0LCBOdW0sIExvY3MsIEMpOworICB9CisKKyAgLy8vIG1lcmdlQ2xhc3NFeHRlbnNpb25Qcm90b2NvbExpc3QgLSBNZXJnZSBjbGFzcyBleHRlbnNpb24ncyBwcm90b2NvbCBsaXN0CisgIC8vLyBpbnRvIHRoZSBwcm90b2NvbCBsaXN0IGZvciB0aGlzIGNsYXNzLgorICB2b2lkIG1lcmdlQ2xhc3NFeHRlbnNpb25Qcm90b2NvbExpc3QoT2JqQ1Byb3RvY29sRGVjbCAqY29uc3QqIExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RDb250ZXh0ICZDKTsKKworICAvLy8gUHJvZHVjZSBhIG5hbWUgdG8gYmUgdXNlZCBmb3IgY2xhc3MncyBtZXRhZGF0YS4gSXQgY29tZXMgZWl0aGVyIHZpYQorICAvLy8gb2JqY19ydW50aW1lX25hbWUgYXR0cmlidXRlIG9yIGNsYXNzIG5hbWUuCisgIFN0cmluZ1JlZiBnZXRPYmpDUnVudGltZU5hbWVBc1N0cmluZygpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVycyBmb3IgdGhlIGludGVyZmFjZS4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIGRlY2xhcmF0aW9uIGRvZXMgbm90IGhhdmUgbWV0aG9kcyBtYXJrZWQgYXMgZGVzaWduYXRlZAorICAvLy8gaW5pdGlhbGl6ZXJzIHRoZW4gdGhlIGludGVyZmFjZSBpbmhlcml0cyB0aGUgZGVzaWduYXRlZCBpbml0aWFsaXplcnMgb2YKKyAgLy8vIGl0cyBzdXBlciBjbGFzcy4KKyAgdm9pZCBnZXREZXNpZ25hdGVkSW5pdGlhbGl6ZXJzKAorICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxWZWN0b3JJbXBsPGNvbnN0IE9iakNNZXRob2REZWNsICo+ICZNZXRob2RzKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzZWxlY3RvciBpcyBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgZm9yIHRoZQorICAvLy8gaW50ZXJmYWNlLgorICAvLy8KKyAgLy8vIElmIHRoaXMgZGVjbGFyYXRpb24gZG9lcyBub3QgaGF2ZSBtZXRob2RzIG1hcmtlZCBhcyBkZXNpZ25hdGVkCisgIC8vLyBpbml0aWFsaXplcnMgdGhlbiB0aGUgaW50ZXJmYWNlIGluaGVyaXRzIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVycyBvZgorICAvLy8gaXRzIHN1cGVyIGNsYXNzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJbml0TWV0aG9kIGlmIG5vbi1udWxsIGFuZCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCBpdCByZWNlaXZlcworICAvLy8gdGhlIG1ldGhvZCB0aGF0IHdhcyBtYXJrZWQgYXMgYSBkZXNpZ25hdGVkIGluaXRpYWxpemVyLgorICBib29sCisgIGlzRGVzaWduYXRlZEluaXRpYWxpemVyKFNlbGVjdG9yIFNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ01ldGhvZERlY2wgKipJbml0TWV0aG9kID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHBhcnRpY3VsYXIgZGVjbGFyYXRpb24gb2YgdGhpcyBjbGFzcyBpcworICAvLy8gYWN0dWFsbHkgYWxzbyBhIGRlZmluaXRpb24uCisgIGJvb2wgaXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpIGNvbnN0IHsgCisgICAgcmV0dXJuIGdldERlZmluaXRpb24oKSA9PSB0aGlzOworICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2xhc3MgaGFzIGJlZW4gZGVmaW5lZC4KKyAgYm9vbCBoYXNEZWZpbml0aW9uKCkgY29uc3QgeworICAgIC8vIElmIHRoZSBuYW1lIG9mIHRoaXMgY2xhc3MgaXMgb3V0LW9mLWRhdGUsIGJyaW5nIGl0IHVwLXRvLWRhdGUsIHdoaWNoCisgICAgLy8gbWlnaHQgYnJpbmcgaW4gYSBkZWZpbml0aW9uLgorICAgIC8vIE5vdGU6IGEgbnVsbCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB3ZSBkb24ndCBoYXZlIGEgZGVmaW5pdGlvbiBhbmQgdGhhdAorICAgIC8vIG1vZHVsZXMgYXJlIGVuYWJsZWQuCisgICAgaWYgKCFEYXRhLmdldE9wYXF1ZVZhbHVlKCkpCisgICAgICBnZXRNb3N0UmVjZW50RGVjbCgpOworCisgICAgcmV0dXJuIERhdGEuZ2V0UG9pbnRlcigpOworICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIGNsYXNzLCBvciBOVUxMIGlmIHRoaXMgY2xhc3MgCisgIC8vLyBoYXMgYmVlbiBmb3J3YXJkLWRlY2xhcmVkICh3aXRoIFxAY2xhc3MpIGJ1dCBub3QgeWV0IGRlZmluZWQgKHdpdGggCisgIC8vLyBcQGludGVyZmFjZSkuCisgIE9iakNJbnRlcmZhY2VEZWNsICpnZXREZWZpbml0aW9uKCkgeworICAgIHJldHVybiBoYXNEZWZpbml0aW9uKCk/IERhdGEuZ2V0UG9pbnRlcigpLT5EZWZpbml0aW9uIDogbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBjbGFzcywgb3IgTlVMTCBpZiB0aGlzIGNsYXNzIAorICAvLy8gaGFzIGJlZW4gZm9yd2FyZC1kZWNsYXJlZCAod2l0aCBcQGNsYXNzKSBidXQgbm90IHlldCBkZWZpbmVkICh3aXRoIAorICAvLy8gXEBpbnRlcmZhY2UpLgorICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqZ2V0RGVmaW5pdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzRGVmaW5pdGlvbigpPyBEYXRhLmdldFBvaW50ZXIoKS0+RGVmaW5pdGlvbiA6IG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIFN0YXJ0cyB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIE9iamVjdGl2ZS1DIGNsYXNzLCB0YWtpbmcgaXQgZnJvbQorICAvLy8gYSBmb3J3YXJkIGRlY2xhcmF0aW9uIChcQGNsYXNzKSB0byBhIGRlZmluaXRpb24gKFxAaW50ZXJmYWNlKS4KKyAgdm9pZCBzdGFydERlZmluaXRpb24oKTsKKyAgCisgIC8vLyBSZXRyaWV2ZSB0aGUgc3VwZXJjbGFzcyB0eXBlLgorICBjb25zdCBPYmpDT2JqZWN0VHlwZSAqZ2V0U3VwZXJDbGFzc1R5cGUoKSBjb25zdCB7CisgICAgaWYgKFR5cGVTb3VyY2VJbmZvICpUSW5mbyA9IGdldFN1cGVyQ2xhc3NUSW5mbygpKQorICAgICAgcmV0dXJuIFRJbmZvLT5nZXRUeXBlKCktPmNhc3RBczxPYmpDT2JqZWN0VHlwZT4oKTsKKworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8gUmV0cmlldmUgdGhlIHR5cGUgc291cmNlIGluZm9ybWF0aW9uIGZvciB0aGUgc3VwZXJjbGFzcy4KKyAgVHlwZVNvdXJjZUluZm8gKmdldFN1cGVyQ2xhc3NUSW5mbygpIGNvbnN0IHsKKyAgICAvLyBGSVhNRTogU2hvdWxkIG1ha2Ugc3VyZSBubyBjYWxsZXJzIGV2ZXIgZG8gdGhpcy4KKyAgICBpZiAoIWhhc0RlZmluaXRpb24oKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIAorICAgIGlmIChkYXRhKCkuRXh0ZXJuYWxseUNvbXBsZXRlZCkKKyAgICAgIExvYWRFeHRlcm5hbERlZmluaXRpb24oKTsKKworICAgIHJldHVybiBkYXRhKCkuU3VwZXJDbGFzc1RJbmZvOworICB9CisKKyAgLy8gUmV0cmlldmUgdGhlIGRlY2xhcmF0aW9uIGZvciB0aGUgc3VwZXJjbGFzcyBvZiB0aGlzIGNsYXNzLCB3aGljaAorICAvLyBkb2VzIG5vdCBpbmNsdWRlIGFueSB0eXBlIGFyZ3VtZW50cyB0aGF0IGFwcGx5IHRvIHRoZSBzdXBlcmNsYXNzLgorICBPYmpDSW50ZXJmYWNlRGVjbCAqZ2V0U3VwZXJDbGFzcygpIGNvbnN0OworCisgIHZvaWQgc2V0U3VwZXJDbGFzcyhUeXBlU291cmNlSW5mbyAqc3VwZXJDbGFzcykgeyAKKyAgICBkYXRhKCkuU3VwZXJDbGFzc1RJbmZvID0gc3VwZXJDbGFzczsKKyAgfQorCisgIC8vLyBcYnJpZWYgSXRlcmF0b3IgdGhhdCB3YWxrcyBvdmVyIHRoZSBsaXN0IG9mIGNhdGVnb3JpZXMsIGZpbHRlcmluZyBvdXQKKyAgLy8vIHRob3NlIHRoYXQgZG8gbm90IG1lZXQgc3BlY2lmaWMgY3JpdGVyaWEuCisgIC8vLworICAvLy8gVGhpcyBjbGFzcyB0ZW1wbGF0ZSBpcyB1c2VkIGZvciB0aGUgdmFyaW91cyBwZXJtdXRhdGlvbnMgb2YgY2F0ZWdvcnkKKyAgLy8vIGFuZCBleHRlbnNpb24gaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTxib29sICgqRmlsdGVyKShPYmpDQ2F0ZWdvcnlEZWNsICopPgorICBjbGFzcyBmaWx0ZXJlZF9jYXRlZ29yeV9pdGVyYXRvciB7CisgICAgT2JqQ0NhdGVnb3J5RGVjbCAqQ3VycmVudCA9IG51bGxwdHI7CisKKyAgICB2b2lkIGZpbmRBY2NlcHRhYmxlQ2F0ZWdvcnkoKTsKKyAgICAKKyAgcHVibGljOgorICAgIHVzaW5nIHZhbHVlX3R5cGUgPSBPYmpDQ2F0ZWdvcnlEZWNsICo7CisgICAgdXNpbmcgcmVmZXJlbmNlID0gdmFsdWVfdHlwZTsKKyAgICB1c2luZyBwb2ludGVyID0gdmFsdWVfdHlwZTsKKyAgICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBzdGQ6OnB0cmRpZmZfdDsKKyAgICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnOworCisgICAgZmlsdGVyZWRfY2F0ZWdvcnlfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgICAgZXhwbGljaXQgZmlsdGVyZWRfY2F0ZWdvcnlfaXRlcmF0b3IoT2JqQ0NhdGVnb3J5RGVjbCAqQ3VycmVudCkKKyAgICAgICAgOiBDdXJyZW50KEN1cnJlbnQpIHsKKyAgICAgIGZpbmRBY2NlcHRhYmxlQ2F0ZWdvcnkoKTsKKyAgICB9CisKKyAgICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQ3VycmVudDsgfQorICAgIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIEN1cnJlbnQ7IH0KKworICAgIGZpbHRlcmVkX2NhdGVnb3J5X2l0ZXJhdG9yICZvcGVyYXRvcisrKCk7CisKKyAgICBmaWx0ZXJlZF9jYXRlZ29yeV9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgICAgZmlsdGVyZWRfY2F0ZWdvcnlfaXRlcmF0b3IgVG1wID0gKnRoaXM7CisgICAgICArKygqdGhpcyk7CisgICAgICByZXR1cm4gVG1wOworICAgIH0KKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oZmlsdGVyZWRfY2F0ZWdvcnlfaXRlcmF0b3IgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkX2NhdGVnb3J5X2l0ZXJhdG9yIFkpIHsKKyAgICAgIHJldHVybiBYLkN1cnJlbnQgPT0gWS5DdXJyZW50OworICAgIH0KKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oZmlsdGVyZWRfY2F0ZWdvcnlfaXRlcmF0b3IgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkX2NhdGVnb3J5X2l0ZXJhdG9yIFkpIHsKKyAgICAgIHJldHVybiBYLkN1cnJlbnQgIT0gWS5DdXJyZW50OworICAgIH0KKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBUZXN0IHdoZXRoZXIgdGhlIGdpdmVuIGNhdGVnb3J5IGlzIHZpc2libGUuCisgIC8vLworICAvLy8gVXNlZCBpbiB0aGUgXGMgdmlzaWJsZV9jYXRlZ29yaWVzX2l0ZXJhdG9yLgorICBzdGF0aWMgYm9vbCBpc1Zpc2libGVDYXRlZ29yeShPYmpDQ2F0ZWdvcnlEZWNsICpDYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgSXRlcmF0b3IgdGhhdCB3YWxrcyBvdmVyIHRoZSBsaXN0IG9mIGNhdGVnb3JpZXMgYW5kIGV4dGVuc2lvbnMKKyAgLy8vIHRoYXQgYXJlIHZpc2libGUsIGkuZS4sIG5vdCBoaWRkZW4gaW4gYSBub24taW1wb3J0ZWQgc3VibW9kdWxlLgorICB1c2luZyB2aXNpYmxlX2NhdGVnb3JpZXNfaXRlcmF0b3IgPQorICAgICAgZmlsdGVyZWRfY2F0ZWdvcnlfaXRlcmF0b3I8aXNWaXNpYmxlQ2F0ZWdvcnk+OworCisgIHVzaW5nIHZpc2libGVfY2F0ZWdvcmllc19yYW5nZSA9CisgICAgICBsbHZtOjppdGVyYXRvcl9yYW5nZTx2aXNpYmxlX2NhdGVnb3JpZXNfaXRlcmF0b3I+OworCisgIHZpc2libGVfY2F0ZWdvcmllc19yYW5nZSB2aXNpYmxlX2NhdGVnb3JpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHZpc2libGVfY2F0ZWdvcmllc19yYW5nZSh2aXNpYmxlX2NhdGVnb3JpZXNfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGVfY2F0ZWdvcmllc19lbmQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHZpc2libGUtY2F0ZWdvcmllcworICAvLy8gbGlzdC4KKyAgdmlzaWJsZV9jYXRlZ29yaWVzX2l0ZXJhdG9yIHZpc2libGVfY2F0ZWdvcmllc19iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gdmlzaWJsZV9jYXRlZ29yaWVzX2l0ZXJhdG9yKGdldENhdGVnb3J5TGlzdFJhdygpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYW4gaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgdmlzaWJsZS1jYXRlZ29yaWVzIGxpc3QuCisgIHZpc2libGVfY2F0ZWdvcmllc19pdGVyYXRvciB2aXNpYmxlX2NhdGVnb3JpZXNfZW5kKCkgY29uc3QgeworICAgIHJldHVybiB2aXNpYmxlX2NhdGVnb3JpZXNfaXRlcmF0b3IoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHZpc2libGUtY2F0ZWdvcmllcyBsaXN0IGlzIGVtcHR5LgorICBib29sIHZpc2libGVfY2F0ZWdvcmllc19lbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdmlzaWJsZV9jYXRlZ29yaWVzX2JlZ2luKCkgPT0gdmlzaWJsZV9jYXRlZ29yaWVzX2VuZCgpOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBjYXRlZ29yeS4uLiBpcyBhIGNhdGVnb3J5LgorICAvLy8KKyAgLy8vIFVzZWQgaW4gdGhlIFxjIGtub3duX2NhdGVnb3JpZXNfaXRlcmF0b3IuCisgIHN0YXRpYyBib29sIGlzS25vd25DYXRlZ29yeShPYmpDQ2F0ZWdvcnlEZWNsICopIHsgcmV0dXJuIHRydWU7IH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIEl0ZXJhdG9yIHRoYXQgd2Fsa3Mgb3ZlciBhbGwgb2YgdGhlIGtub3duIGNhdGVnb3JpZXMgYW5kCisgIC8vLyBleHRlbnNpb25zLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUgaGlkZGVuLgorICB1c2luZyBrbm93bl9jYXRlZ29yaWVzX2l0ZXJhdG9yID0gZmlsdGVyZWRfY2F0ZWdvcnlfaXRlcmF0b3I8aXNLbm93bkNhdGVnb3J5PjsKKyAgdXNpbmcga25vd25fY2F0ZWdvcmllc19yYW5nZSA9CisgICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGtub3duX2NhdGVnb3JpZXNfaXRlcmF0b3I+OworCisgIGtub3duX2NhdGVnb3JpZXNfcmFuZ2Uga25vd25fY2F0ZWdvcmllcygpIGNvbnN0IHsKKyAgICByZXR1cm4ga25vd25fY2F0ZWdvcmllc19yYW5nZShrbm93bl9jYXRlZ29yaWVzX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vd25fY2F0ZWdvcmllc19lbmQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGtub3duLWNhdGVnb3JpZXMKKyAgLy8vIGxpc3QuCisgIGtub3duX2NhdGVnb3JpZXNfaXRlcmF0b3Iga25vd25fY2F0ZWdvcmllc19iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4ga25vd25fY2F0ZWdvcmllc19pdGVyYXRvcihnZXRDYXRlZ29yeUxpc3RSYXcoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGtub3duLWNhdGVnb3JpZXMgbGlzdC4KKyAga25vd25fY2F0ZWdvcmllc19pdGVyYXRvciBrbm93bl9jYXRlZ29yaWVzX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4ga25vd25fY2F0ZWdvcmllc19pdGVyYXRvcigpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUga25vd24tY2F0ZWdvcmllcyBsaXN0IGlzIGVtcHR5LgorICBib29sIGtub3duX2NhdGVnb3JpZXNfZW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIGtub3duX2NhdGVnb3JpZXNfYmVnaW4oKSA9PSBrbm93bl9jYXRlZ29yaWVzX2VuZCgpOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBjYXRlZ29yeSBpcyBhIHZpc2libGUgZXh0ZW5zaW9uLgorICAvLy8KKyAgLy8vIFVzZWQgaW4gdGhlIFxjIHZpc2libGVfZXh0ZW5zaW9uc19pdGVyYXRvci4KKyAgc3RhdGljIGJvb2wgaXNWaXNpYmxlRXh0ZW5zaW9uKE9iakNDYXRlZ29yeURlY2wgKkNhdCk7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBJdGVyYXRvciB0aGF0IHdhbGtzIG92ZXIgYWxsIG9mIHRoZSB2aXNpYmxlIGV4dGVuc2lvbnMsIHNraXBwaW5nCisgIC8vLyBhbnkgdGhhdCBhcmUga25vd24gYnV0IGhpZGRlbi4KKyAgdXNpbmcgdmlzaWJsZV9leHRlbnNpb25zX2l0ZXJhdG9yID0KKyAgICAgIGZpbHRlcmVkX2NhdGVnb3J5X2l0ZXJhdG9yPGlzVmlzaWJsZUV4dGVuc2lvbj47CisKKyAgdXNpbmcgdmlzaWJsZV9leHRlbnNpb25zX3JhbmdlID0KKyAgICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHZpc2libGVfZXh0ZW5zaW9uc19pdGVyYXRvcj47CisKKyAgdmlzaWJsZV9leHRlbnNpb25zX3JhbmdlIHZpc2libGVfZXh0ZW5zaW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gdmlzaWJsZV9leHRlbnNpb25zX3JhbmdlKHZpc2libGVfZXh0ZW5zaW9uc19iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZV9leHRlbnNpb25zX2VuZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgdmlzaWJsZS1leHRlbnNpb25zCisgIC8vLyBsaXN0LgorICB2aXNpYmxlX2V4dGVuc2lvbnNfaXRlcmF0b3IgdmlzaWJsZV9leHRlbnNpb25zX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiB2aXNpYmxlX2V4dGVuc2lvbnNfaXRlcmF0b3IoZ2V0Q2F0ZWdvcnlMaXN0UmF3KCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBhbiBpdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSB2aXNpYmxlLWV4dGVuc2lvbnMgbGlzdC4KKyAgdmlzaWJsZV9leHRlbnNpb25zX2l0ZXJhdG9yIHZpc2libGVfZXh0ZW5zaW9uc19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIHZpc2libGVfZXh0ZW5zaW9uc19pdGVyYXRvcigpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgdmlzaWJsZS1leHRlbnNpb25zIGxpc3QgaXMgZW1wdHkuCisgIGJvb2wgdmlzaWJsZV9leHRlbnNpb25zX2VtcHR5KCkgY29uc3QgeworICAgIHJldHVybiB2aXNpYmxlX2V4dGVuc2lvbnNfYmVnaW4oKSA9PSB2aXNpYmxlX2V4dGVuc2lvbnNfZW5kKCk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBUZXN0IHdoZXRoZXIgdGhlIGdpdmVuIGNhdGVnb3J5IGlzIGFuIGV4dGVuc2lvbi4KKyAgLy8vCisgIC8vLyBVc2VkIGluIHRoZSBcYyBrbm93bl9leHRlbnNpb25zX2l0ZXJhdG9yLgorICBzdGF0aWMgYm9vbCBpc0tub3duRXh0ZW5zaW9uKE9iakNDYXRlZ29yeURlY2wgKkNhdCk7CisgIAorcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RSZWFkZXI7CisKKyAgLy8vIFxicmllZiBJdGVyYXRvciB0aGF0IHdhbGtzIG92ZXIgYWxsIG9mIHRoZSBrbm93biBleHRlbnNpb25zLgorICB1c2luZyBrbm93bl9leHRlbnNpb25zX2l0ZXJhdG9yID0KKyAgICAgIGZpbHRlcmVkX2NhdGVnb3J5X2l0ZXJhdG9yPGlzS25vd25FeHRlbnNpb24+OworICB1c2luZyBrbm93bl9leHRlbnNpb25zX3JhbmdlID0KKyAgICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGtub3duX2V4dGVuc2lvbnNfaXRlcmF0b3I+OworCisgIGtub3duX2V4dGVuc2lvbnNfcmFuZ2Uga25vd25fZXh0ZW5zaW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4ga25vd25fZXh0ZW5zaW9uc19yYW5nZShrbm93bl9leHRlbnNpb25zX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vd25fZXh0ZW5zaW9uc19lbmQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGtub3duLWV4dGVuc2lvbnMKKyAgLy8vIGxpc3QuCisgIGtub3duX2V4dGVuc2lvbnNfaXRlcmF0b3Iga25vd25fZXh0ZW5zaW9uc19iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4ga25vd25fZXh0ZW5zaW9uc19pdGVyYXRvcihnZXRDYXRlZ29yeUxpc3RSYXcoKSk7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYW4gaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUga25vd24tZXh0ZW5zaW9ucyBsaXN0LgorICBrbm93bl9leHRlbnNpb25zX2l0ZXJhdG9yIGtub3duX2V4dGVuc2lvbnNfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBrbm93bl9leHRlbnNpb25zX2l0ZXJhdG9yKCk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBrbm93bi1leHRlbnNpb25zIGxpc3QgaXMgZW1wdHkuCisgIGJvb2wga25vd25fZXh0ZW5zaW9uc19lbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4ga25vd25fZXh0ZW5zaW9uc19iZWdpbigpID09IGtub3duX2V4dGVuc2lvbnNfZW5kKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSByYXcgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGNhdGVnb3J5L2V4dGVuc2lvbgorICAvLy8gbGlzdC4KKyAgT2JqQ0NhdGVnb3J5RGVjbCogZ2V0Q2F0ZWdvcnlMaXN0UmF3KCkgY29uc3QgeworICAgIC8vIEZJWE1FOiBTaG91bGQgbWFrZSBzdXJlIG5vIGNhbGxlcnMgZXZlciBkbyB0aGlzLgorICAgIGlmICghaGFzRGVmaW5pdGlvbigpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgCisgICAgaWYgKGRhdGEoKS5FeHRlcm5hbGx5Q29tcGxldGVkKQorICAgICAgTG9hZEV4dGVybmFsRGVmaW5pdGlvbigpOworCisgICAgcmV0dXJuIGRhdGEoKS5DYXRlZ29yeUxpc3Q7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgcmF3IHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjYXRlZ29yeS9leHRlbnNpb24KKyAgLy8vIGxpc3QuCisgIHZvaWQgc2V0Q2F0ZWdvcnlMaXN0UmF3KE9iakNDYXRlZ29yeURlY2wgKmNhdGVnb3J5KSB7CisgICAgZGF0YSgpLkNhdGVnb3J5TGlzdCA9IGNhdGVnb3J5OworICB9CisKKyAgT2JqQ1Byb3BlcnR5RGVjbAorICAgICpGaW5kUHJvcGVydHlWaXNpYmxlSW5QcmltYXJ5Q2xhc3MoSWRlbnRpZmllckluZm8gKlByb3BlcnR5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDUHJvcGVydHlRdWVyeUtpbmQgUXVlcnlLaW5kKSBjb25zdDsKKworICB2b2lkIGNvbGxlY3RQcm9wZXJ0aWVzVG9JbXBsZW1lbnQoUHJvcGVydHlNYXAgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZWNsT3JkZXIgJlBPKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gaXNTdXBlckNsYXNzT2YgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGNsYXNzIGlzIHRoZSBzcGVjaWZpZWQgY2xhc3Mgb3IgaXMgYQorICAvLy8gc3VwZXIgY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCBpbnRlcmZhY2UgY2xhc3MuCisgIGJvb2wgaXNTdXBlckNsYXNzT2YoY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKkkpIGNvbnN0IHsKKyAgICAvLyBJZiBSSFMgaXMgZGVyaXZlZCBmcm9tIExIUyBpdCBpcyBPSzsgZWxzZSBpdCBpcyBub3QgT0suCisgICAgd2hpbGUgKEkgIT0gbnVsbHB0cikgeworICAgICAgaWYgKGRlY2xhcmVzU2FtZUVudGl0eSh0aGlzLCBJKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAKKyAgICAgIEkgPSBJLT5nZXRTdXBlckNsYXNzKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBpc0FyY1dlYWtyZWZVbmF2YWlsYWJsZSAtIENoZWNrcyBmb3IgYSBjbGFzcyBvciBvbmUgb2YgaXRzIHN1cGVyIGNsYXNzZXMKKyAgLy8vIHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIF9fd2VhayByZWZlcmVuY2VzLiBSZXR1cm5zIHRydWUgaWYgaXQgaXMuCisgIGJvb2wgaXNBcmNXZWFrcmVmVW5hdmFpbGFibGUoKSBjb25zdDsKKworICAvLy8gaXNPYmpDUmVxdWlyZXNQcm9wZXJ0eURlZnMgLSBDaGVja3MgdGhhdCBhIGNsYXNzIG9yIG9uZSBvZiBpdHMgc3VwZXIgCisgIC8vLyBjbGFzc2VzIG11c3Qgbm90IGJlIGF1dG8tc3ludGhlc2l6ZWQuIFJldHVybnMgY2xhc3MgZGVjbC4gaWYgaXQgbXVzdCBub3QKKyAgLy8vIGJlOyAwLCBvdGhlcndpc2UuCisgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICppc09iakNSZXF1aXJlc1Byb3BlcnR5RGVmcygpIGNvbnN0OworCisgIE9iakNJdmFyRGVjbCAqbG9va3VwSW5zdGFuY2VWYXJpYWJsZShJZGVudGlmaWVySW5mbyAqSVZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDSW50ZXJmYWNlRGVjbCAqJkNsYXNzRGVjbGFyZWQpOworICBPYmpDSXZhckRlY2wgKmxvb2t1cEluc3RhbmNlVmFyaWFibGUoSWRlbnRpZmllckluZm8gKklWYXJOYW1lKSB7CisgICAgT2JqQ0ludGVyZmFjZURlY2wgKkNsYXNzRGVjbGFyZWQ7CisgICAgcmV0dXJuIGxvb2t1cEluc3RhbmNlVmFyaWFibGUoSVZhck5hbWUsIENsYXNzRGVjbGFyZWQpOworICB9CisKKyAgT2JqQ1Byb3RvY29sRGVjbCAqbG9va3VwTmVzdGVkUHJvdG9jb2woSWRlbnRpZmllckluZm8gKk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgLy8gTG9va3VwIGEgbWV0aG9kLiBGaXJzdCwgd2Ugc2VhcmNoIGxvY2FsbHkuIElmIGEgbWV0aG9kIGlzbid0CisgIC8vIGZvdW5kLCB3ZSBzZWFyY2ggcmVmZXJlbmNlZCBwcm90b2NvbHMgYW5kIGNsYXNzIGNhdGVnb3JpZXMuCisgIE9iakNNZXRob2REZWNsICpsb29rdXBNZXRob2QoU2VsZWN0b3IgU2VsLCBib29sIGlzSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaGFsbG93Q2F0ZWdvcnlMb29rdXAgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvbGxvd1N1cGVyID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDQ2F0ZWdvcnlEZWNsICpDID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIExvb2t1cCBhbiBpbnN0YW5jZSBtZXRob2QgZm9yIGEgZ2l2ZW4gc2VsZWN0b3IuCisgIE9iakNNZXRob2REZWNsICpsb29rdXBJbnN0YW5jZU1ldGhvZChTZWxlY3RvciBTZWwpIGNvbnN0IHsKKyAgICByZXR1cm4gbG9va3VwTWV0aG9kKFNlbCwgdHJ1ZS8qaXNJbnN0YW5jZSovKTsKKyAgfQorCisgIC8vLyBMb29rdXAgYSBjbGFzcyBtZXRob2QgZm9yIGEgZ2l2ZW4gc2VsZWN0b3IuCisgIE9iakNNZXRob2REZWNsICpsb29rdXBDbGFzc01ldGhvZChTZWxlY3RvciBTZWwpIGNvbnN0IHsKKyAgICByZXR1cm4gbG9va3VwTWV0aG9kKFNlbCwgZmFsc2UvKmlzSW5zdGFuY2UqLyk7CisgIH0KKworICBPYmpDSW50ZXJmYWNlRGVjbCAqbG9va3VwSW5oZXJpdGVkQ2xhc3MoY29uc3QgSWRlbnRpZmllckluZm8gKklDTmFtZSk7CisKKyAgLy8vIFxicmllZiBMb29rdXAgYSBtZXRob2QgaW4gdGhlIGNsYXNzZXMgaW1wbGVtZW50YXRpb24gaGllcmFyY2h5LgorICBPYmpDTWV0aG9kRGVjbCAqbG9va3VwUHJpdmF0ZU1ldGhvZChjb25zdCBTZWxlY3RvciAmU2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluc3RhbmNlPXRydWUpIGNvbnN0OworCisgIE9iakNNZXRob2REZWNsICpsb29rdXBQcml2YXRlQ2xhc3NNZXRob2QoY29uc3QgU2VsZWN0b3IgJlNlbCkgeworICAgIHJldHVybiBsb29rdXBQcml2YXRlTWV0aG9kKFNlbCwgZmFsc2UpOworICB9CisKKyAgLy8vIFxicmllZiBMb29rdXAgYSBzZXR0ZXIgb3IgZ2V0dGVyIGluIHRoZSBjbGFzcyBoaWVyYXJjaHksCisgIC8vLyBpbmNsdWRpbmcgaW4gYWxsIGNhdGVnb3JpZXMgZXhjZXB0IGZvciBjYXRlZ29yeSBwYXNzZWQKKyAgLy8vIGFzIGFyZ3VtZW50LgorICBPYmpDTWV0aG9kRGVjbCAqbG9va3VwUHJvcGVydHlBY2Nlc3Nvcihjb25zdCBTZWxlY3RvciBTZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNDYXRlZ29yeURlY2wgKkNhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0NsYXNzUHJvcGVydHkpIGNvbnN0IHsKKyAgICByZXR1cm4gbG9va3VwTWV0aG9kKFNlbCwgIUlzQ2xhc3NQcm9wZXJ0eS8qaXNJbnN0YW5jZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UvKnNoYWxsb3dDYXRlZ29yeUxvb2t1cCovLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBmb2xsb3dzU3VwZXIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBDYXQpOworICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBTb3VyY2VMb2NhdGlvbiBnZXRFbmRPZkRlZmluaXRpb25Mb2MoKSBjb25zdCB7IAorICAgIGlmICghaGFzRGVmaW5pdGlvbigpKQorICAgICAgcmV0dXJuIGdldExvY2F0aW9uKCk7CisgICAgCisgICAgcmV0dXJuIGRhdGEoKS5FbmRMb2M7IAorICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB2b2lkIHNldEVuZE9mRGVmaW5pdGlvbkxvYyhTb3VyY2VMb2NhdGlvbiBMRSkgeyBkYXRhKCkuRW5kTG9jID0gTEU7IH0KKworICAvLy8gUmV0cmlldmUgdGhlIHN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBzdXBlcmNsYXNzLgorICBTb3VyY2VMb2NhdGlvbiBnZXRTdXBlckNsYXNzTG9jKCkgY29uc3Q7CisKKyAgLy8vIGlzSW1wbGljaXRJbnRlcmZhY2VEZWNsIC0gY2hlY2sgdGhhdCB0aGlzIGlzIGFuIGltcGxpY2l0bHkgZGVjbGFyZWQKKyAgLy8vIE9iakNJbnRlcmZhY2VEZWNsIG5vZGUuIFRoaXMgaXMgZm9yIGxlZ2FjeSBvYmplY3RpdmUtYyBcQGltcGxlbWVudGF0aW9uCisgIC8vLyBkZWNsYXJhdGlvbiB3aXRob3V0IGFuIFxAaW50ZXJmYWNlIGRlY2xhcmF0aW9uLgorICBib29sIGlzSW1wbGljaXRJbnRlcmZhY2VEZWNsKCkgY29uc3QgeyAKKyAgICByZXR1cm4gaGFzRGVmaW5pdGlvbigpID8gZGF0YSgpLkRlZmluaXRpb24tPmlzSW1wbGljaXQoKSA6IGlzSW1wbGljaXQoKTsKKyAgfQorCisgIC8vLyBDbGFzc0ltcGxlbWVudHNQcm90b2NvbCAtIENoZWNrcyB0aGF0ICdsUHJvdG8nIHByb3RvY29sCisgIC8vLyBoYXMgYmVlbiBpbXBsZW1lbnRlZCBpbiBJRGVjbCBjbGFzcywgaXRzIHN1cGVyIGNsYXNzIG9yIGNhdGVnb3JpZXMgKGlmCisgIC8vLyBsb29rdXBDYXRlZ29yeSBpcyB0cnVlKS4KKyAgYm9vbCBDbGFzc0ltcGxlbWVudHNQcm90b2NvbChPYmpDUHJvdG9jb2xEZWNsICpsUHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb29rdXBDYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJIU0lzUXVhbGlmaWVkSUQgPSBmYWxzZSk7CisKKyAgdXNpbmcgcmVkZWNsX3JhbmdlID0gcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbF9yYW5nZTsKKyAgdXNpbmcgcmVkZWNsX2l0ZXJhdG9yID0gcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbF9pdGVyYXRvcjsKKworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsc19iZWdpbjsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHNfZW5kOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsczsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmdldFByZXZpb3VzRGVjbDsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmdldE1vc3RSZWNlbnREZWNsOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6aXNGaXJzdERlY2w7CisKKyAgLy8vIFJldHJpZXZlcyB0aGUgY2Fub25pY2FsIGRlY2xhcmF0aW9uIG9mIHRoaXMgT2JqZWN0aXZlLUMgY2xhc3MuCisgIE9iakNJbnRlcmZhY2VEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgb3ZlcnJpZGUgeyByZXR1cm4gZ2V0Rmlyc3REZWNsKCk7IH0KKyAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCB7IHJldHVybiBnZXRGaXJzdERlY2woKTsgfQorCisgIC8vIExvdy1sZXZlbCBhY2Nlc3NvcgorICBjb25zdCBUeXBlICpnZXRUeXBlRm9yRGVjbCgpIGNvbnN0IHsgcmV0dXJuIFR5cGVGb3JEZWNsOyB9CisgIHZvaWQgc2V0VHlwZUZvckRlY2woY29uc3QgVHlwZSAqVEQpIGNvbnN0IHsgVHlwZUZvckRlY2wgPSBURDsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gT2JqQ0ludGVyZmFjZTsgfQorCitwcml2YXRlOgorICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqZmluZEludGVyZmFjZVdpdGhEZXNpZ25hdGVkSW5pdGlhbGl6ZXJzKCkgY29uc3Q7CisgIGJvb2wgaW5oZXJpdHNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJzKCkgY29uc3Q7Cit9OworCisvLy8gT2JqQ0l2YXJEZWNsIC0gUmVwcmVzZW50cyBhbiBPYmpDIGluc3RhbmNlIHZhcmlhYmxlLiBJbiBnZW5lcmFsLCBPYmpDCisvLy8gaW5zdGFuY2UgdmFyaWFibGVzIGFyZSBpZGVudGljYWwgdG8gQy4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIE9iamVjdGl2ZS1DCisvLy8gc3VwcG9ydHMgQysrIHN0eWxlIGFjY2VzcyBjb250cm9sLiBGb3IgZXhhbXBsZToKKy8vLworLy8vICAgXEBpbnRlcmZhY2UgSXZhckV4YW1wbGUgOiBOU09iamVjdAorLy8vICAgeworLy8vICAgICBpZCBkZWZhdWx0VG9Qcm90ZWN0ZWQ7CisvLy8gICBcQHB1YmxpYzoKKy8vLyAgICAgaWQgY2FuQmVQdWJsaWM7IC8vIHNhbWUgYXMgQysrLgorLy8vICAgXEBwcm90ZWN0ZWQ6CisvLy8gICAgIGlkIGNhbkJlUHJvdGVjdGVkOyAvLyBzYW1lIGFzIEMrKy4KKy8vLyAgIFxAcGFja2FnZToKKy8vLyAgICAgaWQgY2FuQmVQYWNrYWdlOyAvLyBmcmFtZXdvcmsgdmlzaWJpbGl0eSAobm90IGF2YWlsYWJsZSBpbiBDKyspLgorLy8vICAgfQorLy8vCitjbGFzcyBPYmpDSXZhckRlY2wgOiBwdWJsaWMgRmllbGREZWNsIHsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBlbnVtIEFjY2Vzc0NvbnRyb2wgeworICAgIE5vbmUsIFByaXZhdGUsIFByb3RlY3RlZCwgUHVibGljLCBQYWNrYWdlCisgIH07CisKK3ByaXZhdGU6CisgIE9iakNJdmFyRGVjbChPYmpDQ29udGFpbmVyRGVjbCAqREMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRMb2MsIElkZW50aWZpZXJJbmZvICpJZCwKKyAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIFR5cGVTb3VyY2VJbmZvICpUSW5mbywgQWNjZXNzQ29udHJvbCBhYywgRXhwciAqQlcsCisgICAgICAgICAgICAgICBib29sIHN5bnRoZXNpemVkKQorICAgICAgOiBGaWVsZERlY2woT2JqQ0l2YXIsIERDLCBTdGFydExvYywgSWRMb2MsIElkLCBULCBUSW5mbywgQlcsCisgICAgICAgICAgICAgICAgICAvKk11dGFibGU9Ki9mYWxzZSwgLypIYXNJbml0PSovSUNJU19Ob0luaXQpLAorICAgICAgICBEZWNsQWNjZXNzKGFjKSwgU3ludGhlc2l6ZWQoc3ludGhlc2l6ZWQpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIE9iakNJdmFyRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIE9iakNDb250YWluZXJEZWNsICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBJZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpJZCwgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2wgYWMsIEV4cHIgKkJXID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3ludGhlc2l6ZWQ9ZmFsc2UpOworCisgIHN0YXRpYyBPYmpDSXZhckRlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisgIAorICAvLy8gXGJyaWVmIFJldHVybiB0aGUgY2xhc3MgaW50ZXJmYWNlIHRoYXQgdGhpcyBpdmFyIGlzIGxvZ2ljYWxseSBjb250YWluZWQKKyAgLy8vIGluOyB0aGlzIGlzIGVpdGhlciB0aGUgaW50ZXJmYWNlIHdoZXJlIHRoZSBpdmFyIHdhcyBkZWNsYXJlZCwgb3IgdGhlCisgIC8vLyBpbnRlcmZhY2UgdGhlIGl2YXIgaXMgY29uY2VwdHVhbGx5IGEgcGFydCBvZiBpbiB0aGUgY2FzZSBvZiBzeW50aGVzaXplZAorICAvLy8gaXZhcnMuCisgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpnZXRDb250YWluaW5nSW50ZXJmYWNlKCkgY29uc3Q7CisKKyAgT2JqQ0l2YXJEZWNsICpnZXROZXh0SXZhcigpIHsgcmV0dXJuIE5leHRJdmFyOyB9CisgIGNvbnN0IE9iakNJdmFyRGVjbCAqZ2V0TmV4dEl2YXIoKSBjb25zdCB7IHJldHVybiBOZXh0SXZhcjsgfQorICB2b2lkIHNldE5leHRJdmFyKE9iakNJdmFyRGVjbCAqaXZhcikgeyBOZXh0SXZhciA9IGl2YXI7IH0KKworICB2b2lkIHNldEFjY2Vzc0NvbnRyb2woQWNjZXNzQ29udHJvbCBhYykgeyBEZWNsQWNjZXNzID0gYWM7IH0KKworICBBY2Nlc3NDb250cm9sIGdldEFjY2Vzc0NvbnRyb2woKSBjb25zdCB7IHJldHVybiBBY2Nlc3NDb250cm9sKERlY2xBY2Nlc3MpOyB9CisKKyAgQWNjZXNzQ29udHJvbCBnZXRDYW5vbmljYWxBY2Nlc3NDb250cm9sKCkgY29uc3QgeworICAgIHJldHVybiBEZWNsQWNjZXNzID09IE5vbmUgPyBQcm90ZWN0ZWQgOiBBY2Nlc3NDb250cm9sKERlY2xBY2Nlc3MpOworICB9CisKKyAgdm9pZCBzZXRTeW50aGVzaXplKGJvb2wgc3ludGgpIHsgU3ludGhlc2l6ZWQgPSBzeW50aDsgfQorICBib29sIGdldFN5bnRoZXNpemUoKSBjb25zdCB7IHJldHVybiBTeW50aGVzaXplZDsgfQorCisgIC8vLyBSZXRyaWV2ZSB0aGUgdHlwZSBvZiB0aGlzIGluc3RhbmNlIHZhcmlhYmxlIHdoZW4gdmlld2VkIGFzIGEgbWVtYmVyIG9mIGEKKyAgLy8vIHNwZWNpZmljIG9iamVjdCB0eXBlLgorICBRdWFsVHlwZSBnZXRVc2FnZVR5cGUoUXVhbFR5cGUgb2JqZWN0VHlwZSkgY29uc3Q7CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IE9iakNJdmFyOyB9CisKK3ByaXZhdGU6CisgIC8vLyBOZXh0SXZhciAtIE5leHQgSXZhciBpbiB0aGUgbGlzdCBvZiBpdmFycyBkZWNsYXJlZCBpbiBjbGFzczsgY2xhc3MncworICAvLy8gZXh0ZW5zaW9ucyBhbmQgY2xhc3MncyBpbXBsZW1lbnRhdGlvbgorICBPYmpDSXZhckRlY2wgKk5leHRJdmFyID0gbnVsbHB0cjsKKworICAvLyBOT1RFOiBWQysrIHRyZWF0cyBlbnVtcyBhcyBzaWduZWQsIGF2b2lkIHVzaW5nIHRoZSBBY2Nlc3NDb250cm9sIGVudW0KKyAgdW5zaWduZWQgRGVjbEFjY2VzcyA6IDM7CisgIHVuc2lnbmVkIFN5bnRoZXNpemVkIDogMTsKK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIGZpZWxkIGRlY2xhcmF0aW9uIGNyZWF0ZWQgYnkgYW4gXEBkZWZzKC4uLikuCitjbGFzcyBPYmpDQXREZWZzRmllbGREZWNsIDogcHVibGljIEZpZWxkRGVjbCB7CisgIE9iakNBdERlZnNGaWVsZERlY2woRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJZExvYywgSWRlbnRpZmllckluZm8gKklkLAorICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIEV4cHIgKkJXKQorICAgICAgOiBGaWVsZERlY2woT2JqQ0F0RGVmc0ZpZWxkLCBEQywgU3RhcnRMb2MsIElkTG9jLCBJZCwgVCwKKyAgICAgICAgICAgICAgICAgIC8qVEluZm89Ki9udWxscHRyLCAvLyBGSVhNRTogRG8gT2JqQ0F0RGVmcyBoYXZlIGRlY2xhcmF0b3JzID8KKyAgICAgICAgICAgICAgICAgIEJXLCAvKk11dGFibGU9Ki9mYWxzZSwgLypIYXNJbml0PSovSUNJU19Ob0luaXQpIHt9CisKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBzdGF0aWMgT2JqQ0F0RGVmc0ZpZWxkRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJZExvYywgSWRlbnRpZmllckluZm8gKklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIEV4cHIgKkJXKTsKKworICBzdGF0aWMgT2JqQ0F0RGVmc0ZpZWxkRGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKKyAgCisgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBPYmpDQXREZWZzRmllbGQ7IH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhbiBPYmplY3RpdmUtQyBwcm90b2NvbCBkZWNsYXJhdGlvbi4KKy8vLworLy8vIE9iamVjdGl2ZS1DIHByb3RvY29scyBkZWNsYXJlIGEgcHVyZSBhYnN0cmFjdCB0eXBlIChpLmUuLCBubyBpbnN0YW5jZQorLy8vIHZhcmlhYmxlcyBhcmUgcGVybWl0dGVkKS4gIFByb3RvY29scyBvcmlnaW5hbGx5IGRyZXcgaW5zcGlyYXRpb24gZnJvbQorLy8vIEMrKyBwdXJlIHZpcnR1YWwgZnVuY3Rpb25zIChhIEMrKyBmZWF0dXJlIHdpdGggbmljZSBzZW1hbnRpY3MgYW5kIGxvdXN5CisvLy8gc3ludGF4Oi0pLiBIZXJlIGlzIGFuIGV4YW1wbGU6CisvLy8KKy8vLyBcY29kZQorLy8vIFxAcHJvdG9jb2wgTlNEcmFnZ2luZ0luZm8gPHJlZnByb3RvMSwgcmVmcHJvdG8yPgorLy8vIC0gKE5TV2luZG93ICopZHJhZ2dpbmdEZXN0aW5hdGlvbldpbmRvdzsKKy8vLyAtIChOU0ltYWdlICopZHJhZ2dlZEltYWdlOworLy8vIFxAZW5kCisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgc2F5cyB0aGF0IE5TRHJhZ2dpbmdJbmZvIHJlcXVpcmVzIHR3byBtZXRob2RzIGFuZCByZXF1aXJlcyBldmVyeXRoaW5nCisvLy8gdGhhdCB0aGUgdHdvICJyZWZlcmVuY2VkIHByb3RvY29scyIgJ3JlZnByb3RvMScgYW5kICdyZWZwcm90bzInIHJlcXVpcmUgYXMKKy8vLyB3ZWxsLgorLy8vCisvLy8gXGNvZGUKKy8vLyBcQGludGVyZmFjZSBJbXBsZW1lbnRzTlNEcmFnZ2luZ0luZm8gOiBOU09iamVjdCBcPE5TRHJhZ2dpbmdJbmZvPgorLy8vIFxAZW5kCisvLy8gXGVuZGNvZGUKKy8vLworLy8vIE9iakMgcHJvdG9jb2xzIGluc3BpcmVkIEphdmEgaW50ZXJmYWNlcy4gVW5saWtlIEphdmEsIE9iakMgY2xhc3NlcyBhbmQKKy8vLyBwcm90b2NvbHMgYXJlIGluIGRpc3RpbmN0IG5hbWVzcGFjZXMuIEZvciBleGFtcGxlLCBDb2NvYSBkZWZpbmVzIGJvdGgKKy8vLyBhbiBOU09iamVjdCBwcm90b2NvbCBhbmQgY2xhc3MgKHdoaWNoIGlzbid0IGFsbG93ZWQgaW4gSmF2YSkuIEFzIGEgcmVzdWx0LAorLy8vIHByb3RvY29scyBhcmUgcmVmZXJlbmNlZCB1c2luZyBhbmdsZSBicmFja2V0cyBhcyBmb2xsb3dzOgorLy8vCisvLy8gaWQgXDxOU0RyYWdnaW5nSW5mbz4gYW55T2JqZWN0VGhhdEltcGxlbWVudHNOU0RyYWdnaW5nSW5mbzsKK2NsYXNzIE9iakNQcm90b2NvbERlY2wgOiBwdWJsaWMgT2JqQ0NvbnRhaW5lckRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFJlZGVjbGFyYWJsZTxPYmpDUHJvdG9jb2xEZWNsPiB7CisgIHN0cnVjdCBEZWZpbml0aW9uRGF0YSB7CisgICAgLy8gXGJyaWVmIFRoZSBkZWNsYXJhdGlvbiB0aGF0IGRlZmluZXMgdGhpcyBwcm90b2NvbC4KKyAgICBPYmpDUHJvdG9jb2xEZWNsICpEZWZpbml0aW9uOworCisgICAgLy8vIFxicmllZiBSZWZlcmVuY2VkIHByb3RvY29scworICAgIE9iakNQcm90b2NvbExpc3QgUmVmZXJlbmNlZFByb3RvY29sczsgICAgCisgIH07CisKKyAgLy8vIFxicmllZiBDb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MsCisgIC8vLyB3aGljaCB3aWxsIGJlIE5VTEwgaWYgdGhpcyBjbGFzcyBoYXMgbm90IHlldCBiZWVuIGRlZmluZWQuCisgIC8vLworICAvLy8gVGhlIGJpdCBpbmRpY2F0ZXMgd2hlbiB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBvdXQtb2YtZGF0ZQorICAvLy8gZGVjbGFyYXRpb25zLiBJdCB3aWxsIGJlIHNldCB1bmxlc3MgbW9kdWxlcyBhcmUgZW5hYmxlZC4KKyAgbGx2bTo6UG9pbnRlckludFBhaXI8RGVmaW5pdGlvbkRhdGEgKiwgMSwgYm9vbD4gRGF0YTsKKworICBPYmpDUHJvdG9jb2xEZWNsKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywgSWRlbnRpZmllckluZm8gKklkLAorICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIG5hbWVMb2MsIFNvdXJjZUxvY2F0aW9uIGF0U3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgT2JqQ1Byb3RvY29sRGVjbCAqUHJldkRlY2wpOworCisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKKyAgRGVmaW5pdGlvbkRhdGEgJmRhdGEoKSBjb25zdCB7CisgICAgYXNzZXJ0KERhdGEuZ2V0UG9pbnRlcigpICYmICJPYmplY3RpdmUtQyBwcm90b2NvbCBoYXMgbm8gZGVmaW5pdGlvbiEiKTsKKyAgICByZXR1cm4gKkRhdGEuZ2V0UG9pbnRlcigpOworICB9CisgIAorICB2b2lkIGFsbG9jYXRlRGVmaW5pdGlvbkRhdGEoKTsKKworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZSA9IFJlZGVjbGFyYWJsZTxPYmpDUHJvdG9jb2xEZWNsPjsKKworICBPYmpDUHJvdG9jb2xEZWNsICpnZXROZXh0UmVkZWNsYXJhdGlvbkltcGwoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIGdldE5leHRSZWRlY2xhcmF0aW9uKCk7CisgIH0KKworICBPYmpDUHJvdG9jb2xEZWNsICpnZXRQcmV2aW91c0RlY2xJbXBsKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRQcmV2aW91c0RlY2woKTsKKyAgfQorCisgIE9iakNQcm90b2NvbERlY2wgKmdldE1vc3RSZWNlbnREZWNsSW1wbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0TW9zdFJlY2VudERlY2woKTsKKyAgfQorCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNURGVjbFdyaXRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVFJlYWRlcjsKKworICBzdGF0aWMgT2JqQ1Byb3RvY29sRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gbmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBhdFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNQcm90b2NvbERlY2wgKlByZXZEZWNsKTsKKworICBzdGF0aWMgT2JqQ1Byb3RvY29sRGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKKworICBjb25zdCBPYmpDUHJvdG9jb2xMaXN0ICZnZXRSZWZlcmVuY2VkUHJvdG9jb2xzKCkgY29uc3QgeworICAgIGFzc2VydChoYXNEZWZpbml0aW9uKCkgJiYgIk5vIGRlZmluaXRpb24gYXZhaWxhYmxlISIpOworICAgIHJldHVybiBkYXRhKCkuUmVmZXJlbmNlZFByb3RvY29sczsKKyAgfQorCisgIHVzaW5nIHByb3RvY29sX2l0ZXJhdG9yID0gT2JqQ1Byb3RvY29sTGlzdDo6aXRlcmF0b3I7CisgIHVzaW5nIHByb3RvY29sX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8cHJvdG9jb2xfaXRlcmF0b3I+OworCisgIHByb3RvY29sX3JhbmdlIHByb3RvY29scygpIGNvbnN0IHsKKyAgICByZXR1cm4gcHJvdG9jb2xfcmFuZ2UocHJvdG9jb2xfYmVnaW4oKSwgcHJvdG9jb2xfZW5kKCkpOworICB9CisKKyAgcHJvdG9jb2xfaXRlcmF0b3IgcHJvdG9jb2xfYmVnaW4oKSBjb25zdCB7CisgICAgaWYgKCFoYXNEZWZpbml0aW9uKCkpCisgICAgICByZXR1cm4gcHJvdG9jb2xfaXRlcmF0b3IoKTsKKyAgICAKKyAgICByZXR1cm4gZGF0YSgpLlJlZmVyZW5jZWRQcm90b2NvbHMuYmVnaW4oKTsKKyAgfQorCisgIHByb3RvY29sX2l0ZXJhdG9yIHByb3RvY29sX2VuZCgpIGNvbnN0IHsgCisgICAgaWYgKCFoYXNEZWZpbml0aW9uKCkpCisgICAgICByZXR1cm4gcHJvdG9jb2xfaXRlcmF0b3IoKTsKKyAgICAKKyAgICByZXR1cm4gZGF0YSgpLlJlZmVyZW5jZWRQcm90b2NvbHMuZW5kKCk7IAorICB9CisKKyAgdXNpbmcgcHJvdG9jb2xfbG9jX2l0ZXJhdG9yID0gT2JqQ1Byb3RvY29sTGlzdDo6bG9jX2l0ZXJhdG9yOworICB1c2luZyBwcm90b2NvbF9sb2NfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxwcm90b2NvbF9sb2NfaXRlcmF0b3I+OworCisgIHByb3RvY29sX2xvY19yYW5nZSBwcm90b2NvbF9sb2NzKCkgY29uc3QgeworICAgIHJldHVybiBwcm90b2NvbF9sb2NfcmFuZ2UocHJvdG9jb2xfbG9jX2JlZ2luKCksIHByb3RvY29sX2xvY19lbmQoKSk7CisgIH0KKworICBwcm90b2NvbF9sb2NfaXRlcmF0b3IgcHJvdG9jb2xfbG9jX2JlZ2luKCkgY29uc3QgeworICAgIGlmICghaGFzRGVmaW5pdGlvbigpKQorICAgICAgcmV0dXJuIHByb3RvY29sX2xvY19pdGVyYXRvcigpOworICAgIAorICAgIHJldHVybiBkYXRhKCkuUmVmZXJlbmNlZFByb3RvY29scy5sb2NfYmVnaW4oKTsKKyAgfQorCisgIHByb3RvY29sX2xvY19pdGVyYXRvciBwcm90b2NvbF9sb2NfZW5kKCkgY29uc3QgeworICAgIGlmICghaGFzRGVmaW5pdGlvbigpKQorICAgICAgcmV0dXJuIHByb3RvY29sX2xvY19pdGVyYXRvcigpOworICAgIAorICAgIHJldHVybiBkYXRhKCkuUmVmZXJlbmNlZFByb3RvY29scy5sb2NfZW5kKCk7CisgIH0KKworICB1bnNpZ25lZCBwcm90b2NvbF9zaXplKCkgY29uc3QgeyAKKyAgICBpZiAoIWhhc0RlZmluaXRpb24oKSkKKyAgICAgIHJldHVybiAwOworICAgIAorICAgIHJldHVybiBkYXRhKCkuUmVmZXJlbmNlZFByb3RvY29scy5zaXplKCk7IAorICB9CisKKyAgLy8vIHNldFByb3RvY29sTGlzdCAtIFNldCB0aGUgbGlzdCBvZiBwcm90b2NvbHMgdGhhdCB0aGlzIGludGVyZmFjZQorICAvLy8gaW1wbGVtZW50cy4KKyAgdm9pZCBzZXRQcm90b2NvbExpc3QoT2JqQ1Byb3RvY29sRGVjbCAqY29uc3QqTGlzdCwgdW5zaWduZWQgTnVtLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VMb2NhdGlvbiAqTG9jcywgQVNUQ29udGV4dCAmQykgeworICAgIGFzc2VydChoYXNEZWZpbml0aW9uKCkgJiYgIlByb3RvY29sIGlzIG5vdCBkZWZpbmVkIik7CisgICAgZGF0YSgpLlJlZmVyZW5jZWRQcm90b2NvbHMuc2V0KExpc3QsIE51bSwgTG9jcywgQyk7CisgIH0KKworICBPYmpDUHJvdG9jb2xEZWNsICpsb29rdXBQcm90b2NvbE5hbWVkKElkZW50aWZpZXJJbmZvICpQTmFtZSk7CisKKyAgLy8gTG9va3VwIGEgbWV0aG9kLiBGaXJzdCwgd2Ugc2VhcmNoIGxvY2FsbHkuIElmIGEgbWV0aG9kIGlzbid0CisgIC8vIGZvdW5kLCB3ZSBzZWFyY2ggcmVmZXJlbmNlZCBwcm90b2NvbHMgYW5kIGNsYXNzIGNhdGVnb3JpZXMuCisgIE9iakNNZXRob2REZWNsICpsb29rdXBNZXRob2QoU2VsZWN0b3IgU2VsLCBib29sIGlzSW5zdGFuY2UpIGNvbnN0OworCisgIE9iakNNZXRob2REZWNsICpsb29rdXBJbnN0YW5jZU1ldGhvZChTZWxlY3RvciBTZWwpIGNvbnN0IHsKKyAgICByZXR1cm4gbG9va3VwTWV0aG9kKFNlbCwgdHJ1ZS8qaXNJbnN0YW5jZSovKTsKKyAgfQorCisgIE9iakNNZXRob2REZWNsICpsb29rdXBDbGFzc01ldGhvZChTZWxlY3RvciBTZWwpIGNvbnN0IHsKKyAgICByZXR1cm4gbG9va3VwTWV0aG9kKFNlbCwgZmFsc2UvKmlzSW5zdGFuY2UqLyk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgcHJvdG9jb2wgaGFzIGEgZGVmaW5pdGlvbi4KKyAgYm9vbCBoYXNEZWZpbml0aW9uKCkgY29uc3QgeworICAgIC8vIElmIHRoZSBuYW1lIG9mIHRoaXMgcHJvdG9jb2wgaXMgb3V0LW9mLWRhdGUsIGJyaW5nIGl0IHVwLXRvLWRhdGUsIHdoaWNoCisgICAgLy8gbWlnaHQgYnJpbmcgaW4gYSBkZWZpbml0aW9uLgorICAgIC8vIE5vdGU6IGEgbnVsbCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB3ZSBkb24ndCBoYXZlIGEgZGVmaW5pdGlvbiBhbmQgdGhhdAorICAgIC8vIG1vZHVsZXMgYXJlIGVuYWJsZWQuCisgICAgaWYgKCFEYXRhLmdldE9wYXF1ZVZhbHVlKCkpCisgICAgICBnZXRNb3N0UmVjZW50RGVjbCgpOworCisgICAgcmV0dXJuIERhdGEuZ2V0UG9pbnRlcigpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIHByb3RvY29sLCBpZiBhbnkuCisgIE9iakNQcm90b2NvbERlY2wgKmdldERlZmluaXRpb24oKSB7CisgICAgcmV0dXJuIGhhc0RlZmluaXRpb24oKT8gRGF0YS5nZXRQb2ludGVyKCktPkRlZmluaXRpb24gOiBudWxscHRyOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIHByb3RvY29sLCBpZiBhbnkuCisgIGNvbnN0IE9iakNQcm90b2NvbERlY2wgKmdldERlZmluaXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0RlZmluaXRpb24oKT8gRGF0YS5nZXRQb2ludGVyKCktPkRlZmluaXRpb24gOiBudWxscHRyOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHBhcnRpY3VsYXIgZGVjbGFyYXRpb24gaXMgYWxzbyB0aGUgCisgIC8vLyBkZWZpbml0aW9uLgorICBib29sIGlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGdldERlZmluaXRpb24oKSA9PSB0aGlzOworICB9CisgIAorICAvLy8gXGJyaWVmIFN0YXJ0cyB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIE9iamVjdGl2ZS1DIHByb3RvY29sLgorICB2b2lkIHN0YXJ0RGVmaW5pdGlvbigpOworCisgIC8vLyBQcm9kdWNlIGEgbmFtZSB0byBiZSB1c2VkIGZvciBwcm90b2NvbCdzIG1ldGFkYXRhLiBJdCBjb21lcyBlaXRoZXIgdmlhCisgIC8vLyBvYmpjX3J1bnRpbWVfbmFtZSBhdHRyaWJ1dGUgb3IgcHJvdG9jb2wgbmFtZS4KKyAgU3RyaW5nUmVmIGdldE9iakNSdW50aW1lTmFtZUFzU3RyaW5nKCkgY29uc3Q7CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZIHsKKyAgICBpZiAoaXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpKQorICAgICAgcmV0dXJuIE9iakNDb250YWluZXJEZWNsOjpnZXRTb3VyY2VSYW5nZSgpOworICAgCisgICAgcmV0dXJuIFNvdXJjZVJhbmdlKGdldEF0U3RhcnRMb2MoKSwgZ2V0TG9jYXRpb24oKSk7CisgIH0KKyAgIAorICB1c2luZyByZWRlY2xfcmFuZ2UgPSByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsX3JhbmdlOworICB1c2luZyByZWRlY2xfaXRlcmF0b3IgPSByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsX2l0ZXJhdG9yOworCisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xzX2JlZ2luOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsc19lbmQ7CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xzOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6Z2V0UHJldmlvdXNEZWNsOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6Z2V0TW9zdFJlY2VudERlY2w7CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjppc0ZpcnN0RGVjbDsKKworICAvLy8gUmV0cmlldmVzIHRoZSBjYW5vbmljYWwgZGVjbGFyYXRpb24gb2YgdGhpcyBPYmplY3RpdmUtQyBwcm90b2NvbC4KKyAgT2JqQ1Byb3RvY29sRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIG92ZXJyaWRlIHsgcmV0dXJuIGdldEZpcnN0RGVjbCgpOyB9CisgIGNvbnN0IE9iakNQcm90b2NvbERlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCB7IHJldHVybiBnZXRGaXJzdERlY2woKTsgfQorCisgIHZvaWQgY29sbGVjdFByb3BlcnRpZXNUb0ltcGxlbWVudChQcm9wZXJ0eU1hcCAmUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURlY2xPcmRlciAmUE8pIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgY29sbGVjdEluaGVyaXRlZFByb3RvY29sUHJvcGVydGllcyhjb25zdCBPYmpDUHJvcGVydHlEZWNsICpQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sUHJvcGVydHlTZXQgJlBTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZWNsT3JkZXIgJlBPKSBjb25zdDsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IE9iakNQcm90b2NvbDsgfQorfTsKKworLy8vIE9iakNDYXRlZ29yeURlY2wgLSBSZXByZXNlbnRzIGEgY2F0ZWdvcnkgZGVjbGFyYXRpb24uIEEgY2F0ZWdvcnkgYWxsb3dzCisvLy8geW91IHRvIGFkZCBtZXRob2RzIHRvIGFuIGV4aXN0aW5nIGNsYXNzICh3aXRob3V0IHN1YmNsYXNzaW5nIG9yIG1vZGlmeWluZworLy8vIHRoZSBvcmlnaW5hbCBjbGFzcyBpbnRlcmZhY2Ugb3IgaW1wbGVtZW50YXRpb246LSkuIENhdGVnb3JpZXMgZG9uJ3QgYWxsb3cKKy8vLyB5b3UgdG8gYWRkIGluc3RhbmNlIGRhdGEuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBhZGRzICJteU1ldGhvZCIgdG8gYWxsCisvLy8gTlNWaWV3J3Mgd2l0aGluIGEgcHJvY2VzczoKKy8vLworLy8vIFxAaW50ZXJmYWNlIE5TVmlldyAoTXlWaWV3TWV0aG9kcykKKy8vLyAtIG15TWV0aG9kOworLy8vIFxAZW5kCisvLy8KKy8vLyBDYXRlZ29yaWVzIGFsc28gYWxsb3cgeW91IHRvIHNwbGl0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGNsYXNzIGFjcm9zcworLy8vIHNldmVyYWwgZmlsZXMgKGEgZmVhdHVyZSBtb3JlIG5hdHVyYWxseSBzdXBwb3J0ZWQgaW4gQysrKS4KKy8vLworLy8vIENhdGVnb3JpZXMgd2VyZSBvcmlnaW5hbGx5IGluc3BpcmVkIGJ5IGR5bmFtaWMgbGFuZ3VhZ2VzIHN1Y2ggYXMgQ29tbW9uCisvLy8gTGlzcCBhbmQgU21hbGx0YWxrLiAgTW9yZSB0cmFkaXRpb25hbCBjbGFzcy1iYXNlZCBsYW5ndWFnZXMgKEMrKywgSmF2YSkKKy8vLyBkb24ndCBzdXBwb3J0IHRoaXMgbGV2ZWwgb2YgZHluYW1pc20sIHdoaWNoIGlzIGJvdGggcG93ZXJmdWwgYW5kIGRhbmdlcm91cy4KK2NsYXNzIE9iakNDYXRlZ29yeURlY2wgOiBwdWJsaWMgT2JqQ0NvbnRhaW5lckRlY2wgeworICAvLy8gSW50ZXJmYWNlIGJlbG9uZ2luZyB0byB0aGlzIGNhdGVnb3J5CisgIE9iakNJbnRlcmZhY2VEZWNsICpDbGFzc0ludGVyZmFjZTsKKworICAvLy8gVGhlIHR5cGUgcGFyYW1ldGVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYXRlZ29yeSwgaWYgYW55LgorICBPYmpDVHlwZVBhcmFtTGlzdCAqVHlwZVBhcmFtTGlzdCA9IG51bGxwdHI7CisKKyAgLy8vIHJlZmVyZW5jZWQgcHJvdG9jb2xzIGluIHRoaXMgY2F0ZWdvcnkuCisgIE9iakNQcm90b2NvbExpc3QgUmVmZXJlbmNlZFByb3RvY29sczsKKworICAvLy8gTmV4dCBjYXRlZ29yeSBiZWxvbmdpbmcgdG8gdGhpcyBjbGFzcy4KKyAgLy8vIEZJWE1FOiB0aGlzIHNob3VsZCBub3QgYmUgYSBzaW5nbHktbGlua2VkIGxpc3QuICBNb3ZlIHN0b3JhZ2UgZWxzZXdoZXJlLgorICBPYmpDQ2F0ZWdvcnlEZWNsICpOZXh0Q2xhc3NDYXRlZ29yeSA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIGNhdGVnb3J5IG5hbWUgaW4gdGhpcyBkZWNsYXJhdGlvbi4KKyAgU291cmNlTG9jYXRpb24gQ2F0ZWdvcnlOYW1lTG9jOworCisgIC8vLyBjbGFzcyBleHRlbnNpb24gbWF5IGhhdmUgcHJpdmF0ZSBpdmFycy4KKyAgU291cmNlTG9jYXRpb24gSXZhckxCcmFjZUxvYzsKKyAgU291cmNlTG9jYXRpb24gSXZhclJCcmFjZUxvYzsKKyAgCisgIE9iakNDYXRlZ29yeURlY2woRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBBdExvYywKKyAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDbGFzc05hbWVMb2MsIFNvdXJjZUxvY2F0aW9uIENhdGVnb3J5TmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsIE9iakNJbnRlcmZhY2VEZWNsICpJRGVjbCwKKyAgICAgICAgICAgICAgICAgICBPYmpDVHlwZVBhcmFtTGlzdCAqdHlwZVBhcmFtTGlzdCwKKyAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJdmFyTEJyYWNlTG9jID0gU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJdmFyUkJyYWNlTG9jID0gU291cmNlTG9jYXRpb24oKSk7CisKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisKKyAgc3RhdGljIE9iakNDYXRlZ29yeURlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQ2xhc3NOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENhdGVnb3J5TmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ludGVyZmFjZURlY2wgKklEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNUeXBlUGFyYW1MaXN0ICp0eXBlUGFyYW1MaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEl2YXJMQnJhY2VMb2M9U291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJdmFyUkJyYWNlTG9jPVNvdXJjZUxvY2F0aW9uKCkpOworICBzdGF0aWMgT2JqQ0NhdGVnb3J5RGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKKworICBPYmpDSW50ZXJmYWNlRGVjbCAqZ2V0Q2xhc3NJbnRlcmZhY2UoKSB7IHJldHVybiBDbGFzc0ludGVyZmFjZTsgfQorICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqZ2V0Q2xhc3NJbnRlcmZhY2UoKSBjb25zdCB7IHJldHVybiBDbGFzc0ludGVyZmFjZTsgfQorCisgIC8vLyBSZXRyaWV2ZSB0aGUgdHlwZSBwYXJhbWV0ZXIgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYXRlZ29yeSBvcgorICAvLy8gZXh0ZW5zaW9uLgorICBPYmpDVHlwZVBhcmFtTGlzdCAqZ2V0VHlwZVBhcmFtTGlzdCgpIGNvbnN0IHsgcmV0dXJuIFR5cGVQYXJhbUxpc3Q7IH0KKworICAvLy8gU2V0IHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhpcyBjYXRlZ29yeS4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIEFTVCBpbXBvcnRlciwgd2hpY2ggbXVzdCBpbXBvcnQgdGhlIHR5cGUKKyAgLy8vIHBhcmFtZXRlcnMgYWZ0ZXIgY3JlYXRpbmcgdGhlaXIgRGVjbENvbnRleHQgdG8gYXZvaWQgbG9vcHMuCisgIHZvaWQgc2V0VHlwZVBhcmFtTGlzdChPYmpDVHlwZVBhcmFtTGlzdCAqVFBMKTsKKworCisgIE9iakNDYXRlZ29yeUltcGxEZWNsICpnZXRJbXBsZW1lbnRhdGlvbigpIGNvbnN0OworICB2b2lkIHNldEltcGxlbWVudGF0aW9uKE9iakNDYXRlZ29yeUltcGxEZWNsICpJbXBsRCk7CisKKyAgLy8vIHNldFByb3RvY29sTGlzdCAtIFNldCB0aGUgbGlzdCBvZiBwcm90b2NvbHMgdGhhdCB0aGlzIGludGVyZmFjZQorICAvLy8gaW1wbGVtZW50cy4KKyAgdm9pZCBzZXRQcm90b2NvbExpc3QoT2JqQ1Byb3RvY29sRGVjbCAqY29uc3QqTGlzdCwgdW5zaWduZWQgTnVtLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VMb2NhdGlvbiAqTG9jcywgQVNUQ29udGV4dCAmQykgeworICAgIFJlZmVyZW5jZWRQcm90b2NvbHMuc2V0KExpc3QsIE51bSwgTG9jcywgQyk7CisgIH0KKworICBjb25zdCBPYmpDUHJvdG9jb2xMaXN0ICZnZXRSZWZlcmVuY2VkUHJvdG9jb2xzKCkgY29uc3QgeworICAgIHJldHVybiBSZWZlcmVuY2VkUHJvdG9jb2xzOworICB9CisKKyAgdXNpbmcgcHJvdG9jb2xfaXRlcmF0b3IgPSBPYmpDUHJvdG9jb2xMaXN0OjppdGVyYXRvcjsKKyAgdXNpbmcgcHJvdG9jb2xfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxwcm90b2NvbF9pdGVyYXRvcj47CisKKyAgcHJvdG9jb2xfcmFuZ2UgcHJvdG9jb2xzKCkgY29uc3QgeworICAgIHJldHVybiBwcm90b2NvbF9yYW5nZShwcm90b2NvbF9iZWdpbigpLCBwcm90b2NvbF9lbmQoKSk7CisgIH0KKworICBwcm90b2NvbF9pdGVyYXRvciBwcm90b2NvbF9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVmZXJlbmNlZFByb3RvY29scy5iZWdpbigpOworICB9CisKKyAgcHJvdG9jb2xfaXRlcmF0b3IgcHJvdG9jb2xfZW5kKCkgY29uc3QgeyByZXR1cm4gUmVmZXJlbmNlZFByb3RvY29scy5lbmQoKTsgfQorICB1bnNpZ25lZCBwcm90b2NvbF9zaXplKCkgY29uc3QgeyByZXR1cm4gUmVmZXJlbmNlZFByb3RvY29scy5zaXplKCk7IH0KKworICB1c2luZyBwcm90b2NvbF9sb2NfaXRlcmF0b3IgPSBPYmpDUHJvdG9jb2xMaXN0Ojpsb2NfaXRlcmF0b3I7CisgIHVzaW5nIHByb3RvY29sX2xvY19yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPHByb3RvY29sX2xvY19pdGVyYXRvcj47CisKKyAgcHJvdG9jb2xfbG9jX3JhbmdlIHByb3RvY29sX2xvY3MoKSBjb25zdCB7CisgICAgcmV0dXJuIHByb3RvY29sX2xvY19yYW5nZShwcm90b2NvbF9sb2NfYmVnaW4oKSwgcHJvdG9jb2xfbG9jX2VuZCgpKTsKKyAgfQorCisgIHByb3RvY29sX2xvY19pdGVyYXRvciBwcm90b2NvbF9sb2NfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIFJlZmVyZW5jZWRQcm90b2NvbHMubG9jX2JlZ2luKCk7CisgIH0KKworICBwcm90b2NvbF9sb2NfaXRlcmF0b3IgcHJvdG9jb2xfbG9jX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVmZXJlbmNlZFByb3RvY29scy5sb2NfZW5kKCk7CisgIH0KKworICBPYmpDQ2F0ZWdvcnlEZWNsICpnZXROZXh0Q2xhc3NDYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJuIE5leHRDbGFzc0NhdGVnb3J5OyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBzdG9yZWQgY2F0ZWdvcnkgKG9yIGV4dGVuc2lvbiksCisgIC8vLyB3aGljaCBtYXkgYmUgaGlkZGVuLgorICBPYmpDQ2F0ZWdvcnlEZWNsICpnZXROZXh0Q2xhc3NDYXRlZ29yeVJhdygpIGNvbnN0IHsKKyAgICByZXR1cm4gTmV4dENsYXNzQ2F0ZWdvcnk7CisgIH0KKworICBib29sIElzQ2xhc3NFeHRlbnNpb24oKSBjb25zdCB7IHJldHVybiBnZXRJZGVudGlmaWVyKCkgPT0gbnVsbHB0cjsgfQorCisgIHVzaW5nIGl2YXJfaXRlcmF0b3IgPSBzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPE9iakNJdmFyRGVjbD47CisgIHVzaW5nIGl2YXJfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPE9iakNJdmFyRGVjbD4+OworCisgIGl2YXJfcmFuZ2UgaXZhcnMoKSBjb25zdCB7IHJldHVybiBpdmFyX3JhbmdlKGl2YXJfYmVnaW4oKSwgaXZhcl9lbmQoKSk7IH0KKworICBpdmFyX2l0ZXJhdG9yIGl2YXJfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGl2YXJfaXRlcmF0b3IoZGVjbHNfYmVnaW4oKSk7CisgIH0KKworICBpdmFyX2l0ZXJhdG9yIGl2YXJfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBpdmFyX2l0ZXJhdG9yKGRlY2xzX2VuZCgpKTsKKyAgfQorCisgIHVuc2lnbmVkIGl2YXJfc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpkaXN0YW5jZShpdmFyX2JlZ2luKCksIGl2YXJfZW5kKCkpOworICB9CisKKyAgYm9vbCBpdmFyX2VtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBpdmFyX2JlZ2luKCkgPT0gaXZhcl9lbmQoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldENhdGVnb3J5TmFtZUxvYygpIGNvbnN0IHsgcmV0dXJuIENhdGVnb3J5TmFtZUxvYzsgfQorICB2b2lkIHNldENhdGVnb3J5TmFtZUxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgQ2F0ZWdvcnlOYW1lTG9jID0gTG9jOyB9CisgIAorICB2b2lkIHNldEl2YXJMQnJhY2VMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IEl2YXJMQnJhY2VMb2MgPSBMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0SXZhckxCcmFjZUxvYygpIGNvbnN0IHsgcmV0dXJuIEl2YXJMQnJhY2VMb2M7IH0KKyAgdm9pZCBzZXRJdmFyUkJyYWNlTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBJdmFyUkJyYWNlTG9jID0gTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldEl2YXJSQnJhY2VMb2MoKSBjb25zdCB7IHJldHVybiBJdmFyUkJyYWNlTG9jOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBPYmpDQ2F0ZWdvcnk7IH0KK307CisKK2NsYXNzIE9iakNJbXBsRGVjbCA6IHB1YmxpYyBPYmpDQ29udGFpbmVyRGVjbCB7CisgIC8vLyBDbGFzcyBpbnRlcmZhY2UgZm9yIHRoaXMgY2xhc3MvY2F0ZWdvcnkgaW1wbGVtZW50YXRpb24KKyAgT2JqQ0ludGVyZmFjZURlY2wgKkNsYXNzSW50ZXJmYWNlOworCisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgT2JqQ0ltcGxEZWNsKEtpbmQgREssIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgIE9iakNJbnRlcmZhY2VEZWNsICpjbGFzc0ludGVyZmFjZSwKKyAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpJZCwKKyAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIG5hbWVMb2MsIFNvdXJjZUxvY2F0aW9uIGF0U3RhcnRMb2MpCisgICAgICA6IE9iakNDb250YWluZXJEZWNsKERLLCBEQywgSWQsIG5hbWVMb2MsIGF0U3RhcnRMb2MpLAorICAgICAgICBDbGFzc0ludGVyZmFjZShjbGFzc0ludGVyZmFjZSkge30KKworcHVibGljOgorICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqZ2V0Q2xhc3NJbnRlcmZhY2UoKSBjb25zdCB7IHJldHVybiBDbGFzc0ludGVyZmFjZTsgfQorICBPYmpDSW50ZXJmYWNlRGVjbCAqZ2V0Q2xhc3NJbnRlcmZhY2UoKSB7IHJldHVybiBDbGFzc0ludGVyZmFjZTsgfQorICB2b2lkIHNldENsYXNzSW50ZXJmYWNlKE9iakNJbnRlcmZhY2VEZWNsICpJRmFjZSk7CisKKyAgdm9pZCBhZGRJbnN0YW5jZU1ldGhvZChPYmpDTWV0aG9kRGVjbCAqbWV0aG9kKSB7CisgICAgLy8gRklYTUU6IENvbnRleHQgc2hvdWxkIGJlIHNldCBjb3JyZWN0bHkgYmVmb3JlIHdlIGdldCBoZXJlLgorICAgIG1ldGhvZC0+c2V0TGV4aWNhbERlY2xDb250ZXh0KHRoaXMpOworICAgIGFkZERlY2wobWV0aG9kKTsKKyAgfQorCisgIHZvaWQgYWRkQ2xhc3NNZXRob2QoT2JqQ01ldGhvZERlY2wgKm1ldGhvZCkgeworICAgIC8vIEZJWE1FOiBDb250ZXh0IHNob3VsZCBiZSBzZXQgY29ycmVjdGx5IGJlZm9yZSB3ZSBnZXQgaGVyZS4KKyAgICBtZXRob2QtPnNldExleGljYWxEZWNsQ29udGV4dCh0aGlzKTsKKyAgICBhZGREZWNsKG1ldGhvZCk7CisgIH0KKworICB2b2lkIGFkZFByb3BlcnR5SW1wbGVtZW50YXRpb24oT2JqQ1Byb3BlcnR5SW1wbERlY2wgKnByb3BlcnR5KTsKKworICBPYmpDUHJvcGVydHlJbXBsRGVjbCAqRmluZFByb3BlcnR5SW1wbERlY2woSWRlbnRpZmllckluZm8gKnByb3BlcnR5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ1Byb3BlcnR5UXVlcnlLaW5kIHF1ZXJ5S2luZCkgY29uc3Q7CisgIE9iakNQcm9wZXJ0eUltcGxEZWNsICpGaW5kUHJvcGVydHlJbXBsSXZhckRlY2woSWRlbnRpZmllckluZm8gKml2YXJJZCkgY29uc3Q7CisKKyAgLy8gSXRlcmF0b3IgYWNjZXNzIHRvIHByb3BlcnRpZXMuCisgIHVzaW5nIHByb3BpbXBsX2l0ZXJhdG9yID0gc3BlY2lmaWNfZGVjbF9pdGVyYXRvcjxPYmpDUHJvcGVydHlJbXBsRGVjbD47CisgIHVzaW5nIHByb3BpbXBsX3JhbmdlID0KKyAgICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHNwZWNpZmljX2RlY2xfaXRlcmF0b3I8T2JqQ1Byb3BlcnR5SW1wbERlY2w+PjsKKworICBwcm9waW1wbF9yYW5nZSBwcm9wZXJ0eV9pbXBscygpIGNvbnN0IHsKKyAgICByZXR1cm4gcHJvcGltcGxfcmFuZ2UocHJvcGltcGxfYmVnaW4oKSwgcHJvcGltcGxfZW5kKCkpOworICB9CisKKyAgcHJvcGltcGxfaXRlcmF0b3IgcHJvcGltcGxfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIHByb3BpbXBsX2l0ZXJhdG9yKGRlY2xzX2JlZ2luKCkpOworICB9CisKKyAgcHJvcGltcGxfaXRlcmF0b3IgcHJvcGltcGxfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBwcm9waW1wbF9pdGVyYXRvcihkZWNsc19lbmQoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsKKyAgICByZXR1cm4gSyA+PSBmaXJzdE9iakNJbXBsICYmIEsgPD0gbGFzdE9iakNJbXBsOworICB9Cit9OworCisvLy8gT2JqQ0NhdGVnb3J5SW1wbERlY2wgLSBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgYSBjYXRlZ29yeQorLy8vIFxAaW1wbGVtZW50YXRpb24gZGVjbGFyYXRpb24uIElmIGEgY2F0ZWdvcnkgY2xhc3MgaGFzIGRlY2xhcmF0aW9uIG9mIGEKKy8vLyBwcm9wZXJ0eSwgaXRzIGltcGxlbWVudGF0aW9uIG11c3QgYmUgc3BlY2lmaWVkIGluIHRoZSBjYXRlZ29yeSdzCisvLy8gXEBpbXBsZW1lbnRhdGlvbiBkZWNsYXJhdGlvbi4gRXhhbXBsZToKKy8vLyBcQGludGVyZmFjZSBJIFxAZW5kCisvLy8gXEBpbnRlcmZhY2UgSShDQVRFR09SWSkKKy8vLyAgICBcQHByb3BlcnR5IGludCBwMSwgZDE7CisvLy8gXEBlbmQKKy8vLyBcQGltcGxlbWVudGF0aW9uIEkoQ0FURUdPUlkpCisvLy8gIFxAZHluYW1pYyBwMSxkMTsKKy8vLyBcQGVuZAorLy8vCisvLy8gT2JqQ0NhdGVnb3J5SW1wbERlY2wKK2NsYXNzIE9iakNDYXRlZ29yeUltcGxEZWNsIDogcHVibGljIE9iakNJbXBsRGVjbCB7CisgIC8vIENhdGVnb3J5IG5hbWUgbG9jYXRpb24KKyAgU291cmNlTG9jYXRpb24gQ2F0ZWdvcnlOYW1lTG9jOworCisgIE9iakNDYXRlZ29yeUltcGxEZWNsKERlY2xDb250ZXh0ICpEQywgSWRlbnRpZmllckluZm8gKklkLAorICAgICAgICAgICAgICAgICAgICAgICBPYmpDSW50ZXJmYWNlRGVjbCAqY2xhc3NJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIG5hbWVMb2MsIFNvdXJjZUxvY2F0aW9uIGF0U3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENhdGVnb3J5TmFtZUxvYykKKyAgICAgIDogT2JqQ0ltcGxEZWNsKE9iakNDYXRlZ29yeUltcGwsIERDLCBjbGFzc0ludGVyZmFjZSwgSWQsCisgICAgICAgICAgICAgICAgICAgICBuYW1lTG9jLCBhdFN0YXJ0TG9jKSwKKyAgICAgICAgQ2F0ZWdvcnlOYW1lTG9jKENhdGVnb3J5TmFtZUxvYykge30KKworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNURGVjbFdyaXRlcjsKKworICBzdGF0aWMgT2JqQ0NhdGVnb3J5SW1wbERlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ludGVyZmFjZURlY2wgKmNsYXNzSW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBuYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBhdFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDYXRlZ29yeU5hbWVMb2MpOworICBzdGF0aWMgT2JqQ0NhdGVnb3J5SW1wbERlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisKKyAgT2JqQ0NhdGVnb3J5RGVjbCAqZ2V0Q2F0ZWdvcnlEZWNsKCkgY29uc3Q7CisKKyAgU291cmNlTG9jYXRpb24gZ2V0Q2F0ZWdvcnlOYW1lTG9jKCkgY29uc3QgeyByZXR1cm4gQ2F0ZWdvcnlOYW1lTG9jOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBPYmpDQ2F0ZWdvcnlJbXBsO30KK307CisKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgT2JqQ0NhdGVnb3J5SW1wbERlY2wgJkNJRCk7CisKKy8vLyBPYmpDSW1wbGVtZW50YXRpb25EZWNsIC0gUmVwcmVzZW50cyBhIGNsYXNzIGRlZmluaXRpb24gLSB0aGlzIGlzIHdoZXJlCisvLy8gbWV0aG9kIGRlZmluaXRpb25zIGFyZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlOgorLy8vCisvLy8gQGNvZGUKKy8vLyBcQGltcGxlbWVudGF0aW9uIE15Q2xhc3MKKy8vLyAtICh2b2lkKW15TWV0aG9kIHsgLyogZG8gc29tZXRoaW5nICovIH0KKy8vLyBcQGVuZAorLy8vIEBlbmRjb2RlCisvLy8KKy8vLyBJbiBhIG5vbi1mcmFnaWxlIHJ1bnRpbWUsIGluc3RhbmNlIHZhcmlhYmxlcyBjYW4gYXBwZWFyIGluIHRoZSBjbGFzcworLy8vIGludGVyZmFjZSwgY2xhc3MgZXh0ZW5zaW9ucyAobmFtZWxlc3MgY2F0ZWdvcmllcyksIGFuZCBpbiB0aGUgaW1wbGVtZW50YXRpb24KKy8vLyBpdHNlbGYsIGFzIHdlbGwgYXMgYmVpbmcgc3ludGhlc2l6ZWQgYXMgYmFja2luZyBzdG9yYWdlIGZvciBwcm9wZXJ0aWVzLgorLy8vCisvLy8gSW4gYSBmcmFnaWxlIHJ1bnRpbWUsIGluc3RhbmNlIHZhcmlhYmxlcyBhcmUgc3BlY2lmaWVkIGluIHRoZSBjbGFzcworLy8vIGludGVyZmFjZSwgXGVtIG5vdCBpbiB0aGUgaW1wbGVtZW50YXRpb24uIE5ldmVydGhlbGVzcyAoZm9yIGxlZ2FjeSByZWFzb25zKSwKKy8vLyB3ZSBhbGxvdyBpbnN0YW5jZSB2YXJpYWJsZXMgdG8gYmUgc3BlY2lmaWVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbi4gV2hlbgorLy8vIHNwZWNpZmllZCwgdGhleSBuZWVkIHRvIGJlIFxlbSBpZGVudGljYWwgdG8gdGhlIGludGVyZmFjZS4KK2NsYXNzIE9iakNJbXBsZW1lbnRhdGlvbkRlY2wgOiBwdWJsaWMgT2JqQ0ltcGxEZWNsIHsKKyAgLy8vIEltcGxlbWVudGF0aW9uIENsYXNzJ3Mgc3VwZXIgY2xhc3MuCisgIE9iakNJbnRlcmZhY2VEZWNsICpTdXBlckNsYXNzOworICBTb3VyY2VMb2NhdGlvbiBTdXBlckxvYzsKKworICAvLy8gXEBpbXBsZW1lbnRhdGlvbiBtYXkgaGF2ZSBwcml2YXRlIGl2YXJzLgorICBTb3VyY2VMb2NhdGlvbiBJdmFyTEJyYWNlTG9jOworICBTb3VyY2VMb2NhdGlvbiBJdmFyUkJyYWNlTG9jOworICAKKyAgLy8vIFN1cHBvcnQgZm9yIGl2YXIgaW5pdGlhbGl6YXRpb24uCisgIC8vLyBcYnJpZWYgVGhlIGFyZ3VtZW50cyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGl2YXJzCisgIExhenlDWFhDdG9ySW5pdGlhbGl6ZXJzUHRyIEl2YXJJbml0aWFsaXplcnM7CisgIHVuc2lnbmVkIE51bUl2YXJJbml0aWFsaXplcnMgPSAwOworCisgIC8vLyBEbyB0aGUgaXZhcnMgb2YgdGhpcyBjbGFzcyByZXF1aXJlIGluaXRpYWxpemF0aW9uIG90aGVyIHRoYW4KKyAgLy8vIHplcm8taW5pdGlhbGl6YXRpb24/CisgIGJvb2wgSGFzTm9uWmVyb0NvbnN0cnVjdG9ycyA6IDE7CisKKyAgLy8vIERvIHRoZSBpdmFycyBvZiB0aGlzIGNsYXNzIHJlcXVpcmUgbm9uLXRyaXZpYWwgZGVzdHJ1Y3Rpb24/CisgIGJvb2wgSGFzRGVzdHJ1Y3RvcnMgOiAxOworCisgIE9iakNJbXBsZW1lbnRhdGlvbkRlY2woRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNJbnRlcmZhY2VEZWNsICpjbGFzc0ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDSW50ZXJmYWNlRGVjbCAqc3VwZXJEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIG5hbWVMb2MsIFNvdXJjZUxvY2F0aW9uIGF0U3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gc3VwZXJMb2MgPSBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEl2YXJMQnJhY2VMb2M9U291cmNlTG9jYXRpb24oKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSXZhclJCcmFjZUxvYz1Tb3VyY2VMb2NhdGlvbigpKQorICAgICAgOiBPYmpDSW1wbERlY2woT2JqQ0ltcGxlbWVudGF0aW9uLCBEQywgY2xhc3NJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICBjbGFzc0ludGVyZmFjZSA/IGNsYXNzSW50ZXJmYWNlLT5nZXRJZGVudGlmaWVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWVMb2MsIGF0U3RhcnRMb2MpLAorICAgICAgICAgU3VwZXJDbGFzcyhzdXBlckRlY2wpLCBTdXBlckxvYyhzdXBlckxvYyksCisgICAgICAgICBJdmFyTEJyYWNlTG9jKEl2YXJMQnJhY2VMb2MpLCBJdmFyUkJyYWNlTG9jKEl2YXJSQnJhY2VMb2MpLAorICAgICAgICAgSGFzTm9uWmVyb0NvbnN0cnVjdG9ycyhmYWxzZSksIEhhc0Rlc3RydWN0b3JzKGZhbHNlKSB7fQorCisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsV3JpdGVyOworCisgIHN0YXRpYyBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNJbnRlcmZhY2VEZWNsICpjbGFzc0ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDSW50ZXJmYWNlRGVjbCAqc3VwZXJEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIG5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gYXRTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBzdXBlckxvYyA9IFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSXZhckxCcmFjZUxvYz1Tb3VyY2VMb2NhdGlvbigpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJdmFyUkJyYWNlTG9jPVNvdXJjZUxvY2F0aW9uKCkpOworCisgIHN0YXRpYyBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOworCisgIC8vLyBpbml0X2l0ZXJhdG9yIC0gSXRlcmF0ZXMgdGhyb3VnaCB0aGUgaXZhciBpbml0aWFsaXplciBsaXN0LgorICB1c2luZyBpbml0X2l0ZXJhdG9yID0gQ1hYQ3RvckluaXRpYWxpemVyICoqOworCisgIC8vLyBpbml0X2NvbnN0X2l0ZXJhdG9yIC0gSXRlcmF0ZXMgdGhyb3VnaCB0aGUgaXZhciBpbml0aWFsaXplciBsaXN0LgorICB1c2luZyBpbml0X2NvbnN0X2l0ZXJhdG9yID0gQ1hYQ3RvckluaXRpYWxpemVyICogY29uc3QgKjsKKworICB1c2luZyBpbml0X3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8aW5pdF9pdGVyYXRvcj47CisgIHVzaW5nIGluaXRfY29uc3RfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxpbml0X2NvbnN0X2l0ZXJhdG9yPjsKKworICBpbml0X3JhbmdlIGluaXRzKCkgeyByZXR1cm4gaW5pdF9yYW5nZShpbml0X2JlZ2luKCksIGluaXRfZW5kKCkpOyB9CisKKyAgaW5pdF9jb25zdF9yYW5nZSBpbml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gaW5pdF9jb25zdF9yYW5nZShpbml0X2JlZ2luKCksIGluaXRfZW5kKCkpOworICB9CisKKyAgLy8vIGluaXRfYmVnaW4oKSAtIFJldHJpZXZlIGFuIGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBpbml0aWFsaXplci4KKyAgaW5pdF9pdGVyYXRvciBpbml0X2JlZ2luKCkgeworICAgIGNvbnN0IGF1dG8gKkNvbnN0VGhpcyA9IHRoaXM7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8aW5pdF9pdGVyYXRvcj4oQ29uc3RUaGlzLT5pbml0X2JlZ2luKCkpOworICB9CisKKyAgLy8vIGJlZ2luKCkgLSBSZXRyaWV2ZSBhbiBpdGVyYXRvciB0byB0aGUgZmlyc3QgaW5pdGlhbGl6ZXIuCisgIGluaXRfY29uc3RfaXRlcmF0b3IgaW5pdF9iZWdpbigpIGNvbnN0OworCisgIC8vLyBpbml0X2VuZCgpIC0gUmV0cmlldmUgYW4gaXRlcmF0b3IgcGFzdCB0aGUgbGFzdCBpbml0aWFsaXplci4KKyAgaW5pdF9pdGVyYXRvciAgICAgICBpbml0X2VuZCgpICAgICAgIHsKKyAgICByZXR1cm4gaW5pdF9iZWdpbigpICsgTnVtSXZhckluaXRpYWxpemVyczsKKyAgfQorCisgIC8vLyBlbmQoKSAtIFJldHJpZXZlIGFuIGl0ZXJhdG9yIHBhc3QgdGhlIGxhc3QgaW5pdGlhbGl6ZXIuCisgIGluaXRfY29uc3RfaXRlcmF0b3IgaW5pdF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGluaXRfYmVnaW4oKSArIE51bUl2YXJJbml0aWFsaXplcnM7CisgIH0KKworICAvLy8gZ2V0TnVtQXJncyAtIE51bWJlciBvZiBpdmFycyB3aGljaCBtdXN0IGJlIGluaXRpYWxpemVkLgorICB1bnNpZ25lZCBnZXROdW1JdmFySW5pdGlhbGl6ZXJzKCkgY29uc3QgeworICAgIHJldHVybiBOdW1JdmFySW5pdGlhbGl6ZXJzOworICB9CisKKyAgdm9pZCBzZXROdW1JdmFySW5pdGlhbGl6ZXJzKHVuc2lnbmVkIG51bU51bUl2YXJJbml0aWFsaXplcnMpIHsKKyAgICBOdW1JdmFySW5pdGlhbGl6ZXJzID0gbnVtTnVtSXZhckluaXRpYWxpemVyczsKKyAgfQorCisgIHZvaWQgc2V0SXZhckluaXRpYWxpemVycyhBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ3RvckluaXRpYWxpemVyICoqIGluaXRpYWxpemVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bUluaXRpYWxpemVycyk7CisKKyAgLy8vIERvIGFueSBvZiB0aGUgaXZhcnMgb2YgdGhpcyBjbGFzcyAobm90IGNvdW50aW5nIGl0cyBiYXNlIGNsYXNzZXMpCisgIC8vLyByZXF1aXJlIGNvbnN0cnVjdGlvbiBvdGhlciB0aGFuIHplcm8taW5pdGlhbGl6YXRpb24/CisgIGJvb2wgaGFzTm9uWmVyb0NvbnN0cnVjdG9ycygpIGNvbnN0IHsgcmV0dXJuIEhhc05vblplcm9Db25zdHJ1Y3RvcnM7IH0KKyAgdm9pZCBzZXRIYXNOb25aZXJvQ29uc3RydWN0b3JzKGJvb2wgdmFsKSB7IEhhc05vblplcm9Db25zdHJ1Y3RvcnMgPSB2YWw7IH0KKworICAvLy8gRG8gYW55IG9mIHRoZSBpdmFycyBvZiB0aGlzIGNsYXNzIChub3QgY291bnRpbmcgaXRzIGJhc2UgY2xhc3NlcykKKyAgLy8vIHJlcXVpcmUgbm9uLXRyaXZpYWwgZGVzdHJ1Y3Rpb24/CisgIGJvb2wgaGFzRGVzdHJ1Y3RvcnMoKSBjb25zdCB7IHJldHVybiBIYXNEZXN0cnVjdG9yczsgfQorICB2b2lkIHNldEhhc0Rlc3RydWN0b3JzKGJvb2wgdmFsKSB7IEhhc0Rlc3RydWN0b3JzID0gdmFsOyB9CisKKyAgLy8vIGdldElkZW50aWZpZXIgLSBHZXQgdGhlIGlkZW50aWZpZXIgdGhhdCBuYW1lcyB0aGUgY2xhc3MKKyAgLy8vIGludGVyZmFjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgSWRlbnRpZmllckluZm8gKmdldElkZW50aWZpZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldENsYXNzSW50ZXJmYWNlKCktPmdldElkZW50aWZpZXIoKTsKKyAgfQorCisgIC8vLyBnZXROYW1lIC0gR2V0IHRoZSBuYW1lIG9mIGlkZW50aWZpZXIgZm9yIHRoZSBjbGFzcyBpbnRlcmZhY2UgYXNzb2NpYXRlZAorICAvLy8gd2l0aCB0aGlzIGltcGxlbWVudGF0aW9uIGFzIGEgU3RyaW5nUmVmLgorICAvLworICAvLyBGSVhNRTogVGhpcyBpcyBhIGJhZCBBUEksIHdlIGFyZSBoaWRpbmcgTmFtZWREZWNsOjpnZXROYW1lIHdpdGggYSBkaWZmZXJlbnQKKyAgLy8gbWVhbmluZy4KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldElkZW50aWZpZXIoKSAmJiAiTmFtZSBpcyBub3QgYSBzaW1wbGUgaWRlbnRpZmllciIpOworICAgIHJldHVybiBnZXRJZGVudGlmaWVyKCktPmdldE5hbWUoKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnRlcmZhY2UuCisgIC8vCisgIC8vIEZJWE1FOiBNb3ZlIHRvIFN0cmluZ1JlZiBBUEkuCisgIHN0ZDo6c3RyaW5nIGdldE5hbWVBc1N0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TmFtZSgpOworICB9CisgICAgCisgIC8vLyBQcm9kdWNlIGEgbmFtZSB0byBiZSB1c2VkIGZvciBjbGFzcydzIG1ldGFkYXRhLiBJdCBjb21lcyBlaXRoZXIgdmlhCisgIC8vLyBjbGFzcydzIG9iamNfcnVudGltZV9uYW1lIGF0dHJpYnV0ZSBvciBjbGFzcyBuYW1lLgorICBTdHJpbmdSZWYgZ2V0T2JqQ1J1bnRpbWVOYW1lQXNTdHJpbmcoKSBjb25zdDsKKworICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqZ2V0U3VwZXJDbGFzcygpIGNvbnN0IHsgcmV0dXJuIFN1cGVyQ2xhc3M7IH0KKyAgT2JqQ0ludGVyZmFjZURlY2wgKmdldFN1cGVyQ2xhc3MoKSB7IHJldHVybiBTdXBlckNsYXNzOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldFN1cGVyQ2xhc3NMb2MoKSBjb25zdCB7IHJldHVybiBTdXBlckxvYzsgfQorCisgIHZvaWQgc2V0U3VwZXJDbGFzcyhPYmpDSW50ZXJmYWNlRGVjbCAqIHN1cGVyQ2xzKSB7IFN1cGVyQ2xhc3MgPSBzdXBlckNsczsgfQorCisgIHZvaWQgc2V0SXZhckxCcmFjZUxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgSXZhckxCcmFjZUxvYyA9IExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRJdmFyTEJyYWNlTG9jKCkgY29uc3QgeyByZXR1cm4gSXZhckxCcmFjZUxvYzsgfQorICB2b2lkIHNldEl2YXJSQnJhY2VMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IEl2YXJSQnJhY2VMb2MgPSBMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0SXZhclJCcmFjZUxvYygpIGNvbnN0IHsgcmV0dXJuIEl2YXJSQnJhY2VMb2M7IH0KKyAgCisgIHVzaW5nIGl2YXJfaXRlcmF0b3IgPSBzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPE9iakNJdmFyRGVjbD47CisgIHVzaW5nIGl2YXJfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPE9iakNJdmFyRGVjbD4+OworCisgIGl2YXJfcmFuZ2UgaXZhcnMoKSBjb25zdCB7IHJldHVybiBpdmFyX3JhbmdlKGl2YXJfYmVnaW4oKSwgaXZhcl9lbmQoKSk7IH0KKworICBpdmFyX2l0ZXJhdG9yIGl2YXJfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGl2YXJfaXRlcmF0b3IoZGVjbHNfYmVnaW4oKSk7CisgIH0KKworICBpdmFyX2l0ZXJhdG9yIGl2YXJfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBpdmFyX2l0ZXJhdG9yKGRlY2xzX2VuZCgpKTsKKyAgfQorCisgIHVuc2lnbmVkIGl2YXJfc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpkaXN0YW5jZShpdmFyX2JlZ2luKCksIGl2YXJfZW5kKCkpOworICB9CisKKyAgYm9vbCBpdmFyX2VtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBpdmFyX2JlZ2luKCkgPT0gaXZhcl9lbmQoKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gT2JqQ0ltcGxlbWVudGF0aW9uOyB9Cit9OworCityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE9iakNJbXBsZW1lbnRhdGlvbkRlY2wgJklEKTsKKworLy8vIE9iakNDb21wYXRpYmxlQWxpYXNEZWNsIC0gUmVwcmVzZW50cyBhbGlhcyBvZiBhIGNsYXNzLiBUaGlzIGFsaWFzIGlzCisvLy8gZGVjbGFyZWQgYXMgXEBjb21wYXRpYmlsaXR5X2FsaWFzIGFsaWFzIGNsYXNzLgorY2xhc3MgT2JqQ0NvbXBhdGlibGVBbGlhc0RlY2wgOiBwdWJsaWMgTmFtZWREZWNsIHsKKyAgLy8vIENsYXNzIHRoYXQgdGhpcyBpcyBhbiBhbGlhcyBvZi4KKyAgT2JqQ0ludGVyZmFjZURlY2wgKkFsaWFzZWRDbGFzczsKKworICBPYmpDQ29tcGF0aWJsZUFsaWFzRGVjbChEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIEwsIElkZW50aWZpZXJJbmZvICpJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ludGVyZmFjZURlY2wqIGFsaWFzZWRDbGFzcykKKyAgICAgIDogTmFtZWREZWNsKE9iakNDb21wYXRpYmxlQWxpYXMsIERDLCBMLCBJZCksIEFsaWFzZWRDbGFzcyhhbGlhc2VkQ2xhc3MpIHt9CisKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBzdGF0aWMgT2JqQ0NvbXBhdGlibGVBbGlhc0RlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEwsIElkZW50aWZpZXJJbmZvICpJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ludGVyZmFjZURlY2wqIGFsaWFzZWRDbGFzcyk7CisKKyAgc3RhdGljIE9iakNDb21wYXRpYmxlQWxpYXNEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElEKTsKKyAgCisgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpnZXRDbGFzc0ludGVyZmFjZSgpIGNvbnN0IHsgcmV0dXJuIEFsaWFzZWRDbGFzczsgfQorICBPYmpDSW50ZXJmYWNlRGVjbCAqZ2V0Q2xhc3NJbnRlcmZhY2UoKSB7IHJldHVybiBBbGlhc2VkQ2xhc3M7IH0KKyAgdm9pZCBzZXRDbGFzc0ludGVyZmFjZShPYmpDSW50ZXJmYWNlRGVjbCAqRCkgeyBBbGlhc2VkQ2xhc3MgPSBEOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBPYmpDQ29tcGF0aWJsZUFsaWFzOyB9Cit9OworCisvLy8gT2JqQ1Byb3BlcnR5SW1wbERlY2wgLSBSZXByZXNlbnRzIGltcGxlbWVudGF0aW9uIGRlY2xhcmF0aW9uIG9mIGEgcHJvcGVydHkKKy8vLyBpbiBhIGNsYXNzIG9yIGNhdGVnb3J5IGltcGxlbWVudGF0aW9uIGJsb2NrLiBGb3IgZXhhbXBsZToKKy8vLyBcQHN5bnRoZXNpemUgcHJvcDEgPSBpdmFyMTsKKy8vLworY2xhc3MgT2JqQ1Byb3BlcnR5SW1wbERlY2wgOiBwdWJsaWMgRGVjbCB7CitwdWJsaWM6CisgIGVudW0gS2luZCB7CisgICAgU3ludGhlc2l6ZSwKKyAgICBEeW5hbWljCisgIH07CisKK3ByaXZhdGU6CisgIFNvdXJjZUxvY2F0aW9uIEF0TG9jOyAgIC8vIGxvY2F0aW9uIG9mIFxAc3ludGhlc2l6ZSBvciBcQGR5bmFtaWMKKworICAvLy8gXGJyaWVmIEZvciBcQHN5bnRoZXNpemUsIHRoZSBsb2NhdGlvbiBvZiB0aGUgaXZhciwgaWYgaXQgd2FzIHdyaXR0ZW4gaW4KKyAgLy8vIHRoZSBzb3VyY2UgY29kZS4KKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gXEBzeW50aGVzaXplIGludCBhID0gYgorICAvLy8gXGVuZGNvZGUKKyAgU291cmNlTG9jYXRpb24gSXZhckxvYzsKKworICAvLy8gUHJvcGVydHkgZGVjbGFyYXRpb24gYmVpbmcgaW1wbGVtZW50ZWQKKyAgT2JqQ1Byb3BlcnR5RGVjbCAqUHJvcGVydHlEZWNsOworCisgIC8vLyBOdWxsIGZvciBcQGR5bmFtaWMuIFJlcXVpcmVkIGZvciBcQHN5bnRoZXNpemUuCisgIE9iakNJdmFyRGVjbCAqUHJvcGVydHlJdmFyRGVjbDsKKworICAvLy8gTnVsbCBmb3IgXEBkeW5hbWljLiBOb24tbnVsbCBpZiBwcm9wZXJ0eSBtdXN0IGJlIGNvcHktY29uc3RydWN0ZWQgaW4KKyAgLy8vIGdldHRlci4KKyAgRXhwciAqR2V0dGVyQ1hYQ29uc3RydWN0b3IgPSBudWxscHRyOworCisgIC8vLyBOdWxsIGZvciBcQGR5bmFtaWMuIE5vbi1udWxsIGlmIHByb3BlcnR5IGhhcyBhc3NpZ25tZW50IG9wZXJhdG9yIHRvIGNhbGwKKyAgLy8vIGluIFNldHRlciBzeW50aGVzaXMuCisgIEV4cHIgKlNldHRlckNYWEFzc2lnbm1lbnQgPSBudWxscHRyOworCisgIE9iakNQcm9wZXJ0eUltcGxEZWNsKERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gYXRMb2MsIFNvdXJjZUxvY2F0aW9uIEwsCisgICAgICAgICAgICAgICAgICAgICAgIE9iakNQcm9wZXJ0eURlY2wgKnByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICBLaW5kIFBLLAorICAgICAgICAgICAgICAgICAgICAgICBPYmpDSXZhckRlY2wgKml2YXJEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBpdmFyTG9jKQorICAgICAgOiBEZWNsKE9iakNQcm9wZXJ0eUltcGwsIERDLCBMKSwgQXRMb2MoYXRMb2MpLAorICAgICAgICBJdmFyTG9jKGl2YXJMb2MpLCBQcm9wZXJ0eURlY2wocHJvcGVydHkpLCBQcm9wZXJ0eUl2YXJEZWNsKGl2YXJEZWNsKSB7CisgICAgYXNzZXJ0KFBLID09IER5bmFtaWMgfHwgUHJvcGVydHlJdmFyRGVjbCk7CisgIH0KKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKworICBzdGF0aWMgT2JqQ1Byb3BlcnR5SW1wbERlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIGF0TG9jLCBTb3VyY2VMb2NhdGlvbiBMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDUHJvcGVydHlEZWNsICpwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2luZCBQSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0l2YXJEZWNsICppdmFyRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gaXZhckxvYyk7CisKKyAgc3RhdGljIE9iakNQcm9wZXJ0eUltcGxEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOworCisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWTsKKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gQXRMb2M7IH0KKyAgdm9pZCBzZXRBdExvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgQXRMb2MgPSBMb2M7IH0KKworICBPYmpDUHJvcGVydHlEZWNsICpnZXRQcm9wZXJ0eURlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIFByb3BlcnR5RGVjbDsKKyAgfQorICB2b2lkIHNldFByb3BlcnR5RGVjbChPYmpDUHJvcGVydHlEZWNsICpQcm9wKSB7IFByb3BlcnR5RGVjbCA9IFByb3A7IH0KKworICBLaW5kIGdldFByb3BlcnR5SW1wbGVtZW50YXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIFByb3BlcnR5SXZhckRlY2wgPyBTeW50aGVzaXplIDogRHluYW1pYzsKKyAgfQorCisgIE9iakNJdmFyRGVjbCAqZ2V0UHJvcGVydHlJdmFyRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJvcGVydHlJdmFyRGVjbDsKKyAgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRQcm9wZXJ0eUl2YXJEZWNsTG9jKCkgY29uc3QgeyByZXR1cm4gSXZhckxvYzsgfQorCisgIHZvaWQgc2V0UHJvcGVydHlJdmFyRGVjbChPYmpDSXZhckRlY2wgKkl2YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJdmFyTG9jKSB7CisgICAgUHJvcGVydHlJdmFyRGVjbCA9IEl2YXI7CisgICAgdGhpcy0+SXZhckxvYyA9IEl2YXJMb2M7CisgIH0KKworICAvLy8gXGJyaWVmIEZvciBcQHN5bnRoZXNpemUsIHJldHVybnMgdHJ1ZSBpZiBhbiBpdmFyIG5hbWUgd2FzIGV4cGxpY2l0bHkKKyAgLy8vIHNwZWNpZmllZC4KKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gXEBzeW50aGVzaXplIGludCBhID0gYjsgLy8gdHJ1ZQorICAvLy8gXEBzeW50aGVzaXplIGludCBhOyAvLyBmYWxzZQorICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBpc0l2YXJOYW1lU3BlY2lmaWVkKCkgY29uc3QgeworICAgIHJldHVybiBJdmFyTG9jLmlzVmFsaWQoKSAmJiBJdmFyTG9jICE9IGdldExvY2F0aW9uKCk7CisgIH0KKworICBFeHByICpnZXRHZXR0ZXJDWFhDb25zdHJ1Y3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0dGVyQ1hYQ29uc3RydWN0b3I7CisgIH0KKworICB2b2lkIHNldEdldHRlckNYWENvbnN0cnVjdG9yKEV4cHIgKmdldHRlckNYWENvbnN0cnVjdG9yKSB7CisgICAgR2V0dGVyQ1hYQ29uc3RydWN0b3IgPSBnZXR0ZXJDWFhDb25zdHJ1Y3RvcjsKKyAgfQorCisgIEV4cHIgKmdldFNldHRlckNYWEFzc2lnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIFNldHRlckNYWEFzc2lnbm1lbnQ7CisgIH0KKworICB2b2lkIHNldFNldHRlckNYWEFzc2lnbm1lbnQoRXhwciAqc2V0dGVyQ1hYQXNzaWdubWVudCkgeworICAgIFNldHRlckNYWEFzc2lnbm1lbnQgPSBzZXR0ZXJDWFhBc3NpZ25tZW50OworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKERlY2w6OktpbmQgSykgeyByZXR1cm4gSyA9PSBPYmpDUHJvcGVydHlJbXBsOyB9Cit9OworCit0ZW1wbGF0ZTxib29sICgqRmlsdGVyKShPYmpDQ2F0ZWdvcnlEZWNsICopPgordm9pZAorT2JqQ0ludGVyZmFjZURlY2w6OmZpbHRlcmVkX2NhdGVnb3J5X2l0ZXJhdG9yPEZpbHRlcj46OgorZmluZEFjY2VwdGFibGVDYXRlZ29yeSgpIHsKKyAgd2hpbGUgKEN1cnJlbnQgJiYgIUZpbHRlcihDdXJyZW50KSkKKyAgICBDdXJyZW50ID0gQ3VycmVudC0+Z2V0TmV4dENsYXNzQ2F0ZWdvcnlSYXcoKTsKK30KKwordGVtcGxhdGU8Ym9vbCAoKkZpbHRlcikoT2JqQ0NhdGVnb3J5RGVjbCAqKT4KK2lubGluZSBPYmpDSW50ZXJmYWNlRGVjbDo6ZmlsdGVyZWRfY2F0ZWdvcnlfaXRlcmF0b3I8RmlsdGVyPiAmCitPYmpDSW50ZXJmYWNlRGVjbDo6ZmlsdGVyZWRfY2F0ZWdvcnlfaXRlcmF0b3I8RmlsdGVyPjo6b3BlcmF0b3IrKygpIHsKKyAgQ3VycmVudCA9IEN1cnJlbnQtPmdldE5leHRDbGFzc0NhdGVnb3J5UmF3KCk7CisgIGZpbmRBY2NlcHRhYmxlQ2F0ZWdvcnkoKTsKKyAgcmV0dXJuICp0aGlzOworfQorCitpbmxpbmUgYm9vbCBPYmpDSW50ZXJmYWNlRGVjbDo6aXNWaXNpYmxlQ2F0ZWdvcnkoT2JqQ0NhdGVnb3J5RGVjbCAqQ2F0KSB7CisgIHJldHVybiAhQ2F0LT5pc0hpZGRlbigpOworfQorCitpbmxpbmUgYm9vbCBPYmpDSW50ZXJmYWNlRGVjbDo6aXNWaXNpYmxlRXh0ZW5zaW9uKE9iakNDYXRlZ29yeURlY2wgKkNhdCkgeworICByZXR1cm4gQ2F0LT5Jc0NsYXNzRXh0ZW5zaW9uKCkgJiYgIUNhdC0+aXNIaWRkZW4oKTsKK30KKworaW5saW5lIGJvb2wgT2JqQ0ludGVyZmFjZURlY2w6OmlzS25vd25FeHRlbnNpb24oT2JqQ0NhdGVnb3J5RGVjbCAqQ2F0KSB7CisgIHJldHVybiBDYXQtPklzQ2xhc3NFeHRlbnNpb24oKTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUX0RFQ0xPQkpDX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsT3Blbk1QLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbE9wZW5NUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZmJlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbE9wZW5NUC5oCkBAIC0wLDAgKzEsMjE0IEBACisvLz09PS0gRGVjbE9wZW5NUC5oIC0gQ2xhc3NlcyBmb3IgcmVwcmVzZW50aW5nIE9wZW5NUCBkaXJlY3RpdmVzIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIFRoaXMgZmlsZSBkZWZpbmVzIE9wZW5NUCBub2RlcyBmb3IgZGVjbGFyYXRpdmUgZGlyZWN0aXZlcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9ERUNMT1BFTk1QX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfREVDTE9QRU5NUF9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0V4dGVybmFsQVNUU291cmNlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9UcmFpbGluZ09iamVjdHMuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUgLi4uJyBkaXJlY3RpdmUuCisvLy8gRm9yIGV4YW1wbGUsIGluIHRoZSBmb2xsb3dpbmcsIGJvdGggJ2EnIGFuZCAnQTo6YicgYXJlIHRocmVhZHByaXZhdGU6CisvLy8KKy8vLyBcY29kZQorLy8vIGludCBhOworLy8vICNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoYSkKKy8vLyBzdHJ1Y3QgQSB7CisvLy8gICBzdGF0aWMgaW50IGI7CisvLy8gI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShiKQorLy8vIH07CisvLy8gXGVuZGNvZGUKKy8vLworY2xhc3MgT01QVGhyZWFkUHJpdmF0ZURlY2wgZmluYWwKKyAgICA6IHB1YmxpYyBEZWNsLAorICAgICAgcHJpdmF0ZSBsbHZtOjpUcmFpbGluZ09iamVjdHM8T01QVGhyZWFkUHJpdmF0ZURlY2wsIEV4cHIgKj4geworICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKworICB1bnNpZ25lZCBOdW1WYXJzOworCisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworICBPTVBUaHJlYWRQcml2YXRlRGVjbChLaW5kIERLLCBEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIEwpIDoKKyAgICBEZWNsKERLLCBEQywgTCksIE51bVZhcnMoMCkgeyB9CisKKyAgQXJyYXlSZWY8Y29uc3QgRXhwciAqPiBnZXRWYXJzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoZ2V0VHJhaWxpbmdPYmplY3RzPEV4cHIgKj4oKSwgTnVtVmFycyk7CisgIH0KKworICBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPiBnZXRWYXJzKCkgeworICAgIHJldHVybiBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPihnZXRUcmFpbGluZ09iamVjdHM8RXhwciAqPigpLCBOdW1WYXJzKTsKKyAgfQorCisgIHZvaWQgc2V0VmFycyhBcnJheVJlZjxFeHByICo+IFZMKTsKKworcHVibGljOgorICBzdGF0aWMgT01QVGhyZWFkUHJpdmF0ZURlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gVkwpOworICBzdGF0aWMgT01QVGhyZWFkUHJpdmF0ZURlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJRCwgdW5zaWduZWQgTik7CisKKyAgdHlwZWRlZiBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPjo6aXRlcmF0b3IgdmFybGlzdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBBcnJheVJlZjxjb25zdCBFeHByICo+OjppdGVyYXRvciB2YXJsaXN0X2NvbnN0X2l0ZXJhdG9yOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHZhcmxpc3RfaXRlcmF0b3I+IHZhcmxpc3RfcmFuZ2U7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8dmFybGlzdF9jb25zdF9pdGVyYXRvcj4gdmFybGlzdF9jb25zdF9yYW5nZTsKKworICB1bnNpZ25lZCB2YXJsaXN0X3NpemUoKSBjb25zdCB7IHJldHVybiBOdW1WYXJzOyB9CisgIGJvb2wgdmFybGlzdF9lbXB0eSgpIGNvbnN0IHsgcmV0dXJuIE51bVZhcnMgPT0gMDsgfQorCisgIHZhcmxpc3RfcmFuZ2UgdmFybGlzdHMoKSB7CisgICAgcmV0dXJuIHZhcmxpc3RfcmFuZ2UodmFybGlzdF9iZWdpbigpLCB2YXJsaXN0X2VuZCgpKTsKKyAgfQorICB2YXJsaXN0X2NvbnN0X3JhbmdlIHZhcmxpc3RzKCkgY29uc3QgeworICAgIHJldHVybiB2YXJsaXN0X2NvbnN0X3JhbmdlKHZhcmxpc3RfYmVnaW4oKSwgdmFybGlzdF9lbmQoKSk7CisgIH0KKyAgdmFybGlzdF9pdGVyYXRvciB2YXJsaXN0X2JlZ2luKCkgeyByZXR1cm4gZ2V0VmFycygpLmJlZ2luKCk7IH0KKyAgdmFybGlzdF9pdGVyYXRvciB2YXJsaXN0X2VuZCgpIHsgcmV0dXJuIGdldFZhcnMoKS5lbmQoKTsgfQorICB2YXJsaXN0X2NvbnN0X2l0ZXJhdG9yIHZhcmxpc3RfYmVnaW4oKSBjb25zdCB7IHJldHVybiBnZXRWYXJzKCkuYmVnaW4oKTsgfQorICB2YXJsaXN0X2NvbnN0X2l0ZXJhdG9yIHZhcmxpc3RfZW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0VmFycygpLmVuZCgpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBPTVBUaHJlYWRQcml2YXRlOyB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnI3ByYWdtYSBvbXAgZGVjbGFyZSByZWR1Y3Rpb24gLi4uJyBkaXJlY3RpdmUuCisvLy8gRm9yIGV4YW1wbGUsIGluIHRoZSBmb2xsb3dpbmcsIGRlY2xhcmVkIHJlZHVjdGlvbiAnZm9vJyBmb3IgdHlwZXMgJ2ludCcgYW5kCisvLy8gJ2Zsb2F0JzoKKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgZGVjbGFyZSByZWR1Y3Rpb24gKGZvbyA6IGludCxmbG9hdCA6IG9tcF9vdXQgKz0gb21wX2luKSBcCisvLy8gICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplciAob21wX3ByaXYgPSAwKQorLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBIZXJlICdvbXBfb3V0ICs9IG9tcF9pbicgaXMgYSBjb21iaW5lciBhbmQgJ29tcF9wcml2ID0gMCcgaXMgYW4gaW5pdGlhbGl6ZXIuCitjbGFzcyBPTVBEZWNsYXJlUmVkdWN0aW9uRGVjbCBmaW5hbCA6IHB1YmxpYyBWYWx1ZURlY2wsIHB1YmxpYyBEZWNsQ29udGV4dCB7CitwdWJsaWM6CisgIGVudW0gSW5pdEtpbmQgeworICAgIENhbGxJbml0LCAgIC8vIEluaXRpYWxpemVkIGJ5IGZ1bmN0aW9uIGNhbGwuCisgICAgRGlyZWN0SW5pdCwgLy8gb21wX3ByaXYoPGV4cHI+KQorICAgIENvcHlJbml0ICAgIC8vIG9tcF9wcml2ID0gPGV4cHI+CisgIH07CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworICAvLy8gXGJyaWVmIENvbWJpbmVyIGZvciBkZWNsYXJlIHJlZHVjdGlvbiBjb25zdHJ1Y3QuCisgIEV4cHIgKkNvbWJpbmVyOworICAvLy8gXGJyaWVmIEluaXRpYWxpemVyIGZvciBkZWNsYXJlIHJlZHVjdGlvbiBjb25zdHJ1Y3QuCisgIEV4cHIgKkluaXRpYWxpemVyOworICAvLy8gS2luZCBvZiBpbml0aWFsaXplciAtIGZ1bmN0aW9uIGNhbGwgb3Igb21wX3ByaXY8aW5pdF9leHByPiBpbml0aWFsaXp0aW9uLgorICBJbml0S2luZCBJbml0aWFsaXplcktpbmQgPSBDYWxsSW5pdDsKKworICAvLy8gXGJyaWVmIFJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgZGVjbGFyZSByZWR1Y3Rpb24gY29uc3RydWN0IGluIHRoZSBzYW1lCisgIC8vLyBzY29wZSB3aXRoIHRoZSBzYW1lIG5hbWUuIFJlcXVpcmVkIGZvciBwcm9wZXIgdGVtcGxhdGVzIGluc3RhbnRpYXRpb24gaWYKKyAgLy8vIHRoZSBkZWNsYXJlIHJlZHVjdGlvbiBjb25zdHJ1Y3QgaXMgZGVjbGFyZWQgaW5zaWRlIGNvbXBvdW5kIHN0YXRlbWVudC4KKyAgTGF6eURlY2xQdHIgUHJldkRlY2xJblNjb3BlOworCisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworICBPTVBEZWNsYXJlUmVkdWN0aW9uRGVjbChLaW5kIERLLCBEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBOYW1lLCBRdWFsVHlwZSBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT01QRGVjbGFyZVJlZHVjdGlvbkRlY2wgKlByZXZEZWNsSW5TY29wZSkKKyAgICAgIDogVmFsdWVEZWNsKERLLCBEQywgTCwgTmFtZSwgVHkpLCBEZWNsQ29udGV4dChESyksIENvbWJpbmVyKG51bGxwdHIpLAorICAgICAgICBJbml0aWFsaXplcihudWxscHRyKSwgSW5pdGlhbGl6ZXJLaW5kKENhbGxJbml0KSwKKyAgICAgICAgUHJldkRlY2xJblNjb3BlKFByZXZEZWNsSW5TY29wZSkge30KKworICB2b2lkIHNldFByZXZEZWNsSW5TY29wZShPTVBEZWNsYXJlUmVkdWN0aW9uRGVjbCAqUHJldikgeworICAgIFByZXZEZWNsSW5TY29wZSA9IFByZXY7CisgIH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZSBkZWNsYXJlIHJlZHVjdGlvbiBub2RlLgorICBzdGF0aWMgT01QRGVjbGFyZVJlZHVjdGlvbkRlY2wgKgorICBDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBMLCBEZWNsYXJhdGlvbk5hbWUgTmFtZSwKKyAgICAgICAgIFF1YWxUeXBlIFQsIE9NUERlY2xhcmVSZWR1Y3Rpb25EZWNsICpQcmV2RGVjbEluU2NvcGUpOworICAvLy8gXGJyaWVmIENyZWF0ZSBkZXNlcmlhbGl6ZWQgZGVjbGFyZSByZWR1Y3Rpb24gbm9kZS4KKyAgc3RhdGljIE9NUERlY2xhcmVSZWR1Y3Rpb25EZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpOworCisgIC8vLyBcYnJpZWYgR2V0IGNvbWJpbmVyIGV4cHJlc3Npb24gb2YgdGhlIGRlY2xhcmUgcmVkdWN0aW9uIGNvbnN0cnVjdC4KKyAgRXhwciAqZ2V0Q29tYmluZXIoKSB7IHJldHVybiBDb21iaW5lcjsgfQorICBjb25zdCBFeHByICpnZXRDb21iaW5lcigpIGNvbnN0IHsgcmV0dXJuIENvbWJpbmVyOyB9CisgIC8vLyBcYnJpZWYgU2V0IGNvbWJpbmVyIGV4cHJlc3Npb24gZm9yIHRoZSBkZWNsYXJlIHJlZHVjdGlvbiBjb25zdHJ1Y3QuCisgIHZvaWQgc2V0Q29tYmluZXIoRXhwciAqRSkgeyBDb21iaW5lciA9IEU7IH0KKworICAvLy8gXGJyaWVmIEdldCBpbml0aWFsaXplciBleHByZXNzaW9uIChpZiBzcGVjaWZpZWQpIG9mIHRoZSBkZWNsYXJlIHJlZHVjdGlvbgorICAvLy8gY29uc3RydWN0LgorICBFeHByICpnZXRJbml0aWFsaXplcigpIHsgcmV0dXJuIEluaXRpYWxpemVyOyB9CisgIGNvbnN0IEV4cHIgKmdldEluaXRpYWxpemVyKCkgY29uc3QgeyByZXR1cm4gSW5pdGlhbGl6ZXI7IH0KKyAgLy8vIEdldCBpbml0aWFsaXplciBraW5kLgorICBJbml0S2luZCBnZXRJbml0aWFsaXplcktpbmQoKSBjb25zdCB7IHJldHVybiBJbml0aWFsaXplcktpbmQ7IH0KKyAgLy8vIFxicmllZiBTZXQgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbiBmb3IgdGhlIGRlY2xhcmUgcmVkdWN0aW9uIGNvbnN0cnVjdC4KKyAgdm9pZCBzZXRJbml0aWFsaXplcihFeHByICpFLCBJbml0S2luZCBJSykgeworICAgIEluaXRpYWxpemVyID0gRTsKKyAgICBJbml0aWFsaXplcktpbmQgPSBJSzsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHJlZmVyZW5jZSB0byBwcmV2aW91cyBkZWNsYXJlIHJlZHVjdGlvbiBjb25zdHJ1Y3QgaW4gdGhlIHNhbWUKKyAgLy8vIHNjb3BlIHdpdGggdGhlIHNhbWUgbmFtZS4KKyAgT01QRGVjbGFyZVJlZHVjdGlvbkRlY2wgKmdldFByZXZEZWNsSW5TY29wZSgpOworICBjb25zdCBPTVBEZWNsYXJlUmVkdWN0aW9uRGVjbCAqZ2V0UHJldkRlY2xJblNjb3BlKCkgY29uc3Q7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBPTVBEZWNsYXJlUmVkdWN0aW9uOyB9CisgIHN0YXRpYyBEZWNsQ29udGV4dCAqY2FzdFRvRGVjbENvbnRleHQoY29uc3QgT01QRGVjbGFyZVJlZHVjdGlvbkRlY2wgKkQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVjbENvbnRleHQgKj4oY29uc3RfY2FzdDxPTVBEZWNsYXJlUmVkdWN0aW9uRGVjbCAqPihEKSk7CisgIH0KKyAgc3RhdGljIE9NUERlY2xhcmVSZWR1Y3Rpb25EZWNsICpjYXN0RnJvbURlY2xDb250ZXh0KGNvbnN0IERlY2xDb250ZXh0ICpEQykgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxPTVBEZWNsYXJlUmVkdWN0aW9uRGVjbCAqPigKKyAgICAgICAgY29uc3RfY2FzdDxEZWNsQ29udGV4dCAqPihEQykpOworICB9Cit9OworCisvLy8gUHNldWRvIGRlY2xhcmF0aW9uIGZvciBjYXB0dXJpbmcgZXhwcmVzc2lvbnMuIEFsc28gaXMgdXNlZCBmb3IgY2FwdHVyaW5nIG9mCisvLy8gbm9uLXN0YXRpYyBkYXRhIG1lbWJlcnMgaW4gbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zLgorLy8vCisvLy8gQ2xhbmcgc3VwcG9ydHMgY2FwdHVyaW5nIG9mIHZhcmlhYmxlcyBvbmx5LCBidXQgT3Blbk1QIDQuNSBhbGxvd3MgdG8KKy8vLyBwcml2YXRpemUgbm9uLXN0YXRpYyBtZW1iZXJzIG9mIGN1cnJlbnQgY2xhc3MgaW4gbm9uLXN0YXRpYyBtZW1iZXIKKy8vLyBmdW5jdGlvbnMuIFRoaXMgcHNldWRvLWRlY2xhcmF0aW9uIGFsbG93cyBwcm9wZXJseSBoYW5kbGUgdGhpcyBraW5kIG9mCisvLy8gY2FwdHVyZSBieSB3cmFwcGluZyBjYXB0dXJlZCBleHByZXNzaW9uIGludG8gYSB2YXJpYWJsZS1saWtlIGRlY2xhcmF0aW9uLgorY2xhc3MgT01QQ2FwdHVyZWRFeHByRGVjbCBmaW5hbCA6IHB1YmxpYyBWYXJEZWNsIHsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKKyAgT01QQ2FwdHVyZWRFeHByRGVjbChBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsIElkZW50aWZpZXJJbmZvICpJZCwKKyAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBUeXBlLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYykKKyAgICAgIDogVmFyRGVjbChPTVBDYXB0dXJlZEV4cHIsIEMsIERDLCBTdGFydExvYywgU3RhcnRMb2MsIElkLCBUeXBlLCBudWxscHRyLAorICAgICAgICAgICAgICAgIFNDX05vbmUpIHsKKyAgICBzZXRJbXBsaWNpdCgpOworICB9CisKK3B1YmxpYzoKKyAgc3RhdGljIE9NUENhcHR1cmVkRXhwckRlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklkLCBRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jKTsKKworICBzdGF0aWMgT01QQ2FwdHVyZWRFeHByRGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKKworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFk7CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IE9NUENhcHR1cmVkRXhwcjsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xUZW1wbGF0ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xUZW1wbGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNjgzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbFRlbXBsYXRlLmgKQEAgLTAsMCArMSwzMDM4IEBACisvLz09PS0gRGVjbFRlbXBsYXRlLmggLSBDbGFzc2VzIGZvciByZXByZXNlbnRpbmcgQysrIHRlbXBsYXRlcyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHRoZSBDKysgdGVtcGxhdGUgZGVjbGFyYXRpb24gc3ViY2xhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0RFQ0xURU1QTEFURV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX0RFQ0xURU1QTEFURV9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQmFzZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQ1hYLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xhcmF0aW9uTmFtZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9SZWRlY2xhcmFibGUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVGVtcGxhdGVCYXNlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9TcGVjaWZpZXJzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVHJhaWxpbmdPYmplY3RzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworZW51bSBCdWlsdGluVGVtcGxhdGVLaW5kIDogaW50OworY2xhc3MgQ2xhc3NUZW1wbGF0ZURlY2w7CitjbGFzcyBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbDsKK2NsYXNzIEV4cHI7CitjbGFzcyBGdW5jdGlvblRlbXBsYXRlRGVjbDsKK2NsYXNzIElkZW50aWZpZXJJbmZvOworY2xhc3MgTm9uVHlwZVRlbXBsYXRlUGFybURlY2w7CitjbGFzcyBUZW1wbGF0ZURlY2w7CitjbGFzcyBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2w7CitjbGFzcyBUZW1wbGF0ZVR5cGVQYXJtRGVjbDsKK2NsYXNzIFVucmVzb2x2ZWRTZXRJbXBsOworY2xhc3MgVmFyVGVtcGxhdGVEZWNsOworY2xhc3MgVmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsOworCisvLy8gXGJyaWVmIFN0b3JlcyBhIHRlbXBsYXRlIHBhcmFtZXRlciBvZiBhbnkga2luZC4KK3VzaW5nIFRlbXBsYXRlUGFyYW1ldGVyID0KKyAgICBsbHZtOjpQb2ludGVyVW5pb24zPFRlbXBsYXRlVHlwZVBhcm1EZWNsICosIE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsICosCisgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2wgKj47CisKK05hbWVkRGVjbCAqZ2V0QXNOYW1lZERlY2woVGVtcGxhdGVQYXJhbWV0ZXIgUCk7CisKKy8vLyBcYnJpZWYgU3RvcmVzIGEgbGlzdCBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGZvciBhIFRlbXBsYXRlRGVjbCBhbmQgaXRzCisvLy8gZGVyaXZlZCBjbGFzc2VzLgorY2xhc3MgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0IGZpbmFsCisgICAgOiBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxUZW1wbGF0ZVBhcmFtZXRlckxpc3QsIE5hbWVkRGVjbCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqPiB7CisgIC8vLyBUaGUgbG9jYXRpb24gb2YgdGhlICd0ZW1wbGF0ZScga2V5d29yZC4KKyAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVMb2M7CisKKyAgLy8vIFRoZSBsb2NhdGlvbnMgb2YgdGhlICc8JyBhbmQgJz4nIGFuZ2xlIGJyYWNrZXRzLgorICBTb3VyY2VMb2NhdGlvbiBMQW5nbGVMb2MsIFJBbmdsZUxvYzsKKworICAvLy8gVGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGluIHRoaXMgdGVtcGxhdGUKKyAgLy8vIHBhcmFtZXRlciBsaXN0LgorICB1bnNpZ25lZCBOdW1QYXJhbXMgOiAzMDsKKworICAvLy8gV2hldGhlciB0aGlzIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0IGNvbnRhaW5zIGFuIHVuZXhwYW5kZWQgcGFyYW1ldGVyCisgIC8vLyBwYWNrLgorICB1bnNpZ25lZCBDb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrIDogMTsKKworICAvLy8gV2hldGhlciB0aGlzIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0IGhhcyBhbiBhc3NvY2lhdGVkIHJlcXVpcmVzLWNsYXVzZQorICB1bnNpZ25lZCBIYXNSZXF1aXJlc0NsYXVzZSA6IDE7CisKK3Byb3RlY3RlZDoKKyAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0KFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlTG9jLCBTb3VyY2VMb2NhdGlvbiBMQW5nbGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxOYW1lZERlY2wgKj4gUGFyYW1zLCBTb3VyY2VMb2NhdGlvbiBSQW5nbGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpSZXF1aXJlc0NsYXVzZSk7CisKKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPE5hbWVkRGVjbCAqPikgY29uc3QgeworICAgIHJldHVybiBOdW1QYXJhbXM7CisgIH0KKworICBzaXplX3QgbnVtVHJhaWxpbmdPYmplY3RzKE92ZXJsb2FkVG9rZW48RXhwciAqPikgY29uc3QgeworICAgIHJldHVybiBIYXNSZXF1aXJlc0NsYXVzZTsKKyAgfQorCitwdWJsaWM6CisgIHRlbXBsYXRlIDxzaXplX3QgTiwgYm9vbCBIYXNSZXF1aXJlc0NsYXVzZT4KKyAgZnJpZW5kIGNsYXNzIEZpeGVkU2l6ZVRlbXBsYXRlUGFyYW1ldGVyTGlzdFN0b3JhZ2U7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgc3RhdGljIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExBbmdsZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE5hbWVkRGVjbCAqPiBQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSQW5nbGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpSZXF1aXJlc0NsYXVzZSk7CisKKyAgLy8vIFxicmllZiBJdGVyYXRlcyB0aHJvdWdoIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGluIHRoaXMgbGlzdC4KKyAgdXNpbmcgaXRlcmF0b3IgPSBOYW1lZERlY2wgKio7CisKKyAgLy8vIFxicmllZiBJdGVyYXRlcyB0aHJvdWdoIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGluIHRoaXMgbGlzdC4KKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBOYW1lZERlY2wgKiBjb25zdCAqOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPE5hbWVkRGVjbCAqPigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPE5hbWVkRGVjbCAqPigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGJlZ2luKCkgKyBOdW1QYXJhbXM7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gYmVnaW4oKSArIE51bVBhcmFtczsgfQorCisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBOdW1QYXJhbXM7IH0KKworICBBcnJheVJlZjxOYW1lZERlY2wqPiBhc0FycmF5KCkgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoYmVnaW4oKSwgZW5kKCkpOworICB9CisgIEFycmF5UmVmPGNvbnN0IE5hbWVkRGVjbCo+IGFzQXJyYXkoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZihiZWdpbigpLCBzaXplKCkpOworICB9CisKKyAgTmFtZWREZWNsKiBnZXRQYXJhbSh1bnNpZ25lZCBJZHgpIHsKKyAgICBhc3NlcnQoSWR4IDwgc2l6ZSgpICYmICJUZW1wbGF0ZSBwYXJhbWV0ZXIgaW5kZXggb3V0LW9mLXJhbmdlIik7CisgICAgcmV0dXJuIGJlZ2luKClbSWR4XTsKKyAgfQorICBjb25zdCBOYW1lZERlY2wqIGdldFBhcmFtKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGFzc2VydChJZHggPCBzaXplKCkgJiYgIlRlbXBsYXRlIHBhcmFtZXRlciBpbmRleCBvdXQtb2YtcmFuZ2UiKTsKKyAgICByZXR1cm4gYmVnaW4oKVtJZHhdOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBhcmd1bWVudHMgbmVlZGVkIHRvIGZvcm0gYQorICAvLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uCisgIC8vLworICAvLy8gVGhpcyBtYXkgYmUgZmV3ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlIHBhcmFtZXRlcnMsIGlmIHNvbWUgb2YKKyAgLy8vIHRoZSBwYXJhbWV0ZXJzIGhhdmUgZGVmYXVsdCBhcmd1bWVudHMgb3IgaWYgdGhlcmUgaXMgYSBwYXJhbWV0ZXIgcGFjay4KKyAgdW5zaWduZWQgZ2V0TWluUmVxdWlyZWRBcmd1bWVudHMoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgZGVwdGggb2YgdGhpcyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdCBpbiB0aGUgc2V0IG9mCisgIC8vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdHMuCisgIC8vLworICAvLy8gVGhlIGZpcnN0IHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0IGluIGEgZGVjbGFyYXRpb24gd2lsbCBoYXZlIGRlcHRoIDAsCisgIC8vLyB0aGUgc2Vjb25kIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0IHdpbGwgaGF2ZSBkZXB0aCAxLCBldGMuCisgIHVuc2lnbmVkIGdldERlcHRoKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0IGNvbnRhaW5zIGFuCisgIC8vLyB1bmV4cGFuZGVkIHBhcmFtZXRlciBwYWNrLgorICBib29sIGNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2s7CisgIH0KKworICAvLy8gXGJyaWVmIFRoZSBjb25zdHJhaW50LWV4cHJlc3Npb24gb2YgdGhlIGFzc29jaWF0ZWQgcmVxdWlyZXMtY2xhdXNlLgorICBFeHByICpnZXRSZXF1aXJlc0NsYXVzZSgpIHsKKyAgICByZXR1cm4gSGFzUmVxdWlyZXNDbGF1c2UgPyAqZ2V0VHJhaWxpbmdPYmplY3RzPEV4cHIgKj4oKSA6IG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIFRoZSBjb25zdHJhaW50LWV4cHJlc3Npb24gb2YgdGhlIGFzc29jaWF0ZWQgcmVxdWlyZXMtY2xhdXNlLgorICBjb25zdCBFeHByICpnZXRSZXF1aXJlc0NsYXVzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSGFzUmVxdWlyZXNDbGF1c2UgPyAqZ2V0VHJhaWxpbmdPYmplY3RzPEV4cHIgKj4oKSA6IG51bGxwdHI7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRUZW1wbGF0ZUxvYygpIGNvbnN0IHsgcmV0dXJuIFRlbXBsYXRlTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExBbmdsZUxvYygpIGNvbnN0IHsgcmV0dXJuIExBbmdsZUxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRSQW5nbGVMb2MoKSBjb25zdCB7IHJldHVybiBSQW5nbGVMb2M7IH0KKworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBTb3VyY2VSYW5nZShUZW1wbGF0ZUxvYywgUkFuZ2xlTG9jKTsKKyAgfQorCitwdWJsaWM6CisgIC8vIEZJWE1FOiB3b3JrYXJvdW5kIGZvciBNU1ZDIDIwMTM7IHJlbW92ZSB3aGVuIG5vIGxvbmdlciBuZWVkZWQKKyAgdXNpbmcgRml4ZWRTaXplU3RvcmFnZU93bmVyID0gVHJhaWxpbmdPYmplY3RzOjpGaXhlZFNpemVTdG9yYWdlT3duZXI7Cit9OworCisvLy8gXGJyaWVmIFN0b3JlcyBhIGxpc3Qgb2YgdGVtcGxhdGUgcGFyYW1ldGVycyBhbmQgdGhlIGFzc29jaWF0ZWQKKy8vLyByZXF1aXJlcy1jbGF1c2UgKGlmIGFueSkgZm9yIGEgVGVtcGxhdGVEZWNsIGFuZCBpdHMgZGVyaXZlZCBjbGFzc2VzLgorLy8vIFN1aXRhYmxlIGZvciBjcmVhdGluZyBvbiB0aGUgc3RhY2suCit0ZW1wbGF0ZSA8c2l6ZV90IE4sIGJvb2wgSGFzUmVxdWlyZXNDbGF1c2U+CitjbGFzcyBGaXhlZFNpemVUZW1wbGF0ZVBhcmFtZXRlckxpc3RTdG9yYWdlCisgICAgOiBwdWJsaWMgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0OjpGaXhlZFNpemVTdG9yYWdlT3duZXIgeworICB0eXBlbmFtZSBUZW1wbGF0ZVBhcmFtZXRlckxpc3Q6OkZpeGVkU2l6ZVN0b3JhZ2U8CisgICAgICBOYW1lZERlY2wgKiwgRXhwciAqPjo6d2l0aF9jb3VudHM8CisgICAgICBOLCBIYXNSZXF1aXJlc0NsYXVzZSA/IDF1IDogMHUKKyAgICAgID46OnR5cGUgc3RvcmFnZTsKKworcHVibGljOgorICBGaXhlZFNpemVUZW1wbGF0ZVBhcmFtZXRlckxpc3RTdG9yYWdlKFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExBbmdsZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxOYW1lZERlY2wgKj4gUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJBbmdsZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpSZXF1aXJlc0NsYXVzZSkKKyAgICAgIDogRml4ZWRTaXplU3RvcmFnZU93bmVyKAorICAgICAgICAgICAgKGFzc2VydChOID09IFBhcmFtcy5zaXplKCkpLAorICAgICAgICAgICAgIGFzc2VydChIYXNSZXF1aXJlc0NsYXVzZSA9PSBzdGF0aWNfY2FzdDxib29sPihSZXF1aXJlc0NsYXVzZSkpLAorICAgICAgICAgICAgIG5ldyAoc3RhdGljX2Nhc3Q8dm9pZCAqPigmc3RvcmFnZSkpIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCgKKyAgICAgICAgICAgICAgICAgVGVtcGxhdGVMb2MsIExBbmdsZUxvYywgUGFyYW1zLCBSQW5nbGVMb2MsIFJlcXVpcmVzQ2xhdXNlKSkpIHt9Cit9OworCisvLy8gXGJyaWVmIEEgdGVtcGxhdGUgYXJndW1lbnQgbGlzdC4KK2NsYXNzIFRlbXBsYXRlQXJndW1lbnRMaXN0IGZpbmFsCisgICAgOiBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxUZW1wbGF0ZUFyZ3VtZW50TGlzdCwgVGVtcGxhdGVBcmd1bWVudD4geworICAvLy8gXGJyaWVmIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0LgorICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpBcmd1bWVudHM7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHRlbXBsYXRlIGFyZ3VtZW50cyBpbiB0aGlzIHRlbXBsYXRlCisgIC8vLyBhcmd1bWVudCBsaXN0LgorICB1bnNpZ25lZCBOdW1Bcmd1bWVudHM7CisKKyAgLy8gQ29uc3RydWN0cyBhbiBpbnN0YW5jZSB3aXRoIGFuIGludGVybmFsIEFyZ3VtZW50IGxpc3QsIGNvbnRhaW5pbmcKKyAgLy8gYSBjb3B5IG9mIHRoZSBBcmdzIGFycmF5LiAoQ2FsbGVkIGJ5IENyZWF0ZUNvcHkpCisgIFRlbXBsYXRlQXJndW1lbnRMaXN0KEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IEFyZ3MpOworCitwdWJsaWM6CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgVGVtcGxhdGVBcmd1bWVudExpc3QoY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3QgJikgPSBkZWxldGU7CisgIFRlbXBsYXRlQXJndW1lbnRMaXN0ICZvcGVyYXRvcj0oY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3QgJikgPSBkZWxldGU7CisKKyAgLy8vIFxicmllZiBUeXBlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdGVtcGxhdGUgYXJndW1lbnQgbGlzdCBpdHNlbGYgaXMgYQorICAvLy8gc3RhY2sgb2JqZWN0LiBJdCBkb2VzIG5vdCBvd24gaXRzIHRlbXBsYXRlIGFyZ3VtZW50cy4KKyAgZW51bSBPblN0YWNrVHlwZSB7IE9uU3RhY2sgfTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0IHRoYXQgY29waWVzIHRoZSBnaXZlbiBzZXQgb2YKKyAgLy8vIHRlbXBsYXRlIGFyZ3VtZW50cy4KKyAgc3RhdGljIFRlbXBsYXRlQXJndW1lbnRMaXN0ICpDcmVhdGVDb3B5KEFTVENvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBBcmdzKTsKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIG5ldywgdGVtcG9yYXJ5IHRlbXBsYXRlIGFyZ3VtZW50IGxpc3Qgb24gdGhlIHN0YWNrLgorICAvLy8KKyAgLy8vIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0IGRvZXMgbm90IG93biB0aGUgdGVtcGxhdGUgYXJndW1lbnRzCisgIC8vLyBwcm92aWRlZC4KKyAgZXhwbGljaXQgVGVtcGxhdGVBcmd1bWVudExpc3QoT25TdGFja1R5cGUsIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IEFyZ3MpCisgICAgICA6IEFyZ3VtZW50cyhBcmdzLmRhdGEoKSksIE51bUFyZ3VtZW50cyhBcmdzLnNpemUoKSkge30KKworICAvLy8gXGJyaWVmIFByb2R1Y2VzIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBnaXZlbiB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0LgorICAvLy8KKyAgLy8vIFRoaXMgb3BlcmF0aW9uIGFzc3VtZXMgdGhhdCB0aGUgaW5wdXQgYXJndW1lbnQgbGlzdCBvdXRsaXZlcyBpdC4KKyAgLy8vIFRoaXMgdGFrZXMgdGhlIGxpc3QgYXMgYSBwb2ludGVyIHRvIGF2b2lkIGxvb2tpbmcgbGlrZSBhIGNvcHkKKyAgLy8vIGNvbnN0cnVjdG9yLCBzaW5jZSB0aGlzIHJlYWxseSByZWFsbHkgaXNuJ3Qgc2FmZSB0byB1c2UgdGhhdAorICAvLy8gd2F5LgorICBleHBsaWNpdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdChjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdCAqT3RoZXIpCisgICAgICA6IEFyZ3VtZW50cyhPdGhlci0+ZGF0YSgpKSwgTnVtQXJndW1lbnRzKE90aGVyLT5zaXplKCkpIHt9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdGVtcGxhdGUgYXJndW1lbnQgYXQgYSBnaXZlbiBpbmRleC4KKyAgY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmZ2V0KHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGFzc2VydChJZHggPCBOdW1Bcmd1bWVudHMgJiYgIkludmFsaWQgdGVtcGxhdGUgYXJndW1lbnQgaW5kZXgiKTsKKyAgICByZXR1cm4gZGF0YSgpW0lkeF07CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBhdCBhIGdpdmVuIGluZGV4LgorICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICZvcGVyYXRvcltdKHVuc2lnbmVkIElkeCkgY29uc3QgeyByZXR1cm4gZ2V0KElkeCk7IH0KKworICAvLy8gXGJyaWVmIFByb2R1Y2UgdGhpcyBhcyBhbiBhcnJheSByZWYuCisgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IGFzQXJyYXkoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZihkYXRhKCksIHNpemUoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUgYXJndW1lbnRzIGluIHRoaXMKKyAgLy8vIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QuCisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBOdW1Bcmd1bWVudHM7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIGEgcG9pbnRlciB0byB0aGUgdGVtcGxhdGUgYXJndW1lbnQgbGlzdC4KKyAgY29uc3QgVGVtcGxhdGVBcmd1bWVudCAqZGF0YSgpIGNvbnN0IHsgcmV0dXJuIEFyZ3VtZW50czsgfQorfTsKKwordm9pZCAqYWxsb2NhdGVEZWZhdWx0QXJnU3RvcmFnZUNoYWluKGNvbnN0IEFTVENvbnRleHQgJkMpOworCisvLy8gU3RvcmFnZSBmb3IgYSBkZWZhdWx0IGFyZ3VtZW50LiBUaGlzIGlzIGNvbmNlcHR1YWxseSBlaXRoZXIgZW1wdHksIG9yIGFuCisvLy8gYXJndW1lbnQgdmFsdWUsIG9yIGEgcG9pbnRlciB0byBhIHByZXZpb3VzIGRlY2xhcmF0aW9uIHRoYXQgaGFkIGEgZGVmYXVsdAorLy8vIGFyZ3VtZW50LgorLy8vCisvLy8gSG93ZXZlciwgdGhpcyBpcyBjb21wbGljYXRlZCBieSBtb2R1bGVzOiB3aGlsZSB3ZSByZXF1aXJlIGFsbCB0aGUgZGVmYXVsdAorLy8vIGFyZ3VtZW50cyBmb3IgYSB0ZW1wbGF0ZSB0byBiZSBlcXVpdmFsZW50LCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSwgYW5kCisvLy8gd2UgbmVlZCB0byB0cmFjayBhbGwgdGhlIG9yaWdpbmF0aW5nIHBhcmFtZXRlcnMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBkZWZhdWx0CisvLy8gYXJndW1lbnQgaXMgdmlzaWJsZS4KK3RlbXBsYXRlPHR5cGVuYW1lIFBhcm1EZWNsLCB0eXBlbmFtZSBBcmdUeXBlPgorY2xhc3MgRGVmYXVsdEFyZ1N0b3JhZ2UgeworICAvLy8gU3RvcmFnZSBmb3IgYm90aCB0aGUgdmFsdWUgKmFuZCogYW5vdGhlciBwYXJhbWV0ZXIgZnJvbSB3aGljaCB3ZSBpbmhlcml0CisgIC8vLyB0aGUgZGVmYXVsdCBhcmd1bWVudC4gVGhpcyBpcyB1c2VkIHdoZW4gbXVsdGlwbGUgZGVmYXVsdCBhcmd1bWVudHMgZm9yIGEKKyAgLy8vIHBhcmFtZXRlciBhcmUgbWVyZ2VkIHRvZ2V0aGVyIGZyb20gZGlmZmVyZW50IG1vZHVsZXMuCisgIHN0cnVjdCBDaGFpbiB7CisgICAgUGFybURlY2wgKlByZXZEZWNsV2l0aERlZmF1bHRBcmc7CisgICAgQXJnVHlwZSBWYWx1ZTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoQ2hhaW4pID09IHNpemVvZih2b2lkICopICogMiwKKyAgICAgICAgICAgICAgICAibm9uLXBvaW50ZXIgYXJndW1lbnQgdHlwZT8iKTsKKworICBsbHZtOjpQb2ludGVyVW5pb24zPEFyZ1R5cGUsIFBhcm1EZWNsKiwgQ2hhaW4qPiBWYWx1ZU9ySW5oZXJpdGVkOworCisgIHN0YXRpYyBQYXJtRGVjbCAqZ2V0UGFybU93bmluZ0RlZmF1bHRBcmcoUGFybURlY2wgKlBhcm0pIHsKKyAgICBjb25zdCBEZWZhdWx0QXJnU3RvcmFnZSAmU3RvcmFnZSA9IFBhcm0tPmdldERlZmF1bHRBcmdTdG9yYWdlKCk7CisgICAgaWYgKGF1dG8gKlByZXYgPSBTdG9yYWdlLlZhbHVlT3JJbmhlcml0ZWQudGVtcGxhdGUgZHluX2Nhc3Q8UGFybURlY2wgKj4oKSkKKyAgICAgIFBhcm0gPSBQcmV2OworICAgIGFzc2VydCghUGFybS0+Z2V0RGVmYXVsdEFyZ1N0b3JhZ2UoKQorICAgICAgICAgICAgICAgIC5WYWx1ZU9ySW5oZXJpdGVkLnRlbXBsYXRlIGlzPFBhcm1EZWNsICo+KCkgJiYKKyAgICAgICAgICAgInNob3VsZCBvbmx5IGJlIG9uZSBsZXZlbCBvZiBpbmRpcmVjdGlvbiIpOworICAgIHJldHVybiBQYXJtOworICB9CisKK3B1YmxpYzoKKyAgRGVmYXVsdEFyZ1N0b3JhZ2UoKSA6IFZhbHVlT3JJbmhlcml0ZWQoQXJnVHlwZSgpKSB7fQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcyBhIGRlZmF1bHQgYXJndW1lbnQgZm9yIHRoaXMgcGFyYW1ldGVyLgorICBib29sIGlzU2V0KCkgY29uc3QgeyByZXR1cm4gIVZhbHVlT3JJbmhlcml0ZWQuaXNOdWxsKCk7IH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlZmF1bHQgYXJndW1lbnQgZm9yIHRoaXMgcGFyYW1ldGVyIHdhcyBpbmhlcml0ZWQKKyAgLy8vIGZyb20gYSBwcmV2aW91cyBkZWNsYXJhdGlvbiBvZiB0aGUgc2FtZSBlbnRpdHkuCisgIGJvb2wgaXNJbmhlcml0ZWQoKSBjb25zdCB7IHJldHVybiBWYWx1ZU9ySW5oZXJpdGVkLnRlbXBsYXRlIGlzPFBhcm1EZWNsKj4oKTsgfQorCisgIC8vLyBHZXQgdGhlIGRlZmF1bHQgYXJndW1lbnQncyB2YWx1ZS4gVGhpcyBkb2VzIG5vdCBjb25zaWRlciB3aGV0aGVyIHRoZQorICAvLy8gZGVmYXVsdCBhcmd1bWVudCBpcyB2aXNpYmxlLgorICBBcmdUeXBlIGdldCgpIGNvbnN0IHsKKyAgICBjb25zdCBEZWZhdWx0QXJnU3RvcmFnZSAqU3RvcmFnZSA9IHRoaXM7CisgICAgaWYgKGNvbnN0IGF1dG8gKlByZXYgPSBWYWx1ZU9ySW5oZXJpdGVkLnRlbXBsYXRlIGR5bl9jYXN0PFBhcm1EZWNsICo+KCkpCisgICAgICBTdG9yYWdlID0gJlByZXYtPmdldERlZmF1bHRBcmdTdG9yYWdlKCk7CisgICAgaWYgKGNvbnN0IGF1dG8gKkMgPSBTdG9yYWdlLT5WYWx1ZU9ySW5oZXJpdGVkLnRlbXBsYXRlIGR5bl9jYXN0PENoYWluICo+KCkpCisgICAgICByZXR1cm4gQy0+VmFsdWU7CisgICAgcmV0dXJuIFN0b3JhZ2UtPlZhbHVlT3JJbmhlcml0ZWQudGVtcGxhdGUgZ2V0PEFyZ1R5cGU+KCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBwYXJhbWV0ZXIgZnJvbSB3aGljaCB3ZSBpbmhlcml0IHRoZSBkZWZhdWx0IGFyZ3VtZW50LCBpZiBhbnkuCisgIC8vLyBUaGlzIGlzIHRoZSBwYXJhbWV0ZXIgb24gd2hpY2ggdGhlIGRlZmF1bHQgYXJndW1lbnQgd2FzIGFjdHVhbGx5IHdyaXR0ZW4uCisgIGNvbnN0IFBhcm1EZWNsICpnZXRJbmhlcml0ZWRGcm9tKCkgY29uc3QgeworICAgIGlmIChjb25zdCBhdXRvICpEID0gVmFsdWVPckluaGVyaXRlZC50ZW1wbGF0ZSBkeW5fY2FzdDxQYXJtRGVjbCAqPigpKQorICAgICAgcmV0dXJuIEQ7CisgICAgaWYgKGNvbnN0IGF1dG8gKkMgPSBWYWx1ZU9ySW5oZXJpdGVkLnRlbXBsYXRlIGR5bl9jYXN0PENoYWluICo+KCkpCisgICAgICByZXR1cm4gQy0+UHJldkRlY2xXaXRoRGVmYXVsdEFyZzsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBTZXQgdGhlIGRlZmF1bHQgYXJndW1lbnQuCisgIHZvaWQgc2V0KEFyZ1R5cGUgQXJnKSB7CisgICAgYXNzZXJ0KCFpc1NldCgpICYmICJkZWZhdWx0IGFyZ3VtZW50IGFscmVhZHkgc2V0Iik7CisgICAgVmFsdWVPckluaGVyaXRlZCA9IEFyZzsKKyAgfQorCisgIC8vLyBTZXQgdGhhdCB0aGUgZGVmYXVsdCBhcmd1bWVudCB3YXMgaW5oZXJpdGVkIGZyb20gYW5vdGhlciBwYXJhbWV0ZXIuCisgIHZvaWQgc2V0SW5oZXJpdGVkKGNvbnN0IEFTVENvbnRleHQgJkMsIFBhcm1EZWNsICpJbmhlcml0ZWRGcm9tKSB7CisgICAgYXNzZXJ0KCFpc0luaGVyaXRlZCgpICYmICJkZWZhdWx0IGFyZ3VtZW50IGFscmVhZHkgaW5oZXJpdGVkIik7CisgICAgSW5oZXJpdGVkRnJvbSA9IGdldFBhcm1Pd25pbmdEZWZhdWx0QXJnKEluaGVyaXRlZEZyb20pOworICAgIGlmICghaXNTZXQoKSkKKyAgICAgIFZhbHVlT3JJbmhlcml0ZWQgPSBJbmhlcml0ZWRGcm9tOworICAgIGVsc2UKKyAgICAgIFZhbHVlT3JJbmhlcml0ZWQgPSBuZXcgKGFsbG9jYXRlRGVmYXVsdEFyZ1N0b3JhZ2VDaGFpbihDKSkKKyAgICAgICAgICBDaGFpbntJbmhlcml0ZWRGcm9tLCBWYWx1ZU9ySW5oZXJpdGVkLnRlbXBsYXRlIGdldDxBcmdUeXBlPigpfTsKKyAgfQorCisgIC8vLyBSZW1vdmUgdGhlIGRlZmF1bHQgYXJndW1lbnQsIGV2ZW4gaWYgaXQgd2FzIGluaGVyaXRlZC4KKyAgdm9pZCBjbGVhcigpIHsKKyAgICBWYWx1ZU9ySW5oZXJpdGVkID0gQXJnVHlwZSgpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gS2luZHMgb2YgVGVtcGxhdGVzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gXGJyaWVmIFN0b3JlcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3QgYW5kIGFzc29jaWF0ZWQgY29uc3RyYWludHMgZm9yCisvLy8gXGMgVGVtcGxhdGVEZWNsIG9iamVjdHMgdGhhdCB0cmFjayBhc3NvY2lhdGVkIGNvbnN0cmFpbnRzLgorY2xhc3MgQ29uc3RyYWluZWRUZW1wbGF0ZURlY2xJbmZvIHsKKyAgZnJpZW5kIFRlbXBsYXRlRGVjbDsKKworcHVibGljOgorICBDb25zdHJhaW5lZFRlbXBsYXRlRGVjbEluZm8oKSA9IGRlZmF1bHQ7CisKKyAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpnZXRUZW1wbGF0ZVBhcmFtZXRlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIFRlbXBsYXRlUGFyYW1zOworICB9CisKKyAgRXhwciAqZ2V0QXNzb2NpYXRlZENvbnN0cmFpbnRzKCkgY29uc3QgeyByZXR1cm4gQXNzb2NpYXRlZENvbnN0cmFpbnRzOyB9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBzZXRUZW1wbGF0ZVBhcmFtZXRlcnMoVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpUUGFyYW1zKSB7CisgICAgVGVtcGxhdGVQYXJhbXMgPSBUUGFyYW1zOworICB9CisKKyAgdm9pZCBzZXRBc3NvY2lhdGVkQ29uc3RyYWludHMoRXhwciAqQUMpIHsgQXNzb2NpYXRlZENvbnN0cmFpbnRzID0gQUM7IH0KKworICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlRlbXBsYXRlUGFyYW1zID0gbnVsbHB0cjsKKyAgRXhwciAqQXNzb2NpYXRlZENvbnN0cmFpbnRzID0gbnVsbHB0cjsKK307CisKKworLy8vIFxicmllZiBUaGUgYmFzZSBjbGFzcyBvZiBhbGwga2luZHMgb2YgdGVtcGxhdGUgZGVjbGFyYXRpb25zIChlLmcuLAorLy8vIGNsYXNzLCBmdW5jdGlvbiwgZXRjLikuCisvLy8KKy8vLyBUaGUgVGVtcGxhdGVEZWNsIGNsYXNzIHN0b3JlcyB0aGUgbGlzdCBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFuZCBhCisvLy8gcmVmZXJlbmNlIHRvIHRoZSB0ZW1wbGF0ZWQgc2NvcGVkIGRlY2xhcmF0aW9uOiB0aGUgdW5kZXJseWluZyBBU1Qgbm9kZS4KK2NsYXNzIFRlbXBsYXRlRGVjbCA6IHB1YmxpYyBOYW1lZERlY2wgeworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgIC8vIENvbnN0cnVjdCBhIHRlbXBsYXRlIGRlY2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgcGFyYW1ldGVycy4KKyAgLy8gVXNlZCB3aGVuIHRoZXJlIGlzIG5vIHRlbXBsYXRlZCBlbGVtZW50IChlLmcuLCBmb3IgdHQtcGFyYW1zKS4KKyAgVGVtcGxhdGVEZWNsKENvbnN0cmFpbmVkVGVtcGxhdGVEZWNsSW5mbyAqQ1RESSwgS2luZCBESywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCwgRGVjbGFyYXRpb25OYW1lIE5hbWUsCisgICAgICAgICAgICAgICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlBhcmFtcykKKyAgICAgIDogTmFtZWREZWNsKERLLCBEQywgTCwgTmFtZSksIFRlbXBsYXRlZERlY2wobnVsbHB0ciksCisgICAgICAgIFRlbXBsYXRlUGFyYW1zKENUREkpIHsKKyAgICB0aGlzLT5zZXRUZW1wbGF0ZVBhcmFtZXRlcnMoUGFyYW1zKTsKKyAgfQorCisgIFRlbXBsYXRlRGVjbChLaW5kIERLLCBEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIEwsIERlY2xhcmF0aW9uTmFtZSBOYW1lLAorICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpQYXJhbXMpCisgICAgICA6IFRlbXBsYXRlRGVjbChudWxscHRyLCBESywgREMsIEwsIE5hbWUsIFBhcmFtcykge30KKworICAvLyBDb25zdHJ1Y3QgYSB0ZW1wbGF0ZSBkZWNsIHdpdGggbmFtZSwgcGFyYW1ldGVycywgYW5kIHRlbXBsYXRlZCBlbGVtZW50LgorICBUZW1wbGF0ZURlY2woQ29uc3RyYWluZWRUZW1wbGF0ZURlY2xJbmZvICpDVERJLCBLaW5kIERLLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMLCBEZWNsYXJhdGlvbk5hbWUgTmFtZSwKKyAgICAgICAgICAgICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zLCBOYW1lZERlY2wgKkRlY2wpCisgICAgICA6IE5hbWVkRGVjbChESywgREMsIEwsIE5hbWUpLCBUZW1wbGF0ZWREZWNsKERlY2wpLAorICAgICAgICBUZW1wbGF0ZVBhcmFtcyhDVERJKSB7CisgICAgdGhpcy0+c2V0VGVtcGxhdGVQYXJhbWV0ZXJzKFBhcmFtcyk7CisgIH0KKworICBUZW1wbGF0ZURlY2woS2luZCBESywgRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBMLCBEZWNsYXJhdGlvbk5hbWUgTmFtZSwKKyAgICAgICAgICAgICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zLCBOYW1lZERlY2wgKkRlY2wpCisgICAgICA6IFRlbXBsYXRlRGVjbChudWxscHRyLCBESywgREMsIEwsIE5hbWUsIFBhcmFtcywgRGVjbCkge30KKworcHVibGljOgorICAvLy8gR2V0IHRoZSBsaXN0IG9mIHRlbXBsYXRlIHBhcmFtZXRlcnMKKyAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpnZXRUZW1wbGF0ZVBhcmFtZXRlcnMoKSBjb25zdCB7CisgICAgY29uc3QgYXV0byAqY29uc3QgQ1RESSA9CisgICAgICAgIFRlbXBsYXRlUGFyYW1zLmR5bl9jYXN0PENvbnN0cmFpbmVkVGVtcGxhdGVEZWNsSW5mbyAqPigpOworICAgIHJldHVybiBDVERJID8gQ1RESS0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCkKKyAgICAgICAgICAgICAgICA6IFRlbXBsYXRlUGFyYW1zLmdldDxUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKj4oKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGNvbnN0cmFpbnQtZXhwcmVzc2lvbiBmcm9tIHRoZSBhc3NvY2lhdGVkIHJlcXVpcmVzLWNsYXVzZSAoaWYgYW55KQorICBjb25zdCBFeHByICpnZXRSZXF1aXJlc0NsYXVzZSgpIGNvbnN0IHsKKyAgICBjb25zdCBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKmNvbnN0IFRQID0gZ2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCk7CisgICAgcmV0dXJuIFRQID8gVFAtPmdldFJlcXVpcmVzQ2xhdXNlKCkgOiBudWxscHRyOworICB9CisKKyAgRXhwciAqZ2V0QXNzb2NpYXRlZENvbnN0cmFpbnRzKCkgY29uc3QgeworICAgIGNvbnN0IGF1dG8gKmNvbnN0IEMgPSBjYXN0PFRlbXBsYXRlRGVjbD4oZ2V0Q2Fub25pY2FsRGVjbCgpKTsKKyAgICBjb25zdCBhdXRvICpjb25zdCBDVERJID0KKyAgICAgICAgQy0+VGVtcGxhdGVQYXJhbXMuZHluX2Nhc3Q8Q29uc3RyYWluZWRUZW1wbGF0ZURlY2xJbmZvICo+KCk7CisgICAgcmV0dXJuIENUREkgPyBDVERJLT5nZXRBc3NvY2lhdGVkQ29uc3RyYWludHMoKSA6IG51bGxwdHI7CisgIH0KKworICAvLy8gR2V0IHRoZSB1bmRlcmx5aW5nLCB0ZW1wbGF0ZWQgZGVjbGFyYXRpb24uCisgIE5hbWVkRGVjbCAqZ2V0VGVtcGxhdGVkRGVjbCgpIGNvbnN0IHsgcmV0dXJuIFRlbXBsYXRlZERlY2w7IH0KKworICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC9ldGMuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeworICAgIHJldHVybiBLID49IGZpcnN0VGVtcGxhdGUgJiYgSyA8PSBsYXN0VGVtcGxhdGU7CisgIH0KKworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRUZW1wbGF0ZVBhcmFtZXRlcnMoKS0+Z2V0VGVtcGxhdGVMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVkRGVjbC0+Z2V0U291cmNlUmFuZ2UoKS5nZXRFbmQoKSk7CisgIH0KKworcHJvdGVjdGVkOgorICBOYW1lZERlY2wgKlRlbXBsYXRlZERlY2w7CisKKyAgLy8vIFxicmllZiBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3QgYW5kIG9wdGlvbmFsIHJlcXVpcmVzLWNsYXVzZQorICAvLy8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGVjbGFyYXRpb247IGFsdGVybmF0aXZlbHksIGEKKyAgLy8vIFxjIENvbnN0cmFpbmVkVGVtcGxhdGVEZWNsSW5mbyBpZiB0aGUgYXNzb2NpYXRlZCBjb25zdHJhaW50cyBvZiB0aGUKKyAgLy8vIHRlbXBsYXRlIGFyZSBiZWluZyB0cmFja2VkIGJ5IHRoaXMgcGFydGljdWxhciBkZWNsYXJhdGlvbi4KKyAgbGx2bTo6UG9pbnRlclVuaW9uPFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqLAorICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWluZWRUZW1wbGF0ZURlY2xJbmZvICo+CisgICAgICBUZW1wbGF0ZVBhcmFtczsKKworICB2b2lkIHNldFRlbXBsYXRlUGFyYW1ldGVycyhUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlRQYXJhbXMpIHsKKyAgICBpZiAoYXV0byAqY29uc3QgQ1RESSA9CisgICAgICAgICAgICBUZW1wbGF0ZVBhcmFtcy5keW5fY2FzdDxDb25zdHJhaW5lZFRlbXBsYXRlRGVjbEluZm8gKj4oKSkgeworICAgICAgQ1RESS0+c2V0VGVtcGxhdGVQYXJhbWV0ZXJzKFRQYXJhbXMpOworICAgIH0gZWxzZSB7CisgICAgICBUZW1wbGF0ZVBhcmFtcyA9IFRQYXJhbXM7CisgICAgfQorICB9CisKKyAgdm9pZCBzZXRBc3NvY2lhdGVkQ29uc3RyYWludHMoRXhwciAqQUMpIHsKKyAgICBhc3NlcnQoaXNDYW5vbmljYWxEZWNsKCkgJiYKKyAgICAgICAgICAgIkF0dGFjaGluZyBhc3NvY2lhdGVkIGNvbnN0cmFpbnRzIHRvIG5vbi1jYW5vbmljYWwgRGVjbCIpOworICAgIFRlbXBsYXRlUGFyYW1zLmdldDxDb25zdHJhaW5lZFRlbXBsYXRlRGVjbEluZm8gKj4oKQorICAgICAgICAtPnNldEFzc29jaWF0ZWRDb25zdHJhaW50cyhBQyk7CisgIH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIEluaXRpYWxpemUgdGhlIHVuZGVybHlpbmcgdGVtcGxhdGVkIGRlY2xhcmF0aW9uIGFuZAorICAvLy8gdGVtcGxhdGUgcGFyYW1ldGVycy4KKyAgdm9pZCBpbml0KE5hbWVkRGVjbCAqdGVtcGxhdGVkRGVjbCwgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0KiB0ZW1wbGF0ZVBhcmFtcykgeworICAgIGFzc2VydCghVGVtcGxhdGVkRGVjbCAmJiAiVGVtcGxhdGVkRGVjbCBhbHJlYWR5IHNldCEiKTsKKyAgICBhc3NlcnQoIVRlbXBsYXRlUGFyYW1zICYmICJUZW1wbGF0ZVBhcmFtcyBhbHJlYWR5IHNldCEiKTsKKyAgICBUZW1wbGF0ZWREZWNsID0gdGVtcGxhdGVkRGVjbDsKKyAgICBUZW1wbGF0ZVBhcmFtcyA9IHRlbXBsYXRlUGFyYW1zOworICB9Cit9OworCisvLy8gXGJyaWVmIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGEgZnVuY3Rpb24gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24sCisvLy8gd2hpY2ggaXMgYSBGdW5jdGlvbkRlY2wgdGhhdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNwZWNpYWxpemF0aW9uIG9yCisvLy8gaW5zdGFudGlhdGVkIGZyb20gYSBmdW5jdGlvbiB0ZW1wbGF0ZS4KK2NsYXNzIEZ1bmN0aW9uVGVtcGxhdGVTcGVjaWFsaXphdGlvbkluZm8gOiBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworICBGdW5jdGlvblRlbXBsYXRlU3BlY2lhbGl6YXRpb25JbmZvKEZ1bmN0aW9uRGVjbCAqRkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25UZW1wbGF0ZURlY2wgKlRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kIFRTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdCAqVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBU1RUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gKlRlbXBsYXRlQXJnc0FzV3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQT0kpCisgICAgICA6IEZ1bmN0aW9uKEZEKSwgVGVtcGxhdGUoVGVtcGxhdGUsIFRTSyAtIDEpLAorICAgICAgICBUZW1wbGF0ZUFyZ3VtZW50cyhUZW1wbGF0ZUFyZ3MpLAorICAgICAgICBUZW1wbGF0ZUFyZ3VtZW50c0FzV3JpdHRlbihUZW1wbGF0ZUFyZ3NBc1dyaXR0ZW4pLAorICAgICAgICBQb2ludE9mSW5zdGFudGlhdGlvbihQT0kpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIEZ1bmN0aW9uVGVtcGxhdGVTcGVjaWFsaXphdGlvbkluZm8gKgorICBDcmVhdGUoQVNUQ29udGV4dCAmQywgRnVuY3Rpb25EZWNsICpGRCwgRnVuY3Rpb25UZW1wbGF0ZURlY2wgKlRlbXBsYXRlLAorICAgICAgICAgVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQgVFNLLAorICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3QgKlRlbXBsYXRlQXJncywKKyAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqVGVtcGxhdGVBcmdzQXNXcml0dGVuLAorICAgICAgICAgU291cmNlTG9jYXRpb24gUE9JKTsKKworICAvLy8gXGJyaWVmIFRoZSBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0aGF0IHRoaXMgc3RydWN0dXJlCisgIC8vLyBkZXNjcmliZXMuCisgIEZ1bmN0aW9uRGVjbCAqRnVuY3Rpb247CisKKyAgLy8vIFxicmllZiBUaGUgZnVuY3Rpb24gdGVtcGxhdGUgZnJvbSB3aGljaCB0aGlzIGZ1bmN0aW9uIHRlbXBsYXRlCisgIC8vLyBzcGVjaWFsaXphdGlvbiB3YXMgZ2VuZXJhdGVkLgorICAvLy8KKyAgLy8vIFRoZSB0d28gYml0cyBjb250YWluIHRoZSB0b3AgNCB2YWx1ZXMgb2YgVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQuCisgIGxsdm06OlBvaW50ZXJJbnRQYWlyPEZ1bmN0aW9uVGVtcGxhdGVEZWNsICosIDI+IFRlbXBsYXRlOworCisgIC8vLyBcYnJpZWYgVGhlIHRlbXBsYXRlIGFyZ3VtZW50cyB1c2VkIHRvIHByb2R1Y2UgdGhlIGZ1bmN0aW9uIHRlbXBsYXRlCisgIC8vLyBzcGVjaWFsaXphdGlvbiBmcm9tIHRoZSBmdW5jdGlvbiB0ZW1wbGF0ZS4KKyAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3QgKlRlbXBsYXRlQXJndW1lbnRzOworCisgIC8vLyBcYnJpZWYgVGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBhcyB3cml0dGVuIGluIHRoZSBzb3VyY2VzLCBpZiBwcm92aWRlZC4KKyAgY29uc3QgQVNUVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICpUZW1wbGF0ZUFyZ3VtZW50c0FzV3JpdHRlbjsKKworICAvLy8gXGJyaWVmIFRoZSBwb2ludCBhdCB3aGljaCB0aGlzIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHdhcworICAvLy8gZmlyc3QgaW5zdGFudGlhdGVkLgorICBTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbjsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0ZW1wbGF0ZSBmcm9tIHdoaWNoIHRoaXMgZnVuY3Rpb24gd2FzIHNwZWNpYWxpemVkLgorICBGdW5jdGlvblRlbXBsYXRlRGVjbCAqZ2V0VGVtcGxhdGUoKSBjb25zdCB7IHJldHVybiBUZW1wbGF0ZS5nZXRQb2ludGVyKCk7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGF0IGtpbmQgb2YgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdGhpcyBpcy4KKyAgVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQgZ2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIChUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCkoVGVtcGxhdGUuZ2V0SW50KCkgKyAxKTsKKyAgfQorCisgIGJvb2wgaXNFeHBsaWNpdFNwZWNpYWxpemF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpID09IFRTS19FeHBsaWNpdFNwZWNpYWxpemF0aW9uOworICB9CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgZGVjbGFyYXRpb24gaXMgYW4gZXhwbGljaXQgc3BlY2lhbGl6YXRpb24sCisgIC8vLyBleHBsaWNpdCBpbnN0YW50aWF0aW9uIGRlY2xhcmF0aW9uLCBvciBleHBsaWNpdCBpbnN0YW50aWF0aW9uCisgIC8vLyBkZWZpbml0aW9uLgorICBib29sIGlzRXhwbGljaXRJbnN0YW50aWF0aW9uT3JTcGVjaWFsaXphdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNUZW1wbGF0ZUV4cGxpY2l0SW5zdGFudGlhdGlvbk9yU3BlY2lhbGl6YXRpb24oCisgICAgICAgIGdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKCkpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGtpbmQuCisgIHZvaWQgc2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQgVFNLKSB7CisgICAgYXNzZXJ0KFRTSyAhPSBUU0tfVW5kZWNsYXJlZCAmJgorICAgICAgICAgIkNhbm5vdCBlbmNvZGUgVFNLX1VuZGVjbGFyZWQgZm9yIGEgZnVuY3Rpb24gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24iKTsKKyAgICBUZW1wbGF0ZS5zZXRJbnQoVFNLIC0gMSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBmaXJzdCBwb2ludCBvZiBpbnN0YW50aWF0aW9uIG9mIHRoaXMgZnVuY3Rpb24KKyAgLy8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgorICAvLy8KKyAgLy8vIFRoZSBwb2ludCBvZiBpbnN0YW50aWF0aW9uIG1heSBiZSBhbiBpbnZhbGlkIHNvdXJjZSBsb2NhdGlvbiBpZiB0aGlzCisgIC8vLyBmdW5jdGlvbiBoYXMgeWV0IHRvIGJlIGluc3RhbnRpYXRlZC4KKyAgU291cmNlTG9jYXRpb24gZ2V0UG9pbnRPZkluc3RhbnRpYXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIFBvaW50T2ZJbnN0YW50aWF0aW9uOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIChmaXJzdCkgcG9pbnQgb2YgaW5zdGFudGlhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIHRlbXBsYXRlCisgIC8vLyBzcGVjaWFsaXphdGlvbi4KKyAgdm9pZCBzZXRQb2ludE9mSW5zdGFudGlhdGlvbihTb3VyY2VMb2NhdGlvbiBQT0kpIHsKKyAgICBQb2ludE9mSW5zdGFudGlhdGlvbiA9IFBPSTsKKyAgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIFByb2ZpbGUoSUQsIFRlbXBsYXRlQXJndW1lbnRzLT5hc0FycmF5KCksCisgICAgICAgICAgICBGdW5jdGlvbi0+Z2V0QVNUQ29udGV4dCgpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkCisgIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IFRlbXBsYXRlQXJncywKKyAgICAgICAgICBBU1RDb250ZXh0ICZDb250ZXh0KSB7CisgICAgSUQuQWRkSW50ZWdlcihUZW1wbGF0ZUFyZ3Muc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJlRlbXBsYXRlQXJnIDogVGVtcGxhdGVBcmdzKQorICAgICAgVGVtcGxhdGVBcmcuUHJvZmlsZShJRCwgQ29udGV4dCk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUHJvdmlkZXMgaW5mb3JtYXRpb24gYSBzcGVjaWFsaXphdGlvbiBvZiBhIG1lbWJlciBvZiBhIGNsYXNzCisvLy8gdGVtcGxhdGUsIHdoaWNoIG1heSBiZSBhIG1lbWJlciBmdW5jdGlvbiwgc3RhdGljIGRhdGEgbWVtYmVyLAorLy8vIG1lbWJlciBjbGFzcyBvciBtZW1iZXIgZW51bWVyYXRpb24uCitjbGFzcyBNZW1iZXJTcGVjaWFsaXphdGlvbkluZm8geworICAvLyBUaGUgbWVtYmVyIGRlY2xhcmF0aW9uIGZyb20gd2hpY2ggdGhpcyBtZW1iZXIgd2FzIGluc3RhbnRpYXRlZCwgYW5kIHRoZQorICAvLyBtYW5uZXIgaW4gd2hpY2ggdGhlIGluc3RhbnRpYXRpb24gb2NjdXJyZWQgKGluIHRoZSBsb3dlciB0d28gYml0cykuCisgIGxsdm06OlBvaW50ZXJJbnRQYWlyPE5hbWVkRGVjbCAqLCAyPiBNZW1iZXJBbmRUU0s7CisKKyAgLy8gVGhlIHBvaW50IGF0IHdoaWNoIHRoaXMgbWVtYmVyIHdhcyBmaXJzdCBpbnN0YW50aWF0ZWQuCisgIFNvdXJjZUxvY2F0aW9uIFBvaW50T2ZJbnN0YW50aWF0aW9uOworCitwdWJsaWM6CisgIGV4cGxpY2l0CisgIE1lbWJlclNwZWNpYWxpemF0aW9uSW5mbyhOYW1lZERlY2wgKklGLCBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCBUU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQT0kgPSBTb3VyY2VMb2NhdGlvbigpKQorICAgICAgOiBNZW1iZXJBbmRUU0soSUYsIFRTSyAtIDEpLCBQb2ludE9mSW5zdGFudGlhdGlvbihQT0kpIHsKKyAgICBhc3NlcnQoVFNLICE9IFRTS19VbmRlY2xhcmVkICYmCisgICAgICAgICAgICJDYW5ub3QgZW5jb2RlIHVuZGVjbGFyZWQgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIGZvciBtZW1iZXJzIik7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtZW1iZXIgZGVjbGFyYXRpb24gZnJvbSB3aGljaCB0aGlzIG1lbWJlciB3YXMKKyAgLy8vIGluc3RhbnRpYXRlZC4KKyAgTmFtZWREZWNsICpnZXRJbnN0YW50aWF0ZWRGcm9tKCkgY29uc3QgeyByZXR1cm4gTWVtYmVyQW5kVFNLLmdldFBvaW50ZXIoKTsgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoYXQga2luZCBvZiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0aGlzIGlzLgorICBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCBnZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKShNZW1iZXJBbmRUU0suZ2V0SW50KCkgKyAxKTsKKyAgfQorCisgIGJvb2wgaXNFeHBsaWNpdFNwZWNpYWxpemF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpID09IFRTS19FeHBsaWNpdFNwZWNpYWxpemF0aW9uOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGtpbmQuCisgIHZvaWQgc2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQgVFNLKSB7CisgICAgYXNzZXJ0KFRTSyAhPSBUU0tfVW5kZWNsYXJlZCAmJgorICAgICAgICAgICAiQ2Fubm90IGVuY29kZSB1bmRlY2xhcmVkIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyBmb3IgbWVtYmVycyIpOworICAgIE1lbWJlckFuZFRTSy5zZXRJbnQoVFNLIC0gMSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBmaXJzdCBwb2ludCBvZiBpbnN0YW50aWF0aW9uIG9mIHRoaXMgbWVtYmVyLgorICAvLy8gSWYgdGhlIHBvaW50IG9mIGluc3RhbnRpYXRpb24gaXMgYW4gaW52YWxpZCBsb2NhdGlvbiwgdGhlbiB0aGlzIG1lbWJlcgorICAvLy8gaGFzIG5vdCB5ZXQgYmVlbiBpbnN0YW50aWF0ZWQuCisgIFNvdXJjZUxvY2F0aW9uIGdldFBvaW50T2ZJbnN0YW50aWF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBQb2ludE9mSW5zdGFudGlhdGlvbjsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBmaXJzdCBwb2ludCBvZiBpbnN0YW50aWF0aW9uLgorICB2b2lkIHNldFBvaW50T2ZJbnN0YW50aWF0aW9uKFNvdXJjZUxvY2F0aW9uIFBPSSkgeworICAgIFBvaW50T2ZJbnN0YW50aWF0aW9uID0gUE9JOworICB9Cit9OworCisvLy8gXGJyaWVmIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGEgZGVwZW5kZW50IGZ1bmN0aW9uLXRlbXBsYXRlCisvLy8gc3BlY2lhbGl6YXRpb24gZGVjbGFyYXRpb24uCisvLy8KKy8vLyBTaW5jZSBleHBsaWNpdCBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBhbmQgaW5zdGFudGlhdGlvbgorLy8vIGRlY2xhcmF0aW9ucyBjYW4gb25seSBhcHBlYXIgaW4gbmFtZXNwYWNlIHNjb3BlLCBhbmQgeW91IGNhbiBvbmx5CisvLy8gc3BlY2lhbGl6ZSBhIG1lbWJlciBvZiBhIGZ1bGx5LXNwZWNpYWxpemVkIGNsYXNzLCB0aGUgb25seSB3YXkgdG8KKy8vLyBnZXQgb25lIG9mIHRoZXNlIGlzIGluIGEgZnJpZW5kIGRlY2xhcmF0aW9uIGxpa2UgdGhlIGZvbGxvd2luZzoKKy8vLworLy8vIFxjb2RlCisvLy8gICB0ZW1wbGF0ZSBcPGNsYXNzIFQ+IHZvaWQgZm9vKFQpOworLy8vICAgdGVtcGxhdGUgXDxjbGFzcyBUPiBjbGFzcyBBIHsKKy8vLyAgICAgZnJpZW5kIHZvaWQgZm9vPD4oVCk7CisvLy8gICB9OworLy8vIFxlbmRjb2RlCitjbGFzcyBEZXBlbmRlbnRGdW5jdGlvblRlbXBsYXRlU3BlY2lhbGl6YXRpb25JbmZvIGZpbmFsCisgICAgOiBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxEZXBlbmRlbnRGdW5jdGlvblRlbXBsYXRlU3BlY2lhbGl6YXRpb25JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVBcmd1bWVudExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVGVtcGxhdGVEZWNsICo+IHsKKyAgLy8vIFRoZSBudW1iZXIgb2YgcG90ZW50aWFsIHRlbXBsYXRlIGNhbmRpZGF0ZXMuCisgIHVuc2lnbmVkIE51bVRlbXBsYXRlczsKKworICAvLy8gVGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMuCisgIHVuc2lnbmVkIE51bUFyZ3M7CisKKyAgLy8vIFRoZSBsb2NhdGlvbnMgb2YgdGhlIGxlZnQgYW5kIHJpZ2h0IGFuZ2xlIGJyYWNrZXRzLgorICBTb3VyY2VSYW5nZSBBbmdsZUxvY3M7CisKKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPFRlbXBsYXRlQXJndW1lbnRMb2M+KSBjb25zdCB7CisgICAgcmV0dXJuIE51bUFyZ3M7CisgIH0KKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPEZ1bmN0aW9uVGVtcGxhdGVEZWNsICo+KSBjb25zdCB7CisgICAgcmV0dXJuIE51bVRlbXBsYXRlczsKKyAgfQorCisgIERlcGVuZGVudEZ1bmN0aW9uVGVtcGxhdGVTcGVjaWFsaXphdGlvbkluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbnJlc29sdmVkU2V0SW1wbCAmVGVtcGxhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICZUZW1wbGF0ZUFyZ3MpOworCitwdWJsaWM6CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgc3RhdGljIERlcGVuZGVudEZ1bmN0aW9uVGVtcGxhdGVTcGVjaWFsaXphdGlvbkluZm8gKgorICBDcmVhdGUoQVNUQ29udGV4dCAmQ29udGV4dCwgY29uc3QgVW5yZXNvbHZlZFNldEltcGwgJlRlbXBsYXRlcywKKyAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAmVGVtcGxhdGVBcmdzKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBmdW5jdGlvbiB0ZW1wbGF0ZXMgdGhhdCB0aGlzIG1pZ2h0CisgIC8vLyBiZSBhIHNwZWNpYWxpemF0aW9uIG9mLgorICB1bnNpZ25lZCBnZXROdW1UZW1wbGF0ZXMoKSBjb25zdCB7IHJldHVybiBOdW1UZW1wbGF0ZXM7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGkndGggdGVtcGxhdGUgY2FuZGlkYXRlLgorICBGdW5jdGlvblRlbXBsYXRlRGVjbCAqZ2V0VGVtcGxhdGUodW5zaWduZWQgSSkgY29uc3QgeworICAgIGFzc2VydChJIDwgZ2V0TnVtVGVtcGxhdGVzKCkgJiYgInRlbXBsYXRlIGluZGV4IG91dCBvZiByYW5nZSIpOworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8RnVuY3Rpb25UZW1wbGF0ZURlY2wgKj4oKVtJXTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZXhwbGljaXQgdGVtcGxhdGUgYXJndW1lbnRzIHRoYXQgd2VyZSBnaXZlbi4KKyAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExvYyAqZ2V0VGVtcGxhdGVBcmdzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8VGVtcGxhdGVBcmd1bWVudExvYz4oKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGV4cGxpY2l0IHRlbXBsYXRlIGFyZ3VtZW50cyB0aGF0IHdlcmUgZ2l2ZW4uCisgIHVuc2lnbmVkIGdldE51bVRlbXBsYXRlQXJncygpIGNvbnN0IHsgcmV0dXJuIE51bUFyZ3M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG50aCB0ZW1wbGF0ZSBhcmd1bWVudC4KKyAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExvYyAmZ2V0VGVtcGxhdGVBcmcodW5zaWduZWQgSSkgY29uc3QgeworICAgIGFzc2VydChJIDwgZ2V0TnVtVGVtcGxhdGVBcmdzKCkgJiYgInRlbXBsYXRlIGFyZyBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICByZXR1cm4gZ2V0VGVtcGxhdGVBcmdzKClbSV07CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMQW5nbGVMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIEFuZ2xlTG9jcy5nZXRCZWdpbigpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0UkFuZ2xlTG9jKCkgY29uc3QgeworICAgIHJldHVybiBBbmdsZUxvY3MuZ2V0RW5kKCk7CisgIH0KK307CisKKy8vLyBEZWNsYXJhdGlvbiBvZiBhIHJlZGVjbGFyYWJsZSB0ZW1wbGF0ZS4KK2NsYXNzIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCA6IHB1YmxpYyBUZW1wbGF0ZURlY2wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFJlZGVjbGFyYWJsZTxSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2w+IAoreworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZSA9IFJlZGVjbGFyYWJsZTxSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2w+OworCisgIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCAqZ2V0TmV4dFJlZGVjbGFyYXRpb25JbXBsKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXROZXh0UmVkZWNsYXJhdGlvbigpOworICB9CisKKyAgUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsICpnZXRQcmV2aW91c0RlY2xJbXBsKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRQcmV2aW91c0RlY2woKTsKKyAgfQorCisgIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCAqZ2V0TW9zdFJlY2VudERlY2xJbXBsKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRNb3N0UmVjZW50RGVjbCgpOworICB9CisKK3Byb3RlY3RlZDoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEVudHJ5VHlwZT4gc3RydWN0IFNwZWNFbnRyeVRyYWl0cyB7CisgICAgdXNpbmcgRGVjbFR5cGUgPSBFbnRyeVR5cGU7CisKKyAgICBzdGF0aWMgRGVjbFR5cGUgKmdldERlY2woRW50cnlUeXBlICpEKSB7CisgICAgICByZXR1cm4gRDsKKyAgICB9CisKKyAgICBzdGF0aWMgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gZ2V0VGVtcGxhdGVBcmdzKEVudHJ5VHlwZSAqRCkgeworICAgICAgcmV0dXJuIEQtPmdldFRlbXBsYXRlQXJncygpLmFzQXJyYXkoKTsKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEVudHJ5VHlwZSwgdHlwZW5hbWUgU0VUcmFpdHMgPSBTcGVjRW50cnlUcmFpdHM8RW50cnlUeXBlPiwKKyAgICAgICAgICAgIHR5cGVuYW1lIERlY2xUeXBlID0gdHlwZW5hbWUgU0VUcmFpdHM6OkRlY2xUeXBlPgorICBzdHJ1Y3QgU3BlY0l0ZXJhdG9yCisgICAgICA6IGxsdm06Oml0ZXJhdG9yX2FkYXB0b3JfYmFzZTwKKyAgICAgICAgICAgIFNwZWNJdGVyYXRvcjxFbnRyeVR5cGUsIFNFVHJhaXRzLCBEZWNsVHlwZT4sCisgICAgICAgICAgICB0eXBlbmFtZSBsbHZtOjpGb2xkaW5nU2V0VmVjdG9yPEVudHJ5VHlwZT46Oml0ZXJhdG9yLAorICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8dHlwZW5hbWUgbGx2bTo6Rm9sZGluZ1NldFZlY3RvcjwKKyAgICAgICAgICAgICAgICBFbnRyeVR5cGU+OjppdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5LAorICAgICAgICAgICAgRGVjbFR5cGUgKiwgcHRyZGlmZl90LCBEZWNsVHlwZSAqLCBEZWNsVHlwZSAqPiB7CisgICAgU3BlY0l0ZXJhdG9yKCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IFNwZWNJdGVyYXRvcigKKyAgICAgICAgdHlwZW5hbWUgbGx2bTo6Rm9sZGluZ1NldFZlY3RvcjxFbnRyeVR5cGU+OjppdGVyYXRvciBTZXRJdGVyKQorICAgICAgICA6IFNwZWNJdGVyYXRvcjo6aXRlcmF0b3JfYWRhcHRvcl9iYXNlKHN0ZDo6bW92ZShTZXRJdGVyKSkge30KKworICAgIERlY2xUeXBlICpvcGVyYXRvciooKSBjb25zdCB7CisgICAgICByZXR1cm4gU0VUcmFpdHM6OmdldERlY2woJip0aGlzLT5JKS0+Z2V0TW9zdFJlY2VudERlY2woKTsKKyAgICB9CisKKyAgICBEZWNsVHlwZSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICoqdGhpczsgfQorICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBFbnRyeVR5cGU+CisgIHN0YXRpYyBTcGVjSXRlcmF0b3I8RW50cnlUeXBlPgorICBtYWtlU3BlY0l0ZXJhdG9yKGxsdm06OkZvbGRpbmdTZXRWZWN0b3I8RW50cnlUeXBlPiAmU3BlY3MsIGJvb2wgaXNFbmQpIHsKKyAgICByZXR1cm4gU3BlY0l0ZXJhdG9yPEVudHJ5VHlwZT4oaXNFbmQgPyBTcGVjcy5lbmQoKSA6IFNwZWNzLmJlZ2luKCkpOworICB9CisKKyAgdm9pZCBsb2FkTGF6eVNwZWNpYWxpemF0aW9uc0ltcGwoKSBjb25zdDsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgRW50cnlUeXBlPiB0eXBlbmFtZSBTcGVjRW50cnlUcmFpdHM8RW50cnlUeXBlPjo6RGVjbFR5cGUqCisgIGZpbmRTcGVjaWFsaXphdGlvbkltcGwobGx2bTo6Rm9sZGluZ1NldFZlY3RvcjxFbnRyeVR5cGU+ICZTcGVjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBBcmdzLCB2b2lkIComSW5zZXJ0UG9zKTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZCwgY2xhc3MgRW50cnlUeXBlPgorICB2b2lkIGFkZFNwZWNpYWxpemF0aW9uSW1wbChsbHZtOjpGb2xkaW5nU2V0VmVjdG9yPEVudHJ5VHlwZT4gJlNwZWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRyeVR5cGUgKkVudHJ5LCB2b2lkICpJbnNlcnRQb3MpOworCisgIHN0cnVjdCBDb21tb25CYXNlIHsKKyAgICBDb21tb25CYXNlKCkgOiBJbnN0YW50aWF0ZWRGcm9tTWVtYmVyKG51bGxwdHIsIGZhbHNlKSB7fQorCisgICAgLy8vIFxicmllZiBUaGUgdGVtcGxhdGUgZnJvbSB3aGljaCB0aGlzIHdhcyBtb3N0CisgICAgLy8vIGRpcmVjdGx5IGluc3RhbnRpYXRlZCAob3IgbnVsbCkuCisgICAgLy8vCisgICAgLy8vIFRoZSBib29sZWFuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgdGVtcGxhdGUKKyAgICAvLy8gd2FzIGV4cGxpY2l0bHkgc3BlY2lhbGl6ZWQuCisgICAgbGx2bTo6UG9pbnRlckludFBhaXI8UmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsKiwgMSwgYm9vbD4KKyAgICAgIEluc3RhbnRpYXRlZEZyb21NZW1iZXI7CisKKyAgICAvLy8gXGJyaWVmIElmIG5vbi1udWxsLCBwb2ludHMgdG8gYW4gYXJyYXkgb2Ygc3BlY2lhbGl6YXRpb25zIChpbmNsdWRpbmcKKyAgICAvLy8gcGFydGlhbCBzcGVjaWFsaXphdGlvbnMpIGtub3duIG9ubHkgYnkgdGhlaXIgZXh0ZXJuYWwgZGVjbGFyYXRpb24gSURzLgorICAgIC8vLworICAgIC8vLyBUaGUgZmlyc3QgdmFsdWUgaW4gdGhlIGFycmF5IGlzIHRoZSBudW1iZXIgb2Ygc3BlY2lhbGl6YXRpb25zL3BhcnRpYWwKKyAgICAvLy8gc3BlY2lhbGl6YXRpb25zIHRoYXQgZm9sbG93LgorICAgIHVpbnQzMl90ICpMYXp5U3BlY2lhbGl6YXRpb25zID0gbnVsbHB0cjsKKyAgfTsKKworICAvLy8gXGJyaWVmIFBvaW50ZXIgdG8gdGhlIGNvbW1vbiBkYXRhIHNoYXJlZCBieSBhbGwgZGVjbGFyYXRpb25zIG9mIHRoaXMKKyAgLy8vIHRlbXBsYXRlLgorICBtdXRhYmxlIENvbW1vbkJhc2UgKkNvbW1vbiA9IG51bGxwdHI7CisgIAorICAvLy8gXGJyaWVmIFJldHJpZXZlcyB0aGUgImNvbW1vbiIgcG9pbnRlciBzaGFyZWQgYnkgYWxsIChyZS0pZGVjbGFyYXRpb25zIG9mCisgIC8vLyB0aGUgc2FtZSB0ZW1wbGF0ZS4gQ2FsbGluZyB0aGlzIHJvdXRpbmUgbWF5IGltcGxpY2l0bHkgYWxsb2NhdGUgbWVtb3J5CisgIC8vLyBmb3IgdGhlIGNvbW1vbiBwb2ludGVyLgorICBDb21tb25CYXNlICpnZXRDb21tb25QdHIoKSBjb25zdDsKKworICB2aXJ0dWFsIENvbW1vbkJhc2UgKm5ld0NvbW1vbihBU1RDb250ZXh0ICZDKSBjb25zdCA9IDA7CisKKyAgLy8gQ29uc3RydWN0IGEgdGVtcGxhdGUgZGVjbCB3aXRoIG5hbWUsIHBhcmFtZXRlcnMsIGFuZCB0ZW1wbGF0ZWQgZWxlbWVudC4KKyAgUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsKENvbnN0cmFpbmVkVGVtcGxhdGVEZWNsSW5mbyAqQ1RESSwgS2luZCBESywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBOYW1lLCBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkRGVjbCAqRGVjbCkKKyAgICAgIDogVGVtcGxhdGVEZWNsKENUREksIERLLCBEQywgTCwgTmFtZSwgUGFyYW1zLCBEZWNsKSwgcmVkZWNsYXJhYmxlX2Jhc2UoQykKKyAgICAgICAge30KKworICBSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2woS2luZCBESywgQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCwgRGVjbGFyYXRpb25OYW1lIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlBhcmFtcywgTmFtZWREZWNsICpEZWNsKQorICAgICAgOiBSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2wobnVsbHB0ciwgREssIEMsIERDLCBMLCBOYW1lLCBQYXJhbXMsIERlY2wpIHt9CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsV3JpdGVyOworICBmcmllbmQgY2xhc3MgQVNUUmVhZGVyOworICB0ZW1wbGF0ZSA8Y2xhc3MgZGVjbF90eXBlPiBmcmllbmQgY2xhc3MgUmVkZWNsYXJhYmxlVGVtcGxhdGU7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZXMgdGhlIGNhbm9uaWNhbCBkZWNsYXJhdGlvbiBvZiB0aGlzIHRlbXBsYXRlLgorICBSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2wgKmdldENhbm9uaWNhbERlY2woKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIGdldEZpcnN0RGVjbCgpOworICB9CisgIGNvbnN0IFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Rmlyc3REZWNsKCk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB0aGlzIHRlbXBsYXRlIHdhcyBhIHNwZWNpYWxpemF0aW9uIG9mIGEKKyAgLy8vIG1lbWJlciB0ZW1wbGF0ZS4KKyAgLy8vCisgIC8vLyBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHRoZSBmdW5jdGlvbiB0ZW1wbGF0ZSBcYyBYPGludD46OmYgYW5kIHRoZQorICAvLy8gbWVtYmVyIHRlbXBsYXRlIFxjIFg8aW50Pjo6SW5uZXIgYXJlIG1lbWJlciBzcGVjaWFsaXphdGlvbnMuCisgIC8vLworICAvLy8gXGNvZGUKKyAgLy8vIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIC8vLyBzdHJ1Y3QgWCB7CisgIC8vLyAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IHZvaWQgZihULCBVKTsKKyAgLy8vICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gc3RydWN0IElubmVyOworICAvLy8gfTsKKyAgLy8vCisgIC8vLyB0ZW1wbGF0ZTw+IHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIC8vLyB2b2lkIFg8aW50Pjo6ZihpbnQsIFQpOworICAvLy8gdGVtcGxhdGU8PiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAvLy8gc3RydWN0IFg8aW50Pjo6SW5uZXIgeyAvKiAuLi4gKi8gfTsKKyAgLy8vIFxlbmRjb2RlCisgIGJvb2wgaXNNZW1iZXJTcGVjaWFsaXphdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Q29tbW9uUHRyKCktPkluc3RhbnRpYXRlZEZyb21NZW1iZXIuZ2V0SW50KCk7CisgIH0KKworICAvLy8gXGJyaWVmIE5vdGUgdGhhdCB0aGlzIG1lbWJlciB0ZW1wbGF0ZSBpcyBhIHNwZWNpYWxpemF0aW9uLgorICB2b2lkIHNldE1lbWJlclNwZWNpYWxpemF0aW9uKCkgeworICAgIGFzc2VydChnZXRDb21tb25QdHIoKS0+SW5zdGFudGlhdGVkRnJvbU1lbWJlci5nZXRQb2ludGVyKCkgJiYKKyAgICAgICAgICAgIk9ubHkgbWVtYmVyIHRlbXBsYXRlcyBjYW4gYmUgbWVtYmVyIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyIpOworICAgIGdldENvbW1vblB0cigpLT5JbnN0YW50aWF0ZWRGcm9tTWVtYmVyLnNldEludCh0cnVlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG1lbWJlciB0ZW1wbGF0ZSBmcm9tIHdoaWNoIHRoaXMgdGVtcGxhdGUgd2FzCisgIC8vLyBpbnN0YW50aWF0ZWQsIG9yIG51bGxwdHIgaWYgdGhpcyB0ZW1wbGF0ZSB3YXMgbm90IGluc3RhbnRpYXRlZCBmcm9tIGEgCisgIC8vLyBtZW1iZXIgdGVtcGxhdGUuCisgIC8vLworICAvLy8gQSB0ZW1wbGF0ZSBpcyBpbnN0YW50aWF0ZWQgZnJvbSBhIG1lbWJlciB0ZW1wbGF0ZSB3aGVuIHRoZSBtZW1iZXIgCisgIC8vLyB0ZW1wbGF0ZSBpdHNlbGYgaXMgcGFydCBvZiBhIGNsYXNzIHRlbXBsYXRlIChvciBtZW1iZXIgdGhlcmVvZikuIEZvcgorICAvLy8gZXhhbXBsZSwgZ2l2ZW4KKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgLy8vIHN0cnVjdCBYIHsKKyAgLy8vICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gdm9pZCBmKFQsIFUpOworICAvLy8gfTsKKyAgLy8vCisgIC8vLyB2b2lkIHRlc3QoWDxpbnQ+IHgpIHsKKyAgLy8vICAgeC5mKDEsICdhJyk7CisgIC8vLyB9OworICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBcYyBYPGludD46OmYgaXMgYSBGdW5jdGlvblRlbXBsYXRlRGVjbCB0aGF0IGRlc2NyaWJlcyB0aGUgZnVuY3Rpb24KKyAgLy8vIHRlbXBsYXRlCisgIC8vLworICAvLy8gXGNvZGUKKyAgLy8vIHRlbXBsYXRlPHR5cGVuYW1lIFU+IHZvaWQgWDxpbnQ+OjpmKGludCwgVSk7CisgIC8vLyBcZW5kY29kZQorICAvLy8KKyAgLy8vIHdoaWNoIHdhcyBpdHNlbGYgY3JlYXRlZCBkdXJpbmcgdGhlIGluc3RhbnRpYXRpb24gb2YgXGMgWDxpbnQ+LiBDYWxsaW5nCisgIC8vLyBnZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyVGVtcGxhdGUoKSBvbiB0aGlzIEZ1bmN0aW9uVGVtcGxhdGVEZWNsIHdpbGwKKyAgLy8vIHJldHJpZXZlIHRoZSBGdW5jdGlvblRlbXBsYXRlRGVjbCBmb3IgdGhlIG9yaWdpbmFsIHRlbXBsYXRlIFxjIGYgd2l0aGluCisgIC8vLyB0aGUgY2xhc3MgdGVtcGxhdGUgXGMgWDxUPiwgaS5lLiwKKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgLy8vIHRlbXBsYXRlPHR5cGVuYW1lIFU+CisgIC8vLyB2b2lkIFg8VD46OmYoVCwgVSk7CisgIC8vLyBcZW5kY29kZQorICBSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2wgKmdldEluc3RhbnRpYXRlZEZyb21NZW1iZXJUZW1wbGF0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Q29tbW9uUHRyKCktPkluc3RhbnRpYXRlZEZyb21NZW1iZXIuZ2V0UG9pbnRlcigpOworICB9CisKKyAgdm9pZCBzZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyVGVtcGxhdGUoUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsICpURCkgeworICAgIGFzc2VydCghZ2V0Q29tbW9uUHRyKCktPkluc3RhbnRpYXRlZEZyb21NZW1iZXIuZ2V0UG9pbnRlcigpKTsKKyAgICBnZXRDb21tb25QdHIoKS0+SW5zdGFudGlhdGVkRnJvbU1lbWJlci5zZXRQb2ludGVyKFREKTsKKyAgfQorCisgIHVzaW5nIHJlZGVjbF9yYW5nZSA9IHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xfcmFuZ2U7CisgIHVzaW5nIHJlZGVjbF9pdGVyYXRvciA9IHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xfaXRlcmF0b3I7CisKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHNfYmVnaW47CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xzX2VuZDsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHM7CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpnZXRQcmV2aW91c0RlY2w7CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpnZXRNb3N0UmVjZW50RGVjbDsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmlzRmlyc3REZWNsOworCisgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7CisgICAgcmV0dXJuIEsgPj0gZmlyc3RSZWRlY2xhcmFibGVUZW1wbGF0ZSAmJiBLIDw9IGxhc3RSZWRlY2xhcmFibGVUZW1wbGF0ZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbDo6CitTcGVjRW50cnlUcmFpdHM8RnVuY3Rpb25UZW1wbGF0ZVNwZWNpYWxpemF0aW9uSW5mbz4geworICB1c2luZyBEZWNsVHlwZSA9IEZ1bmN0aW9uRGVjbDsKKworICBzdGF0aWMgRGVjbFR5cGUgKmdldERlY2woRnVuY3Rpb25UZW1wbGF0ZVNwZWNpYWxpemF0aW9uSW5mbyAqSSkgeworICAgIHJldHVybiBJLT5GdW5jdGlvbjsKKyAgfQorCisgIHN0YXRpYyBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PgorICBnZXRUZW1wbGF0ZUFyZ3MoRnVuY3Rpb25UZW1wbGF0ZVNwZWNpYWxpemF0aW9uSW5mbyAqSSkgeworICAgIHJldHVybiBJLT5UZW1wbGF0ZUFyZ3VtZW50cy0+YXNBcnJheSgpOworICB9Cit9OworCisvLy8gRGVjbGFyYXRpb24gb2YgYSB0ZW1wbGF0ZSBmdW5jdGlvbi4KK2NsYXNzIEZ1bmN0aW9uVGVtcGxhdGVEZWNsIDogcHVibGljIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCB7Citwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBGdW5jdGlvbkRlY2w7CisKKyAgLy8vIFxicmllZiBEYXRhIHRoYXQgaXMgY29tbW9uIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIG9mIGEgZ2l2ZW4KKyAgLy8vIGZ1bmN0aW9uIHRlbXBsYXRlLgorICBzdHJ1Y3QgQ29tbW9uIDogQ29tbW9uQmFzZSB7CisgICAgLy8vIFxicmllZiBUaGUgZnVuY3Rpb24gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIGZvciB0aGlzIGZ1bmN0aW9uCisgICAgLy8vIHRlbXBsYXRlLCBpbmNsdWRpbmcgZXhwbGljaXQgc3BlY2lhbGl6YXRpb25zIGFuZCBpbnN0YW50aWF0aW9ucy4KKyAgICBsbHZtOjpGb2xkaW5nU2V0VmVjdG9yPEZ1bmN0aW9uVGVtcGxhdGVTcGVjaWFsaXphdGlvbkluZm8+IFNwZWNpYWxpemF0aW9uczsKKworICAgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiAiaW5qZWN0ZWQiIHRlbXBsYXRlIGFyZ3VtZW50cyB1c2VkIHdpdGhpbiB0aGlzCisgICAgLy8vIGZ1bmN0aW9uIHRlbXBsYXRlLgorICAgIC8vLworICAgIC8vLyBUaGlzIHBvaW50ZXIgcmVmZXJzIHRvIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgKHRoZXJlIGFyZSBhcworICAgIC8vLyBtYW55IHRlbXBsYXRlIGFyZ3VtZW50cyBhcyB0ZW1wbGF0ZSBwYXJhbWVhdGVycykgZm9yIHRoZSBmdW5jdGlvbgorICAgIC8vLyB0ZW1wbGF0ZSwgYW5kIGlzIGFsbG9jYXRlZCBsYXppbHksIHNpbmNlIG1vc3QgZnVuY3Rpb24gdGVtcGxhdGVzIGRvIG5vdAorICAgIC8vLyByZXF1aXJlIHRoZSB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbi4KKyAgICBUZW1wbGF0ZUFyZ3VtZW50ICpJbmplY3RlZEFyZ3MgPSBudWxscHRyOworCisgICAgQ29tbW9uKCkgPSBkZWZhdWx0OworICB9OworCisgIEZ1bmN0aW9uVGVtcGxhdGVEZWNsKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gTCwKKyAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lIE5hbWUsIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKkRlY2wpCisgICAgICA6IFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbChGdW5jdGlvblRlbXBsYXRlLCBDLCBEQywgTCwgTmFtZSwgUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbCkge30KKworICBDb21tb25CYXNlICpuZXdDb21tb24oQVNUQ29udGV4dCAmQykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgQ29tbW9uICpnZXRDb21tb25QdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PENvbW1vbiAqPihSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2w6OmdldENvbW1vblB0cigpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHNldCBvZiBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgb2YgdGhpcworICAvLy8gZnVuY3Rpb24gdGVtcGxhdGUuCisgIGxsdm06OkZvbGRpbmdTZXRWZWN0b3I8RnVuY3Rpb25UZW1wbGF0ZVNwZWNpYWxpemF0aW9uSW5mbz4gJgorICBnZXRTcGVjaWFsaXphdGlvbnMoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEFkZCBhIHNwZWNpYWxpemF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gdGVtcGxhdGUuCisgIC8vLworICAvLy8gXHBhcmFtIEluc2VydFBvcyBJbnNlcnQgcG9zaXRpb24gaW4gdGhlIEZvbGRpbmdTZXRWZWN0b3IsIG11c3QgaGF2ZSBiZWVuCisgIC8vLyAgICAgICAgcmV0cmlldmVkIGJ5IGFuIGVhcmxpZXIgY2FsbCB0byBmaW5kU3BlY2lhbGl6YXRpb24oKS4KKyAgdm9pZCBhZGRTcGVjaWFsaXphdGlvbihGdW5jdGlvblRlbXBsYXRlU3BlY2lhbGl6YXRpb25JbmZvKiBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkluc2VydFBvcyk7CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsV3JpdGVyOworCisgIC8vLyBcYnJpZWYgTG9hZCBhbnkgbGF6aWx5LWxvYWRlZCBzcGVjaWFsaXphdGlvbnMgZnJvbSB0aGUgZXh0ZXJuYWwgc291cmNlLgorICB2b2lkIExvYWRMYXp5U3BlY2lhbGl6YXRpb25zKCkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBkZWNsYXJhdGlvbiBvZiB0aGUgdGVtcGxhdGUuCisgIEZ1bmN0aW9uRGVjbCAqZ2V0VGVtcGxhdGVkRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RnVuY3Rpb25EZWNsICo+KFRlbXBsYXRlZERlY2wpOworICB9CisKKyAgLy8vIFJldHVybnMgd2hldGhlciB0aGlzIHRlbXBsYXRlIGRlY2xhcmF0aW9uIGRlZmluZXMgdGhlIHByaW1hcnkKKyAgLy8vIHBhdHRlcm4uCisgIGJvb2wgaXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcGxhdGVkRGVjbCgpLT5pc1RoaXNEZWNsYXJhdGlvbkFEZWZpbml0aW9uKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgc3BlY2lhbGl6YXRpb24gd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzIGlmIGl0IGV4aXN0cywKKyAgLy8vIG90aGVyd2lzZSByZXR1cm4gdGhlIGluc2VydGlvbiBwb2ludC4KKyAgRnVuY3Rpb25EZWNsICpmaW5kU3BlY2lhbGl6YXRpb24oQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqJkluc2VydFBvcyk7CisKKyAgRnVuY3Rpb25UZW1wbGF0ZURlY2wgKmdldENhbm9uaWNhbERlY2woKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIGNhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KAorICAgICAgICAgICAgIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbDo6Z2V0Q2Fub25pY2FsRGVjbCgpKTsKKyAgfQorICBjb25zdCBGdW5jdGlvblRlbXBsYXRlRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxGdW5jdGlvblRlbXBsYXRlRGVjbD4oCisgICAgICAgICAgICAgUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsOjpnZXRDYW5vbmljYWxEZWNsKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgcHJldmlvdXMgZGVjbGFyYXRpb24gb2YgdGhpcyBmdW5jdGlvbiB0ZW1wbGF0ZSwgb3IKKyAgLy8vIG51bGxwdHIgaWYgbm8gc3VjaCBkZWNsYXJhdGlvbiBleGlzdHMuCisgIEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpnZXRQcmV2aW91c0RlY2woKSB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxGdW5jdGlvblRlbXBsYXRlRGVjbD4oCisgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsICo+KHRoaXMpLT5nZXRQcmV2aW91c0RlY2woKSk7CisgIH0KKyAgY29uc3QgRnVuY3Rpb25UZW1wbGF0ZURlY2wgKmdldFByZXZpb3VzRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPEZ1bmN0aW9uVGVtcGxhdGVEZWNsPigKKyAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2wgKj4odGhpcyktPmdldFByZXZpb3VzRGVjbCgpKTsKKyAgfQorCisgIEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpnZXRNb3N0UmVjZW50RGVjbCgpIHsKKyAgICByZXR1cm4gY2FzdDxGdW5jdGlvblRlbXBsYXRlRGVjbD4oCisgICAgICAgIHN0YXRpY19jYXN0PFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCAqPih0aGlzKQorICAgICAgICAgICAgLT5nZXRNb3N0UmVjZW50RGVjbCgpKTsKKyAgfQorICBjb25zdCBGdW5jdGlvblRlbXBsYXRlRGVjbCAqZ2V0TW9zdFJlY2VudERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2wqPih0aGlzKS0+Z2V0TW9zdFJlY2VudERlY2woKTsKKyAgfQorCisgIEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpnZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyVGVtcGxhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxGdW5jdGlvblRlbXBsYXRlRGVjbD4oCisgICAgICAgICAgICAgUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsOjpnZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyVGVtcGxhdGUoKSk7CisgIH0KKworICB1c2luZyBzcGVjX2l0ZXJhdG9yID0gU3BlY0l0ZXJhdG9yPEZ1bmN0aW9uVGVtcGxhdGVTcGVjaWFsaXphdGlvbkluZm8+OworICB1c2luZyBzcGVjX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c3BlY19pdGVyYXRvcj47CisKKyAgc3BlY19yYW5nZSBzcGVjaWFsaXphdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIHNwZWNfcmFuZ2Uoc3BlY19iZWdpbigpLCBzcGVjX2VuZCgpKTsKKyAgfQorCisgIHNwZWNfaXRlcmF0b3Igc3BlY19iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZVNwZWNJdGVyYXRvcihnZXRTcGVjaWFsaXphdGlvbnMoKSwgZmFsc2UpOworICB9CisKKyAgc3BlY19pdGVyYXRvciBzcGVjX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZVNwZWNJdGVyYXRvcihnZXRTcGVjaWFsaXphdGlvbnMoKSwgdHJ1ZSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSAiaW5qZWN0ZWQiIHRlbXBsYXRlIGFyZ3VtZW50cyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlCisgIC8vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIG9mIHRoaXMgZnVuY3Rpb24gdGVtcGxhdGUuCisgIC8vLworICAvLy8gQWx0aG91Z2ggdGhlIEMrKyBzdGFuZGFyZCBoYXMgbm8gbm90aW9uIG9mIHRoZSAiaW5qZWN0ZWQiIHRlbXBsYXRlCisgIC8vLyBhcmd1bWVudHMgZm9yIGEgZnVuY3Rpb24gdGVtcGxhdGUsIHRoZSBub3Rpb24gaXMgY29udmVuaWVudCB3aGVuCisgIC8vLyB3ZSBuZWVkIHRvIHBlcmZvcm0gc3Vic3RpdHV0aW9ucyBpbnNpZGUgdGhlIGRlZmluaXRpb24gb2YgYSBmdW5jdGlvbgorICAvLy8gdGVtcGxhdGUuCisgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IGdldEluamVjdGVkVGVtcGxhdGVBcmdzKCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBmdW5jdGlvbiB0ZW1wbGF0ZSBub2RlLgorICBzdGF0aWMgRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpEZWNsKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhbiBlbXB0eSBmdW5jdGlvbiB0ZW1wbGF0ZSBub2RlLgorICBzdGF0aWMgRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3Qgc3VwcG9ydAorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IEZ1bmN0aW9uVGVtcGxhdGU7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBLaW5kcyBvZiBUZW1wbGF0ZSBQYXJhbWV0ZXJzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gXGJyaWVmIERlZmluZXMgdGhlIHBvc2l0aW9uIG9mIGEgdGVtcGxhdGUgcGFyYW1ldGVyIHdpdGhpbiBhIHRlbXBsYXRlCisvLy8gcGFyYW1ldGVyIGxpc3QuCisvLy8KKy8vLyBCZWNhdXNlIHRlbXBsYXRlIHBhcmFtZXRlciBjYW4gYmUgbGlzdGVkCisvLy8gc2VxdWVudGlhbGx5IGZvciBvdXQtb2YtbGluZSB0ZW1wbGF0ZSBtZW1iZXJzLCBlYWNoIHRlbXBsYXRlIHBhcmFtZXRlciBpcworLy8vIGdpdmVuIGEgRGVwdGggLSB0aGUgbmVzdGluZyBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXIgc2NvcGVzIC0gYW5kIGEgUG9zaXRpb24gLQorLy8vIHRoZSBvY2N1cnJlbmNlIHdpdGhpbiB0aGUgcGFyYW1ldGVyIGxpc3QuCisvLy8gVGhpcyBjbGFzcyBpcyBpbmhlcml0ZWRseSBwcml2YXRlbHkgYnkgZGlmZmVyZW50IGtpbmRzIG9mIHRlbXBsYXRlCisvLy8gcGFyYW1ldGVycyBhbmQgaXMgbm90IHBhcnQgb2YgdGhlIERlY2wgaGllcmFyY2h5LiBKdXN0IGEgZmFjaWxpdHkuCitjbGFzcyBUZW1wbGF0ZVBhcm1Qb3NpdGlvbiB7Citwcm90ZWN0ZWQ6CisgIC8vIEZJWE1FOiBUaGVzZSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGJlIGludHMuIGludDo1IGZvciBkZXB0aCwgaW50OjggZm9yCisgIC8vIHBvc2l0aW9uPyBNYXliZT8KKyAgdW5zaWduZWQgRGVwdGg7CisgIHVuc2lnbmVkIFBvc2l0aW9uOworCisgIFRlbXBsYXRlUGFybVBvc2l0aW9uKHVuc2lnbmVkIEQsIHVuc2lnbmVkIFApIDogRGVwdGgoRCksIFBvc2l0aW9uKFApIHt9CisKK3B1YmxpYzoKKyAgVGVtcGxhdGVQYXJtUG9zaXRpb24oKSA9IGRlbGV0ZTsKKworICAvLy8gR2V0IHRoZSBuZXN0aW5nIGRlcHRoIG9mIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCisgIHVuc2lnbmVkIGdldERlcHRoKCkgY29uc3QgeyByZXR1cm4gRGVwdGg7IH0KKyAgdm9pZCBzZXREZXB0aCh1bnNpZ25lZCBEKSB7IERlcHRoID0gRDsgfQorCisgIC8vLyBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgd2l0aGluIGl0cyBwYXJhbWV0ZXIgbGlzdC4KKyAgdW5zaWduZWQgZ2V0UG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBQb3NpdGlvbjsgfQorICB2b2lkIHNldFBvc2l0aW9uKHVuc2lnbmVkIFApIHsgUG9zaXRpb24gPSBQOyB9CisKKyAgLy8vIEdldCB0aGUgaW5kZXggb2YgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciB3aXRoaW4gaXRzIHBhcmFtZXRlciBsaXN0LgorICB1bnNpZ25lZCBnZXRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIFBvc2l0aW9uOyB9Cit9OworCisvLy8gXGJyaWVmIERlY2xhcmF0aW9uIG9mIGEgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXIuCisvLy8KKy8vLyBGb3IgZXhhbXBsZSwgIlQiIGluCisvLy8gXGNvZGUKKy8vLyB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyB2ZWN0b3I7CisvLy8gXGVuZGNvZGUKK2NsYXNzIFRlbXBsYXRlVHlwZVBhcm1EZWNsIDogcHVibGljIFR5cGVEZWNsIHsKKyAgLy8vIFNlbWEgY3JlYXRlcyB0aGVzZSBvbiB0aGUgc3RhY2sgZHVyaW5nIGF1dG8gdHlwZSBkZWR1Y3Rpb24uCisgIGZyaWVuZCBjbGFzcyBTZW1hOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIHRlbXBsYXRlIHR5cGUgcGFyYW1ldGVyIHdhcyBkZWNsYXJhdGlvbiB3aXRoCisgIC8vLyB0aGUgJ3R5cGVuYW1lJyBrZXl3b3JkLgorICAvLy8KKyAgLy8vIElmIGZhbHNlLCBpdCB3YXMgZGVjbGFyZWQgd2l0aCB0aGUgJ2NsYXNzJyBrZXl3b3JkLgorICBib29sIFR5cGVuYW1lIDogMTsKKworICAvLy8gXGJyaWVmIFRoZSBkZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50LCBpZiBhbnkuCisgIHVzaW5nIERlZkFyZ1N0b3JhZ2UgPQorICAgICAgRGVmYXVsdEFyZ1N0b3JhZ2U8VGVtcGxhdGVUeXBlUGFybURlY2wsIFR5cGVTb3VyY2VJbmZvICo+OworICBEZWZBcmdTdG9yYWdlIERlZmF1bHRBcmd1bWVudDsKKworICBUZW1wbGF0ZVR5cGVQYXJtRGVjbChEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIEtleUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRMb2MsIElkZW50aWZpZXJJbmZvICpJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBUeXBlbmFtZSkKKyAgICAgIDogVHlwZURlY2woVGVtcGxhdGVUeXBlUGFybSwgREMsIElkTG9jLCBJZCwgS2V5TG9jKSwgVHlwZW5hbWUoVHlwZW5hbWUpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIFRlbXBsYXRlVHlwZVBhcm1EZWNsICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBLZXlMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEQsIHVuc2lnbmVkIFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpJZCwgYm9vbCBUeXBlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQYXJhbWV0ZXJQYWNrKTsKKyAgc3RhdGljIFRlbXBsYXRlVHlwZVBhcm1EZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoY29uc3QgQVNUQ29udGV4dCAmQywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElEKTsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyB0ZW1wbGF0ZSB0eXBlIHBhcmFtZXRlciB3YXMgZGVjbGFyZWQgd2l0aAorICAvLy8gdGhlICd0eXBlbmFtZScga2V5d29yZC4KKyAgLy8vCisgIC8vLyBJZiBub3QsIGl0IHdhcyBkZWNsYXJlZCB3aXRoIHRoZSAnY2xhc3MnIGtleXdvcmQuCisgIGJvb2wgd2FzRGVjbGFyZWRXaXRoVHlwZW5hbWUoKSBjb25zdCB7IHJldHVybiBUeXBlbmFtZTsgfQorCisgIGNvbnN0IERlZkFyZ1N0b3JhZ2UgJmdldERlZmF1bHRBcmdTdG9yYWdlKCkgY29uc3QgeyByZXR1cm4gRGVmYXVsdEFyZ3VtZW50OyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHRlbXBsYXRlIHBhcmFtZXRlciBoYXMgYSBkZWZhdWx0CisgIC8vLyBhcmd1bWVudC4KKyAgYm9vbCBoYXNEZWZhdWx0QXJndW1lbnQoKSBjb25zdCB7IHJldHVybiBEZWZhdWx0QXJndW1lbnQuaXNTZXQoKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGRlZmF1bHQgYXJndW1lbnQsIGlmIGFueS4KKyAgUXVhbFR5cGUgZ2V0RGVmYXVsdEFyZ3VtZW50KCkgY29uc3QgeworICAgIHJldHVybiBEZWZhdWx0QXJndW1lbnQuZ2V0KCktPmdldFR5cGUoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmVzIHRoZSBkZWZhdWx0IGFyZ3VtZW50J3Mgc291cmNlIGluZm9ybWF0aW9uLCBpZiBhbnkuCisgIFR5cGVTb3VyY2VJbmZvICpnZXREZWZhdWx0QXJndW1lbnRJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBEZWZhdWx0QXJndW1lbnQuZ2V0KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlcyB0aGUgbG9jYXRpb24gb2YgdGhlIGRlZmF1bHQgYXJndW1lbnQgZGVjbGFyYXRpb24uCisgIFNvdXJjZUxvY2F0aW9uIGdldERlZmF1bHRBcmd1bWVudExvYygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZWZhdWx0IGFyZ3VtZW50IHdhcyBpbmhlcml0ZWQKKyAgLy8vIGZyb20gYSBwcmV2aW91cyBkZWNsYXJhdGlvbiBvZiB0aGlzIHRlbXBsYXRlLgorICBib29sIGRlZmF1bHRBcmd1bWVudFdhc0luaGVyaXRlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRGVmYXVsdEFyZ3VtZW50LmlzSW5oZXJpdGVkKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgZGVmYXVsdCBhcmd1bWVudCBmb3IgdGhpcyB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCisgIHZvaWQgc2V0RGVmYXVsdEFyZ3VtZW50KFR5cGVTb3VyY2VJbmZvICpEZWZBcmcpIHsKKyAgICBEZWZhdWx0QXJndW1lbnQuc2V0KERlZkFyZyk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGF0IHRoaXMgZGVmYXVsdCBhcmd1bWVudCB3YXMgaW5oZXJpdGVkIGZyb20gYW5vdGhlcgorICAvLy8gcGFyYW1ldGVyLgorICB2b2lkIHNldEluaGVyaXRlZERlZmF1bHRBcmd1bWVudChjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVR5cGVQYXJtRGVjbCAqUHJldikgeworICAgIERlZmF1bHRBcmd1bWVudC5zZXRJbmhlcml0ZWQoQywgUHJldik7CisgIH0KKworICAvLy8gXGJyaWVmIFJlbW92ZXMgdGhlIGRlZmF1bHQgYXJndW1lbnQgb2YgdGhpcyB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCisgIHZvaWQgcmVtb3ZlRGVmYXVsdEFyZ3VtZW50KCkgeworICAgIERlZmF1bHRBcmd1bWVudC5jbGVhcigpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgd2hldGhlciB0aGlzIHRlbXBsYXRlIHR5cGUgcGFyYW1ldGVyIHdhcyBkZWNsYXJlZCB3aXRoCisgIC8vLyB0aGUgJ3R5cGVuYW1lJyBvciAnY2xhc3MnIGtleXdvcmQuCisgIHZvaWQgc2V0RGVjbGFyZWRXaXRoVHlwZW5hbWUoYm9vbCB3aXRoVHlwZW5hbWUpIHsgVHlwZW5hbWUgPSB3aXRoVHlwZW5hbWU7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBkZXB0aCBvZiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLgorICB1bnNpZ25lZCBnZXREZXB0aCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGluZGV4IG9mIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCisgIHVuc2lnbmVkIGdldEluZGV4KCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpcyBhIHBhcmFtZXRlciBwYWNrLgorICBib29sIGlzUGFyYW1ldGVyUGFjaygpIGNvbnN0OworCisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWTsKKworICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC9ldGMuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gVGVtcGxhdGVUeXBlUGFybTsgfQorfTsKKworLy8vIE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsIC0gRGVjbGFyZXMgYSBub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIsCisvLy8gZS5nLiwgIlNpemUiIGluCisvLy8gQGNvZGUKKy8vLyB0ZW1wbGF0ZTxpbnQgU2l6ZT4gY2xhc3MgYXJyYXkgeyB9OworLy8vIEBlbmRjb2RlCitjbGFzcyBOb25UeXBlVGVtcGxhdGVQYXJtRGVjbCBmaW5hbAorICAgIDogcHVibGljIERlY2xhcmF0b3JEZWNsLAorICAgICAgcHJvdGVjdGVkIFRlbXBsYXRlUGFybVBvc2l0aW9uLAorICAgICAgcHJpdmF0ZSBsbHZtOjpUcmFpbGluZ09iamVjdHM8Tm9uVHlwZVRlbXBsYXRlUGFybURlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8UXVhbFR5cGUsIFR5cGVTb3VyY2VJbmZvICo+PiB7CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIC8vLyBcYnJpZWYgVGhlIGRlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnQsIGlmIGFueSwgYW5kIHdoZXRoZXIgb3Igbm90CisgIC8vLyBpdCB3YXMgaW5oZXJpdGVkLgorICB1c2luZyBEZWZBcmdTdG9yYWdlID0gRGVmYXVsdEFyZ1N0b3JhZ2U8Tm9uVHlwZVRlbXBsYXRlUGFybURlY2wsIEV4cHIgKj47CisgIERlZkFyZ1N0b3JhZ2UgRGVmYXVsdEFyZ3VtZW50OworCisgIC8vIEZJWE1FOiBDb2xsYXBzZSB0aGlzIGludG8gVGVtcGxhdGVQYXJhbVBvc2l0aW9uOyBvciwganVzdCBtb3ZlIGRlcHRoL2luZGV4CisgIC8vIGRvd24gaGVyZSB0byBzYXZlIG1lbW9yeS4KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaXMgYSBwYXJhbWV0ZXIgcGFjay4KKyAgYm9vbCBQYXJhbWV0ZXJQYWNrOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlciBpcyBhbiAiZXhwYW5kZWQiCisgIC8vLyBwYXJhbWV0ZXIgcGFjaywgbWVhbmluZyB0aGF0IGl0cyB0eXBlIGlzIGEgcGFjayBleHBhbnNpb24gYW5kIHdlCisgIC8vLyBhbHJlYWR5IGtub3cgdGhlIHNldCBvZiB0eXBlcyB0aGF0IGV4cGFuc2lvbiBleHBhbmRzIHRvLgorICBib29sIEV4cGFuZGVkUGFyYW1ldGVyUGFjayA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiB0eXBlcyBpbiBhbiBleHBhbmRlZCBwYXJhbWV0ZXIgcGFjay4KKyAgdW5zaWduZWQgTnVtRXhwYW5kZWRUeXBlcyA9IDA7CisKKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cygKKyAgICAgIE92ZXJsb2FkVG9rZW48c3RkOjpwYWlyPFF1YWxUeXBlLCBUeXBlU291cmNlSW5mbyAqPj4pIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtRXhwYW5kZWRUeXBlczsKKyAgfQorCisgIE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsKERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLCB1bnNpZ25lZCBELCB1bnNpZ25lZCBQLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsIFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUGFyYW1ldGVyUGFjaywgVHlwZVNvdXJjZUluZm8gKlRJbmZvKQorICAgICAgOiBEZWNsYXJhdG9yRGVjbChOb25UeXBlVGVtcGxhdGVQYXJtLCBEQywgSWRMb2MsIElkLCBULCBUSW5mbywgU3RhcnRMb2MpLAorICAgICAgICBUZW1wbGF0ZVBhcm1Qb3NpdGlvbihELCBQKSwgUGFyYW1ldGVyUGFjayhQYXJhbWV0ZXJQYWNrKSB7fQorCisgIE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsKERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLCB1bnNpZ25lZCBELCB1bnNpZ25lZCBQLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsIFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UXVhbFR5cGU+IEV4cGFuZGVkVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFR5cGVTb3VyY2VJbmZvICo+IEV4cGFuZGVkVEluZm9zKTsKKworcHVibGljOgorICBzdGF0aWMgTm9uVHlwZVRlbXBsYXRlUGFybURlY2wgKgorICBDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLCB1bnNpZ25lZCBELCB1bnNpZ25lZCBQLCBJZGVudGlmaWVySW5mbyAqSWQsCisgICAgICAgICBRdWFsVHlwZSBULCBib29sIFBhcmFtZXRlclBhY2ssIFR5cGVTb3VyY2VJbmZvICpUSW5mbyk7CisKKyAgc3RhdGljIE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsICoKKyAgQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJZExvYywgdW5zaWduZWQgRCwgdW5zaWduZWQgUCwgSWRlbnRpZmllckluZm8gKklkLAorICAgICAgICAgUXVhbFR5cGUgVCwgVHlwZVNvdXJjZUluZm8gKlRJbmZvLCBBcnJheVJlZjxRdWFsVHlwZT4gRXhwYW5kZWRUeXBlcywKKyAgICAgICAgIEFycmF5UmVmPFR5cGVTb3VyY2VJbmZvICo+IEV4cGFuZGVkVEluZm9zKTsKKworICBzdGF0aWMgTm9uVHlwZVRlbXBsYXRlUGFybURlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpOworICBzdGF0aWMgTm9uVHlwZVRlbXBsYXRlUGFybURlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUV4cGFuZGVkVHlwZXMpOworICAgIAorICB1c2luZyBUZW1wbGF0ZVBhcm1Qb3NpdGlvbjo6Z2V0RGVwdGg7CisgIHVzaW5nIFRlbXBsYXRlUGFybVBvc2l0aW9uOjpzZXREZXB0aDsKKyAgdXNpbmcgVGVtcGxhdGVQYXJtUG9zaXRpb246OmdldFBvc2l0aW9uOworICB1c2luZyBUZW1wbGF0ZVBhcm1Qb3NpdGlvbjo6c2V0UG9zaXRpb247CisgIHVzaW5nIFRlbXBsYXRlUGFybVBvc2l0aW9uOjpnZXRJbmRleDsKKworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFk7CisKKyAgY29uc3QgRGVmQXJnU3RvcmFnZSAmZ2V0RGVmYXVsdEFyZ1N0b3JhZ2UoKSBjb25zdCB7IHJldHVybiBEZWZhdWx0QXJndW1lbnQ7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgdGVtcGxhdGUgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQKKyAgLy8vIGFyZ3VtZW50LgorICBib29sIGhhc0RlZmF1bHRBcmd1bWVudCgpIGNvbnN0IHsgcmV0dXJuIERlZmF1bHRBcmd1bWVudC5pc1NldCgpOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgZGVmYXVsdCBhcmd1bWVudCwgaWYgYW55LgorICBFeHByICpnZXREZWZhdWx0QXJndW1lbnQoKSBjb25zdCB7IHJldHVybiBEZWZhdWx0QXJndW1lbnQuZ2V0KCk7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZGVmYXVsdCBhcmd1bWVudCwgaWYgYW55LgorICBTb3VyY2VMb2NhdGlvbiBnZXREZWZhdWx0QXJndW1lbnRMb2MoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB0aGUgZGVmYXVsdCBhcmd1bWVudCB3YXMgaW5oZXJpdGVkCisgIC8vLyBmcm9tIGEgcHJldmlvdXMgZGVjbGFyYXRpb24gb2YgdGhpcyB0ZW1wbGF0ZS4KKyAgYm9vbCBkZWZhdWx0QXJndW1lbnRXYXNJbmhlcml0ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIERlZmF1bHRBcmd1bWVudC5pc0luaGVyaXRlZCgpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGRlZmF1bHQgYXJndW1lbnQgZm9yIHRoaXMgdGVtcGxhdGUgcGFyYW1ldGVyLCBhbmQKKyAgLy8vIHdoZXRoZXIgdGhhdCBkZWZhdWx0IGFyZ3VtZW50IHdhcyBpbmhlcml0ZWQgZnJvbSBhbm90aGVyCisgIC8vLyBkZWNsYXJhdGlvbi4KKyAgdm9pZCBzZXREZWZhdWx0QXJndW1lbnQoRXhwciAqRGVmQXJnKSB7IERlZmF1bHRBcmd1bWVudC5zZXQoRGVmQXJnKTsgfQorICB2b2lkIHNldEluaGVyaXRlZERlZmF1bHRBcmd1bWVudChjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25UeXBlVGVtcGxhdGVQYXJtRGVjbCAqUGFybSkgeworICAgIERlZmF1bHRBcmd1bWVudC5zZXRJbmhlcml0ZWQoQywgUGFybSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlbW92ZXMgdGhlIGRlZmF1bHQgYXJndW1lbnQgb2YgdGhpcyB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCisgIHZvaWQgcmVtb3ZlRGVmYXVsdEFyZ3VtZW50KCkgeyBEZWZhdWx0QXJndW1lbnQuY2xlYXIoKTsgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIHBhcmFtZXRlciBpcyBhIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlciBwYWNrLgorICAvLy8KKyAgLy8vIElmIHRoZSBwYXJhbWV0ZXIgaXMgYSBwYXJhbWV0ZXIgcGFjaywgdGhlIHR5cGUgbWF5IGJlIGEKKyAgLy8vIFxjIFBhY2tFeHBhbnNpb25UeXBlLiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHRoZSBcYyBEaW1zIHBhcmFtZXRlcgorICAvLy8gaXMgYSBwYXJhbWV0ZXIgcGFjayAod2hvc2UgdHlwZSBpcyAndW5zaWduZWQnKS4KKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gdGVtcGxhdGU8dHlwZW5hbWUgVCwgdW5zaWduZWQgLi4uRGltcz4gc3RydWN0IG11bHRpX2FycmF5OworICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBpc1BhcmFtZXRlclBhY2soKSBjb25zdCB7IHJldHVybiBQYXJhbWV0ZXJQYWNrOyB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgcGFyYW1ldGVyIHBhY2sgaXMgYSBwYWNrIGV4cGFuc2lvbi4KKyAgLy8vCisgIC8vLyBBIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlciBwYWNrIGlzIGEgcGFjayBleHBhbnNpb24gaWYgaXRzIHR5cGUKKyAgLy8vIGNvbnRhaW5zIGFuIHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2suIEluIHRoaXMgY2FzZSwgd2Ugd2lsbCBoYXZlCisgIC8vLyBidWlsdCBhIFBhY2tFeHBhbnNpb25UeXBlIHdyYXBwaW5nIHRoZSB0eXBlLgorICBib29sIGlzUGFja0V4cGFuc2lvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1ldGVyUGFjayAmJiBnZXRUeXBlKCktPmdldEFzPFBhY2tFeHBhbnNpb25UeXBlPigpOworICB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgcGFyYW1ldGVyIGlzIGEgbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVyIHBhY2sKKyAgLy8vIHRoYXQgaGFzIGEga25vd24gbGlzdCBvZiBkaWZmZXJlbnQgdHlwZXMgYXQgZGlmZmVyZW50IHBvc2l0aW9ucy4KKyAgLy8vCisgIC8vLyBBIHBhcmFtZXRlciBwYWNrIGlzIGFuIGV4cGFuZGVkIHBhcmFtZXRlciBwYWNrIHdoZW4gdGhlIG9yaWdpbmFsCisgIC8vLyBwYXJhbWV0ZXIgcGFjaydzIHR5cGUgd2FzIGl0c2VsZiBhIHBhY2sgZXhwYW5zaW9uLCBhbmQgdGhhdCBleHBhbnNpb24KKyAgLy8vIGhhcyBhbHJlYWR5IGJlZW4gZXhwYW5kZWQuIEZvciBleGFtcGxlLCBnaXZlbjoKKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gdGVtcGxhdGU8dHlwZW5hbWUgLi4uVHlwZXM+CisgIC8vLyBzdHJ1Y3QgWCB7CisgIC8vLyAgIHRlbXBsYXRlPFR5cGVzIC4uLlZhbHVlcz4KKyAgLy8vICAgc3RydWN0IFkgeyAvKiAuLi4gKi8gfTsKKyAgLy8vIH07CisgIC8vLyBcZW5kY29kZQorICAvLy8KKyAgLy8vIFRoZSBwYXJhbWV0ZXIgcGFjayBcYyBWYWx1ZXMgaGFzIGEgXGMgUGFja0V4cGFuc2lvblR5cGUgYXMgaXRzIHR5cGUsCisgIC8vLyB3aGljaCBleHBhbmRzIFxjIFR5cGVzLiBXaGVuIFxjIFR5cGVzIGlzIHN1cHBsaWVkIHdpdGggdGVtcGxhdGUgYXJndW1lbnRzCisgIC8vLyBieSBpbnN0YW50aWF0aW5nIFxjIFgsIHRoZSBpbnN0YW50aWF0aW9uIG9mIFxjIFZhbHVlcyBiZWNvbWVzIGFuCisgIC8vLyBleHBhbmRlZCBwYXJhbWV0ZXIgcGFjay4gRm9yIGV4YW1wbGUsIGluc3RhbnRpYXRpbmcKKyAgLy8vIFxjIFg8aW50LCB1bnNpZ25lZCBpbnQ+IHJlc3VsdHMgaW4gXGMgVmFsdWVzIGJlaW5nIGFuIGV4cGFuZGVkIHBhcmFtZXRlcgorICAvLy8gcGFjayB3aXRoIGV4cGFuc2lvbiB0eXBlcyBcYyBpbnQgYW5kIFxjIHVuc2lnbmVkIGludC4KKyAgLy8vCisgIC8vLyBUaGUgXGMgZ2V0RXhwYW5zaW9uVHlwZSgpIGFuZCBcYyBnZXRFeHBhbnNpb25UeXBlU291cmNlSW5mbygpIGZ1bmN0aW9ucworICAvLy8gcmV0dXJuIHRoZSBleHBhbnNpb24gdHlwZXMuCisgIGJvb2wgaXNFeHBhbmRlZFBhcmFtZXRlclBhY2soKSBjb25zdCB7IHJldHVybiBFeHBhbmRlZFBhcmFtZXRlclBhY2s7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIGV4cGFuc2lvbiB0eXBlcyBpbiBhbiBleHBhbmRlZCBwYXJhbWV0ZXIKKyAgLy8vIHBhY2suCisgIHVuc2lnbmVkIGdldE51bUV4cGFuc2lvblR5cGVzKCkgY29uc3QgeworICAgIGFzc2VydChFeHBhbmRlZFBhcmFtZXRlclBhY2sgJiYgIk5vdCBhbiBleHBhbnNpb24gcGFyYW1ldGVyIHBhY2siKTsKKyAgICByZXR1cm4gTnVtRXhwYW5kZWRUeXBlczsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYSBwYXJ0aWN1bGFyIGV4cGFuc2lvbiB0eXBlIHdpdGhpbiBhbiBleHBhbmRlZCBwYXJhbWV0ZXIKKyAgLy8vIHBhY2suCisgIFF1YWxUeXBlIGdldEV4cGFuc2lvblR5cGUodW5zaWduZWQgSSkgY29uc3QgeworICAgIGFzc2VydChJIDwgTnVtRXhwYW5kZWRUeXBlcyAmJiAiT3V0LW9mLXJhbmdlIGV4cGFuc2lvbiB0eXBlIGluZGV4Iik7CisgICAgYXV0byBUeXBlc0FuZEluZm9zID0KKyAgICAgICAgZ2V0VHJhaWxpbmdPYmplY3RzPHN0ZDo6cGFpcjxRdWFsVHlwZSwgVHlwZVNvdXJjZUluZm8gKj4+KCk7CisgICAgcmV0dXJuIFR5cGVzQW5kSW5mb3NbSV0uZmlyc3Q7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIGEgcGFydGljdWxhciBleHBhbnNpb24gdHlwZSBzb3VyY2UgaW5mbyB3aXRoaW4gYW4KKyAgLy8vIGV4cGFuZGVkIHBhcmFtZXRlciBwYWNrLgorICBUeXBlU291cmNlSW5mbyAqZ2V0RXhwYW5zaW9uVHlwZVNvdXJjZUluZm8odW5zaWduZWQgSSkgY29uc3QgeworICAgIGFzc2VydChJIDwgTnVtRXhwYW5kZWRUeXBlcyAmJiAiT3V0LW9mLXJhbmdlIGV4cGFuc2lvbiB0eXBlIGluZGV4Iik7CisgICAgYXV0byBUeXBlc0FuZEluZm9zID0KKyAgICAgICAgZ2V0VHJhaWxpbmdPYmplY3RzPHN0ZDo6cGFpcjxRdWFsVHlwZSwgVHlwZVNvdXJjZUluZm8gKj4+KCk7CisgICAgcmV0dXJuIFR5cGVzQW5kSW5mb3NbSV0uc2Vjb25kOworICB9CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IE5vblR5cGVUZW1wbGF0ZVBhcm07IH0KK307CisKKy8vLyBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2wgLSBEZWNsYXJlcyBhIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlciwKKy8vLyBlLmcuLCAiVCIgaW4KKy8vLyBAY29kZQorLy8vIHRlbXBsYXRlIDx0ZW1wbGF0ZSA8dHlwZW5hbWU+IGNsYXNzIFQ+IGNsYXNzIGNvbnRhaW5lciB7IH07CisvLy8gQGVuZGNvZGUKKy8vLyBBIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlciBpcyBhIFRlbXBsYXRlRGVjbCBiZWNhdXNlIGl0IGRlZmluZXMgdGhlCisvLy8gbmFtZSBvZiBhIHRlbXBsYXRlIGFuZCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhbGxvd2FibGUgZm9yIHN1YnN0aXR1dGlvbi4KK2NsYXNzIFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCBmaW5hbAorICAgIDogcHVibGljIFRlbXBsYXRlRGVjbCwKKyAgICAgIHByb3RlY3RlZCBUZW1wbGF0ZVBhcm1Qb3NpdGlvbiwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqPiB7CisgIC8vLyBcYnJpZWYgVGhlIGRlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnQsIGlmIGFueS4KKyAgdXNpbmcgRGVmQXJnU3RvcmFnZSA9CisgICAgICBEZWZhdWx0QXJnU3RvcmFnZTxUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2wsIFRlbXBsYXRlQXJndW1lbnRMb2MgKj47CisgIERlZkFyZ1N0b3JhZ2UgRGVmYXVsdEFyZ3VtZW50OworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIHBhcmFtZXRlciBpcyBhIHBhcmFtZXRlciBwYWNrLgorICBib29sIFBhcmFtZXRlclBhY2s7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyIGlzIGFuICJleHBhbmRlZCIKKyAgLy8vIHBhcmFtZXRlciBwYWNrLCBtZWFuaW5nIHRoYXQgaXQgaXMgYSBwYWNrIGV4cGFuc2lvbiBhbmQgd2UKKyAgLy8vIGFscmVhZHkga25vdyB0aGUgc2V0IG9mIHRlbXBsYXRlIHBhcmFtZXRlcnMgdGhhdCBleHBhbnNpb24gZXhwYW5kcyB0by4KKyAgYm9vbCBFeHBhbmRlZFBhcmFtZXRlclBhY2sgPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBpbiBhbiBleHBhbmRlZCBwYXJhbWV0ZXIgcGFjay4KKyAgdW5zaWduZWQgTnVtRXhwYW5kZWRQYXJhbXMgPSAwOworCisgIFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbChEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBELCB1bnNpZ25lZCBQLCBib29sIFBhcmFtZXRlclBhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zKQorICAgICAgOiBUZW1wbGF0ZURlY2woVGVtcGxhdGVUZW1wbGF0ZVBhcm0sIERDLCBMLCBJZCwgUGFyYW1zKSwKKyAgICAgICAgVGVtcGxhdGVQYXJtUG9zaXRpb24oRCwgUCksIFBhcmFtZXRlclBhY2soUGFyYW1ldGVyUGFjaykge30KKworICBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2woRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRCwgdW5zaWduZWQgUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpJZCwgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKj4gRXhwYW5zaW9ucyk7CisKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgc3RhdGljIFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEwsIHVuc2lnbmVkIEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQLCBib29sIFBhcmFtZXRlclBhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlBhcmFtcyk7CisgIHN0YXRpYyBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2wgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMLCB1bnNpZ25lZCBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICo+IEV4cGFuc2lvbnMpOworCisgIHN0YXRpYyBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpOworICBzdGF0aWMgVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtRXhwYW5zaW9ucyk7CisgIAorICB1c2luZyBUZW1wbGF0ZVBhcm1Qb3NpdGlvbjo6Z2V0RGVwdGg7CisgIHVzaW5nIFRlbXBsYXRlUGFybVBvc2l0aW9uOjpzZXREZXB0aDsKKyAgdXNpbmcgVGVtcGxhdGVQYXJtUG9zaXRpb246OmdldFBvc2l0aW9uOworICB1c2luZyBUZW1wbGF0ZVBhcm1Qb3NpdGlvbjo6c2V0UG9zaXRpb247CisgIHVzaW5nIFRlbXBsYXRlUGFybVBvc2l0aW9uOjpnZXRJbmRleDsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaXMgYSB0ZW1wbGF0ZQorICAvLy8gcGFyYW1ldGVyIHBhY2suCisgIC8vLworICAvLy8gXGNvZGUKKyAgLy8vIHRlbXBsYXRlPHRlbXBsYXRlIDxjbGFzcyBUPiAuLi5NZXRhRnVuY3Rpb25zPiBzdHJ1Y3QgQXBwbHk7CisgIC8vLyBcZW5kY29kZQorICBib29sIGlzUGFyYW1ldGVyUGFjaygpIGNvbnN0IHsgcmV0dXJuIFBhcmFtZXRlclBhY2s7IH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBwYXJhbWV0ZXIgcGFjayBpcyBhIHBhY2sgZXhwYW5zaW9uLgorICAvLy8KKyAgLy8vIEEgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyIHBhY2sgaXMgYSBwYWNrIGV4cGFuc2lvbiBpZiBpdHMgdGVtcGxhdGUKKyAgLy8vIHBhcmFtZXRlciBsaXN0IGNvbnRhaW5zIGFuIHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2suCisgIGJvb2wgaXNQYWNrRXhwYW5zaW9uKCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbWV0ZXJQYWNrICYmCisgICAgICAgICAgIGdldFRlbXBsYXRlUGFyYW1ldGVycygpLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBwYXJhbWV0ZXIgaXMgYSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgcGFjayB0aGF0CisgIC8vLyBoYXMgYSBrbm93biBsaXN0IG9mIGRpZmZlcmVudCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdHMgYXQgZGlmZmVyZW50CisgIC8vLyBwb3NpdGlvbnMuCisgIC8vLworICAvLy8gQSBwYXJhbWV0ZXIgcGFjayBpcyBhbiBleHBhbmRlZCBwYXJhbWV0ZXIgcGFjayB3aGVuIHRoZSBvcmlnaW5hbCBwYXJhbWV0ZXIKKyAgLy8vIHBhY2sncyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdCB3YXMgaXRzZWxmIGEgcGFjayBleHBhbnNpb24sIGFuZCB0aGF0CisgIC8vLyBleHBhbnNpb24gaGFzIGFscmVhZHkgYmVlbiBleHBhbmRlZC4gRm9yIGV4YW1wZSwgZ2l2ZW46CisgIC8vLworICAvLy8gXGNvZGUKKyAgLy8vIHRlbXBsYXRlPHR5cGVuYW1lLi4uVHlwZXM+IHN0cnVjdCBPdXRlciB7CisgIC8vLyAgIHRlbXBsYXRlPHRlbXBsYXRlPFR5cGVzPiBjbGFzcy4uLlRlbXBsYXRlcz4gc3RydWN0IElubmVyOworICAvLy8gfTsKKyAgLy8vIFxlbmRjb2RlCisgIC8vLworICAvLy8gVGhlIHBhcmFtZXRlciBwYWNrIFxjIFRlbXBsYXRlcyBpcyBhIHBhY2sgZXhwYW5zaW9uLCB3aGljaCBleHBhbmRzIHRoZQorICAvLy8gcGFjayBcYyBUeXBlcy4gV2hlbiBcYyBUeXBlcyBpcyBzdXBwbGllZCB3aXRoIHRlbXBsYXRlIGFyZ3VtZW50cyBieQorICAvLy8gaW5zdGFudGlhdGluZyBcYyBPdXRlciwgdGhlIGluc3RhbnRpYXRpb24gb2YgXGMgVGVtcGxhdGVzIGlzIGFuIGV4cGFuZGVkCisgIC8vLyBwYXJhbWV0ZXIgcGFjay4KKyAgYm9vbCBpc0V4cGFuZGVkUGFyYW1ldGVyUGFjaygpIGNvbnN0IHsgcmV0dXJuIEV4cGFuZGVkUGFyYW1ldGVyUGFjazsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmVzIHRoZSBudW1iZXIgb2YgZXhwYW5zaW9uIHRlbXBsYXRlIHBhcmFtZXRlcnMgaW4KKyAgLy8vIGFuIGV4cGFuZGVkIHBhcmFtZXRlciBwYWNrLgorICB1bnNpZ25lZCBnZXROdW1FeHBhbnNpb25UZW1wbGF0ZVBhcmFtZXRlcnMoKSBjb25zdCB7CisgICAgYXNzZXJ0KEV4cGFuZGVkUGFyYW1ldGVyUGFjayAmJiAiTm90IGFuIGV4cGFuc2lvbiBwYXJhbWV0ZXIgcGFjayIpOworICAgIHJldHVybiBOdW1FeHBhbmRlZFBhcmFtczsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYSBwYXJ0aWN1bGFyIGV4cGFuc2lvbiB0eXBlIHdpdGhpbiBhbiBleHBhbmRlZCBwYXJhbWV0ZXIKKyAgLy8vIHBhY2suCisgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqZ2V0RXhwYW5zaW9uVGVtcGxhdGVQYXJhbWV0ZXJzKHVuc2lnbmVkIEkpIGNvbnN0IHsKKyAgICBhc3NlcnQoSSA8IE51bUV4cGFuZGVkUGFyYW1zICYmICJPdXQtb2YtcmFuZ2UgZXhwYW5zaW9uIHR5cGUgaW5kZXgiKTsKKyAgICByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqPigpW0ldOworICB9CisKKyAgY29uc3QgRGVmQXJnU3RvcmFnZSAmZ2V0RGVmYXVsdEFyZ1N0b3JhZ2UoKSBjb25zdCB7IHJldHVybiBEZWZhdWx0QXJndW1lbnQ7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgdGVtcGxhdGUgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQKKyAgLy8vIGFyZ3VtZW50LgorICBib29sIGhhc0RlZmF1bHRBcmd1bWVudCgpIGNvbnN0IHsgcmV0dXJuIERlZmF1bHRBcmd1bWVudC5pc1NldCgpOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgZGVmYXVsdCBhcmd1bWVudCwgaWYgYW55LgorICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TG9jICZnZXREZWZhdWx0QXJndW1lbnQoKSBjb25zdCB7CisgICAgc3RhdGljIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMb2MgTm9uZTsKKyAgICByZXR1cm4gRGVmYXVsdEFyZ3VtZW50LmlzU2V0KCkgPyAqRGVmYXVsdEFyZ3VtZW50LmdldCgpIDogTm9uZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBkZWZhdWx0IGFyZ3VtZW50LCBpZiBhbnkuCisgIFNvdXJjZUxvY2F0aW9uIGdldERlZmF1bHRBcmd1bWVudExvYygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZWZhdWx0IGFyZ3VtZW50IHdhcyBpbmhlcml0ZWQKKyAgLy8vIGZyb20gYSBwcmV2aW91cyBkZWNsYXJhdGlvbiBvZiB0aGlzIHRlbXBsYXRlLgorICBib29sIGRlZmF1bHRBcmd1bWVudFdhc0luaGVyaXRlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRGVmYXVsdEFyZ3VtZW50LmlzSW5oZXJpdGVkKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgZGVmYXVsdCBhcmd1bWVudCBmb3IgdGhpcyB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIGFuZAorICAvLy8gd2hldGhlciB0aGF0IGRlZmF1bHQgYXJndW1lbnQgd2FzIGluaGVyaXRlZCBmcm9tIGFub3RoZXIKKyAgLy8vIGRlY2xhcmF0aW9uLgorICB2b2lkIHNldERlZmF1bHRBcmd1bWVudChjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TG9jICZEZWZBcmcpOworICB2b2lkIHNldEluaGVyaXRlZERlZmF1bHRBcmd1bWVudChjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2wgKlByZXYpIHsKKyAgICBEZWZhdWx0QXJndW1lbnQuc2V0SW5oZXJpdGVkKEMsIFByZXYpOworICB9CisKKyAgLy8vIFxicmllZiBSZW1vdmVzIHRoZSBkZWZhdWx0IGFyZ3VtZW50IG9mIHRoaXMgdGVtcGxhdGUgcGFyYW1ldGVyLgorICB2b2lkIHJlbW92ZURlZmF1bHRBcmd1bWVudCgpIHsgRGVmYXVsdEFyZ3VtZW50LmNsZWFyKCk7IH0KKworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFkgeworICAgIFNvdXJjZUxvY2F0aW9uIEVuZCA9IGdldExvY2F0aW9uKCk7CisgICAgaWYgKGhhc0RlZmF1bHRBcmd1bWVudCgpICYmICFkZWZhdWx0QXJndW1lbnRXYXNJbmhlcml0ZWQoKSkKKyAgICAgIEVuZCA9IGdldERlZmF1bHRBcmd1bWVudCgpLmdldFNvdXJjZVJhbmdlKCkuZ2V0RW5kKCk7CisgICAgcmV0dXJuIFNvdXJjZVJhbmdlKGdldFRlbXBsYXRlUGFyYW1ldGVycygpLT5nZXRUZW1wbGF0ZUxvYygpLCBFbmQpOworICB9CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IFRlbXBsYXRlVGVtcGxhdGVQYXJtOyB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgdGhlIGJ1aWx0aW4gdGVtcGxhdGUgZGVjbGFyYXRpb24gd2hpY2ggaXMgdXNlZCB0bworLy8vIGltcGxlbWVudCBfX21ha2VfaW50ZWdlcl9zZXEgYW5kIG90aGVyIGJ1aWx0aW4gdGVtcGxhdGVzLiAgSXQgc2VydmVzCisvLy8gbm8gcmVhbCBwdXJwb3NlIGJleW9uZCBleGlzdGluZyBhcyBhIHBsYWNlIHRvIGhvbGQgdGVtcGxhdGUgcGFyYW1ldGVycy4KK2NsYXNzIEJ1aWx0aW5UZW1wbGF0ZURlY2wgOiBwdWJsaWMgVGVtcGxhdGVEZWNsIHsKKyAgQnVpbHRpblRlbXBsYXRlS2luZCBCVEs7CisKKyAgQnVpbHRpblRlbXBsYXRlRGVjbChjb25zdCBBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lIE5hbWUsIEJ1aWx0aW5UZW1wbGF0ZUtpbmQgQlRLKTsKKworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0IHN1cHBvcnQKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBCdWlsdGluVGVtcGxhdGU7IH0KKworICBzdGF0aWMgQnVpbHRpblRlbXBsYXRlRGVjbCAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbk5hbWUgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluVGVtcGxhdGVLaW5kIEJUSykgeworICAgIHJldHVybiBuZXcgKEMsIERDKSBCdWlsdGluVGVtcGxhdGVEZWNsKEMsIERDLCBOYW1lLCBCVEspOworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4ge307CisgIH0KKworICBCdWlsdGluVGVtcGxhdGVLaW5kIGdldEJ1aWx0aW5UZW1wbGF0ZUtpbmQoKSBjb25zdCB7IHJldHVybiBCVEs7IH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLCB3aGljaCByZWZlcnMgdG8KKy8vLyBhIGNsYXNzIHRlbXBsYXRlIHdpdGggYSBnaXZlbiBzZXQgb2YgdGVtcGxhdGUgYXJndW1lbnRzLgorLy8vCisvLy8gQ2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIHJlcHJlc2VudCBib3RoIGV4cGxpY2l0CisvLy8gc3BlY2lhbGl6YXRpb24gb2YgY2xhc3MgdGVtcGxhdGVzLCBhcyBpbiB0aGUgZXhhbXBsZSBiZWxvdywgYW5kCisvLy8gaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgb2YgY2xhc3MgdGVtcGxhdGVzLgorLy8vCisvLy8gXGNvZGUKKy8vLyB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBhcnJheTsKKy8vLworLy8vIHRlbXBsYXRlPD4KKy8vLyBjbGFzcyBhcnJheTxib29sPiB7IH07IC8vIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGFycmF5PGJvb2w+CisvLy8gXGVuZGNvZGUKK2NsYXNzIENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wKKyAgOiBwdWJsaWMgQ1hYUmVjb3JkRGVjbCwgcHVibGljIGxsdm06OkZvbGRpbmdTZXROb2RlIHsKKyAgLy8vIFxicmllZiBTdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBjbGFzcyB0ZW1wbGF0ZQorICAvLy8gc3BlY2lhbGl6YXRpb24gdGhhdCB3YXMgaW5zdGFudGlhdGVkIGZyb20gYSBjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsCisgIC8vLyBzcGVjaWFsaXphdGlvbi4KKyAgc3RydWN0IFNwZWNpYWxpemVkUGFydGlhbFNwZWNpYWxpemF0aW9uIHsKKyAgICAvLy8gXGJyaWVmIFRoZSBjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZyb20gd2hpY2ggdGhpcworICAgIC8vLyBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB3YXMgaW5zdGFudGlhdGVkLgorICAgIENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsICpQYXJ0aWFsU3BlY2lhbGl6YXRpb247CisKKyAgICAvLy8gXGJyaWVmIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0IGRlZHVjZWQgZm9yIHRoZSBjbGFzcyB0ZW1wbGF0ZQorICAgIC8vLyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGl0c2VsZi4KKyAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdCAqVGVtcGxhdGVBcmdzOworICB9OworCisgIC8vLyBcYnJpZWYgVGhlIHRlbXBsYXRlIHRoYXQgdGhpcyBzcGVjaWFsaXphdGlvbiBzcGVjaWFsaXplcworICBsbHZtOjpQb2ludGVyVW5pb248Q2xhc3NUZW1wbGF0ZURlY2wgKiwgU3BlY2lhbGl6ZWRQYXJ0aWFsU3BlY2lhbGl6YXRpb24gKj4KKyAgICBTcGVjaWFsaXplZFRlbXBsYXRlOworCisgIC8vLyBcYnJpZWYgRnVydGhlciBpbmZvIGZvciBleHBsaWNpdCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi9pbnN0YW50aWF0aW9uLgorICBzdHJ1Y3QgRXhwbGljaXRTcGVjaWFsaXphdGlvbkluZm8geworICAgIC8vLyBcYnJpZWYgVGhlIHR5cGUtYXMtd3JpdHRlbi4KKyAgICBUeXBlU291cmNlSW5mbyAqVHlwZUFzV3JpdHRlbiA9IG51bGxwdHI7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgZXh0ZXJuIGtleXdvcmQuCisgICAgU291cmNlTG9jYXRpb24gRXh0ZXJuTG9jOworCisgICAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIHRlbXBsYXRlIGtleXdvcmQuCisgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLZXl3b3JkTG9jOworCisgICAgRXhwbGljaXRTcGVjaWFsaXphdGlvbkluZm8oKSA9IGRlZmF1bHQ7CisgIH07CisKKyAgLy8vIFxicmllZiBGdXJ0aGVyIGluZm8gZm9yIGV4cGxpY2l0IHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uL2luc3RhbnRpYXRpb24uCisgIC8vLyBEb2VzIG5vdCBhcHBseSB0byBpbXBsaWNpdCBzcGVjaWFsaXphdGlvbnMuCisgIEV4cGxpY2l0U3BlY2lhbGl6YXRpb25JbmZvICpFeHBsaWNpdEluZm8gPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIHRlbXBsYXRlIGFyZ3VtZW50cyB1c2VkIHRvIGRlc2NyaWJlIHRoaXMgc3BlY2lhbGl6YXRpb24uCisgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0ICpUZW1wbGF0ZUFyZ3M7CisKKyAgLy8vIFxicmllZiBUaGUgcG9pbnQgd2hlcmUgdGhpcyB0ZW1wbGF0ZSB3YXMgaW5zdGFudGlhdGVkIChpZiBhbnkpCisgIFNvdXJjZUxvY2F0aW9uIFBvaW50T2ZJbnN0YW50aWF0aW9uOworCisgIC8vLyBcYnJpZWYgVGhlIGtpbmQgb2Ygc3BlY2lhbGl6YXRpb24gdGhpcyBkZWNsYXJhdGlvbiByZWZlcnMgdG8uCisgIC8vLyBSZWFsbHkgYSB2YWx1ZSBvZiB0eXBlIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kLgorICB1bnNpZ25lZCBTcGVjaWFsaXphdGlvbktpbmQgOiAzOworCitwcm90ZWN0ZWQ6CisgIENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2woQVNUQ29udGV4dCAmQ29udGV4dCwgS2luZCBESywgVGFnS2luZCBUSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVGVtcGxhdGVEZWNsICpTcGVjaWFsaXplZFRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAqUHJldkRlY2wpOworCisgIGV4cGxpY2l0IENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2woQVNUQ29udGV4dCAmQywgS2luZCBESyk7CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsV3JpdGVyOworCisgIHN0YXRpYyBDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICoKKyAgQ3JlYXRlKEFTVENvbnRleHQgJkNvbnRleHQsIFRhZ0tpbmQgVEssIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBJZExvYywKKyAgICAgICAgIENsYXNzVGVtcGxhdGVEZWNsICpTcGVjaWFsaXplZFRlbXBsYXRlLAorICAgICAgICAgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gQXJncywKKyAgICAgICAgIENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKlByZXZEZWNsKTsKKyAgc3RhdGljIENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKgorICBDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOworCisgIHZvaWQgZ2V0TmFtZUZvckRpYWdub3N0aWMocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUXVhbGlmaWVkKSBjb25zdCBvdmVycmlkZTsKKworICAvLyBGSVhNRTogVGhpcyBpcyBicm9rZW4uIENYWFJlY29yZERlY2w6OmdldE1vc3RSZWNlbnREZWNsKCkgcmV0dXJucyBhCisgIC8vIGRpZmZlcmVudCAibW9zdCByZWNlbnQiIGRlY2xhcmF0aW9uIGZyb20gdGhpcyBmdW5jdGlvbiBmb3IgdGhlIHNhbWUKKyAgLy8gZGVjbGFyYXRpb24sIGJlY2F1c2Ugd2UgZG9uJ3Qgb3ZlcnJpZGUgZ2V0TW9zdFJlY2VudERlY2xJbXBsKCkuIEJ1dAorICAvLyBpdCdzIG5vdCBjbGVhciB0aGF0IHdlIHNob3VsZCBvdmVycmlkZSB0aGF0LCBiZWNhdXNlIHRoZSBtb3N0IHJlY2VudAorICAvLyBkZWNsYXJhdGlvbiBhcyBhIENYWFJlY29yZERlY2wgc29tZXRpbWVzIGlzIHRoZSBpbmplY3RlZC1jbGFzcy1uYW1lLgorICBDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICpnZXRNb3N0UmVjZW50RGVjbCgpIHsKKyAgICBDWFhSZWNvcmREZWNsICpSZWNlbnQgPSBzdGF0aWNfY2FzdDxDWFhSZWNvcmREZWNsICo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyktPmdldE1vc3RSZWNlbnREZWNsKCk7CisgICAgd2hpbGUgKCFpc2E8Q2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbD4oUmVjZW50KSkgeworICAgICAgLy8gRklYTUU6IERvZXMgaW5qZWN0ZWQgY2xhc3MgbmFtZSBuZWVkIHRvIGJlIGluIHRoZSByZWRlY2xhcmF0aW9ucyBjaGFpbj8KKyAgICAgIGFzc2VydChSZWNlbnQtPmlzSW5qZWN0ZWRDbGFzc05hbWUoKSAmJiBSZWNlbnQtPmdldFByZXZpb3VzRGVjbCgpKTsKKyAgICAgIFJlY2VudCA9IFJlY2VudC0+Z2V0UHJldmlvdXNEZWNsKCk7CisgICAgfQorICAgIHJldHVybiBjYXN0PENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w+KFJlY2VudCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0ZW1wbGF0ZSB0aGF0IHRoaXMgc3BlY2lhbGl6YXRpb24gc3BlY2lhbGl6ZXMuCisgIENsYXNzVGVtcGxhdGVEZWNsICpnZXRTcGVjaWFsaXplZFRlbXBsYXRlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIG9mIHRoZSBjbGFzcyB0ZW1wbGF0ZQorICAvLy8gc3BlY2lhbGl6YXRpb24uCisgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0ICZnZXRUZW1wbGF0ZUFyZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuICpUZW1wbGF0ZUFyZ3M7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUga2luZCBvZiBzcGVjaWFsaXphdGlvbiB0aGF0IHRoaXMKKyAgLy8vIGRlY2xhcmF0aW9uIHJlcHJlc2VudHMuCisgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kIGdldFNwZWNpYWxpemF0aW9uS2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQ+KFNwZWNpYWxpemF0aW9uS2luZCk7CisgIH0KKworICBib29sIGlzRXhwbGljaXRTcGVjaWFsaXphdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3BlY2lhbGl6YXRpb25LaW5kKCkgPT0gVFNLX0V4cGxpY2l0U3BlY2lhbGl6YXRpb247CisgIH0KKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBkZWNsYXJhdGlvbiBpcyBhbiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiwKKyAgLy8vIGV4cGxpY2l0IGluc3RhbnRpYXRpb24gZGVjbGFyYXRpb24sIG9yIGV4cGxpY2l0IGluc3RhbnRpYXRpb24KKyAgLy8vIGRlZmluaXRpb24uCisgIGJvb2wgaXNFeHBsaWNpdEluc3RhbnRpYXRpb25PclNwZWNpYWxpemF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBpc1RlbXBsYXRlRXhwbGljaXRJbnN0YW50aWF0aW9uT3JTcGVjaWFsaXphdGlvbigKKyAgICAgICAgZ2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoKSk7CisgIH0KKworICB2b2lkIHNldFNwZWNpYWxpemF0aW9uS2luZChUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCBUU0spIHsKKyAgICBTcGVjaWFsaXphdGlvbktpbmQgPSBUU0s7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgcG9pbnQgb2YgaW5zdGFudGlhdGlvbiAoaWYgYW55KSwgb3IgbnVsbCBpZiBub25lLgorICBTb3VyY2VMb2NhdGlvbiBnZXRQb2ludE9mSW5zdGFudGlhdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gUG9pbnRPZkluc3RhbnRpYXRpb247CisgIH0KKworICB2b2lkIHNldFBvaW50T2ZJbnN0YW50aWF0aW9uKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIGFzc2VydChMb2MuaXNWYWxpZCgpICYmICJwb2ludCBvZiBpbnN0YW50aWF0aW9uIG11c3QgYmUgdmFsaWQhIik7CisgICAgUG9pbnRPZkluc3RhbnRpYXRpb24gPSBMb2M7CisgIH0KKworICAvLy8gXGJyaWVmIElmIHRoaXMgY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gaXMgYW4gaW5zdGFudGlhdGlvbiBvZgorICAvLy8gYSB0ZW1wbGF0ZSAocmF0aGVyIHRoYW4gYW4gZXhwbGljaXQgc3BlY2lhbGl6YXRpb24pLCByZXR1cm4gdGhlCisgIC8vLyBjbGFzcyB0ZW1wbGF0ZSBvciBjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZyb20gd2hpY2ggaXQKKyAgLy8vIHdhcyBpbnN0YW50aWF0ZWQuCisgIGxsdm06OlBvaW50ZXJVbmlvbjxDbGFzc1RlbXBsYXRlRGVjbCAqLAorICAgICAgICAgICAgICAgICAgICAgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKj4KKyAgZ2V0SW5zdGFudGlhdGVkRnJvbSgpIGNvbnN0IHsKKyAgICBpZiAoIWlzVGVtcGxhdGVJbnN0YW50aWF0aW9uKGdldFNwZWNpYWxpemF0aW9uS2luZCgpKSkKKyAgICAgIHJldHVybiBsbHZtOjpQb2ludGVyVW5pb248Q2xhc3NUZW1wbGF0ZURlY2wgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKj4oKTsKKworICAgIHJldHVybiBnZXRTcGVjaWFsaXplZFRlbXBsYXRlT3JQYXJ0aWFsKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBjbGFzcyB0ZW1wbGF0ZSBvciBjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsCisgIC8vLyBzcGVjaWFsaXphdGlvbiB3aGljaCB3YXMgc3BlY2lhbGl6ZWQgYnkgdGhpcy4KKyAgbGx2bTo6UG9pbnRlclVuaW9uPENsYXNzVGVtcGxhdGVEZWNsICosCisgICAgICAgICAgICAgICAgICAgICBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqPgorICBnZXRTcGVjaWFsaXplZFRlbXBsYXRlT3JQYXJ0aWFsKCkgY29uc3QgeworICAgIGlmIChjb25zdCBhdXRvICpQYXJ0aWFsU3BlYyA9CisgICAgICAgICAgICBTcGVjaWFsaXplZFRlbXBsYXRlLmR5bl9jYXN0PFNwZWNpYWxpemVkUGFydGlhbFNwZWNpYWxpemF0aW9uICo+KCkpCisgICAgICByZXR1cm4gUGFydGlhbFNwZWMtPlBhcnRpYWxTcGVjaWFsaXphdGlvbjsKKworICAgIHJldHVybiBTcGVjaWFsaXplZFRlbXBsYXRlLmdldDxDbGFzc1RlbXBsYXRlRGVjbCo+KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzZXQgb2YgdGVtcGxhdGUgYXJndW1lbnRzIHRoYXQgc2hvdWxkIGJlIHVzZWQKKyAgLy8vIHRvIGluc3RhbnRpYXRlIG1lbWJlcnMgb2YgdGhlIGNsYXNzIHRlbXBsYXRlIG9yIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwKKyAgLy8vIHNwZWNpYWxpemF0aW9uIGZyb20gd2hpY2ggdGhpcyBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB3YXMKKyAgLy8vIGluc3RhbnRpYXRlZC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBGb3IgYSBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBpbnN0YW50aWF0ZWQgZnJvbSB0aGUgcHJpbWFyeQorICAvLy8gdGVtcGxhdGUsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHNhbWUgdGVtcGxhdGUgYXJndW1lbnRzIGFzCisgIC8vLyBnZXRUZW1wbGF0ZUFyZ3MoKS4gRm9yIGEgY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gaW5zdGFudGlhdGVkIGZyb20KKyAgLy8vIGEgY2xhc3MgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUKKyAgLy8vIGRlZHVjZWQgdGVtcGxhdGUgYXJndW1lbnRzIGZvciB0aGUgY2xhc3MgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbgorICAvLy8gaXRzZWxmLgorICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmZ2V0VGVtcGxhdGVJbnN0YW50aWF0aW9uQXJncygpIGNvbnN0IHsKKyAgICBpZiAoY29uc3QgYXV0byAqUGFydGlhbFNwZWMgPQorICAgICAgICAgICAgU3BlY2lhbGl6ZWRUZW1wbGF0ZS5keW5fY2FzdDxTcGVjaWFsaXplZFBhcnRpYWxTcGVjaWFsaXphdGlvbiAqPigpKQorICAgICAgcmV0dXJuICpQYXJ0aWFsU3BlYy0+VGVtcGxhdGVBcmdzOworCisgICAgcmV0dXJuIGdldFRlbXBsYXRlQXJncygpOworICB9CisKKyAgLy8vIFxicmllZiBOb3RlIHRoYXQgdGhpcyBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBpcyBhY3R1YWxseSBhbgorICAvLy8gaW5zdGFudGlhdGlvbiBvZiB0aGUgZ2l2ZW4gY2xhc3MgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiB3aG9zZQorICAvLy8gdGVtcGxhdGUgYXJndW1lbnRzIGhhdmUgYmVlbiBkZWR1Y2VkLgorICB2b2lkIHNldEluc3RhbnRpYXRpb25PZihDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqUGFydGlhbFNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0ICpUZW1wbGF0ZUFyZ3MpIHsKKyAgICBhc3NlcnQoIVNwZWNpYWxpemVkVGVtcGxhdGUuaXM8U3BlY2lhbGl6ZWRQYXJ0aWFsU3BlY2lhbGl6YXRpb24qPigpICYmCisgICAgICAgICAgICJBbHJlYWR5IHNldCB0byBhIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24hIik7CisgICAgYXV0byAqUFMgPSBuZXcgKGdldEFTVENvbnRleHQoKSkgU3BlY2lhbGl6ZWRQYXJ0aWFsU3BlY2lhbGl6YXRpb24oKTsKKyAgICBQUy0+UGFydGlhbFNwZWNpYWxpemF0aW9uID0gUGFydGlhbFNwZWM7CisgICAgUFMtPlRlbXBsYXRlQXJncyA9IFRlbXBsYXRlQXJnczsKKyAgICBTcGVjaWFsaXplZFRlbXBsYXRlID0gUFM7CisgIH0KKworICAvLy8gXGJyaWVmIE5vdGUgdGhhdCB0aGlzIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGlzIGFuIGluc3RhbnRpYXRpb24KKyAgLy8vIG9mIHRoZSBnaXZlbiBjbGFzcyB0ZW1wbGF0ZS4KKyAgdm9pZCBzZXRJbnN0YW50aWF0aW9uT2YoQ2xhc3NUZW1wbGF0ZURlY2wgKlRlbXBsRGVjbCkgeworICAgIGFzc2VydCghU3BlY2lhbGl6ZWRUZW1wbGF0ZS5pczxTcGVjaWFsaXplZFBhcnRpYWxTcGVjaWFsaXphdGlvbio+KCkgJiYKKyAgICAgICAgICAgIlByZXZpb3VzbHkgc2V0IHRvIGEgY2xhc3MgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiEiKTsKKyAgICBTcGVjaWFsaXplZFRlbXBsYXRlID0gVGVtcGxEZWNsOworICB9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSB0eXBlIG9mIHRoaXMgc3BlY2lhbGl6YXRpb24gYXMgaXQgd2FzIHdyaXR0ZW4gYnkKKyAgLy8vIHRoZSB1c2VyLiBUaGlzIHdpbGwgYmUgYSBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0eXBlLgorICB2b2lkIHNldFR5cGVBc1dyaXR0ZW4oVHlwZVNvdXJjZUluZm8gKlQpIHsKKyAgICBpZiAoIUV4cGxpY2l0SW5mbykKKyAgICAgIEV4cGxpY2l0SW5mbyA9IG5ldyAoZ2V0QVNUQ29udGV4dCgpKSBFeHBsaWNpdFNwZWNpYWxpemF0aW9uSW5mbzsKKyAgICBFeHBsaWNpdEluZm8tPlR5cGVBc1dyaXR0ZW4gPSBUOworICB9CisKKyAgLy8vIFxicmllZiBHZXRzIHRoZSB0eXBlIG9mIHRoaXMgc3BlY2lhbGl6YXRpb24gYXMgaXQgd2FzIHdyaXR0ZW4gYnkKKyAgLy8vIHRoZSB1c2VyLCBpZiBpdCB3YXMgc28gd3JpdHRlbi4KKyAgVHlwZVNvdXJjZUluZm8gKmdldFR5cGVBc1dyaXR0ZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIEV4cGxpY2l0SW5mbyA/IEV4cGxpY2l0SW5mby0+VHlwZUFzV3JpdHRlbiA6IG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIEdldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBleHRlcm4ga2V5d29yZCwgaWYgcHJlc2VudC4KKyAgU291cmNlTG9jYXRpb24gZ2V0RXh0ZXJuTG9jKCkgY29uc3QgeworICAgIHJldHVybiBFeHBsaWNpdEluZm8gPyBFeHBsaWNpdEluZm8tPkV4dGVybkxvYyA6IFNvdXJjZUxvY2F0aW9uKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBleHRlcm4ga2V5d29yZC4KKyAgdm9pZCBzZXRFeHRlcm5Mb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgaWYgKCFFeHBsaWNpdEluZm8pCisgICAgICBFeHBsaWNpdEluZm8gPSBuZXcgKGdldEFTVENvbnRleHQoKSkgRXhwbGljaXRTcGVjaWFsaXphdGlvbkluZm87CisgICAgRXhwbGljaXRJbmZvLT5FeHRlcm5Mb2MgPSBMb2M7CisgIH0KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBrZXl3b3JkLgorICB2b2lkIHNldFRlbXBsYXRlS2V5d29yZExvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBpZiAoIUV4cGxpY2l0SW5mbykKKyAgICAgIEV4cGxpY2l0SW5mbyA9IG5ldyAoZ2V0QVNUQ29udGV4dCgpKSBFeHBsaWNpdFNwZWNpYWxpemF0aW9uSW5mbzsKKyAgICBFeHBsaWNpdEluZm8tPlRlbXBsYXRlS2V5d29yZExvYyA9IExvYzsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIHRlbXBsYXRlIGtleXdvcmQsIGlmIHByZXNlbnQuCisgIFNvdXJjZUxvY2F0aW9uIGdldFRlbXBsYXRlS2V5d29yZExvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gRXhwbGljaXRJbmZvID8gRXhwbGljaXRJbmZvLT5UZW1wbGF0ZUtleXdvcmRMb2MgOiBTb3VyY2VMb2NhdGlvbigpOworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZOworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3QgeworICAgIFByb2ZpbGUoSUQsIFRlbXBsYXRlQXJncy0+YXNBcnJheSgpLCBnZXRBU1RDb250ZXh0KCkpOworICB9CisKKyAgc3RhdGljIHZvaWQKKyAgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gVGVtcGxhdGVBcmdzLAorICAgICAgICAgIEFTVENvbnRleHQgJkNvbnRleHQpIHsKKyAgICBJRC5BZGRJbnRlZ2VyKFRlbXBsYXRlQXJncy5zaXplKCkpOworICAgIGZvciAoY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmVGVtcGxhdGVBcmcgOiBUZW1wbGF0ZUFyZ3MpCisgICAgICBUZW1wbGF0ZUFyZy5Qcm9maWxlKElELCBDb250ZXh0KTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeworICAgIHJldHVybiBLID49IGZpcnN0Q2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uICYmCisgICAgICAgICAgIEsgPD0gbGFzdENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbjsKKyAgfQorfTsKKworY2xhc3MgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wKKyAgOiBwdWJsaWMgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCB7CisgIC8vLyBcYnJpZWYgVGhlIGxpc3Qgb2YgdGVtcGxhdGUgcGFyYW1ldGVycworICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QqIFRlbXBsYXRlUGFyYW1zID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFRoZSBzb3VyY2UgaW5mbyBmb3IgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBhcyB3cml0dGVuLgorICAvLy8gRklYTUU6IHJlZHVuZGFudCB3aXRoIFR5cGVBc1dyaXR0ZW4/CisgIGNvbnN0IEFTVFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqQXJnc0FzV3JpdHRlbiA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBUaGUgY2xhc3MgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBmcm9tIHdoaWNoIHRoaXMKKyAgLy8vIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gd2FzIGluc3RhbnRpYXRlZC4KKyAgLy8vCisgIC8vLyBUaGUgYm9vbGVhbiB2YWx1ZSB3aWxsIGJlIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGNsYXNzIHRlbXBsYXRlCisgIC8vLyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIHdhcyBzcGVjaWFsaXplZCBhdCB0aGlzIGxldmVsLgorICBsbHZtOjpQb2ludGVySW50UGFpcjxDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqLCAxLCBib29sPgorICAgICAgSW5zdGFudGlhdGVkRnJvbU1lbWJlcjsKKworICBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbChBU1RDb250ZXh0ICZDb250ZXh0LCBUYWdLaW5kIFRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVGVtcGxhdGVEZWNsICpTcGVjaWFsaXplZFRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFTVFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqQXJnc0FzV3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqUHJldkRlY2wpOworCisgIENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsKEFTVENvbnRleHQgJkMpCisgICAgOiBDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsKEMsIENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb24pLAorICAgICAgSW5zdGFudGlhdGVkRnJvbU1lbWJlcihudWxscHRyLCBmYWxzZSkge30KKworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNURGVjbFdyaXRlcjsKKworICBzdGF0aWMgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKgorICBDcmVhdGUoQVNUQ29udGV4dCAmQ29udGV4dCwgVGFnS2luZCBUSywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIElkTG9jLAorICAgICAgICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpQYXJhbXMsCisgICAgICAgICBDbGFzc1RlbXBsYXRlRGVjbCAqU3BlY2lhbGl6ZWRUZW1wbGF0ZSwKKyAgICAgICAgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IEFyZ3MsCisgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gJkFyZ0luZm9zLAorICAgICAgICAgUXVhbFR5cGUgQ2Fub25JbmplY3RlZFR5cGUsCisgICAgICAgICBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqUHJldkRlY2wpOworCisgIHN0YXRpYyBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqCisgIENyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisKKyAgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKmdldE1vc3RSZWNlbnREZWNsKCkgeworICAgIHJldHVybiBjYXN0PENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsPigKKyAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICo+KAorICAgICAgICAgICAgICAgdGhpcyktPmdldE1vc3RSZWNlbnREZWNsKCkpOworICB9CisKKyAgLy8vIEdldCB0aGUgbGlzdCBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCisgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqZ2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCkgY29uc3QgeworICAgIHJldHVybiBUZW1wbGF0ZVBhcmFtczsKKyAgfQorCisgIC8vLyBHZXQgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBhcyB3cml0dGVuLgorICBjb25zdCBBU1RUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gKmdldFRlbXBsYXRlQXJnc0FzV3JpdHRlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gQXJnc0FzV3JpdHRlbjsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG1lbWJlciBjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZyb20KKyAgLy8vIHdoaWNoIHRoaXMgcGFydGljdWxhciBjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIHdhcworICAvLy8gaW5zdGFudGlhdGVkLgorICAvLy8KKyAgLy8vIFxjb2RlCisgIC8vLyB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAvLy8gc3RydWN0IE91dGVyIHsKKyAgLy8vICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gc3RydWN0IElubmVyOworICAvLy8gICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBzdHJ1Y3QgSW5uZXI8VSo+IHsgfTsgLy8gIzEKKyAgLy8vIH07CisgIC8vLworICAvLy8gT3V0ZXI8ZmxvYXQ+OjpJbm5lcjxpbnQqPiBpaTsKKyAgLy8vIFxlbmRjb2RlCisgIC8vLworICAvLy8gSW4gdGhpcyBleGFtcGxlLCB0aGUgaW5zdGFudGlhdGlvbiBvZiBcYyBPdXRlcjxmbG9hdD46OklubmVyPGludCo+IHdpbGwKKyAgLy8vIGVuZCB1cCBpbnN0YW50aWF0aW5nIHRoZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uCisgIC8vLyBcYyBPdXRlcjxmbG9hdD46OklubmVyPFUqPiwgd2hpY2ggaXRzZWxmIHdhcyBpbnN0YW50aWF0ZWQgZnJvbSB0aGUgY2xhc3MKKyAgLy8vIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gXGMgT3V0ZXI8VD46OklubmVyPFUqPi4gR2l2ZW4KKyAgLy8vIFxjIE91dGVyPGZsb2F0Pjo6SW5uZXI8VSo+LCB0aGlzIGZ1bmN0aW9uIHdvdWxkIHJldHVybgorICAvLy8gXGMgT3V0ZXI8VD46OklubmVyPFUqPi4KKyAgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKmdldEluc3RhbnRpYXRlZEZyb21NZW1iZXIoKSBjb25zdCB7CisgICAgY29uc3QgYXV0byAqRmlyc3QgPQorICAgICAgICBjYXN0PENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsPihnZXRGaXJzdERlY2woKSk7CisgICAgcmV0dXJuIEZpcnN0LT5JbnN0YW50aWF0ZWRGcm9tTWVtYmVyLmdldFBvaW50ZXIoKTsKKyAgfQorICBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqCisgIGdldEluc3RhbnRpYXRlZEZyb21NZW1iZXJUZW1wbGF0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW5zdGFudGlhdGVkRnJvbU1lbWJlcigpOworICB9CisKKyAgdm9pZCBzZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqUGFydGlhbFNwZWMpIHsKKyAgICBhdXRvICpGaXJzdCA9IGNhc3Q8Q2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2w+KGdldEZpcnN0RGVjbCgpKTsKKyAgICBGaXJzdC0+SW5zdGFudGlhdGVkRnJvbU1lbWJlci5zZXRQb2ludGVyKFBhcnRpYWxTcGVjKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgY2xhc3MgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbgorICAvLy8gdGVtcGxhdGUgd2FzIGEgc3BlY2lhbGl6YXRpb24gb2YgYSBtZW1iZXIgcGFydGlhbCBzcGVjaWFsaXphdGlvbi4KKyAgLy8vCisgIC8vLyBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHRoZSBtZW1iZXIgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbgorICAvLy8gXGMgWDxpbnQ+OjpJbm5lcjxUKj4gaXMgYSBtZW1iZXIgc3BlY2lhbGl6YXRpb24uCisgIC8vLworICAvLy8gXGNvZGUKKyAgLy8vIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIC8vLyBzdHJ1Y3QgWCB7CisgIC8vLyAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IHN0cnVjdCBJbm5lcjsKKyAgLy8vICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gc3RydWN0IElubmVyPFUqPjsKKyAgLy8vIH07CisgIC8vLworICAvLy8gdGVtcGxhdGU8PiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAvLy8gc3RydWN0IFg8aW50Pjo6SW5uZXI8VCo+IHsgLyogLi4uICovIH07CisgIC8vLyBcZW5kY29kZQorICBib29sIGlzTWVtYmVyU3BlY2lhbGl6YXRpb24oKSB7CisgICAgY29uc3QgYXV0byAqRmlyc3QgPQorICAgICAgICBjYXN0PENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsPihnZXRGaXJzdERlY2woKSk7CisgICAgcmV0dXJuIEZpcnN0LT5JbnN0YW50aWF0ZWRGcm9tTWVtYmVyLmdldEludCgpOworICB9CisKKyAgLy8vIFxicmllZiBOb3RlIHRoYXQgdGhpcyBtZW1iZXIgdGVtcGxhdGUgaXMgYSBzcGVjaWFsaXphdGlvbi4KKyAgdm9pZCBzZXRNZW1iZXJTcGVjaWFsaXphdGlvbigpIHsKKyAgICBhdXRvICpGaXJzdCA9IGNhc3Q8Q2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2w+KGdldEZpcnN0RGVjbCgpKTsKKyAgICBhc3NlcnQoRmlyc3QtPkluc3RhbnRpYXRlZEZyb21NZW1iZXIuZ2V0UG9pbnRlcigpICYmCisgICAgICAgICAgICJPbmx5IG1lbWJlciB0ZW1wbGF0ZXMgY2FuIGJlIG1lbWJlciB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMiKTsKKyAgICByZXR1cm4gRmlyc3QtPkluc3RhbnRpYXRlZEZyb21NZW1iZXIuc2V0SW50KHRydWUpOworICB9CisKKyAgLy8vIFJldHJpZXZlcyB0aGUgaW5qZWN0ZWQgc3BlY2lhbGl6YXRpb24gdHlwZSBmb3IgdGhpcyBwYXJ0aWFsCisgIC8vLyBzcGVjaWFsaXphdGlvbi4gIFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSB0eXBlLWRlY2wtdHlwZSBmb3IKKyAgLy8vIHRoaXMgcGFydGlhbCBzcGVjaWFsaXphdGlvbiwgd2hpY2ggaXMgYW4gSW5qZWN0ZWRDbGFzc05hbWVUeXBlLgorICBRdWFsVHlwZSBnZXRJbmplY3RlZFNwZWNpYWxpemF0aW9uVHlwZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0VHlwZUZvckRlY2woKSAmJiAicGFydGlhbCBzcGVjaWFsaXphdGlvbiBoYXMgbm8gdHlwZSBzZXQhIik7CisgICAgcmV0dXJuIGNhc3Q8SW5qZWN0ZWRDbGFzc05hbWVUeXBlPihnZXRUeXBlRm9yRGVjbCgpKQorICAgICAgICAgICAgIC0+Z2V0SW5qZWN0ZWRTcGVjaWFsaXphdGlvblR5cGUoKTsKKyAgfQorCisgIC8vIEZJWE1FOiBBZGQgUHJvZmlsZSBzdXBwb3J0IQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeworICAgIHJldHVybiBLID09IENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb247CisgIH0KK307CisKKy8vLyBEZWNsYXJhdGlvbiBvZiBhIGNsYXNzIHRlbXBsYXRlLgorY2xhc3MgQ2xhc3NUZW1wbGF0ZURlY2wgOiBwdWJsaWMgUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsIHsKK3Byb3RlY3RlZDoKKyAgLy8vIFxicmllZiBEYXRhIHRoYXQgaXMgY29tbW9uIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIG9mIGEgZ2l2ZW4KKyAgLy8vIGNsYXNzIHRlbXBsYXRlLgorICBzdHJ1Y3QgQ29tbW9uIDogQ29tbW9uQmFzZSB7CisgICAgLy8vIFxicmllZiBUaGUgY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIGZvciB0aGlzIGNsYXNzCisgICAgLy8vIHRlbXBsYXRlLCBpbmNsdWRpbmcgZXhwbGljaXQgc3BlY2lhbGl6YXRpb25zIGFuZCBpbnN0YW50aWF0aW9ucy4KKyAgICBsbHZtOjpGb2xkaW5nU2V0VmVjdG9yPENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w+IFNwZWNpYWxpemF0aW9uczsKKworICAgIC8vLyBcYnJpZWYgVGhlIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb25zIGZvciB0aGlzIGNsYXNzCisgICAgLy8vIHRlbXBsYXRlLgorICAgIGxsdm06OkZvbGRpbmdTZXRWZWN0b3I8Q2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2w+CisgICAgICBQYXJ0aWFsU3BlY2lhbGl6YXRpb25zOworCisgICAgLy8vIFxicmllZiBUaGUgaW5qZWN0ZWQtY2xhc3MtbmFtZSB0eXBlIGZvciB0aGlzIGNsYXNzIHRlbXBsYXRlLgorICAgIFF1YWxUeXBlIEluamVjdGVkQ2xhc3NOYW1lVHlwZTsKKworICAgIENvbW1vbigpID0gZGVmYXVsdDsKKyAgfTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzZXQgb2Ygc3BlY2lhbGl6YXRpb25zIG9mIHRoaXMgY2xhc3MgdGVtcGxhdGUuCisgIGxsdm06OkZvbGRpbmdTZXRWZWN0b3I8Q2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbD4gJgorICBnZXRTcGVjaWFsaXphdGlvbnMoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzZXQgb2YgcGFydGlhbCBzcGVjaWFsaXphdGlvbnMgb2YgdGhpcyBjbGFzcworICAvLy8gdGVtcGxhdGUuCisgIGxsdm06OkZvbGRpbmdTZXRWZWN0b3I8Q2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2w+ICYKKyAgZ2V0UGFydGlhbFNwZWNpYWxpemF0aW9ucygpOworCisgIENsYXNzVGVtcGxhdGVEZWNsKENvbnN0cmFpbmVkVGVtcGxhdGVEZWNsSW5mbyAqQ1RESSwgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBMLCBEZWNsYXJhdGlvbk5hbWUgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpQYXJhbXMsIE5hbWVkRGVjbCAqRGVjbCkKKyAgICAgIDogUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsKENUREksIENsYXNzVGVtcGxhdGUsIEMsIERDLCBMLCBOYW1lLCBQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsKSB7fQorCisgIENsYXNzVGVtcGxhdGVEZWNsKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gTCwKKyAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lIE5hbWUsIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKkRlY2wpCisgICAgICA6IENsYXNzVGVtcGxhdGVEZWNsKG51bGxwdHIsIEMsIERDLCBMLCBOYW1lLCBQYXJhbXMsIERlY2wpIHt9CisKKyAgQ29tbW9uQmFzZSAqbmV3Q29tbW9uKEFTVENvbnRleHQgJkMpIGNvbnN0IG92ZXJyaWRlOworCisgIENvbW1vbiAqZ2V0Q29tbW9uUHRyKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDb21tb24gKj4oUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsOjpnZXRDb21tb25QdHIoKSk7CisgIH0KKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisKKyAgLy8vIFxicmllZiBMb2FkIGFueSBsYXppbHktbG9hZGVkIHNwZWNpYWxpemF0aW9ucyBmcm9tIHRoZSBleHRlcm5hbCBzb3VyY2UuCisgIHZvaWQgTG9hZExhenlTcGVjaWFsaXphdGlvbnMoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgdW5kZXJseWluZyBjbGFzcyBkZWNsYXJhdGlvbnMgb2YgdGhlIHRlbXBsYXRlLgorICBDWFhSZWNvcmREZWNsICpnZXRUZW1wbGF0ZWREZWNsKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDWFhSZWNvcmREZWNsICo+KFRlbXBsYXRlZERlY2wpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0ZW1wbGF0ZSBkZWNsYXJhdGlvbiBkZWZpbmVzIHRoZSBwcmltYXJ5CisgIC8vLyBjbGFzcyBwYXR0ZXJuLgorICBib29sIGlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBsYXRlZERlY2woKS0+aXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpOworICB9CisKKyAgLy8gRklYTUU6IHJlbW92ZSBkZWZhdWx0IGFyZ3VtZW50IGZvciBBc3NvY2lhdGVkQ29uc3RyYWludHMKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBjbGFzcyB0ZW1wbGF0ZSBub2RlLgorICBzdGF0aWMgQ2xhc3NUZW1wbGF0ZURlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpBc3NvY2lhdGVkQ29uc3RyYWludHMgPSBudWxscHRyKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhbiBlbXB0eSBjbGFzcyB0ZW1wbGF0ZSBub2RlLgorICBzdGF0aWMgQ2xhc3NUZW1wbGF0ZURlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHNwZWNpYWxpemF0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50cyBpZiBpdCBleGlzdHMsCisgIC8vLyBvdGhlcndpc2UgcmV0dXJuIHRoZSBpbnNlcnRpb24gcG9pbnQuCisgIENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKgorICBmaW5kU3BlY2lhbGl6YXRpb24oQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gQXJncywgdm9pZCAqJkluc2VydFBvcyk7CisKKyAgLy8vIFxicmllZiBJbnNlcnQgdGhlIHNwZWNpZmllZCBzcGVjaWFsaXphdGlvbiBrbm93aW5nIHRoYXQgaXQgaXMgbm90IGFscmVhZHkKKyAgLy8vIGluLiBJbnNlcnRQb3MgbXVzdCBiZSBvYnRhaW5lZCBmcm9tIGZpbmRTcGVjaWFsaXphdGlvbi4KKyAgdm9pZCBBZGRTcGVjaWFsaXphdGlvbihDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICpELCB2b2lkICpJbnNlcnRQb3MpOworCisgIENsYXNzVGVtcGxhdGVEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBjYXN0PENsYXNzVGVtcGxhdGVEZWNsPigKKyAgICAgICAgICAgICBSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2w6OmdldENhbm9uaWNhbERlY2woKSk7CisgIH0KKyAgY29uc3QgQ2xhc3NUZW1wbGF0ZURlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8Q2xhc3NUZW1wbGF0ZURlY2w+KAorICAgICAgICAgICAgIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbDo6Z2V0Q2Fub25pY2FsRGVjbCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHByZXZpb3VzIGRlY2xhcmF0aW9uIG9mIHRoaXMgY2xhc3MgdGVtcGxhdGUsIG9yCisgIC8vLyBudWxscHRyIGlmIG5vIHN1Y2ggZGVjbGFyYXRpb24gZXhpc3RzLgorICBDbGFzc1RlbXBsYXRlRGVjbCAqZ2V0UHJldmlvdXNEZWNsKCkgeworICAgIHJldHVybiBjYXN0X29yX251bGw8Q2xhc3NUZW1wbGF0ZURlY2w+KAorICAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCAqPih0aGlzKS0+Z2V0UHJldmlvdXNEZWNsKCkpOworICB9CisgIGNvbnN0IENsYXNzVGVtcGxhdGVEZWNsICpnZXRQcmV2aW91c0RlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxDbGFzc1RlbXBsYXRlRGVjbD4oCisgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsICo+KAorICAgICAgICAgICAgICAgdGhpcyktPmdldFByZXZpb3VzRGVjbCgpKTsKKyAgfQorCisgIENsYXNzVGVtcGxhdGVEZWNsICpnZXRNb3N0UmVjZW50RGVjbCgpIHsKKyAgICByZXR1cm4gY2FzdDxDbGFzc1RlbXBsYXRlRGVjbD4oCisgICAgICAgIHN0YXRpY19jYXN0PFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCAqPih0aGlzKS0+Z2V0TW9zdFJlY2VudERlY2woKSk7CisgIH0KKyAgY29uc3QgQ2xhc3NUZW1wbGF0ZURlY2wgKmdldE1vc3RSZWNlbnREZWNsKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PENsYXNzVGVtcGxhdGVEZWNsKj4odGhpcyktPmdldE1vc3RSZWNlbnREZWNsKCk7CisgIH0KKworICBDbGFzc1RlbXBsYXRlRGVjbCAqZ2V0SW5zdGFudGlhdGVkRnJvbU1lbWJlclRlbXBsYXRlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8Q2xhc3NUZW1wbGF0ZURlY2w+KAorICAgICAgICAgICAgIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbDo6Z2V0SW5zdGFudGlhdGVkRnJvbU1lbWJlclRlbXBsYXRlKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzIGlmIGl0CisgIC8vLyBleGlzdHMsIG90aGVyd2lzZSByZXR1cm4gdGhlIGluc2VydGlvbiBwb2ludC4KKyAgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKgorICBmaW5kUGFydGlhbFNwZWNpYWxpemF0aW9uKEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IEFyZ3MsIHZvaWQgKiZJbnNlcnRQb3MpOworCisgIC8vLyBcYnJpZWYgSW5zZXJ0IHRoZSBzcGVjaWZpZWQgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBrbm93aW5nIHRoYXQgaXQgaXMgbm90CisgIC8vLyBhbHJlYWR5IGluLiBJbnNlcnRQb3MgbXVzdCBiZSBvYnRhaW5lZCBmcm9tIGZpbmRQYXJ0aWFsU3BlY2lhbGl6YXRpb24uCisgIHZvaWQgQWRkUGFydGlhbFNwZWNpYWxpemF0aW9uKENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpJbnNlcnRQb3MpOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb25zIGFzIGFuIG9yZGVyZWQgbGlzdC4KKyAgdm9pZCBnZXRQYXJ0aWFsU3BlY2lhbGl6YXRpb25zKAorICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqPiAmUFMpOworCisgIC8vLyBcYnJpZWYgRmluZCBhIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gd2l0aCB0aGUgZ2l2ZW4KKyAgLy8vIHR5cGUgVC4KKyAgLy8vCisgIC8vLyBccGFyYW0gVCBhIGRlcGVuZGVudCB0eXBlIHRoYXQgbmFtZXMgYSBzcGVjaWFsaXphdGlvbiBvZiB0aGlzIGNsYXNzCisgIC8vLyB0ZW1wbGF0ZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgY2xhc3MgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiB0aGF0IGV4YWN0bHkgbWF0Y2hlcworICAvLy8gdGhlIHR5cGUgXHAgVCwgb3IgbnVsbHB0ciBpZiBubyBzdWNoIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZXhpc3RzLgorICBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqZmluZFBhcnRpYWxTcGVjaWFsaXphdGlvbihRdWFsVHlwZSBUKTsKKworICAvLy8gXGJyaWVmIEZpbmQgYSBjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIHdoaWNoIHdhcyBpbnN0YW50aWF0ZWQKKyAgLy8vIGZyb20gdGhlIGdpdmVuIG1lbWJlciBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBEIGEgbWVtYmVyIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uCisgIC8vLworICAvLy8gXHJldHVybnMgdGhlIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gd2hpY2ggd2FzIGluc3RhbnRpYXRlZAorICAvLy8gZnJvbSB0aGUgZ2l2ZW4gbWVtYmVyIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24sIG9yIG51bGxwdHIgaWYgbm8gc3VjaAorICAvLy8gcGFydGlhbCBzcGVjaWFsaXphdGlvbiBleGlzdHMuCisgIENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsICoKKyAgZmluZFBhcnRpYWxTcGVjSW5zdGFudGlhdGVkRnJvbU1lbWJlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqRCk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdHlwZSBvZiB0aGUKKyAgLy8vIGluamVjdGVkLWNsYXNzLW5hbWUgZm9yIHRoaXMgY2xhc3MgdGVtcGxhdGUuCisgIC8vLworICAvLy8gVGhlIGluamVjdGVkLWNsYXNzLW5hbWUgZm9yIGEgY2xhc3MgdGVtcGxhdGUgXGMgWCBpcyBcYworICAvLy8gWDx0ZW1wbGF0ZS1hcmdzPiwgd2hlcmUgXGMgdGVtcGxhdGUtYXJncyBpcyBmb3JtZWQgZnJvbSB0aGUKKyAgLy8vIHRlbXBsYXRlIGFyZ3VtZW50cyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgb2YKKyAgLy8vIFxjIFguIEZvciBleGFtcGxlOgorICAvLy8KKyAgLy8vIFxjb2RlCisgIC8vLyB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgTj4KKyAgLy8vIHN0cnVjdCBhcnJheSB7CisgIC8vLyAgIHR5cGVkZWYgYXJyYXkgdGhpc190eXBlOyAvLyAiYXJyYXkiIGlzIGVxdWl2YWxlbnQgdG8gImFycmF5PFQsIE4+IgorICAvLy8gfTsKKyAgLy8vIFxlbmRjb2RlCisgIFF1YWxUeXBlIGdldEluamVjdGVkQ2xhc3NOYW1lU3BlY2lhbGl6YXRpb24oKTsKKworICB1c2luZyBzcGVjX2l0ZXJhdG9yID0gU3BlY0l0ZXJhdG9yPENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w+OworICB1c2luZyBzcGVjX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c3BlY19pdGVyYXRvcj47CisKKyAgc3BlY19yYW5nZSBzcGVjaWFsaXphdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIHNwZWNfcmFuZ2Uoc3BlY19iZWdpbigpLCBzcGVjX2VuZCgpKTsKKyAgfQorCisgIHNwZWNfaXRlcmF0b3Igc3BlY19iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZVNwZWNJdGVyYXRvcihnZXRTcGVjaWFsaXphdGlvbnMoKSwgZmFsc2UpOworICB9CisKKyAgc3BlY19pdGVyYXRvciBzcGVjX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZVNwZWNJdGVyYXRvcihnZXRTcGVjaWFsaXphdGlvbnMoKSwgdHJ1ZSk7CisgIH0KKworICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdCBzdXBwb3J0CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gQ2xhc3NUZW1wbGF0ZTsgfQorfTsKKworLy8vIFxicmllZiBEZWNsYXJhdGlvbiBvZiBhIGZyaWVuZCB0ZW1wbGF0ZS4KKy8vLworLy8vIEZvciBleGFtcGxlOgorLy8vIFxjb2RlCisvLy8gdGVtcGxhdGUgXDx0eXBlbmFtZSBUPiBjbGFzcyBBIHsKKy8vLyAgIGZyaWVuZCBjbGFzcyBNeVZlY3RvcjxUPjsgLy8gbm90IGEgZnJpZW5kIHRlbXBsYXRlCisvLy8gICB0ZW1wbGF0ZSBcPHR5cGVuYW1lIFU+IGZyaWVuZCBjbGFzcyBCOyAvLyBub3QgYSBmcmllbmQgdGVtcGxhdGUKKy8vLyAgIHRlbXBsYXRlIFw8dHlwZW5hbWUgVT4gZnJpZW5kIGNsYXNzIEZvbzxUPjo6TmVzdGVkOyAvLyBmcmllbmQgdGVtcGxhdGUKKy8vLyB9OworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBcbm90ZSBUaGlzIGNsYXNzIGlzIG5vdCBjdXJyZW50bHkgaW4gdXNlLiAgQWxsIG9mIHRoZSBhYm92ZQorLy8vIHdpbGwgeWllbGQgYSBGcmllbmREZWNsLCBub3QgYSBGcmllbmRUZW1wbGF0ZURlY2wuCitjbGFzcyBGcmllbmRUZW1wbGF0ZURlY2wgOiBwdWJsaWMgRGVjbCB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHVibGljOgorICB1c2luZyBGcmllbmRVbmlvbiA9IGxsdm06OlBvaW50ZXJVbmlvbjxOYW1lZERlY2wgKixUeXBlU291cmNlSW5mbyAqPjsKKworcHJpdmF0ZToKKyAgLy8gVGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzOyAgYWx3YXlzIG5vbi16ZXJvLgorICB1bnNpZ25lZCBOdW1QYXJhbXMgPSAwOworCisgIC8vIFRoZSBwYXJhbWV0ZXIgbGlzdC4KKyAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICoqUGFyYW1zID0gbnVsbHB0cjsKKworICAvLyBUaGUgZGVjbGFyYXRpb24gdGhhdCdzIGEgZnJpZW5kIG9mIHRoaXMgY2xhc3MuCisgIEZyaWVuZFVuaW9uIEZyaWVuZDsKKworICAvLyBMb2NhdGlvbiBvZiB0aGUgJ2ZyaWVuZCcgc3BlY2lmaWVyLgorICBTb3VyY2VMb2NhdGlvbiBGcmllbmRMb2M7CisKKyAgRnJpZW5kVGVtcGxhdGVEZWNsKERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgTXV0YWJsZUFycmF5UmVmPFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqPiBQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBGcmllbmRVbmlvbiBGcmllbmQsIFNvdXJjZUxvY2F0aW9uIEZyaWVuZExvYykKKyAgICAgIDogRGVjbChEZWNsOjpGcmllbmRUZW1wbGF0ZSwgREMsIExvYyksIE51bVBhcmFtcyhQYXJhbXMuc2l6ZSgpKSwKKyAgICAgICAgUGFyYW1zKFBhcmFtcy5kYXRhKCkpLCBGcmllbmQoRnJpZW5kKSwgRnJpZW5kTG9jKEZyaWVuZExvYykge30KKworICBGcmllbmRUZW1wbGF0ZURlY2woRW1wdHlTaGVsbCBFbXB0eSkgOiBEZWNsKERlY2w6OkZyaWVuZFRlbXBsYXRlLCBFbXB0eSkge30KKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKworICBzdGF0aWMgRnJpZW5kVGVtcGxhdGVEZWNsICoKKyAgQ3JlYXRlKEFTVENvbnRleHQgJkNvbnRleHQsIERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgTXV0YWJsZUFycmF5UmVmPFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqPiBQYXJhbXMsIEZyaWVuZFVuaW9uIEZyaWVuZCwKKyAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEZyaWVuZExvYyk7CisKKyAgc3RhdGljIEZyaWVuZFRlbXBsYXRlRGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKKworICAvLy8gSWYgdGhpcyBmcmllbmQgZGVjbGFyYXRpb24gbmFtZXMgYSB0ZW1wbGF0ZWQgdHlwZSAob3IKKyAgLy8vIGEgZGVwZW5kZW50IG1lbWJlciB0eXBlIG9mIGEgdGVtcGxhdGVkIHR5cGUpLCByZXR1cm4gdGhhdAorICAvLy8gdHlwZTsgIG90aGVyd2lzZSByZXR1cm4gbnVsbC4KKyAgVHlwZVNvdXJjZUluZm8gKmdldEZyaWVuZFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIEZyaWVuZC5keW5fY2FzdDxUeXBlU291cmNlSW5mbyo+KCk7CisgIH0KKworICAvLy8gSWYgdGhpcyBmcmllbmQgZGVjbGFyYXRpb24gbmFtZXMgYSB0ZW1wbGF0ZWQgZnVuY3Rpb24gKG9yCisgIC8vLyBhIG1lbWJlciBmdW5jdGlvbiBvZiBhIHRlbXBsYXRlZCB0eXBlKSwgcmV0dXJuIHRoYXQgdHlwZTsKKyAgLy8vIG90aGVyd2lzZSByZXR1cm4gbnVsbC4KKyAgTmFtZWREZWNsICpnZXRGcmllbmREZWNsKCkgY29uc3QgeworICAgIHJldHVybiBGcmllbmQuZHluX2Nhc3Q8TmFtZWREZWNsKj4oKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgJ2ZyaWVuZCcga2V5d29yZC4KKyAgU291cmNlTG9jYXRpb24gZ2V0RnJpZW5kTG9jKCkgY29uc3QgeworICAgIHJldHVybiBGcmllbmRMb2M7CisgIH0KKworICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKmdldFRlbXBsYXRlUGFyYW1ldGVyTGlzdCh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPD0gTnVtUGFyYW1zKTsKKyAgICByZXR1cm4gUGFyYW1zW2ldOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtVGVtcGxhdGVQYXJhbWV0ZXJzKCkgY29uc3QgeworICAgIHJldHVybiBOdW1QYXJhbXM7CisgIH0KKworICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC9ldGMuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gRGVjbDo6RnJpZW5kVGVtcGxhdGU7IH0KK307CisKKy8vLyBcYnJpZWYgRGVjbGFyYXRpb24gb2YgYW4gYWxpYXMgdGVtcGxhdGUuCisvLy8KKy8vLyBGb3IgZXhhbXBsZToKKy8vLyBcY29kZQorLy8vIHRlbXBsYXRlIFw8dHlwZW5hbWUgVD4gdXNpbmcgViA9IHN0ZDo6bWFwPFQqLCBpbnQsIE15Q29tcGFyZTxUPj47CisvLy8gXGVuZGNvZGUKK2NsYXNzIFR5cGVBbGlhc1RlbXBsYXRlRGVjbCA6IHB1YmxpYyBSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2wgeworcHJvdGVjdGVkOgorICB1c2luZyBDb21tb24gPSBDb21tb25CYXNlOworCisgIFR5cGVBbGlhc1RlbXBsYXRlRGVjbChBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIEwsCisgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbk5hbWUgTmFtZSwgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKkRlY2wpCisgICAgICA6IFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbChUeXBlQWxpYXNUZW1wbGF0ZSwgQywgREMsIEwsIE5hbWUsIFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2wpIHt9CisKKyAgQ29tbW9uQmFzZSAqbmV3Q29tbW9uKEFTVENvbnRleHQgJkMpIGNvbnN0IG92ZXJyaWRlOworCisgIENvbW1vbiAqZ2V0Q29tbW9uUHRyKCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDb21tb24gKj4oUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsOjpnZXRDb21tb25QdHIoKSk7CisgIH0KKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisKKyAgLy8vIEdldCB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBkZWNsYXJhdGlvbiBvZiB0aGUgdGVtcGxhdGUuCisgIFR5cGVBbGlhc0RlY2wgKmdldFRlbXBsYXRlZERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGVBbGlhc0RlY2wgKj4oVGVtcGxhdGVkRGVjbCk7CisgIH0KKworCisgIFR5cGVBbGlhc1RlbXBsYXRlRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gY2FzdDxUeXBlQWxpYXNUZW1wbGF0ZURlY2w+KAorICAgICAgICAgICAgIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbDo6Z2V0Q2Fub25pY2FsRGVjbCgpKTsKKyAgfQorICBjb25zdCBUeXBlQWxpYXNUZW1wbGF0ZURlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8VHlwZUFsaWFzVGVtcGxhdGVEZWNsPigKKyAgICAgICAgICAgICBSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2w6OmdldENhbm9uaWNhbERlY2woKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBwcmV2aW91cyBkZWNsYXJhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIHRlbXBsYXRlLCBvcgorICAvLy8gbnVsbHB0ciBpZiBubyBzdWNoIGRlY2xhcmF0aW9uIGV4aXN0cy4KKyAgVHlwZUFsaWFzVGVtcGxhdGVEZWNsICpnZXRQcmV2aW91c0RlY2woKSB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxUeXBlQWxpYXNUZW1wbGF0ZURlY2w+KAorICAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCAqPih0aGlzKS0+Z2V0UHJldmlvdXNEZWNsKCkpOworICB9CisgIGNvbnN0IFR5cGVBbGlhc1RlbXBsYXRlRGVjbCAqZ2V0UHJldmlvdXNEZWNsKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8VHlwZUFsaWFzVGVtcGxhdGVEZWNsPigKKyAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2wgKj4oCisgICAgICAgICAgICAgICB0aGlzKS0+Z2V0UHJldmlvdXNEZWNsKCkpOworICB9CisKKyAgVHlwZUFsaWFzVGVtcGxhdGVEZWNsICpnZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyVGVtcGxhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxUeXBlQWxpYXNUZW1wbGF0ZURlY2w+KAorICAgICAgICAgICAgIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbDo6Z2V0SW5zdGFudGlhdGVkRnJvbU1lbWJlclRlbXBsYXRlKCkpOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBmdW5jdGlvbiB0ZW1wbGF0ZSBub2RlLgorICBzdGF0aWMgVHlwZUFsaWFzVGVtcGxhdGVEZWNsICpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKkRlY2wpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIGVtcHR5IGFsaWFzIHRlbXBsYXRlIG5vZGUuCisgIHN0YXRpYyBUeXBlQWxpYXNUZW1wbGF0ZURlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3Qgc3VwcG9ydAorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IFR5cGVBbGlhc1RlbXBsYXRlOyB9Cit9OworCisvLy8gXGJyaWVmIERlY2xhcmF0aW9uIG9mIGEgZnVuY3Rpb24gc3BlY2lhbGl6YXRpb24gYXQgdGVtcGxhdGUgY2xhc3Mgc2NvcGUuCisvLy8KKy8vLyBUaGlzIGlzIGEgbm9uLXN0YW5kYXJkIGV4dGVuc2lvbiBuZWVkZWQgdG8gc3VwcG9ydCBNU1ZDLgorLy8vCisvLy8gRm9yIGV4YW1wbGU6CisvLy8gXGNvZGUKKy8vLyB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKy8vLyBjbGFzcyBBIHsKKy8vLyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVT4gdm9pZCBmb28oVSBhKSB7IH0KKy8vLyAgICB0ZW1wbGF0ZTw+IHZvaWQgZm9vKGludCBhKSB7IH0KKy8vLyB9CisvLy8gXGVuZGNvZGUKKy8vLworLy8vICJ0ZW1wbGF0ZTw+IGZvbyhpbnQgYSkiIHdpbGwgYmUgc2F2ZWQgaW4gU3BlY2lhbGl6YXRpb24gYXMgYSBub3JtYWwKKy8vLyBDWFhNZXRob2REZWNsLiBUaGVuIGR1cmluZyBhbiBpbnN0YW50aWF0aW9uIG9mIGNsYXNzIEEsIGl0IHdpbGwgYmUKKy8vLyB0cmFuc2Zvcm1lZCBpbnRvIGFuIGFjdHVhbCBmdW5jdGlvbiBzcGVjaWFsaXphdGlvbi4KK2NsYXNzIENsYXNzU2NvcGVGdW5jdGlvblNwZWNpYWxpemF0aW9uRGVjbCA6IHB1YmxpYyBEZWNsIHsKKyAgQ1hYTWV0aG9kRGVjbCAqU3BlY2lhbGl6YXRpb247CisgIGJvb2wgSGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3M7CisgIFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyBUZW1wbGF0ZUFyZ3M7CisKKyAgQ2xhc3NTY29wZUZ1bmN0aW9uU3BlY2lhbGl6YXRpb25EZWNsKERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYTWV0aG9kRGVjbCAqRkQsIGJvb2wgQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyBUZW1wbEFyZ3MpCisgICAgICA6IERlY2woRGVjbDo6Q2xhc3NTY29wZUZ1bmN0aW9uU3BlY2lhbGl6YXRpb24sIERDLCBMb2MpLAorICAgICAgICBTcGVjaWFsaXphdGlvbihGRCksIEhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzKEFyZ3MpLAorICAgICAgICBUZW1wbGF0ZUFyZ3Moc3RkOjptb3ZlKFRlbXBsQXJncykpIHt9CisKKyAgQ2xhc3NTY29wZUZ1bmN0aW9uU3BlY2lhbGl6YXRpb25EZWNsKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgICA6IERlY2woRGVjbDo6Q2xhc3NTY29wZUZ1bmN0aW9uU3BlY2lhbGl6YXRpb24sIEVtcHR5KSB7fQorCisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisKKyAgQ1hYTWV0aG9kRGVjbCAqZ2V0U3BlY2lhbGl6YXRpb24oKSBjb25zdCB7IHJldHVybiBTcGVjaWFsaXphdGlvbjsgfQorICBib29sIGhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzKCkgY29uc3QgeyByZXR1cm4gSGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3M7IH0KKyAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvJiB0ZW1wbGF0ZUFyZ3MoKSBjb25zdCB7IHJldHVybiBUZW1wbGF0ZUFyZ3M7IH0KKworICBzdGF0aWMgQ2xhc3NTY29wZUZ1bmN0aW9uU3BlY2lhbGl6YXRpb25EZWNsICpDcmVhdGUoQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWE1ldGhvZERlY2wgKkZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNFeHBsaWNpdFRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gVGVtcGxhdGVBcmdzKSB7CisgICAgcmV0dXJuIG5ldyAoQywgREMpIENsYXNzU2NvcGVGdW5jdGlvblNwZWNpYWxpemF0aW9uRGVjbCgKKyAgICAgICAgREMsIExvYywgRkQsIEhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzLCBzdGQ6Om1vdmUoVGVtcGxhdGVBcmdzKSk7CisgIH0KKworICBzdGF0aWMgQ2xhc3NTY29wZUZ1bmN0aW9uU3BlY2lhbGl6YXRpb25EZWNsICoKKyAgQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIElEKTsKKyAgCisgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7CisgICAgcmV0dXJuIEsgPT0gRGVjbDo6Q2xhc3NTY29wZUZ1bmN0aW9uU3BlY2lhbGl6YXRpb247CisgIH0KK307CisKKy8vLyBJbXBsZW1lbnRhdGlvbiBvZiBpbmxpbmUgZnVuY3Rpb25zIHRoYXQgcmVxdWlyZSB0aGUgdGVtcGxhdGUgZGVjbGFyYXRpb25zCitpbmxpbmUgQW55RnVuY3Rpb25EZWNsOjpBbnlGdW5jdGlvbkRlY2woRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkZURCkKKyAgICA6IEZ1bmN0aW9uKEZURCkge30KKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgdmFyaWFibGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24sIHdoaWNoIHJlZmVycyB0bworLy8vIGEgdmFyaWFibGUgdGVtcGxhdGUgd2l0aCBhIGdpdmVuIHNldCBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMuCisvLy8KKy8vLyBWYXJpYWJsZSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgcmVwcmVzZW50IGJvdGggZXhwbGljaXQKKy8vLyBzcGVjaWFsaXphdGlvbnMgb2YgdmFyaWFibGUgdGVtcGxhdGVzLCBhcyBpbiB0aGUgZXhhbXBsZSBiZWxvdywgYW5kCisvLy8gaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgb2YgdmFyaWFibGUgdGVtcGxhdGVzLgorLy8vCisvLy8gXGNvZGUKKy8vLyB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjb25zdGV4cHIgVCBwaSA9IFQoMy4xNDE1OTI2NTM1ODk3OTMyMzg1KTsKKy8vLworLy8vIHRlbXBsYXRlPD4KKy8vLyBjb25zdGV4cHIgZmxvYXQgcGk8ZmxvYXQ+OyAvLyB2YXJpYWJsZSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBwaTxmbG9hdD4KKy8vLyBcZW5kY29kZQorY2xhc3MgVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgOiBwdWJsaWMgVmFyRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGxsdm06OkZvbGRpbmdTZXROb2RlIHsKKworICAvLy8gXGJyaWVmIFN0cnVjdHVyZSB0aGF0IHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBhIHZhcmlhYmxlIHRlbXBsYXRlCisgIC8vLyBzcGVjaWFsaXphdGlvbiB0aGF0IHdhcyBpbnN0YW50aWF0ZWQgZnJvbSBhIHZhcmlhYmxlIHRlbXBsYXRlIHBhcnRpYWwKKyAgLy8vIHNwZWNpYWxpemF0aW9uLgorICBzdHJ1Y3QgU3BlY2lhbGl6ZWRQYXJ0aWFsU3BlY2lhbGl6YXRpb24geworICAgIC8vLyBcYnJpZWYgVGhlIHZhcmlhYmxlIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZnJvbSB3aGljaCB0aGlzCisgICAgLy8vIHZhcmlhYmxlIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHdhcyBpbnN0YW50aWF0ZWQuCisgICAgVmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsICpQYXJ0aWFsU3BlY2lhbGl6YXRpb247CisKKyAgICAvLy8gXGJyaWVmIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0IGRlZHVjZWQgZm9yIHRoZSB2YXJpYWJsZSB0ZW1wbGF0ZQorICAgIC8vLyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGl0c2VsZi4KKyAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdCAqVGVtcGxhdGVBcmdzOworICB9OworCisgIC8vLyBcYnJpZWYgVGhlIHRlbXBsYXRlIHRoYXQgdGhpcyBzcGVjaWFsaXphdGlvbiBzcGVjaWFsaXplcy4KKyAgbGx2bTo6UG9pbnRlclVuaW9uPFZhclRlbXBsYXRlRGVjbCAqLCBTcGVjaWFsaXplZFBhcnRpYWxTcGVjaWFsaXphdGlvbiAqPgorICBTcGVjaWFsaXplZFRlbXBsYXRlOworCisgIC8vLyBcYnJpZWYgRnVydGhlciBpbmZvIGZvciBleHBsaWNpdCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi9pbnN0YW50aWF0aW9uLgorICBzdHJ1Y3QgRXhwbGljaXRTcGVjaWFsaXphdGlvbkluZm8geworICAgIC8vLyBcYnJpZWYgVGhlIHR5cGUtYXMtd3JpdHRlbi4KKyAgICBUeXBlU291cmNlSW5mbyAqVHlwZUFzV3JpdHRlbiA9IG51bGxwdHI7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgZXh0ZXJuIGtleXdvcmQuCisgICAgU291cmNlTG9jYXRpb24gRXh0ZXJuTG9jOworCisgICAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIHRlbXBsYXRlIGtleXdvcmQuCisgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLZXl3b3JkTG9jOworCisgICAgRXhwbGljaXRTcGVjaWFsaXphdGlvbkluZm8oKSA9IGRlZmF1bHQ7CisgIH07CisKKyAgLy8vIFxicmllZiBGdXJ0aGVyIGluZm8gZm9yIGV4cGxpY2l0IHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uL2luc3RhbnRpYXRpb24uCisgIC8vLyBEb2VzIG5vdCBhcHBseSB0byBpbXBsaWNpdCBzcGVjaWFsaXphdGlvbnMuCisgIEV4cGxpY2l0U3BlY2lhbGl6YXRpb25JbmZvICpFeHBsaWNpdEluZm8gPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIHRlbXBsYXRlIGFyZ3VtZW50cyB1c2VkIHRvIGRlc2NyaWJlIHRoaXMgc3BlY2lhbGl6YXRpb24uCisgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0ICpUZW1wbGF0ZUFyZ3M7CisgIFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyBUZW1wbGF0ZUFyZ3NJbmZvOworCisgIC8vLyBcYnJpZWYgVGhlIHBvaW50IHdoZXJlIHRoaXMgdGVtcGxhdGUgd2FzIGluc3RhbnRpYXRlZCAoaWYgYW55KS4KKyAgU291cmNlTG9jYXRpb24gUG9pbnRPZkluc3RhbnRpYXRpb247CisKKyAgLy8vIFxicmllZiBUaGUga2luZCBvZiBzcGVjaWFsaXphdGlvbiB0aGlzIGRlY2xhcmF0aW9uIHJlZmVycyB0by4KKyAgLy8vIFJlYWxseSBhIHZhbHVlIG9mIHR5cGUgVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQuCisgIHVuc2lnbmVkIFNwZWNpYWxpemF0aW9uS2luZCA6IDM7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gaXMgYSBjb21wbGV0ZSBkZWZpbml0aW9uIG9mIHRoZQorICAvLy8gdmFyaWFibGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uIFdlIGNhbid0IG90aGVyd2lzZSB0ZWxsIGFwYXJ0CisgIC8vLyBhbiBpbnN0YW50aWF0ZWQgZGVjbGFyYXRpb24gZnJvbSBhbiBpbnN0YW50aWF0ZWQgZGVmaW5pdGlvbiB3aXRoCisgIC8vLyBubyBpbml0aWFsaXplci4KKyAgdW5zaWduZWQgSXNDb21wbGV0ZURlZmluaXRpb24gOiAxOworCitwcm90ZWN0ZWQ6CisgIFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsKEtpbmQgREssIEFTVENvbnRleHQgJkNvbnRleHQsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIElkTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJUZW1wbGF0ZURlY2wgKlNwZWNpYWxpemVkVGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZUNsYXNzIFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IEFyZ3MpOworCisgIGV4cGxpY2l0IFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsKEtpbmQgREssIEFTVENvbnRleHQgJkNvbnRleHQpOworCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsUmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNURGVjbFdyaXRlcjsKKyAgZnJpZW5kIGNsYXNzIFZhckRlY2w7CisKKyAgc3RhdGljIFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICoKKyAgQ3JlYXRlKEFTVENvbnRleHQgJkNvbnRleHQsIERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJZExvYywgVmFyVGVtcGxhdGVEZWNsICpTcGVjaWFsaXplZFRlbXBsYXRlLCBRdWFsVHlwZSBULAorICAgICAgICAgVHlwZVNvdXJjZUluZm8gKlRJbmZvLCBTdG9yYWdlQ2xhc3MgUywKKyAgICAgICAgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IEFyZ3MpOworICBzdGF0aWMgVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJRCk7CisKKyAgdm9pZCBnZXROYW1lRm9yRGlhZ25vc3RpYyhyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBRdWFsaWZpZWQpIGNvbnN0IG92ZXJyaWRlOworCisgIFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICpnZXRNb3N0UmVjZW50RGVjbCgpIHsKKyAgICBWYXJEZWNsICpSZWNlbnQgPSBzdGF0aWNfY2FzdDxWYXJEZWNsICo+KHRoaXMpLT5nZXRNb3N0UmVjZW50RGVjbCgpOworICAgIHJldHVybiBjYXN0PFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsPihSZWNlbnQpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdGVtcGxhdGUgdGhhdCB0aGlzIHNwZWNpYWxpemF0aW9uIHNwZWNpYWxpemVzLgorICBWYXJUZW1wbGF0ZURlY2wgKmdldFNwZWNpYWxpemVkVGVtcGxhdGUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgb2YgdGhlIHZhcmlhYmxlIHRlbXBsYXRlCisgIC8vLyBzcGVjaWFsaXphdGlvbi4KKyAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3QgJmdldFRlbXBsYXRlQXJncygpIGNvbnN0IHsgcmV0dXJuICpUZW1wbGF0ZUFyZ3M7IH0KKworICAvLyBUT0RPOiBBbHdheXMgc2V0IHRoaXMgd2hlbiBjcmVhdGluZyB0aGUgbmV3IHNwZWNpYWxpemF0aW9uPworICB2b2lkIHNldFRlbXBsYXRlQXJnc0luZm8oY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICZBcmdzSW5mbyk7CisKKyAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICZnZXRUZW1wbGF0ZUFyZ3NJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBUZW1wbGF0ZUFyZ3NJbmZvOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIGtpbmQgb2Ygc3BlY2lhbGl6YXRpb24gdGhhdCB0aGlzCisgIC8vLyBkZWNsYXJhdGlvbiByZXByZXNlbnRzLgorICBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCBnZXRTcGVjaWFsaXphdGlvbktpbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kPihTcGVjaWFsaXphdGlvbktpbmQpOworICB9CisKKyAgYm9vbCBpc0V4cGxpY2l0U3BlY2lhbGl6YXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFNwZWNpYWxpemF0aW9uS2luZCgpID09IFRTS19FeHBsaWNpdFNwZWNpYWxpemF0aW9uOworICB9CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgZGVjbGFyYXRpb24gaXMgYW4gZXhwbGljaXQgc3BlY2lhbGl6YXRpb24sCisgIC8vLyBleHBsaWNpdCBpbnN0YW50aWF0aW9uIGRlY2xhcmF0aW9uLCBvciBleHBsaWNpdCBpbnN0YW50aWF0aW9uCisgIC8vLyBkZWZpbml0aW9uLgorICBib29sIGlzRXhwbGljaXRJbnN0YW50aWF0aW9uT3JTcGVjaWFsaXphdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNUZW1wbGF0ZUV4cGxpY2l0SW5zdGFudGlhdGlvbk9yU3BlY2lhbGl6YXRpb24oCisgICAgICAgIGdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKCkpOworICB9CisKKyAgdm9pZCBzZXRTcGVjaWFsaXphdGlvbktpbmQoVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQgVFNLKSB7CisgICAgU3BlY2lhbGl6YXRpb25LaW5kID0gVFNLOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHBvaW50IG9mIGluc3RhbnRpYXRpb24gKGlmIGFueSksIG9yIG51bGwgaWYgbm9uZS4KKyAgU291cmNlTG9jYXRpb24gZ2V0UG9pbnRPZkluc3RhbnRpYXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIFBvaW50T2ZJbnN0YW50aWF0aW9uOworICB9CisKKyAgdm9pZCBzZXRQb2ludE9mSW5zdGFudGlhdGlvbihTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBhc3NlcnQoTG9jLmlzVmFsaWQoKSAmJiAicG9pbnQgb2YgaW5zdGFudGlhdGlvbiBtdXN0IGJlIHZhbGlkISIpOworICAgIFBvaW50T2ZJbnN0YW50aWF0aW9uID0gTG9jOworICB9CisKKyAgdm9pZCBzZXRDb21wbGV0ZURlZmluaXRpb24oKSB7IElzQ29tcGxldGVEZWZpbml0aW9uID0gdHJ1ZTsgfQorCisgIC8vLyBcYnJpZWYgSWYgdGhpcyB2YXJpYWJsZSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBpcyBhbiBpbnN0YW50aWF0aW9uIG9mCisgIC8vLyBhIHRlbXBsYXRlIChyYXRoZXIgdGhhbiBhbiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiksIHJldHVybiB0aGUKKyAgLy8vIHZhcmlhYmxlIHRlbXBsYXRlIG9yIHZhcmlhYmxlIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZnJvbSB3aGljaAorICAvLy8gaXQgd2FzIGluc3RhbnRpYXRlZC4KKyAgbGx2bTo6UG9pbnRlclVuaW9uPFZhclRlbXBsYXRlRGVjbCAqLCBWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKj4KKyAgZ2V0SW5zdGFudGlhdGVkRnJvbSgpIGNvbnN0IHsKKyAgICBpZiAoIWlzVGVtcGxhdGVJbnN0YW50aWF0aW9uKGdldFNwZWNpYWxpemF0aW9uS2luZCgpKSkKKyAgICAgIHJldHVybiBsbHZtOjpQb2ludGVyVW5pb248VmFyVGVtcGxhdGVEZWNsICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqPigpOworCisgICAgcmV0dXJuIGdldFNwZWNpYWxpemVkVGVtcGxhdGVPclBhcnRpYWwoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHZhcmlhYmxlIHRlbXBsYXRlIG9yIHZhcmlhYmxlIHRlbXBsYXRlIHBhcnRpYWwKKyAgLy8vIHNwZWNpYWxpemF0aW9uIHdoaWNoIHdhcyBzcGVjaWFsaXplZCBieSB0aGlzLgorICBsbHZtOjpQb2ludGVyVW5pb248VmFyVGVtcGxhdGVEZWNsICosIFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqPgorICBnZXRTcGVjaWFsaXplZFRlbXBsYXRlT3JQYXJ0aWFsKCkgY29uc3QgeworICAgIGlmIChjb25zdCBhdXRvICpQYXJ0aWFsU3BlYyA9CisgICAgICAgICAgICBTcGVjaWFsaXplZFRlbXBsYXRlLmR5bl9jYXN0PFNwZWNpYWxpemVkUGFydGlhbFNwZWNpYWxpemF0aW9uICo+KCkpCisgICAgICByZXR1cm4gUGFydGlhbFNwZWMtPlBhcnRpYWxTcGVjaWFsaXphdGlvbjsKKworICAgIHJldHVybiBTcGVjaWFsaXplZFRlbXBsYXRlLmdldDxWYXJUZW1wbGF0ZURlY2wgKj4oKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHNldCBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMgdGhhdCBzaG91bGQgYmUgdXNlZAorICAvLy8gdG8gaW5zdGFudGlhdGUgdGhlIGluaXRpYWxpemVyIG9mIHRoZSB2YXJpYWJsZSB0ZW1wbGF0ZSBvciB2YXJpYWJsZQorICAvLy8gdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBmcm9tIHdoaWNoIHRoaXMgdmFyaWFibGUgdGVtcGxhdGUKKyAgLy8vIHNwZWNpYWxpemF0aW9uIHdhcyBpbnN0YW50aWF0ZWQuCisgIC8vLworICAvLy8gXHJldHVybnMgRm9yIGEgdmFyaWFibGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gaW5zdGFudGlhdGVkIGZyb20gdGhlCisgIC8vLyBwcmltYXJ5IHRlbXBsYXRlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBzYW1lIHRlbXBsYXRlIGFyZ3VtZW50cworICAvLy8gYXMgZ2V0VGVtcGxhdGVBcmdzKCkuIEZvciBhIHZhcmlhYmxlIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGluc3RhbnRpYXRlZAorICAvLy8gZnJvbSBhIHZhcmlhYmxlIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24sIHRoaXMgZnVuY3Rpb24gd2lsbCB0aGUKKyAgLy8vIHJldHVybiBkZWR1Y2VkIHRlbXBsYXRlIGFyZ3VtZW50cyBmb3IgdGhlIHZhcmlhYmxlIHRlbXBsYXRlIHBhcnRpYWwKKyAgLy8vIHNwZWNpYWxpemF0aW9uIGl0c2VsZi4KKyAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3QgJmdldFRlbXBsYXRlSW5zdGFudGlhdGlvbkFyZ3MoKSBjb25zdCB7CisgICAgaWYgKGNvbnN0IGF1dG8gKlBhcnRpYWxTcGVjID0KKyAgICAgICAgICAgIFNwZWNpYWxpemVkVGVtcGxhdGUuZHluX2Nhc3Q8U3BlY2lhbGl6ZWRQYXJ0aWFsU3BlY2lhbGl6YXRpb24gKj4oKSkKKyAgICAgIHJldHVybiAqUGFydGlhbFNwZWMtPlRlbXBsYXRlQXJnczsKKworICAgIHJldHVybiBnZXRUZW1wbGF0ZUFyZ3MoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTm90ZSB0aGF0IHRoaXMgdmFyaWFibGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gaXMgYWN0dWFsbHkgYW4KKyAgLy8vIGluc3RhbnRpYXRpb24gb2YgdGhlIGdpdmVuIHZhcmlhYmxlIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gd2hvc2UKKyAgLy8vIHRlbXBsYXRlIGFyZ3VtZW50cyBoYXZlIGJlZW4gZGVkdWNlZC4KKyAgdm9pZCBzZXRJbnN0YW50aWF0aW9uT2YoVmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsICpQYXJ0aWFsU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3QgKlRlbXBsYXRlQXJncykgeworICAgIGFzc2VydCghU3BlY2lhbGl6ZWRUZW1wbGF0ZS5pczxTcGVjaWFsaXplZFBhcnRpYWxTcGVjaWFsaXphdGlvbiAqPigpICYmCisgICAgICAgICAgICJBbHJlYWR5IHNldCB0byBhIHZhcmlhYmxlIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24hIik7CisgICAgYXV0byAqUFMgPSBuZXcgKGdldEFTVENvbnRleHQoKSkgU3BlY2lhbGl6ZWRQYXJ0aWFsU3BlY2lhbGl6YXRpb24oKTsKKyAgICBQUy0+UGFydGlhbFNwZWNpYWxpemF0aW9uID0gUGFydGlhbFNwZWM7CisgICAgUFMtPlRlbXBsYXRlQXJncyA9IFRlbXBsYXRlQXJnczsKKyAgICBTcGVjaWFsaXplZFRlbXBsYXRlID0gUFM7CisgIH0KKworICAvLy8gXGJyaWVmIE5vdGUgdGhhdCB0aGlzIHZhcmlhYmxlIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGlzIGFuIGluc3RhbnRpYXRpb24KKyAgLy8vIG9mIHRoZSBnaXZlbiB2YXJpYWJsZSB0ZW1wbGF0ZS4KKyAgdm9pZCBzZXRJbnN0YW50aWF0aW9uT2YoVmFyVGVtcGxhdGVEZWNsICpUZW1wbERlY2wpIHsKKyAgICBhc3NlcnQoIVNwZWNpYWxpemVkVGVtcGxhdGUuaXM8U3BlY2lhbGl6ZWRQYXJ0aWFsU3BlY2lhbGl6YXRpb24gKj4oKSAmJgorICAgICAgICAgICAiUHJldmlvdXNseSBzZXQgdG8gYSB2YXJpYWJsZSB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uISIpOworICAgIFNwZWNpYWxpemVkVGVtcGxhdGUgPSBUZW1wbERlY2w7CisgIH0KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIHR5cGUgb2YgdGhpcyBzcGVjaWFsaXphdGlvbiBhcyBpdCB3YXMgd3JpdHRlbiBieQorICAvLy8gdGhlIHVzZXIuCisgIHZvaWQgc2V0VHlwZUFzV3JpdHRlbihUeXBlU291cmNlSW5mbyAqVCkgeworICAgIGlmICghRXhwbGljaXRJbmZvKQorICAgICAgRXhwbGljaXRJbmZvID0gbmV3IChnZXRBU1RDb250ZXh0KCkpIEV4cGxpY2l0U3BlY2lhbGl6YXRpb25JbmZvOworICAgIEV4cGxpY2l0SW5mby0+VHlwZUFzV3JpdHRlbiA9IFQ7CisgIH0KKworICAvLy8gXGJyaWVmIEdldHMgdGhlIHR5cGUgb2YgdGhpcyBzcGVjaWFsaXphdGlvbiBhcyBpdCB3YXMgd3JpdHRlbiBieQorICAvLy8gdGhlIHVzZXIsIGlmIGl0IHdhcyBzbyB3cml0dGVuLgorICBUeXBlU291cmNlSW5mbyAqZ2V0VHlwZUFzV3JpdHRlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gRXhwbGljaXRJbmZvID8gRXhwbGljaXRJbmZvLT5UeXBlQXNXcml0dGVuIDogbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIGV4dGVybiBrZXl3b3JkLCBpZiBwcmVzZW50LgorICBTb3VyY2VMb2NhdGlvbiBnZXRFeHRlcm5Mb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIEV4cGxpY2l0SW5mbyA/IEV4cGxpY2l0SW5mby0+RXh0ZXJuTG9jIDogU291cmNlTG9jYXRpb24oKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIGV4dGVybiBrZXl3b3JkLgorICB2b2lkIHNldEV4dGVybkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBpZiAoIUV4cGxpY2l0SW5mbykKKyAgICAgIEV4cGxpY2l0SW5mbyA9IG5ldyAoZ2V0QVNUQ29udGV4dCgpKSBFeHBsaWNpdFNwZWNpYWxpemF0aW9uSW5mbzsKKyAgICBFeHBsaWNpdEluZm8tPkV4dGVybkxvYyA9IExvYzsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIHRlbXBsYXRlIGtleXdvcmQuCisgIHZvaWQgc2V0VGVtcGxhdGVLZXl3b3JkTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIGlmICghRXhwbGljaXRJbmZvKQorICAgICAgRXhwbGljaXRJbmZvID0gbmV3IChnZXRBU1RDb250ZXh0KCkpIEV4cGxpY2l0U3BlY2lhbGl6YXRpb25JbmZvOworICAgIEV4cGxpY2l0SW5mby0+VGVtcGxhdGVLZXl3b3JkTG9jID0gTG9jOworICB9CisKKyAgLy8vIFxicmllZiBHZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgdGVtcGxhdGUga2V5d29yZCwgaWYgcHJlc2VudC4KKyAgU291cmNlTG9jYXRpb24gZ2V0VGVtcGxhdGVLZXl3b3JkTG9jKCkgY29uc3QgeworICAgIHJldHVybiBFeHBsaWNpdEluZm8gPyBFeHBsaWNpdEluZm8tPlRlbXBsYXRlS2V5d29yZExvYyA6IFNvdXJjZUxvY2F0aW9uKCk7CisgIH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IHsKKyAgICBQcm9maWxlKElELCBUZW1wbGF0ZUFyZ3MtPmFzQXJyYXkoKSwgZ2V0QVNUQ29udGV4dCgpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsCisgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIEFTVENvbnRleHQgJkNvbnRleHQpIHsKKyAgICBJRC5BZGRJbnRlZ2VyKFRlbXBsYXRlQXJncy5zaXplKCkpOworICAgIGZvciAoY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmVGVtcGxhdGVBcmcgOiBUZW1wbGF0ZUFyZ3MpCisgICAgICBUZW1wbGF0ZUFyZy5Qcm9maWxlKElELCBDb250ZXh0KTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeworICAgIHJldHVybiBLID49IGZpcnN0VmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbiAmJgorICAgICAgICAgICBLIDw9IGxhc3RWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uOworICB9Cit9OworCitjbGFzcyBWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wKKyAgICA6IHB1YmxpYyBWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCB7CisgIC8vLyBcYnJpZWYgVGhlIGxpc3Qgb2YgdGVtcGxhdGUgcGFyYW1ldGVycworICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlRlbXBsYXRlUGFyYW1zID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFRoZSBzb3VyY2UgaW5mbyBmb3IgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBhcyB3cml0dGVuLgorICAvLy8gRklYTUU6IHJlZHVuZGFudCB3aXRoIFR5cGVBc1dyaXR0ZW4/CisgIGNvbnN0IEFTVFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqQXJnc0FzV3JpdHRlbiA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBUaGUgdmFyaWFibGUgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBmcm9tIHdoaWNoIHRoaXMKKyAgLy8vIHZhcmlhYmxlIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gd2FzIGluc3RhbnRpYXRlZC4KKyAgLy8vCisgIC8vLyBUaGUgYm9vbGVhbiB2YWx1ZSB3aWxsIGJlIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHZhcmlhYmxlIHRlbXBsYXRlCisgIC8vLyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIHdhcyBzcGVjaWFsaXplZCBhdCB0aGlzIGxldmVsLgorICBsbHZtOjpQb2ludGVySW50UGFpcjxWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKiwgMSwgYm9vbD4KKyAgSW5zdGFudGlhdGVkRnJvbU1lbWJlcjsKKworICBWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2woCisgICAgICBBU1RDb250ZXh0ICZDb250ZXh0LCBEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgU291cmNlTG9jYXRpb24gSWRMb2MsIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zLAorICAgICAgVmFyVGVtcGxhdGVEZWNsICpTcGVjaWFsaXplZFRlbXBsYXRlLCBRdWFsVHlwZSBULCBUeXBlU291cmNlSW5mbyAqVEluZm8sCisgICAgICBTdG9yYWdlQ2xhc3MgUywgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gQXJncywKKyAgICAgIGNvbnN0IEFTVFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqQXJnSW5mb3MpOworCisgIFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbChBU1RDb250ZXh0ICZDb250ZXh0KQorICAgICAgOiBWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbChWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCksCisgICAgICAgIEluc3RhbnRpYXRlZEZyb21NZW1iZXIobnVsbHB0ciwgZmFsc2UpIHt9CisKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisKKyAgc3RhdGljIFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqCisgIENyZWF0ZShBU1RDb250ZXh0ICZDb250ZXh0LCBEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgU291cmNlTG9jYXRpb24gSWRMb2MsIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zLAorICAgICAgICAgVmFyVGVtcGxhdGVEZWNsICpTcGVjaWFsaXplZFRlbXBsYXRlLCBRdWFsVHlwZSBULAorICAgICAgICAgVHlwZVNvdXJjZUluZm8gKlRJbmZvLCBTdG9yYWdlQ2xhc3MgUywgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gQXJncywKKyAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAmQXJnSW5mb3MpOworCisgIHN0YXRpYyBWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpOworCisgIFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqZ2V0TW9zdFJlY2VudERlY2woKSB7CisgICAgcmV0dXJuIGNhc3Q8VmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsPigKKyAgICAgICAgICAgICBzdGF0aWNfY2FzdDxWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAqPigKKyAgICAgICAgICAgICAgIHRoaXMpLT5nZXRNb3N0UmVjZW50RGVjbCgpKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGxpc3Qgb2YgdGVtcGxhdGUgcGFyYW1ldGVycworICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKmdldFRlbXBsYXRlUGFyYW1ldGVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gVGVtcGxhdGVQYXJhbXM7CisgIH0KKworICAvLy8gR2V0IHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgYXMgd3JpdHRlbi4KKyAgY29uc3QgQVNUVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICpnZXRUZW1wbGF0ZUFyZ3NBc1dyaXR0ZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIEFyZ3NBc1dyaXR0ZW47CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtZW1iZXIgdmFyaWFibGUgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBmcm9tCisgIC8vLyB3aGljaCB0aGlzIHBhcnRpY3VsYXIgdmFyaWFibGUgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiB3YXMKKyAgLy8vIGluc3RhbnRpYXRlZC4KKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgLy8vIHN0cnVjdCBPdXRlciB7CisgIC8vLyAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IFUgSW5uZXI7CisgIC8vLyAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IFUqIElubmVyPFUqPiA9IChVKikoMCk7IC8vICMxCisgIC8vLyB9OworICAvLy8KKyAgLy8vIHRlbXBsYXRlIGludCogT3V0ZXI8ZmxvYXQ+OjpJbm5lcjxpbnQqPjsKKyAgLy8vIFxlbmRjb2RlCisgIC8vLworICAvLy8gSW4gdGhpcyBleGFtcGxlLCB0aGUgaW5zdGFudGlhdGlvbiBvZiBcYyBPdXRlcjxmbG9hdD46OklubmVyPGludCo+IHdpbGwKKyAgLy8vIGVuZCB1cCBpbnN0YW50aWF0aW5nIHRoZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uCisgIC8vLyBcYyBPdXRlcjxmbG9hdD46OklubmVyPFUqPiwgd2hpY2ggaXRzZWxmIHdhcyBpbnN0YW50aWF0ZWQgZnJvbSB0aGUKKyAgLy8vIHZhcmlhYmxlIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gXGMgT3V0ZXI8VD46OklubmVyPFUqPi4gR2l2ZW4KKyAgLy8vIFxjIE91dGVyPGZsb2F0Pjo6SW5uZXI8VSo+LCB0aGlzIGZ1bmN0aW9uIHdvdWxkIHJldHVybgorICAvLy8gXGMgT3V0ZXI8VD46OklubmVyPFUqPi4KKyAgVmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsICpnZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyKCkgY29uc3QgeworICAgIGNvbnN0IGF1dG8gKkZpcnN0ID0KKyAgICAgICAgY2FzdDxWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2w+KGdldEZpcnN0RGVjbCgpKTsKKyAgICByZXR1cm4gRmlyc3QtPkluc3RhbnRpYXRlZEZyb21NZW1iZXIuZ2V0UG9pbnRlcigpOworICB9CisKKyAgdm9pZAorICBzZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyKFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqUGFydGlhbFNwZWMpIHsKKyAgICBhdXRvICpGaXJzdCA9IGNhc3Q8VmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsPihnZXRGaXJzdERlY2woKSk7CisgICAgRmlyc3QtPkluc3RhbnRpYXRlZEZyb21NZW1iZXIuc2V0UG9pbnRlcihQYXJ0aWFsU3BlYyk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB0aGlzIHZhcmlhYmxlIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KKyAgLy8vIHdhcyBhIHNwZWNpYWxpemF0aW9uIG9mIGEgbWVtYmVyIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uCisgIC8vLworICAvLy8gSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCB0aGUgbWVtYmVyIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KKyAgLy8vIFxjIFg8aW50Pjo6SW5uZXI8VCo+IGlzIGEgbWVtYmVyIHNwZWNpYWxpemF0aW9uLgorICAvLy8KKyAgLy8vIFxjb2RlCisgIC8vLyB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAvLy8gc3RydWN0IFggeworICAvLy8gICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBVIElubmVyOworICAvLy8gICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBVKiBJbm5lcjxVKj4gPSAoVSopKDApOworICAvLy8gfTsKKyAgLy8vCisgIC8vLyB0ZW1wbGF0ZTw+IHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIC8vLyBVKiBYPGludD46OklubmVyPFQqPiA9IChUKikoMCkgKyAxOworICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBpc01lbWJlclNwZWNpYWxpemF0aW9uKCkgeworICAgIGNvbnN0IGF1dG8gKkZpcnN0ID0KKyAgICAgICAgY2FzdDxWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2w+KGdldEZpcnN0RGVjbCgpKTsKKyAgICByZXR1cm4gRmlyc3QtPkluc3RhbnRpYXRlZEZyb21NZW1iZXIuZ2V0SW50KCk7CisgIH0KKworICAvLy8gXGJyaWVmIE5vdGUgdGhhdCB0aGlzIG1lbWJlciB0ZW1wbGF0ZSBpcyBhIHNwZWNpYWxpemF0aW9uLgorICB2b2lkIHNldE1lbWJlclNwZWNpYWxpemF0aW9uKCkgeworICAgIGF1dG8gKkZpcnN0ID0gY2FzdDxWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2w+KGdldEZpcnN0RGVjbCgpKTsKKyAgICBhc3NlcnQoRmlyc3QtPkluc3RhbnRpYXRlZEZyb21NZW1iZXIuZ2V0UG9pbnRlcigpICYmCisgICAgICAgICAgICJPbmx5IG1lbWJlciB0ZW1wbGF0ZXMgY2FuIGJlIG1lbWJlciB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMiKTsKKyAgICByZXR1cm4gRmlyc3QtPkluc3RhbnRpYXRlZEZyb21NZW1iZXIuc2V0SW50KHRydWUpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7CisgICAgcmV0dXJuIEsgPT0gVmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb247CisgIH0KK307CisKKy8vLyBEZWNsYXJhdGlvbiBvZiBhIHZhcmlhYmxlIHRlbXBsYXRlLgorY2xhc3MgVmFyVGVtcGxhdGVEZWNsIDogcHVibGljIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCB7Citwcm90ZWN0ZWQ6CisgIC8vLyBcYnJpZWYgRGF0YSB0aGF0IGlzIGNvbW1vbiB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBvZiBhIGdpdmVuCisgIC8vLyB2YXJpYWJsZSB0ZW1wbGF0ZS4KKyAgc3RydWN0IENvbW1vbiA6IENvbW1vbkJhc2UgeworICAgIC8vLyBcYnJpZWYgVGhlIHZhcmlhYmxlIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyBmb3IgdGhpcyB2YXJpYWJsZQorICAgIC8vLyB0ZW1wbGF0ZSwgaW5jbHVkaW5nIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9ucyBhbmQgaW5zdGFudGlhdGlvbnMuCisgICAgbGx2bTo6Rm9sZGluZ1NldFZlY3RvcjxWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbD4gU3BlY2lhbGl6YXRpb25zOworCisgICAgLy8vIFxicmllZiBUaGUgdmFyaWFibGUgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbnMgZm9yIHRoaXMgdmFyaWFibGUKKyAgICAvLy8gdGVtcGxhdGUuCisgICAgbGx2bTo6Rm9sZGluZ1NldFZlY3RvcjxWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2w+CisgICAgUGFydGlhbFNwZWNpYWxpemF0aW9uczsKKworICAgIENvbW1vbigpID0gZGVmYXVsdDsKKyAgfTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzZXQgb2Ygc3BlY2lhbGl6YXRpb25zIG9mIHRoaXMgdmFyaWFibGUgdGVtcGxhdGUuCisgIGxsdm06OkZvbGRpbmdTZXRWZWN0b3I8VmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w+ICYKKyAgZ2V0U3BlY2lhbGl6YXRpb25zKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc2V0IG9mIHBhcnRpYWwgc3BlY2lhbGl6YXRpb25zIG9mIHRoaXMgY2xhc3MKKyAgLy8vIHRlbXBsYXRlLgorICBsbHZtOjpGb2xkaW5nU2V0VmVjdG9yPFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbD4gJgorICBnZXRQYXJ0aWFsU3BlY2lhbGl6YXRpb25zKCk7CisKKyAgVmFyVGVtcGxhdGVEZWNsKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gTCwKKyAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBOYW1lLCBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlBhcmFtcywKKyAgICAgICAgICAgICAgICAgIE5hbWVkRGVjbCAqRGVjbCkKKyAgICAgIDogUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsKFZhclRlbXBsYXRlLCBDLCBEQywgTCwgTmFtZSwgUGFyYW1zLCBEZWNsKSB7fQorCisgIENvbW1vbkJhc2UgKm5ld0NvbW1vbihBU1RDb250ZXh0ICZDKSBjb25zdCBvdmVycmlkZTsKKworICBDb21tb24gKmdldENvbW1vblB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q29tbW9uICo+KFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbDo6Z2V0Q29tbW9uUHRyKCkpOworICB9CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1REZWNsV3JpdGVyOworCisgIC8vLyBcYnJpZWYgTG9hZCBhbnkgbGF6aWx5LWxvYWRlZCBzcGVjaWFsaXphdGlvbnMgZnJvbSB0aGUgZXh0ZXJuYWwgc291cmNlLgorICB2b2lkIExvYWRMYXp5U3BlY2lhbGl6YXRpb25zKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHVuZGVybHlpbmcgdmFyaWFibGUgZGVjbGFyYXRpb25zIG9mIHRoZSB0ZW1wbGF0ZS4KKyAgVmFyRGVjbCAqZ2V0VGVtcGxhdGVkRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VmFyRGVjbCAqPihUZW1wbGF0ZWREZWNsKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB3aGV0aGVyIHRoaXMgdGVtcGxhdGUgZGVjbGFyYXRpb24gZGVmaW5lcyB0aGUgcHJpbWFyeQorICAvLy8gdmFyaWFibGUgcGF0dGVybi4KKyAgYm9vbCBpc1RoaXNEZWNsYXJhdGlvbkFEZWZpbml0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUZW1wbGF0ZWREZWNsKCktPmlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKTsKKyAgfQorCisgIFZhclRlbXBsYXRlRGVjbCAqZ2V0RGVmaW5pdGlvbigpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgdmFyaWFibGUgdGVtcGxhdGUgbm9kZS4KKyAgc3RhdGljIFZhclRlbXBsYXRlRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEwsIERlY2xhcmF0aW9uTmFtZSBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJEZWNsICpEZWNsKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhbiBlbXB0eSB2YXJpYWJsZSB0ZW1wbGF0ZSBub2RlLgorICBzdGF0aWMgVmFyVGVtcGxhdGVEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzcGVjaWFsaXphdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMgaWYgaXQgZXhpc3RzLAorICAvLy8gb3RoZXJ3aXNlIHJldHVybiB0aGUgaW5zZXJ0aW9uIHBvaW50LgorICBWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAqCisgIGZpbmRTcGVjaWFsaXphdGlvbihBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBBcmdzLCB2b2lkIComSW5zZXJ0UG9zKTsKKworICAvLy8gXGJyaWVmIEluc2VydCB0aGUgc3BlY2lmaWVkIHNwZWNpYWxpemF0aW9uIGtub3dpbmcgdGhhdCBpdCBpcyBub3QgYWxyZWFkeQorICAvLy8gaW4uIEluc2VydFBvcyBtdXN0IGJlIG9idGFpbmVkIGZyb20gZmluZFNwZWNpYWxpemF0aW9uLgorICB2b2lkIEFkZFNwZWNpYWxpemF0aW9uKFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICpELCB2b2lkICpJbnNlcnRQb3MpOworCisgIFZhclRlbXBsYXRlRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gY2FzdDxWYXJUZW1wbGF0ZURlY2w+KFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbDo6Z2V0Q2Fub25pY2FsRGVjbCgpKTsKKyAgfQorICBjb25zdCBWYXJUZW1wbGF0ZURlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8VmFyVGVtcGxhdGVEZWNsPihSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2w6OmdldENhbm9uaWNhbERlY2woKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBwcmV2aW91cyBkZWNsYXJhdGlvbiBvZiB0aGlzIHZhcmlhYmxlIHRlbXBsYXRlLCBvcgorICAvLy8gbnVsbHB0ciBpZiBubyBzdWNoIGRlY2xhcmF0aW9uIGV4aXN0cy4KKyAgVmFyVGVtcGxhdGVEZWNsICpnZXRQcmV2aW91c0RlY2woKSB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxWYXJUZW1wbGF0ZURlY2w+KAorICAgICAgICBzdGF0aWNfY2FzdDxSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2wgKj4odGhpcyktPmdldFByZXZpb3VzRGVjbCgpKTsKKyAgfQorICBjb25zdCBWYXJUZW1wbGF0ZURlY2wgKmdldFByZXZpb3VzRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPFZhclRlbXBsYXRlRGVjbD4oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2wgKj4oCisgICAgICAgICAgICAgIHRoaXMpLT5nZXRQcmV2aW91c0RlY2woKSk7CisgIH0KKworICBWYXJUZW1wbGF0ZURlY2wgKmdldE1vc3RSZWNlbnREZWNsKCkgeworICAgIHJldHVybiBjYXN0PFZhclRlbXBsYXRlRGVjbD4oCisgICAgICAgIHN0YXRpY19jYXN0PFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCAqPih0aGlzKS0+Z2V0TW9zdFJlY2VudERlY2woKSk7CisgIH0KKyAgY29uc3QgVmFyVGVtcGxhdGVEZWNsICpnZXRNb3N0UmVjZW50RGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxWYXJUZW1wbGF0ZURlY2wgKj4odGhpcyktPmdldE1vc3RSZWNlbnREZWNsKCk7CisgIH0KKworICBWYXJUZW1wbGF0ZURlY2wgKmdldEluc3RhbnRpYXRlZEZyb21NZW1iZXJUZW1wbGF0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPFZhclRlbXBsYXRlRGVjbD4oCisgICAgICAgIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbDo6Z2V0SW5zdGFudGlhdGVkRnJvbU1lbWJlclRlbXBsYXRlKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzIGlmIGl0CisgIC8vLyBleGlzdHMsIG90aGVyd2lzZSByZXR1cm4gdGhlIGluc2VydGlvbiBwb2ludC4KKyAgVmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsICoKKyAgZmluZFBhcnRpYWxTcGVjaWFsaXphdGlvbihBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBBcmdzLCB2b2lkIComSW5zZXJ0UG9zKTsKKworICAvLy8gXGJyaWVmIEluc2VydCB0aGUgc3BlY2lmaWVkIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24ga25vd2luZyB0aGF0IGl0IGlzIG5vdAorICAvLy8gYWxyZWFkeSBpbi4gSW5zZXJ0UG9zIG11c3QgYmUgb2J0YWluZWQgZnJvbSBmaW5kUGFydGlhbFNwZWNpYWxpemF0aW9uLgorICB2b2lkIEFkZFBhcnRpYWxTcGVjaWFsaXphdGlvbihWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkluc2VydFBvcyk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbnMgYXMgYW4gb3JkZXJlZCBsaXN0LgorICB2b2lkIGdldFBhcnRpYWxTcGVjaWFsaXphdGlvbnMoCisgICAgICBTbWFsbFZlY3RvckltcGw8VmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsICo+ICZQUyk7CisKKyAgLy8vIFxicmllZiBGaW5kIGEgdmFyaWFibGUgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiB3aGljaCB3YXMKKyAgLy8vIGluc3RhbnRpYXRlZAorICAvLy8gZnJvbSB0aGUgZ2l2ZW4gbWVtYmVyIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIEQgYSBtZW1iZXIgdmFyaWFibGUgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgdmFyaWFibGUgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiB3aGljaCB3YXMKKyAgLy8vIGluc3RhbnRpYXRlZAorICAvLy8gZnJvbSB0aGUgZ2l2ZW4gbWVtYmVyIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24sIG9yIG51bGxwdHIgaWYgbm8gc3VjaAorICAvLy8gcGFydGlhbCBzcGVjaWFsaXphdGlvbiBleGlzdHMuCisgIFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqZmluZFBhcnRpYWxTcGVjSW5zdGFudGlhdGVkRnJvbU1lbWJlcigKKyAgICAgIFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqRCk7CisKKyAgdXNpbmcgc3BlY19pdGVyYXRvciA9IFNwZWNJdGVyYXRvcjxWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbD47CisgIHVzaW5nIHNwZWNfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxzcGVjX2l0ZXJhdG9yPjsKKworICBzcGVjX3JhbmdlIHNwZWNpYWxpemF0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3BlY19yYW5nZShzcGVjX2JlZ2luKCksIHNwZWNfZW5kKCkpOworICB9CisKKyAgc3BlY19pdGVyYXRvciBzcGVjX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlU3BlY0l0ZXJhdG9yKGdldFNwZWNpYWxpemF0aW9ucygpLCBmYWxzZSk7CisgIH0KKworICBzcGVjX2l0ZXJhdG9yIHNwZWNfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlU3BlY0l0ZXJhdG9yKGdldFNwZWNpYWxpemF0aW9ucygpLCB0cnVlKTsKKyAgfQorCisgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0IHN1cHBvcnQKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBWYXJUZW1wbGF0ZTsgfQorfTsKKworaW5saW5lIE5hbWVkRGVjbCAqZ2V0QXNOYW1lZERlY2woVGVtcGxhdGVQYXJhbWV0ZXIgUCkgeworICBpZiAoYXV0byAqUEQgPSBQLmR5bl9jYXN0PFRlbXBsYXRlVHlwZVBhcm1EZWNsICo+KCkpCisgICAgcmV0dXJuIFBEOworICBpZiAoYXV0byAqUEQgPSBQLmR5bl9jYXN0PE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsICo+KCkpCisgICAgcmV0dXJuIFBEOworICByZXR1cm4gUC5nZXQ8VGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsICo+KCk7Cit9CisKK2lubGluZSBUZW1wbGF0ZURlY2wgKmdldEFzVHlwZVRlbXBsYXRlRGVjbChEZWNsICpEKSB7CisgIGF1dG8gKlREID0gZHluX2Nhc3Q8VGVtcGxhdGVEZWNsPihEKTsKKyAgcmV0dXJuIFREICYmIChpc2E8Q2xhc3NUZW1wbGF0ZURlY2w+KFREKSB8fAorICAgICAgICAgICAgICAgIGlzYTxDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbD4oVEQpIHx8CisgICAgICAgICAgICAgICAgaXNhPFR5cGVBbGlhc1RlbXBsYXRlRGVjbD4oVEQpIHx8CisgICAgICAgICAgICAgICAgaXNhPFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbD4oVEQpKQorICAgICAgICAgICAgID8gVEQKKyAgICAgICAgICAgICA6IG51bGxwdHI7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9ERUNMVEVNUExBVEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xWaXNpdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbFZpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmYyNzRiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xWaXNpdG9yLmgKQEAgLTAsMCArMSw4MiBAQAorLy89PT0tIERlY2xWaXNpdG9yLmggLSBWaXNpdG9yIGZvciBEZWNsIHN1YmNsYXNzZXMgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIERlY2xWaXNpdG9yIGludGVyZmFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0RFQ0xWSVNJVE9SX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfREVDTFZJU0lUT1JfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2wuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbEJhc2UuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbENYWC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsRnJpZW5kLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xPYmpDLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xPcGVuTVAuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbFRlbXBsYXRlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworbmFtZXNwYWNlIGRlY2x2aXNpdG9yIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBtYWtlX3B0ciB7IHVzaW5nIHR5cGUgPSBUICo7IH07Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IG1ha2VfY29uc3RfcHRyIHsgdXNpbmcgdHlwZSA9IGNvbnN0IFQgKjsgfTsKKworLy8vIFxicmllZiBBIHNpbXBsZSB2aXNpdG9yIGNsYXNzIHRoYXQgaGVscHMgY3JlYXRlIGRlY2xhcmF0aW9uIHZpc2l0b3JzLgordGVtcGxhdGU8dGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBQdHIsIHR5cGVuYW1lIEltcGxDbGFzcywgdHlwZW5hbWUgUmV0VHk9dm9pZD4KK2NsYXNzIEJhc2UgeworcHVibGljOgorI2RlZmluZSBQVFIoQ0xBU1MpIHR5cGVuYW1lIFB0cjxDTEFTUz46OnR5cGUKKyNkZWZpbmUgRElTUEFUQ0goTkFNRSwgQ0xBU1MpIFwKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEltcGxDbGFzcyo+KHRoaXMpLT5WaXNpdCMjTkFNRShzdGF0aWNfY2FzdDxQVFIoQ0xBU1MpPihEKSkKKworICBSZXRUeSBWaXNpdChQVFIoRGVjbCkgRCkgeworICAgIHN3aXRjaCAoRC0+Z2V0S2luZCgpKSB7CisjZGVmaW5lIERFQ0woREVSSVZFRCwgQkFTRSkgXAorICAgICAgY2FzZSBEZWNsOjpERVJJVkVEOiBESVNQQVRDSChERVJJVkVEIyNEZWNsLCBERVJJVkVEIyNEZWNsKTsKKyNkZWZpbmUgQUJTVFJBQ1RfREVDTChERUNMKQorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsTm9kZXMuaW5jIgorICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJEZWNsIHRoYXQgaXNuJ3QgcGFydCBvZiBEZWNsTm9kZXMuaW5jISIpOworICB9CisKKyAgLy8gSWYgdGhlIGltcGxlbWVudGF0aW9uIGNob29zZXMgbm90IHRvIGltcGxlbWVudCBhIGNlcnRhaW4gdmlzaXQKKyAgLy8gbWV0aG9kLCBmYWxsIGJhY2sgdG8gdGhlIHBhcmVudC4KKyNkZWZpbmUgREVDTChERVJJVkVELCBCQVNFKSBcCisgIFJldFR5IFZpc2l0IyNERVJJVkVEIyNEZWNsKFBUUihERVJJVkVEIyNEZWNsKSBEKSB7IERJU1BBVENIKEJBU0UsIEJBU0UpOyB9CisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xOb2Rlcy5pbmMiCisKKyAgUmV0VHkgVmlzaXREZWNsKFBUUihEZWNsKSBEKSB7IHJldHVybiBSZXRUeSgpOyB9CisKKyN1bmRlZiBQVFIKKyN1bmRlZiBESVNQQVRDSAorfTsKKworfSAvLyBuYW1lc3BhY2UgZGVjbHZpc2l0b3IKKworLy8vIFxicmllZiBBIHNpbXBsZSB2aXNpdG9yIGNsYXNzIHRoYXQgaGVscHMgY3JlYXRlIGRlY2xhcmF0aW9uIHZpc2l0b3JzLgorLy8vCisvLy8gVGhpcyBjbGFzcyBkb2VzIG5vdCBwcmVzZXJ2ZSBjb25zdG5lc3Mgb2YgRGVjbCBwb2ludGVycyAoc2VlIGFsc28KKy8vLyBDb25zdERlY2xWaXNpdG9yKS4KK3RlbXBsYXRlPHR5cGVuYW1lIEltcGxDbGFzcywgdHlwZW5hbWUgUmV0VHkgPSB2b2lkPgorY2xhc3MgRGVjbFZpc2l0b3IKKyA6IHB1YmxpYyBkZWNsdmlzaXRvcjo6QmFzZTxkZWNsdmlzaXRvcjo6bWFrZV9wdHIsIEltcGxDbGFzcywgUmV0VHk+IHt9OworCisvLy8gXGJyaWVmIEEgc2ltcGxlIHZpc2l0b3IgY2xhc3MgdGhhdCBoZWxwcyBjcmVhdGUgZGVjbGFyYXRpb24gdmlzaXRvcnMuCisvLy8KKy8vLyBUaGlzIGNsYXNzIHByZXNlcnZlcyBjb25zdG5lc3Mgb2YgRGVjbCBwb2ludGVycyAoc2VlIGFsc28gRGVjbFZpc2l0b3IpLgordGVtcGxhdGU8dHlwZW5hbWUgSW1wbENsYXNzLCB0eXBlbmFtZSBSZXRUeSA9IHZvaWQ+CitjbGFzcyBDb25zdERlY2xWaXNpdG9yCisgOiBwdWJsaWMgZGVjbHZpc2l0b3I6OkJhc2U8ZGVjbHZpc2l0b3I6Om1ha2VfY29uc3RfcHRyLCBJbXBsQ2xhc3MsIFJldFR5PiB7fTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUX0RFQ0xWSVNJVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsYXJhdGlvbk5hbWUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsYXJhdGlvbk5hbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjdiMDJjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xhcmF0aW9uTmFtZS5oCkBAIC0wLDAgKzEsNjMzIEBACisvLz09PS0gRGVjbGFyYXRpb25OYW1lLmggLSBSZXByZXNlbnRhdGlvbiBvZiBkZWNsYXJhdGlvbiBuYW1lcyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgRGVjbGFyYXRpb25OYW1lIGFuZCBEZWNsYXJhdGlvbk5hbWVUYWJsZSBjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfREVDTEFSQVRJT05OQU1FX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfREVDTEFSQVRJT05OQU1FX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9QYXJ0aWFsRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBU1RDb250ZXh0OwordGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBDYW5RdWFsOworY2xhc3MgQ1hYRGVkdWN0aW9uR3VpZGVOYW1lRXh0cmE7CitjbGFzcyBDWFhMaXRlcmFsT3BlcmF0b3JJZE5hbWU7CitjbGFzcyBDWFhPcGVyYXRvcklkTmFtZTsKK2NsYXNzIENYWFNwZWNpYWxOYW1lOworY2xhc3MgRGVjbGFyYXRpb25OYW1lRXh0cmE7CitjbGFzcyBJZGVudGlmaWVySW5mbzsKK2NsYXNzIE11bHRpS2V5d29yZFNlbGVjdG9yOworZW51bSBPdmVybG9hZGVkT3BlcmF0b3JLaW5kIDogaW50Oworc3RydWN0IFByaW50aW5nUG9saWN5OworY2xhc3MgUXVhbFR5cGU7CitjbGFzcyBUZW1wbGF0ZURlY2w7CitjbGFzcyBUeXBlOworY2xhc3MgVHlwZVNvdXJjZUluZm87CitjbGFzcyBVc2luZ0RpcmVjdGl2ZURlY2w7CisKK3VzaW5nIENhblF1YWxUeXBlID0gQ2FuUXVhbDxUeXBlPjsKKworLy8vIERlY2xhcmF0aW9uTmFtZSAtIFRoZSBuYW1lIG9mIGEgZGVjbGFyYXRpb24uIEluIHRoZSBjb21tb24gY2FzZSwKKy8vLyB0aGlzIGp1c3Qgc3RvcmVzIGFuIElkZW50aWZpZXJJbmZvIHBvaW50ZXIgdG8gYSBub3JtYWwKKy8vLyBuYW1lLiBIb3dldmVyLCBpdCBhbHNvIHByb3ZpZGVzIGVuY29kaW5ncyBmb3IgT2JqZWN0aXZlLUMKKy8vLyBzZWxlY3RvcnMgKG9wdGltaXppbmcgemVyby0gYW5kIG9uZS1hcmd1bWVudCBzZWxlY3RvcnMsIHdoaWNoIG1ha2UKKy8vLyB1cCA3OCUgcGVyY2VudCBvZiBhbGwgc2VsZWN0b3JzIGluIENvY29hLmgpIGFuZCBzcGVjaWFsIEMrKyBuYW1lcworLy8vIGZvciBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLCBhbmQgY29udmVyc2lvbiBmdW5jdGlvbnMuCitjbGFzcyBEZWNsYXJhdGlvbk5hbWUgeworcHVibGljOgorICAvLy8gTmFtZUtpbmQgLSBUaGUga2luZCBvZiBuYW1lIHRoaXMgb2JqZWN0IGNvbnRhaW5zLgorICBlbnVtIE5hbWVLaW5kIHsKKyAgICBJZGVudGlmaWVyLAorICAgIE9iakNaZXJvQXJnU2VsZWN0b3IsCisgICAgT2JqQ09uZUFyZ1NlbGVjdG9yLAorICAgIE9iakNNdWx0aUFyZ1NlbGVjdG9yLAorICAgIENYWENvbnN0cnVjdG9yTmFtZSwKKyAgICBDWFhEZXN0cnVjdG9yTmFtZSwKKyAgICBDWFhDb252ZXJzaW9uRnVuY3Rpb25OYW1lLAorICAgIENYWERlZHVjdGlvbkd1aWRlTmFtZSwKKyAgICBDWFhPcGVyYXRvck5hbWUsCisgICAgQ1hYTGl0ZXJhbE9wZXJhdG9yTmFtZSwKKyAgICBDWFhVc2luZ0RpcmVjdGl2ZQorICB9OworCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBOdW1OYW1lS2luZHMgPSBDWFhVc2luZ0RpcmVjdGl2ZSArIDE7CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBEZWNsYXJhdGlvbk5hbWVUYWJsZTsKKyAgZnJpZW5kIGNsYXNzIE5hbWVkRGVjbDsKKworICAvLy8gU3RvcmVkTmFtZUtpbmQgLSBUaGUga2luZCBvZiBuYW1lIHRoYXQgaXMgYWN0dWFsbHkgc3RvcmVkIGluIHRoZQorICAvLy8gdXBwZXIgYml0cyBvZiB0aGUgUHRyIGZpZWxkLiBUaGlzIGlzIG9ubHkgdXNlZCBpbnRlcm5hbGx5LgorICAvLy8KKyAgLy8vIE5vdGU6IFRoZSBlbnRyaWVzIGhlcmUgYXJlIHN5bmNocm9uaXplZCB3aXRoIHRoZSBlbnRyaWVzIGluIFNlbGVjdG9yLAorICAvLy8gZm9yIGVmZmljaWVudCB0cmFuc2xhdGlvbiBiZXR3ZWVuIHRoZSB0d28uCisgIGVudW0gU3RvcmVkTmFtZUtpbmQgeworICAgIFN0b3JlZElkZW50aWZpZXIgPSAwLAorICAgIFN0b3JlZE9iakNaZXJvQXJnU2VsZWN0b3IgPSAweDAxLAorICAgIFN0b3JlZE9iakNPbmVBcmdTZWxlY3RvciA9IDB4MDIsCisgICAgU3RvcmVkRGVjbGFyYXRpb25OYW1lRXh0cmEgPSAweDAzLAorICAgIFB0ck1hc2sgPSAweDAzCisgIH07CisKKyAgLy8vIFB0ciAtIFRoZSBsb3dlc3QgdHdvIGJpdHMgYXJlIHVzZWQgdG8gZXhwcmVzcyB3aGF0IGtpbmQgb2YgbmFtZQorICAvLy8gd2UncmUgYWN0dWFsbHkgc3RvcmluZywgdXNpbmcgdGhlIHZhbHVlcyBvZiBOYW1lS2luZC4gRGVwZW5kaW5nCisgIC8vLyBvbiB0aGUga2luZCBvZiBuYW1lIHRoaXMgaXMsIHRoZSB1cHBlciBiaXRzIG9mIFB0ciBtYXkgaGF2ZSBvbmUKKyAgLy8vIG9mIHNldmVyYWwgZGlmZmVyZW50IG1lYW5pbmdzOgorICAvLy8KKyAgLy8vICAgU3RvcmVkSWRlbnRpZmllciAtIFRoZSBuYW1lIGlzIGEgbm9ybWFsIGlkZW50aWZpZXIsIGFuZCBQdHIgaXMKKyAgLy8vICAgYSBub3JtYWwgSWRlbnRpZmllckluZm8gcG9pbnRlci4KKyAgLy8vCisgIC8vLyAgIFN0b3JlZE9iakNaZXJvQXJnU2VsZWN0b3IgLSBUaGUgbmFtZSBpcyBhbiBPYmplY3RpdmUtQworICAvLy8gICBzZWxlY3RvciB3aXRoIHplcm8gYXJndW1lbnRzLCBhbmQgUHRyIGlzIGFuIElkZW50aWZpZXJJbmZvCisgIC8vLyAgIHBvaW50ZXIgcG9pbnRpbmcgdG8gdGhlIHNlbGVjdG9yIG5hbWUuCisgIC8vLworICAvLy8gICBTdG9yZWRPYmpDT25lQXJnU2VsZWN0b3IgLSBUaGUgbmFtZSBpcyBhbiBPYmplY3RpdmUtQyBzZWxlY3RvcgorICAvLy8gICB3aXRoIG9uZSBhcmd1bWVudCwgYW5kIFB0ciBpcyBhbiBJZGVudGlmaWVySW5mbyBwb2ludGVyCisgIC8vLyAgIHBvaW50aW5nIHRvIHRoZSBzZWxlY3RvciBuYW1lLgorICAvLy8KKyAgLy8vICAgU3RvcmVkRGVjbGFyYXRpb25OYW1lRXh0cmEgLSBQdHIgaXMgYWN0dWFsbHkgYSBwb2ludGVyIHRvIGEKKyAgLy8vICAgRGVjbGFyYXRpb25OYW1lRXh0cmEgc3RydWN0dXJlLCB3aG9zZSBmaXJzdCB2YWx1ZSB3aWxsIHRlbGwgdXMKKyAgLy8vICAgd2hldGhlciB0aGlzIGlzIGFuIE9iamVjdGl2ZS1DIHNlbGVjdG9yLCBDKysgb3BlcmF0b3ItaWQgbmFtZSwKKyAgLy8vICAgb3Igc3BlY2lhbCBDKysgbmFtZS4KKyAgdWludHB0cl90IFB0ciA9IDA7CisKKyAgLy8gQ29uc3RydWN0IGEgZGVjbGFyYXRpb24gbmFtZSBmcm9tIHRoZSBuYW1lIG9mIGEgQysrIGNvbnN0cnVjdG9yLAorICAvLyBkZXN0cnVjdG9yLCBvciBjb252ZXJzaW9uIGZ1bmN0aW9uLgorICBEZWNsYXJhdGlvbk5hbWUoRGVjbGFyYXRpb25OYW1lRXh0cmEgKk5hbWUpCisgICAgICA6IFB0cihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oTmFtZSkpIHsKKyAgICBhc3NlcnQoKFB0ciAmIFB0ck1hc2spID09IDAgJiYgIkltcHJvcGVybHkgYWxpZ25lZCBEZWNsYXJhdGlvbk5hbWVFeHRyYSIpOworICAgIFB0ciB8PSBTdG9yZWREZWNsYXJhdGlvbk5hbWVFeHRyYTsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3QgYSBkZWNsYXJhdGlvbiBuYW1lIGZyb20gYSByYXcgcG9pbnRlci4KKyAgRGVjbGFyYXRpb25OYW1lKHVpbnRwdHJfdCBQdHIpIDogUHRyKFB0cikge30KKworICAvLy8gZ2V0U3RvcmVkTmFtZUtpbmQgLSBSZXR1cm4gdGhlIGtpbmQgb2Ygb2JqZWN0IHRoYXQgaXMgc3RvcmVkIGluCisgIC8vLyBQdHIuCisgIFN0b3JlZE5hbWVLaW5kIGdldFN0b3JlZE5hbWVLaW5kKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdG9yZWROYW1lS2luZD4oUHRyICYgUHRyTWFzayk7CisgIH0KKworICAvLy8gZ2V0RXh0cmEgLSBHZXQgdGhlICJleHRyYSIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgLy8vIG11bHRpLWFyZ3VtZW50IHNlbGVjdG9yIG9yIEMrKyBzcGVjaWFsIG5hbWUuCisgIERlY2xhcmF0aW9uTmFtZUV4dHJhICpnZXRFeHRyYSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0U3RvcmVkTmFtZUtpbmQoKSA9PSBTdG9yZWREZWNsYXJhdGlvbk5hbWVFeHRyYSAmJgorICAgICAgICAgICAiRGVjbGFyYXRpb24gbmFtZSBkb2VzIG5vdCBzdG9yZSBhbiBFeHRyYSBzdHJ1Y3R1cmUiKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxEZWNsYXJhdGlvbk5hbWVFeHRyYSAqPihQdHIgJiB+UHRyTWFzayk7CisgIH0KKworICAvLy8gZ2V0QXNDWFhTcGVjaWFsTmFtZSAtIElmIHRoZSBzdG9yZWQgcG9pbnRlciBpcyBhY3R1YWxseSBhCisgIC8vLyBDWFhTcGVjaWFsTmFtZSwgcmV0dXJucyBhIHBvaW50ZXIgdG8gaXQuIE90aGVyd2lzZSwgcmV0dXJucworICAvLy8gYSBOVUxMIHBvaW50ZXIuCisgIENYWFNwZWNpYWxOYW1lICpnZXRBc0NYWFNwZWNpYWxOYW1lKCkgY29uc3QgeworICAgIE5hbWVLaW5kIEtpbmQgPSBnZXROYW1lS2luZCgpOworICAgIGlmIChLaW5kID49IENYWENvbnN0cnVjdG9yTmFtZSAmJiBLaW5kIDw9IENYWENvbnZlcnNpb25GdW5jdGlvbk5hbWUpCisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDWFhTcGVjaWFsTmFtZSAqPihnZXRFeHRyYSgpKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBJZiB0aGUgc3RvcmVkIHBvaW50ZXIgaXMgYWN0dWFsbHkgYSBDWFhEZWR1Y3Rpb25HdWlkZU5hbWVFeHRyYSwgcmV0dXJucyBhCisgIC8vLyBwb2ludGVyIHRvIGl0LiBPdGhlcndpc2UsIHJldHVybnMgYSBOVUxMIHBvaW50ZXIuCisgIENYWERlZHVjdGlvbkd1aWRlTmFtZUV4dHJhICpnZXRBc0NYWERlZHVjdGlvbkd1aWRlTmFtZUV4dHJhKCkgY29uc3QgeworICAgIGlmIChnZXROYW1lS2luZCgpID09IENYWERlZHVjdGlvbkd1aWRlTmFtZSkKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PENYWERlZHVjdGlvbkd1aWRlTmFtZUV4dHJhICo+KGdldEV4dHJhKCkpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIGdldEFzQ1hYT3BlcmF0b3JJZE5hbWUKKyAgQ1hYT3BlcmF0b3JJZE5hbWUgKmdldEFzQ1hYT3BlcmF0b3JJZE5hbWUoKSBjb25zdCB7CisgICAgaWYgKGdldE5hbWVLaW5kKCkgPT0gQ1hYT3BlcmF0b3JOYW1lKQorICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q1hYT3BlcmF0b3JJZE5hbWUgKj4oZ2V0RXh0cmEoKSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBDWFhMaXRlcmFsT3BlcmF0b3JJZE5hbWUgKmdldEFzQ1hYTGl0ZXJhbE9wZXJhdG9ySWROYW1lKCkgY29uc3QgeworICAgIGlmIChnZXROYW1lS2luZCgpID09IENYWExpdGVyYWxPcGVyYXRvck5hbWUpCisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDWFhMaXRlcmFsT3BlcmF0b3JJZE5hbWUgKj4oZ2V0RXh0cmEoKSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gZ2V0RkVUb2tlbkluZm9Bc1ZvaWRTbG93IC0gUmV0cmlldmVzIHRoZSBmcm9udCBlbmQtc3BlY2lmaWVkIHBvaW50ZXIKKyAgLy8vIGZvciB0aGlzIG5hbWUgYXMgYSB2b2lkIHBvaW50ZXIgaWYgaXQncyBub3QgYW4gaWRlbnRpZmllci4KKyAgdm9pZCAqZ2V0RkVUb2tlbkluZm9Bc1ZvaWRTbG93KCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIERlY2xhcmF0aW9uTmFtZSAtIFVzZWQgdG8gY3JlYXRlIGFuIGVtcHR5IHNlbGVjdG9yLgorICBEZWNsYXJhdGlvbk5hbWUoKSA9IGRlZmF1bHQ7CisKKyAgLy8gQ29uc3RydWN0IGEgZGVjbGFyYXRpb24gbmFtZSBmcm9tIGFuIElkZW50aWZpZXJJbmZvICouCisgIERlY2xhcmF0aW9uTmFtZShjb25zdCBJZGVudGlmaWVySW5mbyAqSUkpCisgICAgICA6IFB0cihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oSUkpKSB7CisgICAgYXNzZXJ0KChQdHIgJiBQdHJNYXNrKSA9PSAwICYmICJJbXByb3Blcmx5IGFsaWduZWQgSWRlbnRpZmllckluZm8iKTsKKyAgfQorCisgIC8vIENvbnN0cnVjdCBhIGRlY2xhcmF0aW9uIG5hbWUgZnJvbSBhbiBPYmplY3RpdmUtQyBzZWxlY3Rvci4KKyAgRGVjbGFyYXRpb25OYW1lKFNlbGVjdG9yIFNlbCkgOiBQdHIoU2VsLkluZm9QdHIpIHt9CisKKyAgLy8vIGdldFVzaW5nRGlyZWN0aXZlTmFtZSAtIFJldHVybiBuYW1lIGZvciBhbGwgdXNpbmctZGlyZWN0aXZlcy4KKyAgc3RhdGljIERlY2xhcmF0aW9uTmFtZSBnZXRVc2luZ0RpcmVjdGl2ZU5hbWUoKTsKKworICAvLyBvcGVyYXRvciBib29sKCkgLSBFdmFsdWF0ZXMgdHJ1ZSB3aGVuIHRoaXMgZGVjbGFyYXRpb24gbmFtZSBpcworICAvLyBub24tZW1wdHkuCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgcmV0dXJuICgoUHRyICYgUHRyTWFzaykgIT0gMCkgfHwKKyAgICAgICAgICAgKHJlaW50ZXJwcmV0X2Nhc3Q8SWRlbnRpZmllckluZm8gKj4oUHRyICYgflB0ck1hc2spKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRXZhbHVhdGVzIHRydWUgd2hlbiB0aGlzIGRlY2xhcmF0aW9uIG5hbWUgaXMgZW1wdHkuCisgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gISp0aGlzOworICB9CisKKyAgLy8vIFByZWRpY2F0ZSBmdW5jdGlvbnMgZm9yIHF1ZXJ5aW5nIHdoYXQgdHlwZSBvZiBuYW1lIHRoaXMgaXMuCisgIGJvb2wgaXNJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RvcmVkTmFtZUtpbmQoKSA9PSBTdG9yZWRJZGVudGlmaWVyOyB9CisgIGJvb2wgaXNPYmpDWmVyb0FyZ1NlbGVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdG9yZWROYW1lS2luZCgpID09IFN0b3JlZE9iakNaZXJvQXJnU2VsZWN0b3I7CisgIH0KKyAgYm9vbCBpc09iakNPbmVBcmdTZWxlY3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3RvcmVkTmFtZUtpbmQoKSA9PSBTdG9yZWRPYmpDT25lQXJnU2VsZWN0b3I7CisgIH0KKworICAvLy8gZ2V0TmFtZUtpbmQgLSBEZXRlcm1pbmUgd2hhdCBraW5kIG9mIG5hbWUgdGhpcyBpcy4KKyAgTmFtZUtpbmQgZ2V0TmFtZUtpbmQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB0aGUgbmFtZSBpdHNlbGYgaXMgZGVwZW5kZW50LCBlLmcuLCBiZWNhdXNlIGl0IAorICAvLy8gaW52b2x2ZXMgYSBDKysgdHlwZSB0aGF0IGlzIGl0c2VsZiBkZXBlbmRlbnQuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgY2FwdHVyZSBhbGwgb2YgdGhlIG5vdGlvbnMgb2YgImRlcGVuZGVudCBuYW1lIiwKKyAgLy8vIGJlY2F1c2UgYW4gaWRlbnRpZmllciBjYW4gYmUgYSBkZXBlbmRlbnQgbmFtZSBpZiBpdCBpcyB1c2VkIGFzIHRoZSAKKyAgLy8vIGNhbGxlZSBpbiBhIGNhbGwgZXhwcmVzc2lvbiB3aXRoIGRlcGVuZGVudCBhcmd1bWVudHMuCisgIGJvb2wgaXNEZXBlbmRlbnROYW1lKCkgY29uc3Q7CisgIAorICAvLy8gZ2V0TmFtZUFzU3RyaW5nIC0gUmV0cmlldmUgdGhlIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmb3IgdGhpcyBuYW1lLgorICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0OworCisgIC8vLyBnZXRBc0lkZW50aWZpZXJJbmZvIC0gUmV0cmlldmUgdGhlIElkZW50aWZpZXJJbmZvICogc3RvcmVkIGluCisgIC8vLyB0aGlzIGRlY2xhcmF0aW9uIG5hbWUsIG9yIE5VTEwgaWYgdGhpcyBkZWNsYXJhdGlvbiBuYW1lIGlzbid0IGEKKyAgLy8vIHNpbXBsZSBpZGVudGlmaWVyLgorICBJZGVudGlmaWVySW5mbyAqZ2V0QXNJZGVudGlmaWVySW5mbygpIGNvbnN0IHsKKyAgICBpZiAoaXNJZGVudGlmaWVyKCkpCisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxJZGVudGlmaWVySW5mbyAqPihQdHIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIGdldEFzT3BhcXVlSW50ZWdlciAtIEdldCB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBkZWNsYXJhdGlvbgorICAvLy8gbmFtZSBhcyBhbiBvcGFxdWUgaW50ZWdlci4KKyAgdWludHB0cl90IGdldEFzT3BhcXVlSW50ZWdlcigpIGNvbnN0IHsgcmV0dXJuIFB0cjsgfQorCisgIC8vLyBnZXRBc09wYXF1ZVB0ciAtIEdldCB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBkZWNsYXJhdGlvbiBuYW1lIGFzCisgIC8vLyBhbiBvcGFxdWUgcG9pbnRlci4KKyAgdm9pZCAqZ2V0QXNPcGFxdWVQdHIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPihQdHIpOyB9CisKKyAgc3RhdGljIERlY2xhcmF0aW9uTmFtZSBnZXRGcm9tT3BhcXVlUHRyKHZvaWQgKlApIHsKKyAgICBEZWNsYXJhdGlvbk5hbWUgTjsKKyAgICBOLlB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PiAoUCk7CisgICAgcmV0dXJuIE47CisgIH0KKworICBzdGF0aWMgRGVjbGFyYXRpb25OYW1lIGdldEZyb21PcGFxdWVJbnRlZ2VyKHVpbnRwdHJfdCBQKSB7CisgICAgRGVjbGFyYXRpb25OYW1lIE47CisgICAgTi5QdHIgPSBQOworICAgIHJldHVybiBOOworICB9CisKKyAgLy8vIGdldENYWE5hbWVUeXBlIC0gSWYgdGhpcyBuYW1lIGlzIG9uZSBvZiB0aGUgQysrIG5hbWVzIChvZiBhCisgIC8vLyBjb25zdHJ1Y3RvciwgZGVzdHJ1Y3Rvciwgb3IgY29udmVyc2lvbiBmdW5jdGlvbiksIHJldHVybiB0aGUKKyAgLy8vIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgbmFtZS4KKyAgUXVhbFR5cGUgZ2V0Q1hYTmFtZVR5cGUoKSBjb25zdDsKKworICAvLy8gSWYgdGhpcyBuYW1lIGlzIHRoZSBuYW1lIG9mIGEgQysrIGRlZHVjdGlvbiBndWlkZSwgcmV0dXJuIHRoZQorICAvLy8gdGVtcGxhdGUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgbmFtZS4KKyAgVGVtcGxhdGVEZWNsICpnZXRDWFhEZWR1Y3Rpb25HdWlkZVRlbXBsYXRlKCkgY29uc3Q7CisKKyAgLy8vIGdldENYWE92ZXJsb2FkZWRPcGVyYXRvciAtIElmIHRoaXMgbmFtZSBpcyB0aGUgbmFtZSBvZiBhbgorICAvLy8gb3ZlcmxvYWRhYmxlIG9wZXJhdG9yIGluIEMrKyAoZS5nLiwgQGMgb3BlcmF0b3IrKSwgcmV0cmlldmUgdGhlCisgIC8vLyBraW5kIG9mIG92ZXJsb2FkZWQgb3BlcmF0b3IuCisgIE92ZXJsb2FkZWRPcGVyYXRvcktpbmQgZ2V0Q1hYT3ZlcmxvYWRlZE9wZXJhdG9yKCkgY29uc3Q7CisKKyAgLy8vIGdldENYWExpdGVyYWxJZGVudGlmaWVyIC0gSWYgdGhpcyBuYW1lIGlzIHRoZSBuYW1lIG9mIGEgbGl0ZXJhbAorICAvLy8gb3BlcmF0b3IsIHJldHJpZXZlIHRoZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgSWRlbnRpZmllckluZm8gKmdldENYWExpdGVyYWxJZGVudGlmaWVyKCkgY29uc3Q7CisKKyAgLy8vIGdldE9iakNTZWxlY3RvciAtIEdldCB0aGUgT2JqZWN0aXZlLUMgc2VsZWN0b3Igc3RvcmVkIGluIHRoaXMKKyAgLy8vIGRlY2xhcmF0aW9uIG5hbWUuCisgIFNlbGVjdG9yIGdldE9iakNTZWxlY3RvcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoKGdldE5hbWVLaW5kKCkgPT0gT2JqQ1plcm9BcmdTZWxlY3RvciB8fAorICAgICAgICAgICAgZ2V0TmFtZUtpbmQoKSA9PSBPYmpDT25lQXJnU2VsZWN0b3IgfHwKKyAgICAgICAgICAgIGdldE5hbWVLaW5kKCkgPT0gT2JqQ011bHRpQXJnU2VsZWN0b3IgfHwKKyAgICAgICAgICAgIFB0ciA9PSAwKSAmJiAiTm90IGEgc2VsZWN0b3IhIik7CisgICAgcmV0dXJuIFNlbGVjdG9yKFB0cik7CisgIH0KKworICAvLy8gZ2V0RkVUb2tlbkluZm8vc2V0RkVUb2tlbkluZm8gLSBUaGUgbGFuZ3VhZ2UgZnJvbnQtZW5kIGlzCisgIC8vLyBhbGxvd2VkIHRvIGFzc29jaWF0ZSBhcmJpdHJhcnkgbWV0YWRhdGEgd2l0aCBzb21lIGtpbmRzIG9mCisgIC8vLyBkZWNsYXJhdGlvbiBuYW1lcywgaW5jbHVkaW5nIG5vcm1hbCBpZGVudGlmaWVycyBhbmQgQysrCisgIC8vLyBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLCBhbmQgY29udmVyc2lvbiBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIFQgKmdldEZFVG9rZW5JbmZvKCkgY29uc3QgeworICAgIGlmIChjb25zdCBJZGVudGlmaWVySW5mbyAqSW5mbyA9IGdldEFzSWRlbnRpZmllckluZm8oKSkKKyAgICAgIHJldHVybiBJbmZvLT5nZXRGRVRva2VuSW5mbzxUPigpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUKj4oZ2V0RkVUb2tlbkluZm9Bc1ZvaWRTbG93KCkpOworICB9CisKKyAgdm9pZCBzZXRGRVRva2VuSW5mbyh2b2lkICpUKTsKKworICAvLy8gb3BlcmF0b3I9PSAtIERldGVybWluZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbmFtZXMgYXJlIGlkZW50aWNhbC4uCisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oRGVjbGFyYXRpb25OYW1lIExIUywgRGVjbGFyYXRpb25OYW1lIFJIUykgeworICAgIHJldHVybiBMSFMuUHRyID09IFJIUy5QdHI7CisgIH0KKworICAvLy8gb3BlcmF0b3IhPSAtIERldGVybWluZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbmFtZXMgYXJlIGRpZmZlcmVudC4KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShEZWNsYXJhdGlvbk5hbWUgTEhTLCBEZWNsYXJhdGlvbk5hbWUgUkhTKSB7CisgICAgcmV0dXJuIExIUy5QdHIgIT0gUkhTLlB0cjsKKyAgfQorCisgIHN0YXRpYyBEZWNsYXJhdGlvbk5hbWUgZ2V0RW1wdHlNYXJrZXIoKSB7CisgICAgcmV0dXJuIERlY2xhcmF0aW9uTmFtZSh1aW50cHRyX3QoLTEpKTsKKyAgfQorCisgIHN0YXRpYyBEZWNsYXJhdGlvbk5hbWUgZ2V0VG9tYnN0b25lTWFya2VyKCkgeworICAgIHJldHVybiBEZWNsYXJhdGlvbk5hbWUodWludHB0cl90KC0yKSk7CisgIH0KKworICBzdGF0aWMgaW50IGNvbXBhcmUoRGVjbGFyYXRpb25OYW1lIExIUywgRGVjbGFyYXRpb25OYW1lIFJIUyk7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpOworCisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBEZWNsYXJhdGlvbk5hbWUgTik7CisKKy8vLyBPcmRlcmluZyBvbiB0d28gZGVjbGFyYXRpb24gbmFtZXMuIElmIGJvdGggbmFtZXMgYXJlIGlkZW50aWZpZXJzLAorLy8vIHRoaXMgcHJvdmlkZXMgYSBsZXhpY29ncmFwaGljYWwgb3JkZXJpbmcuCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoRGVjbGFyYXRpb25OYW1lIExIUywgRGVjbGFyYXRpb25OYW1lIFJIUykgeworICByZXR1cm4gRGVjbGFyYXRpb25OYW1lOjpjb21wYXJlKExIUywgUkhTKSA8IDA7Cit9CisKKy8vLyBPcmRlcmluZyBvbiB0d28gZGVjbGFyYXRpb24gbmFtZXMuIElmIGJvdGggbmFtZXMgYXJlIGlkZW50aWZpZXJzLAorLy8vIHRoaXMgcHJvdmlkZXMgYSBsZXhpY29ncmFwaGljYWwgb3JkZXJpbmcuCitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oRGVjbGFyYXRpb25OYW1lIExIUywgRGVjbGFyYXRpb25OYW1lIFJIUykgeworICByZXR1cm4gRGVjbGFyYXRpb25OYW1lOjpjb21wYXJlKExIUywgUkhTKSA+IDA7Cit9CisKKy8vLyBPcmRlcmluZyBvbiB0d28gZGVjbGFyYXRpb24gbmFtZXMuIElmIGJvdGggbmFtZXMgYXJlIGlkZW50aWZpZXJzLAorLy8vIHRoaXMgcHJvdmlkZXMgYSBsZXhpY29ncmFwaGljYWwgb3JkZXJpbmcuCitpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KERlY2xhcmF0aW9uTmFtZSBMSFMsIERlY2xhcmF0aW9uTmFtZSBSSFMpIHsKKyAgcmV0dXJuIERlY2xhcmF0aW9uTmFtZTo6Y29tcGFyZShMSFMsIFJIUykgPD0gMDsKK30KKworLy8vIE9yZGVyaW5nIG9uIHR3byBkZWNsYXJhdGlvbiBuYW1lcy4gSWYgYm90aCBuYW1lcyBhcmUgaWRlbnRpZmllcnMsCisvLy8gdGhpcyBwcm92aWRlcyBhIGxleGljb2dyYXBoaWNhbCBvcmRlcmluZy4KK2lubGluZSBib29sIG9wZXJhdG9yPj0oRGVjbGFyYXRpb25OYW1lIExIUywgRGVjbGFyYXRpb25OYW1lIFJIUykgeworICByZXR1cm4gRGVjbGFyYXRpb25OYW1lOjpjb21wYXJlKExIUywgUkhTKSA+PSAwOworfQorCisvLy8gRGVjbGFyYXRpb25OYW1lVGFibGUgLSBVc2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBEZWNsYXJhdGlvbk5hbWUKKy8vLyBpbnN0YW5jZXMgZm9yIHRoZSB2YXJpb3VzIGtpbmRzIG9mIGRlY2xhcmF0aW9uIG5hbWVzLCBlLmcuLCBub3JtYWwKKy8vLyBpZGVudGlmaWVycywgQysrIGNvbnN0cnVjdG9yIG5hbWVzLCBldGMuIFRoaXMgY2xhc3MgY29udGFpbnMKKy8vLyB1bmlxdWVkIHZlcnNpb25zIG9mIGVhY2ggb2YgdGhlIEMrKyBzcGVjaWFsIG5hbWVzLCB3aGljaCBjYW4gYmUKKy8vLyByZXRyaWV2ZWQgdXNpbmcgaXRzIG1lbWJlciBmdW5jdGlvbnMgKGUuZy4sCisvLy8gZ2V0Q1hYQ29uc3RydWN0b3JOYW1lKS4KK2NsYXNzIERlY2xhcmF0aW9uTmFtZVRhYmxlIHsKKyAgY29uc3QgQVNUQ29udGV4dCAmQ3R4OworCisgIC8vIEFjdHVhbGx5IGEgRm9sZGluZ1NldDxDWFhTcGVjaWFsTmFtZT4gKgorICB2b2lkICpDWFhTcGVjaWFsTmFtZXNJbXBsOworCisgIC8vIE9wZXJhdG9yIG5hbWVzCisgIENYWE9wZXJhdG9ySWROYW1lICpDWFhPcGVyYXRvck5hbWVzOworCisgIC8vIEFjdHVhbGx5IGEgQ1hYT3BlcmF0b3JJZE5hbWUqCisgIHZvaWQgKkNYWExpdGVyYWxPcGVyYXRvck5hbWVzOworCisgIC8vIEZvbGRpbmdTZXQ8Q1hYRGVkdWN0aW9uR3VpZGVOYW1lRXh0cmE+ICoKKyAgdm9pZCAqQ1hYRGVkdWN0aW9uR3VpZGVOYW1lczsKKworcHVibGljOgorICBEZWNsYXJhdGlvbk5hbWVUYWJsZShjb25zdCBBU1RDb250ZXh0ICZDKTsKKyAgRGVjbGFyYXRpb25OYW1lVGFibGUoY29uc3QgRGVjbGFyYXRpb25OYW1lVGFibGUgJikgPSBkZWxldGU7CisgIERlY2xhcmF0aW9uTmFtZVRhYmxlICZvcGVyYXRvcj0oY29uc3QgRGVjbGFyYXRpb25OYW1lVGFibGUgJikgPSBkZWxldGU7CisKKyAgfkRlY2xhcmF0aW9uTmFtZVRhYmxlKCk7CisKKyAgLy8vIGdldElkZW50aWZpZXIgLSBDcmVhdGUgYSBkZWNsYXJhdGlvbiBuYW1lIHRoYXQgaXMgYSBzaW1wbGUKKyAgLy8vIGlkZW50aWZpZXIuCisgIERlY2xhcmF0aW9uTmFtZSBnZXRJZGVudGlmaWVyKGNvbnN0IElkZW50aWZpZXJJbmZvICpJRCkgeworICAgIHJldHVybiBEZWNsYXJhdGlvbk5hbWUoSUQpOworICB9CisKKyAgLy8vIGdldENYWENvbnN0cnVjdG9yTmFtZSAtIFJldHVybnMgdGhlIG5hbWUgb2YgYSBDKysgY29uc3RydWN0b3IKKyAgLy8vIGZvciB0aGUgZ2l2ZW4gVHlwZS4KKyAgRGVjbGFyYXRpb25OYW1lIGdldENYWENvbnN0cnVjdG9yTmFtZShDYW5RdWFsVHlwZSBUeSk7CisKKyAgLy8vIGdldENYWERlc3RydWN0b3JOYW1lIC0gUmV0dXJucyB0aGUgbmFtZSBvZiBhIEMrKyBkZXN0cnVjdG9yCisgIC8vLyBmb3IgdGhlIGdpdmVuIFR5cGUuCisgIERlY2xhcmF0aW9uTmFtZSBnZXRDWFhEZXN0cnVjdG9yTmFtZShDYW5RdWFsVHlwZSBUeSk7CisKKyAgLy8vIFJldHVybnMgdGhlIG5hbWUgb2YgYSBDKysgZGVkdWN0aW9uIGd1aWRlIGZvciB0aGUgZ2l2ZW4gdGVtcGxhdGUuCisgIERlY2xhcmF0aW9uTmFtZSBnZXRDWFhEZWR1Y3Rpb25HdWlkZU5hbWUoVGVtcGxhdGVEZWNsICpURCk7CisKKyAgLy8vIGdldENYWENvbnZlcnNpb25GdW5jdGlvbk5hbWUgLSBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgQysrCisgIC8vLyBjb252ZXJzaW9uIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gVHlwZS4KKyAgRGVjbGFyYXRpb25OYW1lIGdldENYWENvbnZlcnNpb25GdW5jdGlvbk5hbWUoQ2FuUXVhbFR5cGUgVHkpOworCisgIC8vLyBnZXRDWFhTcGVjaWFsTmFtZSAtIFJldHVybnMgYSBkZWNsYXJhdGlvbiBuYW1lIGZvciBzcGVjaWFsIGtpbmQKKyAgLy8vIG9mIEMrKyBuYW1lLCBlLmcuLCBmb3IgYSBjb25zdHJ1Y3RvciwgZGVzdHJ1Y3Rvciwgb3IgY29udmVyc2lvbgorICAvLy8gZnVuY3Rpb24uCisgIERlY2xhcmF0aW9uTmFtZSBnZXRDWFhTcGVjaWFsTmFtZShEZWNsYXJhdGlvbk5hbWU6Ok5hbWVLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5RdWFsVHlwZSBUeSk7CisKKyAgLy8vIGdldENYWE9wZXJhdG9yTmFtZSAtIEdldCB0aGUgbmFtZSBvZiB0aGUgb3ZlcmxvYWRhYmxlIEMrKworICAvLy8gb3BlcmF0b3IgY29ycmVzcG9uZGluZyB0byBPcC4KKyAgRGVjbGFyYXRpb25OYW1lIGdldENYWE9wZXJhdG9yTmFtZShPdmVybG9hZGVkT3BlcmF0b3JLaW5kIE9wKTsKKworICAvLy8gZ2V0Q1hYTGl0ZXJhbE9wZXJhdG9yTmFtZSAtIEdldCB0aGUgbmFtZSBvZiB0aGUgbGl0ZXJhbCBvcGVyYXRvciBmdW5jdGlvbgorICAvLy8gd2l0aCBJSSBhcyB0aGUgaWRlbnRpZmllci4KKyAgRGVjbGFyYXRpb25OYW1lIGdldENYWExpdGVyYWxPcGVyYXRvck5hbWUoSWRlbnRpZmllckluZm8gKklJKTsKK307CisKKy8vLyBEZWNsYXJhdGlvbk5hbWVMb2MgLSBBZGRpdGlvbmFsIHNvdXJjZS90eXBlIGxvY2F0aW9uIGluZm8KKy8vLyBmb3IgYSBkZWNsYXJhdGlvbiBuYW1lLiBOZWVkcyBhIERlY2xhcmF0aW9uTmFtZSBpbiBvcmRlcgorLy8vIHRvIGJlIGludGVycHJldGVkIGNvcnJlY3RseS4KK3N0cnVjdCBEZWNsYXJhdGlvbk5hbWVMb2MgeworICAvLyBUaGUgc291cmNlIGxvY2F0aW9uIGZvciBpZGVudGlmaWVyIHN0b3JlZCBlbHNld2hlcmUuCisgIC8vIHN0cnVjdCB7fSBJZGVudGlmaWVyOworCisgIC8vIFR5cGUgaW5mbyBmb3IgY29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgY29udmVyc2lvbiBmdW5jdGlvbnMuCisgIC8vIExvY2F0aW9ucyAoaWYgYW55KSBmb3IgdGhlIHRpbGRlIChkZXN0cnVjdG9yKSBvciBvcGVyYXRvciBrZXl3b3JkCisgIC8vIChjb252ZXJzaW9uKSBhcmUgc3RvcmVkIGVsc2V3aGVyZS4KKyAgc3RydWN0IE5UIHsKKyAgICBUeXBlU291cmNlSW5mbyAqVEluZm87CisgIH07CisKKyAgLy8gVGhlIGxvY2F0aW9uIChpZiBhbnkpIG9mIHRoZSBvcGVyYXRvciBrZXl3b3JkIGlzIHN0b3JlZCBlbHNld2hlcmUuCisgIHN0cnVjdCBDWFhPcE5hbWUgeworICAgIHVuc2lnbmVkIEJlZ2luT3BOYW1lTG9jOworICAgIHVuc2lnbmVkIEVuZE9wTmFtZUxvYzsKKyAgfTsKKworICAvLyBUaGUgbG9jYXRpb24gKGlmIGFueSkgb2YgdGhlIG9wZXJhdG9yIGtleXdvcmQgaXMgc3RvcmVkIGVsc2V3aGVyZS4KKyAgc3RydWN0IENYWExpdE9wTmFtZSB7CisgICAgdW5zaWduZWQgT3BOYW1lTG9jOworICB9OworCisgIC8vIHN0cnVjdCB7fSBDWFhVc2luZ0RpcmVjdGl2ZTsKKyAgLy8gc3RydWN0IHt9IE9iakNaZXJvQXJnU2VsZWN0b3I7CisgIC8vIHN0cnVjdCB7fSBPYmpDT25lQXJnU2VsZWN0b3I7CisgIC8vIHN0cnVjdCB7fSBPYmpDTXVsdGlBcmdTZWxlY3RvcjsKKyAgdW5pb24geworICAgIHN0cnVjdCBOVCBOYW1lZFR5cGU7CisgICAgc3RydWN0IENYWE9wTmFtZSBDWFhPcGVyYXRvck5hbWU7CisgICAgc3RydWN0IENYWExpdE9wTmFtZSBDWFhMaXRlcmFsT3BlcmF0b3JOYW1lOworICB9OworCisgIERlY2xhcmF0aW9uTmFtZUxvYyhEZWNsYXJhdGlvbk5hbWUgTmFtZSk7CisKKyAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIGdvIGF3YXkgb25jZSBhbGwgRE5Mb2NzIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC4KKyAgRGVjbGFyYXRpb25OYW1lTG9jKCkgeyBtZW1zZXQoKHZvaWQqKSB0aGlzLCAwLCBzaXplb2YoKnRoaXMpKTsgfQorfTsKKworLy8vIERlY2xhcmF0aW9uTmFtZUluZm8gLSBBIGNvbGxlY3RvciBkYXRhIHR5cGUgZm9yIGJ1bmRsaW5nIHRvZ2V0aGVyCisvLy8gYSBEZWNsYXJhdGlvbk5hbWUgYW5kIHRoZSBjb3JyZXNwbmRpbmcgc291cmNlL3R5cGUgbG9jYXRpb24gaW5mby4KK3N0cnVjdCBEZWNsYXJhdGlvbk5hbWVJbmZvIHsKK3ByaXZhdGU6CisgIC8vLyBOYW1lIC0gVGhlIGRlY2xhcmF0aW9uIG5hbWUsIGFsc28gZW5jb2RpbmcgbmFtZSBraW5kLgorICBEZWNsYXJhdGlvbk5hbWUgTmFtZTsKKworICAvLy8gTG9jIC0gVGhlIG1haW4gc291cmNlIGxvY2F0aW9uIGZvciB0aGUgZGVjbGFyYXRpb24gbmFtZS4KKyAgU291cmNlTG9jYXRpb24gTmFtZUxvYzsKKworICAvLy8gSW5mbyAtIEZ1cnRoZXIgc291cmNlL3R5cGUgbG9jYXRpb24gaW5mbyBmb3Igc3BlY2lhbCBraW5kcyBvZiBuYW1lcy4KKyAgRGVjbGFyYXRpb25OYW1lTG9jIExvY0luZm87CisKK3B1YmxpYzoKKyAgLy8gRklYTUU6IHJlbW92ZSBpdC4KKyAgRGVjbGFyYXRpb25OYW1lSW5mbygpID0gZGVmYXVsdDsKKworICBEZWNsYXJhdGlvbk5hbWVJbmZvKERlY2xhcmF0aW9uTmFtZSBOYW1lLCBTb3VyY2VMb2NhdGlvbiBOYW1lTG9jKQorICAgICAgOiBOYW1lKE5hbWUpLCBOYW1lTG9jKE5hbWVMb2MpLCBMb2NJbmZvKE5hbWUpIHt9CisKKyAgRGVjbGFyYXRpb25OYW1lSW5mbyhEZWNsYXJhdGlvbk5hbWUgTmFtZSwgU291cmNlTG9jYXRpb24gTmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbk5hbWVMb2MgTG9jSW5mbykKKyAgICAgIDogTmFtZShOYW1lKSwgTmFtZUxvYyhOYW1lTG9jKSwgTG9jSW5mbyhMb2NJbmZvKSB7fQorCisgIC8vLyBnZXROYW1lIC0gUmV0dXJucyB0aGUgZW1iZWRkZWQgZGVjbGFyYXRpb24gbmFtZS4KKyAgRGVjbGFyYXRpb25OYW1lIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgLy8vIHNldE5hbWUgLSBTZXRzIHRoZSBlbWJlZGRlZCBkZWNsYXJhdGlvbiBuYW1lLgorICB2b2lkIHNldE5hbWUoRGVjbGFyYXRpb25OYW1lIE4pIHsgTmFtZSA9IE47IH0KKworICAvLy8gZ2V0TG9jIC0gUmV0dXJucyB0aGUgbWFpbiBsb2NhdGlvbiBvZiB0aGUgZGVjbGFyYXRpb24gbmFtZS4KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jKCkgY29uc3QgeyByZXR1cm4gTmFtZUxvYzsgfQorCisgIC8vLyBzZXRMb2MgLSBTZXRzIHRoZSBtYWluIGxvY2F0aW9uIG9mIHRoZSBkZWNsYXJhdGlvbiBuYW1lLgorICB2b2lkIHNldExvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IE5hbWVMb2MgPSBMOyB9CisKKyAgY29uc3QgRGVjbGFyYXRpb25OYW1lTG9jICZnZXRJbmZvKCkgY29uc3QgeyByZXR1cm4gTG9jSW5mbzsgfQorICBEZWNsYXJhdGlvbk5hbWVMb2MgJmdldEluZm8oKSB7IHJldHVybiBMb2NJbmZvOyB9CisgIHZvaWQgc2V0SW5mbyhjb25zdCBEZWNsYXJhdGlvbk5hbWVMb2MgJkluZm8pIHsgTG9jSW5mbyA9IEluZm87IH0KKworICAvLy8gZ2V0TmFtZWRUeXBlSW5mbyAtIFJldHVybnMgdGhlIHNvdXJjZSB0eXBlIGluZm8gYXNzb2NpYXRlZCB0bworICAvLy8gdGhlIG5hbWUuIEFzc3VtZXMgaXQgaXMgYSBjb25zdHJ1Y3RvciwgZGVzdHJ1Y3RvciBvciBjb252ZXJzaW9uLgorICBUeXBlU291cmNlSW5mbyAqZ2V0TmFtZWRUeXBlSW5mbygpIGNvbnN0IHsKKyAgICBhc3NlcnQoTmFtZS5nZXROYW1lS2luZCgpID09IERlY2xhcmF0aW9uTmFtZTo6Q1hYQ29uc3RydWN0b3JOYW1lIHx8CisgICAgICAgICAgIE5hbWUuZ2V0TmFtZUtpbmQoKSA9PSBEZWNsYXJhdGlvbk5hbWU6OkNYWERlc3RydWN0b3JOYW1lIHx8CisgICAgICAgICAgIE5hbWUuZ2V0TmFtZUtpbmQoKSA9PSBEZWNsYXJhdGlvbk5hbWU6OkNYWENvbnZlcnNpb25GdW5jdGlvbk5hbWUpOworICAgIHJldHVybiBMb2NJbmZvLk5hbWVkVHlwZS5USW5mbzsKKyAgfQorCisgIC8vLyBzZXROYW1lZFR5cGVJbmZvIC0gU2V0cyB0aGUgc291cmNlIHR5cGUgaW5mbyBhc3NvY2lhdGVkIHRvCisgIC8vLyB0aGUgbmFtZS4gQXNzdW1lcyBpdCBpcyBhIGNvbnN0cnVjdG9yLCBkZXN0cnVjdG9yIG9yIGNvbnZlcnNpb24uCisgIHZvaWQgc2V0TmFtZWRUeXBlSW5mbyhUeXBlU291cmNlSW5mbyAqVEluZm8pIHsKKyAgICBhc3NlcnQoTmFtZS5nZXROYW1lS2luZCgpID09IERlY2xhcmF0aW9uTmFtZTo6Q1hYQ29uc3RydWN0b3JOYW1lIHx8CisgICAgICAgICAgIE5hbWUuZ2V0TmFtZUtpbmQoKSA9PSBEZWNsYXJhdGlvbk5hbWU6OkNYWERlc3RydWN0b3JOYW1lIHx8CisgICAgICAgICAgIE5hbWUuZ2V0TmFtZUtpbmQoKSA9PSBEZWNsYXJhdGlvbk5hbWU6OkNYWENvbnZlcnNpb25GdW5jdGlvbk5hbWUpOworICAgIExvY0luZm8uTmFtZWRUeXBlLlRJbmZvID0gVEluZm87CisgIH0KKworICAvLy8gZ2V0Q1hYT3BlcmF0b3JOYW1lUmFuZ2UgLSBHZXRzIHRoZSByYW5nZSBvZiB0aGUgb3BlcmF0b3IgbmFtZQorICAvLy8gKHdpdGhvdXQgdGhlIG9wZXJhdG9yIGtleXdvcmQpLiBBc3N1bWVzIGl0IGlzIGEgKG5vbi1saXRlcmFsKSBvcGVyYXRvci4KKyAgU291cmNlUmFuZ2UgZ2V0Q1hYT3BlcmF0b3JOYW1lUmFuZ2UoKSBjb25zdCB7CisgICAgYXNzZXJ0KE5hbWUuZ2V0TmFtZUtpbmQoKSA9PSBEZWNsYXJhdGlvbk5hbWU6OkNYWE9wZXJhdG9yTmFtZSk7CisgICAgcmV0dXJuIFNvdXJjZVJhbmdlKAorICAgICBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKExvY0luZm8uQ1hYT3BlcmF0b3JOYW1lLkJlZ2luT3BOYW1lTG9jKSwKKyAgICAgU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZyhMb2NJbmZvLkNYWE9wZXJhdG9yTmFtZS5FbmRPcE5hbWVMb2MpCisgICAgICAgICAgICAgICAgICAgICAgICk7CisgIH0KKworICAvLy8gc2V0Q1hYT3BlcmF0b3JOYW1lUmFuZ2UgLSBTZXRzIHRoZSByYW5nZSBvZiB0aGUgb3BlcmF0b3IgbmFtZQorICAvLy8gKHdpdGhvdXQgdGhlIG9wZXJhdG9yIGtleXdvcmQpLiBBc3N1bWVzIGl0IGlzIGEgQysrIG9wZXJhdG9yLgorICB2b2lkIHNldENYWE9wZXJhdG9yTmFtZVJhbmdlKFNvdXJjZVJhbmdlIFIpIHsKKyAgICBhc3NlcnQoTmFtZS5nZXROYW1lS2luZCgpID09IERlY2xhcmF0aW9uTmFtZTo6Q1hYT3BlcmF0b3JOYW1lKTsKKyAgICBMb2NJbmZvLkNYWE9wZXJhdG9yTmFtZS5CZWdpbk9wTmFtZUxvYyA9IFIuZ2V0QmVnaW4oKS5nZXRSYXdFbmNvZGluZygpOworICAgIExvY0luZm8uQ1hYT3BlcmF0b3JOYW1lLkVuZE9wTmFtZUxvYyA9IFIuZ2V0RW5kKCkuZ2V0UmF3RW5jb2RpbmcoKTsKKyAgfQorCisgIC8vLyBnZXRDWFhMaXRlcmFsT3BlcmF0b3JOYW1lTG9jIC0gUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIGxpdGVyYWwKKyAgLy8vIG9wZXJhdG9yIG5hbWUgKG5vdCB0aGUgb3BlcmF0b3Iga2V5d29yZCkuCisgIC8vLyBBc3N1bWVzIGl0IGlzIGEgbGl0ZXJhbCBvcGVyYXRvci4KKyAgU291cmNlTG9jYXRpb24gZ2V0Q1hYTGl0ZXJhbE9wZXJhdG9yTmFtZUxvYygpIGNvbnN0IHsKKyAgICBhc3NlcnQoTmFtZS5nZXROYW1lS2luZCgpID09IERlY2xhcmF0aW9uTmFtZTo6Q1hYTGl0ZXJhbE9wZXJhdG9yTmFtZSk7CisgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjoKKyAgICAgIGdldEZyb21SYXdFbmNvZGluZyhMb2NJbmZvLkNYWExpdGVyYWxPcGVyYXRvck5hbWUuT3BOYW1lTG9jKTsKKyAgfQorCisgIC8vLyBzZXRDWFhMaXRlcmFsT3BlcmF0b3JOYW1lTG9jIC0gU2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIGxpdGVyYWwKKyAgLy8vIG9wZXJhdG9yIG5hbWUgKG5vdCB0aGUgb3BlcmF0b3Iga2V5d29yZCkuCisgIC8vLyBBc3N1bWVzIGl0IGlzIGEgbGl0ZXJhbCBvcGVyYXRvci4KKyAgdm9pZCBzZXRDWFhMaXRlcmFsT3BlcmF0b3JOYW1lTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIGFzc2VydChOYW1lLmdldE5hbWVLaW5kKCkgPT0gRGVjbGFyYXRpb25OYW1lOjpDWFhMaXRlcmFsT3BlcmF0b3JOYW1lKTsKKyAgICBMb2NJbmZvLkNYWExpdGVyYWxPcGVyYXRvck5hbWUuT3BOYW1lTG9jID0gTG9jLmdldFJhd0VuY29kaW5nKCk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgbmFtZSBpbnZvbHZlcyBhIHRlbXBsYXRlIHBhcmFtZXRlci4KKyAgYm9vbCBpc0luc3RhbnRpYXRpb25EZXBlbmRlbnQoKSBjb25zdDsKKyAgCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBuYW1lIGNvbnRhaW5zIGFuIHVuZXhwYW5kZWQKKyAgLy8vIHBhcmFtZXRlciBwYWNrLgorICBib29sIGNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSBjb25zdDsKKworICAvLy8gZ2V0QXNTdHJpbmcgLSBSZXRyaWV2ZSB0aGUgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGZvciB0aGlzIG5hbWUuCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Q7CisKKyAgLy8vIHByaW50TmFtZSAtIFByaW50IHRoZSBodW1hbi1yZWFkYWJsZSBuYW1lIHRvIGEgc3RyZWFtLgorICB2b2lkIHByaW50TmFtZShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIC8vLyBnZXRCZWdpbkxvYyAtIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgdG9rZW4uCisgIFNvdXJjZUxvY2F0aW9uIGdldEJlZ2luTG9jKCkgY29uc3QgeyByZXR1cm4gTmFtZUxvYzsgfQorCisgIC8vLyBnZXRFbmRMb2MgLSBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgdG9rZW4uCisgIFNvdXJjZUxvY2F0aW9uIGdldEVuZExvYygpIGNvbnN0OworCisgIC8vLyBnZXRTb3VyY2VSYW5nZSAtIFRoZSByYW5nZSBvZiB0aGUgZGVjbGFyYXRpb24gbmFtZS4KKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0TG9jU3RhcnQoKSwgZ2V0TG9jRW5kKCkpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gZ2V0QmVnaW5Mb2MoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyA9IGdldEVuZExvYygpOworICAgIHJldHVybiBFbmRMb2MuaXNWYWxpZCgpID8gRW5kTG9jIDogZ2V0TG9jU3RhcnQoKTsKKyAgfQorfTsKKworLy8vIEluc2VydGlvbiBvcGVyYXRvciBmb3IgZGlhZ25vc3RpY3MuICBUaGlzIGFsbG93cyBzZW5kaW5nIERlY2xhcmF0aW9uTmFtZSdzCisvLy8gaW50byBhIGRpYWdub3N0aWMgd2l0aCA8PC4KK2lubGluZSBjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmb3BlcmF0b3I8PChjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmREIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lIE4pIHsKKyAgREIuQWRkVGFnZ2VkVmFsKE4uZ2V0QXNPcGFxdWVJbnRlZ2VyKCksCisgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6YWtfZGVjbGFyYXRpb25uYW1lKTsKKyAgcmV0dXJuIERCOworfQorCisvLy8gSW5zZXJ0aW9uIG9wZXJhdG9yIGZvciBwYXJ0aWFsIGRpYWdub3N0aWNzLiAgVGhpcyBhbGxvd3MgYmluZGluZworLy8vIERlY2xhcmF0aW9uTmFtZSdzIGludG8gYSBwYXJ0aWFsIGRpYWdub3N0aWMgd2l0aCA8PC4KK2lubGluZSBjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmb3BlcmF0b3I8PChjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmUEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lIE4pIHsKKyAgUEQuQWRkVGFnZ2VkVmFsKE4uZ2V0QXNPcGFxdWVJbnRlZ2VyKCksCisgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6YWtfZGVjbGFyYXRpb25uYW1lKTsKKyAgcmV0dXJuIFBEOworfQorCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZUluZm8gRE5JbmZvKSB7CisgIEROSW5mby5wcmludE5hbWUoT1MpOworICByZXR1cm4gT1M7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIERlZmluZSBEZW5zZU1hcEluZm8gc28gdGhhdCBEZWNsYXJhdGlvbk5hbWVzIGNhbiBiZSB1c2VkIGFzIGtleXMKKy8vLyBpbiBEZW5zZU1hcCBhbmQgRGVuc2VTZXRzLgordGVtcGxhdGU8Pgorc3RydWN0IERlbnNlTWFwSW5mbzxjbGFuZzo6RGVjbGFyYXRpb25OYW1lPiB7CisgIHN0YXRpYyBpbmxpbmUgY2xhbmc6OkRlY2xhcmF0aW9uTmFtZSBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gY2xhbmc6OkRlY2xhcmF0aW9uTmFtZTo6Z2V0RW1wdHlNYXJrZXIoKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgY2xhbmc6OkRlY2xhcmF0aW9uTmFtZSBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgcmV0dXJuIGNsYW5nOjpEZWNsYXJhdGlvbk5hbWU6OmdldFRvbWJzdG9uZU1hcmtlcigpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjbGFuZzo6RGVjbGFyYXRpb25OYW1lIE5hbWUpIHsKKyAgICByZXR1cm4gRGVuc2VNYXBJbmZvPHZvaWQqPjo6Z2V0SGFzaFZhbHVlKE5hbWUuZ2V0QXNPcGFxdWVQdHIoKSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIGJvb2wKKyAgaXNFcXVhbChjbGFuZzo6RGVjbGFyYXRpb25OYW1lIExIUywgY2xhbmc6OkRlY2xhcmF0aW9uTmFtZSBSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBpc1BvZExpa2U8Y2xhbmc6OkRlY2xhcmF0aW9uTmFtZT4geyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUX0RFQ0xBUkFUSU9OTkFNRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRGVwZW5kZW50RGlhZ25vc3RpYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlcGVuZGVudERpYWdub3N0aWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTE0MzI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0RlcGVuZGVudERpYWdub3N0aWMuaApAQCAtMCwwICsxLDE5MSBAQAorLy89PS0gRGVwZW5kZW50RGlhZ25vc3RpYy5oIC0gRGVwZW5kZW50bHktZ2VuZXJhdGVkIGRpYWdub3N0aWNzIC0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgaW50ZXJmYWNlcyBmb3IgZGlhZ25vc3RpY3Mgd2hpY2ggbWF5IG9yIG1heQorLy8gIGZpcmUgYmFzZWQgb24gaG93IGEgdGVtcGxhdGUgaXMgaW5zdGFudGlhdGVkLgorLy8KKy8vICBBdCB0aGUgbW9tZW50LCB0aGUgb25seSBjb25zdW1lciBvZiB0aGlzIGludGVyZmFjZSBpcyBhY2Nlc3MKKy8vICBjb250cm9sLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfREVQRU5ERU5URElBR05PU1RJQ19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX0RFUEVOREVOVERJQUdOT1NUSUNfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xCYXNlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDb250ZXh0SW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9QYXJ0aWFsRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU3BlY2lmaWVycy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBDWFhSZWNvcmREZWNsOworY2xhc3MgTmFtZWREZWNsOworCisvLy8gQSBkZXBlbmRlbnRseS1nZW5lcmF0ZWQgZGlhZ25vc3RpYy4KK2NsYXNzIERlcGVuZGVudERpYWdub3N0aWMgeworcHVibGljOgorICBlbnVtIEFjY2Vzc05vbmNlIHsgQWNjZXNzID0gMCB9OworCisgIHN0YXRpYyBEZXBlbmRlbnREaWFnbm9zdGljICpDcmVhdGUoQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsQ29udGV4dCAqUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc05vbmNlIF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNNZW1iZXJBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzU3BlY2lmaWVyIEFTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkRGVjbCAqVGFyZ2V0RGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhSZWNvcmREZWNsICpOYW1pbmdDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBCYXNlT2JqZWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmUERpYWcpIHsKKyAgICBEZXBlbmRlbnREaWFnbm9zdGljICpERCA9IENyZWF0ZShDb250ZXh0LCBQYXJlbnQsIFBEaWFnKTsKKyAgICBERC0+QWNjZXNzRGF0YS5Mb2MgPSBMb2MuZ2V0UmF3RW5jb2RpbmcoKTsKKyAgICBERC0+QWNjZXNzRGF0YS5Jc01lbWJlciA9IElzTWVtYmVyQWNjZXNzOworICAgIERELT5BY2Nlc3NEYXRhLkFjY2VzcyA9IEFTOworICAgIERELT5BY2Nlc3NEYXRhLlRhcmdldERlY2wgPSBUYXJnZXREZWNsOworICAgIERELT5BY2Nlc3NEYXRhLk5hbWluZ0NsYXNzID0gTmFtaW5nQ2xhc3M7CisgICAgREQtPkFjY2Vzc0RhdGEuQmFzZU9iamVjdFR5cGUgPSBCYXNlT2JqZWN0VHlwZS5nZXRBc09wYXF1ZVB0cigpOworICAgIHJldHVybiBERDsKKyAgfQorCisgIHVuc2lnbmVkIGdldEtpbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIEFjY2VzczsKKyAgfQorCisgIGJvb2wgaXNBY2Nlc3NUb01lbWJlcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0S2luZCgpID09IEFjY2Vzcyk7CisgICAgcmV0dXJuIEFjY2Vzc0RhdGEuSXNNZW1iZXI7CisgIH0KKworICBBY2Nlc3NTcGVjaWZpZXIgZ2V0QWNjZXNzKCkgY29uc3QgeworICAgIGFzc2VydChnZXRLaW5kKCkgPT0gQWNjZXNzKTsKKyAgICByZXR1cm4gQWNjZXNzU3BlY2lmaWVyKEFjY2Vzc0RhdGEuQWNjZXNzKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEFjY2Vzc0xvYygpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0S2luZCgpID09IEFjY2Vzcyk7CisgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoQWNjZXNzRGF0YS5Mb2MpOworICB9CisKKyAgTmFtZWREZWNsICpnZXRBY2Nlc3NUYXJnZXQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEtpbmQoKSA9PSBBY2Nlc3MpOworICAgIHJldHVybiBBY2Nlc3NEYXRhLlRhcmdldERlY2w7CisgIH0KKworICBOYW1lZERlY2wgKmdldEFjY2Vzc05hbWluZ0NsYXNzKCkgY29uc3QgeworICAgIGFzc2VydChnZXRLaW5kKCkgPT0gQWNjZXNzKTsKKyAgICByZXR1cm4gQWNjZXNzRGF0YS5OYW1pbmdDbGFzczsKKyAgfQorCisgIFF1YWxUeXBlIGdldEFjY2Vzc0Jhc2VPYmplY3RUeXBlKCkgY29uc3QgeworICAgIGFzc2VydChnZXRLaW5kKCkgPT0gQWNjZXNzKTsKKyAgICByZXR1cm4gUXVhbFR5cGU6OmdldEZyb21PcGFxdWVQdHIoQWNjZXNzRGF0YS5CYXNlT2JqZWN0VHlwZSk7CisgIH0KKworICBjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmZ2V0RGlhZ25vc3RpYygpIGNvbnN0IHsKKyAgICByZXR1cm4gRGlhZzsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgRGVjbENvbnRleHQ6OmRkaWFnX2l0ZXJhdG9yOworICBmcmllbmQgY2xhc3MgRGVwZW5kZW50U3RvcmVkRGVjbHNNYXA7CisKKyAgRGVwZW5kZW50RGlhZ25vc3RpYyhjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmUERpYWcsCisgICAgICAgICAgICAgICAgICAgICAgUGFydGlhbERpYWdub3N0aWM6OlN0b3JhZ2UgKlN0b3JhZ2UpIAorICAgIDogRGlhZyhQRGlhZywgU3RvcmFnZSkge30KKyAgCisgIHN0YXRpYyBEZXBlbmRlbnREaWFnbm9zdGljICpDcmVhdGUoQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsQ29udGV4dCAqUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZQRGlhZyk7CisKKyAgRGVwZW5kZW50RGlhZ25vc3RpYyAqTmV4dERpYWdub3N0aWM7CisKKyAgUGFydGlhbERpYWdub3N0aWMgRGlhZzsKKworICBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIExvYzsKKyAgICB1bnNpZ25lZCBBY2Nlc3MgOiAyOworICAgIHVuc2lnbmVkIElzTWVtYmVyIDogMTsKKyAgICBOYW1lZERlY2wgKlRhcmdldERlY2w7CisgICAgQ1hYUmVjb3JkRGVjbCAqTmFtaW5nQ2xhc3M7CisgICAgdm9pZCAqQmFzZU9iamVjdFR5cGU7CisgIH0gQWNjZXNzRGF0YTsKK307CisKKy8vLyBBbiBpdGVyYXRvciBvdmVyIHRoZSBkZXBlbmRlbnQgZGlhZ25vc3RpY3MgaW4gYSBkZXBlbmRlbnQgY29udGV4dC4KK2NsYXNzIERlY2xDb250ZXh0OjpkZGlhZ19pdGVyYXRvciB7CitwdWJsaWM6CisgIGRkaWFnX2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBkZGlhZ19pdGVyYXRvcihEZXBlbmRlbnREaWFnbm9zdGljICpQdHIpIDogUHRyKFB0cikge30KKworICB1c2luZyB2YWx1ZV90eXBlID0gRGVwZW5kZW50RGlhZ25vc3RpYyAqOworICB1c2luZyByZWZlcmVuY2UgPSBEZXBlbmRlbnREaWFnbm9zdGljICo7CisgIHVzaW5nIHBvaW50ZXIgPSBEZXBlbmRlbnREaWFnbm9zdGljICo7CisgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IGludDsKKyAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworCisgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBQdHI7IH0KKworICBkZGlhZ19pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICBhc3NlcnQoUHRyICYmICJhdHRlbXB0IHRvIGluY3JlbWVudCBwYXN0IGVuZCBvZiBkaWFnIGxpc3QiKTsKKyAgICBQdHIgPSBQdHItPk5leHREaWFnbm9zdGljOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGRkaWFnX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CisgICAgZGRpYWdfaXRlcmF0b3IgdG1wID0gKnRoaXM7CisgICAgKysqdGhpczsKKyAgICByZXR1cm4gdG1wOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGRkaWFnX2l0ZXJhdG9yIE90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIFB0ciA9PSBPdGhlci5QdHI7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oZGRpYWdfaXRlcmF0b3IgT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gUHRyICE9IE90aGVyLlB0cjsKKyAgfQorCisgIGRkaWFnX2l0ZXJhdG9yICZvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBOKSB7CisgICAgYXNzZXJ0KE4gPj0gMCAmJiAiY2Fubm90IHJld2luZCBhIERlY2xDb250ZXh0OjpkZGlhZ19pdGVyYXRvciIpOworICAgIHdoaWxlIChOLS0pCisgICAgICArKyp0aGlzOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGRkaWFnX2l0ZXJhdG9yIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgTikgY29uc3QgeworICAgIGRkaWFnX2l0ZXJhdG9yIHRtcCA9ICp0aGlzOworICAgIHRtcCArPSBOOworICAgIHJldHVybiB0bXA7CisgIH0KKworcHJpdmF0ZToKKyAgRGVwZW5kZW50RGlhZ25vc3RpYyAqUHRyID0gbnVsbHB0cjsKK307CisKK2lubGluZSBEZWNsQ29udGV4dDo6ZGRpYWdfcmFuZ2UgRGVjbENvbnRleHQ6OmRkaWFncygpIGNvbnN0IHsKKyAgYXNzZXJ0KGlzRGVwZW5kZW50Q29udGV4dCgpCisgICAgICAgICAmJiAiY2Fubm90IGl0ZXJhdGUgZGVwZW5kZW50IGRpYWdub3N0aWNzIG9mIG5vbi1kZXBlbmRlbnQgY29udGV4dCIpOworICBjb25zdCBEZXBlbmRlbnRTdG9yZWREZWNsc01hcCAqTWFwCisgICAgPSBzdGF0aWNfY2FzdDxEZXBlbmRlbnRTdG9yZWREZWNsc01hcCo+KGdldFByaW1hcnlDb250ZXh0KCktPmdldExvb2t1cFB0cigpKTsKKworICBpZiAoIU1hcCkKKyAgICAvLyBSZXR1cm4gYW4gZW1wdHkgcmFuZ2UgdXNpbmcgdGhlIGFsd2F5cy1lbmQgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICByZXR1cm4gZGRpYWdfcmFuZ2UoZGRpYWdfaXRlcmF0b3IoKSwgZGRpYWdfaXRlcmF0b3IoKSk7CisKKyAgcmV0dXJuIGRkaWFnX3JhbmdlKGRkaWFnX2l0ZXJhdG9yKE1hcC0+Rmlyc3REaWFnbm9zdGljKSwgZGRpYWdfaXRlcmF0b3IoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9ERVBFTkRFTlRESUFHTk9TVElDX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9FdmFsdWF0ZWRFeHByVmlzaXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0V2YWx1YXRlZEV4cHJWaXNpdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFkNzcyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9FdmFsdWF0ZWRFeHByVmlzaXRvci5oCkBAIC0wLDAgKzEsMTI5IEBACisvLz09PS0tLSBFdmFsdWF0ZWRFeHByVmlzaXRvci5oIC0gRXZhbHVhdGVkIGV4cHJlc3Npb24gdmlzaXRvciAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRXZhbHVhdGVkRXhwclZpc2l0b3IgY2xhc3MgdGVtcGxhdGUsIHdoaWNoIHZpc2l0cworLy8gIHRoZSBwb3RlbnRpYWxseS1ldmFsdWF0ZWQgc3ViZXhwcmVzc2lvbnMgb2YgYSBwb3RlbnRpYWxseS1ldmFsdWF0ZWQKKy8vICBleHByZXNzaW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0VWQUxVQVRFREVYUFJWSVNJVE9SX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfRVZBTFVBVEVERVhQUlZJU0lUT1JfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDWFguaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXhwci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByQ1hYLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXRWaXNpdG9yLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisgIAorY2xhc3MgQVNUQ29udGV4dDsKKyAgCisvLy8gXGJyaWVmIEdpdmVuIGEgcG90ZW50aWFsbHktZXZhbHVhdGVkIGV4cHJlc3Npb24sIHRoaXMgdmlzaXRvciB2aXNpdHMgYWxsCisvLy8gb2YgaXRzIHBvdGVudGlhbGx5LWV2YWx1YXRlZCBzdWJleHByZXNzaW9ucywgcmVjdXJzaXZlbHkuCit0ZW1wbGF0ZTx0ZW1wbGF0ZSA8dHlwZW5hbWU+IGNsYXNzIFB0ciwgdHlwZW5hbWUgSW1wbENsYXNzPgorY2xhc3MgRXZhbHVhdGVkRXhwclZpc2l0b3JCYXNlIDogcHVibGljIFN0bXRWaXNpdG9yQmFzZTxQdHIsIEltcGxDbGFzcywgdm9pZD4geworcHJvdGVjdGVkOgorICBjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0OworCitwdWJsaWM6CisjZGVmaW5lIFBUUihDTEFTUykgdHlwZW5hbWUgUHRyPENMQVNTPjo6dHlwZQorCisgIGV4cGxpY2l0IEV2YWx1YXRlZEV4cHJWaXNpdG9yQmFzZShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0KSA6IENvbnRleHQoQ29udGV4dCkgeyB9CisKKyAgLy8gRXhwcmVzc2lvbnMgdGhhdCBoYXZlIG5vIHBvdGVudGlhbGx5LWV2YWx1YXRlZCBzdWJleHByZXNzaW9ucyAoYnV0IG1heSBoYXZlCisgIC8vIG90aGVyIHN1Yi1leHByZXNzaW9ucykuCisgIHZvaWQgVmlzaXREZWNsUmVmRXhwcihQVFIoRGVjbFJlZkV4cHIpIEUpIHsgfQorICB2b2lkIFZpc2l0T2Zmc2V0T2ZFeHByKFBUUihPZmZzZXRPZkV4cHIpIEUpIHsgfQorICB2b2lkIFZpc2l0VW5hcnlFeHByT3JUeXBlVHJhaXRFeHByKFBUUihVbmFyeUV4cHJPclR5cGVUcmFpdEV4cHIpIEUpIHsgfQorICB2b2lkIFZpc2l0RXhwcmVzc2lvblRyYWl0RXhwcihQVFIoRXhwcmVzc2lvblRyYWl0RXhwcikgRSkgeyB9CisgIHZvaWQgVmlzaXRCbG9ja0V4cHIoUFRSKEJsb2NrRXhwcikgRSkgeyB9CisgIHZvaWQgVmlzaXRDWFhVdWlkb2ZFeHByKFBUUihDWFhVdWlkb2ZFeHByKSBFKSB7IH0KKyAgdm9pZCBWaXNpdENYWE5vZXhjZXB0RXhwcihQVFIoQ1hYTm9leGNlcHRFeHByKSBFKSB7IH0KKworICB2b2lkIFZpc2l0TWVtYmVyRXhwcihQVFIoTWVtYmVyRXhwcikgRSkgeworICAgIC8vIE9ubHkgdGhlIGJhc2UgbWF0dGVycy4KKyAgICByZXR1cm4gdGhpcy0+VmlzaXQoRS0+Z2V0QmFzZSgpKTsKKyAgfQorCisgIHZvaWQgVmlzaXRDaG9vc2VFeHByKFBUUihDaG9vc2VFeHByKSBFKSB7CisgICAgLy8gRG9uJ3QgdmlzaXQgZWl0aGVyIGNoaWxkIGV4cHJlc3Npb24gaWYgdGhlIGNvbmRpdGlvbiBpcyBkZXBlbmRlbnQuCisgICAgaWYgKEUtPmdldENvbmQoKS0+aXNWYWx1ZURlcGVuZGVudCgpKQorICAgICAgcmV0dXJuOworICAgIC8vIE9ubHkgdGhlIHNlbGVjdGVkIHN1YmV4cHJlc3Npb24gbWF0dGVyczsgdGhlIG90aGVyIG9uZSBpcyBub3QgZXZhbHVhdGVkLgorICAgIHJldHVybiB0aGlzLT5WaXNpdChFLT5nZXRDaG9zZW5TdWJFeHByKCkpOworICB9CisKKyAgdm9pZCBWaXNpdEdlbmVyaWNTZWxlY3Rpb25FeHByKFBUUihHZW5lcmljU2VsZWN0aW9uRXhwcikgRSkgeworICAgIC8vIFRoZSBjb250cm9sbGluZyBleHByZXNzaW9uIG9mIGEgZ2VuZXJpYyBzZWxlY3Rpb24gaXMgbm90IGV2YWx1YXRlZC4KKworICAgIC8vIERvbid0IHZpc2l0IGVpdGhlciBjaGlsZCBleHByZXNzaW9uIGlmIHRoZSBjb25kaXRpb24gaXMgdHlwZS1kZXBlbmRlbnQuCisgICAgaWYgKEUtPmlzUmVzdWx0RGVwZW5kZW50KCkpCisgICAgICByZXR1cm47CisgICAgLy8gT25seSB0aGUgc2VsZWN0ZWQgc3ViZXhwcmVzc2lvbiBtYXR0ZXJzOyB0aGUgb3RoZXIgc3ViZXhwcmVzc2lvbnMgYW5kIHRoZQorICAgIC8vIGNvbnRyb2xsaW5nIGV4cHJlc3Npb24gYXJlIG5vdCBldmFsdWF0ZWQuCisgICAgcmV0dXJuIHRoaXMtPlZpc2l0KEUtPmdldFJlc3VsdEV4cHIoKSk7CisgIH0KKworICB2b2lkIFZpc2l0RGVzaWduYXRlZEluaXRFeHByKFBUUihEZXNpZ25hdGVkSW5pdEV4cHIpIEUpIHsKKyAgICAvLyBPbmx5IHRoZSBhY3R1YWwgaW5pdGlhbGl6ZXIgbWF0dGVyczsgdGhlIGRlc2lnbmF0b3JzIGFyZSBhbGwgY29uc3RhbnQKKyAgICAvLyBleHByZXNzaW9ucy4KKyAgICByZXR1cm4gdGhpcy0+VmlzaXQoRS0+Z2V0SW5pdCgpKTsKKyAgfQorCisgIHZvaWQgVmlzaXRDWFhUeXBlaWRFeHByKFBUUihDWFhUeXBlaWRFeHByKSBFKSB7CisgICAgaWYgKEUtPmlzUG90ZW50aWFsbHlFdmFsdWF0ZWQoKSkKKyAgICAgIHJldHVybiB0aGlzLT5WaXNpdChFLT5nZXRFeHByT3BlcmFuZCgpKTsKKyAgfQorCisgIHZvaWQgVmlzaXRDYWxsRXhwcihQVFIoQ2FsbEV4cHIpIENFKSB7CisgICAgaWYgKCFDRS0+aXNVbmV2YWx1YXRlZEJ1aWx0aW5DYWxsKENvbnRleHQpKQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEltcGxDbGFzcyo+KHRoaXMpLT5WaXNpdEV4cHIoQ0UpOworICB9CisKKyAgdm9pZCBWaXNpdExhbWJkYUV4cHIoUFRSKExhbWJkYUV4cHIpIExFKSB7CisgICAgLy8gT25seSB2aXNpdCB0aGUgY2FwdHVyZSBpbml0aWFsaXplcnMsIGFuZCBub3QgdGhlIGJvZHkuCisgICAgZm9yIChMYW1iZGFFeHByOjpjb25zdF9jYXB0dXJlX2luaXRfaXRlcmF0b3IgSSA9IExFLT5jYXB0dXJlX2luaXRfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gTEUtPmNhcHR1cmVfaW5pdF9lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKQorICAgICAgaWYgKCpJKQorICAgICAgICB0aGlzLT5WaXNpdCgqSSk7CisgIH0KKworICAvLy8gXGJyaWVmIFRoZSBiYXNpcyBjYXNlIHdhbGtzIGFsbCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhlIHN0YXRlbWVudCBvcgorICAvLy8gZXhwcmVzc2lvbiwgYXNzdW1pbmcgdGhleSBhcmUgYWxsIHBvdGVudGlhbGx5IGV2YWx1YXRlZC4KKyAgdm9pZCBWaXNpdFN0bXQoUFRSKFN0bXQpIFMpIHsKKyAgICBmb3IgKGF1dG8gKlN1YlN0bXQgOiBTLT5jaGlsZHJlbigpKQorICAgICAgaWYgKFN1YlN0bXQpCisgICAgICAgIHRoaXMtPlZpc2l0KFN1YlN0bXQpOworICB9CisKKyN1bmRlZiBQVFIKK307CisKKy8vLyBFdmFsdWF0ZWRFeHByVmlzaXRvciAtIFRoaXMgY2xhc3MgdmlzaXRzICdFeHByIConcwordGVtcGxhdGU8dHlwZW5hbWUgSW1wbENsYXNzPgorY2xhc3MgRXZhbHVhdGVkRXhwclZpc2l0b3IKKyA6IHB1YmxpYyBFdmFsdWF0ZWRFeHByVmlzaXRvckJhc2U8bWFrZV9wdHIsIEltcGxDbGFzcz4geworcHVibGljOgorICBleHBsaWNpdCBFdmFsdWF0ZWRFeHByVmlzaXRvcihjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0KSA6CisgICAgRXZhbHVhdGVkRXhwclZpc2l0b3JCYXNlPG1ha2VfcHRyLCBJbXBsQ2xhc3M+KENvbnRleHQpIHsgfQorfTsKKworLy8vIENvbnN0RXZhbHVhdGVkRXhwclZpc2l0b3IgLSBUaGlzIGNsYXNzIHZpc2l0cyAnY29uc3QgRXhwciAqJ3MuCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbXBsQ2xhc3M+CitjbGFzcyBDb25zdEV2YWx1YXRlZEV4cHJWaXNpdG9yCisgOiBwdWJsaWMgRXZhbHVhdGVkRXhwclZpc2l0b3JCYXNlPG1ha2VfY29uc3RfcHRyLCBJbXBsQ2xhc3M+IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ29uc3RFdmFsdWF0ZWRFeHByVmlzaXRvcihjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0KSA6CisgICAgRXZhbHVhdGVkRXhwclZpc2l0b3JCYXNlPG1ha2VfY29uc3RfcHRyLCBJbXBsQ2xhc3M+KENvbnRleHQpIHsgfQorfTsKKworfQorCisjZW5kaWYgLy8gTExWTV9DTEFOR19BU1RfRVZBTFVBVEVERVhQUlZJU0lUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0V4cHIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9FeHByLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzMzlhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9FeHByLmgKQEAgLTAsMCArMSw1MjgyIEBACisvLz09PS0tLSBFeHByLmggLSBDbGFzc2VzIGZvciByZXByZXNlbnRpbmcgZXhwcmVzc2lvbnMgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRXhwciBpbnRlcmZhY2UgYW5kIHN1YmNsYXNzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9FWFBSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfRVhQUl9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvQVBWYWx1ZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RWZWN0b3IuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQWNjZXNzUGFpci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9PcGVyYXRpb25LaW5kcy5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1RlbXBsYXRlQmFzZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQ2hhckluZm8uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MYW5nT3B0aW9ucy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1N5bmNTY29wZS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1R5cGVUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEZsb2F0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQVBTSW50LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQXRvbWljT3JkZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgY2xhc3MgQVBWYWx1ZTsKKyAgY2xhc3MgQVNUQ29udGV4dDsKKyAgY2xhc3MgQmxvY2tEZWNsOworICBjbGFzcyBDWFhCYXNlU3BlY2lmaWVyOworICBjbGFzcyBDWFhNZW1iZXJDYWxsRXhwcjsKKyAgY2xhc3MgQ1hYT3BlcmF0b3JDYWxsRXhwcjsKKyAgY2xhc3MgQ2FzdEV4cHI7CisgIGNsYXNzIERlY2w7CisgIGNsYXNzIElkZW50aWZpZXJJbmZvOworICBjbGFzcyBNYXRlcmlhbGl6ZVRlbXBvcmFyeUV4cHI7CisgIGNsYXNzIE5hbWVkRGVjbDsKKyAgY2xhc3MgT2JqQ1Byb3BlcnR5UmVmRXhwcjsKKyAgY2xhc3MgT3BhcXVlVmFsdWVFeHByOworICBjbGFzcyBQYXJtVmFyRGVjbDsKKyAgY2xhc3MgU3RyaW5nTGl0ZXJhbDsKKyAgY2xhc3MgVGFyZ2V0SW5mbzsKKyAgY2xhc3MgVmFsdWVEZWNsOworCisvLy8gXGJyaWVmIEEgc2ltcGxlIGFycmF5IG9mIGJhc2Ugc3BlY2lmaWVycy4KK3R5cGVkZWYgU21hbGxWZWN0b3I8Q1hYQmFzZVNwZWNpZmllciosIDQ+IENYWENhc3RQYXRoOworCisvLy8gXGJyaWVmIEFuIGFkanVzdG1lbnQgdG8gYmUgbWFkZSB0byB0aGUgdGVtcG9yYXJ5IGNyZWF0ZWQgd2hlbiBlbWl0dGluZyBhCisvLy8gcmVmZXJlbmNlIGJpbmRpbmcsIHdoaWNoIGFjY2Vzc2VzIGEgcGFydGljdWxhciBzdWJvYmplY3Qgb2YgdGhhdCB0ZW1wb3JhcnkuCitzdHJ1Y3QgU3Vib2JqZWN0QWRqdXN0bWVudCB7CisgIGVudW0geworICAgIERlcml2ZWRUb0Jhc2VBZGp1c3RtZW50LAorICAgIEZpZWxkQWRqdXN0bWVudCwKKyAgICBNZW1iZXJQb2ludGVyQWRqdXN0bWVudAorICB9IEtpbmQ7CisKKyAgc3RydWN0IERUQiB7CisgICAgY29uc3QgQ2FzdEV4cHIgKkJhc2VQYXRoOworICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkRlcml2ZWRDbGFzczsKKyAgfTsKKworICBzdHJ1Y3QgUCB7CisgICAgY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVDsKKyAgICBFeHByICpSSFM7CisgIH07CisKKyAgdW5pb24geworICAgIHN0cnVjdCBEVEIgRGVyaXZlZFRvQmFzZTsKKyAgICBGaWVsZERlY2wgKkZpZWxkOworICAgIHN0cnVjdCBQIFB0cjsKKyAgfTsKKworICBTdWJvYmplY3RBZGp1c3RtZW50KGNvbnN0IENhc3RFeHByICpCYXNlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpEZXJpdmVkQ2xhc3MpCisgICAgOiBLaW5kKERlcml2ZWRUb0Jhc2VBZGp1c3RtZW50KSB7CisgICAgRGVyaXZlZFRvQmFzZS5CYXNlUGF0aCA9IEJhc2VQYXRoOworICAgIERlcml2ZWRUb0Jhc2UuRGVyaXZlZENsYXNzID0gRGVyaXZlZENsYXNzOworICB9CisKKyAgU3Vib2JqZWN0QWRqdXN0bWVudChGaWVsZERlY2wgKkZpZWxkKQorICAgIDogS2luZChGaWVsZEFkanVzdG1lbnQpIHsKKyAgICB0aGlzLT5GaWVsZCA9IEZpZWxkOworICB9CisKKyAgU3Vib2JqZWN0QWRqdXN0bWVudChjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBULCBFeHByICpSSFMpCisgICAgOiBLaW5kKE1lbWJlclBvaW50ZXJBZGp1c3RtZW50KSB7CisgICAgdGhpcy0+UHRyLk1QVCA9IE1QVDsKKyAgICB0aGlzLT5QdHIuUkhTID0gUkhTOworICB9Cit9OworCisvLy8gRXhwciAtIFRoaXMgcmVwcmVzZW50cyBvbmUgZXhwcmVzc2lvbi4gIE5vdGUgdGhhdCBFeHByJ3MgYXJlIHN1YmNsYXNzZXMgb2YKKy8vLyBTdG10LiAgVGhpcyBhbGxvd3MgYW4gZXhwcmVzc2lvbiB0byBiZSB0cmFuc3BhcmVudGx5IHVzZWQgYW55IHBsYWNlIGEgU3RtdAorLy8vIGlzIHJlcXVpcmVkLgorLy8vCitjbGFzcyBFeHByIDogcHVibGljIFN0bXQgeworICBRdWFsVHlwZSBUUjsKKworcHJvdGVjdGVkOgorICBFeHByKFN0bXRDbGFzcyBTQywgUXVhbFR5cGUgVCwgRXhwclZhbHVlS2luZCBWSywgRXhwck9iamVjdEtpbmQgT0ssCisgICAgICAgYm9vbCBURCwgYm9vbCBWRCwgYm9vbCBJRCwgYm9vbCBDb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKQorICAgIDogU3RtdChTQykKKyAgeworICAgIEV4cHJCaXRzLlR5cGVEZXBlbmRlbnQgPSBURDsKKyAgICBFeHByQml0cy5WYWx1ZURlcGVuZGVudCA9IFZEOworICAgIEV4cHJCaXRzLkluc3RhbnRpYXRpb25EZXBlbmRlbnQgPSBJRDsKKyAgICBFeHByQml0cy5WYWx1ZUtpbmQgPSBWSzsKKyAgICBFeHByQml0cy5PYmplY3RLaW5kID0gT0s7CisgICAgYXNzZXJ0KEV4cHJCaXRzLk9iamVjdEtpbmQgPT0gT0sgJiYgInRydW5jYXRlZCBraW5kIik7CisgICAgRXhwckJpdHMuQ29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjayA9IENvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2s7CisgICAgc2V0VHlwZShUKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIGVtcHR5IGV4cHJlc3Npb24uCisgIGV4cGxpY2l0IEV4cHIoU3RtdENsYXNzIFNDLCBFbXB0eVNoZWxsKSA6IFN0bXQoU0MpIHsgfQorCitwdWJsaWM6CisgIFF1YWxUeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBUUjsgfQorICB2b2lkIHNldFR5cGUoUXVhbFR5cGUgdCkgeworICAgIC8vIEluIEMrKywgdGhlIHR5cGUgb2YgYW4gZXhwcmVzc2lvbiBpcyBhbHdheXMgYWRqdXN0ZWQgc28gdGhhdCBpdAorICAgIC8vIHdpbGwgbm90IGhhdmUgcmVmZXJlbmNlIHR5cGUgKEMrKyBbZXhwcl1wNikuIFVzZQorICAgIC8vIFF1YWxUeXBlOjpnZXROb25SZWZlcmVuY2VUeXBlKCkgdG8gcmV0cmlldmUgdGhlIG5vbi1yZWZlcmVuY2UKKyAgICAvLyB0eXBlLiBBZGRpdGlvbmFsbHksIGluc3BlY3QgRXhwcjo6aXNMdmFsdWUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKKyAgICAvLyBhbiBleHByZXNzaW9uIHRoYXQgaXMgYWRqdXN0ZWQgaW4gdGhpcyBtYW5uZXIgc2hvdWxkIGJlCisgICAgLy8gY29uc2lkZXJlZCBhbiBsdmFsdWUuCisgICAgYXNzZXJ0KCh0LmlzTnVsbCgpIHx8ICF0LT5pc1JlZmVyZW5jZVR5cGUoKSkgJiYKKyAgICAgICAgICAgIkV4cHJlc3Npb25zIGNhbid0IGhhdmUgcmVmZXJlbmNlIHR5cGUiKTsKKworICAgIFRSID0gdDsKKyAgfQorCisgIC8vLyBpc1ZhbHVlRGVwZW5kZW50IC0gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgZXhwcmVzc2lvbiBpcworICAvLy8gdmFsdWUtZGVwZW5kZW50IChDKysgW3RlbXAuZGVwLmNvbnN0ZXhwcl0pLiBGb3IgZXhhbXBsZSwgdGhlCisgIC8vLyBhcnJheSBib3VuZCBvZiAiQ2hhcnMiIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpcworICAvLy8gdmFsdWUtZGVwZW5kZW50LgorICAvLy8gQGNvZGUKKyAgLy8vIHRlbXBsYXRlPGludCBTaXplLCBjaGFyICgmQ2hhcnMpW1NpemVdPiBzdHJ1Y3QgbWV0YV9zdHJpbmc7CisgIC8vLyBAZW5kY29kZQorICBib29sIGlzVmFsdWVEZXBlbmRlbnQoKSBjb25zdCB7IHJldHVybiBFeHByQml0cy5WYWx1ZURlcGVuZGVudDsgfQorCisgIC8vLyBcYnJpZWYgU2V0IHdoZXRoZXIgdGhpcyBleHByZXNzaW9uIGlzIHZhbHVlLWRlcGVuZGVudCBvciBub3QuCisgIHZvaWQgc2V0VmFsdWVEZXBlbmRlbnQoYm9vbCBWRCkgeworICAgIEV4cHJCaXRzLlZhbHVlRGVwZW5kZW50ID0gVkQ7CisgIH0KKworICAvLy8gaXNUeXBlRGVwZW5kZW50IC0gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgZXhwcmVzc2lvbiBpcworICAvLy8gdHlwZS1kZXBlbmRlbnQgKEMrKyBbdGVtcC5kZXAuZXhwcl0pLCB3aGljaCBtZWFucyB0aGF0IGl0cyB0eXBlCisgIC8vLyBjb3VsZCBjaGFuZ2UgZnJvbSBvbmUgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiB0byB0aGUgbmV4dC4gRm9yCisgIC8vLyBleGFtcGxlLCB0aGUgZXhwcmVzc2lvbnMgIngiIGFuZCAieCArIHkiIGFyZSB0eXBlLWRlcGVuZGVudCBpbgorICAvLy8gdGhlIGZvbGxvd2luZyBjb2RlLCBidXQgInkiIGlzIG5vdCB0eXBlLWRlcGVuZGVudDoKKyAgLy8vIEBjb2RlCisgIC8vLyB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAvLy8gdm9pZCBhZGQoVCB4LCBpbnQgeSkgeworICAvLy8gICB4ICsgeTsKKyAgLy8vIH0KKyAgLy8vIEBlbmRjb2RlCisgIGJvb2wgaXNUeXBlRGVwZW5kZW50KCkgY29uc3QgeyByZXR1cm4gRXhwckJpdHMuVHlwZURlcGVuZGVudDsgfQorCisgIC8vLyBcYnJpZWYgU2V0IHdoZXRoZXIgdGhpcyBleHByZXNzaW9uIGlzIHR5cGUtZGVwZW5kZW50IG9yIG5vdC4KKyAgdm9pZCBzZXRUeXBlRGVwZW5kZW50KGJvb2wgVEQpIHsKKyAgICBFeHByQml0cy5UeXBlRGVwZW5kZW50ID0gVEQ7CisgIH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBleHByZXNzaW9uIGlzIGluc3RhbnRpYXRpb24tZGVwZW5kZW50LCBtZWFuaW5nIHRoYXQKKyAgLy8vIGl0IGRlcGVuZHMgaW4gc29tZSB3YXkgb24gYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIGV2ZW4gaWYgbmVpdGhlciBpdHMgdHlwZQorICAvLy8gbm9yIChjb25zdGFudCkgdmFsdWUgY2FuIGNoYW5nZSBkdWUgdG8gdGhlIHRlbXBsYXRlIGluc3RhbnRpYXRpb24uCisgIC8vLworICAvLy8gSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCB0aGUgZXhwcmVzc2lvbiBcYyBzaXplb2Yoc2l6ZW9mKFQoKSArIFQoKSkpIGlzCisgIC8vLyBpbnN0YW50aWF0aW9uLWRlcGVuZGVudCAoc2luY2UgaXQgaW52b2x2ZXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXGMgVCksIGJ1dAorICAvLy8gaXMgbmVpdGhlciB0eXBlLSBub3IgdmFsdWUtZGVwZW5kZW50LCBzaW5jZSB0aGUgdHlwZSBvZiB0aGUgaW5uZXIKKyAgLy8vIFxjIHNpemVvZiBpcyBrbm93biAoXGMgc3RkOjpzaXplX3QpIGFuZCB0aGVyZWZvcmUgdGhlIHNpemUgb2YgdGhlIG91dGVyCisgIC8vLyBcYyBzaXplb2YgaXMga25vd24uCisgIC8vLworICAvLy8gXGNvZGUKKyAgLy8vIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIC8vLyB2b2lkIGYoVCB4LCBUIHkpIHsKKyAgLy8vICAgc2l6ZW9mKHNpemVvZihUKCkgKyBUKCkpOworICAvLy8gfQorICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIGJvb2wgaXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCkgY29uc3QgeworICAgIHJldHVybiBFeHByQml0cy5JbnN0YW50aWF0aW9uRGVwZW5kZW50OworICB9CisKKyAgLy8vIFxicmllZiBTZXQgd2hldGhlciB0aGlzIGV4cHJlc3Npb24gaXMgaW5zdGFudGlhdGlvbi1kZXBlbmRlbnQgb3Igbm90LgorICB2b2lkIHNldEluc3RhbnRpYXRpb25EZXBlbmRlbnQoYm9vbCBJRCkgeworICAgIEV4cHJCaXRzLkluc3RhbnRpYXRpb25EZXBlbmRlbnQgPSBJRDsKKyAgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGV4cHJlc3Npb24gY29udGFpbnMgYW4gdW5leHBhbmRlZCBwYXJhbWV0ZXIKKyAgLy8vIHBhY2sgKGZvciBDKysxMSB2YXJpYWRpYyB0ZW1wbGF0ZXMpLgorICAvLy8KKyAgLy8vIEdpdmVuIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdGVtcGxhdGU6CisgIC8vLworICAvLy8gXGNvZGUKKyAgLy8vIHRlbXBsYXRlPHR5cGVuYW1lIEYsIHR5cGVuYW1lIC4uLlR5cGVzPgorICAvLy8gdm9pZCBmb3J3YXJkKGNvbnN0IEYgJmYsIFR5cGVzICYmLi4uYXJncykgeworICAvLy8gICBmKHN0YXRpY19jYXN0PFR5cGVzJiY+KGFyZ3MpLi4uKTsKKyAgLy8vIH0KKyAgLy8vIFxlbmRjb2RlCisgIC8vLworICAvLy8gVGhlIGV4cHJlc3Npb25zIFxjIGFyZ3MgYW5kIFxjIHN0YXRpY19jYXN0PFR5cGVzJiY+KGFyZ3MpIGJvdGgKKyAgLy8vIGNvbnRhaW4gcGFyYW1ldGVyIHBhY2tzLgorICBib29sIGNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSBjb25zdCB7CisgICAgcmV0dXJuIEV4cHJCaXRzLkNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2s7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgYml0IHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgdGhpcyBleHByZXNzaW9uCisgIC8vLyBjb250YWlucyBhbiB1bmV4cGFuZGVkIHBhcmFtZXRlciBwYWNrLgorICB2b2lkIHNldENvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soYm9vbCBQUCA9IHRydWUpIHsKKyAgICBFeHByQml0cy5Db250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrID0gUFA7CisgIH0KKworICAvLy8gZ2V0RXhwckxvYyAtIFJldHVybiB0aGUgcHJlZmVycmVkIGxvY2F0aW9uIGZvciB0aGUgYXJyb3cgd2hlbiBkaWFnbm9zaW5nCisgIC8vLyBhIHByb2JsZW0gd2l0aCBhIGdlbmVyaWMgZXhwcmVzc2lvbi4KKyAgU291cmNlTG9jYXRpb24gZ2V0RXhwckxvYygpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisKKyAgLy8vIGlzVW51c2VkUmVzdWx0QVdhcm5pbmcgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGltbWVkaWF0ZSBleHByZXNzaW9uIHNob3VsZAorICAvLy8gYmUgd2FybmVkIGFib3V0IGlmIHRoZSByZXN1bHQgaXMgdW51c2VkLiAgSWYgc28sIGZpbGwgaW4gZXhwciwgbG9jYXRpb24sCisgIC8vLyBhbmQgcmFuZ2VzIHdpdGggZXhwciB0byB3YXJuIG9uIGFuZCBzb3VyY2UgbG9jYXRpb25zL3JhbmdlcyBhcHByb3ByaWF0ZQorICAvLy8gZm9yIGEgd2FybmluZy4KKyAgYm9vbCBpc1VudXNlZFJlc3VsdEFXYXJuaW5nKGNvbnN0IEV4cHIgKiZXYXJuRXhwciwgU291cmNlTG9jYXRpb24gJkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlICZSMSwgU291cmNlUmFuZ2UgJlIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUQ29udGV4dCAmQ3R4KSBjb25zdDsKKworICAvLy8gaXNMVmFsdWUgLSBUcnVlIGlmIHRoaXMgZXhwcmVzc2lvbiBpcyBhbiAibC12YWx1ZSIgYWNjb3JkaW5nIHRvCisgIC8vLyB0aGUgcnVsZXMgb2YgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuICBDIGFuZCBDKysgZ2l2ZSBzb21ld2hhdAorICAvLy8gZGlmZmVyZW50IHJ1bGVzIGZvciB0aGlzIGNvbmNlcHQsIGJ1dCBpbiBnZW5lcmFsLCB0aGUgcmVzdWx0IG9mCisgIC8vLyBhbiBsLXZhbHVlIGV4cHJlc3Npb24gaWRlbnRpZmllcyBhIHNwZWNpZmljIG9iamVjdCB3aGVyZWFzIHRoZQorICAvLy8gcmVzdWx0IG9mIGFuIHItdmFsdWUgZXhwcmVzc2lvbiBpcyBhIHZhbHVlIGRldGFjaGVkIGZyb20gYW55CisgIC8vLyBzcGVjaWZpYyBzdG9yYWdlLgorICAvLy8KKyAgLy8vIEMrKzExIGRpdmlkZXMgdGhlIGNvbmNlcHQgb2YgInItdmFsdWUiIGludG8gcHVyZSByLXZhbHVlcworICAvLy8gKCJwci12YWx1ZXMiKSBhbmQgc28tY2FsbGVkIGV4cGlyaW5nIHZhbHVlcyAoIngtdmFsdWVzIiksIHdoaWNoCisgIC8vLyBpZGVudGlmeSBzcGVjaWZpYyBvYmplY3RzIHRoYXQgY2FuIGJlIHNhZmVseSBjYW5uaWJhbGl6ZWQgZm9yCisgIC8vLyB0aGVpciByZXNvdXJjZXMuICBUaGlzIGlzIGFuIHVuZm9ydHVuYXRlIGFidXNlIG9mIHRlcm1pbm9sb2d5IG9uCisgIC8vLyB0aGUgcGFydCBvZiB0aGUgQysrIGNvbW1pdHRlZS4gIEluIENsYW5nLCB3aGVuIHdlIHNheSAici12YWx1ZSIsCisgIC8vLyB3ZSBnZW5lcmFsbHkgbWVhbiBhIHByLXZhbHVlLgorICBib29sIGlzTFZhbHVlKCkgY29uc3QgeyByZXR1cm4gZ2V0VmFsdWVLaW5kKCkgPT0gVktfTFZhbHVlOyB9CisgIGJvb2wgaXNSVmFsdWUoKSBjb25zdCB7IHJldHVybiBnZXRWYWx1ZUtpbmQoKSA9PSBWS19SVmFsdWU7IH0KKyAgYm9vbCBpc1hWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGdldFZhbHVlS2luZCgpID09IFZLX1hWYWx1ZTsgfQorICBib29sIGlzR0xWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGdldFZhbHVlS2luZCgpICE9IFZLX1JWYWx1ZTsgfQorCisgIGVudW0gTFZhbHVlQ2xhc3NpZmljYXRpb24geworICAgIExWX1ZhbGlkLAorICAgIExWX05vdE9iamVjdFR5cGUsCisgICAgTFZfSW5jb21wbGV0ZVZvaWRUeXBlLAorICAgIExWX0R1cGxpY2F0ZVZlY3RvckNvbXBvbmVudHMsCisgICAgTFZfSW52YWxpZEV4cHJlc3Npb24sCisgICAgTFZfSW52YWxpZE1lc3NhZ2VFeHByZXNzaW9uLAorICAgIExWX01lbWJlckZ1bmN0aW9uLAorICAgIExWX1N1Yk9iakNQcm9wZXJ0eVNldHRpbmcsCisgICAgTFZfQ2xhc3NUZW1wb3JhcnksCisgICAgTFZfQXJyYXlUZW1wb3JhcnkKKyAgfTsKKyAgLy8vIFJlYXNvbnMgd2h5IGFuIGV4cHJlc3Npb24gbWlnaHQgbm90IGJlIGFuIGwtdmFsdWUuCisgIExWYWx1ZUNsYXNzaWZpY2F0aW9uIENsYXNzaWZ5TFZhbHVlKEFTVENvbnRleHQgJkN0eCkgY29uc3Q7CisKKyAgZW51bSBpc01vZGlmaWFibGVMdmFsdWVSZXN1bHQgeworICAgIE1MVl9WYWxpZCwKKyAgICBNTFZfTm90T2JqZWN0VHlwZSwKKyAgICBNTFZfSW5jb21wbGV0ZVZvaWRUeXBlLAorICAgIE1MVl9EdXBsaWNhdGVWZWN0b3JDb21wb25lbnRzLAorICAgIE1MVl9JbnZhbGlkRXhwcmVzc2lvbiwKKyAgICBNTFZfTFZhbHVlQ2FzdCwgICAgICAgICAgIC8vIFNwZWNpYWxpemVkIGZvcm0gb2YgTUxWX0ludmFsaWRFeHByZXNzaW9uLgorICAgIE1MVl9JbmNvbXBsZXRlVHlwZSwKKyAgICBNTFZfQ29uc3RRdWFsaWZpZWQsCisgICAgTUxWX0NvbnN0UXVhbGlmaWVkRmllbGQsCisgICAgTUxWX0NvbnN0QWRkclNwYWNlLAorICAgIE1MVl9BcnJheVR5cGUsCisgICAgTUxWX05vU2V0dGVyUHJvcGVydHksCisgICAgTUxWX01lbWJlckZ1bmN0aW9uLAorICAgIE1MVl9TdWJPYmpDUHJvcGVydHlTZXR0aW5nLAorICAgIE1MVl9JbnZhbGlkTWVzc2FnZUV4cHJlc3Npb24sCisgICAgTUxWX0NsYXNzVGVtcG9yYXJ5LAorICAgIE1MVl9BcnJheVRlbXBvcmFyeQorICB9OworICAvLy8gaXNNb2RpZmlhYmxlTHZhbHVlIC0gQzk5IDYuMy4yLjE6IGFuIGx2YWx1ZSB0aGF0IGRvZXMgbm90IGhhdmUgYXJyYXkgdHlwZSwKKyAgLy8vIGRvZXMgbm90IGhhdmUgYW4gaW5jb21wbGV0ZSB0eXBlLCBkb2VzIG5vdCBoYXZlIGEgY29uc3QtcXVhbGlmaWVkIHR5cGUsCisgIC8vLyBhbmQgaWYgaXQgaXMgYSBzdHJ1Y3R1cmUgb3IgdW5pb24sIGRvZXMgbm90IGhhdmUgYW55IG1lbWJlciAoaW5jbHVkaW5nLAorICAvLy8gcmVjdXJzaXZlbHksIGFueSBtZW1iZXIgb3IgZWxlbWVudCBvZiBhbGwgY29udGFpbmVkIGFnZ3JlZ2F0ZXMgb3IgdW5pb25zKQorICAvLy8gd2l0aCBhIGNvbnN0LXF1YWxpZmllZCB0eXBlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBMb2MgW2luLG91dF0gLSBBIHNvdXJjZSBsb2NhdGlvbiB3aGljaCAqbWF5KiBiZSBmaWxsZWQKKyAgLy8vIGluIHdpdGggdGhlIGxvY2F0aW9uIG9mIHRoZSBleHByZXNzaW9uIG1ha2luZyB0aGlzIGEKKyAgLy8vIG5vbi1tb2RpZmlhYmxlIGx2YWx1ZSwgaWYgc3BlY2lmaWVkLgorICBpc01vZGlmaWFibGVMdmFsdWVSZXN1bHQKKyAgaXNNb2RpZmlhYmxlTHZhbHVlKEFTVENvbnRleHQgJkN0eCwgU291cmNlTG9jYXRpb24gKkxvYyA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVGhlIHJldHVybiB0eXBlIG9mIGNsYXNzaWZ5KCkuIFJlcHJlc2VudHMgdGhlIEMrKzExIGV4cHJlc3Npb24KKyAgLy8vICAgICAgICB0YXhvbm9teS4KKyAgY2xhc3MgQ2xhc3NpZmljYXRpb24geworICBwdWJsaWM6CisgICAgLy8vIFxicmllZiBUaGUgdmFyaW91cyBjbGFzc2lmaWNhdGlvbiByZXN1bHRzLiBNb3N0IG9mIHRoZXNlIG1lYW4gcHJ2YWx1ZS4KKyAgICBlbnVtIEtpbmRzIHsKKyAgICAgIENMX0xWYWx1ZSwKKyAgICAgIENMX1hWYWx1ZSwKKyAgICAgIENMX0Z1bmN0aW9uLCAvLyBGdW5jdGlvbnMgY2Fubm90IGJlIGx2YWx1ZXMgaW4gQy4KKyAgICAgIENMX1ZvaWQsIC8vIFZvaWQgY2Fubm90IGJlIGFuIGx2YWx1ZSBpbiBDLgorICAgICAgQ0xfQWRkcmVzc2FibGVWb2lkLCAvLyBWb2lkIGV4cHJlc3Npb24gd2hvc2UgYWRkcmVzcyBjYW4gYmUgdGFrZW4gaW4gQy4KKyAgICAgIENMX0R1cGxpY2F0ZVZlY3RvckNvbXBvbmVudHMsIC8vIEEgdmVjdG9yIHNodWZmbGUgd2l0aCBkdXBlcy4KKyAgICAgIENMX01lbWJlckZ1bmN0aW9uLCAvLyBBbiBleHByZXNzaW9uIHJlZmVycmluZyB0byBhIG1lbWJlciBmdW5jdGlvbgorICAgICAgQ0xfU3ViT2JqQ1Byb3BlcnR5U2V0dGluZywKKyAgICAgIENMX0NsYXNzVGVtcG9yYXJ5LCAvLyBBIHRlbXBvcmFyeSBvZiBjbGFzcyB0eXBlLCBvciBzdWJvYmplY3QgdGhlcmVvZi4KKyAgICAgIENMX0FycmF5VGVtcG9yYXJ5LCAvLyBBIHRlbXBvcmFyeSBvZiBhcnJheSB0eXBlLgorICAgICAgQ0xfT2JqQ01lc3NhZ2VSVmFsdWUsIC8vIE9iakMgbWVzc2FnZSBpcyBhbiBydmFsdWUKKyAgICAgIENMX1BSVmFsdWUgLy8gQSBwcnZhbHVlIGZvciBhbnkgb3RoZXIgcmVhc29uLCBvZiBhbnkgb3RoZXIgdHlwZQorICAgIH07CisgICAgLy8vIFxicmllZiBUaGUgcmVzdWx0cyBvZiBtb2RpZmljYXRpb24gdGVzdGluZy4KKyAgICBlbnVtIE1vZGlmaWFibGVUeXBlIHsKKyAgICAgIENNX1VudGVzdGVkLCAvLyB0ZXN0TW9kaWZpYWJsZSB3YXMgZmFsc2UuCisgICAgICBDTV9Nb2RpZmlhYmxlLAorICAgICAgQ01fUlZhbHVlLCAvLyBOb3QgbW9kaWZpYWJsZSBiZWNhdXNlIGl0J3MgYW4gcnZhbHVlCisgICAgICBDTV9GdW5jdGlvbiwgLy8gTm90IG1vZGlmaWFibGUgYmVjYXVzZSBpdCdzIGEgZnVuY3Rpb247IEMrKyBvbmx5CisgICAgICBDTV9MVmFsdWVDYXN0LCAvLyBTYW1lIGFzIENNX1JWYWx1ZSwgYnV0IGluZGljYXRlcyBHQ0MgY2FzdC1hcy1sdmFsdWUgZXh0CisgICAgICBDTV9Ob1NldHRlclByb3BlcnR5LC8vIEltcGxpY2l0IGFzc2lnbm1lbnQgdG8gT2JqQyBwcm9wZXJ0eSB3aXRob3V0IHNldHRlcgorICAgICAgQ01fQ29uc3RRdWFsaWZpZWQsCisgICAgICBDTV9Db25zdFF1YWxpZmllZEZpZWxkLAorICAgICAgQ01fQ29uc3RBZGRyU3BhY2UsCisgICAgICBDTV9BcnJheVR5cGUsCisgICAgICBDTV9JbmNvbXBsZXRlVHlwZQorICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRXhwcjsKKworICAgIHVuc2lnbmVkIHNob3J0IEtpbmQ7CisgICAgdW5zaWduZWQgc2hvcnQgTW9kaWZpYWJsZTsKKworICAgIGV4cGxpY2l0IENsYXNzaWZpY2F0aW9uKEtpbmRzIGssIE1vZGlmaWFibGVUeXBlIG0pCisgICAgICA6IEtpbmQoayksIE1vZGlmaWFibGUobSkKKyAgICB7fQorCisgIHB1YmxpYzoKKyAgICBDbGFzc2lmaWNhdGlvbigpIHt9CisKKyAgICBLaW5kcyBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8S2luZHM+KEtpbmQpOyB9CisgICAgTW9kaWZpYWJsZVR5cGUgZ2V0TW9kaWZpYWJsZSgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChNb2RpZmlhYmxlICE9IENNX1VudGVzdGVkICYmICJEaWQgbm90IHRlc3QgZm9yIG1vZGlmaWFiaWxpdHkuIik7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TW9kaWZpYWJsZVR5cGU+KE1vZGlmaWFibGUpOworICAgIH0KKyAgICBib29sIGlzTFZhbHVlKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBDTF9MVmFsdWU7IH0KKyAgICBib29sIGlzWFZhbHVlKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBDTF9YVmFsdWU7IH0KKyAgICBib29sIGlzR0xWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPD0gQ0xfWFZhbHVlOyB9CisgICAgYm9vbCBpc1BSVmFsdWUoKSBjb25zdCB7IHJldHVybiBLaW5kID49IENMX0Z1bmN0aW9uOyB9CisgICAgYm9vbCBpc1JWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPj0gQ0xfWFZhbHVlOyB9CisgICAgYm9vbCBpc01vZGlmaWFibGUoKSBjb25zdCB7IHJldHVybiBnZXRNb2RpZmlhYmxlKCkgPT0gQ01fTW9kaWZpYWJsZTsgfQorCisgICAgLy8vIFxicmllZiBDcmVhdGUgYSBzaW1wbGUsIG1vZGlmaWFibHkgbHZhbHVlCisgICAgc3RhdGljIENsYXNzaWZpY2F0aW9uIG1ha2VTaW1wbGVMVmFsdWUoKSB7CisgICAgICByZXR1cm4gQ2xhc3NpZmljYXRpb24oQ0xfTFZhbHVlLCBDTV9Nb2RpZmlhYmxlKTsKKyAgICB9CisKKyAgfTsKKyAgLy8vIFxicmllZiBDbGFzc2lmeSAtIENsYXNzaWZ5IHRoaXMgZXhwcmVzc2lvbiBhY2NvcmRpbmcgdG8gdGhlIEMrKzExCisgIC8vLyAgICAgICAgZXhwcmVzc2lvbiB0YXhvbm9teS4KKyAgLy8vCisgIC8vLyBDKysxMSBkZWZpbmVzIChbYmFzaWMubHZhbF0pIGEgbmV3IHRheG9ub215IG9mIGV4cHJlc3Npb25zIHRvIHJlcGxhY2UgdGhlCisgIC8vLyBvbGQgbHZhbHVlIHZzIHJ2YWx1ZS4gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mIGV4cHJlc3Npb24gdGhpcworICAvLy8gaXMuIFRoZXJlIGFyZSB0aHJlZSBleHByZXNzaW9uIHR5cGVzOgorICAvLy8gLSBsdmFsdWVzIGFyZSBjbGFzc2ljYWwgbHZhbHVlcyBhcyBpbiBDKyswMy4KKyAgLy8vIC0gcHJ2YWx1ZXMgYXJlIGVxdWl2YWxlbnQgdG8gcnZhbHVlcyBpbiBDKyswMy4KKyAgLy8vIC0geHZhbHVlcyBhcmUgZXhwcmVzc2lvbnMgeWllbGRpbmcgdW5uYW1lZCBydmFsdWUgcmVmZXJlbmNlcywgZS5nLiBhCisgIC8vLyAgIGZ1bmN0aW9uIHJldHVybmluZyBhbiBydmFsdWUgcmVmZXJlbmNlLgorICAvLy8gbHZhbHVlcyBhbmQgeHZhbHVlcyBhcmUgY29sbGVjdGl2ZWx5IHJlZmVycmVkIHRvIGFzIGdsdmFsdWVzLCB3aGlsZQorICAvLy8gcHJ2YWx1ZXMgYW5kIHh2YWx1ZXMgdG9nZXRoZXIgZm9ybSBydmFsdWVzLgorICBDbGFzc2lmaWNhdGlvbiBDbGFzc2lmeShBU1RDb250ZXh0ICZDdHgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2xhc3NpZnlJbXBsKEN0eCwgbnVsbHB0cik7CisgIH0KKworICAvLy8gXGJyaWVmIENsYXNzaWZ5TW9kaWZpYWJsZSAtIENsYXNzaWZ5IHRoaXMgZXhwcmVzc2lvbiBhY2NvcmRpbmcgdG8gdGhlCisgIC8vLyAgICAgICAgQysrMTEgZXhwcmVzc2lvbiB0YXhvbm9teSwgYW5kIHNlZSBpZiBpdCBpcyB2YWxpZCBvbiB0aGUgbGVmdCBzaWRlCisgIC8vLyAgICAgICAgb2YgYW4gYXNzaWdubWVudC4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGV4dGVuZHMgY2xhc3NpZnkgaW4gdGhhdCBpdCBhbHNvIHRlc3RzIHdoZXRoZXIgdGhlCisgIC8vLyBleHByZXNzaW9uIGlzIG1vZGlmaWFibGUgKEM5OSA2LjMuMi4xcDEpLgorICAvLy8gXHBhcmFtIExvYyBBIHNvdXJjZSBsb2NhdGlvbiB0aGF0IG1pZ2h0IGJlIGZpbGxlZCB3aXRoIGEgcmVsZXZhbnQgbG9jYXRpb24KKyAgLy8vICAgICAgICAgICAgaWYgdGhlIGV4cHJlc3Npb24gaXMgbm90IG1vZGlmaWFibGUuCisgIENsYXNzaWZpY2F0aW9uIENsYXNzaWZ5TW9kaWZpYWJsZShBU1RDb250ZXh0ICZDdHgsIFNvdXJjZUxvY2F0aW9uICZMb2MpIGNvbnN0eworICAgIHJldHVybiBDbGFzc2lmeUltcGwoQ3R4LCAmTG9jKTsKKyAgfQorCisgIC8vLyBnZXRWYWx1ZUtpbmRGb3JUeXBlIC0gR2l2ZW4gYSBmb3JtYWwgcmV0dXJuIG9yIHBhcmFtZXRlciB0eXBlLAorICAvLy8gZ2l2ZSBpdHMgdmFsdWUga2luZC4KKyAgc3RhdGljIEV4cHJWYWx1ZUtpbmQgZ2V0VmFsdWVLaW5kRm9yVHlwZShRdWFsVHlwZSBUKSB7CisgICAgaWYgKGNvbnN0IFJlZmVyZW5jZVR5cGUgKlJUID0gVC0+Z2V0QXM8UmVmZXJlbmNlVHlwZT4oKSkKKyAgICAgIHJldHVybiAoaXNhPExWYWx1ZVJlZmVyZW5jZVR5cGU+KFJUKQorICAgICAgICAgICAgICAgID8gVktfTFZhbHVlCisgICAgICAgICAgICAgICAgOiAoUlQtPmdldFBvaW50ZWVUeXBlKCktPmlzRnVuY3Rpb25UeXBlKCkKKyAgICAgICAgICAgICAgICAgICAgID8gVktfTFZhbHVlIDogVktfWFZhbHVlKSk7CisgICAgcmV0dXJuIFZLX1JWYWx1ZTsKKyAgfQorCisgIC8vLyBnZXRWYWx1ZUtpbmQgLSBUaGUgdmFsdWUga2luZCB0aGF0IHRoaXMgZXhwcmVzc2lvbiBwcm9kdWNlcy4KKyAgRXhwclZhbHVlS2luZCBnZXRWYWx1ZUtpbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEV4cHJWYWx1ZUtpbmQ+KEV4cHJCaXRzLlZhbHVlS2luZCk7CisgIH0KKworICAvLy8gZ2V0T2JqZWN0S2luZCAtIFRoZSBvYmplY3Qga2luZCB0aGF0IHRoaXMgZXhwcmVzc2lvbiBwcm9kdWNlcy4KKyAgLy8vIE9iamVjdCBraW5kcyBhcmUgbWVhbmluZ2Z1bCBvbmx5IGZvciBleHByZXNzaW9ucyB0aGF0IHlpZWxkIGFuCisgIC8vLyBsLXZhbHVlIG9yIHgtdmFsdWUuCisgIEV4cHJPYmplY3RLaW5kIGdldE9iamVjdEtpbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEV4cHJPYmplY3RLaW5kPihFeHByQml0cy5PYmplY3RLaW5kKTsKKyAgfQorCisgIGJvb2wgaXNPcmRpbmFyeU9yQml0RmllbGRPYmplY3QoKSBjb25zdCB7CisgICAgRXhwck9iamVjdEtpbmQgT0sgPSBnZXRPYmplY3RLaW5kKCk7CisgICAgcmV0dXJuIChPSyA9PSBPS19PcmRpbmFyeSB8fCBPSyA9PSBPS19CaXRGaWVsZCk7CisgIH0KKworICAvLy8gc2V0VmFsdWVLaW5kIC0gU2V0IHRoZSB2YWx1ZSBraW5kIHByb2R1Y2VkIGJ5IHRoaXMgZXhwcmVzc2lvbi4KKyAgdm9pZCBzZXRWYWx1ZUtpbmQoRXhwclZhbHVlS2luZCBDYXQpIHsgRXhwckJpdHMuVmFsdWVLaW5kID0gQ2F0OyB9CisKKyAgLy8vIHNldE9iamVjdEtpbmQgLSBTZXQgdGhlIG9iamVjdCBraW5kIHByb2R1Y2VkIGJ5IHRoaXMgZXhwcmVzc2lvbi4KKyAgdm9pZCBzZXRPYmplY3RLaW5kKEV4cHJPYmplY3RLaW5kIENhdCkgeyBFeHByQml0cy5PYmplY3RLaW5kID0gQ2F0OyB9CisKK3ByaXZhdGU6CisgIENsYXNzaWZpY2F0aW9uIENsYXNzaWZ5SW1wbChBU1RDb250ZXh0ICZDdHgsIFNvdXJjZUxvY2F0aW9uICpMb2MpIGNvbnN0OworCitwdWJsaWM6CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBleHByZXNzaW9uIGlzIGEgZ2wtdmFsdWUgdGhhdAorICAvLy8gcG90ZW50aWFsbHkgcmVmZXJzIHRvIGEgYml0LWZpZWxkLgorICAvLy8KKyAgLy8vIEluIEMrKywgd2hldGhlciBhIGdsLXZhbHVlIHJlZmVycyB0byBhIGJpdGZpZWxkIGlzIGVzc2VudGlhbGx5CisgIC8vLyBhbiBhc3BlY3Qgb2YgdGhlIHZhbHVlLWtpbmQgdHlwZSBzeXN0ZW0uCisgIGJvb2wgcmVmZXJzVG9CaXRGaWVsZCgpIGNvbnN0IHsgcmV0dXJuIGdldE9iamVjdEtpbmQoKSA9PSBPS19CaXRGaWVsZDsgfQorCisgIC8vLyBcYnJpZWYgSWYgdGhpcyBleHByZXNzaW9uIHJlZmVycyB0byBhIGJpdC1maWVsZCwgcmV0cmlldmUgdGhlCisgIC8vLyBkZWNsYXJhdGlvbiBvZiB0aGF0IGJpdC1maWVsZC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyByZXR1cm5zIGEgbm9uLW51bGwgcG9pbnRlciBpbiBzdWJ0bHkgZGlmZmVyZW50CisgIC8vLyBwbGFjZXMgdGhhbiByZWZlcnNUb0JpdEZpZWxkIHJldHVybnMgdHJ1ZS4gIEluIHBhcnRpY3VsYXIsIHRoaXMgY2FuCisgIC8vLyByZXR1cm4gYSBub24tbnVsbCBwb2ludGVyIGV2ZW4gZm9yIHItdmFsdWVzIGxvYWRlZCBmcm9tCisgIC8vLyBiaXQtZmllbGRzLCBidXQgaXQgd2lsbCByZXR1cm4gbnVsbCBmb3IgYSBjb25kaXRpb25hbCBiaXQtZmllbGQuCisgIEZpZWxkRGVjbCAqZ2V0U291cmNlQml0RmllbGQoKTsKKworICBjb25zdCBGaWVsZERlY2wgKmdldFNvdXJjZUJpdEZpZWxkKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PEV4cHIqPih0aGlzKS0+Z2V0U291cmNlQml0RmllbGQoKTsKKyAgfQorCisgIERlY2wgKmdldFJlZmVyZW5jZWREZWNsT2ZDYWxsZWUoKTsKKyAgY29uc3QgRGVjbCAqZ2V0UmVmZXJlbmNlZERlY2xPZkNhbGxlZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFeHByKj4odGhpcyktPmdldFJlZmVyZW5jZWREZWNsT2ZDYWxsZWUoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSWYgdGhpcyBleHByZXNzaW9uIGlzIGFuIGwtdmFsdWUgZm9yIGFuIE9iamVjdGl2ZSBDCisgIC8vLyBwcm9wZXJ0eSwgZmluZCB0aGUgdW5kZXJseWluZyBwcm9wZXJ0eSByZWZlcmVuY2UgZXhwcmVzc2lvbi4KKyAgY29uc3QgT2JqQ1Byb3BlcnR5UmVmRXhwciAqZ2V0T2JqQ1Byb3BlcnR5KCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiB0aGlzIGV4cHJlc3Npb24gaXMgdGhlIE9iakMgJ3NlbGYnIGltcGxpY2l0IHBhcmFtZXRlci4KKyAgYm9vbCBpc09iakNTZWxmRXhwcigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB3aGV0aGVyIHRoaXMgZXhwcmVzc2lvbiByZWZlcnMgdG8gYSB2ZWN0b3IgZWxlbWVudC4KKyAgYm9vbCByZWZlcnNUb1ZlY3RvckVsZW1lbnQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgd2hldGhlciB0aGlzIGV4cHJlc3Npb24gcmVmZXJzIHRvIGEgZ2xvYmFsIHJlZ2lzdGVyCisgIC8vLyB2YXJpYWJsZS4KKyAgYm9vbCByZWZlcnNUb0dsb2JhbFJlZ2lzdGVyVmFyKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBleHByZXNzaW9uIGhhcyBhIHBsYWNlaG9sZGVyIHR5cGUuCisgIGJvb2wgaGFzUGxhY2Vob2xkZXJUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUeXBlKCktPmlzUGxhY2Vob2xkZXJUeXBlKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgd2hldGhlciB0aGlzIGV4cHJlc3Npb24gaGFzIGEgc3BlY2lmaWMgcGxhY2Vob2xkZXIgdHlwZS4KKyAgYm9vbCBoYXNQbGFjZWhvbGRlclR5cGUoQnVpbHRpblR5cGU6OktpbmQgSykgY29uc3QgeworICAgIGFzc2VydChCdWlsdGluVHlwZTo6aXNQbGFjZWhvbGRlclR5cGVLaW5kKEspKTsKKyAgICBpZiAoY29uc3QgQnVpbHRpblR5cGUgKkJUID0gZHluX2Nhc3Q8QnVpbHRpblR5cGU+KGdldFR5cGUoKSkpCisgICAgICByZXR1cm4gQlQtPmdldEtpbmQoKSA9PSBLOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBpc0tub3duVG9IYXZlQm9vbGVhblZhbHVlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBpbnRlZ2VyIGV4cHJlc3Npb24KKyAgLy8vIHRoYXQgaXMga25vd24gdG8gcmV0dXJuIDAgb3IgMS4gIFRoaXMgaGFwcGVucyBmb3IgX0Jvb2wvYm9vbCBleHByZXNzaW9ucworICAvLy8gYnV0IGFsc28gaW50IGV4cHJlc3Npb25zIHdoaWNoIGFyZSBwcm9kdWNlZCBieSB0aGluZ3MgbGlrZSBjb21wYXJpc29ucyBpbgorICAvLy8gQy4KKyAgYm9vbCBpc0tub3duVG9IYXZlQm9vbGVhblZhbHVlKCkgY29uc3Q7CisKKyAgLy8vIGlzSW50ZWdlckNvbnN0YW50RXhwciAtIFJldHVybiB0cnVlIGlmIHRoaXMgZXhwcmVzc2lvbiBpcyBhIHZhbGlkIGludGVnZXIKKyAgLy8vIGNvbnN0YW50IGV4cHJlc3Npb24sIGFuZCwgaWYgc28sIHJldHVybiBpdHMgdmFsdWUgaW4gUmVzdWx0LiAgSWYgbm90IGEKKyAgLy8vIHZhbGlkIGktYy1lLCByZXR1cm4gZmFsc2UgYW5kIGZpbGwgaW4gTG9jIChpZiBzcGVjaWZpZWQpIHdpdGggdGhlIGxvY2F0aW9uCisgIC8vLyBvZiB0aGUgaW52YWxpZCBleHByZXNzaW9uLgorICAvLy8KKyAgLy8vIE5vdGU6IFRoaXMgZG9lcyBub3QgcGVyZm9ybSB0aGUgaW1wbGljaXQgY29udmVyc2lvbnMgcmVxdWlyZWQgYnkgQysrMTEKKyAgLy8vIFtleHByLmNvbnN0XXA1LgorICBib29sIGlzSW50ZWdlckNvbnN0YW50RXhwcihsbHZtOjpBUFNJbnQgJlJlc3VsdCwgY29uc3QgQVNUQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqTG9jID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0V2YWx1YXRlZCA9IHRydWUpIGNvbnN0OworICBib29sIGlzSW50ZWdlckNvbnN0YW50RXhwcihjb25zdCBBU1RDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICpMb2MgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gaXNDWFg5OEludGVncmFsQ29uc3RhbnRFeHByIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBleHByZXNzaW9uIGlzIGFuCisgIC8vLyBpbnRlZ3JhbCBjb25zdGFudCBleHByZXNzaW9uIGluIEMrKzk4LiBDYW4gb25seSBiZSB1c2VkIGluIEMrKy4KKyAgYm9vbCBpc0NYWDk4SW50ZWdyYWxDb25zdGFudEV4cHIoY29uc3QgQVNUQ29udGV4dCAmQ3R4KSBjb25zdDsKKworICAvLy8gaXNDWFgxMUNvbnN0YW50RXhwciAtIFJldHVybiB0cnVlIGlmIHRoaXMgZXhwcmVzc2lvbiBpcyBhIGNvbnN0YW50CisgIC8vLyBleHByZXNzaW9uIGluIEMrKzExLiBDYW4gb25seSBiZSB1c2VkIGluIEMrKy4KKyAgLy8vCisgIC8vLyBOb3RlOiBUaGlzIGRvZXMgbm90IHBlcmZvcm0gdGhlIGltcGxpY2l0IGNvbnZlcnNpb25zIHJlcXVpcmVkIGJ5IEMrKzExCisgIC8vLyBbZXhwci5jb25zdF1wNS4KKyAgYm9vbCBpc0NYWDExQ29uc3RhbnRFeHByKGNvbnN0IEFTVENvbnRleHQgJkN0eCwgQVBWYWx1ZSAqUmVzdWx0ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICpMb2MgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gaXNQb3RlbnRpYWxDb25zdGFudEV4cHIgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uJ3MgZGVmaW5pdGlvbgorICAvLy8gbWlnaHQgYmUgdXNhYmxlIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBpbiBDKysxMSwgaWYgaXQgd2VyZSBtYXJrZWQKKyAgLy8vIGNvbnN0ZXhwci4gUmV0dXJuIGZhbHNlIGlmIHRoZSBmdW5jdGlvbiBjYW4gbmV2ZXIgcHJvZHVjZSBhIGNvbnN0YW50CisgIC8vLyBleHByZXNzaW9uLCBhbG9uZyB3aXRoIGRpYWdub3N0aWNzIGRlc2NyaWJpbmcgd2h5IG5vdC4KKyAgc3RhdGljIGJvb2wgaXNQb3RlbnRpYWxDb25zdGFudEV4cHIoY29uc3QgRnVuY3Rpb25EZWNsICpGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpYWxEaWFnbm9zdGljQXQ+ICZEaWFncyk7CisKKyAgLy8vIGlzUG90ZW50aWFsQ29uc3RhbnRFeHByVW5ldmFsdXRlZCAtIFJldHVybiB0cnVlIGlmIHRoaXMgZXhwcmVzc2lvbiBtaWdodAorICAvLy8gYmUgdXNhYmxlIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBpbiBDKysxMSBpbiBhbiB1bmV2YWx1YXRlZCBjb250ZXh0LCBpZgorICAvLy8gaXQgd2VyZSBpbiBmdW5jdGlvbiBGRCBtYXJrZWQgY29uc3RleHByLiBSZXR1cm4gZmFsc2UgaWYgdGhlIGZ1bmN0aW9uIGNhbgorICAvLy8gbmV2ZXIgcHJvZHVjZSBhIGNvbnN0YW50IGV4cHJlc3Npb24sIGFsb25nIHdpdGggZGlhZ25vc3RpY3MgZGVzY3JpYmluZworICAvLy8gd2h5IG5vdC4KKyAgc3RhdGljIGJvb2wgaXNQb3RlbnRpYWxDb25zdGFudEV4cHJVbmV2YWx1YXRlZChFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGlhbERpYWdub3N0aWNBdD4gJkRpYWdzKTsKKworICAvLy8gaXNDb25zdGFudEluaXRpYWxpemVyIC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgZXhwcmVzc2lvbiBjYW4gYmUgZW1pdHRlZCB0bworICAvLy8gSVIgYXMgYSBjb25zdGFudCwgYW5kIHRodXMgY2FuIGJlIHVzZWQgYXMgYSBjb25zdGFudCBpbml0aWFsaXplciBpbiBDLgorICAvLy8gSWYgdGhpcyBleHByZXNzaW9uIGlzIG5vdCBjb25zdGFudCBhbmQgQ3VscHJpdCBpcyBub24tbnVsbCwKKyAgLy8vIGl0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIGFkZHJlc3Mgb2YgZmlyc3Qgbm9uIGNvbnN0YW50IGV4cHIuCisgIGJvb2wgaXNDb25zdGFudEluaXRpYWxpemVyKEFTVENvbnRleHQgJkN0eCwgYm9vbCBGb3JSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHIgKipDdWxwcml0ID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIEV2YWxTdGF0dXMgaXMgYSBzdHJ1Y3Qgd2l0aCBkZXRhaWxlZCBpbmZvIGFib3V0IGFuIGV2YWx1YXRpb24gaW4gcHJvZ3Jlc3MuCisgIHN0cnVjdCBFdmFsU3RhdHVzIHsKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhlIGV2YWx1YXRlZCBleHByZXNzaW9uIGhhcyBzaWRlIGVmZmVjdHMuCisgICAgLy8vIEZvciBleGFtcGxlLCAoZigpICYmIDApIGNhbiBiZSBmb2xkZWQsIGJ1dCBpdCBzdGlsbCBoYXMgc2lkZSBlZmZlY3RzLgorICAgIGJvb2wgSGFzU2lkZUVmZmVjdHM7CisKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhlIGV2YWx1YXRpb24gaGl0IHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICAvLy8gRm9yIGV4YW1wbGUsIDEuMCAvIDAuMCBjYW4gYmUgZm9sZGVkIHRvIEluZiwgYnV0IGhhcyB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgLy8vIExpa2V3aXNlLCBJTlRfTUFYICsgMSBjYW4gYmUgZm9sZGVkIHRvIElOVF9NSU4sIGJ1dCBoYXMgVUIuCisgICAgYm9vbCBIYXNVbmRlZmluZWRCZWhhdmlvcjsKKworICAgIC8vLyBEaWFnIC0gSWYgdGhpcyBpcyBub24tbnVsbCwgaXQgd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCBhIHN0YWNrIG9mIG5vdGVzCisgICAgLy8vIGluZGljYXRpbmcgd2h5IGV2YWx1YXRpb24gZmFpbGVkIChvciB3aHkgaXQgZmFpbGVkIHRvIHByb2R1Y2UgYSBjb25zdGFudAorICAgIC8vLyBleHByZXNzaW9uKS4KKyAgICAvLy8gSWYgdGhlIGV4cHJlc3Npb24gaXMgdW5mb2xkYWJsZSwgdGhlIG5vdGVzIHdpbGwgaW5kaWNhdGUgd2h5IGl0J3Mgbm90CisgICAgLy8vIGZvbGRhYmxlLiBJZiB0aGUgZXhwcmVzc2lvbiBpcyBmb2xkYWJsZSwgYnV0IG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24sCisgICAgLy8vIHRoZSBub3RlcyB3aWxsIGRlc2NyaWJlcyB3aHkgaXQgaXNuJ3QgYSBjb25zdGFudCBleHByZXNzaW9uLiBJZiB0aGUKKyAgICAvLy8gZXhwcmVzc2lvbiAqaXMqIGEgY29uc3RhbnQgZXhwcmVzc2lvbiwgbm8gbm90ZXMgd2lsbCBiZSBwcm9kdWNlZC4KKyAgICBTbWFsbFZlY3RvckltcGw8UGFydGlhbERpYWdub3N0aWNBdD4gKkRpYWc7CisKKyAgICBFdmFsU3RhdHVzKCkKKyAgICAgICAgOiBIYXNTaWRlRWZmZWN0cyhmYWxzZSksIEhhc1VuZGVmaW5lZEJlaGF2aW9yKGZhbHNlKSwgRGlhZyhudWxscHRyKSB7fQorCisgICAgLy8gaGFzU2lkZUVmZmVjdHMgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXZhbHVhdGVkIGV4cHJlc3Npb24gaGFzCisgICAgLy8gc2lkZSBlZmZlY3RzLgorICAgIGJvb2wgaGFzU2lkZUVmZmVjdHMoKSBjb25zdCB7CisgICAgICByZXR1cm4gSGFzU2lkZUVmZmVjdHM7CisgICAgfQorICB9OworCisgIC8vLyBFdmFsUmVzdWx0IGlzIGEgc3RydWN0IHdpdGggZGV0YWlsZWQgaW5mbyBhYm91dCBhbiBldmFsdWF0ZWQgZXhwcmVzc2lvbi4KKyAgc3RydWN0IEV2YWxSZXN1bHQgOiBFdmFsU3RhdHVzIHsKKyAgICAvLy8gVmFsIC0gVGhpcyBpcyB0aGUgdmFsdWUgdGhlIGV4cHJlc3Npb24gY2FuIGJlIGZvbGRlZCB0by4KKyAgICBBUFZhbHVlIFZhbDsKKworICAgIC8vIGlzR2xvYmFsTFZhbHVlIC0gUmV0dXJuIHRydWUgaWYgdGhlIGV2YWx1YXRlZCBsdmFsdWUgZXhwcmVzc2lvbgorICAgIC8vIGlzIGdsb2JhbC4KKyAgICBib29sIGlzR2xvYmFsTFZhbHVlKCkgY29uc3Q7CisgIH07CisKKyAgLy8vIEV2YWx1YXRlQXNSVmFsdWUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgY29uc3RhbnQgd2hpY2ggd2UgY2FuIGZvbGQgdG8KKyAgLy8vIGFuIHJ2YWx1ZSB1c2luZyBhbnkgY3JhenkgdGVjaG5pcXVlICh0aGF0IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggbGFuZ3VhZ2UKKyAgLy8vIHN0YW5kYXJkcykgdGhhdCB3ZSB3YW50IHRvLCBldmVuIGlmIHRoZSBleHByZXNzaW9uIGhhcyBzaWRlLWVmZmVjdHMuIElmCisgIC8vLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgaXQgcmV0dXJucyB0aGUgZm9sZGVkIGNvbnN0YW50IGluIFJlc3VsdC4gSWYKKyAgLy8vIHRoZSBleHByZXNzaW9uIGlzIGEgZ2x2YWx1ZSwgYW4gbHZhbHVlLXRvLXJ2YWx1ZSBjb252ZXJzaW9uIHdpbGwgYmUKKyAgLy8vIGFwcGxpZWQuCisgIGJvb2wgRXZhbHVhdGVBc1JWYWx1ZShFdmFsUmVzdWx0ICZSZXN1bHQsIGNvbnN0IEFTVENvbnRleHQgJkN0eCkgY29uc3Q7CisKKyAgLy8vIEV2YWx1YXRlQXNCb29sZWFuQ29uZGl0aW9uIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGNvbnN0YW50CisgIC8vLyB3aGljaCB3ZSB3ZSBjYW4gZm9sZCBhbmQgY29udmVydCB0byBhIGJvb2xlYW4gY29uZGl0aW9uIHVzaW5nCisgIC8vLyBhbnkgY3JhenkgdGVjaG5pcXVlIHRoYXQgd2Ugd2FudCB0bywgZXZlbiBpZiB0aGUgZXhwcmVzc2lvbiBoYXMKKyAgLy8vIHNpZGUtZWZmZWN0cy4KKyAgYm9vbCBFdmFsdWF0ZUFzQm9vbGVhbkNvbmRpdGlvbihib29sICZSZXN1bHQsIGNvbnN0IEFTVENvbnRleHQgJkN0eCkgY29uc3Q7CisKKyAgZW51bSBTaWRlRWZmZWN0c0tpbmQgeworICAgIFNFX05vU2lkZUVmZmVjdHMsICAgICAgICAgIC8vLzwgU3RyaWN0bHkgZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24uCisgICAgU0VfQWxsb3dVbmRlZmluZWRCZWhhdmlvciwgLy8vPCBBbGxvdyBVQiB0aGF0IHdlIGNhbiBnaXZlIGEgdmFsdWUsIGJ1dCBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGFyYml0cmFyeSB1bm1vZGVsZWQgc2lkZSBlZmZlY3RzLgorICAgIFNFX0FsbG93U2lkZUVmZmVjdHMgICAgICAgIC8vLzwgQWxsb3cgYW55IHVubW9kZWxlZCBzaWRlIGVmZmVjdC4KKyAgfTsKKworICAvLy8gRXZhbHVhdGVBc0ludCAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBjb25zdGFudCB3aGljaCB3ZSBjYW4gZm9sZCBhbmQKKyAgLy8vIGNvbnZlcnQgdG8gYW4gaW50ZWdlciwgdXNpbmcgYW55IGNyYXp5IHRlY2huaXF1ZSB0aGF0IHdlIHdhbnQgdG8uCisgIGJvb2wgRXZhbHVhdGVBc0ludChsbHZtOjpBUFNJbnQgJlJlc3VsdCwgY29uc3QgQVNUQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgU2lkZUVmZmVjdHNLaW5kIEFsbG93U2lkZUVmZmVjdHMgPSBTRV9Ob1NpZGVFZmZlY3RzKSBjb25zdDsKKworICAvLy8gRXZhbHVhdGVBc0Zsb2F0IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGNvbnN0YW50IHdoaWNoIHdlIGNhbiBmb2xkIGFuZAorICAvLy8gY29udmVydCB0byBhIGZsb2F0aW5nIHBvaW50IHZhbHVlLCB1c2luZyBhbnkgY3JhenkgdGVjaG5pcXVlIHRoYXQgd2UKKyAgLy8vIHdhbnQgdG8uCisgIGJvb2wKKyAgRXZhbHVhdGVBc0Zsb2F0KGxsdm06OkFQRmxvYXQgJlJlc3VsdCwgY29uc3QgQVNUQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgU2lkZUVmZmVjdHNLaW5kIEFsbG93U2lkZUVmZmVjdHMgPSBTRV9Ob1NpZGVFZmZlY3RzKSBjb25zdDsKKworICAvLy8gaXNFdmFsdWF0YWJsZSAtIENhbGwgRXZhbHVhdGVBc1JWYWx1ZSB0byBzZWUgaWYgdGhpcyBleHByZXNzaW9uIGNhbiBiZQorICAvLy8gY29uc3RhbnQgZm9sZGVkIHdpdGhvdXQgc2lkZS1lZmZlY3RzLCBidXQgZGlzY2FyZCB0aGUgcmVzdWx0LgorICBib29sIGlzRXZhbHVhdGFibGUoY29uc3QgQVNUQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgU2lkZUVmZmVjdHNLaW5kIEFsbG93U2lkZUVmZmVjdHMgPSBTRV9Ob1NpZGVFZmZlY3RzKSBjb25zdDsKKworICAvLy8gSGFzU2lkZUVmZmVjdHMgLSBUaGlzIHJvdXRpbmUgcmV0dXJucyB0cnVlIGZvciBhbGwgdGhvc2UgZXhwcmVzc2lvbnMKKyAgLy8vIHdoaWNoIGhhdmUgYW55IGVmZmVjdCBvdGhlciB0aGFuIHByb2R1Y2luZyBhIHZhbHVlLiBFeGFtcGxlIGlzIGEgZnVuY3Rpb24KKyAgLy8vIGNhbGwsIHZvbGF0aWxlIHZhcmlhYmxlIHJlYWQsIG9yIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4gSWYKKyAgLy8vIEluY2x1ZGVQb3NzaWJsZUVmZmVjdHMgaXMgZmFsc2UsIHRoaXMgY2FsbCB0cmVhdHMgY2VydGFpbiBleHByZXNzaW9ucyB3aXRoCisgIC8vLyBwb3RlbnRpYWwgc2lkZSBlZmZlY3RzIChzdWNoIGFzIGZ1bmN0aW9uIGNhbGwtbGlrZSBleHByZXNzaW9ucywKKyAgLy8vIGluc3RhbnRpYXRpb24tZGVwZW5kZW50IGV4cHJlc3Npb25zLCBvciBpbnZvY2F0aW9ucyBmcm9tIGEgbWFjcm8pIGFzIG5vdAorICAvLy8gaGF2aW5nIHNpZGUgZWZmZWN0cy4KKyAgYm9vbCBIYXNTaWRlRWZmZWN0cyhjb25zdCBBU1RDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlUG9zc2libGVFZmZlY3RzID0gdHJ1ZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGV4cHJlc3Npb24gaW52b2x2ZXMgYSBjYWxsIHRvIGFueSBmdW5jdGlvbgorICAvLy8gdGhhdCBpcyBub3QgdHJpdmlhbC4KKyAgYm9vbCBoYXNOb25Ucml2aWFsQ2FsbChjb25zdCBBU1RDb250ZXh0ICZDdHgpIGNvbnN0OworCisgIC8vLyBFdmFsdWF0ZUtub3duQ29uc3RJbnQgLSBDYWxsIEV2YWx1YXRlQXNSVmFsdWUgYW5kIHJldHVybiB0aGUgZm9sZGVkCisgIC8vLyBpbnRlZ2VyLiBUaGlzIG11c3QgYmUgY2FsbGVkIG9uIGFuIGV4cHJlc3Npb24gdGhhdCBjb25zdGFudCBmb2xkcyB0byBhbgorICAvLy8gaW50ZWdlci4KKyAgbGx2bTo6QVBTSW50IEV2YWx1YXRlS25vd25Db25zdEludChjb25zdCBBU1RDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxQYXJ0aWFsRGlhZ25vc3RpY0F0PiAqRGlhZyA9IG51bGxwdHIpIGNvbnN0OworCisgIHZvaWQgRXZhbHVhdGVGb3JPdmVyZmxvdyhjb25zdCBBU1RDb250ZXh0ICZDdHgpIGNvbnN0OworCisgIC8vLyBFdmFsdWF0ZUFzTFZhbHVlIC0gRXZhbHVhdGUgYW4gZXhwcmVzc2lvbiB0byBzZWUgaWYgd2UgY2FuIGZvbGQgaXQgdG8gYW4KKyAgLy8vIGx2YWx1ZSB3aXRoIGxpbmsgdGltZSBrbm93biBhZGRyZXNzLCB3aXRoIG5vIHNpZGUtZWZmZWN0cy4KKyAgYm9vbCBFdmFsdWF0ZUFzTFZhbHVlKEV2YWxSZXN1bHQgJlJlc3VsdCwgY29uc3QgQVNUQ29udGV4dCAmQ3R4KSBjb25zdDsKKworICAvLy8gRXZhbHVhdGVBc0luaXRpYWxpemVyIC0gRXZhbHVhdGUgYW4gZXhwcmVzc2lvbiBhcyBpZiBpdCB3ZXJlIHRoZQorICAvLy8gaW5pdGlhbGl6ZXIgb2YgdGhlIGdpdmVuIGRlY2xhcmF0aW9uLiBSZXR1cm5zIHRydWUgaWYgdGhlIGluaXRpYWxpemVyCisgIC8vLyBjYW4gYmUgZm9sZGVkIHRvIGEgY29uc3RhbnQsIGFuZCBwcm9kdWNlcyBhbnkgcmVsZXZhbnQgbm90ZXMuIEluIEMrKzExLAorICAvLy8gbm90ZXMgd2lsbCBiZSBwcm9kdWNlZCBpZiB0aGUgZXhwcmVzc2lvbiBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uLgorICBib29sIEV2YWx1YXRlQXNJbml0aWFsaXplcihBUFZhbHVlICZSZXN1bHQsIGNvbnN0IEFTVENvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFyRGVjbCAqVkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxQYXJ0aWFsRGlhZ25vc3RpY0F0PiAmTm90ZXMpIGNvbnN0OworCisgIC8vLyBFdmFsdWF0ZVdpdGhTdWJzdGl0dXRpb24gLSBFdmFsdWF0ZSBhbiBleHByZXNzaW9uIGFzIGlmIGZyb20gdGhlIGNvbnRleHQKKyAgLy8vIG9mIGEgY2FsbCB0byB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLCBpbnNpZGUgYW4KKyAgLy8vIHVuZXZhbHVhdGVkIGNvbnRleHQuIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXhwcmVzc2lvbiBjb3VsZCBiZSBmb2xkZWQgdG8gYQorICAvLy8gY29uc3RhbnQuCisgIGJvb2wgRXZhbHVhdGVXaXRoU3Vic3RpdHV0aW9uKEFQVmFsdWUgJlZhbHVlLCBBU1RDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqQ2FsbGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBFeHByKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqVGhpcyA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgSWYgdGhlIGN1cnJlbnQgRXhwciBpcyBhIHBvaW50ZXIsIHRoaXMgd2lsbCB0cnkgdG8gc3RhdGljYWxseQorICAvLy8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIHdoZXJlIHRoZSBwb2ludGVyIGlzIHBvaW50aW5nLgorICAvLy8gUmV0dXJucyB0cnVlIGlmIGFsbCBvZiB0aGUgYWJvdmUgaG9sZHMgYW5kIHdlIHdlcmUgYWJsZSB0byBmaWd1cmUgb3V0IHRoZQorICAvLy8gc2l6ZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUeXBlIC0gSG93IHRvIGV2YWx1YXRlIHRoZSBzaXplIG9mIHRoZSBFeHByLCBhcyBkZWZpbmVkIGJ5IHRoZQorICAvLy8gInR5cGUiIHBhcmFtZXRlciBvZiBfX2J1aWx0aW5fb2JqZWN0X3NpemUKKyAgYm9vbCB0cnlFdmFsdWF0ZU9iamVjdFNpemUodWludDY0X3QgJlJlc3VsdCwgQVNUQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUeXBlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEVudW1lcmF0aW9uIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGtpbmQgb2YgTnVsbCBwb2ludGVyIGNvbnN0YW50CisgIC8vLyByZXR1cm5lZCBmcm9tIFxjIGlzTnVsbFBvaW50ZXJDb25zdGFudCgpLgorICBlbnVtIE51bGxQb2ludGVyQ29uc3RhbnRLaW5kIHsKKyAgICAvLy8gXGJyaWVmIEV4cHJlc3Npb24gaXMgbm90IGEgTnVsbCBwb2ludGVyIGNvbnN0YW50LgorICAgIE5QQ0tfTm90TnVsbCA9IDAsCisKKyAgICAvLy8gXGJyaWVmIEV4cHJlc3Npb24gaXMgYSBOdWxsIHBvaW50ZXIgY29uc3RhbnQgYnVpbHQgZnJvbSBhIHplcm8gaW50ZWdlcgorICAgIC8vLyBleHByZXNzaW9uIHRoYXQgaXMgbm90IGEgc2ltcGxlLCBwb3NzaWJseSBwYXJlbnRoZXNpemVkLCB6ZXJvIGxpdGVyYWwuCisgICAgLy8vIEMrKyBDb3JlIElzc3VlIDkwMyB3aWxsIGNsYXNzaWZ5IHRoZXNlIGV4cHJlc3Npb25zIGFzICJub3QgcG9pbnRlcnMiCisgICAgLy8vIG9uY2UgaXQgaXMgYWRvcHRlZC4KKyAgICAvLy8gaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjOTAzCisgICAgTlBDS19aZXJvRXhwcmVzc2lvbiwKKworICAgIC8vLyBcYnJpZWYgRXhwcmVzc2lvbiBpcyBhIE51bGwgcG9pbnRlciBjb25zdGFudCBidWlsdCBmcm9tIGEgbGl0ZXJhbCB6ZXJvLgorICAgIE5QQ0tfWmVyb0xpdGVyYWwsCisKKyAgICAvLy8gXGJyaWVmIEV4cHJlc3Npb24gaXMgYSBDKysxMSBudWxscHRyLgorICAgIE5QQ0tfQ1hYMTFfbnVsbHB0ciwKKworICAgIC8vLyBcYnJpZWYgRXhwcmVzc2lvbiBpcyBhIEdOVS1zdHlsZSBfX251bGwgY29uc3RhbnQuCisgICAgTlBDS19HTlVOdWxsCisgIH07CisKKyAgLy8vIFxicmllZiBFbnVtZXJhdGlvbiB1c2VkIHRvIGRlc2NyaWJlIGhvdyBcYyBpc051bGxQb2ludGVyQ29uc3RhbnQoKQorICAvLy8gc2hvdWxkIGNvcGUgd2l0aCB2YWx1ZS1kZXBlbmRlbnQgZXhwcmVzc2lvbnMuCisgIGVudW0gTnVsbFBvaW50ZXJDb25zdGFudFZhbHVlRGVwZW5kZW5jZSB7CisgICAgLy8vIFxicmllZiBTcGVjaWZpZXMgdGhhdCB0aGUgZXhwcmVzc2lvbiBzaG91bGQgbmV2ZXIgYmUgdmFsdWUtZGVwZW5kZW50LgorICAgIE5QQ19OZXZlclZhbHVlRGVwZW5kZW50ID0gMCwKKworICAgIC8vLyBcYnJpZWYgU3BlY2lmaWVzIHRoYXQgYSB2YWx1ZS1kZXBlbmRlbnQgZXhwcmVzc2lvbiBvZiBpbnRlZ3JhbCBvcgorICAgIC8vLyBkZXBlbmRlbnQgdHlwZSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIG51bGwgcG9pbnRlciBjb25zdGFudC4KKyAgICBOUENfVmFsdWVEZXBlbmRlbnRJc051bGwsCisKKyAgICAvLy8gXGJyaWVmIFNwZWNpZmllcyB0aGF0IGEgdmFsdWUtZGVwZW5kZW50IGV4cHJlc3Npb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQKKyAgICAvLy8gdG8gbmV2ZXIgYmUgYSBudWxsIHBvaW50ZXIgY29uc3RhbnQuCisgICAgTlBDX1ZhbHVlRGVwZW5kZW50SXNOb3ROdWxsCisgIH07CisKKyAgLy8vIGlzTnVsbFBvaW50ZXJDb25zdGFudCAtIEM5OSA2LjMuMi4zcDMgLSBUZXN0IGlmIHRoaXMgcmVkdWNlcyBkb3duIHRvCisgIC8vLyBhIE51bGwgcG9pbnRlciBjb25zdGFudC4gVGhlIHJldHVybiB2YWx1ZSBjYW4gZnVydGhlciBkaXN0aW5ndWlzaCB0aGUKKyAgLy8vIGtpbmQgb2YgTlVMTCBwb2ludGVyIGNvbnN0YW50IHRoYXQgd2FzIGRldGVjdGVkLgorICBOdWxsUG9pbnRlckNvbnN0YW50S2luZCBpc051bGxQb2ludGVyQ29uc3RhbnQoCisgICAgICBBU1RDb250ZXh0ICZDdHgsCisgICAgICBOdWxsUG9pbnRlckNvbnN0YW50VmFsdWVEZXBlbmRlbmNlIE5QQykgY29uc3Q7CisKKyAgLy8vIGlzT0JKQ0dDQ2FuZGlkYXRlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBleHByZXNzaW9uIG1heSBiZSB1c2VkIGluIGEgcmVhZC8KKyAgLy8vIHdyaXRlIGJhcnJpZXIuCisgIGJvb2wgaXNPQkpDR0NDYW5kaWRhdGUoQVNUQ29udGV4dCAmQ3R4KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGV4cHJlc3Npb24gaXMgYSBib3VuZCBtZW1iZXIgZnVuY3Rpb24uCisgIGJvb2wgaXNCb3VuZE1lbWJlckZ1bmN0aW9uKEFTVENvbnRleHQgJkN0eCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHaXZlbiBhbiBleHByZXNzaW9uIG9mIGJvdW5kLW1lbWJlciB0eXBlLCBmaW5kIHRoZSB0eXBlCisgIC8vLyBvZiB0aGUgbWVtYmVyLiAgUmV0dXJucyBudWxsIGlmIHRoaXMgaXMgYW4gKm92ZXJsb2FkZWQqIGJvdW5kCisgIC8vLyBtZW1iZXIgZXhwcmVzc2lvbi4KKyAgc3RhdGljIFF1YWxUeXBlIGZpbmRCb3VuZE1lbWJlclR5cGUoY29uc3QgRXhwciAqZXhwcik7CisKKyAgLy8vIElnbm9yZUltcENhc3RzIC0gU2tpcCBwYXN0IGFueSBpbXBsaWNpdCBjYXN0cyB3aGljaCBtaWdodAorICAvLy8gc3Vycm91bmQgdGhpcyBleHByZXNzaW9uLiAgT25seSBza2lwcyBJbXBsaWNpdENhc3RFeHBycy4KKyAgRXhwciAqSWdub3JlSW1wQ2FzdHMoKSBMTFZNX1JFQURPTkxZOworCisgIC8vLyBJZ25vcmVJbXBsaWNpdCAtIFNraXAgcGFzdCBhbnkgaW1wbGljaXQgQVNUIG5vZGVzIHdoaWNoIG1pZ2h0CisgIC8vLyBzdXJyb3VuZCB0aGlzIGV4cHJlc3Npb24uCisgIEV4cHIgKklnbm9yZUltcGxpY2l0KCkgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGNhc3Q8RXhwcj4oU3RtdDo6SWdub3JlSW1wbGljaXQoKSk7CisgIH0KKworICBjb25zdCBFeHByICpJZ25vcmVJbXBsaWNpdCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEV4cHIqPih0aGlzKS0+SWdub3JlSW1wbGljaXQoKTsKKyAgfQorCisgIC8vLyBJZ25vcmVQYXJlbnMgLSBJZ25vcmUgcGFyZW50aGVzZXMuICBJZiB0aGlzIEV4cHIgaXMgYSBQYXJlbkV4cHIsIHJldHVybgorICAvLy8gIGl0cyBzdWJleHByZXNzaW9uLiAgSWYgdGhhdCBzdWJleHByZXNzaW9uIGlzIGFsc28gYSBQYXJlbkV4cHIsCisgIC8vLyAgdGhlbiB0aGlzIG1ldGhvZCByZWN1cnNpdmVseSByZXR1cm5zIGl0cyBzdWJleHByZXNzaW9uLCBhbmQgc28gZm9ydGguCisgIC8vLyAgT3RoZXJ3aXNlLCB0aGUgbWV0aG9kIHJldHVybnMgdGhlIGN1cnJlbnQgRXhwci4KKyAgRXhwciAqSWdub3JlUGFyZW5zKCkgTExWTV9SRUFET05MWTsKKworICAvLy8gSWdub3JlUGFyZW5DYXN0cyAtIElnbm9yZSBwYXJlbnRoZXNlcyBhbmQgY2FzdHMuICBTdHJpcCBvZmYgYW55IFBhcmVuRXhwcgorICAvLy8gb3IgQ2FzdEV4cHJzLCByZXR1cm5pbmcgdGhlaXIgb3BlcmFuZC4KKyAgRXhwciAqSWdub3JlUGFyZW5DYXN0cygpIExMVk1fUkVBRE9OTFk7CisKKyAgLy8vIElnbm9yZSBjYXN0cy4gIFN0cmlwIG9mZiBhbnkgQ2FzdEV4cHJzLCByZXR1cm5pbmcgdGhlaXIgb3BlcmFuZC4KKyAgRXhwciAqSWdub3JlQ2FzdHMoKSBMTFZNX1JFQURPTkxZOworCisgIC8vLyBJZ25vcmVQYXJlbkltcENhc3RzIC0gSWdub3JlIHBhcmVudGhlc2VzIGFuZCBpbXBsaWNpdCBjYXN0cy4gIFN0cmlwIG9mZgorICAvLy8gYW55IFBhcmVuRXhwciBvciBJbXBsaWNpdENhc3RFeHBycywgcmV0dXJuaW5nIHRoZWlyIG9wZXJhbmQuCisgIEV4cHIgKklnbm9yZVBhcmVuSW1wQ2FzdHMoKSBMTFZNX1JFQURPTkxZOworCisgIC8vLyBJZ25vcmVDb252ZXJzaW9uT3BlcmF0b3IgLSBJZ25vcmUgY29udmVyc2lvbiBvcGVyYXRvci4gSWYgdGhpcyBFeHByIGlzIGEKKyAgLy8vIGNhbGwgdG8gYSBjb252ZXJzaW9uIG9wZXJhdG9yLCByZXR1cm4gdGhlIGFyZ3VtZW50LgorICBFeHByICpJZ25vcmVDb252ZXJzaW9uT3BlcmF0b3IoKSBMTFZNX1JFQURPTkxZOworCisgIGNvbnN0IEV4cHIgKklnbm9yZUNvbnZlcnNpb25PcGVyYXRvcigpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEV4cHIqPih0aGlzKS0+SWdub3JlQ29udmVyc2lvbk9wZXJhdG9yKCk7CisgIH0KKworICBjb25zdCBFeHByICpJZ25vcmVQYXJlbkltcENhc3RzKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwcio+KHRoaXMpLT5JZ25vcmVQYXJlbkltcENhc3RzKCk7CisgIH0KKworICAvLy8gSWdub3JlIHBhcmVudGhlc2VzIGFuZCBsdmFsdWUgY2FzdHMuICBTdHJpcCBvZmYgYW55IFBhcmVuRXhwciBhbmQKKyAgLy8vIENhc3RFeHBycyB0aGF0IHJlcHJlc2VudCBsdmFsdWUgY2FzdHMsIHJldHVybmluZyB0aGVpciBvcGVyYW5kLgorICBFeHByICpJZ25vcmVQYXJlbkxWYWx1ZUNhc3RzKCkgTExWTV9SRUFET05MWTsKKworICBjb25zdCBFeHByICpJZ25vcmVQYXJlbkxWYWx1ZUNhc3RzKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwcio+KHRoaXMpLT5JZ25vcmVQYXJlbkxWYWx1ZUNhc3RzKCk7CisgIH0KKworICAvLy8gSWdub3JlUGFyZW5Ob29wQ2FzdHMgLSBJZ25vcmUgcGFyZW50aGVzZXMgYW5kIGNhc3RzIHRoYXQgZG8gbm90IGNoYW5nZSB0aGUKKyAgLy8vIHZhbHVlIChpbmNsdWRpbmcgcHRyLT5pbnQgY2FzdHMgb2YgdGhlIHNhbWUgc2l6ZSkuICBTdHJpcCBvZmYgYW55CisgIC8vLyBQYXJlbkV4cHIgb3IgQ2FzdEV4cHJzLCByZXR1cm5pbmcgdGhlaXIgb3BlcmFuZC4KKyAgRXhwciAqSWdub3JlUGFyZW5Ob29wQ2FzdHMoQVNUQ29udGV4dCAmQ3R4KSBMTFZNX1JFQURPTkxZOworCisgIC8vLyBJZ25vcmUgcGFyZW50aGVzZXMgYW5kIGRlcml2ZWQtdG8tYmFzZSBjYXN0cy4KKyAgRXhwciAqaWdub3JlUGFyZW5CYXNlQ2FzdHMoKSBMTFZNX1JFQURPTkxZOworCisgIGNvbnN0IEV4cHIgKmlnbm9yZVBhcmVuQmFzZUNhc3RzKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwcio+KHRoaXMpLT5pZ25vcmVQYXJlbkJhc2VDYXN0cygpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGV4cHJlc3Npb24gaXMgYSBkZWZhdWx0IGZ1bmN0aW9uIGFyZ3VtZW50LgorICAvLy8KKyAgLy8vIERlZmF1bHQgYXJndW1lbnRzIGFyZSBpbXBsaWNpdGx5IGdlbmVyYXRlZCBpbiB0aGUgYWJzdHJhY3Qgc3ludGF4IHRyZWUKKyAgLy8vIGJ5IHNlbWFudGljIGFuYWx5c2lzIGZvciBmdW5jdGlvbiBjYWxscywgb2JqZWN0IGNvbnN0cnVjdGlvbnMsIGV0Yy4gaW4KKyAgLy8vIEMrKy4gRGVmYXVsdCBhcmd1bWVudHMgYXJlIHJlcHJlc2VudGVkIGJ5IFxjIENYWERlZmF1bHRBcmdFeHByIG5vZGVzOworICAvLy8gdGhpcyByb3V0aW5lIGFsc28gbG9va3MgdGhyb3VnaCBhbnkgaW1wbGljaXQgY2FzdHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKKyAgLy8vIHRoZSBleHByZXNzaW9uIGlzIGEgZGVmYXVsdCBhcmd1bWVudC4KKyAgYm9vbCBpc0RlZmF1bHRBcmd1bWVudCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJlc3VsdCBvZiB0aGlzIGV4cHJlc3Npb24gaXMgYQorICAvLy8gdGVtcG9yYXJ5IG9iamVjdCBvZiB0aGUgZ2l2ZW4gY2xhc3MgdHlwZS4KKyAgYm9vbCBpc1RlbXBvcmFyeU9iamVjdChBU1RDb250ZXh0ICZDdHgsIGNvbnN0IENYWFJlY29yZERlY2wgKlRlbXBUeSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgZXhwcmVzc2lvbiBpcyBhbiBpbXBsaWNpdCByZWZlcmVuY2UgdG8gJ3RoaXMnIGluIEMrKy4KKyAgYm9vbCBpc0ltcGxpY2l0Q1hYVGhpcygpIGNvbnN0OworCisgIGNvbnN0IEV4cHIgKklnbm9yZUltcENhc3RzKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwcio+KHRoaXMpLT5JZ25vcmVJbXBDYXN0cygpOworICB9CisgIGNvbnN0IEV4cHIgKklnbm9yZVBhcmVucygpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEV4cHIqPih0aGlzKS0+SWdub3JlUGFyZW5zKCk7CisgIH0KKyAgY29uc3QgRXhwciAqSWdub3JlUGFyZW5DYXN0cygpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEV4cHIqPih0aGlzKS0+SWdub3JlUGFyZW5DYXN0cygpOworICB9CisgIC8vLyBTdHJpcCBvZmYgY2FzdHMsIGJ1dCBrZWVwIHBhcmVudGhlc2VzLgorICBjb25zdCBFeHByICpJZ25vcmVDYXN0cygpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEV4cHIqPih0aGlzKS0+SWdub3JlQ2FzdHMoKTsKKyAgfQorCisgIGNvbnN0IEV4cHIgKklnbm9yZVBhcmVuTm9vcENhc3RzKEFTVENvbnRleHQgJkN0eCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwcio+KHRoaXMpLT5JZ25vcmVQYXJlbk5vb3BDYXN0cyhDdHgpOworICB9CisKKyAgc3RhdGljIGJvb2wgaGFzQW55VHlwZURlcGVuZGVudEFyZ3VtZW50cyhBcnJheVJlZjxFeHByICo+IEV4cHJzKTsKKworICAvLy8gXGJyaWVmIEZvciBhbiBleHByZXNzaW9uIG9mIGNsYXNzIHR5cGUgb3IgcG9pbnRlciB0byBjbGFzcyB0eXBlLAorICAvLy8gcmV0dXJuIHRoZSBtb3N0IGRlcml2ZWQgY2xhc3MgZGVjbCB0aGUgZXhwcmVzc2lvbiBpcyBrbm93biB0byByZWZlciB0by4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIGV4cHJlc3Npb24gaXMgYSBjYXN0LCB0aGlzIG1ldGhvZCBsb29rcyB0aHJvdWdoIGl0IHRvIGZpbmQgdGhlCisgIC8vLyBtb3N0IGRlcml2ZWQgZGVjbCB0aGF0IGNhbiBiZSBpbmZlcnJlZCBmcm9tIHRoZSBleHByZXNzaW9uLgorICAvLy8gVGhpcyBpcyB2YWxpZCBiZWNhdXNlIGRlcml2ZWQtdG8tYmFzZSBjb252ZXJzaW9ucyBoYXZlIHVuZGVmaW5lZAorICAvLy8gYmVoYXZpb3IgaWYgdGhlIG9iamVjdCBpc24ndCBkeW5hbWljYWxseSBvZiB0aGUgZGVyaXZlZCB0eXBlLgorICBjb25zdCBDWFhSZWNvcmREZWNsICpnZXRCZXN0RHluYW1pY0NsYXNzVHlwZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBpbm5lciBleHByZXNzaW9uIHRoYXQgZGV0ZXJtaW5lcyB0aGUgYmVzdCBkeW5hbWljIGNsYXNzLgorICAvLy8gSWYgdGhpcyBpcyBhIHBydmFsdWUsIHdlIGd1YXJhbnRlZSB0aGF0IGl0IGlzIG9mIHRoZSBtb3N0LWRlcml2ZWQgdHlwZQorICAvLy8gZm9yIHRoZSBvYmplY3QgaXRzZWxmLgorICBjb25zdCBFeHByICpnZXRCZXN0RHluYW1pY0NsYXNzVHlwZUV4cHIoKSBjb25zdDsKKworICAvLy8gV2FsayBvdXR3YXJkcyBmcm9tIGFuIGV4cHJlc3Npb24gd2Ugd2FudCB0byBiaW5kIGEgcmVmZXJlbmNlIHRvIGFuZAorICAvLy8gZmluZCB0aGUgZXhwcmVzc2lvbiB3aG9zZSBsaWZldGltZSBuZWVkcyB0byBiZSBleHRlbmRlZC4gUmVjb3JkCisgIC8vLyB0aGUgTEhTcyBvZiBjb21tYSBleHByZXNzaW9ucyBhbmQgYWRqdXN0bWVudHMgbmVlZGVkIGFsb25nIHRoZSBwYXRoLgorICBjb25zdCBFeHByICpza2lwUlZhbHVlU3Vib2JqZWN0QWRqdXN0bWVudHMoCisgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgRXhwciAqPiAmQ29tbWFMSFMsCisgICAgICBTbWFsbFZlY3RvckltcGw8U3Vib2JqZWN0QWRqdXN0bWVudD4gJkFkanVzdG1lbnRzKSBjb25zdDsKKyAgY29uc3QgRXhwciAqc2tpcFJWYWx1ZVN1Ym9iamVjdEFkanVzdG1lbnRzKCkgY29uc3QgeworICAgIFNtYWxsVmVjdG9yPGNvbnN0IEV4cHIgKiwgOD4gQ29tbWFMSFNzOworICAgIFNtYWxsVmVjdG9yPFN1Ym9iamVjdEFkanVzdG1lbnQsIDg+IEFkanVzdG1lbnRzOworICAgIHJldHVybiBza2lwUlZhbHVlU3Vib2JqZWN0QWRqdXN0bWVudHMoQ29tbWFMSFNzLCBBZGp1c3RtZW50cyk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPj0gZmlyc3RFeHByQ29uc3RhbnQgJiYKKyAgICAgICAgICAgVC0+Z2V0U3RtdENsYXNzKCkgPD0gbGFzdEV4cHJDb25zdGFudDsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFByaW1hcnkgRXhwcmVzc2lvbnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gT3BhcXVlVmFsdWVFeHByIC0gQW4gZXhwcmVzc2lvbiByZWZlcnJpbmcgdG8gYW4gb3BhcXVlIG9iamVjdCBvZiBhCisvLy8gZml4ZWQgdHlwZSBhbmQgdmFsdWUgY2xhc3MuICBUaGVzZSBkb24ndCBjb3JyZXNwb25kIHRvIGNvbmNyZXRlCisvLy8gc3ludGF4OyBpbnN0ZWFkIHRoZXkncmUgdXNlZCB0byBleHByZXNzIG9wZXJhdGlvbnMgKHVzdWFsbHkgY29weQorLy8vIG9wZXJhdGlvbnMpIG9uIHZhbHVlcyB3aG9zZSBzb3VyY2UgaXMgZ2VuZXJhbGx5IG9idmlvdXMgZnJvbQorLy8vIGNvbnRleHQuCitjbGFzcyBPcGFxdWVWYWx1ZUV4cHIgOiBwdWJsaWMgRXhwciB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICBFeHByICpTb3VyY2VFeHByOworICBTb3VyY2VMb2NhdGlvbiBMb2M7CisKK3B1YmxpYzoKKyAgT3BhcXVlVmFsdWVFeHByKFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCwgRXhwclZhbHVlS2luZCBWSywKKyAgICAgICAgICAgICAgICAgIEV4cHJPYmplY3RLaW5kIE9LID0gT0tfT3JkaW5hcnksCisgICAgICAgICAgICAgICAgICBFeHByICpTb3VyY2VFeHByID0gbnVsbHB0cikKKyAgICA6IEV4cHIoT3BhcXVlVmFsdWVFeHByQ2xhc3MsIFQsIFZLLCBPSywKKyAgICAgICAgICAgVC0+aXNEZXBlbmRlbnRUeXBlKCkgfHwKKyAgICAgICAgICAgKFNvdXJjZUV4cHIgJiYgU291cmNlRXhwci0+aXNUeXBlRGVwZW5kZW50KCkpLAorICAgICAgICAgICBULT5pc0RlcGVuZGVudFR5cGUoKSB8fCAKKyAgICAgICAgICAgKFNvdXJjZUV4cHIgJiYgU291cmNlRXhwci0+aXNWYWx1ZURlcGVuZGVudCgpKSwKKyAgICAgICAgICAgVC0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpIHx8CisgICAgICAgICAgIChTb3VyY2VFeHByICYmIFNvdXJjZUV4cHItPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpKSwKKyAgICAgICAgICAgZmFsc2UpLAorICAgICAgU291cmNlRXhwcihTb3VyY2VFeHByKSwgTG9jKExvYykgeworICAgIHNldElzVW5pcXVlKGZhbHNlKTsKKyAgfQorCisgIC8vLyBHaXZlbiBhbiBleHByZXNzaW9uIHdoaWNoIGludm9rZXMgYSBjb3B5IGNvbnN0cnVjdG9yIC0tLSBpLmUuICBhCisgIC8vLyBDWFhDb25zdHJ1Y3RFeHByLCBwb3NzaWJseSB3cmFwcGVkIGluIGFuIEV4cHJXaXRoQ2xlYW51cHMgLS0tCisgIC8vLyBmaW5kIHRoZSBPcGFxdWVWYWx1ZUV4cHIgdGhhdCdzIHRoZSBzb3VyY2Ugb2YgdGhlIGNvbnN0cnVjdGlvbi4KKyAgc3RhdGljIGNvbnN0IE9wYXF1ZVZhbHVlRXhwciAqZmluZEluQ29weUNvbnN0cnVjdChjb25zdCBFeHByICpleHByKTsKKworICBleHBsaWNpdCBPcGFxdWVWYWx1ZUV4cHIoRW1wdHlTaGVsbCBFbXB0eSkKKyAgICA6IEV4cHIoT3BhcXVlVmFsdWVFeHByQ2xhc3MsIEVtcHR5KSB7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGV4cHJlc3Npb24uCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gU291cmNlRXhwciA/IFNvdXJjZUV4cHItPmdldExvY1N0YXJ0KCkgOiBMb2M7CisgIH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIFNvdXJjZUV4cHIgPyBTb3VyY2VFeHByLT5nZXRMb2NFbmQoKSA6IExvYzsKKyAgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRFeHByTG9jKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgaWYgKFNvdXJjZUV4cHIpIHJldHVybiBTb3VyY2VFeHByLT5nZXRFeHByTG9jKCk7CisgICAgcmV0dXJuIExvYzsKKyAgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorCisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jaGlsZF9yYW5nZShjb25zdF9jaGlsZF9pdGVyYXRvcigpLCBjb25zdF9jaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorCisgIC8vLyBUaGUgc291cmNlIGV4cHJlc3Npb24gb2YgYW4gb3BhcXVlIHZhbHVlIGV4cHJlc3Npb24gaXMgdGhlCisgIC8vLyBleHByZXNzaW9uIHdoaWNoIG9yaWdpbmFsbHkgZ2VuZXJhdGVkIHRoZSB2YWx1ZS4gIFRoaXMgaXMKKyAgLy8vIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2UgZm9yIGFuYWx5c2VzIHRoYXQgZG9uJ3Qgd2lzaCB0bworICAvLy8gcHJlY2lzZWx5IG1vZGVsIHRoZSBleGVjdXRpb24gYmVoYXZpb3Igb2YgdGhlIHByb2dyYW0uCisgIC8vLworICAvLy8gVGhlIHNvdXJjZSBleHByZXNzaW9uIGlzIHR5cGljYWxseSBzZXQgd2hlbiBidWlsZGluZyB0aGUKKyAgLy8vIGV4cHJlc3Npb24gd2hpY2ggYmluZHMgdGhlIG9wYXF1ZSB2YWx1ZSBleHByZXNzaW9uIGluIHRoZSBmaXJzdAorICAvLy8gcGxhY2UuCisgIEV4cHIgKmdldFNvdXJjZUV4cHIoKSBjb25zdCB7IHJldHVybiBTb3VyY2VFeHByOyB9CisKKyAgdm9pZCBzZXRJc1VuaXF1ZShib29sIFYpIHsKKyAgICBhc3NlcnQoKCFWIHx8IFNvdXJjZUV4cHIpICYmCisgICAgICAgICAgICJ1bmlxdWUgT1ZFcyBhcmUgZXhwZWN0ZWQgdG8gaGF2ZSBzb3VyY2UgZXhwcmVzc2lvbnMiKTsKKyAgICBPcGFxdWVWYWx1ZUV4cHJCaXRzLklzVW5pcXVlID0gVjsKKyAgfQorCisgIGJvb2wgaXNVbmlxdWUoKSBjb25zdCB7IHJldHVybiBPcGFxdWVWYWx1ZUV4cHJCaXRzLklzVW5pcXVlOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9wYXF1ZVZhbHVlRXhwckNsYXNzOworICB9Cit9OworCisvLy8gXGJyaWVmIEEgcmVmZXJlbmNlIHRvIGEgZGVjbGFyZWQgdmFyaWFibGUsIGZ1bmN0aW9uLCBlbnVtLCBldGMuCisvLy8gW0M5OSA2LjUuMXAyXQorLy8vCisvLy8gVGhpcyBlbmNvZGVzIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgaG93IGEgZGVjbGFyYXRpb24gaXMgcmVmZXJlbmNlZAorLy8vIHdpdGhpbiBhbiBleHByZXNzaW9uLgorLy8vCisvLy8gVGhlcmUgYXJlIHNldmVyYWwgb3B0aW9uYWwgY29uc3RydWN0cyBhdHRhY2hlZCB0byBEZWNsUmVmRXhwcnMgb25seSB3aGVuCisvLy8gdGhleSBhcHBseSBpbiBvcmRlciB0byBjb25zZXJ2ZSBtZW1vcnkuIFRoZXNlIGFyZSBsYWlkIG91dCBwYXN0IHRoZSBlbmQgb2YKKy8vLyB0aGUgb2JqZWN0LCBhbmQgZmxhZ3MgaW4gdGhlIERlY2xSZWZFeHByQml0ZmllbGQgdHJhY2sgd2hldGhlciB0aGV5IGV4aXN0OgorLy8vCisvLy8gICBEZWNsUmVmRXhwckJpdHMuSGFzUXVhbGlmaWVyOgorLy8vICAgICAgIFNwZWNpZmllcyB3aGVuIHRoaXMgZGVjbGFyYXRpb24gcmVmZXJlbmNlIGV4cHJlc3Npb24gaGFzIGEgQysrCisvLy8gICAgICAgbmVzdGVkLW5hbWUtc3BlY2lmaWVyLgorLy8vICAgRGVjbFJlZkV4cHJCaXRzLkhhc0ZvdW5kRGVjbDoKKy8vLyAgICAgICBTcGVjaWZpZXMgd2hlbiB0aGlzIGRlY2xhcmF0aW9uIHJlZmVyZW5jZSBleHByZXNzaW9uIGhhcyBhIHJlY29yZCBvZgorLy8vICAgICAgIGEgTmFtZWREZWNsIChkaWZmZXJlbnQgZnJvbSB0aGUgcmVmZXJlbmNlZCBWYWx1ZURlY2wpIHdoaWNoIHdhcyBmb3VuZAorLy8vICAgICAgIGR1cmluZyBuYW1lIGxvb2t1cCBhbmQvb3Igb3ZlcmxvYWQgcmVzb2x1dGlvbi4KKy8vLyAgIERlY2xSZWZFeHByQml0cy5IYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm86CisvLy8gICAgICAgU3BlY2lmaWVzIHdoZW4gdGhpcyBkZWNsYXJhdGlvbiByZWZlcmVuY2UgZXhwcmVzc2lvbiBoYXMgYW4gZXhwbGljaXQKKy8vLyAgICAgICBDKysgdGVtcGxhdGUga2V5d29yZCBhbmQvb3IgdGVtcGxhdGUgYXJndW1lbnQgbGlzdC4KKy8vLyAgIERlY2xSZWZFeHByQml0cy5SZWZlcnNUb0VuY2xvc2luZ1ZhcmlhYmxlT3JDYXB0dXJlCisvLy8gICAgICAgU3BlY2lmaWVzIHdoZW4gdGhpcyBkZWNsYXJhdGlvbiByZWZlcmVuY2UgZXhwcmVzc2lvbiAodmFsaWRseSkKKy8vLyAgICAgICByZWZlcnMgdG8gYW4gZW5jbG9zZWQgbG9jYWwgb3IgYSBjYXB0dXJlZCB2YXJpYWJsZS4KK2NsYXNzIERlY2xSZWZFeHByIGZpbmFsCisgICAgOiBwdWJsaWMgRXhwciwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPERlY2xSZWZFeHByLCBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICosIEFTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJndW1lbnRMb2M+IHsKKyAgLy8vIFxicmllZiBUaGUgZGVjbGFyYXRpb24gdGhhdCB3ZSBhcmUgcmVmZXJlbmNpbmcuCisgIFZhbHVlRGVjbCAqRDsKKworICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgZGVjbGFyYXRpb24gbmFtZSBpdHNlbGYuCisgIFNvdXJjZUxvY2F0aW9uIExvYzsKKworICAvLy8gXGJyaWVmIFByb3ZpZGVzIHNvdXJjZS90eXBlIGxvY2F0aW9uIGluZm8gZm9yIHRoZSBkZWNsYXJhdGlvbiBuYW1lCisgIC8vLyBlbWJlZGRlZCBpbiBELgorICBEZWNsYXJhdGlvbk5hbWVMb2MgRE5Mb2M7CisKKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPE5lc3RlZE5hbWVTcGVjaWZpZXJMb2M+KSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1F1YWxpZmllcigpID8gMSA6IDA7CisgIH0KKworICBzaXplX3QgbnVtVHJhaWxpbmdPYmplY3RzKE92ZXJsb2FkVG9rZW48TmFtZWREZWNsICo+KSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0ZvdW5kRGVjbCgpID8gMSA6IDA7CisgIH0KKworICBzaXplX3QgbnVtVHJhaWxpbmdPYmplY3RzKE92ZXJsb2FkVG9rZW48QVNUVGVtcGxhdGVLV0FuZEFyZ3NJbmZvPikgY29uc3QgeworICAgIHJldHVybiBoYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8oKSA/IDEgOiAwOworICB9CisKKyAgLy8vIFxicmllZiBUZXN0IHdoZXRoZXIgdGhlcmUgaXMgYSBkaXN0aW5jdCBGb3VuZERlY2wgYXR0YWNoZWQgdG8gdGhlIGVuZCBvZgorICAvLy8gdGhpcyBEUkUuCisgIGJvb2wgaGFzRm91bmREZWNsKCkgY29uc3QgeyByZXR1cm4gRGVjbFJlZkV4cHJCaXRzLkhhc0ZvdW5kRGVjbDsgfQorCisgIERlY2xSZWZFeHByKGNvbnN0IEFTVENvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MsCisgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlS1dMb2MsCisgICAgICAgICAgICAgIFZhbHVlRGVjbCAqRCwgYm9vbCBSZWZlcnNUb0VubG9zaW5nVmFyaWFibGVPckNhcHR1cmUsCisgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAorICAgICAgICAgICAgICBOYW1lZERlY2wgKkZvdW5kRCwKKyAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICpUZW1wbGF0ZUFyZ3MsCisgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIEV4cHJWYWx1ZUtpbmQgVkspOworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIGVtcHR5IGRlY2xhcmF0aW9uIHJlZmVyZW5jZSBleHByZXNzaW9uLgorICBleHBsaWNpdCBEZWNsUmVmRXhwcihFbXB0eVNoZWxsIEVtcHR5KQorICAgIDogRXhwcihEZWNsUmVmRXhwckNsYXNzLCBFbXB0eSkgeyB9CisKKyAgLy8vIFxicmllZiBDb21wdXRlcyB0aGUgdHlwZS0gYW5kIHZhbHVlLWRlcGVuZGVuY2UgZmxhZ3MgZm9yIHRoaXMKKyAgLy8vIGRlY2xhcmF0aW9uIHJlZmVyZW5jZSBleHByZXNzaW9uLgorICB2b2lkIGNvbXB1dGVEZXBlbmRlbmNlKGNvbnN0IEFTVENvbnRleHQgJkMpOworCitwdWJsaWM6CisgIERlY2xSZWZFeHByKFZhbHVlRGVjbCAqRCwgYm9vbCBSZWZlcnNUb0VuY2xvc2luZ1ZhcmlhYmxlT3JDYXB0dXJlLCBRdWFsVHlwZSBULAorICAgICAgICAgICAgICBFeHByVmFsdWVLaW5kIFZLLCBTb3VyY2VMb2NhdGlvbiBMLAorICAgICAgICAgICAgICBjb25zdCBEZWNsYXJhdGlvbk5hbWVMb2MgJkxvY0luZm8gPSBEZWNsYXJhdGlvbk5hbWVMb2MoKSkKKyAgICA6IEV4cHIoRGVjbFJlZkV4cHJDbGFzcywgVCwgVkssIE9LX09yZGluYXJ5LCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICBEKEQpLCBMb2MoTCksIEROTG9jKExvY0luZm8pIHsKKyAgICBEZWNsUmVmRXhwckJpdHMuSGFzUXVhbGlmaWVyID0gMDsKKyAgICBEZWNsUmVmRXhwckJpdHMuSGFzVGVtcGxhdGVLV0FuZEFyZ3NJbmZvID0gMDsKKyAgICBEZWNsUmVmRXhwckJpdHMuSGFzRm91bmREZWNsID0gMDsKKyAgICBEZWNsUmVmRXhwckJpdHMuSGFkTXVsdGlwbGVDYW5kaWRhdGVzID0gMDsKKyAgICBEZWNsUmVmRXhwckJpdHMuUmVmZXJzVG9FbmNsb3NpbmdWYXJpYWJsZU9yQ2FwdHVyZSA9CisgICAgICAgIFJlZmVyc1RvRW5jbG9zaW5nVmFyaWFibGVPckNhcHR1cmU7CisgICAgY29tcHV0ZURlcGVuZGVuY2UoRC0+Z2V0QVNUQ29udGV4dCgpKTsKKyAgfQorCisgIHN0YXRpYyBEZWNsUmVmRXhwciAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LCBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYywKKyAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlS1dMb2MsIFZhbHVlRGVjbCAqRCwKKyAgICAgICAgIGJvb2wgUmVmZXJzVG9FbmNsb3NpbmdWYXJpYWJsZU9yQ2FwdHVyZSwgU291cmNlTG9jYXRpb24gTmFtZUxvYywKKyAgICAgICAgIFF1YWxUeXBlIFQsIEV4cHJWYWx1ZUtpbmQgVkssIE5hbWVkRGVjbCAqRm91bmREID0gbnVsbHB0ciwKKyAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqVGVtcGxhdGVBcmdzID0gbnVsbHB0cik7CisKKyAgc3RhdGljIERlY2xSZWZFeHByICoKKyAgQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQsIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgUXVhbGlmaWVyTG9jLAorICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYywgVmFsdWVEZWNsICpELAorICAgICAgICAgYm9vbCBSZWZlcnNUb0VuY2xvc2luZ1ZhcmlhYmxlT3JDYXB0dXJlLAorICAgICAgICAgY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmTmFtZUluZm8sIFF1YWxUeXBlIFQsIEV4cHJWYWx1ZUtpbmQgVkssCisgICAgICAgICBOYW1lZERlY2wgKkZvdW5kRCA9IG51bGxwdHIsCisgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gKlRlbXBsYXRlQXJncyA9IG51bGxwdHIpOworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIGVtcHR5IGRlY2xhcmF0aW9uIHJlZmVyZW5jZSBleHByZXNzaW9uLgorICBzdGF0aWMgRGVjbFJlZkV4cHIgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNRdWFsaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNGb3VuZERlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtVGVtcGxhdGVBcmdzKTsKKworICBWYWx1ZURlY2wgKmdldERlY2woKSB7IHJldHVybiBEOyB9CisgIGNvbnN0IFZhbHVlRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IHsgcmV0dXJuIEQ7IH0KKyAgdm9pZCBzZXREZWNsKFZhbHVlRGVjbCAqTmV3RCkgeyBEID0gTmV3RDsgfQorCisgIERlY2xhcmF0aW9uTmFtZUluZm8gZ2V0TmFtZUluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIERlY2xhcmF0aW9uTmFtZUluZm8oZ2V0RGVjbCgpLT5nZXREZWNsTmFtZSgpLCBMb2MsIEROTG9jKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9CisgIHZvaWQgc2V0TG9jYXRpb24oU291cmNlTG9jYXRpb24gTCkgeyBMb2MgPSBMOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gcmVmZXJlbmNlIHdhcyBwcmVjZWRlZCBieSBhCisgIC8vLyBDKysgbmVzdGVkLW5hbWUtc3BlY2lmaWVyLCBlLmcuLCBcYyBOOjpmb28uCisgIGJvb2wgaGFzUXVhbGlmaWVyKCkgY29uc3QgeyByZXR1cm4gRGVjbFJlZkV4cHJCaXRzLkhhc1F1YWxpZmllcjsgfQorCisgIC8vLyBcYnJpZWYgSWYgdGhlIG5hbWUgd2FzIHF1YWxpZmllZCwgcmV0cmlldmVzIHRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIKKyAgLy8vIHRoYXQgcHJlY2VkZXMgdGhlIG5hbWUsIHdpdGggc291cmNlLWxvY2F0aW9uIGluZm9ybWF0aW9uLgorICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIGdldFF1YWxpZmllckxvYygpIGNvbnN0IHsKKyAgICBpZiAoIWhhc1F1YWxpZmllcigpKQorICAgICAgcmV0dXJuIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoKTsKKyAgICByZXR1cm4gKmdldFRyYWlsaW5nT2JqZWN0czxOZXN0ZWROYW1lU3BlY2lmaWVyTG9jPigpOworICB9CisKKyAgLy8vIFxicmllZiBJZiB0aGUgbmFtZSB3YXMgcXVhbGlmaWVkLCByZXRyaWV2ZXMgdGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllcgorICAvLy8gdGhhdCBwcmVjZWRlcyB0aGUgbmFtZS4gT3RoZXJ3aXNlLCByZXR1cm5zIE5VTEwuCisgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKmdldFF1YWxpZmllcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UXVhbGlmaWVyTG9jKCkuZ2V0TmVzdGVkTmFtZVNwZWNpZmllcigpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIE5hbWVkRGVjbCB0aHJvdWdoIHdoaWNoIHRoaXMgcmVmZXJlbmNlIG9jY3VycmVkLgorICAvLy8KKyAgLy8vIFRoaXMgRGVjbCBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIFZhbHVlRGVjbCBhY3R1YWxseSByZWZlcnJlZCB0byBpbiB0aGUKKyAgLy8vIHByZXNlbmNlIG9mIHVzaW5nIGRlY2xhcmF0aW9ucywgZXRjLiBJdCBhbHdheXMgcmV0dXJucyBub24tTlVMTCwgYW5kIG1heQorICAvLy8gc2ltcGxlIHJldHVybiB0aGUgVmFsdWVEZWNsIHdoZW4gYXBwcm9wcmlhdGUuCisKKyAgTmFtZWREZWNsICpnZXRGb3VuZERlY2woKSB7CisgICAgcmV0dXJuIGhhc0ZvdW5kRGVjbCgpID8gKmdldFRyYWlsaW5nT2JqZWN0czxOYW1lZERlY2wgKj4oKSA6IEQ7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgTmFtZWREZWNsIHRocm91Z2ggd2hpY2ggdGhpcyByZWZlcmVuY2Ugb2NjdXJyZWQuCisgIC8vLyBTZWUgbm9uLWNvbnN0IHZhcmlhbnQuCisgIGNvbnN0IE5hbWVkRGVjbCAqZ2V0Rm91bmREZWNsKCkgY29uc3QgeworICAgIHJldHVybiBoYXNGb3VuZERlY2woKSA/ICpnZXRUcmFpbGluZ09iamVjdHM8TmFtZWREZWNsICo+KCkgOiBEOworICB9CisKKyAgYm9vbCBoYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIERlY2xSZWZFeHByQml0cy5IYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm87CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgdGVtcGxhdGUga2V5d29yZCBwcmVjZWRpbmcKKyAgLy8vIHRoaXMgbmFtZSwgaWYgYW55LgorICBTb3VyY2VMb2NhdGlvbiBnZXRUZW1wbGF0ZUtleXdvcmRMb2MoKSBjb25zdCB7CisgICAgaWYgKCFoYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8oKSkgcmV0dXJuIFNvdXJjZUxvY2F0aW9uKCk7CisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxBU1RUZW1wbGF0ZUtXQW5kQXJnc0luZm8+KCktPlRlbXBsYXRlS1dMb2M7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGVmdCBhbmdsZSBicmFja2V0IHN0YXJ0aW5nIHRoZQorICAvLy8gZXhwbGljaXQgdGVtcGxhdGUgYXJndW1lbnQgbGlzdCBmb2xsb3dpbmcgdGhlIG5hbWUsIGlmIGFueS4KKyAgU291cmNlTG9jYXRpb24gZ2V0TEFuZ2xlTG9jKCkgY29uc3QgeworICAgIGlmICghaGFzVGVtcGxhdGVLV0FuZEFyZ3NJbmZvKCkpIHJldHVybiBTb3VyY2VMb2NhdGlvbigpOworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8QVNUVGVtcGxhdGVLV0FuZEFyZ3NJbmZvPigpLT5MQW5nbGVMb2M7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmlnaHQgYW5nbGUgYnJhY2tldCBlbmRpbmcgdGhlCisgIC8vLyBleHBsaWNpdCB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0IGZvbGxvd2luZyB0aGUgbmFtZSwgaWYgYW55LgorICBTb3VyY2VMb2NhdGlvbiBnZXRSQW5nbGVMb2MoKSBjb25zdCB7CisgICAgaWYgKCFoYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8oKSkgcmV0dXJuIFNvdXJjZUxvY2F0aW9uKCk7CisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxBU1RUZW1wbGF0ZUtXQW5kQXJnc0luZm8+KCktPlJBbmdsZUxvYzsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBuYW1lIGluIHRoaXMgZGVjbGFyYXRpb24gcmVmZXJlbmNlCisgIC8vLyB3YXMgcHJlY2VkZWQgYnkgdGhlIHRlbXBsYXRlIGtleXdvcmQuCisgIGJvb2wgaGFzVGVtcGxhdGVLZXl3b3JkKCkgY29uc3QgeyByZXR1cm4gZ2V0VGVtcGxhdGVLZXl3b3JkTG9jKCkuaXNWYWxpZCgpOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBkZWNsYXJhdGlvbiByZWZlcmVuY2Ugd2FzIGZvbGxvd2VkIGJ5IGFuCisgIC8vLyBleHBsaWNpdCB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0LgorICBib29sIGhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzKCkgY29uc3QgeyByZXR1cm4gZ2V0TEFuZ2xlTG9jKCkuaXNWYWxpZCgpOyB9CisKKyAgLy8vIFxicmllZiBDb3BpZXMgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyAoaWYgcHJlc2VudCkgaW50byB0aGUgZ2l2ZW4KKyAgLy8vIHN0cnVjdHVyZS4KKyAgdm9pZCBjb3B5VGVtcGxhdGVBcmd1bWVudHNJbnRvKFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAmTGlzdCkgY29uc3QgeworICAgIGlmIChoYXNFeHBsaWNpdFRlbXBsYXRlQXJncygpKQorICAgICAgZ2V0VHJhaWxpbmdPYmplY3RzPEFTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbz4oKS0+Y29weUludG8oCisgICAgICAgICAgZ2V0VHJhaWxpbmdPYmplY3RzPFRlbXBsYXRlQXJndW1lbnRMb2M+KCksIExpc3QpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIHByb3ZpZGVkIGFzIHBhcnQgb2YgdGhpcworICAvLy8gdGVtcGxhdGUtaWQuCisgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMb2MgKmdldFRlbXBsYXRlQXJncygpIGNvbnN0IHsKKyAgICBpZiAoIWhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8VGVtcGxhdGVBcmd1bWVudExvYz4oKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMgcHJvdmlkZWQgYXMgcGFydCBvZiB0aGlzCisgIC8vLyB0ZW1wbGF0ZS1pZC4KKyAgdW5zaWduZWQgZ2V0TnVtVGVtcGxhdGVBcmdzKCkgY29uc3QgeworICAgIGlmICghaGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3MoKSkKKyAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxBU1RUZW1wbGF0ZUtXQW5kQXJnc0luZm8+KCktPk51bVRlbXBsYXRlQXJnczsKKyAgfQorCisgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnRMb2M+IHRlbXBsYXRlX2FyZ3VtZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4ge2dldFRlbXBsYXRlQXJncygpLCBnZXROdW1UZW1wbGF0ZUFyZ3MoKX07CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGV4cHJlc3Npb24gcmVmZXJzIHRvIGEgZnVuY3Rpb24gdGhhdAorICAvLy8gd2FzIHJlc29sdmVkIGZyb20gYW4gb3ZlcmxvYWRlZCBzZXQgaGF2aW5nIHNpemUgZ3JlYXRlciB0aGFuIDEuCisgIGJvb2wgaGFkTXVsdGlwbGVDYW5kaWRhdGVzKCkgY29uc3QgeworICAgIHJldHVybiBEZWNsUmVmRXhwckJpdHMuSGFkTXVsdGlwbGVDYW5kaWRhdGVzOworICB9CisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgZmxhZyB0ZWxsaW5nIHdoZXRoZXIgdGhpcyBleHByZXNzaW9uIHJlZmVycyB0bworICAvLy8gYSBmdW5jdGlvbiB0aGF0IHdhcyByZXNvbHZlZCBmcm9tIGFuIG92ZXJsb2FkZWQgc2V0IGhhdmluZyBzaXplCisgIC8vLyBncmVhdGVyIHRoYW4gMS4KKyAgdm9pZCBzZXRIYWRNdWx0aXBsZUNhbmRpZGF0ZXMoYm9vbCBWID0gdHJ1ZSkgeworICAgIERlY2xSZWZFeHByQml0cy5IYWRNdWx0aXBsZUNhbmRpZGF0ZXMgPSBWOworICB9CisKKyAgLy8vIFxicmllZiBEb2VzIHRoaXMgRGVjbFJlZkV4cHIgcmVmZXIgdG8gYW4gZW5jbG9zaW5nIGxvY2FsIG9yIGEgY2FwdHVyZWQKKyAgLy8vIHZhcmlhYmxlPworICBib29sIHJlZmVyc1RvRW5jbG9zaW5nVmFyaWFibGVPckNhcHR1cmUoKSBjb25zdCB7CisgICAgcmV0dXJuIERlY2xSZWZFeHByQml0cy5SZWZlcnNUb0VuY2xvc2luZ1ZhcmlhYmxlT3JDYXB0dXJlOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IERlY2xSZWZFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9CisKKyAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKGNvbnN0X2NoaWxkX2l0ZXJhdG9yKCksIGNvbnN0X2NoaWxkX2l0ZXJhdG9yKCkpOworICB9CisKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10V3JpdGVyOworfTsKKworLy8vIFxicmllZiBbQzk5IDYuNC4yLjJdIC0gQSBwcmVkZWZpbmVkIGlkZW50aWZpZXIgc3VjaCBhcyBfX2Z1bmNfXy4KK2NsYXNzIFByZWRlZmluZWRFeHByIDogcHVibGljIEV4cHIgeworcHVibGljOgorICBlbnVtIElkZW50VHlwZSB7CisgICAgRnVuYywKKyAgICBGdW5jdGlvbiwKKyAgICBMRnVuY3Rpb24sICAvLyBTYW1lIGFzIEZ1bmN0aW9uLCBidXQgYXMgd2lkZSBzdHJpbmcuCisgICAgRnVuY0ROYW1lLAorICAgIEZ1bmNTaWcsCisgICAgUHJldHR5RnVuY3Rpb24sCisgICAgLy8vIFxicmllZiBUaGUgc2FtZSBhcyBQcmV0dHlGdW5jdGlvbiwgZXhjZXB0IHRoYXQgdGhlCisgICAgLy8vICd2aXJ0dWFsJyBrZXl3b3JkIGlzIG9taXR0ZWQgZm9yIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgICBQcmV0dHlGdW5jdGlvbk5vVmlydHVhbAorICB9OworCitwcml2YXRlOgorICBTb3VyY2VMb2NhdGlvbiBMb2M7CisgIElkZW50VHlwZSBUeXBlOworICBTdG10ICpGbk5hbWU7CisKK3B1YmxpYzoKKyAgUHJlZGVmaW5lZEV4cHIoU291cmNlTG9jYXRpb24gTCwgUXVhbFR5cGUgRk5UeSwgSWRlbnRUeXBlIElULAorICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsICpTTCk7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYW4gZW1wdHkgcHJlZGVmaW5lZCBleHByZXNzaW9uLgorICBleHBsaWNpdCBQcmVkZWZpbmVkRXhwcihFbXB0eVNoZWxsIEVtcHR5KQorICAgICAgOiBFeHByKFByZWRlZmluZWRFeHByQ2xhc3MsIEVtcHR5KSwgTG9jKCksIFR5cGUoRnVuYyksIEZuTmFtZShudWxscHRyKSB7fQorCisgIElkZW50VHlwZSBnZXRJZGVudFR5cGUoKSBjb25zdCB7IHJldHVybiBUeXBlOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKyAgdm9pZCBzZXRMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBMKSB7IExvYyA9IEw7IH0KKworICBTdHJpbmdMaXRlcmFsICpnZXRGdW5jdGlvbk5hbWUoKTsKKyAgY29uc3QgU3RyaW5nTGl0ZXJhbCAqZ2V0RnVuY3Rpb25OYW1lKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PFByZWRlZmluZWRFeHByICo+KHRoaXMpLT5nZXRGdW5jdGlvbk5hbWUoKTsKKyAgfQorCisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0SWRlbnRUeXBlTmFtZShJZGVudFR5cGUgSVQpOworICBzdGF0aWMgc3RkOjpzdHJpbmcgQ29tcHV0ZU5hbWUoSWRlbnRUeXBlIElULCBjb25zdCBEZWNsICpDdXJyZW50RGVjbCk7CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIExvYzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBQcmVkZWZpbmVkRXhwckNsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoJkZuTmFtZSwgJkZuTmFtZSArIDEpOyB9CisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jaGlsZF9yYW5nZSgmRm5OYW1lLCAmRm5OYW1lICsgMSk7CisgIH0KKworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKK307CisKKy8vLyBcYnJpZWYgVXNlZCBieSBJbnRlZ2VyTGl0ZXJhbC9GbG9hdGluZ0xpdGVyYWwgdG8gc3RvcmUgdGhlIG51bWVyaWMgd2l0aG91dAorLy8vIGxlYWtpbmcgbWVtb3J5LgorLy8vCisvLy8gRm9yIGxhcmdlIGZsb2F0cy9pbnRlZ2VycywgQVBGbG9hdC9BUEludCB3aWxsIGFsbG9jYXRlIG1lbW9yeSBmcm9tIHRoZSBoZWFwCisvLy8gdG8gcmVwcmVzZW50IHRoZXNlIG51bWJlcnMuICBVbmZvcnR1bmF0ZWx5LCB3aGVuIHdlIHVzZSBhIEJ1bXBQdHJBbGxvY2F0b3IKKy8vLyB0byBhbGxvY2F0ZSBJbnRlZ2VyTGl0ZXJhbC9GbG9hdGluZ0xpdGVyYWwgbm9kZXMgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGgKKy8vLyB0aGUgQVBGbG9hdC9BUEludCB2YWx1ZXMgd2lsbCBuZXZlciBnZXQgZnJlZWQuIEFQTnVtZXJpY1N0b3JhZ2UgdXNlcworLy8vIEFTVENvbnRleHQncyBhbGxvY2F0b3IgZm9yIG1lbW9yeSBhbGxvY2F0aW9uLgorY2xhc3MgQVBOdW1lcmljU3RvcmFnZSB7CisgIHVuaW9uIHsKKyAgICB1aW50NjRfdCBWQUw7ICAgIC8vLzwgVXNlZCB0byBzdG9yZSB0aGUgPD0gNjQgYml0cyBpbnRlZ2VyIHZhbHVlLgorICAgIHVpbnQ2NF90ICpwVmFsOyAgLy8vPCBVc2VkIHRvIHN0b3JlIHRoZSA+NjQgYml0cyBpbnRlZ2VyIHZhbHVlLgorICB9OworICB1bnNpZ25lZCBCaXRXaWR0aDsKKworICBib29sIGhhc0FsbG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBsbHZtOjpBUEludDo6Z2V0TnVtV29yZHMoQml0V2lkdGgpID4gMTsgfQorCisgIEFQTnVtZXJpY1N0b3JhZ2UoY29uc3QgQVBOdW1lcmljU3RvcmFnZSAmKSA9IGRlbGV0ZTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQVBOdW1lcmljU3RvcmFnZSAmKSA9IGRlbGV0ZTsKKworcHJvdGVjdGVkOgorICBBUE51bWVyaWNTdG9yYWdlKCkgOiBWQUwoMCksIEJpdFdpZHRoKDApIHsgfQorCisgIGxsdm06OkFQSW50IGdldEludFZhbHVlKCkgY29uc3QgeworICAgIHVuc2lnbmVkIE51bVdvcmRzID0gbGx2bTo6QVBJbnQ6OmdldE51bVdvcmRzKEJpdFdpZHRoKTsKKyAgICBpZiAoTnVtV29yZHMgPiAxKQorICAgICAgcmV0dXJuIGxsdm06OkFQSW50KEJpdFdpZHRoLCBOdW1Xb3JkcywgcFZhbCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGxsdm06OkFQSW50KEJpdFdpZHRoLCBWQUwpOworICB9CisgIHZvaWQgc2V0SW50VmFsdWUoY29uc3QgQVNUQ29udGV4dCAmQywgY29uc3QgbGx2bTo6QVBJbnQgJlZhbCk7Cit9OworCitjbGFzcyBBUEludFN0b3JhZ2UgOiBwcml2YXRlIEFQTnVtZXJpY1N0b3JhZ2UgeworcHVibGljOgorICBsbHZtOjpBUEludCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGdldEludFZhbHVlKCk7IH0KKyAgdm9pZCBzZXRWYWx1ZShjb25zdCBBU1RDb250ZXh0ICZDLCBjb25zdCBsbHZtOjpBUEludCAmVmFsKSB7CisgICAgc2V0SW50VmFsdWUoQywgVmFsKTsKKyAgfQorfTsKKworY2xhc3MgQVBGbG9hdFN0b3JhZ2UgOiBwcml2YXRlIEFQTnVtZXJpY1N0b3JhZ2UgeworcHVibGljOgorICBsbHZtOjpBUEZsb2F0IGdldFZhbHVlKGNvbnN0IGxsdm06OmZsdFNlbWFudGljcyAmU2VtYW50aWNzKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06OkFQRmxvYXQoU2VtYW50aWNzLCBnZXRJbnRWYWx1ZSgpKTsKKyAgfQorICB2b2lkIHNldFZhbHVlKGNvbnN0IEFTVENvbnRleHQgJkMsIGNvbnN0IGxsdm06OkFQRmxvYXQgJlZhbCkgeworICAgIHNldEludFZhbHVlKEMsIFZhbC5iaXRjYXN0VG9BUEludCgpKTsKKyAgfQorfTsKKworY2xhc3MgSW50ZWdlckxpdGVyYWwgOiBwdWJsaWMgRXhwciwgcHVibGljIEFQSW50U3RvcmFnZSB7CisgIFNvdXJjZUxvY2F0aW9uIExvYzsKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBlbXB0eSBpbnRlZ2VyIGxpdGVyYWwuCisgIGV4cGxpY2l0IEludGVnZXJMaXRlcmFsKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgOiBFeHByKEludGVnZXJMaXRlcmFsQ2xhc3MsIEVtcHR5KSB7IH0KKworcHVibGljOgorICAvLyB0eXBlIHNob3VsZCBiZSBJbnRUeSwgTG9uZ1R5LCBMb25nTG9uZ1R5LCBVbnNpZ25lZEludFR5LCBVbnNpZ25lZExvbmdUeSwKKyAgLy8gb3IgVW5zaWduZWRMb25nTG9uZ1R5CisgIEludGVnZXJMaXRlcmFsKGNvbnN0IEFTVENvbnRleHQgJkMsIGNvbnN0IGxsdm06OkFQSW50ICZWLCBRdWFsVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBsKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgYSBuZXcgaW50ZWdlciBsaXRlcmFsIHdpdGggdmFsdWUgJ1YnIGFuZCB0eXBlICd0eXBlJy4KKyAgLy8vIFxwYXJhbSB0eXBlIC0gZWl0aGVyIEludFR5LCBMb25nVHksIExvbmdMb25nVHksIFVuc2lnbmVkSW50VHksCisgIC8vLyBVbnNpZ25lZExvbmdUeSwgb3IgVW5zaWduZWRMb25nTG9uZ1R5IHdoaWNoIHNob3VsZCBtYXRjaCB0aGUgc2l6ZSBvZiBWCisgIC8vLyBccGFyYW0gViAtIHRoZSB2YWx1ZSB0aGF0IHRoZSByZXR1cm5lZCBpbnRlZ2VyIGxpdGVyYWwgY29udGFpbnMuCisgIHN0YXRpYyBJbnRlZ2VyTGl0ZXJhbCAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIGNvbnN0IGxsdm06OkFQSW50ICZWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSB0eXBlLCBTb3VyY2VMb2NhdGlvbiBsKTsKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgbmV3IGVtcHR5IGludGVnZXIgbGl0ZXJhbC4KKyAgc3RhdGljIEludGVnZXJMaXRlcmFsICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgRW1wdHlTaGVsbCBFbXB0eSk7CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIExvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBsaXRlcmFsLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIExvYzsgfQorCisgIHZvaWQgc2V0TG9jYXRpb24oU291cmNlTG9jYXRpb24gTG9jYXRpb24pIHsgTG9jID0gTG9jYXRpb247IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gSW50ZWdlckxpdGVyYWxDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoY2hpbGRfaXRlcmF0b3IoKSwgY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KKyAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKGNvbnN0X2NoaWxkX2l0ZXJhdG9yKCksIGNvbnN0X2NoaWxkX2l0ZXJhdG9yKCkpOworICB9Cit9OworCitjbGFzcyBDaGFyYWN0ZXJMaXRlcmFsIDogcHVibGljIEV4cHIgeworcHVibGljOgorICBlbnVtIENoYXJhY3RlcktpbmQgeworICAgIEFzY2lpLAorICAgIFdpZGUsCisgICAgVVRGOCwKKyAgICBVVEYxNiwKKyAgICBVVEYzMgorICB9OworCitwcml2YXRlOgorICB1bnNpZ25lZCBWYWx1ZTsKKyAgU291cmNlTG9jYXRpb24gTG9jOworcHVibGljOgorICAvLyB0eXBlIHNob3VsZCBiZSBJbnRUeQorICBDaGFyYWN0ZXJMaXRlcmFsKHVuc2lnbmVkIHZhbHVlLCBDaGFyYWN0ZXJLaW5kIGtpbmQsIFF1YWxUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gbCkKKyAgICA6IEV4cHIoQ2hhcmFjdGVyTGl0ZXJhbENsYXNzLCB0eXBlLCBWS19SVmFsdWUsIE9LX09yZGluYXJ5LCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgIGZhbHNlLCBmYWxzZSksCisgICAgICBWYWx1ZSh2YWx1ZSksIExvYyhsKSB7CisgICAgQ2hhcmFjdGVyTGl0ZXJhbEJpdHMuS2luZCA9IGtpbmQ7CisgIH0KKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBlbXB0eSBjaGFyYWN0ZXIgbGl0ZXJhbC4KKyAgQ2hhcmFjdGVyTGl0ZXJhbChFbXB0eVNoZWxsIEVtcHR5KSA6IEV4cHIoQ2hhcmFjdGVyTGl0ZXJhbENsYXNzLCBFbXB0eSkgeyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKyAgQ2hhcmFjdGVyS2luZCBnZXRLaW5kKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDaGFyYWN0ZXJLaW5kPihDaGFyYWN0ZXJMaXRlcmFsQml0cy5LaW5kKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2M7IH0KKworICB1bnNpZ25lZCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgdm9pZCBzZXRMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBMb2NhdGlvbikgeyBMb2MgPSBMb2NhdGlvbjsgfQorICB2b2lkIHNldEtpbmQoQ2hhcmFjdGVyS2luZCBraW5kKSB7IENoYXJhY3RlckxpdGVyYWxCaXRzLktpbmQgPSBraW5kOyB9CisgIHZvaWQgc2V0VmFsdWUodW5zaWduZWQgVmFsKSB7IFZhbHVlID0gVmFsOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IENoYXJhY3RlckxpdGVyYWxDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoY2hpbGRfaXRlcmF0b3IoKSwgY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KKyAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKGNvbnN0X2NoaWxkX2l0ZXJhdG9yKCksIGNvbnN0X2NoaWxkX2l0ZXJhdG9yKCkpOworICB9Cit9OworCitjbGFzcyBGbG9hdGluZ0xpdGVyYWwgOiBwdWJsaWMgRXhwciwgcHJpdmF0ZSBBUEZsb2F0U3RvcmFnZSB7CisgIFNvdXJjZUxvY2F0aW9uIExvYzsKKworICBGbG9hdGluZ0xpdGVyYWwoY29uc3QgQVNUQ29udGV4dCAmQywgY29uc3QgbGx2bTo6QVBGbG9hdCAmViwgYm9vbCBpc2V4YWN0LAorICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVHlwZSwgU291cmNlTG9jYXRpb24gTCk7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYW4gZW1wdHkgZmxvYXRpbmctcG9pbnQgbGl0ZXJhbC4KKyAgZXhwbGljaXQgRmxvYXRpbmdMaXRlcmFsKGNvbnN0IEFTVENvbnRleHQgJkMsIEVtcHR5U2hlbGwgRW1wdHkpOworCitwdWJsaWM6CisgIHN0YXRpYyBGbG9hdGluZ0xpdGVyYWwgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBjb25zdCBsbHZtOjpBUEZsb2F0ICZWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc2V4YWN0LCBRdWFsVHlwZSBUeXBlLCBTb3VyY2VMb2NhdGlvbiBMKTsKKyAgc3RhdGljIEZsb2F0aW5nTGl0ZXJhbCAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIEVtcHR5U2hlbGwgRW1wdHkpOworCisgIGxsdm06OkFQRmxvYXQgZ2V0VmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIEFQRmxvYXRTdG9yYWdlOjpnZXRWYWx1ZShnZXRTZW1hbnRpY3MoKSk7CisgIH0KKyAgdm9pZCBzZXRWYWx1ZShjb25zdCBBU1RDb250ZXh0ICZDLCBjb25zdCBsbHZtOjpBUEZsb2F0ICZWYWwpIHsKKyAgICBhc3NlcnQoJmdldFNlbWFudGljcygpID09ICZWYWwuZ2V0U2VtYW50aWNzKCkgJiYgIkluY29uc2lzdGVudCBzZW1hbnRpY3MiKTsKKyAgICBBUEZsb2F0U3RvcmFnZTo6c2V0VmFsdWUoQywgVmFsKTsKKyAgfQorCisgIC8vLyBHZXQgYSByYXcgZW51bWVyYXRpb24gdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBmbG9hdGluZy1wb2ludCBzZW1hbnRpY3Mgb2YKKyAgLy8vIHRoaXMgbGl0ZXJhbCAoMzItYml0IElFRUUsIHg4NywgLi4uKSwgc3VpdGFibGUgZm9yIHNlcmlhbGlzYXRpb24uCisgIEFQRmxvYXRTZW1hbnRpY3MgZ2V0UmF3U2VtYW50aWNzKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxBUEZsb2F0U2VtYW50aWNzPihGbG9hdGluZ0xpdGVyYWxCaXRzLlNlbWFudGljcyk7CisgIH0KKworICAvLy8gU2V0IHRoZSByYXcgZW51bWVyYXRpb24gdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBmbG9hdGluZy1wb2ludCBzZW1hbnRpY3Mgb2YKKyAgLy8vIHRoaXMgbGl0ZXJhbCAoMzItYml0IElFRUUsIHg4NywgLi4uKSwgc3VpdGFibGUgZm9yIHNlcmlhbGlzYXRpb24uCisgIHZvaWQgc2V0UmF3U2VtYW50aWNzKEFQRmxvYXRTZW1hbnRpY3MgU2VtKSB7CisgICAgRmxvYXRpbmdMaXRlcmFsQml0cy5TZW1hbnRpY3MgPSBTZW07CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBBUEZsb2F0IHNlbWFudGljcyB0aGlzIGxpdGVyYWwgdXNlcy4KKyAgY29uc3QgbGx2bTo6Zmx0U2VtYW50aWNzICZnZXRTZW1hbnRpY3MoKSBjb25zdDsKKworICAvLy8gU2V0IHRoZSBBUEZsb2F0IHNlbWFudGljcyB0aGlzIGxpdGVyYWwgdXNlcy4KKyAgdm9pZCBzZXRTZW1hbnRpY3MoY29uc3QgbGx2bTo6Zmx0U2VtYW50aWNzICZTZW0pOworCisgIGJvb2wgaXNFeGFjdCgpIGNvbnN0IHsgcmV0dXJuIEZsb2F0aW5nTGl0ZXJhbEJpdHMuSXNFeGFjdDsgfQorICB2b2lkIHNldEV4YWN0KGJvb2wgRSkgeyBGbG9hdGluZ0xpdGVyYWxCaXRzLklzRXhhY3QgPSBFOyB9CisKKyAgLy8vIGdldFZhbHVlQXNBcHByb3hpbWF0ZURvdWJsZSAtIFRoaXMgcmV0dXJucyB0aGUgdmFsdWUgYXMgYW4gaW5hY2N1cmF0ZQorICAvLy8gZG91YmxlLiAgTm90ZSB0aGF0IHRoaXMgbWF5IGNhdXNlIGxvc3Mgb2YgcHJlY2lzaW9uLCBidXQgaXMgdXNlZnVsIGZvcgorICAvLy8gZGVidWdnaW5nIGR1bXBzLCBldGMuCisgIGRvdWJsZSBnZXRWYWx1ZUFzQXBwcm94aW1hdGVEb3VibGUoKSBjb25zdDsKKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIExvYzsgfQorICB2b2lkIHNldExvY2F0aW9uKFNvdXJjZUxvY2F0aW9uIEwpIHsgTG9jID0gTDsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2M7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gRmxvYXRpbmdMaXRlcmFsQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9CisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jaGlsZF9yYW5nZShjb25zdF9jaGlsZF9pdGVyYXRvcigpLCBjb25zdF9jaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorfTsKKworLy8vIEltYWdpbmFyeUxpdGVyYWwgLSBXZSBzdXBwb3J0IGltYWdpbmFyeSBpbnRlZ2VyIGFuZCBmbG9hdGluZyBwb2ludCBsaXRlcmFscywKKy8vLyBsaWtlICIxLjBpIi4gIFdlIHJlcHJlc2VudCB0aGVzZSBhcyBhIHdyYXBwZXIgYXJvdW5kIEZsb2F0aW5nTGl0ZXJhbCBhbmQKKy8vLyBJbnRlZ2VyTGl0ZXJhbCBjbGFzc2VzLiAgSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYWx3YXlzIGhhdmUgYSBDb21wbGV4IHR5cGUKKy8vLyB3aG9zZSBlbGVtZW50IHR5cGUgbWF0Y2hlcyB0aGUgc3ViZXhwcmVzc2lvbi4KKy8vLworY2xhc3MgSW1hZ2luYXJ5TGl0ZXJhbCA6IHB1YmxpYyBFeHByIHsKKyAgU3RtdCAqVmFsOworcHVibGljOgorICBJbWFnaW5hcnlMaXRlcmFsKEV4cHIgKnZhbCwgUXVhbFR5cGUgVHkpCisgICAgOiBFeHByKEltYWdpbmFyeUxpdGVyYWxDbGFzcywgVHksIFZLX1JWYWx1ZSwgT0tfT3JkaW5hcnksIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgZmFsc2UsIGZhbHNlKSwKKyAgICAgIFZhbCh2YWwpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBpbWFnaW5hcnkgbGl0ZXJhbC4KKyAgZXhwbGljaXQgSW1hZ2luYXJ5TGl0ZXJhbChFbXB0eVNoZWxsIEVtcHR5KQorICAgIDogRXhwcihJbWFnaW5hcnlMaXRlcmFsQ2xhc3MsIEVtcHR5KSB7IH0KKworICBjb25zdCBFeHByICpnZXRTdWJFeHByKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihWYWwpOyB9CisgIEV4cHIgKmdldFN1YkV4cHIoKSB7IHJldHVybiBjYXN0PEV4cHI+KFZhbCk7IH0KKyAgdm9pZCBzZXRTdWJFeHByKEV4cHIgKkUpIHsgVmFsID0gRTsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBWYWwtPmdldExvY1N0YXJ0KCk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBWYWwtPmdldExvY0VuZCgpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IEltYWdpbmFyeUxpdGVyYWxDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsgcmV0dXJuIGNoaWxkX3JhbmdlKCZWYWwsICZWYWwrMSk7IH0KKyAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKCZWYWwsICZWYWwgKyAxKTsKKyAgfQorfTsKKworLy8vIFN0cmluZ0xpdGVyYWwgLSBUaGlzIHJlcHJlc2VudHMgYSBzdHJpbmcgbGl0ZXJhbCBleHByZXNzaW9uLCBlLmcuICJmb28iCisvLy8gb3IgTCJiYXIiICh3aWRlIHN0cmluZ3MpLiAgVGhlIGFjdHVhbCBzdHJpbmcgaXMgcmV0dXJuZWQgYnkgZ2V0Qnl0ZXMoKQorLy8vIGlzIE5PVCBudWxsLXRlcm1pbmF0ZWQsIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaXMgZGV0ZXJtaW5lZCBieQorLy8vIGNhbGxpbmcgZ2V0Qnl0ZUxlbmd0aCgpLiAgVGhlIEMgdHlwZSBmb3IgYSBzdHJpbmcgaXMgYWx3YXlzIGEKKy8vLyBDb25zdGFudEFycmF5VHlwZS4gIEluIEMrKywgdGhlIGNoYXIgdHlwZSBpcyBjb25zdCBxdWFsaWZpZWQsIGluIEMgaXQgaXMKKy8vLyBub3QuCisvLy8KKy8vLyBOb3RlIHRoYXQgc3RyaW5ncyBpbiBDIGNhbiBiZSBmb3JtZWQgYnkgY29uY2F0ZW5hdGlvbiBvZiBtdWx0aXBsZSBzdHJpbmcKKy8vLyBsaXRlcmFsIHBwdG9rZW5zIGluIHRyYW5zbGF0aW9uIHBoYXNlICM2LiAgVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgbG9jYXRpb25zCisvLy8gb2YgZWFjaCBvZiB0aGVzZSBwaWVjZXMuCisvLy8KKy8vLyBTdHJpbmdzIGluIEMgY2FuIGFsc28gYmUgdHJ1bmNhdGVkIGFuZCBleHRlbmRlZCBieSBhc3NpZ25pbmcgaW50byBhcnJheXMsCisvLy8gZS5nLiB3aXRoIGNvbnN0cnVjdHMgbGlrZToKKy8vLyAgIGNoYXIgWFsyXSA9ICJmb29iYXIiOworLy8vIEluIHRoaXMgY2FzZSwgZ2V0Qnl0ZUxlbmd0aCgpIHdpbGwgcmV0dXJuIDYsIGJ1dCB0aGUgc3RyaW5nIGxpdGVyYWwgd2lsbAorLy8vIGhhdmUgdHlwZSAiY2hhclsyXSIuCitjbGFzcyBTdHJpbmdMaXRlcmFsIDogcHVibGljIEV4cHIgeworcHVibGljOgorICBlbnVtIFN0cmluZ0tpbmQgeworICAgIEFzY2lpLAorICAgIFdpZGUsCisgICAgVVRGOCwKKyAgICBVVEYxNiwKKyAgICBVVEYzMgorICB9OworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKworICB1bmlvbiB7CisgICAgY29uc3QgY2hhciAqYXNDaGFyOworICAgIGNvbnN0IHVpbnQxNl90ICphc1VJbnQxNjsKKyAgICBjb25zdCB1aW50MzJfdCAqYXNVSW50MzI7CisgIH0gU3RyRGF0YTsKKyAgdW5zaWduZWQgTGVuZ3RoOworICB1bnNpZ25lZCBDaGFyQnl0ZVdpZHRoIDogNDsKKyAgdW5zaWduZWQgS2luZCA6IDM7CisgIHVuc2lnbmVkIElzUGFzY2FsIDogMTsKKyAgdW5zaWduZWQgTnVtQ29uY2F0ZW5hdGVkOworICBTb3VyY2VMb2NhdGlvbiBUb2tMb2NzWzFdOworCisgIFN0cmluZ0xpdGVyYWwoUXVhbFR5cGUgVHkpIDoKKyAgICBFeHByKFN0cmluZ0xpdGVyYWxDbGFzcywgVHksIFZLX0xWYWx1ZSwgT0tfT3JkaW5hcnksIGZhbHNlLCBmYWxzZSwgZmFsc2UsCisgICAgICAgICBmYWxzZSkge30KKworICBzdGF0aWMgaW50IG1hcENoYXJCeXRlV2lkdGgoVGFyZ2V0SW5mbyBjb25zdCAmdGFyZ2V0LFN0cmluZ0tpbmQgayk7CisKK3B1YmxpYzoKKyAgLy8vIFRoaXMgaXMgdGhlICJmdWxseSBnZW5lcmFsIiBjb25zdHJ1Y3RvciB0aGF0IGFsbG93cyByZXByZXNlbnRhdGlvbiBvZgorICAvLy8gc3RyaW5ncyBmb3JtZWQgZnJvbSBtdWx0aXBsZSBjb25jYXRlbmF0ZWQgdG9rZW5zLgorICBzdGF0aWMgU3RyaW5nTGl0ZXJhbCAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFN0cmluZ1JlZiBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nS2luZCBLaW5kLCBib29sIFBhc2NhbCwgUXVhbFR5cGUgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTG9jYXRpb24gKkxvYywgdW5zaWduZWQgTnVtU3Rycyk7CisKKyAgLy8vIFNpbXBsZSBjb25zdHJ1Y3RvciBmb3Igc3RyaW5nIGxpdGVyYWxzIG1hZGUgZnJvbSBvbmUgdG9rZW4uCisgIHN0YXRpYyBTdHJpbmdMaXRlcmFsICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU3RyaW5nUmVmIFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdLaW5kIEtpbmQsIGJvb2wgUGFzY2FsLCBRdWFsVHlwZSBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICByZXR1cm4gQ3JlYXRlKEMsIFN0ciwgS2luZCwgUGFzY2FsLCBUeSwgJkxvYywgMSk7CisgIH0KKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBlbXB0eSBzdHJpbmcgbGl0ZXJhbC4KKyAgc3RhdGljIFN0cmluZ0xpdGVyYWwgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE51bVN0cnMpOworCisgIFN0cmluZ1JlZiBnZXRTdHJpbmcoKSBjb25zdCB7CisgICAgYXNzZXJ0KENoYXJCeXRlV2lkdGg9PTEKKyAgICAgICAgICAgJiYgIlRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBwbGFjZXMgdGhhdCBhc3N1bWUgc3RyaW5ncyB1c2UgY2hhciIpOworICAgIHJldHVybiBTdHJpbmdSZWYoU3RyRGF0YS5hc0NoYXIsIGdldEJ5dGVMZW5ndGgoKSk7CisgIH0KKworICAvLy8gQWxsb3cgYWNjZXNzIHRvIGNsaWVudHMgdGhhdCBuZWVkIHRoZSBieXRlIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzCisgIC8vLyBBU1RXcml0ZXJTdG10OjpWaXNpdFN0cmluZ0xpdGVyYWwoKS4KKyAgU3RyaW5nUmVmIGdldEJ5dGVzKCkgY29uc3QgeworICAgIC8vIEZJWE1FOiBTdHJpbmdSZWYgbWF5IG5vdCBiZSB0aGUgcmlnaHQgdHlwZSB0byB1c2UgYXMgYSByZXN1bHQgZm9yIHRoaXMuCisgICAgaWYgKENoYXJCeXRlV2lkdGggPT0gMSkKKyAgICAgIHJldHVybiBTdHJpbmdSZWYoU3RyRGF0YS5hc0NoYXIsIGdldEJ5dGVMZW5ndGgoKSk7CisgICAgaWYgKENoYXJCeXRlV2lkdGggPT0gNCkKKyAgICAgIHJldHVybiBTdHJpbmdSZWYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oU3RyRGF0YS5hc1VJbnQzMiksCisgICAgICAgICAgICAgICAgICAgICAgIGdldEJ5dGVMZW5ndGgoKSk7CisgICAgYXNzZXJ0KENoYXJCeXRlV2lkdGggPT0gMiAmJiAidW5zdXBwb3J0ZWQgQ2hhckJ5dGVXaWR0aCIpOworICAgIHJldHVybiBTdHJpbmdSZWYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oU3RyRGF0YS5hc1VJbnQxNiksCisgICAgICAgICAgICAgICAgICAgICBnZXRCeXRlTGVuZ3RoKCkpOworICB9CisKKyAgdm9pZCBvdXRwdXRTdHJpbmcocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICB1aW50MzJfdCBnZXRDb2RlVW5pdChzaXplX3QgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgTGVuZ3RoICYmICJvdXQgb2YgYm91bmRzIGFjY2VzcyIpOworICAgIGlmIChDaGFyQnl0ZVdpZHRoID09IDEpCisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oU3RyRGF0YS5hc0NoYXJbaV0pOworICAgIGlmIChDaGFyQnl0ZVdpZHRoID09IDQpCisgICAgICByZXR1cm4gU3RyRGF0YS5hc1VJbnQzMltpXTsKKyAgICBhc3NlcnQoQ2hhckJ5dGVXaWR0aCA9PSAyICYmICJ1bnN1cHBvcnRlZCBDaGFyQnl0ZVdpZHRoIik7CisgICAgcmV0dXJuIFN0ckRhdGEuYXNVSW50MTZbaV07CisgIH0KKworICB1bnNpZ25lZCBnZXRCeXRlTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gQ2hhckJ5dGVXaWR0aCpMZW5ndGg7IH0KKyAgdW5zaWduZWQgZ2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gTGVuZ3RoOyB9CisgIHVuc2lnbmVkIGdldENoYXJCeXRlV2lkdGgoKSBjb25zdCB7IHJldHVybiBDaGFyQnl0ZVdpZHRoOyB9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBzdHJpbmcgZGF0YSB0byB0aGUgZ2l2ZW4gc3RyaW5nIGRhdGEuCisgIHZvaWQgc2V0U3RyaW5nKGNvbnN0IEFTVENvbnRleHQgJkMsIFN0cmluZ1JlZiBTdHIsCisgICAgICAgICAgICAgICAgIFN0cmluZ0tpbmQgS2luZCwgYm9vbCBJc1Bhc2NhbCk7CisKKyAgU3RyaW5nS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8U3RyaW5nS2luZD4oS2luZCk7IH0KKworCisgIGJvb2wgaXNBc2NpaSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gQXNjaWk7IH0KKyAgYm9vbCBpc1dpZGUoKSBjb25zdCB7IHJldHVybiBLaW5kID09IFdpZGU7IH0KKyAgYm9vbCBpc1VURjgoKSBjb25zdCB7IHJldHVybiBLaW5kID09IFVURjg7IH0KKyAgYm9vbCBpc1VURjE2KCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBVVEYxNjsgfQorICBib29sIGlzVVRGMzIoKSBjb25zdCB7IHJldHVybiBLaW5kID09IFVURjMyOyB9CisgIGJvb2wgaXNQYXNjYWwoKSBjb25zdCB7IHJldHVybiBJc1Bhc2NhbDsgfQorCisgIGJvb2wgY29udGFpbnNOb25Bc2NpaU9yTnVsbCgpIGNvbnN0IHsKKyAgICBTdHJpbmdSZWYgU3RyID0gZ2V0U3RyaW5nKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFN0ci5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKCFpc0FTQ0lJKFN0cltpXSkgfHwgIVN0cltpXSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIGdldE51bUNvbmNhdGVuYXRlZCAtIEdldCB0aGUgbnVtYmVyIG9mIHN0cmluZyBsaXRlcmFsIHRva2VucyB0aGF0IHdlcmUKKyAgLy8vIGNvbmNhdGVuYXRlZCBpbiB0cmFuc2xhdGlvbiBwaGFzZSAjNiB0byBmb3JtIHRoaXMgc3RyaW5nIGxpdGVyYWwuCisgIHVuc2lnbmVkIGdldE51bUNvbmNhdGVuYXRlZCgpIGNvbnN0IHsgcmV0dXJuIE51bUNvbmNhdGVuYXRlZDsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFN0clRva2VuTG9jKHVuc2lnbmVkIFRva051bSkgY29uc3QgeworICAgIGFzc2VydChUb2tOdW0gPCBOdW1Db25jYXRlbmF0ZWQgJiYgIkludmFsaWQgdG9rIG51bWJlciIpOworICAgIHJldHVybiBUb2tMb2NzW1Rva051bV07CisgIH0KKyAgdm9pZCBzZXRTdHJUb2tlbkxvYyh1bnNpZ25lZCBUb2tOdW0sIFNvdXJjZUxvY2F0aW9uIEwpIHsKKyAgICBhc3NlcnQoVG9rTnVtIDwgTnVtQ29uY2F0ZW5hdGVkICYmICJJbnZhbGlkIHRvayBudW1iZXIiKTsKKyAgICBUb2tMb2NzW1Rva051bV0gPSBMOworICB9CisKKyAgLy8vIGdldExvY2F0aW9uT2ZCeXRlIC0gUmV0dXJuIGEgc291cmNlIGxvY2F0aW9uIHRoYXQgcG9pbnRzIHRvIHRoZSBzcGVjaWZpZWQKKyAgLy8vIGJ5dGUgb2YgdGhpcyBzdHJpbmcgbGl0ZXJhbC4KKyAgLy8vCisgIC8vLyBTdHJpbmdzIGFyZSBhbWF6aW5nbHkgY29tcGxleC4gIFRoZXkgY2FuIGJlIGZvcm1lZCBmcm9tIG11bHRpcGxlIHRva2VucworICAvLy8gYW5kIGNhbiBoYXZlIGVzY2FwZSBzZXF1ZW5jZXMgaW4gdGhlbSBpbiBhZGRpdGlvbiB0byB0aGUgdXN1YWwgdHJpZ3JhcGgKKyAgLy8vIGFuZCBlc2NhcGVkIG5ld2xpbmUgYnVzaW5lc3MuICBUaGlzIHJvdXRpbmUgaGFuZGxlcyB0aGlzIGNvbXBsZXhpdHkuCisgIC8vLworICBTb3VyY2VMb2NhdGlvbgorICBnZXRMb2NhdGlvbk9mQnl0ZSh1bnNpZ25lZCBCeXRlTm8sIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmRmVhdHVyZXMsIGNvbnN0IFRhcmdldEluZm8gJlRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKlN0YXJ0VG9rZW4gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqU3RhcnRUb2tlbkJ5dGVPZmZzZXQgPSBudWxscHRyKSBjb25zdDsKKworICB0eXBlZGVmIGNvbnN0IFNvdXJjZUxvY2F0aW9uICp0b2tsb2NfaXRlcmF0b3I7CisgIHRva2xvY19pdGVyYXRvciB0b2tsb2NfYmVnaW4oKSBjb25zdCB7IHJldHVybiBUb2tMb2NzOyB9CisgIHRva2xvY19pdGVyYXRvciB0b2tsb2NfZW5kKCkgY29uc3QgeyByZXR1cm4gVG9rTG9jcyArIE51bUNvbmNhdGVuYXRlZDsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBUb2tMb2NzWzBdOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBUb2tMb2NzW051bUNvbmNhdGVuYXRlZCAtIDFdOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IFN0cmluZ0xpdGVyYWxDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoY2hpbGRfaXRlcmF0b3IoKSwgY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KKyAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKGNvbnN0X2NoaWxkX2l0ZXJhdG9yKCksIGNvbnN0X2NoaWxkX2l0ZXJhdG9yKCkpOworICB9Cit9OworCisvLy8gUGFyZW5FeHByIC0gVGhpcyByZXByZXNlbnRzIGEgcGFyZXRoZXNpemVkIGV4cHJlc3Npb24sIGUuZy4gIigxKSIuICBUaGlzCisvLy8gQVNUIG5vZGUgaXMgb25seSBmb3JtZWQgaWYgZnVsbCBsb2NhdGlvbiBpbmZvcm1hdGlvbiBpcyByZXF1ZXN0ZWQuCitjbGFzcyBQYXJlbkV4cHIgOiBwdWJsaWMgRXhwciB7CisgIFNvdXJjZUxvY2F0aW9uIEwsIFI7CisgIFN0bXQgKlZhbDsKK3B1YmxpYzoKKyAgUGFyZW5FeHByKFNvdXJjZUxvY2F0aW9uIGwsIFNvdXJjZUxvY2F0aW9uIHIsIEV4cHIgKnZhbCkKKyAgICA6IEV4cHIoUGFyZW5FeHByQ2xhc3MsIHZhbC0+Z2V0VHlwZSgpLAorICAgICAgICAgICB2YWwtPmdldFZhbHVlS2luZCgpLCB2YWwtPmdldE9iamVjdEtpbmQoKSwKKyAgICAgICAgICAgdmFsLT5pc1R5cGVEZXBlbmRlbnQoKSwgdmFsLT5pc1ZhbHVlRGVwZW5kZW50KCksCisgICAgICAgICAgIHZhbC0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCksCisgICAgICAgICAgIHZhbC0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSwKKyAgICAgIEwobCksIFIociksIFZhbCh2YWwpIHt9CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYW4gZW1wdHkgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLgorICBleHBsaWNpdCBQYXJlbkV4cHIoRW1wdHlTaGVsbCBFbXB0eSkKKyAgICA6IEV4cHIoUGFyZW5FeHByQ2xhc3MsIEVtcHR5KSB7IH0KKworICBjb25zdCBFeHByICpnZXRTdWJFeHByKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihWYWwpOyB9CisgIEV4cHIgKmdldFN1YkV4cHIoKSB7IHJldHVybiBjYXN0PEV4cHI+KFZhbCk7IH0KKyAgdm9pZCBzZXRTdWJFeHByKEV4cHIgKkUpIHsgVmFsID0gRTsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUjsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgbGVmdCBwYXJlbnRoZXNlcyAnKCcuCisgIFNvdXJjZUxvY2F0aW9uIGdldExQYXJlbigpIGNvbnN0IHsgcmV0dXJuIEw7IH0KKyAgdm9pZCBzZXRMUGFyZW4oU291cmNlTG9jYXRpb24gTG9jKSB7IEwgPSBMb2M7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIHJpZ2h0IHBhcmVudGhlc2VzICcpJy4KKyAgU291cmNlTG9jYXRpb24gZ2V0UlBhcmVuKCkgY29uc3QgeyByZXR1cm4gUjsgfQorICB2b2lkIHNldFJQYXJlbihTb3VyY2VMb2NhdGlvbiBMb2MpIHsgUiA9IExvYzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBQYXJlbkV4cHJDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsgcmV0dXJuIGNoaWxkX3JhbmdlKCZWYWwsICZWYWwrMSk7IH0KKyAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKCZWYWwsICZWYWwgKyAxKTsKKyAgfQorfTsKKworLy8vIFVuYXJ5T3BlcmF0b3IgLSBUaGlzIHJlcHJlc2VudHMgdGhlIHVuYXJ5LWV4cHJlc3Npb24ncyAoZXhjZXB0IHNpemVvZiBhbmQKKy8vLyBhbGlnbm9mKSwgdGhlIHBvc3RpbmMvcG9zdGRlYyBvcGVyYXRvcnMgZnJvbSBwb3N0Zml4LWV4cHJlc3Npb24sIGFuZCB2YXJpb3VzCisvLy8gZXh0ZW5zaW9ucy4KKy8vLworLy8vIE5vdGVzIG9uIHZhcmlvdXMgbm9kZXM6CisvLy8KKy8vLyBSZWFsL0ltYWcgLSBUaGVzZSByZXR1cm4gdGhlIHJlYWwvaW1hZyBwYXJ0IG9mIGEgY29tcGxleCBvcGVyYW5kLiAgSWYKKy8vLyAgIGFwcGxpZWQgdG8gYSBub24tY29tcGxleCB2YWx1ZSwgdGhlIGZvcm1lciByZXR1cm5zIGl0cyBvcGVyYW5kIGFuZCB0aGUKKy8vLyAgIGxhdGVyIHJldHVybnMgemVybyBpbiB0aGUgdHlwZSBvZiB0aGUgb3BlcmFuZC4KKy8vLworY2xhc3MgVW5hcnlPcGVyYXRvciA6IHB1YmxpYyBFeHByIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBVbmFyeU9wZXJhdG9yS2luZCBPcGNvZGU7CisKK3ByaXZhdGU6CisgIHVuc2lnbmVkIE9wYyA6IDU7CisgIHVuc2lnbmVkIENhbk92ZXJmbG93IDogMTsKKyAgU291cmNlTG9jYXRpb24gTG9jOworICBTdG10ICpWYWw7CitwdWJsaWM6CisgIFVuYXJ5T3BlcmF0b3IoRXhwciAqaW5wdXQsIE9wY29kZSBvcGMsIFF1YWxUeXBlIHR5cGUsIEV4cHJWYWx1ZUtpbmQgVkssCisgICAgICAgICAgICAgICAgRXhwck9iamVjdEtpbmQgT0ssIFNvdXJjZUxvY2F0aW9uIGwsIGJvb2wgQ2FuT3ZlcmZsb3cpCisgICAgICA6IEV4cHIoVW5hcnlPcGVyYXRvckNsYXNzLCB0eXBlLCBWSywgT0ssCisgICAgICAgICAgICAgaW5wdXQtPmlzVHlwZURlcGVuZGVudCgpIHx8IHR5cGUtPmlzRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgIGlucHV0LT5pc1ZhbHVlRGVwZW5kZW50KCksCisgICAgICAgICAgICAgKGlucHV0LT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnQoKSB8fAorICAgICAgICAgICAgICB0eXBlLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnRUeXBlKCkpLAorICAgICAgICAgICAgIGlucHV0LT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgICBPcGMob3BjKSwgQ2FuT3ZlcmZsb3coQ2FuT3ZlcmZsb3cpLCBMb2MobCksIFZhbChpbnB1dCkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IHVuYXJ5IG9wZXJhdG9yLgorICBleHBsaWNpdCBVbmFyeU9wZXJhdG9yKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgOiBFeHByKFVuYXJ5T3BlcmF0b3JDbGFzcywgRW1wdHkpLCBPcGMoVU9fQWRkck9mKSB7IH0KKworICBPcGNvZGUgZ2V0T3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8T3Bjb2RlPihPcGMpOyB9CisgIHZvaWQgc2V0T3Bjb2RlKE9wY29kZSBPKSB7IE9wYyA9IE87IH0KKworICBFeHByICpnZXRTdWJFeHByKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihWYWwpOyB9CisgIHZvaWQgc2V0U3ViRXhwcihFeHByICpFKSB7IFZhbCA9IEU7IH0KKworICAvLy8gZ2V0T3BlcmF0b3JMb2MgLSBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBvcGVyYXRvci4KKyAgU291cmNlTG9jYXRpb24gZ2V0T3BlcmF0b3JMb2MoKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKyAgdm9pZCBzZXRPcGVyYXRvckxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IExvYyA9IEw7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB1bmFyeSBvcGVyYXRvciBjYW4gY2F1c2UgYW4gb3ZlcmZsb3cuIEZvciBpbnN0YW5jZSwKKyAgLy8vICAgc2lnbmVkIGludCBpID0gSU5UX01BWDsgaSsrOworICAvLy8gICBzaWduZWQgY2hhciBjID0gQ0hBUl9NQVg7IGMrKzsKKyAgLy8vIER1ZSB0byBpbnRlZ2VyIHByb21vdGlvbnMsIGMrKyBpcyBwcm9tb3RlZCB0byBhbiBpbnQgYmVmb3JlIHRoZSBwb3N0Zml4CisgIC8vLyBpbmNyZW1lbnQsIGFuZCB0aGUgcmVzdWx0IGlzIGFuIGludCB0aGF0IGNhbm5vdCBvdmVyZmxvdy4gSG93ZXZlciwgaSsrCisgIC8vLyBjYW4gb3ZlcmZsb3cuCisgIGJvb2wgY2FuT3ZlcmZsb3coKSBjb25zdCB7IHJldHVybiBDYW5PdmVyZmxvdzsgfQorICB2b2lkIHNldENhbk92ZXJmbG93KGJvb2wgQykgeyBDYW5PdmVyZmxvdyA9IEM7IH0KKworICAvLy8gaXNQb3N0Zml4IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHBvc3RmaXggb3BlcmF0aW9uLCBsaWtlIHgrKy4KKyAgc3RhdGljIGJvb2wgaXNQb3N0Zml4KE9wY29kZSBPcCkgeworICAgIHJldHVybiBPcCA9PSBVT19Qb3N0SW5jIHx8IE9wID09IFVPX1Bvc3REZWM7CisgIH0KKworICAvLy8gaXNQcmVmaXggLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgcHJlZml4IG9wZXJhdGlvbiwgbGlrZSAtLXguCisgIHN0YXRpYyBib29sIGlzUHJlZml4KE9wY29kZSBPcCkgeworICAgIHJldHVybiBPcCA9PSBVT19QcmVJbmMgfHwgT3AgPT0gVU9fUHJlRGVjOworICB9CisKKyAgYm9vbCBpc1ByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIGlzUHJlZml4KGdldE9wY29kZSgpKTsgfQorICBib29sIGlzUG9zdGZpeCgpIGNvbnN0IHsgcmV0dXJuIGlzUG9zdGZpeChnZXRPcGNvZGUoKSk7IH0KKworICBzdGF0aWMgYm9vbCBpc0luY3JlbWVudE9wKE9wY29kZSBPcCkgeworICAgIHJldHVybiBPcCA9PSBVT19QcmVJbmMgfHwgT3AgPT0gVU9fUG9zdEluYzsKKyAgfQorICBib29sIGlzSW5jcmVtZW50T3AoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzSW5jcmVtZW50T3AoZ2V0T3Bjb2RlKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNEZWNyZW1lbnRPcChPcGNvZGUgT3ApIHsKKyAgICByZXR1cm4gT3AgPT0gVU9fUHJlRGVjIHx8IE9wID09IFVPX1Bvc3REZWM7CisgIH0KKyAgYm9vbCBpc0RlY3JlbWVudE9wKCkgY29uc3QgeworICAgIHJldHVybiBpc0RlY3JlbWVudE9wKGdldE9wY29kZSgpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzSW5jcmVtZW50RGVjcmVtZW50T3AoT3Bjb2RlIE9wKSB7IHJldHVybiBPcCA8PSBVT19QcmVEZWM7IH0KKyAgYm9vbCBpc0luY3JlbWVudERlY3JlbWVudE9wKCkgY29uc3QgeworICAgIHJldHVybiBpc0luY3JlbWVudERlY3JlbWVudE9wKGdldE9wY29kZSgpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzQXJpdGhtZXRpY09wKE9wY29kZSBPcCkgeworICAgIHJldHVybiBPcCA+PSBVT19QbHVzICYmIE9wIDw9IFVPX0xOb3Q7CisgIH0KKyAgYm9vbCBpc0FyaXRobWV0aWNPcCgpIGNvbnN0IHsgcmV0dXJuIGlzQXJpdGhtZXRpY09wKGdldE9wY29kZSgpKTsgfQorCisgIC8vLyBnZXRPcGNvZGVTdHIgLSBUdXJuIGFuIE9wY29kZSBlbnVtIHZhbHVlIGludG8gdGhlIHB1bmN0dWF0aW9uIGNoYXIgaXQKKyAgLy8vIGNvcnJlc3BvbmRzIHRvLCBlLmcuICJzaXplb2YiIG9yICJbcHJlXSsrIgorICBzdGF0aWMgU3RyaW5nUmVmIGdldE9wY29kZVN0cihPcGNvZGUgT3ApOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHVuYXJ5IG9wY29kZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbgorICAvLy8gb3ZlcmxvYWRlZCBvcGVyYXRvci4KKyAgc3RhdGljIE9wY29kZSBnZXRPdmVybG9hZGVkT3Bjb2RlKE92ZXJsb2FkZWRPcGVyYXRvcktpbmQgT08sIGJvb2wgUG9zdGZpeCk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgb3ZlcmxvYWRlZCBvcGVyYXRvciBraW5kIHRoYXQgY29ycmVzcG9uZHMgdG8KKyAgLy8vIHRoZSBnaXZlbiB1bmFyeSBvcGNvZGUuCisgIHN0YXRpYyBPdmVybG9hZGVkT3BlcmF0b3JLaW5kIGdldE92ZXJsb2FkZWRPcGVyYXRvcihPcGNvZGUgT3BjKTsKKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBpc1Bvc3RmaXgoKSA/IFZhbC0+Z2V0TG9jU3RhcnQoKSA6IExvYzsKKyAgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gaXNQb3N0Zml4KCkgPyBMb2MgOiBWYWwtPmdldExvY0VuZCgpOworICB9CisgIFNvdXJjZUxvY2F0aW9uIGdldEV4cHJMb2MoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIExvYzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBVbmFyeU9wZXJhdG9yQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7IHJldHVybiBjaGlsZF9yYW5nZSgmVmFsLCAmVmFsKzEpOyB9CisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jaGlsZF9yYW5nZSgmVmFsLCAmVmFsICsgMSk7CisgIH0KK307CisKKy8vLyBIZWxwZXIgY2xhc3MgZm9yIE9mZnNldE9mRXhwci4KKworLy8gX19idWlsdGluX29mZnNldG9mKHR5cGUsIGlkZW50aWZpZXIoLmlkZW50aWZpZXJ8W2V4cHJdKSopCitjbGFzcyBPZmZzZXRPZk5vZGUgeworcHVibGljOgorICAvLy8gXGJyaWVmIFRoZSBraW5kIG9mIG9mZnNldG9mIG5vZGUgd2UgaGF2ZS4KKyAgZW51bSBLaW5kIHsKKyAgICAvLy8gXGJyaWVmIEFuIGluZGV4IGludG8gYW4gYXJyYXkuCisgICAgQXJyYXkgPSAweDAwLAorICAgIC8vLyBcYnJpZWYgQSBmaWVsZC4KKyAgICBGaWVsZCA9IDB4MDEsCisgICAgLy8vIFxicmllZiBBIGZpZWxkIGluIGEgZGVwZW5kZW50IHR5cGUsIGtub3duIG9ubHkgYnkgaXRzIG5hbWUuCisgICAgSWRlbnRpZmllciA9IDB4MDIsCisgICAgLy8vIFxicmllZiBBbiBpbXBsaWNpdCBpbmRpcmVjdGlvbiB0aHJvdWdoIGEgQysrIGJhc2UgY2xhc3MsIHdoZW4gdGhlCisgICAgLy8vIGZpZWxkIGZvdW5kIGlzIGluIGEgYmFzZSBjbGFzcy4KKyAgICBCYXNlID0gMHgwMworICB9OworCitwcml2YXRlOgorICBlbnVtIHsgTWFza0JpdHMgPSAyLCBNYXNrID0gMHgwMyB9OworCisgIC8vLyBcYnJpZWYgVGhlIHNvdXJjZSByYW5nZSB0aGF0IGNvdmVycyB0aGlzIHBhcnQgb2YgdGhlIGRlc2lnbmF0b3IuCisgIFNvdXJjZVJhbmdlIFJhbmdlOworCisgIC8vLyBcYnJpZWYgVGhlIGRhdGEgZGVzY3JpYmluZyB0aGUgZGVzaWduYXRvciwgd2hpY2ggY29tZXMgaW4gdGhyZWUKKyAgLy8vIGRpZmZlcmVudCBmb3JtcywgZGVwZW5kaW5nIG9uIHRoZSBsb3dlciB0d28gYml0cy4KKyAgLy8vICAgLSBBbiB1bnNpZ25lZCBpbmRleCBpbnRvIHRoZSBhcnJheSBvZiBFeHByKidzIHN0b3JlZCBhZnRlciB0aGlzIG5vZGUKKyAgLy8vICAgICBpbiBtZW1vcnksIGZvciBbY29uc3RhbnQtZXhwcmVzc2lvbl0gZGVzaWduYXRvcnMuCisgIC8vLyAgIC0gQSBGaWVsZERlY2wqLCBmb3IgcmVmZXJlbmNlcyB0byBhIGtub3duIGZpZWxkLgorICAvLy8gICAtIEFuIElkZW50aWZpZXJJbmZvKiwgZm9yIHJlZmVyZW5jZXMgdG8gYSBmaWVsZCB3aXRoIGEgZ2l2ZW4gbmFtZQorICAvLy8gICAgIHdoZW4gdGhlIGNsYXNzIHR5cGUgaXMgZGVwZW5kZW50LgorICAvLy8gICAtIEEgQ1hYQmFzZVNwZWNpZmllciosIGZvciByZWZlcmVuY2VzIHRoYXQgbG9vayBhdCBhIGZpZWxkIGluIGEKKyAgLy8vICAgICBiYXNlIGNsYXNzLgorICB1aW50cHRyX3QgRGF0YTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZSBhbiBvZmZzZXRvZiBub2RlIHRoYXQgcmVmZXJzIHRvIGFuIGFycmF5IGVsZW1lbnQuCisgIE9mZnNldE9mTm9kZShTb3VyY2VMb2NhdGlvbiBMQnJhY2tldExvYywgdW5zaWduZWQgSW5kZXgsCisgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSQnJhY2tldExvYykKKyAgICAgIDogUmFuZ2UoTEJyYWNrZXRMb2MsIFJCcmFja2V0TG9jKSwgRGF0YSgoSW5kZXggPDwgMikgfCBBcnJheSkge30KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhbiBvZmZzZXRvZiBub2RlIHRoYXQgcmVmZXJzIHRvIGEgZmllbGQuCisgIE9mZnNldE9mTm9kZShTb3VyY2VMb2NhdGlvbiBEb3RMb2MsIEZpZWxkRGVjbCAqRmllbGQsIFNvdXJjZUxvY2F0aW9uIE5hbWVMb2MpCisgICAgICA6IFJhbmdlKERvdExvYy5pc1ZhbGlkKCkgPyBEb3RMb2MgOiBOYW1lTG9jLCBOYW1lTG9jKSwKKyAgICAgICAgRGF0YShyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oRmllbGQpIHwgT2Zmc2V0T2ZOb2RlOjpGaWVsZCkge30KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhbiBvZmZzZXRvZiBub2RlIHRoYXQgcmVmZXJzIHRvIGFuIGlkZW50aWZpZXIuCisgIE9mZnNldE9mTm9kZShTb3VyY2VMb2NhdGlvbiBEb3RMb2MsIElkZW50aWZpZXJJbmZvICpOYW1lLAorICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTmFtZUxvYykKKyAgICAgIDogUmFuZ2UoRG90TG9jLmlzVmFsaWQoKSA/IERvdExvYyA6IE5hbWVMb2MsIE5hbWVMb2MpLAorICAgICAgICBEYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihOYW1lKSB8IElkZW50aWZpZXIpIHt9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gb2Zmc2V0b2Ygbm9kZSB0aGF0IHJlZmVycyBpbnRvIGEgQysrIGJhc2UgY2xhc3MuCisgIGV4cGxpY2l0IE9mZnNldE9mTm9kZShjb25zdCBDWFhCYXNlU3BlY2lmaWVyICpCYXNlKQorICAgICAgOiBSYW5nZSgpLCBEYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihCYXNlKSB8IE9mZnNldE9mTm9kZTo6QmFzZSkge30KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGF0IGtpbmQgb2Ygb2Zmc2V0b2Ygbm9kZSB0aGlzIGlzLgorICBLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxLaW5kPihEYXRhICYgTWFzayk7IH0KKworICAvLy8gXGJyaWVmIEZvciBhbiBhcnJheSBlbGVtZW50IG5vZGUsIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGFycmF5CisgIC8vLyBvZiBleHByZXNzaW9ucy4KKyAgdW5zaWduZWQgZ2V0QXJyYXlFeHBySW5kZXgoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEtpbmQoKSA9PSBBcnJheSk7CisgICAgcmV0dXJuIERhdGEgPj4gMjsKKyAgfQorCisgIC8vLyBcYnJpZWYgRm9yIGEgZmllbGQgb2Zmc2V0b2Ygbm9kZSwgcmV0dXJucyB0aGUgZmllbGQuCisgIEZpZWxkRGVjbCAqZ2V0RmllbGQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEtpbmQoKSA9PSBGaWVsZCk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RmllbGREZWNsICo+KERhdGEgJiB+KHVpbnRwdHJfdClNYXNrKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRm9yIGEgZmllbGQgb3IgaWRlbnRpZmllciBvZmZzZXRvZiBub2RlLCByZXR1cm5zIHRoZSBuYW1lIG9mCisgIC8vLyB0aGUgZmllbGQuCisgIElkZW50aWZpZXJJbmZvICpnZXRGaWVsZE5hbWUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEZvciBhIGJhc2UgY2xhc3Mgbm9kZSwgcmV0dXJucyB0aGUgYmFzZSBzcGVjaWZpZXIuCisgIENYWEJhc2VTcGVjaWZpZXIgKmdldEJhc2UoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEtpbmQoKSA9PSBCYXNlKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDWFhCYXNlU3BlY2lmaWVyICo+KERhdGEgJiB+KHVpbnRwdHJfdClNYXNrKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHNvdXJjZSByYW5nZSB0aGF0IGNvdmVycyB0aGlzIG9mZnNldG9mIG5vZGUuCisgIC8vLworICAvLy8gRm9yIGFuIGFycmF5IGVsZW1lbnQgbm9kZSwgdGhlIHNvdXJjZSByYW5nZSBjb250YWlucyB0aGUgbG9jYXRpb25zIG9mCisgIC8vLyB0aGUgc3F1YXJlIGJyYWNrZXRzLiBGb3IgYSBmaWVsZCBvciBpZGVudGlmaWVyIG5vZGUsIHRoZSBzb3VyY2UgcmFuZ2UKKyAgLy8vIGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGVyaW9kIChpZiB0aGVyZSBpcyBvbmUpIGFuZCB0aGUKKyAgLy8vIGlkZW50aWZpZXIuCisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSYW5nZTsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUmFuZ2UuZ2V0QmVnaW4oKTsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJhbmdlLmdldEVuZCgpOyB9Cit9OworCisvLy8gT2Zmc2V0T2ZFeHByIC0gW0M5OSA3LjE3XSAtIFRoaXMgcmVwcmVzZW50cyBhbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtCisvLy8gb2Zmc2V0b2YocmVjb3JkLXR5cGUsIG1lbWJlci1kZXNpZ25hdG9yKS4gRm9yIGV4YW1wbGUsIGdpdmVuOgorLy8vIEBjb2RlCisvLy8gc3RydWN0IFMgeworLy8vICAgZmxvYXQgZjsKKy8vLyAgIGRvdWJsZSBkOworLy8vIH07CisvLy8gc3RydWN0IFQgeworLy8vICAgaW50IGk7CisvLy8gICBzdHJ1Y3QgUyBzWzEwXTsKKy8vLyB9OworLy8vIEBlbmRjb2RlCisvLy8gd2UgY2FuIHJlcHJlc2VudCBhbmQgZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gQGMgb2Zmc2V0b2Yoc3RydWN0IFQsIHNbMl0uZCkuCisKK2NsYXNzIE9mZnNldE9mRXhwciBmaW5hbAorICAgIDogcHVibGljIEV4cHIsCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxPZmZzZXRPZkV4cHIsIE9mZnNldE9mTm9kZSwgRXhwciAqPiB7CisgIFNvdXJjZUxvY2F0aW9uIE9wZXJhdG9yTG9jLCBSUGFyZW5Mb2M7CisgIC8vIEJhc2UgdHlwZTsKKyAgVHlwZVNvdXJjZUluZm8gKlRTSW5mbzsKKyAgLy8gTnVtYmVyIG9mIHN1Yi1jb21wb25lbnRzIChpLmUuIGluc3RhbmNlcyBvZiBPZmZzZXRPZk5vZGUpLgorICB1bnNpZ25lZCBOdW1Db21wczsKKyAgLy8gTnVtYmVyIG9mIHN1Yi1leHByZXNzaW9ucyAoaS5lLiBhcnJheSBzdWJzY3JpcHQgZXhwcmVzc2lvbnMpLgorICB1bnNpZ25lZCBOdW1FeHByczsKKworICBzaXplX3QgbnVtVHJhaWxpbmdPYmplY3RzKE92ZXJsb2FkVG9rZW48T2Zmc2V0T2ZOb2RlPikgY29uc3QgeworICAgIHJldHVybiBOdW1Db21wczsKKyAgfQorCisgIE9mZnNldE9mRXhwcihjb25zdCBBU1RDb250ZXh0ICZDLCBRdWFsVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gT3BlcmF0b3JMb2MsIFR5cGVTb3VyY2VJbmZvICp0c2ksCisgICAgICAgICAgICAgICBBcnJheVJlZjxPZmZzZXRPZk5vZGU+IGNvbXBzLCBBcnJheVJlZjxFeHByKj4gZXhwcnMsCisgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MpOworCisgIGV4cGxpY2l0IE9mZnNldE9mRXhwcih1bnNpZ25lZCBudW1Db21wcywgdW5zaWduZWQgbnVtRXhwcnMpCisgICAgOiBFeHByKE9mZnNldE9mRXhwckNsYXNzLCBFbXB0eVNoZWxsKCkpLAorICAgICAgVFNJbmZvKG51bGxwdHIpLCBOdW1Db21wcyhudW1Db21wcyksIE51bUV4cHJzKG51bUV4cHJzKSB7fQorCitwdWJsaWM6CisKKyAgc3RhdGljIE9mZnNldE9mRXhwciAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFF1YWxUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBPcGVyYXRvckxvYywgVHlwZVNvdXJjZUluZm8gKnRzaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9mZnNldE9mTm9kZT4gY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByKj4gZXhwcnMsIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYyk7CisKKyAgc3RhdGljIE9mZnNldE9mRXhwciAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ29tcHMsIHVuc2lnbmVkIE51bUV4cHJzKTsKKworICAvLy8gZ2V0T3BlcmF0b3JMb2MgLSBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBvcGVyYXRvci4KKyAgU291cmNlTG9jYXRpb24gZ2V0T3BlcmF0b3JMb2MoKSBjb25zdCB7IHJldHVybiBPcGVyYXRvckxvYzsgfQorICB2b2lkIHNldE9wZXJhdG9yTG9jKFNvdXJjZUxvY2F0aW9uIEwpIHsgT3BlcmF0b3JMb2MgPSBMOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSByaWdodCBwYXJlbnRoZXNlcy4KKyAgU291cmNlTG9jYXRpb24gZ2V0UlBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gUlBhcmVuTG9jOyB9CisgIHZvaWQgc2V0UlBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIFIpIHsgUlBhcmVuTG9jID0gUjsgfQorCisgIFR5cGVTb3VyY2VJbmZvICpnZXRUeXBlU291cmNlSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gVFNJbmZvOworICB9CisgIHZvaWQgc2V0VHlwZVNvdXJjZUluZm8oVHlwZVNvdXJjZUluZm8gKnRzaSkgeworICAgIFRTSW5mbyA9IHRzaTsKKyAgfQorCisgIGNvbnN0IE9mZnNldE9mTm9kZSAmZ2V0Q29tcG9uZW50KHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGFzc2VydChJZHggPCBOdW1Db21wcyAmJiAiU3Vic2NyaXB0IG91dCBvZiByYW5nZSIpOworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8T2Zmc2V0T2ZOb2RlPigpW0lkeF07CisgIH0KKworICB2b2lkIHNldENvbXBvbmVudCh1bnNpZ25lZCBJZHgsIE9mZnNldE9mTm9kZSBPTikgeworICAgIGFzc2VydChJZHggPCBOdW1Db21wcyAmJiAiU3Vic2NyaXB0IG91dCBvZiByYW5nZSIpOworICAgIGdldFRyYWlsaW5nT2JqZWN0czxPZmZzZXRPZk5vZGU+KClbSWR4XSA9IE9OOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtQ29tcG9uZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtQ29tcHM7CisgIH0KKworICBFeHByKiBnZXRJbmRleEV4cHIodW5zaWduZWQgSWR4KSB7CisgICAgYXNzZXJ0KElkeCA8IE51bUV4cHJzICYmICJTdWJzY3JpcHQgb3V0IG9mIHJhbmdlIik7CisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxFeHByICo+KClbSWR4XTsKKyAgfQorCisgIGNvbnN0IEV4cHIgKmdldEluZGV4RXhwcih1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSWR4IDwgTnVtRXhwcnMgJiYgIlN1YnNjcmlwdCBvdXQgb2YgcmFuZ2UiKTsKKyAgICByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPEV4cHIgKj4oKVtJZHhdOworICB9CisKKyAgdm9pZCBzZXRJbmRleEV4cHIodW5zaWduZWQgSWR4LCBFeHByKiBFKSB7CisgICAgYXNzZXJ0KElkeCA8IE51bUNvbXBzICYmICJTdWJzY3JpcHQgb3V0IG9mIHJhbmdlIik7CisgICAgZ2V0VHJhaWxpbmdPYmplY3RzPEV4cHIgKj4oKVtJZHhdID0gRTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUV4cHJlc3Npb25zKCkgY29uc3QgeworICAgIHJldHVybiBOdW1FeHByczsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBPcGVyYXRvckxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJQYXJlbkxvYzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPZmZzZXRPZkV4cHJDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICBTdG10ICoqYmVnaW4gPSByZWludGVycHJldF9jYXN0PFN0bXQgKio+KGdldFRyYWlsaW5nT2JqZWN0czxFeHByICo+KCkpOworICAgIHJldHVybiBjaGlsZF9yYW5nZShiZWdpbiwgYmVnaW4gKyBOdW1FeHBycyk7CisgIH0KKyAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7CisgICAgU3RtdCAqY29uc3QgKmJlZ2luID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTdG10ICpjb25zdCAqPihnZXRUcmFpbGluZ09iamVjdHM8RXhwciAqPigpKTsKKyAgICByZXR1cm4gY29uc3RfY2hpbGRfcmFuZ2UoYmVnaW4sIGJlZ2luICsgTnVtRXhwcnMpOworICB9CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7Cit9OworCisvLy8gVW5hcnlFeHByT3JUeXBlVHJhaXRFeHByIC0gZXhwcmVzc2lvbiB3aXRoIGVpdGhlciBhIHR5cGUgb3IgKHVuZXZhbHVhdGVkKQorLy8vIGV4cHJlc3Npb24gb3BlcmFuZC4gIFVzZWQgZm9yIHNpemVvZi9hbGlnbm9mIChDOTkgNi41LjMuNCkgYW5kCisvLy8gdmVjX3N0ZXAgKE9wZW5DTCAxLjEgNi4xMS4xMikuCitjbGFzcyBVbmFyeUV4cHJPclR5cGVUcmFpdEV4cHIgOiBwdWJsaWMgRXhwciB7CisgIHVuaW9uIHsKKyAgICBUeXBlU291cmNlSW5mbyAqVHk7CisgICAgU3RtdCAqRXg7CisgIH0gQXJndW1lbnQ7CisgIFNvdXJjZUxvY2F0aW9uIE9wTG9jLCBSUGFyZW5Mb2M7CisKK3B1YmxpYzoKKyAgVW5hcnlFeHByT3JUeXBlVHJhaXRFeHByKFVuYXJ5RXhwck9yVHlwZVRyYWl0IEV4cHJLaW5kLCBUeXBlU291cmNlSW5mbyAqVEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSByZXN1bHRUeXBlLCBTb3VyY2VMb2NhdGlvbiBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIHJwKSA6CisgICAgICBFeHByKFVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwckNsYXNzLCByZXN1bHRUeXBlLCBWS19SVmFsdWUsIE9LX09yZGluYXJ5LAorICAgICAgICAgICBmYWxzZSwgLy8gTmV2ZXIgdHlwZS1kZXBlbmRlbnQgKEMrKyBbdGVtcC5kZXAuZXhwcl1wMykuCisgICAgICAgICAgIC8vIFZhbHVlLWRlcGVuZGVudCBpZiB0aGUgYXJndW1lbnQgaXMgdHlwZS1kZXBlbmRlbnQuCisgICAgICAgICAgIFRJbmZvLT5nZXRUeXBlKCktPmlzRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICBUSW5mby0+Z2V0VHlwZSgpLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgIFRJbmZvLT5nZXRUeXBlKCktPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICBPcExvYyhvcCksIFJQYXJlbkxvYyhycCkgeworICAgIFVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwckJpdHMuS2luZCA9IEV4cHJLaW5kOworICAgIFVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwckJpdHMuSXNUeXBlID0gdHJ1ZTsKKyAgICBBcmd1bWVudC5UeSA9IFRJbmZvOworICB9CisKKyAgVW5hcnlFeHByT3JUeXBlVHJhaXRFeHByKFVuYXJ5RXhwck9yVHlwZVRyYWl0IEV4cHJLaW5kLCBFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgcmVzdWx0VHlwZSwgU291cmNlTG9jYXRpb24gb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBycCk7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYW4gZW1wdHkgc2l6ZW9mL2FsaWdub2YgZXhwcmVzc2lvbi4KKyAgZXhwbGljaXQgVW5hcnlFeHByT3JUeXBlVHJhaXRFeHByKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgOiBFeHByKFVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwckNsYXNzLCBFbXB0eSkgeyB9CisKKyAgVW5hcnlFeHByT3JUeXBlVHJhaXQgZ2V0S2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VW5hcnlFeHByT3JUeXBlVHJhaXQ+KFVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwckJpdHMuS2luZCk7CisgIH0KKyAgdm9pZCBzZXRLaW5kKFVuYXJ5RXhwck9yVHlwZVRyYWl0IEspIHsgVW5hcnlFeHByT3JUeXBlVHJhaXRFeHByQml0cy5LaW5kID0gSzt9CisKKyAgYm9vbCBpc0FyZ3VtZW50VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwckJpdHMuSXNUeXBlOyB9CisgIFF1YWxUeXBlIGdldEFyZ3VtZW50VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QXJndW1lbnRUeXBlSW5mbygpLT5nZXRUeXBlKCk7CisgIH0KKyAgVHlwZVNvdXJjZUluZm8gKmdldEFyZ3VtZW50VHlwZUluZm8oKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQXJndW1lbnRUeXBlKCkgJiYgImNhbGxpbmcgZ2V0QXJndW1lbnRUeXBlKCkgd2hlbiBhcmcgaXMgZXhwciIpOworICAgIHJldHVybiBBcmd1bWVudC5UeTsKKyAgfQorICBFeHByICpnZXRBcmd1bWVudEV4cHIoKSB7CisgICAgYXNzZXJ0KCFpc0FyZ3VtZW50VHlwZSgpICYmICJjYWxsaW5nIGdldEFyZ3VtZW50RXhwcigpIHdoZW4gYXJnIGlzIHR5cGUiKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RXhwcio+KEFyZ3VtZW50LkV4KTsKKyAgfQorICBjb25zdCBFeHByICpnZXRBcmd1bWVudEV4cHIoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VW5hcnlFeHByT3JUeXBlVHJhaXRFeHByKj4odGhpcyktPmdldEFyZ3VtZW50RXhwcigpOworICB9CisKKyAgdm9pZCBzZXRBcmd1bWVudChFeHByICpFKSB7CisgICAgQXJndW1lbnQuRXggPSBFOworICAgIFVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwckJpdHMuSXNUeXBlID0gZmFsc2U7CisgIH0KKyAgdm9pZCBzZXRBcmd1bWVudChUeXBlU291cmNlSW5mbyAqVEluZm8pIHsKKyAgICBBcmd1bWVudC5UeSA9IFRJbmZvOworICAgIFVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwckJpdHMuSXNUeXBlID0gdHJ1ZTsKKyAgfQorCisgIC8vLyBHZXRzIHRoZSBhcmd1bWVudCB0eXBlLCBvciB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQgZXhwcmVzc2lvbiwgd2hpY2hldmVyCisgIC8vLyBpcyBhcHByb3ByaWF0ZS4KKyAgUXVhbFR5cGUgZ2V0VHlwZU9mQXJndW1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQXJndW1lbnRUeXBlKCkgPyBnZXRBcmd1bWVudFR5cGUoKSA6IGdldEFyZ3VtZW50RXhwcigpLT5nZXRUeXBlKCk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRPcGVyYXRvckxvYygpIGNvbnN0IHsgcmV0dXJuIE9wTG9jOyB9CisgIHZvaWQgc2V0T3BlcmF0b3JMb2MoU291cmNlTG9jYXRpb24gTCkgeyBPcExvYyA9IEw7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRSUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKyAgdm9pZCBzZXRSUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTCkgeyBSUGFyZW5Mb2MgPSBMOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIE9wTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUlBhcmVuTG9jOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IFVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwckNsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCk7CisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3Q7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUG9zdGZpeCBPcGVyYXRvcnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQXJyYXlTdWJzY3JpcHRFeHByIC0gW0M5OSA2LjUuMi4xXSBBcnJheSBTdWJzY3JpcHRpbmcuCitjbGFzcyBBcnJheVN1YnNjcmlwdEV4cHIgOiBwdWJsaWMgRXhwciB7CisgIGVudW0geyBMSFMsIFJIUywgRU5EX0VYUFI9MiB9OworICBTdG10KiBTdWJFeHByc1tFTkRfRVhQUl07CisgIFNvdXJjZUxvY2F0aW9uIFJCcmFja2V0TG9jOworcHVibGljOgorICBBcnJheVN1YnNjcmlwdEV4cHIoRXhwciAqbGhzLCBFeHByICpyaHMsIFF1YWxUeXBlIHQsCisgICAgICAgICAgICAgICAgICAgICBFeHByVmFsdWVLaW5kIFZLLCBFeHByT2JqZWN0S2luZCBPSywKKyAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIHJicmFja2V0bG9jKQorICA6IEV4cHIoQXJyYXlTdWJzY3JpcHRFeHByQ2xhc3MsIHQsIFZLLCBPSywKKyAgICAgICAgIGxocy0+aXNUeXBlRGVwZW5kZW50KCkgfHwgcmhzLT5pc1R5cGVEZXBlbmRlbnQoKSwKKyAgICAgICAgIGxocy0+aXNWYWx1ZURlcGVuZGVudCgpIHx8IHJocy0+aXNWYWx1ZURlcGVuZGVudCgpLAorICAgICAgICAgKGxocy0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCkgfHwKKyAgICAgICAgICByaHMtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpKSwKKyAgICAgICAgIChsaHMtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSB8fAorICAgICAgICAgIHJocy0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSksCisgICAgUkJyYWNrZXRMb2MocmJyYWNrZXRsb2MpIHsKKyAgICBTdWJFeHByc1tMSFNdID0gbGhzOworICAgIFN1YkV4cHJzW1JIU10gPSByaHM7CisgIH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhbiBlbXB0eSBhcnJheSBzdWJzY3JpcHQgZXhwcmVzc2lvbi4KKyAgZXhwbGljaXQgQXJyYXlTdWJzY3JpcHRFeHByKEVtcHR5U2hlbGwgU2hlbGwpCisgICAgOiBFeHByKEFycmF5U3Vic2NyaXB0RXhwckNsYXNzLCBTaGVsbCkgeyB9CisKKyAgLy8vIEFuIGFycmF5IGFjY2VzcyBjYW4gYmUgd3JpdHRlbiBBWzRdIG9yIDRbQV0gKGJvdGggYXJlIGVxdWl2YWxlbnQpLgorICAvLy8gLSBnZXRCYXNlKCkgYW5kIGdldElkeCgpIGFsd2F5cyBwcmVzZW50IHRoZSBub3JtYWxpemVkIHZpZXc6IEFbNF0uCisgIC8vLyAgICBJbiB0aGlzIGNhc2UgZ2V0QmFzZSgpIHJldHVybnMgIkEiIGFuZCBnZXRJZHgoKSByZXR1cm5zICI0Ii4KKyAgLy8vIC0gZ2V0TEhTKCkgYW5kIGdldFJIUygpIHByZXNlbnQgdGhlIHN5bnRhY3RpYyB2aWV3LiBlLmcuIGZvcgorICAvLy8gICAgNFtBXSBnZXRMSFMoKSByZXR1cm5zICI0Ii4KKyAgLy8vIE5vdGU6IEJlY2F1c2UgdmVjdG9yIGVsZW1lbnQgYWNjZXNzIGlzIGFsc28gd3JpdHRlbiBBWzRdIHdlIG11c3QKKyAgLy8vIHByZWRpY2F0ZSB0aGUgZm9ybWF0IGNvbnZlcnNpb24gaW4gZ2V0QmFzZSBhbmQgZ2V0SWR4IG9ubHkgb24gdGhlCisgIC8vLyB0aGUgdHlwZSBvZiB0aGUgUkhTLCBhcyBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIExIUyB0byBiZSBhIHZlY3RvciBvZgorICAvLy8gaW50ZWdlciB0eXBlCisgIEV4cHIgKmdldExIUygpIHsgcmV0dXJuIGNhc3Q8RXhwcj4oU3ViRXhwcnNbTEhTXSk7IH0KKyAgY29uc3QgRXhwciAqZ2V0TEhTKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByc1tMSFNdKTsgfQorICB2b2lkIHNldExIUyhFeHByICpFKSB7IFN1YkV4cHJzW0xIU10gPSBFOyB9CisKKyAgRXhwciAqZ2V0UkhTKCkgeyByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByc1tSSFNdKTsgfQorICBjb25zdCBFeHByICpnZXRSSFMoKSBjb25zdCB7IHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHJzW1JIU10pOyB9CisgIHZvaWQgc2V0UkhTKEV4cHIgKkUpIHsgU3ViRXhwcnNbUkhTXSA9IEU7IH0KKworICBFeHByICpnZXRCYXNlKCkgeworICAgIHJldHVybiBnZXRSSFMoKS0+Z2V0VHlwZSgpLT5pc0ludGVnZXJUeXBlKCkgPyBnZXRMSFMoKSA6IGdldFJIUygpOworICB9CisKKyAgY29uc3QgRXhwciAqZ2V0QmFzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UkhTKCktPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHlwZSgpID8gZ2V0TEhTKCkgOiBnZXRSSFMoKTsKKyAgfQorCisgIEV4cHIgKmdldElkeCgpIHsKKyAgICByZXR1cm4gZ2V0UkhTKCktPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHlwZSgpID8gZ2V0UkhTKCkgOiBnZXRMSFMoKTsKKyAgfQorCisgIGNvbnN0IEV4cHIgKmdldElkeCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UkhTKCktPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHlwZSgpID8gZ2V0UkhTKCkgOiBnZXRMSFMoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGdldExIUygpLT5nZXRMb2NTdGFydCgpOworICB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUkJyYWNrZXRMb2M7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRSQnJhY2tldExvYygpIGNvbnN0IHsgcmV0dXJuIFJCcmFja2V0TG9jOyB9CisgIHZvaWQgc2V0UkJyYWNrZXRMb2MoU291cmNlTG9jYXRpb24gTCkgeyBSQnJhY2tldExvYyA9IEw7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRFeHByTG9jKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGdldEJhc2UoKS0+Z2V0RXhwckxvYygpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IEFycmF5U3Vic2NyaXB0RXhwckNsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZSgmU3ViRXhwcnNbMF0sICZTdWJFeHByc1swXStFTkRfRVhQUik7CisgIH0KKyAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKCZTdWJFeHByc1swXSwgJlN1YkV4cHJzWzBdICsgRU5EX0VYUFIpOworICB9Cit9OworCisvLy8gQ2FsbEV4cHIgLSBSZXByZXNlbnRzIGEgZnVuY3Rpb24gY2FsbCAoQzk5IDYuNS4yLjIsIEMrKyBbZXhwci5jYWxsXSkuCisvLy8gQ2FsbEV4cHIgaXRzZWxmIHJlcHJlc2VudHMgYSBub3JtYWwgZnVuY3Rpb24gY2FsbCwgZS5nLiwgImYoeCwgMikiLAorLy8vIHdoaWxlIGl0cyBzdWJjbGFzc2VzIG1heSByZXByZXNlbnQgYWx0ZXJuYXRpdmUgc3ludGF4IHRoYXQgKHNlbWFudGljYWxseSkKKy8vLyByZXN1bHRzIGluIGEgZnVuY3Rpb24gY2FsbC4gRm9yIGV4YW1wbGUsIENYWE9wZXJhdG9yQ2FsbEV4cHIgaXMKKy8vLyBhIHN1YmNsYXNzIGZvciBvdmVybG9hZGVkIG9wZXJhdG9yIGNhbGxzIHRoYXQgdXNlIG9wZXJhdG9yIHN5bnRheCwgZS5nLiwKKy8vLyAic3RyMSArIHN0cjIiIHRvIHJlc29sdmUgdG8gYSBmdW5jdGlvbiBjYWxsLgorY2xhc3MgQ2FsbEV4cHIgOiBwdWJsaWMgRXhwciB7CisgIGVudW0geyBGTj0wLCBQUkVBUkdTX1NUQVJUPTEgfTsKKyAgU3RtdCAqKlN1YkV4cHJzOworICB1bnNpZ25lZCBOdW1BcmdzOworICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2M7CisKKyAgdm9pZCB1cGRhdGVEZXBlbmRlbmNpZXNGcm9tQXJnKEV4cHIgKkFyZyk7CisKK3Byb3RlY3RlZDoKKyAgLy8gVGhlc2UgdmVyc2lvbnMgb2YgdGhlIGNvbnN0cnVjdG9yIGFyZSBmb3IgZGVyaXZlZCBjbGFzc2VzLgorICBDYWxsRXhwcihjb25zdCBBU1RDb250ZXh0ICZDLCBTdG10Q2xhc3MgU0MsIEV4cHIgKmZuLAorICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IHByZWFyZ3MsIEFycmF5UmVmPEV4cHIgKj4gYXJncywgUXVhbFR5cGUgdCwKKyAgICAgICAgICAgRXhwclZhbHVlS2luZCBWSywgU291cmNlTG9jYXRpb24gcnBhcmVubG9jKTsKKyAgQ2FsbEV4cHIoY29uc3QgQVNUQ29udGV4dCAmQywgU3RtdENsYXNzIFNDLCBFeHByICpmbiwgQXJyYXlSZWY8RXhwciAqPiBhcmdzLAorICAgICAgICAgICBRdWFsVHlwZSB0LCBFeHByVmFsdWVLaW5kIFZLLCBTb3VyY2VMb2NhdGlvbiBycGFyZW5sb2MpOworICBDYWxsRXhwcihjb25zdCBBU1RDb250ZXh0ICZDLCBTdG10Q2xhc3MgU0MsIHVuc2lnbmVkIE51bVByZUFyZ3MsCisgICAgICAgICAgIEVtcHR5U2hlbGwgRW1wdHkpOworCisgIFN0bXQgKmdldFByZUFyZyh1bnNpZ25lZCBpKSB7CisgICAgYXNzZXJ0KGkgPCBnZXROdW1QcmVBcmdzKCkgJiYgIlByZWFyZyBhY2Nlc3Mgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBTdWJFeHByc1tQUkVBUkdTX1NUQVJUK2ldOworICB9CisgIGNvbnN0IFN0bXQgKmdldFByZUFyZyh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBnZXROdW1QcmVBcmdzKCkgJiYgIlByZWFyZyBhY2Nlc3Mgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBTdWJFeHByc1tQUkVBUkdTX1NUQVJUK2ldOworICB9CisgIHZvaWQgc2V0UHJlQXJnKHVuc2lnbmVkIGksIFN0bXQgKlByZUFyZykgeworICAgIGFzc2VydChpIDwgZ2V0TnVtUHJlQXJncygpICYmICJQcmVhcmcgYWNjZXNzIG91dCBvZiByYW5nZSEiKTsKKyAgICBTdWJFeHByc1tQUkVBUkdTX1NUQVJUK2ldID0gUHJlQXJnOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtUHJlQXJncygpIGNvbnN0IHsgcmV0dXJuIENhbGxFeHByQml0cy5OdW1QcmVBcmdzOyB9CisKK3B1YmxpYzoKKyAgQ2FsbEV4cHIoY29uc3QgQVNUQ29udGV4dCYgQywgRXhwciAqZm4sIEFycmF5UmVmPEV4cHIqPiBhcmdzLCBRdWFsVHlwZSB0LAorICAgICAgICAgICBFeHByVmFsdWVLaW5kIFZLLCBTb3VyY2VMb2NhdGlvbiBycGFyZW5sb2MpOworCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2FsbCBleHByZXNzaW9uLgorICBDYWxsRXhwcihjb25zdCBBU1RDb250ZXh0ICZDLCBTdG10Q2xhc3MgU0MsIEVtcHR5U2hlbGwgRW1wdHkpOworCisgIGNvbnN0IEV4cHIgKmdldENhbGxlZSgpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8RXhwcj4oU3ViRXhwcnNbRk5dKTsgfQorICBFeHByICpnZXRDYWxsZWUoKSB7IHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHJzW0ZOXSk7IH0KKyAgdm9pZCBzZXRDYWxsZWUoRXhwciAqRikgeyBTdWJFeHByc1tGTl0gPSBGOyB9CisKKyAgRGVjbCAqZ2V0Q2FsbGVlRGVjbCgpOworICBjb25zdCBEZWNsICpnZXRDYWxsZWVEZWNsKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PENhbGxFeHByKj4odGhpcyktPmdldENhbGxlZURlY2woKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSWYgdGhlIGNhbGxlZSBpcyBhIEZ1bmN0aW9uRGVjbCwgcmV0dXJuIGl0LiBPdGhlcndpc2UgcmV0dXJuIDAuCisgIEZ1bmN0aW9uRGVjbCAqZ2V0RGlyZWN0Q2FsbGVlKCk7CisgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqZ2V0RGlyZWN0Q2FsbGVlKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PENhbGxFeHByKj4odGhpcyktPmdldERpcmVjdENhbGxlZSgpOworICB9CisKKyAgLy8vIGdldE51bUFyZ3MgLSBSZXR1cm4gdGhlIG51bWJlciBvZiBhY3R1YWwgYXJndW1lbnRzIHRvIHRoaXMgY2FsbC4KKyAgLy8vCisgIHVuc2lnbmVkIGdldE51bUFyZ3MoKSBjb25zdCB7IHJldHVybiBOdW1BcmdzOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgY2FsbCBhcmd1bWVudHMuCisgIEV4cHIgKipnZXRBcmdzKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEV4cHIgKio+KFN1YkV4cHJzK2dldE51bVByZUFyZ3MoKStQUkVBUkdTX1NUQVJUKTsKKyAgfQorICBjb25zdCBFeHByICpjb25zdCAqZ2V0QXJncygpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxFeHByICoqPihTdWJFeHBycyArIGdldE51bVByZUFyZ3MoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFQVJHU19TVEFSVCk7CisgIH0KKworICAvLy8gZ2V0QXJnIC0gUmV0dXJuIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQuCisgIEV4cHIgKmdldEFyZyh1bnNpZ25lZCBBcmcpIHsKKyAgICBhc3NlcnQoQXJnIDwgTnVtQXJncyAmJiAiQXJnIGFjY2VzcyBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxFeHByPihTdWJFeHByc1tBcmcgKyBnZXROdW1QcmVBcmdzKCkgKyBQUkVBUkdTX1NUQVJUXSk7CisgIH0KKyAgY29uc3QgRXhwciAqZ2V0QXJnKHVuc2lnbmVkIEFyZykgY29uc3QgeworICAgIGFzc2VydChBcmcgPCBOdW1BcmdzICYmICJBcmcgYWNjZXNzIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPEV4cHI+KFN1YkV4cHJzW0FyZyArIGdldE51bVByZUFyZ3MoKSArIFBSRUFSR1NfU1RBUlRdKTsKKyAgfQorCisgIC8vLyBzZXRBcmcgLSBTZXQgdGhlIHNwZWNpZmllZCBhcmd1bWVudC4KKyAgdm9pZCBzZXRBcmcodW5zaWduZWQgQXJnLCBFeHByICpBcmdFeHByKSB7CisgICAgYXNzZXJ0KEFyZyA8IE51bUFyZ3MgJiYgIkFyZyBhY2Nlc3Mgb3V0IG9mIHJhbmdlISIpOworICAgIFN1YkV4cHJzW0FyZytnZXROdW1QcmVBcmdzKCkrUFJFQVJHU19TVEFSVF0gPSBBcmdFeHByOworICB9CisKKyAgLy8vIHNldE51bUFyZ3MgLSBUaGlzIGNoYW5nZXMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcHJlc2VudCBpbiB0aGlzIGNhbGwuCisgIC8vLyBBbnkgb3JwaGFuZWQgZXhwcmVzc2lvbnMgYXJlIGRlbGV0ZWQgYnkgdGhpcywgYW5kIGFueSBuZXcgb3BlcmFuZHMgYXJlIHNldAorICAvLy8gdG8gbnVsbC4KKyAgdm9pZCBzZXROdW1BcmdzKGNvbnN0IEFTVENvbnRleHQmIEMsIHVuc2lnbmVkIE51bUFyZ3MpOworCisgIHR5cGVkZWYgRXhwckl0ZXJhdG9yIGFyZ19pdGVyYXRvcjsKKyAgdHlwZWRlZiBDb25zdEV4cHJJdGVyYXRvciBjb25zdF9hcmdfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8YXJnX2l0ZXJhdG9yPiBhcmdfcmFuZ2U7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8Y29uc3RfYXJnX2l0ZXJhdG9yPiBhcmdfY29uc3RfcmFuZ2U7CisKKyAgYXJnX3JhbmdlIGFyZ3VtZW50cygpIHsgcmV0dXJuIGFyZ19yYW5nZShhcmdfYmVnaW4oKSwgYXJnX2VuZCgpKTsgfQorICBhcmdfY29uc3RfcmFuZ2UgYXJndW1lbnRzKCkgY29uc3QgeworICAgIHJldHVybiBhcmdfY29uc3RfcmFuZ2UoYXJnX2JlZ2luKCksIGFyZ19lbmQoKSk7CisgIH0KKworICBhcmdfaXRlcmF0b3IgYXJnX2JlZ2luKCkgeyByZXR1cm4gU3ViRXhwcnMrUFJFQVJHU19TVEFSVCtnZXROdW1QcmVBcmdzKCk7IH0KKyAgYXJnX2l0ZXJhdG9yIGFyZ19lbmQoKSB7CisgICAgcmV0dXJuIFN1YkV4cHJzK1BSRUFSR1NfU1RBUlQrZ2V0TnVtUHJlQXJncygpK2dldE51bUFyZ3MoKTsKKyAgfQorICBjb25zdF9hcmdfaXRlcmF0b3IgYXJnX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBTdWJFeHBycytQUkVBUkdTX1NUQVJUK2dldE51bVByZUFyZ3MoKTsKKyAgfQorICBjb25zdF9hcmdfaXRlcmF0b3IgYXJnX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3ViRXhwcnMrUFJFQVJHU19TVEFSVCtnZXROdW1QcmVBcmdzKCkrZ2V0TnVtQXJncygpOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGZhc3QgYWNjZXNzIHRvIGFsbCB0aGUgc3ViZXhwcmVzc2lvbnMgb2YKKyAgLy8vIGEgQ2FsbEV4cHIgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoZSBzbG93ZXIgdmlydHVhbCBjaGlsZF9pdGVyYXRvcgorICAvLy8gaW50ZXJmYWNlLiAgVGhpcyBwcm92aWRlcyBlZmZpY2llbnQgcmV2ZXJzZSBpdGVyYXRpb24gb2YgdGhlCisgIC8vLyBzdWJleHByZXNzaW9ucy4gIFRoaXMgaXMgY3VycmVudGx5IHVzZWQgZm9yIENGRyBjb25zdHJ1Y3Rpb24uCisgIEFycmF5UmVmPFN0bXQqPiBnZXRSYXdTdWJFeHBycygpIHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKFN1YkV4cHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TnVtUHJlQXJncygpICsgUFJFQVJHU19TVEFSVCArIGdldE51bUFyZ3MoKSk7CisgIH0KKworICAvLy8gZ2V0TnVtQ29tbWFzIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgY29tbWFzIHRoYXQgbXVzdCBoYXZlIGJlZW4gcHJlc2VudCBpbgorICAvLy8gdGhpcyBmdW5jdGlvbiBjYWxsLgorICB1bnNpZ25lZCBnZXROdW1Db21tYXMoKSBjb25zdCB7IHJldHVybiBOdW1BcmdzID8gTnVtQXJncyAtIDEgOiAwOyB9CisKKyAgLy8vIGdldEJ1aWx0aW5DYWxsZWUgLSBJZiB0aGlzIGlzIGEgY2FsbCB0byBhIGJ1aWx0aW4sIHJldHVybiB0aGUgYnVpbHRpbiBJRAorICAvLy8gb2YgdGhlIGNhbGxlZS4gSWYgbm90LCByZXR1cm4gMC4KKyAgdW5zaWduZWQgZ2V0QnVpbHRpbkNhbGxlZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyBcYyB0cnVlIGlmIHRoaXMgaXMgYSBjYWxsIHRvIGEgYnVpbHRpbiB3aGljaCBkb2VzIG5vdAorICAvLy8gZXZhbHVhdGUgc2lkZS1lZmZlY3RzIHdpdGhpbiBpdHMgYXJndW1lbnRzLgorICBib29sIGlzVW5ldmFsdWF0ZWRCdWlsdGluQ2FsbChjb25zdCBBU1RDb250ZXh0ICZDdHgpIGNvbnN0OworCisgIC8vLyBnZXRDYWxsUmV0dXJuVHlwZSAtIEdldCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGNhbGwgZXhwci4gVGhpcyBpcyBub3QKKyAgLy8vIGFsd2F5cyB0aGUgdHlwZSBvZiB0aGUgZXhwciBpdHNlbGYsIGlmIHRoZSByZXR1cm4gdHlwZSBpcyBhIHJlZmVyZW5jZQorICAvLy8gdHlwZS4KKyAgUXVhbFR5cGUgZ2V0Q2FsbFJldHVyblR5cGUoY29uc3QgQVNUQ29udGV4dCAmQ3R4KSBjb25zdDsKKworICBTb3VyY2VMb2NhdGlvbiBnZXRSUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKyAgdm9pZCBzZXRSUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTCkgeyBSUGFyZW5Mb2MgPSBMOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZOworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgY2FsbCB0byBfX2Fzc3VtZSgpIG9yIF9fYnVpbHRpbl9hc3N1bWUoKSB3aXRoCisgIC8vLyBhIG5vbi12YWx1ZS1kZXBlbmRlbnQgY29uc3RhbnQgcGFyYW1ldGVyIGV2YWx1YXRpbmcgYXMgZmFsc2UuCisgIGJvb2wgaXNCdWlsdGluQXNzdW1lRmFsc2UoY29uc3QgQVNUQ29udGV4dCAmQ3R4KSBjb25zdDsKKworICBib29sIGlzQ2FsbFRvU3RkTW92ZSgpIGNvbnN0IHsKKyAgICBjb25zdCBGdW5jdGlvbkRlY2wqIEZEID0gZ2V0RGlyZWN0Q2FsbGVlKCk7CisgICAgcmV0dXJuIGdldE51bUFyZ3MoKSA9PSAxICYmIEZEICYmIEZELT5pc0luU3RkTmFtZXNwYWNlKCkgJiYKKyAgICAgICAgICAgRkQtPmdldElkZW50aWZpZXIoKSAmJiBGRC0+Z2V0SWRlbnRpZmllcigpLT5pc1N0cigibW92ZSIpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID49IGZpcnN0Q2FsbEV4cHJDb25zdGFudCAmJgorICAgICAgICAgICBULT5nZXRTdG10Q2xhc3MoKSA8PSBsYXN0Q2FsbEV4cHJDb25zdGFudDsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoJlN1YkV4cHJzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAmU3ViRXhwcnNbMF0rTnVtQXJncytnZXROdW1QcmVBcmdzKCkrUFJFQVJHU19TVEFSVCk7CisgIH0KKworICBjb25zdF9jaGlsZF9yYW5nZSBjaGlsZHJlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2hpbGRfcmFuZ2UoJlN1YkV4cHJzWzBdLCAmU3ViRXhwcnNbMF0gKyBOdW1BcmdzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TnVtUHJlQXJncygpICsgUFJFQVJHU19TVEFSVCk7CisgIH0KK307CisKKy8vLyBFeHRyYSBkYXRhIHN0b3JlZCBpbiBzb21lIE1lbWJlckV4cHIgb2JqZWN0cy4KK3N0cnVjdCBNZW1iZXJFeHByTmFtZVF1YWxpZmllciB7CisgIC8vLyBcYnJpZWYgVGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciB0aGF0IHF1YWxpZmllcyB0aGUgbmFtZSwgaW5jbHVkaW5nCisgIC8vLyBzb3VyY2UtbG9jYXRpb24gaW5mb3JtYXRpb24uCisgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgUXVhbGlmaWVyTG9jOworCisgIC8vLyBcYnJpZWYgVGhlIERlY2xBY2Nlc3NQYWlyIHRocm91Z2ggd2hpY2ggdGhlIE1lbWJlckRlY2wgd2FzIGZvdW5kIGR1ZSB0bworICAvLy8gbmFtZSBxdWFsaWZpZXJzLgorICBEZWNsQWNjZXNzUGFpciBGb3VuZERlY2w7Cit9OworCisvLy8gTWVtYmVyRXhwciAtIFtDOTkgNi41LjIuM10gU3RydWN0dXJlIGFuZCBVbmlvbiBNZW1iZXJzLiAgWC0+RiBhbmQgWC5GLgorLy8vCitjbGFzcyBNZW1iZXJFeHByIGZpbmFsCisgICAgOiBwdWJsaWMgRXhwciwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPE1lbWJlckV4cHIsIE1lbWJlckV4cHJOYW1lUXVhbGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUVGVtcGxhdGVLV0FuZEFyZ3NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVBcmd1bWVudExvYz4geworICAvLy8gQmFzZSAtIHRoZSBleHByZXNzaW9uIGZvciB0aGUgYmFzZSBwb2ludGVyIG9yIHN0cnVjdHVyZSByZWZlcmVuY2VzLiAgSW4KKyAgLy8vIFguRiwgdGhpcyBpcyAiWCIuCisgIFN0bXQgKkJhc2U7CisKKyAgLy8vIE1lbWJlckRlY2wgLSBUaGlzIGlzIHRoZSBkZWNsIGJlaW5nIHJlZmVyZW5jZWQgYnkgdGhlIGZpZWxkL21lbWJlciBuYW1lLgorICAvLy8gSW4gWC5GLCB0aGlzIGlzIHRoZSBkZWNsIHJlZmVyZW5jZWQgYnkgRi4KKyAgVmFsdWVEZWNsICpNZW1iZXJEZWNsOworCisgIC8vLyBNZW1iZXJETkxvYyAtIFByb3ZpZGVzIHNvdXJjZS90eXBlIGxvY2F0aW9uIGluZm8gZm9yIHRoZQorICAvLy8gZGVjbGFyYXRpb24gbmFtZSBlbWJlZGRlZCBpbiBNZW1iZXJEZWNsLgorICBEZWNsYXJhdGlvbk5hbWVMb2MgTWVtYmVyRE5Mb2M7CisKKyAgLy8vIE1lbWJlckxvYyAtIFRoaXMgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBtZW1iZXIgbmFtZS4KKyAgU291cmNlTG9jYXRpb24gTWVtYmVyTG9jOworCisgIC8vLyBUaGlzIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgLT4gb3IgLiBpbiB0aGUgZXhwcmVzc2lvbi4KKyAgU291cmNlTG9jYXRpb24gT3BlcmF0b3JMb2M7CisKKyAgLy8vIElzQXJyb3cgLSBUcnVlIGlmIHRoaXMgaXMgIlgtPkYiLCBmYWxzZSBpZiB0aGlzIGlzICJYLkYiLgorICBib29sIElzQXJyb3cgOiAxOworCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGlzIG1lbWJlciBleHByZXNzaW9uIHVzZWQgYSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgdG8KKyAgLy8vIHJlZmVyIHRvIHRoZSBtZW1iZXIsIGUuZy4sICJ4LT5CYXNlOjpmIiwgb3IgZm91bmQgaXRzIG1lbWJlciB2aWEgYSB1c2luZworICAvLy8gZGVjbGFyYXRpb24uICBXaGVuIHRydWUsIGEgTWVtYmVyRXhwck5hbWVRdWFsaWZpZXIKKyAgLy8vIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIE1lbWJlckV4cHIuCisgIGJvb2wgSGFzUXVhbGlmaWVyT3JGb3VuZERlY2wgOiAxOworCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGlzIG1lbWJlciBleHByZXNzaW9uIHNwZWNpZmllZCBhIHRlbXBsYXRlIGtleXdvcmQKKyAgLy8vIGFuZC9vciBhIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QgZXhwbGljaXRseSwgZS5nLiwgeC0+ZjxpbnQ+LAorICAvLy8geC0+dGVtcGxhdGUgZiwgeC0+dGVtcGxhdGUgZjxpbnQ+LgorICAvLy8gV2hlbiB0cnVlLCBhbiBBU1RUZW1wbGF0ZUtXQW5kQXJnc0luZm8gc3RydWN0dXJlIGFuZCBpdHMKKyAgLy8vIFRlbXBsYXRlQXJndW1lbnRzIChpZiBhbnkpIGFyZSBwcmVzZW50LgorICBib29sIEhhc1RlbXBsYXRlS1dBbmRBcmdzSW5mbyA6IDE7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgbWVtYmVyIGV4cHJlc3Npb24gcmVmZXJzIHRvIGEgbWV0aG9kIHRoYXQKKyAgLy8vIHdhcyByZXNvbHZlZCBmcm9tIGFuIG92ZXJsb2FkZWQgc2V0IGhhdmluZyBzaXplIGdyZWF0ZXIgdGhhbiAxLgorICBib29sIEhhZE11bHRpcGxlQ2FuZGlkYXRlcyA6IDE7CisKKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPE1lbWJlckV4cHJOYW1lUXVhbGlmaWVyPikgY29uc3QgeworICAgIHJldHVybiBIYXNRdWFsaWZpZXJPckZvdW5kRGVjbCA/IDEgOiAwOworICB9CisKKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPEFTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbz4pIGNvbnN0IHsKKyAgICByZXR1cm4gSGFzVGVtcGxhdGVLV0FuZEFyZ3NJbmZvID8gMSA6IDA7CisgIH0KKworcHVibGljOgorICBNZW1iZXJFeHByKEV4cHIgKmJhc2UsIGJvb2wgaXNhcnJvdywgU291cmNlTG9jYXRpb24gb3BlcmF0b3Jsb2MsCisgICAgICAgICAgICAgVmFsdWVEZWNsICptZW1iZXJkZWNsLCBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZOYW1lSW5mbywKKyAgICAgICAgICAgICBRdWFsVHlwZSB0eSwgRXhwclZhbHVlS2luZCBWSywgRXhwck9iamVjdEtpbmQgT0spCisgICAgICA6IEV4cHIoTWVtYmVyRXhwckNsYXNzLCB0eSwgVkssIE9LLCBiYXNlLT5pc1R5cGVEZXBlbmRlbnQoKSwKKyAgICAgICAgICAgICBiYXNlLT5pc1ZhbHVlRGVwZW5kZW50KCksIGJhc2UtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpLAorICAgICAgICAgICAgIGJhc2UtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIEJhc2UoYmFzZSksIE1lbWJlckRlY2wobWVtYmVyZGVjbCksIE1lbWJlckROTG9jKE5hbWVJbmZvLmdldEluZm8oKSksCisgICAgICAgIE1lbWJlckxvYyhOYW1lSW5mby5nZXRMb2MoKSksIE9wZXJhdG9yTG9jKG9wZXJhdG9ybG9jKSwKKyAgICAgICAgSXNBcnJvdyhpc2Fycm93KSwgSGFzUXVhbGlmaWVyT3JGb3VuZERlY2woZmFsc2UpLAorICAgICAgICBIYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8oZmFsc2UpLCBIYWRNdWx0aXBsZUNhbmRpZGF0ZXMoZmFsc2UpIHsKKyAgICBhc3NlcnQobWVtYmVyZGVjbC0+Z2V0RGVjbE5hbWUoKSA9PSBOYW1lSW5mby5nZXROYW1lKCkpOworICB9CisKKyAgLy8gTk9URTogdGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gaXQgaXMga25vd24gdGhhdAorICAvLyB0aGUgbWVtYmVyIG5hbWUgY2FuIG5vdCBwcm92aWRlIGFkZGl0aW9uYWwgc3ludGFjdGljIGluZm8KKyAgLy8gKGkuZS4sIHNvdXJjZSBsb2NhdGlvbnMgZm9yIEMrKyBvcGVyYXRvciBuYW1lcyBvciB0eXBlIHNvdXJjZSBpbmZvCisgIC8vIGZvciBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBjb252ZXJzaW9uIG9wZXJhdG9ycykuCisgIE1lbWJlckV4cHIoRXhwciAqYmFzZSwgYm9vbCBpc2Fycm93LCBTb3VyY2VMb2NhdGlvbiBvcGVyYXRvcmxvYywKKyAgICAgICAgICAgICBWYWx1ZURlY2wgKm1lbWJlcmRlY2wsIFNvdXJjZUxvY2F0aW9uIGwsIFF1YWxUeXBlIHR5LAorICAgICAgICAgICAgIEV4cHJWYWx1ZUtpbmQgVkssIEV4cHJPYmplY3RLaW5kIE9LKQorICAgICAgOiBFeHByKE1lbWJlckV4cHJDbGFzcywgdHksIFZLLCBPSywgYmFzZS0+aXNUeXBlRGVwZW5kZW50KCksCisgICAgICAgICAgICAgYmFzZS0+aXNWYWx1ZURlcGVuZGVudCgpLCBiYXNlLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnQoKSwKKyAgICAgICAgICAgICBiYXNlLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgICBCYXNlKGJhc2UpLCBNZW1iZXJEZWNsKG1lbWJlcmRlY2wpLCBNZW1iZXJETkxvYygpLCBNZW1iZXJMb2MobCksCisgICAgICAgIE9wZXJhdG9yTG9jKG9wZXJhdG9ybG9jKSwgSXNBcnJvdyhpc2Fycm93KSwKKyAgICAgICAgSGFzUXVhbGlmaWVyT3JGb3VuZERlY2woZmFsc2UpLCBIYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8oZmFsc2UpLAorICAgICAgICBIYWRNdWx0aXBsZUNhbmRpZGF0ZXMoZmFsc2UpIHt9CisKKyAgc3RhdGljIE1lbWJlckV4cHIgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBFeHByICpiYXNlLCBib29sIGlzYXJyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gT3BlcmF0b3JMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYywgVmFsdWVEZWNsICptZW1iZXJkZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xBY2Nlc3NQYWlyIGZvdW5kZGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbk5hbWVJbmZvIE1lbWJlck5hbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqdGFyZ3MsIFF1YWxUeXBlIHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJWYWx1ZUtpbmQgVkssIEV4cHJPYmplY3RLaW5kIE9LKTsKKworICB2b2lkIHNldEJhc2UoRXhwciAqRSkgeyBCYXNlID0gRTsgfQorICBFeHByICpnZXRCYXNlKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihCYXNlKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG1lbWJlciBkZWNsYXJhdGlvbiB0byB3aGljaCB0aGlzIGV4cHJlc3Npb24gcmVmZXJzLgorICAvLy8KKyAgLy8vIFRoZSByZXR1cm5lZCBkZWNsYXJhdGlvbiB3aWxsIGJlIGEgRmllbGREZWNsIG9yIChpbiBDKyspIGEgVmFyRGVjbCAoZm9yCisgIC8vLyBzdGF0aWMgZGF0YSBtZW1iZXJzKSwgYSBDWFhNZXRob2REZWNsLCBvciBhbiBFbnVtQ29uc3RhbnREZWNsLgorICBWYWx1ZURlY2wgKmdldE1lbWJlckRlY2woKSBjb25zdCB7IHJldHVybiBNZW1iZXJEZWNsOyB9CisgIHZvaWQgc2V0TWVtYmVyRGVjbChWYWx1ZURlY2wgKkQpIHsgTWVtYmVyRGVjbCA9IEQ7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlcyB0aGUgZGVjbGFyYXRpb24gZm91bmQgYnkgbG9va3VwLgorICBEZWNsQWNjZXNzUGFpciBnZXRGb3VuZERlY2woKSBjb25zdCB7CisgICAgaWYgKCFIYXNRdWFsaWZpZXJPckZvdW5kRGVjbCkKKyAgICAgIHJldHVybiBEZWNsQWNjZXNzUGFpcjo6bWFrZShnZXRNZW1iZXJEZWNsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVtYmVyRGVjbCgpLT5nZXRBY2Nlc3MoKSk7CisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxNZW1iZXJFeHByTmFtZVF1YWxpZmllcj4oKS0+Rm91bmREZWNsOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBtZW1iZXIgZXhwcmVzc2lvbiBhY3R1YWxseSBoYWQKKyAgLy8vIGEgQysrIG5lc3RlZC1uYW1lLXNwZWNpZmllciBwcmlvciB0byB0aGUgbmFtZSBvZiB0aGUgbWVtYmVyLCBlLmcuLAorICAvLy8geC0+QmFzZTo6Zm9vLgorICBib29sIGhhc1F1YWxpZmllcigpIGNvbnN0IHsgcmV0dXJuIGdldFF1YWxpZmllcigpICE9IG51bGxwdHI7IH0KKworICAvLy8gXGJyaWVmIElmIHRoZSBtZW1iZXIgbmFtZSB3YXMgcXVhbGlmaWVkLCByZXRyaWV2ZXMgdGhlCisgIC8vLyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgdGhhdCBwcmVjZWRlcyB0aGUgbWVtYmVyIG5hbWUsIHdpdGggc291cmNlLWxvY2F0aW9uCisgIC8vLyBpbmZvcm1hdGlvbi4KKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBnZXRRdWFsaWZpZXJMb2MoKSBjb25zdCB7CisgICAgaWYgKCFIYXNRdWFsaWZpZXJPckZvdW5kRGVjbCkKKyAgICAgIHJldHVybiBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKCk7CisKKyAgICByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPE1lbWJlckV4cHJOYW1lUXVhbGlmaWVyPigpLT5RdWFsaWZpZXJMb2M7CisgIH0KKworICAvLy8gXGJyaWVmIElmIHRoZSBtZW1iZXIgbmFtZSB3YXMgcXVhbGlmaWVkLCByZXRyaWV2ZXMgdGhlCisgIC8vLyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgdGhhdCBwcmVjZWRlcyB0aGUgbWVtYmVyIG5hbWUuIE90aGVyd2lzZSwgcmV0dXJucworICAvLy8gTlVMTC4KKyAgTmVzdGVkTmFtZVNwZWNpZmllciAqZ2V0UXVhbGlmaWVyKCkgY29uc3QgeworICAgIHJldHVybiBnZXRRdWFsaWZpZXJMb2MoKS5nZXROZXN0ZWROYW1lU3BlY2lmaWVyKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgdGVtcGxhdGUga2V5d29yZCBwcmVjZWRpbmcKKyAgLy8vIHRoZSBtZW1iZXIgbmFtZSwgaWYgYW55LgorICBTb3VyY2VMb2NhdGlvbiBnZXRUZW1wbGF0ZUtleXdvcmRMb2MoKSBjb25zdCB7CisgICAgaWYgKCFIYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8pIHJldHVybiBTb3VyY2VMb2NhdGlvbigpOworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8QVNUVGVtcGxhdGVLV0FuZEFyZ3NJbmZvPigpLT5UZW1wbGF0ZUtXTG9jOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGxlZnQgYW5nbGUgYnJhY2tldCBzdGFydGluZyB0aGUKKyAgLy8vIGV4cGxpY2l0IHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QgZm9sbG93aW5nIHRoZSBtZW1iZXIgbmFtZSwgaWYgYW55LgorICBTb3VyY2VMb2NhdGlvbiBnZXRMQW5nbGVMb2MoKSBjb25zdCB7CisgICAgaWYgKCFIYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8pIHJldHVybiBTb3VyY2VMb2NhdGlvbigpOworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8QVNUVGVtcGxhdGVLV0FuZEFyZ3NJbmZvPigpLT5MQW5nbGVMb2M7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmlnaHQgYW5nbGUgYnJhY2tldCBlbmRpbmcgdGhlCisgIC8vLyBleHBsaWNpdCB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0IGZvbGxvd2luZyB0aGUgbWVtYmVyIG5hbWUsIGlmIGFueS4KKyAgU291cmNlTG9jYXRpb24gZ2V0UkFuZ2xlTG9jKCkgY29uc3QgeworICAgIGlmICghSGFzVGVtcGxhdGVLV0FuZEFyZ3NJbmZvKSByZXR1cm4gU291cmNlTG9jYXRpb24oKTsKKyAgICByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPEFTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbz4oKS0+UkFuZ2xlTG9jOworICB9CisKKyAgLy8vIERldGVybWluZXMgd2hldGhlciB0aGUgbWVtYmVyIG5hbWUgd2FzIHByZWNlZGVkIGJ5IHRoZSB0ZW1wbGF0ZSBrZXl3b3JkLgorICBib29sIGhhc1RlbXBsYXRlS2V5d29yZCgpIGNvbnN0IHsgcmV0dXJuIGdldFRlbXBsYXRlS2V5d29yZExvYygpLmlzVmFsaWQoKTsgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBtZW1iZXIgbmFtZSB3YXMgZm9sbG93ZWQgYnkgYW4KKyAgLy8vIGV4cGxpY2l0IHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QuCisgIGJvb2wgaGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3MoKSBjb25zdCB7IHJldHVybiBnZXRMQW5nbGVMb2MoKS5pc1ZhbGlkKCk7IH0KKworICAvLy8gXGJyaWVmIENvcGllcyB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIChpZiBwcmVzZW50KSBpbnRvIHRoZSBnaXZlbgorICAvLy8gc3RydWN0dXJlLgorICB2b2lkIGNvcHlUZW1wbGF0ZUFyZ3VtZW50c0ludG8oVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICZMaXN0KSBjb25zdCB7CisgICAgaWYgKGhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzKCkpCisgICAgICBnZXRUcmFpbGluZ09iamVjdHM8QVNUVGVtcGxhdGVLV0FuZEFyZ3NJbmZvPigpLT5jb3B5SW50bygKKyAgICAgICAgICBnZXRUcmFpbGluZ09iamVjdHM8VGVtcGxhdGVBcmd1bWVudExvYz4oKSwgTGlzdCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgcHJvdmlkZWQgYXMgcGFydCBvZiB0aGlzCisgIC8vLyB0ZW1wbGF0ZS1pZC4KKyAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExvYyAqZ2V0VGVtcGxhdGVBcmdzKCkgY29uc3QgeworICAgIGlmICghaGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3MoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxUZW1wbGF0ZUFyZ3VtZW50TG9jPigpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlIGFyZ3VtZW50cyBwcm92aWRlZCBhcyBwYXJ0IG9mIHRoaXMKKyAgLy8vIHRlbXBsYXRlLWlkLgorICB1bnNpZ25lZCBnZXROdW1UZW1wbGF0ZUFyZ3MoKSBjb25zdCB7CisgICAgaWYgKCFoYXNFeHBsaWNpdFRlbXBsYXRlQXJncygpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPEFTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbz4oKS0+TnVtVGVtcGxhdGVBcmdzOworICB9CisKKyAgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudExvYz4gdGVtcGxhdGVfYXJndW1lbnRzKCkgY29uc3QgeworICAgIHJldHVybiB7Z2V0VGVtcGxhdGVBcmdzKCksIGdldE51bVRlbXBsYXRlQXJncygpfTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG1lbWJlciBkZWNsYXJhdGlvbiBuYW1lIGluZm8uCisgIERlY2xhcmF0aW9uTmFtZUluZm8gZ2V0TWVtYmVyTmFtZUluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIERlY2xhcmF0aW9uTmFtZUluZm8oTWVtYmVyRGVjbC0+Z2V0RGVjbE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJMb2MsIE1lbWJlckROTG9jKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldE9wZXJhdG9yTG9jKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBPcGVyYXRvckxvYzsgfQorCisgIGJvb2wgaXNBcnJvdygpIGNvbnN0IHsgcmV0dXJuIElzQXJyb3c7IH0KKyAgdm9pZCBzZXRBcnJvdyhib29sIEEpIHsgSXNBcnJvdyA9IEE7IH0KKworICAvLy8gZ2V0TWVtYmVyTG9jIC0gUmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgIm1lbWJlciIsIGluIFgtPkYsIGl0IGlzIHRoZQorICAvLy8gbG9jYXRpb24gb2YgJ0YnLgorICBTb3VyY2VMb2NhdGlvbiBnZXRNZW1iZXJMb2MoKSBjb25zdCB7IHJldHVybiBNZW1iZXJMb2M7IH0KKyAgdm9pZCBzZXRNZW1iZXJMb2MoU291cmNlTG9jYXRpb24gTCkgeyBNZW1iZXJMb2MgPSBMOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZOworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIFNvdXJjZUxvY2F0aW9uIGdldEV4cHJMb2MoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIE1lbWJlckxvYzsgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGJhc2Ugb2YgdGhpcyBleHBsaWNpdCBpcyBpbXBsaWNpdC4KKyAgYm9vbCBpc0ltcGxpY2l0QWNjZXNzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRCYXNlKCkgJiYgZ2V0QmFzZSgpLT5pc0ltcGxpY2l0Q1hYVGhpcygpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtZW1iZXIgZXhwcmVzc2lvbiByZWZlcnMgdG8gYSBtZXRob2QgdGhhdAorICAvLy8gd2FzIHJlc29sdmVkIGZyb20gYW4gb3ZlcmxvYWRlZCBzZXQgaGF2aW5nIHNpemUgZ3JlYXRlciB0aGFuIDEuCisgIGJvb2wgaGFkTXVsdGlwbGVDYW5kaWRhdGVzKCkgY29uc3QgeworICAgIHJldHVybiBIYWRNdWx0aXBsZUNhbmRpZGF0ZXM7CisgIH0KKyAgLy8vIFxicmllZiBTZXRzIHRoZSBmbGFnIHRlbGxpbmcgd2hldGhlciB0aGlzIGV4cHJlc3Npb24gcmVmZXJzIHRvCisgIC8vLyBhIG1ldGhvZCB0aGF0IHdhcyByZXNvbHZlZCBmcm9tIGFuIG92ZXJsb2FkZWQgc2V0IGhhdmluZyBzaXplCisgIC8vLyBncmVhdGVyIHRoYW4gMS4KKyAgdm9pZCBzZXRIYWRNdWx0aXBsZUNhbmRpZGF0ZXMoYm9vbCBWID0gdHJ1ZSkgeworICAgIEhhZE11bHRpcGxlQ2FuZGlkYXRlcyA9IFY7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB2aXJ0dWFsIGRpc3BhdGNoIGlzIHBlcmZvcm1lZC4KKyAgLy8vIElmIHRoZSBtZW1iZXIgYWNjZXNzIGlzIGZ1bGx5IHF1YWxpZmllZCwgKGkuZS4gWDo6ZigpKSwgdmlydHVhbAorICAvLy8gZGlzcGF0Y2hpbmcgaXMgbm90IHBlcmZvcm1lZC4gSW4gLWZhcHBsZS1rZXh0IG1vZGUgcXVhbGlmaWVkCisgIC8vLyBjYWxscyB0byB2aXJ0dWFsIG1ldGhvZCB3aWxsIHN0aWxsIGdvIHRocm91Z2ggdGhlIHZ0YWJsZS4KKyAgYm9vbCBwZXJmb3Jtc1ZpcnR1YWxEaXNwYXRjaChjb25zdCBMYW5nT3B0aW9ucyAmTE8pIGNvbnN0IHsKKyAgICByZXR1cm4gTE8uQXBwbGVLZXh0IHx8ICFoYXNRdWFsaWZpZXIoKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBNZW1iZXJFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7IHJldHVybiBjaGlsZF9yYW5nZSgmQmFzZSwgJkJhc2UrMSk7IH0KKyAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKCZCYXNlLCAmQmFzZSArIDEpOworICB9CisKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKyAgZnJpZW5kIGNsYXNzIEFTVFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRXcml0ZXI7Cit9OworCisvLy8gQ29tcG91bmRMaXRlcmFsRXhwciAtIFtDOTkgNi41LjIuNV0KKy8vLworY2xhc3MgQ29tcG91bmRMaXRlcmFsRXhwciA6IHB1YmxpYyBFeHByIHsKKyAgLy8vIExQYXJlbkxvYyAtIElmIG5vbi1udWxsLCB0aGlzIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGVmdCBwYXJlbiBpbiBhCisgIC8vLyBjb21wb3VuZCBsaXRlcmFsIGxpa2UgIihpbnQpezR9Ii4gIFRoaXMgY2FuIGJlIG51bGwgaWYgdGhpcyBpcyBhCisgIC8vLyBzeW50aGVzaXplZCBjb21wb3VuZCBleHByZXNzaW9uLgorICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2M7CisKKyAgLy8vIFRoZSB0eXBlIGFzIHdyaXR0ZW4uICBUaGlzIGNhbiBiZSBhbiBpbmNvbXBsZXRlIGFycmF5IHR5cGUsIGluCisgIC8vLyB3aGljaCBjYXNlIHRoZSBhY3R1YWwgZXhwcmVzc2lvbiB0eXBlIHdpbGwgYmUgZGlmZmVyZW50LgorICAvLy8gVGhlIGludCBwYXJ0IG9mIHRoZSBwYWlyIHN0b3JlcyB3aGV0aGVyIHRoaXMgZXhwciBpcyBmaWxlIHNjb3BlLgorICBsbHZtOjpQb2ludGVySW50UGFpcjxUeXBlU291cmNlSW5mbyAqLCAxLCBib29sPiBUSW5mb0FuZFNjb3BlOworICBTdG10ICpJbml0OworcHVibGljOgorICBDb21wb3VuZExpdGVyYWxFeHByKFNvdXJjZUxvY2F0aW9uIGxwYXJlbmxvYywgVHlwZVNvdXJjZUluZm8gKnRpbmZvLAorICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIEV4cHJWYWx1ZUtpbmQgVkssIEV4cHIgKmluaXQsIGJvb2wgZmlsZVNjb3BlKQorICAgIDogRXhwcihDb21wb3VuZExpdGVyYWxFeHByQ2xhc3MsIFQsIFZLLCBPS19PcmRpbmFyeSwKKyAgICAgICAgICAgdGluZm8tPmdldFR5cGUoKS0+aXNEZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgIGluaXQtPmlzVmFsdWVEZXBlbmRlbnQoKSwKKyAgICAgICAgICAgKGluaXQtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpIHx8CisgICAgICAgICAgICB0aW5mby0+Z2V0VHlwZSgpLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnRUeXBlKCkpLAorICAgICAgICAgICBpbml0LT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgTFBhcmVuTG9jKGxwYXJlbmxvYyksIFRJbmZvQW5kU2NvcGUodGluZm8sIGZpbGVTY29wZSksIEluaXQoaW5pdCkge30KKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBlbXB0eSBjb21wb3VuZCBsaXRlcmFsLgorICBleHBsaWNpdCBDb21wb3VuZExpdGVyYWxFeHByKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgOiBFeHByKENvbXBvdW5kTGl0ZXJhbEV4cHJDbGFzcywgRW1wdHkpIHsgfQorCisgIGNvbnN0IEV4cHIgKmdldEluaXRpYWxpemVyKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihJbml0KTsgfQorICBFeHByICpnZXRJbml0aWFsaXplcigpIHsgcmV0dXJuIGNhc3Q8RXhwcj4oSW5pdCk7IH0KKyAgdm9pZCBzZXRJbml0aWFsaXplcihFeHByICpFKSB7IEluaXQgPSBFOyB9CisKKyAgYm9vbCBpc0ZpbGVTY29wZSgpIGNvbnN0IHsgcmV0dXJuIFRJbmZvQW5kU2NvcGUuZ2V0SW50KCk7IH0KKyAgdm9pZCBzZXRGaWxlU2NvcGUoYm9vbCBGUykgeyBUSW5mb0FuZFNjb3BlLnNldEludChGUyk7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBMUGFyZW5Mb2M7IH0KKyAgdm9pZCBzZXRMUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTCkgeyBMUGFyZW5Mb2MgPSBMOyB9CisKKyAgVHlwZVNvdXJjZUluZm8gKmdldFR5cGVTb3VyY2VJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBUSW5mb0FuZFNjb3BlLmdldFBvaW50ZXIoKTsKKyAgfQorICB2b2lkIHNldFR5cGVTb3VyY2VJbmZvKFR5cGVTb3VyY2VJbmZvICp0aW5mbykgeworICAgIFRJbmZvQW5kU2NvcGUuc2V0UG9pbnRlcih0aW5mbyk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIC8vIEZJWE1FOiBJbml0IHNob3VsZCBuZXZlciBiZSBudWxsLgorICAgIGlmICghSW5pdCkKKyAgICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbigpOworICAgIGlmIChMUGFyZW5Mb2MuaXNJbnZhbGlkKCkpCisgICAgICByZXR1cm4gSW5pdC0+Z2V0TG9jU3RhcnQoKTsKKyAgICByZXR1cm4gTFBhcmVuTG9jOworICB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIC8vIEZJWE1FOiBJbml0IHNob3VsZCBuZXZlciBiZSBudWxsLgorICAgIGlmICghSW5pdCkKKyAgICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbigpOworICAgIHJldHVybiBJbml0LT5nZXRMb2NFbmQoKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBDb21wb3VuZExpdGVyYWxFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7IHJldHVybiBjaGlsZF9yYW5nZSgmSW5pdCwgJkluaXQrMSk7IH0KKyAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKCZJbml0LCAmSW5pdCArIDEpOworICB9Cit9OworCisvLy8gQ2FzdEV4cHIgLSBCYXNlIGNsYXNzIGZvciB0eXBlIGNhc3RzLCBpbmNsdWRpbmcgYm90aCBpbXBsaWNpdAorLy8vIGNhc3RzIChJbXBsaWNpdENhc3RFeHByKSBhbmQgZXhwbGljaXQgY2FzdHMgdGhhdCBoYXZlIHNvbWUKKy8vLyByZXByZXNlbnRhdGlvbiBpbiB0aGUgc291cmNlIGNvZGUgKEV4cGxpY2l0Q2FzdEV4cHIncyBkZXJpdmVkCisvLy8gY2xhc3NlcykuCitjbGFzcyBDYXN0RXhwciA6IHB1YmxpYyBFeHByIHsKK3ByaXZhdGU6CisgIFN0bXQgKk9wOworCisgIGJvb2wgQ2FzdENvbnNpc3RlbmN5KCkgY29uc3Q7CisKKyAgY29uc3QgQ1hYQmFzZVNwZWNpZmllciAqIGNvbnN0ICpwYXRoX2J1ZmZlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxDYXN0RXhwcio+KHRoaXMpLT5wYXRoX2J1ZmZlcigpOworICB9CisgIENYWEJhc2VTcGVjaWZpZXIgKipwYXRoX2J1ZmZlcigpOworCisgIHZvaWQgc2V0QmFzZVBhdGhTaXplKHVuc2lnbmVkIGJhc2VQYXRoU2l6ZSkgeworICAgIENhc3RFeHByQml0cy5CYXNlUGF0aFNpemUgPSBiYXNlUGF0aFNpemU7CisgICAgYXNzZXJ0KENhc3RFeHByQml0cy5CYXNlUGF0aFNpemUgPT0gYmFzZVBhdGhTaXplICYmCisgICAgICAgICAgICJiYXNlUGF0aFNpemUgZG9lc24ndCBmaXQgaW4gYml0cyBvZiBDYXN0RXhwckJpdHMuQmFzZVBhdGhTaXplISIpOworICB9CisKK3Byb3RlY3RlZDoKKyAgQ2FzdEV4cHIoU3RtdENsYXNzIFNDLCBRdWFsVHlwZSB0eSwgRXhwclZhbHVlS2luZCBWSywgY29uc3QgQ2FzdEtpbmQga2luZCwKKyAgICAgICAgICAgRXhwciAqb3AsIHVuc2lnbmVkIEJhc2VQYXRoU2l6ZSkKKyAgICAgIDogRXhwcihTQywgdHksIFZLLCBPS19PcmRpbmFyeSwKKyAgICAgICAgICAgICAvLyBDYXN0IGV4cHJlc3Npb25zIGFyZSB0eXBlLWRlcGVuZGVudCBpZiB0aGUgdHlwZSBpcworICAgICAgICAgICAgIC8vIGRlcGVuZGVudCAoQysrIFt0ZW1wLmRlcC5leHByXXAzKS4KKyAgICAgICAgICAgICB0eS0+aXNEZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgICAgLy8gQ2FzdCBleHByZXNzaW9ucyBhcmUgdmFsdWUtZGVwZW5kZW50IGlmIHRoZSB0eXBlIGlzCisgICAgICAgICAgICAgLy8gZGVwZW5kZW50IG9yIGlmIHRoZSBzdWJleHByZXNzaW9uIGlzIHZhbHVlLWRlcGVuZGVudC4KKyAgICAgICAgICAgICB0eS0+aXNEZXBlbmRlbnRUeXBlKCkgfHwgKG9wICYmIG9wLT5pc1ZhbHVlRGVwZW5kZW50KCkpLAorICAgICAgICAgICAgICh0eS0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpIHx8CisgICAgICAgICAgICAgIChvcCAmJiBvcC0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCkpKSwKKyAgICAgICAgICAgICAvLyBBbiBpbXBsaWNpdCBjYXN0IGV4cHJlc3Npb24gZG9lc24ndCAobGV4aWNhbGx5KSBjb250YWluIGFuCisgICAgICAgICAgICAgLy8gdW5leHBhbmRlZCBwYWNrLCBldmVuIGlmIGl0cyB0YXJnZXQgdHlwZSBkb2VzLgorICAgICAgICAgICAgICgoU0MgIT0gSW1wbGljaXRDYXN0RXhwckNsYXNzICYmCisgICAgICAgICAgICAgICB0eS0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSB8fAorICAgICAgICAgICAgICAob3AgJiYgb3AtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSkpKSwKKyAgICAgICAgT3Aob3ApIHsKKyAgICBDYXN0RXhwckJpdHMuS2luZCA9IGtpbmQ7CisgICAgc2V0QmFzZVBhdGhTaXplKEJhc2VQYXRoU2l6ZSk7CisgICAgYXNzZXJ0KENhc3RDb25zaXN0ZW5jeSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIGVtcHR5IGNhc3QuCisgIENhc3RFeHByKFN0bXRDbGFzcyBTQywgRW1wdHlTaGVsbCBFbXB0eSwgdW5zaWduZWQgQmFzZVBhdGhTaXplKQorICAgIDogRXhwcihTQywgRW1wdHkpIHsKKyAgICBzZXRCYXNlUGF0aFNpemUoQmFzZVBhdGhTaXplKTsKKyAgfQorCitwdWJsaWM6CisgIENhc3RLaW5kIGdldENhc3RLaW5kKCkgY29uc3QgeyByZXR1cm4gKENhc3RLaW5kKSBDYXN0RXhwckJpdHMuS2luZDsgfQorICB2b2lkIHNldENhc3RLaW5kKENhc3RLaW5kIEspIHsgQ2FzdEV4cHJCaXRzLktpbmQgPSBLOyB9CisgIGNvbnN0IGNoYXIgKmdldENhc3RLaW5kTmFtZSgpIGNvbnN0OworCisgIEV4cHIgKmdldFN1YkV4cHIoKSB7IHJldHVybiBjYXN0PEV4cHI+KE9wKTsgfQorICBjb25zdCBFeHByICpnZXRTdWJFeHByKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihPcCk7IH0KKyAgdm9pZCBzZXRTdWJFeHByKEV4cHIgKkUpIHsgT3AgPSBFOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgY2FzdCBzdWJleHByZXNzaW9uIGFzIGl0IHdhcyB3cml0dGVuIGluIHRoZSBzb3VyY2UKKyAgLy8vIGNvZGUsIGxvb2tpbmcgdGhyb3VnaCBhbnkgaW1wbGljaXQgY2FzdHMgb3Igb3RoZXIgaW50ZXJtZWRpYXRlIG5vZGVzCisgIC8vLyBpbnRyb2R1Y2VkIGJ5IHNlbWFudGljIGFuYWx5c2lzLgorICBFeHByICpnZXRTdWJFeHByQXNXcml0dGVuKCk7CisgIGNvbnN0IEV4cHIgKmdldFN1YkV4cHJBc1dyaXR0ZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q2FzdEV4cHIgKj4odGhpcyktPmdldFN1YkV4cHJBc1dyaXR0ZW4oKTsKKyAgfQorCisgIHR5cGVkZWYgQ1hYQmFzZVNwZWNpZmllciAqKnBhdGhfaXRlcmF0b3I7CisgIHR5cGVkZWYgY29uc3QgQ1hYQmFzZVNwZWNpZmllciAqIGNvbnN0ICpwYXRoX2NvbnN0X2l0ZXJhdG9yOworICBib29sIHBhdGhfZW1wdHkoKSBjb25zdCB7IHJldHVybiBDYXN0RXhwckJpdHMuQmFzZVBhdGhTaXplID09IDA7IH0KKyAgdW5zaWduZWQgcGF0aF9zaXplKCkgY29uc3QgeyByZXR1cm4gQ2FzdEV4cHJCaXRzLkJhc2VQYXRoU2l6ZTsgfQorICBwYXRoX2l0ZXJhdG9yIHBhdGhfYmVnaW4oKSB7IHJldHVybiBwYXRoX2J1ZmZlcigpOyB9CisgIHBhdGhfaXRlcmF0b3IgcGF0aF9lbmQoKSB7IHJldHVybiBwYXRoX2J1ZmZlcigpICsgcGF0aF9zaXplKCk7IH0KKyAgcGF0aF9jb25zdF9pdGVyYXRvciBwYXRoX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gcGF0aF9idWZmZXIoKTsgfQorICBwYXRoX2NvbnN0X2l0ZXJhdG9yIHBhdGhfZW5kKCkgY29uc3QgeyByZXR1cm4gcGF0aF9idWZmZXIoKSArIHBhdGhfc2l6ZSgpOyB9CisKKyAgY29uc3QgRmllbGREZWNsICpnZXRUYXJnZXRVbmlvbkZpZWxkKCkgY29uc3QgeworICAgIGFzc2VydChnZXRDYXN0S2luZCgpID09IENLX1RvVW5pb24pOworICAgIHJldHVybiBnZXRUYXJnZXRGaWVsZEZvclRvVW5pb25DYXN0KGdldFR5cGUoKSwgZ2V0U3ViRXhwcigpLT5nZXRUeXBlKCkpOworICB9CisKKyAgc3RhdGljIGNvbnN0IEZpZWxkRGVjbCAqZ2V0VGFyZ2V0RmllbGRGb3JUb1VuaW9uQ2FzdChRdWFsVHlwZSB1bmlvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgb3BUeXBlKTsKKyAgc3RhdGljIGNvbnN0IEZpZWxkRGVjbCAqZ2V0VGFyZ2V0RmllbGRGb3JUb1VuaW9uQ2FzdChjb25zdCBSZWNvcmREZWNsICpSRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBvcFR5cGUpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA+PSBmaXJzdENhc3RFeHByQ29uc3RhbnQgJiYKKyAgICAgICAgICAgVC0+Z2V0U3RtdENsYXNzKCkgPD0gbGFzdENhc3RFeHByQ29uc3RhbnQ7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7IHJldHVybiBjaGlsZF9yYW5nZSgmT3AsICZPcCsxKTsgfQorICBjb25zdF9jaGlsZF9yYW5nZSBjaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKCZPcCwgJk9wICsgMSk7IH0KK307CisKKy8vLyBJbXBsaWNpdENhc3RFeHByIC0gQWxsb3dzIHVzIHRvIGV4cGxpY2l0bHkgcmVwcmVzZW50IGltcGxpY2l0IHR5cGUKKy8vLyBjb252ZXJzaW9ucywgd2hpY2ggaGF2ZSBubyBkaXJlY3QgcmVwcmVzZW50YXRpb24gaW4gdGhlIG9yaWdpbmFsCisvLy8gc291cmNlIGNvZGUuIEZvciBleGFtcGxlOiBjb252ZXJ0aW5nIFRbXS0+VCosIHZvaWQgZigpLT52b2lkCisvLy8gKCpmKSgpLCBmbG9hdC0+ZG91YmxlLCBzaG9ydC0+aW50LCBldGMuCisvLy8KKy8vLyBJbiBDLCBpbXBsaWNpdCBjYXN0cyBhbHdheXMgcHJvZHVjZSBydmFsdWVzLiBIb3dldmVyLCBpbiBDKyssIGFuCisvLy8gaW1wbGljaXQgY2FzdCB3aG9zZSByZXN1bHQgaXMgYmVpbmcgYm91bmQgdG8gYSByZWZlcmVuY2Ugd2lsbCBiZQorLy8vIGFuIGx2YWx1ZSBvciB4dmFsdWUuIEZvciBleGFtcGxlOgorLy8vCisvLy8gQGNvZGUKKy8vLyBjbGFzcyBCYXNlIHsgfTsKKy8vLyBjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UgeyB9OworLy8vIERlcml2ZWQgJiZyZWYoKTsKKy8vLyB2b2lkIGYoRGVyaXZlZCBkKSB7CisvLy8gICBCYXNlJiBiID0gZDsgLy8gaW5pdGlhbGl6ZXIgaXMgYW4gSW1wbGljaXRDYXN0RXhwcgorLy8vICAgICAgICAgICAgICAgIC8vIHRvIGFuIGx2YWx1ZSBvZiB0eXBlIEJhc2UKKy8vLyAgIEJhc2UmJiByID0gcmVmKCk7IC8vIGluaXRpYWxpemVyIGlzIGFuIEltcGxpY2l0Q2FzdEV4cHIKKy8vLyAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGFuIHh2YWx1ZSBvZiB0eXBlIEJhc2UKKy8vLyB9CisvLy8gQGVuZGNvZGUKK2NsYXNzIEltcGxpY2l0Q2FzdEV4cHIgZmluYWwKKyAgICA6IHB1YmxpYyBDYXN0RXhwciwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPEltcGxpY2l0Q2FzdEV4cHIsIENYWEJhc2VTcGVjaWZpZXIgKj4geworcHJpdmF0ZToKKyAgSW1wbGljaXRDYXN0RXhwcihRdWFsVHlwZSB0eSwgQ2FzdEtpbmQga2luZCwgRXhwciAqb3AsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQmFzZVBhdGhMZW5ndGgsIEV4cHJWYWx1ZUtpbmQgVkspCisgICAgOiBDYXN0RXhwcihJbXBsaWNpdENhc3RFeHByQ2xhc3MsIHR5LCBWSywga2luZCwgb3AsIEJhc2VQYXRoTGVuZ3RoKSB7CisgIH0KKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBlbXB0eSBpbXBsaWNpdCBjYXN0LgorICBleHBsaWNpdCBJbXBsaWNpdENhc3RFeHByKEVtcHR5U2hlbGwgU2hlbGwsIHVuc2lnbmVkIFBhdGhTaXplKQorICAgIDogQ2FzdEV4cHIoSW1wbGljaXRDYXN0RXhwckNsYXNzLCBTaGVsbCwgUGF0aFNpemUpIHsgfQorCitwdWJsaWM6CisgIGVudW0gT25TdGFja190IHsgT25TdGFjayB9OworICBJbXBsaWNpdENhc3RFeHByKE9uU3RhY2tfdCBfLCBRdWFsVHlwZSB0eSwgQ2FzdEtpbmQga2luZCwgRXhwciAqb3AsCisgICAgICAgICAgICAgICAgICAgRXhwclZhbHVlS2luZCBWSykKKyAgICA6IENhc3RFeHByKEltcGxpY2l0Q2FzdEV4cHJDbGFzcywgdHksIFZLLCBraW5kLCBvcCwgMCkgeworICB9CisKKyAgc3RhdGljIEltcGxpY2l0Q2FzdEV4cHIgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LCBRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3RLaW5kIEtpbmQsIEV4cHIgKk9wZXJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYQ2FzdFBhdGggKkJhc2VQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJWYWx1ZUtpbmQgQ2F0KTsKKworICBzdGF0aWMgSW1wbGljaXRDYXN0RXhwciAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBhdGhTaXplKTsKKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBnZXRTdWJFeHByKCktPmdldExvY1N0YXJ0KCk7CisgIH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGdldFN1YkV4cHIoKS0+Z2V0TG9jRW5kKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gSW1wbGljaXRDYXN0RXhwckNsYXNzOworICB9CisKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKyAgZnJpZW5kIGNsYXNzIENhc3RFeHByOworfTsKKworaW5saW5lIEV4cHIgKkV4cHI6Oklnbm9yZUltcENhc3RzKCkgeworICBFeHByICplID0gdGhpczsKKyAgd2hpbGUgKEltcGxpY2l0Q2FzdEV4cHIgKmljZSA9IGR5bl9jYXN0PEltcGxpY2l0Q2FzdEV4cHI+KGUpKQorICAgIGUgPSBpY2UtPmdldFN1YkV4cHIoKTsKKyAgcmV0dXJuIGU7Cit9CisKKy8vLyBFeHBsaWNpdENhc3RFeHByIC0gQW4gZXhwbGljaXQgY2FzdCB3cml0dGVuIGluIHRoZSBzb3VyY2UKKy8vLyBjb2RlLgorLy8vCisvLy8gVGhpcyBjbGFzcyBpcyBlZmZlY3RpdmVseSBhbiBhYnN0cmFjdCBjbGFzcywgYmVjYXVzZSBpdCBwcm92aWRlcworLy8vIHRoZSBiYXNpYyByZXByZXNlbnRhdGlvbiBvZiBhbiBleHBsaWNpdGx5LXdyaXR0ZW4gY2FzdCB3aXRob3V0CisvLy8gc3BlY2lmeWluZyB3aGljaCBraW5kIG9mIGNhc3QgKEMgY2FzdCwgZnVuY3Rpb25hbCBjYXN0LCBzdGF0aWMKKy8vLyBjYXN0LCBldGMuKSB3YXMgd3JpdHRlbjsgc3BlY2lmaWMgZGVyaXZlZCBjbGFzc2VzIHJlcHJlc2VudCB0aGUKKy8vLyBwYXJ0aWN1bGFyIHN0eWxlIG9mIGNhc3QgYW5kIGl0cyBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKy8vLworLy8vIFVubGlrZSBpbXBsaWNpdCBjYXN0cywgZXhwbGljaXQgY2FzdCBub2RlcyBoYXZlIHR3byBkaWZmZXJlbnQKKy8vLyB0eXBlczogdGhlIHR5cGUgdGhhdCB3YXMgd3JpdHRlbiBpbnRvIHRoZSBzb3VyY2UgY29kZSwgYW5kIHRoZQorLy8vIGFjdHVhbCB0eXBlIG9mIHRoZSBleHByZXNzaW9uIGFzIGRldGVybWluZWQgYnkgc2VtYW50aWMKKy8vLyBhbmFseXNpcy4gVGhlc2UgdHlwZXMgbWF5IGRpZmZlciBzbGlnaHRseS4gRm9yIGV4YW1wbGUsIGluIEMrKyBvbmUKKy8vLyBjYW4gY2FzdCB0byBhIHJlZmVyZW5jZSB0eXBlLCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVzdWx0aW5nCisvLy8gZXhwcmVzc2lvbiB3aWxsIGJlIGFuIGx2YWx1ZSBvciB4dmFsdWUuIFRoZSByZWZlcmVuY2UgdHlwZSwgaG93ZXZlciwKKy8vLyB3aWxsIG5vdCBiZSB1c2VkIGFzIHRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uLgorY2xhc3MgRXhwbGljaXRDYXN0RXhwciA6IHB1YmxpYyBDYXN0RXhwciB7CisgIC8vLyBUSW5mbyAtIFNvdXJjZSB0eXBlIGluZm8gZm9yIHRoZSAod3JpdHRlbikgdHlwZQorICAvLy8gdGhpcyBleHByZXNzaW9uIGlzIGNhc3RpbmcgdG8uCisgIFR5cGVTb3VyY2VJbmZvICpUSW5mbzsKKworcHJvdGVjdGVkOgorICBFeHBsaWNpdENhc3RFeHByKFN0bXRDbGFzcyBTQywgUXVhbFR5cGUgZXhwclR5LCBFeHByVmFsdWVLaW5kIFZLLAorICAgICAgICAgICAgICAgICAgIENhc3RLaW5kIGtpbmQsIEV4cHIgKm9wLCB1bnNpZ25lZCBQYXRoU2l6ZSwKKyAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqd3JpdHRlblR5KQorICAgIDogQ2FzdEV4cHIoU0MsIGV4cHJUeSwgVkssIGtpbmQsIG9wLCBQYXRoU2l6ZSksIFRJbmZvKHdyaXR0ZW5UeSkge30KKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBlbXB0eSBleHBsaWNpdCBjYXN0LgorICBFeHBsaWNpdENhc3RFeHByKFN0bXRDbGFzcyBTQywgRW1wdHlTaGVsbCBTaGVsbCwgdW5zaWduZWQgUGF0aFNpemUpCisgICAgOiBDYXN0RXhwcihTQywgU2hlbGwsIFBhdGhTaXplKSB7IH0KKworcHVibGljOgorICAvLy8gZ2V0VHlwZUluZm9Bc1dyaXR0ZW4gLSBSZXR1cm5zIHRoZSB0eXBlIHNvdXJjZSBpbmZvIGZvciB0aGUgdHlwZQorICAvLy8gdGhhdCB0aGlzIGV4cHJlc3Npb24gaXMgY2FzdGluZyB0by4KKyAgVHlwZVNvdXJjZUluZm8gKmdldFR5cGVJbmZvQXNXcml0dGVuKCkgY29uc3QgeyByZXR1cm4gVEluZm87IH0KKyAgdm9pZCBzZXRUeXBlSW5mb0FzV3JpdHRlbihUeXBlU291cmNlSW5mbyAqd3JpdHRlblR5KSB7IFRJbmZvID0gd3JpdHRlblR5OyB9CisKKyAgLy8vIGdldFR5cGVBc1dyaXR0ZW4gLSBSZXR1cm5zIHRoZSB0eXBlIHRoYXQgdGhpcyBleHByZXNzaW9uIGlzCisgIC8vLyBjYXN0aW5nIHRvLCBhcyB3cml0dGVuIGluIHRoZSBzb3VyY2UgY29kZS4KKyAgUXVhbFR5cGUgZ2V0VHlwZUFzV3JpdHRlbigpIGNvbnN0IHsgcmV0dXJuIFRJbmZvLT5nZXRUeXBlKCk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID49IGZpcnN0RXhwbGljaXRDYXN0RXhwckNvbnN0YW50ICYmCisgICAgICAgICAgICBULT5nZXRTdG10Q2xhc3MoKSA8PSBsYXN0RXhwbGljaXRDYXN0RXhwckNvbnN0YW50OworICB9Cit9OworCisvLy8gQ1N0eWxlQ2FzdEV4cHIgLSBBbiBleHBsaWNpdCBjYXN0IGluIEMgKEM5OSA2LjUuNCkgb3IgYSBDLXN0eWxlCisvLy8gY2FzdCBpbiBDKysgKEMrKyBbZXhwci5jYXN0XSksIHdoaWNoIHVzZXMgdGhlIHN5bnRheAorLy8vIChUeXBlKWV4cHIuIEZvciBleGFtcGxlOiBAYyAoaW50KWYuCitjbGFzcyBDU3R5bGVDYXN0RXhwciBmaW5hbAorICAgIDogcHVibGljIEV4cGxpY2l0Q2FzdEV4cHIsCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxDU3R5bGVDYXN0RXhwciwgQ1hYQmFzZVNwZWNpZmllciAqPiB7CisgIFNvdXJjZUxvY2F0aW9uIExQTG9jOyAvLyB0aGUgbG9jYXRpb24gb2YgdGhlIGxlZnQgcGFyZW4KKyAgU291cmNlTG9jYXRpb24gUlBMb2M7IC8vIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmlnaHQgcGFyZW4KKworICBDU3R5bGVDYXN0RXhwcihRdWFsVHlwZSBleHByVHksIEV4cHJWYWx1ZUtpbmQgdmssIENhc3RLaW5kIGtpbmQsIEV4cHIgKm9wLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQYXRoU2l6ZSwgVHlwZVNvdXJjZUluZm8gKndyaXR0ZW5UeSwKKyAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gbCwgU291cmNlTG9jYXRpb24gcikKKyAgICA6IEV4cGxpY2l0Q2FzdEV4cHIoQ1N0eWxlQ2FzdEV4cHJDbGFzcywgZXhwclR5LCB2aywga2luZCwgb3AsIFBhdGhTaXplLAorICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuVHkpLCBMUExvYyhsKSwgUlBMb2Mocikge30KKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBlbXB0eSBDLXN0eWxlIGV4cGxpY2l0IGNhc3QuCisgIGV4cGxpY2l0IENTdHlsZUNhc3RFeHByKEVtcHR5U2hlbGwgU2hlbGwsIHVuc2lnbmVkIFBhdGhTaXplKQorICAgIDogRXhwbGljaXRDYXN0RXhwcihDU3R5bGVDYXN0RXhwckNsYXNzLCBTaGVsbCwgUGF0aFNpemUpIHsgfQorCitwdWJsaWM6CisgIHN0YXRpYyBDU3R5bGVDYXN0RXhwciAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQsIFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJWYWx1ZUtpbmQgVkssIENhc3RLaW5kIEssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKk9wLCBjb25zdCBDWFhDYXN0UGF0aCAqQmFzZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpXcml0dGVuVHksIFNvdXJjZUxvY2F0aW9uIEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFIpOworCisgIHN0YXRpYyBDU3R5bGVDYXN0RXhwciAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQYXRoU2l6ZSk7CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TFBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gTFBMb2M7IH0KKyAgdm9pZCBzZXRMUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTCkgeyBMUExvYyA9IEw7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRSUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBSUExvYzsgfQorICB2b2lkIHNldFJQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IFJQTG9jID0gTDsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMUExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gZ2V0U3ViRXhwcigpLT5nZXRMb2NFbmQoKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBDU3R5bGVDYXN0RXhwckNsYXNzOworICB9CisKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKyAgZnJpZW5kIGNsYXNzIENhc3RFeHByOworfTsKKworLy8vIFxicmllZiBBIGJ1aWx0aW4gYmluYXJ5IG9wZXJhdGlvbiBleHByZXNzaW9uIHN1Y2ggYXMgInggKyB5IiBvciAieCA8PSB5Ii4KKy8vLworLy8vIFRoaXMgZXhwcmVzc2lvbiBub2RlIGtpbmQgZGVzY3JpYmVzIGEgYnVpbHRpbiBiaW5hcnkgb3BlcmF0aW9uLAorLy8vIHN1Y2ggYXMgInggKyB5IiBmb3IgaW50ZWdlciB2YWx1ZXMgIngiIGFuZCAieSIuIFRoZSBvcGVyYW5kcyB3aWxsCisvLy8gYWxyZWFkeSBoYXZlIGJlZW4gY29udmVydGVkIHRvIGFwcHJvcHJpYXRlIHR5cGVzIChlLmcuLCBieQorLy8vIHBlcmZvcm1pbmcgcHJvbW90aW9ucyBvciBjb252ZXJzaW9ucykuCisvLy8KKy8vLyBJbiBDKyssIHdoZXJlIG9wZXJhdG9ycyBtYXkgYmUgb3ZlcmxvYWRlZCwgYSBkaWZmZXJlbnQga2luZCBvZgorLy8vIGV4cHJlc3Npb24gbm9kZSAoQ1hYT3BlcmF0b3JDYWxsRXhwcikgaXMgdXNlZCB0byBleHByZXNzIHRoZQorLy8vIGludm9jYXRpb24gb2YgYW4gb3ZlcmxvYWRlZCBvcGVyYXRvciB3aXRoIG9wZXJhdG9yIHN5bnRheC4gV2l0aGluCisvLy8gYSBDKysgdGVtcGxhdGUsIHdoZXRoZXIgQmluYXJ5T3BlcmF0b3Igb3IgQ1hYT3BlcmF0b3JDYWxsRXhwciBpcworLy8vIHVzZWQgdG8gc3RvcmUgYW4gZXhwcmVzc2lvbiAieCArIHkiIGRlcGVuZHMgb24gdGhlIHN1YmV4cHJlc3Npb25zCisvLy8gZm9yIHggYW5kIHkuIElmIG5laXRoZXIgeCBvciB5IGlzIHR5cGUtZGVwZW5kZW50LCBhbmQgdGhlICIrIgorLy8vIG9wZXJhdG9yIHJlc29sdmVzIHRvIGEgYnVpbHQtaW4gb3BlcmF0aW9uLCBCaW5hcnlPcGVyYXRvciB3aWxsIGJlCisvLy8gdXNlZCB0byBleHByZXNzIHRoZSBjb21wdXRhdGlvbiAoeCBhbmQgeSBtYXkgc3RpbGwgYmUKKy8vLyB2YWx1ZS1kZXBlbmRlbnQpLiBJZiBlaXRoZXIgeCBvciB5IGlzIHR5cGUtZGVwZW5kZW50LCBvciBpZiB0aGUKKy8vLyAiKyIgcmVzb2x2ZXMgdG8gYW4gb3ZlcmxvYWRlZCBvcGVyYXRvciwgQ1hYT3BlcmF0b3JDYWxsRXhwciB3aWxsCisvLy8gYmUgdXNlZCB0byBleHByZXNzIHRoZSBjb21wdXRhdGlvbi4KK2NsYXNzIEJpbmFyeU9wZXJhdG9yIDogcHVibGljIEV4cHIgeworcHVibGljOgorICB0eXBlZGVmIEJpbmFyeU9wZXJhdG9yS2luZCBPcGNvZGU7CisKK3ByaXZhdGU6CisgIHVuc2lnbmVkIE9wYyA6IDY7CisKKyAgLy8gVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIG9wZXJhdGlvbnMgb24gZmxvYXRpbmcgcG9pbnQgdHlwZXMgYW5kIDAKKyAgLy8gb3RoZXJ3aXNlLgorICB1bnNpZ25lZCBGUEZlYXR1cmVzIDogMjsKKyAgU291cmNlTG9jYXRpb24gT3BMb2M7CisKKyAgZW51bSB7IExIUywgUkhTLCBFTkRfRVhQUiB9OworICBTdG10KiBTdWJFeHByc1tFTkRfRVhQUl07CitwdWJsaWM6CisKKyAgQmluYXJ5T3BlcmF0b3IoRXhwciAqbGhzLCBFeHByICpyaHMsIE9wY29kZSBvcGMsIFF1YWxUeXBlIFJlc1R5LAorICAgICAgICAgICAgICAgICBFeHByVmFsdWVLaW5kIFZLLCBFeHByT2JqZWN0S2luZCBPSywKKyAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gb3BMb2MsIEZQT3B0aW9ucyBGUEZlYXR1cmVzKQorICAgIDogRXhwcihCaW5hcnlPcGVyYXRvckNsYXNzLCBSZXNUeSwgVkssIE9LLAorICAgICAgICAgICBsaHMtPmlzVHlwZURlcGVuZGVudCgpIHx8IHJocy0+aXNUeXBlRGVwZW5kZW50KCksCisgICAgICAgICAgIGxocy0+aXNWYWx1ZURlcGVuZGVudCgpIHx8IHJocy0+aXNWYWx1ZURlcGVuZGVudCgpLAorICAgICAgICAgICAobGhzLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnQoKSB8fAorICAgICAgICAgICAgcmhzLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnQoKSksCisgICAgICAgICAgIChsaHMtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSB8fAorICAgICAgICAgICAgcmhzLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpKSwKKyAgICAgIE9wYyhvcGMpLCBGUEZlYXR1cmVzKEZQRmVhdHVyZXMuZ2V0SW50KCkpLCBPcExvYyhvcExvYykgeworICAgIFN1YkV4cHJzW0xIU10gPSBsaHM7CisgICAgU3ViRXhwcnNbUkhTXSA9IHJoczsKKyAgICBhc3NlcnQoIWlzQ29tcG91bmRBc3NpZ25tZW50T3AoKSAmJgorICAgICAgICAgICAiVXNlIENvbXBvdW5kQXNzaWduT3BlcmF0b3IgZm9yIGNvbXBvdW5kIGFzc2lnbm1lbnRzIik7CisgIH0KKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBlbXB0eSBiaW5hcnkgb3BlcmF0b3IuCisgIGV4cGxpY2l0IEJpbmFyeU9wZXJhdG9yKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgOiBFeHByKEJpbmFyeU9wZXJhdG9yQ2xhc3MsIEVtcHR5KSwgT3BjKEJPX0NvbW1hKSB7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRFeHByTG9jKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBPcExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRPcGVyYXRvckxvYygpIGNvbnN0IHsgcmV0dXJuIE9wTG9jOyB9CisgIHZvaWQgc2V0T3BlcmF0b3JMb2MoU291cmNlTG9jYXRpb24gTCkgeyBPcExvYyA9IEw7IH0KKworICBPcGNvZGUgZ2V0T3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8T3Bjb2RlPihPcGMpOyB9CisgIHZvaWQgc2V0T3Bjb2RlKE9wY29kZSBPKSB7IE9wYyA9IE87IH0KKworICBFeHByICpnZXRMSFMoKSBjb25zdCB7IHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHJzW0xIU10pOyB9CisgIHZvaWQgc2V0TEhTKEV4cHIgKkUpIHsgU3ViRXhwcnNbTEhTXSA9IEU7IH0KKyAgRXhwciAqZ2V0UkhTKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByc1tSSFNdKTsgfQorICB2b2lkIHNldFJIUyhFeHByICpFKSB7IFN1YkV4cHJzW1JIU10gPSBFOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gZ2V0TEhTKCktPmdldExvY1N0YXJ0KCk7CisgIH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGdldFJIUygpLT5nZXRMb2NFbmQoKTsKKyAgfQorCisgIC8vLyBnZXRPcGNvZGVTdHIgLSBUdXJuIGFuIE9wY29kZSBlbnVtIHZhbHVlIGludG8gdGhlIHB1bmN0dWF0aW9uIGNoYXIgaXQKKyAgLy8vIGNvcnJlc3BvbmRzIHRvLCBlLmcuICI8PD0iLgorICBzdGF0aWMgU3RyaW5nUmVmIGdldE9wY29kZVN0cihPcGNvZGUgT3ApOworCisgIFN0cmluZ1JlZiBnZXRPcGNvZGVTdHIoKSBjb25zdCB7IHJldHVybiBnZXRPcGNvZGVTdHIoZ2V0T3Bjb2RlKCkpOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgYmluYXJ5IG9wY29kZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbgorICAvLy8gb3ZlcmxvYWRlZCBvcGVyYXRvci4KKyAgc3RhdGljIE9wY29kZSBnZXRPdmVybG9hZGVkT3Bjb2RlKE92ZXJsb2FkZWRPcGVyYXRvcktpbmQgT08pOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG92ZXJsb2FkZWQgb3BlcmF0b3Iga2luZCB0aGF0IGNvcnJlc3BvbmRzIHRvCisgIC8vLyB0aGUgZ2l2ZW4gYmluYXJ5IG9wY29kZS4KKyAgc3RhdGljIE92ZXJsb2FkZWRPcGVyYXRvcktpbmQgZ2V0T3ZlcmxvYWRlZE9wZXJhdG9yKE9wY29kZSBPcGMpOworCisgIC8vLyBwcmVkaWNhdGVzIHRvIGNhdGVnb3JpemUgdGhlIHJlc3BlY3RpdmUgb3Bjb2Rlcy4KKyAgYm9vbCBpc1B0ck1lbU9wKCkgY29uc3QgeyByZXR1cm4gT3BjID09IEJPX1B0ck1lbUQgfHwgT3BjID09IEJPX1B0ck1lbUk7IH0KKyAgc3RhdGljIGJvb2wgaXNNdWx0aXBsaWNhdGl2ZU9wKE9wY29kZSBPcGMpIHsKKyAgICByZXR1cm4gT3BjID49IEJPX011bCAmJiBPcGMgPD0gQk9fUmVtOworICB9CisgIGJvb2wgaXNNdWx0aXBsaWNhdGl2ZU9wKCkgY29uc3QgeyByZXR1cm4gaXNNdWx0aXBsaWNhdGl2ZU9wKGdldE9wY29kZSgpKTsgfQorICBzdGF0aWMgYm9vbCBpc0FkZGl0aXZlT3AoT3Bjb2RlIE9wYykgeyByZXR1cm4gT3BjID09IEJPX0FkZCB8fCBPcGM9PUJPX1N1YjsgfQorICBib29sIGlzQWRkaXRpdmVPcCgpIGNvbnN0IHsgcmV0dXJuIGlzQWRkaXRpdmVPcChnZXRPcGNvZGUoKSk7IH0KKyAgc3RhdGljIGJvb2wgaXNTaGlmdE9wKE9wY29kZSBPcGMpIHsgcmV0dXJuIE9wYyA9PSBCT19TaGwgfHwgT3BjID09IEJPX1NocjsgfQorICBib29sIGlzU2hpZnRPcCgpIGNvbnN0IHsgcmV0dXJuIGlzU2hpZnRPcChnZXRPcGNvZGUoKSk7IH0KKworICBzdGF0aWMgYm9vbCBpc0JpdHdpc2VPcChPcGNvZGUgT3BjKSB7IHJldHVybiBPcGMgPj0gQk9fQW5kICYmIE9wYyA8PSBCT19PcjsgfQorICBib29sIGlzQml0d2lzZU9wKCkgY29uc3QgeyByZXR1cm4gaXNCaXR3aXNlT3AoZ2V0T3Bjb2RlKCkpOyB9CisKKyAgc3RhdGljIGJvb2wgaXNSZWxhdGlvbmFsT3AoT3Bjb2RlIE9wYykgeyByZXR1cm4gT3BjID49IEJPX0xUICYmIE9wYzw9Qk9fR0U7IH0KKyAgYm9vbCBpc1JlbGF0aW9uYWxPcCgpIGNvbnN0IHsgcmV0dXJuIGlzUmVsYXRpb25hbE9wKGdldE9wY29kZSgpKTsgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWxpdHlPcChPcGNvZGUgT3BjKSB7IHJldHVybiBPcGMgPT0gQk9fRVEgfHwgT3BjID09IEJPX05FOyB9CisgIGJvb2wgaXNFcXVhbGl0eU9wKCkgY29uc3QgeyByZXR1cm4gaXNFcXVhbGl0eU9wKGdldE9wY29kZSgpKTsgfQorCisgIHN0YXRpYyBib29sIGlzQ29tcGFyaXNvbk9wKE9wY29kZSBPcGMpIHsgcmV0dXJuIE9wYyA+PSBCT19DbXAgJiYgT3BjPD1CT19ORTsgfQorICBib29sIGlzQ29tcGFyaXNvbk9wKCkgY29uc3QgeyByZXR1cm4gaXNDb21wYXJpc29uT3AoZ2V0T3Bjb2RlKCkpOyB9CisKKyAgc3RhdGljIE9wY29kZSBuZWdhdGVDb21wYXJpc29uT3AoT3Bjb2RlIE9wYykgeworICAgIHN3aXRjaCAoT3BjKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIk5vdCBhIGNvbXBhcnNpb24gb3BlcmF0b3IuIik7CisgICAgY2FzZSBCT19MVDogcmV0dXJuIEJPX0dFOworICAgIGNhc2UgQk9fR1Q6IHJldHVybiBCT19MRTsKKyAgICBjYXNlIEJPX0xFOiByZXR1cm4gQk9fR1Q7CisgICAgY2FzZSBCT19HRTogcmV0dXJuIEJPX0xUOworICAgIGNhc2UgQk9fRVE6IHJldHVybiBCT19ORTsKKyAgICBjYXNlIEJPX05FOiByZXR1cm4gQk9fRVE7CisgICAgfQorICB9CisKKyAgc3RhdGljIE9wY29kZSByZXZlcnNlQ29tcGFyaXNvbk9wKE9wY29kZSBPcGMpIHsKKyAgICBzd2l0Y2ggKE9wYykgeworICAgIGRlZmF1bHQ6CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJOb3QgYSBjb21wYXJzaW9uIG9wZXJhdG9yLiIpOworICAgIGNhc2UgQk9fTFQ6IHJldHVybiBCT19HVDsKKyAgICBjYXNlIEJPX0dUOiByZXR1cm4gQk9fTFQ7CisgICAgY2FzZSBCT19MRTogcmV0dXJuIEJPX0dFOworICAgIGNhc2UgQk9fR0U6IHJldHVybiBCT19MRTsKKyAgICBjYXNlIEJPX0VROgorICAgIGNhc2UgQk9fTkU6CisgICAgICByZXR1cm4gT3BjOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBib29sIGlzTG9naWNhbE9wKE9wY29kZSBPcGMpIHsgcmV0dXJuIE9wYyA9PSBCT19MQW5kIHx8IE9wYz09Qk9fTE9yOyB9CisgIGJvb2wgaXNMb2dpY2FsT3AoKSBjb25zdCB7IHJldHVybiBpc0xvZ2ljYWxPcChnZXRPcGNvZGUoKSk7IH0KKworICBzdGF0aWMgYm9vbCBpc0Fzc2lnbm1lbnRPcChPcGNvZGUgT3BjKSB7CisgICAgcmV0dXJuIE9wYyA+PSBCT19Bc3NpZ24gJiYgT3BjIDw9IEJPX09yQXNzaWduOworICB9CisgIGJvb2wgaXNBc3NpZ25tZW50T3AoKSBjb25zdCB7IHJldHVybiBpc0Fzc2lnbm1lbnRPcChnZXRPcGNvZGUoKSk7IH0KKworICBzdGF0aWMgYm9vbCBpc0NvbXBvdW5kQXNzaWdubWVudE9wKE9wY29kZSBPcGMpIHsKKyAgICByZXR1cm4gT3BjID4gQk9fQXNzaWduICYmIE9wYyA8PSBCT19PckFzc2lnbjsKKyAgfQorICBib29sIGlzQ29tcG91bmRBc3NpZ25tZW50T3AoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQ29tcG91bmRBc3NpZ25tZW50T3AoZ2V0T3Bjb2RlKCkpOworICB9CisgIHN0YXRpYyBPcGNvZGUgZ2V0T3BGb3JDb21wb3VuZEFzc2lnbm1lbnQoT3Bjb2RlIE9wYykgeworICAgIGFzc2VydChpc0NvbXBvdW5kQXNzaWdubWVudE9wKE9wYykpOworICAgIGlmIChPcGMgPj0gQk9fQW5kQXNzaWduKQorICAgICAgcmV0dXJuIE9wY29kZSh1bnNpZ25lZChPcGMpIC0gQk9fQW5kQXNzaWduICsgQk9fQW5kKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gT3Bjb2RlKHVuc2lnbmVkKE9wYykgLSBCT19NdWxBc3NpZ24gKyBCT19NdWwpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNTaGlmdEFzc2lnbk9wKE9wY29kZSBPcGMpIHsKKyAgICByZXR1cm4gT3BjID09IEJPX1NobEFzc2lnbiB8fCBPcGMgPT0gQk9fU2hyQXNzaWduOworICB9CisgIGJvb2wgaXNTaGlmdEFzc2lnbk9wKCkgY29uc3QgeworICAgIHJldHVybiBpc1NoaWZ0QXNzaWduT3AoZ2V0T3Bjb2RlKCkpOworICB9CisKKyAgLy8gUmV0dXJuIHRydWUgaWYgYSBiaW5hcnkgb3BlcmF0b3IgdXNpbmcgdGhlIHNwZWNpZmllZCBvcGNvZGUgYW5kIG9wZXJhbmRzCisgIC8vIHdvdWxkIG1hdGNoIHRoZSAncCA9IChpOCopbnVsbHB0ciArIG4nIGlkaW9tIGZvciBjYXN0aW5nIGEgcG9pbnRlci1zaXplZAorICAvLyBpbnRlZ2VyIHRvIGEgcG9pbnRlci4KKyAgc3RhdGljIGJvb2wgaXNOdWxsUG9pbnRlckFyaXRobWV0aWNFeHRlbnNpb24oQVNUQ29udGV4dCAmQ3R4LCBPcGNvZGUgT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpMSFMsIEV4cHIgKlJIUyk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpTKSB7CisgICAgcmV0dXJuIFMtPmdldFN0bXRDbGFzcygpID49IGZpcnN0QmluYXJ5T3BlcmF0b3JDb25zdGFudCAmJgorICAgICAgICAgICBTLT5nZXRTdG10Q2xhc3MoKSA8PSBsYXN0QmluYXJ5T3BlcmF0b3JDb25zdGFudDsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoJlN1YkV4cHJzWzBdLCAmU3ViRXhwcnNbMF0rRU5EX0VYUFIpOworICB9CisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jaGlsZF9yYW5nZSgmU3ViRXhwcnNbMF0sICZTdWJFeHByc1swXSArIEVORF9FWFBSKTsKKyAgfQorCisgIC8vIFNldCB0aGUgRlAgY29udHJhY3RhYmlsaXR5IHN0YXR1cyBvZiB0aGlzIG9wZXJhdG9yLiBPbmx5IG1lYW5pbmdmdWwgZm9yCisgIC8vIG9wZXJhdGlvbnMgb24gZmxvYXRpbmcgcG9pbnQgdHlwZXMuCisgIHZvaWQgc2V0RlBGZWF0dXJlcyhGUE9wdGlvbnMgRikgeyBGUEZlYXR1cmVzID0gRi5nZXRJbnQoKTsgfQorCisgIEZQT3B0aW9ucyBnZXRGUEZlYXR1cmVzKCkgY29uc3QgeyByZXR1cm4gRlBPcHRpb25zKEZQRmVhdHVyZXMpOyB9CisKKyAgLy8gR2V0IHRoZSBGUCBjb250cmFjdGFiaWxpdHkgc3RhdHVzIG9mIHRoaXMgb3BlcmF0b3IuIE9ubHkgbWVhbmluZ2Z1bCBmb3IKKyAgLy8gb3BlcmF0aW9ucyBvbiBmbG9hdGluZyBwb2ludCB0eXBlcy4KKyAgYm9vbCBpc0ZQQ29udHJhY3RhYmxlV2l0aGluU3RhdGVtZW50KCkgY29uc3QgeworICAgIHJldHVybiBGUE9wdGlvbnMoRlBGZWF0dXJlcykuYWxsb3dGUENvbnRyYWN0V2l0aGluU3RhdGVtZW50KCk7CisgIH0KKworcHJvdGVjdGVkOgorICBCaW5hcnlPcGVyYXRvcihFeHByICpsaHMsIEV4cHIgKnJocywgT3Bjb2RlIG9wYywgUXVhbFR5cGUgUmVzVHksCisgICAgICAgICAgICAgICAgIEV4cHJWYWx1ZUtpbmQgVkssIEV4cHJPYmplY3RLaW5kIE9LLAorICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBvcExvYywgRlBPcHRpb25zIEZQRmVhdHVyZXMsIGJvb2wgZGVhZDIpCisgICAgOiBFeHByKENvbXBvdW5kQXNzaWduT3BlcmF0b3JDbGFzcywgUmVzVHksIFZLLCBPSywKKyAgICAgICAgICAgbGhzLT5pc1R5cGVEZXBlbmRlbnQoKSB8fCByaHMtPmlzVHlwZURlcGVuZGVudCgpLAorICAgICAgICAgICBsaHMtPmlzVmFsdWVEZXBlbmRlbnQoKSB8fCByaHMtPmlzVmFsdWVEZXBlbmRlbnQoKSwKKyAgICAgICAgICAgKGxocy0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCkgfHwKKyAgICAgICAgICAgIHJocy0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCkpLAorICAgICAgICAgICAobGhzLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkgfHwKKyAgICAgICAgICAgIHJocy0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSksCisgICAgICBPcGMob3BjKSwgRlBGZWF0dXJlcyhGUEZlYXR1cmVzLmdldEludCgpKSwgT3BMb2Mob3BMb2MpIHsKKyAgICBTdWJFeHByc1tMSFNdID0gbGhzOworICAgIFN1YkV4cHJzW1JIU10gPSByaHM7CisgIH0KKworICBCaW5hcnlPcGVyYXRvcihTdG10Q2xhc3MgU0MsIEVtcHR5U2hlbGwgRW1wdHkpCisgICAgOiBFeHByKFNDLCBFbXB0eSksIE9wYyhCT19NdWxBc3NpZ24pIHsgfQorfTsKKworLy8vIENvbXBvdW5kQXNzaWduT3BlcmF0b3IgLSBGb3IgY29tcG91bmQgYXNzaWdubWVudHMgKGUuZy4gKz0pLCB3ZSBrZWVwCisvLy8gdHJhY2sgb2YgdGhlIHR5cGUgdGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgaW4uICBEdWUgdG8gdGhlIHNlbWFudGljcyBvZgorLy8vIHRoZXNlIG9wZXJhdG9ycywgdGhlIG9wZXJhbmRzIGFyZSBwcm9tb3RlZCwgdGhlIGFyaXRobWV0aWMgcGVyZm9ybWVkLCBhbgorLy8vIGltcGxpY2l0IGNvbnZlcnNpb24gYmFjayB0byB0aGUgcmVzdWx0IHR5cGUgZG9uZSwgdGhlbiB0aGUgYXNzaWdubWVudCB0YWtlcworLy8vIHBsYWNlLiAgVGhpcyBjYXB0dXJlcyB0aGUgaW50ZXJtZWRpYXRlIHR5cGUgd2hpY2ggdGhlIGNvbXB1dGF0aW9uIGlzIGRvbmUKKy8vLyBpbi4KK2NsYXNzIENvbXBvdW5kQXNzaWduT3BlcmF0b3IgOiBwdWJsaWMgQmluYXJ5T3BlcmF0b3IgeworICBRdWFsVHlwZSBDb21wdXRhdGlvbkxIU1R5cGU7CisgIFF1YWxUeXBlIENvbXB1dGF0aW9uUmVzdWx0VHlwZTsKK3B1YmxpYzoKKyAgQ29tcG91bmRBc3NpZ25PcGVyYXRvcihFeHByICpsaHMsIEV4cHIgKnJocywgT3Bjb2RlIG9wYywgUXVhbFR5cGUgUmVzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFeHByVmFsdWVLaW5kIFZLLCBFeHByT2JqZWN0S2luZCBPSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBDb21wTEhTVHlwZSwgUXVhbFR5cGUgQ29tcFJlc3VsdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gT3BMb2MsIEZQT3B0aW9ucyBGUEZlYXR1cmVzKQorICAgIDogQmluYXJ5T3BlcmF0b3IobGhzLCByaHMsIG9wYywgUmVzVHlwZSwgVkssIE9LLCBPcExvYywgRlBGZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgIHRydWUpLAorICAgICAgQ29tcHV0YXRpb25MSFNUeXBlKENvbXBMSFNUeXBlKSwKKyAgICAgIENvbXB1dGF0aW9uUmVzdWx0VHlwZShDb21wUmVzdWx0VHlwZSkgeworICAgIGFzc2VydChpc0NvbXBvdW5kQXNzaWdubWVudE9wKCkgJiYKKyAgICAgICAgICAgIk9ubHkgc2hvdWxkIGJlIHVzZWQgZm9yIGNvbXBvdW5kIGFzc2lnbm1lbnRzIik7CisgIH0KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNvbXBvdW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IgZXhwcmVzc2lvbi4KKyAgZXhwbGljaXQgQ29tcG91bmRBc3NpZ25PcGVyYXRvcihFbXB0eVNoZWxsIEVtcHR5KQorICAgIDogQmluYXJ5T3BlcmF0b3IoQ29tcG91bmRBc3NpZ25PcGVyYXRvckNsYXNzLCBFbXB0eSkgeyB9CisKKyAgLy8gVGhlIHR3byBjb21wdXRhdGlvbiB0eXBlcyBhcmUgdGhlIHR5cGUgdGhlIExIUyBpcyBjb252ZXJ0ZWQKKyAgLy8gdG8gZm9yIHRoZSBjb21wdXRhdGlvbiBhbmQgdGhlIHR5cGUgb2YgdGhlIHJlc3VsdDsgdGhlIHR3byBhcmUKKyAgLy8gZGlzdGluY3QgaW4gYSBmZXcgY2FzZXMgKHNwZWNpZmljYWxseSwgaW50Kz1wdHIgYW5kIHB0ci09cHRyKS4KKyAgUXVhbFR5cGUgZ2V0Q29tcHV0YXRpb25MSFNUeXBlKCkgY29uc3QgeyByZXR1cm4gQ29tcHV0YXRpb25MSFNUeXBlOyB9CisgIHZvaWQgc2V0Q29tcHV0YXRpb25MSFNUeXBlKFF1YWxUeXBlIFQpIHsgQ29tcHV0YXRpb25MSFNUeXBlID0gVDsgfQorCisgIFF1YWxUeXBlIGdldENvbXB1dGF0aW9uUmVzdWx0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIENvbXB1dGF0aW9uUmVzdWx0VHlwZTsgfQorICB2b2lkIHNldENvbXB1dGF0aW9uUmVzdWx0VHlwZShRdWFsVHlwZSBUKSB7IENvbXB1dGF0aW9uUmVzdWx0VHlwZSA9IFQ7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlMpIHsKKyAgICByZXR1cm4gUy0+Z2V0U3RtdENsYXNzKCkgPT0gQ29tcG91bmRBc3NpZ25PcGVyYXRvckNsYXNzOworICB9Cit9OworCisvLy8gQWJzdHJhY3RDb25kaXRpb25hbE9wZXJhdG9yIC0gQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IKKy8vLyBDb25kaXRpb25hbE9wZXJhdG9yIGFuZCBCaW5hcnlDb25kaXRpb25hbE9wZXJhdG9yLgorY2xhc3MgQWJzdHJhY3RDb25kaXRpb25hbE9wZXJhdG9yIDogcHVibGljIEV4cHIgeworICBTb3VyY2VMb2NhdGlvbiBRdWVzdGlvbkxvYywgQ29sb25Mb2M7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCitwcm90ZWN0ZWQ6CisgIEFic3RyYWN0Q29uZGl0aW9uYWxPcGVyYXRvcihTdG10Q2xhc3MgU0MsIFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByVmFsdWVLaW5kIFZLLCBFeHByT2JqZWN0S2luZCBPSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVEQsIGJvb2wgVkQsIGJvb2wgSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBxbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gY2xvYykKKyAgICA6IEV4cHIoU0MsIFQsIFZLLCBPSywgVEQsIFZELCBJRCwgQ29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjayksCisgICAgICBRdWVzdGlvbkxvYyhxbG9jKSwgQ29sb25Mb2MoY2xvYykge30KKworICBBYnN0cmFjdENvbmRpdGlvbmFsT3BlcmF0b3IoU3RtdENsYXNzIFNDLCBFbXB0eVNoZWxsIEVtcHR5KQorICAgIDogRXhwcihTQywgRW1wdHkpIHsgfQorCitwdWJsaWM6CisgIC8vIGdldENvbmQgLSBSZXR1cm4gdGhlIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjb25kaXRpb24gZm9yCisgIC8vICAgdGhlID86IG9wZXJhdG9yLgorICBFeHByICpnZXRDb25kKCkgY29uc3Q7CisKKyAgLy8gZ2V0VHJ1ZUV4cHIgLSBSZXR1cm4gdGhlIHN1YmV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZgorICAvLyAgIHRoZSBleHByZXNzaW9uIGlmIHRoZSBjb25kaXRpb24gZXZhbHVhdGVzIHRvIHRydWUuCisgIEV4cHIgKmdldFRydWVFeHByKCkgY29uc3Q7CisKKyAgLy8gZ2V0RmFsc2VFeHByIC0gUmV0dXJuIHRoZSBzdWJleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YKKyAgLy8gICB0aGUgZXhwcmVzc2lvbiBpZiB0aGUgY29uZGl0aW9uIGV2YWx1YXRlcyB0byBmYWxzZS4gIFRoaXMgaXMKKyAgLy8gICB0aGUgc2FtZSBhcyBnZXRSSFMuCisgIEV4cHIgKmdldEZhbHNlRXhwcigpIGNvbnN0OworCisgIFNvdXJjZUxvY2F0aW9uIGdldFF1ZXN0aW9uTG9jKCkgY29uc3QgeyByZXR1cm4gUXVlc3Rpb25Mb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0Q29sb25Mb2MoKSBjb25zdCB7IHJldHVybiBDb2xvbkxvYzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBDb25kaXRpb25hbE9wZXJhdG9yQ2xhc3MgfHwKKyAgICAgICAgICAgVC0+Z2V0U3RtdENsYXNzKCkgPT0gQmluYXJ5Q29uZGl0aW9uYWxPcGVyYXRvckNsYXNzOworICB9Cit9OworCisvLy8gQ29uZGl0aW9uYWxPcGVyYXRvciAtIFRoZSA/OiB0ZXJuYXJ5IG9wZXJhdG9yLiAgVGhlIEdOVSAibWlzc2luZworLy8vIG1pZGRsZSIgZXh0ZW5zaW9uIGlzIGEgQmluYXJ5Q29uZGl0aW9uYWxPcGVyYXRvci4KK2NsYXNzIENvbmRpdGlvbmFsT3BlcmF0b3IgOiBwdWJsaWMgQWJzdHJhY3RDb25kaXRpb25hbE9wZXJhdG9yIHsKKyAgZW51bSB7IENPTkQsIExIUywgUkhTLCBFTkRfRVhQUiB9OworICBTdG10KiBTdWJFeHByc1tFTkRfRVhQUl07IC8vIExlZnQvTWlkZGxlL1JpZ2h0IGhhbmQgc2lkZXMuCisKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CitwdWJsaWM6CisgIENvbmRpdGlvbmFsT3BlcmF0b3IoRXhwciAqY29uZCwgU291cmNlTG9jYXRpb24gUUxvYywgRXhwciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENMb2MsIEV4cHIgKnJocywKKyAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSB0LCBFeHByVmFsdWVLaW5kIFZLLCBFeHByT2JqZWN0S2luZCBPSykKKyAgICA6IEFic3RyYWN0Q29uZGl0aW9uYWxPcGVyYXRvcihDb25kaXRpb25hbE9wZXJhdG9yQ2xhc3MsIHQsIFZLLCBPSywKKyAgICAgICAgICAgLy8gRklYTUU6IHRoZSB0eXBlIG9mIHRoZSBjb25kaXRpb25hbCBvcGVyYXRvciBkb2Vzbid0CisgICAgICAgICAgIC8vIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiB0aGUgY29uZGl0aW9uYWwsIGJ1dCB0aGUgc3RhbmRhcmQKKyAgICAgICAgICAgLy8gc2VlbXMgdG8gaW1wbHkgdGhhdCBpdCBjb3VsZC4gRmlsZSBhIGJ1ZyEKKyAgICAgICAgICAgKGxocy0+aXNUeXBlRGVwZW5kZW50KCkgfHwgcmhzLT5pc1R5cGVEZXBlbmRlbnQoKSksCisgICAgICAgICAgIChjb25kLT5pc1ZhbHVlRGVwZW5kZW50KCkgfHwgbGhzLT5pc1ZhbHVlRGVwZW5kZW50KCkgfHwKKyAgICAgICAgICAgIHJocy0+aXNWYWx1ZURlcGVuZGVudCgpKSwKKyAgICAgICAgICAgKGNvbmQtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpIHx8CisgICAgICAgICAgICBsaHMtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpIHx8CisgICAgICAgICAgICByaHMtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpKSwKKyAgICAgICAgICAgKGNvbmQtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSB8fAorICAgICAgICAgICAgbGhzLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkgfHwKKyAgICAgICAgICAgIHJocy0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTG9jLCBDTG9jKSB7CisgICAgU3ViRXhwcnNbQ09ORF0gPSBjb25kOworICAgIFN1YkV4cHJzW0xIU10gPSBsaHM7CisgICAgU3ViRXhwcnNbUkhTXSA9IHJoczsKKyAgfQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY29uZGl0aW9uYWwgb3BlcmF0b3IuCisgIGV4cGxpY2l0IENvbmRpdGlvbmFsT3BlcmF0b3IoRW1wdHlTaGVsbCBFbXB0eSkKKyAgICA6IEFic3RyYWN0Q29uZGl0aW9uYWxPcGVyYXRvcihDb25kaXRpb25hbE9wZXJhdG9yQ2xhc3MsIEVtcHR5KSB7IH0KKworICAvLyBnZXRDb25kIC0gUmV0dXJuIHRoZSBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29uZGl0aW9uIGZvcgorICAvLyAgIHRoZSA/OiBvcGVyYXRvci4KKyAgRXhwciAqZ2V0Q29uZCgpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8RXhwcj4oU3ViRXhwcnNbQ09ORF0pOyB9CisKKyAgLy8gZ2V0VHJ1ZUV4cHIgLSBSZXR1cm4gdGhlIHN1YmV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZgorICAvLyAgIHRoZSBleHByZXNzaW9uIGlmIHRoZSBjb25kaXRpb24gZXZhbHVhdGVzIHRvIHRydWUuCisgIEV4cHIgKmdldFRydWVFeHByKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByc1tMSFNdKTsgfQorCisgIC8vIGdldEZhbHNlRXhwciAtIFJldHVybiB0aGUgc3ViZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mCisgIC8vICAgdGhlIGV4cHJlc3Npb24gaWYgdGhlIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gZmFsc2UuICBUaGlzIGlzCisgIC8vICAgdGhlIHNhbWUgYXMgZ2V0UkhTLgorICBFeHByICpnZXRGYWxzZUV4cHIoKSBjb25zdCB7IHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHJzW1JIU10pOyB9CisKKyAgRXhwciAqZ2V0TEhTKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByc1tMSFNdKTsgfQorICBFeHByICpnZXRSSFMoKSBjb25zdCB7IHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHJzW1JIU10pOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gZ2V0Q29uZCgpLT5nZXRMb2NTdGFydCgpOworICB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBnZXRSSFMoKS0+Z2V0TG9jRW5kKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ29uZGl0aW9uYWxPcGVyYXRvckNsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZSgmU3ViRXhwcnNbMF0sICZTdWJFeHByc1swXStFTkRfRVhQUik7CisgIH0KKyAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKCZTdWJFeHByc1swXSwgJlN1YkV4cHJzWzBdICsgRU5EX0VYUFIpOworICB9Cit9OworCisvLy8gQmluYXJ5Q29uZGl0aW9uYWxPcGVyYXRvciAtIFRoZSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBjb25kaXRpb25hbAorLy8vIG9wZXJhdG9yIHdoaWNoIGFsbG93cyB0aGUgbWlkZGxlIG9wZXJhbmQgdG8gYmUgb21pdHRlZC4KKy8vLworLy8vIFRoaXMgaXMgYSBkaWZmZXJlbnQgZXhwcmVzc2lvbiBraW5kIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgYWxtb3N0CisvLy8gZXZlcnkgY2xpZW50IGVuZHMgdXAgbmVlZGluZyB0byBrbm93IHRoYXQgdGhlc2UgYXJlIGRpZmZlcmVudC4KK2NsYXNzIEJpbmFyeUNvbmRpdGlvbmFsT3BlcmF0b3IgOiBwdWJsaWMgQWJzdHJhY3RDb25kaXRpb25hbE9wZXJhdG9yIHsKKyAgZW51bSB7IENPTU1PTiwgQ09ORCwgTEhTLCBSSFMsIE5VTV9TVUJFWFBSUyB9OworCisgIC8vLyAtIHRoZSBjb21tb24gY29uZGl0aW9uL2xlZnQtaGFuZC1zaWRlIGV4cHJlc3Npb24sIHdoaWNoIHdpbGwgYmUKKyAgLy8vICAgZXZhbHVhdGVkIGFzIHRoZSBvcGFxdWUgdmFsdWUKKyAgLy8vIC0gdGhlIGNvbmRpdGlvbiwgZXhwcmVzc2VkIGluIHRlcm1zIG9mIHRoZSBvcGFxdWUgdmFsdWUKKyAgLy8vIC0gdGhlIGxlZnQtaGFuZC1zaWRlLCBleHByZXNzZWQgaW4gdGVybXMgb2YgdGhlIG9wYXF1ZSB2YWx1ZQorICAvLy8gLSB0aGUgcmlnaHQtaGFuZC1zaWRlCisgIFN0bXQgKlN1YkV4cHJzW05VTV9TVUJFWFBSU107CisgIE9wYXF1ZVZhbHVlRXhwciAqT3BhcXVlVmFsdWU7CisKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CitwdWJsaWM6CisgIEJpbmFyeUNvbmRpdGlvbmFsT3BlcmF0b3IoRXhwciAqY29tbW9uLCBPcGFxdWVWYWx1ZUV4cHIgKm9wYXF1ZVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKmNvbmQsIEV4cHIgKmxocywgRXhwciAqcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIHFsb2MsIFNvdXJjZUxvY2F0aW9uIGNsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgdCwgRXhwclZhbHVlS2luZCBWSywgRXhwck9iamVjdEtpbmQgT0spCisgICAgOiBBYnN0cmFjdENvbmRpdGlvbmFsT3BlcmF0b3IoQmluYXJ5Q29uZGl0aW9uYWxPcGVyYXRvckNsYXNzLCB0LCBWSywgT0ssCisgICAgICAgICAgIChjb21tb24tPmlzVHlwZURlcGVuZGVudCgpIHx8IHJocy0+aXNUeXBlRGVwZW5kZW50KCkpLAorICAgICAgICAgICAoY29tbW9uLT5pc1ZhbHVlRGVwZW5kZW50KCkgfHwgcmhzLT5pc1ZhbHVlRGVwZW5kZW50KCkpLAorICAgICAgICAgICAoY29tbW9uLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnQoKSB8fAorICAgICAgICAgICAgcmhzLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnQoKSksCisgICAgICAgICAgIChjb21tb24tPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSB8fAorICAgICAgICAgICAgcmhzLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFsb2MsIGNsb2MpLAorICAgICAgT3BhcXVlVmFsdWUob3BhcXVlVmFsdWUpIHsKKyAgICBTdWJFeHByc1tDT01NT05dID0gY29tbW9uOworICAgIFN1YkV4cHJzW0NPTkRdID0gY29uZDsKKyAgICBTdWJFeHByc1tMSFNdID0gbGhzOworICAgIFN1YkV4cHJzW1JIU10gPSByaHM7CisgICAgYXNzZXJ0KE9wYXF1ZVZhbHVlLT5nZXRTb3VyY2VFeHByKCkgPT0gY29tbW9uICYmICJXcm9uZyBvcGFxdWUgdmFsdWUiKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY29uZGl0aW9uYWwgb3BlcmF0b3IuCisgIGV4cGxpY2l0IEJpbmFyeUNvbmRpdGlvbmFsT3BlcmF0b3IoRW1wdHlTaGVsbCBFbXB0eSkKKyAgICA6IEFic3RyYWN0Q29uZGl0aW9uYWxPcGVyYXRvcihCaW5hcnlDb25kaXRpb25hbE9wZXJhdG9yQ2xhc3MsIEVtcHR5KSB7IH0KKworICAvLy8gXGJyaWVmIGdldENvbW1vbiAtIFJldHVybiB0aGUgY29tbW9uIGV4cHJlc3Npb24sIHdyaXR0ZW4gdG8gdGhlCisgIC8vLyAgIGxlZnQgb2YgdGhlIGNvbmRpdGlvbi4gIFRoZSBvcGFxdWUgdmFsdWUgd2lsbCBiZSBib3VuZCB0byB0aGUKKyAgLy8vICAgcmVzdWx0IG9mIHRoaXMgZXhwcmVzc2lvbi4KKyAgRXhwciAqZ2V0Q29tbW9uKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByc1tDT01NT05dKTsgfQorCisgIC8vLyBcYnJpZWYgZ2V0T3BhcXVlVmFsdWUgLSBSZXR1cm4gdGhlIG9wYXF1ZSB2YWx1ZSBwbGFjZWhvbGRlci4KKyAgT3BhcXVlVmFsdWVFeHByICpnZXRPcGFxdWVWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIE9wYXF1ZVZhbHVlOyB9CisKKyAgLy8vIFxicmllZiBnZXRDb25kIC0gUmV0dXJuIHRoZSBjb25kaXRpb24gZXhwcmVzc2lvbjsgdGhpcyBpcyBkZWZpbmVkCisgIC8vLyAgIGluIHRlcm1zIG9mIHRoZSBvcGFxdWUgdmFsdWUuCisgIEV4cHIgKmdldENvbmQoKSBjb25zdCB7IHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHJzW0NPTkRdKTsgfQorCisgIC8vLyBcYnJpZWYgZ2V0VHJ1ZUV4cHIgLSBSZXR1cm4gdGhlIHN1YmV4cHJlc3Npb24gd2hpY2ggd2lsbCBiZQorICAvLy8gICBldmFsdWF0ZWQgaWYgdGhlIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZTsgIHRoaXMgaXMgZGVmaW5lZAorICAvLy8gICBpbiB0ZXJtcyBvZiB0aGUgb3BhcXVlIHZhbHVlLgorICBFeHByICpnZXRUcnVlRXhwcigpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByc1tMSFNdKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgZ2V0RmFsc2VFeHByIC0gUmV0dXJuIHRoZSBzdWJleHByZXNzaW9uIHdoaWNoIHdpbGwgYmUKKyAgLy8vICAgZXZhbHVhdGVkIGlmIHRoZSBjb25kbml0aW9uIGV2YWx1YXRlcyB0byBmYWxzZTsgdGhpcyBpcworICAvLy8gICBkZWZpbmVkIGluIHRlcm1zIG9mIHRoZSBvcGFxdWUgdmFsdWUuCisgIEV4cHIgKmdldEZhbHNlRXhwcigpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByc1tSSFNdKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGdldENvbW1vbigpLT5nZXRMb2NTdGFydCgpOworICB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBnZXRGYWxzZUV4cHIoKS0+Z2V0TG9jRW5kKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQmluYXJ5Q29uZGl0aW9uYWxPcGVyYXRvckNsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShTdWJFeHBycywgU3ViRXhwcnMgKyBOVU1fU1VCRVhQUlMpOworICB9CisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jaGlsZF9yYW5nZShTdWJFeHBycywgU3ViRXhwcnMgKyBOVU1fU1VCRVhQUlMpOworICB9Cit9OworCitpbmxpbmUgRXhwciAqQWJzdHJhY3RDb25kaXRpb25hbE9wZXJhdG9yOjpnZXRDb25kKCkgY29uc3QgeworICBpZiAoY29uc3QgQ29uZGl0aW9uYWxPcGVyYXRvciAqY28gPSBkeW5fY2FzdDxDb25kaXRpb25hbE9wZXJhdG9yPih0aGlzKSkKKyAgICByZXR1cm4gY28tPmdldENvbmQoKTsKKyAgcmV0dXJuIGNhc3Q8QmluYXJ5Q29uZGl0aW9uYWxPcGVyYXRvcj4odGhpcyktPmdldENvbmQoKTsKK30KKworaW5saW5lIEV4cHIgKkFic3RyYWN0Q29uZGl0aW9uYWxPcGVyYXRvcjo6Z2V0VHJ1ZUV4cHIoKSBjb25zdCB7CisgIGlmIChjb25zdCBDb25kaXRpb25hbE9wZXJhdG9yICpjbyA9IGR5bl9jYXN0PENvbmRpdGlvbmFsT3BlcmF0b3I+KHRoaXMpKQorICAgIHJldHVybiBjby0+Z2V0VHJ1ZUV4cHIoKTsKKyAgcmV0dXJuIGNhc3Q8QmluYXJ5Q29uZGl0aW9uYWxPcGVyYXRvcj4odGhpcyktPmdldFRydWVFeHByKCk7Cit9CisKK2lubGluZSBFeHByICpBYnN0cmFjdENvbmRpdGlvbmFsT3BlcmF0b3I6OmdldEZhbHNlRXhwcigpIGNvbnN0IHsKKyAgaWYgKGNvbnN0IENvbmRpdGlvbmFsT3BlcmF0b3IgKmNvID0gZHluX2Nhc3Q8Q29uZGl0aW9uYWxPcGVyYXRvcj4odGhpcykpCisgICAgcmV0dXJuIGNvLT5nZXRGYWxzZUV4cHIoKTsKKyAgcmV0dXJuIGNhc3Q8QmluYXJ5Q29uZGl0aW9uYWxPcGVyYXRvcj4odGhpcyktPmdldEZhbHNlRXhwcigpOworfQorCisvLy8gQWRkckxhYmVsRXhwciAtIFRoZSBHTlUgYWRkcmVzcyBvZiBsYWJlbCBleHRlbnNpb24sIHJlcHJlc2VudGluZyAmJmxhYmVsLgorY2xhc3MgQWRkckxhYmVsRXhwciA6IHB1YmxpYyBFeHByIHsKKyAgU291cmNlTG9jYXRpb24gQW1wQW1wTG9jLCBMYWJlbExvYzsKKyAgTGFiZWxEZWNsICpMYWJlbDsKK3B1YmxpYzoKKyAgQWRkckxhYmVsRXhwcihTb3VyY2VMb2NhdGlvbiBBQUxvYywgU291cmNlTG9jYXRpb24gTExvYywgTGFiZWxEZWNsICpMLAorICAgICAgICAgICAgICAgIFF1YWxUeXBlIHQpCisgICAgOiBFeHByKEFkZHJMYWJlbEV4cHJDbGFzcywgdCwgVktfUlZhbHVlLCBPS19PcmRpbmFyeSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgZmFsc2UpLAorICAgICAgQW1wQW1wTG9jKEFBTG9jKSwgTGFiZWxMb2MoTExvYyksIExhYmVsKEwpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBhZGRyZXNzIG9mIGEgbGFiZWwgZXhwcmVzc2lvbi4KKyAgZXhwbGljaXQgQWRkckxhYmVsRXhwcihFbXB0eVNoZWxsIEVtcHR5KQorICAgIDogRXhwcihBZGRyTGFiZWxFeHByQ2xhc3MsIEVtcHR5KSB7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRBbXBBbXBMb2MoKSBjb25zdCB7IHJldHVybiBBbXBBbXBMb2M7IH0KKyAgdm9pZCBzZXRBbXBBbXBMb2MoU291cmNlTG9jYXRpb24gTCkgeyBBbXBBbXBMb2MgPSBMOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExhYmVsTG9jKCkgY29uc3QgeyByZXR1cm4gTGFiZWxMb2M7IH0KKyAgdm9pZCBzZXRMYWJlbExvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IExhYmVsTG9jID0gTDsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBBbXBBbXBMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMYWJlbExvYzsgfQorCisgIExhYmVsRGVjbCAqZ2V0TGFiZWwoKSBjb25zdCB7IHJldHVybiBMYWJlbDsgfQorICB2b2lkIHNldExhYmVsKExhYmVsRGVjbCAqTCkgeyBMYWJlbCA9IEw7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQWRkckxhYmVsRXhwckNsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorICBjb25zdF9jaGlsZF9yYW5nZSBjaGlsZHJlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2hpbGRfcmFuZ2UoY29uc3RfY2hpbGRfaXRlcmF0b3IoKSwgY29uc3RfY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KK307CisKKy8vLyBTdG10RXhwciAtIFRoaXMgaXMgdGhlIEdOVSBTdGF0ZW1lbnQgRXhwcmVzc2lvbiBleHRlbnNpb246ICh7aW50IFg9NDsgWDt9KS4KKy8vLyBUaGUgU3RtdEV4cHIgY29udGFpbnMgYSBzaW5nbGUgQ29tcG91bmRTdG10IG5vZGUsIHdoaWNoIGl0IGV2YWx1YXRlcyBhbmQKKy8vLyB0YWtlcyB0aGUgdmFsdWUgb2YgdGhlIGxhc3Qgc3ViZXhwcmVzc2lvbi4KKy8vLworLy8vIEEgU3RtdEV4cHIgaXMgYWx3YXlzIGFuIHItdmFsdWU7IHZhbHVlcyAicmV0dXJuZWQiIG91dCBvZiBhCisvLy8gU3RtdEV4cHIgd2lsbCBiZSBjb3BpZWQuCitjbGFzcyBTdG10RXhwciA6IHB1YmxpYyBFeHByIHsKKyAgU3RtdCAqU3ViU3RtdDsKKyAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLCBSUGFyZW5Mb2M7CitwdWJsaWM6CisgIC8vIEZJWE1FOiBEb2VzIHR5cGUtZGVwZW5kZW5jZSBuZWVkIHRvIGJlIGNvbXB1dGVkIGRpZmZlcmVudGx5PworICAvLyBGSVhNRTogRG8gd2UgbmVlZCB0byBjb21wdXRlIGluc3RhbnRpYXRpb24gaW5zdGFudGlhdGlvbi1kZXBlbmRlbmNlIGZvcgorICAvLyBzdGF0ZW1lbnRzPyAodWdoISkKKyAgU3RtdEV4cHIoQ29tcG91bmRTdG10ICpzdWJzdG10LCBRdWFsVHlwZSBULAorICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBscCwgU291cmNlTG9jYXRpb24gcnApIDoKKyAgICBFeHByKFN0bXRFeHByQ2xhc3MsIFQsIFZLX1JWYWx1ZSwgT0tfT3JkaW5hcnksCisgICAgICAgICBULT5pc0RlcGVuZGVudFR5cGUoKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgU3ViU3RtdChzdWJzdG10KSwgTFBhcmVuTG9jKGxwKSwgUlBhcmVuTG9jKHJwKSB7IH0KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IHN0YXRlbWVudCBleHByZXNzaW9uLgorICBleHBsaWNpdCBTdG10RXhwcihFbXB0eVNoZWxsIEVtcHR5KSA6IEV4cHIoU3RtdEV4cHJDbGFzcywgRW1wdHkpIHsgfQorCisgIENvbXBvdW5kU3RtdCAqZ2V0U3ViU3RtdCgpIHsgcmV0dXJuIGNhc3Q8Q29tcG91bmRTdG10PihTdWJTdG10KTsgfQorICBjb25zdCBDb21wb3VuZFN0bXQgKmdldFN1YlN0bXQoKSBjb25zdCB7IHJldHVybiBjYXN0PENvbXBvdW5kU3RtdD4oU3ViU3RtdCk7IH0KKyAgdm9pZCBzZXRTdWJTdG10KENvbXBvdW5kU3RtdCAqUykgeyBTdWJTdG10ID0gUzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMUGFyZW5Mb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBMUGFyZW5Mb2M7IH0KKyAgdm9pZCBzZXRMUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTCkgeyBMUGFyZW5Mb2MgPSBMOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldFJQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIFJQYXJlbkxvYzsgfQorICB2b2lkIHNldFJQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IFJQYXJlbkxvYyA9IEw7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gU3RtdEV4cHJDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsgcmV0dXJuIGNoaWxkX3JhbmdlKCZTdWJTdG10LCAmU3ViU3RtdCsxKTsgfQorICBjb25zdF9jaGlsZF9yYW5nZSBjaGlsZHJlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2hpbGRfcmFuZ2UoJlN1YlN0bXQsICZTdWJTdG10ICsgMSk7CisgIH0KK307CisKKy8vLyBTaHVmZmxlVmVjdG9yRXhwciAtIGNsYW5nLXNwZWNpZmljIGJ1aWx0aW4taW4gZnVuY3Rpb24KKy8vLyBfX2J1aWx0aW5fc2h1ZmZsZXZlY3Rvci4KKy8vLyBUaGlzIEFTVCBub2RlIHJlcHJlc2VudHMgYSBvcGVyYXRvciB0aGF0IGRvZXMgYSBjb25zdGFudAorLy8vIHNodWZmbGUsIHNpbWlsYXIgdG8gTExWTSdzIHNodWZmbGV2ZWN0b3IgaW5zdHJ1Y3Rpb24uIEl0IHRha2VzCisvLy8gdHdvIHZlY3RvcnMgYW5kIGEgdmFyaWFibGUgbnVtYmVyIG9mIGNvbnN0YW50IGluZGljZXMsCisvLy8gYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlbHkgc2h1ZmZsZWQgdmVjdG9yLgorY2xhc3MgU2h1ZmZsZVZlY3RvckV4cHIgOiBwdWJsaWMgRXhwciB7CisgIFNvdXJjZUxvY2F0aW9uIEJ1aWx0aW5Mb2MsIFJQYXJlbkxvYzsKKworICAvLyBTdWJFeHBycyAtIHRoZSBsaXN0IG9mIHZhbHVlcyBwYXNzZWQgdG8gdGhlIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yCisgIC8vIGZ1bmN0aW9uLiBUaGUgZmlyc3QgdHdvIGFyZSB2ZWN0b3JzLCBhbmQgdGhlIHJlc3QgYXJlIGNvbnN0YW50CisgIC8vIGluZGljZXMuICBUaGUgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGlzIGxpc3QgaXMgYWx3YXlzCisgIC8vIDIrdGhlIG51bWJlciBvZiBpbmRpY2VzIGluIHRoZSB2ZWN0b3IgdHlwZS4KKyAgU3RtdCAqKlN1YkV4cHJzOworICB1bnNpZ25lZCBOdW1FeHByczsKKworcHVibGljOgorICBTaHVmZmxlVmVjdG9yRXhwcihjb25zdCBBU1RDb250ZXh0ICZDLCBBcnJheVJlZjxFeHByKj4gYXJncywgUXVhbFR5cGUgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQkxvYywgU291cmNlTG9jYXRpb24gUlApOworCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgdmVjdG9yLXNodWZmbGUgZXhwcmVzc2lvbi4KKyAgZXhwbGljaXQgU2h1ZmZsZVZlY3RvckV4cHIoRW1wdHlTaGVsbCBFbXB0eSkKKyAgICA6IEV4cHIoU2h1ZmZsZVZlY3RvckV4cHJDbGFzcywgRW1wdHkpLCBTdWJFeHBycyhudWxscHRyKSB7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRCdWlsdGluTG9jKCkgY29uc3QgeyByZXR1cm4gQnVpbHRpbkxvYzsgfQorICB2b2lkIHNldEJ1aWx0aW5Mb2MoU291cmNlTG9jYXRpb24gTCkgeyBCdWlsdGluTG9jID0gTDsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFJQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIFJQYXJlbkxvYzsgfQorICB2b2lkIHNldFJQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IFJQYXJlbkxvYyA9IEw7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gQnVpbHRpbkxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJQYXJlbkxvYzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBTaHVmZmxlVmVjdG9yRXhwckNsYXNzOworICB9CisKKyAgLy8vIGdldE51bVN1YkV4cHJzIC0gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBTdWJFeHBycyBhcnJheS4gIFRoaXMgaW5jbHVkZXMgdGhlCisgIC8vLyBjb25zdGFudCBleHByZXNzaW9uLCB0aGUgYWN0dWFsIGFyZ3VtZW50cyBwYXNzZWQgaW4sIGFuZCB0aGUgZnVuY3Rpb24KKyAgLy8vIHBvaW50ZXJzLgorICB1bnNpZ25lZCBnZXROdW1TdWJFeHBycygpIGNvbnN0IHsgcmV0dXJuIE51bUV4cHJzOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgYXJyYXkgb2YgZXhwcmVzc2lvbnMuCisgIEV4cHIgKipnZXRTdWJFeHBycygpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwciAqKj4oU3ViRXhwcnMpOyB9CisKKyAgLy8vIGdldEV4cHIgLSBSZXR1cm4gdGhlIEV4cHIgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgRXhwciAqZ2V0RXhwcih1bnNpZ25lZCBJbmRleCkgeworICAgIGFzc2VydCgoSW5kZXggPCBOdW1FeHBycykgJiYgIkFyZyBhY2Nlc3Mgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHJzW0luZGV4XSk7CisgIH0KKyAgY29uc3QgRXhwciAqZ2V0RXhwcih1bnNpZ25lZCBJbmRleCkgY29uc3QgeworICAgIGFzc2VydCgoSW5kZXggPCBOdW1FeHBycykgJiYgIkFyZyBhY2Nlc3Mgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHJzW0luZGV4XSk7CisgIH0KKworICB2b2lkIHNldEV4cHJzKGNvbnN0IEFTVENvbnRleHQgJkMsIEFycmF5UmVmPEV4cHIgKj4gRXhwcnMpOworCisgIGxsdm06OkFQU0ludCBnZXRTaHVmZmxlTWFza0lkeChjb25zdCBBU1RDb250ZXh0ICZDdHgsIHVuc2lnbmVkIE4pIGNvbnN0IHsKKyAgICBhc3NlcnQoKE4gPCBOdW1FeHBycyAtIDIpICYmICJTaHVmZmxlIGlkeCBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGdldEV4cHIoTisyKS0+RXZhbHVhdGVLbm93bkNvbnN0SW50KEN0eCk7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKCZTdWJFeHByc1swXSwgJlN1YkV4cHJzWzBdK051bUV4cHJzKTsKKyAgfQorICBjb25zdF9jaGlsZF9yYW5nZSBjaGlsZHJlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2hpbGRfcmFuZ2UoJlN1YkV4cHJzWzBdLCAmU3ViRXhwcnNbMF0gKyBOdW1FeHBycyk7CisgIH0KK307CisKKy8vLyBDb252ZXJ0VmVjdG9yRXhwciAtIENsYW5nIGJ1aWx0aW4gZnVuY3Rpb24gX19idWlsdGluX2NvbnZlcnR2ZWN0b3IKKy8vLyBUaGlzIEFTVCBub2RlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGNvbnZlcnRpbmcgYSB2ZWN0b3IgdHlwZSB0byBhbm90aGVyCisvLy8gdmVjdG9yIHR5cGUgb2YgdGhlIHNhbWUgYXJpdHkuCitjbGFzcyBDb252ZXJ0VmVjdG9yRXhwciA6IHB1YmxpYyBFeHByIHsKK3ByaXZhdGU6CisgIFN0bXQgKlNyY0V4cHI7CisgIFR5cGVTb3VyY2VJbmZvICpUSW5mbzsKKyAgU291cmNlTG9jYXRpb24gQnVpbHRpbkxvYywgUlBhcmVuTG9jOworCisgIGZyaWVuZCBjbGFzcyBBU1RSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICBleHBsaWNpdCBDb252ZXJ0VmVjdG9yRXhwcihFbXB0eVNoZWxsIEVtcHR5KSA6IEV4cHIoQ29udmVydFZlY3RvckV4cHJDbGFzcywgRW1wdHkpIHt9CisKK3B1YmxpYzoKKyAgQ29udmVydFZlY3RvckV4cHIoRXhwciogU3JjRXhwciwgVHlwZVNvdXJjZUluZm8gKlRJLCBRdWFsVHlwZSBEc3RUeXBlLAorICAgICAgICAgICAgIEV4cHJWYWx1ZUtpbmQgVkssIEV4cHJPYmplY3RLaW5kIE9LLAorICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEJ1aWx0aW5Mb2MsIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYykKKyAgICA6IEV4cHIoQ29udmVydFZlY3RvckV4cHJDbGFzcywgRHN0VHlwZSwgVkssIE9LLAorICAgICAgICAgICBEc3RUeXBlLT5pc0RlcGVuZGVudFR5cGUoKSwKKyAgICAgICAgICAgRHN0VHlwZS0+aXNEZXBlbmRlbnRUeXBlKCkgfHwgU3JjRXhwci0+aXNWYWx1ZURlcGVuZGVudCgpLAorICAgICAgICAgICAoRHN0VHlwZS0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpIHx8CisgICAgICAgICAgICBTcmNFeHByLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnQoKSksCisgICAgICAgICAgIChEc3RUeXBlLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkgfHwKKyAgICAgICAgICAgIFNyY0V4cHItPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSkpLAorICBTcmNFeHByKFNyY0V4cHIpLCBUSW5mbyhUSSksIEJ1aWx0aW5Mb2MoQnVpbHRpbkxvYyksIFJQYXJlbkxvYyhSUGFyZW5Mb2MpIHt9CisKKyAgLy8vIGdldFNyY0V4cHIgLSBSZXR1cm4gdGhlIEV4cHIgdG8gYmUgY29udmVydGVkLgorICBFeHByICpnZXRTcmNFeHByKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihTcmNFeHByKTsgfQorCisgIC8vLyBnZXRUeXBlU291cmNlSW5mbyAtIFJldHVybiB0aGUgZGVzdGluYXRpb24gdHlwZS4KKyAgVHlwZVNvdXJjZUluZm8gKmdldFR5cGVTb3VyY2VJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBUSW5mbzsKKyAgfQorICB2b2lkIHNldFR5cGVTb3VyY2VJbmZvKFR5cGVTb3VyY2VJbmZvICp0aSkgeworICAgIFRJbmZvID0gdGk7CisgIH0KKworICAvLy8gZ2V0QnVpbHRpbkxvYyAtIFJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIF9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yIHRva2VuLgorICBTb3VyY2VMb2NhdGlvbiBnZXRCdWlsdGluTG9jKCkgY29uc3QgeyByZXR1cm4gQnVpbHRpbkxvYzsgfQorCisgIC8vLyBnZXRSUGFyZW5Mb2MgLSBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIGZpbmFsIHJpZ2h0IHBhcmVudGhlc2lzLgorICBTb3VyY2VMb2NhdGlvbiBnZXRSUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gQnVpbHRpbkxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJQYXJlbkxvYzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBDb252ZXJ0VmVjdG9yRXhwckNsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoJlNyY0V4cHIsICZTcmNFeHByKzEpOyB9CisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jaGlsZF9yYW5nZSgmU3JjRXhwciwgJlNyY0V4cHIgKyAxKTsKKyAgfQorfTsKKworLy8vIENob29zZUV4cHIgLSBHTlUgYnVpbHRpbi1pbiBmdW5jdGlvbiBfX2J1aWx0aW5fY2hvb3NlX2V4cHIuCisvLy8gVGhpcyBBU1Qgbm9kZSBpcyBzaW1pbGFyIHRvIHRoZSBjb25kaXRpb25hbCBvcGVyYXRvciAoPzopIGluIEMsIHdpdGgKKy8vLyB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbnM6CisvLy8gLSB0aGUgdGVzdCBleHByZXNzaW9uIG11c3QgYmUgYSBpbnRlZ2VyIGNvbnN0YW50IGV4cHJlc3Npb24uCisvLy8gLSB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBhY3RzIGxpa2UgdGhlIGNob3NlbiBzdWJleHByZXNzaW9uIGluIGV2ZXJ5CisvLy8gICB2aXNpYmxlIHdheTogdGhlIHR5cGUgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgY2hvc2VuIHN1YmV4cHJlc3Npb24sCisvLy8gICBhbmQgYWxsIHByZWRpY2F0ZXMgKHdoZXRoZXIgaXQncyBhbiBsLXZhbHVlLCB3aGV0aGVyIGl0J3MgYW4gaW50ZWdlcgorLy8vICAgY29uc3RhbnQgZXhwcmVzc2lvbiwgZXRjLikgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBhcyBmb3IgdGhlIGNob3NlbgorLy8vICAgc3ViLWV4cHJlc3Npb24uCitjbGFzcyBDaG9vc2VFeHByIDogcHVibGljIEV4cHIgeworICBlbnVtIHsgQ09ORCwgTEhTLCBSSFMsIEVORF9FWFBSIH07CisgIFN0bXQqIFN1YkV4cHJzW0VORF9FWFBSXTsgLy8gTGVmdC9NaWRkbGUvUmlnaHQgaGFuZCBzaWRlcy4KKyAgU291cmNlTG9jYXRpb24gQnVpbHRpbkxvYywgUlBhcmVuTG9jOworICBib29sIENvbmRJc1RydWU7CitwdWJsaWM6CisgIENob29zZUV4cHIoU291cmNlTG9jYXRpb24gQkxvYywgRXhwciAqY29uZCwgRXhwciAqbGhzLCBFeHByICpyaHMsCisgICAgICAgICAgICAgUXVhbFR5cGUgdCwgRXhwclZhbHVlS2luZCBWSywgRXhwck9iamVjdEtpbmQgT0ssCisgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlAsIGJvb2wgY29uZElzVHJ1ZSwKKyAgICAgICAgICAgICBib29sIFR5cGVEZXBlbmRlbnQsIGJvb2wgVmFsdWVEZXBlbmRlbnQpCisgICAgOiBFeHByKENob29zZUV4cHJDbGFzcywgdCwgVkssIE9LLCBUeXBlRGVwZW5kZW50LCBWYWx1ZURlcGVuZGVudCwKKyAgICAgICAgICAgKGNvbmQtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpIHx8CisgICAgICAgICAgICBsaHMtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpIHx8CisgICAgICAgICAgICByaHMtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpKSwKKyAgICAgICAgICAgKGNvbmQtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSB8fAorICAgICAgICAgICAgbGhzLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkgfHwKKyAgICAgICAgICAgIHJocy0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSksCisgICAgICBCdWlsdGluTG9jKEJMb2MpLCBSUGFyZW5Mb2MoUlApLCBDb25kSXNUcnVlKGNvbmRJc1RydWUpIHsKKyAgICAgIFN1YkV4cHJzW0NPTkRdID0gY29uZDsKKyAgICAgIFN1YkV4cHJzW0xIU10gPSBsaHM7CisgICAgICBTdWJFeHByc1tSSFNdID0gcmhzOworICAgIH0KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IF9fYnVpbHRpbl9jaG9vc2VfZXhwci4KKyAgZXhwbGljaXQgQ2hvb3NlRXhwcihFbXB0eVNoZWxsIEVtcHR5KSA6IEV4cHIoQ2hvb3NlRXhwckNsYXNzLCBFbXB0eSkgeyB9CisKKyAgLy8vIGlzQ29uZGl0aW9uVHJ1ZSAtIFJldHVybiB3aGV0aGVyIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSAoaS5lLiBub3QKKyAgLy8vIGVxdWFsIHRvIHplcm8pLgorICBib29sIGlzQ29uZGl0aW9uVHJ1ZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzQ29uZGl0aW9uRGVwZW5kZW50KCkgJiYKKyAgICAgICAgICAgIkRlcGVuZGVudCBjb25kaXRpb24gaXNuJ3QgdHJ1ZSBvciBmYWxzZSIpOworICAgIHJldHVybiBDb25kSXNUcnVlOworICB9CisgIHZvaWQgc2V0SXNDb25kaXRpb25UcnVlKGJvb2wgaXNUcnVlKSB7IENvbmRJc1RydWUgPSBpc1RydWU7IH0KKworICBib29sIGlzQ29uZGl0aW9uRGVwZW5kZW50KCkgY29uc3QgeworICAgIHJldHVybiBnZXRDb25kKCktPmlzVHlwZURlcGVuZGVudCgpIHx8IGdldENvbmQoKS0+aXNWYWx1ZURlcGVuZGVudCgpOworICB9CisKKyAgLy8vIGdldENob3NlblN1YkV4cHIgLSBSZXR1cm4gdGhlIHN1YmV4cHJlc3Npb24gY2hvc2VuIGFjY29yZGluZyB0byB0aGUKKyAgLy8vIGNvbmRpdGlvbi4KKyAgRXhwciAqZ2V0Q2hvc2VuU3ViRXhwcigpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNDb25kaXRpb25UcnVlKCkgPyBnZXRMSFMoKSA6IGdldFJIUygpOworICB9CisKKyAgRXhwciAqZ2V0Q29uZCgpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8RXhwcj4oU3ViRXhwcnNbQ09ORF0pOyB9CisgIHZvaWQgc2V0Q29uZChFeHByICpFKSB7IFN1YkV4cHJzW0NPTkRdID0gRTsgfQorICBFeHByICpnZXRMSFMoKSBjb25zdCB7IHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHJzW0xIU10pOyB9CisgIHZvaWQgc2V0TEhTKEV4cHIgKkUpIHsgU3ViRXhwcnNbTEhTXSA9IEU7IH0KKyAgRXhwciAqZ2V0UkhTKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByc1tSSFNdKTsgfQorICB2b2lkIHNldFJIUyhFeHByICpFKSB7IFN1YkV4cHJzW1JIU10gPSBFOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0QnVpbHRpbkxvYygpIGNvbnN0IHsgcmV0dXJuIEJ1aWx0aW5Mb2M7IH0KKyAgdm9pZCBzZXRCdWlsdGluTG9jKFNvdXJjZUxvY2F0aW9uIEwpIHsgQnVpbHRpbkxvYyA9IEw7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRSUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKyAgdm9pZCBzZXRSUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTCkgeyBSUGFyZW5Mb2MgPSBMOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIEJ1aWx0aW5Mb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ2hvb3NlRXhwckNsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZSgmU3ViRXhwcnNbMF0sICZTdWJFeHByc1swXStFTkRfRVhQUik7CisgIH0KKyAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKCZTdWJFeHByc1swXSwgJlN1YkV4cHJzWzBdICsgRU5EX0VYUFIpOworICB9Cit9OworCisvLy8gR05VTnVsbEV4cHIgLSBJbXBsZW1lbnRzIHRoZSBHTlUgX19udWxsIGV4dGVuc2lvbiwgd2hpY2ggaXMgYSBuYW1lCisvLy8gZm9yIGEgbnVsbCBwb2ludGVyIGNvbnN0YW50IHRoYXQgaGFzIGludGVncmFsIHR5cGUgKGUuZy4sIGludCBvcgorLy8vIGxvbmcpIGFuZCBpcyB0aGUgc2FtZSBzaXplIGFuZCBhbGlnbm1lbnQgYXMgYSBwb2ludGVyLiBUaGUgX19udWxsCisvLy8gZXh0ZW5zaW9uIGlzIHR5cGljYWxseSBvbmx5IHVzZWQgYnkgc3lzdGVtIGhlYWRlcnMsIHdoaWNoIGRlZmluZQorLy8vIE5VTEwgYXMgX19udWxsIGluIEMrKyByYXRoZXIgdGhhbiB1c2luZyAwICh3aGljaCBpcyBhbiBpbnRlZ2VyCisvLy8gdGhhdCBtYXkgbm90IG1hdGNoIHRoZSBzaXplIG9mIGEgcG9pbnRlcikuCitjbGFzcyBHTlVOdWxsRXhwciA6IHB1YmxpYyBFeHByIHsKKyAgLy8vIFRva2VuTG9jIC0gVGhlIGxvY2F0aW9uIG9mIHRoZSBfX251bGwga2V5d29yZC4KKyAgU291cmNlTG9jYXRpb24gVG9rZW5Mb2M7CisKK3B1YmxpYzoKKyAgR05VTnVsbEV4cHIoUXVhbFR5cGUgVHksIFNvdXJjZUxvY2F0aW9uIExvYykKKyAgICA6IEV4cHIoR05VTnVsbEV4cHJDbGFzcywgVHksIFZLX1JWYWx1ZSwgT0tfT3JkaW5hcnksIGZhbHNlLCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgIGZhbHNlKSwKKyAgICAgIFRva2VuTG9jKExvYykgeyB9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBHTlUgX19udWxsIGV4cHJlc3Npb24uCisgIGV4cGxpY2l0IEdOVU51bGxFeHByKEVtcHR5U2hlbGwgRW1wdHkpIDogRXhwcihHTlVOdWxsRXhwckNsYXNzLCBFbXB0eSkgeyB9CisKKyAgLy8vIGdldFRva2VuTG9jYXRpb24gLSBUaGUgbG9jYXRpb24gb2YgdGhlIF9fbnVsbCB0b2tlbi4KKyAgU291cmNlTG9jYXRpb24gZ2V0VG9rZW5Mb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIFRva2VuTG9jOyB9CisgIHZvaWQgc2V0VG9rZW5Mb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBMKSB7IFRva2VuTG9jID0gTDsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBUb2tlbkxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFRva2VuTG9jOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IEdOVU51bGxFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9CisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jaGlsZF9yYW5nZShjb25zdF9jaGlsZF9pdGVyYXRvcigpLCBjb25zdF9jaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorfTsKKworLy8vIFJlcHJlc2VudHMgYSBjYWxsIHRvIHRoZSBidWlsdGluIGZ1bmN0aW9uIFxjIF9fYnVpbHRpbl92YV9hcmcuCitjbGFzcyBWQUFyZ0V4cHIgOiBwdWJsaWMgRXhwciB7CisgIFN0bXQgKlZhbDsKKyAgbGx2bTo6UG9pbnRlckludFBhaXI8VHlwZVNvdXJjZUluZm8gKiwgMSwgYm9vbD4gVEluZm87CisgIFNvdXJjZUxvY2F0aW9uIEJ1aWx0aW5Mb2MsIFJQYXJlbkxvYzsKK3B1YmxpYzoKKyAgVkFBcmdFeHByKFNvdXJjZUxvY2F0aW9uIEJMb2MsIEV4cHIgKmUsIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKKyAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQTG9jLCBRdWFsVHlwZSB0LCBib29sIElzTVMpCisgICAgICA6IEV4cHIoVkFBcmdFeHByQ2xhc3MsIHQsIFZLX1JWYWx1ZSwgT0tfT3JkaW5hcnksIHQtPmlzRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgIGZhbHNlLCAoVEluZm8tPmdldFR5cGUoKS0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpIHx8CisgICAgICAgICAgICAgICAgICAgICBlLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnQoKSksCisgICAgICAgICAgICAgKFRJbmZvLT5nZXRUeXBlKCktPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSB8fAorICAgICAgICAgICAgICBlLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpKSwKKyAgICAgICAgVmFsKGUpLCBUSW5mbyhUSW5mbywgSXNNUyksIEJ1aWx0aW5Mb2MoQkxvYyksIFJQYXJlbkxvYyhSUExvYykge30KKworICAvLy8gQ3JlYXRlIGFuIGVtcHR5IF9fYnVpbHRpbl92YV9hcmcgZXhwcmVzc2lvbi4KKyAgZXhwbGljaXQgVkFBcmdFeHByKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgICA6IEV4cHIoVkFBcmdFeHByQ2xhc3MsIEVtcHR5KSwgVmFsKG51bGxwdHIpLCBUSW5mbyhudWxscHRyLCBmYWxzZSkge30KKworICBjb25zdCBFeHByICpnZXRTdWJFeHByKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihWYWwpOyB9CisgIEV4cHIgKmdldFN1YkV4cHIoKSB7IHJldHVybiBjYXN0PEV4cHI+KFZhbCk7IH0KKyAgdm9pZCBzZXRTdWJFeHByKEV4cHIgKkUpIHsgVmFsID0gRTsgfQorCisgIC8vLyBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpcyByZWFsbHkgYSBXaW42NCBBQkkgdmFfYXJnIGV4cHJlc3Npb24uCisgIGJvb2wgaXNNaWNyb3NvZnRBQkkoKSBjb25zdCB7IHJldHVybiBUSW5mby5nZXRJbnQoKTsgfQorICB2b2lkIHNldElzTWljcm9zb2Z0QUJJKGJvb2wgSXNNUykgeyBUSW5mby5zZXRJbnQoSXNNUyk7IH0KKworICBUeXBlU291cmNlSW5mbyAqZ2V0V3JpdHRlblR5cGVJbmZvKCkgY29uc3QgeyByZXR1cm4gVEluZm8uZ2V0UG9pbnRlcigpOyB9CisgIHZvaWQgc2V0V3JpdHRlblR5cGVJbmZvKFR5cGVTb3VyY2VJbmZvICpUSSkgeyBUSW5mby5zZXRQb2ludGVyKFRJKTsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEJ1aWx0aW5Mb2MoKSBjb25zdCB7IHJldHVybiBCdWlsdGluTG9jOyB9CisgIHZvaWQgc2V0QnVpbHRpbkxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IEJ1aWx0aW5Mb2MgPSBMOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0UlBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gUlBhcmVuTG9jOyB9CisgIHZvaWQgc2V0UlBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIEwpIHsgUlBhcmVuTG9jID0gTDsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBCdWlsdGluTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUlBhcmVuTG9jOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IFZBQXJnRXhwckNsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoJlZhbCwgJlZhbCsxKTsgfQorICBjb25zdF9jaGlsZF9yYW5nZSBjaGlsZHJlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2hpbGRfcmFuZ2UoJlZhbCwgJlZhbCArIDEpOworICB9Cit9OworCisvLy8gQGJyaWVmIERlc2NyaWJlcyBhbiBDIG9yIEMrKyBpbml0aWFsaXplciBsaXN0LgorLy8vCisvLy8gSW5pdExpc3RFeHByIGRlc2NyaWJlcyBhbiBpbml0aWFsaXplciBsaXN0LCB3aGljaCBjYW4gYmUgdXNlZCB0bworLy8vIGluaXRpYWxpemUgb2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMsIGluY2x1ZGluZworLy8vIHN0cnVjdC9jbGFzcy91bmlvbiB0eXBlcywgYXJyYXlzLCBhbmQgdmVjdG9ycy4gRm9yIGV4YW1wbGU6CisvLy8KKy8vLyBAY29kZQorLy8vIHN0cnVjdCBmb28geCA9IHsgMSwgeyAyLCAzIH0gfTsKKy8vLyBAZW5kY29kZQorLy8vCisvLy8gUHJpb3IgdG8gc2VtYW50aWMgYW5hbHlzaXMsIGFuIGluaXRpYWxpemVyIGxpc3Qgd2lsbCByZXByZXNlbnQgdGhlCisvLy8gaW5pdGlhbGl6ZXIgbGlzdCBhcyB3cml0dGVuIGJ5IHRoZSB1c2VyLCBidXQgd2lsbCBoYXZlIHRoZQorLy8vIHBsYWNlaG9sZGVyIHR5cGUgInZvaWQiLiBUaGlzIGluaXRpYWxpemVyIGxpc3QgaXMgY2FsbGVkIHRoZQorLy8vIHN5bnRhY3RpYyBmb3JtIG9mIHRoZSBpbml0aWFsaXplciwgYW5kIG1heSBjb250YWluIEM5OSBkZXNpZ25hdGVkCisvLy8gaW5pdGlhbGl6ZXJzIChyZXByZXNlbnRlZCBhcyBEZXNpZ25hdGVkSW5pdEV4cHJzKSwgaW5pdGlhbGl6YXRpb25zCisvLy8gb2Ygc3Vib2JqZWN0IG1lbWJlcnMgd2l0aG91dCBleHBsaWNpdCBicmFjZXMsIGFuZCBzbyBvbi4gQ2xpZW50cworLy8vIGludGVyZXN0ZWQgaW4gdGhlIG9yaWdpbmFsIHN5bnRheCBvZiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBzaG91bGQKKy8vLyB1c2UgdGhlIHN5bnRhY3RpYyBmb3JtIG9mIHRoZSBpbml0aWFsaXplciBsaXN0LgorLy8vCisvLy8gQWZ0ZXIgc2VtYW50aWMgYW5hbHlzaXMsIHRoZSBpbml0aWFsaXplciBsaXN0IHdpbGwgcmVwcmVzZW50IHRoZQorLy8vIHNlbWFudGljIGZvcm0gb2YgdGhlIGluaXRpYWxpemVyLCB3aGVyZSB0aGUgaW5pdGlhbGl6YXRpb25zIG9mIGFsbAorLy8vIHN1Ym9iamVjdHMgYXJlIG1hZGUgZXhwbGljaXQgd2l0aCBuZXN0ZWQgSW5pdExpc3RFeHByIG5vZGVzIGFuZAorLy8vIEM5OSBkZXNpZ25hdG9ycyBoYXZlIGJlZW4gZWxpbWluYXRlZCBieSBwbGFjaW5nIHRoZSBkZXNpZ25hdGVkCisvLy8gaW5pdGlhbGl6YXRpb25zIGludG8gdGhlIHN1Ym9iamVjdCB0aGV5IGluaXRpYWxpemUuIEFkZGl0aW9uYWxseSwKKy8vLyBhbnkgImhvbGVzIiBpbiB0aGUgaW5pdGlhbGl6YXRpb24sIHdoZXJlIG5vIGluaXRpYWxpemVyIGhhcyBiZWVuCisvLy8gc3BlY2lmaWVkIGZvciBhIHBhcnRpY3VsYXIgc3Vib2JqZWN0LCB3aWxsIGJlIHJlcGxhY2VkIHdpdGgKKy8vLyBpbXBsaWNpdGx5LWdlbmVyYXRlZCBJbXBsaWNpdFZhbHVlSW5pdEV4cHIgZXhwcmVzc2lvbnMgdGhhdAorLy8vIHZhbHVlLWluaXRpYWxpemUgdGhlIHN1Ym9iamVjdHMuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhlCisvLy8gaW5pdGlhbGl6ZXIgbGlzdHMgbWF5IHN0aWxsIGhhdmUgZmV3ZXIgaW5pdGlhbGl6ZXJzIHRoYW4gdGhlcmUgYXJlCisvLy8gZWxlbWVudHMgdG8gaW5pdGlhbGl6ZSB3aXRoaW4gdGhlIG9iamVjdC4KKy8vLworLy8vIEFmdGVyIHNlbWFudGljIGFuYWx5c2lzIGhhcyBjb21wbGV0ZWQsIGdpdmVuIGFuIGluaXRpYWxpemVyIGxpc3QsCisvLy8gbWV0aG9kIGlzU2VtYW50aWNGb3JtKCkgcmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgaXMgdGhlCisvLy8gc2VtYW50aWMgZm9ybSBvZiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCAobm90ZTogdGhlIHNhbWUgQVNUIG5vZGUKKy8vLyBtYXkgYXQgdGhlIHNhbWUgdGltZSBiZSB0aGUgc3ludGFjdGljIGZvcm0pLgorLy8vIEdpdmVuIHRoZSBzZW1hbnRpYyBmb3JtIG9mIHRoZSBpbml0aWFsaXplciBsaXN0LCBvbmUgY2FuIHJldHJpZXZlCisvLy8gdGhlIHN5bnRhY3RpYyBmb3JtIG9mIHRoYXQgaW5pdGlhbGl6ZXIgbGlzdCAod2hlbiBkaWZmZXJlbnQpCisvLy8gdXNpbmcgbWV0aG9kIGdldFN5bnRhY3RpY0Zvcm0oKTsgdGhlIG1ldGhvZCByZXR1cm5zIG51bGwgaWYgYXBwbGllZAorLy8vIHRvIGEgaW5pdGlhbGl6ZXIgbGlzdCB3aGljaCBpcyBhbHJlYWR5IGluIHN5bnRhY3RpYyBmb3JtLgorLy8vIFNpbWlsYXJseSwgZ2l2ZW4gdGhlIHN5bnRhY3RpYyBmb3JtIChpLmUuLCBhbiBpbml0aWFsaXplciBsaXN0IHN1Y2gKKy8vLyB0aGF0IGlzU2VtYW50aWNGb3JtKCkgcmV0dXJucyBmYWxzZSksIG9uZSBjYW4gcmV0cmlldmUgdGhlIHNlbWFudGljCisvLy8gZm9ybSB1c2luZyBtZXRob2QgZ2V0U2VtYW50aWNGb3JtKCkuCisvLy8gU2luY2UgbWFueSBpbml0aWFsaXplciBsaXN0cyBoYXZlIHRoZSBzYW1lIHN5bnRhY3RpYyBhbmQgc2VtYW50aWMgZm9ybXMsCisvLy8gZ2V0U3ludGFjdGljRm9ybSgpIG1heSByZXR1cm4gTlVMTCwgaW5kaWNhdGluZyB0aGF0IHRoZSBjdXJyZW50CisvLy8gc2VtYW50aWMgaW5pdGlhbGl6ZXIgbGlzdCBhbHNvIHNlcnZlcyBhcyBpdHMgc3ludGFjdGljIGZvcm0uCitjbGFzcyBJbml0TGlzdEV4cHIgOiBwdWJsaWMgRXhwciB7CisgIC8vIEZJWE1FOiBFbGltaW5hdGUgdGhpcyB2ZWN0b3IgaW4gZmF2b3Igb2YgQVNUQ29udGV4dCBhbGxvY2F0aW9uCisgIHR5cGVkZWYgQVNUVmVjdG9yPFN0bXQgKj4gSW5pdEV4cHJzVHk7CisgIEluaXRFeHByc1R5IEluaXRFeHByczsKKyAgU291cmNlTG9jYXRpb24gTEJyYWNlTG9jLCBSQnJhY2VMb2M7CisKKyAgLy8vIFRoZSBhbHRlcm5hdGl2ZSBmb3JtIG9mIHRoZSBpbml0aWFsaXplciBsaXN0IChpZiBpdCBleGlzdHMpLgorICAvLy8gVGhlIGludCBwYXJ0IG9mIHRoZSBwYWlyIHN0b3JlcyB3aGV0aGVyIHRoaXMgaW5pdGlhbGl6ZXIgbGlzdCBpcworICAvLy8gaW4gc2VtYW50aWMgZm9ybS4gSWYgbm90IG51bGwsIHRoZSBwb2ludGVyIHBvaW50cyB0bzoKKyAgLy8vICAgLSB0aGUgc3ludGFjdGljIGZvcm0sIGlmIHRoaXMgaXMgaW4gc2VtYW50aWMgZm9ybTsKKyAgLy8vICAgLSB0aGUgc2VtYW50aWMgZm9ybSwgaWYgdGhpcyBpcyBpbiBzeW50YWN0aWMgZm9ybS4KKyAgbGx2bTo6UG9pbnRlckludFBhaXI8SW5pdExpc3RFeHByICosIDEsIGJvb2w+IEFsdEZvcm07CisKKyAgLy8vIFxicmllZiBFaXRoZXI6CisgIC8vLyAgSWYgdGhpcyBpbml0aWFsaXplciBsaXN0IGluaXRpYWxpemVzIGFuIGFycmF5IHdpdGggbW9yZSBlbGVtZW50cyB0aGFuCisgIC8vLyAgdGhlcmUgYXJlIGluaXRpYWxpemVycyBpbiB0aGUgbGlzdCwgc3BlY2lmaWVzIGFuIGV4cHJlc3Npb24gdG8gYmUgdXNlZAorICAvLy8gIGZvciB2YWx1ZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcmVzdCBvZiB0aGUgZWxlbWVudHMuCisgIC8vLyBPcgorICAvLy8gIElmIHRoaXMgaW5pdGlhbGl6ZXIgbGlzdCBpbml0aWFsaXplcyBhIHVuaW9uLCBzcGVjaWZpZXMgd2hpY2gKKyAgLy8vICBmaWVsZCB3aXRoaW4gdGhlIHVuaW9uIHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgIGxsdm06OlBvaW50ZXJVbmlvbjxFeHByICosIEZpZWxkRGVjbCAqPiBBcnJheUZpbGxlck9yVW5pb25GaWVsZEluaXQ7CisKK3B1YmxpYzoKKyAgSW5pdExpc3RFeHByKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIGxicmFjZWxvYywKKyAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIqPiBpbml0RXhwcnMsIFNvdXJjZUxvY2F0aW9uIHJicmFjZWxvYyk7CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBpbml0aWFsaXplciBsaXN0LgorICBleHBsaWNpdCBJbml0TGlzdEV4cHIoRW1wdHlTaGVsbCBFbXB0eSkKKyAgICA6IEV4cHIoSW5pdExpc3RFeHByQ2xhc3MsIEVtcHR5KSwgQWx0Rm9ybShudWxscHRyLCB0cnVlKSB7IH0KKworICB1bnNpZ25lZCBnZXROdW1Jbml0cygpIGNvbnN0IHsgcmV0dXJuIEluaXRFeHBycy5zaXplKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzZXQgb2YgaW5pdGlhbGl6ZXJzLgorICBFeHByICoqZ2V0SW5pdHMoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PEV4cHIgKio+KEluaXRFeHBycy5kYXRhKCkpOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc2V0IG9mIGluaXRpYWxpemVycy4KKyAgRXhwciAqIGNvbnN0ICpnZXRJbml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxFeHByICogY29uc3QgKj4oSW5pdEV4cHJzLmRhdGEoKSk7CisgIH0KKworICBBcnJheVJlZjxFeHByICo+IGluaXRzKCkgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoZ2V0SW5pdHMoKSwgZ2V0TnVtSW5pdHMoKSk7CisgIH0KKworICBBcnJheVJlZjxFeHByICo+IGluaXRzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoZ2V0SW5pdHMoKSwgZ2V0TnVtSW5pdHMoKSk7CisgIH0KKworICBjb25zdCBFeHByICpnZXRJbml0KHVuc2lnbmVkIEluaXQpIGNvbnN0IHsKKyAgICBhc3NlcnQoSW5pdCA8IGdldE51bUluaXRzKCkgJiYgIkluaXRpYWxpemVyIGFjY2VzcyBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxFeHByPihJbml0RXhwcnNbSW5pdF0pOworICB9CisKKyAgRXhwciAqZ2V0SW5pdCh1bnNpZ25lZCBJbml0KSB7CisgICAgYXNzZXJ0KEluaXQgPCBnZXROdW1Jbml0cygpICYmICJJbml0aWFsaXplciBhY2Nlc3Mgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBjYXN0X29yX251bGw8RXhwcj4oSW5pdEV4cHJzW0luaXRdKTsKKyAgfQorCisgIHZvaWQgc2V0SW5pdCh1bnNpZ25lZCBJbml0LCBFeHByICpleHByKSB7CisgICAgYXNzZXJ0KEluaXQgPCBnZXROdW1Jbml0cygpICYmICJJbml0aWFsaXplciBhY2Nlc3Mgb3V0IG9mIHJhbmdlISIpOworICAgIEluaXRFeHByc1tJbml0XSA9IGV4cHI7CisKKyAgICBpZiAoZXhwcikgeworICAgICAgRXhwckJpdHMuVHlwZURlcGVuZGVudCB8PSBleHByLT5pc1R5cGVEZXBlbmRlbnQoKTsKKyAgICAgIEV4cHJCaXRzLlZhbHVlRGVwZW5kZW50IHw9IGV4cHItPmlzVmFsdWVEZXBlbmRlbnQoKTsKKyAgICAgIEV4cHJCaXRzLkluc3RhbnRpYXRpb25EZXBlbmRlbnQgfD0gZXhwci0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCk7CisgICAgICBFeHByQml0cy5Db250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrIHw9CisgICAgICAgICAgZXhwci0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpOworICAgIH0KKyAgfQorCisgIC8vLyBcYnJpZWYgUmVzZXJ2ZSBzcGFjZSBmb3Igc29tZSBudW1iZXIgb2YgaW5pdGlhbGl6ZXJzLgorICB2b2lkIHJlc2VydmVJbml0cyhjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBOdW1Jbml0cyk7CisKKyAgLy8vIEBicmllZiBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgaW5pdGlhbGl6ZXJzCisgIC8vLworICAvLy8gSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBAcCBOdW1Jbml0cyBpbml0aWFsaXplcnMsIHRoZSByZW1haW5pbmcKKyAgLy8vIGluaXRpYWxpemVycyB3aWxsIGJlIGRlc3Ryb3llZC4gSWYgdGhlcmUgYXJlIGZld2VyIHRoYW4gQHAKKyAgLy8vIE51bUluaXRzIGluaXRpYWxpemVycywgTlVMTCBleHByZXNzaW9ucyB3aWxsIGJlIGFkZGVkIGZvciB0aGUKKyAgLy8vIHVua25vd24gaW5pdGlhbGl6ZXJzLgorICB2b2lkIHJlc2l6ZUluaXRzKGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIE51bUluaXRzKTsKKworICAvLy8gQGJyaWVmIFVwZGF0ZXMgdGhlIGluaXRpYWxpemVyIGF0IGluZGV4IEBwIEluaXQgd2l0aCB0aGUgbmV3CisgIC8vLyBleHByZXNzaW9uIEBwIGV4cHIsIGFuZCByZXR1cm5zIHRoZSBvbGQgZXhwcmVzc2lvbiBhdCB0aGF0CisgIC8vLyBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBXaGVuIEBwIEluaXQgaXMgb3V0IG9mIHJhbmdlIGZvciB0aGlzIGluaXRpYWxpemVyIGxpc3QsIHRoZQorICAvLy8gaW5pdGlhbGl6ZXIgbGlzdCB3aWxsIGJlIGV4dGVuZGVkIHdpdGggTlVMTCBleHByZXNzaW9ucyB0bworICAvLy8gYWNjb21tb2RhdGUgdGhlIG5ldyBlbnRyeS4KKyAgRXhwciAqdXBkYXRlSW5pdChjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJbml0LCBFeHByICpleHByKTsKKworICAvLy8gXGJyaWVmIElmIHRoaXMgaW5pdGlhbGl6ZXIgbGlzdCBpbml0aWFsaXplcyBhbiBhcnJheSB3aXRoIG1vcmUgZWxlbWVudHMKKyAgLy8vIHRoYW4gdGhlcmUgYXJlIGluaXRpYWxpemVycyBpbiB0aGUgbGlzdCwgc3BlY2lmaWVzIGFuIGV4cHJlc3Npb24gdG8gYmUKKyAgLy8vIHVzZWQgZm9yIHZhbHVlIGluaXRpYWxpemF0aW9uIG9mIHRoZSByZXN0IG9mIHRoZSBlbGVtZW50cy4KKyAgRXhwciAqZ2V0QXJyYXlGaWxsZXIoKSB7CisgICAgcmV0dXJuIEFycmF5RmlsbGVyT3JVbmlvbkZpZWxkSW5pdC5keW5fY2FzdDxFeHByICo+KCk7CisgIH0KKyAgY29uc3QgRXhwciAqZ2V0QXJyYXlGaWxsZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8SW5pdExpc3RFeHByICo+KHRoaXMpLT5nZXRBcnJheUZpbGxlcigpOworICB9CisgIHZvaWQgc2V0QXJyYXlGaWxsZXIoRXhwciAqZmlsbGVyKTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gYXJyYXkgaW5pdGlhbGl6ZXIgYW5kIGl0cyBhcnJheSAiZmlsbGVyIgorICAvLy8gaGFzIGJlZW4gc2V0LgorICBib29sIGhhc0FycmF5RmlsbGVyKCkgY29uc3QgeyByZXR1cm4gZ2V0QXJyYXlGaWxsZXIoKTsgfQorCisgIC8vLyBcYnJpZWYgSWYgdGhpcyBpbml0aWFsaXplcyBhIHVuaW9uLCBzcGVjaWZpZXMgd2hpY2ggZmllbGQgaW4gdGhlCisgIC8vLyB1bmlvbiB0byBpbml0aWFsaXplLgorICAvLy8KKyAgLy8vIFR5cGljYWxseSwgdGhpcyBmaWVsZCBpcyB0aGUgZmlyc3QgbmFtZWQgZmllbGQgd2l0aGluIHRoZQorICAvLy8gdW5pb24uIEhvd2V2ZXIsIGEgZGVzaWduYXRlZCBpbml0aWFsaXplciBjYW4gc3BlY2lmeSB0aGUKKyAgLy8vIGluaXRpYWxpemF0aW9uIG9mIGEgZGlmZmVyZW50IGZpZWxkIHdpdGhpbiB0aGUgdW5pb24uCisgIEZpZWxkRGVjbCAqZ2V0SW5pdGlhbGl6ZWRGaWVsZEluVW5pb24oKSB7CisgICAgcmV0dXJuIEFycmF5RmlsbGVyT3JVbmlvbkZpZWxkSW5pdC5keW5fY2FzdDxGaWVsZERlY2wgKj4oKTsKKyAgfQorICBjb25zdCBGaWVsZERlY2wgKmdldEluaXRpYWxpemVkRmllbGRJblVuaW9uKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PEluaXRMaXN0RXhwciAqPih0aGlzKS0+Z2V0SW5pdGlhbGl6ZWRGaWVsZEluVW5pb24oKTsKKyAgfQorICB2b2lkIHNldEluaXRpYWxpemVkRmllbGRJblVuaW9uKEZpZWxkRGVjbCAqRkQpIHsKKyAgICBhc3NlcnQoKEZEID09IG51bGxwdHIKKyAgICAgICAgICAgIHx8IGdldEluaXRpYWxpemVkRmllbGRJblVuaW9uKCkgPT0gbnVsbHB0cgorICAgICAgICAgICAgfHwgZ2V0SW5pdGlhbGl6ZWRGaWVsZEluVW5pb24oKSA9PSBGRCkKKyAgICAgICAgICAgJiYgIk9ubHkgb25lIGZpZWxkIG9mIGEgdW5pb24gbWF5IGJlIGluaXRpYWxpemVkIGF0IGEgdGltZSEiKTsKKyAgICBBcnJheUZpbGxlck9yVW5pb25GaWVsZEluaXQgPSBGRDsKKyAgfQorCisgIC8vIEV4cGxpY2l0IEluaXRMaXN0RXhwcidzIG9yaWdpbmF0ZSBmcm9tIHNvdXJjZSBjb2RlIChhbmQgaGF2ZSB2YWxpZCBzb3VyY2UKKyAgLy8gbG9jYXRpb25zKS4gSW1wbGljaXQgSW5pdExpc3RFeHByJ3MgYXJlIGNyZWF0ZWQgYnkgdGhlIHNlbWFudGljIGFuYWx5emVyLgorICBib29sIGlzRXhwbGljaXQoKSBjb25zdCB7CisgICAgcmV0dXJuIExCcmFjZUxvYy5pc1ZhbGlkKCkgJiYgUkJyYWNlTG9jLmlzVmFsaWQoKTsKKyAgfQorCisgIC8vIElzIHRoaXMgYW4gaW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIGNoYXJhY3RlcnMsIGluaXRpYWxpemVkIGJ5IGEgc3RyaW5nCisgIC8vIGxpdGVyYWwgb3IgYW4gQGVuY29kZT8KKyAgYm9vbCBpc1N0cmluZ0xpdGVyYWxJbml0KCkgY29uc3Q7CisKKyAgLy8vIElzIHRoaXMgYSB0cmFuc3BhcmVudCBpbml0aWFsaXplciBsaXN0ICh0aGF0IGlzLCBhbiBJbml0TGlzdEV4cHIgdGhhdCBpcworICAvLy8gcHVyZWx5IHN5bnRhY3RpYywgYW5kIHdob3NlIHNlbWFudGljcyBhcmUgdGhhdCBvZiB0aGUgc29sZSBjb250YWluZWQKKyAgLy8vIGluaXRpYWxpemVyKT8KKyAgYm9vbCBpc1RyYW5zcGFyZW50KCkgY29uc3Q7CisKKyAgLy8vIElzIHRoaXMgdGhlIHplcm8gaW5pdGlhbGl6ZXIgezB9IGluIGEgbGFuZ3VhZ2Ugd2hpY2ggY29uc2lkZXJzIGl0CisgIC8vLyBpZGlvbWF0aWM/CisgIGJvb2wgaXNJZGlvbWF0aWNaZXJvSW5pdGlhbGl6ZXIoY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSBjb25zdDsKKworICBTb3VyY2VMb2NhdGlvbiBnZXRMQnJhY2VMb2MoKSBjb25zdCB7IHJldHVybiBMQnJhY2VMb2M7IH0KKyAgdm9pZCBzZXRMQnJhY2VMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IExCcmFjZUxvYyA9IExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRSQnJhY2VMb2MoKSBjb25zdCB7IHJldHVybiBSQnJhY2VMb2M7IH0KKyAgdm9pZCBzZXRSQnJhY2VMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IFJCcmFjZUxvYyA9IExvYzsgfQorCisgIGJvb2wgaXNTZW1hbnRpY0Zvcm0oKSBjb25zdCB7IHJldHVybiBBbHRGb3JtLmdldEludCgpOyB9CisgIEluaXRMaXN0RXhwciAqZ2V0U2VtYW50aWNGb3JtKCkgY29uc3QgeworICAgIHJldHVybiBpc1NlbWFudGljRm9ybSgpID8gbnVsbHB0ciA6IEFsdEZvcm0uZ2V0UG9pbnRlcigpOworICB9CisgIGJvb2wgaXNTeW50YWN0aWNGb3JtKCkgY29uc3QgeworICAgIHJldHVybiAhQWx0Rm9ybS5nZXRJbnQoKSB8fCAhQWx0Rm9ybS5nZXRQb2ludGVyKCk7CisgIH0KKyAgSW5pdExpc3RFeHByICpnZXRTeW50YWN0aWNGb3JtKCkgY29uc3QgeworICAgIHJldHVybiBpc1NlbWFudGljRm9ybSgpID8gQWx0Rm9ybS5nZXRQb2ludGVyKCkgOiBudWxscHRyOworICB9CisKKyAgdm9pZCBzZXRTeW50YWN0aWNGb3JtKEluaXRMaXN0RXhwciAqSW5pdCkgeworICAgIEFsdEZvcm0uc2V0UG9pbnRlcihJbml0KTsKKyAgICBBbHRGb3JtLnNldEludCh0cnVlKTsKKyAgICBJbml0LT5BbHRGb3JtLnNldFBvaW50ZXIodGhpcyk7CisgICAgSW5pdC0+QWx0Rm9ybS5zZXRJbnQoZmFsc2UpOworICB9CisKKyAgYm9vbCBoYWRBcnJheVJhbmdlRGVzaWduYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5pdExpc3RFeHByQml0cy5IYWRBcnJheVJhbmdlRGVzaWduYXRvciAhPSAwOworICB9CisgIHZvaWQgc2F3QXJyYXlSYW5nZURlc2lnbmF0b3IoYm9vbCBBUkQgPSB0cnVlKSB7CisgICAgSW5pdExpc3RFeHByQml0cy5IYWRBcnJheVJhbmdlRGVzaWduYXRvciA9IEFSRDsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gSW5pdExpc3RFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgY29uc3RfY2hpbGRfcmFuZ2UgQ0NSID0gY29uc3RfY2FzdDxjb25zdCBJbml0TGlzdEV4cHIgKj4odGhpcyktPmNoaWxkcmVuKCk7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNhc3RfYXdheV9jb25zdChDQ1IuYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfYXdheV9jb25zdChDQ1IuZW5kKCkpKTsKKyAgfQorCisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3QgeworICAgIC8vIEZJWE1FOiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgdGhlIGFycmF5IGZpbGxlciBleHByZXNzaW9uLgorICAgIGlmIChJbml0RXhwcnMuZW1wdHkoKSkKKyAgICAgIHJldHVybiBjb25zdF9jaGlsZF9yYW5nZShjb25zdF9jaGlsZF9pdGVyYXRvcigpLCBjb25zdF9jaGlsZF9pdGVyYXRvcigpKTsKKyAgICByZXR1cm4gY29uc3RfY2hpbGRfcmFuZ2UoJkluaXRFeHByc1swXSwgJkluaXRFeHByc1swXSArIEluaXRFeHBycy5zaXplKCkpOworICB9CisKKyAgdHlwZWRlZiBJbml0RXhwcnNUeTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgSW5pdEV4cHJzVHk6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICB0eXBlZGVmIEluaXRFeHByc1R5OjpyZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgSW5pdEV4cHJzVHk6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIEluaXRFeHBycy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gSW5pdEV4cHJzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gSW5pdEV4cHJzLmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEluaXRFeHBycy5lbmQoKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIEluaXRFeHBycy5yYmVnaW4oKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEluaXRFeHBycy5yYmVnaW4oKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiBJbml0RXhwcnMucmVuZCgpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIEluaXRFeHBycy5yZW5kKCk7IH0KKworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRXcml0ZXI7Cit9OworCisvLy8gQGJyaWVmIFJlcHJlc2VudHMgYSBDOTkgZGVzaWduYXRlZCBpbml0aWFsaXplciBleHByZXNzaW9uLgorLy8vCisvLy8gQSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIGV4cHJlc3Npb24gKEM5OSA2LjcuOCkgY29udGFpbnMgb25lIG9yCisvLy8gbW9yZSBkZXNpZ25hdG9ycyAod2hpY2ggY2FuIGJlIGZpZWxkIGRlc2lnbmF0b3JzLCBhcnJheQorLy8vIGRlc2lnbmF0b3JzLCBvciBHTlUgYXJyYXktcmFuZ2UgZGVzaWduYXRvcnMpIGZvbGxvd2VkIGJ5IGFuCisvLy8gZXhwcmVzc2lvbiB0aGF0IGluaXRpYWxpemVzIHRoZSBmaWVsZCBvciBlbGVtZW50KHMpIHRoYXQgdGhlCisvLy8gZGVzaWduYXRvcnMgcmVmZXIgdG8uIEZvciBleGFtcGxlLCBnaXZlbjoKKy8vLworLy8vIEBjb2RlCisvLy8gc3RydWN0IHBvaW50IHsKKy8vLyAgIGRvdWJsZSB4OworLy8vICAgZG91YmxlIHk7CisvLy8gfTsKKy8vLyBzdHJ1Y3QgcG9pbnQgcHRhcnJheVsxMF0gPSB7IFsyXS55ID0gMS4wLCBbMl0ueCA9IDIuMCwgWzBdLnggPSAxLjAgfTsKKy8vLyBAZW5kY29kZQorLy8vCisvLy8gVGhlIEluaXRMaXN0RXhwciBjb250YWlucyB0aHJlZSBEZXNpZ25hdGVkSW5pdEV4cHJzLCB0aGUgZmlyc3Qgb2YKKy8vLyB3aGljaCBjb3ZlcnMgQGMgWzJdLnk9MS4wLiBUaGlzIERlc2lnbmF0ZWRJbml0RXhwciB3aWxsIGhhdmUgdHdvCisvLy8gZGVzaWduYXRvcnMsIG9uZSBhcnJheSBkZXNpZ25hdG9yIGZvciBAYyBbMl0gZm9sbG93ZWQgYnkgb25lIGZpZWxkCisvLy8gZGVzaWduYXRvciBmb3IgQGMgLnkuIFRoZSBpbml0aWFsaXphdGlvbiBleHByZXNzaW9uIHdpbGwgYmUgMS4wLgorY2xhc3MgRGVzaWduYXRlZEluaXRFeHByIGZpbmFsCisgICAgOiBwdWJsaWMgRXhwciwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPERlc2lnbmF0ZWRJbml0RXhwciwgU3RtdCAqPiB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0aGUgRGVzaWduYXRvciBjbGFzcy4KKyAgY2xhc3MgRGVzaWduYXRvcjsKKworcHJpdmF0ZToKKyAgLy8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgJz0nIG9yICc6JyBwcmlvciB0byB0aGUgYWN0dWFsIGluaXRpYWxpemVyCisgIC8vLyBleHByZXNzaW9uLgorICBTb3VyY2VMb2NhdGlvbiBFcXVhbE9yQ29sb25Mb2M7CisKKyAgLy8vIFdoZXRoZXIgdGhpcyBkZXNpZ25hdGVkIGluaXRpYWxpemVyIHVzZWQgdGhlIEdOVSBkZXByZWNhdGVkCisgIC8vLyBzeW50YXggcmF0aGVyIHRoYW4gdGhlIEM5OSAnPScgc3ludGF4LgorICB1bnNpZ25lZCBHTlVTeW50YXggOiAxOworCisgIC8vLyBUaGUgbnVtYmVyIG9mIGRlc2lnbmF0b3JzIGluIHRoaXMgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbi4KKyAgdW5zaWduZWQgTnVtRGVzaWduYXRvcnMgOiAxNTsKKworICAvLy8gVGhlIG51bWJlciBvZiBzdWJleHByZXNzaW9ucyBvZiB0aGlzIGluaXRpYWxpemVyIGV4cHJlc3Npb24sCisgIC8vLyB3aGljaCBjb250YWlucyBib3RoIHRoZSBpbml0aWFsaXplciBhbmQgYW55IGFkZGl0aW9uYWwKKyAgLy8vIGV4cHJlc3Npb25zIHVzZWQgYnkgYXJyYXkgYW5kIGFycmF5LXJhbmdlIGRlc2lnbmF0b3JzLgorICB1bnNpZ25lZCBOdW1TdWJFeHBycyA6IDE2OworCisgIC8vLyBcYnJpZWYgVGhlIGRlc2lnbmF0b3JzIGluIHRoaXMgZGVzaWduYXRlZCBpbml0aWFsaXphdGlvbgorICAvLy8gZXhwcmVzc2lvbi4KKyAgRGVzaWduYXRvciAqRGVzaWduYXRvcnM7CisKKyAgRGVzaWduYXRlZEluaXRFeHByKGNvbnN0IEFTVENvbnRleHQgJkMsIFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXJyYXlSZWY8RGVzaWduYXRvcj4gRGVzaWduYXRvcnMsCisgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFcXVhbE9yQ29sb25Mb2MsIGJvb2wgR05VU3ludGF4LAorICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBJbmRleEV4cHJzLCBFeHByICpJbml0KTsKKworICBleHBsaWNpdCBEZXNpZ25hdGVkSW5pdEV4cHIodW5zaWduZWQgTnVtU3ViRXhwcnMpCisgICAgOiBFeHByKERlc2lnbmF0ZWRJbml0RXhwckNsYXNzLCBFbXB0eVNoZWxsKCkpLAorICAgICAgTnVtRGVzaWduYXRvcnMoMCksIE51bVN1YkV4cHJzKE51bVN1YkV4cHJzKSwgRGVzaWduYXRvcnMobnVsbHB0cikgeyB9CisKK3B1YmxpYzoKKyAgLy8vIEEgZmllbGQgZGVzaWduYXRvciwgZS5nLiwgIi54Ii4KKyAgc3RydWN0IEZpZWxkRGVzaWduYXRvciB7CisgICAgLy8vIFJlZmVycyB0byB0aGUgZmllbGQgdGhhdCBpcyBiZWluZyBpbml0aWFsaXplZC4gVGhlIGxvdyBiaXQKKyAgICAvLy8gb2YgdGhpcyBmaWVsZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBpcyBhY3R1YWxseSBhIHBvaW50ZXIKKyAgICAvLy8gdG8gYW4gSWRlbnRpZmllckluZm8gKGlmIDEpIG9yIGEgRmllbGREZWNsIChpZiAwKS4gV2hlbgorICAgIC8vLyBpbml0aWFsbHkgY29uc3RydWN0ZWQsIGEgZmllbGQgZGVzaWduYXRvciB3aWxsIHN0b3JlIGFuCisgICAgLy8vIElkZW50aWZpZXJJbmZvKi4gQWZ0ZXIgc2VtYW50aWMgYW5hbHlzaXMgaGFzIHJlc29sdmVkIHRoYXQKKyAgICAvLy8gbmFtZSwgdGhlIGZpZWxkIGRlc2lnbmF0b3Igd2lsbCBpbnN0ZWFkIHN0b3JlIGEgRmllbGREZWNsKi4KKyAgICB1aW50cHRyX3QgTmFtZU9yRmllbGQ7CisKKyAgICAvLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSAnLicgaW4gdGhlIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIuCisgICAgdW5zaWduZWQgRG90TG9jOworCisgICAgLy8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgZmllbGQgbmFtZSBpbiB0aGUgZGVzaWduYXRlZCBpbml0aWFsaXplci4KKyAgICB1bnNpZ25lZCBGaWVsZExvYzsKKyAgfTsKKworICAvLy8gQW4gYXJyYXkgb3IgR05VIGFycmF5LXJhbmdlIGRlc2lnbmF0b3IsIGUuZy4sICJbOV0iIG9yICJbMTAuLjE1XSIuCisgIHN0cnVjdCBBcnJheU9yUmFuZ2VEZXNpZ25hdG9yIHsKKyAgICAvLy8gTG9jYXRpb24gb2YgdGhlIGZpcnN0IGluZGV4IGV4cHJlc3Npb24gd2l0aGluIHRoZSBkZXNpZ25hdGVkCisgICAgLy8vIGluaXRpYWxpemVyIGV4cHJlc3Npb24ncyBsaXN0IG9mIHN1YmV4cHJlc3Npb25zLgorICAgIHVuc2lnbmVkIEluZGV4OworICAgIC8vLyBUaGUgbG9jYXRpb24gb2YgdGhlICdbJyBzdGFydGluZyB0aGUgYXJyYXkgcmFuZ2UgZGVzaWduYXRvci4KKyAgICB1bnNpZ25lZCBMQnJhY2tldExvYzsKKyAgICAvLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSBlbGxpcHNpcyBzZXBhcmF0aW5nIHRoZSBzdGFydCBhbmQgZW5kCisgICAgLy8vIGluZGljZXMuIE9ubHkgdmFsaWQgZm9yIEdOVSBhcnJheS1yYW5nZSBkZXNpZ25hdG9ycy4KKyAgICB1bnNpZ25lZCBFbGxpcHNpc0xvYzsKKyAgICAvLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSAnXScgdGVybWluYXRpbmcgdGhlIGFycmF5IHJhbmdlIGRlc2lnbmF0b3IuCisgICAgdW5zaWduZWQgUkJyYWNrZXRMb2M7CisgIH07CisKKyAgLy8vIEBicmllZiBSZXByZXNlbnRzIGEgc2luZ2xlIEM5OSBkZXNpZ25hdG9yLgorICAvLy8KKyAgLy8vIEB0b2RvIFRoaXMgY2xhc3MgaXMgaW5mdXJpYXRpbmdseSBzaW1pbGFyIHRvIGNsYW5nOjpEZXNpZ25hdG9yLAorICAvLy8gYnV0IG1pbm9yIGRpZmZlcmVuY2VzIChzdG9yaW5nIGluZGljZXMgdnMuIHN0b3JpbmcgcG9pbnRlcnMpCisgIC8vLyBrZWVwIHVzIGZyb20gcmV1c2luZyBpdC4gVHJ5IGhhcmRlciwgbGF0ZXIsIHRvIHJlY3RpZnkgdGhlc2UKKyAgLy8vIGRpZmZlcmVuY2VzLgorICBjbGFzcyBEZXNpZ25hdG9yIHsKKyAgICAvLy8gQGJyaWVmIFRoZSBraW5kIG9mIGRlc2lnbmF0b3IgdGhpcyBkZXNjcmliZXMuCisgICAgZW51bSB7CisgICAgICBGaWVsZERlc2lnbmF0b3IsCisgICAgICBBcnJheURlc2lnbmF0b3IsCisgICAgICBBcnJheVJhbmdlRGVzaWduYXRvcgorICAgIH0gS2luZDsKKworICAgIHVuaW9uIHsKKyAgICAgIC8vLyBBIGZpZWxkIGRlc2lnbmF0b3IsIGUuZy4sICIueCIuCisgICAgICBzdHJ1Y3QgRmllbGREZXNpZ25hdG9yIEZpZWxkOworICAgICAgLy8vIEFuIGFycmF5IG9yIEdOVSBhcnJheS1yYW5nZSBkZXNpZ25hdG9yLCBlLmcuLCAiWzldIiBvciAiWzEwLi4xNV0iLgorICAgICAgc3RydWN0IEFycmF5T3JSYW5nZURlc2lnbmF0b3IgQXJyYXlPclJhbmdlOworICAgIH07CisgICAgZnJpZW5kIGNsYXNzIERlc2lnbmF0ZWRJbml0RXhwcjsKKworICBwdWJsaWM6CisgICAgRGVzaWduYXRvcigpIHt9CisKKyAgICAvLy8gQGJyaWVmIEluaXRpYWxpemVzIGEgZmllbGQgZGVzaWduYXRvci4KKyAgICBEZXNpZ25hdG9yKGNvbnN0IElkZW50aWZpZXJJbmZvICpGaWVsZE5hbWUsIFNvdXJjZUxvY2F0aW9uIERvdExvYywKKyAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEZpZWxkTG9jKQorICAgICAgOiBLaW5kKEZpZWxkRGVzaWduYXRvcikgeworICAgICAgRmllbGQuTmFtZU9yRmllbGQgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oRmllbGROYW1lKSB8IDB4MDE7CisgICAgICBGaWVsZC5Eb3RMb2MgPSBEb3RMb2MuZ2V0UmF3RW5jb2RpbmcoKTsKKyAgICAgIEZpZWxkLkZpZWxkTG9jID0gRmllbGRMb2MuZ2V0UmF3RW5jb2RpbmcoKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIEluaXRpYWxpemVzIGFuIGFycmF5IGRlc2lnbmF0b3IuCisgICAgRGVzaWduYXRvcih1bnNpZ25lZCBJbmRleCwgU291cmNlTG9jYXRpb24gTEJyYWNrZXRMb2MsCisgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSQnJhY2tldExvYykKKyAgICAgIDogS2luZChBcnJheURlc2lnbmF0b3IpIHsKKyAgICAgIEFycmF5T3JSYW5nZS5JbmRleCA9IEluZGV4OworICAgICAgQXJyYXlPclJhbmdlLkxCcmFja2V0TG9jID0gTEJyYWNrZXRMb2MuZ2V0UmF3RW5jb2RpbmcoKTsKKyAgICAgIEFycmF5T3JSYW5nZS5FbGxpcHNpc0xvYyA9IFNvdXJjZUxvY2F0aW9uKCkuZ2V0UmF3RW5jb2RpbmcoKTsKKyAgICAgIEFycmF5T3JSYW5nZS5SQnJhY2tldExvYyA9IFJCcmFja2V0TG9jLmdldFJhd0VuY29kaW5nKCk7CisgICAgfQorCisgICAgLy8vIEBicmllZiBJbml0aWFsaXplcyBhIEdOVSBhcnJheS1yYW5nZSBkZXNpZ25hdG9yLgorICAgIERlc2lnbmF0b3IodW5zaWduZWQgSW5kZXgsIFNvdXJjZUxvY2F0aW9uIExCcmFja2V0TG9jLAorICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MsIFNvdXJjZUxvY2F0aW9uIFJCcmFja2V0TG9jKQorICAgICAgOiBLaW5kKEFycmF5UmFuZ2VEZXNpZ25hdG9yKSB7CisgICAgICBBcnJheU9yUmFuZ2UuSW5kZXggPSBJbmRleDsKKyAgICAgIEFycmF5T3JSYW5nZS5MQnJhY2tldExvYyA9IExCcmFja2V0TG9jLmdldFJhd0VuY29kaW5nKCk7CisgICAgICBBcnJheU9yUmFuZ2UuRWxsaXBzaXNMb2MgPSBFbGxpcHNpc0xvYy5nZXRSYXdFbmNvZGluZygpOworICAgICAgQXJyYXlPclJhbmdlLlJCcmFja2V0TG9jID0gUkJyYWNrZXRMb2MuZ2V0UmF3RW5jb2RpbmcoKTsKKyAgICB9CisKKyAgICBib29sIGlzRmllbGREZXNpZ25hdG9yKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBGaWVsZERlc2lnbmF0b3I7IH0KKyAgICBib29sIGlzQXJyYXlEZXNpZ25hdG9yKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBBcnJheURlc2lnbmF0b3I7IH0KKyAgICBib29sIGlzQXJyYXlSYW5nZURlc2lnbmF0b3IoKSBjb25zdCB7IHJldHVybiBLaW5kID09IEFycmF5UmFuZ2VEZXNpZ25hdG9yOyB9CisKKyAgICBJZGVudGlmaWVySW5mbyAqZ2V0RmllbGROYW1lKCkgY29uc3Q7CisKKyAgICBGaWVsZERlY2wgKmdldEZpZWxkKCkgY29uc3QgeworICAgICAgYXNzZXJ0KEtpbmQgPT0gRmllbGREZXNpZ25hdG9yICYmICJPbmx5IHZhbGlkIG9uIGEgZmllbGQgZGVzaWduYXRvciIpOworICAgICAgaWYgKEZpZWxkLk5hbWVPckZpZWxkICYgMHgwMSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEZpZWxkRGVjbCAqPihGaWVsZC5OYW1lT3JGaWVsZCk7CisgICAgfQorCisgICAgdm9pZCBzZXRGaWVsZChGaWVsZERlY2wgKkZEKSB7CisgICAgICBhc3NlcnQoS2luZCA9PSBGaWVsZERlc2lnbmF0b3IgJiYgIk9ubHkgdmFsaWQgb24gYSBmaWVsZCBkZXNpZ25hdG9yIik7CisgICAgICBGaWVsZC5OYW1lT3JGaWVsZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihGRCk7CisgICAgfQorCisgICAgU291cmNlTG9jYXRpb24gZ2V0RG90TG9jKCkgY29uc3QgeworICAgICAgYXNzZXJ0KEtpbmQgPT0gRmllbGREZXNpZ25hdG9yICYmICJPbmx5IHZhbGlkIG9uIGEgZmllbGQgZGVzaWduYXRvciIpOworICAgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoRmllbGQuRG90TG9jKTsKKyAgICB9CisKKyAgICBTb3VyY2VMb2NhdGlvbiBnZXRGaWVsZExvYygpIGNvbnN0IHsKKyAgICAgIGFzc2VydChLaW5kID09IEZpZWxkRGVzaWduYXRvciAmJiAiT25seSB2YWxpZCBvbiBhIGZpZWxkIGRlc2lnbmF0b3IiKTsKKyAgICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKEZpZWxkLkZpZWxkTG9jKTsKKyAgICB9CisKKyAgICBTb3VyY2VMb2NhdGlvbiBnZXRMQnJhY2tldExvYygpIGNvbnN0IHsKKyAgICAgIGFzc2VydCgoS2luZCA9PSBBcnJheURlc2lnbmF0b3IgfHwgS2luZCA9PSBBcnJheVJhbmdlRGVzaWduYXRvcikgJiYKKyAgICAgICAgICAgICAiT25seSB2YWxpZCBvbiBhbiBhcnJheSBvciBhcnJheS1yYW5nZSBkZXNpZ25hdG9yIik7CisgICAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZyhBcnJheU9yUmFuZ2UuTEJyYWNrZXRMb2MpOworICAgIH0KKworICAgIFNvdXJjZUxvY2F0aW9uIGdldFJCcmFja2V0TG9jKCkgY29uc3QgeworICAgICAgYXNzZXJ0KChLaW5kID09IEFycmF5RGVzaWduYXRvciB8fCBLaW5kID09IEFycmF5UmFuZ2VEZXNpZ25hdG9yKSAmJgorICAgICAgICAgICAgICJPbmx5IHZhbGlkIG9uIGFuIGFycmF5IG9yIGFycmF5LXJhbmdlIGRlc2lnbmF0b3IiKTsKKyAgICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKEFycmF5T3JSYW5nZS5SQnJhY2tldExvYyk7CisgICAgfQorCisgICAgU291cmNlTG9jYXRpb24gZ2V0RWxsaXBzaXNMb2MoKSBjb25zdCB7CisgICAgICBhc3NlcnQoS2luZCA9PSBBcnJheVJhbmdlRGVzaWduYXRvciAmJgorICAgICAgICAgICAgICJPbmx5IHZhbGlkIG9uIGFuIGFycmF5LXJhbmdlIGRlc2lnbmF0b3IiKTsKKyAgICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKEFycmF5T3JSYW5nZS5FbGxpcHNpc0xvYyk7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0Rmlyc3RFeHBySW5kZXgoKSBjb25zdCB7CisgICAgICBhc3NlcnQoKEtpbmQgPT0gQXJyYXlEZXNpZ25hdG9yIHx8IEtpbmQgPT0gQXJyYXlSYW5nZURlc2lnbmF0b3IpICYmCisgICAgICAgICAgICAgIk9ubHkgdmFsaWQgb24gYW4gYXJyYXkgb3IgYXJyYXktcmFuZ2UgZGVzaWduYXRvciIpOworICAgICAgcmV0dXJuIEFycmF5T3JSYW5nZS5JbmRleDsKKyAgICB9CisKKyAgICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgICAgaWYgKEtpbmQgPT0gRmllbGREZXNpZ25hdG9yKQorICAgICAgICByZXR1cm4gZ2V0RG90TG9jKCkuaXNJbnZhbGlkKCk/IGdldEZpZWxkTG9jKCkgOiBnZXREb3RMb2MoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGdldExCcmFja2V0TG9jKCk7CisgICAgfQorICAgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgICAgcmV0dXJuIEtpbmQgPT0gRmllbGREZXNpZ25hdG9yID8gZ2V0RmllbGRMb2MoKSA6IGdldFJCcmFja2V0TG9jKCk7CisgICAgfQorICAgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0TG9jU3RhcnQoKSwgZ2V0TG9jRW5kKCkpOworICAgIH0KKyAgfTsKKworICBzdGF0aWMgRGVzaWduYXRlZEluaXRFeHByICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFycmF5UmVmPERlc2lnbmF0b3I+IERlc2lnbmF0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwcio+IEluZGV4RXhwcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFcXVhbE9yQ29sb25Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEdOVVN5bnRheCwgRXhwciAqSW5pdCk7CisKKyAgc3RhdGljIERlc2lnbmF0ZWRJbml0RXhwciAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSW5kZXhFeHBycyk7CisKKyAgLy8vIEBicmllZiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGVzaWduYXRvcnMgaW4gdGhpcyBpbml0aWFsaXplci4KKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE51bURlc2lnbmF0b3JzOyB9CisKKyAgLy8gSXRlcmF0b3IgYWNjZXNzIHRvIHRoZSBkZXNpZ25hdG9ycy4KKyAgbGx2bTo6TXV0YWJsZUFycmF5UmVmPERlc2lnbmF0b3I+IGRlc2lnbmF0b3JzKCkgeworICAgIHJldHVybiB7RGVzaWduYXRvcnMsIE51bURlc2lnbmF0b3JzfTsKKyAgfQorCisgIGxsdm06OkFycmF5UmVmPERlc2lnbmF0b3I+IGRlc2lnbmF0b3JzKCkgY29uc3QgeworICAgIHJldHVybiB7RGVzaWduYXRvcnMsIE51bURlc2lnbmF0b3JzfTsKKyAgfQorCisgIERlc2lnbmF0b3IgKmdldERlc2lnbmF0b3IodW5zaWduZWQgSWR4KSB7IHJldHVybiAmZGVzaWduYXRvcnMoKVtJZHhdOyB9CisgIGNvbnN0IERlc2lnbmF0b3IgKmdldERlc2lnbmF0b3IodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgcmV0dXJuICZkZXNpZ25hdG9ycygpW0lkeF07CisgIH0KKworICB2b2lkIHNldERlc2lnbmF0b3JzKGNvbnN0IEFTVENvbnRleHQgJkMsIGNvbnN0IERlc2lnbmF0b3IgKkRlc2lncywKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1EZXNpZ3MpOworCisgIEV4cHIgKmdldEFycmF5SW5kZXgoY29uc3QgRGVzaWduYXRvciAmRCkgY29uc3Q7CisgIEV4cHIgKmdldEFycmF5UmFuZ2VTdGFydChjb25zdCBEZXNpZ25hdG9yICZEKSBjb25zdDsKKyAgRXhwciAqZ2V0QXJyYXlSYW5nZUVuZChjb25zdCBEZXNpZ25hdG9yICZEKSBjb25zdDsKKworICAvLy8gQGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgJz0nIHRoYXQgcHJlY2VkZXMgdGhlCisgIC8vLyBpbml0aWFsaXplciB2YWx1ZSBpdHNlbGYsIGlmIHByZXNlbnQuCisgIFNvdXJjZUxvY2F0aW9uIGdldEVxdWFsT3JDb2xvbkxvYygpIGNvbnN0IHsgcmV0dXJuIEVxdWFsT3JDb2xvbkxvYzsgfQorICB2b2lkIHNldEVxdWFsT3JDb2xvbkxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IEVxdWFsT3JDb2xvbkxvYyA9IEw7IH0KKworICAvLy8gQGJyaWVmIERldGVybWluZXMgd2hldGhlciB0aGlzIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgdXNlZCB0aGUKKyAgLy8vIGRlcHJlY2F0ZWQgR05VIHN5bnRheCBmb3IgZGVzaWduYXRlZCBpbml0aWFsaXplcnMuCisgIGJvb2wgdXNlc0dOVVN5bnRheCgpIGNvbnN0IHsgcmV0dXJuIEdOVVN5bnRheDsgfQorICB2b2lkIHNldEdOVVN5bnRheChib29sIEdOVSkgeyBHTlVTeW50YXggPSBHTlU7IH0KKworICAvLy8gQGJyaWVmIFJldHJpZXZlIHRoZSBpbml0aWFsaXplciB2YWx1ZS4KKyAgRXhwciAqZ2V0SW5pdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxFeHByPigqY29uc3RfY2FzdDxEZXNpZ25hdGVkSW5pdEV4cHIqPih0aGlzKS0+Y2hpbGRfYmVnaW4oKSk7CisgIH0KKworICB2b2lkIHNldEluaXQoRXhwciAqaW5pdCkgeworICAgICpjaGlsZF9iZWdpbigpID0gaW5pdDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHRvdGFsIG51bWJlciBvZiBzdWJleHByZXNzaW9ucyBpbiB0aGlzCisgIC8vLyBkZXNpZ25hdGVkIGluaXRpYWxpemVyIGV4cHJlc3Npb24sIGluY2x1ZGluZyB0aGUgYWN0dWFsCisgIC8vLyBpbml0aWFsaXplZCB2YWx1ZSBhbmQgYW55IGV4cHJlc3Npb25zIHRoYXQgb2NjdXIgd2l0aGluIGFycmF5CisgIC8vLyBhbmQgYXJyYXktcmFuZ2UgZGVzaWduYXRvcnMuCisgIHVuc2lnbmVkIGdldE51bVN1YkV4cHJzKCkgY29uc3QgeyByZXR1cm4gTnVtU3ViRXhwcnM7IH0KKworICBFeHByICpnZXRTdWJFeHByKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGFzc2VydChJZHggPCBOdW1TdWJFeHBycyAmJiAiU3Vic2NyaXB0IG91dCBvZiByYW5nZSIpOworICAgIHJldHVybiBjYXN0PEV4cHI+KGdldFRyYWlsaW5nT2JqZWN0czxTdG10ICo+KClbSWR4XSk7CisgIH0KKworICB2b2lkIHNldFN1YkV4cHIodW5zaWduZWQgSWR4LCBFeHByICpFKSB7CisgICAgYXNzZXJ0KElkeCA8IE51bVN1YkV4cHJzICYmICJTdWJzY3JpcHQgb3V0IG9mIHJhbmdlIik7CisgICAgZ2V0VHJhaWxpbmdPYmplY3RzPFN0bXQgKj4oKVtJZHhdID0gRTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVwbGFjZXMgdGhlIGRlc2lnbmF0b3IgYXQgaW5kZXggQHAgSWR4IHdpdGggdGhlIHNlcmllcworICAvLy8gb2YgZGVzaWduYXRvcnMgaW4gW0ZpcnN0LCBMYXN0KS4KKyAgdm9pZCBFeHBhbmREZXNpZ25hdG9yKGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2lnbmF0b3IgKkZpcnN0LCBjb25zdCBEZXNpZ25hdG9yICpMYXN0KTsKKworICBTb3VyY2VSYW5nZSBnZXREZXNpZ25hdG9yc1NvdXJjZVJhbmdlKCkgY29uc3Q7CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZOworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBEZXNpZ25hdGVkSW5pdEV4cHJDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICBTdG10ICoqYmVnaW4gPSBnZXRUcmFpbGluZ09iamVjdHM8U3RtdCAqPigpOworICAgIHJldHVybiBjaGlsZF9yYW5nZShiZWdpbiwgYmVnaW4gKyBOdW1TdWJFeHBycyk7CisgIH0KKyAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7CisgICAgU3RtdCAqIGNvbnN0ICpiZWdpbiA9IGdldFRyYWlsaW5nT2JqZWN0czxTdG10ICo+KCk7CisgICAgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKGJlZ2luLCBiZWdpbiArIE51bVN1YkV4cHJzKTsKKyAgfQorCisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBwbGFjZS1ob2xkZXIgZm9yIGFuIG9iamVjdCBub3QgdG8gYmUgaW5pdGlhbGl6ZWQgYnkKKy8vLyBhbnl0aGluZy4KKy8vLworLy8vIFRoaXMgb25seSBtYWtlcyBzZW5zZSB3aGVuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhbiB1cGRhdGVyIG9mIGEKKy8vLyBEZXNpZ25hdGVkSW5pdFVwZGF0ZUV4cHIgKHNlZSBiZWxvdykuIFRoZSBiYXNlIGV4cHJlc3Npb24gb2YgYSBESVVFCisvLy8gaW5pdGlhbGl6ZXMgYSBiaWcgb2JqZWN0LCBhbmQgdGhlIE5vSW5pdEV4cHIncyBtYXJrIHRoZSBzcG90cyB3aXRoaW4gdGhlCisvLy8gYmlnIG9iamVjdCBub3QgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIHVwZGF0ZXIuCisvLy8KKy8vLyBcc2VlIERlc2lnbmF0ZWRJbml0VXBkYXRlRXhwcgorY2xhc3MgTm9Jbml0RXhwciA6IHB1YmxpYyBFeHByIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgTm9Jbml0RXhwcihRdWFsVHlwZSB0eSkKKyAgICA6IEV4cHIoTm9Jbml0RXhwckNsYXNzLCB0eSwgVktfUlZhbHVlLCBPS19PcmRpbmFyeSwKKyAgICAgICAgICAgZmFsc2UsIGZhbHNlLCB0eS0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpLCBmYWxzZSkgeyB9CisKKyAgZXhwbGljaXQgTm9Jbml0RXhwcihFbXB0eVNoZWxsIEVtcHR5KQorICAgIDogRXhwcihOb0luaXRFeHByQ2xhc3MsIEVtcHR5KSB7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gTm9Jbml0RXhwckNsYXNzOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFNvdXJjZUxvY2F0aW9uKCk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBTb3VyY2VMb2NhdGlvbigpOyB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorICBjb25zdF9jaGlsZF9yYW5nZSBjaGlsZHJlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2hpbGRfcmFuZ2UoY29uc3RfY2hpbGRfaXRlcmF0b3IoKSwgY29uc3RfY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KK307CisKKy8vIEluIGNhc2VzIGxpa2U6CisvLyAgIHN0cnVjdCBRIHsgaW50IGEsIGIsIGM7IH07CisvLyAgIFEgKmdldFEoKTsKKy8vICAgdm9pZCBmb28oKSB7CisvLyAgICAgc3RydWN0IEEgeyBRIHE7IH0gYSA9IHsgKmdldFEoKSwgLnEuYiA9IDMgfTsKKy8vICAgfQorLy8KKy8vIFdlIHdpbGwgaGF2ZSBhbiBJbml0TGlzdEV4cHIgZm9yIGEsIHdpdGggdHlwZSBBLCBhbmQgdGhlbiBhCisvLyBEZXNpZ25hdGVkSW5pdFVwZGF0ZUV4cHIgZm9yICJhLnEiIHdpdGggdHlwZSBRLiBUaGUgImJhc2UiIGZvciB0aGlzIERJVUUKKy8vIGlzIHRoZSBjYWxsIGV4cHJlc3Npb24gKmdldFEoKTsgdGhlICJ1cGRhdGVyIiBmb3IgdGhlIERJVUUgaXMgIi5xLmIgPSAzIgorLy8KK2NsYXNzIERlc2lnbmF0ZWRJbml0VXBkYXRlRXhwciA6IHB1YmxpYyBFeHByIHsKKyAgLy8gQmFzZUFuZFVwZGF0ZXJFeHByc1swXSBpcyB0aGUgYmFzZSBleHByZXNzaW9uOworICAvLyBCYXNlQW5kVXBkYXRlckV4cHJzWzFdIGlzIGFuIEluaXRMaXN0RXhwciBvdmVyd3JpdGluZyBwYXJ0IG9mIHRoZSBiYXNlLgorICBTdG10ICpCYXNlQW5kVXBkYXRlckV4cHJzWzJdOworCitwdWJsaWM6CisgIERlc2lnbmF0ZWRJbml0VXBkYXRlRXhwcihjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBsQnJhY2VMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpiYXNlRXhwcnMsIFNvdXJjZUxvY2F0aW9uIHJCcmFjZUxvYyk7CisKKyAgZXhwbGljaXQgRGVzaWduYXRlZEluaXRVcGRhdGVFeHByKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgOiBFeHByKERlc2lnbmF0ZWRJbml0VXBkYXRlRXhwckNsYXNzLCBFbXB0eSkgeyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZOworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBEZXNpZ25hdGVkSW5pdFVwZGF0ZUV4cHJDbGFzczsKKyAgfQorCisgIEV4cHIgKmdldEJhc2UoKSBjb25zdCB7IHJldHVybiBjYXN0PEV4cHI+KEJhc2VBbmRVcGRhdGVyRXhwcnNbMF0pOyB9CisgIHZvaWQgc2V0QmFzZShFeHByICpCYXNlKSB7IEJhc2VBbmRVcGRhdGVyRXhwcnNbMF0gPSBCYXNlOyB9CisKKyAgSW5pdExpc3RFeHByICpnZXRVcGRhdGVyKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PEluaXRMaXN0RXhwcj4oQmFzZUFuZFVwZGF0ZXJFeHByc1sxXSk7CisgIH0KKyAgdm9pZCBzZXRVcGRhdGVyKEV4cHIgKlVwZGF0ZXIpIHsgQmFzZUFuZFVwZGF0ZXJFeHByc1sxXSA9IFVwZGF0ZXI7IH0KKworICAvLyBJdGVyYXRvcnMKKyAgLy8gY2hpbGRyZW4gPSB0aGUgYmFzZSBhbmQgdGhlIHVwZGF0ZXIKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKCZCYXNlQW5kVXBkYXRlckV4cHJzWzBdLCAmQmFzZUFuZFVwZGF0ZXJFeHByc1swXSArIDIpOworICB9CisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jaGlsZF9yYW5nZSgmQmFzZUFuZFVwZGF0ZXJFeHByc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJhc2VBbmRVcGRhdGVyRXhwcnNbMF0gKyAyKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgbG9vcCBpbml0aWFsaXppbmcgdGhlIGVsZW1lbnRzIG9mIGFuIGFycmF5LgorLy8vCisvLy8gVGhlIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZWxlbWVudHMgb2YgYW4gYXJyYXkgb2NjdXJzIGluIGEgbnVtYmVyIG9mCisvLy8gY29udGV4dHM6CisvLy8KKy8vLyAgKiBpbiB0aGUgaW1wbGljaXQgY29weS9tb3ZlIGNvbnN0cnVjdG9yIGZvciBhIGNsYXNzIHdpdGggYW4gYXJyYXkgbWVtYmVyCisvLy8gICogd2hlbiBhIGxhbWJkYS1leHByZXNzaW9uIGNhcHR1cmVzIGFuIGFycmF5IGJ5IHZhbHVlCisvLy8gICogd2hlbiBhIGRlY29tcG9zaXRpb24gZGVjbGFyYXRpb24gZGVjb21wb3NlcyBhbiBhcnJheQorLy8vCisvLy8gVGhlcmUgYXJlIHR3byBzdWJleHByZXNzaW9uczogYSBjb21tb24gZXhwcmVzc2lvbiAodGhlIHNvdXJjZSBhcnJheSkKKy8vLyB0aGF0IGlzIGV2YWx1YXRlZCBvbmNlIHVwLWZyb250LCBhbmQgYSBwZXItZWxlbWVudCBpbml0aWFsaXplciB0aGF0CisvLy8gcnVucyBvbmNlIGZvciBlYWNoIGFycmF5IGVsZW1lbnQuCisvLy8KKy8vLyBXaXRoaW4gdGhlIHBlci1lbGVtZW50IGluaXRpYWxpemVyLCB0aGUgY29tbW9uIGV4cHJlc3Npb24gbWF5IGJlIHJlZmVyZW5jZWQKKy8vLyB2aWEgYW4gT3BhcXVlVmFsdWVFeHByLCBhbmQgdGhlIGN1cnJlbnQgaW5kZXggbWF5IGJlIG9idGFpbmVkIHZpYSBhbgorLy8vIEFycmF5SW5pdEluZGV4RXhwci4KK2NsYXNzIEFycmF5SW5pdExvb3BFeHByIDogcHVibGljIEV4cHIgeworICBTdG10ICpTdWJFeHByc1syXTsKKworICBleHBsaWNpdCBBcnJheUluaXRMb29wRXhwcihFbXB0eVNoZWxsIEVtcHR5KQorICAgICAgOiBFeHByKEFycmF5SW5pdExvb3BFeHByQ2xhc3MsIEVtcHR5KSwgU3ViRXhwcnN7fSB7fQorCitwdWJsaWM6CisgIGV4cGxpY2l0IEFycmF5SW5pdExvb3BFeHByKFF1YWxUeXBlIFQsIEV4cHIgKkNvbW1vbkluaXQsIEV4cHIgKkVsZW1lbnRJbml0KQorICAgICAgOiBFeHByKEFycmF5SW5pdExvb3BFeHByQ2xhc3MsIFQsIFZLX1JWYWx1ZSwgT0tfT3JkaW5hcnksIGZhbHNlLAorICAgICAgICAgICAgIENvbW1vbkluaXQtPmlzVmFsdWVEZXBlbmRlbnQoKSB8fCBFbGVtZW50SW5pdC0+aXNWYWx1ZURlcGVuZGVudCgpLAorICAgICAgICAgICAgIFQtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudFR5cGUoKSwKKyAgICAgICAgICAgICBDb21tb25Jbml0LT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkgfHwKKyAgICAgICAgICAgICAgICAgRWxlbWVudEluaXQtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIFN1YkV4cHJze0NvbW1vbkluaXQsIEVsZW1lbnRJbml0fSB7fQorCisgIC8vLyBHZXQgdGhlIGNvbW1vbiBzdWJleHByZXNzaW9uIHNoYXJlZCBieSBhbGwgaW5pdGlhbGl6YXRpb25zICh0aGUgc291cmNlCisgIC8vLyBhcnJheSkuCisgIE9wYXF1ZVZhbHVlRXhwciAqZ2V0Q29tbW9uRXhwcigpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxPcGFxdWVWYWx1ZUV4cHI+KFN1YkV4cHJzWzBdKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGluaXRpYWxpemVyIHRvIHVzZSBmb3IgZWFjaCBhcnJheSBlbGVtZW50LgorICBFeHByICpnZXRTdWJFeHByKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByc1sxXSk7IH0KKworICBsbHZtOjpBUEludCBnZXRBcnJheVNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnRBcnJheVR5cGU+KGdldFR5cGUoKS0+Y2FzdEFzQXJyYXlUeXBlVW5zYWZlKCkpCisgICAgICAgIC0+Z2V0U2l6ZSgpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpTKSB7CisgICAgcmV0dXJuIFMtPmdldFN0bXRDbGFzcygpID09IEFycmF5SW5pdExvb3BFeHByQ2xhc3M7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBnZXRDb21tb25FeHByKCktPmdldExvY1N0YXJ0KCk7CisgIH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGdldENvbW1vbkV4cHIoKS0+Z2V0TG9jRW5kKCk7CisgIH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoU3ViRXhwcnMsIFN1YkV4cHJzICsgMik7CisgIH0KKyAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKFN1YkV4cHJzLCBTdWJFeHBycyArIDIpOworICB9CisKKyAgZnJpZW5kIGNsYXNzIEFTVFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10V3JpdGVyOworfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBlbGVtZW50IG9mIGFuIGFycmF5IGJlaW5nCisvLy8gaW5pdGlhbGl6ZWQgYnkgYW4gQXJyYXlJbml0TG9vcEV4cHIuIFRoaXMgY2FuIG9ubHkgYXBwZWFyIHdpdGhpbiB0aGUKKy8vLyBzdWJleHByZXNzaW9uIG9mIGFuIEFycmF5SW5pdExvb3BFeHByLgorY2xhc3MgQXJyYXlJbml0SW5kZXhFeHByIDogcHVibGljIEV4cHIgeworICBleHBsaWNpdCBBcnJheUluaXRJbmRleEV4cHIoRW1wdHlTaGVsbCBFbXB0eSkKKyAgICAgIDogRXhwcihBcnJheUluaXRJbmRleEV4cHJDbGFzcywgRW1wdHkpIHt9CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgQXJyYXlJbml0SW5kZXhFeHByKFF1YWxUeXBlIFQpCisgICAgICA6IEV4cHIoQXJyYXlJbml0SW5kZXhFeHByQ2xhc3MsIFQsIFZLX1JWYWx1ZSwgT0tfT3JkaW5hcnksCisgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpTKSB7CisgICAgcmV0dXJuIFMtPmdldFN0bXRDbGFzcygpID09IEFycmF5SW5pdEluZGV4RXhwckNsYXNzOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFNvdXJjZUxvY2F0aW9uKCk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBTb3VyY2VMb2NhdGlvbigpOyB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9CisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jaGlsZF9yYW5nZShjb25zdF9jaGlsZF9pdGVyYXRvcigpLCBjb25zdF9jaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorCisgIGZyaWVuZCBjbGFzcyBBU1RSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGFuIGltcGxpY2l0bHktZ2VuZXJhdGVkIHZhbHVlIGluaXRpYWxpemF0aW9uIG9mCisvLy8gYW4gb2JqZWN0IG9mIGEgZ2l2ZW4gdHlwZS4KKy8vLworLy8vIEltcGxpY2l0IHZhbHVlIGluaXRpYWxpemF0aW9ucyBvY2N1ciB3aXRoaW4gc2VtYW50aWMgaW5pdGlhbGl6ZXIKKy8vLyBsaXN0IGV4cHJlc3Npb25zIChJbml0TGlzdEV4cHIpIGFzIHBsYWNlaG9sZGVycyBmb3Igc3Vib2JqZWN0CisvLy8gaW5pdGlhbGl6YXRpb25zIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCBieSB0aGUgdXNlci4KKy8vLworLy8vIFxzZWUgSW5pdExpc3RFeHByCitjbGFzcyBJbXBsaWNpdFZhbHVlSW5pdEV4cHIgOiBwdWJsaWMgRXhwciB7CitwdWJsaWM6CisgIGV4cGxpY2l0IEltcGxpY2l0VmFsdWVJbml0RXhwcihRdWFsVHlwZSB0eSkKKyAgICA6IEV4cHIoSW1wbGljaXRWYWx1ZUluaXRFeHByQ2xhc3MsIHR5LCBWS19SVmFsdWUsIE9LX09yZGluYXJ5LAorICAgICAgICAgICBmYWxzZSwgZmFsc2UsIHR5LT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnRUeXBlKCksIGZhbHNlKSB7IH0KKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBlbXB0eSBpbXBsaWNpdCB2YWx1ZSBpbml0aWFsaXphdGlvbi4KKyAgZXhwbGljaXQgSW1wbGljaXRWYWx1ZUluaXRFeHByKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgOiBFeHByKEltcGxpY2l0VmFsdWVJbml0RXhwckNsYXNzLCBFbXB0eSkgeyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IEltcGxpY2l0VmFsdWVJbml0RXhwckNsYXNzOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFNvdXJjZUxvY2F0aW9uKCk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBTb3VyY2VMb2NhdGlvbigpOyB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorICBjb25zdF9jaGlsZF9yYW5nZSBjaGlsZHJlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2hpbGRfcmFuZ2UoY29uc3RfY2hpbGRfaXRlcmF0b3IoKSwgY29uc3RfY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KK307CisKK2NsYXNzIFBhcmVuTGlzdEV4cHIgOiBwdWJsaWMgRXhwciB7CisgIFN0bXQgKipFeHByczsKKyAgdW5zaWduZWQgTnVtRXhwcnM7CisgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywgUlBhcmVuTG9jOworCitwdWJsaWM6CisgIFBhcmVuTGlzdEV4cHIoY29uc3QgQVNUQ29udGV4dCYgQywgU291cmNlTG9jYXRpb24gbHBhcmVubG9jLAorICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIqPiBleHBycywgU291cmNlTG9jYXRpb24gcnBhcmVubG9jKTsKKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IHBhcmVuIGxpc3QuCisgIGV4cGxpY2l0IFBhcmVuTGlzdEV4cHIoRW1wdHlTaGVsbCBFbXB0eSkgOiBFeHByKFBhcmVuTGlzdEV4cHJDbGFzcywgRW1wdHkpIHsgfQorCisgIHVuc2lnbmVkIGdldE51bUV4cHJzKCkgY29uc3QgeyByZXR1cm4gTnVtRXhwcnM7IH0KKworICBjb25zdCBFeHByKiBnZXRFeHByKHVuc2lnbmVkIEluaXQpIGNvbnN0IHsKKyAgICBhc3NlcnQoSW5pdCA8IGdldE51bUV4cHJzKCkgJiYgIkluaXRpYWxpemVyIGFjY2VzcyBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxFeHByPihFeHByc1tJbml0XSk7CisgIH0KKworICBFeHByKiBnZXRFeHByKHVuc2lnbmVkIEluaXQpIHsKKyAgICBhc3NlcnQoSW5pdCA8IGdldE51bUV4cHJzKCkgJiYgIkluaXRpYWxpemVyIGFjY2VzcyBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxFeHByPihFeHByc1tJbml0XSk7CisgIH0KKworICBFeHByICoqZ2V0RXhwcnMoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PEV4cHIgKio+KEV4cHJzKTsgfQorCisgIEFycmF5UmVmPEV4cHIgKj4gZXhwcnMoKSB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZihnZXRFeHBycygpLCBnZXROdW1FeHBycygpKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIExQYXJlbkxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRSUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gTFBhcmVuTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUlBhcmVuTG9jOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IFBhcmVuTGlzdEV4cHJDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoJkV4cHJzWzBdLCAmRXhwcnNbMF0rTnVtRXhwcnMpOworICB9CisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jaGlsZF9yYW5nZSgmRXhwcnNbMF0sICZFeHByc1swXSArIE51bUV4cHJzKTsKKyAgfQorCisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNUU3RtdFdyaXRlcjsKK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIEMxMSBnZW5lcmljIHNlbGVjdGlvbi4KKy8vLworLy8vIEEgZ2VuZXJpYyBzZWxlY3Rpb24gKEMxMSA2LjUuMS4xKSBjb250YWlucyBhbiB1bmV2YWx1YXRlZCBjb250cm9sbGluZworLy8vIGV4cHJlc3Npb24sIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGdlbmVyaWMgYXNzb2NpYXRpb25zLiAgRWFjaCBnZW5lcmljCisvLy8gYXNzb2NpYXRpb24gc3BlY2lmaWVzIGEgdHlwZSBuYW1lIGFuZCBhbiBleHByZXNzaW9uLCBvciAiZGVmYXVsdCIgYW5kIGFuCisvLy8gZXhwcmVzc2lvbiAoaW4gd2hpY2ggY2FzZSBpdCBpcyBrbm93biBhcyBhIGRlZmF1bHQgZ2VuZXJpYyBhc3NvY2lhdGlvbikuCisvLy8gVGhlIHR5cGUgYW5kIHZhbHVlIG9mIHRoZSBnZW5lcmljIHNlbGVjdGlvbiBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIG9mIGl0cworLy8vIHJlc3VsdCBleHByZXNzaW9uLCB3aGljaCBpcyBkZWZpbmVkIGFzIHRoZSBleHByZXNzaW9uIGluIHRoZSBnZW5lcmljCisvLy8gYXNzb2NpYXRpb24gd2l0aCBhIHR5cGUgbmFtZSB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgdHlwZSBvZiB0aGUKKy8vLyBjb250cm9sbGluZyBleHByZXNzaW9uLCBvciB0aGUgZXhwcmVzc2lvbiBpbiB0aGUgZGVmYXVsdCBnZW5lcmljIGFzc29jaWF0aW9uCisvLy8gaWYgbm8gdHlwZXMgYXJlIGNvbXBhdGlibGUuICBGb3IgZXhhbXBsZToKKy8vLworLy8vIEBjb2RlCisvLy8gX0dlbmVyaWMoWCwgZG91YmxlOiAxLCBmbG9hdDogMiwgZGVmYXVsdDogMykKKy8vLyBAZW5kY29kZQorLy8vCisvLy8gVGhlIGFib3ZlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIDEgaWYgMS4wIGlzIHN1YnN0aXR1dGVkIGZvciBYLCAyIGlmIDEuMGYKKy8vLyBvciAzIGlmICJoZWxsbyIuCisvLy8KKy8vLyBBcyBhbiBleHRlbnNpb24sIGdlbmVyaWMgc2VsZWN0aW9ucyBhcmUgYWxsb3dlZCBpbiBDKyssIHdoZXJlIHRoZSBmb2xsb3dpbmcKKy8vLyBhZGRpdGlvbmFsIHNlbWFudGljcyBhcHBseToKKy8vLworLy8vIEFueSBnZW5lcmljIHNlbGVjdGlvbiB3aG9zZSBjb250cm9sbGluZyBleHByZXNzaW9uIGlzIHR5cGUtZGVwZW5kZW50IG9yCisvLy8gd2hpY2ggbmFtZXMgYSBkZXBlbmRlbnQgdHlwZSBpbiBpdHMgYXNzb2NpYXRpb24gbGlzdCBpcyByZXN1bHQtZGVwZW5kZW50LAorLy8vIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGNob2ljZSBvZiByZXN1bHQgZXhwcmVzc2lvbiBpcyBkZXBlbmRlbnQuCisvLy8gUmVzdWx0LWRlcGVuZGVudCBnZW5lcmljIGFzc29jaWF0aW9ucyBhcmUgYm90aCB0eXBlLSBhbmQgdmFsdWUtZGVwZW5kZW50LgorY2xhc3MgR2VuZXJpY1NlbGVjdGlvbkV4cHIgOiBwdWJsaWMgRXhwciB7CisgIGVudW0geyBDT05UUk9MTElORywgRU5EX0VYUFIgfTsKKyAgVHlwZVNvdXJjZUluZm8gKipBc3NvY1R5cGVzOworICBTdG10ICoqU3ViRXhwcnM7CisgIHVuc2lnbmVkIE51bUFzc29jcywgUmVzdWx0SW5kZXg7CisgIFNvdXJjZUxvY2F0aW9uIEdlbmVyaWNMb2MsIERlZmF1bHRMb2MsIFJQYXJlbkxvYzsKKworcHVibGljOgorICBHZW5lcmljU2VsZWN0aW9uRXhwcihjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBHZW5lcmljTG9jLCBFeHByICpDb250cm9sbGluZ0V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFR5cGVTb3VyY2VJbmZvKj4gQXNzb2NUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwcio+IEFzc29jRXhwcnMsCisgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIERlZmF1bHRMb2MsIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZXN1bHRJbmRleCk7CisKKyAgLy8vIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBpbiB0aGUgcmVzdWx0LWRlcGVuZGVudCBjYXNlLgorICBHZW5lcmljU2VsZWN0aW9uRXhwcihjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBHZW5lcmljTG9jLCBFeHByICpDb250cm9sbGluZ0V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFR5cGVTb3VyY2VJbmZvKj4gQXNzb2NUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwcio+IEFzc29jRXhwcnMsCisgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIERlZmF1bHRMb2MsIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKTsKKworICBleHBsaWNpdCBHZW5lcmljU2VsZWN0aW9uRXhwcihFbXB0eVNoZWxsIEVtcHR5KQorICAgIDogRXhwcihHZW5lcmljU2VsZWN0aW9uRXhwckNsYXNzLCBFbXB0eSkgeyB9CisKKyAgdW5zaWduZWQgZ2V0TnVtQXNzb2NzKCkgY29uc3QgeyByZXR1cm4gTnVtQXNzb2NzOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0R2VuZXJpY0xvYygpIGNvbnN0IHsgcmV0dXJuIEdlbmVyaWNMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0RGVmYXVsdExvYygpIGNvbnN0IHsgcmV0dXJuIERlZmF1bHRMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0UlBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gUlBhcmVuTG9jOyB9CisKKyAgY29uc3QgRXhwciAqZ2V0QXNzb2NFeHByKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByc1tFTkRfRVhQUitpXSk7CisgIH0KKyAgRXhwciAqZ2V0QXNzb2NFeHByKHVuc2lnbmVkIGkpIHsgcmV0dXJuIGNhc3Q8RXhwcj4oU3ViRXhwcnNbRU5EX0VYUFIraV0pOyB9CisgIEFycmF5UmVmPEV4cHIgKj4gZ2V0QXNzb2NFeHBycygpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtQXNzb2NzCisgICAgICAgICAgICAgICA/IGxsdm06Om1ha2VBcnJheVJlZigKKyAgICAgICAgICAgICAgICAgICAgICZyZWludGVycHJldF9jYXN0PEV4cHIgKio+KFN1YkV4cHJzKVtFTkRfRVhQUl0sIE51bUFzc29jcykKKyAgICAgICAgICAgICAgIDogTm9uZTsKKyAgfQorICBjb25zdCBUeXBlU291cmNlSW5mbyAqZ2V0QXNzb2NUeXBlU291cmNlSW5mbyh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgcmV0dXJuIEFzc29jVHlwZXNbaV07CisgIH0KKyAgVHlwZVNvdXJjZUluZm8gKmdldEFzc29jVHlwZVNvdXJjZUluZm8odW5zaWduZWQgaSkgeyByZXR1cm4gQXNzb2NUeXBlc1tpXTsgfQorICBBcnJheVJlZjxUeXBlU291cmNlSW5mbyAqPiBnZXRBc3NvY1R5cGVTb3VyY2VJbmZvcygpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtQXNzb2NzID8gbGx2bTo6bWFrZUFycmF5UmVmKCZBc3NvY1R5cGVzWzBdLCBOdW1Bc3NvY3MpIDogTm9uZTsKKyAgfQorCisgIFF1YWxUeXBlIGdldEFzc29jVHlwZSh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgaWYgKGNvbnN0IFR5cGVTb3VyY2VJbmZvICpUUyA9IGdldEFzc29jVHlwZVNvdXJjZUluZm8oaSkpCisgICAgICByZXR1cm4gVFMtPmdldFR5cGUoKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gUXVhbFR5cGUoKTsKKyAgfQorCisgIGNvbnN0IEV4cHIgKmdldENvbnRyb2xsaW5nRXhwcigpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByc1tDT05UUk9MTElOR10pOworICB9CisgIEV4cHIgKmdldENvbnRyb2xsaW5nRXhwcigpIHsgcmV0dXJuIGNhc3Q8RXhwcj4oU3ViRXhwcnNbQ09OVFJPTExJTkddKTsgfQorCisgIC8vLyBXaGV0aGVyIHRoaXMgZ2VuZXJpYyBzZWxlY3Rpb24gaXMgcmVzdWx0LWRlcGVuZGVudC4KKyAgYm9vbCBpc1Jlc3VsdERlcGVuZGVudCgpIGNvbnN0IHsgcmV0dXJuIFJlc3VsdEluZGV4ID09IC0xVTsgfQorCisgIC8vLyBUaGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgcmVzdWx0IGV4cHJlc3Npb24ncyBnZW5lcmljIGFzc29jaWF0aW9uIGluCisgIC8vLyB0aGUgZ2VuZXJpYyBzZWxlY3Rpb24ncyBhc3NvY2lhdGlvbiBsaXN0LiAgRGVmaW5lZCBvbmx5IGlmIHRoZQorICAvLy8gZ2VuZXJpYyBzZWxlY3Rpb24gaXMgbm90IHJlc3VsdC1kZXBlbmRlbnQuCisgIHVuc2lnbmVkIGdldFJlc3VsdEluZGV4KCkgY29uc3QgeworICAgIGFzc2VydCghaXNSZXN1bHREZXBlbmRlbnQoKSAmJiAiR2VuZXJpYyBzZWxlY3Rpb24gaXMgcmVzdWx0LWRlcGVuZGVudCIpOworICAgIHJldHVybiBSZXN1bHRJbmRleDsKKyAgfQorCisgIC8vLyBUaGUgZ2VuZXJpYyBzZWxlY3Rpb24ncyByZXN1bHQgZXhwcmVzc2lvbi4gIERlZmluZWQgb25seSBpZiB0aGUKKyAgLy8vIGdlbmVyaWMgc2VsZWN0aW9uIGlzIG5vdCByZXN1bHQtZGVwZW5kZW50LgorICBjb25zdCBFeHByICpnZXRSZXN1bHRFeHByKCkgY29uc3QgeyByZXR1cm4gZ2V0QXNzb2NFeHByKGdldFJlc3VsdEluZGV4KCkpOyB9CisgIEV4cHIgKmdldFJlc3VsdEV4cHIoKSB7IHJldHVybiBnZXRBc3NvY0V4cHIoZ2V0UmVzdWx0SW5kZXgoKSk7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gR2VuZXJpY0xvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJQYXJlbkxvYzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBHZW5lcmljU2VsZWN0aW9uRXhwckNsYXNzOworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKFN1YkV4cHJzLCBTdWJFeHBycytFTkRfRVhQUitOdW1Bc3NvY3MpOworICB9CisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jaGlsZF9yYW5nZShTdWJFeHBycywgU3ViRXhwcnMgKyBFTkRfRVhQUiArIE51bUFzc29jcyk7CisgIH0KKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ2xhbmcgRXh0ZW5zaW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEV4dFZlY3RvckVsZW1lbnRFeHByIC0gVGhpcyByZXByZXNlbnRzIGFjY2VzcyB0byBzcGVjaWZpYyBlbGVtZW50cyBvZiBhCisvLy8gdmVjdG9yLCBhbmQgbWF5IG9jY3VyIG9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBvciByaWdodCBoYW5kIHNpZGUuICBGb3IgZXhhbXBsZQorLy8vIHRoZSBmb2xsb3dpbmcgaXMgbGVnYWw6ICAiVi54eSA9IFYuenciIGlmIFYgaXMgYSA0IGVsZW1lbnQgZXh0ZW5kZWQgdmVjdG9yLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoZSBiYXNlIG1heSBoYXZlIGVpdGhlciB2ZWN0b3Igb3IgcG9pbnRlciB0byB2ZWN0b3IgdHlwZSwganVzdAorLy8vIGxpa2UgYSBzdHJ1Y3QgZmllbGQgcmVmZXJlbmNlLgorLy8vCitjbGFzcyBFeHRWZWN0b3JFbGVtZW50RXhwciA6IHB1YmxpYyBFeHByIHsKKyAgU3RtdCAqQmFzZTsKKyAgSWRlbnRpZmllckluZm8gKkFjY2Vzc29yOworICBTb3VyY2VMb2NhdGlvbiBBY2Nlc3NvckxvYzsKK3B1YmxpYzoKKyAgRXh0VmVjdG9yRWxlbWVudEV4cHIoUXVhbFR5cGUgdHksIEV4cHJWYWx1ZUtpbmQgVkssIEV4cHIgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICZhY2Nlc3NvciwgU291cmNlTG9jYXRpb24gbG9jKQorICAgIDogRXhwcihFeHRWZWN0b3JFbGVtZW50RXhwckNsYXNzLCB0eSwgVkssCisgICAgICAgICAgIChWSyA9PSBWS19SVmFsdWUgPyBPS19PcmRpbmFyeSA6IE9LX1ZlY3RvckNvbXBvbmVudCksCisgICAgICAgICAgIGJhc2UtPmlzVHlwZURlcGVuZGVudCgpLCBiYXNlLT5pc1ZhbHVlRGVwZW5kZW50KCksCisgICAgICAgICAgIGJhc2UtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpLAorICAgICAgICAgICBiYXNlLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgQmFzZShiYXNlKSwgQWNjZXNzb3IoJmFjY2Vzc29yKSwgQWNjZXNzb3JMb2MobG9jKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgdmVjdG9yIGVsZW1lbnQgZXhwcmVzc2lvbi4KKyAgZXhwbGljaXQgRXh0VmVjdG9yRWxlbWVudEV4cHIoRW1wdHlTaGVsbCBFbXB0eSkKKyAgICA6IEV4cHIoRXh0VmVjdG9yRWxlbWVudEV4cHJDbGFzcywgRW1wdHkpIHsgfQorCisgIGNvbnN0IEV4cHIgKmdldEJhc2UoKSBjb25zdCB7IHJldHVybiBjYXN0PEV4cHI+KEJhc2UpOyB9CisgIEV4cHIgKmdldEJhc2UoKSB7IHJldHVybiBjYXN0PEV4cHI+KEJhc2UpOyB9CisgIHZvaWQgc2V0QmFzZShFeHByICpFKSB7IEJhc2UgPSBFOyB9CisKKyAgSWRlbnRpZmllckluZm8gJmdldEFjY2Vzc29yKCkgY29uc3QgeyByZXR1cm4gKkFjY2Vzc29yOyB9CisgIHZvaWQgc2V0QWNjZXNzb3IoSWRlbnRpZmllckluZm8gKklJKSB7IEFjY2Vzc29yID0gSUk7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRBY2Nlc3NvckxvYygpIGNvbnN0IHsgcmV0dXJuIEFjY2Vzc29yTG9jOyB9CisgIHZvaWQgc2V0QWNjZXNzb3JMb2MoU291cmNlTG9jYXRpb24gTCkgeyBBY2Nlc3NvckxvYyA9IEw7IH0KKworICAvLy8gZ2V0TnVtRWxlbWVudHMgLSBHZXQgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIGJlaW5nIHNlbGVjdGVkLgorICB1bnNpZ25lZCBnZXROdW1FbGVtZW50cygpIGNvbnN0OworCisgIC8vLyBjb250YWluc0R1cGxpY2F0ZUVsZW1lbnRzIC0gUmV0dXJuIHRydWUgaWYgYW55IGVsZW1lbnQgYWNjZXNzIGlzCisgIC8vLyByZXBlYXRlZC4KKyAgYm9vbCBjb250YWluc0R1cGxpY2F0ZUVsZW1lbnRzKCkgY29uc3Q7CisKKyAgLy8vIGdldEVuY29kZWRFbGVtZW50QWNjZXNzIC0gRW5jb2RlIHRoZSBlbGVtZW50cyBhY2Nlc3NlZCBpbnRvIGFuIGxsdm0KKyAgLy8vIGFnZ3JlZ2F0ZSBDb25zdGFudCBvZiBDb25zdGFudEludChzKS4KKyAgdm9pZCBnZXRFbmNvZGVkRWxlbWVudEFjY2VzcyhTbWFsbFZlY3RvckltcGw8dWludDMyX3Q+ICZFbHRzKSBjb25zdDsKKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBnZXRCYXNlKCktPmdldExvY1N0YXJ0KCk7CisgIH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBBY2Nlc3NvckxvYzsgfQorCisgIC8vLyBpc0Fycm93IC0gUmV0dXJuIHRydWUgaWYgdGhlIGJhc2UgZXhwcmVzc2lvbiBpcyBhIHBvaW50ZXIgdG8gdmVjdG9yLAorICAvLy8gcmV0dXJuIGZhbHNlIGlmIHRoZSBiYXNlIGV4cHJlc3Npb24gaXMgYSB2ZWN0b3IuCisgIGJvb2wgaXNBcnJvdygpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBFeHRWZWN0b3JFbGVtZW50RXhwckNsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoJkJhc2UsICZCYXNlKzEpOyB9CisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jaGlsZF9yYW5nZSgmQmFzZSwgJkJhc2UgKyAxKTsKKyAgfQorfTsKKworLy8vIEJsb2NrRXhwciAtIEFkYXB0b3IgY2xhc3MgZm9yIG1peGluZyBhIEJsb2NrRGVjbCB3aXRoIGV4cHJlc3Npb25zLgorLy8vIF57IHN0YXRlbWVudC1ib2R5IH0gICBvciAgIF4oaW50IGFyZzEsIGZsb2F0IGFyZzIpeyBzdGF0ZW1lbnQtYm9keSB9CitjbGFzcyBCbG9ja0V4cHIgOiBwdWJsaWMgRXhwciB7Citwcm90ZWN0ZWQ6CisgIEJsb2NrRGVjbCAqVGhlQmxvY2s7CitwdWJsaWM6CisgIEJsb2NrRXhwcihCbG9ja0RlY2wgKkJELCBRdWFsVHlwZSB0eSkKKyAgICA6IEV4cHIoQmxvY2tFeHByQ2xhc3MsIHR5LCBWS19SVmFsdWUsIE9LX09yZGluYXJ5LAorICAgICAgICAgICB0eS0+aXNEZXBlbmRlbnRUeXBlKCksIHR5LT5pc0RlcGVuZGVudFR5cGUoKSwKKyAgICAgICAgICAgdHktPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudFR5cGUoKSB8fCBCRC0+aXNEZXBlbmRlbnRDb250ZXh0KCksCisgICAgICAgICAgIGZhbHNlKSwKKyAgICAgIFRoZUJsb2NrKEJEKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgYmxvY2sgZXhwcmVzc2lvbi4KKyAgZXhwbGljaXQgQmxvY2tFeHByKEVtcHR5U2hlbGwgRW1wdHkpIDogRXhwcihCbG9ja0V4cHJDbGFzcywgRW1wdHkpIHsgfQorCisgIGNvbnN0IEJsb2NrRGVjbCAqZ2V0QmxvY2tEZWNsKCkgY29uc3QgeyByZXR1cm4gVGhlQmxvY2s7IH0KKyAgQmxvY2tEZWNsICpnZXRCbG9ja0RlY2woKSB7IHJldHVybiBUaGVCbG9jazsgfQorICB2b2lkIHNldEJsb2NrRGVjbChCbG9ja0RlY2wgKkJEKSB7IFRoZUJsb2NrID0gQkQ7IH0KKworICAvLyBDb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIHByb2JpbmcgdGhlIHVuZGVybHlpbmcgQmxvY2tEZWNsLgorICBTb3VyY2VMb2NhdGlvbiBnZXRDYXJldExvY2F0aW9uKCkgY29uc3Q7CisgIGNvbnN0IFN0bXQgKmdldEJvZHkoKSBjb25zdDsKKyAgU3RtdCAqZ2V0Qm9keSgpOworCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBnZXRDYXJldExvY2F0aW9uKCk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBnZXRCb2R5KCktPmdldExvY0VuZCgpOyB9CisKKyAgLy8vIGdldEZ1bmN0aW9uVHlwZSAtIFJldHVybiB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiB0eXBlIGZvciB0aGlzIGJsb2NrLgorICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqZ2V0RnVuY3Rpb25UeXBlKCkgY29uc3Q7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IEJsb2NrRXhwckNsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorICBjb25zdF9jaGlsZF9yYW5nZSBjaGlsZHJlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2hpbGRfcmFuZ2UoY29uc3RfY2hpbGRfaXRlcmF0b3IoKSwgY29uc3RfY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KK307CisKKy8vLyBBc1R5cGVFeHByIC0gQ2xhbmcgYnVpbHRpbiBmdW5jdGlvbiBfX2J1aWx0aW5fYXN0eXBlIFtPcGVuQ0wgNi4yLjQuMl0KKy8vLyBUaGlzIEFTVCBub2RlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHJlaW50ZXJwcmV0aW5nIGEgdHlwZSB0byBhbm90aGVyCisvLy8gdHlwZSBvZiB0aGUgc2FtZSBzaXplLgorY2xhc3MgQXNUeXBlRXhwciA6IHB1YmxpYyBFeHByIHsKK3ByaXZhdGU6CisgIFN0bXQgKlNyY0V4cHI7CisgIFNvdXJjZUxvY2F0aW9uIEJ1aWx0aW5Mb2MsIFJQYXJlbkxvYzsKKworICBmcmllbmQgY2xhc3MgQVNUUmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKyAgZXhwbGljaXQgQXNUeXBlRXhwcihFbXB0eVNoZWxsIEVtcHR5KSA6IEV4cHIoQXNUeXBlRXhwckNsYXNzLCBFbXB0eSkge30KKworcHVibGljOgorICBBc1R5cGVFeHByKEV4cHIqIFNyY0V4cHIsIFF1YWxUeXBlIERzdFR5cGUsCisgICAgICAgICAgICAgRXhwclZhbHVlS2luZCBWSywgRXhwck9iamVjdEtpbmQgT0ssCisgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQnVpbHRpbkxvYywgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKQorICAgIDogRXhwcihBc1R5cGVFeHByQ2xhc3MsIERzdFR5cGUsIFZLLCBPSywKKyAgICAgICAgICAgRHN0VHlwZS0+aXNEZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgIERzdFR5cGUtPmlzRGVwZW5kZW50VHlwZSgpIHx8IFNyY0V4cHItPmlzVmFsdWVEZXBlbmRlbnQoKSwKKyAgICAgICAgICAgKERzdFR5cGUtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudFR5cGUoKSB8fAorICAgICAgICAgICAgU3JjRXhwci0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCkpLAorICAgICAgICAgICAoRHN0VHlwZS0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpIHx8CisgICAgICAgICAgICBTcmNFeHByLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpKSwKKyAgU3JjRXhwcihTcmNFeHByKSwgQnVpbHRpbkxvYyhCdWlsdGluTG9jKSwgUlBhcmVuTG9jKFJQYXJlbkxvYykge30KKworICAvLy8gZ2V0U3JjRXhwciAtIFJldHVybiB0aGUgRXhwciB0byBiZSBjb252ZXJ0ZWQuCisgIEV4cHIgKmdldFNyY0V4cHIoKSBjb25zdCB7IHJldHVybiBjYXN0PEV4cHI+KFNyY0V4cHIpOyB9CisKKyAgLy8vIGdldEJ1aWx0aW5Mb2MgLSBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBfX2J1aWx0aW5fYXN0eXBlIHRva2VuLgorICBTb3VyY2VMb2NhdGlvbiBnZXRCdWlsdGluTG9jKCkgY29uc3QgeyByZXR1cm4gQnVpbHRpbkxvYzsgfQorCisgIC8vLyBnZXRSUGFyZW5Mb2MgLSBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIGZpbmFsIHJpZ2h0IHBhcmVudGhlc2lzLgorICBTb3VyY2VMb2NhdGlvbiBnZXRSUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gQnVpbHRpbkxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJQYXJlbkxvYzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBBc1R5cGVFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7IHJldHVybiBjaGlsZF9yYW5nZSgmU3JjRXhwciwgJlNyY0V4cHIrMSk7IH0KKyAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKCZTcmNFeHByLCAmU3JjRXhwciArIDEpOworICB9Cit9OworCisvLy8gUHNldWRvT2JqZWN0RXhwciAtIEFuIGV4cHJlc3Npb24gd2hpY2ggYWNjZXNzZXMgYSBwc2V1ZG8tb2JqZWN0CisvLy8gbC12YWx1ZS4gIEEgcHNldWRvLW9iamVjdCBpcyBhbiBhYnN0cmFjdCBvYmplY3QsIGFjY2Vzc2VzIHRvIHdoaWNoCisvLy8gYXJlIHRyYW5zbGF0ZWQgdG8gY2FsbHMuICBUaGUgcHNldWRvLW9iamVjdCBleHByZXNzaW9uIGhhcyBhCisvLy8gc3ludGFjdGljIGZvcm0sIHdoaWNoIHNob3dzIGhvdyB0aGUgZXhwcmVzc2lvbiB3YXMgYWN0dWFsbHkKKy8vLyB3cml0dGVuIGluIHRoZSBzb3VyY2UgY29kZSwgYW5kIGEgc2VtYW50aWMgZm9ybSwgd2hpY2ggaXMgYSBzZXJpZXMKKy8vLyBvZiBleHByZXNzaW9ucyB0byBiZSBleGVjdXRlZCBpbiBvcmRlciB3aGljaCBkZXRhaWwgaG93IHRoZQorLy8vIG9wZXJhdGlvbiBpcyBhY3R1YWxseSBldmFsdWF0ZWQuICBPcHRpb25hbGx5LCBvbmUgb2YgdGhlIHNlbWFudGljCisvLy8gZm9ybXMgbWF5IGFsc28gcHJvdmlkZSBhIHJlc3VsdCB2YWx1ZSBmb3IgdGhlIGV4cHJlc3Npb24uCisvLy8KKy8vLyBJZiBhbnkgb2YgdGhlIHNlbWFudGljLWZvcm0gZXhwcmVzc2lvbnMgaXMgYW4gT3BhcXVlVmFsdWVFeHByLAorLy8vIHRoYXQgT1ZFIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSBzb3VyY2UgZXhwcmVzc2lvbiwgYW5kIGl0IGlzIGJvdW5kCisvLy8gdG8gdGhlIHJlc3VsdCBvZiB0aGF0IHNvdXJjZSBleHByZXNzaW9uLiAgU3VjaCBPVkVzIG1heSBhcHBlYXIKKy8vLyBvbmx5IGluIHN1YnNlcXVlbnQgc2VtYW50aWMtZm9ybSBleHByZXNzaW9ucyBhbmQgYXMKKy8vLyBzdWItZXhwcmVzc2lvbnMgb2YgdGhlIHN5bnRhY3RpYyBmb3JtLgorLy8vCisvLy8gUHNldWRvT2JqZWN0RXhwciBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gYW4gb3BlcmF0aW9uIGNhbiBiZQorLy8vIHVzZWZ1bGx5IGRlc2NyaWJlZCBpbiB0ZXJtcyBvZiBmYWlybHkgc2ltcGxlIHJld3JpdGUgcnVsZXMgb24KKy8vLyBvYmplY3RzIGFuZCBmdW5jdGlvbnMgdGhhdCBhcmUgbWVhbnQgdG8gYmUgdXNlZCBieSBlbmQtZGV2ZWxvcGVycy4KKy8vLyBGb3IgZXhhbXBsZSwgdW5kZXIgdGhlIEl0YW5pdW0gQUJJLCBkeW5hbWljIGNhc3RzIGFyZSBpbXBsZW1lbnRlZAorLy8vIGFzIGEgY2FsbCB0byBhIHJ1bnRpbWUgZnVuY3Rpb24gY2FsbGVkIF9fZHluYW1pY19jYXN0OyB1c2luZyB0aGlzCisvLy8gY2xhc3MgdG8gZGVzY3JpYmUgdGhhdCB3b3VsZCBiZSBpbmFwcHJvcHJpYXRlIGJlY2F1c2UgdGhhdCBjYWxsIGlzCisvLy8gbm90IHJlYWxseSBwYXJ0IG9mIHRoZSB1c2VyLXZpc2libGUgc2VtYW50aWNzLCBhbmQgaW5zdGVhZCB0aGUKKy8vLyBjYXN0IGlzIHByb3Blcmx5IHJlZmxlY3RlZCBpbiB0aGUgQVNUIGFuZCBJUi1nZW5lcmF0aW9uIGhhcyBiZWVuCisvLy8gdGF1Z2h0IHRvIGdlbmVyYXRlIHRoZSBjYWxsIGFzIG5lY2Vzc2FyeS4gIEluIGNvbnRyYXN0LCBhbgorLy8vIE9iamVjdGl2ZS1DIHByb3BlcnR5IGFjY2VzcyBpcyBzZW1hbnRpY2FsbHkgZGVmaW5lZCB0byBiZQorLy8vIGVxdWl2YWxlbnQgdG8gYSBwYXJ0aWN1bGFyIG1lc3NhZ2Ugc2VuZCwgYW5kIHRoaXMgaXMgdmVyeSBtdWNoCisvLy8gcGFydCBvZiB0aGUgdXNlciBtb2RlbC4gIFRoZSBuYW1lIG9mIHRoaXMgY2xhc3MgZW5jb3VyYWdlcyB0aGlzCisvLy8gbW9kZWxsaW5nIGRlc2lnbi4KK2NsYXNzIFBzZXVkb09iamVjdEV4cHIgZmluYWwKKyAgICA6IHB1YmxpYyBFeHByLAorICAgICAgcHJpdmF0ZSBsbHZtOjpUcmFpbGluZ09iamVjdHM8UHNldWRvT2JqZWN0RXhwciwgRXhwciAqPiB7CisgIC8vIFBzZXVkb09iamVjdEV4cHJCaXRzLk51bVN1YkV4cHJzIC0gVGhlIG51bWJlciBvZiBzdWItZXhwcmVzc2lvbnMuCisgIC8vIEFsd2F5cyBhdCBsZWFzdCB0d28sIGJlY2F1c2UgdGhlIGZpcnN0IHN1Yi1leHByZXNzaW9uIGlzIHRoZQorICAvLyBzeW50YWN0aWMgZm9ybS4KKworICAvLyBQc2V1ZG9PYmplY3RFeHByQml0cy5SZXN1bHRJbmRleCAtIFRoZSBpbmRleCBvZiB0aGUKKyAgLy8gc3ViLWV4cHJlc3Npb24gaG9sZGluZyB0aGUgcmVzdWx0LiAgMCBtZWFucyB0aGUgcmVzdWx0IGlzIHZvaWQsCisgIC8vIHdoaWNoIGlzIHVuYW1iaWd1b3VzIGJlY2F1c2UgaXQncyB0aGUgaW5kZXggb2YgdGhlIHN5bnRhY3RpYworICAvLyBmb3JtLiAgTm90ZSB0aGF0IHRoaXMgaXMgdGhlcmVmb3JlIDEgaGlnaGVyIHRoYW4gdGhlIHZhbHVlIHBhc3NlZAorICAvLyBpbiB0byBDcmVhdGUsIHdoaWNoIGlzIGFuIGluZGV4IHdpdGhpbiB0aGUgc2VtYW50aWMgZm9ybXMuCisgIC8vIE5vdGUgYWxzbyB0aGF0IEFTVFN0bXRXcml0ZXIgYXNzdW1lcyB0aGlzIGVuY29kaW5nLgorCisgIEV4cHIgKipnZXRTdWJFeHByc0J1ZmZlcigpIHsgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxFeHByICo+KCk7IH0KKyAgY29uc3QgRXhwciAqIGNvbnN0ICpnZXRTdWJFeHByc0J1ZmZlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPEV4cHIgKj4oKTsKKyAgfQorCisgIFBzZXVkb09iamVjdEV4cHIoUXVhbFR5cGUgdHlwZSwgRXhwclZhbHVlS2luZCBWSywKKyAgICAgICAgICAgICAgICAgICBFeHByICpzeW50YWN0aWMsIEFycmF5UmVmPEV4cHIqPiBzZW1hbnRpYywKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByZXN1bHRJbmRleCk7CisKKyAgUHNldWRvT2JqZWN0RXhwcihFbXB0eVNoZWxsIHNoZWxsLCB1bnNpZ25lZCBudW1TZW1hbnRpY0V4cHJzKTsKKworICB1bnNpZ25lZCBnZXROdW1TdWJFeHBycygpIGNvbnN0IHsKKyAgICByZXR1cm4gUHNldWRvT2JqZWN0RXhwckJpdHMuTnVtU3ViRXhwcnM7CisgIH0KKworcHVibGljOgorICAvLy8gTm9SZXN1bHQgLSBBIHZhbHVlIGZvciB0aGUgcmVzdWx0IGluZGV4IGluZGljYXRpbmcgdGhhdCB0aGVyZSBpcworICAvLy8gbm8gc2VtYW50aWMgcmVzdWx0LgorICBlbnVtIDogdW5zaWduZWQgeyBOb1Jlc3VsdCA9IH4wVSB9OworCisgIHN0YXRpYyBQc2V1ZG9PYmplY3RFeHByICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwgRXhwciAqc3ludGFjdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIqPiBzZW1hbnRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByZXN1bHRJbmRleCk7CisKKyAgc3RhdGljIFBzZXVkb09iamVjdEV4cHIgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LCBFbXB0eVNoZWxsIHNoZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bVNlbWFudGljRXhwcnMpOworCisgIC8vLyBSZXR1cm4gdGhlIHN5bnRhY3RpYyBmb3JtIG9mIHRoaXMgZXhwcmVzc2lvbiwgaS5lLiB0aGUKKyAgLy8vIGV4cHJlc3Npb24gaXQgYWN0dWFsbHkgbG9va3MgbGlrZS4gIExpa2VseSB0byBiZSBleHByZXNzZWQgaW4KKyAgLy8vIHRlcm1zIG9mIE9wYXF1ZVZhbHVlRXhwcnMgYm91bmQgaW4gdGhlIHNlbWFudGljIGZvcm0uCisgIEV4cHIgKmdldFN5bnRhY3RpY0Zvcm0oKSB7IHJldHVybiBnZXRTdWJFeHByc0J1ZmZlcigpWzBdOyB9CisgIGNvbnN0IEV4cHIgKmdldFN5bnRhY3RpY0Zvcm0oKSBjb25zdCB7IHJldHVybiBnZXRTdWJFeHByc0J1ZmZlcigpWzBdOyB9CisKKyAgLy8vIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIHJlc3VsdC1iZWFyaW5nIGV4cHJlc3Npb24gaW50byB0aGUgc2VtYW50aWNzCisgIC8vLyBleHByZXNzaW9ucywgb3IgUHNldWRvT2JqZWN0RXhwcjo6Tm9SZXN1bHQgaWYgdGhlcmUgaXMgbm9uZS4KKyAgdW5zaWduZWQgZ2V0UmVzdWx0RXhwckluZGV4KCkgY29uc3QgeworICAgIGlmIChQc2V1ZG9PYmplY3RFeHByQml0cy5SZXN1bHRJbmRleCA9PSAwKSByZXR1cm4gTm9SZXN1bHQ7CisgICAgcmV0dXJuIFBzZXVkb09iamVjdEV4cHJCaXRzLlJlc3VsdEluZGV4IC0gMTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHJlc3VsdC1iZWFyaW5nIGV4cHJlc3Npb24sIG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgRXhwciAqZ2V0UmVzdWx0RXhwcigpIHsKKyAgICBpZiAoUHNldWRvT2JqZWN0RXhwckJpdHMuUmVzdWx0SW5kZXggPT0gMCkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBnZXRTdWJFeHByc0J1ZmZlcigpW1BzZXVkb09iamVjdEV4cHJCaXRzLlJlc3VsdEluZGV4XTsKKyAgfQorICBjb25zdCBFeHByICpnZXRSZXN1bHRFeHByKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PFBzZXVkb09iamVjdEV4cHIqPih0aGlzKS0+Z2V0UmVzdWx0RXhwcigpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtU2VtYW50aWNFeHBycygpIGNvbnN0IHsgcmV0dXJuIGdldE51bVN1YkV4cHJzKCkgLSAxOyB9CisKKyAgdHlwZWRlZiBFeHByICogY29uc3QgKnNlbWFudGljc19pdGVyYXRvcjsKKyAgdHlwZWRlZiBjb25zdCBFeHByICogY29uc3QgKmNvbnN0X3NlbWFudGljc19pdGVyYXRvcjsKKyAgc2VtYW50aWNzX2l0ZXJhdG9yIHNlbWFudGljc19iZWdpbigpIHsKKyAgICByZXR1cm4gZ2V0U3ViRXhwcnNCdWZmZXIoKSArIDE7CisgIH0KKyAgY29uc3Rfc2VtYW50aWNzX2l0ZXJhdG9yIHNlbWFudGljc19iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3ViRXhwcnNCdWZmZXIoKSArIDE7CisgIH0KKyAgc2VtYW50aWNzX2l0ZXJhdG9yIHNlbWFudGljc19lbmQoKSB7CisgICAgcmV0dXJuIGdldFN1YkV4cHJzQnVmZmVyKCkgKyBnZXROdW1TdWJFeHBycygpOworICB9CisgIGNvbnN0X3NlbWFudGljc19pdGVyYXRvciBzZW1hbnRpY3NfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdWJFeHByc0J1ZmZlcigpICsgZ2V0TnVtU3ViRXhwcnMoKTsKKyAgfQorCisgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHNlbWFudGljc19pdGVyYXRvcj4gc2VtYW50aWNzKCkgeworICAgIHJldHVybiBsbHZtOjptYWtlX3JhbmdlKHNlbWFudGljc19iZWdpbigpLCBzZW1hbnRpY3NfZW5kKCkpOworICB9CisgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGNvbnN0X3NlbWFudGljc19pdGVyYXRvcj4gc2VtYW50aWNzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlX3JhbmdlKHNlbWFudGljc19iZWdpbigpLCBzZW1hbnRpY3NfZW5kKCkpOworICB9CisKKyAgRXhwciAqZ2V0U2VtYW50aWNFeHByKHVuc2lnbmVkIGluZGV4KSB7CisgICAgYXNzZXJ0KGluZGV4ICsgMSA8IGdldE51bVN1YkV4cHJzKCkpOworICAgIHJldHVybiBnZXRTdWJFeHByc0J1ZmZlcigpW2luZGV4ICsgMV07CisgIH0KKyAgY29uc3QgRXhwciAqZ2V0U2VtYW50aWNFeHByKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8UHNldWRvT2JqZWN0RXhwcio+KHRoaXMpLT5nZXRTZW1hbnRpY0V4cHIoaW5kZXgpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0RXhwckxvYygpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBnZXRTeW50YWN0aWNGb3JtKCktPmdldEV4cHJMb2MoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGdldFN5bnRhY3RpY0Zvcm0oKS0+Z2V0TG9jU3RhcnQoKTsKKyAgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gZ2V0U3ludGFjdGljRm9ybSgpLT5nZXRMb2NFbmQoKTsKKyAgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIGNvbnN0X2NoaWxkX3JhbmdlIENDUiA9CisgICAgICAgIGNvbnN0X2Nhc3Q8Y29uc3QgUHNldWRvT2JqZWN0RXhwciAqPih0aGlzKS0+Y2hpbGRyZW4oKTsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoY2FzdF9hd2F5X2NvbnN0KENDUi5iZWdpbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9hd2F5X2NvbnN0KENDUi5lbmQoKSkpOworICB9CisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3QgeworICAgIFN0bXQgKmNvbnN0ICpjcyA9IGNvbnN0X2Nhc3Q8U3RtdCAqY29uc3QgKj4oCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU3RtdCAqY29uc3QgKj4oZ2V0U3ViRXhwcnNCdWZmZXIoKSkpOworICAgIHJldHVybiBjb25zdF9jaGlsZF9yYW5nZShjcywgY3MgKyBnZXROdW1TdWJFeHBycygpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBQc2V1ZG9PYmplY3RFeHByQ2xhc3M7CisgIH0KKworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKK307CisKKy8vLyBBdG9taWNFeHByIC0gVmFyaWFkaWMgYXRvbWljIGJ1aWx0aW5zOiBfX2F0b21pY19leGNoYW5nZSwgX19hdG9taWNfZmV0Y2hfKiwKKy8vLyBfX2F0b21pY19sb2FkLCBfX2F0b21pY19zdG9yZSwgYW5kIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfKiwgZm9yIHRoZQorLy8vIHNpbWlsYXJseS1uYW1lZCBDKysxMSBpbnN0cnVjdGlvbnMsIGFuZCBfX2MxMSB2YXJpYW50cyBmb3IgPHN0ZGF0b21pYy5oPiwKKy8vLyBhbmQgY29ycmVzcG9uZGluZyBfX29wZW5jbF9hdG9taWNfKiBmb3IgT3BlbkNMIDIuMC4KKy8vLyBBbGwgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIHRha2Ugb25lIHByaW1hcnkgcG9pbnRlciwgYXQgbGVhc3Qgb25lIG1lbW9yeQorLy8vIG9yZGVyLiBUaGUgaW5zdHJ1Y3Rpb25zIGZvciB3aGljaCBnZXRTY29wZU1vZGVsIHJldHVybnMgbm9uLW51bGwgdmFsdWUKKy8vLyB0YWtlIG9uZSBzeW5jaCBzY29wZS4KK2NsYXNzIEF0b21pY0V4cHIgOiBwdWJsaWMgRXhwciB7CitwdWJsaWM6CisgIGVudW0gQXRvbWljT3AgeworI2RlZmluZSBCVUlMVElOKElELCBUWVBFLCBBVFRSUykKKyNkZWZpbmUgQVRPTUlDX0JVSUxUSU4oSUQsIFRZUEUsIEFUVFJTKSBBTyAjIyBJRCwKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9CdWlsdGlucy5kZWYiCisgICAgLy8gQXZvaWQgdHJhaWxpbmcgY29tbWEKKyAgICBCSV9GaXJzdCA9IDAKKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBMb2NhdGlvbiBvZiBzdWItZXhwcmVzc2lvbnMuCisgIC8vLyBUaGUgbG9jYXRpb24gb2YgU2NvcGUgc3ViLWV4cHJlc3Npb24gaXMgTnVtU3ViRXhwcnMgLSAxLCB3aGljaCBpcworICAvLy8gbm90IGZpeGVkLCB0aGVyZWZvcmUgaXMgbm90IGRlZmluZWQgaW4gZW51bS4KKyAgZW51bSB7IFBUUiwgT1JERVIsIFZBTDEsIE9SREVSX0ZBSUwsIFZBTDIsIFdFQUssIEVORF9FWFBSIH07CisgIFN0bXQgKlN1YkV4cHJzW0VORF9FWFBSICsgMV07CisgIHVuc2lnbmVkIE51bVN1YkV4cHJzOworICBTb3VyY2VMb2NhdGlvbiBCdWlsdGluTG9jLCBSUGFyZW5Mb2M7CisgIEF0b21pY09wIE9wOworCisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworcHVibGljOgorICBBdG9taWNFeHByKFNvdXJjZUxvY2F0aW9uIEJMb2MsIEFycmF5UmVmPEV4cHIqPiBhcmdzLCBRdWFsVHlwZSB0LAorICAgICAgICAgICAgIEF0b21pY09wIG9wLCBTb3VyY2VMb2NhdGlvbiBSUCk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdGhlIHNwZWNpZmllZCBhdG9taWMgYnVpbHRpbgorICAvLy8gc2hvdWxkIGhhdmUuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXROdW1TdWJFeHBycyhBdG9taWNPcCBPcCk7CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBBdG9taWNFeHByLgorICBleHBsaWNpdCBBdG9taWNFeHByKEVtcHR5U2hlbGwgRW1wdHkpIDogRXhwcihBdG9taWNFeHByQ2xhc3MsIEVtcHR5KSB7IH0KKworICBFeHByICpnZXRQdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8RXhwcj4oU3ViRXhwcnNbUFRSXSk7CisgIH0KKyAgRXhwciAqZ2V0T3JkZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8RXhwcj4oU3ViRXhwcnNbT1JERVJdKTsKKyAgfQorICBFeHByICpnZXRTY29wZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0U2NvcGVNb2RlbCgpICYmICJObyBzY29wZSIpOworICAgIHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHJzW051bVN1YkV4cHJzIC0gMV0pOworICB9CisgIEV4cHIgKmdldFZhbDEoKSBjb25zdCB7CisgICAgaWYgKE9wID09IEFPX19jMTFfYXRvbWljX2luaXQgfHwgT3AgPT0gQU9fX29wZW5jbF9hdG9taWNfaW5pdCkKKyAgICAgIHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHJzW09SREVSXSk7CisgICAgYXNzZXJ0KE51bVN1YkV4cHJzID4gVkFMMSk7CisgICAgcmV0dXJuIGNhc3Q8RXhwcj4oU3ViRXhwcnNbVkFMMV0pOworICB9CisgIEV4cHIgKmdldE9yZGVyRmFpbCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoTnVtU3ViRXhwcnMgPiBPUkRFUl9GQUlMKTsKKyAgICByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByc1tPUkRFUl9GQUlMXSk7CisgIH0KKyAgRXhwciAqZ2V0VmFsMigpIGNvbnN0IHsKKyAgICBpZiAoT3AgPT0gQU9fX2F0b21pY19leGNoYW5nZSkKKyAgICAgIHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHJzW09SREVSX0ZBSUxdKTsKKyAgICBhc3NlcnQoTnVtU3ViRXhwcnMgPiBWQUwyKTsKKyAgICByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByc1tWQUwyXSk7CisgIH0KKyAgRXhwciAqZ2V0V2VhaygpIGNvbnN0IHsKKyAgICBhc3NlcnQoTnVtU3ViRXhwcnMgPiBXRUFLKTsKKyAgICByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByc1tXRUFLXSk7CisgIH0KKyAgUXVhbFR5cGUgZ2V0VmFsdWVUeXBlKCkgY29uc3Q7CisKKyAgQXRvbWljT3AgZ2V0T3AoKSBjb25zdCB7IHJldHVybiBPcDsgfQorICB1bnNpZ25lZCBnZXROdW1TdWJFeHBycygpIGNvbnN0IHsgcmV0dXJuIE51bVN1YkV4cHJzOyB9CisKKyAgRXhwciAqKmdldFN1YkV4cHJzKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxFeHByICoqPihTdWJFeHBycyk7IH0KKyAgY29uc3QgRXhwciAqIGNvbnN0ICpnZXRTdWJFeHBycygpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxFeHByICogY29uc3QgKj4oU3ViRXhwcnMpOworICB9CisKKyAgYm9vbCBpc1ZvbGF0aWxlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQdHIoKS0+Z2V0VHlwZSgpLT5nZXRQb2ludGVlVHlwZSgpLmlzVm9sYXRpbGVRdWFsaWZpZWQoKTsKKyAgfQorCisgIGJvb2wgaXNDbXBYQ2hnKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcCgpID09IEFPX19jMTFfYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nIHx8CisgICAgICAgICAgIGdldE9wKCkgPT0gQU9fX2MxMV9hdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrIHx8CisgICAgICAgICAgIGdldE9wKCkgPT0gQU9fX29wZW5jbF9hdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcgfHwKKyAgICAgICAgICAgZ2V0T3AoKSA9PSBBT19fb3BlbmNsX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWsgfHwKKyAgICAgICAgICAgZ2V0T3AoKSA9PSBBT19fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2UgfHwKKyAgICAgICAgICAgZ2V0T3AoKSA9PSBBT19fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbjsKKyAgfQorCisgIGJvb2wgaXNPcGVuQ0woKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wKCkgPj0gQU9fX29wZW5jbF9hdG9taWNfaW5pdCAmJgorICAgICAgICAgICBnZXRPcCgpIDw9IEFPX19vcGVuY2xfYXRvbWljX2ZldGNoX21heDsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEJ1aWx0aW5Mb2MoKSBjb25zdCB7IHJldHVybiBCdWlsdGluTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldFJQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIFJQYXJlbkxvYzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBCdWlsdGluTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUlBhcmVuTG9jOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IEF0b21pY0V4cHJDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoU3ViRXhwcnMsIFN1YkV4cHJzK051bVN1YkV4cHJzKTsKKyAgfQorICBjb25zdF9jaGlsZF9yYW5nZSBjaGlsZHJlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2hpbGRfcmFuZ2UoU3ViRXhwcnMsIFN1YkV4cHJzICsgTnVtU3ViRXhwcnMpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYXRvbWljIHNjb3BlIG1vZGVsIGZvciB0aGUgYXRvbWljIG9wIGNvZGUuCisgIC8vLyBccmV0dXJuIGVtcHR5IGF0b21pYyBzY29wZSBtb2RlbCBpZiB0aGUgYXRvbWljIG9wIGNvZGUgZG9lcyBub3QgaGF2ZQorICAvLy8gICBzY29wZSBvcGVyYW5kLgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEF0b21pY1Njb3BlTW9kZWw+IGdldFNjb3BlTW9kZWwoQXRvbWljT3AgT3ApIHsKKyAgICBhdXRvIEtpbmQgPQorICAgICAgICAoT3AgPj0gQU9fX29wZW5jbF9hdG9taWNfbG9hZCAmJiBPcCA8PSBBT19fb3BlbmNsX2F0b21pY19mZXRjaF9tYXgpCisgICAgICAgICAgICA/IEF0b21pY1Njb3BlTW9kZWxLaW5kOjpPcGVuQ0wKKyAgICAgICAgICAgIDogQXRvbWljU2NvcGVNb2RlbEtpbmQ6Ok5vbmU7CisgICAgcmV0dXJuIEF0b21pY1Njb3BlTW9kZWw6OmNyZWF0ZShLaW5kKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGF0b21pYyBzY29wZSBtb2RlbC4KKyAgLy8vIFxyZXR1cm4gZW1wdHkgYXRvbWljIHNjb3BlIG1vZGVsIGlmIHRoaXMgYXRvbWljIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZQorICAvLy8gICBzY29wZSBvcGVyYW5kLgorICBzdGQ6OnVuaXF1ZV9wdHI8QXRvbWljU2NvcGVNb2RlbD4gZ2V0U2NvcGVNb2RlbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U2NvcGVNb2RlbChnZXRPcCgpKTsKKyAgfQorfTsKKworLy8vIFR5cG9FeHByIC0gSW50ZXJuYWwgcGxhY2Vob2xkZXIgZm9yIGV4cHJlc3Npb25zIHdoZXJlIHR5cG8gY29ycmVjdGlvbgorLy8vIHN0aWxsIG5lZWRzIHRvIGJlIHBlcmZvcm1lZCBhbmQvb3IgYW4gZXJyb3IgZGlhZ25vc3RpYyBlbWl0dGVkLgorY2xhc3MgVHlwb0V4cHIgOiBwdWJsaWMgRXhwciB7CitwdWJsaWM6CisgIFR5cG9FeHByKFF1YWxUeXBlIFQpCisgICAgICA6IEV4cHIoVHlwb0V4cHJDbGFzcywgVCwgVktfTFZhbHVlLCBPS19PcmRpbmFyeSwKKyAgICAgICAgICAgICAvKmlzVHlwZURlcGVuZGVudCovIHRydWUsCisgICAgICAgICAgICAgLyppc1ZhbHVlRGVwZW5kZW50Ki8gdHJ1ZSwKKyAgICAgICAgICAgICAvKmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCovIHRydWUsCisgICAgICAgICAgICAgLypjb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKi8gZmFsc2UpIHsKKyAgICBhc3NlcnQoVC0+aXNEZXBlbmRlbnRUeXBlKCkgJiYgIlR5cG9FeHByIGdpdmVuIGEgbm9uLWRlcGVuZGVudCB0eXBlIik7CisgIH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoY2hpbGRfaXRlcmF0b3IoKSwgY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KKyAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKGNvbnN0X2NoaWxkX2l0ZXJhdG9yKCksIGNvbnN0X2NoaWxkX2l0ZXJhdG9yKCkpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFNvdXJjZUxvY2F0aW9uKCk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBTb3VyY2VMb2NhdGlvbigpOyB9CisgIAorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gVHlwb0V4cHJDbGFzczsKKyAgfQorCit9OworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9FWFBSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9FeHByQ1hYLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRXhwckNYWC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MWZmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRXhwckNYWC5oCkBAIC0wLDAgKzEsNDQxNiBAQAorLy89PT0tIEV4cHJDWFguaCAtIENsYXNzZXMgZm9yIHJlcHJlc2VudGluZyBleHByZXNzaW9ucyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgY2xhbmc6OkV4cHIgaW50ZXJmYWNlIGFuZCBzdWJjbGFzc2VzIGZvciBDKysgZXhwcmVzc2lvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9FWFBSQ1hYX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfRVhQUkNYWF9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQmFzZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQ1hYLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xhcmF0aW9uTmFtZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL05lc3RlZE5hbWVTcGVjaWZpZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvT3BlcmF0aW9uS2luZHMuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UZW1wbGF0ZUJhc2UuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9VbnJlc29sdmVkU2V0LmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRXhjZXB0aW9uU3BlY2lmaWNhdGlvblR5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9FeHByZXNzaW9uVHJhaXRzLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xhbWJkYS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xhbmdPcHRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3BlcmF0b3JLaW5kcy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU3BlY2lmaWVycy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1R5cGVUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVHJhaWxpbmdPYmplY3RzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBU1RDb250ZXh0OworY2xhc3MgRGVjbEFjY2Vzc1BhaXI7CitjbGFzcyBJZGVudGlmaWVySW5mbzsKK2NsYXNzIExhbWJkYUNhcHR1cmU7CitjbGFzcyBOb25UeXBlVGVtcGxhdGVQYXJtRGVjbDsKK2NsYXNzIFRlbXBsYXRlUGFyYW1ldGVyTGlzdDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDKysgRXhwcmVzc2lvbnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFxicmllZiBBIGNhbGwgdG8gYW4gb3ZlcmxvYWRlZCBvcGVyYXRvciB3cml0dGVuIHVzaW5nIG9wZXJhdG9yCisvLy8gc3ludGF4LgorLy8vCisvLy8gUmVwcmVzZW50cyBhIGNhbGwgdG8gYW4gb3ZlcmxvYWRlZCBvcGVyYXRvciB3cml0dGVuIHVzaW5nIG9wZXJhdG9yCisvLy8gc3ludGF4LCBlLmcuLCAieCArIHkiIG9yICIqcCIuIFdoaWxlIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEKKy8vLyBub3JtYWwgY2FsbCwgdGhpcyBBU1Qgbm9kZSBwcm92aWRlcyBiZXR0ZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisvLy8gc3ludGFjdGljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjYWxsLgorLy8vCisvLy8gSW4gYSBDKysgdGVtcGxhdGUsIHRoaXMgZXhwcmVzc2lvbiBub2RlIGtpbmQgd2lsbCBiZSB1c2VkIHdoZW5ldmVyCisvLy8gYW55IG9mIHRoZSBhcmd1bWVudHMgYXJlIHR5cGUtZGVwZW5kZW50LiBJbiB0aGlzIGNhc2UsIHRoZQorLy8vIGZ1bmN0aW9uIGl0c2VsZiB3aWxsIGJlIGEgKHBvc3NpYmx5IGVtcHR5KSBzZXQgb2YgZnVuY3Rpb25zIGFuZAorLy8vIGZ1bmN0aW9uIHRlbXBsYXRlcyB0aGF0IHdlcmUgZm91bmQgYnkgbmFtZSBsb29rdXAgYXQgdGVtcGxhdGUKKy8vLyBkZWZpbml0aW9uIHRpbWUuCitjbGFzcyBDWFhPcGVyYXRvckNhbGxFeHByIDogcHVibGljIENhbGxFeHByIHsKKyAgLy8vIFxicmllZiBUaGUgb3ZlcmxvYWRlZCBvcGVyYXRvci4KKyAgT3ZlcmxvYWRlZE9wZXJhdG9yS2luZCBPcGVyYXRvcjsKKworICBTb3VyY2VSYW5nZSBSYW5nZTsKKworICAvLyBPbmx5IG1lYW5pbmdmdWwgZm9yIGZsb2F0aW5nIHBvaW50IHR5cGVzLgorICBGUE9wdGlvbnMgRlBGZWF0dXJlczsKKworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZUltcGwoKSBjb25zdCBMTFZNX1JFQURPTkxZOworCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNUU3RtdFdyaXRlcjsKKworICBDWFhPcGVyYXRvckNhbGxFeHByKEFTVENvbnRleHQmIEMsIE92ZXJsb2FkZWRPcGVyYXRvcktpbmQgT3AsIEV4cHIgKmZuLAorICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIqPiBhcmdzLCBRdWFsVHlwZSB0LCBFeHByVmFsdWVLaW5kIFZLLAorICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIG9wZXJhdG9ybG9jLCBGUE9wdGlvbnMgRlBGZWF0dXJlcykKKyAgICAgIDogQ2FsbEV4cHIoQywgQ1hYT3BlcmF0b3JDYWxsRXhwckNsYXNzLCBmbiwgYXJncywgdCwgVkssIG9wZXJhdG9ybG9jKSwKKyAgICAgICAgT3BlcmF0b3IoT3ApLCBGUEZlYXR1cmVzKEZQRmVhdHVyZXMpIHsKKyAgICBSYW5nZSA9IGdldFNvdXJjZVJhbmdlSW1wbCgpOworICB9CisKKyAgZXhwbGljaXQgQ1hYT3BlcmF0b3JDYWxsRXhwcihBU1RDb250ZXh0JiBDLCBFbXB0eVNoZWxsIEVtcHR5KQorICAgICAgOiBDYWxsRXhwcihDLCBDWFhPcGVyYXRvckNhbGxFeHByQ2xhc3MsIEVtcHR5KSB7fQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUga2luZCBvZiBvdmVybG9hZGVkIG9wZXJhdG9yIHRoYXQgdGhpcworICAvLy8gZXhwcmVzc2lvbiByZWZlcnMgdG8uCisgIE92ZXJsb2FkZWRPcGVyYXRvcktpbmQgZ2V0T3BlcmF0b3IoKSBjb25zdCB7IHJldHVybiBPcGVyYXRvcjsgfQorCisgIHN0YXRpYyBib29sIGlzQXNzaWdubWVudE9wKE92ZXJsb2FkZWRPcGVyYXRvcktpbmQgT3BjKSB7CisgICAgcmV0dXJuIE9wYyA9PSBPT19FcXVhbCB8fCBPcGMgPT0gT09fU3RhckVxdWFsIHx8CisgICAgICAgICAgIE9wYyA9PSBPT19TbGFzaEVxdWFsIHx8IE9wYyA9PSBPT19QZXJjZW50RXF1YWwgfHwKKyAgICAgICAgICAgT3BjID09IE9PX1BsdXNFcXVhbCB8fCBPcGMgPT0gT09fTWludXNFcXVhbCB8fAorICAgICAgICAgICBPcGMgPT0gT09fTGVzc0xlc3NFcXVhbCB8fCBPcGMgPT0gT09fR3JlYXRlckdyZWF0ZXJFcXVhbCB8fAorICAgICAgICAgICBPcGMgPT0gT09fQW1wRXF1YWwgfHwgT3BjID09IE9PX0NhcmV0RXF1YWwgfHwKKyAgICAgICAgICAgT3BjID09IE9PX1BpcGVFcXVhbDsKKyAgfQorICBib29sIGlzQXNzaWdubWVudE9wKCkgY29uc3QgeyByZXR1cm4gaXNBc3NpZ25tZW50T3AoZ2V0T3BlcmF0b3IoKSk7IH0KKworICAvLy8gXGJyaWVmIElzIHRoaXMgd3JpdHRlbiBhcyBhbiBpbmZpeCBiaW5hcnkgb3BlcmF0b3I/CisgIGJvb2wgaXNJbmZpeEJpbmFyeU9wKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgb3BlcmF0b3Igc3ltYm9sIGluIHRoZSBleHByZXNzaW9uLgorICAvLy8KKyAgLy8vIFdoZW4gXGMgZ2V0T3BlcmF0b3IoKT09T09fQ2FsbCwgdGhpcyBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIHJpZ2h0CisgIC8vLyBwYXJlbnRoZXNlczsgd2hlbiBcYyBnZXRPcGVyYXRvcigpPT1PT19TdWJzY3JpcHQsIHRoaXMgaXMgdGhlIGxvY2F0aW9uCisgIC8vLyBvZiB0aGUgcmlnaHQgYnJhY2tldC4KKyAgU291cmNlTG9jYXRpb24gZ2V0T3BlcmF0b3JMb2MoKSBjb25zdCB7IHJldHVybiBnZXRSUGFyZW5Mb2MoKTsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEV4cHJMb2MoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gKE9wZXJhdG9yIDwgT09fUGx1cyB8fCBPcGVyYXRvciA+PSBPT19BcnJvdyB8fAorICAgICAgICAgICAgT3BlcmF0b3IgPT0gT09fUGx1c1BsdXMgfHwgT3BlcmF0b3IgPT0gT09fTWludXNNaW51cykKKyAgICAgICAgICAgICAgID8gZ2V0TG9jU3RhcnQoKQorICAgICAgICAgICAgICAgOiBnZXRPcGVyYXRvckxvYygpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJhbmdlLmdldEJlZ2luKCk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSYW5nZS5nZXRFbmQoKTsgfQorICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IHsgcmV0dXJuIFJhbmdlOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IENYWE9wZXJhdG9yQ2FsbEV4cHJDbGFzczsKKyAgfQorCisgIC8vIFNldCB0aGUgRlAgY29udHJhY3RhYmlsaXR5IHN0YXR1cyBvZiB0aGlzIG9wZXJhdG9yLiBPbmx5IG1lYW5pbmdmdWwgZm9yCisgIC8vIG9wZXJhdGlvbnMgb24gZmxvYXRpbmcgcG9pbnQgdHlwZXMuCisgIHZvaWQgc2V0RlBGZWF0dXJlcyhGUE9wdGlvbnMgRikgeyBGUEZlYXR1cmVzID0gRjsgfQorCisgIEZQT3B0aW9ucyBnZXRGUEZlYXR1cmVzKCkgY29uc3QgeyByZXR1cm4gRlBGZWF0dXJlczsgfQorCisgIC8vIEdldCB0aGUgRlAgY29udHJhY3RhYmlsaXR5IHN0YXR1cyBvZiB0aGlzIG9wZXJhdG9yLiBPbmx5IG1lYW5pbmdmdWwgZm9yCisgIC8vIG9wZXJhdGlvbnMgb24gZmxvYXRpbmcgcG9pbnQgdHlwZXMuCisgIGJvb2wgaXNGUENvbnRyYWN0YWJsZVdpdGhpblN0YXRlbWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRlBGZWF0dXJlcy5hbGxvd0ZQQ29udHJhY3RXaXRoaW5TdGF0ZW1lbnQoKTsKKyAgfQorfTsKKworLy8vIFJlcHJlc2VudHMgYSBjYWxsIHRvIGEgbWVtYmVyIGZ1bmN0aW9uIHRoYXQKKy8vLyBtYXkgYmUgd3JpdHRlbiBlaXRoZXIgd2l0aCBtZW1iZXIgY2FsbCBzeW50YXggKGUuZy4sICJvYmouZnVuYygpIgorLy8vIG9yICJvYmpwdHItPmZ1bmMoKSIpIG9yIHdpdGggbm9ybWFsIGZ1bmN0aW9uLWNhbGwgc3ludGF4CisvLy8gKCJmdW5jKCkiKSB3aXRoaW4gYSBtZW1iZXIgZnVuY3Rpb24gdGhhdCBlbmRzIHVwIGNhbGxpbmcgYSBtZW1iZXIKKy8vLyBmdW5jdGlvbi4gVGhlIGNhbGxlZSBpbiBlaXRoZXIgY2FzZSBpcyBhIE1lbWJlckV4cHIgdGhhdCBjb250YWlucworLy8vIGJvdGggdGhlIG9iamVjdCBhcmd1bWVudCBhbmQgdGhlIG1lbWJlciBmdW5jdGlvbiwgd2hpbGUgdGhlCisvLy8gYXJndW1lbnRzIGFyZSB0aGUgYXJndW1lbnRzIHdpdGhpbiB0aGUgcGFyZW50aGVzZXMgKG5vdCBpbmNsdWRpbmcKKy8vLyB0aGUgb2JqZWN0IGFyZ3VtZW50KS4KK2NsYXNzIENYWE1lbWJlckNhbGxFeHByIDogcHVibGljIENhbGxFeHByIHsKK3B1YmxpYzoKKyAgQ1hYTWVtYmVyQ2FsbEV4cHIoQVNUQ29udGV4dCAmQywgRXhwciAqZm4sIEFycmF5UmVmPEV4cHIqPiBhcmdzLAorICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSB0LCBFeHByVmFsdWVLaW5kIFZLLCBTb3VyY2VMb2NhdGlvbiBSUCkKKyAgICAgIDogQ2FsbEV4cHIoQywgQ1hYTWVtYmVyQ2FsbEV4cHJDbGFzcywgZm4sIGFyZ3MsIHQsIFZLLCBSUCkge30KKworICBDWFhNZW1iZXJDYWxsRXhwcihBU1RDb250ZXh0ICZDLCBFbXB0eVNoZWxsIEVtcHR5KQorICAgICAgOiBDYWxsRXhwcihDLCBDWFhNZW1iZXJDYWxsRXhwckNsYXNzLCBFbXB0eSkge30KKworICAvLy8gXGJyaWVmIFJldHJpZXZlcyB0aGUgaW1wbGljaXQgb2JqZWN0IGFyZ3VtZW50IGZvciB0aGUgbWVtYmVyIGNhbGwuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsIGluICJ4LmYoNSkiLCB0aGlzIHJldHVybnMgdGhlIHN1Yi1leHByZXNzaW9uICJ4Ii4KKyAgRXhwciAqZ2V0SW1wbGljaXRPYmplY3RBcmd1bWVudCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmVzIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgY2FsbGVkIG1ldGhvZC4KKyAgQ1hYTWV0aG9kRGVjbCAqZ2V0TWV0aG9kRGVjbCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmVzIHRoZSBDWFhSZWNvcmREZWNsIGZvciB0aGUgdW5kZXJseWluZyB0eXBlIG9mCisgIC8vLyB0aGUgaW1wbGljaXQgb2JqZWN0IGFyZ3VtZW50LgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGlzIG1heSBub3QgYmUgdGhlIHNhbWUgZGVjbGFyYXRpb24gYXMgdGhhdCBvZiB0aGUgY2xhc3MKKyAgLy8vIGNvbnRleHQgb2YgdGhlIENYWE1ldGhvZERlY2wgd2hpY2ggdGhpcyBmdW5jdGlvbiBpcyBjYWxsaW5nLgorICAvLy8gRklYTUU6IFJldHVybnMgMCBmb3IgbWVtYmVyIHBvaW50ZXIgY2FsbCBleHBycy4KKyAgQ1hYUmVjb3JkRGVjbCAqZ2V0UmVjb3JkRGVjbCgpIGNvbnN0OworCisgIFNvdXJjZUxvY2F0aW9uIGdldEV4cHJMb2MoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICBTb3VyY2VMb2NhdGlvbiBDTG9jID0gZ2V0Q2FsbGVlKCktPmdldEV4cHJMb2MoKTsKKyAgICBpZiAoQ0xvYy5pc1ZhbGlkKCkpCisgICAgICByZXR1cm4gQ0xvYzsKKworICAgIHJldHVybiBnZXRMb2NTdGFydCgpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IENYWE1lbWJlckNhbGxFeHByQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIGNhbGwgdG8gYSBDVURBIGtlcm5lbCBmdW5jdGlvbi4KK2NsYXNzIENVREFLZXJuZWxDYWxsRXhwciA6IHB1YmxpYyBDYWxsRXhwciB7Citwcml2YXRlOgorICBlbnVtIHsgQ09ORklHLCBFTkRfUFJFQVJHIH07CisKK3B1YmxpYzoKKyAgQ1VEQUtlcm5lbENhbGxFeHByKEFTVENvbnRleHQgJkMsIEV4cHIgKmZuLCBDYWxsRXhwciAqQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwcio+IGFyZ3MsIFF1YWxUeXBlIHQsIEV4cHJWYWx1ZUtpbmQgVkssCisgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUCkKKyAgICAgIDogQ2FsbEV4cHIoQywgQ1VEQUtlcm5lbENhbGxFeHByQ2xhc3MsIGZuLCBDb25maWcsIGFyZ3MsIHQsIFZLLCBSUCkge30KKworICBDVURBS2VybmVsQ2FsbEV4cHIoQVNUQ29udGV4dCAmQywgRW1wdHlTaGVsbCBFbXB0eSkKKyAgICAgIDogQ2FsbEV4cHIoQywgQ1VEQUtlcm5lbENhbGxFeHByQ2xhc3MsIEVORF9QUkVBUkcsIEVtcHR5KSB7fQorCisgIGNvbnN0IENhbGxFeHByICpnZXRDb25maWcoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxDYWxsRXhwcj4oZ2V0UHJlQXJnKENPTkZJRykpOworICB9CisgIENhbGxFeHByICpnZXRDb25maWcoKSB7IHJldHVybiBjYXN0X29yX251bGw8Q2FsbEV4cHI+KGdldFByZUFyZyhDT05GSUcpKTsgfQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gZXhwcmVzc2lvbi4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBtZXRob2QgY2Fubm90IGJlIGNhbGxlZCBpZiBjb25maWcgaGFzIGFscmVhZHkgYmVlbiBzZXQgdG8gYQorICAvLy8gbm9uLW51bGwgdmFsdWUuCisgIHZvaWQgc2V0Q29uZmlnKENhbGxFeHByICpFKSB7CisgICAgYXNzZXJ0KCFnZXRDb25maWcoKSAmJgorICAgICAgICAgICAiQ2Fubm90IGNhbGwgc2V0Q29uZmlnIGlmIGNvbmZpZyBpcyBub3QgbnVsbCIpOworICAgIHNldFByZUFyZyhDT05GSUcsIEUpOworICAgIHNldEluc3RhbnRpYXRpb25EZXBlbmRlbnQoaXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpKTsKKyAgICBzZXRDb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKGNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRS0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBDVURBS2VybmVsQ2FsbEV4cHJDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBBYnN0cmFjdCBjbGFzcyBjb21tb24gdG8gYWxsIG9mIHRoZSBDKysgIm5hbWVkIi8ia2V5d29yZCIgY2FzdHMuCisvLy8KKy8vLyBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGluaGVyaXRlZCBieSBhbGwgb2YgdGhlIGNsYXNzZXMKKy8vLyByZXByZXNlbnRpbmcgIm5hbWVkIiBjYXN0czogQ1hYU3RhdGljQ2FzdEV4cHIgZm9yIFxjIHN0YXRpY19jYXN0LAorLy8vIENYWER5bmFtaWNDYXN0RXhwciBmb3IgXGMgZHluYW1pY19jYXN0LCBDWFhSZWludGVycHJldENhc3RFeHByIGZvcgorLy8vIHJlaW50ZXJwcmV0X2Nhc3QsIGFuZCBDWFhDb25zdENhc3RFeHByIGZvciBcYyBjb25zdF9jYXN0LgorY2xhc3MgQ1hYTmFtZWRDYXN0RXhwciA6IHB1YmxpYyBFeHBsaWNpdENhc3RFeHByIHsKK3ByaXZhdGU6CisgIC8vIHRoZSBsb2NhdGlvbiBvZiB0aGUgY2FzdGluZyBvcAorICBTb3VyY2VMb2NhdGlvbiBMb2M7CisKKyAgLy8gdGhlIGxvY2F0aW9uIG9mIHRoZSByaWdodCBwYXJlbnRoZXNpcworICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2M7CisKKyAgLy8gcmFuZ2UgZm9yICc8JyAnPicKKyAgU291cmNlUmFuZ2UgQW5nbGVCcmFja2V0czsKKworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKworICBDWFhOYW1lZENhc3RFeHByKFN0bXRDbGFzcyBTQywgUXVhbFR5cGUgdHksIEV4cHJWYWx1ZUtpbmQgVkssCisgICAgICAgICAgICAgICAgICAgQ2FzdEtpbmQga2luZCwgRXhwciAqb3AsIHVuc2lnbmVkIFBhdGhTaXplLAorICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICp3cml0dGVuVHksIFNvdXJjZUxvY2F0aW9uIGwsCisgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEFuZ2xlQnJhY2tldHMpCisgICAgICA6IEV4cGxpY2l0Q2FzdEV4cHIoU0MsIHR5LCBWSywga2luZCwgb3AsIFBhdGhTaXplLCB3cml0dGVuVHkpLCBMb2MobCksCisgICAgICAgIFJQYXJlbkxvYyhSUGFyZW5Mb2MpLCBBbmdsZUJyYWNrZXRzKEFuZ2xlQnJhY2tldHMpIHt9CisKKyAgZXhwbGljaXQgQ1hYTmFtZWRDYXN0RXhwcihTdG10Q2xhc3MgU0MsIEVtcHR5U2hlbGwgU2hlbGwsIHVuc2lnbmVkIFBhdGhTaXplKQorICAgICAgOiBFeHBsaWNpdENhc3RFeHByKFNDLCBTaGVsbCwgUGF0aFNpemUpIHt9CisKK3B1YmxpYzoKKyAgY29uc3QgY2hhciAqZ2V0Q2FzdE5hbWUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgY2FzdCBvcGVyYXRvciBrZXl3b3JkLCBlLmcuLAorICAvLy8gXGMgc3RhdGljX2Nhc3QuCisgIFNvdXJjZUxvY2F0aW9uIGdldE9wZXJhdG9yTG9jKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGNsb3NpbmcgcGFyZW50aGVzaXMuCisgIFNvdXJjZUxvY2F0aW9uIGdldFJQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIFJQYXJlbkxvYzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKyAgU291cmNlUmFuZ2UgZ2V0QW5nbGVCcmFja2V0cygpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gQW5nbGVCcmFja2V0czsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHN3aXRjaCAoVC0+Z2V0U3RtdENsYXNzKCkpIHsKKyAgICBjYXNlIENYWFN0YXRpY0Nhc3RFeHByQ2xhc3M6CisgICAgY2FzZSBDWFhEeW5hbWljQ2FzdEV4cHJDbGFzczoKKyAgICBjYXNlIENYWFJlaW50ZXJwcmV0Q2FzdEV4cHJDbGFzczoKKyAgICBjYXNlIENYWENvbnN0Q2FzdEV4cHJDbGFzczoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9OworCisvLy8gXGJyaWVmIEEgQysrIFxjIHN0YXRpY19jYXN0IGV4cHJlc3Npb24gKEMrKyBbZXhwci5zdGF0aWMuY2FzdF0pLgorLy8vCisvLy8gVGhpcyBleHByZXNzaW9uIG5vZGUgcmVwcmVzZW50cyBhIEMrKyBzdGF0aWMgY2FzdCwgZS5nLiwKKy8vLyBcYyBzdGF0aWNfY2FzdDxpbnQ+KDEuMCkuCitjbGFzcyBDWFhTdGF0aWNDYXN0RXhwciBmaW5hbAorICAgIDogcHVibGljIENYWE5hbWVkQ2FzdEV4cHIsCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxDWFhTdGF0aWNDYXN0RXhwciwgQ1hYQmFzZVNwZWNpZmllciAqPiB7CisgIENYWFN0YXRpY0Nhc3RFeHByKFF1YWxUeXBlIHR5LCBFeHByVmFsdWVLaW5kIHZrLCBDYXN0S2luZCBraW5kLCBFeHByICpvcCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcGF0aFNpemUsIFR5cGVTb3VyY2VJbmZvICp3cml0dGVuVHksCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIGwsIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgQW5nbGVCcmFja2V0cykKKyAgICAgIDogQ1hYTmFtZWRDYXN0RXhwcihDWFhTdGF0aWNDYXN0RXhwckNsYXNzLCB0eSwgdmssIGtpbmQsIG9wLCBwYXRoU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuVHksIGwsIFJQYXJlbkxvYywgQW5nbGVCcmFja2V0cykge30KKworICBleHBsaWNpdCBDWFhTdGF0aWNDYXN0RXhwcihFbXB0eVNoZWxsIEVtcHR5LCB1bnNpZ25lZCBQYXRoU2l6ZSkKKyAgICAgIDogQ1hYTmFtZWRDYXN0RXhwcihDWFhTdGF0aWNDYXN0RXhwckNsYXNzLCBFbXB0eSwgUGF0aFNpemUpIHt9CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIENhc3RFeHByOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIHN0YXRpYyBDWFhTdGF0aWNDYXN0RXhwciAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQsIFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJWYWx1ZUtpbmQgVkssIENhc3RLaW5kIEssIEV4cHIgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhDYXN0UGF0aCAqUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKldyaXR0ZW4sIFNvdXJjZUxvY2F0aW9uIEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgQW5nbGVCcmFja2V0cyk7CisgIHN0YXRpYyBDWFhTdGF0aWNDYXN0RXhwciAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQYXRoU2l6ZSk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IENYWFN0YXRpY0Nhc3RFeHByQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQSBDKysgQGMgZHluYW1pY19jYXN0IGV4cHJlc3Npb24gKEMrKyBbZXhwci5keW5hbWljLmNhc3RdKS4KKy8vLworLy8vIFRoaXMgZXhwcmVzc2lvbiBub2RlIHJlcHJlc2VudHMgYSBkeW5hbWljIGNhc3QsIGUuZy4sCisvLy8gXGMgZHluYW1pY19jYXN0PERlcml2ZWQqPihCYXNlUHRyKS4gU3VjaCBhIGNhc3QgbWF5IHBlcmZvcm0gYSBydW4tdGltZQorLy8vIGNoZWNrIHRvIGRldGVybWluZSBob3cgdG8gcGVyZm9ybSB0aGUgdHlwZSBjb252ZXJzaW9uLgorY2xhc3MgQ1hYRHluYW1pY0Nhc3RFeHByIGZpbmFsCisgICAgOiBwdWJsaWMgQ1hYTmFtZWRDYXN0RXhwciwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPENYWER5bmFtaWNDYXN0RXhwciwgQ1hYQmFzZVNwZWNpZmllciAqPiB7CisgIENYWER5bmFtaWNDYXN0RXhwcihRdWFsVHlwZSB0eSwgRXhwclZhbHVlS2luZCBWSywgQ2FzdEtpbmQga2luZCwKKyAgICAgICAgICAgICAgICAgICAgIEV4cHIgKm9wLCB1bnNpZ25lZCBwYXRoU2l6ZSwgVHlwZVNvdXJjZUluZm8gKndyaXR0ZW5UeSwKKyAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIGwsIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEFuZ2xlQnJhY2tldHMpCisgICAgICA6IENYWE5hbWVkQ2FzdEV4cHIoQ1hYRHluYW1pY0Nhc3RFeHByQ2xhc3MsIHR5LCBWSywga2luZCwgb3AsIHBhdGhTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW5UeSwgbCwgUlBhcmVuTG9jLCBBbmdsZUJyYWNrZXRzKSB7fQorCisgIGV4cGxpY2l0IENYWER5bmFtaWNDYXN0RXhwcihFbXB0eVNoZWxsIEVtcHR5LCB1bnNpZ25lZCBwYXRoU2l6ZSkKKyAgICAgIDogQ1hYTmFtZWRDYXN0RXhwcihDWFhEeW5hbWljQ2FzdEV4cHJDbGFzcywgRW1wdHksIHBhdGhTaXplKSB7fQorCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBDYXN0RXhwcjsKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKworICBzdGF0aWMgQ1hYRHluYW1pY0Nhc3RFeHByICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJWYWx1ZUtpbmQgVkssIENhc3RLaW5kIEtpbmQsIEV4cHIgKk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYQ2FzdFBhdGggKlBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqV3JpdHRlbiwgU291cmNlTG9jYXRpb24gTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEFuZ2xlQnJhY2tldHMpOworCisgIHN0YXRpYyBDWFhEeW5hbWljQ2FzdEV4cHIgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBhdGhTaXplKTsKKworICBib29sIGlzQWx3YXlzTnVsbCgpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBDWFhEeW5hbWljQ2FzdEV4cHJDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBBIEMrKyBAYyByZWludGVycHJldF9jYXN0IGV4cHJlc3Npb24gKEMrKyBbZXhwci5yZWludGVycHJldC5jYXN0XSkuCisvLy8KKy8vLyBUaGlzIGV4cHJlc3Npb24gbm9kZSByZXByZXNlbnRzIGEgcmVpbnRlcnByZXQgY2FzdCwgZS5nLiwKKy8vLyBAYyByZWludGVycHJldF9jYXN0PGludD4oVm9pZFB0cikuCisvLy8KKy8vLyBBIHJlaW50ZXJwcmV0X2Nhc3QgcHJvdmlkZXMgYSBkaWZmZXJlbnRseS10eXBlZCB2aWV3IG9mIGEgdmFsdWUgYnV0CisvLy8gKGluIENsYW5nLCBhcyBpbiBtb3N0IEMrKyBpbXBsZW1lbnRhdGlvbnMpIHBlcmZvcm1zIG5vIGFjdHVhbCB3b3JrIGF0CisvLy8gcnVuIHRpbWUuCitjbGFzcyBDWFhSZWludGVycHJldENhc3RFeHByIGZpbmFsCisgICAgOiBwdWJsaWMgQ1hYTmFtZWRDYXN0RXhwciwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPENYWFJlaW50ZXJwcmV0Q2FzdEV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhCYXNlU3BlY2lmaWVyICo+IHsKKyAgQ1hYUmVpbnRlcnByZXRDYXN0RXhwcihRdWFsVHlwZSB0eSwgRXhwclZhbHVlS2luZCB2aywgQ2FzdEtpbmQga2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpvcCwgdW5zaWduZWQgcGF0aFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKndyaXR0ZW5UeSwgU291cmNlTG9jYXRpb24gbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgQW5nbGVCcmFja2V0cykKKyAgICAgIDogQ1hYTmFtZWRDYXN0RXhwcihDWFhSZWludGVycHJldENhc3RFeHByQ2xhc3MsIHR5LCB2aywga2luZCwgb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFNpemUsIHdyaXR0ZW5UeSwgbCwgUlBhcmVuTG9jLCBBbmdsZUJyYWNrZXRzKSB7fQorCisgIENYWFJlaW50ZXJwcmV0Q2FzdEV4cHIoRW1wdHlTaGVsbCBFbXB0eSwgdW5zaWduZWQgcGF0aFNpemUpCisgICAgICA6IENYWE5hbWVkQ2FzdEV4cHIoQ1hYUmVpbnRlcnByZXRDYXN0RXhwckNsYXNzLCBFbXB0eSwgcGF0aFNpemUpIHt9CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIENhc3RFeHByOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIHN0YXRpYyBDWFhSZWludGVycHJldENhc3RFeHByICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByVmFsdWVLaW5kIFZLLCBDYXN0S2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKk9wLCBjb25zdCBDWFhDYXN0UGF0aCAqUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpXcml0dGVuVHksIFNvdXJjZUxvY2F0aW9uIEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEFuZ2xlQnJhY2tldHMpOworICBzdGF0aWMgQ1hYUmVpbnRlcnByZXRDYXN0RXhwciAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBhdGhTaXplKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ1hYUmVpbnRlcnByZXRDYXN0RXhwckNsYXNzOworICB9Cit9OworCisvLy8gXGJyaWVmIEEgQysrIFxjIGNvbnN0X2Nhc3QgZXhwcmVzc2lvbiAoQysrIFtleHByLmNvbnN0LmNhc3RdKS4KKy8vLworLy8vIFRoaXMgZXhwcmVzc2lvbiBub2RlIHJlcHJlc2VudHMgYSBjb25zdCBjYXN0LCBlLmcuLAorLy8vIFxjIGNvbnN0X2Nhc3Q8Y2hhcio+KFB0clRvQ29uc3RDaGFyKS4KKy8vLworLy8vIEEgY29uc3RfY2FzdCBjYW4gcmVtb3ZlIHR5cGUgcXVhbGlmaWVycyBidXQgZG9lcyBub3QgY2hhbmdlIHRoZSB1bmRlcmx5aW5nCisvLy8gdmFsdWUuCitjbGFzcyBDWFhDb25zdENhc3RFeHByIGZpbmFsCisgICAgOiBwdWJsaWMgQ1hYTmFtZWRDYXN0RXhwciwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPENYWENvbnN0Q2FzdEV4cHIsIENYWEJhc2VTcGVjaWZpZXIgKj4geworICBDWFhDb25zdENhc3RFeHByKFF1YWxUeXBlIHR5LCBFeHByVmFsdWVLaW5kIFZLLCBFeHByICpvcCwKKyAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqd3JpdHRlblR5LCBTb3VyY2VMb2NhdGlvbiBsLAorICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYywgU291cmNlUmFuZ2UgQW5nbGVCcmFja2V0cykKKyAgICAgIDogQ1hYTmFtZWRDYXN0RXhwcihDWFhDb25zdENhc3RFeHByQ2xhc3MsIHR5LCBWSywgQ0tfTm9PcCwgb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgd3JpdHRlblR5LCBsLCBSUGFyZW5Mb2MsIEFuZ2xlQnJhY2tldHMpIHt9CisKKyAgZXhwbGljaXQgQ1hYQ29uc3RDYXN0RXhwcihFbXB0eVNoZWxsIEVtcHR5KQorICAgICAgOiBDWFhOYW1lZENhc3RFeHByKENYWENvbnN0Q2FzdEV4cHJDbGFzcywgRW1wdHksIDApIHt9CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIENhc3RFeHByOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIHN0YXRpYyBDWFhDb25zdENhc3RFeHByICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByVmFsdWVLaW5kIFZLLCBFeHByICpPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqV3JpdHRlblR5LCBTb3VyY2VMb2NhdGlvbiBMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBBbmdsZUJyYWNrZXRzKTsKKyAgc3RhdGljIENYWENvbnN0Q2FzdEV4cHIgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBDWFhDb25zdENhc3RFeHByQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQSBjYWxsIHRvIGEgbGl0ZXJhbCBvcGVyYXRvciAoQysrMTEgW292ZXIubGl0ZXJhbF0pCisvLy8gd3JpdHRlbiBhcyBhIHVzZXItZGVmaW5lZCBsaXRlcmFsIChDKysxMSBbbGl0LmV4dF0pLgorLy8vCisvLy8gUmVwcmVzZW50cyBhIHVzZXItZGVmaW5lZCBsaXRlcmFsLCBlLmcuICJmb28iX2JhciBvciAxLjIzX3h5ei4gV2hpbGUgdGhpcworLy8vIGlzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEgbm9ybWFsIGNhbGwsIHRoaXMgQVNUIG5vZGUgcHJvdmlkZXMgYmV0dGVyCisvLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5bnRhY3RpYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbC4KKy8vLworLy8vIFNpbmNlIGxpdGVyYWwgb3BlcmF0b3JzIGFyZSBuZXZlciBmb3VuZCBieSBBREwgYW5kIGNhbiBvbmx5IGJlIGRlY2xhcmVkIGF0CisvLy8gbmFtZXNwYWNlIHNjb3BlLCBhIHVzZXItZGVmaW5lZCBsaXRlcmFsIGlzIG5ldmVyIGRlcGVuZGVudC4KK2NsYXNzIFVzZXJEZWZpbmVkTGl0ZXJhbCA6IHB1YmxpYyBDYWxsRXhwciB7CisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIGEgdWQtc3VmZml4IHdpdGhpbiB0aGUgbGl0ZXJhbC4KKyAgU291cmNlTG9jYXRpb24gVURTdWZmaXhMb2M7CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10V3JpdGVyOworCisgIFVzZXJEZWZpbmVkTGl0ZXJhbChjb25zdCBBU1RDb250ZXh0ICZDLCBFeHByICpGbiwgQXJyYXlSZWY8RXhwcio+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULCBFeHByVmFsdWVLaW5kIFZLLCBTb3VyY2VMb2NhdGlvbiBMaXRFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdWZmaXhMb2MpCisgICAgICA6IENhbGxFeHByKEMsIFVzZXJEZWZpbmVkTGl0ZXJhbENsYXNzLCBGbiwgQXJncywgVCwgVkssIExpdEVuZExvYyksCisgICAgICAgIFVEU3VmZml4TG9jKFN1ZmZpeExvYykge30KKworICBleHBsaWNpdCBVc2VyRGVmaW5lZExpdGVyYWwoY29uc3QgQVNUQ29udGV4dCAmQywgRW1wdHlTaGVsbCBFbXB0eSkKKyAgICAgIDogQ2FsbEV4cHIoQywgVXNlckRlZmluZWRMaXRlcmFsQ2xhc3MsIEVtcHR5KSB7fQorCisgIC8vLyBUaGUga2luZCBvZiBsaXRlcmFsIG9wZXJhdG9yIHdoaWNoIGlzIGludm9rZWQuCisgIGVudW0gTGl0ZXJhbE9wZXJhdG9yS2luZCB7CisgICAgLy8vIFJhdyBmb3JtOiBvcGVyYXRvciAiIiBYIChjb25zdCBjaGFyICopCisgICAgTE9LX1JhdywKKworICAgIC8vLyBSYXcgZm9ybTogb3BlcmF0b3IgIiIgWDxjcy4uLj4gKCkKKyAgICBMT0tfVGVtcGxhdGUsCisKKyAgICAvLy8gb3BlcmF0b3IgIiIgWCAodW5zaWduZWQgbG9uZyBsb25nKQorICAgIExPS19JbnRlZ2VyLAorCisgICAgLy8vIG9wZXJhdG9yICIiIFggKGxvbmcgZG91YmxlKQorICAgIExPS19GbG9hdGluZywKKworICAgIC8vLyBvcGVyYXRvciAiIiBYIChjb25zdCBDaGFyVCAqLCBzaXplX3QpCisgICAgTE9LX1N0cmluZywKKworICAgIC8vLyBvcGVyYXRvciAiIiBYIChDaGFyVCkKKyAgICBMT0tfQ2hhcmFjdGVyCisgIH07CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBraW5kIG9mIGxpdGVyYWwgb3BlcmF0b3IgaW52b2NhdGlvbgorICAvLy8gd2hpY2ggdGhpcyBleHByZXNzaW9uIHJlcHJlc2VudHMuCisgIExpdGVyYWxPcGVyYXRvcktpbmQgZ2V0TGl0ZXJhbE9wZXJhdG9yS2luZCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgSWYgdGhpcyBpcyBub3QgYSByYXcgdXNlci1kZWZpbmVkIGxpdGVyYWwsIGdldCB0aGUKKyAgLy8vIHVuZGVybHlpbmcgY29va2VkIGxpdGVyYWwgKHJlcHJlc2VudGluZyB0aGUgbGl0ZXJhbCB3aXRoIHRoZSBzdWZmaXgKKyAgLy8vIHJlbW92ZWQpLgorICBFeHByICpnZXRDb29rZWRMaXRlcmFsKCk7CisgIGNvbnN0IEV4cHIgKmdldENvb2tlZExpdGVyYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VXNlckRlZmluZWRMaXRlcmFsKj4odGhpcyktPmdldENvb2tlZExpdGVyYWwoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgeworICAgIGlmIChnZXRMaXRlcmFsT3BlcmF0b3JLaW5kKCkgPT0gTE9LX1RlbXBsYXRlKQorICAgICAgcmV0dXJuIGdldFJQYXJlbkxvYygpOworICAgIHJldHVybiBnZXRBcmcoMCktPmdldExvY1N0YXJ0KCk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCB7IHJldHVybiBnZXRSUGFyZW5Mb2MoKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgYSB1ZC1zdWZmaXggaW4gdGhlIGV4cHJlc3Npb24uCisgIC8vLworICAvLy8gRm9yIGEgc3RyaW5nIGxpdGVyYWwsIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBpZGVudGljYWwgc3VmZml4ZXMuIFRoaXMKKyAgLy8vIHJldHVybnMgdGhlIGZpcnN0LgorICBTb3VyY2VMb2NhdGlvbiBnZXRVRFN1ZmZpeExvYygpIGNvbnN0IHsgcmV0dXJuIFVEU3VmZml4TG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSB1ZC1zdWZmaXggc3BlY2lmaWVkIGZvciB0aGlzIGxpdGVyYWwuCisgIGNvbnN0IElkZW50aWZpZXJJbmZvICpnZXRVRFN1ZmZpeCgpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqUykgeworICAgIHJldHVybiBTLT5nZXRTdG10Q2xhc3MoKSA9PSBVc2VyRGVmaW5lZExpdGVyYWxDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBBIGJvb2xlYW4gbGl0ZXJhbCwgcGVyIChbQysrIGxleC5ib29sXSBCb29sZWFuIGxpdGVyYWxzKS4KK2NsYXNzIENYWEJvb2xMaXRlcmFsRXhwciA6IHB1YmxpYyBFeHByIHsKKyAgYm9vbCBWYWx1ZTsKKyAgU291cmNlTG9jYXRpb24gTG9jOworCitwdWJsaWM6CisgIENYWEJvb2xMaXRlcmFsRXhwcihib29sIHZhbCwgUXVhbFR5cGUgVHksIFNvdXJjZUxvY2F0aW9uIGwpCisgICAgICA6IEV4cHIoQ1hYQm9vbExpdGVyYWxFeHByQ2xhc3MsIFR5LCBWS19SVmFsdWUsIE9LX09yZGluYXJ5LCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgVmFsdWUodmFsKSwgTG9jKGwpIHt9CisKKyAgZXhwbGljaXQgQ1hYQm9vbExpdGVyYWxFeHByKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgICA6IEV4cHIoQ1hYQm9vbExpdGVyYWxFeHByQ2xhc3MsIEVtcHR5KSB7fQorCisgIGJvb2wgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorICB2b2lkIHNldFZhbHVlKGJvb2wgVikgeyBWYWx1ZSA9IFY7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gTG9jOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKyAgdm9pZCBzZXRMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBMKSB7IExvYyA9IEw7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ1hYQm9vbExpdGVyYWxFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoZSBudWxsIHBvaW50ZXIgbGl0ZXJhbCAoQysrMTEgW2xleC5udWxscHRyXSkKKy8vLworLy8vIEludHJvZHVjZWQgaW4gQysrMTEsIHRoZSBvbmx5IGxpdGVyYWwgb2YgdHlwZSBcYyBudWxscHRyX3QgaXMgXGMgbnVsbHB0ci4KK2NsYXNzIENYWE51bGxQdHJMaXRlcmFsRXhwciA6IHB1YmxpYyBFeHByIHsKKyAgU291cmNlTG9jYXRpb24gTG9jOworCitwdWJsaWM6CisgIENYWE51bGxQdHJMaXRlcmFsRXhwcihRdWFsVHlwZSBUeSwgU291cmNlTG9jYXRpb24gbCkKKyAgICAgIDogRXhwcihDWFhOdWxsUHRyTGl0ZXJhbEV4cHJDbGFzcywgVHksIFZLX1JWYWx1ZSwgT0tfT3JkaW5hcnksIGZhbHNlLAorICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICBMb2MobCkge30KKworICBleHBsaWNpdCBDWFhOdWxsUHRyTGl0ZXJhbEV4cHIoRW1wdHlTaGVsbCBFbXB0eSkKKyAgICAgIDogRXhwcihDWFhOdWxsUHRyTGl0ZXJhbEV4cHJDbGFzcywgRW1wdHkpIHt9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIExvYzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9CisgIHZvaWQgc2V0TG9jYXRpb24oU291cmNlTG9jYXRpb24gTCkgeyBMb2MgPSBMOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IENYWE51bGxQdHJMaXRlcmFsRXhwckNsYXNzOworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9Cit9OworCisvLy8gXGJyaWVmIEltcGxpY2l0IGNvbnN0cnVjdGlvbiBvZiBhIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBvYmplY3QgZnJvbSBhbgorLy8vIGFycmF5IHRlbXBvcmFyeSB3aXRoaW4gbGlzdC1pbml0aWFsaXphdGlvbiAoQysrMTEgW2RjbC5pbml0Lmxpc3RdcDUpLgorY2xhc3MgQ1hYU3RkSW5pdGlhbGl6ZXJMaXN0RXhwciA6IHB1YmxpYyBFeHByIHsKKyAgU3RtdCAqU3ViRXhwciA9IG51bGxwdHI7CisKKyAgQ1hYU3RkSW5pdGlhbGl6ZXJMaXN0RXhwcihFbXB0eVNoZWxsIEVtcHR5KQorICAgICAgOiBFeHByKENYWFN0ZEluaXRpYWxpemVyTGlzdEV4cHJDbGFzcywgRW1wdHkpIHt9CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisKKyAgQ1hYU3RkSW5pdGlhbGl6ZXJMaXN0RXhwcihRdWFsVHlwZSBUeSwgRXhwciAqU3ViRXhwcikKKyAgICAgIDogRXhwcihDWFhTdGRJbml0aWFsaXplckxpc3RFeHByQ2xhc3MsIFR5LCBWS19SVmFsdWUsIE9LX09yZGluYXJ5LAorICAgICAgICAgICAgIFR5LT5pc0RlcGVuZGVudFR5cGUoKSwgU3ViRXhwci0+aXNWYWx1ZURlcGVuZGVudCgpLAorICAgICAgICAgICAgIFN1YkV4cHItPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpLAorICAgICAgICAgICAgIFN1YkV4cHItPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIFN1YkV4cHIoU3ViRXhwcikge30KKworICBFeHByICpnZXRTdWJFeHByKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8RXhwcio+KFN1YkV4cHIpOyB9CisgIGNvbnN0IEV4cHIgKmdldFN1YkV4cHIoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBFeHByKj4oU3ViRXhwcik7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBTdWJFeHByLT5nZXRMb2NTdGFydCgpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIFN1YkV4cHItPmdldExvY0VuZCgpOworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gU3ViRXhwci0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqUykgeworICAgIHJldHVybiBTLT5nZXRTdG10Q2xhc3MoKSA9PSBDWFhTdGRJbml0aWFsaXplckxpc3RFeHByQ2xhc3M7CisgIH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsgcmV0dXJuIGNoaWxkX3JhbmdlKCZTdWJFeHByLCAmU3ViRXhwciArIDEpOyB9Cit9OworCisvLy8gQSBDKysgXGMgdHlwZWlkIGV4cHJlc3Npb24gKEMrKyBbZXhwci50eXBlaWRdKSwgd2hpY2ggZ2V0cworLy8vIHRoZSBcYyB0eXBlX2luZm8gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc3VwcGxpZWQgdHlwZSwgb3IgdGhlIChwb3NzaWJseQorLy8vIGR5bmFtaWMpIHR5cGUgb2YgdGhlIHN1cHBsaWVkIGV4cHJlc3Npb24uCisvLy8KKy8vLyBUaGlzIHJlcHJlc2VudHMgY29kZSBsaWtlIFxjIHR5cGVpZChpbnQpIG9yIFxjIHR5cGVpZCgqb2JqUHRyKQorY2xhc3MgQ1hYVHlwZWlkRXhwciA6IHB1YmxpYyBFeHByIHsKK3ByaXZhdGU6CisgIGxsdm06OlBvaW50ZXJVbmlvbjxTdG10ICosIFR5cGVTb3VyY2VJbmZvICo+IE9wZXJhbmQ7CisgIFNvdXJjZVJhbmdlIFJhbmdlOworCitwdWJsaWM6CisgIENYWFR5cGVpZEV4cHIoUXVhbFR5cGUgVHksIFR5cGVTb3VyY2VJbmZvICpPcGVyYW5kLCBTb3VyY2VSYW5nZSBSKQorICAgICAgOiBFeHByKENYWFR5cGVpZEV4cHJDbGFzcywgVHksIFZLX0xWYWx1ZSwgT0tfT3JkaW5hcnksCisgICAgICAgICAgICAgLy8gdHlwZWlkIGlzIG5ldmVyIHR5cGUtZGVwZW5kZW50IChDKysgW3RlbXAuZGVwLmV4cHJdcDQpCisgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgLy8gdHlwZWlkIGlzIHZhbHVlLWRlcGVuZGVudCBpZiB0aGUgdHlwZSBvciBleHByZXNzaW9uIGFyZQorICAgICAgICAgICAgIC8vIGRlcGVuZGVudAorICAgICAgICAgICAgIE9wZXJhbmQtPmdldFR5cGUoKS0+aXNEZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgICAgT3BlcmFuZC0+Z2V0VHlwZSgpLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgICAgT3BlcmFuZC0+Z2V0VHlwZSgpLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgICBPcGVyYW5kKE9wZXJhbmQpLCBSYW5nZShSKSB7fQorCisgIENYWFR5cGVpZEV4cHIoUXVhbFR5cGUgVHksIEV4cHIgKk9wZXJhbmQsIFNvdXJjZVJhbmdlIFIpCisgICAgICA6IEV4cHIoQ1hYVHlwZWlkRXhwckNsYXNzLCBUeSwgVktfTFZhbHVlLCBPS19PcmRpbmFyeSwKKyAgICAgICAgICAgICAvLyB0eXBlaWQgaXMgbmV2ZXIgdHlwZS1kZXBlbmRlbnQgKEMrKyBbdGVtcC5kZXAuZXhwcl1wNCkKKyAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAvLyB0eXBlaWQgaXMgdmFsdWUtZGVwZW5kZW50IGlmIHRoZSB0eXBlIG9yIGV4cHJlc3Npb24gYXJlCisgICAgICAgICAgICAgLy8gZGVwZW5kZW50CisgICAgICAgICAgICAgT3BlcmFuZC0+aXNUeXBlRGVwZW5kZW50KCkgfHwgT3BlcmFuZC0+aXNWYWx1ZURlcGVuZGVudCgpLAorICAgICAgICAgICAgIE9wZXJhbmQtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpLAorICAgICAgICAgICAgIE9wZXJhbmQtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIE9wZXJhbmQoT3BlcmFuZCksIFJhbmdlKFIpIHt9CisKKyAgQ1hYVHlwZWlkRXhwcihFbXB0eVNoZWxsIEVtcHR5LCBib29sIGlzRXhwcikKKyAgICAgIDogRXhwcihDWFhUeXBlaWRFeHByQ2xhc3MsIEVtcHR5KSB7CisgICAgaWYgKGlzRXhwcikKKyAgICAgIE9wZXJhbmQgPSAoRXhwciopbnVsbHB0cjsKKyAgICBlbHNlCisgICAgICBPcGVyYW5kID0gKFR5cGVTb3VyY2VJbmZvKiludWxscHRyOworICB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgdHlwZWlkIGhhcyBhIHR5cGUgb3BlcmFuZCB3aGljaCBpcyBwb3RlbnRpYWxseQorICAvLy8gZXZhbHVhdGVkLCBwZXIgQysrMTEgW2V4cHIudHlwZWlkXXAzLgorICBib29sIGlzUG90ZW50aWFsbHlFdmFsdWF0ZWQoKSBjb25zdDsKKworICBib29sIGlzVHlwZU9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBPcGVyYW5kLmlzPFR5cGVTb3VyY2VJbmZvICo+KCk7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlcyB0aGUgdHlwZSBvcGVyYW5kIG9mIHRoaXMgdHlwZWlkKCkgZXhwcmVzc2lvbiBhZnRlcgorICAvLy8gdmFyaW91cyByZXF1aXJlZCBhZGp1c3RtZW50cyAocmVtb3ZpbmcgcmVmZXJlbmNlIHR5cGVzLCBjdi1xdWFsaWZpZXJzKS4KKyAgUXVhbFR5cGUgZ2V0VHlwZU9wZXJhbmQoQVNUQ29udGV4dCAmQ29udGV4dCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBzb3VyY2UgaW5mb3JtYXRpb24gZm9yIHRoZSB0eXBlIG9wZXJhbmQuCisgIFR5cGVTb3VyY2VJbmZvICpnZXRUeXBlT3BlcmFuZFNvdXJjZUluZm8oKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzVHlwZU9wZXJhbmQoKSAmJiAiQ2Fubm90IGNhbGwgZ2V0VHlwZU9wZXJhbmQgZm9yIHR5cGVpZChleHByKSIpOworICAgIHJldHVybiBPcGVyYW5kLmdldDxUeXBlU291cmNlSW5mbyAqPigpOworICB9CisKKyAgdm9pZCBzZXRUeXBlT3BlcmFuZFNvdXJjZUluZm8oVHlwZVNvdXJjZUluZm8gKlRTSSkgeworICAgIGFzc2VydChpc1R5cGVPcGVyYW5kKCkgJiYgIkNhbm5vdCBjYWxsIGdldFR5cGVPcGVyYW5kIGZvciB0eXBlaWQoZXhwcikiKTsKKyAgICBPcGVyYW5kID0gVFNJOworICB9CisKKyAgRXhwciAqZ2V0RXhwck9wZXJhbmQoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpc1R5cGVPcGVyYW5kKCkgJiYgIkNhbm5vdCBjYWxsIGdldEV4cHJPcGVyYW5kIGZvciB0eXBlaWQodHlwZSkiKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RXhwcio+KE9wZXJhbmQuZ2V0PFN0bXQgKj4oKSk7CisgIH0KKworICB2b2lkIHNldEV4cHJPcGVyYW5kKEV4cHIgKkUpIHsKKyAgICBhc3NlcnQoIWlzVHlwZU9wZXJhbmQoKSAmJiAiQ2Fubm90IGNhbGwgZ2V0RXhwck9wZXJhbmQgZm9yIHR5cGVpZCh0eXBlKSIpOworICAgIE9wZXJhbmQgPSBFOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJhbmdlLmdldEJlZ2luKCk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSYW5nZS5nZXRFbmQoKTsgfQorICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUmFuZ2U7IH0KKyAgdm9pZCBzZXRTb3VyY2VSYW5nZShTb3VyY2VSYW5nZSBSKSB7IFJhbmdlID0gUjsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBDWFhUeXBlaWRFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgaWYgKGlzVHlwZU9wZXJhbmQoKSkKKyAgICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgICBTdG10ICoqYmVnaW4gPSByZWludGVycHJldF9jYXN0PFN0bXQqKj4oJk9wZXJhbmQpOworICAgIHJldHVybiBjaGlsZF9yYW5nZShiZWdpbiwgYmVnaW4gKyAxKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBBIG1lbWJlciByZWZlcmVuY2UgdG8gYW4gTVNQcm9wZXJ0eURlY2wuIAorLy8vCisvLy8gVGhpcyBleHByZXNzaW9uIGFsd2F5cyBoYXMgcHNldWRvLW9iamVjdCB0eXBlLCBhbmQgdGhlcmVmb3JlIGl0IGlzCisvLy8gdHlwaWNhbGx5IG5vdCBlbmNvdW50ZXJlZCBpbiBhIGZ1bGx5LXR5cGVjaGVja2VkIGV4cHJlc3Npb24gZXhjZXB0CisvLy8gd2l0aGluIHRoZSBzeW50YWN0aWMgZm9ybSBvZiBhIFBzZXVkb09iamVjdEV4cHIuCitjbGFzcyBNU1Byb3BlcnR5UmVmRXhwciA6IHB1YmxpYyBFeHByIHsKKyAgRXhwciAqQmFzZUV4cHI7CisgIE1TUHJvcGVydHlEZWNsICpUaGVEZWNsOworICBTb3VyY2VMb2NhdGlvbiBNZW1iZXJMb2M7CisgIGJvb2wgSXNBcnJvdzsKKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2M7CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisKKyAgTVNQcm9wZXJ0eVJlZkV4cHIoRXhwciAqYmFzZUV4cHIsIE1TUHJvcGVydHlEZWNsICpkZWNsLCBib29sIGlzQXJyb3csCisgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIHR5LCBFeHByVmFsdWVLaW5kIFZLLAorICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIHF1YWxpZmllckxvYywKKyAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gbmFtZUxvYykKKyAgICAgIDogRXhwcihNU1Byb3BlcnR5UmVmRXhwckNsYXNzLCB0eSwgVkssIE9LX09yZGluYXJ5LAorICAgICAgICAgICAgIC8qdHlwZS1kZXBlbmRlbnQqLyBmYWxzZSwgYmFzZUV4cHItPmlzVmFsdWVEZXBlbmRlbnQoKSwKKyAgICAgICAgICAgICBiYXNlRXhwci0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCksCisgICAgICAgICAgICAgYmFzZUV4cHItPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIEJhc2VFeHByKGJhc2VFeHByKSwgVGhlRGVjbChkZWNsKSwKKyAgICAgICAgTWVtYmVyTG9jKG5hbWVMb2MpLCBJc0Fycm93KGlzQXJyb3cpLAorICAgICAgICBRdWFsaWZpZXJMb2MocXVhbGlmaWVyTG9jKSB7fQorCisgIE1TUHJvcGVydHlSZWZFeHByKEVtcHR5U2hlbGwgRW1wdHkpIDogRXhwcihNU1Byb3BlcnR5UmVmRXhwckNsYXNzLCBFbXB0eSkge30KKworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRMb2NTdGFydCgpLCBnZXRMb2NFbmQoKSk7CisgIH0KKworICBib29sIGlzSW1wbGljaXRBY2Nlc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEJhc2VFeHByKCkgJiYgZ2V0QmFzZUV4cHIoKS0+aXNJbXBsaWNpdENYWFRoaXMoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgeworICAgIGlmICghaXNJbXBsaWNpdEFjY2VzcygpKQorICAgICAgcmV0dXJuIEJhc2VFeHByLT5nZXRMb2NTdGFydCgpOworICAgIGVsc2UgaWYgKFF1YWxpZmllckxvYykKKyAgICAgIHJldHVybiBRdWFsaWZpZXJMb2MuZ2V0QmVnaW5Mb2MoKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBNZW1iZXJMb2M7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCB7IHJldHVybiBnZXRNZW1iZXJMb2MoKTsgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZSgoU3RtdCoqKSZCYXNlRXhwciwgKFN0bXQqKikmQmFzZUV4cHIgKyAxKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBNU1Byb3BlcnR5UmVmRXhwckNsYXNzOworICB9CisKKyAgRXhwciAqZ2V0QmFzZUV4cHIoKSBjb25zdCB7IHJldHVybiBCYXNlRXhwcjsgfQorICBNU1Byb3BlcnR5RGVjbCAqZ2V0UHJvcGVydHlEZWNsKCkgY29uc3QgeyByZXR1cm4gVGhlRGVjbDsgfQorICBib29sIGlzQXJyb3coKSBjb25zdCB7IHJldHVybiBJc0Fycm93OyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldE1lbWJlckxvYygpIGNvbnN0IHsgcmV0dXJuIE1lbWJlckxvYzsgfQorICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIGdldFF1YWxpZmllckxvYygpIGNvbnN0IHsgcmV0dXJuIFF1YWxpZmllckxvYzsgfQorfTsKKworLy8vIE1TIHByb3BlcnR5IHN1YnNjcmlwdCBleHByZXNzaW9uLgorLy8vIE1TVkMgc3VwcG9ydHMgJ3Byb3BlcnR5JyBhdHRyaWJ1dGUgYW5kIGFsbG93cyB0byBhcHBseSBpdCB0byB0aGUKKy8vLyBkZWNsYXJhdGlvbiBvZiBhbiBlbXB0eSBhcnJheSBpbiBhIGNsYXNzIG9yIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorLy8vIEZvciBleGFtcGxlOgorLy8vIFxjb2RlCisvLy8gX19kZWNsc3BlYyhwcm9wZXJ0eShnZXQ9R2V0WCwgcHV0PVB1dFgpKSBpbnQgeFtdOworLy8vIFxlbmRjb2RlCisvLy8gVGhlIGFib3ZlIHN0YXRlbWVudCBpbmRpY2F0ZXMgdGhhdCB4W10gY2FuIGJlIHVzZWQgd2l0aCBvbmUgb3IgbW9yZSBhcnJheQorLy8vIGluZGljZXMuIEluIHRoaXMgY2FzZSwgaT1wLT54W2FdW2JdIHdpbGwgYmUgdHVybmVkIGludG8gaT1wLT5HZXRYKGEsIGIpLCBhbmQKKy8vLyBwLT54W2FdW2JdID0gaSB3aWxsIGJlIHR1cm5lZCBpbnRvIHAtPlB1dFgoYSwgYiwgaSkuCisvLy8gVGhpcyBpcyBhIHN5bnRhY3RpYyBwc2V1ZG8tb2JqZWN0IGV4cHJlc3Npb24uCitjbGFzcyBNU1Byb3BlcnR5U3Vic2NyaXB0RXhwciA6IHB1YmxpYyBFeHByIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisKKyAgZW51bSB7IEJBU0VfRVhQUiwgSURYX0VYUFIsIE5VTV9TVUJFWFBSUyA9IDIgfTsKKworICBTdG10ICpTdWJFeHByc1tOVU1fU1VCRVhQUlNdOworICBTb3VyY2VMb2NhdGlvbiBSQnJhY2tldExvYzsKKworICB2b2lkIHNldEJhc2UoRXhwciAqQmFzZSkgeyBTdWJFeHByc1tCQVNFX0VYUFJdID0gQmFzZTsgfQorICB2b2lkIHNldElkeChFeHByICpJZHgpIHsgU3ViRXhwcnNbSURYX0VYUFJdID0gSWR4OyB9CisKK3B1YmxpYzoKKyAgTVNQcm9wZXJ0eVN1YnNjcmlwdEV4cHIoRXhwciAqQmFzZSwgRXhwciAqSWR4LCBRdWFsVHlwZSBUeSwgRXhwclZhbHVlS2luZCBWSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwck9iamVjdEtpbmQgT0ssIFNvdXJjZUxvY2F0aW9uIFJCcmFja2V0TG9jKQorICAgICAgOiBFeHByKE1TUHJvcGVydHlTdWJzY3JpcHRFeHByQ2xhc3MsIFR5LCBWSywgT0ssIElkeC0+aXNUeXBlRGVwZW5kZW50KCksCisgICAgICAgICAgICAgSWR4LT5pc1ZhbHVlRGVwZW5kZW50KCksIElkeC0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCksCisgICAgICAgICAgICAgSWR4LT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgICBSQnJhY2tldExvYyhSQnJhY2tldExvYykgeworICAgIFN1YkV4cHJzW0JBU0VfRVhQUl0gPSBCYXNlOworICAgIFN1YkV4cHJzW0lEWF9FWFBSXSA9IElkeDsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIGVtcHR5IGFycmF5IHN1YnNjcmlwdCBleHByZXNzaW9uLgorICBleHBsaWNpdCBNU1Byb3BlcnR5U3Vic2NyaXB0RXhwcihFbXB0eVNoZWxsIFNoZWxsKQorICAgICAgOiBFeHByKE1TUHJvcGVydHlTdWJzY3JpcHRFeHByQ2xhc3MsIFNoZWxsKSB7fQorCisgIEV4cHIgKmdldEJhc2UoKSB7IHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHJzW0JBU0VfRVhQUl0pOyB9CisgIGNvbnN0IEV4cHIgKmdldEJhc2UoKSBjb25zdCB7IHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHJzW0JBU0VfRVhQUl0pOyB9CisKKyAgRXhwciAqZ2V0SWR4KCkgeyByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByc1tJRFhfRVhQUl0pOyB9CisgIGNvbnN0IEV4cHIgKmdldElkeCgpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8RXhwcj4oU3ViRXhwcnNbSURYX0VYUFJdKTsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGdldEJhc2UoKS0+Z2V0TG9jU3RhcnQoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUkJyYWNrZXRMb2M7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRSQnJhY2tldExvYygpIGNvbnN0IHsgcmV0dXJuIFJCcmFja2V0TG9jOyB9CisgIHZvaWQgc2V0UkJyYWNrZXRMb2MoU291cmNlTG9jYXRpb24gTCkgeyBSQnJhY2tldExvYyA9IEw7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRFeHByTG9jKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGdldEJhc2UoKS0+Z2V0RXhwckxvYygpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE1TUHJvcGVydHlTdWJzY3JpcHRFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKCZTdWJFeHByc1swXSwgJlN1YkV4cHJzWzBdICsgTlVNX1NVQkVYUFJTKTsKKyAgfQorfTsKKworLy8vIEEgTWljcm9zb2Z0IEMrKyBAYyBfX3V1aWRvZiBleHByZXNzaW9uLCB3aGljaCBnZXRzCisvLy8gdGhlIF9HVUlEIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHN1cHBsaWVkIHR5cGUgb3IgZXhwcmVzc2lvbi4KKy8vLworLy8vIFRoaXMgcmVwcmVzZW50cyBjb2RlIGxpa2UgQGMgX191dWlkb2YoQ09NVFlQRSkgb3IgQGMgX191dWlkb2YoKmNvbVB0cikKK2NsYXNzIENYWFV1aWRvZkV4cHIgOiBwdWJsaWMgRXhwciB7Citwcml2YXRlOgorICBsbHZtOjpQb2ludGVyVW5pb248U3RtdCAqLCBUeXBlU291cmNlSW5mbyAqPiBPcGVyYW5kOworICBTdHJpbmdSZWYgVXVpZFN0cjsKKyAgU291cmNlUmFuZ2UgUmFuZ2U7CisKK3B1YmxpYzoKKyAgQ1hYVXVpZG9mRXhwcihRdWFsVHlwZSBUeSwgVHlwZVNvdXJjZUluZm8gKk9wZXJhbmQsIFN0cmluZ1JlZiBVdWlkU3RyLAorICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFIpCisgICAgICA6IEV4cHIoQ1hYVXVpZG9mRXhwckNsYXNzLCBUeSwgVktfTFZhbHVlLCBPS19PcmRpbmFyeSwgZmFsc2UsCisgICAgICAgICAgICAgT3BlcmFuZC0+Z2V0VHlwZSgpLT5pc0RlcGVuZGVudFR5cGUoKSwKKyAgICAgICAgICAgICBPcGVyYW5kLT5nZXRUeXBlKCktPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudFR5cGUoKSwKKyAgICAgICAgICAgICBPcGVyYW5kLT5nZXRUeXBlKCktPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIE9wZXJhbmQoT3BlcmFuZCksIFV1aWRTdHIoVXVpZFN0ciksIFJhbmdlKFIpIHt9CisKKyAgQ1hYVXVpZG9mRXhwcihRdWFsVHlwZSBUeSwgRXhwciAqT3BlcmFuZCwgU3RyaW5nUmVmIFV1aWRTdHIsIFNvdXJjZVJhbmdlIFIpCisgICAgICA6IEV4cHIoQ1hYVXVpZG9mRXhwckNsYXNzLCBUeSwgVktfTFZhbHVlLCBPS19PcmRpbmFyeSwgZmFsc2UsCisgICAgICAgICAgICAgT3BlcmFuZC0+aXNUeXBlRGVwZW5kZW50KCksIE9wZXJhbmQtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpLAorICAgICAgICAgICAgIE9wZXJhbmQtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIE9wZXJhbmQoT3BlcmFuZCksIFV1aWRTdHIoVXVpZFN0ciksIFJhbmdlKFIpIHt9CisKKyAgQ1hYVXVpZG9mRXhwcihFbXB0eVNoZWxsIEVtcHR5LCBib29sIGlzRXhwcikKKyAgICA6IEV4cHIoQ1hYVXVpZG9mRXhwckNsYXNzLCBFbXB0eSkgeworICAgIGlmIChpc0V4cHIpCisgICAgICBPcGVyYW5kID0gKEV4cHIqKW51bGxwdHI7CisgICAgZWxzZQorICAgICAgT3BlcmFuZCA9IChUeXBlU291cmNlSW5mbyopbnVsbHB0cjsKKyAgfQorCisgIGJvb2wgaXNUeXBlT3BlcmFuZCgpIGNvbnN0IHsgcmV0dXJuIE9wZXJhbmQuaXM8VHlwZVNvdXJjZUluZm8gKj4oKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmVzIHRoZSB0eXBlIG9wZXJhbmQgb2YgdGhpcyBfX3V1aWRvZigpIGV4cHJlc3Npb24gYWZ0ZXIKKyAgLy8vIHZhcmlvdXMgcmVxdWlyZWQgYWRqdXN0bWVudHMgKHJlbW92aW5nIHJlZmVyZW5jZSB0eXBlcywgY3YtcXVhbGlmaWVycykuCisgIFF1YWxUeXBlIGdldFR5cGVPcGVyYW5kKEFTVENvbnRleHQgJkNvbnRleHQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgc291cmNlIGluZm9ybWF0aW9uIGZvciB0aGUgdHlwZSBvcGVyYW5kLgorICBUeXBlU291cmNlSW5mbyAqZ2V0VHlwZU9wZXJhbmRTb3VyY2VJbmZvKCkgY29uc3QgeworICAgIGFzc2VydChpc1R5cGVPcGVyYW5kKCkgJiYgIkNhbm5vdCBjYWxsIGdldFR5cGVPcGVyYW5kIGZvciBfX3V1aWRvZihleHByKSIpOworICAgIHJldHVybiBPcGVyYW5kLmdldDxUeXBlU291cmNlSW5mbyAqPigpOworICB9CisKKyAgdm9pZCBzZXRUeXBlT3BlcmFuZFNvdXJjZUluZm8oVHlwZVNvdXJjZUluZm8gKlRTSSkgeworICAgIGFzc2VydChpc1R5cGVPcGVyYW5kKCkgJiYgIkNhbm5vdCBjYWxsIGdldFR5cGVPcGVyYW5kIGZvciBfX3V1aWRvZihleHByKSIpOworICAgIE9wZXJhbmQgPSBUU0k7CisgIH0KKworICBFeHByICpnZXRFeHByT3BlcmFuZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzVHlwZU9wZXJhbmQoKSAmJiAiQ2Fubm90IGNhbGwgZ2V0RXhwck9wZXJhbmQgZm9yIF9fdXVpZG9mKHR5cGUpIik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEV4cHIqPihPcGVyYW5kLmdldDxTdG10ICo+KCkpOworICB9CisKKyAgdm9pZCBzZXRFeHByT3BlcmFuZChFeHByICpFKSB7CisgICAgYXNzZXJ0KCFpc1R5cGVPcGVyYW5kKCkgJiYgIkNhbm5vdCBjYWxsIGdldEV4cHJPcGVyYW5kIGZvciBfX3V1aWRvZih0eXBlKSIpOworICAgIE9wZXJhbmQgPSBFOworICB9CisKKyAgdm9pZCBzZXRVdWlkU3RyKFN0cmluZ1JlZiBVUykgeyBVdWlkU3RyID0gVVM7IH0KKyAgU3RyaW5nUmVmIGdldFV1aWRTdHIoKSBjb25zdCB7IHJldHVybiBVdWlkU3RyOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJhbmdlLmdldEJlZ2luKCk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSYW5nZS5nZXRFbmQoKTsgfQorICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUmFuZ2U7IH0KKyAgdm9pZCBzZXRTb3VyY2VSYW5nZShTb3VyY2VSYW5nZSBSKSB7IFJhbmdlID0gUjsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBDWFhVdWlkb2ZFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgaWYgKGlzVHlwZU9wZXJhbmQoKSkKKyAgICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgICBTdG10ICoqYmVnaW4gPSByZWludGVycHJldF9jYXN0PFN0bXQqKj4oJk9wZXJhbmQpOworICAgIHJldHVybiBjaGlsZF9yYW5nZShiZWdpbiwgYmVnaW4gKyAxKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIHRoZSBcYyB0aGlzIGV4cHJlc3Npb24gaW4gQysrLgorLy8vCisvLy8gVGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdCBvbiB3aGljaCB0aGUgY3VycmVudCBtZW1iZXIgZnVuY3Rpb24gaXMKKy8vLyBleGVjdXRpbmcgKEMrKyBbZXhwci5wcmltXXAzKS4gRXhhbXBsZToKKy8vLworLy8vIFxjb2RlCisvLy8gY2xhc3MgRm9vIHsKKy8vLyBwdWJsaWM6CisvLy8gICB2b2lkIGJhcigpOworLy8vICAgdm9pZCB0ZXN0KCkgeyB0aGlzLT5iYXIoKTsgfQorLy8vIH07CisvLy8gXGVuZGNvZGUKK2NsYXNzIENYWFRoaXNFeHByIDogcHVibGljIEV4cHIgeworICBTb3VyY2VMb2NhdGlvbiBMb2M7CisgIGJvb2wgSW1wbGljaXQgOiAxOworCitwdWJsaWM6CisgIENYWFRoaXNFeHByKFNvdXJjZUxvY2F0aW9uIEwsIFF1YWxUeXBlIFR5cGUsIGJvb2wgaXNJbXBsaWNpdCkKKyAgICAgIDogRXhwcihDWFhUaGlzRXhwckNsYXNzLCBUeXBlLCBWS19SVmFsdWUsIE9LX09yZGluYXJ5LAorICAgICAgICAgICAgIC8vICd0aGlzJyBpcyB0eXBlLWRlcGVuZGVudCBpZiB0aGUgY2xhc3MgdHlwZSBvZiB0aGUgZW5jbG9zaW5nCisgICAgICAgICAgICAgLy8gbWVtYmVyIGZ1bmN0aW9uIGlzIGRlcGVuZGVudCAoQysrIFt0ZW1wLmRlcC5leHByXXAyKQorICAgICAgICAgICAgIFR5cGUtPmlzRGVwZW5kZW50VHlwZSgpLCBUeXBlLT5pc0RlcGVuZGVudFR5cGUoKSwKKyAgICAgICAgICAgICBUeXBlLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgICAgLypDb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrPSovZmFsc2UpLAorICAgICAgICBMb2MoTCksIEltcGxpY2l0KGlzSW1wbGljaXQpIHt9CisKKyAgQ1hYVGhpc0V4cHIoRW1wdHlTaGVsbCBFbXB0eSkgOiBFeHByKENYWFRoaXNFeHByQ2xhc3MsIEVtcHR5KSB7fQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9CisgIHZvaWQgc2V0TG9jYXRpb24oU291cmNlTG9jYXRpb24gTCkgeyBMb2MgPSBMOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIExvYzsgfQorCisgIGJvb2wgaXNJbXBsaWNpdCgpIGNvbnN0IHsgcmV0dXJuIEltcGxpY2l0OyB9CisgIHZvaWQgc2V0SW1wbGljaXQoYm9vbCBJKSB7IEltcGxpY2l0ID0gSTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBDWFhUaGlzRXhwckNsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBBIEMrKyB0aHJvdy1leHByZXNzaW9uIChDKysgW2V4Y2VwdC50aHJvd10pLgorLy8vCisvLy8gVGhpcyBoYW5kbGVzICd0aHJvdycgKGZvciByZS10aHJvd2luZyB0aGUgY3VycmVudCBleGNlcHRpb24pIGFuZAorLy8vICd0aHJvdycgYXNzaWdubWVudC1leHByZXNzaW9uLiAgV2hlbiBhc3NpZ25tZW50LWV4cHJlc3Npb24gaXNuJ3QKKy8vLyBwcmVzZW50LCBPcCB3aWxsIGJlIG51bGwuCitjbGFzcyBDWFhUaHJvd0V4cHIgOiBwdWJsaWMgRXhwciB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIFN0bXQgKk9wOworICBTb3VyY2VMb2NhdGlvbiBUaHJvd0xvYzsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhlIHRocm93biB2YXJpYWJsZSAoaWYgYW55KSBpcyBpbiBzY29wZS4KKyAgdW5zaWduZWQgSXNUaHJvd25WYXJpYWJsZUluU2NvcGUgOiAxOworCitwdWJsaWM6CisgIC8vIFxwIFR5IGlzIHRoZSB2b2lkIHR5cGUgd2hpY2ggaXMgdXNlZCBhcyB0aGUgcmVzdWx0IHR5cGUgb2YgdGhlCisgIC8vIGV4cHJlc3Npb24uICBUaGUgXHAgbCBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIHRocm93IGtleXdvcmQuICBccCBleHByCisgIC8vIGNhbiBieSBudWxsLCBpZiB0aGUgb3B0aW9uYWwgZXhwcmVzc2lvbiB0byB0aHJvdyBpc24ndCBwcmVzZW50LgorICBDWFhUaHJvd0V4cHIoRXhwciAqZXhwciwgUXVhbFR5cGUgVHksIFNvdXJjZUxvY2F0aW9uIGwsCisgICAgICAgICAgICAgICBib29sIElzVGhyb3duVmFyaWFibGVJblNjb3BlKQorICAgICAgOiBFeHByKENYWFRocm93RXhwckNsYXNzLCBUeSwgVktfUlZhbHVlLCBPS19PcmRpbmFyeSwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgICAgIGV4cHIgJiYgZXhwci0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCksCisgICAgICAgICAgICAgZXhwciAmJiBleHByLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgICBPcChleHByKSwgVGhyb3dMb2MobCksCisgICAgICAgIElzVGhyb3duVmFyaWFibGVJblNjb3BlKElzVGhyb3duVmFyaWFibGVJblNjb3BlKSB7fQorICBDWFhUaHJvd0V4cHIoRW1wdHlTaGVsbCBFbXB0eSkgOiBFeHByKENYWFRocm93RXhwckNsYXNzLCBFbXB0eSkge30KKworICBjb25zdCBFeHByICpnZXRTdWJFeHByKCkgY29uc3QgeyByZXR1cm4gY2FzdF9vcl9udWxsPEV4cHI+KE9wKTsgfQorICBFeHByICpnZXRTdWJFeHByKCkgeyByZXR1cm4gY2FzdF9vcl9udWxsPEV4cHI+KE9wKTsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFRocm93TG9jKCkgY29uc3QgeyByZXR1cm4gVGhyb3dMb2M7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB0aGUgdmFyaWFibGUgdGhyb3duIGJ5IHRoaXMgZXhwcmVzc2lvbiAoaWYgYW55ISkKKyAgLy8vIGlzIHdpdGhpbiB0aGUgaW5uZXJtb3N0IHRyeSBibG9jay4KKyAgLy8vCisgIC8vLyBUaGlzIGluZm9ybWF0aW9uIGlzIHJlcXVpcmVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBOUlZPIGNhbiBhcHBseSB0bworICAvLy8gdGhpcyB2YXJpYWJsZS4KKyAgYm9vbCBpc1Rocm93blZhcmlhYmxlSW5TY29wZSgpIGNvbnN0IHsgcmV0dXJuIElzVGhyb3duVmFyaWFibGVJblNjb3BlOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFRocm93TG9jOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgaWYgKCFnZXRTdWJFeHByKCkpCisgICAgICByZXR1cm4gVGhyb3dMb2M7CisgICAgcmV0dXJuIGdldFN1YkV4cHIoKS0+Z2V0TG9jRW5kKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ1hYVGhyb3dFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKCZPcCwgT3AgPyAmT3ArMSA6ICZPcCk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQSBkZWZhdWx0IGFyZ3VtZW50IChDKysgW2RjbC5mY3QuZGVmYXVsdF0pLgorLy8vCisvLy8gVGhpcyB3cmFwcyB1cCBhIGZ1bmN0aW9uIGNhbGwgYXJndW1lbnQgdGhhdCB3YXMgY3JlYXRlZCBmcm9tIHRoZQorLy8vIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyJ3MgZGVmYXVsdCBhcmd1bWVudCwgd2hlbiB0aGUgY2FsbCBkaWQgbm90CisvLy8gZXhwbGljaXRseSBzdXBwbHkgYXJndW1lbnRzIGZvciBhbGwgb2YgdGhlIHBhcmFtZXRlcnMuCitjbGFzcyBDWFhEZWZhdWx0QXJnRXhwciBmaW5hbCA6IHB1YmxpYyBFeHByIHsKKyAgLy8vIFxicmllZiBUaGUgcGFyYW1ldGVyIHdob3NlIGRlZmF1bHQgaXMgYmVpbmcgdXNlZC4KKyAgUGFybVZhckRlY2wgKlBhcmFtOworCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBkZWZhdWx0IGFyZ3VtZW50IGV4cHJlc3Npb24gd2FzIHVzZWQuCisgIFNvdXJjZUxvY2F0aW9uIExvYzsKKworICBDWFhEZWZhdWx0QXJnRXhwcihTdG10Q2xhc3MgU0MsIFNvdXJjZUxvY2F0aW9uIExvYywgUGFybVZhckRlY2wgKnBhcmFtKQorICAgICAgOiBFeHByKFNDLAorICAgICAgICAgICAgIHBhcmFtLT5oYXNVbnBhcnNlZERlZmF1bHRBcmcoKQorICAgICAgICAgICAgICAgPyBwYXJhbS0+Z2V0VHlwZSgpLmdldE5vblJlZmVyZW5jZVR5cGUoKQorICAgICAgICAgICAgICAgOiBwYXJhbS0+Z2V0RGVmYXVsdEFyZygpLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgcGFyYW0tPmdldERlZmF1bHRBcmcoKS0+Z2V0VmFsdWVLaW5kKCksCisgICAgICAgICAgICAgcGFyYW0tPmdldERlZmF1bHRBcmcoKS0+Z2V0T2JqZWN0S2luZCgpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgICAgIGZhbHNlKSwKKyAgICAgICAgUGFyYW0ocGFyYW0pLCBMb2MoTG9jKSB7fQorCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNUU3RtdFdyaXRlcjsKKworICBDWFhEZWZhdWx0QXJnRXhwcihFbXB0eVNoZWxsIEVtcHR5KSA6IEV4cHIoQ1hYRGVmYXVsdEFyZ0V4cHJDbGFzcywgRW1wdHkpIHt9CisKKyAgLy8gXHAgUGFyYW0gaXMgdGhlIHBhcmFtZXRlciB3aG9zZSBkZWZhdWx0IGFyZ3VtZW50IGlzIHVzZWQgYnkgdGhpcworICAvLyBleHByZXNzaW9uLgorICBzdGF0aWMgQ1hYRGVmYXVsdEFyZ0V4cHIgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcm1WYXJEZWNsICpQYXJhbSkgeworICAgIHJldHVybiBuZXcgKEMpIENYWERlZmF1bHRBcmdFeHByKENYWERlZmF1bHRBcmdFeHByQ2xhc3MsIExvYywgUGFyYW0pOworICB9CisKKyAgLy8gUmV0cmlldmUgdGhlIHBhcmFtZXRlciB0aGF0IHRoZSBhcmd1bWVudCB3YXMgY3JlYXRlZCBmcm9tLgorICBjb25zdCBQYXJtVmFyRGVjbCAqZ2V0UGFyYW0oKSBjb25zdCB7IHJldHVybiBQYXJhbTsgfQorICBQYXJtVmFyRGVjbCAqZ2V0UGFyYW0oKSB7IHJldHVybiBQYXJhbTsgfQorCisgIC8vIFJldHJpZXZlIHRoZSBhY3R1YWwgYXJndW1lbnQgdG8gdGhlIGZ1bmN0aW9uIGNhbGwuCisgIGNvbnN0IEV4cHIgKmdldEV4cHIoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFBhcmFtKCktPmdldERlZmF1bHRBcmcoKTsKKyAgfQorICBFeHByICpnZXRFeHByKCkgeworICAgIHJldHVybiBnZXRQYXJhbSgpLT5nZXREZWZhdWx0QXJnKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGlzIGRlZmF1bHQgYXJndW1lbnQgd2FzIGFjdHVhbGx5CisgIC8vLyB1c2VkLgorICBTb3VyY2VMb2NhdGlvbiBnZXRVc2VkTG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKworICAvLy8gRGVmYXVsdCBhcmd1bWVudCBleHByZXNzaW9ucyBoYXZlIG5vIHJlcHJlc2VudGF0aW9uIGluIHRoZQorICAvLy8gc291cmNlLCBzbyB0aGV5IGhhdmUgYW4gZW1wdHkgc291cmNlIHJhbmdlLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gU291cmNlTG9jYXRpb24oKTsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFNvdXJjZUxvY2F0aW9uKCk7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRFeHByTG9jKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2M7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ1hYRGVmYXVsdEFyZ0V4cHJDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoY2hpbGRfaXRlcmF0b3IoKSwgY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQSB1c2Ugb2YgYSBkZWZhdWx0IGluaXRpYWxpemVyIGluIGEgY29uc3RydWN0b3Igb3IgaW4gYWdncmVnYXRlCisvLy8gaW5pdGlhbGl6YXRpb24uCisvLy8KKy8vLyBUaGlzIHdyYXBzIGEgdXNlIG9mIGEgQysrIGRlZmF1bHQgaW5pdGlhbGl6ZXIgKHRlY2huaWNhbGx5LAorLy8vIGEgYnJhY2Utb3ItZXF1YWwtaW5pdGlhbGl6ZXIgZm9yIGEgbm9uLXN0YXRpYyBkYXRhIG1lbWJlcikgd2hlbiBpdAorLy8vIGlzIGltcGxpY2l0bHkgdXNlZCBpbiBhIG1lbS1pbml0aWFsaXplci1saXN0IGluIGEgY29uc3RydWN0b3IKKy8vLyAoQysrMTEgW2NsYXNzLmJhc2UuaW5pdF1wOCkgb3IgaW4gYWdncmVnYXRlIGluaXRpYWxpemF0aW9uCisvLy8gKEMrKzF5IFtkY2wuaW5pdC5hZ2dyXXA3KS4KK2NsYXNzIENYWERlZmF1bHRJbml0RXhwciA6IHB1YmxpYyBFeHByIHsKKyAgLy8vIFxicmllZiBUaGUgZmllbGQgd2hvc2UgZGVmYXVsdCBpcyBiZWluZyB1c2VkLgorICBGaWVsZERlY2wgKkZpZWxkOworCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBkZWZhdWx0IGluaXRpYWxpemVyIGV4cHJlc3Npb24gd2FzIHVzZWQuCisgIFNvdXJjZUxvY2F0aW9uIExvYzsKKworICBDWFhEZWZhdWx0SW5pdEV4cHIoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gTG9jLCBGaWVsZERlY2wgKkZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCk7CisKKyAgQ1hYRGVmYXVsdEluaXRFeHByKEVtcHR5U2hlbGwgRW1wdHkpIDogRXhwcihDWFhEZWZhdWx0SW5pdEV4cHJDbGFzcywgRW1wdHkpIHt9CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisKKyAgLy8vIFxwIEZpZWxkIGlzIHRoZSBub24tc3RhdGljIGRhdGEgbWVtYmVyIHdob3NlIGRlZmF1bHQgaW5pdGlhbGl6ZXIgaXMgdXNlZAorICAvLy8gYnkgdGhpcyBleHByZXNzaW9uLgorICBzdGF0aWMgQ1hYRGVmYXVsdEluaXRFeHByICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZWNsICpGaWVsZCkgeworICAgIHJldHVybiBuZXcgKEMpIENYWERlZmF1bHRJbml0RXhwcihDLCBMb2MsIEZpZWxkLCBGaWVsZC0+Z2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBmaWVsZCB3aG9zZSBpbml0aWFsaXplciB3aWxsIGJlIHVzZWQuCisgIEZpZWxkRGVjbCAqZ2V0RmllbGQoKSB7IHJldHVybiBGaWVsZDsgfQorICBjb25zdCBGaWVsZERlY2wgKmdldEZpZWxkKCkgY29uc3QgeyByZXR1cm4gRmllbGQ7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgaW5pdGlhbGl6YXRpb24gZXhwcmVzc2lvbiB0aGF0IHdpbGwgYmUgdXNlZC4KKyAgY29uc3QgRXhwciAqZ2V0RXhwcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoRmllbGQtPmdldEluQ2xhc3NJbml0aWFsaXplcigpICYmICJpbml0aWFsaXplciBoYXNuJ3QgYmVlbiBwYXJzZWQiKTsKKyAgICByZXR1cm4gRmllbGQtPmdldEluQ2xhc3NJbml0aWFsaXplcigpOworICB9CisgIEV4cHIgKmdldEV4cHIoKSB7CisgICAgYXNzZXJ0KEZpZWxkLT5nZXRJbkNsYXNzSW5pdGlhbGl6ZXIoKSAmJiAiaW5pdGlhbGl6ZXIgaGFzbid0IGJlZW4gcGFyc2VkIik7CisgICAgcmV0dXJuIEZpZWxkLT5nZXRJbkNsYXNzSW5pdGlhbGl6ZXIoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2M7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ1hYRGVmYXVsdEluaXRFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBDKysgdGVtcG9yYXJ5LgorY2xhc3MgQ1hYVGVtcG9yYXJ5IHsKKyAgLy8vIFxicmllZiBUaGUgZGVzdHJ1Y3RvciB0aGF0IG5lZWRzIHRvIGJlIGNhbGxlZC4KKyAgY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkRlc3RydWN0b3I7CisKKyAgZXhwbGljaXQgQ1hYVGVtcG9yYXJ5KGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpkZXN0cnVjdG9yKQorICAgICAgOiBEZXN0cnVjdG9yKGRlc3RydWN0b3IpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIENYWFRlbXBvcmFyeSAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqRGVzdHJ1Y3Rvcik7CisKKyAgY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKmdldERlc3RydWN0b3IoKSBjb25zdCB7IHJldHVybiBEZXN0cnVjdG9yOyB9CisKKyAgdm9pZCBzZXREZXN0cnVjdG9yKGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpEdG9yKSB7CisgICAgRGVzdHJ1Y3RvciA9IER0b3I7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBiaW5kaW5nIGFuIGV4cHJlc3Npb24gdG8gYSB0ZW1wb3JhcnkuCisvLy8KKy8vLyBUaGlzIGVuc3VyZXMgdGhlIGRlc3RydWN0b3IgaXMgY2FsbGVkIGZvciB0aGUgdGVtcG9yYXJ5LiBJdCBzaG91bGQgb25seSBiZQorLy8vIG5lZWRlZCBmb3Igbm9uLVBPRCwgbm9uLXRyaXZpYWxseSBkZXN0cnVjdGFibGUgY2xhc3MgdHlwZXMuIEZvciBleGFtcGxlOgorLy8vCisvLy8gXGNvZGUKKy8vLyAgIHN0cnVjdCBTIHsKKy8vLyAgICAgUygpIHsgfSAgLy8gVXNlciBkZWZpbmVkIGNvbnN0cnVjdG9yIG1ha2VzIFMgbm9uLVBPRC4KKy8vLyAgICAgflMoKSB7IH0gLy8gVXNlciBkZWZpbmVkIGRlc3RydWN0b3IgbWFrZXMgaXQgbm9uLXRyaXZpYWwuCisvLy8gICB9OworLy8vICAgdm9pZCB0ZXN0KCkgeworLy8vICAgICBjb25zdCBTICZzX3JlZiA9IFMoKTsgLy8gUmVxdWlyZXMgYSBDWFhCaW5kVGVtcG9yYXJ5RXhwci4KKy8vLyAgIH0KKy8vLyBcZW5kY29kZQorY2xhc3MgQ1hYQmluZFRlbXBvcmFyeUV4cHIgOiBwdWJsaWMgRXhwciB7CisgIENYWFRlbXBvcmFyeSAqVGVtcCA9IG51bGxwdHI7CisgIFN0bXQgKlN1YkV4cHIgPSBudWxscHRyOworCisgIENYWEJpbmRUZW1wb3JhcnlFeHByKENYWFRlbXBvcmFyeSAqdGVtcCwgRXhwciogU3ViRXhwcikKKyAgICAgIDogRXhwcihDWFhCaW5kVGVtcG9yYXJ5RXhwckNsYXNzLCBTdWJFeHByLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgVktfUlZhbHVlLCBPS19PcmRpbmFyeSwgU3ViRXhwci0+aXNUeXBlRGVwZW5kZW50KCksCisgICAgICAgICAgICAgU3ViRXhwci0+aXNWYWx1ZURlcGVuZGVudCgpLAorICAgICAgICAgICAgIFN1YkV4cHItPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpLAorICAgICAgICAgICAgIFN1YkV4cHItPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIFRlbXAodGVtcCksIFN1YkV4cHIoU3ViRXhwcikge30KKworcHVibGljOgorICBDWFhCaW5kVGVtcG9yYXJ5RXhwcihFbXB0eVNoZWxsIEVtcHR5KQorICAgICAgOiBFeHByKENYWEJpbmRUZW1wb3JhcnlFeHByQ2xhc3MsIEVtcHR5KSB7fQorCisgIHN0YXRpYyBDWFhCaW5kVGVtcG9yYXJ5RXhwciAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIENYWFRlbXBvcmFyeSAqVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciogU3ViRXhwcik7CisKKyAgQ1hYVGVtcG9yYXJ5ICpnZXRUZW1wb3JhcnkoKSB7IHJldHVybiBUZW1wOyB9CisgIGNvbnN0IENYWFRlbXBvcmFyeSAqZ2V0VGVtcG9yYXJ5KCkgY29uc3QgeyByZXR1cm4gVGVtcDsgfQorICB2b2lkIHNldFRlbXBvcmFyeShDWFhUZW1wb3JhcnkgKlQpIHsgVGVtcCA9IFQ7IH0KKworICBjb25zdCBFeHByICpnZXRTdWJFeHByKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByKTsgfQorICBFeHByICpnZXRTdWJFeHByKCkgeyByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByKTsgfQorICB2b2lkIHNldFN1YkV4cHIoRXhwciAqRSkgeyBTdWJFeHByID0gRTsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIFN1YkV4cHItPmdldExvY1N0YXJ0KCk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFN1YkV4cHItPmdldExvY0VuZCgpO30KKworICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC9ldGMuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBDWFhCaW5kVGVtcG9yYXJ5RXhwckNsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoJlN1YkV4cHIsICZTdWJFeHByICsgMSk7IH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIGNhbGwgdG8gYSBDKysgY29uc3RydWN0b3IuCitjbGFzcyBDWFhDb25zdHJ1Y3RFeHByIDogcHVibGljIEV4cHIgeworcHVibGljOgorICBlbnVtIENvbnN0cnVjdGlvbktpbmQgeworICAgIENLX0NvbXBsZXRlLAorICAgIENLX05vblZpcnR1YWxCYXNlLAorICAgIENLX1ZpcnR1YWxCYXNlLAorICAgIENLX0RlbGVnYXRpbmcKKyAgfTsKKworcHJpdmF0ZToKKyAgQ1hYQ29uc3RydWN0b3JEZWNsICpDb25zdHJ1Y3RvciA9IG51bGxwdHI7CisgIFNvdXJjZUxvY2F0aW9uIExvYzsKKyAgU291cmNlUmFuZ2UgUGFyZW5PckJyYWNlUmFuZ2U7CisgIHVuc2lnbmVkIE51bUFyZ3MgOiAxNjsKKyAgdW5zaWduZWQgRWxpZGFibGUgOiAxOworICB1bnNpZ25lZCBIYWRNdWx0aXBsZUNhbmRpZGF0ZXMgOiAxOworICB1bnNpZ25lZCBMaXN0SW5pdGlhbGl6YXRpb24gOiAxOworICB1bnNpZ25lZCBTdGRJbml0TGlzdEluaXRpYWxpemF0aW9uIDogMTsKKyAgdW5zaWduZWQgWmVyb0luaXRpYWxpemF0aW9uIDogMTsKKyAgdW5zaWduZWQgQ29uc3RydWN0S2luZCA6IDI7CisgIFN0bXQgKipBcmdzID0gbnVsbHB0cjsKKworICB2b2lkIHNldENvbnN0cnVjdG9yKENYWENvbnN0cnVjdG9yRGVjbCAqQykgeyBDb25zdHJ1Y3RvciA9IEM7IH0KKworcHJvdGVjdGVkOgorICBDWFhDb25zdHJ1Y3RFeHByKGNvbnN0IEFTVENvbnRleHQgJkMsIFN0bXRDbGFzcyBTQywgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgQ1hYQ29uc3RydWN0b3JEZWNsICpDdG9yLAorICAgICAgICAgICAgICAgICAgIGJvb2wgRWxpZGFibGUsCisgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgIGJvb2wgSGFkTXVsdGlwbGVDYW5kaWRhdGVzLAorICAgICAgICAgICAgICAgICAgIGJvb2wgTGlzdEluaXRpYWxpemF0aW9uLAorICAgICAgICAgICAgICAgICAgIGJvb2wgU3RkSW5pdExpc3RJbml0aWFsaXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICBib29sIFplcm9Jbml0aWFsaXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICBDb25zdHJ1Y3Rpb25LaW5kIENvbnN0cnVjdEtpbmQsCisgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgUGFyZW5PckJyYWNlUmFuZ2UpOworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIGVtcHR5IEMrKyBjb25zdHJ1Y3Rpb24gZXhwcmVzc2lvbi4KKyAgQ1hYQ29uc3RydWN0RXhwcihTdG10Q2xhc3MgU0MsIEVtcHR5U2hlbGwgRW1wdHkpCisgICAgICA6IEV4cHIoU0MsIEVtcHR5KSwgTnVtQXJncygwKSwgRWxpZGFibGUoZmFsc2UpLAorICAgICAgICBIYWRNdWx0aXBsZUNhbmRpZGF0ZXMoZmFsc2UpLCBMaXN0SW5pdGlhbGl6YXRpb24oZmFsc2UpLAorICAgICAgICBaZXJvSW5pdGlhbGl6YXRpb24oZmFsc2UpLCBDb25zdHJ1Y3RLaW5kKDApIHt9CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYW4gZW1wdHkgQysrIGNvbnN0cnVjdGlvbiBleHByZXNzaW9uLgorICBleHBsaWNpdCBDWFhDb25zdHJ1Y3RFeHByKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgICA6IENYWENvbnN0cnVjdEV4cHIoQ1hYQ29uc3RydWN0RXhwckNsYXNzLCBFbXB0eSkge30KKworICBzdGF0aWMgQ1hYQ29uc3RydWN0RXhwciAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWENvbnN0cnVjdG9yRGVjbCAqQ3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEVsaWRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhZE11bHRpcGxlQ2FuZGlkYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIExpc3RJbml0aWFsaXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFN0ZEluaXRMaXN0SW5pdGlhbGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBaZXJvSW5pdGlhbGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RydWN0aW9uS2luZCBDb25zdHJ1Y3RLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFBhcmVuT3JCcmFjZVJhbmdlKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgY29uc3RydWN0b3IgdGhhdCB0aGlzIGV4cHJlc3Npb24gd2lsbCAodWx0aW1hdGVseSkgY2FsbC4KKyAgQ1hYQ29uc3RydWN0b3JEZWNsICpnZXRDb25zdHJ1Y3RvcigpIGNvbnN0IHsgcmV0dXJuIENvbnN0cnVjdG9yOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKyAgdm9pZCBzZXRMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBMb2MpIHsgdGhpcy0+TG9jID0gTG9jOyB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgY29uc3RydWN0aW9uIGlzIGVsaWRhYmxlLgorICBib29sIGlzRWxpZGFibGUoKSBjb25zdCB7IHJldHVybiBFbGlkYWJsZTsgfQorICB2b2lkIHNldEVsaWRhYmxlKGJvb2wgRSkgeyBFbGlkYWJsZSA9IEU7IH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhlIHJlZmVycmVkIGNvbnN0cnVjdG9yIHdhcyByZXNvbHZlZCBmcm9tCisgIC8vLyBhbiBvdmVybG9hZGVkIHNldCBoYXZpbmcgc2l6ZSBncmVhdGVyIHRoYW4gMS4KKyAgYm9vbCBoYWRNdWx0aXBsZUNhbmRpZGF0ZXMoKSBjb25zdCB7IHJldHVybiBIYWRNdWx0aXBsZUNhbmRpZGF0ZXM7IH0KKyAgdm9pZCBzZXRIYWRNdWx0aXBsZUNhbmRpZGF0ZXMoYm9vbCBWKSB7IEhhZE11bHRpcGxlQ2FuZGlkYXRlcyA9IFY7IH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBjb25zdHJ1Y3RvciBjYWxsIHdhcyB3cml0dGVuIGFzIGxpc3QtaW5pdGlhbGl6YXRpb24uCisgIGJvb2wgaXNMaXN0SW5pdGlhbGl6YXRpb24oKSBjb25zdCB7IHJldHVybiBMaXN0SW5pdGlhbGl6YXRpb247IH0KKyAgdm9pZCBzZXRMaXN0SW5pdGlhbGl6YXRpb24oYm9vbCBWKSB7IExpc3RJbml0aWFsaXphdGlvbiA9IFY7IH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBjb25zdHJ1Y3RvciBjYWxsIHdhcyB3cml0dGVuIGFzIGxpc3QtaW5pdGlhbGl6YXRpb24sCisgIC8vLyBidXQgd2FzIGludGVycHJldGVkIGFzIGZvcm1pbmcgYSBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gZnJvbSB0aGUgbGlzdAorICAvLy8gYW5kIHBhc3NpbmcgdGhhdCBhcyBhIHNpbmdsZSBjb25zdHJ1Y3RvciBhcmd1bWVudC4KKyAgLy8vIFNlZSBDKysxMSBbb3Zlci5tYXRjaC5saXN0XXAxIGJ1bGxldCAxLgorICBib29sIGlzU3RkSW5pdExpc3RJbml0aWFsaXphdGlvbigpIGNvbnN0IHsgcmV0dXJuIFN0ZEluaXRMaXN0SW5pdGlhbGl6YXRpb247IH0KKyAgdm9pZCBzZXRTdGRJbml0TGlzdEluaXRpYWxpemF0aW9uKGJvb2wgVikgeyBTdGRJbml0TGlzdEluaXRpYWxpemF0aW9uID0gVjsgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGNvbnN0cnVjdGlvbiBmaXJzdCByZXF1aXJlcworICAvLy8gemVyby1pbml0aWFsaXphdGlvbiBiZWZvcmUgdGhlIGluaXRpYWxpemVyIGlzIGNhbGxlZC4KKyAgYm9vbCByZXF1aXJlc1plcm9Jbml0aWFsaXphdGlvbigpIGNvbnN0IHsgcmV0dXJuIFplcm9Jbml0aWFsaXphdGlvbjsgfQorICB2b2lkIHNldFJlcXVpcmVzWmVyb0luaXRpYWxpemF0aW9uKGJvb2wgWmVyb0luaXQpIHsKKyAgICBaZXJvSW5pdGlhbGl6YXRpb24gPSBaZXJvSW5pdDsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjb25zdHJ1Y3RvciBpcyBhY3R1YWxseSBjb25zdHJ1Y3RpbmcKKyAgLy8vIGEgYmFzZSBjbGFzcyAocmF0aGVyIHRoYW4gYSBjb21wbGV0ZSBvYmplY3QpLgorICBDb25zdHJ1Y3Rpb25LaW5kIGdldENvbnN0cnVjdGlvbktpbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIChDb25zdHJ1Y3Rpb25LaW5kKUNvbnN0cnVjdEtpbmQ7CisgIH0KKyAgdm9pZCBzZXRDb25zdHJ1Y3Rpb25LaW5kKENvbnN0cnVjdGlvbktpbmQgQ0spIHsKKyAgICBDb25zdHJ1Y3RLaW5kID0gQ0s7CisgIH0KKworICB1c2luZyBhcmdfaXRlcmF0b3IgPSBFeHBySXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2FyZ19pdGVyYXRvciA9IENvbnN0RXhwckl0ZXJhdG9yOworICB1c2luZyBhcmdfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxhcmdfaXRlcmF0b3I+OworICB1c2luZyBhcmdfY29uc3RfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxjb25zdF9hcmdfaXRlcmF0b3I+OworCisgIGFyZ19yYW5nZSBhcmd1bWVudHMoKSB7IHJldHVybiBhcmdfcmFuZ2UoYXJnX2JlZ2luKCksIGFyZ19lbmQoKSk7IH0KKyAgYXJnX2NvbnN0X3JhbmdlIGFyZ3VtZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gYXJnX2NvbnN0X3JhbmdlKGFyZ19iZWdpbigpLCBhcmdfZW5kKCkpOworICB9CisKKyAgYXJnX2l0ZXJhdG9yIGFyZ19iZWdpbigpIHsgcmV0dXJuIEFyZ3M7IH0KKyAgYXJnX2l0ZXJhdG9yIGFyZ19lbmQoKSB7IHJldHVybiBBcmdzICsgTnVtQXJnczsgfQorICBjb25zdF9hcmdfaXRlcmF0b3IgYXJnX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gQXJnczsgfQorICBjb25zdF9hcmdfaXRlcmF0b3IgYXJnX2VuZCgpIGNvbnN0IHsgcmV0dXJuIEFyZ3MgKyBOdW1BcmdzOyB9CisKKyAgRXhwciAqKmdldEFyZ3MoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PEV4cHIgKio+KEFyZ3MpOyB9CisgIGNvbnN0IEV4cHIgKmNvbnN0ICpnZXRBcmdzKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PENYWENvbnN0cnVjdEV4cHIgKj4odGhpcyktPmdldEFyZ3MoKTsKKyAgfQorICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3QgeyByZXR1cm4gTnVtQXJnczsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQuCisgIEV4cHIgKmdldEFyZyh1bnNpZ25lZCBBcmcpIHsKKyAgICBhc3NlcnQoQXJnIDwgTnVtQXJncyAmJiAiQXJnIGFjY2VzcyBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGNhc3Q8RXhwcj4oQXJnc1tBcmddKTsKKyAgfQorICBjb25zdCBFeHByICpnZXRBcmcodW5zaWduZWQgQXJnKSBjb25zdCB7CisgICAgYXNzZXJ0KEFyZyA8IE51bUFyZ3MgJiYgIkFyZyBhY2Nlc3Mgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBjYXN0PEV4cHI+KEFyZ3NbQXJnXSk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50LgorICB2b2lkIHNldEFyZyh1bnNpZ25lZCBBcmcsIEV4cHIgKkFyZ0V4cHIpIHsKKyAgICBhc3NlcnQoQXJnIDwgTnVtQXJncyAmJiAiQXJnIGFjY2VzcyBvdXQgb2YgcmFuZ2UhIik7CisgICAgQXJnc1tBcmddID0gQXJnRXhwcjsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgU291cmNlUmFuZ2UgZ2V0UGFyZW5PckJyYWNlUmFuZ2UoKSBjb25zdCB7IHJldHVybiBQYXJlbk9yQnJhY2VSYW5nZTsgfQorICB2b2lkIHNldFBhcmVuT3JCcmFjZVJhbmdlKFNvdXJjZVJhbmdlIFJhbmdlKSB7IFBhcmVuT3JCcmFjZVJhbmdlID0gUmFuZ2U7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ1hYQ29uc3RydWN0RXhwckNsYXNzIHx8CisgICAgICBULT5nZXRTdG10Q2xhc3MoKSA9PSBDWFhUZW1wb3JhcnlPYmplY3RFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKCZBcmdzWzBdLCAmQXJnc1swXStOdW1BcmdzKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgY2FsbCB0byBhbiBpbmhlcml0ZWQgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvciBmcm9tIGFuCisvLy8gaW5oZXJpdGluZyBjb25zdHJ1Y3Rvci4gVGhpcyBjYWxsIGltcGxpY2l0bHkgZm9yd2FyZHMgdGhlIGFyZ3VtZW50cyBmcm9tCisvLy8gdGhlIGVuY2xvc2luZyBjb250ZXh0IChhbiBpbmhlcml0aW5nIGNvbnN0cnVjdG9yKSB0byB0aGUgc3BlY2lmaWVkIGluaGVyaXRlZAorLy8vIGJhc2UgY2xhc3MgY29uc3RydWN0b3IuCitjbGFzcyBDWFhJbmhlcml0ZWRDdG9ySW5pdEV4cHIgOiBwdWJsaWMgRXhwciB7Citwcml2YXRlOgorICBDWFhDb25zdHJ1Y3RvckRlY2wgKkNvbnN0cnVjdG9yID0gbnVsbHB0cjsKKworICAvLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSB1c2luZyBkZWNsYXJhdGlvbi4KKyAgU291cmNlTG9jYXRpb24gTG9jOworCisgIC8vLyBXaGV0aGVyIHRoaXMgaXMgdGhlIGNvbnN0cnVjdGlvbiBvZiBhIHZpcnR1YWwgYmFzZS4KKyAgdW5zaWduZWQgQ29uc3RydWN0c1ZpcnR1YWxCYXNlIDogMTsKKworICAvLy8gV2hldGhlciB0aGUgY29uc3RydWN0b3IgaXMgaW5oZXJpdGVkIGZyb20gYSB2aXJ0dWFsIGJhc2UgY2xhc3Mgb2YgdGhlCisgIC8vLyBjbGFzcyB0aGF0IHdlIGNvbnN0cnVjdC4KKyAgdW5zaWduZWQgSW5oZXJpdGVkRnJvbVZpcnR1YWxCYXNlIDogMTsKKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIEMrKyBpbmhlcml0aW5nIGNvbnN0cnVjdGlvbiBleHByZXNzaW9uLgorICBDWFhJbmhlcml0ZWRDdG9ySW5pdEV4cHIoU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ29uc3RydWN0b3JEZWNsICpDdG9yLCBib29sIENvbnN0cnVjdHNWaXJ0dWFsQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5oZXJpdGVkRnJvbVZpcnR1YWxCYXNlKQorICAgICAgOiBFeHByKENYWEluaGVyaXRlZEN0b3JJbml0RXhwckNsYXNzLCBULCBWS19SVmFsdWUsIE9LX09yZGluYXJ5LCBmYWxzZSwKKyAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgQ29uc3RydWN0b3IoQ3RvciksIExvYyhMb2MpLAorICAgICAgICBDb25zdHJ1Y3RzVmlydHVhbEJhc2UoQ29uc3RydWN0c1ZpcnR1YWxCYXNlKSwKKyAgICAgICAgSW5oZXJpdGVkRnJvbVZpcnR1YWxCYXNlKEluaGVyaXRlZEZyb21WaXJ0dWFsQmFzZSkgeworICAgIGFzc2VydCghVC0+aXNEZXBlbmRlbnRUeXBlKCkpOworICB9CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYW4gZW1wdHkgQysrIGluaGVyaXRpbmcgY29uc3RydWN0aW9uIGV4cHJlc3Npb24uCisgIGV4cGxpY2l0IENYWEluaGVyaXRlZEN0b3JJbml0RXhwcihFbXB0eVNoZWxsIEVtcHR5KQorICAgICAgOiBFeHByKENYWEluaGVyaXRlZEN0b3JJbml0RXhwckNsYXNzLCBFbXB0eSksCisgICAgICAgIENvbnN0cnVjdHNWaXJ0dWFsQmFzZShmYWxzZSksIEluaGVyaXRlZEZyb21WaXJ0dWFsQmFzZShmYWxzZSkge30KKworICAvLy8gXGJyaWVmIEdldCB0aGUgY29uc3RydWN0b3IgdGhhdCB0aGlzIGV4cHJlc3Npb24gd2lsbCBjYWxsLgorICBDWFhDb25zdHJ1Y3RvckRlY2wgKmdldENvbnN0cnVjdG9yKCkgY29uc3QgeyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY29uc3RydWN0b3IgaXMgYWN0dWFsbHkgY29uc3RydWN0aW5nCisgIC8vLyBhIGJhc2UgY2xhc3MgKHJhdGhlciB0aGFuIGEgY29tcGxldGUgb2JqZWN0KS4KKyAgYm9vbCBjb25zdHJ1Y3RzVkJhc2UoKSBjb25zdCB7IHJldHVybiBDb25zdHJ1Y3RzVmlydHVhbEJhc2U7IH0KKyAgQ1hYQ29uc3RydWN0RXhwcjo6Q29uc3RydWN0aW9uS2luZCBnZXRDb25zdHJ1Y3Rpb25LaW5kKCkgY29uc3QgeworICAgIHJldHVybiBDb25zdHJ1Y3RzVmlydHVhbEJhc2UgPyBDWFhDb25zdHJ1Y3RFeHByOjpDS19WaXJ0dWFsQmFzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDWFhDb25zdHJ1Y3RFeHByOjpDS19Ob25WaXJ0dWFsQmFzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGluaGVyaXRlZCBjb25zdHJ1Y3RvciBpcyBpbmhlcml0ZWQgZnJvbSBhCisgIC8vLyB2aXJ0dWFsIGJhc2Ugb2YgdGhlIG9iamVjdCB3ZSBjb25zdHJ1Y3QuIElmIHNvLCB3ZSBhcmUgbm90IHJlc3BvbnNpYmxlCisgIC8vLyBmb3IgY2FsbGluZyB0aGUgaW5oZXJpdGVkIGNvbnN0cnVjdG9yICh0aGUgY29tcGxldGUgb2JqZWN0IGNvbnN0cnVjdG9yCisgIC8vLyBkb2VzIHRoYXQpLCBhbmQgc28gd2UgZG9uJ3QgbmVlZCB0byBwYXNzIGFueSBhcmd1bWVudHMuCisgIGJvb2wgaW5oZXJpdGVkRnJvbVZCYXNlKCkgY29uc3QgeyByZXR1cm4gSW5oZXJpdGVkRnJvbVZpcnR1YWxCYXNlOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gTG9jOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IENYWEluaGVyaXRlZEN0b3JJbml0RXhwckNsYXNzOworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYW4gZXhwbGljaXQgQysrIHR5cGUgY29udmVyc2lvbiB0aGF0IHVzZXMgImZ1bmN0aW9uYWwiCisvLy8gbm90YXRpb24gKEMrKyBbZXhwci50eXBlLmNvbnZdKS4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8gXGNvZGUKKy8vLyAgIHggPSBpbnQoMC41KTsKKy8vLyBcZW5kY29kZQorY2xhc3MgQ1hYRnVuY3Rpb25hbENhc3RFeHByIGZpbmFsCisgICAgOiBwdWJsaWMgRXhwbGljaXRDYXN0RXhwciwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPENYWEZ1bmN0aW9uYWxDYXN0RXhwciwgQ1hYQmFzZVNwZWNpZmllciAqPiB7CisgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYzsKKyAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jOworCisgIENYWEZ1bmN0aW9uYWxDYXN0RXhwcihRdWFsVHlwZSB0eSwgRXhwclZhbHVlS2luZCBWSywKKyAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICp3cml0dGVuVHksCisgICAgICAgICAgICAgICAgICAgICAgICBDYXN0S2luZCBraW5kLCBFeHByICpjYXN0RXhwciwgdW5zaWduZWQgcGF0aFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBsUGFyZW5Mb2MsIFNvdXJjZUxvY2F0aW9uIHJQYXJlbkxvYykKKyAgICAgIDogRXhwbGljaXRDYXN0RXhwcihDWFhGdW5jdGlvbmFsQ2FzdEV4cHJDbGFzcywgdHksIFZLLCBraW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RFeHByLCBwYXRoU2l6ZSwgd3JpdHRlblR5KSwKKyAgICAgICAgTFBhcmVuTG9jKGxQYXJlbkxvYyksIFJQYXJlbkxvYyhyUGFyZW5Mb2MpIHt9CisKKyAgZXhwbGljaXQgQ1hYRnVuY3Rpb25hbENhc3RFeHByKEVtcHR5U2hlbGwgU2hlbGwsIHVuc2lnbmVkIFBhdGhTaXplKQorICAgICAgOiBFeHBsaWNpdENhc3RFeHByKENYWEZ1bmN0aW9uYWxDYXN0RXhwckNsYXNzLCBTaGVsbCwgUGF0aFNpemUpIHt9CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIENhc3RFeHByOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIHN0YXRpYyBDWFhGdW5jdGlvbmFsQ2FzdEV4cHIgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LCBRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwclZhbHVlS2luZCBWSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzdEtpbmQgS2luZCwgRXhwciAqT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhDYXN0UGF0aCAqUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBMb2MpOworICBzdGF0aWMgQ1hYRnVuY3Rpb25hbENhc3RFeHByICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQYXRoU2l6ZSk7CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TFBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gTFBhcmVuTG9jOyB9CisgIHZvaWQgc2V0TFBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIEwpIHsgTFBhcmVuTG9jID0gTDsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRSUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKyAgdm9pZCBzZXRSUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTCkgeyBSUGFyZW5Mb2MgPSBMOyB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgZXhwcmVzc2lvbiBtb2RlbHMgbGlzdC1pbml0aWFsaXphdGlvbi4KKyAgYm9vbCBpc0xpc3RJbml0aWFsaXphdGlvbigpIGNvbnN0IHsgcmV0dXJuIExQYXJlbkxvYy5pc0ludmFsaWQoKTsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ1hYRnVuY3Rpb25hbENhc3RFeHByQ2xhc3M7CisgIH0KK307CisKKy8vLyBAYnJpZWYgUmVwcmVzZW50cyBhIEMrKyBmdW5jdGlvbmFsIGNhc3QgZXhwcmVzc2lvbiB0aGF0IGJ1aWxkcyBhCisvLy8gdGVtcG9yYXJ5IG9iamVjdC4KKy8vLworLy8vIFRoaXMgZXhwcmVzc2lvbiB0eXBlIHJlcHJlc2VudHMgYSBDKysgImZ1bmN0aW9uYWwiIGNhc3QKKy8vLyAoQysrW2V4cHIudHlwZS5jb252XSkgd2l0aCBOICE9IDEgYXJndW1lbnRzIHRoYXQgaW52b2tlcyBhCisvLy8gY29uc3RydWN0b3IgdG8gYnVpbGQgYSB0ZW1wb3Jhcnkgb2JqZWN0LiBXaXRoIE4gPT0gMSBhcmd1bWVudHMgdGhlCisvLy8gZnVuY3Rpb25hbCBjYXN0IGV4cHJlc3Npb24gd2lsbCBiZSByZXByZXNlbnRlZCBieSBDWFhGdW5jdGlvbmFsQ2FzdEV4cHIuCisvLy8gRXhhbXBsZToKKy8vLyBcY29kZQorLy8vIHN0cnVjdCBYIHsgWChpbnQsIGZsb2F0KTsgfQorLy8vCisvLy8gWCBjcmVhdGVfWCgpIHsKKy8vLyAgIHJldHVybiBYKDEsIDMuMTRmKTsgLy8gY3JlYXRlcyBhIENYWFRlbXBvcmFyeU9iamVjdEV4cHIKKy8vLyB9OworLy8vIFxlbmRjb2RlCitjbGFzcyBDWFhUZW1wb3JhcnlPYmplY3RFeHByIDogcHVibGljIENYWENvbnN0cnVjdEV4cHIgeworICBUeXBlU291cmNlSW5mbyAqVHlwZSA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisKKyAgQ1hYVGVtcG9yYXJ5T2JqZWN0RXhwcihjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgIENYWENvbnN0cnVjdG9yRGVjbCAqQ29ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFBhcmVuT3JCcmFjZVJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFkTXVsdGlwbGVDYW5kaWRhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTGlzdEluaXRpYWxpemF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3RkSW5pdExpc3RJbml0aWFsaXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFplcm9Jbml0aWFsaXphdGlvbik7CisgIGV4cGxpY2l0IENYWFRlbXBvcmFyeU9iamVjdEV4cHIoRW1wdHlTaGVsbCBFbXB0eSkKKyAgICAgIDogQ1hYQ29uc3RydWN0RXhwcihDWFhUZW1wb3JhcnlPYmplY3RFeHByQ2xhc3MsIEVtcHR5KSB7fQorCisgIFR5cGVTb3VyY2VJbmZvICpnZXRUeXBlU291cmNlSW5mbygpIGNvbnN0IHsgcmV0dXJuIFR5cGU7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IENYWFRlbXBvcmFyeU9iamVjdEV4cHJDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBBIEMrKyBsYW1iZGEgZXhwcmVzc2lvbiwgd2hpY2ggcHJvZHVjZXMgYSBmdW5jdGlvbiBvYmplY3QKKy8vLyAob2YgdW5zcGVjaWZpZWQgdHlwZSkgdGhhdCBjYW4gYmUgaW52b2tlZCBsYXRlci4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8gXGNvZGUKKy8vLyB2b2lkIGxvd19wYXNzX2ZpbHRlcihzdGQ6OnZlY3Rvcjxkb3VibGU+ICZ2YWx1ZXMsIGRvdWJsZSBjdXRvZmYpIHsKKy8vLyAgIHZhbHVlcy5lcmFzZShzdGQ6OnJlbW92ZV9pZih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpLAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs9XShkb3VibGUgdmFsdWUpIHsgcmV0dXJuIHZhbHVlID4gY3V0b2ZmOyB9KTsKKy8vLyB9CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIEMrKzExIGxhbWJkYSBleHByZXNzaW9ucyBjYW4gY2FwdHVyZSBsb2NhbCB2YXJpYWJsZXMsIGVpdGhlciBieSBjb3B5aW5nCisvLy8gdGhlIHZhbHVlcyBvZiB0aG9zZSBsb2NhbCB2YXJpYWJsZXMgYXQgdGhlIHRpbWUgdGhlIGZ1bmN0aW9uCisvLy8gb2JqZWN0IGlzIGNvbnN0cnVjdGVkIChub3Qgd2hlbiBpdCBpcyBjYWxsZWQhKSBvciBieSBob2xkaW5nIGEKKy8vLyByZWZlcmVuY2UgdG8gdGhlIGxvY2FsIHZhcmlhYmxlLiBUaGVzZSBjYXB0dXJlcyBjYW4gb2NjdXIgZWl0aGVyCisvLy8gaW1wbGljaXRseSBvciBjYW4gYmUgd3JpdHRlbiBleHBsaWNpdGx5IGJldHdlZW4gdGhlIHNxdWFyZQorLy8vIGJyYWNrZXRzIChbLi4uXSkgdGhhdCBzdGFydCB0aGUgbGFtYmRhIGV4cHJlc3Npb24uCisvLy8KKy8vLyBDKysxeSBpbnRyb2R1Y2VzIGEgbmV3IGZvcm0gb2YgImNhcHR1cmUiIGNhbGxlZCBhbiBpbml0LWNhcHR1cmUgdGhhdAorLy8vIGluY2x1ZGVzIGFuIGluaXRpYWxpemluZyBleHByZXNzaW9uIChyYXRoZXIgdGhhbiBjYXB0dXJpbmcgYSB2YXJpYWJsZSksCisvLy8gYW5kIHdoaWNoIGNhbiBuZXZlciBvY2N1ciBpbXBsaWNpdGx5LgorY2xhc3MgTGFtYmRhRXhwciBmaW5hbCA6IHB1YmxpYyBFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPExhbWJkYUV4cHIsIFN0bXQgKj4geworICAvLy8gXGJyaWVmIFRoZSBzb3VyY2UgcmFuZ2UgdGhhdCBjb3ZlcnMgdGhlIGxhbWJkYSBpbnRyb2R1Y2VyIChbLi4uXSkuCisgIFNvdXJjZVJhbmdlIEludHJvZHVjZXJSYW5nZTsKKworICAvLy8gXGJyaWVmIFRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhpcyBsYW1iZGEncyBjYXB0dXJlLWRlZmF1bHQgKCc9JyBvciAnJicpLgorICBTb3VyY2VMb2NhdGlvbiBDYXB0dXJlRGVmYXVsdExvYzsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgY2FwdHVyZXMuCisgIHVuc2lnbmVkIE51bUNhcHR1cmVzIDogMTY7CisgIAorICAvLy8gXGJyaWVmIFRoZSBkZWZhdWx0IGNhcHR1cmUga2luZCwgd2hpY2ggaXMgYSB2YWx1ZSBvZiB0eXBlCisgIC8vLyBMYW1iZGFDYXB0dXJlRGVmYXVsdC4KKyAgdW5zaWduZWQgQ2FwdHVyZURlZmF1bHQgOiAyOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGxhbWJkYSBoYWQgYW4gZXhwbGljaXQgcGFyYW1ldGVyIGxpc3QgdnMuIGFuCisgIC8vLyBpbXBsaWNpdCAoYW5kIGVtcHR5KSBwYXJhbWV0ZXIgbGlzdC4KKyAgdW5zaWduZWQgRXhwbGljaXRQYXJhbXMgOiAxOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGxhbWJkYSBoYWQgdGhlIHJlc3VsdCB0eXBlIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorICB1bnNpZ25lZCBFeHBsaWNpdFJlc3VsdFR5cGUgOiAxOworICAKKyAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIGNsb3NpbmcgYnJhY2UgKCd9JykgdGhhdCBjb21wbGV0ZXMKKyAgLy8vIHRoZSBsYW1iZGEuCisgIC8vLyAKKyAgLy8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgYnJhY2UgaXMgYWxzbyBhdmFpbGFibGUgYnkgbG9va2luZyB1cCB0aGUKKyAgLy8vIGZ1bmN0aW9uIGNhbGwgb3BlcmF0b3IgaW4gdGhlIGxhbWJkYSBjbGFzcy4gSG93ZXZlciwgaXQgaXMKKyAgLy8vIHN0b3JlZCBoZXJlIHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIGdldFNvdXJjZVJhbmdlKCksIGFuZAorICAvLy8gdG8gYXZvaWQgaGF2aW5nIHRvIGRlc2VyaWFsaXplIHRoZSBmdW5jdGlvbiBjYWxsIG9wZXJhdG9yIGZyb20gYQorICAvLy8gbW9kdWxlIGZpbGUganVzdCB0byBkZXRlcm1pbmUgdGhlIHNvdXJjZSByYW5nZS4KKyAgU291cmNlTG9jYXRpb24gQ2xvc2luZ0JyYWNlOworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgbGFtYmRhIGV4cHJlc3Npb24uCisgIExhbWJkYUV4cHIoUXVhbFR5cGUgVCwgU291cmNlUmFuZ2UgSW50cm9kdWNlclJhbmdlLAorICAgICAgICAgICAgIExhbWJkYUNhcHR1cmVEZWZhdWx0IENhcHR1cmVEZWZhdWx0LAorICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENhcHR1cmVEZWZhdWx0TG9jLCBBcnJheVJlZjxMYW1iZGFDYXB0dXJlPiBDYXB0dXJlcywKKyAgICAgICAgICAgICBib29sIEV4cGxpY2l0UGFyYW1zLCBib29sIEV4cGxpY2l0UmVzdWx0VHlwZSwKKyAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IENhcHR1cmVJbml0cywgU291cmNlTG9jYXRpb24gQ2xvc2luZ0JyYWNlLAorICAgICAgICAgICAgIGJvb2wgQ29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjayk7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYW4gZW1wdHkgbGFtYmRhIGV4cHJlc3Npb24uCisgIExhbWJkYUV4cHIoRW1wdHlTaGVsbCBFbXB0eSwgdW5zaWduZWQgTnVtQ2FwdHVyZXMpCisgICAgICA6IEV4cHIoTGFtYmRhRXhwckNsYXNzLCBFbXB0eSksIE51bUNhcHR1cmVzKE51bUNhcHR1cmVzKSwKKyAgICAgICAgQ2FwdHVyZURlZmF1bHQoTENEX05vbmUpLCBFeHBsaWNpdFBhcmFtcyhmYWxzZSksCisgICAgICAgIEV4cGxpY2l0UmVzdWx0VHlwZShmYWxzZSkgeworICAgIGdldFN0b3JlZFN0bXRzKClbTnVtQ2FwdHVyZXNdID0gbnVsbHB0cjsKKyAgfQorCisgIFN0bXQgKipnZXRTdG9yZWRTdG10cygpIHsgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxTdG10ICo+KCk7IH0KKworICBTdG10ICpjb25zdCAqZ2V0U3RvcmVkU3RtdHMoKSBjb25zdCB7IHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8U3RtdCAqPigpOyB9CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10V3JpdGVyOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgbmV3IGxhbWJkYSBleHByZXNzaW9uLgorICBzdGF0aWMgTGFtYmRhRXhwciAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBDWFhSZWNvcmREZWNsICpDbGFzcywgU291cmNlUmFuZ2UgSW50cm9kdWNlclJhbmdlLAorICAgICAgICAgTGFtYmRhQ2FwdHVyZURlZmF1bHQgQ2FwdHVyZURlZmF1bHQsIFNvdXJjZUxvY2F0aW9uIENhcHR1cmVEZWZhdWx0TG9jLAorICAgICAgICAgQXJyYXlSZWY8TGFtYmRhQ2FwdHVyZT4gQ2FwdHVyZXMsIGJvb2wgRXhwbGljaXRQYXJhbXMsCisgICAgICAgICBib29sIEV4cGxpY2l0UmVzdWx0VHlwZSwgQXJyYXlSZWY8RXhwciAqPiBDYXB0dXJlSW5pdHMsCisgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDbG9zaW5nQnJhY2UsIGJvb2wgQ29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjayk7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBuZXcgbGFtYmRhIGV4cHJlc3Npb24gdGhhdCB3aWxsIGJlIGRlc2VyaWFsaXplZCBmcm9tCisgIC8vLyBhbiBleHRlcm5hbCBzb3VyY2UuCisgIHN0YXRpYyBMYW1iZGFFeHByICpDcmVhdGVEZXNlcmlhbGl6ZWQoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DYXB0dXJlcyk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgY2FwdHVyZSBraW5kIGZvciB0aGlzIGxhbWJkYS4KKyAgTGFtYmRhQ2FwdHVyZURlZmF1bHQgZ2V0Q2FwdHVyZURlZmF1bHQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PExhbWJkYUNhcHR1cmVEZWZhdWx0PihDYXB0dXJlRGVmYXVsdCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGxhbWJkYSdzIGNhcHR1cmUtZGVmYXVsdCwgaWYgYW55LgorICBTb3VyY2VMb2NhdGlvbiBnZXRDYXB0dXJlRGVmYXVsdExvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2FwdHVyZURlZmF1bHRMb2M7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIG9uZSBvZiB0aGlzIGxhbWJkYSdzIGNhcHR1cmVzIGlzIGFuIGluaXQtY2FwdHVyZS4KKyAgYm9vbCBpc0luaXRDYXB0dXJlKGNvbnN0IExhbWJkYUNhcHR1cmUgKkNhcHR1cmUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQW4gaXRlcmF0b3IgdGhhdCB3YWxrcyBvdmVyIHRoZSBjYXB0dXJlcyBvZiB0aGUgbGFtYmRhLAorICAvLy8gYm90aCBpbXBsaWNpdCBhbmQgZXhwbGljaXQuCisgIHVzaW5nIGNhcHR1cmVfaXRlcmF0b3IgPSBjb25zdCBMYW1iZGFDYXB0dXJlICo7CisKKyAgLy8vIFxicmllZiBBbiBpdGVyYXRvciBvdmVyIGEgcmFuZ2Ugb2YgbGFtYmRhIGNhcHR1cmVzLgorICB1c2luZyBjYXB0dXJlX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8Y2FwdHVyZV9pdGVyYXRvcj47CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGlzIGxhbWJkYSdzIGNhcHR1cmVzLgorICBjYXB0dXJlX3JhbmdlIGNhcHR1cmVzKCkgY29uc3Q7CisgIAorICAvLy8gXGJyaWVmIFJldHJpZXZlIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBsYW1iZGEgY2FwdHVyZS4KKyAgY2FwdHVyZV9pdGVyYXRvciBjYXB0dXJlX2JlZ2luKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBhbiBpdGVyYXRvciBwb2ludGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlCisgIC8vLyBzZXF1ZW5jZSBvZiBsYW1iZGEgY2FwdHVyZXMuCisgIGNhcHR1cmVfaXRlcmF0b3IgY2FwdHVyZV9lbmQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGNhcHR1cmVzIGluIHRoaXMgbGFtYmRhLgorICB1bnNpZ25lZCBjYXB0dXJlX3NpemUoKSBjb25zdCB7IHJldHVybiBOdW1DYXB0dXJlczsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhpcyBsYW1iZGEncyBleHBsaWNpdCBjYXB0dXJlcy4KKyAgY2FwdHVyZV9yYW5nZSBleHBsaWNpdF9jYXB0dXJlcygpIGNvbnN0OworICAKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZXhwbGljaXQKKyAgLy8vIGxhbWJkYSBjYXB0dXJlLgorICBjYXB0dXJlX2l0ZXJhdG9yIGV4cGxpY2l0X2NhcHR1cmVfYmVnaW4oKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2Ugb2YKKyAgLy8vIGV4cGxpY2l0IGxhbWJkYSBjYXB0dXJlcy4KKyAgY2FwdHVyZV9pdGVyYXRvciBleHBsaWNpdF9jYXB0dXJlX2VuZCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhpcyBsYW1iZGEncyBpbXBsaWNpdCBjYXB0dXJlcy4KKyAgY2FwdHVyZV9yYW5nZSBpbXBsaWNpdF9jYXB0dXJlcygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGltcGxpY2l0CisgIC8vLyBsYW1iZGEgY2FwdHVyZS4KKyAgY2FwdHVyZV9pdGVyYXRvciBpbXBsaWNpdF9jYXB0dXJlX2JlZ2luKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBhbiBpdGVyYXRvciBwb2ludGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlIG9mCisgIC8vLyBpbXBsaWNpdCBsYW1iZGEgY2FwdHVyZXMuCisgIGNhcHR1cmVfaXRlcmF0b3IgaW1wbGljaXRfY2FwdHVyZV9lbmQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEl0ZXJhdG9yIHRoYXQgd2Fsa3Mgb3ZlciB0aGUgY2FwdHVyZSBpbml0aWFsaXphdGlvbgorICAvLy8gYXJndW1lbnRzLgorICB1c2luZyBjYXB0dXJlX2luaXRfaXRlcmF0b3IgPSBFeHByICoqOworCisgIC8vLyBcYnJpZWYgQ29uc3QgaXRlcmF0b3IgdGhhdCB3YWxrcyBvdmVyIHRoZSBjYXB0dXJlIGluaXRpYWxpemF0aW9uCisgIC8vLyBhcmd1bWVudHMuCisgIHVzaW5nIGNvbnN0X2NhcHR1cmVfaW5pdF9pdGVyYXRvciA9IEV4cHIgKmNvbnN0ICo7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgaW5pdGlhbGl6YXRpb24gZXhwcmVzc2lvbnMgZm9yIHRoaXMgbGFtYmRhJ3MgY2FwdHVyZXMuCisgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGNhcHR1cmVfaW5pdF9pdGVyYXRvcj4gY2FwdHVyZV9pbml0cygpIHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZV9yYW5nZShjYXB0dXJlX2luaXRfYmVnaW4oKSwgY2FwdHVyZV9pbml0X2VuZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGluaXRpYWxpemF0aW9uIGV4cHJlc3Npb25zIGZvciB0aGlzIGxhbWJkYSdzIGNhcHR1cmVzLgorICBsbHZtOjppdGVyYXRvcl9yYW5nZTxjb25zdF9jYXB0dXJlX2luaXRfaXRlcmF0b3I+IGNhcHR1cmVfaW5pdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VfcmFuZ2UoY2FwdHVyZV9pbml0X2JlZ2luKCksIGNhcHR1cmVfaW5pdF9lbmQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBmaXJzdCBpbml0aWFsaXphdGlvbiBhcmd1bWVudCBmb3IgdGhpcworICAvLy8gbGFtYmRhIGV4cHJlc3Npb24gKHdoaWNoIGluaXRpYWxpemVzIHRoZSBmaXJzdCBjYXB0dXJlIGZpZWxkKS4KKyAgY2FwdHVyZV9pbml0X2l0ZXJhdG9yIGNhcHR1cmVfaW5pdF9iZWdpbigpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxFeHByICoqPihnZXRTdG9yZWRTdG10cygpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGZpcnN0IGluaXRpYWxpemF0aW9uIGFyZ3VtZW50IGZvciB0aGlzCisgIC8vLyBsYW1iZGEgZXhwcmVzc2lvbiAod2hpY2ggaW5pdGlhbGl6ZXMgdGhlIGZpcnN0IGNhcHR1cmUgZmllbGQpLgorICBjb25zdF9jYXB0dXJlX2luaXRfaXRlcmF0b3IgY2FwdHVyZV9pbml0X2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEV4cHIgKmNvbnN0ICo+KGdldFN0b3JlZFN0bXRzKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgb25lIHBhc3QgdGhlIGxhc3QKKyAgLy8vIGluaXRpYWxpemF0aW9uIGFyZ3VtZW50IGZvciB0aGlzIGxhbWJkYSBleHByZXNzaW9uLgorICBjYXB0dXJlX2luaXRfaXRlcmF0b3IgY2FwdHVyZV9pbml0X2VuZCgpIHsKKyAgICByZXR1cm4gY2FwdHVyZV9pbml0X2JlZ2luKCkgKyBOdW1DYXB0dXJlczsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGl0ZXJhdG9yIHBvaW50aW5nIG9uZSBwYXN0IHRoZSBsYXN0CisgIC8vLyBpbml0aWFsaXphdGlvbiBhcmd1bWVudCBmb3IgdGhpcyBsYW1iZGEgZXhwcmVzc2lvbi4KKyAgY29uc3RfY2FwdHVyZV9pbml0X2l0ZXJhdG9yIGNhcHR1cmVfaW5pdF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhcHR1cmVfaW5pdF9iZWdpbigpICsgTnVtQ2FwdHVyZXM7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzb3VyY2UgcmFuZ2UgY292ZXJpbmcgdGhlIGxhbWJkYSBpbnRyb2R1Y2VyLAorICAvLy8gd2hpY2ggY29udGFpbnMgdGhlIGV4cGxpY2l0IGNhcHR1cmUgbGlzdCBzdXJyb3VuZGVkIGJ5IHNxdWFyZQorICAvLy8gYnJhY2tldHMgKFsuLi5dKS4KKyAgU291cmNlUmFuZ2UgZ2V0SW50cm9kdWNlclJhbmdlKCkgY29uc3QgeyByZXR1cm4gSW50cm9kdWNlclJhbmdlOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgY2xhc3MgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbGFtYmRhLgorICAvLy8gCisgIC8vLyBUaGlzIGlzIHRoZSAiY2xvc3VyZSB0eXBlIiAoQysrMXkgW2V4cHIucHJpbS5sYW1iZGFdKSwgYW5kIHN0b3JlcyB0aGUKKyAgLy8vIGNhcHR1cmVzIGluIGl0cyBmaWVsZHMgYW5kIHByb3ZpZGVzIHRoZSB2YXJpb3VzIG9wZXJhdGlvbnMgcGVybWl0dGVkCisgIC8vLyBvbiBhIGxhbWJkYSAoY29weWluZywgY2FsbGluZykuCisgIENYWFJlY29yZERlY2wgKmdldExhbWJkYUNsYXNzKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgZnVuY3Rpb24gY2FsbCBvcGVyYXRvciBhc3NvY2lhdGVkIHdpdGggdGhpcworICAvLy8gbGFtYmRhIGV4cHJlc3Npb24uIAorICBDWFhNZXRob2REZWNsICpnZXRDYWxsT3BlcmF0b3IoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIElmIHRoaXMgaXMgYSBnZW5lcmljIGxhbWJkYSBleHByZXNzaW9uLCByZXRyaWV2ZSB0aGUgdGVtcGxhdGUgCisgIC8vLyBwYXJhbWV0ZXIgbGlzdCBhc3NvY2lhdGVkIHdpdGggaXQsIG9yIGVsc2UgcmV0dXJuIG51bGwuIAorICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKmdldFRlbXBsYXRlUGFyYW1ldGVyTGlzdCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGlzIGEgZ2VuZXJpYyBsYW1iZGEuCisgIGJvb2wgaXNHZW5lcmljTGFtYmRhKCkgY29uc3QgeyByZXR1cm4gZ2V0VGVtcGxhdGVQYXJhbWV0ZXJMaXN0KCk7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBib2R5IG9mIHRoZSBsYW1iZGEuCisgIENvbXBvdW5kU3RtdCAqZ2V0Qm9keSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGxhbWJkYSBpcyBtdXRhYmxlLCBtZWFuaW5nIHRoYXQgYW55CisgIC8vLyBjYXB0dXJlcyB2YWx1ZXMgY2FuIGJlIG1vZGlmaWVkLgorICBib29sIGlzTXV0YWJsZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBsYW1iZGEgaGFzIGFuIGV4cGxpY2l0IHBhcmFtZXRlcgorICAvLy8gbGlzdCB2cy4gYW4gaW1wbGljaXQgKGVtcHR5KSBwYXJhbWV0ZXIgbGlzdC4KKyAgYm9vbCBoYXNFeHBsaWNpdFBhcmFtZXRlcnMoKSBjb25zdCB7IHJldHVybiBFeHBsaWNpdFBhcmFtczsgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGxhbWJkYSBoYWQgaXRzIHJlc3VsdCB0eXBlIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorICBib29sIGhhc0V4cGxpY2l0UmVzdWx0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEV4cGxpY2l0UmVzdWx0VHlwZTsgfQorICAgIAorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gTGFtYmRhRXhwckNsYXNzOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gSW50cm9kdWNlclJhbmdlLmdldEJlZ2luKCk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIENsb3NpbmdCcmFjZTsgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIC8vIEluY2x1ZGVzIGluaXRpYWxpemF0aW9uIGV4cHJzIHBsdXMgYm9keSBzdG10CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGdldFN0b3JlZFN0bXRzKCksIGdldFN0b3JlZFN0bXRzKCkgKyBOdW1DYXB0dXJlcyArIDEpOworICB9Cit9OworCisvLy8gQW4gZXhwcmVzc2lvbiAiVCgpIiB3aGljaCBjcmVhdGVzIGEgdmFsdWUtaW5pdGlhbGl6ZWQgcnZhbHVlIG9mIHR5cGUKKy8vLyBULCB3aGljaCBpcyBhIG5vbi1jbGFzcyB0eXBlLiAgU2VlIChDKys5OCBbNS4yLjNwMl0pLgorY2xhc3MgQ1hYU2NhbGFyVmFsdWVJbml0RXhwciA6IHB1YmxpYyBFeHByIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisKKyAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jOworICBUeXBlU291cmNlSW5mbyAqVHlwZUluZm87CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gZXhwbGljaXRseS13cml0dGVuIHNjYWxhci12YWx1ZSBpbml0aWFsaXphdGlvbgorICAvLy8gZXhwcmVzc2lvbi4KKyAgQ1hYU2NhbGFyVmFsdWVJbml0RXhwcihRdWFsVHlwZSBUeXBlLCBUeXBlU291cmNlSW5mbyAqVHlwZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gclBhcmVuTG9jKQorICAgICAgOiBFeHByKENYWFNjYWxhclZhbHVlSW5pdEV4cHJDbGFzcywgVHlwZSwgVktfUlZhbHVlLCBPS19PcmRpbmFyeSwKKyAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIFR5cGUtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudFR5cGUoKSwKKyAgICAgICAgICAgICBUeXBlLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgICBSUGFyZW5Mb2MoclBhcmVuTG9jKSwgVHlwZUluZm8oVHlwZUluZm8pIHt9CisKKyAgZXhwbGljaXQgQ1hYU2NhbGFyVmFsdWVJbml0RXhwcihFbXB0eVNoZWxsIFNoZWxsKQorICAgICAgOiBFeHByKENYWFNjYWxhclZhbHVlSW5pdEV4cHJDbGFzcywgU2hlbGwpIHt9CisKKyAgVHlwZVNvdXJjZUluZm8gKmdldFR5cGVTb3VyY2VJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBUeXBlSW5mbzsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFJQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIFJQYXJlbkxvYzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ1hYU2NhbGFyVmFsdWVJbml0RXhwckNsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgbmV3LWV4cHJlc3Npb24gZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBjb25zdHJ1Y3RvcgorLy8vIGNhbGxzLCBlLmc6ICJuZXcgQ1hYTmV3RXhwcihmb28pIi4KK2NsYXNzIENYWE5ld0V4cHIgOiBwdWJsaWMgRXhwciB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNUU3RtdFdyaXRlcjsKKworICAvLy8gQ29udGFpbnMgYW4gb3B0aW9uYWwgYXJyYXkgc2l6ZSBleHByZXNzaW9uLCBhbiBvcHRpb25hbCBpbml0aWFsaXphdGlvbgorICAvLy8gZXhwcmVzc2lvbiwgYW5kIGFueSBudW1iZXIgb2Ygb3B0aW9uYWwgcGxhY2VtZW50IGFyZ3VtZW50cywgaW4gdGhhdCBvcmRlci4KKyAgU3RtdCAqKlN1YkV4cHJzID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFBvaW50cyB0byB0aGUgYWxsb2NhdGlvbiBmdW5jdGlvbiB1c2VkLgorICBGdW5jdGlvbkRlY2wgKk9wZXJhdG9yTmV3OworCisgIC8vLyBcYnJpZWYgUG9pbnRzIHRvIHRoZSBkZWFsbG9jYXRpb24gZnVuY3Rpb24gdXNlZCBpbiBjYXNlIG9mIGVycm9yLiBNYXkgYmUKKyAgLy8vIG51bGwuCisgIEZ1bmN0aW9uRGVjbCAqT3BlcmF0b3JEZWxldGU7CisKKyAgLy8vIFxicmllZiBUaGUgYWxsb2NhdGVkIHR5cGUtc291cmNlIGluZm9ybWF0aW9uLCBhcyB3cml0dGVuIGluIHRoZSBzb3VyY2UuCisgIFR5cGVTb3VyY2VJbmZvICpBbGxvY2F0ZWRUeXBlSW5mbzsKKworICAvLy8gXGJyaWVmIElmIHRoZSBhbGxvY2F0ZWQgdHlwZSB3YXMgZXhwcmVzc2VkIGFzIGEgcGFyZW50aGVzaXplZCB0eXBlLWlkLAorICAvLy8gdGhlIHNvdXJjZSByYW5nZSBjb3ZlcmluZyB0aGUgcGFyZW50aGVzaXplZCB0eXBlLWlkLgorICBTb3VyY2VSYW5nZSBUeXBlSWRQYXJlbnM7CisKKyAgLy8vIFxicmllZiBSYW5nZSBvZiB0aGUgZW50aXJlIG5ldyBleHByZXNzaW9uLgorICBTb3VyY2VSYW5nZSBSYW5nZTsKKworICAvLy8gXGJyaWVmIFNvdXJjZS1yYW5nZSBvZiBhIHBhcmVuLWRlbGltaXRlZCBpbml0aWFsaXplci4KKyAgU291cmNlUmFuZ2UgRGlyZWN0SW5pdFJhbmdlOworCisgIC8vLyBXYXMgdGhlIHVzYWdlIDo6bmV3LCBpLmUuIGlzIHRoZSBnbG9iYWwgbmV3IHRvIGJlIHVzZWQ/CisgIHVuc2lnbmVkIEdsb2JhbE5ldyA6IDE7CisKKyAgLy8vIERvIHdlIGFsbG9jYXRlIGFuIGFycmF5PyBJZiBzbywgdGhlIGZpcnN0IFN1YkV4cHIgaXMgdGhlIHNpemUgZXhwcmVzc2lvbi4KKyAgdW5zaWduZWQgQXJyYXkgOiAxOworCisgIC8vLyBTaG91bGQgdGhlIGFsaWdubWVudCBiZSBwYXNzZWQgdG8gdGhlIGFsbG9jYXRpb24gZnVuY3Rpb24/CisgIHVuc2lnbmVkIFBhc3NBbGlnbm1lbnQgOiAxOworCisgIC8vLyBJZiB0aGlzIGlzIGFuIGFycmF5IGFsbG9jYXRpb24sIGRvZXMgdGhlIHVzdWFsIGRlYWxsb2NhdGlvbgorICAvLy8gZnVuY3Rpb24gZm9yIHRoZSBhbGxvY2F0ZWQgdHlwZSB3YW50IHRvIGtub3cgdGhlIGFsbG9jYXRlZCBzaXplPworICB1bnNpZ25lZCBVc3VhbEFycmF5RGVsZXRlV2FudHNTaXplIDogMTsKKworICAvLy8gVGhlIG51bWJlciBvZiBwbGFjZW1lbnQgbmV3IGFyZ3VtZW50cy4KKyAgdW5zaWduZWQgTnVtUGxhY2VtZW50QXJncyA6IDI2OworCisgIC8vLyBXaGF0IGtpbmQgb2YgaW5pdGlhbGl6ZXIgZG8gd2UgaGF2ZT8gQ291bGQgYmUgbm9uZSwgcGFyZW5zLCBvciBicmFjZXMuCisgIC8vLyBJbiBzdG9yYWdlLCB3ZSBkaXN0aW5ndWlzaCBiZXR3ZWVuICJub25lLCBhbmQgbm8gaW5pdGlhbGl6ZXIgZXhwciIsIGFuZAorICAvLy8gIm5vbmUsIGJ1dCBhbiBpbXBsaWNpdCBpbml0aWFsaXplciBleHByIi4KKyAgdW5zaWduZWQgU3RvcmVkSW5pdGlhbGl6YXRpb25TdHlsZSA6IDI7CisKK3B1YmxpYzoKKyAgZW51bSBJbml0aWFsaXphdGlvblN0eWxlIHsKKyAgICAvLy8gTmV3LWV4cHJlc3Npb24gaGFzIG5vIGluaXRpYWxpemVyIGFzIHdyaXR0ZW4uCisgICAgTm9Jbml0LAorCisgICAgLy8vIE5ldy1leHByZXNzaW9uIGhhcyBhIEMrKzk4IHBhcmVuLWRlbGltaXRlZCBpbml0aWFsaXplci4KKyAgICBDYWxsSW5pdCwKKworICAgIC8vLyBOZXctZXhwcmVzc2lvbiBoYXMgYSBDKysxMSBsaXN0LWluaXRpYWxpemVyLgorICAgIExpc3RJbml0CisgIH07CisKKyAgQ1hYTmV3RXhwcihjb25zdCBBU1RDb250ZXh0ICZDLCBib29sIGdsb2JhbE5ldywgRnVuY3Rpb25EZWNsICpvcGVyYXRvck5ldywKKyAgICAgICAgICAgICBGdW5jdGlvbkRlY2wgKm9wZXJhdG9yRGVsZXRlLCBib29sIFBhc3NBbGlnbm1lbnQsCisgICAgICAgICAgICAgYm9vbCB1c3VhbEFycmF5RGVsZXRlV2FudHNTaXplLCBBcnJheVJlZjxFeHByKj4gcGxhY2VtZW50QXJncywKKyAgICAgICAgICAgICBTb3VyY2VSYW5nZSB0eXBlSWRQYXJlbnMsIEV4cHIgKmFycmF5U2l6ZSwKKyAgICAgICAgICAgICBJbml0aWFsaXphdGlvblN0eWxlIGluaXRpYWxpemF0aW9uU3R5bGUsIEV4cHIgKmluaXRpYWxpemVyLAorICAgICAgICAgICAgIFF1YWxUeXBlIHR5LCBUeXBlU291cmNlSW5mbyAqQWxsb2NhdGVkVHlwZUluZm8sCisgICAgICAgICAgICAgU291cmNlUmFuZ2UgUmFuZ2UsIFNvdXJjZVJhbmdlIGRpcmVjdEluaXRSYW5nZSk7CisgIGV4cGxpY2l0IENYWE5ld0V4cHIoRW1wdHlTaGVsbCBTaGVsbCkKKyAgICAgIDogRXhwcihDWFhOZXdFeHByQ2xhc3MsIFNoZWxsKSB7fQorCisgIHZvaWQgQWxsb2NhdGVBcmdzQXJyYXkoY29uc3QgQVNUQ29udGV4dCAmQywgYm9vbCBpc0FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bVBsYWNlQXJncywgYm9vbCBoYXNJbml0aWFsaXplcik7CisKKyAgUXVhbFR5cGUgZ2V0QWxsb2NhdGVkVHlwZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0VHlwZSgpLT5pc1BvaW50ZXJUeXBlKCkpOworICAgIHJldHVybiBnZXRUeXBlKCktPmdldEFzPFBvaW50ZXJUeXBlPigpLT5nZXRQb2ludGVlVHlwZSgpOworICB9CisKKyAgVHlwZVNvdXJjZUluZm8gKmdldEFsbG9jYXRlZFR5cGVTb3VyY2VJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBBbGxvY2F0ZWRUeXBlSW5mbzsKKyAgfQorCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGUgYWxsb2NhdGlvbiByZXN1bHQgbmVlZHMgdG8gYmUgbnVsbC1jaGVja2VkLgorICAvLy8KKyAgLy8vIEMrKzExIFtleHByLm5ld11wMTM6CisgIC8vLyAgIElmIHRoZSBhbGxvY2F0aW9uIGZ1bmN0aW9uIHJldHVybnMgbnVsbCwgaW5pdGlhbGl6YXRpb24gc2hhbGwKKyAgLy8vICAgbm90IGJlIGRvbmUsIHRoZSBkZWFsbG9jYXRpb24gZnVuY3Rpb24gc2hhbGwgbm90IGJlIGNhbGxlZCwKKyAgLy8vICAgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgbmV3LWV4cHJlc3Npb24gc2hhbGwgYmUgbnVsbC4KKyAgLy8vCisgIC8vLyBDKysgRFIxNzQ4OgorICAvLy8gICBJZiB0aGUgYWxsb2NhdGlvbiBmdW5jdGlvbiBpcyBhIHJlc2VydmVkIHBsYWNlbWVudCBhbGxvY2F0aW9uCisgIC8vLyAgIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBudWxsLCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorICAvLy8KKyAgLy8vIEFuIGFsbG9jYXRpb24gZnVuY3Rpb24gaXMgbm90IGFsbG93ZWQgdG8gcmV0dXJuIG51bGwgdW5sZXNzIGl0CisgIC8vLyBoYXMgYSBub24tdGhyb3dpbmcgZXhjZXB0aW9uLXNwZWNpZmljYXRpb24uICBUaGUgJzAzIHJ1bGUgaXMKKyAgLy8vIGlkZW50aWNhbCBleGNlcHQgdGhhdCB0aGUgZGVmaW5pdGlvbiBvZiBhIG5vbi10aHJvd2luZworICAvLy8gZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gaXMganVzdCAiaXMgaXQgdGhyb3coKT8iLgorICBib29sIHNob3VsZE51bGxDaGVja0FsbG9jYXRpb24oY29uc3QgQVNUQ29udGV4dCAmQ3R4KSBjb25zdDsKKworICBGdW5jdGlvbkRlY2wgKmdldE9wZXJhdG9yTmV3KCkgY29uc3QgeyByZXR1cm4gT3BlcmF0b3JOZXc7IH0KKyAgdm9pZCBzZXRPcGVyYXRvck5ldyhGdW5jdGlvbkRlY2wgKkQpIHsgT3BlcmF0b3JOZXcgPSBEOyB9CisgIEZ1bmN0aW9uRGVjbCAqZ2V0T3BlcmF0b3JEZWxldGUoKSBjb25zdCB7IHJldHVybiBPcGVyYXRvckRlbGV0ZTsgfQorICB2b2lkIHNldE9wZXJhdG9yRGVsZXRlKEZ1bmN0aW9uRGVjbCAqRCkgeyBPcGVyYXRvckRlbGV0ZSA9IEQ7IH0KKworICBib29sIGlzQXJyYXkoKSBjb25zdCB7IHJldHVybiBBcnJheTsgfQorCisgIEV4cHIgKmdldEFycmF5U2l6ZSgpIHsKKyAgICByZXR1cm4gQXJyYXkgPyBjYXN0PEV4cHI+KFN1YkV4cHJzWzBdKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgRXhwciAqZ2V0QXJyYXlTaXplKCkgY29uc3QgeworICAgIHJldHVybiBBcnJheSA/IGNhc3Q8RXhwcj4oU3ViRXhwcnNbMF0pIDogbnVsbHB0cjsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bVBsYWNlbWVudEFyZ3MoKSBjb25zdCB7IHJldHVybiBOdW1QbGFjZW1lbnRBcmdzOyB9CisKKyAgRXhwciAqKmdldFBsYWNlbWVudEFyZ3MoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwciAqKj4oU3ViRXhwcnMgKyBBcnJheSArIGhhc0luaXRpYWxpemVyKCkpOworICB9CisKKyAgRXhwciAqZ2V0UGxhY2VtZW50QXJnKHVuc2lnbmVkIGkpIHsKKyAgICBhc3NlcnQoaSA8IE51bVBsYWNlbWVudEFyZ3MgJiYgIkluZGV4IG91dCBvZiByYW5nZSIpOworICAgIHJldHVybiBnZXRQbGFjZW1lbnRBcmdzKClbaV07CisgIH0KKyAgY29uc3QgRXhwciAqZ2V0UGxhY2VtZW50QXJnKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IE51bVBsYWNlbWVudEFyZ3MgJiYgIkluZGV4IG91dCBvZiByYW5nZSIpOworICAgIHJldHVybiBjb25zdF9jYXN0PENYWE5ld0V4cHIqPih0aGlzKS0+Z2V0UGxhY2VtZW50QXJnKGkpOworICB9CisKKyAgYm9vbCBpc1BhcmVuVHlwZUlkKCkgY29uc3QgeyByZXR1cm4gVHlwZUlkUGFyZW5zLmlzVmFsaWQoKTsgfQorICBTb3VyY2VSYW5nZSBnZXRUeXBlSWRQYXJlbnMoKSBjb25zdCB7IHJldHVybiBUeXBlSWRQYXJlbnM7IH0KKworICBib29sIGlzR2xvYmFsTmV3KCkgY29uc3QgeyByZXR1cm4gR2xvYmFsTmV3OyB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgbmV3LWV4cHJlc3Npb24gaGFzIGFueSBpbml0aWFsaXplciBhdCBhbGwuCisgIGJvb2wgaGFzSW5pdGlhbGl6ZXIoKSBjb25zdCB7IHJldHVybiBTdG9yZWRJbml0aWFsaXphdGlvblN0eWxlID4gMDsgfQorCisgIC8vLyBcYnJpZWYgVGhlIGtpbmQgb2YgaW5pdGlhbGl6ZXIgdGhpcyBuZXctZXhwcmVzc2lvbiBoYXMuCisgIEluaXRpYWxpemF0aW9uU3R5bGUgZ2V0SW5pdGlhbGl6YXRpb25TdHlsZSgpIGNvbnN0IHsKKyAgICBpZiAoU3RvcmVkSW5pdGlhbGl6YXRpb25TdHlsZSA9PSAwKQorICAgICAgcmV0dXJuIE5vSW5pdDsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SW5pdGlhbGl6YXRpb25TdHlsZT4oU3RvcmVkSW5pdGlhbGl6YXRpb25TdHlsZS0xKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGhlIGluaXRpYWxpemVyIG9mIHRoaXMgbmV3LWV4cHJlc3Npb24uCisgIEV4cHIgKmdldEluaXRpYWxpemVyKCkgeworICAgIHJldHVybiBoYXNJbml0aWFsaXplcigpID8gY2FzdDxFeHByPihTdWJFeHByc1tBcnJheV0pIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCBFeHByICpnZXRJbml0aWFsaXplcigpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzSW5pdGlhbGl6ZXIoKSA/IGNhc3Q8RXhwcj4oU3ViRXhwcnNbQXJyYXldKSA6IG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIENYWENvbnN0cnVjdEV4cHIgZnJvbSB0aGlzIG5ldy1leHByZXNzaW9uLCBvciBudWxsLgorICBjb25zdCBDWFhDb25zdHJ1Y3RFeHByICpnZXRDb25zdHJ1Y3RFeHByKCkgY29uc3QgeworICAgIHJldHVybiBkeW5fY2FzdF9vcl9udWxsPENYWENvbnN0cnVjdEV4cHI+KGdldEluaXRpYWxpemVyKCkpOworICB9CisKKyAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSByZXF1aXJlZCBhbGlnbm1lbnQgc2hvdWxkIGJlIGltcGxpY2l0bHkgcGFzc2VkIHRvCisgIC8vLyB0aGUgYWxsb2NhdGlvbiBmdW5jdGlvbi4KKyAgYm9vbCBwYXNzQWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBQYXNzQWxpZ25tZW50OworICB9CisKKyAgLy8vIEFuc3dlcnMgd2hldGhlciB0aGUgdXN1YWwgYXJyYXkgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUKKyAgLy8vIGFsbG9jYXRlZCB0eXBlIGV4cGVjdHMgdGhlIHNpemUgb2YgdGhlIGFsbG9jYXRpb24gYXMgYQorICAvLy8gcGFyYW1ldGVyLgorICBib29sIGRvZXNVc3VhbEFycmF5RGVsZXRlV2FudFNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIFVzdWFsQXJyYXlEZWxldGVXYW50c1NpemU7CisgIH0KKworICB1c2luZyBhcmdfaXRlcmF0b3IgPSBFeHBySXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2FyZ19pdGVyYXRvciA9IENvbnN0RXhwckl0ZXJhdG9yOworCisgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGFyZ19pdGVyYXRvcj4gcGxhY2VtZW50X2FyZ3VtZW50cygpIHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZV9yYW5nZShwbGFjZW1lbnRfYXJnX2JlZ2luKCksIHBsYWNlbWVudF9hcmdfZW5kKCkpOworICB9CisKKyAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8Y29uc3RfYXJnX2l0ZXJhdG9yPiBwbGFjZW1lbnRfYXJndW1lbnRzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlX3JhbmdlKHBsYWNlbWVudF9hcmdfYmVnaW4oKSwgcGxhY2VtZW50X2FyZ19lbmQoKSk7CisgIH0KKworICBhcmdfaXRlcmF0b3IgcGxhY2VtZW50X2FyZ19iZWdpbigpIHsKKyAgICByZXR1cm4gU3ViRXhwcnMgKyBBcnJheSArIGhhc0luaXRpYWxpemVyKCk7CisgIH0KKyAgYXJnX2l0ZXJhdG9yIHBsYWNlbWVudF9hcmdfZW5kKCkgeworICAgIHJldHVybiBTdWJFeHBycyArIEFycmF5ICsgaGFzSW5pdGlhbGl6ZXIoKSArIGdldE51bVBsYWNlbWVudEFyZ3MoKTsKKyAgfQorICBjb25zdF9hcmdfaXRlcmF0b3IgcGxhY2VtZW50X2FyZ19iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gU3ViRXhwcnMgKyBBcnJheSArIGhhc0luaXRpYWxpemVyKCk7CisgIH0KKyAgY29uc3RfYXJnX2l0ZXJhdG9yIHBsYWNlbWVudF9hcmdfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBTdWJFeHBycyArIEFycmF5ICsgaGFzSW5pdGlhbGl6ZXIoKSArIGdldE51bVBsYWNlbWVudEFyZ3MoKTsKKyAgfQorCisgIHVzaW5nIHJhd19hcmdfaXRlcmF0b3IgPSBTdG10ICoqOworCisgIHJhd19hcmdfaXRlcmF0b3IgcmF3X2FyZ19iZWdpbigpIHsgcmV0dXJuIFN1YkV4cHJzOyB9CisgIHJhd19hcmdfaXRlcmF0b3IgcmF3X2FyZ19lbmQoKSB7CisgICAgcmV0dXJuIFN1YkV4cHJzICsgQXJyYXkgKyBoYXNJbml0aWFsaXplcigpICsgZ2V0TnVtUGxhY2VtZW50QXJncygpOworICB9CisgIGNvbnN0X2FyZ19pdGVyYXRvciByYXdfYXJnX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gU3ViRXhwcnM7IH0KKyAgY29uc3RfYXJnX2l0ZXJhdG9yIHJhd19hcmdfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBTdWJFeHBycyArIEFycmF5ICsgaGFzSW5pdGlhbGl6ZXIoKSArIGdldE51bVBsYWNlbWVudEFyZ3MoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFN0YXJ0TG9jKCkgY29uc3QgeyByZXR1cm4gUmFuZ2UuZ2V0QmVnaW4oKTsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRFbmRMb2MoKSBjb25zdCB7IHJldHVybiBSYW5nZS5nZXRFbmQoKTsgfQorCisgIFNvdXJjZVJhbmdlIGdldERpcmVjdEluaXRSYW5nZSgpIGNvbnN0IHsgcmV0dXJuIERpcmVjdEluaXRSYW5nZTsgfQorCisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIFJhbmdlOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIGdldFN0YXJ0TG9jKCk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBnZXRFbmRMb2MoKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBDWFhOZXdFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKHJhd19hcmdfYmVnaW4oKSwgcmF3X2FyZ19lbmQoKSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIFxjIGRlbGV0ZSBleHByZXNzaW9uIGZvciBtZW1vcnkgZGVhbGxvY2F0aW9uIGFuZAorLy8vIGRlc3RydWN0b3IgY2FsbHMsIGUuZy4gImRlbGV0ZVtdIHBBcnJheSIuCitjbGFzcyBDWFhEZWxldGVFeHByIDogcHVibGljIEV4cHIgeworICAvLy8gUG9pbnRzIHRvIHRoZSBvcGVyYXRvciBkZWxldGUgb3ZlcmxvYWQgdGhhdCBpcyB1c2VkLiBDb3VsZCBiZSBhIG1lbWJlci4KKyAgRnVuY3Rpb25EZWNsICpPcGVyYXRvckRlbGV0ZSA9IG51bGxwdHI7CisKKyAgLy8vIFRoZSBwb2ludGVyIGV4cHJlc3Npb24gdG8gYmUgZGVsZXRlZC4KKyAgU3RtdCAqQXJndW1lbnQgPSBudWxscHRyOworCisgIC8vLyBMb2NhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbi4KKyAgU291cmNlTG9jYXRpb24gTG9jOworCisgIC8vLyBJcyB0aGlzIGEgZm9yY2VkIGdsb2JhbCBkZWxldGUsIGkuZS4gIjo6ZGVsZXRlIj8KKyAgYm9vbCBHbG9iYWxEZWxldGUgOiAxOworCisgIC8vLyBJcyB0aGlzIHRoZSBhcnJheSBmb3JtIG9mIGRlbGV0ZSwgaS5lLiAiZGVsZXRlW10iPworICBib29sIEFycmF5Rm9ybSA6IDE7CisKKyAgLy8vIEFycmF5Rm9ybUFzV3JpdHRlbiBjYW4gYmUgZGlmZmVyZW50IGZyb20gQXJyYXlGb3JtIGlmICdkZWxldGUnIGlzIGFwcGxpZWQKKyAgLy8vIHRvIHBvaW50ZXItdG8tYXJyYXkgdHlwZSAoQXJyYXlGb3JtQXNXcml0dGVuIHdpbGwgYmUgZmFsc2Ugd2hpbGUgQXJyYXlGb3JtCisgIC8vLyB3aWxsIGJlIHRydWUpLgorICBib29sIEFycmF5Rm9ybUFzV3JpdHRlbiA6IDE7CisKKyAgLy8vIERvZXMgdGhlIHVzdWFsIGRlYWxsb2NhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGVsZW1lbnQgdHlwZSByZXF1aXJlCisgIC8vLyBhIHNpemVfdCBhcmd1bWVudD8KKyAgYm9vbCBVc3VhbEFycmF5RGVsZXRlV2FudHNTaXplIDogMTsKKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKworICBDWFhEZWxldGVFeHByKFF1YWxUeXBlIHR5LCBib29sIGdsb2JhbERlbGV0ZSwgYm9vbCBhcnJheUZvcm0sCisgICAgICAgICAgICAgICAgYm9vbCBhcnJheUZvcm1Bc1dyaXR0ZW4sIGJvb2wgdXN1YWxBcnJheURlbGV0ZVdhbnRzU2l6ZSwKKyAgICAgICAgICAgICAgICBGdW5jdGlvbkRlY2wgKm9wZXJhdG9yRGVsZXRlLCBFeHByICphcmcsIFNvdXJjZUxvY2F0aW9uIGxvYykKKyAgICAgIDogRXhwcihDWFhEZWxldGVFeHByQ2xhc3MsIHR5LCBWS19SVmFsdWUsIE9LX09yZGluYXJ5LCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICAgYXJnLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnQoKSwKKyAgICAgICAgICAgICBhcmctPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIE9wZXJhdG9yRGVsZXRlKG9wZXJhdG9yRGVsZXRlKSwgQXJndW1lbnQoYXJnKSwgTG9jKGxvYyksCisgICAgICAgIEdsb2JhbERlbGV0ZShnbG9iYWxEZWxldGUpLAorICAgICAgICBBcnJheUZvcm0oYXJyYXlGb3JtKSwgQXJyYXlGb3JtQXNXcml0dGVuKGFycmF5Rm9ybUFzV3JpdHRlbiksCisgICAgICAgIFVzdWFsQXJyYXlEZWxldGVXYW50c1NpemUodXN1YWxBcnJheURlbGV0ZVdhbnRzU2l6ZSkge30KKyAgZXhwbGljaXQgQ1hYRGVsZXRlRXhwcihFbXB0eVNoZWxsIFNoZWxsKSA6IEV4cHIoQ1hYRGVsZXRlRXhwckNsYXNzLCBTaGVsbCkge30KKworICBib29sIGlzR2xvYmFsRGVsZXRlKCkgY29uc3QgeyByZXR1cm4gR2xvYmFsRGVsZXRlOyB9CisgIGJvb2wgaXNBcnJheUZvcm0oKSBjb25zdCB7IHJldHVybiBBcnJheUZvcm07IH0KKyAgYm9vbCBpc0FycmF5Rm9ybUFzV3JpdHRlbigpIGNvbnN0IHsgcmV0dXJuIEFycmF5Rm9ybUFzV3JpdHRlbjsgfQorCisgIC8vLyBBbnN3ZXJzIHdoZXRoZXIgdGhlIHVzdWFsIGFycmF5IGRlYWxsb2NhdGlvbiBmdW5jdGlvbiBmb3IgdGhlCisgIC8vLyBhbGxvY2F0ZWQgdHlwZSBleHBlY3RzIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0aW9uIGFzIGEKKyAgLy8vIHBhcmFtZXRlci4gIFRoaXMgY2FuIGJlIHRydWUgZXZlbiBpZiB0aGUgYWN0dWFsIGRlYWxsb2NhdGlvbgorICAvLy8gZnVuY3Rpb24gdGhhdCB3ZSdyZSB1c2luZyBkb2Vzbid0IHdhbnQgYSBzaXplLgorICBib29sIGRvZXNVc3VhbEFycmF5RGVsZXRlV2FudFNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIFVzdWFsQXJyYXlEZWxldGVXYW50c1NpemU7CisgIH0KKworICBGdW5jdGlvbkRlY2wgKmdldE9wZXJhdG9yRGVsZXRlKCkgY29uc3QgeyByZXR1cm4gT3BlcmF0b3JEZWxldGU7IH0KKworICBFeHByICpnZXRBcmd1bWVudCgpIHsgcmV0dXJuIGNhc3Q8RXhwcj4oQXJndW1lbnQpOyB9CisgIGNvbnN0IEV4cHIgKmdldEFyZ3VtZW50KCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihBcmd1bWVudCk7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0eXBlIGJlaW5nIGRlc3Ryb3llZC4gCisgIC8vLworICAvLy8gSWYgdGhlIHR5cGUgYmVpbmcgZGVzdHJveWVkIGlzIGEgZGVwZW5kZW50IHR5cGUgd2hpY2ggbWF5IG9yIG1heSBub3QKKyAgLy8vIGJlIGEgcG9pbnRlciwgcmV0dXJuIGFuIGludmFsaWQgdHlwZS4KKyAgUXVhbFR5cGUgZ2V0RGVzdHJveWVkVHlwZSgpIGNvbnN0OworCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7cmV0dXJuIEFyZ3VtZW50LT5nZXRMb2NFbmQoKTt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IENYWERlbGV0ZUV4cHJDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsgcmV0dXJuIGNoaWxkX3JhbmdlKCZBcmd1bWVudCwgJkFyZ3VtZW50KzEpOyB9Cit9OworCisvLy8gXGJyaWVmIFN0b3JlcyB0aGUgdHlwZSBiZWluZyBkZXN0cm95ZWQgYnkgYSBwc2V1ZG8tZGVzdHJ1Y3RvciBleHByZXNzaW9uLgorY2xhc3MgUHNldWRvRGVzdHJ1Y3RvclR5cGVTdG9yYWdlIHsKKyAgLy8vIFxicmllZiBFaXRoZXIgdGhlIHR5cGUgc291cmNlIGluZm9ybWF0aW9uIG9yIHRoZSBuYW1lIG9mIHRoZSB0eXBlLCBpZgorICAvLy8gaXQgY291bGRuJ3QgYmUgcmVzb2x2ZWQgZHVlIHRvIHR5cGUtZGVwZW5kZW5jZS4KKyAgbGx2bTo6UG9pbnRlclVuaW9uPFR5cGVTb3VyY2VJbmZvICosIElkZW50aWZpZXJJbmZvICo+IFR5cGU7CisKKyAgLy8vIFxicmllZiBUaGUgc3RhcnRpbmcgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBwc2V1ZG8tZGVzdHJ1Y3RvciB0eXBlLgorICBTb3VyY2VMb2NhdGlvbiBMb2NhdGlvbjsKKworcHVibGljOgorICBQc2V1ZG9EZXN0cnVjdG9yVHlwZVN0b3JhZ2UoKSA9IGRlZmF1bHQ7CisKKyAgUHNldWRvRGVzdHJ1Y3RvclR5cGVTdG9yYWdlKElkZW50aWZpZXJJbmZvICpJSSwgU291cmNlTG9jYXRpb24gTG9jKQorICAgICAgOiBUeXBlKElJKSwgTG9jYXRpb24oTG9jKSB7fQorCisgIFBzZXVkb0Rlc3RydWN0b3JUeXBlU3RvcmFnZShUeXBlU291cmNlSW5mbyAqSW5mbyk7CisKKyAgVHlwZVNvdXJjZUluZm8gKmdldFR5cGVTb3VyY2VJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBUeXBlLmR5bl9jYXN0PFR5cGVTb3VyY2VJbmZvICo+KCk7CisgIH0KKworICBJZGVudGlmaWVySW5mbyAqZ2V0SWRlbnRpZmllcigpIGNvbnN0IHsKKyAgICByZXR1cm4gVHlwZS5keW5fY2FzdDxJZGVudGlmaWVySW5mbyAqPigpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBMb2NhdGlvbjsgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgQysrIHBzZXVkby1kZXN0cnVjdG9yIChDKysgW2V4cHIucHNldWRvXSkuCisvLy8KKy8vLyBBIHBzZXVkby1kZXN0cnVjdG9yIGlzIGFuIGV4cHJlc3Npb24gdGhhdCBsb29rcyBsaWtlIGEgbWVtYmVyIGFjY2VzcyB0byBhCisvLy8gZGVzdHJ1Y3RvciBvZiBhIHNjYWxhciB0eXBlLCBleGNlcHQgdGhhdCBzY2FsYXIgdHlwZXMgZG9uJ3QgaGF2ZQorLy8vIGRlc3RydWN0b3JzLiBGb3IgZXhhbXBsZToKKy8vLworLy8vIFxjb2RlCisvLy8gdHlwZWRlZiBpbnQgVDsKKy8vLyB2b2lkIGYoaW50ICpwKSB7CisvLy8gICBwLT5UOjp+VCgpOworLy8vIH0KKy8vLyBcZW5kY29kZQorLy8vCisvLy8gUHNldWRvLWRlc3RydWN0b3JzIHR5cGljYWxseSBvY2N1ciB3aGVuIGluc3RhbnRpYXRpbmcgdGVtcGxhdGVzIHN1Y2ggYXM6CisvLy8KKy8vLyBcY29kZQorLy8vIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisvLy8gdm9pZCBkZXN0cm95KFQqIHB0cikgeworLy8vICAgcHRyLT5UOjp+VCgpOworLy8vIH0KKy8vLyBcZW5kY29kZQorLy8vCisvLy8gZm9yIHNjYWxhciB0eXBlcy4gQSBwc2V1ZG8tZGVzdHJ1Y3RvciBleHByZXNzaW9uIGhhcyBubyBydW4tdGltZSBzZW1hbnRpY3MKKy8vLyBiZXlvbmQgZXZhbHVhdGluZyB0aGUgYmFzZSBleHByZXNzaW9uLgorY2xhc3MgQ1hYUHNldWRvRGVzdHJ1Y3RvckV4cHIgOiBwdWJsaWMgRXhwciB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIC8vLyBcYnJpZWYgVGhlIGJhc2UgZXhwcmVzc2lvbiAodGhhdCBpcyBiZWluZyBkZXN0cm95ZWQpLgorICBTdG10ICpCYXNlID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhlIG9wZXJhdG9yIHdhcyBhbiBhcnJvdyAoJy0+Jyk7IG90aGVyd2lzZSwgaXQgd2FzIGEKKyAgLy8vIHBlcmlvZCAoJy4nKS4KKyAgYm9vbCBJc0Fycm93IDogMTsKKworICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgJy4nIG9yICctPicgb3BlcmF0b3IuCisgIFNvdXJjZUxvY2F0aW9uIE9wZXJhdG9yTG9jOworCisgIC8vLyBcYnJpZWYgVGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciB0aGF0IGZvbGxvd3MgdGhlIG9wZXJhdG9yLCBpZiBwcmVzZW50LgorICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYzsKKworICAvLy8gXGJyaWVmIFRoZSB0eXBlIHRoYXQgcHJlY2VkZXMgdGhlICc6OicgaW4gYSBxdWFsaWZpZWQgcHNldWRvLWRlc3RydWN0b3IKKyAgLy8vIGV4cHJlc3Npb24uCisgIFR5cGVTb3VyY2VJbmZvICpTY29wZVR5cGUgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSAnOjonIGluIGEgcXVhbGlmaWVkIHBzZXVkby1kZXN0cnVjdG9yCisgIC8vLyBleHByZXNzaW9uLgorICBTb3VyY2VMb2NhdGlvbiBDb2xvbkNvbG9uTG9jOworCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSAnficuCisgIFNvdXJjZUxvY2F0aW9uIFRpbGRlTG9jOworCisgIC8vLyBcYnJpZWYgVGhlIHR5cGUgYmVpbmcgZGVzdHJveWVkLCBvciBpdHMgbmFtZSBpZiB3ZSB3ZXJlIHVuYWJsZSB0bworICAvLy8gcmVzb2x2ZSB0aGUgbmFtZS4KKyAgUHNldWRvRGVzdHJ1Y3RvclR5cGVTdG9yYWdlIERlc3Ryb3llZFR5cGU7CisKK3B1YmxpYzoKKyAgQ1hYUHNldWRvRGVzdHJ1Y3RvckV4cHIoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqQmFzZSwgYm9vbCBpc0Fycm93LCBTb3VyY2VMb2NhdGlvbiBPcGVyYXRvckxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpTY29wZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENvbG9uQ29sb25Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRpbGRlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG9EZXN0cnVjdG9yVHlwZVN0b3JhZ2UgRGVzdHJveWVkVHlwZSk7CisKKyAgZXhwbGljaXQgQ1hYUHNldWRvRGVzdHJ1Y3RvckV4cHIoRW1wdHlTaGVsbCBTaGVsbCkKKyAgICAgIDogRXhwcihDWFhQc2V1ZG9EZXN0cnVjdG9yRXhwckNsYXNzLCBTaGVsbCksIElzQXJyb3coZmFsc2UpIHt9CisKKyAgRXhwciAqZ2V0QmFzZSgpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8RXhwcj4oQmFzZSk7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB0aGlzIG1lbWJlciBleHByZXNzaW9uIGFjdHVhbGx5IGhhZAorICAvLy8gYSBDKysgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHByaW9yIHRvIHRoZSBuYW1lIG9mIHRoZSBtZW1iZXIsIGUuZy4sCisgIC8vLyB4LT5CYXNlOjpmb28uCisgIGJvb2wgaGFzUXVhbGlmaWVyKCkgY29uc3QgeyByZXR1cm4gUXVhbGlmaWVyTG9jLmhhc1F1YWxpZmllcigpOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZXMgdGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciB0aGF0IHF1YWxpZmllcyB0aGUgdHlwZSBuYW1lLAorICAvLy8gd2l0aCBzb3VyY2UtbG9jYXRpb24gaW5mb3JtYXRpb24uCisgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgZ2V0UXVhbGlmaWVyTG9jKCkgY29uc3QgeyByZXR1cm4gUXVhbGlmaWVyTG9jOyB9CisKKyAgLy8vIFxicmllZiBJZiB0aGUgbWVtYmVyIG5hbWUgd2FzIHF1YWxpZmllZCwgcmV0cmlldmVzIHRoZQorICAvLy8gbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHRoYXQgcHJlY2VkZXMgdGhlIG1lbWJlciBuYW1lLiBPdGhlcndpc2UsIHJldHVybnMKKyAgLy8vIG51bGwuCisgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKmdldFF1YWxpZmllcigpIGNvbnN0IHsKKyAgICByZXR1cm4gUXVhbGlmaWVyTG9jLmdldE5lc3RlZE5hbWVTcGVjaWZpZXIoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBwc2V1ZG8tZGVzdHJ1Y3RvciBleHByZXNzaW9uIHdhcyB3cml0dGVuCisgIC8vLyB1c2luZyBhbiAnLT4nIChvdGhlcndpc2UsIGl0IHVzZWQgYSAnLicpLgorICBib29sIGlzQXJyb3coKSBjb25zdCB7IHJldHVybiBJc0Fycm93OyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlICcuJyBvciAnLT4nIG9wZXJhdG9yLgorICBTb3VyY2VMb2NhdGlvbiBnZXRPcGVyYXRvckxvYygpIGNvbnN0IHsgcmV0dXJuIE9wZXJhdG9yTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc2NvcGUgdHlwZSBpbiBhIHF1YWxpZmllZCBwc2V1ZG8tZGVzdHJ1Y3RvcgorICAvLy8gZXhwcmVzc2lvbi4KKyAgLy8vCisgIC8vLyBQc2V1ZG8tZGVzdHJ1Y3RvciBleHByZXNzaW9ucyBjYW4gaGF2ZSBleHRyYSBxdWFsaWZpY2F0aW9uIHdpdGhpbiB0aGVtCisgIC8vLyB0aGF0IGlzIG5vdCBwYXJ0IG9mIHRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIsIGUuZy4sIFxjIHAtPlQ6On5UKCkuCisgIC8vLyBIZXJlLCBpZiB0aGUgb2JqZWN0IHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gaXMgKG9yIG1heSBiZSkgYSBzY2FsYXIgdHlwZSwKKyAgLy8vIFxwIFQgbWF5IGFsc28gYmUgYSBzY2FsYXIgdHlwZSBhbmQsIHRoZXJlZm9yZSwgY2Fubm90IGJlIHBhcnQgb2YgYQorICAvLy8gbmVzdGVkLW5hbWUtc3BlY2lmaWVyLiBJdCBpcyBzdG9yZWQgYXMgdGhlICJzY29wZSB0eXBlIiBvZiB0aGUgcHNldWRvLQorICAvLy8gZGVzdHJ1Y3RvciBleHByZXNzaW9uLgorICBUeXBlU291cmNlSW5mbyAqZ2V0U2NvcGVUeXBlSW5mbygpIGNvbnN0IHsgcmV0dXJuIFNjb3BlVHlwZTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSAnOjonIGluIGEgcXVhbGlmaWVkIHBzZXVkby1kZXN0cnVjdG9yCisgIC8vLyBleHByZXNzaW9uLgorICBTb3VyY2VMb2NhdGlvbiBnZXRDb2xvbkNvbG9uTG9jKCkgY29uc3QgeyByZXR1cm4gQ29sb25Db2xvbkxvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSAnficuCisgIFNvdXJjZUxvY2F0aW9uIGdldFRpbGRlTG9jKCkgY29uc3QgeyByZXR1cm4gVGlsZGVMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSB0eXBlCisgIC8vLyBiZWluZyBkZXN0cm95ZWQuCisgIC8vLworICAvLy8gVGhpcyB0eXBlLXNvdXJjZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgZm9yIG5vbi1kZXBlbmRlbnQKKyAgLy8vIHBzZXVkby1kZXN0cnVjdG9yIGV4cHJlc3Npb25zIGFuZCBzb21lIGRlcGVuZGVudCBwc2V1ZG8tZGVzdHJ1Y3RvcgorICAvLy8gZXhwcmVzc2lvbnMuIFJldHVybnMgbnVsbCBpZiB3ZSBvbmx5IGhhdmUgdGhlIGlkZW50aWZpZXIgZm9yIGEKKyAgLy8vIGRlcGVuZGVudCBwc2V1ZG8tZGVzdHJ1Y3RvciBleHByZXNzaW9uLgorICBUeXBlU291cmNlSW5mbyAqZ2V0RGVzdHJveWVkVHlwZUluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIERlc3Ryb3llZFR5cGUuZ2V0VHlwZVNvdXJjZUluZm8oKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSW4gYSBkZXBlbmRlbnQgcHNldWRvLWRlc3RydWN0b3IgZXhwcmVzc2lvbiBmb3Igd2hpY2ggd2UgZG8gbm90CisgIC8vLyBoYXZlIGZ1bGwgdHlwZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGVzdHJveWVkIHR5cGUsIHByb3ZpZGVzIHRoZSBuYW1lCisgIC8vLyBvZiB0aGUgZGVzdHJveWVkIHR5cGUuCisgIElkZW50aWZpZXJJbmZvICpnZXREZXN0cm95ZWRUeXBlSWRlbnRpZmllcigpIGNvbnN0IHsKKyAgICByZXR1cm4gRGVzdHJveWVkVHlwZS5nZXRJZGVudGlmaWVyKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0eXBlIGJlaW5nIGRlc3Ryb3llZC4KKyAgUXVhbFR5cGUgZ2V0RGVzdHJveWVkVHlwZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSB0eXBlIGJlaW5nIGRlc3Ryb3llZC4KKyAgU291cmNlTG9jYXRpb24gZ2V0RGVzdHJveWVkVHlwZUxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gRGVzdHJveWVkVHlwZS5nZXRMb2NhdGlvbigpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIG5hbWUgb2YgZGVzdHJveWVkIHR5cGUgZm9yIGEgZGVwZW5kZW50IHBzZXVkby1kZXN0cnVjdG9yCisgIC8vLyBleHByZXNzaW9uLgorICB2b2lkIHNldERlc3Ryb3llZFR5cGUoSWRlbnRpZmllckluZm8gKklJLCBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBEZXN0cm95ZWRUeXBlID0gUHNldWRvRGVzdHJ1Y3RvclR5cGVTdG9yYWdlKElJLCBMb2MpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGRlc3Ryb3llZCB0eXBlLgorICB2b2lkIHNldERlc3Ryb3llZFR5cGUoVHlwZVNvdXJjZUluZm8gKkluZm8pIHsKKyAgICBEZXN0cm95ZWRUeXBlID0gUHNldWRvRGVzdHJ1Y3RvclR5cGVTdG9yYWdlKEluZm8pOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHtyZXR1cm4gQmFzZS0+Z2V0TG9jU3RhcnQoKTt9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IENYWFBzZXVkb0Rlc3RydWN0b3JFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7IHJldHVybiBjaGlsZF9yYW5nZSgmQmFzZSwgJkJhc2UgKyAxKTsgfQorfTsKKworLy8vIFxicmllZiBBIHR5cGUgdHJhaXQgdXNlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdmFyaW91cyBDKysxMSBhbmQKKy8vLyBMaWJyYXJ5IFRSMSB0cmFpdCB0ZW1wbGF0ZXMuCisvLy8KKy8vLyBcY29kZQorLy8vICAgX19pc19wb2QoaW50KSA9PSB0cnVlCisvLy8gICBfX2lzX2VudW0oc3RkOjpzdHJpbmcpID09IGZhbHNlCisvLy8gICBfX2lzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlKHZlY3RvcjxpbnQ+LCBpbnQqLCBpbnQqKQorLy8vIFxlbmRjb2RlCitjbGFzcyBUeXBlVHJhaXRFeHByIGZpbmFsCisgICAgOiBwdWJsaWMgRXhwciwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPFR5cGVUcmFpdEV4cHIsIFR5cGVTb3VyY2VJbmZvICo+IHsKKyAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIHR5cGUgdHJhaXQga2V5d29yZC4KKyAgU291cmNlTG9jYXRpb24gTG9jOworICAKKyAgLy8vIFxicmllZiAgVGhlIGxvY2F0aW9uIG9mIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzLgorICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2M7CisgIAorICAvLyBOb3RlOiBUaGUgVHlwZVNvdXJjZUluZm9zIGZvciB0aGUgYXJndW1lbnRzIGFyZSBhbGxvY2F0ZWQgYWZ0ZXIgdGhlCisgIC8vIFR5cGVUcmFpdEV4cHIuCisgIAorICBUeXBlVHJhaXRFeHByKFF1YWxUeXBlIFQsIFNvdXJjZUxvY2F0aW9uIExvYywgVHlwZVRyYWl0IEtpbmQsCisgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZVNvdXJjZUluZm8gKj4gQXJncywKKyAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgYm9vbCBWYWx1ZSk7CisKKyAgVHlwZVRyYWl0RXhwcihFbXB0eVNoZWxsIEVtcHR5KSA6IEV4cHIoVHlwZVRyYWl0RXhwckNsYXNzLCBFbXB0eSkge30KKworICBzaXplX3QgbnVtVHJhaWxpbmdPYmplY3RzKE92ZXJsb2FkVG9rZW48VHlwZVNvdXJjZUluZm8gKj4pIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TnVtQXJncygpOworICB9CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10V3JpdGVyOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbmV3IHR5cGUgdHJhaXQgZXhwcmVzc2lvbi4KKyAgc3RhdGljIFR5cGVUcmFpdEV4cHIgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywgVHlwZVRyYWl0IEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZVNvdXJjZUluZm8gKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWYWx1ZSk7CisKKyAgc3RhdGljIFR5cGVUcmFpdEV4cHIgKkNyZWF0ZURlc2VyaWFsaXplZChjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUFyZ3MpOworICAKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hpY2ggdHlwZSB0cmFpdCB0aGlzIGV4cHJlc3Npb24gdXNlcy4KKyAgVHlwZVRyYWl0IGdldFRyYWl0KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUeXBlVHJhaXQ+KFR5cGVUcmFpdEV4cHJCaXRzLktpbmQpOworICB9CisKKyAgYm9vbCBnZXRWYWx1ZSgpIGNvbnN0IHsgCisgICAgYXNzZXJ0KCFpc1ZhbHVlRGVwZW5kZW50KCkpOyAKKyAgICByZXR1cm4gVHlwZVRyYWl0RXhwckJpdHMuVmFsdWU7IAorICB9CisgIAorICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byB0aGlzIHR5cGUgdHJhaXQuCisgIHVuc2lnbmVkIGdldE51bUFyZ3MoKSBjb25zdCB7IHJldHVybiBUeXBlVHJhaXRFeHByQml0cy5OdW1BcmdzOyB9CisgIAorICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBJdGggYXJndW1lbnQuCisgIFR5cGVTb3VyY2VJbmZvICpnZXRBcmcodW5zaWduZWQgSSkgY29uc3QgeworICAgIGFzc2VydChJIDwgZ2V0TnVtQXJncygpICYmICJBcmd1bWVudCBvdXQtb2YtcmFuZ2UiKTsKKyAgICByZXR1cm4gZ2V0QXJncygpW0ldOworICB9CisgIAorICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBhcmd1bWVudCB0eXBlcy4KKyAgQXJyYXlSZWY8VHlwZVNvdXJjZUluZm8gKj4gZ2V0QXJncygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKGdldFRyYWlsaW5nT2JqZWN0czxUeXBlU291cmNlSW5mbyAqPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TnVtQXJncygpKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gVHlwZVRyYWl0RXhwckNsYXNzOworICB9CisgIAorICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9Cit9OworCisvLy8gXGJyaWVmIEFuIEVtYmFyY2FkZXJvIGFycmF5IHR5cGUgdHJhaXQsIGFzIHVzZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mCisvLy8gX19hcnJheV9yYW5rIGFuZCBfX2FycmF5X2V4dGVudC4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8gXGNvZGUKKy8vLyAgIF9fYXJyYXlfcmFuayhpbnRbMTBdWzIwXSkgPT0gMgorLy8vICAgX19hcnJheV9leHRlbnQoaW50LCAxKSAgICA9PSAyMAorLy8vIFxlbmRjb2RlCitjbGFzcyBBcnJheVR5cGVUcmFpdEV4cHIgOiBwdWJsaWMgRXhwciB7CisgIC8vLyBcYnJpZWYgVGhlIHRyYWl0LiBBbiBBcnJheVR5cGVUcmFpdCBlbnVtIGluIE1TVkMgY29tcGF0IHVuc2lnbmVkLgorICB1bnNpZ25lZCBBVFQgOiAyOworCisgIC8vLyBcYnJpZWYgVGhlIHZhbHVlIG9mIHRoZSB0eXBlIHRyYWl0LiBVbnNwZWNpZmllZCBpZiBkZXBlbmRlbnQuCisgIHVpbnQ2NF90IFZhbHVlID0gMDsKKworICAvLy8gXGJyaWVmIFRoZSBhcnJheSBkaW1lbnNpb24gYmVpbmcgcXVlcmllZCwgb3IgLTEgaWYgbm90IHVzZWQuCisgIEV4cHIgKkRpbWVuc2lvbjsKKworICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgdHlwZSB0cmFpdCBrZXl3b3JkLgorICBTb3VyY2VMb2NhdGlvbiBMb2M7CisKKyAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIGNsb3NpbmcgcGFyZW4uCisgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbjsKKworICAvLy8gXGJyaWVmIFRoZSB0eXBlIGJlaW5nIHF1ZXJpZWQuCisgIFR5cGVTb3VyY2VJbmZvICpRdWVyaWVkVHlwZSA9IG51bGxwdHI7CisKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIEFycmF5VHlwZVRyYWl0RXhwcihTb3VyY2VMb2NhdGlvbiBsb2MsIEFycmF5VHlwZVRyYWl0IGF0dCwKKyAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpxdWVyaWVkLCB1aW50NjRfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIEV4cHIgKmRpbWVuc2lvbiwgU291cmNlTG9jYXRpb24gcnBhcmVuLCBRdWFsVHlwZSB0eSkKKyAgICAgIDogRXhwcihBcnJheVR5cGVUcmFpdEV4cHJDbGFzcywgdHksIFZLX1JWYWx1ZSwgT0tfT3JkaW5hcnksCisgICAgICAgICAgICAgZmFsc2UsIHF1ZXJpZWQtPmdldFR5cGUoKS0+aXNEZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgICAgKHF1ZXJpZWQtPmdldFR5cGUoKS0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpIHx8CisgICAgICAgICAgICAgIChkaW1lbnNpb24gJiYgZGltZW5zaW9uLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnQoKSkpLAorICAgICAgICAgICAgIHF1ZXJpZWQtPmdldFR5cGUoKS0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSwKKyAgICAgICAgQVRUKGF0dCksIFZhbHVlKHZhbHVlKSwgRGltZW5zaW9uKGRpbWVuc2lvbiksCisgICAgICAgIExvYyhsb2MpLCBSUGFyZW4ocnBhcmVuKSwgUXVlcmllZFR5cGUocXVlcmllZCkge30KKworICBleHBsaWNpdCBBcnJheVR5cGVUcmFpdEV4cHIoRW1wdHlTaGVsbCBFbXB0eSkKKyAgICAgIDogRXhwcihBcnJheVR5cGVUcmFpdEV4cHJDbGFzcywgRW1wdHkpLCBBVFQoMCkge30KKworICB2aXJ0dWFsIH5BcnJheVR5cGVUcmFpdEV4cHIoKSA9IGRlZmF1bHQ7CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJQYXJlbjsgfQorCisgIEFycmF5VHlwZVRyYWl0IGdldFRyYWl0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8QXJyYXlUeXBlVHJhaXQ+KEFUVCk7IH0KKworICBRdWFsVHlwZSBnZXRRdWVyaWVkVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFF1ZXJpZWRUeXBlLT5nZXRUeXBlKCk7IH0KKworICBUeXBlU291cmNlSW5mbyAqZ2V0UXVlcmllZFR5cGVTb3VyY2VJbmZvKCkgY29uc3QgeyByZXR1cm4gUXVlcmllZFR5cGU7IH0KKworICB1aW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgYXNzZXJ0KCFpc1R5cGVEZXBlbmRlbnQoKSk7IHJldHVybiBWYWx1ZTsgfQorCisgIEV4cHIgKmdldERpbWVuc2lvbkV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBEaW1lbnNpb247IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQXJyYXlUeXBlVHJhaXRFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9Cit9OworCisvLy8gXGJyaWVmIEFuIGV4cHJlc3Npb24gdHJhaXQgaW50cmluc2ljLgorLy8vCisvLy8gRXhhbXBsZToKKy8vLyBcY29kZQorLy8vICAgX19pc19sdmFsdWVfZXhwcihzdGQ6OmNvdXQpID09IHRydWUKKy8vLyAgIF9faXNfbHZhbHVlX2V4cHIoMSkgPT0gZmFsc2UKKy8vLyBcZW5kY29kZQorY2xhc3MgRXhwcmVzc2lvblRyYWl0RXhwciA6IHB1YmxpYyBFeHByIHsKKyAgLy8vIFxicmllZiBUaGUgdHJhaXQuIEEgRXhwcmVzc2lvblRyYWl0IGVudW0gaW4gTVNWQyBjb21wYXRpYmxlIHVuc2lnbmVkLgorICB1bnNpZ25lZCBFVCA6IDMxOworCisgIC8vLyBcYnJpZWYgVGhlIHZhbHVlIG9mIHRoZSB0eXBlIHRyYWl0LiBVbnNwZWNpZmllZCBpZiBkZXBlbmRlbnQuCisgIHVuc2lnbmVkIFZhbHVlIDogMTsKKworICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgdHlwZSB0cmFpdCBrZXl3b3JkLgorICBTb3VyY2VMb2NhdGlvbiBMb2M7CisKKyAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIGNsb3NpbmcgcGFyZW4uCisgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbjsKKworICAvLy8gXGJyaWVmIFRoZSBleHByZXNzaW9uIGJlaW5nIHF1ZXJpZWQuCisgIEV4cHIqIFF1ZXJpZWRFeHByZXNzaW9uID0gbnVsbHB0cjsKKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKworICBFeHByZXNzaW9uVHJhaXRFeHByKFNvdXJjZUxvY2F0aW9uIGxvYywgRXhwcmVzc2lvblRyYWl0IGV0LAorICAgICAgICAgICAgICAgICAgICAgRXhwciAqcXVlcmllZCwgYm9vbCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIHJwYXJlbiwgUXVhbFR5cGUgcmVzdWx0VHlwZSkKKyAgICAgIDogRXhwcihFeHByZXNzaW9uVHJhaXRFeHByQ2xhc3MsIHJlc3VsdFR5cGUsIFZLX1JWYWx1ZSwgT0tfT3JkaW5hcnksCisgICAgICAgICAgICAgZmFsc2UsIC8vIE5vdCB0eXBlLWRlcGVuZGVudAorICAgICAgICAgICAgIC8vIFZhbHVlLWRlcGVuZGVudCBpZiB0aGUgYXJndW1lbnQgaXMgdHlwZS1kZXBlbmRlbnQuCisgICAgICAgICAgICAgcXVlcmllZC0+aXNUeXBlRGVwZW5kZW50KCksCisgICAgICAgICAgICAgcXVlcmllZC0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCksCisgICAgICAgICAgICAgcXVlcmllZC0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSwKKyAgICAgICAgRVQoZXQpLCBWYWx1ZSh2YWx1ZSksIExvYyhsb2MpLCBSUGFyZW4ocnBhcmVuKSwKKyAgICAgICAgUXVlcmllZEV4cHJlc3Npb24ocXVlcmllZCkge30KKworICBleHBsaWNpdCBFeHByZXNzaW9uVHJhaXRFeHByKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgICA6IEV4cHIoRXhwcmVzc2lvblRyYWl0RXhwckNsYXNzLCBFbXB0eSksIEVUKDApLCBWYWx1ZShmYWxzZSkge30KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUlBhcmVuOyB9CisKKyAgRXhwcmVzc2lvblRyYWl0IGdldFRyYWl0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8RXhwcmVzc2lvblRyYWl0PihFVCk7IH0KKworICBFeHByICpnZXRRdWVyaWVkRXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIFF1ZXJpZWRFeHByZXNzaW9uOyB9CisKKyAgYm9vbCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IEV4cHJlc3Npb25UcmFpdEV4cHJDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoY2hpbGRfaXRlcmF0b3IoKSwgY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQSByZWZlcmVuY2UgdG8gYW4gb3ZlcmxvYWRlZCBmdW5jdGlvbiBzZXQsIGVpdGhlciBhbgorLy8vIFxjIFVucmVzb2x2ZWRMb29rdXBFeHByIG9yIGFuIFxjIFVucmVzb2x2ZWRNZW1iZXJFeHByLgorY2xhc3MgT3ZlcmxvYWRFeHByIDogcHVibGljIEV4cHIgeworICAvLy8gXGJyaWVmIFRoZSBjb21tb24gbmFtZSBvZiB0aGVzZSBkZWNsYXJhdGlvbnMuCisgIERlY2xhcmF0aW9uTmFtZUluZm8gTmFtZUluZm87CisKKyAgLy8vIFxicmllZiBUaGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHRoYXQgcXVhbGlmaWVzIHRoZSBuYW1lLCBpZiBhbnkuCisgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgUXVhbGlmaWVyTG9jOworCisgIC8vLyBUaGUgcmVzdWx0cy4gIFRoZXNlIGFyZSB1bmRlc3VnYXJlZCwgd2hpY2ggaXMgdG8gc2F5LCB0aGV5IG1heQorICAvLy8gaW5jbHVkZSBVc2luZ1NoYWRvd0RlY2xzLiAgQWNjZXNzIGlzIHJlbGF0aXZlIHRvIHRoZSBuYW1pbmcKKyAgLy8vIGNsYXNzLgorICAvLyBGSVhNRTogQWxsb2NhdGUgdGhpcyBkYXRhIGFmdGVyIHRoZSBPdmVybG9hZEV4cHIgc3ViY2xhc3MuCisgIERlY2xBY2Nlc3NQYWlyICpSZXN1bHRzID0gbnVsbHB0cjsKKworICB1bnNpZ25lZCBOdW1SZXN1bHRzID0gMDsKKworcHJvdGVjdGVkOgorICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhlIG5hbWUgaW5jbHVkZXMgaW5mbyBmb3IgZXhwbGljaXQgdGVtcGxhdGUKKyAgLy8vIGtleXdvcmQgYW5kIGFyZ3VtZW50cy4KKyAgYm9vbCBIYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8gPSBmYWxzZTsKKworICBPdmVybG9hZEV4cHIoU3RtdENsYXNzIEssIGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYywKKyAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlS1dMb2MsCisgICAgICAgICAgICAgICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZOYW1lSW5mbywKKyAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgVW5yZXNvbHZlZFNldEl0ZXJhdG9yIEJlZ2luLCBVbnJlc29sdmVkU2V0SXRlcmF0b3IgRW5kLAorICAgICAgICAgICAgICAgYm9vbCBLbm93bkRlcGVuZGVudCwKKyAgICAgICAgICAgICAgIGJvb2wgS25vd25JbnN0YW50aWF0aW9uRGVwZW5kZW50LAorICAgICAgICAgICAgICAgYm9vbCBLbm93bkNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2spOworCisgIE92ZXJsb2FkRXhwcihTdG10Q2xhc3MgSywgRW1wdHlTaGVsbCBFbXB0eSkgOiBFeHByKEssIEVtcHR5KSB7fQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBvcHRpb25hbCB0ZW1wbGF0ZSBrZXl3b3JkIGFuZCBhcmd1bWVudHMgaW5mby4KKyAgQVNUVGVtcGxhdGVLV0FuZEFyZ3NJbmZvICoKKyAgZ2V0VHJhaWxpbmdBU1RUZW1wbGF0ZUtXQW5kQXJnc0luZm8oKTsgLy8gZGVmaW5lZCBmYXIgYmVsb3cuCisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG9wdGlvbmFsIHRlbXBsYXRlIGtleXdvcmQgYW5kIGFyZ3VtZW50cyBpbmZvLgorICBjb25zdCBBU1RUZW1wbGF0ZUtXQW5kQXJnc0luZm8gKmdldFRyYWlsaW5nQVNUVGVtcGxhdGVLV0FuZEFyZ3NJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PE92ZXJsb2FkRXhwciAqPih0aGlzKQorICAgICAgICAtPmdldFRyYWlsaW5nQVNUVGVtcGxhdGVLV0FuZEFyZ3NJbmZvKCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBvcHRpb25hbCB0ZW1wbGF0ZSBhcmd1bWVudHMuCisgIFRlbXBsYXRlQXJndW1lbnRMb2MgKmdldFRyYWlsaW5nVGVtcGxhdGVBcmd1bWVudExvYygpOyAvLyBkZWZpbmVkIGZhciBiZWxvdworCisgIHZvaWQgaW5pdGlhbGl6ZVJlc3VsdHMoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICBVbnJlc29sdmVkU2V0SXRlcmF0b3IgQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXNvbHZlZFNldEl0ZXJhdG9yIEVuZCk7CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10V3JpdGVyOworCisgIHN0cnVjdCBGaW5kUmVzdWx0IHsKKyAgICBPdmVybG9hZEV4cHIgKkV4cHJlc3Npb247CisgICAgYm9vbCBJc0FkZHJlc3NPZk9wZXJhbmQ7CisgICAgYm9vbCBIYXNGb3JtT2ZNZW1iZXJQb2ludGVyOworICB9OworCisgIC8vLyBcYnJpZWYgRmluZHMgdGhlIG92ZXJsb2FkZWQgZXhwcmVzc2lvbiBpbiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBccCBFIG9mCisgIC8vLyBPdmVybG9hZFR5LgorICAvLy8KKyAgLy8vIFxyZXR1cm4gdGhlIGV4cHJlc3Npb24gKHdoaWNoIG11c3QgYmUgdGhlcmUpIGFuZCB0cnVlIGlmIGl0IGhhcworICAvLy8gdGhlIHBhcnRpY3VsYXIgZm9ybSBvZiBhIG1lbWJlciBwb2ludGVyIGV4cHJlc3Npb24KKyAgc3RhdGljIEZpbmRSZXN1bHQgZmluZChFeHByICpFKSB7CisgICAgYXNzZXJ0KEUtPmdldFR5cGUoKS0+aXNTcGVjaWZpY0J1aWx0aW5UeXBlKEJ1aWx0aW5UeXBlOjpPdmVybG9hZCkpOworCisgICAgRmluZFJlc3VsdCBSZXN1bHQ7CisKKyAgICBFID0gRS0+SWdub3JlUGFyZW5zKCk7CisgICAgaWYgKGlzYTxVbmFyeU9wZXJhdG9yPihFKSkgeworICAgICAgYXNzZXJ0KGNhc3Q8VW5hcnlPcGVyYXRvcj4oRSktPmdldE9wY29kZSgpID09IFVPX0FkZHJPZik7CisgICAgICBFID0gY2FzdDxVbmFyeU9wZXJhdG9yPihFKS0+Z2V0U3ViRXhwcigpOworICAgICAgT3ZlcmxvYWRFeHByICpPdmwgPSBjYXN0PE92ZXJsb2FkRXhwcj4oRS0+SWdub3JlUGFyZW5zKCkpOworCisgICAgICBSZXN1bHQuSGFzRm9ybU9mTWVtYmVyUG9pbnRlciA9IChFID09IE92bCAmJiBPdmwtPmdldFF1YWxpZmllcigpKTsKKyAgICAgIFJlc3VsdC5Jc0FkZHJlc3NPZk9wZXJhbmQgPSB0cnVlOworICAgICAgUmVzdWx0LkV4cHJlc3Npb24gPSBPdmw7CisgICAgfSBlbHNlIHsKKyAgICAgIFJlc3VsdC5IYXNGb3JtT2ZNZW1iZXJQb2ludGVyID0gZmFsc2U7CisgICAgICBSZXN1bHQuSXNBZGRyZXNzT2ZPcGVyYW5kID0gZmFsc2U7CisgICAgICBSZXN1bHQuRXhwcmVzc2lvbiA9IGNhc3Q8T3ZlcmxvYWRFeHByPihFKTsKKyAgICB9CisKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgLy8vIFxicmllZiBHZXRzIHRoZSBuYW1pbmcgY2xhc3Mgb2YgdGhpcyBsb29rdXAsIGlmIGFueS4KKyAgQ1hYUmVjb3JkRGVjbCAqZ2V0TmFtaW5nQ2xhc3MoKSBjb25zdDsKKworICB1c2luZyBkZWNsc19pdGVyYXRvciA9IFVucmVzb2x2ZWRTZXRJbXBsOjppdGVyYXRvcjsKKworICBkZWNsc19pdGVyYXRvciBkZWNsc19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIFVucmVzb2x2ZWRTZXRJdGVyYXRvcihSZXN1bHRzKTsgfQorICBkZWNsc19pdGVyYXRvciBkZWNsc19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIFVucmVzb2x2ZWRTZXRJdGVyYXRvcihSZXN1bHRzICsgTnVtUmVzdWx0cyk7CisgIH0KKyAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8ZGVjbHNfaXRlcmF0b3I+IGRlY2xzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlX3JhbmdlKGRlY2xzX2JlZ2luKCksIGRlY2xzX2VuZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0cyB0aGUgbnVtYmVyIG9mIGRlY2xhcmF0aW9ucyBpbiB0aGUgdW5yZXNvbHZlZCBzZXQuCisgIHVuc2lnbmVkIGdldE51bURlY2xzKCkgY29uc3QgeyByZXR1cm4gTnVtUmVzdWx0czsgfQorCisgIC8vLyBcYnJpZWYgR2V0cyB0aGUgZnVsbCBuYW1lIGluZm8uCisgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJmdldE5hbWVJbmZvKCkgY29uc3QgeyByZXR1cm4gTmFtZUluZm87IH0KKworICAvLy8gXGJyaWVmIEdldHMgdGhlIG5hbWUgbG9va2VkIHVwLgorICBEZWNsYXJhdGlvbk5hbWUgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWVJbmZvLmdldE5hbWUoKTsgfQorCisgIC8vLyBcYnJpZWYgR2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIG5hbWUuCisgIFNvdXJjZUxvY2F0aW9uIGdldE5hbWVMb2MoKSBjb25zdCB7IHJldHVybiBOYW1lSW5mby5nZXRMb2MoKTsgfQorCisgIC8vLyBcYnJpZWYgRmV0Y2hlcyB0aGUgbmVzdGVkLW5hbWUgcXVhbGlmaWVyLCBpZiBvbmUgd2FzIGdpdmVuLgorICBOZXN0ZWROYW1lU3BlY2lmaWVyICpnZXRRdWFsaWZpZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFF1YWxpZmllckxvYy5nZXROZXN0ZWROYW1lU3BlY2lmaWVyKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEZldGNoZXMgdGhlIG5lc3RlZC1uYW1lIHF1YWxpZmllciB3aXRoIHNvdXJjZS1sb2NhdGlvbgorICAvLy8gaW5mb3JtYXRpb24sIGlmIG9uZSB3YXMgZ2l2ZW4uCisgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgZ2V0UXVhbGlmaWVyTG9jKCkgY29uc3QgeyByZXR1cm4gUXVhbGlmaWVyTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIHRlbXBsYXRlIGtleXdvcmQgcHJlY2VkaW5nCisgIC8vLyB0aGlzIG5hbWUsIGlmIGFueS4KKyAgU291cmNlTG9jYXRpb24gZ2V0VGVtcGxhdGVLZXl3b3JkTG9jKCkgY29uc3QgeworICAgIGlmICghSGFzVGVtcGxhdGVLV0FuZEFyZ3NJbmZvKSByZXR1cm4gU291cmNlTG9jYXRpb24oKTsKKyAgICByZXR1cm4gZ2V0VHJhaWxpbmdBU1RUZW1wbGF0ZUtXQW5kQXJnc0luZm8oKS0+VGVtcGxhdGVLV0xvYzsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBsZWZ0IGFuZ2xlIGJyYWNrZXQgc3RhcnRpbmcgdGhlCisgIC8vLyBleHBsaWNpdCB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0IGZvbGxvd2luZyB0aGUgbmFtZSwgaWYgYW55LgorICBTb3VyY2VMb2NhdGlvbiBnZXRMQW5nbGVMb2MoKSBjb25zdCB7CisgICAgaWYgKCFIYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8pIHJldHVybiBTb3VyY2VMb2NhdGlvbigpOworICAgIHJldHVybiBnZXRUcmFpbGluZ0FTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbygpLT5MQW5nbGVMb2M7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmlnaHQgYW5nbGUgYnJhY2tldCBlbmRpbmcgdGhlCisgIC8vLyBleHBsaWNpdCB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0IGZvbGxvd2luZyB0aGUgbmFtZSwgaWYgYW55LgorICBTb3VyY2VMb2NhdGlvbiBnZXRSQW5nbGVMb2MoKSBjb25zdCB7CisgICAgaWYgKCFIYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8pIHJldHVybiBTb3VyY2VMb2NhdGlvbigpOworICAgIHJldHVybiBnZXRUcmFpbGluZ0FTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbygpLT5SQW5nbGVMb2M7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB0aGUgbmFtZSB3YXMgcHJlY2VkZWQgYnkgdGhlIHRlbXBsYXRlIGtleXdvcmQuCisgIGJvb2wgaGFzVGVtcGxhdGVLZXl3b3JkKCkgY29uc3QgeyByZXR1cm4gZ2V0VGVtcGxhdGVLZXl3b3JkTG9jKCkuaXNWYWxpZCgpOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBleHByZXNzaW9uIGhhZCBleHBsaWNpdCB0ZW1wbGF0ZSBhcmd1bWVudHMuCisgIGJvb2wgaGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3MoKSBjb25zdCB7IHJldHVybiBnZXRMQW5nbGVMb2MoKS5pc1ZhbGlkKCk7IH0KKworICBUZW1wbGF0ZUFyZ3VtZW50TG9jIGNvbnN0ICpnZXRUZW1wbGF0ZUFyZ3MoKSBjb25zdCB7CisgICAgaWYgKCFoYXNFeHBsaWNpdFRlbXBsYXRlQXJncygpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8T3ZlcmxvYWRFeHByICo+KHRoaXMpLT5nZXRUcmFpbGluZ1RlbXBsYXRlQXJndW1lbnRMb2MoKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bVRlbXBsYXRlQXJncygpIGNvbnN0IHsKKyAgICBpZiAoIWhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzKCkpCisgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBnZXRUcmFpbGluZ0FTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbygpLT5OdW1UZW1wbGF0ZUFyZ3M7CisgIH0KKworICBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50TG9jPiB0ZW1wbGF0ZV9hcmd1bWVudHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHtnZXRUZW1wbGF0ZUFyZ3MoKSwgZ2V0TnVtVGVtcGxhdGVBcmdzKCl9OworICB9CisKKyAgLy8vIFxicmllZiBDb3BpZXMgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBpbnRvIHRoZSBnaXZlbiBzdHJ1Y3R1cmUuCisgIHZvaWQgY29weVRlbXBsYXRlQXJndW1lbnRzSW50byhUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gJkxpc3QpIGNvbnN0IHsKKyAgICBpZiAoaGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3MoKSkKKyAgICAgIGdldFRyYWlsaW5nQVNUVGVtcGxhdGVLV0FuZEFyZ3NJbmZvKCktPmNvcHlJbnRvKGdldFRlbXBsYXRlQXJncygpLCBMaXN0KTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBVbnJlc29sdmVkTG9va3VwRXhwckNsYXNzIHx8CisgICAgICAgICAgIFQtPmdldFN0bXRDbGFzcygpID09IFVucmVzb2x2ZWRNZW1iZXJFeHByQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQSByZWZlcmVuY2UgdG8gYSBuYW1lIHdoaWNoIHdlIHdlcmUgYWJsZSB0byBsb29rIHVwIGR1cmluZworLy8vIHBhcnNpbmcgYnV0IGNvdWxkIG5vdCByZXNvbHZlIHRvIGEgc3BlY2lmaWMgZGVjbGFyYXRpb24uCisvLy8KKy8vLyBUaGlzIGFyaXNlcyBpbiBzZXZlcmFsIHdheXM6CisvLy8gICAqIHdlIG1pZ2h0IGJlIHdhaXRpbmcgZm9yIGFyZ3VtZW50LWRlcGVuZGVudCBsb29rdXA7CisvLy8gICAqIHRoZSBuYW1lIG1pZ2h0IHJlc29sdmUgdG8gYW4gb3ZlcmxvYWRlZCBmdW5jdGlvbjsKKy8vLyBhbmQgZXZlbnR1YWxseToKKy8vLyAgICogdGhlIGxvb2t1cCBtaWdodCBoYXZlIGluY2x1ZGVkIGEgZnVuY3Rpb24gdGVtcGxhdGUuCisvLy8KKy8vLyBUaGVzZSBuZXZlciBpbmNsdWRlIFVucmVzb2x2ZWRVc2luZ1ZhbHVlRGVjbHMsIHdoaWNoIGFyZSBhbHdheXMgY2xhc3MKKy8vLyBtZW1iZXJzIGFuZCB0aGVyZWZvcmUgYXBwZWFyIG9ubHkgaW4gVW5yZXNvbHZlZE1lbWJlckxvb2t1cEV4cHJzLgorY2xhc3MgVW5yZXNvbHZlZExvb2t1cEV4cHIgZmluYWwKKyAgICA6IHB1YmxpYyBPdmVybG9hZEV4cHIsCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czwKKyAgICAgICAgICBVbnJlc29sdmVkTG9va3VwRXhwciwgQVNUVGVtcGxhdGVLV0FuZEFyZ3NJbmZvLCBUZW1wbGF0ZUFyZ3VtZW50TG9jPiB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICBmcmllbmQgY2xhc3MgT3ZlcmxvYWRFeHByOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIC8vLyBUcnVlIGlmIHRoZXNlIGxvb2t1cCByZXN1bHRzIHNob3VsZCBiZSBleHRlbmRlZCBieQorICAvLy8gYXJndW1lbnQtZGVwZW5kZW50IGxvb2t1cCBpZiB0aGlzIGlzIHRoZSBvcGVyYW5kIG9mIGEgZnVuY3Rpb24KKyAgLy8vIGNhbGwuCisgIGJvb2wgUmVxdWlyZXNBREwgPSBmYWxzZTsKKworICAvLy8gVHJ1ZSBpZiB0aGVzZSBsb29rdXAgcmVzdWx0cyBhcmUgb3ZlcmxvYWRlZC4gIFRoaXMgaXMgcHJldHR5CisgIC8vLyB0cml2aWFsbHkgcmVkZXJpdmFibGUgaWYgd2UgdXJnZW50bHkgbmVlZCB0byBraWxsIHRoaXMgZmllbGQuCisgIGJvb2wgT3ZlcmxvYWRlZCA9IGZhbHNlOworCisgIC8vLyBUaGUgbmFtaW5nIGNsYXNzIChDKysgW2NsYXNzLmFjY2Vzcy5iYXNlXXA1KSBvZiB0aGUgbG9va3VwLCBpZgorICAvLy8gYW55LiAgVGhpcyBjYW4gZ2VuZXJhbGx5IGJlIHJlY2FsY3VsYXRlZCBmcm9tIHRoZSBjb250ZXh0IGNoYWluLAorICAvLy8gYnV0IHRoYXQgY2FuIGJlIGZhaXJseSBleHBlbnNpdmUgZm9yIHVucXVhbGlmaWVkIGxvb2t1cHMuICBJZiB3ZQorICAvLy8gd2FudCB0byBpbXByb3ZlIG1lbW9yeSB1c2UgaGVyZSwgdGhpcyBjb3VsZCBnbyBpbiBhIHVuaW9uCisgIC8vLyBhZ2FpbnN0IHRoZSBxdWFsaWZpZWQtbG9va3VwIGJpdHMuCisgIENYWFJlY29yZERlY2wgKk5hbWluZ0NsYXNzID0gbnVsbHB0cjsKKworICBVbnJlc29sdmVkTG9va3VwRXhwcihjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICBDWFhSZWNvcmREZWNsICpOYW1pbmdDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlS1dMb2MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIFJlcXVpcmVzQURMLCBib29sIE92ZXJsb2FkZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICBVbnJlc29sdmVkU2V0SXRlcmF0b3IgQmVnaW4sIFVucmVzb2x2ZWRTZXRJdGVyYXRvciBFbmQpCisgICAgICA6IE92ZXJsb2FkRXhwcihVbnJlc29sdmVkTG9va3VwRXhwckNsYXNzLCBDLCBRdWFsaWZpZXJMb2MsIFRlbXBsYXRlS1dMb2MsCisgICAgICAgICAgICAgICAgICAgICBOYW1lSW5mbywgVGVtcGxhdGVBcmdzLCBCZWdpbiwgRW5kLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgUmVxdWlyZXNBREwoUmVxdWlyZXNBREwpLAorICAgICAgICBPdmVybG9hZGVkKE92ZXJsb2FkZWQpLCBOYW1pbmdDbGFzcyhOYW1pbmdDbGFzcykge30KKworICBVbnJlc29sdmVkTG9va3VwRXhwcihFbXB0eVNoZWxsIEVtcHR5KQorICAgICAgOiBPdmVybG9hZEV4cHIoVW5yZXNvbHZlZExvb2t1cEV4cHJDbGFzcywgRW1wdHkpIHt9CisKKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPEFTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbz4pIGNvbnN0IHsKKyAgICByZXR1cm4gSGFzVGVtcGxhdGVLV0FuZEFyZ3NJbmZvID8gMSA6IDA7CisgIH0KKworcHVibGljOgorICBzdGF0aWMgVW5yZXNvbHZlZExvb2t1cEV4cHIgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhSZWNvcmREZWNsICpOYW1pbmdDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFETCwgYm9vbCBPdmVybG9hZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJlc29sdmVkU2V0SXRlcmF0b3IgQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmVzb2x2ZWRTZXRJdGVyYXRvciBFbmQpIHsKKyAgICByZXR1cm4gbmV3KEMpIFVucmVzb2x2ZWRMb29rdXBFeHByKEMsIE5hbWluZ0NsYXNzLCBRdWFsaWZpZXJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBOYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFETCwgT3ZlcmxvYWRlZCwgbnVsbHB0ciwgQmVnaW4sIEVuZCk7CisgIH0KKworICBzdGF0aWMgVW5yZXNvbHZlZExvb2t1cEV4cHIgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhSZWNvcmREZWNsICpOYW1pbmdDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlS1dMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICpBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJlc29sdmVkU2V0SXRlcmF0b3IgQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmVzb2x2ZWRTZXRJdGVyYXRvciBFbmQpOworCisgIHN0YXRpYyBVbnJlc29sdmVkTG9va3VwRXhwciAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc1RlbXBsYXRlS1dBbmRBcmdzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1UZW1wbGF0ZUFyZ3MpOworCisgIC8vLyBUcnVlIGlmIHRoaXMgZGVjbGFyYXRpb24gc2hvdWxkIGJlIGV4dGVuZGVkIGJ5CisgIC8vLyBhcmd1bWVudC1kZXBlbmRlbnQgbG9va3VwLgorICBib29sIHJlcXVpcmVzQURMKCkgY29uc3QgeyByZXR1cm4gUmVxdWlyZXNBREw7IH0KKworICAvLy8gVHJ1ZSBpZiB0aGlzIGxvb2t1cCBpcyBvdmVybG9hZGVkLgorICBib29sIGlzT3ZlcmxvYWRlZCgpIGNvbnN0IHsgcmV0dXJuIE92ZXJsb2FkZWQ7IH0KKworICAvLy8gR2V0cyB0aGUgJ25hbWluZyBjbGFzcycgKGluIHRoZSBzZW5zZSBvZiBDKysweAorICAvLy8gW2NsYXNzLmFjY2Vzcy5iYXNlXXA1KSBvZiB0aGUgbG9va3VwLiAgVGhpcyBpcyB0aGUgc2NvcGUKKyAgLy8vIHRoYXQgd2FzIGxvb2tlZCBpbiB0byBmaW5kIHRoZXNlIHJlc3VsdHMuCisgIENYWFJlY29yZERlY2wgKmdldE5hbWluZ0NsYXNzKCkgY29uc3QgeyByZXR1cm4gTmFtaW5nQ2xhc3M7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIGlmIChOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIGwgPSBnZXRRdWFsaWZpZXJMb2MoKSkKKyAgICAgIHJldHVybiBsLmdldEJlZ2luTG9jKCk7CisgICAgcmV0dXJuIGdldE5hbWVJbmZvKCkuZ2V0TG9jU3RhcnQoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIGlmIChoYXNFeHBsaWNpdFRlbXBsYXRlQXJncygpKQorICAgICAgcmV0dXJuIGdldFJBbmdsZUxvYygpOworICAgIHJldHVybiBnZXROYW1lSW5mbygpLmdldExvY0VuZCgpOworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IFVucmVzb2x2ZWRMb29rdXBFeHByQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQSBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGEgbmFtZSB3aG9zZSBkZWNsYXJhdGlvbiBjYW5ub3QKKy8vLyB5ZXQgYmUgcmVzb2x2ZWQuCisvLy8KKy8vLyBEZXBlbmRlbnRTY29wZURlY2xSZWZFeHByIGlzIHNpbWlsYXIgdG8gRGVjbFJlZkV4cHIgaW4gdGhhdAorLy8vIGl0IGV4cHJlc3NlcyBhIHJlZmVyZW5jZSB0byBhIGRlY2xhcmF0aW9uIHN1Y2ggYXMKKy8vLyBYPFQ+Ojp2YWx1ZS4gVGhlIGRpZmZlcmVuY2UsIGhvd2V2ZXIsIGlzIHRoYXQgYW4KKy8vLyBEZXBlbmRlbnRTY29wZURlY2xSZWZFeHByIG5vZGUgaXMgdXNlZCBvbmx5IHdpdGhpbiBDKysgdGVtcGxhdGVzIHdoZW4KKy8vLyB0aGUgcXVhbGlmaWNhdGlvbiAoZS5nLiwgWDxUPjo6KSByZWZlcnMgdG8gYSBkZXBlbmRlbnQgdHlwZS4gSW4KKy8vLyB0aGlzIGNhc2UsIFg8VD46OnZhbHVlIGNhbm5vdCByZXNvbHZlIHRvIGEgZGVjbGFyYXRpb24gYmVjYXVzZSB0aGUKKy8vLyBkZWNsYXJhdGlvbiB3aWxsIGRpZmZlciBmcm9tIG9uZSBpbnN0YW50aWF0aW9uIG9mIFg8VD4gdG8gdGhlCisvLy8gbmV4dC4gVGhlcmVmb3JlLCBEZXBlbmRlbnRTY29wZURlY2xSZWZFeHByIGtlZXBzIHRyYWNrIG9mIHRoZQorLy8vIHF1YWxpZmllciAoWDxUPjo6KSBhbmQgdGhlIG5hbWUgb2YgdGhlIGVudGl0eSBiZWluZyByZWZlcmVuY2VkCisvLy8gKCJ2YWx1ZSIpLiBTdWNoIGV4cHJlc3Npb25zIHdpbGwgaW5zdGFudGlhdGUgdG8gYSBEZWNsUmVmRXhwciBvbmNlIHRoZQorLy8vIGRlY2xhcmF0aW9uIGNhbiBiZSBmb3VuZC4KK2NsYXNzIERlcGVuZGVudFNjb3BlRGVjbFJlZkV4cHIgZmluYWwKKyAgICA6IHB1YmxpYyBFeHByLAorICAgICAgcHJpdmF0ZSBsbHZtOjpUcmFpbGluZ09iamVjdHM8RGVwZW5kZW50U2NvcGVEZWNsUmVmRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJndW1lbnRMb2M+IHsKKyAgLy8vIFxicmllZiBUaGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHRoYXQgcXVhbGlmaWVzIHRoaXMgdW5yZXNvbHZlZAorICAvLy8gZGVjbGFyYXRpb24gbmFtZS4KKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2M7CisKKyAgLy8vIFxicmllZiBUaGUgbmFtZSBvZiB0aGUgZW50aXR5IHdlIHdpbGwgYmUgcmVmZXJlbmNpbmcuCisgIERlY2xhcmF0aW9uTmFtZUluZm8gTmFtZUluZm87CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoZSBuYW1lIGluY2x1ZGVzIGluZm8gZm9yIGV4cGxpY2l0IHRlbXBsYXRlCisgIC8vLyBrZXl3b3JkIGFuZCBhcmd1bWVudHMuCisgIGJvb2wgSGFzVGVtcGxhdGVLV0FuZEFyZ3NJbmZvOworCisgIERlcGVuZGVudFNjb3BlRGVjbFJlZkV4cHIoUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUtXTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqQXJncyk7CisKKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPEFTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbz4pIGNvbnN0IHsKKyAgICByZXR1cm4gSGFzVGVtcGxhdGVLV0FuZEFyZ3NJbmZvID8gMSA6IDA7CisgIH0KKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRXcml0ZXI7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgc3RhdGljIERlcGVuZGVudFNjb3BlRGVjbFJlZkV4cHIgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgUXVhbGlmaWVyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlS1dMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmTmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gKlRlbXBsYXRlQXJncyk7CisKKyAgc3RhdGljIERlcGVuZGVudFNjb3BlRGVjbFJlZkV4cHIgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc1RlbXBsYXRlS1dBbmRBcmdzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVRlbXBsYXRlQXJncyk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmFtZSB0aGF0IHRoaXMgZXhwcmVzc2lvbiByZWZlcnMgdG8uCisgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJmdldE5hbWVJbmZvKCkgY29uc3QgeyByZXR1cm4gTmFtZUluZm87IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuYW1lIHRoYXQgdGhpcyBleHByZXNzaW9uIHJlZmVycyB0by4KKyAgRGVjbGFyYXRpb25OYW1lIGdldERlY2xOYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZUluZm8uZ2V0TmFtZSgpOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIG5hbWUgd2l0aGluIHRoZSBleHByZXNzaW9uLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlLCBpbiAiWDxUPjo6dmFsdWUiIHRoaXMgaXMgdGhlIGxvY2F0aW9uIG9mICJ2YWx1ZSIuCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gTmFtZUluZm8uZ2V0TG9jKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgdGhhdCBxdWFsaWZpZXMgdGhlCisgIC8vLyBuYW1lLCB3aXRoIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBnZXRRdWFsaWZpZXJMb2MoKSBjb25zdCB7IHJldHVybiBRdWFsaWZpZXJMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgdGhhdCBxdWFsaWZpZXMgdGhpcworICAvLy8gZGVjbGFyYXRpb24uCisgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKmdldFF1YWxpZmllcigpIGNvbnN0IHsKKyAgICByZXR1cm4gUXVhbGlmaWVyTG9jLmdldE5lc3RlZE5hbWVTcGVjaWZpZXIoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBrZXl3b3JkIHByZWNlZGluZworICAvLy8gdGhpcyBuYW1lLCBpZiBhbnkuCisgIFNvdXJjZUxvY2F0aW9uIGdldFRlbXBsYXRlS2V5d29yZExvYygpIGNvbnN0IHsKKyAgICBpZiAoIUhhc1RlbXBsYXRlS1dBbmRBcmdzSW5mbykgcmV0dXJuIFNvdXJjZUxvY2F0aW9uKCk7CisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxBU1RUZW1wbGF0ZUtXQW5kQXJnc0luZm8+KCktPlRlbXBsYXRlS1dMb2M7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGVmdCBhbmdsZSBicmFja2V0IHN0YXJ0aW5nIHRoZQorICAvLy8gZXhwbGljaXQgdGVtcGxhdGUgYXJndW1lbnQgbGlzdCBmb2xsb3dpbmcgdGhlIG5hbWUsIGlmIGFueS4KKyAgU291cmNlTG9jYXRpb24gZ2V0TEFuZ2xlTG9jKCkgY29uc3QgeworICAgIGlmICghSGFzVGVtcGxhdGVLV0FuZEFyZ3NJbmZvKSByZXR1cm4gU291cmNlTG9jYXRpb24oKTsKKyAgICByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPEFTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbz4oKS0+TEFuZ2xlTG9jOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIHJpZ2h0IGFuZ2xlIGJyYWNrZXQgZW5kaW5nIHRoZQorICAvLy8gZXhwbGljaXQgdGVtcGxhdGUgYXJndW1lbnQgbGlzdCBmb2xsb3dpbmcgdGhlIG5hbWUsIGlmIGFueS4KKyAgU291cmNlTG9jYXRpb24gZ2V0UkFuZ2xlTG9jKCkgY29uc3QgeworICAgIGlmICghSGFzVGVtcGxhdGVLV0FuZEFyZ3NJbmZvKSByZXR1cm4gU291cmNlTG9jYXRpb24oKTsKKyAgICByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPEFTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbz4oKS0+UkFuZ2xlTG9jOworICB9CisKKyAgLy8vIERldGVybWluZXMgd2hldGhlciB0aGUgbmFtZSB3YXMgcHJlY2VkZWQgYnkgdGhlIHRlbXBsYXRlIGtleXdvcmQuCisgIGJvb2wgaGFzVGVtcGxhdGVLZXl3b3JkKCkgY29uc3QgeyByZXR1cm4gZ2V0VGVtcGxhdGVLZXl3b3JkTG9jKCkuaXNWYWxpZCgpOyB9CisKKyAgLy8vIERldGVybWluZXMgd2hldGhlciB0aGlzIGxvb2t1cCBoYWQgZXhwbGljaXQgdGVtcGxhdGUgYXJndW1lbnRzLgorICBib29sIGhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzKCkgY29uc3QgeyByZXR1cm4gZ2V0TEFuZ2xlTG9jKCkuaXNWYWxpZCgpOyB9CisKKyAgLy8vIFxicmllZiBDb3BpZXMgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyAoaWYgcHJlc2VudCkgaW50byB0aGUgZ2l2ZW4KKyAgLy8vIHN0cnVjdHVyZS4KKyAgdm9pZCBjb3B5VGVtcGxhdGVBcmd1bWVudHNJbnRvKFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAmTGlzdCkgY29uc3QgeworICAgIGlmIChoYXNFeHBsaWNpdFRlbXBsYXRlQXJncygpKQorICAgICAgZ2V0VHJhaWxpbmdPYmplY3RzPEFTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbz4oKS0+Y29weUludG8oCisgICAgICAgICAgZ2V0VHJhaWxpbmdPYmplY3RzPFRlbXBsYXRlQXJndW1lbnRMb2M+KCksIExpc3QpOworICB9CisKKyAgVGVtcGxhdGVBcmd1bWVudExvYyBjb25zdCAqZ2V0VGVtcGxhdGVBcmdzKCkgY29uc3QgeworICAgIGlmICghaGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3MoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxUZW1wbGF0ZUFyZ3VtZW50TG9jPigpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtVGVtcGxhdGVBcmdzKCkgY29uc3QgeworICAgIGlmICghaGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3MoKSkKKyAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxBU1RUZW1wbGF0ZUtXQW5kQXJnc0luZm8+KCktPk51bVRlbXBsYXRlQXJnczsKKyAgfQorCisgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnRMb2M+IHRlbXBsYXRlX2FyZ3VtZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4ge2dldFRlbXBsYXRlQXJncygpLCBnZXROdW1UZW1wbGF0ZUFyZ3MoKX07CisgIH0KKworICAvLy8gTm90ZTogZ2V0TG9jU3RhcnQoKSBpcyB0aGUgc3RhcnQgb2YgdGhlIHdob2xlIERlcGVuZGVudFNjb3BlRGVjbFJlZkV4cHIsCisgIC8vLyBhbmQgZGlmZmVycyBmcm9tIGdldExvY2F0aW9uKCkuZ2V0U3RhcnQoKS4KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gUXVhbGlmaWVyTG9jLmdldEJlZ2luTG9jKCk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICBpZiAoaGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3MoKSkKKyAgICAgIHJldHVybiBnZXRSQW5nbGVMb2MoKTsKKyAgICByZXR1cm4gZ2V0TG9jYXRpb24oKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBEZXBlbmRlbnRTY29wZURlY2xSZWZFeHByQ2xhc3M7CisgIH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoY2hpbGRfaXRlcmF0b3IoKSwgY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gLS0gZ2VuZXJhbGx5IGEgZnVsbC1leHByZXNzaW9uIC0tIHRoYXQKKy8vLyBpbnRyb2R1Y2VzIGNsZWFudXBzIHRvIGJlIHJ1biBhdCB0aGUgZW5kIG9mIHRoZSBzdWItZXhwcmVzc2lvbidzCisvLy8gZXZhbHVhdGlvbi4gIFRoZSBtb3N0IGNvbW1vbiBzb3VyY2Ugb2YgZXhwcmVzc2lvbi1pbnRyb2R1Y2VkCisvLy8gY2xlYW51cHMgaXMgdGVtcG9yYXJ5IG9iamVjdHMgaW4gQysrLCBidXQgc2V2ZXJhbCBvdGhlciBraW5kcyBvZgorLy8vIGV4cHJlc3Npb25zIGNhbiBjcmVhdGUgY2xlYW51cHMsIGluY2x1ZGluZyBiYXNpY2FsbHkgZXZlcnkKKy8vLyBjYWxsIGluIEFSQyB0aGF0IHJldHVybnMgYW4gT2JqZWN0aXZlLUMgcG9pbnRlci4KKy8vLworLy8vIFRoaXMgZXhwcmVzc2lvbiBhbHNvIHRyYWNrcyB3aGV0aGVyIHRoZSBzdWItZXhwcmVzc2lvbiBjb250YWlucyBhCisvLy8gcG90ZW50aWFsbHktZXZhbHVhdGVkIGJsb2NrIGxpdGVyYWwuICBUaGUgbGlmZXRpbWUgb2YgYSBibG9jaworLy8vIGxpdGVyYWwgaXMgdGhlIGV4dGVudCBvZiB0aGUgZW5jbG9zaW5nIHNjb3BlLgorY2xhc3MgRXhwcldpdGhDbGVhbnVwcyBmaW5hbAorICAgIDogcHVibGljIEV4cHIsCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxFeHByV2l0aENsZWFudXBzLCBCbG9ja0RlY2wgKj4geworcHVibGljOgorICAvLy8gVGhlIHR5cGUgb2Ygb2JqZWN0cyB0aGF0IGFyZSBrZXB0IGluIHRoZSBjbGVhbnVwLgorICAvLy8gSXQncyB1c2VmdWwgdG8gcmVtZW1iZXIgdGhlIHNldCBvZiBibG9ja3M7ICB3ZSBjb3VsZCBhbHNvCisgIC8vLyByZW1lbWJlciB0aGUgc2V0IG9mIHRlbXBvcmFyaWVzLCBidXQgdGhlcmUncyBjdXJyZW50bHkKKyAgLy8vIG5vIG5lZWQuCisgIHVzaW5nIENsZWFudXBPYmplY3QgPSBCbG9ja0RlY2wgKjsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgU3RtdCAqU3ViRXhwcjsKKworICBFeHByV2l0aENsZWFudXBzKEVtcHR5U2hlbGwsIHVuc2lnbmVkIE51bU9iamVjdHMpOworICBFeHByV2l0aENsZWFudXBzKEV4cHIgKlN1YkV4cHIsIGJvb2wgQ2xlYW51cHNIYXZlU2lkZUVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q2xlYW51cE9iamVjdD4gT2JqZWN0cyk7CisKK3B1YmxpYzoKKyAgc3RhdGljIEV4cHJXaXRoQ2xlYW51cHMgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBFbXB0eVNoZWxsIGVtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bU9iamVjdHMpOworCisgIHN0YXRpYyBFeHByV2l0aENsZWFudXBzICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgRXhwciAqc3ViZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENsZWFudXBzSGF2ZVNpZGVFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENsZWFudXBPYmplY3Q+IG9iamVjdHMpOworCisgIEFycmF5UmVmPENsZWFudXBPYmplY3Q+IGdldE9iamVjdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZihnZXRUcmFpbGluZ09iamVjdHM8Q2xlYW51cE9iamVjdD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE51bU9iamVjdHMoKSk7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1PYmplY3RzKCkgY29uc3QgeyByZXR1cm4gRXhwcldpdGhDbGVhbnVwc0JpdHMuTnVtT2JqZWN0czsgfQorCisgIENsZWFudXBPYmplY3QgZ2V0T2JqZWN0KHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IGdldE51bU9iamVjdHMoKSAmJiAiSW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgcmV0dXJuIGdldE9iamVjdHMoKVtpXTsKKyAgfQorCisgIEV4cHIgKmdldFN1YkV4cHIoKSB7IHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHIpOyB9CisgIGNvbnN0IEV4cHIgKmdldFN1YkV4cHIoKSBjb25zdCB7IHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHIpOyB9CisKKyAgYm9vbCBjbGVhbnVwc0hhdmVTaWRlRWZmZWN0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gRXhwcldpdGhDbGVhbnVwc0JpdHMuQ2xlYW51cHNIYXZlU2lkZUVmZmVjdHM7CisgIH0KKworICAvLy8gQXMgd2l0aCBhbnkgbXV0YXRvciBvZiB0aGUgQVNULCBiZSB2ZXJ5IGNhcmVmdWwKKyAgLy8vIHdoZW4gbW9kaWZ5aW5nIGFuIGV4aXN0aW5nIEFTVCB0byBwcmVzZXJ2ZSBpdHMgaW52YXJpYW50cy4KKyAgdm9pZCBzZXRTdWJFeHByKEV4cHIgKkUpIHsgU3ViRXhwciA9IEU7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBTdWJFeHByLT5nZXRMb2NTdGFydCgpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBTdWJFeHByLT5nZXRMb2NFbmQoKTt9CisKKyAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gRXhwcldpdGhDbGVhbnVwc0NsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoJlN1YkV4cHIsICZTdWJFeHByICsgMSk7IH0KK307CisKKy8vLyBcYnJpZWYgRGVzY3JpYmVzIGFuIGV4cGxpY2l0IHR5cGUgY29udmVyc2lvbiB0aGF0IHVzZXMgZnVuY3Rpb25hbAorLy8vIG5vdGlvbiBidXQgY291bGQgbm90IGJlIHJlc29sdmVkIGJlY2F1c2Ugb25lIG9yIG1vcmUgYXJndW1lbnRzIGFyZQorLy8vIHR5cGUtZGVwZW5kZW50LgorLy8vCisvLy8gVGhlIGV4cGxpY2l0IHR5cGUgY29udmVyc2lvbnMgZXhwcmVzc2VkIGJ5CisvLy8gQ1hYVW5yZXNvbHZlZENvbnN0cnVjdEV4cHIgaGF2ZSB0aGUgZm9ybSA8dHQ+VChhMSwgYTIsIC4uLiwgYU4pPC90dD4sCisvLy8gd2hlcmUgXGMgVCBpcyBzb21lIHR5cGUgYW5kIFxjIGExLCBcYyBhMiwgLi4uLCBcYyBhTiBhcmUgdmFsdWVzLCBhbmQKKy8vLyBlaXRoZXIgXGMgVCBpcyBhIGRlcGVuZGVudCB0eXBlIG9yIG9uZSBvciBtb3JlIG9mIHRoZSA8dHQ+YTwvdHQ+J3MgaXMKKy8vLyB0eXBlLWRlcGVuZGVudC4gRm9yIGV4YW1wbGUsIHRoaXMgd291bGQgb2NjdXIgaW4gYSB0ZW1wbGF0ZSBzdWNoCisvLy8gYXM6CisvLy8KKy8vLyBcY29kZQorLy8vICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQTE+CisvLy8gICBpbmxpbmUgVCBtYWtlX2EoY29uc3QgQTEmIGExKSB7CisvLy8gICAgIHJldHVybiBUKGExKTsKKy8vLyAgIH0KKy8vLyBcZW5kY29kZQorLy8vCisvLy8gV2hlbiB0aGUgcmV0dXJuZWQgZXhwcmVzc2lvbiBpcyBpbnN0YW50aWF0ZWQsIGl0IG1heSByZXNvbHZlIHRvIGEKKy8vLyBjb25zdHJ1Y3RvciBjYWxsLCBjb252ZXJzaW9uIGZ1bmN0aW9uIGNhbGwsIG9yIHNvbWUga2luZCBvZiB0eXBlCisvLy8gY29udmVyc2lvbi4KK2NsYXNzIENYWFVucmVzb2x2ZWRDb25zdHJ1Y3RFeHByIGZpbmFsCisgICAgOiBwdWJsaWMgRXhwciwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPENYWFVucmVzb2x2ZWRDb25zdHJ1Y3RFeHByLCBFeHByICo+IHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgLy8vIFxicmllZiBUaGUgdHlwZSBiZWluZyBjb25zdHJ1Y3RlZC4KKyAgVHlwZVNvdXJjZUluZm8gKlR5cGUgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSBsZWZ0IHBhcmVudGhlc2VzICgnKCcpLgorICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2M7CisKKyAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIHJpZ2h0IHBhcmVudGhlc2VzICgnKScpLgorICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2M7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgdHlwZS4KKyAgdW5zaWduZWQgTnVtQXJnczsKKworICBDWFhVbnJlc29sdmVkQ29uc3RydWN0RXhwcihUeXBlU291cmNlSW5mbyAqVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKTsKKworICBDWFhVbnJlc29sdmVkQ29uc3RydWN0RXhwcihFbXB0eVNoZWxsIEVtcHR5LCB1bnNpZ25lZCBOdW1BcmdzKQorICAgICAgOiBFeHByKENYWFVucmVzb2x2ZWRDb25zdHJ1Y3RFeHByQ2xhc3MsIEVtcHR5KSwgTnVtQXJncyhOdW1BcmdzKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBDWFhVbnJlc29sdmVkQ29uc3RydWN0RXhwciAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MpOworCisgIHN0YXRpYyBDWFhVbnJlc29sdmVkQ29uc3RydWN0RXhwciAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1BcmdzKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0eXBlIHRoYXQgaXMgYmVpbmcgY29uc3RydWN0ZWQsIGFzIHNwZWNpZmllZAorICAvLy8gaW4gdGhlIHNvdXJjZSBjb2RlLgorICBRdWFsVHlwZSBnZXRUeXBlQXNXcml0dGVuKCkgY29uc3QgeyByZXR1cm4gVHlwZS0+Z2V0VHlwZSgpOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdHlwZSBzb3VyY2UgaW5mb3JtYXRpb24gZm9yIHRoZSB0eXBlIGJlaW5nCisgIC8vLyBjb25zdHJ1Y3RlZC4KKyAgVHlwZVNvdXJjZUluZm8gKmdldFR5cGVTb3VyY2VJbmZvKCkgY29uc3QgeyByZXR1cm4gVHlwZTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBsZWZ0IHBhcmVudGhlc2VzICgnKCcpIHRoYXQKKyAgLy8vIHByZWNlZGVzIHRoZSBhcmd1bWVudCBsaXN0LgorICBTb3VyY2VMb2NhdGlvbiBnZXRMUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBMUGFyZW5Mb2M7IH0KKyAgdm9pZCBzZXRMUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTCkgeyBMUGFyZW5Mb2MgPSBMOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIHJpZ2h0IHBhcmVudGhlc2VzICgnKScpIHRoYXQKKyAgLy8vIGZvbGxvd3MgdGhlIGFyZ3VtZW50IGxpc3QuCisgIFNvdXJjZUxvY2F0aW9uIGdldFJQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIFJQYXJlbkxvYzsgfQorICB2b2lkIHNldFJQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IFJQYXJlbkxvYyA9IEw7IH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBleHByZXNzaW9uIG1vZGVscyBsaXN0LWluaXRpYWxpemF0aW9uLgorICAvLy8gSWYgc28sIHRoZXJlIHdpbGwgYmUgZXhhY3RseSBvbmUgc3ViZXhwcmVzc2lvbiwgd2hpY2ggd2lsbCBiZQorICAvLy8gYW4gSW5pdExpc3RFeHByLgorICBib29sIGlzTGlzdEluaXRpYWxpemF0aW9uKCkgY29uc3QgeyByZXR1cm4gTFBhcmVuTG9jLmlzSW52YWxpZCgpOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgdW5zaWduZWQgYXJnX3NpemUoKSBjb25zdCB7IHJldHVybiBOdW1BcmdzOyB9CisKKyAgdXNpbmcgYXJnX2l0ZXJhdG9yID0gRXhwciAqKjsKKworICBhcmdfaXRlcmF0b3IgYXJnX2JlZ2luKCkgeyByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPEV4cHIgKj4oKTsgfQorICBhcmdfaXRlcmF0b3IgYXJnX2VuZCgpIHsgcmV0dXJuIGFyZ19iZWdpbigpICsgTnVtQXJnczsgfQorCisgIHVzaW5nIGNvbnN0X2FyZ19pdGVyYXRvciA9IGNvbnN0IEV4cHIqIGNvbnN0ICo7CisKKyAgY29uc3RfYXJnX2l0ZXJhdG9yIGFyZ19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxFeHByICo+KCk7IH0KKyAgY29uc3RfYXJnX2l0ZXJhdG9yIGFyZ19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGFyZ19iZWdpbigpICsgTnVtQXJnczsKKyAgfQorCisgIEV4cHIgKmdldEFyZyh1bnNpZ25lZCBJKSB7CisgICAgYXNzZXJ0KEkgPCBOdW1BcmdzICYmICJBcmd1bWVudCBpbmRleCBvdXQtb2YtcmFuZ2UiKTsKKyAgICByZXR1cm4gKihhcmdfYmVnaW4oKSArIEkpOworICB9CisKKyAgY29uc3QgRXhwciAqZ2V0QXJnKHVuc2lnbmVkIEkpIGNvbnN0IHsKKyAgICBhc3NlcnQoSSA8IE51bUFyZ3MgJiYgIkFyZ3VtZW50IGluZGV4IG91dC1vZi1yYW5nZSIpOworICAgIHJldHVybiAqKGFyZ19iZWdpbigpICsgSSk7CisgIH0KKworICB2b2lkIHNldEFyZyh1bnNpZ25lZCBJLCBFeHByICpFKSB7CisgICAgYXNzZXJ0KEkgPCBOdW1BcmdzICYmICJBcmd1bWVudCBpbmRleCBvdXQtb2YtcmFuZ2UiKTsKKyAgICAqKGFyZ19iZWdpbigpICsgSSkgPSBFOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIGlmICghUlBhcmVuTG9jLmlzVmFsaWQoKSAmJiBOdW1BcmdzID4gMCkKKyAgICAgIHJldHVybiBnZXRBcmcoTnVtQXJncyAtIDEpLT5nZXRMb2NFbmQoKTsKKyAgICByZXR1cm4gUlBhcmVuTG9jOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IENYWFVucmVzb2x2ZWRDb25zdHJ1Y3RFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgU3RtdCAqKmJlZ2luID0gcmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPihhcmdfYmVnaW4oKSk7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGJlZ2luLCBiZWdpbiArIE51bUFyZ3MpOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBDKysgbWVtYmVyIGFjY2VzcyBleHByZXNzaW9uIHdoZXJlIHRoZSBhY3R1YWwKKy8vLyBtZW1iZXIgcmVmZXJlbmNlZCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB0aGUgYmFzZQorLy8vIGV4cHJlc3Npb24gb3IgdGhlIG1lbWJlciBuYW1lIHdhcyBkZXBlbmRlbnQuCisvLy8KKy8vLyBMaWtlIFVucmVzb2x2ZWRNZW1iZXJFeHBycywgdGhlc2UgY2FuIGJlIGVpdGhlciBpbXBsaWNpdCBvcgorLy8vIGV4cGxpY2l0IGFjY2Vzc2VzLiAgSXQgaXMgb25seSBwb3NzaWJsZSB0byBnZXQgb25lIG9mIHRoZXNlIHdpdGgKKy8vLyBhbiBpbXBsaWNpdCBhY2Nlc3MgaWYgYSBxdWFsaWZpZXIgaXMgcHJvdmlkZWQuCitjbGFzcyBDWFhEZXBlbmRlbnRTY29wZU1lbWJlckV4cHIgZmluYWwKKyAgICA6IHB1YmxpYyBFeHByLAorICAgICAgcHJpdmF0ZSBsbHZtOjpUcmFpbGluZ09iamVjdHM8Q1hYRGVwZW5kZW50U2NvcGVNZW1iZXJFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUVGVtcGxhdGVLV0FuZEFyZ3NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVBcmd1bWVudExvYz4geworICAvLy8gXGJyaWVmIFRoZSBleHByZXNzaW9uIGZvciB0aGUgYmFzZSBwb2ludGVyIG9yIGNsYXNzIHJlZmVyZW5jZSwKKyAgLy8vIGUuZy4sIHRoZSBcYyB4IGluIHguZi4gIENhbiBiZSBudWxsIGluIGltcGxpY2l0IGFjY2Vzc2VzLgorICBTdG10ICpCYXNlOworCisgIC8vLyBcYnJpZWYgVGhlIHR5cGUgb2YgdGhlIGJhc2UgZXhwcmVzc2lvbi4gIE5ldmVyIG51bGwsIGV2ZW4gZm9yCisgIC8vLyBpbXBsaWNpdCBhY2Nlc3Nlcy4KKyAgUXVhbFR5cGUgQmFzZVR5cGU7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgbWVtYmVyIGV4cHJlc3Npb24gdXNlZCB0aGUgJy0+JyBvcGVyYXRvciBvcgorICAvLy8gdGhlICcuJyBvcGVyYXRvci4KKyAgYm9vbCBJc0Fycm93IDogMTsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBtZW1iZXIgZXhwcmVzc2lvbiBoYXMgaW5mbyBmb3IgZXhwbGljaXQgdGVtcGxhdGUKKyAgLy8vIGtleXdvcmQgYW5kIGFyZ3VtZW50cy4KKyAgYm9vbCBIYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8gOiAxOworCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSAnLT4nIG9yICcuJyBvcGVyYXRvci4KKyAgU291cmNlTG9jYXRpb24gT3BlcmF0b3JMb2M7CisKKyAgLy8vIFxicmllZiBUaGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHRoYXQgcHJlY2VkZXMgdGhlIG1lbWJlciBuYW1lLCBpZiBhbnkuCisgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgUXVhbGlmaWVyTG9jOworCisgIC8vLyBcYnJpZWYgSW4gYSBxdWFsaWZpZWQgbWVtYmVyIGFjY2VzcyBleHByZXNzaW9uIHN1Y2ggYXMgdC0+QmFzZTo6ZiwgdGhpcworICAvLy8gbWVtYmVyIHN0b3JlcyB0aGUgcmVzb2x2ZXMgb2YgbmFtZSBsb29rdXAgaW4gdGhlIGNvbnRleHQgb2YgdGhlIG1lbWJlcgorICAvLy8gYWNjZXNzIGV4cHJlc3Npb24sIHRvIGJlIHVzZWQgYXQgaW5zdGFudGlhdGlvbiB0aW1lLgorICAvLy8KKyAgLy8vIEZJWE1FOiBUaGlzIG1lbWJlciwgYWxvbmcgd2l0aCB0aGUgUXVhbGlmaWVyTG9jLCBjb3VsZAorICAvLy8gYmUgc3R1Y2sgaW50byBhIHN0cnVjdHVyZSB0aGF0IGlzIG9wdGlvbmFsbHkgYWxsb2NhdGVkIGF0IHRoZSBlbmQgb2YKKyAgLy8vIHRoZSBDWFhEZXBlbmRlbnRTY29wZU1lbWJlckV4cHIsIHRvIHNhdmUgc3BhY2UgaW4gdGhlIGNvbW1vbiBjYXNlLgorICBOYW1lZERlY2wgKkZpcnN0UXVhbGlmaWVyRm91bmRJblNjb3BlOworCisgIC8vLyBcYnJpZWYgVGhlIG1lbWJlciB0byB3aGljaCB0aGlzIG1lbWJlciBleHByZXNzaW9uIHJlZmVycywgd2hpY2gKKyAgLy8vIGNhbiBiZSBuYW1lLCBvdmVybG9hZGVkIG9wZXJhdG9yLCBvciBkZXN0cnVjdG9yLgorICAvLy8KKyAgLy8vIEZJWE1FOiBjb3VsZCBhbHNvIGJlIGEgdGVtcGxhdGUtaWQKKyAgRGVjbGFyYXRpb25OYW1lSW5mbyBNZW1iZXJOYW1lSW5mbzsKKworICBzaXplX3QgbnVtVHJhaWxpbmdPYmplY3RzKE92ZXJsb2FkVG9rZW48QVNUVGVtcGxhdGVLV0FuZEFyZ3NJbmZvPikgY29uc3QgeworICAgIHJldHVybiBIYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8gPyAxIDogMDsKKyAgfQorCisgIENYWERlcGVuZGVudFNjb3BlTWVtYmVyRXhwcihjb25zdCBBU1RDb250ZXh0ICZDLCBFeHByICpCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgQmFzZVR5cGUsIGJvb2wgSXNBcnJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE9wZXJhdG9yTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUtXTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpGaXJzdFF1YWxpZmllckZvdW5kSW5TY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZUluZm8gTWVtYmVyTmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gKlRlbXBsYXRlQXJncyk7CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10V3JpdGVyOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIENYWERlcGVuZGVudFNjb3BlTWVtYmVyRXhwcihjb25zdCBBU1RDb250ZXh0ICZDLCBFeHByICpCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgQmFzZVR5cGUsIGJvb2wgSXNBcnJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE9wZXJhdG9yTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKkZpcnN0UXVhbGlmaWVyRm91bmRJblNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lSW5mbyBNZW1iZXJOYW1lSW5mbyk7CisKKyAgc3RhdGljIENYWERlcGVuZGVudFNjb3BlTWVtYmVyRXhwciAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBFeHByICpCYXNlLCBRdWFsVHlwZSBCYXNlVHlwZSwgYm9vbCBJc0Fycm93LAorICAgICAgICAgU291cmNlTG9jYXRpb24gT3BlcmF0b3JMb2MsIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgUXVhbGlmaWVyTG9jLAorICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYywgTmFtZWREZWNsICpGaXJzdFF1YWxpZmllckZvdW5kSW5TY29wZSwKKyAgICAgICAgIERlY2xhcmF0aW9uTmFtZUluZm8gTWVtYmVyTmFtZUluZm8sCisgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gKlRlbXBsYXRlQXJncyk7CisKKyAgc3RhdGljIENYWERlcGVuZGVudFNjb3BlTWVtYmVyRXhwciAqCisgIENyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIGJvb2wgSGFzVGVtcGxhdGVLV0FuZEFyZ3NJbmZvLAorICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1UZW1wbGF0ZUFyZ3MpOworCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGlzIGlzIGFuIGltcGxpY2l0IGFjY2VzcywgaS5lLiBvbmUgaW4gd2hpY2ggdGhlCisgIC8vLyBtZW1iZXIgYmVpbmcgYWNjZXNzZWQgd2FzIG5vdCB3cml0dGVuIGluIHRoZSBzb3VyY2UuICBUaGUgc291cmNlCisgIC8vLyBsb2NhdGlvbiBvZiB0aGUgb3BlcmF0b3IgaXMgaW52YWxpZCBpbiB0aGlzIGNhc2UuCisgIGJvb2wgaXNJbXBsaWNpdEFjY2VzcygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGJhc2Ugb2JqZWN0IG9mIHRoaXMgbWVtYmVyIGV4cHJlc3Npb25zLAorICAvLy8gZS5nLiwgdGhlIFxjIHggaW4gXGMgeC5tLgorICBFeHByICpnZXRCYXNlKCkgY29uc3QgeworICAgIGFzc2VydCghaXNJbXBsaWNpdEFjY2VzcygpKTsKKyAgICByZXR1cm4gY2FzdDxFeHByPihCYXNlKTsKKyAgfQorCisgIFF1YWxUeXBlIGdldEJhc2VUeXBlKCkgY29uc3QgeyByZXR1cm4gQmFzZVR5cGU7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgbWVtYmVyIGV4cHJlc3Npb24gdXNlZCB0aGUgJy0+JworICAvLy8gb3BlcmF0b3I7IG90aGVyd2lzZSwgaXQgdXNlZCB0aGUgJy4nIG9wZXJhdG9yLgorICBib29sIGlzQXJyb3coKSBjb25zdCB7IHJldHVybiBJc0Fycm93OyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlICctPicgb3IgJy4nIG9wZXJhdG9yLgorICBTb3VyY2VMb2NhdGlvbiBnZXRPcGVyYXRvckxvYygpIGNvbnN0IHsgcmV0dXJuIE9wZXJhdG9yTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHRoYXQgcXVhbGlmaWVzIHRoZSBtZW1iZXIKKyAgLy8vIG5hbWUuCisgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKmdldFF1YWxpZmllcigpIGNvbnN0IHsKKyAgICByZXR1cm4gUXVhbGlmaWVyTG9jLmdldE5lc3RlZE5hbWVTcGVjaWZpZXIoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciB0aGF0IHF1YWxpZmllcyB0aGUgbWVtYmVyCisgIC8vLyBuYW1lLCB3aXRoIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBnZXRRdWFsaWZpZXJMb2MoKSBjb25zdCB7IHJldHVybiBRdWFsaWZpZXJMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgdGhhdCB3YXMKKyAgLy8vIGZvdW5kIGluIHRoZSBzY29wZSBvZiB0aGUgbWVtYmVyIGFjY2VzcyBleHByZXNzaW9uIHdoZW4gdGhlIG1lbWJlciBhY2Nlc3MKKyAgLy8vIHdhcyBpbml0aWFsbHkgcGFyc2VkLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gb25seSByZXR1cm5zIGEgdXNlZnVsIHJlc3VsdCB3aGVuIG1lbWJlciBhY2Nlc3MgZXhwcmVzc2lvbgorICAvLy8gdXNlcyBhIHF1YWxpZmllZCBtZW1iZXIgbmFtZSwgZS5nLiwgInguQmFzZTo6ZiIuIEhlcmUsIHRoZSBkZWNsYXJhdGlvbgorICAvLy8gcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBkZXNjcmliZXMgd2hhdCB3YXMgZm91bmQgYnkgdW5xdWFsaWZpZWQgbmFtZQorICAvLy8gbG9va3VwIGZvciB0aGUgaWRlbnRpZmllciAiQmFzZSIgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgbWVtYmVyIGFjY2VzcworICAvLy8gZXhwcmVzc2lvbiBpdHNlbGYuIEF0IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gdGltZSwgdGhpcyBpbmZvcm1hdGlvbiBpcworICAvLy8gY29tYmluZWQgd2l0aCB0aGUgcmVzdWx0cyBvZiBuYW1lIGxvb2t1cCBpbnRvIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QKKyAgLy8vIGV4cHJlc3Npb24gaXRzZWxmICh0aGUgY2xhc3MgdHlwZSBvZiB4KS4KKyAgTmFtZWREZWNsICpnZXRGaXJzdFF1YWxpZmllckZvdW5kSW5TY29wZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRmlyc3RRdWFsaWZpZXJGb3VuZEluU2NvcGU7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgdGhhdCB0aGlzIGV4cHJlc3Npb24KKyAgLy8vIHJlZmVycyB0by4KKyAgY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmZ2V0TWVtYmVyTmFtZUluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIE1lbWJlck5hbWVJbmZvOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgbWVtYmVyIHRoYXQgdGhpcyBleHByZXNzaW9uCisgIC8vLyByZWZlcnMgdG8uCisgIERlY2xhcmF0aW9uTmFtZSBnZXRNZW1iZXIoKSBjb25zdCB7IHJldHVybiBNZW1iZXJOYW1lSW5mby5nZXROYW1lKCk7IH0KKworICAvLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgdGhhdCB0aGlzCisgIC8vIGV4cHJlc3Npb24gcmVmZXJzIHRvLgorICBTb3VyY2VMb2NhdGlvbiBnZXRNZW1iZXJMb2MoKSBjb25zdCB7IHJldHVybiBNZW1iZXJOYW1lSW5mby5nZXRMb2MoKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBrZXl3b3JkIHByZWNlZGluZyB0aGUKKyAgLy8vIG1lbWJlciBuYW1lLCBpZiBhbnkuCisgIFNvdXJjZUxvY2F0aW9uIGdldFRlbXBsYXRlS2V5d29yZExvYygpIGNvbnN0IHsKKyAgICBpZiAoIUhhc1RlbXBsYXRlS1dBbmRBcmdzSW5mbykgcmV0dXJuIFNvdXJjZUxvY2F0aW9uKCk7CisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxBU1RUZW1wbGF0ZUtXQW5kQXJnc0luZm8+KCktPlRlbXBsYXRlS1dMb2M7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGVmdCBhbmdsZSBicmFja2V0IHN0YXJ0aW5nIHRoZQorICAvLy8gZXhwbGljaXQgdGVtcGxhdGUgYXJndW1lbnQgbGlzdCBmb2xsb3dpbmcgdGhlIG1lbWJlciBuYW1lLCBpZiBhbnkuCisgIFNvdXJjZUxvY2F0aW9uIGdldExBbmdsZUxvYygpIGNvbnN0IHsKKyAgICBpZiAoIUhhc1RlbXBsYXRlS1dBbmRBcmdzSW5mbykgcmV0dXJuIFNvdXJjZUxvY2F0aW9uKCk7CisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxBU1RUZW1wbGF0ZUtXQW5kQXJnc0luZm8+KCktPkxBbmdsZUxvYzsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSByaWdodCBhbmdsZSBicmFja2V0IGVuZGluZyB0aGUKKyAgLy8vIGV4cGxpY2l0IHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QgZm9sbG93aW5nIHRoZSBtZW1iZXIgbmFtZSwgaWYgYW55LgorICBTb3VyY2VMb2NhdGlvbiBnZXRSQW5nbGVMb2MoKSBjb25zdCB7CisgICAgaWYgKCFIYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8pIHJldHVybiBTb3VyY2VMb2NhdGlvbigpOworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8QVNUVGVtcGxhdGVLV0FuZEFyZ3NJbmZvPigpLT5SQW5nbGVMb2M7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBtZW1iZXIgbmFtZSB3YXMgcHJlY2VkZWQgYnkgdGhlIHRlbXBsYXRlIGtleXdvcmQuCisgIGJvb2wgaGFzVGVtcGxhdGVLZXl3b3JkKCkgY29uc3QgeyByZXR1cm4gZ2V0VGVtcGxhdGVLZXl3b3JkTG9jKCkuaXNWYWxpZCgpOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBtZW1iZXIgZXhwcmVzc2lvbiBhY3R1YWxseSBoYWQgYSBDKysKKyAgLy8vIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QgZXhwbGljaXRseSBzcGVjaWZpZWQsIGUuZy4sIHguZjxpbnQ+LgorICBib29sIGhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzKCkgY29uc3QgeyByZXR1cm4gZ2V0TEFuZ2xlTG9jKCkuaXNWYWxpZCgpOyB9CisKKyAgLy8vIFxicmllZiBDb3BpZXMgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyAoaWYgcHJlc2VudCkgaW50byB0aGUgZ2l2ZW4KKyAgLy8vIHN0cnVjdHVyZS4KKyAgdm9pZCBjb3B5VGVtcGxhdGVBcmd1bWVudHNJbnRvKFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAmTGlzdCkgY29uc3QgeworICAgIGlmIChoYXNFeHBsaWNpdFRlbXBsYXRlQXJncygpKQorICAgICAgZ2V0VHJhaWxpbmdPYmplY3RzPEFTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbz4oKS0+Y29weUludG8oCisgICAgICAgICAgZ2V0VHJhaWxpbmdPYmplY3RzPFRlbXBsYXRlQXJndW1lbnRMb2M+KCksIExpc3QpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIHByb3ZpZGVkIGFzIHBhcnQgb2YgdGhpcworICAvLy8gdGVtcGxhdGUtaWQuCisgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMb2MgKmdldFRlbXBsYXRlQXJncygpIGNvbnN0IHsKKyAgICBpZiAoIWhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8VGVtcGxhdGVBcmd1bWVudExvYz4oKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMgcHJvdmlkZWQgYXMgcGFydCBvZiB0aGlzCisgIC8vLyB0ZW1wbGF0ZS1pZC4KKyAgdW5zaWduZWQgZ2V0TnVtVGVtcGxhdGVBcmdzKCkgY29uc3QgeworICAgIGlmICghaGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3MoKSkKKyAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxBU1RUZW1wbGF0ZUtXQW5kQXJnc0luZm8+KCktPk51bVRlbXBsYXRlQXJnczsKKyAgfQorCisgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnRMb2M+IHRlbXBsYXRlX2FyZ3VtZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4ge2dldFRlbXBsYXRlQXJncygpLCBnZXROdW1UZW1wbGF0ZUFyZ3MoKX07CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIGlmICghaXNJbXBsaWNpdEFjY2VzcygpKQorICAgICAgcmV0dXJuIEJhc2UtPmdldExvY1N0YXJ0KCk7CisgICAgaWYgKGdldFF1YWxpZmllcigpKQorICAgICAgcmV0dXJuIGdldFF1YWxpZmllckxvYygpLmdldEJlZ2luTG9jKCk7CisgICAgcmV0dXJuIE1lbWJlck5hbWVJbmZvLmdldEJlZ2luTG9jKCk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICBpZiAoaGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3MoKSkKKyAgICAgIHJldHVybiBnZXRSQW5nbGVMb2MoKTsKKyAgICByZXR1cm4gTWVtYmVyTmFtZUluZm8uZ2V0RW5kTG9jKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ1hYRGVwZW5kZW50U2NvcGVNZW1iZXJFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgaWYgKGlzSW1wbGljaXRBY2Nlc3MoKSkKKyAgICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoJkJhc2UsICZCYXNlICsgMSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIEMrKyBtZW1iZXIgYWNjZXNzIGV4cHJlc3Npb24gZm9yIHdoaWNoIGxvb2t1cAorLy8vIHByb2R1Y2VkIGEgc2V0IG9mIG92ZXJsb2FkZWQgZnVuY3Rpb25zLgorLy8vCisvLy8gVGhlIG1lbWJlciBhY2Nlc3MgbWF5IGJlIGV4cGxpY2l0IG9yIGltcGxpY2l0OgorLy8vIFxjb2RlCisvLy8gICAgc3RydWN0IEEgeworLy8vICAgICAgaW50IGEsIGI7CisvLy8gICAgICBpbnQgZXhwbGljaXRBY2Nlc3MoKSB7IHJldHVybiB0aGlzLT5hICsgdGhpcy0+QTo6YjsgfQorLy8vICAgICAgaW50IGltcGxpY2l0QWNjZXNzKCkgeyByZXR1cm4gYSArIEE6OmI7IH0KKy8vLyAgICB9OworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBJbiB0aGUgZmluYWwgQVNULCBhbiBleHBsaWNpdCBhY2Nlc3MgYWx3YXlzIGJlY29tZXMgYSBNZW1iZXJFeHByLgorLy8vIEFuIGltcGxpY2l0IGFjY2VzcyBtYXkgYmVjb21lIGVpdGhlciBhIE1lbWJlckV4cHIgb3IgYQorLy8vIERlY2xSZWZFeHByLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbWVtYmVyIGlzIHN0YXRpYy4KK2NsYXNzIFVucmVzb2x2ZWRNZW1iZXJFeHByIGZpbmFsCisgICAgOiBwdWJsaWMgT3ZlcmxvYWRFeHByLAorICAgICAgcHJpdmF0ZSBsbHZtOjpUcmFpbGluZ09iamVjdHM8CisgICAgICAgICAgVW5yZXNvbHZlZE1lbWJlckV4cHIsIEFTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbywgVGVtcGxhdGVBcmd1bWVudExvYz4geworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIE92ZXJsb2FkRXhwcjsKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBtZW1iZXIgZXhwcmVzc2lvbiB1c2VkIHRoZSAnLT4nIG9wZXJhdG9yIG9yCisgIC8vLyB0aGUgJy4nIG9wZXJhdG9yLgorICBib29sIElzQXJyb3cgOiAxOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgbG9va3VwIHJlc3VsdHMgY29udGFpbiBhbiB1bnJlc29sdmVkIHVzaW5nCisgIC8vLyBkZWNsYXJhdGlvbi4KKyAgYm9vbCBIYXNVbnJlc29sdmVkVXNpbmcgOiAxOworCisgIC8vLyBcYnJpZWYgVGhlIGV4cHJlc3Npb24gZm9yIHRoZSBiYXNlIHBvaW50ZXIgb3IgY2xhc3MgcmVmZXJlbmNlLAorICAvLy8gZS5nLiwgdGhlIFxjIHggaW4geC5mLgorICAvLy8KKyAgLy8vIFRoaXMgY2FuIGJlIG51bGwgaWYgdGhpcyBpcyBhbiAndW5iYXNlZCcgbWVtYmVyIGV4cHJlc3Npb24uCisgIFN0bXQgKkJhc2UgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIHR5cGUgb2YgdGhlIGJhc2UgZXhwcmVzc2lvbjsgbmV2ZXIgbnVsbC4KKyAgUXVhbFR5cGUgQmFzZVR5cGU7CisKKyAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlICctPicgb3IgJy4nIG9wZXJhdG9yLgorICBTb3VyY2VMb2NhdGlvbiBPcGVyYXRvckxvYzsKKworICBVbnJlc29sdmVkTWVtYmVyRXhwcihjb25zdCBBU1RDb250ZXh0ICZDLCBib29sIEhhc1VucmVzb2x2ZWRVc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqQmFzZSwgUXVhbFR5cGUgQmFzZVR5cGUsIGJvb2wgSXNBcnJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gT3BlcmF0b3JMb2MsCisgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgUXVhbGlmaWVyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUtXTG9jLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZNZW1iZXJOYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICpUZW1wbGF0ZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIFVucmVzb2x2ZWRTZXRJdGVyYXRvciBCZWdpbiwgVW5yZXNvbHZlZFNldEl0ZXJhdG9yIEVuZCk7CisKKyAgVW5yZXNvbHZlZE1lbWJlckV4cHIoRW1wdHlTaGVsbCBFbXB0eSkKKyAgICAgIDogT3ZlcmxvYWRFeHByKFVucmVzb2x2ZWRNZW1iZXJFeHByQ2xhc3MsIEVtcHR5KSwgSXNBcnJvdyhmYWxzZSksCisgICAgICAgIEhhc1VucmVzb2x2ZWRVc2luZyhmYWxzZSkge30KKworICBzaXplX3QgbnVtVHJhaWxpbmdPYmplY3RzKE92ZXJsb2FkVG9rZW48QVNUVGVtcGxhdGVLV0FuZEFyZ3NJbmZvPikgY29uc3QgeworICAgIHJldHVybiBIYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8gPyAxIDogMDsKKyAgfQorCitwdWJsaWM6CisgIHN0YXRpYyBVbnJlc29sdmVkTWVtYmVyRXhwciAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBib29sIEhhc1VucmVzb2x2ZWRVc2luZywKKyAgICAgICAgIEV4cHIgKkJhc2UsIFF1YWxUeXBlIEJhc2VUeXBlLCBib29sIElzQXJyb3csCisgICAgICAgICBTb3VyY2VMb2NhdGlvbiBPcGVyYXRvckxvYywKKyAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgUXVhbGlmaWVyTG9jLAorICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYywKKyAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk1lbWJlck5hbWVJbmZvLAorICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICpUZW1wbGF0ZUFyZ3MsCisgICAgICAgICBVbnJlc29sdmVkU2V0SXRlcmF0b3IgQmVnaW4sIFVucmVzb2x2ZWRTZXRJdGVyYXRvciBFbmQpOworCisgIHN0YXRpYyBVbnJlc29sdmVkTWVtYmVyRXhwciAqCisgIENyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIGJvb2wgSGFzVGVtcGxhdGVLV0FuZEFyZ3NJbmZvLAorICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1UZW1wbGF0ZUFyZ3MpOworCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGlzIGlzIGFuIGltcGxpY2l0IGFjY2VzcywgaS5lLiwgb25lIGluIHdoaWNoIHRoZQorICAvLy8gbWVtYmVyIGJlaW5nIGFjY2Vzc2VkIHdhcyBub3Qgd3JpdHRlbiBpbiB0aGUgc291cmNlLgorICAvLy8KKyAgLy8vIFRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIG9wZXJhdG9yIGlzIGludmFsaWQgaW4gdGhpcyBjYXNlLgorICBib29sIGlzSW1wbGljaXRBY2Nlc3MoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBiYXNlIG9iamVjdCBvZiB0aGlzIG1lbWJlciBleHByZXNzaW9ucywKKyAgLy8vIGUuZy4sIHRoZSBcYyB4IGluIFxjIHgubS4KKyAgRXhwciAqZ2V0QmFzZSgpIHsKKyAgICBhc3NlcnQoIWlzSW1wbGljaXRBY2Nlc3MoKSk7CisgICAgcmV0dXJuIGNhc3Q8RXhwcj4oQmFzZSk7CisgIH0KKyAgY29uc3QgRXhwciAqZ2V0QmFzZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzSW1wbGljaXRBY2Nlc3MoKSk7CisgICAgcmV0dXJuIGNhc3Q8RXhwcj4oQmFzZSk7CisgIH0KKworICBRdWFsVHlwZSBnZXRCYXNlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIEJhc2VUeXBlOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgbG9va3VwIHJlc3VsdHMgY29udGFpbiBhbiB1bnJlc29sdmVkIHVzaW5nCisgIC8vLyBkZWNsYXJhdGlvbi4KKyAgYm9vbCBoYXNVbnJlc29sdmVkVXNpbmcoKSBjb25zdCB7IHJldHVybiBIYXNVbnJlc29sdmVkVXNpbmc7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgbWVtYmVyIGV4cHJlc3Npb24gdXNlZCB0aGUgJy0+JworICAvLy8gb3BlcmF0b3I7IG90aGVyd2lzZSwgaXQgdXNlZCB0aGUgJy4nIG9wZXJhdG9yLgorICBib29sIGlzQXJyb3coKSBjb25zdCB7IHJldHVybiBJc0Fycm93OyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlICctPicgb3IgJy4nIG9wZXJhdG9yLgorICBTb3VyY2VMb2NhdGlvbiBnZXRPcGVyYXRvckxvYygpIGNvbnN0IHsgcmV0dXJuIE9wZXJhdG9yTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmFtaW5nIGNsYXNzIG9mIHRoaXMgbG9va3VwLgorICBDWFhSZWNvcmREZWNsICpnZXROYW1pbmdDbGFzcygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGZ1bGwgbmFtZSBpbmZvIGZvciB0aGUgbWVtYmVyIHRoYXQgdGhpcyBleHByZXNzaW9uCisgIC8vLyByZWZlcnMgdG8uCisgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJmdldE1lbWJlck5hbWVJbmZvKCkgY29uc3QgeyByZXR1cm4gZ2V0TmFtZUluZm8oKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIG1lbWJlciB0aGF0IHRoaXMgZXhwcmVzc2lvbgorICAvLy8gcmVmZXJzIHRvLgorICBEZWNsYXJhdGlvbk5hbWUgZ2V0TWVtYmVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldE5hbWUoKTsgfQorCisgIC8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIG5hbWUgb2YgdGhlIG1lbWJlciB0aGF0IHRoaXMKKyAgLy8gZXhwcmVzc2lvbiByZWZlcnMgdG8uCisgIFNvdXJjZUxvY2F0aW9uIGdldE1lbWJlckxvYygpIGNvbnN0IHsgcmV0dXJuIGdldE5hbWVMb2MoKTsgfQorCisgIC8vIFxicmllZiBSZXR1cm4gdGhlIHByZWZlcnJlZCBsb2NhdGlvbiAodGhlIG1lbWJlciBuYW1lKSBmb3IgdGhlIGFycm93IHdoZW4KKyAgLy8gZGlhZ25vc2luZyBhIHByb2JsZW0gd2l0aCB0aGlzIGV4cHJlc3Npb24uCisgIFNvdXJjZUxvY2F0aW9uIGdldEV4cHJMb2MoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIGdldE1lbWJlckxvYygpOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICBpZiAoIWlzSW1wbGljaXRBY2Nlc3MoKSkKKyAgICAgIHJldHVybiBCYXNlLT5nZXRMb2NTdGFydCgpOworICAgIGlmIChOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIGwgPSBnZXRRdWFsaWZpZXJMb2MoKSkKKyAgICAgIHJldHVybiBsLmdldEJlZ2luTG9jKCk7CisgICAgcmV0dXJuIGdldE1lbWJlck5hbWVJbmZvKCkuZ2V0TG9jU3RhcnQoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIGlmIChoYXNFeHBsaWNpdFRlbXBsYXRlQXJncygpKQorICAgICAgcmV0dXJuIGdldFJBbmdsZUxvYygpOworICAgIHJldHVybiBnZXRNZW1iZXJOYW1lSW5mbygpLmdldExvY0VuZCgpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IFVucmVzb2x2ZWRNZW1iZXJFeHByQ2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgaWYgKGlzSW1wbGljaXRBY2Nlc3MoKSkKKyAgICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoJkJhc2UsICZCYXNlICsgMSk7CisgIH0KK307CisKK2lubGluZSBBU1RUZW1wbGF0ZUtXQW5kQXJnc0luZm8gKgorT3ZlcmxvYWRFeHByOjpnZXRUcmFpbGluZ0FTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbygpIHsKKyAgaWYgKCFIYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8pCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgaWYgKGlzYTxVbnJlc29sdmVkTG9va3VwRXhwcj4odGhpcykpCisgICAgcmV0dXJuIGNhc3Q8VW5yZXNvbHZlZExvb2t1cEV4cHI+KHRoaXMpCisgICAgICAgIC0+Z2V0VHJhaWxpbmdPYmplY3RzPEFTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbz4oKTsKKyAgZWxzZQorICAgIHJldHVybiBjYXN0PFVucmVzb2x2ZWRNZW1iZXJFeHByPih0aGlzKQorICAgICAgICAtPmdldFRyYWlsaW5nT2JqZWN0czxBU1RUZW1wbGF0ZUtXQW5kQXJnc0luZm8+KCk7Cit9CisKK2lubGluZSBUZW1wbGF0ZUFyZ3VtZW50TG9jICpPdmVybG9hZEV4cHI6OmdldFRyYWlsaW5nVGVtcGxhdGVBcmd1bWVudExvYygpIHsKKyAgaWYgKGlzYTxVbnJlc29sdmVkTG9va3VwRXhwcj4odGhpcykpCisgICAgcmV0dXJuIGNhc3Q8VW5yZXNvbHZlZExvb2t1cEV4cHI+KHRoaXMpCisgICAgICAgIC0+Z2V0VHJhaWxpbmdPYmplY3RzPFRlbXBsYXRlQXJndW1lbnRMb2M+KCk7CisgIGVsc2UKKyAgICByZXR1cm4gY2FzdDxVbnJlc29sdmVkTWVtYmVyRXhwcj4odGhpcykKKyAgICAgICAgLT5nZXRUcmFpbGluZ09iamVjdHM8VGVtcGxhdGVBcmd1bWVudExvYz4oKTsKK30KKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgQysrMTEgbm9leGNlcHQgZXhwcmVzc2lvbiAoQysrIFtleHByLnVuYXJ5Lm5vZXhjZXB0XSkuCisvLy8KKy8vLyBUaGUgbm9leGNlcHQgZXhwcmVzc2lvbiB0ZXN0cyB3aGV0aGVyIGEgZ2l2ZW4gZXhwcmVzc2lvbiBtaWdodCB0aHJvdy4gSXRzCisvLy8gcmVzdWx0IGlzIGEgYm9vbGVhbiBjb25zdGFudC4KK2NsYXNzIENYWE5vZXhjZXB0RXhwciA6IHB1YmxpYyBFeHByIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisKKyAgYm9vbCBWYWx1ZSA6IDE7CisgIFN0bXQgKk9wZXJhbmQ7CisgIFNvdXJjZVJhbmdlIFJhbmdlOworCitwdWJsaWM6CisgIENYWE5vZXhjZXB0RXhwcihRdWFsVHlwZSBUeSwgRXhwciAqT3BlcmFuZCwgQ2FuVGhyb3dSZXN1bHQgVmFsLAorICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gS2V5d29yZCwgU291cmNlTG9jYXRpb24gUlBhcmVuKQorICAgICAgOiBFeHByKENYWE5vZXhjZXB0RXhwckNsYXNzLCBUeSwgVktfUlZhbHVlLCBPS19PcmRpbmFyeSwKKyAgICAgICAgICAgICAvKlR5cGVEZXBlbmRlbnQqL2ZhbHNlLAorICAgICAgICAgICAgIC8qVmFsdWVEZXBlbmRlbnQqL1ZhbCA9PSBDVF9EZXBlbmRlbnQsCisgICAgICAgICAgICAgVmFsID09IENUX0RlcGVuZGVudCB8fCBPcGVyYW5kLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnQoKSwKKyAgICAgICAgICAgICBPcGVyYW5kLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgICBWYWx1ZShWYWwgPT0gQ1RfQ2Fubm90KSwgT3BlcmFuZChPcGVyYW5kKSwgUmFuZ2UoS2V5d29yZCwgUlBhcmVuKSB7fQorCisgIENYWE5vZXhjZXB0RXhwcihFbXB0eVNoZWxsIEVtcHR5KSA6IEV4cHIoQ1hYTm9leGNlcHRFeHByQ2xhc3MsIEVtcHR5KSB7fQorCisgIEV4cHIgKmdldE9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxFeHByKj4oT3BlcmFuZCk7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUmFuZ2UuZ2V0QmVnaW4oKTsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJhbmdlLmdldEVuZCgpOyB9CisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSYW5nZTsgfQorCisgIGJvb2wgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBDWFhOb2V4Y2VwdEV4cHJDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsgcmV0dXJuIGNoaWxkX3JhbmdlKCZPcGVyYW5kLCAmT3BlcmFuZCArIDEpOyB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBDKysxMSBwYWNrIGV4cGFuc2lvbiB0aGF0IHByb2R1Y2VzIGEgc2VxdWVuY2Ugb2YKKy8vLyBleHByZXNzaW9ucy4KKy8vLworLy8vIEEgcGFjayBleHBhbnNpb24gZXhwcmVzc2lvbiBjb250YWlucyBhIHBhdHRlcm4gKHdoaWNoIGl0c2VsZiBpcyBhbgorLy8vIGV4cHJlc3Npb24pIGZvbGxvd2VkIGJ5IGFuIGVsbGlwc2lzLiBGb3IgZXhhbXBsZToKKy8vLworLy8vIFxjb2RlCisvLy8gdGVtcGxhdGU8dHlwZW5hbWUgRiwgdHlwZW5hbWUgLi4uVHlwZXM+CisvLy8gdm9pZCBmb3J3YXJkKEYgZiwgVHlwZXMgJiYuLi5hcmdzKSB7CisvLy8gICBmKHN0YXRpY19jYXN0PFR5cGVzJiY+KGFyZ3MpLi4uKTsKKy8vLyB9CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIEhlcmUsIHRoZSBhcmd1bWVudCB0byB0aGUgZnVuY3Rpb24gb2JqZWN0IFxjIGYgaXMgYSBwYWNrIGV4cGFuc2lvbiB3aG9zZQorLy8vIHBhdHRlcm4gaXMgXGMgc3RhdGljX2Nhc3Q8VHlwZXMmJj4oYXJncykuIFdoZW4gdGhlIFxjIGZvcndhcmQgZnVuY3Rpb24KKy8vLyB0ZW1wbGF0ZSBpcyBpbnN0YW50aWF0ZWQsIHRoZSBwYWNrIGV4cGFuc2lvbiB3aWxsIGluc3RhbnRpYXRlIHRvIHplcm8gb3IKKy8vLyBvciBtb3JlIGZ1bmN0aW9uIGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24gb2JqZWN0IFxjIGYuCitjbGFzcyBQYWNrRXhwYW5zaW9uRXhwciA6IHB1YmxpYyBFeHByIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10V3JpdGVyOworCisgIFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jOworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBleHBhbnNpb25zIHRoYXQgd2lsbCBiZSBwcm9kdWNlZCBieSB0aGlzIHBhY2sKKyAgLy8vIGV4cGFuc2lvbiBleHByZXNzaW9uLCBpZiBrbm93bi4KKyAgLy8vCisgIC8vLyBXaGVuIHplcm8sIHRoZSBudW1iZXIgb2YgZXhwYW5zaW9ucyBpcyBub3Qga25vd24uIE90aGVyd2lzZSwgdGhpcyB2YWx1ZQorICAvLy8gaXMgdGhlIG51bWJlciBvZiBleHBhbnNpb25zICsgMS4KKyAgdW5zaWduZWQgTnVtRXhwYW5zaW9uczsKKworICBTdG10ICpQYXR0ZXJuOworCitwdWJsaWM6CisgIFBhY2tFeHBhbnNpb25FeHByKFF1YWxUeXBlIFQsIEV4cHIgKlBhdHRlcm4sIFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jLAorICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDx1bnNpZ25lZD4gTnVtRXhwYW5zaW9ucykKKyAgICAgIDogRXhwcihQYWNrRXhwYW5zaW9uRXhwckNsYXNzLCBULCBQYXR0ZXJuLT5nZXRWYWx1ZUtpbmQoKSwKKyAgICAgICAgICAgICBQYXR0ZXJuLT5nZXRPYmplY3RLaW5kKCksIC8qVHlwZURlcGVuZGVudD0qL3RydWUsCisgICAgICAgICAgICAgLypWYWx1ZURlcGVuZGVudD0qL3RydWUsIC8qSW5zdGFudGlhdGlvbkRlcGVuZGVudD0qL3RydWUsCisgICAgICAgICAgICAgLypDb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrPSovZmFsc2UpLAorICAgICAgICBFbGxpcHNpc0xvYyhFbGxpcHNpc0xvYyksCisgICAgICAgIE51bUV4cGFuc2lvbnMoTnVtRXhwYW5zaW9ucyA/ICpOdW1FeHBhbnNpb25zICsgMSA6IDApLAorICAgICAgICBQYXR0ZXJuKFBhdHRlcm4pIHt9CisKKyAgUGFja0V4cGFuc2lvbkV4cHIoRW1wdHlTaGVsbCBFbXB0eSkgOiBFeHByKFBhY2tFeHBhbnNpb25FeHByQ2xhc3MsIEVtcHR5KSB7fQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHBhdHRlcm4gb2YgdGhlIHBhY2sgZXhwYW5zaW9uLgorICBFeHByICpnZXRQYXR0ZXJuKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxFeHByICo+KFBhdHRlcm4pOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgcGF0dGVybiBvZiB0aGUgcGFjayBleHBhbnNpb24uCisgIGNvbnN0IEV4cHIgKmdldFBhdHRlcm4oKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PEV4cHIgKj4oUGF0dGVybik7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZWxsaXBzaXMgdGhhdCBkZXNjcmliZXMgdGhpcyBwYWNrCisgIC8vLyBleHBhbnNpb24uCisgIFNvdXJjZUxvY2F0aW9uIGdldEVsbGlwc2lzTG9jKCkgY29uc3QgeyByZXR1cm4gRWxsaXBzaXNMb2M7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGV4cGFuc2lvbnMgdGhhdCB3aWxsIGJlIHByb2R1Y2VkIHdoZW4KKyAgLy8vIHRoaXMgcGFjayBleHBhbnNpb24gaXMgaW5zdGFudGlhdGVkLCBpZiBhbHJlYWR5IGtub3duLgorICBPcHRpb25hbDx1bnNpZ25lZD4gZ2V0TnVtRXhwYW5zaW9ucygpIGNvbnN0IHsKKyAgICBpZiAoTnVtRXhwYW5zaW9ucykKKyAgICAgIHJldHVybiBOdW1FeHBhbnNpb25zIC0gMTsKKworICAgIHJldHVybiBOb25lOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gUGF0dGVybi0+Z2V0TG9jU3RhcnQoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gRWxsaXBzaXNMb2M7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gUGFja0V4cGFuc2lvbkV4cHJDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoJlBhdHRlcm4sICZQYXR0ZXJuICsgMSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhbiBleHByZXNzaW9uIHRoYXQgY29tcHV0ZXMgdGhlIGxlbmd0aCBvZiBhIHBhcmFtZXRlcgorLy8vIHBhY2suCisvLy8KKy8vLyBcY29kZQorLy8vIHRlbXBsYXRlPHR5cGVuYW1lIC4uLlR5cGVzPgorLy8vIHN0cnVjdCBjb3VudCB7CisvLy8gICBzdGF0aWMgY29uc3QgdW5zaWduZWQgdmFsdWUgPSBzaXplb2YuLi4oVHlwZXMpOworLy8vIH07CisvLy8gXGVuZGNvZGUKK2NsYXNzIFNpemVPZlBhY2tFeHByIGZpbmFsCisgICAgOiBwdWJsaWMgRXhwciwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPFNpemVPZlBhY2tFeHByLCBUZW1wbGF0ZUFyZ3VtZW50PiB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNUU3RtdFdyaXRlcjsKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKworICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgXGMgc2l6ZW9mIGtleXdvcmQuCisgIFNvdXJjZUxvY2F0aW9uIE9wZXJhdG9yTG9jOworCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgcGFjay4KKyAgU291cmNlTG9jYXRpb24gUGFja0xvYzsKKworICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgY2xvc2luZyBwYXJlbnRoZXNpcy4KKyAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jOworCisgIC8vLyBcYnJpZWYgVGhlIGxlbmd0aCBvZiB0aGUgcGFyYW1ldGVyIHBhY2ssIGlmIGtub3duLgorICAvLy8KKyAgLy8vIFdoZW4gdGhpcyBleHByZXNzaW9uIGlzIG5vdCB2YWx1ZS1kZXBlbmRlbnQsIHRoaXMgaXMgdGhlIGxlbmd0aCBvZgorICAvLy8gdGhlIHBhY2suIFdoZW4gdGhlIGV4cHJlc3Npb24gd2FzIHBhcnNlZCByYXRoZXIgdGhhbiBpbnN0YW50aWF0ZWQKKyAgLy8vIChhbmQgdGh1cyBpcyB2YWx1ZS1kZXBlbmRlbnQpLCB0aGlzIGlzIHplcm8uCisgIC8vLworICAvLy8gQWZ0ZXIgcGFydGlhbCBzdWJzdGl0dXRpb24gaW50byBhIHNpemVvZi4uLihYKSBleHByZXNzaW9uIChmb3IgaW5zdGFuY2UsCisgIC8vLyB3aXRoaW4gYW4gYWxpYXMgdGVtcGxhdGUgb3IgZHVyaW5nIGZ1bmN0aW9uIHRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbiksCisgIC8vLyB3ZSBzdG9yZSBhIHRyYWlsaW5nIGFycmF5IG9mIHBhcnRpYWxseS1zdWJzdGl0dXRlZCBUZW1wbGF0ZUFyZ3VtZW50cywKKyAgLy8vIGFuZCB0aGlzIGlzIHRoZSBsZW5ndGggb2YgdGhhdCBhcnJheS4KKyAgdW5zaWduZWQgTGVuZ3RoOworCisgIC8vLyBcYnJpZWYgVGhlIHBhcmFtZXRlciBwYWNrLgorICBOYW1lZERlY2wgKlBhY2sgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIGV4cHJlc3Npb24gdGhhdCBjb21wdXRlcyB0aGUgbGVuZ3RoIG9mCisgIC8vLyB0aGUgZ2l2ZW4gcGFyYW1ldGVyIHBhY2suCisgIFNpemVPZlBhY2tFeHByKFF1YWxUeXBlIFNpemVUeXBlLCBTb3VyY2VMb2NhdGlvbiBPcGVyYXRvckxvYywgTmFtZWREZWNsICpQYWNrLAorICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQYWNrTG9jLCBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHVuc2lnbmVkPiBMZW5ndGgsIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IFBhcnRpYWxBcmdzKQorICAgICAgOiBFeHByKFNpemVPZlBhY2tFeHByQ2xhc3MsIFNpemVUeXBlLCBWS19SVmFsdWUsIE9LX09yZGluYXJ5LAorICAgICAgICAgICAgIC8qVHlwZURlcGVuZGVudD0qL2ZhbHNlLCAvKlZhbHVlRGVwZW5kZW50PSovIUxlbmd0aCwKKyAgICAgICAgICAgICAvKkluc3RhbnRpYXRpb25EZXBlbmRlbnQ9Ki8hTGVuZ3RoLAorICAgICAgICAgICAgIC8qQ29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaz0qL2ZhbHNlKSwKKyAgICAgICAgT3BlcmF0b3JMb2MoT3BlcmF0b3JMb2MpLCBQYWNrTG9jKFBhY2tMb2MpLCBSUGFyZW5Mb2MoUlBhcmVuTG9jKSwKKyAgICAgICAgTGVuZ3RoKExlbmd0aCA/ICpMZW5ndGggOiBQYXJ0aWFsQXJncy5zaXplKCkpLCBQYWNrKFBhY2spIHsKKyAgICBhc3NlcnQoKCFMZW5ndGggfHwgUGFydGlhbEFyZ3MuZW1wdHkoKSkgJiYKKyAgICAgICAgICAgImhhdmUgcGFydGlhbCBhcmdzIGZvciBub24tZGVwZW5kZW50IHNpemVvZi4uLiBleHByZXNzaW9uIik7CisgICAgVGVtcGxhdGVBcmd1bWVudCAqQXJncyA9IGdldFRyYWlsaW5nT2JqZWN0czxUZW1wbGF0ZUFyZ3VtZW50PigpOworICAgIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KFBhcnRpYWxBcmdzLmJlZ2luKCksIFBhcnRpYWxBcmdzLmVuZCgpLCBBcmdzKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIGVtcHR5IGV4cHJlc3Npb24uCisgIFNpemVPZlBhY2tFeHByKEVtcHR5U2hlbGwgRW1wdHksIHVuc2lnbmVkIE51bVBhcnRpYWxBcmdzKQorICAgICAgOiBFeHByKFNpemVPZlBhY2tFeHByQ2xhc3MsIEVtcHR5KSwgTGVuZ3RoKE51bVBhcnRpYWxBcmdzKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBTaXplT2ZQYWNrRXhwciAqQ3JlYXRlKEFTVENvbnRleHQgJkNvbnRleHQsIFNvdXJjZUxvY2F0aW9uIE9wZXJhdG9yTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKlBhY2ssIFNvdXJjZUxvY2F0aW9uIFBhY2tMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8dW5zaWduZWQ+IExlbmd0aCA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IFBhcnRpYWxBcmdzID0gTm9uZSk7CisgIHN0YXRpYyBTaXplT2ZQYWNrRXhwciAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVBhcnRpYWxBcmdzKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgbG9jYXRpb24gb2YgdGhlICdzaXplb2YnIGtleXdvcmQuCisgIFNvdXJjZUxvY2F0aW9uIGdldE9wZXJhdG9yTG9jKCkgY29uc3QgeyByZXR1cm4gT3BlcmF0b3JMb2M7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgbG9jYXRpb24gb2YgdGhlIHBhcmFtZXRlciBwYWNrLgorICBTb3VyY2VMb2NhdGlvbiBnZXRQYWNrTG9jKCkgY29uc3QgeyByZXR1cm4gUGFja0xvYzsgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmlnaHQgcGFyZW50aGVzaXMuCisgIFNvdXJjZUxvY2F0aW9uIGdldFJQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIFJQYXJlbkxvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHBhcmFtZXRlciBwYWNrLgorICBOYW1lZERlY2wgKmdldFBhY2soKSBjb25zdCB7IHJldHVybiBQYWNrOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbGVuZ3RoIG9mIHRoZSBwYXJhbWV0ZXIgcGFjay4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgbWF5IG9ubHkgYmUgaW52b2tlZCB3aGVuIHRoZSBleHByZXNzaW9uIGlzIG5vdAorICAvLy8gdmFsdWUtZGVwZW5kZW50LgorICB1bnNpZ25lZCBnZXRQYWNrTGVuZ3RoKCkgY29uc3QgeworICAgIGFzc2VydCghaXNWYWx1ZURlcGVuZGVudCgpICYmCisgICAgICAgICAgICJDYW5ub3QgZ2V0IHRoZSBsZW5ndGggb2YgYSB2YWx1ZS1kZXBlbmRlbnQgcGFjayBzaXplIGV4cHJlc3Npb24iKTsKKyAgICByZXR1cm4gTGVuZ3RoOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHktc3Vic3RpdHV0ZWQgc2l6ZW9mLi4uCisgIC8vLyBleHByZXNzaW9uLCBzdWNoIGFzIGlzIHByb2R1Y2VkIGZvcjoKKyAgLy8vCisgIC8vLyAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLlRzPiB1c2luZyBYID0gaW50W3NpemVvZi4uLihUcyldOworICAvLy8gICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5Vcz4gdm9pZCBmKFg8VXMuLi4sIDEsIDIsIDMsIFVzLi4uPik7CisgIGJvb2wgaXNQYXJ0aWFsbHlTdWJzdGl0dXRlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNWYWx1ZURlcGVuZGVudCgpICYmIExlbmd0aDsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0CisgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IGdldFBhcnRpYWxBcmd1bWVudHMoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzUGFydGlhbGx5U3Vic3RpdHV0ZWQoKSk7CisgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudCAqQXJncyA9IGdldFRyYWlsaW5nT2JqZWN0czxUZW1wbGF0ZUFyZ3VtZW50PigpOworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoQXJncywgQXJncyArIExlbmd0aCk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gT3BlcmF0b3JMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gU2l6ZU9mUGFja0V4cHJDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoY2hpbGRfaXRlcmF0b3IoKSwgY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIHJlZmVyZW5jZSB0byBhIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlcgorLy8vIHRoYXQgaGFzIGJlZW4gc3Vic3RpdHV0ZWQgd2l0aCBhIHRlbXBsYXRlIGFyZ3VtZW50LgorY2xhc3MgU3Vic3ROb25UeXBlVGVtcGxhdGVQYXJtRXhwciA6IHB1YmxpYyBFeHByIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisKKyAgLy8vIFxicmllZiBUaGUgcmVwbGFjZWQgcGFyYW1ldGVyLgorICBOb25UeXBlVGVtcGxhdGVQYXJtRGVjbCAqUGFyYW07CisKKyAgLy8vIFxicmllZiBUaGUgcmVwbGFjZW1lbnQgZXhwcmVzc2lvbi4KKyAgU3RtdCAqUmVwbGFjZW1lbnQ7CisKKyAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlciByZWZlcmVuY2UuCisgIFNvdXJjZUxvY2F0aW9uIE5hbWVMb2M7CisKKyAgZXhwbGljaXQgU3Vic3ROb25UeXBlVGVtcGxhdGVQYXJtRXhwcihFbXB0eVNoZWxsIEVtcHR5KQorICAgICAgOiBFeHByKFN1YnN0Tm9uVHlwZVRlbXBsYXRlUGFybUV4cHJDbGFzcywgRW1wdHkpIHt9CisKK3B1YmxpYzoKKyAgU3Vic3ROb25UeXBlVGVtcGxhdGVQYXJtRXhwcihRdWFsVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJWYWx1ZUtpbmQgdmFsdWVLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25UeXBlVGVtcGxhdGVQYXJtRGVjbCAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqcmVwbGFjZW1lbnQpCisgICAgICA6IEV4cHIoU3Vic3ROb25UeXBlVGVtcGxhdGVQYXJtRXhwckNsYXNzLCB0eXBlLCB2YWx1ZUtpbmQsIE9LX09yZGluYXJ5LAorICAgICAgICAgICAgIHJlcGxhY2VtZW50LT5pc1R5cGVEZXBlbmRlbnQoKSwgcmVwbGFjZW1lbnQtPmlzVmFsdWVEZXBlbmRlbnQoKSwKKyAgICAgICAgICAgICByZXBsYWNlbWVudC0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCksCisgICAgICAgICAgICAgcmVwbGFjZW1lbnQtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIFBhcmFtKHBhcmFtKSwgUmVwbGFjZW1lbnQocmVwbGFjZW1lbnQpLCBOYW1lTG9jKGxvYykge30KKworICBTb3VyY2VMb2NhdGlvbiBnZXROYW1lTG9jKCkgY29uc3QgeyByZXR1cm4gTmFtZUxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gTmFtZUxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIE5hbWVMb2M7IH0KKworICBFeHByICpnZXRSZXBsYWNlbWVudCgpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8RXhwcj4oUmVwbGFjZW1lbnQpOyB9CisKKyAgTm9uVHlwZVRlbXBsYXRlUGFybURlY2wgKmdldFBhcmFtZXRlcigpIGNvbnN0IHsgcmV0dXJuIFBhcmFtOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpzKSB7CisgICAgcmV0dXJuIHMtPmdldFN0bXRDbGFzcygpID09IFN1YnN0Tm9uVHlwZVRlbXBsYXRlUGFybUV4cHJDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsgcmV0dXJuIGNoaWxkX3JhbmdlKCZSZXBsYWNlbWVudCwgJlJlcGxhY2VtZW50KzEpOyB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYSBub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgcGFjayB0aGF0CisvLy8gaGFzIGJlZW4gc3Vic3RpdHV0ZWQgd2l0aCBhIG5vbi10ZW1wbGF0ZSBhcmd1bWVudCBwYWNrLgorLy8vCisvLy8gV2hlbiBhIHBhY2sgZXhwYW5zaW9uIGluIHRoZSBzb3VyY2UgY29kZSBjb250YWlucyBtdWx0aXBsZSBwYXJhbWV0ZXIgcGFja3MKKy8vLyBhbmQgdGhvc2UgcGFyYW1ldGVyIHBhY2tzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50IGxldmVscyBvZiB0ZW1wbGF0ZQorLy8vIHBhcmFtZXRlciBsaXN0cywgdGhpcyBub2RlIGlzIHVzZWQgdG8gcmVwcmVzZW50IGEgbm9uLXR5cGUgdGVtcGxhdGUKKy8vLyBwYXJhbWV0ZXIgcGFjayBmcm9tIGFuIG91dGVyIGxldmVsLCB3aGljaCBoYXMgYWxyZWFkeSBoYWQgaXRzIGFyZ3VtZW50IHBhY2sKKy8vLyBzdWJzdGl0dXRlZCBidXQgdGhhdCBzdGlsbCBsaXZlcyB3aXRoaW4gYSBwYWNrIGV4cGFuc2lvbiB0aGF0IGl0c2VsZgorLy8vIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQuIFdoZW4gYWN0dWFsbHkgcGVyZm9ybWluZyBhIHN1YnN0aXR1dGlvbiBpbnRvCisvLy8gdGhhdCBwYWNrIGV4cGFuc2lvbiAoZS5nLiwgd2hlbiBhbGwgdGVtcGxhdGUgcGFyYW1ldGVycyBoYXZlIGNvcnJlc3BvbmRpbmcKKy8vLyBhcmd1bWVudHMpLCB0aGlzIHR5cGUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSB1bmRlcmx5aW5nCisvLy8gZXhwcmVzc2lvbiBhdCB0aGUgY3VycmVudCBwYWNrIHN1YnN0aXR1dGlvbiBpbmRleC4KK2NsYXNzIFN1YnN0Tm9uVHlwZVRlbXBsYXRlUGFybVBhY2tFeHByIDogcHVibGljIEV4cHIgeworICBmcmllbmQgY2xhc3MgQVNUUmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKworICAvLy8gXGJyaWVmIFRoZSBub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgcGFjayBpdHNlbGYuCisgIE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsICpQYXJhbTsKKworICAvLy8gXGJyaWVmIEEgcG9pbnRlciB0byB0aGUgc2V0IG9mIHRlbXBsYXRlIGFyZ3VtZW50cyB0aGF0IHRoaXMKKyAgLy8vIHBhcmFtZXRlciBwYWNrIGlzIGluc3RhbnRpYXRlZCB3aXRoLgorICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpBcmd1bWVudHM7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHRlbXBsYXRlIGFyZ3VtZW50cyBpbiBcYyBBcmd1bWVudHMuCisgIHVuc2lnbmVkIE51bUFyZ3VtZW50czsKKworICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVyIHBhY2sgcmVmZXJlbmNlLgorICBTb3VyY2VMb2NhdGlvbiBOYW1lTG9jOworCisgIGV4cGxpY2l0IFN1YnN0Tm9uVHlwZVRlbXBsYXRlUGFybVBhY2tFeHByKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgICA6IEV4cHIoU3Vic3ROb25UeXBlVGVtcGxhdGVQYXJtUGFja0V4cHJDbGFzcywgRW1wdHkpIHt9CisKK3B1YmxpYzoKKyAgU3Vic3ROb25UeXBlVGVtcGxhdGVQYXJtUGFja0V4cHIoUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwclZhbHVlS2luZCBWYWx1ZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsICpQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmQXJnUGFjayk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVyIHBhY2sgYmVpbmcgc3Vic3RpdHV0ZWQuCisgIE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsICpnZXRQYXJhbWV0ZXJQYWNrKCkgY29uc3QgeyByZXR1cm4gUGFyYW07IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGFyYW1ldGVyIHBhY2sgbmFtZS4KKyAgU291cmNlTG9jYXRpb24gZ2V0UGFyYW1ldGVyUGFja0xvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gTmFtZUxvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50IHBhY2sgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0ZWQKKyAgLy8vIHRlbXBsYXRlIGFyZ3VtZW50cy4KKyAgVGVtcGxhdGVBcmd1bWVudCBnZXRBcmd1bWVudFBhY2soKSBjb25zdDsKKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gTmFtZUxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIE5hbWVMb2M7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gU3Vic3ROb25UeXBlVGVtcGxhdGVQYXJtUGFja0V4cHJDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoY2hpbGRfaXRlcmF0b3IoKSwgY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uIHBhcmFtZXRlciBwYWNrIHRoYXQgaGFzIGJlZW4KKy8vLyBzdWJzdGl0dXRlZCBidXQgbm90IHlldCBleHBhbmRlZC4KKy8vLworLy8vIFdoZW4gYSBwYWNrIGV4cGFuc2lvbiBjb250YWlucyBtdWx0aXBsZSBwYXJhbWV0ZXIgcGFja3MgYXQgZGlmZmVyZW50IGxldmVscywKKy8vLyB0aGlzIG5vZGUgaXMgdXNlZCB0byByZXByZXNlbnQgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgcGFjayBhdCBhbiBvdXRlciBsZXZlbAorLy8vIHdoaWNoIHdlIGhhdmUgYWxyZWFkeSBzdWJzdGl0dXRlZCB0byByZWZlciB0byBleHBhbmRlZCBwYXJhbWV0ZXJzLCBidXQgd2hlcmUKKy8vLyB0aGUgY29udGFpbmluZyBwYWNrIGV4cGFuc2lvbiBjYW5ub3QgeWV0IGJlIGV4cGFuZGVkLgorLy8vCisvLy8gXGNvZGUKKy8vLyB0ZW1wbGF0ZTx0eXBlbmFtZS4uLlRzPiBzdHJ1Y3QgUyB7CisvLy8gICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLlVzPiBhdXRvIGYoVHMgLi4udHMpIC0+IGRlY2x0eXBlKGcoVXModHMpLi4uKSk7CisvLy8gfTsKKy8vLyB0ZW1wbGF0ZSBzdHJ1Y3QgUzxpbnQsIGludD47CisvLy8gXGVuZGNvZGUKK2NsYXNzIEZ1bmN0aW9uUGFybVBhY2tFeHByIGZpbmFsCisgICAgOiBwdWJsaWMgRXhwciwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPEZ1bmN0aW9uUGFybVBhY2tFeHByLCBQYXJtVmFyRGVjbCAqPiB7CisgIGZyaWVuZCBjbGFzcyBBU1RSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIC8vLyBcYnJpZWYgVGhlIGZ1bmN0aW9uIHBhcmFtZXRlciBwYWNrIHdoaWNoIHdhcyByZWZlcmVuY2VkLgorICBQYXJtVmFyRGVjbCAqUGFyYW1QYWNrOworCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgcGFjayByZWZlcmVuY2UuCisgIFNvdXJjZUxvY2F0aW9uIE5hbWVMb2M7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGV4cGFuc2lvbnMgb2YgdGhpcyBwYWNrLgorICB1bnNpZ25lZCBOdW1QYXJhbWV0ZXJzOworCisgIEZ1bmN0aW9uUGFybVBhY2tFeHByKFF1YWxUeXBlIFQsIFBhcm1WYXJEZWNsICpQYXJhbVBhY2ssCisgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE5hbWVMb2MsIHVuc2lnbmVkIE51bVBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgUGFybVZhckRlY2wgKmNvbnN0ICpQYXJhbXMpOworCitwdWJsaWM6CisgIHN0YXRpYyBGdW5jdGlvblBhcm1QYWNrRXhwciAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQsIFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcm1WYXJEZWNsICpQYXJhbVBhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcm1WYXJEZWNsICo+IFBhcmFtcyk7CisgIHN0YXRpYyBGdW5jdGlvblBhcm1QYWNrRXhwciAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1QYXJhbXMpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBwYXJhbWV0ZXIgcGFjayB3aGljaCB0aGlzIGV4cHJlc3Npb24gcmVmZXJzIHRvLgorICBQYXJtVmFyRGVjbCAqZ2V0UGFyYW1ldGVyUGFjaygpIGNvbnN0IHsgcmV0dXJuIFBhcmFtUGFjazsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgcGFyYW1ldGVyIHBhY2suCisgIFNvdXJjZUxvY2F0aW9uIGdldFBhcmFtZXRlclBhY2tMb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIE5hbWVMb2M7IH0KKworICAvLy8gXGJyaWVmIEl0ZXJhdG9ycyBvdmVyIHRoZSBwYXJhbWV0ZXJzIHdoaWNoIHRoZSBwYXJhbWV0ZXIgcGFjayBleHBhbmRlZAorICAvLy8gaW50by4KKyAgdXNpbmcgaXRlcmF0b3IgPSBQYXJtVmFyRGVjbCAqIGNvbnN0ICo7CisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPFBhcm1WYXJEZWNsICo+KCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gYmVnaW4oKSArIE51bVBhcmFtZXRlcnM7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gdGhpcyBwYXJhbWV0ZXIgcGFjay4KKyAgdW5zaWduZWQgZ2V0TnVtRXhwYW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIE51bVBhcmFtZXRlcnM7IH0KKworICAvLy8gXGJyaWVmIEdldCBhbiBleHBhbnNpb24gb2YgdGhlIHBhcmFtZXRlciBwYWNrIGJ5IGluZGV4LgorICBQYXJtVmFyRGVjbCAqZ2V0RXhwYW5zaW9uKHVuc2lnbmVkIEkpIGNvbnN0IHsgcmV0dXJuIGJlZ2luKClbSV07IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gTmFtZUxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIE5hbWVMb2M7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gRnVuY3Rpb25QYXJtUGFja0V4cHJDbGFzczsKKyAgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgcHJ2YWx1ZSB0ZW1wb3JhcnkgdGhhdCBpcyB3cml0dGVuIGludG8gbWVtb3J5IHNvIHRoYXQKKy8vLyBhIHJlZmVyZW5jZSBjYW4gYmluZCB0byBpdC4KKy8vLworLy8vIFBydmFsdWUgZXhwcmVzc2lvbnMgYXJlIG1hdGVyaWFsaXplZCB3aGVuIHRoZXkgbmVlZCB0byBoYXZlIGFuIGFkZHJlc3MKKy8vLyBpbiBtZW1vcnkgZm9yIGEgcmVmZXJlbmNlIHRvIGJpbmQgdG8uIFRoaXMgaGFwcGVucyB3aGVuIGJpbmRpbmcgYQorLy8vIHJlZmVyZW5jZSB0byB0aGUgcmVzdWx0IG9mIGEgY29udmVyc2lvbiwgZS5nLiwKKy8vLworLy8vIFxjb2RlCisvLy8gY29uc3QgaW50ICZyID0gMS4wOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBIZXJlLCAxLjAgaXMgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYW4gXGMgaW50LiBUaGF0IHJlc3VsdGluZyBcYyBpbnQgaXMKKy8vLyB0aGVuIG1hdGVyaWFsaXplZCB2aWEgYSBcYyBNYXRlcmlhbGl6ZVRlbXBvcmFyeUV4cHIsIGFuZCB0aGUgcmVmZXJlbmNlCisvLy8gYmluZHMgdG8gdGhlIHRlbXBvcmFyeS4gXGMgTWF0ZXJpYWxpemVUZW1wb3JhcnlFeHBycyBhcmUgYWx3YXlzIGdsdmFsdWVzCisvLy8gKGVpdGhlciBhbiBsdmFsdWUgb3IgYW4geHZhbHVlLCBkZXBlbmRpbmcgb24gdGhlIGtpbmQgb2YgcmVmZXJlbmNlIGJpbmRpbmcKKy8vLyB0byBpdCksIG1haW50YWluaW5nIHRoZSBpbnZhcmlhbnQgdGhhdCByZWZlcmVuY2VzIGFsd2F5cyBiaW5kIHRvIGdsdmFsdWVzLgorLy8vCisvLy8gUmVmZXJlbmNlIGJpbmRpbmcgYW5kIGNvcHktZWxpc2lvbiBjYW4gYm90aCBleHRlbmQgdGhlIGxpZmV0aW1lIG9mIGEKKy8vLyB0ZW1wb3JhcnkuIFdoZW4gZWl0aGVyIGhhcHBlbnMsIHRoZSBleHByZXNzaW9uIHdpbGwgYWxzbyB0cmFjayB0aGUKKy8vLyBkZWNsYXJhdGlvbiB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGxpZmV0aW1lIGV4dGVuc2lvbi4KK2NsYXNzIE1hdGVyaWFsaXplVGVtcG9yYXJ5RXhwciA6IHB1YmxpYyBFeHByIHsKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNUU3RtdFdyaXRlcjsKKworICBzdHJ1Y3QgRXh0cmFTdGF0ZSB7CisgICAgLy8vIFxicmllZiBUaGUgdGVtcG9yYXJ5LWdlbmVyYXRpbmcgZXhwcmVzc2lvbiB3aG9zZSB2YWx1ZSB3aWxsIGJlCisgICAgLy8vIG1hdGVyaWFsaXplZC4KKyAgICBTdG10ICpUZW1wb3Jhcnk7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBkZWNsYXJhdGlvbiB3aGljaCBsaWZldGltZS1leHRlbmRlZCB0aGlzIHJlZmVyZW5jZSwgaWYgYW55LgorICAgIC8vLyBFaXRoZXIgYSBWYXJEZWNsLCBvciAoZm9yIGEgY3Rvci1pbml0aWFsaXplcikgYSBGaWVsZERlY2wuCisgICAgY29uc3QgVmFsdWVEZWNsICpFeHRlbmRpbmdEZWNsOworCisgICAgdW5zaWduZWQgTWFuZ2xpbmdOdW1iZXI7CisgIH07CisgIGxsdm06OlBvaW50ZXJVbmlvbjxTdG10ICosIEV4dHJhU3RhdGUgKj4gU3RhdGU7CisKKyAgdm9pZCBpbml0aWFsaXplRXh0cmFTdGF0ZShjb25zdCBWYWx1ZURlY2wgKkV4dGVuZGVkQnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWFuZ2xpbmdOdW1iZXIpOworCitwdWJsaWM6CisgIE1hdGVyaWFsaXplVGVtcG9yYXJ5RXhwcihRdWFsVHlwZSBULCBFeHByICpUZW1wb3JhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEJvdW5kVG9MdmFsdWVSZWZlcmVuY2UpCisgICAgICA6IEV4cHIoTWF0ZXJpYWxpemVUZW1wb3JhcnlFeHByQ2xhc3MsIFQsCisgICAgICAgICAgICAgQm91bmRUb0x2YWx1ZVJlZmVyZW5jZT8gVktfTFZhbHVlIDogVktfWFZhbHVlLCBPS19PcmRpbmFyeSwKKyAgICAgICAgICAgICBUZW1wb3JhcnktPmlzVHlwZURlcGVuZGVudCgpLCBUZW1wb3JhcnktPmlzVmFsdWVEZXBlbmRlbnQoKSwKKyAgICAgICAgICAgICBUZW1wb3JhcnktPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpLAorICAgICAgICAgICAgIFRlbXBvcmFyeS0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSwKKyAgICAgICAgU3RhdGUoVGVtcG9yYXJ5KSB7fQorCisgIE1hdGVyaWFsaXplVGVtcG9yYXJ5RXhwcihFbXB0eVNoZWxsIEVtcHR5KQorICAgICAgOiBFeHByKE1hdGVyaWFsaXplVGVtcG9yYXJ5RXhwckNsYXNzLCBFbXB0eSkge30KKworICBTdG10ICpnZXRUZW1wb3JhcnkoKSBjb25zdCB7CisgICAgcmV0dXJuIFN0YXRlLmlzPFN0bXQgKj4oKSA/IFN0YXRlLmdldDxTdG10ICo+KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU3RhdGUuZ2V0PEV4dHJhU3RhdGUgKj4oKS0+VGVtcG9yYXJ5OworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdGVtcG9yYXJ5LWdlbmVyYXRpbmcgc3ViZXhwcmVzc2lvbiB3aG9zZSB2YWx1ZSB3aWxsCisgIC8vLyBiZSBtYXRlcmlhbGl6ZWQgaW50byBhIGdsdmFsdWUuCisgIEV4cHIgKkdldFRlbXBvcmFyeUV4cHIoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxFeHByICo+KGdldFRlbXBvcmFyeSgpKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHN0b3JhZ2UgZHVyYXRpb24gZm9yIHRoZSBtYXRlcmlhbGl6ZWQgdGVtcG9yYXJ5LgorICBTdG9yYWdlRHVyYXRpb24gZ2V0U3RvcmFnZUR1cmF0aW9uKCkgY29uc3QgeworICAgIGNvbnN0IFZhbHVlRGVjbCAqRXh0ZW5kaW5nRGVjbCA9IGdldEV4dGVuZGluZ0RlY2woKTsKKyAgICBpZiAoIUV4dGVuZGluZ0RlY2wpCisgICAgICByZXR1cm4gU0RfRnVsbEV4cHJlc3Npb247CisgICAgLy8gRklYTUU6IFRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IGNvcnJlY3QgZm9yIGEgdGVtcG9yYXJ5IG1hdGVyaWFsaXplZAorICAgIC8vIHdpdGhpbiBhIGRlZmF1bHQgaW5pdGlhbGl6ZXIuCisgICAgaWYgKGlzYTxGaWVsZERlY2w+KEV4dGVuZGluZ0RlY2wpKQorICAgICAgcmV0dXJuIFNEX0F1dG9tYXRpYzsKKyAgICAvLyBGSVhNRTogVGhpcyBvbmx5IHdvcmtzIGJlY2F1c2Ugc3RvcmFnZSBjbGFzcyBzcGVjaWZpZXJzIGFyZSBub3QgYWxsb3dlZAorICAgIC8vIG9uIGRlY29tcG9zaXRpb24gZGVjbGFyYXRpb25zLgorICAgIGlmIChpc2E8QmluZGluZ0RlY2w+KEV4dGVuZGluZ0RlY2wpKQorICAgICAgcmV0dXJuIEV4dGVuZGluZ0RlY2wtPmdldERlY2xDb250ZXh0KCktPmlzRnVuY3Rpb25Pck1ldGhvZCgpCisgICAgICAgICAgICAgICAgID8gU0RfQXV0b21hdGljCisgICAgICAgICAgICAgICAgIDogU0RfU3RhdGljOworICAgIHJldHVybiBjYXN0PFZhckRlY2w+KEV4dGVuZGluZ0RlY2wpLT5nZXRTdG9yYWdlRHVyYXRpb24oKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBkZWNsYXJhdGlvbiB3aGljaCB0cmlnZ2VyZWQgdGhlIGxpZmV0aW1lLWV4dGVuc2lvbiBvZiB0aGlzCisgIC8vLyB0ZW1wb3JhcnksIGlmIGFueS4KKyAgY29uc3QgVmFsdWVEZWNsICpnZXRFeHRlbmRpbmdEZWNsKCkgY29uc3QgeworICAgIHJldHVybiBTdGF0ZS5pczxTdG10ICo+KCkgPyBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFN0YXRlLmdldDxFeHRyYVN0YXRlICo+KCktPkV4dGVuZGluZ0RlY2w7CisgIH0KKworICB2b2lkIHNldEV4dGVuZGluZ0RlY2woY29uc3QgVmFsdWVEZWNsICpFeHRlbmRlZEJ5LCB1bnNpZ25lZCBNYW5nbGluZ051bWJlcik7CisKKyAgdW5zaWduZWQgZ2V0TWFuZ2xpbmdOdW1iZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFN0YXRlLmlzPFN0bXQgKj4oKSA/IDAgOiBTdGF0ZS5nZXQ8RXh0cmFTdGF0ZSAqPigpLT5NYW5nbGluZ051bWJlcjsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBtYXRlcmlhbGl6ZWQgdGVtcG9yYXJ5IGlzIGJvdW5kIHRvIGFuCisgIC8vLyBsdmFsdWUgcmVmZXJlbmNlOyBvdGhlcndpc2UsIGl0J3MgYm91bmQgdG8gYW4gcnZhbHVlIHJlZmVyZW5jZS4KKyAgYm9vbCBpc0JvdW5kVG9MdmFsdWVSZWZlcmVuY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFZhbHVlS2luZCgpID09IFZLX0xWYWx1ZTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeSgpLT5nZXRMb2NTdGFydCgpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeSgpLT5nZXRMb2NFbmQoKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBNYXRlcmlhbGl6ZVRlbXBvcmFyeUV4cHJDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICBpZiAoU3RhdGUuaXM8U3RtdCAqPigpKQorICAgICAgcmV0dXJuIGNoaWxkX3JhbmdlKFN0YXRlLmdldEFkZHJPZlB0cjEoKSwgU3RhdGUuZ2V0QWRkck9mUHRyMSgpICsgMSk7CisKKyAgICBhdXRvIEVTID0gU3RhdGUuZ2V0PEV4dHJhU3RhdGUgKj4oKTsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoJkVTLT5UZW1wb3JhcnksICZFUy0+VGVtcG9yYXJ5ICsgMSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIGZvbGRpbmcgb2YgYSBwYWNrIG92ZXIgYW4gb3BlcmF0b3IuCisvLy8KKy8vLyBUaGlzIGV4cHJlc3Npb24gaXMgYWx3YXlzIGRlcGVuZGVudCBhbmQgcmVwcmVzZW50cyBhIHBhY2sgZXhwYW5zaW9uIG9mIHRoZQorLy8vIGZvcm1zOgorLy8vCisvLy8gICAgKCBleHByIG9wIC4uLiApCisvLy8gICAgKCAuLi4gb3AgZXhwciApCisvLy8gICAgKCBleHByIG9wIC4uLiBvcCBleHByICkKK2NsYXNzIENYWEZvbGRFeHByIDogcHVibGljIEV4cHIgeworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRXcml0ZXI7CisKKyAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jOworICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYzsKKyAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jOworICBTdG10ICpTdWJFeHByc1syXTsKKyAgQmluYXJ5T3BlcmF0b3JLaW5kIE9wY29kZTsKKworcHVibGljOgorICBDWFhGb2xkRXhwcihRdWFsVHlwZSBULCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsIEV4cHIgKkxIUywKKyAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3JLaW5kIE9wY29kZSwgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MsIEV4cHIgKlJIUywKKyAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKQorICAgICAgOiBFeHByKENYWEZvbGRFeHByQ2xhc3MsIFQsIFZLX1JWYWx1ZSwgT0tfT3JkaW5hcnksCisgICAgICAgICAgICAgLypEZXBlbmRlbnQqLyB0cnVlLCB0cnVlLCB0cnVlLAorICAgICAgICAgICAgIC8qQ29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjayovIGZhbHNlKSwKKyAgICAgICAgTFBhcmVuTG9jKExQYXJlbkxvYyksIEVsbGlwc2lzTG9jKEVsbGlwc2lzTG9jKSwgUlBhcmVuTG9jKFJQYXJlbkxvYyksCisgICAgICAgIE9wY29kZShPcGNvZGUpIHsKKyAgICBTdWJFeHByc1swXSA9IExIUzsKKyAgICBTdWJFeHByc1sxXSA9IFJIUzsKKyAgfQorCisgIENYWEZvbGRFeHByKEVtcHR5U2hlbGwgRW1wdHkpIDogRXhwcihDWFhGb2xkRXhwckNsYXNzLCBFbXB0eSkge30KKworICBFeHByICpnZXRMSFMoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxFeHByKj4oU3ViRXhwcnNbMF0pOyB9CisgIEV4cHIgKmdldFJIUygpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PEV4cHIqPihTdWJFeHByc1sxXSk7IH0KKworICAvLy8gRG9lcyB0aGlzIHByb2R1Y2UgYSByaWdodC1hc3NvY2lhdGVkIHNlcXVlbmNlIG9mIG9wZXJhdG9ycz8KKyAgYm9vbCBpc1JpZ2h0Rm9sZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TEhTKCkgJiYgZ2V0TEhTKCktPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKTsKKyAgfQorCisgIC8vLyBEb2VzIHRoaXMgcHJvZHVjZSBhIGxlZnQtYXNzb2NpYXRlZCBzZXF1ZW5jZSBvZiBvcGVyYXRvcnM/CisgIGJvb2wgaXNMZWZ0Rm9sZCgpIGNvbnN0IHsgcmV0dXJuICFpc1JpZ2h0Rm9sZCgpOyB9CisKKyAgLy8vIEdldCB0aGUgcGF0dGVybiwgdGhhdCBpcywgdGhlIG9wZXJhbmQgdGhhdCBjb250YWlucyBhbiB1bmV4cGFuZGVkIHBhY2suCisgIEV4cHIgKmdldFBhdHRlcm4oKSBjb25zdCB7IHJldHVybiBpc0xlZnRGb2xkKCkgPyBnZXRSSFMoKSA6IGdldExIUygpOyB9CisKKyAgLy8vIEdldCB0aGUgb3BlcmFuZCB0aGF0IGRvZXNuJ3QgY29udGFpbiBhIHBhY2ssIGZvciBhIGJpbmFyeSBmb2xkLgorICBFeHByICpnZXRJbml0KCkgY29uc3QgeyByZXR1cm4gaXNMZWZ0Rm9sZCgpID8gZ2V0TEhTKCkgOiBnZXRSSFMoKTsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEVsbGlwc2lzTG9jKCkgY29uc3QgeyByZXR1cm4gRWxsaXBzaXNMb2M7IH0KKyAgQmluYXJ5T3BlcmF0b3JLaW5kIGdldE9wZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gT3Bjb2RlOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gTFBhcmVuTG9jOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIFJQYXJlbkxvYzsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBDWFhGb2xkRXhwckNsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoU3ViRXhwcnMsIFN1YkV4cHJzICsgMik7IH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhbiBleHByZXNzaW9uIHRoYXQgbWlnaHQgc3VzcGVuZCBjb3JvdXRpbmUgZXhlY3V0aW9uOworLy8vIGVpdGhlciBhIGNvX2F3YWl0IG9yIGNvX3lpZWxkIGV4cHJlc3Npb24uCisvLy8KKy8vLyBFdmFsdWF0aW9uIG9mIHRoaXMgZXhwcmVzc2lvbiBmaXJzdCBldmFsdWF0ZXMgaXRzICdyZWFkeScgZXhwcmVzc2lvbi4gSWYKKy8vLyB0aGF0IHJldHVybnMgJ2ZhbHNlJzoKKy8vLyAgLS0gZXhlY3V0aW9uIG9mIHRoZSBjb3JvdXRpbmUgaXMgc3VzcGVuZGVkCisvLy8gIC0tIHRoZSAnc3VzcGVuZCcgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQKKy8vLyAgICAgLS0gaWYgdGhlICdzdXNwZW5kJyBleHByZXNzaW9uIHJldHVybnMgJ2ZhbHNlJywgdGhlIGNvcm91dGluZSBpcworLy8vICAgICAgICByZXN1bWVkCisvLy8gICAgIC0tIG90aGVyd2lzZSwgY29udHJvbCBwYXNzZXMgYmFjayB0byB0aGUgcmVzdW1lci4KKy8vLyBJZiB0aGUgY29yb3V0aW5lIGlzIG5vdCBzdXNwZW5kZWQsIG9yIHdoZW4gaXQgaXMgcmVzdW1lZCwgdGhlICdyZXN1bWUnCisvLy8gZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQsIGFuZCBpdHMgcmVzdWx0IGlzIHRoZSByZXN1bHQgb2YgdGhlIG92ZXJhbGwKKy8vLyBleHByZXNzaW9uLgorY2xhc3MgQ29yb3V0aW5lU3VzcGVuZEV4cHIgOiBwdWJsaWMgRXhwciB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIFNvdXJjZUxvY2F0aW9uIEtleXdvcmRMb2M7CisKKyAgZW51bSBTdWJFeHByIHsgQ29tbW9uLCBSZWFkeSwgU3VzcGVuZCwgUmVzdW1lLCBDb3VudCB9OworCisgIFN0bXQgKlN1YkV4cHJzW1N1YkV4cHI6OkNvdW50XTsKKyAgT3BhcXVlVmFsdWVFeHByICpPcGFxdWVWYWx1ZSA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgQ29yb3V0aW5lU3VzcGVuZEV4cHIoU3RtdENsYXNzIFNDLCBTb3VyY2VMb2NhdGlvbiBLZXl3b3JkTG9jLCBFeHByICpDb21tb24sCisgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKlJlYWR5LCBFeHByICpTdXNwZW5kLCBFeHByICpSZXN1bWUsCisgICAgICAgICAgICAgICAgICAgICAgIE9wYXF1ZVZhbHVlRXhwciAqT3BhcXVlVmFsdWUpCisgICAgICA6IEV4cHIoU0MsIFJlc3VtZS0+Z2V0VHlwZSgpLCBSZXN1bWUtPmdldFZhbHVlS2luZCgpLAorICAgICAgICAgICAgIFJlc3VtZS0+Z2V0T2JqZWN0S2luZCgpLCBSZXN1bWUtPmlzVHlwZURlcGVuZGVudCgpLAorICAgICAgICAgICAgIFJlc3VtZS0+aXNWYWx1ZURlcGVuZGVudCgpLCBDb21tb24tPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpLAorICAgICAgICAgICAgIENvbW1vbi0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSwKKyAgICAgICAgS2V5d29yZExvYyhLZXl3b3JkTG9jKSwgT3BhcXVlVmFsdWUoT3BhcXVlVmFsdWUpIHsKKyAgICBTdWJFeHByc1tTdWJFeHByOjpDb21tb25dID0gQ29tbW9uOworICAgIFN1YkV4cHJzW1N1YkV4cHI6OlJlYWR5XSA9IFJlYWR5OworICAgIFN1YkV4cHJzW1N1YkV4cHI6OlN1c3BlbmRdID0gU3VzcGVuZDsKKyAgICBTdWJFeHByc1tTdWJFeHByOjpSZXN1bWVdID0gUmVzdW1lOworICB9CisKKyAgQ29yb3V0aW5lU3VzcGVuZEV4cHIoU3RtdENsYXNzIFNDLCBTb3VyY2VMb2NhdGlvbiBLZXl3b3JkTG9jLCBRdWFsVHlwZSBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqQ29tbW9uKQorICAgICAgOiBFeHByKFNDLCBUeSwgVktfUlZhbHVlLCBPS19PcmRpbmFyeSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwKKyAgICAgICAgICAgICBDb21tb24tPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIEtleXdvcmRMb2MoS2V5d29yZExvYykgeworICAgIGFzc2VydChDb21tb24tPmlzVHlwZURlcGVuZGVudCgpICYmIFR5LT5pc0RlcGVuZGVudFR5cGUoKSAmJgorICAgICAgICAgICAid3JvbmcgY29uc3RydWN0b3IgZm9yIG5vbi1kZXBlbmRlbnQgY29fYXdhaXQvY29feWllbGQgZXhwcmVzc2lvbiIpOworICAgIFN1YkV4cHJzW1N1YkV4cHI6OkNvbW1vbl0gPSBDb21tb247CisgICAgU3ViRXhwcnNbU3ViRXhwcjo6UmVhZHldID0gbnVsbHB0cjsKKyAgICBTdWJFeHByc1tTdWJFeHByOjpTdXNwZW5kXSA9IG51bGxwdHI7CisgICAgU3ViRXhwcnNbU3ViRXhwcjo6UmVzdW1lXSA9IG51bGxwdHI7CisgIH0KKworICBDb3JvdXRpbmVTdXNwZW5kRXhwcihTdG10Q2xhc3MgU0MsIEVtcHR5U2hlbGwgRW1wdHkpIDogRXhwcihTQywgRW1wdHkpIHsKKyAgICBTdWJFeHByc1tTdWJFeHByOjpDb21tb25dID0gbnVsbHB0cjsKKyAgICBTdWJFeHByc1tTdWJFeHByOjpSZWFkeV0gPSBudWxscHRyOworICAgIFN1YkV4cHJzW1N1YkV4cHI6OlN1c3BlbmRdID0gbnVsbHB0cjsKKyAgICBTdWJFeHByc1tTdWJFeHByOjpSZXN1bWVdID0gbnVsbHB0cjsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEtleXdvcmRMb2MoKSBjb25zdCB7IHJldHVybiBLZXl3b3JkTG9jOyB9CisKKyAgRXhwciAqZ2V0Q29tbW9uRXhwcigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RXhwcio+KFN1YkV4cHJzW1N1YkV4cHI6OkNvbW1vbl0pOworICB9CisKKyAgLy8vIFxicmllZiBnZXRPcGFxdWVWYWx1ZSAtIFJldHVybiB0aGUgb3BhcXVlIHZhbHVlIHBsYWNlaG9sZGVyLgorICBPcGFxdWVWYWx1ZUV4cHIgKmdldE9wYXF1ZVZhbHVlKCkgY29uc3QgeyByZXR1cm4gT3BhcXVlVmFsdWU7IH0KKworICBFeHByICpnZXRSZWFkeUV4cHIoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEV4cHIqPihTdWJFeHByc1tTdWJFeHByOjpSZWFkeV0pOworICB9CisKKyAgRXhwciAqZ2V0U3VzcGVuZEV4cHIoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEV4cHIqPihTdWJFeHByc1tTdWJFeHByOjpTdXNwZW5kXSk7CisgIH0KKworICBFeHByICpnZXRSZXN1bWVFeHByKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxFeHByKj4oU3ViRXhwcnNbU3ViRXhwcjo6UmVzdW1lXSk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBLZXl3b3JkTG9jOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGdldENvbW1vbkV4cHIoKS0+Z2V0TG9jRW5kKCk7CisgIH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoU3ViRXhwcnMsIFN1YkV4cHJzICsgU3ViRXhwcjo6Q291bnQpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IENvYXdhaXRFeHByQ2xhc3MgfHwKKyAgICAgICAgICAgVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ295aWVsZEV4cHJDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgJ2NvX2F3YWl0JyBleHByZXNzaW9uLgorY2xhc3MgQ29hd2FpdEV4cHIgOiBwdWJsaWMgQ29yb3V0aW5lU3VzcGVuZEV4cHIgeworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKworcHVibGljOgorICBDb2F3YWl0RXhwcihTb3VyY2VMb2NhdGlvbiBDb2F3YWl0TG9jLCBFeHByICpPcGVyYW5kLCBFeHByICpSZWFkeSwKKyAgICAgICAgICAgICAgRXhwciAqU3VzcGVuZCwgRXhwciAqUmVzdW1lLCBPcGFxdWVWYWx1ZUV4cHIgKk9wYXF1ZVZhbHVlLAorICAgICAgICAgICAgICBib29sIElzSW1wbGljaXQgPSBmYWxzZSkKKyAgICAgIDogQ29yb3V0aW5lU3VzcGVuZEV4cHIoQ29hd2FpdEV4cHJDbGFzcywgQ29hd2FpdExvYywgT3BlcmFuZCwgUmVhZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1c3BlbmQsIFJlc3VtZSwgT3BhcXVlVmFsdWUpIHsKKyAgICBDb2F3YWl0Qml0cy5Jc0ltcGxpY2l0ID0gSXNJbXBsaWNpdDsKKyAgfQorCisgIENvYXdhaXRFeHByKFNvdXJjZUxvY2F0aW9uIENvYXdhaXRMb2MsIFF1YWxUeXBlIFR5LCBFeHByICpPcGVyYW5kLAorICAgICAgICAgICAgICBib29sIElzSW1wbGljaXQgPSBmYWxzZSkKKyAgICAgIDogQ29yb3V0aW5lU3VzcGVuZEV4cHIoQ29hd2FpdEV4cHJDbGFzcywgQ29hd2FpdExvYywgVHksIE9wZXJhbmQpIHsKKyAgICBDb2F3YWl0Qml0cy5Jc0ltcGxpY2l0ID0gSXNJbXBsaWNpdDsKKyAgfQorCisgIENvYXdhaXRFeHByKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgICA6IENvcm91dGluZVN1c3BlbmRFeHByKENvYXdhaXRFeHByQ2xhc3MsIEVtcHR5KSB7fQorCisgIEV4cHIgKmdldE9wZXJhbmQoKSBjb25zdCB7CisgICAgLy8gRklYTUU6IERpZyBvdXQgdGhlIGFjdHVhbCBvcGVyYW5kIG9yIHN0b3JlIGl0LgorICAgIHJldHVybiBnZXRDb21tb25FeHByKCk7CisgIH0KKworICBib29sIGlzSW1wbGljaXQoKSBjb25zdCB7IHJldHVybiBDb2F3YWl0Qml0cy5Jc0ltcGxpY2l0OyB9CisgIHZvaWQgc2V0SXNJbXBsaWNpdChib29sIHZhbHVlID0gdHJ1ZSkgeyBDb2F3YWl0Qml0cy5Jc0ltcGxpY2l0ID0gdmFsdWU7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ29hd2FpdEV4cHJDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgJ2NvX2F3YWl0JyBleHByZXNzaW9uIHdoaWxlIHRoZSB0eXBlIG9mIHRoZSBwcm9taXNlCisvLy8gaXMgZGVwZW5kZW50LgorY2xhc3MgRGVwZW5kZW50Q29hd2FpdEV4cHIgOiBwdWJsaWMgRXhwciB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIFNvdXJjZUxvY2F0aW9uIEtleXdvcmRMb2M7CisgIFN0bXQgKlN1YkV4cHJzWzJdOworCitwdWJsaWM6CisgIERlcGVuZGVudENvYXdhaXRFeHByKFNvdXJjZUxvY2F0aW9uIEtleXdvcmRMb2MsIFF1YWxUeXBlIFR5LCBFeHByICpPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgVW5yZXNvbHZlZExvb2t1cEV4cHIgKk9wQ29hd2FpdCkKKyAgICAgIDogRXhwcihEZXBlbmRlbnRDb2F3YWl0RXhwckNsYXNzLCBUeSwgVktfUlZhbHVlLCBPS19PcmRpbmFyeSwKKyAgICAgICAgICAgICAvKlR5cGVEZXBlbmRlbnQqLyB0cnVlLCAvKlZhbHVlRGVwZW5kZW50Ki8gdHJ1ZSwKKyAgICAgICAgICAgICAvKkluc3RhbnRpYXRpb25EZXBlbmRlbnQqLyB0cnVlLAorICAgICAgICAgICAgIE9wLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgICBLZXl3b3JkTG9jKEtleXdvcmRMb2MpIHsKKyAgICAvLyBOT1RFOiBBIGNvX2F3YWl0IGV4cHJlc3Npb24gaXMgZGVwZW5kZW50IG9uIHRoZSBjb3JvdXRpbmVzIHByb21pc2UKKyAgICAvLyB0eXBlIGFuZCBtYXkgYmUgZGVwZW5kZW50IGV2ZW4gd2hlbiB0aGUgYE9wYCBleHByZXNzaW9uIGlzIG5vdC4KKyAgICBhc3NlcnQoVHktPmlzRGVwZW5kZW50VHlwZSgpICYmCisgICAgICAgICAgICJ3cm9uZyBjb25zdHJ1Y3RvciBmb3Igbm9uLWRlcGVuZGVudCBjb19hd2FpdC9jb195aWVsZCBleHByZXNzaW9uIik7CisgICAgU3ViRXhwcnNbMF0gPSBPcDsKKyAgICBTdWJFeHByc1sxXSA9IE9wQ29hd2FpdDsKKyAgfQorCisgIERlcGVuZGVudENvYXdhaXRFeHByKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgICA6IEV4cHIoRGVwZW5kZW50Q29hd2FpdEV4cHJDbGFzcywgRW1wdHkpIHt9CisKKyAgRXhwciAqZ2V0T3BlcmFuZCgpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8RXhwcj4oU3ViRXhwcnNbMF0pOyB9CisKKyAgVW5yZXNvbHZlZExvb2t1cEV4cHIgKmdldE9wZXJhdG9yQ29hd2FpdExvb2t1cCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxVbnJlc29sdmVkTG9va3VwRXhwcj4oU3ViRXhwcnNbMV0pOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0S2V5d29yZExvYygpIGNvbnN0IHsgcmV0dXJuIEtleXdvcmRMb2M7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gS2V5d29yZExvYzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBnZXRPcGVyYW5kKCktPmdldExvY0VuZCgpOworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7IHJldHVybiBjaGlsZF9yYW5nZShTdWJFeHBycywgU3ViRXhwcnMgKyAyKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBEZXBlbmRlbnRDb2F3YWl0RXhwckNsYXNzOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSAnY29feWllbGQnIGV4cHJlc3Npb24uCitjbGFzcyBDb3lpZWxkRXhwciA6IHB1YmxpYyBDb3JvdXRpbmVTdXNwZW5kRXhwciB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCitwdWJsaWM6CisgIENveWllbGRFeHByKFNvdXJjZUxvY2F0aW9uIENveWllbGRMb2MsIEV4cHIgKk9wZXJhbmQsIEV4cHIgKlJlYWR5LAorICAgICAgICAgICAgICBFeHByICpTdXNwZW5kLCBFeHByICpSZXN1bWUsIE9wYXF1ZVZhbHVlRXhwciAqT3BhcXVlVmFsdWUpCisgICAgICA6IENvcm91dGluZVN1c3BlbmRFeHByKENveWllbGRFeHByQ2xhc3MsIENveWllbGRMb2MsIE9wZXJhbmQsIFJlYWR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXNwZW5kLCBSZXN1bWUsIE9wYXF1ZVZhbHVlKSB7fQorICBDb3lpZWxkRXhwcihTb3VyY2VMb2NhdGlvbiBDb3lpZWxkTG9jLCBRdWFsVHlwZSBUeSwgRXhwciAqT3BlcmFuZCkKKyAgICAgIDogQ29yb3V0aW5lU3VzcGVuZEV4cHIoQ295aWVsZEV4cHJDbGFzcywgQ295aWVsZExvYywgVHksIE9wZXJhbmQpIHt9CisgIENveWllbGRFeHByKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgICA6IENvcm91dGluZVN1c3BlbmRFeHByKENveWllbGRFeHByQ2xhc3MsIEVtcHR5KSB7fQorCisgIEV4cHIgKmdldE9wZXJhbmQoKSBjb25zdCB7CisgICAgLy8gRklYTUU6IERpZyBvdXQgdGhlIGFjdHVhbCBvcGVyYW5kIG9yIHN0b3JlIGl0LgorICAgIHJldHVybiBnZXRDb21tb25FeHByKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ295aWVsZEV4cHJDbGFzczsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUX0VYUFJDWFhfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0V4cHJPYmpDLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRXhwck9iakMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTU5MzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0V4cHJPYmpDLmgKQEAgLTAsMCArMSwxNjY4IEBACisvLz09PS0gRXhwck9iakMuaCAtIENsYXNzZXMgZm9yIHJlcHJlc2VudGluZyBPYmpDIGV4cHJlc3Npb25zIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRXhwck9iakMgaW50ZXJmYWNlIGFuZCBzdWJjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfRVhQUk9CSkNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9FWFBST0JKQ19ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsT2JqQy5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL09wZXJhdGlvbktpbmRzLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1NlbGVjdG9yTG9jYXRpb25zS2luZC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9TcGVjaWZpZXJzLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVmVyc2lvblR1cGxlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVHJhaWxpbmdPYmplY3RzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBDWFhCYXNlU3BlY2lmaWVyOworCisvLy8gT2JqQ1N0cmluZ0xpdGVyYWwsIHVzZWQgZm9yIE9iamVjdGl2ZS1DIHN0cmluZyBsaXRlcmFscworLy8vIGkuZS4gQCJmb28iLgorY2xhc3MgT2JqQ1N0cmluZ0xpdGVyYWwgOiBwdWJsaWMgRXhwciB7CisgIFN0bXQgKlN0cmluZzsKKyAgU291cmNlTG9jYXRpb24gQXRMb2M7CisKK3B1YmxpYzoKKyAgT2JqQ1N0cmluZ0xpdGVyYWwoU3RyaW5nTGl0ZXJhbCAqU0wsIFF1YWxUeXBlIFQsIFNvdXJjZUxvY2F0aW9uIEwpCisgICAgICA6IEV4cHIoT2JqQ1N0cmluZ0xpdGVyYWxDbGFzcywgVCwgVktfUlZhbHVlLCBPS19PcmRpbmFyeSwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSksCisgICAgICAgIFN0cmluZyhTTCksIEF0TG9jKEwpIHt9CisgIGV4cGxpY2l0IE9iakNTdHJpbmdMaXRlcmFsKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgICA6IEV4cHIoT2JqQ1N0cmluZ0xpdGVyYWxDbGFzcywgRW1wdHkpIHt9CisKKyAgU3RyaW5nTGl0ZXJhbCAqZ2V0U3RyaW5nKCkgeyByZXR1cm4gY2FzdDxTdHJpbmdMaXRlcmFsPihTdHJpbmcpOyB9CisgIGNvbnN0IFN0cmluZ0xpdGVyYWwgKmdldFN0cmluZygpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8U3RyaW5nTGl0ZXJhbD4oU3RyaW5nKTsgfQorICB2b2lkIHNldFN0cmluZyhTdHJpbmdMaXRlcmFsICpTKSB7IFN0cmluZyA9IFM7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRBdExvYygpIGNvbnN0IHsgcmV0dXJuIEF0TG9jOyB9CisgIHZvaWQgc2V0QXRMb2MoU291cmNlTG9jYXRpb24gTCkgeyBBdExvYyA9IEw7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gQXRMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBTdHJpbmctPmdldExvY0VuZCgpOyB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoJlN0cmluZywgJlN0cmluZysxKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPYmpDU3RyaW5nTGl0ZXJhbENsYXNzOworICB9Cit9OworCisvLy8gT2JqQ0Jvb2xMaXRlcmFsRXhwciAtIE9iamVjdGl2ZS1DIEJvb2xlYW4gTGl0ZXJhbC4KK2NsYXNzIE9iakNCb29sTGl0ZXJhbEV4cHIgOiBwdWJsaWMgRXhwciB7CisgIGJvb2wgVmFsdWU7CisgIFNvdXJjZUxvY2F0aW9uIExvYzsKKworcHVibGljOgorICBPYmpDQm9vbExpdGVyYWxFeHByKGJvb2wgdmFsLCBRdWFsVHlwZSBUeSwgU291cmNlTG9jYXRpb24gbCkKKyAgICAgIDogRXhwcihPYmpDQm9vbExpdGVyYWxFeHByQ2xhc3MsIFR5LCBWS19SVmFsdWUsIE9LX09yZGluYXJ5LCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgVmFsdWUodmFsKSwgTG9jKGwpIHt9CisgIGV4cGxpY2l0IE9iakNCb29sTGl0ZXJhbEV4cHIoRW1wdHlTaGVsbCBFbXB0eSkKKyAgICAgIDogRXhwcihPYmpDQm9vbExpdGVyYWxFeHByQ2xhc3MsIEVtcHR5KSB7fQorICAgIAorICBib29sIGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKyAgdm9pZCBzZXRWYWx1ZShib29sIFYpIHsgVmFsdWUgPSBWOyB9CisgICAgCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2M7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIExvYzsgfQorICB2b2lkIHNldExvY2F0aW9uKFNvdXJjZUxvY2F0aW9uIEwpIHsgTG9jID0gTDsgfQorICAgIAorICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9iakNCb29sTGl0ZXJhbEV4cHJDbGFzczsKKyAgfQorfTsKKworLy8vIE9iakNCb3hlZEV4cHIgLSB1c2VkIGZvciBnZW5lcmFsaXplZCBleHByZXNzaW9uIGJveGluZy4KKy8vLyBhcyBpbjogQChzdHJkdXAoImhlbGxvIHdvcmxkIikpLCBAKHJhbmRvbSgpKSBvciBAKHZpZXcuZnJhbWUpCisvLy8gQWxzbyB1c2VkIGZvciBib3hpbmcgbm9uLXBhcmVudGhlc2l6ZWQgbnVtZXJpYyBsaXRlcmFsczsKKy8vLyBhcyBpbjogQDQyIG9yIFxAdHJ1ZSAoYysrL29iamMrKykgb3IgXEBfX29iamNfeWVzIChjL29iamMpLgorY2xhc3MgT2JqQ0JveGVkRXhwciA6IHB1YmxpYyBFeHByIHsKKyAgU3RtdCAqU3ViRXhwcjsKKyAgT2JqQ01ldGhvZERlY2wgKkJveGluZ01ldGhvZDsKKyAgU291cmNlUmFuZ2UgUmFuZ2U7CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisKKyAgT2JqQ0JveGVkRXhwcihFeHByICpFLCBRdWFsVHlwZSBULCBPYmpDTWV0aG9kRGVjbCAqbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgUikKKyAgICAgIDogRXhwcihPYmpDQm94ZWRFeHByQ2xhc3MsIFQsIFZLX1JWYWx1ZSwgT0tfT3JkaW5hcnksIAorICAgICAgICAgICAgIEUtPmlzVHlwZURlcGVuZGVudCgpLCBFLT5pc1ZhbHVlRGVwZW5kZW50KCksIAorICAgICAgICAgICAgIEUtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpLAorICAgICAgICAgICAgIEUtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksIAorICAgICAgICBTdWJFeHByKEUpLCBCb3hpbmdNZXRob2QobWV0aG9kKSwgUmFuZ2UoUikge30KKyAgZXhwbGljaXQgT2JqQ0JveGVkRXhwcihFbXB0eVNoZWxsIEVtcHR5KQorICAgICAgOiBFeHByKE9iakNCb3hlZEV4cHJDbGFzcywgRW1wdHkpIHt9CisgIAorICBFeHByICpnZXRTdWJFeHByKCkgeyByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByKTsgfQorICBjb25zdCBFeHByICpnZXRTdWJFeHByKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByKTsgfQorICAKKyAgT2JqQ01ldGhvZERlY2wgKmdldEJveGluZ01ldGhvZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQm94aW5nTWV0aG9kOyAKKyAgfQorICAKKyAgU291cmNlTG9jYXRpb24gZ2V0QXRMb2MoKSBjb25zdCB7IHJldHVybiBSYW5nZS5nZXRCZWdpbigpOyB9CisgIAorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUmFuZ2UuZ2V0QmVnaW4oKTsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJhbmdlLmdldEVuZCgpOyB9CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gUmFuZ2U7CisgIH0KKyAgCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsgcmV0dXJuIGNoaWxkX3JhbmdlKCZTdWJFeHByLCAmU3ViRXhwcisxKTsgfQorCisgIHVzaW5nIGNvbnN0X2FyZ19pdGVyYXRvciA9IENvbnN0RXhwckl0ZXJhdG9yOworCisgIGNvbnN0X2FyZ19pdGVyYXRvciBhcmdfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCBjb25zdCAqIGNvbnN0Kj4oJlN1YkV4cHIpOworICB9CisKKyAgY29uc3RfYXJnX2l0ZXJhdG9yIGFyZ19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCBjb25zdCAqIGNvbnN0Kj4oJlN1YkV4cHIgKyAxKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPYmpDQm94ZWRFeHByQ2xhc3M7CisgIH0KK307CisKKy8vLyBPYmpDQXJyYXlMaXRlcmFsIC0gdXNlZCBmb3Igb2JqZWN0aXZlLWMgYXJyYXkgY29udGFpbmVyczsgYXMgaW46CisvLy8gQFtAIkhlbGxvIiwgTlNBcHAsIFtOU051bWJlciBudW1iZXJXaXRoSW50OjQyXV07CitjbGFzcyBPYmpDQXJyYXlMaXRlcmFsIGZpbmFsCisgICAgOiBwdWJsaWMgRXhwciwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPE9iakNBcnJheUxpdGVyYWwsIEV4cHIgKj4geworICB1bnNpZ25lZCBOdW1FbGVtZW50czsKKyAgU291cmNlUmFuZ2UgUmFuZ2U7CisgIE9iakNNZXRob2REZWNsICpBcnJheVdpdGhPYmplY3RzTWV0aG9kOworCisgIE9iakNBcnJheUxpdGVyYWwoQXJyYXlSZWY8RXhwciAqPiBFbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULCBPYmpDTWV0aG9kRGVjbCAqIE1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBTUik7CisKKyAgZXhwbGljaXQgT2JqQ0FycmF5TGl0ZXJhbChFbXB0eVNoZWxsIEVtcHR5LCB1bnNpZ25lZCBOdW1FbGVtZW50cykKKyAgICAgIDogRXhwcihPYmpDQXJyYXlMaXRlcmFsQ2xhc3MsIEVtcHR5KSwgTnVtRWxlbWVudHMoTnVtRWxlbWVudHMpIHt9CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgc3RhdGljIE9iakNBcnJheUxpdGVyYWwgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwgT2JqQ01ldGhvZERlY2wgKiBNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgU1IpOworCisgIHN0YXRpYyBPYmpDQXJyYXlMaXRlcmFsICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtRWxlbWVudHMpOworCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSYW5nZS5nZXRCZWdpbigpOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUmFuZ2UuZ2V0RW5kKCk7IH0KKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJhbmdlOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBlbGVtZW50cyBvZiBhcnJheSBvZiBsaXRlcmFscy4KKyAgRXhwciAqKmdldEVsZW1lbnRzKCkgeyByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPEV4cHIgKj4oKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgZWxlbWVudHMgb2YgYXJyYXkgb2YgbGl0ZXJhbHMuCisgIGNvbnN0IEV4cHIgKiBjb25zdCAqZ2V0RWxlbWVudHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxFeHByICo+KCk7CisgIH0KKworICAvLy8gZ2V0TnVtRWxlbWVudHMgLSBSZXR1cm4gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIG9iamVjdGl2ZS1jIGFycmF5IGxpdGVyYWwuCisgIHVuc2lnbmVkIGdldE51bUVsZW1lbnRzKCkgY29uc3QgeyByZXR1cm4gTnVtRWxlbWVudHM7IH0KKyAgICAKKyAgLy8vIGdldEVsZW1lbnQgLSBSZXR1cm4gdGhlIEVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgRXhwciAqZ2V0RWxlbWVudCh1bnNpZ25lZCBJbmRleCkgeworICAgIGFzc2VydCgoSW5kZXggPCBOdW1FbGVtZW50cykgJiYgIkFyZyBhY2Nlc3Mgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBnZXRFbGVtZW50cygpW0luZGV4XTsKKyAgfQorICBjb25zdCBFeHByICpnZXRFbGVtZW50KHVuc2lnbmVkIEluZGV4KSBjb25zdCB7CisgICAgYXNzZXJ0KChJbmRleCA8IE51bUVsZW1lbnRzKSAmJiAiQXJnIGFjY2VzcyBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGdldEVsZW1lbnRzKClbSW5kZXhdOworICB9CisgICAgCisgIE9iakNNZXRob2REZWNsICpnZXRBcnJheVdpdGhPYmplY3RzTWV0aG9kKCkgY29uc3QgeworICAgIHJldHVybiBBcnJheVdpdGhPYmplY3RzTWV0aG9kOyAKKyAgfQorICAgIAorICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4oZ2V0RWxlbWVudHMoKSksCisgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4oZ2V0RWxlbWVudHMoKSkgKyBOdW1FbGVtZW50cyk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPYmpDQXJyYXlMaXRlcmFsQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQW4gZWxlbWVudCBpbiBhbiBPYmplY3RpdmUtQyBkaWN0aW9uYXJ5IGxpdGVyYWwuCisvLy8KK3N0cnVjdCBPYmpDRGljdGlvbmFyeUVsZW1lbnQgeworICAvLy8gXGJyaWVmIFRoZSBrZXkgZm9yIHRoZSBkaWN0aW9uYXJ5IGVsZW1lbnQuCisgIEV4cHIgKktleTsKKyAgCisgIC8vLyBcYnJpZWYgVGhlIHZhbHVlIG9mIHRoZSBkaWN0aW9uYXJ5IGVsZW1lbnQuCisgIEV4cHIgKlZhbHVlOworICAKKyAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIGVsbGlwc2lzLCBpZiB0aGlzIGlzIGEgcGFjayBleHBhbnNpb24uCisgIFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jOworICAKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoaXMgcGFjayBleHBhbnNpb24gd2lsbCBleHBhbmQgdG8sIGlmCisgIC8vLyB0aGlzIGlzIGEgcGFjayBleHBhbnNpb24gYW5kIGlzIGtub3duLgorICBPcHRpb25hbDx1bnNpZ25lZD4gTnVtRXhwYW5zaW9uczsKKworICAvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB0aGlzIGRpY3Rpb25hcnkgZWxlbWVudCBpcyBhIHBhY2sgZXhwYW5zaW9uLgorICBib29sIGlzUGFja0V4cGFuc2lvbigpIGNvbnN0IHsgcmV0dXJuIEVsbGlwc2lzTG9jLmlzVmFsaWQoKTsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNQb2RMaWtlPGNsYW5nOjpPYmpDRGljdGlvbmFyeUVsZW1lbnQ+IDogc3RkOjp0cnVlX3R5cGUge307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBJbnRlcm5hbCBzdHJ1Y3QgZm9yIHN0b3JpbmcgS2V5L3ZhbHVlIHBhaXIuCitzdHJ1Y3QgT2JqQ0RpY3Rpb25hcnlMaXRlcmFsX0tleVZhbHVlUGFpciB7CisgIEV4cHIgKktleTsKKyAgRXhwciAqVmFsdWU7Cit9OworCisvLy8gXGJyaWVmIEludGVybmFsIHN0cnVjdCB0byBkZXNjcmliZXMgYW4gZWxlbWVudCB0aGF0IGlzIGEgcGFjaworLy8vIGV4cGFuc2lvbiwgdXNlZCBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBkaWN0aW9uYXJ5IGxpdGVyYWwKKy8vLyBhcmUgcGFjayBleHBhbnNpb25zLgorc3RydWN0IE9iakNEaWN0aW9uYXJ5TGl0ZXJhbF9FeHBhbnNpb25EYXRhIHsKKyAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIGVsbGlwc2lzLCBpZiB0aGlzIGVsZW1lbnQgaXMgYSBwYWNrCisgIC8vLyBleHBhbnNpb24uCisgIFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jOworCisgIC8vLyBcYnJpZWYgSWYgbm9uLXplcm8sIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCB0aGlzIHBhY2sKKyAgLy8vIGV4cGFuc2lvbiB3aWxsIGV4cGFuZCB0byAoKzEpLgorICB1bnNpZ25lZCBOdW1FeHBhbnNpb25zUGx1c09uZTsKK307CisKKy8vLyBPYmpDRGljdGlvbmFyeUxpdGVyYWwgLSBBU1Qgbm9kZSB0byByZXByZXNlbnQgb2JqZWN0aXZlLWMgZGljdGlvbmFyeQorLy8vIGxpdGVyYWxzOyBhcyBpbjogIEB7QCJuYW1lIiA6IE5TVXNlck5hbWUoKSwgQCJkYXRlIiA6IFtOU0RhdGUgZGF0ZV0gfTsKK2NsYXNzIE9iakNEaWN0aW9uYXJ5TGl0ZXJhbCBmaW5hbAorICAgIDogcHVibGljIEV4cHIsCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxPYmpDRGljdGlvbmFyeUxpdGVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDRGljdGlvbmFyeUxpdGVyYWxfS2V5VmFsdWVQYWlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0RpY3Rpb25hcnlMaXRlcmFsX0V4cGFuc2lvbkRhdGE+IHsKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgZGljdGlvbmFyeSBsaXRlcmFsLgorICB1bnNpZ25lZCBOdW1FbGVtZW50cyA6IDMxOworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBkaWN0aW9uYXJ5IGxpdGVyYWwgaGFzIGFueSBwYWNrIGV4cGFuc2lvbnMuCisgIC8vLworICAvLy8gSWYgdGhlIGRpY3Rpb25hcnkgbGl0ZXJhbCBoYXMgcGFjayBleHBhbnNpb25zLCB0aGVuIHRoZXJlIHdpbGwKKyAgLy8vIGJlIGFuIGFycmF5IG9mIHBhY2sgZXhwYW5zaW9uIGRhdGEgZm9sbG93aW5nIHRoZSBhcnJheSBvZgorICAvLy8ga2V5L3ZhbHVlIHBhaXJzLCB3aGljaCBwcm92aWRlIHRoZSBsb2NhdGlvbnMgb2YgdGhlIGVsbGlwc2VzIChpZgorICAvLy8gYW55KSBhbmQgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBleHBhbnNpb24gKGlmIGtub3duKS4gSWYKKyAgLy8vIHRoZXJlIGFyZSBubyBwYWNrIGV4cGFuc2lvbnMsIHdlIG9wdGltaXplIGF3YXkgdGhpcyBzdG9yYWdlLgorICB1bnNpZ25lZCBIYXNQYWNrRXhwYW5zaW9ucyA6IDE7CisKKyAgU291cmNlUmFuZ2UgUmFuZ2U7CisgIE9iakNNZXRob2REZWNsICpEaWN0V2l0aE9iamVjdHNNZXRob2Q7CisKKyAgdXNpbmcgS2V5VmFsdWVQYWlyID0gT2JqQ0RpY3Rpb25hcnlMaXRlcmFsX0tleVZhbHVlUGFpcjsKKyAgdXNpbmcgRXhwYW5zaW9uRGF0YSA9IE9iakNEaWN0aW9uYXJ5TGl0ZXJhbF9FeHBhbnNpb25EYXRhOworCisgIE9iakNEaWN0aW9uYXJ5TGl0ZXJhbChBcnJheVJlZjxPYmpDRGljdGlvbmFyeUVsZW1lbnQ+IFZLLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzUGFja0V4cGFuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULCBPYmpDTWV0aG9kRGVjbCAqbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgU1IpOworCisgIGV4cGxpY2l0IE9iakNEaWN0aW9uYXJ5TGl0ZXJhbChFbXB0eVNoZWxsIEVtcHR5LCB1bnNpZ25lZCBOdW1FbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzUGFja0V4cGFuc2lvbnMpCisgICAgICA6IEV4cHIoT2JqQ0RpY3Rpb25hcnlMaXRlcmFsQ2xhc3MsIEVtcHR5KSwgTnVtRWxlbWVudHMoTnVtRWxlbWVudHMpLAorICAgICAgICBIYXNQYWNrRXhwYW5zaW9ucyhIYXNQYWNrRXhwYW5zaW9ucykge30KKworICBzaXplX3QgbnVtVHJhaWxpbmdPYmplY3RzKE92ZXJsb2FkVG9rZW48S2V5VmFsdWVQYWlyPikgY29uc3QgeworICAgIHJldHVybiBOdW1FbGVtZW50czsKKyAgfQorCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNUU3RtdFdyaXRlcjsKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKworICBzdGF0aWMgT2JqQ0RpY3Rpb25hcnlMaXRlcmFsICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9iakNEaWN0aW9uYXJ5RWxlbWVudD4gVkssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNQYWNrRXhwYW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIE9iakNNZXRob2REZWNsICptZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBTUik7CisgIAorICBzdGF0aWMgT2JqQ0RpY3Rpb25hcnlMaXRlcmFsICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1FbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNQYWNrRXhwYW5zaW9ucyk7CisgIAorICAvLy8gZ2V0TnVtRWxlbWVudHMgLSBSZXR1cm4gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIG9iamVjdGl2ZS1jIGRpY3Rpb25hcnkgCisgIC8vLyBsaXRlcmFsLgorICB1bnNpZ25lZCBnZXROdW1FbGVtZW50cygpIGNvbnN0IHsgcmV0dXJuIE51bUVsZW1lbnRzOyB9CisKKyAgT2JqQ0RpY3Rpb25hcnlFbGVtZW50IGdldEtleVZhbHVlRWxlbWVudCh1bnNpZ25lZCBJbmRleCkgY29uc3QgeworICAgIGFzc2VydCgoSW5kZXggPCBOdW1FbGVtZW50cykgJiYgIkFyZyBhY2Nlc3Mgb3V0IG9mIHJhbmdlISIpOworICAgIGNvbnN0IEtleVZhbHVlUGFpciAmS1YgPSBnZXRUcmFpbGluZ09iamVjdHM8S2V5VmFsdWVQYWlyPigpW0luZGV4XTsKKyAgICBPYmpDRGljdGlvbmFyeUVsZW1lbnQgUmVzdWx0ID0geyBLVi5LZXksIEtWLlZhbHVlLCBTb3VyY2VMb2NhdGlvbigpLCBOb25lIH07CisgICAgaWYgKEhhc1BhY2tFeHBhbnNpb25zKSB7CisgICAgICBjb25zdCBFeHBhbnNpb25EYXRhICZFeHBhbnNpb24gPQorICAgICAgICAgIGdldFRyYWlsaW5nT2JqZWN0czxFeHBhbnNpb25EYXRhPigpW0luZGV4XTsKKyAgICAgIFJlc3VsdC5FbGxpcHNpc0xvYyA9IEV4cGFuc2lvbi5FbGxpcHNpc0xvYzsKKyAgICAgIGlmIChFeHBhbnNpb24uTnVtRXhwYW5zaW9uc1BsdXNPbmUgPiAwKQorICAgICAgICBSZXN1bHQuTnVtRXhwYW5zaW9ucyA9IEV4cGFuc2lvbi5OdW1FeHBhbnNpb25zUGx1c09uZSAtIDE7CisgICAgfQorICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKyAgICAKKyAgT2JqQ01ldGhvZERlY2wgKmdldERpY3RXaXRoT2JqZWN0c01ldGhvZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRGljdFdpdGhPYmplY3RzTWV0aG9kOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJhbmdlLmdldEJlZ2luKCk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSYW5nZS5nZXRFbmQoKTsgfQorICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUmFuZ2U7IH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgLy8gTm90ZTogd2UncmUgdGFraW5nIGFkdmFudGFnZSBvZiB0aGUgbGF5b3V0IG9mIHRoZSBLZXlWYWx1ZVBhaXIgc3RydWN0CisgICAgLy8gaGVyZS4gSWYgdGhhdCBzdHJ1Y3QgY2hhbmdlcywgdGhpcyBjb2RlIHdpbGwgbmVlZCB0byBjaGFuZ2UgYXMgd2VsbC4KKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihLZXlWYWx1ZVBhaXIpID09IHNpemVvZihTdG10ICopICogMiwKKyAgICAgICAgICAgICAgICAgICJLZXlWYWx1ZVBhaXIgaXMgZXhwZWN0ZWQgc2l6ZSIpOworICAgIHJldHVybiBjaGlsZF9yYW5nZSgKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPihnZXRUcmFpbGluZ09iamVjdHM8S2V5VmFsdWVQYWlyPigpKSwKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPihnZXRUcmFpbGluZ09iamVjdHM8S2V5VmFsdWVQYWlyPigpKSArCisgICAgICAgICAgICBOdW1FbGVtZW50cyAqIDIpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9iakNEaWN0aW9uYXJ5TGl0ZXJhbENsYXNzOworICB9Cit9OworCisvLy8gT2JqQ0VuY29kZUV4cHIsIHVzZWQgZm9yIFxAZW5jb2RlIGluIE9iamVjdGl2ZS1DLiAgXEBlbmNvZGUgaGFzIHRoZSBzYW1lCisvLy8gdHlwZSBhbmQgYmVoYXZpb3IgYXMgU3RyaW5nTGl0ZXJhbCBleGNlcHQgdGhhdCB0aGUgc3RyaW5nIGluaXRpYWxpemVyIGlzCisvLy8gb2J0YWluZWQgZnJvbSBBU1RDb250ZXh0IHdpdGggdGhlIGVuY29kaW5nIHR5cGUgYXMgYW4gYXJndW1lbnQuCitjbGFzcyBPYmpDRW5jb2RlRXhwciA6IHB1YmxpYyBFeHByIHsKKyAgVHlwZVNvdXJjZUluZm8gKkVuY29kZWRUeXBlOworICBTb3VyY2VMb2NhdGlvbiBBdExvYywgUlBhcmVuTG9jOworCitwdWJsaWM6CisgIE9iakNFbmNvZGVFeHByKFF1YWxUeXBlIFQsIFR5cGVTb3VyY2VJbmZvICpFbmNvZGVkVHlwZSwKKyAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gYXQsIFNvdXJjZUxvY2F0aW9uIHJwKQorICAgICAgOiBFeHByKE9iakNFbmNvZGVFeHByQ2xhc3MsIFQsIFZLX0xWYWx1ZSwgT0tfT3JkaW5hcnksCisgICAgICAgICAgICAgRW5jb2RlZFR5cGUtPmdldFR5cGUoKS0+aXNEZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgICAgRW5jb2RlZFR5cGUtPmdldFR5cGUoKS0+aXNEZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgICAgRW5jb2RlZFR5cGUtPmdldFR5cGUoKS0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgIEVuY29kZWRUeXBlLT5nZXRUeXBlKCktPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksIAorICAgICAgICBFbmNvZGVkVHlwZShFbmNvZGVkVHlwZSksIEF0TG9jKGF0KSwgUlBhcmVuTG9jKHJwKSB7fQorCisgIGV4cGxpY2l0IE9iakNFbmNvZGVFeHByKEVtcHR5U2hlbGwgRW1wdHkpIDogRXhwcihPYmpDRW5jb2RlRXhwckNsYXNzLCBFbXB0eSl7fQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEF0TG9jKCkgY29uc3QgeyByZXR1cm4gQXRMb2M7IH0KKyAgdm9pZCBzZXRBdExvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IEF0TG9jID0gTDsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRSUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKyAgdm9pZCBzZXRSUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTCkgeyBSUGFyZW5Mb2MgPSBMOyB9CisKKyAgUXVhbFR5cGUgZ2V0RW5jb2RlZFR5cGUoKSBjb25zdCB7IHJldHVybiBFbmNvZGVkVHlwZS0+Z2V0VHlwZSgpOyB9CisKKyAgVHlwZVNvdXJjZUluZm8gKmdldEVuY29kZWRUeXBlU291cmNlSW5mbygpIGNvbnN0IHsgcmV0dXJuIEVuY29kZWRUeXBlOyB9CisKKyAgdm9pZCBzZXRFbmNvZGVkVHlwZVNvdXJjZUluZm8oVHlwZVNvdXJjZUluZm8gKkVuY1R5cGUpIHsgCisgICAgRW5jb2RlZFR5cGUgPSBFbmNUeXBlOyAKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBBdExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJQYXJlbkxvYzsgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoY2hpbGRfaXRlcmF0b3IoKSwgY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT2JqQ0VuY29kZUV4cHJDbGFzczsKKyAgfQorfTsKKworLy8vIE9iakNTZWxlY3RvckV4cHIgdXNlZCBmb3IgXEBzZWxlY3RvciBpbiBPYmplY3RpdmUtQy4KK2NsYXNzIE9iakNTZWxlY3RvckV4cHIgOiBwdWJsaWMgRXhwciB7CisgIFNlbGVjdG9yIFNlbE5hbWU7CisgIFNvdXJjZUxvY2F0aW9uIEF0TG9jLCBSUGFyZW5Mb2M7CisKK3B1YmxpYzoKKyAgT2JqQ1NlbGVjdG9yRXhwcihRdWFsVHlwZSBULCBTZWxlY3RvciBzZWxJbmZvLAorICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIGF0LCBTb3VyY2VMb2NhdGlvbiBycCkKKyAgICAgIDogRXhwcihPYmpDU2VsZWN0b3JFeHByQ2xhc3MsIFQsIFZLX1JWYWx1ZSwgT0tfT3JkaW5hcnksIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpLAorICAgICAgICBTZWxOYW1lKHNlbEluZm8pLCBBdExvYyhhdCksIFJQYXJlbkxvYyhycCkge30KKyAgZXhwbGljaXQgT2JqQ1NlbGVjdG9yRXhwcihFbXB0eVNoZWxsIEVtcHR5KQorICAgICAgOiBFeHByKE9iakNTZWxlY3RvckV4cHJDbGFzcywgRW1wdHkpIHt9CisKKyAgU2VsZWN0b3IgZ2V0U2VsZWN0b3IoKSBjb25zdCB7IHJldHVybiBTZWxOYW1lOyB9CisgIHZvaWQgc2V0U2VsZWN0b3IoU2VsZWN0b3IgUykgeyBTZWxOYW1lID0gUzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEF0TG9jKCkgY29uc3QgeyByZXR1cm4gQXRMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0UlBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gUlBhcmVuTG9jOyB9CisgIHZvaWQgc2V0QXRMb2MoU291cmNlTG9jYXRpb24gTCkgeyBBdExvYyA9IEw7IH0KKyAgdm9pZCBzZXRSUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTCkgeyBSUGFyZW5Mb2MgPSBMOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIEF0TG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUlBhcmVuTG9jOyB9CisKKyAgLy8vIGdldE51bUFyZ3MgLSBSZXR1cm4gdGhlIG51bWJlciBvZiBhY3R1YWwgYXJndW1lbnRzIHRvIHRoaXMgY2FsbC4KKyAgdW5zaWduZWQgZ2V0TnVtQXJncygpIGNvbnN0IHsgcmV0dXJuIFNlbE5hbWUuZ2V0TnVtQXJncygpOyB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPYmpDU2VsZWN0b3JFeHByQ2xhc3M7CisgIH0KK307CisKKy8vLyBPYmpDUHJvdG9jb2xFeHByIHVzZWQgZm9yIHByb3RvY29sIGV4cHJlc3Npb24gaW4gT2JqZWN0aXZlLUMuCisvLy8KKy8vLyBUaGlzIGlzIHVzZWQgYXM6IFxAcHJvdG9jb2woZm9vKSwgYXMgaW46CisvLy8gXGNvZGUKKy8vLyAgIFtvYmogY29uZm9ybXNUb1Byb3RvY29sOkBwcm90b2NvbChmb28pXQorLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGUgcmV0dXJuIHR5cGUgaXMgIlByb3RvY29sKiIuCitjbGFzcyBPYmpDUHJvdG9jb2xFeHByIDogcHVibGljIEV4cHIgeworICBPYmpDUHJvdG9jb2xEZWNsICpUaGVQcm90b2NvbDsKKyAgU291cmNlTG9jYXRpb24gQXRMb2MsIFByb3RvTG9jLCBSUGFyZW5Mb2M7CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10V3JpdGVyOworCisgIE9iakNQcm90b2NvbEV4cHIoUXVhbFR5cGUgVCwgT2JqQ1Byb3RvY29sRGVjbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIGF0LCBTb3VyY2VMb2NhdGlvbiBwcm90b0xvYywgU291cmNlTG9jYXRpb24gcnApCisgICAgICA6IEV4cHIoT2JqQ1Byb3RvY29sRXhwckNsYXNzLCBULCBWS19SVmFsdWUsIE9LX09yZGluYXJ5LCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgVGhlUHJvdG9jb2wocHJvdG9jb2wpLCBBdExvYyhhdCksIFByb3RvTG9jKHByb3RvTG9jKSwgUlBhcmVuTG9jKHJwKSB7fQorICBleHBsaWNpdCBPYmpDUHJvdG9jb2xFeHByKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgICA6IEV4cHIoT2JqQ1Byb3RvY29sRXhwckNsYXNzLCBFbXB0eSkge30KKworICBPYmpDUHJvdG9jb2xEZWNsICpnZXRQcm90b2NvbCgpIGNvbnN0IHsgcmV0dXJuIFRoZVByb3RvY29sOyB9CisgIHZvaWQgc2V0UHJvdG9jb2woT2JqQ1Byb3RvY29sRGVjbCAqUCkgeyBUaGVQcm90b2NvbCA9IFA7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRQcm90b2NvbElkTG9jKCkgY29uc3QgeyByZXR1cm4gUHJvdG9Mb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0QXRMb2MoKSBjb25zdCB7IHJldHVybiBBdExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRSUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKyAgdm9pZCBzZXRBdExvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IEF0TG9jID0gTDsgfQorICB2b2lkIHNldFJQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IFJQYXJlbkxvYyA9IEw7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gQXRMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9iakNQcm90b2NvbEV4cHJDbGFzczsKKyAgfQorfTsKKworLy8vIE9iakNJdmFyUmVmRXhwciAtIEEgcmVmZXJlbmNlIHRvIGFuIE9iakMgaW5zdGFuY2UgdmFyaWFibGUuCitjbGFzcyBPYmpDSXZhclJlZkV4cHIgOiBwdWJsaWMgRXhwciB7CisgIE9iakNJdmFyRGVjbCAqRDsKKyAgU3RtdCAqQmFzZTsKKyAgU291cmNlTG9jYXRpb24gTG9jOworCisgIC8vLyBPcExvYyAtIFRoaXMgaXMgdGhlIGxvY2F0aW9uIG9mICcuJyBvciAnLT4nCisgIFNvdXJjZUxvY2F0aW9uIE9wTG9jOworCisgIC8vIFRydWUgaWYgdGhpcyBpcyAiWC0+RiIsIGZhbHNlIGlmIHRoaXMgaXMgIlguRiIuCisgIGJvb2wgSXNBcnJvdyA6IDE7CisKKyAgLy8gVHJ1ZSBpZiBpdmFyIHJlZmVyZW5jZSBoYXMgbm8gYmFzZSAoc2VsZiBhc3N1bWVkKS4KKyAgYm9vbCBJc0ZyZWVJdmFyIDogMTsKKworcHVibGljOgorICBPYmpDSXZhclJlZkV4cHIoT2JqQ0l2YXJEZWNsICpkLCBRdWFsVHlwZSB0LAorICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gbCwgU291cmNlTG9jYXRpb24gb3Bsb2MsCisgICAgICAgICAgICAgICAgICBFeHByICpiYXNlLAorICAgICAgICAgICAgICAgICAgYm9vbCBhcnJvdyA9IGZhbHNlLCBib29sIGZyZWVJdmFyID0gZmFsc2UpCisgICAgICA6IEV4cHIoT2JqQ0l2YXJSZWZFeHByQ2xhc3MsIHQsIFZLX0xWYWx1ZSwKKyAgICAgICAgICAgICBkLT5pc0JpdEZpZWxkKCkgPyBPS19CaXRGaWVsZCA6IE9LX09yZGluYXJ5LAorICAgICAgICAgICAgIC8qVHlwZURlcGVuZGVudD0qL2ZhbHNlLCBiYXNlLT5pc1ZhbHVlRGVwZW5kZW50KCksIAorICAgICAgICAgICAgIGJhc2UtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpLAorICAgICAgICAgICAgIGJhc2UtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksIAorICAgICAgICBEKGQpLCBCYXNlKGJhc2UpLCBMb2MobCksIE9wTG9jKG9wbG9jKSwgSXNBcnJvdyhhcnJvdyksCisgICAgICAgIElzRnJlZUl2YXIoZnJlZUl2YXIpIHt9CisKKyAgZXhwbGljaXQgT2JqQ0l2YXJSZWZFeHByKEVtcHR5U2hlbGwgRW1wdHkpCisgICAgICA6IEV4cHIoT2JqQ0l2YXJSZWZFeHByQ2xhc3MsIEVtcHR5KSB7fQorCisgIE9iakNJdmFyRGVjbCAqZ2V0RGVjbCgpIHsgcmV0dXJuIEQ7IH0KKyAgY29uc3QgT2JqQ0l2YXJEZWNsICpnZXREZWNsKCkgY29uc3QgeyByZXR1cm4gRDsgfQorICB2b2lkIHNldERlY2woT2JqQ0l2YXJEZWNsICpkKSB7IEQgPSBkOyB9CisKKyAgY29uc3QgRXhwciAqZ2V0QmFzZSgpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8RXhwcj4oQmFzZSk7IH0KKyAgRXhwciAqZ2V0QmFzZSgpIHsgcmV0dXJuIGNhc3Q8RXhwcj4oQmFzZSk7IH0KKyAgdm9pZCBzZXRCYXNlKEV4cHIgKiBiYXNlKSB7IEJhc2UgPSBiYXNlOyB9CisKKyAgYm9vbCBpc0Fycm93KCkgY29uc3QgeyByZXR1cm4gSXNBcnJvdzsgfQorICBib29sIGlzRnJlZUl2YXIoKSBjb25zdCB7IHJldHVybiBJc0ZyZWVJdmFyOyB9CisgIHZvaWQgc2V0SXNBcnJvdyhib29sIEEpIHsgSXNBcnJvdyA9IEE7IH0KKyAgdm9pZCBzZXRJc0ZyZWVJdmFyKGJvb2wgQSkgeyBJc0ZyZWVJdmFyID0gQTsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9CisgIHZvaWQgc2V0TG9jYXRpb24oU291cmNlTG9jYXRpb24gTCkgeyBMb2MgPSBMOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gaXNGcmVlSXZhcigpID8gTG9jIDogZ2V0QmFzZSgpLT5nZXRMb2NTdGFydCgpOworICB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gTG9jOyB9CisgIAorICBTb3VyY2VMb2NhdGlvbiBnZXRPcExvYygpIGNvbnN0IHsgcmV0dXJuIE9wTG9jOyB9CisgIHZvaWQgc2V0T3BMb2MoU291cmNlTG9jYXRpb24gTCkgeyBPcExvYyA9IEw7IH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7IHJldHVybiBjaGlsZF9yYW5nZSgmQmFzZSwgJkJhc2UrMSk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT2JqQ0l2YXJSZWZFeHByQ2xhc3M7CisgIH0KK307CisKKy8vLyBPYmpDUHJvcGVydHlSZWZFeHByIC0gQSBkb3Qtc3ludGF4IGV4cHJlc3Npb24gdG8gYWNjZXNzIGFuIE9iakMKKy8vLyBwcm9wZXJ0eS4KK2NsYXNzIE9iakNQcm9wZXJ0eVJlZkV4cHIgOiBwdWJsaWMgRXhwciB7Citwcml2YXRlOgorICAvLy8gSWYgdGhlIGJvb2wgaXMgdHJ1ZSwgdGhpcyBpcyBhbiBpbXBsaWNpdCBwcm9wZXJ0eSByZWZlcmVuY2U7IHRoZQorICAvLy8gcG9pbnRlciBpcyBhbiAob3B0aW9uYWwpIE9iakNNZXRob2REZWNsIGFuZCBTZXR0ZXIgbWF5IGJlIHNldC4KKyAgLy8vIGlmIHRoZSBib29sIGlzIGZhbHNlLCB0aGlzIGlzIGFuIGV4cGxpY2l0IHByb3BlcnR5IHJlZmVyZW5jZTsKKyAgLy8vIHRoZSBwb2ludGVyIGlzIGFuIE9iakNQcm9wZXJ0eURlY2wgYW5kIFNldHRlciBpcyBhbHdheXMgbnVsbC4KKyAgbGx2bTo6UG9pbnRlckludFBhaXI8TmFtZWREZWNsICosIDEsIGJvb2w+IFByb3BlcnR5T3JHZXR0ZXI7CisKKyAgLy8vIFxicmllZiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJvcGVydHkgcmVmZXJlbmNlIHdpbGwgcmVzdWx0IGluIGEgbWVzc2FnZQorICAvLy8gdG8gdGhlIGdldHRlciwgdGhlIHNldHRlciwgb3IgYm90aC4KKyAgLy8vIFRoaXMgYXBwbGllcyB0byBib3RoIGltcGxpY2l0IGFuZCBleHBsaWNpdCBwcm9wZXJ0eSByZWZlcmVuY2VzLgorICBlbnVtIE1ldGhvZFJlZkZsYWdzIHsKKyAgICBNZXRob2RSZWZfTm9uZSA9IDAsCisgICAgTWV0aG9kUmVmX0dldHRlciA9IDB4MSwKKyAgICBNZXRob2RSZWZfU2V0dGVyID0gMHgyCisgIH07CisKKyAgLy8vIFxicmllZiBDb250YWlucyB0aGUgU2V0dGVyIG1ldGhvZCBwb2ludGVyIGFuZCBNZXRob2RSZWZGbGFncyBiaXQgZmxhZ3MuCisgIGxsdm06OlBvaW50ZXJJbnRQYWlyPE9iakNNZXRob2REZWNsICosIDIsIHVuc2lnbmVkPiBTZXR0ZXJBbmRNZXRob2RSZWZGbGFnczsKKworICAvLyBGSVhNRTogTWF5YmUgd2Ugc2hvdWxkIHN0b3JlIHRoZSBwcm9wZXJ0eSBpZGVudGlmaWVyIGhlcmUsCisgIC8vIGJlY2F1c2UgaXQncyBub3QgcmVkZXJpdmFibGUgZnJvbSB0aGUgb3RoZXIgZGF0YSB3aGVuIHRoZXJlJ3MgYW4KKyAgLy8gaW1wbGljaXQgcHJvcGVydHkgd2l0aCBubyBnZXR0ZXIgKGJlY2F1c2UgdGhlICdmb28nIC0+ICdzZXRGb286JworICAvLyB0cmFuc2Zvcm1hdGlvbiBpcyBsb3NzeSBvbiB0aGUgZmlyc3QgY2hhcmFjdGVyKS4KKworICBTb3VyY2VMb2NhdGlvbiBJZExvYzsKKyAgCisgIC8vLyBcYnJpZWYgV2hlbiB0aGUgcmVjZWl2ZXIgaW4gcHJvcGVydHkgYWNjZXNzIGlzICdzdXBlcicsIHRoaXMgaXMKKyAgLy8vIHRoZSBsb2NhdGlvbiBvZiB0aGUgJ3N1cGVyJyBrZXl3b3JkLiAgV2hlbiBpdCdzIGFuIGludGVyZmFjZSwKKyAgLy8vIHRoaXMgaXMgdGhhdCBpbnRlcmZhY2UuCisgIFNvdXJjZUxvY2F0aW9uIFJlY2VpdmVyTG9jOworICBsbHZtOjpQb2ludGVyVW5pb24zPFN0bXQgKiwgY29uc3QgVHlwZSAqLCBPYmpDSW50ZXJmYWNlRGVjbCAqPiBSZWNlaXZlcjsKKyAgCitwdWJsaWM6CisgIE9iakNQcm9wZXJ0eVJlZkV4cHIoT2JqQ1Byb3BlcnR5RGVjbCAqUEQsIFF1YWxUeXBlIHQsCisgICAgICAgICAgICAgICAgICAgICAgRXhwclZhbHVlS2luZCBWSywgRXhwck9iamVjdEtpbmQgT0ssCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gbCwgRXhwciAqYmFzZSkKKyAgICAgIDogRXhwcihPYmpDUHJvcGVydHlSZWZFeHByQ2xhc3MsIHQsIFZLLCBPSywKKyAgICAgICAgICAgICAvKlR5cGVEZXBlbmRlbnQ9Ki9mYWxzZSwgYmFzZS0+aXNWYWx1ZURlcGVuZGVudCgpLAorICAgICAgICAgICAgIGJhc2UtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpLAorICAgICAgICAgICAgIGJhc2UtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIFByb3BlcnR5T3JHZXR0ZXIoUEQsIGZhbHNlKSwgSWRMb2MobCksIFJlY2VpdmVyKGJhc2UpIHsKKyAgICBhc3NlcnQodC0+aXNTcGVjaWZpY1BsYWNlaG9sZGVyVHlwZShCdWlsdGluVHlwZTo6UHNldWRvT2JqZWN0KSk7CisgIH0KKyAgCisgIE9iakNQcm9wZXJ0eVJlZkV4cHIoT2JqQ1Byb3BlcnR5RGVjbCAqUEQsIFF1YWxUeXBlIHQsCisgICAgICAgICAgICAgICAgICAgICAgRXhwclZhbHVlS2luZCBWSywgRXhwck9iamVjdEtpbmQgT0ssCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gbCwgU291cmNlTG9jYXRpb24gc2wsIFF1YWxUeXBlIHN0KQorICAgICAgOiBFeHByKE9iakNQcm9wZXJ0eVJlZkV4cHJDbGFzcywgdCwgVkssIE9LLAorICAgICAgICAgICAgIC8qVHlwZURlcGVuZGVudD0qL2ZhbHNlLCBmYWxzZSwgc3QtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudFR5cGUoKSwKKyAgICAgICAgICAgICBzdC0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSwKKyAgICAgICAgUHJvcGVydHlPckdldHRlcihQRCwgZmFsc2UpLCBJZExvYyhsKSwgUmVjZWl2ZXJMb2Moc2wpLAorICAgICAgICBSZWNlaXZlcihzdC5nZXRUeXBlUHRyKCkpIHsKKyAgICBhc3NlcnQodC0+aXNTcGVjaWZpY1BsYWNlaG9sZGVyVHlwZShCdWlsdGluVHlwZTo6UHNldWRvT2JqZWN0KSk7CisgIH0KKworICBPYmpDUHJvcGVydHlSZWZFeHByKE9iakNNZXRob2REZWNsICpHZXR0ZXIsIE9iakNNZXRob2REZWNsICpTZXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwgRXhwclZhbHVlS2luZCBWSywgRXhwck9iamVjdEtpbmQgT0ssCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRMb2MsIEV4cHIgKkJhc2UpCisgICAgICA6IEV4cHIoT2JqQ1Byb3BlcnR5UmVmRXhwckNsYXNzLCBULCBWSywgT0ssIGZhbHNlLAorICAgICAgICAgICAgIEJhc2UtPmlzVmFsdWVEZXBlbmRlbnQoKSwgQmFzZS0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCksCisgICAgICAgICAgICAgQmFzZS0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSwKKyAgICAgICAgUHJvcGVydHlPckdldHRlcihHZXR0ZXIsIHRydWUpLCBTZXR0ZXJBbmRNZXRob2RSZWZGbGFncyhTZXR0ZXIsIDApLAorICAgICAgICBJZExvYyhJZExvYyksIFJlY2VpdmVyKEJhc2UpIHsKKyAgICBhc3NlcnQoVC0+aXNTcGVjaWZpY1BsYWNlaG9sZGVyVHlwZShCdWlsdGluVHlwZTo6UHNldWRvT2JqZWN0KSk7CisgIH0KKworICBPYmpDUHJvcGVydHlSZWZFeHByKE9iakNNZXRob2REZWNsICpHZXR0ZXIsIE9iakNNZXRob2REZWNsICpTZXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwgRXhwclZhbHVlS2luZCBWSywgRXhwck9iamVjdEtpbmQgT0ssCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3VwZXJMb2MsIFF1YWxUeXBlIFN1cGVyVHkpCisgICAgICA6IEV4cHIoT2JqQ1Byb3BlcnR5UmVmRXhwckNsYXNzLCBULCBWSywgT0ssIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgUHJvcGVydHlPckdldHRlcihHZXR0ZXIsIHRydWUpLCBTZXR0ZXJBbmRNZXRob2RSZWZGbGFncyhTZXR0ZXIsIDApLAorICAgICAgICBJZExvYyhJZExvYyksIFJlY2VpdmVyTG9jKFN1cGVyTG9jKSwgUmVjZWl2ZXIoU3VwZXJUeS5nZXRUeXBlUHRyKCkpIHsKKyAgICBhc3NlcnQoVC0+aXNTcGVjaWZpY1BsYWNlaG9sZGVyVHlwZShCdWlsdGluVHlwZTo6UHNldWRvT2JqZWN0KSk7CisgIH0KKworICBPYmpDUHJvcGVydHlSZWZFeHByKE9iakNNZXRob2REZWNsICpHZXR0ZXIsIE9iakNNZXRob2REZWNsICpTZXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwgRXhwclZhbHVlS2luZCBWSywgRXhwck9iamVjdEtpbmQgT0ssCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUmVjZWl2ZXJMb2MsIE9iakNJbnRlcmZhY2VEZWNsICpSZWNlaXZlcikKKyAgICAgIDogRXhwcihPYmpDUHJvcGVydHlSZWZFeHByQ2xhc3MsIFQsIFZLLCBPSywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICBQcm9wZXJ0eU9yR2V0dGVyKEdldHRlciwgdHJ1ZSksIFNldHRlckFuZE1ldGhvZFJlZkZsYWdzKFNldHRlciwgMCksCisgICAgICAgIElkTG9jKElkTG9jKSwgUmVjZWl2ZXJMb2MoUmVjZWl2ZXJMb2MpLCBSZWNlaXZlcihSZWNlaXZlcikgeworICAgIGFzc2VydChULT5pc1NwZWNpZmljUGxhY2Vob2xkZXJUeXBlKEJ1aWx0aW5UeXBlOjpQc2V1ZG9PYmplY3QpKTsKKyAgfQorCisgIGV4cGxpY2l0IE9iakNQcm9wZXJ0eVJlZkV4cHIoRW1wdHlTaGVsbCBFbXB0eSkKKyAgICAgIDogRXhwcihPYmpDUHJvcGVydHlSZWZFeHByQ2xhc3MsIEVtcHR5KSB7fQorCisgIGJvb2wgaXNJbXBsaWNpdFByb3BlcnR5KCkgY29uc3QgeyByZXR1cm4gUHJvcGVydHlPckdldHRlci5nZXRJbnQoKTsgfQorICBib29sIGlzRXhwbGljaXRQcm9wZXJ0eSgpIGNvbnN0IHsgcmV0dXJuICFQcm9wZXJ0eU9yR2V0dGVyLmdldEludCgpOyB9CisKKyAgT2JqQ1Byb3BlcnR5RGVjbCAqZ2V0RXhwbGljaXRQcm9wZXJ0eSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzSW1wbGljaXRQcm9wZXJ0eSgpKTsKKyAgICByZXR1cm4gY2FzdDxPYmpDUHJvcGVydHlEZWNsPihQcm9wZXJ0eU9yR2V0dGVyLmdldFBvaW50ZXIoKSk7CisgIH0KKworICBPYmpDTWV0aG9kRGVjbCAqZ2V0SW1wbGljaXRQcm9wZXJ0eUdldHRlcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNJbXBsaWNpdFByb3BlcnR5KCkpOworICAgIHJldHVybiBjYXN0X29yX251bGw8T2JqQ01ldGhvZERlY2w+KFByb3BlcnR5T3JHZXR0ZXIuZ2V0UG9pbnRlcigpKTsKKyAgfQorCisgIE9iakNNZXRob2REZWNsICpnZXRJbXBsaWNpdFByb3BlcnR5U2V0dGVyKCkgY29uc3QgeworICAgIGFzc2VydChpc0ltcGxpY2l0UHJvcGVydHkoKSk7CisgICAgcmV0dXJuIFNldHRlckFuZE1ldGhvZFJlZkZsYWdzLmdldFBvaW50ZXIoKTsKKyAgfQorCisgIFNlbGVjdG9yIGdldEdldHRlclNlbGVjdG9yKCkgY29uc3QgeworICAgIGlmIChpc0ltcGxpY2l0UHJvcGVydHkoKSkKKyAgICAgIHJldHVybiBnZXRJbXBsaWNpdFByb3BlcnR5R2V0dGVyKCktPmdldFNlbGVjdG9yKCk7CisgICAgcmV0dXJuIGdldEV4cGxpY2l0UHJvcGVydHkoKS0+Z2V0R2V0dGVyTmFtZSgpOworICB9CisKKyAgU2VsZWN0b3IgZ2V0U2V0dGVyU2VsZWN0b3IoKSBjb25zdCB7CisgICAgaWYgKGlzSW1wbGljaXRQcm9wZXJ0eSgpKQorICAgICAgcmV0dXJuIGdldEltcGxpY2l0UHJvcGVydHlTZXR0ZXIoKS0+Z2V0U2VsZWN0b3IoKTsKKyAgICByZXR1cm4gZ2V0RXhwbGljaXRQcm9wZXJ0eSgpLT5nZXRTZXR0ZXJOYW1lKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhlIHByb3BlcnR5IHJlZmVyZW5jZSB3aWxsIHJlc3VsdCBpbiBhIG1lc3NhZ2UgdG8gdGhlCisgIC8vLyBnZXR0ZXIuCisgIC8vLyBUaGlzIGFwcGxpZXMgdG8gYm90aCBpbXBsaWNpdCBhbmQgZXhwbGljaXQgcHJvcGVydHkgcmVmZXJlbmNlcy4KKyAgYm9vbCBpc01lc3NhZ2luZ0dldHRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gU2V0dGVyQW5kTWV0aG9kUmVmRmxhZ3MuZ2V0SW50KCkgJiBNZXRob2RSZWZfR2V0dGVyOworICB9CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoZSBwcm9wZXJ0eSByZWZlcmVuY2Ugd2lsbCByZXN1bHQgaW4gYSBtZXNzYWdlIHRvIHRoZQorICAvLy8gc2V0dGVyLgorICAvLy8gVGhpcyBhcHBsaWVzIHRvIGJvdGggaW1wbGljaXQgYW5kIGV4cGxpY2l0IHByb3BlcnR5IHJlZmVyZW5jZXMuCisgIGJvb2wgaXNNZXNzYWdpbmdTZXR0ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFNldHRlckFuZE1ldGhvZFJlZkZsYWdzLmdldEludCgpICYgTWV0aG9kUmVmX1NldHRlcjsKKyAgfQorCisgIHZvaWQgc2V0SXNNZXNzYWdpbmdHZXR0ZXIoYm9vbCB2YWwgPSB0cnVlKSB7CisgICAgc2V0TWV0aG9kUmVmRmxhZyhNZXRob2RSZWZfR2V0dGVyLCB2YWwpOworICB9CisKKyAgdm9pZCBzZXRJc01lc3NhZ2luZ1NldHRlcihib29sIHZhbCA9IHRydWUpIHsKKyAgICBzZXRNZXRob2RSZWZGbGFnKE1ldGhvZFJlZl9TZXR0ZXIsIHZhbCk7CisgIH0KKworICBjb25zdCBFeHByICpnZXRCYXNlKCkgY29uc3QgeyAKKyAgICByZXR1cm4gY2FzdDxFeHByPihSZWNlaXZlci5nZXQ8U3RtdCo+KCkpOyAKKyAgfQorICBFeHByICpnZXRCYXNlKCkgeyAKKyAgICByZXR1cm4gY2FzdDxFeHByPihSZWNlaXZlci5nZXQ8U3RtdCo+KCkpOyAKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gSWRMb2M7IH0KKyAgCisgIFNvdXJjZUxvY2F0aW9uIGdldFJlY2VpdmVyTG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBSZWNlaXZlckxvYzsgfQorCisgIFF1YWxUeXBlIGdldFN1cGVyUmVjZWl2ZXJUeXBlKCkgY29uc3QgeyAKKyAgICByZXR1cm4gUXVhbFR5cGUoUmVjZWl2ZXIuZ2V0PGNvbnN0IFR5cGUqPigpLCAwKTsgCisgIH0KKworICBPYmpDSW50ZXJmYWNlRGVjbCAqZ2V0Q2xhc3NSZWNlaXZlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVjZWl2ZXIuZ2V0PE9iakNJbnRlcmZhY2VEZWNsKj4oKTsKKyAgfQorCisgIGJvb2wgaXNPYmplY3RSZWNlaXZlcigpIGNvbnN0IHsgcmV0dXJuIFJlY2VpdmVyLmlzPFN0bXQqPigpOyB9CisgIGJvb2wgaXNTdXBlclJlY2VpdmVyKCkgY29uc3QgeyByZXR1cm4gUmVjZWl2ZXIuaXM8Y29uc3QgVHlwZSo+KCk7IH0KKyAgYm9vbCBpc0NsYXNzUmVjZWl2ZXIoKSBjb25zdCB7IHJldHVybiBSZWNlaXZlci5pczxPYmpDSW50ZXJmYWNlRGVjbCo+KCk7IH0KKworICAvLy8gRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRoZSBiYXNlLCByZWdhcmRsZXNzIG9mIHRoZSBraW5kIG9mIHJlY2VpdmVyLgorICBRdWFsVHlwZSBnZXRSZWNlaXZlclR5cGUoY29uc3QgQVNUQ29udGV4dCAmY3R4KSBjb25zdDsKKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBpc09iamVjdFJlY2VpdmVyKCkgPyBnZXRCYXNlKCktPmdldExvY1N0YXJ0KCkgOmdldFJlY2VpdmVyTG9jYXRpb24oKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gSWRMb2M7IH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgaWYgKFJlY2VpdmVyLmlzPFN0bXQqPigpKSB7CisgICAgICBTdG10ICoqYmVnaW4gPSByZWludGVycHJldF9jYXN0PFN0bXQqKj4oJlJlY2VpdmVyKTsgLy8gaGFjayEKKyAgICAgIHJldHVybiBjaGlsZF9yYW5nZShiZWdpbiwgYmVnaW4rMSk7CisgICAgfQorICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPYmpDUHJvcGVydHlSZWZFeHByQ2xhc3M7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10V3JpdGVyOworCisgIHZvaWQgc2V0RXhwbGljaXRQcm9wZXJ0eShPYmpDUHJvcGVydHlEZWNsICpELCB1bnNpZ25lZCBtZXRoUmVmRmxhZ3MpIHsKKyAgICBQcm9wZXJ0eU9yR2V0dGVyLnNldFBvaW50ZXIoRCk7CisgICAgUHJvcGVydHlPckdldHRlci5zZXRJbnQoZmFsc2UpOworICAgIFNldHRlckFuZE1ldGhvZFJlZkZsYWdzLnNldFBvaW50ZXIobnVsbHB0cik7CisgICAgU2V0dGVyQW5kTWV0aG9kUmVmRmxhZ3Muc2V0SW50KG1ldGhSZWZGbGFncyk7CisgIH0KKworICB2b2lkIHNldEltcGxpY2l0UHJvcGVydHkoT2JqQ01ldGhvZERlY2wgKkdldHRlciwgT2JqQ01ldGhvZERlY2wgKlNldHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1ldGhSZWZGbGFncykgeworICAgIFByb3BlcnR5T3JHZXR0ZXIuc2V0UG9pbnRlcihHZXR0ZXIpOworICAgIFByb3BlcnR5T3JHZXR0ZXIuc2V0SW50KHRydWUpOworICAgIFNldHRlckFuZE1ldGhvZFJlZkZsYWdzLnNldFBvaW50ZXIoU2V0dGVyKTsKKyAgICBTZXR0ZXJBbmRNZXRob2RSZWZGbGFncy5zZXRJbnQobWV0aFJlZkZsYWdzKTsKKyAgfQorCisgIHZvaWQgc2V0QmFzZShFeHByICpCYXNlKSB7IFJlY2VpdmVyID0gQmFzZTsgfQorICB2b2lkIHNldFN1cGVyUmVjZWl2ZXIoUXVhbFR5cGUgVCkgeyBSZWNlaXZlciA9IFQuZ2V0VHlwZVB0cigpOyB9CisgIHZvaWQgc2V0Q2xhc3NSZWNlaXZlcihPYmpDSW50ZXJmYWNlRGVjbCAqRCkgeyBSZWNlaXZlciA9IEQ7IH0KKworICB2b2lkIHNldExvY2F0aW9uKFNvdXJjZUxvY2F0aW9uIEwpIHsgSWRMb2MgPSBMOyB9CisgIHZvaWQgc2V0UmVjZWl2ZXJMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBMb2MpIHsgUmVjZWl2ZXJMb2MgPSBMb2M7IH0KKworICB2b2lkIHNldE1ldGhvZFJlZkZsYWcoTWV0aG9kUmVmRmxhZ3MgZmxhZywgYm9vbCB2YWwpIHsKKyAgICB1bnNpZ25lZCBmID0gU2V0dGVyQW5kTWV0aG9kUmVmRmxhZ3MuZ2V0SW50KCk7CisgICAgaWYgKHZhbCkKKyAgICAgIGYgfD0gZmxhZzsKKyAgICBlbHNlCisgICAgICBmICY9IH5mbGFnOworICAgIFNldHRlckFuZE1ldGhvZFJlZkZsYWdzLnNldEludChmKTsKKyAgfQorfTsKKyAgCisvLy8gT2JqQ1N1YnNjcmlwdFJlZkV4cHIgLSB1c2VkIGZvciBhcnJheSBhbmQgZGljdGlvbmFyeSBzdWJzY3JpcHRpbmcuCisvLy8gYXJyYXlbNF0gPSBhcnJheVszXTsgZGljdGlvbmFyeVtrZXldID0gZGljdGlvbmFyeVthbHRfa2V5XTsKK2NsYXNzIE9iakNTdWJzY3JpcHRSZWZFeHByIDogcHVibGljIEV4cHIgeworICAvLyBMb2NhdGlvbiBvZiAnXScgaW4gYW4gaW5kZXhpbmcgZXhwcmVzc2lvbi4KKyAgU291cmNlTG9jYXRpb24gUkJyYWNrZXQ7CisKKyAgLy8gYXJyYXkvZGljdGlvbmFyeSBiYXNlIGV4cHJlc3Npb24uCisgIC8vIGZvciBhcnJheXMsIHRoaXMgaXMgYSBudW1lcmljIGV4cHJlc3Npb24uIEZvciBkaWN0aW9uYXJpZXMsIHRoaXMgaXMKKyAgLy8gYW4gb2JqZWN0aXZlLWMgb2JqZWN0IHBvaW50ZXIgZXhwcmVzc2lvbi4KKyAgZW51bSB7IEJBU0UsIEtFWSwgRU5EX0VYUFIgfTsKKyAgU3RtdCogU3ViRXhwcnNbRU5EX0VYUFJdOworICAKKyAgT2JqQ01ldGhvZERlY2wgKkdldEF0SW5kZXhNZXRob2REZWNsOworICAKKyAgLy8gRm9yIGltbXV0YWJsZSBvYmplY3RzIHRoaXMgaXMgbnVsbC4gV2hlbiBPYmpDU3Vic2NyaXB0UmVmRXhwciBpcyB0byByZWFkCisgIC8vIGFuIGluZGV4ZWQgb2JqZWN0IHRoaXMgaXMgbnVsbCB0b28uCisgIE9iakNNZXRob2REZWNsICpTZXRBdEluZGV4TWV0aG9kRGVjbDsKKyAgCitwdWJsaWM6CisgIE9iakNTdWJzY3JpcHRSZWZFeHByKEV4cHIgKmJhc2UsIEV4cHIgKmtleSwgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgRXhwclZhbHVlS2luZCBWSywgRXhwck9iamVjdEtpbmQgT0ssCisgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsICpnZXRNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsICpzZXRNZXRob2QsIFNvdXJjZUxvY2F0aW9uIFJCKQorICAgICAgOiBFeHByKE9iakNTdWJzY3JpcHRSZWZFeHByQ2xhc3MsIFQsIFZLLCBPSywgCisgICAgICAgICAgICAgYmFzZS0+aXNUeXBlRGVwZW5kZW50KCkgfHwga2V5LT5pc1R5cGVEZXBlbmRlbnQoKSwgCisgICAgICAgICAgICAgYmFzZS0+aXNWYWx1ZURlcGVuZGVudCgpIHx8IGtleS0+aXNWYWx1ZURlcGVuZGVudCgpLAorICAgICAgICAgICAgIChiYXNlLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnQoKSB8fAorICAgICAgICAgICAgICBrZXktPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpKSwKKyAgICAgICAgICAgICAoYmFzZS0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpIHx8CisgICAgICAgICAgICAgIGtleS0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSksCisgICAgICAgIFJCcmFja2V0KFJCKSwgR2V0QXRJbmRleE1ldGhvZERlY2woZ2V0TWV0aG9kKSwKKyAgICAgICAgU2V0QXRJbmRleE1ldGhvZERlY2woc2V0TWV0aG9kKSB7CisgICAgU3ViRXhwcnNbQkFTRV0gPSBiYXNlOyBTdWJFeHByc1tLRVldID0ga2V5OworICB9CisKKyAgZXhwbGljaXQgT2JqQ1N1YnNjcmlwdFJlZkV4cHIoRW1wdHlTaGVsbCBFbXB0eSkKKyAgICAgIDogRXhwcihPYmpDU3Vic2NyaXB0UmVmRXhwckNsYXNzLCBFbXB0eSkge30KKyAgCisgIFNvdXJjZUxvY2F0aW9uIGdldFJCcmFja2V0KCkgY29uc3QgeyByZXR1cm4gUkJyYWNrZXQ7IH0KKyAgdm9pZCBzZXRSQnJhY2tldChTb3VyY2VMb2NhdGlvbiBSQikgeyBSQnJhY2tldCA9IFJCOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gU3ViRXhwcnNbQkFTRV0tPmdldExvY1N0YXJ0KCk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJCcmFja2V0OyB9CisgIAorICBFeHByICpnZXRCYXNlRXhwcigpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8RXhwcj4oU3ViRXhwcnNbQkFTRV0pOyB9CisgIHZvaWQgc2V0QmFzZUV4cHIoU3RtdCAqUykgeyBTdWJFeHByc1tCQVNFXSA9IFM7IH0KKyAgCisgIEV4cHIgKmdldEtleUV4cHIoKSBjb25zdCB7IHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHJzW0tFWV0pOyB9CisgIHZvaWQgc2V0S2V5RXhwcihTdG10ICpTKSB7IFN1YkV4cHJzW0tFWV0gPSBTOyB9CisgIAorICBPYmpDTWV0aG9kRGVjbCAqZ2V0QXRJbmRleE1ldGhvZERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEF0SW5kZXhNZXRob2REZWNsOworICB9CisgCisgIE9iakNNZXRob2REZWNsICpzZXRBdEluZGV4TWV0aG9kRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU2V0QXRJbmRleE1ldGhvZERlY2w7CisgIH0KKyAgCisgIGJvb2wgaXNBcnJheVN1YnNjcmlwdFJlZkV4cHIoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEtleUV4cHIoKS0+Z2V0VHlwZSgpLT5pc0ludGVncmFsT3JFbnVtZXJhdGlvblR5cGUoKTsKKyAgfQorICAKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKFN1YkV4cHJzLCBTdWJFeHBycytFTkRfRVhQUik7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT2JqQ1N1YnNjcmlwdFJlZkV4cHJDbGFzczsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKK307CisKKy8vLyBcYnJpZWYgQW4gZXhwcmVzc2lvbiB0aGF0IHNlbmRzIGEgbWVzc2FnZSB0byB0aGUgZ2l2ZW4gT2JqZWN0aXZlLUMKKy8vLyBvYmplY3Qgb3IgY2xhc3MuCisvLy8KKy8vLyBUaGUgZm9sbG93aW5nIGNvbnRhaW5zIHR3byBtZXNzYWdlIHNlbmQgZXhwcmVzc2lvbnM6CisvLy8KKy8vLyBcY29kZQorLy8vICAgW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhTdHJpbmc6QCJIZWxsbyJdCisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoZSBpbm5lcm1vc3QgbWVzc2FnZSBzZW5kIGludm9rZXMgdGhlICJhbGxvYyIgY2xhc3MgbWV0aG9kIG9uIHRoZQorLy8vIE5TU3RyaW5nIGNsYXNzLCB3aGlsZSB0aGUgb3V0ZXJtb3N0IG1lc3NhZ2Ugc2VuZCBpbnZva2VzIHRoZQorLy8vICJpbml0V2l0aFN0cmluZyIgaW5zdGFuY2UgbWV0aG9kIG9uIHRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbQorLy8vIE5TU3RyaW5nJ3MgImFsbG9jIi4gSW4gYWxsLCBhbiBPYmplY3RpdmUtQyBtZXNzYWdlIHNlbmQgY2FuIHRha2UKKy8vLyBvbiBmb3VyIGRpZmZlcmVudCAoYWx0aG91Z2ggcmVsYXRlZCkgZm9ybXM6CisvLy8KKy8vLyAgIDEuIFNlbmQgdG8gYW4gb2JqZWN0IGluc3RhbmNlLgorLy8vICAgMi4gU2VuZCB0byBhIGNsYXNzLgorLy8vICAgMy4gU2VuZCB0byB0aGUgc3VwZXJjbGFzcyBpbnN0YW5jZSBvZiB0aGUgY3VycmVudCBjbGFzcy4KKy8vLyAgIDQuIFNlbmQgdG8gdGhlIHN1cGVyY2xhc3Mgb2YgdGhlIGN1cnJlbnQgY2xhc3MuCisvLy8KKy8vLyBBbGwgZm91ciBraW5kcyBvZiBtZXNzYWdlIHNlbmRzIGFyZSBtb2RlbGVkIGJ5IHRoZSBPYmpDTWVzc2FnZUV4cHIKKy8vLyBjbGFzcywgYW5kIGNhbiBiZSBkaXN0aW5ndWlzaGVkIHZpYSBcYyBnZXRSZWNlaXZlcktpbmQoKS4gRXhhbXBsZToKKy8vLworLy8vIFRoZSAidm9pZCAqIiB0cmFpbGluZyBvYmplY3RzIGFyZSBhY3R1YWxseSBPTkUgdm9pZCAqICh0aGUKKy8vLyByZWNlaXZlciBwb2ludGVyKSwgYW5kIE51bUFyZ3MgRXhwciAqLiBCdXQgZHVlIHRvIHRoZQorLy8vIGltcGxlbWVudGF0aW9uIG9mIGNoaWxkcmVuKCksIHRoZXNlIG11c3QgYmUgdG9nZXRoZXIgY29udGlndW91c2x5LgorY2xhc3MgT2JqQ01lc3NhZ2VFeHByIGZpbmFsCisgICAgOiBwdWJsaWMgRXhwciwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPE9iakNNZXNzYWdlRXhwciwgdm9pZCAqLCBTb3VyY2VMb2NhdGlvbj4geworICAvLy8gXGJyaWVmIFN0b3JlcyBlaXRoZXIgdGhlIHNlbGVjdG9yIHRoYXQgdGhpcyBtZXNzYWdlIGlzIHNlbmRpbmcKKyAgLy8vIHRvICh3aGVuIFxjIEhhc01ldGhvZCBpcyB6ZXJvKSBvciBhbiBcYyBPYmpDTWV0aG9kRGVjbCBwb2ludGVyCisgIC8vLyByZWZlcnJpbmcgdG8gdGhlIG1ldGhvZCB0aGF0IHdlIHR5cGUtY2hlY2tlZCBhZ2FpbnN0LgorICB1aW50cHRyX3QgU2VsZWN0b3JPck1ldGhvZCA9IDA7CisKKyAgZW51bSB7IE51bUFyZ3NCaXRXaWR0aCA9IDE2IH07CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiB0aGUgbWVzc2FnZSBzZW5kLCBub3QKKyAgLy8vIGluY2x1ZGluZyB0aGUgcmVjZWl2ZXIuCisgIHVuc2lnbmVkIE51bUFyZ3MgOiBOdW1BcmdzQml0V2lkdGg7CisgIAorICAvLy8gXGJyaWVmIFRoZSBraW5kIG9mIG1lc3NhZ2Ugc2VuZCB0aGlzIGlzLCB3aGljaCBpcyBvbmUgb2YgdGhlCisgIC8vLyBSZWNlaXZlcktpbmQgdmFsdWVzLgorICAvLy8KKyAgLy8vIFdlIHBhZCB0aGlzIG91dCB0byBhIGJ5dGUgdG8gYXZvaWQgZXhjZXNzaXZlIG1hc2tpbmcgYW5kIHNoaWZ0aW5nLgorICB1bnNpZ25lZCBLaW5kIDogODsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgd2UgaGF2ZSBhbiBhY3R1YWwgbWV0aG9kIHByb3RvdHlwZSBpbiBcYworICAvLy8gU2VsZWN0b3JPck1ldGhvZC4KKyAgLy8vCisgIC8vLyBXaGVuIG5vbi16ZXJvLCB3ZSBoYXZlIGEgbWV0aG9kIGRlY2xhcmF0aW9uOyBvdGhlcndpc2UsIHdlIGp1c3QKKyAgLy8vIGhhdmUgYSBzZWxlY3Rvci4KKyAgdW5zaWduZWQgSGFzTWV0aG9kIDogMTsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBtZXNzYWdlIHNlbmQgaXMgYSAiZGVsZWdhdGUgaW5pdCBjYWxsIiwKKyAgLy8vIGkuZS4gYSBjYWxsIG9mIGFuIGluaXQgbWV0aG9kIG9uIHNlbGYgZnJvbSB3aXRoaW4gYW4gaW5pdCBtZXRob2QuCisgIHVuc2lnbmVkIElzRGVsZWdhdGVJbml0Q2FsbCA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgbWVzc2FnZSBzZW5kIHdhcyBpbXBsaWNpdGx5IGdlbmVyYXRlZCBieQorICAvLy8gdGhlIGltcGxlbWVudGF0aW9uIHJhdGhlciB0aGFuIGV4cGxpY2l0bHkgd3JpdHRlbiBieSB0aGUgdXNlci4KKyAgdW5zaWduZWQgSXNJbXBsaWNpdCA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoZSBsb2NhdGlvbnMgb2YgdGhlIHNlbGVjdG9yIGlkZW50aWZpZXJzIGFyZSBpbiBhCisgIC8vLyAic3RhbmRhcmQiIHBvc2l0aW9uLCBhIGVudW0gU2VsZWN0b3JMb2NhdGlvbnNLaW5kLgorICB1bnNpZ25lZCBTZWxMb2NzS2luZCA6IDI7CisKKyAgLy8vIFxicmllZiBXaGVuIHRoZSBtZXNzYWdlIGV4cHJlc3Npb24gaXMgYSBzZW5kIHRvICdzdXBlcicsIHRoaXMgaXMKKyAgLy8vIHRoZSBsb2NhdGlvbiBvZiB0aGUgJ3N1cGVyJyBrZXl3b3JkLgorICBTb3VyY2VMb2NhdGlvbiBTdXBlckxvYzsKKworICAvLy8gXGJyaWVmIFRoZSBzb3VyY2UgbG9jYXRpb25zIG9mIHRoZSBvcGVuIGFuZCBjbG9zZSBzcXVhcmUKKyAgLy8vIGJyYWNrZXRzICgnWycgYW5kICddJywgcmVzcGVjdGl2ZWx5KS4KKyAgU291cmNlTG9jYXRpb24gTEJyYWNMb2MsIFJCcmFjTG9jOworCisgIE9iakNNZXNzYWdlRXhwcihFbXB0eVNoZWxsIEVtcHR5LCB1bnNpZ25lZCBOdW1BcmdzKQorICAgICAgOiBFeHByKE9iakNNZXNzYWdlRXhwckNsYXNzLCBFbXB0eSksIEtpbmQoMCksIEhhc01ldGhvZChmYWxzZSksCisgICAgICAgIElzRGVsZWdhdGVJbml0Q2FsbChmYWxzZSksIElzSW1wbGljaXQoZmFsc2UpLCBTZWxMb2NzS2luZCgwKSB7CisgICAgc2V0TnVtQXJncyhOdW1BcmdzKTsKKyAgfQorCisgIE9iakNNZXNzYWdlRXhwcihRdWFsVHlwZSBULCBFeHByVmFsdWVLaW5kIFZLLAorICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTEJyYWNMb2MsCisgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdXBlckxvYywKKyAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbnN0YW5jZVN1cGVyLAorICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgU3VwZXJUeXBlLAorICAgICAgICAgICAgICAgICAgU2VsZWN0b3IgU2VsLCAKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNvdXJjZUxvY2F0aW9uPiBTZWxMb2NzLAorICAgICAgICAgICAgICAgICAgU2VsZWN0b3JMb2NhdGlvbnNLaW5kIFNlbExvY3NLLAorICAgICAgICAgICAgICAgICAgT2JqQ01ldGhvZERlY2wgKk1ldGhvZCwKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJCcmFjTG9jLAorICAgICAgICAgICAgICAgICAgYm9vbCBpc0ltcGxpY2l0KTsKKyAgT2JqQ01lc3NhZ2VFeHByKFF1YWxUeXBlIFQsIEV4cHJWYWx1ZUtpbmQgVkssCisgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMQnJhY0xvYywKKyAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpSZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIFNlbCwgCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTb3VyY2VMb2NhdGlvbj4gU2VsTG9jcywKKyAgICAgICAgICAgICAgICAgIFNlbGVjdG9yTG9jYXRpb25zS2luZCBTZWxMb2NzSywKKyAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsICpNZXRob2QsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSQnJhY0xvYywKKyAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbXBsaWNpdCk7CisgIE9iakNNZXNzYWdlRXhwcihRdWFsVHlwZSBULCBFeHByVmFsdWVLaW5kIFZLLAorICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTEJyYWNMb2MsCisgICAgICAgICAgICAgICAgICBFeHByICpSZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIFNlbCwgCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTb3VyY2VMb2NhdGlvbj4gU2VsTG9jcywKKyAgICAgICAgICAgICAgICAgIFNlbGVjdG9yTG9jYXRpb25zS2luZCBTZWxMb2NzSywKKyAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsICpNZXRob2QsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSQnJhY0xvYywKKyAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbXBsaWNpdCk7CisKKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPHZvaWQgKj4pIGNvbnN0IHsgcmV0dXJuIE51bUFyZ3MgKyAxOyB9CisKKyAgdm9pZCBzZXROdW1BcmdzKHVuc2lnbmVkIE51bSkgeworICAgIGFzc2VydCgoTnVtID4+IE51bUFyZ3NCaXRXaWR0aCkgPT0gMCAmJiAiTnVtIG9mIGFyZ3MgaXMgb3V0IG9mIHJhbmdlISIpOworICAgIE51bUFyZ3MgPSBOdW07CisgIH0KKworICB2b2lkIGluaXRBcmdzQW5kU2VsTG9jcyhBcnJheVJlZjxFeHByICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNvdXJjZUxvY2F0aW9uPiBTZWxMb2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvckxvY2F0aW9uc0tpbmQgU2VsTG9jc0spOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHBvaW50ZXIgdmFsdWUgb2YgdGhlIG1lc3NhZ2UgcmVjZWl2ZXIuCisgIHZvaWQgKmdldFJlY2VpdmVyUG9pbnRlcigpIGNvbnN0IHsgcmV0dXJuICpnZXRUcmFpbGluZ09iamVjdHM8dm9pZCAqPigpOyB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIHBvaW50ZXIgdmFsdWUgb2YgdGhlIG1lc3NhZ2UgcmVjZWl2ZXIuCisgIHZvaWQgc2V0UmVjZWl2ZXJQb2ludGVyKHZvaWQgKlZhbHVlKSB7CisgICAgKmdldFRyYWlsaW5nT2JqZWN0czx2b2lkICo+KCkgPSBWYWx1ZTsKKyAgfQorCisgIFNlbGVjdG9yTG9jYXRpb25zS2luZCBnZXRTZWxMb2NzS2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKFNlbGVjdG9yTG9jYXRpb25zS2luZClTZWxMb2NzS2luZDsKKyAgfQorCisgIGJvb2wgaGFzU3RhbmRhcmRTZWxMb2NzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTZWxMb2NzS2luZCgpICE9IFNlbExvY19Ob25TdGFuZGFyZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGEgcG9pbnRlciB0byB0aGUgc3RvcmVkIHNlbGVjdG9yIGlkZW50aWZpZXJzIGxvY2F0aW9ucyBhcnJheS4KKyAgLy8vIE5vIGxvY2F0aW9ucyB3aWxsIGJlIHN0b3JlZCBpZiBIYXNTdGFuZGFyZFNlbExvY3MgaXMgdHJ1ZS4KKyAgU291cmNlTG9jYXRpb24gKmdldFN0b3JlZFNlbExvY3MoKSB7CisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxTb3VyY2VMb2NhdGlvbj4oKTsKKyAgfQorICBjb25zdCBTb3VyY2VMb2NhdGlvbiAqZ2V0U3RvcmVkU2VsTG9jcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPFNvdXJjZUxvY2F0aW9uPigpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG51bWJlciBvZiBzdG9yZWQgc2VsZWN0b3IgaWRlbnRpZmllcnMgbG9jYXRpb25zLgorICAvLy8gTm8gbG9jYXRpb25zIHdpbGwgYmUgc3RvcmVkIGlmIEhhc1N0YW5kYXJkU2VsTG9jcyBpcyB0cnVlLgorICB1bnNpZ25lZCBnZXROdW1TdG9yZWRTZWxMb2NzKCkgY29uc3QgeworICAgIGlmIChoYXNTdGFuZGFyZFNlbExvY3MoKSkKKyAgICAgIHJldHVybiAwOworICAgIHJldHVybiBnZXROdW1TZWxlY3RvckxvY3MoKTsKKyAgfQorCisgIHN0YXRpYyBPYmpDTWVzc2FnZUV4cHIgKmFsbG9jKGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUkJyYWNlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTb3VyY2VMb2NhdGlvbj4gU2VsTG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3IgU2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvckxvY2F0aW9uc0tpbmQgJlNlbExvY3NLKTsKKyAgc3RhdGljIE9iakNNZXNzYWdlRXhwciAqYWxsb2MoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtU3RvcmVkU2VsTG9jcyk7CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10V3JpdGVyOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIC8vLyBcYnJpZWYgVGhlIGtpbmQgb2YgcmVjZWl2ZXIgdGhpcyBtZXNzYWdlIGlzIHNlbmRpbmcgdG8uCisgIGVudW0gUmVjZWl2ZXJLaW5kIHsKKyAgICAvLy8gXGJyaWVmIFRoZSByZWNlaXZlciBpcyBhIGNsYXNzLgorICAgIENsYXNzID0gMCwKKworICAgIC8vLyBcYnJpZWYgVGhlIHJlY2VpdmVyIGlzIGFuIG9iamVjdCBpbnN0YW5jZS4KKyAgICBJbnN0YW5jZSwKKworICAgIC8vLyBcYnJpZWYgVGhlIHJlY2VpdmVyIGlzIGEgc3VwZXJjbGFzcy4KKyAgICBTdXBlckNsYXNzLAorCisgICAgLy8vIFxicmllZiBUaGUgcmVjZWl2ZXIgaXMgdGhlIGluc3RhbmNlIG9mIHRoZSBzdXBlcmNsYXNzIG9iamVjdC4KKyAgICBTdXBlckluc3RhbmNlCisgIH07CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBtZXNzYWdlIHNlbmQgdG8gc3VwZXIuCisgIC8vLworICAvLy8gXHBhcmFtIENvbnRleHQgVGhlIEFTVENvbnRleHQgaW4gd2hpY2ggdGhpcyBleHByZXNzaW9uIHdpbGwgYmUgY3JlYXRlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gVCBUaGUgcmVzdWx0IHR5cGUgb2YgdGhpcyBtZXNzYWdlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBWSyBUaGUgdmFsdWUga2luZCBvZiB0aGlzIG1lc3NhZ2UuICBBIG1lc3NhZ2UgcmV0dXJuaW5nCisgIC8vLyBhIGwtdmFsdWUgb3Igci12YWx1ZSByZWZlcmVuY2Ugd2lsbCBiZSBhbiBsLXZhbHVlIG9yIHgtdmFsdWUsCisgIC8vLyByZXNwZWN0aXZlbHkuCisgIC8vLworICAvLy8gXHBhcmFtIExCcmFjTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgb3BlbiBzcXVhcmUgYnJhY2tldCAnWycuCisgIC8vLworICAvLy8gXHBhcmFtIFN1cGVyTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgInN1cGVyIiBrZXl3b3JkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJc0luc3RhbmNlU3VwZXIgV2hldGhlciB0aGlzIGlzIGFuIGluc3RhbmNlICJzdXBlciIKKyAgLy8vIG1lc3NhZ2UgKG90aGVyd2lzZSwgaXQncyBhIGNsYXNzICJzdXBlciIgbWVzc2FnZSkuCisgIC8vLworICAvLy8gXHBhcmFtIFNlbCBUaGUgc2VsZWN0b3IgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggbWV0aG9kIGdldHMgY2FsbGVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNZXRob2QgVGhlIE9iamVjdGl2ZS1DIG1ldGhvZCBhZ2FpbnN0IHdoaWNoIHRoaXMgbWVzc2FnZQorICAvLy8gc2VuZCB3YXMgdHlwZS1jaGVja2VkLiBNYXkgYmUgbnVsbHB0ci4KKyAgLy8vCisgIC8vLyBccGFyYW0gQXJncyBUaGUgbWVzc2FnZSBzZW5kIGFyZ3VtZW50cy4KKyAgLy8vCisgIC8vLyBccGFyYW0gUkJyYWNMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBjbG9zaW5nIHNxdWFyZSBicmFja2V0ICddJy4KKyAgc3RhdGljIE9iakNNZXNzYWdlRXhwciAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQsIFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByVmFsdWVLaW5kIFZLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTEJyYWNMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdXBlckxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbnN0YW5jZVN1cGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgU3VwZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3IgU2VsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNvdXJjZUxvY2F0aW9uPiBTZWxMb2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ01ldGhvZERlY2wgKk1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJCcmFjTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0ltcGxpY2l0KTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIGNsYXNzIG1lc3NhZ2Ugc2VuZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29udGV4dCBUaGUgQVNUQ29udGV4dCBpbiB3aGljaCB0aGlzIGV4cHJlc3Npb24gd2lsbCBiZSBjcmVhdGVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUIFRoZSByZXN1bHQgdHlwZSBvZiB0aGlzIG1lc3NhZ2UuCisgIC8vLworICAvLy8gXHBhcmFtIFZLIFRoZSB2YWx1ZSBraW5kIG9mIHRoaXMgbWVzc2FnZS4gIEEgbWVzc2FnZSByZXR1cm5pbmcKKyAgLy8vIGEgbC12YWx1ZSBvciByLXZhbHVlIHJlZmVyZW5jZSB3aWxsIGJlIGFuIGwtdmFsdWUgb3IgeC12YWx1ZSwKKyAgLy8vIHJlc3BlY3RpdmVseS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTEJyYWNMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBvcGVuIHNxdWFyZSBicmFja2V0ICdbJy4KKyAgLy8vCisgIC8vLyBccGFyYW0gUmVjZWl2ZXIgVGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyLCBpbmNsdWRpbmcKKyAgLy8vIHNvdXJjZS1sb2NhdGlvbiBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU2VsIFRoZSBzZWxlY3RvciB1c2VkIHRvIGRldGVybWluZSB3aGljaCBtZXRob2QgZ2V0cyBjYWxsZWQuCisgIC8vLworICAvLy8gXHBhcmFtIE1ldGhvZCBUaGUgT2JqZWN0aXZlLUMgbWV0aG9kIGFnYWluc3Qgd2hpY2ggdGhpcyBtZXNzYWdlCisgIC8vLyBzZW5kIHdhcyB0eXBlLWNoZWNrZWQuIE1heSBiZSBudWxscHRyLgorICAvLy8KKyAgLy8vIFxwYXJhbSBBcmdzIFRoZSBtZXNzYWdlIHNlbmQgYXJndW1lbnRzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSQnJhY0xvYyBUaGUgbG9jYXRpb24gb2YgdGhlIGNsb3Npbmcgc3F1YXJlIGJyYWNrZXQgJ10nLgorICBzdGF0aWMgT2JqQ01lc3NhZ2VFeHByICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJWYWx1ZUtpbmQgVkssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMQnJhY0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpSZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIFNlbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTb3VyY2VMb2NhdGlvbj4gU2VsTG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsICpNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSQnJhY0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbXBsaWNpdCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gaW5zdGFuY2UgbWVzc2FnZSBzZW5kLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb250ZXh0IFRoZSBBU1RDb250ZXh0IGluIHdoaWNoIHRoaXMgZXhwcmVzc2lvbiB3aWxsIGJlIGNyZWF0ZWQuCisgIC8vLworICAvLy8gXHBhcmFtIFQgVGhlIHJlc3VsdCB0eXBlIG9mIHRoaXMgbWVzc2FnZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gVksgVGhlIHZhbHVlIGtpbmQgb2YgdGhpcyBtZXNzYWdlLiAgQSBtZXNzYWdlIHJldHVybmluZworICAvLy8gYSBsLXZhbHVlIG9yIHItdmFsdWUgcmVmZXJlbmNlIHdpbGwgYmUgYW4gbC12YWx1ZSBvciB4LXZhbHVlLAorICAvLy8gcmVzcGVjdGl2ZWx5LgorICAvLy8KKyAgLy8vIFxwYXJhbSBMQnJhY0xvYyBUaGUgbG9jYXRpb24gb2YgdGhlIG9wZW4gc3F1YXJlIGJyYWNrZXQgJ1snLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSZWNlaXZlciBUaGUgZXhwcmVzc2lvbiB1c2VkIHRvIHByb2R1Y2UgdGhlIG9iamVjdCB0aGF0CisgIC8vLyB3aWxsIHJlY2VpdmUgdGhpcyBtZXNzYWdlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTZWwgVGhlIHNlbGVjdG9yIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIG1ldGhvZCBnZXRzIGNhbGxlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gTWV0aG9kIFRoZSBPYmplY3RpdmUtQyBtZXRob2QgYWdhaW5zdCB3aGljaCB0aGlzIG1lc3NhZ2UKKyAgLy8vIHNlbmQgd2FzIHR5cGUtY2hlY2tlZC4gTWF5IGJlIG51bGxwdHIuCisgIC8vLworICAvLy8gXHBhcmFtIEFyZ3MgVGhlIG1lc3NhZ2Ugc2VuZCBhcmd1bWVudHMuCisgIC8vLworICAvLy8gXHBhcmFtIFJCcmFjTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgY2xvc2luZyBzcXVhcmUgYnJhY2tldCAnXScuCisgIHN0YXRpYyBPYmpDTWVzc2FnZUV4cHIgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LCBRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwclZhbHVlS2luZCBWSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExCcmFjTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqUmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBTZWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U291cmNlTG9jYXRpb24+IFNlTG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsICpNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSQnJhY0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbXBsaWNpdCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gZW1wdHkgT2JqZWN0aXZlLUMgbWVzc2FnZSBleHByZXNzaW9uLCB0byBiZQorICAvLy8gZmlsbGVkIGluIGJ5IHN1YnNlcXVlbnQgY2FsbHMuCisgIC8vLworICAvLy8gXHBhcmFtIENvbnRleHQgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIG1lc3NhZ2Ugc2VuZCB3aWxsIGJlIGNyZWF0ZWQuCisgIC8vLworICAvLy8gXHBhcmFtIE51bUFyZ3MgVGhlIG51bWJlciBvZiBtZXNzYWdlIGFyZ3VtZW50cywgbm90IGluY2x1ZGluZworICAvLy8gdGhlIHJlY2VpdmVyLgorICBzdGF0aWMgT2JqQ01lc3NhZ2VFeHByICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1BcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1TdG9yZWRTZWxMb2NzKTsKKworICAvLy8gXGJyaWVmIEluZGljYXRlcyB3aGV0aGVyIHRoZSBtZXNzYWdlIHNlbmQgd2FzIGltcGxpY2l0bHkKKyAgLy8vIGdlbmVyYXRlZCBieSB0aGUgaW1wbGVtZW50YXRpb24uIElmIGZhbHNlLCBpdCB3YXMgd3JpdHRlbiBleHBsaWNpdGx5CisgIC8vLyBpbiB0aGUgc291cmNlIGNvZGUuCisgIGJvb2wgaXNJbXBsaWNpdCgpIGNvbnN0IHsgcmV0dXJuIElzSW1wbGljaXQ7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUga2luZCBvZiByZWNlaXZlciB0aGF0IHRoaXMgbWVzc2FnZSBpcyBiZWluZworICAvLy8gc2VudCB0by4KKyAgUmVjZWl2ZXJLaW5kIGdldFJlY2VpdmVyS2luZCgpIGNvbnN0IHsgcmV0dXJuIChSZWNlaXZlcktpbmQpS2luZDsgfQorCisgIC8vLyBcYnJpZWYgU291cmNlIHJhbmdlIG9mIHRoZSByZWNlaXZlci4KKyAgU291cmNlUmFuZ2UgZ2V0UmVjZWl2ZXJSYW5nZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhbiBpbnN0YW5jZSBtZXNzYWdlIHRvIGVpdGhlciBhCisgIC8vLyBjb21wdXRlZCBvYmplY3Qgb3IgdG8gc3VwZXIuCisgIGJvb2wgaXNJbnN0YW5jZU1lc3NhZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFJlY2VpdmVyS2luZCgpID09IEluc3RhbmNlIHx8IGdldFJlY2VpdmVyS2luZCgpID09IFN1cGVySW5zdGFuY2U7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYW4gY2xhc3MgbWVzc2FnZSB0byBlaXRoZXIgYQorICAvLy8gc3BlY2lmaWVkIGNsYXNzIG9yIHRvIHN1cGVyLgorICBib29sIGlzQ2xhc3NNZXNzYWdlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRSZWNlaXZlcktpbmQoKSA9PSBDbGFzcyB8fCBnZXRSZWNlaXZlcktpbmQoKSA9PSBTdXBlckNsYXNzOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBvYmplY3QgZXhwcmVzc2lvbiAocmVjZWl2ZXIpIGZvciBhbiBpbnN0YW5jZSBtZXNzYWdlLAorICAvLy8gb3IgbnVsbCBmb3IgYSBtZXNzYWdlIHRoYXQgaXMgbm90IGFuIGluc3RhbmNlIG1lc3NhZ2UuCisgIEV4cHIgKmdldEluc3RhbmNlUmVjZWl2ZXIoKSB7CisgICAgaWYgKGdldFJlY2VpdmVyS2luZCgpID09IEluc3RhbmNlKQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEV4cHIgKj4oZ2V0UmVjZWl2ZXJQb2ludGVyKCkpOworCisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgY29uc3QgRXhwciAqZ2V0SW5zdGFuY2VSZWNlaXZlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxPYmpDTWVzc2FnZUV4cHIqPih0aGlzKS0+Z2V0SW5zdGFuY2VSZWNlaXZlcigpOworICB9CisKKyAgLy8vIFxicmllZiBUdXJuIHRoaXMgbWVzc2FnZSBzZW5kIGludG8gYW4gaW5zdGFuY2UgbWVzc2FnZSB0aGF0CisgIC8vLyBjb21wdXRlcyB0aGUgcmVjZWl2ZXIgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGV4cHJlc3Npb24uCisgIHZvaWQgc2V0SW5zdGFuY2VSZWNlaXZlcihFeHByICpyZWMpIHsgCisgICAgS2luZCA9IEluc3RhbmNlOworICAgIHNldFJlY2VpdmVyUG9pbnRlcihyZWMpOworICB9CisgIAorICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHR5cGUgb2YgYSBjbGFzcyBtZXNzYWdlIHNlbmQsIG9yIE5VTEwgaWYgdGhlCisgIC8vLyBtZXNzYWdlIGlzIG5vdCBhIGNsYXNzIG1lc3NhZ2UuCisgIFF1YWxUeXBlIGdldENsYXNzUmVjZWl2ZXIoKSBjb25zdCB7IAorICAgIGlmIChUeXBlU291cmNlSW5mbyAqVFNJbmZvID0gZ2V0Q2xhc3NSZWNlaXZlclR5cGVJbmZvKCkpCisgICAgICByZXR1cm4gVFNJbmZvLT5nZXRUeXBlKCk7CisKKyAgICByZXR1cm4ge307CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgYSB0eXBlLXNvdXJjZSBpbmZvcm1hdGlvbiBvZiBhIGNsYXNzIG1lc3NhZ2UKKyAgLy8vIHNlbmQsIG9yIG51bGxwdHIgaWYgdGhlIG1lc3NhZ2UgaXMgbm90IGEgY2xhc3MgbWVzc2FnZS4KKyAgVHlwZVNvdXJjZUluZm8gKmdldENsYXNzUmVjZWl2ZXJUeXBlSW5mbygpIGNvbnN0IHsKKyAgICBpZiAoZ2V0UmVjZWl2ZXJLaW5kKCkgPT0gQ2xhc3MpCisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUeXBlU291cmNlSW5mbyAqPihnZXRSZWNlaXZlclBvaW50ZXIoKSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB2b2lkIHNldENsYXNzUmVjZWl2ZXIoVHlwZVNvdXJjZUluZm8gKlRTSW5mbykgeworICAgIEtpbmQgPSBDbGFzczsKKyAgICBzZXRSZWNlaXZlclBvaW50ZXIoVFNJbmZvKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSAnc3VwZXInIGtleXdvcmQgZm9yIGEgY2xhc3MKKyAgLy8vIG9yIGluc3RhbmNlIG1lc3NhZ2UgdG8gJ3N1cGVyJywgb3RoZXJ3aXNlIGFuIGludmFsaWQgc291cmNlIGxvY2F0aW9uLgorICBTb3VyY2VMb2NhdGlvbiBnZXRTdXBlckxvYygpIGNvbnN0IHsgCisgICAgaWYgKGdldFJlY2VpdmVyS2luZCgpID09IFN1cGVySW5zdGFuY2UgfHwgZ2V0UmVjZWl2ZXJLaW5kKCkgPT0gU3VwZXJDbGFzcykKKyAgICAgIHJldHVybiBTdXBlckxvYzsKKworICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbigpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgcmVjZWl2ZXIgdHlwZSB0byB3aGljaCB0aGlzIG1lc3NhZ2UgaXMgYmVpbmcgZGlyZWN0ZWQuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIGNyb3NzLWN1dHMgYWxsIG9mIHRoZSBkaWZmZXJlbnQga2luZHMgb2YgbWVzc2FnZQorICAvLy8gc2VuZHMgdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIHVuZGVybHlpbmcgKHN0YXRpY2FsbHkga25vd24pIHR5cGUKKyAgLy8vIG9mIHRoZSByZWNlaXZlciB3aWxsIGJlOyB1c2UgXGMgZ2V0UmVjZWl2ZXJLaW5kKCkgdG8gZGV0ZXJtaW5lCisgIC8vLyB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzIGEgY2xhc3Mgb3IgYW4gaW5zdGFuY2UgbWV0aG9kLCB3aGV0aGVyIGl0CisgIC8vLyBpcyBhIHNlbmQgdG8gc3VwZXIgb3Igbm90LCBldGMuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyLgorICBRdWFsVHlwZSBnZXRSZWNlaXZlclR5cGUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gd2hpY2ggdGhpcyBtZXNzYWdlCisgIC8vLyBpcyBiZWluZyBkaXJlY3RlZCwgaWYga25vd24uCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIGNyb3NzLWN1dHMgYWxsIG9mIHRoZSBkaWZmZXJlbnQga2luZHMgb2YgbWVzc2FnZQorICAvLy8gc2VuZHMgdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIHVuZGVybHlpbmcgKHN0YXRpY2FsbHkga25vd24pIHR5cGUKKyAgLy8vIG9mIHRoZSByZWNlaXZlciB3aWxsIGJlOyB1c2UgXGMgZ2V0UmVjZWl2ZXJLaW5kKCkgdG8gZGV0ZXJtaW5lCisgIC8vLyB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzIGEgY2xhc3Mgb3IgYW4gaW5zdGFuY2UgbWV0aG9kLCB3aGV0aGVyIGl0CisgIC8vLyBpcyBhIHNlbmQgdG8gc3VwZXIgb3Igbm90LCBldGMuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIE9iamVjdGl2ZS1DIGludGVyZmFjZSBpZiBrbm93biwgb3RoZXJ3aXNlIG51bGxwdHIuCisgIE9iakNJbnRlcmZhY2VEZWNsICpnZXRSZWNlaXZlckludGVyZmFjZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHR5cGUgcmVmZXJyZWQgdG8gYnkgJ3N1cGVyJy4gCisgIC8vLworICAvLy8gVGhlIHJldHVybmVkIHR5cGUgd2lsbCBlaXRoZXIgYmUgYW4gT2JqQ0ludGVyZmFjZVR5cGUgKGZvciBhbgorICAvLy8gY2xhc3MgbWVzc2FnZSB0byBzdXBlcikgb3IgYW4gT2JqQ09iamVjdFBvaW50ZXJUeXBlIHRoYXQgcmVmZXJzCisgIC8vLyB0byBhIGNsYXNzIChmb3IgYW4gaW5zdGFuY2UgbWVzc2FnZSB0byBzdXBlcik7CisgIFF1YWxUeXBlIGdldFN1cGVyVHlwZSgpIGNvbnN0IHsKKyAgICBpZiAoZ2V0UmVjZWl2ZXJLaW5kKCkgPT0gU3VwZXJJbnN0YW5jZSB8fCBnZXRSZWNlaXZlcktpbmQoKSA9PSBTdXBlckNsYXNzKQorICAgICAgcmV0dXJuIFF1YWxUeXBlOjpnZXRGcm9tT3BhcXVlUHRyKGdldFJlY2VpdmVyUG9pbnRlcigpKTsKKworICAgIHJldHVybiBRdWFsVHlwZSgpOworICB9CisKKyAgdm9pZCBzZXRTdXBlcihTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQsIGJvb2wgSXNJbnN0YW5jZVN1cGVyKSB7CisgICAgS2luZCA9IElzSW5zdGFuY2VTdXBlcj8gU3VwZXJJbnN0YW5jZSA6IFN1cGVyQ2xhc3M7CisgICAgU3VwZXJMb2MgPSBMb2M7CisgICAgc2V0UmVjZWl2ZXJQb2ludGVyKFQuZ2V0QXNPcGFxdWVQdHIoKSk7CisgIH0KKworICBTZWxlY3RvciBnZXRTZWxlY3RvcigpIGNvbnN0OworCisgIHZvaWQgc2V0U2VsZWN0b3IoU2VsZWN0b3IgUykgeyAKKyAgICBIYXNNZXRob2QgPSBmYWxzZTsKKyAgICBTZWxlY3Rvck9yTWV0aG9kID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFMuZ2V0QXNPcGFxdWVQdHIoKSk7CisgIH0KKworICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqZ2V0TWV0aG9kRGVjbCgpIGNvbnN0IHsgCisgICAgaWYgKEhhc01ldGhvZCkKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IE9iakNNZXRob2REZWNsICo+KFNlbGVjdG9yT3JNZXRob2QpOworCisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBPYmpDTWV0aG9kRGVjbCAqZ2V0TWV0aG9kRGVjbCgpIHsgCisgICAgaWYgKEhhc01ldGhvZCkKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PE9iakNNZXRob2REZWNsICo+KFNlbGVjdG9yT3JNZXRob2QpOworCisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB2b2lkIHNldE1ldGhvZERlY2woT2JqQ01ldGhvZERlY2wgKk1EKSB7IAorICAgIEhhc01ldGhvZCA9IHRydWU7CisgICAgU2VsZWN0b3JPck1ldGhvZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihNRCk7CisgIH0KKworICBPYmpDTWV0aG9kRmFtaWx5IGdldE1ldGhvZEZhbWlseSgpIGNvbnN0IHsKKyAgICBpZiAoSGFzTWV0aG9kKSByZXR1cm4gZ2V0TWV0aG9kRGVjbCgpLT5nZXRNZXRob2RGYW1pbHkoKTsKKyAgICByZXR1cm4gZ2V0U2VsZWN0b3IoKS5nZXRNZXRob2RGYW1pbHkoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgYWN0dWFsIGFyZ3VtZW50cyBpbiB0aGlzIG1lc3NhZ2UsCisgIC8vLyBub3QgY291bnRpbmcgdGhlIHJlY2VpdmVyLgorICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3QgeyByZXR1cm4gTnVtQXJnczsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGFyZ3VtZW50cyB0byB0aGlzIG1lc3NhZ2UsIG5vdCBpbmNsdWRpbmcgdGhlCisgIC8vLyByZWNlaXZlci4KKyAgRXhwciAqKmdldEFyZ3MoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwciAqKj4oZ2V0VHJhaWxpbmdPYmplY3RzPHZvaWQgKj4oKSArIDEpOworICB9CisgIGNvbnN0IEV4cHIgKiBjb25zdCAqZ2V0QXJncygpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFeHByICpjb25zdCAqPihnZXRUcmFpbGluZ09iamVjdHM8dm9pZCAqPigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgfQorCisgIC8vLyBnZXRBcmcgLSBSZXR1cm4gdGhlIHNwZWNpZmllZCBhcmd1bWVudC4KKyAgRXhwciAqZ2V0QXJnKHVuc2lnbmVkIEFyZykgeworICAgIGFzc2VydChBcmcgPCBOdW1BcmdzICYmICJBcmcgYWNjZXNzIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gZ2V0QXJncygpW0FyZ107CisgIH0KKyAgY29uc3QgRXhwciAqZ2V0QXJnKHVuc2lnbmVkIEFyZykgY29uc3QgeworICAgIGFzc2VydChBcmcgPCBOdW1BcmdzICYmICJBcmcgYWNjZXNzIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gZ2V0QXJncygpW0FyZ107CisgIH0KKworICAvLy8gc2V0QXJnIC0gU2V0IHRoZSBzcGVjaWZpZWQgYXJndW1lbnQuCisgIHZvaWQgc2V0QXJnKHVuc2lnbmVkIEFyZywgRXhwciAqQXJnRXhwcikgeworICAgIGFzc2VydChBcmcgPCBOdW1BcmdzICYmICJBcmcgYWNjZXNzIG91dCBvZiByYW5nZSEiKTsKKyAgICBnZXRBcmdzKClbQXJnXSA9IEFyZ0V4cHI7CisgIH0KKworICAvLy8gaXNEZWxlZ2F0ZUluaXRDYWxsIC0gQW5zd2VycyB3aGV0aGVyIHRoaXMgbWVzc2FnZSBzZW5kIGhhcyBiZWVuCisgIC8vLyB0YWdnZWQgYXMgYSAiZGVsZWdhdGUgaW5pdCBjYWxsIiwgaS5lLiBhIGNhbGwgdG8gYSBtZXRob2QgaW4gdGhlCisgIC8vLyAtaW5pdCBmYW1pbHkgb24gc2VsZiBmcm9tIHdpdGhpbiBhbiAtaW5pdCBtZXRob2QgaW1wbGVtZW50YXRpb24uCisgIGJvb2wgaXNEZWxlZ2F0ZUluaXRDYWxsKCkgY29uc3QgeyByZXR1cm4gSXNEZWxlZ2F0ZUluaXRDYWxsOyB9CisgIHZvaWQgc2V0RGVsZWdhdGVJbml0Q2FsbChib29sIGlzRGVsZWdhdGUpIHsgSXNEZWxlZ2F0ZUluaXRDYWxsID0gaXNEZWxlZ2F0ZTsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExlZnRMb2MoKSBjb25zdCB7IHJldHVybiBMQnJhY0xvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRSaWdodExvYygpIGNvbnN0IHsgcmV0dXJuIFJCcmFjTG9jOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0U2VsZWN0b3JTdGFydExvYygpIGNvbnN0IHsKKyAgICBpZiAoaXNJbXBsaWNpdCgpKQorICAgICAgcmV0dXJuIGdldExvY1N0YXJ0KCk7CisgICAgcmV0dXJuIGdldFNlbGVjdG9yTG9jKDApOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0U2VsZWN0b3JMb2ModW5zaWduZWQgSW5kZXgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSW5kZXggPCBnZXROdW1TZWxlY3RvckxvY3MoKSAmJiAiSW5kZXggb3V0IG9mIHJhbmdlISIpOworICAgIGlmIChoYXNTdGFuZGFyZFNlbExvY3MoKSkKKyAgICAgIHJldHVybiBnZXRTdGFuZGFyZFNlbGVjdG9yTG9jKEluZGV4LCBnZXRTZWxlY3RvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZWxMb2NzS2luZCgpID09IFNlbExvY19TdGFuZGFyZFdpdGhTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjptYWtlQXJyYXlSZWYoY29uc3RfY2FzdDxFeHByKio+KGdldEFyZ3MoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE51bUFyZ3MoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJCcmFjTG9jKTsKKyAgICByZXR1cm4gZ2V0U3RvcmVkU2VsTG9jcygpW0luZGV4XTsKKyAgfQorCisgIHZvaWQgZ2V0U2VsZWN0b3JMb2NzKFNtYWxsVmVjdG9ySW1wbDxTb3VyY2VMb2NhdGlvbj4gJlNlbExvY3MpIGNvbnN0OworCisgIHVuc2lnbmVkIGdldE51bVNlbGVjdG9yTG9jcygpIGNvbnN0IHsKKyAgICBpZiAoaXNJbXBsaWNpdCgpKQorICAgICAgcmV0dXJuIDA7CisgICAgU2VsZWN0b3IgU2VsID0gZ2V0U2VsZWN0b3IoKTsKKyAgICBpZiAoU2VsLmlzVW5hcnlTZWxlY3RvcigpKQorICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIFNlbC5nZXROdW1BcmdzKCk7CisgIH0KKworICB2b2lkIHNldFNvdXJjZVJhbmdlKFNvdXJjZVJhbmdlIFIpIHsKKyAgICBMQnJhY0xvYyA9IFIuZ2V0QmVnaW4oKTsKKyAgICBSQnJhY0xvYyA9IFIuZ2V0RW5kKCk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gTEJyYWNMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSQnJhY0xvYzsgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpOworCisgIHVzaW5nIGFyZ19pdGVyYXRvciA9IEV4cHJJdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfYXJnX2l0ZXJhdG9yID0gQ29uc3RFeHBySXRlcmF0b3I7CisKKyAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8YXJnX2l0ZXJhdG9yPiBhcmd1bWVudHMoKSB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VfcmFuZ2UoYXJnX2JlZ2luKCksIGFyZ19lbmQoKSk7CisgIH0KKworICBsbHZtOjppdGVyYXRvcl9yYW5nZTxjb25zdF9hcmdfaXRlcmF0b3I+IGFyZ3VtZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZV9yYW5nZShhcmdfYmVnaW4oKSwgYXJnX2VuZCgpKTsKKyAgfQorCisgIGFyZ19pdGVyYXRvciBhcmdfYmVnaW4oKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFN0bXQgKio+KGdldEFyZ3MoKSk7IH0KKworICBhcmdfaXRlcmF0b3IgYXJnX2VuZCgpICAgeyAKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPihnZXRBcmdzKCkgKyBOdW1BcmdzKTsgCisgIH0KKworICBjb25zdF9hcmdfaXRlcmF0b3IgYXJnX2JlZ2luKCkgY29uc3QgeyAKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTdG10IGNvbnN0ICogY29uc3QqPihnZXRBcmdzKCkpOyAKKyAgfQorCisgIGNvbnN0X2FyZ19pdGVyYXRvciBhcmdfZW5kKCkgY29uc3QgeyAKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTdG10IGNvbnN0ICogY29uc3QqPihnZXRBcmdzKCkgKyBOdW1BcmdzKTsgCisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT2JqQ01lc3NhZ2VFeHByQ2xhc3M7CisgIH0KK307CisKKy8vLyBPYmpDSXNhRXhwciAtIFJlcHJlc2VudCBYLT5pc2EgYW5kIFguaXNhIHdoZW4gWCBpcyBhbiBPYmpDICdpZCcgdHlwZS4KKy8vLyAoc2ltaWxhciBpbiBzcGlyaXQgdG8gTWVtYmVyRXhwcikuCitjbGFzcyBPYmpDSXNhRXhwciA6IHB1YmxpYyBFeHByIHsKKyAgLy8vIEJhc2UgLSB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlIGJhc2Ugb2JqZWN0IHBvaW50ZXIuCisgIFN0bXQgKkJhc2U7CisKKyAgLy8vIElzYU1lbWJlckxvYyAtIFRoaXMgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSAnaXNhJy4KKyAgU291cmNlTG9jYXRpb24gSXNhTWVtYmVyTG9jOworICAKKyAgLy8vIE9wTG9jIC0gVGhpcyBpcyB0aGUgbG9jYXRpb24gb2YgJy4nIG9yICctPicKKyAgU291cmNlTG9jYXRpb24gT3BMb2M7CisKKyAgLy8vIElzQXJyb3cgLSBUcnVlIGlmIHRoaXMgaXMgIlgtPkYiLCBmYWxzZSBpZiB0aGlzIGlzICJYLkYiLgorICBib29sIElzQXJyb3c7CisKK3B1YmxpYzoKKyAgT2JqQ0lzYUV4cHIoRXhwciAqYmFzZSwgYm9vbCBpc2Fycm93LCBTb3VyY2VMb2NhdGlvbiBsLCBTb3VyY2VMb2NhdGlvbiBvcGxvYywKKyAgICAgICAgICAgICAgUXVhbFR5cGUgdHkpCisgICAgICA6IEV4cHIoT2JqQ0lzYUV4cHJDbGFzcywgdHksIFZLX0xWYWx1ZSwgT0tfT3JkaW5hcnksCisgICAgICAgICAgICAgLypUeXBlRGVwZW5kZW50PSovZmFsc2UsIGJhc2UtPmlzVmFsdWVEZXBlbmRlbnQoKSwKKyAgICAgICAgICAgICBiYXNlLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnQoKSwKKyAgICAgICAgICAgICAvKkNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2s9Ki9mYWxzZSksCisgICAgICAgIEJhc2UoYmFzZSksIElzYU1lbWJlckxvYyhsKSwgT3BMb2Mob3Bsb2MpLCBJc0Fycm93KGlzYXJyb3cpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBleHByZXNzaW9uLgorICBleHBsaWNpdCBPYmpDSXNhRXhwcihFbXB0eVNoZWxsIEVtcHR5KSA6IEV4cHIoT2JqQ0lzYUV4cHJDbGFzcywgRW1wdHkpIHt9CisKKyAgdm9pZCBzZXRCYXNlKEV4cHIgKkUpIHsgQmFzZSA9IEU7IH0KKyAgRXhwciAqZ2V0QmFzZSgpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8RXhwcj4oQmFzZSk7IH0KKworICBib29sIGlzQXJyb3coKSBjb25zdCB7IHJldHVybiBJc0Fycm93OyB9CisgIHZvaWQgc2V0QXJyb3coYm9vbCBBKSB7IElzQXJyb3cgPSBBOyB9CisKKyAgLy8vIGdldE1lbWJlckxvYyAtIFJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlICJtZW1iZXIiLCBpbiBYLT5GLCBpdCBpcyB0aGUKKyAgLy8vIGxvY2F0aW9uIG9mICdGJy4KKyAgU291cmNlTG9jYXRpb24gZ2V0SXNhTWVtYmVyTG9jKCkgY29uc3QgeyByZXR1cm4gSXNhTWVtYmVyTG9jOyB9CisgIHZvaWQgc2V0SXNhTWVtYmVyTG9jKFNvdXJjZUxvY2F0aW9uIEwpIHsgSXNhTWVtYmVyTG9jID0gTDsgfQorICAKKyAgU291cmNlTG9jYXRpb24gZ2V0T3BMb2MoKSBjb25zdCB7IHJldHVybiBPcExvYzsgfQorICB2b2lkIHNldE9wTG9jKFNvdXJjZUxvY2F0aW9uIEwpIHsgT3BMb2MgPSBMOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gZ2V0QmFzZSgpLT5nZXRMb2NTdGFydCgpOworICB9CisgIAorICBTb3VyY2VMb2NhdGlvbiBnZXRCYXNlTG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGdldEJhc2UoKS0+Z2V0TG9jRW5kKCk7CisgIH0KKyAgCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gSXNhTWVtYmVyTG9jOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0RXhwckxvYygpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gSXNhTWVtYmVyTG9jOyB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoJkJhc2UsICZCYXNlKzEpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9iakNJc2FFeHByQ2xhc3M7CisgIH0KK307CisKKy8vLyBPYmpDSW5kaXJlY3RDb3B5UmVzdG9yZUV4cHIgLSBSZXByZXNlbnRzIHRoZSBwYXNzaW5nIG9mIGEgZnVuY3Rpb24KKy8vLyBhcmd1bWVudCBieSBpbmRpcmVjdCBjb3B5LXJlc3RvcmUgaW4gQVJDLiAgVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQKKy8vLyBwYXNzaW5nIGluZGlyZWN0IGFyZ3VtZW50cyB3aXRoIHRoZSB3cm9uZyBsaWZldGltZSwgZS5nLiB3aGVuCisvLy8gcGFzc2luZyB0aGUgYWRkcmVzcyBvZiBhIF9fc3Ryb25nIGxvY2FsIHZhcmlhYmxlIHRvIGFuICdvdXQnCisvLy8gcGFyYW1ldGVyLiAgVGhpcyBleHByZXNzaW9uIGtpbmQgaXMgb25seSB2YWxpZCBpbiBhbiAiYXJndW1lbnQiCisvLy8gcG9zaXRpb24gdG8gc29tZSBzb3J0IG9mIGNhbGwgZXhwcmVzc2lvbi4KKy8vLworLy8vIFRoZSBwYXJhbWV0ZXIgbXVzdCBoYXZlIHR5cGUgJ3BvaW50ZXIgdG8gVCcsIGFuZCB0aGUgYXJndW1lbnQgbXVzdAorLy8vIGhhdmUgdHlwZSAncG9pbnRlciB0byBVJywgd2hlcmUgVCBhbmQgVSBhZ3JlZSBleGNlcHQgcG9zc2libHkgaW4KKy8vLyBxdWFsaWZpY2F0aW9uLiAgSWYgdGhlIGFyZ3VtZW50IHZhbHVlIGlzIG51bGwsIHRoZW4gYSBudWxsIHBvaW50ZXIKKy8vLyBpcyBwYXNzZWQ7ICBvdGhlcndpc2UgaXQgcG9pbnRzIHRvIGFuIG9iamVjdCBBLCBhbmQ6CisvLy8gMS4gQSB0ZW1wb3Jhcnkgb2JqZWN0IEIgb2YgdHlwZSBUIGlzIGluaXRpYWxpemVkLCBlaXRoZXIgYnkKKy8vLyAgICB6ZXJvLWluaXRpYWxpemF0aW9uICh1c2VkIHdoZW4gaW5pdGlhbGl6aW5nIGFuICdvdXQnIHBhcmFtZXRlcikKKy8vLyAgICBvciBjb3B5LWluaXRpYWxpemF0aW9uICh1c2VkIHdoZW4gaW5pdGlhbGl6aW5nIGFuICdpbm91dCcKKy8vLyAgICBwYXJhbWV0ZXIpLgorLy8vIDIuIFRoZSBhZGRyZXNzIG9mIHRoZSB0ZW1wb3JhcnkgaXMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4KKy8vLyAzLiBJZiB0aGUgY2FsbCBjb21wbGV0ZXMgbm9ybWFsbHksIEEgaXMgbW92ZS1hc3NpZ25lZCBmcm9tIEIuCisvLy8gNC4gRmluYWxseSwgQSBpcyBkZXN0cm95ZWQgaW1tZWRpYXRlbHkuCisvLy8KKy8vLyBDdXJyZW50bHkgJ1QnIG11c3QgYmUgYSByZXRhaW5hYmxlIG9iamVjdCBsaWZldGltZSBhbmQgbXVzdCBiZQorLy8vIF9fYXV0b3JlbGVhc2luZzsgIHRoaXMgcXVhbGlmaWVyIGlzIGlnbm9yZWQgd2hlbiBpbml0aWFsaXppbmcKKy8vLyB0aGUgdmFsdWUuCitjbGFzcyBPYmpDSW5kaXJlY3RDb3B5UmVzdG9yZUV4cHIgOiBwdWJsaWMgRXhwciB7CisgIGZyaWVuZCBjbGFzcyBBU1RSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIFN0bXQgKk9wZXJhbmQ7CisKKyAgLy8gdW5zaWduZWQgT2JqQ0luZGlyZWN0Q29weVJlc3RvcmVCaXRzLlNob3VsZENvcHkgOiAxOworCisgIGV4cGxpY2l0IE9iakNJbmRpcmVjdENvcHlSZXN0b3JlRXhwcihFbXB0eVNoZWxsIEVtcHR5KQorICAgICAgOiBFeHByKE9iakNJbmRpcmVjdENvcHlSZXN0b3JlRXhwckNsYXNzLCBFbXB0eSkge30KKworICB2b2lkIHNldFNob3VsZENvcHkoYm9vbCBzaG91bGRDb3B5KSB7CisgICAgT2JqQ0luZGlyZWN0Q29weVJlc3RvcmVFeHByQml0cy5TaG91bGRDb3B5ID0gc2hvdWxkQ29weTsKKyAgfQorCitwdWJsaWM6CisgIE9iakNJbmRpcmVjdENvcHlSZXN0b3JlRXhwcihFeHByICpvcGVyYW5kLCBRdWFsVHlwZSB0eXBlLCBib29sIHNob3VsZENvcHkpCisgICAgICA6IEV4cHIoT2JqQ0luZGlyZWN0Q29weVJlc3RvcmVFeHByQ2xhc3MsIHR5cGUsIFZLX0xWYWx1ZSwgT0tfT3JkaW5hcnksCisgICAgICAgICAgICAgb3BlcmFuZC0+aXNUeXBlRGVwZW5kZW50KCksIG9wZXJhbmQtPmlzVmFsdWVEZXBlbmRlbnQoKSwKKyAgICAgICAgICAgICBvcGVyYW5kLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnQoKSwKKyAgICAgICAgICAgICBvcGVyYW5kLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgICBPcGVyYW5kKG9wZXJhbmQpIHsKKyAgICBzZXRTaG91bGRDb3B5KHNob3VsZENvcHkpOworICB9CisKKyAgRXhwciAqZ2V0U3ViRXhwcigpIHsgcmV0dXJuIGNhc3Q8RXhwcj4oT3BlcmFuZCk7IH0KKyAgY29uc3QgRXhwciAqZ2V0U3ViRXhwcigpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8RXhwcj4oT3BlcmFuZCk7IH0KKworICAvLy8gc2hvdWxkQ29weSAtIFRydWUgaWYgd2Ugc2hvdWxkIGRvIHRoZSAnY29weScgcGFydCBvZiB0aGUKKyAgLy8vIGNvcHktcmVzdG9yZS4gIElmIGZhbHNlLCB0aGUgdGVtcG9yYXJ5IHdpbGwgYmUgemVyby1pbml0aWFsaXplZC4KKyAgYm9vbCBzaG91bGRDb3B5KCkgY29uc3QgeyByZXR1cm4gT2JqQ0luZGlyZWN0Q29weVJlc3RvcmVFeHByQml0cy5TaG91bGRDb3B5OyB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7IHJldHVybiBjaGlsZF9yYW5nZSgmT3BlcmFuZCwgJk9wZXJhbmQrMSk7IH0gIAorCisgIC8vIFNvdXJjZSBsb2NhdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlIHN1YmV4cHJlc3Npb24uCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIE9wZXJhbmQtPmdldExvY1N0YXJ0KCk7CisgIH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBPcGVyYW5kLT5nZXRMb2NFbmQoKTt9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0RXhwckxvYygpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBnZXRTdWJFeHByKCktPmdldEV4cHJMb2MoKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqcykgeworICAgIHJldHVybiBzLT5nZXRTdG10Q2xhc3MoKSA9PSBPYmpDSW5kaXJlY3RDb3B5UmVzdG9yZUV4cHJDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBBbiBPYmplY3RpdmUtQyAiYnJpZGdlZCIgY2FzdCBleHByZXNzaW9uLCB3aGljaCBjYXN0cyBiZXR3ZWVuCisvLy8gT2JqZWN0aXZlLUMgcG9pbnRlcnMgYW5kIEMgcG9pbnRlcnMsIHRyYW5zZmVycmluZyBvd25lcnNoaXAgaW4gdGhlIHByb2Nlc3MuCisvLy8KKy8vLyBcY29kZQorLy8vIE5TU3RyaW5nICpzdHIgPSAoX19icmlkZ2VfdHJhbnNmZXIgTlNTdHJpbmcgKilDRkNyZWF0ZVN0cmluZygpOworLy8vIFxlbmRjb2RlCitjbGFzcyBPYmpDQnJpZGdlZENhc3RFeHByIGZpbmFsCisgICAgOiBwdWJsaWMgRXhwbGljaXRDYXN0RXhwciwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPE9iakNCcmlkZ2VkQ2FzdEV4cHIsIENYWEJhc2VTcGVjaWZpZXIgKj4geworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRXcml0ZXI7CisgIGZyaWVuZCBjbGFzcyBDYXN0RXhwcjsKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKworICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2M7CisgIFNvdXJjZUxvY2F0aW9uIEJyaWRnZUtleXdvcmRMb2M7CisgIHVuc2lnbmVkIEtpbmQgOiAyOworCitwdWJsaWM6CisgIE9iakNCcmlkZ2VkQ2FzdEV4cHIoU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLCBPYmpDQnJpZGdlQ2FzdEtpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICBDYXN0S2luZCBDSywgU291cmNlTG9jYXRpb24gQnJpZGdlS2V5d29yZExvYywKKyAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqVFNJbmZvLCBFeHByICpPcGVyYW5kKQorICAgICAgOiBFeHBsaWNpdENhc3RFeHByKE9iakNCcmlkZ2VkQ2FzdEV4cHJDbGFzcywgVFNJbmZvLT5nZXRUeXBlKCksIFZLX1JWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSywgT3BlcmFuZCwgMCwgVFNJbmZvKSwKKyAgICAgICAgTFBhcmVuTG9jKExQYXJlbkxvYyksIEJyaWRnZUtleXdvcmRMb2MoQnJpZGdlS2V5d29yZExvYyksIEtpbmQoS2luZCkge30KKyAgCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIGVtcHR5IE9iamVjdGl2ZS1DIGJyaWRnZWQgY2FzdC4KKyAgZXhwbGljaXQgT2JqQ0JyaWRnZWRDYXN0RXhwcihFbXB0eVNoZWxsIFNoZWxsKQorICAgICAgOiBFeHBsaWNpdENhc3RFeHByKE9iakNCcmlkZ2VkQ2FzdEV4cHJDbGFzcywgU2hlbGwsIDApIHt9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TFBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gTFBhcmVuTG9jOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hpY2gga2luZCBvZiBicmlkZ2UgaXMgYmVpbmcgcGVyZm9ybWVkIHZpYSB0aGlzIGNhc3QuCisgIE9iakNCcmlkZ2VDYXN0S2luZCBnZXRCcmlkZ2VLaW5kKCkgY29uc3QgeyAKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8T2JqQ0JyaWRnZUNhc3RLaW5kPihLaW5kKTsgCisgIH0KKyAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGtpbmQgb2YgYnJpZGdlIGJlaW5nIHBlcmZvcm1lZCBhcyBhIHN0cmluZy4KKyAgU3RyaW5nUmVmIGdldEJyaWRnZUtpbmROYW1lKCkgY29uc3Q7CisgIAorICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgYnJpZGdlIGtleXdvcmQuCisgIFNvdXJjZUxvY2F0aW9uIGdldEJyaWRnZUtleXdvcmRMb2MoKSBjb25zdCB7IHJldHVybiBCcmlkZ2VLZXl3b3JkTG9jOyB9CisgIAorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gTFBhcmVuTG9jOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIGdldFN1YkV4cHIoKS0+Z2V0TG9jRW5kKCk7CisgIH0KKyAgCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPYmpDQnJpZGdlZENhc3RFeHByQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQSBydW50aW1lIGF2YWlsYWJpbGl0eSBxdWVyeS4KKy8vLworLy8vIFRoZXJlIGFyZSAyIHdheXMgdG8gc3BlbGwgdGhpcyBub2RlOgorLy8vIFxjb2RlCisvLy8gICBAYXZhaWxhYmxlKG1hY29zIDEwLjEwLCBpb3MgOCwgKik7IC8vIE9iamVjdGl2ZS1DCisvLy8gICBfX2J1aWx0aW5fYXZhaWxhYmxlKG1hY29zIDEwLjEwLCBpb3MgOCwgKik7IC8vIEMsIEMrKywgYW5kIE9iamVjdGl2ZS1DCisvLy8gXGVuZGNvZGUKKy8vLworLy8vIE5vdGUgdGhhdCB3ZSBvbmx5IG5lZWQgdG8ga2VlcCB0cmFjayBvZiBvbmUgXGMgVmVyc2lvblR1cGxlIGhlcmUsIHdoaWNoIGlzCisvLy8gdGhlIG9uZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGRlcGxveW1lbnQgdGFyZ2V0LiBUaGlzIGlzIG1lYW50IHRvCisvLy8gYmUgdXNlZCBpbiB0aGUgY29uZGl0aW9uIG9mIGFuIFxjIGlmLCBidXQgaXQgaXMgYWxzbyB1c2FibGUgYXMgdG9wIGxldmVsCisvLy8gZXhwcmVzc2lvbnMuCisvLy8KK2NsYXNzIE9iakNBdmFpbGFiaWxpdHlDaGVja0V4cHIgOiBwdWJsaWMgRXhwciB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIFZlcnNpb25UdXBsZSBWZXJzaW9uVG9DaGVjazsKKyAgU291cmNlTG9jYXRpb24gQXRMb2MsIFJQYXJlbjsKKworcHVibGljOgorICBPYmpDQXZhaWxhYmlsaXR5Q2hlY2tFeHByKFZlcnNpb25UdXBsZSBWZXJzaW9uVG9DaGVjaywgU291cmNlTG9jYXRpb24gQXRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuLCBRdWFsVHlwZSBUeSkKKyAgICAgIDogRXhwcihPYmpDQXZhaWxhYmlsaXR5Q2hlY2tFeHByQ2xhc3MsIFR5LCBWS19SVmFsdWUsIE9LX09yZGluYXJ5LCBmYWxzZSwKKyAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgVmVyc2lvblRvQ2hlY2soVmVyc2lvblRvQ2hlY2spLCBBdExvYyhBdExvYyksIFJQYXJlbihSUGFyZW4pIHt9CisKKyAgZXhwbGljaXQgT2JqQ0F2YWlsYWJpbGl0eUNoZWNrRXhwcihFbXB0eVNoZWxsIFNoZWxsKQorICAgICAgOiBFeHByKE9iakNBdmFpbGFiaWxpdHlDaGVja0V4cHJDbGFzcywgU2hlbGwpIHt9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCB7IHJldHVybiBBdExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCB7IHJldHVybiBSUGFyZW47IH0KKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCB7IHJldHVybiB7QXRMb2MsIFJQYXJlbn07IH0KKworICAvLy8gXGJyaWVmIFRoaXMgbWF5IGJlICcqJywgaW4gd2hpY2ggY2FzZSB0aGlzIHNob3VsZCBmb2xkIHRvIHRydWUuCisgIGJvb2wgaGFzVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuICFWZXJzaW9uVG9DaGVjay5lbXB0eSgpOyB9CisgIFZlcnNpb25UdXBsZSBnZXRWZXJzaW9uKCkgeyByZXR1cm4gVmVyc2lvblRvQ2hlY2s7IH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoY2hpbGRfaXRlcmF0b3IoKSwgY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT2JqQ0F2YWlsYWJpbGl0eUNoZWNrRXhwckNsYXNzOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19BU1RfRVhQUk9CSkNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0V4cHJPcGVuTVAuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9FeHByT3Blbk1QLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRlZjkzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9FeHByT3Blbk1QLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8vPT09LS0tIEV4cHJPcGVuTVAuaCAtIENsYXNzZXMgZm9yIHJlcHJlc2VudGluZyBleHByZXNzaW9ucyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBFeHByIGludGVyZmFjZSBhbmQgc3ViY2xhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0VYUFJPUEVOTVBfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9FWFBST1BFTk1QX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisvLy8gXGJyaWVmIE9wZW5NUCA0LjAgWzIuNCwgQXJyYXkgU2VjdGlvbnNdLgorLy8vIFRvIHNwZWNpZnkgYW4gYXJyYXkgc2VjdGlvbiBpbiBhbiBPcGVuTVAgY29uc3RydWN0LCBhcnJheSBzdWJzY3JpcHQKKy8vLyBleHByZXNzaW9ucyBhcmUgZXh0ZW5kZWQgd2l0aCB0aGUgZm9sbG93aW5nIHN5bnRheDoKKy8vLyBcY29kZQorLy8vIFsgbG93ZXItYm91bmQgOiBsZW5ndGggXQorLy8vIFsgbG93ZXItYm91bmQgOiBdCisvLy8gWyA6IGxlbmd0aCBdCisvLy8gWyA6IF0KKy8vLyBcZW5kY29kZQorLy8vIFRoZSBhcnJheSBzZWN0aW9uIG11c3QgYmUgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIGFycmF5LgorLy8vIEFycmF5IHNlY3Rpb25zIGFyZSBhbGxvd2VkIG9uIG11bHRpZGltZW5zaW9uYWwgYXJyYXlzLiBCYXNlIGxhbmd1YWdlIGFycmF5CisvLy8gc3Vic2NyaXB0IGV4cHJlc3Npb25zIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgbGVuZ3RoLW9uZSBkaW1lbnNpb25zIG9mCisvLy8gbXVsdGlkaW1lbnNpb25hbCBhcnJheSBzZWN0aW9ucy4KKy8vLyBUaGUgbG93ZXItYm91bmQgYW5kIGxlbmd0aCBhcmUgaW50ZWdyYWwgdHlwZSBleHByZXNzaW9ucy4gV2hlbiBldmFsdWF0ZWQKKy8vLyB0aGV5IHJlcHJlc2VudCBhIHNldCBvZiBpbnRlZ2VyIHZhbHVlcyBhcyBmb2xsb3dzOgorLy8vIFxjb2RlCisvLy8geyBsb3dlci1ib3VuZCwgbG93ZXItYm91bmQgKyAxLCBsb3dlci1ib3VuZCArIDIsLi4uICwgbG93ZXItYm91bmQgKyBsZW5ndGggLQorLy8vIDEgfQorLy8vIFxlbmRjb2RlCisvLy8gVGhlIGxvd2VyLWJvdW5kIGFuZCBsZW5ndGggbXVzdCBldmFsdWF0ZSB0byBub24tbmVnYXRpdmUgaW50ZWdlcnMuCisvLy8gV2hlbiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgZGltZW5zaW9uIGlzIG5vdCBrbm93biwgdGhlIGxlbmd0aCBtdXN0IGJlCisvLy8gc3BlY2lmaWVkIGV4cGxpY2l0bHkuCisvLy8gV2hlbiB0aGUgbGVuZ3RoIGlzIGFic2VudCwgaXQgZGVmYXVsdHMgdG8gdGhlIHNpemUgb2YgdGhlIGFycmF5IGRpbWVuc2lvbgorLy8vIG1pbnVzIHRoZSBsb3dlci1ib3VuZC4KKy8vLyBXaGVuIHRoZSBsb3dlci1ib3VuZCBpcyBhYnNlbnQgaXQgZGVmYXVsdHMgdG8gMC4KK2NsYXNzIE9NUEFycmF5U2VjdGlvbkV4cHIgOiBwdWJsaWMgRXhwciB7CisgIGVudW0geyBCQVNFLCBMT1dFUl9CT1VORCwgTEVOR1RILCBFTkRfRVhQUiB9OworICBTdG10ICpTdWJFeHByc1tFTkRfRVhQUl07CisgIFNvdXJjZUxvY2F0aW9uIENvbG9uTG9jOworICBTb3VyY2VMb2NhdGlvbiBSQnJhY2tldExvYzsKKworcHVibGljOgorICBPTVBBcnJheVNlY3Rpb25FeHByKEV4cHIgKkJhc2UsIEV4cHIgKkxvd2VyQm91bmQsIEV4cHIgKkxlbmd0aCwgUXVhbFR5cGUgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBFeHByVmFsdWVLaW5kIFZLLCBFeHByT2JqZWN0S2luZCBPSywKKyAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYywgU291cmNlTG9jYXRpb24gUkJyYWNrZXRMb2MpCisgICAgICA6IEV4cHIoCisgICAgICAgICAgICBPTVBBcnJheVNlY3Rpb25FeHByQ2xhc3MsIFR5cGUsIFZLLCBPSywKKyAgICAgICAgICAgIEJhc2UtPmlzVHlwZURlcGVuZGVudCgpIHx8CisgICAgICAgICAgICAgICAgKExvd2VyQm91bmQgJiYgTG93ZXJCb3VuZC0+aXNUeXBlRGVwZW5kZW50KCkpIHx8CisgICAgICAgICAgICAgICAgKExlbmd0aCAmJiBMZW5ndGgtPmlzVHlwZURlcGVuZGVudCgpKSwKKyAgICAgICAgICAgIEJhc2UtPmlzVmFsdWVEZXBlbmRlbnQoKSB8fAorICAgICAgICAgICAgICAgIChMb3dlckJvdW5kICYmIExvd2VyQm91bmQtPmlzVmFsdWVEZXBlbmRlbnQoKSkgfHwKKyAgICAgICAgICAgICAgICAoTGVuZ3RoICYmIExlbmd0aC0+aXNWYWx1ZURlcGVuZGVudCgpKSwKKyAgICAgICAgICAgIEJhc2UtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpIHx8CisgICAgICAgICAgICAgICAgKExvd2VyQm91bmQgJiYgTG93ZXJCb3VuZC0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCkpIHx8CisgICAgICAgICAgICAgICAgKExlbmd0aCAmJiBMZW5ndGgtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpKSwKKyAgICAgICAgICAgIEJhc2UtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSB8fAorICAgICAgICAgICAgICAgIChMb3dlckJvdW5kICYmIExvd2VyQm91bmQtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSkgfHwKKyAgICAgICAgICAgICAgICAoTGVuZ3RoICYmIExlbmd0aC0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSksCisgICAgICAgIENvbG9uTG9jKENvbG9uTG9jKSwgUkJyYWNrZXRMb2MoUkJyYWNrZXRMb2MpIHsKKyAgICBTdWJFeHByc1tCQVNFXSA9IEJhc2U7CisgICAgU3ViRXhwcnNbTE9XRVJfQk9VTkRdID0gTG93ZXJCb3VuZDsKKyAgICBTdWJFeHByc1tMRU5HVEhdID0gTGVuZ3RoOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gZW1wdHkgYXJyYXkgc2VjdGlvbiBleHByZXNzaW9uLgorICBleHBsaWNpdCBPTVBBcnJheVNlY3Rpb25FeHByKEVtcHR5U2hlbGwgU2hlbGwpCisgICAgICA6IEV4cHIoT01QQXJyYXlTZWN0aW9uRXhwckNsYXNzLCBTaGVsbCkge30KKworICAvLy8gQW4gYXJyYXkgc2VjdGlvbiBjYW4gYmUgd3JpdHRlbiBvbmx5IGFzIEJhc2VbTG93ZXJCb3VuZDpMZW5ndGhdLgorCisgIC8vLyBcYnJpZWYgR2V0IGJhc2Ugb2YgdGhlIGFycmF5IHNlY3Rpb24uCisgIEV4cHIgKmdldEJhc2UoKSB7IHJldHVybiBjYXN0PEV4cHI+KFN1YkV4cHJzW0JBU0VdKTsgfQorICBjb25zdCBFeHByICpnZXRCYXNlKCkgY29uc3QgeyByZXR1cm4gY2FzdDxFeHByPihTdWJFeHByc1tCQVNFXSk7IH0KKyAgLy8vIFxicmllZiBTZXQgYmFzZSBvZiB0aGUgYXJyYXkgc2VjdGlvbi4KKyAgdm9pZCBzZXRCYXNlKEV4cHIgKkUpIHsgU3ViRXhwcnNbQkFTRV0gPSBFOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gb3JpZ2luYWwgdHlwZSBvZiB0aGUgYmFzZSBleHByZXNzaW9uIGZvciBhcnJheSBzZWN0aW9uLgorICBzdGF0aWMgUXVhbFR5cGUgZ2V0QmFzZU9yaWdpbmFsVHlwZShjb25zdCBFeHByICpCYXNlKTsKKworICAvLy8gXGJyaWVmIEdldCBsb3dlciBib3VuZCBvZiBhcnJheSBzZWN0aW9uLgorICBFeHByICpnZXRMb3dlckJvdW5kKCkgeyByZXR1cm4gY2FzdF9vcl9udWxsPEV4cHI+KFN1YkV4cHJzW0xPV0VSX0JPVU5EXSk7IH0KKyAgY29uc3QgRXhwciAqZ2V0TG93ZXJCb3VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPEV4cHI+KFN1YkV4cHJzW0xPV0VSX0JPVU5EXSk7CisgIH0KKyAgLy8vIFxicmllZiBTZXQgbG93ZXIgYm91bmQgb2YgdGhlIGFycmF5IHNlY3Rpb24uCisgIHZvaWQgc2V0TG93ZXJCb3VuZChFeHByICpFKSB7IFN1YkV4cHJzW0xPV0VSX0JPVU5EXSA9IEU7IH0KKworICAvLy8gXGJyaWVmIEdldCBsZW5ndGggb2YgYXJyYXkgc2VjdGlvbi4KKyAgRXhwciAqZ2V0TGVuZ3RoKCkgeyByZXR1cm4gY2FzdF9vcl9udWxsPEV4cHI+KFN1YkV4cHJzW0xFTkdUSF0pOyB9CisgIGNvbnN0IEV4cHIgKmdldExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIGNhc3Rfb3JfbnVsbDxFeHByPihTdWJFeHByc1tMRU5HVEhdKTsgfQorICAvLy8gXGJyaWVmIFNldCBsZW5ndGggb2YgdGhlIGFycmF5IHNlY3Rpb24uCisgIHZvaWQgc2V0TGVuZ3RoKEV4cHIgKkUpIHsgU3ViRXhwcnNbTEVOR1RIXSA9IEU7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBnZXRCYXNlKCktPmdldExvY1N0YXJ0KCk7CisgIH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSQnJhY2tldExvYzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldENvbG9uTG9jKCkgY29uc3QgeyByZXR1cm4gQ29sb25Mb2M7IH0KKyAgdm9pZCBzZXRDb2xvbkxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IENvbG9uTG9jID0gTDsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFJCcmFja2V0TG9jKCkgY29uc3QgeyByZXR1cm4gUkJyYWNrZXRMb2M7IH0KKyAgdm9pZCBzZXRSQnJhY2tldExvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IFJCcmFja2V0TG9jID0gTDsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEV4cHJMb2MoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gZ2V0QmFzZSgpLT5nZXRFeHByTG9jKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QQXJyYXlTZWN0aW9uRXhwckNsYXNzOworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKCZTdWJFeHByc1tCQVNFXSwgJlN1YkV4cHJzW0VORF9FWFBSXSk7CisgIH0KK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRXh0ZXJuYWxBU1RNZXJnZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9FeHRlcm5hbEFTVE1lcmdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNDkyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvRXh0ZXJuYWxBU1RNZXJnZXIuaApAQCAtMCwwICsxLDE3NiBAQAorLy89PT0tLS0gRXh0ZXJuYWxBU1RNZXJnZXIuaCAtIE1lcmdpbmcgRXh0ZXJuYWwgQVNUIEludGVyZmFjZSAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBFeHRlcm5hbEFTVE1lcmdlciwgd2hpY2ggdmVuZHMgYSBjb21iaW5hdGlvbiBvZiBBU1RzCisvLyAgZnJvbSBzZXZlcmFsIGRpZmZlcmVudCBBU1RDb250ZXh0L0ZpbGVNYW5hZ2VyIHBhaXJzCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfRVhURVJOQUxBU1RNRVJHRVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9FWFRFUk5BTEFTVE1FUkdFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvQVNUSW1wb3J0ZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXh0ZXJuYWxBU1RTb3VyY2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIEV4dGVybmFsQVNUU291cmNlIGltcGxlbWVudGF0aW9uIHRoYXQgbWVyZ2VzIGluZm9ybWF0aW9uIGZyb20gc2V2ZXJhbAorLy8vIEFTVENvbnRleHRzLgorLy8vCisvLy8gRXh0ZXJtYWxBU1RNZXJnZXIgbWFpbnRhaW5zIGEgdmVjdG9yIG9mIEFTVEltcG9ydGVycyB0aGF0IGl0IHVzZXMgdG8gaW1wb3J0CisvLy8gKHBvdGVudGlhbGx5IGluY29tcGxldGUpIERlY2xzIGFuZCBEZWNsQ29udGV4dHMgZnJvbSB0aGUgc291cmNlIEFTVENvbnRleHRzCisvLy8gaW4gcmVzcG9uc2UgdG8gRXh0ZXJuYWxBU1RTb3VyY2UgQVBJIGNhbGxzLgorLy8vCisvLy8gV2hlbiBsb29rdXAgb2NjdXJzIGluIHRoZSByZXN1bHRpbmcgaW1wb3J0ZWQgRGVjbENvbnRleHRzLCB0aGUgb3JpZ2luYWwKKy8vLyBEZWNsQ29udGV4dHMgbmVlZCB0byBiZSBxdWVyaWVkLiAgUm91Z2hseSwgdGhlcmUgYXJlIHRocmVlIGNhc2VzIGhlcmU6CisvLy8KKy8vLyAtIFRoZSBEZWNsQ29udGV4dCBvZiBvcmlnaW4gY2FuIGJlIGZvdW5kIGJ5IHNpbXBsZSBuYW1lIGxvb2t1cC4gIEluIHRoaXMKKy8vLyAgIGNhc2UsIG5vIGFkZGl0aW9uYWwgc3RhdGUgaXMgcmVxdWlyZWQuCisvLy8KKy8vLyAtIFRoZSBEZWNsQ29udGV4dCBvZiBvcmlnaW4gaXMgZGlmZmVyZW50IGZyb20gd2hhdCB3b3VsZCBiZSBmb3VuZCBieSBuYW1lCisvLy8gICBsb29rdXAuICBJbiB0aGlzIGNhc2UsIE9yaWdpbnMgY29udGFpbnMgYW4gZW50cnkgb3ZlcnJpZGluZyBsb29rdXAgYW5kCisvLy8gICBzcGVjaWZ5aW5nIHRoZSBjb3JyZWN0IHBhaXIgb2YgRGVjbENvbnRleHQvQVNUQ29udGV4dC4KKy8vLworLy8vIC0gVGhlIERlY2xDb250ZXh0IG9mIG9yaWdpbiB3YXMgZGV0ZXJtaW5lZCBieSBhbm90aGVyIEV4dGVyZW5hbEFTVE1lcmdlci4gCisvLy8gICAoVGhpcyBpcyBwb3NzaWJsZSB3aGVuIHRoZSBzb3VyY2UgQVNUQ29udGV4dCBmb3Igb25lIG9mIHRoZSBJbXBvcnRlcnMgaGFzCisvLy8gICBpdHMgb3duIEV4dGVybmFsQVNUTWVyZ2VyKS4gIFRoZSBvcmlnaW4gbXVzdCBiZSBwcm9wZXJseSBmb3J3YXJkZWQgaW4gdGhpcworLy8vICAgY2FzZS4KKy8vLworLy8vIEV4dGVybmFsQVNUTWVyZ2VyJ3Mgam9iIGlzIHRvIG1haW50YWluIHRoZSBkYXRhIHN0cnVjdHVyZXMgbmVjZXNzYXJ5IHRvCisvLy8gYWxsb3cgdGhpcy4gIFRoZSBkYXRhIHN0cnVjdHVyZXMgdGhlbXNlbHZlcyBjYW4gYmUgZXh0cmFjdGVkIChyZWFkLW9ubHkpIGFuZAorLy8vIGNvcGllZCBmb3IgcmUtdXNlLgorY2xhc3MgRXh0ZXJuYWxBU1RNZXJnZXIgOiBwdWJsaWMgRXh0ZXJuYWxBU1RTb3VyY2UgeworcHVibGljOgorICAvLy8gQSBzaW5nbGUgb3JpZ2luIGZvciBhIERlY2xDb250ZXh0LiAgVW5saWtlIERlY2xzLCBEZWNsQ29udGV4dHMgZG8KKyAgLy8vIG5vdCBhbGxvdyB0aGVpciBjb250YWluaW5nIEFTVENvbnRleHQgdG8gYmUgZGV0ZXJtaW5lZCBpbiBhbGwgY2FzZXMuCisgIHN0cnVjdCBEQ09yaWdpbiB7CisgICAgRGVjbENvbnRleHQgKkRDOworICAgIEFTVENvbnRleHQgKkFTVDsKKyAgfTsKKworICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IERlY2xDb250ZXh0ICosIERDT3JpZ2luPiBPcmlnaW5NYXA7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFTVEltcG9ydGVyPj4gSW1wb3J0ZXJWZWN0b3I7Citwcml2YXRlOgorICAvLy8gT25lIGltcG9ydGVyIGV4aXN0cyBmb3IgZWFjaCBzb3VyY2UuICAKKyAgSW1wb3J0ZXJWZWN0b3IgSW1wb3J0ZXJzOworICAvLy8gT3ZlcnJpZGVzIGluIGNhc2UgbmFtZSBsb29rdXAgd291bGQgcmV0dXJuIG5vdGhpbmcgb3Igd291bGQgcmV0dXJuCisgIC8vLyB0aGUgd3JvbmcgdGhpbmcuCisgIE9yaWdpbk1hcCBPcmlnaW5zOworICAvLy8gVGhlIGluc3RhbGxlZCBsb2cgc3RyZWFtLgorICBsbHZtOjpyYXdfb3N0cmVhbSAqTG9nU3RyZWFtOworCitwdWJsaWM6CisgIC8vLyBUaGUgdGFyZ2V0IGZvciBhbiBFeHRlcm5hbEFTVE1lcmdlci4KKyAgLy8vCisgIC8vLyBBU1RJbXBvcnRlcnMgcmVxdWlyZSBib3RoIEFTVENvbnRleHQgYW5kIEZpbGVNYW5hZ2VyIHRvIGJlIGFibGUgdG8KKyAgLy8vIGltcG9ydCBTb3VyY2VMb2NhdGlvbnMgcHJvcGVybHkuCisgIHN0cnVjdCBJbXBvcnRlclRhcmdldCB7CisgICAgQVNUQ29udGV4dCAmQVNUOworICAgIEZpbGVNYW5hZ2VyICZGTTsKKyAgfTsKKyAgLy8vIEEgc291cmNlIGZvciBhbiBFeHRlcm5hbEFTVE1lcmdlci4KKyAgLy8vCisgIC8vLyBBU1RJbXBvcnRlcnMgcmVxdWlyZSBib3RoIEFTVENvbnRleHQgYW5kIEZpbGVNYW5hZ2VyIHRvIGJlIGFibGUgdG8KKyAgLy8vIGltcG9ydCBTb3VyY2VMb2NhdGlvbnMgcHJvcGVybHkuICBBZGRpdGlvbmFsbHksIHdoZW4gaW1wb3J0IG9jY3VycyBmb3IKKyAgLy8vIGEgRGVjbENvbnRleHQgd2hvc2Ugb3JpZ2luIGhhcyBiZWVuIG92ZXJyaWRkZW4sIHRoZW4gdGhpcworICAvLy8gRXh0ZXJuYWxBU1RNZXJnZXIgbXVzdCBiZSBhYmxlIHRvIGRldGVybWluZSB0aGF0LgorICBzdHJ1Y3QgSW1wb3J0ZXJTb3VyY2UgeworICAgIEFTVENvbnRleHQgJkFTVDsKKyAgICBGaWxlTWFuYWdlciAmRk07CisgICAgY29uc3QgT3JpZ2luTWFwICZPTTsKKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIFRoZSB0YXJnZXQgZm9yIHRoaXMgRXh0ZW5yYWxBU1RNZXJnZXIuCisgIEltcG9ydGVyVGFyZ2V0IFRhcmdldDsKKworcHVibGljOgorICBFeHRlcm5hbEFTVE1lcmdlcihjb25zdCBJbXBvcnRlclRhcmdldCAmVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICBsbHZtOjpBcnJheVJlZjxJbXBvcnRlclNvdXJjZT4gU291cmNlcyk7CisKKyAgLy8vIEFkZCBhIHNldCBvZiBBU1RDb250ZXh0cyBhcyBwb3NzaWJsZSBvcmlnaW5zLgorICAvLy8KKyAgLy8vIFVzdWFsbHkgdGhlIHNldCB3aWxsIGJlIGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3RvciwgYnV0IGxvbmctbGl2ZWQKKyAgLy8vIEV4dGVybmFsQVNUTWVyZ2VycyBtYXkgbmVlZWQgdG8gaW1wb3J0IGZyb20gbmV3IHNvdXJjZXMgKGZvciBleGFtcGxlLAorICAvLy8gbmV3bHktcGFyc2VkIHNvdXJjZSBmaWxlcykuCisgIC8vLworICAvLy8gRW5zdXJlcyB0aGF0IEltcG9ydGVycyBkb2VzIG5vdCBnYWluIGR1cGxpY2F0ZSBlbnRyaWVzIGFzIGEgcmVzdWx0LgorICB2b2lkIEFkZFNvdXJjZXMobGx2bTo6QXJyYXlSZWY8SW1wb3J0ZXJTb3VyY2U+IFNvdXJjZXMpOworCisgIC8vLyBSZW1vdmUgYSBzZXQgb2YgQVNUQ29udGV4dHMgYXMgcG9zc2libGUgb3JpZ2lucy4KKyAgLy8vCisgIC8vLyBTb21ldGltZXMgYW4gb3JpZ2luIGdvZXMgYXdheSAoZm9yIGV4YW1wbGUsIGlmIGEgc291cmNlIGZpbGUgZ2V0cworICAvLy8gc3VwZXJzZWRlZCBieSBhIG5ld2VyIHZlcnNpb24pLiAKKyAgLy8vCisgIC8vLyBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoaXMgZG9lc24ndCBsZWF2ZQorICAvLy8gRGVjbENvbnRleHRzIHRoYXQgY2FuJ3QgYmUgY29tcGxldGVkLgorICB2b2lkIFJlbW92ZVNvdXJjZXMobGx2bTo6QXJyYXlSZWY8SW1wb3J0ZXJTb3VyY2U+IFNvdXJjZXMpOworCisgIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgRXh0ZXJuYWxBU1RTb3VyY2UgQVBJLgorICBib29sIEZpbmRFeHRlcm5hbFZpc2libGVEZWNsc0J5TmFtZShjb25zdCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBOYW1lKSBvdmVycmlkZTsKKworICAvLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIEV4dGVybmFsQVNUU291cmNlIEFQSS4KKyAgdm9pZAorICBGaW5kRXh0ZXJuYWxMZXhpY2FsRGVjbHMoY29uc3QgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6ZnVuY3Rpb25fcmVmPGJvb2woRGVjbDo6S2luZCk+IElzS2luZFdlV2FudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxEZWNsICo+ICZSZXN1bHQpIG92ZXJyaWRlOworCisgIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgRXh0ZXJuYWxBU1RTb3VyY2UgQVBJLgorICB2b2lkIENvbXBsZXRlVHlwZShUYWdEZWNsICpUYWcpIG92ZXJyaWRlOworCisgIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgRXh0ZXJuYWxBU1RTb3VyY2UgQVBJLgorICB2b2lkIENvbXBsZXRlVHlwZShPYmpDSW50ZXJmYWNlRGVjbCAqSW50ZXJmYWNlKSBvdmVycmlkZTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIERDIGNhbiBiZSBmb3VuZCBpbiBhbnkgc291cmNlIEFTVCBjb250ZXh0LgorICBib29sIENhbkNvbXBsZXRlKERlY2xDb250ZXh0ICpEQyk7CisKKyAgLy8vIFJlY29yZHMgYW4gb3JpZ2luIGluIE9yaWdpbnMgb25seSBpZiBuYW1lIGxvb2t1cCB3b3VsZCBmaW5kCisgIC8vLyBzb21ldGhpbmcgZGlmZmVyZW50IG9yIG5vdGhpbmcgYXQgYWxsLgorICB2b2lkIE1heWJlUmVjb3JkT3JpZ2luKGNvbnN0IERlY2xDb250ZXh0ICpUb0RDLCBEQ09yaWdpbiBPcmlnaW4pOworCisgIC8vLyBSZWdhcmRsZXNzIG9mIGFueSBjaGVja3MsIG92ZXJyaWRlIHRoZSBPcmlnaW4gZm9yIGEgRGVjbENvbnRleHQuCisgIHZvaWQgRm9yY2VSZWNvcmRPcmlnaW4oY29uc3QgRGVjbENvbnRleHQgKlRvREMsIERDT3JpZ2luIE9yaWdpbik7CisKKyAgLy8vIEdldCBhIHJlYWQtb25seSB2aWV3IG9mIHRoZSBPcmlnaW5zIG1hcCwgZm9yIHVzZSBpbiBjb25zdHJ1Y3RpbmcKKyAgLy8vIGFuIEltcG9ydGVyU291cmNlIGZvciBhbm90aGVyIEV4dGVybmFsQVNUTWVyZ2VyLgorICBjb25zdCBPcmlnaW5NYXAgJkdldE9yaWdpbnMoKSB7IHJldHVybiBPcmlnaW5zOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBJbXBvcnRlcnMgY29udGFpbnMgYW4gQVNUSW1wb3J0ZXIgd2hvc2Ugc291cmNlIGlzCisgIC8vLyBPcmlnaW5Db250ZXh0LgorICBib29sIEhhc0ltcG9ydGVyRm9yT3JpZ2luKEFTVENvbnRleHQgJk9yaWdpbkNvbnRleHQpOworCisgIC8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBBU1RSSW1wb3J0ZXIgZnJvbSBJbXBvcnRlcnMgd2hvc2Ugb3JpZ2luCisgIC8vLyBpcyBPcmlnaW5Db250ZXh0LiAgVGhpcyBhbGxvd3MgbWFudWFsIGltcG9ydCBvZiBBU1RzIHdoaWxlIHByZXNlcnZpbmcgdGhlCisgIC8vLyBPcmlnaW5NYXAgY29ycmVjdGx5LgorICBBU1RJbXBvcnRlciAmSW1wb3J0ZXJGb3JPcmlnaW4oQVNUQ29udGV4dCAmT3JpZ2luQ29udGV4dCk7CisKKyAgLy8vIFNldHMgdGhlIGN1cnJlbnQgbG9nIHN0cmVhbS4KKyAgdm9pZCBTZXRMb2dTdHJlYW0obGx2bTo6cmF3X3N0cmluZ19vc3RyZWFtICZTdHJlYW0pIHsgTG9nU3RyZWFtID0gJlN0cmVhbTsgfQorcHJpdmF0ZToKKyAgLy8vIFJlY29yZHMgYW5kIG9yaWdpbiBpbiBPcmlnaW5zLgorICB2b2lkIFJlY29yZE9yaWdpbkltcGwoY29uc3QgRGVjbENvbnRleHQgKlRvREMsIERDT3JpZ2luIE9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RJbXBvcnRlciAmaW1wb3J0ZXIpOworCisgIC8vLyBQZXJmb3JtcyBhbiBhY3Rpb24gZm9yIGV2ZXJ5IERlY2xDb250ZXh0IHRoYXQgaXMgaWRlbnRpZmllZCBhcworICAvLy8gY29ycmVzcG9uZGluZyAoZWl0aGVyIGJ5IGZvcmNlZCBvcmlnaW4gb3IgYnkgbmFtZSBsb29rdXApIHRvIERDLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FsbGJhY2tUeXBlPgorICB2b2lkIEZvckVhY2hNYXRjaGluZ0RDKGNvbnN0IERlY2xDb250ZXh0ICpEQywgQ2FsbGJhY2tUeXBlIENhbGxiYWNrKTsKKworcHVibGljOiAKKyAgLy8vIExvZyBzb21ldGhpbmcgaWYgdGhlcmUgaXMgYSBsb2dnaW5nIGNhbGxiYWNrIGluc3RhbGxlZC4KKyAgbGx2bTo6cmF3X29zdHJlYW0gJmxvZ3MoKSB7IHJldHVybiAqTG9nU3RyZWFtOyB9CisKKyAgLy8vIFRydWUgaWYgdGhlIGxvZyBzdHJlYW0gaXMgbm90IGxsdm06Om51bGxzKCk7CisgIGJvb2wgTG9nZ2luZ0VuYWJsZWQoKSB7IHJldHVybiBMb2dTdHJlYW0gIT0gJmxsdm06Om51bGxzKCk7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9FeHRlcm5hbEFTVFNvdXJjZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0V4dGVybmFsQVNUU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUwMTNjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9FeHRlcm5hbEFTVFNvdXJjZS5oCkBAIC0wLDAgKzEsNjEzIEBACisvLz09PS0gRXh0ZXJuYWxBU1RTb3VyY2UuaCAtIEFic3RyYWN0IEV4dGVybmFsIEFTVCBJbnRlcmZhY2UgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRXh0ZXJuYWxBU1RTb3VyY2UgaW50ZXJmYWNlLCB3aGljaCBlbmFibGVzCisvLyAgY29uc3RydWN0aW9uIG9mIEFTVCBub2RlcyBmcm9tIHNvbWUgZXh0ZXJuYWwgc291cmNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfRVhURVJOQUxBU1RTT1VSQ0VfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9FWFRFUk5BTEFTVFNPVVJDRV9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvQ2hhclVuaXRzLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xCYXNlLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL01vZHVsZS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlclVuaW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Qb2ludGVyTGlrZVR5cGVUcmFpdHMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQVNUQ29uc3VtZXI7CitjbGFzcyBBU1RDb250ZXh0OworY2xhc3MgQ1hYQmFzZVNwZWNpZmllcjsKK2NsYXNzIENYWEN0b3JJbml0aWFsaXplcjsKK2NsYXNzIENYWFJlY29yZERlY2w7CitjbGFzcyBEZWNsYXJhdGlvbk5hbWU7CitjbGFzcyBGaWVsZERlY2w7CitjbGFzcyBJZGVudGlmaWVySW5mbzsKK2NsYXNzIE5hbWVkRGVjbDsKK2NsYXNzIE9iakNJbnRlcmZhY2VEZWNsOworY2xhc3MgUmVjb3JkRGVjbDsKK2NsYXNzIFNlbGVjdG9yOworY2xhc3MgU3RtdDsKK2NsYXNzIFRhZ0RlY2w7CisKKy8vLyBcYnJpZWYgQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBleHRlcm5hbCBzb3VyY2VzIG9mIEFTVCBub2Rlcy4KKy8vLworLy8vIEV4dGVybmFsIEFTVCBzb3VyY2VzIHByb3ZpZGUgQVNUIG5vZGVzIGNvbnN0cnVjdGVkIGZyb20gc29tZQorLy8vIGV4dGVybmFsIHNvdXJjZSwgc3VjaCBhcyBhIHByZWNvbXBpbGVkIGhlYWRlci4gRXh0ZXJuYWwgQVNUCisvLy8gc291cmNlcyBjYW4gcmVzb2x2ZSB0eXBlcyBhbmQgZGVjbGFyYXRpb25zIGZyb20gYWJzdHJhY3QgSURzIGludG8KKy8vLyBhY3R1YWwgdHlwZSBhbmQgZGVjbGFyYXRpb24gbm9kZXMsIGFuZCByZWFkIHBhcnRzIG9mIGRlY2xhcmF0aW9uCisvLy8gY29udGV4dHMuCitjbGFzcyBFeHRlcm5hbEFTVFNvdXJjZSA6IHB1YmxpYyBSZWZDb3VudGVkQmFzZTxFeHRlcm5hbEFTVFNvdXJjZT4geworICBmcmllbmQgY2xhc3MgRXh0ZXJuYWxTZW1hU291cmNlOworCisgIC8vLyBHZW5lcmF0aW9uIG51bWJlciBmb3IgdGhpcyBleHRlcm5hbCBBU1Qgc291cmNlLiBNdXN0IGJlIGluY3JlYXNlZAorICAvLy8gd2hlbmV2ZXIgd2UgbWlnaHQgaGF2ZSBhZGRlZCBuZXcgcmVkZWNsYXJhdGlvbnMgZm9yIGV4aXN0aW5nIGRlY2xzLgorICB1aW50MzJfdCBDdXJyZW50R2VuZXJhdGlvbiA9IDA7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgQVNUIHNvdXJjZSBhbHNvIHByb3ZpZGVzIGluZm9ybWF0aW9uIGZvcgorICAvLy8gc2VtYW50aWMgYW5hbHlzaXMuCisgIGJvb2wgU2VtYVNvdXJjZSA9IGZhbHNlOworCitwdWJsaWM6CisgIEV4dGVybmFsQVNUU291cmNlKCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIH5FeHRlcm5hbEFTVFNvdXJjZSgpOworCisgIC8vLyBcYnJpZWYgUkFJSSBjbGFzcyBmb3Igc2FmZWx5IHBhaXJpbmcgYSBTdGFydGVkRGVzZXJpYWxpemluZyBjYWxsCisgIC8vLyB3aXRoIEZpbmlzaGVkRGVzZXJpYWxpemluZy4KKyAgY2xhc3MgRGVzZXJpYWxpemluZyB7CisgICAgRXh0ZXJuYWxBU1RTb3VyY2UgKlNvdXJjZTsKKworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRGVzZXJpYWxpemluZyhFeHRlcm5hbEFTVFNvdXJjZSAqc291cmNlKSA6IFNvdXJjZShzb3VyY2UpIHsKKyAgICAgIGFzc2VydChTb3VyY2UpOworICAgICAgU291cmNlLT5TdGFydGVkRGVzZXJpYWxpemluZygpOworICAgIH0KKworICAgIH5EZXNlcmlhbGl6aW5nKCkgeworICAgICAgU291cmNlLT5GaW5pc2hlZERlc2VyaWFsaXppbmcoKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiBvZiB0aGlzIEFTVCBzb3VyY2UuIFRoaXMgbnVtYmVyCisgIC8vLyBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgdGhlIEFTVCBzb3VyY2UgbGF6aWx5IGV4dGVuZHMgYW4gZXhpc3RpbmcKKyAgLy8vIGVudGl0eS4KKyAgdWludDMyX3QgZ2V0R2VuZXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIEN1cnJlbnRHZW5lcmF0aW9uOyB9CisKKyAgLy8vIFxicmllZiBSZXNvbHZlIGEgZGVjbGFyYXRpb24gSUQgaW50byBhIGRlY2xhcmF0aW9uLCBwb3RlbnRpYWxseQorICAvLy8gYnVpbGRpbmcgYSBuZXcgZGVjbGFyYXRpb24uCisgIC8vLworICAvLy8gVGhpcyBtZXRob2Qgb25seSBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBpZiB0aGUgQVNUIHNvdXJjZSBldmVyCisgIC8vLyBwYXNzZXMgYmFjayBkZWNsIHNldHMgYXMgVmlzaWJsZURlY2xhcmF0aW9uIG9iamVjdHMuCisgIC8vLworICAvLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgaXMgYSBuby1vcC4KKyAgdmlydHVhbCBEZWNsICpHZXRFeHRlcm5hbERlY2wodWludDMyX3QgSUQpOworCisgIC8vLyBcYnJpZWYgUmVzb2x2ZSBhIHNlbGVjdG9yIElEIGludG8gYSBzZWxlY3Rvci4KKyAgLy8vCisgIC8vLyBUaGlzIG9wZXJhdGlvbiBvbmx5IG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIGlmIHRoZSBBU1Qgc291cmNlCisgIC8vLyByZXR1cm5zIG5vbi16ZXJvIGZvciBHZXROdW1Lbm93blNlbGVjdG9ycygpLgorICAvLy8KKyAgLy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGlzIGEgbm8tb3AuCisgIHZpcnR1YWwgU2VsZWN0b3IgR2V0RXh0ZXJuYWxTZWxlY3Rvcih1aW50MzJfdCBJRCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3JzIGtub3duIHRvIHRoZSBleHRlcm5hbCBBU1QKKyAgLy8vIHNvdXJjZS4KKyAgLy8vCisgIC8vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBpcyBhIG5vLW9wLgorICB2aXJ0dWFsIHVpbnQzMl90IEdldE51bUV4dGVybmFsU2VsZWN0b3JzKCk7CisKKyAgLy8vIFxicmllZiBSZXNvbHZlIHRoZSBvZmZzZXQgb2YgYSBzdGF0ZW1lbnQgaW4gdGhlIGRlY2wgc3RyZWFtIGludG8KKyAgLy8vIGEgc3RhdGVtZW50LgorICAvLy8KKyAgLy8vIFRoaXMgb3BlcmF0aW9uIGlzIG1lYW50IHRvIGJlIHVzZWQgdmlhIGEgTGF6eU9mZnNldFB0ci4gIEl0IG9ubHkKKyAgLy8vIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIGlmIHRoZSBBU1Qgc291cmNlIHVzZXMgbWV0aG9kcyBsaWtlCisgIC8vLyBGdW5jdGlvbkRlY2w6OnNldExhenlCb2R5IHdoZW4gYnVpbGRpbmcgZGVjbHMuCisgIC8vLworICAvLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgaXMgYSBuby1vcC4KKyAgdmlydHVhbCBTdG10ICpHZXRFeHRlcm5hbERlY2xTdG10KHVpbnQ2NF90IE9mZnNldCk7CisKKyAgLy8vIFxicmllZiBSZXNvbHZlIHRoZSBvZmZzZXQgb2YgYSBzZXQgb2YgQysrIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycyBpbgorICAvLy8gdGhlIGRlY2wgc3RyZWFtIGludG8gYW4gYXJyYXkgb2YgaW5pdGlhbGl6ZXJzLgorICAvLy8KKyAgLy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGlzIGEgbm8tb3AuCisgIHZpcnR1YWwgQ1hYQ3RvckluaXRpYWxpemVyICoqR2V0RXh0ZXJuYWxDWFhDdG9ySW5pdGlhbGl6ZXJzKHVpbnQ2NF90IE9mZnNldCk7CisKKyAgLy8vIFxicmllZiBSZXNvbHZlIHRoZSBvZmZzZXQgb2YgYSBzZXQgb2YgQysrIGJhc2Ugc3BlY2lmaWVycyBpbiB0aGUgZGVjbAorICAvLy8gc3RyZWFtIGludG8gYW4gYXJyYXkgb2Ygc3BlY2lmaWVycy4KKyAgLy8vCisgIC8vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBpcyBhIG5vLW9wLgorICB2aXJ0dWFsIENYWEJhc2VTcGVjaWZpZXIgKkdldEV4dGVybmFsQ1hYQmFzZVNwZWNpZmllcnModWludDY0X3QgT2Zmc2V0KTsKKworICAvLy8gXGJyaWVmIFVwZGF0ZSBhbiBvdXQtb2YtZGF0ZSBpZGVudGlmaWVyLgorICB2aXJ0dWFsIHZvaWQgdXBkYXRlT3V0T2ZEYXRlSWRlbnRpZmllcihJZGVudGlmaWVySW5mbyAmSUkpIHt9CisKKyAgLy8vIFxicmllZiBGaW5kIGFsbCBkZWNsYXJhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgZ2l2ZW4gY29udGV4dCwKKyAgLy8vIGFuZCBhZGQgdGhlbSB0byB0aGUgY29udGV4dCBieSBjYWxsaW5nIFNldEV4dGVybmFsVmlzaWJsZURlY2xzRm9yTmFtZQorICAvLy8gb3IgU2V0Tm9FeHRlcm5hbFZpc2libGVEZWNsc0Zvck5hbWUuCisgIC8vLyBccmV0dXJuIFxjIHRydWUgaWYgYW55IGRlY2xhcmF0aW9ucyBtaWdodCBoYXZlIGJlZW4gZm91bmQsIFxjIGZhbHNlIGlmCisgIC8vLyB3ZSBkZWZpbml0ZWx5IGhhdmUgbm8gZGVjbGFyYXRpb25zIHdpdGggdGJpcyBuYW1lLgorICAvLy8KKyAgLy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGlzIGEgbm8tb3AgcmV0dXJuaW5nIFxjIGZhbHNlLgorICB2aXJ0dWFsIGJvb2wKKyAgRmluZEV4dGVybmFsVmlzaWJsZURlY2xzQnlOYW1lKGNvbnN0IERlY2xDb250ZXh0ICpEQywgRGVjbGFyYXRpb25OYW1lIE5hbWUpOworCisgIC8vLyBcYnJpZWYgRW5zdXJlcyB0aGF0IHRoZSB0YWJsZSBvZiBhbGwgdmlzaWJsZSBkZWNsYXJhdGlvbnMgaW5zaWRlIHRoaXMKKyAgLy8vIGNvbnRleHQgaXMgdXAgdG8gZGF0ZS4KKyAgLy8vCisgIC8vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGlzIGEgbm8tb3AuCisgIHZpcnR1YWwgdm9pZCBjb21wbGV0ZVZpc2libGVEZWNsc01hcChjb25zdCBEZWNsQ29udGV4dCAqREMpOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG1vZHVsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBtb2R1bGUgSUQuCisgIHZpcnR1YWwgTW9kdWxlICpnZXRNb2R1bGUodW5zaWduZWQgSUQpIHsgcmV0dXJuIG51bGxwdHI7IH0KKworICAvLy8gQWJzdHJhY3RzIGNsYW5nIG1vZHVsZXMgYW5kIHByZWNvbXBpbGVkIGhlYWRlciBmaWxlcyBhbmQgaG9sZHMKKyAgLy8vIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIGdlbmVyYXRlIGRlYnVnIGluZm8gZm9yIGFuIGltcG9ydGVkIG1vZHVsZQorICAvLy8gb3IgUENILgorICBjbGFzcyBBU1RTb3VyY2VEZXNjcmlwdG9yIHsKKyAgICBTdHJpbmdSZWYgUENITW9kdWxlTmFtZTsKKyAgICBTdHJpbmdSZWYgUGF0aDsKKyAgICBTdHJpbmdSZWYgQVNURmlsZTsKKyAgICBBU1RGaWxlU2lnbmF0dXJlIFNpZ25hdHVyZTsKKyAgICBjb25zdCBNb2R1bGUgKkNsYW5nTW9kdWxlID0gbnVsbHB0cjsKKworICBwdWJsaWM6CisgICAgQVNUU291cmNlRGVzY3JpcHRvcigpID0gZGVmYXVsdDsKKyAgICBBU1RTb3VyY2VEZXNjcmlwdG9yKFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgUGF0aCwgU3RyaW5nUmVmIEFTVEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBBU1RGaWxlU2lnbmF0dXJlIFNpZ25hdHVyZSkKKyAgICAgICAgOiBQQ0hNb2R1bGVOYW1lKHN0ZDo6bW92ZShOYW1lKSksIFBhdGgoc3RkOjptb3ZlKFBhdGgpKSwKKyAgICAgICAgICBBU1RGaWxlKHN0ZDo6bW92ZShBU1RGaWxlKSksIFNpZ25hdHVyZShTaWduYXR1cmUpIHt9CisgICAgQVNUU291cmNlRGVzY3JpcHRvcihjb25zdCBNb2R1bGUgJk0pOworCisgICAgc3RkOjpzdHJpbmcgZ2V0TW9kdWxlTmFtZSgpIGNvbnN0OworICAgIFN0cmluZ1JlZiBnZXRQYXRoKCkgY29uc3QgeyByZXR1cm4gUGF0aDsgfQorICAgIFN0cmluZ1JlZiBnZXRBU1RGaWxlKCkgY29uc3QgeyByZXR1cm4gQVNURmlsZTsgfQorICAgIEFTVEZpbGVTaWduYXR1cmUgZ2V0U2lnbmF0dXJlKCkgY29uc3QgeyByZXR1cm4gU2lnbmF0dXJlOyB9CisgICAgY29uc3QgTW9kdWxlICpnZXRNb2R1bGVPck51bGwoKSBjb25zdCB7IHJldHVybiBDbGFuZ01vZHVsZTsgfQorICB9OworCisgIC8vLyBSZXR1cm4gYSBkZXNjcmlwdG9yIGZvciB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGUsIGlmIG9uZSBleGlzdHMuCisgIHZpcnR1YWwgbGx2bTo6T3B0aW9uYWw8QVNUU291cmNlRGVzY3JpcHRvcj4gZ2V0U291cmNlRGVzY3JpcHRvcih1bnNpZ25lZCBJRCk7CisKKyAgZW51bSBFeHRLaW5kIHsgRUtfQWx3YXlzLCBFS19OZXZlciwgRUtfUmVwbHlIYXp5IH07CisKKyAgdmlydHVhbCBFeHRLaW5kIGhhc0V4dGVybmFsRGVmaW5pdGlvbnMoY29uc3QgRGVjbCAqRCk7CisKKyAgLy8vIFxicmllZiBGaW5kcyBhbGwgZGVjbGFyYXRpb25zIGxleGljYWxseSBjb250YWluZWQgd2l0aGluIHRoZSBnaXZlbgorICAvLy8gRGVjbENvbnRleHQsIGFmdGVyIGFwcGx5aW5nIGFuIG9wdGlvbmFsIGZpbHRlciBwcmVkaWNhdGUuCisgIC8vLworICAvLy8gXHBhcmFtIElzS2luZFdlV2FudCBhIHByZWRpY2F0ZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkCisgIC8vLyBkZWNsYXJhdGlvbiBraW5kIGlzIG9uZSB3ZSBhcmUgbG9va2luZyBmb3IuCisgIC8vLworICAvLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgaXMgYSBuby1vcC4KKyAgdmlydHVhbCB2b2lkCisgIEZpbmRFeHRlcm5hbExleGljYWxEZWNscyhjb25zdCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpmdW5jdGlvbl9yZWY8Ym9vbChEZWNsOjpLaW5kKT4gSXNLaW5kV2VXYW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPERlY2wgKj4gJlJlc3VsdCk7CisKKyAgLy8vIFxicmllZiBGaW5kcyBhbGwgZGVjbGFyYXRpb25zIGxleGljYWxseSBjb250YWluZWQgd2l0aGluIHRoZSBnaXZlbgorICAvLy8gRGVjbENvbnRleHQuCisgIHZvaWQgRmluZEV4dGVybmFsTGV4aWNhbERlY2xzKGNvbnN0IERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPERlY2wgKj4gJlJlc3VsdCkgeworICAgIEZpbmRFeHRlcm5hbExleGljYWxEZWNscyhEQywgW10oRGVjbDo6S2luZCkgeyByZXR1cm4gdHJ1ZTsgfSwgUmVzdWx0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBkZWNscyB0aGF0IGFyZSBjb250YWluZWQgaW4gYSBmaWxlIGluIHRoZSBPZmZzZXQvTGVuZ3RoCisgIC8vLyByYW5nZS4gXHAgTGVuZ3RoIGNhbiBiZSAwIHRvIGluZGljYXRlIGEgcG9pbnQgYXQgXHAgT2Zmc2V0IGluc3RlYWQgb2YKKyAgLy8vIGEgcmFuZ2UuCisgIHZpcnR1YWwgdm9pZCBGaW5kRmlsZVJlZ2lvbkRlY2xzKEZpbGVJRCBGaWxlLCB1bnNpZ25lZCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPERlY2wgKj4gJkRlY2xzKTsKKworICAvLy8gXGJyaWVmIEdpdmVzIHRoZSBleHRlcm5hbCBBU1Qgc291cmNlIGFuIG9wcG9ydHVuaXR5IHRvIGNvbXBsZXRlCisgIC8vLyB0aGUgcmVkZWNsYXJhdGlvbiBjaGFpbiBmb3IgYSBkZWNsYXJhdGlvbi4gQ2FsbGVkIGVhY2ggdGltZSB3ZQorICAvLy8gbmVlZCB0aGUgbW9zdCByZWNlbnQgZGVjbGFyYXRpb24gb2YgYSBkZWNsYXJhdGlvbiBhZnRlciB0aGUKKyAgLy8vIGdlbmVyYXRpb24gY291bnQgaXMgaW5jcmVtZW50ZWQuCisgIHZpcnR1YWwgdm9pZCBDb21wbGV0ZVJlZGVjbENoYWluKGNvbnN0IERlY2wgKkQpOworCisgIC8vLyBcYnJpZWYgR2l2ZXMgdGhlIGV4dGVybmFsIEFTVCBzb3VyY2UgYW4gb3Bwb3J0dW5pdHkgdG8gY29tcGxldGUKKyAgLy8vIGFuIGluY29tcGxldGUgdHlwZS4KKyAgdmlydHVhbCB2b2lkIENvbXBsZXRlVHlwZShUYWdEZWNsICpUYWcpOworCisgIC8vLyBcYnJpZWYgR2l2ZXMgdGhlIGV4dGVybmFsIEFTVCBzb3VyY2UgYW4gb3Bwb3J0dW5pdHkgdG8gY29tcGxldGUgYW4KKyAgLy8vIGluY29tcGxldGUgT2JqZWN0aXZlLUMgY2xhc3MuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIHdpbGwgb25seSBiZSBpbnZva2VkIGlmIHRoZSAiZXh0ZXJuYWxseSBjb21wbGV0ZWQiIGJpdCBpcworICAvLy8gc2V0IG9uIHRoZSBPYmpDSW50ZXJmYWNlRGVjbCB2aWEgdGhlIGZ1bmN0aW9uCisgIC8vLyBcYyBPYmpDSW50ZXJmYWNlRGVjbDo6c2V0RXh0ZXJuYWxseUNvbXBsZXRlZCgpLgorICB2aXJ0dWFsIHZvaWQgQ29tcGxldGVUeXBlKE9iakNJbnRlcmZhY2VEZWNsICpDbGFzcyk7CisKKyAgLy8vIFxicmllZiBMb2FkcyBjb21tZW50IHJhbmdlcy4KKyAgdmlydHVhbCB2b2lkIFJlYWRDb21tZW50cygpOworCisgIC8vLyBcYnJpZWYgTm90aWZ5IEV4dGVybmFsQVNUU291cmNlIHRoYXQgd2Ugc3RhcnRlZCBkZXNlcmlhbGl6YXRpb24gb2YKKyAgLy8vIGEgZGVjbCBvciB0eXBlIHNvIHVudGlsIEZpbmlzaGVkRGVzZXJpYWxpemluZyBpcyBjYWxsZWQgdGhlcmUgbWF5IGJlCisgIC8vLyBkZWNscyB0aGF0IGFyZSBpbml0aWFsaXppbmcuIE11c3QgYmUgcGFpcmVkIHdpdGggRmluaXNoZWREZXNlcmlhbGl6aW5nLgorICAvLy8KKyAgLy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGlzIGEgbm8tb3AuCisgIHZpcnR1YWwgdm9pZCBTdGFydGVkRGVzZXJpYWxpemluZygpOworCisgIC8vLyBcYnJpZWYgTm90aWZ5IEV4dGVybmFsQVNUU291cmNlIHRoYXQgd2UgZmluaXNoZWQgdGhlIGRlc2VyaWFsaXphdGlvbiBvZgorICAvLy8gYSBkZWNsIG9yIHR5cGUuIE11c3QgYmUgcGFpcmVkIHdpdGggU3RhcnRlZERlc2VyaWFsaXppbmcuCisgIC8vLworICAvLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgaXMgYSBuby1vcC4KKyAgdmlydHVhbCB2b2lkIEZpbmlzaGVkRGVzZXJpYWxpemluZygpOworCisgIC8vLyBcYnJpZWYgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbiB3ZSBiZWdpbiBwYXJzaW5nIGEgbmV3CisgIC8vLyB0cmFuc2xhdGlvbiB1bml0IGludm9sdmluZyB0aGlzIGV4dGVybmFsIEFTVCBzb3VyY2UuCisgIC8vLworICAvLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgaXMgYSBuby1vcC4KKyAgdmlydHVhbCB2b2lkIFN0YXJ0VHJhbnNsYXRpb25Vbml0KEFTVENvbnN1bWVyICpDb25zdW1lcik7CisKKyAgLy8vIFxicmllZiBQcmludCBhbnkgc3RhdGlzdGljcyB0aGF0IGhhdmUgYmVlbiBnYXRoZXJlZCByZWdhcmRpbmcKKyAgLy8vIHRoZSBleHRlcm5hbCBBU1Qgc291cmNlLgorICAvLy8KKyAgLy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGlzIGEgbm8tb3AuCisgIHZpcnR1YWwgdm9pZCBQcmludFN0YXRzKCk7CisgIAorICAvLy8gXGJyaWVmIFBlcmZvcm0gbGF5b3V0IG9uIHRoZSBnaXZlbiByZWNvcmQuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIGFsbG93cyB0aGUgZXh0ZXJuYWwgQVNUIHNvdXJjZSB0byBwcm92aWRlIGFuIHNwZWNpZmljIAorICAvLy8gbGF5b3V0IGZvciBhIHJlY29yZCwgb3ZlcnJpZGluZyB0aGUgbGF5b3V0IHRoYXQgd291bGQgbm9ybWFsbHkgYmUKKyAgLy8vIGNvbnN0cnVjdGVkLiBJdCBpcyBpbnRlbmRlZCBmb3IgY2xpZW50cyB3aG8gcmVjZWl2ZSBzcGVjaWZpYyBsYXlvdXQKKyAgLy8vIGRldGFpbHMgcmF0aGVyIHRoYW4gc291cmNlIGNvZGUgKHN1Y2ggYXMgTExEQikuIFRoZSBjbGllbnQgaXMgZXhwZWN0ZWQKKyAgLy8vIHRvIGZpbGwgaW4gdGhlIGZpZWxkIG9mZnNldHMsIGJhc2Ugb2Zmc2V0cywgdmlydHVhbCBiYXNlIG9mZnNldHMsIGFuZAorICAvLy8gY29tcGxldGUgb2JqZWN0IHNpemUuCisgIC8vLworICAvLy8gXHBhcmFtIFJlY29yZCBUaGUgcmVjb3JkIHdob3NlIGxheW91dCBpcyBiZWluZyByZXF1ZXN0ZWQuCisgIC8vLworICAvLy8gXHBhcmFtIFNpemUgVGhlIGZpbmFsIHNpemUgb2YgdGhlIHJlY29yZCwgaW4gYml0cy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQWxpZ25tZW50IFRoZSBmaW5hbCBhbGlnbm1lbnQgb2YgdGhlIHJlY29yZCwgaW4gYml0cy4KKyAgLy8vCisgIC8vLyBccGFyYW0gRmllbGRPZmZzZXRzIFRoZSBvZmZzZXQgb2YgZWFjaCBvZiB0aGUgZmllbGRzIHdpdGhpbiB0aGUgcmVjb3JkLAorICAvLy8gZXhwcmVzc2VkIGluIGJpdHMuIEFsbCBvZiB0aGUgZmllbGRzIG11c3QgYmUgcHJvdmlkZWQgd2l0aCBvZmZzZXRzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBCYXNlT2Zmc2V0cyBUaGUgb2Zmc2V0IG9mIGVhY2ggb2YgdGhlIGRpcmVjdCwgbm9uLXZpcnR1YWwgYmFzZQorICAvLy8gY2xhc3Nlcy4gSWYgYW55IGJhc2VzIGFyZSBub3QgZ2l2ZW4gb2Zmc2V0cywgdGhlIGJhc2VzIHdpbGwgYmUgbGFpZCAKKyAgLy8vIG91dCBhY2NvcmRpbmcgdG8gdGhlIEFCSS4KKyAgLy8vCisgIC8vLyBccGFyYW0gVmlydHVhbEJhc2VPZmZzZXRzIFRoZSBvZmZzZXQgb2YgZWFjaCBvZiB0aGUgdmlydHVhbCBiYXNlIGNsYXNzZXMKKyAgLy8vIChlaXRoZXIgZGlyZWN0IG9yIG5vdCkuIElmIGFueSBiYXNlcyBhcmUgbm90IGdpdmVuIG9mZnNldHMsIHRoZSBiYXNlcyB3aWxsIGJlIGxhaWQgCisgIC8vLyBvdXQgYWNjb3JkaW5nIHRvIHRoZSBBQkkuCisgIC8vLyAKKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlIHJlY29yZCBsYXlvdXQgd2FzIHByb3ZpZGVkLCBmYWxzZSBvdGhlcndpc2UuCisgIHZpcnR1YWwgYm9vbCBsYXlvdXRSZWNvcmRUeXBlKAorICAgICAgY29uc3QgUmVjb3JkRGVjbCAqUmVjb3JkLCB1aW50NjRfdCAmU2l6ZSwgdWludDY0X3QgJkFsaWdubWVudCwKKyAgICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IEZpZWxkRGVjbCAqLCB1aW50NjRfdD4gJkZpZWxkT2Zmc2V0cywKKyAgICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IENYWFJlY29yZERlY2wgKiwgQ2hhclVuaXRzPiAmQmFzZU9mZnNldHMsCisgICAgICBsbHZtOjpEZW5zZU1hcDxjb25zdCBDWFhSZWNvcmREZWNsICosIENoYXJVbml0cz4gJlZpcnR1YWxCYXNlT2Zmc2V0cyk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFF1ZXJpZXMgZm9yIHBlcmZvcm1hbmNlIGFuYWx5c2lzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgCisgIHN0cnVjdCBNZW1vcnlCdWZmZXJTaXplcyB7CisgICAgc2l6ZV90IG1hbGxvY19ieXRlczsKKyAgICBzaXplX3QgbW1hcF9ieXRlczsKKyAgICAKKyAgICBNZW1vcnlCdWZmZXJTaXplcyhzaXplX3QgbWFsbG9jX2J5dGVzLCBzaXplX3QgbW1hcF9ieXRlcykKKyAgICAgICAgOiBtYWxsb2NfYnl0ZXMobWFsbG9jX2J5dGVzKSwgbW1hcF9ieXRlcyhtbWFwX2J5dGVzKSB7fQorICB9OworICAKKyAgLy8vIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkIGJ5IG1lbW9yeSBidWZmZXJzLCBicmVha2luZyBkb3duCisgIC8vLyBieSBoZWFwLWJhY2tlZCB2ZXJzdXMgbW1hcCdlZCBtZW1vcnkuCisgIE1lbW9yeUJ1ZmZlclNpemVzIGdldE1lbW9yeUJ1ZmZlclNpemVzKCkgY29uc3QgeworICAgIE1lbW9yeUJ1ZmZlclNpemVzIHNpemVzKDAsIDApOworICAgIGdldE1lbW9yeUJ1ZmZlclNpemVzKHNpemVzKTsKKyAgICByZXR1cm4gc2l6ZXM7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2V0TWVtb3J5QnVmZmVyU2l6ZXMoTWVtb3J5QnVmZmVyU2l6ZXMgJnNpemVzKSBjb25zdDsKKworcHJvdGVjdGVkOgorICBzdGF0aWMgRGVjbENvbnRleHRMb29rdXBSZXN1bHQKKyAgU2V0RXh0ZXJuYWxWaXNpYmxlRGVjbHNGb3JOYW1lKGNvbnN0IERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8TmFtZWREZWNsKj4gRGVjbHMpOworCisgIHN0YXRpYyBEZWNsQ29udGV4dExvb2t1cFJlc3VsdAorICBTZXROb0V4dGVybmFsVmlzaWJsZURlY2xzRm9yTmFtZShjb25zdCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBOYW1lKTsKKworICAvLy8gXGJyaWVmIEluY3JlbWVudCB0aGUgY3VycmVudCBnZW5lcmF0aW9uLgorICB1aW50MzJfdCBpbmNyZW1lbnRHZW5lcmF0aW9uKEFTVENvbnRleHQgJkMpOworfTsKKworLy8vIFxicmllZiBBIGxhenkgcG9pbnRlciB0byBhbiBBU1Qgbm9kZSAob2YgYmFzZSB0eXBlIFQpIHRoYXQgcmVzaWRlcworLy8vIHdpdGhpbiBhbiBleHRlcm5hbCBBU1Qgc291cmNlLgorLy8vCisvLy8gVGhlIEFTVCBub2RlIGlzIGlkZW50aWZpZWQgd2l0aGluIHRoZSBleHRlcm5hbCBBU1Qgc291cmNlIGJ5IGEKKy8vLyA2My1iaXQgb2Zmc2V0LCBhbmQgY2FuIGJlIHJldHJpZXZlZCB2aWEgYW4gb3BlcmF0aW9uIG9uIHRoZQorLy8vIGV4dGVybmFsIEFTVCBzb3VyY2UgaXRzZWxmLgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgT2Zmc1QsIFQqIChFeHRlcm5hbEFTVFNvdXJjZTo6KkdldCkoT2Zmc1QgT2Zmc2V0KT4KK3N0cnVjdCBMYXp5T2Zmc2V0UHRyIHsKKyAgLy8vIFxicmllZiBFaXRoZXIgYSBwb2ludGVyIHRvIGFuIEFTVCBub2RlIG9yIHRoZSBvZmZzZXQgd2l0aGluIHRoZQorICAvLy8gZXh0ZXJuYWwgQVNUIHNvdXJjZSB3aGVyZSB0aGUgQVNUIG5vZGUgY2FuIGJlIGZvdW5kLgorICAvLy8KKyAgLy8vIElmIHRoZSBsb3cgYml0IGlzIGNsZWFyLCBhIHBvaW50ZXIgdG8gdGhlIEFTVCBub2RlLiBJZiB0aGUgbG93CisgIC8vLyBiaXQgaXMgc2V0LCB0aGUgdXBwZXIgNjMgYml0cyBhcmUgdGhlIG9mZnNldC4KKyAgbXV0YWJsZSB1aW50NjRfdCBQdHIgPSAwOworCitwdWJsaWM6CisgIExhenlPZmZzZXRQdHIoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IExhenlPZmZzZXRQdHIoVCAqUHRyKSA6IFB0cihyZWludGVycHJldF9jYXN0PHVpbnQ2NF90PihQdHIpKSB7fQorCisgIGV4cGxpY2l0IExhenlPZmZzZXRQdHIodWludDY0X3QgT2Zmc2V0KSA6IFB0cigoT2Zmc2V0IDw8IDEpIHwgMHgwMSkgeworICAgIGFzc2VydCgoT2Zmc2V0IDw8IDEgPj4gMSkgPT0gT2Zmc2V0ICYmICJPZmZzZXRzIG11c3QgcmVxdWlyZSA8IDYzIGJpdHMiKTsKKyAgICBpZiAoT2Zmc2V0ID09IDApCisgICAgICBQdHIgPSAwOworICB9CisKKyAgTGF6eU9mZnNldFB0ciAmb3BlcmF0b3I9KFQgKlB0cikgeworICAgIHRoaXMtPlB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3Q+KFB0cik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTGF6eU9mZnNldFB0ciAmb3BlcmF0b3I9KHVpbnQ2NF90IE9mZnNldCkgeworICAgIGFzc2VydCgoT2Zmc2V0IDw8IDEgPj4gMSkgPT0gT2Zmc2V0ICYmICJPZmZzZXRzIG11c3QgcmVxdWlyZSA8IDYzIGJpdHMiKTsKKyAgICBpZiAoT2Zmc2V0ID09IDApCisgICAgICBQdHIgPSAwOworICAgIGVsc2UKKyAgICAgIFB0ciA9IChPZmZzZXQgPDwgMSkgfCAweDAxOworCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgcG9pbnRlciBpcyBub24tTlVMTC4KKyAgLy8vCisgIC8vLyBUaGlzIG9wZXJhdGlvbiBkb2VzIG5vdCByZXF1aXJlIHRoZSBBU1Qgbm9kZSB0byBiZSBkZXNlcmlhbGl6ZWQuCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBQdHIgIT0gMDsgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIHBvaW50ZXIgaXMgbm9uLU5VTEwuCisgIC8vLworICAvLy8gVGhpcyBvcGVyYXRpb24gZG9lcyBub3QgcmVxdWlyZSB0aGUgQVNUIG5vZGUgdG8gYmUgZGVzZXJpYWxpemVkLgorICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBQdHIgIT0gMDsgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIHBvaW50ZXIgaXMgY3VycmVudGx5IHN0b3JlZCBhcyBhbiBvZmZzZXQuCisgIGJvb2wgaXNPZmZzZXQoKSBjb25zdCB7IHJldHVybiBQdHIgJiAweDAxOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgcG9pbnRlciB0byB0aGUgQVNUIG5vZGUgdGhhdCB0aGlzIGxhenkgcG9pbnRlcgorICAvLy8KKyAgLy8vIFxwYXJhbSBTb3VyY2UgdGhlIGV4dGVybmFsIEFTVCBzb3VyY2UuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBBU1Qgbm9kZS4KKyAgVCogZ2V0KEV4dGVybmFsQVNUU291cmNlICpTb3VyY2UpIGNvbnN0IHsKKyAgICBpZiAoaXNPZmZzZXQoKSkgeworICAgICAgYXNzZXJ0KFNvdXJjZSAmJgorICAgICAgICAgICAgICJDYW5ub3QgZGVzZXJpYWxpemUgYSBsYXp5IHBvaW50ZXIgd2l0aG91dCBhbiBBU1Qgc291cmNlIik7CisgICAgICBQdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ2NF90PigoU291cmNlLT4qR2V0KShQdHIgPj4gMSkpOworICAgIH0KKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oUHRyKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBBIGxhenkgdmFsdWUgKG9mIHR5cGUgVCkgdGhhdCBpcyB3aXRoaW4gYW4gQVNUIG5vZGUgb2YgdHlwZSBPd25lciwKKy8vLyB3aGVyZSB0aGUgdmFsdWUgbWlnaHQgY2hhbmdlIGluIGxhdGVyIGdlbmVyYXRpb25zIG9mIHRoZSBleHRlcm5hbCBBU1QKKy8vLyBzb3VyY2UuCit0ZW1wbGF0ZTx0eXBlbmFtZSBPd25lciwgdHlwZW5hbWUgVCwgdm9pZCAoRXh0ZXJuYWxBU1RTb3VyY2U6OipVcGRhdGUpKE93bmVyKT4KK3N0cnVjdCBMYXp5R2VuZXJhdGlvbmFsVXBkYXRlUHRyIHsKKyAgLy8vIEEgY2FjaGUgb2YgdGhlIHZhbHVlIG9mIHRoaXMgcG9pbnRlciwgaW4gdGhlIG1vc3QgcmVjZW50IGdlbmVyYXRpb24gaW4KKyAgLy8vIHdoaWNoIHdlIHF1ZXJpZWQgaXQuCisgIHN0cnVjdCBMYXp5RGF0YSB7CisgICAgRXh0ZXJuYWxBU1RTb3VyY2UgKkV4dGVybmFsU291cmNlOworICAgIHVpbnQzMl90IExhc3RHZW5lcmF0aW9uID0gMDsKKyAgICBUIExhc3RWYWx1ZTsKKworICAgIExhenlEYXRhKEV4dGVybmFsQVNUU291cmNlICpTb3VyY2UsIFQgVmFsdWUpCisgICAgICAgIDogRXh0ZXJuYWxTb3VyY2UoU291cmNlKSwgTGFzdFZhbHVlKFZhbHVlKSB7fQorICB9OworCisgIC8vIE91ciB2YWx1ZSBpcyByZXByZXNlbnRlZCBhcyBzaW1wbHkgVCBpZiB0aGVyZSBpcyBubyBleHRlcm5hbCBBU1Qgc291cmNlLgorICB1c2luZyBWYWx1ZVR5cGUgPSBsbHZtOjpQb2ludGVyVW5pb248VCwgTGF6eURhdGEqPjsKKyAgVmFsdWVUeXBlIFZhbHVlOworCisgIExhenlHZW5lcmF0aW9uYWxVcGRhdGVQdHIoVmFsdWVUeXBlIFYpIDogVmFsdWUoVikge30KKworICAvLyBEZWZpbmVkIGluIEFTVENvbnRleHQuaAorICBzdGF0aWMgVmFsdWVUeXBlIG1ha2VWYWx1ZShjb25zdCBBU1RDb250ZXh0ICZDdHgsIFQgVmFsdWUpOworCitwdWJsaWM6CisgIGV4cGxpY2l0IExhenlHZW5lcmF0aW9uYWxVcGRhdGVQdHIoY29uc3QgQVNUQ29udGV4dCAmQ3R4LCBUIFZhbHVlID0gVCgpKQorICAgICAgOiBWYWx1ZShtYWtlVmFsdWUoQ3R4LCBWYWx1ZSkpIHt9CisKKyAgLy8vIENyZWF0ZSBhIHBvaW50ZXIgdGhhdCBpcyBub3QgcG90ZW50aWFsbHkgdXBkYXRlZCBieSBsYXRlciBnZW5lcmF0aW9ucyBvZgorICAvLy8gdGhlIGV4dGVybmFsIEFTVCBzb3VyY2UuCisgIGVudW0gTm90VXBkYXRlZFRhZyB7IE5vdFVwZGF0ZWQgfTsKKyAgTGF6eUdlbmVyYXRpb25hbFVwZGF0ZVB0cihOb3RVcGRhdGVkVGFnLCBUIFZhbHVlID0gVCgpKQorICAgICAgOiBWYWx1ZShWYWx1ZSkge30KKworICAvLy8gRm9yY2libHkgc2V0IHRoaXMgcG9pbnRlciAod2hpY2ggbXVzdCBiZSBsYXp5KSBhcyBuZWVkaW5nIHVwZGF0ZXMuCisgIHZvaWQgbWFya0luY29tcGxldGUoKSB7CisgICAgVmFsdWUudGVtcGxhdGUgZ2V0PExhenlEYXRhICo+KCktPkxhc3RHZW5lcmF0aW9uID0gMDsKKyAgfQorCisgIC8vLyBTZXQgdGhlIHZhbHVlIG9mIHRoaXMgcG9pbnRlciwgaW4gdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbi4KKyAgdm9pZCBzZXQoVCBOZXdWYWx1ZSkgeworICAgIGlmIChMYXp5RGF0YSAqTGF6eVZhbCA9IFZhbHVlLnRlbXBsYXRlIGR5bl9jYXN0PExhenlEYXRhKj4oKSkgeworICAgICAgTGF6eVZhbC0+TGFzdFZhbHVlID0gTmV3VmFsdWU7CisgICAgICByZXR1cm47CisgICAgfQorICAgIFZhbHVlID0gTmV3VmFsdWU7CisgIH0KKworICAvLy8gU2V0IHRoZSB2YWx1ZSBvZiB0aGlzIHBvaW50ZXIsIGZvciB0aGlzIGFuZCBhbGwgZnV0dXJlIGdlbmVyYXRpb25zLgorICB2b2lkIHNldE5vdFVwZGF0ZWQoVCBOZXdWYWx1ZSkgeyBWYWx1ZSA9IE5ld1ZhbHVlOyB9CisKKyAgLy8vIEdldCB0aGUgdmFsdWUgb2YgdGhpcyBwb2ludGVyLCB1cGRhdGluZyBpdHMgb3duZXIgaWYgbmVjZXNzYXJ5LgorICBUIGdldChPd25lciBPKSB7CisgICAgaWYgKExhenlEYXRhICpMYXp5VmFsID0gVmFsdWUudGVtcGxhdGUgZHluX2Nhc3Q8TGF6eURhdGEqPigpKSB7CisgICAgICBpZiAoTGF6eVZhbC0+TGFzdEdlbmVyYXRpb24gIT0gTGF6eVZhbC0+RXh0ZXJuYWxTb3VyY2UtPmdldEdlbmVyYXRpb24oKSkgeworICAgICAgICBMYXp5VmFsLT5MYXN0R2VuZXJhdGlvbiA9IExhenlWYWwtPkV4dGVybmFsU291cmNlLT5nZXRHZW5lcmF0aW9uKCk7CisgICAgICAgIChMYXp5VmFsLT5FeHRlcm5hbFNvdXJjZS0+KlVwZGF0ZSkoTyk7CisgICAgICB9CisgICAgICByZXR1cm4gTGF6eVZhbC0+TGFzdFZhbHVlOworICAgIH0KKyAgICByZXR1cm4gVmFsdWUudGVtcGxhdGUgZ2V0PFQ+KCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBtb3N0IHJlY2VudGx5IGNvbXB1dGVkIHZhbHVlIG9mIHRoaXMgcG9pbnRlciB3aXRob3V0IHVwZGF0aW5nIGl0LgorICBUIGdldE5vdFVwZGF0ZWQoKSBjb25zdCB7CisgICAgaWYgKExhenlEYXRhICpMYXp5VmFsID0gVmFsdWUudGVtcGxhdGUgZHluX2Nhc3Q8TGF6eURhdGEqPigpKQorICAgICAgcmV0dXJuIExhenlWYWwtPkxhc3RWYWx1ZTsKKyAgICByZXR1cm4gVmFsdWUudGVtcGxhdGUgZ2V0PFQ+KCk7CisgIH0KKworICB2b2lkICpnZXRPcGFxdWVWYWx1ZSgpIHsgcmV0dXJuIFZhbHVlLmdldE9wYXF1ZVZhbHVlKCk7IH0KKyAgc3RhdGljIExhenlHZW5lcmF0aW9uYWxVcGRhdGVQdHIgZ2V0RnJvbU9wYXF1ZVZhbHVlKHZvaWQgKlB0cikgeworICAgIHJldHVybiBMYXp5R2VuZXJhdGlvbmFsVXBkYXRlUHRyKFZhbHVlVHlwZTo6Z2V0RnJvbU9wYXF1ZVZhbHVlKFB0cikpOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisvLy8gU3BlY2lhbGl6ZSBQb2ludGVyTGlrZVR5cGVUcmFpdHMgdG8gYWxsb3cgTGF6eUdlbmVyYXRpb25hbFVwZGF0ZVB0ciB0byBiZQorLy8vIHBsYWNlZCBpbnRvIGEgUG9pbnRlclVuaW9uLgorbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZTx0eXBlbmFtZSBPd25lciwgdHlwZW5hbWUgVCwKKyAgICAgICAgIHZvaWQgKGNsYW5nOjpFeHRlcm5hbEFTVFNvdXJjZTo6KlVwZGF0ZSkoT3duZXIpPgorc3RydWN0IFBvaW50ZXJMaWtlVHlwZVRyYWl0czwKKyAgICBjbGFuZzo6TGF6eUdlbmVyYXRpb25hbFVwZGF0ZVB0cjxPd25lciwgVCwgVXBkYXRlPj4geworICB1c2luZyBQdHIgPSBjbGFuZzo6TGF6eUdlbmVyYXRpb25hbFVwZGF0ZVB0cjxPd25lciwgVCwgVXBkYXRlPjsKKworICBzdGF0aWMgdm9pZCAqZ2V0QXNWb2lkUG9pbnRlcihQdHIgUCkgeyByZXR1cm4gUC5nZXRPcGFxdWVWYWx1ZSgpOyB9CisgIHN0YXRpYyBQdHIgZ2V0RnJvbVZvaWRQb2ludGVyKHZvaWQgKlApIHsgcmV0dXJuIFB0cjo6Z2V0RnJvbU9wYXF1ZVZhbHVlKFApOyB9CisKKyAgZW51bSB7CisgICAgTnVtTG93Qml0c0F2YWlsYWJsZSA9IFBvaW50ZXJMaWtlVHlwZVRyYWl0czxUPjo6TnVtTG93Qml0c0F2YWlsYWJsZSAtIDEKKyAgfTsKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgbGF6aWx5LWxvYWRlZCB2ZWN0b3Igb2YgZGF0YS4KKy8vLworLy8vIFRoZSBsYXppbHktbG9hZGVkIHZlY3RvciBvZiBkYXRhIGNvbnRhaW5zIGRhdGEgdGhhdCBpcyBwYXJ0aWFsbHkgbG9hZGVkCisvLy8gZnJvbSBhbiBleHRlcm5hbCBzb3VyY2UgYW5kIHBhcnRpYWxseSBhZGRlZCBieSBsb2NhbCB0cmFuc2xhdGlvbi4gVGhlIAorLy8vIGl0ZW1zIGxvYWRlZCBmcm9tIHRoZSBleHRlcm5hbCBzb3VyY2UgYXJlIGxvYWRlZCBsYXppbHksIHdoZW4gbmVlZGVkIGZvcgorLy8vIGl0ZXJhdGlvbiBvdmVyIHRoZSBjb21wbGV0ZSB2ZWN0b3IuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTb3VyY2UsIAorICAgICAgICAgdm9pZCAoU291cmNlOjoqTG9hZGVyKShTbWFsbFZlY3RvckltcGw8VD4mKSwKKyAgICAgICAgIHVuc2lnbmVkIExvYWRlZFN0b3JhZ2UgPSAyLCB1bnNpZ25lZCBMb2NhbFN0b3JhZ2UgPSA0PgorY2xhc3MgTGF6eVZlY3RvciB7CisgIFNtYWxsVmVjdG9yPFQsIExvYWRlZFN0b3JhZ2U+IExvYWRlZDsKKyAgU21hbGxWZWN0b3I8VCwgTG9jYWxTdG9yYWdlPiBMb2NhbDsKKworcHVibGljOgorICAvLy8gSXRlcmF0aW9uIG92ZXIgdGhlIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuCisgIC8vLworICAvLy8gSW4gYSBjb21wbGV0ZSBpdGVyYXRpb24sIHRoZSBpdGVyYXRvciB3YWxrcyB0aGUgcmFuZ2UgWy1NLCBOKSwKKyAgLy8vIHdoZXJlIG5lZ2F0aXZlIHZhbHVlcyBhcmUgdXNlZCB0byBpbmRpY2F0ZSBlbGVtZW50cworICAvLy8gbG9hZGVkIGZyb20gdGhlIGV4dGVybmFsIHNvdXJjZSB3aGlsZSBub24tbmVnYXRpdmUgdmFsdWVzIGFyZSB1c2VkIHRvCisgIC8vLyBpbmRpY2F0ZSBlbGVtZW50cyBhZGRlZCB2aWEgXGMgcHVzaF9iYWNrKCkuCisgIC8vLyBIb3dldmVyLCB0byBwcm92aWRlIGl0ZXJhdGlvbiBpbiBzb3VyY2Ugb3JkZXIgKGZvciwgZS5nLiwgY2hhaW5lZAorICAvLy8gcHJlY29tcGlsZWQgaGVhZGVycyksIGRlcmVmZXJlbmNpbmcgdGhlIGl0ZXJhdG9yIGZsaXBzIHRoZSBuZWdhdGl2ZQorICAvLy8gdmFsdWVzIChjb3JyZXNwb25kaW5nIHRvIGxvYWRlZCBlbnRpdGllcyksIHNvIHRoYXQgcG9zaXRpb24gLU0KKyAgLy8vIGNvcnJlc3BvbmRzIHRvIGVsZW1lbnQgMCBpbiB0aGUgbG9hZGVkIGVudGl0aWVzIHZlY3RvciwgcG9zaXRpb24gLU0rMQorICAvLy8gY29ycmVzcG9uZHMgdG8gZWxlbWVudCAxIGluIHRoZSBsb2FkZWQgZW50aXRpZXMgdmVjdG9yLCBldGMuIFRoaXMKKyAgLy8vIGdpdmVzIHVzIGEgcmVhc29uYWJseSBlZmZpY2llbnQsIHNvdXJjZS1vcmRlciB3YWxrLgorICAvLy8KKyAgLy8vIFdlIGRlZmluZSB0aGlzIGFzIGEgd3JhcHBpbmcgaXRlcmF0b3IgYXJvdW5kIGFuIGludC4gVGhlCisgIC8vLyBpdGVyYXRvcl9hZGFwdG9yX2Jhc2UgY2xhc3MgZm9yd2FyZHMgdGhlIGl0ZXJhdG9yIG1ldGhvZHMgdG8gYmFzaWMgaW50ZWdlcgorICAvLy8gYXJpdGhtZXRpYy4KKyAgY2xhc3MgaXRlcmF0b3IKKyAgICAgIDogcHVibGljIGxsdm06Oml0ZXJhdG9yX2FkYXB0b3JfYmFzZTwKKyAgICAgICAgICAgIGl0ZXJhdG9yLCBpbnQsIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIFQsIGludCwgVCAqLCBUICY+IHsKKyAgICBmcmllbmQgY2xhc3MgTGF6eVZlY3RvcjsKKworICAgIExhenlWZWN0b3IgKlNlbGY7CisKKyAgICBpdGVyYXRvcihMYXp5VmVjdG9yICpTZWxmLCBpbnQgUG9zaXRpb24pCisgICAgICAgIDogaXRlcmF0b3I6Oml0ZXJhdG9yX2FkYXB0b3JfYmFzZShQb3NpdGlvbiksIFNlbGYoU2VsZikge30KKworICAgIGJvb2wgaXNMb2FkZWQoKSBjb25zdCB7IHJldHVybiB0aGlzLT5JIDwgMDsgfQorCisgIHB1YmxpYzoKKyAgICBpdGVyYXRvcigpIDogaXRlcmF0b3IobnVsbHB0ciwgMCkge30KKworICAgIHR5cGVuYW1lIGl0ZXJhdG9yOjpyZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgaWYgKGlzTG9hZGVkKCkpCisgICAgICAgIHJldHVybiBTZWxmLT5Mb2FkZWQuZW5kKClbdGhpcy0+SV07CisgICAgICByZXR1cm4gU2VsZi0+TG9jYWwuYmVnaW4oKVt0aGlzLT5JXTsKKyAgICB9CisgIH07CisKKyAgaXRlcmF0b3IgYmVnaW4oU291cmNlICpzb3VyY2UsIGJvb2wgTG9jYWxPbmx5ID0gZmFsc2UpIHsKKyAgICBpZiAoTG9jYWxPbmx5KQorICAgICAgcmV0dXJuIGl0ZXJhdG9yKHRoaXMsIDApOworICAgIAorICAgIGlmIChzb3VyY2UpCisgICAgICAoc291cmNlLT4qTG9hZGVyKShMb2FkZWQpOworICAgIHJldHVybiBpdGVyYXRvcih0aGlzLCAtKGludClMb2FkZWQuc2l6ZSgpKTsKKyAgfQorICAKKyAgaXRlcmF0b3IgZW5kKCkgeworICAgIHJldHVybiBpdGVyYXRvcih0aGlzLCBMb2NhbC5zaXplKCkpOworICB9CisgIAorICB2b2lkIHB1c2hfYmFjayhjb25zdCBUJiBMb2NhbFZhbHVlKSB7CisgICAgTG9jYWwucHVzaF9iYWNrKExvY2FsVmFsdWUpOworICB9CisgIAorICB2b2lkIGVyYXNlKGl0ZXJhdG9yIEZyb20sIGl0ZXJhdG9yIFRvKSB7CisgICAgaWYgKEZyb20uaXNMb2FkZWQoKSAmJiBUby5pc0xvYWRlZCgpKSB7CisgICAgICBMb2FkZWQuZXJhc2UoJipGcm9tLCAmKlRvKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoRnJvbS5pc0xvYWRlZCgpKSB7CisgICAgICBMb2FkZWQuZXJhc2UoJipGcm9tLCBMb2FkZWQuZW5kKCkpOworICAgICAgRnJvbSA9IGJlZ2luKG51bGxwdHIsIHRydWUpOworICAgIH0KKworICAgIExvY2FsLmVyYXNlKCYqRnJvbSwgJipUbyk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQSBsYXp5IHBvaW50ZXIgdG8gYSBzdGF0ZW1lbnQuCit1c2luZyBMYXp5RGVjbFN0bXRQdHIgPQorICAgIExhenlPZmZzZXRQdHI8U3RtdCwgdWludDY0X3QsICZFeHRlcm5hbEFTVFNvdXJjZTo6R2V0RXh0ZXJuYWxEZWNsU3RtdD47CisKKy8vLyBcYnJpZWYgQSBsYXp5IHBvaW50ZXIgdG8gYSBkZWNsYXJhdGlvbi4KK3VzaW5nIExhenlEZWNsUHRyID0KKyAgICBMYXp5T2Zmc2V0UHRyPERlY2wsIHVpbnQzMl90LCAmRXh0ZXJuYWxBU1RTb3VyY2U6OkdldEV4dGVybmFsRGVjbD47CisKKy8vLyBcYnJpZWYgQSBsYXp5IHBvaW50ZXIgdG8gYSBzZXQgb2YgQ1hYQ3RvckluaXRpYWxpemVycy4KK3VzaW5nIExhenlDWFhDdG9ySW5pdGlhbGl6ZXJzUHRyID0KKyAgICBMYXp5T2Zmc2V0UHRyPENYWEN0b3JJbml0aWFsaXplciAqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICZFeHRlcm5hbEFTVFNvdXJjZTo6R2V0RXh0ZXJuYWxDWFhDdG9ySW5pdGlhbGl6ZXJzPjsKKworLy8vIFxicmllZiBBIGxhenkgcG9pbnRlciB0byBhIHNldCBvZiBDWFhCYXNlU3BlY2lmaWVycy4KK3VzaW5nIExhenlDWFhCYXNlU3BlY2lmaWVyc1B0ciA9CisgICAgTGF6eU9mZnNldFB0cjxDWFhCYXNlU3BlY2lmaWVyLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICZFeHRlcm5hbEFTVFNvdXJjZTo6R2V0RXh0ZXJuYWxDWFhCYXNlU3BlY2lmaWVycz47CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9FWFRFUk5BTEFTVFNPVVJDRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvR2xvYmFsRGVjbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0dsb2JhbERlY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjNlNDM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0dsb2JhbERlY2wuaApAQCAtMCwwICsxLDEyOCBAQAorLy89PT0tIEdsb2JhbERlY2wuaCAtIEdsb2JhbCBkZWNsYXJhdGlvbiBob2xkZXIgLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBBIEdsb2JhbERlY2wgY2FuIGhvbGQgZWl0aGVyIGEgcmVndWxhciB2YXJpYWJsZS9mdW5jdGlvbiBvciBhIEMrKyBjdG9yL2R0b3IKKy8vIHRvZ2V0aGVyIHdpdGggaXRzIHR5cGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9HTE9CQUxERUNMX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfR0xPQkFMREVDTF9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbENYWC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsT2JqQy5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsT3Blbk1QLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQUJJLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgY2xhbmcgeworCisvLy8gR2xvYmFsRGVjbCAtIHJlcHJlc2VudHMgYSBnbG9iYWwgZGVjbGFyYXRpb24uIFRoaXMgY2FuIGVpdGhlciBiZSBhCisvLy8gQ1hYQ29uc3RydWN0b3JEZWNsIGFuZCB0aGUgY29uc3RydWN0b3IgdHlwZSAoQmFzZSwgQ29tcGxldGUpLgorLy8vIGEgQ1hYRGVzdHJ1Y3RvckRlY2wgYW5kIHRoZSBkZXN0cnVjdG9yIHR5cGUgKEJhc2UsIENvbXBsZXRlKSBvcgorLy8vIGEgVmFyRGVjbCwgYSBGdW5jdGlvbkRlY2wgb3IgYSBCbG9ja0RlY2wuCitjbGFzcyBHbG9iYWxEZWNsIHsKKyAgbGx2bTo6UG9pbnRlckludFBhaXI8Y29uc3QgRGVjbCAqLCAyPiBWYWx1ZTsKKworICB2b2lkIEluaXQoY29uc3QgRGVjbCAqRCkgeworICAgIGFzc2VydCghaXNhPENYWENvbnN0cnVjdG9yRGVjbD4oRCkgJiYgIlVzZSBvdGhlciBjdG9yIHdpdGggY3RvciBkZWNscyEiKTsKKyAgICBhc3NlcnQoIWlzYTxDWFhEZXN0cnVjdG9yRGVjbD4oRCkgJiYgIlVzZSBvdGhlciBjdG9yIHdpdGggZHRvciBkZWNscyEiKTsKKworICAgIFZhbHVlLnNldFBvaW50ZXIoRCk7CisgIH0KKworcHVibGljOgorICBHbG9iYWxEZWNsKCkgPSBkZWZhdWx0OworICBHbG9iYWxEZWNsKGNvbnN0IFZhckRlY2wgKkQpIHsgSW5pdChEKTt9CisgIEdsb2JhbERlY2woY29uc3QgRnVuY3Rpb25EZWNsICpEKSB7IEluaXQoRCk7IH0KKyAgR2xvYmFsRGVjbChjb25zdCBCbG9ja0RlY2wgKkQpIHsgSW5pdChEKTsgfQorICBHbG9iYWxEZWNsKGNvbnN0IENhcHR1cmVkRGVjbCAqRCkgeyBJbml0KEQpOyB9CisgIEdsb2JhbERlY2woY29uc3QgT2JqQ01ldGhvZERlY2wgKkQpIHsgSW5pdChEKTsgfQorICBHbG9iYWxEZWNsKGNvbnN0IE9NUERlY2xhcmVSZWR1Y3Rpb25EZWNsICpEKSB7IEluaXQoRCk7IH0KKyAgR2xvYmFsRGVjbChjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkQsIENYWEN0b3JUeXBlIFR5cGUpIDogVmFsdWUoRCwgVHlwZSkge30KKyAgR2xvYmFsRGVjbChjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqRCwgQ1hYRHRvclR5cGUgVHlwZSkgOiBWYWx1ZShELCBUeXBlKSB7fQorCisgIEdsb2JhbERlY2wgZ2V0Q2Fub25pY2FsRGVjbCgpIGNvbnN0IHsKKyAgICBHbG9iYWxEZWNsIENhbm9uR0Q7CisgICAgQ2Fub25HRC5WYWx1ZS5zZXRQb2ludGVyKFZhbHVlLmdldFBvaW50ZXIoKS0+Z2V0Q2Fub25pY2FsRGVjbCgpKTsKKyAgICBDYW5vbkdELlZhbHVlLnNldEludChWYWx1ZS5nZXRJbnQoKSk7CisgICAgCisgICAgcmV0dXJuIENhbm9uR0Q7CisgIH0KKworICBjb25zdCBEZWNsICpnZXREZWNsKCkgY29uc3QgeyByZXR1cm4gVmFsdWUuZ2V0UG9pbnRlcigpOyB9CisKKyAgQ1hYQ3RvclR5cGUgZ2V0Q3RvclR5cGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzYTxDWFhDb25zdHJ1Y3RvckRlY2w+KGdldERlY2woKSkgJiYgIkRlY2wgaXMgbm90IGEgY3RvciEiKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hYQ3RvclR5cGU+KFZhbHVlLmdldEludCgpKTsKKyAgfQorCisgIENYWER0b3JUeXBlIGdldER0b3JUeXBlKCkgY29uc3QgeworICAgIGFzc2VydChpc2E8Q1hYRGVzdHJ1Y3RvckRlY2w+KGdldERlY2woKSkgJiYgIkRlY2wgaXMgbm90IGEgZHRvciEiKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hYRHRvclR5cGU+KFZhbHVlLmdldEludCgpKTsKKyAgfQorICAKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBHbG9iYWxEZWNsICZMSFMsIGNvbnN0IEdsb2JhbERlY2wgJlJIUykgeworICAgIHJldHVybiBMSFMuVmFsdWUgPT0gUkhTLlZhbHVlOworICB9CisgIAorICB2b2lkICpnZXRBc09wYXF1ZVB0cigpIGNvbnN0IHsgcmV0dXJuIFZhbHVlLmdldE9wYXF1ZVZhbHVlKCk7IH0KKworICBzdGF0aWMgR2xvYmFsRGVjbCBnZXRGcm9tT3BhcXVlUHRyKHZvaWQgKlApIHsKKyAgICBHbG9iYWxEZWNsIEdEOworICAgIEdELlZhbHVlLnNldEZyb21PcGFxdWVWYWx1ZShQKTsKKyAgICByZXR1cm4gR0Q7CisgIH0KKyAgCisgIEdsb2JhbERlY2wgZ2V0V2l0aERlY2woY29uc3QgRGVjbCAqRCkgeworICAgIEdsb2JhbERlY2wgUmVzdWx0KCp0aGlzKTsKKyAgICBSZXN1bHQuVmFsdWUuc2V0UG9pbnRlcihEKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCituYW1lc3BhY2UgbGx2bSB7CisKKyAgdGVtcGxhdGU8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPGNsYW5nOjpHbG9iYWxEZWNsPiB7CisgICAgc3RhdGljIGlubGluZSBjbGFuZzo6R2xvYmFsRGVjbCBnZXRFbXB0eUtleSgpIHsKKyAgICAgIHJldHVybiBjbGFuZzo6R2xvYmFsRGVjbCgpOworICAgIH0KKyAgCisgICAgc3RhdGljIGlubGluZSBjbGFuZzo6R2xvYmFsRGVjbCBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgICByZXR1cm4gY2xhbmc6Okdsb2JhbERlY2w6OgorICAgICAgICBnZXRGcm9tT3BhcXVlUHRyKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KC0xKSk7CisgICAgfQorCisgICAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjbGFuZzo6R2xvYmFsRGVjbCBHRCkgeworICAgICAgcmV0dXJuIERlbnNlTWFwSW5mbzx2b2lkKj46OmdldEhhc2hWYWx1ZShHRC5nZXRBc09wYXF1ZVB0cigpKTsKKyAgICB9CisgICAgCisgICAgc3RhdGljIGJvb2wgaXNFcXVhbChjbGFuZzo6R2xvYmFsRGVjbCBMSFMsIAorICAgICAgICAgICAgICAgICAgICAgICAgY2xhbmc6Okdsb2JhbERlY2wgUkhTKSB7CisgICAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgICB9CisgIH07CisgIAorICAvLyBHbG9iYWxEZWNsIGlzbid0ICp0ZWNobmljYWxseSogYSBQT0QgdHlwZS4gSG93ZXZlciwgaXRzIGNvcHkgY29uc3RydWN0b3IsCisgIC8vIGNvcHkgYXNzaWdubWVudCBvcGVyYXRvciwgYW5kIGRlc3RydWN0b3IgYXJlIGFsbCB0cml2aWFsLgorICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgaXNQb2RMaWtlPGNsYW5nOjpHbG9iYWxEZWNsPiB7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworICB9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9HTE9CQUxERUNMX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9MYW1iZGFDYXB0dXJlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvTGFtYmRhQ2FwdHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MTdkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvTGFtYmRhQ2FwdHVyZS5oCkBAIC0wLDAgKzEsMTQyIEBACisvLz09PS0tLSBMYW1iZGFDYXB0dXJlLmggLSBUeXBlcyBmb3IgQysrIExhbWJkYSBDYXB0dXJlcyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgTGFtYmRhQ2FwdHVyZSBjbGFzcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9MQU1CREFDQVBUVVJFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfTEFNQkRBQ0FQVFVSRV9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xhbWJkYS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKKy8vLyBcYnJpZWYgRGVzY3JpYmVzIHRoZSBjYXB0dXJlIG9mIGEgdmFyaWFibGUgb3Igb2YgXGMgdGhpcywgb3Igb2YgYQorLy8vIEMrKzF5IGluaXQtY2FwdHVyZS4KK2NsYXNzIExhbWJkYUNhcHR1cmUgeworICBlbnVtIHsKKyAgICAvLy8gXGJyaWVmIEZsYWcgdXNlZCBieSB0aGUgQ2FwdHVyZSBjbGFzcyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBnaXZlbgorICAgIC8vLyBjYXB0dXJlIHdhcyBpbXBsaWNpdC4KKyAgICBDYXB0dXJlX0ltcGxpY2l0ID0gMHgwMSwKKworICAgIC8vLyBcYnJpZWYgRmxhZyB1c2VkIGJ5IHRoZSBDYXB0dXJlIGNsYXNzIHRvIGluZGljYXRlIHRoYXQgdGhlCisgICAgLy8vIGdpdmVuIGNhcHR1cmUgd2FzIGJ5LWNvcHkuCisgICAgLy8vCisgICAgLy8vIFRoaXMgaW5jbHVkZXMgdGhlIGNhc2Ugb2YgYSBub24tcmVmZXJlbmNlIGluaXQtY2FwdHVyZS4KKyAgICBDYXB0dXJlX0J5Q29weSA9IDB4MDIsCisKKyAgICAvLy8gXGJyaWVmIEZsYWcgdXNlZCBieSB0aGUgQ2FwdHVyZSBjbGFzcyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgY2FwdHVyZQorICAgIC8vLyBvZiAnKnRoaXMnIGFuZCBhIGNhcHR1cmUgb2YgYSBWTEEgdHlwZS4KKyAgICBDYXB0dXJlX1RoaXMgPSAweDA0CisgIH07CisKKyAgLy8gRGVjbCBjb3VsZCByZXByZXNlbnQ6CisgIC8vIC0gYSBWYXJEZWNsKiB0aGF0IHJlcHJlc2VudHMgdGhlIHZhcmlhYmxlIHRoYXQgd2FzIGNhcHR1cmVkIG9yIHRoZSAKKyAgLy8gICBpbml0LWNhcHR1cmUuCisgIC8vIC0gb3IsIGlzIGEgbnVsbHB0ciBhbmQgQ2FwdHVyZV9UaGlzIGlzIHNldCBpbiBCaXRzIGlmIHRoaXMgcmVwcmVzZW50cyBhCisgIC8vICAgY2FwdHVyZSBvZiAnKnRoaXMnIGJ5IHZhbHVlIG9yIHJlZmVyZW5jZS4KKyAgLy8gLSBvciwgaXMgYSBudWxscHRyIGFuZCBDYXB0dXJlX1RoaXMgaXMgbm90IHNldCBpbiBCaXRzIGlmIHRoaXMgcmVwcmVzZW50cworICAvLyAgIGEgY2FwdHVyZSBvZiBhIFZMQSB0eXBlLgorICBsbHZtOjpQb2ludGVySW50UGFpcjxEZWNsKiwgMz4gRGVjbEFuZEJpdHM7CisKKyAgU291cmNlTG9jYXRpb24gTG9jOworICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYzsKKworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRXcml0ZXI7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBuZXcgY2FwdHVyZSBvZiBhIHZhcmlhYmxlIG9yIG9mIFxjIHRoaXMuCisgIC8vLworICAvLy8gXHBhcmFtIExvYyBUaGUgc291cmNlIGxvY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhcHR1cmUuCisgIC8vLworICAvLy8gXHBhcmFtIEtpbmQgVGhlIGtpbmQgb2YgY2FwdHVyZSAodGhpcywgYnlyZWYsIGJ5Y29weSksIHdoaWNoIG11c3QKKyAgLy8vIG5vdCBiZSBpbml0LWNhcHR1cmUuCisgIC8vLworICAvLy8gXHBhcmFtIEltcGxpY2l0IFdoZXRoZXIgdGhlIGNhcHR1cmUgd2FzIGltcGxpY2l0IG9yIGV4cGxpY2l0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBWYXIgVGhlIGxvY2FsIHZhcmlhYmxlIGJlaW5nIGNhcHR1cmVkLCBvciBudWxsIGlmIGNhcHR1cmluZworICAvLy8gXGMgdGhpcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gRWxsaXBzaXNMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBlbGxpcHNpcyAoLi4uKSBmb3IgYQorICAvLy8gY2FwdHVyZSB0aGF0IGlzIGEgcGFjayBleHBhbnNpb24sIG9yIGFuIGludmFsaWQgc291cmNlCisgIC8vLyBsb2NhdGlvbiB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgbm90IGEgcGFjayBleHBhbnNpb24uCisgIExhbWJkYUNhcHR1cmUoU291cmNlTG9jYXRpb24gTG9jLCBib29sIEltcGxpY2l0LCBMYW1iZGFDYXB0dXJlS2luZCBLaW5kLAorICAgICAgICAgICAgICAgIFZhckRlY2wgKlZhciA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MgPSBTb3VyY2VMb2NhdGlvbigpKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUga2luZCBvZiBjYXB0dXJlLgorICBMYW1iZGFDYXB0dXJlS2luZCBnZXRDYXB0dXJlS2luZCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjYXB0dXJlIGhhbmRsZXMgdGhlIEMrKyBcYyB0aGlzCisgIC8vLyBwb2ludGVyLgorICBib29sIGNhcHR1cmVzVGhpcygpIGNvbnN0IHsKKyAgICByZXR1cm4gRGVjbEFuZEJpdHMuZ2V0UG9pbnRlcigpID09IG51bGxwdHIgJiYKKyAgICAgICAgICAoRGVjbEFuZEJpdHMuZ2V0SW50KCkgJiBDYXB0dXJlX1RoaXMpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNhcHR1cmUgaGFuZGxlcyBhIHZhcmlhYmxlLgorICBib29sIGNhcHR1cmVzVmFyaWFibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGR5bl9jYXN0X29yX251bGw8VmFyRGVjbD4oRGVjbEFuZEJpdHMuZ2V0UG9pbnRlcigpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjYXB0dXJlcyBhIHZhcmlhYmxlIGxlbmd0aCBhcnJheSBib3VuZAorICAvLy8gZXhwcmVzc2lvbi4KKyAgYm9vbCBjYXB0dXJlc1ZMQVR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIERlY2xBbmRCaXRzLmdldFBvaW50ZXIoKSA9PSBudWxscHRyICYmCisgICAgICAgICAgICEoRGVjbEFuZEJpdHMuZ2V0SW50KCkgJiBDYXB0dXJlX1RoaXMpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGxvY2FsIHZhcmlhYmxlIGJlaW5nCisgIC8vLyBjYXB0dXJlZC4KKyAgLy8vCisgIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBvbmx5IHZhbGlkIGlmIHRoaXMgY2FwdHVyZSBpcyBhIHZhcmlhYmxlIGNhcHR1cmUKKyAgLy8vIChvdGhlciB0aGFuIGEgY2FwdHVyZSBvZiBcYyB0aGlzKS4KKyAgVmFyRGVjbCAqZ2V0Q2FwdHVyZWRWYXIoKSBjb25zdCB7CisgICAgYXNzZXJ0KGNhcHR1cmVzVmFyaWFibGUoKSAmJiAiTm8gdmFyaWFibGUgYXZhaWxhYmxlIGZvciBjYXB0dXJlIik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFZhckRlY2wgKj4oRGVjbEFuZEJpdHMuZ2V0UG9pbnRlcigpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB3YXMgYW4gaW1wbGljaXQgY2FwdHVyZSAobm90CisgIC8vLyB3cml0dGVuIGJldHdlZW4gdGhlIHNxdWFyZSBicmFja2V0cyBpbnRyb2R1Y2luZyB0aGUgbGFtYmRhKS4KKyAgYm9vbCBpc0ltcGxpY2l0KCkgY29uc3QgeworICAgIHJldHVybiBEZWNsQW5kQml0cy5nZXRJbnQoKSAmIENhcHR1cmVfSW1wbGljaXQ7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgd2FzIGFuIGV4cGxpY2l0IGNhcHR1cmUgKHdyaXR0ZW4KKyAgLy8vIGJldHdlZW4gdGhlIHNxdWFyZSBicmFja2V0cyBpbnRyb2R1Y2luZyB0aGUgbGFtYmRhKS4KKyAgYm9vbCBpc0V4cGxpY2l0KCkgY29uc3QgeyByZXR1cm4gIWlzSW1wbGljaXQoKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY2FwdHVyZS4KKyAgLy8vCisgIC8vLyBGb3IgYW4gZXhwbGljaXQgY2FwdHVyZSwgdGhpcyByZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUKKyAgLy8vIGV4cGxpY2l0IGNhcHR1cmUgaW4gdGhlIHNvdXJjZS4gRm9yIGFuIGltcGxpY2l0IGNhcHR1cmUsIHRoaXMKKyAgLy8vIHJldHVybnMgdGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRoZSB2YXJpYWJsZSBvciBcYyB0aGlzIHdhcyBmaXJzdAorICAvLy8gdXNlZC4KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2FwdHVyZSBpcyBhIHBhY2sgZXhwYW5zaW9uLAorICAvLy8gd2hpY2ggY2FwdHVyZXMgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgcGFjay4KKyAgYm9vbCBpc1BhY2tFeHBhbnNpb24oKSBjb25zdCB7IHJldHVybiBFbGxpcHNpc0xvYy5pc1ZhbGlkKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZWxsaXBzaXMgZm9yIGEgY2FwdHVyZQorICAvLy8gdGhhdCBpcyBhIHBhY2sgZXhwYW5zaW9uLgorICBTb3VyY2VMb2NhdGlvbiBnZXRFbGxpcHNpc0xvYygpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNQYWNrRXhwYW5zaW9uKCkgJiYgIk5vIGVsbGlwc2lzIGxvY2F0aW9uIGZvciBhIG5vbi1leHBhbnNpb24iKTsKKyAgICByZXR1cm4gRWxsaXBzaXNMb2M7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19BU1RfTEFNQkRBQ0FQVFVSRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvTGV4aWNhbGx5T3JkZXJlZFJlY3Vyc2l2ZUFTVFZpc2l0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9MZXhpY2FsbHlPcmRlcmVkUmVjdXJzaXZlQVNUVmlzaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NGYyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvTGV4aWNhbGx5T3JkZXJlZFJlY3Vyc2l2ZUFTVFZpc2l0b3IuaApAQCAtMCwwICsxLDE2NCBAQAorLy89PT0tLS0gTGV4aWNhbGx5T3JkZXJlZFJlY3Vyc2l2ZUFTVFZpc2l0b3IuaCAtIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIExleGljYWxseU9yZGVyZWRSZWN1cnNpdmVBU1RWaXNpdG9yIGludGVyZmFjZSwgd2hpY2gKKy8vICByZWN1cnNpdmVseSB0cmF2ZXJzZXMgdGhlIGVudGlyZSBBU1QgaW4gYSBsZXhpY2FsIG9yZGVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfTEVYSUNBTExZX09SREVSRURfUkVDVVJTSVZFQVNUVklTSVRPUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX0xFWElDQUxMWV9PUkRFUkVEX1JFQ1VSU0lWRUFTVFZJU0lUT1JfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL1JlY3Vyc2l2ZUFTVFZpc2l0b3IuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TYXZlQW5kUmVzdG9yZS5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCisvLy8gQSBSZWN1cnNpdmVBU1RWaXNpdG9yIHN1YmNsYXNzIHRoYXQgZ3VhcmFudGVlcyB0aGF0IEFTVCB0cmF2ZXJzYWwgaXMKKy8vLyBwZXJmb3JtZWQgaW4gYSBsZXhpY2FsIG9yZGVyIChpLmUuIHRoZSBvcmRlciBpbiB3aGljaCBkZWNsYXJhdGlvbnMgYXJlCisvLy8gd3JpdHRlbiBpbiB0aGUgc291cmNlKS4KKy8vLworLy8vIFJlY3Vyc2l2ZUFTVFZpc2l0b3IgZG9lc24ndCBndWFyYW50ZWUgbGV4aWNhbCBvcmRlcmluZyBiZWNhdXNlIHRoZXJlIGFyZQorLy8vIHNvbWUgZGVjbGFyYXRpb25zLCBsaWtlIE9iamVjdGl2ZS1DIEBpbXBsZW1lbnRhdGlvbiBkZWNsYXJhdGlvbnMKKy8vLyB0aGF0IG1pZ2h0IGJlIHJlcHJlc2VudGVkIGluIHRoZSBBU1QgZGlmZmVyZW50bHkgdG8gaG93IHRoZXkgd2VyZSB3cml0dGVuCisvLy8gaW4gdGhlIHNvdXJjZS4KKy8vLyBJbiBwYXJ0aWN1bGFyLCBPYmplY3RpdmUtQyBAaW1wbGVtZW50YXRpb24gZGVjbGFyYXRpb25zIG1heSBjb250YWluCisvLy8gbm9uLU9iamVjdGl2ZS1DIGRlY2xhcmF0aW9ucywgbGlrZSBmdW5jdGlvbnM6CisvLy8KKy8vLyAgIEBpbXBsZW1lbnRhdGlvbiBNeUNsYXNzCisvLy8KKy8vLyAgIC0gKHZvaWQpIG1ldGhvZCB7IH0KKy8vLyAgIHZvaWQgbm9ybWFsRnVuY3Rpb24oKSB7IH0KKy8vLworLy8vICAgQGVuZAorLy8vCisvLy8gQ2xhbmcncyBBU1Qgc3RvcmVzIHRoZXNlIGRlY2xhcmF0aW9ucyBvdXRzaWRlIG9mIHRoZSBAaW1wbGVtZW50YXRpb24KKy8vLyBkZWNsYXJhdGlvbiwgc28gdGhlIGV4YW1wbGUgYWJvdmUgd291bGQgYmUgcmVwcmVzZW50ZWQgdXNpbmcgdGhlIGZvbGxvd2luZworLy8vIEFTVDoKKy8vLyAgIHwtT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAuLi4gTXlDbGFzcworLy8vICAgfCBgLU9iakNNZXRob2REZWNsIC4uLiBtZXRob2QKKy8vLyAgIHwgICAgLi4uCisvLy8gICBgLUZ1bmN0aW9uRGVjbCAuLi4gbm9ybWFsRnVuY3Rpb24KKy8vLyAgICAgICAuLi4KKy8vLworLy8vIFRoaXMgY2xhc3MgZW5zdXJlcyB0aGF0IHRoZXNlIGRlY2xhcmF0aW9ucyBhcmUgdHJhdmVyc2VkIGJlZm9yZSB0aGUKKy8vLyBjb3JyZXNwb25kaW5nIFRyYXZlcnNlRGVjbCBmb3IgdGhlIEBpbXBsZW1lbnRhdGlvbiByZXR1cm5zLiBUaGlzIGVuc3VyZXMKKy8vLyB0aGF0IHRoZSBsZXhpY2FsIHBhcmVudCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVzZSBkZWNsYXJhdGlvbnMgYW5kIHRoZQorLy8vIEBpbXBsZW1lbnRhdGlvbiBpcyBwcmVzZXJ2ZWQgd2hpbGUgdHJhdmVyc2luZyB0aGUgQVNULiBOb3RlIHRoYXQgdGhlCisvLy8gY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IG1peCB0aGVzZSBkZWNsYXJhdGlvbnMgd2l0aCB0aGUgZGVjbGFyYXRpb25zCisvLy8gY29udGFpbmVkIGluIHRoZSBAaW1wbGVtZW50YXRpb24sIHNvIHRoZSB0cmF2ZXJzYWwgb2YgYWxsIG9mIHRoZQorLy8vIGRlY2xhcmF0aW9ucyBpbiB0aGUgQGltcGxlbWVudGF0aW9uIHN0aWxsIGRvZXNuJ3QgZm9sbG93IHRoZSBsZXhpY2FsIG9yZGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBMZXhpY2FsbHlPcmRlcmVkUmVjdXJzaXZlQVNUVmlzaXRvcgorICAgIDogcHVibGljIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD4geworICB1c2luZyBCYXNlVHlwZSA9IFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD47CisKK3B1YmxpYzoKKyAgTGV4aWNhbGx5T3JkZXJlZFJlY3Vyc2l2ZUFTVFZpc2l0b3IoY29uc3QgU291cmNlTWFuYWdlciAmU00pIDogU00oU00pIHt9CisKKyAgYm9vbCBUcmF2ZXJzZU9iakNJbXBsZW1lbnRhdGlvbkRlY2woT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqRCkgeworICAgIC8vIE9iamVjdGl2ZS1DIEBpbXBsZW1lbnRhdGlvbiBkZWNsYXJhdGlvbnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGVhcmx5IGV4aXQKKyAgICAvLyB1bnRpbCB0aGUgYWRkaXRpb25hbCBkZWNscyBhcmUgdHJhdmVyc2VkIGFzIHRoZWlyIGNoaWxkcmVuIGFyZSBub3QKKyAgICAvLyBsZXhpY2FsbHkgb3JkZXJlZC4KKyAgICBib29sIFJlc3VsdCA9IEJhc2VUeXBlOjpUcmF2ZXJzZU9iakNJbXBsZW1lbnRhdGlvbkRlY2woRCk7CisgICAgcmV0dXJuIFRyYXZlcnNlQWRkaXRpb25hbExleGljYWxseU5lc3RlZERlY2xhcmF0aW9ucygpID8gUmVzdWx0IDogZmFsc2U7CisgIH0KKworICBib29sIFRyYXZlcnNlT2JqQ0NhdGVnb3J5SW1wbERlY2woT2JqQ0NhdGVnb3J5SW1wbERlY2wgKkQpIHsKKyAgICBib29sIFJlc3VsdCA9IEJhc2VUeXBlOjpUcmF2ZXJzZU9iakNDYXRlZ29yeUltcGxEZWNsKEQpOworICAgIHJldHVybiBUcmF2ZXJzZUFkZGl0aW9uYWxMZXhpY2FsbHlOZXN0ZWREZWNsYXJhdGlvbnMoKSA/IFJlc3VsdCA6IGZhbHNlOworICB9CisKKyAgYm9vbCBUcmF2ZXJzZURlY2xDb250ZXh0SGVscGVyKERlY2xDb250ZXh0ICpEQykgeworICAgIGlmICghREMpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGZvciAoYXV0byBJID0gREMtPmRlY2xzX2JlZ2luKCksIEUgPSBEQy0+ZGVjbHNfZW5kKCk7IEkgIT0gRTspIHsKKyAgICAgIERlY2wgKkNoaWxkID0gKkk7CisgICAgICBpZiAoQmFzZVR5cGU6OmNhbklnbm9yZUNoaWxkRGVjbFdoaWxlVHJhdmVyc2luZ0RlY2xDb250ZXh0KENoaWxkKSkgeworICAgICAgICArK0k7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKCFpc2E8T2JqQ0ltcGxlbWVudGF0aW9uRGVjbD4oQ2hpbGQpICYmCisgICAgICAgICAgIWlzYTxPYmpDQ2F0ZWdvcnlJbXBsRGVjbD4oQ2hpbGQpKSB7CisgICAgICAgIGlmICghQmFzZVR5cGU6OmdldERlcml2ZWQoKS5UcmF2ZXJzZURlY2woQ2hpbGQpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgKytJOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIC8vIEdhdGhlciBkZWNsYXJhdGlvbnMgdGhhdCBmb2xsb3cgdGhlIE9iamVjdGl2ZS1DIGltcGxlbWVudGF0aW9uCisgICAgICAvLyBkZWNsYXJhdGlvbnMgYnV0IGFyZSBsZXhpY2FsbHkgY29udGFpbmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgIExleGljYWxseU5lc3RlZERlY2xhcmF0aW9ucy5jbGVhcigpOworICAgICAgZm9yICgrK0k7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIERlY2wgKlNpYmxpbmcgPSAqSTsKKyAgICAgICAgaWYgKCFTTS5pc0JlZm9yZUluVHJhbnNsYXRpb25Vbml0KFNpYmxpbmctPmdldExvY1N0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGlsZC0+Z2V0TG9jRW5kKCkpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoIUJhc2VUeXBlOjpjYW5JZ25vcmVDaGlsZERlY2xXaGlsZVRyYXZlcnNpbmdEZWNsQ29udGV4dChTaWJsaW5nKSkKKyAgICAgICAgICBMZXhpY2FsbHlOZXN0ZWREZWNsYXJhdGlvbnMucHVzaF9iYWNrKFNpYmxpbmcpOworICAgICAgfQorICAgICAgaWYgKCFCYXNlVHlwZTo6Z2V0RGVyaXZlZCgpLlRyYXZlcnNlRGVjbChDaGlsZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBTdG10OjpjaGlsZF9yYW5nZSBnZXRTdG10Q2hpbGRyZW4oU3RtdCAqUykgeyByZXR1cm4gUy0+Y2hpbGRyZW4oKTsgfQorCisgIFNtYWxsVmVjdG9yPFN0bXQgKiwgOD4gZ2V0U3RtdENoaWxkcmVuKENYWE9wZXJhdG9yQ2FsbEV4cHIgKkNFKSB7CisgICAgU21hbGxWZWN0b3I8U3RtdCAqLCA4PiBDaGlsZHJlbihDRS0+Y2hpbGRyZW4oKSk7CisgICAgYm9vbCBTd2FwOworICAgIC8vIFN3aXRjaCB0aGUgb3BlcmF0b3IgYW5kIHRoZSBmaXJzdCBvcGVyYW5kIGZvciBhbGwgaW5maXggYW5kIHBvc3RmaXgKKyAgICAvLyBvcGVyYXRpb25zLgorICAgIHN3aXRjaCAoQ0UtPmdldE9wZXJhdG9yKCkpIHsKKyAgICBjYXNlIE9PX0Fycm93OgorICAgIGNhc2UgT09fQ2FsbDoKKyAgICBjYXNlIE9PX1N1YnNjcmlwdDoKKyAgICAgIFN3YXAgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPT19QbHVzUGx1czoKKyAgICBjYXNlIE9PX01pbnVzTWludXM6CisgICAgICAvLyBUaGVzZSBhcmUgcG9zdGZpeCB1bmxlc3MgdGhlcmUgaXMgZXhhY3RseSBvbmUgYXJndW1lbnQuCisgICAgICBTd2FwID0gQ2hpbGRyZW4uc2l6ZSgpICE9IDI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgU3dhcCA9IENFLT5pc0luZml4QmluYXJ5T3AoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoU3dhcCAmJiBDaGlsZHJlbi5zaXplKCkgPiAxKQorICAgICAgc3RkOjpzd2FwKENoaWxkcmVuWzBdLCBDaGlsZHJlblsxXSk7CisgICAgcmV0dXJuIENoaWxkcmVuOworICB9CisKK3ByaXZhdGU6CisgIGJvb2wgVHJhdmVyc2VBZGRpdGlvbmFsTGV4aWNhbGx5TmVzdGVkRGVjbGFyYXRpb25zKCkgeworICAgIC8vIEZJWE1FOiBJZGVhbGx5IHRoZSBnYXRoZXJlZCBkZWNsYXJhdGlvbnMgYW5kIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlCisgICAgLy8gQGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBtaXhlZCBhbmQgc29ydGVkIHRvIGdldCBhIHRydWUgbGV4aWNhbCBvcmRlciwKKyAgICAvLyBidXQgcmlnaHQgbm93IHdlIG9ubHkgY2FyZSBhYm91dCBnZXR0aW5nIHRoZSBjb3JyZWN0IGxleGljYWwgcGFyZW50LCBzbworICAgIC8vIHdlIGNhbiB0cmF2ZXJzZSB0aGUgZ2F0aGVyZWQgbmVzdGVkIGRlY2xhcmF0aW9ucyBhZnRlciB0aGUgZGVjbGFyYXRpb25zCisgICAgLy8gaW4gdGhlIGRlY2wgY29udGV4dC4KKyAgICBhc3NlcnQoIUJhc2VUeXBlOjpnZXREZXJpdmVkKCkuc2hvdWxkVHJhdmVyc2VQb3N0T3JkZXIoKSAmJgorICAgICAgICAgICAicG9zdC1vcmRlciB0cmF2ZXJzYWwgaXMgbm90IHN1cHBvcnRlZCBmb3IgbGV4aWNhbGx5IG9yZGVyZWQgIgorICAgICAgICAgICAicmVjdXJzaXZlIGFzdCB2aXNpdG9yIik7CisgICAgZm9yIChEZWNsICpEIDogTGV4aWNhbGx5TmVzdGVkRGVjbGFyYXRpb25zKSB7CisgICAgICBpZiAoIUJhc2VUeXBlOjpnZXREZXJpdmVkKCkuVHJhdmVyc2VEZWNsKEQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY29uc3QgU291cmNlTWFuYWdlciAmU007CisgIGxsdm06OlNtYWxsVmVjdG9yPERlY2wgKiwgOD4gTGV4aWNhbGx5TmVzdGVkRGVjbGFyYXRpb25zOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9MRVhJQ0FMTFlfT1JERVJFRF9SRUNVUlNJVkVBU1RWSVNJVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Mb2NJbmZvVHlwZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL0xvY0luZm9UeXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U1NzNiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9Mb2NJbmZvVHlwZS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8vPT09LS0tIExvY0luZm9UeXBlLmggLSBQYXJzZWQgVHlwZSB3aXRoIExvY2F0aW9uIEluZm9ybWF0aW9uLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIExvY0luZm9UeXBlIGNsYXNzLCB3aGljaCBob2xkcyBhIHR5cGUgYW5kIGl0cworLy8gc291cmNlLWxvY2F0aW9uIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fQ0xBTkdfU0VNQV9MT0NJTkZPVFlQRV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU0VNQV9MT0NJTkZPVFlQRV9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBUeXBlU291cmNlSW5mbzsKKworLy8vIFxicmllZiBIb2xkcyBhIFF1YWxUeXBlIGFuZCBhIFR5cGVTb3VyY2VJbmZvKiB0aGF0IGNhbWUgb3V0IG9mIGEgZGVjbGFyYXRvcgorLy8vIHBhcnNpbmcuCisvLy8KKy8vLyBMb2NJbmZvVHlwZSBpcyBhICJ0cmFuc2llbnQiIHR5cGUsIG9ubHkgbmVlZGVkIGZvciBwYXNzaW5nIHRvL2Zyb20gUGFyc2VyCisvLy8gYW5kIFNlbWEsIHdoZW4gd2Ugd2FudCB0byBwcmVzZXJ2ZSB0eXBlIHNvdXJjZSBpbmZvIGZvciBhIHBhcnNlZCB0eXBlLgorLy8vIEl0IHdpbGwgbm90IHBhcnRpY2lwYXRlIGluIHRoZSB0eXBlIHN5c3RlbSBzZW1hbnRpY3MgaW4gYW55IHdheS4KK2NsYXNzIExvY0luZm9UeXBlIDogcHVibGljIFR5cGUgeworICBlbnVtIHsKKyAgICAvLyBUaGUgbGFzdCBudW1iZXIgdGhhdCBjYW4gZml0IGluIFR5cGUncyBUQy4KKyAgICAvLyBBdm9pZHMgY29uZmxpY3Qgd2l0aCBhbiBleGlzdGluZyBUeXBlIGNsYXNzLgorICAgIExvY0luZm8gPSBUeXBlOjpUeXBlTGFzdCArIDEKKyAgfTsKKworICBUeXBlU291cmNlSW5mbyAqRGVjbEluZm87CisKKyAgTG9jSW5mb1R5cGUoUXVhbFR5cGUgdHksIFR5cGVTb3VyY2VJbmZvICpUSW5mbykKKyAgICAgIDogVHlwZSgoVHlwZUNsYXNzKUxvY0luZm8sIHR5LCB0eS0+aXNEZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgICAgdHktPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudFR5cGUoKSwgdHktPmlzVmFyaWFibHlNb2RpZmllZFR5cGUoKSwKKyAgICAgICAgICAgICB0eS0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSwKKyAgICAgICAgRGVjbEluZm8oVEluZm8pIHsKKyAgICBhc3NlcnQoZ2V0VHlwZUNsYXNzKCkgPT0gKFR5cGVDbGFzcylMb2NJbmZvICYmICJMb2NJbmZvIGRpZG4ndCBmaXQgaW4gVEM/Iik7CisgIH0KKyAgZnJpZW5kIGNsYXNzIFNlbWE7CisKK3B1YmxpYzoKKyAgUXVhbFR5cGUgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIGdldENhbm9uaWNhbFR5cGVJbnRlcm5hbCgpOyB9CisgIFR5cGVTb3VyY2VJbmZvICpnZXRUeXBlU291cmNlSW5mbygpIGNvbnN0IHsgcmV0dXJuIERlY2xJbmZvOyB9CisKKyAgdm9pZCBnZXRBc1N0cmluZ0ludGVybmFsKHN0ZDo6c3RyaW5nICZTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gKFR5cGVDbGFzcylMb2NJbmZvOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfU0VNQV9MT0NJTkZPVFlQRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvTWFuZ2xlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvTWFuZ2xlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjNzhkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9NYW5nbGUuaApAQCAtMCwwICsxLDI0OCBAQAorLy89PT0tLS0gTWFuZ2xlLmggLSBNYW5nbGUgQysrIE5hbWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZWZpbmVzIHRoZSBDKysgbmFtZSBtYW5nbGluZyBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9NQU5HTEVfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9NQU5HTEVfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9BQkkuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgcmF3X29zdHJlYW07Cit9CisKK25hbWVzcGFjZSBjbGFuZyB7CisgIGNsYXNzIEFTVENvbnRleHQ7CisgIGNsYXNzIEJsb2NrRGVjbDsKKyAgY2xhc3MgQ1hYQ29uc3RydWN0b3JEZWNsOworICBjbGFzcyBDWFhEZXN0cnVjdG9yRGVjbDsKKyAgY2xhc3MgQ1hYTWV0aG9kRGVjbDsKKyAgY2xhc3MgRnVuY3Rpb25EZWNsOworICBzdHJ1Y3QgTWV0aG9kVkZUYWJsZUxvY2F0aW9uOworICBjbGFzcyBOYW1lZERlY2w7CisgIGNsYXNzIE9iakNNZXRob2REZWNsOworICBjbGFzcyBTdHJpbmdMaXRlcmFsOworICBzdHJ1Y3QgVGhpc0FkanVzdG1lbnQ7CisgIHN0cnVjdCBUaHVua0luZm87CisgIGNsYXNzIFZhckRlY2w7CisKKy8vLyBNYW5nbGVDb250ZXh0IC0gQ29udGV4dCBmb3IgdHJhY2tpbmcgc3RhdGUgd2hpY2ggcGVyc2lzdHMgYWNyb3NzIG11bHRpcGxlCisvLy8gY2FsbHMgdG8gdGhlIEMrKyBuYW1lIG1hbmdsZXIuCitjbGFzcyBNYW5nbGVDb250ZXh0IHsKK3B1YmxpYzoKKyAgZW51bSBNYW5nbGVyS2luZCB7CisgICAgTUtfSXRhbml1bSwKKyAgICBNS19NaWNyb3NvZnQKKyAgfTsKKworcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCisgIEFTVENvbnRleHQgJkNvbnRleHQ7CisgIERpYWdub3N0aWNzRW5naW5lICZEaWFnczsKKyAgY29uc3QgTWFuZ2xlcktpbmQgS2luZDsKKworICBsbHZtOjpEZW5zZU1hcDxjb25zdCBCbG9ja0RlY2wqLCB1bnNpZ25lZD4gR2xvYmFsQmxvY2tJZHM7CisgIGxsdm06OkRlbnNlTWFwPGNvbnN0IEJsb2NrRGVjbCosIHVuc2lnbmVkPiBMb2NhbEJsb2NrSWRzOworICBsbHZtOjpEZW5zZU1hcDxjb25zdCBUYWdEZWNsKiwgdWludDY0X3Q+IEFub25TdHJ1Y3RJZHM7CisKK3B1YmxpYzoKKyAgTWFuZ2xlcktpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICBleHBsaWNpdCBNYW5nbGVDb250ZXh0KEFTVENvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1hbmdsZXJLaW5kIEtpbmQpCisgICAgICA6IENvbnRleHQoQ29udGV4dCksIERpYWdzKERpYWdzKSwgS2luZChLaW5kKSB7fQorCisgIHZpcnR1YWwgfk1hbmdsZUNvbnRleHQoKSB7IH0KKworICBBU1RDb250ZXh0ICZnZXRBU1RDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQ29udGV4dDsgfQorCisgIERpYWdub3N0aWNzRW5naW5lICZnZXREaWFncygpIGNvbnN0IHsgcmV0dXJuIERpYWdzOyB9CisKKyAgdmlydHVhbCB2b2lkIHN0YXJ0TmV3RnVuY3Rpb24oKSB7IExvY2FsQmxvY2tJZHMuY2xlYXIoKTsgfQorICAKKyAgdW5zaWduZWQgZ2V0QmxvY2tJZChjb25zdCBCbG9ja0RlY2wgKkJELCBib29sIExvY2FsKSB7CisgICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQmxvY2tEZWNsICosIHVuc2lnbmVkPiAmQmxvY2tJZHMKKyAgICAgID0gTG9jYWw/IExvY2FsQmxvY2tJZHMgOiBHbG9iYWxCbG9ja0lkczsKKyAgICBzdGQ6OnBhaXI8bGx2bTo6RGVuc2VNYXA8Y29uc3QgQmxvY2tEZWNsICosIHVuc2lnbmVkPjo6aXRlcmF0b3IsIGJvb2w+CisgICAgICBSZXN1bHQgPSBCbG9ja0lkcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoQkQsIEJsb2NrSWRzLnNpemUoKSkpOworICAgIHJldHVybiBSZXN1bHQuZmlyc3QtPnNlY29uZDsKKyAgfQorCisgIHVpbnQ2NF90IGdldEFub255bW91c1N0cnVjdElkKGNvbnN0IFRhZ0RlY2wgKlREKSB7CisgICAgc3RkOjpwYWlyPGxsdm06OkRlbnNlTWFwPGNvbnN0IFRhZ0RlY2wgKiwgdWludDY0X3Q+OjppdGVyYXRvciwgYm9vbD4KKyAgICAgICAgUmVzdWx0ID0gQW5vblN0cnVjdElkcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoVEQsIEFub25TdHJ1Y3RJZHMuc2l6ZSgpKSk7CisgICAgcmV0dXJuIFJlc3VsdC5maXJzdC0+c2Vjb25kOworICB9CisKKyAgLy8vIEBuYW1lIE1hbmdsZXIgRW50cnkgUG9pbnRzCisgIC8vLyBAeworCisgIGJvb2wgc2hvdWxkTWFuZ2xlRGVjbE5hbWUoY29uc3QgTmFtZWREZWNsICpEKTsKKyAgdmlydHVhbCBib29sIHNob3VsZE1hbmdsZUNYWE5hbWUoY29uc3QgTmFtZWREZWNsICpEKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBzaG91bGRNYW5nbGVTdHJpbmdMaXRlcmFsKGNvbnN0IFN0cmluZ0xpdGVyYWwgKlNMKSA9IDA7CisKKyAgLy8gRklYTUU6IGNvbnNpZGVyIHJlcGxhY2luZyByYXdfb3N0cmVhbSAmIHdpdGggc29tZXRoaW5nIGxpa2UgU21hbGxTdHJpbmcgJi4KKyAgdm9pZCBtYW5nbGVOYW1lKGNvbnN0IE5hbWVkRGVjbCAqRCwgcmF3X29zdHJlYW0gJik7CisgIHZpcnR1YWwgdm9pZCBtYW5nbGVDWFhOYW1lKGNvbnN0IE5hbWVkRGVjbCAqRCwgcmF3X29zdHJlYW0gJikgPSAwOworICB2aXJ0dWFsIHZvaWQgbWFuZ2xlVGh1bmsoY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRodW5rSW5mbyAmVGh1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICYpID0gMDsKKyAgdmlydHVhbCB2b2lkIG1hbmdsZUNYWER0b3JUaHVuayhjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqREQsIENYWER0b3JUeXBlIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhpc0FkanVzdG1lbnQgJlRoaXNBZGp1c3RtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICYpID0gMDsKKyAgdmlydHVhbCB2b2lkIG1hbmdsZVJlZmVyZW5jZVRlbXBvcmFyeShjb25zdCBWYXJEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1hbmdsaW5nTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICYpID0gMDsKKyAgdmlydHVhbCB2b2lkIG1hbmdsZUNYWFJUVEkoUXVhbFR5cGUgVCwgcmF3X29zdHJlYW0gJikgPSAwOworICB2aXJ0dWFsIHZvaWQgbWFuZ2xlQ1hYUlRUSU5hbWUoUXVhbFR5cGUgVCwgcmF3X29zdHJlYW0gJikgPSAwOworICB2aXJ0dWFsIHZvaWQgbWFuZ2xlQ1hYQ3Rvcihjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkQsIENYWEN0b3JUeXBlIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICYpID0gMDsKKyAgdmlydHVhbCB2b2lkIG1hbmdsZUNYWER0b3IoY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkQsIENYWER0b3JUeXBlIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICYpID0gMDsKKyAgdmlydHVhbCB2b2lkIG1hbmdsZVN0cmluZ0xpdGVyYWwoY29uc3QgU3RyaW5nTGl0ZXJhbCAqU0wsIHJhd19vc3RyZWFtICYpID0gMDsKKworICB2b2lkIG1hbmdsZUdsb2JhbEJsb2NrKGNvbnN0IEJsb2NrRGVjbCAqQkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZWREZWNsICpJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT3V0KTsKKyAgdm9pZCBtYW5nbGVDdG9yQmxvY2soY29uc3QgQ1hYQ29uc3RydWN0b3JEZWNsICpDRCwgQ1hYQ3RvclR5cGUgQ1QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJsb2NrRGVjbCAqQkQsIHJhd19vc3RyZWFtICZPdXQpOworICB2b2lkIG1hbmdsZUR0b3JCbG9jayhjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqQ0QsIENYWER0b3JUeXBlIERULAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCbG9ja0RlY2wgKkJELCByYXdfb3N0cmVhbSAmT3V0KTsKKyAgdm9pZCBtYW5nbGVCbG9jayhjb25zdCBEZWNsQ29udGV4dCAqREMsIGNvbnN0IEJsb2NrRGVjbCAqQkQsCisgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk91dCk7CisKKyAgdm9pZCBtYW5nbGVPYmpDTWV0aG9kTmFtZVdpdGhvdXRTaXplKGNvbnN0IE9iakNNZXRob2REZWNsICpNRCwgcmF3X29zdHJlYW0gJik7CisgIHZvaWQgbWFuZ2xlT2JqQ01ldGhvZE5hbWUoY29uc3QgT2JqQ01ldGhvZERlY2wgKk1ELCByYXdfb3N0cmVhbSAmKTsKKworICB2aXJ0dWFsIHZvaWQgbWFuZ2xlU3RhdGljR3VhcmRWYXJpYWJsZShjb25zdCBWYXJEZWNsICpELCByYXdfb3N0cmVhbSAmKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIG1hbmdsZUR5bmFtaWNJbml0aWFsaXplcihjb25zdCBWYXJEZWNsICpELCByYXdfb3N0cmVhbSAmKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIG1hbmdsZUR5bmFtaWNBdEV4aXREZXN0cnVjdG9yKGNvbnN0IFZhckRlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIG1hbmdsZVNFSEZpbHRlckV4cHJlc3Npb24oY29uc3QgTmFtZWREZWNsICpFbmNsb3NpbmdEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT3V0KSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIG1hbmdsZVNFSEZpbmFsbHlCbG9jayhjb25zdCBOYW1lZERlY2wgKkVuY2xvc2luZ0RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk91dCkgPSAwOworCisgIC8vLyBHZW5lcmF0ZXMgYSB1bmlxdWUgc3RyaW5nIGZvciBhbiBleHRlcm5hbGx5IHZpc2libGUgdHlwZSBmb3IgdXNlIHdpdGggVEJBQQorICAvLy8gb3IgdHlwZSB1bmlxdWluZy4KKyAgLy8vIFRPRE86IEV4dGVuZCB0aGlzIHRvIGludGVybmFsIHR5cGVzIGJ5IGdlbmVyYXRpbmcgbmFtZXMgdGhhdCBhcmUgdW5pcXVlCisgIC8vLyBhY3Jvc3MgdHJhbnNsYXRpb24gdW5pdHMgc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBMVE8uCisgIHZpcnR1YWwgdm9pZCBtYW5nbGVUeXBlTmFtZShRdWFsVHlwZSBULCByYXdfb3N0cmVhbSAmKSA9IDA7CisKKyAgLy8vIEB9Cit9OworCitjbGFzcyBJdGFuaXVtTWFuZ2xlQ29udGV4dCA6IHB1YmxpYyBNYW5nbGVDb250ZXh0IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgSXRhbml1bU1hbmdsZUNvbnRleHQoQVNUQ29udGV4dCAmQywgRGlhZ25vc3RpY3NFbmdpbmUgJkQpCisgICAgICA6IE1hbmdsZUNvbnRleHQoQywgRCwgTUtfSXRhbml1bSkge30KKworICB2aXJ0dWFsIHZvaWQgbWFuZ2xlQ1hYVlRhYmxlKGNvbnN0IENYWFJlY29yZERlY2wgKlJELCByYXdfb3N0cmVhbSAmKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBtYW5nbGVDWFhWVFQoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsIHJhd19vc3RyZWFtICYpID0gMDsKKyAgdmlydHVhbCB2b2lkIG1hbmdsZUNYWEN0b3JWVGFibGUoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsIGludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBtYW5nbGVJdGFuaXVtVGhyZWFkTG9jYWxJbml0KGNvbnN0IFZhckRlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICYpID0gMDsKKyAgdmlydHVhbCB2b2lkIG1hbmdsZUl0YW5pdW1UaHJlYWRMb2NhbFdyYXBwZXIoY29uc3QgVmFyRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJikgPSAwOworCisgIHZpcnR1YWwgdm9pZCBtYW5nbGVDWFhDdG9yQ29tZGF0KGNvbnN0IENYWENvbnN0cnVjdG9yRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJikgPSAwOworICB2aXJ0dWFsIHZvaWQgbWFuZ2xlQ1hYRHRvckNvbWRhdChjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJikgPSAwOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWFuZ2xlQ29udGV4dCAqQykgeworICAgIHJldHVybiBDLT5nZXRLaW5kKCkgPT0gTUtfSXRhbml1bTsKKyAgfQorCisgIHN0YXRpYyBJdGFuaXVtTWFuZ2xlQ29udGV4dCAqY3JlYXRlKEFTVENvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lICZEaWFncyk7Cit9OworCitjbGFzcyBNaWNyb3NvZnRNYW5nbGVDb250ZXh0IDogcHVibGljIE1hbmdsZUNvbnRleHQgeworcHVibGljOgorICBleHBsaWNpdCBNaWNyb3NvZnRNYW5nbGVDb250ZXh0KEFTVENvbnRleHQgJkMsIERpYWdub3N0aWNzRW5naW5lICZEKQorICAgICAgOiBNYW5nbGVDb250ZXh0KEMsIEQsIE1LX01pY3Jvc29mdCkge30KKworICAvLy8gXGJyaWVmIE1hbmdsZSB2ZnRhYmxlIHN5bWJvbHMuICBPbmx5IGEgc3Vic2V0IG9mIHRoZSBiYXNlcyBhbG9uZyB0aGUgcGF0aAorICAvLy8gdG8gdGhlIHZmdGFibGUgYXJlIGluY2x1ZGVkIGluIHRoZSBuYW1lLiAgSXQncyB1cCB0byB0aGUgY2FsbGVyIHRvIHBpY2sKKyAgLy8vIHRoZW0gY29ycmVjdGx5LgorICB2aXJ0dWFsIHZvaWQgbWFuZ2xlQ1hYVkZUYWJsZShjb25zdCBDWFhSZWNvcmREZWNsICpEZXJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBDWFhSZWNvcmREZWNsICo+IEJhc2VQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT3V0KSA9IDA7CisKKyAgLy8vIFxicmllZiBNYW5nbGUgdmJ0YWJsZSBzeW1ib2xzLiAgT25seSBhIHN1YnNldCBvZiB0aGUgYmFzZXMgYWxvbmcgdGhlIHBhdGgKKyAgLy8vIHRvIHRoZSB2YnRhYmxlIGFyZSBpbmNsdWRlZCBpbiB0aGUgbmFtZS4gIEl0J3MgdXAgdG8gdGhlIGNhbGxlciB0byBwaWNrCisgIC8vLyB0aGVtIGNvcnJlY3RseS4KKyAgdmlydHVhbCB2b2lkIG1hbmdsZUNYWFZCVGFibGUoY29uc3QgQ1hYUmVjb3JkRGVjbCAqRGVyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqPiBCYXNlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk91dCkgPSAwOworCisgIHZpcnR1YWwgdm9pZCBtYW5nbGVUaHJlYWRTYWZlU3RhdGljR3VhcmRWYXJpYWJsZShjb25zdCBWYXJEZWNsICpWRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEd1YXJkTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk91dCkgPSAwOworCisgIHZpcnR1YWwgdm9pZCBtYW5nbGVWaXJ0dWFsTWVtUHRyVGh1bmsoY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0aG9kVkZUYWJsZUxvY2F0aW9uICZNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT3V0KSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIG1hbmdsZUNYWFZpcnR1YWxEaXNwbGFjZW1lbnRNYXAoY29uc3QgQ1hYUmVjb3JkRGVjbCAqU3JjUkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkRzdFJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT3V0KSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIG1hbmdsZUNYWFRocm93SW5mbyhRdWFsVHlwZSBULCBib29sIElzQ29uc3QsIGJvb2wgSXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzVW5hbGlnbmVkLCB1aW50MzJfdCBOdW1FbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPdXQpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgbWFuZ2xlQ1hYQ2F0Y2hhYmxlVHlwZUFycmF5KFF1YWxUeXBlIFQsIHVpbnQzMl90IE51bUVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk91dCkgPSAwOworCisgIHZpcnR1YWwgdm9pZCBtYW5nbGVDWFhDYXRjaGFibGVUeXBlKFF1YWxUeXBlIFQsIGNvbnN0IENYWENvbnN0cnVjdG9yRGVjbCAqQ0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWEN0b3JUeXBlIENULCB1aW50MzJfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBOVk9mZnNldCwgaW50MzJfdCBWQlB0ck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVkJJbmRleCwgcmF3X29zdHJlYW0gJk91dCkgPSAwOworCisgIHZpcnR1YWwgdm9pZCBtYW5nbGVDWFhSVFRJQmFzZUNsYXNzRGVzY3JpcHRvcigKKyAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkRlcml2ZWQsIHVpbnQzMl90IE5WT2Zmc2V0LCBpbnQzMl90IFZCUHRyT2Zmc2V0LAorICAgICAgdWludDMyX3QgVkJUYWJsZU9mZnNldCwgdWludDMyX3QgRmxhZ3MsIHJhd19vc3RyZWFtICZPdXQpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgbWFuZ2xlQ1hYUlRUSUJhc2VDbGFzc0FycmF5KGNvbnN0IENYWFJlY29yZERlY2wgKkRlcml2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk91dCkgPSAwOworICB2aXJ0dWFsIHZvaWQKKyAgbWFuZ2xlQ1hYUlRUSUNsYXNzSGllcmFyY2h5RGVzY3JpcHRvcihjb25zdCBDWFhSZWNvcmREZWNsICpEZXJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPdXQpID0gMDsKKworICB2aXJ0dWFsIHZvaWQKKyAgbWFuZ2xlQ1hYUlRUSUNvbXBsZXRlT2JqZWN0TG9jYXRvcihjb25zdCBDWFhSZWNvcmREZWNsICpEZXJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IENYWFJlY29yZERlY2wgKj4gQmFzZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk91dCkgPSAwOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWFuZ2xlQ29udGV4dCAqQykgeworICAgIHJldHVybiBDLT5nZXRLaW5kKCkgPT0gTUtfTWljcm9zb2Z0OworICB9CisKKyAgc3RhdGljIE1pY3Jvc29mdE1hbmdsZUNvbnRleHQgKmNyZWF0ZShBU1RDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lICZEaWFncyk7Cit9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9NYW5nbGVOdW1iZXJpbmdDb250ZXh0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvTWFuZ2xlTnVtYmVyaW5nQ29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OTIyMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvTWFuZ2xlTnVtYmVyaW5nQ29udGV4dC5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vPT09IE1hbmdsZU51bWJlcmluZ0NvbnRleHQuaCAtIENvbnRleHQgZm9yIG1hbmdsaW5nIG51bWJlcnMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBMYW1iZGFCbG9ja01hbmdsZUNvbnRleHQgaW50ZXJmYWNlLCB3aGljaCBrZWVwcyB0cmFjaworLy8gIG9mIHRoZSBJdGFuaXVtIEMrKyBBQkkgbWFuZ2xpbmcgbnVtYmVycyBmb3IgbGFtYmRhIGV4cHJlc3Npb25zIGFuZCBibG9jaworLy8gIGxpdGVyYWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX01BTkdMRU5VTUJFUklOR0NPTlRFWFRfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9NQU5HTEVOVU1CRVJJTkdDT05URVhUX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQmxvY2tEZWNsOworY2xhc3MgQ1hYTWV0aG9kRGVjbDsKK2NsYXNzIElkZW50aWZpZXJJbmZvOworY2xhc3MgVGFnRGVjbDsKK2NsYXNzIFR5cGU7CitjbGFzcyBWYXJEZWNsOworCisvLy8gXGJyaWVmIEtlZXBzIHRyYWNrIG9mIHRoZSBtYW5nbGVkIG5hbWVzIG9mIGxhbWJkYSBleHByZXNzaW9ucyBhbmQgYmxvY2sKKy8vLyBsaXRlcmFscyB3aXRoaW4gYSBwYXJ0aWN1bGFyIGNvbnRleHQuCitjbGFzcyBNYW5nbGVOdW1iZXJpbmdDb250ZXh0IHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+TWFuZ2xlTnVtYmVyaW5nQ29udGV4dCgpIHt9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbWFuZ2xpbmcgbnVtYmVyIG9mIGEgbmV3IGxhbWJkYSBleHByZXNzaW9uIHdpdGggdGhlCisgIC8vLyBnaXZlbiBjYWxsIG9wZXJhdG9yIHdpdGhpbiB0aGlzIGNvbnRleHQuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TWFuZ2xpbmdOdW1iZXIoY29uc3QgQ1hYTWV0aG9kRGVjbCAqQ2FsbE9wZXJhdG9yKSA9IDA7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbWFuZ2xpbmcgbnVtYmVyIG9mIGEgbmV3IGJsb2NrIGxpdGVyYWwgd2l0aGluIHRoaXMKKyAgLy8vIGNvbnRleHQuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TWFuZ2xpbmdOdW1iZXIoY29uc3QgQmxvY2tEZWNsICpCRCkgPSAwOworCisgIC8vLyBTdGF0aWMgbG9jYWxzIGFyZSBudW1iZXJlZCBieSBzb3VyY2Ugb3JkZXIuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0U3RhdGljTG9jYWxOdW1iZXIoY29uc3QgVmFyRGVjbCAqVkQpID0gMDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtYW5nbGluZyBudW1iZXIgb2YgYSBzdGF0aWMgbG9jYWwgdmFyaWFibGUgd2l0aGluCisgIC8vLyB0aGlzIGNvbnRleHQuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TWFuZ2xpbmdOdW1iZXIoY29uc3QgVmFyRGVjbCAqVkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTVNMb2NhbE1hbmdsaW5nTnVtYmVyKSA9IDA7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbWFuZ2xpbmcgbnVtYmVyIG9mIGEgc3RhdGljIGxvY2FsIHZhcmlhYmxlIHdpdGhpbgorICAvLy8gdGhpcyBjb250ZXh0LgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldE1hbmdsaW5nTnVtYmVyKGNvbnN0IFRhZ0RlY2wgKlRELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1TTG9jYWxNYW5nbGluZ051bWJlcikgPSAwOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9OU0FQSS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL05TQVBJLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1NzExNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9OU0FQSS5oCkBAIC0wLDAgKzEsMjYyIEBACisvLz09PS0tLSBOU0FQSS5oIC0gTlNGb3VuZGF0aW9uIEFQSXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX05TQVBJX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfTlNBUElfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvSWRlbnRpZmllclRhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorCituYW1lc3BhY2UgY2xhbmcgeworICBjbGFzcyBBU1RDb250ZXh0OworICBjbGFzcyBPYmpDSW50ZXJmYWNlRGVjbDsKKyAgY2xhc3MgUXVhbFR5cGU7CisgIGNsYXNzIEV4cHI7CisKKy8vIFxicmllZiBQcm92aWRlcyBpbmZvIGFuZCBjYWNoZXMgaWRlbnRpZmllcnMvc2VsZWN0b3JzIGZvciBOU0ZvdW5kYXRpb24gQVBJLgorY2xhc3MgTlNBUEkgeworcHVibGljOgorICBleHBsaWNpdCBOU0FQSShBU1RDb250ZXh0ICZDdHgpOworCisgIEFTVENvbnRleHQgJmdldEFTVENvbnRleHQoKSBjb25zdCB7IHJldHVybiBDdHg7IH0KKworICBlbnVtIE5TQ2xhc3NJZEtpbmRLaW5kIHsKKyAgICBDbGFzc0lkX05TT2JqZWN0LAorICAgIENsYXNzSWRfTlNTdHJpbmcsCisgICAgQ2xhc3NJZF9OU0FycmF5LAorICAgIENsYXNzSWRfTlNNdXRhYmxlQXJyYXksCisgICAgQ2xhc3NJZF9OU0RpY3Rpb25hcnksCisgICAgQ2xhc3NJZF9OU011dGFibGVEaWN0aW9uYXJ5LAorICAgIENsYXNzSWRfTlNOdW1iZXIsCisgICAgQ2xhc3NJZF9OU011dGFibGVTZXQsCisgICAgQ2xhc3NJZF9OU011dGFibGVPcmRlcmVkU2V0LAorICAgIENsYXNzSWRfTlNWYWx1ZQorICB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgTnVtQ2xhc3NJZHMgPSAxMDsKKworICBlbnVtIE5TU3RyaW5nTWV0aG9kS2luZCB7CisgICAgTlNTdHJfc3RyaW5nV2l0aFN0cmluZywKKyAgICBOU1N0cl9zdHJpbmdXaXRoVVRGOFN0cmluZywKKyAgICBOU1N0cl9zdHJpbmdXaXRoQ1N0cmluZ0VuY29kaW5nLAorICAgIE5TU3RyX3N0cmluZ1dpdGhDU3RyaW5nLAorICAgIE5TU3RyX2luaXRXaXRoU3RyaW5nLAorICAgIE5TU3RyX2luaXRXaXRoVVRGOFN0cmluZworICB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgTnVtTlNTdHJpbmdNZXRob2RzID0gNjsKKworICBJZGVudGlmaWVySW5mbyAqZ2V0TlNDbGFzc0lkKE5TQ2xhc3NJZEtpbmRLaW5kIEspIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVGhlIE9iamVjdGl2ZS1DIE5TU3RyaW5nIHNlbGVjdG9ycy4KKyAgU2VsZWN0b3IgZ2V0TlNTdHJpbmdTZWxlY3RvcihOU1N0cmluZ01ldGhvZEtpbmQgTUspIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIE5TU3RyaW5nTWV0aG9kS2luZCBpZiBccGFyYW0gU2VsIGlzIHN1Y2ggYSBzZWxlY3Rvci4KKyAgT3B0aW9uYWw8TlNTdHJpbmdNZXRob2RLaW5kPiBnZXROU1N0cmluZ01ldGhvZEtpbmQoU2VsZWN0b3IgU2VsKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXhwcmVzc2lvbiBccGFyYW0gRSBpcyBhIHJlZmVyZW5jZSBvZgorICAvLy8gIk5TVVRGOFN0cmluZ0VuY29kaW5nIiBlbnVtIGNvbnN0YW50LgorICBib29sIGlzTlNVVEY4U3RyaW5nRW5jb2RpbmdDb25zdGFudChjb25zdCBFeHByICpFKSBjb25zdCB7CisgICAgcmV0dXJuIGlzT2JqQ0VudW1lcmF0b3IoRSwgIk5TVVRGOFN0cmluZ0VuY29kaW5nIiwgTlNVVEY4U3RyaW5nRW5jb2RpbmdJZCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXhwcmVzc2lvbiBccGFyYW0gRSBpcyBhIHJlZmVyZW5jZSBvZgorICAvLy8gIk5TQVNDSUlTdHJpbmdFbmNvZGluZyIgZW51bSBjb25zdGFudC4KKyAgYm9vbCBpc05TQVNDSUlTdHJpbmdFbmNvZGluZ0NvbnN0YW50KGNvbnN0IEV4cHIgKkUpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNPYmpDRW51bWVyYXRvcihFLCAiTlNBU0NJSVN0cmluZ0VuY29kaW5nIixOU0FTQ0lJU3RyaW5nRW5jb2RpbmdJZCk7CisgIH0KKworICAvLy8gXGJyaWVmIEVudW1lcmF0ZXMgdGhlIE5TQXJyYXkvTlNNdXRhYmxlQXJyYXkgbWV0aG9kcyB1c2VkIHRvIGdlbmVyYXRlCisgIC8vLyBsaXRlcmFscyBhbmQgdG8gYXBwbHkgc29tZSBjaGVja3MuCisgIGVudW0gTlNBcnJheU1ldGhvZEtpbmQgeworICAgIE5TQXJyX2FycmF5LAorICAgIE5TQXJyX2FycmF5V2l0aEFycmF5LAorICAgIE5TQXJyX2FycmF5V2l0aE9iamVjdCwKKyAgICBOU0Fycl9hcnJheVdpdGhPYmplY3RzLAorICAgIE5TQXJyX2FycmF5V2l0aE9iamVjdHNDb3VudCwKKyAgICBOU0Fycl9pbml0V2l0aEFycmF5LAorICAgIE5TQXJyX2luaXRXaXRoT2JqZWN0cywKKyAgICBOU0Fycl9vYmplY3RBdEluZGV4LAorICAgIE5TTXV0YWJsZUFycl9yZXBsYWNlT2JqZWN0QXRJbmRleCwKKyAgICBOU011dGFibGVBcnJfYWRkT2JqZWN0LAorICAgIE5TTXV0YWJsZUFycl9pbnNlcnRPYmplY3RBdEluZGV4LAorICAgIE5TTXV0YWJsZUFycl9zZXRPYmplY3RBdEluZGV4ZWRTdWJzY3JpcHQKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE51bU5TQXJyYXlNZXRob2RzID0gMTI7CisKKyAgLy8vIFxicmllZiBUaGUgT2JqZWN0aXZlLUMgTlNBcnJheSBzZWxlY3RvcnMuCisgIFNlbGVjdG9yIGdldE5TQXJyYXlTZWxlY3RvcihOU0FycmF5TWV0aG9kS2luZCBNSykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gTlNBcnJheU1ldGhvZEtpbmQgaWYgXHAgU2VsIGlzIHN1Y2ggYSBzZWxlY3Rvci4KKyAgT3B0aW9uYWw8TlNBcnJheU1ldGhvZEtpbmQ+IGdldE5TQXJyYXlNZXRob2RLaW5kKFNlbGVjdG9yIFNlbCk7CisKKyAgLy8vIFxicmllZiBFbnVtZXJhdGVzIHRoZSBOU0RpY3Rpb25hcnkvTlNNdXRhYmxlRGljdGlvbmFyeSBtZXRob2RzIHVzZWQKKyAgLy8vIHRvIGdlbmVyYXRlIGxpdGVyYWxzIGFuZCB0byBhcHBseSBzb21lIGNoZWNrcy4KKyAgZW51bSBOU0RpY3Rpb25hcnlNZXRob2RLaW5kIHsKKyAgICBOU0RpY3RfZGljdGlvbmFyeSwKKyAgICBOU0RpY3RfZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5LAorICAgIE5TRGljdF9kaWN0aW9uYXJ5V2l0aE9iamVjdEZvcktleSwKKyAgICBOU0RpY3RfZGljdGlvbmFyeVdpdGhPYmplY3RzRm9yS2V5cywKKyAgICBOU0RpY3RfZGljdGlvbmFyeVdpdGhPYmplY3RzRm9yS2V5c0NvdW50LAorICAgIE5TRGljdF9kaWN0aW9uYXJ5V2l0aE9iamVjdHNBbmRLZXlzLAorICAgIE5TRGljdF9pbml0V2l0aERpY3Rpb25hcnksCisgICAgTlNEaWN0X2luaXRXaXRoT2JqZWN0c0FuZEtleXMsCisgICAgTlNEaWN0X2luaXRXaXRoT2JqZWN0c0ZvcktleXMsCisgICAgTlNEaWN0X29iamVjdEZvcktleSwKKyAgICBOU011dGFibGVEaWN0X3NldE9iamVjdEZvcktleSwKKyAgICBOU011dGFibGVEaWN0X3NldE9iamVjdEZvcktleWVkU3Vic2NyaXB0LAorICAgIE5TTXV0YWJsZURpY3Rfc2V0VmFsdWVGb3JLZXkKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE51bU5TRGljdGlvbmFyeU1ldGhvZHMgPSAxMzsKKyAgCisgIC8vLyBcYnJpZWYgVGhlIE9iamVjdGl2ZS1DIE5TRGljdGlvbmFyeSBzZWxlY3RvcnMuCisgIFNlbGVjdG9yIGdldE5TRGljdGlvbmFyeVNlbGVjdG9yKE5TRGljdGlvbmFyeU1ldGhvZEtpbmQgTUspIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIE5TRGljdGlvbmFyeU1ldGhvZEtpbmQgaWYgXHAgU2VsIGlzIHN1Y2ggYSBzZWxlY3Rvci4KKyAgT3B0aW9uYWw8TlNEaWN0aW9uYXJ5TWV0aG9kS2luZD4gZ2V0TlNEaWN0aW9uYXJ5TWV0aG9kS2luZChTZWxlY3RvciBTZWwpOworCisgIC8vLyBcYnJpZWYgRW51bWVyYXRlcyB0aGUgTlNNdXRhYmxlU2V0L05TT3JkZXJlZFNldCBtZXRob2RzIHVzZWQKKyAgLy8vIHRvIGFwcGx5IHNvbWUgY2hlY2tzLgorICBlbnVtIE5TU2V0TWV0aG9kS2luZCB7CisgICAgTlNNdXRhYmxlU2V0X2FkZE9iamVjdCwKKyAgICBOU09yZGVyZWRTZXRfaW5zZXJ0T2JqZWN0QXRJbmRleCwKKyAgICBOU09yZGVyZWRTZXRfc2V0T2JqZWN0QXRJbmRleCwKKyAgICBOU09yZGVyZWRTZXRfc2V0T2JqZWN0QXRJbmRleGVkU3Vic2NyaXB0LAorICAgIE5TT3JkZXJlZFNldF9yZXBsYWNlT2JqZWN0QXRJbmRleFdpdGhPYmplY3QKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE51bU5TU2V0TWV0aG9kcyA9IDU7CisKKyAgLy8vIFxicmllZiBUaGUgT2JqZWN0aXZlLUMgTlNTZXQgc2VsZWN0b3JzLgorICBTZWxlY3RvciBnZXROU1NldFNlbGVjdG9yKE5TU2V0TWV0aG9kS2luZCBNSykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gTlNTZXRNZXRob2RLaW5kIGlmIFxwIFNlbCBpcyBzdWNoIGEgc2VsZWN0b3IuCisgIE9wdGlvbmFsPE5TU2V0TWV0aG9kS2luZD4gZ2V0TlNTZXRNZXRob2RLaW5kKFNlbGVjdG9yIFNlbCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHNlbGVjdG9yIGZvciAib2JqZWN0Rm9yS2V5ZWRTdWJzY3JpcHQ6Ii4KKyAgU2VsZWN0b3IgZ2V0T2JqZWN0Rm9yS2V5ZWRTdWJzY3JpcHRTZWxlY3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3JJbml0U2VsZWN0b3IoU3RyaW5nUmVmKCJvYmplY3RGb3JLZXllZFN1YnNjcmlwdCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RGb3JLZXllZFN1YnNjcmlwdFNlbCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgc2VsZWN0b3IgZm9yICJvYmplY3RBdEluZGV4ZWRTdWJzY3JpcHQ6Ii4KKyAgU2VsZWN0b3IgZ2V0T2JqZWN0QXRJbmRleGVkU3Vic2NyaXB0U2VsZWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9ySW5pdFNlbGVjdG9yKFN0cmluZ1JlZigib2JqZWN0QXRJbmRleGVkU3Vic2NyaXB0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdEF0SW5kZXhlZFN1YnNjcmlwdFNlbCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgc2VsZWN0b3IgZm9yICJzZXRPYmplY3Q6Zm9yS2V5ZWRTdWJzY3JpcHQiLgorICBTZWxlY3RvciBnZXRTZXRPYmplY3RGb3JLZXllZFN1YnNjcmlwdFNlbGVjdG9yKCkgY29uc3QgeworICAgIFN0cmluZ1JlZiBJZHNbXSA9IHsgInNldE9iamVjdCIsICJmb3JLZXllZFN1YnNjcmlwdCIgfTsKKyAgICByZXR1cm4gZ2V0T3JJbml0U2VsZWN0b3IoSWRzLCBzZXRPYmplY3RGb3JLZXllZFN1YnNjcmlwdFNlbCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgc2VsZWN0b3IgZm9yICJzZXRPYmplY3Q6YXRJbmRleGVkU3Vic2NyaXB0Ii4KKyAgU2VsZWN0b3IgZ2V0U2V0T2JqZWN0QXRJbmRleGVkU3Vic2NyaXB0U2VsZWN0b3IoKSBjb25zdCB7CisgICAgU3RyaW5nUmVmIElkc1tdID0geyAic2V0T2JqZWN0IiwgImF0SW5kZXhlZFN1YnNjcmlwdCIgfTsKKyAgICByZXR1cm4gZ2V0T3JJbml0U2VsZWN0b3IoSWRzLCBzZXRPYmplY3RBdEluZGV4ZWRTdWJzY3JpcHRTZWwpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHNlbGVjdG9yIGZvciAiaXNFcXVhbDoiLgorICBTZWxlY3RvciBnZXRJc0VxdWFsU2VsZWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9ySW5pdFNlbGVjdG9yKFN0cmluZ1JlZigiaXNFcXVhbCIpLCBpc0VxdWFsU2VsKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRW51bWVyYXRlcyB0aGUgTlNOdW1iZXIgbWV0aG9kcyB1c2VkIHRvIGdlbmVyYXRlIGxpdGVyYWxzLgorICBlbnVtIE5TTnVtYmVyTGl0ZXJhbE1ldGhvZEtpbmQgeworICAgIE5TTnVtYmVyV2l0aENoYXIsCisgICAgTlNOdW1iZXJXaXRoVW5zaWduZWRDaGFyLAorICAgIE5TTnVtYmVyV2l0aFNob3J0LAorICAgIE5TTnVtYmVyV2l0aFVuc2lnbmVkU2hvcnQsCisgICAgTlNOdW1iZXJXaXRoSW50LAorICAgIE5TTnVtYmVyV2l0aFVuc2lnbmVkSW50LAorICAgIE5TTnVtYmVyV2l0aExvbmcsCisgICAgTlNOdW1iZXJXaXRoVW5zaWduZWRMb25nLAorICAgIE5TTnVtYmVyV2l0aExvbmdMb25nLAorICAgIE5TTnVtYmVyV2l0aFVuc2lnbmVkTG9uZ0xvbmcsCisgICAgTlNOdW1iZXJXaXRoRmxvYXQsCisgICAgTlNOdW1iZXJXaXRoRG91YmxlLAorICAgIE5TTnVtYmVyV2l0aEJvb2wsCisgICAgTlNOdW1iZXJXaXRoSW50ZWdlciwKKyAgICBOU051bWJlcldpdGhVbnNpZ25lZEludGVnZXIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE51bU5TTnVtYmVyTGl0ZXJhbE1ldGhvZHMgPSAxNTsKKworICAvLy8gXGJyaWVmIFRoZSBPYmplY3RpdmUtQyBOU051bWJlciBzZWxlY3RvcnMgdXNlZCB0byBjcmVhdGUgTlNOdW1iZXIgbGl0ZXJhbHMuCisgIC8vLyBccGFyYW0gSW5zdGFuY2UgaWYgdHJ1ZSBpdCB3aWxsIHJldHVybiB0aGUgc2VsZWN0b3IgZm9yIHRoZSBpbml0KiBtZXRob2QKKyAgLy8vIG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiB0aGUgc2VsZWN0b3IgZm9yIHRoZSBudW1iZXIqIG1ldGhvZC4KKyAgU2VsZWN0b3IgZ2V0TlNOdW1iZXJMaXRlcmFsU2VsZWN0b3IoTlNOdW1iZXJMaXRlcmFsTWV0aG9kS2luZCBNSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbnN0YW5jZSkgY29uc3Q7CisKKyAgYm9vbCBpc05TTnVtYmVyTGl0ZXJhbFNlbGVjdG9yKE5TTnVtYmVyTGl0ZXJhbE1ldGhvZEtpbmQgTUssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBTZWwpIGNvbnN0IHsKKyAgICByZXR1cm4gU2VsID09IGdldE5TTnVtYmVyTGl0ZXJhbFNlbGVjdG9yKE1LLCBmYWxzZSkgfHwKKyAgICAgICAgICAgU2VsID09IGdldE5TTnVtYmVyTGl0ZXJhbFNlbGVjdG9yKE1LLCB0cnVlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIE5TTnVtYmVyTGl0ZXJhbE1ldGhvZEtpbmQgaWYgXHAgU2VsIGlzIHN1Y2ggYSBzZWxlY3Rvci4KKyAgT3B0aW9uYWw8TlNOdW1iZXJMaXRlcmFsTWV0aG9kS2luZD4KKyAgICAgIGdldE5TTnVtYmVyTGl0ZXJhbE1ldGhvZEtpbmQoU2VsZWN0b3IgU2VsKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgTlNOdW1iZXIgZmFjdG9yeSBtZXRob2Qga2luZCBmb3IgYQorICAvLy8gbGl0ZXJhbCBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAgT3B0aW9uYWw8TlNOdW1iZXJMaXRlcmFsTWV0aG9kS2luZD4KKyAgICAgIGdldE5TTnVtYmVyRmFjdG9yeU1ldGhvZEtpbmQoUXVhbFR5cGUgVCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgXHBhcmFtIFQgaXMgYSB0eXBlZGVmIG9mICJCT09MIiBpbiBvYmplY3RpdmUtYy4KKyAgYm9vbCBpc09iakNCT09MVHlwZShRdWFsVHlwZSBUKSBjb25zdDsKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgXHBhcmFtIFQgaXMgYSB0eXBlZGVmIG9mICJOU0ludGVnZXIiIGluIG9iamVjdGl2ZS1jLgorICBib29sIGlzT2JqQ05TSW50ZWdlclR5cGUoUXVhbFR5cGUgVCkgY29uc3Q7CisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIFxwYXJhbSBUIGlzIGEgdHlwZWRlZiBvZiAiTlNVSW50ZWdlciIgaW4gb2JqZWN0aXZlLWMuCisgIGJvb2wgaXNPYmpDTlNVSW50ZWdlclR5cGUoUXVhbFR5cGUgVCkgY29uc3Q7CisgIC8vLyBcYnJpZWYgUmV0dXJucyBvbmUgb2YgTlNJbnRlZ3JhbCB0eXBlZGVmIG5hbWVzIGlmIFxwYXJhbSBUIGlzIGEgdHlwZWRlZgorICAvLy8gb2YgdGhhdCBuYW1lIGluIG9iamVjdGl2ZS1jLgorICBTdHJpbmdSZWYgR2V0TlNJbnRlZ3JhbEtpbmQoUXVhbFR5cGUgVCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIFxjIHRydWUgaWYgXHAgSWQgaXMgY3VycmVudGx5IGRlZmluZWQgYXMgYSBtYWNyby4KKyAgYm9vbCBpc01hY3JvRGVmaW5lZChTdHJpbmdSZWYgSWQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyBcYyB0cnVlIGlmIFxwIEludGVyZmFjZURlY2wgaXMgc3ViY2xhc3Mgb2YgXHAgTlNDbGFzc0tpbmQKKyAgYm9vbCBpc1N1YmNsYXNzT2ZOU0NsYXNzKE9iakNJbnRlcmZhY2VEZWNsICpJbnRlcmZhY2VEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNDbGFzc0lkS2luZEtpbmQgTlNDbGFzc0tpbmQpIGNvbnN0OworCitwcml2YXRlOgorICBib29sIGlzT2JqQ1R5cGVkZWYoUXVhbFR5cGUgVCwgU3RyaW5nUmVmIG5hbWUsIElkZW50aWZpZXJJbmZvIComSUkpIGNvbnN0OworICBib29sIGlzT2JqQ0VudW1lcmF0b3IoY29uc3QgRXhwciAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBuYW1lLCBJZGVudGlmaWVySW5mbyAqJklJKSBjb25zdDsKKyAgU2VsZWN0b3IgZ2V0T3JJbml0U2VsZWN0b3IoQXJyYXlSZWY8U3RyaW5nUmVmPiBJZHMsIFNlbGVjdG9yICZTZWwpIGNvbnN0OworCisgIEFTVENvbnRleHQgJkN0eDsKKworICBtdXRhYmxlIElkZW50aWZpZXJJbmZvICpDbGFzc0lkc1tOdW1DbGFzc0lkc107CisKKyAgbXV0YWJsZSBTZWxlY3RvciBOU1N0cmluZ1NlbGVjdG9yc1tOdW1OU1N0cmluZ01ldGhvZHNdOworCisgIC8vLyBcYnJpZWYgVGhlIHNlbGVjdG9ycyBmb3IgT2JqZWN0aXZlLUMgTlNBcnJheSBtZXRob2RzLgorICBtdXRhYmxlIFNlbGVjdG9yIE5TQXJyYXlTZWxlY3RvcnNbTnVtTlNBcnJheU1ldGhvZHNdOworCisgIC8vLyBcYnJpZWYgVGhlIHNlbGVjdG9ycyBmb3IgT2JqZWN0aXZlLUMgTlNEaWN0aW9uYXJ5IG1ldGhvZHMuCisgIG11dGFibGUgU2VsZWN0b3IgTlNEaWN0aW9uYXJ5U2VsZWN0b3JzW051bU5TRGljdGlvbmFyeU1ldGhvZHNdOworCisgIC8vLyBcYnJpZWYgVGhlIHNlbGVjdG9ycyBmb3IgT2JqZWN0aXZlLUMgTlNTZXQgbWV0aG9kcy4KKyAgbXV0YWJsZSBTZWxlY3RvciBOU1NldFNlbGVjdG9yc1tOdW1OU1NldE1ldGhvZHNdOworCisgIC8vLyBcYnJpZWYgVGhlIE9iamVjdGl2ZS1DIE5TTnVtYmVyIHNlbGVjdG9ycyB1c2VkIHRvIGNyZWF0ZSBOU051bWJlciBsaXRlcmFscy4KKyAgbXV0YWJsZSBTZWxlY3RvciBOU051bWJlckNsYXNzU2VsZWN0b3JzW051bU5TTnVtYmVyTGl0ZXJhbE1ldGhvZHNdOworICBtdXRhYmxlIFNlbGVjdG9yIE5TTnVtYmVySW5zdGFuY2VTZWxlY3RvcnNbTnVtTlNOdW1iZXJMaXRlcmFsTWV0aG9kc107CisKKyAgbXV0YWJsZSBTZWxlY3RvciBvYmplY3RGb3JLZXllZFN1YnNjcmlwdFNlbCwgb2JqZWN0QXRJbmRleGVkU3Vic2NyaXB0U2VsLAorICAgICAgICAgICAgICAgICAgIHNldE9iamVjdEZvcktleWVkU3Vic2NyaXB0U2VsLHNldE9iamVjdEF0SW5kZXhlZFN1YnNjcmlwdFNlbCwKKyAgICAgICAgICAgICAgICAgICBpc0VxdWFsU2VsOworCisgIG11dGFibGUgSWRlbnRpZmllckluZm8gKkJPT0xJZCwgKk5TSW50ZWdlcklkLCAqTlNVSW50ZWdlcklkOworICBtdXRhYmxlIElkZW50aWZpZXJJbmZvICpOU0FTQ0lJU3RyaW5nRW5jb2RpbmdJZCwgKk5TVVRGOFN0cmluZ0VuY29kaW5nSWQ7Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9OU0FQSV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvTmVzdGVkTmFtZVNwZWNpZmllci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL05lc3RlZE5hbWVTcGVjaWZpZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmNiNDVjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL05lc3RlZE5hbWVTcGVjaWZpZXIuaApAQCAtMCwwICsxLDUyMCBAQAorLy89PT0tIE5lc3RlZE5hbWVTcGVjaWZpZXIuaCAtIEMrKyBuZXN0ZWQgbmFtZSBzcGVjaWZpZXJzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIE5lc3RlZE5hbWVTcGVjaWZpZXIgY2xhc3MsIHdoaWNoIHJlcHJlc2VudHMKKy8vICBhIEMrKyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9ORVNURUROQU1FU1BFQ0lGSUVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfTkVTVEVETkFNRVNQRUNJRklFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQVNUQ29udGV4dDsKK2NsYXNzIENYWFJlY29yZERlY2w7CitjbGFzcyBJZGVudGlmaWVySW5mbzsKK2NsYXNzIExhbmdPcHRpb25zOworY2xhc3MgTmFtZXNwYWNlQWxpYXNEZWNsOworY2xhc3MgTmFtZXNwYWNlRGVjbDsKK3N0cnVjdCBQcmludGluZ1BvbGljeTsKK2NsYXNzIFR5cGU7CitjbGFzcyBUeXBlTG9jOworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBDKysgbmVzdGVkIG5hbWUgc3BlY2lmaWVyLCBzdWNoIGFzCisvLy8gIlw6OnN0ZDo6dmVjdG9yPGludD46OiIuCisvLy8KKy8vLyBDKysgbmVzdGVkIG5hbWUgc3BlY2lmaWVycyBhcmUgdGhlIHByZWZpeGVzIHRvIHF1YWxpZmllZAorLy8vIG5hbWVzLiBGb3IgZXhhbXBsZSwgImZvbzo6IiBpbiAiZm9vOjp4IiBpcyBhIG5lc3RlZCBuYW1lCisvLy8gc3BlY2lmaWVyLiBOZXN0ZWQgbmFtZSBzcGVjaWZpZXJzIGFyZSBtYWRlIHVwIG9mIGEgc2VxdWVuY2Ugb2YKKy8vLyBzcGVjaWZpZXJzLCBlYWNoIG9mIHdoaWNoIGNhbiBiZSBhIG5hbWVzcGFjZSwgdHlwZSwgaWRlbnRpZmllcgorLy8vIChmb3IgZGVwZW5kZW50IG5hbWVzKSwgZGVjbHR5cGUgc3BlY2lmaWVyLCBvciB0aGUgZ2xvYmFsIHNwZWNpZmllciAoJzo6JykuCisvLy8gVGhlIGxhc3QgdHdvIHNwZWNpZmllcnMgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiBhIAorLy8vIG5lc3RlZC1uYW1lc3BhY2Utc3BlY2lmaWVyLgorY2xhc3MgTmVzdGVkTmFtZVNwZWNpZmllciA6IHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CisgIC8vLyBcYnJpZWYgRW51bWVyYXRpb24gZGVzY3JpYmluZworICBlbnVtIFN0b3JlZFNwZWNpZmllcktpbmQgeworICAgIFN0b3JlZElkZW50aWZpZXIgPSAwLAorICAgIFN0b3JlZERlY2wgPSAxLAorICAgIFN0b3JlZFR5cGVTcGVjID0gMiwKKyAgICBTdG9yZWRUeXBlU3BlY1dpdGhUZW1wbGF0ZSA9IDMKKyAgfTsKKworICAvLy8gXGJyaWVmIFRoZSBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIgdGhhdCBwcmVjZWRlcyB0aGlzIG5lc3RlZCBuYW1lCisgIC8vLyBzcGVjaWZpZXIuCisgIC8vLworICAvLy8gVGhlIHBvaW50ZXIgaXMgdGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciB0aGF0IHByZWNlZGVzIHRoaXMKKyAgLy8vIG9uZS4gVGhlIGludGVnZXIgc3RvcmVzIG9uZSBvZiB0aGUgZmlyc3QgZm91ciB2YWx1ZXMgb2YgdHlwZQorICAvLy8gU3BlY2lmaWVyS2luZC4KKyAgbGx2bTo6UG9pbnRlckludFBhaXI8TmVzdGVkTmFtZVNwZWNpZmllciAqLCAyLCBTdG9yZWRTcGVjaWZpZXJLaW5kPiBQcmVmaXg7CisKKyAgLy8vIFxicmllZiBUaGUgbGFzdCBjb21wb25lbnQgaW4gdGhlIG5lc3RlZCBuYW1lIHNwZWNpZmllciwgd2hpY2gKKyAgLy8vIGNhbiBiZSBhbiBpZGVudGlmaWVyLCBhIGRlY2xhcmF0aW9uLCBvciBhIHR5cGUuCisgIC8vLworICAvLy8gV2hlbiB0aGUgcG9pbnRlciBpcyBOVUxMLCB0aGlzIHNwZWNpZmllciByZXByZXNlbnRzIHRoZSBnbG9iYWwKKyAgLy8vIHNwZWNpZmllciAnOjonLiBPdGhlcndpc2UsIHRoZSBwb2ludGVyIGlzIG9uZSBvZgorICAvLy8gSWRlbnRpZmllckluZm8qLCBOYW1lc3BhY2UqLCBvciBUeXBlKiwgZGVwZW5kaW5nIG9uIHRoZSBraW5kIG9mCisgIC8vLyBzcGVjaWZpZXIgYXMgZW5jb2RlZCB3aXRoaW4gdGhlIHByZWZpeC4KKyAgdm9pZCogU3BlY2lmaWVyID0gbnVsbHB0cjsKKworcHVibGljOgorICAvLy8gXGJyaWVmIFRoZSBraW5kIG9mIHNwZWNpZmllciB0aGF0IGNvbXBsZXRlcyB0aGlzIG5lc3RlZCBuYW1lCisgIC8vLyBzcGVjaWZpZXIuCisgIGVudW0gU3BlY2lmaWVyS2luZCB7CisgICAgLy8vIFxicmllZiBBbiBpZGVudGlmaWVyLCBzdG9yZWQgYXMgYW4gSWRlbnRpZmllckluZm8qLgorICAgIElkZW50aWZpZXIsCisKKyAgICAvLy8gXGJyaWVmIEEgbmFtZXNwYWNlLCBzdG9yZWQgYXMgYSBOYW1lc3BhY2VEZWNsKi4KKyAgICBOYW1lc3BhY2UsCisKKyAgICAvLy8gXGJyaWVmIEEgbmFtZXNwYWNlIGFsaWFzLCBzdG9yZWQgYXMgYSBOYW1lc3BhY2VBbGlhc0RlY2wqLgorICAgIE5hbWVzcGFjZUFsaWFzLAorCisgICAgLy8vIFxicmllZiBBIHR5cGUsIHN0b3JlZCBhcyBhIFR5cGUqLgorICAgIFR5cGVTcGVjLAorCisgICAgLy8vIFxicmllZiBBIHR5cGUgdGhhdCB3YXMgcHJlY2VkZWQgYnkgdGhlICd0ZW1wbGF0ZScga2V5d29yZCwKKyAgICAvLy8gc3RvcmVkIGFzIGEgVHlwZSouCisgICAgVHlwZVNwZWNXaXRoVGVtcGxhdGUsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBnbG9iYWwgc3BlY2lmaWVyICc6OicuIFRoZXJlIGlzIG5vIHN0b3JlZCB2YWx1ZS4KKyAgICBHbG9iYWwsCisKKyAgICAvLy8gXGJyaWVmIE1pY3Jvc29mdCdzICdfX3N1cGVyJyBzcGVjaWZpZXIsIHN0b3JlZCBhcyBhIENYWFJlY29yZERlY2wqIG9mCisgICAgLy8vIHRoZSBjbGFzcyBpdCBhcHBlYXJlZCBpbi4KKyAgICBTdXBlcgorICB9OworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIEJ1aWxkcyB0aGUgZ2xvYmFsIHNwZWNpZmllci4KKyAgTmVzdGVkTmFtZVNwZWNpZmllcigpIDogUHJlZml4KG51bGxwdHIsIFN0b3JlZElkZW50aWZpZXIpIHt9CisKKyAgLy8vIFxicmllZiBDb3B5IGNvbnN0cnVjdG9yIHVzZWQgaW50ZXJuYWxseSB0byBjbG9uZSBuZXN0ZWQgbmFtZQorICAvLy8gc3BlY2lmaWVycy4KKyAgTmVzdGVkTmFtZVNwZWNpZmllcihjb25zdCBOZXN0ZWROYW1lU3BlY2lmaWVyICZPdGhlcikgPSBkZWZhdWx0OworCisgIC8vLyBcYnJpZWYgRWl0aGVyIGZpbmQgb3IgaW5zZXJ0IHRoZSBnaXZlbiBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIKKyAgLy8vIG1vY2t1cCBpbiB0aGUgZ2l2ZW4gY29udGV4dC4KKyAgc3RhdGljIE5lc3RlZE5hbWVTcGVjaWZpZXIgKkZpbmRPckluc2VydChjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5lc3RlZE5hbWVTcGVjaWZpZXIgJk1vY2t1cCk7CisKK3B1YmxpYzoKKyAgTmVzdGVkTmFtZVNwZWNpZmllciAmb3BlcmF0b3I9KGNvbnN0IE5lc3RlZE5hbWVTcGVjaWZpZXIgJikgPSBkZWxldGU7CisKKyAgLy8vIFxicmllZiBCdWlsZHMgYSBzcGVjaWZpZXIgY29tYmluaW5nIGEgcHJlZml4IGFuZCBhbiBpZGVudGlmaWVyLgorICAvLy8KKyAgLy8vIFRoZSBwcmVmaXggbXVzdCBiZSBkZXBlbmRlbnQsIHNpbmNlIG5lc3RlZCBuYW1lIHNwZWNpZmllcnMKKyAgLy8vIHJlZmVyZW5jaW5nIGFuIGlkZW50aWZpZXIgYXJlIG9ubHkgcGVybWl0dGVkIHdoZW4gdGhlIGlkZW50aWZpZXIKKyAgLy8vIGNhbm5vdCBiZSByZXNvbHZlZC4KKyAgc3RhdGljIE5lc3RlZE5hbWVTcGVjaWZpZXIgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKlByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSUkpOworCisgIC8vLyBcYnJpZWYgQnVpbGRzIGEgbmVzdGVkIG5hbWUgc3BlY2lmaWVyIHRoYXQgbmFtZXMgYSBuYW1lc3BhY2UuCisgIHN0YXRpYyBOZXN0ZWROYW1lU3BlY2lmaWVyICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyICpQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZXNwYWNlRGVjbCAqTlMpOworCisgIC8vLyBcYnJpZWYgQnVpbGRzIGEgbmVzdGVkIG5hbWUgc3BlY2lmaWVyIHRoYXQgbmFtZXMgYSBuYW1lc3BhY2UgYWxpYXMuCisgIHN0YXRpYyBOZXN0ZWROYW1lU3BlY2lmaWVyICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyICpQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlQWxpYXNEZWNsICpBbGlhcyk7CisKKyAgLy8vIFxicmllZiBCdWlsZHMgYSBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIgdGhhdCBuYW1lcyBhIHR5cGUuCisgIHN0YXRpYyBOZXN0ZWROYW1lU3BlY2lmaWVyICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyICpQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBUZW1wbGF0ZSwgY29uc3QgVHlwZSAqVCk7CisKKyAgLy8vIFxicmllZiBCdWlsZHMgYSBzcGVjaWZpZXIgdGhhdCBjb25zaXN0cyBvZiBqdXN0IGFuIGlkZW50aWZpZXIuCisgIC8vLworICAvLy8gVGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciBpcyBhc3N1bWVkIHRvIGJlIGRlcGVuZGVudCwgYnV0IGhhcyBubworICAvLy8gcHJlZml4IGJlY2F1c2UgdGhlIHByZWZpeCBpcyBpbXBsaWVkIGJ5IHNvbWV0aGluZyBvdXRzaWRlIG9mIHRoZQorICAvLy8gbmVzdGVkIG5hbWUgc3BlY2lmaWVyLCBlLmcuLCBpbiAieC0+QmFzZTo6ZiIsIHRoZSAieCIgaGFzIGEgZGVwZW5kZW50CisgIC8vLyB0eXBlLgorICBzdGF0aWMgTmVzdGVkTmFtZVNwZWNpZmllciAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklJKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG5lc3RlZCBuYW1lIHNwZWNpZmllciByZXByZXNlbnRpbmcgdGhlIGdsb2JhbAorICAvLy8gc2NvcGUuCisgIHN0YXRpYyBOZXN0ZWROYW1lU3BlY2lmaWVyICpHbG9iYWxTcGVjaWZpZXIoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIgcmVwcmVzZW50aW5nIHRoZSBfX3N1cGVyIHNjb3BlCisgIC8vLyBmb3IgdGhlIGdpdmVuIENYWFJlY29yZERlY2wuCisgIHN0YXRpYyBOZXN0ZWROYW1lU3BlY2lmaWVyICpTdXBlclNwZWNpZmllcihjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYUmVjb3JkRGVjbCAqUkQpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBwcmVmaXggb2YgdGhpcyBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIuCisgIC8vLworICAvLy8gVGhlIHByZWZpeCBjb250YWlucyBhbGwgb2YgdGhlIHBhcnRzIG9mIHRoZSBuZXN0ZWQgbmFtZQorICAvLy8gc3BlY2lmaWVyIHRoYXQgcHJlY2VkIHRoaXMgY3VycmVudCBzcGVjaWZpZXIuIEZvciBleGFtcGxlLCBmb3IgYQorICAvLy8gbmVzdGVkIG5hbWUgc3BlY2lmaWVyIHRoYXQgcmVwcmVzZW50cyAiZm9vOjpiYXI6OiIsIHRoZSBjdXJyZW50CisgIC8vLyBzcGVjaWZpZXIgd2lsbCBjb250YWluICJiYXI6OiIgYW5kIHRoZSBwcmVmaXggd2lsbCBjb250YWluCisgIC8vLyAiZm9vOjoiLgorICBOZXN0ZWROYW1lU3BlY2lmaWVyICpnZXRQcmVmaXgoKSBjb25zdCB7IHJldHVybiBQcmVmaXguZ2V0UG9pbnRlcigpOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hhdCBraW5kIG9mIG5lc3RlZCBuYW1lIHNwZWNpZmllciBpcyBzdG9yZWQuCisgIFNwZWNpZmllcktpbmQgZ2V0S2luZCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGlkZW50aWZpZXIgc3RvcmVkIGluIHRoaXMgbmVzdGVkIG5hbWUKKyAgLy8vIHNwZWNpZmllci4KKyAgSWRlbnRpZmllckluZm8gKmdldEFzSWRlbnRpZmllcigpIGNvbnN0IHsKKyAgICBpZiAoUHJlZml4LmdldEludCgpID09IFN0b3JlZElkZW50aWZpZXIpCisgICAgICByZXR1cm4gKElkZW50aWZpZXJJbmZvICopU3BlY2lmaWVyOworCisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuYW1lc3BhY2Ugc3RvcmVkIGluIHRoaXMgbmVzdGVkIG5hbWUKKyAgLy8vIHNwZWNpZmllci4KKyAgTmFtZXNwYWNlRGVjbCAqZ2V0QXNOYW1lc3BhY2UoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuYW1lc3BhY2UgYWxpYXMgc3RvcmVkIGluIHRoaXMgbmVzdGVkIG5hbWUKKyAgLy8vIHNwZWNpZmllci4KKyAgTmFtZXNwYWNlQWxpYXNEZWNsICpnZXRBc05hbWVzcGFjZUFsaWFzKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgcmVjb3JkIGRlY2xhcmF0aW9uIHN0b3JlZCBpbiB0aGlzIG5lc3RlZCBuYW1lCisgIC8vLyBzcGVjaWZpZXIuCisgIENYWFJlY29yZERlY2wgKmdldEFzUmVjb3JkRGVjbCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHR5cGUgc3RvcmVkIGluIHRoaXMgbmVzdGVkIG5hbWUgc3BlY2lmaWVyLgorICBjb25zdCBUeXBlICpnZXRBc1R5cGUoKSBjb25zdCB7CisgICAgaWYgKFByZWZpeC5nZXRJbnQoKSA9PSBTdG9yZWRUeXBlU3BlYyB8fAorICAgICAgICBQcmVmaXguZ2V0SW50KCkgPT0gU3RvcmVkVHlwZVNwZWNXaXRoVGVtcGxhdGUpCisgICAgICByZXR1cm4gKGNvbnN0IFR5cGUgKilTcGVjaWZpZXI7CisKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIG5lc3RlZCBuYW1lIHNwZWNpZmllciByZWZlcnMgdG8gYSBkZXBlbmRlbnQKKyAgLy8vIHR5cGUgb3Igbm90LgorICBib29sIGlzRGVwZW5kZW50KCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgbmVzdGVkIG5hbWUgc3BlY2lmaWVyIGludm9sdmVzIGEgdGVtcGxhdGUKKyAgLy8vIHBhcmFtZXRlci4KKyAgYm9vbCBpc0luc3RhbnRpYXRpb25EZXBlbmRlbnQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgY29udGFpbnMgYW4gdW5leHBhbmRlZAorICAvLy8gcGFyYW1ldGVyIHBhY2sgKGZvciBDKysxMSB2YXJpYWRpYyB0ZW1wbGF0ZXMpLgorICBib29sIGNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFByaW50IHRoaXMgbmVzdGVkIG5hbWUgc3BlY2lmaWVyIHRvIHRoZSBnaXZlbiBvdXRwdXQKKyAgLy8vIHN0cmVhbS4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0OworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3QgeworICAgIElELkFkZFBvaW50ZXIoUHJlZml4LmdldE9wYXF1ZVZhbHVlKCkpOworICAgIElELkFkZFBvaW50ZXIoU3BlY2lmaWVyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRHVtcCB0aGUgbmVzdGVkIG5hbWUgc3BlY2lmaWVyIHRvIHN0YW5kYXJkIG91dHB1dCB0byBhaWQKKyAgLy8vIGluIGRlYnVnZ2luZy4KKyAgdm9pZCBkdW1wKGNvbnN0IExhbmdPcHRpb25zICZMTykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworLy8vIFxicmllZiBBIEMrKyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgYXVnbWVudGVkIHdpdGggc291cmNlIGxvY2F0aW9uCisvLy8gaW5mb3JtYXRpb24uCitjbGFzcyBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIHsKKyAgTmVzdGVkTmFtZVNwZWNpZmllciAqUXVhbGlmaWVyID0gbnVsbHB0cjsKKyAgdm9pZCAqRGF0YSA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHRoZSBkYXRhIGxlbmd0aCBmb3IgdGhlIGxhc3QgY29tcG9uZW50IGluIHRoZQorICAvLy8gZ2l2ZW4gbmVzdGVkLW5hbWUtc3BlY2lmaWVyLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0TG9jYWxEYXRhTGVuZ3RoKE5lc3RlZE5hbWVTcGVjaWZpZXIgKlF1YWxpZmllcik7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHRoZSBkYXRhIGxlbmd0aCBmb3IgdGhlIGVudGlyZQorICAvLy8gbmVzdGVkLW5hbWUtc3BlY2lmaWVyLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0RGF0YUxlbmd0aChOZXN0ZWROYW1lU3BlY2lmaWVyICpRdWFsaWZpZXIpOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIGVtcHR5IG5lc3RlZC1uYW1lLXNwZWNpZmllci4KKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYygpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIG5lc3RlZC1uYW1lLXNwZWNpZmllciB3aXRoIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorICAvLy8gZnJvbQorICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKE5lc3RlZE5hbWVTcGVjaWZpZXIgKlF1YWxpZmllciwgdm9pZCAqRGF0YSkKKyAgICAgIDogUXVhbGlmaWVyKFF1YWxpZmllciksIERhdGEoRGF0YSkge30KKworICAvLy8gXGJyaWVmIEV2YWx1dGVzIHRydWUgd2hlbiB0aGlzIG5lc3RlZC1uYW1lLXNwZWNpZmllciBsb2NhdGlvbiBpcworICAvLy8gbm9uLWVtcHR5LgorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gUXVhbGlmaWVyOyB9CisKKyAgLy8vIFxicmllZiBFdmFsdXRlcyB0cnVlIHdoZW4gdGhpcyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgbG9jYXRpb24gaXMKKyAgLy8vIGVtcHR5LgorICBib29sIGhhc1F1YWxpZmllcigpIGNvbnN0IHsgcmV0dXJuIFF1YWxpZmllcjsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciB0byB3aGljaCB0aGlzIGluc3RhbmNlCisgIC8vLyByZWZlcnMuCisgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKmdldE5lc3RlZE5hbWVTcGVjaWZpZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFF1YWxpZmllcjsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG9wYXF1ZSBwb2ludGVyIHRoYXQgcmVmZXJzIHRvIHNvdXJjZS1sb2NhdGlvbiBkYXRhLgorICB2b2lkICpnZXRPcGFxdWVEYXRhKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHNvdXJjZSByYW5nZSBjb3ZlcmluZyB0aGUgZW50aXJldHkgb2YgdGhpcworICAvLy8gbmVzdGVkLW5hbWUtc3BlY2lmaWVyLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlLCBpZiB0aGlzIGluc3RhbmNlIHJlZmVycyB0byBhIG5lc3RlZC1uYW1lLXNwZWNpZmllcgorICAvLy8gXGMgXDo6c3RkOjp2ZWN0b3I8aW50Pjo6LCB0aGUgcmV0dXJuZWQgc291cmNlIHJhbmdlIHdvdWxkIGNvdmVyCisgIC8vLyBmcm9tIHRoZSBpbml0aWFsICc6OicgdG8gdGhlIGxhc3QgJzo6Jy4KKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHNvdXJjZSByYW5nZSBjb3ZlcmluZyBqdXN0IHRoZSBsYXN0IHBhcnQgb2YKKyAgLy8vIHRoaXMgbmVzdGVkLW5hbWUtc3BlY2lmaWVyLCBub3QgaW5jbHVkaW5nIHRoZSBwcmVmaXguCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsIGlmIHRoaXMgaW5zdGFuY2UgcmVmZXJzIHRvIGEgbmVzdGVkLW5hbWUtc3BlY2lmaWVyCisgIC8vLyBcYyBcOjpzdGQ6OnZlY3RvcjxpbnQ+OjosIHRoZSByZXR1cm5lZCBzb3VyY2UgcmFuZ2Ugd291bGQgY292ZXIKKyAgLy8vIGZyb20gInZlY3RvciIgdG8gdGhlIGxhc3QgJzo6Jy4KKyAgU291cmNlUmFuZ2UgZ2V0TG9jYWxTb3VyY2VSYW5nZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhpcworICAvLy8gbmVzdGVkLW5hbWUtc3BlY2lmaWVyLgorICBTb3VyY2VMb2NhdGlvbiBnZXRCZWdpbkxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U291cmNlUmFuZ2UoKS5nZXRCZWdpbigpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGlzCisgIC8vLyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIuCisgIFNvdXJjZUxvY2F0aW9uIGdldEVuZExvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U291cmNlUmFuZ2UoKS5nZXRFbmQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhpcworICAvLy8gY29tcG9uZW50IG9mIHRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIuCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2FsQmVnaW5Mb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExvY2FsU291cmNlUmFuZ2UoKS5nZXRCZWdpbigpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGlzIGNvbXBvbmVudCBvZiB0aGUKKyAgLy8vIG5lc3RlZC1uYW1lLXNwZWNpZmllci4KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jYWxFbmRMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExvY2FsU291cmNlUmFuZ2UoKS5nZXRFbmQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBwcmVmaXggb2YgdGhpcyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsIGlmIHRoaXMgaW5zdGFuY2UgcmVmZXJzIHRvIGEgbmVzdGVkLW5hbWUtc3BlY2lmaWVyCisgIC8vLyBcYyBcOjpzdGQ6OnZlY3RvcjxpbnQ+OjosIHRoZSBwcmVmaXggaXMgXGMgXDo6c3RkOjouIE5vdGUgdGhhdCB0aGUKKyAgLy8vIHJldHVybmVkIHByZWZpeCBtYXkgYmUgZW1wdHksIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNvbXBvbmVudCBvZgorICAvLy8gdGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllci4KKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBnZXRQcmVmaXgoKSBjb25zdCB7CisgICAgaWYgKCFRdWFsaWZpZXIpCisgICAgICByZXR1cm4gKnRoaXM7CisKKyAgICByZXR1cm4gTmVzdGVkTmFtZVNwZWNpZmllckxvYyhRdWFsaWZpZXItPmdldFByZWZpeCgpLCBEYXRhKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRm9yIGEgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHRoYXQgcmVmZXJzIHRvIGEgdHlwZSwKKyAgLy8vIHJldHJpZXZlIHRoZSB0eXBlIHdpdGggc291cmNlLWxvY2F0aW9uIGluZm9ybWF0aW9uLgorICBUeXBlTG9jIGdldFR5cGVMb2MoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZXMgdGhlIGRhdGEgbGVuZ3RoIGZvciB0aGUgZW50aXJlCisgIC8vLyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIuCisgIHVuc2lnbmVkIGdldERhdGFMZW5ndGgoKSBjb25zdCB7IHJldHVybiBnZXREYXRhTGVuZ3RoKFF1YWxpZmllcik7IH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFkpIHsKKyAgICByZXR1cm4gWC5RdWFsaWZpZXIgPT0gWS5RdWFsaWZpZXIgJiYgWC5EYXRhID09IFkuRGF0YTsKKyAgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oTmVzdGVkTmFtZVNwZWNpZmllckxvYyBYLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgWSkgeworICAgIHJldHVybiAhKFggPT0gWSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQ2xhc3MgdGhhdCBhaWRzIGluIHRoZSBjb25zdHJ1Y3Rpb24gb2YgbmVzdGVkLW5hbWUtc3BlY2lmaWVycyBhbG9uZworLy8vIHdpdGggc291cmNlLWxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciBhbGwgb2YgdGhlIGNvbXBvbmVudHMgb2YgdGhlCisvLy8gbmVzdGVkLW5hbWUtc3BlY2lmaWVyLgorY2xhc3MgTmVzdGVkTmFtZVNwZWNpZmllckxvY0J1aWxkZXIgeworICAvLy8gXGJyaWVmIFRoZSBjdXJyZW50IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgd2UncmUKKyAgLy8vIGJ1aWxkaW5nLgorICBOZXN0ZWROYW1lU3BlY2lmaWVyICpSZXByZXNlbnRhdGlvbiA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBCdWZmZXIgdXNlZCB0byBzdG9yZSBzb3VyY2UtbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZQorICAvLy8gbmVzdGVkLW5hbWUtc3BlY2lmaWVyLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB3ZSBleHBsaWNpdGx5IG1hbmFnZSB0aGUgYnVmZmVyIChyYXRoZXIgdGhhbiB1c2luZyBhCisgIC8vLyBTbWFsbFZlY3RvcikgYmVjYXVzZSBcYyBEZWNsYXJhdG9yIGV4cGVjdHMgaXQgdG8gYmUgcG9zc2libGUgdG8gbWVtY3B5KCkKKyAgLy8vIGEgXGMgQ1hYU2NvcGVTcGVjLCBhbmQgQ1hYU2NvcGVTcGVjIHVzZXMgYSBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jQnVpbGRlci4KKyAgY2hhciAqQnVmZmVyID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFRoZSBzaXplIG9mIHRoZSBidWZmZXIgdXNlZCB0byBzdG9yZSBzb3VyY2UtbG9jYXRpb24gaW5mb3JtYXRpb24KKyAgLy8vIGZvciB0aGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyLgorICB1bnNpZ25lZCBCdWZmZXJTaXplID0gMDsKKworICAvLy8gXGJyaWVmIFRoZSBjYXBhY2l0eSBvZiB0aGUgYnVmZmVyIHVzZWQgdG8gc3RvcmUgc291cmNlLWxvY2F0aW9uCisgIC8vLyBpbmZvcm1hdGlvbiBmb3IgdGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllci4KKyAgdW5zaWduZWQgQnVmZmVyQ2FwYWNpdHkgPSAwOworCitwdWJsaWM6CisgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2NCdWlsZGVyKCkgPSBkZWZhdWx0OworICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jQnVpbGRlcihjb25zdCBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jQnVpbGRlciAmT3RoZXIpOworCisgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2NCdWlsZGVyICYKKyAgb3BlcmF0b3I9KGNvbnN0IE5lc3RlZE5hbWVTcGVjaWZpZXJMb2NCdWlsZGVyICZPdGhlcik7CisKKyAgfk5lc3RlZE5hbWVTcGVjaWZpZXJMb2NCdWlsZGVyKCkgeworICAgIGlmIChCdWZmZXJDYXBhY2l0eSkKKyAgICAgIGZyZWUoQnVmZmVyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIuCisgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKmdldFJlcHJlc2VudGF0aW9uKCkgY29uc3QgeyByZXR1cm4gUmVwcmVzZW50YXRpb247IH0KKworICAvLy8gXGJyaWVmIEV4dGVuZCB0aGUgY3VycmVudCBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgYnkgYW5vdGhlcgorICAvLy8gbmVzdGVkLW5hbWUtc3BlY2lmaWVyIGNvbXBvbmVudCBvZiB0aGUgZm9ybSAndHlwZTo6Jy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29udGV4dCBUaGUgQVNUIGNvbnRleHQgaW4gd2hpY2ggdGhpcyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIKKyAgLy8vIHJlc2lkZXMuCisgIC8vLworICAvLy8gXHBhcmFtIFRlbXBsYXRlS1dMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSAndGVtcGxhdGUnIGtleXdvcmQsIGlmIHByZXNlbnQuCisgIC8vLworICAvLy8gXHBhcmFtIFRMIFRoZSBUeXBlTG9jIHRoYXQgZGVzY3JpYmVzIHRoZSB0eXBlIHByZWNlZGluZyB0aGUgJzo6Jy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29sb25Db2xvbkxvYyBUaGUgbG9jYXRpb24gb2YgdGhlIHRyYWlsaW5nICc6OicuCisgIHZvaWQgRXh0ZW5kKEFTVENvbnRleHQgJkNvbnRleHQsIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlS1dMb2MsIFR5cGVMb2MgVEwsCisgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENvbG9uQ29sb25Mb2MpOworCisgIC8vLyBcYnJpZWYgRXh0ZW5kIHRoZSBjdXJyZW50IG5lc3RlZC1uYW1lLXNwZWNpZmllciBieSBhbm90aGVyCisgIC8vLyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgY29tcG9uZW50IG9mIHRoZSBmb3JtICdpZGVudGlmaWVyOjonLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb250ZXh0IFRoZSBBU1QgY29udGV4dCBpbiB3aGljaCB0aGlzIG5lc3RlZC1uYW1lLXNwZWNpZmllcgorICAvLy8gcmVzaWRlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gSWRlbnRpZmllciBUaGUgaWRlbnRpZmllci4KKyAgLy8vCisgIC8vLyBccGFyYW0gSWRlbnRpZmllckxvYyBUaGUgbG9jYXRpb24gb2YgdGhlIGlkZW50aWZpZXIuCisgIC8vLworICAvLy8gXHBhcmFtIENvbG9uQ29sb25Mb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSB0cmFpbGluZyAnOjonLgorICB2b2lkIEV4dGVuZChBU1RDb250ZXh0ICZDb250ZXh0LCBJZGVudGlmaWVySW5mbyAqSWRlbnRpZmllciwKKyAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRlbnRpZmllckxvYywgU291cmNlTG9jYXRpb24gQ29sb25Db2xvbkxvYyk7CisKKyAgLy8vIFxicmllZiBFeHRlbmQgdGhlIGN1cnJlbnQgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIGJ5IGFub3RoZXIKKyAgLy8vIG5lc3RlZC1uYW1lLXNwZWNpZmllciBjb21wb25lbnQgb2YgdGhlIGZvcm0gJ25hbWVzcGFjZTo6Jy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29udGV4dCBUaGUgQVNUIGNvbnRleHQgaW4gd2hpY2ggdGhpcyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIKKyAgLy8vIHJlc2lkZXMuCisgIC8vLworICAvLy8gXHBhcmFtIE5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOYW1lc3BhY2VMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBuYW1lc3BhY2UgbmFtZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29sb25Db2xvbkxvYyBUaGUgbG9jYXRpb24gb2YgdGhlIHRyYWlsaW5nICc6OicuCisgIHZvaWQgRXh0ZW5kKEFTVENvbnRleHQgJkNvbnRleHQsIE5hbWVzcGFjZURlY2wgKk5hbWVzcGFjZSwKKyAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTmFtZXNwYWNlTG9jLCBTb3VyY2VMb2NhdGlvbiBDb2xvbkNvbG9uTG9jKTsKKworICAvLy8gXGJyaWVmIEV4dGVuZCB0aGUgY3VycmVudCBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgYnkgYW5vdGhlcgorICAvLy8gbmVzdGVkLW5hbWUtc3BlY2lmaWVyIGNvbXBvbmVudCBvZiB0aGUgZm9ybSAnbmFtZXNwYWNlLWFsaWFzOjonLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb250ZXh0IFRoZSBBU1QgY29udGV4dCBpbiB3aGljaCB0aGlzIG5lc3RlZC1uYW1lLXNwZWNpZmllcgorICAvLy8gcmVzaWRlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQWxpYXMgVGhlIG5hbWVzcGFjZSBhbGlhcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQWxpYXNMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBuYW1lc3BhY2UgYWxpYXMKKyAgLy8vIG5hbWUuCisgIC8vLworICAvLy8gXHBhcmFtIENvbG9uQ29sb25Mb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSB0cmFpbGluZyAnOjonLgorICB2b2lkIEV4dGVuZChBU1RDb250ZXh0ICZDb250ZXh0LCBOYW1lc3BhY2VBbGlhc0RlY2wgKkFsaWFzLAorICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBbGlhc0xvYywgU291cmNlTG9jYXRpb24gQ29sb25Db2xvbkxvYyk7CisKKyAgLy8vIFxicmllZiBUdXJuIHRoaXMgKGVtcHR5KSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgaW50byB0aGUgZ2xvYmFsCisgIC8vLyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgJzo6Jy4KKyAgdm9pZCBNYWtlR2xvYmFsKEFTVENvbnRleHQgJkNvbnRleHQsIFNvdXJjZUxvY2F0aW9uIENvbG9uQ29sb25Mb2MpOworICAKKyAgLy8vIFxicmllZiBUdXJucyB0aGlzIChlbXB0eSkgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIGludG8gJ19fc3VwZXInCisgIC8vLyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIuCisgIC8vLworICAvLy8gXHBhcmFtIENvbnRleHQgVGhlIEFTVCBjb250ZXh0IGluIHdoaWNoIHRoaXMgbmVzdGVkLW5hbWUtc3BlY2lmaWVyCisgIC8vLyByZXNpZGVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSRCBUaGUgZGVjbGFyYXRpb24gb2YgdGhlIGNsYXNzIGluIHdoaWNoIG5lc3RlZC1uYW1lLXNwZWNpZmllcgorICAvLy8gYXBwZWFyZWQuCisgIC8vLworICAvLy8gXHBhcmFtIFN1cGVyTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgJ19fc3VwZXInIGtleXdvcmQuCisgIC8vLyBuYW1lLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb2xvbkNvbG9uTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgdHJhaWxpbmcgJzo6Jy4KKyAgdm9pZCBNYWtlU3VwZXIoQVNUQ29udGV4dCAmQ29udGV4dCwgQ1hYUmVjb3JkRGVjbCAqUkQsIAorICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdXBlckxvYywgU291cmNlTG9jYXRpb24gQ29sb25Db2xvbkxvYyk7CisKKyAgLy8vIFxicmllZiBNYWtlIGEgbmV3IG5lc3RlZC1uYW1lLXNwZWNpZmllciBmcm9tIGluY29tcGxldGUgc291cmNlLWxvY2F0aW9uCisgIC8vLyBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgc2hvdWxkIGJlIHVzZWQgdmVyeSwgdmVyeSByYXJlbHksIGluIGNhc2VzIHdoZXJlIHdlCisgIC8vLyBuZWVkIHRvIHN5bnRoZXNpemUgYSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIuIE1vc3QgY29kZSBzaG91bGQgaW5zdGVhZCB1c2UKKyAgLy8vIFxjIEFkb3B0KCkgd2l0aCBhIHByb3BlciBcYyBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jLgorICB2b2lkIE1ha2VUcml2aWFsKEFTVENvbnRleHQgJkNvbnRleHQsIE5lc3RlZE5hbWVTcGVjaWZpZXIgKlF1YWxpZmllciwKKyAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSKTsKKworICAvLy8gXGJyaWVmIEFkb3B0IGFuIGV4aXN0aW5nIG5lc3RlZC1uYW1lLXNwZWNpZmllciAod2l0aCBzb3VyY2UtcmFuZ2UKKyAgLy8vIGluZm9ybWF0aW9uKS4KKyAgdm9pZCBBZG9wdChOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIE90aGVyKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzb3VyY2UgcmFuZ2UgY292ZXJlZCBieSB0aGlzIG5lc3RlZC1uYW1lLXNwZWNpZmllci4KKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gTmVzdGVkTmFtZVNwZWNpZmllckxvYyhSZXByZXNlbnRhdGlvbiwgQnVmZmVyKS5nZXRTb3VyY2VSYW5nZSgpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBhIG5lc3RlZC1uYW1lLXNwZWNpZmllciB3aXRoIGxvY2F0aW9uIGluZm9ybWF0aW9uLAorICAvLy8gY29waWVkIGludG8gdGhlIGdpdmVuIEFTVCBjb250ZXh0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb250ZXh0IFRoZSBjb250ZXh0IGludG8gd2hpY2ggdGhpcyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgd2lsbCBiZQorICAvLy8gY29waWVkLgorICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIGdldFdpdGhMb2NJbkNvbnRleHQoQVNUQ29udGV4dCAmQ29udGV4dCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBhIG5lc3RlZC1uYW1lLXNwZWNpZmllciB3aXRoIGxvY2F0aW9uCisgIC8vLyBpbmZvcm1hdGlvbiBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gaW4gdGhpcyBidWlsZGVyLgorICAvLy8KKyAgLy8vIFRoaXMgbG9jIHdpbGwgY29udGFpbiByZWZlcmVuY2VzIHRvIHRoZSBidWlsZGVyJ3MgaW50ZXJuYWwgZGF0YSBhbmQgbWF5CisgIC8vLyBiZSBpbnZhbGlkYXRlZCBieSBhbnkgY2hhbmdlIHRvIHRoZSBidWlsZGVyLgorICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIGdldFRlbXBvcmFyeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTmVzdGVkTmFtZVNwZWNpZmllckxvYyhSZXByZXNlbnRhdGlvbiwgQnVmZmVyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2xlYXIgb3V0IHRoaXMgYnVpbGRlciwgYW5kIHByZXBhcmUgaXQgdG8gYnVpbGQgYW5vdGhlcgorICAvLy8gbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHdpdGggc291cmNlLWxvY2F0aW9uIGluZm9ybWF0aW9uLgorICB2b2lkIENsZWFyKCkgeworICAgIFJlcHJlc2VudGF0aW9uID0gbnVsbHB0cjsKKyAgICBCdWZmZXJTaXplID0gMDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHVuZGVybHlpbmcgYnVmZmVyLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIEEgcGFpciBjb250YWluaW5nIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIHNvdXJjZS1sb2NhdGlvbgorICAvLy8gZGF0YSBhbmQgdGhlIHNpemUgb2YgdGhlIHNvdXJjZS1sb2NhdGlvbiBkYXRhIHRoYXQgcmVzaWRlcyBpbiB0aGF0CisgIC8vLyBidWZmZXIuCisgIHN0ZDo6cGFpcjxjaGFyICosIHVuc2lnbmVkPiBnZXRCdWZmZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEJ1ZmZlciwgQnVmZmVyU2l6ZSk7CisgIH0KK307CisKKy8vLyBJbnNlcnRpb24gb3BlcmF0b3IgZm9yIGRpYWdub3N0aWNzLiAgVGhpcyBhbGxvd3Mgc2VuZGluZworLy8vIE5lc3RlZE5hbWVTcGVjaWZpZXJzIGludG8gYSBkaWFnbm9zdGljIHdpdGggPDwuCitpbmxpbmUgY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJm9wZXJhdG9yPDwoY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJkRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUykgeworICBEQi5BZGRUYWdnZWRWYWwocmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oTk5TKSwKKyAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpha19uZXN0ZWRuYW1lc3BlYyk7CisgIHJldHVybiBEQjsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUX05FU1RFRE5BTUVTUEVDSUZJRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL09EUkhhc2guaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9PRFJIYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllODAyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9PRFJIYXNoLmgKQEAgLTAsMCArMSw4OSBAQAorLy89PT0tLSBPRFJIYXNoLmggLSBIYXNoaW5nIHRvIGRpYWdub3NlIE9EUiBmYWlsdXJlcyAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgT0RSSGFzaCBjbGFzcywgd2hpY2ggY2FsY3VsYXRlcworLy8vIGEgaGFzaCBiYXNlZCBvbiBBU1Qgbm9kZXMsIHdoaWNoIGlzIHN0YWJsZSBhY3Jvc3MgZGlmZmVyZW50IHJ1bnMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbGFyYXRpb25OYW1lLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVGVtcGxhdGVCYXNlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlclVuaW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgRGVjbDsKK2NsYXNzIElkZW50aWZpZXJJbmZvOworY2xhc3MgTmVzdGVkTmFtZVNwZWNpZmllcjsKK2NsYXNzIFN0bXQ7CitjbGFzcyBUZW1wbGF0ZVBhcmFtZXRlckxpc3Q7CisKKy8vIE9EUkhhc2ggaXMgdXNlZCB0byBjYWxjdWxhdGUgYSBoYXNoIGJhc2VkIG9uIEFTVCBub2RlIGNvbnRlbnRzIHRoYXQKKy8vIGRvZXMgbm90IHJlbHkgb24gcG9pbnRlciBhZGRyZXNzZXMuICBUaGlzIGFsbG93cyB0aGUgaGFzaCB0byBub3QgdmFyeQorLy8gYmV0d2VlbiBydW5zIGFuZCBpcyB1c2FibGUgdG8gZGV0ZWN0IE9EUiBwcm9ibGVtcyBpbiBtb2R1bGVzLiAgVG8gdXNlLAorLy8gY29uc3RydWN0IGFuIE9EUkhhc2ggb2JqZWN0LCB0aGVuIGNhbGwgQWRkKiBtZXRob2RzIG92ZXIgdGhlIG5vZGVzIHRoYXQKKy8vIG5lZWQgdG8gYmUgaGFzaGVkLiAgVGhlbiBjYWxsIENhbGN1bGF0ZUhhc2ggdG8gZ2V0IHRoZSBoYXNoIHZhbHVlLgorLy8gVHlwaWNhbGx5LCBvbmx5IG9uZSBBZGQqIGNhbGwgaXMgbmVlZGVkLiAgY2xlYXIgY2FuIGJlIGNhbGxlZCB0byByZXVzZSB0aGUKKy8vIG9iamVjdC4KK2NsYXNzIE9EUkhhc2ggeworICAvLyBVc2UgRGVuc2VNYXBzIHRvIGNvbnZlcnQgZnJvbSBEZWNsYXJhdGlvbk5hbWUgYW5kIFR5cGUgcG9pbnRlcnMKKyAgLy8gdG8gYW4gaW5kZXggdmFsdWUuCisgIGxsdm06OkRlbnNlTWFwPERlY2xhcmF0aW9uTmFtZSwgdW5zaWduZWQ+IERlY2xOYW1lTWFwOworICBsbHZtOjpEZW5zZU1hcDxjb25zdCBUeXBlKiwgdW5zaWduZWQ+IFR5cGVNYXA7CisKKyAgLy8gU2F2ZSBzcGFjZSBieSBwcm9jZXNzaW5nIGJvb2xzIGF0IHRoZSBlbmQuCisgIGxsdm06OlNtYWxsVmVjdG9yPGJvb2wsIDEyOD4gQm9vbHM7CisKKyAgbGx2bTo6Rm9sZGluZ1NldE5vZGVJRCBJRDsKKworcHVibGljOgorICBPRFJIYXNoKCkge30KKworICAvLyBVc2UgdGhpcyBmb3IgT0RSIGNoZWNraW5nIGNsYXNzZXMgYmV0d2VlbiBtb2R1bGVzLiAgVGhpcyBtZXRob2QgY29tcGFyZXMKKyAgLy8gbW9yZSBpbmZvcm1hdGlvbiB0aGFuIHRoZSBBZGREZWNsIGNsYXNzLgorICB2b2lkIEFkZENYWFJlY29yZERlY2woY29uc3QgQ1hYUmVjb3JkRGVjbCAqUmVjb3JkKTsKKworICAvLyBVc2UgdGhpcyBmb3IgT0RSIGNoZWNraW5nIGZ1bmN0aW9ucyBiZXR3ZWVuIG1vZHVsZXMuICBUaGlzIG1ldGhvZCBjb21wYXJlcworICAvLyBtb3JlIGluZm9ybWF0aW9uIHRoYW4gdGhlIEFkZERlY2wgY2xhc3MuCisgIHZvaWQgQWRkRnVuY3Rpb25EZWNsKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRnVuY3Rpb24pOworCisgIC8vIFByb2Nlc3MgU3ViRGVjbHMgb2YgdGhlIG1haW4gRGVjbC4gIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBEZWNsVmlzaXRvcgorICAvLyB3aGlsZSBBZGREZWNsIGRvZXMgbm90LgorICB2b2lkIEFkZFN1YkRlY2woY29uc3QgRGVjbCAqRCk7CisKKyAgLy8gUmVzZXQgdGhlIG9iamVjdCBmb3IgcmV1c2UuCisgIHZvaWQgY2xlYXIoKTsKKworICAvLyBBZGQgYm9vbGVhbnMgdG8gSUQgYW5kIHVzZXMgaXQgdG8gY2FsY3VsYXRlIHRoZSBoYXNoLgorICB1bnNpZ25lZCBDYWxjdWxhdGVIYXNoKCk7CisKKyAgLy8gQWRkIEFTVCBub2RlcyB0aGF0IG5lZWQgdG8gYmUgcHJvY2Vzc2VkLgorICB2b2lkIEFkZERlY2woY29uc3QgRGVjbCAqRCk7CisgIHZvaWQgQWRkVHlwZShjb25zdCBUeXBlICpUKTsKKyAgdm9pZCBBZGRRdWFsVHlwZShRdWFsVHlwZSBUKTsKKyAgdm9pZCBBZGRTdG10KGNvbnN0IFN0bXQgKlMpOworICB2b2lkIEFkZElkZW50aWZpZXJJbmZvKGNvbnN0IElkZW50aWZpZXJJbmZvICpJSSk7CisgIHZvaWQgQWRkTmVzdGVkTmFtZVNwZWNpZmllcihjb25zdCBOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlMpOworICB2b2lkIEFkZFRlbXBsYXRlTmFtZShUZW1wbGF0ZU5hbWUgTmFtZSk7CisgIHZvaWQgQWRkRGVjbGFyYXRpb25OYW1lKERlY2xhcmF0aW9uTmFtZSBOYW1lKTsKKyAgdm9pZCBBZGRUZW1wbGF0ZUFyZ3VtZW50KFRlbXBsYXRlQXJndW1lbnQgVEEpOworICB2b2lkIEFkZFRlbXBsYXRlUGFyYW1ldGVyTGlzdChjb25zdCBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlRQTCk7CisKKyAgLy8gU2F2ZSBib29sZWFucyB1bnRpbCB0aGUgZW5kIHRvIGxvd2VyIHRoZSBzaXplIG9mIGRhdGEgdG8gcHJvY2Vzcy4KKyAgdm9pZCBBZGRCb29sZWFuKGJvb2wgdmFsdWUpOworCisgIHN0YXRpYyBib29sIGlzV2hpdGVsaXN0ZWREZWNsKGNvbnN0IERlY2wqIEQsIGNvbnN0IENYWFJlY29yZERlY2wgKlJlY29yZCk7Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvT3Blbk1QQ2xhdXNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvT3Blbk1QQ2xhdXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjZDFjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9PcGVuTVBDbGF1c2UuaApAQCAtMCwwICsxLDQ5OTYgQEAKKy8vPT09LSBPcGVuTVBDbGF1c2UuaCAtIENsYXNzZXMgZm9yIE9wZW5NUCBjbGF1c2VzIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIFRoaXMgZmlsZSBkZWZpbmVzIE9wZW5NUCBBU1QgY2xhc3NlcyBmb3IgY2xhdXNlcy4KKy8vLyBUaGVyZSBhcmUgY2xhdXNlcyBmb3IgZXhlY3V0YWJsZSBkaXJlY3RpdmVzLCBjbGF1c2VzIGZvciBkZWNsYXJhdGl2ZQorLy8vIGRpcmVjdGl2ZXMgYW5kIGNsYXVzZXMgd2hpY2ggY2FuIGJlIHVzZWQgaW4gYm90aCBraW5kcyBvZiBkaXJlY3RpdmVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfT1BFTk1QQ0xBVVNFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfT1BFTk1QQ0xBVVNFX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xhcmF0aW9uTmFtZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL05lc3RlZE5hbWVTcGVjaWZpZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3Blbk1QS2luZHMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTWFwVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVHJhaWxpbmdPYmplY3RzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFTVENvbnRleHQ7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBU1QgY2xhc3NlcyBmb3IgY2xhdXNlcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBcYnJpZWYgVGhpcyBpcyBhIGJhc2ljIGNsYXNzIGZvciByZXByZXNlbnRpbmcgc2luZ2xlIE9wZW5NUCBjbGF1c2UuCitjbGFzcyBPTVBDbGF1c2UgeworICAvLy8gXGJyaWVmIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UgKHRoZSBjbGF1c2Uga2V5d29yZCkuCisgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jOworCisgIC8vLyBcYnJpZWYgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIFNvdXJjZUxvY2F0aW9uIEVuZExvYzsKKworICAvLy8gXGJyaWVmIEtpbmQgb2YgdGhlIGNsYXVzZS4KKyAgT3Blbk1QQ2xhdXNlS2luZCBLaW5kOworCitwcm90ZWN0ZWQ6CisgIE9NUENsYXVzZShPcGVuTVBDbGF1c2VLaW5kIEssIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpCisgICAgICA6IFN0YXJ0TG9jKFN0YXJ0TG9jKSwgRW5kTG9jKEVuZExvYyksIEtpbmQoSykge30KKworcHVibGljOgorICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgeyByZXR1cm4gU3RhcnRMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCB7IHJldHVybiBFbmRMb2M7IH0KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIHN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIHZvaWQgc2V0TG9jU3RhcnQoU291cmNlTG9jYXRpb24gTG9jKSB7IFN0YXJ0TG9jID0gTG9jOyB9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBlbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgdm9pZCBzZXRMb2NFbmQoU291cmNlTG9jYXRpb24gTG9jKSB7IEVuZExvYyA9IExvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBraW5kIG9mIE9wZW5NUCBjbGF1c2UgKHByaXZhdGUsIHNoYXJlZCwgcmVkdWN0aW9uLCBldGMuKS4KKyAgT3Blbk1QQ2xhdXNlS2luZCBnZXRDbGF1c2VLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorCisgIGJvb2wgaXNJbXBsaWNpdCgpIGNvbnN0IHsgcmV0dXJuIFN0YXJ0TG9jLmlzSW52YWxpZCgpOyB9CisKKyAgdXNpbmcgY2hpbGRfaXRlcmF0b3IgPSBTdG10SXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2NoaWxkX2l0ZXJhdG9yID0gQ29uc3RTdG10SXRlcmF0b3I7CisgIHVzaW5nIGNoaWxkX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8Y2hpbGRfaXRlcmF0b3I+OworICB1c2luZyBjb25zdF9jaGlsZF9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGNvbnN0X2NoaWxkX2l0ZXJhdG9yPjsKKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpOworICBjb25zdF9jaGlsZF9yYW5nZSBjaGlsZHJlbigpIGNvbnN0IHsKKyAgICBhdXRvIENoaWxkcmVuID0gY29uc3RfY2FzdDxPTVBDbGF1c2UgKj4odGhpcyktPmNoaWxkcmVuKCk7CisgICAgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKENoaWxkcmVuLmJlZ2luKCksIENoaWxkcmVuLmVuZCgpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICopIHsgcmV0dXJuIHRydWU7IH0KK307CisKKy8vLyBDbGFzcyB0aGF0IGhhbmRsZXMgcHJlLWluaXRpYWxpemF0aW9uIHN0YXRlbWVudCBmb3Igc29tZSBjbGF1c2VzLCBsaWtlCisvLy8gJ3NoZWR1bGUnLCAnZmlyc3Rwcml2YXRlJyBldGMuCitjbGFzcyBPTVBDbGF1c2VXaXRoUHJlSW5pdCB7CisgIGZyaWVuZCBjbGFzcyBPTVBDbGF1c2VSZWFkZXI7CisKKyAgLy8vIFByZS1pbml0aWFsaXphdGlvbiBzdGF0ZW1lbnQgZm9yIHRoZSBjbGF1c2UuCisgIFN0bXQgKlByZUluaXQgPSBudWxscHRyOworCisgIC8vLyBSZWdpb24gdGhhdCBjYXB0dXJlcyB0aGUgYXNzb2NpYXRlZCBzdG10LgorICBPcGVuTVBEaXJlY3RpdmVLaW5kIENhcHR1cmVSZWdpb24gPSBPTVBEX3Vua25vd247CisKK3Byb3RlY3RlZDoKKyAgT01QQ2xhdXNlV2l0aFByZUluaXQoY29uc3QgT01QQ2xhdXNlICpUaGlzKSB7CisgICAgYXNzZXJ0KGdldChUaGlzKSAmJiAiZ2V0IGlzIG5vdCB0dW5lZCBmb3IgcHJlLWluaXQuIik7CisgIH0KKworICAvLy8gU2V0IHByZS1pbml0aWFsaXphdGlvbiBzdGF0ZW1lbnQgZm9yIHRoZSBjbGF1c2UuCisgIHZvaWQgc2V0UHJlSW5pdFN0bXQoU3RtdCAqUywgT3Blbk1QRGlyZWN0aXZlS2luZCBUaGlzUmVnaW9uID0gT01QRF91bmtub3duKSB7CisgICAgUHJlSW5pdCA9IFM7CisgICAgQ2FwdHVyZVJlZ2lvbiA9IFRoaXNSZWdpb247CisgIH0KKworcHVibGljOgorICAvLy8gR2V0IHByZS1pbml0aWFsaXphdGlvbiBzdGF0ZW1lbnQgZm9yIHRoZSBjbGF1c2UuCisgIGNvbnN0IFN0bXQgKmdldFByZUluaXRTdG10KCkgY29uc3QgeyByZXR1cm4gUHJlSW5pdDsgfQorCisgIC8vLyBHZXQgcHJlLWluaXRpYWxpemF0aW9uIHN0YXRlbWVudCBmb3IgdGhlIGNsYXVzZS4KKyAgU3RtdCAqZ2V0UHJlSW5pdFN0bXQoKSB7IHJldHVybiBQcmVJbml0OyB9CisKKyAgLy8vIEdldCBjYXB0dXJlIHJlZ2lvbiBmb3IgdGhlIHN0bXQgaW4gdGhlIGNsYXVzZS4KKyAgT3Blbk1QRGlyZWN0aXZlS2luZCBnZXRDYXB0dXJlUmVnaW9uKCkgeyByZXR1cm4gQ2FwdHVyZVJlZ2lvbjsgfQorCisgIHN0YXRpYyBPTVBDbGF1c2VXaXRoUHJlSW5pdCAqZ2V0KE9NUENsYXVzZSAqQyk7CisgIHN0YXRpYyBjb25zdCBPTVBDbGF1c2VXaXRoUHJlSW5pdCAqZ2V0KGNvbnN0IE9NUENsYXVzZSAqQyk7Cit9OworCisvLy8gQ2xhc3MgdGhhdCBoYW5kbGVzIHBvc3QtdXBkYXRlIGV4cHJlc3Npb24gZm9yIHNvbWUgY2xhdXNlcywgbGlrZQorLy8vICdsYXN0cHJpdmF0ZScsICdyZWR1Y3Rpb24nIGV0Yy4KK2NsYXNzIE9NUENsYXVzZVdpdGhQb3N0VXBkYXRlIDogcHVibGljIE9NUENsYXVzZVdpdGhQcmVJbml0IHsKKyAgZnJpZW5kIGNsYXNzIE9NUENsYXVzZVJlYWRlcjsKKworICAvLy8gUG9zdC11cGRhdGUgZXhwcmVzc2lvbiBmb3IgdGhlIGNsYXVzZS4KKyAgRXhwciAqUG9zdFVwZGF0ZSA9IG51bGxwdHI7CisKK3Byb3RlY3RlZDoKKyAgT01QQ2xhdXNlV2l0aFBvc3RVcGRhdGUoY29uc3QgT01QQ2xhdXNlICpUaGlzKSA6IE9NUENsYXVzZVdpdGhQcmVJbml0KFRoaXMpIHsKKyAgICBhc3NlcnQoZ2V0KFRoaXMpICYmICJnZXQgaXMgbm90IHR1bmVkIGZvciBwb3N0LXVwZGF0ZS4iKTsKKyAgfQorCisgIC8vLyBTZXQgcHJlLWluaXRpYWxpemF0aW9uIHN0YXRlbWVudCBmb3IgdGhlIGNsYXVzZS4KKyAgdm9pZCBzZXRQb3N0VXBkYXRlRXhwcihFeHByICpTKSB7IFBvc3RVcGRhdGUgPSBTOyB9CisKK3B1YmxpYzoKKyAgLy8vIEdldCBwb3N0LXVwZGF0ZSBleHByZXNzaW9uIGZvciB0aGUgY2xhdXNlLgorICBjb25zdCBFeHByICpnZXRQb3N0VXBkYXRlRXhwcigpIGNvbnN0IHsgcmV0dXJuIFBvc3RVcGRhdGU7IH0KKworICAvLy8gR2V0IHBvc3QtdXBkYXRlIGV4cHJlc3Npb24gZm9yIHRoZSBjbGF1c2UuCisgIEV4cHIgKmdldFBvc3RVcGRhdGVFeHByKCkgeyByZXR1cm4gUG9zdFVwZGF0ZTsgfQorCisgIHN0YXRpYyBPTVBDbGF1c2VXaXRoUG9zdFVwZGF0ZSAqZ2V0KE9NUENsYXVzZSAqQyk7CisgIHN0YXRpYyBjb25zdCBPTVBDbGF1c2VXaXRoUG9zdFVwZGF0ZSAqZ2V0KGNvbnN0IE9NUENsYXVzZSAqQyk7Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyBjbGF1c2VzIHdpdGggdGhlIGxpc3Qgb2YgdmFyaWFibGVzIGxpa2UgJ3ByaXZhdGUnLAorLy8vICdmaXJzdHByaXZhdGUnLCAnY29weWluJywgJ3NoYXJlZCcsIG9yICdyZWR1Y3Rpb24nIGNsYXVzZXMgaW4gdGhlCisvLy8gJyNwcmFnbWEgb21wIC4uLicgZGlyZWN0aXZlcy4KK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBPTVBWYXJMaXN0Q2xhdXNlIDogcHVibGljIE9NUENsYXVzZSB7CisgIGZyaWVuZCBjbGFzcyBPTVBDbGF1c2VSZWFkZXI7CisKKyAgLy8vIFxicmllZiBMb2NhdGlvbiBvZiAnKCcuCisgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYzsKKworICAvLy8gXGJyaWVmIE51bWJlciBvZiB2YXJpYWJsZXMgaW4gdGhlIGxpc3QuCisgIHVuc2lnbmVkIE51bVZhcnM7CisKK3Byb3RlY3RlZDoKKyAgLy8vIFxicmllZiBCdWlsZCBhIGNsYXVzZSB3aXRoIFxhIE4gdmFyaWFibGVzCisgIC8vLworICAvLy8gXHBhcmFtIEsgS2luZCBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UgKHRoZSBjbGF1c2Uga2V5d29yZCkuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTiBOdW1iZXIgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgY2xhdXNlLgorICBPTVBWYXJMaXN0Q2xhdXNlKE9wZW5NUENsYXVzZUtpbmQgSywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsIHVuc2lnbmVkIE4pCisgICAgICA6IE9NUENsYXVzZShLLCBTdGFydExvYywgRW5kTG9jKSwgTFBhcmVuTG9jKExQYXJlbkxvYyksIE51bVZhcnMoTikge30KKworICAvLy8gXGJyaWVmIEZldGNoZXMgbGlzdCBvZiB2YXJpYWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhdXNlLgorICBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPiBnZXRWYXJSZWZzKCkgeworICAgIHJldHVybiBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPigKKyAgICAgICAgc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+dGVtcGxhdGUgZ2V0VHJhaWxpbmdPYmplY3RzPEV4cHIgKj4oKSwgTnVtVmFycyk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIGxpc3Qgb2YgdmFyaWFibGVzIGZvciB0aGlzIGNsYXVzZS4KKyAgdm9pZCBzZXRWYXJSZWZzKEFycmF5UmVmPEV4cHIgKj4gVkwpIHsKKyAgICBhc3NlcnQoVkwuc2l6ZSgpID09IE51bVZhcnMgJiYKKyAgICAgICAgICAgIk51bWJlciBvZiB2YXJpYWJsZXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBwcmVhbGxvY2F0ZWQgYnVmZmVyIik7CisgICAgc3RkOjpjb3B5KFZMLmJlZ2luKCksIFZMLmVuZCgpLAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT50ZW1wbGF0ZSBnZXRUcmFpbGluZ09iamVjdHM8RXhwciAqPigpKTsKKyAgfQorCitwdWJsaWM6CisgIHVzaW5nIHZhcmxpc3RfaXRlcmF0b3IgPSBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIHZhcmxpc3RfY29uc3RfaXRlcmF0b3IgPSBBcnJheVJlZjxjb25zdCBFeHByICo+OjppdGVyYXRvcjsKKyAgdXNpbmcgdmFybGlzdF9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPHZhcmxpc3RfaXRlcmF0b3I+OworICB1c2luZyB2YXJsaXN0X2NvbnN0X3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8dmFybGlzdF9jb25zdF9pdGVyYXRvcj47CisKKyAgdW5zaWduZWQgdmFybGlzdF9zaXplKCkgY29uc3QgeyByZXR1cm4gTnVtVmFyczsgfQorICBib29sIHZhcmxpc3RfZW1wdHkoKSBjb25zdCB7IHJldHVybiBOdW1WYXJzID09IDA7IH0KKworICB2YXJsaXN0X3JhbmdlIHZhcmxpc3RzKCkgeworICAgIHJldHVybiB2YXJsaXN0X3JhbmdlKHZhcmxpc3RfYmVnaW4oKSwgdmFybGlzdF9lbmQoKSk7CisgIH0KKyAgdmFybGlzdF9jb25zdF9yYW5nZSB2YXJsaXN0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gdmFybGlzdF9jb25zdF9yYW5nZSh2YXJsaXN0X2JlZ2luKCksIHZhcmxpc3RfZW5kKCkpOworICB9CisKKyAgdmFybGlzdF9pdGVyYXRvciB2YXJsaXN0X2JlZ2luKCkgeyByZXR1cm4gZ2V0VmFyUmVmcygpLmJlZ2luKCk7IH0KKyAgdmFybGlzdF9pdGVyYXRvciB2YXJsaXN0X2VuZCgpIHsgcmV0dXJuIGdldFZhclJlZnMoKS5lbmQoKTsgfQorICB2YXJsaXN0X2NvbnN0X2l0ZXJhdG9yIHZhcmxpc3RfYmVnaW4oKSBjb25zdCB7IHJldHVybiBnZXRWYXJSZWZzKCkuYmVnaW4oKTsgfQorICB2YXJsaXN0X2NvbnN0X2l0ZXJhdG9yIHZhcmxpc3RfZW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0VmFyUmVmcygpLmVuZCgpOyB9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBsb2NhdGlvbiBvZiAnKCcuCisgIHZvaWQgc2V0TFBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBMUGFyZW5Mb2MgPSBMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gZ2V0TFBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gTFBhcmVuTG9jOyB9CisKKyAgLy8vIFxicmllZiBGZXRjaGVzIGxpc3Qgb2YgYWxsIHZhcmlhYmxlcyBpbiB0aGUgY2xhdXNlLgorICBBcnJheVJlZjxjb25zdCBFeHByICo+IGdldFZhclJlZnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZigKKyAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVCAqPih0aGlzKS0+dGVtcGxhdGUgZ2V0VHJhaWxpbmdPYmplY3RzPEV4cHIgKj4oKSwKKyAgICAgICAgTnVtVmFycyk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICdpZicgY2xhdXNlIGluIHRoZSAnI3ByYWdtYSBvbXAgLi4uJyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHBhcmFsbGVsIGlmKHBhcmFsbGVsOmEgPiA1KQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgcGFyYWxsZWwnIGhhcyBzaW1wbGUgJ2lmJyBjbGF1c2Ugd2l0aAorLy8vIGNvbmRpdGlvbiAnYSA+IDUnIGFuZCBkaXJlY3RpdmUgbmFtZSBtb2RpZmllciAncGFyYWxsZWwnLgorY2xhc3MgT01QSWZDbGF1c2UgOiBwdWJsaWMgT01QQ2xhdXNlLCBwdWJsaWMgT01QQ2xhdXNlV2l0aFByZUluaXQgeworICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOworCisgIC8vLyBcYnJpZWYgTG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2M7CisKKyAgLy8vIFxicmllZiBDb25kaXRpb24gb2YgdGhlICdpZicgY2xhdXNlLgorICBTdG10ICpDb25kaXRpb24gPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgTG9jYXRpb24gb2YgJzonIChpZiBhbnkpLgorICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYzsKKworICAvLy8gXGJyaWVmIERpcmVjdGl2ZSBuYW1lIG1vZGlmaWVyIGZvciB0aGUgY2xhdXNlLgorICBPcGVuTVBEaXJlY3RpdmVLaW5kIE5hbWVNb2RpZmllciA9IE9NUERfdW5rbm93bjsKKworICAvLy8gXGJyaWVmIE5hbWUgbW9kaWZpZXIgbG9jYXRpb24uCisgIFNvdXJjZUxvY2F0aW9uIE5hbWVNb2RpZmllckxvYzsKKworICAvLy8gXGJyaWVmIFNldCBjb25kaXRpb24uCisgIHZvaWQgc2V0Q29uZGl0aW9uKEV4cHIgKkNvbmQpIHsgQ29uZGl0aW9uID0gQ29uZDsgfQorCisgIC8vLyBcYnJpZWYgU2V0IGRpcmVjdGl2ZSBuYW1lIG1vZGlmaWVyIGZvciB0aGUgY2xhdXNlLgorICB2b2lkIHNldE5hbWVNb2RpZmllcihPcGVuTVBEaXJlY3RpdmVLaW5kIE5NKSB7IE5hbWVNb2RpZmllciA9IE5NOyB9CisKKyAgLy8vIFxicmllZiBTZXQgbG9jYXRpb24gb2YgZGlyZWN0aXZlIG5hbWUgbW9kaWZpZXIgZm9yIHRoZSBjbGF1c2UuCisgIHZvaWQgc2V0TmFtZU1vZGlmaWVyTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBOYW1lTW9kaWZpZXJMb2MgPSBMb2M7IH0KKworICAvLy8gXGJyaWVmIFNldCBsb2NhdGlvbiBvZiAnOicuCisgIHZvaWQgc2V0Q29sb25Mb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IENvbG9uTG9jID0gTG9jOyB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBCdWlsZCAnaWYnIGNsYXVzZSB3aXRoIGNvbmRpdGlvbiBcYSBDb25kLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOYW1lTW9kaWZpZXIgW09wZW5NUCA0LjFdIERpcmVjdGl2ZSBuYW1lIG1vZGlmaWVyIG9mIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBDb25kIENvbmRpdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIEhlbHBlckNvbmQgSGVscGVyIGNvbmRpdGlvbiBmb3IgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBDYXB0dXJlUmVnaW9uIElubmVybW9zdCBPcGVuTVAgcmVnaW9uIHdoZXJlIGV4cHJlc3Npb25zIGluIHRoaXMKKyAgLy8vIGNsYXVzZSBtdXN0IGJlIGNhcHR1cmVkLgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBOYW1lTW9kaWZpZXJMb2MgTG9jYXRpb24gb2YgZGlyZWN0aXZlIG5hbWUgbW9kaWZpZXIuCisgIC8vLyBccGFyYW0gQ29sb25Mb2MgW09wZW5NUCA0LjFdIExvY2F0aW9uIG9mICc6Jy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIE9NUElmQ2xhdXNlKE9wZW5NUERpcmVjdGl2ZUtpbmQgTmFtZU1vZGlmaWVyLCBFeHByICpDb25kLCBTdG10ICpIZWxwZXJDb25kLAorICAgICAgICAgICAgICBPcGVuTVBEaXJlY3RpdmVLaW5kIENhcHR1cmVSZWdpb24sIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsIFNvdXJjZUxvY2F0aW9uIE5hbWVNb2RpZmllckxvYywKKyAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQ29sb25Mb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfaWYsIFN0YXJ0TG9jLCBFbmRMb2MpLCBPTVBDbGF1c2VXaXRoUHJlSW5pdCh0aGlzKSwKKyAgICAgICAgTFBhcmVuTG9jKExQYXJlbkxvYyksIENvbmRpdGlvbihDb25kKSwgQ29sb25Mb2MoQ29sb25Mb2MpLAorICAgICAgICBOYW1lTW9kaWZpZXIoTmFtZU1vZGlmaWVyKSwgTmFtZU1vZGlmaWVyTG9jKE5hbWVNb2RpZmllckxvYykgeworICAgIHNldFByZUluaXRTdG10KEhlbHBlckNvbmQsIENhcHR1cmVSZWdpb24pOworICB9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIE9NUElmQ2xhdXNlKCkKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfaWYsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpLAorICAgICAgICBPTVBDbGF1c2VXaXRoUHJlSW5pdCh0aGlzKSB7fQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbG9jYXRpb24gb2YgJygnLgorICB2b2lkIHNldExQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgTFBhcmVuTG9jID0gTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiAnKCcuCisgIFNvdXJjZUxvY2F0aW9uIGdldExQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIExQYXJlbkxvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBsb2NhdGlvbiBvZiAnOicuCisgIFNvdXJjZUxvY2F0aW9uIGdldENvbG9uTG9jKCkgY29uc3QgeyByZXR1cm4gQ29sb25Mb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgY29uZGl0aW9uLgorICBFeHByICpnZXRDb25kaXRpb24oKSBjb25zdCB7IHJldHVybiBjYXN0X29yX251bGw8RXhwcj4oQ29uZGl0aW9uKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGRpcmVjdGl2ZSBuYW1lIG1vZGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xhdXNlLgorICBPcGVuTVBEaXJlY3RpdmVLaW5kIGdldE5hbWVNb2RpZmllcigpIGNvbnN0IHsgcmV0dXJuIE5hbWVNb2RpZmllcjsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBsb2NhdGlvbiBvZiBkaXJlY3RpdmUgbmFtZSBtb2RpZmllci4KKyAgU291cmNlTG9jYXRpb24gZ2V0TmFtZU1vZGlmaWVyTG9jKCkgY29uc3QgeyByZXR1cm4gTmFtZU1vZGlmaWVyTG9jOyB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7IHJldHVybiBjaGlsZF9yYW5nZSgmQ29uZGl0aW9uLCAmQ29uZGl0aW9uICsgMSk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgeworICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ19pZjsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJ2ZpbmFsJyBjbGF1c2UgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgdGFzayBmaW5hbChhID4gNSkKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRhc2snIGhhcyBzaW1wbGUgJ2ZpbmFsJworLy8vIGNsYXVzZSB3aXRoIGNvbmRpdGlvbiAnYSA+IDUnLgorY2xhc3MgT01QRmluYWxDbGF1c2UgOiBwdWJsaWMgT01QQ2xhdXNlIHsKKyAgZnJpZW5kIGNsYXNzIE9NUENsYXVzZVJlYWRlcjsKKworICAvLy8gXGJyaWVmIExvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jOworCisgIC8vLyBcYnJpZWYgQ29uZGl0aW9uIG9mIHRoZSAnaWYnIGNsYXVzZS4KKyAgU3RtdCAqQ29uZGl0aW9uID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFNldCBjb25kaXRpb24uCisgIHZvaWQgc2V0Q29uZGl0aW9uKEV4cHIgKkNvbmQpIHsgQ29uZGl0aW9uID0gQ29uZDsgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQnVpbGQgJ2ZpbmFsJyBjbGF1c2Ugd2l0aCBjb25kaXRpb24gXGEgQ29uZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBMUGFyZW5Mb2MgTG9jYXRpb24gb2YgJygnLgorICAvLy8gXHBhcmFtIENvbmQgQ29uZGl0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICBPTVBGaW5hbENsYXVzZShFeHByICpDb25kLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpCisgICAgICA6IE9NUENsYXVzZShPTVBDX2ZpbmFsLCBTdGFydExvYywgRW5kTG9jKSwgTFBhcmVuTG9jKExQYXJlbkxvYyksCisgICAgICAgIENvbmRpdGlvbihDb25kKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICBPTVBGaW5hbENsYXVzZSgpCisgICAgICA6IE9NUENsYXVzZShPTVBDX2ZpbmFsLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpKSB7fQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbG9jYXRpb24gb2YgJygnLgorICB2b2lkIHNldExQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgTFBhcmVuTG9jID0gTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiAnKCcuCisgIFNvdXJjZUxvY2F0aW9uIGdldExQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIExQYXJlbkxvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBjb25kaXRpb24uCisgIEV4cHIgKmdldENvbmRpdGlvbigpIGNvbnN0IHsgcmV0dXJuIGNhc3Rfb3JfbnVsbDxFeHByPihDb25kaXRpb24pOyB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7IHJldHVybiBjaGlsZF9yYW5nZSgmQ29uZGl0aW9uLCAmQ29uZGl0aW9uICsgMSk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgeworICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ19maW5hbDsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJ251bV90aHJlYWRzJyBjbGF1c2UgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nCisvLy8gZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyg2KQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgcGFyYWxsZWwnIGhhcyBzaW1wbGUgJ251bV90aHJlYWRzJworLy8vIGNsYXVzZSB3aXRoIG51bWJlciBvZiB0aHJlYWRzICc2Jy4KK2NsYXNzIE9NUE51bVRocmVhZHNDbGF1c2UgOiBwdWJsaWMgT01QQ2xhdXNlLCBwdWJsaWMgT01QQ2xhdXNlV2l0aFByZUluaXQgeworICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOworCisgIC8vLyBcYnJpZWYgTG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2M7CisKKyAgLy8vIFxicmllZiBDb25kaXRpb24gb2YgdGhlICdudW1fdGhyZWFkcycgY2xhdXNlLgorICBTdG10ICpOdW1UaHJlYWRzID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFNldCBjb25kaXRpb24uCisgIHZvaWQgc2V0TnVtVGhyZWFkcyhFeHByICpOVGhyZWFkcykgeyBOdW1UaHJlYWRzID0gTlRocmVhZHM7IH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIEJ1aWxkICdudW1fdGhyZWFkcycgY2xhdXNlIHdpdGggY29uZGl0aW9uIFxhIE51bVRocmVhZHMuCisgIC8vLworICAvLy8gXHBhcmFtIE51bVRocmVhZHMgTnVtYmVyIG9mIHRocmVhZHMgZm9yIHRoZSBjb25zdHJ1Y3QuCisgIC8vLyBccGFyYW0gSGVscGVyTnVtVGhyZWFkcyBIZWxwZXIgTnVtYmVyIG9mIHRocmVhZHMgZm9yIHRoZSBjb25zdHJ1Y3QuCisgIC8vLyBccGFyYW0gQ2FwdHVyZVJlZ2lvbiBJbm5lcm1vc3QgT3Blbk1QIHJlZ2lvbiB3aGVyZSBleHByZXNzaW9ucyBpbiB0aGlzCisgIC8vLyBjbGF1c2UgbXVzdCBiZSBjYXB0dXJlZC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICBPTVBOdW1UaHJlYWRzQ2xhdXNlKEV4cHIgKk51bVRocmVhZHMsIFN0bXQgKkhlbHBlck51bVRocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgT3Blbk1QRGlyZWN0aXZlS2luZCBDYXB0dXJlUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ19udW1fdGhyZWFkcywgU3RhcnRMb2MsIEVuZExvYyksCisgICAgICAgIE9NUENsYXVzZVdpdGhQcmVJbml0KHRoaXMpLCBMUGFyZW5Mb2MoTFBhcmVuTG9jKSwKKyAgICAgICAgTnVtVGhyZWFkcyhOdW1UaHJlYWRzKSB7CisgICAgc2V0UHJlSW5pdFN0bXQoSGVscGVyTnVtVGhyZWFkcywgQ2FwdHVyZVJlZ2lvbik7CisgIH0KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KKyAgT01QTnVtVGhyZWFkc0NsYXVzZSgpCisgICAgICA6IE9NUENsYXVzZShPTVBDX251bV90aHJlYWRzLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpKSwKKyAgICAgICAgT01QQ2xhdXNlV2l0aFByZUluaXQodGhpcykge30KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIGxvY2F0aW9uIG9mICcoJy4KKyAgdm9pZCBzZXRMUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IExQYXJlbkxvYyA9IExvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBMUGFyZW5Mb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgbnVtYmVyIG9mIHRocmVhZHMuCisgIEV4cHIgKmdldE51bVRocmVhZHMoKSBjb25zdCB7IHJldHVybiBjYXN0X29yX251bGw8RXhwcj4oTnVtVGhyZWFkcyk7IH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsgcmV0dXJuIGNoaWxkX3JhbmdlKCZOdW1UaHJlYWRzLCAmTnVtVGhyZWFkcyArIDEpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfbnVtX3RocmVhZHM7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICdzYWZlbGVuJyBjbGF1c2UgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nCisvLy8gZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBzaW1kIHNhZmVsZW4oNCkKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHNpbWQnIGhhcyBjbGF1c2UgJ3NhZmVsZW4nCisvLy8gd2l0aCBzaW5nbGUgZXhwcmVzc2lvbiAnNCcuCisvLy8gSWYgdGhlIHNhZmVsZW4gY2xhdXNlIGlzIHVzZWQgdGhlbiBubyB0d28gaXRlcmF0aW9ucyBleGVjdXRlZAorLy8vIGNvbmN1cnJlbnRseSB3aXRoIFNJTUQgaW5zdHJ1Y3Rpb25zIGNhbiBoYXZlIGEgZ3JlYXRlciBkaXN0YW5jZQorLy8vIGluIHRoZSBsb2dpY2FsIGl0ZXJhdGlvbiBzcGFjZSB0aGFuIGl0cyB2YWx1ZS4gVGhlIHBhcmFtZXRlciBvZgorLy8vIHRoZSBzYWZlbGVuIGNsYXVzZSBtdXN0IGJlIGEgY29uc3RhbnQgcG9zaXRpdmUgaW50ZWdlciBleHByZXNzaW9uLgorY2xhc3MgT01QU2FmZWxlbkNsYXVzZSA6IHB1YmxpYyBPTVBDbGF1c2UgeworICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOworCisgIC8vLyBcYnJpZWYgTG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2M7CisKKyAgLy8vIFxicmllZiBTYWZlIGl0ZXJhdGlvbiBzcGFjZSBkaXN0YW5jZS4KKyAgU3RtdCAqU2FmZWxlbiA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBTZXQgc2FmZWxlbi4KKyAgdm9pZCBzZXRTYWZlbGVuKEV4cHIgKkxlbikgeyBTYWZlbGVuID0gTGVuOyB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBCdWlsZCAnc2FmZWxlbicgY2xhdXNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBMZW4gRXhwcmVzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGF1c2UuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIE9NUFNhZmVsZW5DbGF1c2UoRXhwciAqTGVuLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfc2FmZWxlbiwgU3RhcnRMb2MsIEVuZExvYyksIExQYXJlbkxvYyhMUGFyZW5Mb2MpLAorICAgICAgICBTYWZlbGVuKExlbikge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KKyAgZXhwbGljaXQgT01QU2FmZWxlbkNsYXVzZSgpCisgICAgICA6IE9NUENsYXVzZShPTVBDX3NhZmVsZW4sIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpIHt9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBsb2NhdGlvbiBvZiAnKCcuCisgIHZvaWQgc2V0TFBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBMUGFyZW5Mb2MgPSBMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gZ2V0TFBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gTFBhcmVuTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gc2FmZSBpdGVyYXRpb24gc3BhY2UgZGlzdGFuY2UuCisgIEV4cHIgKmdldFNhZmVsZW4oKSBjb25zdCB7IHJldHVybiBjYXN0X29yX251bGw8RXhwcj4oU2FmZWxlbik7IH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsgcmV0dXJuIGNoaWxkX3JhbmdlKCZTYWZlbGVuLCAmU2FmZWxlbiArIDEpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfc2FmZWxlbjsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJ3NpbWRsZW4nIGNsYXVzZSBpbiB0aGUgJyNwcmFnbWEgb21wIC4uLicKKy8vLyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHNpbWQgc2ltZGxlbig0KQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgc2ltZCcgaGFzIGNsYXVzZSAnc2ltZGxlbicKKy8vLyB3aXRoIHNpbmdsZSBleHByZXNzaW9uICc0Jy4KKy8vLyBJZiB0aGUgJ3NpbWRsZW4nIGNsYXVzZSBpcyB1c2VkIHRoZW4gaXQgc3BlY2lmaWVzIHRoZSBwcmVmZXJyZWQgbnVtYmVyIG9mCisvLy8gaXRlcmF0aW9ucyB0byBiZSBleGVjdXRlZCBjb25jdXJyZW50bHkuIFRoZSBwYXJhbWV0ZXIgb2YgdGhlICdzaW1kbGVuJworLy8vIGNsYXVzZSBtdXN0IGJlIGEgY29uc3RhbnQgcG9zaXRpdmUgaW50ZWdlciBleHByZXNzaW9uLgorY2xhc3MgT01QU2ltZGxlbkNsYXVzZSA6IHB1YmxpYyBPTVBDbGF1c2UgeworICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOworCisgIC8vLyBcYnJpZWYgTG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2M7CisKKyAgLy8vIFxicmllZiBTYWZlIGl0ZXJhdGlvbiBzcGFjZSBkaXN0YW5jZS4KKyAgU3RtdCAqU2ltZGxlbiA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBTZXQgc2ltZGxlbi4KKyAgdm9pZCBzZXRTaW1kbGVuKEV4cHIgKkxlbikgeyBTaW1kbGVuID0gTGVuOyB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBCdWlsZCAnc2ltZGxlbicgY2xhdXNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBMZW4gRXhwcmVzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGF1c2UuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIE9NUFNpbWRsZW5DbGF1c2UoRXhwciAqTGVuLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfc2ltZGxlbiwgU3RhcnRMb2MsIEVuZExvYyksIExQYXJlbkxvYyhMUGFyZW5Mb2MpLAorICAgICAgICBTaW1kbGVuKExlbikge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KKyAgZXhwbGljaXQgT01QU2ltZGxlbkNsYXVzZSgpCisgICAgICA6IE9NUENsYXVzZShPTVBDX3NpbWRsZW4sIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpIHt9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBsb2NhdGlvbiBvZiAnKCcuCisgIHZvaWQgc2V0TFBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBMUGFyZW5Mb2MgPSBMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gZ2V0TFBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gTFBhcmVuTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gc2FmZSBpdGVyYXRpb24gc3BhY2UgZGlzdGFuY2UuCisgIEV4cHIgKmdldFNpbWRsZW4oKSBjb25zdCB7IHJldHVybiBjYXN0X29yX251bGw8RXhwcj4oU2ltZGxlbik7IH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsgcmV0dXJuIGNoaWxkX3JhbmdlKCZTaW1kbGVuLCAmU2ltZGxlbiArIDEpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfc2ltZGxlbjsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJ2NvbGxhcHNlJyBjbGF1c2UgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nCisvLy8gZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBzaW1kIGNvbGxhcHNlKDMpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBzaW1kJyBoYXMgY2xhdXNlICdjb2xsYXBzZScKKy8vLyB3aXRoIHNpbmdsZSBleHByZXNzaW9uICczJy4KKy8vLyBUaGUgcGFyYW1ldGVyIG11c3QgYmUgYSBjb25zdGFudCBwb3NpdGl2ZSBpbnRlZ2VyIGV4cHJlc3Npb24sIGl0IHNwZWNpZmllcworLy8vIHRoZSBudW1iZXIgb2YgbmVzdGVkIGxvb3BzIHRoYXQgc2hvdWxkIGJlIGNvbGxhcHNlZCBpbnRvIGEgc2luZ2xlIGl0ZXJhdGlvbgorLy8vIHNwYWNlLgorY2xhc3MgT01QQ29sbGFwc2VDbGF1c2UgOiBwdWJsaWMgT01QQ2xhdXNlIHsKKyAgZnJpZW5kIGNsYXNzIE9NUENsYXVzZVJlYWRlcjsKKworICAvLy8gXGJyaWVmIExvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jOworCisgIC8vLyBcYnJpZWYgTnVtYmVyIG9mIGZvci1sb29wcy4KKyAgU3RtdCAqTnVtRm9yTG9vcHMgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBudW1iZXIgb2YgYXNzb2NpYXRlZCBmb3ItbG9vcHMuCisgIHZvaWQgc2V0TnVtRm9yTG9vcHMoRXhwciAqTnVtKSB7IE51bUZvckxvb3BzID0gTnVtOyB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBCdWlsZCAnY29sbGFwc2UnIGNsYXVzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTnVtIEV4cHJlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhdXNlLgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIE9NUENvbGxhcHNlQ2xhdXNlKEV4cHIgKk51bSwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywgU291cmNlTG9jYXRpb24gRW5kTG9jKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ19jb2xsYXBzZSwgU3RhcnRMb2MsIEVuZExvYyksIExQYXJlbkxvYyhMUGFyZW5Mb2MpLAorICAgICAgICBOdW1Gb3JMb29wcyhOdW0pIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIGV4cGxpY2l0IE9NUENvbGxhcHNlQ2xhdXNlKCkKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfY29sbGFwc2UsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpIHt9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBsb2NhdGlvbiBvZiAnKCcuCisgIHZvaWQgc2V0TFBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBMUGFyZW5Mb2MgPSBMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gZ2V0TFBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gTFBhcmVuTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBhc3NvY2lhdGVkIGZvci1sb29wcy4KKyAgRXhwciAqZ2V0TnVtRm9yTG9vcHMoKSBjb25zdCB7IHJldHVybiBjYXN0X29yX251bGw8RXhwcj4oTnVtRm9yTG9vcHMpOyB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7IHJldHVybiBjaGlsZF9yYW5nZSgmTnVtRm9yTG9vcHMsICZOdW1Gb3JMb29wcyArIDEpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfY29sbGFwc2U7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICdkZWZhdWx0JyBjbGF1c2UgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgcGFyYWxsZWwgZGVmYXVsdChzaGFyZWQpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBwYXJhbGxlbCcgaGFzIHNpbXBsZSAnZGVmYXVsdCcKKy8vLyBjbGF1c2Ugd2l0aCBraW5kICdzaGFyZWQnLgorY2xhc3MgT01QRGVmYXVsdENsYXVzZSA6IHB1YmxpYyBPTVBDbGF1c2UgeworICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOworCisgIC8vLyBcYnJpZWYgTG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2M7CisKKyAgLy8vIFxicmllZiBBIGtpbmQgb2YgdGhlICdkZWZhdWx0JyBjbGF1c2UuCisgIE9wZW5NUERlZmF1bHRDbGF1c2VLaW5kIEtpbmQgPSBPTVBDX0RFRkFVTFRfdW5rbm93bjsKKworICAvLy8gXGJyaWVmIFN0YXJ0IGxvY2F0aW9uIG9mIHRoZSBraW5kIGluIHNvdXJjZSBjb2RlLgorICBTb3VyY2VMb2NhdGlvbiBLaW5kS3dMb2M7CisKKyAgLy8vIFxicmllZiBTZXQga2luZCBvZiB0aGUgY2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gSyBBcmd1bWVudCBvZiBjbGF1c2UuCisgIHZvaWQgc2V0RGVmYXVsdEtpbmQoT3Blbk1QRGVmYXVsdENsYXVzZUtpbmQgSykgeyBLaW5kID0gSzsgfQorCisgIC8vLyBcYnJpZWYgU2V0IGFyZ3VtZW50IGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBLTG9jIEFyZ3VtZW50IGxvY2F0aW9uLgorICB2b2lkIHNldERlZmF1bHRLaW5kS3dMb2MoU291cmNlTG9jYXRpb24gS0xvYykgeyBLaW5kS3dMb2MgPSBLTG9jOyB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBCdWlsZCAnZGVmYXVsdCcgY2xhdXNlIHdpdGggYXJndW1lbnQgXGEgQSAoJ25vbmUnIG9yICdzaGFyZWQnKS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQSBBcmd1bWVudCBvZiB0aGUgY2xhdXNlICgnbm9uZScgb3IgJ3NoYXJlZCcpLgorICAvLy8gXHBhcmFtIEFMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGFyZ3VtZW50LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIE9NUERlZmF1bHRDbGF1c2UoT3Blbk1QRGVmYXVsdENsYXVzZUtpbmQgQSwgU291cmNlTG9jYXRpb24gQUxvYywKKyAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfZGVmYXVsdCwgU3RhcnRMb2MsIEVuZExvYyksIExQYXJlbkxvYyhMUGFyZW5Mb2MpLAorICAgICAgICBLaW5kKEEpLCBLaW5kS3dMb2MoQUxvYykge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KKyAgT01QRGVmYXVsdENsYXVzZSgpCisgICAgICA6IE9NUENsYXVzZShPTVBDX2RlZmF1bHQsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpIHt9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBsb2NhdGlvbiBvZiAnKCcuCisgIHZvaWQgc2V0TFBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBMUGFyZW5Mb2MgPSBMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gZ2V0TFBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gTFBhcmVuTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGtpbmQgb2YgdGhlIGNsYXVzZS4KKyAgT3Blbk1QRGVmYXVsdENsYXVzZUtpbmQgZ2V0RGVmYXVsdEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGxvY2F0aW9uIG9mIGNsYXVzZSBraW5kLgorICBTb3VyY2VMb2NhdGlvbiBnZXREZWZhdWx0S2luZEt3TG9jKCkgY29uc3QgeyByZXR1cm4gS2luZEt3TG9jOyB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfZGVmYXVsdDsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJ3Byb2NfYmluZCcgY2xhdXNlIGluIHRoZSAnI3ByYWdtYSBvbXAgLi4uJworLy8vIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJvY19iaW5kKG1hc3RlcikKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHBhcmFsbGVsJyBoYXMgc2ltcGxlICdwcm9jX2JpbmQnCisvLy8gY2xhdXNlIHdpdGgga2luZCAnbWFzdGVyJy4KK2NsYXNzIE9NUFByb2NCaW5kQ2xhdXNlIDogcHVibGljIE9NUENsYXVzZSB7CisgIGZyaWVuZCBjbGFzcyBPTVBDbGF1c2VSZWFkZXI7CisKKyAgLy8vIFxicmllZiBMb2NhdGlvbiBvZiAnKCcuCisgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYzsKKworICAvLy8gXGJyaWVmIEEga2luZCBvZiB0aGUgJ3Byb2NfYmluZCcgY2xhdXNlLgorICBPcGVuTVBQcm9jQmluZENsYXVzZUtpbmQgS2luZCA9IE9NUENfUFJPQ19CSU5EX3Vua25vd247CisKKyAgLy8vIFxicmllZiBTdGFydCBsb2NhdGlvbiBvZiB0aGUga2luZCBpbiBzb3VyY2UgY29kZS4KKyAgU291cmNlTG9jYXRpb24gS2luZEt3TG9jOworCisgIC8vLyBcYnJpZWYgU2V0IGtpbmQgb2YgdGhlIGNsYXVzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gSyBLaW5kIG9mIGNsYXVzZS4KKyAgdm9pZCBzZXRQcm9jQmluZEtpbmQoT3Blbk1QUHJvY0JpbmRDbGF1c2VLaW5kIEspIHsgS2luZCA9IEs7IH0KKworICAvLy8gXGJyaWVmIFNldCBjbGF1c2Uga2luZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gS0xvYyBLaW5kIGxvY2F0aW9uLgorICB2b2lkIHNldFByb2NCaW5kS2luZEt3TG9jKFNvdXJjZUxvY2F0aW9uIEtMb2MpIHsgS2luZEt3TG9jID0gS0xvYzsgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQnVpbGQgJ3Byb2NfYmluZCcgY2xhdXNlIHdpdGggYXJndW1lbnQgXGEgQSAoJ21hc3RlcicsICdjbG9zZScgb3IKKyAgLy8vICAgICAgICAnc3ByZWFkJykuCisgIC8vLworICAvLy8gXHBhcmFtIEEgQXJndW1lbnQgb2YgdGhlIGNsYXVzZSAoJ21hc3RlcicsICdjbG9zZScgb3IgJ3NwcmVhZCcpLgorICAvLy8gXHBhcmFtIEFMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGFyZ3VtZW50LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIE9NUFByb2NCaW5kQ2xhdXNlKE9wZW5NUFByb2NCaW5kQ2xhdXNlS2luZCBBLCBTb3VyY2VMb2NhdGlvbiBBTG9jLAorICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpCisgICAgICA6IE9NUENsYXVzZShPTVBDX3Byb2NfYmluZCwgU3RhcnRMb2MsIEVuZExvYyksIExQYXJlbkxvYyhMUGFyZW5Mb2MpLAorICAgICAgICBLaW5kKEEpLCBLaW5kS3dMb2MoQUxvYykge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KKyAgT01QUHJvY0JpbmRDbGF1c2UoKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ19wcm9jX2JpbmQsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpIHt9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBsb2NhdGlvbiBvZiAnKCcuCisgIHZvaWQgc2V0TFBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBMUGFyZW5Mb2MgPSBMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gZ2V0TFBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gTFBhcmVuTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGtpbmQgb2YgdGhlIGNsYXVzZS4KKyAgT3Blbk1QUHJvY0JpbmRDbGF1c2VLaW5kIGdldFByb2NCaW5kS2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgbG9jYXRpb24gb2YgY2xhdXNlIGtpbmQuCisgIFNvdXJjZUxvY2F0aW9uIGdldFByb2NCaW5kS2luZEt3TG9jKCkgY29uc3QgeyByZXR1cm4gS2luZEt3TG9jOyB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfcHJvY19iaW5kOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnc2NoZWR1bGUnIGNsYXVzZSBpbiB0aGUgJyNwcmFnbWEgb21wIC4uLicgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljLCAzKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgZm9yJyBoYXMgJ3NjaGVkdWxlJyBjbGF1c2Ugd2l0aAorLy8vIGFyZ3VtZW50cyAnc3RhdGljJyBhbmQgJzMnLgorY2xhc3MgT01QU2NoZWR1bGVDbGF1c2UgOiBwdWJsaWMgT01QQ2xhdXNlLCBwdWJsaWMgT01QQ2xhdXNlV2l0aFByZUluaXQgeworICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOworCisgIC8vLyBcYnJpZWYgTG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2M7CisKKyAgLy8vIFxicmllZiBBIGtpbmQgb2YgdGhlICdzY2hlZHVsZScgY2xhdXNlLgorICBPcGVuTVBTY2hlZHVsZUNsYXVzZUtpbmQgS2luZCA9IE9NUENfU0NIRURVTEVfdW5rbm93bjsKKworICAvLy8gXGJyaWVmIE1vZGlmaWVycyBmb3IgJ3NjaGVkdWxlJyBjbGF1c2UuCisgIGVudW0ge0ZJUlNULCBTRUNPTkQsIE5VTV9NT0RJRklFUlN9OworICBPcGVuTVBTY2hlZHVsZUNsYXVzZU1vZGlmaWVyIE1vZGlmaWVyc1tOVU1fTU9ESUZJRVJTXTsKKworICAvLy8gXGJyaWVmIExvY2F0aW9ucyBvZiBtb2RpZmllcnMuCisgIFNvdXJjZUxvY2F0aW9uIE1vZGlmaWVyc0xvY1tOVU1fTU9ESUZJRVJTXTsKKworICAvLy8gXGJyaWVmIFN0YXJ0IGxvY2F0aW9uIG9mIHRoZSBzY2hlZHVsZSBpbmQgaW4gc291cmNlIGNvZGUuCisgIFNvdXJjZUxvY2F0aW9uIEtpbmRMb2M7CisKKyAgLy8vIFxicmllZiBMb2NhdGlvbiBvZiAnLCcgKGlmIGFueSkuCisgIFNvdXJjZUxvY2F0aW9uIENvbW1hTG9jOworCisgIC8vLyBcYnJpZWYgQ2h1bmsgc2l6ZS4KKyAgRXhwciAqQ2h1bmtTaXplID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFNldCBzY2hlZHVsZSBraW5kLgorICAvLy8KKyAgLy8vIFxwYXJhbSBLIFNjaGVkdWxlIGtpbmQuCisgIHZvaWQgc2V0U2NoZWR1bGVLaW5kKE9wZW5NUFNjaGVkdWxlQ2xhdXNlS2luZCBLKSB7IEtpbmQgPSBLOyB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGZpcnN0IHNjaGVkdWxlIG1vZGlmaWVyLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNIFNjaGVkdWxlIG1vZGlmaWVyLgorICB2b2lkIHNldEZpcnN0U2NoZWR1bGVNb2RpZmllcihPcGVuTVBTY2hlZHVsZUNsYXVzZU1vZGlmaWVyIE0pIHsKKyAgICBNb2RpZmllcnNbRklSU1RdID0gTTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBzZWNvbmQgc2NoZWR1bGUgbW9kaWZpZXIuCisgIC8vLworICAvLy8gXHBhcmFtIE0gU2NoZWR1bGUgbW9kaWZpZXIuCisgIHZvaWQgc2V0U2Vjb25kU2NoZWR1bGVNb2RpZmllcihPcGVuTVBTY2hlZHVsZUNsYXVzZU1vZGlmaWVyIE0pIHsKKyAgICBNb2RpZmllcnNbU0VDT05EXSA9IE07CisgIH0KKworICAvLy8gXGJyaWVmIFNldCBsb2NhdGlvbiBvZiB0aGUgZmlyc3Qgc2NoZWR1bGUgbW9kaWZpZXIuCisgIHZvaWQgc2V0Rmlyc3RTY2hlZHVsZU1vZGlmaWVyTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIE1vZGlmaWVyc0xvY1tGSVJTVF0gPSBMb2M7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCBsb2NhdGlvbiBvZiB0aGUgc2Vjb25kIHNjaGVkdWxlIG1vZGlmaWVyLgorICB2b2lkIHNldFNlY29uZFNjaGVkdWxlTW9kaWZpZXJMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgTW9kaWZpZXJzTG9jW1NFQ09ORF0gPSBMb2M7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCBzY2hlZHVsZSBtb2RpZmllciBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gTSBTY2hlZHVsZSBtb2RpZmllciBsb2NhdGlvbi4KKyAgdm9pZCBzZXRTY2hlZHVsZU1vZGlmZXIoT3Blbk1QU2NoZWR1bGVDbGF1c2VNb2RpZmllciBNKSB7CisgICAgaWYgKE1vZGlmaWVyc1tGSVJTVF0gPT0gT01QQ19TQ0hFRFVMRV9NT0RJRklFUl91bmtub3duKQorICAgICAgTW9kaWZpZXJzW0ZJUlNUXSA9IE07CisgICAgZWxzZSB7CisgICAgICBhc3NlcnQoTW9kaWZpZXJzW1NFQ09ORF0gPT0gT01QQ19TQ0hFRFVMRV9NT0RJRklFUl91bmtub3duKTsKKyAgICAgIE1vZGlmaWVyc1tTRUNPTkRdID0gTTsKKyAgICB9CisgIH0KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIGxvY2F0aW9uIG9mICcoJy4KKyAgLy8vCisgIC8vLyBccGFyYW0gTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgdm9pZCBzZXRMUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IExQYXJlbkxvYyA9IExvYzsgfQorCisgIC8vLyBcYnJpZWYgU2V0IHNjaGVkdWxlIGtpbmQgc3RhcnQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIEtMb2MgU2NoZWR1bGUga2luZCBsb2NhdGlvbi4KKyAgdm9pZCBzZXRTY2hlZHVsZUtpbmRMb2MoU291cmNlTG9jYXRpb24gS0xvYykgeyBLaW5kTG9jID0gS0xvYzsgfQorCisgIC8vLyBcYnJpZWYgU2V0IGxvY2F0aW9uIG9mICcsJy4KKyAgLy8vCisgIC8vLyBccGFyYW0gTG9jIExvY2F0aW9uIG9mICcsJy4KKyAgdm9pZCBzZXRDb21tYUxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgQ29tbWFMb2MgPSBMb2M7IH0KKworICAvLy8gXGJyaWVmIFNldCBjaHVuayBzaXplLgorICAvLy8KKyAgLy8vIFxwYXJhbSBFIENodW5rIHNpemUuCisgIHZvaWQgc2V0Q2h1bmtTaXplKEV4cHIgKkUpIHsgQ2h1bmtTaXplID0gRTsgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQnVpbGQgJ3NjaGVkdWxlJyBjbGF1c2Ugd2l0aCBzY2hlZHVsZSBraW5kIFxhIEtpbmQgYW5kIGNodW5rIHNpemUKKyAgLy8vIGV4cHJlc3Npb24gXGEgQ2h1bmtTaXplLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCisgIC8vLyBccGFyYW0gS0xvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgYXJndW1lbnQuCisgIC8vLyBccGFyYW0gQ29tbWFMb2MgTG9jYXRpb24gb2YgJywnLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBLaW5kIFNjaGVkdWxlIGtpbmQuCisgIC8vLyBccGFyYW0gQ2h1bmtTaXplIENodW5rIHNpemUuCisgIC8vLyBccGFyYW0gSGVscGVyQ2h1bmtTaXplIEhlbHBlciBjaHVuayBzaXplIGZvciBjb21iaW5lZCBkaXJlY3RpdmVzLgorICAvLy8gXHBhcmFtIE0xIFRoZSBmaXJzdCBtb2RpZmllciBhcHBsaWVkIHRvICdzY2hlZHVsZScgY2xhdXNlLgorICAvLy8gXHBhcmFtIE0xTG9jIExvY2F0aW9uIG9mIHRoZSBmaXJzdCBtb2RpZmllcgorICAvLy8gXHBhcmFtIE0yIFRoZSBzZWNvbmQgbW9kaWZpZXIgYXBwbGllZCB0byAnc2NoZWR1bGUnIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBNMkxvYyBMb2NhdGlvbiBvZiB0aGUgc2Vjb25kIG1vZGlmaWVyCisgIE9NUFNjaGVkdWxlQ2xhdXNlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEtMb2MsIFNvdXJjZUxvY2F0aW9uIENvbW1hTG9jLAorICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsIE9wZW5NUFNjaGVkdWxlQ2xhdXNlS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICBFeHByICpDaHVua1NpemUsIFN0bXQgKkhlbHBlckNodW5rU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgT3Blbk1QU2NoZWR1bGVDbGF1c2VNb2RpZmllciBNMSwgU291cmNlTG9jYXRpb24gTTFMb2MsCisgICAgICAgICAgICAgICAgICAgIE9wZW5NUFNjaGVkdWxlQ2xhdXNlTW9kaWZpZXIgTTIsIFNvdXJjZUxvY2F0aW9uIE0yTG9jKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ19zY2hlZHVsZSwgU3RhcnRMb2MsIEVuZExvYyksIE9NUENsYXVzZVdpdGhQcmVJbml0KHRoaXMpLAorICAgICAgICBMUGFyZW5Mb2MoTFBhcmVuTG9jKSwgS2luZChLaW5kKSwgS2luZExvYyhLTG9jKSwgQ29tbWFMb2MoQ29tbWFMb2MpLAorICAgICAgICBDaHVua1NpemUoQ2h1bmtTaXplKSB7CisgICAgc2V0UHJlSW5pdFN0bXQoSGVscGVyQ2h1bmtTaXplKTsKKyAgICBNb2RpZmllcnNbRklSU1RdID0gTTE7CisgICAgTW9kaWZpZXJzW1NFQ09ORF0gPSBNMjsKKyAgICBNb2RpZmllcnNMb2NbRklSU1RdID0gTTFMb2M7CisgICAgTW9kaWZpZXJzTG9jW1NFQ09ORF0gPSBNMkxvYzsKKyAgfQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICBleHBsaWNpdCBPTVBTY2hlZHVsZUNsYXVzZSgpCisgICAgICA6IE9NUENsYXVzZShPTVBDX3NjaGVkdWxlLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpKSwKKyAgICAgICAgT01QQ2xhdXNlV2l0aFByZUluaXQodGhpcykgeworICAgIE1vZGlmaWVyc1tGSVJTVF0gPSBPTVBDX1NDSEVEVUxFX01PRElGSUVSX3Vua25vd247CisgICAgTW9kaWZpZXJzW1NFQ09ORF0gPSBPTVBDX1NDSEVEVUxFX01PRElGSUVSX3Vua25vd247CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBraW5kIG9mIHRoZSBjbGF1c2UuCisgIE9wZW5NUFNjaGVkdWxlQ2xhdXNlS2luZCBnZXRTY2hlZHVsZUtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGZpcnN0IG1vZGlmaWVyIG9mIHRoZSBjbGF1c2UuCisgIE9wZW5NUFNjaGVkdWxlQ2xhdXNlTW9kaWZpZXIgZ2V0Rmlyc3RTY2hlZHVsZU1vZGlmaWVyKCkgY29uc3QgeworICAgIHJldHVybiBNb2RpZmllcnNbRklSU1RdOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHNlY29uZCBtb2RpZmllciBvZiB0aGUgY2xhdXNlLgorICBPcGVuTVBTY2hlZHVsZUNsYXVzZU1vZGlmaWVyIGdldFNlY29uZFNjaGVkdWxlTW9kaWZpZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIE1vZGlmaWVyc1tTRUNPTkRdOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgbG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMUGFyZW5Mb2MoKSB7IHJldHVybiBMUGFyZW5Mb2M7IH0KKworICAvLy8gXGJyaWVmIEdldCBraW5kIGxvY2F0aW9uLgorICBTb3VyY2VMb2NhdGlvbiBnZXRTY2hlZHVsZUtpbmRMb2MoKSB7IHJldHVybiBLaW5kTG9jOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGZpcnN0IG1vZGlmaWVyIGxvY2F0aW9uLgorICBTb3VyY2VMb2NhdGlvbiBnZXRGaXJzdFNjaGVkdWxlTW9kaWZpZXJMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIE1vZGlmaWVyc0xvY1tGSVJTVF07CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgc2Vjb25kIG1vZGlmaWVyIGxvY2F0aW9uLgorICBTb3VyY2VMb2NhdGlvbiBnZXRTZWNvbmRTY2hlZHVsZU1vZGlmaWVyTG9jKCkgY29uc3QgeworICAgIHJldHVybiBNb2RpZmllcnNMb2NbU0VDT05EXTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGxvY2F0aW9uIG9mICcsJy4KKyAgU291cmNlTG9jYXRpb24gZ2V0Q29tbWFMb2MoKSB7IHJldHVybiBDb21tYUxvYzsgfQorCisgIC8vLyBcYnJpZWYgR2V0IGNodW5rIHNpemUuCisgIEV4cHIgKmdldENodW5rU2l6ZSgpIHsgcmV0dXJuIENodW5rU2l6ZTsgfQorCisgIC8vLyBcYnJpZWYgR2V0IGNodW5rIHNpemUuCisgIGNvbnN0IEV4cHIgKmdldENodW5rU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIENodW5rU2l6ZTsgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShyZWludGVycHJldF9jYXN0PFN0bXQgKio+KCZDaHVua1NpemUpLAorICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFN0bXQgKio+KCZDaHVua1NpemUpICsgMSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgeworICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ19zY2hlZHVsZTsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJ29yZGVyZWQnIGNsYXVzZSBpbiB0aGUgJyNwcmFnbWEgb21wIC4uLicgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBmb3Igb3JkZXJlZCAoMikKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIGZvcicgaGFzICdvcmRlcmVkJyBjbGF1c2Ugd2l0aAorLy8vIHBhcmFtZXRlciAyLgorY2xhc3MgT01QT3JkZXJlZENsYXVzZSA6IHB1YmxpYyBPTVBDbGF1c2UgeworICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOworCisgIC8vLyBcYnJpZWYgTG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2M7CisKKyAgLy8vIFxicmllZiBOdW1iZXIgb2YgZm9yLWxvb3BzLgorICBTdG10ICpOdW1Gb3JMb29wcyA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIG51bWJlciBvZiBhc3NvY2lhdGVkIGZvci1sb29wcy4KKyAgdm9pZCBzZXROdW1Gb3JMb29wcyhFeHByICpOdW0pIHsgTnVtRm9yTG9vcHMgPSBOdW07IH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIEJ1aWxkICdvcmRlcmVkJyBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIE51bSBFeHByZXNzaW9uLCBwb3NzaWJseSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGF1c2UuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBMUGFyZW5Mb2MgTG9jYXRpb24gb2YgJygnLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgT01QT3JkZXJlZENsYXVzZShFeHByICpOdW0sIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfb3JkZXJlZCwgU3RhcnRMb2MsIEVuZExvYyksIExQYXJlbkxvYyhMUGFyZW5Mb2MpLAorICAgICAgICBOdW1Gb3JMb29wcyhOdW0pIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIGV4cGxpY2l0IE9NUE9yZGVyZWRDbGF1c2UoKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ19vcmRlcmVkLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpKSB7fQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbG9jYXRpb24gb2YgJygnLgorICB2b2lkIHNldExQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgTFBhcmVuTG9jID0gTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiAnKCcuCisgIFNvdXJjZUxvY2F0aW9uIGdldExQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIExQYXJlbkxvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgYXNzb2NpYXRlZCBmb3ItbG9vcHMuCisgIEV4cHIgKmdldE51bUZvckxvb3BzKCkgY29uc3QgeyByZXR1cm4gY2FzdF9vcl9udWxsPEV4cHI+KE51bUZvckxvb3BzKTsgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoJk51bUZvckxvb3BzLCAmTnVtRm9yTG9vcHMgKyAxKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldENsYXVzZUtpbmQoKSA9PSBPTVBDX29yZGVyZWQ7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICdub3dhaXQnIGNsYXVzZSBpbiB0aGUgJyNwcmFnbWEgb21wIC4uLicgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBmb3Igbm93YWl0CisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBmb3InIGhhcyAnbm93YWl0JyBjbGF1c2UuCitjbGFzcyBPTVBOb3dhaXRDbGF1c2UgOiBwdWJsaWMgT01QQ2xhdXNlIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBCdWlsZCAnbm93YWl0JyBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICBPTVBOb3dhaXRDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfbm93YWl0LCBTdGFydExvYywgRW5kTG9jKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICBPTVBOb3dhaXRDbGF1c2UoKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ19ub3dhaXQsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpIHt9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfbm93YWl0OworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAndW50aWVkJyBjbGF1c2UgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgdGFzayB1bnRpZWQKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRhc2snIGhhcyAndW50aWVkJyBjbGF1c2UuCitjbGFzcyBPTVBVbnRpZWRDbGF1c2UgOiBwdWJsaWMgT01QQ2xhdXNlIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBCdWlsZCAndW50aWVkJyBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICBPTVBVbnRpZWRDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfdW50aWVkLCBTdGFydExvYywgRW5kTG9jKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICBPTVBVbnRpZWRDbGF1c2UoKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ191bnRpZWQsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpIHt9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfdW50aWVkOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnbWVyZ2VhYmxlJyBjbGF1c2UgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nCisvLy8gZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCB0YXNrIG1lcmdlYWJsZQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgdGFzaycgaGFzICdtZXJnZWFibGUnIGNsYXVzZS4KK2NsYXNzIE9NUE1lcmdlYWJsZUNsYXVzZSA6IHB1YmxpYyBPTVBDbGF1c2UgeworcHVibGljOgorICAvLy8gXGJyaWVmIEJ1aWxkICdtZXJnZWFibGUnIGNsYXVzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIE9NUE1lcmdlYWJsZUNsYXVzZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ19tZXJnZWFibGUsIFN0YXJ0TG9jLCBFbmRMb2MpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIE9NUE1lcmdlYWJsZUNsYXVzZSgpCisgICAgICA6IE9NUENsYXVzZShPTVBDX21lcmdlYWJsZSwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSkge30KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoY2hpbGRfaXRlcmF0b3IoKSwgY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgeworICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ19tZXJnZWFibGU7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICdyZWFkJyBjbGF1c2UgaW4gdGhlICcjcHJhZ21hIG9tcCBhdG9taWMnIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgYXRvbWljIHJlYWQKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIGF0b21pYycgaGFzICdyZWFkJyBjbGF1c2UuCitjbGFzcyBPTVBSZWFkQ2xhdXNlIDogcHVibGljIE9NUENsYXVzZSB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQnVpbGQgJ3JlYWQnIGNsYXVzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIE9NUFJlYWRDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfcmVhZCwgU3RhcnRMb2MsIEVuZExvYykge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KKyAgT01QUmVhZENsYXVzZSgpIDogT01QQ2xhdXNlKE9NUENfcmVhZCwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSkge30KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoY2hpbGRfaXRlcmF0b3IoKSwgY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgeworICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ19yZWFkOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnd3JpdGUnIGNsYXVzZSBpbiB0aGUgJyNwcmFnbWEgb21wIGF0b21pYycgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBhdG9taWMgd3JpdGUKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIGF0b21pYycgaGFzICd3cml0ZScgY2xhdXNlLgorY2xhc3MgT01QV3JpdGVDbGF1c2UgOiBwdWJsaWMgT01QQ2xhdXNlIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBCdWlsZCAnd3JpdGUnIGNsYXVzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIE9NUFdyaXRlQ2xhdXNlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpCisgICAgICA6IE9NUENsYXVzZShPTVBDX3dyaXRlLCBTdGFydExvYywgRW5kTG9jKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICBPTVBXcml0ZUNsYXVzZSgpCisgICAgICA6IE9NUENsYXVzZShPTVBDX3dyaXRlLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpKSB7fQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldENsYXVzZUtpbmQoKSA9PSBPTVBDX3dyaXRlOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAndXBkYXRlJyBjbGF1c2UgaW4gdGhlICcjcHJhZ21hIG9tcCBhdG9taWMnCisvLy8gZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBhdG9taWMgdXBkYXRlCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBhdG9taWMnIGhhcyAndXBkYXRlJyBjbGF1c2UuCitjbGFzcyBPTVBVcGRhdGVDbGF1c2UgOiBwdWJsaWMgT01QQ2xhdXNlIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBCdWlsZCAndXBkYXRlJyBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICBPTVBVcGRhdGVDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfdXBkYXRlLCBTdGFydExvYywgRW5kTG9jKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICBPTVBVcGRhdGVDbGF1c2UoKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ191cGRhdGUsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpIHt9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfdXBkYXRlOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnY2FwdHVyZScgY2xhdXNlIGluIHRoZSAnI3ByYWdtYSBvbXAgYXRvbWljJworLy8vIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgYXRvbWljIGNhcHR1cmUKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIGF0b21pYycgaGFzICdjYXB0dXJlJyBjbGF1c2UuCitjbGFzcyBPTVBDYXB0dXJlQ2xhdXNlIDogcHVibGljIE9NUENsYXVzZSB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQnVpbGQgJ2NhcHR1cmUnIGNsYXVzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIE9NUENhcHR1cmVDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfY2FwdHVyZSwgU3RhcnRMb2MsIEVuZExvYykge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KKyAgT01QQ2FwdHVyZUNsYXVzZSgpCisgICAgICA6IE9NUENsYXVzZShPTVBDX2NhcHR1cmUsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpIHt9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfY2FwdHVyZTsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJ3NlcV9jc3QnIGNsYXVzZSBpbiB0aGUgJyNwcmFnbWEgb21wIGF0b21pYycKKy8vLyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIGF0b21pYyBzZXFfY3N0CisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBhdG9taWMnIGhhcyAnc2VxX2NzdCcgY2xhdXNlLgorY2xhc3MgT01QU2VxQ3N0Q2xhdXNlIDogcHVibGljIE9NUENsYXVzZSB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQnVpbGQgJ3NlcV9jc3QnIGNsYXVzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIE9NUFNlcUNzdENsYXVzZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ19zZXFfY3N0LCBTdGFydExvYywgRW5kTG9jKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICBPTVBTZXFDc3RDbGF1c2UoKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ19zZXFfY3N0LCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpKSB7fQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldENsYXVzZUtpbmQoKSA9PSBPTVBDX3NlcV9jc3Q7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzIGNsYXVzZSAncHJpdmF0ZScgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nIGRpcmVjdGl2ZXMuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoYSxiKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgcGFyYWxsZWwnIGhhcyBjbGF1c2UgJ3ByaXZhdGUnCisvLy8gd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InLgorY2xhc3MgT01QUHJpdmF0ZUNsYXVzZSBmaW5hbAorICAgIDogcHVibGljIE9NUFZhckxpc3RDbGF1c2U8T01QUHJpdmF0ZUNsYXVzZT4sCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxPTVBQcml2YXRlQ2xhdXNlLCBFeHByICo+IHsKKyAgZnJpZW5kIGNsYXNzIE9NUENsYXVzZVJlYWRlcjsKKyAgZnJpZW5kIE9NUFZhckxpc3RDbGF1c2U7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgLy8vIFxicmllZiBCdWlsZCBjbGF1c2Ugd2l0aCBudW1iZXIgb2YgdmFyaWFibGVzIFxhIE4uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTiBOdW1iZXIgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgY2xhdXNlLgorICBPTVBQcml2YXRlQ2xhdXNlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLCB1bnNpZ25lZCBOKQorICAgICAgOiBPTVBWYXJMaXN0Q2xhdXNlPE9NUFByaXZhdGVDbGF1c2U+KE9NUENfcHJpdmF0ZSwgU3RhcnRMb2MsIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRMb2MsIE4pIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIE4gTnVtYmVyIG9mIHZhcmlhYmxlcy4KKyAgZXhwbGljaXQgT01QUHJpdmF0ZUNsYXVzZSh1bnNpZ25lZCBOKQorICAgICAgOiBPTVBWYXJMaXN0Q2xhdXNlPE9NUFByaXZhdGVDbGF1c2U+KE9NUENfcHJpdmF0ZSwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4pIHt9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gcHJpdmF0ZSBjb3BpZXMgd2l0aCBpbml0aWFsaXplcnMgZm9yCisgIC8vLyBuZXcgcHJpdmF0ZSB2YXJpYWJsZXMuCisgIC8vLyBccGFyYW0gVkwgTGlzdCBvZiByZWZlcmVuY2VzLgorICB2b2lkIHNldFByaXZhdGVDb3BpZXMoQXJyYXlSZWY8RXhwciAqPiBWTCk7CisKKyAgLy8vIFxicmllZiBHZXRzIHRoZSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gcHJpdmF0ZSBjb3BpZXMgd2l0aCBpbml0aWFsaXplcnMgZm9yCisgIC8vLyBuZXcgcHJpdmF0ZSB2YXJpYWJsZXMuCisgIE11dGFibGVBcnJheVJlZjxFeHByICo+IGdldFByaXZhdGVDb3BpZXMoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxFeHByICo+KHZhcmxpc3RfZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorICBBcnJheVJlZjxjb25zdCBFeHByICo+IGdldFByaXZhdGVDb3BpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZih2YXJsaXN0X2VuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgY2xhdXNlIHdpdGggYSBsaXN0IG9mIHZhcmlhYmxlcyBcYSBWTC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIFZMIExpc3Qgb2YgcmVmZXJlbmNlcyB0byB0aGUgdmFyaWFibGVzLgorICAvLy8gXHBhcmFtIFByaXZhdGVWTCBMaXN0IG9mIHJlZmVyZW5jZXMgdG8gcHJpdmF0ZSBjb3BpZXMgd2l0aCBpbml0aWFsaXplcnMuCisgIHN0YXRpYyBPTVBQcml2YXRlQ2xhdXNlICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywgQXJyYXlSZWY8RXhwciAqPiBWTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IFByaXZhdGVWTCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGNsYXVzZSB3aXRoIHRoZSBwbGFjZSBmb3IgXGEgTiB2YXJpYWJsZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gTiBUaGUgbnVtYmVyIG9mIHZhcmlhYmxlcy4KKyAgc3RhdGljIE9NUFByaXZhdGVDbGF1c2UgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE4pOworCisgIHVzaW5nIHByaXZhdGVfY29waWVzX2l0ZXJhdG9yID0gTXV0YWJsZUFycmF5UmVmPEV4cHIgKj46Oml0ZXJhdG9yOworICB1c2luZyBwcml2YXRlX2NvcGllc19jb25zdF9pdGVyYXRvciA9IEFycmF5UmVmPGNvbnN0IEV4cHIgKj46Oml0ZXJhdG9yOworICB1c2luZyBwcml2YXRlX2NvcGllc19yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPHByaXZhdGVfY29waWVzX2l0ZXJhdG9yPjsKKyAgdXNpbmcgcHJpdmF0ZV9jb3BpZXNfY29uc3RfcmFuZ2UgPQorICAgICAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8cHJpdmF0ZV9jb3BpZXNfY29uc3RfaXRlcmF0b3I+OworCisgIHByaXZhdGVfY29waWVzX3JhbmdlIHByaXZhdGVfY29waWVzKCkgeworICAgIHJldHVybiBwcml2YXRlX2NvcGllc19yYW5nZShnZXRQcml2YXRlQ29waWVzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJpdmF0ZUNvcGllcygpLmVuZCgpKTsKKyAgfQorCisgIHByaXZhdGVfY29waWVzX2NvbnN0X3JhbmdlIHByaXZhdGVfY29waWVzKCkgY29uc3QgeworICAgIHJldHVybiBwcml2YXRlX2NvcGllc19jb25zdF9yYW5nZShnZXRQcml2YXRlQ29waWVzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJpdmF0ZUNvcGllcygpLmVuZCgpKTsKKyAgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShyZWludGVycHJldF9jYXN0PFN0bXQgKio+KHZhcmxpc3RfYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9lbmQoKSkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfcHJpdmF0ZTsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgY2xhdXNlICdmaXJzdHByaXZhdGUnIGluIHRoZSAnI3ByYWdtYSBvbXAgLi4uJworLy8vIGRpcmVjdGl2ZXMuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZShhLGIpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBwYXJhbGxlbCcgaGFzIGNsYXVzZSAnZmlyc3Rwcml2YXRlJworLy8vIHdpdGggdGhlIHZhcmlhYmxlcyAnYScgYW5kICdiJy4KK2NsYXNzIE9NUEZpcnN0cHJpdmF0ZUNsYXVzZSBmaW5hbAorICAgIDogcHVibGljIE9NUFZhckxpc3RDbGF1c2U8T01QRmlyc3Rwcml2YXRlQ2xhdXNlPiwKKyAgICAgIHB1YmxpYyBPTVBDbGF1c2VXaXRoUHJlSW5pdCwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPE9NUEZpcnN0cHJpdmF0ZUNsYXVzZSwgRXhwciAqPiB7CisgIGZyaWVuZCBjbGFzcyBPTVBDbGF1c2VSZWFkZXI7CisgIGZyaWVuZCBPTVBWYXJMaXN0Q2xhdXNlOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIC8vLyBcYnJpZWYgQnVpbGQgY2xhdXNlIHdpdGggbnVtYmVyIG9mIHZhcmlhYmxlcyBcYSBOLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIE4gTnVtYmVyIG9mIHRoZSB2YXJpYWJsZXMgaW4gdGhlIGNsYXVzZS4KKyAgT01QRmlyc3Rwcml2YXRlQ2xhdXNlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsIHVuc2lnbmVkIE4pCisgICAgICA6IE9NUFZhckxpc3RDbGF1c2U8T01QRmlyc3Rwcml2YXRlQ2xhdXNlPihPTVBDX2ZpcnN0cHJpdmF0ZSwgU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUGFyZW5Mb2MsIEVuZExvYywgTiksCisgICAgICAgIE9NUENsYXVzZVdpdGhQcmVJbml0KHRoaXMpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIE4gTnVtYmVyIG9mIHZhcmlhYmxlcy4KKyAgZXhwbGljaXQgT01QRmlyc3Rwcml2YXRlQ2xhdXNlKHVuc2lnbmVkIE4pCisgICAgICA6IE9NUFZhckxpc3RDbGF1c2U8T01QRmlyc3Rwcml2YXRlQ2xhdXNlPigKKyAgICAgICAgICAgIE9NUENfZmlyc3Rwcml2YXRlLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgTiksCisgICAgICAgIE9NUENsYXVzZVdpdGhQcmVJbml0KHRoaXMpIHt9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gcHJpdmF0ZSBjb3BpZXMgd2l0aCBpbml0aWFsaXplcnMgZm9yCisgIC8vLyBuZXcgcHJpdmF0ZSB2YXJpYWJsZXMuCisgIC8vLyBccGFyYW0gVkwgTGlzdCBvZiByZWZlcmVuY2VzLgorICB2b2lkIHNldFByaXZhdGVDb3BpZXMoQXJyYXlSZWY8RXhwciAqPiBWTCk7CisKKyAgLy8vIFxicmllZiBHZXRzIHRoZSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gcHJpdmF0ZSBjb3BpZXMgd2l0aCBpbml0aWFsaXplcnMgZm9yCisgIC8vLyBuZXcgcHJpdmF0ZSB2YXJpYWJsZXMuCisgIE11dGFibGVBcnJheVJlZjxFeHByICo+IGdldFByaXZhdGVDb3BpZXMoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxFeHByICo+KHZhcmxpc3RfZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorICBBcnJheVJlZjxjb25zdCBFeHByICo+IGdldFByaXZhdGVDb3BpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZih2YXJsaXN0X2VuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIGxpc3Qgb2YgcmVmZXJlbmNlcyB0byBpbml0aWFsaXplciB2YXJpYWJsZXMgZm9yIG5ldworICAvLy8gcHJpdmF0ZSB2YXJpYWJsZXMuCisgIC8vLyBccGFyYW0gVkwgTGlzdCBvZiByZWZlcmVuY2VzLgorICB2b2lkIHNldEluaXRzKEFycmF5UmVmPEV4cHIgKj4gVkwpOworCisgIC8vLyBcYnJpZWYgR2V0cyB0aGUgbGlzdCBvZiByZWZlcmVuY2VzIHRvIGluaXRpYWxpemVyIHZhcmlhYmxlcyBmb3IgbmV3CisgIC8vLyBwcml2YXRlIHZhcmlhYmxlcy4KKyAgTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4gZ2V0SW5pdHMoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxFeHByICo+KGdldFByaXZhdGVDb3BpZXMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisgIEFycmF5UmVmPGNvbnN0IEV4cHIgKj4gZ2V0SW5pdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZihnZXRQcml2YXRlQ29waWVzKCkuZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBjbGF1c2Ugd2l0aCBhIGxpc3Qgb2YgdmFyaWFibGVzIFxhIFZMLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gVkwgTGlzdCBvZiByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbCB2YXJpYWJsZXMuCisgIC8vLyBccGFyYW0gUHJpdmF0ZVZMIExpc3Qgb2YgcmVmZXJlbmNlcyB0byBwcml2YXRlIGNvcGllcyB3aXRoIGluaXRpYWxpemVycy4KKyAgLy8vIFxwYXJhbSBJbml0VkwgTGlzdCBvZiByZWZlcmVuY2VzIHRvIGF1dG8gZ2VuZXJhdGVkIHZhcmlhYmxlcyB1c2VkIGZvcgorICAvLy8gaW5pdGlhbGl6YXRpb24gb2YgYSBzaW5nbGUgYXJyYXkgZWxlbWVudC4gVXNlZCBpZiBmaXJzdHByaXZhdGUgdmFyaWFibGUgaXMKKyAgLy8vIG9mIGFycmF5IHR5cGUuCisgIC8vLyBccGFyYW0gUHJlSW5pdCBTdGF0ZW1lbnQgdGhhdCBtdXN0IGJlIGV4ZWN1dGVkIGJlZm9yZSBlbnRlcmluZyB0aGUgT3Blbk1QCisgIC8vLyByZWdpb24gd2l0aCB0aGlzIGNsYXVzZS4KKyAgc3RhdGljIE9NUEZpcnN0cHJpdmF0ZUNsYXVzZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLCBBcnJheVJlZjxFeHByICo+IFZMLCBBcnJheVJlZjxFeHByICo+IFByaXZhdGVWTCwKKyAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gSW5pdFZMLCBTdG10ICpQcmVJbml0KTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgY2xhdXNlIHdpdGggdGhlIHBsYWNlIGZvciBcYSBOIHZhcmlhYmxlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBOIFRoZSBudW1iZXIgb2YgdmFyaWFibGVzLgorICBzdGF0aWMgT01QRmlyc3Rwcml2YXRlQ2xhdXNlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBOKTsKKworICB1c2luZyBwcml2YXRlX2NvcGllc19pdGVyYXRvciA9IE11dGFibGVBcnJheVJlZjxFeHByICo+OjppdGVyYXRvcjsKKyAgdXNpbmcgcHJpdmF0ZV9jb3BpZXNfY29uc3RfaXRlcmF0b3IgPSBBcnJheVJlZjxjb25zdCBFeHByICo+OjppdGVyYXRvcjsKKyAgdXNpbmcgcHJpdmF0ZV9jb3BpZXNfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxwcml2YXRlX2NvcGllc19pdGVyYXRvcj47CisgIHVzaW5nIHByaXZhdGVfY29waWVzX2NvbnN0X3JhbmdlID0KKyAgICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHByaXZhdGVfY29waWVzX2NvbnN0X2l0ZXJhdG9yPjsKKworICBwcml2YXRlX2NvcGllc19yYW5nZSBwcml2YXRlX2NvcGllcygpIHsKKyAgICByZXR1cm4gcHJpdmF0ZV9jb3BpZXNfcmFuZ2UoZ2V0UHJpdmF0ZUNvcGllcygpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFByaXZhdGVDb3BpZXMoKS5lbmQoKSk7CisgIH0KKyAgcHJpdmF0ZV9jb3BpZXNfY29uc3RfcmFuZ2UgcHJpdmF0ZV9jb3BpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHByaXZhdGVfY29waWVzX2NvbnN0X3JhbmdlKGdldFByaXZhdGVDb3BpZXMoKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcml2YXRlQ29waWVzKCkuZW5kKCkpOworICB9CisKKyAgdXNpbmcgaW5pdHNfaXRlcmF0b3IgPSBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIGluaXRzX2NvbnN0X2l0ZXJhdG9yID0gQXJyYXlSZWY8Y29uc3QgRXhwciAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIGluaXRzX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8aW5pdHNfaXRlcmF0b3I+OworICB1c2luZyBpbml0c19jb25zdF9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGluaXRzX2NvbnN0X2l0ZXJhdG9yPjsKKworICBpbml0c19yYW5nZSBpbml0cygpIHsKKyAgICByZXR1cm4gaW5pdHNfcmFuZ2UoZ2V0SW5pdHMoKS5iZWdpbigpLCBnZXRJbml0cygpLmVuZCgpKTsKKyAgfQorICBpbml0c19jb25zdF9yYW5nZSBpbml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gaW5pdHNfY29uc3RfcmFuZ2UoZ2V0SW5pdHMoKS5iZWdpbigpLCBnZXRJbml0cygpLmVuZCgpKTsKKyAgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShyZWludGVycHJldF9jYXN0PFN0bXQgKio+KHZhcmxpc3RfYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9lbmQoKSkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfZmlyc3Rwcml2YXRlOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyBjbGF1c2UgJ2xhc3Rwcml2YXRlJyBpbiB0aGUgJyNwcmFnbWEgb21wIC4uLicKKy8vLyBkaXJlY3RpdmVzLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBzaW1kIGxhc3Rwcml2YXRlKGEsYikKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHNpbWQnIGhhcyBjbGF1c2UgJ2xhc3Rwcml2YXRlJworLy8vIHdpdGggdGhlIHZhcmlhYmxlcyAnYScgYW5kICdiJy4KK2NsYXNzIE9NUExhc3Rwcml2YXRlQ2xhdXNlIGZpbmFsCisgICAgOiBwdWJsaWMgT01QVmFyTGlzdENsYXVzZTxPTVBMYXN0cHJpdmF0ZUNsYXVzZT4sCisgICAgICBwdWJsaWMgT01QQ2xhdXNlV2l0aFBvc3RVcGRhdGUsCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxPTVBMYXN0cHJpdmF0ZUNsYXVzZSwgRXhwciAqPiB7CisgIC8vIFRoZXJlIGFyZSA0IGFkZGl0aW9uYWwgdGFpbC1hbGxvY2F0ZWQgYXJyYXlzIGF0IHRoZSBlbmQgb2YgdGhlIGNsYXNzOgorICAvLyAxLiBDb250YWlucyBsaXN0IG9mIHBzZXVkbyB2YXJpYWJsZXMgd2l0aCB0aGUgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBmb3IKKyAgLy8gZWFjaCBub24tZmlyc3Rwcml2YXRlIHZhcmlhYmxlcy4gVXNlZCBpbiBjb2RlZ2VuIGZvciBpbml0aWFsaXphdGlvbiBvZgorICAvLyBsYXN0cHJpdmF0ZSBjb3BpZXMuCisgIC8vIDIuIExpc3Qgb2YgaGVscGVyIGV4cHJlc3Npb25zIGZvciBwcm9wZXIgZ2VuZXJhdGlvbiBvZiBhc3NpZ25tZW50IG9wZXJhdGlvbgorICAvLyByZXF1aXJlZCBmb3IgbGFzdHByaXZhdGUgY2xhdXNlLiBUaGlzIGxpc3QgcmVwcmVzZW50cyBwcml2YXRlIHZhcmlhYmxlcworICAvLyAoZm9yIGFycmF5cywgc2luZ2xlIGFycmF5IGVsZW1lbnQpLgorICAvLyAzLiBMaXN0IG9mIGhlbHBlciBleHByZXNzaW9ucyBmb3IgcHJvcGVyIGdlbmVyYXRpb24gb2YgYXNzaWdubWVudCBvcGVyYXRpb24KKyAgLy8gcmVxdWlyZWQgZm9yIGxhc3Rwcml2YXRlIGNsYXVzZS4gVGhpcyBsaXN0IHJlcHJlc2VudHMgb3JpZ2luYWwgdmFyaWFibGVzCisgIC8vIChmb3IgYXJyYXlzLCBzaW5nbGUgYXJyYXkgZWxlbWVudCkuCisgIC8vIDQuIExpc3Qgb2YgaGVscGVyIGV4cHJlc3Npb25zIHRoYXQgcmVwcmVzZW50cyBhc3NpZ25tZW50IG9wZXJhdGlvbjoKKyAgLy8gXGNvZGUKKyAgLy8gRHN0RXhwcnMgPSBTcmNFeHByczsKKyAgLy8gXGVuZGNvZGUKKyAgLy8gUmVxdWlyZWQgZm9yIHByb3BlciBjb2RlZ2VuIG9mIGZpbmFsIGFzc2lnbm1lbnQgcGVyZm9ybWVkIGJ5IHRoZQorICAvLyBsYXN0cHJpdmF0ZSBjbGF1c2UuCisgIGZyaWVuZCBjbGFzcyBPTVBDbGF1c2VSZWFkZXI7CisgIGZyaWVuZCBPTVBWYXJMaXN0Q2xhdXNlOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIC8vLyBcYnJpZWYgQnVpbGQgY2xhdXNlIHdpdGggbnVtYmVyIG9mIHZhcmlhYmxlcyBcYSBOLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIE4gTnVtYmVyIG9mIHRoZSB2YXJpYWJsZXMgaW4gdGhlIGNsYXVzZS4KKyAgT01QTGFzdHByaXZhdGVDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLCB1bnNpZ25lZCBOKQorICAgICAgOiBPTVBWYXJMaXN0Q2xhdXNlPE9NUExhc3Rwcml2YXRlQ2xhdXNlPihPTVBDX2xhc3Rwcml2YXRlLCBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBhcmVuTG9jLCBFbmRMb2MsIE4pLAorICAgICAgICBPTVBDbGF1c2VXaXRoUG9zdFVwZGF0ZSh0aGlzKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOIE51bWJlciBvZiB2YXJpYWJsZXMuCisgIGV4cGxpY2l0IE9NUExhc3Rwcml2YXRlQ2xhdXNlKHVuc2lnbmVkIE4pCisgICAgICA6IE9NUFZhckxpc3RDbGF1c2U8T01QTGFzdHByaXZhdGVDbGF1c2U+KAorICAgICAgICAgICAgT01QQ19sYXN0cHJpdmF0ZSwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIE4pLAorICAgICAgICBPTVBDbGF1c2VXaXRoUG9zdFVwZGF0ZSh0aGlzKSB7fQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBsaXN0IG9mIGhlbHBlciBleHByZXNzaW9ucyBmb3IgaW5pdGlhbGl6YXRpb24gb2YgcHJpdmF0ZQorICAvLy8gY29waWVzIGZvciBsYXN0cHJpdmF0ZSB2YXJpYWJsZXMuCisgIE11dGFibGVBcnJheVJlZjxFeHByICo+IGdldFByaXZhdGVDb3BpZXMoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxFeHByICo+KHZhcmxpc3RfZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorICBBcnJheVJlZjxjb25zdCBFeHByICo+IGdldFByaXZhdGVDb3BpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZih2YXJsaXN0X2VuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCBsaXN0IG9mIGhlbHBlciBleHByZXNzaW9ucywgcmVxdWlyZWQgZm9yIHByb3BlciBjb2RlZ2VuIG9mIHRoZQorICAvLy8gY2xhdXNlLiBUaGVzZSBleHByZXNzaW9ucyByZXByZXNlbnQgcHJpdmF0ZSB2YXJpYWJsZXMgKGZvciBhcnJheXMsIHNpbmdsZQorICAvLy8gYXJyYXkgZWxlbWVudCkgaW4gdGhlIGZpbmFsIGFzc2lnbm1lbnQgc3RhdGVtZW50IHBlcmZvcm1lZCBieSB0aGUKKyAgLy8vIGxhc3Rwcml2YXRlIGNsYXVzZS4KKyAgdm9pZCBzZXRTb3VyY2VFeHBycyhBcnJheVJlZjxFeHByICo+IFNyY0V4cHJzKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgbGlzdCBvZiBoZWxwZXIgc291cmNlIGV4cHJlc3Npb25zLgorICBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPiBnZXRTb3VyY2VFeHBycygpIHsKKyAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4oZ2V0UHJpdmF0ZUNvcGllcygpLmVuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKyAgQXJyYXlSZWY8Y29uc3QgRXhwciAqPiBnZXRTb3VyY2VFeHBycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKGdldFByaXZhdGVDb3BpZXMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgbGlzdCBvZiBoZWxwZXIgZXhwcmVzc2lvbnMsIHJlcXVpcmVkIGZvciBwcm9wZXIgY29kZWdlbiBvZiB0aGUKKyAgLy8vIGNsYXVzZS4gVGhlc2UgZXhwcmVzc2lvbnMgcmVwcmVzZW50IG9yaWdpbmFsIHZhcmlhYmxlcyAoZm9yIGFycmF5cywgc2luZ2xlCisgIC8vLyBhcnJheSBlbGVtZW50KSBpbiB0aGUgZmluYWwgYXNzaWdubWVudCBzdGF0ZW1lbnQgcGVyZm9ybWVkIGJ5IHRoZQorICAvLy8gbGFzdHByaXZhdGUgY2xhdXNlLgorICB2b2lkIHNldERlc3RpbmF0aW9uRXhwcnMoQXJyYXlSZWY8RXhwciAqPiBEc3RFeHBycyk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGxpc3Qgb2YgaGVscGVyIGRlc3RpbmF0aW9uIGV4cHJlc3Npb25zLgorICBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPiBnZXREZXN0aW5hdGlvbkV4cHJzKCkgeworICAgIHJldHVybiBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPihnZXRTb3VyY2VFeHBycygpLmVuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKyAgQXJyYXlSZWY8Y29uc3QgRXhwciAqPiBnZXREZXN0aW5hdGlvbkV4cHJzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoZ2V0U291cmNlRXhwcnMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgbGlzdCBvZiBoZWxwZXIgYXNzaWdubWVudCBleHByZXNzaW9ucywgcmVxdWlyZWQgZm9yIHByb3BlcgorICAvLy8gY29kZWdlbiBvZiB0aGUgY2xhdXNlLiBUaGVzZSBleHByZXNzaW9ucyBhcmUgYXNzaWdubWVudCBleHByZXNzaW9ucyB0aGF0CisgIC8vLyBhc3NpZ24gcHJpdmF0ZSBjb3B5IG9mIHRoZSB2YXJpYWJsZSB0byBvcmlnaW5hbCB2YXJpYWJsZS4KKyAgdm9pZCBzZXRBc3NpZ25tZW50T3BzKEFycmF5UmVmPEV4cHIgKj4gQXNzaWdubWVudE9wcyk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGxpc3Qgb2YgaGVscGVyIGFzc2lnbm1lbnQgZXhwcmVzc2lvbnMuCisgIE11dGFibGVBcnJheVJlZjxFeHByICo+IGdldEFzc2lnbm1lbnRPcHMoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxFeHByICo+KGdldERlc3RpbmF0aW9uRXhwcnMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisgIEFycmF5UmVmPGNvbnN0IEV4cHIgKj4gZ2V0QXNzaWdubWVudE9wcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKGdldERlc3RpbmF0aW9uRXhwcnMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGNsYXVzZSB3aXRoIGEgbGlzdCBvZiB2YXJpYWJsZXMgXGEgVkwuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBMUGFyZW5Mb2MgTG9jYXRpb24gb2YgJygnLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBWTCBMaXN0IG9mIHJlZmVyZW5jZXMgdG8gdGhlIHZhcmlhYmxlcy4KKyAgLy8vIFxwYXJhbSBTcmNFeHBycyBMaXN0IG9mIGhlbHBlciBleHByZXNzaW9ucyBmb3IgcHJvcGVyIGdlbmVyYXRpb24gb2YKKyAgLy8vIGFzc2lnbm1lbnQgb3BlcmF0aW9uIHJlcXVpcmVkIGZvciBsYXN0cHJpdmF0ZSBjbGF1c2UuIFRoaXMgbGlzdCByZXByZXNlbnRzCisgIC8vLyBwcml2YXRlIHZhcmlhYmxlcyAoZm9yIGFycmF5cywgc2luZ2xlIGFycmF5IGVsZW1lbnQpLgorICAvLy8gXHBhcmFtIERzdEV4cHJzIExpc3Qgb2YgaGVscGVyIGV4cHJlc3Npb25zIGZvciBwcm9wZXIgZ2VuZXJhdGlvbiBvZgorICAvLy8gYXNzaWdubWVudCBvcGVyYXRpb24gcmVxdWlyZWQgZm9yIGxhc3Rwcml2YXRlIGNsYXVzZS4gVGhpcyBsaXN0IHJlcHJlc2VudHMKKyAgLy8vIG9yaWdpbmFsIHZhcmlhYmxlcyAoZm9yIGFycmF5cywgc2luZ2xlIGFycmF5IGVsZW1lbnQpLgorICAvLy8gXHBhcmFtIEFzc2lnbm1lbnRPcHMgTGlzdCBvZiBoZWxwZXIgZXhwcmVzc2lvbnMgdGhhdCByZXByZXNlbnRzIGFzc2lnbm1lbnQKKyAgLy8vIG9wZXJhdGlvbjoKKyAgLy8vIFxjb2RlCisgIC8vLyBEc3RFeHBycyA9IFNyY0V4cHJzOworICAvLy8gXGVuZGNvZGUKKyAgLy8vIFJlcXVpcmVkIGZvciBwcm9wZXIgY29kZWdlbiBvZiBmaW5hbCBhc3NpZ25tZW50IHBlcmZvcm1lZCBieSB0aGUKKyAgLy8vIGxhc3Rwcml2YXRlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBQcmVJbml0IFN0YXRlbWVudCB0aGF0IG11c3QgYmUgZXhlY3V0ZWQgYmVmb3JlIGVudGVyaW5nIHRoZSBPcGVuTVAKKyAgLy8vIHJlZ2lvbiB3aXRoIHRoaXMgY2xhdXNlLgorICAvLy8gXHBhcmFtIFBvc3RVcGRhdGUgRXhwcmVzc2lvbiB0aGF0IG11c3QgYmUgZXhlY3V0ZWQgYWZ0ZXIgZXhpdCBmcm9tIHRoZQorICAvLy8gT3Blbk1QIHJlZ2lvbiB3aXRoIHRoaXMgY2xhdXNlLgorICBzdGF0aWMgT01QTGFzdHByaXZhdGVDbGF1c2UgKgorICBDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywgQXJyYXlSZWY8RXhwciAqPiBWTCwgQXJyYXlSZWY8RXhwciAqPiBTcmNFeHBycywKKyAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gRHN0RXhwcnMsIEFycmF5UmVmPEV4cHIgKj4gQXNzaWdubWVudE9wcywKKyAgICAgICAgIFN0bXQgKlByZUluaXQsIEV4cHIgKlBvc3RVcGRhdGUpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBjbGF1c2Ugd2l0aCB0aGUgcGxhY2UgZm9yIFxhIE4gdmFyaWFibGVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIE4gVGhlIG51bWJlciBvZiB2YXJpYWJsZXMuCisgIHN0YXRpYyBPTVBMYXN0cHJpdmF0ZUNsYXVzZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywgdW5zaWduZWQgTik7CisKKyAgdXNpbmcgaGVscGVyX2V4cHJfaXRlcmF0b3IgPSBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIGhlbHBlcl9leHByX2NvbnN0X2l0ZXJhdG9yID0gQXJyYXlSZWY8Y29uc3QgRXhwciAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIGhlbHBlcl9leHByX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8aGVscGVyX2V4cHJfaXRlcmF0b3I+OworICB1c2luZyBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZSA9CisgICAgICBsbHZtOjppdGVyYXRvcl9yYW5nZTxoZWxwZXJfZXhwcl9jb25zdF9pdGVyYXRvcj47CisKKyAgLy8vIFxicmllZiBTZXQgbGlzdCBvZiBoZWxwZXIgZXhwcmVzc2lvbnMsIHJlcXVpcmVkIGZvciBnZW5lcmF0aW9uIG9mIHByaXZhdGUKKyAgLy8vIGNvcGllcyBvZiBvcmlnaW5hbCBsYXN0cHJpdmF0ZSB2YXJpYWJsZXMuCisgIHZvaWQgc2V0UHJpdmF0ZUNvcGllcyhBcnJheVJlZjxFeHByICo+IFByaXZhdGVDb3BpZXMpOworCisgIGhlbHBlcl9leHByX2NvbnN0X3JhbmdlIHByaXZhdGVfY29waWVzKCkgY29uc3QgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZShnZXRQcml2YXRlQ29waWVzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJpdmF0ZUNvcGllcygpLmVuZCgpKTsKKyAgfQorCisgIGhlbHBlcl9leHByX3JhbmdlIHByaXZhdGVfY29waWVzKCkgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9yYW5nZShnZXRQcml2YXRlQ29waWVzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJpdmF0ZUNvcGllcygpLmVuZCgpKTsKKyAgfQorCisgIGhlbHBlcl9leHByX2NvbnN0X3JhbmdlIHNvdXJjZV9leHBycygpIGNvbnN0IHsKKyAgICByZXR1cm4gaGVscGVyX2V4cHJfY29uc3RfcmFuZ2UoZ2V0U291cmNlRXhwcnMoKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTb3VyY2VFeHBycygpLmVuZCgpKTsKKyAgfQorCisgIGhlbHBlcl9leHByX3JhbmdlIHNvdXJjZV9leHBycygpIHsKKyAgICByZXR1cm4gaGVscGVyX2V4cHJfcmFuZ2UoZ2V0U291cmNlRXhwcnMoKS5iZWdpbigpLCBnZXRTb3VyY2VFeHBycygpLmVuZCgpKTsKKyAgfQorCisgIGhlbHBlcl9leHByX2NvbnN0X3JhbmdlIGRlc3RpbmF0aW9uX2V4cHJzKCkgY29uc3QgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZShnZXREZXN0aW5hdGlvbkV4cHJzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVzdGluYXRpb25FeHBycygpLmVuZCgpKTsKKyAgfQorCisgIGhlbHBlcl9leHByX3JhbmdlIGRlc3RpbmF0aW9uX2V4cHJzKCkgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9yYW5nZShnZXREZXN0aW5hdGlvbkV4cHJzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVzdGluYXRpb25FeHBycygpLmVuZCgpKTsKKyAgfQorCisgIGhlbHBlcl9leHByX2NvbnN0X3JhbmdlIGFzc2lnbm1lbnRfb3BzKCkgY29uc3QgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZShnZXRBc3NpZ25tZW50T3BzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QXNzaWdubWVudE9wcygpLmVuZCgpKTsKKyAgfQorCisgIGhlbHBlcl9leHByX3JhbmdlIGFzc2lnbm1lbnRfb3BzKCkgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9yYW5nZShnZXRBc3NpZ25tZW50T3BzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QXNzaWdubWVudE9wcygpLmVuZCgpKTsKKyAgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShyZWludGVycHJldF9jYXN0PFN0bXQgKio+KHZhcmxpc3RfYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9lbmQoKSkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfbGFzdHByaXZhdGU7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzIGNsYXVzZSAnc2hhcmVkJyBpbiB0aGUgJyNwcmFnbWEgb21wIC4uLicgZGlyZWN0aXZlcy4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGEsYikKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHBhcmFsbGVsJyBoYXMgY2xhdXNlICdzaGFyZWQnCisvLy8gd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InLgorY2xhc3MgT01QU2hhcmVkQ2xhdXNlIGZpbmFsCisgICAgOiBwdWJsaWMgT01QVmFyTGlzdENsYXVzZTxPTVBTaGFyZWRDbGF1c2U+LAorICAgICAgcHJpdmF0ZSBsbHZtOjpUcmFpbGluZ09iamVjdHM8T01QU2hhcmVkQ2xhdXNlLCBFeHByICo+IHsKKyAgZnJpZW5kIE9NUFZhckxpc3RDbGF1c2U7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgLy8vIFxicmllZiBCdWlsZCBjbGF1c2Ugd2l0aCBudW1iZXIgb2YgdmFyaWFibGVzIFxhIE4uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTiBOdW1iZXIgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgY2xhdXNlLgorICBPTVBTaGFyZWRDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywgdW5zaWduZWQgTikKKyAgICAgIDogT01QVmFyTGlzdENsYXVzZTxPTVBTaGFyZWRDbGF1c2U+KE9NUENfc2hhcmVkLCBTdGFydExvYywgTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kTG9jLCBOKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOIE51bWJlciBvZiB2YXJpYWJsZXMuCisgIGV4cGxpY2l0IE9NUFNoYXJlZENsYXVzZSh1bnNpZ25lZCBOKQorICAgICAgOiBPTVBWYXJMaXN0Q2xhdXNlPE9NUFNoYXJlZENsYXVzZT4oT01QQ19zaGFyZWQsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTikge30KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgY2xhdXNlIHdpdGggYSBsaXN0IG9mIHZhcmlhYmxlcyBcYSBWTC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIFZMIExpc3Qgb2YgcmVmZXJlbmNlcyB0byB0aGUgdmFyaWFibGVzLgorICBzdGF0aWMgT01QU2hhcmVkQ2xhdXNlICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsIEFycmF5UmVmPEV4cHIgKj4gVkwpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBjbGF1c2Ugd2l0aCBcYSBOIHZhcmlhYmxlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBOIFRoZSBudW1iZXIgb2YgdmFyaWFibGVzLgorICBzdGF0aWMgT01QU2hhcmVkQ2xhdXNlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBOKTsKKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UocmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2JlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFN0bXQgKio+KHZhcmxpc3RfZW5kKCkpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldENsYXVzZUtpbmQoKSA9PSBPTVBDX3NoYXJlZDsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgY2xhdXNlICdyZWR1Y3Rpb24nIGluIHRoZSAnI3ByYWdtYSBvbXAgLi4uJworLy8vIGRpcmVjdGl2ZXMuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHBhcmFsbGVsIHJlZHVjdGlvbigrOmEsYikKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHBhcmFsbGVsJyBoYXMgY2xhdXNlICdyZWR1Y3Rpb24nCisvLy8gd2l0aCBvcGVyYXRvciAnKycgYW5kIHRoZSB2YXJpYWJsZXMgJ2EnIGFuZCAnYicuCitjbGFzcyBPTVBSZWR1Y3Rpb25DbGF1c2UgZmluYWwKKyAgICA6IHB1YmxpYyBPTVBWYXJMaXN0Q2xhdXNlPE9NUFJlZHVjdGlvbkNsYXVzZT4sCisgICAgICBwdWJsaWMgT01QQ2xhdXNlV2l0aFBvc3RVcGRhdGUsCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxPTVBSZWR1Y3Rpb25DbGF1c2UsIEV4cHIgKj4geworICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOworICBmcmllbmQgT01QVmFyTGlzdENsYXVzZTsKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKworICAvLy8gXGJyaWVmIExvY2F0aW9uIG9mICc6Jy4KKyAgU291cmNlTG9jYXRpb24gQ29sb25Mb2M7CisKKyAgLy8vIFxicmllZiBOZXN0ZWQgbmFtZSBzcGVjaWZpZXIgZm9yIEMrKy4KKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2M7CisKKyAgLy8vIFxicmllZiBOYW1lIG9mIGN1c3RvbSBvcGVyYXRvci4KKyAgRGVjbGFyYXRpb25OYW1lSW5mbyBOYW1lSW5mbzsKKworICAvLy8gXGJyaWVmIEJ1aWxkIGNsYXVzZSB3aXRoIG51bWJlciBvZiB2YXJpYWJsZXMgXGEgTi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBMUGFyZW5Mb2MgTG9jYXRpb24gb2YgJygnLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBDb2xvbkxvYyBMb2NhdGlvbiBvZiAnOicuCisgIC8vLyBccGFyYW0gTiBOdW1iZXIgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIFF1YWxpZmllckxvYyBUaGUgbmVzdGVkLW5hbWUgcXVhbGlmaWVyIHdpdGggbG9jYXRpb24gaW5mb3JtYXRpb24KKyAgLy8vIFxwYXJhbSBOYW1lSW5mbyBUaGUgZnVsbCBuYW1lIGluZm8gZm9yIHJlZHVjdGlvbiBpZGVudGlmaWVyLgorICBPTVBSZWR1Y3Rpb25DbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENvbG9uTG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsIHVuc2lnbmVkIE4sCisgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvKQorICAgICAgOiBPTVBWYXJMaXN0Q2xhdXNlPE9NUFJlZHVjdGlvbkNsYXVzZT4oT01QQ19yZWR1Y3Rpb24sIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBhcmVuTG9jLCBFbmRMb2MsIE4pLAorICAgICAgICBPTVBDbGF1c2VXaXRoUG9zdFVwZGF0ZSh0aGlzKSwgQ29sb25Mb2MoQ29sb25Mb2MpLAorICAgICAgICBRdWFsaWZpZXJMb2MoUXVhbGlmaWVyTG9jKSwgTmFtZUluZm8oTmFtZUluZm8pIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIE4gTnVtYmVyIG9mIHZhcmlhYmxlcy4KKyAgZXhwbGljaXQgT01QUmVkdWN0aW9uQ2xhdXNlKHVuc2lnbmVkIE4pCisgICAgICA6IE9NUFZhckxpc3RDbGF1c2U8T01QUmVkdWN0aW9uQ2xhdXNlPihPTVBDX3JlZHVjdGlvbiwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOKSwKKyAgICAgICAgT01QQ2xhdXNlV2l0aFBvc3RVcGRhdGUodGhpcykge30KKworICAvLy8gXGJyaWVmIFNldHMgbG9jYXRpb24gb2YgJzonIHN5bWJvbCBpbiBjbGF1c2UuCisgIHZvaWQgc2V0Q29sb25Mb2MoU291cmNlTG9jYXRpb24gQ0wpIHsgQ29sb25Mb2MgPSBDTDsgfQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbmFtZSBpbmZvIGZvciBzcGVjaWZpZWQgcmVkdWN0aW9uIGlkZW50aWZpZXIuCisgIHZvaWQgc2V0TmFtZUluZm8oRGVjbGFyYXRpb25OYW1lSW5mbyBETkkpIHsgTmFtZUluZm8gPSBETkk7IH0KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIG5lc3RlZCBuYW1lIHNwZWNpZmllci4KKyAgdm9pZCBzZXRRdWFsaWZpZXJMb2MoTmVzdGVkTmFtZVNwZWNpZmllckxvYyBOU0wpIHsgUXVhbGlmaWVyTG9jID0gTlNMOyB9CisKKyAgLy8vIFxicmllZiBTZXQgbGlzdCBvZiBoZWxwZXIgZXhwcmVzc2lvbnMsIHJlcXVpcmVkIGZvciBwcm9wZXIgY29kZWdlbiBvZiB0aGUKKyAgLy8vIGNsYXVzZS4gVGhlc2UgZXhwcmVzc2lvbnMgcmVwcmVzZW50IHByaXZhdGUgY29weSBvZiB0aGUgcmVkdWN0aW9uCisgIC8vLyB2YXJpYWJsZS4KKyAgdm9pZCBzZXRQcml2YXRlcyhBcnJheVJlZjxFeHByICo+IFByaXZhdGVzKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgbGlzdCBvZiBoZWxwZXIgcHJpdmF0ZXMuCisgIE11dGFibGVBcnJheVJlZjxFeHByICo+IGdldFByaXZhdGVzKCkgeworICAgIHJldHVybiBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPih2YXJsaXN0X2VuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKyAgQXJyYXlSZWY8Y29uc3QgRXhwciAqPiBnZXRQcml2YXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKHZhcmxpc3RfZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IGxpc3Qgb2YgaGVscGVyIGV4cHJlc3Npb25zLCByZXF1aXJlZCBmb3IgcHJvcGVyIGNvZGVnZW4gb2YgdGhlCisgIC8vLyBjbGF1c2UuIFRoZXNlIGV4cHJlc3Npb25zIHJlcHJlc2VudCBMSFMgZXhwcmVzc2lvbiBpbiB0aGUgZmluYWwKKyAgLy8vIHJlZHVjdGlvbiBleHByZXNzaW9uIHBlcmZvcm1lZCBieSB0aGUgcmVkdWN0aW9uIGNsYXVzZS4KKyAgdm9pZCBzZXRMSFNFeHBycyhBcnJheVJlZjxFeHByICo+IExIU0V4cHJzKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgbGlzdCBvZiBoZWxwZXIgTEhTIGV4cHJlc3Npb25zLgorICBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPiBnZXRMSFNFeHBycygpIHsKKyAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4oZ2V0UHJpdmF0ZXMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisgIEFycmF5UmVmPGNvbnN0IEV4cHIgKj4gZ2V0TEhTRXhwcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZihnZXRQcml2YXRlcygpLmVuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCBsaXN0IG9mIGhlbHBlciBleHByZXNzaW9ucywgcmVxdWlyZWQgZm9yIHByb3BlciBjb2RlZ2VuIG9mIHRoZQorICAvLy8gY2xhdXNlLiBUaGVzZSBleHByZXNzaW9ucyByZXByZXNlbnQgUkhTIGV4cHJlc3Npb24gaW4gdGhlIGZpbmFsCisgIC8vLyByZWR1Y3Rpb24gZXhwcmVzc2lvbiBwZXJmb3JtZWQgYnkgdGhlIHJlZHVjdGlvbiBjbGF1c2UuCisgIC8vLyBBbHNvLCB2YXJpYWJsZXMgaW4gdGhlc2UgZXhwcmVzc2lvbnMgYXJlIHVzZWQgZm9yIHByb3BlciBpbml0aWFsaXphdGlvbiBvZgorICAvLy8gcmVkdWN0aW9uIGNvcGllcy4KKyAgdm9pZCBzZXRSSFNFeHBycyhBcnJheVJlZjxFeHByICo+IFJIU0V4cHJzKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgbGlzdCBvZiBoZWxwZXIgZGVzdGluYXRpb24gZXhwcmVzc2lvbnMuCisgIE11dGFibGVBcnJheVJlZjxFeHByICo+IGdldFJIU0V4cHJzKCkgeworICAgIHJldHVybiBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPihnZXRMSFNFeHBycygpLmVuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKyAgQXJyYXlSZWY8Y29uc3QgRXhwciAqPiBnZXRSSFNFeHBycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKGdldExIU0V4cHJzKCkuZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IGxpc3Qgb2YgaGVscGVyIHJlZHVjdGlvbiBleHByZXNzaW9ucywgcmVxdWlyZWQgZm9yIHByb3BlcgorICAvLy8gY29kZWdlbiBvZiB0aGUgY2xhdXNlLiBUaGVzZSBleHByZXNzaW9ucyBhcmUgYmluYXJ5IGV4cHJlc3Npb25zIG9yCisgIC8vLyBvcGVyYXRvci9jdXN0b20gcmVkdWN0aW9uIGNhbGwgdGhhdCBjYWxjdWxhdGVzIG5ldyB2YWx1ZSBmcm9tIHNvdXJjZQorICAvLy8gaGVscGVyIGV4cHJlc3Npb25zIHRvIGRlc3RpbmF0aW9uIGhlbHBlciBleHByZXNzaW9ucy4KKyAgdm9pZCBzZXRSZWR1Y3Rpb25PcHMoQXJyYXlSZWY8RXhwciAqPiBSZWR1Y3Rpb25PcHMpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBsaXN0IG9mIGhlbHBlciByZWR1Y3Rpb24gZXhwcmVzc2lvbnMuCisgIE11dGFibGVBcnJheVJlZjxFeHByICo+IGdldFJlZHVjdGlvbk9wcygpIHsKKyAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4oZ2V0UkhTRXhwcnMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisgIEFycmF5UmVmPGNvbnN0IEV4cHIgKj4gZ2V0UmVkdWN0aW9uT3BzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoZ2V0UkhTRXhwcnMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGNsYXVzZSB3aXRoIGEgbGlzdCBvZiB2YXJpYWJsZXMgXGEgVkwuCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBDb2xvbkxvYyBMb2NhdGlvbiBvZiAnOicuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIFZMIFRoZSB2YXJpYWJsZXMgaW4gdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBRdWFsaWZpZXJMb2MgVGhlIG5lc3RlZC1uYW1lIHF1YWxpZmllciB3aXRoIGxvY2F0aW9uIGluZm9ybWF0aW9uCisgIC8vLyBccGFyYW0gTmFtZUluZm8gVGhlIGZ1bGwgbmFtZSBpbmZvIGZvciByZWR1Y3Rpb24gaWRlbnRpZmllci4KKyAgLy8vIFxwYXJhbSBQcml2YXRlcyBMaXN0IG9mIGhlbHBlciBleHByZXNzaW9ucyBmb3IgcHJvcGVyIGdlbmVyYXRpb24gb2YKKyAgLy8vIHByaXZhdGUgY29waWVzLgorICAvLy8gXHBhcmFtIExIU0V4cHJzIExpc3Qgb2YgaGVscGVyIGV4cHJlc3Npb25zIGZvciBwcm9wZXIgZ2VuZXJhdGlvbiBvZgorICAvLy8gYXNzaWdubWVudCBvcGVyYXRpb24gcmVxdWlyZWQgZm9yIGNvcHlwcml2YXRlIGNsYXVzZS4gVGhpcyBsaXN0IHJlcHJlc2VudHMKKyAgLy8vIExIU3Mgb2YgdGhlIHJlZHVjdGlvbiBleHByZXNzaW9ucy4KKyAgLy8vIFxwYXJhbSBSSFNFeHBycyBMaXN0IG9mIGhlbHBlciBleHByZXNzaW9ucyBmb3IgcHJvcGVyIGdlbmVyYXRpb24gb2YKKyAgLy8vIGFzc2lnbm1lbnQgb3BlcmF0aW9uIHJlcXVpcmVkIGZvciBjb3B5cHJpdmF0ZSBjbGF1c2UuIFRoaXMgbGlzdCByZXByZXNlbnRzCisgIC8vLyBSSFNzIG9mIHRoZSByZWR1Y3Rpb24gZXhwcmVzc2lvbnMuCisgIC8vLyBBbHNvLCB2YXJpYWJsZXMgaW4gdGhlc2UgZXhwcmVzc2lvbnMgYXJlIHVzZWQgZm9yIHByb3BlciBpbml0aWFsaXphdGlvbiBvZgorICAvLy8gcmVkdWN0aW9uIGNvcGllcy4KKyAgLy8vIFxwYXJhbSBSZWR1Y3Rpb25PcHMgTGlzdCBvZiBoZWxwZXIgZXhwcmVzc2lvbnMgdGhhdCByZXByZXNlbnRzIHJlZHVjdGlvbgorICAvLy8gZXhwcmVzc2lvbnM6CisgIC8vLyBcY29kZQorICAvLy8gTEhTRXhwcnMgYmlub3AgUkhTRXhwcnM7CisgIC8vLyBvcGVyYXRvciBiaW5vcChMSFNFeHByLCBSSFNFeHByKTsKKyAgLy8vIDxDdXRvbVJlZHVjdGlvbj4oTEhTRXhwciwgUkhTRXhwcik7CisgIC8vLyBcZW5kY29kZQorICAvLy8gUmVxdWlyZWQgZm9yIHByb3BlciBjb2RlZ2VuIG9mIGZpbmFsIHJlZHVjdGlvbiBvcGVyYXRpb24gcGVyZm9ybWVkIGJ5IHRoZQorICAvLy8gcmVkdWN0aW9uIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBQcmVJbml0IFN0YXRlbWVudCB0aGF0IG11c3QgYmUgZXhlY3V0ZWQgYmVmb3JlIGVudGVyaW5nIHRoZSBPcGVuTVAKKyAgLy8vIHJlZ2lvbiB3aXRoIHRoaXMgY2xhdXNlLgorICAvLy8gXHBhcmFtIFBvc3RVcGRhdGUgRXhwcmVzc2lvbiB0aGF0IG11c3QgYmUgZXhlY3V0ZWQgYWZ0ZXIgZXhpdCBmcm9tIHRoZQorICAvLy8gT3Blbk1QIHJlZ2lvbiB3aXRoIHRoaXMgY2xhdXNlLgorICBzdGF0aWMgT01QUmVkdWN0aW9uQ2xhdXNlICoKKyAgQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLCBBcnJheVJlZjxFeHByICo+IFZMLAorICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MsCisgICAgICAgICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZOYW1lSW5mbywgQXJyYXlSZWY8RXhwciAqPiBQcml2YXRlcywKKyAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gTEhTRXhwcnMsIEFycmF5UmVmPEV4cHIgKj4gUkhTRXhwcnMsCisgICAgICAgICBBcnJheVJlZjxFeHByICo+IFJlZHVjdGlvbk9wcywgU3RtdCAqUHJlSW5pdCwgRXhwciAqUG9zdFVwZGF0ZSk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGNsYXVzZSB3aXRoIHRoZSBwbGFjZSBmb3IgXGEgTiB2YXJpYWJsZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gTiBUaGUgbnVtYmVyIG9mIHZhcmlhYmxlcy4KKyAgc3RhdGljIE9NUFJlZHVjdGlvbkNsYXVzZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywgdW5zaWduZWQgTik7CisKKyAgLy8vIFxicmllZiBHZXRzIGxvY2F0aW9uIG9mICc6JyBzeW1ib2wgaW4gY2xhdXNlLgorICBTb3VyY2VMb2NhdGlvbiBnZXRDb2xvbkxvYygpIGNvbnN0IHsgcmV0dXJuIENvbG9uTG9jOyB9CisKKyAgLy8vIFxicmllZiBHZXRzIHRoZSBuYW1lIGluZm8gZm9yIHNwZWNpZmllZCByZWR1Y3Rpb24gaWRlbnRpZmllci4KKyAgY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmZ2V0TmFtZUluZm8oKSBjb25zdCB7IHJldHVybiBOYW1lSW5mbzsgfQorCisgIC8vLyBcYnJpZWYgR2V0cyB0aGUgbmVzdGVkIG5hbWUgc3BlY2lmaWVyLgorICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIGdldFF1YWxpZmllckxvYygpIGNvbnN0IHsgcmV0dXJuIFF1YWxpZmllckxvYzsgfQorCisgIHVzaW5nIGhlbHBlcl9leHByX2l0ZXJhdG9yID0gTXV0YWJsZUFycmF5UmVmPEV4cHIgKj46Oml0ZXJhdG9yOworICB1c2luZyBoZWxwZXJfZXhwcl9jb25zdF9pdGVyYXRvciA9IEFycmF5UmVmPGNvbnN0IEV4cHIgKj46Oml0ZXJhdG9yOworICB1c2luZyBoZWxwZXJfZXhwcl9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGhlbHBlcl9leHByX2l0ZXJhdG9yPjsKKyAgdXNpbmcgaGVscGVyX2V4cHJfY29uc3RfcmFuZ2UgPQorICAgICAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8aGVscGVyX2V4cHJfY29uc3RfaXRlcmF0b3I+OworCisgIGhlbHBlcl9leHByX2NvbnN0X3JhbmdlIHByaXZhdGVzKCkgY29uc3QgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZShnZXRQcml2YXRlcygpLmJlZ2luKCksIGdldFByaXZhdGVzKCkuZW5kKCkpOworICB9CisKKyAgaGVscGVyX2V4cHJfcmFuZ2UgcHJpdmF0ZXMoKSB7CisgICAgcmV0dXJuIGhlbHBlcl9leHByX3JhbmdlKGdldFByaXZhdGVzKCkuYmVnaW4oKSwgZ2V0UHJpdmF0ZXMoKS5lbmQoKSk7CisgIH0KKworICBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZSBsaHNfZXhwcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGhlbHBlcl9leHByX2NvbnN0X3JhbmdlKGdldExIU0V4cHJzKCkuYmVnaW4oKSwgZ2V0TEhTRXhwcnMoKS5lbmQoKSk7CisgIH0KKworICBoZWxwZXJfZXhwcl9yYW5nZSBsaHNfZXhwcnMoKSB7CisgICAgcmV0dXJuIGhlbHBlcl9leHByX3JhbmdlKGdldExIU0V4cHJzKCkuYmVnaW4oKSwgZ2V0TEhTRXhwcnMoKS5lbmQoKSk7CisgIH0KKworICBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZSByaHNfZXhwcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGhlbHBlcl9leHByX2NvbnN0X3JhbmdlKGdldFJIU0V4cHJzKCkuYmVnaW4oKSwgZ2V0UkhTRXhwcnMoKS5lbmQoKSk7CisgIH0KKworICBoZWxwZXJfZXhwcl9yYW5nZSByaHNfZXhwcnMoKSB7CisgICAgcmV0dXJuIGhlbHBlcl9leHByX3JhbmdlKGdldFJIU0V4cHJzKCkuYmVnaW4oKSwgZ2V0UkhTRXhwcnMoKS5lbmQoKSk7CisgIH0KKworICBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZSByZWR1Y3Rpb25fb3BzKCkgY29uc3QgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZShnZXRSZWR1Y3Rpb25PcHMoKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZWR1Y3Rpb25PcHMoKS5lbmQoKSk7CisgIH0KKworICBoZWxwZXJfZXhwcl9yYW5nZSByZWR1Y3Rpb25fb3BzKCkgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9yYW5nZShnZXRSZWR1Y3Rpb25PcHMoKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZWR1Y3Rpb25PcHMoKS5lbmQoKSk7CisgIH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UocmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2JlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFN0bXQgKio+KHZhcmxpc3RfZW5kKCkpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldENsYXVzZUtpbmQoKSA9PSBPTVBDX3JlZHVjdGlvbjsKKyAgfQorfTsKKworLy8vIFRoaXMgcmVwcmVzZW50cyBjbGF1c2UgJ3Rhc2tfcmVkdWN0aW9uJyBpbiB0aGUgJyNwcmFnbWEgb21wIHRhc2tncm91cCcKKy8vLyBkaXJlY3RpdmVzLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCB0YXNrZ3JvdXAgdGFza19yZWR1Y3Rpb24oKzphLGIpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCB0YXNrZ3JvdXAnIGhhcyBjbGF1c2UKKy8vLyAndGFza19yZWR1Y3Rpb24nIHdpdGggb3BlcmF0b3IgJysnIGFuZCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InLgorY2xhc3MgT01QVGFza1JlZHVjdGlvbkNsYXVzZSBmaW5hbAorICAgIDogcHVibGljIE9NUFZhckxpc3RDbGF1c2U8T01QVGFza1JlZHVjdGlvbkNsYXVzZT4sCisgICAgICBwdWJsaWMgT01QQ2xhdXNlV2l0aFBvc3RVcGRhdGUsCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxPTVBUYXNrUmVkdWN0aW9uQ2xhdXNlLCBFeHByICo+IHsKKyAgZnJpZW5kIGNsYXNzIE9NUENsYXVzZVJlYWRlcjsKKyAgZnJpZW5kIE9NUFZhckxpc3RDbGF1c2U7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgLy8vIExvY2F0aW9uIG9mICc6Jy4KKyAgU291cmNlTG9jYXRpb24gQ29sb25Mb2M7CisKKyAgLy8vIE5lc3RlZCBuYW1lIHNwZWNpZmllciBmb3IgQysrLgorICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYzsKKworICAvLy8gTmFtZSBvZiBjdXN0b20gb3BlcmF0b3IuCisgIERlY2xhcmF0aW9uTmFtZUluZm8gTmFtZUluZm87CisKKyAgLy8vIEJ1aWxkIGNsYXVzZSB3aXRoIG51bWJlciBvZiB2YXJpYWJsZXMgXGEgTi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBMUGFyZW5Mb2MgTG9jYXRpb24gb2YgJygnLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBDb2xvbkxvYyBMb2NhdGlvbiBvZiAnOicuCisgIC8vLyBccGFyYW0gTiBOdW1iZXIgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIFF1YWxpZmllckxvYyBUaGUgbmVzdGVkLW5hbWUgcXVhbGlmaWVyIHdpdGggbG9jYXRpb24gaW5mb3JtYXRpb24KKyAgLy8vIFxwYXJhbSBOYW1lSW5mbyBUaGUgZnVsbCBuYW1lIGluZm8gZm9yIHJlZHVjdGlvbiBpZGVudGlmaWVyLgorICBPTVBUYXNrUmVkdWN0aW9uQ2xhdXNlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQ29sb25Mb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOLCBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZOYW1lSW5mbykKKyAgICAgIDogT01QVmFyTGlzdENsYXVzZTxPTVBUYXNrUmVkdWN0aW9uQ2xhdXNlPihPTVBDX3Rhc2tfcmVkdWN0aW9uLCBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUGFyZW5Mb2MsIEVuZExvYywgTiksCisgICAgICAgIE9NUENsYXVzZVdpdGhQb3N0VXBkYXRlKHRoaXMpLCBDb2xvbkxvYyhDb2xvbkxvYyksCisgICAgICAgIFF1YWxpZmllckxvYyhRdWFsaWZpZXJMb2MpLCBOYW1lSW5mbyhOYW1lSW5mbykge30KKworICAvLy8gQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOIE51bWJlciBvZiB2YXJpYWJsZXMuCisgIGV4cGxpY2l0IE9NUFRhc2tSZWR1Y3Rpb25DbGF1c2UodW5zaWduZWQgTikKKyAgICAgIDogT01QVmFyTGlzdENsYXVzZTxPTVBUYXNrUmVkdWN0aW9uQ2xhdXNlPigKKyAgICAgICAgICAgIE9NUENfdGFza19yZWR1Y3Rpb24sIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBOKSwKKyAgICAgICAgT01QQ2xhdXNlV2l0aFBvc3RVcGRhdGUodGhpcykge30KKworICAvLy8gU2V0cyBsb2NhdGlvbiBvZiAnOicgc3ltYm9sIGluIGNsYXVzZS4KKyAgdm9pZCBzZXRDb2xvbkxvYyhTb3VyY2VMb2NhdGlvbiBDTCkgeyBDb2xvbkxvYyA9IENMOyB9CisKKyAgLy8vIFNldHMgdGhlIG5hbWUgaW5mbyBmb3Igc3BlY2lmaWVkIHJlZHVjdGlvbiBpZGVudGlmaWVyLgorICB2b2lkIHNldE5hbWVJbmZvKERlY2xhcmF0aW9uTmFtZUluZm8gRE5JKSB7IE5hbWVJbmZvID0gRE5JOyB9CisKKyAgLy8vIFNldHMgdGhlIG5lc3RlZCBuYW1lIHNwZWNpZmllci4KKyAgdm9pZCBzZXRRdWFsaWZpZXJMb2MoTmVzdGVkTmFtZVNwZWNpZmllckxvYyBOU0wpIHsgUXVhbGlmaWVyTG9jID0gTlNMOyB9CisKKyAgLy8vIFNldCBsaXN0IG9mIGhlbHBlciBleHByZXNzaW9ucywgcmVxdWlyZWQgZm9yIHByb3BlciBjb2RlZ2VuIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBUaGVzZSBleHByZXNzaW9ucyByZXByZXNlbnQgcHJpdmF0ZSBjb3B5IG9mIHRoZSByZWR1Y3Rpb24gdmFyaWFibGUuCisgIHZvaWQgc2V0UHJpdmF0ZXMoQXJyYXlSZWY8RXhwciAqPiBQcml2YXRlcyk7CisKKyAgLy8vIEdldCB0aGUgbGlzdCBvZiBoZWxwZXIgcHJpdmF0ZXMuCisgIE11dGFibGVBcnJheVJlZjxFeHByICo+IGdldFByaXZhdGVzKCkgeworICAgIHJldHVybiBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPih2YXJsaXN0X2VuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKyAgQXJyYXlSZWY8Y29uc3QgRXhwciAqPiBnZXRQcml2YXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKHZhcmxpc3RfZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorCisgIC8vLyBTZXQgbGlzdCBvZiBoZWxwZXIgZXhwcmVzc2lvbnMsIHJlcXVpcmVkIGZvciBwcm9wZXIgY29kZWdlbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gVGhlc2UgZXhwcmVzc2lvbnMgcmVwcmVzZW50IExIUyBleHByZXNzaW9uIGluIHRoZSBmaW5hbCByZWR1Y3Rpb24KKyAgLy8vIGV4cHJlc3Npb24gcGVyZm9ybWVkIGJ5IHRoZSByZWR1Y3Rpb24gY2xhdXNlLgorICB2b2lkIHNldExIU0V4cHJzKEFycmF5UmVmPEV4cHIgKj4gTEhTRXhwcnMpOworCisgIC8vLyBHZXQgdGhlIGxpc3Qgb2YgaGVscGVyIExIUyBleHByZXNzaW9ucy4KKyAgTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4gZ2V0TEhTRXhwcnMoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxFeHByICo+KGdldFByaXZhdGVzKCkuZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorICBBcnJheVJlZjxjb25zdCBFeHByICo+IGdldExIU0V4cHJzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoZ2V0UHJpdmF0ZXMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisKKyAgLy8vIFNldCBsaXN0IG9mIGhlbHBlciBleHByZXNzaW9ucywgcmVxdWlyZWQgZm9yIHByb3BlciBjb2RlZ2VuIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBUaGVzZSBleHByZXNzaW9ucyByZXByZXNlbnQgUkhTIGV4cHJlc3Npb24gaW4gdGhlIGZpbmFsIHJlZHVjdGlvbgorICAvLy8gZXhwcmVzc2lvbiBwZXJmb3JtZWQgYnkgdGhlIHJlZHVjdGlvbiBjbGF1c2UuIEFsc28sIHZhcmlhYmxlcyBpbiB0aGVzZQorICAvLy8gZXhwcmVzc2lvbnMgYXJlIHVzZWQgZm9yIHByb3BlciBpbml0aWFsaXphdGlvbiBvZiByZWR1Y3Rpb24gY29waWVzLgorICB2b2lkIHNldFJIU0V4cHJzKEFycmF5UmVmPEV4cHIgKj4gUkhTRXhwcnMpOworCisgIC8vLyAgR2V0IHRoZSBsaXN0IG9mIGhlbHBlciBkZXN0aW5hdGlvbiBleHByZXNzaW9ucy4KKyAgTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4gZ2V0UkhTRXhwcnMoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxFeHByICo+KGdldExIU0V4cHJzKCkuZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorICBBcnJheVJlZjxjb25zdCBFeHByICo+IGdldFJIU0V4cHJzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoZ2V0TEhTRXhwcnMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisKKyAgLy8vIFNldCBsaXN0IG9mIGhlbHBlciByZWR1Y3Rpb24gZXhwcmVzc2lvbnMsIHJlcXVpcmVkIGZvciBwcm9wZXIKKyAgLy8vIGNvZGVnZW4gb2YgdGhlIGNsYXVzZS4gVGhlc2UgZXhwcmVzc2lvbnMgYXJlIGJpbmFyeSBleHByZXNzaW9ucyBvcgorICAvLy8gb3BlcmF0b3IvY3VzdG9tIHJlZHVjdGlvbiBjYWxsIHRoYXQgY2FsY3VsYXRlcyBuZXcgdmFsdWUgZnJvbSBzb3VyY2UKKyAgLy8vIGhlbHBlciBleHByZXNzaW9ucyB0byBkZXN0aW5hdGlvbiBoZWxwZXIgZXhwcmVzc2lvbnMuCisgIHZvaWQgc2V0UmVkdWN0aW9uT3BzKEFycmF5UmVmPEV4cHIgKj4gUmVkdWN0aW9uT3BzKTsKKworICAvLy8gIEdldCB0aGUgbGlzdCBvZiBoZWxwZXIgcmVkdWN0aW9uIGV4cHJlc3Npb25zLgorICBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPiBnZXRSZWR1Y3Rpb25PcHMoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxFeHByICo+KGdldFJIU0V4cHJzKCkuZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorICBBcnJheVJlZjxjb25zdCBFeHByICo+IGdldFJlZHVjdGlvbk9wcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKGdldFJIU0V4cHJzKCkuZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBDcmVhdGVzIGNsYXVzZSB3aXRoIGEgbGlzdCBvZiB2YXJpYWJsZXMgXGEgVkwuCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBDb2xvbkxvYyBMb2NhdGlvbiBvZiAnOicuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIFZMIFRoZSB2YXJpYWJsZXMgaW4gdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBRdWFsaWZpZXJMb2MgVGhlIG5lc3RlZC1uYW1lIHF1YWxpZmllciB3aXRoIGxvY2F0aW9uIGluZm9ybWF0aW9uCisgIC8vLyBccGFyYW0gTmFtZUluZm8gVGhlIGZ1bGwgbmFtZSBpbmZvIGZvciByZWR1Y3Rpb24gaWRlbnRpZmllci4KKyAgLy8vIFxwYXJhbSBQcml2YXRlcyBMaXN0IG9mIGhlbHBlciBleHByZXNzaW9ucyBmb3IgcHJvcGVyIGdlbmVyYXRpb24gb2YKKyAgLy8vIHByaXZhdGUgY29waWVzLgorICAvLy8gXHBhcmFtIExIU0V4cHJzIExpc3Qgb2YgaGVscGVyIGV4cHJlc3Npb25zIGZvciBwcm9wZXIgZ2VuZXJhdGlvbiBvZgorICAvLy8gYXNzaWdubWVudCBvcGVyYXRpb24gcmVxdWlyZWQgZm9yIGNvcHlwcml2YXRlIGNsYXVzZS4gVGhpcyBsaXN0IHJlcHJlc2VudHMKKyAgLy8vIExIU3Mgb2YgdGhlIHJlZHVjdGlvbiBleHByZXNzaW9ucy4KKyAgLy8vIFxwYXJhbSBSSFNFeHBycyBMaXN0IG9mIGhlbHBlciBleHByZXNzaW9ucyBmb3IgcHJvcGVyIGdlbmVyYXRpb24gb2YKKyAgLy8vIGFzc2lnbm1lbnQgb3BlcmF0aW9uIHJlcXVpcmVkIGZvciBjb3B5cHJpdmF0ZSBjbGF1c2UuIFRoaXMgbGlzdCByZXByZXNlbnRzCisgIC8vLyBSSFNzIG9mIHRoZSByZWR1Y3Rpb24gZXhwcmVzc2lvbnMuCisgIC8vLyBBbHNvLCB2YXJpYWJsZXMgaW4gdGhlc2UgZXhwcmVzc2lvbnMgYXJlIHVzZWQgZm9yIHByb3BlciBpbml0aWFsaXphdGlvbiBvZgorICAvLy8gcmVkdWN0aW9uIGNvcGllcy4KKyAgLy8vIFxwYXJhbSBSZWR1Y3Rpb25PcHMgTGlzdCBvZiBoZWxwZXIgZXhwcmVzc2lvbnMgdGhhdCByZXByZXNlbnRzIHJlZHVjdGlvbgorICAvLy8gZXhwcmVzc2lvbnM6CisgIC8vLyBcY29kZQorICAvLy8gTEhTRXhwcnMgYmlub3AgUkhTRXhwcnM7CisgIC8vLyBvcGVyYXRvciBiaW5vcChMSFNFeHByLCBSSFNFeHByKTsKKyAgLy8vIDxDdXRvbVJlZHVjdGlvbj4oTEhTRXhwciwgUkhTRXhwcik7CisgIC8vLyBcZW5kY29kZQorICAvLy8gUmVxdWlyZWQgZm9yIHByb3BlciBjb2RlZ2VuIG9mIGZpbmFsIHJlZHVjdGlvbiBvcGVyYXRpb24gcGVyZm9ybWVkIGJ5IHRoZQorICAvLy8gcmVkdWN0aW9uIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBQcmVJbml0IFN0YXRlbWVudCB0aGF0IG11c3QgYmUgZXhlY3V0ZWQgYmVmb3JlIGVudGVyaW5nIHRoZSBPcGVuTVAKKyAgLy8vIHJlZ2lvbiB3aXRoIHRoaXMgY2xhdXNlLgorICAvLy8gXHBhcmFtIFBvc3RVcGRhdGUgRXhwcmVzc2lvbiB0aGF0IG11c3QgYmUgZXhlY3V0ZWQgYWZ0ZXIgZXhpdCBmcm9tIHRoZQorICAvLy8gT3Blbk1QIHJlZ2lvbiB3aXRoIHRoaXMgY2xhdXNlLgorICBzdGF0aWMgT01QVGFza1JlZHVjdGlvbkNsYXVzZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgU291cmNlTG9jYXRpb24gQ29sb25Mb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywgQXJyYXlSZWY8RXhwciAqPiBWTCwKKyAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgUXVhbGlmaWVyTG9jLAorICAgICAgICAgY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmTmFtZUluZm8sIEFycmF5UmVmPEV4cHIgKj4gUHJpdmF0ZXMsCisgICAgICAgICBBcnJheVJlZjxFeHByICo+IExIU0V4cHJzLCBBcnJheVJlZjxFeHByICo+IFJIU0V4cHJzLAorICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBSZWR1Y3Rpb25PcHMsIFN0bXQgKlByZUluaXQsIEV4cHIgKlBvc3RVcGRhdGUpOworCisgIC8vLyBDcmVhdGVzIGFuIGVtcHR5IGNsYXVzZSB3aXRoIHRoZSBwbGFjZSBmb3IgXGEgTiB2YXJpYWJsZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gTiBUaGUgbnVtYmVyIG9mIHZhcmlhYmxlcy4KKyAgc3RhdGljIE9NUFRhc2tSZWR1Y3Rpb25DbGF1c2UgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE4pOworCisgIC8vLyBHZXRzIGxvY2F0aW9uIG9mICc6JyBzeW1ib2wgaW4gY2xhdXNlLgorICBTb3VyY2VMb2NhdGlvbiBnZXRDb2xvbkxvYygpIGNvbnN0IHsgcmV0dXJuIENvbG9uTG9jOyB9CisKKyAgLy8vIEdldHMgdGhlIG5hbWUgaW5mbyBmb3Igc3BlY2lmaWVkIHJlZHVjdGlvbiBpZGVudGlmaWVyLgorICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZnZXROYW1lSW5mbygpIGNvbnN0IHsgcmV0dXJuIE5hbWVJbmZvOyB9CisKKyAgLy8vIEdldHMgdGhlIG5lc3RlZCBuYW1lIHNwZWNpZmllci4KKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBnZXRRdWFsaWZpZXJMb2MoKSBjb25zdCB7IHJldHVybiBRdWFsaWZpZXJMb2M7IH0KKworICB1c2luZyBoZWxwZXJfZXhwcl9pdGVyYXRvciA9IE11dGFibGVBcnJheVJlZjxFeHByICo+OjppdGVyYXRvcjsKKyAgdXNpbmcgaGVscGVyX2V4cHJfY29uc3RfaXRlcmF0b3IgPSBBcnJheVJlZjxjb25zdCBFeHByICo+OjppdGVyYXRvcjsKKyAgdXNpbmcgaGVscGVyX2V4cHJfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxoZWxwZXJfZXhwcl9pdGVyYXRvcj47CisgIHVzaW5nIGhlbHBlcl9leHByX2NvbnN0X3JhbmdlID0KKyAgICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGhlbHBlcl9leHByX2NvbnN0X2l0ZXJhdG9yPjsKKworICBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZSBwcml2YXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gaGVscGVyX2V4cHJfY29uc3RfcmFuZ2UoZ2V0UHJpdmF0ZXMoKS5iZWdpbigpLCBnZXRQcml2YXRlcygpLmVuZCgpKTsKKyAgfQorCisgIGhlbHBlcl9leHByX3JhbmdlIHByaXZhdGVzKCkgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9yYW5nZShnZXRQcml2YXRlcygpLmJlZ2luKCksIGdldFByaXZhdGVzKCkuZW5kKCkpOworICB9CisKKyAgaGVscGVyX2V4cHJfY29uc3RfcmFuZ2UgbGhzX2V4cHJzKCkgY29uc3QgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZShnZXRMSFNFeHBycygpLmJlZ2luKCksIGdldExIU0V4cHJzKCkuZW5kKCkpOworICB9CisKKyAgaGVscGVyX2V4cHJfcmFuZ2UgbGhzX2V4cHJzKCkgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9yYW5nZShnZXRMSFNFeHBycygpLmJlZ2luKCksIGdldExIU0V4cHJzKCkuZW5kKCkpOworICB9CisKKyAgaGVscGVyX2V4cHJfY29uc3RfcmFuZ2UgcmhzX2V4cHJzKCkgY29uc3QgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZShnZXRSSFNFeHBycygpLmJlZ2luKCksIGdldFJIU0V4cHJzKCkuZW5kKCkpOworICB9CisKKyAgaGVscGVyX2V4cHJfcmFuZ2UgcmhzX2V4cHJzKCkgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9yYW5nZShnZXRSSFNFeHBycygpLmJlZ2luKCksIGdldFJIU0V4cHJzKCkuZW5kKCkpOworICB9CisKKyAgaGVscGVyX2V4cHJfY29uc3RfcmFuZ2UgcmVkdWN0aW9uX29wcygpIGNvbnN0IHsKKyAgICByZXR1cm4gaGVscGVyX2V4cHJfY29uc3RfcmFuZ2UoZ2V0UmVkdWN0aW9uT3BzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVkdWN0aW9uT3BzKCkuZW5kKCkpOworICB9CisKKyAgaGVscGVyX2V4cHJfcmFuZ2UgcmVkdWN0aW9uX29wcygpIHsKKyAgICByZXR1cm4gaGVscGVyX2V4cHJfcmFuZ2UoZ2V0UmVkdWN0aW9uT3BzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVkdWN0aW9uT3BzKCkuZW5kKCkpOworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9iZWdpbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2VuZCgpKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgeworICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ190YXNrX3JlZHVjdGlvbjsKKyAgfQorfTsKKworLy8vIFRoaXMgcmVwcmVzZW50cyBjbGF1c2UgJ2luX3JlZHVjdGlvbicgaW4gdGhlICcjcHJhZ21hIG9tcCB0YXNrJyBkaXJlY3RpdmVzLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCB0YXNrIGluX3JlZHVjdGlvbigrOmEsYikKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRhc2snIGhhcyBjbGF1c2UgJ2luX3JlZHVjdGlvbicgd2l0aAorLy8vIG9wZXJhdG9yICcrJyBhbmQgdGhlIHZhcmlhYmxlcyAnYScgYW5kICdiJy4KK2NsYXNzIE9NUEluUmVkdWN0aW9uQ2xhdXNlIGZpbmFsCisgICAgOiBwdWJsaWMgT01QVmFyTGlzdENsYXVzZTxPTVBJblJlZHVjdGlvbkNsYXVzZT4sCisgICAgICBwdWJsaWMgT01QQ2xhdXNlV2l0aFBvc3RVcGRhdGUsCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxPTVBJblJlZHVjdGlvbkNsYXVzZSwgRXhwciAqPiB7CisgIGZyaWVuZCBjbGFzcyBPTVBDbGF1c2VSZWFkZXI7CisgIGZyaWVuZCBPTVBWYXJMaXN0Q2xhdXNlOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIC8vLyBMb2NhdGlvbiBvZiAnOicuCisgIFNvdXJjZUxvY2F0aW9uIENvbG9uTG9jOworCisgIC8vLyBOZXN0ZWQgbmFtZSBzcGVjaWZpZXIgZm9yIEMrKy4KKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2M7CisKKyAgLy8vIE5hbWUgb2YgY3VzdG9tIG9wZXJhdG9yLgorICBEZWNsYXJhdGlvbk5hbWVJbmZvIE5hbWVJbmZvOworCisgIC8vLyBCdWlsZCBjbGF1c2Ugd2l0aCBudW1iZXIgb2YgdmFyaWFibGVzIFxhIE4uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gQ29sb25Mb2MgTG9jYXRpb24gb2YgJzonLgorICAvLy8gXHBhcmFtIE4gTnVtYmVyIG9mIHRoZSB2YXJpYWJsZXMgaW4gdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBRdWFsaWZpZXJMb2MgVGhlIG5lc3RlZC1uYW1lIHF1YWxpZmllciB3aXRoIGxvY2F0aW9uIGluZm9ybWF0aW9uCisgIC8vLyBccGFyYW0gTmFtZUluZm8gVGhlIGZ1bGwgbmFtZSBpbmZvIGZvciByZWR1Y3Rpb24gaWRlbnRpZmllci4KKyAgT01QSW5SZWR1Y3Rpb25DbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQ29sb25Mb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTiwgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvKQorICAgICAgOiBPTVBWYXJMaXN0Q2xhdXNlPE9NUEluUmVkdWN0aW9uQ2xhdXNlPihPTVBDX2luX3JlZHVjdGlvbiwgU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQYXJlbkxvYywgRW5kTG9jLCBOKSwKKyAgICAgICAgT01QQ2xhdXNlV2l0aFBvc3RVcGRhdGUodGhpcyksIENvbG9uTG9jKENvbG9uTG9jKSwKKyAgICAgICAgUXVhbGlmaWVyTG9jKFF1YWxpZmllckxvYyksIE5hbWVJbmZvKE5hbWVJbmZvKSB7fQorCisgIC8vLyBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIE4gTnVtYmVyIG9mIHZhcmlhYmxlcy4KKyAgZXhwbGljaXQgT01QSW5SZWR1Y3Rpb25DbGF1c2UodW5zaWduZWQgTikKKyAgICAgIDogT01QVmFyTGlzdENsYXVzZTxPTVBJblJlZHVjdGlvbkNsYXVzZT4oCisgICAgICAgICAgICBPTVBDX2luX3JlZHVjdGlvbiwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIE4pLAorICAgICAgICBPTVBDbGF1c2VXaXRoUG9zdFVwZGF0ZSh0aGlzKSB7fQorCisgIC8vLyBTZXRzIGxvY2F0aW9uIG9mICc6JyBzeW1ib2wgaW4gY2xhdXNlLgorICB2b2lkIHNldENvbG9uTG9jKFNvdXJjZUxvY2F0aW9uIENMKSB7IENvbG9uTG9jID0gQ0w7IH0KKworICAvLy8gU2V0cyB0aGUgbmFtZSBpbmZvIGZvciBzcGVjaWZpZWQgcmVkdWN0aW9uIGlkZW50aWZpZXIuCisgIHZvaWQgc2V0TmFtZUluZm8oRGVjbGFyYXRpb25OYW1lSW5mbyBETkkpIHsgTmFtZUluZm8gPSBETkk7IH0KKworICAvLy8gU2V0cyB0aGUgbmVzdGVkIG5hbWUgc3BlY2lmaWVyLgorICB2b2lkIHNldFF1YWxpZmllckxvYyhOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIE5TTCkgeyBRdWFsaWZpZXJMb2MgPSBOU0w7IH0KKworICAvLy8gU2V0IGxpc3Qgb2YgaGVscGVyIGV4cHJlc3Npb25zLCByZXF1aXJlZCBmb3IgcHJvcGVyIGNvZGVnZW4gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFRoZXNlIGV4cHJlc3Npb25zIHJlcHJlc2VudCBwcml2YXRlIGNvcHkgb2YgdGhlIHJlZHVjdGlvbiB2YXJpYWJsZS4KKyAgdm9pZCBzZXRQcml2YXRlcyhBcnJheVJlZjxFeHByICo+IFByaXZhdGVzKTsKKworICAvLy8gR2V0IHRoZSBsaXN0IG9mIGhlbHBlciBwcml2YXRlcy4KKyAgTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4gZ2V0UHJpdmF0ZXMoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxFeHByICo+KHZhcmxpc3RfZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorICBBcnJheVJlZjxjb25zdCBFeHByICo+IGdldFByaXZhdGVzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYodmFybGlzdF9lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisKKyAgLy8vIFNldCBsaXN0IG9mIGhlbHBlciBleHByZXNzaW9ucywgcmVxdWlyZWQgZm9yIHByb3BlciBjb2RlZ2VuIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBUaGVzZSBleHByZXNzaW9ucyByZXByZXNlbnQgTEhTIGV4cHJlc3Npb24gaW4gdGhlIGZpbmFsIHJlZHVjdGlvbgorICAvLy8gZXhwcmVzc2lvbiBwZXJmb3JtZWQgYnkgdGhlIHJlZHVjdGlvbiBjbGF1c2UuCisgIHZvaWQgc2V0TEhTRXhwcnMoQXJyYXlSZWY8RXhwciAqPiBMSFNFeHBycyk7CisKKyAgLy8vIEdldCB0aGUgbGlzdCBvZiBoZWxwZXIgTEhTIGV4cHJlc3Npb25zLgorICBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPiBnZXRMSFNFeHBycygpIHsKKyAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4oZ2V0UHJpdmF0ZXMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisgIEFycmF5UmVmPGNvbnN0IEV4cHIgKj4gZ2V0TEhTRXhwcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZihnZXRQcml2YXRlcygpLmVuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKworICAvLy8gU2V0IGxpc3Qgb2YgaGVscGVyIGV4cHJlc3Npb25zLCByZXF1aXJlZCBmb3IgcHJvcGVyIGNvZGVnZW4gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFRoZXNlIGV4cHJlc3Npb25zIHJlcHJlc2VudCBSSFMgZXhwcmVzc2lvbiBpbiB0aGUgZmluYWwgcmVkdWN0aW9uCisgIC8vLyBleHByZXNzaW9uIHBlcmZvcm1lZCBieSB0aGUgcmVkdWN0aW9uIGNsYXVzZS4gQWxzbywgdmFyaWFibGVzIGluIHRoZXNlCisgIC8vLyBleHByZXNzaW9ucyBhcmUgdXNlZCBmb3IgcHJvcGVyIGluaXRpYWxpemF0aW9uIG9mIHJlZHVjdGlvbiBjb3BpZXMuCisgIHZvaWQgc2V0UkhTRXhwcnMoQXJyYXlSZWY8RXhwciAqPiBSSFNFeHBycyk7CisKKyAgLy8vICBHZXQgdGhlIGxpc3Qgb2YgaGVscGVyIGRlc3RpbmF0aW9uIGV4cHJlc3Npb25zLgorICBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPiBnZXRSSFNFeHBycygpIHsKKyAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4oZ2V0TEhTRXhwcnMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisgIEFycmF5UmVmPGNvbnN0IEV4cHIgKj4gZ2V0UkhTRXhwcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZihnZXRMSFNFeHBycygpLmVuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKworICAvLy8gU2V0IGxpc3Qgb2YgaGVscGVyIHJlZHVjdGlvbiBleHByZXNzaW9ucywgcmVxdWlyZWQgZm9yIHByb3BlcgorICAvLy8gY29kZWdlbiBvZiB0aGUgY2xhdXNlLiBUaGVzZSBleHByZXNzaW9ucyBhcmUgYmluYXJ5IGV4cHJlc3Npb25zIG9yCisgIC8vLyBvcGVyYXRvci9jdXN0b20gcmVkdWN0aW9uIGNhbGwgdGhhdCBjYWxjdWxhdGVzIG5ldyB2YWx1ZSBmcm9tIHNvdXJjZQorICAvLy8gaGVscGVyIGV4cHJlc3Npb25zIHRvIGRlc3RpbmF0aW9uIGhlbHBlciBleHByZXNzaW9ucy4KKyAgdm9pZCBzZXRSZWR1Y3Rpb25PcHMoQXJyYXlSZWY8RXhwciAqPiBSZWR1Y3Rpb25PcHMpOworCisgIC8vLyAgR2V0IHRoZSBsaXN0IG9mIGhlbHBlciByZWR1Y3Rpb24gZXhwcmVzc2lvbnMuCisgIE11dGFibGVBcnJheVJlZjxFeHByICo+IGdldFJlZHVjdGlvbk9wcygpIHsKKyAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4oZ2V0UkhTRXhwcnMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisgIEFycmF5UmVmPGNvbnN0IEV4cHIgKj4gZ2V0UmVkdWN0aW9uT3BzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoZ2V0UkhTRXhwcnMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisKKyAgLy8vIFNldCBsaXN0IG9mIGhlbHBlciByZWR1Y3Rpb24gdGFza2dyb3VwIGRlc2NyaXB0b3JzLgorICB2b2lkIHNldFRhc2tncm91cERlc2NyaXB0b3JzKEFycmF5UmVmPEV4cHIgKj4gUmVkdWN0aW9uT3BzKTsKKworICAvLy8gIEdldCB0aGUgbGlzdCBvZiBoZWxwZXIgcmVkdWN0aW9uIHRhc2tncm91cCBkZXNjcmlwdG9ycy4KKyAgTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4gZ2V0VGFza2dyb3VwRGVzY3JpcHRvcnMoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxFeHByICo+KGdldFJlZHVjdGlvbk9wcygpLmVuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKyAgQXJyYXlSZWY8Y29uc3QgRXhwciAqPiBnZXRUYXNrZ3JvdXBEZXNjcmlwdG9ycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKGdldFJlZHVjdGlvbk9wcygpLmVuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKworcHVibGljOgorICAvLy8gQ3JlYXRlcyBjbGF1c2Ugd2l0aCBhIGxpc3Qgb2YgdmFyaWFibGVzIFxhIFZMLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCisgIC8vLyBccGFyYW0gQ29sb25Mb2MgTG9jYXRpb24gb2YgJzonLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBWTCBUaGUgdmFyaWFibGVzIGluIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gUXVhbGlmaWVyTG9jIFRoZSBuZXN0ZWQtbmFtZSBxdWFsaWZpZXIgd2l0aCBsb2NhdGlvbiBpbmZvcm1hdGlvbgorICAvLy8gXHBhcmFtIE5hbWVJbmZvIFRoZSBmdWxsIG5hbWUgaW5mbyBmb3IgcmVkdWN0aW9uIGlkZW50aWZpZXIuCisgIC8vLyBccGFyYW0gUHJpdmF0ZXMgTGlzdCBvZiBoZWxwZXIgZXhwcmVzc2lvbnMgZm9yIHByb3BlciBnZW5lcmF0aW9uIG9mCisgIC8vLyBwcml2YXRlIGNvcGllcy4KKyAgLy8vIFxwYXJhbSBMSFNFeHBycyBMaXN0IG9mIGhlbHBlciBleHByZXNzaW9ucyBmb3IgcHJvcGVyIGdlbmVyYXRpb24gb2YKKyAgLy8vIGFzc2lnbm1lbnQgb3BlcmF0aW9uIHJlcXVpcmVkIGZvciBjb3B5cHJpdmF0ZSBjbGF1c2UuIFRoaXMgbGlzdCByZXByZXNlbnRzCisgIC8vLyBMSFNzIG9mIHRoZSByZWR1Y3Rpb24gZXhwcmVzc2lvbnMuCisgIC8vLyBccGFyYW0gUkhTRXhwcnMgTGlzdCBvZiBoZWxwZXIgZXhwcmVzc2lvbnMgZm9yIHByb3BlciBnZW5lcmF0aW9uIG9mCisgIC8vLyBhc3NpZ25tZW50IG9wZXJhdGlvbiByZXF1aXJlZCBmb3IgY29weXByaXZhdGUgY2xhdXNlLiBUaGlzIGxpc3QgcmVwcmVzZW50cworICAvLy8gUkhTcyBvZiB0aGUgcmVkdWN0aW9uIGV4cHJlc3Npb25zLgorICAvLy8gQWxzbywgdmFyaWFibGVzIGluIHRoZXNlIGV4cHJlc3Npb25zIGFyZSB1c2VkIGZvciBwcm9wZXIgaW5pdGlhbGl6YXRpb24gb2YKKyAgLy8vIHJlZHVjdGlvbiBjb3BpZXMuCisgIC8vLyBccGFyYW0gUmVkdWN0aW9uT3BzIExpc3Qgb2YgaGVscGVyIGV4cHJlc3Npb25zIHRoYXQgcmVwcmVzZW50cyByZWR1Y3Rpb24KKyAgLy8vIGV4cHJlc3Npb25zOgorICAvLy8gXGNvZGUKKyAgLy8vIExIU0V4cHJzIGJpbm9wIFJIU0V4cHJzOworICAvLy8gb3BlcmF0b3IgYmlub3AoTEhTRXhwciwgUkhTRXhwcik7CisgIC8vLyA8Q3V0b21SZWR1Y3Rpb24+KExIU0V4cHIsIFJIU0V4cHIpOworICAvLy8gXGVuZGNvZGUKKyAgLy8vIFJlcXVpcmVkIGZvciBwcm9wZXIgY29kZWdlbiBvZiBmaW5hbCByZWR1Y3Rpb24gb3BlcmF0aW9uIHBlcmZvcm1lZCBieSB0aGUKKyAgLy8vIHJlZHVjdGlvbiBjbGF1c2UuCisgIC8vLyBccGFyYW0gVGFza2dyb3VwRGVzY3JpcHRvcnMgTGlzdCBvZiBoZWxwZXIgdGFza2dyb3VwIGRlc2NyaXB0b3JzIGZvcgorICAvLy8gY29ycmVzcG9uZGluZyBpdGVtcyBpbiBwYXJlbnQgdGFza2dyb3VwIHRhc2tfcmVkdWN0aW9uIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBQcmVJbml0IFN0YXRlbWVudCB0aGF0IG11c3QgYmUgZXhlY3V0ZWQgYmVmb3JlIGVudGVyaW5nIHRoZSBPcGVuTVAKKyAgLy8vIHJlZ2lvbiB3aXRoIHRoaXMgY2xhdXNlLgorICAvLy8gXHBhcmFtIFBvc3RVcGRhdGUgRXhwcmVzc2lvbiB0aGF0IG11c3QgYmUgZXhlY3V0ZWQgYWZ0ZXIgZXhpdCBmcm9tIHRoZQorICAvLy8gT3Blbk1QIHJlZ2lvbiB3aXRoIHRoaXMgY2xhdXNlLgorICBzdGF0aWMgT01QSW5SZWR1Y3Rpb25DbGF1c2UgKgorICBDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENvbG9uTG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsIEFycmF5UmVmPEV4cHIgKj4gVkwsCisgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYywKKyAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLCBBcnJheVJlZjxFeHByICo+IFByaXZhdGVzLAorICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBMSFNFeHBycywgQXJyYXlSZWY8RXhwciAqPiBSSFNFeHBycywKKyAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gUmVkdWN0aW9uT3BzLCBBcnJheVJlZjxFeHByICo+IFRhc2tncm91cERlc2NyaXB0b3JzLAorICAgICAgICAgU3RtdCAqUHJlSW5pdCwgRXhwciAqUG9zdFVwZGF0ZSk7CisKKyAgLy8vIENyZWF0ZXMgYW4gZW1wdHkgY2xhdXNlIHdpdGggdGhlIHBsYWNlIGZvciBcYSBOIHZhcmlhYmxlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBOIFRoZSBudW1iZXIgb2YgdmFyaWFibGVzLgorICBzdGF0aWMgT01QSW5SZWR1Y3Rpb25DbGF1c2UgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE4pOworCisgIC8vLyBHZXRzIGxvY2F0aW9uIG9mICc6JyBzeW1ib2wgaW4gY2xhdXNlLgorICBTb3VyY2VMb2NhdGlvbiBnZXRDb2xvbkxvYygpIGNvbnN0IHsgcmV0dXJuIENvbG9uTG9jOyB9CisKKyAgLy8vIEdldHMgdGhlIG5hbWUgaW5mbyBmb3Igc3BlY2lmaWVkIHJlZHVjdGlvbiBpZGVudGlmaWVyLgorICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZnZXROYW1lSW5mbygpIGNvbnN0IHsgcmV0dXJuIE5hbWVJbmZvOyB9CisKKyAgLy8vIEdldHMgdGhlIG5lc3RlZCBuYW1lIHNwZWNpZmllci4KKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBnZXRRdWFsaWZpZXJMb2MoKSBjb25zdCB7IHJldHVybiBRdWFsaWZpZXJMb2M7IH0KKworICB1c2luZyBoZWxwZXJfZXhwcl9pdGVyYXRvciA9IE11dGFibGVBcnJheVJlZjxFeHByICo+OjppdGVyYXRvcjsKKyAgdXNpbmcgaGVscGVyX2V4cHJfY29uc3RfaXRlcmF0b3IgPSBBcnJheVJlZjxjb25zdCBFeHByICo+OjppdGVyYXRvcjsKKyAgdXNpbmcgaGVscGVyX2V4cHJfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxoZWxwZXJfZXhwcl9pdGVyYXRvcj47CisgIHVzaW5nIGhlbHBlcl9leHByX2NvbnN0X3JhbmdlID0KKyAgICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGhlbHBlcl9leHByX2NvbnN0X2l0ZXJhdG9yPjsKKworICBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZSBwcml2YXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gaGVscGVyX2V4cHJfY29uc3RfcmFuZ2UoZ2V0UHJpdmF0ZXMoKS5iZWdpbigpLCBnZXRQcml2YXRlcygpLmVuZCgpKTsKKyAgfQorCisgIGhlbHBlcl9leHByX3JhbmdlIHByaXZhdGVzKCkgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9yYW5nZShnZXRQcml2YXRlcygpLmJlZ2luKCksIGdldFByaXZhdGVzKCkuZW5kKCkpOworICB9CisKKyAgaGVscGVyX2V4cHJfY29uc3RfcmFuZ2UgbGhzX2V4cHJzKCkgY29uc3QgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZShnZXRMSFNFeHBycygpLmJlZ2luKCksIGdldExIU0V4cHJzKCkuZW5kKCkpOworICB9CisKKyAgaGVscGVyX2V4cHJfcmFuZ2UgbGhzX2V4cHJzKCkgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9yYW5nZShnZXRMSFNFeHBycygpLmJlZ2luKCksIGdldExIU0V4cHJzKCkuZW5kKCkpOworICB9CisKKyAgaGVscGVyX2V4cHJfY29uc3RfcmFuZ2UgcmhzX2V4cHJzKCkgY29uc3QgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZShnZXRSSFNFeHBycygpLmJlZ2luKCksIGdldFJIU0V4cHJzKCkuZW5kKCkpOworICB9CisKKyAgaGVscGVyX2V4cHJfcmFuZ2UgcmhzX2V4cHJzKCkgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9yYW5nZShnZXRSSFNFeHBycygpLmJlZ2luKCksIGdldFJIU0V4cHJzKCkuZW5kKCkpOworICB9CisKKyAgaGVscGVyX2V4cHJfY29uc3RfcmFuZ2UgcmVkdWN0aW9uX29wcygpIGNvbnN0IHsKKyAgICByZXR1cm4gaGVscGVyX2V4cHJfY29uc3RfcmFuZ2UoZ2V0UmVkdWN0aW9uT3BzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVkdWN0aW9uT3BzKCkuZW5kKCkpOworICB9CisKKyAgaGVscGVyX2V4cHJfcmFuZ2UgcmVkdWN0aW9uX29wcygpIHsKKyAgICByZXR1cm4gaGVscGVyX2V4cHJfcmFuZ2UoZ2V0UmVkdWN0aW9uT3BzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVkdWN0aW9uT3BzKCkuZW5kKCkpOworICB9CisKKyAgaGVscGVyX2V4cHJfY29uc3RfcmFuZ2UgdGFza2dyb3VwX2Rlc2NyaXB0b3JzKCkgY29uc3QgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZShnZXRUYXNrZ3JvdXBEZXNjcmlwdG9ycygpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRhc2tncm91cERlc2NyaXB0b3JzKCkuZW5kKCkpOworICB9CisKKyAgaGVscGVyX2V4cHJfcmFuZ2UgdGFza2dyb3VwX2Rlc2NyaXB0b3JzKCkgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9yYW5nZShnZXRUYXNrZ3JvdXBEZXNjcmlwdG9ycygpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRhc2tncm91cERlc2NyaXB0b3JzKCkuZW5kKCkpOworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9iZWdpbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2VuZCgpKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgeworICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ19pbl9yZWR1Y3Rpb247CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzIGNsYXVzZSAnbGluZWFyJyBpbiB0aGUgJyNwcmFnbWEgb21wIC4uLicKKy8vLyBkaXJlY3RpdmVzLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBzaW1kIGxpbmVhcihhLGIgOiAyKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgc2ltZCcgaGFzIGNsYXVzZSAnbGluZWFyJworLy8vIHdpdGggdmFyaWFibGVzICdhJywgJ2InIGFuZCBsaW5lYXIgc3RlcCAnMicuCitjbGFzcyBPTVBMaW5lYXJDbGF1c2UgZmluYWwKKyAgICA6IHB1YmxpYyBPTVBWYXJMaXN0Q2xhdXNlPE9NUExpbmVhckNsYXVzZT4sCisgICAgICBwdWJsaWMgT01QQ2xhdXNlV2l0aFBvc3RVcGRhdGUsCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxPTVBMaW5lYXJDbGF1c2UsIEV4cHIgKj4geworICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOworICBmcmllbmQgT01QVmFyTGlzdENsYXVzZTsKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKworICAvLy8gXGJyaWVmIE1vZGlmaWVyIG9mICdsaW5lYXInIGNsYXVzZS4KKyAgT3Blbk1QTGluZWFyQ2xhdXNlS2luZCBNb2RpZmllciA9IE9NUENfTElORUFSX3ZhbDsKKworICAvLy8gXGJyaWVmIExvY2F0aW9uIG9mIGxpbmVhciBtb2RpZmllciBpZiBhbnkuCisgIFNvdXJjZUxvY2F0aW9uIE1vZGlmaWVyTG9jOworCisgIC8vLyBcYnJpZWYgTG9jYXRpb24gb2YgJzonLgorICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYzsKKworICAvLy8gXGJyaWVmIFNldHMgdGhlIGxpbmVhciBzdGVwIGZvciBjbGF1c2UuCisgIHZvaWQgc2V0U3RlcChFeHByICpTdGVwKSB7ICooZ2V0RmluYWxzKCkuZW5kKCkpID0gU3RlcDsgfQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgZXhwcmVzc2lvbiB0byBjYWxjdWxhdGUgbGluZWFyIHN0ZXAgZm9yIGNsYXVzZS4KKyAgdm9pZCBzZXRDYWxjU3RlcChFeHByICpDYWxjU3RlcCkgeyAqKGdldEZpbmFscygpLmVuZCgpICsgMSkgPSBDYWxjU3RlcDsgfQorCisgIC8vLyBcYnJpZWYgQnVpbGQgJ2xpbmVhcicgY2xhdXNlIHdpdGggZ2l2ZW4gbnVtYmVyIG9mIHZhcmlhYmxlcyBcYSBOdW1WYXJzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCisgIC8vLyBccGFyYW0gQ29sb25Mb2MgTG9jYXRpb24gb2YgJzonLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1WYXJzIE51bWJlciBvZiB2YXJpYWJsZXMuCisgIE9NUExpbmVhckNsYXVzZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgT3Blbk1QTGluZWFyQ2xhdXNlS2luZCBNb2RpZmllciwgU291cmNlTG9jYXRpb24gTW9kaWZpZXJMb2MsCisgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtVmFycykKKyAgICAgIDogT01QVmFyTGlzdENsYXVzZTxPTVBMaW5lYXJDbGF1c2U+KE9NUENfbGluZWFyLCBTdGFydExvYywgTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kTG9jLCBOdW1WYXJzKSwKKyAgICAgICAgT01QQ2xhdXNlV2l0aFBvc3RVcGRhdGUodGhpcyksIE1vZGlmaWVyKE1vZGlmaWVyKSwKKyAgICAgICAgTW9kaWZpZXJMb2MoTW9kaWZpZXJMb2MpLCBDb2xvbkxvYyhDb2xvbkxvYykge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTnVtVmFycyBOdW1iZXIgb2YgdmFyaWFibGVzLgorICBleHBsaWNpdCBPTVBMaW5lYXJDbGF1c2UodW5zaWduZWQgTnVtVmFycykKKyAgICAgIDogT01QVmFyTGlzdENsYXVzZTxPTVBMaW5lYXJDbGF1c2U+KE9NUENfbGluZWFyLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVZhcnMpLAorICAgICAgICBPTVBDbGF1c2VXaXRoUG9zdFVwZGF0ZSh0aGlzKSB7fQorCisgIC8vLyBcYnJpZWYgR2V0cyB0aGUgbGlzdCBvZiBpbml0aWFsIHZhbHVlcyBmb3IgbGluZWFyIHZhcmlhYmxlcy4KKyAgLy8vCisgIC8vLyBUaGVyZSBhcmUgTnVtVmFycyBleHByZXNzaW9ucyB3aXRoIGluaXRpYWwgdmFsdWVzIGFsbG9jYXRlZCBhZnRlciB0aGUKKyAgLy8vIHZhcmxpc3QsIHRoZXkgYXJlIGZvbGxvd2VkIGJ5IE51bVZhcnMgdXBkYXRlIGV4cHJlc3Npb25zICh1c2VkIHRvIHVwZGF0ZQorICAvLy8gdGhlIGxpbmVhciB2YXJpYWJsZSdzIHZhbHVlIG9uIGN1cnJlbnQgaXRlcmF0aW9uKSBhbmQgdGhleSBhcmUgZm9sbG93ZWQgYnkKKyAgLy8vIE51bVZhcnMgZmluYWwgZXhwcmVzc2lvbnMgKHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBsaW5lYXIgdmFyaWFibGUncworICAvLy8gdmFsdWUgYWZ0ZXIgdGhlIGxvb3AgYm9keSkuIEFmdGVyIHRoZXNlIGxpc3RzLCB0aGVyZSBhcmUgMiBoZWxwZXIKKyAgLy8vIGV4cHJlc3Npb25zIC0gbGluZWFyIHN0ZXAgYW5kIGEgaGVscGVyIHRvIGNhbGN1bGF0ZSBpdCBiZWZvcmUgdGhlCisgIC8vLyBsb29wIGJvZHkgKHVzZWQgd2hlbiB0aGUgbGluZWFyIHN0ZXAgaXMgbm90IGNvbnN0YW50KToKKyAgLy8vCisgIC8vLyB7IFZhcnNbXSAvKiBpbiBPTVBWYXJMaXN0Q2xhdXNlICovOyBQcml2YXRlc1tdOyBJbml0c1tdOyBVcGRhdGVzW107CisgIC8vLyBGaW5hbHNbXTsgU3RlcDsgQ2FsY1N0ZXA7IH0KKyAgTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4gZ2V0UHJpdmF0ZXMoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxFeHByICo+KHZhcmxpc3RfZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorICBBcnJheVJlZjxjb25zdCBFeHByICo+IGdldFByaXZhdGVzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYodmFybGlzdF9lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisKKyAgTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4gZ2V0SW5pdHMoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxFeHByICo+KGdldFByaXZhdGVzKCkuZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorICBBcnJheVJlZjxjb25zdCBFeHByICo+IGdldEluaXRzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoZ2V0UHJpdmF0ZXMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBsaXN0IG9mIHVwZGF0ZSBleHByZXNzaW9ucyBmb3IgbGluZWFyIHZhcmlhYmxlcy4KKyAgTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4gZ2V0VXBkYXRlcygpIHsKKyAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4oZ2V0SW5pdHMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisgIEFycmF5UmVmPGNvbnN0IEV4cHIgKj4gZ2V0VXBkYXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKGdldEluaXRzKCkuZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbGlzdCBvZiBmaW5hbCB1cGRhdGUgZXhwcmVzc2lvbnMgZm9yIGxpbmVhciB2YXJpYWJsZXMuCisgIE11dGFibGVBcnJheVJlZjxFeHByICo+IGdldEZpbmFscygpIHsKKyAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4oZ2V0VXBkYXRlcygpLmVuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKyAgQXJyYXlSZWY8Y29uc3QgRXhwciAqPiBnZXRGaW5hbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZihnZXRVcGRhdGVzKCkuZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbGlzdCBvZiB0aGUgY29waWVzIG9mIG9yaWdpbmFsIGxpbmVhciB2YXJpYWJsZXMuCisgIC8vLyBccGFyYW0gUEwgTGlzdCBvZiBleHByZXNzaW9ucy4KKyAgdm9pZCBzZXRQcml2YXRlcyhBcnJheVJlZjxFeHByICo+IFBMKTsKKworICAvLy8gXGJyaWVmIFNldHMgdGhlIGxpc3Qgb2YgdGhlIGluaXRpYWwgdmFsdWVzIGZvciBsaW5lYXIgdmFyaWFibGVzLgorICAvLy8gXHBhcmFtIElMIExpc3Qgb2YgZXhwcmVzc2lvbnMuCisgIHZvaWQgc2V0SW5pdHMoQXJyYXlSZWY8RXhwciAqPiBJTCk7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGNsYXVzZSB3aXRoIGEgbGlzdCBvZiB2YXJpYWJsZXMgXGEgVkwgYW5kIGEgbGluZWFyIHN0ZXAKKyAgLy8vIFxhIFN0ZXAuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIENvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBMUGFyZW5Mb2MgTG9jYXRpb24gb2YgJygnLgorICAvLy8gXHBhcmFtIE1vZGlmaWVyIE1vZGlmaWVyIG9mICdsaW5lYXInIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBNb2RpZmllckxvYyBNb2RpZmllciBsb2NhdGlvbi4KKyAgLy8vIFxwYXJhbSBDb2xvbkxvYyBMb2NhdGlvbiBvZiAnOicuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIFZMIExpc3Qgb2YgcmVmZXJlbmNlcyB0byB0aGUgdmFyaWFibGVzLgorICAvLy8gXHBhcmFtIFBMIExpc3Qgb2YgcHJpdmF0ZSBjb3BpZXMgb2Ygb3JpZ2luYWwgdmFyaWFibGVzLgorICAvLy8gXHBhcmFtIElMIExpc3Qgb2YgaW5pdGlhbCB2YWx1ZXMgZm9yIHRoZSB2YXJpYWJsZXMuCisgIC8vLyBccGFyYW0gU3RlcCBMaW5lYXIgc3RlcC4KKyAgLy8vIFxwYXJhbSBDYWxjU3RlcCBDYWxjdWxhdGlvbiBvZiB0aGUgbGluZWFyIHN0ZXAuCisgIC8vLyBccGFyYW0gUHJlSW5pdCBTdGF0ZW1lbnQgdGhhdCBtdXN0IGJlIGV4ZWN1dGVkIGJlZm9yZSBlbnRlcmluZyB0aGUgT3Blbk1QCisgIC8vLyByZWdpb24gd2l0aCB0aGlzIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBQb3N0VXBkYXRlIEV4cHJlc3Npb24gdGhhdCBtdXN0IGJlIGV4ZWN1dGVkIGFmdGVyIGV4aXQgZnJvbSB0aGUKKyAgLy8vIE9wZW5NUCByZWdpb24gd2l0aCB0aGlzIGNsYXVzZS4KKyAgc3RhdGljIE9NUExpbmVhckNsYXVzZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgT3Blbk1QTGluZWFyQ2xhdXNlS2luZCBNb2RpZmllciwgU291cmNlTG9jYXRpb24gTW9kaWZpZXJMb2MsCisgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLCBBcnJheVJlZjxFeHByICo+IFZMLAorICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBQTCwgQXJyYXlSZWY8RXhwciAqPiBJTCwgRXhwciAqU3RlcCwgRXhwciAqQ2FsY1N0ZXAsCisgICAgICAgICBTdG10ICpQcmVJbml0LCBFeHByICpQb3N0VXBkYXRlKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgY2xhdXNlIHdpdGggdGhlIHBsYWNlIGZvciBcYSBOdW1WYXJzIHZhcmlhYmxlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBOdW1WYXJzIE51bWJlciBvZiB2YXJpYWJsZXMuCisgIHN0YXRpYyBPTVBMaW5lYXJDbGF1c2UgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE51bVZhcnMpOworCisgIC8vLyBcYnJpZWYgU2V0IG1vZGlmaWVyLgorICB2b2lkIHNldE1vZGlmaWVyKE9wZW5NUExpbmVhckNsYXVzZUtpbmQgS2luZCkgeyBNb2RpZmllciA9IEtpbmQ7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiBtb2RpZmllci4KKyAgT3Blbk1QTGluZWFyQ2xhdXNlS2luZCBnZXRNb2RpZmllcigpIGNvbnN0IHsgcmV0dXJuIE1vZGlmaWVyOyB9CisKKyAgLy8vIFxicmllZiBTZXQgbW9kaWZpZXIgbG9jYXRpb24uCisgIHZvaWQgc2V0TW9kaWZpZXJMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IE1vZGlmaWVyTG9jID0gTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gbW9kaWZpZXIgbG9jYXRpb24uCisgIFNvdXJjZUxvY2F0aW9uIGdldE1vZGlmaWVyTG9jKCkgY29uc3QgeyByZXR1cm4gTW9kaWZpZXJMb2M7IH0KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIGxvY2F0aW9uIG9mICc6Jy4KKyAgdm9pZCBzZXRDb2xvbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgQ29sb25Mb2MgPSBMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mICc6Jy4KKyAgU291cmNlTG9jYXRpb24gZ2V0Q29sb25Mb2MoKSBjb25zdCB7IHJldHVybiBDb2xvbkxvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBsaW5lYXIgc3RlcC4KKyAgRXhwciAqZ2V0U3RlcCgpIHsgcmV0dXJuICooZ2V0RmluYWxzKCkuZW5kKCkpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGxpbmVhciBzdGVwLgorICBjb25zdCBFeHByICpnZXRTdGVwKCkgY29uc3QgeyByZXR1cm4gKihnZXRGaW5hbHMoKS5lbmQoKSk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgZXhwcmVzc2lvbiB0byBjYWxjdWxhdGUgbGluZWFyIHN0ZXAuCisgIEV4cHIgKmdldENhbGNTdGVwKCkgeyByZXR1cm4gKihnZXRGaW5hbHMoKS5lbmQoKSArIDEpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGV4cHJlc3Npb24gdG8gY2FsY3VsYXRlIGxpbmVhciBzdGVwLgorICBjb25zdCBFeHByICpnZXRDYWxjU3RlcCgpIGNvbnN0IHsgcmV0dXJuICooZ2V0RmluYWxzKCkuZW5kKCkgKyAxKTsgfQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbGlzdCBvZiB1cGRhdGUgZXhwcmVzc2lvbnMgZm9yIGxpbmVhciB2YXJpYWJsZXMuCisgIC8vLyBccGFyYW0gVUwgTGlzdCBvZiBleHByZXNzaW9ucy4KKyAgdm9pZCBzZXRVcGRhdGVzKEFycmF5UmVmPEV4cHIgKj4gVUwpOworCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbGlzdCBvZiBmaW5hbCB1cGRhdGUgZXhwcmVzc2lvbnMgZm9yIGxpbmVhciB2YXJpYWJsZXMuCisgIC8vLyBccGFyYW0gRkwgTGlzdCBvZiBleHByZXNzaW9ucy4KKyAgdm9pZCBzZXRGaW5hbHMoQXJyYXlSZWY8RXhwciAqPiBGTCk7CisKKyAgdXNpbmcgcHJpdmF0ZXNfaXRlcmF0b3IgPSBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIHByaXZhdGVzX2NvbnN0X2l0ZXJhdG9yID0gQXJyYXlSZWY8Y29uc3QgRXhwciAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIHByaXZhdGVzX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8cHJpdmF0ZXNfaXRlcmF0b3I+OworICB1c2luZyBwcml2YXRlc19jb25zdF9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPHByaXZhdGVzX2NvbnN0X2l0ZXJhdG9yPjsKKworICBwcml2YXRlc19yYW5nZSBwcml2YXRlcygpIHsKKyAgICByZXR1cm4gcHJpdmF0ZXNfcmFuZ2UoZ2V0UHJpdmF0ZXMoKS5iZWdpbigpLCBnZXRQcml2YXRlcygpLmVuZCgpKTsKKyAgfQorCisgIHByaXZhdGVzX2NvbnN0X3JhbmdlIHByaXZhdGVzKCkgY29uc3QgeworICAgIHJldHVybiBwcml2YXRlc19jb25zdF9yYW5nZShnZXRQcml2YXRlcygpLmJlZ2luKCksIGdldFByaXZhdGVzKCkuZW5kKCkpOworICB9CisKKyAgdXNpbmcgaW5pdHNfaXRlcmF0b3IgPSBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIGluaXRzX2NvbnN0X2l0ZXJhdG9yID0gQXJyYXlSZWY8Y29uc3QgRXhwciAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIGluaXRzX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8aW5pdHNfaXRlcmF0b3I+OworICB1c2luZyBpbml0c19jb25zdF9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGluaXRzX2NvbnN0X2l0ZXJhdG9yPjsKKworICBpbml0c19yYW5nZSBpbml0cygpIHsKKyAgICByZXR1cm4gaW5pdHNfcmFuZ2UoZ2V0SW5pdHMoKS5iZWdpbigpLCBnZXRJbml0cygpLmVuZCgpKTsKKyAgfQorCisgIGluaXRzX2NvbnN0X3JhbmdlIGluaXRzKCkgY29uc3QgeworICAgIHJldHVybiBpbml0c19jb25zdF9yYW5nZShnZXRJbml0cygpLmJlZ2luKCksIGdldEluaXRzKCkuZW5kKCkpOworICB9CisKKyAgdXNpbmcgdXBkYXRlc19pdGVyYXRvciA9IE11dGFibGVBcnJheVJlZjxFeHByICo+OjppdGVyYXRvcjsKKyAgdXNpbmcgdXBkYXRlc19jb25zdF9pdGVyYXRvciA9IEFycmF5UmVmPGNvbnN0IEV4cHIgKj46Oml0ZXJhdG9yOworICB1c2luZyB1cGRhdGVzX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8dXBkYXRlc19pdGVyYXRvcj47CisgIHVzaW5nIHVwZGF0ZXNfY29uc3RfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTx1cGRhdGVzX2NvbnN0X2l0ZXJhdG9yPjsKKworICB1cGRhdGVzX3JhbmdlIHVwZGF0ZXMoKSB7CisgICAgcmV0dXJuIHVwZGF0ZXNfcmFuZ2UoZ2V0VXBkYXRlcygpLmJlZ2luKCksIGdldFVwZGF0ZXMoKS5lbmQoKSk7CisgIH0KKworICB1cGRhdGVzX2NvbnN0X3JhbmdlIHVwZGF0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHVwZGF0ZXNfY29uc3RfcmFuZ2UoZ2V0VXBkYXRlcygpLmJlZ2luKCksIGdldFVwZGF0ZXMoKS5lbmQoKSk7CisgIH0KKworICB1c2luZyBmaW5hbHNfaXRlcmF0b3IgPSBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIGZpbmFsc19jb25zdF9pdGVyYXRvciA9IEFycmF5UmVmPGNvbnN0IEV4cHIgKj46Oml0ZXJhdG9yOworICB1c2luZyBmaW5hbHNfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxmaW5hbHNfaXRlcmF0b3I+OworICB1c2luZyBmaW5hbHNfY29uc3RfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxmaW5hbHNfY29uc3RfaXRlcmF0b3I+OworCisgIGZpbmFsc19yYW5nZSBmaW5hbHMoKSB7CisgICAgcmV0dXJuIGZpbmFsc19yYW5nZShnZXRGaW5hbHMoKS5iZWdpbigpLCBnZXRGaW5hbHMoKS5lbmQoKSk7CisgIH0KKworICBmaW5hbHNfY29uc3RfcmFuZ2UgZmluYWxzKCkgY29uc3QgeworICAgIHJldHVybiBmaW5hbHNfY29uc3RfcmFuZ2UoZ2V0RmluYWxzKCkuYmVnaW4oKSwgZ2V0RmluYWxzKCkuZW5kKCkpOworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9iZWdpbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2VuZCgpKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgeworICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ19saW5lYXI7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzIGNsYXVzZSAnYWxpZ25lZCcgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nCisvLy8gZGlyZWN0aXZlcy4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgc2ltZCBhbGlnbmVkKGEsYiA6IDgpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBzaW1kJyBoYXMgY2xhdXNlICdhbGlnbmVkJworLy8vIHdpdGggdmFyaWFibGVzICdhJywgJ2InIGFuZCBhbGlnbm1lbnQgJzgnLgorY2xhc3MgT01QQWxpZ25lZENsYXVzZSBmaW5hbAorICAgIDogcHVibGljIE9NUFZhckxpc3RDbGF1c2U8T01QQWxpZ25lZENsYXVzZT4sCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxPTVBBbGlnbmVkQ2xhdXNlLCBFeHByICo+IHsKKyAgZnJpZW5kIGNsYXNzIE9NUENsYXVzZVJlYWRlcjsKKyAgZnJpZW5kIE9NUFZhckxpc3RDbGF1c2U7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgLy8vIFxicmllZiBMb2NhdGlvbiBvZiAnOicuCisgIFNvdXJjZUxvY2F0aW9uIENvbG9uTG9jOworCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgYWxpZ25tZW50IGZvciBjbGF1c2UuCisgIHZvaWQgc2V0QWxpZ25tZW50KEV4cHIgKkEpIHsgKnZhcmxpc3RfZW5kKCkgPSBBOyB9CisKKyAgLy8vIFxicmllZiBCdWlsZCAnYWxpZ25lZCcgY2xhdXNlIHdpdGggZ2l2ZW4gbnVtYmVyIG9mIHZhcmlhYmxlcyBcYSBOdW1WYXJzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCisgIC8vLyBccGFyYW0gQ29sb25Mb2MgTG9jYXRpb24gb2YgJzonLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1WYXJzIE51bWJlciBvZiB2YXJpYWJsZXMuCisgIE9NUEFsaWduZWRDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVZhcnMpCisgICAgICA6IE9NUFZhckxpc3RDbGF1c2U8T01QQWxpZ25lZENsYXVzZT4oT01QQ19hbGlnbmVkLCBTdGFydExvYywgTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZExvYywgTnVtVmFycyksCisgICAgICAgIENvbG9uTG9jKENvbG9uTG9jKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOdW1WYXJzIE51bWJlciBvZiB2YXJpYWJsZXMuCisgIGV4cGxpY2l0IE9NUEFsaWduZWRDbGF1c2UodW5zaWduZWQgTnVtVmFycykKKyAgICAgIDogT01QVmFyTGlzdENsYXVzZTxPTVBBbGlnbmVkQ2xhdXNlPihPTVBDX2FsaWduZWQsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1WYXJzKSB7fQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBjbGF1c2Ugd2l0aCBhIGxpc3Qgb2YgdmFyaWFibGVzIFxhIFZMIGFuZCBhbGlnbm1lbnQgXGEgQS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgQ29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCisgIC8vLyBccGFyYW0gQ29sb25Mb2MgTG9jYXRpb24gb2YgJzonLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBWTCBMaXN0IG9mIHJlZmVyZW5jZXMgdG8gdGhlIHZhcmlhYmxlcy4KKyAgLy8vIFxwYXJhbSBBIEFsaWdubWVudC4KKyAgc3RhdGljIE9NUEFsaWduZWRDbGF1c2UgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQ29sb25Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLCBBcnJheVJlZjxFeHByICo+IFZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkEpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBjbGF1c2Ugd2l0aCB0aGUgcGxhY2UgZm9yIFxhIE51bVZhcnMgdmFyaWFibGVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIE51bVZhcnMgTnVtYmVyIG9mIHZhcmlhYmxlcy4KKyAgc3RhdGljIE9NUEFsaWduZWRDbGF1c2UgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE51bVZhcnMpOworCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbG9jYXRpb24gb2YgJzonLgorICB2b2lkIHNldENvbG9uTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBDb2xvbkxvYyA9IExvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgJzonLgorICBTb3VyY2VMb2NhdGlvbiBnZXRDb2xvbkxvYygpIGNvbnN0IHsgcmV0dXJuIENvbG9uTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGFsaWdubWVudC4KKyAgRXhwciAqZ2V0QWxpZ25tZW50KCkgeyByZXR1cm4gKnZhcmxpc3RfZW5kKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgYWxpZ25tZW50LgorICBjb25zdCBFeHByICpnZXRBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiAqdmFybGlzdF9lbmQoKTsgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShyZWludGVycHJldF9jYXN0PFN0bXQgKio+KHZhcmxpc3RfYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9lbmQoKSkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfYWxpZ25lZDsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgY2xhdXNlICdjb3B5aW4nIGluIHRoZSAnI3ByYWdtYSBvbXAgLi4uJyBkaXJlY3RpdmVzLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBwYXJhbGxlbCBjb3B5aW4oYSxiKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgcGFyYWxsZWwnIGhhcyBjbGF1c2UgJ2NvcHlpbicKKy8vLyB3aXRoIHRoZSB2YXJpYWJsZXMgJ2EnIGFuZCAnYicuCitjbGFzcyBPTVBDb3B5aW5DbGF1c2UgZmluYWwKKyAgICA6IHB1YmxpYyBPTVBWYXJMaXN0Q2xhdXNlPE9NUENvcHlpbkNsYXVzZT4sCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxPTVBDb3B5aW5DbGF1c2UsIEV4cHIgKj4geworICAvLyBDbGFzcyBoYXMgMyBhZGRpdGlvbmFsIHRhaWwgYWxsb2NhdGVkIGFycmF5czoKKyAgLy8gMS4gTGlzdCBvZiBoZWxwZXIgZXhwcmVzc2lvbnMgZm9yIHByb3BlciBnZW5lcmF0aW9uIG9mIGFzc2lnbm1lbnQgb3BlcmF0aW9uCisgIC8vIHJlcXVpcmVkIGZvciBjb3B5aW4gY2xhdXNlLiBUaGlzIGxpc3QgcmVwcmVzZW50cyBzb3VyY2VzLgorICAvLyAyLiBMaXN0IG9mIGhlbHBlciBleHByZXNzaW9ucyBmb3IgcHJvcGVyIGdlbmVyYXRpb24gb2YgYXNzaWdubWVudCBvcGVyYXRpb24KKyAgLy8gcmVxdWlyZWQgZm9yIGNvcHlpbiBjbGF1c2UuIFRoaXMgbGlzdCByZXByZXNlbnRzIGRlc3RpbmF0aW9ucy4KKyAgLy8gMy4gTGlzdCBvZiBoZWxwZXIgZXhwcmVzc2lvbnMgdGhhdCByZXByZXNlbnRzIGFzc2lnbm1lbnQgb3BlcmF0aW9uOgorICAvLyBcY29kZQorICAvLyBEc3RFeHBycyA9IFNyY0V4cHJzOworICAvLyBcZW5kY29kZQorICAvLyBSZXF1aXJlZCBmb3IgcHJvcGVyIGNvZGVnZW4gb2YgcHJvcGFnYXRpb24gb2YgbWFzdGVyJ3MgdGhyZWFkIHZhbHVlcyBvZgorICAvLyB0aHJlYWRwcml2YXRlIHZhcmlhYmxlcyB0byBsb2NhbCBpbnN0YW5jZXMgb2YgdGhhdCB2YXJpYWJsZXMgaW4gb3RoZXIKKyAgLy8gaW1wbGljaXQgdGhyZWFkcy4KKworICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOworICBmcmllbmQgT01QVmFyTGlzdENsYXVzZTsKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKworICAvLy8gXGJyaWVmIEJ1aWxkIGNsYXVzZSB3aXRoIG51bWJlciBvZiB2YXJpYWJsZXMgXGEgTi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBMUGFyZW5Mb2MgTG9jYXRpb24gb2YgJygnLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOIE51bWJlciBvZiB0aGUgdmFyaWFibGVzIGluIHRoZSBjbGF1c2UuCisgIE9NUENvcHlpbkNsYXVzZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLCB1bnNpZ25lZCBOKQorICAgICAgOiBPTVBWYXJMaXN0Q2xhdXNlPE9NUENvcHlpbkNsYXVzZT4oT01QQ19jb3B5aW4sIFN0YXJ0TG9jLCBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRMb2MsIE4pIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIE4gTnVtYmVyIG9mIHZhcmlhYmxlcy4KKyAgZXhwbGljaXQgT01QQ29weWluQ2xhdXNlKHVuc2lnbmVkIE4pCisgICAgICA6IE9NUFZhckxpc3RDbGF1c2U8T01QQ29weWluQ2xhdXNlPihPTVBDX2NvcHlpbiwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOKSB7fQorCisgIC8vLyBcYnJpZWYgU2V0IGxpc3Qgb2YgaGVscGVyIGV4cHJlc3Npb25zLCByZXF1aXJlZCBmb3IgcHJvcGVyIGNvZGVnZW4gb2YgdGhlCisgIC8vLyBjbGF1c2UuIFRoZXNlIGV4cHJlc3Npb25zIHJlcHJlc2VudCBzb3VyY2UgZXhwcmVzc2lvbiBpbiB0aGUgZmluYWwKKyAgLy8vIGFzc2lnbm1lbnQgc3RhdGVtZW50IHBlcmZvcm1lZCBieSB0aGUgY29weWluIGNsYXVzZS4KKyAgdm9pZCBzZXRTb3VyY2VFeHBycyhBcnJheVJlZjxFeHByICo+IFNyY0V4cHJzKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgbGlzdCBvZiBoZWxwZXIgc291cmNlIGV4cHJlc3Npb25zLgorICBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPiBnZXRTb3VyY2VFeHBycygpIHsKKyAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4odmFybGlzdF9lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisgIEFycmF5UmVmPGNvbnN0IEV4cHIgKj4gZ2V0U291cmNlRXhwcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZih2YXJsaXN0X2VuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCBsaXN0IG9mIGhlbHBlciBleHByZXNzaW9ucywgcmVxdWlyZWQgZm9yIHByb3BlciBjb2RlZ2VuIG9mIHRoZQorICAvLy8gY2xhdXNlLiBUaGVzZSBleHByZXNzaW9ucyByZXByZXNlbnQgZGVzdGluYXRpb24gZXhwcmVzc2lvbiBpbiB0aGUgZmluYWwKKyAgLy8vIGFzc2lnbm1lbnQgc3RhdGVtZW50IHBlcmZvcm1lZCBieSB0aGUgY29weWluIGNsYXVzZS4KKyAgdm9pZCBzZXREZXN0aW5hdGlvbkV4cHJzKEFycmF5UmVmPEV4cHIgKj4gRHN0RXhwcnMpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBsaXN0IG9mIGhlbHBlciBkZXN0aW5hdGlvbiBleHByZXNzaW9ucy4KKyAgTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4gZ2V0RGVzdGluYXRpb25FeHBycygpIHsKKyAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4oZ2V0U291cmNlRXhwcnMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisgIEFycmF5UmVmPGNvbnN0IEV4cHIgKj4gZ2V0RGVzdGluYXRpb25FeHBycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKGdldFNvdXJjZUV4cHJzKCkuZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IGxpc3Qgb2YgaGVscGVyIGFzc2lnbm1lbnQgZXhwcmVzc2lvbnMsIHJlcXVpcmVkIGZvciBwcm9wZXIKKyAgLy8vIGNvZGVnZW4gb2YgdGhlIGNsYXVzZS4gVGhlc2UgZXhwcmVzc2lvbnMgYXJlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbnMgdGhhdAorICAvLy8gYXNzaWduIHNvdXJjZSBoZWxwZXIgZXhwcmVzc2lvbnMgdG8gZGVzdGluYXRpb24gaGVscGVyIGV4cHJlc3Npb25zCisgIC8vLyBjb3JyZXNwb25kaW5nbHkuCisgIHZvaWQgc2V0QXNzaWdubWVudE9wcyhBcnJheVJlZjxFeHByICo+IEFzc2lnbm1lbnRPcHMpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBsaXN0IG9mIGhlbHBlciBhc3NpZ25tZW50IGV4cHJlc3Npb25zLgorICBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPiBnZXRBc3NpZ25tZW50T3BzKCkgeworICAgIHJldHVybiBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPihnZXREZXN0aW5hdGlvbkV4cHJzKCkuZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorICBBcnJheVJlZjxjb25zdCBFeHByICo+IGdldEFzc2lnbm1lbnRPcHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZihnZXREZXN0aW5hdGlvbkV4cHJzKCkuZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBjbGF1c2Ugd2l0aCBhIGxpc3Qgb2YgdmFyaWFibGVzIFxhIFZMLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gVkwgTGlzdCBvZiByZWZlcmVuY2VzIHRvIHRoZSB2YXJpYWJsZXMuCisgIC8vLyBccGFyYW0gU3JjRXhwcnMgTGlzdCBvZiBoZWxwZXIgZXhwcmVzc2lvbnMgZm9yIHByb3BlciBnZW5lcmF0aW9uIG9mCisgIC8vLyBhc3NpZ25tZW50IG9wZXJhdGlvbiByZXF1aXJlZCBmb3IgY29weWluIGNsYXVzZS4gVGhpcyBsaXN0IHJlcHJlc2VudHMKKyAgLy8vIHNvdXJjZXMuCisgIC8vLyBccGFyYW0gRHN0RXhwcnMgTGlzdCBvZiBoZWxwZXIgZXhwcmVzc2lvbnMgZm9yIHByb3BlciBnZW5lcmF0aW9uIG9mCisgIC8vLyBhc3NpZ25tZW50IG9wZXJhdGlvbiByZXF1aXJlZCBmb3IgY29weWluIGNsYXVzZS4gVGhpcyBsaXN0IHJlcHJlc2VudHMKKyAgLy8vIGRlc3RpbmF0aW9ucy4KKyAgLy8vIFxwYXJhbSBBc3NpZ25tZW50T3BzIExpc3Qgb2YgaGVscGVyIGV4cHJlc3Npb25zIHRoYXQgcmVwcmVzZW50cyBhc3NpZ25tZW50CisgIC8vLyBvcGVyYXRpb246CisgIC8vLyBcY29kZQorICAvLy8gRHN0RXhwcnMgPSBTcmNFeHByczsKKyAgLy8vIFxlbmRjb2RlCisgIC8vLyBSZXF1aXJlZCBmb3IgcHJvcGVyIGNvZGVnZW4gb2YgcHJvcGFnYXRpb24gb2YgbWFzdGVyJ3MgdGhyZWFkIHZhbHVlcyBvZgorICAvLy8gdGhyZWFkcHJpdmF0ZSB2YXJpYWJsZXMgdG8gbG9jYWwgaW5zdGFuY2VzIG9mIHRoYXQgdmFyaWFibGVzIGluIG90aGVyCisgIC8vLyBpbXBsaWNpdCB0aHJlYWRzLgorICBzdGF0aWMgT01QQ29weWluQ2xhdXNlICoKKyAgQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsIEFycmF5UmVmPEV4cHIgKj4gVkwsIEFycmF5UmVmPEV4cHIgKj4gU3JjRXhwcnMsCisgICAgICAgICBBcnJheVJlZjxFeHByICo+IERzdEV4cHJzLCBBcnJheVJlZjxFeHByICo+IEFzc2lnbm1lbnRPcHMpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBjbGF1c2Ugd2l0aCBcYSBOIHZhcmlhYmxlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBOIFRoZSBudW1iZXIgb2YgdmFyaWFibGVzLgorICBzdGF0aWMgT01QQ29weWluQ2xhdXNlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBOKTsKKworICB1c2luZyBoZWxwZXJfZXhwcl9pdGVyYXRvciA9IE11dGFibGVBcnJheVJlZjxFeHByICo+OjppdGVyYXRvcjsKKyAgdXNpbmcgaGVscGVyX2V4cHJfY29uc3RfaXRlcmF0b3IgPSBBcnJheVJlZjxjb25zdCBFeHByICo+OjppdGVyYXRvcjsKKyAgdXNpbmcgaGVscGVyX2V4cHJfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxoZWxwZXJfZXhwcl9pdGVyYXRvcj47CisgIHVzaW5nIGhlbHBlcl9leHByX2NvbnN0X3JhbmdlID0KKyAgICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGhlbHBlcl9leHByX2NvbnN0X2l0ZXJhdG9yPjsKKworICBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZSBzb3VyY2VfZXhwcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGhlbHBlcl9leHByX2NvbnN0X3JhbmdlKGdldFNvdXJjZUV4cHJzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U291cmNlRXhwcnMoKS5lbmQoKSk7CisgIH0KKworICBoZWxwZXJfZXhwcl9yYW5nZSBzb3VyY2VfZXhwcnMoKSB7CisgICAgcmV0dXJuIGhlbHBlcl9leHByX3JhbmdlKGdldFNvdXJjZUV4cHJzKCkuYmVnaW4oKSwgZ2V0U291cmNlRXhwcnMoKS5lbmQoKSk7CisgIH0KKworICBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZSBkZXN0aW5hdGlvbl9leHBycygpIGNvbnN0IHsKKyAgICByZXR1cm4gaGVscGVyX2V4cHJfY29uc3RfcmFuZ2UoZ2V0RGVzdGluYXRpb25FeHBycygpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERlc3RpbmF0aW9uRXhwcnMoKS5lbmQoKSk7CisgIH0KKworICBoZWxwZXJfZXhwcl9yYW5nZSBkZXN0aW5hdGlvbl9leHBycygpIHsKKyAgICByZXR1cm4gaGVscGVyX2V4cHJfcmFuZ2UoZ2V0RGVzdGluYXRpb25FeHBycygpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERlc3RpbmF0aW9uRXhwcnMoKS5lbmQoKSk7CisgIH0KKworICBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZSBhc3NpZ25tZW50X29wcygpIGNvbnN0IHsKKyAgICByZXR1cm4gaGVscGVyX2V4cHJfY29uc3RfcmFuZ2UoZ2V0QXNzaWdubWVudE9wcygpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFzc2lnbm1lbnRPcHMoKS5lbmQoKSk7CisgIH0KKworICBoZWxwZXJfZXhwcl9yYW5nZSBhc3NpZ25tZW50X29wcygpIHsKKyAgICByZXR1cm4gaGVscGVyX2V4cHJfcmFuZ2UoZ2V0QXNzaWdubWVudE9wcygpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFzc2lnbm1lbnRPcHMoKS5lbmQoKSk7CisgIH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UocmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2JlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFN0bXQgKio+KHZhcmxpc3RfZW5kKCkpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldENsYXVzZUtpbmQoKSA9PSBPTVBDX2NvcHlpbjsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgY2xhdXNlICdjb3B5cHJpdmF0ZScgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nCisvLy8gZGlyZWN0aXZlcy4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgc2luZ2xlIGNvcHlwcml2YXRlKGEsYikKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHNpbmdsZScgaGFzIGNsYXVzZSAnY29weXByaXZhdGUnCisvLy8gd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InLgorY2xhc3MgT01QQ29weXByaXZhdGVDbGF1c2UgZmluYWwKKyAgICA6IHB1YmxpYyBPTVBWYXJMaXN0Q2xhdXNlPE9NUENvcHlwcml2YXRlQ2xhdXNlPiwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPE9NUENvcHlwcml2YXRlQ2xhdXNlLCBFeHByICo+IHsKKyAgZnJpZW5kIGNsYXNzIE9NUENsYXVzZVJlYWRlcjsKKyAgZnJpZW5kIE9NUFZhckxpc3RDbGF1c2U7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgLy8vIFxicmllZiBCdWlsZCBjbGF1c2Ugd2l0aCBudW1iZXIgb2YgdmFyaWFibGVzIFxhIE4uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTiBOdW1iZXIgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgY2xhdXNlLgorICBPTVBDb3B5cHJpdmF0ZUNsYXVzZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsIHVuc2lnbmVkIE4pCisgICAgICA6IE9NUFZhckxpc3RDbGF1c2U8T01QQ29weXByaXZhdGVDbGF1c2U+KE9NUENfY29weXByaXZhdGUsIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUGFyZW5Mb2MsIEVuZExvYywgTikge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTiBOdW1iZXIgb2YgdmFyaWFibGVzLgorICBleHBsaWNpdCBPTVBDb3B5cHJpdmF0ZUNsYXVzZSh1bnNpZ25lZCBOKQorICAgICAgOiBPTVBWYXJMaXN0Q2xhdXNlPE9NUENvcHlwcml2YXRlQ2xhdXNlPigKKyAgICAgICAgICAgIE9NUENfY29weXByaXZhdGUsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBOKSB7fQorCisgIC8vLyBcYnJpZWYgU2V0IGxpc3Qgb2YgaGVscGVyIGV4cHJlc3Npb25zLCByZXF1aXJlZCBmb3IgcHJvcGVyIGNvZGVnZW4gb2YgdGhlCisgIC8vLyBjbGF1c2UuIFRoZXNlIGV4cHJlc3Npb25zIHJlcHJlc2VudCBzb3VyY2UgZXhwcmVzc2lvbiBpbiB0aGUgZmluYWwKKyAgLy8vIGFzc2lnbm1lbnQgc3RhdGVtZW50IHBlcmZvcm1lZCBieSB0aGUgY29weXByaXZhdGUgY2xhdXNlLgorICB2b2lkIHNldFNvdXJjZUV4cHJzKEFycmF5UmVmPEV4cHIgKj4gU3JjRXhwcnMpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBsaXN0IG9mIGhlbHBlciBzb3VyY2UgZXhwcmVzc2lvbnMuCisgIE11dGFibGVBcnJheVJlZjxFeHByICo+IGdldFNvdXJjZUV4cHJzKCkgeworICAgIHJldHVybiBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPih2YXJsaXN0X2VuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKyAgQXJyYXlSZWY8Y29uc3QgRXhwciAqPiBnZXRTb3VyY2VFeHBycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKHZhcmxpc3RfZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IGxpc3Qgb2YgaGVscGVyIGV4cHJlc3Npb25zLCByZXF1aXJlZCBmb3IgcHJvcGVyIGNvZGVnZW4gb2YgdGhlCisgIC8vLyBjbGF1c2UuIFRoZXNlIGV4cHJlc3Npb25zIHJlcHJlc2VudCBkZXN0aW5hdGlvbiBleHByZXNzaW9uIGluIHRoZSBmaW5hbAorICAvLy8gYXNzaWdubWVudCBzdGF0ZW1lbnQgcGVyZm9ybWVkIGJ5IHRoZSBjb3B5cHJpdmF0ZSBjbGF1c2UuCisgIHZvaWQgc2V0RGVzdGluYXRpb25FeHBycyhBcnJheVJlZjxFeHByICo+IERzdEV4cHJzKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgbGlzdCBvZiBoZWxwZXIgZGVzdGluYXRpb24gZXhwcmVzc2lvbnMuCisgIE11dGFibGVBcnJheVJlZjxFeHByICo+IGdldERlc3RpbmF0aW9uRXhwcnMoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxFeHByICo+KGdldFNvdXJjZUV4cHJzKCkuZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorICBBcnJheVJlZjxjb25zdCBFeHByICo+IGdldERlc3RpbmF0aW9uRXhwcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZihnZXRTb3VyY2VFeHBycygpLmVuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCBsaXN0IG9mIGhlbHBlciBhc3NpZ25tZW50IGV4cHJlc3Npb25zLCByZXF1aXJlZCBmb3IgcHJvcGVyCisgIC8vLyBjb2RlZ2VuIG9mIHRoZSBjbGF1c2UuIFRoZXNlIGV4cHJlc3Npb25zIGFyZSBhc3NpZ25tZW50IGV4cHJlc3Npb25zIHRoYXQKKyAgLy8vIGFzc2lnbiBzb3VyY2UgaGVscGVyIGV4cHJlc3Npb25zIHRvIGRlc3RpbmF0aW9uIGhlbHBlciBleHByZXNzaW9ucworICAvLy8gY29ycmVzcG9uZGluZ2x5LgorICB2b2lkIHNldEFzc2lnbm1lbnRPcHMoQXJyYXlSZWY8RXhwciAqPiBBc3NpZ25tZW50T3BzKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgbGlzdCBvZiBoZWxwZXIgYXNzaWdubWVudCBleHByZXNzaW9ucy4KKyAgTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4gZ2V0QXNzaWdubWVudE9wcygpIHsKKyAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4oZ2V0RGVzdGluYXRpb25FeHBycygpLmVuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKyAgQXJyYXlSZWY8Y29uc3QgRXhwciAqPiBnZXRBc3NpZ25tZW50T3BzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoZ2V0RGVzdGluYXRpb25FeHBycygpLmVuZCgpLCB2YXJsaXN0X3NpemUoKSk7CisgIH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgY2xhdXNlIHdpdGggYSBsaXN0IG9mIHZhcmlhYmxlcyBcYSBWTC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIFZMIExpc3Qgb2YgcmVmZXJlbmNlcyB0byB0aGUgdmFyaWFibGVzLgorICAvLy8gXHBhcmFtIFNyY0V4cHJzIExpc3Qgb2YgaGVscGVyIGV4cHJlc3Npb25zIGZvciBwcm9wZXIgZ2VuZXJhdGlvbiBvZgorICAvLy8gYXNzaWdubWVudCBvcGVyYXRpb24gcmVxdWlyZWQgZm9yIGNvcHlwcml2YXRlIGNsYXVzZS4gVGhpcyBsaXN0IHJlcHJlc2VudHMKKyAgLy8vIHNvdXJjZXMuCisgIC8vLyBccGFyYW0gRHN0RXhwcnMgTGlzdCBvZiBoZWxwZXIgZXhwcmVzc2lvbnMgZm9yIHByb3BlciBnZW5lcmF0aW9uIG9mCisgIC8vLyBhc3NpZ25tZW50IG9wZXJhdGlvbiByZXF1aXJlZCBmb3IgY29weXByaXZhdGUgY2xhdXNlLiBUaGlzIGxpc3QgcmVwcmVzZW50cworICAvLy8gZGVzdGluYXRpb25zLgorICAvLy8gXHBhcmFtIEFzc2lnbm1lbnRPcHMgTGlzdCBvZiBoZWxwZXIgZXhwcmVzc2lvbnMgdGhhdCByZXByZXNlbnRzIGFzc2lnbm1lbnQKKyAgLy8vIG9wZXJhdGlvbjoKKyAgLy8vIFxjb2RlCisgIC8vLyBEc3RFeHBycyA9IFNyY0V4cHJzOworICAvLy8gXGVuZGNvZGUKKyAgLy8vIFJlcXVpcmVkIGZvciBwcm9wZXIgY29kZWdlbiBvZiBmaW5hbCBhc3NpZ25tZW50IHBlcmZvcm1lZCBieSB0aGUKKyAgLy8vIGNvcHlwcml2YXRlIGNsYXVzZS4KKyAgc3RhdGljIE9NUENvcHlwcml2YXRlQ2xhdXNlICoKKyAgQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsIEFycmF5UmVmPEV4cHIgKj4gVkwsIEFycmF5UmVmPEV4cHIgKj4gU3JjRXhwcnMsCisgICAgICAgICBBcnJheVJlZjxFeHByICo+IERzdEV4cHJzLCBBcnJheVJlZjxFeHByICo+IEFzc2lnbm1lbnRPcHMpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBjbGF1c2Ugd2l0aCBcYSBOIHZhcmlhYmxlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBOIFRoZSBudW1iZXIgb2YgdmFyaWFibGVzLgorICBzdGF0aWMgT01QQ29weXByaXZhdGVDbGF1c2UgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE4pOworCisgIHVzaW5nIGhlbHBlcl9leHByX2l0ZXJhdG9yID0gTXV0YWJsZUFycmF5UmVmPEV4cHIgKj46Oml0ZXJhdG9yOworICB1c2luZyBoZWxwZXJfZXhwcl9jb25zdF9pdGVyYXRvciA9IEFycmF5UmVmPGNvbnN0IEV4cHIgKj46Oml0ZXJhdG9yOworICB1c2luZyBoZWxwZXJfZXhwcl9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGhlbHBlcl9leHByX2l0ZXJhdG9yPjsKKyAgdXNpbmcgaGVscGVyX2V4cHJfY29uc3RfcmFuZ2UgPQorICAgICAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8aGVscGVyX2V4cHJfY29uc3RfaXRlcmF0b3I+OworCisgIGhlbHBlcl9leHByX2NvbnN0X3JhbmdlIHNvdXJjZV9leHBycygpIGNvbnN0IHsKKyAgICByZXR1cm4gaGVscGVyX2V4cHJfY29uc3RfcmFuZ2UoZ2V0U291cmNlRXhwcnMoKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTb3VyY2VFeHBycygpLmVuZCgpKTsKKyAgfQorCisgIGhlbHBlcl9leHByX3JhbmdlIHNvdXJjZV9leHBycygpIHsKKyAgICByZXR1cm4gaGVscGVyX2V4cHJfcmFuZ2UoZ2V0U291cmNlRXhwcnMoKS5iZWdpbigpLCBnZXRTb3VyY2VFeHBycygpLmVuZCgpKTsKKyAgfQorCisgIGhlbHBlcl9leHByX2NvbnN0X3JhbmdlIGRlc3RpbmF0aW9uX2V4cHJzKCkgY29uc3QgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZShnZXREZXN0aW5hdGlvbkV4cHJzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVzdGluYXRpb25FeHBycygpLmVuZCgpKTsKKyAgfQorCisgIGhlbHBlcl9leHByX3JhbmdlIGRlc3RpbmF0aW9uX2V4cHJzKCkgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9yYW5nZShnZXREZXN0aW5hdGlvbkV4cHJzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVzdGluYXRpb25FeHBycygpLmVuZCgpKTsKKyAgfQorCisgIGhlbHBlcl9leHByX2NvbnN0X3JhbmdlIGFzc2lnbm1lbnRfb3BzKCkgY29uc3QgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9jb25zdF9yYW5nZShnZXRBc3NpZ25tZW50T3BzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QXNzaWdubWVudE9wcygpLmVuZCgpKTsKKyAgfQorCisgIGhlbHBlcl9leHByX3JhbmdlIGFzc2lnbm1lbnRfb3BzKCkgeworICAgIHJldHVybiBoZWxwZXJfZXhwcl9yYW5nZShnZXRBc3NpZ25tZW50T3BzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QXNzaWdubWVudE9wcygpLmVuZCgpKTsKKyAgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShyZWludGVycHJldF9jYXN0PFN0bXQgKio+KHZhcmxpc3RfYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9lbmQoKSkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfY29weXByaXZhdGU7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzIGltcGxpY2l0IGNsYXVzZSAnZmx1c2gnIGZvciB0aGUgJyNwcmFnbWEgb21wIGZsdXNoJworLy8vIGRpcmVjdGl2ZS4KKy8vLyBUaGlzIGNsYXVzZSBkb2VzIG5vdCBleGlzdCBieSBpdHNlbGYsIGl0IGNhbiBiZSBvbmx5IGFzIGEgcGFydCBvZiAnb21wCisvLy8gZmx1c2gnIGRpcmVjdGl2ZS4gVGhpcyBjbGF1c2UgaXMgaW50cm9kdWNlZCB0byBrZWVwIHRoZSBvcmlnaW5hbCBzdHJ1Y3R1cmUKKy8vLyBvZiBcYSBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlIGNsYXNzIGFuZCBpdHMgZGVyaXZhdGl2ZXMgYW5kIHRvIHVzZSB0aGUKKy8vLyBleGlzdGluZyBpbmZyYXN0cnVjdHVyZSBvZiBjbGF1c2VzIHdpdGggdGhlIGxpc3Qgb2YgdmFyaWFibGVzLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBmbHVzaChhLGIpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBmbHVzaCcgaGFzIGltcGxpY2l0IGNsYXVzZSAnZmx1c2gnCisvLy8gd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InLgorY2xhc3MgT01QRmx1c2hDbGF1c2UgZmluYWwKKyAgICA6IHB1YmxpYyBPTVBWYXJMaXN0Q2xhdXNlPE9NUEZsdXNoQ2xhdXNlPiwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPE9NUEZsdXNoQ2xhdXNlLCBFeHByICo+IHsKKyAgZnJpZW5kIE9NUFZhckxpc3RDbGF1c2U7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgLy8vIFxicmllZiBCdWlsZCBjbGF1c2Ugd2l0aCBudW1iZXIgb2YgdmFyaWFibGVzIFxhIE4uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTiBOdW1iZXIgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgY2xhdXNlLgorICBPTVBGbHVzaENsYXVzZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsIHVuc2lnbmVkIE4pCisgICAgICA6IE9NUFZhckxpc3RDbGF1c2U8T01QRmx1c2hDbGF1c2U+KE9NUENfZmx1c2gsIFN0YXJ0TG9jLCBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZExvYywgTikge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTiBOdW1iZXIgb2YgdmFyaWFibGVzLgorICBleHBsaWNpdCBPTVBGbHVzaENsYXVzZSh1bnNpZ25lZCBOKQorICAgICAgOiBPTVBWYXJMaXN0Q2xhdXNlPE9NUEZsdXNoQ2xhdXNlPihPTVBDX2ZsdXNoLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOKSB7fQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBjbGF1c2Ugd2l0aCBhIGxpc3Qgb2YgdmFyaWFibGVzIFxhIFZMLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gVkwgTGlzdCBvZiByZWZlcmVuY2VzIHRvIHRoZSB2YXJpYWJsZXMuCisgIHN0YXRpYyBPTVBGbHVzaENsYXVzZSAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBWTCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGNsYXVzZSB3aXRoIFxhIE4gdmFyaWFibGVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIE4gVGhlIG51bWJlciBvZiB2YXJpYWJsZXMuCisgIHN0YXRpYyBPTVBGbHVzaENsYXVzZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywgdW5zaWduZWQgTik7CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9iZWdpbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2VuZCgpKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgeworICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ19mbHVzaDsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgaW1wbGljaXQgY2xhdXNlICdkZXBlbmQnIGZvciB0aGUgJyNwcmFnbWEgb21wIHRhc2snCisvLy8gZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCB0YXNrIGRlcGVuZChpbjphLGIpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCB0YXNrJyB3aXRoIGNsYXVzZSAnZGVwZW5kJyB3aXRoIHRoZQorLy8vIHZhcmlhYmxlcyAnYScgYW5kICdiJyB3aXRoIGRlcGVuZGVuY3kgJ2luJy4KK2NsYXNzIE9NUERlcGVuZENsYXVzZSBmaW5hbAorICAgIDogcHVibGljIE9NUFZhckxpc3RDbGF1c2U8T01QRGVwZW5kQ2xhdXNlPiwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPE9NUERlcGVuZENsYXVzZSwgRXhwciAqPiB7CisgIGZyaWVuZCBjbGFzcyBPTVBDbGF1c2VSZWFkZXI7CisgIGZyaWVuZCBPTVBWYXJMaXN0Q2xhdXNlOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIC8vLyBcYnJpZWYgRGVwZW5kZW5jeSB0eXBlIChvbmUgb2YgaW4sIG91dCwgaW5vdXQpLgorICBPcGVuTVBEZXBlbmRDbGF1c2VLaW5kIERlcEtpbmQgPSBPTVBDX0RFUEVORF91bmtub3duOworCisgIC8vLyBcYnJpZWYgRGVwZW5kZW5jeSB0eXBlIGxvY2F0aW9uLgorICBTb3VyY2VMb2NhdGlvbiBEZXBMb2M7CisKKyAgLy8vIFxicmllZiBDb2xvbiBsb2NhdGlvbi4KKyAgU291cmNlTG9jYXRpb24gQ29sb25Mb2M7CisKKyAgLy8vIFxicmllZiBCdWlsZCBjbGF1c2Ugd2l0aCBudW1iZXIgb2YgdmFyaWFibGVzIFxhIE4uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTiBOdW1iZXIgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgY2xhdXNlLgorICBPTVBEZXBlbmRDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywgdW5zaWduZWQgTikKKyAgICAgIDogT01QVmFyTGlzdENsYXVzZTxPTVBEZXBlbmRDbGF1c2U+KE9NUENfZGVwZW5kLCBTdGFydExvYywgTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kTG9jLCBOKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOIE51bWJlciBvZiB2YXJpYWJsZXMuCisgIGV4cGxpY2l0IE9NUERlcGVuZENsYXVzZSh1bnNpZ25lZCBOKQorICAgICAgOiBPTVBWYXJMaXN0Q2xhdXNlPE9NUERlcGVuZENsYXVzZT4oT01QQ19kZXBlbmQsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTikge30KKworICAvLy8gXGJyaWVmIFNldCBkZXBlbmRlbmN5IGtpbmQuCisgIHZvaWQgc2V0RGVwZW5kZW5jeUtpbmQoT3Blbk1QRGVwZW5kQ2xhdXNlS2luZCBLKSB7IERlcEtpbmQgPSBLOyB9CisKKyAgLy8vIFxicmllZiBTZXQgZGVwZW5kZW5jeSBraW5kIGFuZCBpdHMgbG9jYXRpb24uCisgIHZvaWQgc2V0RGVwZW5kZW5jeUxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgRGVwTG9jID0gTG9jOyB9CisKKyAgLy8vIFxicmllZiBTZXQgY29sb24gbG9jYXRpb24uCisgIHZvaWQgc2V0Q29sb25Mb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IENvbG9uTG9jID0gTG9jOyB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGNsYXVzZSB3aXRoIGEgbGlzdCBvZiB2YXJpYWJsZXMgXGEgVkwuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBMUGFyZW5Mb2MgTG9jYXRpb24gb2YgJygnLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBEZXBLaW5kIERlcGVuZGVuY3kgdHlwZS4KKyAgLy8vIFxwYXJhbSBEZXBMb2MgTG9jYXRpb24gb2YgdGhlIGRlcGVuZGVuY3kgdHlwZS4KKyAgLy8vIFxwYXJhbSBDb2xvbkxvYyBDb2xvbiBsb2NhdGlvbi4KKyAgLy8vIFxwYXJhbSBWTCBMaXN0IG9mIHJlZmVyZW5jZXMgdG8gdGhlIHZhcmlhYmxlcy4KKyAgc3RhdGljIE9NUERlcGVuZENsYXVzZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLCBPcGVuTVBEZXBlbmRDbGF1c2VLaW5kIERlcEtpbmQsCisgICAgICAgICBTb3VyY2VMb2NhdGlvbiBEZXBMb2MsIFNvdXJjZUxvY2F0aW9uIENvbG9uTG9jLCBBcnJheVJlZjxFeHByICo+IFZMKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgY2xhdXNlIHdpdGggXGEgTiB2YXJpYWJsZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gTiBUaGUgbnVtYmVyIG9mIHZhcmlhYmxlcy4KKyAgc3RhdGljIE9NUERlcGVuZENsYXVzZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywgdW5zaWduZWQgTik7CisKKyAgLy8vIFxicmllZiBHZXQgZGVwZW5kZW5jeSB0eXBlLgorICBPcGVuTVBEZXBlbmRDbGF1c2VLaW5kIGdldERlcGVuZGVuY3lLaW5kKCkgY29uc3QgeyByZXR1cm4gRGVwS2luZDsgfQorCisgIC8vLyBcYnJpZWYgR2V0IGRlcGVuZGVuY3kgdHlwZSBsb2NhdGlvbi4KKyAgU291cmNlTG9jYXRpb24gZ2V0RGVwZW5kZW5jeUxvYygpIGNvbnN0IHsgcmV0dXJuIERlcExvYzsgfQorCisgIC8vLyBcYnJpZWYgR2V0IGNvbG9uIGxvY2F0aW9uLgorICBTb3VyY2VMb2NhdGlvbiBnZXRDb2xvbkxvYygpIGNvbnN0IHsgcmV0dXJuIENvbG9uTG9jOyB9CisKKyAgLy8vIFNldCB0aGUgbG9vcCBjb3VudGVyIHZhbHVlIGZvciB0aGUgZGVwZW5kIGNsYXVzZXMgd2l0aCAnc2lua3xzb3VyY2UnIGtpbmQKKyAgLy8vIG9mIGRlcGVuZGVuY3kuIFJlcXVpcmVkIGZvciBjb2RlZ2VuLgorICB2b2lkIHNldENvdW50ZXJWYWx1ZShFeHByICpWKTsKKworICAvLy8gR2V0IHRoZSBsb29wIGNvdW50ZXIgdmFsdWUuCisgIEV4cHIgKmdldENvdW50ZXJWYWx1ZSgpOworCisgIC8vLyBHZXQgdGhlIGxvb3AgY291bnRlciB2YWx1ZS4KKyAgY29uc3QgRXhwciAqZ2V0Q291bnRlclZhbHVlKCkgY29uc3Q7CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9iZWdpbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2VuZCgpKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgeworICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ19kZXBlbmQ7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICdkZXZpY2UnIGNsYXVzZSBpbiB0aGUgJyNwcmFnbWEgb21wIC4uLicKKy8vLyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHRhcmdldCBkZXZpY2UoYSkKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRhcmdldCcgaGFzIGNsYXVzZSAnZGV2aWNlJworLy8vIHdpdGggc2luZ2xlIGV4cHJlc3Npb24gJ2EnLgorY2xhc3MgT01QRGV2aWNlQ2xhdXNlIDogcHVibGljIE9NUENsYXVzZSwgcHVibGljIE9NUENsYXVzZVdpdGhQcmVJbml0IHsKKyAgZnJpZW5kIGNsYXNzIE9NUENsYXVzZVJlYWRlcjsKKworICAvLy8gXGJyaWVmIExvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jOworCisgIC8vLyBcYnJpZWYgRGV2aWNlIG51bWJlci4KKyAgU3RtdCAqRGV2aWNlID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFNldCB0aGUgZGV2aWNlIG51bWJlci4KKyAgLy8vCisgIC8vLyBccGFyYW0gRSBEZXZpY2UgbnVtYmVyLgorICB2b2lkIHNldERldmljZShFeHByICpFKSB7IERldmljZSA9IEU7IH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIEJ1aWxkICdkZXZpY2UnIGNsYXVzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gRSBFeHByZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBDYXB0dXJlUmVnaW9uIElubmVybW9zdCBPcGVuTVAgcmVnaW9uIHdoZXJlIGV4cHJlc3Npb25zIGluIHRoaXMKKyAgLy8vIGNsYXVzZSBtdXN0IGJlIGNhcHR1cmVkLgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIE9NUERldmljZUNsYXVzZShFeHByICpFLCBTdG10ICpIZWxwZXJFLCBPcGVuTVBEaXJlY3RpdmVLaW5kIENhcHR1cmVSZWdpb24sCisgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ19kZXZpY2UsIFN0YXJ0TG9jLCBFbmRMb2MpLCBPTVBDbGF1c2VXaXRoUHJlSW5pdCh0aGlzKSwKKyAgICAgICAgTFBhcmVuTG9jKExQYXJlbkxvYyksIERldmljZShFKSB7CisgICAgc2V0UHJlSW5pdFN0bXQoSGVscGVyRSwgQ2FwdHVyZVJlZ2lvbik7CisgIH0KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KKyAgT01QRGV2aWNlQ2xhdXNlKCkKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfZGV2aWNlLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpKSwKKyAgICAgICAgT01QQ2xhdXNlV2l0aFByZUluaXQodGhpcykge30KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIGxvY2F0aW9uIG9mICcoJy4KKyAgdm9pZCBzZXRMUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IExQYXJlbkxvYyA9IExvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBMUGFyZW5Mb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiBkZXZpY2UgbnVtYmVyLgorICBFeHByICpnZXREZXZpY2UoKSB7IHJldHVybiBjYXN0PEV4cHI+KERldmljZSk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiBkZXZpY2UgbnVtYmVyLgorICBFeHByICpnZXREZXZpY2UoKSBjb25zdCB7IHJldHVybiBjYXN0PEV4cHI+KERldmljZSk7IH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsgcmV0dXJuIGNoaWxkX3JhbmdlKCZEZXZpY2UsICZEZXZpY2UgKyAxKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldENsYXVzZUtpbmQoKSA9PSBPTVBDX2RldmljZTsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJ3RocmVhZHMnIGNsYXVzZSBpbiB0aGUgJyNwcmFnbWEgb21wIC4uLicgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBvcmRlcmVkIHRocmVhZHMKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIG9yZGVyZWQnIGhhcyBzaW1wbGUgJ3RocmVhZHMnIGNsYXVzZS4KK2NsYXNzIE9NUFRocmVhZHNDbGF1c2UgOiBwdWJsaWMgT01QQ2xhdXNlIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBCdWlsZCAndGhyZWFkcycgY2xhdXNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgT01QVGhyZWFkc0NsYXVzZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ190aHJlYWRzLCBTdGFydExvYywgRW5kTG9jKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICBPTVBUaHJlYWRzQ2xhdXNlKCkKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfdGhyZWFkcywgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSkge30KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoY2hpbGRfaXRlcmF0b3IoKSwgY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgeworICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ190aHJlYWRzOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnc2ltZCcgY2xhdXNlIGluIHRoZSAnI3ByYWdtYSBvbXAgLi4uJyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIG9yZGVyZWQgc2ltZAorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgb3JkZXJlZCcgaGFzIHNpbXBsZSAnc2ltZCcgY2xhdXNlLgorY2xhc3MgT01QU0lNRENsYXVzZSA6IHB1YmxpYyBPTVBDbGF1c2UgeworcHVibGljOgorICAvLy8gXGJyaWVmIEJ1aWxkICdzaW1kJyBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICBPTVBTSU1EQ2xhdXNlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpCisgICAgICA6IE9NUENsYXVzZShPTVBDX3NpbWQsIFN0YXJ0TG9jLCBFbmRMb2MpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIE9NUFNJTURDbGF1c2UoKSA6IE9NUENsYXVzZShPTVBDX3NpbWQsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpIHt9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfc2ltZDsKKyAgfQorfTsKKworLy8vIFxicmllZiBTdHJ1Y3QgdGhhdCBkZWZpbmVzIGNvbW1vbiBpbmZyYXN0cnVjdHVyZSB0byBoYW5kbGUgbWFwcGFibGUKKy8vLyBleHByZXNzaW9ucyB1c2VkIGluIE9wZW5NUCBjbGF1c2VzLgorY2xhc3MgT01QQ2xhdXNlTWFwcGFibGVFeHByQ29tbW9uIHsKK3B1YmxpYzoKKyAgLy8gXGJyaWVmIENsYXNzIHRoYXQgcmVwcmVzZW50cyBhIGNvbXBvbmVudCBvZiBhIG1hcHBhYmxlIGV4cHJlc3Npb24uIEUuZy4KKyAgLy8gZm9yIGFuIGV4cHJlc3Npb24gUy5hLCB0aGUgZmlyc3QgY29tcG9uZW50IGlzIGEgZGVjbGFyYXRpb24gcmVmZXJlbmNlCisgIC8vIGV4cHJlc3Npb24gYXNzb2NpYXRlZCB3aXRoICdTJyBhbmQgdGhlIHNlY29uZCBpcyBhIG1lbWJlciBleHByZXNzaW9uCisgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmllbGQgZGVjbGFyYXRpb24gJ2EnLiBJZiB0aGUgZXhwcmVzc2lvbiBpcyBhbiBhcnJheQorICAvLyBzdWJzY3JpcHQgaXQgbWF5IG5vdCBoYXZlIGFueSBhc3NvY2lhdGVkIGRlY2xhcmF0aW9uLiBJbiB0aGF0IGNhc2UgdGhlCisgIC8vIGFzc29jaWF0ZWQgZGVjbGFyYXRpb24gaXMgc2V0IHRvIG51bGxwdHIuCisgIGNsYXNzIE1hcHBhYmxlQ29tcG9uZW50IHsKKyAgICAvLyBcYnJpZWYgRXhwcmVzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbXBvbmVudC4KKyAgICBFeHByICpBc3NvY2lhdGVkRXhwcmVzc2lvbiA9IG51bGxwdHI7CisKKyAgICAvLyBcYnJpZWYgRGVjbGFyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWNsYXJhdGlvbi4gSWYgdGhlIGNvbXBvbmVudCBkb2VzCisgICAgLy8gbm90IGhhdmUgYSBkZWNsYXJhdGlvbiAoZS5nLiBhcnJheSBzdWJzY3JpcHRzIG9yIHNlY3Rpb24pLCB0aGlzIGlzIHNldCB0bworICAgIC8vIG51bGxwdHIuCisgICAgVmFsdWVEZWNsICpBc3NvY2lhdGVkRGVjbGFyYXRpb24gPSBudWxscHRyOworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBNYXBwYWJsZUNvbXBvbmVudCgpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCBNYXBwYWJsZUNvbXBvbmVudChFeHByICpBc3NvY2lhdGVkRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZURlY2wgKkFzc29jaWF0ZWREZWNsYXJhdGlvbikKKyAgICAgICAgOiBBc3NvY2lhdGVkRXhwcmVzc2lvbihBc3NvY2lhdGVkRXhwcmVzc2lvbiksCisgICAgICAgICAgQXNzb2NpYXRlZERlY2xhcmF0aW9uKAorICAgICAgICAgICAgICBBc3NvY2lhdGVkRGVjbGFyYXRpb24KKyAgICAgICAgICAgICAgICAgID8gY2FzdDxWYWx1ZURlY2w+KEFzc29jaWF0ZWREZWNsYXJhdGlvbi0+Z2V0Q2Fub25pY2FsRGVjbCgpKQorICAgICAgICAgICAgICAgICAgOiBudWxscHRyKSB7fQorCisgICAgRXhwciAqZ2V0QXNzb2NpYXRlZEV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBBc3NvY2lhdGVkRXhwcmVzc2lvbjsgfQorCisgICAgVmFsdWVEZWNsICpnZXRBc3NvY2lhdGVkRGVjbGFyYXRpb24oKSBjb25zdCB7CisgICAgICByZXR1cm4gQXNzb2NpYXRlZERlY2xhcmF0aW9uOworICAgIH0KKyAgfTsKKworICAvLyBcYnJpZWYgTGlzdCBvZiBjb21wb25lbnRzIG9mIGFuIGV4cHJlc3Npb24uIFRoaXMgZmlyc3Qgb25lIGlzIHRoZSB3aG9sZQorICAvLyBleHByZXNzaW9uIGFuZCB0aGUgbGFzdCBvbmUgaXMgdGhlIGJhc2UgZXhwcmVzc2lvbi4KKyAgdXNpbmcgTWFwcGFibGVFeHByQ29tcG9uZW50TGlzdCA9IFNtYWxsVmVjdG9yPE1hcHBhYmxlQ29tcG9uZW50LCA4PjsKKyAgdXNpbmcgTWFwcGFibGVFeHByQ29tcG9uZW50TGlzdFJlZiA9IEFycmF5UmVmPE1hcHBhYmxlQ29tcG9uZW50PjsKKworICAvLyBcYnJpZWYgTGlzdCBvZiBhbGwgY29tcG9uZW50IGxpc3RzIGFzc29jaWF0ZWQgdG8gdGhlIHNhbWUgYmFzZSBkZWNsYXJhdGlvbi4KKyAgLy8gRS5nLiBpZiBib3RoICdTLmEnIGFuZCAnUy5iJyBhcmUgYSBtYXBwYWJsZSBleHByZXNzaW9ucywgZWFjaCB3aWxsIGhhdmUKKyAgLy8gdGhlaXIgY29tcG9uZW50IGxpc3QgYnV0IHRoZSBzYW1lIGJhc2UgZGVjbGFyYXRpb24gJ1MnLgorICB1c2luZyBNYXBwYWJsZUV4cHJDb21wb25lbnRMaXN0cyA9IFNtYWxsVmVjdG9yPE1hcHBhYmxlRXhwckNvbXBvbmVudExpc3QsIDg+OworICB1c2luZyBNYXBwYWJsZUV4cHJDb21wb25lbnRMaXN0c1JlZiA9IEFycmF5UmVmPE1hcHBhYmxlRXhwckNvbXBvbmVudExpc3Q+OworCitwcm90ZWN0ZWQ6CisgIC8vIFxicmllZiBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIGxpc3Qgb2YgY29tcG9uZW50IGxpc3RzLgorICBzdGF0aWMgdW5zaWduZWQKKyAgZ2V0Q29tcG9uZW50c1RvdGFsTnVtYmVyKE1hcHBhYmxlRXhwckNvbXBvbmVudExpc3RzUmVmIENvbXBvbmVudExpc3RzKTsKKworICAvLyBcYnJpZWYgUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSBsaXN0IG9mIGRlY2xhcmF0aW9ucy4gQWxsCisgIC8vIGRlY2xhcmF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYmUgY2Fub25pY2FsLgorICBzdGF0aWMgdW5zaWduZWQKKyAgZ2V0VW5pcXVlRGVjbGFyYXRpb25zVG90YWxOdW1iZXIoQXJyYXlSZWY8VmFsdWVEZWNsICo+IERlY2xhcmF0aW9ucyk7Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyBjbGF1c2VzIHdpdGggYSBsaXN0IG9mIGV4cHJlc3Npb25zIHRoYXQgYXJlIG1hcHBhYmxlLgorLy8vIEV4YW1wbGVzIG9mIHRoZXNlIGNsYXVzZXMgYXJlICdtYXAnIGluCisvLy8gJyNwcmFnbWEgb21wIHRhcmdldCBbZW50ZXJ8ZXhpdF0gW2RhdGFdLi4uJyBkaXJlY3RpdmVzLCBhbmQgICd0bycgYW5kICdmcm9tCisvLy8gaW4gJyNwcmFnbWEgb21wIHRhcmdldCB1cGRhdGUuLi4nIGRpcmVjdGl2ZXMuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NsYXNzIE9NUE1hcHBhYmxlRXhwckxpc3RDbGF1c2UgOiBwdWJsaWMgT01QVmFyTGlzdENsYXVzZTxUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT01QQ2xhdXNlTWFwcGFibGVFeHByQ29tbW9uIHsKKyAgZnJpZW5kIGNsYXNzIE9NUENsYXVzZVJlYWRlcjsKKworICAvLy8gXGJyaWVmIE51bWJlciBvZiB1bmlxdWUgZGVjbGFyYXRpb25zIGluIHRoaXMgY2xhdXNlLgorICB1bnNpZ25lZCBOdW1VbmlxdWVEZWNsYXJhdGlvbnM7CisKKyAgLy8vIFxicmllZiBOdW1iZXIgb2YgY29tcG9uZW50IGxpc3RzIGluIHRoaXMgY2xhdXNlLgorICB1bnNpZ25lZCBOdW1Db21wb25lbnRMaXN0czsKKworICAvLy8gXGJyaWVmIFRvdGFsIG51bWJlciBvZiBjb21wb25lbnRzIGluIHRoaXMgY2xhdXNlLgorICB1bnNpZ25lZCBOdW1Db21wb25lbnRzOworCitwcm90ZWN0ZWQ6CisgIC8vLyBcYnJpZWYgQnVpbGQgYSBjbGF1c2UgZm9yIFxhIE51bVVuaXF1ZURlY2xhcmF0aW9ucyBkZWNsYXJhdGlvbnMsIFxhCisgIC8vLyBOdW1Db21wb25lbnRMaXN0cyB0b3RhbCBjb21wb25lbnQgbGlzdHMsIGFuZCBcYSBOdW1Db21wb25lbnRzIHRvdGFsCisgIC8vLyBjb21wb25lbnRzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBLIEtpbmQgb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlICh0aGUgY2xhdXNlIGtleXdvcmQpLgorICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIE51bVZhcnMgTnVtYmVyIG9mIGV4cHJlc3Npb25zIGxpc3RlZCBpbiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIE51bVVuaXF1ZURlY2xhcmF0aW9ucyBOdW1iZXIgb2YgdW5pcXVlIGJhc2UgZGVjbGFyYXRpb25zIGluIHRoaXMKKyAgLy8vIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1Db21wb25lbnRMaXN0cyBOdW1iZXIgb2YgY29tcG9uZW50IGxpc3RzIGluIHRoaXMgY2xhdXNlIC0gb25lCisgIC8vLyBsaXN0IGZvciBlYWNoIGV4cHJlc3Npb24gaW4gdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1Db21wb25lbnRzIFRvdGFsIG51bWJlciBvZiBleHByZXNzaW9uIGNvbXBvbmVudHMgaW4gdGhlIGNsYXVzZS4KKyAgT01QTWFwcGFibGVFeHByTGlzdENsYXVzZShPcGVuTVBDbGF1c2VLaW5kIEssIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVZhcnMsIHVuc2lnbmVkIE51bVVuaXF1ZURlY2xhcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1Db21wb25lbnRMaXN0cywgdW5zaWduZWQgTnVtQ29tcG9uZW50cykKKyAgICAgIDogT01QVmFyTGlzdENsYXVzZTxUPihLLCBTdGFydExvYywgTFBhcmVuTG9jLCBFbmRMb2MsIE51bVZhcnMpLAorICAgICAgICBOdW1VbmlxdWVEZWNsYXJhdGlvbnMoTnVtVW5pcXVlRGVjbGFyYXRpb25zKSwKKyAgICAgICAgTnVtQ29tcG9uZW50TGlzdHMoTnVtQ29tcG9uZW50TGlzdHMpLCBOdW1Db21wb25lbnRzKE51bUNvbXBvbmVudHMpIHt9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHVuaXF1ZSBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgaW4gdGhlIHRyYWlsaW5nIG9iamVjdHMgb2YgdGhlCisgIC8vLyBjbGFzcy4KKyAgTXV0YWJsZUFycmF5UmVmPFZhbHVlRGVjbCAqPiBnZXRVbmlxdWVEZWNsc1JlZigpIHsKKyAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPFZhbHVlRGVjbCAqPigKKyAgICAgICAgc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+dGVtcGxhdGUgZ2V0VHJhaWxpbmdPYmplY3RzPFZhbHVlRGVjbCAqPigpLAorICAgICAgICBOdW1VbmlxdWVEZWNsYXJhdGlvbnMpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHVuaXF1ZSBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgaW4gdGhlIHRyYWlsaW5nIG9iamVjdHMgb2YgdGhlCisgIC8vLyBjbGFzcy4KKyAgQXJyYXlSZWY8VmFsdWVEZWNsICo+IGdldFVuaXF1ZURlY2xzUmVmKCkgY29uc3QgeworICAgIHJldHVybiBBcnJheVJlZjxWYWx1ZURlY2wgKj4oCisgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IFQgKj4odGhpcykKKyAgICAgICAgICAgIC0+dGVtcGxhdGUgZ2V0VHJhaWxpbmdPYmplY3RzPFZhbHVlRGVjbCAqPigpLAorICAgICAgICBOdW1VbmlxdWVEZWNsYXJhdGlvbnMpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIHVuaXF1ZSBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgaW4gdGhlIHRyYWlsaW5nIG9iamVjdHMgb2YgdGhlCisgIC8vLyBjbGFzcy4KKyAgdm9pZCBzZXRVbmlxdWVEZWNscyhBcnJheVJlZjxWYWx1ZURlY2wgKj4gVURzKSB7CisgICAgYXNzZXJ0KFVEcy5zaXplKCkgPT0gTnVtVW5pcXVlRGVjbGFyYXRpb25zICYmCisgICAgICAgICAgICJVbmV4cGVjdGVkIGFtb3VudCBvZiB1bmlxdWUgZGVjbGFyYXRpb25zLiIpOworICAgIHN0ZDo6Y29weShVRHMuYmVnaW4oKSwgVURzLmVuZCgpLCBnZXRVbmlxdWVEZWNsc1JlZigpLmJlZ2luKCkpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG51bWJlciBvZiBsaXN0cyBwZXIgZGVjbGFyYXRpb24gdGhhdCBhcmUgaW4gdGhlIHRyYWlsaW5nCisgIC8vLyBvYmplY3RzIG9mIHRoZSBjbGFzcy4KKyAgTXV0YWJsZUFycmF5UmVmPHVuc2lnbmVkPiBnZXREZWNsTnVtTGlzdHNSZWYoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjx1bnNpZ25lZD4oCisgICAgICAgIHN0YXRpY19jYXN0PFQgKj4odGhpcyktPnRlbXBsYXRlIGdldFRyYWlsaW5nT2JqZWN0czx1bnNpZ25lZD4oKSwKKyAgICAgICAgTnVtVW5pcXVlRGVjbGFyYXRpb25zKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgbGlzdHMgcGVyIGRlY2xhcmF0aW9uIHRoYXQgYXJlIGluIHRoZSB0cmFpbGluZworICAvLy8gb2JqZWN0cyBvZiB0aGUgY2xhc3MuCisgIEFycmF5UmVmPHVuc2lnbmVkPiBnZXREZWNsTnVtTGlzdHNSZWYoKSBjb25zdCB7CisgICAgcmV0dXJuIEFycmF5UmVmPHVuc2lnbmVkPigKKyAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVCAqPih0aGlzKS0+dGVtcGxhdGUgZ2V0VHJhaWxpbmdPYmplY3RzPHVuc2lnbmVkPigpLAorICAgICAgICBOdW1VbmlxdWVEZWNsYXJhdGlvbnMpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIG51bWJlciBvZiBsaXN0cyBwZXIgZGVjbGFyYXRpb24gdGhhdCBhcmUgaW4gdGhlIHRyYWlsaW5nCisgIC8vLyBvYmplY3RzIG9mIHRoZSBjbGFzcy4KKyAgdm9pZCBzZXREZWNsTnVtTGlzdHMoQXJyYXlSZWY8dW5zaWduZWQ+IEROTHMpIHsKKyAgICBhc3NlcnQoRE5Mcy5zaXplKCkgPT0gTnVtVW5pcXVlRGVjbGFyYXRpb25zICYmCisgICAgICAgICAgICJVbmV4cGVjdGVkIGFtb3VudCBvZiBsaXN0IG51bWJlcnMuIik7CisgICAgc3RkOjpjb3B5KEROTHMuYmVnaW4oKSwgRE5Mcy5lbmQoKSwgZ2V0RGVjbE51bUxpc3RzUmVmKCkuYmVnaW4oKSk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgY3VtdWxhdGl2ZSBjb21wb25lbnQgbGlzdHMgc2l6ZXMgdGhhdCBhcmUgaW4gdGhlIHRyYWlsaW5nCisgIC8vLyBvYmplY3RzIG9mIHRoZSBjbGFzcy4gVGhleSBhcmUgYXBwZW5kZWQgYWZ0ZXIgdGhlIG51bWJlciBvZiBsaXN0cy4KKyAgTXV0YWJsZUFycmF5UmVmPHVuc2lnbmVkPiBnZXRDb21wb25lbnRMaXN0U2l6ZXNSZWYoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjx1bnNpZ25lZD4oCisgICAgICAgIHN0YXRpY19jYXN0PFQgKj4odGhpcyktPnRlbXBsYXRlIGdldFRyYWlsaW5nT2JqZWN0czx1bnNpZ25lZD4oKSArCisgICAgICAgICAgICBOdW1VbmlxdWVEZWNsYXJhdGlvbnMsCisgICAgICAgIE51bUNvbXBvbmVudExpc3RzKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBjdW11bGF0aXZlIGNvbXBvbmVudCBsaXN0cyBzaXplcyB0aGF0IGFyZSBpbiB0aGUgdHJhaWxpbmcKKyAgLy8vIG9iamVjdHMgb2YgdGhlIGNsYXNzLiBUaGV5IGFyZSBhcHBlbmRlZCBhZnRlciB0aGUgbnVtYmVyIG9mIGxpc3RzLgorICBBcnJheVJlZjx1bnNpZ25lZD4gZ2V0Q29tcG9uZW50TGlzdFNpemVzUmVmKCkgY29uc3QgeworICAgIHJldHVybiBBcnJheVJlZjx1bnNpZ25lZD4oCisgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IFQgKj4odGhpcyktPnRlbXBsYXRlIGdldFRyYWlsaW5nT2JqZWN0czx1bnNpZ25lZD4oKSArCisgICAgICAgICAgICBOdW1VbmlxdWVEZWNsYXJhdGlvbnMsCisgICAgICAgIE51bUNvbXBvbmVudExpc3RzKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBjdW11bGF0aXZlIGNvbXBvbmVudCBsaXN0cyBzaXplcyB0aGF0IGFyZSBpbiB0aGUgdHJhaWxpbmcKKyAgLy8vIG9iamVjdHMgb2YgdGhlIGNsYXNzLgorICB2b2lkIHNldENvbXBvbmVudExpc3RTaXplcyhBcnJheVJlZjx1bnNpZ25lZD4gQ0xTcykgeworICAgIGFzc2VydChDTFNzLnNpemUoKSA9PSBOdW1Db21wb25lbnRMaXN0cyAmJgorICAgICAgICAgICAiVW5leHBlY3RlZCBhbW91bnQgb2YgY29tcG9uZW50IGxpc3RzLiIpOworICAgIHN0ZDo6Y29weShDTFNzLmJlZ2luKCksIENMU3MuZW5kKCksIGdldENvbXBvbmVudExpc3RTaXplc1JlZigpLmJlZ2luKCkpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGNvbXBvbmVudHMgdGhhdCBhcmUgaW4gdGhlIHRyYWlsaW5nIG9iamVjdHMgb2YgdGhlIGNsYXNzLgorICBNdXRhYmxlQXJyYXlSZWY8TWFwcGFibGVDb21wb25lbnQ+IGdldENvbXBvbmVudHNSZWYoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxNYXBwYWJsZUNvbXBvbmVudD4oCisgICAgICAgIHN0YXRpY19jYXN0PFQgKj4odGhpcykKKyAgICAgICAgICAgIC0+dGVtcGxhdGUgZ2V0VHJhaWxpbmdPYmplY3RzPE1hcHBhYmxlQ29tcG9uZW50PigpLAorICAgICAgICBOdW1Db21wb25lbnRzKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBjb21wb25lbnRzIHRoYXQgYXJlIGluIHRoZSB0cmFpbGluZyBvYmplY3RzIG9mIHRoZSBjbGFzcy4KKyAgQXJyYXlSZWY8TWFwcGFibGVDb21wb25lbnQ+IGdldENvbXBvbmVudHNSZWYoKSBjb25zdCB7CisgICAgcmV0dXJuIEFycmF5UmVmPE1hcHBhYmxlQ29tcG9uZW50PigKKyAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVCAqPih0aGlzKQorICAgICAgICAgICAgLT50ZW1wbGF0ZSBnZXRUcmFpbGluZ09iamVjdHM8TWFwcGFibGVDb21wb25lbnQ+KCksCisgICAgICAgIE51bUNvbXBvbmVudHMpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGNvbXBvbmVudHMgdGhhdCBhcmUgaW4gdGhlIHRyYWlsaW5nIG9iamVjdHMgb2YgdGhlIGNsYXNzLgorICAvLy8gVGhpcyByZXF1aXJlcyB0aGUgbGlzdCBzaXplcyBzbyB0aGF0IGl0IGNhbiBhbHNvIGZpbGwgdGhlIG9yaWdpbmFsCisgIC8vLyBleHByZXNzaW9ucywgd2hpY2ggYXJlIHRoZSBmaXJzdCBjb21wb25lbnQgb2YgZWFjaCBsaXN0LgorICB2b2lkIHNldENvbXBvbmVudHMoQXJyYXlSZWY8TWFwcGFibGVDb21wb25lbnQ+IENvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gQ0xTcykgeworICAgIGFzc2VydChDb21wb25lbnRzLnNpemUoKSA9PSBOdW1Db21wb25lbnRzICYmCisgICAgICAgICAgICJVbmV4cGVjdGVkIGFtb3VudCBvZiBjb21wb25lbnQgbGlzdHMuIik7CisgICAgYXNzZXJ0KENMU3Muc2l6ZSgpID09IE51bUNvbXBvbmVudExpc3RzICYmCisgICAgICAgICAgICJVbmV4cGVjdGVkIGFtb3VudCBvZiBsaXN0IHNpemVzLiIpOworICAgIHN0ZDo6Y29weShDb21wb25lbnRzLmJlZ2luKCksIENvbXBvbmVudHMuZW5kKCksIGdldENvbXBvbmVudHNSZWYoKS5iZWdpbigpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRmlsbCB0aGUgY2xhdXNlIGluZm9ybWF0aW9uIGZyb20gdGhlIGxpc3Qgb2YgZGVjbGFyYXRpb25zIGFuZAorICAvLy8gYXNzb2NpYXRlZCBjb21wb25lbnQgbGlzdHMuCisgIHZvaWQgc2V0Q2xhdXNlSW5mbyhBcnJheVJlZjxWYWx1ZURlY2wgKj4gRGVjbGFyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgTWFwcGFibGVFeHByQ29tcG9uZW50TGlzdHNSZWYgQ29tcG9uZW50TGlzdHMpIHsKKyAgICAvLyBQZXJmb3JtIHNvbWUgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgZGF0YSBzaXplcyBhcmUgY29uc2lzdGVudCB3aXRoIHRoZQorICAgIC8vIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB3aGVuIHRoZSBjbGF1c2Ugd2FzIGNyZWF0ZWQuCisgICAgYXNzZXJ0KGdldFVuaXF1ZURlY2xhcmF0aW9uc1RvdGFsTnVtYmVyKERlY2xhcmF0aW9ucykgPT0KKyAgICAgICAgICAgICAgIE51bVVuaXF1ZURlY2xhcmF0aW9ucyAmJgorICAgICAgICAgICAiVW5leHBlY3RlZCBudW1iZXIgb2YgbWFwcGFibGUgZXhwcmVzc2lvbiBpbmZvIGVudHJpZXMhIik7CisgICAgYXNzZXJ0KGdldENvbXBvbmVudHNUb3RhbE51bWJlcihDb21wb25lbnRMaXN0cykgPT0gTnVtQ29tcG9uZW50cyAmJgorICAgICAgICAgICAiVW5leHBlY3RlZCB0b3RhbCBudW1iZXIgb2YgY29tcG9uZW50cyEiKTsKKyAgICBhc3NlcnQoRGVjbGFyYXRpb25zLnNpemUoKSA9PSBDb21wb25lbnRMaXN0cy5zaXplKCkgJiYKKyAgICAgICAgICAgIkRlY2xhcmF0aW9uIGFuZCBjb21wb25lbnQgbGlzdHMgc2l6ZSBpcyBub3QgY29uc2lzdGVudCEiKTsKKyAgICBhc3NlcnQoRGVjbGFyYXRpb25zLnNpemUoKSA9PSBOdW1Db21wb25lbnRMaXN0cyAmJgorICAgICAgICAgICAiVW5leHBlY3RlZCBkZWNsYXJhdGlvbiBhbmQgY29tcG9uZW50IGxpc3RzIHNpemUhIik7CisKKyAgICAvLyBPcmdhbml6ZSB0aGUgY29tcG9uZW50cyBieSBkZWNsYXJhdGlvbiBhbmQgcmV0cmlldmUgdGhlIG9yaWdpbmFsCisgICAgLy8gZXhwcmVzc2lvbi4gT3JpZ2luYWwgZXhwcmVzc2lvbnMgYXJlIGFsd2F5cyB0aGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZQorICAgIC8vIG1hcHBhYmxlIGNvbXBvbmVudCBsaXN0LgorICAgIGxsdm06Ok1hcFZlY3RvcjxWYWx1ZURlY2wgKiwgU21hbGxWZWN0b3I8TWFwcGFibGVFeHByQ29tcG9uZW50TGlzdFJlZiwgOD4+CisgICAgICAgIENvbXBvbmVudExpc3RNYXA7CisgICAgeworICAgICAgYXV0byBDSSA9IENvbXBvbmVudExpc3RzLmJlZ2luKCk7CisgICAgICBmb3IgKGF1dG8gREkgPSBEZWNsYXJhdGlvbnMuYmVnaW4oKSwgREUgPSBEZWNsYXJhdGlvbnMuZW5kKCk7IERJICE9IERFOworICAgICAgICAgICArK0RJLCArK0NJKSB7CisgICAgICAgIGFzc2VydCghQ0ktPmVtcHR5KCkgJiYgIkludmFsaWQgY29tcG9uZW50IGxpc3QhIik7CisgICAgICAgIENvbXBvbmVudExpc3RNYXBbKkRJXS5wdXNoX2JhY2soKkNJKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJdGVyYXRvcnMgb2YgdGhlIHRhcmdldCBzdG9yYWdlLgorICAgIGF1dG8gVW5pcXVlRGVjbGFyYXRpb25zID0gZ2V0VW5pcXVlRGVjbHNSZWYoKTsKKyAgICBhdXRvIFVESSA9IFVuaXF1ZURlY2xhcmF0aW9ucy5iZWdpbigpOworCisgICAgYXV0byBEZWNsTnVtTGlzdHMgPSBnZXREZWNsTnVtTGlzdHNSZWYoKTsKKyAgICBhdXRvIEROTEkgPSBEZWNsTnVtTGlzdHMuYmVnaW4oKTsKKworICAgIGF1dG8gQ29tcG9uZW50TGlzdFNpemVzID0gZ2V0Q29tcG9uZW50TGlzdFNpemVzUmVmKCk7CisgICAgYXV0byBDTFNJID0gQ29tcG9uZW50TGlzdFNpemVzLmJlZ2luKCk7CisKKyAgICBhdXRvIENvbXBvbmVudHMgPSBnZXRDb21wb25lbnRzUmVmKCk7CisgICAgYXV0byBDSSA9IENvbXBvbmVudHMuYmVnaW4oKTsKKworICAgIC8vIFZhcmlhYmxlIHRvIGNvbXB1dGUgdGhlIGFjY3VtdWxhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMuCisgICAgdW5zaWduZWQgUHJldlNpemUgPSAwdTsKKworICAgIC8vIFNjYW4gYWxsIHRoZSBkZWNsYXJhdGlvbnMgYW5kIGFzc29jaWF0ZWQgY29tcG9uZW50IGxpc3RzLgorICAgIGZvciAoYXV0byAmTSA6IENvbXBvbmVudExpc3RNYXApIHsKKyAgICAgIC8vIFRoZSBkZWNsYXJhdGlvbi4KKyAgICAgIGF1dG8gKkQgPSBNLmZpcnN0OworICAgICAgLy8gVGhlIGNvbXBvbmVudCBsaXN0cy4KKyAgICAgIGF1dG8gQ0wgPSBNLnNlY29uZDsKKworICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZW50cnkuCisgICAgICAqVURJID0gRDsKKyAgICAgICsrVURJOworCisgICAgICAqRE5MSSA9IENMLnNpemUoKTsKKyAgICAgICsrRE5MSTsKKworICAgICAgLy8gT2J0YWluIHRoZSBjdW11bGF0aXZlIHNpemVzIGFuZCBjb25jYXRlbmF0ZSBhbGwgdGhlIGNvbXBvbmVudHMgaW4gdGhlCisgICAgICAvLyByZXNlcnZlZCBzdG9yYWdlLgorICAgICAgZm9yIChhdXRvIEMgOiBDTCkgeworICAgICAgICAvLyBBY2N1bXVsYXRlIHdpdGggdGhlIHByZXZpb3VzIHNpemUuCisgICAgICAgIFByZXZTaXplICs9IEMuc2l6ZSgpOworCisgICAgICAgIC8vIFNhdmUgdGhlIHNpemUuCisgICAgICAgICpDTFNJID0gUHJldlNpemU7CisgICAgICAgICsrQ0xTSTsKKworICAgICAgICAvLyBBcHBlbmQgY29tcG9uZW50cyBhZnRlciB0aGUgY3VycmVudCBjb21wb25lbnRzIGl0ZXJhdG9yLgorICAgICAgICBDSSA9IHN0ZDo6Y29weShDLmJlZ2luKCksIEMuZW5kKCksIENJKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBiYXNlIGRlY2xhcmF0aW9ucyBpbiB0aGlzIGNsYXVzZS4KKyAgdW5zaWduZWQgZ2V0VW5pcXVlRGVjbGFyYXRpb25zTnVtKCkgY29uc3QgeyByZXR1cm4gTnVtVW5pcXVlRGVjbGFyYXRpb25zOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBsaXN0cyBkZXJpdmVkIGZyb20gdGhlIGNsYXVzZSBleHByZXNzaW9ucy4KKyAgdW5zaWduZWQgZ2V0VG90YWxDb21wb25lbnRMaXN0TnVtKCkgY29uc3QgeyByZXR1cm4gTnVtQ29tcG9uZW50TGlzdHM7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gYWxsIGxpc3RzIGRlcml2ZWQgZnJvbSB0aGUKKyAgLy8vIGNsYXVzZS4KKyAgdW5zaWduZWQgZ2V0VG90YWxDb21wb25lbnRzTnVtKCkgY29uc3QgeyByZXR1cm4gTnVtQ29tcG9uZW50czsgfQorCisgIC8vLyBcYnJpZWYgSXRlcmF0b3IgdGhhdCBicm93c2UgdGhlIGNvbXBvbmVudHMgYnkgbGlzdHMuIEl0IGFsc28gYWxsb3dzCisgIC8vLyBicm93c2luZyBjb21wb25lbnRzIG9mIGEgc2luZ2xlIGRlY2xhcmF0aW9uLgorICBjbGFzcyBjb25zdF9jb21wb25lbnRfbGlzdHNfaXRlcmF0b3IKKyAgICAgIDogcHVibGljIGxsdm06Oml0ZXJhdG9yX2FkYXB0b3JfYmFzZTwKKyAgICAgICAgICAgIGNvbnN0X2NvbXBvbmVudF9saXN0c19pdGVyYXRvciwKKyAgICAgICAgICAgIE1hcHBhYmxlRXhwckNvbXBvbmVudExpc3RSZWY6OmNvbnN0X2l0ZXJhdG9yLAorICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgTWFwcGFibGVDb21wb25lbnQsIHB0cmRpZmZfdCwKKyAgICAgICAgICAgIE1hcHBhYmxlQ29tcG9uZW50LCBNYXBwYWJsZUNvbXBvbmVudD4geworICAgIC8vIFRoZSBkZWNsYXJhdGlvbiB0aGUgaXRlcmF0b3IgY3VycmVudGx5IHJlZmVycyB0by4KKyAgICBBcnJheVJlZjxWYWx1ZURlY2wgKj46Oml0ZXJhdG9yIERlY2xDdXI7CisKKyAgICAvLyBUaGUgbGlzdCBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGRlY2xhcmF0aW9uLgorICAgIEFycmF5UmVmPHVuc2lnbmVkPjo6aXRlcmF0b3IgTnVtTGlzdHNDdXI7CisKKyAgICAvLyBSZW1haW5pbmcgbGlzdHMgZm9yIHRoZSBjdXJyZW50IGRlY2xhcmF0aW9uLgorICAgIHVuc2lnbmVkIFJlbWFpbmluZ0xpc3RzID0gMDsKKworICAgIC8vIFRoZSBjdW11bGF0aXZlIHNpemUgb2YgdGhlIHByZXZpb3VzIGxpc3QsIG9yIHplcm8gaWYgdGhlcmUgaXMgbm8gcHJldmlvdXMKKyAgICAvLyBsaXN0LgorICAgIHVuc2lnbmVkIFByZXZMaXN0U2l6ZSA9IDA7CisKKyAgICAvLyBUaGUgY3VtdWxhdGl2ZSBzaXplcyBvZiB0aGUgY3VycmVudCBsaXN0IC0gaXQgd2lsbCBkZWxpbWl0IHRoZSByZW1haW5pbmcKKyAgICAvLyByYW5nZSBvZiBpbnRlcmVzdC4KKyAgICBBcnJheVJlZjx1bnNpZ25lZD46OmNvbnN0X2l0ZXJhdG9yIExpc3RTaXplQ3VyOworICAgIEFycmF5UmVmPHVuc2lnbmVkPjo6Y29uc3RfaXRlcmF0b3IgTGlzdFNpemVFbmQ7CisKKyAgICAvLyBJdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBjb21wb25lbnRzIHN0b3JhZ2UuCisgICAgTWFwcGFibGVFeHByQ29tcG9uZW50TGlzdFJlZjo6Y29uc3RfaXRlcmF0b3IgRW5kOworCisgIHB1YmxpYzoKKyAgICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHNjYW5zIGFsbCBsaXN0cy4KKyAgICBleHBsaWNpdCBjb25zdF9jb21wb25lbnRfbGlzdHNfaXRlcmF0b3IoCisgICAgICAgIEFycmF5UmVmPFZhbHVlRGVjbCAqPiBVbmlxdWVEZWNscywgQXJyYXlSZWY8dW5zaWduZWQ+IERlY2xzTGlzdE51bSwKKyAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IEN1bXVsYXRpdmVMaXN0U2l6ZXMsCisgICAgICAgIE1hcHBhYmxlRXhwckNvbXBvbmVudExpc3RSZWYgQ29tcG9uZW50cykKKyAgICAgICAgOiBjb25zdF9jb21wb25lbnRfbGlzdHNfaXRlcmF0b3I6Oml0ZXJhdG9yX2FkYXB0b3JfYmFzZSgKKyAgICAgICAgICAgICAgQ29tcG9uZW50cy5iZWdpbigpKSwKKyAgICAgICAgICBEZWNsQ3VyKFVuaXF1ZURlY2xzLmJlZ2luKCkpLCBOdW1MaXN0c0N1cihEZWNsc0xpc3ROdW0uYmVnaW4oKSksCisgICAgICAgICAgTGlzdFNpemVDdXIoQ3VtdWxhdGl2ZUxpc3RTaXplcy5iZWdpbigpKSwKKyAgICAgICAgICBMaXN0U2l6ZUVuZChDdW11bGF0aXZlTGlzdFNpemVzLmVuZCgpKSwgRW5kKENvbXBvbmVudHMuZW5kKCkpIHsKKyAgICAgIGFzc2VydChVbmlxdWVEZWNscy5zaXplKCkgPT0gRGVjbHNMaXN0TnVtLnNpemUoKSAmJgorICAgICAgICAgICAgICJJbmNvbnNpc3RlbnQgbnVtYmVyIG9mIGRlY2xhcmF0aW9ucyBhbmQgbGlzdCBzaXplcyEiKTsKKyAgICAgIGlmICghRGVjbHNMaXN0TnVtLmVtcHR5KCkpCisgICAgICAgIFJlbWFpbmluZ0xpc3RzID0gKk51bUxpc3RzQ3VyOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgc2NhbiBsaXN0cyBmb3IgYSBnaXZlbiBkZWNsYXJhdGlvbiBcYQorICAgIC8vLyBEZWNsYXJhdGlvbi4KKyAgICBleHBsaWNpdCBjb25zdF9jb21wb25lbnRfbGlzdHNfaXRlcmF0b3IoCisgICAgICAgIGNvbnN0IFZhbHVlRGVjbCAqRGVjbGFyYXRpb24sIEFycmF5UmVmPFZhbHVlRGVjbCAqPiBVbmlxdWVEZWNscywKKyAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IERlY2xzTGlzdE51bSwgQXJyYXlSZWY8dW5zaWduZWQ+IEN1bXVsYXRpdmVMaXN0U2l6ZXMsCisgICAgICAgIE1hcHBhYmxlRXhwckNvbXBvbmVudExpc3RSZWYgQ29tcG9uZW50cykKKyAgICAgICAgOiBjb25zdF9jb21wb25lbnRfbGlzdHNfaXRlcmF0b3IoVW5pcXVlRGVjbHMsIERlY2xzTGlzdE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VtdWxhdGl2ZUxpc3RTaXplcywgQ29tcG9uZW50cykgeworICAgICAgLy8gTG9vayBmb3IgdGhlIGRlc2lyZWQgZGVjbGFyYXRpb24uIFdoaWxlIHdlIGFyZSBsb29raW5nIGZvciBpdCwgd2UKKyAgICAgIC8vIHVwZGF0ZSB0aGUgc3RhdGUgc28gdGhhdCB3ZSBrbm93IHRoZSBjb21wb25lbnQgd2hlcmUgYSBnaXZlbiBsaXN0CisgICAgICAvLyBzdGFydHMuCisgICAgICBmb3IgKDsgRGVjbEN1ciAhPSBVbmlxdWVEZWNscy5lbmQoKTsgKytEZWNsQ3VyLCArK051bUxpc3RzQ3VyKSB7CisgICAgICAgIGlmICgqRGVjbEN1ciA9PSBEZWNsYXJhdGlvbikKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBhc3NlcnQoKk51bUxpc3RzQ3VyID4gMCAmJiAiTm8gbGlzdHMgYXNzb2NpYXRlZCB3aXRoIGRlY2xhcmF0aW9uPz8iKTsKKworICAgICAgICAvLyBTa2lwIHRoZSBsaXN0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgZGVjbGFyYXRpb24sIGJ1dCBzYXZlIHRoZQorICAgICAgICAvLyBsYXN0IGxpc3Qgc2l6ZSB0aGF0IHdhcyBza2lwcGVkLgorICAgICAgICBzdGQ6OmFkdmFuY2UoTGlzdFNpemVDdXIsICpOdW1MaXN0c0N1ciAtIDEpOworICAgICAgICBQcmV2TGlzdFNpemUgPSAqTGlzdFNpemVDdXI7CisgICAgICAgICsrTGlzdFNpemVDdXI7CisgICAgICB9CisKKyAgICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueSBkZWNsYXJhdGlvbiwgYWR2YW5jZSB0aGUgaXRlcmF0b3IgdG8gYWZ0ZXIgdGhlCisgICAgICAvLyBsYXN0IGNvbXBvbmVudCBhbmQgc2V0IHJlbWFpbmluZyBsaXN0cyB0byB6ZXJvLgorICAgICAgaWYgKExpc3RTaXplQ3VyID09IEN1bXVsYXRpdmVMaXN0U2l6ZXMuZW5kKCkpIHsKKyAgICAgICAgdGhpcy0+SSA9IEVuZDsKKyAgICAgICAgUmVtYWluaW5nTGlzdHMgPSAwdTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvLyBTZXQgdGhlIHJlbWFpbmluZyBsaXN0cyB3aXRoIHRoZSB0b3RhbCBudW1iZXIgb2YgbGlzdHMgb2YgdGhlIGN1cnJlbnQKKyAgICAgIC8vIGRlY2xhcmF0aW9uLgorICAgICAgUmVtYWluaW5nTGlzdHMgPSAqTnVtTGlzdHNDdXI7CisKKyAgICAgIC8vIEFkanVzdCB0aGUgbGlzdCBzaXplIGVuZCBpdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSByZWxldmFudCByYW5nZS4KKyAgICAgIExpc3RTaXplRW5kID0gTGlzdFNpemVDdXI7CisgICAgICBzdGQ6OmFkdmFuY2UoTGlzdFNpemVFbmQsIFJlbWFpbmluZ0xpc3RzKTsKKworICAgICAgLy8gR2l2ZW4gdGhhdCB0aGUgbGlzdCBzaXplcyBhcmUgY3VtdWxhdGl2ZSwgdGhlIGluZGV4IG9mIHRoZSBjb21wb25lbnQKKyAgICAgIC8vIHRoYXQgc3RhcnQgdGhlIGxpc3QgaXMgdGhlIHNpemUgb2YgdGhlIHByZXZpb3VzIGxpc3QuCisgICAgICBzdGQ6OmFkdmFuY2UodGhpcy0+SSwgUHJldkxpc3RTaXplKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdGhlIGFycmF5IHdpdGggdGhlIGN1cnJlbnQgbGlzdC4gVGhlIHNpemVzIGFyZSBjdW11bGF0aXZlLCBzbyB0aGUKKyAgICAvLyBhcnJheSBzaXplIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgc2l6ZSBhbmQgcHJldmlvdXMgb25lLgorICAgIHN0ZDo6cGFpcjxjb25zdCBWYWx1ZURlY2wgKiwgTWFwcGFibGVFeHByQ29tcG9uZW50TGlzdFJlZj4KKyAgICBvcGVyYXRvciooKSBjb25zdCB7CisgICAgICBhc3NlcnQoTGlzdFNpemVDdXIgIT0gTGlzdFNpemVFbmQgJiYgIkludmFsaWQgaXRlcmF0b3IhIik7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgKkRlY2xDdXIsCisgICAgICAgICAgTWFwcGFibGVFeHByQ29tcG9uZW50TGlzdFJlZigmKnRoaXMtPkksICpMaXN0U2l6ZUN1ciAtIFByZXZMaXN0U2l6ZSkpOworICAgIH0KKyAgICBzdGQ6OnBhaXI8Y29uc3QgVmFsdWVEZWNsICosIE1hcHBhYmxlRXhwckNvbXBvbmVudExpc3RSZWY+CisgICAgb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICAgIHJldHVybiAqKnRoaXM7CisgICAgfQorCisgICAgLy8gU2tpcCB0aGUgY29tcG9uZW50cyBvZiB0aGUgY3VycmVudCBsaXN0LgorICAgIGNvbnN0X2NvbXBvbmVudF9saXN0c19pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICAgIGFzc2VydChMaXN0U2l6ZUN1ciAhPSBMaXN0U2l6ZUVuZCAmJiBSZW1haW5pbmdMaXN0cyAmJgorICAgICAgICAgICAgICJJbnZhbGlkIGl0ZXJhdG9yISIpOworCisgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIG1vcmUgbGlzdHMganVzdCBza2lwIGFsbCB0aGUgY29tcG9uZW50cy4gT3RoZXJ3aXNlLAorICAgICAgLy8gYWR2YW5jZSB0aGUgaXRlcmF0b3IgYnkgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIGluIHRoZSBjdXJyZW50IGxpc3QuCisgICAgICBpZiAoc3RkOjpuZXh0KExpc3RTaXplQ3VyKSA9PSBMaXN0U2l6ZUVuZCkgeworICAgICAgICB0aGlzLT5JID0gRW5kOworICAgICAgICBSZW1haW5pbmdMaXN0cyA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OmFkdmFuY2UodGhpcy0+SSwgKkxpc3RTaXplQ3VyIC0gUHJldkxpc3RTaXplKTsKKyAgICAgICAgUHJldkxpc3RTaXplID0gKkxpc3RTaXplQ3VyOworCisgICAgICAgIC8vIFdlIGFyZSBkb25lIHdpdGggYSBkZWNsYXJhdGlvbiwgbW92ZSB0byB0aGUgbmV4dCBvbmUuCisgICAgICAgIGlmICghKC0tUmVtYWluaW5nTGlzdHMpKSB7CisgICAgICAgICAgKytEZWNsQ3VyOworICAgICAgICAgICsrTnVtTGlzdHNDdXI7CisgICAgICAgICAgUmVtYWluaW5nTGlzdHMgPSAqTnVtTGlzdHNDdXI7CisgICAgICAgICAgYXNzZXJ0KFJlbWFpbmluZ0xpc3RzICYmICJObyBsaXN0cyBpbiB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uPz8iKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICArK0xpc3RTaXplQ3VyOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgfTsKKworICB1c2luZyBjb25zdF9jb21wb25lbnRfbGlzdHNfcmFuZ2UgPQorICAgICAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8Y29uc3RfY29tcG9uZW50X2xpc3RzX2l0ZXJhdG9yPjsKKworICAvLy8gXGJyaWVmIEl0ZXJhdG9ycyBmb3IgYWxsIGNvbXBvbmVudCBsaXN0cy4KKyAgY29uc3RfY29tcG9uZW50X2xpc3RzX2l0ZXJhdG9yIGNvbXBvbmVudF9saXN0c19iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY29tcG9uZW50X2xpc3RzX2l0ZXJhdG9yKAorICAgICAgICBnZXRVbmlxdWVEZWNsc1JlZigpLCBnZXREZWNsTnVtTGlzdHNSZWYoKSwgZ2V0Q29tcG9uZW50TGlzdFNpemVzUmVmKCksCisgICAgICAgIGdldENvbXBvbmVudHNSZWYoKSk7CisgIH0KKyAgY29uc3RfY29tcG9uZW50X2xpc3RzX2l0ZXJhdG9yIGNvbXBvbmVudF9saXN0c19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2NvbXBvbmVudF9saXN0c19pdGVyYXRvcigKKyAgICAgICAgQXJyYXlSZWY8VmFsdWVEZWNsICo+KCksIEFycmF5UmVmPHVuc2lnbmVkPigpLCBBcnJheVJlZjx1bnNpZ25lZD4oKSwKKyAgICAgICAgTWFwcGFibGVFeHByQ29tcG9uZW50TGlzdFJlZihnZXRDb21wb25lbnRzUmVmKCkuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29tcG9uZW50c1JlZigpLmVuZCgpKSk7CisgIH0KKyAgY29uc3RfY29tcG9uZW50X2xpc3RzX3JhbmdlIGNvbXBvbmVudF9saXN0cygpIGNvbnN0IHsKKyAgICByZXR1cm4ge2NvbXBvbmVudF9saXN0c19iZWdpbigpLCBjb21wb25lbnRfbGlzdHNfZW5kKCl9OworICB9CisKKyAgLy8vIFxicmllZiBJdGVyYXRvcnMgZm9yIGNvbXBvbmVudCBsaXN0cyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkCisgIC8vLyBkZWNsYXJhdGlvbi4KKyAgY29uc3RfY29tcG9uZW50X2xpc3RzX2l0ZXJhdG9yCisgIGRlY2xfY29tcG9uZW50X2xpc3RzX2JlZ2luKGNvbnN0IFZhbHVlRGVjbCAqVkQpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY29tcG9uZW50X2xpc3RzX2l0ZXJhdG9yKAorICAgICAgICBWRCwgZ2V0VW5pcXVlRGVjbHNSZWYoKSwgZ2V0RGVjbE51bUxpc3RzUmVmKCksCisgICAgICAgIGdldENvbXBvbmVudExpc3RTaXplc1JlZigpLCBnZXRDb21wb25lbnRzUmVmKCkpOworICB9CisgIGNvbnN0X2NvbXBvbmVudF9saXN0c19pdGVyYXRvciBkZWNsX2NvbXBvbmVudF9saXN0c19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBvbmVudF9saXN0c19lbmQoKTsKKyAgfQorICBjb25zdF9jb21wb25lbnRfbGlzdHNfcmFuZ2UgZGVjbF9jb21wb25lbnRfbGlzdHMoY29uc3QgVmFsdWVEZWNsICpWRCkgY29uc3QgeworICAgIHJldHVybiB7ZGVjbF9jb21wb25lbnRfbGlzdHNfYmVnaW4oVkQpLCBkZWNsX2NvbXBvbmVudF9saXN0c19lbmQoKX07CisgIH0KKworICAvLy8gSXRlcmF0b3JzIHRvIGFjY2VzcyBhbGwgdGhlIGRlY2xhcmF0aW9ucywgbnVtYmVyIG9mIGxpc3RzLCBsaXN0IHNpemVzLCBhbmQKKyAgLy8vIGNvbXBvbmVudHMuCisgIHVzaW5nIGNvbnN0X2FsbF9kZWNsc19pdGVyYXRvciA9IEFycmF5UmVmPFZhbHVlRGVjbCAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2FsbF9kZWNsc19yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGNvbnN0X2FsbF9kZWNsc19pdGVyYXRvcj47CisKKyAgY29uc3RfYWxsX2RlY2xzX3JhbmdlIGFsbF9kZWNscygpIGNvbnN0IHsKKyAgICBhdXRvIEEgPSBnZXRVbmlxdWVEZWNsc1JlZigpOworICAgIHJldHVybiBjb25zdF9hbGxfZGVjbHNfcmFuZ2UoQS5iZWdpbigpLCBBLmVuZCgpKTsKKyAgfQorCisgIHVzaW5nIGNvbnN0X2FsbF9udW1fbGlzdHNfaXRlcmF0b3IgPSBBcnJheVJlZjx1bnNpZ25lZD46Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9hbGxfbnVtX2xpc3RzX3JhbmdlID0KKyAgICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGNvbnN0X2FsbF9udW1fbGlzdHNfaXRlcmF0b3I+OworCisgIGNvbnN0X2FsbF9udW1fbGlzdHNfcmFuZ2UgYWxsX251bV9saXN0cygpIGNvbnN0IHsKKyAgICBhdXRvIEEgPSBnZXREZWNsTnVtTGlzdHNSZWYoKTsKKyAgICByZXR1cm4gY29uc3RfYWxsX251bV9saXN0c19yYW5nZShBLmJlZ2luKCksIEEuZW5kKCkpOworICB9CisKKyAgdXNpbmcgY29uc3RfYWxsX2xpc3RzX3NpemVzX2l0ZXJhdG9yID0gQXJyYXlSZWY8dW5zaWduZWQ+OjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfYWxsX2xpc3RzX3NpemVzX3JhbmdlID0KKyAgICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGNvbnN0X2FsbF9saXN0c19zaXplc19pdGVyYXRvcj47CisKKyAgY29uc3RfYWxsX2xpc3RzX3NpemVzX3JhbmdlIGFsbF9saXN0c19zaXplcygpIGNvbnN0IHsKKyAgICBhdXRvIEEgPSBnZXRDb21wb25lbnRMaXN0U2l6ZXNSZWYoKTsKKyAgICByZXR1cm4gY29uc3RfYWxsX2xpc3RzX3NpemVzX3JhbmdlKEEuYmVnaW4oKSwgQS5lbmQoKSk7CisgIH0KKworICB1c2luZyBjb25zdF9hbGxfY29tcG9uZW50c19pdGVyYXRvciA9IEFycmF5UmVmPE1hcHBhYmxlQ29tcG9uZW50Pjo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2FsbF9jb21wb25lbnRzX3JhbmdlID0KKyAgICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGNvbnN0X2FsbF9jb21wb25lbnRzX2l0ZXJhdG9yPjsKKworICBjb25zdF9hbGxfY29tcG9uZW50c19yYW5nZSBhbGxfY29tcG9uZW50cygpIGNvbnN0IHsKKyAgICBhdXRvIEEgPSBnZXRDb21wb25lbnRzUmVmKCk7CisgICAgcmV0dXJuIGNvbnN0X2FsbF9jb21wb25lbnRzX3JhbmdlKEEuYmVnaW4oKSwgQS5lbmQoKSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzIGNsYXVzZSAnbWFwJyBpbiB0aGUgJyNwcmFnbWEgb21wIC4uLicKKy8vLyBkaXJlY3RpdmVzLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCB0YXJnZXQgbWFwKGEsYikKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRhcmdldCcgaGFzIGNsYXVzZSAnbWFwJworLy8vIHdpdGggdGhlIHZhcmlhYmxlcyAnYScgYW5kICdiJy4KK2NsYXNzIE9NUE1hcENsYXVzZSBmaW5hbCA6IHB1YmxpYyBPTVBNYXBwYWJsZUV4cHJMaXN0Q2xhdXNlPE9NUE1hcENsYXVzZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVBNYXBDbGF1c2UsIEV4cHIgKiwgVmFsdWVEZWNsICosIHVuc2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUENsYXVzZU1hcHBhYmxlRXhwckNvbW1vbjo6TWFwcGFibGVDb21wb25lbnQ+IHsKKyAgZnJpZW5kIGNsYXNzIE9NUENsYXVzZVJlYWRlcjsKKyAgZnJpZW5kIE9NUE1hcHBhYmxlRXhwckxpc3RDbGF1c2U7CisgIGZyaWVuZCBPTVBWYXJMaXN0Q2xhdXNlOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIC8vLyBEZWZpbmUgdGhlIHNpemVzIG9mIGVhY2ggdHJhaWxpbmcgb2JqZWN0IGFycmF5IGV4Y2VwdCB0aGUgbGFzdCBvbmUuIFRoaXMKKyAgLy8vIGlzIHJlcXVpcmVkIGZvciBUcmFpbGluZ09iamVjdHMgdG8gd29yayBwcm9wZXJseS4KKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPEV4cHIgKj4pIGNvbnN0IHsKKyAgICByZXR1cm4gdmFybGlzdF9zaXplKCk7CisgIH0KKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPFZhbHVlRGVjbCAqPikgY29uc3QgeworICAgIHJldHVybiBnZXRVbmlxdWVEZWNsYXJhdGlvbnNOdW0oKTsKKyAgfQorICBzaXplX3QgbnVtVHJhaWxpbmdPYmplY3RzKE92ZXJsb2FkVG9rZW48dW5zaWduZWQ+KSBjb25zdCB7CisgICAgcmV0dXJuIGdldFVuaXF1ZURlY2xhcmF0aW9uc051bSgpICsgZ2V0VG90YWxDb21wb25lbnRMaXN0TnVtKCk7CisgIH0KKworICAvLy8gXGJyaWVmIE1hcCB0eXBlIG1vZGlmaWVyIGZvciB0aGUgJ21hcCcgY2xhdXNlLgorICBPcGVuTVBNYXBDbGF1c2VLaW5kIE1hcFR5cGVNb2RpZmllciA9IE9NUENfTUFQX3Vua25vd247CisKKyAgLy8vIFxicmllZiBNYXAgdHlwZSBmb3IgdGhlICdtYXAnIGNsYXVzZS4KKyAgT3Blbk1QTWFwQ2xhdXNlS2luZCBNYXBUeXBlID0gT01QQ19NQVBfdW5rbm93bjsKKworICAvLy8gXGJyaWVmIElzIHRoaXMgYW4gaW1wbGljaXQgbWFwIHR5cGUgb3Igbm90LgorICBib29sIE1hcFR5cGVJc0ltcGxpY2l0ID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBMb2NhdGlvbiBvZiB0aGUgbWFwIHR5cGUuCisgIFNvdXJjZUxvY2F0aW9uIE1hcExvYzsKKworICAvLy8gXGJyaWVmIENvbG9uIGxvY2F0aW9uLgorICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYzsKKworICAvLy8gXGJyaWVmIEJ1aWxkIGEgY2xhdXNlIGZvciBcYSBOdW1WYXJzIGxpc3RlZCBleHByZXNzaW9ucywgXGEKKyAgLy8vIE51bVVuaXF1ZURlY2xhcmF0aW9ucyBkZWNsYXJhdGlvbnMsIFxhIE51bUNvbXBvbmVudExpc3RzIHRvdGFsIGNvbXBvbmVudAorICAvLy8gbGlzdHMsIGFuZCBcYSBOdW1Db21wb25lbnRzIHRvdGFsIGV4cHJlc3Npb24gY29tcG9uZW50cy4KKyAgLy8vCisgIC8vLyBccGFyYW0gTWFwVHlwZU1vZGlmaWVyIE1hcCB0eXBlIG1vZGlmaWVyLgorICAvLy8gXHBhcmFtIE1hcFR5cGUgTWFwIHR5cGUuCisgIC8vLyBccGFyYW0gTWFwVHlwZUlzSW1wbGljaXQgTWFwIHR5cGUgaXMgaW5mZXJyZWQgaW1wbGljaXRseS4KKyAgLy8vIFxwYXJhbSBNYXBMb2MgTG9jYXRpb24gb2YgdGhlIG1hcCB0eXBlLgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIE51bVZhcnMgTnVtYmVyIG9mIGV4cHJlc3Npb25zIGxpc3RlZCBpbiB0aGlzIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1VbmlxdWVEZWNsYXJhdGlvbnMgTnVtYmVyIG9mIHVuaXF1ZSBiYXNlIGRlY2xhcmF0aW9ucyBpbiB0aGlzCisgIC8vLyBjbGF1c2UuCisgIC8vLyBccGFyYW0gTnVtQ29tcG9uZW50TGlzdHMgTnVtYmVyIG9mIGNvbXBvbmVudCBsaXN0cyBpbiB0aGlzIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1Db21wb25lbnRzIFRvdGFsIG51bWJlciBvZiBleHByZXNzaW9uIGNvbXBvbmVudHMgaW4gdGhlIGNsYXVzZS4KKyAgZXhwbGljaXQgT01QTWFwQ2xhdXNlKE9wZW5NUE1hcENsYXVzZUtpbmQgTWFwVHlwZU1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgT3Blbk1QTWFwQ2xhdXNlS2luZCBNYXBUeXBlLCBib29sIE1hcFR5cGVJc0ltcGxpY2l0LAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTWFwTG9jLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtVmFycywgdW5zaWduZWQgTnVtVW5pcXVlRGVjbGFyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ29tcG9uZW50TGlzdHMsIHVuc2lnbmVkIE51bUNvbXBvbmVudHMpCisgICAgICA6IE9NUE1hcHBhYmxlRXhwckxpc3RDbGF1c2UoT01QQ19tYXAsIFN0YXJ0TG9jLCBMUGFyZW5Mb2MsIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1WYXJzLCBOdW1VbmlxdWVEZWNsYXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQ29tcG9uZW50TGlzdHMsIE51bUNvbXBvbmVudHMpLAorICAgICAgICBNYXBUeXBlTW9kaWZpZXIoTWFwVHlwZU1vZGlmaWVyKSwgTWFwVHlwZShNYXBUeXBlKSwKKyAgICAgICAgTWFwVHlwZUlzSW1wbGljaXQoTWFwVHlwZUlzSW1wbGljaXQpLCBNYXBMb2MoTWFwTG9jKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOdW1WYXJzIE51bWJlciBvZiBleHByZXNzaW9ucyBsaXN0ZWQgaW4gdGhpcyBjbGF1c2UuCisgIC8vLyBccGFyYW0gTnVtVW5pcXVlRGVjbGFyYXRpb25zIE51bWJlciBvZiB1bmlxdWUgYmFzZSBkZWNsYXJhdGlvbnMgaW4gdGhpcworICAvLy8gY2xhdXNlLgorICAvLy8gXHBhcmFtIE51bUNvbXBvbmVudExpc3RzIE51bWJlciBvZiBjb21wb25lbnQgbGlzdHMgaW4gdGhpcyBjbGF1c2UuCisgIC8vLyBccGFyYW0gTnVtQ29tcG9uZW50cyBUb3RhbCBudW1iZXIgb2YgZXhwcmVzc2lvbiBjb21wb25lbnRzIGluIHRoZSBjbGF1c2UuCisgIGV4cGxpY2l0IE9NUE1hcENsYXVzZSh1bnNpZ25lZCBOdW1WYXJzLCB1bnNpZ25lZCBOdW1VbmlxdWVEZWNsYXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1Db21wb25lbnRMaXN0cywgdW5zaWduZWQgTnVtQ29tcG9uZW50cykKKyAgICAgIDogT01QTWFwcGFibGVFeHByTGlzdENsYXVzZSgKKyAgICAgICAgICAgIE9NUENfbWFwLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgTnVtVmFycywgTnVtVW5pcXVlRGVjbGFyYXRpb25zLCBOdW1Db21wb25lbnRMaXN0cywgTnVtQ29tcG9uZW50cykge30KKworICAvLy8gXGJyaWVmIFNldCB0eXBlIG1vZGlmaWVyIGZvciB0aGUgY2xhdXNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUIFR5cGUgTW9kaWZpZXIgZm9yIHRoZSBjbGF1c2UuCisgIHZvaWQgc2V0TWFwVHlwZU1vZGlmaWVyKE9wZW5NUE1hcENsYXVzZUtpbmQgVCkgeyBNYXBUeXBlTW9kaWZpZXIgPSBUOyB9CisKKyAgLy8vIFxicmllZiBTZXQgdHlwZSBmb3IgdGhlIGNsYXVzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gVCBUeXBlIGZvciB0aGUgY2xhdXNlLgorICB2b2lkIHNldE1hcFR5cGUoT3Blbk1QTWFwQ2xhdXNlS2luZCBUKSB7IE1hcFR5cGUgPSBUOyB9CisKKyAgLy8vIFxicmllZiBTZXQgdHlwZSBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gVExvYyBUeXBlIGxvY2F0aW9uLgorICB2b2lkIHNldE1hcExvYyhTb3VyY2VMb2NhdGlvbiBUTG9jKSB7IE1hcExvYyA9IFRMb2M7IH0KKworICAvLy8gXGJyaWVmIFNldCBjb2xvbiBsb2NhdGlvbi4KKyAgdm9pZCBzZXRDb2xvbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgQ29sb25Mb2MgPSBMb2M7IH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgY2xhdXNlIHdpdGggYSBsaXN0IG9mIHZhcmlhYmxlcyBcYSBWTC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBWYXJzIFRoZSBvcmlnaW5hbCBleHByZXNzaW9uIHVzZWQgaW4gdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBEZWNsYXJhdGlvbnMgRGVjbGFyYXRpb25zIHVzZWQgaW4gdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBDb21wb25lbnRMaXN0cyBDb21wb25lbnQgbGlzdHMgdXNlZCBpbiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIFR5cGVNb2RpZmllciBNYXAgdHlwZSBtb2RpZmllci4KKyAgLy8vIFxwYXJhbSBUeXBlIE1hcCB0eXBlLgorICAvLy8gXHBhcmFtIFR5cGVJc0ltcGxpY2l0IE1hcCB0eXBlIGlzIGluZmVycmVkIGltcGxpY2l0bHkuCisgIC8vLyBccGFyYW0gVHlwZUxvYyBMb2NhdGlvbiBvZiB0aGUgbWFwIHR5cGUuCisgIHN0YXRpYyBPTVBNYXBDbGF1c2UgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBWYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWVEZWNsICo+IERlY2xhcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBhYmxlRXhwckNvbXBvbmVudExpc3RzUmVmIENvbXBvbmVudExpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3Blbk1QTWFwQ2xhdXNlS2luZCBUeXBlTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuTVBNYXBDbGF1c2VLaW5kIFR5cGUsIGJvb2wgVHlwZUlzSW1wbGljaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUeXBlTG9jKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgY2xhdXNlIHdpdGggdGhlIHBsYWNlIGZvciBcYSBOdW1WYXJzIG9yaWdpbmFsCisgIC8vLyBleHByZXNzaW9ucywgXGEgTnVtVW5pcXVlRGVjbGFyYXRpb25zIGRlY2xhcmF0aW9ucywgXE51bUNvbXBvbmVudExpc3RzCisgIC8vLyBsaXN0cywgYW5kIFxhIE51bUNvbXBvbmVudHMgZXhwcmVzc2lvbiBjb21wb25lbnRzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIE51bVZhcnMgTnVtYmVyIG9mIGV4cHJlc3Npb25zIGxpc3RlZCBpbiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIE51bVVuaXF1ZURlY2xhcmF0aW9ucyBOdW1iZXIgb2YgdW5pcXVlIGJhc2UgZGVjbGFyYXRpb25zIGluIHRoaXMKKyAgLy8vIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1Db21wb25lbnRMaXN0cyBOdW1iZXIgb2YgdW5pcXVlIGJhc2UgZGVjbGFyYXRpb25zIGluIHRoaXMKKyAgLy8vIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1Db21wb25lbnRzIFRvdGFsIG51bWJlciBvZiBleHByZXNzaW9uIGNvbXBvbmVudHMgaW4gdGhlIGNsYXVzZS4KKyAgc3RhdGljIE9NUE1hcENsYXVzZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywgdW5zaWduZWQgTnVtVmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtVW5pcXVlRGVjbGFyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1Db21wb25lbnRMaXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ29tcG9uZW50cyk7CisKKyAgLy8vIFxicmllZiBGZXRjaGVzIG1hcHBpbmcga2luZCBmb3IgdGhlIGNsYXVzZS4KKyAgT3Blbk1QTWFwQ2xhdXNlS2luZCBnZXRNYXBUeXBlKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBNYXBUeXBlOyB9CisKKyAgLy8vIFxicmllZiBJcyB0aGlzIGFuIGltcGxpY2l0IG1hcCB0eXBlPworICAvLy8gV2UgaGF2ZSB0byBjYXB0dXJlICdJc01hcFR5cGVJbXBsaWNpdCcgZnJvbSB0aGUgcGFyc2VyIGZvciBtb3JlCisgIC8vLyBpbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlcy4gIEl0IGhlbHBzIGRpc3Rpbmd1aXNoIG1hcChyKSBmcm9tCisgIC8vLyBtYXAodG9mcm9tOiByKSwgd2hpY2ggaXMgaW1wb3J0YW50IHRvIHByaW50IG1vcmUgaGVscGZ1bCBlcnJvcgorICAvLy8gbWVzc2FnZXMgZm9yIHNvbWUgdGFyZ2V0IGRpcmVjdGl2ZXMuCisgIGJvb2wgaXNJbXBsaWNpdE1hcFR5cGUoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIE1hcFR5cGVJc0ltcGxpY2l0OyB9CisKKyAgLy8vIFxicmllZiBGZXRjaGVzIHRoZSBtYXAgdHlwZSBtb2RpZmllciBmb3IgdGhlIGNsYXVzZS4KKyAgT3Blbk1QTWFwQ2xhdXNlS2luZCBnZXRNYXBUeXBlTW9kaWZpZXIoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gTWFwVHlwZU1vZGlmaWVyOworICB9CisKKyAgLy8vIFxicmllZiBGZXRjaGVzIGxvY2F0aW9uIG9mIGNsYXVzZSBtYXBwaW5nIGtpbmQuCisgIFNvdXJjZUxvY2F0aW9uIGdldE1hcExvYygpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gTWFwTG9jOyB9CisKKyAgLy8vIFxicmllZiBHZXQgY29sb24gbG9jYXRpb24uCisgIFNvdXJjZUxvY2F0aW9uIGdldENvbG9uTG9jKCkgY29uc3QgeyByZXR1cm4gQ29sb25Mb2M7IH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9iZWdpbigpKSwKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2VuZCgpKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgeworICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ19tYXA7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICdudW1fdGVhbXMnIGNsYXVzZSBpbiB0aGUgJyNwcmFnbWEgb21wIC4uLicKKy8vLyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHRlYW1zIG51bV90ZWFtcyhuKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgdGVhbXMnIGhhcyBjbGF1c2UgJ251bV90ZWFtcycKKy8vLyB3aXRoIHNpbmdsZSBleHByZXNzaW9uICduJy4KK2NsYXNzIE9NUE51bVRlYW1zQ2xhdXNlIDogcHVibGljIE9NUENsYXVzZSwgcHVibGljIE9NUENsYXVzZVdpdGhQcmVJbml0IHsKKyAgZnJpZW5kIGNsYXNzIE9NUENsYXVzZVJlYWRlcjsKKworICAvLy8gXGJyaWVmIExvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jOworCisgIC8vLyBcYnJpZWYgTnVtVGVhbXMgbnVtYmVyLgorICBTdG10ICpOdW1UZWFtcyA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIE51bVRlYW1zIG51bWJlci4KKyAgLy8vCisgIC8vLyBccGFyYW0gRSBOdW1UZWFtcyBudW1iZXIuCisgIHZvaWQgc2V0TnVtVGVhbXMoRXhwciAqRSkgeyBOdW1UZWFtcyA9IEU7IH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIEJ1aWxkICdudW1fdGVhbXMnIGNsYXVzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gRSBFeHByZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBIZWxwZXJFIEhlbHBlciBFeHByZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBDYXB0dXJlUmVnaW9uIElubmVybW9zdCBPcGVuTVAgcmVnaW9uIHdoZXJlIGV4cHJlc3Npb25zIGluIHRoaXMKKyAgLy8vIGNsYXVzZSBtdXN0IGJlIGNhcHR1cmVkLgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIE9NUE51bVRlYW1zQ2xhdXNlKEV4cHIgKkUsIFN0bXQgKkhlbHBlckUsIE9wZW5NUERpcmVjdGl2ZUtpbmQgQ2FwdHVyZVJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ19udW1fdGVhbXMsIFN0YXJ0TG9jLCBFbmRMb2MpLCBPTVBDbGF1c2VXaXRoUHJlSW5pdCh0aGlzKSwKKyAgICAgICAgTFBhcmVuTG9jKExQYXJlbkxvYyksIE51bVRlYW1zKEUpIHsKKyAgICBzZXRQcmVJbml0U3RtdChIZWxwZXJFLCBDYXB0dXJlUmVnaW9uKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICBPTVBOdW1UZWFtc0NsYXVzZSgpCisgICAgICA6IE9NUENsYXVzZShPTVBDX251bV90ZWFtcywgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSksCisgICAgICAgIE9NUENsYXVzZVdpdGhQcmVJbml0KHRoaXMpIHt9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBsb2NhdGlvbiBvZiAnKCcuCisgIHZvaWQgc2V0TFBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBMUGFyZW5Mb2MgPSBMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gZ2V0TFBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gTFBhcmVuTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gTnVtVGVhbXMgbnVtYmVyLgorICBFeHByICpnZXROdW1UZWFtcygpIHsgcmV0dXJuIGNhc3Q8RXhwcj4oTnVtVGVhbXMpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gTnVtVGVhbXMgbnVtYmVyLgorICBFeHByICpnZXROdW1UZWFtcygpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8RXhwcj4oTnVtVGVhbXMpOyB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7IHJldHVybiBjaGlsZF9yYW5nZSgmTnVtVGVhbXMsICZOdW1UZWFtcyArIDEpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfbnVtX3RlYW1zOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAndGhyZWFkX2xpbWl0JyBjbGF1c2UgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nCisvLy8gZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCB0ZWFtcyB0aHJlYWRfbGltaXQobikKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRlYW1zJyBoYXMgY2xhdXNlICd0aHJlYWRfbGltaXQnCisvLy8gd2l0aCBzaW5nbGUgZXhwcmVzc2lvbiAnbicuCitjbGFzcyBPTVBUaHJlYWRMaW1pdENsYXVzZSA6IHB1YmxpYyBPTVBDbGF1c2UsIHB1YmxpYyBPTVBDbGF1c2VXaXRoUHJlSW5pdCB7CisgIGZyaWVuZCBjbGFzcyBPTVBDbGF1c2VSZWFkZXI7CisKKyAgLy8vIFxicmllZiBMb2NhdGlvbiBvZiAnKCcuCisgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYzsKKworICAvLy8gXGJyaWVmIFRocmVhZExpbWl0IG51bWJlci4KKyAgU3RtdCAqVGhyZWFkTGltaXQgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBUaHJlYWRMaW1pdCBudW1iZXIuCisgIC8vLworICAvLy8gXHBhcmFtIEUgVGhyZWFkTGltaXQgbnVtYmVyLgorICB2b2lkIHNldFRocmVhZExpbWl0KEV4cHIgKkUpIHsgVGhyZWFkTGltaXQgPSBFOyB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBCdWlsZCAndGhyZWFkX2xpbWl0JyBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIEUgRXhwcmVzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGF1c2UuCisgIC8vLyBccGFyYW0gSGVscGVyRSBIZWxwZXIgRXhwcmVzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGF1c2UuCisgIC8vLyBccGFyYW0gQ2FwdHVyZVJlZ2lvbiBJbm5lcm1vc3QgT3Blbk1QIHJlZ2lvbiB3aGVyZSBleHByZXNzaW9ucyBpbiB0aGlzCisgIC8vLyBjbGF1c2UgbXVzdCBiZSBjYXB0dXJlZC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICBPTVBUaHJlYWRMaW1pdENsYXVzZShFeHByICpFLCBTdG10ICpIZWxwZXJFLAorICAgICAgICAgICAgICAgICAgICAgICBPcGVuTVBEaXJlY3RpdmVLaW5kIENhcHR1cmVSZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfdGhyZWFkX2xpbWl0LCBTdGFydExvYywgRW5kTG9jKSwKKyAgICAgICAgT01QQ2xhdXNlV2l0aFByZUluaXQodGhpcyksIExQYXJlbkxvYyhMUGFyZW5Mb2MpLCBUaHJlYWRMaW1pdChFKSB7CisgICAgc2V0UHJlSW5pdFN0bXQoSGVscGVyRSwgQ2FwdHVyZVJlZ2lvbik7CisgIH0KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KKyAgT01QVGhyZWFkTGltaXRDbGF1c2UoKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ190aHJlYWRfbGltaXQsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpLAorICAgICAgICBPTVBDbGF1c2VXaXRoUHJlSW5pdCh0aGlzKSB7fQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbG9jYXRpb24gb2YgJygnLgorICB2b2lkIHNldExQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgTFBhcmVuTG9jID0gTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiAnKCcuCisgIFNvdXJjZUxvY2F0aW9uIGdldExQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIExQYXJlbkxvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIFRocmVhZExpbWl0IG51bWJlci4KKyAgRXhwciAqZ2V0VGhyZWFkTGltaXQoKSB7IHJldHVybiBjYXN0PEV4cHI+KFRocmVhZExpbWl0KTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIFRocmVhZExpbWl0IG51bWJlci4KKyAgRXhwciAqZ2V0VGhyZWFkTGltaXQoKSBjb25zdCB7IHJldHVybiBjYXN0PEV4cHI+KFRocmVhZExpbWl0KTsgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoJlRocmVhZExpbWl0LCAmVGhyZWFkTGltaXQgKyAxKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldENsYXVzZUtpbmQoKSA9PSBPTVBDX3RocmVhZF9saW1pdDsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJ3ByaW9yaXR5JyBjbGF1c2UgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nCisvLy8gZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCB0YXNrIHByaW9yaXR5KG4pCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCB0ZWFtcycgaGFzIGNsYXVzZSAncHJpb3JpdHknIHdpdGgKKy8vLyBzaW5nbGUgZXhwcmVzc2lvbiAnbicuCitjbGFzcyBPTVBQcmlvcml0eUNsYXVzZSA6IHB1YmxpYyBPTVBDbGF1c2UgeworICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOworCisgIC8vLyBcYnJpZWYgTG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2M7CisKKyAgLy8vIFxicmllZiBQcmlvcml0eSBudW1iZXIuCisgIFN0bXQgKlByaW9yaXR5ID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFNldCB0aGUgUHJpb3JpdHkgbnVtYmVyLgorICAvLy8KKyAgLy8vIFxwYXJhbSBFIFByaW9yaXR5IG51bWJlci4KKyAgdm9pZCBzZXRQcmlvcml0eShFeHByICpFKSB7IFByaW9yaXR5ID0gRTsgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQnVpbGQgJ3ByaW9yaXR5JyBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIEUgRXhwcmVzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGF1c2UuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBMUGFyZW5Mb2MgTG9jYXRpb24gb2YgJygnLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgT01QUHJpb3JpdHlDbGF1c2UoRXhwciAqRSwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ19wcmlvcml0eSwgU3RhcnRMb2MsIEVuZExvYyksIExQYXJlbkxvYyhMUGFyZW5Mb2MpLAorICAgICAgICBQcmlvcml0eShFKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICBPTVBQcmlvcml0eUNsYXVzZSgpCisgICAgICA6IE9NUENsYXVzZShPTVBDX3ByaW9yaXR5LCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpKSB7fQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbG9jYXRpb24gb2YgJygnLgorICB2b2lkIHNldExQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgTFBhcmVuTG9jID0gTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiAnKCcuCisgIFNvdXJjZUxvY2F0aW9uIGdldExQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIExQYXJlbkxvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIFByaW9yaXR5IG51bWJlci4KKyAgRXhwciAqZ2V0UHJpb3JpdHkoKSB7IHJldHVybiBjYXN0PEV4cHI+KFByaW9yaXR5KTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIFByaW9yaXR5IG51bWJlci4KKyAgRXhwciAqZ2V0UHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiBjYXN0PEV4cHI+KFByaW9yaXR5KTsgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoJlByaW9yaXR5LCAmUHJpb3JpdHkgKyAxKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldENsYXVzZUtpbmQoKSA9PSBPTVBDX3ByaW9yaXR5OworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnZ3JhaW5zaXplJyBjbGF1c2UgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nCisvLy8gZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCB0YXNrbG9vcCBncmFpbnNpemUoNCkKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRhc2tsb29wJyBoYXMgY2xhdXNlICdncmFpbnNpemUnCisvLy8gd2l0aCBzaW5nbGUgZXhwcmVzc2lvbiAnNCcuCitjbGFzcyBPTVBHcmFpbnNpemVDbGF1c2UgOiBwdWJsaWMgT01QQ2xhdXNlIHsKKyAgZnJpZW5kIGNsYXNzIE9NUENsYXVzZVJlYWRlcjsKKworICAvLy8gXGJyaWVmIExvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jOworCisgIC8vLyBcYnJpZWYgU2FmZSBpdGVyYXRpb24gc3BhY2UgZGlzdGFuY2UuCisgIFN0bXQgKkdyYWluc2l6ZSA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBTZXQgc2FmZWxlbi4KKyAgdm9pZCBzZXRHcmFpbnNpemUoRXhwciAqU2l6ZSkgeyBHcmFpbnNpemUgPSBTaXplOyB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBCdWlsZCAnZ3JhaW5zaXplJyBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIFNpemUgRXhwcmVzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGF1c2UuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIE9NUEdyYWluc2l6ZUNsYXVzZShFeHByICpTaXplLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywgU291cmNlTG9jYXRpb24gRW5kTG9jKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ19ncmFpbnNpemUsIFN0YXJ0TG9jLCBFbmRMb2MpLCBMUGFyZW5Mb2MoTFBhcmVuTG9jKSwKKyAgICAgICAgR3JhaW5zaXplKFNpemUpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIGV4cGxpY2l0IE9NUEdyYWluc2l6ZUNsYXVzZSgpCisgICAgICA6IE9NUENsYXVzZShPTVBDX2dyYWluc2l6ZSwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSkge30KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIGxvY2F0aW9uIG9mICcoJy4KKyAgdm9pZCBzZXRMUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IExQYXJlbkxvYyA9IExvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBMUGFyZW5Mb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiBzYWZlIGl0ZXJhdGlvbiBzcGFjZSBkaXN0YW5jZS4KKyAgRXhwciAqZ2V0R3JhaW5zaXplKCkgY29uc3QgeyByZXR1cm4gY2FzdF9vcl9udWxsPEV4cHI+KEdyYWluc2l6ZSk7IH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsgcmV0dXJuIGNoaWxkX3JhbmdlKCZHcmFpbnNpemUsICZHcmFpbnNpemUgKyAxKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldENsYXVzZUtpbmQoKSA9PSBPTVBDX2dyYWluc2l6ZTsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJ25vZ3JvdXAnIGNsYXVzZSBpbiB0aGUgJyNwcmFnbWEgb21wIC4uLicgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCB0YXNrbG9vcCBub2dyb3VwCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCB0YXNrbG9vcCcgaGFzICdub2dyb3VwJyBjbGF1c2UuCitjbGFzcyBPTVBOb2dyb3VwQ2xhdXNlIDogcHVibGljIE9NUENsYXVzZSB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQnVpbGQgJ25vZ3JvdXAnIGNsYXVzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIE9NUE5vZ3JvdXBDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfbm9ncm91cCwgU3RhcnRMb2MsIEVuZExvYykge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KKyAgT01QTm9ncm91cENsYXVzZSgpCisgICAgICA6IE9NUENsYXVzZShPTVBDX25vZ3JvdXAsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpIHt9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfbm9ncm91cDsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJ251bV90YXNrcycgY2xhdXNlIGluIHRoZSAnI3ByYWdtYSBvbXAgLi4uJworLy8vIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgdGFza2xvb3AgbnVtX3Rhc2tzKDQpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCB0YXNrbG9vcCcgaGFzIGNsYXVzZSAnbnVtX3Rhc2tzJworLy8vIHdpdGggc2luZ2xlIGV4cHJlc3Npb24gJzQnLgorY2xhc3MgT01QTnVtVGFza3NDbGF1c2UgOiBwdWJsaWMgT01QQ2xhdXNlIHsKKyAgZnJpZW5kIGNsYXNzIE9NUENsYXVzZVJlYWRlcjsKKworICAvLy8gXGJyaWVmIExvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jOworCisgIC8vLyBcYnJpZWYgU2FmZSBpdGVyYXRpb24gc3BhY2UgZGlzdGFuY2UuCisgIFN0bXQgKk51bVRhc2tzID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFNldCBzYWZlbGVuLgorICB2b2lkIHNldE51bVRhc2tzKEV4cHIgKlNpemUpIHsgTnVtVGFza3MgPSBTaXplOyB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBCdWlsZCAnbnVtX3Rhc2tzJyBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIFNpemUgRXhwcmVzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGF1c2UuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIE9NUE51bVRhc2tzQ2xhdXNlKEV4cHIgKlNpemUsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfbnVtX3Rhc2tzLCBTdGFydExvYywgRW5kTG9jKSwgTFBhcmVuTG9jKExQYXJlbkxvYyksCisgICAgICAgIE51bVRhc2tzKFNpemUpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIGV4cGxpY2l0IE9NUE51bVRhc2tzQ2xhdXNlKCkKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfbnVtX3Rhc2tzLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpKSB7fQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbG9jYXRpb24gb2YgJygnLgorICB2b2lkIHNldExQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgTFBhcmVuTG9jID0gTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiAnKCcuCisgIFNvdXJjZUxvY2F0aW9uIGdldExQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIExQYXJlbkxvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHNhZmUgaXRlcmF0aW9uIHNwYWNlIGRpc3RhbmNlLgorICBFeHByICpnZXROdW1UYXNrcygpIGNvbnN0IHsgcmV0dXJuIGNhc3Rfb3JfbnVsbDxFeHByPihOdW1UYXNrcyk7IH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsgcmV0dXJuIGNoaWxkX3JhbmdlKCZOdW1UYXNrcywgJk51bVRhc2tzICsgMSk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgeworICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ19udW1fdGFza3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICdoaW50JyBjbGF1c2UgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgY3JpdGljYWwgKG5hbWUpIGhpbnQoNikKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIGNyaXRpY2FsJyBoYXMgbmFtZSAnbmFtZScgYW5kIGNsYXVzZQorLy8vICdoaW50JyB3aXRoIGFyZ3VtZW50ICc2Jy4KK2NsYXNzIE9NUEhpbnRDbGF1c2UgOiBwdWJsaWMgT01QQ2xhdXNlIHsKKyAgZnJpZW5kIGNsYXNzIE9NUENsYXVzZVJlYWRlcjsKKworICAvLy8gXGJyaWVmIExvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jOworCisgIC8vLyBcYnJpZWYgSGludCBleHByZXNzaW9uIG9mIHRoZSAnaGludCcgY2xhdXNlLgorICBTdG10ICpIaW50ID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFNldCBoaW50IGV4cHJlc3Npb24uCisgIHZvaWQgc2V0SGludChFeHByICpIKSB7IEhpbnQgPSBIOyB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBCdWlsZCAnaGludCcgY2xhdXNlIHdpdGggZXhwcmVzc2lvbiBcYSBIaW50LgorICAvLy8KKyAgLy8vIFxwYXJhbSBIaW50IEhpbnQgZXhwcmVzc2lvbi4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICBPTVBIaW50Q2xhdXNlKEV4cHIgKkhpbnQsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ19oaW50LCBTdGFydExvYywgRW5kTG9jKSwgTFBhcmVuTG9jKExQYXJlbkxvYyksCisgICAgICAgIEhpbnQoSGludCkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KKyAgT01QSGludENsYXVzZSgpIDogT01QQ2xhdXNlKE9NUENfaGludCwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSkge30KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIGxvY2F0aW9uIG9mICcoJy4KKyAgdm9pZCBzZXRMUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IExQYXJlbkxvYyA9IExvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBMUGFyZW5Mb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgbnVtYmVyIG9mIHRocmVhZHMuCisgIEV4cHIgKmdldEhpbnQoKSBjb25zdCB7IHJldHVybiBjYXN0X29yX251bGw8RXhwcj4oSGludCk7IH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsgcmV0dXJuIGNoaWxkX3JhbmdlKCZIaW50LCAmSGludCArIDEpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfaGludDsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJ2Rpc3Rfc2NoZWR1bGUnIGNsYXVzZSBpbiB0aGUgJyNwcmFnbWEgb21wIC4uLicKKy8vLyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIGRpc3RyaWJ1dGUgZGlzdF9zY2hlZHVsZShzdGF0aWMsIDMpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBkaXN0cmlidXRlJyBoYXMgJ2Rpc3Rfc2NoZWR1bGUnCisvLy8gY2xhdXNlIHdpdGggYXJndW1lbnRzICdzdGF0aWMnIGFuZCAnMycuCitjbGFzcyBPTVBEaXN0U2NoZWR1bGVDbGF1c2UgOiBwdWJsaWMgT01QQ2xhdXNlLCBwdWJsaWMgT01QQ2xhdXNlV2l0aFByZUluaXQgeworICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOworCisgIC8vLyBcYnJpZWYgTG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2M7CisKKyAgLy8vIFxicmllZiBBIGtpbmQgb2YgdGhlICdzY2hlZHVsZScgY2xhdXNlLgorICBPcGVuTVBEaXN0U2NoZWR1bGVDbGF1c2VLaW5kIEtpbmQgPSBPTVBDX0RJU1RfU0NIRURVTEVfdW5rbm93bjsKKworICAvLy8gXGJyaWVmIFN0YXJ0IGxvY2F0aW9uIG9mIHRoZSBzY2hlZHVsZSBraW5kIGluIHNvdXJjZSBjb2RlLgorICBTb3VyY2VMb2NhdGlvbiBLaW5kTG9jOworCisgIC8vLyBcYnJpZWYgTG9jYXRpb24gb2YgJywnIChpZiBhbnkpLgorICBTb3VyY2VMb2NhdGlvbiBDb21tYUxvYzsKKworICAvLy8gXGJyaWVmIENodW5rIHNpemUuCisgIEV4cHIgKkNodW5rU2l6ZSA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBTZXQgc2NoZWR1bGUga2luZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gSyBTY2hlZHVsZSBraW5kLgorICB2b2lkIHNldERpc3RTY2hlZHVsZUtpbmQoT3Blbk1QRGlzdFNjaGVkdWxlQ2xhdXNlS2luZCBLKSB7IEtpbmQgPSBLOyB9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBsb2NhdGlvbiBvZiAnKCcuCisgIC8vLworICAvLy8gXHBhcmFtIExvYyBMb2NhdGlvbiBvZiAnKCcuCisgIHZvaWQgc2V0TFBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBMUGFyZW5Mb2MgPSBMb2M7IH0KKworICAvLy8gXGJyaWVmIFNldCBzY2hlZHVsZSBraW5kIHN0YXJ0IGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBLTG9jIFNjaGVkdWxlIGtpbmQgbG9jYXRpb24uCisgIHZvaWQgc2V0RGlzdFNjaGVkdWxlS2luZExvYyhTb3VyY2VMb2NhdGlvbiBLTG9jKSB7IEtpbmRMb2MgPSBLTG9jOyB9CisKKyAgLy8vIFxicmllZiBTZXQgbG9jYXRpb24gb2YgJywnLgorICAvLy8KKyAgLy8vIFxwYXJhbSBMb2MgTG9jYXRpb24gb2YgJywnLgorICB2b2lkIHNldENvbW1hTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBDb21tYUxvYyA9IExvYzsgfQorCisgIC8vLyBcYnJpZWYgU2V0IGNodW5rIHNpemUuCisgIC8vLworICAvLy8gXHBhcmFtIEUgQ2h1bmsgc2l6ZS4KKyAgdm9pZCBzZXRDaHVua1NpemUoRXhwciAqRSkgeyBDaHVua1NpemUgPSBFOyB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBCdWlsZCAnZGlzdF9zY2hlZHVsZScgY2xhdXNlIHdpdGggc2NoZWR1bGUga2luZCBcYSBLaW5kIGFuZCBjaHVuaworICAvLy8gc2l6ZSBleHByZXNzaW9uIFxhIENodW5rU2l6ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBMUGFyZW5Mb2MgTG9jYXRpb24gb2YgJygnLgorICAvLy8gXHBhcmFtIEtMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGFyZ3VtZW50LgorICAvLy8gXHBhcmFtIENvbW1hTG9jIExvY2F0aW9uIG9mICcsJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gS2luZCBEaXN0U2NoZWR1bGUga2luZC4KKyAgLy8vIFxwYXJhbSBDaHVua1NpemUgQ2h1bmsgc2l6ZS4KKyAgLy8vIFxwYXJhbSBIZWxwZXJDaHVua1NpemUgSGVscGVyIGNodW5rIHNpemUgZm9yIGNvbWJpbmVkIGRpcmVjdGl2ZXMuCisgIE9NUERpc3RTY2hlZHVsZUNsYXVzZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gS0xvYywgU291cmNlTG9jYXRpb24gQ29tbWFMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBPcGVuTVBEaXN0U2NoZWR1bGVDbGF1c2VLaW5kIEtpbmQsIEV4cHIgKkNodW5rU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKkhlbHBlckNodW5rU2l6ZSkKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfZGlzdF9zY2hlZHVsZSwgU3RhcnRMb2MsIEVuZExvYyksCisgICAgICAgIE9NUENsYXVzZVdpdGhQcmVJbml0KHRoaXMpLCBMUGFyZW5Mb2MoTFBhcmVuTG9jKSwgS2luZChLaW5kKSwKKyAgICAgICAgS2luZExvYyhLTG9jKSwgQ29tbWFMb2MoQ29tbWFMb2MpLCBDaHVua1NpemUoQ2h1bmtTaXplKSB7CisgICAgc2V0UHJlSW5pdFN0bXQoSGVscGVyQ2h1bmtTaXplKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICBleHBsaWNpdCBPTVBEaXN0U2NoZWR1bGVDbGF1c2UoKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ19kaXN0X3NjaGVkdWxlLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpKSwKKyAgICAgICAgT01QQ2xhdXNlV2l0aFByZUluaXQodGhpcykge30KKworICAvLy8gXGJyaWVmIEdldCBraW5kIG9mIHRoZSBjbGF1c2UuCisgIE9wZW5NUERpc3RTY2hlZHVsZUNsYXVzZUtpbmQgZ2V0RGlzdFNjaGVkdWxlS2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICAvLy8gXGJyaWVmIEdldCBsb2NhdGlvbiBvZiAnKCcuCisgIFNvdXJjZUxvY2F0aW9uIGdldExQYXJlbkxvYygpIHsgcmV0dXJuIExQYXJlbkxvYzsgfQorCisgIC8vLyBcYnJpZWYgR2V0IGtpbmQgbG9jYXRpb24uCisgIFNvdXJjZUxvY2F0aW9uIGdldERpc3RTY2hlZHVsZUtpbmRMb2MoKSB7IHJldHVybiBLaW5kTG9jOyB9CisKKyAgLy8vIFxicmllZiBHZXQgbG9jYXRpb24gb2YgJywnLgorICBTb3VyY2VMb2NhdGlvbiBnZXRDb21tYUxvYygpIHsgcmV0dXJuIENvbW1hTG9jOyB9CisKKyAgLy8vIFxicmllZiBHZXQgY2h1bmsgc2l6ZS4KKyAgRXhwciAqZ2V0Q2h1bmtTaXplKCkgeyByZXR1cm4gQ2h1bmtTaXplOyB9CisKKyAgLy8vIFxicmllZiBHZXQgY2h1bmsgc2l6ZS4KKyAgY29uc3QgRXhwciAqZ2V0Q2h1bmtTaXplKCkgY29uc3QgeyByZXR1cm4gQ2h1bmtTaXplOyB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4oJkNodW5rU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4oJkNodW5rU2l6ZSkgKyAxKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldENsYXVzZUtpbmQoKSA9PSBPTVBDX2Rpc3Rfc2NoZWR1bGU7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICdkZWZhdWx0bWFwJyBjbGF1c2UgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgdGFyZ2V0IGRlZmF1bHRtYXAodG9mcm9tOiBzY2FsYXIpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCB0YXJnZXQnIGhhcyAnZGVmYXVsdG1hcCcgY2xhdXNlIG9mIGtpbmQKKy8vLyAnc2NhbGFyJyB3aXRoIG1vZGlmaWVyICd0b2Zyb20nLgorY2xhc3MgT01QRGVmYXVsdG1hcENsYXVzZSA6IHB1YmxpYyBPTVBDbGF1c2UgeworICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOworCisgIC8vLyBcYnJpZWYgTG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2M7CisKKyAgLy8vIFxicmllZiBNb2RpZmllcnMgZm9yICdkZWZhdWx0bWFwJyBjbGF1c2UuCisgIE9wZW5NUERlZmF1bHRtYXBDbGF1c2VNb2RpZmllciBNb2RpZmllciA9IE9NUENfREVGQVVMVE1BUF9NT0RJRklFUl91bmtub3duOworCisgIC8vLyBcYnJpZWYgTG9jYXRpb25zIG9mIG1vZGlmaWVycy4KKyAgU291cmNlTG9jYXRpb24gTW9kaWZpZXJMb2M7CisKKyAgLy8vIFxicmllZiBBIGtpbmQgb2YgdGhlICdkZWZhdWx0bWFwJyBjbGF1c2UuCisgIE9wZW5NUERlZmF1bHRtYXBDbGF1c2VLaW5kIEtpbmQgPSBPTVBDX0RFRkFVTFRNQVBfdW5rbm93bjsKKworICAvLy8gXGJyaWVmIFN0YXJ0IGxvY2F0aW9uIG9mIHRoZSBkZWZhdWx0bWFwIGtpbmQgaW4gc291cmNlIGNvZGUuCisgIFNvdXJjZUxvY2F0aW9uIEtpbmRMb2M7CisKKyAgLy8vIFxicmllZiBTZXQgZGVmYXVsdG1hcCBraW5kLgorICAvLy8KKyAgLy8vIFxwYXJhbSBLIERlZmF1bHRtYXAga2luZC4KKyAgdm9pZCBzZXREZWZhdWx0bWFwS2luZChPcGVuTVBEZWZhdWx0bWFwQ2xhdXNlS2luZCBLKSB7IEtpbmQgPSBLOyB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGRlZmF1bHRtYXAgbW9kaWZpZXIuCisgIC8vLworICAvLy8gXHBhcmFtIE0gRGVmYXVsdG1hcCBtb2RpZmllci4KKyAgdm9pZCBzZXREZWZhdWx0bWFwTW9kaWZpZXIoT3Blbk1QRGVmYXVsdG1hcENsYXVzZU1vZGlmaWVyIE0pIHsKKyAgICBNb2RpZmllciA9IE07CisgIH0KKworICAvLy8gXGJyaWVmIFNldCBsb2NhdGlvbiBvZiB0aGUgZGVmYXVsdG1hcCBtb2RpZmllci4KKyAgdm9pZCBzZXREZWZhdWx0bWFwTW9kaWZpZXJMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgTW9kaWZpZXJMb2MgPSBMb2M7CisgIH0KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIGxvY2F0aW9uIG9mICcoJy4KKyAgLy8vCisgIC8vLyBccGFyYW0gTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgdm9pZCBzZXRMUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IExQYXJlbkxvYyA9IExvYzsgfQorCisgIC8vLyBcYnJpZWYgU2V0IGRlZmF1bHRtYXAga2luZCBzdGFydCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gS0xvYyBEZWZhdWx0bWFwIGtpbmQgbG9jYXRpb24uCisgIHZvaWQgc2V0RGVmYXVsdG1hcEtpbmRMb2MoU291cmNlTG9jYXRpb24gS0xvYykgeyBLaW5kTG9jID0gS0xvYzsgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQnVpbGQgJ2RlZmF1bHRtYXAnIGNsYXVzZSB3aXRoIGRlZmF1bHRtYXAga2luZCBcYSBLaW5kCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBLTG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBhcmd1bWVudC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gS2luZCBEZWZhdWx0bWFwIGtpbmQuCisgIC8vLyBccGFyYW0gTSBUaGUgbW9kaWZpZXIgYXBwbGllZCB0byAnZGVmYXVsdG1hcCcgY2xhdXNlLgorICAvLy8gXHBhcmFtIE1Mb2MgTG9jYXRpb24gb2YgdGhlIG1vZGlmaWVyCisgIE9NUERlZmF1bHRtYXBDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBNTG9jLCBTb3VyY2VMb2NhdGlvbiBLTG9jLAorICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywgT3Blbk1QRGVmYXVsdG1hcENsYXVzZUtpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICBPcGVuTVBEZWZhdWx0bWFwQ2xhdXNlTW9kaWZpZXIgTSkKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfZGVmYXVsdG1hcCwgU3RhcnRMb2MsIEVuZExvYyksIExQYXJlbkxvYyhMUGFyZW5Mb2MpLAorICAgICAgICBNb2RpZmllcihNKSwgTW9kaWZpZXJMb2MoTUxvYyksIEtpbmQoS2luZCksIEtpbmRMb2MoS0xvYykge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KKyAgZXhwbGljaXQgT01QRGVmYXVsdG1hcENsYXVzZSgpCisgICAgICA6IE9NUENsYXVzZShPTVBDX2RlZmF1bHRtYXAsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpIHt9CisKKyAgLy8vIFxicmllZiBHZXQga2luZCBvZiB0aGUgY2xhdXNlLgorICBPcGVuTVBEZWZhdWx0bWFwQ2xhdXNlS2luZCBnZXREZWZhdWx0bWFwS2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbW9kaWZpZXIgb2YgdGhlIGNsYXVzZS4KKyAgT3Blbk1QRGVmYXVsdG1hcENsYXVzZU1vZGlmaWVyIGdldERlZmF1bHRtYXBNb2RpZmllcigpIGNvbnN0IHsKKyAgICByZXR1cm4gTW9kaWZpZXI7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBsb2NhdGlvbiBvZiAnKCcuCisgIFNvdXJjZUxvY2F0aW9uIGdldExQYXJlbkxvYygpIHsgcmV0dXJuIExQYXJlbkxvYzsgfQorCisgIC8vLyBcYnJpZWYgR2V0IGtpbmQgbG9jYXRpb24uCisgIFNvdXJjZUxvY2F0aW9uIGdldERlZmF1bHRtYXBLaW5kTG9jKCkgeyByZXR1cm4gS2luZExvYzsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBtb2RpZmllciBsb2NhdGlvbi4KKyAgU291cmNlTG9jYXRpb24gZ2V0RGVmYXVsdG1hcE1vZGlmaWVyTG9jKCkgY29uc3QgeworICAgIHJldHVybiBNb2RpZmllckxvYzsKKyAgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldENsYXVzZUtpbmQoKSA9PSBPTVBDX2RlZmF1bHRtYXA7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzIGNsYXVzZSAndG8nIGluIHRoZSAnI3ByYWdtYSBvbXAgLi4uJworLy8vIGRpcmVjdGl2ZXMuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHRhcmdldCB1cGRhdGUgdG8oYSxiKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgdGFyZ2V0IHVwZGF0ZScgaGFzIGNsYXVzZSAndG8nCisvLy8gd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InLgorY2xhc3MgT01QVG9DbGF1c2UgZmluYWwgOiBwdWJsaWMgT01QTWFwcGFibGVFeHByTGlzdENsYXVzZTxPTVBUb0NsYXVzZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01QVG9DbGF1c2UsIEV4cHIgKiwgVmFsdWVEZWNsICosIHVuc2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01QQ2xhdXNlTWFwcGFibGVFeHByQ29tbW9uOjpNYXBwYWJsZUNvbXBvbmVudD4geworICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOworICBmcmllbmQgT01QTWFwcGFibGVFeHByTGlzdENsYXVzZTsKKyAgZnJpZW5kIE9NUFZhckxpc3RDbGF1c2U7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgLy8vIFxicmllZiBCdWlsZCBjbGF1c2Ugd2l0aCBudW1iZXIgb2YgdmFyaWFibGVzIFxhIE51bVZhcnMuCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIE51bVZhcnMgTnVtYmVyIG9mIGV4cHJlc3Npb25zIGxpc3RlZCBpbiB0aGlzIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1VbmlxdWVEZWNsYXJhdGlvbnMgTnVtYmVyIG9mIHVuaXF1ZSBiYXNlIGRlY2xhcmF0aW9ucyBpbiB0aGlzCisgIC8vLyBjbGF1c2UuCisgIC8vLyBccGFyYW0gTnVtQ29tcG9uZW50TGlzdHMgTnVtYmVyIG9mIGNvbXBvbmVudCBsaXN0cyBpbiB0aGlzIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1Db21wb25lbnRzIFRvdGFsIG51bWJlciBvZiBleHByZXNzaW9uIGNvbXBvbmVudHMgaW4gdGhlIGNsYXVzZS4KKyAgZXhwbGljaXQgT01QVG9DbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLCB1bnNpZ25lZCBOdW1WYXJzLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1VbmlxdWVEZWNsYXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNvbXBvbmVudExpc3RzLCB1bnNpZ25lZCBOdW1Db21wb25lbnRzKQorICAgICAgOiBPTVBNYXBwYWJsZUV4cHJMaXN0Q2xhdXNlKE9NUENfdG8sIFN0YXJ0TG9jLCBMUGFyZW5Mb2MsIEVuZExvYywgTnVtVmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1VbmlxdWVEZWNsYXJhdGlvbnMsIE51bUNvbXBvbmVudExpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUNvbXBvbmVudHMpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIE51bVZhcnMgTnVtYmVyIG9mIGV4cHJlc3Npb25zIGxpc3RlZCBpbiB0aGlzIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1VbmlxdWVEZWNsYXJhdGlvbnMgTnVtYmVyIG9mIHVuaXF1ZSBiYXNlIGRlY2xhcmF0aW9ucyBpbiB0aGlzCisgIC8vLyBjbGF1c2UuCisgIC8vLyBccGFyYW0gTnVtQ29tcG9uZW50TGlzdHMgTnVtYmVyIG9mIGNvbXBvbmVudCBsaXN0cyBpbiB0aGlzIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1Db21wb25lbnRzIFRvdGFsIG51bWJlciBvZiBleHByZXNzaW9uIGNvbXBvbmVudHMgaW4gdGhlIGNsYXVzZS4KKyAgZXhwbGljaXQgT01QVG9DbGF1c2UodW5zaWduZWQgTnVtVmFycywgdW5zaWduZWQgTnVtVW5pcXVlRGVjbGFyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1Db21wb25lbnRMaXN0cywgdW5zaWduZWQgTnVtQ29tcG9uZW50cykKKyAgICAgIDogT01QTWFwcGFibGVFeHByTGlzdENsYXVzZSgKKyAgICAgICAgICAgIE9NUENfdG8sIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICBOdW1WYXJzLCBOdW1VbmlxdWVEZWNsYXJhdGlvbnMsIE51bUNvbXBvbmVudExpc3RzLCBOdW1Db21wb25lbnRzKSB7fQorCisgIC8vLyBEZWZpbmUgdGhlIHNpemVzIG9mIGVhY2ggdHJhaWxpbmcgb2JqZWN0IGFycmF5IGV4Y2VwdCB0aGUgbGFzdCBvbmUuIFRoaXMKKyAgLy8vIGlzIHJlcXVpcmVkIGZvciBUcmFpbGluZ09iamVjdHMgdG8gd29yayBwcm9wZXJseS4KKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPEV4cHIgKj4pIGNvbnN0IHsKKyAgICByZXR1cm4gdmFybGlzdF9zaXplKCk7CisgIH0KKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPFZhbHVlRGVjbCAqPikgY29uc3QgeworICAgIHJldHVybiBnZXRVbmlxdWVEZWNsYXJhdGlvbnNOdW0oKTsKKyAgfQorICBzaXplX3QgbnVtVHJhaWxpbmdPYmplY3RzKE92ZXJsb2FkVG9rZW48dW5zaWduZWQ+KSBjb25zdCB7CisgICAgcmV0dXJuIGdldFVuaXF1ZURlY2xhcmF0aW9uc051bSgpICsgZ2V0VG90YWxDb21wb25lbnRMaXN0TnVtKCk7CisgIH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgY2xhdXNlIHdpdGggYSBsaXN0IG9mIHZhcmlhYmxlcyBcYSBWYXJzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIFZhcnMgVGhlIG9yaWdpbmFsIGV4cHJlc3Npb24gdXNlZCBpbiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIERlY2xhcmF0aW9ucyBEZWNsYXJhdGlvbnMgdXNlZCBpbiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIENvbXBvbmVudExpc3RzIENvbXBvbmVudCBsaXN0cyB1c2VkIGluIHRoZSBjbGF1c2UuCisgIHN0YXRpYyBPTVBUb0NsYXVzZSAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBWYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZURlY2wgKj4gRGVjbGFyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwYWJsZUV4cHJDb21wb25lbnRMaXN0c1JlZiBDb21wb25lbnRMaXN0cyk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGNsYXVzZSB3aXRoIHRoZSBwbGFjZSBmb3IgXGEgTnVtVmFycyB2YXJpYWJsZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gTnVtVmFycyBOdW1iZXIgb2YgZXhwcmVzc2lvbnMgbGlzdGVkIGluIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTnVtVW5pcXVlRGVjbGFyYXRpb25zIE51bWJlciBvZiB1bmlxdWUgYmFzZSBkZWNsYXJhdGlvbnMgaW4gdGhpcworICAvLy8gY2xhdXNlLgorICAvLy8gXHBhcmFtIE51bUNvbXBvbmVudExpc3RzIE51bWJlciBvZiB1bmlxdWUgYmFzZSBkZWNsYXJhdGlvbnMgaW4gdGhpcworICAvLy8gY2xhdXNlLgorICAvLy8gXHBhcmFtIE51bUNvbXBvbmVudHMgVG90YWwgbnVtYmVyIG9mIGV4cHJlc3Npb24gY29tcG9uZW50cyBpbiB0aGUgY2xhdXNlLgorICBzdGF0aWMgT01QVG9DbGF1c2UgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE51bVZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtVW5pcXVlRGVjbGFyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNvbXBvbmVudExpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNvbXBvbmVudHMpOworCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShyZWludGVycHJldF9jYXN0PFN0bXQgKio+KHZhcmxpc3RfYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9lbmQoKSkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfdG87CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzIGNsYXVzZSAnZnJvbScgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nCisvLy8gZGlyZWN0aXZlcy4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgdGFyZ2V0IHVwZGF0ZSBmcm9tKGEsYikKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRhcmdldCB1cGRhdGUnIGhhcyBjbGF1c2UgJ2Zyb20nCisvLy8gd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InLgorY2xhc3MgT01QRnJvbUNsYXVzZSBmaW5hbAorICAgIDogcHVibGljIE9NUE1hcHBhYmxlRXhwckxpc3RDbGF1c2U8T01QRnJvbUNsYXVzZT4sCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czwKKyAgICAgICAgICBPTVBGcm9tQ2xhdXNlLCBFeHByICosIFZhbHVlRGVjbCAqLCB1bnNpZ25lZCwKKyAgICAgICAgICBPTVBDbGF1c2VNYXBwYWJsZUV4cHJDb21tb246Ok1hcHBhYmxlQ29tcG9uZW50PiB7CisgIGZyaWVuZCBjbGFzcyBPTVBDbGF1c2VSZWFkZXI7CisgIGZyaWVuZCBPTVBNYXBwYWJsZUV4cHJMaXN0Q2xhdXNlOworICBmcmllbmQgT01QVmFyTGlzdENsYXVzZTsKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKworICAvLy8gXGJyaWVmIEJ1aWxkIGNsYXVzZSB3aXRoIG51bWJlciBvZiB2YXJpYWJsZXMgXGEgTnVtVmFycy4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTnVtVmFycyBOdW1iZXIgb2YgZXhwcmVzc2lvbnMgbGlzdGVkIGluIHRoaXMgY2xhdXNlLgorICAvLy8gXHBhcmFtIE51bVVuaXF1ZURlY2xhcmF0aW9ucyBOdW1iZXIgb2YgdW5pcXVlIGJhc2UgZGVjbGFyYXRpb25zIGluIHRoaXMKKyAgLy8vIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1Db21wb25lbnRMaXN0cyBOdW1iZXIgb2YgY29tcG9uZW50IGxpc3RzIGluIHRoaXMgY2xhdXNlLgorICAvLy8gXHBhcmFtIE51bUNvbXBvbmVudHMgVG90YWwgbnVtYmVyIG9mIGV4cHJlc3Npb24gY29tcG9uZW50cyBpbiB0aGUgY2xhdXNlLgorICBleHBsaWNpdCBPTVBGcm9tQ2xhdXNlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLCB1bnNpZ25lZCBOdW1WYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVVuaXF1ZURlY2xhcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1Db21wb25lbnRMaXN0cywgdW5zaWduZWQgTnVtQ29tcG9uZW50cykKKyAgICAgIDogT01QTWFwcGFibGVFeHByTGlzdENsYXVzZShPTVBDX2Zyb20sIFN0YXJ0TG9jLCBMUGFyZW5Mb2MsIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1WYXJzLCBOdW1VbmlxdWVEZWNsYXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQ29tcG9uZW50TGlzdHMsIE51bUNvbXBvbmVudHMpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIE51bVZhcnMgTnVtYmVyIG9mIGV4cHJlc3Npb25zIGxpc3RlZCBpbiB0aGlzIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1VbmlxdWVEZWNsYXJhdGlvbnMgTnVtYmVyIG9mIHVuaXF1ZSBiYXNlIGRlY2xhcmF0aW9ucyBpbiB0aGlzCisgIC8vLyBjbGF1c2UuCisgIC8vLyBccGFyYW0gTnVtQ29tcG9uZW50TGlzdHMgTnVtYmVyIG9mIGNvbXBvbmVudCBsaXN0cyBpbiB0aGlzIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1Db21wb25lbnRzIFRvdGFsIG51bWJlciBvZiBleHByZXNzaW9uIGNvbXBvbmVudHMgaW4gdGhlIGNsYXVzZS4KKyAgZXhwbGljaXQgT01QRnJvbUNsYXVzZSh1bnNpZ25lZCBOdW1WYXJzLCB1bnNpZ25lZCBOdW1VbmlxdWVEZWNsYXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ29tcG9uZW50TGlzdHMsIHVuc2lnbmVkIE51bUNvbXBvbmVudHMpCisgICAgICA6IE9NUE1hcHBhYmxlRXhwckxpc3RDbGF1c2UoCisgICAgICAgICAgICBPTVBDX2Zyb20sIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICBOdW1WYXJzLCBOdW1VbmlxdWVEZWNsYXJhdGlvbnMsIE51bUNvbXBvbmVudExpc3RzLCBOdW1Db21wb25lbnRzKSB7fQorCisgIC8vLyBEZWZpbmUgdGhlIHNpemVzIG9mIGVhY2ggdHJhaWxpbmcgb2JqZWN0IGFycmF5IGV4Y2VwdCB0aGUgbGFzdCBvbmUuIFRoaXMKKyAgLy8vIGlzIHJlcXVpcmVkIGZvciBUcmFpbGluZ09iamVjdHMgdG8gd29yayBwcm9wZXJseS4KKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPEV4cHIgKj4pIGNvbnN0IHsKKyAgICByZXR1cm4gdmFybGlzdF9zaXplKCk7CisgIH0KKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPFZhbHVlRGVjbCAqPikgY29uc3QgeworICAgIHJldHVybiBnZXRVbmlxdWVEZWNsYXJhdGlvbnNOdW0oKTsKKyAgfQorICBzaXplX3QgbnVtVHJhaWxpbmdPYmplY3RzKE92ZXJsb2FkVG9rZW48dW5zaWduZWQ+KSBjb25zdCB7CisgICAgcmV0dXJuIGdldFVuaXF1ZURlY2xhcmF0aW9uc051bSgpICsgZ2V0VG90YWxDb21wb25lbnRMaXN0TnVtKCk7CisgIH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgY2xhdXNlIHdpdGggYSBsaXN0IG9mIHZhcmlhYmxlcyBcYSBWYXJzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIFZhcnMgVGhlIG9yaWdpbmFsIGV4cHJlc3Npb24gdXNlZCBpbiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIERlY2xhcmF0aW9ucyBEZWNsYXJhdGlvbnMgdXNlZCBpbiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIENvbXBvbmVudExpc3RzIENvbXBvbmVudCBsaXN0cyB1c2VkIGluIHRoZSBjbGF1c2UuCisgIHN0YXRpYyBPTVBGcm9tQ2xhdXNlICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBWYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlRGVjbCAqPiBEZWNsYXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGFibGVFeHByQ29tcG9uZW50TGlzdHNSZWYgQ29tcG9uZW50TGlzdHMpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBjbGF1c2Ugd2l0aCB0aGUgcGxhY2UgZm9yIFxhIE51bVZhcnMgdmFyaWFibGVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIE51bVZhcnMgTnVtYmVyIG9mIGV4cHJlc3Npb25zIGxpc3RlZCBpbiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIE51bVVuaXF1ZURlY2xhcmF0aW9ucyBOdW1iZXIgb2YgdW5pcXVlIGJhc2UgZGVjbGFyYXRpb25zIGluIHRoaXMKKyAgLy8vIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1Db21wb25lbnRMaXN0cyBOdW1iZXIgb2YgdW5pcXVlIGJhc2UgZGVjbGFyYXRpb25zIGluIHRoaXMKKyAgLy8vIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1Db21wb25lbnRzIFRvdGFsIG51bWJlciBvZiBleHByZXNzaW9uIGNvbXBvbmVudHMgaW4gdGhlIGNsYXVzZS4KKyAgc3RhdGljIE9NUEZyb21DbGF1c2UgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE51bVZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1VbmlxdWVEZWNsYXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1Db21wb25lbnRMaXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNvbXBvbmVudHMpOworCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShyZWludGVycHJldF9jYXN0PFN0bXQgKio+KHZhcmxpc3RfYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9lbmQoKSkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfZnJvbTsKKyAgfQorfTsKKworLy8vIFRoaXMgcmVwcmVzZW50cyBjbGF1c2UgJ3VzZV9kZXZpY2VfcHRyJyBpbiB0aGUgJyNwcmFnbWEgb21wIC4uLicKKy8vLyBkaXJlY3RpdmVzLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCB0YXJnZXQgZGF0YSB1c2VfZGV2aWNlX3B0cihhLGIpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCB0YXJnZXQgZGF0YScgaGFzIGNsYXVzZQorLy8vICd1c2VfZGV2aWNlX3B0cicgd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InLgorY2xhc3MgT01QVXNlRGV2aWNlUHRyQ2xhdXNlIGZpbmFsCisgICAgOiBwdWJsaWMgT01QTWFwcGFibGVFeHByTGlzdENsYXVzZTxPTVBVc2VEZXZpY2VQdHJDbGF1c2U+LAorICAgICAgcHJpdmF0ZSBsbHZtOjpUcmFpbGluZ09iamVjdHM8CisgICAgICAgICAgT01QVXNlRGV2aWNlUHRyQ2xhdXNlLCBFeHByICosIFZhbHVlRGVjbCAqLCB1bnNpZ25lZCwKKyAgICAgICAgICBPTVBDbGF1c2VNYXBwYWJsZUV4cHJDb21tb246Ok1hcHBhYmxlQ29tcG9uZW50PiB7CisgIGZyaWVuZCBjbGFzcyBPTVBDbGF1c2VSZWFkZXI7CisgIGZyaWVuZCBPTVBNYXBwYWJsZUV4cHJMaXN0Q2xhdXNlOworICBmcmllbmQgT01QVmFyTGlzdENsYXVzZTsKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKworICAvLy8gQnVpbGQgY2xhdXNlIHdpdGggbnVtYmVyIG9mIHZhcmlhYmxlcyBcYSBOdW1WYXJzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1WYXJzIE51bWJlciBvZiBleHByZXNzaW9ucyBsaXN0ZWQgaW4gdGhpcyBjbGF1c2UuCisgIC8vLyBccGFyYW0gTnVtVW5pcXVlRGVjbGFyYXRpb25zIE51bWJlciBvZiB1bmlxdWUgYmFzZSBkZWNsYXJhdGlvbnMgaW4gdGhpcworICAvLy8gY2xhdXNlLgorICAvLy8gXHBhcmFtIE51bUNvbXBvbmVudExpc3RzIE51bWJlciBvZiBjb21wb25lbnQgbGlzdHMgaW4gdGhpcyBjbGF1c2UuCisgIC8vLyBccGFyYW0gTnVtQ29tcG9uZW50cyBUb3RhbCBudW1iZXIgb2YgZXhwcmVzc2lvbiBjb21wb25lbnRzIGluIHRoZSBjbGF1c2UuCisgIGV4cGxpY2l0IE9NUFVzZURldmljZVB0ckNsYXVzZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywgdW5zaWduZWQgTnVtVmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVVuaXF1ZURlY2xhcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNvbXBvbmVudExpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ29tcG9uZW50cykKKyAgICAgIDogT01QTWFwcGFibGVFeHByTGlzdENsYXVzZShPTVBDX3VzZV9kZXZpY2VfcHRyLCBTdGFydExvYywgTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZExvYywgTnVtVmFycywgTnVtVW5pcXVlRGVjbGFyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUNvbXBvbmVudExpc3RzLCBOdW1Db21wb25lbnRzKSB7fQorCisgIC8vLyBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIE51bVZhcnMgTnVtYmVyIG9mIGV4cHJlc3Npb25zIGxpc3RlZCBpbiB0aGlzIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1VbmlxdWVEZWNsYXJhdGlvbnMgTnVtYmVyIG9mIHVuaXF1ZSBiYXNlIGRlY2xhcmF0aW9ucyBpbiB0aGlzCisgIC8vLyBjbGF1c2UuCisgIC8vLyBccGFyYW0gTnVtQ29tcG9uZW50TGlzdHMgTnVtYmVyIG9mIGNvbXBvbmVudCBsaXN0cyBpbiB0aGlzIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1Db21wb25lbnRzIFRvdGFsIG51bWJlciBvZiBleHByZXNzaW9uIGNvbXBvbmVudHMgaW4gdGhlIGNsYXVzZS4KKyAgZXhwbGljaXQgT01QVXNlRGV2aWNlUHRyQ2xhdXNlKHVuc2lnbmVkIE51bVZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1VbmlxdWVEZWNsYXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1Db21wb25lbnRMaXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNvbXBvbmVudHMpCisgICAgICA6IE9NUE1hcHBhYmxlRXhwckxpc3RDbGF1c2UoT01QQ191c2VfZGV2aWNlX3B0ciwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCBOdW1WYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVVuaXF1ZURlY2xhcmF0aW9ucywgTnVtQ29tcG9uZW50TGlzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQ29tcG9uZW50cykge30KKworICAvLy8gRGVmaW5lIHRoZSBzaXplcyBvZiBlYWNoIHRyYWlsaW5nIG9iamVjdCBhcnJheSBleGNlcHQgdGhlIGxhc3Qgb25lLiBUaGlzCisgIC8vLyBpcyByZXF1aXJlZCBmb3IgVHJhaWxpbmdPYmplY3RzIHRvIHdvcmsgcHJvcGVybHkuCisgIHNpemVfdCBudW1UcmFpbGluZ09iamVjdHMoT3ZlcmxvYWRUb2tlbjxFeHByICo+KSBjb25zdCB7CisgICAgcmV0dXJuIDMgKiB2YXJsaXN0X3NpemUoKTsKKyAgfQorICBzaXplX3QgbnVtVHJhaWxpbmdPYmplY3RzKE92ZXJsb2FkVG9rZW48VmFsdWVEZWNsICo+KSBjb25zdCB7CisgICAgcmV0dXJuIGdldFVuaXF1ZURlY2xhcmF0aW9uc051bSgpOworICB9CisgIHNpemVfdCBudW1UcmFpbGluZ09iamVjdHMoT3ZlcmxvYWRUb2tlbjx1bnNpZ25lZD4pIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VW5pcXVlRGVjbGFyYXRpb25zTnVtKCkgKyBnZXRUb3RhbENvbXBvbmVudExpc3ROdW0oKTsKKyAgfQorCisgIC8vLyBTZXRzIHRoZSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gcHJpdmF0ZSBjb3BpZXMgd2l0aCBpbml0aWFsaXplcnMgZm9yIG5ldworICAvLy8gcHJpdmF0ZSB2YXJpYWJsZXMuCisgIC8vLyBccGFyYW0gVkwgTGlzdCBvZiByZWZlcmVuY2VzLgorICB2b2lkIHNldFByaXZhdGVDb3BpZXMoQXJyYXlSZWY8RXhwciAqPiBWTCk7CisKKyAgLy8vIEdldHMgdGhlIGxpc3Qgb2YgcmVmZXJlbmNlcyB0byBwcml2YXRlIGNvcGllcyB3aXRoIGluaXRpYWxpemVycyBmb3IgbmV3CisgIC8vLyBwcml2YXRlIHZhcmlhYmxlcy4KKyAgTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4gZ2V0UHJpdmF0ZUNvcGllcygpIHsKKyAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4odmFybGlzdF9lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisgIEFycmF5UmVmPGNvbnN0IEV4cHIgKj4gZ2V0UHJpdmF0ZUNvcGllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKHZhcmxpc3RfZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorCisgIC8vLyBTZXRzIHRoZSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gaW5pdGlhbGl6ZXIgdmFyaWFibGVzIGZvciBuZXcgcHJpdmF0ZQorICAvLy8gdmFyaWFibGVzLgorICAvLy8gXHBhcmFtIFZMIExpc3Qgb2YgcmVmZXJlbmNlcy4KKyAgdm9pZCBzZXRJbml0cyhBcnJheVJlZjxFeHByICo+IFZMKTsKKworICAvLy8gR2V0cyB0aGUgbGlzdCBvZiByZWZlcmVuY2VzIHRvIGluaXRpYWxpemVyIHZhcmlhYmxlcyBmb3IgbmV3IHByaXZhdGUKKyAgLy8vIHZhcmlhYmxlcy4KKyAgTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4gZ2V0SW5pdHMoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxFeHByICo+KGdldFByaXZhdGVDb3BpZXMoKS5lbmQoKSwgdmFybGlzdF9zaXplKCkpOworICB9CisgIEFycmF5UmVmPGNvbnN0IEV4cHIgKj4gZ2V0SW5pdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZihnZXRQcml2YXRlQ29waWVzKCkuZW5kKCksIHZhcmxpc3Rfc2l6ZSgpKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBDcmVhdGVzIGNsYXVzZSB3aXRoIGEgbGlzdCBvZiB2YXJpYWJsZXMgXGEgVmFycy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBWYXJzIFRoZSBvcmlnaW5hbCBleHByZXNzaW9uIHVzZWQgaW4gdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBQcml2YXRlVmFycyBFeHByZXNzaW9ucyByZWZlcnJpbmcgdG8gcHJpdmF0ZSBjb3BpZXMuCisgIC8vLyBccGFyYW0gSW5pdHMgRXhwcmVzc2lvbnMgcmVmZXJyaW5nIHRvIHByaXZhdGUgY29weSBpbml0aWFsaXplcnMuCisgIC8vLyBccGFyYW0gRGVjbGFyYXRpb25zIERlY2xhcmF0aW9ucyB1c2VkIGluIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gQ29tcG9uZW50TGlzdHMgQ29tcG9uZW50IGxpc3RzIHVzZWQgaW4gdGhlIGNsYXVzZS4KKyAgc3RhdGljIE9NUFVzZURldmljZVB0ckNsYXVzZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLCBBcnJheVJlZjxFeHByICo+IFZhcnMsCisgICAgICAgICBBcnJheVJlZjxFeHByICo+IFByaXZhdGVWYXJzLCBBcnJheVJlZjxFeHByICo+IEluaXRzLAorICAgICAgICAgQXJyYXlSZWY8VmFsdWVEZWNsICo+IERlY2xhcmF0aW9ucywKKyAgICAgICAgIE1hcHBhYmxlRXhwckNvbXBvbmVudExpc3RzUmVmIENvbXBvbmVudExpc3RzKTsKKworICAvLy8gQ3JlYXRlcyBhbiBlbXB0eSBjbGF1c2Ugd2l0aCB0aGUgcGxhY2UgZm9yIFxhIE51bVZhcnMgdmFyaWFibGVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIE51bVZhcnMgTnVtYmVyIG9mIGV4cHJlc3Npb25zIGxpc3RlZCBpbiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIE51bVVuaXF1ZURlY2xhcmF0aW9ucyBOdW1iZXIgb2YgdW5pcXVlIGJhc2UgZGVjbGFyYXRpb25zIGluIHRoaXMKKyAgLy8vIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1Db21wb25lbnRMaXN0cyBOdW1iZXIgb2YgdW5pcXVlIGJhc2UgZGVjbGFyYXRpb25zIGluIHRoaXMKKyAgLy8vIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1Db21wb25lbnRzIFRvdGFsIG51bWJlciBvZiBleHByZXNzaW9uIGNvbXBvbmVudHMgaW4gdGhlIGNsYXVzZS4KKyAgc3RhdGljIE9NUFVzZURldmljZVB0ckNsYXVzZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtVmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtVW5pcXVlRGVjbGFyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1Db21wb25lbnRMaXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ29tcG9uZW50cyk7CisKKyAgdXNpbmcgcHJpdmF0ZV9jb3BpZXNfaXRlcmF0b3IgPSBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIHByaXZhdGVfY29waWVzX2NvbnN0X2l0ZXJhdG9yID0gQXJyYXlSZWY8Y29uc3QgRXhwciAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIHByaXZhdGVfY29waWVzX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8cHJpdmF0ZV9jb3BpZXNfaXRlcmF0b3I+OworICB1c2luZyBwcml2YXRlX2NvcGllc19jb25zdF9yYW5nZSA9CisgICAgICBsbHZtOjppdGVyYXRvcl9yYW5nZTxwcml2YXRlX2NvcGllc19jb25zdF9pdGVyYXRvcj47CisKKyAgcHJpdmF0ZV9jb3BpZXNfcmFuZ2UgcHJpdmF0ZV9jb3BpZXMoKSB7CisgICAgcmV0dXJuIHByaXZhdGVfY29waWVzX3JhbmdlKGdldFByaXZhdGVDb3BpZXMoKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcml2YXRlQ29waWVzKCkuZW5kKCkpOworICB9CisKKyAgcHJpdmF0ZV9jb3BpZXNfY29uc3RfcmFuZ2UgcHJpdmF0ZV9jb3BpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHByaXZhdGVfY29waWVzX2NvbnN0X3JhbmdlKGdldFByaXZhdGVDb3BpZXMoKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcml2YXRlQ29waWVzKCkuZW5kKCkpOworICB9CisKKyAgdXNpbmcgaW5pdHNfaXRlcmF0b3IgPSBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIGluaXRzX2NvbnN0X2l0ZXJhdG9yID0gQXJyYXlSZWY8Y29uc3QgRXhwciAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIGluaXRzX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8aW5pdHNfaXRlcmF0b3I+OworICB1c2luZyBpbml0c19jb25zdF9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGluaXRzX2NvbnN0X2l0ZXJhdG9yPjsKKworICBpbml0c19yYW5nZSBpbml0cygpIHsKKyAgICByZXR1cm4gaW5pdHNfcmFuZ2UoZ2V0SW5pdHMoKS5iZWdpbigpLCBnZXRJbml0cygpLmVuZCgpKTsKKyAgfQorCisgIGluaXRzX2NvbnN0X3JhbmdlIGluaXRzKCkgY29uc3QgeworICAgIHJldHVybiBpbml0c19jb25zdF9yYW5nZShnZXRJbml0cygpLmJlZ2luKCksIGdldEluaXRzKCkuZW5kKCkpOworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9iZWdpbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2VuZCgpKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgeworICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ191c2VfZGV2aWNlX3B0cjsKKyAgfQorfTsKKworLy8vIFRoaXMgcmVwcmVzZW50cyBjbGF1c2UgJ2lzX2RldmljZV9wdHInIGluIHRoZSAnI3ByYWdtYSBvbXAgLi4uJworLy8vIGRpcmVjdGl2ZXMuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHRhcmdldCBpc19kZXZpY2VfcHRyKGEsYikKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRhcmdldCcgaGFzIGNsYXVzZQorLy8vICdpc19kZXZpY2VfcHRyJyB3aXRoIHRoZSB2YXJpYWJsZXMgJ2EnIGFuZCAnYicuCitjbGFzcyBPTVBJc0RldmljZVB0ckNsYXVzZSBmaW5hbAorICAgIDogcHVibGljIE9NUE1hcHBhYmxlRXhwckxpc3RDbGF1c2U8T01QSXNEZXZpY2VQdHJDbGF1c2U+LAorICAgICAgcHJpdmF0ZSBsbHZtOjpUcmFpbGluZ09iamVjdHM8CisgICAgICAgICAgT01QSXNEZXZpY2VQdHJDbGF1c2UsIEV4cHIgKiwgVmFsdWVEZWNsICosIHVuc2lnbmVkLAorICAgICAgICAgIE9NUENsYXVzZU1hcHBhYmxlRXhwckNvbW1vbjo6TWFwcGFibGVDb21wb25lbnQ+IHsKKyAgZnJpZW5kIGNsYXNzIE9NUENsYXVzZVJlYWRlcjsKKyAgZnJpZW5kIE9NUE1hcHBhYmxlRXhwckxpc3RDbGF1c2U7CisgIGZyaWVuZCBPTVBWYXJMaXN0Q2xhdXNlOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIC8vLyBCdWlsZCBjbGF1c2Ugd2l0aCBudW1iZXIgb2YgdmFyaWFibGVzIFxhIE51bVZhcnMuCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIE51bVZhcnMgTnVtYmVyIG9mIGV4cHJlc3Npb25zIGxpc3RlZCBpbiB0aGlzIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1VbmlxdWVEZWNsYXJhdGlvbnMgTnVtYmVyIG9mIHVuaXF1ZSBiYXNlIGRlY2xhcmF0aW9ucyBpbiB0aGlzCisgIC8vLyBjbGF1c2UuCisgIC8vLyBccGFyYW0gTnVtQ29tcG9uZW50TGlzdHMgTnVtYmVyIG9mIGNvbXBvbmVudCBsaXN0cyBpbiB0aGlzIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1Db21wb25lbnRzIFRvdGFsIG51bWJlciBvZiBleHByZXNzaW9uIGNvbXBvbmVudHMgaW4gdGhlIGNsYXVzZS4KKyAgZXhwbGljaXQgT01QSXNEZXZpY2VQdHJDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1WYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1VbmlxdWVEZWNsYXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNvbXBvbmVudExpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1Db21wb25lbnRzKQorICAgICAgOiBPTVBNYXBwYWJsZUV4cHJMaXN0Q2xhdXNlKE9NUENfaXNfZGV2aWNlX3B0ciwgU3RhcnRMb2MsIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRMb2MsIE51bVZhcnMsIE51bVVuaXF1ZURlY2xhcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1Db21wb25lbnRMaXN0cywgTnVtQ29tcG9uZW50cykge30KKworICAvLy8gQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOdW1WYXJzIE51bWJlciBvZiBleHByZXNzaW9ucyBsaXN0ZWQgaW4gdGhpcyBjbGF1c2UuCisgIC8vLyBccGFyYW0gTnVtVW5pcXVlRGVjbGFyYXRpb25zIE51bWJlciBvZiB1bmlxdWUgYmFzZSBkZWNsYXJhdGlvbnMgaW4gdGhpcworICAvLy8gY2xhdXNlLgorICAvLy8gXHBhcmFtIE51bUNvbXBvbmVudExpc3RzIE51bWJlciBvZiBjb21wb25lbnQgbGlzdHMgaW4gdGhpcyBjbGF1c2UuCisgIC8vLyBccGFyYW0gTnVtQ29tcG9uZW50cyBUb3RhbCBudW1iZXIgb2YgZXhwcmVzc2lvbiBjb21wb25lbnRzIGluIHRoZSBjbGF1c2UuCisgIGV4cGxpY2l0IE9NUElzRGV2aWNlUHRyQ2xhdXNlKHVuc2lnbmVkIE51bVZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVVuaXF1ZURlY2xhcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ29tcG9uZW50TGlzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNvbXBvbmVudHMpCisgICAgICA6IE9NUE1hcHBhYmxlRXhwckxpc3RDbGF1c2UoT01QQ19pc19kZXZpY2VfcHRyLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIE51bVZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtVW5pcXVlRGVjbGFyYXRpb25zLCBOdW1Db21wb25lbnRMaXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1Db21wb25lbnRzKSB7fQorCisgIC8vLyBEZWZpbmUgdGhlIHNpemVzIG9mIGVhY2ggdHJhaWxpbmcgb2JqZWN0IGFycmF5IGV4Y2VwdCB0aGUgbGFzdCBvbmUuIFRoaXMKKyAgLy8vIGlzIHJlcXVpcmVkIGZvciBUcmFpbGluZ09iamVjdHMgdG8gd29yayBwcm9wZXJseS4KKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPEV4cHIgKj4pIGNvbnN0IHsKKyAgICByZXR1cm4gdmFybGlzdF9zaXplKCk7CisgIH0KKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPFZhbHVlRGVjbCAqPikgY29uc3QgeworICAgIHJldHVybiBnZXRVbmlxdWVEZWNsYXJhdGlvbnNOdW0oKTsKKyAgfQorICBzaXplX3QgbnVtVHJhaWxpbmdPYmplY3RzKE92ZXJsb2FkVG9rZW48dW5zaWduZWQ+KSBjb25zdCB7CisgICAgcmV0dXJuIGdldFVuaXF1ZURlY2xhcmF0aW9uc051bSgpICsgZ2V0VG90YWxDb21wb25lbnRMaXN0TnVtKCk7CisgIH0KKworcHVibGljOgorICAvLy8gQ3JlYXRlcyBjbGF1c2Ugd2l0aCBhIGxpc3Qgb2YgdmFyaWFibGVzIFxhIFZhcnMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gVmFycyBUaGUgb3JpZ2luYWwgZXhwcmVzc2lvbiB1c2VkIGluIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gRGVjbGFyYXRpb25zIERlY2xhcmF0aW9ucyB1c2VkIGluIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gQ29tcG9uZW50TGlzdHMgQ29tcG9uZW50IGxpc3RzIHVzZWQgaW4gdGhlIGNsYXVzZS4KKyAgc3RhdGljIE9NUElzRGV2aWNlUHRyQ2xhdXNlICoKKyAgQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsIEFycmF5UmVmPEV4cHIgKj4gVmFycywKKyAgICAgICAgIEFycmF5UmVmPFZhbHVlRGVjbCAqPiBEZWNsYXJhdGlvbnMsCisgICAgICAgICBNYXBwYWJsZUV4cHJDb21wb25lbnRMaXN0c1JlZiBDb21wb25lbnRMaXN0cyk7CisKKyAgLy8vIENyZWF0ZXMgYW4gZW1wdHkgY2xhdXNlIHdpdGggdGhlIHBsYWNlIGZvciBcYSBOdW1WYXJzIHZhcmlhYmxlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBOdW1WYXJzIE51bWJlciBvZiBleHByZXNzaW9ucyBsaXN0ZWQgaW4gdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1VbmlxdWVEZWNsYXJhdGlvbnMgTnVtYmVyIG9mIHVuaXF1ZSBiYXNlIGRlY2xhcmF0aW9ucyBpbiB0aGlzCisgIC8vLyBjbGF1c2UuCisgIC8vLyBccGFyYW0gTnVtQ29tcG9uZW50TGlzdHMgTnVtYmVyIG9mIHVuaXF1ZSBiYXNlIGRlY2xhcmF0aW9ucyBpbiB0aGlzCisgIC8vLyBjbGF1c2UuCisgIC8vLyBccGFyYW0gTnVtQ29tcG9uZW50cyBUb3RhbCBudW1iZXIgb2YgZXhwcmVzc2lvbiBjb21wb25lbnRzIGluIHRoZSBjbGF1c2UuCisgIHN0YXRpYyBPTVBJc0RldmljZVB0ckNsYXVzZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1WYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVVuaXF1ZURlY2xhcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1Db21wb25lbnRMaXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1Db21wb25lbnRzKTsKKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UocmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2JlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFN0bXQgKio+KHZhcmxpc3RfZW5kKCkpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldENsYXVzZUtpbmQoKSA9PSBPTVBDX2lzX2RldmljZV9wdHI7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9PUEVOTVBDTEFVU0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL09wZXJhdGlvbktpbmRzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9PcGVyYXRpb25LaW5kcy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzY2YzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9PcGVyYXRpb25LaW5kcy5kZWYKQEAgLTAsMCArMSw0MTUgQEAKKy8vPT09LS0tIE9wZXJhdGlvbktpbmRzLmRlZiAtIE9wZXJhdGlvbnMgRGF0YWJhc2UgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGVudW1lcmF0ZXMgdGhlIGRpZmZlcmVudCBraW5kcyBvZiBvcGVyYXRpb25zIHRoYXQgY2FuIGJlCisvLyBwZXJmb3JtZWQgYnkgdmFyaW91cyBleHByZXNzaW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBAZmlsZSBPcGVyYXRpb25LaW5kcy5kZWYKKy8vLworLy8vIEluIHRoaXMgZmlsZSwgZWFjaCBvZiB0aGUgQy9DKysgb3BlcmF0aW9ucyBpcyBlbnVtZXJhdGVkIENBU1RfT1BFUkFUSU9OLAorLy8vIEJJTkFSWV9PUEVSQVRJT04gb3IgVU5BUllfT1BFUkFUSU9OIG1hY3JvLCBlYWNoIG9mIHdoaWNoIGNhbiBiZSBzcGVjaWZpZWQgYnkKKy8vLyB0aGUgY29kZSBpbmNsdWRpbmcgdGhpcyBmaWxlLgorLy8vCisvLy8gTWFjcm9zIGhhZCBvbmUgb3IgdHdvIGFyZ3VtZW50czoKKy8vLworLy8vIE5hbWU6IFRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24uIE5hbWUgKHByZWZpeGVkIHdpdGggQ0tfLCBVT18gb3IgQk9fKSB3aWxsCisvLy8gYmUgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZW51bWVyYXRvciAoc2VlIE9wZXJhdGlvbnNLaW5kcy5oKS4KKy8vLworLy8vIFNwZWxsaW5nOiBBIHN0cmluZyB0aGF0IHByb3ZpZGVzIGEgY2Fub25pY2FsIHNwZWxsaW5nIGZvciB0aGUgb3BlcmF0aW9uLgorCisjaWZuZGVmIENBU1RfT1BFUkFUSU9OCisjICBkZWZpbmUgQ0FTVF9PUEVSQVRJT04oTmFtZSkKKyNlbmRpZgorCisjaWZuZGVmIEJJTkFSWV9PUEVSQVRJT04KKyMgIGRlZmluZSBCSU5BUllfT1BFUkFUSU9OKE5hbWUsIFNwZWxsaW5nKQorI2VuZGlmCisKKyNpZm5kZWYgVU5BUllfT1BFUkFUSU9OCisjICBkZWZpbmUgVU5BUllfT1BFUkFUSU9OKE5hbWUsIFNwZWxsaW5nKQorI2VuZGlmCisKKy8vPT09LSBDYXN0IE9wZXJhdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBDS19EZXBlbmRlbnQgLSBBIGNvbnZlcnNpb24gd2hpY2ggY2Fubm90IHlldCBiZSBhbmFseXplZCBiZWNhdXNlCisvLy8gZWl0aGVyIHRoZSBleHByZXNzaW9uIG9yIHRhcmdldCB0eXBlIGlzIGRlcGVuZGVudC4gIFRoZXNlIGFyZQorLy8vIGNyZWF0ZWQgb25seSBmb3IgZXhwbGljaXQgY2FzdHM7IGRlcGVuZGVudCBBU1RzIGFyZW4ndCByZXF1aXJlZAorLy8vIHRvIGV2ZW4gYXBwcm94aW1hdGVseSB0eXBlLWNoZWNrLgorLy8vICAgKFQqKSBtYWxsb2Moc2l6ZW9mKFQpKQorLy8vICAgcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oQTxUPjo6YWxsb2MoKSk7CitDQVNUX09QRVJBVElPTihEZXBlbmRlbnQpCisKKy8vLyBDS19CaXRDYXN0IC0gQSBjb252ZXJzaW9uIHdoaWNoIGNhdXNlcyBhIGJpdCBwYXR0ZXJuIG9mIG9uZSB0eXBlCisvLy8gdG8gYmUgcmVpbnRlcnByZXRlZCBhcyBhIGJpdCBwYXR0ZXJuIG9mIGFub3RoZXIgdHlwZS4gIEdlbmVyYWxseQorLy8vIHRoZSBvcGVyYW5kcyBtdXN0IGhhdmUgZXF1aXZhbGVudCBzaXplIGFuZCB1bnJlbGF0ZWQgdHlwZXMuCisvLy8KKy8vLyBUaGUgcG9pbnRlciBjb252ZXJzaW9uIGNoYXIqIC0+IGludCogaXMgYSBiaXRjYXN0LiAgQSBjb252ZXJzaW9uCisvLy8gZnJvbSBhbnkgcG9pbnRlciB0eXBlIHRvIGEgQyBwb2ludGVyIHR5cGUgaXMgYSBiaXRjYXN0IHVubGVzcworLy8vIGl0J3MgYWN0dWFsbHkgQmFzZVRvRGVyaXZlZCBvciBEZXJpdmVkVG9CYXNlLiAgQSBjb252ZXJzaW9uIHRvIGEKKy8vLyBibG9jayBwb2ludGVyIG9yIE9iakMgcG9pbnRlciB0eXBlIGlzIGEgYml0Y2FzdCBvbmx5IGlmIHRoZQorLy8vIG9wZXJhbmQgaGFzIHRoZSBzYW1lIHR5cGUga2luZDsgb3RoZXJ3aXNlLCBpdCdzIG9uZSBvZiB0aGUKKy8vLyBzcGVjaWFsaXplZCBjYXN0cyBiZWxvdy4KKy8vLworLy8vIFZlY3RvciBjb2VyY2lvbnMgYXJlIGJpdGNhc3RzLgorQ0FTVF9PUEVSQVRJT04oQml0Q2FzdCkKKworLy8vIENLX0xWYWx1ZUJpdENhc3QgLSBBIGNvbnZlcnNpb24gd2hpY2ggcmVpbnRlcnByZXRzIHRoZSBhZGRyZXNzIG9mCisvLy8gYW4gbC12YWx1ZSBhcyBhbiBsLXZhbHVlIG9mIGEgZGlmZmVyZW50IGtpbmQuICBVc2VkIGZvcgorLy8vIHJlaW50ZXJwcmV0X2Nhc3RzIG9mIGwtdmFsdWUgZXhwcmVzc2lvbnMgdG8gcmVmZXJlbmNlIHR5cGVzLgorLy8vICAgIGJvb2wgYjsgcmVpbnRlcnByZXRfY2FzdDxjaGFyJj4oYikgPSAnYSc7CitDQVNUX09QRVJBVElPTihMVmFsdWVCaXRDYXN0KQorCisvLy8gQ0tfTFZhbHVlVG9SVmFsdWUgLSBBIGNvbnZlcnNpb24gd2hpY2ggY2F1c2VzIHRoZSBleHRyYWN0aW9uIG9mCisvLy8gYW4gci12YWx1ZSBmcm9tIHRoZSBvcGVyYW5kIGdsLXZhbHVlLiAgVGhlIHJlc3VsdCBvZiBhbiByLXZhbHVlCisvLy8gY29udmVyc2lvbiBpcyBhbHdheXMgdW5xdWFsaWZpZWQuCitDQVNUX09QRVJBVElPTihMVmFsdWVUb1JWYWx1ZSkKKworLy8vIENLX05vT3AgLSBBIGNvbnZlcnNpb24gd2hpY2ggZG9lcyBub3QgYWZmZWN0IHRoZSB0eXBlIG90aGVyIHRoYW4KKy8vLyAocG9zc2libHkpIGFkZGluZyBxdWFsaWZpZXJzLgorLy8vICAgaW50ICAgIC0+IGludAorLy8vICAgY2hhcioqIC0+IGNvbnN0IGNoYXIgKiBjb25zdCAqCitDQVNUX09QRVJBVElPTihOb09wKQorCisvLy8gQ0tfQmFzZVRvRGVyaXZlZCAtIEEgY29udmVyc2lvbiBmcm9tIGEgQysrIGNsYXNzIHBvaW50ZXIvcmVmZXJlbmNlCisvLy8gdG8gYSBkZXJpdmVkIGNsYXNzIHBvaW50ZXIvcmVmZXJlbmNlLgorLy8vICAgQiAqYiA9IHN0YXRpY19jYXN0PEIqPihhKTsKK0NBU1RfT1BFUkFUSU9OKEJhc2VUb0Rlcml2ZWQpCisKKy8vLyBDS19EZXJpdmVkVG9CYXNlIC0gQSBjb252ZXJzaW9uIGZyb20gYSBDKysgY2xhc3MgcG9pbnRlcgorLy8vIHRvIGEgYmFzZSBjbGFzcyBwb2ludGVyLgorLy8vICAgQSAqYSA9IG5ldyBCKCk7CitDQVNUX09QRVJBVElPTihEZXJpdmVkVG9CYXNlKQorCisvLy8gQ0tfVW5jaGVja2VkRGVyaXZlZFRvQmFzZSAtIEEgY29udmVyc2lvbiBmcm9tIGEgQysrIGNsYXNzCisvLy8gcG9pbnRlci9yZWZlcmVuY2UgdG8gYSBiYXNlIGNsYXNzIHRoYXQgY2FuIGFzc3VtZSB0aGF0IHRoZQorLy8vIGRlcml2ZWQgcG9pbnRlciBpcyBub3QgbnVsbC4KKy8vLyAgIGNvbnN0IEEgJmEgPSBCKCk7CisvLy8gICBiLT5tZXRob2RfZnJvbV9hKCk7CitDQVNUX09QRVJBVElPTihVbmNoZWNrZWREZXJpdmVkVG9CYXNlKQorCisvLy8gQ0tfRHluYW1pYyAtIEEgQysrIGR5bmFtaWNfY2FzdC4KK0NBU1RfT1BFUkFUSU9OKER5bmFtaWMpCisKKy8vLyBDS19Ub1VuaW9uIC0gVGhlIEdDQyBjYXN0LXRvLXVuaW9uIGV4dGVuc2lvbi4KKy8vLyAgIGludCAgIC0+IHVuaW9uIHsgaW50IHg7IGZsb2F0IHk7IH0KKy8vLyAgIGZsb2F0IC0+IHVuaW9uIHsgaW50IHg7IGZsb2F0IHk7IH0KK0NBU1RfT1BFUkFUSU9OKFRvVW5pb24pCisKKy8vLyBDS19BcnJheVRvUG9pbnRlckRlY2F5IC0gQXJyYXkgdG8gcG9pbnRlciBkZWNheS4KKy8vLyAgIGludFsxMF0gLT4gaW50KgorLy8vICAgY2hhcls1XVs2XSAtPiBjaGFyKCopWzZdCitDQVNUX09QRVJBVElPTihBcnJheVRvUG9pbnRlckRlY2F5KQorCisvLy8gQ0tfRnVuY3Rpb25Ub1BvaW50ZXJEZWNheSAtIEZ1bmN0aW9uIHRvIHBvaW50ZXIgZGVjYXkuCisvLy8gICB2b2lkKGludCkgLT4gdm9pZCgqKShpbnQpCitDQVNUX09QRVJBVElPTihGdW5jdGlvblRvUG9pbnRlckRlY2F5KQorCisvLy8gQ0tfTnVsbFRvUG9pbnRlciAtIE51bGwgcG9pbnRlciBjb25zdGFudCB0byBwb2ludGVyLCBPYmpDCisvLy8gcG9pbnRlciwgb3IgYmxvY2sgcG9pbnRlci4KKy8vLyAgICh2b2lkKikgMAorLy8vICAgdm9pZCAoXmJsb2NrKSgpID0gMDsKK0NBU1RfT1BFUkFUSU9OKE51bGxUb1BvaW50ZXIpCisKKy8vLyBDS19OdWxsVG9NZW1iZXJQb2ludGVyIC0gTnVsbCBwb2ludGVyIGNvbnN0YW50IHRvIG1lbWJlciBwb2ludGVyLgorLy8vICAgaW50IEE6OiptcHRyID0gMDsKKy8vLyAgIGludCAoQTo6KmZwdHIpKGludCkgPSBudWxscHRyOworQ0FTVF9PUEVSQVRJT04oTnVsbFRvTWVtYmVyUG9pbnRlcikKKworLy8vIENLX0Jhc2VUb0Rlcml2ZWRNZW1iZXJQb2ludGVyIC0gTWVtYmVyIHBvaW50ZXIgaW4gYmFzZSBjbGFzcyB0bworLy8vIG1lbWJlciBwb2ludGVyIGluIGRlcml2ZWQgY2xhc3MuCisvLy8gICBpbnQgQjo6Km1wdHIgPSAmQTo6bWVtYmVyOworQ0FTVF9PUEVSQVRJT04oQmFzZVRvRGVyaXZlZE1lbWJlclBvaW50ZXIpCisKKy8vLyBDS19EZXJpdmVkVG9CYXNlTWVtYmVyUG9pbnRlciAtIE1lbWJlciBwb2ludGVyIGluIGRlcml2ZWQgY2xhc3MgdG8KKy8vLyBtZW1iZXIgcG9pbnRlciBpbiBiYXNlIGNsYXNzLgorLy8vICAgaW50IEE6OiptcHRyID0gc3RhdGljX2Nhc3Q8aW50IEE6Oio+KCZCOjptZW1iZXIpOworQ0FTVF9PUEVSQVRJT04oRGVyaXZlZFRvQmFzZU1lbWJlclBvaW50ZXIpCisKKy8vLyBDS19NZW1iZXJQb2ludGVyVG9Cb29sZWFuIC0gTWVtYmVyIHBvaW50ZXIgdG8gYm9vbGVhbi4gIEEgY2hlY2sKKy8vLyBhZ2FpbnN0IHRoZSBudWxsIG1lbWJlciBwb2ludGVyLgorQ0FTVF9PUEVSQVRJT04oTWVtYmVyUG9pbnRlclRvQm9vbGVhbikKKworLy8vIENLX1JlaW50ZXJwcmV0TWVtYmVyUG9pbnRlciAtIFJlaW50ZXJwcmV0IGEgbWVtYmVyIHBvaW50ZXIgYXMgYQorLy8vIGRpZmZlcmVudCBraW5kIG9mIG1lbWJlciBwb2ludGVyLiAgQysrIGZvcmJpZHMgdGhpcyBmcm9tCisvLy8gY3Jvc3NpbmcgYmV0d2VlbiBmdW5jdGlvbiBhbmQgb2JqZWN0IHR5cGVzLCBidXQgb3RoZXJ3aXNlIGRvZXMKKy8vLyBub3QgcmVzdHJpY3QgaXQuICBIb3dldmVyLCB0aGUgb25seSBvcGVyYXRpb24gdGhhdCBpcyBwZXJtaXR0ZWQKKy8vLyBvbiBhICJwdW5uZWQiIG1lbWJlciBwb2ludGVyIGlzIGNhc3RpbmcgaXQgYmFjayB0byB0aGUgb3JpZ2luYWwKKy8vLyB0eXBlLCB3aGljaCBpcyByZXF1aXJlZCB0byBiZSBhIGxvc3NsZXNzIG9wZXJhdGlvbiAoYWx0aG91Z2gKKy8vLyBtYW55IEFCSXMgZG8gbm90IGd1YXJhbnRlZSB0aGlzIG9uIGFsbCBwb3NzaWJsZSBpbnRlcm1lZGlhdGUgdHlwZXMpLgorQ0FTVF9PUEVSQVRJT04oUmVpbnRlcnByZXRNZW1iZXJQb2ludGVyKQorCisvLy8gQ0tfVXNlckRlZmluZWRDb252ZXJzaW9uIC0gQ29udmVyc2lvbiB1c2luZyBhIHVzZXIgZGVmaW5lZCB0eXBlCisvLy8gY29udmVyc2lvbiBmdW5jdGlvbi4KKy8vLyAgICBzdHJ1Y3QgQSB7IG9wZXJhdG9yIGludCgpOyB9OyBpbnQgaSA9IGludChBKCkpOworQ0FTVF9PUEVSQVRJT04oVXNlckRlZmluZWRDb252ZXJzaW9uKQorCisvLy8gQ0tfQ29uc3RydWN0b3JDb252ZXJzaW9uIC0gQ29udmVyc2lvbiBieSBjb25zdHJ1Y3Rvci4KKy8vLyAgICBzdHJ1Y3QgQSB7IEEoaW50KTsgfTsgQSBhID0gQSgxMCk7CitDQVNUX09QRVJBVElPTihDb25zdHJ1Y3RvckNvbnZlcnNpb24pCisKKy8vLyBDS19JbnRlZ3JhbFRvUG9pbnRlciAtIEludGVncmFsIHRvIHBvaW50ZXIuICBBIHNwZWNpYWwga2luZCBvZgorLy8vIHJlaW50ZXJwcmV0aW5nIGNvbnZlcnNpb24uICBBcHBsaWVzIHRvIG5vcm1hbCwgT2JqQywgYW5kIGJsb2NrCisvLy8gcG9pbnRlcnMuCisvLy8gICAgKGNoYXIqKSAweDEwMDFhYWIwCisvLy8gICAgcmVpbnRlcnByZXRfY2FzdDxpbnQqPigwKQorQ0FTVF9PUEVSQVRJT04oSW50ZWdyYWxUb1BvaW50ZXIpCisKKy8vLyBDS19Qb2ludGVyVG9JbnRlZ3JhbCAtIFBvaW50ZXIgdG8gaW50ZWdyYWwuICBBIHNwZWNpYWwga2luZCBvZgorLy8vIHJlaW50ZXJwcmV0aW5nIGNvbnZlcnNpb24uICBBcHBsaWVzIHRvIG5vcm1hbCwgT2JqQywgYW5kIGJsb2NrCisvLy8gcG9pbnRlcnMuCisvLy8gICAgKGludHB0cl90KSAiaGVscCEiCitDQVNUX09QRVJBVElPTihQb2ludGVyVG9JbnRlZ3JhbCkKKworLy8vIENLX1BvaW50ZXJUb0Jvb2xlYW4gLSBQb2ludGVyIHRvIGJvb2xlYW4gY29udmVyc2lvbi4gIEEgY2hlY2sKKy8vLyBhZ2FpbnN0IG51bGwuICBBcHBsaWVzIHRvIG5vcm1hbCwgT2JqQywgYW5kIGJsb2NrIHBvaW50ZXJzLgorQ0FTVF9PUEVSQVRJT04oUG9pbnRlclRvQm9vbGVhbikKKworLy8vIENLX1RvVm9pZCAtIENhc3QgdG8gdm9pZCwgZGlzY2FyZGluZyB0aGUgY29tcHV0ZWQgdmFsdWUuCisvLy8gICAgKHZvaWQpIG1hbGxvYygyMDQ4KQorQ0FTVF9PUEVSQVRJT04oVG9Wb2lkKQorCisvLy8gQ0tfVmVjdG9yU3BsYXQgLSBBIGNvbnZlcnNpb24gZnJvbSBhbiBhcml0aG1ldGljIHR5cGUgdG8gYQorLy8vIHZlY3RvciBvZiB0aGF0IGVsZW1lbnQgdHlwZS4gIEZpbGxzIGFsbCBlbGVtZW50cyAoInNwbGF0cyIpIHdpdGgKKy8vLyB0aGUgc291cmNlIHZhbHVlLgorLy8vICAgIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpIGludCB2ID0gNTsKK0NBU1RfT1BFUkFUSU9OKFZlY3RvclNwbGF0KQorCisvLy8gQ0tfSW50ZWdyYWxDYXN0IC0gQSBjYXN0IGJldHdlZW4gaW50ZWdyYWwgdHlwZXMgKG90aGVyIHRoYW4gdG8KKy8vLyBib29sZWFuKS4gIFZhcmlvdXNseSBhIGJpdGNhc3QsIGEgdHJ1bmNhdGlvbiwgYSBzaWduLWV4dGVuc2lvbiwKKy8vLyBvciBhIHplcm8tZXh0ZW5zaW9uLgorLy8vICAgIGxvbmcgbCA9IDU7CisvLy8gICAgKHVuc2lnbmVkKSBpCitDQVNUX09QRVJBVElPTihJbnRlZ3JhbENhc3QpCisKKy8vLyBDS19JbnRlZ3JhbFRvQm9vbGVhbiAtIEludGVncmFsIHRvIGJvb2xlYW4uICBBIGNoZWNrIGFnYWluc3QgemVyby4KKy8vLyAgICAoYm9vbCkgaQorQ0FTVF9PUEVSQVRJT04oSW50ZWdyYWxUb0Jvb2xlYW4pCisKKy8vLyBDS19JbnRlZ3JhbFRvRmxvYXRpbmcgLSBJbnRlZ3JhbCB0byBmbG9hdGluZyBwb2ludC4KKy8vLyAgICBmbG9hdCBmID0gaTsKK0NBU1RfT1BFUkFUSU9OKEludGVncmFsVG9GbG9hdGluZykKKworLy8vIENLX0Zsb2F0aW5nVG9JbnRlZ3JhbCAtIEZsb2F0aW5nIHBvaW50IHRvIGludGVncmFsLiAgUm91bmRzCisvLy8gdG93YXJkcyB6ZXJvLCBkaXNjYXJkaW5nIGFueSBmcmFjdGlvbmFsIGNvbXBvbmVudC4KKy8vLyAgICAoaW50KSBmCitDQVNUX09QRVJBVElPTihGbG9hdGluZ1RvSW50ZWdyYWwpCisKKy8vLyBDS19GbG9hdGluZ1RvQm9vbGVhbiAtIEZsb2F0aW5nIHBvaW50IHRvIGJvb2xlYW4uCisvLy8gICAgKGJvb2wpIGYKK0NBU1RfT1BFUkFUSU9OKEZsb2F0aW5nVG9Cb29sZWFuKQorCisvLyBDS19Cb29sZWFuVG9TaWduZWRJbnRlZ3JhbCAtIENvbnZlcnQgYSBib29sZWFuIHRvIC0xIG9yIDAgZm9yIHRydWUgYW5kCisvLyBmYWxzZSwgcmVzcGVjdGl2ZWx5LgorQ0FTVF9PUEVSQVRJT04oQm9vbGVhblRvU2lnbmVkSW50ZWdyYWwpCisKKy8vLyBDS19GbG9hdGluZ0Nhc3QgLSBDYXN0aW5nIGJldHdlZW4gZmxvYXRpbmcgdHlwZXMgb2YgZGlmZmVyZW50IHNpemUuCisvLy8gICAgKGRvdWJsZSkgZgorLy8vICAgIChmbG9hdCkgbGQKK0NBU1RfT1BFUkFUSU9OKEZsb2F0aW5nQ2FzdCkKKworLy8vIENLX0NQb2ludGVyVG9PYmpDUG9pbnRlckNhc3QgLSBDYXN0aW5nIGEgQyBwb2ludGVyIGtpbmQgdG8gYW4KKy8vLyBPYmplY3RpdmUtQyBwb2ludGVyLgorQ0FTVF9PUEVSQVRJT04oQ1BvaW50ZXJUb09iakNQb2ludGVyQ2FzdCkKKworLy8vIENLX0Jsb2NrUG9pbnRlclRvT2JqQ1BvaW50ZXJDYXN0IC0gQ2FzdGluZyBhIGJsb2NrIHBvaW50ZXIgdG8gYW4KKy8vLyBPYmpDIHBvaW50ZXIuCitDQVNUX09QRVJBVElPTihCbG9ja1BvaW50ZXJUb09iakNQb2ludGVyQ2FzdCkKKworLy8vIENLX0FueVBvaW50ZXJUb0Jsb2NrUG9pbnRlckNhc3QgLSBDYXN0aW5nIGFueSBub24tYmxvY2sgcG9pbnRlcgorLy8vIHRvIGEgYmxvY2sgcG9pbnRlci4gIEJsb2NrLXRvLWJsb2NrIGNhc3RzIGFyZSBiaXRjYXN0cy4KK0NBU1RfT1BFUkFUSU9OKEFueVBvaW50ZXJUb0Jsb2NrUG9pbnRlckNhc3QpCisKKy8vLyBcYnJpZWYgQ29udmVydGluZyBiZXR3ZWVuIHR3byBPYmplY3RpdmUtQyBvYmplY3QgdHlwZXMsIHdoaWNoCisvLy8gY2FuIG9jY3VyIHdoZW4gcGVyZm9ybWluZyByZWZlcmVuY2UgYmluZGluZyB0byBhbiBPYmplY3RpdmUtQworLy8vIG9iamVjdC4KK0NBU1RfT1BFUkFUSU9OKE9iakNPYmplY3RMVmFsdWVDYXN0KQorCisvLy8gXGJyaWVmIEEgY29udmVyc2lvbiBvZiBhIGZsb2F0aW5nIHBvaW50IHJlYWwgdG8gYSBmbG9hdGluZyBwb2ludAorLy8vIGNvbXBsZXggb2YgdGhlIG9yaWdpbmFsIHR5cGUuICBJbmplY3RzIHRoZSB2YWx1ZSBhcyB0aGUgcmVhbAorLy8vIGNvbXBvbmVudCB3aXRoIGEgemVybyBpbWFnaW5hcnkgY29tcG9uZW50LgorLy8vICAgZmxvYXQgLT4gX0NvbXBsZXggZmxvYXQKK0NBU1RfT1BFUkFUSU9OKEZsb2F0aW5nUmVhbFRvQ29tcGxleCkKKworLy8vIFxicmllZiBDb252ZXJ0cyBhIGZsb2F0aW5nIHBvaW50IGNvbXBsZXggdG8gZmxvYXRpbmcgcG9pbnQgcmVhbAorLy8vIG9mIHRoZSBzb3VyY2UncyBlbGVtZW50IHR5cGUuICBKdXN0IGRpc2NhcmRzIHRoZSBpbWFnaW5hcnkKKy8vLyBjb21wb25lbnQuCisvLy8gICBfQ29tcGxleCBsb25nIGRvdWJsZSAtPiBsb25nIGRvdWJsZQorQ0FTVF9PUEVSQVRJT04oRmxvYXRpbmdDb21wbGV4VG9SZWFsKQorCisvLy8gXGJyaWVmIENvbnZlcnRzIGEgZmxvYXRpbmcgcG9pbnQgY29tcGxleCB0byBib29sIGJ5IGNvbXBhcmluZworLy8vIGFnYWluc3QgMCswaS4KK0NBU1RfT1BFUkFUSU9OKEZsb2F0aW5nQ29tcGxleFRvQm9vbGVhbikKKworLy8vIFxicmllZiBDb252ZXJ0cyBiZXR3ZWVuIGRpZmZlcmVudCBmbG9hdGluZyBwb2ludCBjb21wbGV4IHR5cGVzLgorLy8vICAgX0NvbXBsZXggZmxvYXQgLT4gX0NvbXBsZXggZG91YmxlCitDQVNUX09QRVJBVElPTihGbG9hdGluZ0NvbXBsZXhDYXN0KQorCisvLy8gXGJyaWVmIENvbnZlcnRzIGZyb20gYSBmbG9hdGluZyBjb21wbGV4IHRvIGFuIGludGVncmFsIGNvbXBsZXguCisvLy8gICBfQ29tcGxleCBmbG9hdCAtPiBfQ29tcGxleCBpbnQKK0NBU1RfT1BFUkFUSU9OKEZsb2F0aW5nQ29tcGxleFRvSW50ZWdyYWxDb21wbGV4KQorCisvLy8gXGJyaWVmIENvbnZlcnRzIGZyb20gYW4gaW50ZWdyYWwgcmVhbCB0byBhbiBpbnRlZ3JhbCBjb21wbGV4CisvLy8gd2hvc2UgZWxlbWVudCB0eXBlIG1hdGNoZXMgdGhlIHNvdXJjZS4gIEluamVjdHMgdGhlIHZhbHVlIGFzCisvLy8gdGhlIHJlYWwgY29tcG9uZW50IHdpdGggYSB6ZXJvIGltYWdpbmFyeSBjb21wb25lbnQuCisvLy8gICBsb25nIC0+IF9Db21wbGV4IGxvbmcKK0NBU1RfT1BFUkFUSU9OKEludGVncmFsUmVhbFRvQ29tcGxleCkKKworLy8vIFxicmllZiBDb252ZXJ0cyBhbiBpbnRlZ3JhbCBjb21wbGV4IHRvIGFuIGludGVncmFsIHJlYWwgb2YgdGhlCisvLy8gc291cmNlJ3MgZWxlbWVudCB0eXBlIGJ5IGRpc2NhcmRpbmcgdGhlIGltYWdpbmFyeSBjb21wb25lbnQuCisvLy8gICBfQ29tcGxleCBzaG9ydCAtPiBzaG9ydAorQ0FTVF9PUEVSQVRJT04oSW50ZWdyYWxDb21wbGV4VG9SZWFsKQorCisvLy8gXGJyaWVmIENvbnZlcnRzIGFuIGludGVncmFsIGNvbXBsZXggdG8gYm9vbCBieSBjb21wYXJpbmcgYWdhaW5zdAorLy8vIDArMGkuCitDQVNUX09QRVJBVElPTihJbnRlZ3JhbENvbXBsZXhUb0Jvb2xlYW4pCisKKy8vLyBcYnJpZWYgQ29udmVydHMgYmV0d2VlbiBkaWZmZXJlbnQgaW50ZWdyYWwgY29tcGxleCB0eXBlcy4KKy8vLyAgIF9Db21wbGV4IGNoYXIgLT4gX0NvbXBsZXggbG9uZyBsb25nCisvLy8gICBfQ29tcGxleCB1bnNpZ25lZCBpbnQgLT4gX0NvbXBsZXggc2lnbmVkIGludAorQ0FTVF9PUEVSQVRJT04oSW50ZWdyYWxDb21wbGV4Q2FzdCkKKworLy8vIFxicmllZiBDb252ZXJ0cyBmcm9tIGFuIGludGVncmFsIGNvbXBsZXggdG8gYSBmbG9hdGluZyBjb21wbGV4LgorLy8vICAgX0NvbXBsZXggdW5zaWduZWQgLT4gX0NvbXBsZXggZmxvYXQKK0NBU1RfT1BFUkFUSU9OKEludGVncmFsQ29tcGxleFRvRmxvYXRpbmdDb21wbGV4KQorCisvLy8gXGJyaWVmIFtBUkNdIFByb2R1Y2VzIGEgcmV0YWluYWJsZSBvYmplY3QgcG9pbnRlciBzbyB0aGF0IGl0IG1heQorLy8vIGJlIGNvbnN1bWVkLCBlLmcuIGJ5IGJlaW5nIHBhc3NlZCB0byBhIGNvbnN1bWluZyBwYXJhbWV0ZXIuCisvLy8gQ2FsbHMgb2JqY19yZXRhaW4uCitDQVNUX09QRVJBVElPTihBUkNQcm9kdWNlT2JqZWN0KQorCisvLy8gXGJyaWVmIFtBUkNdIENvbnN1bWVzIGEgcmV0YWluYWJsZSBvYmplY3QgcG9pbnRlciB0aGF0IGhhcyBqdXN0CisvLy8gYmVlbiBwcm9kdWNlZCwgZS5nLiBhcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgcmV0YWluaW5nIGNhbGwuCisvLy8gRW50ZXJzIGEgY2xlYW51cCB0byBjYWxsIG9iamNfcmVsZWFzZSBhdCBzb21lIGluZGVmaW5pdGUgdGltZS4KK0NBU1RfT1BFUkFUSU9OKEFSQ0NvbnN1bWVPYmplY3QpCisKKy8vLyBcYnJpZWYgW0FSQ10gUmVjbGFpbSBhIHJldGFpbmFibGUgb2JqZWN0IHBvaW50ZXIgb2JqZWN0IHRoYXQgbWF5CisvLy8gaGF2ZSBiZWVuIHByb2R1Y2VkIGFuZCBhdXRvcmVsZWFzZWQgYXMgcGFydCBvZiBhIGZ1bmN0aW9uIHJldHVybgorLy8vIHNlcXVlbmNlLgorQ0FTVF9PUEVSQVRJT04oQVJDUmVjbGFpbVJldHVybmVkT2JqZWN0KQorCisvLy8gXGJyaWVmIFtBUkNdIENhdXNlcyBhIHZhbHVlIG9mIGJsb2NrIHR5cGUgdG8gYmUgY29waWVkIHRvIHRoZQorLy8vIGhlYXAsIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLiAgQSBudW1iZXIgb2Ygb3RoZXIgb3BlcmF0aW9ucworLy8vIGluIEFSQyBjYXVzZSBibG9ja3MgdG8gYmUgY29waWVkOyB0aGlzIGlzIGZvciBjYXNlcyB3aGVyZSB0aGF0CisvLy8gd291bGQgbm90IG90aGVyd2lzZSBiZSBndWFyYW50ZWVkLCBzdWNoIGFzIHdoZW4gY2FzdGluZyB0byBhCisvLy8gbm9uLWJsb2NrIHBvaW50ZXIgdHlwZS4KK0NBU1RfT1BFUkFUSU9OKEFSQ0V4dGVuZEJsb2NrT2JqZWN0KQorCisvLy8gXGJyaWVmIENvbnZlcnRzIGZyb20gX0F0b21pYyhUKSB0byBULgorQ0FTVF9PUEVSQVRJT04oQXRvbWljVG9Ob25BdG9taWMpCisvLy8gXGJyaWVmIENvbnZlcnRzIGZyb20gVCB0byBfQXRvbWljKFQpLgorQ0FTVF9PUEVSQVRJT04oTm9uQXRvbWljVG9BdG9taWMpCisKKy8vLyBcYnJpZWYgQ2F1c2VzIGEgYmxvY2sgbGl0ZXJhbCB0byBieSBjb3BpZWQgdG8gdGhlIGhlYXAgYW5kIHRoZW4gCisvLy8gYXV0b3JlbGVhc2VkLgorLy8vCisvLy8gVGhpcyBwYXJ0aWN1bGFyIGNhc3Qga2luZCBpcyB1c2VkIGZvciB0aGUgY29udmVyc2lvbiBmcm9tIGEgQysrMTEKKy8vLyBsYW1iZGEgZXhwcmVzc2lvbiB0byBhIGJsb2NrIHBvaW50ZXIuCitDQVNUX09QRVJBVElPTihDb3B5QW5kQXV0b3JlbGVhc2VCbG9ja09iamVjdCkKKworLy8gQ29udmVydCBhIGJ1aWx0aW4gZnVuY3Rpb24gdG8gYSBmdW5jdGlvbiBwb2ludGVyOyBvbmx5IGFsbG93ZWQgaW4gdGhlCisvLyBjYWxsZWUgb2YgYSBjYWxsIGV4cHJlc3Npb24uCitDQVNUX09QRVJBVElPTihCdWlsdGluRm5Ub0ZuUHRyKQorCisvLyBDb252ZXJ0IGEgemVybyB2YWx1ZSBmb3IgT3BlbkNMIGV2ZW50X3QgaW5pdGlhbGl6YXRpb24uCitDQVNUX09QRVJBVElPTihaZXJvVG9PQ0xFdmVudCkKKworLy8gQ29udmVydCBhIHplcm8gdmFsdWUgZm9yIE9wZW5DTCBxdWV1ZV90IGluaXRpYWxpemF0aW9uLgorQ0FTVF9PUEVSQVRJT04oWmVyb1RvT0NMUXVldWUpCisKKy8vIENvbnZlcnQgYSBwb2ludGVyIHRvIGEgZGlmZmVyZW50IGFkZHJlc3Mgc3BhY2UuCitDQVNUX09QRVJBVElPTihBZGRyZXNzU3BhY2VDb252ZXJzaW9uKQorCisvLyBDb252ZXJ0IGFuIGludGVnZXIgaW5pdGlhbGl6ZXIgdG8gYW4gT3BlbkNMIHNhbXBsZXIuCitDQVNUX09QRVJBVElPTihJbnRUb09DTFNhbXBsZXIpCisKKy8vPT09LSBCaW5hcnkgT3BlcmF0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBPcGVyYXRvcnMgbGlzdGVkIGluIG9yZGVyIG9mIHByZWNlZGVuY2UuCisvLyBOb3RlIHRoYXQgYWRkaXRpb25zIHRvIHRoaXMgc2hvdWxkIGFsc28gdXBkYXRlIHRoZSBTdG10VmlzaXRvciBjbGFzcyBhbmQKKy8vIEJpbmFyeU9wZXJhdG9yOjpnZXRPdmVybG9hZGVkT3BlcmF0b3IuCisKKy8vIFtDKysgNS41XSBQb2ludGVyLXRvLW1lbWJlciBvcGVyYXRvcnMuCitCSU5BUllfT1BFUkFUSU9OKFB0ck1lbUQsICIuKiIpCitCSU5BUllfT1BFUkFUSU9OKFB0ck1lbUksICItPioiKQorLy8gW0M5OSA2LjUuNV0gTXVsdGlwbGljYXRpdmUgb3BlcmF0b3JzLgorQklOQVJZX09QRVJBVElPTihNdWwsICIqIikKK0JJTkFSWV9PUEVSQVRJT04oRGl2LCAiLyIpCitCSU5BUllfT1BFUkFUSU9OKFJlbSwgIiUiKQorLy8gW0M5OSA2LjUuNl0gQWRkaXRpdmUgb3BlcmF0b3JzLgorQklOQVJZX09QRVJBVElPTihBZGQsICIrIikKK0JJTkFSWV9PUEVSQVRJT04oU3ViLCAiLSIpCisvLyBbQzk5IDYuNS43XSBCaXR3aXNlIHNoaWZ0IG9wZXJhdG9ycy4KK0JJTkFSWV9PUEVSQVRJT04oU2hsLCAiPDwiKQorQklOQVJZX09QRVJBVElPTihTaHIsICI+PiIpCisvLyBDKysyMCBbZXhwci5zcGFjZXNoaXBdIFRocmVlLXdheSBjb21wYXJpc29uIG9wZXJhdG9yLgorQklOQVJZX09QRVJBVElPTihDbXAsICI8PT4iKQorLy8gW0M5OSA2LjUuOF0gUmVsYXRpb25hbCBvcGVyYXRvcnMuCitCSU5BUllfT1BFUkFUSU9OKExULCAiPCIpCitCSU5BUllfT1BFUkFUSU9OKEdULCAiPiIpCitCSU5BUllfT1BFUkFUSU9OKExFLCAiPD0iKQorQklOQVJZX09QRVJBVElPTihHRSwgIj49IikKKy8vIFtDOTkgNi41LjldIEVxdWFsaXR5IG9wZXJhdG9ycy4KK0JJTkFSWV9PUEVSQVRJT04oRVEsICI9PSIpCitCSU5BUllfT1BFUkFUSU9OKE5FLCAiIT0iKQorLy8gW0M5OSA2LjUuMTBdIEJpdHdpc2UgQU5EIG9wZXJhdG9yLgorQklOQVJZX09QRVJBVElPTihBbmQsICImIikKKy8vIFtDOTkgNi41LjExXSBCaXR3aXNlIFhPUiBvcGVyYXRvci4KK0JJTkFSWV9PUEVSQVRJT04oWG9yLCAiXiIpCisvLyBbQzk5IDYuNS4xMl0gQml0d2lzZSBPUiBvcGVyYXRvci4KK0JJTkFSWV9PUEVSQVRJT04oT3IsICJ8IikKKy8vIFtDOTkgNi41LjEzXSBMb2dpY2FsIEFORCBvcGVyYXRvci4KK0JJTkFSWV9PUEVSQVRJT04oTEFuZCwgIiYmIikKKy8vIFtDOTkgNi41LjE0XSBMb2dpY2FsIE9SIG9wZXJhdG9yLgorQklOQVJZX09QRVJBVElPTihMT3IsICJ8fCIpCisvLyBbQzk5IDYuNS4xNl0gQXNzaWdubWVudCBvcGVyYXRvcnMuCitCSU5BUllfT1BFUkFUSU9OKEFzc2lnbiwgIj0iKQorQklOQVJZX09QRVJBVElPTihNdWxBc3NpZ24sICIqPSIpCitCSU5BUllfT1BFUkFUSU9OKERpdkFzc2lnbiwgIi89IikKK0JJTkFSWV9PUEVSQVRJT04oUmVtQXNzaWduLCAiJT0iKQorQklOQVJZX09QRVJBVElPTihBZGRBc3NpZ24sICIrPSIpCitCSU5BUllfT1BFUkFUSU9OKFN1YkFzc2lnbiwgIi09IikKK0JJTkFSWV9PUEVSQVRJT04oU2hsQXNzaWduLCAiPDw9IikKK0JJTkFSWV9PUEVSQVRJT04oU2hyQXNzaWduLCAiPj49IikKK0JJTkFSWV9PUEVSQVRJT04oQW5kQXNzaWduLCAiJj0iKQorQklOQVJZX09QRVJBVElPTihYb3JBc3NpZ24sICJePSIpCitCSU5BUllfT1BFUkFUSU9OKE9yQXNzaWduLCAifD0iKQorLy8gW0M5OSA2LjUuMTddIENvbW1hIG9wZXJhdG9yLgorQklOQVJZX09QRVJBVElPTihDb21tYSwgIiwiKQorCisKKy8vPT09LSBVbmFyeSBPcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBOb3RlIHRoYXQgYWRkaXRpb25zIHRvIHRoaXMgc2hvdWxkIGFsc28gdXBkYXRlIHRoZSBTdG10VmlzaXRvciBjbGFzcyBhbmQKKy8vIFVuYXJ5T3BlcmF0b3I6OmdldE92ZXJsb2FkZWRPcGVyYXRvci4KKworLy8gW0M5OSA2LjUuMi40XSBQb3N0Zml4IGluY3JlbWVudCBhbmQgZGVjcmVtZW50CitVTkFSWV9PUEVSQVRJT04oUG9zdEluYywgIisrIikKK1VOQVJZX09QRVJBVElPTihQb3N0RGVjLCAiLS0iKQorLy8gW0M5OSA2LjUuMy4xXSBQcmVmaXggaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgCitVTkFSWV9PUEVSQVRJT04oUHJlSW5jLCAiKysiKQorVU5BUllfT1BFUkFUSU9OKFByZURlYywgIi0tIikKKy8vIFtDOTkgNi41LjMuMl0gQWRkcmVzcyBhbmQgaW5kaXJlY3Rpb24KK1VOQVJZX09QRVJBVElPTihBZGRyT2YsICImIikKK1VOQVJZX09QRVJBVElPTihEZXJlZiwgIioiKQorLy8gW0M5OSA2LjUuMy4zXSBVbmFyeSBhcml0aG1ldGljIAorVU5BUllfT1BFUkFUSU9OKFBsdXMsICIrIikKK1VOQVJZX09QRVJBVElPTihNaW51cywgIi0iKQorVU5BUllfT1BFUkFUSU9OKE5vdCwgIn4iKQorVU5BUllfT1BFUkFUSU9OKExOb3QsICIhIikKKy8vICJfX3JlYWwgZXhwciIvIl9faW1hZyBleHByIiBFeHRlbnNpb24uCitVTkFSWV9PUEVSQVRJT04oUmVhbCwgIl9fcmVhbCIpCitVTkFSWV9PUEVSQVRJT04oSW1hZywgIl9faW1hZyIpCisvLyBfX2V4dGVuc2lvbl9fIG1hcmtlci4KK1VOQVJZX09QRVJBVElPTihFeHRlbnNpb24sICJfX2V4dGVuc2lvbl9fIikKKy8vIFtDKysgQ29yb3V0aW5lc10gY29fYXdhaXQgb3BlcmF0b3IKK1VOQVJZX09QRVJBVElPTihDb2F3YWl0LCAiY29fYXdhaXQiKQorCisjdW5kZWYgQ0FTVF9PUEVSQVRJT04KKyN1bmRlZiBCSU5BUllfT1BFUkFUSU9OCisjdW5kZWYgVU5BUllfT1BFUkFUSU9OCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvT3BlcmF0aW9uS2luZHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9PcGVyYXRpb25LaW5kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzODMyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvT3BlcmF0aW9uS2luZHMuaApAQCAtMCwwICsxLDUxIEBACisvLz09PS0gT3BlcmF0aW9uS2luZHMuaCAtIE9wZXJhdGlvbiBlbnVtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBlbnVtZXJhdGVzIHRoZSBkaWZmZXJlbnQga2luZHMgb2Ygb3BlcmF0aW9ucyB0aGF0IGNhbiBiZQorLy8gcGVyZm9ybWVkIGJ5IHZhcmlvdXMgZXhwcmVzc2lvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9PUEVSQVRJT05LSU5EU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX09QRVJBVElPTktJTkRTX0gKKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgCisvLy8gQ2FzdEtpbmQgLSBUaGUga2luZCBvZiBvcGVyYXRpb24gcmVxdWlyZWQgZm9yIGEgY29udmVyc2lvbi4KK2VudW0gQ2FzdEtpbmQgeworI2RlZmluZSBDQVNUX09QRVJBVElPTihOYW1lKSBDS18jI05hbWUsCisjaW5jbHVkZSAiY2xhbmcvQVNUL09wZXJhdGlvbktpbmRzLmRlZiIKK307CisKK2VudW0gQmluYXJ5T3BlcmF0b3JLaW5kIHsKKyNkZWZpbmUgQklOQVJZX09QRVJBVElPTihOYW1lLCBTcGVsbGluZykgQk9fIyNOYW1lLAorI2luY2x1ZGUgImNsYW5nL0FTVC9PcGVyYXRpb25LaW5kcy5kZWYiCit9OworCitlbnVtIFVuYXJ5T3BlcmF0b3JLaW5kIHsKKyNkZWZpbmUgVU5BUllfT1BFUkFUSU9OKE5hbWUsIFNwZWxsaW5nKSBVT18jI05hbWUsCisjaW5jbHVkZSAiY2xhbmcvQVNUL09wZXJhdGlvbktpbmRzLmRlZiIKK307CisKKy8vLyBcYnJpZWYgVGhlIGtpbmQgb2YgYnJpZGdpbmcgcGVyZm9ybWVkIGJ5IHRoZSBPYmplY3RpdmUtQyBicmlkZ2UgY2FzdC4KK2VudW0gT2JqQ0JyaWRnZUNhc3RLaW5kIHsKKyAgLy8vIFxicmllZiBCcmlkZ2luZyB2aWEgX19icmlkZ2UsIHdoaWNoIGRvZXMgbm90aGluZyBidXQgcmVpbnRlcnByZXQKKyAgLy8vIHRoZSBiaXRzLgorICBPQkNfQnJpZGdlLAorICAvLy8gXGJyaWVmIEJyaWRnaW5nIHZpYSBfX2JyaWRnZV90cmFuc2Zlciwgd2hpY2ggdHJhbnNmZXJzIG93bmVyc2hpcCBvZiBhbgorICAvLy8gT2JqZWN0aXZlLUMgcG9pbnRlciBpbnRvIEFSQy4KKyAgT0JDX0JyaWRnZVRyYW5zZmVyLAorICAvLy8gXGJyaWVmIEJyaWRnaW5nIHZpYSBfX2JyaWRnZV9yZXRhaW4sIHdoaWNoIG1ha2VzIGFuIEFSQyBvYmplY3QgYXZhaWxhYmxlCisgIC8vLyBhcyBhICsxIEMgcG9pbnRlci4KKyAgT0JDX0JyaWRnZVJldGFpbmVkCit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1BhcmVudE1hcC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1BhcmVudE1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NDVjNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvUGFyZW50TWFwLmgKQEAgLTAsMCArMSw2NyBAQAorLy89PT0tLS0gUGFyZW50TWFwLmggLSBNYXBwaW5ncyBmcm9tIFN0bXRzIHRvIHRoZWlyIFBhcmVudHMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIFBhcmVudE1hcCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX1BBUkVOVE1BUF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX1BBUkVOVE1BUF9ICisKK25hbWVzcGFjZSBjbGFuZyB7CitjbGFzcyBTdG10OworY2xhc3MgRXhwcjsKKworY2xhc3MgUGFyZW50TWFwIHsKKyAgdm9pZCogSW1wbDsKK3B1YmxpYzoKKyAgUGFyZW50TWFwKFN0bXQqIEFTVFJvb3QpOworICB+UGFyZW50TWFwKCk7CisKKyAgLy8vIFxicmllZiBBZGRzIGFuZC9vciB1cGRhdGVzIHRoZSBwYXJlbnQvY2hpbGQtcmVsYXRpb25zIG9mIHRoZSBjb21wbGV0ZQorICAvLy8gc3RtdCB0cmVlIG9mIFMuIEFsbCBjaGlsZHJlbiBvZiBTIGluY2x1ZGluZyBpbmRpcmVjdCBkZXNjZW5kYW50cyBhcmUKKyAgLy8vIHZpc2l0ZWQgYW5kIHVwZGF0ZWQgb3IgaW5zZXJ0ZWQgYnV0IG5vdCB0aGUgcGFyZW50cyBvZiBTLgorICB2b2lkIGFkZFN0bXQoU3RtdCogUyk7CisKKyAgLy8vIE1hbnVhbGx5IHNldHMgdGhlIHBhcmVudCBvZiBccCBTIHRvIFxwIFBhcmVudC4KKyAgLy8vCisgIC8vLyBJZiBccCBTIGlzIGFscmVhZHkgaW4gdGhlIG1hcCwgdGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIG1hcHBpbmcuCisgIHZvaWQgc2V0UGFyZW50KGNvbnN0IFN0bXQgKlMsIGNvbnN0IFN0bXQgKlBhcmVudCk7CisKKyAgU3RtdCAqZ2V0UGFyZW50KFN0bXQqKSBjb25zdDsKKyAgU3RtdCAqZ2V0UGFyZW50SWdub3JlUGFyZW5zKFN0bXQgKikgY29uc3Q7CisgIFN0bXQgKmdldFBhcmVudElnbm9yZVBhcmVuQ2FzdHMoU3RtdCAqKSBjb25zdDsKKyAgU3RtdCAqZ2V0UGFyZW50SWdub3JlUGFyZW5JbXBDYXN0cyhTdG10ICopIGNvbnN0OworICBTdG10ICpnZXRPdXRlclBhcmVuUGFyZW50KFN0bXQgKikgY29uc3Q7CisKKyAgY29uc3QgU3RtdCAqZ2V0UGFyZW50KGNvbnN0IFN0bXQqIFMpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UGFyZW50KGNvbnN0X2Nhc3Q8U3RtdCo+KFMpKTsKKyAgfQorCisgIGNvbnN0IFN0bXQgKmdldFBhcmVudElnbm9yZVBhcmVucyhjb25zdCBTdG10ICpTKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFBhcmVudElnbm9yZVBhcmVucyhjb25zdF9jYXN0PFN0bXQqPihTKSk7CisgIH0KKworICBjb25zdCBTdG10ICpnZXRQYXJlbnRJZ25vcmVQYXJlbkNhc3RzKGNvbnN0IFN0bXQgKlMpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UGFyZW50SWdub3JlUGFyZW5DYXN0cyhjb25zdF9jYXN0PFN0bXQqPihTKSk7CisgIH0KKworICBib29sIGhhc1BhcmVudChTdG10KiBTKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFBhcmVudChTKSAhPSBudWxscHRyOworICB9CisKKyAgYm9vbCBpc0NvbnN1bWVkRXhwcihFeHByICpFKSBjb25zdDsKKworICBib29sIGlzQ29uc3VtZWRFeHByKGNvbnN0IEV4cHIgKkUpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNDb25zdW1lZEV4cHIoY29uc3RfY2FzdDxFeHByKj4oRSkpOworICB9Cit9OworCit9IC8vIGVuZCBjbGFuZyBuYW1lc3BhY2UKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1ByZXR0eURlY2xTdGFja1RyYWNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvUHJldHR5RGVjbFN0YWNrVHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWI1MTllCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1ByZXR0eURlY2xTdGFja1RyYWNlLmgKQEAgLTAsMCArMSw0NyBAQAorLy89PT0tIFByZXR0eURlY2xTdGFja1RyYWNlLmggLSBTdGFjayB0cmFjZSBmb3IgZGVjbCBwcm9jZXNzaW5nIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbiBsbHZtOjpQcmV0dHlTdGFja1RyYWNlRW50cnkgb2JqZWN0IGZvciBzaG93aW5nCisvLyB0aGF0IGEgcGFydGljdWxhciBkZWNsYXJhdGlvbiB3YXMgYmVpbmcgcHJvY2Vzc2VkIHdoZW4gYSBjcmFzaAorLy8gb2NjdXJyZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9QUkVUVFlERUNMU1RBQ0tUUkFDRV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX1BSRVRUWURFQ0xTVEFDS1RSQUNFX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1ByZXR0eVN0YWNrVHJhY2UuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQVNUQ29udGV4dDsKK2NsYXNzIERlY2w7CitjbGFzcyBTb3VyY2VNYW5hZ2VyOworCisvLy8gUHJldHR5RGVjbFN0YWNrVHJhY2VFbnRyeSAtIElmIGEgY3Jhc2ggb2NjdXJzIGluIHRoZSBwYXJzZXIgd2hpbGUKKy8vLyBwYXJzaW5nIHNvbWV0aGluZyByZWxhdGVkIHRvIGEgZGVjbGFyYXRpb24sIGluY2x1ZGUgdGhhdAorLy8vIGRlY2xhcmF0aW9uIGluIHRoZSBzdGFjayB0cmFjZS4KK2NsYXNzIFByZXR0eURlY2xTdGFja1RyYWNlRW50cnkgOiBwdWJsaWMgbGx2bTo6UHJldHR5U3RhY2tUcmFjZUVudHJ5IHsKKyAgQVNUQ29udGV4dCAmQ29udGV4dDsKKyAgRGVjbCAqVGhlRGVjbDsKKyAgU291cmNlTG9jYXRpb24gTG9jOworICBjb25zdCBjaGFyICpNZXNzYWdlOworCitwdWJsaWM6CisgIFByZXR0eURlY2xTdGFja1RyYWNlRW50cnkoQVNUQ29udGV4dCAmQ3R4LCBEZWNsICpELCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTXNnKQorICAgIDogQ29udGV4dChDdHgpLCBUaGVEZWNsKEQpLCBMb2MoTG9jKSwgTWVzc2FnZShNc2cpIHt9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9QcmV0dHlQcmludGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvUHJldHR5UHJpbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MzFiOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvUHJldHR5UHJpbnRlci5oCkBAIC0wLDAgKzEsMjMyIEBACisvLz09PS0tLSBQcmV0dHlQcmludGVyLmggLSBDbGFzc2VzIGZvciBhaWRpbmcgd2l0aCBBU1QgcHJpbnRpbmcgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUHJpbnRlckhlbHBlciBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9QUkVUVFlQUklOVEVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfUFJFVFRZUFJJTlRFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgTGFuZ09wdGlvbnM7CitjbGFzcyBTb3VyY2VNYW5hZ2VyOworY2xhc3MgU3RtdDsKK2NsYXNzIFRhZ0RlY2w7CisKK2NsYXNzIFByaW50ZXJIZWxwZXIgeworcHVibGljOgorICB2aXJ0dWFsIH5QcmludGVySGVscGVyKCk7CisgIHZpcnR1YWwgYm9vbCBoYW5kbGVkU3RtdChTdG10KiBFLCByYXdfb3N0cmVhbSYgT1MpID0gMDsKK307CisKKy8vLyBEZXNjcmliZXMgaG93IHR5cGVzLCBzdGF0ZW1lbnRzLCBleHByZXNzaW9ucywgYW5kIGRlY2xhcmF0aW9ucyBzaG91bGQgYmUKKy8vLyBwcmludGVkLgorLy8vCisvLy8gVGhpcyB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHNtYWxsIGFuZCBzdWl0YWJsZSBmb3IgcGFzc2luZyBieSB2YWx1ZS4KKy8vLyBJdCBpcyB2ZXJ5IGZyZXF1ZW50bHkgY29waWVkLgorc3RydWN0IFByaW50aW5nUG9saWN5IHsKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBkZWZhdWx0IHByaW50aW5nIHBvbGljeSBmb3IgdGhlIHNwZWNpZmllZCBsYW5ndWFnZS4KKyAgUHJpbnRpbmdQb2xpY3koY29uc3QgTGFuZ09wdGlvbnMgJkxPKQorICAgIDogSW5kZW50YXRpb24oMiksIFN1cHByZXNzU3BlY2lmaWVycyhmYWxzZSksCisgICAgICBTdXBwcmVzc1RhZ0tleXdvcmQoTE8uQ1BsdXNQbHVzKSwKKyAgICAgIEluY2x1ZGVUYWdEZWZpbml0aW9uKGZhbHNlKSwgU3VwcHJlc3NTY29wZShmYWxzZSksCisgICAgICBTdXBwcmVzc1Vud3JpdHRlblNjb3BlKGZhbHNlKSwgU3VwcHJlc3NJbml0aWFsaXplcnMoZmFsc2UpLAorICAgICAgQ29uc3RhbnRBcnJheVNpemVBc1dyaXR0ZW4oZmFsc2UpLCBBbm9ueW1vdXNUYWdMb2NhdGlvbnModHJ1ZSksCisgICAgICBTdXBwcmVzc1N0cm9uZ0xpZmV0aW1lKGZhbHNlKSwgU3VwcHJlc3NMaWZldGltZVF1YWxpZmllcnMoZmFsc2UpLAorICAgICAgU3VwcHJlc3NUZW1wbGF0ZUFyZ3NJbkNYWENvbnN0cnVjdG9ycyhmYWxzZSksCisgICAgICBCb29sKExPLkJvb2wpLCBSZXN0cmljdChMTy5DOTkpLAorICAgICAgQWxpZ25vZihMTy5DUGx1c1BsdXMxMSksIFVuZGVyc2NvcmVBbGlnbm9mKExPLkMxMSksCisgICAgICBVc2VWb2lkRm9yWmVyb1BhcmFtcyghTE8uQ1BsdXNQbHVzKSwKKyAgICAgIFRlcnNlT3V0cHV0KGZhbHNlKSwgUG9saXNoRm9yRGVjbGFyYXRpb24oZmFsc2UpLAorICAgICAgSGFsZihMTy5IYWxmKSwgTVNXQ2hhcihMTy5NaWNyb3NvZnRFeHQgJiYgIUxPLldDaGFyKSwKKyAgICAgIEluY2x1ZGVOZXdsaW5lcyh0cnVlKSwgTVNWQ0Zvcm1hdHRpbmcoZmFsc2UpLAorICAgICAgQ29uc3RhbnRzQXNXcml0dGVuKGZhbHNlKSwgU3VwcHJlc3NJbXBsaWNpdEJhc2UoZmFsc2UpLAorICAgICAgRnVsbHlRdWFsaWZpZWROYW1lKGZhbHNlKSB7IH0KKworICAvLy8gQWRqdXN0IHRoaXMgcHJpbnRpbmcgcG9saWN5IGZvciBjYXNlcyB3aGVyZSBpdCdzIGtub3duIHRoYXQgd2UncmUKKyAgLy8vIHByaW50aW5nIEMrKyBjb2RlIChmb3IgaW5zdGFuY2UsIGlmIEFTVCBkdW1waW5nIHJlYWNoZXMgYSBDKystb25seQorICAvLy8gY29uc3RydWN0KS4gVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgaWYgYSByZWFsIExhbmdPcHRpb25zIG9iamVjdCBpcworICAvLy8gYXZhaWxhYmxlLgorICB2b2lkIGFkanVzdEZvckNQbHVzUGx1cygpIHsKKyAgICBTdXBwcmVzc1RhZ0tleXdvcmQgPSB0cnVlOworICAgIEJvb2wgPSB0cnVlOworICAgIFVzZVZvaWRGb3JaZXJvUGFyYW1zID0gZmFsc2U7CisgIH0KKworICAvLy8gVGhlIG51bWJlciBvZiBzcGFjZXMgdG8gdXNlIHRvIGluZGVudCBlYWNoIGxpbmUuCisgIHVuc2lnbmVkIEluZGVudGF0aW9uIDogODsKKworICAvLy8gV2hldGhlciB3ZSBzaG91bGQgc3VwcHJlc3MgcHJpbnRpbmcgb2YgdGhlIGFjdHVhbCBzcGVjaWZpZXJzIGZvcgorICAvLy8gdGhlIGdpdmVuIHR5cGUgb3IgZGVjbGFyYXRpb24uCisgIC8vLworICAvLy8gVGhpcyBmbGFnIGlzIG9ubHkgdXNlZCB3aGVuIHdlIGFyZSBwcmludGluZyBkZWNsYXJhdG9ycyBiZXlvbmQKKyAgLy8vIHRoZSBmaXJzdCBkZWNsYXJhdG9yIHdpdGhpbiBhIGRlY2xhcmF0aW9uIGdyb3VwLiBGb3IgZXhhbXBsZSwgZ2l2ZW46CisgIC8vLworICAvLy8gXGNvZGUKKyAgLy8vIGNvbnN0IGludCAqeCwgKnk7CisgIC8vLyBcZW5kY29kZQorICAvLy8KKyAgLy8vIFN1cHByZXNzU3BlY2lmaWVycyB3aWxsIGJlIGZhbHNlIHdoZW4gcHJpbnRpbmcgdGhlCisgIC8vLyBkZWNsYXJhdGlvbiBmb3IgIngiLCBzbyB0aGF0IHdlIHdpbGwgcHJpbnQgImludCAqeCI7IGl0IHdpbGwgYmUKKyAgLy8vIFxjIHRydWUgd2hlbiB3ZSBwcmludCAieSIsIHNvIHRoYXQgd2Ugc3VwcHJlc3MgcHJpbnRpbmcgdGhlCisgIC8vLyAiY29uc3QgaW50IiB0eXBlIHNwZWNpZmllciBhbmQgaW5zdGVhZCBvbmx5IHByaW50IHRoZSAiKnkiLgorICBib29sIFN1cHByZXNzU3BlY2lmaWVycyA6IDE7CisKKyAgLy8vIFdoZXRoZXIgdHlwZSBwcmludGluZyBzaG91bGQgc2tpcCBwcmludGluZyB0aGUgdGFnIGtleXdvcmQuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHdoZW4gcHJpbnRpbmcgdGhlIGlubmVyIHR5cGUgb2YgZWxhYm9yYXRlZCB0eXBlcywKKyAgLy8vIChhcyB0aGUgdGFnIGtleXdvcmQgaXMgcGFydCBvZiB0aGUgZWxhYm9yYXRlZCB0eXBlKToKKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gc3RydWN0IEdlb21ldHJ5OjpQb2ludDsKKyAgLy8vIFxlbmRjb2RlCisgIGJvb2wgU3VwcHJlc3NUYWdLZXl3b3JkIDogMTsKKworICAvLy8gV2hlbiB0cnVlLCBpbmNsdWRlIHRoZSBib2R5IG9mIGEgdGFnIGRlZmluaXRpb24uCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHRvIHBsYWNlIHRoZSBkZWZpbml0aW9uIG9mIGEgc3RydWN0CisgIC8vLyBpbiB0aGUgbWlkZGxlIG9mIGFub3RoZXIgZGVjbGFyYXRpb24gYXMgd2l0aDoKKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gdHlwZWRlZiBzdHJ1Y3QgeyBpbnQgeCwgeTsgfSBQb2ludDsKKyAgLy8vIFxlbmRjb2RlCisgIGJvb2wgSW5jbHVkZVRhZ0RlZmluaXRpb24gOiAxOworCisgIC8vLyBTdXBwcmVzc2VzIHByaW50aW5nIG9mIHNjb3BlIHNwZWNpZmllcnMuCisgIGJvb2wgU3VwcHJlc3NTY29wZSA6IDE7CisKKyAgLy8vIFN1cHByZXNzIHByaW50aW5nIHBhcnRzIG9mIHNjb3BlIHNwZWNpZmllcnMgdGhhdCBkb24ndCBuZWVkCisgIC8vLyB0byBiZSB3cml0dGVuLCBlLmcuLCBmb3IgaW5saW5lIG9yIGFub255bW91cyBuYW1lc3BhY2VzLgorICBib29sIFN1cHByZXNzVW53cml0dGVuU2NvcGUgOiAxOworICAKKyAgLy8vIFN1cHByZXNzIHByaW50aW5nIG9mIHZhcmlhYmxlIGluaXRpYWxpemVycy4KKyAgLy8vCisgIC8vLyBUaGlzIGZsYWcgaXMgdXNlZCB3aGVuIHByaW50aW5nIHRoZSBsb29wIHZhcmlhYmxlIGluIGEgZm9yLXJhbmdlCisgIC8vLyBzdGF0ZW1lbnQuIEZvciBleGFtcGxlLCBnaXZlbjoKKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gZm9yIChhdXRvIHggOiBjb2xsKQorICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBTdXBwcmVzc0luaXRpYWxpemVycyB3aWxsIGJlIHRydWUgd2hlbiBwcmludGluZyAiYXV0byB4Iiwgc28gdGhhdCB0aGUKKyAgLy8vIGludGVybmFsIGluaXRpYWxpemVyIGNvbnN0cnVjdGVkIGZvciB4IHdpbGwgbm90IGJlIHByaW50ZWQuCisgIGJvb2wgU3VwcHJlc3NJbml0aWFsaXplcnMgOiAxOworCisgIC8vLyBXaGV0aGVyIHdlIHNob3VsZCBwcmludCB0aGUgc2l6ZXMgb2YgY29uc3RhbnQgYXJyYXkgZXhwcmVzc2lvbnMgYXMgd3JpdHRlbgorICAvLy8gaW4gdGhlIHNvdXJjZXMuCisgIC8vLworICAvLy8gVGhpcyBmbGFnIGRldGVybWluZXMgd2hldGhlciBhcnJheSB0eXBlcyBkZWNsYXJlZCBhcworICAvLy8KKyAgLy8vIFxjb2RlCisgIC8vLyBpbnQgYVs0KzEwKjEwXTsKKyAgLy8vIGNoYXIgYVtdID0gIkEgc3RyaW5nIjsKKyAgLy8vIFxlbmRjb2RlCisgIC8vLworICAvLy8gd2lsbCBiZSBwcmludGVkIGFzIHdyaXR0ZW4gb3IgYXMgZm9sbG93czoKKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gaW50IGFbMTA0XTsKKyAgLy8vIGNoYXIgYVs5XSA9ICJBIHN0cmluZyI7CisgIC8vLyBcZW5kY29kZQorICBib29sIENvbnN0YW50QXJyYXlTaXplQXNXcml0dGVuIDogMTsKKyAgCisgIC8vLyBXaGVuIHByaW50aW5nIGFuIGFub255bW91cyB0YWcgbmFtZSwgYWxzbyBwcmludCB0aGUgbG9jYXRpb24gb2YgdGhhdAorICAvLy8gZW50aXR5IChlLmcuLCAiZW51bSA8YW5vbnltb3VzIGF0IHQuaDoxMDo1PiIpLiBPdGhlcndpc2UsIGp1c3QgcHJpbnRzCisgIC8vLyAiKGFub255bW91cykiIGZvciB0aGUgbmFtZS4KKyAgYm9vbCBBbm9ueW1vdXNUYWdMb2NhdGlvbnMgOiAxOworICAKKyAgLy8vIFdoZW4gdHJ1ZSwgc3VwcHJlc3MgcHJpbnRpbmcgb2YgdGhlIF9fc3Ryb25nIGxpZmV0aW1lIHF1YWxpZmllciBpbiBBUkMuCisgIHVuc2lnbmVkIFN1cHByZXNzU3Ryb25nTGlmZXRpbWUgOiAxOworICAKKyAgLy8vIFdoZW4gdHJ1ZSwgc3VwcHJlc3MgcHJpbnRpbmcgb2YgbGlmZXRpbWUgcXVhbGlmaWVyIGluIEFSQy4KKyAgdW5zaWduZWQgU3VwcHJlc3NMaWZldGltZVF1YWxpZmllcnMgOiAxOworCisgIC8vLyBXaGVuIHRydWUsIHN1cHByZXNzZXMgcHJpbnRpbmcgdGVtcGxhdGUgYXJndW1lbnRzIGluIG5hbWVzIG9mIEMrKworICAvLy8gY29uc3RydWN0b3JzLgorICB1bnNpZ25lZCBTdXBwcmVzc1RlbXBsYXRlQXJnc0luQ1hYQ29uc3RydWN0b3JzIDogMTsKKworICAvLy8gV2hldGhlciB3ZSBjYW4gdXNlICdib29sJyByYXRoZXIgdGhhbiAnX0Jvb2wnIChldmVuIGlmIHRoZSBsYW5ndWFnZQorICAvLy8gZG9lc24ndCBhY3R1YWxseSBoYXZlICdib29sJywgYmVjYXVzZSwgZS5nLiwgaXQgaXMgZGVmaW5lZCBhcyBhIG1hY3JvKS4KKyAgdW5zaWduZWQgQm9vbCA6IDE7CisKKyAgLy8vIFdoZXRoZXIgd2UgY2FuIHVzZSAncmVzdHJpY3QnIHJhdGhlciB0aGFuICdfX3Jlc3RyaWN0Jy4KKyAgdW5zaWduZWQgUmVzdHJpY3QgOiAxOworCisgIC8vLyBXaGV0aGVyIHdlIGNhbiB1c2UgJ2FsaWdub2YnIHJhdGhlciB0aGFuICdfX2FsaWdub2YnLgorICB1bnNpZ25lZCBBbGlnbm9mIDogMTsKKworICAvLy8gV2hldGhlciB3ZSBjYW4gdXNlICdfQWxpZ25vZicgcmF0aGVyIHRoYW4gJ19fYWxpZ25vZicuCisgIHVuc2lnbmVkIFVuZGVyc2NvcmVBbGlnbm9mIDogMTsKKworICAvLy8gV2hldGhlciB3ZSBzaG91bGQgdXNlICcodm9pZCknIHJhdGhlciB0aGFuICcoKScgZm9yIGEgZnVuY3Rpb24gcHJvdG90eXBlCisgIC8vLyB3aXRoIHplcm8gcGFyYW1ldGVycy4KKyAgdW5zaWduZWQgVXNlVm9pZEZvclplcm9QYXJhbXMgOiAxOworCisgIC8vLyBQcm92aWRlIGEgJ3RlcnNlJyBvdXRwdXQuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsIGluIHRoaXMgbW9kZSB3ZSBkb24ndCBwcmludCBmdW5jdGlvbiBib2RpZXMsIGNsYXNzIG1lbWJlcnMsCisgIC8vLyBkZWNsYXJhdGlvbnMgaW5zaWRlIG5hbWVzcGFjZXMgZXRjLiAgRWZmZWN0aXZlbHksIHRoaXMgc2hvdWxkIHByaW50CisgIC8vLyBvbmx5IHRoZSByZXF1ZXN0ZWQgZGVjbGFyYXRpb24uCisgIHVuc2lnbmVkIFRlcnNlT3V0cHV0IDogMTsKKyAgCisgIC8vLyBXaGVuIHRydWUsIGRvIGNlcnRhaW4gcmVmaW5lbWVudCBuZWVkZWQgZm9yIHByb2R1Y2luZyBwcm9wZXIgZGVjbGFyYXRpb24KKyAgLy8vIHRhZzsgc3VjaCBhcywgZG8gbm90IHByaW50IGF0dHJpYnV0ZXMgYXR0YWNoZWQgdG8gdGhlIGRlY2xhcmF0aW9uLgorICAvLy8KKyAgdW5zaWduZWQgUG9saXNoRm9yRGVjbGFyYXRpb24gOiAxOworCisgIC8vLyBXaGVuIHRydWUsIHByaW50IHRoZSBoYWxmLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB0eXBlIGFzICdoYWxmJworICAvLy8gaW5zdGVhZCBvZiAnX19mcDE2JworICB1bnNpZ25lZCBIYWxmIDogMTsKKworICAvLy8gV2hlbiB0cnVlLCBwcmludCB0aGUgYnVpbHQtaW4gd2NoYXJfdCB0eXBlIGFzIF9fd2NoYXJfdC4gRm9yIHVzZSBpbgorICAvLy8gTWljcm9zb2Z0IG1vZGUgd2hlbiB3Y2hhcl90IGlzIG5vdCBhdmFpbGFibGUuCisgIHVuc2lnbmVkIE1TV0NoYXIgOiAxOworCisgIC8vLyBXaGVuIHRydWUsIGluY2x1ZGUgbmV3bGluZXMgYWZ0ZXIgc3RhdGVtZW50cyBsaWtlICJicmVhayIsIGV0Yy4KKyAgdW5zaWduZWQgSW5jbHVkZU5ld2xpbmVzIDogMTsKKworICAvLy8gVXNlIHdoaXRlc3BhY2UgYW5kIHB1bmN0dWF0aW9uIGxpa2UgTVNWQyBkb2VzLiBJbiBwYXJ0aWN1bGFyLCB0aGlzIHByaW50cworICAvLy8gYW5vbnltb3VzIG5hbWVzcGFjZXMgYXMgYGFub255bW91cyBuYW1lc3BhY2UnIGFuZCBkb2VzIG5vdCBpbnNlcnQgc3BhY2VzCisgIC8vLyBhZnRlciB0ZW1wbGF0ZSBhcmd1bWVudHMuCisgIGJvb2wgTVNWQ0Zvcm1hdHRpbmcgOiAxOworCisgIC8vLyBXaGV0aGVyIHdlIHNob3VsZCBwcmludCB0aGUgY29uc3RhbnQgZXhwcmVzc2lvbnMgYXMgd3JpdHRlbiBpbiB0aGUKKyAgLy8vIHNvdXJjZXMuCisgIC8vLworICAvLy8gVGhpcyBmbGFnIGRldGVybWluZXMgd2hldGhlciBjb25zdGFudHMgZXhwcmVzc2lvbnMgbGlrZQorICAvLy8KKyAgLy8vIFxjb2RlCisgIC8vLyAweDEwCisgIC8vLyAyLjVlMworICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyB3aWxsIGJlIHByaW50ZWQgYXMgd3JpdHRlbiBvciBhcyBmb2xsb3dzOgorICAvLy8KKyAgLy8vIFxjb2RlCisgIC8vLyAweDEwCisgIC8vLyAyLjVlMworICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBDb25zdGFudHNBc1dyaXR0ZW4gOiAxOworCisgIC8vLyBXaGVuIHRydWUsIGRvbid0IHByaW50IHRoZSBpbXBsaWNpdCAnc2VsZicgb3IgJ3RoaXMnIGV4cHJlc3Npb25zLgorICBib29sIFN1cHByZXNzSW1wbGljaXRCYXNlIDogMTsKKworICAvLy8gV2hlbiB0cnVlLCBwcmludCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgorICAvLy8gVGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2YgU3VwcHJlc3NTY29wZSBhbmQgdGh1cyBvdmVycnVsZXMgaXQuCisgIGJvb2wgRnVsbHlRdWFsaWZpZWROYW1lIDogMTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9RdWFsVHlwZU5hbWVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvUXVhbFR5cGVOYW1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZDgwNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvUXVhbFR5cGVOYW1lcy5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vPT09LS0tIFF1YWxUeXBlTmFtZXMuaCAtIEdlbmVyYXRlIENvbXBsZXRlIFF1YWxUeXBlIE5hbWVzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLyA9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBcZmlsZQorLy8gRnVuY3Rpb25hbGl0eSB0byBnZW5lcmF0ZSB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWVzIG9mIFF1YWxUeXBlcywKKy8vIGluY2x1ZGluZyByZWN1cnNpdmVseSBleHBhbmRpbmcgYW55IHN1YnR5cGVzIGFuZCB0ZW1wbGF0ZQorLy8gcGFyYW1ldGVycy4KKy8vCisvLyBNb3JlIHByZWNpc2VseTogR2VuZXJhdGVzIGEgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIHRvIG5hbWUgdGhlIHNhbWUKKy8vIHR5cGUgaWYgdXNlZCBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uIHVuaXQtLXdpdGgKKy8vIGNlcnRhaW4gbGltaXRhdGlvbnMuIFNlZSBiZWxvdy4KKy8vCisvLyBUaGlzIGNvZGUgZGVzdWdhcnMgbmFtZXMgb25seSB2ZXJ5IG1pbmltYWxseSwgc28gaW4gdGhpcyBjb2RlOgorLy8KKy8vIG5hbWVzcGFjZSBBIHsKKy8vICAgc3RydWN0IFgge307CisvLyB9CisvLyB1c2luZyBBOjpYOworLy8gbmFtZXNwYWNlIEIgeworLy8gICB1c2luZyBzdGQ6OnR1cGxlOworLy8gICB0eXBlZGVmIHR1cGxlPFg+IFRYOworLy8gICBUWCB0OworLy8gfQorLy8KKy8vIEI6OnQncyB0eXBlIGlzIHJlcG9ydGVkIGFzICJCOjpUWCIsIHJhdGhlciB0aGFuIHN0ZDo6dHVwbGU8QTo6WD4uCisvLworLy8gQWxzbywgdGhpcyBjb2RlIHJlcGxhY2VzIHR5cGVzIGZvdW5kIHZpYSB1c2luZyBkZWNsYXJhdGlvbnMgd2l0aAorLy8gdGhlaXIgbW9yZSBxdWFsaWZpZWQgbmFtZSwgc28gZm9yIHRoZSBjb2RlOgorLy8KKy8vIHVzaW5nIHN0ZDo6dHVwbGU7CisvLyB0dXBsZTxpbnQ+IFRJbnQ7CisvLworLy8gVEludCdzIHR5cGUgd2lsbCBiZSBuYW1lZCwgInN0ZDo6dHVwbGU8aW50PiIuCisvLworLy8gTGltaXRhdGlvbnM6CisvLworLy8gU29tZSB0eXBlcyBoYXZlIGFtYmlndW91cyBuYW1lcyBhdCB0aGUgZW5kIG9mIGEgdHJhbnNsYXRpb24gdW5pdCwKKy8vIGFyZSBub3QgbmFtYWJsZSBhdCBhbGwgdGhlcmUsIG9yIGFyZSBzcGVjaWFsIGNhc2VzIGluIG90aGVyIHdheXMuCisvLworLy8gMSkgVHlwZXMgd2l0aCBvbmx5IGxvY2FsIHNjb3BlIHdpbGwgaGF2ZSB0aGVpciBsb2NhbCBuYW1lczoKKy8vCisvLyB2b2lkIGZvbygpIHsKKy8vICAgc3RydWN0IExvY2FsVHlwZSB7fSBMb2NhbFZhcjsKKy8vIH0KKy8vCisvLyBMb2NhbFZhcidzIHR5cGUgd2lsbCBiZSBuYW1lZCwgInN0cnVjdCBMb2NhbFR5cGUiLCB3aXRob3V0IGFueQorLy8gcXVhbGlmaWNhdGlvbi4KKy8vCisvLyAyKSBUeXBlcyB0aGF0IGhhdmUgYmVlbiBzaGFkb3dlZCBhcmUgcmVwb3J0ZWQgbm9ybWFsbHksIGJ1dCBhCisvLyBjbGllbnQgdXNpbmcgdGhhdCBuYW1lIGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zbGF0aW9uIHVuaXQgd2lsbCBiZQorLy8gcmVmZXJyaW5nIHRvIGEgZGlmZmVyZW50IHR5cGUuCisvLworLy8gPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfUVVBTFRZUEVOQU1FU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX1FVQUxUWVBFTkFNRVNfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVENvbnRleHQuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBUeXBlTmFtZSB7CisvLy8gXGJyaWVmIEdldCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgZm9yIGEgdHlwZS4gVGhpcyBpbmNsdWRlcyBmdWxsCisvLy8gcXVhbGlmaWNhdGlvbiBvZiBhbGwgdGVtcGxhdGUgcGFyYW1ldGVycyBldGMuCisvLy8KKy8vLyBccGFyYW1baW5dIFFUIC0gdGhlIHR5cGUgZm9yIHdoaWNoIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSB3aWxsIGJlCisvLy8gcmV0dXJuZWQuCisvLy8gXHBhcmFtW2luXSBDdHggLSB0aGUgQVNUQ29udGV4dCB0byBiZSB1c2VkLgorLy8vIFxwYXJhbVtpbl0gV2l0aEdsb2JhbE5zUHJlZml4IC0gSWYgdHJ1ZSwgdGhlbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZQorLy8vIHNwZWNpZmllciAiOjoiIHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZS4KK3N0ZDo6c3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkTmFtZShRdWFsVHlwZSBRVCwgY29uc3QgQVNUQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgV2l0aEdsb2JhbE5zUHJlZml4ID0gZmFsc2UpOworCisvLy8gXGJyaWVmIEdlbmVyYXRlcyBhIFF1YWxUeXBlIHRoYXQgY2FuIGJlIHVzZWQgdG8gbmFtZSB0aGUgc2FtZSB0eXBlCisvLy8gaWYgdXNlZCBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uIHVuaXQuIFRoaXMgaWdub3JlcworLy8vIGlzc3VlcyBzdWNoIGFzIHR5cGUgc2hhZG93aW5nLgorLy8vCisvLy8gXHBhcmFtW2luXSBRVCAtIHRoZSB0eXBlIGZvciB3aGljaCB0aGUgZnVsbHkgcXVhbGlmaWVkIHR5cGUgd2lsbCBiZQorLy8vIHJldHVybmVkLgorLy8vIFxwYXJhbVtpbl0gQ3R4IC0gdGhlIEFTVENvbnRleHQgdG8gYmUgdXNlZC4KKy8vLyBccGFyYW1baW5dIFdpdGhHbG9iYWxOc1ByZWZpeCAtIEluZGljYXRlIHdoZXRoZXIgdGhlIGdsb2JhbCBuYW1lc3BhY2UKKy8vLyBzcGVjaWZpZXIgIjo6IiBzaG91bGQgYmUgcHJlcGVuZGVkIG9yIG5vdC4KK1F1YWxUeXBlIGdldEZ1bGx5UXVhbGlmaWVkVHlwZShRdWFsVHlwZSBRVCwgY29uc3QgQVNUQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgV2l0aEdsb2JhbE5zUHJlZml4ID0gZmFsc2UpOworfSAvLyBlbmQgbmFtZXNwYWNlIFR5cGVOYW1lCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1RPT0xJTkdfQ09SRV9RVUFMVFlQRU5BTUVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9SYXdDb21tZW50TGlzdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1Jhd0NvbW1lbnRMaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5MzFlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9SYXdDb21tZW50TGlzdC5oCkBAIC0wLDAgKzEsMTkxIEBACisvLz09PS0tLSBSYXdDb21tZW50TGlzdC5oIC0gQ2xhc3NlcyBmb3IgcHJvY2Vzc2luZyByYXcgY29tbWVudHMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX1JBV0NPTU1FTlRMSVNUX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfUkFXQ09NTUVOVExJU1RfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQ29tbWVudE9wdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQVNUQ29udGV4dDsKK2NsYXNzIEFTVFJlYWRlcjsKK2NsYXNzIERlY2w7CitjbGFzcyBQcmVwcm9jZXNzb3I7CisKK25hbWVzcGFjZSBjb21tZW50cyB7CisgIGNsYXNzIEZ1bGxDb21tZW50OworfSAvLyBlbmQgbmFtZXNwYWNlIGNvbW1lbnRzCisKK2NsYXNzIFJhd0NvbW1lbnQgeworcHVibGljOgorICBlbnVtIENvbW1lbnRLaW5kIHsKKyAgICBSQ0tfSW52YWxpZCwgICAgICAvLy88IEludmFsaWQgY29tbWVudAorICAgIFJDS19PcmRpbmFyeUJDUEwsIC8vLzwgQW55IG5vcm1hbCBCQ1BMIGNvbW1lbnRzCisgICAgUkNLX09yZGluYXJ5QywgICAgLy8vPCBBbnkgbm9ybWFsIEMgY29tbWVudAorICAgIFJDS19CQ1BMU2xhc2gsICAgIC8vLzwgXGNvZGUgLy8vIHN0dWZmIFxlbmRjb2RlCisgICAgUkNLX0JDUExFeGNsLCAgICAgLy8vPCBcY29kZSAvLyEgc3R1ZmYgXGVuZGNvZGUKKyAgICBSQ0tfSmF2YURvYywgICAgICAvLy88IFxjb2RlIC8qKiBzdHVmZiAqLyBcZW5kY29kZQorICAgIFJDS19RdCwgICAgICAgICAgIC8vLzwgXGNvZGUgLyohIHN0dWZmICovIFxlbmRjb2RlLCBhbHNvIHVzZWQgYnkgSGVhZGVyRG9jCisgICAgUkNLX01lcmdlZCAgICAgICAgLy8vPCBUd28gb3IgbW9yZSBkb2N1bWVudGF0aW9uIGNvbW1lbnRzIG1lcmdlZCB0b2dldGhlcgorICB9OworCisgIFJhd0NvbW1lbnQoKSA6IEtpbmQoUkNLX0ludmFsaWQpLCBJc0FsbW9zdFRyYWlsaW5nQ29tbWVudChmYWxzZSkgeyB9CisKKyAgUmF3Q29tbWVudChjb25zdCBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3IsIFNvdXJjZVJhbmdlIFNSLAorICAgICAgICAgICAgIGNvbnN0IENvbW1lbnRPcHRpb25zICZDb21tZW50T3B0cywgYm9vbCBNZXJnZWQpOworCisgIENvbW1lbnRLaW5kIGdldEtpbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gKENvbW1lbnRLaW5kKSBLaW5kOworICB9CisKKyAgYm9vbCBpc0ludmFsaWQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gS2luZCA9PSBSQ0tfSW52YWxpZDsKKyAgfQorCisgIGJvb2wgaXNNZXJnZWQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gS2luZCA9PSBSQ0tfTWVyZ2VkOworICB9CisKKyAgLy8vIElzIHRoaXMgY29tbWVudCBhdHRhY2hlZCB0byBhbnkgZGVjbGFyYXRpb24/CisgIGJvb2wgaXNBdHRhY2hlZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBJc0F0dGFjaGVkOworICB9CisKKyAgdm9pZCBzZXRBdHRhY2hlZCgpIHsKKyAgICBJc0F0dGFjaGVkID0gdHJ1ZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgaXQgaXMgYSBjb21tZW50IHRoYXQgc2hvdWxkIGJlIHB1dCBhZnRlciBhIG1lbWJlcjoKKyAgLy8vIFxjb2RlIC8vLzwgc3R1ZmYgXGVuZGNvZGUKKyAgLy8vIFxjb2RlIC8vITwgc3R1ZmYgXGVuZGNvZGUKKyAgLy8vIFxjb2RlIC8qKjwgc3R1ZmYgKi8gXGVuZGNvZGUKKyAgLy8vIFxjb2RlIC8qITwgc3R1ZmYgKi8gXGVuZGNvZGUKKyAgYm9vbCBpc1RyYWlsaW5nQ29tbWVudCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBJc1RyYWlsaW5nQ29tbWVudDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgaXQgaXMgYSBwcm9iYWJsZSB0eXBvOgorICAvLy8gXGNvZGUgLy88IHN0dWZmIFxlbmRjb2RlCisgIC8vLyBcY29kZSAvKjwgc3R1ZmYgKi8gXGVuZGNvZGUKKyAgYm9vbCBpc0FsbW9zdFRyYWlsaW5nQ29tbWVudCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBJc0FsbW9zdFRyYWlsaW5nQ29tbWVudDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21tZW50IGlzIG5vdCBhIGRvY3VtZW50YXRpb24gY29tbWVudC4KKyAgYm9vbCBpc09yZGluYXJ5KCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuICgoS2luZCA9PSBSQ0tfT3JkaW5hcnlCQ1BMKSB8fCAoS2luZCA9PSBSQ0tfT3JkaW5hcnlDKSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tbWVudCBhbnkga2luZCBvZiBhIGRvY3VtZW50YXRpb24gY29tbWVudC4KKyAgYm9vbCBpc0RvY3VtZW50YXRpb24oKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gIWlzSW52YWxpZCgpICYmICFpc09yZGluYXJ5KCk7CisgIH0KKworICAvLy8gUmV0dXJucyByYXcgY29tbWVudCB0ZXh0IHdpdGggY29tbWVudCBtYXJrZXJzLgorICBTdHJpbmdSZWYgZ2V0UmF3VGV4dChjb25zdCBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3IpIGNvbnN0IHsKKyAgICBpZiAoUmF3VGV4dFZhbGlkKQorICAgICAgcmV0dXJuIFJhd1RleHQ7CisKKyAgICBSYXdUZXh0ID0gZ2V0UmF3VGV4dFNsb3coU291cmNlTWdyKTsKKyAgICBSYXdUZXh0VmFsaWQgPSB0cnVlOworICAgIHJldHVybiBSYXdUZXh0OworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJhbmdlOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSYW5nZS5nZXRCZWdpbigpOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUmFuZ2UuZ2V0RW5kKCk7IH0KKworICBjb25zdCBjaGFyICpnZXRCcmllZlRleHQoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCkgY29uc3QgeworICAgIGlmIChCcmllZlRleHRWYWxpZCkKKyAgICAgIHJldHVybiBCcmllZlRleHQ7CisKKyAgICByZXR1cm4gZXh0cmFjdEJyaWVmVGV4dChDb250ZXh0KTsKKyAgfQorCisgIC8vLyBQYXJzZSB0aGUgY29tbWVudCwgYXNzdW1pbmcgaXQgaXMgYXR0YWNoZWQgdG8gZGVjbCBcYyBELgorICBjb21tZW50czo6RnVsbENvbW1lbnQgKnBhcnNlKGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJlcHJvY2Vzc29yICpQUCwgY29uc3QgRGVjbCAqRCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIFNvdXJjZVJhbmdlIFJhbmdlOworCisgIG11dGFibGUgU3RyaW5nUmVmIFJhd1RleHQ7CisgIG11dGFibGUgY29uc3QgY2hhciAqQnJpZWZUZXh0OworCisgIG11dGFibGUgYm9vbCBSYXdUZXh0VmFsaWQgOiAxOyAgIC8vLzwgVHJ1ZSBpZiBSYXdUZXh0IGlzIHZhbGlkCisgIG11dGFibGUgYm9vbCBCcmllZlRleHRWYWxpZCA6IDE7IC8vLzwgVHJ1ZSBpZiBCcmllZlRleHQgaXMgdmFsaWQKKworICB1bnNpZ25lZCBLaW5kIDogMzsKKworICAvLy8gVHJ1ZSBpZiBjb21tZW50IGlzIGF0dGFjaGVkIHRvIGEgZGVjbGFyYXRpb24gaW4gQVNUQ29udGV4dC4KKyAgYm9vbCBJc0F0dGFjaGVkIDogMTsKKworICBib29sIElzVHJhaWxpbmdDb21tZW50IDogMTsKKyAgYm9vbCBJc0FsbW9zdFRyYWlsaW5nQ29tbWVudCA6IDE7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3RvciBmb3IgQVNUIGRlc2VyaWFsaXphdGlvbi4KKyAgUmF3Q29tbWVudChTb3VyY2VSYW5nZSBTUiwgQ29tbWVudEtpbmQgSywgYm9vbCBJc1RyYWlsaW5nQ29tbWVudCwKKyAgICAgICAgICAgICBib29sIElzQWxtb3N0VHJhaWxpbmdDb21tZW50KSA6CisgICAgUmFuZ2UoU1IpLCBSYXdUZXh0VmFsaWQoZmFsc2UpLCBCcmllZlRleHRWYWxpZChmYWxzZSksIEtpbmQoSyksCisgICAgSXNBdHRhY2hlZChmYWxzZSksIElzVHJhaWxpbmdDb21tZW50KElzVHJhaWxpbmdDb21tZW50KSwKKyAgICBJc0FsbW9zdFRyYWlsaW5nQ29tbWVudChJc0FsbW9zdFRyYWlsaW5nQ29tbWVudCkKKyAgeyB9CisKKyAgU3RyaW5nUmVmIGdldFJhd1RleHRTbG93KGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNvdXJjZU1ncikgY29uc3Q7CisKKyAgY29uc3QgY2hhciAqZXh0cmFjdEJyaWVmVGV4dChjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0KSBjb25zdDsKKworICBmcmllbmQgY2xhc3MgQVNUUmVhZGVyOworfTsKKworLy8vIFxicmllZiBDb21wYXJlIGNvbW1lbnRzJyBzb3VyY2UgbG9jYXRpb25zLgordGVtcGxhdGU8PgorY2xhc3MgQmVmb3JlVGhhbkNvbXBhcmU8UmF3Q29tbWVudD4geworICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTTsKKworcHVibGljOgorICBleHBsaWNpdCBCZWZvcmVUaGFuQ29tcGFyZShjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSkgOiBTTShTTSkgeyB9CisKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0NvbW1lbnQgJkxIUywgY29uc3QgUmF3Q29tbWVudCAmUkhTKSB7CisgICAgcmV0dXJuIFNNLmlzQmVmb3JlSW5UcmFuc2xhdGlvblVuaXQoTEhTLmdldExvY1N0YXJ0KCksIFJIUy5nZXRMb2NTdGFydCgpKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSYXdDb21tZW50ICpMSFMsIGNvbnN0IFJhd0NvbW1lbnQgKlJIUykgeworICAgIHJldHVybiBvcGVyYXRvcigpKCpMSFMsICpSSFMpOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbGwgY29tbWVudHMgaW5jbHVkZWQgaW4gdGhlIHRyYW5zbGF0aW9uIHVuaXQsCisvLy8gc29ydGVkIGluIG9yZGVyIG9mIGFwcGVhcmFuY2UgaW4gdGhlIHRyYW5zbGF0aW9uIHVuaXQuCitjbGFzcyBSYXdDb21tZW50TGlzdCB7CitwdWJsaWM6CisgIFJhd0NvbW1lbnRMaXN0KFNvdXJjZU1hbmFnZXIgJlNvdXJjZU1ncikgOiBTb3VyY2VNZ3IoU291cmNlTWdyKSB7fQorCisgIHZvaWQgYWRkQ29tbWVudChjb25zdCBSYXdDb21tZW50ICZSQywgY29uc3QgQ29tbWVudE9wdGlvbnMgJkNvbW1lbnRPcHRzLAorICAgICAgICAgICAgICAgICAgbGx2bTo6QnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yKTsKKworICBBcnJheVJlZjxSYXdDb21tZW50ICo+IGdldENvbW1lbnRzKCkgY29uc3QgeworICAgIHJldHVybiBDb21tZW50czsKKyAgfQorCitwcml2YXRlOgorICBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3I7CisgIHN0ZDo6dmVjdG9yPFJhd0NvbW1lbnQgKj4gQ29tbWVudHM7CisKKyAgdm9pZCBhZGREZXNlcmlhbGl6ZWRDb21tZW50cyhBcnJheVJlZjxSYXdDb21tZW50ICo+IERlc2VyaWFsaXplZENvbW1lbnRzKTsKKworICBmcmllbmQgY2xhc3MgQVNUUmVhZGVyOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1JlY29yZExheW91dC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1JlY29yZExheW91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NmQ0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvUmVjb3JkTGF5b3V0LmgKQEAgLTAsMCArMSwzMTQgQEAKKy8vPT09LSBSZWNvcmRMYXlvdXQuaCAtIExheW91dCBpbmZvcm1hdGlvbiBmb3IgYSBzdHJ1Y3QvdW5pb24gLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBSZWNvcmRMYXlvdXQgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfUkVDT1JETEFZT1VUX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfUkVDT1JETEFZT1VUX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RWZWN0b3IuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvQ2hhclVuaXRzLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDWFguaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBU1RDb250ZXh0OworY2xhc3MgQ1hYUmVjb3JkRGVjbDsKKworLy8vIEFTVFJlY29yZExheW91dCAtCisvLy8gVGhpcyBjbGFzcyBjb250YWlucyBsYXlvdXQgaW5mb3JtYXRpb24gZm9yIG9uZSBSZWNvcmREZWNsLAorLy8vIHdoaWNoIGlzIGEgc3RydWN0L3VuaW9uL2NsYXNzLiAgVGhlIGRlY2wgcmVwcmVzZW50ZWQgbXVzdCBiZSBhIGRlZmluaXRpb24sCisvLy8gbm90IGEgZm9yd2FyZCBkZWNsYXJhdGlvbi4KKy8vLyBUaGlzIGNsYXNzIGlzIGFsc28gdXNlZCB0byBjb250YWluIGxheW91dCBpbmZvcm1hdGlvbiBmb3Igb25lCisvLy8gT2JqQ0ludGVyZmFjZURlY2wuIEZJWE1FIC0gRmluZCBhcHByb3ByaWF0ZSBuYW1lLgorLy8vIFRoZXNlIG9iamVjdHMgYXJlIG1hbmFnZWQgYnkgQVNUQ29udGV4dC4KK2NsYXNzIEFTVFJlY29yZExheW91dCB7CitwdWJsaWM6CisgIHN0cnVjdCBWQmFzZUluZm8geworICAgIC8vLyBUaGUgb2Zmc2V0IHRvIHRoaXMgdmlydHVhbCBiYXNlIGluIHRoZSBjb21wbGV0ZS1vYmplY3QgbGF5b3V0CisgICAgLy8vIG9mIHRoaXMgY2xhc3MuCisgICAgQ2hhclVuaXRzIFZCYXNlT2Zmc2V0OworCisgIHByaXZhdGU6CisgICAgLy8vIFdoZXRoZXIgdGhpcyB2aXJ0dWFsIGJhc2UgcmVxdWlyZXMgYSB2dG9yZGlzcCBmaWVsZCBpbiB0aGUKKyAgICAvLy8gTWljcm9zb2Z0IEFCSS4gIFRoZXNlIGZpZWxkcyBhcmUgcmVxdWlyZWQgZm9yIGNlcnRhaW4gb3BlcmF0aW9ucworICAgIC8vLyBpbiBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLgorICAgIGJvb2wgSGFzVnRvckRpc3AgPSBmYWxzZTsKKworICBwdWJsaWM6CisgICAgVkJhc2VJbmZvKCkgPSBkZWZhdWx0OworICAgIFZCYXNlSW5mbyhDaGFyVW5pdHMgVkJhc2VPZmZzZXQsIGJvb2wgaGFzVnRvckRpc3ApCisgICAgICAgIDogVkJhc2VPZmZzZXQoVkJhc2VPZmZzZXQpLCBIYXNWdG9yRGlzcChoYXNWdG9yRGlzcCkge30KKworICAgIGJvb2wgaGFzVnRvckRpc3AoKSBjb25zdCB7IHJldHVybiBIYXNWdG9yRGlzcDsgfQorICB9OworCisgIHVzaW5nIFZCYXNlT2Zmc2V0c01hcFR5ID0gbGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLCBWQmFzZUluZm8+OworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsKKworICAvLy8gU2l6ZSAtIFNpemUgb2YgcmVjb3JkIGluIGNoYXJhY3RlcnMuCisgIENoYXJVbml0cyBTaXplOworCisgIC8vLyBEYXRhU2l6ZSAtIFNpemUgb2YgcmVjb3JkIGluIGNoYXJhY3RlcnMgd2l0aG91dCB0YWlsIHBhZGRpbmcuCisgIENoYXJVbml0cyBEYXRhU2l6ZTsKKworICAvLyBBbGlnbm1lbnQgLSBBbGlnbm1lbnQgb2YgcmVjb3JkIGluIGNoYXJhY3RlcnMuCisgIENoYXJVbml0cyBBbGlnbm1lbnQ7CisKKyAgLy8vIFJlcXVpcmVkQWxpZ25tZW50IC0gVGhlIHJlcXVpcmVkIGFsaWdubWVudCBvZiB0aGUgb2JqZWN0LiAgSW4gdGhlIE1TLUFCSQorICAvLy8gdGhlIF9fZGVjbHNwZWMoYWxpZ24oKSkgdHJ1bXBzICNwcmFtZ2EgcGFjayBhbmQgbXVzdCBhbHdheXMgYmUgb2JleWVkLgorICBDaGFyVW5pdHMgUmVxdWlyZWRBbGlnbm1lbnQ7CisKKyAgLy8vIEZpZWxkT2Zmc2V0cyAtIEFycmF5IG9mIGZpZWxkIG9mZnNldHMgaW4gYml0cy4KKyAgQVNUVmVjdG9yPHVpbnQ2NF90PiBGaWVsZE9mZnNldHM7CisKKyAgLy8vIENYWFJlY29yZExheW91dEluZm8gLSBDb250YWlucyBDKysgc3BlY2lmaWMgbGF5b3V0IGluZm9ybWF0aW9uLgorICBzdHJ1Y3QgQ1hYUmVjb3JkTGF5b3V0SW5mbyB7CisgICAgLy8vIE5vblZpcnR1YWxTaXplIC0gVGhlIG5vbi12aXJ0dWFsIHNpemUgKGluIGNoYXJzKSBvZiBhbiBvYmplY3QsIHdoaWNoIGlzCisgICAgLy8vIHRoZSBzaXplIG9mIHRoZSBvYmplY3Qgd2l0aG91dCB2aXJ0dWFsIGJhc2VzLgorICAgIENoYXJVbml0cyBOb25WaXJ0dWFsU2l6ZTsKKworICAgIC8vLyBOb25WaXJ0dWFsQWxpZ25tZW50IC0gVGhlIG5vbi12aXJ0dWFsIGFsaWdubWVudCAoaW4gY2hhcnMpIG9mIGFuIG9iamVjdCwKKyAgICAvLy8gd2hpY2ggaXMgdGhlIGFsaWdubWVudCBvZiB0aGUgb2JqZWN0IHdpdGhvdXQgdmlydHVhbCBiYXNlcy4KKyAgICBDaGFyVW5pdHMgTm9uVmlydHVhbEFsaWdubWVudDsKKworICAgIC8vLyBTaXplT2ZMYXJnZXN0RW1wdHlTdWJvYmplY3QgLSBUaGUgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBlbXB0eSBzdWJvYmplY3QKKyAgICAvLy8gKGVpdGhlciBhIGJhc2Ugb3IgYSBtZW1iZXIpLiBXaWxsIGJlIHplcm8gaWYgdGhlIGNsYXNzIGRvZXNuJ3QgY29udGFpbgorICAgIC8vLyBhbnkgZW1wdHkgc3Vib2JqZWN0cy4KKyAgICBDaGFyVW5pdHMgU2l6ZU9mTGFyZ2VzdEVtcHR5U3Vib2JqZWN0OworCisgICAgLy8vIFZCUHRyT2Zmc2V0IC0gVmlydHVhbCBiYXNlIHRhYmxlIG9mZnNldCAoTWljcm9zb2Z0LW9ubHkpLgorICAgIENoYXJVbml0cyBWQlB0ck9mZnNldDsKKworICAgIC8vLyBIYXNPd25WRlB0ciAtIERvZXMgdGhpcyBjbGFzcyBwcm92aWRlIGEgdmlydHVhbCBmdW5jdGlvbiB0YWJsZQorICAgIC8vLyAodnRhYmxlIGluIEl0YW5pdW0sIHZmdGJsIGluIE1pY3Jvc29mdCkgdGhhdCBpcyBpbmRlcGVuZGVudCBmcm9tCisgICAgLy8vIGl0cyBiYXNlIGNsYXNzZXM/CisgICAgYm9vbCBIYXNPd25WRlB0ciA6IDE7CisKKyAgICAvLy8gSGFzVkZQdHIgLSBEb2VzIHRoaXMgY2xhc3MgaGF2ZSBhIHZmdGFibGUgdGhhdCBjb3VsZCBiZSBleHRlbmRlZCBieQorICAgIC8vLyBhIGRlcml2ZWQgY2xhc3MuICBUaGUgY2xhc3MgbWF5IGhhdmUgaW5oZXJpdGVkIHRoaXMgcG9pbnRlciBmcm9tCisgICAgLy8vIGEgcHJpbWFyeSBiYXNlIGNsYXNzLgorICAgIGJvb2wgSGFzRXh0ZW5kYWJsZVZGUHRyIDogMTsKKworICAgIC8vLyBFbmRzV2l0aFplcm9TaXplZE9iamVjdCAtIFRydWUgaWYgdGhpcyBjbGFzcyBjb250YWlucyBhIHplcm8gc2l6ZWQKKyAgICAvLy8gbWVtYmVyIG9yIGJhc2Ugb3IgYSBiYXNlIHdpdGggYSB6ZXJvIHNpemVkIG1lbWJlciBvciBiYXNlLgorICAgIC8vLyBPbmx5IHVzZWQgZm9yIE1TLUFCSS4KKyAgICBib29sIEVuZHNXaXRoWmVyb1NpemVkT2JqZWN0IDogMTsKKworICAgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGlzIGNsYXNzIGlzIHplcm8gc2l6ZWQgb3IgZmlyc3QgYmFzZSBpcyB6ZXJvIHNpemVkIG9yCisgICAgLy8vIGhhcyB0aGlzIHByb3BlcnR5LiAgT25seSB1c2VkIGZvciBNUy1BQkkuCisgICAgYm9vbCBMZWFkc1dpdGhaZXJvU2l6ZWRCYXNlIDogMTsKKworICAgIC8vLyBQcmltYXJ5QmFzZSAtIFRoZSBwcmltYXJ5IGJhc2UgaW5mbyBmb3IgdGhpcyByZWNvcmQuCisgICAgbGx2bTo6UG9pbnRlckludFBhaXI8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLCAxLCBib29sPiBQcmltYXJ5QmFzZTsKKworICAgIC8vLyBCYXNlU2hhcmluZ1ZCUHRyIC0gVGhlIGJhc2Ugd2Ugc2hhcmUgdmJwdHIgd2l0aC4KKyAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlU2hhcmluZ1ZCUHRyOworICAgIAorICAgIC8vLyBGSVhNRTogVGhpcyBzaG91bGQgcmVhbGx5IHVzZSBhIFNtYWxsUHRyTWFwLCBvbmNlIHdlIGhhdmUgb25lIGluIExMVk0gOikKKyAgICB1c2luZyBCYXNlT2Zmc2V0c01hcFR5ID0gbGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLCBDaGFyVW5pdHM+OworICAgIAorICAgIC8vLyBCYXNlT2Zmc2V0cyAtIENvbnRhaW5zIGEgbWFwIGZyb20gYmFzZSBjbGFzc2VzIHRvIHRoZWlyIG9mZnNldC4KKyAgICBCYXNlT2Zmc2V0c01hcFR5IEJhc2VPZmZzZXRzOworCisgICAgLy8vIFZCYXNlT2Zmc2V0cyAtIENvbnRhaW5zIGEgbWFwIGZyb20gdmJhc2UgY2xhc3NlcyB0byB0aGVpciBvZmZzZXQuCisgICAgVkJhc2VPZmZzZXRzTWFwVHkgVkJhc2VPZmZzZXRzOworICB9OworCisgIC8vLyBDWFhJbmZvIC0gSWYgdGhlIHJlY29yZCBsYXlvdXQgaXMgZm9yIGEgQysrIHJlY29yZCwgdGhpcyB3aWxsIGhhdmUKKyAgLy8vIEMrKyBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjb3JkLgorICBDWFhSZWNvcmRMYXlvdXRJbmZvICpDWFhJbmZvID0gbnVsbHB0cjsKKworICBBU1RSZWNvcmRMYXlvdXQoY29uc3QgQVNUQ29udGV4dCAmQ3R4LCBDaGFyVW5pdHMgc2l6ZSwgQ2hhclVuaXRzIGFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgIENoYXJVbml0cyByZXF1aXJlZEFsaWdubWVudCwgQ2hhclVuaXRzIGRhdGFzaXplLAorICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDY0X3Q+IGZpZWxkb2Zmc2V0cyk7CisKKyAgdXNpbmcgQmFzZU9mZnNldHNNYXBUeSA9IENYWFJlY29yZExheW91dEluZm86OkJhc2VPZmZzZXRzTWFwVHk7CisKKyAgLy8gQ29uc3RydWN0b3IgZm9yIEMrKyByZWNvcmRzLgorICBBU1RSZWNvcmRMYXlvdXQoY29uc3QgQVNUQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIHNpemUsIENoYXJVbml0cyBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICBDaGFyVW5pdHMgcmVxdWlyZWRBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICBib29sIGhhc093blZGUHRyLCBib29sIGhhc0V4dGVuZGFibGVWRlB0ciwKKyAgICAgICAgICAgICAgICAgIENoYXJVbml0cyB2YnB0cm9mZnNldCwKKyAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBkYXRhc2l6ZSwKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ2NF90PiBmaWVsZG9mZnNldHMsCisgICAgICAgICAgICAgICAgICBDaGFyVW5pdHMgbm9udmlydHVhbHNpemUsIENoYXJVbml0cyBub252aXJ0dWFsYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIFNpemVPZkxhcmdlc3RFbXB0eVN1Ym9iamVjdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlByaW1hcnlCYXNlLAorICAgICAgICAgICAgICAgICAgYm9vbCBJc1ByaW1hcnlCYXNlVmlydHVhbCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VTaGFyaW5nVkJQdHIsCisgICAgICAgICAgICAgICAgICBib29sIEVuZHNXaXRoWmVyb1NpemVkT2JqZWN0LAorICAgICAgICAgICAgICAgICAgYm9vbCBMZWFkc1dpdGhaZXJvU2l6ZWRCYXNlLAorICAgICAgICAgICAgICAgICAgY29uc3QgQmFzZU9mZnNldHNNYXBUeSYgQmFzZU9mZnNldHMsCisgICAgICAgICAgICAgICAgICBjb25zdCBWQmFzZU9mZnNldHNNYXBUeSYgVkJhc2VPZmZzZXRzKTsKKworICB+QVNUUmVjb3JkTGF5b3V0KCkgPSBkZWZhdWx0OworCisgIHZvaWQgRGVzdHJveShBU1RDb250ZXh0ICZDdHgpOworICAKK3B1YmxpYzoKKyAgQVNUUmVjb3JkTGF5b3V0KGNvbnN0IEFTVFJlY29yZExheW91dCAmKSA9IGRlbGV0ZTsKKyAgQVNUUmVjb3JkTGF5b3V0ICZvcGVyYXRvcj0oY29uc3QgQVNUUmVjb3JkTGF5b3V0ICYpID0gZGVsZXRlOworCisgIC8vLyBnZXRBbGlnbm1lbnQgLSBHZXQgdGhlIHJlY29yZCBhbGlnbm1lbnQgaW4gY2hhcmFjdGVycy4KKyAgQ2hhclVuaXRzIGdldEFsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIEFsaWdubWVudDsgfQorCisgIC8vLyBnZXRTaXplIC0gR2V0IHRoZSByZWNvcmQgc2l6ZSBpbiBjaGFyYWN0ZXJzLgorICBDaGFyVW5pdHMgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKworICAvLy8gZ2V0RmllbGRDb3VudCAtIEdldCB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0aGUgbGF5b3V0LgorICB1bnNpZ25lZCBnZXRGaWVsZENvdW50KCkgY29uc3QgeyByZXR1cm4gRmllbGRPZmZzZXRzLnNpemUoKTsgfQorCisgIC8vLyBnZXRGaWVsZE9mZnNldCAtIEdldCB0aGUgb2Zmc2V0IG9mIHRoZSBnaXZlbiBmaWVsZCBpbmRleCwgaW4KKyAgLy8vIGJpdHMuCisgIHVpbnQ2NF90IGdldEZpZWxkT2Zmc2V0KHVuc2lnbmVkIEZpZWxkTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gRmllbGRPZmZzZXRzW0ZpZWxkTm9dOworICB9CisKKyAgLy8vIGdldERhdGFTaXplKCkgLSBHZXQgdGhlIHJlY29yZCBkYXRhIHNpemUsIHdoaWNoIGlzIHRoZSByZWNvcmQgc2l6ZQorICAvLy8gd2l0aG91dCB0YWlsIHBhZGRpbmcsIGluIGNoYXJhY3RlcnMuCisgIENoYXJVbml0cyBnZXREYXRhU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRGF0YVNpemU7CisgIH0KKworICAvLy8gZ2V0Tm9uVmlydHVhbFNpemUgLSBHZXQgdGhlIG5vbi12aXJ0dWFsIHNpemUgKGluIGNoYXJzKSBvZiBhbiBvYmplY3QsCisgIC8vLyB3aGljaCBpcyB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0IHdpdGhvdXQgdmlydHVhbCBiYXNlcy4KKyAgQ2hhclVuaXRzIGdldE5vblZpcnR1YWxTaXplKCkgY29uc3QgeworICAgIGFzc2VydChDWFhJbmZvICYmICJSZWNvcmQgbGF5b3V0IGRvZXMgbm90IGhhdmUgQysrIHNwZWNpZmljIGluZm8hIik7CisKKyAgICByZXR1cm4gQ1hYSW5mby0+Tm9uVmlydHVhbFNpemU7CisgIH0KKworICAvLy8gZ2V0Tm9uVmlydHVhbFNpemUgLSBHZXQgdGhlIG5vbi12aXJ0dWFsIGFsaWdubWVudCAoaW4gY2hhcnMpIG9mIGFuIG9iamVjdCwKKyAgLy8vIHdoaWNoIGlzIHRoZSBhbGlnbm1lbnQgb2YgdGhlIG9iamVjdCB3aXRob3V0IHZpcnR1YWwgYmFzZXMuCisgIENoYXJVbml0cyBnZXROb25WaXJ0dWFsQWxpZ25tZW50KCkgY29uc3QgeworICAgIGFzc2VydChDWFhJbmZvICYmICJSZWNvcmQgbGF5b3V0IGRvZXMgbm90IGhhdmUgQysrIHNwZWNpZmljIGluZm8hIik7CisKKyAgICByZXR1cm4gQ1hYSW5mby0+Tm9uVmlydHVhbEFsaWdubWVudDsKKyAgfQorCisgIC8vLyBnZXRQcmltYXJ5QmFzZSAtIEdldCB0aGUgcHJpbWFyeSBiYXNlIGZvciB0aGlzIHJlY29yZC4KKyAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqZ2V0UHJpbWFyeUJhc2UoKSBjb25zdCB7CisgICAgYXNzZXJ0KENYWEluZm8gJiYgIlJlY29yZCBsYXlvdXQgZG9lcyBub3QgaGF2ZSBDKysgc3BlY2lmaWMgaW5mbyEiKTsKKworICAgIHJldHVybiBDWFhJbmZvLT5QcmltYXJ5QmFzZS5nZXRQb2ludGVyKCk7CisgIH0KKworICAvLy8gaXNQcmltYXJ5QmFzZVZpcnR1YWwgLSBHZXQgd2hldGhlciB0aGUgcHJpbWFyeSBiYXNlIGZvciB0aGlzIHJlY29yZAorICAvLy8gaXMgdmlydHVhbCBvciBub3QuCisgIGJvb2wgaXNQcmltYXJ5QmFzZVZpcnR1YWwoKSBjb25zdCB7CisgICAgYXNzZXJ0KENYWEluZm8gJiYgIlJlY29yZCBsYXlvdXQgZG9lcyBub3QgaGF2ZSBDKysgc3BlY2lmaWMgaW5mbyEiKTsKKworICAgIHJldHVybiBDWFhJbmZvLT5QcmltYXJ5QmFzZS5nZXRJbnQoKTsKKyAgfQorCisgIC8vLyBnZXRCYXNlQ2xhc3NPZmZzZXQgLSBHZXQgdGhlIG9mZnNldCwgaW4gY2hhcnMsIGZvciB0aGUgZ2l2ZW4gYmFzZSBjbGFzcy4KKyAgQ2hhclVuaXRzIGdldEJhc2VDbGFzc09mZnNldChjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlKSBjb25zdCB7CisgICAgYXNzZXJ0KENYWEluZm8gJiYgIlJlY29yZCBsYXlvdXQgZG9lcyBub3QgaGF2ZSBDKysgc3BlY2lmaWMgaW5mbyEiKTsKKyAgICBhc3NlcnQoQ1hYSW5mby0+QmFzZU9mZnNldHMuY291bnQoQmFzZSkgJiYgIkRpZCBub3QgZmluZCBiYXNlISIpOworCisgICAgcmV0dXJuIENYWEluZm8tPkJhc2VPZmZzZXRzW0Jhc2VdOworICB9CisKKyAgLy8vIGdldFZCYXNlQ2xhc3NPZmZzZXQgLSBHZXQgdGhlIG9mZnNldCwgaW4gY2hhcnMsIGZvciB0aGUgZ2l2ZW4gYmFzZSBjbGFzcy4KKyAgQ2hhclVuaXRzIGdldFZCYXNlQ2xhc3NPZmZzZXQoY29uc3QgQ1hYUmVjb3JkRGVjbCAqVkJhc2UpIGNvbnN0IHsKKyAgICBhc3NlcnQoQ1hYSW5mbyAmJiAiUmVjb3JkIGxheW91dCBkb2VzIG5vdCBoYXZlIEMrKyBzcGVjaWZpYyBpbmZvISIpOworICAgIGFzc2VydChDWFhJbmZvLT5WQmFzZU9mZnNldHMuY291bnQoVkJhc2UpICYmICJEaWQgbm90IGZpbmQgYmFzZSEiKTsKKworICAgIHJldHVybiBDWFhJbmZvLT5WQmFzZU9mZnNldHNbVkJhc2VdLlZCYXNlT2Zmc2V0OworICB9CisKKyAgQ2hhclVuaXRzIGdldFNpemVPZkxhcmdlc3RFbXB0eVN1Ym9iamVjdCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoQ1hYSW5mbyAmJiAiUmVjb3JkIGxheW91dCBkb2VzIG5vdCBoYXZlIEMrKyBzcGVjaWZpYyBpbmZvISIpOworICAgIHJldHVybiBDWFhJbmZvLT5TaXplT2ZMYXJnZXN0RW1wdHlTdWJvYmplY3Q7CisgIH0KKworICAvLy8gaGFzT3duVkZQdHIgLSBEb2VzIHRoaXMgY2xhc3MgcHJvdmlkZSBpdHMgb3duIHZpcnR1YWwtZnVuY3Rpb24KKyAgLy8vIHRhYmxlIHBvaW50ZXIsIHJhdGhlciB0aGFuIGluaGVyaXRpbmcgb25lIGZyb20gYSBwcmltYXJ5IGJhc2UKKyAgLy8vIGNsYXNzPyAgSWYgc28sIGl0IGlzIGF0IG9mZnNldCB6ZXJvLgorICAvLy8KKyAgLy8vIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBBQkkgaGFzIG5vIHByaW1hcnkgYmFzZSBjbGFzcywgbWVhbmluZworICAvLy8gdGhhdCBpdCBoYXMgbm8gYmFzZSBjbGFzc2VzIHRoYXQgYXJlIHN1aXRhYmxlIHVuZGVyIHRoZSBjb25kaXRpb25zCisgIC8vLyBvZiB0aGUgQUJJLgorICBib29sIGhhc093blZGUHRyKCkgY29uc3QgeworICAgIGFzc2VydChDWFhJbmZvICYmICJSZWNvcmQgbGF5b3V0IGRvZXMgbm90IGhhdmUgQysrIHNwZWNpZmljIGluZm8hIik7CisgICAgcmV0dXJuIENYWEluZm8tPkhhc093blZGUHRyOworICB9CisKKyAgLy8vIGhhc1ZGUHRyIC0gRG9lcyB0aGlzIGNsYXNzIGhhdmUgYSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIHBvaW50ZXIKKyAgLy8vIHRoYXQgY2FuIGJlIGV4dGVuZGVkIGJ5IGEgZGVyaXZlZCBjbGFzcz8gIFRoaXMgaXMgc3lub255bW91cyB3aXRoCisgIC8vLyB0aGlzIGNsYXNzIGhhdmluZyBhIFZGUHRyIGF0IG9mZnNldCB6ZXJvLgorICBib29sIGhhc0V4dGVuZGFibGVWRlB0cigpIGNvbnN0IHsKKyAgICBhc3NlcnQoQ1hYSW5mbyAmJiAiUmVjb3JkIGxheW91dCBkb2VzIG5vdCBoYXZlIEMrKyBzcGVjaWZpYyBpbmZvISIpOworICAgIHJldHVybiBDWFhJbmZvLT5IYXNFeHRlbmRhYmxlVkZQdHI7CisgIH0KKyAgCisgIC8vLyBoYXNPd25WQlB0ciAtIERvZXMgdGhpcyBjbGFzcyBwcm92aWRlIGl0cyBvd24gdmlydHVhbC1iYXNlCisgIC8vLyB0YWJsZSBwb2ludGVyLCByYXRoZXIgdGhhbiBpbmhlcml0aW5nIG9uZSBmcm9tIGEgcHJpbWFyeSBiYXNlCisgIC8vLyBjbGFzcz8KKyAgLy8vCisgIC8vLyBUaGlzIGltcGxpZXMgdGhhdCB0aGUgQUJJIGhhcyBubyBwcmltYXJ5IGJhc2UgY2xhc3MsIG1lYW5pbmcKKyAgLy8vIHRoYXQgaXQgaGFzIG5vIGJhc2UgY2xhc3NlcyB0aGF0IGFyZSBzdWl0YWJsZSB1bmRlciB0aGUgY29uZGl0aW9ucworICAvLy8gb2YgdGhlIEFCSS4KKyAgYm9vbCBoYXNPd25WQlB0cigpIGNvbnN0IHsKKyAgICBhc3NlcnQoQ1hYSW5mbyAmJiAiUmVjb3JkIGxheW91dCBkb2VzIG5vdCBoYXZlIEMrKyBzcGVjaWZpYyBpbmZvISIpOworICAgIHJldHVybiBoYXNWQlB0cigpICYmICFDWFhJbmZvLT5CYXNlU2hhcmluZ1ZCUHRyOworICB9CisKKyAgLy8vIGhhc1ZCUHRyIC0gRG9lcyB0aGlzIGNsYXNzIGhhdmUgYSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIHBvaW50ZXIuCisgIGJvb2wgaGFzVkJQdHIoKSBjb25zdCB7CisgICAgYXNzZXJ0KENYWEluZm8gJiYgIlJlY29yZCBsYXlvdXQgZG9lcyBub3QgaGF2ZSBDKysgc3BlY2lmaWMgaW5mbyEiKTsKKyAgICByZXR1cm4gIUNYWEluZm8tPlZCUHRyT2Zmc2V0LmlzTmVnYXRpdmUoKTsKKyAgfQorCisgIENoYXJVbml0cyBnZXRSZXF1aXJlZEFsaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVxdWlyZWRBbGlnbm1lbnQ7CisgIH0KKworICBib29sIGVuZHNXaXRoWmVyb1NpemVkT2JqZWN0KCkgY29uc3QgeworICAgIHJldHVybiBDWFhJbmZvICYmIENYWEluZm8tPkVuZHNXaXRoWmVyb1NpemVkT2JqZWN0OworICB9CisKKyAgYm9vbCBsZWFkc1dpdGhaZXJvU2l6ZWRCYXNlKCkgY29uc3QgeworICAgIGFzc2VydChDWFhJbmZvICYmICJSZWNvcmQgbGF5b3V0IGRvZXMgbm90IGhhdmUgQysrIHNwZWNpZmljIGluZm8hIik7CisgICAgcmV0dXJuIENYWEluZm8tPkxlYWRzV2l0aFplcm9TaXplZEJhc2U7CisgIH0KKworICAvLy8gZ2V0VkJQdHJPZmZzZXQgLSBHZXQgdGhlIG9mZnNldCBmb3IgdmlydHVhbCBiYXNlIHRhYmxlIHBvaW50ZXIuCisgIC8vLyBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aXRoIHRoZSBNaWNyb3NvZnQgQUJJLgorICBDaGFyVW5pdHMgZ2V0VkJQdHJPZmZzZXQoKSBjb25zdCB7CisgICAgYXNzZXJ0KENYWEluZm8gJiYgIlJlY29yZCBsYXlvdXQgZG9lcyBub3QgaGF2ZSBDKysgc3BlY2lmaWMgaW5mbyEiKTsKKyAgICByZXR1cm4gQ1hYSW5mby0+VkJQdHJPZmZzZXQ7CisgIH0KKworICBjb25zdCBDWFhSZWNvcmREZWNsICpnZXRCYXNlU2hhcmluZ1ZCUHRyKCkgY29uc3QgeworICAgIGFzc2VydChDWFhJbmZvICYmICJSZWNvcmQgbGF5b3V0IGRvZXMgbm90IGhhdmUgQysrIHNwZWNpZmljIGluZm8hIik7CisgICAgcmV0dXJuIENYWEluZm8tPkJhc2VTaGFyaW5nVkJQdHI7CisgIH0KKworICBjb25zdCBWQmFzZU9mZnNldHNNYXBUeSAmZ2V0VkJhc2VPZmZzZXRzTWFwKCkgY29uc3QgeworICAgIGFzc2VydChDWFhJbmZvICYmICJSZWNvcmQgbGF5b3V0IGRvZXMgbm90IGhhdmUgQysrIHNwZWNpZmljIGluZm8hIik7CisgICAgcmV0dXJuIENYWEluZm8tPlZCYXNlT2Zmc2V0czsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUX1JFQ09SRExBWU9VVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvUmVjdXJzaXZlQVNUVmlzaXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1JlY3Vyc2l2ZUFTVFZpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTc2ZWEwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1JlY3Vyc2l2ZUFTVFZpc2l0b3IuaApAQCAtMCwwICsxLDMyMzEgQEAKKy8vPT09LS0tIFJlY3Vyc2l2ZUFTVFZpc2l0b3IuaCAtIFJlY3Vyc2l2ZSBBU1QgVmlzaXRvciAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBSZWN1cnNpdmVBU1RWaXNpdG9yIGludGVyZmFjZSwgd2hpY2ggcmVjdXJzaXZlbHkKKy8vICB0cmF2ZXJzZXMgdGhlIGVudGlyZSBBU1QuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfUkVDVVJTSVZFQVNUVklTSVRPUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX1JFQ1VSU0lWRUFTVFZJU0lUT1JfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0F0dHIuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsYXJhdGlvbk5hbWUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbEJhc2UuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbENYWC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsRnJpZW5kLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xPYmpDLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xPcGVuTVAuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbFRlbXBsYXRlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHIuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXhwckNYWC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByT2JqQy5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByT3Blbk1QLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0xhbWJkYUNhcHR1cmUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvTmVzdGVkTmFtZVNwZWNpZmllci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9PcGVuTVBDbGF1c2UuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10Q1hYLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXRPYmpDLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXRPcGVuTVAuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVGVtcGxhdGVCYXNlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1RlbXBsYXRlTmFtZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGVMb2MuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3Blbk1QS2luZHMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9TcGVjaWZpZXJzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIFRoZSBmb2xsb3dpbmcgdGhyZWUgbWFjcm9zIGFyZSB1c2VkIGZvciBtZXRhIHByb2dyYW1taW5nLiAgVGhlIGNvZGUKKy8vIHVzaW5nIHRoZW0gaXMgcmVzcG9uc2libGUgZm9yIGRlZmluaW5nIG1hY3JvIE9QRVJBVE9SKCkuCisKKy8vIEFsbCB1bmFyeSBvcGVyYXRvcnMuCisjZGVmaW5lIFVOQVJZT1BfTElTVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUEVSQVRPUihQb3N0SW5jKSBPUEVSQVRPUihQb3N0RGVjKSBPUEVSQVRPUihQcmVJbmMpIE9QRVJBVE9SKFByZURlYykgICAgICAgIFwKKyAgICAgIE9QRVJBVE9SKEFkZHJPZikgT1BFUkFUT1IoRGVyZWYpIE9QRVJBVE9SKFBsdXMpIE9QRVJBVE9SKE1pbnVzKSAgICAgICAgICBcCisgICAgICBPUEVSQVRPUihOb3QpIE9QRVJBVE9SKExOb3QpIE9QRVJBVE9SKFJlYWwpIE9QRVJBVE9SKEltYWcpICAgICAgICAgICAgICAgXAorICAgICAgT1BFUkFUT1IoRXh0ZW5zaW9uKSBPUEVSQVRPUihDb2F3YWl0KQorCisvLyBBbGwgYmluYXJ5IG9wZXJhdG9ycyAoZXhjbHVkaW5nIGNvbXBvdW5kIGFzc2lnbiBvcGVyYXRvcnMpLgorI2RlZmluZSBCSU5PUF9MSVNUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BFUkFUT1IoUHRyTWVtRCkgT1BFUkFUT1IoUHRyTWVtSSkgT1BFUkFUT1IoTXVsKSBPUEVSQVRPUihEaXYpICAgICAgICAgICAgICBcCisgICAgICBPUEVSQVRPUihSZW0pIE9QRVJBVE9SKEFkZCkgT1BFUkFUT1IoU3ViKSBPUEVSQVRPUihTaGwpIE9QRVJBVE9SKFNocikgICAgXAorICAgICAgT1BFUkFUT1IoTFQpIE9QRVJBVE9SKEdUKSBPUEVSQVRPUihMRSkgT1BFUkFUT1IoR0UpIE9QRVJBVE9SKEVRKSAgICAgICAgIFwKKyAgICAgIE9QRVJBVE9SKE5FKSBPUEVSQVRPUihDbXApIE9QRVJBVE9SKEFuZCkgT1BFUkFUT1IoWG9yKSBPUEVSQVRPUihPcikgICAgICBcCisgICAgICBPUEVSQVRPUihMQW5kKSBPUEVSQVRPUihMT3IpIE9QRVJBVE9SKEFzc2lnbikgT1BFUkFUT1IoQ29tbWEpCisKKy8vIEFsbCBjb21wb3VuZCBhc3NpZ24gb3BlcmF0b3JzLgorI2RlZmluZSBDQU9fTElTVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BFUkFUT1IoTXVsKSBPUEVSQVRPUihEaXYpIE9QRVJBVE9SKFJlbSkgT1BFUkFUT1IoQWRkKSBPUEVSQVRPUihTdWIpICAgICAgICBcCisgICAgICBPUEVSQVRPUihTaGwpIE9QRVJBVE9SKFNocikgT1BFUkFUT1IoQW5kKSBPUEVSQVRPUihPcikgT1BFUkFUT1IoWG9yKQorCituYW1lc3BhY2UgY2xhbmcgeworCisvLyBBIGhlbHBlciBtYWNybyB0byBpbXBsZW1lbnQgc2hvcnQtY2lyY3VpdGluZyB3aGVuIHJlY3Vyc2luZy4gIEl0CisvLyBpbnZva2VzIENBTExfRVhQUiwgd2hpY2ggbXVzdCBiZSBhIG1ldGhvZCBjYWxsLCBvbiB0aGUgZGVyaXZlZAorLy8gb2JqZWN0IChzLnQuIGEgdXNlciBvZiBSZWN1cnNpdmVBU1RWaXNpdG9yIGNhbiBvdmVycmlkZSB0aGUgbWV0aG9kCisvLyBpbiBDQUxMX0VYUFIpLgorI2RlZmluZSBUUllfVE8oQ0FMTF9FWFBSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFnZXREZXJpdmVkKCkuQ0FMTF9FWFBSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoZmFsc2UpCisKKy8vLyBcYnJpZWYgQSBjbGFzcyB0aGF0IGRvZXMgcHJlb3JkZXIgb3IgcG9zdG9yZGVyCisvLy8gZGVwdGgtZmlyc3QgdHJhdmVyc2FsIG9uIHRoZSBlbnRpcmUgQ2xhbmcgQVNUIGFuZCB2aXNpdHMgZWFjaCBub2RlLgorLy8vCisvLy8gVGhpcyBjbGFzcyBwZXJmb3JtcyB0aHJlZSBkaXN0aW5jdCB0YXNrczoKKy8vLyAgIDEuIHRyYXZlcnNlIHRoZSBBU1QgKGkuZS4gZ28gdG8gZWFjaCBub2RlKTsKKy8vLyAgIDIuIGF0IGEgZ2l2ZW4gbm9kZSwgd2FsayB1cCB0aGUgY2xhc3MgaGllcmFyY2h5LCBzdGFydGluZyBmcm9tCisvLy8gICAgICB0aGUgbm9kZSdzIGR5bmFtaWMgdHlwZSwgdW50aWwgdGhlIHRvcC1tb3N0IGNsYXNzIChlLmcuIFN0bXQsCisvLy8gICAgICBEZWNsLCBvciBUeXBlKSBpcyByZWFjaGVkLgorLy8vICAgMy4gZ2l2ZW4gYSAobm9kZSwgY2xhc3MpIGNvbWJpbmF0aW9uLCB3aGVyZSAnY2xhc3MnIGlzIHNvbWUgYmFzZQorLy8vICAgICAgY2xhc3Mgb2YgdGhlIGR5bmFtaWMgdHlwZSBvZiAnbm9kZScsIGNhbGwgYSB1c2VyLW92ZXJyaWRhYmxlCisvLy8gICAgICBmdW5jdGlvbiB0byBhY3R1YWxseSB2aXNpdCB0aGUgbm9kZS4KKy8vLworLy8vIFRoZXNlIHRhc2tzIGFyZSBkb25lIGJ5IHRocmVlIGdyb3VwcyBvZiBtZXRob2RzLCByZXNwZWN0aXZlbHk6CisvLy8gICAxLiBUcmF2ZXJzZURlY2woRGVjbCAqeCkgZG9lcyB0YXNrICMxLiAgSXQgaXMgdGhlIGVudHJ5IHBvaW50CisvLy8gICAgICBmb3IgdHJhdmVyc2luZyBhbiBBU1Qgcm9vdGVkIGF0IHguICBUaGlzIG1ldGhvZCBzaW1wbHkKKy8vLyAgICAgIGRpc3BhdGNoZXMgKGkuZS4gZm9yd2FyZHMpIHRvIFRyYXZlcnNlRm9vKEZvbyAqeCkgd2hlcmUgRm9vCisvLy8gICAgICBpcyB0aGUgZHluYW1pYyB0eXBlIG9mICp4LCB3aGljaCBjYWxscyBXYWxrVXBGcm9tRm9vKHgpIGFuZAorLy8vICAgICAgdGhlbiByZWN1cnNpdmVseSB2aXNpdHMgdGhlIGNoaWxkIG5vZGVzIG9mIHguCisvLy8gICAgICBUcmF2ZXJzZVN0bXQoU3RtdCAqeCkgYW5kIFRyYXZlcnNlVHlwZShRdWFsVHlwZSB4KSB3b3JrCisvLy8gICAgICBzaW1pbGFybHkuCisvLy8gICAyLiBXYWxrVXBGcm9tRm9vKEZvbyAqeCkgZG9lcyB0YXNrICMyLiAgSXQgZG9lcyBub3QgdHJ5IHRvIHZpc2l0CisvLy8gICAgICBhbnkgY2hpbGQgbm9kZSBvZiB4LiAgSW5zdGVhZCwgaXQgZmlyc3QgY2FsbHMgV2Fsa1VwRnJvbUJhcih4KQorLy8vICAgICAgd2hlcmUgQmFyIGlzIHRoZSBkaXJlY3QgcGFyZW50IGNsYXNzIG9mIEZvbyAodW5sZXNzIEZvbyBoYXMKKy8vLyAgICAgIG5vIHBhcmVudCksIGFuZCB0aGVuIGNhbGxzIFZpc2l0Rm9vKHgpIChzZWUgdGhlIG5leHQgbGlzdCBpdGVtKS4KKy8vLyAgIDMuIFZpc2l0Rm9vKEZvbyAqeCkgZG9lcyB0YXNrICMzLgorLy8vCisvLy8gVGhlc2UgdGhyZWUgbWV0aG9kIGdyb3VwcyBhcmUgdGllcmVkIChUcmF2ZXJzZSogPiBXYWxrVXBGcm9tKiA+CisvLy8gVmlzaXQqKS4gIEEgbWV0aG9kIChlLmcuIFRyYXZlcnNlKikgbWF5IGNhbGwgbWV0aG9kcyBmcm9tIHRoZSBzYW1lCisvLy8gdGllciAoZS5nLiBvdGhlciBUcmF2ZXJzZSopIG9yIG9uZSB0aWVyIGxvd2VyIChlLmcuIFdhbGtVcEZyb20qKS4KKy8vLyBJdCBtYXkgbm90IGNhbGwgbWV0aG9kcyBmcm9tIGEgaGlnaGVyIHRpZXIuCisvLy8KKy8vLyBOb3RlIHRoYXQgc2luY2UgV2Fsa1VwRnJvbUZvbygpIGNhbGxzIFdhbGtVcEZyb21CYXIoKSAod2hlcmUgQmFyCisvLy8gaXMgRm9vJ3Mgc3VwZXIgY2xhc3MpIGJlZm9yZSBjYWxsaW5nIFZpc2l0Rm9vKCksIHRoZSByZXN1bHQgaXMKKy8vLyB0aGF0IHRoZSBWaXNpdCooKSBtZXRob2RzIGZvciBhIGdpdmVuIG5vZGUgYXJlIGNhbGxlZCBpbiB0aGUKKy8vLyB0b3AtZG93biBvcmRlciAoZS5nLiBmb3IgYSBub2RlIG9mIHR5cGUgTmFtZXNwYWNlRGVjbCwgdGhlIG9yZGVyIHdpbGwKKy8vLyBiZSBWaXNpdERlY2woKSwgVmlzaXROYW1lZERlY2woKSwgYW5kIHRoZW4gVmlzaXROYW1lc3BhY2VEZWNsKCkpLgorLy8vCisvLy8gVGhpcyBzY2hlbWUgZ3VhcmFudGVlcyB0aGF0IGFsbCBWaXNpdCooKSBjYWxscyBmb3IgdGhlIHNhbWUgQVNUCisvLy8gbm9kZSBhcmUgZ3JvdXBlZCB0b2dldGhlci4gIEluIG90aGVyIHdvcmRzLCBWaXNpdCooKSBtZXRob2RzIGZvcgorLy8vIGRpZmZlcmVudCBub2RlcyBhcmUgbmV2ZXIgaW50ZXJsZWF2ZWQuCisvLy8KKy8vLyBDbGllbnRzIG9mIHRoaXMgdmlzaXRvciBzaG91bGQgc3ViY2xhc3MgdGhlIHZpc2l0b3IgKHByb3ZpZGluZworLy8vIHRoZW1zZWx2ZXMgYXMgdGhlIHRlbXBsYXRlIGFyZ3VtZW50LCB1c2luZyB0aGUgY3VyaW91c2x5IHJlY3VycmluZworLy8vIHRlbXBsYXRlIHBhdHRlcm4pIGFuZCBvdmVycmlkZSBhbnkgb2YgdGhlIFRyYXZlcnNlKiwgV2Fsa1VwRnJvbSosCisvLy8gYW5kIFZpc2l0KiBtZXRob2RzIGZvciBkZWNsYXJhdGlvbnMsIHR5cGVzLCBzdGF0ZW1lbnRzLAorLy8vIGV4cHJlc3Npb25zLCBvciBvdGhlciBBU1Qgbm9kZXMgd2hlcmUgdGhlIHZpc2l0b3Igc2hvdWxkIGN1c3RvbWl6ZQorLy8vIGJlaGF2aW9yLiAgTW9zdCB1c2VycyBvbmx5IG5lZWQgdG8gb3ZlcnJpZGUgVmlzaXQqLiAgQWR2YW5jZWQKKy8vLyB1c2VycyBtYXkgb3ZlcnJpZGUgVHJhdmVyc2UqIGFuZCBXYWxrVXBGcm9tKiB0byBpbXBsZW1lbnQgY3VzdG9tCisvLy8gdHJhdmVyc2FsIHN0cmF0ZWdpZXMuICBSZXR1cm5pbmcgZmFsc2UgZnJvbSBvbmUgb2YgdGhlc2Ugb3ZlcnJpZGRlbgorLy8vIGZ1bmN0aW9ucyB3aWxsIGFib3J0IHRoZSBlbnRpcmUgdHJhdmVyc2FsLgorLy8vCisvLy8gQnkgZGVmYXVsdCwgdGhpcyB2aXNpdG9yIHRyaWVzIHRvIHZpc2l0IGV2ZXJ5IHBhcnQgb2YgdGhlIGV4cGxpY2l0CisvLy8gc291cmNlIGNvZGUgZXhhY3RseSBvbmNlLiAgVGhlIGRlZmF1bHQgcG9saWN5IHRvd2FyZHMgdGVtcGxhdGVzCisvLy8gaXMgdG8gZGVzY2VuZCBpbnRvIHRoZSAncGF0dGVybicgY2xhc3Mgb3IgZnVuY3Rpb24gYm9keSwgbm90IGFueQorLy8vIGV4cGxpY2l0IG9yIGltcGxpY2l0IGluc3RhbnRpYXRpb25zLiAgRXhwbGljaXQgc3BlY2lhbGl6YXRpb25zCisvLy8gYXJlIHN0aWxsIHZpc2l0ZWQsIGFuZCB0aGUgcGF0dGVybnMgb2YgcGFydGlhbCBzcGVjaWFsaXphdGlvbnMKKy8vLyBhcmUgdmlzaXRlZCBzZXBhcmF0ZWx5LiAgVGhpcyBiZWhhdmlvciBjYW4gYmUgY2hhbmdlZCBieQorLy8vIG92ZXJyaWRpbmcgc2hvdWxkVmlzaXRUZW1wbGF0ZUluc3RhbnRpYXRpb25zKCkgaW4gdGhlIGRlcml2ZWQgY2xhc3MKKy8vLyB0byByZXR1cm4gdHJ1ZSwgaW4gd2hpY2ggY2FzZSBhbGwga25vd24gaW1wbGljaXQgYW5kIGV4cGxpY2l0CisvLy8gaW5zdGFudGlhdGlvbnMgd2lsbCBiZSB2aXNpdGVkIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIHBhdHRlcm4KKy8vLyBmcm9tIHdoaWNoIHRoZXkgd2VyZSBwcm9kdWNlZC4KKy8vLworLy8vIEJ5IGRlZmF1bHQsIHRoaXMgdmlzaXRvciBwcmVvcmRlciB0cmF2ZXJzZXMgdGhlIEFTVC4gSWYgcG9zdG9yZGVyIHRyYXZlcnNhbAorLy8vIGlzIG5lZWRlZCwgdGhlIFxjIHNob3VsZFRyYXZlcnNlUG9zdE9yZGVyIG1ldGhvZCBuZWVkcyB0byBiZSBvdmVycmlkZW4KKy8vLyB0byByZXR1cm4gXGMgdHJ1ZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBSZWN1cnNpdmVBU1RWaXNpdG9yIHsKK3B1YmxpYzoKKyAgLy8vIEEgcXVldWUgdXNlZCBmb3IgcGVyZm9ybWluZyBkYXRhIHJlY3Vyc2lvbiBvdmVyIHN0YXRlbWVudHMuCisgIC8vLyBQYXJhbWV0ZXJzIGludm9sdmluZyB0aGlzIHR5cGUgYXJlIHVzZWQgdG8gaW1wbGVtZW50IGRhdGEKKyAgLy8vIHJlY3Vyc2lvbiBvdmVyIFN0bXRzIGFuZCBFeHBycyB3aXRoaW4gdGhpcyBjbGFzcywgYW5kIHNob3VsZAorICAvLy8gdHlwaWNhbGx5IG5vdCBiZSBleHBsaWNpdGx5IHNwZWNpZmllZCBieSBkZXJpdmVkIGNsYXNzZXMuCisgIC8vLyBUaGUgYm9vbCBiaXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0YXRlbWVudCBoYXMgYmVlbiB0cmF2ZXJzZWQgb3Igbm90LgorICB0eXBlZGVmIFNtYWxsVmVjdG9ySW1wbDxsbHZtOjpQb2ludGVySW50UGFpcjxTdG10ICosIDEsIGJvb2w+PgorICAgIERhdGFSZWN1cnNpb25RdWV1ZTsKKworICAvLy8gXGJyaWVmIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgZGVyaXZlZCBjbGFzcy4KKyAgRGVyaXZlZCAmZ2V0RGVyaXZlZCgpIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxEZXJpdmVkICo+KHRoaXMpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gd2hldGhlciB0aGlzIHZpc2l0b3Igc2hvdWxkIHJlY3Vyc2UgaW50bworICAvLy8gdGVtcGxhdGUgaW5zdGFudGlhdGlvbnMuCisgIGJvb2wgc2hvdWxkVmlzaXRUZW1wbGF0ZUluc3RhbnRpYXRpb25zKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB3aGV0aGVyIHRoaXMgdmlzaXRvciBzaG91bGQgcmVjdXJzZSBpbnRvIHRoZSB0eXBlcyBvZgorICAvLy8gVHlwZUxvY3MuCisgIGJvb2wgc2hvdWxkV2Fsa1R5cGVzT2ZUeXBlTG9jcygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB3aGV0aGVyIHRoaXMgdmlzaXRvciBzaG91bGQgcmVjdXJzZSBpbnRvIGltcGxpY2l0CisgIC8vLyBjb2RlLCBlLmcuLCBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLgorICBib29sIHNob3VsZFZpc2l0SW1wbGljaXRDb2RlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB3aGV0aGVyIHRoaXMgdmlzaXRvciBzaG91bGQgdHJhdmVyc2UgcG9zdC1vcmRlci4KKyAgYm9vbCBzaG91bGRUcmF2ZXJzZVBvc3RPcmRlcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFxicmllZiBSZWN1cnNpdmVseSB2aXNpdCBhIHN0YXRlbWVudCBvciBleHByZXNzaW9uLCBieQorICAvLy8gZGlzcGF0Y2hpbmcgdG8gVHJhdmVyc2UqKCkgYmFzZWQgb24gdGhlIGFyZ3VtZW50J3MgZHluYW1pYyB0eXBlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGZhbHNlIGlmIHRoZSB2aXNpdGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGVhcmx5LCB0cnVlCisgIC8vLyBvdGhlcndpc2UgKGluY2x1ZGluZyB3aGVuIHRoZSBhcmd1bWVudCBpcyBudWxscHRyKS4KKyAgYm9vbCBUcmF2ZXJzZVN0bXQoU3RtdCAqUywgRGF0YVJlY3Vyc2lvblF1ZXVlICpRdWV1ZSA9IG51bGxwdHIpOworCisgIC8vLyBJbnZva2VkIGJlZm9yZSB2aXNpdGluZyBhIHN0YXRlbWVudCBvciBleHByZXNzaW9uIHZpYSBkYXRhIHJlY3Vyc2lvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSB0byBza2lwIHZpc2l0aW5nIHRoZSBub2RlLCB0cnVlIG90aGVyd2lzZS4KKyAgYm9vbCBkYXRhVHJhdmVyc2VTdG10UHJlKFN0bXQgKlMpIHsgcmV0dXJuIHRydWU7IH0KKworICAvLy8gSW52b2tlZCBhZnRlciB2aXNpdGluZyBhIHN0YXRlbWVudCBvciBleHByZXNzaW9uIHZpYSBkYXRhIHJlY3Vyc2lvbi4KKyAgLy8vIFRoaXMgaXMgbm90IGludm9rZWQgaWYgdGhlIHByZXZpb3VzbHkgaW52b2tlZCBcYyBkYXRhVHJhdmVyc2VTdG10UHJlCisgIC8vLyByZXR1cm5lZCBmYWxzZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZSBvdGhlcndpc2UuCisgIGJvb2wgZGF0YVRyYXZlcnNlU3RtdFBvc3QoU3RtdCAqUykgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgYSB0eXBlLCBieSBkaXNwYXRjaGluZyB0bworICAvLy8gVHJhdmVyc2UqVHlwZSgpIGJhc2VkIG9uIHRoZSBhcmd1bWVudCdzIGdldFR5cGVDbGFzcygpIHByb3BlcnR5LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGZhbHNlIGlmIHRoZSB2aXNpdGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGVhcmx5LCB0cnVlCisgIC8vLyBvdGhlcndpc2UgKGluY2x1ZGluZyB3aGVuIHRoZSBhcmd1bWVudCBpcyBhIE51bGwgdHlwZSkuCisgIGJvb2wgVHJhdmVyc2VUeXBlKFF1YWxUeXBlIFQpOworCisgIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgYSB0eXBlIHdpdGggbG9jYXRpb24sIGJ5IGRpc3BhdGNoaW5nIHRvCisgIC8vLyBUcmF2ZXJzZSpUeXBlTG9jKCkgYmFzZWQgb24gdGhlIGFyZ3VtZW50IHR5cGUncyBnZXRUeXBlQ2xhc3MoKSBwcm9wZXJ0eS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZQorICAvLy8gb3RoZXJ3aXNlIChpbmNsdWRpbmcgd2hlbiB0aGUgYXJndW1lbnQgaXMgYSBOdWxsIHR5cGUgbG9jYXRpb24pLgorICBib29sIFRyYXZlcnNlVHlwZUxvYyhUeXBlTG9jIFRMKTsKKworICAvLy8gXGJyaWVmIFJlY3Vyc2l2ZWx5IHZpc2l0IGFuIGF0dHJpYnV0ZSwgYnkgZGlzcGF0Y2hpbmcgdG8KKyAgLy8vIFRyYXZlcnNlKkF0dHIoKSBiYXNlZCBvbiB0aGUgYXJndW1lbnQncyBkeW5hbWljIHR5cGUuCisgIC8vLworICAvLy8gXHJldHVybnMgZmFsc2UgaWYgdGhlIHZpc2l0YXRpb24gd2FzIHRlcm1pbmF0ZWQgZWFybHksIHRydWUKKyAgLy8vIG90aGVyd2lzZSAoaW5jbHVkaW5nIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgTnVsbCB0eXBlIGxvY2F0aW9uKS4KKyAgYm9vbCBUcmF2ZXJzZUF0dHIoQXR0ciAqQXQpOworCisgIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgYSBkZWNsYXJhdGlvbiwgYnkgZGlzcGF0Y2hpbmcgdG8KKyAgLy8vIFRyYXZlcnNlKkRlY2woKSBiYXNlZCBvbiB0aGUgYXJndW1lbnQncyBkeW5hbWljIHR5cGUuCisgIC8vLworICAvLy8gXHJldHVybnMgZmFsc2UgaWYgdGhlIHZpc2l0YXRpb24gd2FzIHRlcm1pbmF0ZWQgZWFybHksIHRydWUKKyAgLy8vIG90aGVyd2lzZSAoaW5jbHVkaW5nIHdoZW4gdGhlIGFyZ3VtZW50IGlzIE5VTEwpLgorICBib29sIFRyYXZlcnNlRGVjbChEZWNsICpEKTsKKworICAvLy8gXGJyaWVmIFJlY3Vyc2l2ZWx5IHZpc2l0IGEgQysrIG5lc3RlZC1uYW1lLXNwZWNpZmllci4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZSBvdGhlcndpc2UuCisgIGJvb2wgVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyKE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUyk7CisKKyAgLy8vIFxicmllZiBSZWN1cnNpdmVseSB2aXNpdCBhIEMrKyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgd2l0aCBsb2NhdGlvbgorICAvLy8gaW5mb3JtYXRpb24uCisgIC8vLworICAvLy8gXHJldHVybnMgZmFsc2UgaWYgdGhlIHZpc2l0YXRpb24gd2FzIHRlcm1pbmF0ZWQgZWFybHksIHRydWUgb3RoZXJ3aXNlLgorICBib29sIFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIE5OUyk7CisKKyAgLy8vIFxicmllZiBSZWN1cnNpdmVseSB2aXNpdCBhIG5hbWUgd2l0aCBpdHMgbG9jYXRpb24gaW5mb3JtYXRpb24uCisgIC8vLworICAvLy8gXHJldHVybnMgZmFsc2UgaWYgdGhlIHZpc2l0YXRpb24gd2FzIHRlcm1pbmF0ZWQgZWFybHksIHRydWUgb3RoZXJ3aXNlLgorICBib29sIFRyYXZlcnNlRGVjbGFyYXRpb25OYW1lSW5mbyhEZWNsYXJhdGlvbk5hbWVJbmZvIE5hbWVJbmZvKTsKKworICAvLy8gXGJyaWVmIFJlY3Vyc2l2ZWx5IHZpc2l0IGEgdGVtcGxhdGUgbmFtZSBhbmQgZGlzcGF0Y2ggdG8gdGhlCisgIC8vLyBhcHByb3ByaWF0ZSBtZXRob2QuCisgIC8vLworICAvLy8gXHJldHVybnMgZmFsc2UgaWYgdGhlIHZpc2l0YXRpb24gd2FzIHRlcm1pbmF0ZWQgZWFybHksIHRydWUgb3RoZXJ3aXNlLgorICBib29sIFRyYXZlcnNlVGVtcGxhdGVOYW1lKFRlbXBsYXRlTmFtZSBUZW1wbGF0ZSk7CisKKyAgLy8vIFxicmllZiBSZWN1cnNpdmVseSB2aXNpdCBhIHRlbXBsYXRlIGFyZ3VtZW50IGFuZCBkaXNwYXRjaCB0byB0aGUKKyAgLy8vIGFwcHJvcHJpYXRlIG1ldGhvZCBmb3IgdGhlIGFyZ3VtZW50IHR5cGUuCisgIC8vLworICAvLy8gXHJldHVybnMgZmFsc2UgaWYgdGhlIHZpc2l0YXRpb24gd2FzIHRlcm1pbmF0ZWQgZWFybHksIHRydWUgb3RoZXJ3aXNlLgorICAvLyBGSVhNRTogbWlncmF0ZSBjYWxsZXJzIHRvIFRlbXBsYXRlQXJndW1lbnRMb2MgaW5zdGVhZC4KKyAgYm9vbCBUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnQoY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmQXJnKTsKKworICAvLy8gXGJyaWVmIFJlY3Vyc2l2ZWx5IHZpc2l0IGEgdGVtcGxhdGUgYXJndW1lbnQgbG9jYXRpb24gYW5kIGRpc3BhdGNoIHRvIHRoZQorICAvLy8gYXBwcm9wcmlhdGUgbWV0aG9kIGZvciB0aGUgYXJndW1lbnQgdHlwZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZSBvdGhlcndpc2UuCisgIGJvb2wgVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jKGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMb2MgJkFyZ0xvYyk7CisKKyAgLy8vIFxicmllZiBSZWN1cnNpdmVseSB2aXNpdCBhIHNldCBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMuCisgIC8vLyBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MsIGJ1dCBpdCdzIG5vdCBleHBlY3RlZCB0aGF0CisgIC8vLyB3aWxsIGJlIG5lZWRlZCAtLSB0aGlzIHZpc2l0b3IgYWx3YXlzIGRpc3BhdGNoZXMgdG8gYW5vdGhlci4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZSBvdGhlcndpc2UuCisgIC8vIEZJWE1FOiB0YWtlIGEgVGVtcGxhdGVBcmd1bWVudExvYyogKG9yIFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbykgaW5zdGVhZC4KKyAgYm9vbCBUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRzKGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgKkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1BcmdzKTsKKworICAvLy8gXGJyaWVmIFJlY3Vyc2l2ZWx5IHZpc2l0IGEgYmFzZSBzcGVjaWZpZXIuIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYQorICAvLy8gc3ViY2xhc3MuCisgIC8vLworICAvLy8gXHJldHVybnMgZmFsc2UgaWYgdGhlIHZpc2l0YXRpb24gd2FzIHRlcm1pbmF0ZWQgZWFybHksIHRydWUgb3RoZXJ3aXNlLgorICBib29sIFRyYXZlcnNlQ1hYQmFzZVNwZWNpZmllcihjb25zdCBDWFhCYXNlU3BlY2lmaWVyICZCYXNlKTsKKworICAvLy8gXGJyaWVmIFJlY3Vyc2l2ZWx5IHZpc2l0IGEgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXIuICBUaGlzCisgIC8vLyBhdXRvbWF0aWNhbGx5IGRpc3BhdGNoZXMgdG8gYW5vdGhlciB2aXNpdG9yIGZvciB0aGUgaW5pdGlhbGl6ZXIKKyAgLy8vIGV4cHJlc3Npb24sIGJ1dCBub3QgZm9yIHRoZSBuYW1lIG9mIHRoZSBpbml0aWFsaXplciwgc28gbWF5CisgIC8vLyBiZSBvdmVycmlkZGVuIGZvciBjbGllbnRzIHRoYXQgbmVlZCBhY2Nlc3MgdG8gdGhlIG5hbWUuCisgIC8vLworICAvLy8gXHJldHVybnMgZmFsc2UgaWYgdGhlIHZpc2l0YXRpb24gd2FzIHRlcm1pbmF0ZWQgZWFybHksIHRydWUgb3RoZXJ3aXNlLgorICBib29sIFRyYXZlcnNlQ29uc3RydWN0b3JJbml0aWFsaXplcihDWFhDdG9ySW5pdGlhbGl6ZXIgKkluaXQpOworCisgIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgYSBsYW1iZGEgY2FwdHVyZS4gXGMgSW5pdCBpcyB0aGUgZXhwcmVzc2lvbiB0aGF0CisgIC8vLyB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgY2FwdHVyZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZSBvdGhlcndpc2UuCisgIGJvb2wgVHJhdmVyc2VMYW1iZGFDYXB0dXJlKExhbWJkYUV4cHIgKkxFLCBjb25zdCBMYW1iZGFDYXB0dXJlICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpJbml0KTsKKworICAvLy8gXGJyaWVmIFJlY3Vyc2l2ZWx5IHZpc2l0IHRoZSBib2R5IG9mIGEgbGFtYmRhIGV4cHJlc3Npb24uCisgIC8vLworICAvLy8gVGhpcyBwcm92aWRlcyBhIGhvb2sgZm9yIHZpc2l0b3JzIHRoYXQgbmVlZCBtb3JlIGNvbnRleHQgd2hlbiB2aXNpdGluZworICAvLy8gXGMgTEUtPmdldEJvZHkoKS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZSBvdGhlcndpc2UuCisgIGJvb2wgVHJhdmVyc2VMYW1iZGFCb2R5KExhbWJkYUV4cHIgKkxFLCBEYXRhUmVjdXJzaW9uUXVldWUgKlF1ZXVlID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBSZWN1cnNpdmVseSB2aXNpdCB0aGUgc3ludGFjdGljIG9yIHNlbWFudGljIGZvcm0gb2YgYW4KKyAgLy8vIGluaXRpYWxpemF0aW9uIGxpc3QuCisgIC8vLworICAvLy8gXHJldHVybnMgZmFsc2UgaWYgdGhlIHZpc2l0YXRpb24gd2FzIHRlcm1pbmF0ZWQgZWFybHksIHRydWUgb3RoZXJ3aXNlLgorICBib29sIFRyYXZlcnNlU3luT3JTZW1Jbml0TGlzdEV4cHIoSW5pdExpc3RFeHByICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVJlY3Vyc2lvblF1ZXVlICpRdWV1ZSA9IG51bGxwdHIpOworCisgIC8vIC0tLS0gTWV0aG9kcyBvbiBBdHRycyAtLS0tCisKKyAgLy8gXGJyaWVmIFZpc2l0IGFuIGF0dHJpYnV0ZS4KKyAgYm9vbCBWaXNpdEF0dHIoQXR0ciAqQSkgeyByZXR1cm4gdHJ1ZTsgfQorCisvLyBEZWNsYXJlIFRyYXZlcnNlKiBhbmQgZW1wdHkgVmlzaXQqIGZvciBhbGwgQXR0ciBjbGFzc2VzLgorI2RlZmluZSBBVFRSX1ZJU0lUT1JfREVDTFNfT05MWQorI2luY2x1ZGUgImNsYW5nL0FTVC9BdHRyVmlzaXRvci5pbmMiCisjdW5kZWYgQVRUUl9WSVNJVE9SX0RFQ0xTX09OTFkKKworLy8gLS0tLSBNZXRob2RzIG9uIFN0bXRzIC0tLS0KKworICBTdG10OjpjaGlsZF9yYW5nZSBnZXRTdG10Q2hpbGRyZW4oU3RtdCAqUykgeyByZXR1cm4gUy0+Y2hpbGRyZW4oKTsgfQorCitwcml2YXRlOgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorICBzdHJ1Y3QgaGFzX3NhbWVfbWVtYmVyX3BvaW50ZXJfdHlwZSA6IHN0ZDo6ZmFsc2VfdHlwZSB7fTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgUiwgdHlwZW5hbWUuLi4gUD4KKyAgc3RydWN0IGhhc19zYW1lX21lbWJlcl9wb2ludGVyX3R5cGU8UiAoVDo6KikoUC4uLiksIFIgKFU6OiopKFAuLi4pPgorICAgICAgOiBzdGQ6OnRydWVfdHlwZSB7fTsKKworICAvLyBUcmF2ZXJzZSB0aGUgZ2l2ZW4gc3RhdGVtZW50LiBJZiB0aGUgbW9zdC1kZXJpdmVkIHRyYXZlcnNlIGZ1bmN0aW9uIHRha2VzIGEKKyAgLy8gZGF0YSByZWN1cnNpb24gcXVldWUsIHBhc3MgaXQgb247IG90aGVyd2lzZSwgZGlzY2FyZCBpdC4gTm90ZSB0aGF0IHRoZQorICAvLyBmaXJzdCBicmFuY2ggb2YgdGhpcyBjb25kaXRpb25hbCBtdXN0IGNvbXBpbGUgd2hldGhlciBvciBub3QgdGhlIGRlcml2ZWQKKyAgLy8gY2xhc3MgY2FuIHRha2UgYSBxdWV1ZSwgc28gaWYgd2UncmUgdGFraW5nIHRoZSBzZWNvbmQgYXJtLCBtYWtlIHRoZSBmaXJzdAorICAvLyBhcm0gY2FsbCBvdXIgZnVuY3Rpb24gcmF0aGVyIHRoYW4gdGhlIGRlcml2ZWQgY2xhc3MgdmVyc2lvbi4KKyNkZWZpbmUgVFJBVkVSU0VfU1RNVF9CQVNFKE5BTUUsIENMQVNTLCBWQVIsIFFVRVVFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChoYXNfc2FtZV9tZW1iZXJfcG9pbnRlcl90eXBlPGRlY2x0eXBlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlJlY3Vyc2l2ZUFTVFZpc2l0b3I6OlRyYXZlcnNlIyNOQU1FKSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbHR5cGUoJkRlcml2ZWQ6OlRyYXZlcnNlIyNOQU1FKT46OnZhbHVlICAgICBcCisgICAgICAgPyBzdGF0aWNfY2FzdDx0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIGhhc19zYW1lX21lbWJlcl9wb2ludGVyX3R5cGU8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgZGVjbHR5cGUoJlJlY3Vyc2l2ZUFTVFZpc2l0b3I6OlRyYXZlcnNlIyNOQU1FKSwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIGRlY2x0eXBlKCZEZXJpdmVkOjpUcmF2ZXJzZSMjTkFNRSk+Ojp2YWx1ZSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIERlcml2ZWQgJiwgUmVjdXJzaXZlQVNUVmlzaXRvciAmPjo6dHlwZT4oKnRoaXMpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAuVHJhdmVyc2UjI05BTUUoc3RhdGljX2Nhc3Q8Q0xBU1MgKj4oVkFSKSwgUVVFVUUpICAgICAgICAgICAgICAgICBcCisgICAgICAgOiBnZXREZXJpdmVkKCkuVHJhdmVyc2UjI05BTUUoc3RhdGljX2Nhc3Q8Q0xBU1MgKj4oVkFSKSkpCisKKy8vIFRyeSB0byB0cmF2ZXJzZSB0aGUgZ2l2ZW4gc3RhdGVtZW50LCBvciBlbnF1ZXVlIGl0IGlmIHdlJ3JlIHBlcmZvcm1pbmcgZGF0YQorLy8gcmVjdXJzaW9uIGluIHRoZSBtaWRkbGUgb2YgdHJhdmVyc2luZyBhbm90aGVyIHN0YXRlbWVudC4gQ2FuIG9ubHkgYmUgY2FsbGVkCisvLyBmcm9tIHdpdGhpbiBhIERFRl9UUkFWRVJTRV9TVE1UIGJvZHkgb3Igc2ltaWxhciBjb250ZXh0LgorI2RlZmluZSBUUllfVE9fVFJBVkVSU0VfT1JfRU5RVUVVRV9TVE1UKFMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFUUkFWRVJTRV9TVE1UX0JBU0UoU3RtdCwgU3RtdCwgUywgUXVldWUpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoZmFsc2UpCisKK3B1YmxpYzoKKy8vIERlY2xhcmUgVHJhdmVyc2UqKCkgZm9yIGFsbCBjb25jcmV0ZSBTdG10IGNsYXNzZXMuCisjZGVmaW5lIEFCU1RSQUNUX1NUTVQoU1RNVCkKKyNkZWZpbmUgU1RNVChDTEFTUywgUEFSRU5UKSBcCisgIGJvb2wgVHJhdmVyc2UjI0NMQVNTKENMQVNTICpTLCBEYXRhUmVjdXJzaW9uUXVldWUgKlF1ZXVlID0gbnVsbHB0cik7CisjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXROb2Rlcy5pbmMiCisgIC8vIFRoZSBhYm92ZSBoZWFkZXIgI3VuZGVmcyBBQlNUUkFDVF9TVE1UIGFuZCBTVE1UIHVwb24gZXhpdC4KKworICAvLyBEZWZpbmUgV2Fsa1VwRnJvbSooKSBhbmQgZW1wdHkgVmlzaXQqKCkgZm9yIGFsbCBTdG10IGNsYXNzZXMuCisgIGJvb2wgV2Fsa1VwRnJvbVN0bXQoU3RtdCAqUykgeyByZXR1cm4gZ2V0RGVyaXZlZCgpLlZpc2l0U3RtdChTKTsgfQorICBib29sIFZpc2l0U3RtdChTdG10ICpTKSB7IHJldHVybiB0cnVlOyB9CisjZGVmaW5lIFNUTVQoQ0xBU1MsIFBBUkVOVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29sIFdhbGtVcEZyb20jI0NMQVNTKENMQVNTICpTKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUUllfVE8oV2Fsa1VwRnJvbSMjUEFSRU5UKFMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFJZX1RPKFZpc2l0IyNDTEFTUyhTKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb2wgVmlzaXQjI0NMQVNTKENMQVNTICpTKSB7IHJldHVybiB0cnVlOyB9CisjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXROb2Rlcy5pbmMiCisKKy8vIERlZmluZSBUcmF2ZXJzZSooKSwgV2Fsa1VwRnJvbSooKSwgYW5kIFZpc2l0KigpIGZvciB1bmFyeQorLy8gb3BlcmF0b3IgbWV0aG9kcy4gIFVuYXJ5IG9wZXJhdG9ycyBhcmUgbm90IGNsYXNzZXMgaW4gdGhlbXNlbHZlcworLy8gKHRoZXkncmUgYWxsIG9wY29kZXMgaW4gVW5hcnlPcGVyYXRvcikgYnV0IGRvIGhhdmUgdmlzaXRvcnMuCisjZGVmaW5lIE9QRVJBVE9SKE5BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29sIFRyYXZlcnNlVW5hcnkjI05BTUUoVW5hcnlPcGVyYXRvciAqUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFSZWN1cnNpb25RdWV1ZSAqUXVldWUgPSBudWxscHRyKSB7ICAgICAgICAgICAgICBcCisgICAgaWYgKCFnZXREZXJpdmVkKCkuc2hvdWxkVHJhdmVyc2VQb3N0T3JkZXIoKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJZX1RPKFdhbGtVcEZyb21VbmFyeSMjTkFNRShTKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUUllfVE9fVFJBVkVSU0VfT1JfRU5RVUVVRV9TVE1UKFMtPmdldFN1YkV4cHIoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYm9vbCBXYWxrVXBGcm9tVW5hcnkjI05BTUUoVW5hcnlPcGVyYXRvciAqUykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFJZX1RPKFdhbGtVcEZyb21VbmFyeU9wZXJhdG9yKFMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRSWV9UTyhWaXNpdFVuYXJ5IyNOQU1FKFMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29sIFZpc2l0VW5hcnkjI05BTUUoVW5hcnlPcGVyYXRvciAqUykgeyByZXR1cm4gdHJ1ZTsgfQorCisgIFVOQVJZT1BfTElTVCgpCisjdW5kZWYgT1BFUkFUT1IKKworLy8gRGVmaW5lIFRyYXZlcnNlKigpLCBXYWxrVXBGcm9tKigpLCBhbmQgVmlzaXQqKCkgZm9yIGJpbmFyeQorLy8gb3BlcmF0b3IgbWV0aG9kcy4gIEJpbmFyeSBvcGVyYXRvcnMgYXJlIG5vdCBjbGFzc2VzIGluIHRoZW1zZWx2ZXMKKy8vICh0aGV5J3JlIGFsbCBvcGNvZGVzIGluIEJpbmFyeU9wZXJhdG9yKSBidXQgZG8gaGF2ZSB2aXNpdG9ycy4KKyNkZWZpbmUgR0VORVJBTF9CSU5PUF9GQUxMQkFDSyhOQU1FLCBCSU5PUF9UWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb2wgVHJhdmVyc2VCaW4jI05BTUUoQklOT1BfVFlQRSAqUywgRGF0YVJlY3Vyc2lvblF1ZXVlICpRdWV1ZSA9IG51bGxwdHIpIHsgXAorICAgIGlmICghZ2V0RGVyaXZlZCgpLnNob3VsZFRyYXZlcnNlUG9zdE9yZGVyKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSWV9UTyhXYWxrVXBGcm9tQmluIyNOQU1FKFMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFJZX1RPX1RSQVZFUlNFX09SX0VOUVVFVUVfU1RNVChTLT5nZXRMSFMoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRSWV9UT19UUkFWRVJTRV9PUl9FTlFVRVVFX1NUTVQoUy0+Z2V0UkhTKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29sIFdhbGtVcEZyb21CaW4jI05BTUUoQklOT1BfVFlQRSAqUykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUUllfVE8oV2Fsa1VwRnJvbSMjQklOT1BfVFlQRShTKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFJZX1RPKFZpc2l0QmluIyNOQU1FKFMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb2wgVmlzaXRCaW4jI05BTUUoQklOT1BfVFlQRSAqUykgeyByZXR1cm4gdHJ1ZTsgfQorCisjZGVmaW5lIE9QRVJBVE9SKE5BTUUpIEdFTkVSQUxfQklOT1BfRkFMTEJBQ0soTkFNRSwgQmluYXJ5T3BlcmF0b3IpCisgIEJJTk9QX0xJU1QoKQorI3VuZGVmIE9QRVJBVE9SCisKKy8vIERlZmluZSBUcmF2ZXJzZSooKSwgV2Fsa1VwRnJvbSooKSwgYW5kIFZpc2l0KigpIGZvciBjb21wb3VuZAorLy8gYXNzaWdubWVudCBtZXRob2RzLiAgQ29tcG91bmQgYXNzaWdubWVudCBvcGVyYXRvcnMgYXJlIG5vdAorLy8gY2xhc3NlcyBpbiB0aGVtc2VsdmVzICh0aGV5J3JlIGFsbCBvcGNvZGVzIGluCisvLyBDb21wb3VuZEFzc2lnbk9wZXJhdG9yKSBidXQgZG8gaGF2ZSB2aXNpdG9ycy4KKyNkZWZpbmUgT1BFUkFUT1IoTkFNRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdFTkVSQUxfQklOT1BfRkFMTEJBQ0soTkFNRSMjQXNzaWduLCBDb21wb3VuZEFzc2lnbk9wZXJhdG9yKQorCisgIENBT19MSVNUKCkKKyN1bmRlZiBPUEVSQVRPUgorI3VuZGVmIEdFTkVSQUxfQklOT1BfRkFMTEJBQ0sKKworLy8gLS0tLSBNZXRob2RzIG9uIFR5cGVzIC0tLS0KKy8vIEZJWE1FOiByZXZhbXAgdG8gdGFrZSBUeXBlTG9jJ3MgcmF0aGVyIHRoYW4gVHlwZXMuCisKKy8vIERlY2xhcmUgVHJhdmVyc2UqKCkgZm9yIGFsbCBjb25jcmV0ZSBUeXBlIGNsYXNzZXMuCisjZGVmaW5lIEFCU1RSQUNUX1RZUEUoQ0xBU1MsIEJBU0UpCisjZGVmaW5lIFRZUEUoQ0xBU1MsIEJBU0UpIGJvb2wgVHJhdmVyc2UjI0NMQVNTIyNUeXBlKENMQVNTIyNUeXBlICpUKTsKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZU5vZGVzLmRlZiIKKyAgLy8gVGhlIGFib3ZlIGhlYWRlciAjdW5kZWZzIEFCU1RSQUNUX1RZUEUgYW5kIFRZUEUgdXBvbiBleGl0LgorCisgIC8vIERlZmluZSBXYWxrVXBGcm9tKigpIGFuZCBlbXB0eSBWaXNpdCooKSBmb3IgYWxsIFR5cGUgY2xhc3Nlcy4KKyAgYm9vbCBXYWxrVXBGcm9tVHlwZShUeXBlICpUKSB7IHJldHVybiBnZXREZXJpdmVkKCkuVmlzaXRUeXBlKFQpOyB9CisgIGJvb2wgVmlzaXRUeXBlKFR5cGUgKlQpIHsgcmV0dXJuIHRydWU7IH0KKyNkZWZpbmUgVFlQRShDTEFTUywgQkFTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb2wgV2Fsa1VwRnJvbSMjQ0xBU1MjI1R5cGUoQ0xBU1MjI1R5cGUgKlQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRSWV9UTyhXYWxrVXBGcm9tIyNCQVNFKFQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUUllfVE8oVmlzaXQjI0NMQVNTIyNUeXBlKFQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYm9vbCBWaXNpdCMjQ0xBU1MjI1R5cGUoQ0xBU1MjI1R5cGUgKlQpIHsgcmV0dXJuIHRydWU7IH0KKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZU5vZGVzLmRlZiIKKworLy8gLS0tLSBNZXRob2RzIG9uIFR5cGVMb2NzIC0tLS0KKy8vIEZJWE1FOiB0aGlzIGN1cnJlbnRseSBqdXN0IGNhbGxzIHRoZSBtYXRjaGluZyBUeXBlIG1ldGhvZHMKKworLy8gRGVjbGFyZSBUcmF2ZXJzZSooKSBmb3IgYWxsIGNvbmNyZXRlIFR5cGVMb2MgY2xhc3Nlcy4KKyNkZWZpbmUgQUJTVFJBQ1RfVFlQRUxPQyhDTEFTUywgQkFTRSkKKyNkZWZpbmUgVFlQRUxPQyhDTEFTUywgQkFTRSkgYm9vbCBUcmF2ZXJzZSMjQ0xBU1MjI1R5cGVMb2MoQ0xBU1MjI1R5cGVMb2MgVEwpOworI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTG9jTm9kZXMuZGVmIgorICAvLyBUaGUgYWJvdmUgaGVhZGVyICN1bmRlZnMgQUJTVFJBQ1RfVFlQRUxPQyBhbmQgVFlQRUxPQyB1cG9uIGV4aXQuCisKKyAgLy8gRGVmaW5lIFdhbGtVcEZyb20qKCkgYW5kIGVtcHR5IFZpc2l0KigpIGZvciBhbGwgVHlwZUxvYyBjbGFzc2VzLgorICBib29sIFdhbGtVcEZyb21UeXBlTG9jKFR5cGVMb2MgVEwpIHsgcmV0dXJuIGdldERlcml2ZWQoKS5WaXNpdFR5cGVMb2MoVEwpOyB9CisgIGJvb2wgVmlzaXRUeXBlTG9jKFR5cGVMb2MgVEwpIHsgcmV0dXJuIHRydWU7IH0KKworICAvLyBRdWFsaWZpZWRUeXBlTG9jIGFuZCBVbnF1YWxUeXBlTG9jIGFyZSBub3QgZGVjbGFyZWQgaW4KKyAgLy8gVHlwZU5vZGVzLmRlZiBhbmQgdGh1cyBuZWVkIHRvIGJlIGhhbmRsZWQgc3BlY2lhbGx5LgorICBib29sIFdhbGtVcEZyb21RdWFsaWZpZWRUeXBlTG9jKFF1YWxpZmllZFR5cGVMb2MgVEwpIHsKKyAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlZpc2l0VW5xdWFsVHlwZUxvYyhUTC5nZXRVbnF1YWxpZmllZExvYygpKTsKKyAgfQorICBib29sIFZpc2l0UXVhbGlmaWVkVHlwZUxvYyhRdWFsaWZpZWRUeXBlTG9jIFRMKSB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgV2Fsa1VwRnJvbVVucXVhbFR5cGVMb2MoVW5xdWFsVHlwZUxvYyBUTCkgeworICAgIHJldHVybiBnZXREZXJpdmVkKCkuVmlzaXRVbnF1YWxUeXBlTG9jKFRMLmdldFVucXVhbGlmaWVkTG9jKCkpOworICB9CisgIGJvb2wgVmlzaXRVbnF1YWxUeXBlTG9jKFVucXVhbFR5cGVMb2MgVEwpIHsgcmV0dXJuIHRydWU7IH0KKworLy8gTm90ZSB0aGF0IEJBU0UgaW5jbHVkZXMgdHJhaWxpbmcgJ1R5cGUnIHdoaWNoIENMQVNTIGRvZXNuJ3QuCisjZGVmaW5lIFRZUEUoQ0xBU1MsIEJBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29sIFdhbGtVcEZyb20jI0NMQVNTIyNUeXBlTG9jKENMQVNTIyNUeXBlTG9jIFRMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUUllfVE8oV2Fsa1VwRnJvbSMjQkFTRSMjTG9jKFRMKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFJZX1RPKFZpc2l0IyNDTEFTUyMjVHlwZUxvYyhUTCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb2wgVmlzaXQjI0NMQVNTIyNUeXBlTG9jKENMQVNTIyNUeXBlTG9jIFRMKSB7IHJldHVybiB0cnVlOyB9CisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGVOb2Rlcy5kZWYiCisKKy8vIC0tLS0gTWV0aG9kcyBvbiBEZWNscyAtLS0tCisKKy8vIERlY2xhcmUgVHJhdmVyc2UqKCkgZm9yIGFsbCBjb25jcmV0ZSBEZWNsIGNsYXNzZXMuCisjZGVmaW5lIEFCU1RSQUNUX0RFQ0woREVDTCkKKyNkZWZpbmUgREVDTChDTEFTUywgQkFTRSkgYm9vbCBUcmF2ZXJzZSMjQ0xBU1MjI0RlY2woQ0xBU1MjI0RlY2wgKkQpOworI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsTm9kZXMuaW5jIgorICAvLyBUaGUgYWJvdmUgaGVhZGVyICN1bmRlZnMgQUJTVFJBQ1RfREVDTCBhbmQgREVDTCB1cG9uIGV4aXQuCisKKyAgLy8gRGVmaW5lIFdhbGtVcEZyb20qKCkgYW5kIGVtcHR5IFZpc2l0KigpIGZvciBhbGwgRGVjbCBjbGFzc2VzLgorICBib29sIFdhbGtVcEZyb21EZWNsKERlY2wgKkQpIHsgcmV0dXJuIGdldERlcml2ZWQoKS5WaXNpdERlY2woRCk7IH0KKyAgYm9vbCBWaXNpdERlY2woRGVjbCAqRCkgeyByZXR1cm4gdHJ1ZTsgfQorI2RlZmluZSBERUNMKENMQVNTLCBCQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYm9vbCBXYWxrVXBGcm9tIyNDTEFTUyMjRGVjbChDTEFTUyMjRGVjbCAqRCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFJZX1RPKFdhbGtVcEZyb20jI0JBU0UoRCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRSWV9UTyhWaXNpdCMjQ0xBU1MjI0RlY2woRCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29sIFZpc2l0IyNDTEFTUyMjRGVjbChDTEFTUyMjRGVjbCAqRCkgeyByZXR1cm4gdHJ1ZTsgfQorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsTm9kZXMuaW5jIgorCisgIGJvb2wgY2FuSWdub3JlQ2hpbGREZWNsV2hpbGVUcmF2ZXJzaW5nRGVjbENvbnRleHQoY29uc3QgRGVjbCAqQ2hpbGQpOworCitwcml2YXRlOgorICAvLyBUaGVzZSBhcmUgaGVscGVyIG1ldGhvZHMgdXNlZCBieSBtb3JlIHRoYW4gb25lIFRyYXZlcnNlKiBtZXRob2QuCisgIGJvb2wgVHJhdmVyc2VUZW1wbGF0ZVBhcmFtZXRlckxpc3RIZWxwZXIoVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpUUEwpOworCisgIC8vIFRyYXZlcnNlcyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdHMgb2YgZWl0aGVyIGEgRGVjbGFyYXRvckRlY2wgb3IgVGFnRGVjbC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGJvb2wgVHJhdmVyc2VEZWNsVGVtcGxhdGVQYXJhbWV0ZXJMaXN0cyhUICpEKTsKKworI2RlZmluZSBERUZfVFJBVkVSU0VfVE1QTF9JTlNUKFRNUExERUNMS0lORCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYm9vbCBUcmF2ZXJzZVRlbXBsYXRlSW5zdGFudGlhdGlvbnMoVE1QTERFQ0xLSU5EIyNUZW1wbGF0ZURlY2wgKkQpOworICBERUZfVFJBVkVSU0VfVE1QTF9JTlNUKENsYXNzKQorICBERUZfVFJBVkVSU0VfVE1QTF9JTlNUKFZhcikKKyAgREVGX1RSQVZFUlNFX1RNUExfSU5TVChGdW5jdGlvbikKKyN1bmRlZiBERUZfVFJBVkVSU0VfVE1QTF9JTlNUCisgIGJvb2wgVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jc0hlbHBlcihjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TG9jICpUQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb3VudCk7CisgIGJvb2wgVHJhdmVyc2VBcnJheVR5cGVMb2NIZWxwZXIoQXJyYXlUeXBlTG9jIFRMKTsKKyAgYm9vbCBUcmF2ZXJzZVJlY29yZEhlbHBlcihSZWNvcmREZWNsICpEKTsKKyAgYm9vbCBUcmF2ZXJzZUNYWFJlY29yZEhlbHBlcihDWFhSZWNvcmREZWNsICpEKTsKKyAgYm9vbCBUcmF2ZXJzZURlY2xhcmF0b3JIZWxwZXIoRGVjbGFyYXRvckRlY2wgKkQpOworICBib29sIFRyYXZlcnNlRGVjbENvbnRleHRIZWxwZXIoRGVjbENvbnRleHQgKkRDKTsKKyAgYm9vbCBUcmF2ZXJzZUZ1bmN0aW9uSGVscGVyKEZ1bmN0aW9uRGVjbCAqRCk7CisgIGJvb2wgVHJhdmVyc2VWYXJIZWxwZXIoVmFyRGVjbCAqRCk7CisgIGJvb2wgVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUgKlMpOworICBib29sIFRyYXZlcnNlT01QTG9vcERpcmVjdGl2ZShPTVBMb29wRGlyZWN0aXZlICpTKTsKKyAgYm9vbCBUcmF2ZXJzZU9NUENsYXVzZShPTVBDbGF1c2UgKkMpOworI2RlZmluZSBPUEVOTVBfQ0xBVVNFKE5hbWUsIENsYXNzKSBib29sIFZpc2l0IyNDbGFzcyhDbGFzcyAqQyk7CisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3Blbk1QS2luZHMuZGVmIgorICAvLy8gXGJyaWVmIFByb2Nlc3MgY2xhdXNlcyB3aXRoIGxpc3Qgb2YgdmFyaWFibGVzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYm9vbCBWaXNpdE9NUENsYXVzZUxpc3QoVCAqTm9kZSk7CisgIC8vLyBQcm9jZXNzIGNsYXVzZXMgd2l0aCBwcmUtaW5pdGlzLgorICBib29sIFZpc2l0T01QQ2xhdXNlV2l0aFByZUluaXQoT01QQ2xhdXNlV2l0aFByZUluaXQgKk5vZGUpOworICBib29sIFZpc2l0T01QQ2xhdXNlV2l0aFBvc3RVcGRhdGUoT01QQ2xhdXNlV2l0aFBvc3RVcGRhdGUgKk5vZGUpOworCisgIGJvb2wgZGF0YVRyYXZlcnNlTm9kZShTdG10ICpTLCBEYXRhUmVjdXJzaW9uUXVldWUgKlF1ZXVlKTsKKyAgYm9vbCBQb3N0VmlzaXRTdG10KFN0bXQgKlMpOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OmRhdGFUcmF2ZXJzZU5vZGUoU3RtdCAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhUmVjdXJzaW9uUXVldWUgKlF1ZXVlKSB7CisjZGVmaW5lIERJU1BBVENIX1NUTVQoTkFNRSwgQ0xBU1MsIFZBUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gVFJBVkVSU0VfU1RNVF9CQVNFKE5BTUUsIENMQVNTLCBWQVIsIFF1ZXVlKTsKKworICAvLyBJZiB3ZSBoYXZlIGEgYmluYXJ5IGV4cHIsIGRpc3BhdGNoIHRvIHRoZSBzdWJjb2RlIG9mIHRoZSBiaW5vcC4gIEEgc21hcnQKKyAgLy8gb3B0aW1pemVyIChlLmcuIExMVk0pIHdpbGwgZm9sZCB0aGlzIGNvbXBhcmlzb24gaW50byB0aGUgc3dpdGNoIHN0bXQKKyAgLy8gYmVsb3cuCisgIGlmIChCaW5hcnlPcGVyYXRvciAqQmluT3AgPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oUykpIHsKKyAgICBzd2l0Y2ggKEJpbk9wLT5nZXRPcGNvZGUoKSkgeworI2RlZmluZSBPUEVSQVRPUihOQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBCT18jI05BTUU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRElTUEFUQ0hfU1RNVChCaW4jI05BTUUsIEJpbmFyeU9wZXJhdG9yLCBTKTsKKworICAgICAgQklOT1BfTElTVCgpCisjdW5kZWYgT1BFUkFUT1IKKyN1bmRlZiBCSU5PUF9MSVNUCisKKyNkZWZpbmUgT1BFUkFUT1IoTkFNRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgQk9fIyNOQU1FIyNBc3NpZ246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERJU1BBVENIX1NUTVQoQmluIyNOQU1FIyNBc3NpZ24sIENvbXBvdW5kQXNzaWduT3BlcmF0b3IsIFMpOworCisgICAgICBDQU9fTElTVCgpCisjdW5kZWYgT1BFUkFUT1IKKyN1bmRlZiBDQU9fTElTVAorICAgIH0KKyAgfSBlbHNlIGlmIChVbmFyeU9wZXJhdG9yICpVbk9wID0gZHluX2Nhc3Q8VW5hcnlPcGVyYXRvcj4oUykpIHsKKyAgICBzd2l0Y2ggKFVuT3AtPmdldE9wY29kZSgpKSB7CisjZGVmaW5lIE9QRVJBVE9SKE5BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIFVPXyMjTkFNRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBESVNQQVRDSF9TVE1UKFVuYXJ5IyNOQU1FLCBVbmFyeU9wZXJhdG9yLCBTKTsKKworICAgICAgVU5BUllPUF9MSVNUKCkKKyN1bmRlZiBPUEVSQVRPUgorI3VuZGVmIFVOQVJZT1BfTElTVAorICAgIH0KKyAgfQorCisgIC8vIFRvcCBzd2l0Y2ggc3RtdDogZGlzcGF0Y2ggdG8gVHJhdmVyc2VGb29TdG10IGZvciBlYWNoIGNvbmNyZXRlIEZvb1N0bXQuCisgIHN3aXRjaCAoUy0+Z2V0U3RtdENsYXNzKCkpIHsKKyAgY2FzZSBTdG10OjpOb1N0bXRDbGFzczoKKyAgICBicmVhazsKKyNkZWZpbmUgQUJTVFJBQ1RfU1RNVChTVE1UKQorI2RlZmluZSBTVE1UKENMQVNTLCBQQVJFTlQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBTdG10OjpDTEFTUyMjQ2xhc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRElTUEFUQ0hfU1RNVChDTEFTUywgQ0xBU1MsIFMpOworI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10Tm9kZXMuaW5jIgorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKyN1bmRlZiBESVNQQVRDSF9TVE1UCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpQb3N0VmlzaXRTdG10KFN0bXQgKlMpIHsKKyAgc3dpdGNoIChTLT5nZXRTdG10Q2xhc3MoKSkgeworICBjYXNlIFN0bXQ6Ok5vU3RtdENsYXNzOgorICAgIGJyZWFrOworI2RlZmluZSBBQlNUUkFDVF9TVE1UKFNUTVQpCisjZGVmaW5lIFNUTVQoQ0xBU1MsIFBBUkVOVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIFN0bXQ6OkNMQVNTIyNDbGFzczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUUllfVE8oV2Fsa1VwRnJvbSMjQ0xBU1Moc3RhdGljX2Nhc3Q8Q0xBU1MgKj4oUykpKTsgYnJlYWs7CisjZGVmaW5lIElOSVRMSVNURVhQUihDTEFTUywgUEFSRU5UKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIFN0bXQ6OkNMQVNTIyNDbGFzczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBhdXRvIElMRSA9IHN0YXRpY19jYXN0PENMQVNTICo+KFMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKGF1dG8gU3luID0gSUxFLT5pc1NlbWFudGljRm9ybSgpID8gSUxFLT5nZXRTeW50YWN0aWNGb3JtKCkgOiBJTEUpICAgIFwKKyAgICAgICAgVFJZX1RPKFdhbGtVcEZyb20jI0NMQVNTKFN5bikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoYXV0byBTZW0gPSBJTEUtPmlzU2VtYW50aWNGb3JtKCkgPyBJTEUgOiBJTEUtPmdldFNlbWFudGljRm9ybSgpKSAgICAgXAorICAgICAgICBUUllfVE8oV2Fsa1VwRnJvbSMjQ0xBU1MoU2VtKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10Tm9kZXMuaW5jIgorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKyN1bmRlZiBESVNQQVRDSF9TVE1UCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVN0bXQoU3RtdCAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFSZWN1cnNpb25RdWV1ZSAqUXVldWUpIHsKKyAgaWYgKCFTKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChRdWV1ZSkgeworICAgIFF1ZXVlLT5wdXNoX2JhY2soe1MsIGZhbHNlfSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBTbWFsbFZlY3RvcjxsbHZtOjpQb2ludGVySW50UGFpcjxTdG10ICosIDEsIGJvb2w+LCA4PiBMb2NhbFF1ZXVlOworICBMb2NhbFF1ZXVlLnB1c2hfYmFjayh7UywgZmFsc2V9KTsKKworICB3aGlsZSAoIUxvY2FsUXVldWUuZW1wdHkoKSkgeworICAgIGF1dG8gJkN1cnJTQW5kVmlzaXRlZCA9IExvY2FsUXVldWUuYmFjaygpOworICAgIFN0bXQgKkN1cnJTID0gQ3VyclNBbmRWaXNpdGVkLmdldFBvaW50ZXIoKTsKKyAgICBib29sIFZpc2l0ZWQgPSBDdXJyU0FuZFZpc2l0ZWQuZ2V0SW50KCk7CisgICAgaWYgKFZpc2l0ZWQpIHsKKyAgICAgIExvY2FsUXVldWUucG9wX2JhY2soKTsKKyAgICAgIFRSWV9UTyhkYXRhVHJhdmVyc2VTdG10UG9zdChDdXJyUykpOworICAgICAgaWYgKGdldERlcml2ZWQoKS5zaG91bGRUcmF2ZXJzZVBvc3RPcmRlcigpKSB7CisgICAgICAgIFRSWV9UTyhQb3N0VmlzaXRTdG10KEN1cnJTKSk7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAoZ2V0RGVyaXZlZCgpLmRhdGFUcmF2ZXJzZVN0bXRQcmUoQ3VyclMpKSB7CisgICAgICBDdXJyU0FuZFZpc2l0ZWQuc2V0SW50KHRydWUpOworICAgICAgc2l6ZV90IE4gPSBMb2NhbFF1ZXVlLnNpemUoKTsKKyAgICAgIFRSWV9UTyhkYXRhVHJhdmVyc2VOb2RlKEN1cnJTLCAmTG9jYWxRdWV1ZSkpOworICAgICAgLy8gUHJvY2VzcyBuZXcgY2hpbGRyZW4gaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBhZGRlZC4KKyAgICAgIHN0ZDo6cmV2ZXJzZShMb2NhbFF1ZXVlLmJlZ2luKCkgKyBOLCBMb2NhbFF1ZXVlLmVuZCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgTG9jYWxRdWV1ZS5wb3BfYmFjaygpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisjZGVmaW5lIERJU1BBVENIKE5BTUUsIENMQVNTLCBWQVIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlIyNOQU1FKHN0YXRpY19jYXN0PENMQVNTICo+KFZBUikpCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVR5cGUoUXVhbFR5cGUgVCkgeworICBpZiAoVC5pc051bGwoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBzd2l0Y2ggKFQtPmdldFR5cGVDbGFzcygpKSB7CisjZGVmaW5lIEFCU1RSQUNUX1RZUEUoQ0xBU1MsIEJBU0UpCisjZGVmaW5lIFRZUEUoQ0xBU1MsIEJBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIFR5cGU6OkNMQVNTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBESVNQQVRDSChDTEFTUyMjVHlwZSwgQ0xBU1MjI1R5cGUsIGNvbnN0X2Nhc3Q8VHlwZSAqPihULmdldFR5cGVQdHIoKSkpOworI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTm9kZXMuZGVmIgorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVR5cGVMb2MoVHlwZUxvYyBUTCkgeworICBpZiAoVEwuaXNOdWxsKCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgc3dpdGNoIChUTC5nZXRUeXBlTG9jQ2xhc3MoKSkgeworI2RlZmluZSBBQlNUUkFDVF9UWVBFTE9DKENMQVNTLCBCQVNFKQorI2RlZmluZSBUWVBFTE9DKENMQVNTLCBCQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBUeXBlTG9jOjpDTEFTUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZSMjQ0xBU1MjI1R5cGVMb2MoVEwuY2FzdEFzPENMQVNTIyNUeXBlTG9jPigpKTsKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZUxvY05vZGVzLmRlZiIKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyBEZWZpbmUgdGhlIFRyYXZlcnNlKkF0dHIoQXR0ciogQSkgbWV0aG9kcworI2RlZmluZSBWSVNJVE9SQ0xBU1MgUmVjdXJzaXZlQVNUVmlzaXRvcgorI2luY2x1ZGUgImNsYW5nL0FTVC9BdHRyVmlzaXRvci5pbmMiCisjdW5kZWYgVklTSVRPUkNMQVNTCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZURlY2woRGVjbCAqRCkgeworICBpZiAoIUQpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gQXMgYSBzeW50YXggdmlzaXRvciwgYnkgZGVmYXVsdCB3ZSB3YW50IHRvIGlnbm9yZSBkZWNsYXJhdGlvbnMgZm9yCisgIC8vIGltcGxpY2l0IGRlY2xhcmF0aW9ucyAob25lcyBub3QgdHlwZWQgZXhwbGljaXRseSBieSB0aGUgdXNlcikuCisgIGlmICghZ2V0RGVyaXZlZCgpLnNob3VsZFZpc2l0SW1wbGljaXRDb2RlKCkgJiYgRC0+aXNJbXBsaWNpdCgpKQorICAgIHJldHVybiB0cnVlOworCisgIHN3aXRjaCAoRC0+Z2V0S2luZCgpKSB7CisjZGVmaW5lIEFCU1RSQUNUX0RFQ0woREVDTCkKKyNkZWZpbmUgREVDTChDTEFTUywgQkFTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgRGVjbDo6Q0xBU1M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghZ2V0RGVyaXZlZCgpLlRyYXZlcnNlIyNDTEFTUyMjRGVjbChzdGF0aWNfY2FzdDxDTEFTUyMjRGVjbCAqPihEKSkpICAgIFwKKyAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnJlYWs7CisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xOb2Rlcy5pbmMiCisgIH0KKworICAvLyBWaXNpdCBhbnkgYXR0cmlidXRlcyBhdHRhY2hlZCB0byB0aGlzIGRlY2xhcmF0aW9uLgorICBmb3IgKGF1dG8gKkkgOiBELT5hdHRycygpKSB7CisgICAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2VBdHRyKEkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisjdW5kZWYgRElTUEFUQ0gKKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllcigKKyAgICBOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlMpIHsKKyAgaWYgKCFOTlMpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKE5OUy0+Z2V0UHJlZml4KCkpCisgICAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllcihOTlMtPmdldFByZWZpeCgpKSk7CisKKyAgc3dpdGNoIChOTlMtPmdldEtpbmQoKSkgeworICBjYXNlIE5lc3RlZE5hbWVTcGVjaWZpZXI6OklkZW50aWZpZXI6CisgIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6TmFtZXNwYWNlOgorICBjYXNlIE5lc3RlZE5hbWVTcGVjaWZpZXI6Ok5hbWVzcGFjZUFsaWFzOgorICBjYXNlIE5lc3RlZE5hbWVTcGVjaWZpZXI6Okdsb2JhbDoKKyAgY2FzZSBOZXN0ZWROYW1lU3BlY2lmaWVyOjpTdXBlcjoKKyAgICByZXR1cm4gdHJ1ZTsKKworICBjYXNlIE5lc3RlZE5hbWVTcGVjaWZpZXI6OlR5cGVTcGVjOgorICBjYXNlIE5lc3RlZE5hbWVTcGVjaWZpZXI6OlR5cGVTcGVjV2l0aFRlbXBsYXRlOgorICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoUXVhbFR5cGUoTk5TLT5nZXRBc1R5cGUoKSwgMCkpKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKAorICAgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgTk5TKSB7CisgIGlmICghTk5TKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFByZWZpeCA9IE5OUy5nZXRQcmVmaXgoKSkKKyAgICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKFByZWZpeCkpOworCisgIHN3aXRjaCAoTk5TLmdldE5lc3RlZE5hbWVTcGVjaWZpZXIoKS0+Z2V0S2luZCgpKSB7CisgIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6SWRlbnRpZmllcjoKKyAgY2FzZSBOZXN0ZWROYW1lU3BlY2lmaWVyOjpOYW1lc3BhY2U6CisgIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6TmFtZXNwYWNlQWxpYXM6CisgIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6R2xvYmFsOgorICBjYXNlIE5lc3RlZE5hbWVTcGVjaWZpZXI6OlN1cGVyOgorICAgIHJldHVybiB0cnVlOworCisgIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6VHlwZVNwZWM6CisgIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6VHlwZVNwZWNXaXRoVGVtcGxhdGU6CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhOTlMuZ2V0VHlwZUxvYygpKSk7CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlRGVjbGFyYXRpb25OYW1lSW5mbygKKyAgICBEZWNsYXJhdGlvbk5hbWVJbmZvIE5hbWVJbmZvKSB7CisgIHN3aXRjaCAoTmFtZUluZm8uZ2V0TmFtZSgpLmdldE5hbWVLaW5kKCkpIHsKKyAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6OkNYWENvbnN0cnVjdG9yTmFtZToKKyAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6OkNYWERlc3RydWN0b3JOYW1lOgorICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6Q1hYQ29udmVyc2lvbkZ1bmN0aW9uTmFtZToKKyAgICBpZiAoVHlwZVNvdXJjZUluZm8gKlRTSW5mbyA9IE5hbWVJbmZvLmdldE5hbWVkVHlwZUluZm8oKSkKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVFNJbmZvLT5nZXRUeXBlTG9jKCkpKTsKKyAgICBicmVhazsKKworICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6Q1hYRGVkdWN0aW9uR3VpZGVOYW1lOgorICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlTmFtZSgKKyAgICAgICAgVGVtcGxhdGVOYW1lKE5hbWVJbmZvLmdldE5hbWUoKS5nZXRDWFhEZWR1Y3Rpb25HdWlkZVRlbXBsYXRlKCkpKSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6OklkZW50aWZpZXI6CisgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpPYmpDWmVyb0FyZ1NlbGVjdG9yOgorICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6T2JqQ09uZUFyZ1NlbGVjdG9yOgorICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6T2JqQ011bHRpQXJnU2VsZWN0b3I6CisgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpDWFhPcGVyYXRvck5hbWU6CisgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpDWFhMaXRlcmFsT3BlcmF0b3JOYW1lOgorICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6Q1hYVXNpbmdEaXJlY3RpdmU6CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlVGVtcGxhdGVOYW1lKFRlbXBsYXRlTmFtZSBUZW1wbGF0ZSkgeworICBpZiAoRGVwZW5kZW50VGVtcGxhdGVOYW1lICpEVE4gPSBUZW1wbGF0ZS5nZXRBc0RlcGVuZGVudFRlbXBsYXRlTmFtZSgpKQorICAgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXIoRFROLT5nZXRRdWFsaWZpZXIoKSkpOworICBlbHNlIGlmIChRdWFsaWZpZWRUZW1wbGF0ZU5hbWUgKlFUTiA9IFRlbXBsYXRlLmdldEFzUXVhbGlmaWVkVGVtcGxhdGVOYW1lKCkpCisgICAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllcihRVE4tPmdldFF1YWxpZmllcigpKSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnQoCisgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmQXJnKSB7CisgIHN3aXRjaCAoQXJnLmdldEtpbmQoKSkgeworICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6Ok51bGw6CisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6RGVjbGFyYXRpb246CisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6SW50ZWdyYWw6CisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6TnVsbFB0cjoKKyAgICByZXR1cm4gdHJ1ZTsKKworICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6OlR5cGU6CisgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVR5cGUoQXJnLmdldEFzVHlwZSgpKTsKKworICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6OlRlbXBsYXRlOgorICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6OlRlbXBsYXRlRXhwYW5zaW9uOgorICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VUZW1wbGF0ZU5hbWUoCisgICAgICAgIEFyZy5nZXRBc1RlbXBsYXRlT3JUZW1wbGF0ZVBhdHRlcm4oKSk7CisKKyAgY2FzZSBUZW1wbGF0ZUFyZ3VtZW50OjpFeHByZXNzaW9uOgorICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KEFyZy5nZXRBc0V4cHIoKSk7CisKKyAgY2FzZSBUZW1wbGF0ZUFyZ3VtZW50OjpQYWNrOgorICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50cyhBcmcucGFja19iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmcucGFja19zaXplKCkpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZJWE1FOiBubyB0ZW1wbGF0ZSBuYW1lIGxvY2F0aW9uPworLy8gRklYTUU6IG5vIHNvdXJjZSBsb2NhdGlvbnMgZm9yIGEgdGVtcGxhdGUgYXJndW1lbnQgcGFjaz8KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRMb2MoCisgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExvYyAmQXJnTG9jKSB7CisgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJkFyZyA9IEFyZ0xvYy5nZXRBcmd1bWVudCgpOworCisgIHN3aXRjaCAoQXJnLmdldEtpbmQoKSkgeworICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6Ok51bGw6CisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6RGVjbGFyYXRpb246CisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6SW50ZWdyYWw6CisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6TnVsbFB0cjoKKyAgICByZXR1cm4gdHJ1ZTsKKworICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6OlR5cGU6IHsKKyAgICAvLyBGSVhNRTogaG93IGNhbiBUU0kgZXZlciBiZSBOVUxMPworICAgIGlmIChUeXBlU291cmNlSW5mbyAqVFNJID0gQXJnTG9jLmdldFR5cGVTb3VyY2VJbmZvKCkpCisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlVHlwZUxvYyhUU0ktPmdldFR5cGVMb2MoKSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVR5cGUoQXJnLmdldEFzVHlwZSgpKTsKKyAgfQorCisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6VGVtcGxhdGU6CisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6VGVtcGxhdGVFeHBhbnNpb246CisgICAgaWYgKEFyZ0xvYy5nZXRUZW1wbGF0ZVF1YWxpZmllckxvYygpKQorICAgICAgVFJZX1RPKGdldERlcml2ZWQoKS5UcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoCisgICAgICAgICAgQXJnTG9jLmdldFRlbXBsYXRlUXVhbGlmaWVyTG9jKCkpKTsKKyAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlVGVtcGxhdGVOYW1lKAorICAgICAgICBBcmcuZ2V0QXNUZW1wbGF0ZU9yVGVtcGxhdGVQYXR0ZXJuKCkpOworCisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6RXhwcmVzc2lvbjoKKyAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlU3RtdChBcmdMb2MuZ2V0U291cmNlRXhwcmVzc2lvbigpKTsKKworICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6OlBhY2s6CisgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRzKEFyZy5wYWNrX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZy5wYWNrX3NpemUoKSk7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudHMoCisgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudCAqQXJncywgdW5zaWduZWQgTnVtQXJncykgeworICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJICE9IE51bUFyZ3M7ICsrSSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnQoQXJnc1tJXSkpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXIoCisgICAgQ1hYQ3RvckluaXRpYWxpemVyICpJbml0KSB7CisgIGlmIChUeXBlU291cmNlSW5mbyAqVEluZm8gPSBJbml0LT5nZXRUeXBlU291cmNlSW5mbygpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEluZm8tPmdldFR5cGVMb2MoKSkpOworCisgIGlmIChJbml0LT5pc1dyaXR0ZW4oKSB8fCBnZXREZXJpdmVkKCkuc2hvdWxkVmlzaXRJbXBsaWNpdENvZGUoKSkKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEluaXQtPmdldEluaXQoKSkpOworCisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wKK1JlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlTGFtYmRhQ2FwdHVyZShMYW1iZGFFeHByICpMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW1iZGFDYXB0dXJlICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkluaXQpIHsKKyAgaWYgKExFLT5pc0luaXRDYXB0dXJlKEMpKQorICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woQy0+Z2V0Q2FwdHVyZWRWYXIoKSkpOworICBlbHNlCisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChJbml0KSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VMYW1iZGFCb2R5KAorICAgIExhbWJkYUV4cHIgKkxFLCBEYXRhUmVjdXJzaW9uUXVldWUgKlF1ZXVlKSB7CisgIFRSWV9UT19UUkFWRVJTRV9PUl9FTlFVRVVFX1NUTVQoTEUtPmdldEJvZHkoKSk7CisgIHJldHVybiB0cnVlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLSBUeXBlIHRyYXZlcnNhbCAtLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGlzIG1hY3JvIG1ha2VzIGF2YWlsYWJsZSBhIHZhcmlhYmxlIFQsIHRoZSBwYXNzZWQtaW4gdHlwZS4KKyNkZWZpbmUgREVGX1RSQVZFUlNFX1RZUEUoVFlQRSwgQ09ERSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlIyNUWVBFKFRZUEUgKlQpIHsgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIWdldERlcml2ZWQoKS5zaG91bGRUcmF2ZXJzZVBvc3RPcmRlcigpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUllfVE8oV2Fsa1VwRnJvbSMjVFlQRShUKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgQ09ERTsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZ2V0RGVyaXZlZCgpLnNob3VsZFRyYXZlcnNlUG9zdE9yZGVyKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUllfVE8oV2Fsa1VwRnJvbSMjVFlQRShUKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitERUZfVFJBVkVSU0VfVFlQRShCdWlsdGluVHlwZSwge30pCisKK0RFRl9UUkFWRVJTRV9UWVBFKENvbXBsZXhUeXBlLCB7IFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0RWxlbWVudFR5cGUoKSkpOyB9KQorCitERUZfVFJBVkVSU0VfVFlQRShQb2ludGVyVHlwZSwgeyBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFBvaW50ZWVUeXBlKCkpKTsgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoQmxvY2tQb2ludGVyVHlwZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRQb2ludGVlVHlwZSgpKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFKExWYWx1ZVJlZmVyZW5jZVR5cGUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0UG9pbnRlZVR5cGUoKSkpOyB9KQorCitERUZfVFJBVkVSU0VfVFlQRShSVmFsdWVSZWZlcmVuY2VUeXBlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFBvaW50ZWVUeXBlKCkpKTsgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoTWVtYmVyUG9pbnRlclR5cGUsIHsKKyAgVFJZX1RPKFRyYXZlcnNlVHlwZShRdWFsVHlwZShULT5nZXRDbGFzcygpLCAwKSkpOworICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFBvaW50ZWVUeXBlKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9UWVBFKEFkanVzdGVkVHlwZSwgeyBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldE9yaWdpbmFsVHlwZSgpKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFKERlY2F5ZWRUeXBlLCB7IFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0T3JpZ2luYWxUeXBlKCkpKTsgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoQ29uc3RhbnRBcnJheVR5cGUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0RWxlbWVudFR5cGUoKSkpOyB9KQorCitERUZfVFJBVkVSU0VfVFlQRShJbmNvbXBsZXRlQXJyYXlUeXBlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldEVsZW1lbnRUeXBlKCkpKTsgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoVmFyaWFibGVBcnJheVR5cGUsIHsKKyAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRFbGVtZW50VHlwZSgpKSk7CisgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoVC0+Z2V0U2l6ZUV4cHIoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1RZUEUoRGVwZW5kZW50U2l6ZWRBcnJheVR5cGUsIHsKKyAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRFbGVtZW50VHlwZSgpKSk7CisgIGlmIChULT5nZXRTaXplRXhwcigpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoVC0+Z2V0U2l6ZUV4cHIoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1RZUEUoRGVwZW5kZW50QWRkcmVzc1NwYWNlVHlwZSwgeworICBUUllfVE8oVHJhdmVyc2VTdG10KFQtPmdldEFkZHJTcGFjZUV4cHIoKSkpOworICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFBvaW50ZWVUeXBlKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9UWVBFKERlcGVuZGVudFNpemVkRXh0VmVjdG9yVHlwZSwgeworICBpZiAoVC0+Z2V0U2l6ZUV4cHIoKSkKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KFQtPmdldFNpemVFeHByKCkpKTsKKyAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRFbGVtZW50VHlwZSgpKSk7Cit9KQorCitERUZfVFJBVkVSU0VfVFlQRShWZWN0b3JUeXBlLCB7IFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0RWxlbWVudFR5cGUoKSkpOyB9KQorCitERUZfVFJBVkVSU0VfVFlQRShFeHRWZWN0b3JUeXBlLCB7IFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0RWxlbWVudFR5cGUoKSkpOyB9KQorCitERUZfVFJBVkVSU0VfVFlQRShGdW5jdGlvbk5vUHJvdG9UeXBlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFJldHVyblR5cGUoKSkpOyB9KQorCitERUZfVFJBVkVSU0VfVFlQRShGdW5jdGlvblByb3RvVHlwZSwgeworICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFJldHVyblR5cGUoKSkpOworCisgIGZvciAoY29uc3QgYXV0byAmQSA6IFQtPnBhcmFtX3R5cGVzKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlKEEpKTsKKyAgfQorCisgIGZvciAoY29uc3QgYXV0byAmRSA6IFQtPmV4Y2VwdGlvbnMoKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoRSkpOworICB9CisKKyAgaWYgKEV4cHIgKk5FID0gVC0+Z2V0Tm9leGNlcHRFeHByKCkpCisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChORSkpOworfSkKKworREVGX1RSQVZFUlNFX1RZUEUoVW5yZXNvbHZlZFVzaW5nVHlwZSwge30pCitERUZfVFJBVkVSU0VfVFlQRShUeXBlZGVmVHlwZSwge30pCisKK0RFRl9UUkFWRVJTRV9UWVBFKFR5cGVPZkV4cHJUeXBlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VTdG10KFQtPmdldFVuZGVybHlpbmdFeHByKCkpKTsgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoVHlwZU9mVHlwZSwgeyBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFVuZGVybHlpbmdUeXBlKCkpKTsgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoRGVjbHR5cGVUeXBlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VTdG10KFQtPmdldFVuZGVybHlpbmdFeHByKCkpKTsgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoVW5hcnlUcmFuc2Zvcm1UeXBlLCB7CisgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0QmFzZVR5cGUoKSkpOworICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFVuZGVybHlpbmdUeXBlKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9UWVBFKEF1dG9UeXBlLCB7IFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0RGVkdWNlZFR5cGUoKSkpOyB9KQorREVGX1RSQVZFUlNFX1RZUEUoRGVkdWNlZFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlLCB7CisgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlTmFtZShULT5nZXRUZW1wbGF0ZU5hbWUoKSkpOworICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldERlZHVjZWRUeXBlKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9UWVBFKFJlY29yZFR5cGUsIHt9KQorREVGX1RSQVZFUlNFX1RZUEUoRW51bVR5cGUsIHt9KQorREVGX1RSQVZFUlNFX1RZUEUoVGVtcGxhdGVUeXBlUGFybVR5cGUsIHt9KQorREVGX1RSQVZFUlNFX1RZUEUoU3Vic3RUZW1wbGF0ZVR5cGVQYXJtVHlwZSwgeworICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFJlcGxhY2VtZW50VHlwZSgpKSk7Cit9KQorREVGX1RSQVZFUlNFX1RZUEUoU3Vic3RUZW1wbGF0ZVR5cGVQYXJtUGFja1R5cGUsIHsKKyAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudChULT5nZXRBcmd1bWVudFBhY2soKSkpOworfSkKKworREVGX1RSQVZFUlNFX1RZUEUoVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUsIHsKKyAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVOYW1lKFQtPmdldFRlbXBsYXRlTmFtZSgpKSk7CisgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRzKFQtPmdldEFyZ3MoKSwgVC0+Z2V0TnVtQXJncygpKSk7Cit9KQorCitERUZfVFJBVkVSU0VfVFlQRShJbmplY3RlZENsYXNzTmFtZVR5cGUsIHt9KQorCitERUZfVFJBVkVSU0VfVFlQRShBdHRyaWJ1dGVkVHlwZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRNb2RpZmllZFR5cGUoKSkpOyB9KQorCitERUZfVFJBVkVSU0VfVFlQRShQYXJlblR5cGUsIHsgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRJbm5lclR5cGUoKSkpOyB9KQorCitERUZfVFJBVkVSU0VfVFlQRShFbGFib3JhdGVkVHlwZSwgeworICBpZiAoVC0+Z2V0UXVhbGlmaWVyKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyKFQtPmdldFF1YWxpZmllcigpKSk7CisgIH0KKyAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXROYW1lZFR5cGUoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1RZUEUoRGVwZW5kZW50TmFtZVR5cGUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXIoVC0+Z2V0UXVhbGlmaWVyKCkpKTsgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoRGVwZW5kZW50VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUsIHsKKyAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllcihULT5nZXRRdWFsaWZpZXIoKSkpOworICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50cyhULT5nZXRBcmdzKCksIFQtPmdldE51bUFyZ3MoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1RZUEUoUGFja0V4cGFuc2lvblR5cGUsIHsgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRQYXR0ZXJuKCkpKTsgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoT2JqQ1R5cGVQYXJhbVR5cGUsIHt9KQorCitERUZfVFJBVkVSU0VfVFlQRShPYmpDSW50ZXJmYWNlVHlwZSwge30pCisKK0RFRl9UUkFWRVJTRV9UWVBFKE9iakNPYmplY3RUeXBlLCB7CisgIC8vIFdlIGhhdmUgdG8gd2F0Y2ggb3V0IGhlcmUgYmVjYXVzZSBhbiBPYmpDSW50ZXJmYWNlVHlwZSdzIGJhc2UKKyAgLy8gdHlwZSBpcyBpdHNlbGYuCisgIGlmIChULT5nZXRCYXNlVHlwZSgpLmdldFR5cGVQdHIoKSAhPSBUKQorICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0QmFzZVR5cGUoKSkpOworICBmb3IgKGF1dG8gdHlwZUFyZyA6IFQtPmdldFR5cGVBcmdzQXNXcml0dGVuKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlKHR5cGVBcmcpKTsKKyAgfQorfSkKKworREVGX1RSQVZFUlNFX1RZUEUoT2JqQ09iamVjdFBvaW50ZXJUeXBlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFBvaW50ZWVUeXBlKCkpKTsgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoQXRvbWljVHlwZSwgeyBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFZhbHVlVHlwZSgpKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFKFBpcGVUeXBlLCB7IFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0RWxlbWVudFR5cGUoKSkpOyB9KQorCisjdW5kZWYgREVGX1RSQVZFUlNFX1RZUEUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0gVHlwZUxvYyB0cmF2ZXJzYWwgLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhpcyBtYWNybyBtYWtlcyBhdmFpbGFibGUgYSB2YXJpYWJsZSBUTCwgdGhlIHBhc3NlZC1pbiBUeXBlTG9jLgorLy8gSWYgcmVxdWVzdGVkLCBpdCBjYWxscyBXYWxrVXBGcm9tKiBmb3IgdGhlIFR5cGUgaW4gdGhlIGdpdmVuIFR5cGVMb2MsCisvLyBpbiBhZGRpdGlvbiB0byBXYWxrVXBGcm9tKiBmb3IgdGhlIFR5cGVMb2MgaXRzZWxmLCBzdWNoIHRoYXQgZXhpc3RpbmcKKy8vIGNsaWVudHMgdGhhdCBvdmVycmlkZSB0aGUgV2Fsa1VwRnJvbSpUeXBlKCkgYW5kL29yIFZpc2l0KlR5cGUoKSBtZXRob2RzCisvLyBjb250aW51ZSB0byB3b3JrLgorI2RlZmluZSBERUZfVFJBVkVSU0VfVFlQRUxPQyhUWVBFLCBDT0RFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2UjI1RZUEUjI0xvYyhUWVBFIyNMb2MgVEwpIHsgICAgICAgXAorICAgIGlmIChnZXREZXJpdmVkKCkuc2hvdWxkV2Fsa1R5cGVzT2ZUeXBlTG9jcygpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSWV9UTyhXYWxrVXBGcm9tIyNUWVBFKGNvbnN0X2Nhc3Q8VFlQRSAqPihUTC5nZXRUeXBlUHRyKCkpKSk7ICAgICAgICAgICBcCisgICAgVFJZX1RPKFdhbGtVcEZyb20jI1RZUEUjI0xvYyhUTCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgQ09ERTsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sCitSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVF1YWxpZmllZFR5cGVMb2MoUXVhbGlmaWVkVHlwZUxvYyBUTCkgeworICAvLyBNb3ZlIHRoaXMgb3ZlciB0byB0aGUgJ21haW4nIHR5cGVsb2MgdHJlZS4gIE5vdGUgdGhhdCB0aGlzIGlzIGEKKyAgLy8gbW92ZSAtLSB3ZSBwcmV0ZW5kIHRoYXQgd2Ugd2VyZSByZWFsbHkgbG9va2luZyBhdCB0aGUgdW5xdWFsaWZpZWQKKyAgLy8gdHlwZWxvYyBhbGwgYWxvbmcgLS0gcmF0aGVyIHRoYW4gYSByZWN1cnNpb24sIHNvIHdlIGRvbid0IGZvbGxvdworICAvLyB0aGUgbm9ybWFsIENSVFAgcGxhbiBvZiBnb2luZyB0aHJvdWdoCisgIC8vIGdldERlcml2ZWQoKS5UcmF2ZXJzZVR5cGVMb2MuICBJZiB3ZSBkaWQsIHdlJ2QgYmUgdHJhdmVyc2luZworICAvLyB0d2ljZSBmb3IgdGhlIHNhbWUgdHlwZSAob25jZSBhcyBhIFF1YWxpZmllZFR5cGVMb2MgdmVyc2lvbiBvZgorICAvLyB0aGUgdHlwZSwgb25jZSBhcyBhbiBVbnF1YWxpZmllZFR5cGVMb2MgdmVyc2lvbiBvZiB0aGUgdHlwZSksCisgIC8vIHdoaWNoIGluIGVmZmVjdCBtZWFucyB3ZSdkIGNhbGwgVmlzaXRUeXBlTG9jIHR3aWNlIHdpdGggdGhlCisgIC8vICdzYW1lJyB0eXBlLiAgVGhpcyBzb2x2ZXMgdGhhdCBwcm9ibGVtLCBhdCB0aGUgY29zdCBvZiBuZXZlcgorICAvLyBzZWVpbmcgdGhlIHF1YWxpZmllZCB2ZXJzaW9uIG9mIHRoZSB0eXBlICh1bmxlc3MgdGhlIGNsaWVudAorICAvLyBzdWJjbGFzc2VzIFRyYXZlcnNlUXVhbGlmaWVkVHlwZUxvYyB0aGVtc2VsdmVzKS4gIEl0J3Mgbm90IGEKKyAgLy8gcGVyZmVjdCBzb2x1dGlvbi4gIEEgcGVyZmVjdCBzb2x1dGlvbiBwcm9iYWJseSByZXF1aXJlcyBtYWtpbmcKKyAgLy8gUXVhbGlmaWVkVHlwZUxvYyBhIHdyYXBwZXIgYXJvdW5kIFR5cGVMb2MgLS0gbGlrZSBRdWFsVHlwZSBpcyBhCisgIC8vIHdyYXBwZXIgYXJvdW5kIFR5cGUqIC0tIHJhdGhlciB0aGFuIGJlaW5nIGl0cyBvd24gY2xhc3MgaW4gdGhlCisgIC8vIHR5cGUgaGllcmFyY2h5LgorICByZXR1cm4gVHJhdmVyc2VUeXBlTG9jKFRMLmdldFVucXVhbGlmaWVkTG9jKCkpOworfQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhCdWlsdGluVHlwZSwge30pCisKKy8vIEZJWE1FOiBDb21wbGV4VHlwZUxvYyBpcyB1bmZpbmlzaGVkCitERUZfVFJBVkVSU0VfVFlQRUxPQyhDb21wbGV4VHlwZSwgeworICBUUllfVE8oVHJhdmVyc2VUeXBlKFRMLmdldFR5cGVQdHIoKS0+Z2V0RWxlbWVudFR5cGUoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoUG9pbnRlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0UG9pbnRlZUxvYygpKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKEJsb2NrUG9pbnRlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0UG9pbnRlZUxvYygpKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKExWYWx1ZVJlZmVyZW5jZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0UG9pbnRlZUxvYygpKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKFJWYWx1ZVJlZmVyZW5jZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0UG9pbnRlZUxvYygpKSk7IH0pCisKKy8vIEZJWE1FOiBsb2NhdGlvbiBvZiBiYXNlIGNsYXNzPworLy8gV2UgdHJhdmVyc2UgdGhpcyBpbiB0aGUgdHlwZSBjYXNlIGFzIHdlbGwsIGJ1dCBob3cgaXMgaXQgbm90IHJlYWNoZWQgdGhyb3VnaAorLy8gdGhlIHBvaW50ZWUgdHlwZT8KK0RFRl9UUkFWRVJTRV9UWVBFTE9DKE1lbWJlclBvaW50ZXJUeXBlLCB7CisgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoUXVhbFR5cGUoVEwuZ2V0VHlwZVB0cigpLT5nZXRDbGFzcygpLCAwKSkpOworICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldFBvaW50ZWVMb2MoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoQWRqdXN0ZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldE9yaWdpbmFsTG9jKCkpKTsgfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoRGVjYXllZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0T3JpZ2luYWxMb2MoKSkpOyB9KQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VBcnJheVR5cGVMb2NIZWxwZXIoQXJyYXlUeXBlTG9jIFRMKSB7CisgIC8vIFRoaXMgaXNuJ3QgYXZhaWxhYmxlIGZvciBBcnJheVR5cGUsIGJ1dCBpcyBmb3IgdGhlIEFycmF5VHlwZUxvYy4KKyAgVFJZX1RPKFRyYXZlcnNlU3RtdChUTC5nZXRTaXplRXhwcigpKSk7CisgIHJldHVybiB0cnVlOworfQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhDb25zdGFudEFycmF5VHlwZSwgeworICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldEVsZW1lbnRMb2MoKSkpOworICByZXR1cm4gVHJhdmVyc2VBcnJheVR5cGVMb2NIZWxwZXIoVEwpOworfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoSW5jb21wbGV0ZUFycmF5VHlwZSwgeworICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldEVsZW1lbnRMb2MoKSkpOworICByZXR1cm4gVHJhdmVyc2VBcnJheVR5cGVMb2NIZWxwZXIoVEwpOworfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoVmFyaWFibGVBcnJheVR5cGUsIHsKKyAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRFbGVtZW50TG9jKCkpKTsKKyAgcmV0dXJuIFRyYXZlcnNlQXJyYXlUeXBlTG9jSGVscGVyKFRMKTsKK30pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKERlcGVuZGVudFNpemVkQXJyYXlUeXBlLCB7CisgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0RWxlbWVudExvYygpKSk7CisgIHJldHVybiBUcmF2ZXJzZUFycmF5VHlwZUxvY0hlbHBlcihUTCk7Cit9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhEZXBlbmRlbnRBZGRyZXNzU3BhY2VUeXBlLCB7CisgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoVEwuZ2V0VHlwZVB0cigpLT5nZXRBZGRyU3BhY2VFeHByKCkpKTsKKyAgVFJZX1RPKFRyYXZlcnNlVHlwZShUTC5nZXRUeXBlUHRyKCktPmdldFBvaW50ZWVUeXBlKCkpKTsKK30pCisKKy8vIEZJWE1FOiBvcmRlcj8gd2h5IG5vdCBzaXplIGV4cHIgZmlyc3Q/CisvLyBGSVhNRTogYmFzZSBWZWN0b3JUeXBlTG9jIGlzIHVuZmluaXNoZWQKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKERlcGVuZGVudFNpemVkRXh0VmVjdG9yVHlwZSwgeworICBpZiAoVEwuZ2V0VHlwZVB0cigpLT5nZXRTaXplRXhwcigpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoVEwuZ2V0VHlwZVB0cigpLT5nZXRTaXplRXhwcigpKSk7CisgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVEwuZ2V0VHlwZVB0cigpLT5nZXRFbGVtZW50VHlwZSgpKSk7Cit9KQorCisvLyBGSVhNRTogVmVjdG9yVHlwZUxvYyBpcyB1bmZpbmlzaGVkCitERUZfVFJBVkVSU0VfVFlQRUxPQyhWZWN0b3JUeXBlLCB7CisgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVEwuZ2V0VHlwZVB0cigpLT5nZXRFbGVtZW50VHlwZSgpKSk7Cit9KQorCisvLyBGSVhNRTogc2l6ZSBhbmQgYXR0cmlidXRlcworLy8gRklYTUU6IGJhc2UgVmVjdG9yVHlwZUxvYyBpcyB1bmZpbmlzaGVkCitERUZfVFJBVkVSU0VfVFlQRUxPQyhFeHRWZWN0b3JUeXBlLCB7CisgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVEwuZ2V0VHlwZVB0cigpLT5nZXRFbGVtZW50VHlwZSgpKSk7Cit9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhGdW5jdGlvbk5vUHJvdG9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldFJldHVybkxvYygpKSk7IH0pCisKKy8vIEZJWE1FOiBsb2NhdGlvbiBvZiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgKGF0dHJpYnV0ZXM/KQorREVGX1RSQVZFUlNFX1RZUEVMT0MoRnVuY3Rpb25Qcm90b1R5cGUsIHsKKyAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRSZXR1cm5Mb2MoKSkpOworCisgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpUID0gVEwuZ2V0VHlwZVB0cigpOworCisgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBUTC5nZXROdW1QYXJhbXMoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoVEwuZ2V0UGFyYW0oSSkpIHsKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woVEwuZ2V0UGFyYW0oSSkpKTsKKyAgICB9IGVsc2UgaWYgKEkgPCBULT5nZXROdW1QYXJhbXMoKSkgeworICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRQYXJhbVR5cGUoSSkpKTsKKyAgICB9CisgIH0KKworICBmb3IgKGNvbnN0IGF1dG8gJkUgOiBULT5leGNlcHRpb25zKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlKEUpKTsKKyAgfQorCisgIGlmIChFeHByICpORSA9IFQtPmdldE5vZXhjZXB0RXhwcigpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoTkUpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKFVucmVzb2x2ZWRVc2luZ1R5cGUsIHt9KQorREVGX1RSQVZFUlNFX1RZUEVMT0MoVHlwZWRlZlR5cGUsIHt9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhUeXBlT2ZFeHByVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlU3RtdChUTC5nZXRVbmRlcmx5aW5nRXhwcigpKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKFR5cGVPZlR5cGUsIHsKKyAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRVbmRlcmx5aW5nVEluZm8oKS0+Z2V0VHlwZUxvYygpKSk7Cit9KQorCisvLyBGSVhNRTogbG9jYXRpb24gb2YgdW5kZXJseWluZyBleHByCitERUZfVFJBVkVSU0VfVFlQRUxPQyhEZWNsdHlwZVR5cGUsIHsKKyAgVFJZX1RPKFRyYXZlcnNlU3RtdChUTC5nZXRUeXBlUHRyKCktPmdldFVuZGVybHlpbmdFeHByKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKFVuYXJ5VHJhbnNmb3JtVHlwZSwgeworICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldFVuZGVybHlpbmdUSW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKEF1dG9UeXBlLCB7CisgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVEwuZ2V0VHlwZVB0cigpLT5nZXREZWR1Y2VkVHlwZSgpKSk7Cit9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhEZWR1Y2VkVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUsIHsKKyAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVOYW1lKFRMLmdldFR5cGVQdHIoKS0+Z2V0VGVtcGxhdGVOYW1lKCkpKTsKKyAgVFJZX1RPKFRyYXZlcnNlVHlwZShUTC5nZXRUeXBlUHRyKCktPmdldERlZHVjZWRUeXBlKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKFJlY29yZFR5cGUsIHt9KQorREVGX1RSQVZFUlNFX1RZUEVMT0MoRW51bVR5cGUsIHt9KQorREVGX1RSQVZFUlNFX1RZUEVMT0MoVGVtcGxhdGVUeXBlUGFybVR5cGUsIHt9KQorREVGX1RSQVZFUlNFX1RZUEVMT0MoU3Vic3RUZW1wbGF0ZVR5cGVQYXJtVHlwZSwgeworICBUUllfVE8oVHJhdmVyc2VUeXBlKFRMLmdldFR5cGVQdHIoKS0+Z2V0UmVwbGFjZW1lbnRUeXBlKCkpKTsKK30pCitERUZfVFJBVkVSU0VfVFlQRUxPQyhTdWJzdFRlbXBsYXRlVHlwZVBhcm1QYWNrVHlwZSwgeworICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50KFRMLmdldFR5cGVQdHIoKS0+Z2V0QXJndW1lbnRQYWNrKCkpKTsKK30pCisKKy8vIEZJWE1FOiB1c2UgdGhlIGxvYyBmb3IgdGhlIHRlbXBsYXRlIG5hbWU/CitERUZfVFJBVkVSU0VfVFlQRUxPQyhUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZSwgeworICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZU5hbWUoVEwuZ2V0VHlwZVB0cigpLT5nZXRUZW1wbGF0ZU5hbWUoKSkpOworICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gVEwuZ2V0TnVtQXJncygpOyBJICE9IEU7ICsrSSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRMb2MoVEwuZ2V0QXJnTG9jKEkpKSk7CisgIH0KK30pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKEluamVjdGVkQ2xhc3NOYW1lVHlwZSwge30pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKFBhcmVuVHlwZSwgeyBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldElubmVyTG9jKCkpKTsgfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoQXR0cmlidXRlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0TW9kaWZpZWRMb2MoKSkpOyB9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhFbGFib3JhdGVkVHlwZSwgeworICBpZiAoVEwuZ2V0UXVhbGlmaWVyTG9jKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKFRMLmdldFF1YWxpZmllckxvYygpKSk7CisgIH0KKyAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXROYW1lZFR5cGVMb2MoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoRGVwZW5kZW50TmFtZVR5cGUsIHsKKyAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhUTC5nZXRRdWFsaWZpZXJMb2MoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoRGVwZW5kZW50VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUsIHsKKyAgaWYgKFRMLmdldFF1YWxpZmllckxvYygpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhUTC5nZXRRdWFsaWZpZXJMb2MoKSkpOworICB9CisKKyAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IFRMLmdldE51bUFyZ3MoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jKFRMLmdldEFyZ0xvYyhJKSkpOworICB9Cit9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhQYWNrRXhwYW5zaW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRQYXR0ZXJuTG9jKCkpKTsgfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoT2JqQ1R5cGVQYXJhbVR5cGUsIHt9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhPYmpDSW50ZXJmYWNlVHlwZSwge30pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKE9iakNPYmplY3RUeXBlLCB7CisgIC8vIFdlIGhhdmUgdG8gd2F0Y2ggb3V0IGhlcmUgYmVjYXVzZSBhbiBPYmpDSW50ZXJmYWNlVHlwZSdzIGJhc2UKKyAgLy8gdHlwZSBpcyBpdHNlbGYuCisgIGlmIChUTC5nZXRUeXBlUHRyKCktPmdldEJhc2VUeXBlKCkuZ2V0VHlwZVB0cigpICE9IFRMLmdldFR5cGVQdHIoKSkKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldEJhc2VMb2MoKSkpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBuID0gVEwuZ2V0TnVtVHlwZUFyZ3MoKTsgaSAhPSBuOyArK2kpCisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRUeXBlQXJnVEluZm8oaSktPmdldFR5cGVMb2MoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoT2JqQ09iamVjdFBvaW50ZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldFBvaW50ZWVMb2MoKSkpOyB9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhBdG9taWNUeXBlLCB7IFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0VmFsdWVMb2MoKSkpOyB9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhQaXBlVHlwZSwgeyBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldFZhbHVlTG9jKCkpKTsgfSkKKworI3VuZGVmIERFRl9UUkFWRVJTRV9UWVBFTE9DCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tIERlY2wgdHJhdmVyc2FsIC0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRm9yIGEgRGVjbCwgd2UgYXV0b21hdGUgKGluIHRoZSBERUZfVFJBVkVSU0VfREVDTCBtYWNybykgdHJhdmVyc2luZworLy8gdGhlIGNoaWxkcmVuIHRoYXQgY29tZSBmcm9tIHRoZSBEZWNsQ29udGV4dCBhc3NvY2lhdGVkIHdpdGggaXQuCisvLyBUaGVyZWZvcmUgZWFjaCBUcmF2ZXJzZSogb25seSBuZWVkcyB0byB3b3JyeSBhYm91dCBjaGlsZHJlbiBvdGhlcgorLy8gdGhhbiB0aG9zZS4KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OmNhbklnbm9yZUNoaWxkRGVjbFdoaWxlVHJhdmVyc2luZ0RlY2xDb250ZXh0KAorICAgIGNvbnN0IERlY2wgKkNoaWxkKSB7CisgIC8vIEJsb2NrRGVjbHMgYW5kIENhcHR1cmVkRGVjbHMgYXJlIHRyYXZlcnNlZCB0aHJvdWdoIEJsb2NrRXhwcnMgYW5kCisgIC8vIENhcHR1cmVkU3RtdHMgcmVzcGVjdGl2ZWx5LgorICByZXR1cm4gaXNhPEJsb2NrRGVjbD4oQ2hpbGQpIHx8IGlzYTxDYXB0dXJlZERlY2w+KENoaWxkKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlRGVjbENvbnRleHRIZWxwZXIoRGVjbENvbnRleHQgKkRDKSB7CisgIGlmICghREMpCisgICAgcmV0dXJuIHRydWU7CisKKyAgZm9yIChhdXRvICpDaGlsZCA6IERDLT5kZWNscygpKSB7CisgICAgaWYgKCFjYW5JZ25vcmVDaGlsZERlY2xXaGlsZVRyYXZlcnNpbmdEZWNsQ29udGV4dChDaGlsZCkpCisgICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKENoaWxkKSk7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVGhpcyBtYWNybyBtYWtlcyBhdmFpbGFibGUgYSB2YXJpYWJsZSBELCB0aGUgcGFzc2VkLWluIGRlY2wuCisjZGVmaW5lIERFRl9UUkFWRVJTRV9ERUNMKERFQ0wsIENPREUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZSMjREVDTChERUNMICpEKSB7ICAgICAgICAgICAgICAgICBcCisgICAgYm9vbCBTaG91bGRWaXNpdENoaWxkcmVuID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJvb2wgUmV0dXJuVmFsdWUgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIWdldERlcml2ZWQoKS5zaG91bGRUcmF2ZXJzZVBvc3RPcmRlcigpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUllfVE8oV2Fsa1VwRnJvbSMjREVDTChEKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgQ09ERTsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoUmV0dXJuVmFsdWUgJiYgU2hvdWxkVmlzaXRDaGlsZHJlbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUllfVE8oVHJhdmVyc2VEZWNsQ29udGV4dEhlbHBlcihkeW5fY2FzdDxEZWNsQ29udGV4dD4oRCkpKTsgICAgICAgICAgICAgXAorICAgIGlmIChSZXR1cm5WYWx1ZSAmJiBnZXREZXJpdmVkKCkuc2hvdWxkVHJhdmVyc2VQb3N0T3JkZXIoKSkgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSWV9UTyhXYWxrVXBGcm9tIyNERUNMKEQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIFJldHVyblZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK0RFRl9UUkFWRVJTRV9ERUNMKEFjY2Vzc1NwZWNEZWNsLCB7fSkKKworREVGX1RSQVZFUlNFX0RFQ0woQmxvY2tEZWNsLCB7CisgIGlmIChUeXBlU291cmNlSW5mbyAqVEluZm8gPSBELT5nZXRTaWduYXR1cmVBc1dyaXR0ZW4oKSkKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRJbmZvLT5nZXRUeXBlTG9jKCkpKTsKKyAgVFJZX1RPKFRyYXZlcnNlU3RtdChELT5nZXRCb2R5KCkpKTsKKyAgZm9yIChjb25zdCBhdXRvICZJIDogRC0+Y2FwdHVyZXMoKSkgeworICAgIGlmIChJLmhhc0NvcHlFeHByKCkpIHsKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoSS5nZXRDb3B5RXhwcigpKSk7CisgICAgfQorICB9CisgIFNob3VsZFZpc2l0Q2hpbGRyZW4gPSBmYWxzZTsKK30pCisKK0RFRl9UUkFWRVJTRV9ERUNMKENhcHR1cmVkRGVjbCwgeworICBUUllfVE8oVHJhdmVyc2VTdG10KEQtPmdldEJvZHkoKSkpOworICBTaG91bGRWaXNpdENoaWxkcmVuID0gZmFsc2U7Cit9KQorCitERUZfVFJBVkVSU0VfREVDTChFbXB0eURlY2wsIHt9KQorCitERUZfVFJBVkVSU0VfREVDTChGaWxlU2NvcGVBc21EZWNsLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VTdG10KEQtPmdldEFzbVN0cmluZygpKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9ERUNMKEltcG9ydERlY2wsIHt9KQorCitERUZfVFJBVkVSU0VfREVDTChGcmllbmREZWNsLCB7CisgIC8vIEZyaWVuZCBpcyBlaXRoZXIgZGVjbCBvciBhIHR5cGUuCisgIGlmIChELT5nZXRGcmllbmRUeXBlKCkpCisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhELT5nZXRGcmllbmRUeXBlKCktPmdldFR5cGVMb2MoKSkpOworICBlbHNlCisgICAgVFJZX1RPKFRyYXZlcnNlRGVjbChELT5nZXRGcmllbmREZWNsKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9ERUNMKEZyaWVuZFRlbXBsYXRlRGVjbCwgeworICBpZiAoRC0+Z2V0RnJpZW5kVHlwZSgpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoRC0+Z2V0RnJpZW5kVHlwZSgpLT5nZXRUeXBlTG9jKCkpKTsKKyAgZWxzZQorICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woRC0+Z2V0RnJpZW5kRGVjbCgpKSk7CisgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBELT5nZXROdW1UZW1wbGF0ZVBhcmFtZXRlcnMoKTsgSSA8IEU7ICsrSSkgeworICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqVFBMID0gRC0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJMaXN0KEkpOworICAgIGZvciAoVGVtcGxhdGVQYXJhbWV0ZXJMaXN0OjppdGVyYXRvciBJVFBMID0gVFBMLT5iZWdpbigpLCBFVFBMID0gVFBMLT5lbmQoKTsKKyAgICAgICAgIElUUEwgIT0gRVRQTDsgKytJVFBMKSB7CisgICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKCpJVFBMKSk7CisgICAgfQorICB9Cit9KQorCitERUZfVFJBVkVSU0VfREVDTChDbGFzc1Njb3BlRnVuY3Rpb25TcGVjaWFsaXphdGlvbkRlY2wsIHsKKyAgVFJZX1RPKFRyYXZlcnNlRGVjbChELT5nZXRTcGVjaWFsaXphdGlvbigpKSk7CisKKyAgaWYgKEQtPmhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzKCkpIHsKKyAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gJmFyZ3MgPSBELT50ZW1wbGF0ZUFyZ3MoKTsKKyAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jc0hlbHBlcihhcmdzLmdldEFyZ3VtZW50QXJyYXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnNpemUoKSkpOworICB9Cit9KQorCitERUZfVFJBVkVSU0VfREVDTChMaW5rYWdlU3BlY0RlY2wsIHt9KQorCitERUZfVFJBVkVSU0VfREVDTChFeHBvcnREZWNsLCB7fSkKKworREVGX1RSQVZFUlNFX0RFQ0woT2JqQ1Byb3BlcnR5SW1wbERlY2wsIHsvLyBGSVhNRTogaW1wbGVtZW50IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorCitERUZfVFJBVkVSU0VfREVDTChTdGF0aWNBc3NlcnREZWNsLCB7CisgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0QXNzZXJ0RXhwcigpKSk7CisgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0TWVzc2FnZSgpKSk7Cit9KQorCitERUZfVFJBVkVSU0VfREVDTCgKKyAgICBUcmFuc2xhdGlvblVuaXREZWNsLAorICAgIHsvLyBDb2RlIGluIGFuIHVubmFtZWQgbmFtZXNwYWNlIHNob3dzIHVwIGF1dG9tYXRpY2FsbHkgaW4KKyAgICAgLy8gZGVjbHNfYmVnaW4oKS9kZWNsc19lbmQoKS4gIFRodXMgd2UgZG9uJ3QgbmVlZCB0byByZWN1cnNlIG9uCisgICAgIC8vIEQtPmdldEFub255bW91c05hbWVzcGFjZSgpLgorICAgIH0pCisKK0RFRl9UUkFWRVJTRV9ERUNMKFByYWdtYUNvbW1lbnREZWNsLCB7fSkKKworREVGX1RSQVZFUlNFX0RFQ0woUHJhZ21hRGV0ZWN0TWlzbWF0Y2hEZWNsLCB7fSkKKworREVGX1RSQVZFUlNFX0RFQ0woRXh0ZXJuQ0NvbnRleHREZWNsLCB7fSkKKworREVGX1RSQVZFUlNFX0RFQ0woTmFtZXNwYWNlQWxpYXNEZWNsLCB7CisgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoRC0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKKworICAvLyBXZSBzaG91bGRuJ3QgdHJhdmVyc2UgYW4gYWxpYXNlZCBuYW1lc3BhY2UsIHNpbmNlIGl0IHdpbGwgYmUKKyAgLy8gZGVmaW5lZCAoYW5kLCB0aGVyZWZvcmUsIHRyYXZlcnNlZCkgc29tZXdoZXJlIGVsc2UuCisgIFNob3VsZFZpc2l0Q2hpbGRyZW4gPSBmYWxzZTsKK30pCisKK0RFRl9UUkFWRVJTRV9ERUNMKExhYmVsRGVjbCwgey8vIFRoZXJlIGlzIG5vIGNvZGUgaW4gYSBMYWJlbERlY2wuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisKK0RFRl9UUkFWRVJTRV9ERUNMKAorICAgIE5hbWVzcGFjZURlY2wsCisgICAgey8vIENvZGUgaW4gYW4gdW5uYW1lZCBuYW1lc3BhY2Ugc2hvd3MgdXAgYXV0b21hdGljYWxseSBpbgorICAgICAvLyBkZWNsc19iZWdpbigpL2RlY2xzX2VuZCgpLiAgVGh1cyB3ZSBkb24ndCBuZWVkIHRvIHJlY3Vyc2Ugb24KKyAgICAgLy8gRC0+Z2V0QW5vbnltb3VzTmFtZXNwYWNlKCkuCisgICAgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woT2JqQ0NvbXBhdGlibGVBbGlhc0RlY2wsIHsvLyBGSVhNRTogaW1wbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woT2JqQ0NhdGVnb3J5RGVjbCwgey8vIEZJWE1FOiBpbXBsZW1lbnQKKyAgaWYgKE9iakNUeXBlUGFyYW1MaXN0ICp0eXBlUGFyYW1MaXN0ID0gRC0+Z2V0VHlwZVBhcmFtTGlzdCgpKSB7CisgICAgZm9yIChhdXRvIHR5cGVQYXJhbSA6ICp0eXBlUGFyYW1MaXN0KSB7CisgICAgICBUUllfVE8oVHJhdmVyc2VPYmpDVHlwZVBhcmFtRGVjbCh0eXBlUGFyYW0pKTsKKyAgICB9CisgIH0KK30pCisKK0RFRl9UUkFWRVJTRV9ERUNMKE9iakNDYXRlZ29yeUltcGxEZWNsLCB7Ly8gRklYTUU6IGltcGxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisKK0RFRl9UUkFWRVJTRV9ERUNMKE9iakNJbXBsZW1lbnRhdGlvbkRlY2wsIHsvLyBGSVhNRTogaW1wbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorCitERUZfVFJBVkVSU0VfREVDTChPYmpDSW50ZXJmYWNlRGVjbCwgey8vIEZJWE1FOiBpbXBsZW1lbnQKKyAgaWYgKE9iakNUeXBlUGFyYW1MaXN0ICp0eXBlUGFyYW1MaXN0ID0gRC0+Z2V0VHlwZVBhcmFtTGlzdEFzV3JpdHRlbigpKSB7CisgICAgZm9yIChhdXRvIHR5cGVQYXJhbSA6ICp0eXBlUGFyYW1MaXN0KSB7CisgICAgICBUUllfVE8oVHJhdmVyc2VPYmpDVHlwZVBhcmFtRGVjbCh0eXBlUGFyYW0pKTsKKyAgICB9CisgIH0KKworICBpZiAoVHlwZVNvdXJjZUluZm8gKnN1cGVyVEluZm8gPSBELT5nZXRTdXBlckNsYXNzVEluZm8oKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2Moc3VwZXJUSW5mby0+Z2V0VHlwZUxvYygpKSk7CisgIH0KK30pCisKK0RFRl9UUkFWRVJTRV9ERUNMKE9iakNQcm90b2NvbERlY2wsIHsvLyBGSVhNRTogaW1wbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorCitERUZfVFJBVkVSU0VfREVDTChPYmpDTWV0aG9kRGVjbCwgeworICBpZiAoRC0+Z2V0UmV0dXJuVHlwZVNvdXJjZUluZm8oKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoRC0+Z2V0UmV0dXJuVHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7CisgIH0KKyAgZm9yIChQYXJtVmFyRGVjbCAqUGFyYW1ldGVyIDogRC0+cGFyYW1ldGVycygpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlRGVjbChQYXJhbWV0ZXIpKTsKKyAgfQorICBpZiAoRC0+aXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChELT5nZXRCb2R5KCkpKTsKKyAgfQorICBTaG91bGRWaXNpdENoaWxkcmVuID0gZmFsc2U7Cit9KQorCitERUZfVFJBVkVSU0VfREVDTChPYmpDVHlwZVBhcmFtRGVjbCwgeworICBpZiAoRC0+aGFzRXhwbGljaXRCb3VuZCgpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhELT5nZXRUeXBlU291cmNlSW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKKyAgICAvLyBXZSBzaG91bGRuJ3QgdHJhdmVyc2UgRC0+Z2V0VHlwZUZvckRlY2woKTsgaXQncyBhIHJlc3VsdCBvZgorICAgIC8vIGRlY2xhcmluZyB0aGUgdHlwZSBhbGlhcywgbm90IHNvbWV0aGluZyB0aGF0IHdhcyB3cml0dGVuIGluIHRoZQorICAgIC8vIHNvdXJjZS4KKyAgfQorfSkKKworREVGX1RSQVZFUlNFX0RFQ0woT2JqQ1Byb3BlcnR5RGVjbCwgeworICBpZiAoRC0+Z2V0VHlwZVNvdXJjZUluZm8oKSkKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKEQtPmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOworICBlbHNlCisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShELT5nZXRUeXBlKCkpKTsKKyAgU2hvdWxkVmlzaXRDaGlsZHJlbiA9IGZhbHNlOworfSkKKworREVGX1RSQVZFUlNFX0RFQ0woVXNpbmdEZWNsLCB7CisgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoRC0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKKyAgVFJZX1RPKFRyYXZlcnNlRGVjbGFyYXRpb25OYW1lSW5mbyhELT5nZXROYW1lSW5mbygpKSk7Cit9KQorCitERUZfVFJBVkVSU0VfREVDTChVc2luZ1BhY2tEZWNsLCB7fSkKKworREVGX1RSQVZFUlNFX0RFQ0woVXNpbmdEaXJlY3RpdmVEZWNsLCB7CisgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoRC0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9ERUNMKFVzaW5nU2hhZG93RGVjbCwge30pCisKK0RFRl9UUkFWRVJTRV9ERUNMKENvbnN0cnVjdG9yVXNpbmdTaGFkb3dEZWNsLCB7fSkKKworREVGX1RSQVZFUlNFX0RFQ0woT01QVGhyZWFkUHJpdmF0ZURlY2wsIHsKKyAgZm9yIChhdXRvICpJIDogRC0+dmFybGlzdHMoKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoSSkpOworICB9Cit9KQorCitERUZfVFJBVkVSU0VfREVDTChPTVBEZWNsYXJlUmVkdWN0aW9uRGVjbCwgeworICBUUllfVE8oVHJhdmVyc2VTdG10KEQtPmdldENvbWJpbmVyKCkpKTsKKyAgaWYgKGF1dG8gKkluaXRpYWxpemVyID0gRC0+Z2V0SW5pdGlhbGl6ZXIoKSkKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEluaXRpYWxpemVyKSk7CisgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoRC0+Z2V0VHlwZSgpKSk7CisgIHJldHVybiB0cnVlOworfSkKKworREVGX1RSQVZFUlNFX0RFQ0woT01QQ2FwdHVyZWRFeHByRGVjbCwgeyBUUllfVE8oVHJhdmVyc2VWYXJIZWxwZXIoRCkpOyB9KQorCisvLyBBIGhlbHBlciBtZXRob2QgZm9yIFRlbXBsYXRlRGVjbCdzIGNoaWxkcmVuLgordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlVGVtcGxhdGVQYXJhbWV0ZXJMaXN0SGVscGVyKAorICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqVFBMKSB7CisgIGlmIChUUEwpIHsKKyAgICBmb3IgKFRlbXBsYXRlUGFyYW1ldGVyTGlzdDo6aXRlcmF0b3IgSSA9IFRQTC0+YmVnaW4oKSwgRSA9IFRQTC0+ZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgVFJZX1RPKFRyYXZlcnNlRGVjbCgqSSkpOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VEZWNsVGVtcGxhdGVQYXJhbWV0ZXJMaXN0cyhUICpEKSB7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBELT5nZXROdW1UZW1wbGF0ZVBhcmFtZXRlckxpc3RzKCk7IGkrKykgeworICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqVFBMID0gRC0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJMaXN0KGkpOworICAgIFRyYXZlcnNlVGVtcGxhdGVQYXJhbWV0ZXJMaXN0SGVscGVyKFRQTCk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVRlbXBsYXRlSW5zdGFudGlhdGlvbnMoCisgICAgQ2xhc3NUZW1wbGF0ZURlY2wgKkQpIHsKKyAgZm9yIChhdXRvICpTRCA6IEQtPnNwZWNpYWxpemF0aW9ucygpKSB7CisgICAgZm9yIChhdXRvICpSRCA6IFNELT5yZWRlY2xzKCkpIHsKKyAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gdmlzaXQgaW5qZWN0ZWQtY2xhc3MtbmFtZXMgaW4gdGhpcyB0cmF2ZXJzYWwuCisgICAgICBpZiAoY2FzdDxDWFhSZWNvcmREZWNsPihSRCktPmlzSW5qZWN0ZWRDbGFzc05hbWUoKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHN3aXRjaCAoCisgICAgICAgICAgY2FzdDxDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsPihSRCktPmdldFNwZWNpYWxpemF0aW9uS2luZCgpKSB7CisgICAgICAvLyBWaXNpdCB0aGUgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgd2l0aCB0aGUgcmVxdWVzdGVkIHBhdHRlcm4uCisgICAgICBjYXNlIFRTS19VbmRlY2xhcmVkOgorICAgICAgY2FzZSBUU0tfSW1wbGljaXRJbnN0YW50aWF0aW9uOgorICAgICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKFJEKSk7CisgICAgICAgIGJyZWFrOworCisgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIG9uIGFuIGV4cGxpY2l0IGluc3RhbnRpYXRpb24KKyAgICAgIC8vIG9yIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGJlY2F1c2UgdGhlcmUgd2lsbCBiZSBhbiBleHBsaWNpdAorICAgICAgLy8gbm9kZSBmb3IgaXQgZWxzZXdoZXJlLgorICAgICAgY2FzZSBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVjbGFyYXRpb246CisgICAgICBjYXNlIFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWZpbml0aW9uOgorICAgICAgY2FzZSBUU0tfRXhwbGljaXRTcGVjaWFsaXphdGlvbjoKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVRlbXBsYXRlSW5zdGFudGlhdGlvbnMoCisgICAgVmFyVGVtcGxhdGVEZWNsICpEKSB7CisgIGZvciAoYXV0byAqU0QgOiBELT5zcGVjaWFsaXphdGlvbnMoKSkgeworICAgIGZvciAoYXV0byAqUkQgOiBTRC0+cmVkZWNscygpKSB7CisgICAgICBzd2l0Y2ggKAorICAgICAgICAgIGNhc3Q8VmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w+KFJEKS0+Z2V0U3BlY2lhbGl6YXRpb25LaW5kKCkpIHsKKyAgICAgIGNhc2UgVFNLX1VuZGVjbGFyZWQ6CisgICAgICBjYXNlIFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb246CisgICAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woUkQpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlY2xhcmF0aW9uOgorICAgICAgY2FzZSBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVmaW5pdGlvbjoKKyAgICAgIGNhc2UgVFNLX0V4cGxpY2l0U3BlY2lhbGl6YXRpb246CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyBBIGhlbHBlciBtZXRob2QgZm9yIHRyYXZlcnNpbmcgdGhlIGluc3RhbnRpYXRpb25zIG9mIGEKKy8vIGZ1bmN0aW9uIHdoaWxlIHNraXBwaW5nIGl0cyBzcGVjaWFsaXphdGlvbnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VUZW1wbGF0ZUluc3RhbnRpYXRpb25zKAorICAgIEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpEKSB7CisgIGZvciAoYXV0byAqRkQgOiBELT5zcGVjaWFsaXphdGlvbnMoKSkgeworICAgIGZvciAoYXV0byAqUkQgOiBGRC0+cmVkZWNscygpKSB7CisgICAgICBzd2l0Y2ggKFJELT5nZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpKSB7CisgICAgICBjYXNlIFRTS19VbmRlY2xhcmVkOgorICAgICAgY2FzZSBUU0tfSW1wbGljaXRJbnN0YW50aWF0aW9uOgorICAgICAgICAvLyBXZSBkb24ndCBrbm93IHdoYXQga2luZCBvZiBGdW5jdGlvbkRlY2wgdGhpcyBpcy4KKyAgICAgICAgVFJZX1RPKFRyYXZlcnNlRGVjbChSRCkpOworICAgICAgICBicmVhazsKKworICAgICAgLy8gRklYTUU6IEZvciBub3cgdHJhdmVyc2UgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMgaGVyZS4gQ2hhbmdlIHRoYXQKKyAgICAgIC8vIG9uY2UgdGhleSBhcmUgcmVwcmVzZW50ZWQgYXMgZGVkaWNhdGVkIG5vZGVzIGluIHRoZSBBU1QuCisgICAgICBjYXNlIFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWNsYXJhdGlvbjoKKyAgICAgIGNhc2UgVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlZmluaXRpb246CisgICAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woUkQpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFNLX0V4cGxpY2l0U3BlY2lhbGl6YXRpb246CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyBUaGlzIG1hY3JvIHVuaWZpZXMgdGhlIHRyYXZlcnNhbCBvZiBjbGFzcywgdmFyaWFibGUgYW5kIGZ1bmN0aW9uCisvLyB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMuCisjZGVmaW5lIERFRl9UUkFWRVJTRV9UTVBMX0RFQ0woVE1QTERFQ0xLSU5EKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBERUZfVFJBVkVSU0VfREVDTChUTVBMREVDTEtJTkQjI1RlbXBsYXRlRGVjbCwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZVBhcmFtZXRlckxpc3RIZWxwZXIoRC0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCkpKTsgICBcCisgICAgVFJZX1RPKFRyYXZlcnNlRGVjbChELT5nZXRUZW1wbGF0ZWREZWNsKCkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBCeSBkZWZhdWx0LCB3ZSBkbyBub3QgdHJhdmVyc2UgdGhlIGluc3RhbnRpYXRpb25zIG9mICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgY2xhc3MgdGVtcGxhdGVzIHNpbmNlIHRoZXkgZG8gbm90IGFwcGVhciBpbiB0aGUgdXNlciBjb2RlLiBUaGUgICAgICAgICAgXAorICAgICAgIGZvbGxvd2luZyBjb2RlIG9wdGlvbmFsbHkgdHJhdmVyc2VzIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgV2Ugb25seSB0cmF2ZXJzZSB0aGUgY2xhc3MgaW5zdGFudGlhdGlvbnMgd2hlbiB3ZSBzZWUgdGhlIGNhbm9uaWNhbCAgICAgXAorICAgICAgIGRlY2xhcmF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSwgdG8gZW5zdXJlIHdlIG9ubHkgdmlzaXQgdGhlbSBvbmNlLiAqLyAgICAgIFwKKyAgICBpZiAoZ2V0RGVyaXZlZCgpLnNob3VsZFZpc2l0VGVtcGxhdGVJbnN0YW50aWF0aW9ucygpICYmICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEQgPT0gRC0+Z2V0Q2Fub25pY2FsRGVjbCgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVJbnN0YW50aWF0aW9ucyhEKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogTm90ZSB0aGF0IGdldEluc3RhbnRpYXRlZEZyb21NZW1iZXJUZW1wbGF0ZSgpIGlzIGp1c3QgYSBsaW5rICAgICAgICAgICAgXAorICAgICAgIGZyb20gYSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGJhY2sgdG8gdGhlIHRlbXBsYXRlIGZyb20gd2hpY2ggICAgICAgICAgIFwKKyAgICAgICBpdCB3YXMgaW5zdGFudGlhdGVkLCBhbmQgdGh1cyBzaG91bGQgbm90IGJlIHRyYXZlcnNlZC4gKi8gICAgICAgICAgICAgICBcCisgIH0pCisKK0RFRl9UUkFWRVJTRV9UTVBMX0RFQ0woQ2xhc3MpCitERUZfVFJBVkVSU0VfVE1QTF9ERUNMKFZhcikKK0RFRl9UUkFWRVJTRV9UTVBMX0RFQ0woRnVuY3Rpb24pCisKK0RFRl9UUkFWRVJTRV9ERUNMKFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCwgeworICAvLyBEIGlzIHRoZSAiVCIgaW4gc29tZXRoaW5nIGxpa2UKKyAgLy8gICB0ZW1wbGF0ZSA8dGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBUPiBjbGFzcyBjb250YWluZXIgeyB9OworICBUUllfVE8oVHJhdmVyc2VEZWNsKEQtPmdldFRlbXBsYXRlZERlY2woKSkpOworICBpZiAoRC0+aGFzRGVmYXVsdEFyZ3VtZW50KCkgJiYgIUQtPmRlZmF1bHRBcmd1bWVudFdhc0luaGVyaXRlZCgpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudExvYyhELT5nZXREZWZhdWx0QXJndW1lbnQoKSkpOworICB9CisgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlUGFyYW1ldGVyTGlzdEhlbHBlcihELT5nZXRUZW1wbGF0ZVBhcmFtZXRlcnMoKSkpOworfSkKKworREVGX1RSQVZFUlNFX0RFQ0woQnVpbHRpblRlbXBsYXRlRGVjbCwgeworICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZVBhcmFtZXRlckxpc3RIZWxwZXIoRC0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9ERUNMKFRlbXBsYXRlVHlwZVBhcm1EZWNsLCB7CisgIC8vIEQgaXMgdGhlICJUIiBpbiBzb21ldGhpbmcgbGlrZSAidGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgdmVjdG9yOyIKKyAgaWYgKEQtPmdldFR5cGVGb3JEZWNsKCkpCisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShRdWFsVHlwZShELT5nZXRUeXBlRm9yRGVjbCgpLCAwKSkpOworICBpZiAoRC0+aGFzRGVmYXVsdEFyZ3VtZW50KCkgJiYgIUQtPmRlZmF1bHRBcmd1bWVudFdhc0luaGVyaXRlZCgpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoRC0+Z2V0RGVmYXVsdEFyZ3VtZW50SW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9ERUNMKFR5cGVkZWZEZWNsLCB7CisgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoRC0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7CisgIC8vIFdlIHNob3VsZG4ndCB0cmF2ZXJzZSBELT5nZXRUeXBlRm9yRGVjbCgpOyBpdCdzIGEgcmVzdWx0IG9mCisgIC8vIGRlY2xhcmluZyB0aGUgdHlwZWRlZiwgbm90IHNvbWV0aGluZyB0aGF0IHdhcyB3cml0dGVuIGluIHRoZQorICAvLyBzb3VyY2UuCit9KQorCitERUZfVFJBVkVSU0VfREVDTChUeXBlQWxpYXNEZWNsLCB7CisgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoRC0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7CisgIC8vIFdlIHNob3VsZG4ndCB0cmF2ZXJzZSBELT5nZXRUeXBlRm9yRGVjbCgpOyBpdCdzIGEgcmVzdWx0IG9mCisgIC8vIGRlY2xhcmluZyB0aGUgdHlwZSBhbGlhcywgbm90IHNvbWV0aGluZyB0aGF0IHdhcyB3cml0dGVuIGluIHRoZQorICAvLyBzb3VyY2UuCit9KQorCitERUZfVFJBVkVSU0VfREVDTChUeXBlQWxpYXNUZW1wbGF0ZURlY2wsIHsKKyAgVFJZX1RPKFRyYXZlcnNlRGVjbChELT5nZXRUZW1wbGF0ZWREZWNsKCkpKTsKKyAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVQYXJhbWV0ZXJMaXN0SGVscGVyKEQtPmdldFRlbXBsYXRlUGFyYW1ldGVycygpKSk7Cit9KQorCitERUZfVFJBVkVSU0VfREVDTChVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wsIHsKKyAgLy8gQSBkZXBlbmRlbnQgdXNpbmcgZGVjbGFyYXRpb24gd2hpY2ggd2FzIG1hcmtlZCB3aXRoICd0eXBlbmFtZScuCisgIC8vICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgQSA6IHB1YmxpYyBCPFQ+IHsgdXNpbmcgdHlwZW5hbWUgQjxUPjo6Zm9vOyB9OworICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKEQtPmdldFF1YWxpZmllckxvYygpKSk7CisgIC8vIFdlIHNob3VsZG4ndCB0cmF2ZXJzZSBELT5nZXRUeXBlRm9yRGVjbCgpOyBpdCdzIGEgcmVzdWx0IG9mCisgIC8vIGRlY2xhcmluZyB0aGUgdHlwZSwgbm90IHNvbWV0aGluZyB0aGF0IHdhcyB3cml0dGVuIGluIHRoZQorICAvLyBzb3VyY2UuCit9KQorCitERUZfVFJBVkVSU0VfREVDTChFbnVtRGVjbCwgeworICBUUllfVE8oVHJhdmVyc2VEZWNsVGVtcGxhdGVQYXJhbWV0ZXJMaXN0cyhEKSk7CisKKyAgaWYgKEQtPmdldFR5cGVGb3JEZWNsKCkpCisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShRdWFsVHlwZShELT5nZXRUeXBlRm9yRGVjbCgpLCAwKSkpOworCisgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoRC0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKKyAgLy8gVGhlIGVudW1lcmF0b3JzIGFyZSBhbHJlYWR5IHRyYXZlcnNlZCBieQorICAvLyBkZWNsc19iZWdpbigpL2RlY2xzX2VuZCgpLgorfSkKKworLy8gSGVscGVyIG1ldGhvZHMgZm9yIFJlY29yZERlY2wgYW5kIGl0cyBjaGlsZHJlbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVJlY29yZEhlbHBlcihSZWNvcmREZWNsICpEKSB7CisgIC8vIFdlIHNob3VsZG4ndCB0cmF2ZXJzZSBELT5nZXRUeXBlRm9yRGVjbCgpOyBpdCdzIGEgcmVzdWx0IG9mCisgIC8vIGRlY2xhcmluZyB0aGUgdHlwZSwgbm90IHNvbWV0aGluZyB0aGF0IHdhcyB3cml0dGVuIGluIHRoZSBzb3VyY2UuCisKKyAgVFJZX1RPKFRyYXZlcnNlRGVjbFRlbXBsYXRlUGFyYW1ldGVyTGlzdHMoRCkpOworICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKEQtPmdldFF1YWxpZmllckxvYygpKSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VDWFhCYXNlU3BlY2lmaWVyKAorICAgIGNvbnN0IENYWEJhc2VTcGVjaWZpZXIgJkJhc2UpIHsKKyAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhCYXNlLmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlQ1hYUmVjb3JkSGVscGVyKENYWFJlY29yZERlY2wgKkQpIHsKKyAgaWYgKCFUcmF2ZXJzZVJlY29yZEhlbHBlcihEKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChELT5pc0NvbXBsZXRlRGVmaW5pdGlvbigpKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZJIDogRC0+YmFzZXMoKSkgeworICAgICAgVFJZX1RPKFRyYXZlcnNlQ1hYQmFzZVNwZWNpZmllcihJKSk7CisgICAgfQorICAgIC8vIFdlIGRvbid0IHRyYXZlcnNlIHRoZSBmcmllbmRzIG9yIHRoZSBjb252ZXJzaW9ucywgYXMgdGhleSBhcmUKKyAgICAvLyBhbHJlYWR5IGluIGRlY2xzX2JlZ2luKCkvZGVjbHNfZW5kKCkuCisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK0RFRl9UUkFWRVJTRV9ERUNMKFJlY29yZERlY2wsIHsgVFJZX1RPKFRyYXZlcnNlUmVjb3JkSGVscGVyKEQpKTsgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woQ1hYUmVjb3JkRGVjbCwgeyBUUllfVE8oVHJhdmVyc2VDWFhSZWNvcmRIZWxwZXIoRCkpOyB9KQorCisjZGVmaW5lIERFRl9UUkFWRVJTRV9UTVBMX1NQRUNfREVDTChUTVBMREVDTEtJTkQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBERUZfVFJBVkVSU0VfREVDTChUTVBMREVDTEtJTkQjI1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsLCB7ICAgICAgICAgICAgICAgIFwKKyAgICAvKiBGb3IgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgKCJzZXQ8aW50PiB4OyIpLCB3ZSBkb24ndCB3YW50IHRvICAgICAgICAgICBcCisgICAgICAgcmVjdXJzZSBhdCBhbGwsIHNpbmNlIHRoZSBpbnN0YXRpYXRlZCB0ZW1wbGF0ZSBpc24ndCB3cml0dGVuIGluICAgICAgICAgXAorICAgICAgIHRoZSBzb3VyY2UgY29kZSBhbnl3aGVyZS4gIChOb3RlIHRoZSBpbnN0YXRpYXRlZCAqdHlwZSogLS0gICAgICAgICAgICAgIFwKKyAgICAgICBzZXQ8aW50PiAtLSBpcyB3cml0dGVuLCBhbmQgd2lsbCBzdGlsbCBnZXQgYSBjYWxsYmFjayBvZiAgICAgICAgICAgICAgICBcCisgICAgICAgVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUpLiAgRm9yIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zICAgICAgICAgICAgICAgXAorICAgICAgICgidGVtcGxhdGUgc2V0PGludD47IiksIHdlIGRvIG5lZWQgYSBjYWxsYmFjaywgc2luY2UgdGhpcyAgICAgICAgICAgICAgIFwKKyAgICAgICBpcyB0aGUgb25seSBjYWxsYmFjayB0aGF0J3MgbWFkZSBmb3IgdGhpcyBpbnN0YW50aWF0aW9uLiAgICAgICAgICAgICAgICBcCisgICAgICAgV2UgdXNlIGdldFR5cGVBc1dyaXR0ZW4oKSB0byBkaXN0aW5ndWlzaC4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChUeXBlU291cmNlSW5mbyAqVFNJID0gRC0+Z2V0VHlwZUFzV3JpdHRlbigpKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVFNJLT5nZXRUeXBlTG9jKCkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoRC0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsgICAgICAgICAgICAgIFwKKyAgICBpZiAoIWdldERlcml2ZWQoKS5zaG91bGRWaXNpdFRlbXBsYXRlSW5zdGFudGlhdGlvbnMoKSAmJiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEQtPmdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKCkgIT0gVFNLX0V4cGxpY2l0U3BlY2lhbGl6YXRpb24pICAgICAgXAorICAgICAgLyogUmV0dXJuaW5nIGZyb20gaGVyZSBza2lwcyB0cmF2ZXJzaW5nIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGRlY2xhcmF0aW9uIGNvbnRleHQgb2YgdGhlICpUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAgICAgICAgICAgICAgICBcCisgICAgICAgICAoZW1iZWRkZWQgaW4gdGhlIERFRl9UUkFWRVJTRV9ERUNMKCkgbWFjcm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgd2hpY2ggY29udGFpbnMgdGhlIGluc3RhbnRpYXRlZCBtZW1iZXJzIG9mIHRoZSB0ZW1wbGF0ZS4gKi8gICAgICAgICAgIFwKKyAgICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0pCisKK0RFRl9UUkFWRVJTRV9UTVBMX1NQRUNfREVDTChDbGFzcykKK0RFRl9UUkFWRVJTRV9UTVBMX1NQRUNfREVDTChWYXIpCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRMb2NzSGVscGVyKAorICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMb2MgKlRBTCwgdW5zaWduZWQgQ291bnQpIHsKKyAgZm9yICh1bnNpZ25lZCBJID0gMDsgSSA8IENvdW50OyArK0kpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jKFRBTFtJXSkpOworICB9CisgIHJldHVybiB0cnVlOworfQorCisjZGVmaW5lIERFRl9UUkFWRVJTRV9UTVBMX1BBUlRfU1BFQ19ERUNMKFRNUExERUNMS0lORCwgREVDTEtJTkQpICAgICAgICAgICAgICAgXAorICBERUZfVFJBVkVSU0VfREVDTChUTVBMREVDTEtJTkQjI1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCwgeyAgICAgICAgIFwKKyAgICAvKiBUaGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbi4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqVFBMID0gRC0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCkpIHsgICAgICAgICAgICAgXAorICAgICAgZm9yIChUZW1wbGF0ZVBhcmFtZXRlckxpc3Q6Oml0ZXJhdG9yIEkgPSBUUEwtPmJlZ2luKCksIEUgPSBUUEwtPmVuZCgpOyAgIFwKKyAgICAgICAgICAgSSAhPSBFOyArK0kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woKkkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogVGhlIGFyZ3MgdGhhdCByZW1haW5zIHVuc3BlY2lhbGl6ZWQuICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRMb2NzSGVscGVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRC0+Z2V0VGVtcGxhdGVBcmdzQXNXcml0dGVuKCktPmdldFRlbXBsYXRlQXJncygpLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEQtPmdldFRlbXBsYXRlQXJnc0FzV3JpdHRlbigpLT5OdW1UZW1wbGF0ZUFyZ3MpKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBEb24ndCBuZWVkIHRoZSAqVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25IZWxwZXIsIGV2ZW4gICAgICAgICAgICAgICBcCisgICAgICAgdGhvdWdoIHRoYXQncyBvdXIgcGFyZW50IGNsYXNzIC0tIHdlIGFscmVhZHkgdmlzaXQgYWxsIHRoZSAgICAgICAgICAgICAgXAorICAgICAgIHRlbXBsYXRlIGFyZ3MgaGVyZS4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUUllfVE8oVHJhdmVyc2UjI0RFQ0xLSU5EIyNIZWxwZXIoRCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEluc3RhbnRpYXRpb25zIHdpbGwgaGF2ZSBiZWVuIHZpc2l0ZWQgd2l0aCB0aGUgcHJpbWFyeSB0ZW1wbGF0ZS4gKi8gICAgIFwKKyAgfSkKKworREVGX1RSQVZFUlNFX1RNUExfUEFSVF9TUEVDX0RFQ0woQ2xhc3MsIENYWFJlY29yZCkKK0RFRl9UUkFWRVJTRV9UTVBMX1BBUlRfU1BFQ19ERUNMKFZhciwgVmFyKQorCitERUZfVFJBVkVSU0VfREVDTChFbnVtQ29uc3RhbnREZWNsLCB7IFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0SW5pdEV4cHIoKSkpOyB9KQorCitERUZfVFJBVkVSU0VfREVDTChVbnJlc29sdmVkVXNpbmdWYWx1ZURlY2wsIHsKKyAgLy8gTGlrZSBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wsIGJ1dCB3aXRob3V0IHRoZSAndHlwZW5hbWUnOgorICAvLyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gQ2xhc3MgQSA6IHB1YmxpYyBCYXNlPFQ+IHsgdXNpbmcgQmFzZTxUPjo6Zm9vOyB9OworICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKEQtPmdldFF1YWxpZmllckxvYygpKSk7CisgIFRSWV9UTyhUcmF2ZXJzZURlY2xhcmF0aW9uTmFtZUluZm8oRC0+Z2V0TmFtZUluZm8oKSkpOworfSkKKworREVGX1RSQVZFUlNFX0RFQ0woSW5kaXJlY3RGaWVsZERlY2wsIHt9KQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VEZWNsYXJhdG9ySGVscGVyKERlY2xhcmF0b3JEZWNsICpEKSB7CisgIFRSWV9UTyhUcmF2ZXJzZURlY2xUZW1wbGF0ZVBhcmFtZXRlckxpc3RzKEQpKTsKKyAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhELT5nZXRRdWFsaWZpZXJMb2MoKSkpOworICBpZiAoRC0+Z2V0VHlwZVNvdXJjZUluZm8oKSkKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKEQtPmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOworICBlbHNlCisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShELT5nZXRUeXBlKCkpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0RFRl9UUkFWRVJTRV9ERUNMKERlY29tcG9zaXRpb25EZWNsLCB7CisgIFRSWV9UTyhUcmF2ZXJzZVZhckhlbHBlcihEKSk7CisgIGZvciAoYXV0byAqQmluZGluZyA6IEQtPmJpbmRpbmdzKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VEZWNsKEJpbmRpbmcpKTsKKyAgfQorfSkKKworREVGX1RSQVZFUlNFX0RFQ0woQmluZGluZ0RlY2wsIHsKKyAgaWYgKGdldERlcml2ZWQoKS5zaG91bGRWaXNpdEltcGxpY2l0Q29kZSgpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0QmluZGluZygpKSk7Cit9KQorCitERUZfVFJBVkVSU0VfREVDTChNU1Byb3BlcnR5RGVjbCwgeyBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdG9ySGVscGVyKEQpKTsgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woRmllbGREZWNsLCB7CisgIFRSWV9UTyhUcmF2ZXJzZURlY2xhcmF0b3JIZWxwZXIoRCkpOworICBpZiAoRC0+aXNCaXRGaWVsZCgpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0Qml0V2lkdGgoKSkpOworICBlbHNlIGlmIChELT5oYXNJbkNsYXNzSW5pdGlhbGl6ZXIoKSkKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEQtPmdldEluQ2xhc3NJbml0aWFsaXplcigpKSk7Cit9KQorCitERUZfVFJBVkVSU0VfREVDTChPYmpDQXREZWZzRmllbGREZWNsLCB7CisgIFRSWV9UTyhUcmF2ZXJzZURlY2xhcmF0b3JIZWxwZXIoRCkpOworICBpZiAoRC0+aXNCaXRGaWVsZCgpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0Qml0V2lkdGgoKSkpOworICAvLyBGSVhNRTogaW1wbGVtZW50IHRoZSByZXN0LgorfSkKKworREVGX1RSQVZFUlNFX0RFQ0woT2JqQ0l2YXJEZWNsLCB7CisgIFRSWV9UTyhUcmF2ZXJzZURlY2xhcmF0b3JIZWxwZXIoRCkpOworICBpZiAoRC0+aXNCaXRGaWVsZCgpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0Qml0V2lkdGgoKSkpOworICAvLyBGSVhNRTogaW1wbGVtZW50IHRoZSByZXN0LgorfSkKKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlRnVuY3Rpb25IZWxwZXIoRnVuY3Rpb25EZWNsICpEKSB7CisgIFRSWV9UTyhUcmF2ZXJzZURlY2xUZW1wbGF0ZVBhcmFtZXRlckxpc3RzKEQpKTsKKyAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhELT5nZXRRdWFsaWZpZXJMb2MoKSkpOworICBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdGlvbk5hbWVJbmZvKEQtPmdldE5hbWVJbmZvKCkpKTsKKworICAvLyBJZiB3ZSdyZSBhbiBleHBsaWNpdCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiwgaXRlcmF0ZSBvdmVyIHRoZQorICAvLyB0ZW1wbGF0ZSBhcmdzIHRoYXQgd2VyZSBleHBsaWNpdGx5IHNwZWNpZmllZC4gIElmIHdlIHdlcmUgZG9pbmcKKyAgLy8gdGhpcyBpbiB0eXBpbmcgb3JkZXIsIHdlJ2QgZG8gaXQgYmV0d2VlbiB0aGUgcmV0dXJuIHR5cGUgYW5kCisgIC8vIHRoZSBmdW5jdGlvbiBhcmdzLCBidXQgYm90aCBhcmUgaGFuZGxlZCBieSB0aGUgRnVuY3Rpb25UeXBlTG9jCisgIC8vIGFib3ZlLCBzbyB3ZSBoYXZlIHRvIGNob29zZSBvbmUgc2lkZS4gIEkndmUgZGVjaWRlZCB0byBkbyBiZWZvcmUuCisgIGlmIChjb25zdCBGdW5jdGlvblRlbXBsYXRlU3BlY2lhbGl6YXRpb25JbmZvICpGVFNJID0KKyAgICAgICAgICBELT5nZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uSW5mbygpKSB7CisgICAgaWYgKEZUU0ktPmdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKCkgIT0gVFNLX1VuZGVjbGFyZWQgJiYKKyAgICAgICAgRlRTSS0+Z2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoKSAhPSBUU0tfSW1wbGljaXRJbnN0YW50aWF0aW9uKSB7CisgICAgICAvLyBBIHNwZWNpYWxpemF0aW9uIG1pZ2h0IG5vdCBoYXZlIGV4cGxpY2l0IHRlbXBsYXRlIGFyZ3VtZW50cyBpZiBpdCBoYXMKKyAgICAgIC8vIGEgdGVtcGxhdGVkIHJldHVybiB0eXBlIGFuZCBjb25jcmV0ZSBhcmd1bWVudHMuCisgICAgICBpZiAoY29uc3QgQVNUVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICpUQUxJID0KKyAgICAgICAgICAgICAgRlRTSS0+VGVtcGxhdGVBcmd1bWVudHNBc1dyaXR0ZW4pIHsKKyAgICAgICAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudExvY3NIZWxwZXIoVEFMSS0+Z2V0VGVtcGxhdGVBcmdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBTEktPk51bVRlbXBsYXRlQXJncykpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFZpc2l0IHRoZSBmdW5jdGlvbiB0eXBlIGl0c2VsZiwgd2hpY2ggY2FuIGJlIGVpdGhlcgorICAvLyBGdW5jdGlvbk5vUHJvdG9UeXBlIG9yIEZ1bmN0aW9uUHJvdG9UeXBlLCBvciBhIHR5cGVkZWYuICBUaGlzCisgIC8vIGFsc28gY292ZXJzIHRoZSByZXR1cm4gdHlwZSBhbmQgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMsCisgIC8vIGluY2x1ZGluZyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMuCisgIGlmIChUeXBlU291cmNlSW5mbyAqVFNJID0gRC0+Z2V0VHlwZVNvdXJjZUluZm8oKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVFNJLT5nZXRUeXBlTG9jKCkpKTsKKyAgfSBlbHNlIGlmIChnZXREZXJpdmVkKCkuc2hvdWxkVmlzaXRJbXBsaWNpdENvZGUoKSkgeworICAgIC8vIFZpc2l0IHBhcmFtZXRlciB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgb2YgdGhlIGltcGxpY2l0IGZ1bmN0aW9uCisgICAgLy8gaWYgdGhlIHRyYXZlcnNlciBpcyB2aXNpdGluZyBpbXBsaWNpdCBjb2RlLiBQYXJhbWV0ZXIgdmFyaWFibGUKKyAgICAvLyBkZWNsYXJhdGlvbnMgZG8gbm90IGhhdmUgdmFsaWQgVHlwZVNvdXJjZUluZm8sIHNvIHRvIHZpc2l0IHRoZW0KKyAgICAvLyB3ZSBuZWVkIHRvIHRyYXZlcnNlIHRoZSBkZWNsYXJhdGlvbnMgZXhwbGljaXRseS4KKyAgICBmb3IgKFBhcm1WYXJEZWNsICpQYXJhbWV0ZXIgOiBELT5wYXJhbWV0ZXJzKCkpIHsKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woUGFyYW1ldGVyKSk7CisgICAgfQorICB9CisKKyAgaWYgKENYWENvbnN0cnVjdG9yRGVjbCAqQ3RvciA9IGR5bl9jYXN0PENYWENvbnN0cnVjdG9yRGVjbD4oRCkpIHsKKyAgICAvLyBDb25zdHJ1Y3RvciBpbml0aWFsaXplcnMuCisgICAgZm9yIChhdXRvICpJIDogQ3Rvci0+aW5pdHMoKSkgeworICAgICAgVFJZX1RPKFRyYXZlcnNlQ29uc3RydWN0b3JJbml0aWFsaXplcihJKSk7CisgICAgfQorICB9CisKKyAgaWYgKEQtPmlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0Qm9keSgpKSk7IC8vIEZ1bmN0aW9uIGJvZHkuCisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK0RFRl9UUkFWRVJTRV9ERUNMKEZ1bmN0aW9uRGVjbCwgeworICAvLyBXZSBza2lwIGRlY2xzX2JlZ2luL2RlY2xzX2VuZCwgd2hpY2ggYXJlIGFscmVhZHkgY292ZXJlZCBieQorICAvLyBUcmF2ZXJzZUZ1bmN0aW9uSGVscGVyKCkuCisgIFNob3VsZFZpc2l0Q2hpbGRyZW4gPSBmYWxzZTsKKyAgUmV0dXJuVmFsdWUgPSBUcmF2ZXJzZUZ1bmN0aW9uSGVscGVyKEQpOworfSkKKworREVGX1RSQVZFUlNFX0RFQ0woQ1hYRGVkdWN0aW9uR3VpZGVEZWNsLCB7CisgIC8vIFdlIHNraXAgZGVjbHNfYmVnaW4vZGVjbHNfZW5kLCB3aGljaCBhcmUgYWxyZWFkeSBjb3ZlcmVkIGJ5CisgIC8vIFRyYXZlcnNlRnVuY3Rpb25IZWxwZXIoKS4KKyAgU2hvdWxkVmlzaXRDaGlsZHJlbiA9IGZhbHNlOworICBSZXR1cm5WYWx1ZSA9IFRyYXZlcnNlRnVuY3Rpb25IZWxwZXIoRCk7Cit9KQorCitERUZfVFJBVkVSU0VfREVDTChDWFhNZXRob2REZWNsLCB7CisgIC8vIFdlIHNraXAgZGVjbHNfYmVnaW4vZGVjbHNfZW5kLCB3aGljaCBhcmUgYWxyZWFkeSBjb3ZlcmVkIGJ5CisgIC8vIFRyYXZlcnNlRnVuY3Rpb25IZWxwZXIoKS4KKyAgU2hvdWxkVmlzaXRDaGlsZHJlbiA9IGZhbHNlOworICBSZXR1cm5WYWx1ZSA9IFRyYXZlcnNlRnVuY3Rpb25IZWxwZXIoRCk7Cit9KQorCitERUZfVFJBVkVSU0VfREVDTChDWFhDb25zdHJ1Y3RvckRlY2wsIHsKKyAgLy8gV2Ugc2tpcCBkZWNsc19iZWdpbi9kZWNsc19lbmQsIHdoaWNoIGFyZSBhbHJlYWR5IGNvdmVyZWQgYnkKKyAgLy8gVHJhdmVyc2VGdW5jdGlvbkhlbHBlcigpLgorICBTaG91bGRWaXNpdENoaWxkcmVuID0gZmFsc2U7CisgIFJldHVyblZhbHVlID0gVHJhdmVyc2VGdW5jdGlvbkhlbHBlcihEKTsKK30pCisKKy8vIENYWENvbnZlcnNpb25EZWNsIGlzIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvci4KKy8vIEl0J3Mgbm90IGEgY2FzdCBleHByZXNzaW9uLgorREVGX1RSQVZFUlNFX0RFQ0woQ1hYQ29udmVyc2lvbkRlY2wsIHsKKyAgLy8gV2Ugc2tpcCBkZWNsc19iZWdpbi9kZWNsc19lbmQsIHdoaWNoIGFyZSBhbHJlYWR5IGNvdmVyZWQgYnkKKyAgLy8gVHJhdmVyc2VGdW5jdGlvbkhlbHBlcigpLgorICBTaG91bGRWaXNpdENoaWxkcmVuID0gZmFsc2U7CisgIFJldHVyblZhbHVlID0gVHJhdmVyc2VGdW5jdGlvbkhlbHBlcihEKTsKK30pCisKK0RFRl9UUkFWRVJTRV9ERUNMKENYWERlc3RydWN0b3JEZWNsLCB7CisgIC8vIFdlIHNraXAgZGVjbHNfYmVnaW4vZGVjbHNfZW5kLCB3aGljaCBhcmUgYWxyZWFkeSBjb3ZlcmVkIGJ5CisgIC8vIFRyYXZlcnNlRnVuY3Rpb25IZWxwZXIoKS4KKyAgU2hvdWxkVmlzaXRDaGlsZHJlbiA9IGZhbHNlOworICBSZXR1cm5WYWx1ZSA9IFRyYXZlcnNlRnVuY3Rpb25IZWxwZXIoRCk7Cit9KQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VWYXJIZWxwZXIoVmFyRGVjbCAqRCkgeworICBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdG9ySGVscGVyKEQpKTsKKyAgLy8gRGVmYXVsdCBwYXJhbXMgYXJlIHRha2VuIGNhcmUgb2Ygd2hlbiB3ZSB0cmF2ZXJzZSB0aGUgUGFybVZhckRlY2wuCisgIGlmICghaXNhPFBhcm1WYXJEZWNsPihEKSAmJgorICAgICAgKCFELT5pc0NYWEZvclJhbmdlRGVjbCgpIHx8IGdldERlcml2ZWQoKS5zaG91bGRWaXNpdEltcGxpY2l0Q29kZSgpKSkKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEQtPmdldEluaXQoKSkpOworICByZXR1cm4gdHJ1ZTsKK30KKworREVGX1RSQVZFUlNFX0RFQ0woVmFyRGVjbCwgeyBUUllfVE8oVHJhdmVyc2VWYXJIZWxwZXIoRCkpOyB9KQorCitERUZfVFJBVkVSU0VfREVDTChJbXBsaWNpdFBhcmFtRGVjbCwgeyBUUllfVE8oVHJhdmVyc2VWYXJIZWxwZXIoRCkpOyB9KQorCitERUZfVFJBVkVSU0VfREVDTChOb25UeXBlVGVtcGxhdGVQYXJtRGVjbCwgeworICAvLyBBIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlciwgZS5nLiAiUyIgaW4gdGVtcGxhdGU8aW50IFM+IGNsYXNzIEZvbyAuLi4KKyAgVFJZX1RPKFRyYXZlcnNlRGVjbGFyYXRvckhlbHBlcihEKSk7CisgIGlmIChELT5oYXNEZWZhdWx0QXJndW1lbnQoKSAmJiAhRC0+ZGVmYXVsdEFyZ3VtZW50V2FzSW5oZXJpdGVkKCkpCisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChELT5nZXREZWZhdWx0QXJndW1lbnQoKSkpOworfSkKKworREVGX1RSQVZFUlNFX0RFQ0woUGFybVZhckRlY2wsIHsKKyAgVFJZX1RPKFRyYXZlcnNlVmFySGVscGVyKEQpKTsKKworICBpZiAoRC0+aGFzRGVmYXVsdEFyZygpICYmIEQtPmhhc1VuaW5zdGFudGlhdGVkRGVmYXVsdEFyZygpICYmCisgICAgICAhRC0+aGFzVW5wYXJzZWREZWZhdWx0QXJnKCkpCisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChELT5nZXRVbmluc3RhbnRpYXRlZERlZmF1bHRBcmcoKSkpOworCisgIGlmIChELT5oYXNEZWZhdWx0QXJnKCkgJiYgIUQtPmhhc1VuaW5zdGFudGlhdGVkRGVmYXVsdEFyZygpICYmCisgICAgICAhRC0+aGFzVW5wYXJzZWREZWZhdWx0QXJnKCkpCisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChELT5nZXREZWZhdWx0QXJnKCkpKTsKK30pCisKKyN1bmRlZiBERUZfVFJBVkVSU0VfREVDTAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLSBTdG10IHRyYXZlcnNhbCAtLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZvciBzdG10cywgd2UgYXV0b21hdGUgKGluIHRoZSBERUZfVFJBVkVSU0VfU1RNVCBtYWNybykgaXRlcmF0aW5nCisvLyBvdmVyIHRoZSBjaGlsZHJlbiBkZWZpbmVkIGluIGNoaWxkcmVuKCkgKGV2ZXJ5IHN0bXQgZGVmaW5lcyB0aGVzZSwKKy8vIHRob3VnaCBzb21ldGltZXMgdGhlIHJhbmdlIGlzIGVtcHR5KS4gIEVhY2ggaW5kaXZpZHVhbCBUcmF2ZXJzZSoKKy8vIG1ldGhvZCBvbmx5IG5lZWRzIHRvIHdvcnJ5IGFib3V0IGNoaWxkcmVuIG90aGVyIHRoYW4gdGhvc2UuICBUbyBzZWUKKy8vIHdoYXQgY2hpbGRyZW4oKSBkb2VzIGZvciBhIGdpdmVuIGNsYXNzLCBzZWUsIGUuZy4sCisvLyAgIGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL1N0bXRfOGNwcF9zb3VyY2UuaHRtbAorCisvLyBUaGlzIG1hY3JvIG1ha2VzIGF2YWlsYWJsZSBhIHZhcmlhYmxlIFMsIHRoZSBwYXNzZWQtaW4gc3RtdC4KKyNkZWZpbmUgREVGX1RSQVZFUlNFX1NUTVQoU1RNVCwgQ09ERSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlIyNTVE1UKCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNUTVQgKlMsIERhdGFSZWN1cnNpb25RdWV1ZSAqUXVldWUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYm9vbCBTaG91bGRWaXNpdENoaWxkcmVuID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJvb2wgUmV0dXJuVmFsdWUgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIWdldERlcml2ZWQoKS5zaG91bGRUcmF2ZXJzZVBvc3RPcmRlcigpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUllfVE8oV2Fsa1VwRnJvbSMjU1RNVChTKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgQ09ERTsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoU2hvdWxkVmlzaXRDaGlsZHJlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmb3IgKFN0bXQgKiBTdWJTdG10IDogZ2V0RGVyaXZlZCgpLmdldFN0bXRDaGlsZHJlbihTKSkgeyAgICAgICAgICAgICAgICAgXAorICAgICAgICBUUllfVE9fVFJBVkVSU0VfT1JfRU5RVUVVRV9TVE1UKFN1YlN0bXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghUXVldWUgJiYgUmV0dXJuVmFsdWUgJiYgZ2V0RGVyaXZlZCgpLnNob3VsZFRyYXZlcnNlUG9zdE9yZGVyKCkpICAgICAgIFwKKyAgICAgIFRSWV9UTyhXYWxrVXBGcm9tIyNTVE1UKFMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIFJldHVyblZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK0RFRl9UUkFWRVJTRV9TVE1UKEdDQ0FzbVN0bXQsIHsKKyAgVFJZX1RPX1RSQVZFUlNFX09SX0VOUVVFVUVfU1RNVChTLT5nZXRBc21TdHJpbmcoKSk7CisgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBTLT5nZXROdW1JbnB1dHMoKTsgSSA8IEU7ICsrSSkgeworICAgIFRSWV9UT19UUkFWRVJTRV9PUl9FTlFVRVVFX1NUTVQoUy0+Z2V0SW5wdXRDb25zdHJhaW50TGl0ZXJhbChJKSk7CisgIH0KKyAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IFMtPmdldE51bU91dHB1dHMoKTsgSSA8IEU7ICsrSSkgeworICAgIFRSWV9UT19UUkFWRVJTRV9PUl9FTlFVRVVFX1NUTVQoUy0+Z2V0T3V0cHV0Q29uc3RyYWludExpdGVyYWwoSSkpOworICB9CisgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBTLT5nZXROdW1DbG9iYmVycygpOyBJIDwgRTsgKytJKSB7CisgICAgVFJZX1RPX1RSQVZFUlNFX09SX0VOUVVFVUVfU1RNVChTLT5nZXRDbG9iYmVyU3RyaW5nTGl0ZXJhbChJKSk7CisgIH0KKyAgLy8gY2hpbGRyZW4oKSBpdGVyYXRlcyBvdmVyIGlucHV0RXhwciBhbmQgb3V0cHV0RXhwci4KK30pCisKK0RFRl9UUkFWRVJTRV9TVE1UKAorICAgIE1TQXNtU3RtdCwKKyAgICB7Ly8gRklYTUU6IE1TIEFzbSBkb2Vzbid0IGN1cnJlbnRseSBwYXJzZSBDb25zdHJhaW50cywgQ2xvYmJlcnMsIGV0Yy4gIE9uY2UKKyAgICAgLy8gYWRkZWQgdGhpcyBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZC4KKyAgICB9KQorCitERUZfVFJBVkVSU0VfU1RNVChDWFhDYXRjaFN0bXQsIHsKKyAgVFJZX1RPKFRyYXZlcnNlRGVjbChTLT5nZXRFeGNlcHRpb25EZWNsKCkpKTsKKyAgLy8gY2hpbGRyZW4oKSBpdGVyYXRlcyBvdmVyIHRoZSBoYW5kbGVyIGJsb2NrLgorfSkKKworREVGX1RSQVZFUlNFX1NUTVQoRGVjbFN0bXQsIHsKKyAgZm9yIChhdXRvICpJIDogUy0+ZGVjbHMoKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woSSkpOworICB9CisgIC8vIFN1cHByZXNzIHRoZSBkZWZhdWx0IGl0ZXJhdGlvbiBvdmVyIGNoaWxkcmVuKCkgYnkKKyAgLy8gcmV0dXJuaW5nLiAgSGVyZSdzIHdoeTogQSBEZWNsU3RtdCBsb29rcyBsaWtlICd0eXBlIHZhciBbPQorICAvLyBpbml0aWFsaXplcl0nLiAgVGhlIGRlY2xzIGFib3ZlIGFscmVhZHkgdHJhdmVyc2Ugb3ZlciB0aGUKKyAgLy8gaW5pdGlhbGl6ZXJzLCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIGl0IGFnYWluICh3aGljaAorICAvLyBjaGlsZHJlbigpIHdvdWxkIGRvKS4KKyAgU2hvdWxkVmlzaXRDaGlsZHJlbiA9IGZhbHNlOworfSkKKworLy8gVGhlc2Ugbm9uLWV4cHIgc3RtdHMgKG1vc3Qgb2YgdGhlbSksIGRvIG5vdCBuZWVkIGFueSBhY3Rpb24gZXhjZXB0CisvLyBpdGVyYXRpbmcgb3ZlciB0aGUgY2hpbGRyZW4uCitERUZfVFJBVkVSU0VfU1RNVChCcmVha1N0bXQsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoQ1hYVHJ5U3RtdCwge30pCitERUZfVFJBVkVSU0VfU1RNVChDYXNlU3RtdCwge30pCitERUZfVFJBVkVSU0VfU1RNVChDb21wb3VuZFN0bXQsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoQ29udGludWVTdG10LCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKERlZmF1bHRTdG10LCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKERvU3RtdCwge30pCitERUZfVFJBVkVSU0VfU1RNVChGb3JTdG10LCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKEdvdG9TdG10LCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKElmU3RtdCwge30pCitERUZfVFJBVkVSU0VfU1RNVChJbmRpcmVjdEdvdG9TdG10LCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKExhYmVsU3RtdCwge30pCitERUZfVFJBVkVSU0VfU1RNVChBdHRyaWJ1dGVkU3RtdCwge30pCitERUZfVFJBVkVSU0VfU1RNVChOdWxsU3RtdCwge30pCitERUZfVFJBVkVSU0VfU1RNVChPYmpDQXRDYXRjaFN0bXQsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0F0RmluYWxseVN0bXQsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0F0U3luY2hyb25pemVkU3RtdCwge30pCitERUZfVFJBVkVSU0VfU1RNVChPYmpDQXRUaHJvd1N0bXQsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0F0VHJ5U3RtdCwge30pCitERUZfVFJBVkVSU0VfU1RNVChPYmpDRm9yQ29sbGVjdGlvblN0bXQsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0F1dG9yZWxlYXNlUG9vbFN0bXQsIHt9KQorCitERUZfVFJBVkVSU0VfU1RNVChDWFhGb3JSYW5nZVN0bXQsIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuc2hvdWxkVmlzaXRJbXBsaWNpdENvZGUoKSkgeworICAgIFRSWV9UT19UUkFWRVJTRV9PUl9FTlFVRVVFX1NUTVQoUy0+Z2V0TG9vcFZhclN0bXQoKSk7CisgICAgVFJZX1RPX1RSQVZFUlNFX09SX0VOUVVFVUVfU1RNVChTLT5nZXRSYW5nZUluaXQoKSk7CisgICAgVFJZX1RPX1RSQVZFUlNFX09SX0VOUVVFVUVfU1RNVChTLT5nZXRCb2R5KCkpOworICAgIC8vIFZpc2l0IGV2ZXJ5dGhpbmcgZWxzZSBvbmx5IGlmIHNob3VsZFZpc2l0SW1wbGljaXRDb2RlKCkuCisgICAgU2hvdWxkVmlzaXRDaGlsZHJlbiA9IGZhbHNlOworICB9Cit9KQorCitERUZfVFJBVkVSU0VfU1RNVChNU0RlcGVuZGVudEV4aXN0c1N0bXQsIHsKKyAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhTLT5nZXRRdWFsaWZpZXJMb2MoKSkpOworICBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdGlvbk5hbWVJbmZvKFMtPmdldE5hbWVJbmZvKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9TVE1UKFJldHVyblN0bXQsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoU3dpdGNoU3RtdCwge30pCitERUZfVFJBVkVSU0VfU1RNVChXaGlsZVN0bXQsIHt9KQorCitERUZfVFJBVkVSU0VfU1RNVChDWFhEZXBlbmRlbnRTY29wZU1lbWJlckV4cHIsIHsKKyAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhTLT5nZXRRdWFsaWZpZXJMb2MoKSkpOworICBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdGlvbk5hbWVJbmZvKFMtPmdldE1lbWJlck5hbWVJbmZvKCkpKTsKKyAgaWYgKFMtPmhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jc0hlbHBlcihTLT5nZXRUZW1wbGF0ZUFyZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLT5nZXROdW1UZW1wbGF0ZUFyZ3MoKSkpOworICB9Cit9KQorCitERUZfVFJBVkVSU0VfU1RNVChEZWNsUmVmRXhwciwgeworICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKFMtPmdldFF1YWxpZmllckxvYygpKSk7CisgIFRSWV9UTyhUcmF2ZXJzZURlY2xhcmF0aW9uTmFtZUluZm8oUy0+Z2V0TmFtZUluZm8oKSkpOworICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jc0hlbHBlcihTLT5nZXRUZW1wbGF0ZUFyZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy0+Z2V0TnVtVGVtcGxhdGVBcmdzKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9TVE1UKERlcGVuZGVudFNjb3BlRGVjbFJlZkV4cHIsIHsKKyAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhTLT5nZXRRdWFsaWZpZXJMb2MoKSkpOworICBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdGlvbk5hbWVJbmZvKFMtPmdldE5hbWVJbmZvKCkpKTsKKyAgaWYgKFMtPmhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jc0hlbHBlcihTLT5nZXRUZW1wbGF0ZUFyZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLT5nZXROdW1UZW1wbGF0ZUFyZ3MoKSkpOworICB9Cit9KQorCitERUZfVFJBVkVSU0VfU1RNVChNZW1iZXJFeHByLCB7CisgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoUy0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKKyAgVFJZX1RPKFRyYXZlcnNlRGVjbGFyYXRpb25OYW1lSW5mbyhTLT5nZXRNZW1iZXJOYW1lSW5mbygpKSk7CisgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRMb2NzSGVscGVyKFMtPmdldFRlbXBsYXRlQXJncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLT5nZXROdW1UZW1wbGF0ZUFyZ3MoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1NUTVQoCisgICAgSW1wbGljaXRDYXN0RXhwciwKKyAgICB7Ly8gV2UgZG9uJ3QgdHJhdmVyc2UgdGhlIGNhc3QgdHlwZSwgYXMgaXQncyBub3Qgd3JpdHRlbiBpbiB0aGUKKyAgICAgLy8gc291cmNlIGNvZGUuCisgICAgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoQ1N0eWxlQ2FzdEV4cHIsIHsKKyAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhTLT5nZXRUeXBlSW5mb0FzV3JpdHRlbigpLT5nZXRUeXBlTG9jKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9TVE1UKENYWEZ1bmN0aW9uYWxDYXN0RXhwciwgeworICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVJbmZvQXNXcml0dGVuKCktPmdldFR5cGVMb2MoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1NUTVQoQ1hYQ29uc3RDYXN0RXhwciwgeworICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVJbmZvQXNXcml0dGVuKCktPmdldFR5cGVMb2MoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1NUTVQoQ1hYRHluYW1pY0Nhc3RFeHByLCB7CisgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0VHlwZUluZm9Bc1dyaXR0ZW4oKS0+Z2V0VHlwZUxvYygpKSk7Cit9KQorCitERUZfVFJBVkVSU0VfU1RNVChDWFhSZWludGVycHJldENhc3RFeHByLCB7CisgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0VHlwZUluZm9Bc1dyaXR0ZW4oKS0+Z2V0VHlwZUxvYygpKSk7Cit9KQorCitERUZfVFJBVkVSU0VfU1RNVChDWFhTdGF0aWNDYXN0RXhwciwgeworICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVJbmZvQXNXcml0dGVuKCktPmdldFR5cGVMb2MoKSkpOworfSkKKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlU3luT3JTZW1Jbml0TGlzdEV4cHIoCisgICAgSW5pdExpc3RFeHByICpTLCBEYXRhUmVjdXJzaW9uUXVldWUgKlF1ZXVlKSB7CisgIGlmIChTKSB7CisgICAgLy8gU2tpcCB0aGlzIGlmIHdlIHRyYXZlcnNlIHBvc3RvcmRlci4gV2Ugd2lsbCB2aXNpdCBpdCBsYXRlcgorICAgIC8vIGluIFBvc3RWaXNpdFN0bXQuCisgICAgaWYgKCFnZXREZXJpdmVkKCkuc2hvdWxkVHJhdmVyc2VQb3N0T3JkZXIoKSkKKyAgICAgIFRSWV9UTyhXYWxrVXBGcm9tSW5pdExpc3RFeHByKFMpKTsKKworICAgIC8vIEFsbCB3ZSBuZWVkIGFyZSB0aGUgZGVmYXVsdCBhY3Rpb25zLiAgRklYTUU6IHVzZSBhIGhlbHBlciBmdW5jdGlvbi4KKyAgICBmb3IgKFN0bXQgKlN1YlN0bXQgOiBTLT5jaGlsZHJlbigpKSB7CisgICAgICBUUllfVE9fVFJBVkVSU0VfT1JfRU5RVUVVRV9TVE1UKFN1YlN0bXQpOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggcGFpciBvZiBzeW50YWN0aWMgYW5kIHNlbWFudGljCisvLyBJbml0TGlzdEV4cHIsIGFuZCBpdCB0cmF2ZXJzZXMgdGhlIHN1YnRyZWVzIGRlZmluZWQgYnkgdGhlIHR3byBmb3Jtcy4gVGhpcworLy8gbWF5IGNhdXNlIHNvbWUgb2YgdGhlIGNoaWxkcmVuIHRvIGJlIHZpc2l0ZWQgdHdpY2UsIGlmIHRoZXkgYXBwZWFyIGJvdGggaW4KKy8vIHRoZSBzeW50YWN0aWMgYW5kIHRoZSBzZW1hbnRpYyBmb3JtLgorLy8KKy8vIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSBhYm91dCB3aGljaCBmb3JtIFxwIFMgdGFrZXMgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VJbml0TGlzdEV4cHIoCisgICAgSW5pdExpc3RFeHByICpTLCBEYXRhUmVjdXJzaW9uUXVldWUgKlF1ZXVlKSB7CisgIFRSWV9UTyhUcmF2ZXJzZVN5bk9yU2VtSW5pdExpc3RFeHByKAorICAgICAgUy0+aXNTZW1hbnRpY0Zvcm0oKSA/IFMtPmdldFN5bnRhY3RpY0Zvcm0oKSA6IFMsIFF1ZXVlKSk7CisgIFRSWV9UTyhUcmF2ZXJzZVN5bk9yU2VtSW5pdExpc3RFeHByKAorICAgICAgUy0+aXNTZW1hbnRpY0Zvcm0oKSA/IFMgOiBTLT5nZXRTZW1hbnRpY0Zvcm0oKSwgUXVldWUpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEdlbmVyaWNTZWxlY3Rpb25FeHByIGlzIGEgc3BlY2lhbCBjYXNlIGJlY2F1c2UgdGhlIHR5cGVzIGFuZCBleHByZXNzaW9ucworLy8gYXJlIGludGVybGVhdmVkLiAgV2UgYWxzbyBuZWVkIHRvIHdhdGNoIG91dCBmb3IgbnVsbCB0eXBlcyAoZGVmYXVsdAorLy8gZ2VuZXJpYyBhc3NvY2lhdGlvbnMpLgorREVGX1RSQVZFUlNFX1NUTVQoR2VuZXJpY1NlbGVjdGlvbkV4cHIsIHsKKyAgVFJZX1RPKFRyYXZlcnNlU3RtdChTLT5nZXRDb250cm9sbGluZ0V4cHIoKSkpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFMtPmdldE51bUFzc29jcygpOyArK2kpIHsKKyAgICBpZiAoVHlwZVNvdXJjZUluZm8gKlRTID0gUy0+Z2V0QXNzb2NUeXBlU291cmNlSW5mbyhpKSkKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVFMtPmdldFR5cGVMb2MoKSkpOworICAgIFRSWV9UT19UUkFWRVJTRV9PUl9FTlFVRVVFX1NUTVQoUy0+Z2V0QXNzb2NFeHByKGkpKTsKKyAgfQorICBTaG91bGRWaXNpdENoaWxkcmVuID0gZmFsc2U7Cit9KQorCisvLyBQc2V1ZG9PYmplY3RFeHByIGlzIGEgc3BlY2lhbCBjYXNlIGJlY2F1c2Ugb2YgdGhlIHdlaXJkbmVzcyB3aXRoCisvLyBzeW50YWN0aWMgZXhwcmVzc2lvbnMgYW5kIG9wYXF1ZSB2YWx1ZXMuCitERUZfVFJBVkVSU0VfU1RNVChQc2V1ZG9PYmplY3RFeHByLCB7CisgIFRSWV9UT19UUkFWRVJTRV9PUl9FTlFVRVVFX1NUTVQoUy0+Z2V0U3ludGFjdGljRm9ybSgpKTsKKyAgZm9yIChQc2V1ZG9PYmplY3RFeHByOjpzZW1hbnRpY3NfaXRlcmF0b3IgaSA9IFMtPnNlbWFudGljc19iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gUy0+c2VtYW50aWNzX2VuZCgpOworICAgICAgIGkgIT0gZTsgKytpKSB7CisgICAgRXhwciAqc3ViID0gKmk7CisgICAgaWYgKE9wYXF1ZVZhbHVlRXhwciAqT1ZFID0gZHluX2Nhc3Q8T3BhcXVlVmFsdWVFeHByPihzdWIpKQorICAgICAgc3ViID0gT1ZFLT5nZXRTb3VyY2VFeHByKCk7CisgICAgVFJZX1RPX1RSQVZFUlNFX09SX0VOUVVFVUVfU1RNVChzdWIpOworICB9CisgIFNob3VsZFZpc2l0Q2hpbGRyZW4gPSBmYWxzZTsKK30pCisKK0RFRl9UUkFWRVJTRV9TVE1UKENYWFNjYWxhclZhbHVlSW5pdEV4cHIsIHsKKyAgLy8gVGhpcyBpcyBjYWxsZWQgZm9yIGNvZGUgbGlrZSAncmV0dXJuIFQoKScgd2hlcmUgVCBpcyBhIGJ1aWx0LWluCisgIC8vIChpLmUuIG5vbi1jbGFzcykgdHlwZS4KKyAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhTLT5nZXRUeXBlU291cmNlSW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9TVE1UKENYWE5ld0V4cHIsIHsKKyAgLy8gVGhlIGNoaWxkLWl0ZXJhdG9yIHdpbGwgcGljayB1cCB0aGUgb3RoZXIgYXJndW1lbnRzLgorICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldEFsbG9jYXRlZFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1NUTVQoT2Zmc2V0T2ZFeHByLCB7CisgIC8vIFRoZSBjaGlsZC1pdGVyYXRvciB3aWxsIHBpY2sgdXAgdGhlIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nCisgIC8vIHRoZSBmaWVsZC4KKyAgLy8gRklNWEU6IGZvciBjb2RlIGxpa2Ugb2Zmc2V0b2YoRm9vLCBhLmIuYyksIHNob3VsZCB3ZSBnZXQKKyAgLy8gbWFraW5nIGEgTWVtYmVyRXhwciBjYWxsYmFja3MgZm9yIEZvby5hLCBGb28uYS5iLCBhbmQgRm9vLmEuYi5jPworICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1NUTVQoVW5hcnlFeHByT3JUeXBlVHJhaXRFeHByLCB7CisgIC8vIFRoZSBjaGlsZC1pdGVyYXRvciB3aWxsIHBpY2sgdXAgdGhlIGFyZyBpZiBpdCdzIGFuIGV4cHJlc3Npb24sCisgIC8vIGJ1dCBub3QgaWYgaXQncyBhIHR5cGUuCisgIGlmIChTLT5pc0FyZ3VtZW50VHlwZSgpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0QXJndW1lbnRUeXBlSW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9TVE1UKENYWFR5cGVpZEV4cHIsIHsKKyAgLy8gVGhlIGNoaWxkLWl0ZXJhdG9yIHdpbGwgcGljayB1cCB0aGUgYXJnIGlmIGl0J3MgYW4gZXhwcmVzc2lvbiwKKyAgLy8gYnV0IG5vdCBpZiBpdCdzIGEgdHlwZS4KKyAgaWYgKFMtPmlzVHlwZU9wZXJhbmQoKSkKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVPcGVyYW5kU291cmNlSW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE1TUHJvcGVydHlSZWZFeHByLCB7CisgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoUy0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE1TUHJvcGVydHlTdWJzY3JpcHRFeHByLCB7fSkKKworREVGX1RSQVZFUlNFX1NUTVQoQ1hYVXVpZG9mRXhwciwgeworICAvLyBUaGUgY2hpbGQtaXRlcmF0b3Igd2lsbCBwaWNrIHVwIHRoZSBhcmcgaWYgaXQncyBhbiBleHByZXNzaW9uLAorICAvLyBidXQgbm90IGlmIGl0J3MgYSB0eXBlLgorICBpZiAoUy0+aXNUeXBlT3BlcmFuZCgpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0VHlwZU9wZXJhbmRTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1NUTVQoVHlwZVRyYWl0RXhwciwgeworICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gUy0+Z2V0TnVtQXJncygpOyBJICE9IE47ICsrSSkKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldEFyZyhJKS0+Z2V0VHlwZUxvYygpKSk7Cit9KQorCitERUZfVFJBVkVSU0VfU1RNVChBcnJheVR5cGVUcmFpdEV4cHIsIHsKKyAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhTLT5nZXRRdWVyaWVkVHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7Cit9KQorCitERUZfVFJBVkVSU0VfU1RNVChFeHByZXNzaW9uVHJhaXRFeHByLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE9fVFJBVkVSU0VfT1JfRU5RVUVVRV9TVE1UKFMtPmdldFF1ZXJpZWRFeHByZXNzaW9uKCkpOyB9KQorCitERUZfVFJBVkVSU0VfU1RNVChWQUFyZ0V4cHIsIHsKKyAgLy8gVGhlIGNoaWxkLWl0ZXJhdG9yIHdpbGwgcGljayB1cCB0aGUgZXhwcmVzc2lvbiBhcmd1bWVudC4KKyAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhTLT5nZXRXcml0dGVuVHlwZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7Cit9KQorCitERUZfVFJBVkVSU0VfU1RNVChDWFhUZW1wb3JhcnlPYmplY3RFeHByLCB7CisgIC8vIFRoaXMgaXMgY2FsbGVkIGZvciBjb2RlIGxpa2UgJ3JldHVybiBUKCknIHdoZXJlIFQgaXMgYSBjbGFzcyB0eXBlLgorICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOworfSkKKworLy8gV2FsayBvbmx5IHRoZSB2aXNpYmxlIHBhcnRzIG9mIGxhbWJkYSBleHByZXNzaW9ucy4KK0RFRl9UUkFWRVJTRV9TVE1UKExhbWJkYUV4cHIsIHsKKyAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IFMtPmNhcHR1cmVfc2l6ZSgpOyBJICE9IE47ICsrSSkgeworICAgIGNvbnN0IExhbWJkYUNhcHR1cmUgKkMgPSBTLT5jYXB0dXJlX2JlZ2luKCkgKyBJOworICAgIGlmIChDLT5pc0V4cGxpY2l0KCkgfHwgZ2V0RGVyaXZlZCgpLnNob3VsZFZpc2l0SW1wbGljaXRDb2RlKCkpIHsKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZUxhbWJkYUNhcHR1cmUoUywgQywgUy0+Y2FwdHVyZV9pbml0X2JlZ2luKClbSV0pKTsKKyAgICB9CisgIH0KKworICBUeXBlTG9jIFRMID0gUy0+Z2V0Q2FsbE9wZXJhdG9yKCktPmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKTsKKyAgRnVuY3Rpb25Qcm90b1R5cGVMb2MgUHJvdG8gPSBUTC5nZXRBc0FkanVzdGVkPEZ1bmN0aW9uUHJvdG9UeXBlTG9jPigpOworCisgIGlmIChTLT5oYXNFeHBsaWNpdFBhcmFtZXRlcnMoKSAmJiBTLT5oYXNFeHBsaWNpdFJlc3VsdFR5cGUoKSkgeworICAgIC8vIFZpc2l0IHRoZSB3aG9sZSB0eXBlLgorICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwpKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoUy0+aGFzRXhwbGljaXRQYXJhbWV0ZXJzKCkpIHsKKyAgICAgIC8vIFZpc2l0IHBhcmFtZXRlcnMuCisgICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gUHJvdG8uZ2V0TnVtUGFyYW1zKCk7IEkgIT0gTjsgKytJKSB7CisgICAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woUHJvdG8uZ2V0UGFyYW0oSSkpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFMtPmhhc0V4cGxpY2l0UmVzdWx0VHlwZSgpKSB7CisgICAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFByb3RvLmdldFJldHVybkxvYygpKSk7CisgICAgfQorCisgICAgYXV0byAqVCA9IFByb3RvLmdldFR5cGVQdHIoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkUgOiBULT5leGNlcHRpb25zKCkpIHsKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoRSkpOworICAgIH0KKworICAgIGlmIChFeHByICpORSA9IFQtPmdldE5vZXhjZXB0RXhwcigpKQorICAgICAgVFJZX1RPX1RSQVZFUlNFX09SX0VOUVVFVUVfU1RNVChORSk7CisgIH0KKworICBSZXR1cm5WYWx1ZSA9IFRSQVZFUlNFX1NUTVRfQkFTRShMYW1iZGFCb2R5LCBMYW1iZGFFeHByLCBTLCBRdWV1ZSk7CisgIFNob3VsZFZpc2l0Q2hpbGRyZW4gPSBmYWxzZTsKK30pCisKK0RFRl9UUkFWRVJTRV9TVE1UKENYWFVucmVzb2x2ZWRDb25zdHJ1Y3RFeHByLCB7CisgIC8vIFRoaXMgaXMgY2FsbGVkIGZvciBjb2RlIGxpa2UgJ1QoKScsIHdoZXJlIFQgaXMgYSB0ZW1wbGF0ZSBhcmd1bWVudC4KKyAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhTLT5nZXRUeXBlU291cmNlSW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKK30pCisKKy8vIFRoZXNlIGV4cHJlc3Npb25zIGFsbCBtaWdodCB0YWtlIGV4cGxpY2l0IHRlbXBsYXRlIGFyZ3VtZW50cy4KKy8vIFdlIHRyYXZlcnNlIHRob3NlIGlmIHNvLiAgRklYTUU6IGltcGxlbWVudCB0aGVzZS4KK0RFRl9UUkFWRVJTRV9TVE1UKENYWENvbnN0cnVjdEV4cHIsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoQ2FsbEV4cHIsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoQ1hYTWVtYmVyQ2FsbEV4cHIsIHt9KQorCisvLyBUaGVzZSBleHBycyAobW9zdCBvZiB0aGVtKSwgZG8gbm90IG5lZWQgYW55IGFjdGlvbiBleGNlcHQgaXRlcmF0aW5nCisvLyBvdmVyIHRoZSBjaGlsZHJlbi4KK0RFRl9UUkFWRVJTRV9TVE1UKEFkZHJMYWJlbEV4cHIsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoQXJyYXlTdWJzY3JpcHRFeHByLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUEFycmF5U2VjdGlvbkV4cHIsIHt9KQorCitERUZfVFJBVkVSU0VfU1RNVChCbG9ja0V4cHIsIHsKKyAgVFJZX1RPKFRyYXZlcnNlRGVjbChTLT5nZXRCbG9ja0RlY2woKSkpOworICByZXR1cm4gdHJ1ZTsgLy8gbm8gY2hpbGQgc3RhdGVtZW50cyB0byBsb29wIHRocm91Z2guCit9KQorCitERUZfVFJBVkVSU0VfU1RNVChDaG9vc2VFeHByLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKENvbXBvdW5kTGl0ZXJhbEV4cHIsIHsKKyAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhTLT5nZXRUeXBlU291cmNlSW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKK30pCitERUZfVFJBVkVSU0VfU1RNVChDWFhCaW5kVGVtcG9yYXJ5RXhwciwge30pCitERUZfVFJBVkVSU0VfU1RNVChDWFhCb29sTGl0ZXJhbEV4cHIsIHt9KQorCitERUZfVFJBVkVSU0VfU1RNVChDWFhEZWZhdWx0QXJnRXhwciwgeworICBpZiAoZ2V0RGVyaXZlZCgpLnNob3VsZFZpc2l0SW1wbGljaXRDb2RlKCkpCisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChTLT5nZXRFeHByKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9TVE1UKENYWERlZmF1bHRJbml0RXhwciwge30pCitERUZfVFJBVkVSU0VfU1RNVChDWFhEZWxldGVFeHByLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKEV4cHJXaXRoQ2xlYW51cHMsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoQ1hYSW5oZXJpdGVkQ3RvckluaXRFeHByLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKENYWE51bGxQdHJMaXRlcmFsRXhwciwge30pCitERUZfVFJBVkVSU0VfU1RNVChDWFhTdGRJbml0aWFsaXplckxpc3RFeHByLCB7fSkKKworREVGX1RSQVZFUlNFX1NUTVQoQ1hYUHNldWRvRGVzdHJ1Y3RvckV4cHIsIHsKKyAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhTLT5nZXRRdWFsaWZpZXJMb2MoKSkpOworICBpZiAoVHlwZVNvdXJjZUluZm8gKlNjb3BlSW5mbyA9IFMtPmdldFNjb3BlVHlwZUluZm8oKSkKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFNjb3BlSW5mby0+Z2V0VHlwZUxvYygpKSk7CisgIGlmIChUeXBlU291cmNlSW5mbyAqRGVzdHJveWVkVHlwZUluZm8gPSBTLT5nZXREZXN0cm95ZWRUeXBlSW5mbygpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoRGVzdHJveWVkVHlwZUluZm8tPmdldFR5cGVMb2MoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1NUTVQoQ1hYVGhpc0V4cHIsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoQ1hYVGhyb3dFeHByLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKFVzZXJEZWZpbmVkTGl0ZXJhbCwge30pCitERUZfVFJBVkVSU0VfU1RNVChEZXNpZ25hdGVkSW5pdEV4cHIsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoRGVzaWduYXRlZEluaXRVcGRhdGVFeHByLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKEV4dFZlY3RvckVsZW1lbnRFeHByLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKEdOVU51bGxFeHByLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKEltcGxpY2l0VmFsdWVJbml0RXhwciwge30pCitERUZfVFJBVkVSU0VfU1RNVChOb0luaXRFeHByLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKEFycmF5SW5pdExvb3BFeHByLCB7CisgIC8vIEZJWE1FOiBUaGUgc291cmNlIGV4cHJlc3Npb24gb2YgdGhlIE9WRSBzaG91bGQgYmUgbGlzdGVkIGFzCisgIC8vIGEgY2hpbGQgb2YgdGhlIEFycmF5SW5pdExvb3BFeHByLgorICBpZiAoT3BhcXVlVmFsdWVFeHByICpPVkUgPSBTLT5nZXRDb21tb25FeHByKCkpCisgICAgVFJZX1RPX1RSQVZFUlNFX09SX0VOUVVFVUVfU1RNVChPVkUtPmdldFNvdXJjZUV4cHIoKSk7Cit9KQorREVGX1RSQVZFUlNFX1NUTVQoQXJyYXlJbml0SW5kZXhFeHByLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKE9iakNCb29sTGl0ZXJhbEV4cHIsIHt9KQorCitERUZfVFJBVkVSU0VfU1RNVChPYmpDRW5jb2RlRXhwciwgeworICBpZiAoVHlwZVNvdXJjZUluZm8gKlRJbmZvID0gUy0+Z2V0RW5jb2RlZFR5cGVTb3VyY2VJbmZvKCkpCisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUSW5mby0+Z2V0VHlwZUxvYygpKSk7Cit9KQorCitERUZfVFJBVkVSU0VfU1RNVChPYmpDSXNhRXhwciwge30pCitERUZfVFJBVkVSU0VfU1RNVChPYmpDSXZhclJlZkV4cHIsIHt9KQorCitERUZfVFJBVkVSU0VfU1RNVChPYmpDTWVzc2FnZUV4cHIsIHsKKyAgaWYgKFR5cGVTb3VyY2VJbmZvICpUSW5mbyA9IFMtPmdldENsYXNzUmVjZWl2ZXJUeXBlSW5mbygpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEluZm8tPmdldFR5cGVMb2MoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1NUTVQoT2JqQ1Byb3BlcnR5UmVmRXhwciwge30pCitERUZfVFJBVkVSU0VfU1RNVChPYmpDU3Vic2NyaXB0UmVmRXhwciwge30pCitERUZfVFJBVkVSU0VfU1RNVChPYmpDUHJvdG9jb2xFeHByLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKE9iakNTZWxlY3RvckV4cHIsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0luZGlyZWN0Q29weVJlc3RvcmVFeHByLCB7fSkKKworREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0JyaWRnZWRDYXN0RXhwciwgeworICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVJbmZvQXNXcml0dGVuKCktPmdldFR5cGVMb2MoKSkpOworfSkKKworREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0F2YWlsYWJpbGl0eUNoZWNrRXhwciwge30pCitERUZfVFJBVkVSU0VfU1RNVChQYXJlbkV4cHIsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoUGFyZW5MaXN0RXhwciwge30pCitERUZfVFJBVkVSU0VfU1RNVChQcmVkZWZpbmVkRXhwciwge30pCitERUZfVFJBVkVSU0VfU1RNVChTaHVmZmxlVmVjdG9yRXhwciwge30pCitERUZfVFJBVkVSU0VfU1RNVChDb252ZXJ0VmVjdG9yRXhwciwge30pCitERUZfVFJBVkVSU0VfU1RNVChTdG10RXhwciwge30pCitERUZfVFJBVkVSU0VfU1RNVChVbnJlc29sdmVkTG9va3VwRXhwciwgeworICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKFMtPmdldFF1YWxpZmllckxvYygpKSk7CisgIGlmIChTLT5oYXNFeHBsaWNpdFRlbXBsYXRlQXJncygpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudExvY3NIZWxwZXIoUy0+Z2V0VGVtcGxhdGVBcmdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy0+Z2V0TnVtVGVtcGxhdGVBcmdzKCkpKTsKKyAgfQorfSkKKworREVGX1RSQVZFUlNFX1NUTVQoVW5yZXNvbHZlZE1lbWJlckV4cHIsIHsKKyAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhTLT5nZXRRdWFsaWZpZXJMb2MoKSkpOworICBpZiAoUy0+aGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3MoKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRMb2NzSGVscGVyKFMtPmdldFRlbXBsYXRlQXJncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMtPmdldE51bVRlbXBsYXRlQXJncygpKSk7CisgIH0KK30pCisKK0RFRl9UUkFWRVJTRV9TVE1UKFNFSFRyeVN0bXQsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoU0VIRXhjZXB0U3RtdCwge30pCitERUZfVFJBVkVSU0VfU1RNVChTRUhGaW5hbGx5U3RtdCwge30pCitERUZfVFJBVkVSU0VfU1RNVChTRUhMZWF2ZVN0bXQsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoQ2FwdHVyZWRTdG10LCB7IFRSWV9UTyhUcmF2ZXJzZURlY2woUy0+Z2V0Q2FwdHVyZWREZWNsKCkpKTsgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoQ1hYT3BlcmF0b3JDYWxsRXhwciwge30pCitERUZfVFJBVkVSU0VfU1RNVChPcGFxdWVWYWx1ZUV4cHIsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoVHlwb0V4cHIsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoQ1VEQUtlcm5lbENhbGxFeHByLCB7fSkKKworLy8gVGhlc2Ugb3BlcmF0b3JzIChhbGwgb2YgdGhlbSkgZG8gbm90IG5lZWQgYW55IGFjdGlvbiBleGNlcHQKKy8vIGl0ZXJhdGluZyBvdmVyIHRoZSBjaGlsZHJlbi4KK0RFRl9UUkFWRVJTRV9TVE1UKEJpbmFyeUNvbmRpdGlvbmFsT3BlcmF0b3IsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoQ29uZGl0aW9uYWxPcGVyYXRvciwge30pCitERUZfVFJBVkVSU0VfU1RNVChVbmFyeU9wZXJhdG9yLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKEJpbmFyeU9wZXJhdG9yLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKENvbXBvdW5kQXNzaWduT3BlcmF0b3IsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoQ1hYTm9leGNlcHRFeHByLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKFBhY2tFeHBhbnNpb25FeHByLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKFNpemVPZlBhY2tFeHByLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKFN1YnN0Tm9uVHlwZVRlbXBsYXRlUGFybVBhY2tFeHByLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKFN1YnN0Tm9uVHlwZVRlbXBsYXRlUGFybUV4cHIsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoRnVuY3Rpb25QYXJtUGFja0V4cHIsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoTWF0ZXJpYWxpemVUZW1wb3JhcnlFeHByLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKENYWEZvbGRFeHByLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKEF0b21pY0V4cHIsIHt9KQorCisvLyBGb3IgY29yb3V0aW5lcyBleHByZXNzaW9ucywgdHJhdmVyc2UgZWl0aGVyIHRoZSBvcGVyYW5kCisvLyBhcyB3cml0dGVuIG9yIHRoZSBpbXBsaWVkIGNhbGxzLCBkZXBlbmRpbmcgb24gd2hhdCB0aGUKKy8vIGRlcml2ZWQgY2xhc3MgcmVxdWVzdHMuCitERUZfVFJBVkVSU0VfU1RNVChDb3JvdXRpbmVCb2R5U3RtdCwgeworICBpZiAoIWdldERlcml2ZWQoKS5zaG91bGRWaXNpdEltcGxpY2l0Q29kZSgpKSB7CisgICAgVFJZX1RPX1RSQVZFUlNFX09SX0VOUVVFVUVfU1RNVChTLT5nZXRCb2R5KCkpOworICAgIFNob3VsZFZpc2l0Q2hpbGRyZW4gPSBmYWxzZTsKKyAgfQorfSkKK0RFRl9UUkFWRVJTRV9TVE1UKENvcmV0dXJuU3RtdCwgeworICBpZiAoIWdldERlcml2ZWQoKS5zaG91bGRWaXNpdEltcGxpY2l0Q29kZSgpKSB7CisgICAgVFJZX1RPX1RSQVZFUlNFX09SX0VOUVVFVUVfU1RNVChTLT5nZXRPcGVyYW5kKCkpOworICAgIFNob3VsZFZpc2l0Q2hpbGRyZW4gPSBmYWxzZTsKKyAgfQorfSkKK0RFRl9UUkFWRVJTRV9TVE1UKENvYXdhaXRFeHByLCB7CisgIGlmICghZ2V0RGVyaXZlZCgpLnNob3VsZFZpc2l0SW1wbGljaXRDb2RlKCkpIHsKKyAgICBUUllfVE9fVFJBVkVSU0VfT1JfRU5RVUVVRV9TVE1UKFMtPmdldE9wZXJhbmQoKSk7CisgICAgU2hvdWxkVmlzaXRDaGlsZHJlbiA9IGZhbHNlOworICB9Cit9KQorREVGX1RSQVZFUlNFX1NUTVQoRGVwZW5kZW50Q29hd2FpdEV4cHIsIHsKKyAgaWYgKCFnZXREZXJpdmVkKCkuc2hvdWxkVmlzaXRJbXBsaWNpdENvZGUoKSkgeworICAgIFRSWV9UT19UUkFWRVJTRV9PUl9FTlFVRVVFX1NUTVQoUy0+Z2V0T3BlcmFuZCgpKTsKKyAgICBTaG91bGRWaXNpdENoaWxkcmVuID0gZmFsc2U7CisgIH0KK30pCitERUZfVFJBVkVSU0VfU1RNVChDb3lpZWxkRXhwciwgeworICBpZiAoIWdldERlcml2ZWQoKS5zaG91bGRWaXNpdEltcGxpY2l0Q29kZSgpKSB7CisgICAgVFJZX1RPX1RSQVZFUlNFX09SX0VOUVVFVUVfU1RNVChTLT5nZXRPcGVyYW5kKCkpOworICAgIFNob3VsZFZpc2l0Q2hpbGRyZW4gPSBmYWxzZTsKKyAgfQorfSkKKworLy8gVGhlc2UgbGl0ZXJhbHMgKGFsbCBvZiB0aGVtKSBkbyBub3QgbmVlZCBhbnkgYWN0aW9uLgorREVGX1RSQVZFUlNFX1NUTVQoSW50ZWdlckxpdGVyYWwsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoQ2hhcmFjdGVyTGl0ZXJhbCwge30pCitERUZfVFJBVkVSU0VfU1RNVChGbG9hdGluZ0xpdGVyYWwsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoSW1hZ2luYXJ5TGl0ZXJhbCwge30pCitERUZfVFJBVkVSU0VfU1RNVChTdHJpbmdMaXRlcmFsLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKE9iakNTdHJpbmdMaXRlcmFsLCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKE9iakNCb3hlZEV4cHIsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0FycmF5TGl0ZXJhbCwge30pCitERUZfVFJBVkVSU0VfU1RNVChPYmpDRGljdGlvbmFyeUxpdGVyYWwsIHt9KQorCisvLyBUcmF2ZXJzZSBPcGVuQ0w6IEFzVHlwZSwgQ29udmVydC4KK0RFRl9UUkFWRVJTRV9TVE1UKEFzVHlwZUV4cHIsIHt9KQorCisvLyBPcGVuTVAgZGlyZWN0aXZlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoCisgICAgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSAqUykgeworICBmb3IgKGF1dG8gKkMgOiBTLT5jbGF1c2VzKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VPTVBDbGF1c2UoQykpOworICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wKK1JlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlT01QTG9vcERpcmVjdGl2ZShPTVBMb29wRGlyZWN0aXZlICpTKSB7CisgIHJldHVybiBUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUyk7Cit9CisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUFBhcmFsbGVsRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFMpKTsgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoT01QU2ltZERpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUEZvckRpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUEZvclNpbWREaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUykpOyB9KQorCitERUZfVFJBVkVSU0VfU1RNVChPTVBTZWN0aW9uc0RpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUFNlY3Rpb25EaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUykpOyB9KQorCitERUZfVFJBVkVSU0VfU1RNVChPTVBTaW5nbGVEaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUykpOyB9KQorCitERUZfVFJBVkVSU0VfU1RNVChPTVBNYXN0ZXJEaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUykpOyB9KQorCitERUZfVFJBVkVSU0VfU1RNVChPTVBDcml0aWNhbERpcmVjdGl2ZSwgeworICBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdGlvbk5hbWVJbmZvKFMtPmdldERpcmVjdGl2ZU5hbWUoKSkpOworICBUUllfVE8oVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFMpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUFBhcmFsbGVsRm9yRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFMpKTsgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoT01QUGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFMpKTsgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoT01QUGFyYWxsZWxTZWN0aW9uc0RpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUFRhc2tEaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUykpOyB9KQorCitERUZfVFJBVkVSU0VfU1RNVChPTVBUYXNreWllbGREaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUykpOyB9KQorCitERUZfVFJBVkVSU0VfU1RNVChPTVBCYXJyaWVyRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFMpKTsgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoT01QVGFza3dhaXREaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUykpOyB9KQorCitERUZfVFJBVkVSU0VfU1RNVChPTVBUYXNrZ3JvdXBEaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUykpOyB9KQorCitERUZfVFJBVkVSU0VfU1RNVChPTVBDYW5jZWxsYXRpb25Qb2ludERpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUENhbmNlbERpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUEZsdXNoRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFMpKTsgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoT01QT3JkZXJlZERpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUEF0b21pY0RpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUFRhcmdldERpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUFRhcmdldERhdGFEaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUykpOyB9KQorCitERUZfVFJBVkVSU0VfU1RNVChPTVBUYXJnZXRFbnRlckRhdGFEaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUykpOyB9KQorCitERUZfVFJBVkVSU0VfU1RNVChPTVBUYXJnZXRFeGl0RGF0YURpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUFRhcmdldFBhcmFsbGVsRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFMpKTsgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoT01QVGFyZ2V0UGFyYWxsZWxGb3JEaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUykpOyB9KQorCitERUZfVFJBVkVSU0VfU1RNVChPTVBUZWFtc0RpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUFRhcmdldFVwZGF0ZURpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUFRhc2tMb29wRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFMpKTsgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoT01QVGFza0xvb3BTaW1kRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFMpKTsgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoT01QRGlzdHJpYnV0ZURpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUERpc3RyaWJ1dGVQYXJhbGxlbEZvckRpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUERpc3RyaWJ1dGVQYXJhbGxlbEZvclNpbWREaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUykpOyB9KQorCitERUZfVFJBVkVSU0VfU1RNVChPTVBEaXN0cmlidXRlU2ltZERpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUFRhcmdldFBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUFRhcmdldFNpbWREaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUykpOyB9KQorCitERUZfVFJBVkVSU0VfU1RNVChPTVBUZWFtc0Rpc3RyaWJ1dGVEaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUykpOyB9KQorCitERUZfVFJBVkVSU0VfU1RNVChPTVBUZWFtc0Rpc3RyaWJ1dGVTaW1kRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFMpKTsgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoT01QVGVhbXNEaXN0cmlidXRlUGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFMpKTsgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoT01QVGVhbXNEaXN0cmlidXRlUGFyYWxsZWxGb3JEaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUykpOyB9KQorCitERUZfVFJBVkVSU0VfU1RNVChPTVBUYXJnZXRUZWFtc0RpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZURpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFMpKTsgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoT01QVGFyZ2V0VGVhbXNEaXN0cmlidXRlUGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgeyBUUllfVE8oVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFMpKTsgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoT01QVGFyZ2V0VGVhbXNEaXN0cmlidXRlU2ltZERpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHsgVFJZX1RPKFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShTKSk7IH0pCisKKy8vIE9wZW5NUCBjbGF1c2VzLgordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlT01QQ2xhdXNlKE9NUENsYXVzZSAqQykgeworICBpZiAoIUMpCisgICAgcmV0dXJuIHRydWU7CisgIHN3aXRjaCAoQy0+Z2V0Q2xhdXNlS2luZCgpKSB7CisjZGVmaW5lIE9QRU5NUF9DTEFVU0UoTmFtZSwgQ2xhc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIE9NUENfIyNOYW1lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUUllfVE8oVmlzaXQjI0NsYXNzKHN0YXRpY19jYXN0PENsYXNzICo+KEMpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnJlYWs7CisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3Blbk1QS2luZHMuZGVmIgorICBjYXNlIE9NUENfdGhyZWFkcHJpdmF0ZToKKyAgY2FzZSBPTVBDX3VuaWZvcm06CisgIGNhc2UgT01QQ191bmtub3duOgorICAgIGJyZWFrOworICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBDbGF1c2VXaXRoUHJlSW5pdCgKKyAgICBPTVBDbGF1c2VXaXRoUHJlSW5pdCAqTm9kZSkgeworICBUUllfVE8oVHJhdmVyc2VTdG10KE5vZGUtPmdldFByZUluaXRTdG10KCkpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUENsYXVzZVdpdGhQb3N0VXBkYXRlKAorICAgIE9NUENsYXVzZVdpdGhQb3N0VXBkYXRlICpOb2RlKSB7CisgIFRSWV9UTyhWaXNpdE9NUENsYXVzZVdpdGhQcmVJbml0KE5vZGUpKTsKKyAgVFJZX1RPKFRyYXZlcnNlU3RtdChOb2RlLT5nZXRQb3N0VXBkYXRlRXhwcigpKSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBJZkNsYXVzZShPTVBJZkNsYXVzZSAqQykgeworICBUUllfVE8oVmlzaXRPTVBDbGF1c2VXaXRoUHJlSW5pdChDKSk7CisgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoQy0+Z2V0Q29uZGl0aW9uKCkpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUEZpbmFsQ2xhdXNlKE9NUEZpbmFsQ2xhdXNlICpDKSB7CisgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoQy0+Z2V0Q29uZGl0aW9uKCkpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbAorUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBOdW1UaHJlYWRzQ2xhdXNlKE9NUE51bVRocmVhZHNDbGF1c2UgKkMpIHsKKyAgVFJZX1RPKFZpc2l0T01QQ2xhdXNlV2l0aFByZUluaXQoQykpOworICBUUllfVE8oVHJhdmVyc2VTdG10KEMtPmdldE51bVRocmVhZHMoKSkpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QU2FmZWxlbkNsYXVzZShPTVBTYWZlbGVuQ2xhdXNlICpDKSB7CisgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoQy0+Z2V0U2FmZWxlbigpKSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBTaW1kbGVuQ2xhdXNlKE9NUFNpbWRsZW5DbGF1c2UgKkMpIHsKKyAgVFJZX1RPKFRyYXZlcnNlU3RtdChDLT5nZXRTaW1kbGVuKCkpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbAorUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBDb2xsYXBzZUNsYXVzZShPTVBDb2xsYXBzZUNsYXVzZSAqQykgeworICBUUllfVE8oVHJhdmVyc2VTdG10KEMtPmdldE51bUZvckxvb3BzKCkpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUERlZmF1bHRDbGF1c2UoT01QRGVmYXVsdENsYXVzZSAqKSB7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBQcm9jQmluZENsYXVzZShPTVBQcm9jQmluZENsYXVzZSAqKSB7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wKK1JlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QU2NoZWR1bGVDbGF1c2UoT01QU2NoZWR1bGVDbGF1c2UgKkMpIHsKKyAgVFJZX1RPKFZpc2l0T01QQ2xhdXNlV2l0aFByZUluaXQoQykpOworICBUUllfVE8oVHJhdmVyc2VTdG10KEMtPmdldENodW5rU2l6ZSgpKSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBPcmRlcmVkQ2xhdXNlKE9NUE9yZGVyZWRDbGF1c2UgKkMpIHsKKyAgVFJZX1RPKFRyYXZlcnNlU3RtdChDLT5nZXROdW1Gb3JMb29wcygpKSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBOb3dhaXRDbGF1c2UoT01QTm93YWl0Q2xhdXNlICopIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUFVudGllZENsYXVzZShPTVBVbnRpZWRDbGF1c2UgKikgeworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sCitSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUE1lcmdlYWJsZUNsYXVzZShPTVBNZXJnZWFibGVDbGF1c2UgKikgeworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QUmVhZENsYXVzZShPTVBSZWFkQ2xhdXNlICopIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUFdyaXRlQ2xhdXNlKE9NUFdyaXRlQ2xhdXNlICopIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUFVwZGF0ZUNsYXVzZShPTVBVcGRhdGVDbGF1c2UgKikgeworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QQ2FwdHVyZUNsYXVzZShPTVBDYXB0dXJlQ2xhdXNlICopIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUFNlcUNzdENsYXVzZShPTVBTZXFDc3RDbGF1c2UgKikgeworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QVGhyZWFkc0NsYXVzZShPTVBUaHJlYWRzQ2xhdXNlICopIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUFNJTURDbGF1c2UoT01QU0lNRENsYXVzZSAqKSB7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBOb2dyb3VwQ2xhdXNlKE9NUE5vZ3JvdXBDbGF1c2UgKikgeworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBDbGF1c2VMaXN0KFQgKk5vZGUpIHsKKyAgZm9yIChhdXRvICpFIDogTm9kZS0+dmFybGlzdHMoKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRSkpOworICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBQcml2YXRlQ2xhdXNlKE9NUFByaXZhdGVDbGF1c2UgKkMpIHsKKyAgVFJZX1RPKFZpc2l0T01QQ2xhdXNlTGlzdChDKSk7CisgIGZvciAoYXV0byAqRSA6IEMtPnByaXZhdGVfY29waWVzKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEUpKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QRmlyc3Rwcml2YXRlQ2xhdXNlKAorICAgIE9NUEZpcnN0cHJpdmF0ZUNsYXVzZSAqQykgeworICBUUllfVE8oVmlzaXRPTVBDbGF1c2VMaXN0KEMpKTsKKyAgVFJZX1RPKFZpc2l0T01QQ2xhdXNlV2l0aFByZUluaXQoQykpOworICBmb3IgKGF1dG8gKkUgOiBDLT5wcml2YXRlX2NvcGllcygpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChFKSk7CisgIH0KKyAgZm9yIChhdXRvICpFIDogQy0+aW5pdHMoKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRSkpOworICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBMYXN0cHJpdmF0ZUNsYXVzZSgKKyAgICBPTVBMYXN0cHJpdmF0ZUNsYXVzZSAqQykgeworICBUUllfVE8oVmlzaXRPTVBDbGF1c2VMaXN0KEMpKTsKKyAgVFJZX1RPKFZpc2l0T01QQ2xhdXNlV2l0aFBvc3RVcGRhdGUoQykpOworICBmb3IgKGF1dG8gKkUgOiBDLT5wcml2YXRlX2NvcGllcygpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChFKSk7CisgIH0KKyAgZm9yIChhdXRvICpFIDogQy0+c291cmNlX2V4cHJzKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEUpKTsKKyAgfQorICBmb3IgKGF1dG8gKkUgOiBDLT5kZXN0aW5hdGlvbl9leHBycygpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChFKSk7CisgIH0KKyAgZm9yIChhdXRvICpFIDogQy0+YXNzaWdubWVudF9vcHMoKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRSkpOworICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBTaGFyZWRDbGF1c2UoT01QU2hhcmVkQ2xhdXNlICpDKSB7CisgIFRSWV9UTyhWaXNpdE9NUENsYXVzZUxpc3QoQykpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QTGluZWFyQ2xhdXNlKE9NUExpbmVhckNsYXVzZSAqQykgeworICBUUllfVE8oVHJhdmVyc2VTdG10KEMtPmdldFN0ZXAoKSkpOworICBUUllfVE8oVHJhdmVyc2VTdG10KEMtPmdldENhbGNTdGVwKCkpKTsKKyAgVFJZX1RPKFZpc2l0T01QQ2xhdXNlTGlzdChDKSk7CisgIFRSWV9UTyhWaXNpdE9NUENsYXVzZVdpdGhQb3N0VXBkYXRlKEMpKTsKKyAgZm9yIChhdXRvICpFIDogQy0+cHJpdmF0ZXMoKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRSkpOworICB9CisgIGZvciAoYXV0byAqRSA6IEMtPmluaXRzKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEUpKTsKKyAgfQorICBmb3IgKGF1dG8gKkUgOiBDLT51cGRhdGVzKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEUpKTsKKyAgfQorICBmb3IgKGF1dG8gKkUgOiBDLT5maW5hbHMoKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRSkpOworICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBBbGlnbmVkQ2xhdXNlKE9NUEFsaWduZWRDbGF1c2UgKkMpIHsKKyAgVFJZX1RPKFRyYXZlcnNlU3RtdChDLT5nZXRBbGlnbm1lbnQoKSkpOworICBUUllfVE8oVmlzaXRPTVBDbGF1c2VMaXN0KEMpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUENvcHlpbkNsYXVzZShPTVBDb3B5aW5DbGF1c2UgKkMpIHsKKyAgVFJZX1RPKFZpc2l0T01QQ2xhdXNlTGlzdChDKSk7CisgIGZvciAoYXV0byAqRSA6IEMtPnNvdXJjZV9leHBycygpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChFKSk7CisgIH0KKyAgZm9yIChhdXRvICpFIDogQy0+ZGVzdGluYXRpb25fZXhwcnMoKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRSkpOworICB9CisgIGZvciAoYXV0byAqRSA6IEMtPmFzc2lnbm1lbnRfb3BzKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEUpKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QQ29weXByaXZhdGVDbGF1c2UoCisgICAgT01QQ29weXByaXZhdGVDbGF1c2UgKkMpIHsKKyAgVFJZX1RPKFZpc2l0T01QQ2xhdXNlTGlzdChDKSk7CisgIGZvciAoYXV0byAqRSA6IEMtPnNvdXJjZV9leHBycygpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChFKSk7CisgIH0KKyAgZm9yIChhdXRvICpFIDogQy0+ZGVzdGluYXRpb25fZXhwcnMoKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRSkpOworICB9CisgIGZvciAoYXV0byAqRSA6IEMtPmFzc2lnbm1lbnRfb3BzKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEUpKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sCitSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUFJlZHVjdGlvbkNsYXVzZShPTVBSZWR1Y3Rpb25DbGF1c2UgKkMpIHsKKyAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhDLT5nZXRRdWFsaWZpZXJMb2MoKSkpOworICBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdGlvbk5hbWVJbmZvKEMtPmdldE5hbWVJbmZvKCkpKTsKKyAgVFJZX1RPKFZpc2l0T01QQ2xhdXNlTGlzdChDKSk7CisgIFRSWV9UTyhWaXNpdE9NUENsYXVzZVdpdGhQb3N0VXBkYXRlKEMpKTsKKyAgZm9yIChhdXRvICpFIDogQy0+cHJpdmF0ZXMoKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRSkpOworICB9CisgIGZvciAoYXV0byAqRSA6IEMtPmxoc19leHBycygpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChFKSk7CisgIH0KKyAgZm9yIChhdXRvICpFIDogQy0+cmhzX2V4cHJzKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEUpKTsKKyAgfQorICBmb3IgKGF1dG8gKkUgOiBDLT5yZWR1Y3Rpb25fb3BzKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEUpKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QVGFza1JlZHVjdGlvbkNsYXVzZSgKKyAgICBPTVBUYXNrUmVkdWN0aW9uQ2xhdXNlICpDKSB7CisgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoQy0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKKyAgVFJZX1RPKFRyYXZlcnNlRGVjbGFyYXRpb25OYW1lSW5mbyhDLT5nZXROYW1lSW5mbygpKSk7CisgIFRSWV9UTyhWaXNpdE9NUENsYXVzZUxpc3QoQykpOworICBUUllfVE8oVmlzaXRPTVBDbGF1c2VXaXRoUG9zdFVwZGF0ZShDKSk7CisgIGZvciAoYXV0byAqRSA6IEMtPnByaXZhdGVzKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEUpKTsKKyAgfQorICBmb3IgKGF1dG8gKkUgOiBDLT5saHNfZXhwcnMoKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRSkpOworICB9CisgIGZvciAoYXV0byAqRSA6IEMtPnJoc19leHBycygpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChFKSk7CisgIH0KKyAgZm9yIChhdXRvICpFIDogQy0+cmVkdWN0aW9uX29wcygpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChFKSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUEluUmVkdWN0aW9uQ2xhdXNlKAorICAgIE9NUEluUmVkdWN0aW9uQ2xhdXNlICpDKSB7CisgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoQy0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKKyAgVFJZX1RPKFRyYXZlcnNlRGVjbGFyYXRpb25OYW1lSW5mbyhDLT5nZXROYW1lSW5mbygpKSk7CisgIFRSWV9UTyhWaXNpdE9NUENsYXVzZUxpc3QoQykpOworICBUUllfVE8oVmlzaXRPTVBDbGF1c2VXaXRoUG9zdFVwZGF0ZShDKSk7CisgIGZvciAoYXV0byAqRSA6IEMtPnByaXZhdGVzKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEUpKTsKKyAgfQorICBmb3IgKGF1dG8gKkUgOiBDLT5saHNfZXhwcnMoKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRSkpOworICB9CisgIGZvciAoYXV0byAqRSA6IEMtPnJoc19leHBycygpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChFKSk7CisgIH0KKyAgZm9yIChhdXRvICpFIDogQy0+cmVkdWN0aW9uX29wcygpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChFKSk7CisgIH0KKyAgZm9yIChhdXRvICpFIDogQy0+dGFza2dyb3VwX2Rlc2NyaXB0b3JzKCkpCisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChFKSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBGbHVzaENsYXVzZShPTVBGbHVzaENsYXVzZSAqQykgeworICBUUllfVE8oVmlzaXRPTVBDbGF1c2VMaXN0KEMpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUERlcGVuZENsYXVzZShPTVBEZXBlbmRDbGF1c2UgKkMpIHsKKyAgVFJZX1RPKFZpc2l0T01QQ2xhdXNlTGlzdChDKSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBEZXZpY2VDbGF1c2UoT01QRGV2aWNlQ2xhdXNlICpDKSB7CisgIFRSWV9UTyhWaXNpdE9NUENsYXVzZVdpdGhQcmVJbml0KEMpKTsKKyAgVFJZX1RPKFRyYXZlcnNlU3RtdChDLT5nZXREZXZpY2UoKSkpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QTWFwQ2xhdXNlKE9NUE1hcENsYXVzZSAqQykgeworICBUUllfVE8oVmlzaXRPTVBDbGF1c2VMaXN0KEMpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUE51bVRlYW1zQ2xhdXNlKAorICAgIE9NUE51bVRlYW1zQ2xhdXNlICpDKSB7CisgIFRSWV9UTyhWaXNpdE9NUENsYXVzZVdpdGhQcmVJbml0KEMpKTsKKyAgVFJZX1RPKFRyYXZlcnNlU3RtdChDLT5nZXROdW1UZWFtcygpKSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBUaHJlYWRMaW1pdENsYXVzZSgKKyAgICBPTVBUaHJlYWRMaW1pdENsYXVzZSAqQykgeworICBUUllfVE8oVmlzaXRPTVBDbGF1c2VXaXRoUHJlSW5pdChDKSk7CisgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoQy0+Z2V0VGhyZWFkTGltaXQoKSkpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QUHJpb3JpdHlDbGF1c2UoCisgICAgT01QUHJpb3JpdHlDbGF1c2UgKkMpIHsKKyAgVFJZX1RPKFRyYXZlcnNlU3RtdChDLT5nZXRQcmlvcml0eSgpKSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBHcmFpbnNpemVDbGF1c2UoCisgICAgT01QR3JhaW5zaXplQ2xhdXNlICpDKSB7CisgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoQy0+Z2V0R3JhaW5zaXplKCkpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUE51bVRhc2tzQ2xhdXNlKAorICAgIE9NUE51bVRhc2tzQ2xhdXNlICpDKSB7CisgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoQy0+Z2V0TnVtVGFza3MoKSkpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QSGludENsYXVzZShPTVBIaW50Q2xhdXNlICpDKSB7CisgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoQy0+Z2V0SGludCgpKSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBEaXN0U2NoZWR1bGVDbGF1c2UoCisgICAgT01QRGlzdFNjaGVkdWxlQ2xhdXNlICpDKSB7CisgIFRSWV9UTyhWaXNpdE9NUENsYXVzZVdpdGhQcmVJbml0KEMpKTsKKyAgVFJZX1RPKFRyYXZlcnNlU3RtdChDLT5nZXRDaHVua1NpemUoKSkpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sCitSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUERlZmF1bHRtYXBDbGF1c2UoT01QRGVmYXVsdG1hcENsYXVzZSAqQykgeworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QVG9DbGF1c2UoT01QVG9DbGF1c2UgKkMpIHsKKyAgVFJZX1RPKFZpc2l0T01QQ2xhdXNlTGlzdChDKSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBGcm9tQ2xhdXNlKE9NUEZyb21DbGF1c2UgKkMpIHsKKyAgVFJZX1RPKFZpc2l0T01QQ2xhdXNlTGlzdChDKSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBVc2VEZXZpY2VQdHJDbGF1c2UoCisgICAgT01QVXNlRGV2aWNlUHRyQ2xhdXNlICpDKSB7CisgIFRSWV9UTyhWaXNpdE9NUENsYXVzZUxpc3QoQykpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QSXNEZXZpY2VQdHJDbGF1c2UoCisgICAgT01QSXNEZXZpY2VQdHJDbGF1c2UgKkMpIHsKKyAgVFJZX1RPKFZpc2l0T01QQ2xhdXNlTGlzdChDKSk7CisgIHJldHVybiB0cnVlOworfQorCisvLyBGSVhNRTogbG9vayBhdCB0aGUgZm9sbG93aW5nIHRyaWNreS1zZWVtaW5nIGV4cHJzIHRvIHNlZSBpZiB3ZQorLy8gbmVlZCB0byByZWN1cnNlIG9uIGFueXRoaW5nLiAgVGhlc2UgYXJlIG9uZXMgdGhhdCBoYXZlIG1ldGhvZHMKKy8vIHJldHVybmluZyBkZWNscyBvciBxdWFsdHlwZXMgb3IgbmVzdGVkbmFtZXNwZWNpZmllciAtLSB0aG91Z2ggSSdtCisvLyBub3Qgc3VyZSBpZiB0aGV5IG93biB0aGVtIC0tIG9yIGp1c3Qgc2VlbWVkIHZlcnkgY29tcGxpY2F0ZWQsIG9yCisvLyBoYWQgbG90cyBvZiBzdWItdHlwZXMgdG8gZXhwbG9yZS4KKy8vCisvLyBWaXNpdE92ZXJsb2FkRXhwciBhbmQgaXRzIGNoaWxkcmVuOiByZWN1cnNlIG9uIHRlbXBsYXRlIGFyZ3M/IGV0Yz8KKworLy8gRklYTUU6IGdvIHRocm91Z2ggYWxsIHRoZSBzdG10cyBhbmQgZXhwcnMgYWdhaW4sIGFuZCBzZWUgd2hpY2ggb2YgdGhlbQorLy8gY3JlYXRlIG5ldyB0eXBlcywgYW5kIHJlY3Vyc2Ugb24gdGhlIHR5cGVzIChUeXBlTG9jcz8pIG9mIHRob3NlLgorLy8gQ2FuZGlkYXRlczoKKy8vCisvLyAgICBodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUNYWFR5cGVpZEV4cHIuaHRtbAorLy8gICAgaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFVbmFyeUV4cHJPclR5cGVUcmFpdEV4cHIuaHRtbAorLy8gICAgaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFUeXBlc0NvbXBhdGlibGVFeHByLmh0bWwKKy8vICAgIEV2ZXJ5IGNsYXNzIHRoYXQgaGFzIGdldFF1YWxpZmllci4KKworI3VuZGVmIERFRl9UUkFWRVJTRV9TVE1UCisjdW5kZWYgVFJBVkVSU0VfU1RNVAorI3VuZGVmIFRSQVZFUlNFX1NUTVRfQkFTRQorCisjdW5kZWYgVFJZX1RPCisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19BU1RfUkVDVVJTSVZFQVNUVklTSVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvUmVkZWNsYXJhYmxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvUmVkZWNsYXJhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiMGYzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9SZWRlY2xhcmFibGUuaApAQCAtMCwwICsxLDQxMCBAQAorLy89PT0tIFJlZGVjbGFyYWJsZS5oIC0gQmFzZSBmb3IgRGVjbHMgdGhhdCBjYW4gYmUgcmVkZWNsYXJlZCAtLSotIEMrKyAtKi09PT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIFJlZGVjbGFyYWJsZSBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9SRURFQ0xBUkFCTEVfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9SRURFQ0xBUkFCTEVfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0V4dGVybmFsQVNUU291cmNlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlclVuaW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQVNUQ29udGV4dDsKK2NsYXNzIERlY2w7CisKKy8vIFNvbWUgbm90ZXMgb24gcmVkZWNsYXJhYmxlczoKKy8vCisvLyAgLSBFdmVyeSByZWRlY2xhcmFibGUgaXMgb24gYSBjaXJjdWxhciBsaW5rZWQgbGlzdC4KKy8vCisvLyAgLSBFdmVyeSBkZWNsIGhhcyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGNoYWluIF9hbmRfIGEKKy8vICAgIERlY2xMaW5rIHRoYXQgbWF5IHBvaW50IHRvIG9uZSBvZiAzIHBvc3NpYmxlIHN0YXRlczoKKy8vICAgICAgLSB0aGUgInByZXZpb3VzIiAodGVtcG9yYWwpIGVsZW1lbnQgaW4gdGhlIGNoYWluCisvLyAgICAgIC0gdGhlICJsYXRlc3QiICh0ZW1wb3JhbCkgZWxlbWVudCBpbiB0aGUgY2hhaW4KKy8vICAgICAgLSB0aGUgYW4gInVuaW5pdGlhbGl6ZWQtbGF0ZXN0IiB2YWx1ZSAod2hlbiBuZXdseS1jb25zdHJ1Y3RlZCkKKy8vCisvLyAgLSBUaGUgZmlyc3QgZWxlbWVudCBpcyBhbHNvIG9mdGVuIGNhbGxlZCB0aGUgY2Fub25pY2FsIGVsZW1lbnQuIEV2ZXJ5CisvLyAgICBlbGVtZW50IGhhcyBhIHBvaW50ZXIgdG8gaXQgc28gdGhhdCAiZ2V0Q2Fub25pY2FsIiBjYW4gYmUgZmFzdC4KKy8vCisvLyAgLSBNb3N0IGxpbmtzIGluIHRoZSBjaGFpbiBwb2ludCB0byBwcmV2aW91cywgZXhjZXB0IHRoZSBsaW5rIG91dCBvZgorLy8gICAgdGhlIGZpcnN0OyBpdCBwb2ludHMgdG8gbGF0ZXN0LgorLy8KKy8vICAtIEVsZW1lbnRzIGFyZSBjYWxsZWQgImZpcnN0IiwgInByZXZpb3VzIiwgImxhdGVzdCIgb3IKKy8vICAgICJtb3N0LXJlY2VudCIgd2hlbiByZWZlcnJpbmcgdG8gdGVtcG9yYWwgb3JkZXI6IG9yZGVyIG9mIGFkZGl0aW9uCisvLyAgICB0byB0aGUgY2hhaW4uCisvLworLy8gIC0gVG8gbWFrZSBtYXR0ZXJzIGNvbmZ1c2luZywgdGhlIERlY2xMaW5rIHR5cGUgdXNlcyB0aGUgdGVybSAibmV4dCIKKy8vICAgIGZvciBpdHMgcG9pbnRlci1zdG9yYWdlIGludGVybmFsbHkgKHRodXMgZnVuY3Rpb25zIGxpa2UKKy8vICAgIE5leHRJc1ByZXZpb3VzKS4gSXQncyBlYXNpZXN0IHRvIGp1c3QgaWdub3JlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorLy8gICAgRGVjbExpbmsgd2hlbiBtYWtpbmcgc2Vuc2Ugb2YgdGhlIHJlZGVjbGFyYXRpb24gY2hhaW4uCisvLworLy8gIC0gVGhlcmUncyBhbHNvIGEgImRlZmluaXRpb24iIGxpbmsgZm9yIHNldmVyYWwgdHlwZXMgb2YKKy8vICAgIHJlZGVjbGFyYWJsZSwgd2hlcmUgb25seSBvbmUgZGVmaW5pdGlvbiBzaG91bGQgZXhpc3QgYXQgYW55IGdpdmVuCisvLyAgICB0aW1lIChhbmQgdGhlIGRlZm4gcG9pbnRlciBpcyBzdG9yZWQgaW4gdGhlIGRlY2wncyAiZGF0YSIgd2hpY2gKKy8vICAgIGlzIGNvcGllZCB0byBldmVyeSBlbGVtZW50IG9uIHRoZSBjaGFpbiB3aGVuIGl0J3MgY2hhbmdlZCkuCisvLworLy8gICAgSGVyZSBpcyBzb21lIEFTQ0lJIGFydDoKKy8vCisvLyAgICAgICJmaXJzdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhdGVzdCIKKy8vICAgICAgImNhbm9uaWNhbCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9zdCByZWNlbnQiCisvLyAgICAgICstLS0tLS0tLS0tLS0rICAgICAgICAgZmlyc3QgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tKworLy8gICAgICB8ICAgICAgICAgICAgfCA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgICAgICAgICAgICAgIHwKKy8vICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CisvLyAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAorLy8gICAgICB8ICAgICAgICAgICAgfCAgICAgICArLS0tLS0tLS0tLS0tLS0rICAgICAgIHwgICAgICAgICAgICAgIHwKKy8vICAgICAgfCAgICAgICAgICAgIHwgZmlyc3QgfCAgICAgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgICAgICB8CisvLyAgICAgIHwgICAgICAgICAgICB8IDwtLS0tIHwgICAgICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICAgICAgfAorLy8gICAgICB8ICAgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgICAgICB8ICAgICAgIHwgICAgICAgICAgICAgIHwKKy8vICAgICAgfCBAY2xhc3MgQSAgIHwgIGxpbmsgfCBAaW50ZXJmYWNlIEEgfCAgbGluayB8IEBjbGFzcyBBICAgICB8CisvLyAgICAgIHwgc2VlbiBmaXJzdCB8IDwtLS0tIHwgc2VlbiBzZWNvbmQgIHwgPC0tLS0gfCBzZWVuIHRoaXJkICAgfAorLy8gICAgICB8ICAgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgICAgICB8ICAgICAgIHwgICAgICAgICAgICAgIHwKKy8vICAgICAgKy0tLS0tLS0tLS0tLSsgICAgICAgKy0tLS0tLS0tLS0tLS0tKyAgICAgICArLS0tLS0tLS0tLS0tLS0rCisvLyAgICAgIHwgZGF0YSAgICAgICB8IGRlZm4gIHwgZGF0YSAgICAgICAgIHwgIGRlZm4gfCBkYXRhICAgICAgICAgfAorLy8gICAgICB8ICAgICAgICAgICAgfCAtLS0tPiB8ICAgICAgICAgICAgICB8IDwtLS0tIHwgICAgICAgICAgICAgIHwKKy8vICAgICAgKy0tLS0tLS0tLS0tLSsgICAgICAgKy0tLS0tLS0tLS0tLS0tKyAgICAgICArLS0tLS0tLS0tLS0tLS0rCisvLyAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwgICAgIF4gICAgICAgICAgICAgICAgICBeCisvLyAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHxkZWZuIHwgICAgICAgICAgICAgICAgICB8CisvLyAgICAgICAgfCBsaW5rICAgICAgICAgICAgICAgICstLS0tLSsgICAgICAgICAgICAgICAgICB8CisvLyAgICAgICAgKy0tPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKy8vLyBcYnJpZWYgUHJvdmlkZXMgY29tbW9uIGludGVyZmFjZSBmb3IgdGhlIERlY2xzIHRoYXQgY2FuIGJlIHJlZGVjbGFyZWQuCit0ZW1wbGF0ZTx0eXBlbmFtZSBkZWNsX3R5cGU+CitjbGFzcyBSZWRlY2xhcmFibGUgeworcHJvdGVjdGVkOgorICBjbGFzcyBEZWNsTGluayB7CisgICAgLy8vIEEgcG9pbnRlciB0byBhIGtub3duIGxhdGVzdCBkZWNsYXJhdGlvbiwgZWl0aGVyIHN0YXRpY2FsbHkga25vd24gb3IKKyAgICAvLy8gZ2VuZXJhdGlvbmFsbHkgdXBkYXRlZCBhcyBkZWNscyBhcmUgYWRkZWQgYnkgYW4gZXh0ZXJuYWwgc291cmNlLgorICAgIHVzaW5nIEtub3duTGF0ZXN0ID0KKyAgICAgICAgTGF6eUdlbmVyYXRpb25hbFVwZGF0ZVB0cjxjb25zdCBEZWNsICosIERlY2wgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0ZXJuYWxBU1RTb3VyY2U6OkNvbXBsZXRlUmVkZWNsQ2hhaW4+OworCisgICAgLy8vIFdlIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgQVNUQ29udGV4dCBpbiB0aGUgVW5pbml0aWFsaXplZExhdGVzdAorICAgIC8vLyBwb2ludGVyLCBidXQgdG8gYXZvaWQgY2lyY3VsYXIgdHlwZSBkZXBlbmRlbmNpZXMgd2hlbiB3ZSBzdGVhbCB0aGUgbG93CisgICAgLy8vIGJpdHMgb2YgdGhpcyBwb2ludGVyLCB3ZSB1c2UgYSByYXcgdm9pZCogaGVyZS4KKyAgICB1c2luZyBVbmluaXRpYWxpemVkTGF0ZXN0ID0gY29uc3Qgdm9pZCAqOworCisgICAgdXNpbmcgUHJldmlvdXMgPSBEZWNsICo7CisKKyAgICAvLy8gQSBwb2ludGVyIHRvIGVpdGhlciBhbiB1bmluaXRpYWxpemVkIGxhdGVzdCBkZWNsYXJhdGlvbiAod2hlcmUgZWl0aGVyCisgICAgLy8vIHdlJ3ZlIG5vdCB5ZXQgc2V0IHRoZSBwcmV2aW91cyBkZWNsIG9yIHRoZXJlIGlzbid0IG9uZSksIG9yIHRvIGEga25vd24KKyAgICAvLy8gcHJldmlvdXMgZGVjbGFyYXRpb24uCisgICAgdXNpbmcgTm90S25vd25MYXRlc3QgPSBsbHZtOjpQb2ludGVyVW5pb248UHJldmlvdXMsIFVuaW5pdGlhbGl6ZWRMYXRlc3Q+OworCisgICAgbXV0YWJsZSBsbHZtOjpQb2ludGVyVW5pb248Tm90S25vd25MYXRlc3QsIEtub3duTGF0ZXN0PiBOZXh0OworCisgIHB1YmxpYzoKKyAgICBlbnVtIFByZXZpb3VzVGFnIHsgUHJldmlvdXNMaW5rIH07CisgICAgZW51bSBMYXRlc3RUYWcgeyBMYXRlc3RMaW5rIH07CisKKyAgICBEZWNsTGluayhMYXRlc3RUYWcsIGNvbnN0IEFTVENvbnRleHQgJkN0eCkKKyAgICAgICAgOiBOZXh0KE5vdEtub3duTGF0ZXN0KHJlaW50ZXJwcmV0X2Nhc3Q8VW5pbml0aWFsaXplZExhdGVzdD4oJkN0eCkpKSB7fQorICAgIERlY2xMaW5rKFByZXZpb3VzVGFnLCBkZWNsX3R5cGUgKkQpIDogTmV4dChOb3RLbm93bkxhdGVzdChQcmV2aW91cyhEKSkpIHt9CisKKyAgICBib29sIE5leHRJc1ByZXZpb3VzKCkgY29uc3QgeworICAgICAgcmV0dXJuIE5leHQuaXM8Tm90S25vd25MYXRlc3Q+KCkgJiYKKyAgICAgICAgICAgICAvLyBGSVhNRTogJ3RlbXBsYXRlJyBpcyByZXF1aXJlZCBvbiB0aGUgbmV4dCBsaW5lIGR1ZSB0byBhbgorICAgICAgICAgICAgIC8vIGFwcGFyZW50IGNsYW5nIGJ1Zy4KKyAgICAgICAgICAgICBOZXh0LmdldDxOb3RLbm93bkxhdGVzdD4oKS50ZW1wbGF0ZSBpczxQcmV2aW91cz4oKTsKKyAgICB9CisKKyAgICBib29sIE5leHRJc0xhdGVzdCgpIGNvbnN0IHsgcmV0dXJuICFOZXh0SXNQcmV2aW91cygpOyB9CisKKyAgICBkZWNsX3R5cGUgKmdldE5leHQoY29uc3QgZGVjbF90eXBlICpEKSBjb25zdCB7CisgICAgICBpZiAoTmV4dC5pczxOb3RLbm93bkxhdGVzdD4oKSkgeworICAgICAgICBOb3RLbm93bkxhdGVzdCBOS0wgPSBOZXh0LmdldDxOb3RLbm93bkxhdGVzdD4oKTsKKyAgICAgICAgaWYgKE5LTC5pczxQcmV2aW91cz4oKSkKKyAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZGVjbF90eXBlKj4oTktMLmdldDxQcmV2aW91cz4oKSk7CisKKyAgICAgICAgLy8gQWxsb2NhdGUgdGhlIGdlbmVyYXRpb25hbCAnbW9zdCByZWNlbnQnIGNhY2hlIG5vdywgaWYgbmVlZGVkLgorICAgICAgICBOZXh0ID0gS25vd25MYXRlc3QoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQVNUQ29udGV4dCAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOS0wuZ2V0PFVuaW5pdGlhbGl6ZWRMYXRlc3Q+KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxkZWNsX3R5cGUgKj4oRCkpOworICAgICAgfQorCisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZGVjbF90eXBlKj4oTmV4dC5nZXQ8S25vd25MYXRlc3Q+KCkuZ2V0KEQpKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFByZXZpb3VzKGRlY2xfdHlwZSAqRCkgeworICAgICAgYXNzZXJ0KE5leHRJc1ByZXZpb3VzKCkgJiYgImRlY2wgYmVjYW1lIG5vbi1jYW5vbmljYWwgdW5leHBlY3RlZGx5Iik7CisgICAgICBOZXh0ID0gUHJldmlvdXMoRCk7CisgICAgfQorCisgICAgdm9pZCBzZXRMYXRlc3QoZGVjbF90eXBlICpEKSB7CisgICAgICBhc3NlcnQoTmV4dElzTGF0ZXN0KCkgJiYgImRlY2wgYmVjYW1lIGNhbm9uaWNhbCB1bmV4cGVjdGVkbHkiKTsKKyAgICAgIGlmIChOZXh0LmlzPE5vdEtub3duTGF0ZXN0PigpKSB7CisgICAgICAgIE5vdEtub3duTGF0ZXN0IE5LTCA9IE5leHQuZ2V0PE5vdEtub3duTGF0ZXN0PigpOworICAgICAgICBOZXh0ID0gS25vd25MYXRlc3QoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQVNUQ29udGV4dCAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOS0wuZ2V0PFVuaW5pdGlhbGl6ZWRMYXRlc3Q+KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhdXRvIExhdGVzdCA9IE5leHQuZ2V0PEtub3duTGF0ZXN0PigpOworICAgICAgICBMYXRlc3Quc2V0KEQpOworICAgICAgICBOZXh0ID0gTGF0ZXN0OworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgbWFya0luY29tcGxldGUoKSB7IE5leHQuZ2V0PEtub3duTGF0ZXN0PigpLm1hcmtJbmNvbXBsZXRlKCk7IH0KKworICAgIERlY2wgKmdldExhdGVzdE5vdFVwZGF0ZWQoKSBjb25zdCB7CisgICAgICBhc3NlcnQoTmV4dElzTGF0ZXN0KCkgJiYgImV4cGVjdGVkIGEgY2Fub25pY2FsIGRlY2wiKTsKKyAgICAgIGlmIChOZXh0LmlzPE5vdEtub3duTGF0ZXN0PigpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIHJldHVybiBOZXh0LmdldDxLbm93bkxhdGVzdD4oKS5nZXROb3RVcGRhdGVkKCk7CisgICAgfQorICB9OworCisgIHN0YXRpYyBEZWNsTGluayBQcmV2aW91c0RlY2xMaW5rKGRlY2xfdHlwZSAqRCkgeworICAgIHJldHVybiBEZWNsTGluayhEZWNsTGluazo6UHJldmlvdXNMaW5rLCBEKTsKKyAgfQorCisgIHN0YXRpYyBEZWNsTGluayBMYXRlc3REZWNsTGluayhjb25zdCBBU1RDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gRGVjbExpbmsoRGVjbExpbms6OkxhdGVzdExpbmssIEN0eCk7CisgIH0KKworICAvLy8gXGJyaWVmIFBvaW50cyB0byB0aGUgbmV4dCByZWRlY2xhcmF0aW9uIGluIHRoZSBjaGFpbi4KKyAgLy8vCisgIC8vLyBJZiBOZXh0SXNQcmV2aW91cygpIGlzIHRydWUsIHRoaXMgaXMgYSBsaW5rIHRvIHRoZSBwcmV2aW91cyBkZWNsYXJhdGlvbgorICAvLy8gb2YgdGhpcyBzYW1lIERlY2wuIElmIE5leHRJc0xhdGVzdCgpIGlzIHRydWUsIHRoaXMgaXMgdGhlIGZpcnN0CisgIC8vLyBkZWNsYXJhdGlvbiBhbmQgTGluayBwb2ludHMgdG8gdGhlIGxhdGVzdCBkZWNsYXJhdGlvbi4gRm9yIGV4YW1wbGU6CisgIC8vLworICAvLy8gICMxIGludCBmKGludCB4LCBpbnQgeSA9IDEpOyAvLyA8cG9pbnRlciB0byAjMywgdHJ1ZT4KKyAgLy8vICAjMiBpbnQgZihpbnQgeCA9IDAsIGludCB5KTsgLy8gPHBvaW50ZXIgdG8gIzEsIGZhbHNlPgorICAvLy8gICMzIGludCBmKGludCB4LCBpbnQgeSkgeyByZXR1cm4geCArIHk7IH0gLy8gPHBvaW50ZXIgdG8gIzIsIGZhbHNlPgorICAvLy8KKyAgLy8vIElmIHRoZXJlIGlzIG9ubHkgb25lIGRlY2xhcmF0aW9uLCBpdCBpcyA8cG9pbnRlciB0byBzZWxmLCB0cnVlPgorICBEZWNsTGluayBSZWRlY2xMaW5rOworCisgIGRlY2xfdHlwZSAqRmlyc3Q7CisKKyAgZGVjbF90eXBlICpnZXROZXh0UmVkZWNsYXJhdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVkZWNsTGluay5nZXROZXh0KHN0YXRpY19jYXN0PGNvbnN0IGRlY2xfdHlwZSAqPih0aGlzKSk7CisgIH0KKworcHVibGljOgorICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisKKyAgUmVkZWNsYXJhYmxlKGNvbnN0IEFTVENvbnRleHQgJkN0eCkKKyAgICAgIDogUmVkZWNsTGluayhMYXRlc3REZWNsTGluayhDdHgpKSwKKyAgICAgICAgRmlyc3Qoc3RhdGljX2Nhc3Q8ZGVjbF90eXBlICo+KHRoaXMpKSB7fQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBwcmV2aW91cyBkZWNsYXJhdGlvbiBvZiB0aGlzIGRlY2xhcmF0aW9uIG9yIE5VTEwgaWYgdGhpcworICAvLy8gaXMgdGhlIGZpcnN0IGRlY2xhcmF0aW9uLgorICBkZWNsX3R5cGUgKmdldFByZXZpb3VzRGVjbCgpIHsKKyAgICBpZiAoUmVkZWNsTGluay5OZXh0SXNQcmV2aW91cygpKQorICAgICAgcmV0dXJuIGdldE5leHRSZWRlY2xhcmF0aW9uKCk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgY29uc3QgZGVjbF90eXBlICpnZXRQcmV2aW91c0RlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8ZGVjbF90eXBlICo+KAorICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBkZWNsX3R5cGUqPih0aGlzKSktPmdldFByZXZpb3VzRGVjbCgpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGZpcnN0IGRlY2xhcmF0aW9uIG9mIHRoaXMgZGVjbGFyYXRpb24gb3IgaXRzZWxmIGlmIHRoaXMKKyAgLy8vIGlzIHRoZSBvbmx5IGRlY2xhcmF0aW9uLgorICBkZWNsX3R5cGUgKmdldEZpcnN0RGVjbCgpIHsgcmV0dXJuIEZpcnN0OyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGZpcnN0IGRlY2xhcmF0aW9uIG9mIHRoaXMgZGVjbGFyYXRpb24gb3IgaXRzZWxmIGlmIHRoaXMKKyAgLy8vIGlzIHRoZSBvbmx5IGRlY2xhcmF0aW9uLgorICBjb25zdCBkZWNsX3R5cGUgKmdldEZpcnN0RGVjbCgpIGNvbnN0IHsgcmV0dXJuIEZpcnN0OyB9CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGRlY2xhcmF0aW9uIGluIGl0cyByZWRlY2xhcmF0aW9uIGNoYWluLgorICBib29sIGlzRmlyc3REZWNsKCkgY29uc3QgeyByZXR1cm4gUmVkZWNsTGluay5OZXh0SXNMYXRlc3QoKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbW9zdCByZWNlbnQgKHJlKWRlY2xhcmF0aW9uIG9mIHRoaXMgZGVjbGFyYXRpb24uCisgIGRlY2xfdHlwZSAqZ2V0TW9zdFJlY2VudERlY2woKSB7CisgICAgcmV0dXJuIGdldEZpcnN0RGVjbCgpLT5nZXROZXh0UmVkZWNsYXJhdGlvbigpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBtb3N0IHJlY2VudCAocmUpZGVjbGFyYXRpb24gb2YgdGhpcyBkZWNsYXJhdGlvbi4KKyAgY29uc3QgZGVjbF90eXBlICpnZXRNb3N0UmVjZW50RGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Rmlyc3REZWNsKCktPmdldE5leHRSZWRlY2xhcmF0aW9uKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgcHJldmlvdXMgZGVjbGFyYXRpb24uIElmIFByZXZEZWNsIGlzIE5VTEwsIHNldCB0aGlzIGFzIHRoZQorICAvLy8gZmlyc3QgYW5kIG9ubHkgZGVjbGFyYXRpb24uCisgIHZvaWQgc2V0UHJldmlvdXNEZWNsKGRlY2xfdHlwZSAqUHJldkRlY2wpOworCisgIC8vLyBcYnJpZWYgSXRlcmF0ZXMgdGhyb3VnaCBhbGwgdGhlIHJlZGVjbGFyYXRpb25zIG9mIHRoZSBzYW1lIGRlY2wuCisgIGNsYXNzIHJlZGVjbF9pdGVyYXRvciB7CisgICAgLy8vIEN1cnJlbnQgLSBUaGUgY3VycmVudCBkZWNsYXJhdGlvbi4KKyAgICBkZWNsX3R5cGUgKkN1cnJlbnQgPSBudWxscHRyOworICAgIGRlY2xfdHlwZSAqU3RhcnRlcjsKKyAgICBib29sIFBhc3NlZEZpcnN0ID0gZmFsc2U7CisKKyAgcHVibGljOgorICAgIHVzaW5nIHZhbHVlX3R5cGUgPSBkZWNsX3R5cGUgKjsKKyAgICB1c2luZyByZWZlcmVuY2UgPSBkZWNsX3R5cGUgKjsKKyAgICB1c2luZyBwb2ludGVyID0gZGVjbF90eXBlICo7CisgICAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworICAgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHN0ZDo6cHRyZGlmZl90OworCisgICAgcmVkZWNsX2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IHJlZGVjbF9pdGVyYXRvcihkZWNsX3R5cGUgKkMpIDogQ3VycmVudChDKSwgU3RhcnRlcihDKSB7fQorCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIEN1cnJlbnQ7IH0KKyAgICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBDdXJyZW50OyB9CisKKyAgICByZWRlY2xfaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgICBhc3NlcnQoQ3VycmVudCAmJiAiQWR2YW5jaW5nIHdoaWxlIGl0ZXJhdG9yIGhhcyByZWFjaGVkIGVuZCIpOworICAgICAgLy8gU2FuaXR5IGNoZWNrIHRvIGF2b2lkIGluZmluaXRlIGxvb3Agb24gaW52YWxpZCByZWRlY2wgY2hhaW4uCisgICAgICBpZiAoQ3VycmVudC0+aXNGaXJzdERlY2woKSkgeworICAgICAgICBpZiAoUGFzc2VkRmlyc3QpIHsKKyAgICAgICAgICBhc3NlcnQoMCAmJiAiUGFzc2VkIGZpcnN0IGRlY2wgdHdpY2UsIGludmFsaWQgcmVkZWNsIGNoYWluISIpOworICAgICAgICAgIEN1cnJlbnQgPSBudWxscHRyOworICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBQYXNzZWRGaXJzdCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIC8vIEdldCBlaXRoZXIgcHJldmlvdXMgZGVjbCBvciBsYXRlc3QgZGVjbC4KKyAgICAgIGRlY2xfdHlwZSAqTmV4dCA9IEN1cnJlbnQtPmdldE5leHRSZWRlY2xhcmF0aW9uKCk7CisgICAgICBDdXJyZW50ID0gKE5leHQgIT0gU3RhcnRlcikgPyBOZXh0IDogbnVsbHB0cjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICByZWRlY2xfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKKyAgICAgIHJlZGVjbF9pdGVyYXRvciB0bXAoKnRoaXMpOworICAgICAgKysoKnRoaXMpOworICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KHJlZGVjbF9pdGVyYXRvciB4LCByZWRlY2xfaXRlcmF0b3IgeSkgeworICAgICAgcmV0dXJuIHguQ3VycmVudCA9PSB5LkN1cnJlbnQ7CisgICAgfQorICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0ocmVkZWNsX2l0ZXJhdG9yIHgsIHJlZGVjbF9pdGVyYXRvciB5KSB7CisgICAgICByZXR1cm4geC5DdXJyZW50ICE9IHkuQ3VycmVudDsKKyAgICB9CisgIH07CisKKyAgdXNpbmcgcmVkZWNsX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8cmVkZWNsX2l0ZXJhdG9yPjsKKworICAvLy8gXGJyaWVmIFJldHVybnMgYW4gaXRlcmF0b3IgcmFuZ2UgZm9yIGFsbCB0aGUgcmVkZWNsYXJhdGlvbnMgb2YgdGhlIHNhbWUKKyAgLy8vIGRlY2wuIEl0IHdpbGwgaXRlcmF0ZSBhdCBsZWFzdCBvbmNlICh3aGVuIHRoaXMgZGVjbCBpcyB0aGUgb25seSBvbmUpLgorICByZWRlY2xfcmFuZ2UgcmVkZWNscygpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVkZWNsX3JhbmdlKHJlZGVjbF9pdGVyYXRvcihjb25zdF9jYXN0PGRlY2xfdHlwZSAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBkZWNsX3R5cGUgKj4odGhpcykpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZGVjbF9pdGVyYXRvcigpKTsKKyAgfQorCisgIHJlZGVjbF9pdGVyYXRvciByZWRlY2xzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gcmVkZWNscygpLmJlZ2luKCk7IH0KKyAgcmVkZWNsX2l0ZXJhdG9yIHJlZGVjbHNfZW5kKCkgY29uc3QgeyByZXR1cm4gcmVkZWNscygpLmVuZCgpOyB9Cit9OworCisvLy8gXGJyaWVmIEdldCB0aGUgcHJpbWFyeSBkZWNsYXJhdGlvbiBmb3IgYSBkZWNsYXJhdGlvbiBmcm9tIGFuIEFTVCBmaWxlLiBUaGF0CisvLy8gd2lsbCBiZSB0aGUgZmlyc3QtbG9hZGVkIGRlY2xhcmF0aW9uLgorRGVjbCAqZ2V0UHJpbWFyeU1lcmdlZERlY2woRGVjbCAqRCk7CisKKy8vLyBcYnJpZWYgUHJvdmlkZXMgY29tbW9uIGludGVyZmFjZSBmb3IgdGhlIERlY2xzIHRoYXQgY2Fubm90IGJlIHJlZGVjbGFyZWQsCisvLy8gYnV0IGNhbiBiZSBtZXJnZWQgaWYgdGhlIHNhbWUgZGVjbGFyYXRpb24gaXMgYnJvdWdodCBpbiBmcm9tIG11bHRpcGxlCisvLy8gbW9kdWxlcy4KK3RlbXBsYXRlPHR5cGVuYW1lIGRlY2xfdHlwZT4KK2NsYXNzIE1lcmdlYWJsZSB7CitwdWJsaWM6CisgIE1lcmdlYWJsZSgpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZmlyc3QgZGVjbGFyYXRpb24gb2YgdGhpcyBkZWNsYXJhdGlvbiBvciBpdHNlbGYgaWYgdGhpcworICAvLy8gaXMgdGhlIG9ubHkgZGVjbGFyYXRpb24uCisgIGRlY2xfdHlwZSAqZ2V0Rmlyc3REZWNsKCkgeworICAgIGRlY2xfdHlwZSAqRCA9IHN0YXRpY19jYXN0PGRlY2xfdHlwZSo+KHRoaXMpOworICAgIGlmICghRC0+aXNGcm9tQVNURmlsZSgpKQorICAgICAgcmV0dXJuIEQ7CisgICAgcmV0dXJuIGNhc3Q8ZGVjbF90eXBlPihnZXRQcmltYXJ5TWVyZ2VkRGVjbChjb25zdF9jYXN0PGRlY2xfdHlwZSo+KEQpKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZmlyc3QgZGVjbGFyYXRpb24gb2YgdGhpcyBkZWNsYXJhdGlvbiBvciBpdHNlbGYgaWYgdGhpcworICAvLy8gaXMgdGhlIG9ubHkgZGVjbGFyYXRpb24uCisgIGNvbnN0IGRlY2xfdHlwZSAqZ2V0Rmlyc3REZWNsKCkgY29uc3QgeworICAgIGNvbnN0IGRlY2xfdHlwZSAqRCA9IHN0YXRpY19jYXN0PGNvbnN0IGRlY2xfdHlwZSo+KHRoaXMpOworICAgIGlmICghRC0+aXNGcm9tQVNURmlsZSgpKQorICAgICAgcmV0dXJuIEQ7CisgICAgcmV0dXJuIGNhc3Q8ZGVjbF90eXBlPihnZXRQcmltYXJ5TWVyZ2VkRGVjbChjb25zdF9jYXN0PGRlY2xfdHlwZSo+KEQpKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBmaXJzdCBkZWNsYXJhdGlvbi4KKyAgYm9vbCBpc0ZpcnN0RGVjbCgpIGNvbnN0IHsgcmV0dXJuIGdldEZpcnN0RGVjbCgpID09IHRoaXM7IH0KK307CisKKy8vLyBBIHdyYXBwZXIgY2xhc3MgYXJvdW5kIGEgcG9pbnRlciB0aGF0IGFsd2F5cyBwb2ludHMgdG8gaXRzIGNhbm9uaWNhbAorLy8vIGRlY2xhcmF0aW9uLgorLy8vCisvLy8gQ2Fub25pY2FsRGVjbFB0cjxkZWNsX3R5cGU+IGJlaGF2ZXMganVzdCBsaWtlIGRlY2xfdHlwZSosIGV4Y2VwdCB3ZSBjYWxsCisvLy8gZGVjbF90eXBlOjpnZXRDYW5vbmljYWxEZWNsKCkgb24gY29uc3RydWN0aW9uLgorLy8vCisvLy8gVGhpcyBpcyB1c2VmdWwgZm9yIGhhc2h0YWJsZXMgdGhhdCB5b3Ugd2FudCB0byBiZSBrZXllZCBvbiBhIGRlY2xhcmF0aW9uJ3MKKy8vLyBjYW5vbmljYWwgZGVjbCAtLSBpZiB5b3UgdXNlIENhbm9uaWNhbERlY2xQdHIgYXMgdGhlIGtleSwgeW91IGRvbid0IG5lZWQgdG8KKy8vLyByZW1lbWJlciB0byBjYWxsIGdldENhbm9uaWNhbERlY2woKSBldmVyeXdoZXJlLgordGVtcGxhdGUgPHR5cGVuYW1lIGRlY2xfdHlwZT4gY2xhc3MgQ2Fub25pY2FsRGVjbFB0ciB7CitwdWJsaWM6CisgIENhbm9uaWNhbERlY2xQdHIoKSA9IGRlZmF1bHQ7CisgIENhbm9uaWNhbERlY2xQdHIoZGVjbF90eXBlICpQdHIpCisgICAgICA6IFB0cihQdHIgPyBQdHItPmdldENhbm9uaWNhbERlY2woKSA6IG51bGxwdHIpIHt9CisgIENhbm9uaWNhbERlY2xQdHIoY29uc3QgQ2Fub25pY2FsRGVjbFB0ciAmKSA9IGRlZmF1bHQ7CisgIENhbm9uaWNhbERlY2xQdHIgJm9wZXJhdG9yPShjb25zdCBDYW5vbmljYWxEZWNsUHRyICYpID0gZGVmYXVsdDsKKworICBvcGVyYXRvciBkZWNsX3R5cGUgKigpIHsgcmV0dXJuIFB0cjsgfQorICBvcGVyYXRvciBjb25zdCBkZWNsX3R5cGUgKigpIGNvbnN0IHsgcmV0dXJuIFB0cjsgfQorCisgIGRlY2xfdHlwZSAqb3BlcmF0b3ItPigpIHsgcmV0dXJuIFB0cjsgfQorICBjb25zdCBkZWNsX3R5cGUgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBQdHI7IH0KKworICBkZWNsX3R5cGUgJm9wZXJhdG9yKigpIHsgcmV0dXJuICpQdHI7IH0KKyAgY29uc3QgZGVjbF90eXBlICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqUHRyOyB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBzdHJ1Y3QgbGx2bTo6RGVuc2VNYXBJbmZvPENhbm9uaWNhbERlY2xQdHI8ZGVjbF90eXBlPj47CisKKyAgZGVjbF90eXBlICpQdHIgPSBudWxscHRyOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgZGVjbF90eXBlPgorc3RydWN0IERlbnNlTWFwSW5mbzxjbGFuZzo6Q2Fub25pY2FsRGVjbFB0cjxkZWNsX3R5cGU+PiB7CisgIHVzaW5nIENhbm9uaWNhbERlY2xQdHIgPSBjbGFuZzo6Q2Fub25pY2FsRGVjbFB0cjxkZWNsX3R5cGU+OworICB1c2luZyBCYXNlSW5mbyA9IERlbnNlTWFwSW5mbzxkZWNsX3R5cGUgKj47CisKKyAgc3RhdGljIENhbm9uaWNhbERlY2xQdHIgZ2V0RW1wdHlLZXkoKSB7CisgICAgLy8gQ29uc3RydWN0IG91ciBDYW5vbmljYWxEZWNsUHRyIHRoaXMgd2F5IGJlY2F1c2UgdGhlIHJlZ3VsYXIgY29uc3RydWN0b3IKKyAgICAvLyB3b3VsZCBkZXJlZmVyZW5jZSBQLlB0ciwgd2hpY2ggaXMgbm90IGFsbG93ZWQuCisgICAgQ2Fub25pY2FsRGVjbFB0ciBQOworICAgIFAuUHRyID0gQmFzZUluZm86OmdldEVtcHR5S2V5KCk7CisgICAgcmV0dXJuIFA7CisgIH0KKworICBzdGF0aWMgQ2Fub25pY2FsRGVjbFB0ciBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgQ2Fub25pY2FsRGVjbFB0ciBQOworICAgIFAuUHRyID0gQmFzZUluZm86OmdldFRvbWJzdG9uZUtleSgpOworICAgIHJldHVybiBQOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBDYW5vbmljYWxEZWNsUHRyICZQKSB7CisgICAgcmV0dXJuIEJhc2VJbmZvOjpnZXRIYXNoVmFsdWUoUCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IENhbm9uaWNhbERlY2xQdHIgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYW5vbmljYWxEZWNsUHRyICZSSFMpIHsKKyAgICByZXR1cm4gQmFzZUluZm86OmlzRXF1YWwoTEhTLCBSSFMpOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9SRURFQ0xBUkFCTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1NlbGVjdG9yTG9jYXRpb25zS2luZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1NlbGVjdG9yTG9jYXRpb25zS2luZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOTAzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvU2VsZWN0b3JMb2NhdGlvbnNLaW5kLmgKQEAgLTAsMCArMSw4MyBAQAorLy89PT0tLS0gU2VsZWN0b3JMb2NhdGlvbnNLaW5kLmggLSBLaW5kIG9mIHNlbGVjdG9yIGxvY2F0aW9ucyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZXNjcmliZXMgd2hldGhlciB0aGUgaWRlbnRpZmllciBsb2NhdGlvbnMgZm9yIGEgc2VsZWN0b3IgYXJlICJzdGFuZGFyZCIKKy8vIG9yIG5vdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX1NFTEVDVE9STE9DQVRJT05TS0lORF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX1NFTEVDVE9STE9DQVRJT05TS0lORF9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisgIGNsYXNzIFNlbGVjdG9yOworICBjbGFzcyBTb3VyY2VMb2NhdGlvbjsKKyAgY2xhc3MgRXhwcjsKKyAgY2xhc3MgUGFybVZhckRlY2w7CisKKy8vLyBcYnJpZWYgV2hldGhlciBhbGwgbG9jYXRpb25zIG9mIHRoZSBzZWxlY3RvciBpZGVudGlmaWVycyBhcmUgaW4gYQorLy8vICJzdGFuZGFyZCIgcG9zaXRpb24uCitlbnVtIFNlbGVjdG9yTG9jYXRpb25zS2luZCB7CisgIC8vLyBcYnJpZWYgTm9uLXN0YW5kYXJkLgorICBTZWxMb2NfTm9uU3RhbmRhcmQgPSAwLAorCisgIC8vLyBcYnJpZWYgRm9yIG51bGxhcnkgc2VsZWN0b3JzLCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGVuZDoKKyAgLy8vICAgICJbZm9vIHJlbGVhc2VdIiAvICItKHZvaWQpcmVsZWFzZTsiCisgIC8vLyBPciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGFyZ3VtZW50czoKKyAgLy8vICAgICJbZm9vIGZpcnN0OjEgc2Vjb25kOjJdIiAvICItKGlkKWZpcnN0OihpbnQpeCBzZWNvbmQ6KGludCl5OworICBTZWxMb2NfU3RhbmRhcmROb1NwYWNlID0gMSwKKworICAvLy8gXGJyaWVmIEZvciBudWxsYXJ5IHNlbGVjdG9ycywgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBlbmQ6CisgIC8vLyAgICAiW2ZvbyByZWxlYXNlXSIgLyAiLSh2b2lkKXJlbGVhc2U7IgorICAvLy8gT3Igd2l0aCBhIHNwYWNlIGJldHdlZW4gdGhlIGFyZ3VtZW50czoKKyAgLy8vICAgICJbZm9vIGZpcnN0OiAxIHNlY29uZDogMl0iIC8gIi0oaWQpZmlyc3Q6IChpbnQpeCBzZWNvbmQ6IChpbnQpeTsKKyAgU2VsTG9jX1N0YW5kYXJkV2l0aFNwYWNlID0gMgorfTsKKworLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgYWxsIFxwIFNlbExvY3MgYXJlIGluIGEgInN0YW5kYXJkIiBsb2NhdGlvbi4KK1NlbGVjdG9yTG9jYXRpb25zS2luZCBoYXNTdGFuZGFyZFNlbGVjdG9yTG9jcyhTZWxlY3RvciBTZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U291cmNlTG9jYXRpb24+IFNlbExvY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisKKy8vLyBcYnJpZWYgR2V0IHRoZSAic3RhbmRhcmQiIGxvY2F0aW9uIG9mIGEgc2VsZWN0b3IgaWRlbnRpZmllciwgZS5nOgorLy8vIEZvciBudWxsYXJ5IHNlbGVjdG9ycywgaW1tZWRpYXRlbHkgYmVmb3JlICddJzogIltmb28gcmVsZWFzZV0iCisvLy8KKy8vLyBccGFyYW0gV2l0aEFyZ1NwYWNlIGlmIHRydWUgdGhlIHN0YW5kYXJkIGxvY2F0aW9uIGlzIHdpdGggYSBzcGFjZSBhcGFydAorLy8vIGJlZm9yZSBhcmd1bWVudHM6ICJbZm9vIGZpcnN0OiAxIHNlY29uZDogMl0iCisvLy8gSWYgZmFsc2U6ICJbZm9vIGZpcnN0OjEgc2Vjb25kOjJdIgorU291cmNlTG9jYXRpb24gZ2V0U3RhbmRhcmRTZWxlY3RvckxvYyh1bnNpZ25lZCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3IgU2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFdpdGhBcmdTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworCisvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBhbGwgXHAgU2VsTG9jcyBhcmUgaW4gYSAic3RhbmRhcmQiIGxvY2F0aW9uLgorU2VsZWN0b3JMb2NhdGlvbnNLaW5kIGhhc1N0YW5kYXJkU2VsZWN0b3JMb2NzKFNlbGVjdG9yIFNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTb3VyY2VMb2NhdGlvbj4gU2VsTG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQYXJtVmFyRGVjbCAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisKKy8vLyBcYnJpZWYgR2V0IHRoZSAic3RhbmRhcmQiIGxvY2F0aW9uIG9mIGEgc2VsZWN0b3IgaWRlbnRpZmllciwgZS5nOgorLy8vIEZvciBudWxsYXJ5IHNlbGVjdG9ycywgaW1tZWRpYXRlbHkgYmVmb3JlICddJzogIltmb28gcmVsZWFzZV0iCisvLy8KKy8vLyBccGFyYW0gV2l0aEFyZ1NwYWNlIGlmIHRydWUgdGhlIHN0YW5kYXJkIGxvY2F0aW9uIGlzIHdpdGggYSBzcGFjZSBhcGFydAorLy8vIGJlZm9yZSBhcmd1bWVudHM6ICItKGlkKWZpcnN0OiAoaW50KXggc2Vjb25kOiAoaW50KXk7IgorLy8vIElmIGZhbHNlOiAiLShpZClmaXJzdDooaW50KXggc2Vjb25kOihpbnQpeTsiCitTb3VyY2VMb2NhdGlvbiBnZXRTdGFuZGFyZFNlbGVjdG9yTG9jKHVuc2lnbmVkIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBTZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgV2l0aEFyZ1NwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQYXJtVmFyRGVjbCAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvU3RtdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1N0bXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYThmM2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1N0bXQuaApAQCAtMCwwICsxLDIyODIgQEAKKy8vPT09LSBTdG10LmggLSBDbGFzc2VzIGZvciByZXByZXNlbnRpbmcgc3RhdGVtZW50cyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBTdG10IGludGVyZmFjZSBhbmQgc3ViY2xhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX1NUTVRfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9TVE1UX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsR3JvdXAuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQ2FwdHVyZWRTdG10LmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvSWRlbnRpZmllclRhYmxlLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRm9sZGluZ1NldE5vZGVJRDsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBU1RDb250ZXh0OworY2xhc3MgQXR0cjsKK2NsYXNzIENhcHR1cmVkRGVjbDsKK2NsYXNzIERlY2w7CitjbGFzcyBFeHByOworY2xhc3MgTGFiZWxEZWNsOworY2xhc3MgT0RSSGFzaDsKK2NsYXNzIFByaW50ZXJIZWxwZXI7CitzdHJ1Y3QgUHJpbnRpbmdQb2xpY3k7CitjbGFzcyBSZWNvcmREZWNsOworY2xhc3MgU291cmNlTWFuYWdlcjsKK2NsYXNzIFN0cmluZ0xpdGVyYWw7CitjbGFzcyBUb2tlbjsKK2NsYXNzIFZhckRlY2w7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBU1QgY2xhc3NlcyBmb3Igc3RhdGVtZW50cy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBTdG10IC0gVGhpcyByZXByZXNlbnRzIG9uZSBzdGF0ZW1lbnQuCisvLy8KK2NsYXNzIGFsaWduYXModm9pZCAqKSBTdG10IHsKK3B1YmxpYzoKKyAgZW51bSBTdG10Q2xhc3MgeworICAgIE5vU3RtdENsYXNzID0gMCwKKyNkZWZpbmUgU1RNVChDTEFTUywgUEFSRU5UKSBDTEFTUyMjQ2xhc3MsCisjZGVmaW5lIFNUTVRfUkFOR0UoQkFTRSwgRklSU1QsIExBU1QpIFwKKyAgICAgICAgZmlyc3QjI0JBU0UjI0NvbnN0YW50PUZJUlNUIyNDbGFzcywgbGFzdCMjQkFTRSMjQ29uc3RhbnQ9TEFTVCMjQ2xhc3MsCisjZGVmaW5lIExBU1RfU1RNVF9SQU5HRShCQVNFLCBGSVJTVCwgTEFTVCkgXAorICAgICAgICBmaXJzdCMjQkFTRSMjQ29uc3RhbnQ9RklSU1QjI0NsYXNzLCBsYXN0IyNCQVNFIyNDb25zdGFudD1MQVNUIyNDbGFzcworI2RlZmluZSBBQlNUUkFDVF9TVE1UKFNUTVQpCisjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXROb2Rlcy5pbmMiCisgIH07CisKKyAgLy8gTWFrZSB2YW5pbGxhICduZXcnIGFuZCAnZGVsZXRlJyBpbGxlZ2FsIGZvciBTdG10cy4KK3Byb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10V3JpdGVyOworCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgYnl0ZXMpIG5vZXhjZXB0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJTdG10cyBjYW5ub3QgYmUgYWxsb2NhdGVkIHdpdGggcmVndWxhciAnbmV3Jy4iKTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKmRhdGEpIG5vZXhjZXB0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJTdG10cyBjYW5ub3QgYmUgcmVsZWFzZWQgd2l0aCByZWd1bGFyICdkZWxldGUnLiIpOworICB9CisKKyAgY2xhc3MgU3RtdEJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIFN0bXQ7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBzdGF0ZW1lbnQgY2xhc3MuCisgICAgdW5zaWduZWQgc0NsYXNzIDogODsKKyAgfTsKKyAgZW51bSB7IE51bVN0bXRCaXRzID0gOCB9OworCisgIGNsYXNzIENvbXBvdW5kU3RtdEJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIENvbXBvdW5kU3RtdDsKKworICAgIHVuc2lnbmVkIDogTnVtU3RtdEJpdHM7CisKKyAgICB1bnNpZ25lZCBOdW1TdG10cyA6IDMyIC0gTnVtU3RtdEJpdHM7CisgIH07CisKKyAgY2xhc3MgSWZTdG10Qml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgSWZTdG10OworCisgICAgdW5zaWduZWQgOiBOdW1TdG10Qml0czsKKworICAgIHVuc2lnbmVkIElzQ29uc3RleHByIDogMTsKKyAgfTsKKworICBjbGFzcyBFeHByQml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsgLy8gZGVzZXJpYWxpemF0aW9uCisgICAgZnJpZW5kIGNsYXNzIEF0b21pY0V4cHI7IC8vIGN0b3IKKyAgICBmcmllbmQgY2xhc3MgQmxvY2tEZWNsUmVmRXhwcjsgLy8gY3RvcgorICAgIGZyaWVuZCBjbGFzcyBDYWxsRXhwcjsgLy8gY3RvcgorICAgIGZyaWVuZCBjbGFzcyBDWFhDb25zdHJ1Y3RFeHByOyAvLyBjdG9yCisgICAgZnJpZW5kIGNsYXNzIENYWERlcGVuZGVudFNjb3BlTWVtYmVyRXhwcjsgLy8gY3RvcgorICAgIGZyaWVuZCBjbGFzcyBDWFhOZXdFeHByOyAvLyBjdG9yCisgICAgZnJpZW5kIGNsYXNzIENYWFVucmVzb2x2ZWRDb25zdHJ1Y3RFeHByOyAvLyBjdG9yCisgICAgZnJpZW5kIGNsYXNzIERlY2xSZWZFeHByOyAvLyBjb21wdXRlRGVwZW5kZW5jZQorICAgIGZyaWVuZCBjbGFzcyBEZXBlbmRlbnRTY29wZURlY2xSZWZFeHByOyAvLyBjdG9yCisgICAgZnJpZW5kIGNsYXNzIERlc2lnbmF0ZWRJbml0RXhwcjsgLy8gY3RvcgorICAgIGZyaWVuZCBjbGFzcyBFeHByOworICAgIGZyaWVuZCBjbGFzcyBJbml0TGlzdEV4cHI7IC8vIGN0b3IKKyAgICBmcmllbmQgY2xhc3MgT2JqQ0FycmF5TGl0ZXJhbDsgLy8gY3RvcgorICAgIGZyaWVuZCBjbGFzcyBPYmpDRGljdGlvbmFyeUxpdGVyYWw7IC8vIGN0b3IKKyAgICBmcmllbmQgY2xhc3MgT2JqQ01lc3NhZ2VFeHByOyAvLyBjdG9yCisgICAgZnJpZW5kIGNsYXNzIE9mZnNldE9mRXhwcjsgLy8gY3RvcgorICAgIGZyaWVuZCBjbGFzcyBPcGFxdWVWYWx1ZUV4cHI7IC8vIGN0b3IKKyAgICBmcmllbmQgY2xhc3MgT3ZlcmxvYWRFeHByOyAvLyBjdG9yCisgICAgZnJpZW5kIGNsYXNzIFBhcmVuTGlzdEV4cHI7IC8vIGN0b3IKKyAgICBmcmllbmQgY2xhc3MgUHNldWRvT2JqZWN0RXhwcjsgLy8gY3RvcgorICAgIGZyaWVuZCBjbGFzcyBTaHVmZmxlVmVjdG9yRXhwcjsgLy8gY3RvcgorCisgICAgdW5zaWduZWQgOiBOdW1TdG10Qml0czsKKworICAgIHVuc2lnbmVkIFZhbHVlS2luZCA6IDI7CisgICAgdW5zaWduZWQgT2JqZWN0S2luZCA6IDM7CisgICAgdW5zaWduZWQgVHlwZURlcGVuZGVudCA6IDE7CisgICAgdW5zaWduZWQgVmFsdWVEZXBlbmRlbnQgOiAxOworICAgIHVuc2lnbmVkIEluc3RhbnRpYXRpb25EZXBlbmRlbnQgOiAxOworICAgIHVuc2lnbmVkIENvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2sgOiAxOworICB9OworICBlbnVtIHsgTnVtRXhwckJpdHMgPSAxNyB9OworCisgIGNsYXNzIENoYXJhY3RlckxpdGVyYWxCaXRmaWVsZHMgeworICAgIGZyaWVuZCBjbGFzcyBDaGFyYWN0ZXJMaXRlcmFsOworCisgICAgdW5zaWduZWQgOiBOdW1FeHByQml0czsKKworICAgIHVuc2lnbmVkIEtpbmQgOiAzOworICB9OworCisgIGVudW0gQVBGbG9hdFNlbWFudGljcyB7CisgICAgSUVFRWhhbGYsCisgICAgSUVFRXNpbmdsZSwKKyAgICBJRUVFZG91YmxlLAorICAgIHg4N0RvdWJsZUV4dGVuZGVkLAorICAgIElFRUVxdWFkLAorICAgIFBQQ0RvdWJsZURvdWJsZQorICB9OworCisgIGNsYXNzIEZsb2F0aW5nTGl0ZXJhbEJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIEZsb2F0aW5nTGl0ZXJhbDsKKworICAgIHVuc2lnbmVkIDogTnVtRXhwckJpdHM7CisKKyAgICB1bnNpZ25lZCBTZW1hbnRpY3MgOiAzOyAvLyBQcm92aWRlcyBzZW1hbnRpY3MgZm9yIEFQRmxvYXQgY29uc3RydWN0aW9uCisgICAgdW5zaWduZWQgSXNFeGFjdCA6IDE7CisgIH07CisKKyAgY2xhc3MgVW5hcnlFeHByT3JUeXBlVHJhaXRFeHByQml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgVW5hcnlFeHByT3JUeXBlVHJhaXRFeHByOworCisgICAgdW5zaWduZWQgOiBOdW1FeHByQml0czsKKworICAgIHVuc2lnbmVkIEtpbmQgOiAyOworICAgIHVuc2lnbmVkIElzVHlwZSA6IDE7IC8vIHRydWUgaWYgb3BlcmFuZCBpcyBhIHR5cGUsIGZhbHNlIGlmIGFuIGV4cHJlc3Npb24uCisgIH07CisKKyAgY2xhc3MgRGVjbFJlZkV4cHJCaXRmaWVsZHMgeworICAgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOyAvLyBkZXNlcmlhbGl6YXRpb24KKyAgICBmcmllbmQgY2xhc3MgRGVjbFJlZkV4cHI7CisKKyAgICB1bnNpZ25lZCA6IE51bUV4cHJCaXRzOworCisgICAgdW5zaWduZWQgSGFzUXVhbGlmaWVyIDogMTsKKyAgICB1bnNpZ25lZCBIYXNUZW1wbGF0ZUtXQW5kQXJnc0luZm8gOiAxOworICAgIHVuc2lnbmVkIEhhc0ZvdW5kRGVjbCA6IDE7CisgICAgdW5zaWduZWQgSGFkTXVsdGlwbGVDYW5kaWRhdGVzIDogMTsKKyAgICB1bnNpZ25lZCBSZWZlcnNUb0VuY2xvc2luZ1ZhcmlhYmxlT3JDYXB0dXJlIDogMTsKKyAgfTsKKworICBjbGFzcyBDYXN0RXhwckJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIENhc3RFeHByOworCisgICAgdW5zaWduZWQgOiBOdW1FeHByQml0czsKKworICAgIHVuc2lnbmVkIEtpbmQgOiA2OworICAgIHVuc2lnbmVkIEJhc2VQYXRoU2l6ZSA6IDMyIC0gNiAtIE51bUV4cHJCaXRzOworICB9OworCisgIGNsYXNzIENhbGxFeHByQml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgQ2FsbEV4cHI7CisKKyAgICB1bnNpZ25lZCA6IE51bUV4cHJCaXRzOworCisgICAgdW5zaWduZWQgTnVtUHJlQXJncyA6IDE7CisgIH07CisKKyAgY2xhc3MgRXhwcldpdGhDbGVhbnVwc0JpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7IC8vIGRlc2VyaWFsaXphdGlvbgorICAgIGZyaWVuZCBjbGFzcyBFeHByV2l0aENsZWFudXBzOworCisgICAgdW5zaWduZWQgOiBOdW1FeHByQml0czsKKworICAgIC8vIFdoZW4gZmFsc2UsIGl0IG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzLgorICAgIHVuc2lnbmVkIENsZWFudXBzSGF2ZVNpZGVFZmZlY3RzIDogMTsKKworICAgIHVuc2lnbmVkIE51bU9iamVjdHMgOiAzMiAtIDEgLSBOdW1FeHByQml0czsKKyAgfTsKKworICBjbGFzcyBQc2V1ZG9PYmplY3RFeHByQml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsgLy8gZGVzZXJpYWxpemF0aW9uCisgICAgZnJpZW5kIGNsYXNzIFBzZXVkb09iamVjdEV4cHI7CisKKyAgICB1bnNpZ25lZCA6IE51bUV4cHJCaXRzOworCisgICAgLy8gVGhlc2UgZG9uJ3QgbmVlZCB0byBiZSBwYXJ0aWN1bGFybHkgd2lkZSwgYmVjYXVzZSB0aGV5J3JlCisgICAgLy8gc3RyaWN0bHkgbGltaXRlZCBieSB0aGUgZm9ybXMgb2YgZXhwcmVzc2lvbnMgd2UgcGVybWl0LgorICAgIHVuc2lnbmVkIE51bVN1YkV4cHJzIDogODsKKyAgICB1bnNpZ25lZCBSZXN1bHRJbmRleCA6IDMyIC0gOCAtIE51bUV4cHJCaXRzOworICB9OworCisgIGNsYXNzIE9wYXF1ZVZhbHVlRXhwckJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIE9wYXF1ZVZhbHVlRXhwcjsKKworICAgIHVuc2lnbmVkIDogTnVtRXhwckJpdHM7CisKKyAgICAvLy8gVGhlIE9WRSBpcyBhIHVuaXF1ZSBzZW1hbnRpYyByZWZlcmVuY2UgdG8gaXRzIHNvdXJjZSBleHByZXNzaW8gaWYgdGhpcworICAgIC8vLyBiaXQgaXMgc2V0IHRvIHRydWUuCisgICAgdW5zaWduZWQgSXNVbmlxdWUgOiAxOworICB9OworCisgIGNsYXNzIE9iakNJbmRpcmVjdENvcHlSZXN0b3JlRXhwckJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIE9iakNJbmRpcmVjdENvcHlSZXN0b3JlRXhwcjsKKworICAgIHVuc2lnbmVkIDogTnVtRXhwckJpdHM7CisKKyAgICB1bnNpZ25lZCBTaG91bGRDb3B5IDogMTsKKyAgfTsKKworICBjbGFzcyBJbml0TGlzdEV4cHJCaXRmaWVsZHMgeworICAgIGZyaWVuZCBjbGFzcyBJbml0TGlzdEV4cHI7CisKKyAgICB1bnNpZ25lZCA6IE51bUV4cHJCaXRzOworCisgICAgLy8vIFdoZXRoZXIgdGhpcyBpbml0aWFsaXplciBsaXN0IG9yaWdpbmFsbHkgaGFkIGEgR05VIGFycmF5LXJhbmdlCisgICAgLy8vIGRlc2lnbmF0b3IgaW4gaXQuIFRoaXMgaXMgYSB0ZW1wb3JhcnkgbWFya2VyIHVzZWQgYnkgQ29kZUdlbi4KKyAgICB1bnNpZ25lZCBIYWRBcnJheVJhbmdlRGVzaWduYXRvciA6IDE7CisgIH07CisKKyAgY2xhc3MgVHlwZVRyYWl0RXhwckJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgICAgZnJpZW5kIGNsYXNzIEFTVFN0bXRXcml0ZXI7CisgICAgZnJpZW5kIGNsYXNzIFR5cGVUcmFpdEV4cHI7CisgICAgCisgICAgdW5zaWduZWQgOiBOdW1FeHByQml0czsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFRoZSBraW5kIG9mIHR5cGUgdHJhaXQsIHdoaWNoIGlzIGEgdmFsdWUgb2YgYSBUeXBlVHJhaXQgZW51bWVyYXRvci4KKyAgICB1bnNpZ25lZCBLaW5kIDogODsKKyAgICAKKyAgICAvLy8gXGJyaWVmIElmIHRoaXMgZXhwcmVzc2lvbiBpcyBub3QgdmFsdWUtZGVwZW5kZW50LCB0aGlzIGluZGljYXRlcyB3aGV0aGVyCisgICAgLy8vIHRoZSB0cmFpdCBldmFsdWF0ZWQgdHJ1ZSBvciBmYWxzZS4KKyAgICB1bnNpZ25lZCBWYWx1ZSA6IDE7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIHRoaXMgdHlwZSB0cmFpdC4KKyAgICB1bnNpZ25lZCBOdW1BcmdzIDogMzIgLSA4IC0gMSAtIE51bUV4cHJCaXRzOworICB9OworCisgIGNsYXNzIENvYXdhaXRFeHByQml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgQ29hd2FpdEV4cHI7CisKKyAgICB1bnNpZ25lZCA6IE51bUV4cHJCaXRzOworCisgICAgdW5zaWduZWQgSXNJbXBsaWNpdCA6IDE7CisgIH07CisKKyAgdW5pb24geworICAgIFN0bXRCaXRmaWVsZHMgU3RtdEJpdHM7CisgICAgQ29tcG91bmRTdG10Qml0ZmllbGRzIENvbXBvdW5kU3RtdEJpdHM7CisgICAgSWZTdG10Qml0ZmllbGRzIElmU3RtdEJpdHM7CisgICAgRXhwckJpdGZpZWxkcyBFeHByQml0czsKKyAgICBDaGFyYWN0ZXJMaXRlcmFsQml0ZmllbGRzIENoYXJhY3RlckxpdGVyYWxCaXRzOworICAgIEZsb2F0aW5nTGl0ZXJhbEJpdGZpZWxkcyBGbG9hdGluZ0xpdGVyYWxCaXRzOworICAgIFVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwckJpdGZpZWxkcyBVbmFyeUV4cHJPclR5cGVUcmFpdEV4cHJCaXRzOworICAgIERlY2xSZWZFeHByQml0ZmllbGRzIERlY2xSZWZFeHByQml0czsKKyAgICBDYXN0RXhwckJpdGZpZWxkcyBDYXN0RXhwckJpdHM7CisgICAgQ2FsbEV4cHJCaXRmaWVsZHMgQ2FsbEV4cHJCaXRzOworICAgIEV4cHJXaXRoQ2xlYW51cHNCaXRmaWVsZHMgRXhwcldpdGhDbGVhbnVwc0JpdHM7CisgICAgUHNldWRvT2JqZWN0RXhwckJpdGZpZWxkcyBQc2V1ZG9PYmplY3RFeHByQml0czsKKyAgICBPcGFxdWVWYWx1ZUV4cHJCaXRmaWVsZHMgT3BhcXVlVmFsdWVFeHByQml0czsKKyAgICBPYmpDSW5kaXJlY3RDb3B5UmVzdG9yZUV4cHJCaXRmaWVsZHMgT2JqQ0luZGlyZWN0Q29weVJlc3RvcmVFeHByQml0czsKKyAgICBJbml0TGlzdEV4cHJCaXRmaWVsZHMgSW5pdExpc3RFeHByQml0czsKKyAgICBUeXBlVHJhaXRFeHByQml0ZmllbGRzIFR5cGVUcmFpdEV4cHJCaXRzOworICAgIENvYXdhaXRFeHByQml0ZmllbGRzIENvYXdhaXRCaXRzOworICB9OworCitwdWJsaWM6CisgIC8vIE9ubHkgYWxsb3cgYWxsb2NhdGlvbiBvZiBTdG10cyB1c2luZyB0aGUgYWxsb2NhdG9yIGluIEFTVENvbnRleHQKKyAgLy8gb3IgYnkgZG9pbmcgYSBwbGFjZW1lbnQgbmV3LgorICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IGJ5dGVzLCBjb25zdCBBU1RDb250ZXh0JiBDLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYWxpZ25tZW50ID0gOCk7CisKKyAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCBieXRlcywgY29uc3QgQVNUQ29udGV4dCogQywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFsaWdubWVudCA9IDgpIHsKKyAgICByZXR1cm4gb3BlcmF0b3IgbmV3KGJ5dGVzLCAqQywgYWxpZ25tZW50KTsKKyAgfQorCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgYnl0ZXMsIHZvaWQgKm1lbSkgbm9leGNlcHQgeyByZXR1cm4gbWVtOyB9CisKKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqLCBjb25zdCBBU1RDb250ZXh0ICYsIHVuc2lnbmVkKSBub2V4Y2VwdCB7fQorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICosIGNvbnN0IEFTVENvbnRleHQgKiwgdW5zaWduZWQpIG5vZXhjZXB0IHt9CisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKiwgc2l6ZV90KSBub2V4Y2VwdCB7fQorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICosIHZvaWQgKikgbm9leGNlcHQge30KKworcHVibGljOgorICAvLy8gXGJyaWVmIEEgcGxhY2Vob2xkZXIgdHlwZSB1c2VkIHRvIGNvbnN0cnVjdCBhbiBlbXB0eSBzaGVsbCBvZiBhCisgIC8vLyB0eXBlLCB0aGF0IHdpbGwgYmUgZmlsbGVkIGluIGxhdGVyIChlLmcuLCBieSBzb21lCisgIC8vLyBkZS1zZXJpYWxpemF0aW9uKS4KKyAgc3RydWN0IEVtcHR5U2hlbGwge307CisKK3Byb3RlY3RlZDoKKyAgLy8vIEl0ZXJhdG9yIGZvciBpdGVyYXRpbmcgb3ZlciBTdG10ICogYXJyYXlzIHRoYXQgY29udGFpbiBvbmx5IEV4cHIgKgorICAvLy8KKyAgLy8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgQVNUIG5vZGVzIHVzZSBTdG10KiBhcnJheXMgdG8gc3RvcmUKKyAgLy8vIHJlZmVyZW5jZXMgdG8gY2hpbGRyZW4gKHRvIGJlIGNvbXBhdGlibGUgd2l0aCBTdG10SXRlcmF0b3IpLgorICBzdHJ1Y3QgRXhwckl0ZXJhdG9yCisgICAgICA6IGxsdm06Oml0ZXJhdG9yX2FkYXB0b3JfYmFzZTxFeHBySXRlcmF0b3IsIFN0bXQgKiosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBFeHByICo+IHsKKyAgICBFeHBySXRlcmF0b3IoKSA6IGl0ZXJhdG9yX2FkYXB0b3JfYmFzZShudWxscHRyKSB7fQorICAgIEV4cHJJdGVyYXRvcihTdG10ICoqSSkgOiBpdGVyYXRvcl9hZGFwdG9yX2Jhc2UoSSkge30KKworICAgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgICBhc3NlcnQoKCpJKS0+Z2V0U3RtdENsYXNzKCkgPj0gZmlyc3RFeHByQ29uc3RhbnQgJiYKKyAgICAgICAgICAgICAoKkkpLT5nZXRTdG10Q2xhc3MoKSA8PSBsYXN0RXhwckNvbnN0YW50KTsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxFeHByICoqPihJKTsKKyAgICB9CisgIH07CisKKyAgLy8vIENvbnN0IGl0ZXJhdG9yIGZvciBpdGVyYXRpbmcgb3ZlciBTdG10ICogYXJyYXlzIHRoYXQgY29udGFpbiBvbmx5IEV4cHIgKgorICBzdHJ1Y3QgQ29uc3RFeHBySXRlcmF0b3IKKyAgICAgIDogbGx2bTo6aXRlcmF0b3JfYWRhcHRvcl9iYXNlPENvbnN0RXhwckl0ZXJhdG9yLCBjb25zdCBTdG10ICpjb25zdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHIgKmNvbnN0PiB7CisgICAgQ29uc3RFeHBySXRlcmF0b3IoKSA6IGl0ZXJhdG9yX2FkYXB0b3JfYmFzZShudWxscHRyKSB7fQorICAgIENvbnN0RXhwckl0ZXJhdG9yKGNvbnN0IFN0bXQgKmNvbnN0ICpJKSA6IGl0ZXJhdG9yX2FkYXB0b3JfYmFzZShJKSB7fQorCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgIGFzc2VydCgoKkkpLT5nZXRTdG10Q2xhc3MoKSA+PSBmaXJzdEV4cHJDb25zdGFudCAmJgorICAgICAgICAgICAgICgqSSktPmdldFN0bXRDbGFzcygpIDw9IGxhc3RFeHByQ29uc3RhbnQpOworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IEV4cHIgKmNvbnN0ICo+KEkpOworICAgIH0KKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBXaGV0aGVyIHN0YXRpc3RpYyBjb2xsZWN0aW9uIGlzIGVuYWJsZWQuCisgIHN0YXRpYyBib29sIFN0YXRpc3RpY3NFbmFibGVkOworCitwcm90ZWN0ZWQ6CisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIGVtcHR5IHN0YXRlbWVudC4KKyAgZXhwbGljaXQgU3RtdChTdG10Q2xhc3MgU0MsIEVtcHR5U2hlbGwpIDogU3RtdChTQykge30KKworcHVibGljOgorICBTdG10KFN0bXRDbGFzcyBTQykgeworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKCp0aGlzKSA9PSBzaXplb2Yodm9pZCAqKSwKKyAgICAgICAgICAgICAgICAgICJjaGFuZ2luZyBiaXRmaWVsZHMgY2hhbmdlZCBzaXplb2YoU3RtdCkiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZigqdGhpcykgJSBhbGlnbm9mKHZvaWQgKikgPT0gMCwKKyAgICAgICAgICAgICAgICAgICJJbnN1ZmZpY2llbnQgYWxpZ25tZW50ISIpOworICAgIFN0bXRCaXRzLnNDbGFzcyA9IFNDOworICAgIGlmIChTdGF0aXN0aWNzRW5hYmxlZCkgU3RtdDo6YWRkU3RtdENsYXNzKFNDKTsKKyAgfQorCisgIFN0bXRDbGFzcyBnZXRTdG10Q2xhc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0bXRDbGFzcz4oU3RtdEJpdHMuc0NsYXNzKTsKKyAgfQorCisgIGNvbnN0IGNoYXIgKmdldFN0bXRDbGFzc05hbWUoKSBjb25zdDsKKworICAvLy8gU291cmNlTG9jYXRpb24gdG9rZW5zIGFyZSBub3QgdXNlZnVsIGluIGlzb2xhdGlvbiAtIHRoZXkgYXJlIGxvdyBsZXZlbAorICAvLy8gdmFsdWUgb2JqZWN0cyBjcmVhdGVkL2ludGVycHJldGVkIGJ5IFNvdXJjZU1hbmFnZXIuIFdlIGFzc3VtZSBBU1QKKyAgLy8vIGNsaWVudHMgd2lsbCBoYXZlIGEgcG9pbnRlciB0byB0aGUgcmVzcGVjdGl2ZSBTb3VyY2VNYW5hZ2VyLgorICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWTsKKworICAvLyBnbG9iYWwgdGVtcCBzdGF0cyAodW50aWwgd2UgaGF2ZSBhIHBlci1tb2R1bGUgdmlzaXRvcikKKyAgc3RhdGljIHZvaWQgYWRkU3RtdENsYXNzKGNvbnN0IFN0bXRDbGFzcyBzKTsKKyAgc3RhdGljIHZvaWQgRW5hYmxlU3RhdGlzdGljcygpOworICBzdGF0aWMgdm9pZCBQcmludFN0YXRzKCk7CisKKyAgLy8vIFxicmllZiBEdW1wcyB0aGUgc3BlY2lmaWVkIEFTVCBmcmFnbWVudCBhbmQgYWxsIHN1YnRyZWVzIHRvCisgIC8vLyBcYyBsbHZtOjplcnJzKCkuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworICB2b2lkIGR1bXAoU291cmNlTWFuYWdlciAmU00pIGNvbnN0OworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBTb3VyY2VNYW5hZ2VyICZTTSkgY29uc3Q7CisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIC8vLyBkdW1wQ29sb3IgLSBzYW1lIGFzIGR1bXAoKSwgYnV0IGZvcmNlcyBjb2xvciBoaWdobGlnaHRpbmcuCisgIHZvaWQgZHVtcENvbG9yKCkgY29uc3Q7CisKKyAgLy8vIGR1bXBQcmV0dHkvcHJpbnRQcmV0dHkgLSBUaGVzZSB0d28gbWV0aG9kcyBkbyBhICJwcmV0dHkgcHJpbnQiIG9mIHRoZSBBU1QKKyAgLy8vIGJhY2sgdG8gaXRzIG9yaWdpbmFsIHNvdXJjZSBsYW5ndWFnZSBzeW50YXguCisgIHZvaWQgZHVtcFByZXR0eShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0KSBjb25zdDsKKyAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsIFByaW50ZXJIZWxwZXIgKkhlbHBlciwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5LCB1bnNpZ25lZCBJbmRlbnRhdGlvbiA9IDAsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQVNUQ29udGV4dCAqQ29udGV4dCA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyB2aWV3QVNUIC0gVmlzdWFsaXplIGFuIEFTVCByb290ZWQgYXQgdGhpcyBTdG10KiB1c2luZyBHcmFwaFZpei4gIE9ubHkKKyAgLy8vICAgd29ya3Mgb24gc3lzdGVtcyB3aXRoIEdyYXBoVml6IChNYWMgT1MgWCkgb3IgZG90K2d2IGluc3RhbGxlZC4KKyAgdm9pZCB2aWV3QVNUKCkgY29uc3Q7CisKKyAgLy8vIFNraXAgcGFzdCBhbnkgaW1wbGljaXQgQVNUIG5vZGVzIHdoaWNoIG1pZ2h0IHN1cnJvdW5kIHRoaXMKKyAgLy8vIHN0YXRlbWVudCwgc3VjaCBhcyBFeHByV2l0aENsZWFudXBzIG9yIEltcGxpY2l0Q2FzdEV4cHIgbm9kZXMuCisgIFN0bXQgKklnbm9yZUltcGxpY2l0KCk7CisgIGNvbnN0IFN0bXQgKklnbm9yZUltcGxpY2l0KCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PFN0bXQgKj4odGhpcyktPklnbm9yZUltcGxpY2l0KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFNraXAgbm8tb3AgKGF0dHJpYnV0ZWQsIGNvbXBvdW5kKSBjb250YWluZXIgc3RtdHMgYW5kIHNraXAgY2FwdHVyZWQKKyAgLy8vIHN0bXQgYXQgdGhlIHRvcCwgaWYgXGEgSWdub3JlQ2FwdHVyZWQgaXMgdHJ1ZS4KKyAgU3RtdCAqSWdub3JlQ29udGFpbmVycyhib29sIElnbm9yZUNhcHR1cmVkID0gZmFsc2UpOworICBjb25zdCBTdG10ICpJZ25vcmVDb250YWluZXJzKGJvb2wgSWdub3JlQ2FwdHVyZWQgPSBmYWxzZSkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PFN0bXQgKj4odGhpcyktPklnbm9yZUNvbnRhaW5lcnMoSWdub3JlQ2FwdHVyZWQpOworICB9CisKKyAgY29uc3QgU3RtdCAqc3RyaXBMYWJlbExpa2VTdGF0ZW1lbnRzKCkgY29uc3Q7CisgIFN0bXQgKnN0cmlwTGFiZWxMaWtlU3RhdGVtZW50cygpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxTdG10Kj4oCisgICAgICBjb25zdF9jYXN0PGNvbnN0IFN0bXQqPih0aGlzKS0+c3RyaXBMYWJlbExpa2VTdGF0ZW1lbnRzKCkpOworICB9CisKKyAgLy8vIENoaWxkIEl0ZXJhdG9yczogQWxsIHN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgJ2NoaWxkcmVuJworICAvLy8gdG8gcGVybWl0IGVhc3kgaXRlcmF0aW9uIG92ZXIgdGhlIHN1YnN0YXRlbWVudHMvc3ViZXhwZXNzaW9ucyBvZiBhbgorICAvLy8gQVNUIG5vZGUuICBUaGlzIHBlcm1pdHMgZWFzeSBpdGVyYXRpb24gb3ZlciBhbGwgbm9kZXMgaW4gdGhlIEFTVC4KKyAgdXNpbmcgY2hpbGRfaXRlcmF0b3IgPSBTdG10SXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2NoaWxkX2l0ZXJhdG9yID0gQ29uc3RTdG10SXRlcmF0b3I7CisKKyAgdXNpbmcgY2hpbGRfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxjaGlsZF9pdGVyYXRvcj47CisgIHVzaW5nIGNvbnN0X2NoaWxkX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8Y29uc3RfY2hpbGRfaXRlcmF0b3I+OworCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCk7CisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3QgeworICAgIGF1dG8gQ2hpbGRyZW4gPSBjb25zdF9jYXN0PFN0bXQgKj4odGhpcyktPmNoaWxkcmVuKCk7CisgICAgcmV0dXJuIGNvbnN0X2NoaWxkX3JhbmdlKENoaWxkcmVuLmJlZ2luKCksIENoaWxkcmVuLmVuZCgpKTsKKyAgfQorCisgIGNoaWxkX2l0ZXJhdG9yIGNoaWxkX2JlZ2luKCkgeyByZXR1cm4gY2hpbGRyZW4oKS5iZWdpbigpOyB9CisgIGNoaWxkX2l0ZXJhdG9yIGNoaWxkX2VuZCgpIHsgcmV0dXJuIGNoaWxkcmVuKCkuZW5kKCk7IH0KKworICBjb25zdF9jaGlsZF9pdGVyYXRvciBjaGlsZF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNoaWxkcmVuKCkuYmVnaW4oKTsgfQorICBjb25zdF9jaGlsZF9pdGVyYXRvciBjaGlsZF9lbmQoKSBjb25zdCB7IHJldHVybiBjaGlsZHJlbigpLmVuZCgpOyB9CisKKyAgLy8vIFxicmllZiBQcm9kdWNlIGEgdW5pcXVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBzdGF0ZW1lbnQuCisgIC8vLworICAvLy8gXHBhcmFtIElEIG9uY2UgdGhlIHByb2ZpbGluZyBvcGVyYXRpb24gaXMgY29tcGxldGUsIHdpbGwgY29udGFpbgorICAvLy8gdGhlIHVuaXF1ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gc3RhdGVtZW50LgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb250ZXh0IHRoZSBBU1QgY29udGV4dCBpbiB3aGljaCB0aGUgc3RhdGVtZW50IHJlc2lkZXMKKyAgLy8vCisgIC8vLyBccGFyYW0gQ2Fub25pY2FsIHdoZXRoZXIgdGhlIHByb2ZpbGUgc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBjYW5vbmljYWwKKyAgLy8vIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc3RhdGVtZW50IChlLmcuLCB3aGVyZSBub24tdHlwZSB0ZW1wbGF0ZQorICAvLy8gcGFyYW1ldGVycyBhcmUgaWRlbnRpZmllZCBieSBpbmRleC9sZXZlbCByYXRoZXIgdGhhbiB0aGVpcgorICAvLy8gZGVjbGFyYXRpb24gcG9pbnRlcnMpIG9yIHRoZSBleGFjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhdGVtZW50IGFzCisgIC8vLyB3cml0dGVuIGluIHRoZSBzb3VyY2UuCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgIGJvb2wgQ2Fub25pY2FsKSBjb25zdDsKKworICAvLy8gXGJyaWVmIENhbGN1bGF0ZSBhIHVuaXF1ZSByZXByZXNlbnRhdGlvbiBmb3IgYSBzdGF0ZW1lbnQgdGhhdCBpcworICAvLy8gc3RhYmxlIGFjcm9zcyBjb21waWxlciBpbnZvY2F0aW9ucy4KKyAgLy8vCisgIC8vLyBccGFyYW0gSUQgcHJvZmlsZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHN0b3JlZCBpbiBJRC4KKyAgLy8vCisgIC8vLyBccGFyYW0gSGFzaCBhbiBPRFJIYXNoIG9iamVjdCB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVyZSBwb2ludGVycyB3b3VsZAorICAvLy8gaGF2ZSBiZWVuIHVzZWQgaW4gdGhlIFByb2ZpbGUgZnVuY3Rpb24uCisgIHZvaWQgUHJvY2Vzc09EUkhhc2gobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIE9EUkhhc2gmIEhhc2gpIGNvbnN0OworfTsKKworLy8vIERlY2xTdG10IC0gQWRhcHRvciBjbGFzcyBmb3IgbWl4aW5nIGRlY2xhcmF0aW9ucyB3aXRoIHN0YXRlbWVudHMgYW5kCisvLy8gZXhwcmVzc2lvbnMuIEZvciBleGFtcGxlLCBDb21wb3VuZFN0bXQgbWl4ZXMgc3RhdGVtZW50cywgZXhwcmVzc2lvbnMKKy8vLyBhbmQgZGVjbGFyYXRpb25zICh2YXJpYWJsZXMsIHR5cGVzKS4gQW5vdGhlciBleGFtcGxlIGlzIEZvclN0bXQsIHdoZXJlCisvLy8gdGhlIGZpcnN0IHN0YXRlbWVudCBjYW4gYmUgYW4gZXhwcmVzc2lvbiBvciBhIGRlY2xhcmF0aW9uLgorY2xhc3MgRGVjbFN0bXQgOiBwdWJsaWMgU3RtdCB7CisgIERlY2xHcm91cFJlZiBERzsKKyAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIEVuZExvYzsKKworcHVibGljOgorICBEZWNsU3RtdChEZWNsR3JvdXBSZWYgZGcsIFNvdXJjZUxvY2F0aW9uIHN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBlbmRMb2MpCisgICAgICA6IFN0bXQoRGVjbFN0bXRDbGFzcyksIERHKGRnKSwgU3RhcnRMb2Moc3RhcnRMb2MpLCBFbmRMb2MoZW5kTG9jKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgZGVjbGFyYXRpb24gc3RhdGVtZW50LgorICBleHBsaWNpdCBEZWNsU3RtdChFbXB0eVNoZWxsIEVtcHR5KSA6IFN0bXQoRGVjbFN0bXRDbGFzcywgRW1wdHkpIHt9CisKKyAgLy8vIGlzU2luZ2xlRGVjbCAtIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGlzIERlY2xTdG10IHJlZmVycworICAvLy8gdG8gYSBzaW5nbGUgRGVjbC4KKyAgYm9vbCBpc1NpbmdsZURlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIERHLmlzU2luZ2xlRGVjbCgpOworICB9CisKKyAgY29uc3QgRGVjbCAqZ2V0U2luZ2xlRGVjbCgpIGNvbnN0IHsgcmV0dXJuIERHLmdldFNpbmdsZURlY2woKTsgfQorICBEZWNsICpnZXRTaW5nbGVEZWNsKCkgeyByZXR1cm4gREcuZ2V0U2luZ2xlRGVjbCgpOyB9CisKKyAgY29uc3QgRGVjbEdyb3VwUmVmIGdldERlY2xHcm91cCgpIGNvbnN0IHsgcmV0dXJuIERHOyB9CisgIERlY2xHcm91cFJlZiBnZXREZWNsR3JvdXAoKSB7IHJldHVybiBERzsgfQorICB2b2lkIHNldERlY2xHcm91cChEZWNsR3JvdXBSZWYgREdSKSB7IERHID0gREdSOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0U3RhcnRMb2MoKSBjb25zdCB7IHJldHVybiBTdGFydExvYzsgfQorICB2b2lkIHNldFN0YXJ0TG9jKFNvdXJjZUxvY2F0aW9uIEwpIHsgU3RhcnRMb2MgPSBMOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldEVuZExvYygpIGNvbnN0IHsgcmV0dXJuIEVuZExvYzsgfQorICB2b2lkIHNldEVuZExvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IEVuZExvYyA9IEw7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gU3RhcnRMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBFbmRMb2M7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gRGVjbFN0bXRDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycyBvdmVyIHN1YmV4cHJlc3Npb25zLgorICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoY2hpbGRfaXRlcmF0b3IoREcuYmVnaW4oKSwgREcuZW5kKCkpLAorICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9pdGVyYXRvcihERy5lbmQoKSwgREcuZW5kKCkpKTsKKyAgfQorCisgIHVzaW5nIGRlY2xfaXRlcmF0b3IgPSBEZWNsR3JvdXBSZWY6Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9kZWNsX2l0ZXJhdG9yID0gRGVjbEdyb3VwUmVmOjpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgZGVjbF9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGRlY2xfaXRlcmF0b3I+OworICB1c2luZyBkZWNsX2NvbnN0X3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8Y29uc3RfZGVjbF9pdGVyYXRvcj47CisKKyAgZGVjbF9yYW5nZSBkZWNscygpIHsgcmV0dXJuIGRlY2xfcmFuZ2UoZGVjbF9iZWdpbigpLCBkZWNsX2VuZCgpKTsgfQorICBkZWNsX2NvbnN0X3JhbmdlIGRlY2xzKCkgY29uc3QgeworICAgIHJldHVybiBkZWNsX2NvbnN0X3JhbmdlKGRlY2xfYmVnaW4oKSwgZGVjbF9lbmQoKSk7CisgIH0KKyAgZGVjbF9pdGVyYXRvciBkZWNsX2JlZ2luKCkgeyByZXR1cm4gREcuYmVnaW4oKTsgfQorICBkZWNsX2l0ZXJhdG9yIGRlY2xfZW5kKCkgeyByZXR1cm4gREcuZW5kKCk7IH0KKyAgY29uc3RfZGVjbF9pdGVyYXRvciBkZWNsX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gREcuYmVnaW4oKTsgfQorICBjb25zdF9kZWNsX2l0ZXJhdG9yIGRlY2xfZW5kKCkgY29uc3QgeyByZXR1cm4gREcuZW5kKCk7IH0KKworICB1c2luZyByZXZlcnNlX2RlY2xfaXRlcmF0b3IgPSBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8ZGVjbF9pdGVyYXRvcj47CisKKyAgcmV2ZXJzZV9kZWNsX2l0ZXJhdG9yIGRlY2xfcmJlZ2luKCkgeworICAgIHJldHVybiByZXZlcnNlX2RlY2xfaXRlcmF0b3IoZGVjbF9lbmQoKSk7CisgIH0KKworICByZXZlcnNlX2RlY2xfaXRlcmF0b3IgZGVjbF9yZW5kKCkgeworICAgIHJldHVybiByZXZlcnNlX2RlY2xfaXRlcmF0b3IoZGVjbF9iZWdpbigpKTsKKyAgfQorfTsKKworLy8vIE51bGxTdG10IC0gVGhpcyBpcyB0aGUgbnVsbCBzdGF0ZW1lbnQgIjsiOiBDOTkgNi44LjNwMy4KKy8vLworY2xhc3MgTnVsbFN0bXQgOiBwdWJsaWMgU3RtdCB7CisgIFNvdXJjZUxvY2F0aW9uIFNlbWlMb2M7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoZSBudWxsIHN0YXRlbWVudCB3YXMgcHJlY2VkZWQgYnkgYW4gZW1wdHkgbWFjcm8sIGUuZzoKKyAgLy8vIEBjb2RlCisgIC8vLyAgICNkZWZpbmUgQ0FMTCh4KQorICAvLy8gICBDQUxMKDApOworICAvLy8gQGVuZGNvZGUKKyAgYm9vbCBIYXNMZWFkaW5nRW1wdHlNYWNybyA9IGZhbHNlOworCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNUU3RtdFdyaXRlcjsKKworICBOdWxsU3RtdChTb3VyY2VMb2NhdGlvbiBMLCBib29sIGhhc0xlYWRpbmdFbXB0eU1hY3JvID0gZmFsc2UpCisgICAgICA6IFN0bXQoTnVsbFN0bXRDbGFzcyksIFNlbWlMb2MoTCksCisgICAgICAgIEhhc0xlYWRpbmdFbXB0eU1hY3JvKGhhc0xlYWRpbmdFbXB0eU1hY3JvKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgbnVsbCBzdGF0ZW1lbnQuCisgIGV4cGxpY2l0IE51bGxTdG10KEVtcHR5U2hlbGwgRW1wdHkpIDogU3RtdChOdWxsU3RtdENsYXNzLCBFbXB0eSkge30KKworICBTb3VyY2VMb2NhdGlvbiBnZXRTZW1pTG9jKCkgY29uc3QgeyByZXR1cm4gU2VtaUxvYzsgfQorICB2b2lkIHNldFNlbWlMb2MoU291cmNlTG9jYXRpb24gTCkgeyBTZW1pTG9jID0gTDsgfQorCisgIGJvb2wgaGFzTGVhZGluZ0VtcHR5TWFjcm8oKSBjb25zdCB7IHJldHVybiBIYXNMZWFkaW5nRW1wdHlNYWNybzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBTZW1pTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gU2VtaUxvYzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBOdWxsU3RtdENsYXNzOworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9Cit9OworCisvLy8gQ29tcG91bmRTdG10IC0gVGhpcyByZXByZXNlbnRzIGEgZ3JvdXAgb2Ygc3RhdGVtZW50cyBsaWtlIHsgc3RtdCBzdG10IH0uCitjbGFzcyBDb21wb3VuZFN0bXQgZmluYWwgOiBwdWJsaWMgU3RtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPENvbXBvdW5kU3RtdCwgU3RtdCAqPiB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIFNvdXJjZUxvY2F0aW9uIExCcmFjZUxvYywgUkJyYWNlTG9jOworCisgIENvbXBvdW5kU3RtdChBcnJheVJlZjxTdG10ICo+IFN0bXRzLCBTb3VyY2VMb2NhdGlvbiBMQiwgU291cmNlTG9jYXRpb24gUkIpOworICBleHBsaWNpdCBDb21wb3VuZFN0bXQoRW1wdHlTaGVsbCBFbXB0eSkgOiBTdG10KENvbXBvdW5kU3RtdENsYXNzLCBFbXB0eSkge30KKworICB2b2lkIHNldFN0bXRzKEFycmF5UmVmPFN0bXQgKj4gU3RtdHMpOworCitwdWJsaWM6CisgIHN0YXRpYyBDb21wb3VuZFN0bXQgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBBcnJheVJlZjxTdG10ICo+IFN0bXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTEIsIFNvdXJjZUxvY2F0aW9uIFJCKTsKKworICAvLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY29tcG91bmQgc3RhdGVtZW50IHdpdGggYSBsb2NhdGlvbi4KKyAgZXhwbGljaXQgQ29tcG91bmRTdG10KFNvdXJjZUxvY2F0aW9uIExvYykKKyAgICAgIDogU3RtdChDb21wb3VuZFN0bXRDbGFzcyksIExCcmFjZUxvYyhMb2MpLCBSQnJhY2VMb2MoTG9jKSB7CisgICAgQ29tcG91bmRTdG10Qml0cy5OdW1TdG10cyA9IDA7CisgIH0KKworICAvLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY29tcG91bmQgc3RhdGVtZW50LgorICBzdGF0aWMgQ29tcG91bmRTdG10ICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBOdW1TdG10cyk7CisKKyAgYm9vbCBib2R5X2VtcHR5KCkgY29uc3QgeyByZXR1cm4gQ29tcG91bmRTdG10Qml0cy5OdW1TdG10cyA9PSAwOyB9CisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBDb21wb3VuZFN0bXRCaXRzLk51bVN0bXRzOyB9CisKKyAgdXNpbmcgYm9keV9pdGVyYXRvciA9IFN0bXQgKio7CisgIHVzaW5nIGJvZHlfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxib2R5X2l0ZXJhdG9yPjsKKworICBib2R5X3JhbmdlIGJvZHkoKSB7IHJldHVybiBib2R5X3JhbmdlKGJvZHlfYmVnaW4oKSwgYm9keV9lbmQoKSk7IH0KKyAgYm9keV9pdGVyYXRvciBib2R5X2JlZ2luKCkgeyByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPFN0bXQgKj4oKTsgfQorICBib2R5X2l0ZXJhdG9yIGJvZHlfZW5kKCkgeyByZXR1cm4gYm9keV9iZWdpbigpICsgc2l6ZSgpOyB9CisgIFN0bXQgKmJvZHlfZnJvbnQoKSB7IHJldHVybiAhYm9keV9lbXB0eSgpID8gYm9keV9iZWdpbigpWzBdIDogbnVsbHB0cjsgfQorICBTdG10ICpib2R5X2JhY2soKSB7CisgICAgcmV0dXJuICFib2R5X2VtcHR5KCkgPyBib2R5X2JlZ2luKClbc2l6ZSgpIC0gMV0gOiBudWxscHRyOworICB9CisKKyAgdm9pZCBzZXRMYXN0U3RtdChTdG10ICpTKSB7CisgICAgYXNzZXJ0KCFib2R5X2VtcHR5KCkgJiYgInNldExhc3RTdG10Iik7CisgICAgYm9keV9iZWdpbigpW3NpemUoKSAtIDFdID0gUzsKKyAgfQorCisgIHVzaW5nIGNvbnN0X2JvZHlfaXRlcmF0b3IgPSBTdG10KiBjb25zdCAqOworICB1c2luZyBib2R5X2NvbnN0X3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8Y29uc3RfYm9keV9pdGVyYXRvcj47CisKKyAgYm9keV9jb25zdF9yYW5nZSBib2R5KCkgY29uc3QgeworICAgIHJldHVybiBib2R5X2NvbnN0X3JhbmdlKGJvZHlfYmVnaW4oKSwgYm9keV9lbmQoKSk7CisgIH0KKworICBjb25zdF9ib2R5X2l0ZXJhdG9yIGJvZHlfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxTdG10ICo+KCk7CisgIH0KKyAgY29uc3RfYm9keV9pdGVyYXRvciBib2R5X2VuZCgpIGNvbnN0IHsgcmV0dXJuIGJvZHlfYmVnaW4oKSArIHNpemUoKTsgfQorCisgIGNvbnN0IFN0bXQgKmJvZHlfZnJvbnQoKSBjb25zdCB7CisgICAgcmV0dXJuICFib2R5X2VtcHR5KCkgPyBib2R5X2JlZ2luKClbMF0gOiBudWxscHRyOworICB9CisKKyAgY29uc3QgU3RtdCAqYm9keV9iYWNrKCkgY29uc3QgeworICAgIHJldHVybiAhYm9keV9lbXB0eSgpID8gYm9keV9iZWdpbigpW3NpemUoKSAtIDFdIDogbnVsbHB0cjsKKyAgfQorCisgIHVzaW5nIHJldmVyc2VfYm9keV9pdGVyYXRvciA9IHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxib2R5X2l0ZXJhdG9yPjsKKworICByZXZlcnNlX2JvZHlfaXRlcmF0b3IgYm9keV9yYmVnaW4oKSB7CisgICAgcmV0dXJuIHJldmVyc2VfYm9keV9pdGVyYXRvcihib2R5X2VuZCgpKTsKKyAgfQorCisgIHJldmVyc2VfYm9keV9pdGVyYXRvciBib2R5X3JlbmQoKSB7CisgICAgcmV0dXJuIHJldmVyc2VfYm9keV9pdGVyYXRvcihib2R5X2JlZ2luKCkpOworICB9CisKKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9ib2R5X2l0ZXJhdG9yID0KKyAgICAgIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9ib2R5X2l0ZXJhdG9yPjsKKworICBjb25zdF9yZXZlcnNlX2JvZHlfaXRlcmF0b3IgYm9keV9yYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfYm9keV9pdGVyYXRvcihib2R5X2VuZCgpKTsKKyAgfQorCisgIGNvbnN0X3JldmVyc2VfYm9keV9pdGVyYXRvciBib2R5X3JlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfYm9keV9pdGVyYXRvcihib2R5X2JlZ2luKCkpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIExCcmFjZUxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJCcmFjZUxvYzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExCcmFjTG9jKCkgY29uc3QgeyByZXR1cm4gTEJyYWNlTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldFJCcmFjTG9jKCkgY29uc3QgeyByZXR1cm4gUkJyYWNlTG9jOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IENvbXBvdW5kU3RtdENsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoYm9keV9iZWdpbigpLCBib2R5X2VuZCgpKTsgfQorCisgIGNvbnN0X2NoaWxkX3JhbmdlIGNoaWxkcmVuKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jaGlsZF9yYW5nZShib2R5X2JlZ2luKCksIGJvZHlfZW5kKCkpOworICB9Cit9OworCisvLyBTd2l0Y2hDYXNlIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBDYXNlU3RtdCBhbmQgRGVmYXVsdFN0bXQsCitjbGFzcyBTd2l0Y2hDYXNlIDogcHVibGljIFN0bXQgeworcHJvdGVjdGVkOgorICAvLyBBIHBvaW50ZXIgdG8gdGhlIGZvbGxvd2luZyBDYXNlU3RtdCBvciBEZWZhdWx0U3RtdCBjbGFzcywKKyAgLy8gdXNlZCBieSBTd2l0Y2hTdG10LgorICBTd2l0Y2hDYXNlICpOZXh0U3dpdGNoQ2FzZSA9IG51bGxwdHI7CisgIFNvdXJjZUxvY2F0aW9uIEtleXdvcmRMb2M7CisgIFNvdXJjZUxvY2F0aW9uIENvbG9uTG9jOworCisgIFN3aXRjaENhc2UoU3RtdENsYXNzIFNDLCBTb3VyY2VMb2NhdGlvbiBLV0xvYywgU291cmNlTG9jYXRpb24gQ29sb25Mb2MpCisgICAgICA6IFN0bXQoU0MpLCBLZXl3b3JkTG9jKEtXTG9jKSwgQ29sb25Mb2MoQ29sb25Mb2MpIHt9CisKKyAgU3dpdGNoQ2FzZShTdG10Q2xhc3MgU0MsIEVtcHR5U2hlbGwpIDogU3RtdChTQykge30KKworcHVibGljOgorICBjb25zdCBTd2l0Y2hDYXNlICpnZXROZXh0U3dpdGNoQ2FzZSgpIGNvbnN0IHsgcmV0dXJuIE5leHRTd2l0Y2hDYXNlOyB9CisKKyAgU3dpdGNoQ2FzZSAqZ2V0TmV4dFN3aXRjaENhc2UoKSB7IHJldHVybiBOZXh0U3dpdGNoQ2FzZTsgfQorCisgIHZvaWQgc2V0TmV4dFN3aXRjaENhc2UoU3dpdGNoQ2FzZSAqU0MpIHsgTmV4dFN3aXRjaENhc2UgPSBTQzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEtleXdvcmRMb2MoKSBjb25zdCB7IHJldHVybiBLZXl3b3JkTG9jOyB9CisgIHZvaWQgc2V0S2V5d29yZExvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IEtleXdvcmRMb2MgPSBMOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldENvbG9uTG9jKCkgY29uc3QgeyByZXR1cm4gQ29sb25Mb2M7IH0KKyAgdm9pZCBzZXRDb2xvbkxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IENvbG9uTG9jID0gTDsgfQorCisgIFN0bXQgKmdldFN1YlN0bXQoKTsKKyAgY29uc3QgU3RtdCAqZ2V0U3ViU3RtdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxTd2l0Y2hDYXNlKj4odGhpcyktPmdldFN1YlN0bXQoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBLZXl3b3JkTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IENhc2VTdG10Q2xhc3MgfHwKKyAgICAgICAgICAgVC0+Z2V0U3RtdENsYXNzKCkgPT0gRGVmYXVsdFN0bXRDbGFzczsKKyAgfQorfTsKKworY2xhc3MgQ2FzZVN0bXQgOiBwdWJsaWMgU3dpdGNoQ2FzZSB7CisgIFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jOworICBlbnVtIHsgTEhTLCBSSFMsIFNVQlNUTVQsIEVORF9FWFBSIH07CisgIFN0bXQqIFN1YkV4cHJzW0VORF9FWFBSXTsgIC8vIFRoZSBleHByZXNzaW9uIGZvciB0aGUgUkhTIGlzIE5vbi1udWxsIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHTlUgImNhc2UgMSAuLi4gNCIgZXh0ZW5zaW9uCisKK3B1YmxpYzoKKyAgQ2FzZVN0bXQoRXhwciAqbGhzLCBFeHByICpyaHMsIFNvdXJjZUxvY2F0aW9uIGNhc2VMb2MsCisgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIGVsbGlwc2lzTG9jLCBTb3VyY2VMb2NhdGlvbiBjb2xvbkxvYykKKyAgICA6IFN3aXRjaENhc2UoQ2FzZVN0bXRDbGFzcywgY2FzZUxvYywgY29sb25Mb2MpIHsKKyAgICBTdWJFeHByc1tTVUJTVE1UXSA9IG51bGxwdHI7CisgICAgU3ViRXhwcnNbTEhTXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCo+KGxocyk7CisgICAgU3ViRXhwcnNbUkhTXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCo+KHJocyk7CisgICAgRWxsaXBzaXNMb2MgPSBlbGxpcHNpc0xvYzsKKyAgfQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgc3dpdGNoIGNhc2Ugc3RhdGVtZW50LgorICBleHBsaWNpdCBDYXNlU3RtdChFbXB0eVNoZWxsIEVtcHR5KSA6IFN3aXRjaENhc2UoQ2FzZVN0bXRDbGFzcywgRW1wdHkpIHt9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0Q2FzZUxvYygpIGNvbnN0IHsgcmV0dXJuIEtleXdvcmRMb2M7IH0KKyAgdm9pZCBzZXRDYXNlTG9jKFNvdXJjZUxvY2F0aW9uIEwpIHsgS2V5d29yZExvYyA9IEw7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0RWxsaXBzaXNMb2MoKSBjb25zdCB7IHJldHVybiBFbGxpcHNpc0xvYzsgfQorICB2b2lkIHNldEVsbGlwc2lzTG9jKFNvdXJjZUxvY2F0aW9uIEwpIHsgRWxsaXBzaXNMb2MgPSBMOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldENvbG9uTG9jKCkgY29uc3QgeyByZXR1cm4gQ29sb25Mb2M7IH0KKyAgdm9pZCBzZXRDb2xvbkxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IENvbG9uTG9jID0gTDsgfQorCisgIEV4cHIgKmdldExIUygpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwcio+KFN1YkV4cHJzW0xIU10pOyB9CisgIEV4cHIgKmdldFJIUygpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwcio+KFN1YkV4cHJzW1JIU10pOyB9CisgIFN0bXQgKmdldFN1YlN0bXQoKSB7IHJldHVybiBTdWJFeHByc1tTVUJTVE1UXTsgfQorCisgIGNvbnN0IEV4cHIgKmdldExIUygpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFeHByKj4oU3ViRXhwcnNbTEhTXSk7CisgIH0KKworICBjb25zdCBFeHByICpnZXRSSFMoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXhwcio+KFN1YkV4cHJzW1JIU10pOworICB9CisKKyAgY29uc3QgU3RtdCAqZ2V0U3ViU3RtdCgpIGNvbnN0IHsgcmV0dXJuIFN1YkV4cHJzW1NVQlNUTVRdOyB9CisKKyAgdm9pZCBzZXRTdWJTdG10KFN0bXQgKlMpIHsgU3ViRXhwcnNbU1VCU1RNVF0gPSBTOyB9CisgIHZvaWQgc2V0TEhTKEV4cHIgKlZhbCkgeyBTdWJFeHByc1tMSFNdID0gcmVpbnRlcnByZXRfY2FzdDxTdG10Kj4oVmFsKTsgfQorICB2b2lkIHNldFJIUyhFeHByICpWYWwpIHsgU3ViRXhwcnNbUkhTXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCo+KFZhbCk7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gS2V5d29yZExvYzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIC8vIEhhbmRsZSBkZWVwbHkgbmVzdGVkIGNhc2Ugc3RhdGVtZW50cyB3aXRoIGl0ZXJhdGlvbiBpbnN0ZWFkIG9mIHJlY3Vyc2lvbi4KKyAgICBjb25zdCBDYXNlU3RtdCAqQ1MgPSB0aGlzOworICAgIHdoaWxlIChjb25zdCBDYXNlU3RtdCAqQ1MyID0gZHluX2Nhc3Q8Q2FzZVN0bXQ+KENTLT5nZXRTdWJTdG10KCkpKQorICAgICAgQ1MgPSBDUzI7CisKKyAgICByZXR1cm4gQ1MtPmdldFN1YlN0bXQoKS0+Z2V0TG9jRW5kKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ2FzZVN0bXRDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoJlN1YkV4cHJzWzBdLCAmU3ViRXhwcnNbRU5EX0VYUFJdKTsKKyAgfQorfTsKKworY2xhc3MgRGVmYXVsdFN0bXQgOiBwdWJsaWMgU3dpdGNoQ2FzZSB7CisgIFN0bXQqIFN1YlN0bXQ7CisKK3B1YmxpYzoKKyAgRGVmYXVsdFN0bXQoU291cmNlTG9jYXRpb24gREwsIFNvdXJjZUxvY2F0aW9uIENMLCBTdG10ICpzdWJzdG10KSA6CisgICAgU3dpdGNoQ2FzZShEZWZhdWx0U3RtdENsYXNzLCBETCwgQ0wpLCBTdWJTdG10KHN1YnN0bXQpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBkZWZhdWx0IHN0YXRlbWVudC4KKyAgZXhwbGljaXQgRGVmYXVsdFN0bXQoRW1wdHlTaGVsbCBFbXB0eSkKKyAgICAgIDogU3dpdGNoQ2FzZShEZWZhdWx0U3RtdENsYXNzLCBFbXB0eSkge30KKworICBTdG10ICpnZXRTdWJTdG10KCkgeyByZXR1cm4gU3ViU3RtdDsgfQorICBjb25zdCBTdG10ICpnZXRTdWJTdG10KCkgY29uc3QgeyByZXR1cm4gU3ViU3RtdDsgfQorICB2b2lkIHNldFN1YlN0bXQoU3RtdCAqUykgeyBTdWJTdG10ID0gUzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldERlZmF1bHRMb2MoKSBjb25zdCB7IHJldHVybiBLZXl3b3JkTG9jOyB9CisgIHZvaWQgc2V0RGVmYXVsdExvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IEtleXdvcmRMb2MgPSBMOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldENvbG9uTG9jKCkgY29uc3QgeyByZXR1cm4gQ29sb25Mb2M7IH0KKyAgdm9pZCBzZXRDb2xvbkxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IENvbG9uTG9jID0gTDsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBLZXl3b3JkTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gU3ViU3RtdC0+Z2V0TG9jRW5kKCk7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBEZWZhdWx0U3RtdENsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoJlN1YlN0bXQsICZTdWJTdG10KzEpOyB9Cit9OworCitpbmxpbmUgU291cmNlTG9jYXRpb24gU3dpdGNoQ2FzZTo6Z2V0TG9jRW5kKCkgY29uc3QgeworICBpZiAoY29uc3QgQ2FzZVN0bXQgKkNTID0gZHluX2Nhc3Q8Q2FzZVN0bXQ+KHRoaXMpKQorICAgIHJldHVybiBDUy0+Z2V0TG9jRW5kKCk7CisgIHJldHVybiBjYXN0PERlZmF1bHRTdG10Pih0aGlzKS0+Z2V0TG9jRW5kKCk7Cit9CisKKy8vLyBMYWJlbFN0bXQgLSBSZXByZXNlbnRzIGEgbGFiZWwsIHdoaWNoIGhhcyBhIHN1YnN0YXRlbWVudC4gIEZvciBleGFtcGxlOgorLy8vICAgIGZvbzogcmV0dXJuOworY2xhc3MgTGFiZWxTdG10IDogcHVibGljIFN0bXQgeworICBTb3VyY2VMb2NhdGlvbiBJZGVudExvYzsKKyAgTGFiZWxEZWNsICpUaGVEZWNsOworICBTdG10ICpTdWJTdG10OworCitwdWJsaWM6CisgIExhYmVsU3RtdChTb3VyY2VMb2NhdGlvbiBJTCwgTGFiZWxEZWNsICpELCBTdG10ICpzdWJzdG10KQorICAgICAgOiBTdG10KExhYmVsU3RtdENsYXNzKSwgSWRlbnRMb2MoSUwpLCBUaGVEZWNsKEQpLCBTdWJTdG10KHN1YnN0bXQpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihMYWJlbFN0bXQpID09CisgICAgICAgICAgICAgICAgICAgICAgMiAqIHNpemVvZihTb3VyY2VMb2NhdGlvbikgKyAyICogc2l6ZW9mKHZvaWQgKiksCisgICAgICAgICAgICAgICAgICAiTGFiZWxTdG10IHRvbyBiaWciKTsKKyAgfQorCisgIC8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBsYWJlbCBzdGF0ZW1lbnQuCisgIGV4cGxpY2l0IExhYmVsU3RtdChFbXB0eVNoZWxsIEVtcHR5KSA6IFN0bXQoTGFiZWxTdG10Q2xhc3MsIEVtcHR5KSB7fQorCisgIFNvdXJjZUxvY2F0aW9uIGdldElkZW50TG9jKCkgY29uc3QgeyByZXR1cm4gSWRlbnRMb2M7IH0KKyAgTGFiZWxEZWNsICpnZXREZWNsKCkgY29uc3QgeyByZXR1cm4gVGhlRGVjbDsgfQorICB2b2lkIHNldERlY2woTGFiZWxEZWNsICpEKSB7IFRoZURlY2wgPSBEOyB9CisgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBjb25zdDsKKyAgU3RtdCAqZ2V0U3ViU3RtdCgpIHsgcmV0dXJuIFN1YlN0bXQ7IH0KKyAgY29uc3QgU3RtdCAqZ2V0U3ViU3RtdCgpIGNvbnN0IHsgcmV0dXJuIFN1YlN0bXQ7IH0KKyAgdm9pZCBzZXRJZGVudExvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IElkZW50TG9jID0gTDsgfQorICB2b2lkIHNldFN1YlN0bXQoU3RtdCAqU1MpIHsgU3ViU3RtdCA9IFNTOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIElkZW50TG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gU3ViU3RtdC0+Z2V0TG9jRW5kKCk7fQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoJlN1YlN0bXQsICZTdWJTdG10KzEpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IExhYmVsU3RtdENsYXNzOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYW4gYXR0cmlidXRlIGFwcGxpZWQgdG8gYSBzdGF0ZW1lbnQuCisvLy8KKy8vLyBSZXByZXNlbnRzIGFuIGF0dHJpYnV0ZSBhcHBsaWVkIHRvIGEgc3RhdGVtZW50LiBGb3IgZXhhbXBsZToKKy8vLyAgIFtbb21wOjpmb3IoLi4uKV1dIGZvciAoLi4uKSB7IC4uLiB9CitjbGFzcyBBdHRyaWJ1dGVkU3RtdCBmaW5hbAorICAgIDogcHVibGljIFN0bXQsCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxBdHRyaWJ1dGVkU3RtdCwgY29uc3QgQXR0ciAqPiB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIFN0bXQgKlN1YlN0bXQ7CisgIFNvdXJjZUxvY2F0aW9uIEF0dHJMb2M7CisgIHVuc2lnbmVkIE51bUF0dHJzOworCisgIEF0dHJpYnV0ZWRTdG10KFNvdXJjZUxvY2F0aW9uIExvYywgQXJyYXlSZWY8Y29uc3QgQXR0cio+IEF0dHJzLCBTdG10ICpTdWJTdG10KQorICAgIDogU3RtdChBdHRyaWJ1dGVkU3RtdENsYXNzKSwgU3ViU3RtdChTdWJTdG10KSwgQXR0ckxvYyhMb2MpLAorICAgICAgTnVtQXR0cnMoQXR0cnMuc2l6ZSgpKSB7CisgICAgc3RkOjpjb3B5KEF0dHJzLmJlZ2luKCksIEF0dHJzLmVuZCgpLCBnZXRBdHRyQXJyYXlQdHIoKSk7CisgIH0KKworICBleHBsaWNpdCBBdHRyaWJ1dGVkU3RtdChFbXB0eVNoZWxsIEVtcHR5LCB1bnNpZ25lZCBOdW1BdHRycykKKyAgICA6IFN0bXQoQXR0cmlidXRlZFN0bXRDbGFzcywgRW1wdHkpLCBOdW1BdHRycyhOdW1BdHRycykgeworICAgIHN0ZDo6ZmlsbF9uKGdldEF0dHJBcnJheVB0cigpLCBOdW1BdHRycywgbnVsbHB0cik7CisgIH0KKworICBjb25zdCBBdHRyICpjb25zdCAqZ2V0QXR0ckFycmF5UHRyKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8Y29uc3QgQXR0ciAqPigpOworICB9CisgIGNvbnN0IEF0dHIgKipnZXRBdHRyQXJyYXlQdHIoKSB7IHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8Y29uc3QgQXR0ciAqPigpOyB9CisKK3B1YmxpYzoKKyAgc3RhdGljIEF0dHJpYnV0ZWRTdG10ICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBBdHRyKj4gQXR0cnMsIFN0bXQgKlN1YlN0bXQpOworCisgIC8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBhdHRyaWJ1dGVkIHN0YXRlbWVudC4KKyAgc3RhdGljIEF0dHJpYnV0ZWRTdG10ICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBOdW1BdHRycyk7CisKKyAgU291cmNlTG9jYXRpb24gZ2V0QXR0ckxvYygpIGNvbnN0IHsgcmV0dXJuIEF0dHJMb2M7IH0KKyAgQXJyYXlSZWY8Y29uc3QgQXR0cio+IGdldEF0dHJzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoZ2V0QXR0ckFycmF5UHRyKCksIE51bUF0dHJzKTsKKyAgfQorCisgIFN0bXQgKmdldFN1YlN0bXQoKSB7IHJldHVybiBTdWJTdG10OyB9CisgIGNvbnN0IFN0bXQgKmdldFN1YlN0bXQoKSBjb25zdCB7IHJldHVybiBTdWJTdG10OyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIEF0dHJMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBTdWJTdG10LT5nZXRMb2NFbmQoKTt9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7IHJldHVybiBjaGlsZF9yYW5nZSgmU3ViU3RtdCwgJlN1YlN0bXQgKyAxKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBBdHRyaWJ1dGVkU3RtdENsYXNzOworICB9Cit9OworCisvLy8gSWZTdG10IC0gVGhpcyByZXByZXNlbnRzIGFuIGlmL3RoZW4vZWxzZS4KK2NsYXNzIElmU3RtdCA6IHB1YmxpYyBTdG10IHsKKyAgZW51bSB7IElOSVQsIFZBUiwgQ09ORCwgVEhFTiwgRUxTRSwgRU5EX0VYUFIgfTsKKyAgU3RtdCogU3ViRXhwcnNbRU5EX0VYUFJdOworCisgIFNvdXJjZUxvY2F0aW9uIElmTG9jOworICBTb3VyY2VMb2NhdGlvbiBFbHNlTG9jOworCitwdWJsaWM6CisgIElmU3RtdChjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBJTCwKKyAgICAgICAgIGJvb2wgSXNDb25zdGV4cHIsIFN0bXQgKmluaXQsIFZhckRlY2wgKnZhciwgRXhwciAqY29uZCwKKyAgICAgICAgIFN0bXQgKnRoZW4sIFNvdXJjZUxvY2F0aW9uIEVMID0gU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgIFN0bXQgKmVsc2V2ID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBpZi90aGVuL2Vsc2Ugc3RhdGVtZW50CisgIGV4cGxpY2l0IElmU3RtdChFbXB0eVNoZWxsIEVtcHR5KSA6IFN0bXQoSWZTdG10Q2xhc3MsIEVtcHR5KSB7fQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHZhcmlhYmxlIGRlY2xhcmVkIGluIHRoaXMgImlmIiBzdGF0ZW1lbnQsIGlmIGFueS4KKyAgLy8vCisgIC8vLyBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsICJ4IiBpcyB0aGUgY29uZGl0aW9uIHZhcmlhYmxlLgorICAvLy8gXGNvZGUKKyAgLy8vIGlmIChpbnQgeCA9IGZvbygpKSB7CisgIC8vLyAgIHByaW50ZigieCBpcyAlZCIsIHgpOworICAvLy8gfQorICAvLy8gXGVuZGNvZGUKKyAgVmFyRGVjbCAqZ2V0Q29uZGl0aW9uVmFyaWFibGUoKSBjb25zdDsKKyAgdm9pZCBzZXRDb25kaXRpb25WYXJpYWJsZShjb25zdCBBU1RDb250ZXh0ICZDLCBWYXJEZWNsICpWKTsKKworICAvLy8gSWYgdGhpcyBJZlN0bXQgaGFzIGEgY29uZGl0aW9uIHZhcmlhYmxlLCByZXR1cm4gdGhlIGZhdXggRGVjbFN0bXQKKyAgLy8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3JlYXRpb24gb2YgdGhhdCBjb25kaXRpb24gdmFyaWFibGUuCisgIGNvbnN0IERlY2xTdG10ICpnZXRDb25kaXRpb25WYXJpYWJsZURlY2xTdG10KCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PERlY2xTdG10Kj4oU3ViRXhwcnNbVkFSXSk7CisgIH0KKworICBTdG10ICpnZXRJbml0KCkgeyByZXR1cm4gU3ViRXhwcnNbSU5JVF07IH0KKyAgY29uc3QgU3RtdCAqZ2V0SW5pdCgpIGNvbnN0IHsgcmV0dXJuIFN1YkV4cHJzW0lOSVRdOyB9CisgIHZvaWQgc2V0SW5pdChTdG10ICpTKSB7IFN1YkV4cHJzW0lOSVRdID0gUzsgfQorICBjb25zdCBFeHByICpnZXRDb25kKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxFeHByKj4oU3ViRXhwcnNbQ09ORF0pO30KKyAgdm9pZCBzZXRDb25kKEV4cHIgKkUpIHsgU3ViRXhwcnNbQ09ORF0gPSByZWludGVycHJldF9jYXN0PFN0bXQgKj4oRSk7IH0KKyAgY29uc3QgU3RtdCAqZ2V0VGhlbigpIGNvbnN0IHsgcmV0dXJuIFN1YkV4cHJzW1RIRU5dOyB9CisgIHZvaWQgc2V0VGhlbihTdG10ICpTKSB7IFN1YkV4cHJzW1RIRU5dID0gUzsgfQorICBjb25zdCBTdG10ICpnZXRFbHNlKCkgY29uc3QgeyByZXR1cm4gU3ViRXhwcnNbRUxTRV07IH0KKyAgdm9pZCBzZXRFbHNlKFN0bXQgKlMpIHsgU3ViRXhwcnNbRUxTRV0gPSBTOyB9CisKKyAgRXhwciAqZ2V0Q29uZCgpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwcio+KFN1YkV4cHJzW0NPTkRdKTsgfQorICBTdG10ICpnZXRUaGVuKCkgeyByZXR1cm4gU3ViRXhwcnNbVEhFTl07IH0KKyAgU3RtdCAqZ2V0RWxzZSgpIHsgcmV0dXJuIFN1YkV4cHJzW0VMU0VdOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0SWZMb2MoKSBjb25zdCB7IHJldHVybiBJZkxvYzsgfQorICB2b2lkIHNldElmTG9jKFNvdXJjZUxvY2F0aW9uIEwpIHsgSWZMb2MgPSBMOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldEVsc2VMb2MoKSBjb25zdCB7IHJldHVybiBFbHNlTG9jOyB9CisgIHZvaWQgc2V0RWxzZUxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IEVsc2VMb2MgPSBMOyB9CisKKyAgYm9vbCBpc0NvbnN0ZXhwcigpIGNvbnN0IHsgcmV0dXJuIElmU3RtdEJpdHMuSXNDb25zdGV4cHI7IH0KKyAgdm9pZCBzZXRDb25zdGV4cHIoYm9vbCBDKSB7IElmU3RtdEJpdHMuSXNDb25zdGV4cHIgPSBDOyB9CisKKyAgYm9vbCBpc09iakNBdmFpbGFiaWxpdHlDaGVjaygpIGNvbnN0OworCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBJZkxvYzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIGlmIChTdWJFeHByc1tFTFNFXSkKKyAgICAgIHJldHVybiBTdWJFeHByc1tFTFNFXS0+Z2V0TG9jRW5kKCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIFN1YkV4cHJzW1RIRU5dLT5nZXRMb2NFbmQoKTsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycyBvdmVyIHN1YmV4cHJlc3Npb25zLiAgVGhlIGl0ZXJhdG9ycyB3aWxsIGluY2x1ZGUgaXRlcmF0aW5nCisgIC8vIG92ZXIgdGhlIGluaXRpYWxpemF0aW9uIGV4cHJlc3Npb24gcmVmZXJlbmNlZCBieSB0aGUgY29uZGl0aW9uIHZhcmlhYmxlLgorICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoJlN1YkV4cHJzWzBdLCAmU3ViRXhwcnNbMF0rRU5EX0VYUFIpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IElmU3RtdENsYXNzOworICB9Cit9OworCisvLy8gU3dpdGNoU3RtdCAtIFRoaXMgcmVwcmVzZW50cyBhICdzd2l0Y2gnIHN0bXQuCitjbGFzcyBTd2l0Y2hTdG10IDogcHVibGljIFN0bXQgeworICBTb3VyY2VMb2NhdGlvbiBTd2l0Y2hMb2M7CisgIGVudW0geyBJTklULCBWQVIsIENPTkQsIEJPRFksIEVORF9FWFBSIH07CisgIFN0bXQqIFN1YkV4cHJzW0VORF9FWFBSXTsKKworICAvLyBUaGlzIHBvaW50cyB0byBhIGxpbmtlZCBsaXN0IG9mIGNhc2UgYW5kIGRlZmF1bHQgc3RhdGVtZW50cyBhbmQsIGlmIHRoZQorICAvLyBTd2l0Y2hTdG10IGlzIGEgc3dpdGNoIG9uIGFuIGVudW0gdmFsdWUsIHJlY29yZHMgd2hldGhlciBhbGwgdGhlIGVudW0KKyAgLy8gdmFsdWVzIHdlcmUgY292ZXJlZCBieSBDYXNlU3RtdHMuICBUaGUgY292ZXJhZ2UgaW5mb3JtYXRpb24gdmFsdWUgaXMgbWVhbnQKKyAgLy8gdG8gYmUgYSBoaW50IGZvciBwb3NzaWJsZSBjbGllbnRzLgorICBsbHZtOjpQb2ludGVySW50UGFpcjxTd2l0Y2hDYXNlICosIDEsIGJvb2w+IEZpcnN0Q2FzZTsKKworcHVibGljOgorICBTd2l0Y2hTdG10KGNvbnN0IEFTVENvbnRleHQgJkMsIFN0bXQgKkluaXQsIFZhckRlY2wgKlZhciwgRXhwciAqY29uZCk7CisKKyAgLy8vIFxicmllZiBCdWlsZCBhIGVtcHR5IHN3aXRjaCBzdGF0ZW1lbnQuCisgIGV4cGxpY2l0IFN3aXRjaFN0bXQoRW1wdHlTaGVsbCBFbXB0eSkgOiBTdG10KFN3aXRjaFN0bXRDbGFzcywgRW1wdHkpIHt9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdmFyaWFibGUgZGVjbGFyZWQgaW4gdGhpcyAic3dpdGNoIiBzdGF0ZW1lbnQsIGlmIGFueS4KKyAgLy8vCisgIC8vLyBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsICJ4IiBpcyB0aGUgY29uZGl0aW9uIHZhcmlhYmxlLgorICAvLy8gXGNvZGUKKyAgLy8vIHN3aXRjaCAoaW50IHggPSBmb28oKSkgeworICAvLy8gICBjYXNlIDA6IGJyZWFrOworICAvLy8gICAvLyAuLi4KKyAgLy8vIH0KKyAgLy8vIFxlbmRjb2RlCisgIFZhckRlY2wgKmdldENvbmRpdGlvblZhcmlhYmxlKCkgY29uc3Q7CisgIHZvaWQgc2V0Q29uZGl0aW9uVmFyaWFibGUoY29uc3QgQVNUQ29udGV4dCAmQywgVmFyRGVjbCAqVik7CisKKyAgLy8vIElmIHRoaXMgU3dpdGNoU3RtdCBoYXMgYSBjb25kaXRpb24gdmFyaWFibGUsIHJldHVybiB0aGUgZmF1eCBEZWNsU3RtdAorICAvLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBjcmVhdGlvbiBvZiB0aGF0IGNvbmRpdGlvbiB2YXJpYWJsZS4KKyAgY29uc3QgRGVjbFN0bXQgKmdldENvbmRpdGlvblZhcmlhYmxlRGVjbFN0bXQoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RGVjbFN0bXQqPihTdWJFeHByc1tWQVJdKTsKKyAgfQorCisgIFN0bXQgKmdldEluaXQoKSB7IHJldHVybiBTdWJFeHByc1tJTklUXTsgfQorICBjb25zdCBTdG10ICpnZXRJbml0KCkgY29uc3QgeyByZXR1cm4gU3ViRXhwcnNbSU5JVF07IH0KKyAgdm9pZCBzZXRJbml0KFN0bXQgKlMpIHsgU3ViRXhwcnNbSU5JVF0gPSBTOyB9CisgIGNvbnN0IEV4cHIgKmdldENvbmQoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PEV4cHIqPihTdWJFeHByc1tDT05EXSk7fQorICBjb25zdCBTdG10ICpnZXRCb2R5KCkgY29uc3QgeyByZXR1cm4gU3ViRXhwcnNbQk9EWV07IH0KKyAgY29uc3QgU3dpdGNoQ2FzZSAqZ2V0U3dpdGNoQ2FzZUxpc3QoKSBjb25zdCB7IHJldHVybiBGaXJzdENhc2UuZ2V0UG9pbnRlcigpOyB9CisKKyAgRXhwciAqZ2V0Q29uZCgpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwcio+KFN1YkV4cHJzW0NPTkRdKTt9CisgIHZvaWQgc2V0Q29uZChFeHByICpFKSB7IFN1YkV4cHJzW0NPTkRdID0gcmVpbnRlcnByZXRfY2FzdDxTdG10ICo+KEUpOyB9CisgIFN0bXQgKmdldEJvZHkoKSB7IHJldHVybiBTdWJFeHByc1tCT0RZXTsgfQorICB2b2lkIHNldEJvZHkoU3RtdCAqUykgeyBTdWJFeHByc1tCT0RZXSA9IFM7IH0KKyAgU3dpdGNoQ2FzZSAqZ2V0U3dpdGNoQ2FzZUxpc3QoKSB7IHJldHVybiBGaXJzdENhc2UuZ2V0UG9pbnRlcigpOyB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGNhc2UgbGlzdCBmb3IgdGhpcyBzd2l0Y2ggc3RhdGVtZW50LgorICB2b2lkIHNldFN3aXRjaENhc2VMaXN0KFN3aXRjaENhc2UgKlNDKSB7IEZpcnN0Q2FzZS5zZXRQb2ludGVyKFNDKTsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFN3aXRjaExvYygpIGNvbnN0IHsgcmV0dXJuIFN3aXRjaExvYzsgfQorICB2b2lkIHNldFN3aXRjaExvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IFN3aXRjaExvYyA9IEw7IH0KKworICB2b2lkIHNldEJvZHkoU3RtdCAqUywgU291cmNlTG9jYXRpb24gU0wpIHsKKyAgICBTdWJFeHByc1tCT0RZXSA9IFM7CisgICAgU3dpdGNoTG9jID0gU0w7CisgIH0KKworICB2b2lkIGFkZFN3aXRjaENhc2UoU3dpdGNoQ2FzZSAqU0MpIHsKKyAgICBhc3NlcnQoIVNDLT5nZXROZXh0U3dpdGNoQ2FzZSgpCisgICAgICAgICAgICYmICJjYXNlL2RlZmF1bHQgYWxyZWFkeSBhZGRlZCB0byBhIHN3aXRjaCIpOworICAgIFNDLT5zZXROZXh0U3dpdGNoQ2FzZShGaXJzdENhc2UuZ2V0UG9pbnRlcigpKTsKKyAgICBGaXJzdENhc2Uuc2V0UG9pbnRlcihTQyk7CisgIH0KKworICAvLy8gU2V0IGEgZmxhZyBpbiB0aGUgU3dpdGNoU3RtdCBpbmRpY2F0aW5nIHRoYXQgaWYgdGhlICdzd2l0Y2ggKFgpJyBpcyBhCisgIC8vLyBzd2l0Y2ggb3ZlciBhbiBlbnVtIHZhbHVlIHRoZW4gYWxsIGNhc2VzIGhhdmUgYmVlbiBleHBsaWNpdGx5IGNvdmVyZWQuCisgIHZvaWQgc2V0QWxsRW51bUNhc2VzQ292ZXJlZCgpIHsgRmlyc3RDYXNlLnNldEludCh0cnVlKTsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIFN3aXRjaFN0bXQgaXMgYSBzd2l0Y2ggb2YgYW4gZW51bSB2YWx1ZSBhbmQgYWxsIGNhc2VzCisgIC8vLyBoYXZlIGJlZW4gZXhwbGljaXRseSBjb3ZlcmVkLgorICBib29sIGlzQWxsRW51bUNhc2VzQ292ZXJlZCgpIGNvbnN0IHsgcmV0dXJuIEZpcnN0Q2FzZS5nZXRJbnQoKTsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBTd2l0Y2hMb2M7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gU3ViRXhwcnNbQk9EWV0gPyBTdWJFeHByc1tCT0RZXS0+Z2V0TG9jRW5kKCkgOiBTdWJFeHByc1tDT05EXS0+Z2V0TG9jRW5kKCk7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKCZTdWJFeHByc1swXSwgJlN1YkV4cHJzWzBdK0VORF9FWFBSKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBTd2l0Y2hTdG10Q2xhc3M7CisgIH0KK307CisKKy8vLyBXaGlsZVN0bXQgLSBUaGlzIHJlcHJlc2VudHMgYSAnd2hpbGUnIHN0bXQuCitjbGFzcyBXaGlsZVN0bXQgOiBwdWJsaWMgU3RtdCB7CisgIFNvdXJjZUxvY2F0aW9uIFdoaWxlTG9jOworICBlbnVtIHsgVkFSLCBDT05ELCBCT0RZLCBFTkRfRVhQUiB9OworICBTdG10KiBTdWJFeHByc1tFTkRfRVhQUl07CisKK3B1YmxpYzoKKyAgV2hpbGVTdG10KGNvbnN0IEFTVENvbnRleHQgJkMsIFZhckRlY2wgKlZhciwgRXhwciAqY29uZCwgU3RtdCAqYm9keSwKKyAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFdMKTsKKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IHdoaWxlIHN0YXRlbWVudC4KKyAgZXhwbGljaXQgV2hpbGVTdG10KEVtcHR5U2hlbGwgRW1wdHkpIDogU3RtdChXaGlsZVN0bXRDbGFzcywgRW1wdHkpIHt9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdmFyaWFibGUgZGVjbGFyZWQgaW4gdGhpcyAid2hpbGUiIHN0YXRlbWVudCwgaWYgYW55LgorICAvLy8KKyAgLy8vIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgIngiIGlzIHRoZSBjb25kaXRpb24gdmFyaWFibGUuCisgIC8vLyBcY29kZQorICAvLy8gd2hpbGUgKGludCB4ID0gcmFuZG9tKCkpIHsKKyAgLy8vICAgLy8gLi4uCisgIC8vLyB9CisgIC8vLyBcZW5kY29kZQorICBWYXJEZWNsICpnZXRDb25kaXRpb25WYXJpYWJsZSgpIGNvbnN0OworICB2b2lkIHNldENvbmRpdGlvblZhcmlhYmxlKGNvbnN0IEFTVENvbnRleHQgJkMsIFZhckRlY2wgKlYpOworCisgIC8vLyBJZiB0aGlzIFdoaWxlU3RtdCBoYXMgYSBjb25kaXRpb24gdmFyaWFibGUsIHJldHVybiB0aGUgZmF1eCBEZWNsU3RtdAorICAvLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBjcmVhdGlvbiBvZiB0aGF0IGNvbmRpdGlvbiB2YXJpYWJsZS4KKyAgY29uc3QgRGVjbFN0bXQgKmdldENvbmRpdGlvblZhcmlhYmxlRGVjbFN0bXQoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RGVjbFN0bXQqPihTdWJFeHByc1tWQVJdKTsKKyAgfQorCisgIEV4cHIgKmdldENvbmQoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PEV4cHIqPihTdWJFeHByc1tDT05EXSk7IH0KKyAgY29uc3QgRXhwciAqZ2V0Q29uZCgpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwcio+KFN1YkV4cHJzW0NPTkRdKTt9CisgIHZvaWQgc2V0Q29uZChFeHByICpFKSB7IFN1YkV4cHJzW0NPTkRdID0gcmVpbnRlcnByZXRfY2FzdDxTdG10Kj4oRSk7IH0KKyAgU3RtdCAqZ2V0Qm9keSgpIHsgcmV0dXJuIFN1YkV4cHJzW0JPRFldOyB9CisgIGNvbnN0IFN0bXQgKmdldEJvZHkoKSBjb25zdCB7IHJldHVybiBTdWJFeHByc1tCT0RZXTsgfQorICB2b2lkIHNldEJvZHkoU3RtdCAqUykgeyBTdWJFeHByc1tCT0RZXSA9IFM7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRXaGlsZUxvYygpIGNvbnN0IHsgcmV0dXJuIFdoaWxlTG9jOyB9CisgIHZvaWQgc2V0V2hpbGVMb2MoU291cmNlTG9jYXRpb24gTCkgeyBXaGlsZUxvYyA9IEw7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gV2hpbGVMb2M7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gU3ViRXhwcnNbQk9EWV0tPmdldExvY0VuZCgpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IFdoaWxlU3RtdENsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZSgmU3ViRXhwcnNbMF0sICZTdWJFeHByc1swXStFTkRfRVhQUik7CisgIH0KK307CisKKy8vLyBEb1N0bXQgLSBUaGlzIHJlcHJlc2VudHMgYSAnZG8vd2hpbGUnIHN0bXQuCitjbGFzcyBEb1N0bXQgOiBwdWJsaWMgU3RtdCB7CisgIFNvdXJjZUxvY2F0aW9uIERvTG9jOworICBlbnVtIHsgQk9EWSwgQ09ORCwgRU5EX0VYUFIgfTsKKyAgU3RtdCogU3ViRXhwcnNbRU5EX0VYUFJdOworICBTb3VyY2VMb2NhdGlvbiBXaGlsZUxvYzsKKyAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jOyAgLy8gTG9jYXRpb24gb2YgZmluYWwgJyknIGluIGRvIHN0bXQgY29uZGl0aW9uLgorCitwdWJsaWM6CisgIERvU3RtdChTdG10ICpib2R5LCBFeHByICpjb25kLCBTb3VyY2VMb2NhdGlvbiBETCwgU291cmNlTG9jYXRpb24gV0wsCisgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUCkKKyAgICA6IFN0bXQoRG9TdG10Q2xhc3MpLCBEb0xvYyhETCksIFdoaWxlTG9jKFdMKSwgUlBhcmVuTG9jKFJQKSB7CisgICAgU3ViRXhwcnNbQ09ORF0gPSByZWludGVycHJldF9jYXN0PFN0bXQqPihjb25kKTsKKyAgICBTdWJFeHByc1tCT0RZXSA9IGJvZHk7CisgIH0KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGRvLXdoaWxlIHN0YXRlbWVudC4KKyAgZXhwbGljaXQgRG9TdG10KEVtcHR5U2hlbGwgRW1wdHkpIDogU3RtdChEb1N0bXRDbGFzcywgRW1wdHkpIHt9CisKKyAgRXhwciAqZ2V0Q29uZCgpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwcio+KFN1YkV4cHJzW0NPTkRdKTsgfQorICBjb25zdCBFeHByICpnZXRDb25kKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxFeHByKj4oU3ViRXhwcnNbQ09ORF0pO30KKyAgdm9pZCBzZXRDb25kKEV4cHIgKkUpIHsgU3ViRXhwcnNbQ09ORF0gPSByZWludGVycHJldF9jYXN0PFN0bXQqPihFKTsgfQorICBTdG10ICpnZXRCb2R5KCkgeyByZXR1cm4gU3ViRXhwcnNbQk9EWV07IH0KKyAgY29uc3QgU3RtdCAqZ2V0Qm9keSgpIGNvbnN0IHsgcmV0dXJuIFN1YkV4cHJzW0JPRFldOyB9CisgIHZvaWQgc2V0Qm9keShTdG10ICpTKSB7IFN1YkV4cHJzW0JPRFldID0gUzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldERvTG9jKCkgY29uc3QgeyByZXR1cm4gRG9Mb2M7IH0KKyAgdm9pZCBzZXREb0xvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IERvTG9jID0gTDsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRXaGlsZUxvYygpIGNvbnN0IHsgcmV0dXJuIFdoaWxlTG9jOyB9CisgIHZvaWQgc2V0V2hpbGVMb2MoU291cmNlTG9jYXRpb24gTCkgeyBXaGlsZUxvYyA9IEw7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRSUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKyAgdm9pZCBzZXRSUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTCkgeyBSUGFyZW5Mb2MgPSBMOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIERvTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUlBhcmVuTG9jOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IERvU3RtdENsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZSgmU3ViRXhwcnNbMF0sICZTdWJFeHByc1swXStFTkRfRVhQUik7CisgIH0KK307CisKKy8vLyBGb3JTdG10IC0gVGhpcyByZXByZXNlbnRzIGEgJ2ZvciAoaW5pdDtjb25kO2luYyknIHN0bXQuICBOb3RlIHRoYXQgYW55IG9mCisvLy8gdGhlIGluaXQvY29uZC9pbmMgcGFydHMgb2YgdGhlIEZvclN0bXQgd2lsbCBiZSBudWxsIGlmIHRoZXkgd2VyZSBub3QKKy8vLyBzcGVjaWZpZWQgaW4gdGhlIHNvdXJjZS4KK2NsYXNzIEZvclN0bXQgOiBwdWJsaWMgU3RtdCB7CisgIFNvdXJjZUxvY2F0aW9uIEZvckxvYzsKKyAgZW51bSB7IElOSVQsIENPTkRWQVIsIENPTkQsIElOQywgQk9EWSwgRU5EX0VYUFIgfTsKKyAgU3RtdCogU3ViRXhwcnNbRU5EX0VYUFJdOyAvLyBTdWJFeHByc1tJTklUXSBpcyBhbiBleHByZXNzaW9uIG9yIGRlY2xzdG10LgorICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsIFJQYXJlbkxvYzsKKworcHVibGljOgorICBGb3JTdG10KGNvbnN0IEFTVENvbnRleHQgJkMsIFN0bXQgKkluaXQsIEV4cHIgKkNvbmQsIFZhckRlY2wgKmNvbmRWYXIsCisgICAgICAgICAgRXhwciAqSW5jLCBTdG10ICpCb2R5LCBTb3VyY2VMb2NhdGlvbiBGTCwgU291cmNlTG9jYXRpb24gTFAsCisgICAgICAgICAgU291cmNlTG9jYXRpb24gUlApOworCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgZm9yIHN0YXRlbWVudC4KKyAgZXhwbGljaXQgRm9yU3RtdChFbXB0eVNoZWxsIEVtcHR5KSA6IFN0bXQoRm9yU3RtdENsYXNzLCBFbXB0eSkge30KKworICBTdG10ICpnZXRJbml0KCkgeyByZXR1cm4gU3ViRXhwcnNbSU5JVF07IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB2YXJpYWJsZSBkZWNsYXJlZCBpbiB0aGlzICJmb3IiIHN0YXRlbWVudCwgaWYgYW55LgorICAvLy8KKyAgLy8vIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgInkiIGlzIHRoZSBjb25kaXRpb24gdmFyaWFibGUuCisgIC8vLyBcY29kZQorICAvLy8gZm9yIChpbnQgeCA9IHJhbmRvbSgpOyBpbnQgeSA9IG1hbmdsZSh4KTsgKyt4KSB7CisgIC8vLyAgIC8vIC4uLgorICAvLy8gfQorICAvLy8gXGVuZGNvZGUKKyAgVmFyRGVjbCAqZ2V0Q29uZGl0aW9uVmFyaWFibGUoKSBjb25zdDsKKyAgdm9pZCBzZXRDb25kaXRpb25WYXJpYWJsZShjb25zdCBBU1RDb250ZXh0ICZDLCBWYXJEZWNsICpWKTsKKworICAvLy8gSWYgdGhpcyBGb3JTdG10IGhhcyBhIGNvbmRpdGlvbiB2YXJpYWJsZSwgcmV0dXJuIHRoZSBmYXV4IERlY2xTdG10CisgIC8vLyBhc3NvY2lhdGVkIHdpdGggdGhlIGNyZWF0aW9uIG9mIHRoYXQgY29uZGl0aW9uIHZhcmlhYmxlLgorICBjb25zdCBEZWNsU3RtdCAqZ2V0Q29uZGl0aW9uVmFyaWFibGVEZWNsU3RtdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxEZWNsU3RtdCo+KFN1YkV4cHJzW0NPTkRWQVJdKTsKKyAgfQorCisgIEV4cHIgKmdldENvbmQoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PEV4cHIqPihTdWJFeHByc1tDT05EXSk7IH0KKyAgRXhwciAqZ2V0SW5jKCkgIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwcio+KFN1YkV4cHJzW0lOQ10pOyB9CisgIFN0bXQgKmdldEJvZHkoKSB7IHJldHVybiBTdWJFeHByc1tCT0RZXTsgfQorCisgIGNvbnN0IFN0bXQgKmdldEluaXQoKSBjb25zdCB7IHJldHVybiBTdWJFeHByc1tJTklUXTsgfQorICBjb25zdCBFeHByICpnZXRDb25kKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxFeHByKj4oU3ViRXhwcnNbQ09ORF0pO30KKyAgY29uc3QgRXhwciAqZ2V0SW5jKCkgIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwcio+KFN1YkV4cHJzW0lOQ10pOyB9CisgIGNvbnN0IFN0bXQgKmdldEJvZHkoKSBjb25zdCB7IHJldHVybiBTdWJFeHByc1tCT0RZXTsgfQorCisgIHZvaWQgc2V0SW5pdChTdG10ICpTKSB7IFN1YkV4cHJzW0lOSVRdID0gUzsgfQorICB2b2lkIHNldENvbmQoRXhwciAqRSkgeyBTdWJFeHByc1tDT05EXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCo+KEUpOyB9CisgIHZvaWQgc2V0SW5jKEV4cHIgKkUpIHsgU3ViRXhwcnNbSU5DXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCo+KEUpOyB9CisgIHZvaWQgc2V0Qm9keShTdG10ICpTKSB7IFN1YkV4cHJzW0JPRFldID0gUzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEZvckxvYygpIGNvbnN0IHsgcmV0dXJuIEZvckxvYzsgfQorICB2b2lkIHNldEZvckxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IEZvckxvYyA9IEw7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TFBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gTFBhcmVuTG9jOyB9CisgIHZvaWQgc2V0TFBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIEwpIHsgTFBhcmVuTG9jID0gTDsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRSUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKyAgdm9pZCBzZXRSUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTCkgeyBSUGFyZW5Mb2MgPSBMOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIEZvckxvYzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBTdWJFeHByc1tCT0RZXS0+Z2V0TG9jRW5kKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gRm9yU3RtdENsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZSgmU3ViRXhwcnNbMF0sICZTdWJFeHByc1swXStFTkRfRVhQUik7CisgIH0KK307CisKKy8vLyBHb3RvU3RtdCAtIFRoaXMgcmVwcmVzZW50cyBhIGRpcmVjdCBnb3RvLgorY2xhc3MgR290b1N0bXQgOiBwdWJsaWMgU3RtdCB7CisgIExhYmVsRGVjbCAqTGFiZWw7CisgIFNvdXJjZUxvY2F0aW9uIEdvdG9Mb2M7CisgIFNvdXJjZUxvY2F0aW9uIExhYmVsTG9jOworCitwdWJsaWM6CisgIEdvdG9TdG10KExhYmVsRGVjbCAqbGFiZWwsIFNvdXJjZUxvY2F0aW9uIEdMLCBTb3VyY2VMb2NhdGlvbiBMTCkKKyAgICAgIDogU3RtdChHb3RvU3RtdENsYXNzKSwgTGFiZWwobGFiZWwpLCBHb3RvTG9jKEdMKSwgTGFiZWxMb2MoTEwpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBnb3RvIHN0YXRlbWVudC4KKyAgZXhwbGljaXQgR290b1N0bXQoRW1wdHlTaGVsbCBFbXB0eSkgOiBTdG10KEdvdG9TdG10Q2xhc3MsIEVtcHR5KSB7fQorCisgIExhYmVsRGVjbCAqZ2V0TGFiZWwoKSBjb25zdCB7IHJldHVybiBMYWJlbDsgfQorICB2b2lkIHNldExhYmVsKExhYmVsRGVjbCAqRCkgeyBMYWJlbCA9IEQ7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRHb3RvTG9jKCkgY29uc3QgeyByZXR1cm4gR290b0xvYzsgfQorICB2b2lkIHNldEdvdG9Mb2MoU291cmNlTG9jYXRpb24gTCkgeyBHb3RvTG9jID0gTDsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMYWJlbExvYygpIGNvbnN0IHsgcmV0dXJuIExhYmVsTG9jOyB9CisgIHZvaWQgc2V0TGFiZWxMb2MoU291cmNlTG9jYXRpb24gTCkgeyBMYWJlbExvYyA9IEw7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gR290b0xvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIExhYmVsTG9jOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IEdvdG9TdG10Q2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9Cit9OworCisvLy8gSW5kaXJlY3RHb3RvU3RtdCAtIFRoaXMgcmVwcmVzZW50cyBhbiBpbmRpcmVjdCBnb3RvLgorY2xhc3MgSW5kaXJlY3RHb3RvU3RtdCA6IHB1YmxpYyBTdG10IHsKKyAgU291cmNlTG9jYXRpb24gR290b0xvYzsKKyAgU291cmNlTG9jYXRpb24gU3RhckxvYzsKKyAgU3RtdCAqVGFyZ2V0OworCitwdWJsaWM6CisgIEluZGlyZWN0R290b1N0bXQoU291cmNlTG9jYXRpb24gZ290b0xvYywgU291cmNlTG9jYXRpb24gc3RhckxvYywKKyAgICAgICAgICAgICAgICAgICBFeHByICp0YXJnZXQpCisgICAgOiBTdG10KEluZGlyZWN0R290b1N0bXRDbGFzcyksIEdvdG9Mb2MoZ290b0xvYyksIFN0YXJMb2Moc3RhckxvYyksCisgICAgICBUYXJnZXQoKFN0bXQqKXRhcmdldCkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGluZGlyZWN0IGdvdG8gc3RhdGVtZW50LgorICBleHBsaWNpdCBJbmRpcmVjdEdvdG9TdG10KEVtcHR5U2hlbGwgRW1wdHkpCisgICAgICA6IFN0bXQoSW5kaXJlY3RHb3RvU3RtdENsYXNzLCBFbXB0eSkge30KKworICB2b2lkIHNldEdvdG9Mb2MoU291cmNlTG9jYXRpb24gTCkgeyBHb3RvTG9jID0gTDsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRHb3RvTG9jKCkgY29uc3QgeyByZXR1cm4gR290b0xvYzsgfQorICB2b2lkIHNldFN0YXJMb2MoU291cmNlTG9jYXRpb24gTCkgeyBTdGFyTG9jID0gTDsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRTdGFyTG9jKCkgY29uc3QgeyByZXR1cm4gU3RhckxvYzsgfQorCisgIEV4cHIgKmdldFRhcmdldCgpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwcio+KFRhcmdldCk7IH0KKyAgY29uc3QgRXhwciAqZ2V0VGFyZ2V0KCkgY29uc3Qge3JldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEV4cHIqPihUYXJnZXQpO30KKyAgdm9pZCBzZXRUYXJnZXQoRXhwciAqRSkgeyBUYXJnZXQgPSByZWludGVycHJldF9jYXN0PFN0bXQqPihFKTsgfQorCisgIC8vLyBnZXRDb25zdGFudFRhcmdldCAtIFJldHVybnMgdGhlIGZpeGVkIHRhcmdldCBvZiB0aGlzIGluZGlyZWN0CisgIC8vLyBnb3RvLCBpZiBvbmUgZXhpc3RzLgorICBMYWJlbERlY2wgKmdldENvbnN0YW50VGFyZ2V0KCk7CisgIGNvbnN0IExhYmVsRGVjbCAqZ2V0Q29uc3RhbnRUYXJnZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8SW5kaXJlY3RHb3RvU3RtdCo+KHRoaXMpLT5nZXRDb25zdGFudFRhcmdldCgpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIEdvdG9Mb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBUYXJnZXQtPmdldExvY0VuZCgpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IEluZGlyZWN0R290b1N0bXRDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsgcmV0dXJuIGNoaWxkX3JhbmdlKCZUYXJnZXQsICZUYXJnZXQrMSk7IH0KK307CisKKy8vLyBDb250aW51ZVN0bXQgLSBUaGlzIHJlcHJlc2VudHMgYSBjb250aW51ZS4KK2NsYXNzIENvbnRpbnVlU3RtdCA6IHB1YmxpYyBTdG10IHsKKyAgU291cmNlTG9jYXRpb24gQ29udGludWVMb2M7CisKK3B1YmxpYzoKKyAgQ29udGludWVTdG10KFNvdXJjZUxvY2F0aW9uIENMKSA6IFN0bXQoQ29udGludWVTdG10Q2xhc3MpLCBDb250aW51ZUxvYyhDTCkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNvbnRpbnVlIHN0YXRlbWVudC4KKyAgZXhwbGljaXQgQ29udGludWVTdG10KEVtcHR5U2hlbGwgRW1wdHkpIDogU3RtdChDb250aW51ZVN0bXRDbGFzcywgRW1wdHkpIHt9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0Q29udGludWVMb2MoKSBjb25zdCB7IHJldHVybiBDb250aW51ZUxvYzsgfQorICB2b2lkIHNldENvbnRpbnVlTG9jKFNvdXJjZUxvY2F0aW9uIEwpIHsgQ29udGludWVMb2MgPSBMOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIENvbnRpbnVlTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gQ29udGludWVMb2M7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ29udGludWVTdG10Q2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICB9Cit9OworCisvLy8gQnJlYWtTdG10IC0gVGhpcyByZXByZXNlbnRzIGEgYnJlYWsuCitjbGFzcyBCcmVha1N0bXQgOiBwdWJsaWMgU3RtdCB7CisgIFNvdXJjZUxvY2F0aW9uIEJyZWFrTG9jOworCitwdWJsaWM6CisgIEJyZWFrU3RtdChTb3VyY2VMb2NhdGlvbiBCTCkgOiBTdG10KEJyZWFrU3RtdENsYXNzKSwgQnJlYWtMb2MoQkwpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihCcmVha1N0bXQpID09IDIgKiBzaXplb2YoU291cmNlTG9jYXRpb24pLAorICAgICAgICAgICAgICAgICAgIkJyZWFrU3RtdCB0b28gbGFyZ2UiKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgYnJlYWsgc3RhdGVtZW50LgorICBleHBsaWNpdCBCcmVha1N0bXQoRW1wdHlTaGVsbCBFbXB0eSkgOiBTdG10KEJyZWFrU3RtdENsYXNzLCBFbXB0eSkge30KKworICBTb3VyY2VMb2NhdGlvbiBnZXRCcmVha0xvYygpIGNvbnN0IHsgcmV0dXJuIEJyZWFrTG9jOyB9CisgIHZvaWQgc2V0QnJlYWtMb2MoU291cmNlTG9jYXRpb24gTCkgeyBCcmVha0xvYyA9IEw7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gQnJlYWtMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBCcmVha0xvYzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBCcmVha1N0bXRDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoY2hpbGRfaXRlcmF0b3IoKSwgY2hpbGRfaXRlcmF0b3IoKSk7CisgIH0KK307CisKKy8vLyBSZXR1cm5TdG10IC0gVGhpcyByZXByZXNlbnRzIGEgcmV0dXJuLCBvcHRpb25hbGx5IG9mIGFuIGV4cHJlc3Npb246CisvLy8gICByZXR1cm47CisvLy8gICByZXR1cm4gNDsKKy8vLworLy8vIE5vdGUgdGhhdCBHQ0MgYWxsb3dzIHJldHVybiB3aXRoIG5vIGFyZ3VtZW50IGluIGEgZnVuY3Rpb24gZGVjbGFyZWQgdG8KKy8vLyByZXR1cm4gYSB2YWx1ZSwgYW5kIGl0IGFsbG93cyByZXR1cm5pbmcgYSB2YWx1ZSBpbiBmdW5jdGlvbnMgZGVjbGFyZWQgdG8KKy8vLyByZXR1cm4gdm9pZC4gIFdlIGV4cGxpY2l0bHkgbW9kZWwgdGhpcyBpbiB0aGUgQVNULCB3aGljaCBtZWFucyB5b3UgY2FuJ3QKKy8vLyBkZXBlbmQgb24gdGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbiBhbmQgdGhlIHByZXNlbmNlIG9mIGFuIGFyZ3VtZW50LgorY2xhc3MgUmV0dXJuU3RtdCA6IHB1YmxpYyBTdG10IHsKKyAgU291cmNlTG9jYXRpb24gUmV0TG9jOworICBTdG10ICpSZXRFeHByOworICBjb25zdCBWYXJEZWNsICpOUlZPQ2FuZGlkYXRlOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFJldHVyblN0bXQoU291cmNlTG9jYXRpb24gUkwpIDogUmV0dXJuU3RtdChSTCwgbnVsbHB0ciwgbnVsbHB0cikge30KKworICBSZXR1cm5TdG10KFNvdXJjZUxvY2F0aW9uIFJMLCBFeHByICpFLCBjb25zdCBWYXJEZWNsICpOUlZPQ2FuZGlkYXRlKQorICAgICAgOiBTdG10KFJldHVyblN0bXRDbGFzcyksIFJldExvYyhSTCksIFJldEV4cHIoKFN0bXQgKilFKSwKKyAgICAgICAgTlJWT0NhbmRpZGF0ZShOUlZPQ2FuZGlkYXRlKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgcmV0dXJuIGV4cHJlc3Npb24uCisgIGV4cGxpY2l0IFJldHVyblN0bXQoRW1wdHlTaGVsbCBFbXB0eSkgOiBTdG10KFJldHVyblN0bXRDbGFzcywgRW1wdHkpIHt9CisKKyAgY29uc3QgRXhwciAqZ2V0UmV0VmFsdWUoKSBjb25zdDsKKyAgRXhwciAqZ2V0UmV0VmFsdWUoKTsKKyAgdm9pZCBzZXRSZXRWYWx1ZShFeHByICpFKSB7IFJldEV4cHIgPSByZWludGVycHJldF9jYXN0PFN0bXQqPihFKTsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFJldHVybkxvYygpIGNvbnN0IHsgcmV0dXJuIFJldExvYzsgfQorICB2b2lkIHNldFJldHVybkxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IFJldExvYyA9IEw7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB2YXJpYWJsZSB0aGF0IG1pZ2h0IGJlIHVzZWQgZm9yIHRoZSBuYW1lZCByZXR1cm4KKyAgLy8vIHZhbHVlIG9wdGltaXphdGlvbi4KKyAgLy8vCisgIC8vLyBUaGUgb3B0aW1pemF0aW9uIGl0c2VsZiBjYW4gb25seSBiZSBwZXJmb3JtZWQgaWYgdGhlIHZhcmlhYmxlIGlzCisgIC8vLyBhbHNvIG1hcmtlZCBhcyBhbiBOUlZPIG9iamVjdC4KKyAgY29uc3QgVmFyRGVjbCAqZ2V0TlJWT0NhbmRpZGF0ZSgpIGNvbnN0IHsgcmV0dXJuIE5SVk9DYW5kaWRhdGU7IH0KKyAgdm9pZCBzZXROUlZPQ2FuZGlkYXRlKGNvbnN0IFZhckRlY2wgKlZhcikgeyBOUlZPQ2FuZGlkYXRlID0gVmFyOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJldExvYzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBSZXRFeHByID8gUmV0RXhwci0+Z2V0TG9jRW5kKCkgOiBSZXRMb2M7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gUmV0dXJuU3RtdENsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIGlmIChSZXRFeHByKSByZXR1cm4gY2hpbGRfcmFuZ2UoJlJldEV4cHIsICZSZXRFeHByKzEpOworICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorfTsKKworLy8vIEFzbVN0bXQgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIEdDQ0FzbVN0bXQgYW5kIE1TQXNtU3RtdC4KK2NsYXNzIEFzbVN0bXQgOiBwdWJsaWMgU3RtdCB7Citwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIFNvdXJjZUxvY2F0aW9uIEFzbUxvYzsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhlIGFzc2VtYmx5IHN0YXRlbWVudCBkb2VzIG5vdCBoYXZlIGFueSBpbnB1dCBvciBvdXRwdXQKKyAgLy8vIG9wZXJhbmRzLgorICBib29sIElzU2ltcGxlOworCisgIC8vLyBcYnJpZWYgSWYgdHJ1ZSwgdHJlYXQgdGhpcyBpbmxpbmUgYXNzZW1ibHkgYXMgaGF2aW5nIHNpZGUgZWZmZWN0cy4KKyAgLy8vIFRoaXMgYXNzZW1ibHkgc3RhdGVtZW50IHNob3VsZCBub3QgYmUgb3B0aW1pemVkLCBkZWxldGVkIG9yIG1vdmVkLgorICBib29sIElzVm9sYXRpbGU7CisKKyAgdW5zaWduZWQgTnVtT3V0cHV0czsKKyAgdW5zaWduZWQgTnVtSW5wdXRzOworICB1bnNpZ25lZCBOdW1DbG9iYmVyczsKKworICBTdG10ICoqRXhwcnMgPSBudWxscHRyOworCisgIEFzbVN0bXQoU3RtdENsYXNzIFNDLCBTb3VyY2VMb2NhdGlvbiBhc21sb2MsIGJvb2wgaXNzaW1wbGUsIGJvb2wgaXN2b2xhdGlsZSwKKyAgICAgICAgICB1bnNpZ25lZCBudW1vdXRwdXRzLCB1bnNpZ25lZCBudW1pbnB1dHMsIHVuc2lnbmVkIG51bWNsb2JiZXJzKQorICAgICAgOiBTdG10IChTQyksIEFzbUxvYyhhc21sb2MpLCBJc1NpbXBsZShpc3NpbXBsZSksIElzVm9sYXRpbGUoaXN2b2xhdGlsZSksCisgICAgICAgIE51bU91dHB1dHMobnVtb3V0cHV0cyksIE51bUlucHV0cyhudW1pbnB1dHMpLAorICAgICAgICBOdW1DbG9iYmVycyhudW1jbG9iYmVycykge30KKworcHVibGljOgorICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGlubGluZS1hc3NlbWJseSBzdGF0ZW1lbnQuCisgIGV4cGxpY2l0IEFzbVN0bXQoU3RtdENsYXNzIFNDLCBFbXB0eVNoZWxsIEVtcHR5KSA6IFN0bXQoU0MsIEVtcHR5KSB7fQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEFzbUxvYygpIGNvbnN0IHsgcmV0dXJuIEFzbUxvYzsgfQorICB2b2lkIHNldEFzbUxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IEFzbUxvYyA9IEw7IH0KKworICBib29sIGlzU2ltcGxlKCkgY29uc3QgeyByZXR1cm4gSXNTaW1wbGU7IH0KKyAgdm9pZCBzZXRTaW1wbGUoYm9vbCBWKSB7IElzU2ltcGxlID0gVjsgfQorCisgIGJvb2wgaXNWb2xhdGlsZSgpIGNvbnN0IHsgcmV0dXJuIElzVm9sYXRpbGU7IH0KKyAgdm9pZCBzZXRWb2xhdGlsZShib29sIFYpIHsgSXNWb2xhdGlsZSA9IFY7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gU291cmNlTG9jYXRpb24oKTsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFNvdXJjZUxvY2F0aW9uKCk7IH0KKworICAvLz09PS0tLSBBc20gU3RyaW5nIEFuYWx5c2lzIC0tLT09PS8vCisKKyAgLy8vIEFzc2VtYmxlIGZpbmFsIElSIGFzbSBzdHJpbmcuCisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlQXNtU3RyaW5nKGNvbnN0IEFTVENvbnRleHQgJkMpIGNvbnN0OworCisgIC8vPT09LS0tIE91dHB1dCBvcGVyYW5kcyAtLS09PT0vLworCisgIHVuc2lnbmVkIGdldE51bU91dHB1dHMoKSBjb25zdCB7IHJldHVybiBOdW1PdXRwdXRzOyB9CisKKyAgLy8vIGdldE91dHB1dENvbnN0cmFpbnQgLSBSZXR1cm4gdGhlIGNvbnN0cmFpbnQgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkCisgIC8vLyBvdXRwdXQgb3BlcmFuZC4gIEFsbCBvdXRwdXQgY29uc3RyYWludHMgYXJlIGtub3duIHRvIGJlIG5vbi1lbXB0eSAoZWl0aGVyCisgIC8vLyAnPScgb3IgJysnKS4KKyAgU3RyaW5nUmVmIGdldE91dHB1dENvbnN0cmFpbnQodW5zaWduZWQgaSkgY29uc3Q7CisKKyAgLy8vIGlzT3V0cHV0UGx1c0NvbnN0cmFpbnQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG91dHB1dCBjb25zdHJhaW50CisgIC8vLyBpcyBhICIrIiBjb25zdHJhaW50ICh3aGljaCBpcyBib3RoIGFuIGlucHV0IGFuZCBhbiBvdXRwdXQpIG9yIGZhbHNlIGlmIGl0CisgIC8vLyBpcyBhbiAiPSIgY29uc3RyYWludCAoanVzdCBhbiBvdXRwdXQpLgorICBib29sIGlzT3V0cHV0UGx1c0NvbnN0cmFpbnQodW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBnZXRPdXRwdXRDb25zdHJhaW50KGkpWzBdID09ICcrJzsKKyAgfQorCisgIGNvbnN0IEV4cHIgKmdldE91dHB1dEV4cHIodW5zaWduZWQgaSkgY29uc3Q7CisKKyAgLy8vIGdldE51bVBsdXNPcGVyYW5kcyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIG91dHB1dCBvcGVyYW5kcyB0aGF0IGhhdmUgYSAiKyIKKyAgLy8vIGNvbnN0cmFpbnQuCisgIHVuc2lnbmVkIGdldE51bVBsdXNPcGVyYW5kcygpIGNvbnN0OworCisgIC8vPT09LS0tIElucHV0IG9wZXJhbmRzIC0tLT09PS8vCisKKyAgdW5zaWduZWQgZ2V0TnVtSW5wdXRzKCkgY29uc3QgeyByZXR1cm4gTnVtSW5wdXRzOyB9CisKKyAgLy8vIGdldElucHV0Q29uc3RyYWludCAtIFJldHVybiB0aGUgc3BlY2lmaWVkIGlucHV0IGNvbnN0cmFpbnQuICBVbmxpa2Ugb3V0cHV0CisgIC8vLyBjb25zdHJhaW50cywgdGhlc2UgY2FuIGJlIGVtcHR5LgorICBTdHJpbmdSZWYgZ2V0SW5wdXRDb25zdHJhaW50KHVuc2lnbmVkIGkpIGNvbnN0OworICAKKyAgY29uc3QgRXhwciAqZ2V0SW5wdXRFeHByKHVuc2lnbmVkIGkpIGNvbnN0OworCisgIC8vPT09LS0tIE90aGVyIC0tLT09PS8vCisKKyAgdW5zaWduZWQgZ2V0TnVtQ2xvYmJlcnMoKSBjb25zdCB7IHJldHVybiBOdW1DbG9iYmVyczsgfQorICBTdHJpbmdSZWYgZ2V0Q2xvYmJlcih1bnNpZ25lZCBpKSBjb25zdDsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gR0NDQXNtU3RtdENsYXNzIHx8CisgICAgICBULT5nZXRTdG10Q2xhc3MoKSA9PSBNU0FzbVN0bXRDbGFzczsKKyAgfQorCisgIC8vIElucHV0IGV4cHIgaXRlcmF0b3JzLgorCisgIHVzaW5nIGlucHV0c19pdGVyYXRvciA9IEV4cHJJdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaW5wdXRzX2l0ZXJhdG9yID0gQ29uc3RFeHBySXRlcmF0b3I7CisgIHVzaW5nIGlucHV0c19yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGlucHV0c19pdGVyYXRvcj47CisgIHVzaW5nIGlucHV0c19jb25zdF9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGNvbnN0X2lucHV0c19pdGVyYXRvcj47CisKKyAgaW5wdXRzX2l0ZXJhdG9yIGJlZ2luX2lucHV0cygpIHsKKyAgICByZXR1cm4gJkV4cHJzWzBdICsgTnVtT3V0cHV0czsKKyAgfQorCisgIGlucHV0c19pdGVyYXRvciBlbmRfaW5wdXRzKCkgeworICAgIHJldHVybiAmRXhwcnNbMF0gKyBOdW1PdXRwdXRzICsgTnVtSW5wdXRzOworICB9CisKKyAgaW5wdXRzX3JhbmdlIGlucHV0cygpIHsgcmV0dXJuIGlucHV0c19yYW5nZShiZWdpbl9pbnB1dHMoKSwgZW5kX2lucHV0cygpKTsgfQorCisgIGNvbnN0X2lucHV0c19pdGVyYXRvciBiZWdpbl9pbnB1dHMoKSBjb25zdCB7CisgICAgcmV0dXJuICZFeHByc1swXSArIE51bU91dHB1dHM7CisgIH0KKworICBjb25zdF9pbnB1dHNfaXRlcmF0b3IgZW5kX2lucHV0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gJkV4cHJzWzBdICsgTnVtT3V0cHV0cyArIE51bUlucHV0czsKKyAgfQorCisgIGlucHV0c19jb25zdF9yYW5nZSBpbnB1dHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGlucHV0c19jb25zdF9yYW5nZShiZWdpbl9pbnB1dHMoKSwgZW5kX2lucHV0cygpKTsKKyAgfQorCisgIC8vIE91dHB1dCBleHByIGl0ZXJhdG9ycy4KKworICB1c2luZyBvdXRwdXRzX2l0ZXJhdG9yID0gRXhwckl0ZXJhdG9yOworICB1c2luZyBjb25zdF9vdXRwdXRzX2l0ZXJhdG9yID0gQ29uc3RFeHBySXRlcmF0b3I7CisgIHVzaW5nIG91dHB1dHNfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxvdXRwdXRzX2l0ZXJhdG9yPjsKKyAgdXNpbmcgb3V0cHV0c19jb25zdF9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGNvbnN0X291dHB1dHNfaXRlcmF0b3I+OworCisgIG91dHB1dHNfaXRlcmF0b3IgYmVnaW5fb3V0cHV0cygpIHsKKyAgICByZXR1cm4gJkV4cHJzWzBdOworICB9CisKKyAgb3V0cHV0c19pdGVyYXRvciBlbmRfb3V0cHV0cygpIHsKKyAgICByZXR1cm4gJkV4cHJzWzBdICsgTnVtT3V0cHV0czsKKyAgfQorCisgIG91dHB1dHNfcmFuZ2Ugb3V0cHV0cygpIHsKKyAgICByZXR1cm4gb3V0cHV0c19yYW5nZShiZWdpbl9vdXRwdXRzKCksIGVuZF9vdXRwdXRzKCkpOworICB9CisKKyAgY29uc3Rfb3V0cHV0c19pdGVyYXRvciBiZWdpbl9vdXRwdXRzKCkgY29uc3QgeworICAgIHJldHVybiAmRXhwcnNbMF07CisgIH0KKworICBjb25zdF9vdXRwdXRzX2l0ZXJhdG9yIGVuZF9vdXRwdXRzKCkgY29uc3QgeworICAgIHJldHVybiAmRXhwcnNbMF0gKyBOdW1PdXRwdXRzOworICB9CisKKyAgb3V0cHV0c19jb25zdF9yYW5nZSBvdXRwdXRzKCkgY29uc3QgeworICAgIHJldHVybiBvdXRwdXRzX2NvbnN0X3JhbmdlKGJlZ2luX291dHB1dHMoKSwgZW5kX291dHB1dHMoKSk7CisgIH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoJkV4cHJzWzBdLCAmRXhwcnNbMF0gKyBOdW1PdXRwdXRzICsgTnVtSW5wdXRzKTsKKyAgfQorfTsKKworLy8vIFRoaXMgcmVwcmVzZW50cyBhIEdDQyBpbmxpbmUtYXNzZW1ibHkgc3RhdGVtZW50IGV4dGVuc2lvbi4KK2NsYXNzIEdDQ0FzbVN0bXQgOiBwdWJsaWMgQXNtU3RtdCB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYzsKKyAgU3RyaW5nTGl0ZXJhbCAqQXNtU3RyOworCisgIC8vIEZJWE1FOiBJZiB3ZSB3YW50ZWQgdG8sIHdlIGNvdWxkIGFsbG9jYXRlIGFsbCBvZiB0aGVzZSBpbiBvbmUgYmlnIGFycmF5LgorICBTdHJpbmdMaXRlcmFsICoqQ29uc3RyYWludHMgPSBudWxscHRyOworICBTdHJpbmdMaXRlcmFsICoqQ2xvYmJlcnMgPSBudWxscHRyOworICBJZGVudGlmaWVySW5mbyAqKk5hbWVzID0gbnVsbHB0cjsKKworcHVibGljOgorICBHQ0NBc21TdG10KGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIGFzbWxvYywgYm9vbCBpc3NpbXBsZSwKKyAgICAgICAgICAgICBib29sIGlzdm9sYXRpbGUsIHVuc2lnbmVkIG51bW91dHB1dHMsIHVuc2lnbmVkIG51bWlucHV0cywKKyAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqKm5hbWVzLCBTdHJpbmdMaXRlcmFsICoqY29uc3RyYWludHMsIEV4cHIgKipleHBycywKKyAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsICphc21zdHIsIHVuc2lnbmVkIG51bWNsb2JiZXJzLAorICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgKipjbG9iYmVycywgU291cmNlTG9jYXRpb24gcnBhcmVubG9jKTsKKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGlubGluZS1hc3NlbWJseSBzdGF0ZW1lbnQuCisgIGV4cGxpY2l0IEdDQ0FzbVN0bXQoRW1wdHlTaGVsbCBFbXB0eSkgOiBBc21TdG10KEdDQ0FzbVN0bXRDbGFzcywgRW1wdHkpIHt9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0UlBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gUlBhcmVuTG9jOyB9CisgIHZvaWQgc2V0UlBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIEwpIHsgUlBhcmVuTG9jID0gTDsgfQorCisgIC8vPT09LS0tIEFzbSBTdHJpbmcgQW5hbHlzaXMgLS0tPT09Ly8KKworICBjb25zdCBTdHJpbmdMaXRlcmFsICpnZXRBc21TdHJpbmcoKSBjb25zdCB7IHJldHVybiBBc21TdHI7IH0KKyAgU3RyaW5nTGl0ZXJhbCAqZ2V0QXNtU3RyaW5nKCkgeyByZXR1cm4gQXNtU3RyOyB9CisgIHZvaWQgc2V0QXNtU3RyaW5nKFN0cmluZ0xpdGVyYWwgKkUpIHsgQXNtU3RyID0gRTsgfQorCisgIC8vLyBBc21TdHJpbmdQaWVjZSAtIHRoaXMgaXMgcGFydCBvZiBhIGRlY29tcG9zZWQgYXNtIHN0cmluZyBzcGVjaWZpY2F0aW9uCisgIC8vLyAoZm9yIHVzZSB3aXRoIHRoZSBBbmFseXplQXNtU3RyaW5nIGZ1bmN0aW9uIGJlbG93KS4gIEFuIGFzbSBzdHJpbmcgaXMKKyAgLy8vIGNvbnNpZGVyZWQgdG8gYmUgYSBjb25jYXRlbmF0aW9uIG9mIHRoZXNlIHBhcnRzLgorICBjbGFzcyBBc21TdHJpbmdQaWVjZSB7CisgIHB1YmxpYzoKKyAgICBlbnVtIEtpbmQgeworICAgICAgU3RyaW5nLCAgLy8gU3RyaW5nIGluIC5sbCBhc20gc3RyaW5nIGZvcm0sICIkIiAtPiAiJCQiIGFuZCAiJSUiIC0+ICIlIi4KKyAgICAgIE9wZXJhbmQgIC8vIE9wZXJhbmQgcmVmZXJlbmNlLCB3aXRoIG9wdGlvbmFsIG1vZGlmaWVyICVjNC4KKyAgICB9OworCisgIHByaXZhdGU6CisgICAgS2luZCBNeUtpbmQ7CisgICAgc3RkOjpzdHJpbmcgU3RyOworICAgIHVuc2lnbmVkIE9wZXJhbmRObzsKKworICAgIC8vIFNvdXJjZSByYW5nZSBmb3Igb3BlcmFuZCByZWZlcmVuY2VzLgorICAgIENoYXJTb3VyY2VSYW5nZSBSYW5nZTsKKworICBwdWJsaWM6CisgICAgQXNtU3RyaW5nUGllY2UoY29uc3Qgc3RkOjpzdHJpbmcgJlMpIDogTXlLaW5kKFN0cmluZyksIFN0cihTKSB7fQorICAgIEFzbVN0cmluZ1BpZWNlKHVuc2lnbmVkIE9wTm8sIGNvbnN0IHN0ZDo6c3RyaW5nICZTLCBTb3VyY2VMb2NhdGlvbiBCZWdpbiwKKyAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmQpCisgICAgICAgIDogTXlLaW5kKE9wZXJhbmQpLCBTdHIoUyksIE9wZXJhbmRObyhPcE5vKSwKKyAgICAgICAgICBSYW5nZShDaGFyU291cmNlUmFuZ2U6OmdldENoYXJSYW5nZShCZWdpbiwgRW5kKSkge30KKworICAgIGJvb2wgaXNTdHJpbmcoKSBjb25zdCB7IHJldHVybiBNeUtpbmQgPT0gU3RyaW5nOyB9CisgICAgYm9vbCBpc09wZXJhbmQoKSBjb25zdCB7IHJldHVybiBNeUtpbmQgPT0gT3BlcmFuZDsgfQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldFN0cmluZygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTdHI7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0T3BlcmFuZE5vKCkgY29uc3QgeworICAgICAgYXNzZXJ0KGlzT3BlcmFuZCgpKTsKKyAgICAgIHJldHVybiBPcGVyYW5kTm87CisgICAgfQorCisgICAgQ2hhclNvdXJjZVJhbmdlIGdldFJhbmdlKCkgY29uc3QgeworICAgICAgYXNzZXJ0KGlzT3BlcmFuZCgpICYmICJSYW5nZSBpcyBjdXJyZW50bHkgdXNlZCBvbmx5IGZvciBPcGVyYW5kcy4iKTsKKyAgICAgIHJldHVybiBSYW5nZTsKKyAgICB9CisKKyAgICAvLy8gZ2V0TW9kaWZpZXIgLSBHZXQgdGhlIG1vZGlmaWVyIGZvciB0aGlzIG9wZXJhbmQsIGlmIHByZXNlbnQuICBUaGlzCisgICAgLy8vIHJldHVybnMgJ1wwJyBpZiB0aGVyZSB3YXMgbm8gbW9kaWZpZXIuCisgICAgY2hhciBnZXRNb2RpZmllcigpIGNvbnN0OworICB9OworCisgIC8vLyBBbmFseXplQXNtU3RyaW5nIC0gQW5hbHl6ZSB0aGUgYXNtIHN0cmluZyBvZiB0aGUgY3VycmVudCBhc20sIGRlY29tcG9zaW5nCisgIC8vLyBpdCBpbnRvIHBpZWNlcy4gIElmIHRoZSBhc20gc3RyaW5nIGlzIGVycm9uZW91cywgZW1pdCBlcnJvcnMgYW5kIHJldHVybgorICAvLy8gdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4gIFRoaXMgaGFuZGxlcyBjYW5vbmljYWxpemF0aW9uIGFuZAorICAvLy8gdHJhbnNsYXRpb24gb2Ygc3RyaW5ncyBmcm9tIEdDQyBzeW50YXggdG8gTExWTSBJUiBzeW50YXgsIGFuZCBoYW5kbGVzCisgIC8vLy8gZmxhdHRlbmluZyBvZiBuYW1lZCByZWZlcmVuY2VzIGxpa2UgJVtmb29dIHRvIE9wZXJhbmQgQXNtU3RyaW5nUGllY2Uncy4KKyAgdW5zaWduZWQgQW5hbHl6ZUFzbVN0cmluZyhTbWFsbFZlY3RvckltcGw8QXNtU3RyaW5nUGllY2U+ICZQaWVjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVNUQ29udGV4dCAmQywgdW5zaWduZWQgJkRpYWdPZmZzKSBjb25zdDsKKworICAvLy8gQXNzZW1ibGUgZmluYWwgSVIgYXNtIHN0cmluZy4KKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVBc21TdHJpbmcoY29uc3QgQVNUQ29udGV4dCAmQykgY29uc3Q7CisKKyAgLy89PT0tLS0gT3V0cHV0IG9wZXJhbmRzIC0tLT09PS8vCisKKyAgSWRlbnRpZmllckluZm8gKmdldE91dHB1dElkZW50aWZpZXIodW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBOYW1lc1tpXTsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRPdXRwdXROYW1lKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBpZiAoSWRlbnRpZmllckluZm8gKklJID0gZ2V0T3V0cHV0SWRlbnRpZmllcihpKSkKKyAgICAgIHJldHVybiBJSS0+Z2V0TmFtZSgpOworCisgICAgcmV0dXJuIFN0cmluZ1JlZigpOworICB9CisKKyAgU3RyaW5nUmVmIGdldE91dHB1dENvbnN0cmFpbnQodW5zaWduZWQgaSkgY29uc3Q7CisKKyAgY29uc3QgU3RyaW5nTGl0ZXJhbCAqZ2V0T3V0cHV0Q29uc3RyYWludExpdGVyYWwodW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBDb25zdHJhaW50c1tpXTsKKyAgfQorICBTdHJpbmdMaXRlcmFsICpnZXRPdXRwdXRDb25zdHJhaW50TGl0ZXJhbCh1bnNpZ25lZCBpKSB7CisgICAgcmV0dXJuIENvbnN0cmFpbnRzW2ldOworICB9CisKKyAgRXhwciAqZ2V0T3V0cHV0RXhwcih1bnNpZ25lZCBpKTsKKworICBjb25zdCBFeHByICpnZXRPdXRwdXRFeHByKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxHQ0NBc21TdG10Kj4odGhpcyktPmdldE91dHB1dEV4cHIoaSk7CisgIH0KKworICAvLz09PS0tLSBJbnB1dCBvcGVyYW5kcyAtLS09PT0vLworCisgIElkZW50aWZpZXJJbmZvICpnZXRJbnB1dElkZW50aWZpZXIodW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBOYW1lc1tpICsgTnVtT3V0cHV0c107CisgIH0KKworICBTdHJpbmdSZWYgZ2V0SW5wdXROYW1lKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBpZiAoSWRlbnRpZmllckluZm8gKklJID0gZ2V0SW5wdXRJZGVudGlmaWVyKGkpKQorICAgICAgcmV0dXJuIElJLT5nZXROYW1lKCk7CisKKyAgICByZXR1cm4gU3RyaW5nUmVmKCk7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0SW5wdXRDb25zdHJhaW50KHVuc2lnbmVkIGkpIGNvbnN0OworCisgIGNvbnN0IFN0cmluZ0xpdGVyYWwgKmdldElucHV0Q29uc3RyYWludExpdGVyYWwodW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBDb25zdHJhaW50c1tpICsgTnVtT3V0cHV0c107CisgIH0KKyAgU3RyaW5nTGl0ZXJhbCAqZ2V0SW5wdXRDb25zdHJhaW50TGl0ZXJhbCh1bnNpZ25lZCBpKSB7CisgICAgcmV0dXJuIENvbnN0cmFpbnRzW2kgKyBOdW1PdXRwdXRzXTsKKyAgfQorCisgIEV4cHIgKmdldElucHV0RXhwcih1bnNpZ25lZCBpKTsKKyAgdm9pZCBzZXRJbnB1dEV4cHIodW5zaWduZWQgaSwgRXhwciAqRSk7CisKKyAgY29uc3QgRXhwciAqZ2V0SW5wdXRFeHByKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxHQ0NBc21TdG10Kj4odGhpcyktPmdldElucHV0RXhwcihpKTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIHNldE91dHB1dHNBbmRJbnB1dHNBbmRDbG9iYmVycyhjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqKk5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsICoqQ29uc3RyYWludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKipFeHBycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtT3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsICoqQ2xvYmJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsb2JiZXJzKTsKKworcHVibGljOgorICAvLz09PS0tLSBPdGhlciAtLS09PT0vLworCisgIC8vLyBnZXROYW1lZE9wZXJhbmQgLSBHaXZlbiBhIHN5bWJvbGljIG9wZXJhbmQgcmVmZXJlbmNlIGxpa2UgJVtmb29dLAorICAvLy8gdHJhbnNsYXRlIHRoaXMgaW50byBhIG51bWVyaWMgdmFsdWUgbmVlZGVkIHRvIHJlZmVyZW5jZSB0aGUgc2FtZSBvcGVyYW5kLgorICAvLy8gVGhpcyByZXR1cm5zIC0xIGlmIHRoZSBvcGVyYW5kIG5hbWUgaXMgaW52YWxpZC4KKyAgaW50IGdldE5hbWVkT3BlcmFuZChTdHJpbmdSZWYgU3ltYm9saWNOYW1lKSBjb25zdDsKKworICBTdHJpbmdSZWYgZ2V0Q2xvYmJlcih1bnNpZ25lZCBpKSBjb25zdDsKKworICBTdHJpbmdMaXRlcmFsICpnZXRDbG9iYmVyU3RyaW5nTGl0ZXJhbCh1bnNpZ25lZCBpKSB7IHJldHVybiBDbG9iYmVyc1tpXTsgfQorICBjb25zdCBTdHJpbmdMaXRlcmFsICpnZXRDbG9iYmVyU3RyaW5nTGl0ZXJhbCh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgcmV0dXJuIENsb2JiZXJzW2ldOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIEFzbUxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJQYXJlbkxvYzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBHQ0NBc21TdG10Q2xhc3M7CisgIH0KK307CisKKy8vLyBUaGlzIHJlcHJlc2VudHMgYSBNaWNyb3NvZnQgaW5saW5lLWFzc2VtYmx5IHN0YXRlbWVudCBleHRlbnNpb24uCitjbGFzcyBNU0FzbVN0bXQgOiBwdWJsaWMgQXNtU3RtdCB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIFNvdXJjZUxvY2F0aW9uIExCcmFjZUxvYywgRW5kTG9jOworICBTdHJpbmdSZWYgQXNtU3RyOworCisgIHVuc2lnbmVkIE51bUFzbVRva3MgPSAwOworCisgIFRva2VuICpBc21Ub2tzID0gbnVsbHB0cjsKKyAgU3RyaW5nUmVmICpDb25zdHJhaW50cyA9IG51bGxwdHI7CisgIFN0cmluZ1JlZiAqQ2xvYmJlcnMgPSBudWxscHRyOworCitwdWJsaWM6CisgIE1TQXNtU3RtdChjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBhc21sb2MsCisgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBsYnJhY2Vsb2MsIGJvb2wgaXNzaW1wbGUsIGJvb2wgaXN2b2xhdGlsZSwKKyAgICAgICAgICAgIEFycmF5UmVmPFRva2VuPiBhc210b2tzLCB1bnNpZ25lZCBudW1vdXRwdXRzLCB1bnNpZ25lZCBudW1pbnB1dHMsCisgICAgICAgICAgICBBcnJheVJlZjxTdHJpbmdSZWY+IGNvbnN0cmFpbnRzLAorICAgICAgICAgICAgQXJyYXlSZWY8RXhwcio+IGV4cHJzLCBTdHJpbmdSZWYgYXNtc3RyLAorICAgICAgICAgICAgQXJyYXlSZWY8U3RyaW5nUmVmPiBjbG9iYmVycywgU291cmNlTG9jYXRpb24gZW5kbG9jKTsKKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IE1TLXN0eWxlIGlubGluZS1hc3NlbWJseSBzdGF0ZW1lbnQuCisgIGV4cGxpY2l0IE1TQXNtU3RtdChFbXB0eVNoZWxsIEVtcHR5KSA6IEFzbVN0bXQoTVNBc21TdG10Q2xhc3MsIEVtcHR5KSB7fQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExCcmFjZUxvYygpIGNvbnN0IHsgcmV0dXJuIExCcmFjZUxvYzsgfQorICB2b2lkIHNldExCcmFjZUxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IExCcmFjZUxvYyA9IEw7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0RW5kTG9jKCkgY29uc3QgeyByZXR1cm4gRW5kTG9jOyB9CisgIHZvaWQgc2V0RW5kTG9jKFNvdXJjZUxvY2F0aW9uIEwpIHsgRW5kTG9jID0gTDsgfQorCisgIGJvb2wgaGFzQnJhY2VzKCkgY29uc3QgeyByZXR1cm4gTEJyYWNlTG9jLmlzVmFsaWQoKTsgfQorCisgIHVuc2lnbmVkIGdldE51bUFzbVRva3MoKSB7IHJldHVybiBOdW1Bc21Ub2tzOyB9CisgIFRva2VuICpnZXRBc21Ub2tzKCkgeyByZXR1cm4gQXNtVG9rczsgfQorCisgIC8vPT09LS0tIEFzbSBTdHJpbmcgQW5hbHlzaXMgLS0tPT09Ly8KKyAgU3RyaW5nUmVmIGdldEFzbVN0cmluZygpIGNvbnN0IHsgcmV0dXJuIEFzbVN0cjsgfQorCisgIC8vLyBBc3NlbWJsZSBmaW5hbCBJUiBhc20gc3RyaW5nLgorICBzdGQ6OnN0cmluZyBnZW5lcmF0ZUFzbVN0cmluZyhjb25zdCBBU1RDb250ZXh0ICZDKSBjb25zdDsKKworICAvLz09PS0tLSBPdXRwdXQgb3BlcmFuZHMgLS0tPT09Ly8KKworICBTdHJpbmdSZWYgZ2V0T3V0cHV0Q29uc3RyYWludCh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBOdW1PdXRwdXRzKTsKKyAgICByZXR1cm4gQ29uc3RyYWludHNbaV07CisgIH0KKworICBFeHByICpnZXRPdXRwdXRFeHByKHVuc2lnbmVkIGkpOworCisgIGNvbnN0IEV4cHIgKmdldE91dHB1dEV4cHIodW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PE1TQXNtU3RtdCo+KHRoaXMpLT5nZXRPdXRwdXRFeHByKGkpOworICB9CisKKyAgLy89PT0tLS0gSW5wdXQgb3BlcmFuZHMgLS0tPT09Ly8KKworICBTdHJpbmdSZWYgZ2V0SW5wdXRDb25zdHJhaW50KHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IE51bUlucHV0cyk7CisgICAgcmV0dXJuIENvbnN0cmFpbnRzW2kgKyBOdW1PdXRwdXRzXTsKKyAgfQorCisgIEV4cHIgKmdldElucHV0RXhwcih1bnNpZ25lZCBpKTsKKyAgdm9pZCBzZXRJbnB1dEV4cHIodW5zaWduZWQgaSwgRXhwciAqRSk7CisKKyAgY29uc3QgRXhwciAqZ2V0SW5wdXRFeHByKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxNU0FzbVN0bXQqPih0aGlzKS0+Z2V0SW5wdXRFeHByKGkpOworICB9CisKKyAgLy89PT0tLS0gT3RoZXIgLS0tPT09Ly8KKworICBBcnJheVJlZjxTdHJpbmdSZWY+IGdldEFsbENvbnN0cmFpbnRzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoQ29uc3RyYWludHMsIE51bUlucHV0cyArIE51bU91dHB1dHMpOworICB9CisKKyAgQXJyYXlSZWY8U3RyaW5nUmVmPiBnZXRDbG9iYmVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKENsb2JiZXJzLCBOdW1DbG9iYmVycyk7CisgIH0KKworICBBcnJheVJlZjxFeHByKj4gZ2V0QWxsRXhwcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZihyZWludGVycHJldF9jYXN0PEV4cHIqKj4oRXhwcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtSW5wdXRzICsgTnVtT3V0cHV0cyk7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0Q2xvYmJlcih1bnNpZ25lZCBpKSBjb25zdCB7IHJldHVybiBnZXRDbG9iYmVycygpW2ldOyB9CisKK3ByaXZhdGU6CisgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTdHJpbmdSZWYgQXNtU3RyaW5nLAorICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VG9rZW4+IEFzbVRva3MsIEFycmF5UmVmPFN0cmluZ1JlZj4gQ29uc3RyYWludHMsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByKj4gRXhwcnMsIEFycmF5UmVmPFN0cmluZ1JlZj4gQ2xvYmJlcnMpOworCitwdWJsaWM6CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBBc21Mb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBFbmRMb2M7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gTVNBc21TdG10Q2xhc3M7CisgIH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoJkV4cHJzWzBdLCAmRXhwcnNbTnVtSW5wdXRzICsgTnVtT3V0cHV0c10pOworICB9Cit9OworCitjbGFzcyBTRUhFeGNlcHRTdG10IDogcHVibGljIFN0bXQgeworICBmcmllbmQgY2xhc3MgQVNUUmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKworICBTb3VyY2VMb2NhdGlvbiAgTG9jOworICBTdG10ICpDaGlsZHJlblsyXTsKKworICBlbnVtIHsgRklMVEVSX0VYUFIsIEJMT0NLIH07CisKKyAgU0VIRXhjZXB0U3RtdChTb3VyY2VMb2NhdGlvbiBMb2MsIEV4cHIgKkZpbHRlckV4cHIsIFN0bXQgKkJsb2NrKTsKKyAgZXhwbGljaXQgU0VIRXhjZXB0U3RtdChFbXB0eVNoZWxsIEUpIDogU3RtdChTRUhFeGNlcHRTdG10Q2xhc3MsIEUpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIFNFSEV4Y2VwdFN0bXQqIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEV4Y2VwdExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpGaWx0ZXJFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKkJsb2NrKTsKKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gZ2V0RXhjZXB0TG9jKCk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBnZXRFbmRMb2MoKTsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEV4Y2VwdExvYygpIGNvbnN0IHsgcmV0dXJuIExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRFbmRMb2MoKSBjb25zdCB7IHJldHVybiBnZXRCbG9jaygpLT5nZXRMb2NFbmQoKTsgfQorCisgIEV4cHIgKmdldEZpbHRlckV4cHIoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwcio+KENoaWxkcmVuW0ZJTFRFUl9FWFBSXSk7CisgIH0KKworICBDb21wb3VuZFN0bXQgKmdldEJsb2NrKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PENvbXBvdW5kU3RtdD4oQ2hpbGRyZW5bQkxPQ0tdKTsKKyAgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShDaGlsZHJlbixDaGlsZHJlbisyKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBTRUhFeGNlcHRTdG10Q2xhc3M7CisgIH0KK307CisKK2NsYXNzIFNFSEZpbmFsbHlTdG10IDogcHVibGljIFN0bXQgeworICBmcmllbmQgY2xhc3MgQVNUUmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKworICBTb3VyY2VMb2NhdGlvbiAgTG9jOworICBTdG10ICpCbG9jazsKKworICBTRUhGaW5hbGx5U3RtdChTb3VyY2VMb2NhdGlvbiBMb2MsIFN0bXQgKkJsb2NrKTsKKyAgZXhwbGljaXQgU0VIRmluYWxseVN0bXQoRW1wdHlTaGVsbCBFKSA6IFN0bXQoU0VIRmluYWxseVN0bXRDbGFzcywgRSkge30KKworcHVibGljOgorICBzdGF0aWMgU0VIRmluYWxseVN0bXQqIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBGaW5hbGx5TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpCbG9jayk7CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIGdldEZpbmFsbHlMb2MoKTsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIGdldEVuZExvYygpOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0RmluYWxseUxvYygpIGNvbnN0IHsgcmV0dXJuIExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRFbmRMb2MoKSBjb25zdCB7IHJldHVybiBCbG9jay0+Z2V0TG9jRW5kKCk7IH0KKworICBDb21wb3VuZFN0bXQgKmdldEJsb2NrKCkgY29uc3QgeyByZXR1cm4gY2FzdDxDb21wb3VuZFN0bXQ+KEJsb2NrKTsgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZSgmQmxvY2ssJkJsb2NrKzEpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IFNFSEZpbmFsbHlTdG10Q2xhc3M7CisgIH0KK307CisKK2NsYXNzIFNFSFRyeVN0bXQgOiBwdWJsaWMgU3RtdCB7CisgIGZyaWVuZCBjbGFzcyBBU1RSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIGJvb2wgSXNDWFhUcnk7CisgIFNvdXJjZUxvY2F0aW9uICBUcnlMb2M7CisgIFN0bXQgKkNoaWxkcmVuWzJdOworCisgIGVudW0geyBUUlkgPSAwLCBIQU5ETEVSID0gMSB9OworCisgIFNFSFRyeVN0bXQoYm9vbCBpc0NYWFRyeSwgLy8gdHJ1ZSBpZiAndHJ5JyBvdGhlcndpc2UgJ19fdHJ5JworICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRyeUxvYywKKyAgICAgICAgICAgICBTdG10ICpUcnlCbG9jaywKKyAgICAgICAgICAgICBTdG10ICpIYW5kbGVyKTsKKworICBleHBsaWNpdCBTRUhUcnlTdG10KEVtcHR5U2hlbGwgRSkgOiBTdG10KFNFSFRyeVN0bXRDbGFzcywgRSkge30KKworcHVibGljOgorICBzdGF0aWMgU0VIVHJ5U3RtdCogQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIGJvb2wgaXNDWFhUcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVHJ5TG9jLCBTdG10ICpUcnlCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpIYW5kbGVyKTsKKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gZ2V0VHJ5TG9jKCk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBnZXRFbmRMb2MoKTsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFRyeUxvYygpIGNvbnN0IHsgcmV0dXJuIFRyeUxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRFbmRMb2MoKSBjb25zdCB7IHJldHVybiBDaGlsZHJlbltIQU5ETEVSXS0+Z2V0TG9jRW5kKCk7IH0KKworICBib29sIGdldElzQ1hYVHJ5KCkgY29uc3QgeyByZXR1cm4gSXNDWFhUcnk7IH0KKworICBDb21wb3VuZFN0bXQqIGdldFRyeUJsb2NrKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PENvbXBvdW5kU3RtdD4oQ2hpbGRyZW5bVFJZXSk7CisgIH0KKworICBTdG10ICpnZXRIYW5kbGVyKCkgY29uc3QgeyByZXR1cm4gQ2hpbGRyZW5bSEFORExFUl07IH0KKworICAvLy8gUmV0dXJucyAwIGlmIG5vdCBkZWZpbmVkCisgIFNFSEV4Y2VwdFN0bXQgICpnZXRFeGNlcHRIYW5kbGVyKCkgY29uc3Q7CisgIFNFSEZpbmFsbHlTdG10ICpnZXRGaW5hbGx5SGFuZGxlcigpIGNvbnN0OworCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShDaGlsZHJlbixDaGlsZHJlbisyKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBTRUhUcnlTdG10Q2xhc3M7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgX19sZWF2ZSBzdGF0ZW1lbnQuCitjbGFzcyBTRUhMZWF2ZVN0bXQgOiBwdWJsaWMgU3RtdCB7CisgIFNvdXJjZUxvY2F0aW9uIExlYXZlTG9jOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFNFSExlYXZlU3RtdChTb3VyY2VMb2NhdGlvbiBMTCkKKyAgICAgIDogU3RtdChTRUhMZWF2ZVN0bXRDbGFzcyksIExlYXZlTG9jKExMKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgX19sZWF2ZSBzdGF0ZW1lbnQuCisgIGV4cGxpY2l0IFNFSExlYXZlU3RtdChFbXB0eVNoZWxsIEVtcHR5KSA6IFN0bXQoU0VITGVhdmVTdG10Q2xhc3MsIEVtcHR5KSB7fQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExlYXZlTG9jKCkgY29uc3QgeyByZXR1cm4gTGVhdmVMb2M7IH0KKyAgdm9pZCBzZXRMZWF2ZUxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IExlYXZlTG9jID0gTDsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMZWF2ZUxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIExlYXZlTG9jOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IFNFSExlYXZlU3RtdENsYXNzOworICB9CisKKyAgLy8gSXRlcmF0b3JzCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShjaGlsZF9pdGVyYXRvcigpLCBjaGlsZF9pdGVyYXRvcigpKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIGNhcHR1cmVzIGEgc3RhdGVtZW50IGludG8gYSBmdW5jdGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcKKy8vLyBwcmFnbWEgYW5ub3RhdGVkIGNvbXBvdW5kIHN0YXRlbWVudCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBDYXB0dXJlZFN0bXQsCisvLy8gYW5kIHRoaXMgY29tcG91bmQgc3RhdGVtZW50IGlzIHRoZSBib2R5IG9mIGFuIGFub255bW91cyBvdXRsaW5lZCBmdW5jdGlvbi4KKy8vLyBAY29kZQorLy8vICNwcmFnbWEgb21wIHBhcmFsbGVsCisvLy8geworLy8vICAgY29tcHV0ZSgpOworLy8vIH0KKy8vLyBAZW5kY29kZQorY2xhc3MgQ2FwdHVyZWRTdG10IDogcHVibGljIFN0bXQgeworcHVibGljOgorICAvLy8gXGJyaWVmIFRoZSBkaWZmZXJlbnQgY2FwdHVyZSBmb3JtczogYnkgJ3RoaXMnLCBieSByZWZlcmVuY2UsIGNhcHR1cmUgZm9yCisgIC8vLyB2YXJpYWJsZS1sZW5ndGggYXJyYXkgdHlwZSBldGMuCisgIGVudW0gVmFyaWFibGVDYXB0dXJlS2luZCB7CisgICAgVkNLX1RoaXMsCisgICAgVkNLX0J5UmVmLAorICAgIFZDS19CeUNvcHksCisgICAgVkNLX1ZMQVR5cGUsCisgIH07CisKKyAgLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIGNhcHR1cmUgb2YgZWl0aGVyIGEgdmFyaWFibGUsIG9yICd0aGlzJywgb3IKKyAgLy8vIHZhcmlhYmxlLWxlbmd0aCBhcnJheSB0eXBlLgorICBjbGFzcyBDYXB0dXJlIHsKKyAgICBsbHZtOjpQb2ludGVySW50UGFpcjxWYXJEZWNsICosIDIsIFZhcmlhYmxlQ2FwdHVyZUtpbmQ+IFZhckFuZEtpbmQ7CisgICAgU291cmNlTG9jYXRpb24gTG9jOworCisgIHB1YmxpYzoKKyAgICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKworICAgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbmV3IGNhcHR1cmUuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBMb2MgVGhlIHNvdXJjZSBsb2NhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYXB0dXJlLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gS2luZCBUaGUga2luZCBvZiBjYXB0dXJlICh0aGlzLCBCeVJlZiwgLi4uKS4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIFZhciBUaGUgdmFyaWFibGUgYmVpbmcgY2FwdHVyZWQsIG9yIG51bGwgaWYgY2FwdHVyaW5nIHRoaXMuCisgICAgQ2FwdHVyZShTb3VyY2VMb2NhdGlvbiBMb2MsIFZhcmlhYmxlQ2FwdHVyZUtpbmQgS2luZCwKKyAgICAgICAgICAgIFZhckRlY2wgKlZhciA9IG51bGxwdHIpOworCisgICAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIGtpbmQgb2YgY2FwdHVyZS4KKyAgICBWYXJpYWJsZUNhcHR1cmVLaW5kIGdldENhcHR1cmVLaW5kKCkgY29uc3Q7CisKKyAgICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzb3VyY2UgbG9jYXRpb24gYXQgd2hpY2ggdGhlIHZhcmlhYmxlIG9yICd0aGlzJyB3YXMKKyAgICAvLy8gZmlyc3QgdXNlZC4KKyAgICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIExvYzsgfQorCisgICAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNhcHR1cmUgaGFuZGxlcyB0aGUgQysrICd0aGlzJyBwb2ludGVyLgorICAgIGJvb2wgY2FwdHVyZXNUaGlzKCkgY29uc3QgeyByZXR1cm4gZ2V0Q2FwdHVyZUtpbmQoKSA9PSBWQ0tfVGhpczsgfQorCisgICAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNhcHR1cmUgaGFuZGxlcyBhIHZhcmlhYmxlIChieSByZWZlcmVuY2UpLgorICAgIGJvb2wgY2FwdHVyZXNWYXJpYWJsZSgpIGNvbnN0IHsgcmV0dXJuIGdldENhcHR1cmVLaW5kKCkgPT0gVkNLX0J5UmVmOyB9CisKKyAgICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2FwdHVyZSBoYW5kbGVzIGEgdmFyaWFibGUgYnkgY29weS4KKyAgICBib29sIGNhcHR1cmVzVmFyaWFibGVCeUNvcHkoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0Q2FwdHVyZUtpbmQoKSA9PSBWQ0tfQnlDb3B5OworICAgIH0KKworICAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjYXB0dXJlIGhhbmRsZXMgYSB2YXJpYWJsZS1sZW5ndGggYXJyYXkKKyAgICAvLy8gdHlwZS4KKyAgICBib29sIGNhcHR1cmVzVmFyaWFibGVBcnJheVR5cGUoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0Q2FwdHVyZUtpbmQoKSA9PSBWQ0tfVkxBVHlwZTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgdmFyaWFibGUgYmVpbmcgY2FwdHVyZWQuCisgICAgLy8vCisgICAgLy8vIFRoaXMgb3BlcmF0aW9uIGlzIG9ubHkgdmFsaWQgaWYgdGhpcyBjYXB0dXJlIGNhcHR1cmVzIGEgdmFyaWFibGUuCisgICAgVmFyRGVjbCAqZ2V0Q2FwdHVyZWRWYXIoKSBjb25zdDsKKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHZhcmlhYmxlIGNhcHR1cmVkLCBpbmNsdWRpbmcgJ3RoaXMnLgorICB1bnNpZ25lZCBOdW1DYXB0dXJlczsKKworICAvLy8gXGJyaWVmIFRoZSBwb2ludGVyIHBhcnQgaXMgdGhlIGltcGxpY2l0IHRoZSBvdXRsaW5lZCBmdW5jdGlvbiBhbmQgdGhlIAorICAvLy8gaW50IHBhcnQgaXMgdGhlIGNhcHR1cmVkIHJlZ2lvbiBraW5kLCAnQ1JfRGVmYXVsdCcgZXRjLgorICBsbHZtOjpQb2ludGVySW50UGFpcjxDYXB0dXJlZERlY2wgKiwgMSwgQ2FwdHVyZWRSZWdpb25LaW5kPiBDYXBEZWNsQW5kS2luZDsKKworICAvLy8gXGJyaWVmIFRoZSByZWNvcmQgZm9yIGNhcHR1cmVkIHZhcmlhYmxlcywgYSBSZWNvcmREZWNsIG9yIENYWFJlY29yZERlY2wuCisgIFJlY29yZERlY2wgKlRoZVJlY29yZERlY2wgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgY2FwdHVyZWQgc3RhdGVtZW50LgorICBDYXB0dXJlZFN0bXQoU3RtdCAqUywgQ2FwdHVyZWRSZWdpb25LaW5kIEtpbmQsIEFycmF5UmVmPENhcHR1cmU+IENhcHR1cmVzLAorICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBDYXB0dXJlSW5pdHMsIENhcHR1cmVkRGVjbCAqQ0QsIFJlY29yZERlY2wgKlJEKTsKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBlbXB0eSBjYXB0dXJlZCBzdGF0ZW1lbnQuCisgIENhcHR1cmVkU3RtdChFbXB0eVNoZWxsIEVtcHR5LCB1bnNpZ25lZCBOdW1DYXB0dXJlcyk7CisKKyAgU3RtdCAqKmdldFN0b3JlZFN0bXRzKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih0aGlzICsgMSk7IH0KKworICBTdG10ICpjb25zdCAqZ2V0U3RvcmVkU3RtdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqY29uc3QgKj4odGhpcyArIDEpOworICB9CisKKyAgQ2FwdHVyZSAqZ2V0U3RvcmVkQ2FwdHVyZXMoKSBjb25zdDsKKworICB2b2lkIHNldENhcHR1cmVkU3RtdChTdG10ICpTKSB7IGdldFN0b3JlZFN0bXRzKClbTnVtQ2FwdHVyZXNdID0gUzsgfQorCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIHN0YXRpYyBDYXB0dXJlZFN0bXQgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LCBTdG10ICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZWRSZWdpb25LaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDYXB0dXJlPiBDYXB0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gQ2FwdHVyZUluaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZWREZWNsICpDRCwgUmVjb3JkRGVjbCAqUkQpOworCisgIHN0YXRpYyBDYXB0dXJlZFN0bXQgKkNyZWF0ZURlc2VyaWFsaXplZChjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2FwdHVyZXMpOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHN0YXRlbWVudCBiZWluZyBjYXB0dXJlZC4KKyAgU3RtdCAqZ2V0Q2FwdHVyZWRTdG10KCkgeyByZXR1cm4gZ2V0U3RvcmVkU3RtdHMoKVtOdW1DYXB0dXJlc107IH0KKyAgY29uc3QgU3RtdCAqZ2V0Q2FwdHVyZWRTdG10KCkgY29uc3QgeyByZXR1cm4gZ2V0U3RvcmVkU3RtdHMoKVtOdW1DYXB0dXJlc107IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBvdXRsaW5lZCBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KKyAgQ2FwdHVyZWREZWNsICpnZXRDYXB0dXJlZERlY2woKTsKKyAgY29uc3QgQ2FwdHVyZWREZWNsICpnZXRDYXB0dXJlZERlY2woKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFNldCB0aGUgb3V0bGluZWQgZnVuY3Rpb24gZGVjbGFyYXRpb24uCisgIHZvaWQgc2V0Q2FwdHVyZWREZWNsKENhcHR1cmVkRGVjbCAqRCk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgY2FwdHVyZWQgcmVnaW9uIGtpbmQuCisgIENhcHR1cmVkUmVnaW9uS2luZCBnZXRDYXB0dXJlZFJlZ2lvbktpbmQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFNldCB0aGUgY2FwdHVyZWQgcmVnaW9uIGtpbmQuCisgIHZvaWQgc2V0Q2FwdHVyZWRSZWdpb25LaW5kKENhcHR1cmVkUmVnaW9uS2luZCBLaW5kKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSByZWNvcmQgZGVjbGFyYXRpb24gZm9yIGNhcHR1cmVkIHZhcmlhYmxlcy4KKyAgY29uc3QgUmVjb3JkRGVjbCAqZ2V0Q2FwdHVyZWRSZWNvcmREZWNsKCkgY29uc3QgeyByZXR1cm4gVGhlUmVjb3JkRGVjbDsgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSByZWNvcmQgZGVjbGFyYXRpb24gZm9yIGNhcHR1cmVkIHZhcmlhYmxlcy4KKyAgdm9pZCBzZXRDYXB0dXJlZFJlY29yZERlY2woUmVjb3JkRGVjbCAqRCkgeworICAgIGFzc2VydChEICYmICJudWxsIFJlY29yZERlY2wiKTsKKyAgICBUaGVSZWNvcmREZWNsID0gRDsKKyAgfQorCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGlzIHZhcmlhYmxlIGhhcyBiZWVuIGNhcHR1cmVkLgorICBib29sIGNhcHR1cmVzVmFyaWFibGUoY29uc3QgVmFyRGVjbCAqVmFyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEFuIGl0ZXJhdG9yIHRoYXQgd2Fsa3Mgb3ZlciB0aGUgY2FwdHVyZXMuCisgIHVzaW5nIGNhcHR1cmVfaXRlcmF0b3IgPSBDYXB0dXJlICo7CisgIHVzaW5nIGNvbnN0X2NhcHR1cmVfaXRlcmF0b3IgPSBjb25zdCBDYXB0dXJlICo7CisgIHVzaW5nIGNhcHR1cmVfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxjYXB0dXJlX2l0ZXJhdG9yPjsKKyAgdXNpbmcgY2FwdHVyZV9jb25zdF9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGNvbnN0X2NhcHR1cmVfaXRlcmF0b3I+OworCisgIGNhcHR1cmVfcmFuZ2UgY2FwdHVyZXMoKSB7CisgICAgcmV0dXJuIGNhcHR1cmVfcmFuZ2UoY2FwdHVyZV9iZWdpbigpLCBjYXB0dXJlX2VuZCgpKTsKKyAgfQorICBjYXB0dXJlX2NvbnN0X3JhbmdlIGNhcHR1cmVzKCkgY29uc3QgeworICAgIHJldHVybiBjYXB0dXJlX2NvbnN0X3JhbmdlKGNhcHR1cmVfYmVnaW4oKSwgY2FwdHVyZV9lbmQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBjYXB0dXJlLgorICBjYXB0dXJlX2l0ZXJhdG9yIGNhcHR1cmVfYmVnaW4oKSB7IHJldHVybiBnZXRTdG9yZWRDYXB0dXJlcygpOyB9CisgIGNvbnN0X2NhcHR1cmVfaXRlcmF0b3IgY2FwdHVyZV9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGdldFN0b3JlZENhcHR1cmVzKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2Ugb2YKKyAgLy8vIGNhcHR1cmVzLgorICBjYXB0dXJlX2l0ZXJhdG9yIGNhcHR1cmVfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdG9yZWRDYXB0dXJlcygpICsgTnVtQ2FwdHVyZXM7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBudW1iZXIgb2YgY2FwdHVyZXMsIGluY2x1ZGluZyAndGhpcycuCisgIHVuc2lnbmVkIGNhcHR1cmVfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE51bUNhcHR1cmVzOyB9CisKKyAgLy8vIFxicmllZiBJdGVyYXRvciB0aGF0IHdhbGtzIG92ZXIgdGhlIGNhcHR1cmUgaW5pdGlhbGl6YXRpb24gYXJndW1lbnRzLgorICB1c2luZyBjYXB0dXJlX2luaXRfaXRlcmF0b3IgPSBFeHByICoqOworICB1c2luZyBjYXB0dXJlX2luaXRfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxjYXB0dXJlX2luaXRfaXRlcmF0b3I+OworCisgIC8vLyBcYnJpZWYgQ29uc3QgaXRlcmF0b3IgdGhhdCB3YWxrcyBvdmVyIHRoZSBjYXB0dXJlIGluaXRpYWxpemF0aW9uCisgIC8vLyBhcmd1bWVudHMuCisgIHVzaW5nIGNvbnN0X2NhcHR1cmVfaW5pdF9pdGVyYXRvciA9IEV4cHIgKmNvbnN0ICo7CisgIHVzaW5nIGNvbnN0X2NhcHR1cmVfaW5pdF9yYW5nZSA9CisgICAgICBsbHZtOjppdGVyYXRvcl9yYW5nZTxjb25zdF9jYXB0dXJlX2luaXRfaXRlcmF0b3I+OworCisgIGNhcHR1cmVfaW5pdF9yYW5nZSBjYXB0dXJlX2luaXRzKCkgeworICAgIHJldHVybiBjYXB0dXJlX2luaXRfcmFuZ2UoY2FwdHVyZV9pbml0X2JlZ2luKCksIGNhcHR1cmVfaW5pdF9lbmQoKSk7CisgIH0KKworICBjb25zdF9jYXB0dXJlX2luaXRfcmFuZ2UgY2FwdHVyZV9pbml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FwdHVyZV9pbml0X3JhbmdlKGNhcHR1cmVfaW5pdF9iZWdpbigpLCBjYXB0dXJlX2luaXRfZW5kKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgZmlyc3QgaW5pdGlhbGl6YXRpb24gYXJndW1lbnQuCisgIGNhcHR1cmVfaW5pdF9pdGVyYXRvciBjYXB0dXJlX2luaXRfYmVnaW4oKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwciAqKj4oZ2V0U3RvcmVkU3RtdHMoKSk7CisgIH0KKworICBjb25zdF9jYXB0dXJlX2luaXRfaXRlcmF0b3IgY2FwdHVyZV9pbml0X2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEV4cHIgKmNvbnN0ICo+KGdldFN0b3JlZFN0bXRzKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgb25lIHBhc3QgdGhlIGxhc3QgaW5pdGlhbGl6YXRpb24KKyAgLy8vIGFyZ3VtZW50LgorICBjYXB0dXJlX2luaXRfaXRlcmF0b3IgY2FwdHVyZV9pbml0X2VuZCgpIHsKKyAgICByZXR1cm4gY2FwdHVyZV9pbml0X2JlZ2luKCkgKyBOdW1DYXB0dXJlczsKKyAgfQorCisgIGNvbnN0X2NhcHR1cmVfaW5pdF9pdGVyYXRvciBjYXB0dXJlX2luaXRfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBjYXB0dXJlX2luaXRfYmVnaW4oKSArIE51bUNhcHR1cmVzOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gZ2V0Q2FwdHVyZWRTdG10KCktPmdldExvY1N0YXJ0KCk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gZ2V0Q2FwdHVyZWRTdG10KCktPmdldExvY0VuZCgpOworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gZ2V0Q2FwdHVyZWRTdG10KCktPmdldFNvdXJjZVJhbmdlKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ2FwdHVyZWRTdG10Q2xhc3M7CisgIH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUX1NUTVRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1N0bXRDWFguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9TdG10Q1hYLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmODE4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9TdG10Q1hYLmgKQEAgLTAsMCArMSw0ODcgQEAKKy8vPT09LS0tIFN0bXRDWFguaCAtIENsYXNzZXMgZm9yIHJlcHJlc2VudGluZyBDKysgc3RhdGVtZW50cyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEMrKyBzdGF0ZW1lbnQgQVNUIG5vZGUgY2xhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX1NUTVRDWFhfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9TVE1UQ1hYX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsYXJhdGlvbk5hbWUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXhwci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9OZXN0ZWROYW1lU3BlY2lmaWVyLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgVmFyRGVjbDsKKworLy8vIENYWENhdGNoU3RtdCAtIFRoaXMgcmVwcmVzZW50cyBhIEMrKyBjYXRjaCBibG9jay4KKy8vLworY2xhc3MgQ1hYQ2F0Y2hTdG10IDogcHVibGljIFN0bXQgeworICBTb3VyY2VMb2NhdGlvbiBDYXRjaExvYzsKKyAgLy8vIFRoZSBleGNlcHRpb24tZGVjbGFyYXRpb24gb2YgdGhlIHR5cGUuCisgIFZhckRlY2wgKkV4Y2VwdGlvbkRlY2w7CisgIC8vLyBUaGUgaGFuZGxlciBibG9jay4KKyAgU3RtdCAqSGFuZGxlckJsb2NrOworCitwdWJsaWM6CisgIENYWENhdGNoU3RtdChTb3VyY2VMb2NhdGlvbiBjYXRjaExvYywgVmFyRGVjbCAqZXhEZWNsLCBTdG10ICpoYW5kbGVyQmxvY2spCisgIDogU3RtdChDWFhDYXRjaFN0bXRDbGFzcyksIENhdGNoTG9jKGNhdGNoTG9jKSwgRXhjZXB0aW9uRGVjbChleERlY2wpLAorICAgIEhhbmRsZXJCbG9jayhoYW5kbGVyQmxvY2spIHt9CisKKyAgQ1hYQ2F0Y2hTdG10KEVtcHR5U2hlbGwgRW1wdHkpCisgIDogU3RtdChDWFhDYXRjaFN0bXRDbGFzcyksIEV4Y2VwdGlvbkRlY2wobnVsbHB0ciksIEhhbmRsZXJCbG9jayhudWxscHRyKSB7fQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBDYXRjaExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gSGFuZGxlckJsb2NrLT5nZXRMb2NFbmQoKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldENhdGNoTG9jKCkgY29uc3QgeyByZXR1cm4gQ2F0Y2hMb2M7IH0KKyAgVmFyRGVjbCAqZ2V0RXhjZXB0aW9uRGVjbCgpIGNvbnN0IHsgcmV0dXJuIEV4Y2VwdGlvbkRlY2w7IH0KKyAgUXVhbFR5cGUgZ2V0Q2F1Z2h0VHlwZSgpIGNvbnN0OworICBTdG10ICpnZXRIYW5kbGVyQmxvY2soKSBjb25zdCB7IHJldHVybiBIYW5kbGVyQmxvY2s7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ1hYQ2F0Y2hTdG10Q2xhc3M7CisgIH0KKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsgcmV0dXJuIGNoaWxkX3JhbmdlKCZIYW5kbGVyQmxvY2ssICZIYW5kbGVyQmxvY2srMSk7IH0KKworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKK307CisKKy8vLyBDWFhUcnlTdG10IC0gQSBDKysgdHJ5IGJsb2NrLCBpbmNsdWRpbmcgYWxsIGhhbmRsZXJzLgorLy8vCitjbGFzcyBDWFhUcnlTdG10IDogcHVibGljIFN0bXQgeworICBTb3VyY2VMb2NhdGlvbiBUcnlMb2M7CisgIHVuc2lnbmVkIE51bUhhbmRsZXJzOworCisgIENYWFRyeVN0bXQoU291cmNlTG9jYXRpb24gdHJ5TG9jLCBTdG10ICp0cnlCbG9jaywgQXJyYXlSZWY8U3RtdCo+IGhhbmRsZXJzKTsKKworICBDWFhUcnlTdG10KEVtcHR5U2hlbGwgRW1wdHksIHVuc2lnbmVkIG51bUhhbmRsZXJzKQorICAgIDogU3RtdChDWFhUcnlTdG10Q2xhc3MpLCBOdW1IYW5kbGVycyhudW1IYW5kbGVycykgeyB9CisKKyAgU3RtdCBjb25zdCAqIGNvbnN0ICpnZXRTdG10cygpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTdG10IGNvbnN0ICogY29uc3QqPih0aGlzICsgMSk7CisgIH0KKyAgU3RtdCAqKmdldFN0bXRzKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFN0bXQgKio+KHRoaXMgKyAxKTsKKyAgfQorCitwdWJsaWM6CisgIHN0YXRpYyBDWFhUcnlTdG10ICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gdHJ5TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKnRyeUJsb2NrLCBBcnJheVJlZjxTdG10Kj4gaGFuZGxlcnMpOworCisgIHN0YXRpYyBDWFhUcnlTdG10ICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgRW1wdHlTaGVsbCBFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1IYW5kbGVycyk7CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIGdldFRyeUxvYygpOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gZ2V0RW5kTG9jKCk7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRUcnlMb2MoKSBjb25zdCB7IHJldHVybiBUcnlMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0RW5kTG9jKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdG10cygpW051bUhhbmRsZXJzXS0+Z2V0TG9jRW5kKCk7CisgIH0KKworICBDb21wb3VuZFN0bXQgKmdldFRyeUJsb2NrKCkgeworICAgIHJldHVybiBjYXN0PENvbXBvdW5kU3RtdD4oZ2V0U3RtdHMoKVswXSk7CisgIH0KKyAgY29uc3QgQ29tcG91bmRTdG10ICpnZXRUcnlCbG9jaygpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxDb21wb3VuZFN0bXQ+KGdldFN0bXRzKClbMF0pOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtSGFuZGxlcnMoKSBjb25zdCB7IHJldHVybiBOdW1IYW5kbGVyczsgfQorICBDWFhDYXRjaFN0bXQgKmdldEhhbmRsZXIodW5zaWduZWQgaSkgeworICAgIHJldHVybiBjYXN0PENYWENhdGNoU3RtdD4oZ2V0U3RtdHMoKVtpICsgMV0pOworICB9CisgIGNvbnN0IENYWENhdGNoU3RtdCAqZ2V0SGFuZGxlcih1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8Q1hYQ2F0Y2hTdG10PihnZXRTdG10cygpW2kgKyAxXSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ1hYVHJ5U3RtdENsYXNzOworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGdldFN0bXRzKCksIGdldFN0bXRzKCkgKyBnZXROdW1IYW5kbGVycygpICsgMSk7CisgIH0KKworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKK307CisKKy8vLyBDWFhGb3JSYW5nZVN0bXQgLSBUaGlzIHJlcHJlc2VudHMgQysrMHggW3N0bXQucmFuZ2VkXSdzIHJhbmdlZCBmb3IKKy8vLyBzdGF0ZW1lbnQsIHJlcHJlc2VudGVkIGFzICdmb3IgKHJhbmdlLWRlY2xhcmF0b3IgOiByYW5nZS1leHByZXNzaW9uKScuCisvLy8KKy8vLyBUaGlzIGlzIHN0b3JlZCBpbiBhIHBhcnRpYWxseS1kZXN1Z2FyZWQgZm9ybSB0byBhbGxvdyBmdWxsIHNlbWFudGljCisvLy8gYW5hbHlzaXMgb2YgdGhlIGNvbnN0aXR1ZW50IGNvbXBvbmVudHMuIFRoZSBvcmlnaW5hbCBzeW50YWN0aWMgY29tcG9uZW50cworLy8vIGNhbiBiZSBleHRyYWN0ZWQgdXNpbmcgZ2V0TG9vcFZhcmlhYmxlIGFuZCBnZXRSYW5nZUluaXQuCitjbGFzcyBDWFhGb3JSYW5nZVN0bXQgOiBwdWJsaWMgU3RtdCB7CisgIFNvdXJjZUxvY2F0aW9uIEZvckxvYzsKKyAgZW51bSB7IFJBTkdFLCBCRUdJTlNUTVQsIEVORFNUTVQsIENPTkQsIElOQywgTE9PUFZBUiwgQk9EWSwgRU5EIH07CisgIC8vIFN1YkV4cHJzW1JBTkdFXSBpcyBhbiBleHByZXNzaW9uIG9yIGRlY2xzdG10LgorICAvLyBTdWJFeHByc1tDT05EXSBhbmQgU3ViRXhwcnNbSU5DXSBhcmUgZXhwcmVzc2lvbnMuCisgIFN0bXQgKlN1YkV4cHJzW0VORF07CisgIFNvdXJjZUxvY2F0aW9uIENvYXdhaXRMb2M7CisgIFNvdXJjZUxvY2F0aW9uIENvbG9uTG9jOworICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2M7CisKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CitwdWJsaWM6CisgIENYWEZvclJhbmdlU3RtdChEZWNsU3RtdCAqUmFuZ2UsIERlY2xTdG10ICpCZWdpbiwgRGVjbFN0bXQgKkVuZCwKKyAgICAgICAgICAgICAgICAgIEV4cHIgKkNvbmQsIEV4cHIgKkluYywgRGVjbFN0bXQgKkxvb3BWYXIsIFN0bXQgKkJvZHksCisgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBGTCwgU291cmNlTG9jYXRpb24gQ0FMLCBTb3VyY2VMb2NhdGlvbiBDTCwKKyAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQTCk7CisgIENYWEZvclJhbmdlU3RtdChFbXB0eVNoZWxsIEVtcHR5KSA6IFN0bXQoQ1hYRm9yUmFuZ2VTdG10Q2xhc3MsIEVtcHR5KSB7IH0KKworCisgIFZhckRlY2wgKmdldExvb3BWYXJpYWJsZSgpOworICBFeHByICpnZXRSYW5nZUluaXQoKTsKKworICBjb25zdCBWYXJEZWNsICpnZXRMb29wVmFyaWFibGUoKSBjb25zdDsKKyAgY29uc3QgRXhwciAqZ2V0UmFuZ2VJbml0KCkgY29uc3Q7CisKKworICBEZWNsU3RtdCAqZ2V0UmFuZ2VTdG10KCkgeyByZXR1cm4gY2FzdDxEZWNsU3RtdD4oU3ViRXhwcnNbUkFOR0VdKTsgfQorICBEZWNsU3RtdCAqZ2V0QmVnaW5TdG10KCkgeworICAgIHJldHVybiBjYXN0X29yX251bGw8RGVjbFN0bXQ+KFN1YkV4cHJzW0JFR0lOU1RNVF0pOworICB9CisgIERlY2xTdG10ICpnZXRFbmRTdG10KCkgeyByZXR1cm4gY2FzdF9vcl9udWxsPERlY2xTdG10PihTdWJFeHByc1tFTkRTVE1UXSk7IH0KKyAgRXhwciAqZ2V0Q29uZCgpIHsgcmV0dXJuIGNhc3Rfb3JfbnVsbDxFeHByPihTdWJFeHByc1tDT05EXSk7IH0KKyAgRXhwciAqZ2V0SW5jKCkgeyByZXR1cm4gY2FzdF9vcl9udWxsPEV4cHI+KFN1YkV4cHJzW0lOQ10pOyB9CisgIERlY2xTdG10ICpnZXRMb29wVmFyU3RtdCgpIHsgcmV0dXJuIGNhc3Q8RGVjbFN0bXQ+KFN1YkV4cHJzW0xPT1BWQVJdKTsgfQorICBTdG10ICpnZXRCb2R5KCkgeyByZXR1cm4gU3ViRXhwcnNbQk9EWV07IH0KKworICBjb25zdCBEZWNsU3RtdCAqZ2V0UmFuZ2VTdG10KCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PERlY2xTdG10PihTdWJFeHByc1tSQU5HRV0pOworICB9CisgIGNvbnN0IERlY2xTdG10ICpnZXRCZWdpblN0bXQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxEZWNsU3RtdD4oU3ViRXhwcnNbQkVHSU5TVE1UXSk7CisgIH0KKyAgY29uc3QgRGVjbFN0bXQgKmdldEVuZFN0bXQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxEZWNsU3RtdD4oU3ViRXhwcnNbRU5EU1RNVF0pOworICB9CisgIGNvbnN0IEV4cHIgKmdldENvbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxFeHByPihTdWJFeHByc1tDT05EXSk7CisgIH0KKyAgY29uc3QgRXhwciAqZ2V0SW5jKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8RXhwcj4oU3ViRXhwcnNbSU5DXSk7CisgIH0KKyAgY29uc3QgRGVjbFN0bXQgKmdldExvb3BWYXJTdG10KCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PERlY2xTdG10PihTdWJFeHByc1tMT09QVkFSXSk7CisgIH0KKyAgY29uc3QgU3RtdCAqZ2V0Qm9keSgpIGNvbnN0IHsgcmV0dXJuIFN1YkV4cHJzW0JPRFldOyB9CisKKyAgdm9pZCBzZXRSYW5nZUluaXQoRXhwciAqRSkgeyBTdWJFeHByc1tSQU5HRV0gPSByZWludGVycHJldF9jYXN0PFN0bXQqPihFKTsgfQorICB2b2lkIHNldFJhbmdlU3RtdChTdG10ICpTKSB7IFN1YkV4cHJzW1JBTkdFXSA9IFM7IH0KKyAgdm9pZCBzZXRCZWdpblN0bXQoU3RtdCAqUykgeyBTdWJFeHByc1tCRUdJTlNUTVRdID0gUzsgfQorICB2b2lkIHNldEVuZFN0bXQoU3RtdCAqUykgeyBTdWJFeHByc1tFTkRTVE1UXSA9IFM7IH0KKyAgdm9pZCBzZXRDb25kKEV4cHIgKkUpIHsgU3ViRXhwcnNbQ09ORF0gPSByZWludGVycHJldF9jYXN0PFN0bXQqPihFKTsgfQorICB2b2lkIHNldEluYyhFeHByICpFKSB7IFN1YkV4cHJzW0lOQ10gPSByZWludGVycHJldF9jYXN0PFN0bXQqPihFKTsgfQorICB2b2lkIHNldExvb3BWYXJTdG10KFN0bXQgKlMpIHsgU3ViRXhwcnNbTE9PUFZBUl0gPSBTOyB9CisgIHZvaWQgc2V0Qm9keShTdG10ICpTKSB7IFN1YkV4cHJzW0JPRFldID0gUzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEZvckxvYygpIGNvbnN0IHsgcmV0dXJuIEZvckxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRDb2F3YWl0TG9jKCkgY29uc3QgeyByZXR1cm4gQ29hd2FpdExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRDb2xvbkxvYygpIGNvbnN0IHsgcmV0dXJuIENvbG9uTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldFJQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIFJQYXJlbkxvYzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBGb3JMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIFN1YkV4cHJzW0JPRFldLT5nZXRMb2NFbmQoKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBDWFhGb3JSYW5nZVN0bXRDbGFzczsKKyAgfQorCisgIC8vIEl0ZXJhdG9ycworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoJlN1YkV4cHJzWzBdLCAmU3ViRXhwcnNbRU5EXSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50YXRpb24gb2YgYSBNaWNyb3NvZnQgX19pZl9leGlzdHMgb3IgX19pZl9ub3RfZXhpc3RzCisvLy8gc3RhdGVtZW50IHdpdGggYSBkZXBlbmRlbnQgbmFtZS4KKy8vLworLy8vIFRoZSBfX2lmX2V4aXN0cyBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgdG8gaW5jbHVkZSBhIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMKKy8vLyBpbiB0aGUgcHJvZ3JhbSBvbmx5IHdoZW4gYSBwYXJ0aWN1bGFyIGRlcGVuZGVudCBuYW1lIGRvZXMgbm90IGV4aXN0LiBGb3IKKy8vLyBleGFtcGxlOgorLy8vCisvLy8gXGNvZGUKKy8vLyB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorLy8vIHZvaWQgY2FsbF9mb28oVCAmdCkgeworLy8vICAgX19pZl9leGlzdHMgKFQ6OmZvbykgeworLy8vICAgICB0LmZvbygpOyAvLyBva2F5OiBvbmx5IGNhbGxlZCB3aGVuIFQ6OmZvbyBleGlzdHMuCisvLy8gICB9CisvLy8gfQorLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBTaW1pbGFybHksIHRoZSBfX2lmX25vdF9leGlzdHMgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIGluY2x1ZGUgdGhlCisvLy8gc3RhdGVtZW50cyB3aGVuIGEgcGFydGljdWxhciBuYW1lIGRvZXMgbm90IGV4aXN0LgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgc3RhdGVtZW50IG9ubHkgY2FwdHVyZXMgX19pZl9leGlzdHMgYW5kIF9faWZfbm90X2V4aXN0cworLy8vIHN0YXRlbWVudHMgd2hvc2UgbmFtZSBpcyBkZXBlbmRlbnQuIEFsbCBub24tZGVwZW5kZW50IGNhc2VzIGFyZSBoYW5kbGVkCisvLy8gZGlyZWN0bHkgaW4gdGhlIHBhcnNlciwgc28gdGhhdCB0aGV5IGRvbid0IGludHJvZHVjZSBhIG5ldyBzY29wZS4gQ2xhbmcKKy8vLyBpbnRyb2R1Y2VzIHNjb3BlcyBpbiB0aGUgZGVwZW5kZW50IGNhc2UgdG8ga2VlcCBuYW1lcyBpbnNpZGUgdGhlIGNvbXBvdW5kCisvLy8gc3RhdGVtZW50IGZyb20gbGVha2luZyBvdXQgaW50byB0aGUgc3Vycm91bmQgc3RhdGVtZW50cywgd2hpY2ggd291bGQKKy8vLyBjb21wcm9taXNlIHRoZSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIG1vZGVsLiBUaGlzIGJlaGF2aW9yIGRpZmZlcnMgZnJvbQorLy8vIFZpc3VhbCBDKysgKHdoaWNoIG5ldmVyIGludHJvZHVjZXMgYSBzY29wZSksIGJ1dCBpcyBhIGZhaXJseSByZWFzb25hYmxlCisvLy8gYXBwcm94aW1hdGlvbiBvZiB0aGUgVkMrKyBiZWhhdmlvci4KK2NsYXNzIE1TRGVwZW5kZW50RXhpc3RzU3RtdCA6IHB1YmxpYyBTdG10IHsKKyAgU291cmNlTG9jYXRpb24gS2V5d29yZExvYzsKKyAgYm9vbCBJc0lmRXhpc3RzOworICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYzsKKyAgRGVjbGFyYXRpb25OYW1lSW5mbyBOYW1lSW5mbzsKKyAgU3RtdCAqU3ViU3RtdDsKKworICBmcmllbmQgY2xhc3MgQVNUUmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKworcHVibGljOgorICBNU0RlcGVuZGVudEV4aXN0c1N0bXQoU291cmNlTG9jYXRpb24gS2V5d29yZExvYywgYm9vbCBJc0lmRXhpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbk5hbWVJbmZvIE5hbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG91bmRTdG10ICpTdWJTdG10KQorICA6IFN0bXQoTVNEZXBlbmRlbnRFeGlzdHNTdG10Q2xhc3MpLAorICAgIEtleXdvcmRMb2MoS2V5d29yZExvYyksIElzSWZFeGlzdHMoSXNJZkV4aXN0cyksCisgICAgUXVhbGlmaWVyTG9jKFF1YWxpZmllckxvYyksIE5hbWVJbmZvKE5hbWVJbmZvKSwKKyAgICBTdWJTdG10KHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqPihTdWJTdG10KSkgeyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIF9faWZfZXhpc3RzIG9yIF9faWZfbm90X2V4aXN0cworICAvLy8ga2V5d29yZC4KKyAgU291cmNlTG9jYXRpb24gZ2V0S2V5d29yZExvYygpIGNvbnN0IHsgcmV0dXJuIEtleXdvcmRMb2M7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYW4gX19pZl9leGlzdHMgc3RhdGVtZW50LgorICBib29sIGlzSWZFeGlzdHMoKSBjb25zdCB7IHJldHVybiBJc0lmRXhpc3RzOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGFuIF9faWZfZXhpc3RzIHN0YXRlbWVudC4KKyAgYm9vbCBpc0lmTm90RXhpc3RzKCkgY29uc3QgeyByZXR1cm4gIUlzSWZFeGlzdHM7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgdGhhdCBxdWFsaWZpZXMgdGhpcyBuYW1lLCBpZgorICAvLy8gYW55LgorICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIGdldFF1YWxpZmllckxvYygpIGNvbnN0IHsgcmV0dXJuIFF1YWxpZmllckxvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIGVudGl0eSB3ZSdyZSB0ZXN0aW5nIGZvciwgYWxvbmcgd2l0aAorICAvLy8gbG9jYXRpb24gaW5mb3JtYXRpb24KKyAgRGVjbGFyYXRpb25OYW1lSW5mbyBnZXROYW1lSW5mbygpIGNvbnN0IHsgcmV0dXJuIE5hbWVJbmZvOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgY29tcG91bmQgc3RhdGVtZW50IHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKKyAgLy8vIHByb2dyYW0gb25seSBpZiB0aGUgZXhpc3RlbmNlIG9mIHRoZSBzeW1ib2wgbWF0Y2hlcyB0aGUgaW5pdGlhbCBrZXl3b3JkLgorICBDb21wb3VuZFN0bXQgKmdldFN1YlN0bXQoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q29tcG91bmRTdG10ICo+KFN1YlN0bXQpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIEtleXdvcmRMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBTdWJTdG10LT5nZXRMb2NFbmQoKTt9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKCZTdWJTdG10LCAmU3ViU3RtdCsxKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBNU0RlcGVuZGVudEV4aXN0c1N0bXRDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIHRoZSBib2R5IG9mIGEgY29yb3V0aW5lLiBUaGlzIHdyYXBzIHRoZSBub3JtYWwgZnVuY3Rpb24KKy8vLyBib2R5IGFuZCBob2xkcyB0aGUgYWRkaXRpb25hbCBzZW1hbnRpYyBjb250ZXh0IHJlcXVpcmVkIHRvIHNldCB1cCBhbmQgdGVhcgorLy8vIGRvd24gdGhlIGNvcm91dGluZSBmcmFtZS4KK2NsYXNzIENvcm91dGluZUJvZHlTdG10IGZpbmFsCisgICAgOiBwdWJsaWMgU3RtdCwKKyAgICAgIHByaXZhdGUgbGx2bTo6VHJhaWxpbmdPYmplY3RzPENvcm91dGluZUJvZHlTdG10LCBTdG10ICo+IHsKKyAgZW51bSBTdWJTdG10IHsKKyAgICBCb2R5LCAgICAgICAgICAvLy88IFRoZSBib2R5IG9mIHRoZSBjb3JvdXRpbmUuCisgICAgUHJvbWlzZSwgICAgICAgLy8vPCBUaGUgcHJvbWlzZSBzdGF0ZW1lbnQuCisgICAgSW5pdFN1c3BlbmQsICAgLy8vPCBUaGUgaW5pdGlhbCBzdXNwZW5kIHN0YXRlbWVudCwgcnVuIGJlZm9yZSB0aGUgYm9keS4KKyAgICBGaW5hbFN1c3BlbmQsICAvLy88IFRoZSBmaW5hbCBzdXNwZW5kIHN0YXRlbWVudCwgcnVuIGFmdGVyIHRoZSBib2R5LgorICAgIE9uRXhjZXB0aW9uLCAgIC8vLzwgSGFuZGxlciBmb3IgZXhjZXB0aW9ucyB0aHJvd24gaW4gdGhlIGJvZHkuCisgICAgT25GYWxsdGhyb3VnaCwgLy8vPCBIYW5kbGVyIGZvciBjb250cm9sIGZsb3cgZmFsbGluZyBvZmYgdGhlIGJvZHkuCisgICAgQWxsb2NhdGUsICAgICAgLy8vPCBDb3JvdXRpbmUgZnJhbWUgbWVtb3J5IGFsbG9jYXRpb24uCisgICAgRGVhbGxvY2F0ZSwgICAgLy8vPCBDb3JvdXRpbmUgZnJhbWUgbWVtb3J5IGRlYWxsb2NhdGlvbi4KKyAgICBSZXR1cm5WYWx1ZSwgICAvLy88IFJldHVybiB2YWx1ZSBmb3IgdGh1bmsgZnVuY3Rpb246IHAuZ2V0X3JldHVybl9vYmplY3QoKS4KKyAgICBSZXN1bHREZWNsLCAgICAvLy88IERlY2xhcmF0aW9uIGhvbGRpbmcgdGhlIHJlc3VsdCBvZiBnZXRfcmV0dXJuX29iamVjdC4KKyAgICBSZXR1cm5TdG10LCAgICAvLy88IFJldHVybiBzdGF0ZW1lbnQgZm9yIHRoZSB0aHVuayBmdW5jdGlvbi4KKyAgICBSZXR1cm5TdG10T25BbGxvY0ZhaWx1cmUsIC8vLzwgUmV0dXJuIHN0YXRlbWVudCBpZiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAgICBGaXJzdFBhcmFtTW92ZSAvLy88IEZpcnN0IG9mZnNldCBmb3IgbW92ZSBjb25zdHJ1Y3Rpb24gb2YgcGFyYW1ldGVyIGNvcGllcy4KKyAgfTsKKyAgdW5zaWduZWQgTnVtUGFyYW1zOworCisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNUUmVhZGVyOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIFN0bXQgKipnZXRTdG9yZWRTdG10cygpIHsgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxTdG10ICo+KCk7IH0KKworICBTdG10ICpjb25zdCAqZ2V0U3RvcmVkU3RtdHMoKSBjb25zdCB7IHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8U3RtdCAqPigpOyB9CisKK3B1YmxpYzoKKworICBzdHJ1Y3QgQ3RvckFyZ3MgeworICAgIFN0bXQgKkJvZHkgPSBudWxscHRyOworICAgIFN0bXQgKlByb21pc2UgPSBudWxscHRyOworICAgIEV4cHIgKkluaXRpYWxTdXNwZW5kID0gbnVsbHB0cjsKKyAgICBFeHByICpGaW5hbFN1c3BlbmQgPSBudWxscHRyOworICAgIFN0bXQgKk9uRXhjZXB0aW9uID0gbnVsbHB0cjsKKyAgICBTdG10ICpPbkZhbGx0aHJvdWdoID0gbnVsbHB0cjsKKyAgICBFeHByICpBbGxvY2F0ZSA9IG51bGxwdHI7CisgICAgRXhwciAqRGVhbGxvY2F0ZSA9IG51bGxwdHI7CisgICAgRXhwciAqUmV0dXJuVmFsdWUgPSBudWxscHRyOworICAgIFN0bXQgKlJlc3VsdERlY2wgPSBudWxscHRyOworICAgIFN0bXQgKlJldHVyblN0bXQgPSBudWxscHRyOworICAgIFN0bXQgKlJldHVyblN0bXRPbkFsbG9jRmFpbHVyZSA9IG51bGxwdHI7CisgICAgQXJyYXlSZWY8U3RtdCAqPiBQYXJhbU1vdmVzOworICB9OworCitwcml2YXRlOgorCisgIENvcm91dGluZUJvZHlTdG10KEN0b3JBcmdzIGNvbnN0JiBBcmdzKTsKKworcHVibGljOgorICBzdGF0aWMgQ29yb3V0aW5lQm9keVN0bXQgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBDdG9yQXJncyBjb25zdCAmQXJncyk7CisgIHN0YXRpYyBDb3JvdXRpbmVCb2R5U3RtdCAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIEVtcHR5U2hlbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVBhcmFtcyk7CisKKyAgYm9vbCBoYXNEZXBlbmRlbnRQcm9taXNlVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UHJvbWlzZURlY2woKS0+Z2V0VHlwZSgpLT5pc0RlcGVuZGVudFR5cGUoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGJvZHkgb2YgdGhlIGNvcm91dGluZSBhcyB3cml0dGVuLiBUaGlzIHdpbGwgYmUgZWl0aGVyCisgIC8vLyBhIENvbXBvdW5kU3RtdCBvciBhIFRyeVN0bXQuCisgIFN0bXQgKmdldEJvZHkoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN0b3JlZFN0bXRzKClbU3ViU3RtdDo6Qm9keV07CisgIH0KKworICBTdG10ICpnZXRQcm9taXNlRGVjbFN0bXQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN0b3JlZFN0bXRzKClbU3ViU3RtdDo6UHJvbWlzZV07CisgIH0KKyAgVmFyRGVjbCAqZ2V0UHJvbWlzZURlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8VmFyRGVjbD4oY2FzdDxEZWNsU3RtdD4oZ2V0UHJvbWlzZURlY2xTdG10KCkpLT5nZXRTaW5nbGVEZWNsKCkpOworICB9CisKKyAgU3RtdCAqZ2V0SW5pdFN1c3BlbmRTdG10KCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdG9yZWRTdG10cygpW1N1YlN0bXQ6OkluaXRTdXNwZW5kXTsKKyAgfQorICBTdG10ICpnZXRGaW5hbFN1c3BlbmRTdG10KCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdG9yZWRTdG10cygpW1N1YlN0bXQ6OkZpbmFsU3VzcGVuZF07CisgIH0KKworICBTdG10ICpnZXRFeGNlcHRpb25IYW5kbGVyKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdG9yZWRTdG10cygpW1N1YlN0bXQ6Ok9uRXhjZXB0aW9uXTsKKyAgfQorICBTdG10ICpnZXRGYWxsdGhyb3VnaEhhbmRsZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN0b3JlZFN0bXRzKClbU3ViU3RtdDo6T25GYWxsdGhyb3VnaF07CisgIH0KKworICBFeHByICpnZXRBbGxvY2F0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPEV4cHI+KGdldFN0b3JlZFN0bXRzKClbU3ViU3RtdDo6QWxsb2NhdGVdKTsKKyAgfQorICBFeHByICpnZXREZWFsbG9jYXRlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8RXhwcj4oZ2V0U3RvcmVkU3RtdHMoKVtTdWJTdG10OjpEZWFsbG9jYXRlXSk7CisgIH0KKyAgRXhwciAqZ2V0UmV0dXJuVmFsdWVJbml0KCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PEV4cHI+KGdldFN0b3JlZFN0bXRzKClbU3ViU3RtdDo6UmV0dXJuVmFsdWVdKTsKKyAgfQorICBTdG10ICpnZXRSZXN1bHREZWNsKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RvcmVkU3RtdHMoKVtTdWJTdG10OjpSZXN1bHREZWNsXTsgfQorICBTdG10ICpnZXRSZXR1cm5TdG10KCkgY29uc3QgeyByZXR1cm4gZ2V0U3RvcmVkU3RtdHMoKVtTdWJTdG10OjpSZXR1cm5TdG10XTsgfQorICBTdG10ICpnZXRSZXR1cm5TdG10T25BbGxvY0ZhaWx1cmUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN0b3JlZFN0bXRzKClbU3ViU3RtdDo6UmV0dXJuU3RtdE9uQWxsb2NGYWlsdXJlXTsKKyAgfQorICBBcnJheVJlZjxTdG10IGNvbnN0ICo+IGdldFBhcmFtTW92ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHtnZXRTdG9yZWRTdG10cygpICsgU3ViU3RtdDo6Rmlyc3RQYXJhbU1vdmUsIE51bVBhcmFtc307CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBnZXRCb2R5KCkgPyBnZXRCb2R5KCktPmdldExvY1N0YXJ0KCkKKyAgICAgICAgICAgIDogZ2V0UHJvbWlzZURlY2woKS0+Z2V0TG9jU3RhcnQoKTsKKyAgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gZ2V0Qm9keSgpID8gZ2V0Qm9keSgpLT5nZXRMb2NFbmQoKSA6IGdldFByb21pc2VEZWNsKCktPmdldExvY0VuZCgpOworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGdldFN0b3JlZFN0bXRzKCksCisgICAgICAgICAgICAgICAgICAgICAgIGdldFN0b3JlZFN0bXRzKCkgKyBTdWJTdG10OjpGaXJzdFBhcmFtTW92ZSArIE51bVBhcmFtcyk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQ29yb3V0aW5lQm9keVN0bXRDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgJ2NvX3JldHVybicgc3RhdGVtZW50IGluIHRoZSBDKysgQ29yb3V0aW5lcyBUUy4KKy8vLworLy8vIFRoaXMgc3RhdGFtZW50IG1vZGVscyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNvcm91dGluZSBwcm9taXNlCisvLy8gKGVuY2Fwc3VsYXRpbmcgdGhlIGV2ZW50dWFsIG5vdGlvbmFsIHJldHVybiB2YWx1ZSkgZnJvbSBhbiBleHByZXNzaW9uCisvLy8gKG9yIGJyYWNlZC1pbml0LWxpc3QpLCBmb2xsb3dlZCBieSB0ZXJtaW5hdGlvbiBvZiB0aGUgY29yb3V0aW5lLgorLy8vCisvLy8gVGhpcyBpbml0aWFsaXphdGlvbiBpcyBtb2RlbGVkIGJ5IHRoZSBldmFsdWF0aW9uIG9mIHRoZSBvcGVyYW5kCisvLy8gZm9sbG93ZWQgYnkgYSBjYWxsIHRvIG9uZSBvZjoKKy8vLyAgIDxwcm9taXNlPi5yZXR1cm5fdmFsdWUoPG9wZXJhbmQ+KQorLy8vICAgPHByb21pc2U+LnJldHVybl92b2lkKCkKKy8vLyB3aGljaCB3ZSBuYW1lIHRoZSAicHJvbWlzZSBjYWxsIi4KK2NsYXNzIENvcmV0dXJuU3RtdCA6IHB1YmxpYyBTdG10IHsKKyAgU291cmNlTG9jYXRpb24gQ29yZXR1cm5Mb2M7CisKKyAgZW51bSBTdWJTdG10IHsgT3BlcmFuZCwgUHJvbWlzZUNhbGwsIENvdW50IH07CisgIFN0bXQgKlN1YlN0bXRzW1N1YlN0bXQ6OkNvdW50XTsKKworICBib29sIElzSW1wbGljaXQgOiAxOworCisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworcHVibGljOgorICBDb3JldHVyblN0bXQoU291cmNlTG9jYXRpb24gQ29yZXR1cm5Mb2MsIFN0bXQgKk9wZXJhbmQsIFN0bXQgKlByb21pc2VDYWxsLAorICAgICAgICAgICAgICAgYm9vbCBJc0ltcGxpY2l0ID0gZmFsc2UpCisgICAgICA6IFN0bXQoQ29yZXR1cm5TdG10Q2xhc3MpLCBDb3JldHVybkxvYyhDb3JldHVybkxvYyksCisgICAgICAgIElzSW1wbGljaXQoSXNJbXBsaWNpdCkgeworICAgIFN1YlN0bXRzW1N1YlN0bXQ6Ok9wZXJhbmRdID0gT3BlcmFuZDsKKyAgICBTdWJTdG10c1tTdWJTdG10OjpQcm9taXNlQ2FsbF0gPSBQcm9taXNlQ2FsbDsKKyAgfQorCisgIENvcmV0dXJuU3RtdChFbXB0eVNoZWxsKSA6IENvcmV0dXJuU3RtdCh7fSwge30sIHt9KSB7fQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEtleXdvcmRMb2MoKSBjb25zdCB7IHJldHVybiBDb3JldHVybkxvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG9wZXJhbmQgb2YgdGhlICdjb19yZXR1cm4nIHN0YXRlbWVudC4gV2lsbCBiZSBudWxscHRyCisgIC8vLyBpZiBub25lIHdhcyBzcGVjaWZpZWQuCisgIEV4cHIgKmdldE9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxFeHByKj4oU3ViU3RtdHNbT3BlcmFuZF0pOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgcHJvbWlzZSBjYWxsIHRoYXQgcmVzdWx0cyBmcm9tIHRoaXMgJ2NvX3JldHVybicKKyAgLy8vIHN0YXRlbWVudC4gV2lsbCBiZSBudWxscHRyIGlmIGVpdGhlciB0aGUgY29yb3V0aW5lIGhhcyBub3QgeWV0IGJlZW4KKyAgLy8vIGZpbmFsaXplZCBvciB0aGUgY29yb3V0aW5lIGhhcyBubyBldmVudHVhbCByZXR1cm4gdHlwZS4KKyAgRXhwciAqZ2V0UHJvbWlzZUNhbGwoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEV4cHIqPihTdWJTdG10c1tQcm9taXNlQ2FsbF0pOworICB9CisKKyAgYm9vbCBpc0ltcGxpY2l0KCkgY29uc3QgeyByZXR1cm4gSXNJbXBsaWNpdDsgfQorICB2b2lkIHNldElzSW1wbGljaXQoYm9vbCB2YWx1ZSA9IHRydWUpIHsgSXNJbXBsaWNpdCA9IHZhbHVlOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIENvcmV0dXJuTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBnZXRPcGVyYW5kKCkgPyBnZXRPcGVyYW5kKCktPmdldExvY0VuZCgpIDogZ2V0TG9jU3RhcnQoKTsKKyAgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIGlmICghZ2V0T3BlcmFuZCgpKQorICAgICAgcmV0dXJuIGNoaWxkX3JhbmdlKFN1YlN0bXRzICsgU3ViU3RtdDo6UHJvbWlzZUNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3ViU3RtdHMgKyBTdWJTdG10OjpDb3VudCk7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKFN1YlN0bXRzLCBTdWJTdG10cyArIFN1YlN0bXQ6OkNvdW50KTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBDb3JldHVyblN0bXRDbGFzczsKKyAgfQorfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9TdG10RGF0YUNvbGxlY3RvcnMuaW5jIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1N0bXREYXRhQ29sbGVjdG9ycy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmNzk2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9TdG10RGF0YUNvbGxlY3RvcnMuaW5jCkBAIC0wLDAgKzEsMjIwIEBACitERUZfQUREX0RBVEEoQWRkckxhYmVsRXhwciwgeworCisgICAgYWRkRGF0YShTLT5nZXRMYWJlbCgpLT5nZXROYW1lKCkpOworICB9CispCitERUZfQUREX0RBVEEoQXJyYXlUeXBlVHJhaXRFeHByLCB7CisKKyAgICBhZGREYXRhKFMtPmdldFRyYWl0KCkpOworICB9CispCitERUZfQUREX0RBVEEoQXNtU3RtdCwgeworCisgICAgYWRkRGF0YShTLT5pc1NpbXBsZSgpKTsKKyAgICBhZGREYXRhKFMtPmlzVm9sYXRpbGUoKSk7CisgICAgYWRkRGF0YShTLT5nZW5lcmF0ZUFzbVN0cmluZyhDb250ZXh0KSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFMtPmdldE51bUlucHV0cygpOyArK2kpIHsKKyAgICAgIGFkZERhdGEoUy0+Z2V0SW5wdXRDb25zdHJhaW50KGkpKTsKKyAgICB9CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFMtPmdldE51bU91dHB1dHMoKTsgKytpKSB7CisgICAgICBhZGREYXRhKFMtPmdldE91dHB1dENvbnN0cmFpbnQoaSkpOworICAgIH0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgUy0+Z2V0TnVtQ2xvYmJlcnMoKTsgKytpKSB7CisgICAgICBhZGREYXRhKFMtPmdldENsb2JiZXIoaSkpOworICAgIH0KKyAgfQorKQorREVGX0FERF9EQVRBKEF0dHJpYnV0ZWRTdG10LCB7CisKKyAgICBmb3IgKGNvbnN0IEF0dHIgKkEgOiBTLT5nZXRBdHRycygpKSB7CisgICAgICBhZGREYXRhKHN0ZDo6c3RyaW5nKEEtPmdldFNwZWxsaW5nKCkpKTsKKyAgICB9CisgIH0KKykKK0RFRl9BRERfREFUQShCaW5hcnlPcGVyYXRvciwgeworCisgICAgYWRkRGF0YShTLT5nZXRPcGNvZGUoKSk7CisgIH0KKykKK0RFRl9BRERfREFUQShDWFhCb29sTGl0ZXJhbEV4cHIsIHsKKworICAgIGFkZERhdGEoUy0+Z2V0VmFsdWUoKSk7CisgIH0KKykKK0RFRl9BRERfREFUQShDWFhDYXRjaFN0bXQsIHsKKworICAgIGFkZERhdGEoUy0+Z2V0Q2F1Z2h0VHlwZSgpKTsKKyAgfQorKQorREVGX0FERF9EQVRBKENYWERlbGV0ZUV4cHIsIHsKKworICAgIGFkZERhdGEoUy0+aXNBcnJheUZvcm1Bc1dyaXR0ZW4oKSk7IGFkZERhdGEoUy0+aXNHbG9iYWxEZWxldGUoKSk7CisgIH0KKykKK0RFRl9BRERfREFUQShDWFhGb2xkRXhwciwgeworCisgICAgYWRkRGF0YShTLT5pc1JpZ2h0Rm9sZCgpKTsgYWRkRGF0YShTLT5nZXRPcGVyYXRvcigpKTsKKyAgfQorKQorREVGX0FERF9EQVRBKENhbGxFeHByLCB7CisKKyAgICAvLyBGdW5jdGlvbiBwb2ludGVycyBkb24ndCBoYXZlIGEgY2FsbGVlIGFuZCB3ZSBqdXN0IHNraXAgaGFzaGluZyBpdC4KKyAgICBpZiAoY29uc3QgRnVuY3Rpb25EZWNsICpEID0gUy0+Z2V0RGlyZWN0Q2FsbGVlKCkpIHsKKyAgICAgIC8vIElmIHRoZSBmdW5jdGlvbiBpcyBhIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLCB3ZSBhbHNvIG5lZWQgdG8gaGFuZGxlCisgICAgICAvLyB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGFzIHRoZXkgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcXVhbGlmaWVkIG5hbWUuCisgICAgICBpZiAoYXV0byBBcmdzID0gRC0+Z2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbkFyZ3MoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBBcmdTdHJpbmc7CisKKyAgICAgICAgLy8gUHJpbnQgYWxsIHRlbXBsYXRlIGFyZ3VtZW50cyBpbnRvIEFyZ1N0cmluZworICAgICAgICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gT1MoQXJnU3RyaW5nKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEFyZ3MtPnNpemUoKTsgKytpKSB7CisgICAgICAgICAgQXJncy0+Z2V0KGkpLnByaW50KENvbnRleHQuZ2V0TGFuZ09wdHMoKSwgT1MpOworICAgICAgICAgIC8vIEFkZCBhIHBhZGRpbmcgY2hhcmFjdGVyIHNvIHRoYXQgJ2ZvbzxYLCBYWD4oKScgIT0gJ2ZvbzxYWCwgWD4oKScuCisgICAgICAgICAgT1MgPDwgJ1xuJzsKKyAgICAgICAgfQorICAgICAgICBPUy5mbHVzaCgpOworCisgICAgICAgIGFkZERhdGEoQXJnU3RyaW5nKTsKKyAgICAgIH0KKyAgICAgIGFkZERhdGEoRC0+Z2V0UXVhbGlmaWVkTmFtZUFzU3RyaW5nKCkpOworICAgIH0KKyAgfQorKQorREVGX0FERF9EQVRBKENoYXJhY3RlckxpdGVyYWwsIHsKKworICAgIGFkZERhdGEoUy0+Z2V0VmFsdWUoKSk7CisgIH0KKykKK0RFRl9BRERfREFUQShEZWNsUmVmRXhwciwgeworCisgICAgYWRkRGF0YShTLT5nZXREZWNsKCktPmdldFF1YWxpZmllZE5hbWVBc1N0cmluZygpKTsKKyAgfQorKQorREVGX0FERF9EQVRBKERlY2xTdG10LCB7CisKKyAgICBhdXRvIG51bURlY2xzID0gc3RkOjpkaXN0YW5jZShTLT5kZWNsX2JlZ2luKCksIFMtPmRlY2xfZW5kKCkpOworICAgIGFkZERhdGEoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG51bURlY2xzKSk7CisgICAgZm9yIChjb25zdCBEZWNsICpEIDogUy0+ZGVjbHMoKSkgeworICAgICAgaWYgKGNvbnN0IFZhckRlY2wgKlZEID0gZHluX2Nhc3Q8VmFyRGVjbD4oRCkpIHsKKyAgICAgICAgYWRkRGF0YShWRC0+Z2V0VHlwZSgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKykKK0RFRl9BRERfREFUQShFeHByLCB7CisKKyAgICBhZGREYXRhKFMtPmdldFR5cGUoKSk7CisgIH0KKykKK0RFRl9BRERfREFUQShFeHByZXNzaW9uVHJhaXRFeHByLCB7CisKKyAgICBhZGREYXRhKFMtPmdldFRyYWl0KCkpOworICB9CispCitERUZfQUREX0RBVEEoRmxvYXRpbmdMaXRlcmFsLCB7CisKKyAgICBhZGREYXRhKGxsdm06Omhhc2hfdmFsdWUoUy0+Z2V0VmFsdWUoKSkpOworICB9CispCitERUZfQUREX0RBVEEoR2VuZXJpY1NlbGVjdGlvbkV4cHIsIHsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBTLT5nZXROdW1Bc3NvY3MoKTsgKytpKSB7CisgICAgICBhZGREYXRhKFMtPmdldEFzc29jVHlwZShpKSk7CisgICAgfQorICB9CispCitERUZfQUREX0RBVEEoR290b1N0bXQsIHsKKworICAgIGFkZERhdGEoUy0+Z2V0TGFiZWwoKS0+Z2V0TmFtZSgpKTsKKyAgfQorKQorREVGX0FERF9EQVRBKEluZGlyZWN0R290b1N0bXQsIHsKKworICAgIGlmIChTLT5nZXRDb25zdGFudFRhcmdldCgpKQorICAgICAgYWRkRGF0YShTLT5nZXRDb25zdGFudFRhcmdldCgpLT5nZXROYW1lKCkpOworICB9CispCitERUZfQUREX0RBVEEoSW50ZWdlckxpdGVyYWwsIHsKKworICAgIGFkZERhdGEobGx2bTo6aGFzaF92YWx1ZShTLT5nZXRWYWx1ZSgpKSk7CisgIH0KKykKK0RFRl9BRERfREFUQShMYWJlbFN0bXQsIHsKKworICAgIGFkZERhdGEoUy0+Z2V0RGVjbCgpLT5nZXROYW1lKCkpOworICB9CispCitERUZfQUREX0RBVEEoTGFtYmRhRXhwciwgeworCisgICAgZm9yIChjb25zdCBMYW1iZGFDYXB0dXJlICZDIDogUy0+Y2FwdHVyZXMoKSkgeworICAgICAgYWRkRGF0YShDLmlzUGFja0V4cGFuc2lvbigpKTsKKyAgICAgIGFkZERhdGEoQy5nZXRDYXB0dXJlS2luZCgpKTsKKyAgICAgIGlmIChDLmNhcHR1cmVzVmFyaWFibGUoKSkKKyAgICAgICAgYWRkRGF0YShDLmdldENhcHR1cmVkVmFyKCktPmdldFR5cGUoKSk7CisgICAgfQorICAgIGFkZERhdGEoUy0+aXNHZW5lcmljTGFtYmRhKCkpOworICAgIGFkZERhdGEoUy0+aXNNdXRhYmxlKCkpOworICB9CispCitERUZfQUREX0RBVEEoTVNEZXBlbmRlbnRFeGlzdHNTdG10LCB7CisKKyAgICBhZGREYXRhKFMtPmlzSWZFeGlzdHMoKSk7CisgIH0KKykKK0RFRl9BRERfREFUQShNZW1iZXJFeHByLCB7CisKKyAgICBhZGREYXRhKFMtPmdldE1lbWJlckRlY2woKS0+Z2V0TmFtZSgpKTsKKyAgfQorKQorREVGX0FERF9EQVRBKE9iakNBdENhdGNoU3RtdCwgeworCisgICAgYWRkRGF0YShTLT5oYXNFbGxpcHNpcygpKTsKKyAgfQorKQorREVGX0FERF9EQVRBKE9iakNCcmlkZ2VkQ2FzdEV4cHIsIHsKKworICAgIGFkZERhdGEoUy0+Z2V0QnJpZGdlS2luZCgpKTsKKyAgfQorKQorREVGX0FERF9EQVRBKE9iakNJbmRpcmVjdENvcHlSZXN0b3JlRXhwciwgeworCisgICAgYWRkRGF0YShTLT5zaG91bGRDb3B5KCkpOworICB9CispCitERUZfQUREX0RBVEEoT2JqQ1Byb3BlcnR5UmVmRXhwciwgeworCisgICAgYWRkRGF0YShTLT5pc1N1cGVyUmVjZWl2ZXIoKSk7IGFkZERhdGEoUy0+aXNJbXBsaWNpdFByb3BlcnR5KCkpOworICB9CispCitERUZfQUREX0RBVEEoUHJlZGVmaW5lZEV4cHIsIHsKKworICAgIGFkZERhdGEoUy0+Z2V0SWRlbnRUeXBlKCkpOworICB9CispCitERUZfQUREX0RBVEEoU3RtdCwgeworCisgICAgYWRkRGF0YShTLT5nZXRTdG10Q2xhc3MoKSk7CisgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgbm9uLW1hY3JvLWdlbmVyYXRlZCBjb2RlIGlzbid0IGlkZW50aWNhbCB0bworICAgIC8vIG1hY3JvLWdlbmVyYXRlZCBjb2RlLgorICAgIGFkZERhdGEoZGF0YV9jb2xsZWN0aW9uOjpnZXRNYWNyb1N0YWNrKFMtPmdldExvY1N0YXJ0KCksIENvbnRleHQpKTsKKyAgICBhZGREYXRhKGRhdGFfY29sbGVjdGlvbjo6Z2V0TWFjcm9TdGFjayhTLT5nZXRMb2NFbmQoKSwgQ29udGV4dCkpOworICB9CispCitERUZfQUREX0RBVEEoU3RyaW5nTGl0ZXJhbCwgeworCisgICAgYWRkRGF0YShTLT5nZXRTdHJpbmcoKSk7Cit9CispCitERUZfQUREX0RBVEEoVHlwZVRyYWl0RXhwciwgeworCisgICAgYWRkRGF0YShTLT5nZXRUcmFpdCgpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgUy0+Z2V0TnVtQXJncygpOyArK2kpCisgICAgICBhZGREYXRhKFMtPmdldEFyZyhpKS0+Z2V0VHlwZSgpKTsKKyAgfQorKQorREVGX0FERF9EQVRBKFVuYXJ5T3BlcmF0b3IsIHsKKworICAgIGFkZERhdGEoUy0+Z2V0T3Bjb2RlKCkpOworICB9CispCisjdW5kZWYgREVGX0FERF9EQVRBCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvU3RtdEdyYXBoVHJhaXRzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvU3RtdEdyYXBoVHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjNzdiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9TdG10R3JhcGhUcmFpdHMuaApAQCAtMCwwICsxLDc4IEBACisvLz09PS0gU3RtdEdyYXBoVHJhaXRzLmggLSBHcmFwaCBUcmFpdHMgZm9yIHRoZSBjbGFzcyBTdG10IC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyBhIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG9mIGxsdm06OkdyYXBoVHJhaXRzIHRvCisvLyAgdHJlYXQgQVNUcyAoU3RtdCopIGFzIGdyYXBocworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfU1RNVEdSQVBIVFJBSVRTX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfU1RNVEdSQVBIVFJBSVRTX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVwdGhGaXJzdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8Y2xhbmc6OlN0bXQgKj4geworICB1c2luZyBOb2RlUmVmID0gY2xhbmc6OlN0bXQgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBjbGFuZzo6U3RtdDo6Y2hpbGRfaXRlcmF0b3I7CisgIHVzaW5nIG5vZGVzX2l0ZXJhdG9yID0gbGx2bTo6ZGZfaXRlcmF0b3I8Y2xhbmc6OlN0bXQgKj47CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKGNsYW5nOjpTdG10ICpTKSB7IHJldHVybiBTOyB9CisKKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeworICAgIGlmIChOKSByZXR1cm4gTi0+Y2hpbGRfYmVnaW4oKTsKKyAgICBlbHNlIHJldHVybiBDaGlsZEl0ZXJhdG9yVHlwZSgpOworICB9CisKKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsKKyAgICBpZiAoTikgcmV0dXJuIE4tPmNoaWxkX2VuZCgpOworICAgIGVsc2UgcmV0dXJuIENoaWxkSXRlcmF0b3JUeXBlKCk7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oY2xhbmc6OlN0bXQqIFMpIHsKKyAgICByZXR1cm4gZGZfYmVnaW4oUyk7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKGNsYW5nOjpTdG10KiBTKSB7CisgICAgcmV0dXJuIGRmX2VuZChTKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPGNvbnN0IGNsYW5nOjpTdG10ICo+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IGNvbnN0IGNsYW5nOjpTdG10ICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gY2xhbmc6OlN0bXQ6OmNvbnN0X2NoaWxkX2l0ZXJhdG9yOworICB1c2luZyBub2Rlc19pdGVyYXRvciA9IGxsdm06OmRmX2l0ZXJhdG9yPGNvbnN0IGNsYW5nOjpTdG10ICo+OworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShjb25zdCBjbGFuZzo6U3RtdCAqUykgeyByZXR1cm4gUzsgfQorCisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsKKyAgICBpZiAoTikgcmV0dXJuIE4tPmNoaWxkX2JlZ2luKCk7CisgICAgZWxzZSByZXR1cm4gQ2hpbGRJdGVyYXRvclR5cGUoKTsKKyAgfQorCisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7CisgICAgaWYgKE4pIHJldHVybiBOLT5jaGlsZF9lbmQoKTsKKyAgICBlbHNlIHJldHVybiBDaGlsZEl0ZXJhdG9yVHlwZSgpOworICB9CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKGNvbnN0IGNsYW5nOjpTdG10KiBTKSB7CisgICAgcmV0dXJuIGRmX2JlZ2luKFMpOworICB9CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2VuZChjb25zdCBjbGFuZzo6U3RtdCogUykgeworICAgIHJldHVybiBkZl9lbmQoUyk7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUX1NUTVRHUkFQSFRSQUlUU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvU3RtdEl0ZXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvU3RtdEl0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhYWIwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9TdG10SXRlcmF0b3IuaApAQCAtMCwwICsxLDE1OCBAQAorLy89PT0tIFN0bXRJdGVyYXRvci5oIC0gSXRlcmF0b3JzIGZvciBTdGF0ZW1lbnRzIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgU3RtdEl0ZXJhdG9yIGFuZCBDb25zdFN0bXRJdGVyYXRvciBjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfU1RNVElURVJBVE9SX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfU1RNVElURVJBVE9SX0gKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBEZWNsOworY2xhc3MgU3RtdDsKK2NsYXNzIFZhcmlhYmxlQXJyYXlUeXBlOworCitjbGFzcyBTdG10SXRlcmF0b3JCYXNlIHsKK3Byb3RlY3RlZDoKKyAgZW51bSB7CisgICAgU3RtdE1vZGUgPSAweDAsCisgICAgU2l6ZU9mVHlwZVZBTW9kZSA9IDB4MSwKKyAgICBEZWNsR3JvdXBNb2RlID0gMHgyLAorICAgIEZsYWdzID0gMHgzCisgIH07CisgIAorICB1bmlvbiB7CisgICAgU3RtdCAqKnN0bXQ7CisgICAgRGVjbCAqKkRHSTsKKyAgfTsKKyAgdWludHB0cl90IFJhd1ZBUHRyID0gMDsKKyAgRGVjbCAqKkRHRTsKKyAgCisgIFN0bXRJdGVyYXRvckJhc2UoU3RtdCAqKnMpIDogc3RtdChzKSB7fQorICBTdG10SXRlcmF0b3JCYXNlKGNvbnN0IFZhcmlhYmxlQXJyYXlUeXBlICp0KTsKKyAgU3RtdEl0ZXJhdG9yQmFzZShEZWNsICoqZGdpLCBEZWNsICoqZGdlKTsKKyAgU3RtdEl0ZXJhdG9yQmFzZSgpIDogc3RtdChudWxscHRyKSB7fQorCisgIGJvb2wgaW5EZWNsR3JvdXAoKSBjb25zdCB7CisgICAgcmV0dXJuIChSYXdWQVB0ciAmIEZsYWdzKSA9PSBEZWNsR3JvdXBNb2RlOworICB9CisKKyAgYm9vbCBpblNpemVPZlR5cGVWQSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKFJhd1ZBUHRyICYgRmxhZ3MpID09IFNpemVPZlR5cGVWQU1vZGU7CisgIH0KKworICBib29sIGluU3RtdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKFJhd1ZBUHRyICYgRmxhZ3MpID09IFN0bXRNb2RlOworICB9CisKKyAgY29uc3QgVmFyaWFibGVBcnJheVR5cGUgKmdldFZBUHRyKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFZhcmlhYmxlQXJyYXlUeXBlKj4oUmF3VkFQdHIgJiB+RmxhZ3MpOworICB9CisKKyAgdm9pZCBzZXRWQVB0cihjb25zdCBWYXJpYWJsZUFycmF5VHlwZSAqUCkgeworICAgIGFzc2VydChpbkRlY2xHcm91cCgpIHx8IGluU2l6ZU9mVHlwZVZBKCkpOworICAgIFJhd1ZBUHRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFApIHwgKFJhd1ZBUHRyICYgRmxhZ3MpOworICB9CisKKyAgdm9pZCBOZXh0RGVjbChib29sIEltbWVkaWF0ZUFkdmFuY2UgPSB0cnVlKTsKKyAgYm9vbCBIYW5kbGVEZWNsKERlY2wqIEQpOworICB2b2lkIE5leHRWQSgpOworCisgIFN0bXQqJiBHZXREZWNsRXhwcigpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERFUklWRUQsIHR5cGVuYW1lIFJFRkVSRU5DRT4KK2NsYXNzIFN0bXRJdGVyYXRvckltcGwgOiBwdWJsaWMgU3RtdEl0ZXJhdG9yQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRkVSRU5DRSwgcHRyZGlmZl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRkVSRU5DRSwgUkVGRVJFTkNFPiB7Citwcm90ZWN0ZWQ6CisgIFN0bXRJdGVyYXRvckltcGwoY29uc3QgU3RtdEl0ZXJhdG9yQmFzZSYgUkhTKSA6IFN0bXRJdGVyYXRvckJhc2UoUkhTKSB7fQorCitwdWJsaWM6CisgIFN0bXRJdGVyYXRvckltcGwoKSA9IGRlZmF1bHQ7CisgIFN0bXRJdGVyYXRvckltcGwoU3RtdCAqKnMpIDogU3RtdEl0ZXJhdG9yQmFzZShzKSB7fQorICBTdG10SXRlcmF0b3JJbXBsKERlY2wgKipkZ2ksIERlY2wgKipkZ2UpIDogU3RtdEl0ZXJhdG9yQmFzZShkZ2ksIGRnZSkge30KKyAgU3RtdEl0ZXJhdG9ySW1wbChjb25zdCBWYXJpYWJsZUFycmF5VHlwZSAqdCkgOiBTdG10SXRlcmF0b3JCYXNlKHQpIHt9CisKKyAgREVSSVZFRCYgb3BlcmF0b3IrKygpIHsKKyAgICBpZiAoaW5TdG10KCkpCisgICAgICArK3N0bXQ7CisgICAgZWxzZSBpZiAoZ2V0VkFQdHIoKSkKKyAgICAgIE5leHRWQSgpOworICAgIGVsc2UKKyAgICAgIE5leHREZWNsKCk7CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8REVSSVZFRCY+KCp0aGlzKTsKKyAgfQorCisgIERFUklWRUQgb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBERVJJVkVEIHRtcCA9IHN0YXRpY19jYXN0PERFUklWRUQmPigqdGhpcyk7CisgICAgb3BlcmF0b3IrKygpOworICAgIHJldHVybiB0bXA7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgREVSSVZFRCYgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIHN0bXQgPT0gUkhTLnN0bXQgJiYgREdJID09IFJIUy5ER0kgJiYgUmF3VkFQdHIgPT0gUkhTLlJhd1ZBUHRyOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IERFUklWRUQmIFJIUykgY29uc3QgeworICAgIHJldHVybiBzdG10ICE9IFJIUy5zdG10IHx8IERHSSAhPSBSSFMuREdJIHx8IFJhd1ZBUHRyICE9IFJIUy5SYXdWQVB0cjsKKyAgfQorCisgIFJFRkVSRU5DRSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgcmV0dXJuIGluU3RtdCgpID8gKnN0bXQgOiBHZXREZWNsRXhwcigpOworICB9CisKKyAgUkVGRVJFTkNFIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBvcGVyYXRvciooKTsgfQorfTsKKworc3RydWN0IENvbnN0U3RtdEl0ZXJhdG9yOworCitzdHJ1Y3QgU3RtdEl0ZXJhdG9yIDogcHVibGljIFN0bXRJdGVyYXRvckltcGw8U3RtdEl0ZXJhdG9yLCBTdG10KiY+IHsKKyAgZXhwbGljaXQgU3RtdEl0ZXJhdG9yKCkgPSBkZWZhdWx0OworICBTdG10SXRlcmF0b3IoU3RtdCoqIFMpIDogU3RtdEl0ZXJhdG9ySW1wbDxTdG10SXRlcmF0b3IsIFN0bXQqJj4oUykge30KKyAgU3RtdEl0ZXJhdG9yKERlY2wqKiBkZ2ksIERlY2wqKiBkZ2UpCisgICAgICA6IFN0bXRJdGVyYXRvckltcGw8U3RtdEl0ZXJhdG9yLCBTdG10KiY+KGRnaSwgZGdlKSB7fQorICBTdG10SXRlcmF0b3IoY29uc3QgVmFyaWFibGVBcnJheVR5cGUgKnQpCisgICAgICA6IFN0bXRJdGVyYXRvckltcGw8U3RtdEl0ZXJhdG9yLCBTdG10KiY+KHQpIHt9CisKK3ByaXZhdGU6CisgIFN0bXRJdGVyYXRvcihjb25zdCBTdG10SXRlcmF0b3JCYXNlICZSSFMpCisgICAgICA6IFN0bXRJdGVyYXRvckltcGw8U3RtdEl0ZXJhdG9yLCBTdG10IComPihSSFMpIHt9CisKKyAgaW5saW5lIGZyaWVuZCBTdG10SXRlcmF0b3IKKyAgY2FzdF9hd2F5X2NvbnN0KGNvbnN0IENvbnN0U3RtdEl0ZXJhdG9yICZSSFMpOworfTsKKworc3RydWN0IENvbnN0U3RtdEl0ZXJhdG9yIDogcHVibGljIFN0bXRJdGVyYXRvckltcGw8Q29uc3RTdG10SXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdG10Kj4geworICBleHBsaWNpdCBDb25zdFN0bXRJdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgQ29uc3RTdG10SXRlcmF0b3IoY29uc3QgU3RtdEl0ZXJhdG9yJiBSSFMpCisgICAgICA6IFN0bXRJdGVyYXRvckltcGw8Q29uc3RTdG10SXRlcmF0b3IsIGNvbnN0IFN0bXQqPihSSFMpIHt9CisKKyAgQ29uc3RTdG10SXRlcmF0b3IoU3RtdCAqIGNvbnN0ICpTKQorICAgICAgOiBTdG10SXRlcmF0b3JJbXBsPENvbnN0U3RtdEl0ZXJhdG9yLCBjb25zdCBTdG10ICo+KAorICAgICAgICAgICAgY29uc3RfY2FzdDxTdG10ICoqPihTKSkge30KK307CisKK2lubGluZSBTdG10SXRlcmF0b3IgY2FzdF9hd2F5X2NvbnN0KGNvbnN0IENvbnN0U3RtdEl0ZXJhdG9yICZSSFMpIHsKKyAgcmV0dXJuIFJIUzsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUX1NUTVRJVEVSQVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvU3RtdE5vZGVzLmluYyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9TdG10Tm9kZXMuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZmQ1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvU3RtdE5vZGVzLmluYwpAQCAtMCwwICsxLDEyODMgQEAKKy8qPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogTGlzdCBvZiBBU1Qgbm9kZXMgb2YgYSBwYXJ0aWN1bGFyIGtpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLCBkbyBub3QgZWRpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgQUJTVFJBQ1RfU1RNVAorIyAgZGVmaW5lIEFCU1RSQUNUX1NUTVQoVHlwZSkgVHlwZQorI2VuZGlmCisjaWZuZGVmIFNUTVRfUkFOR0UKKyMgIGRlZmluZSBTVE1UX1JBTkdFKEJhc2UsIEZpcnN0LCBMYXN0KQorI2VuZGlmCisKKyNpZm5kZWYgTEFTVF9TVE1UX1JBTkdFCisjICBkZWZpbmUgTEFTVF9TVE1UX1JBTkdFKEJhc2UsIEZpcnN0LCBMYXN0KSBTVE1UX1JBTkdFKEJhc2UsIEZpcnN0LCBMYXN0KQorI2VuZGlmCisKKyNpZm5kZWYgQVNNU1RNVAorIyAgZGVmaW5lIEFTTVNUTVQoVHlwZSwgQmFzZSkgU1RNVChUeXBlLCBCYXNlKQorI2VuZGlmCitBQlNUUkFDVF9TVE1UKEFTTVNUTVQoQXNtU3RtdCwgU3RtdCkpCisjaWZuZGVmIEdDQ0FTTVNUTVQKKyMgIGRlZmluZSBHQ0NBU01TVE1UKFR5cGUsIEJhc2UpIEFTTVNUTVQoVHlwZSwgQmFzZSkKKyNlbmRpZgorR0NDQVNNU1RNVChHQ0NBc21TdG10LCBBc21TdG10KQorI3VuZGVmIEdDQ0FTTVNUTVQKKworI2lmbmRlZiBNU0FTTVNUTVQKKyMgIGRlZmluZSBNU0FTTVNUTVQoVHlwZSwgQmFzZSkgQVNNU1RNVChUeXBlLCBCYXNlKQorI2VuZGlmCitNU0FTTVNUTVQoTVNBc21TdG10LCBBc21TdG10KQorI3VuZGVmIE1TQVNNU1RNVAorCitTVE1UX1JBTkdFKEFzbVN0bXQsIEdDQ0FzbVN0bXQsIE1TQXNtU3RtdCkKKworI3VuZGVmIEFTTVNUTVQKKworI2lmbmRlZiBBVFRSSUJVVEVEU1RNVAorIyAgZGVmaW5lIEFUVFJJQlVURURTVE1UKFR5cGUsIEJhc2UpIFNUTVQoVHlwZSwgQmFzZSkKKyNlbmRpZgorQVRUUklCVVRFRFNUTVQoQXR0cmlidXRlZFN0bXQsIFN0bXQpCisjdW5kZWYgQVRUUklCVVRFRFNUTVQKKworI2lmbmRlZiBCUkVBS1NUTVQKKyMgIGRlZmluZSBCUkVBS1NUTVQoVHlwZSwgQmFzZSkgU1RNVChUeXBlLCBCYXNlKQorI2VuZGlmCitCUkVBS1NUTVQoQnJlYWtTdG10LCBTdG10KQorI3VuZGVmIEJSRUFLU1RNVAorCisjaWZuZGVmIENYWENBVENIU1RNVAorIyAgZGVmaW5lIENYWENBVENIU1RNVChUeXBlLCBCYXNlKSBTVE1UKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NYWENBVENIU1RNVChDWFhDYXRjaFN0bXQsIFN0bXQpCisjdW5kZWYgQ1hYQ0FUQ0hTVE1UCisKKyNpZm5kZWYgQ1hYRk9SUkFOR0VTVE1UCisjICBkZWZpbmUgQ1hYRk9SUkFOR0VTVE1UKFR5cGUsIEJhc2UpIFNUTVQoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ1hYRk9SUkFOR0VTVE1UKENYWEZvclJhbmdlU3RtdCwgU3RtdCkKKyN1bmRlZiBDWFhGT1JSQU5HRVNUTVQKKworI2lmbmRlZiBDWFhUUllTVE1UCisjICBkZWZpbmUgQ1hYVFJZU1RNVChUeXBlLCBCYXNlKSBTVE1UKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NYWFRSWVNUTVQoQ1hYVHJ5U3RtdCwgU3RtdCkKKyN1bmRlZiBDWFhUUllTVE1UCisKKyNpZm5kZWYgQ0FQVFVSRURTVE1UCisjICBkZWZpbmUgQ0FQVFVSRURTVE1UKFR5cGUsIEJhc2UpIFNUTVQoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ0FQVFVSRURTVE1UKENhcHR1cmVkU3RtdCwgU3RtdCkKKyN1bmRlZiBDQVBUVVJFRFNUTVQKKworI2lmbmRlZiBDT01QT1VORFNUTVQKKyMgIGRlZmluZSBDT01QT1VORFNUTVQoVHlwZSwgQmFzZSkgU1RNVChUeXBlLCBCYXNlKQorI2VuZGlmCitDT01QT1VORFNUTVQoQ29tcG91bmRTdG10LCBTdG10KQorI3VuZGVmIENPTVBPVU5EU1RNVAorCisjaWZuZGVmIENPTlRJTlVFU1RNVAorIyAgZGVmaW5lIENPTlRJTlVFU1RNVChUeXBlLCBCYXNlKSBTVE1UKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NPTlRJTlVFU1RNVChDb250aW51ZVN0bXQsIFN0bXQpCisjdW5kZWYgQ09OVElOVUVTVE1UCisKKyNpZm5kZWYgQ09SRVRVUk5TVE1UCisjICBkZWZpbmUgQ09SRVRVUk5TVE1UKFR5cGUsIEJhc2UpIFNUTVQoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ09SRVRVUk5TVE1UKENvcmV0dXJuU3RtdCwgU3RtdCkKKyN1bmRlZiBDT1JFVFVSTlNUTVQKKworI2lmbmRlZiBDT1JPVVRJTkVCT0RZU1RNVAorIyAgZGVmaW5lIENPUk9VVElORUJPRFlTVE1UKFR5cGUsIEJhc2UpIFNUTVQoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ09ST1VUSU5FQk9EWVNUTVQoQ29yb3V0aW5lQm9keVN0bXQsIFN0bXQpCisjdW5kZWYgQ09ST1VUSU5FQk9EWVNUTVQKKworI2lmbmRlZiBERUNMU1RNVAorIyAgZGVmaW5lIERFQ0xTVE1UKFR5cGUsIEJhc2UpIFNUTVQoVHlwZSwgQmFzZSkKKyNlbmRpZgorREVDTFNUTVQoRGVjbFN0bXQsIFN0bXQpCisjdW5kZWYgREVDTFNUTVQKKworI2lmbmRlZiBET1NUTVQKKyMgIGRlZmluZSBET1NUTVQoVHlwZSwgQmFzZSkgU1RNVChUeXBlLCBCYXNlKQorI2VuZGlmCitET1NUTVQoRG9TdG10LCBTdG10KQorI3VuZGVmIERPU1RNVAorCisjaWZuZGVmIEVYUFIKKyMgIGRlZmluZSBFWFBSKFR5cGUsIEJhc2UpIFNUTVQoVHlwZSwgQmFzZSkKKyNlbmRpZgorQUJTVFJBQ1RfU1RNVChFWFBSKEV4cHIsIFN0bXQpKQorI2lmbmRlZiBBQlNUUkFDVENPTkRJVElPTkFMT1BFUkFUT1IKKyMgIGRlZmluZSBBQlNUUkFDVENPTkRJVElPTkFMT1BFUkFUT1IoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitBQlNUUkFDVF9TVE1UKEFCU1RSQUNUQ09ORElUSU9OQUxPUEVSQVRPUihBYnN0cmFjdENvbmRpdGlvbmFsT3BlcmF0b3IsIEV4cHIpKQorI2lmbmRlZiBCSU5BUllDT05ESVRJT05BTE9QRVJBVE9SCisjICBkZWZpbmUgQklOQVJZQ09ORElUSU9OQUxPUEVSQVRPUihUeXBlLCBCYXNlKSBBQlNUUkFDVENPTkRJVElPTkFMT1BFUkFUT1IoVHlwZSwgQmFzZSkKKyNlbmRpZgorQklOQVJZQ09ORElUSU9OQUxPUEVSQVRPUihCaW5hcnlDb25kaXRpb25hbE9wZXJhdG9yLCBBYnN0cmFjdENvbmRpdGlvbmFsT3BlcmF0b3IpCisjdW5kZWYgQklOQVJZQ09ORElUSU9OQUxPUEVSQVRPUgorCisjaWZuZGVmIENPTkRJVElPTkFMT1BFUkFUT1IKKyMgIGRlZmluZSBDT05ESVRJT05BTE9QRVJBVE9SKFR5cGUsIEJhc2UpIEFCU1RSQUNUQ09ORElUSU9OQUxPUEVSQVRPUihUeXBlLCBCYXNlKQorI2VuZGlmCitDT05ESVRJT05BTE9QRVJBVE9SKENvbmRpdGlvbmFsT3BlcmF0b3IsIEFic3RyYWN0Q29uZGl0aW9uYWxPcGVyYXRvcikKKyN1bmRlZiBDT05ESVRJT05BTE9QRVJBVE9SCisKK1NUTVRfUkFOR0UoQWJzdHJhY3RDb25kaXRpb25hbE9wZXJhdG9yLCBCaW5hcnlDb25kaXRpb25hbE9wZXJhdG9yLCBDb25kaXRpb25hbE9wZXJhdG9yKQorCisjdW5kZWYgQUJTVFJBQ1RDT05ESVRJT05BTE9QRVJBVE9SCisKKyNpZm5kZWYgQUREUkxBQkVMRVhQUgorIyAgZGVmaW5lIEFERFJMQUJFTEVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitBRERSTEFCRUxFWFBSKEFkZHJMYWJlbEV4cHIsIEV4cHIpCisjdW5kZWYgQUREUkxBQkVMRVhQUgorCisjaWZuZGVmIEFSUkFZSU5JVElOREVYRVhQUgorIyAgZGVmaW5lIEFSUkFZSU5JVElOREVYRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0FSUkFZSU5JVElOREVYRVhQUihBcnJheUluaXRJbmRleEV4cHIsIEV4cHIpCisjdW5kZWYgQVJSQVlJTklUSU5ERVhFWFBSCisKKyNpZm5kZWYgQVJSQVlJTklUTE9PUEVYUFIKKyMgIGRlZmluZSBBUlJBWUlOSVRMT09QRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0FSUkFZSU5JVExPT1BFWFBSKEFycmF5SW5pdExvb3BFeHByLCBFeHByKQorI3VuZGVmIEFSUkFZSU5JVExPT1BFWFBSCisKKyNpZm5kZWYgQVJSQVlTVUJTQ1JJUFRFWFBSCisjICBkZWZpbmUgQVJSQVlTVUJTQ1JJUFRFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorQVJSQVlTVUJTQ1JJUFRFWFBSKEFycmF5U3Vic2NyaXB0RXhwciwgRXhwcikKKyN1bmRlZiBBUlJBWVNVQlNDUklQVEVYUFIKKworI2lmbmRlZiBBUlJBWVRZUEVUUkFJVEVYUFIKKyMgIGRlZmluZSBBUlJBWVRZUEVUUkFJVEVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitBUlJBWVRZUEVUUkFJVEVYUFIoQXJyYXlUeXBlVHJhaXRFeHByLCBFeHByKQorI3VuZGVmIEFSUkFZVFlQRVRSQUlURVhQUgorCisjaWZuZGVmIEFTVFlQRUVYUFIKKyMgIGRlZmluZSBBU1RZUEVFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorQVNUWVBFRVhQUihBc1R5cGVFeHByLCBFeHByKQorI3VuZGVmIEFTVFlQRUVYUFIKKworI2lmbmRlZiBBVE9NSUNFWFBSCisjICBkZWZpbmUgQVRPTUlDRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0FUT01JQ0VYUFIoQXRvbWljRXhwciwgRXhwcikKKyN1bmRlZiBBVE9NSUNFWFBSCisKKyNpZm5kZWYgQklOQVJZT1BFUkFUT1IKKyMgIGRlZmluZSBCSU5BUllPUEVSQVRPUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0JJTkFSWU9QRVJBVE9SKEJpbmFyeU9wZXJhdG9yLCBFeHByKQorI2lmbmRlZiBDT01QT1VOREFTU0lHTk9QRVJBVE9SCisjICBkZWZpbmUgQ09NUE9VTkRBU1NJR05PUEVSQVRPUihUeXBlLCBCYXNlKSBCSU5BUllPUEVSQVRPUihUeXBlLCBCYXNlKQorI2VuZGlmCitDT01QT1VOREFTU0lHTk9QRVJBVE9SKENvbXBvdW5kQXNzaWduT3BlcmF0b3IsIEJpbmFyeU9wZXJhdG9yKQorI3VuZGVmIENPTVBPVU5EQVNTSUdOT1BFUkFUT1IKKworU1RNVF9SQU5HRShCaW5hcnlPcGVyYXRvciwgQmluYXJ5T3BlcmF0b3IsIENvbXBvdW5kQXNzaWduT3BlcmF0b3IpCisKKyN1bmRlZiBCSU5BUllPUEVSQVRPUgorCisjaWZuZGVmIEJMT0NLRVhQUgorIyAgZGVmaW5lIEJMT0NLRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0JMT0NLRVhQUihCbG9ja0V4cHIsIEV4cHIpCisjdW5kZWYgQkxPQ0tFWFBSCisKKyNpZm5kZWYgQ1hYQklORFRFTVBPUkFSWUVYUFIKKyMgIGRlZmluZSBDWFhCSU5EVEVNUE9SQVJZRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NYWEJJTkRURU1QT1JBUllFWFBSKENYWEJpbmRUZW1wb3JhcnlFeHByLCBFeHByKQorI3VuZGVmIENYWEJJTkRURU1QT1JBUllFWFBSCisKKyNpZm5kZWYgQ1hYQk9PTExJVEVSQUxFWFBSCisjICBkZWZpbmUgQ1hYQk9PTExJVEVSQUxFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ1hYQk9PTExJVEVSQUxFWFBSKENYWEJvb2xMaXRlcmFsRXhwciwgRXhwcikKKyN1bmRlZiBDWFhCT09MTElURVJBTEVYUFIKKworI2lmbmRlZiBDWFhDT05TVFJVQ1RFWFBSCisjICBkZWZpbmUgQ1hYQ09OU1RSVUNURVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NYWENPTlNUUlVDVEVYUFIoQ1hYQ29uc3RydWN0RXhwciwgRXhwcikKKyNpZm5kZWYgQ1hYVEVNUE9SQVJZT0JKRUNURVhQUgorIyAgZGVmaW5lIENYWFRFTVBPUkFSWU9CSkVDVEVYUFIoVHlwZSwgQmFzZSkgQ1hYQ09OU1RSVUNURVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitDWFhURU1QT1JBUllPQkpFQ1RFWFBSKENYWFRlbXBvcmFyeU9iamVjdEV4cHIsIENYWENvbnN0cnVjdEV4cHIpCisjdW5kZWYgQ1hYVEVNUE9SQVJZT0JKRUNURVhQUgorCitTVE1UX1JBTkdFKENYWENvbnN0cnVjdEV4cHIsIENYWENvbnN0cnVjdEV4cHIsIENYWFRlbXBvcmFyeU9iamVjdEV4cHIpCisKKyN1bmRlZiBDWFhDT05TVFJVQ1RFWFBSCisKKyNpZm5kZWYgQ1hYREVGQVVMVEFSR0VYUFIKKyMgIGRlZmluZSBDWFhERUZBVUxUQVJHRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NYWERFRkFVTFRBUkdFWFBSKENYWERlZmF1bHRBcmdFeHByLCBFeHByKQorI3VuZGVmIENYWERFRkFVTFRBUkdFWFBSCisKKyNpZm5kZWYgQ1hYREVGQVVMVElOSVRFWFBSCisjICBkZWZpbmUgQ1hYREVGQVVMVElOSVRFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ1hYREVGQVVMVElOSVRFWFBSKENYWERlZmF1bHRJbml0RXhwciwgRXhwcikKKyN1bmRlZiBDWFhERUZBVUxUSU5JVEVYUFIKKworI2lmbmRlZiBDWFhERUxFVEVFWFBSCisjICBkZWZpbmUgQ1hYREVMRVRFRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NYWERFTEVURUVYUFIoQ1hYRGVsZXRlRXhwciwgRXhwcikKKyN1bmRlZiBDWFhERUxFVEVFWFBSCisKKyNpZm5kZWYgQ1hYREVQRU5ERU5UU0NPUEVNRU1CRVJFWFBSCisjICBkZWZpbmUgQ1hYREVQRU5ERU5UU0NPUEVNRU1CRVJFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ1hYREVQRU5ERU5UU0NPUEVNRU1CRVJFWFBSKENYWERlcGVuZGVudFNjb3BlTWVtYmVyRXhwciwgRXhwcikKKyN1bmRlZiBDWFhERVBFTkRFTlRTQ09QRU1FTUJFUkVYUFIKKworI2lmbmRlZiBDWFhGT0xERVhQUgorIyAgZGVmaW5lIENYWEZPTERFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ1hYRk9MREVYUFIoQ1hYRm9sZEV4cHIsIEV4cHIpCisjdW5kZWYgQ1hYRk9MREVYUFIKKworI2lmbmRlZiBDWFhJTkhFUklURURDVE9SSU5JVEVYUFIKKyMgIGRlZmluZSBDWFhJTkhFUklURURDVE9SSU5JVEVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitDWFhJTkhFUklURURDVE9SSU5JVEVYUFIoQ1hYSW5oZXJpdGVkQ3RvckluaXRFeHByLCBFeHByKQorI3VuZGVmIENYWElOSEVSSVRFRENUT1JJTklURVhQUgorCisjaWZuZGVmIENYWE5FV0VYUFIKKyMgIGRlZmluZSBDWFhORVdFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ1hYTkVXRVhQUihDWFhOZXdFeHByLCBFeHByKQorI3VuZGVmIENYWE5FV0VYUFIKKworI2lmbmRlZiBDWFhOT0VYQ0VQVEVYUFIKKyMgIGRlZmluZSBDWFhOT0VYQ0VQVEVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitDWFhOT0VYQ0VQVEVYUFIoQ1hYTm9leGNlcHRFeHByLCBFeHByKQorI3VuZGVmIENYWE5PRVhDRVBURVhQUgorCisjaWZuZGVmIENYWE5VTExQVFJMSVRFUkFMRVhQUgorIyAgZGVmaW5lIENYWE5VTExQVFJMSVRFUkFMRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NYWE5VTExQVFJMSVRFUkFMRVhQUihDWFhOdWxsUHRyTGl0ZXJhbEV4cHIsIEV4cHIpCisjdW5kZWYgQ1hYTlVMTFBUUkxJVEVSQUxFWFBSCisKKyNpZm5kZWYgQ1hYUFNFVURPREVTVFJVQ1RPUkVYUFIKKyMgIGRlZmluZSBDWFhQU0VVRE9ERVNUUlVDVE9SRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NYWFBTRVVET0RFU1RSVUNUT1JFWFBSKENYWFBzZXVkb0Rlc3RydWN0b3JFeHByLCBFeHByKQorI3VuZGVmIENYWFBTRVVET0RFU1RSVUNUT1JFWFBSCisKKyNpZm5kZWYgQ1hYU0NBTEFSVkFMVUVJTklURVhQUgorIyAgZGVmaW5lIENYWFNDQUxBUlZBTFVFSU5JVEVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitDWFhTQ0FMQVJWQUxVRUlOSVRFWFBSKENYWFNjYWxhclZhbHVlSW5pdEV4cHIsIEV4cHIpCisjdW5kZWYgQ1hYU0NBTEFSVkFMVUVJTklURVhQUgorCisjaWZuZGVmIENYWFNURElOSVRJQUxJWkVSTElTVEVYUFIKKyMgIGRlZmluZSBDWFhTVERJTklUSUFMSVpFUkxJU1RFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ1hYU1RESU5JVElBTElaRVJMSVNURVhQUihDWFhTdGRJbml0aWFsaXplckxpc3RFeHByLCBFeHByKQorI3VuZGVmIENYWFNURElOSVRJQUxJWkVSTElTVEVYUFIKKworI2lmbmRlZiBDWFhUSElTRVhQUgorIyAgZGVmaW5lIENYWFRISVNFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ1hYVEhJU0VYUFIoQ1hYVGhpc0V4cHIsIEV4cHIpCisjdW5kZWYgQ1hYVEhJU0VYUFIKKworI2lmbmRlZiBDWFhUSFJPV0VYUFIKKyMgIGRlZmluZSBDWFhUSFJPV0VYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitDWFhUSFJPV0VYUFIoQ1hYVGhyb3dFeHByLCBFeHByKQorI3VuZGVmIENYWFRIUk9XRVhQUgorCisjaWZuZGVmIENYWFRZUEVJREVYUFIKKyMgIGRlZmluZSBDWFhUWVBFSURFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ1hYVFlQRUlERVhQUihDWFhUeXBlaWRFeHByLCBFeHByKQorI3VuZGVmIENYWFRZUEVJREVYUFIKKworI2lmbmRlZiBDWFhVTlJFU09MVkVEQ09OU1RSVUNURVhQUgorIyAgZGVmaW5lIENYWFVOUkVTT0xWRURDT05TVFJVQ1RFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ1hYVU5SRVNPTFZFRENPTlNUUlVDVEVYUFIoQ1hYVW5yZXNvbHZlZENvbnN0cnVjdEV4cHIsIEV4cHIpCisjdW5kZWYgQ1hYVU5SRVNPTFZFRENPTlNUUlVDVEVYUFIKKworI2lmbmRlZiBDWFhVVUlET0ZFWFBSCisjICBkZWZpbmUgQ1hYVVVJRE9GRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NYWFVVSURPRkVYUFIoQ1hYVXVpZG9mRXhwciwgRXhwcikKKyN1bmRlZiBDWFhVVUlET0ZFWFBSCisKKyNpZm5kZWYgQ0FMTEVYUFIKKyMgIGRlZmluZSBDQUxMRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NBTExFWFBSKENhbGxFeHByLCBFeHByKQorI2lmbmRlZiBDVURBS0VSTkVMQ0FMTEVYUFIKKyMgIGRlZmluZSBDVURBS0VSTkVMQ0FMTEVYUFIoVHlwZSwgQmFzZSkgQ0FMTEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ1VEQUtFUk5FTENBTExFWFBSKENVREFLZXJuZWxDYWxsRXhwciwgQ2FsbEV4cHIpCisjdW5kZWYgQ1VEQUtFUk5FTENBTExFWFBSCisKKyNpZm5kZWYgQ1hYTUVNQkVSQ0FMTEVYUFIKKyMgIGRlZmluZSBDWFhNRU1CRVJDQUxMRVhQUihUeXBlLCBCYXNlKSBDQUxMRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitDWFhNRU1CRVJDQUxMRVhQUihDWFhNZW1iZXJDYWxsRXhwciwgQ2FsbEV4cHIpCisjdW5kZWYgQ1hYTUVNQkVSQ0FMTEVYUFIKKworI2lmbmRlZiBDWFhPUEVSQVRPUkNBTExFWFBSCisjICBkZWZpbmUgQ1hYT1BFUkFUT1JDQUxMRVhQUihUeXBlLCBCYXNlKSBDQUxMRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitDWFhPUEVSQVRPUkNBTExFWFBSKENYWE9wZXJhdG9yQ2FsbEV4cHIsIENhbGxFeHByKQorI3VuZGVmIENYWE9QRVJBVE9SQ0FMTEVYUFIKKworI2lmbmRlZiBVU0VSREVGSU5FRExJVEVSQUwKKyMgIGRlZmluZSBVU0VSREVGSU5FRExJVEVSQUwoVHlwZSwgQmFzZSkgQ0FMTEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorVVNFUkRFRklORURMSVRFUkFMKFVzZXJEZWZpbmVkTGl0ZXJhbCwgQ2FsbEV4cHIpCisjdW5kZWYgVVNFUkRFRklORURMSVRFUkFMCisKK1NUTVRfUkFOR0UoQ2FsbEV4cHIsIENhbGxFeHByLCBVc2VyRGVmaW5lZExpdGVyYWwpCisKKyN1bmRlZiBDQUxMRVhQUgorCisjaWZuZGVmIENBU1RFWFBSCisjICBkZWZpbmUgQ0FTVEVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitBQlNUUkFDVF9TVE1UKENBU1RFWFBSKENhc3RFeHByLCBFeHByKSkKKyNpZm5kZWYgRVhQTElDSVRDQVNURVhQUgorIyAgZGVmaW5lIEVYUExJQ0lUQ0FTVEVYUFIoVHlwZSwgQmFzZSkgQ0FTVEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorQUJTVFJBQ1RfU1RNVChFWFBMSUNJVENBU1RFWFBSKEV4cGxpY2l0Q2FzdEV4cHIsIENhc3RFeHByKSkKKyNpZm5kZWYgQ1NUWUxFQ0FTVEVYUFIKKyMgIGRlZmluZSBDU1RZTEVDQVNURVhQUihUeXBlLCBCYXNlKSBFWFBMSUNJVENBU1RFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NTVFlMRUNBU1RFWFBSKENTdHlsZUNhc3RFeHByLCBFeHBsaWNpdENhc3RFeHByKQorI3VuZGVmIENTVFlMRUNBU1RFWFBSCisKKyNpZm5kZWYgQ1hYRlVOQ1RJT05BTENBU1RFWFBSCisjICBkZWZpbmUgQ1hYRlVOQ1RJT05BTENBU1RFWFBSKFR5cGUsIEJhc2UpIEVYUExJQ0lUQ0FTVEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ1hYRlVOQ1RJT05BTENBU1RFWFBSKENYWEZ1bmN0aW9uYWxDYXN0RXhwciwgRXhwbGljaXRDYXN0RXhwcikKKyN1bmRlZiBDWFhGVU5DVElPTkFMQ0FTVEVYUFIKKworI2lmbmRlZiBDWFhOQU1FRENBU1RFWFBSCisjICBkZWZpbmUgQ1hYTkFNRURDQVNURVhQUihUeXBlLCBCYXNlKSBFWFBMSUNJVENBU1RFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0FCU1RSQUNUX1NUTVQoQ1hYTkFNRURDQVNURVhQUihDWFhOYW1lZENhc3RFeHByLCBFeHBsaWNpdENhc3RFeHByKSkKKyNpZm5kZWYgQ1hYQ09OU1RDQVNURVhQUgorIyAgZGVmaW5lIENYWENPTlNUQ0FTVEVYUFIoVHlwZSwgQmFzZSkgQ1hYTkFNRURDQVNURVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitDWFhDT05TVENBU1RFWFBSKENYWENvbnN0Q2FzdEV4cHIsIENYWE5hbWVkQ2FzdEV4cHIpCisjdW5kZWYgQ1hYQ09OU1RDQVNURVhQUgorCisjaWZuZGVmIENYWERZTkFNSUNDQVNURVhQUgorIyAgZGVmaW5lIENYWERZTkFNSUNDQVNURVhQUihUeXBlLCBCYXNlKSBDWFhOQU1FRENBU1RFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NYWERZTkFNSUNDQVNURVhQUihDWFhEeW5hbWljQ2FzdEV4cHIsIENYWE5hbWVkQ2FzdEV4cHIpCisjdW5kZWYgQ1hYRFlOQU1JQ0NBU1RFWFBSCisKKyNpZm5kZWYgQ1hYUkVJTlRFUlBSRVRDQVNURVhQUgorIyAgZGVmaW5lIENYWFJFSU5URVJQUkVUQ0FTVEVYUFIoVHlwZSwgQmFzZSkgQ1hYTkFNRURDQVNURVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitDWFhSRUlOVEVSUFJFVENBU1RFWFBSKENYWFJlaW50ZXJwcmV0Q2FzdEV4cHIsIENYWE5hbWVkQ2FzdEV4cHIpCisjdW5kZWYgQ1hYUkVJTlRFUlBSRVRDQVNURVhQUgorCisjaWZuZGVmIENYWFNUQVRJQ0NBU1RFWFBSCisjICBkZWZpbmUgQ1hYU1RBVElDQ0FTVEVYUFIoVHlwZSwgQmFzZSkgQ1hYTkFNRURDQVNURVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitDWFhTVEFUSUNDQVNURVhQUihDWFhTdGF0aWNDYXN0RXhwciwgQ1hYTmFtZWRDYXN0RXhwcikKKyN1bmRlZiBDWFhTVEFUSUNDQVNURVhQUgorCitTVE1UX1JBTkdFKENYWE5hbWVkQ2FzdEV4cHIsIENYWENvbnN0Q2FzdEV4cHIsIENYWFN0YXRpY0Nhc3RFeHByKQorCisjdW5kZWYgQ1hYTkFNRURDQVNURVhQUgorCisjaWZuZGVmIE9CSkNCUklER0VEQ0FTVEVYUFIKKyMgIGRlZmluZSBPQkpDQlJJREdFRENBU1RFWFBSKFR5cGUsIEJhc2UpIEVYUExJQ0lUQ0FTVEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorT0JKQ0JSSURHRURDQVNURVhQUihPYmpDQnJpZGdlZENhc3RFeHByLCBFeHBsaWNpdENhc3RFeHByKQorI3VuZGVmIE9CSkNCUklER0VEQ0FTVEVYUFIKKworU1RNVF9SQU5HRShFeHBsaWNpdENhc3RFeHByLCBDU3R5bGVDYXN0RXhwciwgT2JqQ0JyaWRnZWRDYXN0RXhwcikKKworI3VuZGVmIEVYUExJQ0lUQ0FTVEVYUFIKKworI2lmbmRlZiBJTVBMSUNJVENBU1RFWFBSCisjICBkZWZpbmUgSU1QTElDSVRDQVNURVhQUihUeXBlLCBCYXNlKSBDQVNURVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitJTVBMSUNJVENBU1RFWFBSKEltcGxpY2l0Q2FzdEV4cHIsIENhc3RFeHByKQorI3VuZGVmIElNUExJQ0lUQ0FTVEVYUFIKKworU1RNVF9SQU5HRShDYXN0RXhwciwgQ1N0eWxlQ2FzdEV4cHIsIEltcGxpY2l0Q2FzdEV4cHIpCisKKyN1bmRlZiBDQVNURVhQUgorCisjaWZuZGVmIENIQVJBQ1RFUkxJVEVSQUwKKyMgIGRlZmluZSBDSEFSQUNURVJMSVRFUkFMKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ0hBUkFDVEVSTElURVJBTChDaGFyYWN0ZXJMaXRlcmFsLCBFeHByKQorI3VuZGVmIENIQVJBQ1RFUkxJVEVSQUwKKworI2lmbmRlZiBDSE9PU0VFWFBSCisjICBkZWZpbmUgQ0hPT1NFRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NIT09TRUVYUFIoQ2hvb3NlRXhwciwgRXhwcikKKyN1bmRlZiBDSE9PU0VFWFBSCisKKyNpZm5kZWYgQ09NUE9VTkRMSVRFUkFMRVhQUgorIyAgZGVmaW5lIENPTVBPVU5ETElURVJBTEVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitDT01QT1VORExJVEVSQUxFWFBSKENvbXBvdW5kTGl0ZXJhbEV4cHIsIEV4cHIpCisjdW5kZWYgQ09NUE9VTkRMSVRFUkFMRVhQUgorCisjaWZuZGVmIENPTlZFUlRWRUNUT1JFWFBSCisjICBkZWZpbmUgQ09OVkVSVFZFQ1RPUkVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitDT05WRVJUVkVDVE9SRVhQUihDb252ZXJ0VmVjdG9yRXhwciwgRXhwcikKKyN1bmRlZiBDT05WRVJUVkVDVE9SRVhQUgorCisjaWZuZGVmIENPUk9VVElORVNVU1BFTkRFWFBSCisjICBkZWZpbmUgQ09ST1VUSU5FU1VTUEVOREVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitBQlNUUkFDVF9TVE1UKENPUk9VVElORVNVU1BFTkRFWFBSKENvcm91dGluZVN1c3BlbmRFeHByLCBFeHByKSkKKyNpZm5kZWYgQ09BV0FJVEVYUFIKKyMgIGRlZmluZSBDT0FXQUlURVhQUihUeXBlLCBCYXNlKSBDT1JPVVRJTkVTVVNQRU5ERVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitDT0FXQUlURVhQUihDb2F3YWl0RXhwciwgQ29yb3V0aW5lU3VzcGVuZEV4cHIpCisjdW5kZWYgQ09BV0FJVEVYUFIKKworI2lmbmRlZiBDT1lJRUxERVhQUgorIyAgZGVmaW5lIENPWUlFTERFWFBSKFR5cGUsIEJhc2UpIENPUk9VVElORVNVU1BFTkRFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0NPWUlFTERFWFBSKENveWllbGRFeHByLCBDb3JvdXRpbmVTdXNwZW5kRXhwcikKKyN1bmRlZiBDT1lJRUxERVhQUgorCitTVE1UX1JBTkdFKENvcm91dGluZVN1c3BlbmRFeHByLCBDb2F3YWl0RXhwciwgQ295aWVsZEV4cHIpCisKKyN1bmRlZiBDT1JPVVRJTkVTVVNQRU5ERVhQUgorCisjaWZuZGVmIERFQ0xSRUZFWFBSCisjICBkZWZpbmUgREVDTFJFRkVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitERUNMUkVGRVhQUihEZWNsUmVmRXhwciwgRXhwcikKKyN1bmRlZiBERUNMUkVGRVhQUgorCisjaWZuZGVmIERFUEVOREVOVENPQVdBSVRFWFBSCisjICBkZWZpbmUgREVQRU5ERU5UQ09BV0FJVEVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitERVBFTkRFTlRDT0FXQUlURVhQUihEZXBlbmRlbnRDb2F3YWl0RXhwciwgRXhwcikKKyN1bmRlZiBERVBFTkRFTlRDT0FXQUlURVhQUgorCisjaWZuZGVmIERFUEVOREVOVFNDT1BFREVDTFJFRkVYUFIKKyMgIGRlZmluZSBERVBFTkRFTlRTQ09QRURFQ0xSRUZFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorREVQRU5ERU5UU0NPUEVERUNMUkVGRVhQUihEZXBlbmRlbnRTY29wZURlY2xSZWZFeHByLCBFeHByKQorI3VuZGVmIERFUEVOREVOVFNDT1BFREVDTFJFRkVYUFIKKworI2lmbmRlZiBERVNJR05BVEVESU5JVEVYUFIKKyMgIGRlZmluZSBERVNJR05BVEVESU5JVEVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitERVNJR05BVEVESU5JVEVYUFIoRGVzaWduYXRlZEluaXRFeHByLCBFeHByKQorI3VuZGVmIERFU0lHTkFURURJTklURVhQUgorCisjaWZuZGVmIERFU0lHTkFURURJTklUVVBEQVRFRVhQUgorIyAgZGVmaW5lIERFU0lHTkFURURJTklUVVBEQVRFRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0RFU0lHTkFURURJTklUVVBEQVRFRVhQUihEZXNpZ25hdGVkSW5pdFVwZGF0ZUV4cHIsIEV4cHIpCisjdW5kZWYgREVTSUdOQVRFRElOSVRVUERBVEVFWFBSCisKKyNpZm5kZWYgRVhQUldJVEhDTEVBTlVQUworIyAgZGVmaW5lIEVYUFJXSVRIQ0xFQU5VUFMoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitFWFBSV0lUSENMRUFOVVBTKEV4cHJXaXRoQ2xlYW51cHMsIEV4cHIpCisjdW5kZWYgRVhQUldJVEhDTEVBTlVQUworCisjaWZuZGVmIEVYUFJFU1NJT05UUkFJVEVYUFIKKyMgIGRlZmluZSBFWFBSRVNTSU9OVFJBSVRFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorRVhQUkVTU0lPTlRSQUlURVhQUihFeHByZXNzaW9uVHJhaXRFeHByLCBFeHByKQorI3VuZGVmIEVYUFJFU1NJT05UUkFJVEVYUFIKKworI2lmbmRlZiBFWFRWRUNUT1JFTEVNRU5URVhQUgorIyAgZGVmaW5lIEVYVFZFQ1RPUkVMRU1FTlRFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorRVhUVkVDVE9SRUxFTUVOVEVYUFIoRXh0VmVjdG9yRWxlbWVudEV4cHIsIEV4cHIpCisjdW5kZWYgRVhUVkVDVE9SRUxFTUVOVEVYUFIKKworI2lmbmRlZiBGTE9BVElOR0xJVEVSQUwKKyMgIGRlZmluZSBGTE9BVElOR0xJVEVSQUwoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitGTE9BVElOR0xJVEVSQUwoRmxvYXRpbmdMaXRlcmFsLCBFeHByKQorI3VuZGVmIEZMT0FUSU5HTElURVJBTAorCisjaWZuZGVmIEZVTkNUSU9OUEFSTVBBQ0tFWFBSCisjICBkZWZpbmUgRlVOQ1RJT05QQVJNUEFDS0VYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitGVU5DVElPTlBBUk1QQUNLRVhQUihGdW5jdGlvblBhcm1QYWNrRXhwciwgRXhwcikKKyN1bmRlZiBGVU5DVElPTlBBUk1QQUNLRVhQUgorCisjaWZuZGVmIEdOVU5VTExFWFBSCisjICBkZWZpbmUgR05VTlVMTEVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitHTlVOVUxMRVhQUihHTlVOdWxsRXhwciwgRXhwcikKKyN1bmRlZiBHTlVOVUxMRVhQUgorCisjaWZuZGVmIEdFTkVSSUNTRUxFQ1RJT05FWFBSCisjICBkZWZpbmUgR0VORVJJQ1NFTEVDVElPTkVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitHRU5FUklDU0VMRUNUSU9ORVhQUihHZW5lcmljU2VsZWN0aW9uRXhwciwgRXhwcikKKyN1bmRlZiBHRU5FUklDU0VMRUNUSU9ORVhQUgorCisjaWZuZGVmIElNQUdJTkFSWUxJVEVSQUwKKyMgIGRlZmluZSBJTUFHSU5BUllMSVRFUkFMKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorSU1BR0lOQVJZTElURVJBTChJbWFnaW5hcnlMaXRlcmFsLCBFeHByKQorI3VuZGVmIElNQUdJTkFSWUxJVEVSQUwKKworI2lmbmRlZiBJTVBMSUNJVFZBTFVFSU5JVEVYUFIKKyMgIGRlZmluZSBJTVBMSUNJVFZBTFVFSU5JVEVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitJTVBMSUNJVFZBTFVFSU5JVEVYUFIoSW1wbGljaXRWYWx1ZUluaXRFeHByLCBFeHByKQorI3VuZGVmIElNUExJQ0lUVkFMVUVJTklURVhQUgorCisjaWZuZGVmIElOSVRMSVNURVhQUgorIyAgZGVmaW5lIElOSVRMSVNURVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0lOSVRMSVNURVhQUihJbml0TGlzdEV4cHIsIEV4cHIpCisjdW5kZWYgSU5JVExJU1RFWFBSCisKKyNpZm5kZWYgSU5URUdFUkxJVEVSQUwKKyMgIGRlZmluZSBJTlRFR0VSTElURVJBTChUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0lOVEVHRVJMSVRFUkFMKEludGVnZXJMaXRlcmFsLCBFeHByKQorI3VuZGVmIElOVEVHRVJMSVRFUkFMCisKKyNpZm5kZWYgTEFNQkRBRVhQUgorIyAgZGVmaW5lIExBTUJEQUVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitMQU1CREFFWFBSKExhbWJkYUV4cHIsIEV4cHIpCisjdW5kZWYgTEFNQkRBRVhQUgorCisjaWZuZGVmIE1TUFJPUEVSVFlSRUZFWFBSCisjICBkZWZpbmUgTVNQUk9QRVJUWVJFRkVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitNU1BST1BFUlRZUkVGRVhQUihNU1Byb3BlcnR5UmVmRXhwciwgRXhwcikKKyN1bmRlZiBNU1BST1BFUlRZUkVGRVhQUgorCisjaWZuZGVmIE1TUFJPUEVSVFlTVUJTQ1JJUFRFWFBSCisjICBkZWZpbmUgTVNQUk9QRVJUWVNVQlNDUklQVEVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitNU1BST1BFUlRZU1VCU0NSSVBURVhQUihNU1Byb3BlcnR5U3Vic2NyaXB0RXhwciwgRXhwcikKKyN1bmRlZiBNU1BST1BFUlRZU1VCU0NSSVBURVhQUgorCisjaWZuZGVmIE1BVEVSSUFMSVpFVEVNUE9SQVJZRVhQUgorIyAgZGVmaW5lIE1BVEVSSUFMSVpFVEVNUE9SQVJZRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK01BVEVSSUFMSVpFVEVNUE9SQVJZRVhQUihNYXRlcmlhbGl6ZVRlbXBvcmFyeUV4cHIsIEV4cHIpCisjdW5kZWYgTUFURVJJQUxJWkVURU1QT1JBUllFWFBSCisKKyNpZm5kZWYgTUVNQkVSRVhQUgorIyAgZGVmaW5lIE1FTUJFUkVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitNRU1CRVJFWFBSKE1lbWJlckV4cHIsIEV4cHIpCisjdW5kZWYgTUVNQkVSRVhQUgorCisjaWZuZGVmIE5PSU5JVEVYUFIKKyMgIGRlZmluZSBOT0lOSVRFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorTk9JTklURVhQUihOb0luaXRFeHByLCBFeHByKQorI3VuZGVmIE5PSU5JVEVYUFIKKworI2lmbmRlZiBPTVBBUlJBWVNFQ1RJT05FWFBSCisjICBkZWZpbmUgT01QQVJSQVlTRUNUSU9ORVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUEFSUkFZU0VDVElPTkVYUFIoT01QQXJyYXlTZWN0aW9uRXhwciwgRXhwcikKKyN1bmRlZiBPTVBBUlJBWVNFQ1RJT05FWFBSCisKKyNpZm5kZWYgT0JKQ0FSUkFZTElURVJBTAorIyAgZGVmaW5lIE9CSkNBUlJBWUxJVEVSQUwoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitPQkpDQVJSQVlMSVRFUkFMKE9iakNBcnJheUxpdGVyYWwsIEV4cHIpCisjdW5kZWYgT0JKQ0FSUkFZTElURVJBTAorCisjaWZuZGVmIE9CSkNBVkFJTEFCSUxJVFlDSEVDS0VYUFIKKyMgIGRlZmluZSBPQkpDQVZBSUxBQklMSVRZQ0hFQ0tFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorT0JKQ0FWQUlMQUJJTElUWUNIRUNLRVhQUihPYmpDQXZhaWxhYmlsaXR5Q2hlY2tFeHByLCBFeHByKQorI3VuZGVmIE9CSkNBVkFJTEFCSUxJVFlDSEVDS0VYUFIKKworI2lmbmRlZiBPQkpDQk9PTExJVEVSQUxFWFBSCisjICBkZWZpbmUgT0JKQ0JPT0xMSVRFUkFMRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK09CSkNCT09MTElURVJBTEVYUFIoT2JqQ0Jvb2xMaXRlcmFsRXhwciwgRXhwcikKKyN1bmRlZiBPQkpDQk9PTExJVEVSQUxFWFBSCisKKyNpZm5kZWYgT0JKQ0JPWEVERVhQUgorIyAgZGVmaW5lIE9CSkNCT1hFREVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitPQkpDQk9YRURFWFBSKE9iakNCb3hlZEV4cHIsIEV4cHIpCisjdW5kZWYgT0JKQ0JPWEVERVhQUgorCisjaWZuZGVmIE9CSkNESUNUSU9OQVJZTElURVJBTAorIyAgZGVmaW5lIE9CSkNESUNUSU9OQVJZTElURVJBTChUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK09CSkNESUNUSU9OQVJZTElURVJBTChPYmpDRGljdGlvbmFyeUxpdGVyYWwsIEV4cHIpCisjdW5kZWYgT0JKQ0RJQ1RJT05BUllMSVRFUkFMCisKKyNpZm5kZWYgT0JKQ0VOQ09ERUVYUFIKKyMgIGRlZmluZSBPQkpDRU5DT0RFRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK09CSkNFTkNPREVFWFBSKE9iakNFbmNvZGVFeHByLCBFeHByKQorI3VuZGVmIE9CSkNFTkNPREVFWFBSCisKKyNpZm5kZWYgT0JKQ0lORElSRUNUQ09QWVJFU1RPUkVFWFBSCisjICBkZWZpbmUgT0JKQ0lORElSRUNUQ09QWVJFU1RPUkVFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorT0JKQ0lORElSRUNUQ09QWVJFU1RPUkVFWFBSKE9iakNJbmRpcmVjdENvcHlSZXN0b3JlRXhwciwgRXhwcikKKyN1bmRlZiBPQkpDSU5ESVJFQ1RDT1BZUkVTVE9SRUVYUFIKKworI2lmbmRlZiBPQkpDSVNBRVhQUgorIyAgZGVmaW5lIE9CSkNJU0FFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorT0JKQ0lTQUVYUFIoT2JqQ0lzYUV4cHIsIEV4cHIpCisjdW5kZWYgT0JKQ0lTQUVYUFIKKworI2lmbmRlZiBPQkpDSVZBUlJFRkVYUFIKKyMgIGRlZmluZSBPQkpDSVZBUlJFRkVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitPQkpDSVZBUlJFRkVYUFIoT2JqQ0l2YXJSZWZFeHByLCBFeHByKQorI3VuZGVmIE9CSkNJVkFSUkVGRVhQUgorCisjaWZuZGVmIE9CSkNNRVNTQUdFRVhQUgorIyAgZGVmaW5lIE9CSkNNRVNTQUdFRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK09CSkNNRVNTQUdFRVhQUihPYmpDTWVzc2FnZUV4cHIsIEV4cHIpCisjdW5kZWYgT0JKQ01FU1NBR0VFWFBSCisKKyNpZm5kZWYgT0JKQ1BST1BFUlRZUkVGRVhQUgorIyAgZGVmaW5lIE9CSkNQUk9QRVJUWVJFRkVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitPQkpDUFJPUEVSVFlSRUZFWFBSKE9iakNQcm9wZXJ0eVJlZkV4cHIsIEV4cHIpCisjdW5kZWYgT0JKQ1BST1BFUlRZUkVGRVhQUgorCisjaWZuZGVmIE9CSkNQUk9UT0NPTEVYUFIKKyMgIGRlZmluZSBPQkpDUFJPVE9DT0xFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorT0JKQ1BST1RPQ09MRVhQUihPYmpDUHJvdG9jb2xFeHByLCBFeHByKQorI3VuZGVmIE9CSkNQUk9UT0NPTEVYUFIKKworI2lmbmRlZiBPQkpDU0VMRUNUT1JFWFBSCisjICBkZWZpbmUgT0JKQ1NFTEVDVE9SRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK09CSkNTRUxFQ1RPUkVYUFIoT2JqQ1NlbGVjdG9yRXhwciwgRXhwcikKKyN1bmRlZiBPQkpDU0VMRUNUT1JFWFBSCisKKyNpZm5kZWYgT0JKQ1NUUklOR0xJVEVSQUwKKyMgIGRlZmluZSBPQkpDU1RSSU5HTElURVJBTChUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK09CSkNTVFJJTkdMSVRFUkFMKE9iakNTdHJpbmdMaXRlcmFsLCBFeHByKQorI3VuZGVmIE9CSkNTVFJJTkdMSVRFUkFMCisKKyNpZm5kZWYgT0JKQ1NVQlNDUklQVFJFRkVYUFIKKyMgIGRlZmluZSBPQkpDU1VCU0NSSVBUUkVGRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK09CSkNTVUJTQ1JJUFRSRUZFWFBSKE9iakNTdWJzY3JpcHRSZWZFeHByLCBFeHByKQorI3VuZGVmIE9CSkNTVUJTQ1JJUFRSRUZFWFBSCisKKyNpZm5kZWYgT0ZGU0VUT0ZFWFBSCisjICBkZWZpbmUgT0ZGU0VUT0ZFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorT0ZGU0VUT0ZFWFBSKE9mZnNldE9mRXhwciwgRXhwcikKKyN1bmRlZiBPRkZTRVRPRkVYUFIKKworI2lmbmRlZiBPUEFRVUVWQUxVRUVYUFIKKyMgIGRlZmluZSBPUEFRVUVWQUxVRUVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitPUEFRVUVWQUxVRUVYUFIoT3BhcXVlVmFsdWVFeHByLCBFeHByKQorI3VuZGVmIE9QQVFVRVZBTFVFRVhQUgorCisjaWZuZGVmIE9WRVJMT0FERVhQUgorIyAgZGVmaW5lIE9WRVJMT0FERVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK0FCU1RSQUNUX1NUTVQoT1ZFUkxPQURFWFBSKE92ZXJsb2FkRXhwciwgRXhwcikpCisjaWZuZGVmIFVOUkVTT0xWRURMT09LVVBFWFBSCisjICBkZWZpbmUgVU5SRVNPTFZFRExPT0tVUEVYUFIoVHlwZSwgQmFzZSkgT1ZFUkxPQURFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK1VOUkVTT0xWRURMT09LVVBFWFBSKFVucmVzb2x2ZWRMb29rdXBFeHByLCBPdmVybG9hZEV4cHIpCisjdW5kZWYgVU5SRVNPTFZFRExPT0tVUEVYUFIKKworI2lmbmRlZiBVTlJFU09MVkVETUVNQkVSRVhQUgorIyAgZGVmaW5lIFVOUkVTT0xWRURNRU1CRVJFWFBSKFR5cGUsIEJhc2UpIE9WRVJMT0FERVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitVTlJFU09MVkVETUVNQkVSRVhQUihVbnJlc29sdmVkTWVtYmVyRXhwciwgT3ZlcmxvYWRFeHByKQorI3VuZGVmIFVOUkVTT0xWRURNRU1CRVJFWFBSCisKK1NUTVRfUkFOR0UoT3ZlcmxvYWRFeHByLCBVbnJlc29sdmVkTG9va3VwRXhwciwgVW5yZXNvbHZlZE1lbWJlckV4cHIpCisKKyN1bmRlZiBPVkVSTE9BREVYUFIKKworI2lmbmRlZiBQQUNLRVhQQU5TSU9ORVhQUgorIyAgZGVmaW5lIFBBQ0tFWFBBTlNJT05FWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorUEFDS0VYUEFOU0lPTkVYUFIoUGFja0V4cGFuc2lvbkV4cHIsIEV4cHIpCisjdW5kZWYgUEFDS0VYUEFOU0lPTkVYUFIKKworI2lmbmRlZiBQQVJFTkVYUFIKKyMgIGRlZmluZSBQQVJFTkVYUFIoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitQQVJFTkVYUFIoUGFyZW5FeHByLCBFeHByKQorI3VuZGVmIFBBUkVORVhQUgorCisjaWZuZGVmIFBBUkVOTElTVEVYUFIKKyMgIGRlZmluZSBQQVJFTkxJU1RFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorUEFSRU5MSVNURVhQUihQYXJlbkxpc3RFeHByLCBFeHByKQorI3VuZGVmIFBBUkVOTElTVEVYUFIKKworI2lmbmRlZiBQUkVERUZJTkVERVhQUgorIyAgZGVmaW5lIFBSRURFRklORURFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorUFJFREVGSU5FREVYUFIoUHJlZGVmaW5lZEV4cHIsIEV4cHIpCisjdW5kZWYgUFJFREVGSU5FREVYUFIKKworI2lmbmRlZiBQU0VVRE9PQkpFQ1RFWFBSCisjICBkZWZpbmUgUFNFVURPT0JKRUNURVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK1BTRVVET09CSkVDVEVYUFIoUHNldWRvT2JqZWN0RXhwciwgRXhwcikKKyN1bmRlZiBQU0VVRE9PQkpFQ1RFWFBSCisKKyNpZm5kZWYgU0hVRkZMRVZFQ1RPUkVYUFIKKyMgIGRlZmluZSBTSFVGRkxFVkVDVE9SRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK1NIVUZGTEVWRUNUT1JFWFBSKFNodWZmbGVWZWN0b3JFeHByLCBFeHByKQorI3VuZGVmIFNIVUZGTEVWRUNUT1JFWFBSCisKKyNpZm5kZWYgU0laRU9GUEFDS0VYUFIKKyMgIGRlZmluZSBTSVpFT0ZQQUNLRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK1NJWkVPRlBBQ0tFWFBSKFNpemVPZlBhY2tFeHByLCBFeHByKQorI3VuZGVmIFNJWkVPRlBBQ0tFWFBSCisKKyNpZm5kZWYgU1RNVEVYUFIKKyMgIGRlZmluZSBTVE1URVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK1NUTVRFWFBSKFN0bXRFeHByLCBFeHByKQorI3VuZGVmIFNUTVRFWFBSCisKKyNpZm5kZWYgU1RSSU5HTElURVJBTAorIyAgZGVmaW5lIFNUUklOR0xJVEVSQUwoVHlwZSwgQmFzZSkgRVhQUihUeXBlLCBCYXNlKQorI2VuZGlmCitTVFJJTkdMSVRFUkFMKFN0cmluZ0xpdGVyYWwsIEV4cHIpCisjdW5kZWYgU1RSSU5HTElURVJBTAorCisjaWZuZGVmIFNVQlNUTk9OVFlQRVRFTVBMQVRFUEFSTUVYUFIKKyMgIGRlZmluZSBTVUJTVE5PTlRZUEVURU1QTEFURVBBUk1FWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorU1VCU1ROT05UWVBFVEVNUExBVEVQQVJNRVhQUihTdWJzdE5vblR5cGVUZW1wbGF0ZVBhcm1FeHByLCBFeHByKQorI3VuZGVmIFNVQlNUTk9OVFlQRVRFTVBMQVRFUEFSTUVYUFIKKworI2lmbmRlZiBTVUJTVE5PTlRZUEVURU1QTEFURVBBUk1QQUNLRVhQUgorIyAgZGVmaW5lIFNVQlNUTk9OVFlQRVRFTVBMQVRFUEFSTVBBQ0tFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorU1VCU1ROT05UWVBFVEVNUExBVEVQQVJNUEFDS0VYUFIoU3Vic3ROb25UeXBlVGVtcGxhdGVQYXJtUGFja0V4cHIsIEV4cHIpCisjdW5kZWYgU1VCU1ROT05UWVBFVEVNUExBVEVQQVJNUEFDS0VYUFIKKworI2lmbmRlZiBUWVBFVFJBSVRFWFBSCisjICBkZWZpbmUgVFlQRVRSQUlURVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK1RZUEVUUkFJVEVYUFIoVHlwZVRyYWl0RXhwciwgRXhwcikKKyN1bmRlZiBUWVBFVFJBSVRFWFBSCisKKyNpZm5kZWYgVFlQT0VYUFIKKyMgIGRlZmluZSBUWVBPRVhQUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK1RZUE9FWFBSKFR5cG9FeHByLCBFeHByKQorI3VuZGVmIFRZUE9FWFBSCisKKyNpZm5kZWYgVU5BUllFWFBST1JUWVBFVFJBSVRFWFBSCisjICBkZWZpbmUgVU5BUllFWFBST1JUWVBFVFJBSVRFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorVU5BUllFWFBST1JUWVBFVFJBSVRFWFBSKFVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwciwgRXhwcikKKyN1bmRlZiBVTkFSWUVYUFJPUlRZUEVUUkFJVEVYUFIKKworI2lmbmRlZiBVTkFSWU9QRVJBVE9SCisjICBkZWZpbmUgVU5BUllPUEVSQVRPUihUeXBlLCBCYXNlKSBFWFBSKFR5cGUsIEJhc2UpCisjZW5kaWYKK1VOQVJZT1BFUkFUT1IoVW5hcnlPcGVyYXRvciwgRXhwcikKKyN1bmRlZiBVTkFSWU9QRVJBVE9SCisKKyNpZm5kZWYgVkFBUkdFWFBSCisjICBkZWZpbmUgVkFBUkdFWFBSKFR5cGUsIEJhc2UpIEVYUFIoVHlwZSwgQmFzZSkKKyNlbmRpZgorVkFBUkdFWFBSKFZBQXJnRXhwciwgRXhwcikKKyN1bmRlZiBWQUFSR0VYUFIKKworU1RNVF9SQU5HRShFeHByLCBCaW5hcnlDb25kaXRpb25hbE9wZXJhdG9yLCBWQUFyZ0V4cHIpCisKKyN1bmRlZiBFWFBSCisKKyNpZm5kZWYgRk9SU1RNVAorIyAgZGVmaW5lIEZPUlNUTVQoVHlwZSwgQmFzZSkgU1RNVChUeXBlLCBCYXNlKQorI2VuZGlmCitGT1JTVE1UKEZvclN0bXQsIFN0bXQpCisjdW5kZWYgRk9SU1RNVAorCisjaWZuZGVmIEdPVE9TVE1UCisjICBkZWZpbmUgR09UT1NUTVQoVHlwZSwgQmFzZSkgU1RNVChUeXBlLCBCYXNlKQorI2VuZGlmCitHT1RPU1RNVChHb3RvU3RtdCwgU3RtdCkKKyN1bmRlZiBHT1RPU1RNVAorCisjaWZuZGVmIElGU1RNVAorIyAgZGVmaW5lIElGU1RNVChUeXBlLCBCYXNlKSBTVE1UKFR5cGUsIEJhc2UpCisjZW5kaWYKK0lGU1RNVChJZlN0bXQsIFN0bXQpCisjdW5kZWYgSUZTVE1UCisKKyNpZm5kZWYgSU5ESVJFQ1RHT1RPU1RNVAorIyAgZGVmaW5lIElORElSRUNUR09UT1NUTVQoVHlwZSwgQmFzZSkgU1RNVChUeXBlLCBCYXNlKQorI2VuZGlmCitJTkRJUkVDVEdPVE9TVE1UKEluZGlyZWN0R290b1N0bXQsIFN0bXQpCisjdW5kZWYgSU5ESVJFQ1RHT1RPU1RNVAorCisjaWZuZGVmIExBQkVMU1RNVAorIyAgZGVmaW5lIExBQkVMU1RNVChUeXBlLCBCYXNlKSBTVE1UKFR5cGUsIEJhc2UpCisjZW5kaWYKK0xBQkVMU1RNVChMYWJlbFN0bXQsIFN0bXQpCisjdW5kZWYgTEFCRUxTVE1UCisKKyNpZm5kZWYgTVNERVBFTkRFTlRFWElTVFNTVE1UCisjICBkZWZpbmUgTVNERVBFTkRFTlRFWElTVFNTVE1UKFR5cGUsIEJhc2UpIFNUTVQoVHlwZSwgQmFzZSkKKyNlbmRpZgorTVNERVBFTkRFTlRFWElTVFNTVE1UKE1TRGVwZW5kZW50RXhpc3RzU3RtdCwgU3RtdCkKKyN1bmRlZiBNU0RFUEVOREVOVEVYSVNUU1NUTVQKKworI2lmbmRlZiBOVUxMU1RNVAorIyAgZGVmaW5lIE5VTExTVE1UKFR5cGUsIEJhc2UpIFNUTVQoVHlwZSwgQmFzZSkKKyNlbmRpZgorTlVMTFNUTVQoTnVsbFN0bXQsIFN0bXQpCisjdW5kZWYgTlVMTFNUTVQKKworI2lmbmRlZiBPTVBFWEVDVVRBQkxFRElSRUNUSVZFCisjICBkZWZpbmUgT01QRVhFQ1VUQUJMRURJUkVDVElWRShUeXBlLCBCYXNlKSBTVE1UKFR5cGUsIEJhc2UpCisjZW5kaWYKK0FCU1RSQUNUX1NUTVQoT01QRVhFQ1VUQUJMRURJUkVDVElWRShPTVBFeGVjdXRhYmxlRGlyZWN0aXZlLCBTdG10KSkKKyNpZm5kZWYgT01QQVRPTUlDRElSRUNUSVZFCisjICBkZWZpbmUgT01QQVRPTUlDRElSRUNUSVZFKFR5cGUsIEJhc2UpIE9NUEVYRUNVVEFCTEVESVJFQ1RJVkUoVHlwZSwgQmFzZSkKKyNlbmRpZgorT01QQVRPTUlDRElSRUNUSVZFKE9NUEF0b21pY0RpcmVjdGl2ZSwgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSkKKyN1bmRlZiBPTVBBVE9NSUNESVJFQ1RJVkUKKworI2lmbmRlZiBPTVBCQVJSSUVSRElSRUNUSVZFCisjICBkZWZpbmUgT01QQkFSUklFUkRJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBFWEVDVVRBQkxFRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUEJBUlJJRVJESVJFQ1RJVkUoT01QQmFycmllckRpcmVjdGl2ZSwgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSkKKyN1bmRlZiBPTVBCQVJSSUVSRElSRUNUSVZFCisKKyNpZm5kZWYgT01QQ0FOQ0VMRElSRUNUSVZFCisjICBkZWZpbmUgT01QQ0FOQ0VMRElSRUNUSVZFKFR5cGUsIEJhc2UpIE9NUEVYRUNVVEFCTEVESVJFQ1RJVkUoVHlwZSwgQmFzZSkKKyNlbmRpZgorT01QQ0FOQ0VMRElSRUNUSVZFKE9NUENhbmNlbERpcmVjdGl2ZSwgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSkKKyN1bmRlZiBPTVBDQU5DRUxESVJFQ1RJVkUKKworI2lmbmRlZiBPTVBDQU5DRUxMQVRJT05QT0lOVERJUkVDVElWRQorIyAgZGVmaW5lIE9NUENBTkNFTExBVElPTlBPSU5URElSRUNUSVZFKFR5cGUsIEJhc2UpIE9NUEVYRUNVVEFCTEVESVJFQ1RJVkUoVHlwZSwgQmFzZSkKKyNlbmRpZgorT01QQ0FOQ0VMTEFUSU9OUE9JTlRESVJFQ1RJVkUoT01QQ2FuY2VsbGF0aW9uUG9pbnREaXJlY3RpdmUsIE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUpCisjdW5kZWYgT01QQ0FOQ0VMTEFUSU9OUE9JTlRESVJFQ1RJVkUKKworI2lmbmRlZiBPTVBDUklUSUNBTERJUkVDVElWRQorIyAgZGVmaW5lIE9NUENSSVRJQ0FMRElSRUNUSVZFKFR5cGUsIEJhc2UpIE9NUEVYRUNVVEFCTEVESVJFQ1RJVkUoVHlwZSwgQmFzZSkKKyNlbmRpZgorT01QQ1JJVElDQUxESVJFQ1RJVkUoT01QQ3JpdGljYWxEaXJlY3RpdmUsIE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUpCisjdW5kZWYgT01QQ1JJVElDQUxESVJFQ1RJVkUKKworI2lmbmRlZiBPTVBGTFVTSERJUkVDVElWRQorIyAgZGVmaW5lIE9NUEZMVVNIRElSRUNUSVZFKFR5cGUsIEJhc2UpIE9NUEVYRUNVVEFCTEVESVJFQ1RJVkUoVHlwZSwgQmFzZSkKKyNlbmRpZgorT01QRkxVU0hESVJFQ1RJVkUoT01QRmx1c2hEaXJlY3RpdmUsIE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUpCisjdW5kZWYgT01QRkxVU0hESVJFQ1RJVkUKKworI2lmbmRlZiBPTVBMT09QRElSRUNUSVZFCisjICBkZWZpbmUgT01QTE9PUERJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBFWEVDVVRBQkxFRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK0FCU1RSQUNUX1NUTVQoT01QTE9PUERJUkVDVElWRShPTVBMb29wRGlyZWN0aXZlLCBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKSkKKyNpZm5kZWYgT01QRElTVFJJQlVURURJUkVDVElWRQorIyAgZGVmaW5lIE9NUERJU1RSSUJVVEVESVJFQ1RJVkUoVHlwZSwgQmFzZSkgT01QTE9PUERJUkVDVElWRShUeXBlLCBCYXNlKQorI2VuZGlmCitPTVBESVNUUklCVVRFRElSRUNUSVZFKE9NUERpc3RyaWJ1dGVEaXJlY3RpdmUsIE9NUExvb3BEaXJlY3RpdmUpCisjdW5kZWYgT01QRElTVFJJQlVURURJUkVDVElWRQorCisjaWZuZGVmIE9NUERJU1RSSUJVVEVQQVJBTExFTEZPUkRJUkVDVElWRQorIyAgZGVmaW5lIE9NUERJU1RSSUJVVEVQQVJBTExFTEZPUkRJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBMT09QRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUERJU1RSSUJVVEVQQVJBTExFTEZPUkRJUkVDVElWRShPTVBEaXN0cmlidXRlUGFyYWxsZWxGb3JEaXJlY3RpdmUsIE9NUExvb3BEaXJlY3RpdmUpCisjdW5kZWYgT01QRElTVFJJQlVURVBBUkFMTEVMRk9SRElSRUNUSVZFCisKKyNpZm5kZWYgT01QRElTVFJJQlVURVBBUkFMTEVMRk9SU0lNRERJUkVDVElWRQorIyAgZGVmaW5lIE9NUERJU1RSSUJVVEVQQVJBTExFTEZPUlNJTURESVJFQ1RJVkUoVHlwZSwgQmFzZSkgT01QTE9PUERJUkVDVElWRShUeXBlLCBCYXNlKQorI2VuZGlmCitPTVBESVNUUklCVVRFUEFSQUxMRUxGT1JTSU1ERElSRUNUSVZFKE9NUERpc3RyaWJ1dGVQYXJhbGxlbEZvclNpbWREaXJlY3RpdmUsIE9NUExvb3BEaXJlY3RpdmUpCisjdW5kZWYgT01QRElTVFJJQlVURVBBUkFMTEVMRk9SU0lNRERJUkVDVElWRQorCisjaWZuZGVmIE9NUERJU1RSSUJVVEVTSU1ERElSRUNUSVZFCisjICBkZWZpbmUgT01QRElTVFJJQlVURVNJTURESVJFQ1RJVkUoVHlwZSwgQmFzZSkgT01QTE9PUERJUkVDVElWRShUeXBlLCBCYXNlKQorI2VuZGlmCitPTVBESVNUUklCVVRFU0lNRERJUkVDVElWRShPTVBEaXN0cmlidXRlU2ltZERpcmVjdGl2ZSwgT01QTG9vcERpcmVjdGl2ZSkKKyN1bmRlZiBPTVBESVNUUklCVVRFU0lNRERJUkVDVElWRQorCisjaWZuZGVmIE9NUEZPUkRJUkVDVElWRQorIyAgZGVmaW5lIE9NUEZPUkRJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBMT09QRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUEZPUkRJUkVDVElWRShPTVBGb3JEaXJlY3RpdmUsIE9NUExvb3BEaXJlY3RpdmUpCisjdW5kZWYgT01QRk9SRElSRUNUSVZFCisKKyNpZm5kZWYgT01QRk9SU0lNRERJUkVDVElWRQorIyAgZGVmaW5lIE9NUEZPUlNJTURESVJFQ1RJVkUoVHlwZSwgQmFzZSkgT01QTE9PUERJUkVDVElWRShUeXBlLCBCYXNlKQorI2VuZGlmCitPTVBGT1JTSU1ERElSRUNUSVZFKE9NUEZvclNpbWREaXJlY3RpdmUsIE9NUExvb3BEaXJlY3RpdmUpCisjdW5kZWYgT01QRk9SU0lNRERJUkVDVElWRQorCisjaWZuZGVmIE9NUFBBUkFMTEVMRk9SRElSRUNUSVZFCisjICBkZWZpbmUgT01QUEFSQUxMRUxGT1JESVJFQ1RJVkUoVHlwZSwgQmFzZSkgT01QTE9PUERJUkVDVElWRShUeXBlLCBCYXNlKQorI2VuZGlmCitPTVBQQVJBTExFTEZPUkRJUkVDVElWRShPTVBQYXJhbGxlbEZvckRpcmVjdGl2ZSwgT01QTG9vcERpcmVjdGl2ZSkKKyN1bmRlZiBPTVBQQVJBTExFTEZPUkRJUkVDVElWRQorCisjaWZuZGVmIE9NUFBBUkFMTEVMRk9SU0lNRERJUkVDVElWRQorIyAgZGVmaW5lIE9NUFBBUkFMTEVMRk9SU0lNRERJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBMT09QRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUFBBUkFMTEVMRk9SU0lNRERJUkVDVElWRShPTVBQYXJhbGxlbEZvclNpbWREaXJlY3RpdmUsIE9NUExvb3BEaXJlY3RpdmUpCisjdW5kZWYgT01QUEFSQUxMRUxGT1JTSU1ERElSRUNUSVZFCisKKyNpZm5kZWYgT01QU0lNRERJUkVDVElWRQorIyAgZGVmaW5lIE9NUFNJTURESVJFQ1RJVkUoVHlwZSwgQmFzZSkgT01QTE9PUERJUkVDVElWRShUeXBlLCBCYXNlKQorI2VuZGlmCitPTVBTSU1ERElSRUNUSVZFKE9NUFNpbWREaXJlY3RpdmUsIE9NUExvb3BEaXJlY3RpdmUpCisjdW5kZWYgT01QU0lNRERJUkVDVElWRQorCisjaWZuZGVmIE9NUFRBUkdFVFBBUkFMTEVMRk9SU0lNRERJUkVDVElWRQorIyAgZGVmaW5lIE9NUFRBUkdFVFBBUkFMTEVMRk9SU0lNRERJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBMT09QRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUFRBUkdFVFBBUkFMTEVMRk9SU0lNRERJUkVDVElWRShPTVBUYXJnZXRQYXJhbGxlbEZvclNpbWREaXJlY3RpdmUsIE9NUExvb3BEaXJlY3RpdmUpCisjdW5kZWYgT01QVEFSR0VUUEFSQUxMRUxGT1JTSU1ERElSRUNUSVZFCisKKyNpZm5kZWYgT01QVEFSR0VUU0lNRERJUkVDVElWRQorIyAgZGVmaW5lIE9NUFRBUkdFVFNJTURESVJFQ1RJVkUoVHlwZSwgQmFzZSkgT01QTE9PUERJUkVDVElWRShUeXBlLCBCYXNlKQorI2VuZGlmCitPTVBUQVJHRVRTSU1ERElSRUNUSVZFKE9NUFRhcmdldFNpbWREaXJlY3RpdmUsIE9NUExvb3BEaXJlY3RpdmUpCisjdW5kZWYgT01QVEFSR0VUU0lNRERJUkVDVElWRQorCisjaWZuZGVmIE9NUFRBUkdFVFRFQU1TRElTVFJJQlVURURJUkVDVElWRQorIyAgZGVmaW5lIE9NUFRBUkdFVFRFQU1TRElTVFJJQlVURURJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBMT09QRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUFRBUkdFVFRFQU1TRElTVFJJQlVURURJUkVDVElWRShPTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVEaXJlY3RpdmUsIE9NUExvb3BEaXJlY3RpdmUpCisjdW5kZWYgT01QVEFSR0VUVEVBTVNESVNUUklCVVRFRElSRUNUSVZFCisKKyNpZm5kZWYgT01QVEFSR0VUVEVBTVNESVNUUklCVVRFUEFSQUxMRUxGT1JESVJFQ1RJVkUKKyMgIGRlZmluZSBPTVBUQVJHRVRURUFNU0RJU1RSSUJVVEVQQVJBTExFTEZPUkRJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBMT09QRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUFRBUkdFVFRFQU1TRElTVFJJQlVURVBBUkFMTEVMRk9SRElSRUNUSVZFKE9NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yRGlyZWN0aXZlLCBPTVBMb29wRGlyZWN0aXZlKQorI3VuZGVmIE9NUFRBUkdFVFRFQU1TRElTVFJJQlVURVBBUkFMTEVMRk9SRElSRUNUSVZFCisKKyNpZm5kZWYgT01QVEFSR0VUVEVBTVNESVNUUklCVVRFUEFSQUxMRUxGT1JTSU1ERElSRUNUSVZFCisjICBkZWZpbmUgT01QVEFSR0VUVEVBTVNESVNUUklCVVRFUEFSQUxMRUxGT1JTSU1ERElSRUNUSVZFKFR5cGUsIEJhc2UpIE9NUExPT1BESVJFQ1RJVkUoVHlwZSwgQmFzZSkKKyNlbmRpZgorT01QVEFSR0VUVEVBTVNESVNUUklCVVRFUEFSQUxMRUxGT1JTSU1ERElSRUNUSVZFKE9NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZSwgT01QTG9vcERpcmVjdGl2ZSkKKyN1bmRlZiBPTVBUQVJHRVRURUFNU0RJU1RSSUJVVEVQQVJBTExFTEZPUlNJTURESVJFQ1RJVkUKKworI2lmbmRlZiBPTVBUQVJHRVRURUFNU0RJU1RSSUJVVEVTSU1ERElSRUNUSVZFCisjICBkZWZpbmUgT01QVEFSR0VUVEVBTVNESVNUUklCVVRFU0lNRERJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBMT09QRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUFRBUkdFVFRFQU1TRElTVFJJQlVURVNJTURESVJFQ1RJVkUoT01QVGFyZ2V0VGVhbXNEaXN0cmlidXRlU2ltZERpcmVjdGl2ZSwgT01QTG9vcERpcmVjdGl2ZSkKKyN1bmRlZiBPTVBUQVJHRVRURUFNU0RJU1RSSUJVVEVTSU1ERElSRUNUSVZFCisKKyNpZm5kZWYgT01QVEFTS0xPT1BESVJFQ1RJVkUKKyMgIGRlZmluZSBPTVBUQVNLTE9PUERJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBMT09QRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUFRBU0tMT09QRElSRUNUSVZFKE9NUFRhc2tMb29wRGlyZWN0aXZlLCBPTVBMb29wRGlyZWN0aXZlKQorI3VuZGVmIE9NUFRBU0tMT09QRElSRUNUSVZFCisKKyNpZm5kZWYgT01QVEFTS0xPT1BTSU1ERElSRUNUSVZFCisjICBkZWZpbmUgT01QVEFTS0xPT1BTSU1ERElSRUNUSVZFKFR5cGUsIEJhc2UpIE9NUExPT1BESVJFQ1RJVkUoVHlwZSwgQmFzZSkKKyNlbmRpZgorT01QVEFTS0xPT1BTSU1ERElSRUNUSVZFKE9NUFRhc2tMb29wU2ltZERpcmVjdGl2ZSwgT01QTG9vcERpcmVjdGl2ZSkKKyN1bmRlZiBPTVBUQVNLTE9PUFNJTURESVJFQ1RJVkUKKworI2lmbmRlZiBPTVBURUFNU0RJU1RSSUJVVEVESVJFQ1RJVkUKKyMgIGRlZmluZSBPTVBURUFNU0RJU1RSSUJVVEVESVJFQ1RJVkUoVHlwZSwgQmFzZSkgT01QTE9PUERJUkVDVElWRShUeXBlLCBCYXNlKQorI2VuZGlmCitPTVBURUFNU0RJU1RSSUJVVEVESVJFQ1RJVkUoT01QVGVhbXNEaXN0cmlidXRlRGlyZWN0aXZlLCBPTVBMb29wRGlyZWN0aXZlKQorI3VuZGVmIE9NUFRFQU1TRElTVFJJQlVURURJUkVDVElWRQorCisjaWZuZGVmIE9NUFRFQU1TRElTVFJJQlVURVBBUkFMTEVMRk9SRElSRUNUSVZFCisjICBkZWZpbmUgT01QVEVBTVNESVNUUklCVVRFUEFSQUxMRUxGT1JESVJFQ1RJVkUoVHlwZSwgQmFzZSkgT01QTE9PUERJUkVDVElWRShUeXBlLCBCYXNlKQorI2VuZGlmCitPTVBURUFNU0RJU1RSSUJVVEVQQVJBTExFTEZPUkRJUkVDVElWRShPTVBUZWFtc0Rpc3RyaWJ1dGVQYXJhbGxlbEZvckRpcmVjdGl2ZSwgT01QTG9vcERpcmVjdGl2ZSkKKyN1bmRlZiBPTVBURUFNU0RJU1RSSUJVVEVQQVJBTExFTEZPUkRJUkVDVElWRQorCisjaWZuZGVmIE9NUFRFQU1TRElTVFJJQlVURVBBUkFMTEVMRk9SU0lNRERJUkVDVElWRQorIyAgZGVmaW5lIE9NUFRFQU1TRElTVFJJQlVURVBBUkFMTEVMRk9SU0lNRERJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBMT09QRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUFRFQU1TRElTVFJJQlVURVBBUkFMTEVMRk9SU0lNRERJUkVDVElWRShPTVBUZWFtc0Rpc3RyaWJ1dGVQYXJhbGxlbEZvclNpbWREaXJlY3RpdmUsIE9NUExvb3BEaXJlY3RpdmUpCisjdW5kZWYgT01QVEVBTVNESVNUUklCVVRFUEFSQUxMRUxGT1JTSU1ERElSRUNUSVZFCisKKyNpZm5kZWYgT01QVEVBTVNESVNUUklCVVRFU0lNRERJUkVDVElWRQorIyAgZGVmaW5lIE9NUFRFQU1TRElTVFJJQlVURVNJTURESVJFQ1RJVkUoVHlwZSwgQmFzZSkgT01QTE9PUERJUkVDVElWRShUeXBlLCBCYXNlKQorI2VuZGlmCitPTVBURUFNU0RJU1RSSUJVVEVTSU1ERElSRUNUSVZFKE9NUFRlYW1zRGlzdHJpYnV0ZVNpbWREaXJlY3RpdmUsIE9NUExvb3BEaXJlY3RpdmUpCisjdW5kZWYgT01QVEVBTVNESVNUUklCVVRFU0lNRERJUkVDVElWRQorCitTVE1UX1JBTkdFKE9NUExvb3BEaXJlY3RpdmUsIE9NUERpc3RyaWJ1dGVEaXJlY3RpdmUsIE9NUFRlYW1zRGlzdHJpYnV0ZVNpbWREaXJlY3RpdmUpCisKKyN1bmRlZiBPTVBMT09QRElSRUNUSVZFCisKKyNpZm5kZWYgT01QTUFTVEVSRElSRUNUSVZFCisjICBkZWZpbmUgT01QTUFTVEVSRElSRUNUSVZFKFR5cGUsIEJhc2UpIE9NUEVYRUNVVEFCTEVESVJFQ1RJVkUoVHlwZSwgQmFzZSkKKyNlbmRpZgorT01QTUFTVEVSRElSRUNUSVZFKE9NUE1hc3RlckRpcmVjdGl2ZSwgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSkKKyN1bmRlZiBPTVBNQVNURVJESVJFQ1RJVkUKKworI2lmbmRlZiBPTVBPUkRFUkVERElSRUNUSVZFCisjICBkZWZpbmUgT01QT1JERVJFRERJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBFWEVDVVRBQkxFRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUE9SREVSRURESVJFQ1RJVkUoT01QT3JkZXJlZERpcmVjdGl2ZSwgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSkKKyN1bmRlZiBPTVBPUkRFUkVERElSRUNUSVZFCisKKyNpZm5kZWYgT01QUEFSQUxMRUxESVJFQ1RJVkUKKyMgIGRlZmluZSBPTVBQQVJBTExFTERJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBFWEVDVVRBQkxFRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUFBBUkFMTEVMRElSRUNUSVZFKE9NUFBhcmFsbGVsRGlyZWN0aXZlLCBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKQorI3VuZGVmIE9NUFBBUkFMTEVMRElSRUNUSVZFCisKKyNpZm5kZWYgT01QUEFSQUxMRUxTRUNUSU9OU0RJUkVDVElWRQorIyAgZGVmaW5lIE9NUFBBUkFMTEVMU0VDVElPTlNESVJFQ1RJVkUoVHlwZSwgQmFzZSkgT01QRVhFQ1VUQUJMRURJUkVDVElWRShUeXBlLCBCYXNlKQorI2VuZGlmCitPTVBQQVJBTExFTFNFQ1RJT05TRElSRUNUSVZFKE9NUFBhcmFsbGVsU2VjdGlvbnNEaXJlY3RpdmUsIE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUpCisjdW5kZWYgT01QUEFSQUxMRUxTRUNUSU9OU0RJUkVDVElWRQorCisjaWZuZGVmIE9NUFNFQ1RJT05ESVJFQ1RJVkUKKyMgIGRlZmluZSBPTVBTRUNUSU9ORElSRUNUSVZFKFR5cGUsIEJhc2UpIE9NUEVYRUNVVEFCTEVESVJFQ1RJVkUoVHlwZSwgQmFzZSkKKyNlbmRpZgorT01QU0VDVElPTkRJUkVDVElWRShPTVBTZWN0aW9uRGlyZWN0aXZlLCBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKQorI3VuZGVmIE9NUFNFQ1RJT05ESVJFQ1RJVkUKKworI2lmbmRlZiBPTVBTRUNUSU9OU0RJUkVDVElWRQorIyAgZGVmaW5lIE9NUFNFQ1RJT05TRElSRUNUSVZFKFR5cGUsIEJhc2UpIE9NUEVYRUNVVEFCTEVESVJFQ1RJVkUoVHlwZSwgQmFzZSkKKyNlbmRpZgorT01QU0VDVElPTlNESVJFQ1RJVkUoT01QU2VjdGlvbnNEaXJlY3RpdmUsIE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUpCisjdW5kZWYgT01QU0VDVElPTlNESVJFQ1RJVkUKKworI2lmbmRlZiBPTVBTSU5HTEVESVJFQ1RJVkUKKyMgIGRlZmluZSBPTVBTSU5HTEVESVJFQ1RJVkUoVHlwZSwgQmFzZSkgT01QRVhFQ1VUQUJMRURJUkVDVElWRShUeXBlLCBCYXNlKQorI2VuZGlmCitPTVBTSU5HTEVESVJFQ1RJVkUoT01QU2luZ2xlRGlyZWN0aXZlLCBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKQorI3VuZGVmIE9NUFNJTkdMRURJUkVDVElWRQorCisjaWZuZGVmIE9NUFRBUkdFVERBVEFESVJFQ1RJVkUKKyMgIGRlZmluZSBPTVBUQVJHRVREQVRBRElSRUNUSVZFKFR5cGUsIEJhc2UpIE9NUEVYRUNVVEFCTEVESVJFQ1RJVkUoVHlwZSwgQmFzZSkKKyNlbmRpZgorT01QVEFSR0VUREFUQURJUkVDVElWRShPTVBUYXJnZXREYXRhRGlyZWN0aXZlLCBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKQorI3VuZGVmIE9NUFRBUkdFVERBVEFESVJFQ1RJVkUKKworI2lmbmRlZiBPTVBUQVJHRVRESVJFQ1RJVkUKKyMgIGRlZmluZSBPTVBUQVJHRVRESVJFQ1RJVkUoVHlwZSwgQmFzZSkgT01QRVhFQ1VUQUJMRURJUkVDVElWRShUeXBlLCBCYXNlKQorI2VuZGlmCitPTVBUQVJHRVRESVJFQ1RJVkUoT01QVGFyZ2V0RGlyZWN0aXZlLCBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKQorI3VuZGVmIE9NUFRBUkdFVERJUkVDVElWRQorCisjaWZuZGVmIE9NUFRBUkdFVEVOVEVSREFUQURJUkVDVElWRQorIyAgZGVmaW5lIE9NUFRBUkdFVEVOVEVSREFUQURJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBFWEVDVVRBQkxFRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUFRBUkdFVEVOVEVSREFUQURJUkVDVElWRShPTVBUYXJnZXRFbnRlckRhdGFEaXJlY3RpdmUsIE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUpCisjdW5kZWYgT01QVEFSR0VURU5URVJEQVRBRElSRUNUSVZFCisKKyNpZm5kZWYgT01QVEFSR0VURVhJVERBVEFESVJFQ1RJVkUKKyMgIGRlZmluZSBPTVBUQVJHRVRFWElUREFUQURJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBFWEVDVVRBQkxFRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUFRBUkdFVEVYSVREQVRBRElSRUNUSVZFKE9NUFRhcmdldEV4aXREYXRhRGlyZWN0aXZlLCBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKQorI3VuZGVmIE9NUFRBUkdFVEVYSVREQVRBRElSRUNUSVZFCisKKyNpZm5kZWYgT01QVEFSR0VUUEFSQUxMRUxESVJFQ1RJVkUKKyMgIGRlZmluZSBPTVBUQVJHRVRQQVJBTExFTERJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBFWEVDVVRBQkxFRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUFRBUkdFVFBBUkFMTEVMRElSRUNUSVZFKE9NUFRhcmdldFBhcmFsbGVsRGlyZWN0aXZlLCBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKQorI3VuZGVmIE9NUFRBUkdFVFBBUkFMTEVMRElSRUNUSVZFCisKKyNpZm5kZWYgT01QVEFSR0VUUEFSQUxMRUxGT1JESVJFQ1RJVkUKKyMgIGRlZmluZSBPTVBUQVJHRVRQQVJBTExFTEZPUkRJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBFWEVDVVRBQkxFRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUFRBUkdFVFBBUkFMTEVMRk9SRElSRUNUSVZFKE9NUFRhcmdldFBhcmFsbGVsRm9yRGlyZWN0aXZlLCBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKQorI3VuZGVmIE9NUFRBUkdFVFBBUkFMTEVMRk9SRElSRUNUSVZFCisKKyNpZm5kZWYgT01QVEFSR0VUVEVBTVNESVJFQ1RJVkUKKyMgIGRlZmluZSBPTVBUQVJHRVRURUFNU0RJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBFWEVDVVRBQkxFRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUFRBUkdFVFRFQU1TRElSRUNUSVZFKE9NUFRhcmdldFRlYW1zRGlyZWN0aXZlLCBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKQorI3VuZGVmIE9NUFRBUkdFVFRFQU1TRElSRUNUSVZFCisKKyNpZm5kZWYgT01QVEFSR0VUVVBEQVRFRElSRUNUSVZFCisjICBkZWZpbmUgT01QVEFSR0VUVVBEQVRFRElSRUNUSVZFKFR5cGUsIEJhc2UpIE9NUEVYRUNVVEFCTEVESVJFQ1RJVkUoVHlwZSwgQmFzZSkKKyNlbmRpZgorT01QVEFSR0VUVVBEQVRFRElSRUNUSVZFKE9NUFRhcmdldFVwZGF0ZURpcmVjdGl2ZSwgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSkKKyN1bmRlZiBPTVBUQVJHRVRVUERBVEVESVJFQ1RJVkUKKworI2lmbmRlZiBPTVBUQVNLRElSRUNUSVZFCisjICBkZWZpbmUgT01QVEFTS0RJUkVDVElWRShUeXBlLCBCYXNlKSBPTVBFWEVDVVRBQkxFRElSRUNUSVZFKFR5cGUsIEJhc2UpCisjZW5kaWYKK09NUFRBU0tESVJFQ1RJVkUoT01QVGFza0RpcmVjdGl2ZSwgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSkKKyN1bmRlZiBPTVBUQVNLRElSRUNUSVZFCisKKyNpZm5kZWYgT01QVEFTS0dST1VQRElSRUNUSVZFCisjICBkZWZpbmUgT01QVEFTS0dST1VQRElSRUNUSVZFKFR5cGUsIEJhc2UpIE9NUEVYRUNVVEFCTEVESVJFQ1RJVkUoVHlwZSwgQmFzZSkKKyNlbmRpZgorT01QVEFTS0dST1VQRElSRUNUSVZFKE9NUFRhc2tncm91cERpcmVjdGl2ZSwgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSkKKyN1bmRlZiBPTVBUQVNLR1JPVVBESVJFQ1RJVkUKKworI2lmbmRlZiBPTVBUQVNLV0FJVERJUkVDVElWRQorIyAgZGVmaW5lIE9NUFRBU0tXQUlURElSRUNUSVZFKFR5cGUsIEJhc2UpIE9NUEVYRUNVVEFCTEVESVJFQ1RJVkUoVHlwZSwgQmFzZSkKKyNlbmRpZgorT01QVEFTS1dBSVRESVJFQ1RJVkUoT01QVGFza3dhaXREaXJlY3RpdmUsIE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUpCisjdW5kZWYgT01QVEFTS1dBSVRESVJFQ1RJVkUKKworI2lmbmRlZiBPTVBUQVNLWUlFTERESVJFQ1RJVkUKKyMgIGRlZmluZSBPTVBUQVNLWUlFTERESVJFQ1RJVkUoVHlwZSwgQmFzZSkgT01QRVhFQ1VUQUJMRURJUkVDVElWRShUeXBlLCBCYXNlKQorI2VuZGlmCitPTVBUQVNLWUlFTERESVJFQ1RJVkUoT01QVGFza3lpZWxkRGlyZWN0aXZlLCBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKQorI3VuZGVmIE9NUFRBU0tZSUVMRERJUkVDVElWRQorCisjaWZuZGVmIE9NUFRFQU1TRElSRUNUSVZFCisjICBkZWZpbmUgT01QVEVBTVNESVJFQ1RJVkUoVHlwZSwgQmFzZSkgT01QRVhFQ1VUQUJMRURJUkVDVElWRShUeXBlLCBCYXNlKQorI2VuZGlmCitPTVBURUFNU0RJUkVDVElWRShPTVBUZWFtc0RpcmVjdGl2ZSwgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSkKKyN1bmRlZiBPTVBURUFNU0RJUkVDVElWRQorCitTVE1UX1JBTkdFKE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUsIE9NUEF0b21pY0RpcmVjdGl2ZSwgT01QVGVhbXNEaXJlY3RpdmUpCisKKyN1bmRlZiBPTVBFWEVDVVRBQkxFRElSRUNUSVZFCisKKyNpZm5kZWYgT0JKQ0FUQ0FUQ0hTVE1UCisjICBkZWZpbmUgT0JKQ0FUQ0FUQ0hTVE1UKFR5cGUsIEJhc2UpIFNUTVQoVHlwZSwgQmFzZSkKKyNlbmRpZgorT0JKQ0FUQ0FUQ0hTVE1UKE9iakNBdENhdGNoU3RtdCwgU3RtdCkKKyN1bmRlZiBPQkpDQVRDQVRDSFNUTVQKKworI2lmbmRlZiBPQkpDQVRGSU5BTExZU1RNVAorIyAgZGVmaW5lIE9CSkNBVEZJTkFMTFlTVE1UKFR5cGUsIEJhc2UpIFNUTVQoVHlwZSwgQmFzZSkKKyNlbmRpZgorT0JKQ0FURklOQUxMWVNUTVQoT2JqQ0F0RmluYWxseVN0bXQsIFN0bXQpCisjdW5kZWYgT0JKQ0FURklOQUxMWVNUTVQKKworI2lmbmRlZiBPQkpDQVRTWU5DSFJPTklaRURTVE1UCisjICBkZWZpbmUgT0JKQ0FUU1lOQ0hST05JWkVEU1RNVChUeXBlLCBCYXNlKSBTVE1UKFR5cGUsIEJhc2UpCisjZW5kaWYKK09CSkNBVFNZTkNIUk9OSVpFRFNUTVQoT2JqQ0F0U3luY2hyb25pemVkU3RtdCwgU3RtdCkKKyN1bmRlZiBPQkpDQVRTWU5DSFJPTklaRURTVE1UCisKKyNpZm5kZWYgT0JKQ0FUVEhST1dTVE1UCisjICBkZWZpbmUgT0JKQ0FUVEhST1dTVE1UKFR5cGUsIEJhc2UpIFNUTVQoVHlwZSwgQmFzZSkKKyNlbmRpZgorT0JKQ0FUVEhST1dTVE1UKE9iakNBdFRocm93U3RtdCwgU3RtdCkKKyN1bmRlZiBPQkpDQVRUSFJPV1NUTVQKKworI2lmbmRlZiBPQkpDQVRUUllTVE1UCisjICBkZWZpbmUgT0JKQ0FUVFJZU1RNVChUeXBlLCBCYXNlKSBTVE1UKFR5cGUsIEJhc2UpCisjZW5kaWYKK09CSkNBVFRSWVNUTVQoT2JqQ0F0VHJ5U3RtdCwgU3RtdCkKKyN1bmRlZiBPQkpDQVRUUllTVE1UCisKKyNpZm5kZWYgT0JKQ0FVVE9SRUxFQVNFUE9PTFNUTVQKKyMgIGRlZmluZSBPQkpDQVVUT1JFTEVBU0VQT09MU1RNVChUeXBlLCBCYXNlKSBTVE1UKFR5cGUsIEJhc2UpCisjZW5kaWYKK09CSkNBVVRPUkVMRUFTRVBPT0xTVE1UKE9iakNBdXRvcmVsZWFzZVBvb2xTdG10LCBTdG10KQorI3VuZGVmIE9CSkNBVVRPUkVMRUFTRVBPT0xTVE1UCisKKyNpZm5kZWYgT0JKQ0ZPUkNPTExFQ1RJT05TVE1UCisjICBkZWZpbmUgT0JKQ0ZPUkNPTExFQ1RJT05TVE1UKFR5cGUsIEJhc2UpIFNUTVQoVHlwZSwgQmFzZSkKKyNlbmRpZgorT0JKQ0ZPUkNPTExFQ1RJT05TVE1UKE9iakNGb3JDb2xsZWN0aW9uU3RtdCwgU3RtdCkKKyN1bmRlZiBPQkpDRk9SQ09MTEVDVElPTlNUTVQKKworI2lmbmRlZiBSRVRVUk5TVE1UCisjICBkZWZpbmUgUkVUVVJOU1RNVChUeXBlLCBCYXNlKSBTVE1UKFR5cGUsIEJhc2UpCisjZW5kaWYKK1JFVFVSTlNUTVQoUmV0dXJuU3RtdCwgU3RtdCkKKyN1bmRlZiBSRVRVUk5TVE1UCisKKyNpZm5kZWYgU0VIRVhDRVBUU1RNVAorIyAgZGVmaW5lIFNFSEVYQ0VQVFNUTVQoVHlwZSwgQmFzZSkgU1RNVChUeXBlLCBCYXNlKQorI2VuZGlmCitTRUhFWENFUFRTVE1UKFNFSEV4Y2VwdFN0bXQsIFN0bXQpCisjdW5kZWYgU0VIRVhDRVBUU1RNVAorCisjaWZuZGVmIFNFSEZJTkFMTFlTVE1UCisjICBkZWZpbmUgU0VIRklOQUxMWVNUTVQoVHlwZSwgQmFzZSkgU1RNVChUeXBlLCBCYXNlKQorI2VuZGlmCitTRUhGSU5BTExZU1RNVChTRUhGaW5hbGx5U3RtdCwgU3RtdCkKKyN1bmRlZiBTRUhGSU5BTExZU1RNVAorCisjaWZuZGVmIFNFSExFQVZFU1RNVAorIyAgZGVmaW5lIFNFSExFQVZFU1RNVChUeXBlLCBCYXNlKSBTVE1UKFR5cGUsIEJhc2UpCisjZW5kaWYKK1NFSExFQVZFU1RNVChTRUhMZWF2ZVN0bXQsIFN0bXQpCisjdW5kZWYgU0VITEVBVkVTVE1UCisKKyNpZm5kZWYgU0VIVFJZU1RNVAorIyAgZGVmaW5lIFNFSFRSWVNUTVQoVHlwZSwgQmFzZSkgU1RNVChUeXBlLCBCYXNlKQorI2VuZGlmCitTRUhUUllTVE1UKFNFSFRyeVN0bXQsIFN0bXQpCisjdW5kZWYgU0VIVFJZU1RNVAorCisjaWZuZGVmIFNXSVRDSENBU0UKKyMgIGRlZmluZSBTV0lUQ0hDQVNFKFR5cGUsIEJhc2UpIFNUTVQoVHlwZSwgQmFzZSkKKyNlbmRpZgorQUJTVFJBQ1RfU1RNVChTV0lUQ0hDQVNFKFN3aXRjaENhc2UsIFN0bXQpKQorI2lmbmRlZiBDQVNFU1RNVAorIyAgZGVmaW5lIENBU0VTVE1UKFR5cGUsIEJhc2UpIFNXSVRDSENBU0UoVHlwZSwgQmFzZSkKKyNlbmRpZgorQ0FTRVNUTVQoQ2FzZVN0bXQsIFN3aXRjaENhc2UpCisjdW5kZWYgQ0FTRVNUTVQKKworI2lmbmRlZiBERUZBVUxUU1RNVAorIyAgZGVmaW5lIERFRkFVTFRTVE1UKFR5cGUsIEJhc2UpIFNXSVRDSENBU0UoVHlwZSwgQmFzZSkKKyNlbmRpZgorREVGQVVMVFNUTVQoRGVmYXVsdFN0bXQsIFN3aXRjaENhc2UpCisjdW5kZWYgREVGQVVMVFNUTVQKKworU1RNVF9SQU5HRShTd2l0Y2hDYXNlLCBDYXNlU3RtdCwgRGVmYXVsdFN0bXQpCisKKyN1bmRlZiBTV0lUQ0hDQVNFCisKKyNpZm5kZWYgU1dJVENIU1RNVAorIyAgZGVmaW5lIFNXSVRDSFNUTVQoVHlwZSwgQmFzZSkgU1RNVChUeXBlLCBCYXNlKQorI2VuZGlmCitTV0lUQ0hTVE1UKFN3aXRjaFN0bXQsIFN0bXQpCisjdW5kZWYgU1dJVENIU1RNVAorCisjaWZuZGVmIFdISUxFU1RNVAorIyAgZGVmaW5lIFdISUxFU1RNVChUeXBlLCBCYXNlKSBTVE1UKFR5cGUsIEJhc2UpCisjZW5kaWYKK1dISUxFU1RNVChXaGlsZVN0bXQsIFN0bXQpCisjdW5kZWYgV0hJTEVTVE1UCisKK0xBU1RfU1RNVF9SQU5HRShTdG10LCBHQ0NBc21TdG10LCBXaGlsZVN0bXQpCisKKyN1bmRlZiBTVE1UCisjdW5kZWYgU1RNVF9SQU5HRQorI3VuZGVmIExBU1RfU1RNVF9SQU5HRQorI3VuZGVmIEFCU1RSQUNUX1NUTVQKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9TdG10T2JqQy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1N0bXRPYmpDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2MGI2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9TdG10T2JqQy5oCkBAIC0wLDAgKzEsMzc1IEBACisvLz09PS0tLSBTdG10T2JqQy5oIC0gQ2xhc3NlcyBmb3IgcmVwcmVzZW50aW5nIE9iakMgc3RhdGVtZW50cyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgT2JqZWN0aXZlLUMgc3RhdGVtZW50IEFTVCBub2RlIGNsYXNzZXMuCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfU1RNVE9CSkNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9TVE1UT0JKQ19ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgT2JqZWN0aXZlLUMncyBjb2xsZWN0aW9uIHN0YXRlbWVudC4KKy8vLworLy8vIFRoaXMgaXMgcmVwcmVzZW50ZWQgYXMgJ2ZvciAoZWxlbWVudCAnaW4nIGNvbGxlY3Rpb24tZXhwcmVzc2lvbiknIHN0bXQuCitjbGFzcyBPYmpDRm9yQ29sbGVjdGlvblN0bXQgOiBwdWJsaWMgU3RtdCB7CisgIGVudW0geyBFTEVNLCBDT0xMRUNUSU9OLCBCT0RZLCBFTkRfRVhQUiB9OworICBTdG10KiBTdWJFeHByc1tFTkRfRVhQUl07IC8vIFN1YkV4cHJzW0VMRU1dIGlzIGFuIGV4cHJlc3Npb24gb3IgZGVjbHN0bXQuCisgIFNvdXJjZUxvY2F0aW9uIEZvckxvYzsKKyAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jOworcHVibGljOgorICBPYmpDRm9yQ29sbGVjdGlvblN0bXQoU3RtdCAqRWxlbSwgRXhwciAqQ29sbGVjdCwgU3RtdCAqQm9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEZDTCwgU291cmNlTG9jYXRpb24gUlBMKTsKKyAgZXhwbGljaXQgT2JqQ0ZvckNvbGxlY3Rpb25TdG10KEVtcHR5U2hlbGwgRW1wdHkpIDoKKyAgICBTdG10KE9iakNGb3JDb2xsZWN0aW9uU3RtdENsYXNzLCBFbXB0eSkgeyB9CisKKyAgU3RtdCAqZ2V0RWxlbWVudCgpIHsgcmV0dXJuIFN1YkV4cHJzW0VMRU1dOyB9CisgIEV4cHIgKmdldENvbGxlY3Rpb24oKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwcio+KFN1YkV4cHJzW0NPTExFQ1RJT05dKTsKKyAgfQorICBTdG10ICpnZXRCb2R5KCkgeyByZXR1cm4gU3ViRXhwcnNbQk9EWV07IH0KKworICBjb25zdCBTdG10ICpnZXRFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gU3ViRXhwcnNbRUxFTV07IH0KKyAgY29uc3QgRXhwciAqZ2V0Q29sbGVjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxFeHByKj4oU3ViRXhwcnNbQ09MTEVDVElPTl0pOworICB9CisgIGNvbnN0IFN0bXQgKmdldEJvZHkoKSBjb25zdCB7IHJldHVybiBTdWJFeHByc1tCT0RZXTsgfQorCisgIHZvaWQgc2V0RWxlbWVudChTdG10ICpTKSB7IFN1YkV4cHJzW0VMRU1dID0gUzsgfQorICB2b2lkIHNldENvbGxlY3Rpb24oRXhwciAqRSkgeworICAgIFN1YkV4cHJzW0NPTExFQ1RJT05dID0gcmVpbnRlcnByZXRfY2FzdDxTdG10Kj4oRSk7CisgIH0KKyAgdm9pZCBzZXRCb2R5KFN0bXQgKlMpIHsgU3ViRXhwcnNbQk9EWV0gPSBTOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0Rm9yTG9jKCkgY29uc3QgeyByZXR1cm4gRm9yTG9jOyB9CisgIHZvaWQgc2V0Rm9yTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBGb3JMb2MgPSBMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0UlBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gUlBhcmVuTG9jOyB9CisgIHZvaWQgc2V0UlBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBSUGFyZW5Mb2MgPSBMb2M7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gRm9yTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBTdWJFeHByc1tCT0RZXS0+Z2V0TG9jRW5kKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT2JqQ0ZvckNvbGxlY3Rpb25TdG10Q2xhc3M7CisgIH0KKworICAvLyBJdGVyYXRvcnMKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKCZTdWJFeHByc1swXSwgJlN1YkV4cHJzW0VORF9FWFBSXSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBPYmplY3RpdmUtQydzIFxAY2F0Y2ggc3RhdGVtZW50LgorY2xhc3MgT2JqQ0F0Q2F0Y2hTdG10IDogcHVibGljIFN0bXQgeworcHJpdmF0ZToKKyAgVmFyRGVjbCAqRXhjZXB0aW9uRGVjbDsKKyAgU3RtdCAqQm9keTsKKyAgU291cmNlTG9jYXRpb24gQXRDYXRjaExvYywgUlBhcmVuTG9jOworCitwdWJsaWM6CisgIE9iakNBdENhdGNoU3RtdChTb3VyY2VMb2NhdGlvbiBhdENhdGNoTG9jLCBTb3VyY2VMb2NhdGlvbiBycGFyZW5sb2MsCisgICAgICAgICAgICAgICAgICBWYXJEZWNsICpjYXRjaFZhckRlY2wsCisgICAgICAgICAgICAgICAgICBTdG10ICphdENhdGNoU3RtdCkKKyAgICA6IFN0bXQoT2JqQ0F0Q2F0Y2hTdG10Q2xhc3MpLCBFeGNlcHRpb25EZWNsKGNhdGNoVmFyRGVjbCksIAorICAgIEJvZHkoYXRDYXRjaFN0bXQpLCBBdENhdGNoTG9jKGF0Q2F0Y2hMb2MpLCBSUGFyZW5Mb2MocnBhcmVubG9jKSB7IH0KKworICBleHBsaWNpdCBPYmpDQXRDYXRjaFN0bXQoRW1wdHlTaGVsbCBFbXB0eSkgOgorICAgIFN0bXQoT2JqQ0F0Q2F0Y2hTdG10Q2xhc3MsIEVtcHR5KSB7IH0KKworICBjb25zdCBTdG10ICpnZXRDYXRjaEJvZHkoKSBjb25zdCB7IHJldHVybiBCb2R5OyB9CisgIFN0bXQgKmdldENhdGNoQm9keSgpIHsgcmV0dXJuIEJvZHk7IH0KKyAgdm9pZCBzZXRDYXRjaEJvZHkoU3RtdCAqUykgeyBCb2R5ID0gUzsgfQorCisgIGNvbnN0IFZhckRlY2wgKmdldENhdGNoUGFyYW1EZWNsKCkgY29uc3QgeworICAgIHJldHVybiBFeGNlcHRpb25EZWNsOworICB9CisgIFZhckRlY2wgKmdldENhdGNoUGFyYW1EZWNsKCkgeworICAgIHJldHVybiBFeGNlcHRpb25EZWNsOworICB9CisgIHZvaWQgc2V0Q2F0Y2hQYXJhbURlY2woVmFyRGVjbCAqRCkgeyBFeGNlcHRpb25EZWNsID0gRDsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEF0Q2F0Y2hMb2MoKSBjb25zdCB7IHJldHVybiBBdENhdGNoTG9jOyB9CisgIHZvaWQgc2V0QXRDYXRjaExvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgQXRDYXRjaExvYyA9IExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRSUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBSUGFyZW5Mb2M7IH0KKyAgdm9pZCBzZXRSUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IFJQYXJlbkxvYyA9IExvYzsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBBdENhdGNoTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gQm9keS0+Z2V0TG9jRW5kKCk7IH0KKworICBib29sIGhhc0VsbGlwc2lzKCkgY29uc3QgeyByZXR1cm4gZ2V0Q2F0Y2hQYXJhbURlY2woKSA9PSBudWxscHRyOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9iakNBdENhdGNoU3RtdENsYXNzOworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7IHJldHVybiBjaGlsZF9yYW5nZSgmQm9keSwgJkJvZHkgKyAxKTsgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIE9iamVjdGl2ZS1DJ3MgXEBmaW5hbGx5IHN0YXRlbWVudAorY2xhc3MgT2JqQ0F0RmluYWxseVN0bXQgOiBwdWJsaWMgU3RtdCB7CisgIFNvdXJjZUxvY2F0aW9uIEF0RmluYWxseUxvYzsKKyAgU3RtdCAqQXRGaW5hbGx5U3RtdDsKKworcHVibGljOgorICBPYmpDQXRGaW5hbGx5U3RtdChTb3VyY2VMb2NhdGlvbiBhdEZpbmFsbHlMb2MsIFN0bXQgKmF0RmluYWxseVN0bXQpCisgICAgICA6IFN0bXQoT2JqQ0F0RmluYWxseVN0bXRDbGFzcyksIEF0RmluYWxseUxvYyhhdEZpbmFsbHlMb2MpLAorICAgICAgICBBdEZpbmFsbHlTdG10KGF0RmluYWxseVN0bXQpIHt9CisKKyAgZXhwbGljaXQgT2JqQ0F0RmluYWxseVN0bXQoRW1wdHlTaGVsbCBFbXB0eSkgOgorICAgIFN0bXQoT2JqQ0F0RmluYWxseVN0bXRDbGFzcywgRW1wdHkpIHsgfQorCisgIGNvbnN0IFN0bXQgKmdldEZpbmFsbHlCb2R5KCkgY29uc3QgeyByZXR1cm4gQXRGaW5hbGx5U3RtdDsgfQorICBTdG10ICpnZXRGaW5hbGx5Qm9keSgpIHsgcmV0dXJuIEF0RmluYWxseVN0bXQ7IH0KKyAgdm9pZCBzZXRGaW5hbGx5Qm9keShTdG10ICpTKSB7IEF0RmluYWxseVN0bXQgPSBTOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIEF0RmluYWxseUxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gQXRGaW5hbGx5U3RtdC0+Z2V0TG9jRW5kKCk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRBdEZpbmFsbHlMb2MoKSBjb25zdCB7IHJldHVybiBBdEZpbmFsbHlMb2M7IH0KKyAgdm9pZCBzZXRBdEZpbmFsbHlMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IEF0RmluYWxseUxvYyA9IExvYzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPYmpDQXRGaW5hbGx5U3RtdENsYXNzOworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKCZBdEZpbmFsbHlTdG10LCAmQXRGaW5hbGx5U3RtdCsxKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIE9iamVjdGl2ZS1DJ3MgXEB0cnkgLi4uIFxAY2F0Y2ggLi4uIFxAZmluYWxseSBzdGF0ZW1lbnQuCitjbGFzcyBPYmpDQXRUcnlTdG10IDogcHVibGljIFN0bXQgeworcHJpdmF0ZToKKyAgLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSBAIGluIHRoZSBcQHRyeS4KKyAgU291cmNlTG9jYXRpb24gQXRUcnlMb2M7CisgIAorICAvLyBUaGUgbnVtYmVyIG9mIGNhdGNoIGJsb2NrcyBpbiB0aGlzIHN0YXRlbWVudC4KKyAgdW5zaWduZWQgTnVtQ2F0Y2hTdG10cyA6IDE2OworICAKKyAgLy8gV2hldGhlciB0aGlzIHN0YXRlbWVudCBoYXMgYSBcQGZpbmFsbHkgc3RhdGVtZW50LgorICBib29sIEhhc0ZpbmFsbHkgOiAxOworICAKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc3RhdGVtZW50cyB0aGF0IGFyZSBzdG9yZWQgYWZ0ZXIgdGhpcyBcQHRyeSBzdGF0ZW1lbnQuCisgIC8vLworICAvLy8gVGhlIG9yZGVyIG9mIHRoZSBzdGF0ZW1lbnRzIGluIG1lbW9yeSBmb2xsb3dzIHRoZSBvcmRlciBpbiB0aGUgc291cmNlLAorICAvLy8gd2l0aCB0aGUgXEB0cnkgYm9keSBmaXJzdCwgZm9sbG93ZWQgYnkgdGhlIFxAY2F0Y2ggc3RhdGVtZW50cyAoaWYgYW55KQorICAvLy8gYW5kLCBmaW5hbGx5LCB0aGUgXEBmaW5hbGx5IChpZiBpdCBleGlzdHMpLgorICBTdG10ICoqZ2V0U3RtdHMoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFN0bXQgKio+ICh0aGlzICsgMSk7IH0KKyAgY29uc3QgU3RtdCogY29uc3QgKmdldFN0bXRzKCkgY29uc3QgeyAKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTdG10ICogY29uc3QqPiAodGhpcyArIDEpOyAKKyAgfQorICAKKyAgT2JqQ0F0VHJ5U3RtdChTb3VyY2VMb2NhdGlvbiBhdFRyeUxvYywgU3RtdCAqYXRUcnlTdG10LAorICAgICAgICAgICAgICAgIFN0bXQgKipDYXRjaFN0bXRzLCB1bnNpZ25lZCBOdW1DYXRjaFN0bXRzLAorICAgICAgICAgICAgICAgIFN0bXQgKmF0RmluYWxseVN0bXQpOworICAKKyAgZXhwbGljaXQgT2JqQ0F0VHJ5U3RtdChFbXB0eVNoZWxsIEVtcHR5LCB1bnNpZ25lZCBOdW1DYXRjaFN0bXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzRmluYWxseSkKKyAgICA6IFN0bXQoT2JqQ0F0VHJ5U3RtdENsYXNzLCBFbXB0eSksIE51bUNhdGNoU3RtdHMoTnVtQ2F0Y2hTdG10cyksCisgICAgICBIYXNGaW5hbGx5KEhhc0ZpbmFsbHkpIHsgfQorCitwdWJsaWM6CisgIHN0YXRpYyBPYmpDQXRUcnlTdG10ICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBhdFRyeUxvYywgU3RtdCAqYXRUcnlTdG10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKipDYXRjaFN0bXRzLCB1bnNpZ25lZCBOdW1DYXRjaFN0bXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKmF0RmluYWxseVN0bXQpOworICBzdGF0aWMgT2JqQ0F0VHJ5U3RtdCAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNhdGNoU3RtdHMsIGJvb2wgSGFzRmluYWxseSk7CisgIAorICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgQCBpbiB0aGUgXEB0cnkuCisgIFNvdXJjZUxvY2F0aW9uIGdldEF0VHJ5TG9jKCkgY29uc3QgeyByZXR1cm4gQXRUcnlMb2M7IH0KKyAgdm9pZCBzZXRBdFRyeUxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgQXRUcnlMb2MgPSBMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBcQHRyeSBib2R5LgorICBjb25zdCBTdG10ICpnZXRUcnlCb2R5KCkgY29uc3QgeyByZXR1cm4gZ2V0U3RtdHMoKVswXTsgfQorICBTdG10ICpnZXRUcnlCb2R5KCkgeyByZXR1cm4gZ2V0U3RtdHMoKVswXTsgfQorICB2b2lkIHNldFRyeUJvZHkoU3RtdCAqUykgeyBnZXRTdG10cygpWzBdID0gUzsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG51bWJlciBvZiBcQGNhdGNoIHN0YXRlbWVudHMgaW4gdGhpcyB0cnktY2F0Y2gtZmluYWxseQorICAvLy8gYmxvY2suCisgIHVuc2lnbmVkIGdldE51bUNhdGNoU3RtdHMoKSBjb25zdCB7IHJldHVybiBOdW1DYXRjaFN0bXRzOyB9CisgIAorICAvLy8gXGJyaWVmIFJldHJpZXZlIGEgXEBjYXRjaCBzdGF0ZW1lbnQuCisgIGNvbnN0IE9iakNBdENhdGNoU3RtdCAqZ2V0Q2F0Y2hTdG10KHVuc2lnbmVkIEkpIGNvbnN0IHsKKyAgICBhc3NlcnQoSSA8IE51bUNhdGNoU3RtdHMgJiYgIk91dC1vZi1ib3VuZHMgQGNhdGNoIGluZGV4Iik7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxPYmpDQXRDYXRjaFN0bXQ+KGdldFN0bXRzKClbSSArIDFdKTsKKyAgfQorICAKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBhIFxAY2F0Y2ggc3RhdGVtZW50LgorICBPYmpDQXRDYXRjaFN0bXQgKmdldENhdGNoU3RtdCh1bnNpZ25lZCBJKSB7CisgICAgYXNzZXJ0KEkgPCBOdW1DYXRjaFN0bXRzICYmICJPdXQtb2YtYm91bmRzIEBjYXRjaCBpbmRleCIpOworICAgIHJldHVybiBjYXN0X29yX251bGw8T2JqQ0F0Q2F0Y2hTdG10PihnZXRTdG10cygpW0kgKyAxXSk7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgU2V0IGEgcGFydGljdWxhciBjYXRjaCBzdGF0ZW1lbnQuCisgIHZvaWQgc2V0Q2F0Y2hTdG10KHVuc2lnbmVkIEksIE9iakNBdENhdGNoU3RtdCAqUykgeworICAgIGFzc2VydChJIDwgTnVtQ2F0Y2hTdG10cyAmJiAiT3V0LW9mLWJvdW5kcyBAY2F0Y2ggaW5kZXgiKTsKKyAgICBnZXRTdG10cygpW0kgKyAxXSA9IFM7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIFxAZmluYWxseSBzdGF0ZW1lbnQsIGlmIGFueS4KKyAgY29uc3QgT2JqQ0F0RmluYWxseVN0bXQgKmdldEZpbmFsbHlTdG10KCkgY29uc3QgeworICAgIGlmICghSGFzRmluYWxseSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIAorICAgIHJldHVybiBjYXN0X29yX251bGw8T2JqQ0F0RmluYWxseVN0bXQ+KGdldFN0bXRzKClbMSArIE51bUNhdGNoU3RtdHNdKTsKKyAgfQorICBPYmpDQXRGaW5hbGx5U3RtdCAqZ2V0RmluYWxseVN0bXQoKSB7CisgICAgaWYgKCFIYXNGaW5hbGx5KQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgCisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxPYmpDQXRGaW5hbGx5U3RtdD4oZ2V0U3RtdHMoKVsxICsgTnVtQ2F0Y2hTdG10c10pOworICB9CisgIHZvaWQgc2V0RmluYWxseVN0bXQoU3RtdCAqUykgeyAKKyAgICBhc3NlcnQoSGFzRmluYWxseSAmJiAiQHRyeSBkb2VzIG5vdCBoYXZlIGEgQGZpbmFsbHkgc2xvdCEiKTsKKyAgICBnZXRTdG10cygpWzEgKyBOdW1DYXRjaFN0bXRzXSA9IFM7IAorICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIEF0VHJ5TG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9iakNBdFRyeVN0bXRDbGFzczsKKyAgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBjaGlsZF9yYW5nZShnZXRTdG10cygpLAorICAgICAgICAgICAgICAgICAgICAgICBnZXRTdG10cygpICsgMSArIE51bUNhdGNoU3RtdHMgKyBIYXNGaW5hbGx5KTsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIE9iamVjdGl2ZS1DJ3MgXEBzeW5jaHJvbml6ZWQgc3RhdGVtZW50LgorLy8vCisvLy8gRXhhbXBsZToKKy8vLyBcY29kZQorLy8vICAgQHN5bmNocm9uaXplZCAoc2VtKSB7CisvLy8gICAgIGRvLXNvbWV0aGluZzsKKy8vLyAgIH0KKy8vLyBcZW5kY29kZQorY2xhc3MgT2JqQ0F0U3luY2hyb25pemVkU3RtdCA6IHB1YmxpYyBTdG10IHsKK3ByaXZhdGU6CisgIFNvdXJjZUxvY2F0aW9uIEF0U3luY2hyb25pemVkTG9jOworICBlbnVtIHsgU1lOQ19FWFBSLCBTWU5DX0JPRFksIEVORF9FWFBSIH07CisgIFN0bXQqIFN1YlN0bXRzW0VORF9FWFBSXTsKKworcHVibGljOgorICBPYmpDQXRTeW5jaHJvbml6ZWRTdG10KFNvdXJjZUxvY2F0aW9uIGF0U3luY2hyb25pemVkTG9jLCBTdG10ICpzeW5jaEV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdCAqc3luY2hCb2R5KQorICA6IFN0bXQoT2JqQ0F0U3luY2hyb25pemVkU3RtdENsYXNzKSB7CisgICAgU3ViU3RtdHNbU1lOQ19FWFBSXSA9IHN5bmNoRXhwcjsKKyAgICBTdWJTdG10c1tTWU5DX0JPRFldID0gc3luY2hCb2R5OworICAgIEF0U3luY2hyb25pemVkTG9jID0gYXRTeW5jaHJvbml6ZWRMb2M7CisgIH0KKyAgZXhwbGljaXQgT2JqQ0F0U3luY2hyb25pemVkU3RtdChFbXB0eVNoZWxsIEVtcHR5KSA6CisgICAgU3RtdChPYmpDQXRTeW5jaHJvbml6ZWRTdG10Q2xhc3MsIEVtcHR5KSB7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRBdFN5bmNocm9uaXplZExvYygpIGNvbnN0IHsgcmV0dXJuIEF0U3luY2hyb25pemVkTG9jOyB9CisgIHZvaWQgc2V0QXRTeW5jaHJvbml6ZWRMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IEF0U3luY2hyb25pemVkTG9jID0gTG9jOyB9CisKKyAgY29uc3QgQ29tcG91bmRTdG10ICpnZXRTeW5jaEJvZHkoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q29tcG91bmRTdG10Kj4oU3ViU3RtdHNbU1lOQ19CT0RZXSk7CisgIH0KKyAgQ29tcG91bmRTdG10ICpnZXRTeW5jaEJvZHkoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q29tcG91bmRTdG10Kj4oU3ViU3RtdHNbU1lOQ19CT0RZXSk7CisgIH0KKyAgdm9pZCBzZXRTeW5jaEJvZHkoU3RtdCAqUykgeyBTdWJTdG10c1tTWU5DX0JPRFldID0gUzsgfQorCisgIGNvbnN0IEV4cHIgKmdldFN5bmNoRXhwcigpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxFeHByKj4oU3ViU3RtdHNbU1lOQ19FWFBSXSk7CisgIH0KKyAgRXhwciAqZ2V0U3luY2hFeHByKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEV4cHIqPihTdWJTdG10c1tTWU5DX0VYUFJdKTsKKyAgfQorICB2b2lkIHNldFN5bmNoRXhwcihTdG10ICpTKSB7IFN1YlN0bXRzW1NZTkNfRVhQUl0gPSBTOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIEF0U3luY2hyb25pemVkTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBnZXRTeW5jaEJvZHkoKS0+Z2V0TG9jRW5kKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT2JqQ0F0U3luY2hyb25pemVkU3RtdENsYXNzOworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKCZTdWJTdG10c1swXSwgJlN1YlN0bXRzWzBdK0VORF9FWFBSKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIE9iamVjdGl2ZS1DJ3MgXEB0aHJvdyBzdGF0ZW1lbnQuCitjbGFzcyBPYmpDQXRUaHJvd1N0bXQgOiBwdWJsaWMgU3RtdCB7CisgIFNvdXJjZUxvY2F0aW9uIEF0VGhyb3dMb2M7CisgIFN0bXQgKlRocm93OworCitwdWJsaWM6CisgIE9iakNBdFRocm93U3RtdChTb3VyY2VMb2NhdGlvbiBhdFRocm93TG9jLCBTdG10ICp0aHJvd0V4cHIpCisgIDogU3RtdChPYmpDQXRUaHJvd1N0bXRDbGFzcyksIFRocm93KHRocm93RXhwcikgeworICAgIEF0VGhyb3dMb2MgPSBhdFRocm93TG9jOworICB9CisgIGV4cGxpY2l0IE9iakNBdFRocm93U3RtdChFbXB0eVNoZWxsIEVtcHR5KSA6CisgICAgU3RtdChPYmpDQXRUaHJvd1N0bXRDbGFzcywgRW1wdHkpIHsgfQorCisgIGNvbnN0IEV4cHIgKmdldFRocm93RXhwcigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwcio+KFRocm93KTsgfQorICBFeHByICpnZXRUaHJvd0V4cHIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PEV4cHIqPihUaHJvdyk7IH0KKyAgdm9pZCBzZXRUaHJvd0V4cHIoU3RtdCAqUykgeyBUaHJvdyA9IFM7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRUaHJvd0xvYygpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gQXRUaHJvd0xvYzsgfQorICB2b2lkIHNldFRocm93TG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBBdFRocm93TG9jID0gTG9jOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIEF0VGhyb3dMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIFRocm93ID8gVGhyb3ctPmdldExvY0VuZCgpIDogQXRUaHJvd0xvYzsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPYmpDQXRUaHJvd1N0bXRDbGFzczsKKyAgfQorCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoJlRocm93LCAmVGhyb3crMSk7IH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBPYmplY3RpdmUtQydzIFxAYXV0b3JlbGVhc2Vwb29sIFN0YXRlbWVudAorY2xhc3MgT2JqQ0F1dG9yZWxlYXNlUG9vbFN0bXQgOiBwdWJsaWMgU3RtdCB7CisgIFNvdXJjZUxvY2F0aW9uIEF0TG9jOworICBTdG10ICpTdWJTdG10OworCitwdWJsaWM6CisgIE9iakNBdXRvcmVsZWFzZVBvb2xTdG10KFNvdXJjZUxvY2F0aW9uIGF0TG9jLCBTdG10ICpzdWJTdG10KQorICAgICAgOiBTdG10KE9iakNBdXRvcmVsZWFzZVBvb2xTdG10Q2xhc3MpLCBBdExvYyhhdExvYyksIFN1YlN0bXQoc3ViU3RtdCkge30KKworICBleHBsaWNpdCBPYmpDQXV0b3JlbGVhc2VQb29sU3RtdChFbXB0eVNoZWxsIEVtcHR5KSA6CisgICAgU3RtdChPYmpDQXV0b3JlbGVhc2VQb29sU3RtdENsYXNzLCBFbXB0eSkgeyB9CisKKyAgY29uc3QgU3RtdCAqZ2V0U3ViU3RtdCgpIGNvbnN0IHsgcmV0dXJuIFN1YlN0bXQ7IH0KKyAgU3RtdCAqZ2V0U3ViU3RtdCgpIHsgcmV0dXJuIFN1YlN0bXQ7IH0KKyAgdm9pZCBzZXRTdWJTdG10KFN0bXQgKlMpIHsgU3ViU3RtdCA9IFM7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gQXRMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBTdWJTdG10LT5nZXRMb2NFbmQoKTt9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0QXRMb2MoKSBjb25zdCB7IHJldHVybiBBdExvYzsgfQorICB2b2lkIHNldEF0TG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBBdExvYyA9IExvYzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPYmpDQXV0b3JlbGVhc2VQb29sU3RtdENsYXNzOworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7IHJldHVybiBjaGlsZF9yYW5nZSgmU3ViU3RtdCwgJlN1YlN0bXQgKyAxKTsgfQorfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9TdG10T3Blbk1QLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvU3RtdE9wZW5NUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MDUyMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvU3RtdE9wZW5NUC5oCkBAIC0wLDAgKzEsNDA0NyBAQAorLy89PT0tIFN0bXRPcGVuTVAuaCAtIENsYXNzZXMgZm9yIE9wZW5NUCBkaXJlY3RpdmVzICAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBUaGlzIGZpbGUgZGVmaW5lcyBPcGVuTVAgQVNUIGNsYXNzZXMgZm9yIGV4ZWN1dGFibGUgZGlyZWN0aXZlcyBhbmQKKy8vLyBjbGF1c2VzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX1NUTVRPUEVOTVBfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9TVE1UT1BFTk1QX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL09wZW5NUENsYXVzZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10LmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3Blbk1QS2luZHMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQVNUIGNsYXNzZXMgZm9yIGRpcmVjdGl2ZXMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gXGJyaWVmIFRoaXMgaXMgYSBiYXNpYyBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIHNpbmdsZSBPcGVuTVAgZXhlY3V0YWJsZQorLy8vIGRpcmVjdGl2ZS4KKy8vLworY2xhc3MgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSA6IHB1YmxpYyBTdG10IHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIC8vLyBcYnJpZWYgS2luZCBvZiB0aGUgZGlyZWN0aXZlLgorICBPcGVuTVBEaXJlY3RpdmVLaW5kIEtpbmQ7CisgIC8vLyBcYnJpZWYgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSAoZGlyZWN0aXZlIGtleXdvcmQpLgorICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYzsKKyAgLy8vIFxicmllZiBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgU291cmNlTG9jYXRpb24gRW5kTG9jOworICAvLy8gXGJyaWVmIE51bWJlcnMgb2YgY2xhdXNlcy4KKyAgY29uc3QgdW5zaWduZWQgTnVtQ2xhdXNlczsKKyAgLy8vIFxicmllZiBOdW1iZXIgb2YgY2hpbGQgZXhwcmVzc2lvbnMvc3RtdHMuCisgIGNvbnN0IHVuc2lnbmVkIE51bUNoaWxkcmVuOworICAvLy8gXGJyaWVmIE9mZnNldCBmcm9tIHRoaXMgdG8gdGhlIHN0YXJ0IG9mIGNsYXVzZXMuCisgIC8vLyBUaGVyZSBhcmUgTnVtQ2xhdXNlcyBwb2ludGVycyB0byBjbGF1c2VzLCB0aGV5IGFyZSBmb2xsb3dlZCBieQorICAvLy8gTnVtQ2hpbGRyZW4gcG9pbnRlcnMgdG8gY2hpbGQgc3RtdHMvZXhwcnMgKGlmIHRoZSBkaXJlY3RpdmUgdHlwZQorICAvLy8gcmVxdWlyZXMgYW4gYXNzb2NpYXRlZCBzdG10LCB0aGVuIGl0IGhhcyB0byBiZSB0aGUgZmlyc3Qgb2YgdGhlbSkuCisgIGNvbnN0IHVuc2lnbmVkIENsYXVzZXNPZmZzZXQ7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGNsYXVzZXMgc3RvcmFnZS4KKyAgTXV0YWJsZUFycmF5UmVmPE9NUENsYXVzZSAqPiBnZXRDbGF1c2VzKCkgeworICAgIE9NUENsYXVzZSAqKkNsYXVzZVN0b3JhZ2UgPSByZWludGVycHJldF9jYXN0PE9NUENsYXVzZSAqKj4oCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPih0aGlzKSArIENsYXVzZXNPZmZzZXQpOworICAgIHJldHVybiBNdXRhYmxlQXJyYXlSZWY8T01QQ2xhdXNlICo+KENsYXVzZVN0b3JhZ2UsIE51bUNsYXVzZXMpOworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8vIFxicmllZiBCdWlsZCBpbnN0YW5jZSBvZiBkaXJlY3RpdmUgb2YgY2xhc3MgXGEgSy4KKyAgLy8vCisgIC8vLyBccGFyYW0gU0MgU3RhdGVtZW50IGNsYXNzLgorICAvLy8gXHBhcmFtIEsgS2luZCBvZiBPcGVuTVAgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUgKGRpcmVjdGl2ZSBrZXl3b3JkKS4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgT01QRXhlY3V0YWJsZURpcmVjdGl2ZShjb25zdCBUICosIFN0bXRDbGFzcyBTQywgT3Blbk1QRGlyZWN0aXZlS2luZCBLLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcywgdW5zaWduZWQgTnVtQ2hpbGRyZW4pCisgICAgICA6IFN0bXQoU0MpLCBLaW5kKEspLCBTdGFydExvYyhzdGQ6Om1vdmUoU3RhcnRMb2MpKSwKKyAgICAgICAgRW5kTG9jKHN0ZDo6bW92ZShFbmRMb2MpKSwgTnVtQ2xhdXNlcyhOdW1DbGF1c2VzKSwKKyAgICAgICAgTnVtQ2hpbGRyZW4oTnVtQ2hpbGRyZW4pLAorICAgICAgICBDbGF1c2VzT2Zmc2V0KGxsdm06OmFsaWduVG8oc2l6ZW9mKFQpLCBhbGlnbm9mKE9NUENsYXVzZSAqKSkpIHt9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBsaXN0IG9mIHZhcmlhYmxlcyBmb3IgdGhpcyBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIENsYXVzZXMgVGhlIGxpc3Qgb2YgY2xhdXNlcyBmb3IgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vCisgIHZvaWQgc2V0Q2xhdXNlcyhBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcyk7CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGFzc29jaWF0ZWQgc3RhdGVtZW50IGZvciB0aGUgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIC9wYXJhbSBTIEFzc29jaWF0ZWQgc3RhdGVtZW50LgorICAvLy8KKyAgdm9pZCBzZXRBc3NvY2lhdGVkU3RtdChTdG10ICpTKSB7CisgICAgYXNzZXJ0KGhhc0Fzc29jaWF0ZWRTdG10KCkgJiYgIm5vIGFzc29jaWF0ZWQgc3RhdGVtZW50LiIpOworICAgICpjaGlsZF9iZWdpbigpID0gUzsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgSXRlcmF0ZXMgb3ZlciBhIGZpbHRlcmVkIHN1YnJhbmdlIG9mIGNsYXVzZXMgYXBwbGllZCB0byBhCisgIC8vLyBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gVGhpcyBpdGVyYXRvciB2aXNpdHMgb25seSBjbGF1c2VzIG9mIHR5cGUgU3BlY2lmaWNDbGF1c2UuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTcGVjaWZpY0NsYXVzZT4KKyAgY2xhc3Mgc3BlY2lmaWNfY2xhdXNlX2l0ZXJhdG9yCisgICAgICA6IHB1YmxpYyBsbHZtOjppdGVyYXRvcl9hZGFwdG9yX2Jhc2U8CisgICAgICAgICAgICBzcGVjaWZpY19jbGF1c2VfaXRlcmF0b3I8U3BlY2lmaWNDbGF1c2U+LAorICAgICAgICAgICAgQXJyYXlSZWY8T01QQ2xhdXNlICo+Ojpjb25zdF9pdGVyYXRvciwgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgIGNvbnN0IFNwZWNpZmljQ2xhdXNlICosIHB0cmRpZmZfdCwgY29uc3QgU3BlY2lmaWNDbGF1c2UgKiwKKyAgICAgICAgICAgIGNvbnN0IFNwZWNpZmljQ2xhdXNlICo+IHsKKyAgICBBcnJheVJlZjxPTVBDbGF1c2UgKj46OmNvbnN0X2l0ZXJhdG9yIEVuZDsKKworICAgIHZvaWQgU2tpcFRvTmV4dENsYXVzZSgpIHsKKyAgICAgIHdoaWxlICh0aGlzLT5JICE9IEVuZCAmJiAhaXNhPFNwZWNpZmljQ2xhdXNlPigqdGhpcy0+SSkpCisgICAgICAgICsrdGhpcy0+STsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IHNwZWNpZmljX2NsYXVzZV9pdGVyYXRvcihBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcykKKyAgICAgICAgOiBzcGVjaWZpY19jbGF1c2VfaXRlcmF0b3I6Oml0ZXJhdG9yX2FkYXB0b3JfYmFzZShDbGF1c2VzLmJlZ2luKCkpLAorICAgICAgICAgIEVuZChDbGF1c2VzLmVuZCgpKSB7CisgICAgICBTa2lwVG9OZXh0Q2xhdXNlKCk7CisgICAgfQorCisgICAgY29uc3QgU3BlY2lmaWNDbGF1c2UgKm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjYXN0PFNwZWNpZmljQ2xhdXNlPigqdGhpcy0+SSk7CisgICAgfQorICAgIGNvbnN0IFNwZWNpZmljQ2xhdXNlICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gKip0aGlzOyB9CisKKyAgICBzcGVjaWZpY19jbGF1c2VfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgICArK3RoaXMtPkk7CisgICAgICBTa2lwVG9OZXh0Q2xhdXNlKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTcGVjaWZpY0NsYXVzZT4KKyAgc3RhdGljIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHNwZWNpZmljX2NsYXVzZV9pdGVyYXRvcjxTcGVjaWZpY0NsYXVzZT4+CisgIGdldENsYXVzZXNPZktpbmQoQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMpIHsKKyAgICByZXR1cm4ge3NwZWNpZmljX2NsYXVzZV9pdGVyYXRvcjxTcGVjaWZpY0NsYXVzZT4oQ2xhdXNlcyksCisgICAgICAgICAgICBzcGVjaWZpY19jbGF1c2VfaXRlcmF0b3I8U3BlY2lmaWNDbGF1c2U+KAorICAgICAgICAgICAgICAgIGxsdm06Om1ha2VBcnJheVJlZihDbGF1c2VzLmVuZCgpLCAwKSl9OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFNwZWNpZmljQ2xhdXNlPgorICBsbHZtOjppdGVyYXRvcl9yYW5nZTxzcGVjaWZpY19jbGF1c2VfaXRlcmF0b3I8U3BlY2lmaWNDbGF1c2U+PgorICBnZXRDbGF1c2VzT2ZLaW5kKCkgY29uc3QgeworICAgIHJldHVybiBnZXRDbGF1c2VzT2ZLaW5kPFNwZWNpZmljQ2xhdXNlPihjbGF1c2VzKCkpOworICB9CisKKyAgLy8vIEdldHMgYSBzaW5nbGUgY2xhdXNlIG9mIHRoZSBzcGVjaWZpZWQga2luZCBhc3NvY2lhdGVkIHdpdGggdGhlCisgIC8vLyBjdXJyZW50IGRpcmVjdGl2ZSBpZmYgdGhlcmUgaXMgb25seSBvbmUgY2xhdXNlIG9mIHRoaXMga2luZCAoYW5kIGFzc2VydGlvbgorICAvLy8gaXMgZmlyZWQgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBjbGF1c2UgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAvLy8gZGlyZWN0aXZlKS4gUmV0dXJucyBudWxscHRyIGlmIG5vIGNsYXVzZSBvZiB0aGlzIGtpbmQgaXMgYXNzb2NpYXRlZCB3aXRoCisgIC8vLyB0aGUgZGlyZWN0aXZlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3BlY2lmaWNDbGF1c2U+CisgIGNvbnN0IFNwZWNpZmljQ2xhdXNlICpnZXRTaW5nbGVDbGF1c2UoKSBjb25zdCB7CisgICAgYXV0byBDbGF1c2VzID0gZ2V0Q2xhdXNlc09mS2luZDxTcGVjaWZpY0NsYXVzZT4oKTsKKworICAgIGlmIChDbGF1c2VzLmJlZ2luKCkgIT0gQ2xhdXNlcy5lbmQoKSkgeworICAgICAgYXNzZXJ0KHN0ZDo6bmV4dChDbGF1c2VzLmJlZ2luKCkpID09IENsYXVzZXMuZW5kKCkgJiYKKyAgICAgICAgICAgICAiVGhlcmUgYXJlIGF0IGxlYXN0IDIgY2xhdXNlcyBvZiB0aGUgc3BlY2lmaWVkIGtpbmQiKTsKKyAgICAgIHJldHVybiAqQ2xhdXNlcy5iZWdpbigpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgZGlyZWN0aXZlIGhhcyBvbmUgb3IgbW9yZSBjbGF1c2VzIG9mIGEKKyAgLy8vIHNwZWNpZmljIGtpbmQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTcGVjaWZpY0NsYXVzZT4KKyAgYm9vbCBoYXNDbGF1c2VzT2ZLaW5kKCkgY29uc3QgeworICAgIGF1dG8gQ2xhdXNlcyA9IGdldENsYXVzZXNPZktpbmQ8U3BlY2lmaWNDbGF1c2U+KCk7CisgICAgcmV0dXJuIENsYXVzZXMuYmVnaW4oKSAhPSBDbGF1c2VzLmVuZCgpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHN0YXJ0aW5nIGxvY2F0aW9uIG9mIGRpcmVjdGl2ZSBraW5kLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IHsgcmV0dXJuIFN0YXJ0TG9jOyB9CisgIC8vLyBcYnJpZWYgUmV0dXJucyBlbmRpbmcgbG9jYXRpb24gb2YgZGlyZWN0aXZlLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCB7IHJldHVybiBFbmRMb2M7IH0KKworICAvLy8gXGJyaWVmIFNldCBzdGFydGluZyBsb2NhdGlvbiBvZiBkaXJlY3RpdmUga2luZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gTG9jIE5ldyBzdGFydGluZyBsb2NhdGlvbiBvZiBkaXJlY3RpdmUuCisgIC8vLworICB2b2lkIHNldExvY1N0YXJ0KFNvdXJjZUxvY2F0aW9uIExvYykgeyBTdGFydExvYyA9IExvYzsgfQorICAvLy8gXGJyaWVmIFNldCBlbmRpbmcgbG9jYXRpb24gb2YgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBMb2MgTmV3IGVuZGluZyBsb2NhdGlvbiBvZiBkaXJlY3RpdmUuCisgIC8vLworICB2b2lkIHNldExvY0VuZChTb3VyY2VMb2NhdGlvbiBMb2MpIHsgRW5kTG9jID0gTG9jOyB9CisKKyAgLy8vIFxicmllZiBHZXQgbnVtYmVyIG9mIGNsYXVzZXMuCisgIHVuc2lnbmVkIGdldE51bUNsYXVzZXMoKSBjb25zdCB7IHJldHVybiBOdW1DbGF1c2VzOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHNwZWNpZmllZCBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIGkgTnVtYmVyIG9mIGNsYXVzZS4KKyAgLy8vCisgIE9NUENsYXVzZSAqZ2V0Q2xhdXNlKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIGNsYXVzZXMoKVtpXTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIGRpcmVjdGl2ZSBoYXMgYXNzb2NpYXRlZCBzdGF0ZW1lbnQuCisgIGJvb2wgaGFzQXNzb2NpYXRlZFN0bXQoKSBjb25zdCB7IHJldHVybiBOdW1DaGlsZHJlbiA+IDA7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgc3RhdGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlLgorICBjb25zdCBTdG10ICpnZXRBc3NvY2lhdGVkU3RtdCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaGFzQXNzb2NpYXRlZFN0bXQoKSAmJiAibm8gYXNzb2NpYXRlZCBzdGF0ZW1lbnQuIik7CisgICAgcmV0dXJuICpjaGlsZF9iZWdpbigpOworICB9CisgIFN0bXQgKmdldEFzc29jaWF0ZWRTdG10KCkgeworICAgIGFzc2VydChoYXNBc3NvY2lhdGVkU3RtdCgpICYmICJubyBhc3NvY2lhdGVkIHN0YXRlbWVudC4iKTsKKyAgICByZXR1cm4gKmNoaWxkX2JlZ2luKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGNhcHR1cmVkIHN0YXRlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlCisgIC8vLyBjb21wb25lbnQgcmVnaW9uIHdpdGhpbiB0aGUgKGNvbWJpbmVkKSBkaXJlY3RpdmUuCisgIC8vCisgIC8vIFxwYXJhbSBSZWdpb25LaW5kIENvbXBvbmVudCByZWdpb24ga2luZC4KKyAgY29uc3QgQ2FwdHVyZWRTdG10ICpnZXRDYXB0dXJlZFN0bXQoT3Blbk1QRGlyZWN0aXZlS2luZCBSZWdpb25LaW5kKSBjb25zdCB7CisgICAgU21hbGxWZWN0b3I8T3Blbk1QRGlyZWN0aXZlS2luZCwgND4gQ2FwdHVyZVJlZ2lvbnM7CisgICAgZ2V0T3Blbk1QQ2FwdHVyZVJlZ2lvbnMoQ2FwdHVyZVJlZ2lvbnMsIGdldERpcmVjdGl2ZUtpbmQoKSk7CisgICAgYXNzZXJ0KHN0ZDo6YW55X29mKAorICAgICAgICAgICAgICAgQ2FwdHVyZVJlZ2lvbnMuYmVnaW4oKSwgQ2FwdHVyZVJlZ2lvbnMuZW5kKCksCisgICAgICAgICAgICAgICBbPV0oY29uc3QgT3Blbk1QRGlyZWN0aXZlS2luZCBLKSB7IHJldHVybiBLID09IFJlZ2lvbktpbmQ7IH0pICYmCisgICAgICAgICAgICJSZWdpb25LaW5kIG5vdCBmb3VuZCBpbiBPcGVuTVAgQ2FwdHVyZVJlZ2lvbnMuIik7CisgICAgYXV0byAqQ1MgPSBjYXN0PENhcHR1cmVkU3RtdD4oZ2V0QXNzb2NpYXRlZFN0bXQoKSk7CisgICAgZm9yIChhdXRvIFRoaXNDYXB0dXJlUmVnaW9uIDogQ2FwdHVyZVJlZ2lvbnMpIHsKKyAgICAgIGlmIChUaGlzQ2FwdHVyZVJlZ2lvbiA9PSBSZWdpb25LaW5kKQorICAgICAgICByZXR1cm4gQ1M7CisgICAgICBDUyA9IGNhc3Q8Q2FwdHVyZWRTdG10PihDUy0+Z2V0Q2FwdHVyZWRTdG10KCkpOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbmNvcnJlY3QgUmVnaW9uS2luZCBzcGVjaWZpZWQgZm9yIGRpcmVjdGl2ZS4iKTsKKyAgfQorCisgIC8vLyBHZXQgaW5uZXJtb3N0IGNhcHR1cmVkIHN0YXRlbWVudCBmb3IgdGhlIGNvbnN0cnVjdC4KKyAgQ2FwdHVyZWRTdG10ICpnZXRJbm5lcm1vc3RDYXB0dXJlZFN0bXQoKSB7CisgICAgYXNzZXJ0KGhhc0Fzc29jaWF0ZWRTdG10KCkgJiYgZ2V0QXNzb2NpYXRlZFN0bXQoKSAmJgorICAgICAgICAgICAiTXVzdCBoYXZlIGFzc29jaWF0ZWQgc3RhdGVtZW50LiIpOworICAgIFNtYWxsVmVjdG9yPE9wZW5NUERpcmVjdGl2ZUtpbmQsIDQ+IENhcHR1cmVSZWdpb25zOworICAgIGdldE9wZW5NUENhcHR1cmVSZWdpb25zKENhcHR1cmVSZWdpb25zLCBnZXREaXJlY3RpdmVLaW5kKCkpOworICAgIGFzc2VydCghQ2FwdHVyZVJlZ2lvbnMuZW1wdHkoKSAmJgorICAgICAgICAgICAiQXQgbGVhc3Qgb25lIGNhcHR1cmVkIHN0YXRlbWVudCBtdXN0IGJlIHByb3ZpZGVkLiIpOworICAgIGF1dG8gKkNTID0gY2FzdDxDYXB0dXJlZFN0bXQ+KGdldEFzc29jaWF0ZWRTdG10KCkpOworICAgIGZvciAodW5zaWduZWQgTGV2ZWwgPSBDYXB0dXJlUmVnaW9ucy5zaXplKCk7IExldmVsID4gMTsgLS1MZXZlbCkKKyAgICAgIENTID0gY2FzdDxDYXB0dXJlZFN0bXQ+KENTLT5nZXRDYXB0dXJlZFN0bXQoKSk7CisgICAgcmV0dXJuIENTOworICB9CisKKyAgY29uc3QgQ2FwdHVyZWRTdG10ICpnZXRJbm5lcm1vc3RDYXB0dXJlZFN0bXQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8T01QRXhlY3V0YWJsZURpcmVjdGl2ZSAqPih0aGlzKQorICAgICAgICAtPmdldElubmVybW9zdENhcHR1cmVkU3RtdCgpOworICB9CisKKyAgT3Blbk1QRGlyZWN0aXZlS2luZCBnZXREaXJlY3RpdmVLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqUykgeworICAgIHJldHVybiBTLT5nZXRTdG10Q2xhc3MoKSA+PSBmaXJzdE9NUEV4ZWN1dGFibGVEaXJlY3RpdmVDb25zdGFudCAmJgorICAgICAgICAgICBTLT5nZXRTdG10Q2xhc3MoKSA8PSBsYXN0T01QRXhlY3V0YWJsZURpcmVjdGl2ZUNvbnN0YW50OworICB9CisKKyAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgaWYgKCFoYXNBc3NvY2lhdGVkU3RtdCgpKQorICAgICAgcmV0dXJuIGNoaWxkX3JhbmdlKGNoaWxkX2l0ZXJhdG9yKCksIGNoaWxkX2l0ZXJhdG9yKCkpOworICAgIFN0bXQgKipDaGlsZFN0b3JhZ2UgPSByZWludGVycHJldF9jYXN0PFN0bXQgKio+KGdldENsYXVzZXMoKS5lbmQoKSk7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKENoaWxkU3RvcmFnZSwgQ2hpbGRTdG9yYWdlICsgTnVtQ2hpbGRyZW4pOworICB9CisKKyAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IGNsYXVzZXMoKSB7IHJldHVybiBnZXRDbGF1c2VzKCk7IH0KKworICBBcnJheVJlZjxPTVBDbGF1c2UgKj4gY2xhdXNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxPTVBFeGVjdXRhYmxlRGlyZWN0aXZlICo+KHRoaXMpLT5nZXRDbGF1c2VzKCk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCBwYXJhbGxlbCcgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGEsYikgcmVkdWN0aW9uKCs6IGMsZCkKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHBhcmFsbGVsJyBoYXMgY2xhdXNlcyAncHJpdmF0ZScKKy8vLyB3aXRoIHRoZSB2YXJpYWJsZXMgJ2EnIGFuZCAnYicgYW5kICdyZWR1Y3Rpb24nIHdpdGggb3BlcmF0b3IgJysnIGFuZAorLy8vIHZhcmlhYmxlcyAnYycgYW5kICdkJy4KKy8vLworY2xhc3MgT01QUGFyYWxsZWxEaXJlY3RpdmUgOiBwdWJsaWMgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICAvLy8gXGJyaWVmIHRydWUgaWYgdGhlIGNvbnN0cnVjdCBoYXMgaW5uZXIgY2FuY2VsIGRpcmVjdGl2ZS4KKyAgYm9vbCBIYXNDYW5jZWw7CisKKyAgLy8vIFxicmllZiBCdWlsZCBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIGVuZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSAoZGlyZWN0aXZlIGtleXdvcmQpLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgTG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vCisgIE9NUFBhcmFsbGVsRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QUGFyYWxsZWxEaXJlY3RpdmVDbGFzcywgT01QRF9wYXJhbGxlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydExvYywgRW5kTG9jLCBOdW1DbGF1c2VzLCAxKSwKKyAgICAgICAgSGFzQ2FuY2VsKGZhbHNlKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgZXhwbGljaXQgT01QUGFyYWxsZWxEaXJlY3RpdmUodW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBQYXJhbGxlbERpcmVjdGl2ZUNsYXNzLCBPTVBEX3BhcmFsbGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSksCisgICAgICAgIEhhc0NhbmNlbChmYWxzZSkge30KKworICAvLy8gXGJyaWVmIFNldCBjYW5jZWwgc3RhdGUuCisgIHZvaWQgc2V0SGFzQ2FuY2VsKGJvb2wgSGFzKSB7IEhhc0NhbmNlbCA9IEhhczsgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBkaXJlY3RpdmUgd2l0aCBhIGxpc3Qgb2YgXGEgQ2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENsYXVzZXMgTGlzdCBvZiBjbGF1c2VzLgorICAvLy8gXHBhcmFtIEFzc29jaWF0ZWRTdG10IFN0YXRlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBIYXNDYW5jZWwgdHJ1ZSBpZiB0aGlzIGRpcmVjdGl2ZSBoYXMgaW5uZXIgY2FuY2VsIGRpcmVjdGl2ZS4KKyAgLy8vCisgIHN0YXRpYyBPTVBQYXJhbGxlbERpcmVjdGl2ZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsIFN0bXQgKkFzc29jaWF0ZWRTdG10LCBib29sIEhhc0NhbmNlbCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZSBmb3IgXGEgTiBjbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBzdGF0aWMgT01QUGFyYWxsZWxEaXJlY3RpdmUgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcywgRW1wdHlTaGVsbCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBjdXJyZW50IGRpcmVjdGl2ZSBoYXMgaW5uZXIgY2FuY2VsIGRpcmVjdGl2ZS4KKyAgYm9vbCBoYXNDYW5jZWwoKSBjb25zdCB7IHJldHVybiBIYXNDYW5jZWw7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QUGFyYWxsZWxEaXJlY3RpdmVDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIGlzIGEgY29tbW9uIGJhc2UgY2xhc3MgZm9yIGxvb3AgZGlyZWN0aXZlcyAoJ29tcCBzaW1kJywgJ29tcAorLy8vIGZvcicsICdvbXAgZm9yIHNpbWQnIGV0Yy4pLiBJdCBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGxvb3AgY29kZSBnZW5lcmF0aW9uLgorLy8vCitjbGFzcyBPTVBMb29wRGlyZWN0aXZlIDogcHVibGljIE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUgeworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKyAgLy8vIFxicmllZiBOdW1iZXIgb2YgY29sbGFwc2VkIGxvb3BzIGFzIHNwZWNpZmllZCBieSAnY29sbGFwc2UnIGNsYXVzZS4KKyAgdW5zaWduZWQgQ29sbGFwc2VkTnVtOworCisgIC8vLyBcYnJpZWYgT2Zmc2V0cyB0byB0aGUgc3RvcmVkIGV4cHJzLgorICAvLy8gVGhpcyBlbnVtZXJhdGlvbiBjb250YWlucyBvZmZzZXRzIHRvIGFsbCB0aGUgcG9pbnRlcnMgdG8gY2hpbGRyZW4KKyAgLy8vIGV4cHJlc3Npb25zIHN0b3JlZCBpbiBPTVBMb29wRGlyZWN0aXZlLgorICAvLy8gVGhlIGZpcnN0IDkgY2hpbGRyZW4gYXJlIG5lY2Vzc2FyeSBmb3IgYWxsIHRoZSBsb29wIGRpcmVjdGl2ZXMsCisgIC8vLyB0aGUgbmV4dCA4IGFyZSBzcGVjaWZpYyB0byB0aGUgd29ya3NoYXJpbmcgb25lcywgYW5kIHRoZSBuZXh0IDExIGFyZQorICAvLy8gdXNlZCBmb3IgY29tYmluZWQgY29uc3RydWN0cyBjb250YWluaW5nIHR3byBwcmFnbWFzIGFzc29jaWF0ZWQgdG8gbG9vcHMuCisgIC8vLyBBZnRlciB0aGUgZml4ZWQgY2hpbGRyZW4sIHRocmVlIGFycmF5cyBvZiBsZW5ndGggQ29sbGFwc2VkTnVtIGFyZQorICAvLy8gYWxsb2NhdGVkOiBsb29wIGNvdW50ZXJzLCB0aGVpciB1cGRhdGVzIGFuZCBmaW5hbCB2YWx1ZXMuCisgIC8vLyBQcmV2TG93ZXJCb3VuZCBhbmQgUHJldlVwcGVyQm91bmQgYXJlIHVzZWQgdG8gY29tbXVuaWNhdGUgYmxvY2tpbmcKKyAgLy8vIGluZm9ybWF0aW9uIGluIGNvbXBvc2l0ZSBjb25zdHJ1Y3RzIHdoaWNoIHJlcXVpcmUgbG9vcCBibG9ja2luZworICAvLy8gRGlzdEluYyBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBpbmNyZW1lbnQgZXhwcmVzc2lvbiBmb3IgdGhlIGRpc3RyaWJ1dGUKKyAgLy8vIGxvb3Agd2hlbiBjb21iaW5lZCB3aXRoIGEgZnVydGhlciBuZXN0ZWQgbG9vcAorICAvLy8gUHJldkVuc3VyZVVwcGVyQm91bmQgaXMgdXNlZCBhcyB0aGUgRW5zdXJlVXBwZXJCb3VuZCBleHByZXNzaW9uIGZvciB0aGUKKyAgLy8vIGZvciBsb29wIHdoZW4gY29tYmluZWQgd2l0aCBhIHByZXZpb3VzIGRpc3RyaWJ1dGUgbG9vcCBpbiB0aGUgc2FtZSBwcmFnbWEKKyAgLy8vIChlLmcuICdkaXN0cmlidXRlIHBhcmFsbGVsIGZvcicpCisgIC8vLworICBlbnVtIHsKKyAgICBBc3NvY2lhdGVkU3RtdE9mZnNldCA9IDAsCisgICAgSXRlcmF0aW9uVmFyaWFibGVPZmZzZXQgPSAxLAorICAgIExhc3RJdGVyYXRpb25PZmZzZXQgPSAyLAorICAgIENhbGNMYXN0SXRlcmF0aW9uT2Zmc2V0ID0gMywKKyAgICBQcmVDb25kaXRpb25PZmZzZXQgPSA0LAorICAgIENvbmRPZmZzZXQgPSA1LAorICAgIEluaXRPZmZzZXQgPSA2LAorICAgIEluY09mZnNldCA9IDcsCisgICAgUHJlSW5pdHNPZmZzZXQgPSA4LAorICAgIC8vIFRoZSAnLi4uRW5kJyBlbnVtZXJhdG9ycyBkbyBub3QgY29ycmVzcG9uZCB0byBjaGlsZCBleHByZXNzaW9ucyAtIHRoZXkKKyAgICAvLyBzcGVjaWZ5IHRoZSBvZmZzZXQgdG8gdGhlIGVuZCAoYW5kIHN0YXJ0IG9mIHRoZSBmb2xsb3dpbmcgY291bnRlcnMvCisgICAgLy8gdXBkYXRlcy9maW5hbHMgYXJyYXlzKS4KKyAgICBEZWZhdWx0RW5kID0gOSwKKyAgICAvLyBUaGUgZm9sbG93aW5nIDggZXhwcnMgYXJlIHVzZWQgYnkgd29ya3NoYXJpbmcgYW5kIGRpc3RyaWJ1dGUgbG9vcHMgb25seS4KKyAgICBJc0xhc3RJdGVyVmFyaWFibGVPZmZzZXQgPSA5LAorICAgIExvd2VyQm91bmRWYXJpYWJsZU9mZnNldCA9IDEwLAorICAgIFVwcGVyQm91bmRWYXJpYWJsZU9mZnNldCA9IDExLAorICAgIFN0cmlkZVZhcmlhYmxlT2Zmc2V0ID0gMTIsCisgICAgRW5zdXJlVXBwZXJCb3VuZE9mZnNldCA9IDEzLAorICAgIE5leHRMb3dlckJvdW5kT2Zmc2V0ID0gMTQsCisgICAgTmV4dFVwcGVyQm91bmRPZmZzZXQgPSAxNSwKKyAgICBOdW1JdGVyYXRpb25zT2Zmc2V0ID0gMTYsCisgICAgLy8gT2Zmc2V0IHRvIHRoZSBlbmQgZm9yIHdvcmtzaGFyaW5nIGxvb3AgZGlyZWN0aXZlcy4KKyAgICBXb3Jrc2hhcmluZ0VuZCA9IDE3LAorICAgIFByZXZMb3dlckJvdW5kVmFyaWFibGVPZmZzZXQgPSAxNywKKyAgICBQcmV2VXBwZXJCb3VuZFZhcmlhYmxlT2Zmc2V0ID0gMTgsCisgICAgRGlzdEluY09mZnNldCA9IDE5LAorICAgIFByZXZFbnN1cmVVcHBlckJvdW5kT2Zmc2V0ID0gMjAsCisgICAgQ29tYmluZWRMb3dlckJvdW5kVmFyaWFibGVPZmZzZXQgPSAyMSwKKyAgICBDb21iaW5lZFVwcGVyQm91bmRWYXJpYWJsZU9mZnNldCA9IDIyLAorICAgIENvbWJpbmVkRW5zdXJlVXBwZXJCb3VuZE9mZnNldCA9IDIzLAorICAgIENvbWJpbmVkSW5pdE9mZnNldCA9IDI0LAorICAgIENvbWJpbmVkQ29uZGl0aW9uT2Zmc2V0ID0gMjUsCisgICAgQ29tYmluZWROZXh0TG93ZXJCb3VuZE9mZnNldCA9IDI2LAorICAgIENvbWJpbmVkTmV4dFVwcGVyQm91bmRPZmZzZXQgPSAyNywKKyAgICAvLyBPZmZzZXQgdG8gdGhlIGVuZCAoYW5kIHN0YXJ0IG9mIHRoZSBmb2xsb3dpbmcgY291bnRlcnMvdXBkYXRlcy9maW5hbHMKKyAgICAvLyBhcnJheXMpIGZvciBjb21iaW5lZCBkaXN0cmlidXRlIGxvb3AgZGlyZWN0aXZlcy4KKyAgICBDb21iaW5lZERpc3RyaWJ1dGVFbmQgPSAyOCwKKyAgfTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgY291bnRlcnMgc3RvcmFnZS4KKyAgTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4gZ2V0Q291bnRlcnMoKSB7CisgICAgRXhwciAqKlN0b3JhZ2UgPSByZWludGVycHJldF9jYXN0PEV4cHIgKio+KAorICAgICAgICAmKCooc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIGdldEFycmF5c09mZnNldChnZXREaXJlY3RpdmVLaW5kKCkpKSkpKTsKKyAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4oU3RvcmFnZSwgQ29sbGFwc2VkTnVtKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBwcml2YXRlIGNvdW50ZXJzIHN0b3JhZ2UuCisgIE11dGFibGVBcnJheVJlZjxFeHByICo+IGdldFByaXZhdGVDb3VudGVycygpIHsKKyAgICBFeHByICoqU3RvcmFnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RXhwciAqKj4oJipzdGQ6Om5leHQoCisgICAgICAgIGNoaWxkX2JlZ2luKCksIGdldEFycmF5c09mZnNldChnZXREaXJlY3RpdmVLaW5kKCkpICsgQ29sbGFwc2VkTnVtKSk7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxFeHByICo+KFN0b3JhZ2UsIENvbGxhcHNlZE51bSk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgdXBkYXRlcyBzdG9yYWdlLgorICBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPiBnZXRJbml0cygpIHsKKyAgICBFeHByICoqU3RvcmFnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RXhwciAqKj4oCisgICAgICAgICYqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIGdldEFycmF5c09mZnNldChnZXREaXJlY3RpdmVLaW5kKCkpICsgMiAqIENvbGxhcHNlZE51bSkpOworICAgIHJldHVybiBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPihTdG9yYWdlLCBDb2xsYXBzZWROdW0pOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHVwZGF0ZXMgc3RvcmFnZS4KKyAgTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4gZ2V0VXBkYXRlcygpIHsKKyAgICBFeHByICoqU3RvcmFnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RXhwciAqKj4oCisgICAgICAgICYqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIGdldEFycmF5c09mZnNldChnZXREaXJlY3RpdmVLaW5kKCkpICsgMyAqIENvbGxhcHNlZE51bSkpOworICAgIHJldHVybiBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPihTdG9yYWdlLCBDb2xsYXBzZWROdW0pOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGZpbmFsIGNvdW50ZXIgdXBkYXRlcyBzdG9yYWdlLgorICBNdXRhYmxlQXJyYXlSZWY8RXhwciAqPiBnZXRGaW5hbHMoKSB7CisgICAgRXhwciAqKlN0b3JhZ2UgPSByZWludGVycHJldF9jYXN0PEV4cHIgKio+KAorICAgICAgICAmKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBnZXRBcnJheXNPZmZzZXQoZ2V0RGlyZWN0aXZlS2luZCgpKSArIDQgKiBDb2xsYXBzZWROdW0pKTsKKyAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPEV4cHIgKj4oU3RvcmFnZSwgQ29sbGFwc2VkTnVtKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8vLyBcYnJpZWYgQnVpbGQgaW5zdGFuY2Ugb2YgbG9vcCBkaXJlY3RpdmUgb2YgY2xhc3MgXGEgS2luZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gU0MgU3RhdGVtZW50IGNsYXNzLgorICAvLy8gXHBhcmFtIEtpbmQgS2luZCBvZiBPcGVuTVAgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUgKGRpcmVjdGl2ZSBrZXl3b3JkKS4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbG9vcHMgZnJvbSAnY29sbGFwc2UnIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8gXHBhcmFtIE51bVNwZWNpYWxDaGlsZHJlbiBOdW1iZXIgb2YgYWRkaXRpb25hbCBkaXJlY3RpdmUtc3BlY2lmaWMgc3RtdHMuCisgIC8vLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgT01QTG9vcERpcmVjdGl2ZShjb25zdCBUICpUaGF0LCBTdG10Q2xhc3MgU0MsIE9wZW5NUERpcmVjdGl2ZUtpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwgdW5zaWduZWQgTnVtQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1TcGVjaWFsQ2hpbGRyZW4gPSAwKQorICAgICAgOiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFRoYXQsIFNDLCBLaW5kLCBTdGFydExvYywgRW5kTG9jLCBOdW1DbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUxvb3BDaGlsZHJlbihDb2xsYXBzZWROdW0sIEtpbmQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU3BlY2lhbENoaWxkcmVuKSwKKyAgICAgICAgQ29sbGFwc2VkTnVtKENvbGxhcHNlZE51bSkge30KKworICAvLy8gXGJyaWVmIE9mZnNldCB0byB0aGUgc3RhcnQgb2YgY2hpbGRyZW4gZXhwcmVzc2lvbiBhcnJheXMuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRBcnJheXNPZmZzZXQoT3Blbk1QRGlyZWN0aXZlS2luZCBLaW5kKSB7CisgICAgaWYgKGlzT3Blbk1QTG9vcEJvdW5kU2hhcmluZ0RpcmVjdGl2ZShLaW5kKSkKKyAgICAgIHJldHVybiBDb21iaW5lZERpc3RyaWJ1dGVFbmQ7CisgICAgaWYgKGlzT3Blbk1QV29ya3NoYXJpbmdEaXJlY3RpdmUoS2luZCkgfHwgaXNPcGVuTVBUYXNrTG9vcERpcmVjdGl2ZShLaW5kKSB8fAorICAgICAgICBpc09wZW5NUERpc3RyaWJ1dGVEaXJlY3RpdmUoS2luZCkpCisgICAgICByZXR1cm4gV29ya3NoYXJpbmdFbmQ7CisgICAgcmV0dXJuIERlZmF1bHRFbmQ7CisgIH0KKworICAvLy8gXGJyaWVmIENoaWxkcmVuIG51bWJlci4KKyAgc3RhdGljIHVuc2lnbmVkIG51bUxvb3BDaGlsZHJlbih1bnNpZ25lZCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3Blbk1QRGlyZWN0aXZlS2luZCBLaW5kKSB7CisgICAgcmV0dXJuIGdldEFycmF5c09mZnNldChLaW5kKSArIDUgKiBDb2xsYXBzZWROdW07IC8vIENvdW50ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcml2YXRlQ291bnRlcnMsIEluaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGVzIGFuZCBGaW5hbHMKKyAgfQorCisgIHZvaWQgc2V0SXRlcmF0aW9uVmFyaWFibGUoRXhwciAqSVYpIHsKKyAgICAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIEl0ZXJhdGlvblZhcmlhYmxlT2Zmc2V0KSA9IElWOworICB9CisgIHZvaWQgc2V0TGFzdEl0ZXJhdGlvbihFeHByICpMSSkgeworICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgTGFzdEl0ZXJhdGlvbk9mZnNldCkgPSBMSTsKKyAgfQorICB2b2lkIHNldENhbGNMYXN0SXRlcmF0aW9uKEV4cHIgKkNMSSkgeworICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgQ2FsY0xhc3RJdGVyYXRpb25PZmZzZXQpID0gQ0xJOworICB9CisgIHZvaWQgc2V0UHJlQ29uZChFeHByICpQQykgeworICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgUHJlQ29uZGl0aW9uT2Zmc2V0KSA9IFBDOworICB9CisgIHZvaWQgc2V0Q29uZChFeHByICpDb25kKSB7CisgICAgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCBDb25kT2Zmc2V0KSA9IENvbmQ7CisgIH0KKyAgdm9pZCBzZXRJbml0KEV4cHIgKkluaXQpIHsgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCBJbml0T2Zmc2V0KSA9IEluaXQ7IH0KKyAgdm9pZCBzZXRJbmMoRXhwciAqSW5jKSB7ICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgSW5jT2Zmc2V0KSA9IEluYzsgfQorICB2b2lkIHNldFByZUluaXRzKFN0bXQgKlByZUluaXRzKSB7CisgICAgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCBQcmVJbml0c09mZnNldCkgPSBQcmVJbml0czsKKyAgfQorICB2b2lkIHNldElzTGFzdEl0ZXJWYXJpYWJsZShFeHByICpJTCkgeworICAgIGFzc2VydCgoaXNPcGVuTVBXb3Jrc2hhcmluZ0RpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpIHx8CisgICAgICAgICAgICBpc09wZW5NUFRhc2tMb29wRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgfHwKKyAgICAgICAgICAgIGlzT3Blbk1QRGlzdHJpYnV0ZURpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpKSAmJgorICAgICAgICAgICAiZXhwZWN0ZWQgd29ya3NoYXJpbmcgbG9vcCBkaXJlY3RpdmUiKTsKKyAgICAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIElzTGFzdEl0ZXJWYXJpYWJsZU9mZnNldCkgPSBJTDsKKyAgfQorICB2b2lkIHNldExvd2VyQm91bmRWYXJpYWJsZShFeHByICpMQikgeworICAgIGFzc2VydCgoaXNPcGVuTVBXb3Jrc2hhcmluZ0RpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpIHx8CisgICAgICAgICAgICBpc09wZW5NUFRhc2tMb29wRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgfHwKKyAgICAgICAgICAgIGlzT3Blbk1QRGlzdHJpYnV0ZURpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpKSAmJgorICAgICAgICAgICAiZXhwZWN0ZWQgd29ya3NoYXJpbmcgbG9vcCBkaXJlY3RpdmUiKTsKKyAgICAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIExvd2VyQm91bmRWYXJpYWJsZU9mZnNldCkgPSBMQjsKKyAgfQorICB2b2lkIHNldFVwcGVyQm91bmRWYXJpYWJsZShFeHByICpVQikgeworICAgIGFzc2VydCgoaXNPcGVuTVBXb3Jrc2hhcmluZ0RpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpIHx8CisgICAgICAgICAgICBpc09wZW5NUFRhc2tMb29wRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgfHwKKyAgICAgICAgICAgIGlzT3Blbk1QRGlzdHJpYnV0ZURpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpKSAmJgorICAgICAgICAgICAiZXhwZWN0ZWQgd29ya3NoYXJpbmcgbG9vcCBkaXJlY3RpdmUiKTsKKyAgICAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIFVwcGVyQm91bmRWYXJpYWJsZU9mZnNldCkgPSBVQjsKKyAgfQorICB2b2lkIHNldFN0cmlkZVZhcmlhYmxlKEV4cHIgKlNUKSB7CisgICAgYXNzZXJ0KChpc09wZW5NUFdvcmtzaGFyaW5nRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgfHwKKyAgICAgICAgICAgIGlzT3Blbk1QVGFza0xvb3BEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSB8fAorICAgICAgICAgICAgaXNPcGVuTVBEaXN0cmlidXRlRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkpICYmCisgICAgICAgICAgICJleHBlY3RlZCB3b3Jrc2hhcmluZyBsb29wIGRpcmVjdGl2ZSIpOworICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgU3RyaWRlVmFyaWFibGVPZmZzZXQpID0gU1Q7CisgIH0KKyAgdm9pZCBzZXRFbnN1cmVVcHBlckJvdW5kKEV4cHIgKkVVQikgeworICAgIGFzc2VydCgoaXNPcGVuTVBXb3Jrc2hhcmluZ0RpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpIHx8CisgICAgICAgICAgICBpc09wZW5NUFRhc2tMb29wRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgfHwKKyAgICAgICAgICAgIGlzT3Blbk1QRGlzdHJpYnV0ZURpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpKSAmJgorICAgICAgICAgICAiZXhwZWN0ZWQgd29ya3NoYXJpbmcgbG9vcCBkaXJlY3RpdmUiKTsKKyAgICAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIEVuc3VyZVVwcGVyQm91bmRPZmZzZXQpID0gRVVCOworICB9CisgIHZvaWQgc2V0TmV4dExvd2VyQm91bmQoRXhwciAqTkxCKSB7CisgICAgYXNzZXJ0KChpc09wZW5NUFdvcmtzaGFyaW5nRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgfHwKKyAgICAgICAgICAgIGlzT3Blbk1QVGFza0xvb3BEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSB8fAorICAgICAgICAgICAgaXNPcGVuTVBEaXN0cmlidXRlRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkpICYmCisgICAgICAgICAgICJleHBlY3RlZCB3b3Jrc2hhcmluZyBsb29wIGRpcmVjdGl2ZSIpOworICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgTmV4dExvd2VyQm91bmRPZmZzZXQpID0gTkxCOworICB9CisgIHZvaWQgc2V0TmV4dFVwcGVyQm91bmQoRXhwciAqTlVCKSB7CisgICAgYXNzZXJ0KChpc09wZW5NUFdvcmtzaGFyaW5nRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgfHwKKyAgICAgICAgICAgIGlzT3Blbk1QVGFza0xvb3BEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSB8fAorICAgICAgICAgICAgaXNPcGVuTVBEaXN0cmlidXRlRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkpICYmCisgICAgICAgICAgICJleHBlY3RlZCB3b3Jrc2hhcmluZyBsb29wIGRpcmVjdGl2ZSIpOworICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgTmV4dFVwcGVyQm91bmRPZmZzZXQpID0gTlVCOworICB9CisgIHZvaWQgc2V0TnVtSXRlcmF0aW9ucyhFeHByICpOSSkgeworICAgIGFzc2VydCgoaXNPcGVuTVBXb3Jrc2hhcmluZ0RpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpIHx8CisgICAgICAgICAgICBpc09wZW5NUFRhc2tMb29wRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgfHwKKyAgICAgICAgICAgIGlzT3Blbk1QRGlzdHJpYnV0ZURpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpKSAmJgorICAgICAgICAgICAiZXhwZWN0ZWQgd29ya3NoYXJpbmcgbG9vcCBkaXJlY3RpdmUiKTsKKyAgICAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIE51bUl0ZXJhdGlvbnNPZmZzZXQpID0gTkk7CisgIH0KKyAgdm9pZCBzZXRQcmV2TG93ZXJCb3VuZFZhcmlhYmxlKEV4cHIgKlByZXZMQikgeworICAgIGFzc2VydChpc09wZW5NUExvb3BCb3VuZFNoYXJpbmdEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSAmJgorICAgICAgICAgICAiZXhwZWN0ZWQgbG9vcCBib3VuZCBzaGFyaW5nIGRpcmVjdGl2ZSIpOworICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgUHJldkxvd2VyQm91bmRWYXJpYWJsZU9mZnNldCkgPSBQcmV2TEI7CisgIH0KKyAgdm9pZCBzZXRQcmV2VXBwZXJCb3VuZFZhcmlhYmxlKEV4cHIgKlByZXZVQikgeworICAgIGFzc2VydChpc09wZW5NUExvb3BCb3VuZFNoYXJpbmdEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSAmJgorICAgICAgICAgICAiZXhwZWN0ZWQgbG9vcCBib3VuZCBzaGFyaW5nIGRpcmVjdGl2ZSIpOworICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgUHJldlVwcGVyQm91bmRWYXJpYWJsZU9mZnNldCkgPSBQcmV2VUI7CisgIH0KKyAgdm9pZCBzZXREaXN0SW5jKEV4cHIgKkRpc3RJbmMpIHsKKyAgICBhc3NlcnQoaXNPcGVuTVBMb29wQm91bmRTaGFyaW5nRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgJiYKKyAgICAgICAgICAgImV4cGVjdGVkIGxvb3AgYm91bmQgc2hhcmluZyBkaXJlY3RpdmUiKTsKKyAgICAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIERpc3RJbmNPZmZzZXQpID0gRGlzdEluYzsKKyAgfQorICB2b2lkIHNldFByZXZFbnN1cmVVcHBlckJvdW5kKEV4cHIgKlByZXZFVUIpIHsKKyAgICBhc3NlcnQoaXNPcGVuTVBMb29wQm91bmRTaGFyaW5nRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgJiYKKyAgICAgICAgICAgImV4cGVjdGVkIGxvb3AgYm91bmQgc2hhcmluZyBkaXJlY3RpdmUiKTsKKyAgICAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIFByZXZFbnN1cmVVcHBlckJvdW5kT2Zmc2V0KSA9IFByZXZFVUI7CisgIH0KKyAgdm9pZCBzZXRDb21iaW5lZExvd2VyQm91bmRWYXJpYWJsZShFeHByICpDb21iTEIpIHsKKyAgICBhc3NlcnQoaXNPcGVuTVBMb29wQm91bmRTaGFyaW5nRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgJiYKKyAgICAgICAgICAgImV4cGVjdGVkIGxvb3AgYm91bmQgc2hhcmluZyBkaXJlY3RpdmUiKTsKKyAgICAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIENvbWJpbmVkTG93ZXJCb3VuZFZhcmlhYmxlT2Zmc2V0KSA9IENvbWJMQjsKKyAgfQorICB2b2lkIHNldENvbWJpbmVkVXBwZXJCb3VuZFZhcmlhYmxlKEV4cHIgKkNvbWJVQikgeworICAgIGFzc2VydChpc09wZW5NUExvb3BCb3VuZFNoYXJpbmdEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSAmJgorICAgICAgICAgICAiZXhwZWN0ZWQgbG9vcCBib3VuZCBzaGFyaW5nIGRpcmVjdGl2ZSIpOworICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgQ29tYmluZWRVcHBlckJvdW5kVmFyaWFibGVPZmZzZXQpID0gQ29tYlVCOworICB9CisgIHZvaWQgc2V0Q29tYmluZWRFbnN1cmVVcHBlckJvdW5kKEV4cHIgKkNvbWJFVUIpIHsKKyAgICBhc3NlcnQoaXNPcGVuTVBMb29wQm91bmRTaGFyaW5nRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgJiYKKyAgICAgICAgICAgImV4cGVjdGVkIGxvb3AgYm91bmQgc2hhcmluZyBkaXJlY3RpdmUiKTsKKyAgICAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIENvbWJpbmVkRW5zdXJlVXBwZXJCb3VuZE9mZnNldCkgPSBDb21iRVVCOworICB9CisgIHZvaWQgc2V0Q29tYmluZWRJbml0KEV4cHIgKkNvbWJJbml0KSB7CisgICAgYXNzZXJ0KGlzT3Blbk1QTG9vcEJvdW5kU2hhcmluZ0RpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpICYmCisgICAgICAgICAgICJleHBlY3RlZCBsb29wIGJvdW5kIHNoYXJpbmcgZGlyZWN0aXZlIik7CisgICAgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCBDb21iaW5lZEluaXRPZmZzZXQpID0gQ29tYkluaXQ7CisgIH0KKyAgdm9pZCBzZXRDb21iaW5lZENvbmQoRXhwciAqQ29tYkNvbmQpIHsKKyAgICBhc3NlcnQoaXNPcGVuTVBMb29wQm91bmRTaGFyaW5nRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgJiYKKyAgICAgICAgICAgImV4cGVjdGVkIGxvb3AgYm91bmQgc2hhcmluZyBkaXJlY3RpdmUiKTsKKyAgICAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIENvbWJpbmVkQ29uZGl0aW9uT2Zmc2V0KSA9IENvbWJDb25kOworICB9CisgIHZvaWQgc2V0Q29tYmluZWROZXh0TG93ZXJCb3VuZChFeHByICpDb21iTkxCKSB7CisgICAgYXNzZXJ0KGlzT3Blbk1QTG9vcEJvdW5kU2hhcmluZ0RpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpICYmCisgICAgICAgICAgICJleHBlY3RlZCBsb29wIGJvdW5kIHNoYXJpbmcgZGlyZWN0aXZlIik7CisgICAgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCBDb21iaW5lZE5leHRMb3dlckJvdW5kT2Zmc2V0KSA9IENvbWJOTEI7CisgIH0KKyAgdm9pZCBzZXRDb21iaW5lZE5leHRVcHBlckJvdW5kKEV4cHIgKkNvbWJOVUIpIHsKKyAgICBhc3NlcnQoaXNPcGVuTVBMb29wQm91bmRTaGFyaW5nRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgJiYKKyAgICAgICAgICAgImV4cGVjdGVkIGxvb3AgYm91bmQgc2hhcmluZyBkaXJlY3RpdmUiKTsKKyAgICAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIENvbWJpbmVkTmV4dFVwcGVyQm91bmRPZmZzZXQpID0gQ29tYk5VQjsKKyAgfQorICB2b2lkIHNldENvdW50ZXJzKEFycmF5UmVmPEV4cHIgKj4gQSk7CisgIHZvaWQgc2V0UHJpdmF0ZUNvdW50ZXJzKEFycmF5UmVmPEV4cHIgKj4gQSk7CisgIHZvaWQgc2V0SW5pdHMoQXJyYXlSZWY8RXhwciAqPiBBKTsKKyAgdm9pZCBzZXRVcGRhdGVzKEFycmF5UmVmPEV4cHIgKj4gQSk7CisgIHZvaWQgc2V0RmluYWxzKEFycmF5UmVmPEV4cHIgKj4gQSk7CisKK3B1YmxpYzoKKyAgLy8vIFRoZSBleHByZXNzaW9ucyBidWlsdCB0byBzdXBwb3J0IE9wZW5NUCBsb29wcyBpbiBjb21iaW5lZC9jb21wb3NpdGUKKyAgLy8vIHByYWdtYXMgKGUuZy4gcHJhZ21hIG9tcCBkaXN0cmlidXRlIHBhcmFsbGVsIGZvcikKKyAgc3RydWN0IERpc3RDb21iaW5lZEhlbHBlckV4cHJzIHsKKyAgICAvLy8gRGlzdHJpYnV0ZUxvd2VyQm91bmQgLSB1c2VkIHdoZW4gY29tcG9zaW5nICdvbXAgZGlzdHJpYnV0ZScgd2l0aAorICAgIC8vLyAnb21wIGZvcicgaW4gYSBzYW1lIGNvbnN0cnVjdC4KKyAgICBFeHByICpMQjsKKyAgICAvLy8gRGlzdHJpYnV0ZVVwcGVyQm91bmQgLSB1c2VkIHdoZW4gY29tcG9zaW5nICdvbXAgZGlzdHJpYnV0ZScgd2l0aAorICAgIC8vLyAnb21wIGZvcicgaW4gYSBzYW1lIGNvbnN0cnVjdC4KKyAgICBFeHByICpVQjsKKyAgICAvLy8gRGlzdHJpYnV0ZUVuc3VyZVVwcGVyQm91bmQgLSB1c2VkIHdoZW4gY29tcG9zaW5nICdvbXAgZGlzdHJpYnV0ZScKKyAgICAvLy8gIHdpdGggJ29tcCBmb3InIGluIGEgc2FtZSBjb25zdHJ1Y3QsIEVVQiBkZXBlbmRzIG9uIERpc3RVQgorICAgIEV4cHIgKkVVQjsKKyAgICAvLy8gRGlzdHJpYnV0ZSBsb29wIGl0ZXJhdGlvbiB2YXJpYWJsZSBpbml0IHVzZWQgd2hlbiBjb21wb3NpbmcgJ29tcAorICAgIC8vLyBkaXN0cmlidXRlJworICAgIC8vLyAgd2l0aCAnb21wIGZvcicgaW4gYSBzYW1lIGNvbnN0cnVjdAorICAgIEV4cHIgKkluaXQ7CisgICAgLy8vIERpc3RyaWJ1dGUgTG9vcCBjb25kaXRpb24gdXNlZCB3aGVuIGNvbXBvc2luZyAnb21wIGRpc3RyaWJ1dGUnCisgICAgLy8vICB3aXRoICdvbXAgZm9yJyBpbiBhIHNhbWUgY29uc3RydWN0CisgICAgRXhwciAqQ29uZDsKKyAgICAvLy8gVXBkYXRlIG9mIExvd2VyQm91bmQgZm9yIHN0YXRpY2FsbHkgc2hlZHVsZWQgb21wIGxvb3BzIGZvcgorICAgIC8vLyBvdXRlciBsb29wIGluIGNvbWJpbmVkIGNvbnN0cnVjdHMgKGUuZy4gJ2Rpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yJykKKyAgICBFeHByICpOTEI7CisgICAgLy8vIFVwZGF0ZSBvZiBVcHBlckJvdW5kIGZvciBzdGF0aWNhbGx5IHNoZWR1bGVkIG9tcCBsb29wcyBmb3IKKyAgICAvLy8gb3V0ZXIgbG9vcCBpbiBjb21iaW5lZCBjb25zdHJ1Y3RzIChlLmcuICdkaXN0cmlidXRlIHBhcmFsbGVsIGZvcicpCisgICAgRXhwciAqTlVCOworICB9OworCisgIC8vLyBcYnJpZWYgVGhlIGV4cHJlc3Npb25zIGJ1aWx0IGZvciB0aGUgT3Blbk1QIGxvb3AgQ29kZUdlbiBmb3IgdGhlCisgIC8vLyB3aG9sZSBjb2xsYXBzZWQgbG9vcCBuZXN0LgorICBzdHJ1Y3QgSGVscGVyRXhwcnMgeworICAgIC8vLyBcYnJpZWYgTG9vcCBpdGVyYXRpb24gdmFyaWFibGUuCisgICAgRXhwciAqSXRlcmF0aW9uVmFyUmVmOworICAgIC8vLyBcYnJpZWYgTG9vcCBsYXN0IGl0ZXJhdGlvbiBudW1iZXIuCisgICAgRXhwciAqTGFzdEl0ZXJhdGlvbjsKKyAgICAvLy8gXGJyaWVmIExvb3AgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuCisgICAgRXhwciAqTnVtSXRlcmF0aW9uczsKKyAgICAvLy8gXGJyaWVmIENhbGN1bGF0aW9uIG9mIGxhc3QgaXRlcmF0aW9uLgorICAgIEV4cHIgKkNhbGNMYXN0SXRlcmF0aW9uOworICAgIC8vLyBcYnJpZWYgTG9vcCBwcmUtY29uZGl0aW9uLgorICAgIEV4cHIgKlByZUNvbmQ7CisgICAgLy8vIFxicmllZiBMb29wIGNvbmRpdGlvbi4KKyAgICBFeHByICpDb25kOworICAgIC8vLyBcYnJpZWYgTG9vcCBpdGVyYXRpb24gdmFyaWFibGUgaW5pdC4KKyAgICBFeHByICpJbml0OworICAgIC8vLyBcYnJpZWYgTG9vcCBpbmNyZW1lbnQuCisgICAgRXhwciAqSW5jOworICAgIC8vLyBcYnJpZWYgSXNMYXN0SXRlcmF0aW9uIC0gbG9jYWwgZmxhZyB2YXJpYWJsZSBwYXNzZWQgdG8gcnVudGltZS4KKyAgICBFeHByICpJTDsKKyAgICAvLy8gXGJyaWVmIExvd2VyQm91bmQgLSBsb2NhbCB2YXJpYWJsZSBwYXNzZWQgdG8gcnVudGltZS4KKyAgICBFeHByICpMQjsKKyAgICAvLy8gXGJyaWVmIFVwcGVyQm91bmQgLSBsb2NhbCB2YXJpYWJsZSBwYXNzZWQgdG8gcnVudGltZS4KKyAgICBFeHByICpVQjsKKyAgICAvLy8gXGJyaWVmIFN0cmlkZSAtIGxvY2FsIHZhcmlhYmxlIHBhc3NlZCB0byBydW50aW1lLgorICAgIEV4cHIgKlNUOworICAgIC8vLyBcYnJpZWYgRW5zdXJlVXBwZXJCb3VuZCAtLSBleHByZXNzaW9uIFVCID0gbWluKFVCLCBOdW1JdGVyYXRpb25zKS4KKyAgICBFeHByICpFVUI7CisgICAgLy8vIFxicmllZiBVcGRhdGUgb2YgTG93ZXJCb3VuZCBmb3Igc3RhdGljYWxseSBzaGVkdWxlZCAnb21wIGZvcicgbG9vcHMuCisgICAgRXhwciAqTkxCOworICAgIC8vLyBcYnJpZWYgVXBkYXRlIG9mIFVwcGVyQm91bmQgZm9yIHN0YXRpY2FsbHkgc2hlZHVsZWQgJ29tcCBmb3InIGxvb3BzLgorICAgIEV4cHIgKk5VQjsKKyAgICAvLy8gXGJyaWVmIFByZXZpb3VzTG93ZXJCb3VuZCAtIGxvY2FsIHZhcmlhYmxlIHBhc3NlZCB0byBydW50aW1lIGluIHRoZQorICAgIC8vLyBlbmNsb3Npbmcgc2NoZWR1bGUgb3IgbnVsbCBpZiB0aGF0IGRvZXMgbm90IGFwcGx5LgorICAgIEV4cHIgKlByZXZMQjsKKyAgICAvLy8gXGJyaWVmIFByZXZpb3VzVXBwZXJCb3VuZCAtIGxvY2FsIHZhcmlhYmxlIHBhc3NlZCB0byBydW50aW1lIGluIHRoZQorICAgIC8vLyBlbmNsb3Npbmcgc2NoZWR1bGUgb3IgbnVsbCBpZiB0aGF0IGRvZXMgbm90IGFwcGx5LgorICAgIEV4cHIgKlByZXZVQjsKKyAgICAvLy8gXGJyaWVmIERpc3RJbmMgLSBpbmNyZW1lbnQgZXhwcmVzc2lvbiBmb3IgZGlzdHJpYnV0ZSBsb29wIHdoZW4gZm91bmQKKyAgICAvLy8gY29tYmluZWQgd2l0aCBhIGZ1cnRoZXIgbG9vcCBsZXZlbCAoZS5nLiBpbiAnZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3InKQorICAgIC8vLyBleHByZXNzaW9uIElWID0gSVYgKyBTVAorICAgIEV4cHIgKkRpc3RJbmM7CisgICAgLy8vIFxicmllZiBQcmV2RVVCIC0gZXhwcmVzc2lvbiBzaW1pbGFyIHRvIEVVQiBidXQgdG8gYmUgdXNlZCB3aGVuIGxvb3AKKyAgICAvLy8gc2NoZWR1bGluZyB1c2VzIFByZXZMQiBhbmQgUHJldlVCIChlLmcuICBpbiAnZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3InCisgICAgLy8vIHdoZW4gZW5zdXJpbmcgdGhhdCB0aGUgVUIgaXMgZWl0aGVyIHRoZSBjYWxjdWxhdGVkIFVCIGJ5IHRoZSBydW50aW1lIG9yCisgICAgLy8vIHRoZSBlbmQgb2YgdGhlIGFzc2lnbmVkIGRpc3RyaWJ1dGUgY2h1bmspCisgICAgLy8vIGV4cHJlc3Npb24gVUIgPSBtaW4gKFVCLCBQcmV2VUIpCisgICAgRXhwciAqUHJldkVVQjsKKyAgICAvLy8gXGJyaWVmIENvdW50ZXJzIExvb3AgY291bnRlcnMuCisgICAgU21hbGxWZWN0b3I8RXhwciAqLCA0PiBDb3VudGVyczsKKyAgICAvLy8gXGJyaWVmIFByaXZhdGVDb3VudGVycyBMb29wIGNvdW50ZXJzLgorICAgIFNtYWxsVmVjdG9yPEV4cHIgKiwgND4gUHJpdmF0ZUNvdW50ZXJzOworICAgIC8vLyBcYnJpZWYgRXhwcmVzc2lvbnMgZm9yIGxvb3AgY291bnRlcnMgaW5pdHMgZm9yIENvZGVHZW4uCisgICAgU21hbGxWZWN0b3I8RXhwciAqLCA0PiBJbml0czsKKyAgICAvLy8gXGJyaWVmIEV4cHJlc3Npb25zIGZvciBsb29wIGNvdW50ZXJzIHVwZGF0ZSBmb3IgQ29kZUdlbi4KKyAgICBTbWFsbFZlY3RvcjxFeHByICosIDQ+IFVwZGF0ZXM7CisgICAgLy8vIFxicmllZiBGaW5hbCBsb29wIGNvdW50ZXIgdmFsdWVzIGZvciBHb2RlR2VuLgorICAgIFNtYWxsVmVjdG9yPEV4cHIgKiwgND4gRmluYWxzOworICAgIC8vLyBJbml0IHN0YXRlbWVudCBmb3IgYWxsIGNhcHR1cmVkIGV4cHJlc3Npb25zLgorICAgIFN0bXQgKlByZUluaXRzOworCisgICAgLy8vIEV4cHJlc3Npb25zIHVzZWQgd2hlbiBjb21iaW5pbmcgT3Blbk1QIGxvb3AgcHJhZ21hcworICAgIERpc3RDb21iaW5lZEhlbHBlckV4cHJzIERpc3RDb21iaW5lZEZpZWxkczsKKworICAgIC8vLyBcYnJpZWYgQ2hlY2sgaWYgYWxsIHRoZSBleHByZXNzaW9ucyBhcmUgYnVpbHQgKGRvZXMgbm90IGNoZWNrIHRoZQorICAgIC8vLyB3b3Jrc2hhcmluZyBvbmVzKS4KKyAgICBib29sIGJ1aWx0QWxsKCkgeworICAgICAgcmV0dXJuIEl0ZXJhdGlvblZhclJlZiAhPSBudWxscHRyICYmIExhc3RJdGVyYXRpb24gIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgIE51bUl0ZXJhdGlvbnMgIT0gbnVsbHB0ciAmJiBQcmVDb25kICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgICBDb25kICE9IG51bGxwdHIgJiYgSW5pdCAhPSBudWxscHRyICYmIEluYyAhPSBudWxscHRyOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgSW5pdGlhbGl6ZSBhbGwgdGhlIGZpZWxkcyB0byBudWxsLgorICAgIC8vLyBccGFyYW0gU2l6ZSBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvdW50ZXJzL2ZpbmFscy91cGRhdGVzIGFycmF5cy4KKyAgICB2b2lkIGNsZWFyKHVuc2lnbmVkIFNpemUpIHsKKyAgICAgIEl0ZXJhdGlvblZhclJlZiA9IG51bGxwdHI7CisgICAgICBMYXN0SXRlcmF0aW9uID0gbnVsbHB0cjsKKyAgICAgIENhbGNMYXN0SXRlcmF0aW9uID0gbnVsbHB0cjsKKyAgICAgIFByZUNvbmQgPSBudWxscHRyOworICAgICAgQ29uZCA9IG51bGxwdHI7CisgICAgICBJbml0ID0gbnVsbHB0cjsKKyAgICAgIEluYyA9IG51bGxwdHI7CisgICAgICBJTCA9IG51bGxwdHI7CisgICAgICBMQiA9IG51bGxwdHI7CisgICAgICBVQiA9IG51bGxwdHI7CisgICAgICBTVCA9IG51bGxwdHI7CisgICAgICBFVUIgPSBudWxscHRyOworICAgICAgTkxCID0gbnVsbHB0cjsKKyAgICAgIE5VQiA9IG51bGxwdHI7CisgICAgICBOdW1JdGVyYXRpb25zID0gbnVsbHB0cjsKKyAgICAgIFByZXZMQiA9IG51bGxwdHI7CisgICAgICBQcmV2VUIgPSBudWxscHRyOworICAgICAgRGlzdEluYyA9IG51bGxwdHI7CisgICAgICBQcmV2RVVCID0gbnVsbHB0cjsKKyAgICAgIENvdW50ZXJzLnJlc2l6ZShTaXplKTsKKyAgICAgIFByaXZhdGVDb3VudGVycy5yZXNpemUoU2l6ZSk7CisgICAgICBJbml0cy5yZXNpemUoU2l6ZSk7CisgICAgICBVcGRhdGVzLnJlc2l6ZShTaXplKTsKKyAgICAgIEZpbmFscy5yZXNpemUoU2l6ZSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgU2l6ZTsgKytpKSB7CisgICAgICAgIENvdW50ZXJzW2ldID0gbnVsbHB0cjsKKyAgICAgICAgUHJpdmF0ZUNvdW50ZXJzW2ldID0gbnVsbHB0cjsKKyAgICAgICAgSW5pdHNbaV0gPSBudWxscHRyOworICAgICAgICBVcGRhdGVzW2ldID0gbnVsbHB0cjsKKyAgICAgICAgRmluYWxzW2ldID0gbnVsbHB0cjsKKyAgICAgIH0KKyAgICAgIFByZUluaXRzID0gbnVsbHB0cjsKKyAgICAgIERpc3RDb21iaW5lZEZpZWxkcy5MQiA9IG51bGxwdHI7CisgICAgICBEaXN0Q29tYmluZWRGaWVsZHMuVUIgPSBudWxscHRyOworICAgICAgRGlzdENvbWJpbmVkRmllbGRzLkVVQiA9IG51bGxwdHI7CisgICAgICBEaXN0Q29tYmluZWRGaWVsZHMuSW5pdCA9IG51bGxwdHI7CisgICAgICBEaXN0Q29tYmluZWRGaWVsZHMuQ29uZCA9IG51bGxwdHI7CisgICAgICBEaXN0Q29tYmluZWRGaWVsZHMuTkxCID0gbnVsbHB0cjsKKyAgICAgIERpc3RDb21iaW5lZEZpZWxkcy5OVUIgPSBudWxscHRyOworICAgIH0KKyAgfTsKKworICAvLy8gXGJyaWVmIEdldCBudW1iZXIgb2YgY29sbGFwc2VkIGxvb3BzLgorICB1bnNpZ25lZCBnZXRDb2xsYXBzZWROdW1iZXIoKSBjb25zdCB7IHJldHVybiBDb2xsYXBzZWROdW07IH0KKworICBFeHByICpnZXRJdGVyYXRpb25WYXJpYWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFeHByICo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXhwciAqPigKKyAgICAgICAgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCBJdGVyYXRpb25WYXJpYWJsZU9mZnNldCkpKTsKKyAgfQorICBFeHByICpnZXRMYXN0SXRlcmF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PEV4cHIgKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBFeHByICo+KAorICAgICAgICAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIExhc3RJdGVyYXRpb25PZmZzZXQpKSk7CisgIH0KKyAgRXhwciAqZ2V0Q2FsY0xhc3RJdGVyYXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwciAqPihyZWludGVycHJldF9jYXN0PGNvbnN0IEV4cHIgKj4oCisgICAgICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgQ2FsY0xhc3RJdGVyYXRpb25PZmZzZXQpKSk7CisgIH0KKyAgRXhwciAqZ2V0UHJlQ29uZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFeHByICo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXhwciAqPigKKyAgICAgICAgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCBQcmVDb25kaXRpb25PZmZzZXQpKSk7CisgIH0KKyAgRXhwciAqZ2V0Q29uZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFeHByICo+KAorICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IEV4cHIgKj4oKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCBDb25kT2Zmc2V0KSkpOworICB9CisgIEV4cHIgKmdldEluaXQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwciAqPigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFeHByICo+KCpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgSW5pdE9mZnNldCkpKTsKKyAgfQorICBFeHByICpnZXRJbmMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwciAqPigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFeHByICo+KCpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgSW5jT2Zmc2V0KSkpOworICB9CisgIGNvbnN0IFN0bXQgKmdldFByZUluaXRzKCkgY29uc3QgeworICAgIHJldHVybiAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIFByZUluaXRzT2Zmc2V0KTsKKyAgfQorICBTdG10ICpnZXRQcmVJbml0cygpIHsgcmV0dXJuICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgUHJlSW5pdHNPZmZzZXQpOyB9CisgIEV4cHIgKmdldElzTGFzdEl0ZXJWYXJpYWJsZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoKGlzT3Blbk1QV29ya3NoYXJpbmdEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSB8fAorICAgICAgICAgICAgaXNPcGVuTVBUYXNrTG9vcERpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpIHx8CisgICAgICAgICAgICBpc09wZW5NUERpc3RyaWJ1dGVEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSkgJiYKKyAgICAgICAgICAgImV4cGVjdGVkIHdvcmtzaGFyaW5nIGxvb3AgZGlyZWN0aXZlIik7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwciAqPihyZWludGVycHJldF9jYXN0PGNvbnN0IEV4cHIgKj4oCisgICAgICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgSXNMYXN0SXRlclZhcmlhYmxlT2Zmc2V0KSkpOworICB9CisgIEV4cHIgKmdldExvd2VyQm91bmRWYXJpYWJsZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoKGlzT3Blbk1QV29ya3NoYXJpbmdEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSB8fAorICAgICAgICAgICAgaXNPcGVuTVBUYXNrTG9vcERpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpIHx8CisgICAgICAgICAgICBpc09wZW5NUERpc3RyaWJ1dGVEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSkgJiYKKyAgICAgICAgICAgImV4cGVjdGVkIHdvcmtzaGFyaW5nIGxvb3AgZGlyZWN0aXZlIik7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwciAqPihyZWludGVycHJldF9jYXN0PGNvbnN0IEV4cHIgKj4oCisgICAgICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgTG93ZXJCb3VuZFZhcmlhYmxlT2Zmc2V0KSkpOworICB9CisgIEV4cHIgKmdldFVwcGVyQm91bmRWYXJpYWJsZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoKGlzT3Blbk1QV29ya3NoYXJpbmdEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSB8fAorICAgICAgICAgICAgaXNPcGVuTVBUYXNrTG9vcERpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpIHx8CisgICAgICAgICAgICBpc09wZW5NUERpc3RyaWJ1dGVEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSkgJiYKKyAgICAgICAgICAgImV4cGVjdGVkIHdvcmtzaGFyaW5nIGxvb3AgZGlyZWN0aXZlIik7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwciAqPihyZWludGVycHJldF9jYXN0PGNvbnN0IEV4cHIgKj4oCisgICAgICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgVXBwZXJCb3VuZFZhcmlhYmxlT2Zmc2V0KSkpOworICB9CisgIEV4cHIgKmdldFN0cmlkZVZhcmlhYmxlKCkgY29uc3QgeworICAgIGFzc2VydCgoaXNPcGVuTVBXb3Jrc2hhcmluZ0RpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpIHx8CisgICAgICAgICAgICBpc09wZW5NUFRhc2tMb29wRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgfHwKKyAgICAgICAgICAgIGlzT3Blbk1QRGlzdHJpYnV0ZURpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpKSAmJgorICAgICAgICAgICAiZXhwZWN0ZWQgd29ya3NoYXJpbmcgbG9vcCBkaXJlY3RpdmUiKTsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFeHByICo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXhwciAqPigKKyAgICAgICAgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCBTdHJpZGVWYXJpYWJsZU9mZnNldCkpKTsKKyAgfQorICBFeHByICpnZXRFbnN1cmVVcHBlckJvdW5kKCkgY29uc3QgeworICAgIGFzc2VydCgoaXNPcGVuTVBXb3Jrc2hhcmluZ0RpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpIHx8CisgICAgICAgICAgICBpc09wZW5NUFRhc2tMb29wRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgfHwKKyAgICAgICAgICAgIGlzT3Blbk1QRGlzdHJpYnV0ZURpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpKSAmJgorICAgICAgICAgICAiZXhwZWN0ZWQgd29ya3NoYXJpbmcgbG9vcCBkaXJlY3RpdmUiKTsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFeHByICo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXhwciAqPigKKyAgICAgICAgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCBFbnN1cmVVcHBlckJvdW5kT2Zmc2V0KSkpOworICB9CisgIEV4cHIgKmdldE5leHRMb3dlckJvdW5kKCkgY29uc3QgeworICAgIGFzc2VydCgoaXNPcGVuTVBXb3Jrc2hhcmluZ0RpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpIHx8CisgICAgICAgICAgICBpc09wZW5NUFRhc2tMb29wRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgfHwKKyAgICAgICAgICAgIGlzT3Blbk1QRGlzdHJpYnV0ZURpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpKSAmJgorICAgICAgICAgICAiZXhwZWN0ZWQgd29ya3NoYXJpbmcgbG9vcCBkaXJlY3RpdmUiKTsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFeHByICo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXhwciAqPigKKyAgICAgICAgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCBOZXh0TG93ZXJCb3VuZE9mZnNldCkpKTsKKyAgfQorICBFeHByICpnZXROZXh0VXBwZXJCb3VuZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoKGlzT3Blbk1QV29ya3NoYXJpbmdEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSB8fAorICAgICAgICAgICAgaXNPcGVuTVBUYXNrTG9vcERpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpIHx8CisgICAgICAgICAgICBpc09wZW5NUERpc3RyaWJ1dGVEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSkgJiYKKyAgICAgICAgICAgImV4cGVjdGVkIHdvcmtzaGFyaW5nIGxvb3AgZGlyZWN0aXZlIik7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwciAqPihyZWludGVycHJldF9jYXN0PGNvbnN0IEV4cHIgKj4oCisgICAgICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgTmV4dFVwcGVyQm91bmRPZmZzZXQpKSk7CisgIH0KKyAgRXhwciAqZ2V0TnVtSXRlcmF0aW9ucygpIGNvbnN0IHsKKyAgICBhc3NlcnQoKGlzT3Blbk1QV29ya3NoYXJpbmdEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSB8fAorICAgICAgICAgICAgaXNPcGVuTVBUYXNrTG9vcERpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpIHx8CisgICAgICAgICAgICBpc09wZW5NUERpc3RyaWJ1dGVEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSkgJiYKKyAgICAgICAgICAgImV4cGVjdGVkIHdvcmtzaGFyaW5nIGxvb3AgZGlyZWN0aXZlIik7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwciAqPihyZWludGVycHJldF9jYXN0PGNvbnN0IEV4cHIgKj4oCisgICAgICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgTnVtSXRlcmF0aW9uc09mZnNldCkpKTsKKyAgfQorICBFeHByICpnZXRQcmV2TG93ZXJCb3VuZFZhcmlhYmxlKCkgY29uc3QgeworICAgIGFzc2VydChpc09wZW5NUExvb3BCb3VuZFNoYXJpbmdEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSAmJgorICAgICAgICAgICAiZXhwZWN0ZWQgbG9vcCBib3VuZCBzaGFyaW5nIGRpcmVjdGl2ZSIpOworICAgIHJldHVybiBjb25zdF9jYXN0PEV4cHIgKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBFeHByICo+KAorICAgICAgICAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIFByZXZMb3dlckJvdW5kVmFyaWFibGVPZmZzZXQpKSk7CisgIH0KKyAgRXhwciAqZ2V0UHJldlVwcGVyQm91bmRWYXJpYWJsZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNPcGVuTVBMb29wQm91bmRTaGFyaW5nRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgJiYKKyAgICAgICAgICAgImV4cGVjdGVkIGxvb3AgYm91bmQgc2hhcmluZyBkaXJlY3RpdmUiKTsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFeHByICo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXhwciAqPigKKyAgICAgICAgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCBQcmV2VXBwZXJCb3VuZFZhcmlhYmxlT2Zmc2V0KSkpOworICB9CisgIEV4cHIgKmdldERpc3RJbmMoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzT3Blbk1QTG9vcEJvdW5kU2hhcmluZ0RpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpICYmCisgICAgICAgICAgICJleHBlY3RlZCBsb29wIGJvdW5kIHNoYXJpbmcgZGlyZWN0aXZlIik7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwciAqPihyZWludGVycHJldF9jYXN0PGNvbnN0IEV4cHIgKj4oCisgICAgICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgRGlzdEluY09mZnNldCkpKTsKKyAgfQorICBFeHByICpnZXRQcmV2RW5zdXJlVXBwZXJCb3VuZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNPcGVuTVBMb29wQm91bmRTaGFyaW5nRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgJiYKKyAgICAgICAgICAgImV4cGVjdGVkIGxvb3AgYm91bmQgc2hhcmluZyBkaXJlY3RpdmUiKTsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFeHByICo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXhwciAqPigKKyAgICAgICAgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCBQcmV2RW5zdXJlVXBwZXJCb3VuZE9mZnNldCkpKTsKKyAgfQorICBFeHByICpnZXRDb21iaW5lZExvd2VyQm91bmRWYXJpYWJsZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNPcGVuTVBMb29wQm91bmRTaGFyaW5nRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgJiYKKyAgICAgICAgICAgImV4cGVjdGVkIGxvb3AgYm91bmQgc2hhcmluZyBkaXJlY3RpdmUiKTsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFeHByICo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXhwciAqPigKKyAgICAgICAgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCBDb21iaW5lZExvd2VyQm91bmRWYXJpYWJsZU9mZnNldCkpKTsKKyAgfQorICBFeHByICpnZXRDb21iaW5lZFVwcGVyQm91bmRWYXJpYWJsZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNPcGVuTVBMb29wQm91bmRTaGFyaW5nRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgJiYKKyAgICAgICAgICAgImV4cGVjdGVkIGxvb3AgYm91bmQgc2hhcmluZyBkaXJlY3RpdmUiKTsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFeHByICo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXhwciAqPigKKyAgICAgICAgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCBDb21iaW5lZFVwcGVyQm91bmRWYXJpYWJsZU9mZnNldCkpKTsKKyAgfQorICBFeHByICpnZXRDb21iaW5lZEVuc3VyZVVwcGVyQm91bmQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzT3Blbk1QTG9vcEJvdW5kU2hhcmluZ0RpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpICYmCisgICAgICAgICAgICJleHBlY3RlZCBsb29wIGJvdW5kIHNoYXJpbmcgZGlyZWN0aXZlIik7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwciAqPihyZWludGVycHJldF9jYXN0PGNvbnN0IEV4cHIgKj4oCisgICAgICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgQ29tYmluZWRFbnN1cmVVcHBlckJvdW5kT2Zmc2V0KSkpOworICB9CisgIEV4cHIgKmdldENvbWJpbmVkSW5pdCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNPcGVuTVBMb29wQm91bmRTaGFyaW5nRGlyZWN0aXZlKGdldERpcmVjdGl2ZUtpbmQoKSkgJiYKKyAgICAgICAgICAgImV4cGVjdGVkIGxvb3AgYm91bmQgc2hhcmluZyBkaXJlY3RpdmUiKTsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFeHByICo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXhwciAqPigKKyAgICAgICAgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCBDb21iaW5lZEluaXRPZmZzZXQpKSk7CisgIH0KKyAgRXhwciAqZ2V0Q29tYmluZWRDb25kKCkgY29uc3QgeworICAgIGFzc2VydChpc09wZW5NUExvb3BCb3VuZFNoYXJpbmdEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSAmJgorICAgICAgICAgICAiZXhwZWN0ZWQgbG9vcCBib3VuZCBzaGFyaW5nIGRpcmVjdGl2ZSIpOworICAgIHJldHVybiBjb25zdF9jYXN0PEV4cHIgKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBFeHByICo+KAorICAgICAgICAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIENvbWJpbmVkQ29uZGl0aW9uT2Zmc2V0KSkpOworICB9CisgIEV4cHIgKmdldENvbWJpbmVkTmV4dExvd2VyQm91bmQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzT3Blbk1QTG9vcEJvdW5kU2hhcmluZ0RpcmVjdGl2ZShnZXREaXJlY3RpdmVLaW5kKCkpICYmCisgICAgICAgICAgICJleHBlY3RlZCBsb29wIGJvdW5kIHNoYXJpbmcgZGlyZWN0aXZlIik7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwciAqPihyZWludGVycHJldF9jYXN0PGNvbnN0IEV4cHIgKj4oCisgICAgICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgQ29tYmluZWROZXh0TG93ZXJCb3VuZE9mZnNldCkpKTsKKyAgfQorICBFeHByICpnZXRDb21iaW5lZE5leHRVcHBlckJvdW5kKCkgY29uc3QgeworICAgIGFzc2VydChpc09wZW5NUExvb3BCb3VuZFNoYXJpbmdEaXJlY3RpdmUoZ2V0RGlyZWN0aXZlS2luZCgpKSAmJgorICAgICAgICAgICAiZXhwZWN0ZWQgbG9vcCBib3VuZCBzaGFyaW5nIGRpcmVjdGl2ZSIpOworICAgIHJldHVybiBjb25zdF9jYXN0PEV4cHIgKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBFeHByICo+KAorICAgICAgICAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIENvbWJpbmVkTmV4dFVwcGVyQm91bmRPZmZzZXQpKSk7CisgIH0KKyAgY29uc3QgU3RtdCAqZ2V0Qm9keSgpIGNvbnN0IHsKKyAgICAvLyBUaGlzIHJlbGllcyBvbiB0aGUgbG9vcCBmb3JtIGlzIGFscmVhZHkgY2hlY2tlZCBieSBTZW1hLgorICAgIGNvbnN0IFN0bXQgKkJvZHkgPQorICAgICAgICBnZXRJbm5lcm1vc3RDYXB0dXJlZFN0bXQoKS0+Z2V0Q2FwdHVyZWRTdG10KCktPklnbm9yZUNvbnRhaW5lcnMoKTsKKyAgICBCb2R5ID0gY2FzdDxGb3JTdG10PihCb2R5KS0+Z2V0Qm9keSgpOworICAgIGZvciAodW5zaWduZWQgQ250ID0gMTsgQ250IDwgQ29sbGFwc2VkTnVtOyArK0NudCkgeworICAgICAgQm9keSA9IEJvZHktPklnbm9yZUNvbnRhaW5lcnMoKTsKKyAgICAgIEJvZHkgPSBjYXN0PEZvclN0bXQ+KEJvZHkpLT5nZXRCb2R5KCk7CisgICAgfQorICAgIHJldHVybiBCb2R5OworICB9CisKKyAgQXJyYXlSZWY8RXhwciAqPiBjb3VudGVycygpIHsgcmV0dXJuIGdldENvdW50ZXJzKCk7IH0KKworICBBcnJheVJlZjxFeHByICo+IGNvdW50ZXJzKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PE9NUExvb3BEaXJlY3RpdmUgKj4odGhpcyktPmdldENvdW50ZXJzKCk7CisgIH0KKworICBBcnJheVJlZjxFeHByICo+IHByaXZhdGVfY291bnRlcnMoKSB7IHJldHVybiBnZXRQcml2YXRlQ291bnRlcnMoKTsgfQorCisgIEFycmF5UmVmPEV4cHIgKj4gcHJpdmF0ZV9jb3VudGVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxPTVBMb29wRGlyZWN0aXZlICo+KHRoaXMpLT5nZXRQcml2YXRlQ291bnRlcnMoKTsKKyAgfQorCisgIEFycmF5UmVmPEV4cHIgKj4gaW5pdHMoKSB7IHJldHVybiBnZXRJbml0cygpOyB9CisKKyAgQXJyYXlSZWY8RXhwciAqPiBpbml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxPTVBMb29wRGlyZWN0aXZlICo+KHRoaXMpLT5nZXRJbml0cygpOworICB9CisKKyAgQXJyYXlSZWY8RXhwciAqPiB1cGRhdGVzKCkgeyByZXR1cm4gZ2V0VXBkYXRlcygpOyB9CisKKyAgQXJyYXlSZWY8RXhwciAqPiB1cGRhdGVzKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PE9NUExvb3BEaXJlY3RpdmUgKj4odGhpcyktPmdldFVwZGF0ZXMoKTsKKyAgfQorCisgIEFycmF5UmVmPEV4cHIgKj4gZmluYWxzKCkgeyByZXR1cm4gZ2V0RmluYWxzKCk7IH0KKworICBBcnJheVJlZjxFeHByICo+IGZpbmFscygpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxPTVBMb29wRGlyZWN0aXZlICo+KHRoaXMpLT5nZXRGaW5hbHMoKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBTaW1kRGlyZWN0aXZlQ2xhc3MgfHwKKyAgICAgICAgICAgVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QRm9yRGlyZWN0aXZlQ2xhc3MgfHwKKyAgICAgICAgICAgVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QRm9yU2ltZERpcmVjdGl2ZUNsYXNzIHx8CisgICAgICAgICAgIFQtPmdldFN0bXRDbGFzcygpID09IE9NUFBhcmFsbGVsRm9yRGlyZWN0aXZlQ2xhc3MgfHwKKyAgICAgICAgICAgVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QUGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlQ2xhc3MgfHwKKyAgICAgICAgICAgVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QVGFza0xvb3BEaXJlY3RpdmVDbGFzcyB8fAorICAgICAgICAgICBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBUYXNrTG9vcFNpbWREaXJlY3RpdmVDbGFzcyB8fAorICAgICAgICAgICBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBEaXN0cmlidXRlRGlyZWN0aXZlQ2xhc3MgfHwKKyAgICAgICAgICAgVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QVGFyZ2V0UGFyYWxsZWxGb3JEaXJlY3RpdmVDbGFzcyB8fAorICAgICAgICAgICBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBEaXN0cmlidXRlUGFyYWxsZWxGb3JEaXJlY3RpdmVDbGFzcyB8fAorICAgICAgICAgICBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBEaXN0cmlidXRlUGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlQ2xhc3MgfHwKKyAgICAgICAgICAgVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QRGlzdHJpYnV0ZVNpbWREaXJlY3RpdmVDbGFzcyB8fAorICAgICAgICAgICBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBUYXJnZXRQYXJhbGxlbEZvclNpbWREaXJlY3RpdmVDbGFzcyB8fAorICAgICAgICAgICBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBUYXJnZXRTaW1kRGlyZWN0aXZlQ2xhc3MgfHwKKyAgICAgICAgICAgVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QVGVhbXNEaXN0cmlidXRlRGlyZWN0aXZlQ2xhc3MgfHwKKyAgICAgICAgICAgVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QVGVhbXNEaXN0cmlidXRlU2ltZERpcmVjdGl2ZUNsYXNzIHx8CisgICAgICAgICAgIFQtPmdldFN0bXRDbGFzcygpID09CisgICAgICAgICAgICAgICBPTVBUZWFtc0Rpc3RyaWJ1dGVQYXJhbGxlbEZvclNpbWREaXJlY3RpdmVDbGFzcyB8fAorICAgICAgICAgICBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBUZWFtc0Rpc3RyaWJ1dGVQYXJhbGxlbEZvckRpcmVjdGl2ZUNsYXNzIHx8CisgICAgICAgICAgIFQtPmdldFN0bXRDbGFzcygpID09CisgICAgICAgICAgICAgICBPTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVQYXJhbGxlbEZvckRpcmVjdGl2ZUNsYXNzIHx8CisgICAgICAgICAgIFQtPmdldFN0bXRDbGFzcygpID09CisgICAgICAgICAgICAgICBPTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVQYXJhbGxlbEZvclNpbWREaXJlY3RpdmVDbGFzcyB8fAorICAgICAgICAgICBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVEaXJlY3RpdmVDbGFzcyB8fAorICAgICAgICAgICBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVTaW1kRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCBzaW1kJyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHNpbWQgcHJpdmF0ZShhLGIpIGxpbmVhcihpLGo6cykgcmVkdWN0aW9uKCs6YyxkKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgc2ltZCcgaGFzIGNsYXVzZXMgJ3ByaXZhdGUnCisvLy8gd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InLCAnbGluZWFyJyB3aXRoIHZhcmlhYmxlcyAnaScsICdqJyBhbmQKKy8vLyBsaW5lYXIgc3RlcCAncycsICdyZWR1Y3Rpb24nIHdpdGggb3BlcmF0b3IgJysnIGFuZCB2YXJpYWJsZXMgJ2MnIGFuZCAnZCcuCisvLy8KK2NsYXNzIE9NUFNpbWREaXJlY3RpdmUgOiBwdWJsaWMgT01QTG9vcERpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICAvLy8gXGJyaWVmIEJ1aWxkIGRpcmVjdGl2ZSB3aXRoIHRoZSBnaXZlbiBzdGFydCBhbmQgZW5kIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgT01QU2ltZERpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QTG9vcERpcmVjdGl2ZSh0aGlzLCBPTVBTaW1kRGlyZWN0aXZlQ2xhc3MsIE9NUERfc2ltZCwgU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgRW5kTG9jLCBDb2xsYXBzZWROdW0sIE51bUNsYXVzZXMpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgZXhwbGljaXQgT01QU2ltZERpcmVjdGl2ZSh1bnNpZ25lZCBDb2xsYXBzZWROdW0sIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUExvb3BEaXJlY3RpdmUodGhpcywgT01QU2ltZERpcmVjdGl2ZUNsYXNzLCBPTVBEX3NpbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwgQ29sbGFwc2VkTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIE51bUNsYXVzZXMpIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZSB3aXRoIGEgbGlzdCBvZiBcYSBDbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCisgIC8vLyBccGFyYW0gQXNzb2NpYXRlZFN0bXQgU3RhdGVtZW50LCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBFeHBycyBIZWxwZXIgZXhwcmVzc2lvbnMgZm9yIENvZGVHZW4uCisgIC8vLworICBzdGF0aWMgT01QU2ltZERpcmVjdGl2ZSAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywgdW5zaWduZWQgQ29sbGFwc2VkTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKkFzc29jaWF0ZWRTdG10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhlbHBlckV4cHJzICZFeHBycyk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZQorICAvLy8gZm9yIFxhIE51bUNsYXVzZXMgY2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBTaW1kRGlyZWN0aXZlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBOdW1DbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCBFbXB0eVNoZWxsKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QU2ltZERpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnI3ByYWdtYSBvbXAgZm9yJyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIGZvciBwcml2YXRlKGEsYikgcmVkdWN0aW9uKCs6YyxkKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgZm9yJyBoYXMgY2xhdXNlcyAncHJpdmF0ZScgd2l0aCB0aGUKKy8vLyB2YXJpYWJsZXMgJ2EnIGFuZCAnYicgYW5kICdyZWR1Y3Rpb24nIHdpdGggb3BlcmF0b3IgJysnIGFuZCB2YXJpYWJsZXMgJ2MnCisvLy8gYW5kICdkJy4KKy8vLworY2xhc3MgT01QRm9yRGlyZWN0aXZlIDogcHVibGljIE9NUExvb3BEaXJlY3RpdmUgeworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKworICAvLy8gXGJyaWVmIHRydWUgaWYgY3VycmVudCBkaXJlY3RpdmUgaGFzIGlubmVyIGNhbmNlbCBkaXJlY3RpdmUuCisgIGJvb2wgSGFzQ2FuY2VsOworCisgIC8vLyBcYnJpZWYgQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBPTVBGb3JEaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QTG9vcERpcmVjdGl2ZSh0aGlzLCBPTVBGb3JEaXJlY3RpdmVDbGFzcywgT01QRF9mb3IsIFN0YXJ0TG9jLCBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGFwc2VkTnVtLCBOdW1DbGF1c2VzKSwKKyAgICAgICAgSGFzQ2FuY2VsKGZhbHNlKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUEZvckRpcmVjdGl2ZSh1bnNpZ25lZCBDb2xsYXBzZWROdW0sIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUExvb3BEaXJlY3RpdmUodGhpcywgT01QRm9yRGlyZWN0aXZlQ2xhc3MsIE9NUERfZm9yLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIENvbGxhcHNlZE51bSwgTnVtQ2xhdXNlcyksCisgICAgICAgIEhhc0NhbmNlbChmYWxzZSkge30KKworICAvLy8gXGJyaWVmIFNldCBjYW5jZWwgc3RhdGUuCisgIHZvaWQgc2V0SGFzQ2FuY2VsKGJvb2wgSGFzKSB7IEhhc0NhbmNlbCA9IEhhczsgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBkaXJlY3RpdmUgd2l0aCBhIGxpc3Qgb2YgXGEgQ2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIGxvb3BzLgorICAvLy8gXHBhcmFtIENsYXVzZXMgTGlzdCBvZiBjbGF1c2VzLgorICAvLy8gXHBhcmFtIEFzc29jaWF0ZWRTdG10IFN0YXRlbWVudCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gRXhwcnMgSGVscGVyIGV4cHJlc3Npb25zIGZvciBDb2RlR2VuLgorICAvLy8gXHBhcmFtIEhhc0NhbmNlbCB0cnVlIGlmIGN1cnJlbnQgZGlyZWN0aXZlIGhhcyBpbm5lciBjYW5jZWwgZGlyZWN0aXZlLgorICAvLy8KKyAgc3RhdGljIE9NUEZvckRpcmVjdGl2ZSAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLCB1bnNpZ25lZCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKkFzc29jaWF0ZWRTdG10LCBjb25zdCBIZWxwZXJFeHBycyAmRXhwcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc0NhbmNlbCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZQorICAvLy8gZm9yIFxhIE51bUNsYXVzZXMgY2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBGb3JEaXJlY3RpdmUgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwgRW1wdHlTaGVsbCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBjdXJyZW50IGRpcmVjdGl2ZSBoYXMgaW5uZXIgY2FuY2VsIGRpcmVjdGl2ZS4KKyAgYm9vbCBoYXNDYW5jZWwoKSBjb25zdCB7IHJldHVybiBIYXNDYW5jZWw7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QRm9yRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCBmb3Igc2ltZCcgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBmb3Igc2ltZCBwcml2YXRlKGEsYikgbGluZWFyKGksajpzKSByZWR1Y3Rpb24oKzpjLGQpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBmb3Igc2ltZCcgaGFzIGNsYXVzZXMgJ3ByaXZhdGUnCisvLy8gd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InLCAnbGluZWFyJyB3aXRoIHZhcmlhYmxlcyAnaScsICdqJyBhbmQKKy8vLyBsaW5lYXIgc3RlcCAncycsICdyZWR1Y3Rpb24nIHdpdGggb3BlcmF0b3IgJysnIGFuZCB2YXJpYWJsZXMgJ2MnIGFuZCAnZCcuCisvLy8KK2NsYXNzIE9NUEZvclNpbWREaXJlY3RpdmUgOiBwdWJsaWMgT01QTG9vcERpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICAvLy8gXGJyaWVmIEJ1aWxkIGRpcmVjdGl2ZSB3aXRoIHRoZSBnaXZlbiBzdGFydCBhbmQgZW5kIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgT01QRm9yU2ltZERpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QTG9vcERpcmVjdGl2ZSh0aGlzLCBPTVBGb3JTaW1kRGlyZWN0aXZlQ2xhc3MsIE9NUERfZm9yX3NpbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRMb2MsIEVuZExvYywgQ29sbGFwc2VkTnVtLCBOdW1DbGF1c2VzKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUEZvclNpbWREaXJlY3RpdmUodW5zaWduZWQgQ29sbGFwc2VkTnVtLCB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBMb29wRGlyZWN0aXZlKHRoaXMsIE9NUEZvclNpbWREaXJlY3RpdmVDbGFzcywgT01QRF9mb3Jfc2ltZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQ2xhdXNlcykge30KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgZGlyZWN0aXZlIHdpdGggYSBsaXN0IG9mIFxhIENsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgTG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBDbGF1c2VzIExpc3Qgb2YgY2xhdXNlcy4KKyAgLy8vIFxwYXJhbSBBc3NvY2lhdGVkU3RtdCBTdGF0ZW1lbnQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIEV4cHJzIEhlbHBlciBleHByZXNzaW9ucyBmb3IgQ29kZUdlbi4KKyAgLy8vCisgIHN0YXRpYyBPTVBGb3JTaW1kRGlyZWN0aXZlICoKKyAgQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICB1bnNpZ25lZCBDb2xsYXBzZWROdW0sIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgU3RtdCAqQXNzb2NpYXRlZFN0bXQsIGNvbnN0IEhlbHBlckV4cHJzICZFeHBycyk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZQorICAvLy8gZm9yIFxhIE51bUNsYXVzZXMgY2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBGb3JTaW1kRGlyZWN0aXZlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwgRW1wdHlTaGVsbCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9NUEZvclNpbWREaXJlY3RpdmVDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJyNwcmFnbWEgb21wIHNlY3Rpb25zJyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoYSxiKSByZWR1Y3Rpb24oKzpjLGQpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBzZWN0aW9ucycgaGFzIGNsYXVzZXMgJ3ByaXZhdGUnIHdpdGgKKy8vLyB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InIGFuZCAncmVkdWN0aW9uJyB3aXRoIG9wZXJhdG9yICcrJyBhbmQgdmFyaWFibGVzCisvLy8gJ2MnIGFuZCAnZCcuCisvLy8KK2NsYXNzIE9NUFNlY3Rpb25zRGlyZWN0aXZlIDogcHVibGljIE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUgeworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKworICAvLy8gXGJyaWVmIHRydWUgaWYgY3VycmVudCBkaXJlY3RpdmUgaGFzIGlubmVyIGNhbmNlbCBkaXJlY3RpdmUuCisgIGJvb2wgSGFzQ2FuY2VsOworCisgIC8vLyBcYnJpZWYgQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIE9NUFNlY3Rpb25zRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QU2VjdGlvbnNEaXJlY3RpdmVDbGFzcywgT01QRF9zZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydExvYywgRW5kTG9jLCBOdW1DbGF1c2VzLCAxKSwKKyAgICAgICAgSGFzQ2FuY2VsKGZhbHNlKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgZXhwbGljaXQgT01QU2VjdGlvbnNEaXJlY3RpdmUodW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBTZWN0aW9uc0RpcmVjdGl2ZUNsYXNzLCBPTVBEX3NlY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSksCisgICAgICAgIEhhc0NhbmNlbChmYWxzZSkge30KKworICAvLy8gXGJyaWVmIFNldCBjYW5jZWwgc3RhdGUuCisgIHZvaWQgc2V0SGFzQ2FuY2VsKGJvb2wgSGFzKSB7IEhhc0NhbmNlbCA9IEhhczsgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBkaXJlY3RpdmUgd2l0aCBhIGxpc3Qgb2YgXGEgQ2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENsYXVzZXMgTGlzdCBvZiBjbGF1c2VzLgorICAvLy8gXHBhcmFtIEFzc29jaWF0ZWRTdG10IFN0YXRlbWVudCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gSGFzQ2FuY2VsIHRydWUgaWYgY3VycmVudCBkaXJlY3RpdmUgaGFzIGlubmVyIGRpcmVjdGl2ZS4KKyAgLy8vCisgIHN0YXRpYyBPTVBTZWN0aW9uc0RpcmVjdGl2ZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsIFN0bXQgKkFzc29jaWF0ZWRTdG10LCBib29sIEhhc0NhbmNlbCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZSBmb3IgXGEgTnVtQ2xhdXNlcworICAvLy8gY2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgc3RhdGljIE9NUFNlY3Rpb25zRGlyZWN0aXZlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMsIEVtcHR5U2hlbGwpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgY3VycmVudCBkaXJlY3RpdmUgaGFzIGlubmVyIGNhbmNlbCBkaXJlY3RpdmUuCisgIGJvb2wgaGFzQ2FuY2VsKCkgY29uc3QgeyByZXR1cm4gSGFzQ2FuY2VsOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9NUFNlY3Rpb25zRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCBzZWN0aW9uJyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHNlY3Rpb24KKy8vLyBcZW5kY29kZQorLy8vCitjbGFzcyBPTVBTZWN0aW9uRGlyZWN0aXZlIDogcHVibGljIE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUgeworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKworICAvLy8gXGJyaWVmIHRydWUgaWYgY3VycmVudCBkaXJlY3RpdmUgaGFzIGlubmVyIGNhbmNlbCBkaXJlY3RpdmUuCisgIGJvb2wgSGFzQ2FuY2VsOworCisgIC8vLyBcYnJpZWYgQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLworICBPTVBTZWN0aW9uRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QU2VjdGlvbkRpcmVjdGl2ZUNsYXNzLCBPTVBEX3NlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRMb2MsIEVuZExvYywgMCwgMSksCisgICAgICAgIEhhc0NhbmNlbChmYWxzZSkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFNlY3Rpb25EaXJlY3RpdmUoKQorICAgICAgOiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKHRoaXMsIE9NUFNlY3Rpb25EaXJlY3RpdmVDbGFzcywgT01QRF9zZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIDAsIDEpLAorICAgICAgICBIYXNDYW5jZWwoZmFsc2UpIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIEFzc29jaWF0ZWRTdG10IFN0YXRlbWVudCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gSGFzQ2FuY2VsIHRydWUgaWYgY3VycmVudCBkaXJlY3RpdmUgaGFzIGlubmVyIGRpcmVjdGl2ZS4KKyAgLy8vCisgIHN0YXRpYyBPTVBTZWN0aW9uRGlyZWN0aXZlICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdCAqQXNzb2NpYXRlZFN0bXQsIGJvb2wgSGFzQ2FuY2VsKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8KKyAgc3RhdGljIE9NUFNlY3Rpb25EaXJlY3RpdmUgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIEVtcHR5U2hlbGwpOworCisgIC8vLyBcYnJpZWYgU2V0IGNhbmNlbCBzdGF0ZS4KKyAgdm9pZCBzZXRIYXNDYW5jZWwoYm9vbCBIYXMpIHsgSGFzQ2FuY2VsID0gSGFzOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBjdXJyZW50IGRpcmVjdGl2ZSBoYXMgaW5uZXIgY2FuY2VsIGRpcmVjdGl2ZS4KKyAgYm9vbCBoYXNDYW5jZWwoKSBjb25zdCB7IHJldHVybiBIYXNDYW5jZWw7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QU2VjdGlvbkRpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnI3ByYWdtYSBvbXAgc2luZ2xlJyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHNpbmdsZSBwcml2YXRlKGEsYikgY29weXByaXZhdGUoYyxkKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgc2luZ2xlJyBoYXMgY2xhdXNlcyAncHJpdmF0ZScgd2l0aAorLy8vIHRoZSB2YXJpYWJsZXMgJ2EnIGFuZCAnYicgYW5kICdjb3B5cHJpdmF0ZScgd2l0aCB2YXJpYWJsZXMgJ2MnIGFuZCAnZCcuCisvLy8KK2NsYXNzIE9NUFNpbmdsZURpcmVjdGl2ZSA6IHB1YmxpYyBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIC8vLyBcYnJpZWYgQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIE9NUFNpbmdsZURpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBTaW5nbGVEaXJlY3RpdmVDbGFzcywgT01QRF9zaW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRMb2MsIEVuZExvYywgTnVtQ2xhdXNlcywgMSkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFNpbmdsZURpcmVjdGl2ZSh1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKHRoaXMsIE9NUFNpbmdsZURpcmVjdGl2ZUNsYXNzLCBPTVBEX3NpbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCBOdW1DbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZSB3aXRoIGEgbGlzdCBvZiBcYSBDbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCisgIC8vLyBccGFyYW0gQXNzb2NpYXRlZFN0bXQgU3RhdGVtZW50LCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS4KKyAgLy8vCisgIHN0YXRpYyBPTVBTaW5nbGVEaXJlY3RpdmUgKgorICBDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLCBTdG10ICpBc3NvY2lhdGVkU3RtdCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZSBmb3IgXGEgTnVtQ2xhdXNlcworICAvLy8gY2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgc3RhdGljIE9NUFNpbmdsZURpcmVjdGl2ZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcywgRW1wdHlTaGVsbCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9NUFNpbmdsZURpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnI3ByYWdtYSBvbXAgbWFzdGVyJyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIG1hc3RlcgorLy8vIFxlbmRjb2RlCisvLy8KK2NsYXNzIE9NUE1hc3RlckRpcmVjdGl2ZSA6IHB1YmxpYyBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIC8vLyBcYnJpZWYgQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLworICBPTVBNYXN0ZXJEaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBNYXN0ZXJEaXJlY3RpdmVDbGFzcywgT01QRF9tYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRMb2MsIEVuZExvYywgMCwgMSkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUE1hc3RlckRpcmVjdGl2ZSgpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QTWFzdGVyRGlyZWN0aXZlQ2xhc3MsIE9NUERfbWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIDAsIDEpIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIEFzc29jaWF0ZWRTdG10IFN0YXRlbWVudCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUuCisgIC8vLworICBzdGF0aWMgT01QTWFzdGVyRGlyZWN0aXZlICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdCAqQXNzb2NpYXRlZFN0bXQpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLworICBzdGF0aWMgT01QTWFzdGVyRGlyZWN0aXZlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLCBFbXB0eVNoZWxsKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QTWFzdGVyRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCBjcml0aWNhbCcgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBjcml0aWNhbAorLy8vIFxlbmRjb2RlCisvLy8KK2NsYXNzIE9NUENyaXRpY2FsRGlyZWN0aXZlIDogcHVibGljIE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUgeworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKyAgLy8vIFxicmllZiBOYW1lIG9mIHRoZSBkaXJlY3RpdmUuCisgIERlY2xhcmF0aW9uTmFtZUluZm8gRGlyTmFtZTsKKyAgLy8vIFxicmllZiBCdWlsZCBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIGVuZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gTmFtZSBOYW1lIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgT01QQ3JpdGljYWxEaXJlY3RpdmUoY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmTmFtZSwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBDcml0aWNhbERpcmVjdGl2ZUNsYXNzLCBPTVBEX2NyaXRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0TG9jLCBFbmRMb2MsIE51bUNsYXVzZXMsIDEpLAorICAgICAgICBEaXJOYW1lKE5hbWUpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBleHBsaWNpdCBPTVBDcml0aWNhbERpcmVjdGl2ZSh1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKHRoaXMsIE9NUENyaXRpY2FsRGlyZWN0aXZlQ2xhc3MsIE9NUERfY3JpdGljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwgTnVtQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSwKKyAgICAgICAgRGlyTmFtZSgpIHt9CisKKyAgLy8vIFxicmllZiBTZXQgbmFtZSBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOYW1lIE5hbWUgb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vCisgIHZvaWQgc2V0RGlyZWN0aXZlTmFtZShjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZOYW1lKSB7IERpck5hbWUgPSBOYW1lOyB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBOYW1lIE5hbWUgb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENsYXVzZXMgTGlzdCBvZiBjbGF1c2VzLgorICAvLy8gXHBhcmFtIEFzc29jaWF0ZWRTdG10IFN0YXRlbWVudCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUuCisgIC8vLworICBzdGF0aWMgT01QQ3JpdGljYWxEaXJlY3RpdmUgKgorICBDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmTmFtZSwKKyAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywgU3RtdCAqQXNzb2NpYXRlZFN0bXQpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBDcml0aWNhbERpcmVjdGl2ZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DbGF1c2VzLCBFbXB0eVNoZWxsKTsKKworICAvLy8gXGJyaWVmIFJldHVybiBuYW1lIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLworICBEZWNsYXJhdGlvbk5hbWVJbmZvIGdldERpcmVjdGl2ZU5hbWUoKSBjb25zdCB7IHJldHVybiBEaXJOYW1lOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9NUENyaXRpY2FsRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3InIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHByaXZhdGUoYSxiKSByZWR1Y3Rpb24oKzpjLGQpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3InIGhhcyBjbGF1c2VzICdwcml2YXRlJworLy8vIHdpdGggdGhlIHZhcmlhYmxlcyAnYScgYW5kICdiJyBhbmQgJ3JlZHVjdGlvbicgd2l0aCBvcGVyYXRvciAnKycgYW5kCisvLy8gdmFyaWFibGVzICdjJyBhbmQgJ2QnLgorLy8vCitjbGFzcyBPTVBQYXJhbGxlbEZvckRpcmVjdGl2ZSA6IHB1YmxpYyBPTVBMb29wRGlyZWN0aXZlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisKKyAgLy8vIFxicmllZiB0cnVlIGlmIGN1cnJlbnQgcmVnaW9uIGhhcyBpbm5lciBjYW5jZWwgZGlyZWN0aXZlLgorICBib29sIEhhc0NhbmNlbDsKKworICAvLy8gXGJyaWVmIEJ1aWxkIGRpcmVjdGl2ZSB3aXRoIHRoZSBnaXZlbiBzdGFydCBhbmQgZW5kIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgT01QUGFyYWxsZWxGb3JEaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBMb29wRGlyZWN0aXZlKHRoaXMsIE9NUFBhcmFsbGVsRm9yRGlyZWN0aXZlQ2xhc3MsIE9NUERfcGFyYWxsZWxfZm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0TG9jLCBFbmRMb2MsIENvbGxhcHNlZE51bSwgTnVtQ2xhdXNlcyksCisgICAgICAgIEhhc0NhbmNlbChmYWxzZSkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBleHBsaWNpdCBPTVBQYXJhbGxlbEZvckRpcmVjdGl2ZSh1bnNpZ25lZCBDb2xsYXBzZWROdW0sIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUExvb3BEaXJlY3RpdmUodGhpcywgT01QUGFyYWxsZWxGb3JEaXJlY3RpdmVDbGFzcywgT01QRF9wYXJhbGxlbF9mb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwgQ29sbGFwc2VkTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIE51bUNsYXVzZXMpLAorICAgICAgICBIYXNDYW5jZWwoZmFsc2UpIHt9CisKKyAgLy8vIFxicmllZiBTZXQgY2FuY2VsIHN0YXRlLgorICB2b2lkIHNldEhhc0NhbmNlbChib29sIEhhcykgeyBIYXNDYW5jZWwgPSBIYXM7IH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgZGlyZWN0aXZlIHdpdGggYSBsaXN0IG9mIFxhIENsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgTG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBDbGF1c2VzIExpc3Qgb2YgY2xhdXNlcy4KKyAgLy8vIFxwYXJhbSBBc3NvY2lhdGVkU3RtdCBTdGF0ZW1lbnQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIEV4cHJzIEhlbHBlciBleHByZXNzaW9ucyBmb3IgQ29kZUdlbi4KKyAgLy8vIFxwYXJhbSBIYXNDYW5jZWwgdHJ1ZSBpZiBjdXJyZW50IGRpcmVjdGl2ZSBoYXMgaW5uZXIgY2FuY2VsIGRpcmVjdGl2ZS4KKyAgLy8vCisgIHN0YXRpYyBPTVBQYXJhbGxlbEZvckRpcmVjdGl2ZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgIFN0bXQgKkFzc29jaWF0ZWRTdG10LCBjb25zdCBIZWxwZXJFeHBycyAmRXhwcnMsIGJvb2wgSGFzQ2FuY2VsKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgZGlyZWN0aXZlIHdpdGggdGhlIHBsYWNlCisgIC8vLyBmb3IgXGEgTnVtQ2xhdXNlcyBjbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgc3RhdGljIE9NUFBhcmFsbGVsRm9yRGlyZWN0aXZlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtcHR5U2hlbGwpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgY3VycmVudCBkaXJlY3RpdmUgaGFzIGlubmVyIGNhbmNlbCBkaXJlY3RpdmUuCisgIGJvb2wgaGFzQ2FuY2VsKCkgY29uc3QgeyByZXR1cm4gSGFzQ2FuY2VsOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9NUFBhcmFsbGVsRm9yRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2ltZCcgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2ltZCBwcml2YXRlKGEsYikgbGluZWFyKGksajpzKSByZWR1Y3Rpb24oKzpjLGQpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2ltZCcgaGFzIGNsYXVzZXMKKy8vLyAncHJpdmF0ZScgd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InLCAnbGluZWFyJyB3aXRoIHZhcmlhYmxlcyAnaScsICdqJworLy8vIGFuZCBsaW5lYXIgc3RlcCAncycsICdyZWR1Y3Rpb24nIHdpdGggb3BlcmF0b3IgJysnIGFuZCB2YXJpYWJsZXMgJ2MnIGFuZAorLy8vICdkJy4KKy8vLworY2xhc3MgT01QUGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlIDogcHVibGljIE9NUExvb3BEaXJlY3RpdmUgeworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKyAgLy8vIFxicmllZiBCdWlsZCBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIGVuZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIE9NUFBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBMb29wRGlyZWN0aXZlKHRoaXMsIE9NUFBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfcGFyYWxsZWxfZm9yX3NpbWQsIFN0YXJ0TG9jLCBFbmRMb2MsIENvbGxhcHNlZE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOdW1DbGF1c2VzKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZSh1bnNpZ25lZCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBMb29wRGlyZWN0aXZlKHRoaXMsIE9NUFBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfcGFyYWxsZWxfZm9yX3NpbWQsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgQ29sbGFwc2VkTnVtLCBOdW1DbGF1c2VzKSB7fQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBkaXJlY3RpdmUgd2l0aCBhIGxpc3Qgb2YgXGEgQ2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIGxvb3BzLgorICAvLy8gXHBhcmFtIENsYXVzZXMgTGlzdCBvZiBjbGF1c2VzLgorICAvLy8gXHBhcmFtIEFzc29jaWF0ZWRTdG10IFN0YXRlbWVudCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gRXhwcnMgSGVscGVyIGV4cHJlc3Npb25zIGZvciBDb2RlR2VuLgorICAvLy8KKyAgc3RhdGljIE9NUFBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgIFN0bXQgKkFzc29jaWF0ZWRTdG10LCBjb25zdCBIZWxwZXJFeHBycyAmRXhwcnMpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBkaXJlY3RpdmUgd2l0aCB0aGUgcGxhY2UKKyAgLy8vIGZvciBcYSBOdW1DbGF1c2VzIGNsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBzdGF0aWMgT01QUGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtcHR5U2hlbGwpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBQYXJhbGxlbEZvclNpbWREaXJlY3RpdmVDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zJyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoYSxiKSByZWR1Y3Rpb24oKzpjLGQpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucycgaGFzIGNsYXVzZXMKKy8vLyAncHJpdmF0ZScgd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InIGFuZCAncmVkdWN0aW9uJyB3aXRoIG9wZXJhdG9yICcrJworLy8vIGFuZCB2YXJpYWJsZXMgJ2MnIGFuZCAnZCcuCisvLy8KK2NsYXNzIE9NUFBhcmFsbGVsU2VjdGlvbnNEaXJlY3RpdmUgOiBwdWJsaWMgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIC8vLyBcYnJpZWYgdHJ1ZSBpZiBjdXJyZW50IGRpcmVjdGl2ZSBoYXMgaW5uZXIgY2FuY2VsIGRpcmVjdGl2ZS4KKyAgYm9vbCBIYXNDYW5jZWw7CisKKyAgLy8vIFxicmllZiBCdWlsZCBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIGVuZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgT01QUGFyYWxsZWxTZWN0aW9uc0RpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QUGFyYWxsZWxTZWN0aW9uc0RpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfcGFyYWxsZWxfc2VjdGlvbnMsIFN0YXJ0TG9jLCBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQ2xhdXNlcywgMSksCisgICAgICAgIEhhc0NhbmNlbChmYWxzZSkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFBhcmFsbGVsU2VjdGlvbnNEaXJlY3RpdmUodW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBQYXJhbGxlbFNlY3Rpb25zRGlyZWN0aXZlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01QRF9wYXJhbGxlbF9zZWN0aW9ucywgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBOdW1DbGF1c2VzLCAxKSwKKyAgICAgICAgSGFzQ2FuY2VsKGZhbHNlKSB7fQorCisgIC8vLyBcYnJpZWYgU2V0IGNhbmNlbCBzdGF0ZS4KKyAgdm9pZCBzZXRIYXNDYW5jZWwoYm9vbCBIYXMpIHsgSGFzQ2FuY2VsID0gSGFzOyB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZSB3aXRoIGEgbGlzdCBvZiBcYSBDbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCisgIC8vLyBccGFyYW0gQXNzb2NpYXRlZFN0bXQgU3RhdGVtZW50LCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBIYXNDYW5jZWwgdHJ1ZSBpZiBjdXJyZW50IGRpcmVjdGl2ZSBoYXMgaW5uZXIgY2FuY2VsIGRpcmVjdGl2ZS4KKyAgLy8vCisgIHN0YXRpYyBPTVBQYXJhbGxlbFNlY3Rpb25zRGlyZWN0aXZlICoKKyAgQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywgU3RtdCAqQXNzb2NpYXRlZFN0bXQsIGJvb2wgSGFzQ2FuY2VsKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgZGlyZWN0aXZlIHdpdGggdGhlIHBsYWNlIGZvciBcYSBOdW1DbGF1c2VzCisgIC8vLyBjbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBzdGF0aWMgT01QUGFyYWxsZWxTZWN0aW9uc0RpcmVjdGl2ZSAqCisgIENyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE51bUNsYXVzZXMsIEVtcHR5U2hlbGwpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgY3VycmVudCBkaXJlY3RpdmUgaGFzIGlubmVyIGNhbmNlbCBkaXJlY3RpdmUuCisgIGJvb2wgaGFzQ2FuY2VsKCkgY29uc3QgeyByZXR1cm4gSGFzQ2FuY2VsOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9NUFBhcmFsbGVsU2VjdGlvbnNEaXJlY3RpdmVDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJyNwcmFnbWEgb21wIHRhc2snIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgdGFzayBwcml2YXRlKGEsYikgZmluYWwoZCkKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRhc2snIGhhcyBjbGF1c2VzICdwcml2YXRlJyB3aXRoIHRoZQorLy8vIHZhcmlhYmxlcyAnYScgYW5kICdiJyBhbmQgJ2ZpbmFsJyB3aXRoIGNvbmRpdGlvbiAnZCcuCisvLy8KK2NsYXNzIE9NUFRhc2tEaXJlY3RpdmUgOiBwdWJsaWMgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICAvLy8gXGJyaWVmIHRydWUgaWYgdGhpcyBkaXJlY3RpdmUgaGFzIGlubmVyIGNhbmNlbCBkaXJlY3RpdmUuCisgIGJvb2wgSGFzQ2FuY2VsOworCisgIC8vLyBcYnJpZWYgQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIE9NUFRhc2tEaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKHRoaXMsIE9NUFRhc2tEaXJlY3RpdmVDbGFzcywgT01QRF90YXNrLCBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRMb2MsIE51bUNsYXVzZXMsIDEpLAorICAgICAgICBIYXNDYW5jZWwoZmFsc2UpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBleHBsaWNpdCBPTVBUYXNrRGlyZWN0aXZlKHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QVGFza0RpcmVjdGl2ZUNsYXNzLCBPTVBEX3Rhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwgTnVtQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSwKKyAgICAgICAgSGFzQ2FuY2VsKGZhbHNlKSB7fQorCisgIC8vLyBcYnJpZWYgU2V0IGNhbmNlbCBzdGF0ZS4KKyAgdm9pZCBzZXRIYXNDYW5jZWwoYm9vbCBIYXMpIHsgSGFzQ2FuY2VsID0gSGFzOyB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZSB3aXRoIGEgbGlzdCBvZiBcYSBDbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCisgIC8vLyBccGFyYW0gQXNzb2NpYXRlZFN0bXQgU3RhdGVtZW50LCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBIYXNDYW5jZWwgdHJ1ZSwgaWYgY3VycmVudCBkaXJlY3RpdmUgaGFzIGlubmVyIGNhbmNlbCBkaXJlY3RpdmUuCisgIC8vLworICBzdGF0aWMgT01QVGFza0RpcmVjdGl2ZSAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpBc3NvY2lhdGVkU3RtdCwgYm9vbCBIYXNDYW5jZWwpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBkaXJlY3RpdmUgd2l0aCB0aGUgcGxhY2UgZm9yIFxhIE51bUNsYXVzZXMKKyAgLy8vIGNsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBUYXNrRGlyZWN0aXZlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBOdW1DbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW1wdHlTaGVsbCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBjdXJyZW50IGRpcmVjdGl2ZSBoYXMgaW5uZXIgY2FuY2VsIGRpcmVjdGl2ZS4KKyAgYm9vbCBoYXNDYW5jZWwoKSBjb25zdCB7IHJldHVybiBIYXNDYW5jZWw7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QVGFza0RpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnI3ByYWdtYSBvbXAgdGFza3lpZWxkJyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHRhc2t5aWVsZAorLy8vIFxlbmRjb2RlCisvLy8KK2NsYXNzIE9NUFRhc2t5aWVsZERpcmVjdGl2ZSA6IHB1YmxpYyBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIC8vLyBcYnJpZWYgQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLworICBPTVBUYXNreWllbGREaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBUYXNreWllbGREaXJlY3RpdmVDbGFzcywgT01QRF90YXNreWllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRMb2MsIEVuZExvYywgMCwgMCkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFRhc2t5aWVsZERpcmVjdGl2ZSgpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QVGFza3lpZWxkRGlyZWN0aXZlQ2xhc3MsIE9NUERfdGFza3lpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIDAsIDApIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8KKyAgc3RhdGljIE9NUFRhc2t5aWVsZERpcmVjdGl2ZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8KKyAgc3RhdGljIE9NUFRhc2t5aWVsZERpcmVjdGl2ZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywgRW1wdHlTaGVsbCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9NUFRhc2t5aWVsZERpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnI3ByYWdtYSBvbXAgYmFycmllcicgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBiYXJyaWVyCisvLy8gXGVuZGNvZGUKKy8vLworY2xhc3MgT01QQmFycmllckRpcmVjdGl2ZSA6IHB1YmxpYyBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIC8vLyBcYnJpZWYgQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLworICBPTVBCYXJyaWVyRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QQmFycmllckRpcmVjdGl2ZUNsYXNzLCBPTVBEX2JhcnJpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRMb2MsIEVuZExvYywgMCwgMCkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUEJhcnJpZXJEaXJlY3RpdmUoKQorICAgICAgOiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKHRoaXMsIE9NUEJhcnJpZXJEaXJlY3RpdmVDbGFzcywgT01QRF9iYXJyaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIDAsIDApIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8KKyAgc3RhdGljIE9NUEJhcnJpZXJEaXJlY3RpdmUgKgorICBDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vCisgIHN0YXRpYyBPTVBCYXJyaWVyRGlyZWN0aXZlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLCBFbXB0eVNoZWxsKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QQmFycmllckRpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnI3ByYWdtYSBvbXAgdGFza3dhaXQnIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgdGFza3dhaXQKKy8vLyBcZW5kY29kZQorLy8vCitjbGFzcyBPTVBUYXNrd2FpdERpcmVjdGl2ZSA6IHB1YmxpYyBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIC8vLyBcYnJpZWYgQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLworICBPTVBUYXNrd2FpdERpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jKQorICAgICAgOiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKHRoaXMsIE9NUFRhc2t3YWl0RGlyZWN0aXZlQ2xhc3MsIE9NUERfdGFza3dhaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRMb2MsIEVuZExvYywgMCwgMCkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFRhc2t3YWl0RGlyZWN0aXZlKCkKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBUYXNrd2FpdERpcmVjdGl2ZUNsYXNzLCBPTVBEX3Rhc2t3YWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIDAsIDApIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8KKyAgc3RhdGljIE9NUFRhc2t3YWl0RGlyZWN0aXZlICoKKyAgQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLworICBzdGF0aWMgT01QVGFza3dhaXREaXJlY3RpdmUgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIEVtcHR5U2hlbGwpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBUYXNrd2FpdERpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCB0YXNrZ3JvdXAnIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgdGFza2dyb3VwCisvLy8gXGVuZGNvZGUKKy8vLworY2xhc3MgT01QVGFza2dyb3VwRGlyZWN0aXZlIDogcHVibGljIE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUgeworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKyAgLy8vIEJ1aWxkIGRpcmVjdGl2ZSB3aXRoIHRoZSBnaXZlbiBzdGFydCBhbmQgZW5kIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBPTVBUYXNrZ3JvdXBEaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QVGFza2dyb3VwRGlyZWN0aXZlQ2xhc3MsIE9NUERfdGFza2dyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0TG9jLCBFbmRMb2MsIE51bUNsYXVzZXMsIDIpIHt9CisKKyAgLy8vIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgZXhwbGljaXQgT01QVGFza2dyb3VwRGlyZWN0aXZlKHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QVGFza2dyb3VwRGlyZWN0aXZlQ2xhc3MsIE9NUERfdGFza2dyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikge30KKworICAvLy8gU2V0cyB0aGUgdGFza19yZWR1Y3Rpb24gcmV0dXJuIHZhcmlhYmxlLgorICB2b2lkIHNldFJlZHVjdGlvblJlZihFeHByICpSUikgeworICAgICpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgMSkgPSBSUjsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBDcmVhdGVzIGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENsYXVzZXMgTGlzdCBvZiBjbGF1c2VzLgorICAvLy8gXHBhcmFtIEFzc29jaWF0ZWRTdG10IFN0YXRlbWVudCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gUmVkdWN0aW9uUmVmIFJlZmVyZW5jZSB0byB0aGUgdGFza19yZWR1Y3Rpb24gcmV0dXJuIHZhcmlhYmxlLgorICAvLy8KKyAgc3RhdGljIE9NUFRhc2tncm91cERpcmVjdGl2ZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsIFN0bXQgKkFzc29jaWF0ZWRTdG10LAorICAgICAgICAgRXhwciAqUmVkdWN0aW9uUmVmKTsKKworICAvLy8gQ3JlYXRlcyBhbiBlbXB0eSBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBUYXNrZ3JvdXBEaXJlY3RpdmUgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMsIEVtcHR5U2hlbGwpOworCisKKyAgLy8vIFJldHVybnMgcmVmZXJlbmNlIHRvIHRoZSB0YXNrX3JlZHVjdGlvbiByZXR1cm4gdmFyaWFibGUuCisgIGNvbnN0IEV4cHIgKmdldFJlZHVjdGlvblJlZigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgRXhwciAqPigqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIDEpKTsKKyAgfQorICBFeHByICpnZXRSZWR1Y3Rpb25SZWYoKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEV4cHIgKj4oKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCAxKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QVGFza2dyb3VwRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCBmbHVzaCcgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBmbHVzaChhLGIpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBmbHVzaCcgaGFzIDIgYXJndW1lbnRzLSB2YXJpYWJsZXMgJ2EnCisvLy8gYW5kICdiJy4KKy8vLyAnb21wIGZsdXNoJyBkaXJlY3RpdmUgZG9lcyBub3QgaGF2ZSBjbGF1c2VzIGJ1dCBoYXZlIGFuIG9wdGlvbmFsIGxpc3Qgb2YKKy8vLyB2YXJpYWJsZXMgdG8gZmx1c2guIFRoaXMgbGlzdCBvZiB2YXJpYWJsZXMgaXMgc3RvcmVkIHdpdGhpbiBzb21lIGZha2UgY2xhdXNlCisvLy8gRmx1c2hDbGF1c2UuCitjbGFzcyBPTVBGbHVzaERpcmVjdGl2ZSA6IHB1YmxpYyBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIC8vLyBcYnJpZWYgQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIE9NUEZsdXNoRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QRmx1c2hEaXJlY3RpdmVDbGFzcywgT01QRF9mbHVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydExvYywgRW5kTG9jLCBOdW1DbGF1c2VzLCAwKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgZXhwbGljaXQgT01QRmx1c2hEaXJlY3RpdmUodW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBGbHVzaERpcmVjdGl2ZUNsYXNzLCBPTVBEX2ZsdXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkge30KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgZGlyZWN0aXZlIHdpdGggYSBsaXN0IG9mIFxhIENsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgTG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDbGF1c2VzIExpc3Qgb2YgY2xhdXNlcyAob25seSBzaW5nbGUgT01QRmx1c2hDbGF1c2UgY2xhdXNlIGlzCisgIC8vLyBhbGxvd2VkKS4KKyAgLy8vCisgIHN0YXRpYyBPTVBGbHVzaERpcmVjdGl2ZSAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgZGlyZWN0aXZlIHdpdGggdGhlIHBsYWNlIGZvciBcYSBOdW1DbGF1c2VzCisgIC8vLyBjbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBzdGF0aWMgT01QRmx1c2hEaXJlY3RpdmUgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcywgRW1wdHlTaGVsbCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9NUEZsdXNoRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCBvcmRlcmVkJyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIG9yZGVyZWQKKy8vLyBcZW5kY29kZQorLy8vCitjbGFzcyBPTVBPcmRlcmVkRGlyZWN0aXZlIDogcHVibGljIE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUgeworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKyAgLy8vIFxicmllZiBCdWlsZCBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIGVuZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgT01QT3JkZXJlZERpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QT3JkZXJlZERpcmVjdGl2ZUNsYXNzLCBPTVBEX29yZGVyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRMb2MsIEVuZExvYywgTnVtQ2xhdXNlcywgMSkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUE9yZGVyZWREaXJlY3RpdmUodW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBPcmRlcmVkRGlyZWN0aXZlQ2xhc3MsIE9NUERfb3JkZXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCBOdW1DbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENsYXVzZXMgTGlzdCBvZiBjbGF1c2VzLgorICAvLy8gXHBhcmFtIEFzc29jaWF0ZWRTdG10IFN0YXRlbWVudCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUuCisgIC8vLworICBzdGF0aWMgT01QT3JkZXJlZERpcmVjdGl2ZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsIFN0bXQgKkFzc29jaWF0ZWRTdG10KTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBzdGF0aWMgT01QT3JkZXJlZERpcmVjdGl2ZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMsIEVtcHR5U2hlbGwpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBPcmRlcmVkRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCBhdG9taWMnIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgYXRvbWljIGNhcHR1cmUKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIGF0b21pYycgaGFzIGNsYXVzZSAnY2FwdHVyZScuCisvLy8KK2NsYXNzIE9NUEF0b21pY0RpcmVjdGl2ZSA6IHB1YmxpYyBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIC8vLyBcYnJpZWYgVXNlZCBmb3IgJ2F0b21pYyB1cGRhdGUnIG9yICdhdG9taWMgY2FwdHVyZScgY29uc3RydWN0cy4gVGhleSBtYXkKKyAgLy8vIGhhdmUgYXRvbWljIGV4cHJlc3Npb25zIG9mIGZvcm1zCisgIC8vLyBcY29kZQorICAvLy8geCA9IHggYmlub3AgZXhwcjsKKyAgLy8vIHggPSBleHByIGJpbm9wIHg7CisgIC8vLyBcZW5kY29kZQorICAvLy8gVGhpcyBmaWVsZCBpcyB0cnVlIGZvciB0aGUgZmlyc3QgZm9ybSBvZiB0aGUgZXhwcmVzc2lvbiBhbmQgZmFsc2UgZm9yIHRoZQorICAvLy8gc2Vjb25kLiBSZXF1aXJlZCBmb3IgY29ycmVjdCBjb2RlZ2VuIG9mIG5vbi1hc3NvY2lhdGl2ZSBvcGVyYXRpb25zIChsaWtlCisgIC8vLyA8PCBvciA+PikuCisgIGJvb2wgSXNYTEhTSW5SSFNQYXJ0OworICAvLy8gXGJyaWVmIFVzZWQgZm9yICdhdG9taWMgdXBkYXRlJyBvciAnYXRvbWljIGNhcHR1cmUnIGNvbnN0cnVjdHMuIFRoZXkgbWF5CisgIC8vLyBoYXZlIGF0b21pYyBleHByZXNzaW9ucyBvZiBmb3JtcworICAvLy8gXGNvZGUKKyAgLy8vIHYgPSB4OyA8dXBkYXRlIHg+OworICAvLy8gPHVwZGF0ZSB4PjsgdiA9IHg7CisgIC8vLyBcZW5kY29kZQorICAvLy8gVGhpcyBmaWVsZCBpcyB0cnVlIGZvciB0aGUgZmlyc3QocG9zdGZpeCkgZm9ybSBvZiB0aGUgZXhwcmVzc2lvbiBhbmQgZmFsc2UKKyAgLy8vIG90aGVyd2lzZS4KKyAgYm9vbCBJc1Bvc3RmaXhVcGRhdGU7CisKKyAgLy8vIFxicmllZiBCdWlsZCBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIGVuZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgT01QQXRvbWljRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKHRoaXMsIE9NUEF0b21pY0RpcmVjdGl2ZUNsYXNzLCBPTVBEX2F0b21pYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydExvYywgRW5kTG9jLCBOdW1DbGF1c2VzLCA1KSwKKyAgICAgICAgSXNYTEhTSW5SSFNQYXJ0KGZhbHNlKSwgSXNQb3N0Zml4VXBkYXRlKGZhbHNlKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgZXhwbGljaXQgT01QQXRvbWljRGlyZWN0aXZlKHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QQXRvbWljRGlyZWN0aXZlQ2xhc3MsIE9NUERfYXRvbWljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSksCisgICAgICAgIElzWExIU0luUkhTUGFydChmYWxzZSksIElzUG9zdGZpeFVwZGF0ZShmYWxzZSkge30KKworICAvLy8gXGJyaWVmIFNldCAneCcgcGFydCBvZiB0aGUgYXNzb2NpYXRlZCBleHByZXNzaW9uL3N0YXRlbWVudC4KKyAgdm9pZCBzZXRYKEV4cHIgKlgpIHsgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpKSA9IFg7IH0KKyAgLy8vIFxicmllZiBTZXQgaGVscGVyIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0KKyAgLy8vICdPcGFxdWVWYWx1ZUV4cHIoeCkgYmlub3AgT3BhcXVlVmFsdWVFeHByKGV4cHIpJyBvcgorICAvLy8gJ09wYXF1ZVZhbHVlRXhwcihleHByKSBiaW5vcCBPcGFxdWVWYWx1ZUV4cHIoeCknLgorICB2b2lkIHNldFVwZGF0ZUV4cHIoRXhwciAqVUUpIHsgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCAyKSA9IFVFOyB9CisgIC8vLyBcYnJpZWYgU2V0ICd2JyBwYXJ0IG9mIHRoZSBhc3NvY2lhdGVkIGV4cHJlc3Npb24vc3RhdGVtZW50LgorICB2b2lkIHNldFYoRXhwciAqVikgeyAqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIDMpID0gVjsgfQorICAvLy8gXGJyaWVmIFNldCAnZXhwcicgcGFydCBvZiB0aGUgYXNzb2NpYXRlZCBleHByZXNzaW9uL3N0YXRlbWVudC4KKyAgdm9pZCBzZXRFeHByKEV4cHIgKkUpIHsgKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCA0KSA9IEU7IH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgZGlyZWN0aXZlIHdpdGggYSBsaXN0IG9mIFxhIENsYXVzZXMgYW5kICd4JywgJ3YnIGFuZCAnZXhwcicKKyAgLy8vIHBhcnRzIG9mIHRoZSBhdG9taWMgY29uc3RydWN0IChzZWUgU2VjdGlvbiAyLjEyLjYsIGF0b21pYyBDb25zdHJ1Y3QsIGZvcgorICAvLy8gZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgJ3gnLCAndicgYW5kICdleHByJykuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgTG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDbGF1c2VzIExpc3Qgb2YgY2xhdXNlcy4KKyAgLy8vIFxwYXJhbSBBc3NvY2lhdGVkU3RtdCBTdGF0ZW1lbnQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIFggJ3gnIHBhcnQgb2YgdGhlIGFzc29jaWF0ZWQgZXhwcmVzc2lvbi9zdGF0ZW1lbnQuCisgIC8vLyBccGFyYW0gViAndicgcGFydCBvZiB0aGUgYXNzb2NpYXRlZCBleHByZXNzaW9uL3N0YXRlbWVudC4KKyAgLy8vIFxwYXJhbSBFICdleHByJyBwYXJ0IG9mIHRoZSBhc3NvY2lhdGVkIGV4cHJlc3Npb24vc3RhdGVtZW50LgorICAvLy8gXHBhcmFtIFVFIEhlbHBlciBleHByZXNzaW9uIG9mIHRoZSBmb3JtCisgIC8vLyAnT3BhcXVlVmFsdWVFeHByKHgpIGJpbm9wIE9wYXF1ZVZhbHVlRXhwcihleHByKScgb3IKKyAgLy8vICdPcGFxdWVWYWx1ZUV4cHIoZXhwcikgYmlub3AgT3BhcXVlVmFsdWVFeHByKHgpJy4KKyAgLy8vIFxwYXJhbSBJc1hMSFNJblJIU1BhcnQgdHJ1ZSBpZiBcYSBVRSBoYXMgdGhlIGZpcnN0IGZvcm0gYW5kIGZhbHNlIGlmIHRoZQorICAvLy8gc2Vjb25kLgorICAvLy8gXHBhcmFtIElzUG9zdGZpeFVwZGF0ZSB0cnVlIGlmIG9yaWdpbmFsIHZhbHVlIG9mICd4JyBtdXN0IGJlIHN0b3JlZCBpbgorICAvLy8gJ3YnLCBub3QgYW4gdXBkYXRlZCBvbmUuCisgIHN0YXRpYyBPTVBBdG9taWNEaXJlY3RpdmUgKgorICBDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLCBTdG10ICpBc3NvY2lhdGVkU3RtdCwgRXhwciAqWCwgRXhwciAqViwKKyAgICAgICAgIEV4cHIgKkUsIEV4cHIgKlVFLCBib29sIElzWExIU0luUkhTUGFydCwgYm9vbCBJc1Bvc3RmaXhVcGRhdGUpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBkaXJlY3RpdmUgd2l0aCB0aGUgcGxhY2UgZm9yIFxhIE51bUNsYXVzZXMKKyAgLy8vIGNsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBBdG9taWNEaXJlY3RpdmUgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMsIEVtcHR5U2hlbGwpOworCisgIC8vLyBcYnJpZWYgR2V0ICd4JyBwYXJ0IG9mIHRoZSBhc3NvY2lhdGVkIGV4cHJlc3Npb24vc3RhdGVtZW50LgorICBFeHByICpnZXRYKCkgeyByZXR1cm4gY2FzdF9vcl9udWxsPEV4cHI+KCpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSkpOyB9CisgIGNvbnN0IEV4cHIgKmdldFgoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxFeHByPigqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCkpKTsKKyAgfQorICAvLy8gXGJyaWVmIEdldCBoZWxwZXIgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybQorICAvLy8gJ09wYXF1ZVZhbHVlRXhwcih4KSBiaW5vcCBPcGFxdWVWYWx1ZUV4cHIoZXhwciknIG9yCisgIC8vLyAnT3BhcXVlVmFsdWVFeHByKGV4cHIpIGJpbm9wIE9wYXF1ZVZhbHVlRXhwcih4KScuCisgIEV4cHIgKmdldFVwZGF0ZUV4cHIoKSB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxFeHByPigqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIDIpKTsKKyAgfQorICBjb25zdCBFeHByICpnZXRVcGRhdGVFeHByKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8RXhwcj4oKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCAyKSk7CisgIH0KKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBoZWxwZXIgdXBkYXRlIGV4cHJlc3Npb24gaGFzIGZvcm0KKyAgLy8vICdPcGFxdWVWYWx1ZUV4cHIoeCkgYmlub3AgT3BhcXVlVmFsdWVFeHByKGV4cHIpJyBhbmQgZmFsc2UgaWYgaXQgaGFzIGZvcm0KKyAgLy8vICdPcGFxdWVWYWx1ZUV4cHIoZXhwcikgYmlub3AgT3BhcXVlVmFsdWVFeHByKHgpJy4KKyAgYm9vbCBpc1hMSFNJblJIU1BhcnQoKSBjb25zdCB7IHJldHVybiBJc1hMSFNJblJIU1BhcnQ7IH0KKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiAndicgZXhwcmVzc2lvbiBtdXN0IGJlIHVwZGF0ZWQgdG8gb3JpZ2luYWwgdmFsdWUgb2YKKyAgLy8vICd4JywgZmFsc2UgaWYgJ3YnIG11c3QgYmUgdXBkYXRlZCB0byB0aGUgbmV3IHZhbHVlIG9mICd4Jy4KKyAgYm9vbCBpc1Bvc3RmaXhVcGRhdGUoKSBjb25zdCB7IHJldHVybiBJc1Bvc3RmaXhVcGRhdGU7IH0KKyAgLy8vIFxicmllZiBHZXQgJ3YnIHBhcnQgb2YgdGhlIGFzc29jaWF0ZWQgZXhwcmVzc2lvbi9zdGF0ZW1lbnQuCisgIEV4cHIgKmdldFYoKSB7IHJldHVybiBjYXN0X29yX251bGw8RXhwcj4oKnN0ZDo6bmV4dChjaGlsZF9iZWdpbigpLCAzKSk7IH0KKyAgY29uc3QgRXhwciAqZ2V0VigpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPEV4cHI+KCpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgMykpOworICB9CisgIC8vLyBcYnJpZWYgR2V0ICdleHByJyBwYXJ0IG9mIHRoZSBhc3NvY2lhdGVkIGV4cHJlc3Npb24vc3RhdGVtZW50LgorICBFeHByICpnZXRFeHByKCkgeyByZXR1cm4gY2FzdF9vcl9udWxsPEV4cHI+KCpzdGQ6Om5leHQoY2hpbGRfYmVnaW4oKSwgNCkpOyB9CisgIGNvbnN0IEV4cHIgKmdldEV4cHIoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxFeHByPigqc3RkOjpuZXh0KGNoaWxkX2JlZ2luKCksIDQpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBBdG9taWNEaXJlY3RpdmVDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJyNwcmFnbWEgb21wIHRhcmdldCcgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCB0YXJnZXQgaWYoYSkKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRhcmdldCcgaGFzIGNsYXVzZSAnaWYnIHdpdGgKKy8vLyBjb25kaXRpb24gJ2EnLgorLy8vCitjbGFzcyBPTVBUYXJnZXREaXJlY3RpdmUgOiBwdWJsaWMgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICAvLy8gXGJyaWVmIEJ1aWxkIGRpcmVjdGl2ZSB3aXRoIHRoZSBnaXZlbiBzdGFydCBhbmQgZW5kIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBPTVBUYXJnZXREaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QVGFyZ2V0RGlyZWN0aXZlQ2xhc3MsIE9NUERfdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0TG9jLCBFbmRMb2MsIE51bUNsYXVzZXMsIDEpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBleHBsaWNpdCBPTVBUYXJnZXREaXJlY3RpdmUodW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBUYXJnZXREaXJlY3RpdmVDbGFzcywgT01QRF90YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwgTnVtQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSB7fQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBkaXJlY3RpdmUgd2l0aCBhIGxpc3Qgb2YgXGEgQ2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENsYXVzZXMgTGlzdCBvZiBjbGF1c2VzLgorICAvLy8gXHBhcmFtIEFzc29jaWF0ZWRTdG10IFN0YXRlbWVudCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUuCisgIC8vLworICBzdGF0aWMgT01QVGFyZ2V0RGlyZWN0aXZlICoKKyAgQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywgU3RtdCAqQXNzb2NpYXRlZFN0bXQpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBkaXJlY3RpdmUgd2l0aCB0aGUgcGxhY2UgZm9yIFxhIE51bUNsYXVzZXMKKyAgLy8vIGNsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBUYXJnZXREaXJlY3RpdmUgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMsIEVtcHR5U2hlbGwpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBUYXJnZXREaXJlY3RpdmVDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJyNwcmFnbWEgb21wIHRhcmdldCBkYXRhJyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHRhcmdldCBkYXRhIGRldmljZSgwKSBpZihhKSBtYXAoYls6XSkKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRhcmdldCBkYXRhJyBoYXMgY2xhdXNlcyAnZGV2aWNlJworLy8vIHdpdGggdGhlIHZhbHVlICcwJywgJ2lmJyB3aXRoIGNvbmRpdGlvbiAnYScgYW5kICdtYXAnIHdpdGggYXJyYXkKKy8vLyBzZWN0aW9uICdiWzpdJy4KKy8vLworY2xhc3MgT01QVGFyZ2V0RGF0YURpcmVjdGl2ZSA6IHB1YmxpYyBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIC8vLyBcYnJpZWYgQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBUaGUgbnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBPTVBUYXJnZXREYXRhRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBUYXJnZXREYXRhRGlyZWN0aXZlQ2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfdGFyZ2V0X2RhdGEsIFN0YXJ0TG9jLCBFbmRMb2MsIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFRhcmdldERhdGFEaXJlY3RpdmUodW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBUYXJnZXREYXRhRGlyZWN0aXZlQ2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfdGFyZ2V0X2RhdGEsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgTnVtQ2xhdXNlcywgMSkge30KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgZGlyZWN0aXZlIHdpdGggYSBsaXN0IG9mIFxhIENsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgTG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDbGF1c2VzIExpc3Qgb2YgY2xhdXNlcy4KKyAgLy8vIFxwYXJhbSBBc3NvY2lhdGVkU3RtdCBTdGF0ZW1lbnQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlLgorICAvLy8KKyAgc3RhdGljIE9NUFRhcmdldERhdGFEaXJlY3RpdmUgKgorICBDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLCBTdG10ICpBc3NvY2lhdGVkU3RtdCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZSBmb3IgXGEgTiBjbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIE4gVGhlIG51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgc3RhdGljIE9NUFRhcmdldERhdGFEaXJlY3RpdmUgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbXB0eVNoZWxsKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QVGFyZ2V0RGF0YURpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnI3ByYWdtYSBvbXAgdGFyZ2V0IGVudGVyIGRhdGEnIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgdGFyZ2V0IGVudGVyIGRhdGEgZGV2aWNlKDApIGlmKGEpIG1hcChiWzpdKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgdGFyZ2V0IGVudGVyIGRhdGEnIGhhcyBjbGF1c2VzCisvLy8gJ2RldmljZScgd2l0aCB0aGUgdmFsdWUgJzAnLCAnaWYnIHdpdGggY29uZGl0aW9uICdhJyBhbmQgJ21hcCcgd2l0aCBhcnJheQorLy8vIHNlY3Rpb24gJ2JbOl0nLgorLy8vCitjbGFzcyBPTVBUYXJnZXRFbnRlckRhdGFEaXJlY3RpdmUgOiBwdWJsaWMgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICAvLy8gXGJyaWVmIEJ1aWxkIGRpcmVjdGl2ZSB3aXRoIHRoZSBnaXZlbiBzdGFydCBhbmQgZW5kIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgVGhlIG51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgT01QVGFyZ2V0RW50ZXJEYXRhRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKHRoaXMsIE9NUFRhcmdldEVudGVyRGF0YURpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfdGFyZ2V0X2VudGVyX2RhdGEsIFN0YXJ0TG9jLCBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQ2xhdXNlcywgLypOdW1DaGlsZHJlbj0qLzEpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBleHBsaWNpdCBPTVBUYXJnZXRFbnRlckRhdGFEaXJlY3RpdmUodW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBUYXJnZXRFbnRlckRhdGFEaXJlY3RpdmVDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVBEX3RhcmdldF9lbnRlcl9kYXRhLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypOdW1DaGlsZHJlbj0qLzEpIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZSB3aXRoIGEgbGlzdCBvZiBcYSBDbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCisgIC8vLyBccGFyYW0gQXNzb2NpYXRlZFN0bXQgU3RhdGVtZW50LCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS4KKyAgLy8vCisgIHN0YXRpYyBPTVBUYXJnZXRFbnRlckRhdGFEaXJlY3RpdmUgKgorICBDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLCBTdG10ICpBc3NvY2lhdGVkU3RtdCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZSBmb3IgXGEgTiBjbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIE4gVGhlIG51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgc3RhdGljIE9NUFRhcmdldEVudGVyRGF0YURpcmVjdGl2ZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTiwgRW1wdHlTaGVsbCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9NUFRhcmdldEVudGVyRGF0YURpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnI3ByYWdtYSBvbXAgdGFyZ2V0IGV4aXQgZGF0YScgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCB0YXJnZXQgZXhpdCBkYXRhIGRldmljZSgwKSBpZihhKSBtYXAoYls6XSkKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRhcmdldCBleGl0IGRhdGEnIGhhcyBjbGF1c2VzCisvLy8gJ2RldmljZScgd2l0aCB0aGUgdmFsdWUgJzAnLCAnaWYnIHdpdGggY29uZGl0aW9uICdhJyBhbmQgJ21hcCcgd2l0aCBhcnJheQorLy8vIHNlY3Rpb24gJ2JbOl0nLgorLy8vCitjbGFzcyBPTVBUYXJnZXRFeGl0RGF0YURpcmVjdGl2ZSA6IHB1YmxpYyBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIC8vLyBcYnJpZWYgQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBUaGUgbnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBPTVBUYXJnZXRFeGl0RGF0YURpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKHRoaXMsIE9NUFRhcmdldEV4aXREYXRhRGlyZWN0aXZlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01QRF90YXJnZXRfZXhpdF9kYXRhLCBTdGFydExvYywgRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUNsYXVzZXMsIC8qTnVtQ2hpbGRyZW49Ki8xKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgZXhwbGljaXQgT01QVGFyZ2V0RXhpdERhdGFEaXJlY3RpdmUodW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBUYXJnZXRFeGl0RGF0YURpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfdGFyZ2V0X2V4aXRfZGF0YSwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBOdW1DbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qTnVtQ2hpbGRyZW49Ki8xKSB7fQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBkaXJlY3RpdmUgd2l0aCBhIGxpc3Qgb2YgXGEgQ2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENsYXVzZXMgTGlzdCBvZiBjbGF1c2VzLgorICAvLy8gXHBhcmFtIEFzc29jaWF0ZWRTdG10IFN0YXRlbWVudCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUuCisgIC8vLworICBzdGF0aWMgT01QVGFyZ2V0RXhpdERhdGFEaXJlY3RpdmUgKgorICBDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLCBTdG10ICpBc3NvY2lhdGVkU3RtdCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZSBmb3IgXGEgTiBjbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIE4gVGhlIG51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgc3RhdGljIE9NUFRhcmdldEV4aXREYXRhRGlyZWN0aXZlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE4sIEVtcHR5U2hlbGwpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBUYXJnZXRFeGl0RGF0YURpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnI3ByYWdtYSBvbXAgdGFyZ2V0IHBhcmFsbGVsJyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHRhcmdldCBwYXJhbGxlbCBpZihhKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgdGFyZ2V0IHBhcmFsbGVsJyBoYXMgY2xhdXNlICdpZicgd2l0aAorLy8vIGNvbmRpdGlvbiAnYScuCisvLy8KK2NsYXNzIE9NUFRhcmdldFBhcmFsbGVsRGlyZWN0aXZlIDogcHVibGljIE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUgeworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKyAgLy8vIFxicmllZiBCdWlsZCBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIGVuZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgT01QVGFyZ2V0UGFyYWxsZWxEaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBUYXJnZXRQYXJhbGxlbERpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfdGFyZ2V0X3BhcmFsbGVsLCBTdGFydExvYywgRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUNsYXVzZXMsIC8qTnVtQ2hpbGRyZW49Ki8xKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgZXhwbGljaXQgT01QVGFyZ2V0UGFyYWxsZWxEaXJlY3RpdmUodW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBUYXJnZXRQYXJhbGxlbERpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfdGFyZ2V0X3BhcmFsbGVsLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypOdW1DaGlsZHJlbj0qLzEpIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZSB3aXRoIGEgbGlzdCBvZiBcYSBDbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCisgIC8vLyBccGFyYW0gQXNzb2NpYXRlZFN0bXQgU3RhdGVtZW50LCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS4KKyAgLy8vCisgIHN0YXRpYyBPTVBUYXJnZXRQYXJhbGxlbERpcmVjdGl2ZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsIFN0bXQgKkFzc29jaWF0ZWRTdG10KTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgZGlyZWN0aXZlIHdpdGggdGhlIHBsYWNlIGZvciBcYSBOdW1DbGF1c2VzCisgIC8vLyBjbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBzdGF0aWMgT01QVGFyZ2V0UGFyYWxsZWxEaXJlY3RpdmUgKgorICBDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBOdW1DbGF1c2VzLCBFbXB0eVNoZWxsKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QVGFyZ2V0UGFyYWxsZWxEaXJlY3RpdmVDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJyNwcmFnbWEgb21wIHRhcmdldCBwYXJhbGxlbCBmb3InIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgdGFyZ2V0IHBhcmFsbGVsIGZvciBwcml2YXRlKGEsYikgcmVkdWN0aW9uKCs6YyxkKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgdGFyZ2V0IHBhcmFsbGVsIGZvcicgaGFzIGNsYXVzZXMKKy8vLyAncHJpdmF0ZScgd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InIGFuZCAncmVkdWN0aW9uJyB3aXRoIG9wZXJhdG9yICcrJworLy8vIGFuZCB2YXJpYWJsZXMgJ2MnIGFuZCAnZCcuCisvLy8KK2NsYXNzIE9NUFRhcmdldFBhcmFsbGVsRm9yRGlyZWN0aXZlIDogcHVibGljIE9NUExvb3BEaXJlY3RpdmUgeworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKworICAvLy8gXGJyaWVmIHRydWUgaWYgY3VycmVudCByZWdpb24gaGFzIGlubmVyIGNhbmNlbCBkaXJlY3RpdmUuCisgIGJvb2wgSGFzQ2FuY2VsOworCisgIC8vLyBcYnJpZWYgQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBPTVBUYXJnZXRQYXJhbGxlbEZvckRpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2xsYXBzZWROdW0sIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUExvb3BEaXJlY3RpdmUodGhpcywgT01QVGFyZ2V0UGFyYWxsZWxGb3JEaXJlY3RpdmVDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPTVBEX3RhcmdldF9wYXJhbGxlbF9mb3IsIFN0YXJ0TG9jLCBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGFwc2VkTnVtLCBOdW1DbGF1c2VzKSwKKyAgICAgICAgSGFzQ2FuY2VsKGZhbHNlKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFRhcmdldFBhcmFsbGVsRm9yRGlyZWN0aXZlKHVuc2lnbmVkIENvbGxhcHNlZE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QTG9vcERpcmVjdGl2ZSh0aGlzLCBPTVBUYXJnZXRQYXJhbGxlbEZvckRpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfdGFyZ2V0X3BhcmFsbGVsX2ZvciwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBDb2xsYXBzZWROdW0sIE51bUNsYXVzZXMpLAorICAgICAgICBIYXNDYW5jZWwoZmFsc2UpIHt9CisKKyAgLy8vIFxicmllZiBTZXQgY2FuY2VsIHN0YXRlLgorICB2b2lkIHNldEhhc0NhbmNlbChib29sIEhhcykgeyBIYXNDYW5jZWwgPSBIYXM7IH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgZGlyZWN0aXZlIHdpdGggYSBsaXN0IG9mIFxhIENsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgTG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBDbGF1c2VzIExpc3Qgb2YgY2xhdXNlcy4KKyAgLy8vIFxwYXJhbSBBc3NvY2lhdGVkU3RtdCBTdGF0ZW1lbnQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIEV4cHJzIEhlbHBlciBleHByZXNzaW9ucyBmb3IgQ29kZUdlbi4KKyAgLy8vIFxwYXJhbSBIYXNDYW5jZWwgdHJ1ZSBpZiBjdXJyZW50IGRpcmVjdGl2ZSBoYXMgaW5uZXIgY2FuY2VsIGRpcmVjdGl2ZS4KKyAgLy8vCisgIHN0YXRpYyBPTVBUYXJnZXRQYXJhbGxlbEZvckRpcmVjdGl2ZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgIFN0bXQgKkFzc29jaWF0ZWRTdG10LCBjb25zdCBIZWxwZXJFeHBycyAmRXhwcnMsIGJvb2wgSGFzQ2FuY2VsKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgZGlyZWN0aXZlIHdpdGggdGhlIHBsYWNlCisgIC8vLyBmb3IgXGEgTnVtQ2xhdXNlcyBjbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgc3RhdGljIE9NUFRhcmdldFBhcmFsbGVsRm9yRGlyZWN0aXZlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtcHR5U2hlbGwpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgY3VycmVudCBkaXJlY3RpdmUgaGFzIGlubmVyIGNhbmNlbCBkaXJlY3RpdmUuCisgIGJvb2wgaGFzQ2FuY2VsKCkgY29uc3QgeyByZXR1cm4gSGFzQ2FuY2VsOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9NUFRhcmdldFBhcmFsbGVsRm9yRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCB0ZWFtcycgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCB0ZWFtcyBpZihhKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgdGVhbXMnIGhhcyBjbGF1c2UgJ2lmJyB3aXRoCisvLy8gY29uZGl0aW9uICdhJy4KKy8vLworY2xhc3MgT01QVGVhbXNEaXJlY3RpdmUgOiBwdWJsaWMgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICAvLy8gXGJyaWVmIEJ1aWxkIGRpcmVjdGl2ZSB3aXRoIHRoZSBnaXZlbiBzdGFydCBhbmQgZW5kIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBPTVBUZWFtc0RpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKHRoaXMsIE9NUFRlYW1zRGlyZWN0aXZlQ2xhc3MsIE9NUERfdGVhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRMb2MsIEVuZExvYywgTnVtQ2xhdXNlcywgMSkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFRlYW1zRGlyZWN0aXZlKHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QVGVhbXNEaXJlY3RpdmVDbGFzcywgT01QRF90ZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCBOdW1DbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZSB3aXRoIGEgbGlzdCBvZiBcYSBDbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCisgIC8vLyBccGFyYW0gQXNzb2NpYXRlZFN0bXQgU3RhdGVtZW50LCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS4KKyAgLy8vCisgIHN0YXRpYyBPTVBUZWFtc0RpcmVjdGl2ZSAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpBc3NvY2lhdGVkU3RtdCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZSBmb3IgXGEgTnVtQ2xhdXNlcworICAvLy8gY2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgc3RhdGljIE9NUFRlYW1zRGlyZWN0aXZlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMsIEVtcHR5U2hlbGwpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBUZWFtc0RpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnI3ByYWdtYSBvbXAgY2FuY2VsbGF0aW9uIHBvaW50JyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIGNhbmNlbGxhdGlvbiBwb2ludCBmb3IKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gSW4gdGhpcyBleGFtcGxlIGEgY2FuY2VsbGF0aW9uIHBvaW50IGlzIGNyZWF0ZWQgZm9yIGlubmVybW9zdCAnZm9yJyByZWdpb24uCitjbGFzcyBPTVBDYW5jZWxsYXRpb25Qb2ludERpcmVjdGl2ZSA6IHB1YmxpYyBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIE9wZW5NUERpcmVjdGl2ZUtpbmQgQ2FuY2VsUmVnaW9uOworICAvLy8gXGJyaWVmIEJ1aWxkIGRpcmVjdGl2ZSB3aXRoIHRoZSBnaXZlbiBzdGFydCBhbmQgZW5kIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8KKyAgT01QQ2FuY2VsbGF0aW9uUG9pbnREaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBDYW5jZWxsYXRpb25Qb2ludERpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfY2FuY2VsbGF0aW9uX3BvaW50LCBTdGFydExvYywgRW5kTG9jLCAwLCAwKSwKKyAgICAgICAgQ2FuY2VsUmVnaW9uKE9NUERfdW5rbm93bikge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUENhbmNlbGxhdGlvblBvaW50RGlyZWN0aXZlKCkKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBDYW5jZWxsYXRpb25Qb2ludERpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfY2FuY2VsbGF0aW9uX3BvaW50LCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIDAsIDApLAorICAgICAgICBDYW5jZWxSZWdpb24oT01QRF91bmtub3duKSB7fQorCisgIC8vLyBcYnJpZWYgU2V0IGNhbmNlbCByZWdpb24gZm9yIGN1cnJlbnQgY2FuY2VsbGF0aW9uIHBvaW50LgorICAvLy8gXHBhcmFtIENSIENhbmNlbGxhdGlvbiByZWdpb24uCisgIHZvaWQgc2V0Q2FuY2VsUmVnaW9uKE9wZW5NUERpcmVjdGl2ZUtpbmQgQ1IpIHsgQ2FuY2VsUmVnaW9uID0gQ1I7IH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLworICBzdGF0aWMgT01QQ2FuY2VsbGF0aW9uUG9pbnREaXJlY3RpdmUgKgorICBDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgIE9wZW5NUERpcmVjdGl2ZUtpbmQgQ2FuY2VsUmVnaW9uKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8KKyAgc3RhdGljIE9NUENhbmNlbGxhdGlvblBvaW50RGlyZWN0aXZlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtcHR5U2hlbGwpOworCisgIC8vLyBcYnJpZWYgR2V0IGNhbmNlbGxhdGlvbiByZWdpb24gZm9yIHRoZSBjdXJyZW50IGNhbmNlbGxhdGlvbiBwb2ludC4KKyAgT3Blbk1QRGlyZWN0aXZlS2luZCBnZXRDYW5jZWxSZWdpb24oKSBjb25zdCB7IHJldHVybiBDYW5jZWxSZWdpb247IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QQ2FuY2VsbGF0aW9uUG9pbnREaXJlY3RpdmVDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJyNwcmFnbWEgb21wIGNhbmNlbCcgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBjYW5jZWwgZm9yCisvLy8gXGVuZGNvZGUKKy8vLworLy8vIEluIHRoaXMgZXhhbXBsZSBhIGNhbmNlbCBpcyBjcmVhdGVkIGZvciBpbm5lcm1vc3QgJ2ZvcicgcmVnaW9uLgorY2xhc3MgT01QQ2FuY2VsRGlyZWN0aXZlIDogcHVibGljIE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUgeworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKyAgT3Blbk1QRGlyZWN0aXZlS2luZCBDYW5jZWxSZWdpb247CisgIC8vLyBcYnJpZWYgQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIE9NUENhbmNlbERpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBDYW5jZWxEaXJlY3RpdmVDbGFzcywgT01QRF9jYW5jZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRMb2MsIEVuZExvYywgTnVtQ2xhdXNlcywgMCksCisgICAgICAgIENhbmNlbFJlZ2lvbihPTVBEX3Vua25vd24pIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIGV4cGxpY2l0IE9NUENhbmNlbERpcmVjdGl2ZSh1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKHRoaXMsIE9NUENhbmNlbERpcmVjdGl2ZUNsYXNzLCBPTVBEX2NhbmNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCBOdW1DbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApLAorICAgICAgICBDYW5jZWxSZWdpb24oT01QRF91bmtub3duKSB7fQorCisgIC8vLyBcYnJpZWYgU2V0IGNhbmNlbCByZWdpb24gZm9yIGN1cnJlbnQgY2FuY2VsbGF0aW9uIHBvaW50LgorICAvLy8gXHBhcmFtIENSIENhbmNlbGxhdGlvbiByZWdpb24uCisgIHZvaWQgc2V0Q2FuY2VsUmVnaW9uKE9wZW5NUERpcmVjdGl2ZUtpbmQgQ1IpIHsgQ2FuY2VsUmVnaW9uID0gQ1I7IH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCisgIC8vLworICBzdGF0aWMgT01QQ2FuY2VsRGlyZWN0aXZlICoKKyAgQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywgT3Blbk1QRGlyZWN0aXZlS2luZCBDYW5jZWxSZWdpb24pOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBDYW5jZWxEaXJlY3RpdmUgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMsIEVtcHR5U2hlbGwpOworCisgIC8vLyBcYnJpZWYgR2V0IGNhbmNlbGxhdGlvbiByZWdpb24gZm9yIHRoZSBjdXJyZW50IGNhbmNlbGxhdGlvbiBwb2ludC4KKyAgT3Blbk1QRGlyZWN0aXZlS2luZCBnZXRDYW5jZWxSZWdpb24oKSBjb25zdCB7IHJldHVybiBDYW5jZWxSZWdpb247IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QQ2FuY2VsRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCB0YXNrbG9vcCcgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCB0YXNrbG9vcCBwcml2YXRlKGEsYikgZ3JhaW5zaXplKHZhbCkgbnVtX3Rhc2tzKG51bSkKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRhc2tsb29wJyBoYXMgY2xhdXNlcyAncHJpdmF0ZScKKy8vLyB3aXRoIHRoZSB2YXJpYWJsZXMgJ2EnIGFuZCAnYicsICdncmFpbnNpemUnIHdpdGggZXhwcmVzc2lvbiAndmFsJyBhbmQKKy8vLyAnbnVtX3Rhc2tzJyB3aXRoIGV4cHJlc3Npb24gJ251bScuCisvLy8KK2NsYXNzIE9NUFRhc2tMb29wRGlyZWN0aXZlIDogcHVibGljIE9NUExvb3BEaXJlY3RpdmUgeworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKyAgLy8vIFxicmllZiBCdWlsZCBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIGVuZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIE9NUFRhc2tMb29wRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QTG9vcERpcmVjdGl2ZSh0aGlzLCBPTVBUYXNrTG9vcERpcmVjdGl2ZUNsYXNzLCBPTVBEX3Rhc2tsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0TG9jLCBFbmRMb2MsIENvbGxhcHNlZE51bSwgTnVtQ2xhdXNlcykge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBleHBsaWNpdCBPTVBUYXNrTG9vcERpcmVjdGl2ZSh1bnNpZ25lZCBDb2xsYXBzZWROdW0sIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUExvb3BEaXJlY3RpdmUodGhpcywgT01QVGFza0xvb3BEaXJlY3RpdmVDbGFzcywgT01QRF90YXNrbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQ2xhdXNlcykge30KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgZGlyZWN0aXZlIHdpdGggYSBsaXN0IG9mIFxhIENsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgTG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBDbGF1c2VzIExpc3Qgb2YgY2xhdXNlcy4KKyAgLy8vIFxwYXJhbSBBc3NvY2lhdGVkU3RtdCBTdGF0ZW1lbnQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIEV4cHJzIEhlbHBlciBleHByZXNzaW9ucyBmb3IgQ29kZUdlbi4KKyAgLy8vCisgIHN0YXRpYyBPTVBUYXNrTG9vcERpcmVjdGl2ZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgIFN0bXQgKkFzc29jaWF0ZWRTdG10LCBjb25zdCBIZWxwZXJFeHBycyAmRXhwcnMpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBkaXJlY3RpdmUgd2l0aCB0aGUgcGxhY2UKKyAgLy8vIGZvciBcYSBOdW1DbGF1c2VzIGNsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBzdGF0aWMgT01QVGFza0xvb3BEaXJlY3RpdmUgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2xsYXBzZWROdW0sIEVtcHR5U2hlbGwpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBUYXNrTG9vcERpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnI3ByYWdtYSBvbXAgdGFza2xvb3Agc2ltZCcgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCB0YXNrbG9vcCBzaW1kIHByaXZhdGUoYSxiKSBncmFpbnNpemUodmFsKSBudW1fdGFza3MobnVtKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgdGFza2xvb3Agc2ltZCcgaGFzIGNsYXVzZXMgJ3ByaXZhdGUnCisvLy8gd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InLCAnZ3JhaW5zaXplJyB3aXRoIGV4cHJlc3Npb24gJ3ZhbCcgYW5kCisvLy8gJ251bV90YXNrcycgd2l0aCBleHByZXNzaW9uICdudW0nLgorLy8vCitjbGFzcyBPTVBUYXNrTG9vcFNpbWREaXJlY3RpdmUgOiBwdWJsaWMgT01QTG9vcERpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICAvLy8gXGJyaWVmIEJ1aWxkIGRpcmVjdGl2ZSB3aXRoIHRoZSBnaXZlbiBzdGFydCBhbmQgZW5kIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgT01QVGFza0xvb3BTaW1kRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2xsYXBzZWROdW0sIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUExvb3BEaXJlY3RpdmUodGhpcywgT01QVGFza0xvb3BTaW1kRGlyZWN0aXZlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgT01QRF90YXNrbG9vcF9zaW1kLCBTdGFydExvYywgRW5kTG9jLCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQ2xhdXNlcykge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBleHBsaWNpdCBPTVBUYXNrTG9vcFNpbWREaXJlY3RpdmUodW5zaWduZWQgQ29sbGFwc2VkTnVtLCB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBMb29wRGlyZWN0aXZlKHRoaXMsIE9NUFRhc2tMb29wU2ltZERpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfdGFza2xvb3Bfc2ltZCwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsYXBzZWROdW0sIE51bUNsYXVzZXMpIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZSB3aXRoIGEgbGlzdCBvZiBcYSBDbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCisgIC8vLyBccGFyYW0gQXNzb2NpYXRlZFN0bXQgU3RhdGVtZW50LCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBFeHBycyBIZWxwZXIgZXhwcmVzc2lvbnMgZm9yIENvZGVHZW4uCisgIC8vLworICBzdGF0aWMgT01QVGFza0xvb3BTaW1kRGlyZWN0aXZlICoKKyAgQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICB1bnNpZ25lZCBDb2xsYXBzZWROdW0sIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgU3RtdCAqQXNzb2NpYXRlZFN0bXQsIGNvbnN0IEhlbHBlckV4cHJzICZFeHBycyk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZQorICAvLy8gZm9yIFxhIE51bUNsYXVzZXMgY2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBUYXNrTG9vcFNpbWREaXJlY3RpdmUgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW1wdHlTaGVsbCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9NUFRhc2tMb29wU2ltZERpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnI3ByYWdtYSBvbXAgZGlzdHJpYnV0ZScgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBkaXN0cmlidXRlIHByaXZhdGUoYSxiKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgZGlzdHJpYnV0ZScgaGFzIGNsYXVzZXMgJ3ByaXZhdGUnCisvLy8gd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InCisvLy8KK2NsYXNzIE9NUERpc3RyaWJ1dGVEaXJlY3RpdmUgOiBwdWJsaWMgT01QTG9vcERpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIC8vLyBcYnJpZWYgQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBPTVBEaXN0cmlidXRlRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBMb29wRGlyZWN0aXZlKHRoaXMsIE9NUERpc3RyaWJ1dGVEaXJlY3RpdmVDbGFzcywgT01QRF9kaXN0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0TG9jLCBFbmRMb2MsIENvbGxhcHNlZE51bSwgTnVtQ2xhdXNlcykKKyAgICAgICAge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBleHBsaWNpdCBPTVBEaXN0cmlidXRlRGlyZWN0aXZlKHVuc2lnbmVkIENvbGxhcHNlZE51bSwgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QTG9vcERpcmVjdGl2ZSh0aGlzLCBPTVBEaXN0cmlidXRlRGlyZWN0aXZlQ2xhc3MsIE9NUERfZGlzdHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQ2xhdXNlcykKKyAgICAgICAge30KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgZGlyZWN0aXZlIHdpdGggYSBsaXN0IG9mIFxhIENsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgTG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBDbGF1c2VzIExpc3Qgb2YgY2xhdXNlcy4KKyAgLy8vIFxwYXJhbSBBc3NvY2lhdGVkU3RtdCBTdGF0ZW1lbnQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIEV4cHJzIEhlbHBlciBleHByZXNzaW9ucyBmb3IgQ29kZUdlbi4KKyAgLy8vCisgIHN0YXRpYyBPTVBEaXN0cmlidXRlRGlyZWN0aXZlICoKKyAgQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICB1bnNpZ25lZCBDb2xsYXBzZWROdW0sIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgU3RtdCAqQXNzb2NpYXRlZFN0bXQsIGNvbnN0IEhlbHBlckV4cHJzICZFeHBycyk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZQorICAvLy8gZm9yIFxhIE51bUNsYXVzZXMgY2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBEaXN0cmlidXRlRGlyZWN0aXZlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwgRW1wdHlTaGVsbCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9NUERpc3RyaWJ1dGVEaXJlY3RpdmVDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJyNwcmFnbWEgb21wIHRhcmdldCB1cGRhdGUnIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgdGFyZ2V0IHVwZGF0ZSB0byhhKSBmcm9tKGIpIGRldmljZSgxKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgdGFyZ2V0IHVwZGF0ZScgaGFzIGNsYXVzZSAndG8nIHdpdGgKKy8vLyBhcmd1bWVudCAnYScsIGNsYXVzZSAnZnJvbScgd2l0aCBhcmd1bWVudCAnYicgYW5kIGNsYXVzZSAnZGV2aWNlJyB3aXRoCisvLy8gYXJndW1lbnQgJzEnLgorLy8vCitjbGFzcyBPTVBUYXJnZXRVcGRhdGVEaXJlY3RpdmUgOiBwdWJsaWMgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICAvLy8gXGJyaWVmIEJ1aWxkIGRpcmVjdGl2ZSB3aXRoIHRoZSBnaXZlbiBzdGFydCBhbmQgZW5kIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgVGhlIG51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgT01QVGFyZ2V0VXBkYXRlRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKHRoaXMsIE9NUFRhcmdldFVwZGF0ZURpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfdGFyZ2V0X3VwZGF0ZSwgU3RhcnRMb2MsIEVuZExvYywgTnVtQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgZXhwbGljaXQgT01QVGFyZ2V0VXBkYXRlRGlyZWN0aXZlKHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QVGFyZ2V0VXBkYXRlRGlyZWN0aXZlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01QRF90YXJnZXRfdXBkYXRlLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIE51bUNsYXVzZXMsIDEpIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZSB3aXRoIGEgbGlzdCBvZiBcYSBDbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCisgIC8vLyBccGFyYW0gQXNzb2NpYXRlZFN0bXQgU3RhdGVtZW50LCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS4KKyAgLy8vCisgIHN0YXRpYyBPTVBUYXJnZXRVcGRhdGVEaXJlY3RpdmUgKgorICBDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLCBTdG10ICpBc3NvY2lhdGVkU3RtdCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZSBmb3IgXGEgTnVtQ2xhdXNlcworICAvLy8gY2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIFRoZSBudW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBUYXJnZXRVcGRhdGVEaXJlY3RpdmUgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMsIEVtcHR5U2hlbGwpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBUYXJnZXRVcGRhdGVEaXJlY3RpdmVDbGFzczsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJyNwcmFnbWEgb21wIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yJyBjb21wb3NpdGUKKy8vLyAgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBkaXN0cmlidXRlIHBhcmFsbGVsIGZvciBwcml2YXRlKGEsYikKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yJyBoYXMgY2xhdXNlCisvLy8gJ3ByaXZhdGUnIHdpdGggdGhlIHZhcmlhYmxlcyAnYScgYW5kICdiJworLy8vCitjbGFzcyBPTVBEaXN0cmlidXRlUGFyYWxsZWxGb3JEaXJlY3RpdmUgOiBwdWJsaWMgT01QTG9vcERpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICAvLy8gdHJ1ZSBpZiB0aGUgY29uc3RydWN0IGhhcyBpbm5lciBjYW5jZWwgZGlyZWN0aXZlLgorICBib29sIEhhc0NhbmNlbCA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBPTVBEaXN0cmlidXRlUGFyYWxsZWxGb3JEaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2xsYXBzZWROdW0sIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUExvb3BEaXJlY3RpdmUodGhpcywgT01QRGlzdHJpYnV0ZVBhcmFsbGVsRm9yRGlyZWN0aXZlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgT01QRF9kaXN0cmlidXRlX3BhcmFsbGVsX2ZvciwgU3RhcnRMb2MsIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsYXBzZWROdW0sIE51bUNsYXVzZXMpLCBIYXNDYW5jZWwoZmFsc2UpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgZXhwbGljaXQgT01QRGlzdHJpYnV0ZVBhcmFsbGVsRm9yRGlyZWN0aXZlKHVuc2lnbmVkIENvbGxhcHNlZE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUExvb3BEaXJlY3RpdmUodGhpcywgT01QRGlzdHJpYnV0ZVBhcmFsbGVsRm9yRGlyZWN0aXZlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgT01QRF9kaXN0cmlidXRlX3BhcmFsbGVsX2ZvciwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBDb2xsYXBzZWROdW0sIE51bUNsYXVzZXMpLAorICAgICAgICBIYXNDYW5jZWwoZmFsc2UpIHt9CisKKyAgLy8vIFNldCBjYW5jZWwgc3RhdGUuCisgIHZvaWQgc2V0SGFzQ2FuY2VsKGJvb2wgSGFzKSB7IEhhc0NhbmNlbCA9IEhhczsgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBkaXJlY3RpdmUgd2l0aCBhIGxpc3Qgb2YgXGEgQ2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIGxvb3BzLgorICAvLy8gXHBhcmFtIENsYXVzZXMgTGlzdCBvZiBjbGF1c2VzLgorICAvLy8gXHBhcmFtIEFzc29jaWF0ZWRTdG10IFN0YXRlbWVudCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gRXhwcnMgSGVscGVyIGV4cHJlc3Npb25zIGZvciBDb2RlR2VuLgorICAvLy8gXHBhcmFtIEhhc0NhbmNlbCB0cnVlIGlmIHRoaXMgZGlyZWN0aXZlIGhhcyBpbm5lciBjYW5jZWwgZGlyZWN0aXZlLgorICAvLy8KKyAgc3RhdGljIE9NUERpc3RyaWJ1dGVQYXJhbGxlbEZvckRpcmVjdGl2ZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgIFN0bXQgKkFzc29jaWF0ZWRTdG10LCBjb25zdCBIZWxwZXJFeHBycyAmRXhwcnMsIGJvb2wgSGFzQ2FuY2VsKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgZGlyZWN0aXZlIHdpdGggdGhlIHBsYWNlCisgIC8vLyBmb3IgXGEgTnVtQ2xhdXNlcyBjbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgc3RhdGljIE9NUERpc3RyaWJ1dGVQYXJhbGxlbEZvckRpcmVjdGl2ZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbXB0eVNoZWxsKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgY3VycmVudCBkaXJlY3RpdmUgaGFzIGlubmVyIGNhbmNlbCBkaXJlY3RpdmUuCisgIGJvb2wgaGFzQ2FuY2VsKCkgY29uc3QgeyByZXR1cm4gSGFzQ2FuY2VsOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9NUERpc3RyaWJ1dGVQYXJhbGxlbEZvckRpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCBkaXN0cmlidXRlIHBhcmFsbGVsIGZvciBzaW1kJyBjb21wb3NpdGUKKy8vLyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yIHNpbWQgcHJpdmF0ZSh4KQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3Igc2ltZCcgaGFzCisvLy8gY2xhdXNlICdwcml2YXRlJyB3aXRoIHRoZSB2YXJpYWJsZXMgJ3gnCisvLy8KK2NsYXNzIE9NUERpc3RyaWJ1dGVQYXJhbGxlbEZvclNpbWREaXJlY3RpdmUgZmluYWwgOiBwdWJsaWMgT01QTG9vcERpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIC8vLyBCdWlsZCBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIGVuZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIE9NUERpc3RyaWJ1dGVQYXJhbGxlbEZvclNpbWREaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBMb29wRGlyZWN0aXZlKHRoaXMsIE9NUERpc3RyaWJ1dGVQYXJhbGxlbEZvclNpbWREaXJlY3RpdmVDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPTVBEX2Rpc3RyaWJ1dGVfcGFyYWxsZWxfZm9yX3NpbWQsIFN0YXJ0TG9jLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBFbmRMb2MsIENvbGxhcHNlZE51bSwgTnVtQ2xhdXNlcykge30KKworICAvLy8gQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUERpc3RyaWJ1dGVQYXJhbGxlbEZvclNpbWREaXJlY3RpdmUodW5zaWduZWQgQ29sbGFwc2VkTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUExvb3BEaXJlY3RpdmUodGhpcywgT01QRGlzdHJpYnV0ZVBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfZGlzdHJpYnV0ZV9wYXJhbGxlbF9mb3Jfc2ltZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwgQ29sbGFwc2VkTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIE51bUNsYXVzZXMpIHt9CisKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZXMgZGlyZWN0aXZlIHdpdGggYSBsaXN0IG9mIFxhIENsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgTG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBDbGF1c2VzIExpc3Qgb2YgY2xhdXNlcy4KKyAgLy8vIFxwYXJhbSBBc3NvY2lhdGVkU3RtdCBTdGF0ZW1lbnQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIEV4cHJzIEhlbHBlciBleHByZXNzaW9ucyBmb3IgQ29kZUdlbi4KKyAgLy8vCisgIHN0YXRpYyBPTVBEaXN0cmlidXRlUGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlICpDcmVhdGUoCisgICAgICBjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgIFN0bXQgKkFzc29jaWF0ZWRTdG10LCBjb25zdCBIZWxwZXJFeHBycyAmRXhwcnMpOworCisgIC8vLyBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZSBmb3IgXGEgTnVtQ2xhdXNlcyBjbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgc3RhdGljIE9NUERpc3RyaWJ1dGVQYXJhbGxlbEZvclNpbWREaXJlY3RpdmUgKkNyZWF0ZUVtcHR5KAorICAgICAgY29uc3QgQVNUQ29udGV4dCAmQywgdW5zaWduZWQgTnVtQ2xhdXNlcywgdW5zaWduZWQgQ29sbGFwc2VkTnVtLAorICAgICAgRW1wdHlTaGVsbCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9NUERpc3RyaWJ1dGVQYXJhbGxlbEZvclNpbWREaXJlY3RpdmVDbGFzczsKKyAgfQorfTsKKworLy8vIFRoaXMgcmVwcmVzZW50cyAnI3ByYWdtYSBvbXAgZGlzdHJpYnV0ZSBzaW1kJyBjb21wb3NpdGUgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBkaXN0cmlidXRlIHNpbWQgcHJpdmF0ZSh4KQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgZGlzdHJpYnV0ZSBzaW1kJyBoYXMgY2xhdXNlCisvLy8gJ3ByaXZhdGUnIHdpdGggdGhlIHZhcmlhYmxlcyAneCcKKy8vLworY2xhc3MgT01QRGlzdHJpYnV0ZVNpbWREaXJlY3RpdmUgZmluYWwgOiBwdWJsaWMgT01QTG9vcERpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIC8vLyBCdWlsZCBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIGVuZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIE9NUERpc3RyaWJ1dGVTaW1kRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QTG9vcERpcmVjdGl2ZSh0aGlzLCBPTVBEaXN0cmlidXRlU2ltZERpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfZGlzdHJpYnV0ZV9zaW1kLCBTdGFydExvYywgRW5kTG9jLCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQ2xhdXNlcykge30KKworICAvLy8gQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUERpc3RyaWJ1dGVTaW1kRGlyZWN0aXZlKHVuc2lnbmVkIENvbGxhcHNlZE51bSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUExvb3BEaXJlY3RpdmUodGhpcywgT01QRGlzdHJpYnV0ZVNpbWREaXJlY3RpdmVDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPTVBEX2Rpc3RyaWJ1dGVfc2ltZCwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBDb2xsYXBzZWROdW0sIE51bUNsYXVzZXMpIHt9CisKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZXMgZGlyZWN0aXZlIHdpdGggYSBsaXN0IG9mIFxhIENsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgTG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBDbGF1c2VzIExpc3Qgb2YgY2xhdXNlcy4KKyAgLy8vIFxwYXJhbSBBc3NvY2lhdGVkU3RtdCBTdGF0ZW1lbnQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIEV4cHJzIEhlbHBlciBleHByZXNzaW9ucyBmb3IgQ29kZUdlbi4KKyAgLy8vCisgIHN0YXRpYyBPTVBEaXN0cmlidXRlU2ltZERpcmVjdGl2ZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgIFN0bXQgKkFzc29jaWF0ZWRTdG10LCBjb25zdCBIZWxwZXJFeHBycyAmRXhwcnMpOworCisgIC8vLyBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZSBmb3IgXGEgTnVtQ2xhdXNlcyBjbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgc3RhdGljIE9NUERpc3RyaWJ1dGVTaW1kRGlyZWN0aXZlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtcHR5U2hlbGwpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBEaXN0cmlidXRlU2ltZERpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCB0YXJnZXQgcGFyYWxsZWwgZm9yIHNpbWQnIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgdGFyZ2V0IHBhcmFsbGVsIGZvciBzaW1kIHByaXZhdGUoYSkgbWFwKGIpIHNhZmVsZW4oYykKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRhcmdldCBwYXJhbGxlbCBmb3Igc2ltZCcgaGFzIGNsYXVzZXMKKy8vLyAncHJpdmF0ZScgd2l0aCB0aGUgdmFyaWFibGUgJ2EnLCAnbWFwJyB3aXRoIHRoZSB2YXJpYWJsZSAnYicgYW5kICdzYWZlbGVuJworLy8vIHdpdGggdGhlIHZhcmlhYmxlICdjJy4KKy8vLworY2xhc3MgT01QVGFyZ2V0UGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlIGZpbmFsIDogcHVibGljIE9NUExvb3BEaXJlY3RpdmUgeworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKworICAvLy8gQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBPTVBUYXJnZXRQYXJhbGxlbEZvclNpbWREaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBMb29wRGlyZWN0aXZlKHRoaXMsIE9NUFRhcmdldFBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfdGFyZ2V0X3BhcmFsbGVsX2Zvcl9zaW1kLCBTdGFydExvYywgRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxhcHNlZE51bSwgTnVtQ2xhdXNlcykge30KKworICAvLy8gQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFRhcmdldFBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZSh1bnNpZ25lZCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBMb29wRGlyZWN0aXZlKHRoaXMsIE9NUFRhcmdldFBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfdGFyZ2V0X3BhcmFsbGVsX2Zvcl9zaW1kLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIENvbGxhcHNlZE51bSwgTnVtQ2xhdXNlcykge30KKworcHVibGljOgorICAvLy8gQ3JlYXRlcyBkaXJlY3RpdmUgd2l0aCBhIGxpc3Qgb2YgXGEgQ2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIGxvb3BzLgorICAvLy8gXHBhcmFtIENsYXVzZXMgTGlzdCBvZiBjbGF1c2VzLgorICAvLy8gXHBhcmFtIEFzc29jaWF0ZWRTdG10IFN0YXRlbWVudCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gRXhwcnMgSGVscGVyIGV4cHJlc3Npb25zIGZvciBDb2RlR2VuLgorICAvLy8KKyAgc3RhdGljIE9NUFRhcmdldFBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgIFN0bXQgKkFzc29jaWF0ZWRTdG10LCBjb25zdCBIZWxwZXJFeHBycyAmRXhwcnMpOworCisgIC8vLyBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZSBmb3IgXGEgTnVtQ2xhdXNlcyBjbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgc3RhdGljIE9NUFRhcmdldFBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbXB0eVNoZWxsKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QVGFyZ2V0UGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKKy8vLyBUaGlzIHJlcHJlc2VudHMgJyNwcmFnbWEgb21wIHRhcmdldCBzaW1kJyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHRhcmdldCBzaW1kIHByaXZhdGUoYSkgbWFwKGIpIHNhZmVsZW4oYykKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRhcmdldCBzaW1kJyBoYXMgY2xhdXNlcyAncHJpdmF0ZScKKy8vLyB3aXRoIHRoZSB2YXJpYWJsZSAnYScsICdtYXAnIHdpdGggdGhlIHZhcmlhYmxlICdiJyBhbmQgJ3NhZmVsZW4nIHdpdGgKKy8vLyB0aGUgdmFyaWFibGUgJ2MnLgorLy8vCitjbGFzcyBPTVBUYXJnZXRTaW1kRGlyZWN0aXZlIGZpbmFsIDogcHVibGljIE9NUExvb3BEaXJlY3RpdmUgeworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKworICAvLy8gQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBPTVBUYXJnZXRTaW1kRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBMb29wRGlyZWN0aXZlKHRoaXMsIE9NUFRhcmdldFNpbWREaXJlY3RpdmVDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPTVBEX3RhcmdldF9zaW1kLCBTdGFydExvYywgRW5kTG9jLCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQ2xhdXNlcykge30KKworICAvLy8gQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFRhcmdldFNpbWREaXJlY3RpdmUodW5zaWduZWQgQ29sbGFwc2VkTnVtLCB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBMb29wRGlyZWN0aXZlKHRoaXMsIE9NUFRhcmdldFNpbWREaXJlY3RpdmVDbGFzcywgT01QRF90YXJnZXRfc2ltZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSxTb3VyY2VMb2NhdGlvbigpLCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQ2xhdXNlcykge30KKworcHVibGljOgorICAvLy8gQ3JlYXRlcyBkaXJlY3RpdmUgd2l0aCBhIGxpc3Qgb2YgXGEgQ2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIGxvb3BzLgorICAvLy8gXHBhcmFtIENsYXVzZXMgTGlzdCBvZiBjbGF1c2VzLgorICAvLy8gXHBhcmFtIEFzc29jaWF0ZWRTdG10IFN0YXRlbWVudCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gRXhwcnMgSGVscGVyIGV4cHJlc3Npb25zIGZvciBDb2RlR2VuLgorICAvLy8KKyAgc3RhdGljIE9NUFRhcmdldFNpbWREaXJlY3RpdmUgKgorICBDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsCisgICAgICAgICBTdG10ICpBc3NvY2lhdGVkU3RtdCwgY29uc3QgSGVscGVyRXhwcnMgJkV4cHJzKTsKKworICAvLy8gQ3JlYXRlcyBhbiBlbXB0eSBkaXJlY3RpdmUgd2l0aCB0aGUgcGxhY2UgZm9yIFxhIE51bUNsYXVzZXMgY2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBUYXJnZXRTaW1kRGlyZWN0aXZlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtcHR5U2hlbGwpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBUYXJnZXRTaW1kRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKKy8vLyBUaGlzIHJlcHJlc2VudHMgJyNwcmFnbWEgb21wIHRlYW1zIGRpc3RyaWJ1dGUnIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgdGVhbXMgZGlzdHJpYnV0ZSBwcml2YXRlKGEsYikKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRlYW1zIGRpc3RyaWJ1dGUnIGhhcyBjbGF1c2VzCisvLy8gJ3ByaXZhdGUnIHdpdGggdGhlIHZhcmlhYmxlcyAnYScgYW5kICdiJworLy8vCitjbGFzcyBPTVBUZWFtc0Rpc3RyaWJ1dGVEaXJlY3RpdmUgZmluYWwgOiBwdWJsaWMgT01QTG9vcERpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIC8vLyBCdWlsZCBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIGVuZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIE9NUFRlYW1zRGlzdHJpYnV0ZURpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBMb29wRGlyZWN0aXZlKHRoaXMsIE9NUFRlYW1zRGlzdHJpYnV0ZURpcmVjdGl2ZUNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBPTVBEX3RlYW1zX2Rpc3RyaWJ1dGUsIFN0YXJ0TG9jLCBFbmRMb2MsIAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxhcHNlZE51bSwgTnVtQ2xhdXNlcykge30KKworICAvLy8gQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFRlYW1zRGlzdHJpYnV0ZURpcmVjdGl2ZSh1bnNpZ25lZCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBMb29wRGlyZWN0aXZlKHRoaXMsIE9NUFRlYW1zRGlzdHJpYnV0ZURpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfdGVhbXNfZGlzdHJpYnV0ZSwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBDb2xsYXBzZWROdW0sIE51bUNsYXVzZXMpIHt9CisKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZXMgZGlyZWN0aXZlIHdpdGggYSBsaXN0IG9mIFxhIENsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgTG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBDbGF1c2VzIExpc3Qgb2YgY2xhdXNlcy4KKyAgLy8vIFxwYXJhbSBBc3NvY2lhdGVkU3RtdCBTdGF0ZW1lbnQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIEV4cHJzIEhlbHBlciBleHByZXNzaW9ucyBmb3IgQ29kZUdlbi4KKyAgLy8vCisgIHN0YXRpYyBPTVBUZWFtc0Rpc3RyaWJ1dGVEaXJlY3RpdmUgKgorICBDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsCisgICAgICAgICBTdG10ICpBc3NvY2lhdGVkU3RtdCwgY29uc3QgSGVscGVyRXhwcnMgJkV4cHJzKTsKKworICAvLy8gQ3JlYXRlcyBhbiBlbXB0eSBkaXJlY3RpdmUgd2l0aCB0aGUgcGxhY2UgZm9yIFxhIE51bUNsYXVzZXMgY2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBUZWFtc0Rpc3RyaWJ1dGVEaXJlY3RpdmUgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW1wdHlTaGVsbCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9NUFRlYW1zRGlzdHJpYnV0ZURpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCB0ZWFtcyBkaXN0cmlidXRlIHNpbWQnCisvLy8gY29tYmluZWQgZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCB0ZWFtcyBkaXN0cmlidXRlIHNpbWQgcHJpdmF0ZShhLGIpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCB0ZWFtcyBkaXN0cmlidXRlIHNpbWQnCisvLy8gaGFzIGNsYXVzZSAncHJpdmF0ZScgd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InCisvLy8KK2NsYXNzIE9NUFRlYW1zRGlzdHJpYnV0ZVNpbWREaXJlY3RpdmUgZmluYWwgOiBwdWJsaWMgT01QTG9vcERpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIC8vLyBCdWlsZCBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIGVuZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIE9NUFRlYW1zRGlzdHJpYnV0ZVNpbWREaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLCB1bnNpZ25lZCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QTG9vcERpcmVjdGl2ZSh0aGlzLCBPTVBUZWFtc0Rpc3RyaWJ1dGVTaW1kRGlyZWN0aXZlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgT01QRF90ZWFtc19kaXN0cmlidXRlX3NpbWQsIFN0YXJ0TG9jLCBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGFwc2VkTnVtLCBOdW1DbGF1c2VzKSB7fQorCisgIC8vLyBCdWlsZCBhbiBlbXB0eSBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgZXhwbGljaXQgT01QVGVhbXNEaXN0cmlidXRlU2ltZERpcmVjdGl2ZSh1bnNpZ25lZCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QTG9vcERpcmVjdGl2ZSh0aGlzLCBPTVBUZWFtc0Rpc3RyaWJ1dGVTaW1kRGlyZWN0aXZlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgT01QRF90ZWFtc19kaXN0cmlidXRlX3NpbWQsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgQ29sbGFwc2VkTnVtLCBOdW1DbGF1c2VzKSB7fQorCitwdWJsaWM6CisgIC8vLyBDcmVhdGVzIGRpcmVjdGl2ZSB3aXRoIGEgbGlzdCBvZiBcYSBDbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCisgIC8vLyBccGFyYW0gQXNzb2NpYXRlZFN0bXQgU3RhdGVtZW50LCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBFeHBycyBIZWxwZXIgZXhwcmVzc2lvbnMgZm9yIENvZGVHZW4uCisgIC8vLworICBzdGF0aWMgT01QVGVhbXNEaXN0cmlidXRlU2ltZERpcmVjdGl2ZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgIFN0bXQgKkFzc29jaWF0ZWRTdG10LCBjb25zdCBIZWxwZXJFeHBycyAmRXhwcnMpOworCisgIC8vLyBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZQorICAvLy8gZm9yIFxhIE51bUNsYXVzZXMgY2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBUZWFtc0Rpc3RyaWJ1dGVTaW1kRGlyZWN0aXZlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtcHR5U2hlbGwpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBUZWFtc0Rpc3RyaWJ1dGVTaW1kRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKKy8vLyBUaGlzIHJlcHJlc2VudHMgJyNwcmFnbWEgb21wIHRlYW1zIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yIHNpbWQnIGNvbXBvc2l0ZQorLy8vIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgdGVhbXMgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3Igc2ltZCBwcml2YXRlKHgpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCB0ZWFtcyBkaXN0cmlidXRlIHBhcmFsbGVsIGZvciBzaW1kJworLy8vIGhhcyBjbGF1c2UgJ3ByaXZhdGUnIHdpdGggdGhlIHZhcmlhYmxlcyAneCcKKy8vLworY2xhc3MgT01QVGVhbXNEaXN0cmlidXRlUGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlIGZpbmFsCisgICAgOiBwdWJsaWMgT01QTG9vcERpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIC8vLyBCdWlsZCBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIGVuZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIE9NUFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUExvb3BEaXJlY3RpdmUodGhpcywgT01QVGVhbXNEaXN0cmlidXRlUGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgT01QRF90ZWFtc19kaXN0cmlidXRlX3BhcmFsbGVsX2Zvcl9zaW1kLCBTdGFydExvYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgRW5kTG9jLCBDb2xsYXBzZWROdW0sIE51bUNsYXVzZXMpIHt9CisKKyAgLy8vIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBleHBsaWNpdCBPTVBUZWFtc0Rpc3RyaWJ1dGVQYXJhbGxlbEZvclNpbWREaXJlY3RpdmUodW5zaWduZWQgQ29sbGFwc2VkTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QTG9vcERpcmVjdGl2ZSh0aGlzLCBPTVBUZWFtc0Rpc3RyaWJ1dGVQYXJhbGxlbEZvclNpbWREaXJlY3RpdmVDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPTVBEX3RlYW1zX2Rpc3RyaWJ1dGVfcGFyYWxsZWxfZm9yX3NpbWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIENvbGxhcHNlZE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOdW1DbGF1c2VzKSB7fQorCitwdWJsaWM6CisgIC8vLyBDcmVhdGVzIGRpcmVjdGl2ZSB3aXRoIGEgbGlzdCBvZiBcYSBDbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCisgIC8vLyBccGFyYW0gQXNzb2NpYXRlZFN0bXQgU3RhdGVtZW50LCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBFeHBycyBIZWxwZXIgZXhwcmVzc2lvbnMgZm9yIENvZGVHZW4uCisgIC8vLworICBzdGF0aWMgT01QVGVhbXNEaXN0cmlidXRlUGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlICoKKyAgQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICB1bnNpZ25lZCBDb2xsYXBzZWROdW0sIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgU3RtdCAqQXNzb2NpYXRlZFN0bXQsIGNvbnN0IEhlbHBlckV4cHJzICZFeHBycyk7CisKKyAgLy8vIENyZWF0ZXMgYW4gZW1wdHkgZGlyZWN0aXZlIHdpdGggdGhlIHBsYWNlIGZvciBcYSBOdW1DbGF1c2VzIGNsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBzdGF0aWMgT01QVGVhbXNEaXN0cmlidXRlUGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlICoKKyAgQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywgdW5zaWduZWQgTnVtQ2xhdXNlcywgdW5zaWduZWQgQ29sbGFwc2VkTnVtLAorICAgICAgICAgICAgICBFbXB0eVNoZWxsKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QVGVhbXNEaXN0cmlidXRlUGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKKy8vLyBUaGlzIHJlcHJlc2VudHMgJyNwcmFnbWEgb21wIHRlYW1zIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yJyBjb21wb3NpdGUKKy8vLyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHRlYW1zIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yIHByaXZhdGUoeCkKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRlYW1zIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yJworLy8vIGhhcyBjbGF1c2UgJ3ByaXZhdGUnIHdpdGggdGhlIHZhcmlhYmxlcyAneCcKKy8vLworY2xhc3MgT01QVGVhbXNEaXN0cmlidXRlUGFyYWxsZWxGb3JEaXJlY3RpdmUgZmluYWwgOiBwdWJsaWMgT01QTG9vcERpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICAvLy8gdHJ1ZSBpZiB0aGUgY29uc3RydWN0IGhhcyBpbm5lciBjYW5jZWwgZGlyZWN0aXZlLgorICBib29sIEhhc0NhbmNlbCA9IGZhbHNlOworCisgIC8vLyBCdWlsZCBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIGVuZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIE9NUFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QTG9vcERpcmVjdGl2ZSh0aGlzLCBPTVBUZWFtc0Rpc3RyaWJ1dGVQYXJhbGxlbEZvckRpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfdGVhbXNfZGlzdHJpYnV0ZV9wYXJhbGxlbF9mb3IsIFN0YXJ0TG9jLCBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGFwc2VkTnVtLCBOdW1DbGF1c2VzKSwgSGFzQ2FuY2VsKGZhbHNlKSB7fQorCisgIC8vLyBCdWlsZCBhbiBlbXB0eSBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgZXhwbGljaXQgT01QVGVhbXNEaXN0cmlidXRlUGFyYWxsZWxGb3JEaXJlY3RpdmUodW5zaWduZWQgQ29sbGFwc2VkTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBMb29wRGlyZWN0aXZlKHRoaXMsIE9NUFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yRGlyZWN0aXZlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgT01QRF90ZWFtc19kaXN0cmlidXRlX3BhcmFsbGVsX2ZvciwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBDb2xsYXBzZWROdW0sIE51bUNsYXVzZXMpLAorICAgICAgICBIYXNDYW5jZWwoZmFsc2UpIHt9CisKKyAgLy8vIFNldCBjYW5jZWwgc3RhdGUuCisgIHZvaWQgc2V0SGFzQ2FuY2VsKGJvb2wgSGFzKSB7IEhhc0NhbmNlbCA9IEhhczsgfQorCitwdWJsaWM6CisgIC8vLyBDcmVhdGVzIGRpcmVjdGl2ZSB3aXRoIGEgbGlzdCBvZiBcYSBDbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCisgIC8vLyBccGFyYW0gQXNzb2NpYXRlZFN0bXQgU3RhdGVtZW50LCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBFeHBycyBIZWxwZXIgZXhwcmVzc2lvbnMgZm9yIENvZGVHZW4uCisgIC8vLyBccGFyYW0gSGFzQ2FuY2VsIHRydWUgaWYgdGhpcyBkaXJlY3RpdmUgaGFzIGlubmVyIGNhbmNlbCBkaXJlY3RpdmUuCisgIC8vLworICBzdGF0aWMgT01QVGVhbXNEaXN0cmlidXRlUGFyYWxsZWxGb3JEaXJlY3RpdmUgKgorICBDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsCisgICAgICAgICBTdG10ICpBc3NvY2lhdGVkU3RtdCwgY29uc3QgSGVscGVyRXhwcnMgJkV4cHJzLCBib29sIEhhc0NhbmNlbCk7CisKKyAgLy8vIENyZWF0ZXMgYW4gZW1wdHkgZGlyZWN0aXZlIHdpdGggdGhlIHBsYWNlIGZvciBcYSBOdW1DbGF1c2VzIGNsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBzdGF0aWMgT01QVGVhbXNEaXN0cmlidXRlUGFyYWxsZWxGb3JEaXJlY3RpdmUgKgorICBDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBOdW1DbGF1c2VzLCB1bnNpZ25lZCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgIEVtcHR5U2hlbGwpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBjdXJyZW50IGRpcmVjdGl2ZSBoYXMgaW5uZXIgY2FuY2VsIGRpcmVjdGl2ZS4KKyAgYm9vbCBoYXNDYW5jZWwoKSBjb25zdCB7IHJldHVybiBIYXNDYW5jZWw7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QVGVhbXNEaXN0cmlidXRlUGFyYWxsZWxGb3JEaXJlY3RpdmVDbGFzczsKKyAgfQorfTsKKworLy8vIFRoaXMgcmVwcmVzZW50cyAnI3ByYWdtYSBvbXAgdGFyZ2V0IHRlYW1zJyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHRhcmdldCB0ZWFtcyBpZihhPjApCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCB0YXJnZXQgdGVhbXMnIGhhcyBjbGF1c2UgJ2lmJyB3aXRoCisvLy8gY29uZGl0aW9uICdhPjAnLgorLy8vCitjbGFzcyBPTVBUYXJnZXRUZWFtc0RpcmVjdGl2ZSBmaW5hbCA6IHB1YmxpYyBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisgIC8vLyBCdWlsZCBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIGVuZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgT01QVGFyZ2V0VGVhbXNEaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QRXhlY3V0YWJsZURpcmVjdGl2ZSh0aGlzLCBPTVBUYXJnZXRUZWFtc0RpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfdGFyZ2V0X3RlYW1zLCBTdGFydExvYywgRW5kTG9jLCBOdW1DbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpIHt9CisKKyAgLy8vIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFRhcmdldFRlYW1zRGlyZWN0aXZlKHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QVGFyZ2V0VGVhbXNEaXJlY3RpdmVDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVBEX3RhcmdldF90ZWFtcywgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBOdW1DbGF1c2VzLCAxKSB7fQorCitwdWJsaWM6CisgIC8vLyBDcmVhdGVzIGRpcmVjdGl2ZSB3aXRoIGEgbGlzdCBvZiBcYSBDbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCisgIC8vLyBccGFyYW0gQXNzb2NpYXRlZFN0bXQgU3RhdGVtZW50LCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS4KKyAgLy8vCisgIHN0YXRpYyBPTVBUYXJnZXRUZWFtc0RpcmVjdGl2ZSAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpBc3NvY2lhdGVkU3RtdCk7CisKKyAgLy8vIENyZWF0ZXMgYW4gZW1wdHkgZGlyZWN0aXZlIHdpdGggdGhlIHBsYWNlIGZvciBcYSBOdW1DbGF1c2VzIGNsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBUYXJnZXRUZWFtc0RpcmVjdGl2ZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DbGF1c2VzLCBFbXB0eVNoZWxsKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QVGFyZ2V0VGVhbXNEaXJlY3RpdmVDbGFzczsKKyAgfQorfTsKKworLy8vIFRoaXMgcmVwcmVzZW50cyAnI3ByYWdtYSBvbXAgdGFyZ2V0IHRlYW1zIGRpc3RyaWJ1dGUnIGNvbWJpbmVkIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgdGFyZ2V0IHRlYW1zIGRpc3RyaWJ1dGUgcHJpdmF0ZSh4KQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgdGFyZ2V0IHRlYW1zIGRpc3RyaWJ1dGUnIGhhcyBjbGF1c2UKKy8vLyAncHJpdmF0ZScgd2l0aCB0aGUgdmFyaWFibGVzICd4JworLy8vCitjbGFzcyBPTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVEaXJlY3RpdmUgZmluYWwgOiBwdWJsaWMgT01QTG9vcERpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIC8vLyBCdWlsZCBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIGVuZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIE9NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZURpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QTG9vcERpcmVjdGl2ZSh0aGlzLCBPTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVEaXJlY3RpdmVDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPTVBEX3RhcmdldF90ZWFtc19kaXN0cmlidXRlLCBTdGFydExvYywgRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxhcHNlZE51bSwgTnVtQ2xhdXNlcykge30KKworICAvLy8gQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZURpcmVjdGl2ZSh1bnNpZ25lZCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBMb29wRGlyZWN0aXZlKHRoaXMsIE9NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZURpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfdGFyZ2V0X3RlYW1zX2Rpc3RyaWJ1dGUsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgQ29sbGFwc2VkTnVtLCBOdW1DbGF1c2VzKSB7fQorCitwdWJsaWM6CisgIC8vLyBDcmVhdGVzIGRpcmVjdGl2ZSB3aXRoIGEgbGlzdCBvZiBcYSBDbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCisgIC8vLyBccGFyYW0gQXNzb2NpYXRlZFN0bXQgU3RhdGVtZW50LCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBFeHBycyBIZWxwZXIgZXhwcmVzc2lvbnMgZm9yIENvZGVHZW4uCisgIC8vLworICBzdGF0aWMgT01QVGFyZ2V0VGVhbXNEaXN0cmlidXRlRGlyZWN0aXZlICoKKyAgQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICB1bnNpZ25lZCBDb2xsYXBzZWROdW0sIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgU3RtdCAqQXNzb2NpYXRlZFN0bXQsIGNvbnN0IEhlbHBlckV4cHJzICZFeHBycyk7CisKKyAgLy8vIENyZWF0ZXMgYW4gZW1wdHkgZGlyZWN0aXZlIHdpdGggdGhlIHBsYWNlIGZvciBcYSBOdW1DbGF1c2VzIGNsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBzdGF0aWMgT01QVGFyZ2V0VGVhbXNEaXN0cmlidXRlRGlyZWN0aXZlICoKKyAgQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywgdW5zaWduZWQgTnVtQ2xhdXNlcywgdW5zaWduZWQgQ29sbGFwc2VkTnVtLAorICAgICAgICAgICAgICBFbXB0eVNoZWxsKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gT01QVGFyZ2V0VGVhbXNEaXN0cmlidXRlRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKKy8vLyBUaGlzIHJlcHJlc2VudHMgJyNwcmFnbWEgb21wIHRhcmdldCB0ZWFtcyBkaXN0cmlidXRlIHBhcmFsbGVsIGZvcicgY29tYmluZWQKKy8vLyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHRhcmdldCB0ZWFtcyBkaXN0cmlidXRlIHBhcmFsbGVsIGZvciBwcml2YXRlKHgpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCB0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSBwYXJhbGxlbAorLy8vIGZvcicgaGFzIGNsYXVzZSAncHJpdmF0ZScgd2l0aCB0aGUgdmFyaWFibGVzICd4JworLy8vCitjbGFzcyBPTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVQYXJhbGxlbEZvckRpcmVjdGl2ZSBmaW5hbAorICAgIDogcHVibGljIE9NUExvb3BEaXJlY3RpdmUgeworICBmcmllbmQgY2xhc3MgQVNUU3RtdFJlYWRlcjsKKyAgLy8vIHRydWUgaWYgdGhlIGNvbnN0cnVjdCBoYXMgaW5uZXIgY2FuY2VsIGRpcmVjdGl2ZS4KKyAgYm9vbCBIYXNDYW5jZWwgPSBmYWxzZTsKKworICAvLy8gQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBPTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVQYXJhbGxlbEZvckRpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUExvb3BEaXJlY3RpdmUodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVQYXJhbGxlbEZvckRpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfdGFyZ2V0X3RlYW1zX2Rpc3RyaWJ1dGVfcGFyYWxsZWxfZm9yLCBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBFbmRMb2MsIENvbGxhcHNlZE51bSwgTnVtQ2xhdXNlcyksCisgICAgICAgIEhhc0NhbmNlbChmYWxzZSkge30KKworICAvLy8gQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yRGlyZWN0aXZlKHVuc2lnbmVkIENvbGxhcHNlZE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QTG9vcERpcmVjdGl2ZSgKKyAgICAgICAgICAgIHRoaXMsIE9NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yRGlyZWN0aXZlQ2xhc3MsCisgICAgICAgICAgICBPTVBEX3RhcmdldF90ZWFtc19kaXN0cmlidXRlX3BhcmFsbGVsX2ZvciwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIENvbGxhcHNlZE51bSwgTnVtQ2xhdXNlcyksCisgICAgICAgIEhhc0NhbmNlbChmYWxzZSkge30KKworICAvLy8gU2V0IGNhbmNlbCBzdGF0ZS4KKyAgdm9pZCBzZXRIYXNDYW5jZWwoYm9vbCBIYXMpIHsgSGFzQ2FuY2VsID0gSGFzOyB9CisKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZXMgZGlyZWN0aXZlIHdpdGggYSBsaXN0IG9mIFxhIENsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgTG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBDbGF1c2VzIExpc3Qgb2YgY2xhdXNlcy4KKyAgLy8vIFxwYXJhbSBBc3NvY2lhdGVkU3RtdCBTdGF0ZW1lbnQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIEV4cHJzIEhlbHBlciBleHByZXNzaW9ucyBmb3IgQ29kZUdlbi4KKyAgLy8vIFxwYXJhbSBIYXNDYW5jZWwgdHJ1ZSBpZiB0aGlzIGRpcmVjdGl2ZSBoYXMgaW5uZXIgY2FuY2VsIGRpcmVjdGl2ZS4KKyAgLy8vCisgIHN0YXRpYyBPTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVQYXJhbGxlbEZvckRpcmVjdGl2ZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgIFN0bXQgKkFzc29jaWF0ZWRTdG10LCBjb25zdCBIZWxwZXJFeHBycyAmRXhwcnMsIGJvb2wgSGFzQ2FuY2VsKTsKKworICAvLy8gQ3JlYXRlcyBhbiBlbXB0eSBkaXJlY3RpdmUgd2l0aCB0aGUgcGxhY2UgZm9yIFxhIE51bUNsYXVzZXMgY2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVQYXJhbGxlbEZvckRpcmVjdGl2ZSAqCisgIENyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE51bUNsYXVzZXMsIHVuc2lnbmVkIENvbGxhcHNlZE51bSwKKyAgICAgICAgICAgICAgRW1wdHlTaGVsbCk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGN1cnJlbnQgZGlyZWN0aXZlIGhhcyBpbm5lciBjYW5jZWwgZGlyZWN0aXZlLgorICBib29sIGhhc0NhbmNlbCgpIGNvbnN0IHsgcmV0dXJuIEhhc0NhbmNlbDsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PQorICAgICAgICAgICBPTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVQYXJhbGxlbEZvckRpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCB0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3Igc2ltZCcKKy8vLyBjb21iaW5lZCBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHRhcmdldCB0ZWFtcyBkaXN0cmlidXRlIHBhcmFsbGVsIGZvciBzaW1kIHByaXZhdGUoeCkKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHRhcmdldCB0ZWFtcyBkaXN0cmlidXRlIHBhcmFsbGVsCisvLy8gZm9yIHNpbWQnIGhhcyBjbGF1c2UgJ3ByaXZhdGUnIHdpdGggdGhlIHZhcmlhYmxlcyAneCcKKy8vLworY2xhc3MgT01QVGFyZ2V0VGVhbXNEaXN0cmlidXRlUGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlIGZpbmFsCisgICAgOiBwdWJsaWMgT01QTG9vcERpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworCisgIC8vLyBCdWlsZCBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIGVuZCBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSBraW5kLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIE9NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUExvb3BEaXJlY3RpdmUodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVQYXJhbGxlbEZvclNpbWREaXJlY3RpdmVDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPTVBEX3RhcmdldF90ZWFtc19kaXN0cmlidXRlX3BhcmFsbGVsX2Zvcl9zaW1kLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0TG9jLCBFbmRMb2MsIENvbGxhcHNlZE51bSwgTnVtQ2xhdXNlcykge30KKworICAvLy8gQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZSgKKyAgICAgIHVuc2lnbmVkIENvbGxhcHNlZE51bSwgdW5zaWduZWQgTnVtQ2xhdXNlcykKKyAgICAgIDogT01QTG9vcERpcmVjdGl2ZSgKKyAgICAgICAgICAgIHRoaXMsIE9NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgT01QRF90YXJnZXRfdGVhbXNfZGlzdHJpYnV0ZV9wYXJhbGxlbF9mb3Jfc2ltZCwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIENvbGxhcHNlZE51bSwgTnVtQ2xhdXNlcykge30KKworcHVibGljOgorICAvLy8gQ3JlYXRlcyBkaXJlY3RpdmUgd2l0aCBhIGxpc3Qgb2YgXGEgQ2xhdXNlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBMb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIGxvb3BzLgorICAvLy8gXHBhcmFtIENsYXVzZXMgTGlzdCBvZiBjbGF1c2VzLgorICAvLy8gXHBhcmFtIEFzc29jaWF0ZWRTdG10IFN0YXRlbWVudCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gRXhwcnMgSGVscGVyIGV4cHJlc3Npb25zIGZvciBDb2RlR2VuLgorICAvLy8KKyAgc3RhdGljIE9NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgIFN0bXQgKkFzc29jaWF0ZWRTdG10LCBjb25zdCBIZWxwZXJFeHBycyAmRXhwcnMpOworCisgIC8vLyBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZSBmb3IgXGEgTnVtQ2xhdXNlcyBjbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgc3RhdGljIE9NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZSAqCisgIENyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE51bUNsYXVzZXMsIHVuc2lnbmVkIENvbGxhcHNlZE51bSwKKyAgICAgICAgICAgICAgRW1wdHlTaGVsbCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09CisgICAgICAgICAgIE9NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZUNsYXNzOworICB9Cit9OworCisvLy8gVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCB0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSBzaW1kJyBjb21iaW5lZAorLy8vIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgdGFyZ2V0IHRlYW1zIGRpc3RyaWJ1dGUgc2ltZCBwcml2YXRlKHgpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCB0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSBzaW1kJworLy8vIGhhcyBjbGF1c2UgJ3ByaXZhdGUnIHdpdGggdGhlIHZhcmlhYmxlcyAneCcKKy8vLworY2xhc3MgT01QVGFyZ2V0VGVhbXNEaXN0cmlidXRlU2ltZERpcmVjdGl2ZSBmaW5hbCA6IHB1YmxpYyBPTVBMb29wRGlyZWN0aXZlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVFN0bXRSZWFkZXI7CisKKyAgLy8vIEJ1aWxkIGRpcmVjdGl2ZSB3aXRoIHRoZSBnaXZlbiBzdGFydCBhbmQgZW5kIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIGtpbmQuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgT01QVGFyZ2V0VGVhbXNEaXN0cmlidXRlU2ltZERpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUExvb3BEaXJlY3RpdmUodGhpcywgT01QVGFyZ2V0VGVhbXNEaXN0cmlidXRlU2ltZERpcmVjdGl2ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9NUERfdGFyZ2V0X3RlYW1zX2Rpc3RyaWJ1dGVfc2ltZCwgU3RhcnRMb2MsIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsYXBzZWROdW0sIE51bUNsYXVzZXMpIHt9CisKKyAgLy8vIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBleHBsaWNpdCBPTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVTaW1kRGlyZWN0aXZlKHVuc2lnbmVkIENvbGxhcHNlZE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBMb29wRGlyZWN0aXZlKHRoaXMsIE9NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZVNpbWREaXJlY3RpdmVDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPTVBEX3RhcmdldF90ZWFtc19kaXN0cmlidXRlX3NpbWQsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgQ29sbGFwc2VkTnVtLCBOdW1DbGF1c2VzKSB7fQorCitwdWJsaWM6CisgIC8vLyBDcmVhdGVzIGRpcmVjdGl2ZSB3aXRoIGEgbGlzdCBvZiBcYSBDbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCisgIC8vLyBccGFyYW0gQXNzb2NpYXRlZFN0bXQgU3RhdGVtZW50LCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBFeHBycyBIZWxwZXIgZXhwcmVzc2lvbnMgZm9yIENvZGVHZW4uCisgIC8vLworICBzdGF0aWMgT01QVGFyZ2V0VGVhbXNEaXN0cmlidXRlU2ltZERpcmVjdGl2ZSAqCisgIENyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgIFN0bXQgKkFzc29jaWF0ZWRTdG10LCBjb25zdCBIZWxwZXJFeHBycyAmRXhwcnMpOworCisgIC8vLyBDcmVhdGVzIGFuIGVtcHR5IGRpcmVjdGl2ZSB3aXRoIHRoZSBwbGFjZSBmb3IgXGEgTnVtQ2xhdXNlcyBjbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgc3RhdGljIE9NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZVNpbWREaXJlY3RpdmUgKgorICBDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBOdW1DbGF1c2VzLCB1bnNpZ25lZCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgIEVtcHR5U2hlbGwpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVTaW1kRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9TdG10VmlzaXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1N0bXRWaXNpdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmYTExMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9TdG10VmlzaXRvci5oCkBAIC0wLDAgKzEsMjM1IEBACisvLz09PS0gU3RtdFZpc2l0b3IuaCAtIFZpc2l0b3IgZm9yIFN0bXQgc3ViY2xhc3NlcyAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgU3RtdFZpc2l0b3IgYW5kIENvbnN0U3RtdFZpc2l0b3IgaW50ZXJmYWNlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX1NUTVRWSVNJVE9SX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfU1RNVFZJU0lUT1JfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHJDWFguaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXhwck9iakMuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXhwck9wZW5NUC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXRDWFguaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdE9iakMuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdE9wZW5NUC5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBtYWtlX3B0ciB7IHVzaW5nIHR5cGUgPSBUICo7IH07Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IG1ha2VfY29uc3RfcHRyIHsgdXNpbmcgdHlwZSA9IGNvbnN0IFQgKjsgfTsKKworLy8vIFN0bXRWaXNpdG9yQmFzZSAtIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNpbXBsZSB2aXNpdG9yIGZvciBTdG10CisvLy8gc3ViY2xhc3Nlcy4gU2luY2UgRXhwciBkZXJpdmVzIGZyb20gU3RtdCwgdGhpcyBhbHNvIGluY2x1ZGVzIHN1cHBvcnQgZm9yCisvLy8gdmlzaXRpbmcgRXhwcnMuCit0ZW1wbGF0ZTx0ZW1wbGF0ZSA8dHlwZW5hbWU+IGNsYXNzIFB0ciwgdHlwZW5hbWUgSW1wbENsYXNzLCB0eXBlbmFtZSBSZXRUeT12b2lkLAorICAgICAgICAgY2xhc3MuLi4gUGFyYW1UeXM+CitjbGFzcyBTdG10VmlzaXRvckJhc2UgeworcHVibGljOgorI2RlZmluZSBQVFIoQ0xBU1MpIHR5cGVuYW1lIFB0cjxDTEFTUz46OnR5cGUKKyNkZWZpbmUgRElTUEFUQ0goTkFNRSwgQ0xBU1MpIFwKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEltcGxDbGFzcyo+KHRoaXMpLT5WaXNpdCAjIyBOQU1FKCBcCisgICAgc3RhdGljX2Nhc3Q8UFRSKENMQVNTKT4oUyksIHN0ZDo6Zm9yd2FyZDxQYXJhbVR5cz4oUCkuLi4pCisKKyAgUmV0VHkgVmlzaXQoUFRSKFN0bXQpIFMsIFBhcmFtVHlzLi4uIFApIHsKKyAgICAvLyBJZiB3ZSBoYXZlIGEgYmluYXJ5IGV4cHIsIGRpc3BhdGNoIHRvIHRoZSBzdWJjb2RlIG9mIHRoZSBiaW5vcC4gIEEgc21hcnQKKyAgICAvLyBvcHRpbWl6ZXIgKGUuZy4gTExWTSkgd2lsbCBmb2xkIHRoaXMgY29tcGFyaXNvbiBpbnRvIHRoZSBzd2l0Y2ggc3RtdAorICAgIC8vIGJlbG93LgorICAgIGlmIChQVFIoQmluYXJ5T3BlcmF0b3IpIEJpbk9wID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KFMpKSB7CisgICAgICBzd2l0Y2ggKEJpbk9wLT5nZXRPcGNvZGUoKSkgeworICAgICAgY2FzZSBCT19QdHJNZW1EOiAgIERJU1BBVENIKEJpblB0ck1lbUQsICAgQmluYXJ5T3BlcmF0b3IpOworICAgICAgY2FzZSBCT19QdHJNZW1JOiAgIERJU1BBVENIKEJpblB0ck1lbUksICAgQmluYXJ5T3BlcmF0b3IpOworICAgICAgY2FzZSBCT19NdWw6ICAgICAgIERJU1BBVENIKEJpbk11bCwgICAgICAgQmluYXJ5T3BlcmF0b3IpOworICAgICAgY2FzZSBCT19EaXY6ICAgICAgIERJU1BBVENIKEJpbkRpdiwgICAgICAgQmluYXJ5T3BlcmF0b3IpOworICAgICAgY2FzZSBCT19SZW06ICAgICAgIERJU1BBVENIKEJpblJlbSwgICAgICAgQmluYXJ5T3BlcmF0b3IpOworICAgICAgY2FzZSBCT19BZGQ6ICAgICAgIERJU1BBVENIKEJpbkFkZCwgICAgICAgQmluYXJ5T3BlcmF0b3IpOworICAgICAgY2FzZSBCT19TdWI6ICAgICAgIERJU1BBVENIKEJpblN1YiwgICAgICAgQmluYXJ5T3BlcmF0b3IpOworICAgICAgY2FzZSBCT19TaGw6ICAgICAgIERJU1BBVENIKEJpblNobCwgICAgICAgQmluYXJ5T3BlcmF0b3IpOworICAgICAgY2FzZSBCT19TaHI6ICAgICAgIERJU1BBVENIKEJpblNociwgICAgICAgQmluYXJ5T3BlcmF0b3IpOworCisgICAgICBjYXNlIEJPX0xUOiAgICAgICAgRElTUEFUQ0goQmluTFQsICAgICAgICBCaW5hcnlPcGVyYXRvcik7CisgICAgICBjYXNlIEJPX0dUOiAgICAgICAgRElTUEFUQ0goQmluR1QsICAgICAgICBCaW5hcnlPcGVyYXRvcik7CisgICAgICBjYXNlIEJPX0xFOiAgICAgICAgRElTUEFUQ0goQmluTEUsICAgICAgICBCaW5hcnlPcGVyYXRvcik7CisgICAgICBjYXNlIEJPX0dFOiAgICAgICAgRElTUEFUQ0goQmluR0UsICAgICAgICBCaW5hcnlPcGVyYXRvcik7CisgICAgICBjYXNlIEJPX0VROiAgICAgICAgRElTUEFUQ0goQmluRVEsICAgICAgICBCaW5hcnlPcGVyYXRvcik7CisgICAgICBjYXNlIEJPX05FOiAgICAgICAgRElTUEFUQ0goQmluTkUsICAgICAgICBCaW5hcnlPcGVyYXRvcik7CisgICAgICBjYXNlIEJPX0NtcDogICAgICAgRElTUEFUQ0goQmluQ21wLCAgICAgICBCaW5hcnlPcGVyYXRvcik7CisKKyAgICAgIGNhc2UgQk9fQW5kOiAgICAgICBESVNQQVRDSChCaW5BbmQsICAgICAgIEJpbmFyeU9wZXJhdG9yKTsKKyAgICAgIGNhc2UgQk9fWG9yOiAgICAgICBESVNQQVRDSChCaW5Yb3IsICAgICAgIEJpbmFyeU9wZXJhdG9yKTsKKyAgICAgIGNhc2UgQk9fT3IgOiAgICAgICBESVNQQVRDSChCaW5PciwgICAgICAgIEJpbmFyeU9wZXJhdG9yKTsKKyAgICAgIGNhc2UgQk9fTEFuZDogICAgICBESVNQQVRDSChCaW5MQW5kLCAgICAgIEJpbmFyeU9wZXJhdG9yKTsKKyAgICAgIGNhc2UgQk9fTE9yIDogICAgICBESVNQQVRDSChCaW5MT3IsICAgICAgIEJpbmFyeU9wZXJhdG9yKTsKKyAgICAgIGNhc2UgQk9fQXNzaWduOiAgICBESVNQQVRDSChCaW5Bc3NpZ24sICAgIEJpbmFyeU9wZXJhdG9yKTsKKyAgICAgIGNhc2UgQk9fTXVsQXNzaWduOiBESVNQQVRDSChCaW5NdWxBc3NpZ24sIENvbXBvdW5kQXNzaWduT3BlcmF0b3IpOworICAgICAgY2FzZSBCT19EaXZBc3NpZ246IERJU1BBVENIKEJpbkRpdkFzc2lnbiwgQ29tcG91bmRBc3NpZ25PcGVyYXRvcik7CisgICAgICBjYXNlIEJPX1JlbUFzc2lnbjogRElTUEFUQ0goQmluUmVtQXNzaWduLCBDb21wb3VuZEFzc2lnbk9wZXJhdG9yKTsKKyAgICAgIGNhc2UgQk9fQWRkQXNzaWduOiBESVNQQVRDSChCaW5BZGRBc3NpZ24sIENvbXBvdW5kQXNzaWduT3BlcmF0b3IpOworICAgICAgY2FzZSBCT19TdWJBc3NpZ246IERJU1BBVENIKEJpblN1YkFzc2lnbiwgQ29tcG91bmRBc3NpZ25PcGVyYXRvcik7CisgICAgICBjYXNlIEJPX1NobEFzc2lnbjogRElTUEFUQ0goQmluU2hsQXNzaWduLCBDb21wb3VuZEFzc2lnbk9wZXJhdG9yKTsKKyAgICAgIGNhc2UgQk9fU2hyQXNzaWduOiBESVNQQVRDSChCaW5TaHJBc3NpZ24sIENvbXBvdW5kQXNzaWduT3BlcmF0b3IpOworICAgICAgY2FzZSBCT19BbmRBc3NpZ246IERJU1BBVENIKEJpbkFuZEFzc2lnbiwgQ29tcG91bmRBc3NpZ25PcGVyYXRvcik7CisgICAgICBjYXNlIEJPX09yQXNzaWduOiAgRElTUEFUQ0goQmluT3JBc3NpZ24sICBDb21wb3VuZEFzc2lnbk9wZXJhdG9yKTsKKyAgICAgIGNhc2UgQk9fWG9yQXNzaWduOiBESVNQQVRDSChCaW5Yb3JBc3NpZ24sIENvbXBvdW5kQXNzaWduT3BlcmF0b3IpOworICAgICAgY2FzZSBCT19Db21tYTogICAgIERJU1BBVENIKEJpbkNvbW1hLCAgICAgQmluYXJ5T3BlcmF0b3IpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoUFRSKFVuYXJ5T3BlcmF0b3IpIFVuT3AgPSBkeW5fY2FzdDxVbmFyeU9wZXJhdG9yPihTKSkgeworICAgICAgc3dpdGNoIChVbk9wLT5nZXRPcGNvZGUoKSkgeworICAgICAgY2FzZSBVT19Qb3N0SW5jOiAgIERJU1BBVENIKFVuYXJ5UG9zdEluYywgICBVbmFyeU9wZXJhdG9yKTsKKyAgICAgIGNhc2UgVU9fUG9zdERlYzogICBESVNQQVRDSChVbmFyeVBvc3REZWMsICAgVW5hcnlPcGVyYXRvcik7CisgICAgICBjYXNlIFVPX1ByZUluYzogICAgRElTUEFUQ0goVW5hcnlQcmVJbmMsICAgIFVuYXJ5T3BlcmF0b3IpOworICAgICAgY2FzZSBVT19QcmVEZWM6ICAgIERJU1BBVENIKFVuYXJ5UHJlRGVjLCAgICBVbmFyeU9wZXJhdG9yKTsKKyAgICAgIGNhc2UgVU9fQWRkck9mOiAgICBESVNQQVRDSChVbmFyeUFkZHJPZiwgICAgVW5hcnlPcGVyYXRvcik7CisgICAgICBjYXNlIFVPX0RlcmVmOiAgICAgRElTUEFUQ0goVW5hcnlEZXJlZiwgICAgIFVuYXJ5T3BlcmF0b3IpOworICAgICAgY2FzZSBVT19QbHVzOiAgICAgIERJU1BBVENIKFVuYXJ5UGx1cywgICAgICBVbmFyeU9wZXJhdG9yKTsKKyAgICAgIGNhc2UgVU9fTWludXM6ICAgICBESVNQQVRDSChVbmFyeU1pbnVzLCAgICAgVW5hcnlPcGVyYXRvcik7CisgICAgICBjYXNlIFVPX05vdDogICAgICAgRElTUEFUQ0goVW5hcnlOb3QsICAgICAgIFVuYXJ5T3BlcmF0b3IpOworICAgICAgY2FzZSBVT19MTm90OiAgICAgIERJU1BBVENIKFVuYXJ5TE5vdCwgICAgICBVbmFyeU9wZXJhdG9yKTsKKyAgICAgIGNhc2UgVU9fUmVhbDogICAgICBESVNQQVRDSChVbmFyeVJlYWwsICAgICAgVW5hcnlPcGVyYXRvcik7CisgICAgICBjYXNlIFVPX0ltYWc6ICAgICAgRElTUEFUQ0goVW5hcnlJbWFnLCAgICAgIFVuYXJ5T3BlcmF0b3IpOworICAgICAgY2FzZSBVT19FeHRlbnNpb246IERJU1BBVENIKFVuYXJ5RXh0ZW5zaW9uLCBVbmFyeU9wZXJhdG9yKTsKKyAgICAgIGNhc2UgVU9fQ29hd2FpdDogICBESVNQQVRDSChVbmFyeUNvYXdhaXQsICAgVW5hcnlPcGVyYXRvcik7CisgICAgICB9CisgICAgfQorCisgICAgLy8gVG9wIHN3aXRjaCBzdG10OiBkaXNwYXRjaCB0byBWaXNpdEZvb1N0bXQgZm9yIGVhY2ggRm9vU3RtdC4KKyAgICBzd2l0Y2ggKFMtPmdldFN0bXRDbGFzcygpKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzdG10IGtpbmQhIik7CisjZGVmaW5lIEFCU1RSQUNUX1NUTVQoU1RNVCkKKyNkZWZpbmUgU1RNVChDTEFTUywgUEFSRU5UKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIFN0bXQ6OkNMQVNTICMjIENsYXNzOiBESVNQQVRDSChDTEFTUywgQ0xBU1MpOworI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10Tm9kZXMuaW5jIgorICAgIH0KKyAgfQorCisgIC8vIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBjaG9vc2VzIG5vdCB0byBpbXBsZW1lbnQgYSBjZXJ0YWluIHZpc2l0IG1ldGhvZCwgZmFsbAorICAvLyBiYWNrIG9uIFZpc2l0RXhwciBvciB3aGF0ZXZlciBlbHNlIGlzIHRoZSBzdXBlcmNsYXNzLgorI2RlZmluZSBTVE1UKENMQVNTLCBQQVJFTlQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFJldFR5IFZpc2l0ICMjIENMQVNTKFBUUihDTEFTUykgUywgUGFyYW1UeXMuLi4gUCkgeyBESVNQQVRDSChQQVJFTlQsIFBBUkVOVCk7IH0KKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdE5vZGVzLmluYyIKKworICAvLyBJZiB0aGUgaW1wbGVtZW50YXRpb24gZG9lc24ndCBpbXBsZW1lbnQgYmluYXJ5IG9wZXJhdG9yIG1ldGhvZHMsIGZhbGwgYmFjaworICAvLyBvbiBWaXNpdEJpbmFyeU9wZXJhdG9yLgorI2RlZmluZSBCSU5PUF9GQUxMQkFDSyhOQU1FKSBcCisgIFJldFR5IFZpc2l0QmluICMjIE5BTUUoUFRSKEJpbmFyeU9wZXJhdG9yKSBTLCBQYXJhbVR5cy4uLiBQKSB7IFwKKyAgICBESVNQQVRDSChCaW5hcnlPcGVyYXRvciwgQmluYXJ5T3BlcmF0b3IpOyBcCisgIH0KKyAgQklOT1BfRkFMTEJBQ0soUHRyTWVtRCkgICAgICAgICAgICAgICAgICAgIEJJTk9QX0ZBTExCQUNLKFB0ck1lbUkpCisgIEJJTk9QX0ZBTExCQUNLKE11bCkgICBCSU5PUF9GQUxMQkFDSyhEaXYpICBCSU5PUF9GQUxMQkFDSyhSZW0pCisgIEJJTk9QX0ZBTExCQUNLKEFkZCkgICBCSU5PUF9GQUxMQkFDSyhTdWIpICBCSU5PUF9GQUxMQkFDSyhTaGwpCisgIEJJTk9QX0ZBTExCQUNLKFNocikKKworICBCSU5PUF9GQUxMQkFDSyhMVCkgICAgQklOT1BfRkFMTEJBQ0soR1QpICAgQklOT1BfRkFMTEJBQ0soTEUpCisgIEJJTk9QX0ZBTExCQUNLKEdFKSAgICBCSU5PUF9GQUxMQkFDSyhFUSkgICBCSU5PUF9GQUxMQkFDSyhORSkKKyAgQklOT1BfRkFMTEJBQ0soQ21wKQorCisgIEJJTk9QX0ZBTExCQUNLKEFuZCkgICBCSU5PUF9GQUxMQkFDSyhYb3IpICBCSU5PUF9GQUxMQkFDSyhPcikKKyAgQklOT1BfRkFMTEJBQ0soTEFuZCkgIEJJTk9QX0ZBTExCQUNLKExPcikKKworICBCSU5PUF9GQUxMQkFDSyhBc3NpZ24pCisgIEJJTk9QX0ZBTExCQUNLKENvbW1hKQorI3VuZGVmIEJJTk9QX0ZBTExCQUNLCisKKyAgLy8gSWYgdGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgaW1wbGVtZW50IGNvbXBvdW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IKKyAgLy8gbWV0aG9kcywgZmFsbCBiYWNrIG9uIFZpc2l0Q29tcG91bmRBc3NpZ25PcGVyYXRvci4KKyNkZWZpbmUgQ0FPX0ZBTExCQUNLKE5BTUUpIFwKKyAgUmV0VHkgVmlzaXRCaW4gIyMgTkFNRShQVFIoQ29tcG91bmRBc3NpZ25PcGVyYXRvcikgUywgUGFyYW1UeXMuLi4gUCkgeyBcCisgICAgRElTUEFUQ0goQ29tcG91bmRBc3NpZ25PcGVyYXRvciwgQ29tcG91bmRBc3NpZ25PcGVyYXRvcik7IFwKKyAgfQorICBDQU9fRkFMTEJBQ0soTXVsQXNzaWduKSBDQU9fRkFMTEJBQ0soRGl2QXNzaWduKSBDQU9fRkFMTEJBQ0soUmVtQXNzaWduKQorICBDQU9fRkFMTEJBQ0soQWRkQXNzaWduKSBDQU9fRkFMTEJBQ0soU3ViQXNzaWduKSBDQU9fRkFMTEJBQ0soU2hsQXNzaWduKQorICBDQU9fRkFMTEJBQ0soU2hyQXNzaWduKSBDQU9fRkFMTEJBQ0soQW5kQXNzaWduKSBDQU9fRkFMTEJBQ0soT3JBc3NpZ24pCisgIENBT19GQUxMQkFDSyhYb3JBc3NpZ24pCisjdW5kZWYgQ0FPX0ZBTExCQUNLCisKKyAgLy8gSWYgdGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgaW1wbGVtZW50IHVuYXJ5IG9wZXJhdG9yIG1ldGhvZHMsIGZhbGwgYmFjaworICAvLyBvbiBWaXNpdFVuYXJ5T3BlcmF0b3IuCisjZGVmaW5lIFVOQVJZT1BfRkFMTEJBQ0soTkFNRSkgXAorICBSZXRUeSBWaXNpdFVuYXJ5ICMjIE5BTUUoUFRSKFVuYXJ5T3BlcmF0b3IpIFMsIFBhcmFtVHlzLi4uIFApIHsgXAorICAgIERJU1BBVENIKFVuYXJ5T3BlcmF0b3IsIFVuYXJ5T3BlcmF0b3IpOyAgICBcCisgIH0KKyAgVU5BUllPUF9GQUxMQkFDSyhQb3N0SW5jKSAgIFVOQVJZT1BfRkFMTEJBQ0soUG9zdERlYykKKyAgVU5BUllPUF9GQUxMQkFDSyhQcmVJbmMpICAgIFVOQVJZT1BfRkFMTEJBQ0soUHJlRGVjKQorICBVTkFSWU9QX0ZBTExCQUNLKEFkZHJPZikgICAgVU5BUllPUF9GQUxMQkFDSyhEZXJlZikKKworICBVTkFSWU9QX0ZBTExCQUNLKFBsdXMpICAgICAgVU5BUllPUF9GQUxMQkFDSyhNaW51cykKKyAgVU5BUllPUF9GQUxMQkFDSyhOb3QpICAgICAgIFVOQVJZT1BfRkFMTEJBQ0soTE5vdCkKKyAgVU5BUllPUF9GQUxMQkFDSyhSZWFsKSAgICAgIFVOQVJZT1BfRkFMTEJBQ0soSW1hZykKKyAgVU5BUllPUF9GQUxMQkFDSyhFeHRlbnNpb24pIFVOQVJZT1BfRkFMTEJBQ0soQ29hd2FpdCkKKyN1bmRlZiBVTkFSWU9QX0ZBTExCQUNLCisKKyAgLy8gQmFzZSBjYXNlLCBpZ25vcmUgaXQuIDopCisgIFJldFR5IFZpc2l0U3RtdChQVFIoU3RtdCkgTm9kZSwgUGFyYW1UeXMuLi4gUCkgeyByZXR1cm4gUmV0VHkoKTsgfQorCisjdW5kZWYgUFRSCisjdW5kZWYgRElTUEFUQ0gKK307CisKKy8vLyBTdG10VmlzaXRvciAtIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNpbXBsZSB2aXNpdG9yIGZvciBTdG10IHN1YmNsYXNzZXMuCisvLy8gU2luY2UgRXhwciBkZXJpdmVzIGZyb20gU3RtdCwgdGhpcyBhbHNvIGluY2x1ZGVzIHN1cHBvcnQgZm9yIHZpc2l0aW5nIEV4cHJzLgorLy8vCisvLy8gVGhpcyBjbGFzcyBkb2VzIG5vdCBwcmVzZXJ2ZSBjb25zdG5lc3Mgb2YgU3RtdCBwb2ludGVycyAoc2VlIGFsc28KKy8vLyBDb25zdFN0bXRWaXNpdG9yKS4KK3RlbXBsYXRlPHR5cGVuYW1lIEltcGxDbGFzcywgdHlwZW5hbWUgUmV0VHk9dm9pZCwgdHlwZW5hbWUuLi4gUGFyYW1UeXM+CitjbGFzcyBTdG10VmlzaXRvcgorIDogcHVibGljIFN0bXRWaXNpdG9yQmFzZTxtYWtlX3B0ciwgSW1wbENsYXNzLCBSZXRUeSwgUGFyYW1UeXMuLi4+IHt9OworCisvLy8gQ29uc3RTdG10VmlzaXRvciAtIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNpbXBsZSB2aXNpdG9yIGZvciBTdG10CisvLy8gc3ViY2xhc3Nlcy4gU2luY2UgRXhwciBkZXJpdmVzIGZyb20gU3RtdCwgdGhpcyBhbHNvIGluY2x1ZGVzIHN1cHBvcnQgZm9yCisvLy8gdmlzaXRpbmcgRXhwcnMuCisvLy8KKy8vLyBUaGlzIGNsYXNzIHByZXNlcnZlcyBjb25zdG5lc3Mgb2YgU3RtdCBwb2ludGVycyAoc2VlIGFsc28gU3RtdFZpc2l0b3IpLgordGVtcGxhdGU8dHlwZW5hbWUgSW1wbENsYXNzLCB0eXBlbmFtZSBSZXRUeT12b2lkLCB0eXBlbmFtZS4uLiBQYXJhbVR5cz4KK2NsYXNzIENvbnN0U3RtdFZpc2l0b3IKKyA6IHB1YmxpYyBTdG10VmlzaXRvckJhc2U8bWFrZV9jb25zdF9wdHIsIEltcGxDbGFzcywgUmV0VHksIFBhcmFtVHlzLi4uPiB7fTsKKworLy8vIFxicmllZiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzaW1wbGUgdmlzaXRvciBmb3IgT01QQ2xhdXNlCisvLy8gc3ViY2xhc3Nlcy4KK3RlbXBsYXRlPGNsYXNzIEltcGxDbGFzcywgdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBQdHIsIHR5cGVuYW1lIFJldFR5PgorY2xhc3MgT01QQ2xhdXNlVmlzaXRvckJhc2UgeworcHVibGljOgorI2RlZmluZSBQVFIoQ0xBU1MpIHR5cGVuYW1lIFB0cjxDTEFTUz46OnR5cGUKKyNkZWZpbmUgRElTUEFUQ0goQ0xBU1MpIFwKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEltcGxDbGFzcyo+KHRoaXMpLT5WaXNpdCMjQ0xBU1Moc3RhdGljX2Nhc3Q8UFRSKENMQVNTKT4oUykpCisKKyNkZWZpbmUgT1BFTk1QX0NMQVVTRShOYW1lLCBDbGFzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFJldFR5IFZpc2l0ICMjIENsYXNzIChQVFIoQ2xhc3MpIFMpIHsgRElTUEFUQ0goQ2xhc3MpOyB9CisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3Blbk1QS2luZHMuZGVmIgorCisgIFJldFR5IFZpc2l0KFBUUihPTVBDbGF1c2UpIFMpIHsKKyAgICAvLyBUb3Agc3dpdGNoIGNsYXVzZTogdmlzaXQgZWFjaCBPTVBDbGF1c2UuCisgICAgc3dpdGNoIChTLT5nZXRDbGF1c2VLaW5kKCkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGNsYXVzZSBraW5kISIpOworI2RlZmluZSBPUEVOTVBfQ0xBVVNFKE5hbWUsIENsYXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIE9NUENfICMjIE5hbWUgOiByZXR1cm4gVmlzaXQgIyMgQ2xhc3Moc3RhdGljX2Nhc3Q8UFRSKENsYXNzKT4oUykpOworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZW5NUEtpbmRzLmRlZiIKKyAgICB9CisgIH0KKyAgLy8gQmFzZSBjYXNlLCBpZ25vcmUgaXQuIDopCisgIFJldFR5IFZpc2l0T01QQ2xhdXNlKFBUUihPTVBDbGF1c2UpIE5vZGUpIHsgcmV0dXJuIFJldFR5KCk7IH0KKyN1bmRlZiBQVFIKKyN1bmRlZiBESVNQQVRDSAorfTsKKwordGVtcGxhdGU8Y2xhc3MgSW1wbENsYXNzLCB0eXBlbmFtZSBSZXRUeSA9IHZvaWQ+CitjbGFzcyBPTVBDbGF1c2VWaXNpdG9yIDoKKyAgICAgIHB1YmxpYyBPTVBDbGF1c2VWaXNpdG9yQmFzZSA8SW1wbENsYXNzLCBtYWtlX3B0ciwgUmV0VHk+IHt9OwordGVtcGxhdGU8Y2xhc3MgSW1wbENsYXNzLCB0eXBlbmFtZSBSZXRUeSA9IHZvaWQ+CitjbGFzcyBDb25zdE9NUENsYXVzZVZpc2l0b3IgOgorICAgICAgcHVibGljIE9NUENsYXVzZVZpc2l0b3JCYXNlIDxJbXBsQ2xhc3MsIG1ha2VfY29uc3RfcHRyLCBSZXRUeT4ge307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9TVE1UVklTSVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvVGVtcGxhdGVCYXNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvVGVtcGxhdGVCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUwMjUwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9UZW1wbGF0ZUJhc2UuaApAQCAtMCwwICsxLDY5NSBAQAorLy89PT0tIFRlbXBsYXRlQmFzZS5oIC0gQ29yZSBjbGFzc2VzIGZvciBDKysgdGVtcGxhdGVzIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIHByb3ZpZGVzIGRlZmluaXRpb25zIHdoaWNoIGFyZSBjb21tb24gZm9yIGFsbCBraW5kcyBvZgorLy8gIHRlbXBsYXRlIHJlcHJlc2VudGF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfVEVNUExBVEVCQVNFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfVEVNUExBVEVCQVNFX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9OZXN0ZWROYW1lU3BlY2lmaWVyLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1RlbXBsYXRlTmFtZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BUFNJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RyYWlsaW5nT2JqZWN0cy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZvbGRpbmdTZXROb2RlSUQ7CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQVNUQ29udGV4dDsKK2NsYXNzIERpYWdub3N0aWNCdWlsZGVyOworY2xhc3MgRXhwcjsKK3N0cnVjdCBQcmludGluZ1BvbGljeTsKK2NsYXNzIFR5cGVTb3VyY2VJbmZvOworY2xhc3MgVmFsdWVEZWNsOworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSB0ZW1wbGF0ZSBhcmd1bWVudC4KK2NsYXNzIFRlbXBsYXRlQXJndW1lbnQgeworcHVibGljOgorICAvLy8gXGJyaWVmIFRoZSBraW5kIG9mIHRlbXBsYXRlIGFyZ3VtZW50IHdlJ3JlIHN0b3JpbmcuCisgIGVudW0gQXJnS2luZCB7CisgICAgLy8vIFxicmllZiBSZXByZXNlbnRzIGFuIGVtcHR5IHRlbXBsYXRlIGFyZ3VtZW50LCBlLmcuLCBvbmUgdGhhdCBoYXMgbm90CisgICAgLy8vIGJlZW4gZGVkdWNlZC4KKyAgICBOdWxsID0gMCwKKworICAgIC8vLyBUaGUgdGVtcGxhdGUgYXJndW1lbnQgaXMgYSB0eXBlLgorICAgIFR5cGUsCisKKyAgICAvLy8gVGhlIHRlbXBsYXRlIGFyZ3VtZW50IGlzIGEgZGVjbGFyYXRpb24gdGhhdCB3YXMgcHJvdmlkZWQgZm9yIGEgcG9pbnRlciwKKyAgICAvLy8gcmVmZXJlbmNlLCBvciBwb2ludGVyIHRvIG1lbWJlciBub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCisgICAgRGVjbGFyYXRpb24sCisKKyAgICAvLy8gVGhlIHRlbXBsYXRlIGFyZ3VtZW50IGlzIGEgbnVsbCBwb2ludGVyIG9yIG51bGwgcG9pbnRlciB0byBtZW1iZXIgdGhhdAorICAgIC8vLyB3YXMgcHJvdmlkZWQgZm9yIGEgbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVyLgorICAgIE51bGxQdHIsCisKKyAgICAvLy8gVGhlIHRlbXBsYXRlIGFyZ3VtZW50IGlzIGFuIGludGVncmFsIHZhbHVlIHN0b3JlZCBpbiBhbiBsbHZtOjpBUFNJbnQKKyAgICAvLy8gdGhhdCB3YXMgcHJvdmlkZWQgZm9yIGFuIGludGVncmFsIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlci4KKyAgICBJbnRlZ3JhbCwKKworICAgIC8vLyBUaGUgdGVtcGxhdGUgYXJndW1lbnQgaXMgYSB0ZW1wbGF0ZSBuYW1lIHRoYXQgd2FzIHByb3ZpZGVkIGZvciBhCisgICAgLy8vIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlci4KKyAgICBUZW1wbGF0ZSwKKworICAgIC8vLyBUaGUgdGVtcGxhdGUgYXJndW1lbnQgaXMgYSBwYWNrIGV4cGFuc2lvbiBvZiBhIHRlbXBsYXRlIG5hbWUgdGhhdCB3YXMKKyAgICAvLy8gcHJvdmlkZWQgZm9yIGEgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyLgorICAgIFRlbXBsYXRlRXhwYW5zaW9uLAorCisgICAgLy8vIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBpcyBhbiBleHByZXNzaW9uLCBhbmQgd2UndmUgbm90IHJlc29sdmVkIGl0IHRvIG9uZQorICAgIC8vLyBvZiB0aGUgb3RoZXIgZm9ybXMgeWV0LCBlaXRoZXIgYmVjYXVzZSBpdCdzIGRlcGVuZGVudCBvciBiZWNhdXNlIHdlJ3JlCisgICAgLy8vIHJlcHJlc2VudGluZyBhIG5vbi1jYW5vbmljYWwgdGVtcGxhdGUgYXJndW1lbnQgKGZvciBpbnN0YW5jZSwgaW4gYQorICAgIC8vLyBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZSkuIEFsc28gdXNlZCB0byByZXByZXNlbnQgYSBub24tZGVwZW5kZW50CisgICAgLy8vIF9fdXVpZG9mIGV4cHJlc3Npb24gKGEgTWljcm9zb2Z0IGV4dGVuc2lvbikuCisgICAgRXhwcmVzc2lvbiwKKworICAgIC8vLyBUaGUgdGVtcGxhdGUgYXJndW1lbnQgaXMgYWN0dWFsbHkgYSBwYXJhbWV0ZXIgcGFjay4gQXJndW1lbnRzIGFyZSBzdG9yZWQKKyAgICAvLy8gaW4gdGhlIEFyZ3Mgc3RydWN0LgorICAgIFBhY2sKKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBUaGUga2luZCBvZiB0ZW1wbGF0ZSBhcmd1bWVudCB3ZSdyZSBzdG9yaW5nLgorCisgIHN0cnVjdCBEQSB7CisgICAgdW5zaWduZWQgS2luZDsKKyAgICB2b2lkICpRVDsKKyAgICBWYWx1ZURlY2wgKkQ7CisgIH07CisgIHN0cnVjdCBJIHsKKyAgICB1bnNpZ25lZCBLaW5kOworICAgIC8vIFdlIHN0b3JlIGEgZGVjb21wb3NlZCBBUFNJbnQgd2l0aCB0aGUgZGF0YSBhbGxvY2F0ZWQgYnkgQVNUQ29udGV4dCBpZgorICAgIC8vIEJpdFdpZHRoID4gNjQuIFRoZSBtZW1vcnkgbWF5IGJlIHNoYXJlZCBiZXR3ZWVuIG11bHRpcGxlCisgICAgLy8gVGVtcGxhdGVBcmd1bWVudCBpbnN0YW5jZXMuCisgICAgdW5zaWduZWQgQml0V2lkdGggOiAzMTsKKyAgICB1bnNpZ25lZCBJc1Vuc2lnbmVkIDogMTsKKyAgICB1bmlvbiB7CisgICAgICAvLy8gVXNlZCB0byBzdG9yZSB0aGUgPD0gNjQgYml0cyBpbnRlZ2VyIHZhbHVlLgorICAgICAgdWludDY0X3QgVkFMOworCisgICAgICAvLy8gVXNlZCB0byBzdG9yZSB0aGUgPjY0IGJpdHMgaW50ZWdlciB2YWx1ZS4KKyAgICAgIGNvbnN0IHVpbnQ2NF90ICpwVmFsOworICAgIH07CisgICAgdm9pZCAqVHlwZTsKKyAgfTsKKyAgc3RydWN0IEEgeworICAgIHVuc2lnbmVkIEtpbmQ7CisgICAgdW5zaWduZWQgTnVtQXJnczsKKyAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpBcmdzOworICB9OworICBzdHJ1Y3QgVEEgeworICAgIHVuc2lnbmVkIEtpbmQ7CisgICAgdW5zaWduZWQgTnVtRXhwYW5zaW9uczsKKyAgICB2b2lkICpOYW1lOworICB9OworICBzdHJ1Y3QgVFYgeworICAgIHVuc2lnbmVkIEtpbmQ7CisgICAgdWludHB0cl90IFY7CisgIH07CisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgREEgRGVjbEFyZzsKKyAgICBzdHJ1Y3QgSSBJbnRlZ2VyOworICAgIHN0cnVjdCBBIEFyZ3M7CisgICAgc3RydWN0IFRBIFRlbXBsYXRlQXJnOworICAgIHN0cnVjdCBUViBUeXBlT3JWYWx1ZTsKKyAgfTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBlbXB0eSwgaW52YWxpZCB0ZW1wbGF0ZSBhcmd1bWVudC4KKyAgY29uc3RleHByIFRlbXBsYXRlQXJndW1lbnQoKSA6IFR5cGVPclZhbHVlKHtOdWxsLCAwfSkge30KKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIHRlbXBsYXRlIHR5cGUgYXJndW1lbnQuCisgIFRlbXBsYXRlQXJndW1lbnQoUXVhbFR5cGUgVCwgYm9vbCBpc051bGxQdHIgPSBmYWxzZSkgeworICAgIFR5cGVPclZhbHVlLktpbmQgPSBpc051bGxQdHIgPyBOdWxsUHRyIDogVHlwZTsKKyAgICBUeXBlT3JWYWx1ZS5WID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFQuZ2V0QXNPcGFxdWVQdHIoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIHRlbXBsYXRlIGFyZ3VtZW50IHRoYXQgcmVmZXJzIHRvIGEKKyAgLy8vIGRlY2xhcmF0aW9uLCB3aGljaCBpcyBlaXRoZXIgYW4gZXh0ZXJuYWwgZGVjbGFyYXRpb24gb3IgYQorICAvLy8gdGVtcGxhdGUgZGVjbGFyYXRpb24uCisgIFRlbXBsYXRlQXJndW1lbnQoVmFsdWVEZWNsICpELCBRdWFsVHlwZSBRVCkgeworICAgIGFzc2VydChEICYmICJFeHBlY3RlZCBkZWNsIik7CisgICAgRGVjbEFyZy5LaW5kID0gRGVjbGFyYXRpb247CisgICAgRGVjbEFyZy5RVCA9IFFULmdldEFzT3BhcXVlUHRyKCk7CisgICAgRGVjbEFyZy5EID0gRDsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIGludGVncmFsIGNvbnN0YW50IHRlbXBsYXRlIGFyZ3VtZW50LiBUaGUgbWVtb3J5IHRvCisgIC8vLyBzdG9yZSB0aGUgdmFsdWUgaXMgYWxsb2NhdGVkIHdpdGggQ3R4LgorICBUZW1wbGF0ZUFyZ3VtZW50KEFTVENvbnRleHQgJkN0eCwgY29uc3QgbGx2bTo6QVBTSW50ICZWYWx1ZSwgUXVhbFR5cGUgVHlwZSk7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYW4gaW50ZWdyYWwgY29uc3RhbnQgdGVtcGxhdGUgYXJndW1lbnQgd2l0aCB0aGUgc2FtZQorICAvLy8gdmFsdWUgYXMgT3RoZXIgYnV0IGEgZGlmZmVyZW50IHR5cGUuCisgIFRlbXBsYXRlQXJndW1lbnQoY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmT3RoZXIsIFF1YWxUeXBlIFR5cGUpIHsKKyAgICBJbnRlZ2VyID0gT3RoZXIuSW50ZWdlcjsKKyAgICBJbnRlZ2VyLlR5cGUgPSBUeXBlLmdldEFzT3BhcXVlUHRyKCk7CisgIH0KKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIHRlbXBsYXRlIGFyZ3VtZW50IHRoYXQgaXMgYSB0ZW1wbGF0ZS4KKyAgLy8vCisgIC8vLyBUaGlzIGZvcm0gb2YgdGVtcGxhdGUgYXJndW1lbnQgaXMgZ2VuZXJhbGx5IHVzZWQgZm9yIHRlbXBsYXRlIHRlbXBsYXRlCisgIC8vLyBwYXJhbWV0ZXJzLiBIb3dldmVyLCB0aGUgdGVtcGxhdGUgbmFtZSBjb3VsZCBiZSBhIGRlcGVuZGVudCB0ZW1wbGF0ZQorICAvLy8gbmFtZSB0aGF0IGVuZHMgdXAgYmVpbmcgaW5zdGFudGlhdGVkIHRvIGEgZnVuY3Rpb24gdGVtcGxhdGUgd2hvc2UgYWRkcmVzcworICAvLy8gaXMgdGFrZW4uCisgIC8vLworICAvLy8gXHBhcmFtIE5hbWUgVGhlIHRlbXBsYXRlIG5hbWUuCisgIFRlbXBsYXRlQXJndW1lbnQoVGVtcGxhdGVOYW1lIE5hbWUpIHsKKyAgICBUZW1wbGF0ZUFyZy5LaW5kID0gVGVtcGxhdGU7CisgICAgVGVtcGxhdGVBcmcuTmFtZSA9IE5hbWUuZ2V0QXNWb2lkUG9pbnRlcigpOworICAgIFRlbXBsYXRlQXJnLk51bUV4cGFuc2lvbnMgPSAwOworICB9CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSB0ZW1wbGF0ZSBhcmd1bWVudCB0aGF0IGlzIGEgdGVtcGxhdGUgcGFjayBleHBhbnNpb24uCisgIC8vLworICAvLy8gVGhpcyBmb3JtIG9mIHRlbXBsYXRlIGFyZ3VtZW50IGlzIGdlbmVyYWxseSB1c2VkIGZvciB0ZW1wbGF0ZSB0ZW1wbGF0ZQorICAvLy8gcGFyYW1ldGVycy4gSG93ZXZlciwgdGhlIHRlbXBsYXRlIG5hbWUgY291bGQgYmUgYSBkZXBlbmRlbnQgdGVtcGxhdGUKKyAgLy8vIG5hbWUgdGhhdCBlbmRzIHVwIGJlaW5nIGluc3RhbnRpYXRlZCB0byBhIGZ1bmN0aW9uIHRlbXBsYXRlIHdob3NlIGFkZHJlc3MKKyAgLy8vIGlzIHRha2VuLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOYW1lIFRoZSB0ZW1wbGF0ZSBuYW1lLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOdW1FeHBhbnNpb25zIFRoZSBudW1iZXIgb2YgZXhwYW5zaW9ucyB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkIGJ5CisgIC8vLyBpbnN0YW50aWF0aW5nCisgIFRlbXBsYXRlQXJndW1lbnQoVGVtcGxhdGVOYW1lIE5hbWUsIE9wdGlvbmFsPHVuc2lnbmVkPiBOdW1FeHBhbnNpb25zKSB7CisgICAgVGVtcGxhdGVBcmcuS2luZCA9IFRlbXBsYXRlRXhwYW5zaW9uOworICAgIFRlbXBsYXRlQXJnLk5hbWUgPSBOYW1lLmdldEFzVm9pZFBvaW50ZXIoKTsKKyAgICBpZiAoTnVtRXhwYW5zaW9ucykKKyAgICAgIFRlbXBsYXRlQXJnLk51bUV4cGFuc2lvbnMgPSAqTnVtRXhwYW5zaW9ucyArIDE7CisgICAgZWxzZQorICAgICAgVGVtcGxhdGVBcmcuTnVtRXhwYW5zaW9ucyA9IDA7CisgIH0KKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIHRlbXBsYXRlIGFyZ3VtZW50IHRoYXQgaXMgYW4gZXhwcmVzc2lvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGZvcm0gb2YgdGVtcGxhdGUgYXJndW1lbnQgb25seSBvY2N1cnMgaW4gdGVtcGxhdGUgYXJndW1lbnQKKyAgLy8vIGxpc3RzIHVzZWQgZm9yIGRlcGVuZGVudCB0eXBlcyBhbmQgZm9yIGV4cHJlc3Npb247IGl0IHdpbGwgbm90CisgIC8vLyBvY2N1ciBpbiBhIG5vbi1kZXBlbmRlbnQsIGNhbm9uaWNhbCB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0LgorICBUZW1wbGF0ZUFyZ3VtZW50KEV4cHIgKkUpIHsKKyAgICBUeXBlT3JWYWx1ZS5LaW5kID0gRXhwcmVzc2lvbjsKKyAgICBUeXBlT3JWYWx1ZS5WID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KEUpOworICB9CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSB0ZW1wbGF0ZSBhcmd1bWVudCB0aGF0IGlzIGEgdGVtcGxhdGUgYXJndW1lbnQgcGFjay4KKyAgLy8vCisgIC8vLyBXZSBhc3N1bWUgdGhhdCBzdG9yYWdlIGZvciB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIHByb3ZpZGVkCisgIC8vLyBvdXRsaXZlcyB0aGUgVGVtcGxhdGVBcmd1bWVudCBpdHNlbGYuCisgIGV4cGxpY2l0IFRlbXBsYXRlQXJndW1lbnQoQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gQXJncykgeworICAgIHRoaXMtPkFyZ3MuS2luZCA9IFBhY2s7CisgICAgdGhpcy0+QXJncy5BcmdzID0gQXJncy5kYXRhKCk7CisgICAgdGhpcy0+QXJncy5OdW1BcmdzID0gQXJncy5zaXplKCk7CisgIH0KKworICBUZW1wbGF0ZUFyZ3VtZW50KFRlbXBsYXRlTmFtZSwgYm9vbCkgPSBkZWxldGU7CisKKyAgc3RhdGljIFRlbXBsYXRlQXJndW1lbnQgZ2V0RW1wdHlQYWNrKCkgeyByZXR1cm4gVGVtcGxhdGVBcmd1bWVudChOb25lKTsgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbmV3IHRlbXBsYXRlIGFyZ3VtZW50IHBhY2sgYnkgY29weWluZyB0aGUgZ2l2ZW4gc2V0IG9mCisgIC8vLyB0ZW1wbGF0ZSBhcmd1bWVudHMuCisgIHN0YXRpYyBUZW1wbGF0ZUFyZ3VtZW50IENyZWF0ZVBhY2tDb3B5KEFTVENvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IEFyZ3MpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBraW5kIG9mIHN0b3JlZCB0ZW1wbGF0ZSBhcmd1bWVudC4KKyAgQXJnS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gKEFyZ0tpbmQpVHlwZU9yVmFsdWUuS2luZDsgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB0ZW1wbGF0ZSBhcmd1bWVudCBoYXMgbm8gdmFsdWUuCisgIGJvb2wgaXNOdWxsKCkgY29uc3QgeyByZXR1cm4gZ2V0S2luZCgpID09IE51bGw7IH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyB0ZW1wbGF0ZSBhcmd1bWVudCBpcyBkZXBlbmRlbnQgb24gYSB0ZW1wbGF0ZQorICAvLy8gcGFyYW1ldGVyIHN1Y2ggdGhhdCBpdHMgcmVzdWx0IGNhbiBjaGFuZ2UgZnJvbSBvbmUgaW5zdGFudGlhdGlvbiB0bworICAvLy8gYW5vdGhlci4KKyAgYm9vbCBpc0RlcGVuZGVudCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIHRlbXBsYXRlIGFyZ3VtZW50IGlzIGRlcGVuZGVudCBvbiBhIHRlbXBsYXRlCisgIC8vLyBwYXJhbWV0ZXIuCisgIGJvb2wgaXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgdGVtcGxhdGUgYXJndW1lbnQgY29udGFpbnMgYW4gdW5leHBhbmRlZAorICAvLy8gcGFyYW1ldGVyIHBhY2suCisgIGJvb2wgY29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB0ZW1wbGF0ZSBhcmd1bWVudCBpcyBhIHBhY2sgZXhwYW5zaW9uLgorICBib29sIGlzUGFja0V4cGFuc2lvbigpIGNvbnN0OworICAKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdHlwZSBmb3IgYSB0eXBlIHRlbXBsYXRlIGFyZ3VtZW50LgorICBRdWFsVHlwZSBnZXRBc1R5cGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEtpbmQoKSA9PSBUeXBlICYmICJVbmV4cGVjdGVkIGtpbmQiKTsKKyAgICByZXR1cm4gUXVhbFR5cGU6OmdldEZyb21PcGFxdWVQdHIocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oVHlwZU9yVmFsdWUuVikpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgZGVjbGFyYXRpb24gZm9yIGEgZGVjbGFyYXRpb24gbm9uLXR5cGUKKyAgLy8vIHRlbXBsYXRlIGFyZ3VtZW50LgorICBWYWx1ZURlY2wgKmdldEFzRGVjbCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0S2luZCgpID09IERlY2xhcmF0aW9uICYmICJVbmV4cGVjdGVkIGtpbmQiKTsKKyAgICByZXR1cm4gRGVjbEFyZy5EOworICB9CisKKyAgUXVhbFR5cGUgZ2V0UGFyYW1UeXBlRm9yRGVjbCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0S2luZCgpID09IERlY2xhcmF0aW9uICYmICJVbmV4cGVjdGVkIGtpbmQiKTsKKyAgICByZXR1cm4gUXVhbFR5cGU6OmdldEZyb21PcGFxdWVQdHIoRGVjbEFyZy5RVCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0eXBlIGZvciBudWxsIG5vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50LgorICBRdWFsVHlwZSBnZXROdWxsUHRyVHlwZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0S2luZCgpID09IE51bGxQdHIgJiYgIlVuZXhwZWN0ZWQga2luZCIpOworICAgIHJldHVybiBRdWFsVHlwZTo6Z2V0RnJvbU9wYXF1ZVB0cihyZWludGVycHJldF9jYXN0PHZvaWQqPihUeXBlT3JWYWx1ZS5WKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0ZW1wbGF0ZSBuYW1lIGZvciBhIHRlbXBsYXRlIG5hbWUgYXJndW1lbnQuCisgIFRlbXBsYXRlTmFtZSBnZXRBc1RlbXBsYXRlKCkgY29uc3QgeworICAgIGFzc2VydChnZXRLaW5kKCkgPT0gVGVtcGxhdGUgJiYgIlVuZXhwZWN0ZWQga2luZCIpOworICAgIHJldHVybiBUZW1wbGF0ZU5hbWU6OmdldEZyb21Wb2lkUG9pbnRlcihUZW1wbGF0ZUFyZy5OYW1lKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50IGFzIGEgdGVtcGxhdGUgbmFtZTsgaWYgdGhlIGFyZ3VtZW50CisgIC8vLyBpcyBhIHBhY2sgZXhwYW5zaW9uLCByZXR1cm4gdGhlIHBhdHRlcm4gYXMgYSB0ZW1wbGF0ZSBuYW1lLgorICBUZW1wbGF0ZU5hbWUgZ2V0QXNUZW1wbGF0ZU9yVGVtcGxhdGVQYXR0ZXJuKCkgY29uc3QgeworICAgIGFzc2VydCgoZ2V0S2luZCgpID09IFRlbXBsYXRlIHx8IGdldEtpbmQoKSA9PSBUZW1wbGF0ZUV4cGFuc2lvbikgJiYKKyAgICAgICAgICAgIlVuZXhwZWN0ZWQga2luZCIpOworICAgIAorICAgIHJldHVybiBUZW1wbGF0ZU5hbWU6OmdldEZyb21Wb2lkUG9pbnRlcihUZW1wbGF0ZUFyZy5OYW1lKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG51bWJlciBvZiBleHBhbnNpb25zIHRoYXQgYSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBhcmd1bWVudAorICAvLy8gZXhwYW5zaW9uIHdpbGwgcHJvZHVjZSwgaWYga25vd24uCisgIE9wdGlvbmFsPHVuc2lnbmVkPiBnZXROdW1UZW1wbGF0ZUV4cGFuc2lvbnMoKSBjb25zdDsKKyAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50IGFzIGFuIGludGVncmFsIHZhbHVlLgorICAvLyBGSVhNRTogUHJvdmlkZSBhIHdheSB0byByZWFkIHRoZSBpbnRlZ3JhbCBkYXRhIHdpdGhvdXQgY29weWluZyB0aGUgdmFsdWUuCisgIGxsdm06OkFQU0ludCBnZXRBc0ludGVncmFsKCkgY29uc3QgeworICAgIGFzc2VydChnZXRLaW5kKCkgPT0gSW50ZWdyYWwgJiYgIlVuZXhwZWN0ZWQga2luZCIpOworCisgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKyAgICBpZiAoSW50ZWdlci5CaXRXaWR0aCA8PSA2NCkKKyAgICAgIHJldHVybiBBUFNJbnQoQVBJbnQoSW50ZWdlci5CaXRXaWR0aCwgSW50ZWdlci5WQUwpLCBJbnRlZ2VyLklzVW5zaWduZWQpOworCisgICAgdW5zaWduZWQgTnVtV29yZHMgPSBBUEludDo6Z2V0TnVtV29yZHMoSW50ZWdlci5CaXRXaWR0aCk7CisgICAgcmV0dXJuIEFQU0ludChBUEludChJbnRlZ2VyLkJpdFdpZHRoLCBtYWtlQXJyYXlSZWYoSW50ZWdlci5wVmFsLCBOdW1Xb3JkcykpLAorICAgICAgICAgICAgICAgICAgSW50ZWdlci5Jc1Vuc2lnbmVkKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHR5cGUgb2YgdGhlIGludGVncmFsIHZhbHVlLgorICBRdWFsVHlwZSBnZXRJbnRlZ3JhbFR5cGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEtpbmQoKSA9PSBJbnRlZ3JhbCAmJiAiVW5leHBlY3RlZCBraW5kIik7CisgICAgcmV0dXJuIFF1YWxUeXBlOjpnZXRGcm9tT3BhcXVlUHRyKEludGVnZXIuVHlwZSk7CisgIH0KKworICB2b2lkIHNldEludGVncmFsVHlwZShRdWFsVHlwZSBUKSB7CisgICAgYXNzZXJ0KGdldEtpbmQoKSA9PSBJbnRlZ3JhbCAmJiAiVW5leHBlY3RlZCBraW5kIik7CisgICAgSW50ZWdlci5UeXBlID0gVC5nZXRBc09wYXF1ZVB0cigpOworICB9CisKKyAgLy8vIFxicmllZiBJZiB0aGlzIGlzIGEgbm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnQsIGdldCBpdHMgdHlwZS4gT3RoZXJ3aXNlLAorICAvLy8gcmV0dXJucyBhIG51bGwgUXVhbFR5cGUuCisgIFF1YWxUeXBlIGdldE5vblR5cGVUZW1wbGF0ZUFyZ3VtZW50VHlwZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50IGFzIGFuIGV4cHJlc3Npb24uCisgIEV4cHIgKmdldEFzRXhwcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0S2luZCgpID09IEV4cHJlc3Npb24gJiYgIlVuZXhwZWN0ZWQga2luZCIpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEV4cHIgKj4oVHlwZU9yVmFsdWUuVik7CisgIH0KKworICAvLy8gXGJyaWVmIEl0ZXJhdG9yIHRoYXQgdHJhdmVyc2VzIHRoZSBlbGVtZW50cyBvZiBhIHRlbXBsYXRlIGFyZ3VtZW50IHBhY2suCisgIHVzaW5nIHBhY2tfaXRlcmF0b3IgPSBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICo7CisKKyAgLy8vIFxicmllZiBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZmlyc3QgYXJndW1lbnQgb2YgYSB0ZW1wbGF0ZSBhcmd1bWVudAorICAvLy8gcGFjay4KKyAgcGFja19pdGVyYXRvciBwYWNrX2JlZ2luKCkgY29uc3QgeworICAgIGFzc2VydChnZXRLaW5kKCkgPT0gUGFjayk7CisgICAgcmV0dXJuIEFyZ3MuQXJnczsKKyAgfQorCisgIC8vLyBcYnJpZWYgSXRlcmF0b3IgcmVmZXJlbmNpbmcgb25lIHBhc3QgdGhlIGxhc3QgYXJndW1lbnQgb2YgYSB0ZW1wbGF0ZQorICAvLy8gYXJndW1lbnQgcGFjay4KKyAgcGFja19pdGVyYXRvciBwYWNrX2VuZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0S2luZCgpID09IFBhY2spOworICAgIHJldHVybiBBcmdzLkFyZ3MgKyBBcmdzLk51bUFyZ3M7CisgIH0KKworICAvLy8gXGJyaWVmIEl0ZXJhdG9yIHJhbmdlIHJlZmVyZW5jaW5nIGFsbCBvZiB0aGUgZWxlbWVudHMgb2YgYSB0ZW1wbGF0ZQorICAvLy8gYXJndW1lbnQgcGFjay4KKyAgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gcGFja19lbGVtZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKHBhY2tfYmVnaW4oKSwgcGFja19lbmQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgdGVtcGxhdGUgYXJndW1lbnRzIGluIHRoZSBnaXZlbiB0ZW1wbGF0ZSBhcmd1bWVudAorICAvLy8gcGFjay4KKyAgdW5zaWduZWQgcGFja19zaXplKCkgY29uc3QgeworICAgIGFzc2VydChnZXRLaW5kKCkgPT0gUGFjayk7CisgICAgcmV0dXJuIEFyZ3MuTnVtQXJnczsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBhcnJheSBvZiBhcmd1bWVudHMgaW4gdGhpcyB0ZW1wbGF0ZSBhcmd1bWVudCBwYWNrLgorICBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBnZXRQYWNrQXNBcnJheSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0S2luZCgpID09IFBhY2spOworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoQXJncy5BcmdzLCBBcmdzLk51bUFyZ3MpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIHRlbXBsYXRlIGFyZ3VtZW50cyBhcmUgc3VwZXJmaWNpYWxseSB0aGUKKyAgLy8vIHNhbWUuCisgIGJvb2wgc3RydWN0dXJhbGx5RXF1YWxzKGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJk90aGVyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFdoZW4gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IGlzIGEgcGFjayBleHBhbnNpb24sIHJldHVybnMKKyAgLy8vIHRoZSBwYXR0ZXJuIG9mIHRoZSBwYWNrIGV4cGFuc2lvbi4KKyAgVGVtcGxhdGVBcmd1bWVudCBnZXRQYWNrRXhwYW5zaW9uUGF0dGVybigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUHJpbnQgdGhpcyB0ZW1wbGF0ZSBhcmd1bWVudCB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KKyAgdm9pZCBwcmludChjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5LCByYXdfb3N0cmVhbSAmT3V0KSBjb25zdDsKKyAgICAgICAgICAgICAKKyAgLy8vIFxicmllZiBEZWJ1Z2dpbmcgYWlkIHRoYXQgZHVtcHMgdGhlIHRlbXBsYXRlIGFyZ3VtZW50LgorICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk91dCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZWJ1Z2dpbmcgYWlkIHRoYXQgZHVtcHMgdGhlIHRlbXBsYXRlIGFyZ3VtZW50IHRvIHN0YW5kYXJkIGVycm9yLgorICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgICAgICAgICAgICAKKyAgLy8vIFxicmllZiBVc2VkIHRvIGluc2VydCBUZW1wbGF0ZUFyZ3VtZW50cyBpbnRvIEZvbGRpbmdTZXRzLgorICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQpIGNvbnN0OworfTsKKworLy8vIExvY2F0aW9uIGluZm9ybWF0aW9uIGZvciBhIFRlbXBsYXRlQXJndW1lbnQuCitzdHJ1Y3QgVGVtcGxhdGVBcmd1bWVudExvY0luZm8geworcHJpdmF0ZToKKyAgc3RydWN0IFQgeworICAgIC8vIEZJWE1FOiBXZSdkIGxpa2UgdG8ganVzdCB1c2UgdGhlIHF1YWxpZmllciBpbiB0aGUgVGVtcGxhdGVOYW1lLAorICAgIC8vIGJ1dCB0ZW1wbGF0ZSBhcmd1bWVudHMgZ2V0IGNhbm9uaWNhbGl6ZWQgdG9vIHF1aWNrbHkuCisgICAgTmVzdGVkTmFtZVNwZWNpZmllciAqUXVhbGlmaWVyOworICAgIHZvaWQgKlF1YWxpZmllckxvY0RhdGE7CisgICAgdW5zaWduZWQgVGVtcGxhdGVOYW1lTG9jOworICAgIHVuc2lnbmVkIEVsbGlwc2lzTG9jOworICB9OworCisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgVCBUZW1wbGF0ZTsKKyAgICBFeHByICpFeHByZXNzaW9uOworICAgIFR5cGVTb3VyY2VJbmZvICpEZWNsYXJhdG9yOworICB9OworCitwdWJsaWM6CisgIGNvbnN0ZXhwciBUZW1wbGF0ZUFyZ3VtZW50TG9jSW5mbygpIDogVGVtcGxhdGUoe251bGxwdHIsIG51bGxwdHIsIDAsIDB9KSB7fQorCisgIFRlbXBsYXRlQXJndW1lbnRMb2NJbmZvKFR5cGVTb3VyY2VJbmZvICpUSW5mbykgOiBEZWNsYXJhdG9yKFRJbmZvKSB7fQorICAKKyAgVGVtcGxhdGVBcmd1bWVudExvY0luZm8oRXhwciAqRSkgOiBFeHByZXNzaW9uKEUpIHt9CisgIAorICBUZW1wbGF0ZUFyZ3VtZW50TG9jSW5mbyhOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYykgeworICAgIFRlbXBsYXRlLlF1YWxpZmllciA9IFF1YWxpZmllckxvYy5nZXROZXN0ZWROYW1lU3BlY2lmaWVyKCk7CisgICAgVGVtcGxhdGUuUXVhbGlmaWVyTG9jRGF0YSA9IFF1YWxpZmllckxvYy5nZXRPcGFxdWVEYXRhKCk7CisgICAgVGVtcGxhdGUuVGVtcGxhdGVOYW1lTG9jID0gVGVtcGxhdGVOYW1lTG9jLmdldFJhd0VuY29kaW5nKCk7CisgICAgVGVtcGxhdGUuRWxsaXBzaXNMb2MgPSBFbGxpcHNpc0xvYy5nZXRSYXdFbmNvZGluZygpOworICB9CisKKyAgVHlwZVNvdXJjZUluZm8gKmdldEFzVHlwZVNvdXJjZUluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIERlY2xhcmF0b3I7CisgIH0KKworICBFeHByICpnZXRBc0V4cHIoKSBjb25zdCB7CisgICAgcmV0dXJuIEV4cHJlc3Npb247CisgIH0KKworICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIGdldFRlbXBsYXRlUXVhbGlmaWVyTG9jKCkgY29uc3QgeworICAgIHJldHVybiBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKFRlbXBsYXRlLlF1YWxpZmllciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGUuUXVhbGlmaWVyTG9jRGF0YSk7CisgIH0KKyAgCisgIFNvdXJjZUxvY2F0aW9uIGdldFRlbXBsYXRlTmFtZUxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZyhUZW1wbGF0ZS5UZW1wbGF0ZU5hbWVMb2MpOworICB9CisgIAorICBTb3VyY2VMb2NhdGlvbiBnZXRUZW1wbGF0ZUVsbGlwc2lzTG9jKCkgY29uc3QgeworICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKFRlbXBsYXRlLkVsbGlwc2lzTG9jKTsKKyAgfQorfTsKKworLy8vIExvY2F0aW9uIHdyYXBwZXIgZm9yIGEgVGVtcGxhdGVBcmd1bWVudC4gIFRlbXBsYXRlQXJndW1lbnQgaXMgdG8KKy8vLyBUZW1wbGF0ZUFyZ3VtZW50TG9jIGFzIFR5cGUgaXMgdG8gVHlwZUxvYy4KK2NsYXNzIFRlbXBsYXRlQXJndW1lbnRMb2MgeworICBUZW1wbGF0ZUFyZ3VtZW50IEFyZ3VtZW50OworICBUZW1wbGF0ZUFyZ3VtZW50TG9jSW5mbyBMb2NJbmZvOworCitwdWJsaWM6CisgIGNvbnN0ZXhwciBUZW1wbGF0ZUFyZ3VtZW50TG9jKCkge30KKworICBUZW1wbGF0ZUFyZ3VtZW50TG9jKGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJkFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJndW1lbnRMb2NJbmZvIE9wYXF1ZSkKKyAgICAgIDogQXJndW1lbnQoQXJndW1lbnQpLCBMb2NJbmZvKE9wYXF1ZSkge30KKworICBUZW1wbGF0ZUFyZ3VtZW50TG9jKGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJkFyZ3VtZW50LCBUeXBlU291cmNlSW5mbyAqVEluZm8pCisgICAgICA6IEFyZ3VtZW50KEFyZ3VtZW50KSwgTG9jSW5mbyhUSW5mbykgeworICAgIGFzc2VydChBcmd1bWVudC5nZXRLaW5kKCkgPT0gVGVtcGxhdGVBcmd1bWVudDo6VHlwZSk7CisgIH0KKworICBUZW1wbGF0ZUFyZ3VtZW50TG9jKGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJkFyZ3VtZW50LCBFeHByICpFKQorICAgICAgOiBBcmd1bWVudChBcmd1bWVudCksIExvY0luZm8oRSkgeworICAgIGFzc2VydChBcmd1bWVudC5nZXRLaW5kKCkgPT0gVGVtcGxhdGVBcmd1bWVudDo6RXhwcmVzc2lvbik7CisgIH0KKworICBUZW1wbGF0ZUFyZ3VtZW50TG9jKGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJkFyZ3VtZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYywKKyAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZU5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MgPSBTb3VyY2VMb2NhdGlvbigpKQorICAgICAgOiBBcmd1bWVudChBcmd1bWVudCksCisgICAgICAgIExvY0luZm8oUXVhbGlmaWVyTG9jLCBUZW1wbGF0ZU5hbWVMb2MsIEVsbGlwc2lzTG9jKSB7CisgICAgYXNzZXJ0KEFyZ3VtZW50LmdldEtpbmQoKSA9PSBUZW1wbGF0ZUFyZ3VtZW50OjpUZW1wbGF0ZSB8fAorICAgICAgICAgICBBcmd1bWVudC5nZXRLaW5kKCkgPT0gVGVtcGxhdGVBcmd1bWVudDo6VGVtcGxhdGVFeHBhbnNpb24pOworICB9CisgIAorICAvLy8gXGJyaWVmIC0gRmV0Y2hlcyB0aGUgcHJpbWFyeSBsb2NhdGlvbiBvZiB0aGUgYXJndW1lbnQuCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeworICAgIGlmIChBcmd1bWVudC5nZXRLaW5kKCkgPT0gVGVtcGxhdGVBcmd1bWVudDo6VGVtcGxhdGUgfHwKKyAgICAgICAgQXJndW1lbnQuZ2V0S2luZCgpID09IFRlbXBsYXRlQXJndW1lbnQ6OlRlbXBsYXRlRXhwYW5zaW9uKQorICAgICAgcmV0dXJuIGdldFRlbXBsYXRlTmFtZUxvYygpOworICAgIAorICAgIHJldHVybiBnZXRTb3VyY2VSYW5nZSgpLmdldEJlZ2luKCk7CisgIH0KKworICAvLy8gXGJyaWVmIC0gRmV0Y2hlcyB0aGUgZnVsbCBzb3VyY2UgcmFuZ2Ugb2YgdGhlIGFyZ3VtZW50LgorICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisKKyAgY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmZ2V0QXJndW1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIEFyZ3VtZW50OworICB9CisKKyAgVGVtcGxhdGVBcmd1bWVudExvY0luZm8gZ2V0TG9jSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gTG9jSW5mbzsKKyAgfQorCisgIFR5cGVTb3VyY2VJbmZvICpnZXRUeXBlU291cmNlSW5mbygpIGNvbnN0IHsKKyAgICBhc3NlcnQoQXJndW1lbnQuZ2V0S2luZCgpID09IFRlbXBsYXRlQXJndW1lbnQ6OlR5cGUpOworICAgIHJldHVybiBMb2NJbmZvLmdldEFzVHlwZVNvdXJjZUluZm8oKTsKKyAgfQorCisgIEV4cHIgKmdldFNvdXJjZUV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgYXNzZXJ0KEFyZ3VtZW50LmdldEtpbmQoKSA9PSBUZW1wbGF0ZUFyZ3VtZW50OjpFeHByZXNzaW9uKTsKKyAgICByZXR1cm4gTG9jSW5mby5nZXRBc0V4cHIoKTsKKyAgfQorCisgIEV4cHIgKmdldFNvdXJjZURlY2xFeHByZXNzaW9uKCkgY29uc3QgeworICAgIGFzc2VydChBcmd1bWVudC5nZXRLaW5kKCkgPT0gVGVtcGxhdGVBcmd1bWVudDo6RGVjbGFyYXRpb24pOworICAgIHJldHVybiBMb2NJbmZvLmdldEFzRXhwcigpOworICB9CisKKyAgRXhwciAqZ2V0U291cmNlTnVsbFB0ckV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgYXNzZXJ0KEFyZ3VtZW50LmdldEtpbmQoKSA9PSBUZW1wbGF0ZUFyZ3VtZW50OjpOdWxsUHRyKTsKKyAgICByZXR1cm4gTG9jSW5mby5nZXRBc0V4cHIoKTsKKyAgfQorCisgIEV4cHIgKmdldFNvdXJjZUludGVncmFsRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICBhc3NlcnQoQXJndW1lbnQuZ2V0S2luZCgpID09IFRlbXBsYXRlQXJndW1lbnQ6OkludGVncmFsKTsKKyAgICByZXR1cm4gTG9jSW5mby5nZXRBc0V4cHIoKTsKKyAgfQorCisgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgZ2V0VGVtcGxhdGVRdWFsaWZpZXJMb2MoKSBjb25zdCB7CisgICAgYXNzZXJ0KEFyZ3VtZW50LmdldEtpbmQoKSA9PSBUZW1wbGF0ZUFyZ3VtZW50OjpUZW1wbGF0ZSB8fAorICAgICAgICAgICBBcmd1bWVudC5nZXRLaW5kKCkgPT0gVGVtcGxhdGVBcmd1bWVudDo6VGVtcGxhdGVFeHBhbnNpb24pOworICAgIHJldHVybiBMb2NJbmZvLmdldFRlbXBsYXRlUXVhbGlmaWVyTG9jKCk7CisgIH0KKyAgCisgIFNvdXJjZUxvY2F0aW9uIGdldFRlbXBsYXRlTmFtZUxvYygpIGNvbnN0IHsKKyAgICBhc3NlcnQoQXJndW1lbnQuZ2V0S2luZCgpID09IFRlbXBsYXRlQXJndW1lbnQ6OlRlbXBsYXRlIHx8CisgICAgICAgICAgIEFyZ3VtZW50LmdldEtpbmQoKSA9PSBUZW1wbGF0ZUFyZ3VtZW50OjpUZW1wbGF0ZUV4cGFuc2lvbik7CisgICAgcmV0dXJuIExvY0luZm8uZ2V0VGVtcGxhdGVOYW1lTG9jKCk7CisgIH0gIAorICAKKyAgU291cmNlTG9jYXRpb24gZ2V0VGVtcGxhdGVFbGxpcHNpc0xvYygpIGNvbnN0IHsKKyAgICBhc3NlcnQoQXJndW1lbnQuZ2V0S2luZCgpID09IFRlbXBsYXRlQXJndW1lbnQ6OlRlbXBsYXRlRXhwYW5zaW9uKTsKKyAgICByZXR1cm4gTG9jSW5mby5nZXRUZW1wbGF0ZUVsbGlwc2lzTG9jKCk7CisgIH0KK307CisKKy8vLyBBIGNvbnZlbmllbnQgY2xhc3MgZm9yIHBhc3NpbmcgYXJvdW5kIHRlbXBsYXRlIGFyZ3VtZW50CisvLy8gaW5mb3JtYXRpb24uICBEZXNpZ25lZCB0byBiZSBwYXNzZWQgYnkgcmVmZXJlbmNlLgorY2xhc3MgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvIHsKKyAgU21hbGxWZWN0b3I8VGVtcGxhdGVBcmd1bWVudExvYywgOD4gQXJndW1lbnRzOworICBTb3VyY2VMb2NhdGlvbiBMQW5nbGVMb2M7CisgIFNvdXJjZUxvY2F0aW9uIFJBbmdsZUxvYzsKKworcHVibGljOgorICBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8oKSA9IGRlZmF1bHQ7CisKKyAgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvKFNvdXJjZUxvY2F0aW9uIExBbmdsZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJBbmdsZUxvYykKKyAgICAgIDogTEFuZ2xlTG9jKExBbmdsZUxvYyksIFJBbmdsZUxvYyhSQW5nbGVMb2MpIHt9CisKKyAgLy8gVGhpcyBjYW4gbGVhayBpZiB1c2VkIGluIGFuIEFTVCBub2RlLCB1c2UgQVNUVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvCisgIC8vIGluc3RlYWQuCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgYnl0ZXMsIEFTVENvbnRleHQgJkMpID0gZGVsZXRlOworCisgIFNvdXJjZUxvY2F0aW9uIGdldExBbmdsZUxvYygpIGNvbnN0IHsgcmV0dXJuIExBbmdsZUxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRSQW5nbGVMb2MoKSBjb25zdCB7IHJldHVybiBSQW5nbGVMb2M7IH0KKworICB2b2lkIHNldExBbmdsZUxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgTEFuZ2xlTG9jID0gTG9jOyB9CisgIHZvaWQgc2V0UkFuZ2xlTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBSQW5nbGVMb2MgPSBMb2M7IH0KKworICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gQXJndW1lbnRzLnNpemUoKTsgfQorCisgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMb2MgKmdldEFyZ3VtZW50QXJyYXkoKSBjb25zdCB7CisgICAgcmV0dXJuIEFyZ3VtZW50cy5kYXRhKCk7CisgIH0KKworICBsbHZtOjpBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50TG9jPiBhcmd1bWVudHMoKSBjb25zdCB7CisgICAgcmV0dXJuIEFyZ3VtZW50czsKKyAgfQorCisgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMb2MgJm9wZXJhdG9yW10odW5zaWduZWQgSSkgY29uc3QgeworICAgIHJldHVybiBBcmd1bWVudHNbSV07CisgIH0KKworICBUZW1wbGF0ZUFyZ3VtZW50TG9jICZvcGVyYXRvcltdKHVuc2lnbmVkIEkpIHsKKyAgICByZXR1cm4gQXJndW1lbnRzW0ldOworICB9CisKKyAgdm9pZCBhZGRBcmd1bWVudChjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TG9jICZMb2MpIHsKKyAgICBBcmd1bWVudHMucHVzaF9iYWNrKExvYyk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhbiBleHBsaWNpdCB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0IGluIEMrKywgZS5nLiwKKy8vLyB0aGUgIjxpbnQ+IiBpbiAic29ydDxpbnQ+Ii4KKy8vLyBUaGlzIGlzIHNhZmUgdG8gYmUgdXNlZCBpbnNpZGUgYW4gQVNUIG5vZGUsIGluIGNvbnRyYXN0IHdpdGgKKy8vLyBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8uCitzdHJ1Y3QgQVNUVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvIGZpbmFsCisgICAgOiBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxBU1RUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUFyZ3VtZW50TG9jPiB7Citwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQVNUTm9kZUltcG9ydGVyOworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIEFTVFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyhjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gJkxpc3QpOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgVGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgbGVmdCBhbmdsZSBicmFja2V0ICgnPCcpLgorICBTb3VyY2VMb2NhdGlvbiBMQW5nbGVMb2M7CisKKyAgLy8vIFxicmllZiBUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSByaWdodCBhbmdsZSBicmFja2V0ICgnPicpLgorICBTb3VyY2VMb2NhdGlvbiBSQW5nbGVMb2M7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHRlbXBsYXRlIGFyZ3VtZW50cyBpbiBUZW1wbGF0ZUFyZ3MuCisgIHVuc2lnbmVkIE51bVRlbXBsYXRlQXJnczsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMKKyAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExvYyAqZ2V0VGVtcGxhdGVBcmdzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8VGVtcGxhdGVBcmd1bWVudExvYz4oKTsKKyAgfQorCisgIGxsdm06OkFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnRMb2M+IGFyZ3VtZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKGdldFRlbXBsYXRlQXJncygpLCBOdW1UZW1wbGF0ZUFyZ3MpOworICB9CisKKyAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExvYyAmb3BlcmF0b3JbXSh1bnNpZ25lZCBJKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBsYXRlQXJncygpW0ldOworICB9CisKKyAgc3RhdGljIGNvbnN0IEFTVFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqCisgIENyZWF0ZShBU1RDb250ZXh0ICZDLCBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gJkxpc3QpOworfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGFuIGV4cGxpY2l0IHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QgaW4gQysrLCBlLmcuLAorLy8vIHRoZSAiPGludD4iIGluICJzb3J0PGludD4iLgorLy8vCisvLy8gSXQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBhIHRyYWlsaW5nIG9iamVjdCBvbiBBU1Qgbm9kZXMsIGFuZAorLy8vIGFzIHN1Y2gsIGRvZXNuJ3QgY29udGFpbiB0aGUgYXJyYXkgb2YgVGVtcGxhdGVBcmd1bWVudExvYyBpdHNlbGYsCisvLy8gYnV0IGV4cGVjdHMgdGhlIGNvbnRhaW5pbmcgb2JqZWN0IHRvIGFsc28gcHJvdmlkZSBzdG9yYWdlIGZvcgorLy8vIHRoYXQuCitzdHJ1Y3QgYWxpZ25hcyh2b2lkICopIEFTVFRlbXBsYXRlS1dBbmRBcmdzSW5mbyB7CisgIC8vLyBcYnJpZWYgVGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgbGVmdCBhbmdsZSBicmFja2V0ICgnPCcpLgorICBTb3VyY2VMb2NhdGlvbiBMQW5nbGVMb2M7CisKKyAgLy8vIFxicmllZiBUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSByaWdodCBhbmdsZSBicmFja2V0ICgnPicpLgorICBTb3VyY2VMb2NhdGlvbiBSQW5nbGVMb2M7CisKKyAgLy8vIFxicmllZiBUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBrZXl3b3JkOyB0aGlzIGlzIHVzZWQKKyAgLy8vIGFzIHBhcnQgb2YgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHF1YWxpZmllZCBpZGVudGlmaWVycywgc3VjaCBhcworICAvLy8gUzxUPjo6dGVtcGxhdGUgYXBwbHk8VD4uICBXaWxsIGJlIGVtcHR5IGlmIHRoaXMgZXhwcmVzc2lvbiBkb2VzCisgIC8vLyBub3QgaGF2ZSBhIHRlbXBsYXRlIGtleXdvcmQuCisgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlS1dMb2M7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHRlbXBsYXRlIGFyZ3VtZW50cyBpbiBUZW1wbGF0ZUFyZ3MuCisgIHVuc2lnbmVkIE51bVRlbXBsYXRlQXJnczsKKworICB2b2lkIGluaXRpYWxpemVGcm9tKFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlS1dMb2MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICZMaXN0LAorICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJndW1lbnRMb2MgKk91dEFyZ0FycmF5KTsKKyAgdm9pZCBpbml0aWFsaXplRnJvbShTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUtXTG9jLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAmTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUFyZ3VtZW50TG9jICpPdXRBcmdBcnJheSwgYm9vbCAmRGVwZW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkluc3RhbnRpYXRpb25EZXBlbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmQ29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjayk7CisgIHZvaWQgaW5pdGlhbGl6ZUZyb20oU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYyk7CisKKyAgdm9pZCBjb3B5SW50byhjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TG9jICpBcmdBcnJheSwKKyAgICAgICAgICAgICAgICBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gJkxpc3QpIGNvbnN0OworfTsKKworY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJm9wZXJhdG9yPDwoY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJkRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmQXJnKTsKKworaW5saW5lIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlOjppdGVyYXRvcgorICAgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlOjplbmQoKSBjb25zdCB7CisgIHJldHVybiBnZXRBcmdzKCkgKyBnZXROdW1BcmdzKCk7Cit9CisKK2lubGluZSBEZXBlbmRlbnRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZTo6aXRlcmF0b3IKKyAgICBEZXBlbmRlbnRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZTo6ZW5kKCkgY29uc3QgeworICByZXR1cm4gZ2V0QXJncygpICsgZ2V0TnVtQXJncygpOworfQorCitpbmxpbmUgY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmCisgICAgVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGU6OmdldEFyZyh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgYXNzZXJ0KElkeCA8IGdldE51bUFyZ3MoKSAmJiAiVGVtcGxhdGUgYXJndW1lbnQgb3V0IG9mIHJhbmdlIik7CisgIHJldHVybiBnZXRBcmdzKClbSWR4XTsKK30KKworaW5saW5lIGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJgorICAgIERlcGVuZGVudFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlOjpnZXRBcmcodW5zaWduZWQgSWR4KSBjb25zdCB7CisgIGFzc2VydChJZHggPCBnZXROdW1BcmdzKCkgJiYgIlRlbXBsYXRlIGFyZ3VtZW50IG91dCBvZiByYW5nZSIpOworICByZXR1cm4gZ2V0QXJncygpW0lkeF07Cit9CisgIAorfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUX1RFTVBMQVRFQkFTRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvVGVtcGxhdGVOYW1lLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvVGVtcGxhdGVOYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzM2NmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9UZW1wbGF0ZU5hbWUuaApAQCAtMCwwICsxLDU0MyBAQAorLy89PT0tIFRlbXBsYXRlTmFtZS5oIC0gQysrIFRlbXBsYXRlIE5hbWUgUmVwcmVzZW50YXRpb24gLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIFRlbXBsYXRlTmFtZSBpbnRlcmZhY2UgYW5kIHN1YmNsYXNzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9URU1QTEFURU5BTUVfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9URU1QTEFURU5BTUVfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Qb2ludGVyTGlrZVR5cGVUcmFpdHMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgY2xhbmcgeworICAKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBEZXBlbmRlbnRUZW1wbGF0ZU5hbWU7CitjbGFzcyBEaWFnbm9zdGljQnVpbGRlcjsKK2NsYXNzIElkZW50aWZpZXJJbmZvOworY2xhc3MgTmFtZWREZWNsOworY2xhc3MgTmVzdGVkTmFtZVNwZWNpZmllcjsKK2VudW0gT3ZlcmxvYWRlZE9wZXJhdG9yS2luZCA6IGludDsKK2NsYXNzIE92ZXJsb2FkZWRUZW1wbGF0ZVN0b3JhZ2U7CitzdHJ1Y3QgUHJpbnRpbmdQb2xpY3k7CitjbGFzcyBRdWFsaWZpZWRUZW1wbGF0ZU5hbWU7CitjbGFzcyBTdWJzdFRlbXBsYXRlVGVtcGxhdGVQYXJtUGFja1N0b3JhZ2U7CitjbGFzcyBTdWJzdFRlbXBsYXRlVGVtcGxhdGVQYXJtU3RvcmFnZTsKK2NsYXNzIFRlbXBsYXRlQXJndW1lbnQ7CitjbGFzcyBUZW1wbGF0ZURlY2w7CitjbGFzcyBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2w7CisgIAorLy8vIFxicmllZiBJbXBsZW1lbnRhdGlvbiBjbGFzcyB1c2VkIHRvIGRlc2NyaWJlIGVpdGhlciBhIHNldCBvZiBvdmVybG9hZGVkCisvLy8gdGVtcGxhdGUgbmFtZXMgb3IgYW4gYWxyZWFkeS1zdWJzdGl0dXRlZCB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgcGFjay4KK2NsYXNzIFVuY29tbW9uVGVtcGxhdGVOYW1lU3RvcmFnZSB7Citwcm90ZWN0ZWQ6CisgIGVudW0gS2luZCB7CisgICAgT3ZlcmxvYWRlZCwKKyAgICBTdWJzdFRlbXBsYXRlVGVtcGxhdGVQYXJtLAorICAgIFN1YnN0VGVtcGxhdGVUZW1wbGF0ZVBhcm1QYWNrCisgIH07CisKKyAgc3RydWN0IEJpdHNUYWcgeworICAgIC8vLyBcYnJpZWYgQSBLaW5kLgorICAgIHVuc2lnbmVkIEtpbmQgOiAyOworICAgIAorICAgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBzdG9yZWQgdGVtcGxhdGVzIG9yIHRlbXBsYXRlIGFyZ3VtZW50cywKKyAgICAvLy8gZGVwZW5kaW5nIG9uIHdoaWNoIHN1YmNsYXNzIHdlIGhhdmUuCisgICAgdW5zaWduZWQgU2l6ZSA6IDMwOworICB9OworCisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgQml0c1RhZyBCaXRzOworICAgIHZvaWQgKlBvaW50ZXJBbGlnbm1lbnQ7CisgIH07CisgIAorICBVbmNvbW1vblRlbXBsYXRlTmFtZVN0b3JhZ2UoS2luZCBraW5kLCB1bnNpZ25lZCBzaXplKSB7CisgICAgQml0cy5LaW5kID0ga2luZDsKKyAgICBCaXRzLlNpemUgPSBzaXplOworICB9CisgIAorcHVibGljOgorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gQml0cy5TaXplOyB9CisgIAorICBPdmVybG9hZGVkVGVtcGxhdGVTdG9yYWdlICpnZXRBc092ZXJsb2FkZWRTdG9yYWdlKCkgIHsKKyAgICByZXR1cm4gQml0cy5LaW5kID09IE92ZXJsb2FkZWQKKyAgICAgICAgICAgICA/IHJlaW50ZXJwcmV0X2Nhc3Q8T3ZlcmxvYWRlZFRlbXBsYXRlU3RvcmFnZSAqPih0aGlzKSAKKyAgICAgICAgICAgICA6IG51bGxwdHI7CisgIH0KKyAgCisgIFN1YnN0VGVtcGxhdGVUZW1wbGF0ZVBhcm1TdG9yYWdlICpnZXRBc1N1YnN0VGVtcGxhdGVUZW1wbGF0ZVBhcm0oKSB7CisgICAgcmV0dXJuIEJpdHMuS2luZCA9PSBTdWJzdFRlbXBsYXRlVGVtcGxhdGVQYXJtCisgICAgICAgICAgICAgPyByZWludGVycHJldF9jYXN0PFN1YnN0VGVtcGxhdGVUZW1wbGF0ZVBhcm1TdG9yYWdlICo+KHRoaXMpCisgICAgICAgICAgICAgOiBudWxscHRyOworICB9CisKKyAgU3Vic3RUZW1wbGF0ZVRlbXBsYXRlUGFybVBhY2tTdG9yYWdlICpnZXRBc1N1YnN0VGVtcGxhdGVUZW1wbGF0ZVBhcm1QYWNrKCkgeworICAgIHJldHVybiBCaXRzLktpbmQgPT0gU3Vic3RUZW1wbGF0ZVRlbXBsYXRlUGFybVBhY2sKKyAgICAgICAgICAgICA/IHJlaW50ZXJwcmV0X2Nhc3Q8U3Vic3RUZW1wbGF0ZVRlbXBsYXRlUGFybVBhY2tTdG9yYWdlICo+KHRoaXMpCisgICAgICAgICAgICAgOiBudWxscHRyOworICB9Cit9OworICAKKy8vLyBcYnJpZWYgQSBzdHJ1Y3R1cmUgZm9yIHN0b3JpbmcgdGhlIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhbgorLy8vIG92ZXJsb2FkZWQgdGVtcGxhdGUgbmFtZS4KK2NsYXNzIE92ZXJsb2FkZWRUZW1wbGF0ZVN0b3JhZ2UgOiBwdWJsaWMgVW5jb21tb25UZW1wbGF0ZU5hbWVTdG9yYWdlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7CisKKyAgT3ZlcmxvYWRlZFRlbXBsYXRlU3RvcmFnZSh1bnNpZ25lZCBzaXplKSAKKyAgICAgIDogVW5jb21tb25UZW1wbGF0ZU5hbWVTdG9yYWdlKE92ZXJsb2FkZWQsIHNpemUpIHt9CisKKyAgTmFtZWREZWNsICoqZ2V0U3RvcmFnZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxOYW1lZERlY2wgKio+KHRoaXMgKyAxKTsKKyAgfQorICBOYW1lZERlY2wgKiBjb25zdCAqZ2V0U3RvcmFnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxOYW1lZERlY2wgKmNvbnN0ICo+KHRoaXMgKyAxKTsKKyAgfQorCitwdWJsaWM6CisgIHVzaW5nIGl0ZXJhdG9yID0gTmFtZWREZWNsICpjb25zdCAqOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RvcmFnZSgpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGdldFN0b3JhZ2UoKSArIHNpemUoKTsgfQorfTsKKworLy8vIFxicmllZiBBIHN0cnVjdHVyZSBmb3Igc3RvcmluZyBhbiBhbHJlYWR5LXN1YnN0aXR1dGVkIHRlbXBsYXRlIHRlbXBsYXRlCisvLy8gcGFyYW1ldGVyIHBhY2suCisvLy8KKy8vLyBUaGlzIGtpbmQgb2YgdGVtcGxhdGUgbmFtZXMgb2NjdXJzIHdoZW4gdGhlIHBhcmFtZXRlciBwYWNrIGhhcyBiZWVuIAorLy8vIHByb3ZpZGVkIHdpdGggYSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBhcmd1bWVudCBwYWNrIGluIGEgY29udGV4dCB3aGVyZSBpdHMKKy8vLyBlbmNsb3NpbmcgcGFjayBleHBhbnNpb24gY291bGQgbm90IGJlIGZ1bGx5IGV4cGFuZGVkLgorY2xhc3MgU3Vic3RUZW1wbGF0ZVRlbXBsYXRlUGFybVBhY2tTdG9yYWdlCisgIDogcHVibGljIFVuY29tbW9uVGVtcGxhdGVOYW1lU3RvcmFnZSwgcHVibGljIGxsdm06OkZvbGRpbmdTZXROb2RlCit7CisgIFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCAqUGFyYW1ldGVyOworICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpBcmd1bWVudHM7CisgIAorcHVibGljOgorICBTdWJzdFRlbXBsYXRlVGVtcGxhdGVQYXJtUGFja1N0b3JhZ2UoVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsICpQYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgKkFyZ3VtZW50cykKKyAgICAgIDogVW5jb21tb25UZW1wbGF0ZU5hbWVTdG9yYWdlKFN1YnN0VGVtcGxhdGVUZW1wbGF0ZVBhcm1QYWNrLCBTaXplKSwKKyAgICAgICAgUGFyYW1ldGVyKFBhcmFtZXRlciksIEFyZ3VtZW50cyhBcmd1bWVudHMpIHt9CisgIAorICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgcGFjayBiZWluZyBzdWJzdGl0dXRlZC4KKyAgVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsICpnZXRQYXJhbWV0ZXJQYWNrKCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbWV0ZXI7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHRlbXBsYXRlIHRlbXBsYXRlIGFyZ3VtZW50IHBhY2sgd2l0aCB3aGljaCB0aGlzCisgIC8vLyBwYXJhbWV0ZXIgd2FzIHN1YnN0aXR1dGVkLgorICBUZW1wbGF0ZUFyZ3VtZW50IGdldEFyZ3VtZW50UGFjaygpIGNvbnN0OworICAKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELCBBU1RDb250ZXh0ICZDb250ZXh0KTsKKyAgCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsCisgICAgICAgICAgICAgICAgICAgICAgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2wgKlBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICZBcmdQYWNrKTsKK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIEMrKyB0ZW1wbGF0ZSBuYW1lIHdpdGhpbiB0aGUgdHlwZSBzeXN0ZW0uCisvLy8KKy8vLyBBIEMrKyB0ZW1wbGF0ZSBuYW1lIHJlZmVycyB0byBhIHRlbXBsYXRlIHdpdGhpbiB0aGUgQysrIHR5cGUKKy8vLyBzeXN0ZW0uIEluIG1vc3QgY2FzZXMsIGEgdGVtcGxhdGUgbmFtZSBpcyBzaW1wbHkgYSByZWZlcmVuY2UgdG8gYQorLy8vIGNsYXNzIHRlbXBsYXRlLCBlLmcuCisvLy8KKy8vLyBcY29kZQorLy8vIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFggeyB9OworLy8vCisvLy8gWDxpbnQ+IHhpOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBIZXJlLCB0aGUgJ1gnIGluIFxjIFg8aW50PiBpcyBhIHRlbXBsYXRlIG5hbWUgdGhhdCByZWZlcnMgdG8gdGhlCisvLy8gZGVjbGFyYXRpb24gb2YgdGhlIGNsYXNzIHRlbXBsYXRlIFgsIGFib3ZlLiBUZW1wbGF0ZSBuYW1lcyBjYW4KKy8vLyBhbHNvIHJlZmVyIHRvIGZ1bmN0aW9uIHRlbXBsYXRlcywgQysrMHggdGVtcGxhdGUgYWxpYXNlcywgZXRjLgorLy8vCisvLy8gU29tZSB0ZW1wbGF0ZSBuYW1lcyBhcmUgZGVwZW5kZW50LiBGb3IgZXhhbXBsZSwgY29uc2lkZXI6CisvLy8KKy8vLyBcY29kZQorLy8vIHRlbXBsYXRlPHR5cGVuYW1lIE1ldGFGdW4sIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4gc3RydWN0IGFwcGx5MiB7CisvLy8gICB0eXBlZGVmIHR5cGVuYW1lIE1ldGFGdW46OnRlbXBsYXRlIGFwcGx5PFQxLCBUMj46OnR5cGUgdHlwZTsKKy8vLyB9OworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBIZXJlLCAiYXBwbHkiIGlzIHRyZWF0ZWQgYXMgYSB0ZW1wbGF0ZSBuYW1lIHdpdGhpbiB0aGUgdHlwZW5hbWUKKy8vLyBzcGVjaWZpZXIgaW4gdGhlIHR5cGVkZWYuICJhcHBseSIgaXMgYSBuZXN0ZWQgdGVtcGxhdGUsIGFuZCBjYW4KKy8vLyBvbmx5IGJlIHVuZGVyc3Rvb2QgaW4gdGhlIGNvbnRleHQgb2YKK2NsYXNzIFRlbXBsYXRlTmFtZSB7CisgIHVzaW5nIFN0b3JhZ2VUeXBlID0KKyAgICAgIGxsdm06OlBvaW50ZXJVbmlvbjQ8VGVtcGxhdGVEZWNsICosIFVuY29tbW9uVGVtcGxhdGVOYW1lU3RvcmFnZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsaWZpZWRUZW1wbGF0ZU5hbWUgKiwgRGVwZW5kZW50VGVtcGxhdGVOYW1lICo+OworCisgIFN0b3JhZ2VUeXBlIFN0b3JhZ2U7CisKKyAgZXhwbGljaXQgVGVtcGxhdGVOYW1lKHZvaWQgKlB0cik7CisKK3B1YmxpYzoKKyAgLy8gXGJyaWVmIEtpbmQgb2YgbmFtZSB0aGF0IGlzIGFjdHVhbGx5IHN0b3JlZC4KKyAgZW51bSBOYW1lS2luZCB7CisgICAgLy8vIFxicmllZiBBIHNpbmdsZSB0ZW1wbGF0ZSBkZWNsYXJhdGlvbi4KKyAgICBUZW1wbGF0ZSwKKworICAgIC8vLyBcYnJpZWYgQSBzZXQgb2Ygb3ZlcmxvYWRlZCB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMuCisgICAgT3ZlcmxvYWRlZFRlbXBsYXRlLAorCisgICAgLy8vIFxicmllZiBBIHF1YWxpZmllZCB0ZW1wbGF0ZSBuYW1lLCB3aGVyZSB0aGUgcXVhbGlmaWNhdGlvbiBpcyBrZXB0IAorICAgIC8vLyB0byBkZXNjcmliZSB0aGUgc291cmNlIGNvZGUgYXMgd3JpdHRlbi4KKyAgICBRdWFsaWZpZWRUZW1wbGF0ZSwKKworICAgIC8vLyBcYnJpZWYgQSBkZXBlbmRlbnQgdGVtcGxhdGUgbmFtZSB0aGF0IGhhcyBub3QgYmVlbiByZXNvbHZlZCB0byBhIAorICAgIC8vLyB0ZW1wbGF0ZSAob3Igc2V0IG9mIHRlbXBsYXRlcykuCisgICAgRGVwZW5kZW50VGVtcGxhdGUsCisKKyAgICAvLy8gXGJyaWVmIEEgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gc3Vic3RpdHV0ZWQKKyAgICAvLy8gZm9yIHNvbWUgb3RoZXIgdGVtcGxhdGUgbmFtZS4KKyAgICBTdWJzdFRlbXBsYXRlVGVtcGxhdGVQYXJtLAorCisgICAgLy8vIFxicmllZiBBIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlciBwYWNrIHRoYXQgaGFzIGJlZW4gc3Vic3RpdHV0ZWQgZm9yIAorICAgIC8vLyBhIHRlbXBsYXRlIHRlbXBsYXRlIGFyZ3VtZW50IHBhY2ssIGJ1dCBoYXMgbm90IHlldCBiZWVuIGV4cGFuZGVkIGludG8KKyAgICAvLy8gaW5kaXZpZHVhbCBhcmd1bWVudHMuCisgICAgU3Vic3RUZW1wbGF0ZVRlbXBsYXRlUGFybVBhY2sKKyAgfTsKKworICBUZW1wbGF0ZU5hbWUoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFRlbXBsYXRlTmFtZShUZW1wbGF0ZURlY2wgKlRlbXBsYXRlKTsKKyAgZXhwbGljaXQgVGVtcGxhdGVOYW1lKE92ZXJsb2FkZWRUZW1wbGF0ZVN0b3JhZ2UgKlN0b3JhZ2UpOworICBleHBsaWNpdCBUZW1wbGF0ZU5hbWUoU3Vic3RUZW1wbGF0ZVRlbXBsYXRlUGFybVN0b3JhZ2UgKlN0b3JhZ2UpOworICBleHBsaWNpdCBUZW1wbGF0ZU5hbWUoU3Vic3RUZW1wbGF0ZVRlbXBsYXRlUGFybVBhY2tTdG9yYWdlICpTdG9yYWdlKTsKKyAgZXhwbGljaXQgVGVtcGxhdGVOYW1lKFF1YWxpZmllZFRlbXBsYXRlTmFtZSAqUXVhbCk7CisgIGV4cGxpY2l0IFRlbXBsYXRlTmFtZShEZXBlbmRlbnRUZW1wbGF0ZU5hbWUgKkRlcCk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHRlbXBsYXRlIG5hbWUgaXMgTlVMTC4KKyAgYm9vbCBpc051bGwoKSBjb25zdDsKKyAgCisgIC8vIFxicmllZiBHZXQgdGhlIGtpbmQgb2YgbmFtZSB0aGF0IGlzIGFjdHVhbGx5IHN0b3JlZC4KKyAgTmFtZUtpbmQgZ2V0S2luZCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHVuZGVybHlpbmcgdGVtcGxhdGUgZGVjbGFyYXRpb24gdGhhdAorICAvLy8gdGhpcyB0ZW1wbGF0ZSBuYW1lIHJlZmVycyB0bywgaWYga25vd24uCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIHRlbXBsYXRlIGRlY2xhcmF0aW9uIHRoYXQgdGhpcyB0ZW1wbGF0ZSBuYW1lIHJlZmVycworICAvLy8gdG8sIGlmIGFueS4gSWYgdGhlIHRlbXBsYXRlIG5hbWUgZG9lcyBub3QgcmVmZXIgdG8gYSBzcGVjaWZpYworICAvLy8gZGVjbGFyYXRpb24gYmVjYXVzZSBpdCBpcyBhIGRlcGVuZGVudCBuYW1lLCBvciBpZiBpdCByZWZlcnMgdG8gYQorICAvLy8gc2V0IG9mIGZ1bmN0aW9uIHRlbXBsYXRlcywgcmV0dXJucyBOVUxMLgorICBUZW1wbGF0ZURlY2wgKmdldEFzVGVtcGxhdGVEZWNsKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdW5kZXJseWluZywgb3ZlcmxvYWRlZCBmdW5jdGlvbiB0ZW1wbGF0ZQorICAvLyBkZWNsYXJhdGlvbnMgdGhhdCB0aGlzIHRlbXBsYXRlIG5hbWUgcmVmZXJzIHRvLCBpZiBrbm93bi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBUaGUgc2V0IG9mIG92ZXJsb2FkZWQgZnVuY3Rpb24gdGVtcGxhdGVzIHRoYXQgdGhpcyB0ZW1wbGF0ZQorICAvLy8gbmFtZSByZWZlcnMgdG8sIGlmIGtub3duLiBJZiB0aGUgdGVtcGxhdGUgbmFtZSBkb2VzIG5vdCByZWZlciB0byBhCisgIC8vLyBzcGVjaWZpYyBzZXQgb2YgZnVuY3Rpb24gdGVtcGxhdGVzIGJlY2F1c2UgaXQgaXMgYSBkZXBlbmRlbnQgbmFtZSBvcgorICAvLy8gcmVmZXJzIHRvIGEgc2luZ2xlIHRlbXBsYXRlLCByZXR1cm5zIE5VTEwuCisgIE92ZXJsb2FkZWRUZW1wbGF0ZVN0b3JhZ2UgKmdldEFzT3ZlcmxvYWRlZFRlbXBsYXRlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc3Vic3RpdHV0ZWQgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyLCBpZiAKKyAgLy8vIGtub3duLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSBzdG9yYWdlIGZvciB0aGUgc3Vic3RpdHV0ZWQgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyLAorICAvLy8gaWYga25vd24uIE90aGVyd2lzZSwgcmV0dXJucyBOVUxMLgorICBTdWJzdFRlbXBsYXRlVGVtcGxhdGVQYXJtU3RvcmFnZSAqZ2V0QXNTdWJzdFRlbXBsYXRlVGVtcGxhdGVQYXJtKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc3Vic3RpdHV0ZWQgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyIHBhY2ssIGlmIAorICAvLy8ga25vd24uCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIHN0b3JhZ2UgZm9yIHRoZSBzdWJzdGl0dXRlZCB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgcGFjaywKKyAgLy8vIGlmIGtub3duLiBPdGhlcndpc2UsIHJldHVybnMgTlVMTC4KKyAgU3Vic3RUZW1wbGF0ZVRlbXBsYXRlUGFybVBhY2tTdG9yYWdlICoKKyAgZ2V0QXNTdWJzdFRlbXBsYXRlVGVtcGxhdGVQYXJtUGFjaygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHVuZGVybHlpbmcgcXVhbGlmaWVkIHRlbXBsYXRlIG5hbWUKKyAgLy8vIHN0cnVjdHVyZSwgaWYgYW55LgorICBRdWFsaWZpZWRUZW1wbGF0ZU5hbWUgKmdldEFzUXVhbGlmaWVkVGVtcGxhdGVOYW1lKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdW5kZXJseWluZyBkZXBlbmRlbnQgdGVtcGxhdGUgbmFtZQorICAvLy8gc3RydWN0dXJlLCBpZiBhbnkuCisgIERlcGVuZGVudFRlbXBsYXRlTmFtZSAqZ2V0QXNEZXBlbmRlbnRUZW1wbGF0ZU5hbWUoKSBjb25zdDsKKworICBUZW1wbGF0ZU5hbWUgZ2V0VW5kZXJseWluZygpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIHRlbXBsYXRlIG5hbWUgdG8gc3Vic3RpdHV0ZSB3aGVuIHRoaXMgdGVtcGxhdGUgbmFtZSBpcyB1c2VkIGFzIGEKKyAgLy8vIHRlbXBsYXRlIHRlbXBsYXRlIGFyZ3VtZW50LiBUaGlzIHJlZmVycyB0byB0aGUgbW9zdCByZWNlbnQgZGVjbGFyYXRpb24gb2YKKyAgLy8vIHRoZSB0ZW1wbGF0ZSwgaW5jbHVkaW5nIGFueSBkZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50cy4KKyAgVGVtcGxhdGVOYW1lIGdldE5hbWVUb1N1YnN0aXR1dGUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB0aGlzIGlzIGEgZGVwZW5kZW50IHRlbXBsYXRlIG5hbWUuCisgIGJvb2wgaXNEZXBlbmRlbnQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB0aGlzIGlzIGEgdGVtcGxhdGUgbmFtZSB0aGF0IHNvbWVob3cKKyAgLy8vIGRlcGVuZHMgb24gYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCisgIGJvb2wgaXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyB0ZW1wbGF0ZSBuYW1lIGNvbnRhaW5zIGFuCisgIC8vLyB1bmV4cGFuZGVkIHBhcmFtZXRlciBwYWNrIChmb3IgQysrMHggdmFyaWFkaWMgdGVtcGxhdGVzKS4KKyAgYm9vbCBjb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBQcmludCB0aGUgdGVtcGxhdGUgbmFtZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gT1MgdGhlIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggdGhlIHRlbXBsYXRlIG5hbWUgd2lsbCBiZQorICAvLy8gcHJpbnRlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3VwcHJlc3NOTlMgaWYgdHJ1ZSwgZG9uJ3QgcHJpbnQgdGhlCisgIC8vLyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgdGhhdCBwcmVjZWRlcyB0aGUgdGVtcGxhdGUgbmFtZSAoaWYgaXQgaGFzCisgIC8vLyBvbmUpLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSwKKyAgICAgICAgICAgICBib29sIFN1cHByZXNzTk5TID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGVidWdnaW5nIGFpZCB0aGF0IGR1bXBzIHRoZSB0ZW1wbGF0ZSBuYW1lLgorICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERlYnVnZ2luZyBhaWQgdGhhdCBkdW1wcyB0aGUgdGVtcGxhdGUgbmFtZSB0byBzdGFuZGFyZAorICAvLy8gZXJyb3IuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIElELkFkZFBvaW50ZXIoU3RvcmFnZS5nZXRPcGFxdWVWYWx1ZSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHRlbXBsYXRlIG5hbWUgYXMgYSB2b2lkIHBvaW50ZXIuCisgIHZvaWQgKmdldEFzVm9pZFBvaW50ZXIoKSBjb25zdCB7IHJldHVybiBTdG9yYWdlLmdldE9wYXF1ZVZhbHVlKCk7IH0KKworICAvLy8gXGJyaWVmIEJ1aWxkIGEgdGVtcGxhdGUgbmFtZSBmcm9tIGEgdm9pZCBwb2ludGVyLgorICBzdGF0aWMgVGVtcGxhdGVOYW1lIGdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQdHIpIHsKKyAgICByZXR1cm4gVGVtcGxhdGVOYW1lKFB0cik7CisgIH0KK307CisKKy8vLyBJbnNlcnRpb24gb3BlcmF0b3IgZm9yIGRpYWdub3N0aWNzLiAgVGhpcyBhbGxvd3Mgc2VuZGluZyBUZW1wbGF0ZU5hbWUncworLy8vIGludG8gYSBkaWFnbm9zdGljIHdpdGggPDwuCitjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmb3BlcmF0b3I8PChjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmREIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZU5hbWUgTik7CisKKy8vLyBcYnJpZWYgQSBzdHJ1Y3R1cmUgZm9yIHN0b3JpbmcgdGhlIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhCisvLy8gc3Vic3RpdHV0ZWQgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyLgorY2xhc3MgU3Vic3RUZW1wbGF0ZVRlbXBsYXRlUGFybVN0b3JhZ2UKKyAgOiBwdWJsaWMgVW5jb21tb25UZW1wbGF0ZU5hbWVTdG9yYWdlLCBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsKKworICBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2wgKlBhcmFtZXRlcjsKKyAgVGVtcGxhdGVOYW1lIFJlcGxhY2VtZW50OworCisgIFN1YnN0VGVtcGxhdGVUZW1wbGF0ZVBhcm1TdG9yYWdlKFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCAqcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZU5hbWUgcmVwbGFjZW1lbnQpCisgICAgICA6IFVuY29tbW9uVGVtcGxhdGVOYW1lU3RvcmFnZShTdWJzdFRlbXBsYXRlVGVtcGxhdGVQYXJtLCAwKSwKKyAgICAgICAgUGFyYW1ldGVyKHBhcmFtZXRlciksIFJlcGxhY2VtZW50KHJlcGxhY2VtZW50KSB7fQorCitwdWJsaWM6CisgIFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCAqZ2V0UGFyYW1ldGVyKCkgY29uc3QgeyByZXR1cm4gUGFyYW1ldGVyOyB9CisgIFRlbXBsYXRlTmFtZSBnZXRSZXBsYWNlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFJlcGxhY2VtZW50OyB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKTsKKyAgCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsCisgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsICpwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVOYW1lIHJlcGxhY2VtZW50KTsKK307CisKK2lubGluZSBUZW1wbGF0ZU5hbWUgVGVtcGxhdGVOYW1lOjpnZXRVbmRlcmx5aW5nKCkgY29uc3QgeworICBpZiAoU3Vic3RUZW1wbGF0ZVRlbXBsYXRlUGFybVN0b3JhZ2UgKnN1YnN0CisgICAgICAgID0gZ2V0QXNTdWJzdFRlbXBsYXRlVGVtcGxhdGVQYXJtKCkpCisgICAgcmV0dXJuIHN1YnN0LT5nZXRSZXBsYWNlbWVudCgpLmdldFVuZGVybHlpbmcoKTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSB0ZW1wbGF0ZSBuYW1lIHRoYXQgd2FzIGV4cHJlc3NlZCBhcyBhCisvLy8gcXVhbGlmaWVkIG5hbWUuCisvLy8KKy8vLyBUaGlzIGtpbmQgb2YgdGVtcGxhdGUgbmFtZSByZWZlcnMgdG8gYSB0ZW1wbGF0ZSBuYW1lIHRoYXQgd2FzCisvLy8gcHJlY2VkZWQgYnkgYSBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIsIGUuZy4sIFxjIHN0ZDo6dmVjdG9yLiBIZXJlLAorLy8vIHRoZSBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIgaXMgInN0ZDo6IiBhbmQgdGhlIHRlbXBsYXRlIG5hbWUgaXMgdGhlCisvLy8gZGVjbGFyYXRpb24gZm9yICJ2ZWN0b3IiLiBUaGUgUXVhbGlmaWVkVGVtcGxhdGVOYW1lIGNsYXNzIGlzIG9ubHkKKy8vLyB1c2VkIHRvIHByb3ZpZGUgInN1Z2FyIiBmb3IgdGVtcGxhdGUgbmFtZXMgdGhhdCB3ZXJlIGV4cHJlc3NlZAorLy8vIHdpdGggYSBxdWFsaWZpZWQgbmFtZSwgYW5kIGhhcyBubyBzZW1hbnRpYyBtZWFuaW5nLiBJbiB0aGlzCisvLy8gbWFubmVyLCBpdCBpcyB0byBUZW1wbGF0ZU5hbWUgd2hhdCBFbGFib3JhdGVkVHlwZSBpcyB0byBUeXBlLAorLy8vIHByb3ZpZGluZyBleHRyYSBzeW50YWN0aWMgc3VnYXIgZm9yIGRvd25zdHJlYW0gY2xpZW50cy4KK2NsYXNzIFF1YWxpZmllZFRlbXBsYXRlTmFtZSA6IHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RDb250ZXh0OworCisgIC8vLyBcYnJpZWYgVGhlIG5lc3RlZCBuYW1lIHNwZWNpZmllciB0aGF0IHF1YWxpZmllcyB0aGUgdGVtcGxhdGUgbmFtZS4KKyAgLy8vCisgIC8vLyBUaGUgYml0IGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgInRlbXBsYXRlIiBrZXl3b3JkIHdhcworICAvLy8gcHJlc2VudCBiZWZvcmUgdGhlIHRlbXBsYXRlIG5hbWUgaXRzZWxmLiBOb3RlIHRoYXQgdGhlCisgIC8vLyAidGVtcGxhdGUiIGtleXdvcmQgaXMgYWx3YXlzIHJlZHVuZGFudCBpbiB0aGlzIGNhc2UgKG90aGVyd2lzZSwKKyAgLy8vIHRoZSB0ZW1wbGF0ZSBuYW1lIHdvdWxkIGJlIGEgZGVwZW5kZW50IG5hbWUgYW5kIHdlIHdvdWxkIGV4cHJlc3MKKyAgLy8vIHRoaXMgbmFtZSB3aXRoIERlcGVuZGVudFRlbXBsYXRlTmFtZSkuCisgIGxsdm06OlBvaW50ZXJJbnRQYWlyPE5lc3RlZE5hbWVTcGVjaWZpZXIgKiwgMT4gUXVhbGlmaWVyOworCisgIC8vLyBcYnJpZWYgVGhlIHRlbXBsYXRlIGRlY2xhcmF0aW9uIG9yIHNldCBvZiBvdmVybG9hZGVkIGZ1bmN0aW9uIHRlbXBsYXRlcworICAvLy8gdGhhdCB0aGlzIHF1YWxpZmllZCBuYW1lIHJlZmVycyB0by4KKyAgVGVtcGxhdGVEZWNsICpUZW1wbGF0ZTsKKworICBRdWFsaWZpZWRUZW1wbGF0ZU5hbWUoTmVzdGVkTmFtZVNwZWNpZmllciAqTk5TLCBib29sIFRlbXBsYXRlS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlRGVjbCAqVGVtcGxhdGUpCisgICAgICA6IFF1YWxpZmllcihOTlMsIFRlbXBsYXRlS2V5d29yZD8gMSA6IDApLCBUZW1wbGF0ZShUZW1wbGF0ZSkge30KKworcHVibGljOgorICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbmVzdGVkIG5hbWUgc3BlY2lmaWVyIHRoYXQgcXVhbGlmaWVzIHRoaXMgbmFtZS4KKyAgTmVzdGVkTmFtZVNwZWNpZmllciAqZ2V0UXVhbGlmaWVyKCkgY29uc3QgeyByZXR1cm4gUXVhbGlmaWVyLmdldFBvaW50ZXIoKTsgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgdGVtcGxhdGUgbmFtZSB3YXMgcHJlZml4ZWQgYnkgdGhlICJ0ZW1wbGF0ZSIKKyAgLy8vIGtleXdvcmQuCisgIGJvb2wgaGFzVGVtcGxhdGVLZXl3b3JkKCkgY29uc3QgeyByZXR1cm4gUXVhbGlmaWVyLmdldEludCgpOyB9CisKKyAgLy8vIFxicmllZiBUaGUgdGVtcGxhdGUgZGVjbGFyYXRpb24gdGhhdCB0aGlzIHF1YWxpZmllZCBuYW1lIHJlZmVycworICAvLy8gdG8uCisgIFRlbXBsYXRlRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IHsgcmV0dXJuIFRlbXBsYXRlOyB9CisKKyAgLy8vIFxicmllZiBUaGUgdGVtcGxhdGUgZGVjbGFyYXRpb24gdG8gd2hpY2ggdGhpcyBxdWFsaWZpZWQgbmFtZQorICAvLy8gcmVmZXJzLgorICBUZW1wbGF0ZURlY2wgKmdldFRlbXBsYXRlRGVjbCgpIGNvbnN0IHsgcmV0dXJuIFRlbXBsYXRlOyB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgUHJvZmlsZShJRCwgZ2V0UXVhbGlmaWVyKCksIGhhc1RlbXBsYXRlS2V5d29yZCgpLCBnZXRUZW1wbGF0ZURlY2woKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELCBOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlMsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBUZW1wbGF0ZUtleXdvcmQsIFRlbXBsYXRlRGVjbCAqVGVtcGxhdGUpIHsKKyAgICBJRC5BZGRQb2ludGVyKE5OUyk7CisgICAgSUQuQWRkQm9vbGVhbihUZW1wbGF0ZUtleXdvcmQpOworICAgIElELkFkZFBvaW50ZXIoVGVtcGxhdGUpOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBkZXBlbmRlbnQgdGVtcGxhdGUgbmFtZSB0aGF0IGNhbm5vdCBiZQorLy8vIHJlc29sdmVkIHByaW9yIHRvIHRlbXBsYXRlIGluc3RhbnRpYXRpb24uCisvLy8KKy8vLyBUaGlzIGtpbmQgb2YgdGVtcGxhdGUgbmFtZSByZWZlcnMgdG8gYSBkZXBlbmRlbnQgdGVtcGxhdGUgbmFtZSwKKy8vLyBpbmNsdWRpbmcgaXRzIG5lc3RlZCBuYW1lIHNwZWNpZmllciAoaWYgYW55KS4gRm9yIGV4YW1wbGUsCisvLy8gRGVwZW5kZW50VGVtcGxhdGVOYW1lIGNhbiByZWZlciB0byAiTWV0YUZ1bjo6dGVtcGxhdGUgYXBwbHkiLAorLy8vIHdoZXJlICJNZXRhRnVuOjoiIGlzIHRoZSBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIgYW5kICJhcHBseSIgaXMgdGhlCisvLy8gdGVtcGxhdGUgbmFtZSByZWZlcmVuY2VkLiBUaGUgInRlbXBsYXRlIiBrZXl3b3JkIGlzIGltcGxpZWQuCitjbGFzcyBEZXBlbmRlbnRUZW1wbGF0ZU5hbWUgOiBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsKKworICAvLy8gXGJyaWVmIFRoZSBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIgdGhhdCBxdWFsaWZpZXMgdGhlIHRlbXBsYXRlCisgIC8vLyBuYW1lLgorICAvLy8KKyAgLy8vIFRoZSBiaXQgc3RvcmVkIGluIHRoaXMgcXVhbGlmaWVyIGRlc2NyaWJlcyB3aGV0aGVyIHRoZSBcYyBOYW1lIGZpZWxkCisgIC8vLyBpcyBpbnRlcnByZXRlZCBhcyBhbiBJZGVudGlmaWVySW5mbyBwb2ludGVyICh3aGVuIGNsZWFyKSBvciBhcyBhbgorICAvLy8gb3ZlcmxvYWRlZCBvcGVyYXRvciBraW5kICh3aGVuIHNldCkuCisgIGxsdm06OlBvaW50ZXJJbnRQYWlyPE5lc3RlZE5hbWVTcGVjaWZpZXIgKiwgMSwgYm9vbD4gUXVhbGlmaWVyOworCisgIC8vLyBcYnJpZWYgVGhlIGRlcGVuZGVudCB0ZW1wbGF0ZSBuYW1lLgorICB1bmlvbiB7CisgICAgLy8vIFxicmllZiBUaGUgaWRlbnRpZmllciB0ZW1wbGF0ZSBuYW1lLgorICAgIC8vLworICAgIC8vLyBPbmx5IHZhbGlkIHdoZW4gdGhlIGJpdCBvbiBcYyBRdWFsaWZpZXIgaXMgY2xlYXIuCisgICAgY29uc3QgSWRlbnRpZmllckluZm8gKklkZW50aWZpZXI7CisgICAgCisgICAgLy8vIFxicmllZiBUaGUgb3ZlcmxvYWRlZCBvcGVyYXRvciBuYW1lLgorICAgIC8vLworICAgIC8vLyBPbmx5IHZhbGlkIHdoZW4gdGhlIGJpdCBvbiBcYyBRdWFsaWZpZXIgaXMgc2V0LgorICAgIE92ZXJsb2FkZWRPcGVyYXRvcktpbmQgT3BlcmF0b3I7CisgIH07CisKKyAgLy8vIFxicmllZiBUaGUgY2Fub25pY2FsIHRlbXBsYXRlIG5hbWUgdG8gd2hpY2ggdGhpcyBkZXBlbmRlbnQKKyAgLy8vIHRlbXBsYXRlIG5hbWUgcmVmZXJzLgorICAvLy8KKyAgLy8vIFRoZSBjYW5vbmljYWwgdGVtcGxhdGUgbmFtZSBmb3IgYSBkZXBlbmRlbnQgdGVtcGxhdGUgbmFtZSBpcworICAvLy8gYW5vdGhlciBkZXBlbmRlbnQgdGVtcGxhdGUgbmFtZSB3aG9zZSBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIgaXMKKyAgLy8vIGNhbm9uaWNhbC4KKyAgVGVtcGxhdGVOYW1lIENhbm9uaWNhbFRlbXBsYXRlTmFtZTsKKworICBEZXBlbmRlbnRUZW1wbGF0ZU5hbWUoTmVzdGVkTmFtZVNwZWNpZmllciAqUXVhbGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSWRlbnRpZmllckluZm8gKklkZW50aWZpZXIpCisgICAgICA6IFF1YWxpZmllcihRdWFsaWZpZXIsIGZhbHNlKSwgSWRlbnRpZmllcihJZGVudGlmaWVyKSwgCisgICAgICAgIENhbm9uaWNhbFRlbXBsYXRlTmFtZSh0aGlzKSB7fQorCisgIERlcGVuZGVudFRlbXBsYXRlTmFtZShOZXN0ZWROYW1lU3BlY2lmaWVyICpRdWFsaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJZGVudGlmaWVySW5mbyAqSWRlbnRpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlTmFtZSBDYW5vbikKKyAgICAgIDogUXVhbGlmaWVyKFF1YWxpZmllciwgZmFsc2UpLCBJZGVudGlmaWVyKElkZW50aWZpZXIpLCAKKyAgICAgICAgQ2Fub25pY2FsVGVtcGxhdGVOYW1lKENhbm9uKSB7fQorCisgIERlcGVuZGVudFRlbXBsYXRlTmFtZShOZXN0ZWROYW1lU3BlY2lmaWVyICpRdWFsaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBPdmVybG9hZGVkT3BlcmF0b3JLaW5kIE9wZXJhdG9yKQorICAgICAgOiBRdWFsaWZpZXIoUXVhbGlmaWVyLCB0cnVlKSwgT3BlcmF0b3IoT3BlcmF0b3IpLCAKKyAgICAgICAgQ2Fub25pY2FsVGVtcGxhdGVOYW1lKHRoaXMpIHt9CisgIAorICBEZXBlbmRlbnRUZW1wbGF0ZU5hbWUoTmVzdGVkTmFtZVNwZWNpZmllciAqUXVhbGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE9wZXJhdG9yS2luZCBPcGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlTmFtZSBDYW5vbikKKyAgICAgICA6IFF1YWxpZmllcihRdWFsaWZpZXIsIHRydWUpLCBPcGVyYXRvcihPcGVyYXRvciksIAorICAgICAgICAgQ2Fub25pY2FsVGVtcGxhdGVOYW1lKENhbm9uKSB7fQorICAKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG5lc3RlZCBuYW1lIHNwZWNpZmllciB0aGF0IHF1YWxpZmllcyB0aGlzIG5hbWUuCisgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKmdldFF1YWxpZmllcigpIGNvbnN0IHsgcmV0dXJuIFF1YWxpZmllci5nZXRQb2ludGVyKCk7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgdGVtcGxhdGUgbmFtZSByZWZlcnMgdG8gYW4gaWRlbnRpZmllci4KKyAgYm9vbCBpc0lkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiAhUXVhbGlmaWVyLmdldEludCgpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIHRvIHdoaWNoIHRoaXMgdGVtcGxhdGUgbmFtZSByZWZlcnMuCisgIGNvbnN0IElkZW50aWZpZXJJbmZvICpnZXRJZGVudGlmaWVyKCkgY29uc3QgeyAKKyAgICBhc3NlcnQoaXNJZGVudGlmaWVyKCkgJiYgIlRlbXBsYXRlIG5hbWUgaXNuJ3QgYW4gaWRlbnRpZmllcj8iKTsKKyAgICByZXR1cm4gSWRlbnRpZmllcjsKKyAgfQorICAKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHRlbXBsYXRlIG5hbWUgcmVmZXJzIHRvIGFuIG92ZXJsb2FkZWQKKyAgLy8vIG9wZXJhdG9yLgorICBib29sIGlzT3ZlcmxvYWRlZE9wZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gUXVhbGlmaWVyLmdldEludCgpOyB9CisgIAorICAvLy8gXGJyaWVmIFJldHVybiB0aGUgb3ZlcmxvYWRlZCBvcGVyYXRvciB0byB3aGljaCB0aGlzIHRlbXBsYXRlIG5hbWUgcmVmZXJzLgorICBPdmVybG9hZGVkT3BlcmF0b3JLaW5kIGdldE9wZXJhdG9yKCkgY29uc3QgeyAKKyAgICBhc3NlcnQoaXNPdmVybG9hZGVkT3BlcmF0b3IoKSAmJgorICAgICAgICAgICAiVGVtcGxhdGUgbmFtZSBpc24ndCBhbiBvdmVybG9hZGVkIG9wZXJhdG9yPyIpOworICAgIHJldHVybiBPcGVyYXRvcjsgCisgIH0KKyAgCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIGlmIChpc0lkZW50aWZpZXIoKSkKKyAgICAgIFByb2ZpbGUoSUQsIGdldFF1YWxpZmllcigpLCBnZXRJZGVudGlmaWVyKCkpOworICAgIGVsc2UKKyAgICAgIFByb2ZpbGUoSUQsIGdldFF1YWxpZmllcigpLCBnZXRPcGVyYXRvcigpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJZGVudGlmaWVySW5mbyAqSWRlbnRpZmllcikgeworICAgIElELkFkZFBvaW50ZXIoTk5TKTsKKyAgICBJRC5BZGRCb29sZWFuKGZhbHNlKTsKKyAgICBJRC5BZGRQb2ludGVyKElkZW50aWZpZXIpOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgTmVzdGVkTmFtZVNwZWNpZmllciAqTk5TLAorICAgICAgICAgICAgICAgICAgICAgIE92ZXJsb2FkZWRPcGVyYXRvcktpbmQgT3BlcmF0b3IpIHsKKyAgICBJRC5BZGRQb2ludGVyKE5OUyk7CisgICAgSUQuQWRkQm9vbGVhbih0cnVlKTsKKyAgICBJRC5BZGRJbnRlZ2VyKE9wZXJhdG9yKTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcuCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBUaGUgY2xhbmc6OlRlbXBsYXRlTmFtZSBjbGFzcyBpcyBlZmZlY3RpdmVseSBhIHBvaW50ZXIuCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgUG9pbnRlckxpa2VUeXBlVHJhaXRzPGNsYW5nOjpUZW1wbGF0ZU5hbWU+IHsKKyAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKGNsYW5nOjpUZW1wbGF0ZU5hbWUgVE4pIHsKKyAgICByZXR1cm4gVE4uZ2V0QXNWb2lkUG9pbnRlcigpOworICB9CisKKyAgc3RhdGljIGlubGluZSBjbGFuZzo6VGVtcGxhdGVOYW1lIGdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQdHIpIHsKKyAgICByZXR1cm4gY2xhbmc6OlRlbXBsYXRlTmFtZTo6Z2V0RnJvbVZvaWRQb2ludGVyKFB0cik7CisgIH0KKworICAvLyBObyBiaXRzIGFyZSBhdmFpbGFibGUhCisgIGVudW0geyBOdW1Mb3dCaXRzQXZhaWxhYmxlID0gMCB9OworfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bS4KKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUX1RFTVBMQVRFTkFNRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvVHlwZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWJiMTMzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1R5cGUuaApAQCAtMCwwICsxLDY0ODcgQEAKKy8vPT09LSBUeXBlLmggLSBDIExhbmd1YWdlIEZhbWlseSBUeXBlIFJlcHJlc2VudGF0aW9uIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIEMgTGFuZ3VhZ2UgRmFtaWx5IFR5cGUgUmVwcmVzZW50YXRpb24KKy8vLworLy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBjbGFuZzo6VHlwZSBpbnRlcmZhY2UgYW5kIHN1YmNsYXNzZXMsIHVzZWQgdG8KKy8vLyByZXByZXNlbnQgdHlwZXMgZm9yIGxhbmd1YWdlcyBpbiB0aGUgQyBmYW1pbHkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9UWVBFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfVFlQRV9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvTmVzdGVkTmFtZVNwZWNpZmllci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UZW1wbGF0ZU5hbWUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9BZGRyZXNzU3BhY2VzLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0V4Y2VwdGlvblNwZWNpZmljYXRpb25UeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xpbmthZ2UuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9QYXJ0aWFsRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU3BlY2lmaWVycy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Zpc2liaWxpdHkuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlclVuaW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgRXh0UXVhbHM7CitjbGFzcyBRdWFsVHlwZTsKK2NsYXNzIFR5cGU7CisKK2VudW0geworICBUeXBlQWxpZ25tZW50SW5CaXRzID0gNCwKKyAgVHlwZUFsaWdubWVudCA9IDEgPDwgVHlwZUFsaWdubWVudEluQml0cworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworbmFtZXNwYWNlIGxsdm0geworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJ1Y3QgUG9pbnRlckxpa2VUeXBlVHJhaXRzOworICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBQb2ludGVyTGlrZVR5cGVUcmFpdHM8IDo6Y2xhbmc6OlR5cGUqPiB7CisgICAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKDo6Y2xhbmc6OlR5cGUgKlApIHsgcmV0dXJuIFA7IH0KKworICAgIHN0YXRpYyBpbmxpbmUgOjpjbGFuZzo6VHlwZSAqZ2V0RnJvbVZvaWRQb2ludGVyKHZvaWQgKlApIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDwgOjpjbGFuZzo6VHlwZSo+KFApOworICAgIH0KKworICAgIGVudW0geyBOdW1Mb3dCaXRzQXZhaWxhYmxlID0gY2xhbmc6OlR5cGVBbGlnbm1lbnRJbkJpdHMgfTsKKyAgfTsKKworICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBQb2ludGVyTGlrZVR5cGVUcmFpdHM8IDo6Y2xhbmc6OkV4dFF1YWxzKj4geworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0QXNWb2lkUG9pbnRlcig6OmNsYW5nOjpFeHRRdWFscyAqUCkgeyByZXR1cm4gUDsgfQorCisgICAgc3RhdGljIGlubGluZSA6OmNsYW5nOjpFeHRRdWFscyAqZ2V0RnJvbVZvaWRQb2ludGVyKHZvaWQgKlApIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDwgOjpjbGFuZzo6RXh0UXVhbHMqPihQKTsKKyAgICB9CisKKyAgICBlbnVtIHsgTnVtTG93Qml0c0F2YWlsYWJsZSA9IGNsYW5nOjpUeXBlQWxpZ25tZW50SW5CaXRzIH07CisgIH07CisKKyAgdGVtcGxhdGUgPD4KKyAgc3RydWN0IGlzUG9kTGlrZTxjbGFuZzo6UXVhbFR5cGU+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFycmF5VHlwZTsKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBBdHRyaWJ1dGVkVHlwZTsKK2NsYXNzIEF1dG9UeXBlOworY2xhc3MgQnVpbHRpblR5cGU7Cit0ZW1wbGF0ZSA8dHlwZW5hbWU+IGNsYXNzIENhblF1YWw7CitjbGFzcyBDb21wbGV4VHlwZTsKK2NsYXNzIENYWFJlY29yZERlY2w7CitjbGFzcyBEZWNsQ29udGV4dDsKK2NsYXNzIERlZHVjZWRUeXBlOworY2xhc3MgRW51bURlY2w7CitjbGFzcyBFeHByOworY2xhc3MgRXh0UXVhbHNUeXBlQ29tbW9uQmFzZTsKK2NsYXNzIEZ1bmN0aW9uRGVjbDsKK2NsYXNzIEZ1bmN0aW9uTm9Qcm90b1R5cGU7CitjbGFzcyBGdW5jdGlvblByb3RvVHlwZTsKK2NsYXNzIElkZW50aWZpZXJJbmZvOworY2xhc3MgSW5qZWN0ZWRDbGFzc05hbWVUeXBlOworY2xhc3MgTmFtZWREZWNsOworY2xhc3MgT2JqQ0ludGVyZmFjZURlY2w7CitjbGFzcyBPYmpDT2JqZWN0UG9pbnRlclR5cGU7CitjbGFzcyBPYmpDT2JqZWN0VHlwZTsKK2NsYXNzIE9iakNQcm90b2NvbERlY2w7CitjbGFzcyBPYmpDVHlwZVBhcmFtRGVjbDsKK2NsYXNzIFBhcmVuVHlwZTsKK3N0cnVjdCBQcmludGluZ1BvbGljeTsKK2NsYXNzIFJlY29yZERlY2w7CitjbGFzcyBSZWNvcmRUeXBlOworY2xhc3MgU3RtdDsKK2NsYXNzIFRhZ0RlY2w7CitjbGFzcyBUZW1wbGF0ZUFyZ3VtZW50OworY2xhc3MgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvOworY2xhc3MgVGVtcGxhdGVBcmd1bWVudExvYzsKK2NsYXNzIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlOworY2xhc3MgVGVtcGxhdGVUeXBlUGFybURlY2w7CitjbGFzcyBUeXBlZGVmTmFtZURlY2w7CitjbGFzcyBUeXBlZGVmVHlwZTsKK2NsYXNzIFVucmVzb2x2ZWRVc2luZ1R5cGVuYW1lRGVjbDsKKwordXNpbmcgQ2FuUXVhbFR5cGUgPSBDYW5RdWFsPFR5cGU+OworCisgIC8vIFByb3ZpZGUgZm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIGFsbCBvZiB0aGUgKlR5cGUgY2xhc3NlcworI2RlZmluZSBUWVBFKENsYXNzLCBCYXNlKSBjbGFzcyBDbGFzcyMjVHlwZTsKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZU5vZGVzLmRlZiIKKworLy8vIFRoZSBjb2xsZWN0aW9uIG9mIGFsbC10eXBlIHF1YWxpZmllcnMgd2Ugc3VwcG9ydC4KKy8vLyBDbGFuZyBzdXBwb3J0cyBmaXZlIGluZGVwZW5kZW50IHF1YWxpZmllcnM6CisvLy8gKiBDOTk6IGNvbnN0LCB2b2xhdGlsZSwgYW5kIHJlc3RyaWN0CisvLy8gKiBNUzogX191bmFsaWduZWQKKy8vLyAqIEVtYmVkZGVkIEMgKFRSMTgwMzcpOiBhZGRyZXNzIHNwYWNlcworLy8vICogT2JqZWN0aXZlIEM6IHRoZSBHQyBhdHRyaWJ1dGVzIChub25lLCB3ZWFrLCBvciBzdHJvbmcpCitjbGFzcyBRdWFsaWZpZXJzIHsKK3B1YmxpYzoKKyAgZW51bSBUUSB7IC8vIE5PVEU6IFRoZXNlIGZsYWdzIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggRGVjbFNwZWM6OlRRLgorICAgIENvbnN0ICAgID0gMHgxLAorICAgIFJlc3RyaWN0ID0gMHgyLAorICAgIFZvbGF0aWxlID0gMHg0LAorICAgIENWUk1hc2sgPSBDb25zdCB8IFZvbGF0aWxlIHwgUmVzdHJpY3QKKyAgfTsKKworICBlbnVtIEdDIHsKKyAgICBHQ05vbmUgPSAwLAorICAgIFdlYWssCisgICAgU3Ryb25nCisgIH07CisKKyAgZW51bSBPYmpDTGlmZXRpbWUgeworICAgIC8vLyBUaGVyZSBpcyBubyBsaWZldGltZSBxdWFsaWZpY2F0aW9uIG9uIHRoaXMgdHlwZS4KKyAgICBPQ0xfTm9uZSwKKworICAgIC8vLyBUaGlzIG9iamVjdCBjYW4gYmUgbW9kaWZpZWQgd2l0aG91dCByZXF1aXJpbmcgcmV0YWlucyBvcgorICAgIC8vLyByZWxlYXNlcy4KKyAgICBPQ0xfRXhwbGljaXROb25lLAorCisgICAgLy8vIEFzc2lnbmluZyBpbnRvIHRoaXMgb2JqZWN0IHJlcXVpcmVzIHRoZSBvbGQgdmFsdWUgdG8gYmUKKyAgICAvLy8gcmVsZWFzZWQgYW5kIHRoZSBuZXcgdmFsdWUgdG8gYmUgcmV0YWluZWQuICBUaGUgdGltaW5nIG9mIHRoZQorICAgIC8vLyByZWxlYXNlIG9mIHRoZSBvbGQgdmFsdWUgaXMgaW5leGFjdDogaXQgbWF5IGJlIG1vdmVkIHRvCisgICAgLy8vIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBsYXN0IGtub3duIHBvaW50IHdoZXJlIHRoZSB2YWx1ZSBpcworICAgIC8vLyBsaXZlLgorICAgIE9DTF9TdHJvbmcsCisKKyAgICAvLy8gUmVhZGluZyBvciB3cml0aW5nIGZyb20gdGhpcyBvYmplY3QgcmVxdWlyZXMgYSBiYXJyaWVyIGNhbGwuCisgICAgT0NMX1dlYWssCisKKyAgICAvLy8gQXNzaWduaW5nIGludG8gdGhpcyBvYmplY3QgcmVxdWlyZXMgYSBsaWZldGltZSBleHRlbnNpb24uCisgICAgT0NMX0F1dG9yZWxlYXNpbmcKKyAgfTsKKworICBlbnVtIHsKKyAgICAvLy8gVGhlIG1heGltdW0gc3VwcG9ydGVkIGFkZHJlc3Mgc3BhY2UgbnVtYmVyLgorICAgIC8vLyAyMyBiaXRzIHNob3VsZCBiZSBlbm91Z2ggZm9yIGFueW9uZS4KKyAgICBNYXhBZGRyZXNzU3BhY2UgPSAweDdmZmZmZnUsCisKKyAgICAvLy8gVGhlIHdpZHRoIG9mIHRoZSAiZmFzdCIgcXVhbGlmaWVyIG1hc2suCisgICAgRmFzdFdpZHRoID0gMywKKworICAgIC8vLyBUaGUgZmFzdCBxdWFsaWZpZXIgbWFzay4KKyAgICBGYXN0TWFzayA9ICgxIDw8IEZhc3RXaWR0aCkgLSAxCisgIH07CisKKyAgLy8vIFJldHVybnMgdGhlIGNvbW1vbiBzZXQgb2YgcXVhbGlmaWVycyB3aGlsZSByZW1vdmluZyB0aGVtIGZyb20KKyAgLy8vIHRoZSBnaXZlbiBzZXRzLgorICBzdGF0aWMgUXVhbGlmaWVycyByZW1vdmVDb21tb25RdWFsaWZpZXJzKFF1YWxpZmllcnMgJkwsIFF1YWxpZmllcnMgJlIpIHsKKyAgICAvLyBJZiBib3RoIGFyZSBvbmx5IENWUi1xdWFsaWZpZWQsIGJpdCBvcGVyYXRpb25zIGFyZSBzdWZmaWNpZW50LgorICAgIGlmICghKEwuTWFzayAmIH5DVlJNYXNrKSAmJiAhKFIuTWFzayAmIH5DVlJNYXNrKSkgeworICAgICAgUXVhbGlmaWVycyBROworICAgICAgUS5NYXNrID0gTC5NYXNrICYgUi5NYXNrOworICAgICAgTC5NYXNrICY9IH5RLk1hc2s7CisgICAgICBSLk1hc2sgJj0gflEuTWFzazsKKyAgICAgIHJldHVybiBROworICAgIH0KKworICAgIFF1YWxpZmllcnMgUTsKKyAgICB1bnNpZ25lZCBDb21tb25DUlYgPSBMLmdldENWUlF1YWxpZmllcnMoKSAmIFIuZ2V0Q1ZSUXVhbGlmaWVycygpOworICAgIFEuYWRkQ1ZSUXVhbGlmaWVycyhDb21tb25DUlYpOworICAgIEwucmVtb3ZlQ1ZSUXVhbGlmaWVycyhDb21tb25DUlYpOworICAgIFIucmVtb3ZlQ1ZSUXVhbGlmaWVycyhDb21tb25DUlYpOworCisgICAgaWYgKEwuZ2V0T2JqQ0dDQXR0cigpID09IFIuZ2V0T2JqQ0dDQXR0cigpKSB7CisgICAgICBRLnNldE9iakNHQ0F0dHIoTC5nZXRPYmpDR0NBdHRyKCkpOworICAgICAgTC5yZW1vdmVPYmpDR0NBdHRyKCk7CisgICAgICBSLnJlbW92ZU9iakNHQ0F0dHIoKTsKKyAgICB9CisKKyAgICBpZiAoTC5nZXRPYmpDTGlmZXRpbWUoKSA9PSBSLmdldE9iakNMaWZldGltZSgpKSB7CisgICAgICBRLnNldE9iakNMaWZldGltZShMLmdldE9iakNMaWZldGltZSgpKTsKKyAgICAgIEwucmVtb3ZlT2JqQ0xpZmV0aW1lKCk7CisgICAgICBSLnJlbW92ZU9iakNMaWZldGltZSgpOworICAgIH0KKworICAgIGlmIChMLmdldEFkZHJlc3NTcGFjZSgpID09IFIuZ2V0QWRkcmVzc1NwYWNlKCkpIHsKKyAgICAgIFEuc2V0QWRkcmVzc1NwYWNlKEwuZ2V0QWRkcmVzc1NwYWNlKCkpOworICAgICAgTC5yZW1vdmVBZGRyZXNzU3BhY2UoKTsKKyAgICAgIFIucmVtb3ZlQWRkcmVzc1NwYWNlKCk7CisgICAgfQorICAgIHJldHVybiBROworICB9CisKKyAgc3RhdGljIFF1YWxpZmllcnMgZnJvbUZhc3RNYXNrKHVuc2lnbmVkIE1hc2spIHsKKyAgICBRdWFsaWZpZXJzIFFzOworICAgIFFzLmFkZEZhc3RRdWFsaWZpZXJzKE1hc2spOworICAgIHJldHVybiBRczsKKyAgfQorCisgIHN0YXRpYyBRdWFsaWZpZXJzIGZyb21DVlJNYXNrKHVuc2lnbmVkIENWUikgeworICAgIFF1YWxpZmllcnMgUXM7CisgICAgUXMuYWRkQ1ZSUXVhbGlmaWVycyhDVlIpOworICAgIHJldHVybiBRczsKKyAgfQorCisgIHN0YXRpYyBRdWFsaWZpZXJzIGZyb21DVlJVTWFzayh1bnNpZ25lZCBDVlJVKSB7CisgICAgUXVhbGlmaWVycyBRczsKKyAgICBRcy5hZGRDVlJVUXVhbGlmaWVycyhDVlJVKTsKKyAgICByZXR1cm4gUXM7CisgIH0KKworICAvLyBEZXNlcmlhbGl6ZSBxdWFsaWZpZXJzIGZyb20gYW4gb3BhcXVlIHJlcHJlc2VudGF0aW9uLgorICBzdGF0aWMgUXVhbGlmaWVycyBmcm9tT3BhcXVlVmFsdWUodW5zaWduZWQgb3BhcXVlKSB7CisgICAgUXVhbGlmaWVycyBRczsKKyAgICBRcy5NYXNrID0gb3BhcXVlOworICAgIHJldHVybiBRczsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZSB0aGVzZSBxdWFsaWZpZXJzIGludG8gYW4gb3BhcXVlIHJlcHJlc2VudGF0aW9uLgorICB1bnNpZ25lZCBnZXRBc09wYXF1ZVZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBNYXNrOworICB9CisKKyAgYm9vbCBoYXNDb25zdCgpIGNvbnN0IHsgcmV0dXJuIE1hc2sgJiBDb25zdDsgfQorICB2b2lkIHNldENvbnN0KGJvb2wgZmxhZykgeworICAgIE1hc2sgPSAoTWFzayAmIH5Db25zdCkgfCAoZmxhZyA/IENvbnN0IDogMCk7CisgIH0KKyAgdm9pZCByZW1vdmVDb25zdCgpIHsgTWFzayAmPSB+Q29uc3Q7IH0KKyAgdm9pZCBhZGRDb25zdCgpIHsgTWFzayB8PSBDb25zdDsgfQorCisgIGJvb2wgaGFzVm9sYXRpbGUoKSBjb25zdCB7IHJldHVybiBNYXNrICYgVm9sYXRpbGU7IH0KKyAgdm9pZCBzZXRWb2xhdGlsZShib29sIGZsYWcpIHsKKyAgICBNYXNrID0gKE1hc2sgJiB+Vm9sYXRpbGUpIHwgKGZsYWcgPyBWb2xhdGlsZSA6IDApOworICB9CisgIHZvaWQgcmVtb3ZlVm9sYXRpbGUoKSB7IE1hc2sgJj0gflZvbGF0aWxlOyB9CisgIHZvaWQgYWRkVm9sYXRpbGUoKSB7IE1hc2sgfD0gVm9sYXRpbGU7IH0KKworICBib29sIGhhc1Jlc3RyaWN0KCkgY29uc3QgeyByZXR1cm4gTWFzayAmIFJlc3RyaWN0OyB9CisgIHZvaWQgc2V0UmVzdHJpY3QoYm9vbCBmbGFnKSB7CisgICAgTWFzayA9IChNYXNrICYgflJlc3RyaWN0KSB8IChmbGFnID8gUmVzdHJpY3QgOiAwKTsKKyAgfQorICB2b2lkIHJlbW92ZVJlc3RyaWN0KCkgeyBNYXNrICY9IH5SZXN0cmljdDsgfQorICB2b2lkIGFkZFJlc3RyaWN0KCkgeyBNYXNrIHw9IFJlc3RyaWN0OyB9CisKKyAgYm9vbCBoYXNDVlJRdWFsaWZpZXJzKCkgY29uc3QgeyByZXR1cm4gZ2V0Q1ZSUXVhbGlmaWVycygpOyB9CisgIHVuc2lnbmVkIGdldENWUlF1YWxpZmllcnMoKSBjb25zdCB7IHJldHVybiBNYXNrICYgQ1ZSTWFzazsgfQorICB2b2lkIHNldENWUlF1YWxpZmllcnModW5zaWduZWQgbWFzaykgeworICAgIGFzc2VydCghKG1hc2sgJiB+Q1ZSTWFzaykgJiYgImJpdG1hc2sgY29udGFpbnMgbm9uLUNWUiBiaXRzIik7CisgICAgTWFzayA9IChNYXNrICYgfkNWUk1hc2spIHwgbWFzazsKKyAgfQorICB2b2lkIHJlbW92ZUNWUlF1YWxpZmllcnModW5zaWduZWQgbWFzaykgeworICAgIGFzc2VydCghKG1hc2sgJiB+Q1ZSTWFzaykgJiYgImJpdG1hc2sgY29udGFpbnMgbm9uLUNWUiBiaXRzIik7CisgICAgTWFzayAmPSB+bWFzazsKKyAgfQorICB2b2lkIHJlbW92ZUNWUlF1YWxpZmllcnMoKSB7CisgICAgcmVtb3ZlQ1ZSUXVhbGlmaWVycyhDVlJNYXNrKTsKKyAgfQorICB2b2lkIGFkZENWUlF1YWxpZmllcnModW5zaWduZWQgbWFzaykgeworICAgIGFzc2VydCghKG1hc2sgJiB+Q1ZSTWFzaykgJiYgImJpdG1hc2sgY29udGFpbnMgbm9uLUNWUiBiaXRzIik7CisgICAgTWFzayB8PSBtYXNrOworICB9CisgIHZvaWQgYWRkQ1ZSVVF1YWxpZmllcnModW5zaWduZWQgbWFzaykgeworICAgIGFzc2VydCghKG1hc2sgJiB+Q1ZSTWFzayAmIH5VTWFzaykgJiYgImJpdG1hc2sgY29udGFpbnMgbm9uLUNWUlUgYml0cyIpOworICAgIE1hc2sgfD0gbWFzazsKKyAgfQorCisgIGJvb2wgaGFzVW5hbGlnbmVkKCkgY29uc3QgeyByZXR1cm4gTWFzayAmIFVNYXNrOyB9CisgIHZvaWQgc2V0VW5hbGlnbmVkKGJvb2wgZmxhZykgeworICAgIE1hc2sgPSAoTWFzayAmIH5VTWFzaykgfCAoZmxhZyA/IFVNYXNrIDogMCk7CisgIH0KKyAgdm9pZCByZW1vdmVVbmFsaWduZWQoKSB7IE1hc2sgJj0gflVNYXNrOyB9CisgIHZvaWQgYWRkVW5hbGlnbmVkKCkgeyBNYXNrIHw9IFVNYXNrOyB9CisKKyAgYm9vbCBoYXNPYmpDR0NBdHRyKCkgY29uc3QgeyByZXR1cm4gTWFzayAmIEdDQXR0ck1hc2s7IH0KKyAgR0MgZ2V0T2JqQ0dDQXR0cigpIGNvbnN0IHsgcmV0dXJuIEdDKChNYXNrICYgR0NBdHRyTWFzaykgPj4gR0NBdHRyU2hpZnQpOyB9CisgIHZvaWQgc2V0T2JqQ0dDQXR0cihHQyB0eXBlKSB7CisgICAgTWFzayA9IChNYXNrICYgfkdDQXR0ck1hc2spIHwgKHR5cGUgPDwgR0NBdHRyU2hpZnQpOworICB9CisgIHZvaWQgcmVtb3ZlT2JqQ0dDQXR0cigpIHsgc2V0T2JqQ0dDQXR0cihHQ05vbmUpOyB9CisgIHZvaWQgYWRkT2JqQ0dDQXR0cihHQyB0eXBlKSB7CisgICAgYXNzZXJ0KHR5cGUpOworICAgIHNldE9iakNHQ0F0dHIodHlwZSk7CisgIH0KKyAgUXVhbGlmaWVycyB3aXRob3V0T2JqQ0dDQXR0cigpIGNvbnN0IHsKKyAgICBRdWFsaWZpZXJzIHFzID0gKnRoaXM7CisgICAgcXMucmVtb3ZlT2JqQ0dDQXR0cigpOworICAgIHJldHVybiBxczsKKyAgfQorICBRdWFsaWZpZXJzIHdpdGhvdXRPYmpDTGlmZXRpbWUoKSBjb25zdCB7CisgICAgUXVhbGlmaWVycyBxcyA9ICp0aGlzOworICAgIHFzLnJlbW92ZU9iakNMaWZldGltZSgpOworICAgIHJldHVybiBxczsKKyAgfQorCisgIGJvb2wgaGFzT2JqQ0xpZmV0aW1lKCkgY29uc3QgeyByZXR1cm4gTWFzayAmIExpZmV0aW1lTWFzazsgfQorICBPYmpDTGlmZXRpbWUgZ2V0T2JqQ0xpZmV0aW1lKCkgY29uc3QgeworICAgIHJldHVybiBPYmpDTGlmZXRpbWUoKE1hc2sgJiBMaWZldGltZU1hc2spID4+IExpZmV0aW1lU2hpZnQpOworICB9CisgIHZvaWQgc2V0T2JqQ0xpZmV0aW1lKE9iakNMaWZldGltZSB0eXBlKSB7CisgICAgTWFzayA9IChNYXNrICYgfkxpZmV0aW1lTWFzaykgfCAodHlwZSA8PCBMaWZldGltZVNoaWZ0KTsKKyAgfQorICB2b2lkIHJlbW92ZU9iakNMaWZldGltZSgpIHsgc2V0T2JqQ0xpZmV0aW1lKE9DTF9Ob25lKTsgfQorICB2b2lkIGFkZE9iakNMaWZldGltZShPYmpDTGlmZXRpbWUgdHlwZSkgeworICAgIGFzc2VydCh0eXBlKTsKKyAgICBhc3NlcnQoIWhhc09iakNMaWZldGltZSgpKTsKKyAgICBNYXNrIHw9ICh0eXBlIDw8IExpZmV0aW1lU2hpZnQpOworICB9CisKKyAgLy8vIFRydWUgaWYgdGhlIGxpZmV0aW1lIGlzIG5laXRoZXIgTm9uZSBvciBFeHBsaWNpdE5vbmUuCisgIGJvb2wgaGFzTm9uVHJpdmlhbE9iakNMaWZldGltZSgpIGNvbnN0IHsKKyAgICBPYmpDTGlmZXRpbWUgbGlmZXRpbWUgPSBnZXRPYmpDTGlmZXRpbWUoKTsKKyAgICByZXR1cm4gKGxpZmV0aW1lID4gT0NMX0V4cGxpY2l0Tm9uZSk7CisgIH0KKworICAvLy8gVHJ1ZSBpZiB0aGUgbGlmZXRpbWUgaXMgZWl0aGVyIHN0cm9uZyBvciB3ZWFrLgorICBib29sIGhhc1N0cm9uZ09yV2Vha09iakNMaWZldGltZSgpIGNvbnN0IHsKKyAgICBPYmpDTGlmZXRpbWUgbGlmZXRpbWUgPSBnZXRPYmpDTGlmZXRpbWUoKTsKKyAgICByZXR1cm4gKGxpZmV0aW1lID09IE9DTF9TdHJvbmcgfHwgbGlmZXRpbWUgPT0gT0NMX1dlYWspOworICB9CisKKyAgYm9vbCBoYXNBZGRyZXNzU3BhY2UoKSBjb25zdCB7IHJldHVybiBNYXNrICYgQWRkcmVzc1NwYWNlTWFzazsgfQorICBMYW5nQVMgZ2V0QWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxMYW5nQVM+KE1hc2sgPj4gQWRkcmVzc1NwYWNlU2hpZnQpOworICB9CisgIGJvb2wgaGFzVGFyZ2V0U3BlY2lmaWNBZGRyZXNzU3BhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzVGFyZ2V0QWRkcmVzc1NwYWNlKGdldEFkZHJlc3NTcGFjZSgpKTsKKyAgfQorICAvLy8gR2V0IHRoZSBhZGRyZXNzIHNwYWNlIGF0dHJpYnV0ZSB2YWx1ZSB0byBiZSBwcmludGVkIGJ5IGRpYWdub3N0aWNzLgorICB1bnNpZ25lZCBnZXRBZGRyZXNzU3BhY2VBdHRyaWJ1dGVQcmludFZhbHVlKCkgY29uc3QgeworICAgIGF1dG8gQWRkciA9IGdldEFkZHJlc3NTcGFjZSgpOworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvc2VkIHRvIGJlIHVzZWQgd2l0aCBsYW5ndWFnZSBzcGVjaWZpYworICAgIC8vIGFkZHJlc3Mgc3BhY2VzLiBJZiB0aGF0IGhhcHBlbnMsIHRoZSBkaWFnbm9zdGljIG1lc3NhZ2Ugc2hvdWxkIGNvbnNpZGVyCisgICAgLy8gcHJpbnRpbmcgdGhlIFF1YWxUeXBlIGluc3RlYWQgb2YgdGhlIGFkZHJlc3Mgc3BhY2UgdmFsdWUuCisgICAgYXNzZXJ0KEFkZHIgPT0gTGFuZ0FTOjpEZWZhdWx0IHx8IGhhc1RhcmdldFNwZWNpZmljQWRkcmVzc1NwYWNlKCkpOworICAgIGlmIChBZGRyICE9IExhbmdBUzo6RGVmYXVsdCkKKyAgICAgIHJldHVybiB0b1RhcmdldEFkZHJlc3NTcGFjZShBZGRyKTsKKyAgICAvLyBUT0RPOiBUaGUgZGlhZ25vc3RpYyBtZXNzYWdlcyB3aGVyZSBBZGRyIG1heSBiZSAwIHNob3VsZCBiZSBmaXhlZAorICAgIC8vIHNpbmNlIGl0IGNhbm5vdCBkaWZmZXJlbnRpYXRlIHRoZSBzaXR1YXRpb24gd2hlcmUgMCBkZW5vdGVzIHRoZSBkZWZhdWx0CisgICAgLy8gYWRkcmVzcyBzcGFjZSBvciB1c2VyIHNwZWNpZmllZCBfX2F0dHJpYnV0ZV9fKChhZGRyZXNzX3NwYWNlKDApKSkuCisgICAgcmV0dXJuIDA7CisgIH0KKyAgdm9pZCBzZXRBZGRyZXNzU3BhY2UoTGFuZ0FTIHNwYWNlKSB7CisgICAgYXNzZXJ0KCh1bnNpZ25lZClzcGFjZSA8PSBNYXhBZGRyZXNzU3BhY2UpOworICAgIE1hc2sgPSAoTWFzayAmIH5BZGRyZXNzU3BhY2VNYXNrKQorICAgICAgICAgfCAoKCh1aW50MzJfdCkgc3BhY2UpIDw8IEFkZHJlc3NTcGFjZVNoaWZ0KTsKKyAgfQorICB2b2lkIHJlbW92ZUFkZHJlc3NTcGFjZSgpIHsgc2V0QWRkcmVzc1NwYWNlKExhbmdBUzo6RGVmYXVsdCk7IH0KKyAgdm9pZCBhZGRBZGRyZXNzU3BhY2UoTGFuZ0FTIHNwYWNlKSB7CisgICAgYXNzZXJ0KHNwYWNlICE9IExhbmdBUzo6RGVmYXVsdCk7CisgICAgc2V0QWRkcmVzc1NwYWNlKHNwYWNlKTsKKyAgfQorCisgIC8vIEZhc3QgcXVhbGlmaWVycyBhcmUgdGhvc2UgdGhhdCBjYW4gYmUgYWxsb2NhdGVkIGRpcmVjdGx5CisgIC8vIG9uIGEgUXVhbFR5cGUgb2JqZWN0LgorICBib29sIGhhc0Zhc3RRdWFsaWZpZXJzKCkgY29uc3QgeyByZXR1cm4gZ2V0RmFzdFF1YWxpZmllcnMoKTsgfQorICB1bnNpZ25lZCBnZXRGYXN0UXVhbGlmaWVycygpIGNvbnN0IHsgcmV0dXJuIE1hc2sgJiBGYXN0TWFzazsgfQorICB2b2lkIHNldEZhc3RRdWFsaWZpZXJzKHVuc2lnbmVkIG1hc2spIHsKKyAgICBhc3NlcnQoIShtYXNrICYgfkZhc3RNYXNrKSAmJiAiYml0bWFzayBjb250YWlucyBub24tZmFzdCBxdWFsaWZpZXIgYml0cyIpOworICAgIE1hc2sgPSAoTWFzayAmIH5GYXN0TWFzaykgfCBtYXNrOworICB9CisgIHZvaWQgcmVtb3ZlRmFzdFF1YWxpZmllcnModW5zaWduZWQgbWFzaykgeworICAgIGFzc2VydCghKG1hc2sgJiB+RmFzdE1hc2spICYmICJiaXRtYXNrIGNvbnRhaW5zIG5vbi1mYXN0IHF1YWxpZmllciBiaXRzIik7CisgICAgTWFzayAmPSB+bWFzazsKKyAgfQorICB2b2lkIHJlbW92ZUZhc3RRdWFsaWZpZXJzKCkgeworICAgIHJlbW92ZUZhc3RRdWFsaWZpZXJzKEZhc3RNYXNrKTsKKyAgfQorICB2b2lkIGFkZEZhc3RRdWFsaWZpZXJzKHVuc2lnbmVkIG1hc2spIHsKKyAgICBhc3NlcnQoIShtYXNrICYgfkZhc3RNYXNrKSAmJiAiYml0bWFzayBjb250YWlucyBub24tZmFzdCBxdWFsaWZpZXIgYml0cyIpOworICAgIE1hc2sgfD0gbWFzazsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc2V0IGNvbnRhaW5zIGFueSBxdWFsaWZpZXJzIHdoaWNoIHJlcXVpcmUgYW4gRXh0UXVhbHMKKyAgLy8vIG5vZGUgdG8gYmUgYWxsb2NhdGVkLgorICBib29sIGhhc05vbkZhc3RRdWFsaWZpZXJzKCkgY29uc3QgeyByZXR1cm4gTWFzayAmIH5GYXN0TWFzazsgfQorICBRdWFsaWZpZXJzIGdldE5vbkZhc3RRdWFsaWZpZXJzKCkgY29uc3QgeworICAgIFF1YWxpZmllcnMgUXVhbHMgPSAqdGhpczsKKyAgICBRdWFscy5zZXRGYXN0UXVhbGlmaWVycygwKTsKKyAgICByZXR1cm4gUXVhbHM7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNldCBjb250YWlucyBhbnkgcXVhbGlmaWVycy4KKyAgYm9vbCBoYXNRdWFsaWZpZXJzKCkgY29uc3QgeyByZXR1cm4gTWFzazsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gIU1hc2s7IH0KKworICAvLy8gQWRkIHRoZSBxdWFsaWZpZXJzIGZyb20gdGhlIGdpdmVuIHNldCB0byB0aGlzIHNldC4KKyAgdm9pZCBhZGRRdWFsaWZpZXJzKFF1YWxpZmllcnMgUSkgeworICAgIC8vIElmIHRoZSBvdGhlciBzZXQgZG9lc24ndCBoYXZlIGFueSBub24tYm9vbGVhbiBxdWFsaWZpZXJzLCBqdXN0CisgICAgLy8gYml0LW9yIGl0IGluLgorICAgIGlmICghKFEuTWFzayAmIH5DVlJNYXNrKSkKKyAgICAgIE1hc2sgfD0gUS5NYXNrOworICAgIGVsc2UgeworICAgICAgTWFzayB8PSAoUS5NYXNrICYgQ1ZSTWFzayk7CisgICAgICBpZiAoUS5oYXNBZGRyZXNzU3BhY2UoKSkKKyAgICAgICAgYWRkQWRkcmVzc1NwYWNlKFEuZ2V0QWRkcmVzc1NwYWNlKCkpOworICAgICAgaWYgKFEuaGFzT2JqQ0dDQXR0cigpKQorICAgICAgICBhZGRPYmpDR0NBdHRyKFEuZ2V0T2JqQ0dDQXR0cigpKTsKKyAgICAgIGlmIChRLmhhc09iakNMaWZldGltZSgpKQorICAgICAgICBhZGRPYmpDTGlmZXRpbWUoUS5nZXRPYmpDTGlmZXRpbWUoKSk7CisgICAgfQorICB9CisKKyAgLy8vIFxicmllZiBSZW1vdmUgdGhlIHF1YWxpZmllcnMgZnJvbSB0aGUgZ2l2ZW4gc2V0IGZyb20gdGhpcyBzZXQuCisgIHZvaWQgcmVtb3ZlUXVhbGlmaWVycyhRdWFsaWZpZXJzIFEpIHsKKyAgICAvLyBJZiB0aGUgb3RoZXIgc2V0IGRvZXNuJ3QgaGF2ZSBhbnkgbm9uLWJvb2xlYW4gcXVhbGlmaWVycywganVzdAorICAgIC8vIGJpdC1hbmQgdGhlIGludmVyc2UgaW4uCisgICAgaWYgKCEoUS5NYXNrICYgfkNWUk1hc2spKQorICAgICAgTWFzayAmPSB+US5NYXNrOworICAgIGVsc2UgeworICAgICAgTWFzayAmPSB+KFEuTWFzayAmIENWUk1hc2spOworICAgICAgaWYgKGdldE9iakNHQ0F0dHIoKSA9PSBRLmdldE9iakNHQ0F0dHIoKSkKKyAgICAgICAgcmVtb3ZlT2JqQ0dDQXR0cigpOworICAgICAgaWYgKGdldE9iakNMaWZldGltZSgpID09IFEuZ2V0T2JqQ0xpZmV0aW1lKCkpCisgICAgICAgIHJlbW92ZU9iakNMaWZldGltZSgpOworICAgICAgaWYgKGdldEFkZHJlc3NTcGFjZSgpID09IFEuZ2V0QWRkcmVzc1NwYWNlKCkpCisgICAgICAgIHJlbW92ZUFkZHJlc3NTcGFjZSgpOworICAgIH0KKyAgfQorCisgIC8vLyBBZGQgdGhlIHF1YWxpZmllcnMgZnJvbSB0aGUgZ2l2ZW4gc2V0IHRvIHRoaXMgc2V0LCBnaXZlbiB0aGF0CisgIC8vLyB0aGV5IGRvbid0IGNvbmZsaWN0LgorICB2b2lkIGFkZENvbnNpc3RlbnRRdWFsaWZpZXJzKFF1YWxpZmllcnMgcXMpIHsKKyAgICBhc3NlcnQoZ2V0QWRkcmVzc1NwYWNlKCkgPT0gcXMuZ2V0QWRkcmVzc1NwYWNlKCkgfHwKKyAgICAgICAgICAgIWhhc0FkZHJlc3NTcGFjZSgpIHx8ICFxcy5oYXNBZGRyZXNzU3BhY2UoKSk7CisgICAgYXNzZXJ0KGdldE9iakNHQ0F0dHIoKSA9PSBxcy5nZXRPYmpDR0NBdHRyKCkgfHwKKyAgICAgICAgICAgIWhhc09iakNHQ0F0dHIoKSB8fCAhcXMuaGFzT2JqQ0dDQXR0cigpKTsKKyAgICBhc3NlcnQoZ2V0T2JqQ0xpZmV0aW1lKCkgPT0gcXMuZ2V0T2JqQ0xpZmV0aW1lKCkgfHwKKyAgICAgICAgICAgIWhhc09iakNMaWZldGltZSgpIHx8ICFxcy5oYXNPYmpDTGlmZXRpbWUoKSk7CisgICAgTWFzayB8PSBxcy5NYXNrOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGFkZHJlc3Mgc3BhY2UgaXMgYSBzdXBlcnNldCBvZiB0aGUgb3RoZXIgb25lLgorICAvLy8gT3BlbkNMIHYyLjAgZGVmaW5lcyBjb252ZXJzaW9uIHJ1bGVzIChPcGVuQ0xDIHYyLjAgczYuNS41KSBhbmQgbm90aW9uIG9mCisgIC8vLyBvdmVybGFwcGluZyBhZGRyZXNzIHNwYWNlcy4KKyAgLy8vIENMMS4xIG9yIENMMS4yOgorICAvLy8gICBldmVyeSBhZGRyZXNzIHNwYWNlIGlzIGEgc3VwZXJzZXQgb2YgaXRzZWxmLgorICAvLy8gQ0wyLjAgYWRkczoKKyAgLy8vICAgX19nZW5lcmljIGlzIGEgc3VwZXJzZXQgb2YgYW55IGFkZHJlc3Mgc3BhY2UgZXhjZXB0IGZvciBfX2NvbnN0YW50LgorICBib29sIGlzQWRkcmVzc1NwYWNlU3VwZXJzZXRPZihRdWFsaWZpZXJzIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuCisgICAgICAgIC8vIEFkZHJlc3Mgc3BhY2VzIG11c3QgbWF0Y2ggZXhhY3RseS4KKyAgICAgICAgZ2V0QWRkcmVzc1NwYWNlKCkgPT0gb3RoZXIuZ2V0QWRkcmVzc1NwYWNlKCkgfHwKKyAgICAgICAgLy8gT3RoZXJ3aXNlIGluIE9wZW5DTEMgdjIuMCBzNi41LjU6IGV2ZXJ5IGFkZHJlc3Mgc3BhY2UgZXhjZXB0CisgICAgICAgIC8vIGZvciBfX2NvbnN0YW50IGNhbiBiZSB1c2VkIGFzIF9fZ2VuZXJpYy4KKyAgICAgICAgKGdldEFkZHJlc3NTcGFjZSgpID09IExhbmdBUzo6b3BlbmNsX2dlbmVyaWMgJiYKKyAgICAgICAgIG90aGVyLmdldEFkZHJlc3NTcGFjZSgpICE9IExhbmdBUzo6b3BlbmNsX2NvbnN0YW50KTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmVzIGlmIHRoZXNlIHF1YWxpZmllcnMgY29tcGF0aWJseSBpbmNsdWRlIGFub3RoZXIgc2V0LgorICAvLy8gR2VuZXJhbGx5IHRoaXMgYW5zd2VycyB0aGUgcXVlc3Rpb24gb2Ygd2hldGhlciBhbiBvYmplY3Qgd2l0aCB0aGUgb3RoZXIKKyAgLy8vIHF1YWxpZmllcnMgY2FuIGJlIHNhZmVseSB1c2VkIGFzIGFuIG9iamVjdCB3aXRoIHRoZXNlIHF1YWxpZmllcnMuCisgIGJvb2wgY29tcGF0aWJseUluY2x1ZGVzKFF1YWxpZmllcnMgb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNBZGRyZXNzU3BhY2VTdXBlcnNldE9mKG90aGVyKSAmJgorICAgICAgICAgICAvLyBPYmpDIEdDIHF1YWxpZmllcnMgY2FuIG1hdGNoLCBiZSBhZGRlZCwgb3IgYmUgcmVtb3ZlZCwgYnV0IGNhbid0CisgICAgICAgICAgIC8vIGJlIGNoYW5nZWQuCisgICAgICAgICAgIChnZXRPYmpDR0NBdHRyKCkgPT0gb3RoZXIuZ2V0T2JqQ0dDQXR0cigpIHx8ICFoYXNPYmpDR0NBdHRyKCkgfHwKKyAgICAgICAgICAgICFvdGhlci5oYXNPYmpDR0NBdHRyKCkpICYmCisgICAgICAgICAgIC8vIE9iakMgbGlmZXRpbWUgcXVhbGlmaWVycyBtdXN0IG1hdGNoIGV4YWN0bHkuCisgICAgICAgICAgIGdldE9iakNMaWZldGltZSgpID09IG90aGVyLmdldE9iakNMaWZldGltZSgpICYmCisgICAgICAgICAgIC8vIENWUiBxdWFsaWZpZXJzIG1heSBzdWJzZXQuCisgICAgICAgICAgICgoKE1hc2sgJiBDVlJNYXNrKSB8IChvdGhlci5NYXNrICYgQ1ZSTWFzaykpID09IChNYXNrICYgQ1ZSTWFzaykpICYmCisgICAgICAgICAgIC8vIFUgcXVhbGlmaWVyIG1heSBzdXBlcnNldC4KKyAgICAgICAgICAgKCFvdGhlci5oYXNVbmFsaWduZWQoKSB8fCBoYXNVbmFsaWduZWQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZXMgaWYgdGhlc2UgcXVhbGlmaWVycyBjb21wYXRpYmx5IGluY2x1ZGUgYW5vdGhlciBzZXQgb2YKKyAgLy8vIHF1YWxpZmllcnMgZnJvbSB0aGUgbmFycm93IHBlcnNwZWN0aXZlIG9mIE9iamVjdGl2ZS1DIEFSQyBsaWZldGltZS4KKyAgLy8vCisgIC8vLyBPbmUgc2V0IG9mIE9iamVjdGl2ZS1DIGxpZmV0aW1lIHF1YWxpZmllcnMgY29tcGF0aWJseSBpbmNsdWRlcyB0aGUgb3RoZXIKKyAgLy8vIGlmIHRoZSBsaWZldGltZSBxdWFsaWZpZXJzIG1hdGNoLCBvciBpZiBib3RoIGFyZSBub24tX193ZWFrIGFuZCB0aGUKKyAgLy8vIGluY2x1ZGluZyBzZXQgYWxzbyBjb250YWlucyB0aGUgJ2NvbnN0JyBxdWFsaWZpZXIsIG9yIGJvdGggYXJlIG5vbi1fX3dlYWsKKyAgLy8vIGFuZCBvbmUgaXMgTm9uZSAod2hpY2ggY2FuIG9ubHkgaGFwcGVuIGluIG5vbi1BUkMgbW9kZXMpLgorICBib29sIGNvbXBhdGlibHlJbmNsdWRlc09iakNMaWZldGltZShRdWFsaWZpZXJzIG90aGVyKSBjb25zdCB7CisgICAgaWYgKGdldE9iakNMaWZldGltZSgpID09IG90aGVyLmdldE9iakNMaWZldGltZSgpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoZ2V0T2JqQ0xpZmV0aW1lKCkgPT0gT0NMX1dlYWsgfHwgb3RoZXIuZ2V0T2JqQ0xpZmV0aW1lKCkgPT0gT0NMX1dlYWspCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoZ2V0T2JqQ0xpZmV0aW1lKCkgPT0gT0NMX05vbmUgfHwgb3RoZXIuZ2V0T2JqQ0xpZmV0aW1lKCkgPT0gT0NMX05vbmUpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBoYXNDb25zdCgpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHNldCBvZiBxdWFsaWZpZXJzIGlzIGEgc3RyaWN0IHN1cGVyc2V0IG9mCisgIC8vLyBhbm90aGVyIHNldCBvZiBxdWFsaWZpZXJzLCBub3QgY29uc2lkZXJpbmcgcXVhbGlmaWVyIGNvbXBhdGliaWxpdHkuCisgIGJvb2wgaXNTdHJpY3RTdXBlcnNldE9mKFF1YWxpZmllcnMgT3RoZXIpIGNvbnN0OworCisgIGJvb2wgb3BlcmF0b3I9PShRdWFsaWZpZXJzIE90aGVyKSBjb25zdCB7IHJldHVybiBNYXNrID09IE90aGVyLk1hc2s7IH0KKyAgYm9vbCBvcGVyYXRvciE9KFF1YWxpZmllcnMgT3RoZXIpIGNvbnN0IHsgcmV0dXJuIE1hc2sgIT0gT3RoZXIuTWFzazsgfQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBoYXNRdWFsaWZpZXJzKCk7IH0KKworICBRdWFsaWZpZXJzICZvcGVyYXRvcis9KFF1YWxpZmllcnMgUikgeworICAgIGFkZFF1YWxpZmllcnMoUik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gVW5pb24gdHdvIHF1YWxpZmllciBzZXRzLiAgSWYgYW4gZW51bWVyYXRlZCBxdWFsaWZpZXIgYXBwZWFycworICAvLyBpbiBib3RoIHNldHMsIHVzZSB0aGUgb25lIGZyb20gdGhlIHJpZ2h0LgorICBmcmllbmQgUXVhbGlmaWVycyBvcGVyYXRvcisoUXVhbGlmaWVycyBMLCBRdWFsaWZpZXJzIFIpIHsKKyAgICBMICs9IFI7CisgICAgcmV0dXJuIEw7CisgIH0KKworICBRdWFsaWZpZXJzICZvcGVyYXRvci09KFF1YWxpZmllcnMgUikgeworICAgIHJlbW92ZVF1YWxpZmllcnMoUik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBDb21wdXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHF1YWxpZmllciBzZXRzLgorICBmcmllbmQgUXVhbGlmaWVycyBvcGVyYXRvci0oUXVhbGlmaWVycyBMLCBRdWFsaWZpZXJzIFIpIHsKKyAgICBMIC09IFI7CisgICAgcmV0dXJuIEw7CisgIH0KKworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0OworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZyhjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKworICBib29sIGlzRW1wdHlXaGVuUHJpbnRlZChjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3ksCisgICAgICAgICAgICAgYm9vbCBhcHBlbmRTcGFjZUlmTm9uRW1wdHkgPSBmYWxzZSkgY29uc3Q7CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7CisgICAgSUQuQWRkSW50ZWdlcihNYXNrKTsKKyAgfQorCitwcml2YXRlOgorICAvLyBiaXRzOiAgICAgfDAgMSAyfDN8NCAuLiA1fDYgIC4uICA4fDkgICAuLi4gICAzMXwKKyAgLy8gICAgICAgICAgIHxDIFIgVnxVfEdDQXR0cnxMaWZldGltZXxBZGRyZXNzU3BhY2V8CisgIHVpbnQzMl90IE1hc2sgPSAwOworCisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBVTWFzayA9IDB4ODsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IFVTaGlmdCA9IDM7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBHQ0F0dHJNYXNrID0gMHgzMDsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEdDQXR0clNoaWZ0ID0gNDsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IExpZmV0aW1lTWFzayA9IDB4MUMwOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgTGlmZXRpbWVTaGlmdCA9IDY7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBBZGRyZXNzU3BhY2VNYXNrID0KKyAgICAgIH4oQ1ZSTWFzayB8IFVNYXNrIHwgR0NBdHRyTWFzayB8IExpZmV0aW1lTWFzayk7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBBZGRyZXNzU3BhY2VTaGlmdCA9IDk7Cit9OworCisvLy8gQSBzdGQ6OnBhaXItbGlrZSBzdHJ1Y3R1cmUgZm9yIHN0b3JpbmcgYSBxdWFsaWZpZWQgdHlwZSBzcGxpdAorLy8vIGludG8gaXRzIGxvY2FsIHF1YWxpZmllcnMgYW5kIGl0cyBsb2NhbGx5LXVucXVhbGlmaWVkIHR5cGUuCitzdHJ1Y3QgU3BsaXRRdWFsVHlwZSB7CisgIC8vLyBUaGUgbG9jYWxseS11bnF1YWxpZmllZCB0eXBlLgorICBjb25zdCBUeXBlICpUeSA9IG51bGxwdHI7CisKKyAgLy8vIFRoZSBsb2NhbCBxdWFsaWZpZXJzLgorICBRdWFsaWZpZXJzIFF1YWxzOworCisgIFNwbGl0UXVhbFR5cGUoKSA9IGRlZmF1bHQ7CisgIFNwbGl0UXVhbFR5cGUoY29uc3QgVHlwZSAqdHksIFF1YWxpZmllcnMgcXMpIDogVHkodHkpLCBRdWFscyhxcykge30KKworICBTcGxpdFF1YWxUeXBlIGdldFNpbmdsZVN0ZXBEZXN1Z2FyZWRUeXBlKCkgY29uc3Q7IC8vIGVuZCBvZiB0aGlzIGZpbGUKKworICAvLyBNYWtlIHN0ZDo6dGllIHdvcmsuCisgIHN0ZDo6cGFpcjxjb25zdCBUeXBlICosUXVhbGlmaWVycz4gYXNQYWlyKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnBhaXI8Y29uc3QgVHlwZSAqLCBRdWFsaWZpZXJzPihUeSwgUXVhbHMpOworICB9CisKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShTcGxpdFF1YWxUeXBlIGEsIFNwbGl0UXVhbFR5cGUgYikgeworICAgIHJldHVybiBhLlR5ID09IGIuVHkgJiYgYS5RdWFscyA9PSBiLlF1YWxzOworICB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oU3BsaXRRdWFsVHlwZSBhLCBTcGxpdFF1YWxUeXBlIGIpIHsKKyAgICByZXR1cm4gYS5UeSAhPSBiLlR5IHx8IGEuUXVhbHMgIT0gYi5RdWFsczsKKyAgfQorfTsKKworLy8vIFRoZSBraW5kIG9mIHR5cGUgd2UgYXJlIHN1YnN0aXR1dGluZyBPYmplY3RpdmUtQyB0eXBlIGFyZ3VtZW50cyBpbnRvLgorLy8vCisvLy8gVGhlIGtpbmQgb2Ygc3Vic3RpdHV0aW9uIGFmZmVjdHMgdGhlIHJlcGxhY2VtZW50IG9mIHR5cGUgcGFyYW1ldGVycyB3aGVuCisvLy8gbm8gY29uY3JldGUgdHlwZSBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCwgZS5nLiwgd2hlbiBkZWFsaW5nIHdpdGggYW4KKy8vLyB1bnNwZWNpYWxpemVkIHR5cGUuCitlbnVtIGNsYXNzIE9iakNTdWJzdGl0dXRpb25Db250ZXh0IHsKKyAgLy8vIEFuIG9yZGluYXJ5IHR5cGUuCisgIE9yZGluYXJ5LAorCisgIC8vLyBUaGUgcmVzdWx0IHR5cGUgb2YgYSBtZXRob2Qgb3IgZnVuY3Rpb24uCisgIFJlc3VsdCwKKworICAvLy8gVGhlIHBhcmFtZXRlciB0eXBlIG9mIGEgbWV0aG9kIG9yIGZ1bmN0aW9uLgorICBQYXJhbWV0ZXIsCisKKyAgLy8vIFRoZSB0eXBlIG9mIGEgcHJvcGVydHkuCisgIFByb3BlcnR5LAorCisgIC8vLyBUaGUgc3VwZXJjbGFzcyBvZiBhIHR5cGUuCisgIFN1cGVyY2xhc3MsCit9OworCisvLy8gQSAocG9zc2libHktKXF1YWxpZmllZCB0eXBlLgorLy8vCisvLy8gRm9yIGVmZmljaWVuY3ksIHdlIGRvbid0IHN0b3JlIENWLXF1YWxpZmllZCB0eXBlcyBhcyBub2RlcyBvbiB0aGVpcgorLy8vIG93bjogaW5zdGVhZCBlYWNoIHJlZmVyZW5jZSB0byBhIHR5cGUgc3RvcmVzIHRoZSBxdWFsaWZpZXJzLiAgVGhpcworLy8vIGdyZWF0bHkgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIG5vZGVzIHdlIG5lZWQgdG8gYWxsb2NhdGUgZm9yIHR5cGVzIChmb3IKKy8vLyBleGFtcGxlIHdlIG9ubHkgbmVlZCBvbmUgZm9yICdpbnQnLCAnY29uc3QgaW50JywgJ3ZvbGF0aWxlIGludCcsCisvLy8gJ2NvbnN0IHZvbGF0aWxlIGludCcsIGV0YykuCisvLy8KKy8vLyBBcyBhbiBhZGRlZCBlZmZpY2llbmN5IGJvbnVzLCBpbnN0ZWFkIG9mIG1ha2luZyB0aGlzIGEgcGFpciwgd2UKKy8vLyBqdXN0IHN0b3JlIHRoZSB0d28gYml0cyB3ZSBjYXJlIGFib3V0IGluIHRoZSBsb3cgYml0cyBvZiB0aGUKKy8vLyBwb2ludGVyLiAgVG8gaGFuZGxlIHRoZSBwYWNraW5nL3VucGFja2luZywgd2UgbWFrZSBRdWFsVHlwZSBiZSBhCisvLy8gc2ltcGxlIHdyYXBwZXIgY2xhc3MgdGhhdCBhY3RzIGxpa2UgYSBzbWFydCBwb2ludGVyLiAgQSB0aGlyZCBiaXQKKy8vLyBpbmRpY2F0ZXMgd2hldGhlciB0aGVyZSBhcmUgZXh0ZW5kZWQgcXVhbGlmaWVycyBwcmVzZW50LCBpbiB3aGljaAorLy8vIGNhc2UgdGhlIHBvaW50ZXIgcG9pbnRzIHRvIGEgc3BlY2lhbCBzdHJ1Y3R1cmUuCitjbGFzcyBRdWFsVHlwZSB7CisgIGZyaWVuZCBjbGFzcyBRdWFsaWZpZXJDb2xsZWN0b3I7CisKKyAgLy8gVGhhbmtmdWxseSwgdGhlc2UgYXJlIGVmZmljaWVudGx5IGNvbXBvc2FibGUuCisgIGxsdm06OlBvaW50ZXJJbnRQYWlyPGxsdm06OlBvaW50ZXJVbmlvbjxjb25zdCBUeXBlICosIGNvbnN0IEV4dFF1YWxzICo+LAorICAgICAgICAgICAgICAgICAgICAgICBRdWFsaWZpZXJzOjpGYXN0V2lkdGg+IFZhbHVlOworCisgIGNvbnN0IEV4dFF1YWxzICpnZXRFeHRRdWFsc1Vuc2FmZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWUuZ2V0UG9pbnRlcigpLmdldDxjb25zdCBFeHRRdWFscyo+KCk7CisgIH0KKworICBjb25zdCBUeXBlICpnZXRUeXBlUHRyVW5zYWZlKCkgY29uc3QgeworICAgIHJldHVybiBWYWx1ZS5nZXRQb2ludGVyKCkuZ2V0PGNvbnN0IFR5cGUqPigpOworICB9CisKKyAgY29uc3QgRXh0UXVhbHNUeXBlQ29tbW9uQmFzZSAqZ2V0Q29tbW9uUHRyKCkgY29uc3QgeworICAgIGFzc2VydCghaXNOdWxsKCkgJiYgIkNhbm5vdCByZXRyaWV2ZSBhIE5VTEwgdHlwZSBwb2ludGVyIik7CisgICAgYXV0byBDb21tb25QdHJWYWwgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oVmFsdWUuZ2V0T3BhcXVlVmFsdWUoKSk7CisgICAgQ29tbW9uUHRyVmFsICY9IH4odWludHB0cl90KSgoMSA8PCBUeXBlQWxpZ25tZW50SW5CaXRzKSAtIDEpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEV4dFF1YWxzVHlwZUNvbW1vbkJhc2UqPihDb21tb25QdHJWYWwpOworICB9CisKK3B1YmxpYzoKKyAgUXVhbFR5cGUoKSA9IGRlZmF1bHQ7CisgIFF1YWxUeXBlKGNvbnN0IFR5cGUgKlB0ciwgdW5zaWduZWQgUXVhbHMpIDogVmFsdWUoUHRyLCBRdWFscykge30KKyAgUXVhbFR5cGUoY29uc3QgRXh0UXVhbHMgKlB0ciwgdW5zaWduZWQgUXVhbHMpIDogVmFsdWUoUHRyLCBRdWFscykge30KKworICB1bnNpZ25lZCBnZXRMb2NhbEZhc3RRdWFsaWZpZXJzKCkgY29uc3QgeyByZXR1cm4gVmFsdWUuZ2V0SW50KCk7IH0KKyAgdm9pZCBzZXRMb2NhbEZhc3RRdWFsaWZpZXJzKHVuc2lnbmVkIFF1YWxzKSB7IFZhbHVlLnNldEludChRdWFscyk7IH0KKworICAvLy8gUmV0cmlldmVzIGEgcG9pbnRlciB0byB0aGUgdW5kZXJseWluZyAodW5xdWFsaWZpZWQpIHR5cGUuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiByZXF1aXJlcyB0aGF0IHRoZSB0eXBlIG5vdCBiZSBOVUxMLiBJZiB0aGUgdHlwZSBtaWdodCBiZQorICAvLy8gTlVMTCwgdXNlIHRoZSAoc2xpZ2h0bHkgbGVzcyBlZmZpY2llbnQpIFxjIGdldFR5cGVQdHJPck51bGwoKS4KKyAgY29uc3QgVHlwZSAqZ2V0VHlwZVB0cigpIGNvbnN0OworCisgIGNvbnN0IFR5cGUgKmdldFR5cGVQdHJPck51bGwoKSBjb25zdDsKKworICAvLy8gUmV0cmlldmVzIGEgcG9pbnRlciB0byB0aGUgbmFtZSBvZiB0aGUgYmFzZSB0eXBlLgorICBjb25zdCBJZGVudGlmaWVySW5mbyAqZ2V0QmFzZVR5cGVJZGVudGlmaWVyKCkgY29uc3Q7CisKKyAgLy8vIERpdmlkZXMgYSBRdWFsVHlwZSBpbnRvIGl0cyB1bnF1YWxpZmllZCB0eXBlIGFuZCBhIHNldCBvZiBsb2NhbAorICAvLy8gcXVhbGlmaWVycy4KKyAgU3BsaXRRdWFsVHlwZSBzcGxpdCgpIGNvbnN0OworCisgIHZvaWQgKmdldEFzT3BhcXVlUHRyKCkgY29uc3QgeyByZXR1cm4gVmFsdWUuZ2V0T3BhcXVlVmFsdWUoKTsgfQorCisgIHN0YXRpYyBRdWFsVHlwZSBnZXRGcm9tT3BhcXVlUHRyKGNvbnN0IHZvaWQgKlB0cikgeworICAgIFF1YWxUeXBlIFQ7CisgICAgVC5WYWx1ZS5zZXRGcm9tT3BhcXVlVmFsdWUoY29uc3RfY2FzdDx2b2lkKj4oUHRyKSk7CisgICAgcmV0dXJuIFQ7CisgIH0KKworICBjb25zdCBUeXBlICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgcmV0dXJuICpnZXRUeXBlUHRyKCk7CisgIH0KKworICBjb25zdCBUeXBlICpvcGVyYXRvci0+KCkgY29uc3QgeworICAgIHJldHVybiBnZXRUeXBlUHRyKCk7CisgIH0KKworICBib29sIGlzQ2Fub25pY2FsKCkgY29uc3Q7CisgIGJvb2wgaXNDYW5vbmljYWxBc1BhcmFtKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgUXVhbFR5cGUgZG9lc24ndCBwb2ludCB0byBhIHR5cGUgeWV0LgorICBib29sIGlzTnVsbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWUuZ2V0UG9pbnRlcigpLmlzTnVsbCgpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHBhcnRpY3VsYXIgUXVhbFR5cGUgaW5zdGFuY2UgaGFzIHRoZQorICAvLy8gImNvbnN0IiBxdWFsaWZpZXIgc2V0LCB3aXRob3V0IGxvb2tpbmcgdGhyb3VnaCB0eXBlZGVmcyB0aGF0IG1heSBoYXZlCisgIC8vLyBhZGRlZCAiY29uc3QiIGF0IGEgZGlmZmVyZW50IGxldmVsLgorICBib29sIGlzTG9jYWxDb25zdFF1YWxpZmllZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldExvY2FsRmFzdFF1YWxpZmllcnMoKSAmIFF1YWxpZmllcnM6OkNvbnN0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB0eXBlIGlzIGNvbnN0LXF1YWxpZmllZC4KKyAgYm9vbCBpc0NvbnN0UXVhbGlmaWVkKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHBhcnRpY3VsYXIgUXVhbFR5cGUgaW5zdGFuY2UgaGFzIHRoZQorICAvLy8gInJlc3RyaWN0IiBxdWFsaWZpZXIgc2V0LCB3aXRob3V0IGxvb2tpbmcgdGhyb3VnaCB0eXBlZGVmcyB0aGF0IG1heSBoYXZlCisgIC8vLyBhZGRlZCAicmVzdHJpY3QiIGF0IGEgZGlmZmVyZW50IGxldmVsLgorICBib29sIGlzTG9jYWxSZXN0cmljdFF1YWxpZmllZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldExvY2FsRmFzdFF1YWxpZmllcnMoKSAmIFF1YWxpZmllcnM6OlJlc3RyaWN0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB0eXBlIGlzIHJlc3RyaWN0LXF1YWxpZmllZC4KKyAgYm9vbCBpc1Jlc3RyaWN0UXVhbGlmaWVkKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHBhcnRpY3VsYXIgUXVhbFR5cGUgaW5zdGFuY2UgaGFzIHRoZQorICAvLy8gInZvbGF0aWxlIiBxdWFsaWZpZXIgc2V0LCB3aXRob3V0IGxvb2tpbmcgdGhyb3VnaCB0eXBlZGVmcyB0aGF0IG1heSBoYXZlCisgIC8vLyBhZGRlZCAidm9sYXRpbGUiIGF0IGEgZGlmZmVyZW50IGxldmVsLgorICBib29sIGlzTG9jYWxWb2xhdGlsZVF1YWxpZmllZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldExvY2FsRmFzdFF1YWxpZmllcnMoKSAmIFF1YWxpZmllcnM6OlZvbGF0aWxlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB0eXBlIGlzIHZvbGF0aWxlLXF1YWxpZmllZC4KKyAgYm9vbCBpc1ZvbGF0aWxlUXVhbGlmaWVkKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHBhcnRpY3VsYXIgUXVhbFR5cGUgaW5zdGFuY2UgaGFzIGFueQorICAvLy8gcXVhbGlmaWVycywgd2l0aG91dCBsb29raW5nIHRocm91Z2ggYW55IHR5cGVkZWZzIHRoYXQgbWlnaHQgYWRkCisgIC8vLyBxdWFsaWZpZXJzIGF0IGEgZGlmZmVyZW50IGxldmVsLgorICBib29sIGhhc0xvY2FsUXVhbGlmaWVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TG9jYWxGYXN0UXVhbGlmaWVycygpIHx8IGhhc0xvY2FsTm9uRmFzdFF1YWxpZmllcnMoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB0eXBlIGhhcyBhbnkgcXVhbGlmaWVycy4KKyAgYm9vbCBoYXNRdWFsaWZpZXJzKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHBhcnRpY3VsYXIgUXVhbFR5cGUgaW5zdGFuY2UgaGFzIGFueQorICAvLy8gIm5vbi1mYXN0IiBxdWFsaWZpZXJzLCBlLmcuLCB0aG9zZSB0aGF0IGFyZSBzdG9yZWQgaW4gYW4gRXh0UXVhbFR5cGUKKyAgLy8vIGluc3RhbmNlLgorICBib29sIGhhc0xvY2FsTm9uRmFzdFF1YWxpZmllcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlLmdldFBvaW50ZXIoKS5pczxjb25zdCBFeHRRdWFscyo+KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzZXQgb2YgcXVhbGlmaWVycyBsb2NhbCB0byB0aGlzIHBhcnRpY3VsYXIgUXVhbFR5cGUKKyAgLy8vIGluc3RhbmNlLCBub3QgaW5jbHVkaW5nIGFueSBxdWFsaWZpZXJzIGFjcXVpcmVkIHRocm91Z2ggdHlwZWRlZnMgb3IKKyAgLy8vIG90aGVyIHN1Z2FyLgorICBRdWFsaWZpZXJzIGdldExvY2FsUXVhbGlmaWVycygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHNldCBvZiBxdWFsaWZpZXJzIGFwcGxpZWQgdG8gdGhpcyB0eXBlLgorICBRdWFsaWZpZXJzIGdldFF1YWxpZmllcnMoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzZXQgb2YgQ1ZSIChjb25zdC12b2xhdGlsZS1yZXN0cmljdCkgcXVhbGlmaWVycworICAvLy8gbG9jYWwgdG8gdGhpcyBwYXJ0aWN1bGFyIFF1YWxUeXBlIGluc3RhbmNlLCBub3QgaW5jbHVkaW5nIGFueSBxdWFsaWZpZXJzCisgIC8vLyBhY3F1aXJlZCB0aHJvdWdoIHR5cGVkZWZzIG9yIG90aGVyIHN1Z2FyLgorICB1bnNpZ25lZCBnZXRMb2NhbENWUlF1YWxpZmllcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExvY2FsRmFzdFF1YWxpZmllcnMoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHNldCBvZiBDVlIgKGNvbnN0LXZvbGF0aWxlLXJlc3RyaWN0KSBxdWFsaWZpZXJzCisgIC8vLyBhcHBsaWVkIHRvIHRoaXMgdHlwZS4KKyAgdW5zaWduZWQgZ2V0Q1ZSUXVhbGlmaWVycygpIGNvbnN0OworCisgIGJvb2wgaXNDb25zdGFudChjb25zdCBBU1RDb250ZXh0JiBDdHgpIGNvbnN0IHsKKyAgICByZXR1cm4gUXVhbFR5cGU6OmlzQ29uc3RhbnQoKnRoaXMsIEN0eCk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSBQbGFpbiBPbGQgRGF0YSAoUE9EKSB0eXBlIChDKysgMy45cDEwKS4KKyAgYm9vbCBpc1BPRFR5cGUoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBQT0QgdHlwZSBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG9mIHRoZSBDKys5OAorICAvLy8gc3RhbmRhcmQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24ncyBsYW5ndWFnZS4KKyAgYm9vbCBpc0NYWDk4UE9EVHlwZShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0KSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIFBPRCB0eXBlIGFjY29yZGluZyB0byB0aGUgbW9yZSByZWxheGVkIHJ1bGVzCisgIC8vLyBvZiB0aGUgQysrMTEgc3RhbmRhcmQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24ncyBsYW5ndWFnZS4KKyAgLy8vIChDKysweCBbYmFzaWMudHlwZXNdcDkpCisgIGJvb2wgaXNDWFgxMVBPRFR5cGUoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSB0cml2aWFsIHR5cGUgcGVyIChDKysweCBbYmFzaWMudHlwZXNdcDkpCisgIGJvb2wgaXNUcml2aWFsVHlwZShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0KSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHRyaXZpYWxseSBjb3B5YWJsZSB0eXBlIChDKysweCBbYmFzaWMudHlwZXNdcDkpCisgIGJvb2wgaXNUcml2aWFsbHlDb3B5YWJsZVR5cGUoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCkgY29uc3Q7CisKKyAgLy8gRG9uJ3QgcHJvbWlzZSBpbiB0aGUgQVBJIHRoYXQgYW55dGhpbmcgYmVzaWRlcyAnY29uc3QnIGNhbiBiZQorICAvLyBlYXNpbHkgYWRkZWQuCisKKyAgLy8vIEFkZCB0aGUgYGNvbnN0YCB0eXBlIHF1YWxpZmllciB0byB0aGlzIFF1YWxUeXBlLgorICB2b2lkIGFkZENvbnN0KCkgeworICAgIGFkZEZhc3RRdWFsaWZpZXJzKFF1YWxpZmllcnM6OkNvbnN0KTsKKyAgfQorICBRdWFsVHlwZSB3aXRoQ29uc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIHdpdGhGYXN0UXVhbGlmaWVycyhRdWFsaWZpZXJzOjpDb25zdCk7CisgIH0KKworICAvLy8gQWRkIHRoZSBgdm9sYXRpbGVgIHR5cGUgcXVhbGlmaWVyIHRvIHRoaXMgUXVhbFR5cGUuCisgIHZvaWQgYWRkVm9sYXRpbGUoKSB7CisgICAgYWRkRmFzdFF1YWxpZmllcnMoUXVhbGlmaWVyczo6Vm9sYXRpbGUpOworICB9CisgIFF1YWxUeXBlIHdpdGhWb2xhdGlsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gd2l0aEZhc3RRdWFsaWZpZXJzKFF1YWxpZmllcnM6OlZvbGF0aWxlKTsKKyAgfQorCisgIC8vLyBBZGQgdGhlIGByZXN0cmljdGAgcXVhbGlmaWVyIHRvIHRoaXMgUXVhbFR5cGUuCisgIHZvaWQgYWRkUmVzdHJpY3QoKSB7CisgICAgYWRkRmFzdFF1YWxpZmllcnMoUXVhbGlmaWVyczo6UmVzdHJpY3QpOworICB9CisgIFF1YWxUeXBlIHdpdGhSZXN0cmljdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gd2l0aEZhc3RRdWFsaWZpZXJzKFF1YWxpZmllcnM6OlJlc3RyaWN0KTsKKyAgfQorCisgIFF1YWxUeXBlIHdpdGhDVlJRdWFsaWZpZXJzKHVuc2lnbmVkIENWUikgY29uc3QgeworICAgIHJldHVybiB3aXRoRmFzdFF1YWxpZmllcnMoQ1ZSKTsKKyAgfQorCisgIHZvaWQgYWRkRmFzdFF1YWxpZmllcnModW5zaWduZWQgVFFzKSB7CisgICAgYXNzZXJ0KCEoVFFzICYgflF1YWxpZmllcnM6OkZhc3RNYXNrKQorICAgICAgICAgICAmJiAibm9uLWZhc3QgcXVhbGlmaWVyIGJpdHMgc2V0IGluIG1hc2shIik7CisgICAgVmFsdWUuc2V0SW50KFZhbHVlLmdldEludCgpIHwgVFFzKTsKKyAgfQorCisgIHZvaWQgcmVtb3ZlTG9jYWxDb25zdCgpOworICB2b2lkIHJlbW92ZUxvY2FsVm9sYXRpbGUoKTsKKyAgdm9pZCByZW1vdmVMb2NhbFJlc3RyaWN0KCk7CisgIHZvaWQgcmVtb3ZlTG9jYWxDVlJRdWFsaWZpZXJzKHVuc2lnbmVkIE1hc2spOworCisgIHZvaWQgcmVtb3ZlTG9jYWxGYXN0UXVhbGlmaWVycygpIHsgVmFsdWUuc2V0SW50KDApOyB9CisgIHZvaWQgcmVtb3ZlTG9jYWxGYXN0UXVhbGlmaWVycyh1bnNpZ25lZCBNYXNrKSB7CisgICAgYXNzZXJ0KCEoTWFzayAmIH5RdWFsaWZpZXJzOjpGYXN0TWFzaykgJiYgIm1hc2sgaGFzIG5vbi1mYXN0IHF1YWxpZmllcnMiKTsKKyAgICBWYWx1ZS5zZXRJbnQoVmFsdWUuZ2V0SW50KCkgJiB+TWFzayk7CisgIH0KKworICAvLyBDcmVhdGVzIGEgdHlwZSB3aXRoIHRoZSBnaXZlbiBxdWFsaWZpZXJzIGluIGFkZGl0aW9uIHRvIGFueQorICAvLyBxdWFsaWZpZXJzIGFscmVhZHkgb24gdGhpcyB0eXBlLgorICBRdWFsVHlwZSB3aXRoRmFzdFF1YWxpZmllcnModW5zaWduZWQgVFFzKSBjb25zdCB7CisgICAgUXVhbFR5cGUgVCA9ICp0aGlzOworICAgIFQuYWRkRmFzdFF1YWxpZmllcnMoVFFzKTsKKyAgICByZXR1cm4gVDsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSB0eXBlIHdpdGggZXhhY3RseSB0aGUgZ2l2ZW4gZmFzdCBxdWFsaWZpZXJzLCByZW1vdmluZworICAvLyBhbnkgZXhpc3RpbmcgZmFzdCBxdWFsaWZpZXJzLgorICBRdWFsVHlwZSB3aXRoRXhhY3RMb2NhbEZhc3RRdWFsaWZpZXJzKHVuc2lnbmVkIFRRcykgY29uc3QgeworICAgIHJldHVybiB3aXRob3V0TG9jYWxGYXN0UXVhbGlmaWVycygpLndpdGhGYXN0UXVhbGlmaWVycyhUUXMpOworICB9CisKKyAgLy8gUmVtb3ZlcyBmYXN0IHF1YWxpZmllcnMsIGJ1dCBsZWF2ZXMgYW55IGV4dGVuZGVkIHF1YWxpZmllcnMgaW4gcGxhY2UuCisgIFF1YWxUeXBlIHdpdGhvdXRMb2NhbEZhc3RRdWFsaWZpZXJzKCkgY29uc3QgeworICAgIFF1YWxUeXBlIFQgPSAqdGhpczsKKyAgICBULnJlbW92ZUxvY2FsRmFzdFF1YWxpZmllcnMoKTsKKyAgICByZXR1cm4gVDsKKyAgfQorCisgIFF1YWxUeXBlIGdldENhbm9uaWNhbFR5cGUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGlzIHR5cGUgd2l0aCBhbGwgb2YgdGhlIGluc3RhbmNlLXNwZWNpZmljIHF1YWxpZmllcnMKKyAgLy8vIHJlbW92ZWQsIGJ1dCB3aXRob3V0IHJlbW92aW5nIGFueSBxdWFsaWZpZXJzIHRoYXQgbWF5IGhhdmUgYmVlbiBhcHBsaWVkCisgIC8vLyB0aHJvdWdoIHR5cGVkZWZzLgorICBRdWFsVHlwZSBnZXRMb2NhbFVucXVhbGlmaWVkVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFF1YWxUeXBlKGdldFR5cGVQdHIoKSwgMCk7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB1bnF1YWxpZmllZCB2YXJpYW50IG9mIHRoZSBnaXZlbiB0eXBlLAorICAvLy8gcmVtb3ZpbmcgYXMgbGl0dGxlIHN1Z2FyIGFzIHBvc3NpYmxlLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBsb29rcyB0aHJvdWdoIHZhcmlvdXMga2luZHMgb2Ygc3VnYXIgdG8gZmluZCB0aGUKKyAgLy8vIGxlYXN0LWRlc3VnYXJlZCB0eXBlIHRoYXQgaXMgdW5xdWFsaWZpZWQuIEZvciBleGFtcGxlLCBnaXZlbjoKKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gdHlwZWRlZiBpbnQgSW50ZWdlcjsKKyAgLy8vIHR5cGVkZWYgY29uc3QgSW50ZWdlciBDSW50ZWdlcjsKKyAgLy8vIHR5cGVkZWYgQ0ludGVnZXIgRGlmZmVyZW5jZVR5cGU7CisgIC8vLyBcZW5kY29kZQorICAvLy8KKyAgLy8vIEV4ZWN1dGluZyBcYyBnZXRVbnF1YWxpZmllZFR5cGUoKSBvbiB0aGUgdHlwZSBcYyBEaWZmZXJlbmNlVHlwZSB3aWxsCisgIC8vLyBkZXN1Z2FyIHVudGlsIHdlIGhpdCB0aGUgdHlwZSBcYyBJbnRlZ2VyLCB3aGljaCBoYXMgbm8gcXVhbGlmaWVycyBvbiBpdC4KKyAgLy8vCisgIC8vLyBUaGUgcmVzdWx0aW5nIHR5cGUgbWlnaHQgc3RpbGwgYmUgcXVhbGlmaWVkIGlmIGl0J3Mgc3VnYXIgZm9yIGFuIGFycmF5CisgIC8vLyB0eXBlLiAgVG8gc3RyaXAgcXVhbGlmaWVycyBldmVuIGZyb20gd2l0aGluIGEgc3VnYXJlZCBhcnJheSB0eXBlLCB1c2UKKyAgLy8vIEFTVENvbnRleHQ6OmdldFVucXVhbGlmaWVkQXJyYXlUeXBlLgorICBpbmxpbmUgUXVhbFR5cGUgZ2V0VW5xdWFsaWZpZWRUeXBlKCkgY29uc3Q7CisKKyAgLy8vIFJldHJpZXZlIHRoZSB1bnF1YWxpZmllZCB2YXJpYW50IG9mIHRoZSBnaXZlbiB0eXBlLCByZW1vdmluZyBhcyBsaXR0bGUKKyAgLy8vIHN1Z2FyIGFzIHBvc3NpYmxlLgorICAvLy8KKyAgLy8vIExpa2UgZ2V0VW5xdWFsaWZpZWRUeXBlKCksIGJ1dCBhbHNvIHJldHVybnMgdGhlIHNldCBvZgorICAvLy8gcXVhbGlmaWVycyB0aGF0IHdlcmUgYnVpbHQgdXAuCisgIC8vLworICAvLy8gVGhlIHJlc3VsdGluZyB0eXBlIG1pZ2h0IHN0aWxsIGJlIHF1YWxpZmllZCBpZiBpdCdzIHN1Z2FyIGZvciBhbiBhcnJheQorICAvLy8gdHlwZS4gIFRvIHN0cmlwIHF1YWxpZmllcnMgZXZlbiBmcm9tIHdpdGhpbiBhIHN1Z2FyZWQgYXJyYXkgdHlwZSwgdXNlCisgIC8vLyBBU1RDb250ZXh0OjpnZXRVbnF1YWxpZmllZEFycmF5VHlwZS4KKyAgaW5saW5lIFNwbGl0UXVhbFR5cGUgZ2V0U3BsaXRVbnF1YWxpZmllZFR5cGUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgdHlwZSBpcyBtb3JlIHF1YWxpZmllZCB0aGFuIHRoZSBvdGhlcgorICAvLy8gZ2l2ZW4gdHlwZSwgcmVxdWlyaW5nIGV4YWN0IGVxdWFsaXR5IGZvciBub24tQ1ZSIHF1YWxpZmllcnMuCisgIGJvb2wgaXNNb3JlUXVhbGlmaWVkVGhhbihRdWFsVHlwZSBPdGhlcikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHR5cGUgaXMgYXQgbGVhc3QgYXMgcXVhbGlmaWVkIGFzIHRoZSBvdGhlcgorICAvLy8gZ2l2ZW4gdHlwZSwgcmVxdWlyaW5nIGV4YWN0IGVxdWFsaXR5IGZvciBub24tQ1ZSIHF1YWxpZmllcnMuCisgIGJvb2wgaXNBdExlYXN0QXNRdWFsaWZpZWRBcyhRdWFsVHlwZSBPdGhlcikgY29uc3Q7CisKKyAgUXVhbFR5cGUgZ2V0Tm9uUmVmZXJlbmNlVHlwZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGEgKHR5cGljYWxseSBub24tbHZhbHVlKSBleHByZXNzaW9uIHdpdGggdGhlCisgIC8vLyBzcGVjaWZpZWQgcmVzdWx0IHR5cGUuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIHNob3VsZCBiZSB1c2VkIGZvciBleHByZXNzaW9ucyBmb3Igd2hpY2ggdGhlIHJldHVybiB0eXBlIGlzCisgIC8vLyBleHBsaWNpdGx5IHNwZWNpZmllZCAoZS5nLiwgaW4gYSBjYXN0IG9yIGNhbGwpIGFuZCBpc24ndCBuZWNlc3NhcmlseQorICAvLy8gYW4gbHZhbHVlLiBJdCByZW1vdmVzIGEgdG9wLWxldmVsIHJlZmVyZW5jZSAoc2luY2UgdGhlcmUgYXJlIG5vCisgIC8vLyBleHByZXNzaW9ucyBvZiByZWZlcmVuY2UgdHlwZSkgYW5kIGRlbGV0ZXMgdG9wLWxldmVsIGN2ci1xdWFsaWZpZXJzCisgIC8vLyBmcm9tIG5vbi1jbGFzcyB0eXBlcyAoaW4gQysrKSBvciBhbGwgdHlwZXMgKGluIEMpLgorICBRdWFsVHlwZSBnZXROb25MVmFsdWVFeHByVHlwZShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0KSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBzcGVjaWZpZWQgdHlwZSB3aXRoIGFueSAic3VnYXIiIHJlbW92ZWQgZnJvbQorICAvLy8gdGhlIHR5cGUuICBUaGlzIHRha2VzIG9mZiB0eXBlZGVmcywgdHlwZW9mJ3MgZXRjLiAgSWYgdGhlIG91dGVyIGxldmVsIG9mCisgIC8vLyB0aGUgdHlwZSBpcyBhbHJlYWR5IGNvbmNyZXRlLCBpdCByZXR1cm5zIGl0IHVubW9kaWZpZWQuICBUaGlzIGlzIHNpbWlsYXIKKyAgLy8vIHRvIGdldHRpbmcgdGhlIGNhbm9uaWNhbCB0eXBlLCBidXQgaXQgZG9lc24ndCByZW1vdmUgKmFsbCogdHlwZWRlZnMuICBGb3IKKyAgLy8vIGV4YW1wbGUsIGl0IHJldHVybnMgIlQqIiBhcyAiVCoiLCAobm90IGFzICJpbnQqIiksIGJlY2F1c2UgdGhlIHBvaW50ZXIgaXMKKyAgLy8vIGNvbmNyZXRlLgorICAvLy8KKyAgLy8vIFF1YWxpZmllcnMgYXJlIGxlZnQgaW4gcGxhY2UuCisgIFF1YWxUeXBlIGdldERlc3VnYXJlZFR5cGUoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCkgY29uc3QgeworICAgIHJldHVybiBnZXREZXN1Z2FyZWRUeXBlKCp0aGlzLCBDb250ZXh0KTsKKyAgfQorCisgIFNwbGl0UXVhbFR5cGUgZ2V0U3BsaXREZXN1Z2FyZWRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTcGxpdERlc3VnYXJlZFR5cGUoKnRoaXMpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHNwZWNpZmllZCB0eXBlIHdpdGggb25lIGxldmVsIG9mICJzdWdhciIgcmVtb3ZlZCBmcm9tCisgIC8vLyB0aGUgdHlwZS4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgdGFrZXMgb2ZmIHRoZSBmaXJzdCB0eXBlZGVmLCB0eXBlb2YsIGV0Yy4gSWYgdGhlIG91dGVyIGxldmVsCisgIC8vLyBvZiB0aGUgdHlwZSBpcyBhbHJlYWR5IGNvbmNyZXRlLCBpdCByZXR1cm5zIGl0IHVubW9kaWZpZWQuCisgIFF1YWxUeXBlIGdldFNpbmdsZVN0ZXBEZXN1Z2FyZWRUeXBlKGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U2luZ2xlU3RlcERlc3VnYXJlZFR5cGVJbXBsKCp0aGlzLCBDb250ZXh0KTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgdHlwZSBhZnRlciBkcm9wcGluZyBhbnkKKyAgLy8vIG91dGVyLWxldmVsIHBhcmVudGhlc2VzLgorICBRdWFsVHlwZSBJZ25vcmVQYXJlbnMoKSBjb25zdCB7CisgICAgaWYgKGlzYTxQYXJlblR5cGU+KCp0aGlzKSkKKyAgICAgIHJldHVybiBRdWFsVHlwZTo6SWdub3JlUGFyZW5zKCp0aGlzKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gSW5kaWNhdGUgd2hldGhlciB0aGUgc3BlY2lmaWVkIHR5cGVzIGFuZCBxdWFsaWZpZXJzIGFyZSBpZGVudGljYWwuCisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgUXVhbFR5cGUgJkxIUywgY29uc3QgUXVhbFR5cGUgJlJIUykgeworICAgIHJldHVybiBMSFMuVmFsdWUgPT0gUkhTLlZhbHVlOworICB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgUXVhbFR5cGUgJkxIUywgY29uc3QgUXVhbFR5cGUgJlJIUykgeworICAgIHJldHVybiBMSFMuVmFsdWUgIT0gUkhTLlZhbHVlOworICB9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKFNwbGl0UXVhbFR5cGUgc3BsaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSB7CisgICAgcmV0dXJuIGdldEFzU3RyaW5nKHNwbGl0LlR5LCBzcGxpdC5RdWFscywgUG9saWN5KTsKKyAgfQorICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoY29uc3QgVHlwZSAqdHksIFF1YWxpZmllcnMgcXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KTsKKworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0OyAKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3ksCisgICAgICAgICAgICAgY29uc3QgVHdpbmUgJlBsYWNlSG9sZGVyID0gVHdpbmUoKSwKKyAgICAgICAgICAgICB1bnNpZ25lZCBJbmRlbnRhdGlvbiA9IDApIGNvbnN0IHsKKyAgICBwcmludChzcGxpdCgpLCBPUywgUG9saWN5LCBQbGFjZUhvbGRlciwgSW5kZW50YXRpb24pOworICB9CisKKyAgc3RhdGljIHZvaWQgcHJpbnQoU3BsaXRRdWFsVHlwZSBzcGxpdCwgcmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmcG9saWN5LCBjb25zdCBUd2luZSAmUGxhY2VIb2xkZXIsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGVudGF0aW9uID0gMCkgeworICAgIHJldHVybiBwcmludChzcGxpdC5UeSwgc3BsaXQuUXVhbHMsIE9TLCBwb2xpY3ksIFBsYWNlSG9sZGVyLCBJbmRlbnRhdGlvbik7CisgIH0KKworICBzdGF0aWMgdm9pZCBwcmludChjb25zdCBUeXBlICp0eSwgUXVhbGlmaWVycyBxcywKKyAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmcG9saWN5LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmUGxhY2VIb2xkZXIsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGVudGF0aW9uID0gMCk7CisKKyAgdm9pZCBnZXRBc1N0cmluZ0ludGVybmFsKHN0ZDo6c3RyaW5nICZTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7CisgICAgcmV0dXJuIGdldEFzU3RyaW5nSW50ZXJuYWwoc3BsaXQoKSwgU3RyLCBQb2xpY3kpOworICB9CisKKyAgc3RhdGljIHZvaWQgZ2V0QXNTdHJpbmdJbnRlcm5hbChTcGxpdFF1YWxUeXBlIHNwbGl0LCBzdGQ6OnN0cmluZyAmb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZwb2xpY3kpIHsKKyAgICByZXR1cm4gZ2V0QXNTdHJpbmdJbnRlcm5hbChzcGxpdC5UeSwgc3BsaXQuUXVhbHMsIG91dCwgcG9saWN5KTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIGdldEFzU3RyaW5nSW50ZXJuYWwoY29uc3QgVHlwZSAqdHksIFF1YWxpZmllcnMgcXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmcG9saWN5KTsKKworICBjbGFzcyBTdHJlYW1lZFF1YWxUeXBlSGVscGVyIHsKKyAgICBjb25zdCBRdWFsVHlwZSAmVDsKKyAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5OworICAgIGNvbnN0IFR3aW5lICZQbGFjZUhvbGRlcjsKKyAgICB1bnNpZ25lZCBJbmRlbnRhdGlvbjsKKworICBwdWJsaWM6CisgICAgU3RyZWFtZWRRdWFsVHlwZUhlbHBlcihjb25zdCBRdWFsVHlwZSAmVCwgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZQbGFjZUhvbGRlciwgdW5zaWduZWQgSW5kZW50YXRpb24pCisgICAgICAgIDogVChUKSwgUG9saWN5KFBvbGljeSksIFBsYWNlSG9sZGVyKFBsYWNlSG9sZGVyKSwKKyAgICAgICAgICBJbmRlbnRhdGlvbihJbmRlbnRhdGlvbikge30KKworICAgIGZyaWVuZCByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbWVkUXVhbFR5cGVIZWxwZXIgJlNRVCkgeworICAgICAgU1FULlQucHJpbnQoT1MsIFNRVC5Qb2xpY3ksIFNRVC5QbGFjZUhvbGRlciwgU1FULkluZGVudGF0aW9uKTsKKyAgICAgIHJldHVybiBPUzsKKyAgICB9CisgIH07CisKKyAgU3RyZWFtZWRRdWFsVHlwZUhlbHBlciBzdHJlYW0oY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJlBsYWNlSG9sZGVyID0gVHdpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZW50YXRpb24gPSAwKSBjb25zdCB7CisgICAgcmV0dXJuIFN0cmVhbWVkUXVhbFR5cGVIZWxwZXIoKnRoaXMsIFBvbGljeSwgUGxhY2VIb2xkZXIsIEluZGVudGF0aW9uKTsKKyAgfQorCisgIHZvaWQgZHVtcChjb25zdCBjaGFyICpzKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisgIHZvaWQgZHVtcChsbHZtOjpyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3QgeworICAgIElELkFkZFBvaW50ZXIoZ2V0QXNPcGFxdWVQdHIoKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoaXMgdHlwZS4KKyAgaW5saW5lIExhbmdBUyBnZXRBZGRyZXNzU3BhY2UoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyBnYyBhdHRyaWJ1dGUgb2YgdGhpcyB0eXBlLgorICBpbmxpbmUgUXVhbGlmaWVyczo6R0MgZ2V0T2JqQ0dDQXR0cigpIGNvbnN0OworCisgIC8vLyB0cnVlIHdoZW4gVHlwZSBpcyBvYmpjJ3Mgd2Vhay4KKyAgYm9vbCBpc09iakNHQ1dlYWsoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9iakNHQ0F0dHIoKSA9PSBRdWFsaWZpZXJzOjpXZWFrOworICB9CisKKyAgLy8vIHRydWUgd2hlbiBUeXBlIGlzIG9iamMncyBzdHJvbmcuCisgIGJvb2wgaXNPYmpDR0NTdHJvbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9iakNHQ0F0dHIoKSA9PSBRdWFsaWZpZXJzOjpTdHJvbmc7CisgIH0KKworICAvLy8gUmV0dXJucyBsaWZldGltZSBhdHRyaWJ1dGUgb2YgdGhpcyB0eXBlLgorICBRdWFsaWZpZXJzOjpPYmpDTGlmZXRpbWUgZ2V0T2JqQ0xpZmV0aW1lKCkgY29uc3QgeworICAgIHJldHVybiBnZXRRdWFsaWZpZXJzKCkuZ2V0T2JqQ0xpZmV0aW1lKCk7CisgIH0KKworICBib29sIGhhc05vblRyaXZpYWxPYmpDTGlmZXRpbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFF1YWxpZmllcnMoKS5oYXNOb25Ucml2aWFsT2JqQ0xpZmV0aW1lKCk7CisgIH0KKworICBib29sIGhhc1N0cm9uZ09yV2Vha09iakNMaWZldGltZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UXVhbGlmaWVycygpLmhhc1N0cm9uZ09yV2Vha09iakNMaWZldGltZSgpOworICB9CisKKyAgLy8gdHJ1ZSB3aGVuIFR5cGUgaXMgb2JqYydzIHdlYWsgYW5kIHdlYWsgaXMgZW5hYmxlZCBidXQgQVJDIGlzbid0LgorICBib29sIGlzTm9uV2Vha0luTVJSV2l0aE9iakNXZWFrKGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQpIGNvbnN0OworCisgIGVudW0gUHJpbWl0aXZlRGVmYXVsdEluaXRpYWxpemVLaW5kIHsKKyAgICAvLy8gVGhlIHR5cGUgZG9lcyBub3QgZmFsbCBpbnRvIGFueSBvZiB0aGUgZm9sbG93aW5nIGNhdGVnb3JpZXMuIE5vdGUgdGhhdAorICAgIC8vLyB0aGlzIGNhc2UgaXMgemVyby12YWx1ZWQgc28gdGhhdCB2YWx1ZXMgb2YgdGhpcyBlbnVtIGNhbiBiZSB1c2VkIGFzIGEKKyAgICAvLy8gYm9vbGVhbiBjb25kaXRpb24gZm9yIG5vbi10cml2aWFsaXR5LgorICAgIFBESUtfVHJpdmlhbCwKKworICAgIC8vLyBUaGUgdHlwZSBpcyBhbiBPYmplY3RpdmUtQyByZXRhaW5hYmxlIHBvaW50ZXIgdHlwZSB0aGF0IGlzIHF1YWxpZmllZAorICAgIC8vLyB3aXRoIHRoZSBBUkMgX19zdHJvbmcgcXVhbGlmaWVyLgorICAgIFBESUtfQVJDU3Ryb25nLAorCisgICAgLy8vIFRoZSB0eXBlIGlzIGFuIE9iamVjdGl2ZS1DIHJldGFpbmFibGUgcG9pbnRlciB0eXBlIHRoYXQgaXMgcXVhbGlmaWVkCisgICAgLy8vIHdpdGggdGhlIEFSQyBfX3dlYWsgcXVhbGlmaWVyLgorICAgIFBESUtfQVJDV2VhaywKKworICAgIC8vLyBUaGUgdHlwZSBpcyBhIHN0cnVjdCBjb250YWluaW5nIGEgZmllbGQgd2hvc2UgdHlwZSBpcyBub3QgUENLX1RyaXZpYWwuCisgICAgUERJS19TdHJ1Y3QKKyAgfTsKKworICAvLy8gRnVuY3Rpb25zIHRvIHF1ZXJ5IGJhc2ljIHByb3BlcnRpZXMgb2Ygbm9uLXRyaXZpYWwgQyBzdHJ1Y3QgdHlwZXMuCisKKyAgLy8vIENoZWNrIGlmIHRoaXMgaXMgYSBub24tdHJpdmlhbCB0eXBlIHRoYXQgd291bGQgY2F1c2UgYSBDIHN0cnVjdAorICAvLy8gdHJhbnNpdGl2ZWx5IGNvbnRhaW5pbmcgdGhpcyB0eXBlIHRvIGJlIG5vbi10cml2aWFsIHRvIGRlZmF1bHQgaW5pdGlhbGl6ZQorICAvLy8gYW5kIHJldHVybiB0aGUga2luZC4KKyAgUHJpbWl0aXZlRGVmYXVsdEluaXRpYWxpemVLaW5kCisgIGlzTm9uVHJpdmlhbFRvUHJpbWl0aXZlRGVmYXVsdEluaXRpYWxpemUoKSBjb25zdDsKKworICBlbnVtIFByaW1pdGl2ZUNvcHlLaW5kIHsKKyAgICAvLy8gVGhlIHR5cGUgZG9lcyBub3QgZmFsbCBpbnRvIGFueSBvZiB0aGUgZm9sbG93aW5nIGNhdGVnb3JpZXMuIE5vdGUgdGhhdAorICAgIC8vLyB0aGlzIGNhc2UgaXMgemVyby12YWx1ZWQgc28gdGhhdCB2YWx1ZXMgb2YgdGhpcyBlbnVtIGNhbiBiZSB1c2VkIGFzIGEKKyAgICAvLy8gYm9vbGVhbiBjb25kaXRpb24gZm9yIG5vbi10cml2aWFsaXR5LgorICAgIFBDS19Ucml2aWFsLAorCisgICAgLy8vIFRoZSB0eXBlIHdvdWxkIGJlIHRyaXZpYWwgZXhjZXB0IHRoYXQgaXQgaXMgdm9sYXRpbGUtcXVhbGlmaWVkLiBUeXBlcworICAgIC8vLyB0aGF0IGZhbGwgaW50byBvbmUgb2YgdGhlIG90aGVyIG5vbi10cml2aWFsIGNhc2VzIG1heSBhZGRpdGlvbmFsbHkgYmUKKyAgICAvLy8gdm9sYXRpbGUtcXVhbGlmaWVkLgorICAgIFBDS19Wb2xhdGlsZVRyaXZpYWwsCisKKyAgICAvLy8gVGhlIHR5cGUgaXMgYW4gT2JqZWN0aXZlLUMgcmV0YWluYWJsZSBwb2ludGVyIHR5cGUgdGhhdCBpcyBxdWFsaWZpZWQKKyAgICAvLy8gd2l0aCB0aGUgQVJDIF9fc3Ryb25nIHF1YWxpZmllci4KKyAgICBQQ0tfQVJDU3Ryb25nLAorCisgICAgLy8vIFRoZSB0eXBlIGlzIGFuIE9iamVjdGl2ZS1DIHJldGFpbmFibGUgcG9pbnRlciB0eXBlIHRoYXQgaXMgcXVhbGlmaWVkCisgICAgLy8vIHdpdGggdGhlIEFSQyBfX3dlYWsgcXVhbGlmaWVyLgorICAgIFBDS19BUkNXZWFrLAorCisgICAgLy8vIFRoZSB0eXBlIGlzIGEgc3RydWN0IGNvbnRhaW5pbmcgYSBmaWVsZCB3aG9zZSB0eXBlIGlzIG5laXRoZXIKKyAgICAvLy8gUENLX1RyaXZpYWwgbm9yIFBDS19Wb2xhdGlsZVRyaXZpYWwuCisgICAgLy8vIE5vdGUgdGhhdCBhIEMrKyBzdHJ1Y3QgdHlwZSBkb2VzIG5vdCBuZWNlc3NhcmlseSBtYXRjaCB0aGlzOyBDKysgY29weWluZworICAgIC8vLyBzZW1hbnRpY3MgYXJlIHRvbyBjb21wbGV4IHRvIGV4cHJlc3MgaGVyZSwgaW4gcGFydCBiZWNhdXNlIHRoZXkgZGVwZW5kCisgICAgLy8vIG9uIHRoZSBleGFjdCBjb25zdHJ1Y3RvciBvciBhc3NpZ25tZW50IG9wZXJhdG9yIHRoYXQgaXMgY2hvc2VuIGJ5CisgICAgLy8vIG92ZXJsb2FkIHJlc29sdXRpb24gdG8gZG8gdGhlIGNvcHkuCisgICAgUENLX1N0cnVjdAorICB9OworCisgIC8vLyBDaGVjayBpZiB0aGlzIGlzIGEgbm9uLXRyaXZpYWwgdHlwZSB0aGF0IHdvdWxkIGNhdXNlIGEgQyBzdHJ1Y3QKKyAgLy8vIHRyYW5zaXRpdmVseSBjb250YWluaW5nIHRoaXMgdHlwZSB0byBiZSBub24tdHJpdmlhbCB0byBjb3B5IGFuZCByZXR1cm4gdGhlCisgIC8vLyBraW5kLgorICBQcmltaXRpdmVDb3B5S2luZCBpc05vblRyaXZpYWxUb1ByaW1pdGl2ZUNvcHkoKSBjb25zdDsKKworICAvLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIG5vbi10cml2aWFsIHR5cGUgdGhhdCB3b3VsZCBjYXVzZSBhIEMgc3RydWN0CisgIC8vLyB0cmFuc2l0aXZlbHkgY29udGFpbmluZyB0aGlzIHR5cGUgdG8gYmUgbm9uLXRyaXZpYWwgdG8gZGVzdHJ1Y3RpdmVseQorICAvLy8gbW92ZSBhbmQgcmV0dXJuIHRoZSBraW5kLiBEZXN0cnVjdGl2ZSBtb3ZlIGluIHRoaXMgY29udGV4dCBpcyBhIEMrKy1zdHlsZQorICAvLy8gbW92ZSBpbiB3aGljaCB0aGUgc291cmNlIG9iamVjdCBpcyBwbGFjZWQgaW4gYSB2YWxpZCBidXQgdW5zcGVjaWZpZWQgc3RhdGUKKyAgLy8vIGFmdGVyIGl0IGlzIG1vdmVkLCBhcyBvcHBvc2VkIHRvIGEgdHJ1bHkgZGVzdHJ1Y3RpdmUgbW92ZSBpbiB3aGljaCB0aGUKKyAgLy8vIHNvdXJjZSBvYmplY3QgaXMgcGxhY2VkIGluIGFuIHVuaW5pdGlhbGl6ZWQgc3RhdGUuCisgIFByaW1pdGl2ZUNvcHlLaW5kIGlzTm9uVHJpdmlhbFRvUHJpbWl0aXZlRGVzdHJ1Y3RpdmVNb3ZlKCkgY29uc3Q7CisKKyAgYm9vbCBjYW5QYXNzSW5SZWdpc3RlcnMoKSBjb25zdDsKKworICBlbnVtIERlc3RydWN0aW9uS2luZCB7CisgICAgREtfbm9uZSwKKyAgICBES19jeHhfZGVzdHJ1Y3RvciwKKyAgICBES19vYmpjX3N0cm9uZ19saWZldGltZSwKKyAgICBES19vYmpjX3dlYWtfbGlmZXRpbWUsCisgICAgREtfbm9udHJpdmlhbF9jX3N0cnVjdAorICB9OworCisgIC8vLyBSZXR1cm5zIGEgbm9uemVybyB2YWx1ZSBpZiBvYmplY3RzIG9mIHRoaXMgdHlwZSByZXF1aXJlCisgIC8vLyBub24tdHJpdmlhbCB3b3JrIHRvIGNsZWFuIHVwIGFmdGVyLiAgTm9uLXplcm8gYmVjYXVzZSBpdCdzCisgIC8vLyBjb25jZWl2YWJsZSB0aGF0IHF1YWxpZmllcnMgKG9iamNfZ2Mod2Vhayk/KSBjb3VsZCBtYWtlCisgIC8vLyBzb21ldGhpbmcgcmVxdWlyZSBkZXN0cnVjdGlvbi4KKyAgRGVzdHJ1Y3Rpb25LaW5kIGlzRGVzdHJ1Y3RlZFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRGVzdHJ1Y3RlZFR5cGVJbXBsKCp0aGlzKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciBleHByZXNzaW9ucyBvZiB0aGUgZ2l2ZW4gdHlwZSBhcmUgZm9yYmlkZGVuCisgIC8vLyBmcm9tIGJlaW5nIGx2YWx1ZXMgaW4gQy4KKyAgLy8vCisgIC8vLyBUaGUgZXhwcmVzc2lvbiB0eXBlcyB0aGF0IGFyZSBmb3JiaWRkZW4gdG8gYmUgbHZhbHVlcyBhcmU6CisgIC8vLyAgIC0gJ3ZvaWQnLCBidXQgbm90IHF1YWxpZmllZCB2b2lkCisgIC8vLyAgIC0gZnVuY3Rpb24gdHlwZXMKKyAgLy8vCisgIC8vLyBUaGUgZXhhY3QgcnVsZSBoZXJlIGlzIEM5OSA2LjMuMi4xOgorICAvLy8gICBBbiBsdmFsdWUgaXMgYW4gZXhwcmVzc2lvbiB3aXRoIGFuIG9iamVjdCB0eXBlIG9yIGFuIGluY29tcGxldGUKKyAgLy8vICAgdHlwZSBvdGhlciB0aGFuIHZvaWQuCisgIGJvb2wgaXNDRm9yYmlkZGVuTFZhbHVlVHlwZSgpIGNvbnN0OworCisgIC8vLyBTdWJzdGl0dXRlIHR5cGUgYXJndW1lbnRzIGZvciB0aGUgT2JqZWN0aXZlLUMgdHlwZSBwYXJhbWV0ZXJzIHVzZWQgaW4gdGhlCisgIC8vLyBzdWJqZWN0IHR5cGUuCisgIC8vLworICAvLy8gXHBhcmFtIGN0eCBBU1RDb250ZXh0IGluIHdoaWNoIHRoZSB0eXBlIGV4aXN0cy4KKyAgLy8vCisgIC8vLyBccGFyYW0gdHlwZUFyZ3MgVGhlIHR5cGUgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCBmb3IgdGhlCisgIC8vLyBPYmplY3RpdmUtQyB0eXBlIHBhcmFtZXRlcnMgaW4gdGhlIHN1YmplY3QgdHlwZSwgd2hpY2ggYXJlIGdlbmVyYWxseQorICAvLy8gY29tcHV0ZWQgdmlhIFxjIFR5cGU6OmdldE9iakNTdWJzdGl0dXRpb25zLiBJZiBlbXB0eSwgdGhlIHR5cGUKKyAgLy8vIHBhcmFtZXRlcnMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZWlyIGJvdW5kcyBvciBpZC9DbGFzcywgYXMgYXBwcm9wcmlhdGUKKyAgLy8vIGZvciB0aGUgY29udGV4dC4KKyAgLy8vCisgIC8vLyBccGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgc3ViamVjdCB0eXBlIHdhcyB3cml0dGVuLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSByZXN1bHRpbmcgdHlwZS4KKyAgUXVhbFR5cGUgc3Vic3RPYmpDVHlwZUFyZ3MoQVNUQ29udGV4dCAmY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxRdWFsVHlwZT4gdHlwZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNTdWJzdGl0dXRpb25Db250ZXh0IGNvbnRleHQpIGNvbnN0OworCisgIC8vLyBTdWJzdGl0dXRlIHR5cGUgYXJndW1lbnRzIGZyb20gYW4gb2JqZWN0IHR5cGUgZm9yIHRoZSBPYmplY3RpdmUtQyB0eXBlCisgIC8vLyBwYXJhbWV0ZXJzIHVzZWQgaW4gdGhlIHN1YmplY3QgdHlwZS4KKyAgLy8vCisgIC8vLyBUaGlzIG9wZXJhdGlvbiBjb21iaW5lcyB0aGUgY29tcHV0YXRpb24gb2YgdHlwZSBhcmd1bWVudHMgZm9yCisgIC8vLyBzdWJzdGl0dXRpb24gKFxjIFR5cGU6OmdldE9iakNTdWJzdGl0dXRpb25zKSB3aXRoIHRoZSBhY3R1YWwgcHJvY2VzcyBvZgorICAvLy8gc3Vic3RpdHV0aW9uIChcYyBRdWFsVHlwZTo6c3Vic3RPYmpDVHlwZUFyZ3MpIGZvciB0aGUgY29udmVuaWVuY2Ugb2YKKyAgLy8vIGNhbGxlcnMgdGhhdCBuZWVkIHRvIHBlcmZvcm0gYSBzaW5nbGUgc3Vic3RpdHV0aW9uIGluIGlzb2xhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gb2JqZWN0VHlwZSBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0IHdob3NlIG1lbWJlciB0eXBlIHdlJ3JlCisgIC8vLyBzdWJzdGl0dXRpbmcgaW50by4gRm9yIGV4YW1wbGUsIHRoaXMgbWlnaHQgYmUgdGhlIHJlY2VpdmVyIG9mIGEgbWVzc2FnZQorICAvLy8gb3IgdGhlIGJhc2Ugb2YgYSBwcm9wZXJ0eSBhY2Nlc3MuCisgIC8vLworICAvLy8gXHBhcmFtIGRjIFRoZSBkZWNsYXJhdGlvbiBjb250ZXh0IGZyb20gd2hpY2ggdGhlIHN1YmplY3QgdHlwZSB3YXMKKyAgLy8vIHJldHJpZXZlZCwgd2hpY2ggaW5kaWNhdGVzIChmb3IgZXhhbXBsZSkgd2hpY2ggdHlwZSBwYXJhbWV0ZXJzIHNob3VsZAorICAvLy8gYmUgc3Vic3RpdHV0ZWQuCisgIC8vLworICAvLy8gXHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN1YmplY3QgdHlwZSB3YXMgd3JpdHRlbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgc3ViamVjdCB0eXBlIGFmdGVyIHJlcGxhY2luZyBhbGwgb2YgdGhlIE9iamVjdGl2ZS1DIHR5cGUKKyAgLy8vIHBhcmFtZXRlcnMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIGFyZ3VtZW50cy4KKyAgUXVhbFR5cGUgc3Vic3RPYmpDTWVtYmVyVHlwZShRdWFsVHlwZSBvYmplY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xDb250ZXh0ICpkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDU3Vic3RpdHV0aW9uQ29udGV4dCBjb250ZXh0KSBjb25zdDsKKworICAvLy8gU3RyaXAgT2JqZWN0aXZlLUMgIl9fa2luZG9mIiB0eXBlcyBmcm9tIHRoZSBnaXZlbiB0eXBlLgorICBRdWFsVHlwZSBzdHJpcE9iakNLaW5kT2ZUeXBlKGNvbnN0IEFTVENvbnRleHQgJmN0eCkgY29uc3Q7CisKKyAgLy8vIFJlbW92ZSBhbGwgcXVhbGlmaWVycyBpbmNsdWRpbmcgX0F0b21pYy4KKyAgUXVhbFR5cGUgZ2V0QXRvbWljVW5xdWFsaWZpZWRUeXBlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGluIGEgc2VwYXJhdGUgdHJhbnNsYXRpb24gdW5pdDsKKyAgLy8gInN0YXRpYyItaXplIHRoZW0gdG8gYXZvaWQgY3JlYXRpbmcgdGVtcG9yYXJ5IFF1YWxUeXBlcyBpbiB0aGUKKyAgLy8gY2FsbGVyLgorICBzdGF0aWMgYm9vbCBpc0NvbnN0YW50KFF1YWxUeXBlIFQsIGNvbnN0IEFTVENvbnRleHQmIEN0eCk7CisgIHN0YXRpYyBRdWFsVHlwZSBnZXREZXN1Z2FyZWRUeXBlKFF1YWxUeXBlIFQsIGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQpOworICBzdGF0aWMgU3BsaXRRdWFsVHlwZSBnZXRTcGxpdERlc3VnYXJlZFR5cGUoUXVhbFR5cGUgVCk7CisgIHN0YXRpYyBTcGxpdFF1YWxUeXBlIGdldFNwbGl0VW5xdWFsaWZpZWRUeXBlSW1wbChRdWFsVHlwZSB0eXBlKTsKKyAgc3RhdGljIFF1YWxUeXBlIGdldFNpbmdsZVN0ZXBEZXN1Z2FyZWRUeXBlSW1wbChRdWFsVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFTVENvbnRleHQgJkMpOworICBzdGF0aWMgUXVhbFR5cGUgSWdub3JlUGFyZW5zKFF1YWxUeXBlIFQpOworICBzdGF0aWMgRGVzdHJ1Y3Rpb25LaW5kIGlzRGVzdHJ1Y3RlZFR5cGVJbXBsKFF1YWxUeXBlIHR5cGUpOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gSW1wbGVtZW50IHNpbXBsaWZ5X3R5cGUgZm9yIFF1YWxUeXBlLCBzbyB0aGF0IHdlIGNhbiBkeW5fY2FzdCBmcm9tIFF1YWxUeXBlCisvLy8gdG8gYSBzcGVjaWZpYyBUeXBlIGNsYXNzLgordGVtcGxhdGU8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTwgOjpjbGFuZzo6UXVhbFR5cGU+IHsKKyAgdXNpbmcgU2ltcGxlVHlwZSA9IGNvbnN0IDo6Y2xhbmc6OlR5cGUgKjsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoOjpjbGFuZzo6UXVhbFR5cGUgVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXRUeXBlUHRyKCk7CisgIH0KK307CisKKy8vIFRlYWNoIFNtYWxsUHRyU2V0IHRoYXQgUXVhbFR5cGUgaXMgImJhc2ljYWxseSBhIHBvaW50ZXIiLgordGVtcGxhdGU8Pgorc3RydWN0IFBvaW50ZXJMaWtlVHlwZVRyYWl0czxjbGFuZzo6UXVhbFR5cGU+IHsKKyAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKGNsYW5nOjpRdWFsVHlwZSBQKSB7CisgICAgcmV0dXJuIFAuZ2V0QXNPcGFxdWVQdHIoKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgY2xhbmc6OlF1YWxUeXBlIGdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7CisgICAgcmV0dXJuIGNsYW5nOjpRdWFsVHlwZTo6Z2V0RnJvbU9wYXF1ZVB0cihQKTsKKyAgfQorCisgIC8vIFZhcmlvdXMgcXVhbGlmaWVycyBnbyBpbiBsb3cgYml0cy4KKyAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSAwIH07Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBjbGFuZyB7CisKKy8vLyBcYnJpZWYgQmFzZSBjbGFzcyB0aGF0IGlzIGNvbW1vbiB0byBib3RoIHRoZSBcYyBFeHRRdWFscyBhbmQgXGMgVHlwZQorLy8vIGNsYXNzZXMsIHdoaWNoIGFsbG93cyBcYyBRdWFsVHlwZSB0byBhY2Nlc3MgdGhlIGNvbW1vbiBmaWVsZHMgYmV0d2VlbiB0aGUKKy8vLyB0d28uCitjbGFzcyBFeHRRdWFsc1R5cGVDb21tb25CYXNlIHsKKyAgZnJpZW5kIGNsYXNzIEV4dFF1YWxzOworICBmcmllbmQgY2xhc3MgUXVhbFR5cGU7CisgIGZyaWVuZCBjbGFzcyBUeXBlOworCisgIC8vLyBcYnJpZWYgVGhlICJiYXNlIiB0eXBlIG9mIGFuIGV4dGVuZGVkIHF1YWxpZmllcnMgdHlwZSAoXGMgRXh0UXVhbHMpIG9yCisgIC8vLyBhIHNlbGYtcmVmZXJlbnRpYWwgcG9pbnRlciAoZm9yIFxjIFR5cGUpLgorICAvLy8KKyAgLy8vIFRoaXMgcG9pbnRlciBhbGxvd3MgYW4gZWZmaWNpZW50IG1hcHBpbmcgZnJvbSBhIFF1YWxUeXBlIHRvIGl0cworICAvLy8gdW5kZXJseWluZyB0eXBlIHBvaW50ZXIuCisgIGNvbnN0IFR5cGUgKmNvbnN0IEJhc2VUeXBlOworCisgIC8vLyBcYnJpZWYgVGhlIGNhbm9uaWNhbCB0eXBlIG9mIHRoaXMgdHlwZS4gIEEgUXVhbFR5cGUuCisgIFF1YWxUeXBlIENhbm9uaWNhbFR5cGU7CisKKyAgRXh0UXVhbHNUeXBlQ29tbW9uQmFzZShjb25zdCBUeXBlICpiYXNlVHlwZSwgUXVhbFR5cGUgY2Fub24pCisgICAgICA6IEJhc2VUeXBlKGJhc2VUeXBlKSwgQ2Fub25pY2FsVHlwZShjYW5vbikge30KK307CisKKy8vLyBXZSBjYW4gZW5jb2RlIHVwIHRvIGZvdXIgYml0cyBpbiB0aGUgbG93IGJpdHMgb2YgYQorLy8vIHR5cGUgcG9pbnRlciwgYnV0IHRoZXJlIGFyZSBtYW55IG1vcmUgdHlwZSBxdWFsaWZpZXJzIHRoYXQgd2Ugd2FudAorLy8vIHRvIGJlIGFibGUgdG8gYXBwbHkgdG8gYW4gYXJiaXRyYXJ5IHR5cGUuICBUaGVyZWZvcmUgd2UgaGF2ZSB0aGlzCisvLy8gc3RydWN0LCBpbnRlbmRlZCB0byBiZSBoZWFwLWFsbG9jYXRlZCBhbmQgdXNlZCBieSBRdWFsVHlwZSB0bworLy8vIHN0b3JlIHF1YWxpZmllcnMuCisvLy8KKy8vLyBUaGUgY3VycmVudCBkZXNpZ24gdGFncyB0aGUgJ2NvbnN0JywgJ3Jlc3RyaWN0JywgYW5kICd2b2xhdGlsZScgcXVhbGlmaWVycworLy8vIGluIHRocmVlIGxvdyBiaXRzIG9uIHRoZSBRdWFsVHlwZSBwb2ludGVyOyBhIGZvdXJ0aCBiaXQgcmVjb3JkcyB3aGV0aGVyCisvLy8gdGhlIHBvaW50ZXIgaXMgYW4gRXh0UXVhbHMgbm9kZS4gVGhlIGV4dGVuZGVkIHF1YWxpZmllcnMgKGFkZHJlc3Mgc3BhY2VzLAorLy8vIE9iamVjdGl2ZS1DIEdDIGF0dHJpYnV0ZXMpIGFyZSBtdWNoIG1vcmUgcmFyZS4KK2NsYXNzIEV4dFF1YWxzIDogcHVibGljIEV4dFF1YWxzVHlwZUNvbW1vbkJhc2UsIHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CisgIC8vIE5PVEU6IGNoYW5naW5nIHRoZSBmYXN0IHF1YWxpZmllcnMgc2hvdWxkIGJlIHN0cmFpZ2h0Zm9yd2FyZCBhcworICAvLyBsb25nIGFzIHlvdSBkb24ndCBtYWtlICdjb25zdCcgbm9uLWZhc3QuCisgIC8vIDEuIFF1YWxpZmllcnM6CisgIC8vICAgIGEpIE1vZGlmeSB0aGUgYml0bWFza3MgKFF1YWxpZmllcnM6OlRRIGFuZCBEZWNsU3BlYzo6VFEpLgorICAvLyAgICAgICBGYXN0IHF1YWxpZmllcnMgbXVzdCBvY2N1cHkgdGhlIGxvdy1vcmRlciBiaXRzLgorICAvLyAgICBiKSBVcGRhdGUgUXVhbGlmaWVyczo6RmFzdFdpZHRoIGFuZCBGYXN0TWFzay4KKyAgLy8gMi4gUXVhbFR5cGU6CisgIC8vICAgIGEpIFVwZGF0ZSBpc3tWb2xhdGlsZSxSZXN0cmljdH1RdWFsaWZpZWQoKSwgZGVmaW5lZCBpbmxpbmUuCisgIC8vICAgIGIpIFVwZGF0ZSByZW1vdmV7Vm9sYXRpbGUsUmVzdHJpY3R9LCBkZWZpbmVkIG5lYXIgdGhlIGVuZCBvZgorICAvLyAgICAgICB0aGlzIGhlYWRlci4KKyAgLy8gMy4gQVNUQ29udGV4dDoKKyAgLy8gICAgYSkgVXBkYXRlIGdldHtWb2xhdGlsZSxSZXN0cmljdH1UeXBlLgorCisgIC8vLyBUaGUgaW1tdXRhYmxlIHNldCBvZiBxdWFsaWZpZXJzIGFwcGxpZWQgYnkgdGhpcyBub2RlLiBBbHdheXMgY29udGFpbnMKKyAgLy8vIGV4dGVuZGVkIHF1YWxpZmllcnMuCisgIFF1YWxpZmllcnMgUXVhbHM7CisKKyAgRXh0UXVhbHMgKnRoaXNfKCkgeyByZXR1cm4gdGhpczsgfQorCitwdWJsaWM6CisgIEV4dFF1YWxzKGNvbnN0IFR5cGUgKmJhc2VUeXBlLCBRdWFsVHlwZSBjYW5vbiwgUXVhbGlmaWVycyBxdWFscykKKyAgICAgIDogRXh0UXVhbHNUeXBlQ29tbW9uQmFzZShiYXNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5vbi5pc051bGwoKSA/IFF1YWxUeXBlKHRoaXNfKCksIDApIDogY2Fub24pLAorICAgICAgICBRdWFscyhxdWFscykgeworICAgIGFzc2VydChRdWFscy5oYXNOb25GYXN0UXVhbGlmaWVycygpCisgICAgICAgICAgICYmICJFeHRRdWFscyBjcmVhdGVkIHdpdGggbm8gZmFzdCBxdWFsaWZpZXJzIik7CisgICAgYXNzZXJ0KCFRdWFscy5oYXNGYXN0UXVhbGlmaWVycygpCisgICAgICAgICAgICYmICJFeHRRdWFscyBjcmVhdGVkIHdpdGggZmFzdCBxdWFsaWZpZXJzIik7CisgIH0KKworICBRdWFsaWZpZXJzIGdldFF1YWxpZmllcnMoKSBjb25zdCB7IHJldHVybiBRdWFsczsgfQorCisgIGJvb2wgaGFzT2JqQ0dDQXR0cigpIGNvbnN0IHsgcmV0dXJuIFF1YWxzLmhhc09iakNHQ0F0dHIoKTsgfQorICBRdWFsaWZpZXJzOjpHQyBnZXRPYmpDR0NBdHRyKCkgY29uc3QgeyByZXR1cm4gUXVhbHMuZ2V0T2JqQ0dDQXR0cigpOyB9CisKKyAgYm9vbCBoYXNPYmpDTGlmZXRpbWUoKSBjb25zdCB7IHJldHVybiBRdWFscy5oYXNPYmpDTGlmZXRpbWUoKTsgfQorICBRdWFsaWZpZXJzOjpPYmpDTGlmZXRpbWUgZ2V0T2JqQ0xpZmV0aW1lKCkgY29uc3QgeworICAgIHJldHVybiBRdWFscy5nZXRPYmpDTGlmZXRpbWUoKTsKKyAgfQorCisgIGJvb2wgaGFzQWRkcmVzc1NwYWNlKCkgY29uc3QgeyByZXR1cm4gUXVhbHMuaGFzQWRkcmVzc1NwYWNlKCk7IH0KKyAgTGFuZ0FTIGdldEFkZHJlc3NTcGFjZSgpIGNvbnN0IHsgcmV0dXJuIFF1YWxzLmdldEFkZHJlc3NTcGFjZSgpOyB9CisKKyAgY29uc3QgVHlwZSAqZ2V0QmFzZVR5cGUoKSBjb25zdCB7IHJldHVybiBCYXNlVHlwZTsgfQorCitwdWJsaWM6CisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3QgeworICAgIFByb2ZpbGUoSUQsIGdldEJhc2VUeXBlKCksIFF1YWxzKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqQmFzZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgUXVhbGlmaWVycyBRdWFscykgeworICAgIGFzc2VydCghUXVhbHMuaGFzRmFzdFF1YWxpZmllcnMoKSAmJiAiZmFzdCBxdWFsaWZpZXJzIGluIEV4dFF1YWxzIGhhc2ghIik7CisgICAgSUQuQWRkUG9pbnRlcihCYXNlVHlwZSk7CisgICAgUXVhbHMuUHJvZmlsZShJRCk7CisgIH0KK307CisKKy8vLyBUaGUga2luZCBvZiBDKysxMSByZWYtcXVhbGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIGZ1bmN0aW9uIHR5cGUuCisvLy8gVGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgYSBtZW1iZXIgZnVuY3Rpb24ncyAidGhpcyIgb2JqZWN0IGNhbiBiZSBhbgorLy8vIGx2YWx1ZSwgcnZhbHVlLCBvciBuZWl0aGVyLgorZW51bSBSZWZRdWFsaWZpZXJLaW5kIHsKKyAgLy8vIFxicmllZiBObyByZWYtcXVhbGlmaWVyIHdhcyBwcm92aWRlZC4KKyAgUlFfTm9uZSA9IDAsCisKKyAgLy8vIFxicmllZiBBbiBsdmFsdWUgcmVmLXF1YWxpZmllciB3YXMgcHJvdmlkZWQgKFxjICYpLgorICBSUV9MVmFsdWUsCisKKyAgLy8vIFxicmllZiBBbiBydmFsdWUgcmVmLXF1YWxpZmllciB3YXMgcHJvdmlkZWQgKFxjICYmKS4KKyAgUlFfUlZhbHVlCit9OworCisvLy8gV2hpY2gga2V5d29yZChzKSB3ZXJlIHVzZWQgdG8gY3JlYXRlIGFuIEF1dG9UeXBlLgorZW51bSBjbGFzcyBBdXRvVHlwZUtleXdvcmQgeworICAvLy8gXGJyaWVmIGF1dG8KKyAgQXV0bywKKworICAvLy8gXGJyaWVmIGRlY2x0eXBlKGF1dG8pCisgIERlY2x0eXBlQXV0bywKKworICAvLy8gXGJyaWVmIF9fYXV0b190eXBlIChHTlUgZXh0ZW5zaW9uKQorICBHTlVBdXRvVHlwZQorfTsKKworLy8vIFRoZSBiYXNlIGNsYXNzIG9mIHRoZSB0eXBlIGhpZXJhcmNoeS4KKy8vLworLy8vIEEgY2VudHJhbCBjb25jZXB0IHdpdGggdHlwZXMgaXMgdGhhdCBlYWNoIHR5cGUgYWx3YXlzIGhhcyBhIGNhbm9uaWNhbAorLy8vIHR5cGUuICBBIGNhbm9uaWNhbCB0eXBlIGlzIHRoZSB0eXBlIHdpdGggYW55IHR5cGVkZWYgbmFtZXMgc3RyaXBwZWQgb3V0CisvLy8gb2YgaXQgb3IgdGhlIHR5cGVzIGl0IHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZSwgY29uc2lkZXI6CisvLy8KKy8vLyAgdHlwZWRlZiBpbnQgIGZvbzsKKy8vLyAgdHlwZWRlZiBmb28qIGJhcjsKKy8vLyAgICAnaW50IConICAgICdmb28gKicgICAgJ2JhcicKKy8vLworLy8vIFRoZXJlIHdpbGwgYmUgYSBUeXBlIG9iamVjdCBjcmVhdGVkIGZvciAnaW50Jy4gIFNpbmNlIGludCBpcyBjYW5vbmljYWwsIGl0cworLy8vIENhbm9uaWNhbFR5cGUgcG9pbnRlciBwb2ludHMgdG8gaXRzZWxmLiAgVGhlcmUgaXMgYWxzbyBhIFR5cGUgZm9yICdmb28nIChhCisvLy8gVHlwZWRlZlR5cGUpLiAgSXRzIENhbm9uaWNhbFR5cGUgcG9pbnRlciBwb2ludHMgdG8gdGhlICdpbnQnIFR5cGUuICBOZXh0CisvLy8gdGhlcmUgaXMgYSBQb2ludGVyVHlwZSB0aGF0IHJlcHJlc2VudHMgJ2ludConLCB3aGljaCwgbGlrZSAnaW50JywgaXMKKy8vLyBjYW5vbmljYWwuICBGaW5hbGx5LCB0aGVyZSBpcyBhIFBvaW50ZXJUeXBlIHR5cGUgZm9yICdmb28qJyB3aG9zZSBjYW5vbmljYWwKKy8vLyB0eXBlIGlzICdpbnQqJywgYW5kIHRoZXJlIGlzIGEgVHlwZWRlZlR5cGUgZm9yICdiYXInLCB3aG9zZSBjYW5vbmljYWwgdHlwZQorLy8vIGlzIGFsc28gJ2ludConLgorLy8vCisvLy8gTm9uLWNhbm9uaWNhbCB0eXBlcyBhcmUgdXNlZnVsIGZvciBlbWl0dGluZyBkaWFnbm9zdGljcywgd2l0aG91dCBsb3NpbmcKKy8vLyBpbmZvcm1hdGlvbiBhYm91dCB0eXBlZGVmcyBiZWluZyB1c2VkLiAgQ2Fub25pY2FsIHR5cGVzIGFyZSB1c2VmdWwgZm9yIHR5cGUKKy8vLyBjb21wYXJpc29ucyAodGhleSBhbGxvdyBieS1wb2ludGVyIGVxdWFsaXR5IHRlc3RzKSBhbmQgdXNlZnVsIGZvciByZWFzb25pbmcKKy8vLyBhYm91dCB3aGV0aGVyIHNvbWV0aGluZyBoYXMgYSBwYXJ0aWN1bGFyIGZvcm0gKGUuZy4gaXMgYSBmdW5jdGlvbiB0eXBlKSwKKy8vLyBiZWNhdXNlIHRoZXkgaW1wbGljaXRseSwgcmVjdXJzaXZlbHksIHN0cmlwIGFsbCB0eXBlZGVmcyBvdXQgb2YgYSB0eXBlLgorLy8vCisvLy8gVHlwZXMsIG9uY2UgY3JlYXRlZCwgYXJlIGltbXV0YWJsZS4KKy8vLworY2xhc3MgVHlwZSA6IHB1YmxpYyBFeHRRdWFsc1R5cGVDb21tb25CYXNlIHsKK3B1YmxpYzoKKyAgZW51bSBUeXBlQ2xhc3MgeworI2RlZmluZSBUWVBFKENsYXNzLCBCYXNlKSBDbGFzcywKKyNkZWZpbmUgTEFTVF9UWVBFKENsYXNzKSBUeXBlTGFzdCA9IENsYXNzLAorI2RlZmluZSBBQlNUUkFDVF9UWVBFKENsYXNzLCBCYXNlKQorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTm9kZXMuZGVmIgorICAgIFRhZ0ZpcnN0ID0gUmVjb3JkLCBUYWdMYXN0ID0gRW51bQorICB9OworCitwcml2YXRlOgorICAvLy8gQml0ZmllbGRzIHJlcXVpcmVkIGJ5IHRoZSBUeXBlIGNsYXNzLgorICBjbGFzcyBUeXBlQml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgVHlwZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gZnJpZW5kIGNsYXNzIFR5cGVQcm9wZXJ0eUNhY2hlOworCisgICAgLy8vIFR5cGVDbGFzcyBiaXRmaWVsZCAtIEVudW0gdGhhdCBzcGVjaWZpZXMgd2hhdCBzdWJjbGFzcyB0aGlzIGJlbG9uZ3MgdG8uCisgICAgdW5zaWduZWQgVEMgOiA4OworCisgICAgLy8vIFdoZXRoZXIgdGhpcyB0eXBlIGlzIGEgZGVwZW5kZW50IHR5cGUgKEMrKyBbdGVtcC5kZXAudHlwZV0pLgorICAgIHVuc2lnbmVkIERlcGVuZGVudCA6IDE7CisKKyAgICAvLy8gV2hldGhlciB0aGlzIHR5cGUgc29tZWhvdyBpbnZvbHZlcyBhIHRlbXBsYXRlIHBhcmFtZXRlciwgZXZlbgorICAgIC8vLyBpZiB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgdHlwZSBkb2VzIG5vdCBkZXBlbmQgb24gYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCisgICAgdW5zaWduZWQgSW5zdGFudGlhdGlvbkRlcGVuZGVudCA6IDE7CisKKyAgICAvLy8gV2hldGhlciB0aGlzIHR5cGUgaXMgYSB2YXJpYWJseS1tb2RpZmllZCB0eXBlIChDOTkgNi43LjUpLgorICAgIHVuc2lnbmVkIFZhcmlhYmx5TW9kaWZpZWQgOiAxOworCisgICAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgdHlwZSBjb250YWlucyBhbiB1bmV4cGFuZGVkIHBhcmFtZXRlciBwYWNrCisgICAgLy8vIChmb3IgQysrMTEgdmFyaWFkaWMgdGVtcGxhdGVzKS4KKyAgICB1bnNpZ25lZCBDb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrIDogMTsKKworICAgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGUgY2FjaGUgKGkuZS4gdGhlIGJpdGZpZWxkcyBoZXJlIHN0YXJ0aW5nIHdpdGgKKyAgICAvLy8gJ0NhY2hlJykgaXMgdmFsaWQuCisgICAgbXV0YWJsZSB1bnNpZ25lZCBDYWNoZVZhbGlkIDogMTsKKworICAgIC8vLyBcYnJpZWYgTGlua2FnZSBvZiB0aGlzIHR5cGUuCisgICAgbXV0YWJsZSB1bnNpZ25lZCBDYWNoZWRMaW5rYWdlIDogMzsKKworICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIHR5cGUgaW52b2x2ZXMgYW5kIGxvY2FsIG9yIHVubmFtZWQgdHlwZXMuCisgICAgbXV0YWJsZSB1bnNpZ25lZCBDYWNoZWRMb2NhbE9yVW5uYW1lZCA6IDE7CisKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyB0eXBlIGNvbWVzIGZyb20gYW4gQVNUIGZpbGUuCisgICAgbXV0YWJsZSB1bnNpZ25lZCBGcm9tQVNUIDogMTsKKworICAgIGJvb2wgaXNDYWNoZVZhbGlkKCkgY29uc3QgeworICAgICAgcmV0dXJuIENhY2hlVmFsaWQ7CisgICAgfQorCisgICAgTGlua2FnZSBnZXRMaW5rYWdlKCkgY29uc3QgeworICAgICAgYXNzZXJ0KGlzQ2FjaGVWYWxpZCgpICYmICJnZXR0aW5nIGxpbmthZ2UgZnJvbSBpbnZhbGlkIGNhY2hlIik7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TGlua2FnZT4oQ2FjaGVkTGlua2FnZSk7CisgICAgfQorCisgICAgYm9vbCBoYXNMb2NhbE9yVW5uYW1lZFR5cGUoKSBjb25zdCB7CisgICAgICBhc3NlcnQoaXNDYWNoZVZhbGlkKCkgJiYgImdldHRpbmcgbGlua2FnZSBmcm9tIGludmFsaWQgY2FjaGUiKTsKKyAgICAgIHJldHVybiBDYWNoZWRMb2NhbE9yVW5uYW1lZDsKKyAgICB9CisgIH07CisgIGVudW0geyBOdW1UeXBlQml0cyA9IDE4IH07CisKK3Byb3RlY3RlZDoKKyAgLy8gVGhlc2UgY2xhc3NlcyBhbGxvdyBzdWJjbGFzc2VzIHRvIHNvbWV3aGF0IGNsZWFubHkgcGFjayBiaXRmaWVsZHMKKyAgLy8gaW50byBUeXBlLgorCisgIGNsYXNzIEFycmF5VHlwZUJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIEFycmF5VHlwZTsKKworICAgIHVuc2lnbmVkIDogTnVtVHlwZUJpdHM7CisKKyAgICAvLy8gQ1ZSIHF1YWxpZmllcnMgZnJvbSBkZWNsYXJhdGlvbnMgbGlrZQorICAgIC8vLyAnaW50IFhbc3RhdGljIHJlc3RyaWN0IDRdJy4gRm9yIGZ1bmN0aW9uIHBhcmFtZXRlcnMgb25seS4KKyAgICB1bnNpZ25lZCBJbmRleFR5cGVRdWFscyA6IDM7CisKKyAgICAvLy8gU3RvcmFnZSBjbGFzcyBxdWFsaWZpZXJzIGZyb20gZGVjbGFyYXRpb25zIGxpa2UKKyAgICAvLy8gJ2ludCBYW3N0YXRpYyByZXN0cmljdCA0XScuIEZvciBmdW5jdGlvbiBwYXJhbWV0ZXJzIG9ubHkuCisgICAgLy8vIEFjdHVhbGx5IGFuIEFycmF5VHlwZTo6QXJyYXlTaXplTW9kaWZpZXIuCisgICAgdW5zaWduZWQgU2l6ZU1vZGlmaWVyIDogMzsKKyAgfTsKKworICBjbGFzcyBCdWlsdGluVHlwZUJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIEJ1aWx0aW5UeXBlOworCisgICAgdW5zaWduZWQgOiBOdW1UeXBlQml0czsKKworICAgIC8vLyBUaGUga2luZCAoQnVpbHRpblR5cGU6OktpbmQpIG9mIGJ1aWx0aW4gdHlwZSB0aGlzIGlzLgorICAgIHVuc2lnbmVkIEtpbmQgOiA4OworICB9OworCisgIGNsYXNzIEZ1bmN0aW9uVHlwZUJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIEZ1bmN0aW9uUHJvdG9UeXBlOworICAgIGZyaWVuZCBjbGFzcyBGdW5jdGlvblR5cGU7CisKKyAgICB1bnNpZ25lZCA6IE51bVR5cGVCaXRzOworCisgICAgLy8vIEV4dHJhIGluZm9ybWF0aW9uIHdoaWNoIGFmZmVjdHMgaG93IHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQsIGxpa2UKKyAgICAvLy8gcmVncGFybSBhbmQgdGhlIGNhbGxpbmcgY29udmVudGlvbi4KKyAgICB1bnNpZ25lZCBFeHRJbmZvIDogMTI7CisKKyAgICAvLy8gVXNlZCBvbmx5IGJ5IEZ1bmN0aW9uUHJvdG9UeXBlLCBwdXQgaGVyZSB0byBwYWNrIHdpdGggdGhlCisgICAgLy8vIG90aGVyIGJpdGZpZWxkcy4KKyAgICAvLy8gVGhlIHF1YWxpZmllcnMgYXJlIHBhcnQgb2YgRnVuY3Rpb25Qcm90b1R5cGUgYmVjYXVzZS4uLgorICAgIC8vLworICAgIC8vLyBDKysgOC4zLjVwNDogVGhlIHJldHVybiB0eXBlLCB0aGUgcGFyYW1ldGVyIHR5cGUgbGlzdCBhbmQgdGhlCisgICAgLy8vIGN2LXF1YWxpZmllci1zZXEsIFsuLi5dLCBhcmUgcGFydCBvZiB0aGUgZnVuY3Rpb24gdHlwZS4KKyAgICB1bnNpZ25lZCBUeXBlUXVhbHMgOiA0OworCisgICAgLy8vIFxicmllZiBUaGUgcmVmLXF1YWxpZmllciBhc3NvY2lhdGVkIHdpdGggYSBcYyBGdW5jdGlvblByb3RvVHlwZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyBhIHZhbHVlIG9mIHR5cGUgXGMgUmVmUXVhbGlmaWVyS2luZC4KKyAgICB1bnNpZ25lZCBSZWZRdWFsaWZpZXIgOiAyOworICB9OworCisgIGNsYXNzIE9iakNPYmplY3RUeXBlQml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgT2JqQ09iamVjdFR5cGU7CisKKyAgICB1bnNpZ25lZCA6IE51bVR5cGVCaXRzOworCisgICAgLy8vIFRoZSBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgc3RvcmVkIGRpcmVjdGx5IG9uIHRoaXMgb2JqZWN0IHR5cGUuCisgICAgdW5zaWduZWQgTnVtVHlwZUFyZ3MgOiA3OworCisgICAgLy8vIFRoZSBudW1iZXIgb2YgcHJvdG9jb2xzIHN0b3JlZCBkaXJlY3RseSBvbiB0aGlzIG9iamVjdCB0eXBlLgorICAgIHVuc2lnbmVkIE51bVByb3RvY29scyA6IDY7CisKKyAgICAvLy8gV2hldGhlciB0aGlzIGlzIGEgImtpbmRvZiIgdHlwZS4KKyAgICB1bnNpZ25lZCBJc0tpbmRPZiA6IDE7CisgIH07CisKKyAgc3RhdGljX2Fzc2VydChOdW1UeXBlQml0cyArIDcgKyA2ICsgMSA8PSAzMiwgIkRvZXMgbm90IGZpdCBpbiBhbiB1bnNpZ25lZCIpOworCisgIGNsYXNzIFJlZmVyZW5jZVR5cGVCaXRmaWVsZHMgeworICAgIGZyaWVuZCBjbGFzcyBSZWZlcmVuY2VUeXBlOworCisgICAgdW5zaWduZWQgOiBOdW1UeXBlQml0czsKKworICAgIC8vLyBUcnVlIGlmIHRoZSB0eXBlIHdhcyBvcmlnaW5hbGx5IHNwZWxsZWQgd2l0aCBhbiBsdmFsdWUgc2lnaWwuCisgICAgLy8vIFRoaXMgaXMgbmV2ZXIgdHJ1ZSBvZiBydmFsdWUgcmVmZXJlbmNlcyBidXQgY2FuIGFsc28gYmUgZmFsc2UKKyAgICAvLy8gb24gbHZhbHVlIHJlZmVyZW5jZXMgYmVjYXVzZSBvZiBDKysweCBbZGNsLnR5cGVkZWZdcDksCisgICAgLy8vIGFzIGZvbGxvd3M6CisgICAgLy8vCisgICAgLy8vICAgdHlwZWRlZiBpbnQgJnJlZjsgICAgLy8gbHZhbHVlLCBzcGVsbGVkIGx2YWx1ZQorICAgIC8vLyAgIHR5cGVkZWYgaW50ICYmcnZyZWY7IC8vIHJ2YWx1ZQorICAgIC8vLyAgIHJlZiAmYTsgICAgICAgICAgICAgIC8vIGx2YWx1ZSwgaW5uZXIgcmVmLCBzcGVsbGVkIGx2YWx1ZQorICAgIC8vLyAgIHJlZiAmJmE7ICAgICAgICAgICAgIC8vIGx2YWx1ZSwgaW5uZXIgcmVmCisgICAgLy8vICAgcnZyZWYgJmE7ICAgICAgICAgICAgLy8gbHZhbHVlLCBpbm5lciByZWYsIHNwZWxsZWQgbHZhbHVlCisgICAgLy8vICAgcnZyZWYgJiZhOyAgICAgICAgICAgLy8gcnZhbHVlLCBpbm5lciByZWYKKyAgICB1bnNpZ25lZCBTcGVsbGVkQXNMVmFsdWUgOiAxOworCisgICAgLy8vIFRydWUgaWYgdGhlIGlubmVyIHR5cGUgaXMgYSByZWZlcmVuY2UgdHlwZS4gIFRoaXMgb25seSBoYXBwZW5zCisgICAgLy8vIGluIG5vbi1jYW5vbmljYWwgZm9ybXMuCisgICAgdW5zaWduZWQgSW5uZXJSZWYgOiAxOworICB9OworCisgIGNsYXNzIFR5cGVXaXRoS2V5d29yZEJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIFR5cGVXaXRoS2V5d29yZDsKKworICAgIHVuc2lnbmVkIDogTnVtVHlwZUJpdHM7CisKKyAgICAvLy8gQW4gRWxhYm9yYXRlZFR5cGVLZXl3b3JkLiAgOCBiaXRzIGZvciBlZmZpY2llbnQgYWNjZXNzLgorICAgIHVuc2lnbmVkIEtleXdvcmQgOiA4OworICB9OworCisgIGNsYXNzIFZlY3RvclR5cGVCaXRmaWVsZHMgeworICAgIGZyaWVuZCBjbGFzcyBWZWN0b3JUeXBlOworCisgICAgdW5zaWduZWQgOiBOdW1UeXBlQml0czsKKworICAgIC8vLyBUaGUga2luZCBvZiB2ZWN0b3IsIGVpdGhlciBhIGdlbmVyaWMgdmVjdG9yIHR5cGUgb3Igc29tZQorICAgIC8vLyB0YXJnZXQtc3BlY2lmaWMgdmVjdG9yIHR5cGUgc3VjaCBhcyBmb3IgQWx0aVZlYyBvciBOZW9uLgorICAgIHVuc2lnbmVkIFZlY0tpbmQgOiAzOworCisgICAgLy8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KKyAgICB1bnNpZ25lZCBOdW1FbGVtZW50cyA6IDI5IC0gTnVtVHlwZUJpdHM7CisKKyAgICBlbnVtIHsgTWF4TnVtRWxlbWVudHMgPSAoMSA8PCAoMjkgLSBOdW1UeXBlQml0cykpIC0gMSB9OworICB9OworCisgIGNsYXNzIEF0dHJpYnV0ZWRUeXBlQml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgQXR0cmlidXRlZFR5cGU7CisKKyAgICB1bnNpZ25lZCA6IE51bVR5cGVCaXRzOworCisgICAgLy8vIEFuIEF0dHJpYnV0ZWRUeXBlOjpLaW5kCisgICAgdW5zaWduZWQgQXR0cktpbmQgOiAzMiAtIE51bVR5cGVCaXRzOworICB9OworCisgIGNsYXNzIEF1dG9UeXBlQml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgQXV0b1R5cGU7CisKKyAgICB1bnNpZ25lZCA6IE51bVR5cGVCaXRzOworCisgICAgLy8vIFdhcyB0aGlzIHBsYWNlaG9sZGVyIHR5cGUgc3BlbGxlZCBhcyAnYXV0bycsICdkZWNsdHlwZShhdXRvKScsCisgICAgLy8vIG9yICdfX2F1dG9fdHlwZSc/ICBBdXRvVHlwZUtleXdvcmQgdmFsdWUuCisgICAgdW5zaWduZWQgS2V5d29yZCA6IDI7CisgIH07CisKKyAgdW5pb24geworICAgIFR5cGVCaXRmaWVsZHMgVHlwZUJpdHM7CisgICAgQXJyYXlUeXBlQml0ZmllbGRzIEFycmF5VHlwZUJpdHM7CisgICAgQXR0cmlidXRlZFR5cGVCaXRmaWVsZHMgQXR0cmlidXRlZFR5cGVCaXRzOworICAgIEF1dG9UeXBlQml0ZmllbGRzIEF1dG9UeXBlQml0czsKKyAgICBCdWlsdGluVHlwZUJpdGZpZWxkcyBCdWlsdGluVHlwZUJpdHM7CisgICAgRnVuY3Rpb25UeXBlQml0ZmllbGRzIEZ1bmN0aW9uVHlwZUJpdHM7CisgICAgT2JqQ09iamVjdFR5cGVCaXRmaWVsZHMgT2JqQ09iamVjdFR5cGVCaXRzOworICAgIFJlZmVyZW5jZVR5cGVCaXRmaWVsZHMgUmVmZXJlbmNlVHlwZUJpdHM7CisgICAgVHlwZVdpdGhLZXl3b3JkQml0ZmllbGRzIFR5cGVXaXRoS2V5d29yZEJpdHM7CisgICAgVmVjdG9yVHlwZUJpdGZpZWxkcyBWZWN0b3JUeXBlQml0czsKKyAgfTsKKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IGZyaWVuZCBjbGFzcyBUeXBlUHJvcGVydHlDYWNoZTsKKworICAvLy8gXGJyaWVmIFNldCB3aGV0aGVyIHRoaXMgdHlwZSBjb21lcyBmcm9tIGFuIEFTVCBmaWxlLgorICB2b2lkIHNldEZyb21BU1QoYm9vbCBWID0gdHJ1ZSkgY29uc3QgeworICAgIFR5cGVCaXRzLkZyb21BU1QgPSBWOworICB9CisKK3Byb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7CisKKyAgVHlwZShUeXBlQ2xhc3MgdGMsIFF1YWxUeXBlIGNhbm9uLCBib29sIERlcGVuZGVudCwKKyAgICAgICBib29sIEluc3RhbnRpYXRpb25EZXBlbmRlbnQsIGJvb2wgVmFyaWFibHlNb2RpZmllZCwKKyAgICAgICBib29sIENvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2spCisgICAgICA6IEV4dFF1YWxzVHlwZUNvbW1vbkJhc2UodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5vbi5pc051bGwoKSA/IFF1YWxUeXBlKHRoaXNfKCksIDApIDogY2Fub24pIHsKKyAgICBUeXBlQml0cy5UQyA9IHRjOworICAgIFR5cGVCaXRzLkRlcGVuZGVudCA9IERlcGVuZGVudDsKKyAgICBUeXBlQml0cy5JbnN0YW50aWF0aW9uRGVwZW5kZW50ID0gRGVwZW5kZW50IHx8IEluc3RhbnRpYXRpb25EZXBlbmRlbnQ7CisgICAgVHlwZUJpdHMuVmFyaWFibHlNb2RpZmllZCA9IFZhcmlhYmx5TW9kaWZpZWQ7CisgICAgVHlwZUJpdHMuQ29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjayA9IENvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2s7CisgICAgVHlwZUJpdHMuQ2FjaGVWYWxpZCA9IGZhbHNlOworICAgIFR5cGVCaXRzLkNhY2hlZExvY2FsT3JVbm5hbWVkID0gZmFsc2U7CisgICAgVHlwZUJpdHMuQ2FjaGVkTGlua2FnZSA9IE5vTGlua2FnZTsKKyAgICBUeXBlQml0cy5Gcm9tQVNUID0gZmFsc2U7CisgIH0KKworICAvLyBzaWxlbmNlIFZDKysgd2FybmluZyBDNDM1NTogJ3RoaXMnIDogdXNlZCBpbiBiYXNlIG1lbWJlciBpbml0aWFsaXplciBsaXN0CisgIFR5cGUgKnRoaXNfKCkgeyByZXR1cm4gdGhpczsgfQorCisgIHZvaWQgc2V0RGVwZW5kZW50KGJvb2wgRCA9IHRydWUpIHsKKyAgICBUeXBlQml0cy5EZXBlbmRlbnQgPSBEOworICAgIGlmIChEKQorICAgICAgVHlwZUJpdHMuSW5zdGFudGlhdGlvbkRlcGVuZGVudCA9IHRydWU7CisgIH0KKworICB2b2lkIHNldEluc3RhbnRpYXRpb25EZXBlbmRlbnQoYm9vbCBEID0gdHJ1ZSkgeworICAgIFR5cGVCaXRzLkluc3RhbnRpYXRpb25EZXBlbmRlbnQgPSBEOyB9CisKKyAgdm9pZCBzZXRWYXJpYWJseU1vZGlmaWVkKGJvb2wgVk0gPSB0cnVlKSB7IFR5cGVCaXRzLlZhcmlhYmx5TW9kaWZpZWQgPSBWTTsgfQorCisgIHZvaWQgc2V0Q29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjayhib29sIFBQID0gdHJ1ZSkgeworICAgIFR5cGVCaXRzLkNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2sgPSBQUDsKKyAgfQorCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBBU1RSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RXcml0ZXI7CisKKyAgVHlwZShjb25zdCBUeXBlICYpID0gZGVsZXRlOworICBUeXBlICZvcGVyYXRvcj0oY29uc3QgVHlwZSAmKSA9IGRlbGV0ZTsKKworICBUeXBlQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZUNsYXNzPihUeXBlQml0cy5UQyk7IH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyB0eXBlIGNvbWVzIGZyb20gYW4gQVNUIGZpbGUuCisgIGJvb2wgaXNGcm9tQVNUKCkgY29uc3QgeyByZXR1cm4gVHlwZUJpdHMuRnJvbUFTVDsgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIHR5cGUgaXMgb3IgY29udGFpbnMgYW4gdW5leHBhbmRlZCBwYXJhbWV0ZXIKKyAgLy8vIHBhY2ssIHVzZWQgdG8gc3VwcG9ydCBDKysweCB2YXJpYWRpYyB0ZW1wbGF0ZXMuCisgIC8vLworICAvLy8gQSB0eXBlIHRoYXQgY29udGFpbnMgYSBwYXJhbWV0ZXIgcGFjayBzaGFsbCBiZSBleHBhbmRlZCBieSB0aGUKKyAgLy8vIGVsbGlwc2lzIG9wZXJhdG9yIGF0IHNvbWUgcG9pbnQuIEZvciBleGFtcGxlLCB0aGUgdHlwZWRlZiBpbiB0aGUKKyAgLy8vIGZvbGxvd2luZyBleGFtcGxlIGNvbnRhaW5zIGFuIHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2sgJ1QnOgorICAvLy8KKyAgLy8vIFxjb2RlCisgIC8vLyB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5UPgorICAvLy8gc3RydWN0IFggeworICAvLy8gICB0eXBlZGVmIFQqIHBvaW50ZXJfdHlwZXM7IC8vIGlsbC1mb3JtZWQ7IFQgaXMgYSBwYXJhbWV0ZXIgcGFjay4KKyAgLy8vIH07CisgIC8vLyBcZW5kY29kZQorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgZG9lcyBub3Qgc3BlY2lmeSB3aGljaAorICBib29sIGNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSBjb25zdCB7CisgICAgcmV0dXJuIFR5cGVCaXRzLkNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2s7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lcyBpZiB0aGlzIHR5cGUgd291bGQgYmUgY2Fub25pY2FsIGlmIGl0IGhhZCBubyBmdXJ0aGVyCisgIC8vLyBxdWFsaWZpY2F0aW9uLgorICBib29sIGlzQ2Fub25pY2FsVW5xdWFsaWZpZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIENhbm9uaWNhbFR5cGUgPT0gUXVhbFR5cGUodGhpcywgMCk7CisgIH0KKworICAvLy8gUHVsbCBhIHNpbmdsZSBsZXZlbCBvZiBzdWdhciBvZmYgb2YgdGhpcyBsb2NhbGx5LXVucXVhbGlmaWVkIHR5cGUuCisgIC8vLyBVc2VycyBzaG91bGQgZ2VuZXJhbGx5IHByZWZlciBTcGxpdFF1YWxUeXBlOjpnZXRTaW5nbGVTdGVwRGVzdWdhcmVkVHlwZSgpCisgIC8vLyBvciBRdWFsVHlwZTo6Z2V0U2luZ2xlU3RlcERlc3VnYXJlZFR5cGUoY29uc3QgQVNUQ29udGV4dCYpLgorICBRdWFsVHlwZSBnZXRMb2NhbGx5VW5xdWFsaWZpZWRTaW5nbGVTdGVwRGVzdWdhcmVkVHlwZSgpIGNvbnN0OworCisgIC8vLyBUeXBlcyBhcmUgcGFydGl0aW9uZWQgaW50byAzIGJyb2FkIGNhdGVnb3JpZXMgKEM5OSA2LjIuNXAxKToKKyAgLy8vIG9iamVjdCB0eXBlcywgZnVuY3Rpb24gdHlwZXMsIGFuZCBpbmNvbXBsZXRlIHR5cGVzLgorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIGluY29tcGxldGUgdHlwZS4KKyAgLy8vIEEgdHlwZSB0aGF0IGNhbiBkZXNjcmliZSBvYmplY3RzLCBidXQgd2hpY2ggbGFja3MgaW5mb3JtYXRpb24gbmVlZGVkIHRvCisgIC8vLyBkZXRlcm1pbmUgaXRzIHNpemUgKGUuZy4gdm9pZCwgb3IgYSBmd2QgZGVjbGFyZWQgc3RydWN0KS4gQ2xpZW50cyBvZiB0aGlzCisgIC8vLyByb3V0aW5lIHdpbGwgbmVlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHNpemUgaXMgYWN0dWFsbHkgcmVxdWlyZWQuCisgIC8vLworICAvLy8gXGJyaWVmIERlZiBJZiBub24tbnVsbCwgYW5kIHRoZSB0eXBlIHJlZmVycyB0byBzb21lIGtpbmQgb2YgZGVjbGFyYXRpb24KKyAgLy8vIHRoYXQgY2FuIGJlIGNvbXBsZXRlZCAoc3VjaCBhcyBhIEMgc3RydWN0LCBDKysgY2xhc3MsIG9yIE9iamVjdGl2ZS1DCisgIC8vLyBjbGFzcyksIHdpbGwgYmUgc2V0IHRvIHRoZSBkZWNsYXJhdGlvbi4KKyAgYm9vbCBpc0luY29tcGxldGVUeXBlKE5hbWVkRGVjbCAqKkRlZiA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIGluY29tcGxldGUgb3Igb2JqZWN0CisgIC8vLyB0eXBlLCBpbiBvdGhlciB3b3Jkcywgbm90IGEgZnVuY3Rpb24gdHlwZS4KKyAgYm9vbCBpc0luY29tcGxldGVPck9iamVjdFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuICFpc0Z1bmN0aW9uVHlwZSgpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHR5cGUgaXMgYW4gb2JqZWN0IHR5cGUuCisgIGJvb2wgaXNPYmplY3RUeXBlKCkgY29uc3QgeworICAgIC8vIEMrKyBbYmFzaWMudHlwZXNdcDg6CisgICAgLy8gICBBbiBvYmplY3QgdHlwZSBpcyBhIChwb3NzaWJseSBjdi1xdWFsaWZpZWQpIHR5cGUgdGhhdCBpcyBub3QgYQorICAgIC8vICAgZnVuY3Rpb24gdHlwZSwgbm90IGEgcmVmZXJlbmNlIHR5cGUsIGFuZCBub3QgYSB2b2lkIHR5cGUuCisgICAgcmV0dXJuICFpc1JlZmVyZW5jZVR5cGUoKSAmJiAhaXNGdW5jdGlvblR5cGUoKSAmJiAhaXNWb2lkVHlwZSgpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBsaXRlcmFsIHR5cGUKKyAgLy8vIChDKysxMSBbYmFzaWMudHlwZXNdcDEwKQorICBib29sIGlzTGl0ZXJhbFR5cGUoY29uc3QgQVNUQ29udGV4dCAmQ3R4KSBjb25zdDsKKworICAvLy8gVGVzdCBpZiB0aGlzIHR5cGUgaXMgYSBzdGFuZGFyZC1sYXlvdXQgdHlwZS4KKyAgLy8vIChDKysweCBbYmFzaWMudHlwZV1wOSkKKyAgYm9vbCBpc1N0YW5kYXJkTGF5b3V0VHlwZSgpIGNvbnN0OworCisgIC8vLyBIZWxwZXIgbWV0aG9kcyB0byBkaXN0aW5ndWlzaCB0eXBlIGNhdGVnb3JpZXMuIEFsbCB0eXBlIHByZWRpY2F0ZXMKKyAgLy8vIG9wZXJhdGUgb24gdGhlIGNhbm9uaWNhbCB0eXBlLCBpZ25vcmluZyB0eXBlZGVmcyBhbmQgcXVhbGlmaWVycy4KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0eXBlIGlzIGEgYnVpbHRpbiB0eXBlLgorICBib29sIGlzQnVpbHRpblR5cGUoKSBjb25zdDsKKworICAvLy8gVGVzdCBmb3IgYSBwYXJ0aWN1bGFyIGJ1aWx0aW4gdHlwZS4KKyAgYm9vbCBpc1NwZWNpZmljQnVpbHRpblR5cGUodW5zaWduZWQgSykgY29uc3Q7CisKKyAgLy8vIFRlc3QgZm9yIGEgdHlwZSB3aGljaCBkb2VzIG5vdCByZXByZXNlbnQgYW4gYWN0dWFsIHR5cGUtc3lzdGVtIHR5cGUgYnV0CisgIC8vLyBpcyBpbnN0ZWFkIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgdmFyaW91cyBjb252ZW5pZW50IHB1cnBvc2VzIHdpdGhpbgorICAvLy8gQ2xhbmcuICBBbGwgc3VjaCB0eXBlcyBhcmUgQnVpbHRpblR5cGVzLgorICBib29sIGlzUGxhY2Vob2xkZXJUeXBlKCkgY29uc3Q7CisgIGNvbnN0IEJ1aWx0aW5UeXBlICpnZXRBc1BsYWNlaG9sZGVyVHlwZSgpIGNvbnN0OworCisgIC8vLyBUZXN0IGZvciBhIHNwZWNpZmljIHBsYWNlaG9sZGVyIHR5cGUuCisgIGJvb2wgaXNTcGVjaWZpY1BsYWNlaG9sZGVyVHlwZSh1bnNpZ25lZCBLKSBjb25zdDsKKworICAvLy8gVGVzdCBmb3IgYSBwbGFjZWhvbGRlciB0eXBlIG90aGVyIHRoYW4gT3ZlcmxvYWQ7IHNlZQorICAvLy8gQnVpbHRpblR5cGU6OmlzTm9uT3ZlcmxvYWRQbGFjZWhvbGRlclR5cGUuCisgIGJvb2wgaXNOb25PdmVybG9hZFBsYWNlaG9sZGVyVHlwZSgpIGNvbnN0OworCisgIC8vLyBpc0ludGVnZXJUeXBlKCkgZG9lcyAqbm90KiBpbmNsdWRlIGNvbXBsZXggaW50ZWdlcnMgKGEgR0NDIGV4dGVuc2lvbikuCisgIC8vLyBpc0NvbXBsZXhJbnRlZ2VyVHlwZSgpIGNhbiBiZSB1c2VkIHRvIHRlc3QgZm9yIGNvbXBsZXggaW50ZWdlcnMuCisgIGJvb2wgaXNJbnRlZ2VyVHlwZSgpIGNvbnN0OyAgICAgLy8gQzk5IDYuMi41cDE3IChpbnQsIGNoYXIsIGJvb2wsIGVudW0pCisgIGJvb2wgaXNFbnVtZXJhbFR5cGUoKSBjb25zdDsKKyAgYm9vbCBpc0Jvb2xlYW5UeXBlKCkgY29uc3Q7CisgIGJvb2wgaXNDaGFyVHlwZSgpIGNvbnN0OworICBib29sIGlzV2lkZUNoYXJUeXBlKCkgY29uc3Q7CisgIGJvb2wgaXNDaGFyMTZUeXBlKCkgY29uc3Q7CisgIGJvb2wgaXNDaGFyMzJUeXBlKCkgY29uc3Q7CisgIGJvb2wgaXNBbnlDaGFyYWN0ZXJUeXBlKCkgY29uc3Q7CisgIGJvb2wgaXNJbnRlZ3JhbFR5cGUoY29uc3QgQVNUQ29udGV4dCAmQ3R4KSBjb25zdDsKKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB0eXBlIGlzIGFuIGludGVncmFsIG9yIGVudW1lcmF0aW9uIHR5cGUuCisgIGJvb2wgaXNJbnRlZ3JhbE9yRW51bWVyYXRpb25UeXBlKCkgY29uc3Q7CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgdHlwZSBpcyBhbiBpbnRlZ3JhbCBvciB1bnNjb3BlZCBlbnVtZXJhdGlvbiB0eXBlLgorICBib29sIGlzSW50ZWdyYWxPclVuc2NvcGVkRW51bWVyYXRpb25UeXBlKCkgY29uc3Q7CisKKyAgLy8vIEZsb2F0aW5nIHBvaW50IGNhdGVnb3JpZXMuCisgIGJvb2wgaXNSZWFsRmxvYXRpbmdUeXBlKCkgY29uc3Q7IC8vIEM5OSA2LjIuNXAxMCAoZmxvYXQsIGRvdWJsZSwgbG9uZyBkb3VibGUpCisgIC8vLyBpc0NvbXBsZXhUeXBlKCkgZG9lcyAqbm90KiBpbmNsdWRlIGNvbXBsZXggaW50ZWdlcnMgKGEgR0NDIGV4dGVuc2lvbikuCisgIC8vLyBpc0NvbXBsZXhJbnRlZ2VyVHlwZSgpIGNhbiBiZSB1c2VkIHRvIHRlc3QgZm9yIGNvbXBsZXggaW50ZWdlcnMuCisgIGJvb2wgaXNDb21wbGV4VHlwZSgpIGNvbnN0OyAgICAgIC8vIEM5OSA2LjIuNXAxMSAoY29tcGxleCkKKyAgYm9vbCBpc0FueUNvbXBsZXhUeXBlKCkgY29uc3Q7ICAgLy8gQzk5IDYuMi41cDExIChjb21wbGV4KSArIENvbXBsZXggSW50LgorICBib29sIGlzRmxvYXRpbmdUeXBlKCkgY29uc3Q7ICAgICAvLyBDOTkgNi4yLjVwMTEgKHJlYWwgZmxvYXRpbmcgKyBjb21wbGV4KQorICBib29sIGlzSGFsZlR5cGUoKSBjb25zdDsgICAgICAgICAvLyBPcGVuQ0wgNi4xLjEuMSwgTkVPTiAoSUVFRSA3NTQtMjAwOCBoYWxmKQorICBib29sIGlzRmxvYXQxNlR5cGUoKSBjb25zdDsgICAgICAvLyBDMTEgZXh0ZW5zaW9uIElTTy9JRUMgVFMgMTg2NjEKKyAgYm9vbCBpc1JlYWxUeXBlKCkgY29uc3Q7ICAgICAgICAgLy8gQzk5IDYuMi41cDE3IChyZWFsIGZsb2F0aW5nICsgaW50ZWdlcikKKyAgYm9vbCBpc0FyaXRobWV0aWNUeXBlKCkgY29uc3Q7ICAgLy8gQzk5IDYuMi41cDE4IChpbnRlZ2VyICsgZmxvYXRpbmcpCisgIGJvb2wgaXNWb2lkVHlwZSgpIGNvbnN0OyAgICAgICAgIC8vIEM5OSA2LjIuNXAxOQorICBib29sIGlzU2NhbGFyVHlwZSgpIGNvbnN0OyAgICAgICAvLyBDOTkgNi4yLjVwMjEgKGFyaXRobWV0aWMgKyBwb2ludGVycykKKyAgYm9vbCBpc0FnZ3JlZ2F0ZVR5cGUoKSBjb25zdDsKKyAgYm9vbCBpc0Z1bmRhbWVudGFsVHlwZSgpIGNvbnN0OworICBib29sIGlzQ29tcG91bmRUeXBlKCkgY29uc3Q7CisKKyAgLy8gVHlwZSBQcmVkaWNhdGVzOiBDaGVjayB0byBzZWUgaWYgdGhpcyB0eXBlIGlzIHN0cnVjdHVyYWxseSB0aGUgc3BlY2lmaWVkCisgIC8vIHR5cGUsIGlnbm9yaW5nIHR5cGVkZWZzIGFuZCBxdWFsaWZpZXJzLgorICBib29sIGlzRnVuY3Rpb25UeXBlKCkgY29uc3Q7CisgIGJvb2wgaXNGdW5jdGlvbk5vUHJvdG9UeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0QXM8RnVuY3Rpb25Ob1Byb3RvVHlwZT4oKTsgfQorICBib29sIGlzRnVuY3Rpb25Qcm90b1R5cGUoKSBjb25zdCB7IHJldHVybiBnZXRBczxGdW5jdGlvblByb3RvVHlwZT4oKTsgfQorICBib29sIGlzUG9pbnRlclR5cGUoKSBjb25zdDsKKyAgYm9vbCBpc0FueVBvaW50ZXJUeXBlKCkgY29uc3Q7ICAgLy8gQW55IEMgcG9pbnRlciBvciBPYmpDIG9iamVjdCBwb2ludGVyCisgIGJvb2wgaXNCbG9ja1BvaW50ZXJUeXBlKCkgY29uc3Q7CisgIGJvb2wgaXNWb2lkUG9pbnRlclR5cGUoKSBjb25zdDsKKyAgYm9vbCBpc1JlZmVyZW5jZVR5cGUoKSBjb25zdDsKKyAgYm9vbCBpc0xWYWx1ZVJlZmVyZW5jZVR5cGUoKSBjb25zdDsKKyAgYm9vbCBpc1JWYWx1ZVJlZmVyZW5jZVR5cGUoKSBjb25zdDsKKyAgYm9vbCBpc0Z1bmN0aW9uUG9pbnRlclR5cGUoKSBjb25zdDsKKyAgYm9vbCBpc01lbWJlclBvaW50ZXJUeXBlKCkgY29uc3Q7CisgIGJvb2wgaXNNZW1iZXJGdW5jdGlvblBvaW50ZXJUeXBlKCkgY29uc3Q7CisgIGJvb2wgaXNNZW1iZXJEYXRhUG9pbnRlclR5cGUoKSBjb25zdDsKKyAgYm9vbCBpc0FycmF5VHlwZSgpIGNvbnN0OworICBib29sIGlzQ29uc3RhbnRBcnJheVR5cGUoKSBjb25zdDsKKyAgYm9vbCBpc0luY29tcGxldGVBcnJheVR5cGUoKSBjb25zdDsKKyAgYm9vbCBpc1ZhcmlhYmxlQXJyYXlUeXBlKCkgY29uc3Q7CisgIGJvb2wgaXNEZXBlbmRlbnRTaXplZEFycmF5VHlwZSgpIGNvbnN0OworICBib29sIGlzUmVjb3JkVHlwZSgpIGNvbnN0OworICBib29sIGlzQ2xhc3NUeXBlKCkgY29uc3Q7CisgIGJvb2wgaXNTdHJ1Y3R1cmVUeXBlKCkgY29uc3Q7CisgIGJvb2wgaXNPYmpDQm94YWJsZVJlY29yZFR5cGUoKSBjb25zdDsKKyAgYm9vbCBpc0ludGVyZmFjZVR5cGUoKSBjb25zdDsKKyAgYm9vbCBpc1N0cnVjdHVyZU9yQ2xhc3NUeXBlKCkgY29uc3Q7CisgIGJvb2wgaXNVbmlvblR5cGUoKSBjb25zdDsKKyAgYm9vbCBpc0NvbXBsZXhJbnRlZ2VyVHlwZSgpIGNvbnN0OyAgICAgICAgICAgIC8vIEdDQyBfQ29tcGxleCBpbnRlZ2VyIHR5cGUuCisgIGJvb2wgaXNWZWN0b3JUeXBlKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAvLyBHQ0MgdmVjdG9yIHR5cGUuCisgIGJvb2wgaXNFeHRWZWN0b3JUeXBlKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAvLyBFeHRlbmRlZCB2ZWN0b3IgdHlwZS4KKyAgYm9vbCBpc0RlcGVuZGVudEFkZHJlc3NTcGFjZVR5cGUoKSBjb25zdDsgICAgIC8vIHZhbHVlLWRlcGVuZGVudCBhZGRyZXNzIHNwYWNlIHF1YWxpZmllcgorICBib29sIGlzT2JqQ09iamVjdFBvaW50ZXJUeXBlKCkgY29uc3Q7ICAgICAgICAgLy8gcG9pbnRlciB0byBPYmpDIG9iamVjdAorICBib29sIGlzT2JqQ1JldGFpbmFibGVUeXBlKCkgY29uc3Q7ICAgICAgICAgICAgLy8gT2JqQyBvYmplY3Qgb3IgYmxvY2sgcG9pbnRlcgorICBib29sIGlzT2JqQ0xpZmV0aW1lVHlwZSgpIGNvbnN0OyAgICAgICAgICAgICAgLy8gKGFycmF5IG9mKSogcmV0YWluYWJsZSB0eXBlCisgIGJvb2wgaXNPYmpDSW5kaXJlY3RMaWZldGltZVR5cGUoKSBjb25zdDsgICAgICAvLyAocG9pbnRlciB0bykqIGxpZmV0aW1lIHR5cGUKKyAgYm9vbCBpc09iakNOU09iamVjdFR5cGUoKSBjb25zdDsgICAgICAgICAgICAgIC8vIF9fYXR0cmlidXRlX18oKE5TT2JqZWN0KSkKKyAgYm9vbCBpc09iakNJbmRlcGVuZGVudENsYXNzVHlwZSgpIGNvbnN0OyAgICAgIC8vIF9fYXR0cmlidXRlX18oKG9iamNfaW5kZXBlbmRlbnRfY2xhc3MpKQorICAvLyBGSVhNRTogY2hhbmdlIHRoaXMgdG8gJ3JhdycgaW50ZXJmYWNlIHR5cGUsIHNvIHdlIGNhbiB1c2VkICdpbnRlcmZhY2UnIHR5cGUKKyAgLy8gZm9yIHRoZSBjb21tb24gY2FzZS4KKyAgYm9vbCBpc09iakNPYmplY3RUeXBlKCkgY29uc3Q7ICAgICAgICAgICAgICAgIC8vIE5TU3RyaW5nIG9yIHR5cGVvZigqKGlkKTApCisgIGJvb2wgaXNPYmpDUXVhbGlmaWVkSW50ZXJmYWNlVHlwZSgpIGNvbnN0OyAgICAvLyBOU1N0cmluZzxmb28+CisgIGJvb2wgaXNPYmpDUXVhbGlmaWVkSWRUeXBlKCkgY29uc3Q7ICAgICAgICAgICAvLyBpZDxmb28+CisgIGJvb2wgaXNPYmpDUXVhbGlmaWVkQ2xhc3NUeXBlKCkgY29uc3Q7ICAgICAgICAvLyBDbGFzczxmb28+CisgIGJvb2wgaXNPYmpDT2JqZWN0T3JJbnRlcmZhY2VUeXBlKCkgY29uc3Q7CisgIGJvb2wgaXNPYmpDSWRUeXBlKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAvLyBpZAorICBib29sIGlzT2JqQ0luZXJ0VW5zYWZlVW5yZXRhaW5lZFR5cGUoKSBjb25zdDsKKworICAvLy8gV2hldGhlciB0aGUgdHlwZSBpcyBPYmplY3RpdmUtQyAnaWQnIG9yIGEgX19raW5kb2YgdHlwZSBvZiBhbgorICAvLy8gb2JqZWN0IHR5cGUsIGUuZy4sIF9fa2luZG9mIE5TVmlldyAqIG9yIF9fa2luZG9mIGlkCisgIC8vLyA8TlNDb3B5aW5nPi4KKyAgLy8vCisgIC8vLyBccGFyYW0gYm91bmQgV2lsbCBiZSBzZXQgdG8gdGhlIGJvdW5kIG9uIG5vbi1pZCBzdWJ0eXBlIHR5cGVzLAorICAvLy8gd2hpY2ggd2lsbCBiZSAocG9zc2libHkgc3BlY2lhbGl6ZWQpIE9iamVjdGl2ZS1DIGNsYXNzIHR5cGUsIG9yCisgIC8vLyBudWxsIGZvciAnaWQuCisgIGJvb2wgaXNPYmpDSWRPck9iamVjdEtpbmRPZlR5cGUoY29uc3QgQVNUQ29udGV4dCAmY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNPYmplY3RUeXBlIComYm91bmQpIGNvbnN0OworCisgIGJvb2wgaXNPYmpDQ2xhc3NUeXBlKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAvLyBDbGFzcworCisgIC8vLyBXaGV0aGVyIHRoZSB0eXBlIGlzIE9iamVjdGl2ZS1DICdDbGFzcycgb3IgYSBfX2tpbmRvZiB0eXBlIG9mIGFuCisgIC8vLyBDbGFzcyB0eXBlLCBlLmcuLCBfX2tpbmRvZiBDbGFzcyA8TlNDb3B5aW5nPi4KKyAgLy8vCisgIC8vLyBVbmxpa2UgXGMgaXNPYmpDSWRPck9iamVjdEtpbmRPZlR5cGUsIHRoZXJlIGlzIG5vIHJlbGV2YW50IGJvdW5kCisgIC8vLyBoZXJlIGJlY2F1c2UgT2JqZWN0aXZlLUMncyB0eXBlIHN5c3RlbSBjYW5ub3QgZXhwcmVzcyAiYSBjbGFzcworICAvLy8gb2JqZWN0IGZvciBhIHN1YmNsYXNzIG9mIE5TRm9vIi4KKyAgYm9vbCBpc09iakNDbGFzc09yQ2xhc3NLaW5kT2ZUeXBlKCkgY29uc3Q7CisKKyAgYm9vbCBpc0Jsb2NrQ29tcGF0aWJsZU9iakNQb2ludGVyVHlwZShBU1RDb250ZXh0ICZjdHgpIGNvbnN0OworICBib29sIGlzT2JqQ1NlbFR5cGUoKSBjb25zdDsgICAgICAgICAgICAgICAgIC8vIENsYXNzCisgIGJvb2wgaXNPYmpDQnVpbHRpblR5cGUoKSBjb25zdDsgICAgICAgICAgICAgICAvLyAnaWQnIG9yICdDbGFzcycKKyAgYm9vbCBpc09iakNBUkNCcmlkZ2FibGVUeXBlKCkgY29uc3Q7CisgIGJvb2wgaXNDQVJDQnJpZGdhYmxlVHlwZSgpIGNvbnN0OworICBib29sIGlzVGVtcGxhdGVUeXBlUGFybVR5cGUoKSBjb25zdDsgICAgICAgICAgLy8gQysrIHRlbXBsYXRlIHR5cGUgcGFyYW1ldGVyCisgIGJvb2wgaXNOdWxsUHRyVHlwZSgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAvLyBDKysxMSBzdGQ6Om51bGxwdHJfdAorICBib29sIGlzQWxpZ25WYWxUKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgLy8gQysrMTcgc3RkOjphbGlnbl92YWxfdAorICBib29sIGlzU3RkQnl0ZVR5cGUoKSBjb25zdDsgICAgICAgICAgICAgICAgICAgLy8gQysrMTcgc3RkOjpieXRlCisgIGJvb2wgaXNBdG9taWNUeXBlKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAvLyBDMTEgX0F0b21pYygpCisKKyNkZWZpbmUgSU1BR0VfVFlQRShJbWdUeXBlLCBJZCwgU2luZ2xldG9uSWQsIEFjY2VzcywgU3VmZml4KSBcCisgIGJvb2wgaXMjI0lkIyNUeXBlKCkgY29uc3Q7CisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3BlbkNMSW1hZ2VUeXBlcy5kZWYiCisKKyAgYm9vbCBpc0ltYWdlVHlwZSgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgIC8vIEFueSBPcGVuQ0wgaW1hZ2UgdHlwZQorCisgIGJvb2wgaXNTYW1wbGVyVCgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVuQ0wgc2FtcGxlcl90CisgIGJvb2wgaXNFdmVudFQoKSBjb25zdDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVuQ0wgZXZlbnRfdAorICBib29sIGlzQ2xrRXZlbnRUKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgLy8gT3BlbkNMIGNsa19ldmVudF90CisgIGJvb2wgaXNRdWV1ZVQoKSBjb25zdDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVuQ0wgcXVldWVfdAorICBib29sIGlzUmVzZXJ2ZUlEVCgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgLy8gT3BlbkNMIHJlc2VydmVfaWRfdAorCisgIGJvb2wgaXNQaXBlVHlwZSgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVuQ0wgcGlwZSB0eXBlCisgIGJvb2wgaXNPcGVuQ0xTcGVjaWZpY1R5cGUoKSBjb25zdDsgICAgICAgICAgICAvLyBBbnkgT3BlbkNMIHNwZWNpZmljIHR5cGUKKworICAvLy8gRGV0ZXJtaW5lcyBpZiB0aGlzIHR5cGUsIHdoaWNoIG11c3Qgc2F0aXNmeQorICAvLy8gaXNPYmpDTGlmZXRpbWVUeXBlKCksIGlzIGltcGxpY2l0bHkgX191bnNhZmVfdW5yZXRhaW5lZCByYXRoZXIKKyAgLy8vIHRoYW4gaW1wbGljaXRseSBfX3N0cm9uZy4KKyAgYm9vbCBpc09iakNBUkNJbXBsaWNpdGx5VW5yZXRhaW5lZFR5cGUoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBpbXBsaWNpdCBsaWZldGltZSBmb3IgdGhpcyB0eXBlLCB3aGljaCBtdXN0IG5vdCBiZSBkZXBlbmRlbnQuCisgIFF1YWxpZmllcnM6Ok9iakNMaWZldGltZSBnZXRPYmpDQVJDSW1wbGljaXRMaWZldGltZSgpIGNvbnN0OworCisgIGVudW0gU2NhbGFyVHlwZUtpbmQgeworICAgIFNUS19DUG9pbnRlciwKKyAgICBTVEtfQmxvY2tQb2ludGVyLAorICAgIFNUS19PYmpDT2JqZWN0UG9pbnRlciwKKyAgICBTVEtfTWVtYmVyUG9pbnRlciwKKyAgICBTVEtfQm9vbCwKKyAgICBTVEtfSW50ZWdyYWwsCisgICAgU1RLX0Zsb2F0aW5nLAorICAgIFNUS19JbnRlZ3JhbENvbXBsZXgsCisgICAgU1RLX0Zsb2F0aW5nQ29tcGxleAorICB9OworCisgIC8vLyBHaXZlbiB0aGF0IHRoaXMgaXMgYSBzY2FsYXIgdHlwZSwgY2xhc3NpZnkgaXQuCisgIFNjYWxhclR5cGVLaW5kIGdldFNjYWxhclR5cGVLaW5kKCkgY29uc3Q7CisKKyAgLy8vIFdoZXRoZXIgdGhpcyB0eXBlIGlzIGEgZGVwZW5kZW50IHR5cGUsIG1lYW5pbmcgdGhhdCBpdHMgZGVmaW5pdGlvbgorICAvLy8gc29tZWhvdyBkZXBlbmRzIG9uIGEgdGVtcGxhdGUgcGFyYW1ldGVyIChDKysgW3RlbXAuZGVwLnR5cGVdKS4KKyAgYm9vbCBpc0RlcGVuZGVudFR5cGUoKSBjb25zdCB7IHJldHVybiBUeXBlQml0cy5EZXBlbmRlbnQ7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgdHlwZSBpcyBhbiBpbnN0YW50aWF0aW9uLWRlcGVuZGVudCB0eXBlLAorICAvLy8gbWVhbmluZyB0aGF0IHRoZSB0eXBlIGludm9sdmVzIGEgdGVtcGxhdGUgcGFyYW1ldGVyIChldmVuIGlmIHRoZQorICAvLy8gZGVmaW5pdGlvbiBkb2VzIG5vdCBhY3R1YWxseSBkZXBlbmQgb24gdGhlIHR5cGUgc3Vic3RpdHV0ZWQgZm9yIHRoYXQKKyAgLy8vIHRlbXBsYXRlIHBhcmFtZXRlcikuCisgIGJvb2wgaXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVHlwZUJpdHMuSW5zdGFudGlhdGlvbkRlcGVuZGVudDsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB0eXBlIGlzIGFuIHVuZGVkdWNlZCB0eXBlLCBtZWFuaW5nIHRoYXQKKyAgLy8vIGl0IHNvbWVob3cgaW52b2x2ZXMgYSBDKysxMSAnYXV0bycgdHlwZSBvciBzaW1pbGFyIHdoaWNoIGhhcyBub3QgeWV0IGJlZW4KKyAgLy8vIGRlZHVjZWQuCisgIGJvb2wgaXNVbmRlZHVjZWRUeXBlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgdHlwZSBpcyBhIHZhcmlhYmx5LW1vZGlmaWVkIHR5cGUgKEM5OSA2LjcuNSkuCisgIGJvb2wgaXNWYXJpYWJseU1vZGlmaWVkVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5cGVCaXRzLlZhcmlhYmx5TW9kaWZpZWQ7IH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyB0eXBlIGludm9sdmVzIGEgdmFyaWFibGUtbGVuZ3RoIGFycmF5IHR5cGUKKyAgLy8vIHdpdGggYSBkZWZpbml0ZSBzaXplLgorICBib29sIGhhc1NpemVkVkxBVHlwZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIHR5cGUgaXMgb3IgY29udGFpbnMgYSBsb2NhbCBvciB1bm5hbWVkIHR5cGUuCisgIGJvb2wgaGFzVW5uYW1lZE9yTG9jYWxUeXBlKCkgY29uc3Q7CisKKyAgYm9vbCBpc092ZXJsb2FkYWJsZVR5cGUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aXRoZXIgdGhpcyB0eXBlIGlzIGEgQysrIGVsYWJvcmF0ZWQtdHlwZS1zcGVjaWZpZXIuCisgIGJvb2wgaXNFbGFib3JhdGVkVHlwZVNwZWNpZmllcigpIGNvbnN0OworCisgIGJvb2wgY2FuRGVjYXlUb1BvaW50ZXJUeXBlKCkgY29uc3Q7CisKKyAgLy8vIFdoZXRoZXIgdGhpcyB0eXBlIGlzIHJlcHJlc2VudGVkIG5hdGl2ZWx5IGFzIGEgcG9pbnRlci4gIFRoaXMgaW5jbHVkZXMKKyAgLy8vIHBvaW50ZXJzLCByZWZlcmVuY2VzLCBibG9jayBwb2ludGVycywgYW5kIE9iamVjdGl2ZS1DIGludGVyZmFjZSwKKyAgLy8vIHF1YWxpZmllZCBpZCwgYW5kIHF1YWxpZmllZCBpbnRlcmZhY2UgdHlwZXMsIGFzIHdlbGwgYXMgbnVsbHB0cl90LgorICBib29sIGhhc1BvaW50ZXJSZXByZXNlbnRhdGlvbigpIGNvbnN0OworCisgIC8vLyBXaGV0aGVyIHRoaXMgdHlwZSBjYW4gcmVwcmVzZW50IGFuIG9iamVjdGl2ZSBwb2ludGVyIHR5cGUgZm9yIHRoZQorICAvLy8gcHVycG9zZSBvZiBHQydhYmlsaXR5CisgIGJvb2wgaGFzT2JqQ1BvaW50ZXJSZXByZXNlbnRhdGlvbigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB0eXBlIGhhcyBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uCisgIC8vLyBvZiBzb21lIHNvcnQsIGUuZy4sIGl0IGlzIGFuIGludGVnZXIgdHlwZSBvciBhIHZlY3Rvci4KKyAgYm9vbCBoYXNJbnRlZ2VyUmVwcmVzZW50YXRpb24oKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgdHlwZSBoYXMgYW4gc2lnbmVkIGludGVnZXIgcmVwcmVzZW50YXRpb24KKyAgLy8vIG9mIHNvbWUgc29ydCwgZS5nLiwgaXQgaXMgYW4gc2lnbmVkIGludGVnZXIgdHlwZSBvciBhIHZlY3Rvci4KKyAgYm9vbCBoYXNTaWduZWRJbnRlZ2VyUmVwcmVzZW50YXRpb24oKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgdHlwZSBoYXMgYW4gdW5zaWduZWQgaW50ZWdlciByZXByZXNlbnRhdGlvbgorICAvLy8gb2Ygc29tZSBzb3J0LCBlLmcuLCBpdCBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgb3IgYSB2ZWN0b3IuCisgIGJvb2wgaGFzVW5zaWduZWRJbnRlZ2VyUmVwcmVzZW50YXRpb24oKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgdHlwZSBoYXMgYSBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbgorICAvLy8gb2Ygc29tZSBzb3J0LCBlLmcuLCBpdCBpcyBhIGZsb2F0aW5nLXBvaW50IHR5cGUgb3IgYSB2ZWN0b3IgdGhlcmVvZi4KKyAgYm9vbCBoYXNGbG9hdGluZ1JlcHJlc2VudGF0aW9uKCkgY29uc3Q7CisKKyAgLy8gVHlwZSBDaGVja2luZyBGdW5jdGlvbnM6IENoZWNrIHRvIHNlZSBpZiB0aGlzIHR5cGUgaXMgc3RydWN0dXJhbGx5IHRoZQorICAvLyBzcGVjaWZpZWQgdHlwZSwgaWdub3JpbmcgdHlwZWRlZnMgYW5kIHF1YWxpZmllcnMsIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvCisgIC8vIHRoZSBiZXN0IHR5cGUgd2UgY2FuLgorICBjb25zdCBSZWNvcmRUeXBlICpnZXRBc1N0cnVjdHVyZVR5cGUoKSBjb25zdDsKKyAgLy8vIE5PVEU6IGdldEFzKkFycmF5VHlwZSBhcmUgbWV0aG9kcyBvbiBBU1RDb250ZXh0LgorICBjb25zdCBSZWNvcmRUeXBlICpnZXRBc1VuaW9uVHlwZSgpIGNvbnN0OworICBjb25zdCBDb21wbGV4VHlwZSAqZ2V0QXNDb21wbGV4SW50ZWdlclR5cGUoKSBjb25zdDsgLy8gR0NDIGNvbXBsZXggaW50IHR5cGUuCisgIGNvbnN0IE9iakNPYmplY3RUeXBlICpnZXRBc09iakNJbnRlcmZhY2VUeXBlKCkgY29uc3Q7CisKKyAgLy8gVGhlIGZvbGxvd2luZyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gT2JqQ09iamVjdFBvaW50ZXJUeXBlCisgIC8vIGZvciBvYmplY3QgZGVjbGFyZWQgdXNpbmcgYW4gaW50ZXJmYWNlLgorICBjb25zdCBPYmpDT2JqZWN0UG9pbnRlclR5cGUgKmdldEFzT2JqQ0ludGVyZmFjZVBvaW50ZXJUeXBlKCkgY29uc3Q7CisgIGNvbnN0IE9iakNPYmplY3RQb2ludGVyVHlwZSAqZ2V0QXNPYmpDUXVhbGlmaWVkSWRUeXBlKCkgY29uc3Q7CisgIGNvbnN0IE9iakNPYmplY3RQb2ludGVyVHlwZSAqZ2V0QXNPYmpDUXVhbGlmaWVkQ2xhc3NUeXBlKCkgY29uc3Q7CisgIGNvbnN0IE9iakNPYmplY3RUeXBlICpnZXRBc09iakNRdWFsaWZpZWRJbnRlcmZhY2VUeXBlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZXMgdGhlIENYWFJlY29yZERlY2wgdGhhdCB0aGlzIHR5cGUgcmVmZXJzIHRvLCBlaXRoZXIKKyAgLy8vIGJlY2F1c2UgdGhlIHR5cGUgaXMgYSBSZWNvcmRUeXBlIG9yIGJlY2F1c2UgaXQgaXMgdGhlIGluamVjdGVkLWNsYXNzLW5hbWUKKyAgLy8vIHR5cGUgb2YgYSBjbGFzcyB0ZW1wbGF0ZSBvciBjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLgorICBDWFhSZWNvcmREZWNsICpnZXRBc0NYWFJlY29yZERlY2woKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlcyB0aGUgVGFnRGVjbCB0aGF0IHRoaXMgdHlwZSByZWZlcnMgdG8sIGVpdGhlcgorICAvLy8gYmVjYXVzZSB0aGUgdHlwZSBpcyBhIFRhZ1R5cGUgb3IgYmVjYXVzZSBpdCBpcyB0aGUgaW5qZWN0ZWQtY2xhc3MtbmFtZQorICAvLy8gdHlwZSBvZiBhIGNsYXNzIHRlbXBsYXRlIG9yIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uCisgIFRhZ0RlY2wgKmdldEFzVGFnRGVjbCgpIGNvbnN0OworCisgIC8vLyBJZiB0aGlzIGlzIGEgcG9pbnRlciBvciByZWZlcmVuY2UgdG8gYSBSZWNvcmRUeXBlLCByZXR1cm4gdGhlCisgIC8vLyBDWFhSZWNvcmREZWNsIHRoYXQgdGhhdCB0eXBlIHJlZmVycyB0by4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIGlzIG5vdCBhIHBvaW50ZXIgb3IgcmVmZXJlbmNlLCBvciB0aGUgdHlwZSBiZWluZyBwb2ludGVkIHRvIGRvZXMKKyAgLy8vIG5vdCByZWZlciB0byBhIENYWFJlY29yZERlY2wsIHJldHVybnMgTlVMTC4KKyAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqZ2V0UG9pbnRlZUNYWFJlY29yZERlY2woKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBEZWR1Y2VkVHlwZSB3aG9zZSB0eXBlIHdpbGwgYmUgZGVkdWNlZCBmb3IgYSB2YXJpYWJsZSB3aXRoCisgIC8vLyBhbiBpbml0aWFsaXplciBvZiB0aGlzIHR5cGUuIFRoaXMgbG9va3MgdGhyb3VnaCBkZWNsYXJhdG9ycyBsaWtlIHBvaW50ZXIKKyAgLy8vIHR5cGVzLCBidXQgbm90IHRocm91Z2ggZGVjbHR5cGUgb3IgdHlwZWRlZnMuCisgIERlZHVjZWRUeXBlICpnZXRDb250YWluZWREZWR1Y2VkVHlwZSgpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIEF1dG9UeXBlIHdob3NlIHR5cGUgd2lsbCBiZSBkZWR1Y2VkIGZvciBhIHZhcmlhYmxlIHdpdGgKKyAgLy8vIGFuIGluaXRpYWxpemVyIG9mIHRoaXMgdHlwZS4gVGhpcyBsb29rcyB0aHJvdWdoIGRlY2xhcmF0b3JzIGxpa2UgcG9pbnRlcgorICAvLy8gdHlwZXMsIGJ1dCBub3QgdGhyb3VnaCBkZWNsdHlwZSBvciB0eXBlZGVmcy4KKyAgQXV0b1R5cGUgKmdldENvbnRhaW5lZEF1dG9UeXBlKCkgY29uc3QgeworICAgIHJldHVybiBkeW5fY2FzdF9vcl9udWxsPEF1dG9UeXBlPihnZXRDb250YWluZWREZWR1Y2VkVHlwZSgpKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHR5cGUgd2FzIHdyaXR0ZW4gd2l0aCBhIGxlYWRpbmcgJ2F1dG8nCisgIC8vLyBjb3JyZXNwb25kaW5nIHRvIGEgdHJhaWxpbmcgcmV0dXJuIHR5cGUgKHBvc3NpYmx5IGZvciBhIG5lc3RlZAorICAvLy8gZnVuY3Rpb24gdHlwZSB3aXRoaW4gYSBwb2ludGVyIHRvIGZ1bmN0aW9uIHR5cGUgb3Igc2ltaWxhcikuCisgIGJvb2wgaGFzQXV0b0ZvclRyYWlsaW5nUmV0dXJuVHlwZSgpIGNvbnN0OworCisgIC8vLyBNZW1iZXItdGVtcGxhdGUgZ2V0QXM8c3BlY2lmaWMgdHlwZT4nLiAgTG9vayB0aHJvdWdoIHN1Z2FyIGZvcgorICAvLy8gYW4gaW5zdGFuY2Ugb2YgXDxzcGVjaWZpYyB0eXBlPi4gICBUaGlzIHNjaGVtZSB3aWxsIGV2ZW50dWFsbHkKKyAgLy8vIHJlcGxhY2UgdGhlIHNwZWNpZmljIGdldEFzWFhYWCBtZXRob2RzIGFib3ZlLgorICAvLy8KKyAgLy8vIFRoZXJlIGFyZSBzb21lIHNwZWNpYWxpemF0aW9ucyBvZiB0aGlzIG1lbWJlciB0ZW1wbGF0ZSBsaXN0ZWQKKyAgLy8vIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGlzIGNsYXNzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY29uc3QgVCAqZ2V0QXMoKSBjb25zdDsKKworICAvLy8gTWVtYmVyLXRlbXBsYXRlIGdldEFzQWRqdXN0ZWQ8c3BlY2lmaWMgdHlwZT4uIExvb2sgdGhyb3VnaCBzcGVjaWZpYyBraW5kcworICAvLy8gb2Ygc3VnYXIgKHBhcmVucywgYXR0cmlidXRlcywgZXRjKSBmb3IgYW4gaW5zdGFuY2Ugb2YgXDxzcGVjaWZpYyB0eXBlPi4KKyAgLy8vIFRoaXMgaXMgdXNlZCB3aGVuIHlvdSBuZWVkIHRvIHdhbGsgb3ZlciBzdWdhciBub2RlcyB0aGF0IHJlcHJlc2VudCBzb21lCisgIC8vLyBraW5kIG9mIHR5cGUgYWRqdXN0bWVudCBmcm9tIGEgdHlwZSB0aGF0IHdhcyB3cml0dGVuIGFzIGEgXDxzcGVjaWZpYyB0eXBlPgorICAvLy8gdG8gYW5vdGhlciB0eXBlIHRoYXQgaXMgc3RpbGwgY2Fub25pY2FsbHkgYSBcPHNwZWNpZmljIHR5cGU+LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY29uc3QgVCAqZ2V0QXNBZGp1c3RlZCgpIGNvbnN0OworCisgIC8vLyBBIHZhcmlhbnQgb2YgZ2V0QXM8PiBmb3IgYXJyYXkgdHlwZXMgd2hpY2ggc2lsZW50bHkgZGlzY2FyZHMKKyAgLy8vIHF1YWxpZmllcnMgZnJvbSB0aGUgb3V0ZXJtb3N0IHR5cGUuCisgIGNvbnN0IEFycmF5VHlwZSAqZ2V0QXNBcnJheVR5cGVVbnNhZmUoKSBjb25zdDsKKworICAvLy8gTWVtYmVyLXRlbXBsYXRlIGNhc3RBczxzcGVjaWZpYyB0eXBlPi4gIExvb2sgdGhyb3VnaCBzdWdhciBmb3IKKyAgLy8vIHRoZSB1bmRlcmx5aW5nIGluc3RhbmNlIG9mIFw8c3BlY2lmaWMgdHlwZT4uCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgaGFzIHRoZSBzYW1lIHJlbGF0aW9uc2hpcCB0byBnZXRBczxUPiBhcyBjYXN0PFQ+IGhhcworICAvLy8gdG8gZHluX2Nhc3Q8VD47IHdoaWNoIGlzIHRvIHNheSwgdGhlIHVuZGVybHlpbmcgdHlwZSAqbXVzdCoKKyAgLy8vIGhhdmUgdGhlIGludGVuZGVkIHR5cGUsIGFuZCB0aGlzIG1ldGhvZCB3aWxsIG5ldmVyIHJldHVybiBudWxsLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY29uc3QgVCAqY2FzdEFzKCkgY29uc3Q7CisKKyAgLy8vIEEgdmFyaWFudCBvZiBjYXN0QXM8PiBmb3IgYXJyYXkgdHlwZSB3aGljaCBzaWxlbnRseSBkaXNjYXJkcworICAvLy8gcXVhbGlmaWVycyBmcm9tIHRoZSBvdXRlcm1vc3QgdHlwZS4KKyAgY29uc3QgQXJyYXlUeXBlICpjYXN0QXNBcnJheVR5cGVVbnNhZmUoKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBiYXNlIGVsZW1lbnQgdHlwZSBvZiB0aGlzIHR5cGUsIHBvdGVudGlhbGx5IGRpc2NhcmRpbmcgdHlwZQorICAvLy8gcXVhbGlmaWVycy4gIFRoaXMgc2hvdWxkIG5ldmVyIGJlIHVzZWQgd2hlbiB0eXBlIHF1YWxpZmllcnMKKyAgLy8vIGFyZSBtZWFuaW5nZnVsLgorICBjb25zdCBUeXBlICpnZXRCYXNlRWxlbWVudFR5cGVVbnNhZmUoKSBjb25zdDsKKworICAvLy8gSWYgdGhpcyBpcyBhbiBhcnJheSB0eXBlLCByZXR1cm4gdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgYXJyYXksCisgIC8vLyBwb3RlbnRpYWxseSB3aXRoIHR5cGUgcXVhbGlmaWVycyBtaXNzaW5nLgorICAvLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgdXNlZCB3aGVuIHR5cGUgcXVhbGlmaWVycyBhcmUgbWVhbmluZ2Z1bC4KKyAgY29uc3QgVHlwZSAqZ2V0QXJyYXlFbGVtZW50VHlwZU5vVHlwZVF1YWwoKSBjb25zdDsKKworICAvLy8gSWYgdGhpcyBpcyBhIHBvaW50ZXIgdHlwZSwgcmV0dXJuIHRoZSBwb2ludGVlIHR5cGUuCisgIC8vLyBJZiB0aGlzIGlzIGFuIGFycmF5IHR5cGUsIHJldHVybiB0aGUgYXJyYXkgZWxlbWVudCB0eXBlLgorICAvLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgdXNlZCB3aGVuIHR5cGUgcXVhbGlmaWVycyBhcmUgbWVhbmluZ2Z1bC4KKyAgY29uc3QgVHlwZSAqZ2V0UG9pbnRlZU9yQXJyYXlFbGVtZW50VHlwZSgpIGNvbnN0OworCisgIC8vLyBJZiB0aGlzIGlzIGEgcG9pbnRlciwgT2JqQyBvYmplY3QgcG9pbnRlciwgb3IgYmxvY2sKKyAgLy8vIHBvaW50ZXIsIHRoaXMgcmV0dXJucyB0aGUgcmVzcGVjdGl2ZSBwb2ludGVlLgorICBRdWFsVHlwZSBnZXRQb2ludGVlVHlwZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHNwZWNpZmllZCB0eXBlIHdpdGggYW55ICJzdWdhciIgcmVtb3ZlZCBmcm9tIHRoZSB0eXBlLAorICAvLy8gcmVtb3ZpbmcgYW55IHR5cGVkZWZzLCB0eXBlb2ZzLCBldGMuLCBhcyB3ZWxsIGFzIGFueSBxdWFsaWZpZXJzLgorICBjb25zdCBUeXBlICpnZXRVbnF1YWxpZmllZERlc3VnYXJlZFR5cGUoKSBjb25zdDsKKworICAvLy8gTW9yZSB0eXBlIHByZWRpY2F0ZXMgdXNlZnVsIGZvciB0eXBlIGNoZWNraW5nL3Byb21vdGlvbgorICBib29sIGlzUHJvbW90YWJsZUludGVnZXJUeXBlKCkgY29uc3Q7IC8vIEM5OSA2LjMuMS4xcDIKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBpbnRlZ2VyIHR5cGUgdGhhdCBpcworICAvLy8gc2lnbmVkLCBhY2NvcmRpbmcgdG8gQzk5IDYuMi41cDQgW2NoYXIsIHNpZ25lZCBjaGFyLCBzaG9ydCwgaW50LCBsb25nLi5dLAorICAvLy8gb3IgYW4gZW51bSBkZWNsIHdoaWNoIGhhcyBhIHNpZ25lZCByZXByZXNlbnRhdGlvbi4KKyAgYm9vbCBpc1NpZ25lZEludGVnZXJUeXBlKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gaW50ZWdlciB0eXBlIHRoYXQgaXMKKyAgLy8vIHVuc2lnbmVkLCBhY2NvcmRpbmcgdG8gQzk5IDYuMi41cDYgW3doaWNoIHJldHVybnMgdHJ1ZSBmb3IgX0Jvb2xdLAorICAvLy8gb3IgYW4gZW51bSBkZWNsIHdoaWNoIGhhcyBhbiB1bnNpZ25lZCByZXByZXNlbnRhdGlvbi4KKyAgYm9vbCBpc1Vuc2lnbmVkSW50ZWdlclR5cGUoKSBjb25zdDsKKworICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgaXMgYW4gaW50ZWdlciB0eXBlIHRoYXQgaXMgc2lnbmVkIG9yIGFuCisgIC8vLyBlbnVtZXJhdGlvbiB0eXBlcyB3aG9zZSB1bmRlcmx5aW5nIHR5cGUgaXMgYSBzaWduZWQgaW50ZWdlciB0eXBlLgorICBib29sIGlzU2lnbmVkSW50ZWdlck9yRW51bWVyYXRpb25UeXBlKCkgY29uc3Q7CisKKyAgLy8vIERldGVybWluZXMgd2hldGhlciB0aGlzIGlzIGFuIGludGVnZXIgdHlwZSB0aGF0IGlzIHVuc2lnbmVkIG9yIGFuCisgIC8vLyBlbnVtZXJhdGlvbiB0eXBlcyB3aG9zZSB1bmRlcmx5aW5nIHR5cGUgaXMgYSB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuCisgIGJvb2wgaXNVbnNpZ25lZEludGVnZXJPckVudW1lcmF0aW9uVHlwZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIG5vdCBhIHZhcmlhYmxlIHNpemVkIHR5cGUsCisgIC8vLyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG9mIEM5OSA2LjcuNXAzLiAgSXQgaXMgbm90IGxlZ2FsIHRvIGNhbGwgdGhpcyBvbgorICAvLy8gaW5jb21wbGV0ZSB0eXBlcy4KKyAgYm9vbCBpc0NvbnN0YW50U2l6ZVR5cGUoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdHlwZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgc29tZQorICAvLy8gc2V0IG9mIHR5cGUgc3BlY2lmaWVycy4KKyAgYm9vbCBpc1NwZWNpZmllclR5cGUoKSBjb25zdDsKKworICAvLy8gRGV0ZXJtaW5lIHRoZSBsaW5rYWdlIG9mIHRoaXMgdHlwZS4KKyAgTGlua2FnZSBnZXRMaW5rYWdlKCkgY29uc3Q7CisKKyAgLy8vIERldGVybWluZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGlzIHR5cGUuCisgIFZpc2liaWxpdHkgZ2V0VmlzaWJpbGl0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TGlua2FnZUFuZFZpc2liaWxpdHkoKS5nZXRWaXNpYmlsaXR5KCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHZpc2liaWxpdHkgd2FzIGV4cGxpY2l0bHkgc2V0IGlzIHRoZSBjb2RlLgorICBib29sIGlzVmlzaWJpbGl0eUV4cGxpY2l0KCkgY29uc3QgeworICAgIHJldHVybiBnZXRMaW5rYWdlQW5kVmlzaWJpbGl0eSgpLmlzVmlzaWJpbGl0eUV4cGxpY2l0KCk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHRoZSBsaW5rYWdlIGFuZCB2aXNpYmlsaXR5IG9mIHRoaXMgdHlwZS4KKyAgTGlua2FnZUluZm8gZ2V0TGlua2FnZUFuZFZpc2liaWxpdHkoKSBjb25zdDsKKworICAvLy8gVHJ1ZSBpZiB0aGUgY29tcHV0ZWQgbGlua2FnZSBpcyB2YWxpZC4gVXNlZCBmb3IgY29uc2lzdGVuY3kKKyAgLy8vIGNoZWNraW5nLiBTaG91bGQgYWx3YXlzIHJldHVybiB0cnVlLgorICBib29sIGlzTGlua2FnZVZhbGlkKCkgY29uc3Q7CisKKyAgLy8vIERldGVybWluZSB0aGUgbnVsbGFiaWxpdHkgb2YgdGhlIGdpdmVuIHR5cGUuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IG51bGxhYmlsaXR5IGlzIG9ubHkgY2FwdHVyZWQgYXMgc3VnYXIgd2l0aGluIHRoZSB0eXBlCisgIC8vLyBzeXN0ZW0sIG5vdCBhcyBwYXJ0IG9mIHRoZSBjYW5vbmljYWwgdHlwZSwgc28gbnVsbGFiaWxpdHkgd2lsbAorICAvLy8gYmUgbG9zdCBieSBjYW5vbmljYWxpemF0aW9uIGFuZCBkZXN1Z2FyaW5nLgorICBPcHRpb25hbDxOdWxsYWJpbGl0eUtpbmQ+IGdldE51bGxhYmlsaXR5KGNvbnN0IEFTVENvbnRleHQgJmNvbnRleHQpIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gdHlwZSBjYW4gaGF2ZSBhIG51bGxhYmlsaXR5CisgIC8vLyBzcGVjaWZpZXIgYXBwbGllZCB0byBpdCwgaS5lLiwgaWYgaXQgaXMgYW55IGtpbmQgb2YgcG9pbnRlciB0eXBlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSZXN1bHRJZlVua25vd24gVGhlIHZhbHVlIHRvIHJldHVybiBpZiB3ZSBkb24ndCB5ZXQga25vdyB3aGV0aGVyCisgIC8vLyAgICAgICAgdGhpcyB0eXBlIGNhbiBoYXZlIG51bGxhYmlsaXR5IGJlY2F1c2UgaXQgaXMgZGVwZW5kZW50LgorICBib29sIGNhbkhhdmVOdWxsYWJpbGl0eShib29sIFJlc3VsdElmVW5rbm93biA9IHRydWUpIGNvbnN0OworCisgIC8vLyBSZXRyaWV2ZSB0aGUgc2V0IG9mIHN1YnN0aXR1dGlvbnMgcmVxdWlyZWQgd2hlbiBhY2Nlc3NpbmcgYSBtZW1iZXIKKyAgLy8vIG9mIHRoZSBPYmplY3RpdmUtQyByZWNlaXZlciB0eXBlIHRoYXQgaXMgZGVjbGFyZWQgaW4gdGhlIGdpdmVuIGNvbnRleHQuCisgIC8vLworICAvLy8gXGMgKnRoaXMgaXMgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCB3ZSdyZSBvcGVyYXRpbmcgb24sIGUuZy4sIHRoZQorICAvLy8gcmVjZWl2ZXIgZm9yIGEgbWVzc2FnZSBzZW5kIG9yIHRoZSBiYXNlIG9mIGEgcHJvcGVydHkgYWNjZXNzLCBhbmQgaXMKKyAgLy8vIGV4cGVjdGVkIHRvIGJlIG9mIHNvbWUgb2JqZWN0IG9yIG9iamVjdCBwb2ludGVyIHR5cGUuCisgIC8vLworICAvLy8gXHBhcmFtIGRjIFRoZSBkZWNsYXJhdGlvbiBjb250ZXh0IGZvciB3aGljaCB3ZSBhcmUgYnVpbGRpbmcgdXAgYQorICAvLy8gc3Vic3RpdHV0aW9uIG1hcHBpbmcsIHdoaWNoIHNob3VsZCBiZSBhbiBPYmplY3RpdmUtQyBjbGFzcywgZXh0ZW5zaW9uLAorICAvLy8gY2F0ZWdvcnksIG9yIG1ldGhvZCB3aXRoaW4uCisgIC8vLworICAvLy8gXHJldHVybnMgYW4gYXJyYXkgb2YgdHlwZSBhcmd1bWVudHMgdGhhdCBjYW4gYmUgc3Vic3RpdHV0ZWQgZm9yCisgIC8vLyB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIHRoZSBnaXZlbiBkZWNsYXJhdGlvbiBjb250ZXh0IGluIGFueSB0eXBlIGRlc2NyaWJlZAorICAvLy8gd2l0aGluIHRoYXQgY29udGV4dCwgb3IgYW4gZW1wdHkgb3B0aW9uYWwgdG8gaW5kaWNhdGUgdGhhdCBubworICAvLy8gc3Vic3RpdHV0aW9uIGlzIHJlcXVpcmVkLgorICBPcHRpb25hbDxBcnJheVJlZjxRdWFsVHlwZT4+CisgIGdldE9iakNTdWJzdGl0dXRpb25zKGNvbnN0IERlY2xDb250ZXh0ICpkYykgY29uc3Q7CisKKyAgLy8vIERldGVybWluZXMgaWYgdGhpcyBpcyBhbiBPYmpDIGludGVyZmFjZSB0eXBlIHRoYXQgbWF5IGFjY2VwdCB0eXBlCisgIC8vLyBwYXJhbWV0ZXJzLgorICBib29sIGFjY2VwdHNPYmpDVHlwZVBhcmFtcygpIGNvbnN0OworCisgIGNvbnN0IGNoYXIgKmdldFR5cGVDbGFzc05hbWUoKSBjb25zdDsKKworICBRdWFsVHlwZSBnZXRDYW5vbmljYWxUeXBlSW50ZXJuYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIENhbm9uaWNhbFR5cGU7CisgIH0KKworICBDYW5RdWFsVHlwZSBnZXRDYW5vbmljYWxUeXBlVW5xdWFsaWZpZWQoKSBjb25zdDsgLy8gaW4gQ2Fub25pY2FsVHlwZS5oCisgIHZvaWQgZHVtcCgpIGNvbnN0OworICB2b2lkIGR1bXAobGx2bTo6cmF3X29zdHJlYW0gJk9TKSBjb25zdDsKK307CisKKy8vLyBcYnJpZWYgVGhpcyB3aWxsIGNoZWNrIGZvciBhIFR5cGVkZWZUeXBlIGJ5IHJlbW92aW5nIGFueSBleGlzdGluZyBzdWdhcgorLy8vIHVudGlsIGl0IHJlYWNoZXMgYSBUeXBlZGVmVHlwZSBvciBhIG5vbi1zdWdhcmVkIHR5cGUuCit0ZW1wbGF0ZSA8PiBjb25zdCBUeXBlZGVmVHlwZSAqVHlwZTo6Z2V0QXMoKSBjb25zdDsKKworLy8vIFxicmllZiBUaGlzIHdpbGwgY2hlY2sgZm9yIGEgVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUgYnkgcmVtb3ZpbmcgYW55CisvLy8gZXhpc3Rpbmcgc3VnYXIgdW50aWwgaXQgcmVhY2hlcyBhIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlIG9yIGEKKy8vLyBub24tc3VnYXJlZCB0eXBlLgordGVtcGxhdGUgPD4gY29uc3QgVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUgKlR5cGU6OmdldEFzKCkgY29uc3Q7CisKKy8vLyBcYnJpZWYgVGhpcyB3aWxsIGNoZWNrIGZvciBhbiBBdHRyaWJ1dGVkVHlwZSBieSByZW1vdmluZyBhbnkgZXhpc3Rpbmcgc3VnYXIKKy8vLyB1bnRpbCBpdCByZWFjaGVzIGFuIEF0dHJpYnV0ZWRUeXBlIG9yIGEgbm9uLXN1Z2FyZWQgdHlwZS4KK3RlbXBsYXRlIDw+IGNvbnN0IEF0dHJpYnV0ZWRUeXBlICpUeXBlOjpnZXRBcygpIGNvbnN0OworCisvLyBXZSBjYW4gZG8gY2Fub25pY2FsIGxlYWYgdHlwZXMgZmFzdGVyLCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdG8KKy8vIHdvcnJ5IGFib3V0IHByZXNlcnZpbmcgY2hpbGQgdHlwZSBkZWNvcmF0aW9uLgorI2RlZmluZSBUWVBFKENsYXNzLCBCYXNlKQorI2RlZmluZSBMRUFGX1RZUEUoQ2xhc3MpIFwKK3RlbXBsYXRlIDw+IGlubGluZSBjb25zdCBDbGFzcyMjVHlwZSAqVHlwZTo6Z2V0QXMoKSBjb25zdCB7IFwKKyAgcmV0dXJuIGR5bl9jYXN0PENsYXNzIyNUeXBlPihDYW5vbmljYWxUeXBlKTsgXAorfSBcCit0ZW1wbGF0ZSA8PiBpbmxpbmUgY29uc3QgQ2xhc3MjI1R5cGUgKlR5cGU6OmNhc3RBcygpIGNvbnN0IHsgXAorICByZXR1cm4gY2FzdDxDbGFzcyMjVHlwZT4oQ2Fub25pY2FsVHlwZSk7IFwKK30KKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZU5vZGVzLmRlZiIKKworLy8vIFRoaXMgY2xhc3MgaXMgdXNlZCBmb3IgYnVpbHRpbiB0eXBlcyBsaWtlICdpbnQnLiAgQnVpbHRpbgorLy8vIHR5cGVzIGFyZSBhbHdheXMgY2Fub25pY2FsIGFuZCBoYXZlIGEgbGl0ZXJhbCBuYW1lIGZpZWxkLgorY2xhc3MgQnVpbHRpblR5cGUgOiBwdWJsaWMgVHlwZSB7CitwdWJsaWM6CisgIGVudW0gS2luZCB7CisvLyBPcGVuQ0wgaW1hZ2UgdHlwZXMKKyNkZWZpbmUgSU1BR0VfVFlQRShJbWdUeXBlLCBJZCwgU2luZ2xldG9uSWQsIEFjY2VzcywgU3VmZml4KSBJZCwKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9PcGVuQ0xJbWFnZVR5cGVzLmRlZiIKKy8vIEFsbCBvdGhlciBidWlsdGluIHR5cGVzCisjZGVmaW5lIEJVSUxUSU5fVFlQRShJZCwgU2luZ2xldG9uSWQpIElkLAorI2RlZmluZSBMQVNUX0JVSUxUSU5fVFlQRShJZCkgTGFzdEtpbmQgPSBJZAorI2luY2x1ZGUgImNsYW5nL0FTVC9CdWlsdGluVHlwZXMuZGVmIgorICB9OworCitwdWJsaWM6CisgIEJ1aWx0aW5UeXBlKEtpbmQgSykKKyAgICAgIDogVHlwZShCdWlsdGluLCBRdWFsVHlwZSgpLCAvKkRlcGVuZGVudD0qLyhLID09IERlcGVuZGVudCksCisgICAgICAgICAgICAgLypJbnN0YW50aWF0aW9uRGVwZW5kZW50PSovKEsgPT0gRGVwZW5kZW50KSwKKyAgICAgICAgICAgICAvKlZhcmlhYmx5TW9kaWZpZWQ9Ki9mYWxzZSwKKyAgICAgICAgICAgICAvKlVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2s9Ki9mYWxzZSkgeworICAgIEJ1aWx0aW5UeXBlQml0cy5LaW5kID0gSzsKKyAgfQorCisgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PEtpbmQ+KEJ1aWx0aW5UeXBlQml0cy5LaW5kKTsgfQorICBTdHJpbmdSZWYgZ2V0TmFtZShjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKKworICBjb25zdCBjaGFyICpnZXROYW1lQXNDU3RyaW5nKGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0IHsKKyAgICAvLyBUaGUgU3RyaW5nUmVmIGlzIG51bGwtdGVybWluYXRlZC4KKyAgICBTdHJpbmdSZWYgc3RyID0gZ2V0TmFtZShQb2xpY3kpOworICAgIGFzc2VydCghc3RyLmVtcHR5KCkgJiYgc3RyLmRhdGEoKVtzdHIuc2l6ZSgpXSA9PSAnXDAnKTsKKyAgICByZXR1cm4gc3RyLmRhdGEoKTsKKyAgfQorCisgIGJvb2wgaXNTdWdhcmVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0IHsgcmV0dXJuIFF1YWxUeXBlKHRoaXMsIDApOyB9CisKKyAgYm9vbCBpc0ludGVnZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEtpbmQoKSA+PSBCb29sICYmIGdldEtpbmQoKSA8PSBJbnQxMjg7CisgIH0KKworICBib29sIGlzU2lnbmVkSW50ZWdlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0S2luZCgpID49IENoYXJfUyAmJiBnZXRLaW5kKCkgPD0gSW50MTI4OworICB9CisKKyAgYm9vbCBpc1Vuc2lnbmVkSW50ZWdlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0S2luZCgpID49IEJvb2wgJiYgZ2V0S2luZCgpIDw9IFVJbnQxMjg7CisgIH0KKworICBib29sIGlzRmxvYXRpbmdQb2ludCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0S2luZCgpID49IEhhbGYgJiYgZ2V0S2luZCgpIDw9IEZsb2F0MTI4OworICB9CisKKyAgLy8vIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4ga2luZCBjb3JyZXNwb25kcyB0byBhIHBsYWNlaG9sZGVyIHR5cGUuCisgIHN0YXRpYyBib29sIGlzUGxhY2Vob2xkZXJUeXBlS2luZChLaW5kIEspIHsKKyAgICByZXR1cm4gSyA+PSBPdmVybG9hZDsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyB0eXBlIGlzIGEgcGxhY2Vob2xkZXIgdHlwZSwgaS5lLiBhIHR5cGUKKyAgLy8vIHdoaWNoIGNhbm5vdCBhcHBlYXIgaW4gYXJiaXRyYXJ5IHBvc2l0aW9ucyBpbiBhIGZ1bGx5LWZvcm1lZAorICAvLy8gZXhwcmVzc2lvbi4KKyAgYm9vbCBpc1BsYWNlaG9sZGVyVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNQbGFjZWhvbGRlclR5cGVLaW5kKGdldEtpbmQoKSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgdHlwZSBpcyBhIHBsYWNlaG9sZGVyIHR5cGUgb3RoZXIgdGhhbgorICAvLy8gT3ZlcmxvYWQuICBNb3N0IHBsYWNlaG9sZGVyIHR5cGVzIHJlcXVpcmUgb25seSBzeW50YWN0aWMKKyAgLy8vIGluZm9ybWF0aW9uIGFib3V0IHRoZWlyIGNvbnRleHQgaW4gb3JkZXIgdG8gYmUgcmVzb2x2ZWQgKGUuZy4KKyAgLy8vIHdoZXRoZXIgaXQgaXMgYSBjYWxsIGV4cHJlc3Npb24pLCB3aGljaCBtZWFucyB0aGV5IGNhbiAoYW5kCisgIC8vLyBzaG91bGQpIGJlIHJlc29sdmVkIGluIGFuIGVhcmxpZXIgInBoYXNlIiBvZiBhbmFseXNpcy4KKyAgLy8vIE92ZXJsb2FkIGV4cHJlc3Npb25zIHNvbWV0aW1lcyBwaWNrIHVwIGZ1cnRoZXIgaW5mb3JtYXRpb24KKyAgLy8vIGZyb20gdGhlaXIgY29udGV4dCwgbGlrZSB3aGV0aGVyIHRoZSBjb250ZXh0IGV4cGVjdHMgYQorICAvLy8gc3BlY2lmaWMgZnVuY3Rpb24tcG9pbnRlciB0eXBlLCBhbmQgc28gZnJlcXVlbnRseSBuZWVkCisgIC8vLyBzcGVjaWFsIHRyZWF0bWVudC4KKyAgYm9vbCBpc05vbk92ZXJsb2FkUGxhY2Vob2xkZXJUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRLaW5kKCkgPiBPdmVybG9hZDsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeyByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gQnVpbHRpbjsgfQorfTsKKworLy8vIENvbXBsZXggdmFsdWVzLCBwZXIgQzk5IDYuMi41cDExLiAgVGhpcyBzdXBwb3J0cyB0aGUgQzk5IGNvbXBsZXgKKy8vLyB0eXBlcyAoX0NvbXBsZXggZmxvYXQgZXRjKSBhcyB3ZWxsIGFzIHRoZSBHQ0MgaW50ZWdlciBjb21wbGV4IGV4dGVuc2lvbnMuCitjbGFzcyBDb21wbGV4VHlwZSA6IHB1YmxpYyBUeXBlLCBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsgLy8gQVNUQ29udGV4dCBjcmVhdGVzIHRoZXNlLgorCisgIFF1YWxUeXBlIEVsZW1lbnRUeXBlOworCisgIENvbXBsZXhUeXBlKFF1YWxUeXBlIEVsZW1lbnQsIFF1YWxUeXBlIENhbm9uaWNhbFB0cikKKyAgICAgIDogVHlwZShDb21wbGV4LCBDYW5vbmljYWxQdHIsIEVsZW1lbnQtPmlzRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgIEVsZW1lbnQtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudFR5cGUoKSwKKyAgICAgICAgICAgICBFbGVtZW50LT5pc1ZhcmlhYmx5TW9kaWZpZWRUeXBlKCksCisgICAgICAgICAgICAgRWxlbWVudC0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSwKKyAgICAgICAgRWxlbWVudFR5cGUoRWxlbWVudCkge30KKworcHVibGljOgorICBRdWFsVHlwZSBnZXRFbGVtZW50VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEVsZW1lbnRUeXBlOyB9CisKKyAgYm9vbCBpc1N1Z2FyZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICBRdWFsVHlwZSBkZXN1Z2FyKCkgY29uc3QgeyByZXR1cm4gUXVhbFR5cGUodGhpcywgMCk7IH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIHsKKyAgICBQcm9maWxlKElELCBnZXRFbGVtZW50VHlwZSgpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIFF1YWxUeXBlIEVsZW1lbnQpIHsKKyAgICBJRC5BZGRQb2ludGVyKEVsZW1lbnQuZ2V0QXNPcGFxdWVQdHIoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsgcmV0dXJuIFQtPmdldFR5cGVDbGFzcygpID09IENvbXBsZXg7IH0KK307CisKKy8vLyBTdWdhciBmb3IgcGFyZW50aGVzZXMgdXNlZCB3aGVuIHNwZWNpZnlpbmcgdHlwZXMuCitjbGFzcyBQYXJlblR5cGUgOiBwdWJsaWMgVHlwZSwgcHVibGljIGxsdm06OkZvbGRpbmdTZXROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7IC8vIEFTVENvbnRleHQgY3JlYXRlcyB0aGVzZS4KKworICBRdWFsVHlwZSBJbm5lcjsKKworICBQYXJlblR5cGUoUXVhbFR5cGUgSW5uZXJUeXBlLCBRdWFsVHlwZSBDYW5vblR5cGUpCisgICAgICA6IFR5cGUoUGFyZW4sIENhbm9uVHlwZSwgSW5uZXJUeXBlLT5pc0RlcGVuZGVudFR5cGUoKSwKKyAgICAgICAgICAgICBJbm5lclR5cGUtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudFR5cGUoKSwKKyAgICAgICAgICAgICBJbm5lclR5cGUtPmlzVmFyaWFibHlNb2RpZmllZFR5cGUoKSwKKyAgICAgICAgICAgICBJbm5lclR5cGUtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIElubmVyKElubmVyVHlwZSkge30KKworcHVibGljOgorICBRdWFsVHlwZSBnZXRJbm5lclR5cGUoKSBjb25zdCB7IHJldHVybiBJbm5lcjsgfQorCisgIGJvb2wgaXNTdWdhcmVkKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICBRdWFsVHlwZSBkZXN1Z2FyKCkgY29uc3QgeyByZXR1cm4gZ2V0SW5uZXJUeXBlKCk7IH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIHsKKyAgICBQcm9maWxlKElELCBnZXRJbm5lclR5cGUoKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELCBRdWFsVHlwZSBJbm5lcikgeworICAgIElubmVyLlByb2ZpbGUoSUQpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7IHJldHVybiBULT5nZXRUeXBlQ2xhc3MoKSA9PSBQYXJlbjsgfQorfTsKKworLy8vIFBvaW50ZXJUeXBlIC0gQzk5IDYuNy41LjEgLSBQb2ludGVyIERlY2xhcmF0b3JzLgorY2xhc3MgUG9pbnRlclR5cGUgOiBwdWJsaWMgVHlwZSwgcHVibGljIGxsdm06OkZvbGRpbmdTZXROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7IC8vIEFTVENvbnRleHQgY3JlYXRlcyB0aGVzZS4KKworICBRdWFsVHlwZSBQb2ludGVlVHlwZTsKKworICBQb2ludGVyVHlwZShRdWFsVHlwZSBQb2ludGVlLCBRdWFsVHlwZSBDYW5vbmljYWxQdHIpCisgICAgICA6IFR5cGUoUG9pbnRlciwgQ2Fub25pY2FsUHRyLCBQb2ludGVlLT5pc0RlcGVuZGVudFR5cGUoKSwKKyAgICAgICAgICAgICBQb2ludGVlLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgICAgUG9pbnRlZS0+aXNWYXJpYWJseU1vZGlmaWVkVHlwZSgpLAorICAgICAgICAgICAgIFBvaW50ZWUtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIFBvaW50ZWVUeXBlKFBvaW50ZWUpIHt9CisKK3B1YmxpYzoKKyAgUXVhbFR5cGUgZ2V0UG9pbnRlZVR5cGUoKSBjb25zdCB7IHJldHVybiBQb2ludGVlVHlwZTsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYWRkcmVzcyBzcGFjZXMgb2YgcG9pbnRlcnMgb3ZlcmxhcC4KKyAgLy8vIE9wZW5DTCB2Mi4wIGRlZmluZXMgY29udmVyc2lvbiBydWxlcyBmb3IgcG9pbnRlcnMgdG8gZGlmZmVyZW50CisgIC8vLyBhZGRyZXNzIHNwYWNlcyAoT3BlbkNMQyB2Mi4wIHM2LjUuNSkgYW5kIG5vdGlvbiBvZiBvdmVybGFwcGluZworICAvLy8gYWRkcmVzcyBzcGFjZXMuCisgIC8vLyBDTDEuMSBvciBDTDEuMjoKKyAgLy8vICAgYWRkcmVzcyBzcGFjZXMgb3ZlcmxhcCBpZmYgdGhleSBhcmUgdGhleSBzYW1lLgorICAvLy8gQ0wyLjAgYWRkczoKKyAgLy8vICAgX19nZW5lcmljIG92ZXJsYXBzIHdpdGggYW55IGFkZHJlc3Mgc3BhY2UgZXhjZXB0IGZvciBfX2NvbnN0YW50LgorICBib29sIGlzQWRkcmVzc1NwYWNlT3ZlcmxhcHBpbmcoY29uc3QgUG9pbnRlclR5cGUgJm90aGVyKSBjb25zdCB7CisgICAgUXVhbGlmaWVycyB0aGlzUXVhbHMgPSBQb2ludGVlVHlwZS5nZXRRdWFsaWZpZXJzKCk7CisgICAgUXVhbGlmaWVycyBvdGhlclF1YWxzID0gb3RoZXIuZ2V0UG9pbnRlZVR5cGUoKS5nZXRRdWFsaWZpZXJzKCk7CisgICAgLy8gQWRkcmVzcyBzcGFjZXMgb3ZlcmxhcCBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlbSBpcyBhIHN1cGVyc2V0IG9mIGFub3RoZXIKKyAgICByZXR1cm4gdGhpc1F1YWxzLmlzQWRkcmVzc1NwYWNlU3VwZXJzZXRPZihvdGhlclF1YWxzKSB8fAorICAgICAgICAgICBvdGhlclF1YWxzLmlzQWRkcmVzc1NwYWNlU3VwZXJzZXRPZih0aGlzUXVhbHMpOworICB9CisKKyAgYm9vbCBpc1N1Z2FyZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICBRdWFsVHlwZSBkZXN1Z2FyKCkgY29uc3QgeyByZXR1cm4gUXVhbFR5cGUodGhpcywgMCk7IH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIHsKKyAgICBQcm9maWxlKElELCBnZXRQb2ludGVlVHlwZSgpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIFF1YWxUeXBlIFBvaW50ZWUpIHsKKyAgICBJRC5BZGRQb2ludGVyKFBvaW50ZWUuZ2V0QXNPcGFxdWVQdHIoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsgcmV0dXJuIFQtPmdldFR5cGVDbGFzcygpID09IFBvaW50ZXI7IH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgdHlwZSB3aGljaCB3YXMgaW1wbGljaXRseSBhZGp1c3RlZCBieSB0aGUgc2VtYW50aWMKKy8vLyBlbmdpbmUgZm9yIGFyYml0cmFyeSByZWFzb25zLiAgRm9yIGV4YW1wbGUsIGFycmF5IGFuZCBmdW5jdGlvbiB0eXBlcyBjYW4KKy8vLyBkZWNheSwgYW5kIGZ1bmN0aW9uIHR5cGVzIGNhbiBoYXZlIHRoZWlyIGNhbGxpbmcgY29udmVudGlvbnMgYWRqdXN0ZWQuCitjbGFzcyBBZGp1c3RlZFR5cGUgOiBwdWJsaWMgVHlwZSwgcHVibGljIGxsdm06OkZvbGRpbmdTZXROb2RlIHsKKyAgUXVhbFR5cGUgT3JpZ2luYWxUeTsKKyAgUXVhbFR5cGUgQWRqdXN0ZWRUeTsKKworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsgLy8gQVNUQ29udGV4dCBjcmVhdGVzIHRoZXNlLgorCisgIEFkanVzdGVkVHlwZShUeXBlQ2xhc3MgVEMsIFF1YWxUeXBlIE9yaWdpbmFsVHksIFF1YWxUeXBlIEFkanVzdGVkVHksCisgICAgICAgICAgICAgICBRdWFsVHlwZSBDYW5vbmljYWxQdHIpCisgICAgICA6IFR5cGUoVEMsIENhbm9uaWNhbFB0ciwgT3JpZ2luYWxUeS0+aXNEZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgICAgT3JpZ2luYWxUeS0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgIE9yaWdpbmFsVHktPmlzVmFyaWFibHlNb2RpZmllZFR5cGUoKSwKKyAgICAgICAgICAgICBPcmlnaW5hbFR5LT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgICBPcmlnaW5hbFR5KE9yaWdpbmFsVHkpLCBBZGp1c3RlZFR5KEFkanVzdGVkVHkpIHt9CisKK3B1YmxpYzoKKyAgUXVhbFR5cGUgZ2V0T3JpZ2luYWxUeXBlKCkgY29uc3QgeyByZXR1cm4gT3JpZ2luYWxUeTsgfQorICBRdWFsVHlwZSBnZXRBZGp1c3RlZFR5cGUoKSBjb25zdCB7IHJldHVybiBBZGp1c3RlZFR5OyB9CisKKyAgYm9vbCBpc1N1Z2FyZWQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIFF1YWxUeXBlIGRlc3VnYXIoKSBjb25zdCB7IHJldHVybiBBZGp1c3RlZFR5OyB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgUHJvZmlsZShJRCwgT3JpZ2luYWxUeSwgQWRqdXN0ZWRUeSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELCBRdWFsVHlwZSBPcmlnLCBRdWFsVHlwZSBOZXcpIHsKKyAgICBJRC5BZGRQb2ludGVyKE9yaWcuZ2V0QXNPcGFxdWVQdHIoKSk7CisgICAgSUQuQWRkUG9pbnRlcihOZXcuZ2V0QXNPcGFxdWVQdHIoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gQWRqdXN0ZWQgfHwgVC0+Z2V0VHlwZUNsYXNzKCkgPT0gRGVjYXllZDsKKyAgfQorfTsKKworLy8vIFJlcHJlc2VudHMgYSBwb2ludGVyIHR5cGUgZGVjYXllZCBmcm9tIGFuIGFycmF5IG9yIGZ1bmN0aW9uIHR5cGUuCitjbGFzcyBEZWNheWVkVHlwZSA6IHB1YmxpYyBBZGp1c3RlZFR5cGUgeworICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsgLy8gQVNUQ29udGV4dCBjcmVhdGVzIHRoZXNlLgorCisgIGlubGluZQorICBEZWNheWVkVHlwZShRdWFsVHlwZSBPcmlnaW5hbFR5cGUsIFF1YWxUeXBlIERlY2F5ZWQsIFF1YWxUeXBlIENhbm9uaWNhbCk7CisKK3B1YmxpYzoKKyAgUXVhbFR5cGUgZ2V0RGVjYXllZFR5cGUoKSBjb25zdCB7IHJldHVybiBnZXRBZGp1c3RlZFR5cGUoKTsgfQorCisgIGlubGluZSBRdWFsVHlwZSBnZXRQb2ludGVlVHlwZSgpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeyByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gRGVjYXllZDsgfQorfTsKKworLy8vIFBvaW50ZXIgdG8gYSBibG9jayB0eXBlLgorLy8vIFRoaXMgdHlwZSBpcyB0byByZXByZXNlbnQgdHlwZXMgc3ludGFjdGljYWxseSByZXByZXNlbnRlZCBhcworLy8vICJ2b2lkICheKShpbnQpIiwgZXRjLiBQb2ludGVlIGlzIHJlcXVpcmVkIHRvIGFsd2F5cyBiZSBhIGZ1bmN0aW9uIHR5cGUuCitjbGFzcyBCbG9ja1BvaW50ZXJUeXBlIDogcHVibGljIFR5cGUsIHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RDb250ZXh0OyAvLyBBU1RDb250ZXh0IGNyZWF0ZXMgdGhlc2UuCisKKyAgLy8gQmxvY2sgaXMgc29tZSBraW5kIG9mIHBvaW50ZXIgdHlwZQorICBRdWFsVHlwZSBQb2ludGVlVHlwZTsKKworICBCbG9ja1BvaW50ZXJUeXBlKFF1YWxUeXBlIFBvaW50ZWUsIFF1YWxUeXBlIENhbm9uaWNhbENscykKKyAgICAgIDogVHlwZShCbG9ja1BvaW50ZXIsIENhbm9uaWNhbENscywgUG9pbnRlZS0+aXNEZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgICAgUG9pbnRlZS0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgIFBvaW50ZWUtPmlzVmFyaWFibHlNb2RpZmllZFR5cGUoKSwKKyAgICAgICAgICAgICBQb2ludGVlLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgICBQb2ludGVlVHlwZShQb2ludGVlKSB7fQorCitwdWJsaWM6CisgIC8vIEdldCB0aGUgcG9pbnRlZSB0eXBlLiBQb2ludGVlIGlzIHJlcXVpcmVkIHRvIGFsd2F5cyBiZSBhIGZ1bmN0aW9uIHR5cGUuCisgIFF1YWxUeXBlIGdldFBvaW50ZWVUeXBlKCkgY29uc3QgeyByZXR1cm4gUG9pbnRlZVR5cGU7IH0KKworICBib29sIGlzU3VnYXJlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIFF1YWxUeXBlIGRlc3VnYXIoKSBjb25zdCB7IHJldHVybiBRdWFsVHlwZSh0aGlzLCAwKTsgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgICAgUHJvZmlsZShJRCwgZ2V0UG9pbnRlZVR5cGUoKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELCBRdWFsVHlwZSBQb2ludGVlKSB7CisgICAgICBJRC5BZGRQb2ludGVyKFBvaW50ZWUuZ2V0QXNPcGFxdWVQdHIoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gQmxvY2tQb2ludGVyOworICB9Cit9OworCisvLy8gQmFzZSBmb3IgTFZhbHVlUmVmZXJlbmNlVHlwZSBhbmQgUlZhbHVlUmVmZXJlbmNlVHlwZQorY2xhc3MgUmVmZXJlbmNlVHlwZSA6IHB1YmxpYyBUeXBlLCBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworICBRdWFsVHlwZSBQb2ludGVlVHlwZTsKKworcHJvdGVjdGVkOgorICBSZWZlcmVuY2VUeXBlKFR5cGVDbGFzcyB0YywgUXVhbFR5cGUgUmVmZXJlbmNlZSwgUXVhbFR5cGUgQ2Fub25pY2FsUmVmLAorICAgICAgICAgICAgICAgIGJvb2wgU3BlbGxlZEFzTFZhbHVlKQorICAgICAgOiBUeXBlKHRjLCBDYW5vbmljYWxSZWYsIFJlZmVyZW5jZWUtPmlzRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgIFJlZmVyZW5jZWUtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudFR5cGUoKSwKKyAgICAgICAgICAgICBSZWZlcmVuY2VlLT5pc1ZhcmlhYmx5TW9kaWZpZWRUeXBlKCksCisgICAgICAgICAgICAgUmVmZXJlbmNlZS0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSwKKyAgICAgICAgUG9pbnRlZVR5cGUoUmVmZXJlbmNlZSkgeworICAgIFJlZmVyZW5jZVR5cGVCaXRzLlNwZWxsZWRBc0xWYWx1ZSA9IFNwZWxsZWRBc0xWYWx1ZTsKKyAgICBSZWZlcmVuY2VUeXBlQml0cy5Jbm5lclJlZiA9IFJlZmVyZW5jZWUtPmlzUmVmZXJlbmNlVHlwZSgpOworICB9CisKK3B1YmxpYzoKKyAgYm9vbCBpc1NwZWxsZWRBc0xWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFJlZmVyZW5jZVR5cGVCaXRzLlNwZWxsZWRBc0xWYWx1ZTsgfQorICBib29sIGlzSW5uZXJSZWYoKSBjb25zdCB7IHJldHVybiBSZWZlcmVuY2VUeXBlQml0cy5Jbm5lclJlZjsgfQorCisgIFF1YWxUeXBlIGdldFBvaW50ZWVUeXBlQXNXcml0dGVuKCkgY29uc3QgeyByZXR1cm4gUG9pbnRlZVR5cGU7IH0KKworICBRdWFsVHlwZSBnZXRQb2ludGVlVHlwZSgpIGNvbnN0IHsKKyAgICAvLyBGSVhNRTogdGhpcyBtaWdodCBzdHJpcCBpbm5lciBxdWFsaWZpZXJzOyBva2F5PworICAgIGNvbnN0IFJlZmVyZW5jZVR5cGUgKlQgPSB0aGlzOworICAgIHdoaWxlIChULT5pc0lubmVyUmVmKCkpCisgICAgICBUID0gVC0+UG9pbnRlZVR5cGUtPmNhc3RBczxSZWZlcmVuY2VUeXBlPigpOworICAgIHJldHVybiBULT5Qb2ludGVlVHlwZTsKKyAgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIFByb2ZpbGUoSUQsIFBvaW50ZWVUeXBlLCBpc1NwZWxsZWRBc0xWYWx1ZSgpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsCisgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgUmVmZXJlbmNlZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIFNwZWxsZWRBc0xWYWx1ZSkgeworICAgIElELkFkZFBvaW50ZXIoUmVmZXJlbmNlZS5nZXRBc09wYXF1ZVB0cigpKTsKKyAgICBJRC5BZGRCb29sZWFuKFNwZWxsZWRBc0xWYWx1ZSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gTFZhbHVlUmVmZXJlbmNlIHx8CisgICAgICAgICAgIFQtPmdldFR5cGVDbGFzcygpID09IFJWYWx1ZVJlZmVyZW5jZTsKKyAgfQorfTsKKworLy8vIEFuIGx2YWx1ZSByZWZlcmVuY2UgdHlwZSwgcGVyIEMrKzExIFtkY2wucmVmXS4KK2NsYXNzIExWYWx1ZVJlZmVyZW5jZVR5cGUgOiBwdWJsaWMgUmVmZXJlbmNlVHlwZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RDb250ZXh0OyAvLyBBU1RDb250ZXh0IGNyZWF0ZXMgdGhlc2UKKworICBMVmFsdWVSZWZlcmVuY2VUeXBlKFF1YWxUeXBlIFJlZmVyZW5jZWUsIFF1YWxUeXBlIENhbm9uaWNhbFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIFNwZWxsZWRBc0xWYWx1ZSkKKyAgICAgIDogUmVmZXJlbmNlVHlwZShMVmFsdWVSZWZlcmVuY2UsIFJlZmVyZW5jZWUsIENhbm9uaWNhbFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICBTcGVsbGVkQXNMVmFsdWUpIHt9CisKK3B1YmxpYzoKKyAgYm9vbCBpc1N1Z2FyZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICBRdWFsVHlwZSBkZXN1Z2FyKCkgY29uc3QgeyByZXR1cm4gUXVhbFR5cGUodGhpcywgMCk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gTFZhbHVlUmVmZXJlbmNlOworICB9Cit9OworCisvLy8gQW4gcnZhbHVlIHJlZmVyZW5jZSB0eXBlLCBwZXIgQysrMTEgW2RjbC5yZWZdLgorY2xhc3MgUlZhbHVlUmVmZXJlbmNlVHlwZSA6IHB1YmxpYyBSZWZlcmVuY2VUeXBlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7IC8vIEFTVENvbnRleHQgY3JlYXRlcyB0aGVzZQorCisgIFJWYWx1ZVJlZmVyZW5jZVR5cGUoUXVhbFR5cGUgUmVmZXJlbmNlZSwgUXVhbFR5cGUgQ2Fub25pY2FsUmVmKQorICAgICAgIDogUmVmZXJlbmNlVHlwZShSVmFsdWVSZWZlcmVuY2UsIFJlZmVyZW5jZWUsIENhbm9uaWNhbFJlZiwgZmFsc2UpIHt9CisKK3B1YmxpYzoKKyAgYm9vbCBpc1N1Z2FyZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICBRdWFsVHlwZSBkZXN1Z2FyKCkgY29uc3QgeyByZXR1cm4gUXVhbFR5cGUodGhpcywgMCk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gUlZhbHVlUmVmZXJlbmNlOworICB9Cit9OworCisvLy8gQSBwb2ludGVyIHRvIG1lbWJlciB0eXBlIHBlciBDKysgOC4zLjMgLSBQb2ludGVycyB0byBtZW1iZXJzLgorLy8vCisvLy8gVGhpcyBpbmNsdWRlcyBib3RoIHBvaW50ZXJzIHRvIGRhdGEgbWVtYmVycyBhbmQgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb25zLgorY2xhc3MgTWVtYmVyUG9pbnRlclR5cGUgOiBwdWJsaWMgVHlwZSwgcHVibGljIGxsdm06OkZvbGRpbmdTZXROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7IC8vIEFTVENvbnRleHQgY3JlYXRlcyB0aGVzZS4KKworICBRdWFsVHlwZSBQb2ludGVlVHlwZTsKKworICAvLy8gVGhlIGNsYXNzIG9mIHdoaWNoIHRoZSBwb2ludGVlIGlzIGEgbWVtYmVyLiBNdXN0IHVsdGltYXRlbHkgYmUgYQorICAvLy8gUmVjb3JkVHlwZSwgYnV0IGNvdWxkIGJlIGEgdHlwZWRlZiBvciBhIHRlbXBsYXRlIHBhcmFtZXRlciB0b28uCisgIGNvbnN0IFR5cGUgKkNsYXNzOworCisgIE1lbWJlclBvaW50ZXJUeXBlKFF1YWxUeXBlIFBvaW50ZWUsIGNvbnN0IFR5cGUgKkNscywgUXVhbFR5cGUgQ2Fub25pY2FsUHRyKQorICAgICAgOiBUeXBlKE1lbWJlclBvaW50ZXIsIENhbm9uaWNhbFB0ciwKKyAgICAgICAgICAgICBDbHMtPmlzRGVwZW5kZW50VHlwZSgpIHx8IFBvaW50ZWUtPmlzRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgIChDbHMtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudFR5cGUoKSB8fAorICAgICAgICAgICAgICBQb2ludGVlLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnRUeXBlKCkpLAorICAgICAgICAgICAgIFBvaW50ZWUtPmlzVmFyaWFibHlNb2RpZmllZFR5cGUoKSwKKyAgICAgICAgICAgICAoQ2xzLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkgfHwKKyAgICAgICAgICAgICAgUG9pbnRlZS0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSksCisgICAgICAgICAgICAgUG9pbnRlZVR5cGUoUG9pbnRlZSksIENsYXNzKENscykge30KKworcHVibGljOgorICBRdWFsVHlwZSBnZXRQb2ludGVlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFBvaW50ZWVUeXBlOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWVtYmVyIHR5cGUgKGkuZS4gdGhlIHBvaW50ZWUgdHlwZSkgaXMgYQorICAvLy8gZnVuY3Rpb24gdHlwZSByYXRoZXIgdGhhbiBhIGRhdGEtbWVtYmVyIHR5cGUuCisgIGJvb2wgaXNNZW1iZXJGdW5jdGlvblBvaW50ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFBvaW50ZWVUeXBlLT5pc0Z1bmN0aW9uUHJvdG9UeXBlKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtZW1iZXIgdHlwZSAoaS5lLiB0aGUgcG9pbnRlZSB0eXBlKSBpcyBhCisgIC8vLyBkYXRhIHR5cGUgcmF0aGVyIHRoYW4gYSBmdW5jdGlvbiB0eXBlLgorICBib29sIGlzTWVtYmVyRGF0YVBvaW50ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuICFQb2ludGVlVHlwZS0+aXNGdW5jdGlvblByb3RvVHlwZSgpOworICB9CisKKyAgY29uc3QgVHlwZSAqZ2V0Q2xhc3MoKSBjb25zdCB7IHJldHVybiBDbGFzczsgfQorICBDWFhSZWNvcmREZWNsICpnZXRNb3N0UmVjZW50Q1hYUmVjb3JkRGVjbCgpIGNvbnN0OworCisgIGJvb2wgaXNTdWdhcmVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0IHsgcmV0dXJuIFF1YWxUeXBlKHRoaXMsIDApOyB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgUHJvZmlsZShJRCwgZ2V0UG9pbnRlZVR5cGUoKSwgZ2V0Q2xhc3MoKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELCBRdWFsVHlwZSBQb2ludGVlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgKkNsYXNzKSB7CisgICAgSUQuQWRkUG9pbnRlcihQb2ludGVlLmdldEFzT3BhcXVlUHRyKCkpOworICAgIElELkFkZFBvaW50ZXIoQ2xhc3MpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFR5cGVDbGFzcygpID09IE1lbWJlclBvaW50ZXI7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGFuIGFycmF5IHR5cGUsIHBlciBDOTkgNi43LjUuMiAtIEFycmF5IERlY2xhcmF0b3JzLgorY2xhc3MgQXJyYXlUeXBlIDogcHVibGljIFR5cGUsIHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CitwdWJsaWM6CisgIC8vLyBDYXB0dXJlIHdoZXRoZXIgdGhpcyBpcyBhIG5vcm1hbCBhcnJheSAoZS5nLiBpbnQgWFs0XSkKKyAgLy8vIGFuIGFycmF5IHdpdGggYSBzdGF0aWMgc2l6ZSAoZS5nLiBpbnQgWFtzdGF0aWMgNF0pLCBvciBhbiBhcnJheQorICAvLy8gd2l0aCBhIHN0YXIgc2l6ZSAoZS5nLiBpbnQgWFsqXSkuCisgIC8vLyAnc3RhdGljJyBpcyBvbmx5IGFsbG93ZWQgb24gZnVuY3Rpb24gcGFyYW1ldGVycy4KKyAgZW51bSBBcnJheVNpemVNb2RpZmllciB7CisgICAgTm9ybWFsLCBTdGF0aWMsIFN0YXIKKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIFRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGFycmF5LgorICBRdWFsVHlwZSBFbGVtZW50VHlwZTsKKworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsgLy8gQVNUQ29udGV4dCBjcmVhdGVzIHRoZXNlLgorCisgIC8vIEMrKyBbdGVtcC5kZXAudHlwZV1wMToKKyAgLy8gICBBIHR5cGUgaXMgZGVwZW5kZW50IGlmIGl0IGlzLi4uCisgIC8vICAgICAtIGFuIGFycmF5IHR5cGUgY29uc3RydWN0ZWQgZnJvbSBhbnkgZGVwZW5kZW50IHR5cGUgb3Igd2hvc2UKKyAgLy8gICAgICAgc2l6ZSBpcyBzcGVjaWZpZWQgYnkgYSBjb25zdGFudCBleHByZXNzaW9uIHRoYXQgaXMKKyAgLy8gICAgICAgdmFsdWUtZGVwZW5kZW50LAorICBBcnJheVR5cGUoVHlwZUNsYXNzIHRjLCBRdWFsVHlwZSBldCwgUXVhbFR5cGUgY2FuLAorICAgICAgICAgICAgQXJyYXlTaXplTW9kaWZpZXIgc20sIHVuc2lnbmVkIHRxLAorICAgICAgICAgICAgYm9vbCBDb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKQorICAgICAgOiBUeXBlKHRjLCBjYW4sIGV0LT5pc0RlcGVuZGVudFR5cGUoKSB8fCB0YyA9PSBEZXBlbmRlbnRTaXplZEFycmF5LAorICAgICAgICAgICAgIGV0LT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnRUeXBlKCkgfHwgdGMgPT0gRGVwZW5kZW50U2l6ZWRBcnJheSwKKyAgICAgICAgICAgICAodGMgPT0gVmFyaWFibGVBcnJheSB8fCBldC0+aXNWYXJpYWJseU1vZGlmaWVkVHlwZSgpKSwKKyAgICAgICAgICAgICBDb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKSwKKyAgICAgICAgRWxlbWVudFR5cGUoZXQpIHsKKyAgICBBcnJheVR5cGVCaXRzLkluZGV4VHlwZVF1YWxzID0gdHE7CisgICAgQXJyYXlUeXBlQml0cy5TaXplTW9kaWZpZXIgPSBzbTsKKyAgfQorCitwdWJsaWM6CisgIFF1YWxUeXBlIGdldEVsZW1lbnRUeXBlKCkgY29uc3QgeyByZXR1cm4gRWxlbWVudFR5cGU7IH0KKworICBBcnJheVNpemVNb2RpZmllciBnZXRTaXplTW9kaWZpZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIEFycmF5U2l6ZU1vZGlmaWVyKEFycmF5VHlwZUJpdHMuU2l6ZU1vZGlmaWVyKTsKKyAgfQorCisgIFF1YWxpZmllcnMgZ2V0SW5kZXhUeXBlUXVhbGlmaWVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gUXVhbGlmaWVyczo6ZnJvbUNWUk1hc2soZ2V0SW5kZXhUeXBlQ1ZSUXVhbGlmaWVycygpKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldEluZGV4VHlwZUNWUlF1YWxpZmllcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIEFycmF5VHlwZUJpdHMuSW5kZXhUeXBlUXVhbHM7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gQ29uc3RhbnRBcnJheSB8fAorICAgICAgICAgICBULT5nZXRUeXBlQ2xhc3MoKSA9PSBWYXJpYWJsZUFycmF5IHx8CisgICAgICAgICAgIFQtPmdldFR5cGVDbGFzcygpID09IEluY29tcGxldGVBcnJheSB8fAorICAgICAgICAgICBULT5nZXRUeXBlQ2xhc3MoKSA9PSBEZXBlbmRlbnRTaXplZEFycmF5OworICB9Cit9OworCisvLy8gUmVwcmVzZW50cyB0aGUgY2Fub25pY2FsIHZlcnNpb24gb2YgQyBhcnJheXMgd2l0aCBhIHNwZWNpZmllZCBjb25zdGFudCBzaXplLgorLy8vIEZvciBleGFtcGxlLCB0aGUgY2Fub25pY2FsIHR5cGUgZm9yICdpbnQgQVs0ICsgNCoxMDBdJyBpcyBhCisvLy8gQ29uc3RhbnRBcnJheVR5cGUgd2hlcmUgdGhlIGVsZW1lbnQgdHlwZSBpcyAnaW50JyBhbmQgdGhlIHNpemUgaXMgNDA0LgorY2xhc3MgQ29uc3RhbnRBcnJheVR5cGUgOiBwdWJsaWMgQXJyYXlUeXBlIHsKKyAgbGx2bTo6QVBJbnQgU2l6ZTsgLy8gQWxsb3dzIHVzIHRvIHVuaXF1ZSB0aGUgdHlwZS4KKworICBDb25zdGFudEFycmF5VHlwZShRdWFsVHlwZSBldCwgUXVhbFR5cGUgY2FuLCBjb25zdCBsbHZtOjpBUEludCAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlTaXplTW9kaWZpZXIgc20sIHVuc2lnbmVkIHRxKQorICAgICAgOiBBcnJheVR5cGUoQ29uc3RhbnRBcnJheSwgZXQsIGNhbiwgc20sIHRxLAorICAgICAgICAgICAgICAgICAgZXQtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIFNpemUoc2l6ZSkge30KKworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsgLy8gQVNUQ29udGV4dCBjcmVhdGVzIHRoZXNlLgorCisgIENvbnN0YW50QXJyYXlUeXBlKFR5cGVDbGFzcyB0YywgUXVhbFR5cGUgZXQsIFF1YWxUeXBlIGNhbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBJbnQgJnNpemUsIEFycmF5U2l6ZU1vZGlmaWVyIHNtLCB1bnNpZ25lZCB0cSkKKyAgICAgIDogQXJyYXlUeXBlKHRjLCBldCwgY2FuLCBzbSwgdHEsIGV0LT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgICBTaXplKHNpemUpIHt9CisKK3B1YmxpYzoKKyAgY29uc3QgbGx2bTo6QVBJbnQgJmdldFNpemUoKSBjb25zdCB7IHJldHVybiBTaXplOyB9CisgIGJvb2wgaXNTdWdhcmVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0IHsgcmV0dXJuIFF1YWxUeXBlKHRoaXMsIDApOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIGFkZHJlc3MgYSBtZW1iZXIgb2YKKyAgLy8gYW4gYXJyYXkgd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudCB0eXBlIGFuZCBudW1iZXIgb2YgZWxlbWVudHMuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXROdW1BZGRyZXNzaW5nQml0cyhjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgRWxlbWVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpBUEludCAmTnVtRWxlbWVudHMpOworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgYml0cyB0aGF0IGFuIGFycmF5J3Mgc2l6ZQorICAvLy8gY2FuIHJlcXVpcmUsIHdoaWNoIGxpbWl0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBhcnJheS4KKyAgc3RhdGljIHVuc2lnbmVkIGdldE1heFNpemVCaXRzKGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQpOworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIFByb2ZpbGUoSUQsIGdldEVsZW1lbnRUeXBlKCksIGdldFNpemUoKSwKKyAgICAgICAgICAgIGdldFNpemVNb2RpZmllcigpLCBnZXRJbmRleFR5cGVDVlJRdWFsaWZpZXJzKCkpOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgUXVhbFR5cGUgRVQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBJbnQgJkFycmF5U2l6ZSwgQXJyYXlTaXplTW9kaWZpZXIgU2l6ZU1vZCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUeXBlUXVhbHMpIHsKKyAgICBJRC5BZGRQb2ludGVyKEVULmdldEFzT3BhcXVlUHRyKCkpOworICAgIElELkFkZEludGVnZXIoQXJyYXlTaXplLmdldFpFeHRWYWx1ZSgpKTsKKyAgICBJRC5BZGRJbnRlZ2VyKFNpemVNb2QpOworICAgIElELkFkZEludGVnZXIoVHlwZVF1YWxzKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlQ2xhc3MoKSA9PSBDb25zdGFudEFycmF5OworICB9Cit9OworCisvLy8gUmVwcmVzZW50cyBhIEMgYXJyYXkgd2l0aCBhbiB1bnNwZWNpZmllZCBzaXplLiAgRm9yIGV4YW1wbGUgJ2ludCBBW10nIGhhcworLy8vIGFuIEluY29tcGxldGVBcnJheVR5cGUgd2hlcmUgdGhlIGVsZW1lbnQgdHlwZSBpcyAnaW50JyBhbmQgdGhlIHNpemUgaXMKKy8vLyB1bnNwZWNpZmllZC4KK2NsYXNzIEluY29tcGxldGVBcnJheVR5cGUgOiBwdWJsaWMgQXJyYXlUeXBlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7IC8vIEFTVENvbnRleHQgY3JlYXRlcyB0aGVzZS4KKworICBJbmNvbXBsZXRlQXJyYXlUeXBlKFF1YWxUeXBlIGV0LCBRdWFsVHlwZSBjYW4sCisgICAgICAgICAgICAgICAgICAgICAgQXJyYXlTaXplTW9kaWZpZXIgc20sIHVuc2lnbmVkIHRxKQorICAgICAgOiBBcnJheVR5cGUoSW5jb21wbGV0ZUFycmF5LCBldCwgY2FuLCBzbSwgdHEsCisgICAgICAgICAgICAgICAgICBldC0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSB7fQorCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBTdG10SXRlcmF0b3JCYXNlOworCisgIGJvb2wgaXNTdWdhcmVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0IHsgcmV0dXJuIFF1YWxUeXBlKHRoaXMsIDApOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFR5cGVDbGFzcygpID09IEluY29tcGxldGVBcnJheTsKKyAgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIFByb2ZpbGUoSUQsIGdldEVsZW1lbnRUeXBlKCksIGdldFNpemVNb2RpZmllcigpLAorICAgICAgICAgICAgZ2V0SW5kZXhUeXBlQ1ZSUXVhbGlmaWVycygpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIFF1YWxUeXBlIEVULAorICAgICAgICAgICAgICAgICAgICAgIEFycmF5U2l6ZU1vZGlmaWVyIFNpemVNb2QsIHVuc2lnbmVkIFR5cGVRdWFscykgeworICAgIElELkFkZFBvaW50ZXIoRVQuZ2V0QXNPcGFxdWVQdHIoKSk7CisgICAgSUQuQWRkSW50ZWdlcihTaXplTW9kKTsKKyAgICBJRC5BZGRJbnRlZ2VyKFR5cGVRdWFscyk7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgQyBhcnJheSB3aXRoIGEgc3BlY2lmaWVkIHNpemUgdGhhdCBpcyBub3QgYW4KKy8vLyBpbnRlZ2VyLWNvbnN0YW50LWV4cHJlc3Npb24uICBGb3IgZXhhbXBsZSwgJ2ludCBzW3grZm9vKCldJy4KKy8vLyBTaW5jZSB0aGUgc2l6ZSBleHByZXNzaW9uIGlzIGFuIGFyYml0cmFyeSBleHByZXNzaW9uLCB3ZSBzdG9yZSBpdCBhcyBzdWNoLgorLy8vCisvLy8gTm90ZTogVmFyaWFibGVBcnJheVR5cGUncyBhcmVuJ3QgdW5pcXVlZCAoc2luY2UgdGhlIGV4cHJlc3Npb25zIGFyZW4ndCkgYW5kCisvLy8gc2hvdWxkIG5vdCBiZTogdHdvIGxleGljYWxseSBlcXVpdmFsZW50IHZhcmlhYmxlIGFycmF5IHR5cGVzIGNvdWxkIG1lYW4KKy8vLyBkaWZmZXJlbnQgdGhpbmdzLCBmb3IgZXhhbXBsZSwgdGhlc2UgdmFyaWFibGVzIGRvIG5vdCBoYXZlIHRoZSBzYW1lIHR5cGUKKy8vLyBkeW5hbWljYWxseToKKy8vLworLy8vIHZvaWQgZm9vKGludCB4KSB7CisvLy8gICBpbnQgWVt4XTsKKy8vLyAgICsreDsKKy8vLyAgIGludCBaW3hdOworLy8vIH0KK2NsYXNzIFZhcmlhYmxlQXJyYXlUeXBlIDogcHVibGljIEFycmF5VHlwZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RDb250ZXh0OyAvLyBBU1RDb250ZXh0IGNyZWF0ZXMgdGhlc2UuCisKKyAgLy8vIEFuIGFzc2lnbm1lbnQtZXhwcmVzc2lvbi4gVkxBJ3MgYXJlIG9ubHkgcGVybWl0dGVkIHdpdGhpbgorICAvLy8gYSBmdW5jdGlvbiBibG9jay4KKyAgU3RtdCAqU2l6ZUV4cHI7CisKKyAgLy8vIFRoZSByYW5nZSBzcGFubmVkIGJ5IHRoZSBsZWZ0IGFuZCByaWdodCBhcnJheSBicmFja2V0cy4KKyAgU291cmNlUmFuZ2UgQnJhY2tldHM7CisKKyAgVmFyaWFibGVBcnJheVR5cGUoUXVhbFR5cGUgZXQsIFF1YWxUeXBlIGNhbiwgRXhwciAqZSwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlTaXplTW9kaWZpZXIgc20sIHVuc2lnbmVkIHRxLAorICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBicmFja2V0cykKKyAgICAgIDogQXJyYXlUeXBlKFZhcmlhYmxlQXJyYXksIGV0LCBjYW4sIHNtLCB0cSwKKyAgICAgICAgICAgICAgICAgIGV0LT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgICBTaXplRXhwcigoU3RtdCopIGUpLCBCcmFja2V0cyhicmFja2V0cykge30KKworcHVibGljOgorICBmcmllbmQgY2xhc3MgU3RtdEl0ZXJhdG9yQmFzZTsKKworICBFeHByICpnZXRTaXplRXhwcigpIGNvbnN0IHsKKyAgICAvLyBXZSB1c2UgQy1zdHlsZSBjYXN0cyBpbnN0ZWFkIG9mIGNhc3Q8PiBoZXJlIGJlY2F1c2Ugd2UgZG8gbm90IHdpc2gKKyAgICAvLyB0byBoYXZlIGEgZGVwZW5kZW5jeSBvZiBUeXBlLmggb24gU3RtdC5oL0V4cHIuaC4KKyAgICByZXR1cm4gKEV4cHIqKSBTaXplRXhwcjsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldEJyYWNrZXRzUmFuZ2UoKSBjb25zdCB7IHJldHVybiBCcmFja2V0czsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMQnJhY2tldExvYygpIGNvbnN0IHsgcmV0dXJuIEJyYWNrZXRzLmdldEJlZ2luKCk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0UkJyYWNrZXRMb2MoKSBjb25zdCB7IHJldHVybiBCcmFja2V0cy5nZXRFbmQoKTsgfQorCisgIGJvb2wgaXNTdWdhcmVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0IHsgcmV0dXJuIFF1YWxUeXBlKHRoaXMsIDApOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFR5cGVDbGFzcygpID09IFZhcmlhYmxlQXJyYXk7CisgIH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJDYW5ub3QgdW5pcXVlIFZhcmlhYmxlQXJyYXlUeXBlcy4iKTsKKyAgfQorfTsKKworLy8vIFJlcHJlc2VudHMgYW4gYXJyYXkgdHlwZSBpbiBDKysgd2hvc2Ugc2l6ZSBpcyBhIHZhbHVlLWRlcGVuZGVudCBleHByZXNzaW9uLgorLy8vCisvLy8gRm9yIGV4YW1wbGU6CisvLy8gXGNvZGUKKy8vLyB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgU2l6ZT4KKy8vLyBjbGFzcyBhcnJheSB7CisvLy8gICBUIGRhdGFbU2l6ZV07CisvLy8gfTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gRm9yIHRoZXNlIHR5cGVzLCB3ZSB3b24ndCBhY3R1YWxseSBrbm93IHdoYXQgdGhlIGFycmF5IGJvdW5kIGlzCisvLy8gdW50aWwgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBvY2N1cnMsIGF0IHdoaWNoIHBvaW50IHRoaXMgd2lsbAorLy8vIGJlY29tZSBlaXRoZXIgYSBDb25zdGFudEFycmF5VHlwZSBvciBhIFZhcmlhYmxlQXJyYXlUeXBlLgorY2xhc3MgRGVwZW5kZW50U2l6ZWRBcnJheVR5cGUgOiBwdWJsaWMgQXJyYXlUeXBlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7IC8vIEFTVENvbnRleHQgY3JlYXRlcyB0aGVzZS4KKworICBjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0OworCisgIC8vLyBcYnJpZWYgQW4gYXNzaWdubWVudCBleHByZXNzaW9uIHRoYXQgd2lsbCBpbnN0YW50aWF0ZSB0byB0aGUKKyAgLy8vIHNpemUgb2YgdGhlIGFycmF5LgorICAvLy8KKyAgLy8vIFRoZSBleHByZXNzaW9uIGl0c2VsZiBtaWdodCBiZSBudWxsLCBpbiB3aGljaCBjYXNlIHRoZSBhcnJheQorICAvLy8gdHlwZSB3aWxsIGhhdmUgaXRzIHNpemUgZGVkdWNlZCBmcm9tIGFuIGluaXRpYWxpemVyLgorICBTdG10ICpTaXplRXhwcjsKKworICAvLy8gVGhlIHJhbmdlIHNwYW5uZWQgYnkgdGhlIGxlZnQgYW5kIHJpZ2h0IGFycmF5IGJyYWNrZXRzLgorICBTb3VyY2VSYW5nZSBCcmFja2V0czsKKworICBEZXBlbmRlbnRTaXplZEFycmF5VHlwZShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LCBRdWFsVHlwZSBldCwgUXVhbFR5cGUgY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICplLCBBcnJheVNpemVNb2RpZmllciBzbSwgdW5zaWduZWQgdHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIGJyYWNrZXRzKTsKKworcHVibGljOgorICBmcmllbmQgY2xhc3MgU3RtdEl0ZXJhdG9yQmFzZTsKKworICBFeHByICpnZXRTaXplRXhwcigpIGNvbnN0IHsKKyAgICAvLyBXZSB1c2UgQy1zdHlsZSBjYXN0cyBpbnN0ZWFkIG9mIGNhc3Q8PiBoZXJlIGJlY2F1c2Ugd2UgZG8gbm90IHdpc2gKKyAgICAvLyB0byBoYXZlIGEgZGVwZW5kZW5jeSBvZiBUeXBlLmggb24gU3RtdC5oL0V4cHIuaC4KKyAgICByZXR1cm4gKEV4cHIqKSBTaXplRXhwcjsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldEJyYWNrZXRzUmFuZ2UoKSBjb25zdCB7IHJldHVybiBCcmFja2V0czsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMQnJhY2tldExvYygpIGNvbnN0IHsgcmV0dXJuIEJyYWNrZXRzLmdldEJlZ2luKCk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0UkJyYWNrZXRMb2MoKSBjb25zdCB7IHJldHVybiBCcmFja2V0cy5nZXRFbmQoKTsgfQorCisgIGJvb2wgaXNTdWdhcmVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0IHsgcmV0dXJuIFF1YWxUeXBlKHRoaXMsIDApOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFR5cGVDbGFzcygpID09IERlcGVuZGVudFNpemVkQXJyYXk7CisgIH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIHsKKyAgICBQcm9maWxlKElELCBDb250ZXh0LCBnZXRFbGVtZW50VHlwZSgpLAorICAgICAgICAgICAgZ2V0U2l6ZU1vZGlmaWVyKCksIGdldEluZGV4VHlwZUNWUlF1YWxpZmllcnMoKSwgZ2V0U2l6ZUV4cHIoKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELCBjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIEVULCBBcnJheVNpemVNb2RpZmllciBTaXplTW9kLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFR5cGVRdWFscywgRXhwciAqRSk7Cit9OworCisvLy8gUmVwcmVzZW50cyBhbiBleHRlbmRlZCBhZGRyZXNzIHNwYWNlIHF1YWxpZmllciB3aGVyZSB0aGUgaW5wdXQgYWRkcmVzcyBzcGFjZQorLy8vIHZhbHVlIGlzIGRlcGVuZGVudC4gTm9uLWRlcGVuZGVudCBhZGRyZXNzIHNwYWNlcyBhcmUgbm90IHJlcHJlc2VudGVkIHdpdGggYSAKKy8vLyBzcGVjaWFsIFR5cGUgc3ViY2xhc3M7IHRoZXkgYXJlIHN0b3JlZCBvbiBhbiBFeHRRdWFscyBub2RlIGFzIHBhcnQgb2YgYSBRdWFsVHlwZS4KKy8vLworLy8vIEZvciBleGFtcGxlOgorLy8vIFxjb2RlCisvLy8gdGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IEFkZHJTcGFjZT4KKy8vLyBjbGFzcyBBZGRyZXNzU3BhY2UgeworLy8vICAgdHlwZWRlZiBUIF9fYXR0cmlidXRlX18oKGFkZHJlc3Nfc3BhY2UoQWRkclNwYWNlKSkpIHR5cGU7CisvLy8gfQorLy8vIFxlbmRjb2RlCitjbGFzcyBEZXBlbmRlbnRBZGRyZXNzU3BhY2VUeXBlIDogcHVibGljIFR5cGUsIHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RDb250ZXh0OworCisgIGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQ7CisgIEV4cHIgKkFkZHJTcGFjZUV4cHI7CisgIFF1YWxUeXBlIFBvaW50ZWVUeXBlOworICBTb3VyY2VMb2NhdGlvbiBsb2M7CisKKyAgRGVwZW5kZW50QWRkcmVzc1NwYWNlVHlwZShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LCBRdWFsVHlwZSBQb2ludGVlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBjYW4sIEV4cHIgKkFkZHJTcGFjZUV4cHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIGxvYyk7CisKK3B1YmxpYzoKKyAgRXhwciAqZ2V0QWRkclNwYWNlRXhwcigpIGNvbnN0IHsgcmV0dXJuIEFkZHJTcGFjZUV4cHI7IH0KKyAgUXVhbFR5cGUgZ2V0UG9pbnRlZVR5cGUoKSBjb25zdCB7IHJldHVybiBQb2ludGVlVHlwZTsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRBdHRyaWJ1dGVMb2MoKSBjb25zdCB7IHJldHVybiBsb2M7IH0KKworICBib29sIGlzU3VnYXJlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIFF1YWxUeXBlIGRlc3VnYXIoKSBjb25zdCB7IHJldHVybiBRdWFsVHlwZSh0aGlzLCAwKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlQ2xhc3MoKSA9PSBEZXBlbmRlbnRBZGRyZXNzU3BhY2U7CisgIH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIHsKKyAgICBQcm9maWxlKElELCBDb250ZXh0LCBnZXRQb2ludGVlVHlwZSgpLCBnZXRBZGRyU3BhY2VFeHByKCkpOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBQb2ludGVlVHlwZSwgRXhwciAqQWRkclNwYWNlRXhwcik7Cit9OworCisvLy8gUmVwcmVzZW50cyBhbiBleHRlbmRlZCB2ZWN0b3IgdHlwZSB3aGVyZSBlaXRoZXIgdGhlIHR5cGUgb3Igc2l6ZSBpcworLy8vIGRlcGVuZGVudC4KKy8vLworLy8vIEZvciBleGFtcGxlOgorLy8vIFxjb2RlCisvLy8gdGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IFNpemU+CisvLy8gY2xhc3MgdmVjdG9yIHsKKy8vLyAgIHR5cGVkZWYgVCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoU2l6ZSkpKSB0eXBlOworLy8vIH0KKy8vLyBcZW5kY29kZQorY2xhc3MgRGVwZW5kZW50U2l6ZWRFeHRWZWN0b3JUeXBlIDogcHVibGljIFR5cGUsIHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RDb250ZXh0OworCisgIGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQ7CisgIEV4cHIgKlNpemVFeHByOworCisgIC8vLyBUaGUgZWxlbWVudCB0eXBlIG9mIHRoZSBhcnJheS4KKyAgUXVhbFR5cGUgRWxlbWVudFR5cGU7CisKKyAgU291cmNlTG9jYXRpb24gbG9jOworCisgIERlcGVuZGVudFNpemVkRXh0VmVjdG9yVHlwZShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LCBRdWFsVHlwZSBFbGVtZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIGNhbiwgRXhwciAqU2l6ZUV4cHIsIFNvdXJjZUxvY2F0aW9uIGxvYyk7CisKK3B1YmxpYzoKKyAgRXhwciAqZ2V0U2l6ZUV4cHIoKSBjb25zdCB7IHJldHVybiBTaXplRXhwcjsgfQorICBRdWFsVHlwZSBnZXRFbGVtZW50VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEVsZW1lbnRUeXBlOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldEF0dHJpYnV0ZUxvYygpIGNvbnN0IHsgcmV0dXJuIGxvYzsgfQorCisgIGJvb2wgaXNTdWdhcmVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0IHsgcmV0dXJuIFF1YWxUeXBlKHRoaXMsIDApOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFR5cGVDbGFzcygpID09IERlcGVuZGVudFNpemVkRXh0VmVjdG9yOworICB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgUHJvZmlsZShJRCwgQ29udGV4dCwgZ2V0RWxlbWVudFR5cGUoKSwgZ2V0U2l6ZUV4cHIoKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELCBjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIEVsZW1lbnRUeXBlLCBFeHByICpTaXplRXhwcik7Cit9OworCisKKy8vLyBSZXByZXNlbnRzIGEgR0NDIGdlbmVyaWMgdmVjdG9yIHR5cGUuIFRoaXMgdHlwZSBpcyBjcmVhdGVkIHVzaW5nCisvLy8gX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUobikpLCB3aGVyZSAibiIgc3BlY2lmaWVzIHRoZSB2ZWN0b3Igc2l6ZSBpbgorLy8vIGJ5dGVzOyBvciBmcm9tIGFuIEFsdGl2ZWMgX192ZWN0b3Igb3IgdmVjdG9yIGRlY2xhcmF0aW9uLgorLy8vIFNpbmNlIHRoZSBjb25zdHJ1Y3RvciB0YWtlcyB0aGUgbnVtYmVyIG9mIHZlY3RvciBlbGVtZW50cywgdGhlCisvLy8gY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIHRoZSBzaXplIGludG8gdGhlIG51bWJlciBvZiBlbGVtZW50cy4KK2NsYXNzIFZlY3RvclR5cGUgOiBwdWJsaWMgVHlwZSwgcHVibGljIGxsdm06OkZvbGRpbmdTZXROb2RlIHsKK3B1YmxpYzoKKyAgZW51bSBWZWN0b3JLaW5kIHsKKyAgICAvLy8gbm90IGEgdGFyZ2V0LXNwZWNpZmljIHZlY3RvciB0eXBlCisgICAgR2VuZXJpY1ZlY3RvciwKKworICAgIC8vLyBpcyBBbHRpVmVjIHZlY3RvcgorICAgIEFsdGlWZWNWZWN0b3IsCisKKyAgICAvLy8gaXMgQWx0aVZlYyAndmVjdG9yIFBpeGVsJworICAgIEFsdGlWZWNQaXhlbCwKKworICAgIC8vLyBpcyBBbHRpVmVjICd2ZWN0b3IgYm9vbCAuLi4nCisgICAgQWx0aVZlY0Jvb2wsCisKKyAgICAvLy8gaXMgQVJNIE5lb24gdmVjdG9yCisgICAgTmVvblZlY3RvciwKKworICAgIC8vLyBpcyBBUk0gTmVvbiBwb2x5bm9taWFsIHZlY3RvcgorICAgIE5lb25Qb2x5VmVjdG9yCisgIH07CisKK3Byb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7IC8vIEFTVENvbnRleHQgY3JlYXRlcyB0aGVzZS4KKworICAvLy8gVGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgdmVjdG9yLgorICBRdWFsVHlwZSBFbGVtZW50VHlwZTsKKworICBWZWN0b3JUeXBlKFF1YWxUeXBlIHZlY1R5cGUsIHVuc2lnbmVkIG5FbGVtZW50cywgUXVhbFR5cGUgY2Fub25UeXBlLAorICAgICAgICAgICAgIFZlY3RvcktpbmQgdmVjS2luZCk7CisKKyAgVmVjdG9yVHlwZShUeXBlQ2xhc3MgdGMsIFF1YWxUeXBlIHZlY1R5cGUsIHVuc2lnbmVkIG5FbGVtZW50cywKKyAgICAgICAgICAgICBRdWFsVHlwZSBjYW5vblR5cGUsIFZlY3RvcktpbmQgdmVjS2luZCk7CisKK3B1YmxpYzoKKyAgUXVhbFR5cGUgZ2V0RWxlbWVudFR5cGUoKSBjb25zdCB7IHJldHVybiBFbGVtZW50VHlwZTsgfQorICB1bnNpZ25lZCBnZXROdW1FbGVtZW50cygpIGNvbnN0IHsgcmV0dXJuIFZlY3RvclR5cGVCaXRzLk51bUVsZW1lbnRzOyB9CisKKyAgc3RhdGljIGJvb2wgaXNWZWN0b3JTaXplVG9vTGFyZ2UodW5zaWduZWQgTnVtRWxlbWVudHMpIHsKKyAgICByZXR1cm4gTnVtRWxlbWVudHMgPiBWZWN0b3JUeXBlQml0ZmllbGRzOjpNYXhOdW1FbGVtZW50czsKKyAgfQorCisgIGJvb2wgaXNTdWdhcmVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0IHsgcmV0dXJuIFF1YWxUeXBlKHRoaXMsIDApOyB9CisKKyAgVmVjdG9yS2luZCBnZXRWZWN0b3JLaW5kKCkgY29uc3QgeworICAgIHJldHVybiBWZWN0b3JLaW5kKFZlY3RvclR5cGVCaXRzLlZlY0tpbmQpOworICB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgUHJvZmlsZShJRCwgZ2V0RWxlbWVudFR5cGUoKSwgZ2V0TnVtRWxlbWVudHMoKSwKKyAgICAgICAgICAgIGdldFR5cGVDbGFzcygpLCBnZXRWZWN0b3JLaW5kKCkpOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgUXVhbFR5cGUgRWxlbWVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtRWxlbWVudHMsIFR5cGVDbGFzcyBUeXBlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yS2luZCBWZWNLaW5kKSB7CisgICAgSUQuQWRkUG9pbnRlcihFbGVtZW50VHlwZS5nZXRBc09wYXF1ZVB0cigpKTsKKyAgICBJRC5BZGRJbnRlZ2VyKE51bUVsZW1lbnRzKTsKKyAgICBJRC5BZGRJbnRlZ2VyKFR5cGVDbGFzcyk7CisgICAgSUQuQWRkSW50ZWdlcihWZWNLaW5kKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlQ2xhc3MoKSA9PSBWZWN0b3IgfHwgVC0+Z2V0VHlwZUNsYXNzKCkgPT0gRXh0VmVjdG9yOworICB9Cit9OworCisvLy8gRXh0VmVjdG9yVHlwZSAtIEV4dGVuZGVkIHZlY3RvciB0eXBlLiBUaGlzIHR5cGUgaXMgY3JlYXRlZCB1c2luZworLy8vIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZShuKSksIHdoZXJlICJuIiBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLgorLy8vIFVubGlrZSB2ZWN0b3Jfc2l6ZSwgZXh0X3ZlY3Rvcl90eXBlIGlzIG9ubHkgYWxsb3dlZCBvbiB0eXBlZGVmJ3MuIFRoaXMKKy8vLyBjbGFzcyBlbmFibGVzIHN5bnRhY3RpYyBleHRlbnNpb25zLCBsaWtlIFZlY3RvciBDb21wb25lbnRzIGZvciBhY2Nlc3NpbmcKKy8vLyBwb2ludHMgKGFzIC54eXp3KSwgY29sb3JzIChhcyAucmdiYSksIGFuZCB0ZXh0dXJlcyAobW9kZWxlZCBhZnRlciBPcGVuR0wKKy8vLyBTaGFkaW5nIExhbmd1YWdlKS4KK2NsYXNzIEV4dFZlY3RvclR5cGUgOiBwdWJsaWMgVmVjdG9yVHlwZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RDb250ZXh0OyAvLyBBU1RDb250ZXh0IGNyZWF0ZXMgdGhlc2UuCisKKyAgRXh0VmVjdG9yVHlwZShRdWFsVHlwZSB2ZWNUeXBlLCB1bnNpZ25lZCBuRWxlbWVudHMsIFF1YWxUeXBlIGNhbm9uVHlwZSkKKyAgICAgIDogVmVjdG9yVHlwZShFeHRWZWN0b3IsIHZlY1R5cGUsIG5FbGVtZW50cywgY2Fub25UeXBlLCBHZW5lcmljVmVjdG9yKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBpbnQgZ2V0UG9pbnRBY2Nlc3NvcklkeChjaGFyIGMpIHsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICBkZWZhdWx0OiByZXR1cm4gLTE7CisgICAgY2FzZSAneCc6IGNhc2UgJ3InOiByZXR1cm4gMDsKKyAgICBjYXNlICd5JzogY2FzZSAnZyc6IHJldHVybiAxOworICAgIGNhc2UgJ3onOiBjYXNlICdiJzogcmV0dXJuIDI7CisgICAgY2FzZSAndyc6IGNhc2UgJ2EnOiByZXR1cm4gMzsKKyAgICB9CisgIH0KKworICBzdGF0aWMgaW50IGdldE51bWVyaWNBY2Nlc3NvcklkeChjaGFyIGMpIHsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKKyAgICAgIGNhc2UgJzAnOiByZXR1cm4gMDsKKyAgICAgIGNhc2UgJzEnOiByZXR1cm4gMTsKKyAgICAgIGNhc2UgJzInOiByZXR1cm4gMjsKKyAgICAgIGNhc2UgJzMnOiByZXR1cm4gMzsKKyAgICAgIGNhc2UgJzQnOiByZXR1cm4gNDsKKyAgICAgIGNhc2UgJzUnOiByZXR1cm4gNTsKKyAgICAgIGNhc2UgJzYnOiByZXR1cm4gNjsKKyAgICAgIGNhc2UgJzcnOiByZXR1cm4gNzsKKyAgICAgIGNhc2UgJzgnOiByZXR1cm4gODsKKyAgICAgIGNhc2UgJzknOiByZXR1cm4gOTsKKyAgICAgIGNhc2UgJ0EnOgorICAgICAgY2FzZSAnYSc6IHJldHVybiAxMDsKKyAgICAgIGNhc2UgJ0InOgorICAgICAgY2FzZSAnYic6IHJldHVybiAxMTsKKyAgICAgIGNhc2UgJ0MnOgorICAgICAgY2FzZSAnYyc6IHJldHVybiAxMjsKKyAgICAgIGNhc2UgJ0QnOgorICAgICAgY2FzZSAnZCc6IHJldHVybiAxMzsKKyAgICAgIGNhc2UgJ0UnOgorICAgICAgY2FzZSAnZSc6IHJldHVybiAxNDsKKyAgICAgIGNhc2UgJ0YnOgorICAgICAgY2FzZSAnZic6IHJldHVybiAxNTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgaW50IGdldEFjY2Vzc29ySWR4KGNoYXIgYywgYm9vbCBpc051bWVyaWNBY2Nlc3NvcikgeworICAgIGlmIChpc051bWVyaWNBY2Nlc3NvcikKKyAgICAgIHJldHVybiBnZXROdW1lcmljQWNjZXNzb3JJZHgoYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGdldFBvaW50QWNjZXNzb3JJZHgoYyk7CisgIH0KKworICBib29sIGlzQWNjZXNzb3JXaXRoaW5OdW1FbGVtZW50cyhjaGFyIGMsIGJvb2wgaXNOdW1lcmljQWNjZXNzb3IpIGNvbnN0IHsKKyAgICBpZiAoaW50IGlkeCA9IGdldEFjY2Vzc29ySWR4KGMsIGlzTnVtZXJpY0FjY2Vzc29yKSsxKQorICAgICAgcmV0dXJuIHVuc2lnbmVkKGlkeC0xKSA8IGdldE51bUVsZW1lbnRzKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBpc1N1Z2FyZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICBRdWFsVHlwZSBkZXN1Z2FyKCkgY29uc3QgeyByZXR1cm4gUXVhbFR5cGUodGhpcywgMCk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gRXh0VmVjdG9yOworICB9Cit9OworCisvLy8gRnVuY3Rpb25UeXBlIC0gQzk5IDYuNy41LjMgLSBGdW5jdGlvbiBEZWNsYXJhdG9ycy4gIFRoaXMgaXMgdGhlIGNvbW1vbiBiYXNlCisvLy8gY2xhc3Mgb2YgRnVuY3Rpb25Ob1Byb3RvVHlwZSBhbmQgRnVuY3Rpb25Qcm90b1R5cGUuCitjbGFzcyBGdW5jdGlvblR5cGUgOiBwdWJsaWMgVHlwZSB7CisgIC8vIFRoZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbi4KKyAgUXVhbFR5cGUgUmVzdWx0VHlwZTsKKworcHVibGljOgorICAvLy8gQSBjbGFzcyB3aGljaCBhYnN0cmFjdHMgb3V0IHNvbWUgZGV0YWlscyBuZWNlc3NhcnkgZm9yCisgIC8vLyBtYWtpbmcgYSBjYWxsLgorICAvLy8KKyAgLy8vIEl0IGlzIG5vdCBhY3R1YWxseSB1c2VkIGRpcmVjdGx5IGZvciBzdG9yaW5nIHRoaXMgaW5mb3JtYXRpb24gaW4KKyAgLy8vIGEgRnVuY3Rpb25UeXBlLCBhbHRob3VnaCBGdW5jdGlvblR5cGUgZG9lcyBjdXJyZW50bHkgdXNlIHRoZQorICAvLy8gc2FtZSBiaXQtcGF0dGVybi4KKyAgLy8vCisgIC8vIElmIHlvdSBhZGQgYSBmaWVsZCAoc2F5IEZvbyksIG90aGVyIHRoYW4gdGhlIG9idmlvdXMgcGxhY2VzIChib3RoLAorICAvLyBjb25zdHJ1Y3RvcnMsIGNvbXBpbGUgZmFpbHVyZXMpLCB3aGF0IHlvdSBuZWVkIHRvIHVwZGF0ZSBpcworICAvLyAqIE9wZXJhdG9yPT0KKyAgLy8gKiBnZXRGb28KKyAgLy8gKiB3aXRoRm9vCisgIC8vICogZnVuY3Rpb25UeXBlLiBBZGQgRm9vLCBnZXRGb28uCisgIC8vICogQVNUQ29udGV4dDo6Z2V0Rm9vVHlwZQorICAvLyAqIEFTVENvbnRleHQ6Om1lcmdlRnVuY3Rpb25UeXBlcworICAvLyAqIEZ1bmN0aW9uTm9Qcm90b1R5cGU6OlByb2ZpbGUKKyAgLy8gKiBGdW5jdGlvblByb3RvVHlwZTo6UHJvZmlsZQorICAvLyAqIFR5cGVQcmludGVyOjpQcmludEZ1bmN0aW9uUHJvdG8KKyAgLy8gKiBBU1QgcmVhZCBhbmQgd3JpdGUKKyAgLy8gKiBDb2RlZ2VuCisgIGNsYXNzIEV4dEluZm8geworICAgIGZyaWVuZCBjbGFzcyBGdW5jdGlvblR5cGU7CisKKyAgICAvLyBGZWVsIGZyZWUgdG8gcmVhcnJhbmdlIG9yIGFkZCBiaXRzLCBidXQgaWYgeW91IGdvIG92ZXIgMTIsCisgICAgLy8geW91J2xsIG5lZWQgdG8gYWRqdXN0IGJvdGggdGhlIEJpdHMgZmllbGQgYmVsb3cgYW5kCisgICAgLy8gVHlwZTo6RnVuY3Rpb25UeXBlQml0ZmllbGRzLgorCisgICAgLy8gICB8ICBDQyAgfG5vcmV0dXJufHByb2R1Y2VzfG5vY2FsbGVyc2F2ZWRyZWdzfHJlZ3Bhcm18bm9jZmNoZWNrfAorICAgIC8vICAgfDAgLi4gNHwgICA1ICAgIHwgICAgNiAgIHwgICAgICAgNyAgICAgICAgIHw4IC4uIDEwfCAgICAxMSAgIHwKKyAgICAvLworICAgIC8vIHJlZ3Bhcm0gaXMgZWl0aGVyIDAgKG5vIHJlZ3Bhcm0gYXR0cmlidXRlKSBvciB0aGUgcmVncGFybSB2YWx1ZSsxLgorICAgIGVudW0geyBDYWxsQ29udk1hc2sgPSAweDFGIH07CisgICAgZW51bSB7IE5vUmV0dXJuTWFzayA9IDB4MjAgfTsKKyAgICBlbnVtIHsgUHJvZHVjZXNSZXN1bHRNYXNrID0gMHg0MCB9OworICAgIGVudW0geyBOb0NhbGxlclNhdmVkUmVnc01hc2sgPSAweDgwIH07CisgICAgZW51bSB7IE5vQ2ZDaGVja01hc2sgPSAweDgwMCB9OworICAgIGVudW0geworICAgICAgUmVnUGFybU1hc2sgPSB+KENhbGxDb252TWFzayB8IE5vUmV0dXJuTWFzayB8IFByb2R1Y2VzUmVzdWx0TWFzayB8CisgICAgICAgICAgICAgICAgICAgICAgTm9DYWxsZXJTYXZlZFJlZ3NNYXNrIHwgTm9DZkNoZWNrTWFzayksCisgICAgICBSZWdQYXJtT2Zmc2V0ID0gOAorICAgIH07IC8vIEFzc3VtZWQgdG8gYmUgdGhlIGxhc3QgZmllbGQKKyAgICB1aW50MTZfdCBCaXRzID0gQ0NfQzsKKworICAgIEV4dEluZm8odW5zaWduZWQgQml0cykgOiBCaXRzKHN0YXRpY19jYXN0PHVpbnQxNl90PihCaXRzKSkge30KKworICAgcHVibGljOgorICAgICAvLyBDb25zdHJ1Y3RvciB3aXRoIG5vIGRlZmF1bHRzLiBVc2UgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgeW91CisgICAgIC8vIGhhdmUgYWxsIHRoZSBlbGVtZW50cyAod2hlbiByZWFkaW5nIGFuIEFTVCBmaWxlIGZvciBleGFtcGxlKS4KKyAgICAgRXh0SW5mbyhib29sIG5vUmV0dXJuLCBib29sIGhhc1JlZ1Bhcm0sIHVuc2lnbmVkIHJlZ1Bhcm0sIENhbGxpbmdDb252IGNjLAorICAgICAgICAgICAgIGJvb2wgcHJvZHVjZXNSZXN1bHQsIGJvb2wgbm9DYWxsZXJTYXZlZFJlZ3MsIGJvb2wgTm9DZkNoZWNrKSB7CisgICAgICAgYXNzZXJ0KCghaGFzUmVnUGFybSB8fCByZWdQYXJtIDwgNykgJiYgIkludmFsaWQgcmVncGFybSB2YWx1ZSIpOworICAgICAgIEJpdHMgPSAoKHVuc2lnbmVkKWNjKSB8IChub1JldHVybiA/IE5vUmV0dXJuTWFzayA6IDApIHwKKyAgICAgICAgICAgICAgKHByb2R1Y2VzUmVzdWx0ID8gUHJvZHVjZXNSZXN1bHRNYXNrIDogMCkgfAorICAgICAgICAgICAgICAobm9DYWxsZXJTYXZlZFJlZ3MgPyBOb0NhbGxlclNhdmVkUmVnc01hc2sgOiAwKSB8CisgICAgICAgICAgICAgIChoYXNSZWdQYXJtID8gKChyZWdQYXJtICsgMSkgPDwgUmVnUGFybU9mZnNldCkgOiAwKSB8IAorICAgICAgICAgICAgICAoTm9DZkNoZWNrID8gTm9DZkNoZWNrTWFzayA6IDApOworICAgIH0KKworICAgIC8vIENvbnN0cnVjdG9yIHdpdGggYWxsIGRlZmF1bHRzLiBVc2Ugd2hlbiBmb3IgZXhhbXBsZSBjcmVhdGluZyBhCisgICAgLy8gZnVuY3Rpb24ga25vd24gdG8gdXNlIGRlZmF1bHRzLgorICAgIEV4dEluZm8oKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBDb25zdHJ1Y3RvciB3aXRoIGp1c3QgdGhlIGNhbGxpbmcgY29udmVudGlvbiwgd2hpY2ggaXMgYW4gaW1wb3J0YW50IHBhcnQKKyAgICAvLyBvZiB0aGUgY2Fub25pY2FsIHR5cGUuCisgICAgRXh0SW5mbyhDYWxsaW5nQ29udiBDQykgOiBCaXRzKENDKSB7fQorCisgICAgYm9vbCBnZXROb1JldHVybigpIGNvbnN0IHsgcmV0dXJuIEJpdHMgJiBOb1JldHVybk1hc2s7IH0KKyAgICBib29sIGdldFByb2R1Y2VzUmVzdWx0KCkgY29uc3QgeyByZXR1cm4gQml0cyAmIFByb2R1Y2VzUmVzdWx0TWFzazsgfQorICAgIGJvb2wgZ2V0Tm9DYWxsZXJTYXZlZFJlZ3MoKSBjb25zdCB7IHJldHVybiBCaXRzICYgTm9DYWxsZXJTYXZlZFJlZ3NNYXNrOyB9CisgICAgYm9vbCBnZXROb0NmQ2hlY2soKSBjb25zdCB7IHJldHVybiBCaXRzICYgTm9DZkNoZWNrTWFzazsgfQorICAgIGJvb2wgZ2V0SGFzUmVnUGFybSgpIGNvbnN0IHsgcmV0dXJuIChCaXRzID4+IFJlZ1Bhcm1PZmZzZXQpICE9IDA7IH0KKworICAgIHVuc2lnbmVkIGdldFJlZ1Bhcm0oKSBjb25zdCB7CisgICAgICB1bnNpZ25lZCBSZWdQYXJtID0gKEJpdHMgJiBSZWdQYXJtTWFzaykgPj4gUmVnUGFybU9mZnNldDsKKyAgICAgIGlmIChSZWdQYXJtID4gMCkKKyAgICAgICAgLS1SZWdQYXJtOworICAgICAgcmV0dXJuIFJlZ1Bhcm07CisgICAgfQorCisgICAgQ2FsbGluZ0NvbnYgZ2V0Q0MoKSBjb25zdCB7IHJldHVybiBDYWxsaW5nQ29udihCaXRzICYgQ2FsbENvbnZNYXNrKTsgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KEV4dEluZm8gT3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBCaXRzID09IE90aGVyLkJpdHM7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShFeHRJbmZvIE90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gQml0cyAhPSBPdGhlci5CaXRzOworICAgIH0KKworICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIHNldHRlcnMuIFRoYXQgaXMgYnkgZGVzaWduLCB1c2UKKyAgICAvLyB0aGUgZm9sbG93aW5nIHdpdGggbWV0aG9kcyBpbnN0ZWFkIG9mIG11dGF0aW5nIHRoZXNlIG9iamVjdHMuCisKKyAgICBFeHRJbmZvIHdpdGhOb1JldHVybihib29sIG5vUmV0dXJuKSBjb25zdCB7CisgICAgICBpZiAobm9SZXR1cm4pCisgICAgICAgIHJldHVybiBFeHRJbmZvKEJpdHMgfCBOb1JldHVybk1hc2spOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gRXh0SW5mbyhCaXRzICYgfk5vUmV0dXJuTWFzayk7CisgICAgfQorCisgICAgRXh0SW5mbyB3aXRoUHJvZHVjZXNSZXN1bHQoYm9vbCBwcm9kdWNlc1Jlc3VsdCkgY29uc3QgeworICAgICAgaWYgKHByb2R1Y2VzUmVzdWx0KQorICAgICAgICByZXR1cm4gRXh0SW5mbyhCaXRzIHwgUHJvZHVjZXNSZXN1bHRNYXNrKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEV4dEluZm8oQml0cyAmIH5Qcm9kdWNlc1Jlc3VsdE1hc2spOworICAgIH0KKworICAgIEV4dEluZm8gd2l0aE5vQ2FsbGVyU2F2ZWRSZWdzKGJvb2wgbm9DYWxsZXJTYXZlZFJlZ3MpIGNvbnN0IHsKKyAgICAgIGlmIChub0NhbGxlclNhdmVkUmVncykKKyAgICAgICAgcmV0dXJuIEV4dEluZm8oQml0cyB8IE5vQ2FsbGVyU2F2ZWRSZWdzTWFzayk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBFeHRJbmZvKEJpdHMgJiB+Tm9DYWxsZXJTYXZlZFJlZ3NNYXNrKTsKKyAgICB9CisKKyAgICBFeHRJbmZvIHdpdGhOb0NmQ2hlY2soYm9vbCBub0NmQ2hlY2spIGNvbnN0IHsKKyAgICAgIGlmIChub0NmQ2hlY2spCisgICAgICAgIHJldHVybiBFeHRJbmZvKEJpdHMgfCBOb0NmQ2hlY2tNYXNrKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEV4dEluZm8oQml0cyAmIH5Ob0NmQ2hlY2tNYXNrKTsKKyAgICB9CisKKyAgICBFeHRJbmZvIHdpdGhSZWdQYXJtKHVuc2lnbmVkIFJlZ1Bhcm0pIGNvbnN0IHsKKyAgICAgIGFzc2VydChSZWdQYXJtIDwgNyAmJiAiSW52YWxpZCByZWdwYXJtIHZhbHVlIik7CisgICAgICByZXR1cm4gRXh0SW5mbygoQml0cyAmIH5SZWdQYXJtTWFzaykgfAorICAgICAgICAgICAgICAgICAgICAgKChSZWdQYXJtICsgMSkgPDwgUmVnUGFybU9mZnNldCkpOworICAgIH0KKworICAgIEV4dEluZm8gd2l0aENhbGxpbmdDb252KENhbGxpbmdDb252IGNjKSBjb25zdCB7CisgICAgICByZXR1cm4gRXh0SW5mbygoQml0cyAmIH5DYWxsQ29udk1hc2spIHwgKHVuc2lnbmVkKSBjYyk7CisgICAgfQorCisgICAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7CisgICAgICBJRC5BZGRJbnRlZ2VyKEJpdHMpOworICAgIH0KKyAgfTsKKworcHJvdGVjdGVkOgorICBGdW5jdGlvblR5cGUoVHlwZUNsYXNzIHRjLCBRdWFsVHlwZSByZXMsCisgICAgICAgICAgICAgICBRdWFsVHlwZSBDYW5vbmljYWwsIGJvb2wgRGVwZW5kZW50LAorICAgICAgICAgICAgICAgYm9vbCBJbnN0YW50aWF0aW9uRGVwZW5kZW50LAorICAgICAgICAgICAgICAgYm9vbCBWYXJpYWJseU1vZGlmaWVkLCBib29sIENvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2ssCisgICAgICAgICAgICAgICBFeHRJbmZvIEluZm8pCisgICAgICA6IFR5cGUodGMsIENhbm9uaWNhbCwgRGVwZW5kZW50LCBJbnN0YW50aWF0aW9uRGVwZW5kZW50LCBWYXJpYWJseU1vZGlmaWVkLAorICAgICAgICAgICAgIENvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2spLAorICAgICAgICBSZXN1bHRUeXBlKHJlcykgeworICAgIEZ1bmN0aW9uVHlwZUJpdHMuRXh0SW5mbyA9IEluZm8uQml0czsKKyAgfQorCisgIHVuc2lnbmVkIGdldFR5cGVRdWFscygpIGNvbnN0IHsgcmV0dXJuIEZ1bmN0aW9uVHlwZUJpdHMuVHlwZVF1YWxzOyB9CisKK3B1YmxpYzoKKyAgUXVhbFR5cGUgZ2V0UmV0dXJuVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFJlc3VsdFR5cGU7IH0KKworICBib29sIGdldEhhc1JlZ1Bhcm0oKSBjb25zdCB7IHJldHVybiBnZXRFeHRJbmZvKCkuZ2V0SGFzUmVnUGFybSgpOyB9CisgIHVuc2lnbmVkIGdldFJlZ1Bhcm1UeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0RXh0SW5mbygpLmdldFJlZ1Bhcm0oKTsgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGZ1bmN0aW9uIHR5cGUgaW5jbHVkZXMgdGhlIEdOVSBub3JldHVybgorICAvLy8gYXR0cmlidXRlLiBUaGUgQysrMTEgW1tub3JldHVybl1dIGF0dHJpYnV0ZSBkb2VzIG5vdCBhZmZlY3QgdGhlIGZ1bmN0aW9uCisgIC8vLyB0eXBlLgorICBib29sIGdldE5vUmV0dXJuQXR0cigpIGNvbnN0IHsgcmV0dXJuIGdldEV4dEluZm8oKS5nZXROb1JldHVybigpOyB9CisKKyAgQ2FsbGluZ0NvbnYgZ2V0Q2FsbENvbnYoKSBjb25zdCB7IHJldHVybiBnZXRFeHRJbmZvKCkuZ2V0Q0MoKTsgfQorICBFeHRJbmZvIGdldEV4dEluZm8oKSBjb25zdCB7IHJldHVybiBFeHRJbmZvKEZ1bmN0aW9uVHlwZUJpdHMuRXh0SW5mbyk7IH0KKyAgYm9vbCBpc0NvbnN0KCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZVF1YWxzKCkgJiBRdWFsaWZpZXJzOjpDb25zdDsgfQorICBib29sIGlzVm9sYXRpbGUoKSBjb25zdCB7IHJldHVybiBnZXRUeXBlUXVhbHMoKSAmIFF1YWxpZmllcnM6OlZvbGF0aWxlOyB9CisgIGJvb2wgaXNSZXN0cmljdCgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVRdWFscygpICYgUXVhbGlmaWVyczo6UmVzdHJpY3Q7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgdHlwZSBvZiBhbiBleHByZXNzaW9uIHRoYXQgY2FsbHMgYSBmdW5jdGlvbiBvZgorICAvLy8gdGhpcyB0eXBlLgorICBRdWFsVHlwZSBnZXRDYWxsUmVzdWx0VHlwZShjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0KSBjb25zdCB7CisgICAgcmV0dXJuIGdldFJldHVyblR5cGUoKS5nZXROb25MVmFsdWVFeHByVHlwZShDb250ZXh0KTsKKyAgfQorCisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0TmFtZUZvckNhbGxDb252KENhbGxpbmdDb252IENDKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gRnVuY3Rpb25Ob1Byb3RvIHx8CisgICAgICAgICAgIFQtPmdldFR5cGVDbGFzcygpID09IEZ1bmN0aW9uUHJvdG87CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgSyZSLXN0eWxlICdpbnQgZm9vKCknIGZ1bmN0aW9uLCB3aGljaCBoYXMKKy8vLyBubyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgYWJvdXQgaXRzIGFyZ3VtZW50cy4KK2NsYXNzIEZ1bmN0aW9uTm9Qcm90b1R5cGUgOiBwdWJsaWMgRnVuY3Rpb25UeXBlLCBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsgLy8gQVNUQ29udGV4dCBjcmVhdGVzIHRoZXNlLgorCisgIEZ1bmN0aW9uTm9Qcm90b1R5cGUoUXVhbFR5cGUgUmVzdWx0LCBRdWFsVHlwZSBDYW5vbmljYWwsIEV4dEluZm8gSW5mbykKKyAgICAgIDogRnVuY3Rpb25UeXBlKEZ1bmN0aW9uTm9Qcm90bywgUmVzdWx0LCBDYW5vbmljYWwsCisgICAgICAgICAgICAgICAgICAgICAvKkRlcGVuZGVudD0qL2ZhbHNlLCAvKkluc3RhbnRpYXRpb25EZXBlbmRlbnQ9Ki9mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgIFJlc3VsdC0+aXNWYXJpYWJseU1vZGlmaWVkVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgLypDb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrPSovZmFsc2UsIEluZm8pIHt9CisKK3B1YmxpYzoKKyAgLy8gTm8gYWRkaXRpb25hbCBzdGF0ZSBwYXN0IHdoYXQgRnVuY3Rpb25UeXBlIHByb3ZpZGVzLgorCisgIGJvb2wgaXNTdWdhcmVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0IHsgcmV0dXJuIFF1YWxUeXBlKHRoaXMsIDApOyB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgUHJvZmlsZShJRCwgZ2V0UmV0dXJuVHlwZSgpLCBnZXRFeHRJbmZvKCkpOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgUXVhbFR5cGUgUmVzdWx0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBFeHRJbmZvIEluZm8pIHsKKyAgICBJbmZvLlByb2ZpbGUoSUQpOworICAgIElELkFkZFBvaW50ZXIoUmVzdWx0VHlwZS5nZXRBc09wYXF1ZVB0cigpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlQ2xhc3MoKSA9PSBGdW5jdGlvbk5vUHJvdG87CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgcHJvdG90eXBlIHdpdGggcGFyYW1ldGVyIHR5cGUgaW5mbywgZS5nLgorLy8vICdpbnQgZm9vKGludCknIG9yICdpbnQgZm9vKHZvaWQpJy4gICd2b2lkJyBpcyByZXByZXNlbnRlZCBhcyBoYXZpbmcgbm8KKy8vLyBwYXJhbWV0ZXJzLCBub3QgYXMgaGF2aW5nIGEgc2luZ2xlIHZvaWQgcGFyYW1ldGVyLiBTdWNoIGEgdHlwZSBjYW4gaGF2ZSBhbgorLy8vIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLCBidXQgdGhpcyBzcGVjaWZpY2F0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBjYW5vbmljYWwKKy8vLyB0eXBlLgorY2xhc3MgRnVuY3Rpb25Qcm90b1R5cGUgOiBwdWJsaWMgRnVuY3Rpb25UeXBlLCBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworcHVibGljOgorICAvLy8gSW50ZXJlc3RpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBwYXJhbWV0ZXIgdGhhdCBjYW4ndCBzaW1wbHkKKyAgLy8vIGJlIHJlZmxlY3RlZCBpbiBwYXJhbWV0ZXIncyB0eXBlLgorICAvLy8KKyAgLy8vIEl0IG1ha2VzIHNlbnNlIHRvIG1vZGVsIGxhbmd1YWdlIGZlYXR1cmVzIHRoaXMgd2F5IHdoZW4gdGhlcmUncyBzb21lCisgIC8vLyBzb3J0IG9mIHBhcmFtZXRlci1zcGVjaWZpYyBvdmVycmlkZSAoc3VjaCBhcyBhbiBhdHRyaWJ1dGUpIHRoYXQKKyAgLy8vIGFmZmVjdHMgaG93IHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuICBGb3IgZXhhbXBsZSwgdGhlIEFSQyBuc19jb25zdW1lZAorICAvLy8gYXR0cmlidXRlIGNoYW5nZXMgd2hldGhlciBhIHBhcmFtZXRlciBpcyBwYXNzZWQgYXQgKzAgKHRoZSBkZWZhdWx0KQorICAvLy8gb3IgKzEgKG5zX2NvbnN1bWVkKS4gIFRoaXMgbXVzdCBiZSByZWZsZWN0ZWQgaW4gdGhlIGZ1bmN0aW9uIHR5cGUsCisgIC8vLyBidXQgaXNuJ3QgcmVhbGx5IGEgY2hhbmdlIHRvIHRoZSBwYXJhbWV0ZXIgdHlwZS4KKyAgLy8vCisgIC8vLyBPbmUgc2VyaW91cyBkaXNhZHZhbnRhZ2Ugb2YgbW9kZWxsaW5nIGxhbmd1YWdlIGZlYXR1cmVzIHRoaXMgd2F5IGlzCisgIC8vLyB0aGF0IHRoZXkgZ2VuZXJhbGx5IGRvIG5vdCB3b3JrIHdpdGggbGFuZ3VhZ2UgZmVhdHVyZXMgdGhhdCBhdHRlbXB0CisgIC8vLyB0byBkZXN0cnVjdHVyZSB0eXBlcy4gIEZvciBleGFtcGxlLCB0ZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24gd2lsbAorICAvLy8gbm90IGJlIGFibGUgdG8gbWF0Y2ggYSBwYXJhbWV0ZXIgZGVjbGFyZWQgYXMKKyAgLy8vICAgVCAoKikoVSkKKyAgLy8vIGFnYWluc3QgYW4gYXJndW1lbnQgb2YgdHlwZQorICAvLy8gICB2b2lkICgqKShfX2F0dHJpYnV0ZV9fKChuc19jb25zdW1lZCkpIGlkKQorICAvLy8gYmVjYXVzZSB0aGUgc3Vic3RpdHV0aW9uIG9mIFQ9dm9pZCwgVT1pZCBpbnRvIHRoZSBmb3JtZXIgd2lsbAorICAvLy8gbm90IHByb2R1Y2UgdGhlIGxhdHRlci4KKyAgY2xhc3MgRXh0UGFyYW1ldGVySW5mbyB7CisgICAgZW51bSB7CisgICAgICBBQklNYXNrICAgICAgICAgPSAweDBGLAorICAgICAgSXNDb25zdW1lZCAgICAgID0gMHgxMCwKKyAgICAgIEhhc1Bhc3NPYmpTaXplICA9IDB4MjAsCisgICAgICBJc05vRXNjYXBlICAgICAgPSAweDQwLAorICAgIH07CisgICAgdW5zaWduZWQgY2hhciBEYXRhID0gMDsKKworICBwdWJsaWM6CisgICAgRXh0UGFyYW1ldGVySW5mbygpID0gZGVmYXVsdDsKKworICAgIC8vLyBSZXR1cm4gdGhlIEFCSSB0cmVhdG1lbnQgb2YgdGhpcyBwYXJhbWV0ZXIuCisgICAgUGFyYW1ldGVyQUJJIGdldEFCSSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBQYXJhbWV0ZXJBQkkoRGF0YSAmIEFCSU1hc2spOworICAgIH0KKyAgICBFeHRQYXJhbWV0ZXJJbmZvIHdpdGhBQkkoUGFyYW1ldGVyQUJJIGtpbmQpIGNvbnN0IHsKKyAgICAgIEV4dFBhcmFtZXRlckluZm8gY29weSA9ICp0aGlzOworICAgICAgY29weS5EYXRhID0gKGNvcHkuRGF0YSAmIH5BQklNYXNrKSB8IHVuc2lnbmVkKGtpbmQpOworICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLy8vIElzIHRoaXMgcGFyYW1ldGVyIGNvbnNpZGVyZWQgImNvbnN1bWVkIiBieSBPYmplY3RpdmUtQyBBUkM/CisgICAgLy8vIENvbnN1bWVkIHBhcmFtZXRlcnMgbXVzdCBoYXZlIHJldGFpbmFibGUgb2JqZWN0IHR5cGUuCisgICAgYm9vbCBpc0NvbnN1bWVkKCkgY29uc3QgeworICAgICAgcmV0dXJuIChEYXRhICYgSXNDb25zdW1lZCk7CisgICAgfQorICAgIEV4dFBhcmFtZXRlckluZm8gd2l0aElzQ29uc3VtZWQoYm9vbCBjb25zdW1lZCkgY29uc3QgeworICAgICAgRXh0UGFyYW1ldGVySW5mbyBjb3B5ID0gKnRoaXM7CisgICAgICBpZiAoY29uc3VtZWQpIHsKKyAgICAgICAgY29weS5EYXRhIHw9IElzQ29uc3VtZWQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb3B5LkRhdGEgJj0gfklzQ29uc3VtZWQ7CisgICAgICB9CisgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyAgICBib29sIGhhc1Bhc3NPYmplY3RTaXplKCkgY29uc3QgeworICAgICAgcmV0dXJuIERhdGEgJiBIYXNQYXNzT2JqU2l6ZTsKKyAgICB9CisgICAgRXh0UGFyYW1ldGVySW5mbyB3aXRoSGFzUGFzc09iamVjdFNpemUoKSBjb25zdCB7CisgICAgICBFeHRQYXJhbWV0ZXJJbmZvIENvcHkgPSAqdGhpczsKKyAgICAgIENvcHkuRGF0YSB8PSBIYXNQYXNzT2JqU2l6ZTsKKyAgICAgIHJldHVybiBDb3B5OworICAgIH0KKworICAgIGJvb2wgaXNOb0VzY2FwZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBEYXRhICYgSXNOb0VzY2FwZTsKKyAgICB9CisKKyAgICBFeHRQYXJhbWV0ZXJJbmZvIHdpdGhJc05vRXNjYXBlKGJvb2wgTm9Fc2NhcGUpIGNvbnN0IHsKKyAgICAgIEV4dFBhcmFtZXRlckluZm8gQ29weSA9ICp0aGlzOworICAgICAgaWYgKE5vRXNjYXBlKQorICAgICAgICBDb3B5LkRhdGEgfD0gSXNOb0VzY2FwZTsKKyAgICAgIGVsc2UKKyAgICAgICAgQ29weS5EYXRhICY9IH5Jc05vRXNjYXBlOworICAgICAgcmV0dXJuIENvcHk7CisgICAgfQorCisgICAgdW5zaWduZWQgY2hhciBnZXRPcGFxdWVWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIERhdGE7IH0KKyAgICBzdGF0aWMgRXh0UGFyYW1ldGVySW5mbyBnZXRGcm9tT3BhcXVlVmFsdWUodW5zaWduZWQgY2hhciBkYXRhKSB7CisgICAgICBFeHRQYXJhbWV0ZXJJbmZvIHJlc3VsdDsKKyAgICAgIHJlc3VsdC5EYXRhID0gZGF0YTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShFeHRQYXJhbWV0ZXJJbmZvIGxocywgRXh0UGFyYW1ldGVySW5mbyByaHMpIHsKKyAgICAgIHJldHVybiBsaHMuRGF0YSA9PSByaHMuRGF0YTsKKyAgICB9CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShFeHRQYXJhbWV0ZXJJbmZvIGxocywgRXh0UGFyYW1ldGVySW5mbyByaHMpIHsKKyAgICAgIHJldHVybiBsaHMuRGF0YSAhPSByaHMuRGF0YTsKKyAgICB9CisgIH07CisKKyAgc3RydWN0IEV4Y2VwdGlvblNwZWNJbmZvIHsKKyAgICAvLy8gVGhlIGtpbmQgb2YgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gdGhpcyBpcy4KKyAgICBFeGNlcHRpb25TcGVjaWZpY2F0aW9uVHlwZSBUeXBlID0gRVNUX05vbmU7CisKKyAgICAvLy8gRXhwbGljaXRseS1zcGVjaWZpZWQgbGlzdCBvZiBleGNlcHRpb24gdHlwZXMuCisgICAgQXJyYXlSZWY8UXVhbFR5cGU+IEV4Y2VwdGlvbnM7CisKKyAgICAvLy8gTm9leGNlcHQgZXhwcmVzc2lvbiwgaWYgdGhpcyBpcyBFU1RfQ29tcHV0ZWROb2V4Y2VwdC4KKyAgICBFeHByICpOb2V4Y2VwdEV4cHIgPSBudWxscHRyOworCisgICAgLy8vIFRoZSBmdW5jdGlvbiB3aG9zZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiB0aGlzIGlzLCBmb3IKKyAgICAvLy8gRVNUX1VuZXZhbHVhdGVkIGFuZCBFU1RfVW5pbnN0YW50aWF0ZWQuCisgICAgRnVuY3Rpb25EZWNsICpTb3VyY2VEZWNsID0gbnVsbHB0cjsKKworICAgIC8vLyBUaGUgZnVuY3Rpb24gdGVtcGxhdGUgd2hvc2UgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gdGhpcyBpcyBpbnN0YW50aWF0ZWQKKyAgICAvLy8gZnJvbSwgZm9yIEVTVF9Vbmluc3RhbnRpYXRlZC4KKyAgICBGdW5jdGlvbkRlY2wgKlNvdXJjZVRlbXBsYXRlID0gbnVsbHB0cjsKKworICAgIEV4Y2VwdGlvblNwZWNJbmZvKCkgPSBkZWZhdWx0OworCisgICAgRXhjZXB0aW9uU3BlY0luZm8oRXhjZXB0aW9uU3BlY2lmaWNhdGlvblR5cGUgRVNUKSA6IFR5cGUoRVNUKSB7fQorICB9OworCisgIC8vLyBFeHRyYSBpbmZvcm1hdGlvbiBhYm91dCBhIGZ1bmN0aW9uIHByb3RvdHlwZS4KKyAgc3RydWN0IEV4dFByb3RvSW5mbyB7CisgICAgRnVuY3Rpb25UeXBlOjpFeHRJbmZvIEV4dEluZm87CisgICAgYm9vbCBWYXJpYWRpYyA6IDE7CisgICAgYm9vbCBIYXNUcmFpbGluZ1JldHVybiA6IDE7CisgICAgdW5zaWduZWQgY2hhciBUeXBlUXVhbHMgPSAwOworICAgIFJlZlF1YWxpZmllcktpbmQgUmVmUXVhbGlmaWVyID0gUlFfTm9uZTsKKyAgICBFeGNlcHRpb25TcGVjSW5mbyBFeGNlcHRpb25TcGVjOworICAgIGNvbnN0IEV4dFBhcmFtZXRlckluZm8gKkV4dFBhcmFtZXRlckluZm9zID0gbnVsbHB0cjsKKworICAgIEV4dFByb3RvSW5mbygpCisgICAgICAgIDogVmFyaWFkaWMoZmFsc2UpLCBIYXNUcmFpbGluZ1JldHVybihmYWxzZSkge30KKworICAgIEV4dFByb3RvSW5mbyhDYWxsaW5nQ29udiBDQykKKyAgICAgICAgOiBFeHRJbmZvKENDKSwgVmFyaWFkaWMoZmFsc2UpLCBIYXNUcmFpbGluZ1JldHVybihmYWxzZSkge30KKworICAgIEV4dFByb3RvSW5mbyB3aXRoRXhjZXB0aW9uU3BlYyhjb25zdCBFeGNlcHRpb25TcGVjSW5mbyAmTykgeworICAgICAgRXh0UHJvdG9JbmZvIFJlc3VsdCgqdGhpcyk7CisgICAgICBSZXN1bHQuRXhjZXB0aW9uU3BlYyA9IE87CisgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgfTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7IC8vIEFTVENvbnRleHQgY3JlYXRlcyB0aGVzZS4KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgYXJndW1lbnQgdHlwZXMgdGhhdAorICAvLy8gY29udGFpbiBhbiB1bmV4cGFuZGVkIHBhcmFtZXRlciBwYWNrLgorICBzdGF0aWMgYm9vbCBjb250YWluc0FueVVuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKGNvbnN0IFF1YWxUeXBlICpBcmdBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1BcmdzKSB7CisgICAgZm9yICh1bnNpZ25lZCBJZHggPSAwOyBJZHggPCBudW1BcmdzOyArK0lkeCkKKyAgICAgIGlmIChBcmdBcnJheVtJZHhdLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRnVuY3Rpb25Qcm90b1R5cGUoUXVhbFR5cGUgcmVzdWx0LCBBcnJheVJlZjxRdWFsVHlwZT4gcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBjYW5vbmljYWwsIGNvbnN0IEV4dFByb3RvSW5mbyAmZXBpKTsKKworICAvLy8gVGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIHRoaXMgZnVuY3Rpb24gaGFzLCBub3QgY291bnRpbmcgJy4uLicuCisgIHVuc2lnbmVkIE51bVBhcmFtcyA6IDE1OworCisgIC8vLyBUaGUgbnVtYmVyIG9mIHR5cGVzIGluIHRoZSBleGNlcHRpb24gc3BlYywgaWYgYW55LgorICB1bnNpZ25lZCBOdW1FeGNlcHRpb25zIDogOTsKKworICAvLy8gVGhlIHR5cGUgb2YgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gdGhpcyBmdW5jdGlvbiBoYXMuCisgIHVuc2lnbmVkIEV4Y2VwdGlvblNwZWNUeXBlIDogNDsKKworICAvLy8gV2hldGhlciB0aGlzIGZ1bmN0aW9uIGhhcyBleHRlbmRlZCBwYXJhbWV0ZXIgaW5mb3JtYXRpb24uCisgIHVuc2lnbmVkIEhhc0V4dFBhcmFtZXRlckluZm9zIDogMTsKKworICAvLy8gV2hldGhlciB0aGUgZnVuY3Rpb24gaXMgdmFyaWFkaWMuCisgIHVuc2lnbmVkIFZhcmlhZGljIDogMTsKKworICAvLy8gV2hldGhlciB0aGlzIGZ1bmN0aW9uIGhhcyBhIHRyYWlsaW5nIHJldHVybiB0eXBlLgorICB1bnNpZ25lZCBIYXNUcmFpbGluZ1JldHVybiA6IDE7CisKKyAgLy8gUGFyYW1JbmZvIC0gVGhlcmUgaXMgYW4gdmFyaWFibGUgc2l6ZSBhcnJheSBhZnRlciB0aGUgY2xhc3MgaW4gbWVtb3J5IHRoYXQKKyAgLy8gaG9sZHMgdGhlIHBhcmFtZXRlciB0eXBlcy4KKworICAvLyBFeGNlcHRpb25zIC0gVGhlcmUgaXMgYW5vdGhlciB2YXJpYWJsZSBzaXplIGFycmF5IGFmdGVyIEFyZ0luZm8gdGhhdAorICAvLyBob2xkcyB0aGUgZXhjZXB0aW9uIHR5cGVzLgorCisgIC8vIE5vZXhjZXB0RXhwciAtIEluc3RlYWQgb2YgRXhjZXB0aW9ucywgdGhlcmUgbWF5IGJlIGEgc2luZ2xlIEV4cHIqIHBvaW50aW5nCisgIC8vIHRvIHRoZSBleHByZXNzaW9uIGluIHRoZSBub2V4Y2VwdCgpIHNwZWNpZmllci4KKworICAvLyBFeGNlcHRpb25TcGVjRGVjbCwgRXhjZXB0aW9uU3BlY1RlbXBsYXRlIC0gSW5zdGVhZCBvZiBFeGNlcHRpb25zLCB0aGVyZSBtYXkKKyAgLy8gYmUgYSBwYWlyIG9mIEZ1bmN0aW9uRGVjbCogcG9pbnRpbmcgdG8gdGhlIGZ1bmN0aW9uIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvCisgIC8vIGluc3RhbnRpYXRlIHRoaXMgZnVuY3Rpb24gdHlwZSdzIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLCBhbmQgdGhlIGZ1bmN0aW9uCisgIC8vIGZyb20gd2hpY2ggaXQgc2hvdWxkIGJlIGluc3RhbnRpYXRlZC4KKworICAvLyBFeHRQYXJhbWV0ZXJJbmZvcyAtIEEgdmFyaWFibGUgc2l6ZSBhcnJheSwgZm9sbG93aW5nIHRoZSBleGNlcHRpb24KKyAgLy8gc3BlY2lmaWNhdGlvbiBhbmQgb2YgbGVuZ3RoIE51bVBhcmFtcywgaG9sZGluZyBhbiBFeHRQYXJhbWV0ZXJJbmZvCisgIC8vIGZvciBlYWNoIG9mIHRoZSBwYXJhbWV0ZXJzLiAgVGhpcyBvbmx5IGFwcGVhcnMgaWYgSGFzRXh0UGFyYW1ldGVySW5mb3MKKyAgLy8gaXMgdHJ1ZS4KKworICBjb25zdCBFeHRQYXJhbWV0ZXJJbmZvICpnZXRFeHRQYXJhbWV0ZXJJbmZvc0J1ZmZlcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaGFzRXh0UGFyYW1ldGVySW5mb3MoKSk7CisKKyAgICAvLyBGaW5kIHRoZSBlbmQgb2YgdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLgorICAgIGNvbnN0IGF1dG8gKnB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihleGNlcHRpb25fYmVnaW4oKSk7CisgICAgcHRyICs9IGdldEV4Y2VwdGlvblNwZWNTaXplKCk7CisKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFeHRQYXJhbWV0ZXJJbmZvICo+KHB0cik7CisgIH0KKworICBzaXplX3QgZ2V0RXhjZXB0aW9uU3BlY1NpemUoKSBjb25zdCB7CisgICAgc3dpdGNoIChnZXRFeGNlcHRpb25TcGVjVHlwZSgpKSB7CisgICAgY2FzZSBFU1RfTm9uZTogICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBFU1RfRHluYW1pY05vbmU6ICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBFU1RfTVNBbnk6ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBFU1RfQmFzaWNOb2V4Y2VwdDogICAgcmV0dXJuIDA7CisgICAgY2FzZSBFU1RfVW5wYXJzZWQ6ICAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBFU1RfRHluYW1pYzogICAgICAgICAgcmV0dXJuIGdldE51bUV4Y2VwdGlvbnMoKSAqIHNpemVvZihRdWFsVHlwZSk7CisgICAgY2FzZSBFU1RfQ29tcHV0ZWROb2V4Y2VwdDogcmV0dXJuIHNpemVvZihFeHByKik7CisgICAgY2FzZSBFU1RfVW5pbnN0YW50aWF0ZWQ6ICAgcmV0dXJuIDIgKiBzaXplb2YoRnVuY3Rpb25EZWNsKik7CisgICAgY2FzZSBFU1RfVW5ldmFsdWF0ZWQ6ICAgICAgcmV0dXJuIHNpemVvZihGdW5jdGlvbkRlY2wqKTsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiYmFkIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGtpbmQiKTsKKyAgfQorCitwdWJsaWM6CisgIHVuc2lnbmVkIGdldE51bVBhcmFtcygpIGNvbnN0IHsgcmV0dXJuIE51bVBhcmFtczsgfQorCisgIFF1YWxUeXBlIGdldFBhcmFtVHlwZSh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBOdW1QYXJhbXMgJiYgImludmFsaWQgcGFyYW1ldGVyIGluZGV4Iik7CisgICAgcmV0dXJuIHBhcmFtX3R5cGVfYmVnaW4oKVtpXTsKKyAgfQorCisgIEFycmF5UmVmPFF1YWxUeXBlPiBnZXRQYXJhbVR5cGVzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYocGFyYW1fdHlwZV9iZWdpbigpLCBwYXJhbV90eXBlX2VuZCgpKTsKKyAgfQorCisgIEV4dFByb3RvSW5mbyBnZXRFeHRQcm90b0luZm8oKSBjb25zdCB7CisgICAgRXh0UHJvdG9JbmZvIEVQSTsKKyAgICBFUEkuRXh0SW5mbyA9IGdldEV4dEluZm8oKTsKKyAgICBFUEkuVmFyaWFkaWMgPSBpc1ZhcmlhZGljKCk7CisgICAgRVBJLkhhc1RyYWlsaW5nUmV0dXJuID0gaGFzVHJhaWxpbmdSZXR1cm4oKTsKKyAgICBFUEkuRXhjZXB0aW9uU3BlYy5UeXBlID0gZ2V0RXhjZXB0aW9uU3BlY1R5cGUoKTsKKyAgICBFUEkuVHlwZVF1YWxzID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oZ2V0VHlwZVF1YWxzKCkpOworICAgIEVQSS5SZWZRdWFsaWZpZXIgPSBnZXRSZWZRdWFsaWZpZXIoKTsKKyAgICBpZiAoRVBJLkV4Y2VwdGlvblNwZWMuVHlwZSA9PSBFU1RfRHluYW1pYykgeworICAgICAgRVBJLkV4Y2VwdGlvblNwZWMuRXhjZXB0aW9ucyA9IGV4Y2VwdGlvbnMoKTsKKyAgICB9IGVsc2UgaWYgKEVQSS5FeGNlcHRpb25TcGVjLlR5cGUgPT0gRVNUX0NvbXB1dGVkTm9leGNlcHQpIHsKKyAgICAgIEVQSS5FeGNlcHRpb25TcGVjLk5vZXhjZXB0RXhwciA9IGdldE5vZXhjZXB0RXhwcigpOworICAgIH0gZWxzZSBpZiAoRVBJLkV4Y2VwdGlvblNwZWMuVHlwZSA9PSBFU1RfVW5pbnN0YW50aWF0ZWQpIHsKKyAgICAgIEVQSS5FeGNlcHRpb25TcGVjLlNvdXJjZURlY2wgPSBnZXRFeGNlcHRpb25TcGVjRGVjbCgpOworICAgICAgRVBJLkV4Y2VwdGlvblNwZWMuU291cmNlVGVtcGxhdGUgPSBnZXRFeGNlcHRpb25TcGVjVGVtcGxhdGUoKTsKKyAgICB9IGVsc2UgaWYgKEVQSS5FeGNlcHRpb25TcGVjLlR5cGUgPT0gRVNUX1VuZXZhbHVhdGVkKSB7CisgICAgICBFUEkuRXhjZXB0aW9uU3BlYy5Tb3VyY2VEZWNsID0gZ2V0RXhjZXB0aW9uU3BlY0RlY2woKTsKKyAgICB9CisgICAgaWYgKGhhc0V4dFBhcmFtZXRlckluZm9zKCkpCisgICAgICBFUEkuRXh0UGFyYW1ldGVySW5mb3MgPSBnZXRFeHRQYXJhbWV0ZXJJbmZvc0J1ZmZlcigpOworICAgIHJldHVybiBFUEk7CisgIH0KKworICAvLy8gR2V0IHRoZSBraW5kIG9mIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIG9uIHRoaXMgZnVuY3Rpb24uCisgIEV4Y2VwdGlvblNwZWNpZmljYXRpb25UeXBlIGdldEV4Y2VwdGlvblNwZWNUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxFeGNlcHRpb25TcGVjaWZpY2F0aW9uVHlwZT4oRXhjZXB0aW9uU3BlY1R5cGUpOworICB9CisKKyAgLy8vIFJldHVybiB3aGV0aGVyIHRoaXMgZnVuY3Rpb24gaGFzIGFueSBraW5kIG9mIGV4Y2VwdGlvbiBzcGVjLgorICBib29sIGhhc0V4Y2VwdGlvblNwZWMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEV4Y2VwdGlvblNwZWNUeXBlKCkgIT0gRVNUX05vbmU7CisgIH0KKworICAvLy8gUmV0dXJuIHdoZXRoZXIgdGhpcyBmdW5jdGlvbiBoYXMgYSBkeW5hbWljICh0aHJvdykgZXhjZXB0aW9uIHNwZWMuCisgIGJvb2wgaGFzRHluYW1pY0V4Y2VwdGlvblNwZWMoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRHluYW1pY0V4Y2VwdGlvblNwZWMoZ2V0RXhjZXB0aW9uU3BlY1R5cGUoKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHdoZXRoZXIgdGhpcyBmdW5jdGlvbiBoYXMgYSBub2V4Y2VwdCBleGNlcHRpb24gc3BlYy4KKyAgYm9vbCBoYXNOb2V4Y2VwdEV4Y2VwdGlvblNwZWMoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzTm9leGNlcHRFeGNlcHRpb25TcGVjKGdldEV4Y2VwdGlvblNwZWNUeXBlKCkpOworICB9CisKKyAgLy8vIFJldHVybiB3aGV0aGVyIHRoaXMgZnVuY3Rpb24gaGFzIGEgZGVwZW5kZW50IGV4Y2VwdGlvbiBzcGVjLgorICBib29sIGhhc0RlcGVuZGVudEV4Y2VwdGlvblNwZWMoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHdoZXRoZXIgdGhpcyBmdW5jdGlvbiBoYXMgYW4gaW5zdGFudGlhdGlvbi1kZXBlbmRlbnQgZXhjZXB0aW9uCisgIC8vLyBzcGVjLgorICBib29sIGhhc0luc3RhbnRpYXRpb25EZXBlbmRlbnRFeGNlcHRpb25TcGVjKCkgY29uc3Q7CisKKyAgLy8vIFJlc3VsdCB0eXBlIG9mIGdldE5vZXhjZXB0U3BlYygpLgorICBlbnVtIE5vZXhjZXB0UmVzdWx0IHsKKyAgICAvLy8gVGhlcmUgaXMgbm8gbm9leGNlcHQgc3BlY2lmaWVyLgorICAgIE5SX05vTm9leGNlcHQsCisKKyAgICAvLy8gVGhlIG5vZXhjZXB0IHNwZWNpZmllciBoYXMgYSBiYWQgZXhwcmVzc2lvbi4KKyAgICBOUl9CYWROb2V4Y2VwdCwKKworICAgIC8vLyBUaGUgbm9leGNlcHQgc3BlY2lmaWVyIGlzIGRlcGVuZGVudC4KKyAgICBOUl9EZXBlbmRlbnQsCisKKyAgICAvLy8gVGhlIG5vZXhjZXB0IHNwZWNpZmllciBldmFsdWF0ZXMgdG8gZmFsc2UuCisgICAgTlJfVGhyb3csCisKKyAgICAvLy8gVGhlIG5vZXhjZXB0IHNwZWNpZmllciBldmFsdWF0ZXMgdG8gdHJ1ZS4KKyAgICBOUl9Ob3Rocm93CisgIH07CisKKyAgLy8vIEdldCB0aGUgbWVhbmluZyBvZiB0aGUgbm9leGNlcHQgc3BlYyBvbiB0aGlzIGZ1bmN0aW9uLCBpZiBhbnkuCisgIE5vZXhjZXB0UmVzdWx0IGdldE5vZXhjZXB0U3BlYyhjb25zdCBBU1RDb250ZXh0ICZDdHgpIGNvbnN0OworICB1bnNpZ25lZCBnZXROdW1FeGNlcHRpb25zKCkgY29uc3QgeyByZXR1cm4gTnVtRXhjZXB0aW9uczsgfQorICBRdWFsVHlwZSBnZXRFeGNlcHRpb25UeXBlKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IE51bUV4Y2VwdGlvbnMgJiYgIkludmFsaWQgZXhjZXB0aW9uIG51bWJlciEiKTsKKyAgICByZXR1cm4gZXhjZXB0aW9uX2JlZ2luKClbaV07CisgIH0KKyAgRXhwciAqZ2V0Tm9leGNlcHRFeHByKCkgY29uc3QgeworICAgIGlmIChnZXRFeGNlcHRpb25TcGVjVHlwZSgpICE9IEVTVF9Db21wdXRlZE5vZXhjZXB0KQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgLy8gTm9leGNlcHRFeHByIHNpdHMgd2hlcmUgdGhlIGFyZ3VtZW50cyBlbmQuCisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEV4cHIgKmNvbnN0ICo+KHBhcmFtX3R5cGVfZW5kKCkpOworICB9CisKKyAgLy8vIFxicmllZiBJZiB0aGlzIGZ1bmN0aW9uIHR5cGUgaGFzIGFuIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIHdoaWNoIGhhc24ndAorICAvLy8gYmVlbiBkZXRlcm1pbmVkIHlldCAoZWl0aGVyIGJlY2F1c2UgaXQgaGFzIG5vdCBiZWVuIGV2YWx1YXRlZCBvciBiZWNhdXNlCisgIC8vLyBpdCBoYXMgbm90IGJlZW4gaW5zdGFudGlhdGVkKSwgdGhpcyBpcyB0aGUgZnVuY3Rpb24gd2hvc2UgZXhjZXB0aW9uCisgIC8vLyBzcGVjaWZpY2F0aW9uIGlzIHJlcHJlc2VudGVkIGJ5IHRoaXMgdHlwZS4KKyAgRnVuY3Rpb25EZWNsICpnZXRFeGNlcHRpb25TcGVjRGVjbCgpIGNvbnN0IHsKKyAgICBpZiAoZ2V0RXhjZXB0aW9uU3BlY1R5cGUoKSAhPSBFU1RfVW5pbnN0YW50aWF0ZWQgJiYKKyAgICAgICAgZ2V0RXhjZXB0aW9uU3BlY1R5cGUoKSAhPSBFU1RfVW5ldmFsdWF0ZWQpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGdW5jdGlvbkRlY2wgKmNvbnN0ICo+KHBhcmFtX3R5cGVfZW5kKCkpWzBdOworICB9CisKKyAgLy8vIFxicmllZiBJZiB0aGlzIGZ1bmN0aW9uIHR5cGUgaGFzIGFuIHVuaW5zdGFudGlhdGVkIGV4Y2VwdGlvbgorICAvLy8gc3BlY2lmaWNhdGlvbiwgdGhpcyBpcyB0aGUgZnVuY3Rpb24gd2hvc2UgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24KKyAgLy8vIHNob3VsZCBiZSBpbnN0YW50aWF0ZWQgdG8gZmluZCB0aGUgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gZm9yCisgIC8vLyB0aGlzIHR5cGUuCisgIEZ1bmN0aW9uRGVjbCAqZ2V0RXhjZXB0aW9uU3BlY1RlbXBsYXRlKCkgY29uc3QgeworICAgIGlmIChnZXRFeGNlcHRpb25TcGVjVHlwZSgpICE9IEVTVF9Vbmluc3RhbnRpYXRlZCkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEZ1bmN0aW9uRGVjbCAqY29uc3QgKj4ocGFyYW1fdHlwZV9lbmQoKSlbMV07CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBmdW5jdGlvbiB0eXBlIGhhcyBhIG5vbi10aHJvd2luZyBleGNlcHRpb24KKyAgLy8vIHNwZWNpZmljYXRpb24uCisgIENhblRocm93UmVzdWx0IGNhblRocm93KGNvbnN0IEFTVENvbnRleHQgJkN0eCkgY29uc3Q7CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgZnVuY3Rpb24gdHlwZSBoYXMgYSBub24tdGhyb3dpbmcgZXhjZXB0aW9uCisgIC8vLyBzcGVjaWZpY2F0aW9uLiBJZiB0aGlzIGRlcGVuZHMgb24gdGVtcGxhdGUgYXJndW1lbnRzLCByZXR1cm5zCisgIC8vLyBcYyBSZXN1bHRJZkRlcGVuZGVudC4KKyAgYm9vbCBpc05vdGhyb3coY29uc3QgQVNUQ29udGV4dCAmQ3R4LCBib29sIFJlc3VsdElmRGVwZW5kZW50ID0gZmFsc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVzdWx0SWZEZXBlbmRlbnQgPyBjYW5UaHJvdyhDdHgpICE9IENUX0NhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNhblRocm93KEN0eCkgPT0gQ1RfQ2Fubm90OworICB9CisKKyAgYm9vbCBpc1ZhcmlhZGljKCkgY29uc3QgeyByZXR1cm4gVmFyaWFkaWM7IH0KKworICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgZnVuY3Rpb24gcHJvdG90eXBlIGNvbnRhaW5zIGEKKyAgLy8vIHBhcmFtZXRlciBwYWNrIGF0IHRoZSBlbmQuCisgIC8vLworICAvLy8gQSBmdW5jdGlvbiB0ZW1wbGF0ZSB3aG9zZSBsYXN0IHBhcmFtZXRlciBpcyBhIHBhcmFtZXRlciBwYWNrIGNhbiBiZQorICAvLy8gY2FsbGVkIHdpdGggYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBhcmd1bWVudHMsIG11Y2ggbGlrZSBhIHZhcmlhZGljCisgIC8vLyBmdW5jdGlvbi4KKyAgYm9vbCBpc1RlbXBsYXRlVmFyaWFkaWMoKSBjb25zdDsKKworICBib29sIGhhc1RyYWlsaW5nUmV0dXJuKCkgY29uc3QgeyByZXR1cm4gSGFzVHJhaWxpbmdSZXR1cm47IH0KKworICB1bnNpZ25lZCBnZXRUeXBlUXVhbHMoKSBjb25zdCB7IHJldHVybiBGdW5jdGlvblR5cGU6OmdldFR5cGVRdWFscygpOyB9CisKKyAgLy8vIFJldHJpZXZlIHRoZSByZWYtcXVhbGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uIHR5cGUuCisgIFJlZlF1YWxpZmllcktpbmQgZ2V0UmVmUXVhbGlmaWVyKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZWZRdWFsaWZpZXJLaW5kPihGdW5jdGlvblR5cGVCaXRzLlJlZlF1YWxpZmllcik7CisgIH0KKworICB1c2luZyBwYXJhbV90eXBlX2l0ZXJhdG9yID0gY29uc3QgUXVhbFR5cGUgKjsKKyAgdXNpbmcgcGFyYW1fdHlwZV9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPHBhcmFtX3R5cGVfaXRlcmF0b3I+OworCisgIHBhcmFtX3R5cGVfcmFuZ2UgcGFyYW1fdHlwZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHBhcmFtX3R5cGVfcmFuZ2UocGFyYW1fdHlwZV9iZWdpbigpLCBwYXJhbV90eXBlX2VuZCgpKTsKKyAgfQorCisgIHBhcmFtX3R5cGVfaXRlcmF0b3IgcGFyYW1fdHlwZV9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBRdWFsVHlwZSAqPih0aGlzKzEpOworICB9CisKKyAgcGFyYW1fdHlwZV9pdGVyYXRvciBwYXJhbV90eXBlX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcGFyYW1fdHlwZV9iZWdpbigpICsgTnVtUGFyYW1zOworICB9CisKKyAgdXNpbmcgZXhjZXB0aW9uX2l0ZXJhdG9yID0gY29uc3QgUXVhbFR5cGUgKjsKKworICBBcnJheVJlZjxRdWFsVHlwZT4gZXhjZXB0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKGV4Y2VwdGlvbl9iZWdpbigpLCBleGNlcHRpb25fZW5kKCkpOworICB9CisKKyAgZXhjZXB0aW9uX2l0ZXJhdG9yIGV4Y2VwdGlvbl9iZWdpbigpIGNvbnN0IHsKKyAgICAvLyBleGNlcHRpb25zIGJlZ2luIHdoZXJlIGFyZ3VtZW50cyBlbmQKKyAgICByZXR1cm4gcGFyYW1fdHlwZV9lbmQoKTsKKyAgfQorCisgIGV4Y2VwdGlvbl9pdGVyYXRvciBleGNlcHRpb25fZW5kKCkgY29uc3QgeworICAgIGlmIChnZXRFeGNlcHRpb25TcGVjVHlwZSgpICE9IEVTVF9EeW5hbWljKQorICAgICAgcmV0dXJuIGV4Y2VwdGlvbl9iZWdpbigpOworICAgIHJldHVybiBleGNlcHRpb25fYmVnaW4oKSArIE51bUV4Y2VwdGlvbnM7CisgIH0KKworICAvLy8gSXMgdGhlcmUgYW55IGludGVyZXN0aW5nIGV4dHJhIGluZm9ybWF0aW9uIGZvciBhbnkgb2YgdGhlIHBhcmFtZXRlcnMKKyAgLy8vIG9mIHRoaXMgZnVuY3Rpb24gdHlwZT8KKyAgYm9vbCBoYXNFeHRQYXJhbWV0ZXJJbmZvcygpIGNvbnN0IHsgcmV0dXJuIEhhc0V4dFBhcmFtZXRlckluZm9zOyB9CisgIEFycmF5UmVmPEV4dFBhcmFtZXRlckluZm8+IGdldEV4dFBhcmFtZXRlckluZm9zKCkgY29uc3QgeworICAgIGFzc2VydChoYXNFeHRQYXJhbWV0ZXJJbmZvcygpKTsKKyAgICByZXR1cm4gQXJyYXlSZWY8RXh0UGFyYW1ldGVySW5mbz4oZ2V0RXh0UGFyYW1ldGVySW5mb3NCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TnVtUGFyYW1zKCkpOworICB9CisKKyAgLy8vIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkgb2YgZXh0cmEgcGFyYW1ldGVyCisgIC8vLyBpbmZvcm1hdGlvbiwgaWYgcHJlc2VudCwgb3IgZWxzZSBudWxsIGlmIG5vbmUgb2YgdGhlIHBhcmFtZXRlcnMKKyAgLy8vIGNhcnJ5IGl0LiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGdldEV4dFByb3RvSW5mbygpLkV4dFBhcmFtZXRlckluZm9zLgorICBjb25zdCBFeHRQYXJhbWV0ZXJJbmZvICpnZXRFeHRQYXJhbWV0ZXJJbmZvc09yTnVsbCgpIGNvbnN0IHsKKyAgICBpZiAoIWhhc0V4dFBhcmFtZXRlckluZm9zKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gZ2V0RXh0UGFyYW1ldGVySW5mb3NCdWZmZXIoKTsKKyAgfQorCisgIEV4dFBhcmFtZXRlckluZm8gZ2V0RXh0UGFyYW1ldGVySW5mbyh1bnNpZ25lZCBJKSBjb25zdCB7CisgICAgYXNzZXJ0KEkgPCBnZXROdW1QYXJhbXMoKSAmJiAicGFyYW1ldGVyIGluZGV4IG91dCBvZiByYW5nZSIpOworICAgIGlmIChoYXNFeHRQYXJhbWV0ZXJJbmZvcygpKQorICAgICAgcmV0dXJuIGdldEV4dFBhcmFtZXRlckluZm9zQnVmZmVyKClbSV07CisgICAgcmV0dXJuIEV4dFBhcmFtZXRlckluZm8oKTsKKyAgfQorCisgIFBhcmFtZXRlckFCSSBnZXRQYXJhbWV0ZXJBQkkodW5zaWduZWQgSSkgY29uc3QgeworICAgIGFzc2VydChJIDwgZ2V0TnVtUGFyYW1zKCkgJiYgInBhcmFtZXRlciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICBpZiAoaGFzRXh0UGFyYW1ldGVySW5mb3MoKSkKKyAgICAgIHJldHVybiBnZXRFeHRQYXJhbWV0ZXJJbmZvc0J1ZmZlcigpW0ldLmdldEFCSSgpOworICAgIHJldHVybiBQYXJhbWV0ZXJBQkk6Ok9yZGluYXJ5OworICB9CisKKyAgYm9vbCBpc1BhcmFtQ29uc3VtZWQodW5zaWduZWQgSSkgY29uc3QgeworICAgIGFzc2VydChJIDwgZ2V0TnVtUGFyYW1zKCkgJiYgInBhcmFtZXRlciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICBpZiAoaGFzRXh0UGFyYW1ldGVySW5mb3MoKSkKKyAgICAgIHJldHVybiBnZXRFeHRQYXJhbWV0ZXJJbmZvc0J1ZmZlcigpW0ldLmlzQ29uc3VtZWQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIGlzU3VnYXJlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIFF1YWxUeXBlIGRlc3VnYXIoKSBjb25zdCB7IHJldHVybiBRdWFsVHlwZSh0aGlzLCAwKTsgfQorCisgIHZvaWQgcHJpbnRFeGNlcHRpb25TcGVjaWZpY2F0aW9uKHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3Q7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFR5cGVDbGFzcygpID09IEZ1bmN0aW9uUHJvdG87CisgIH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIGNvbnN0IEFTVENvbnRleHQgJkN0eCk7CisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIFF1YWxUeXBlIFJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICBwYXJhbV90eXBlX2l0ZXJhdG9yIEFyZ1R5cywgdW5zaWduZWQgTnVtQXJncywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHRQcm90b0luZm8gJkVQSSwgY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIENhbm9uaWNhbCk7Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgdGhlIGRlcGVuZGVudCB0eXBlIG5hbWVkIGJ5IGEgZGVwZW5kZW50bHktc2NvcGVkCisvLy8gdHlwZW5hbWUgdXNpbmcgZGVjbGFyYXRpb24sIGUuZy4KKy8vLyAgIHVzaW5nIHR5cGVuYW1lIEJhc2U8VD46OmZvbzsKKy8vLworLy8vIFRlbXBsYXRlIGluc3RhbnRpYXRpb24gdHVybnMgdGhlc2UgaW50byB0aGUgdW5kZXJseWluZyB0eXBlLgorY2xhc3MgVW5yZXNvbHZlZFVzaW5nVHlwZSA6IHB1YmxpYyBUeXBlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7IC8vIEFTVENvbnRleHQgY3JlYXRlcyB0aGVzZS4KKworICBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wgKkRlY2w7CisKKyAgVW5yZXNvbHZlZFVzaW5nVHlwZShjb25zdCBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wgKkQpCisgICAgICA6IFR5cGUoVW5yZXNvbHZlZFVzaW5nLCBRdWFsVHlwZSgpLCB0cnVlLCB0cnVlLCBmYWxzZSwKKyAgICAgICAgICAgICAvKkNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2s9Ki9mYWxzZSksCisgICAgICAgIERlY2woY29uc3RfY2FzdDxVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wqPihEKSkge30KKworcHVibGljOgorICBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wgKmdldERlY2woKSBjb25zdCB7IHJldHVybiBEZWNsOyB9CisKKyAgYm9vbCBpc1N1Z2FyZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICBRdWFsVHlwZSBkZXN1Z2FyKCkgY29uc3QgeyByZXR1cm4gUXVhbFR5cGUodGhpcywgMCk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gVW5yZXNvbHZlZFVzaW5nOworICB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgcmV0dXJuIFByb2ZpbGUoSUQsIERlY2wpOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwKKyAgICAgICAgICAgICAgICAgICAgICBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wgKkQpIHsKKyAgICBJRC5BZGRQb2ludGVyKEQpOworICB9Cit9OworCitjbGFzcyBUeXBlZGVmVHlwZSA6IHB1YmxpYyBUeXBlIHsKKyAgVHlwZWRlZk5hbWVEZWNsICpEZWNsOworCitwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBBU1RDb250ZXh0OyAvLyBBU1RDb250ZXh0IGNyZWF0ZXMgdGhlc2UuCisKKyAgVHlwZWRlZlR5cGUoVHlwZUNsYXNzIHRjLCBjb25zdCBUeXBlZGVmTmFtZURlY2wgKkQsIFF1YWxUeXBlIGNhbikKKyAgICAgIDogVHlwZSh0YywgY2FuLCBjYW4tPmlzRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgIGNhbi0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgIGNhbi0+aXNWYXJpYWJseU1vZGlmaWVkVHlwZSgpLAorICAgICAgICAgICAgIC8qQ29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaz0qL2ZhbHNlKSwKKyAgICAgICAgRGVjbChjb25zdF9jYXN0PFR5cGVkZWZOYW1lRGVjbCo+KEQpKSB7CisgICAgYXNzZXJ0KCFpc2E8VHlwZWRlZlR5cGU+KGNhbikgJiYgIkludmFsaWQgY2Fub25pY2FsIHR5cGUiKTsKKyAgfQorCitwdWJsaWM6CisgIFR5cGVkZWZOYW1lRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IHsgcmV0dXJuIERlY2w7IH0KKworICBib29sIGlzU3VnYXJlZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeyByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gVHlwZWRlZjsgfQorfTsKKworLy8vIFJlcHJlc2VudHMgYSBgdHlwZW9mYCAob3IgX190eXBlb2ZfXykgZXhwcmVzc2lvbiAoYSBHQ0MgZXh0ZW5zaW9uKS4KK2NsYXNzIFR5cGVPZkV4cHJUeXBlIDogcHVibGljIFR5cGUgeworICBFeHByICpUT0V4cHI7CisKK3Byb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7IC8vIEFTVENvbnRleHQgY3JlYXRlcyB0aGVzZS4KKworICBUeXBlT2ZFeHByVHlwZShFeHByICpFLCBRdWFsVHlwZSBjYW4gPSBRdWFsVHlwZSgpKTsKKworcHVibGljOgorICBFeHByICpnZXRVbmRlcmx5aW5nRXhwcigpIGNvbnN0IHsgcmV0dXJuIFRPRXhwcjsgfQorCisgIC8vLyBcYnJpZWYgUmVtb3ZlIGEgc2luZ2xlIGxldmVsIG9mIHN1Z2FyLgorICBRdWFsVHlwZSBkZXN1Z2FyKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIGRpcmVjdGx5IHByb3ZpZGVzIHN1Z2FyLgorICBib29sIGlzU3VnYXJlZCgpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeyByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gVHlwZU9mRXhwcjsgfQorfTsKKworLy8vIFxicmllZiBJbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBjYW5vbmljYWwsIGRlcGVuZGVudAorLy8vIGB0eXBlb2YoZXhwcilgIHR5cGVzLgorLy8vCisvLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIEFTVENvbnRleHQgdG8gbWFuYWdlCisvLy8gY2Fub25pY2FsLCBkZXBlbmRlbnQgdHlwZXMsIG9ubHkuIENsaWVudHMgd2lsbCBvbmx5IHNlZSBpbnN0YW5jZXMKKy8vLyBvZiB0aGlzIGNsYXNzIHZpYSBUeXBlT2ZFeHByVHlwZSBub2Rlcy4KK2NsYXNzIERlcGVuZGVudFR5cGVPZkV4cHJUeXBlCisgIDogcHVibGljIFR5cGVPZkV4cHJUeXBlLCBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworICBjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0OworCitwdWJsaWM6CisgIERlcGVuZGVudFR5cGVPZkV4cHJUeXBlKGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQsIEV4cHIgKkUpCisgICAgICA6IFR5cGVPZkV4cHJUeXBlKEUpLCBDb250ZXh0KENvbnRleHQpIHt9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgUHJvZmlsZShJRCwgQ29udGV4dCwgZ2V0VW5kZXJseWluZ0V4cHIoKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELCBjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkUpOworfTsKKworLy8vIFJlcHJlc2VudHMgYHR5cGVvZih0eXBlKWAsIGEgR0NDIGV4dGVuc2lvbi4KK2NsYXNzIFR5cGVPZlR5cGUgOiBwdWJsaWMgVHlwZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RDb250ZXh0OyAvLyBBU1RDb250ZXh0IGNyZWF0ZXMgdGhlc2UuCisKKyAgUXVhbFR5cGUgVE9UeXBlOworCisgIFR5cGVPZlR5cGUoUXVhbFR5cGUgVCwgUXVhbFR5cGUgY2FuKQorICAgICAgOiBUeXBlKFR5cGVPZiwgY2FuLCBULT5pc0RlcGVuZGVudFR5cGUoKSwKKyAgICAgICAgICAgICBULT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgICAgVC0+aXNWYXJpYWJseU1vZGlmaWVkVHlwZSgpLAorICAgICAgICAgICAgIFQtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIFRPVHlwZShUKSB7CisgICAgYXNzZXJ0KCFpc2E8VHlwZWRlZlR5cGU+KGNhbikgJiYgIkludmFsaWQgY2Fub25pY2FsIHR5cGUiKTsKKyAgfQorCitwdWJsaWM6CisgIFF1YWxUeXBlIGdldFVuZGVybHlpbmdUeXBlKCkgY29uc3QgeyByZXR1cm4gVE9UeXBlOyB9CisKKyAgLy8vIFxicmllZiBSZW1vdmUgYSBzaW5nbGUgbGV2ZWwgb2Ygc3VnYXIuCisgIFF1YWxUeXBlIGRlc3VnYXIoKSBjb25zdCB7IHJldHVybiBnZXRVbmRlcmx5aW5nVHlwZSgpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIGRpcmVjdGx5IHByb3ZpZGVzIHN1Z2FyLgorICBib29sIGlzU3VnYXJlZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsgcmV0dXJuIFQtPmdldFR5cGVDbGFzcygpID09IFR5cGVPZjsgfQorfTsKKworLy8vIFJlcHJlc2VudHMgdGhlIHR5cGUgYGRlY2x0eXBlKGV4cHIpYCAoQysrMTEpLgorY2xhc3MgRGVjbHR5cGVUeXBlIDogcHVibGljIFR5cGUgeworICBFeHByICpFOworICBRdWFsVHlwZSBVbmRlcmx5aW5nVHlwZTsKKworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsgLy8gQVNUQ29udGV4dCBjcmVhdGVzIHRoZXNlLgorCisgIERlY2x0eXBlVHlwZShFeHByICpFLCBRdWFsVHlwZSB1bmRlcmx5aW5nVHlwZSwgUXVhbFR5cGUgY2FuID0gUXVhbFR5cGUoKSk7CisKK3B1YmxpYzoKKyAgRXhwciAqZ2V0VW5kZXJseWluZ0V4cHIoKSBjb25zdCB7IHJldHVybiBFOyB9CisgIFF1YWxUeXBlIGdldFVuZGVybHlpbmdUeXBlKCkgY29uc3QgeyByZXR1cm4gVW5kZXJseWluZ1R5cGU7IH0KKworICAvLy8gXGJyaWVmIFJlbW92ZSBhIHNpbmdsZSBsZXZlbCBvZiBzdWdhci4KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBkaXJlY3RseSBwcm92aWRlcyBzdWdhci4KKyAgYm9vbCBpc1N1Z2FyZWQoKSBjb25zdDsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsgcmV0dXJuIFQtPmdldFR5cGVDbGFzcygpID09IERlY2x0eXBlOyB9Cit9OworCisvLy8gXGJyaWVmIEludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGNhbm9uaWNhbCwgZGVwZW5kZW50CisvLy8gZGVjbHR5cGUoZXhwcikgdHlwZXMuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgQVNUQ29udGV4dCB0byBtYW5hZ2UKKy8vLyBjYW5vbmljYWwsIGRlcGVuZGVudCB0eXBlcywgb25seS4gQ2xpZW50cyB3aWxsIG9ubHkgc2VlIGluc3RhbmNlcworLy8vIG9mIHRoaXMgY2xhc3MgdmlhIERlY2x0eXBlVHlwZSBub2Rlcy4KK2NsYXNzIERlcGVuZGVudERlY2x0eXBlVHlwZSA6IHB1YmxpYyBEZWNsdHlwZVR5cGUsIHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CisgIGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQ7CisKK3B1YmxpYzoKKyAgRGVwZW5kZW50RGVjbHR5cGVUeXBlKGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQsIEV4cHIgKkUpOworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIFByb2ZpbGUoSUQsIENvbnRleHQsIGdldFVuZGVybHlpbmdFeHByKCkpOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICBFeHByICpFKTsKK307CisKKy8vLyBBIHVuYXJ5IHR5cGUgdHJhbnNmb3JtLCB3aGljaCBpcyBhIHR5cGUgY29uc3RydWN0ZWQgZnJvbSBhbm90aGVyLgorY2xhc3MgVW5hcnlUcmFuc2Zvcm1UeXBlIDogcHVibGljIFR5cGUgeworcHVibGljOgorICBlbnVtIFVUVEtpbmQgeworICAgIEVudW1VbmRlcmx5aW5nVHlwZQorICB9OworCitwcml2YXRlOgorICAvLy8gVGhlIHVudHJhbnNmb3JtZWQgdHlwZS4KKyAgUXVhbFR5cGUgQmFzZVR5cGU7CisKKyAgLy8vIFRoZSB0cmFuc2Zvcm1lZCB0eXBlIGlmIG5vdCBkZXBlbmRlbnQsIG90aGVyd2lzZSB0aGUgc2FtZSBhcyBCYXNlVHlwZS4KKyAgUXVhbFR5cGUgVW5kZXJseWluZ1R5cGU7CisKKyAgVVRUS2luZCBVS2luZDsKKworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsKKworICBVbmFyeVRyYW5zZm9ybVR5cGUoUXVhbFR5cGUgQmFzZVR5LCBRdWFsVHlwZSBVbmRlcmx5aW5nVHksIFVUVEtpbmQgVUtpbmQsCisgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBDYW5vbmljYWxUeSk7CisKK3B1YmxpYzoKKyAgYm9vbCBpc1N1Z2FyZWQoKSBjb25zdCB7IHJldHVybiAhaXNEZXBlbmRlbnRUeXBlKCk7IH0KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0IHsgcmV0dXJuIFVuZGVybHlpbmdUeXBlOyB9CisKKyAgUXVhbFR5cGUgZ2V0VW5kZXJseWluZ1R5cGUoKSBjb25zdCB7IHJldHVybiBVbmRlcmx5aW5nVHlwZTsgfQorICBRdWFsVHlwZSBnZXRCYXNlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIEJhc2VUeXBlOyB9CisKKyAgVVRUS2luZCBnZXRVVFRLaW5kKCkgY29uc3QgeyByZXR1cm4gVUtpbmQ7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gVW5hcnlUcmFuc2Zvcm07CisgIH0KK307CisKKy8vLyBcYnJpZWYgSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgY2Fub25pY2FsLCBkZXBlbmRlbnQKKy8vLyBfX3VuZGVybHlpbmdfdHlwZSh0eXBlKSB0eXBlcy4KKy8vLworLy8vIFRoaXMgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBBU1RDb250ZXh0IHRvIG1hbmFnZQorLy8vIGNhbm9uaWNhbCwgZGVwZW5kZW50IHR5cGVzLCBvbmx5LiBDbGllbnRzIHdpbGwgb25seSBzZWUgaW5zdGFuY2VzCisvLy8gb2YgdGhpcyBjbGFzcyB2aWEgVW5hcnlUcmFuc2Zvcm1UeXBlIG5vZGVzLgorY2xhc3MgRGVwZW5kZW50VW5hcnlUcmFuc2Zvcm1UeXBlIDogcHVibGljIFVuYXJ5VHJhbnNmb3JtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CitwdWJsaWM6CisgIERlcGVuZGVudFVuYXJ5VHJhbnNmb3JtVHlwZShjb25zdCBBU1RDb250ZXh0ICZDLCBRdWFsVHlwZSBCYXNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVUVEtpbmQgVUtpbmQpOworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIFByb2ZpbGUoSUQsIGdldEJhc2VUeXBlKCksIGdldFVUVEtpbmQoKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELCBRdWFsVHlwZSBCYXNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBVVFRLaW5kIFVLaW5kKSB7CisgICAgSUQuQWRkUG9pbnRlcihCYXNlVHlwZS5nZXRBc09wYXF1ZVB0cigpKTsKKyAgICBJRC5BZGRJbnRlZ2VyKCh1bnNpZ25lZClVS2luZCk7CisgIH0KK307CisKK2NsYXNzIFRhZ1R5cGUgOiBwdWJsaWMgVHlwZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RSZWFkZXI7CisKKyAgLy8vIFN0b3JlcyB0aGUgVGFnRGVjbCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0eXBlLiBUaGUgZGVjbCBtYXkgcG9pbnQgdG8gYW55CisgIC8vLyBUYWdEZWNsIHRoYXQgZGVjbGFyZXMgdGhlIGVudGl0eS4KKyAgVGFnRGVjbCAqZGVjbDsKKworcHJvdGVjdGVkOgorICBUYWdUeXBlKFR5cGVDbGFzcyBUQywgY29uc3QgVGFnRGVjbCAqRCwgUXVhbFR5cGUgY2FuKTsKKworcHVibGljOgorICBUYWdEZWNsICpnZXREZWNsKCkgY29uc3Q7CisKKyAgLy8vIERldGVybWluZXMgd2hldGhlciB0aGlzIHR5cGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGVmaW5lZC4KKyAgYm9vbCBpc0JlaW5nRGVmaW5lZCgpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlQ2xhc3MoKSA+PSBUYWdGaXJzdCAmJiBULT5nZXRUeXBlQ2xhc3MoKSA8PSBUYWdMYXN0OworICB9Cit9OworCisvLy8gQSBoZWxwZXIgY2xhc3MgdGhhdCBhbGxvd3MgdGhlIHVzZSBvZiBpc2EvY2FzdC9keW5jYXN0CisvLy8gdG8gZGV0ZWN0IFRhZ1R5cGUgb2JqZWN0cyBvZiBzdHJ1Y3RzL3VuaW9ucy9jbGFzc2VzLgorY2xhc3MgUmVjb3JkVHlwZSA6IHB1YmxpYyBUYWdUeXBlIHsKK3Byb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7IC8vIEFTVENvbnRleHQgY3JlYXRlcyB0aGVzZS4KKworICBleHBsaWNpdCBSZWNvcmRUeXBlKGNvbnN0IFJlY29yZERlY2wgKkQpCisgICAgICA6IFRhZ1R5cGUoUmVjb3JkLCByZWludGVycHJldF9jYXN0PGNvbnN0IFRhZ0RlY2wqPihEKSwgUXVhbFR5cGUoKSkge30KKyAgZXhwbGljaXQgUmVjb3JkVHlwZShUeXBlQ2xhc3MgVEMsIFJlY29yZERlY2wgKkQpCisgICAgICA6IFRhZ1R5cGUoVEMsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVGFnRGVjbCo+KEQpLCBRdWFsVHlwZSgpKSB7fQorCitwdWJsaWM6CisgIFJlY29yZERlY2wgKmdldERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UmVjb3JkRGVjbCo+KFRhZ1R5cGU6OmdldERlY2woKSk7CisgIH0KKworICAvLy8gUmVjdXJzaXZlbHkgY2hlY2sgYWxsIGZpZWxkcyBpbiB0aGUgcmVjb3JkIGZvciBjb25zdC1uZXNzLiBJZiBhbnkgZmllbGQKKyAgLy8vIGlzIGRlY2xhcmVkIGNvbnN0LCByZXR1cm4gdHJ1ZS4gT3RoZXJ3aXNlLCByZXR1cm4gZmFsc2UuCisgIGJvb2wgaGFzQ29uc3RGaWVsZHMoKSBjb25zdDsKKworICBib29sIGlzU3VnYXJlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIFF1YWxUeXBlIGRlc3VnYXIoKSBjb25zdCB7IHJldHVybiBRdWFsVHlwZSh0aGlzLCAwKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeyByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gUmVjb3JkOyB9Cit9OworCisvLy8gQSBoZWxwZXIgY2xhc3MgdGhhdCBhbGxvd3MgdGhlIHVzZSBvZiBpc2EvY2FzdC9keW5jYXN0CisvLy8gdG8gZGV0ZWN0IFRhZ1R5cGUgb2JqZWN0cyBvZiBlbnVtcy4KK2NsYXNzIEVudW1UeXBlIDogcHVibGljIFRhZ1R5cGUgeworICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsgLy8gQVNUQ29udGV4dCBjcmVhdGVzIHRoZXNlLgorCisgIGV4cGxpY2l0IEVudW1UeXBlKGNvbnN0IEVudW1EZWNsICpEKQorICAgICAgOiBUYWdUeXBlKEVudW0sIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVGFnRGVjbCo+KEQpLCBRdWFsVHlwZSgpKSB7fQorCitwdWJsaWM6CisgIEVudW1EZWNsICpnZXREZWNsKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEVudW1EZWNsKj4oVGFnVHlwZTo6Z2V0RGVjbCgpKTsKKyAgfQorCisgIGJvb2wgaXNTdWdhcmVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0IHsgcmV0dXJuIFF1YWxUeXBlKHRoaXMsIDApOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7IHJldHVybiBULT5nZXRUeXBlQ2xhc3MoKSA9PSBFbnVtOyB9Cit9OworCisvLy8gQW4gYXR0cmlidXRlZCB0eXBlIGlzIGEgdHlwZSB0byB3aGljaCBhIHR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIGFwcGxpZWQuCisvLy8KKy8vLyBUaGUgIm1vZGlmaWVkIHR5cGUiIGlzIHRoZSBmdWxseS1zdWdhcmVkIHR5cGUgdG8gd2hpY2ggdGhlIGF0dHJpYnV0ZWQKKy8vLyB0eXBlIHdhcyBhcHBsaWVkOyBnZW5lcmFsbHkgaXQgaXMgbm90IGNhbm9uaWNhbGx5IGVxdWl2YWxlbnQgdG8gdGhlCisvLy8gYXR0cmlidXRlZCB0eXBlLiBUaGUgImVxdWl2YWxlbnQgdHlwZSIgaXMgdGhlIG1pbmltYWxseS1kZXN1Z2FyZWQgdHlwZQorLy8vIHdoaWNoIHRoZSB0eXBlIGlzIGNhbm9uaWNhbGx5IGVxdWl2YWxlbnQgdG8uCisvLy8KKy8vLyBGb3IgZXhhbXBsZSwgaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVkIHR5cGU6CisvLy8gICAgIGludDMyX3QgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkKKy8vLyAgIC0gdGhlIG1vZGlmaWVkIHR5cGUgaXMgdGhlIFR5cGVkZWZUeXBlIGZvciBpbnQzMl90CisvLy8gICAtIHRoZSBlcXVpdmFsZW50IHR5cGUgaXMgVmVjdG9yVHlwZSgxNiwgaW50MzJfdCkKKy8vLyAgIC0gdGhlIGNhbm9uaWNhbCB0eXBlIGlzIFZlY3RvclR5cGUoMTYsIGludCkKK2NsYXNzIEF0dHJpYnV0ZWRUeXBlIDogcHVibGljIFR5cGUsIHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CitwdWJsaWM6CisgIC8vIEl0IGlzIHJlYWxseSBzaWxseSB0byBoYXZlIHlldCBhbm90aGVyIGF0dHJpYnV0ZS1raW5kIGVudW0sIGJ1dAorICAvLyBjbGFuZzo6YXR0cjo6S2luZCBkb2Vzbid0IGN1cnJlbnRseSBjb3ZlciB0aGUgcHVyZSB0eXBlIGF0dHJzLgorICBlbnVtIEtpbmQgeworICAgIC8vIEV4cHJlc3Npb24gb3BlcmFuZC4KKyAgICBhdHRyX2FkZHJlc3Nfc3BhY2UsCisgICAgYXR0cl9yZWdwYXJtLAorICAgIGF0dHJfdmVjdG9yX3NpemUsCisgICAgYXR0cl9uZW9uX3ZlY3Rvcl90eXBlLAorICAgIGF0dHJfbmVvbl9wb2x5dmVjdG9yX3R5cGUsCisKKyAgICBGaXJzdEV4cHJPcGVyYW5kS2luZCA9IGF0dHJfYWRkcmVzc19zcGFjZSwKKyAgICBMYXN0RXhwck9wZXJhbmRLaW5kID0gYXR0cl9uZW9uX3BvbHl2ZWN0b3JfdHlwZSwKKworICAgIC8vIEVudW1lcmF0ZWQgb3BlcmFuZCAoc3RyaW5nIG9yIGtleXdvcmQpLgorICAgIGF0dHJfb2JqY19nYywKKyAgICBhdHRyX29iamNfb3duZXJzaGlwLAorICAgIGF0dHJfcGNzLAorICAgIGF0dHJfcGNzX3ZmcCwKKworICAgIEZpcnN0RW51bU9wZXJhbmRLaW5kID0gYXR0cl9vYmpjX2djLAorICAgIExhc3RFbnVtT3BlcmFuZEtpbmQgPSBhdHRyX3Bjc192ZnAsCisKKyAgICAvLyBObyBvcGVyYW5kLgorICAgIGF0dHJfbm9yZXR1cm4sCisgICAgYXR0cl9ub2NmX2NoZWNrLAorICAgIGF0dHJfY2RlY2wsCisgICAgYXR0cl9mYXN0Y2FsbCwKKyAgICBhdHRyX3N0ZGNhbGwsCisgICAgYXR0cl90aGlzY2FsbCwKKyAgICBhdHRyX3JlZ2NhbGwsCisgICAgYXR0cl9wYXNjYWwsCisgICAgYXR0cl9zd2lmdGNhbGwsCisgICAgYXR0cl92ZWN0b3JjYWxsLAorICAgIGF0dHJfaW50ZWxvY2xiaWNjLAorICAgIGF0dHJfbXNfYWJpLAorICAgIGF0dHJfc3lzdl9hYmksCisgICAgYXR0cl9wcmVzZXJ2ZV9tb3N0LAorICAgIGF0dHJfcHJlc2VydmVfYWxsLAorICAgIGF0dHJfcHRyMzIsCisgICAgYXR0cl9wdHI2NCwKKyAgICBhdHRyX3NwdHIsCisgICAgYXR0cl91cHRyLAorICAgIGF0dHJfbm9ubnVsbCwKKyAgICBhdHRyX25zX3JldHVybnNfcmV0YWluZWQsCisgICAgYXR0cl9udWxsYWJsZSwKKyAgICBhdHRyX251bGxfdW5zcGVjaWZpZWQsCisgICAgYXR0cl9vYmpjX2tpbmRvZiwKKyAgICBhdHRyX29iamNfaW5lcnRfdW5zYWZlX3VucmV0YWluZWQsCisgIH07CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBBU1RDb250ZXh0OyAvLyBBU1RDb250ZXh0IGNyZWF0ZXMgdGhlc2UKKworICBRdWFsVHlwZSBNb2RpZmllZFR5cGU7CisgIFF1YWxUeXBlIEVxdWl2YWxlbnRUeXBlOworCisgIEF0dHJpYnV0ZWRUeXBlKFF1YWxUeXBlIGNhbm9uLCBLaW5kIGF0dHJLaW5kLCBRdWFsVHlwZSBtb2RpZmllZCwKKyAgICAgICAgICAgICAgICAgUXVhbFR5cGUgZXF1aXZhbGVudCkKKyAgICAgIDogVHlwZShBdHRyaWJ1dGVkLCBjYW5vbiwgZXF1aXZhbGVudC0+aXNEZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgICAgZXF1aXZhbGVudC0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgIGVxdWl2YWxlbnQtPmlzVmFyaWFibHlNb2RpZmllZFR5cGUoKSwKKyAgICAgICAgICAgICBlcXVpdmFsZW50LT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgICBNb2RpZmllZFR5cGUobW9kaWZpZWQpLCBFcXVpdmFsZW50VHlwZShlcXVpdmFsZW50KSB7CisgICAgQXR0cmlidXRlZFR5cGVCaXRzLkF0dHJLaW5kID0gYXR0cktpbmQ7CisgIH0KKworcHVibGljOgorICBLaW5kIGdldEF0dHJLaW5kKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxLaW5kPihBdHRyaWJ1dGVkVHlwZUJpdHMuQXR0cktpbmQpOworICB9CisKKyAgUXVhbFR5cGUgZ2V0TW9kaWZpZWRUeXBlKCkgY29uc3QgeyByZXR1cm4gTW9kaWZpZWRUeXBlOyB9CisgIFF1YWxUeXBlIGdldEVxdWl2YWxlbnRUeXBlKCkgY29uc3QgeyByZXR1cm4gRXF1aXZhbGVudFR5cGU7IH0KKworICBib29sIGlzU3VnYXJlZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0IHsgcmV0dXJuIGdldEVxdWl2YWxlbnRUeXBlKCk7IH0KKworICAvLy8gRG9lcyB0aGlzIGF0dHJpYnV0ZSBiZWhhdmUgbGlrZSBhIHR5cGUgcXVhbGlmaWVyPworICAvLy8KKyAgLy8vIEEgdHlwZSBxdWFsaWZpZXIgYWRqdXN0cyBhIHR5cGUgdG8gcHJvdmlkZSBzcGVjaWFsaXplZCBydWxlcyBmb3IKKyAgLy8vIGEgc3BlY2lmaWMgb2JqZWN0LCBsaWtlIHRoZSBzdGFuZGFyZCBjb25zdCBhbmQgdm9sYXRpbGUgcXVhbGlmaWVycy4KKyAgLy8vIFRoaXMgaW5jbHVkZXMgYXR0cmlidXRlcyBjb250cm9sbGluZyB0aGluZ3MgbGlrZSBudWxsYWJpbGl0eSwKKyAgLy8vIGFkZHJlc3Mgc3BhY2VzLCBhbmQgQVJDIG93bmVyc2hpcC4gIFRoZSB2YWx1ZSBvZiB0aGUgb2JqZWN0IGlzIHN0aWxsCisgIC8vLyBsYXJnZWx5IGRlc2NyaWJlZCBieSB0aGUgbW9kaWZpZWQgdHlwZS4KKyAgLy8vCisgIC8vLyBJbiBjb250cmFzdCwgbWFueSB0eXBlIGF0dHJpYnV0ZXMgInJld3JpdGUiIHRoZWlyIG1vZGlmaWVkIHR5cGUgdG8KKyAgLy8vIHByb2R1Y2UgYSBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCB0eXBlLCBub3QgbmVjZXNzYXJpbHkgcmVsYXRlZCBpbiBhbnkKKyAgLy8vIGZvcm1hbGl6YWJsZSB3YXkgdG8gdGhlIG9yaWdpbmFsIHR5cGUuICBGb3IgZXhhbXBsZSwgY2FsbGluZyBjb252ZW50aW9uCisgIC8vLyBhbmQgdmVjdG9yIGF0dHJpYnV0ZXMgYXJlIG5vdCBzaW1wbGUgdHlwZSBxdWFsaWZpZXJzLgorICAvLy8KKyAgLy8vIFR5cGUgcXVhbGlmaWVycyBhcmUgb2Z0ZW4sIGJ1dCBub3QgYWx3YXlzLCByZWZsZWN0ZWQgaW4gdGhlIGNhbm9uaWNhbAorICAvLy8gdHlwZS4KKyAgYm9vbCBpc1F1YWxpZmllcigpIGNvbnN0OworCisgIGJvb2wgaXNNU1R5cGVTcGVjKCkgY29uc3Q7CisKKyAgYm9vbCBpc0NhbGxpbmdDb252KCkgY29uc3Q7CisKKyAgbGx2bTo6T3B0aW9uYWw8TnVsbGFiaWxpdHlLaW5kPiBnZXRJbW1lZGlhdGVOdWxsYWJpbGl0eSgpIGNvbnN0OworCisgIC8vLyBSZXRyaWV2ZSB0aGUgYXR0cmlidXRlIGtpbmQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KKyAgLy8vIG51bGxhYmlsaXR5IGtpbmQuCisgIHN0YXRpYyBLaW5kIGdldE51bGxhYmlsaXR5QXR0cktpbmQoTnVsbGFiaWxpdHlLaW5kIGtpbmQpIHsKKyAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICBjYXNlIE51bGxhYmlsaXR5S2luZDo6Tm9uTnVsbDoKKyAgICAgIHJldHVybiBhdHRyX25vbm51bGw7CisKKyAgICBjYXNlIE51bGxhYmlsaXR5S2luZDo6TnVsbGFibGU6CisgICAgICByZXR1cm4gYXR0cl9udWxsYWJsZTsKKworICAgIGNhc2UgTnVsbGFiaWxpdHlLaW5kOjpVbnNwZWNpZmllZDoKKyAgICAgIHJldHVybiBhdHRyX251bGxfdW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gbnVsbGFiaWxpdHkga2luZC4iKTsKKyAgfQorCisgIC8vLyBTdHJpcCBvZmYgdGhlIHRvcC1sZXZlbCBudWxsYWJpbGl0eSBhbm5vdGF0aW9uIG9uIHRoZSBnaXZlbgorICAvLy8gdHlwZSwgaWYgaXQncyB0aGVyZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gVCBUaGUgdHlwZSB0byBzdHJpcC4gSWYgdGhlIHR5cGUgaXMgZXhhY3RseSBhbgorICAvLy8gQXR0cmlidXRlZFR5cGUgc3BlY2lmeWluZyBudWxsYWJpbGl0eSAod2l0aG91dCBsb29raW5nIHRocm91Z2gKKyAgLy8vIHR5cGUgc3VnYXIpLCB0aGUgbnVsbGFiaWxpdHkgaXMgcmV0dXJuZWQgYW5kIHRoaXMgdHlwZSBjaGFuZ2VkCisgIC8vLyB0byB0aGUgdW5kZXJseWluZyBtb2RpZmllZCB0eXBlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSB0b3AtbGV2ZWwgbnVsbGFiaWxpdHksIGlmIHByZXNlbnQuCisgIHN0YXRpYyBPcHRpb25hbDxOdWxsYWJpbGl0eUtpbmQ+IHN0cmlwT3V0ZXJOdWxsYWJpbGl0eShRdWFsVHlwZSAmVCk7CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgUHJvZmlsZShJRCwgZ2V0QXR0cktpbmQoKSwgTW9kaWZpZWRUeXBlLCBFcXVpdmFsZW50VHlwZSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELCBLaW5kIGF0dHJLaW5kLAorICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIG1vZGlmaWVkLCBRdWFsVHlwZSBlcXVpdmFsZW50KSB7CisgICAgSUQuQWRkSW50ZWdlcihhdHRyS2luZCk7CisgICAgSUQuQWRkUG9pbnRlcihtb2RpZmllZC5nZXRBc09wYXF1ZVB0cigpKTsKKyAgICBJRC5BZGRQb2ludGVyKGVxdWl2YWxlbnQuZ2V0QXNPcGFxdWVQdHIoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gQXR0cmlidXRlZDsKKyAgfQorfTsKKworY2xhc3MgVGVtcGxhdGVUeXBlUGFybVR5cGUgOiBwdWJsaWMgVHlwZSwgcHVibGljIGxsdm06OkZvbGRpbmdTZXROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7IC8vIEFTVENvbnRleHQgY3JlYXRlcyB0aGVzZQorCisgIC8vIEhlbHBlciBkYXRhIGNvbGxlY3RvciBmb3IgY2Fub25pY2FsIHR5cGVzLgorICBzdHJ1Y3QgQ2Fub25pY2FsVFRQVEluZm8geworICAgIHVuc2lnbmVkIERlcHRoIDogMTU7CisgICAgdW5zaWduZWQgUGFyYW1ldGVyUGFjayA6IDE7CisgICAgdW5zaWduZWQgSW5kZXggOiAxNjsKKyAgfTsKKworICB1bmlvbiB7CisgICAgLy8gSW5mbyBmb3IgdGhlIGNhbm9uaWNhbCB0eXBlLgorICAgIENhbm9uaWNhbFRUUFRJbmZvIENhblRUUFRJbmZvOworCisgICAgLy8gSW5mbyBmb3IgdGhlIG5vbi1jYW5vbmljYWwgdHlwZS4KKyAgICBUZW1wbGF0ZVR5cGVQYXJtRGVjbCAqVFRQRGVjbDsKKyAgfTsKKworICAvLy8gQnVpbGQgYSBub24tY2Fub25pY2FsIHR5cGUuCisgIFRlbXBsYXRlVHlwZVBhcm1UeXBlKFRlbXBsYXRlVHlwZVBhcm1EZWNsICpUVFBEZWNsLCBRdWFsVHlwZSBDYW5vbikKKyAgICAgIDogVHlwZShUZW1wbGF0ZVR5cGVQYXJtLCBDYW5vbiwgLypEZXBlbmRlbnQ9Ki90cnVlLAorICAgICAgICAgICAgIC8qSW5zdGFudGlhdGlvbkRlcGVuZGVudD0qL3RydWUsCisgICAgICAgICAgICAgLypWYXJpYWJseU1vZGlmaWVkPSovZmFsc2UsCisgICAgICAgICAgICAgQ2Fub24tPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIFRUUERlY2woVFRQRGVjbCkge30KKworICAvLy8gQnVpbGQgdGhlIGNhbm9uaWNhbCB0eXBlLgorICBUZW1wbGF0ZVR5cGVQYXJtVHlwZSh1bnNpZ25lZCBELCB1bnNpZ25lZCBJLCBib29sIFBQKQorICAgICAgOiBUeXBlKFRlbXBsYXRlVHlwZVBhcm0sIFF1YWxUeXBlKHRoaXMsIDApLAorICAgICAgICAgICAgIC8qRGVwZW5kZW50PSovdHJ1ZSwKKyAgICAgICAgICAgICAvKkluc3RhbnRpYXRpb25EZXBlbmRlbnQ9Ki90cnVlLAorICAgICAgICAgICAgIC8qVmFyaWFibHlNb2RpZmllZD0qL2ZhbHNlLCBQUCkgeworICAgIENhblRUUFRJbmZvLkRlcHRoID0gRDsKKyAgICBDYW5UVFBUSW5mby5JbmRleCA9IEk7CisgICAgQ2FuVFRQVEluZm8uUGFyYW1ldGVyUGFjayA9IFBQOworICB9CisKKyAgY29uc3QgQ2Fub25pY2FsVFRQVEluZm8mIGdldENhblRUUFRJbmZvKCkgY29uc3QgeworICAgIFF1YWxUeXBlIENhbiA9IGdldENhbm9uaWNhbFR5cGVJbnRlcm5hbCgpOworICAgIHJldHVybiBDYW4tPmNhc3RBczxUZW1wbGF0ZVR5cGVQYXJtVHlwZT4oKS0+Q2FuVFRQVEluZm87CisgIH0KKworcHVibGljOgorICB1bnNpZ25lZCBnZXREZXB0aCgpIGNvbnN0IHsgcmV0dXJuIGdldENhblRUUFRJbmZvKCkuRGVwdGg7IH0KKyAgdW5zaWduZWQgZ2V0SW5kZXgoKSBjb25zdCB7IHJldHVybiBnZXRDYW5UVFBUSW5mbygpLkluZGV4OyB9CisgIGJvb2wgaXNQYXJhbWV0ZXJQYWNrKCkgY29uc3QgeyByZXR1cm4gZ2V0Q2FuVFRQVEluZm8oKS5QYXJhbWV0ZXJQYWNrOyB9CisKKyAgVGVtcGxhdGVUeXBlUGFybURlY2wgKmdldERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQ2Fub25pY2FsVW5xdWFsaWZpZWQoKSA/IG51bGxwdHIgOiBUVFBEZWNsOworICB9CisKKyAgSWRlbnRpZmllckluZm8gKmdldElkZW50aWZpZXIoKSBjb25zdDsKKworICBib29sIGlzU3VnYXJlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIFF1YWxUeXBlIGRlc3VnYXIoKSBjb25zdCB7IHJldHVybiBRdWFsVHlwZSh0aGlzLCAwKTsgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIFByb2ZpbGUoSUQsIGdldERlcHRoKCksIGdldEluZGV4KCksIGlzUGFyYW1ldGVyUGFjaygpLCBnZXREZWNsKCkpOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgdW5zaWduZWQgRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZXgsIGJvb2wgUGFyYW1ldGVyUGFjaywKKyAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVR5cGVQYXJtRGVjbCAqVFRQRGVjbCkgeworICAgIElELkFkZEludGVnZXIoRGVwdGgpOworICAgIElELkFkZEludGVnZXIoSW5kZXgpOworICAgIElELkFkZEJvb2xlYW4oUGFyYW1ldGVyUGFjayk7CisgICAgSUQuQWRkUG9pbnRlcihUVFBEZWNsKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlQ2xhc3MoKSA9PSBUZW1wbGF0ZVR5cGVQYXJtOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBzdWJzdGl0dXRpbmcgYSB0eXBlIGZvciBhIHRlbXBsYXRlCisvLy8gdHlwZSBwYXJhbWV0ZXIuCisvLy8KKy8vLyBXaXRoaW4gYW4gaW5zdGFudGlhdGVkIHRlbXBsYXRlLCBhbGwgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXJzIGhhdmUKKy8vLyBiZWVuIHJlcGxhY2VkIHdpdGggdGhlc2UuICBUaGV5IGFyZSB1c2VkIHNvbGVseSB0byByZWNvcmQgdGhhdCBhCisvLy8gdHlwZSB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGFzIGEgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXI7CisvLy8gdGhlcmVmb3JlIHRoZXkgYXJlIG5ldmVyIGNhbm9uaWNhbC4KK2NsYXNzIFN1YnN0VGVtcGxhdGVUeXBlUGFybVR5cGUgOiBwdWJsaWMgVHlwZSwgcHVibGljIGxsdm06OkZvbGRpbmdTZXROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7CisKKyAgLy8gVGhlIG9yaWdpbmFsIHR5cGUgcGFyYW1ldGVyLgorICBjb25zdCBUZW1wbGF0ZVR5cGVQYXJtVHlwZSAqUmVwbGFjZWQ7CisKKyAgU3Vic3RUZW1wbGF0ZVR5cGVQYXJtVHlwZShjb25zdCBUZW1wbGF0ZVR5cGVQYXJtVHlwZSAqUGFyYW0sIFF1YWxUeXBlIENhbm9uKQorICAgICAgOiBUeXBlKFN1YnN0VGVtcGxhdGVUeXBlUGFybSwgQ2Fub24sIENhbm9uLT5pc0RlcGVuZGVudFR5cGUoKSwKKyAgICAgICAgICAgICBDYW5vbi0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgIENhbm9uLT5pc1ZhcmlhYmx5TW9kaWZpZWRUeXBlKCksCisgICAgICAgICAgICAgQ2Fub24tPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIFJlcGxhY2VkKFBhcmFtKSB7fQorCitwdWJsaWM6CisgIC8vLyBHZXRzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdGhhdCB3YXMgc3Vic3RpdHV0ZWQgZm9yLgorICBjb25zdCBUZW1wbGF0ZVR5cGVQYXJtVHlwZSAqZ2V0UmVwbGFjZWRQYXJhbWV0ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlcGxhY2VkOworICB9CisKKyAgLy8vIEdldHMgdGhlIHR5cGUgdGhhdCB3YXMgc3Vic3RpdHV0ZWQgZm9yIHRoZSB0ZW1wbGF0ZQorICAvLy8gcGFyYW1ldGVyLgorICBRdWFsVHlwZSBnZXRSZXBsYWNlbWVudFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldENhbm9uaWNhbFR5cGVJbnRlcm5hbCgpOworICB9CisKKyAgYm9vbCBpc1N1Z2FyZWQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIFF1YWxUeXBlIGRlc3VnYXIoKSBjb25zdCB7IHJldHVybiBnZXRSZXBsYWNlbWVudFR5cGUoKTsgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIFByb2ZpbGUoSUQsIGdldFJlcGxhY2VkUGFyYW1ldGVyKCksIGdldFJlcGxhY2VtZW50VHlwZSgpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVUeXBlUGFybVR5cGUgKlJlcGxhY2VkLAorICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFJlcGxhY2VtZW50KSB7CisgICAgSUQuQWRkUG9pbnRlcihSZXBsYWNlZCk7CisgICAgSUQuQWRkUG9pbnRlcihSZXBsYWNlbWVudC5nZXRBc09wYXF1ZVB0cigpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlQ2xhc3MoKSA9PSBTdWJzdFRlbXBsYXRlVHlwZVBhcm07CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIHN1YnN0aXR1dGluZyBhIHNldCBvZiB0eXBlcyBmb3IgYSB0ZW1wbGF0ZQorLy8vIHR5cGUgcGFyYW1ldGVyIHBhY2suCisvLy8KKy8vLyBXaGVuIGEgcGFjayBleHBhbnNpb24gaW4gdGhlIHNvdXJjZSBjb2RlIGNvbnRhaW5zIG11bHRpcGxlIHBhcmFtZXRlciBwYWNrcworLy8vIGFuZCB0aG9zZSBwYXJhbWV0ZXIgcGFja3MgY29ycmVzcG9uZCB0byBkaWZmZXJlbnQgbGV2ZWxzIG9mIHRlbXBsYXRlCisvLy8gcGFyYW1ldGVyIGxpc3RzLCB0aGlzIHR5cGUgbm9kZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHRlbXBsYXRlIHR5cGUKKy8vLyBwYXJhbWV0ZXIgcGFjayBmcm9tIGFuIG91dGVyIGxldmVsLCB3aGljaCBoYXMgYWxyZWFkeSBoYWQgaXRzIGFyZ3VtZW50IHBhY2sKKy8vLyBzdWJzdGl0dXRlZCBidXQgdGhhdCBzdGlsbCBsaXZlcyB3aXRoaW4gYSBwYWNrIGV4cGFuc2lvbiB0aGF0IGl0c2VsZgorLy8vIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQuIFdoZW4gYWN0dWFsbHkgcGVyZm9ybWluZyBhIHN1YnN0aXR1dGlvbiBpbnRvCisvLy8gdGhhdCBwYWNrIGV4cGFuc2lvbiAoZS5nLiwgd2hlbiBhbGwgdGVtcGxhdGUgcGFyYW1ldGVycyBoYXZlIGNvcnJlc3BvbmRpbmcKKy8vLyBhcmd1bWVudHMpLCB0aGlzIHR5cGUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBcYyBTdWJzdFRlbXBsYXRlVHlwZVBhcm1UeXBlCisvLy8gYXQgdGhlIGN1cnJlbnQgcGFjayBzdWJzdGl0dXRpb24gaW5kZXguCitjbGFzcyBTdWJzdFRlbXBsYXRlVHlwZVBhcm1QYWNrVHlwZSA6IHB1YmxpYyBUeXBlLCBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsKKworICAvLy8gXGJyaWVmIFRoZSBvcmlnaW5hbCB0eXBlIHBhcmFtZXRlci4KKyAgY29uc3QgVGVtcGxhdGVUeXBlUGFybVR5cGUgKlJlcGxhY2VkOworCisgIC8vLyBcYnJpZWYgQSBwb2ludGVyIHRvIHRoZSBzZXQgb2YgdGVtcGxhdGUgYXJndW1lbnRzIHRoYXQgdGhpcworICAvLy8gcGFyYW1ldGVyIHBhY2sgaXMgaW5zdGFudGlhdGVkIHdpdGguCisgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgKkFyZ3VtZW50czsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgdGVtcGxhdGUgYXJndW1lbnRzIGluIFxjIEFyZ3VtZW50cy4KKyAgdW5zaWduZWQgTnVtQXJndW1lbnRzOworCisgIFN1YnN0VGVtcGxhdGVUeXBlUGFybVBhY2tUeXBlKGNvbnN0IFRlbXBsYXRlVHlwZVBhcm1UeXBlICpQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgQ2Fub24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJkFyZ1BhY2spOworCitwdWJsaWM6CisgIElkZW50aWZpZXJJbmZvICpnZXRJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gUmVwbGFjZWQtPmdldElkZW50aWZpZXIoKTsgfQorCisgIC8vLyBHZXRzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdGhhdCB3YXMgc3Vic3RpdHV0ZWQgZm9yLgorICBjb25zdCBUZW1wbGF0ZVR5cGVQYXJtVHlwZSAqZ2V0UmVwbGFjZWRQYXJhbWV0ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlcGxhY2VkOworICB9CisKKyAgYm9vbCBpc1N1Z2FyZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICBRdWFsVHlwZSBkZXN1Z2FyKCkgY29uc3QgeyByZXR1cm4gUXVhbFR5cGUodGhpcywgMCk7IH0KKworICBUZW1wbGF0ZUFyZ3VtZW50IGdldEFyZ3VtZW50UGFjaygpIGNvbnN0OworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCk7CisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVUeXBlUGFybVR5cGUgKlJlcGxhY2VkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJkFyZ1BhY2spOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlQ2xhc3MoKSA9PSBTdWJzdFRlbXBsYXRlVHlwZVBhcm1QYWNrOworICB9Cit9OworCisvLy8gXGJyaWVmIENvbW1vbiBiYXNlIGNsYXNzIGZvciBwbGFjZWhvbGRlcnMgZm9yIHR5cGVzIHRoYXQgZ2V0IHJlcGxhY2VkIGJ5CisvLy8gcGxhY2Vob2xkZXIgdHlwZSBkZWR1Y3Rpb246IEMrKzExIGF1dG8sIEMrKzE0IGRlY2x0eXBlKGF1dG8pLCBDKysxNyBkZWR1Y2VkCisvLy8gY2xhc3MgdGVtcGxhdGUgdHlwZXMsIGFuZCAoZXZlbnR1YWxseSkgY29uc3RyYWluZWQgdHlwZSBuYW1lcyBmcm9tIHRoZSBDKysKKy8vLyBDb25jZXB0cyBUUy4KKy8vLworLy8vIFRoZXNlIHR5cGVzIGFyZSB1c3VhbGx5IGEgcGxhY2Vob2xkZXIgZm9yIGEgZGVkdWNlZCB0eXBlLiBIb3dldmVyLCBiZWZvcmUKKy8vLyB0aGUgaW5pdGlhbGl6ZXIgaXMgYXR0YWNoZWQsIG9yICh1c3VhbGx5KSBpZiB0aGUgaW5pdGlhbGl6ZXIgaXMKKy8vLyB0eXBlLWRlcGVuZGVudCwgdGhlcmUgaXMgbm8gZGVkdWNlZCB0eXBlIGFuZCB0aGUgdHlwZSBpcyBjYW5vbmljYWwuIEluCisvLy8gdGhlIGxhdHRlciBjYXNlLCBpdCBpcyBhbHNvIGEgZGVwZW5kZW50IHR5cGUuCitjbGFzcyBEZWR1Y2VkVHlwZSA6IHB1YmxpYyBUeXBlIHsKK3Byb3RlY3RlZDoKKyAgRGVkdWNlZFR5cGUoVHlwZUNsYXNzIFRDLCBRdWFsVHlwZSBEZWR1Y2VkQXNUeXBlLCBib29sIElzRGVwZW5kZW50LAorICAgICAgICAgICAgICBib29sIElzSW5zdGFudGlhdGlvbkRlcGVuZGVudCwgYm9vbCBDb250YWluc1BhcmFtZXRlclBhY2spCisgICAgICA6IFR5cGUoVEMsCisgICAgICAgICAgICAgLy8gRklYTUU6IFJldGFpbiB0aGUgc3VnYXJlZCBkZWR1Y2VkIHR5cGU/CisgICAgICAgICAgICAgRGVkdWNlZEFzVHlwZS5pc051bGwoKSA/IFF1YWxUeXBlKHRoaXMsIDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IERlZHVjZWRBc1R5cGUuZ2V0Q2Fub25pY2FsVHlwZSgpLAorICAgICAgICAgICAgIElzRGVwZW5kZW50LCBJc0luc3RhbnRpYXRpb25EZXBlbmRlbnQsCisgICAgICAgICAgICAgLypWYXJpYWJseU1vZGlmaWVkPSovZmFsc2UsIENvbnRhaW5zUGFyYW1ldGVyUGFjaykgeworICAgIGlmICghRGVkdWNlZEFzVHlwZS5pc051bGwoKSkgeworICAgICAgaWYgKERlZHVjZWRBc1R5cGUtPmlzRGVwZW5kZW50VHlwZSgpKQorICAgICAgICBzZXREZXBlbmRlbnQoKTsKKyAgICAgIGlmIChEZWR1Y2VkQXNUeXBlLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnRUeXBlKCkpCisgICAgICAgIHNldEluc3RhbnRpYXRpb25EZXBlbmRlbnQoKTsKKyAgICAgIGlmIChEZWR1Y2VkQXNUeXBlLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpCisgICAgICAgIHNldENvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKTsKKyAgICB9CisgIH0KKworcHVibGljOgorICBib29sIGlzU3VnYXJlZCgpIGNvbnN0IHsgcmV0dXJuICFpc0Nhbm9uaWNhbFVucXVhbGlmaWVkKCk7IH0KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0IHsgcmV0dXJuIGdldENhbm9uaWNhbFR5cGVJbnRlcm5hbCgpOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHR5cGUgZGVkdWNlZCBmb3IgdGhpcyBwbGFjZWhvbGRlciB0eXBlLCBvciBudWxsIGlmIGl0J3MKKyAgLy8vIGVpdGhlciBub3QgYmVlbiBkZWR1Y2VkIG9yIHdhcyBkZWR1Y2VkIHRvIGEgZGVwZW5kZW50IHR5cGUuCisgIFF1YWxUeXBlIGdldERlZHVjZWRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiAhaXNDYW5vbmljYWxVbnF1YWxpZmllZCgpID8gZ2V0Q2Fub25pY2FsVHlwZUludGVybmFsKCkgOiBRdWFsVHlwZSgpOworICB9CisgIGJvb2wgaXNEZWR1Y2VkKCkgY29uc3QgeworICAgIHJldHVybiAhaXNDYW5vbmljYWxVbnF1YWxpZmllZCgpIHx8IGlzRGVwZW5kZW50VHlwZSgpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFR5cGVDbGFzcygpID09IEF1dG8gfHwKKyAgICAgICAgICAgVC0+Z2V0VHlwZUNsYXNzKCkgPT0gRGVkdWNlZFRlbXBsYXRlU3BlY2lhbGl6YXRpb247CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIEMrKzExIGF1dG8gb3IgQysrMTQgZGVjbHR5cGUoYXV0bykgdHlwZS4KK2NsYXNzIEF1dG9UeXBlIDogcHVibGljIERlZHVjZWRUeXBlLCBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsgLy8gQVNUQ29udGV4dCBjcmVhdGVzIHRoZXNlCisKKyAgQXV0b1R5cGUoUXVhbFR5cGUgRGVkdWNlZEFzVHlwZSwgQXV0b1R5cGVLZXl3b3JkIEtleXdvcmQsCisgICAgICAgICAgIGJvb2wgSXNEZWR1Y2VkQXNEZXBlbmRlbnQpCisgICAgICA6IERlZHVjZWRUeXBlKEF1dG8sIERlZHVjZWRBc1R5cGUsIElzRGVkdWNlZEFzRGVwZW5kZW50LAorICAgICAgICAgICAgICAgICAgICBJc0RlZHVjZWRBc0RlcGVuZGVudCwgLypDb250YWluc1BhY2s9Ki9mYWxzZSkgeworICAgIEF1dG9UeXBlQml0cy5LZXl3b3JkID0gKHVuc2lnbmVkKUtleXdvcmQ7CisgIH0KKworcHVibGljOgorICBib29sIGlzRGVjbHR5cGVBdXRvKCkgY29uc3QgeworICAgIHJldHVybiBnZXRLZXl3b3JkKCkgPT0gQXV0b1R5cGVLZXl3b3JkOjpEZWNsdHlwZUF1dG87CisgIH0KKworICBBdXRvVHlwZUtleXdvcmQgZ2V0S2V5d29yZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKEF1dG9UeXBlS2V5d29yZClBdXRvVHlwZUJpdHMuS2V5d29yZDsKKyAgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIFByb2ZpbGUoSUQsIGdldERlZHVjZWRUeXBlKCksIGdldEtleXdvcmQoKSwgaXNEZXBlbmRlbnRUeXBlKCkpOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgUXVhbFR5cGUgRGVkdWNlZCwKKyAgICAgICAgICAgICAgICAgICAgICBBdXRvVHlwZUtleXdvcmQgS2V5d29yZCwgYm9vbCBJc0RlcGVuZGVudCkgeworICAgIElELkFkZFBvaW50ZXIoRGVkdWNlZC5nZXRBc09wYXF1ZVB0cigpKTsKKyAgICBJRC5BZGRJbnRlZ2VyKCh1bnNpZ25lZClLZXl3b3JkKTsKKyAgICBJRC5BZGRCb29sZWFuKElzRGVwZW5kZW50KTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlQ2xhc3MoKSA9PSBBdXRvOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBDKysxNyBkZWR1Y2VkIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHR5cGUuCitjbGFzcyBEZWR1Y2VkVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUgOiBwdWJsaWMgRGVkdWNlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsgLy8gQVNUQ29udGV4dCBjcmVhdGVzIHRoZXNlCisKKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB3aG9zZSBhcmd1bWVudHMgd2lsbCBiZSBkZWR1Y2VkLgorICBUZW1wbGF0ZU5hbWUgVGVtcGxhdGU7CisKKyAgRGVkdWNlZFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlKFRlbXBsYXRlTmFtZSBUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIERlZHVjZWRBc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRGVkdWNlZEFzRGVwZW5kZW50KQorICAgICAgOiBEZWR1Y2VkVHlwZShEZWR1Y2VkVGVtcGxhdGVTcGVjaWFsaXphdGlvbiwgRGVkdWNlZEFzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgSXNEZWR1Y2VkQXNEZXBlbmRlbnQgfHwgVGVtcGxhdGUuaXNEZXBlbmRlbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgSXNEZWR1Y2VkQXNEZXBlbmRlbnQgfHwgVGVtcGxhdGUuaXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCksCisgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlLmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIFRlbXBsYXRlKFRlbXBsYXRlKSB7fQorCitwdWJsaWM6CisgIC8vLyBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgdGhhdCB3ZSBhcmUgZGVkdWNpbmcuCisgIFRlbXBsYXRlTmFtZSBnZXRUZW1wbGF0ZU5hbWUoKSBjb25zdCB7IHJldHVybiBUZW1wbGF0ZTt9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgUHJvZmlsZShJRCwgZ2V0VGVtcGxhdGVOYW1lKCksIGdldERlZHVjZWRUeXBlKCksIGlzRGVwZW5kZW50VHlwZSgpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIFRlbXBsYXRlTmFtZSBUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBEZWR1Y2VkLCBib29sIElzRGVwZW5kZW50KSB7CisgICAgVGVtcGxhdGUuUHJvZmlsZShJRCk7CisgICAgSUQuQWRkUG9pbnRlcihEZWR1Y2VkLmdldEFzT3BhcXVlUHRyKCkpOworICAgIElELkFkZEJvb2xlYW4oSXNEZXBlbmRlbnQpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFR5cGVDbGFzcygpID09IERlZHVjZWRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSB0eXBlIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uOyB0aGUgdGVtcGxhdGUKKy8vLyBtdXN0IGJlIGEgY2xhc3MgdGVtcGxhdGUsIGEgdHlwZSBhbGlhcyB0ZW1wbGF0ZSwgb3IgYSB0ZW1wbGF0ZQorLy8vIHRlbXBsYXRlIHBhcmFtZXRlci4gIEEgdGVtcGxhdGUgd2hpY2ggY2Fubm90IGJlIHJlc29sdmVkIHRvIG9uZSBvZgorLy8vIHRoZXNlLCBlLmcuIGJlY2F1c2UgaXQgaXMgd3JpdHRlbiB3aXRoIGEgZGVwZW5kZW50IHNjb3BlCisvLy8gc3BlY2lmaWVyLCBpcyBpbnN0ZWFkIHJlcHJlc2VudGVkIGFzIGEKKy8vLyBAYyBEZXBlbmRlbnRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZS4KKy8vLworLy8vIEEgbm9uLWRlcGVuZGVudCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0eXBlIGlzIGFsd2F5cyAic3VnYXIiLAorLy8vIHR5cGljYWxseSBmb3IgYSBcYyBSZWNvcmRUeXBlLiAgRm9yIGV4YW1wbGUsIGEgY2xhc3MgdGVtcGxhdGUKKy8vLyBzcGVjaWFsaXphdGlvbiB0eXBlIG9mIFxjIHZlY3RvcjxpbnQ+IHdpbGwgcmVmZXIgdG8gYSB0YWcgdHlwZSBmb3IKKy8vLyB0aGUgaW5zdGFudGlhdGlvbiBcYyBzdGQ6OnZlY3RvcjxpbnQsIHN0ZDo6YWxsb2NhdG9yPGludD4+CisvLy8KKy8vLyBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgYXJlIGRlcGVuZGVudCBpZiBlaXRoZXIgdGhlIHRlbXBsYXRlIG9yCisvLy8gYW55IG9mIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgYXJlIGRlcGVuZGVudCwgaW4gd2hpY2ggY2FzZSB0aGUKKy8vLyB0eXBlIG1heSBhbHNvIGJlIGNhbm9uaWNhbC4KKy8vLworLy8vIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgYXJlIGFsbG9jYXRlZCB3aXRoIGEgdHJhaWxpbmcgYXJyYXkgb2YKKy8vLyBUZW1wbGF0ZUFyZ3VtZW50cywgZm9sbG93ZWQgYnkgYSBRdWFsVHlwZSByZXByZXNlbnRpbmcgdGhlCisvLy8gbm9uLWNhbm9uaWNhbCBhbGlhc2VkIHR5cGUgd2hlbiB0aGUgdGVtcGxhdGUgaXMgYSB0eXBlIGFsaWFzCisvLy8gdGVtcGxhdGUuCitjbGFzcyBMTFZNX0FMSUdOQVMoLyphbGlnbm9mKHVpbnQ2NF90KSovIDgpIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlCisgICAgOiBwdWJsaWMgVHlwZSwKKyAgICAgIHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RDb250ZXh0OyAvLyBBU1RDb250ZXh0IGNyZWF0ZXMgdGhlc2UKKworICAvLy8gVGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIGJlaW5nIHNwZWNpYWxpemVkLiAgVGhpcyBpcworICAvLy8gZWl0aGVyIGEgVGVtcGxhdGVOYW1lOjpUZW1wbGF0ZSAoaW4gd2hpY2ggY2FzZSBpdCBpcyBhCisgIC8vLyBDbGFzc1RlbXBsYXRlRGVjbCosIGEgVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsKiwgb3IgYQorICAvLy8gVHlwZUFsaWFzVGVtcGxhdGVEZWNsKiksIGEKKyAgLy8vIFRlbXBsYXRlTmFtZTo6U3Vic3RUZW1wbGF0ZVRlbXBsYXRlUGFybVBhY2ssIG9yIGEKKyAgLy8vIFRlbXBsYXRlTmFtZTo6U3Vic3RUZW1wbGF0ZVRlbXBsYXRlUGFybSAoaW4gd2hpY2ggY2FzZSB0aGUKKyAgLy8vIHJlcGxhY2VtZW50IG11c3QsIHJlY3Vyc2l2ZWx5LCBiZSBvbmUgb2YgdGhlc2UpLgorICBUZW1wbGF0ZU5hbWUgVGVtcGxhdGU7CisKKyAgLy8vIFRoZSBudW1iZXIgb2YgdGVtcGxhdGUgYXJndW1lbnRzIG5hbWVkIGluIHRoaXMgY2xhc3MgdGVtcGxhdGUKKyAgLy8vIHNwZWNpYWxpemF0aW9uLgorICB1bnNpZ25lZCBOdW1BcmdzIDogMzE7CisKKyAgLy8vIFdoZXRoZXIgdGhpcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0eXBlIGlzIGEgc3Vic3RpdHV0ZWQgdHlwZSBhbGlhcy4KKyAgdW5zaWduZWQgVHlwZUFsaWFzIDogMTsKKworICBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZShUZW1wbGF0ZU5hbWUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgQ2Fub24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIEFsaWFzZWQpOworCitwdWJsaWM6CisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciBhbnkgb2YgdGhlIGdpdmVuIHRlbXBsYXRlIGFyZ3VtZW50cyBhcmUgZGVwZW5kZW50LgorICBzdGF0aWMgYm9vbCBhbnlEZXBlbmRlbnRUZW1wbGF0ZUFyZ3VtZW50cyhBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50TG9jPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZJbnN0YW50aWF0aW9uRGVwZW5kZW50KTsKKworICBzdGF0aWMgYm9vbCBhbnlEZXBlbmRlbnRUZW1wbGF0ZUFyZ3VtZW50cyhjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmSW5zdGFudGlhdGlvbkRlcGVuZGVudCk7CisKKyAgLy8vIFRydWUgaWYgdGhpcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0eXBlIG1hdGNoZXMgYSBjdXJyZW50CisgIC8vLyBpbnN0YW50aWF0aW9uIGluIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIGZvdW5kLgorICBib29sIGlzQ3VycmVudEluc3RhbnRpYXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGlzYTxJbmplY3RlZENsYXNzTmFtZVR5cGU+KGdldENhbm9uaWNhbFR5cGVJbnRlcm5hbCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIHRoaXMgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdHlwZSBpcyBmb3IgYSB0eXBlIGFsaWFzCisgIC8vLyB0ZW1wbGF0ZSB0aGF0IGhhcyBiZWVuIHN1YnN0aXR1dGVkLgorICAvLy8KKyAgLy8vIE5lYXJseSBldmVyeSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0eXBlIHdob3NlIHRlbXBsYXRlIGlzIGFuIGFsaWFzCisgIC8vLyB0ZW1wbGF0ZSB3aWxsIGJlIHN1YnN0aXR1dGVkLiBIb3dldmVyLCB0aGlzIGlzIG5vdCB0aGUgY2FzZSB3aGVuCisgIC8vLyB0aGUgc3BlY2lhbGl6YXRpb24gY29udGFpbnMgYSBwYWNrIGV4cGFuc2lvbiBidXQgdGhlIHRlbXBsYXRlIGFsaWFzCisgIC8vLyBkb2VzIG5vdCBoYXZlIGEgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXIgcGFjaywgZS5nLiwKKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgVj4gc3RydWN0IFM7CisgIC8vLyB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPiB1c2luZyBBID0gUzxULCBpbnQsIFU+OworICAvLy8gdGVtcGxhdGU8dHlwZW5hbWUuLi4gVHM+IHN0cnVjdCBYIHsKKyAgLy8vICAgdHlwZWRlZiBBPFRzLi4uPiB0eXBlOyAvLyBub3QgYSB0eXBlIGFsaWFzCisgIC8vLyB9OworICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBpc1R5cGVBbGlhcygpIGNvbnN0IHsgcmV0dXJuIFR5cGVBbGlhczsgfQorCisgIC8vLyBHZXQgdGhlIGFsaWFzZWQgdHlwZSwgaWYgdGhpcyBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIGEgdHlwZSBhbGlhcworICAvLy8gdGVtcGxhdGUuCisgIFF1YWxUeXBlIGdldEFsaWFzZWRUeXBlKCkgY29uc3QgeworICAgIGFzc2VydChpc1R5cGVBbGlhcygpICYmICJub3QgYSB0eXBlIGFsaWFzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIik7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFF1YWxUeXBlKj4oZW5kKCkpOworICB9CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICo7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBnZXRBcmdzKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3Q7IC8vIGRlZmluZWQgaW5saW5lIGluIFRlbXBsYXRlQmFzZS5oCisKKyAgLy8vIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0aGF0IHdlIGFyZSBzcGVjaWFsaXppbmcuCisgIFRlbXBsYXRlTmFtZSBnZXRUZW1wbGF0ZU5hbWUoKSBjb25zdCB7IHJldHVybiBUZW1wbGF0ZTsgfQorCisgIC8vLyBSZXRyaWV2ZSB0aGUgdGVtcGxhdGUgYXJndW1lbnRzLgorICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpnZXRBcmdzKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgKj4odGhpcyArIDEpOworICB9CisKKyAgLy8vIFJldHJpZXZlIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUgYXJndW1lbnRzLgorICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3QgeyByZXR1cm4gTnVtQXJnczsgfQorCisgIC8vLyBSZXRyaWV2ZSBhIHNwZWNpZmljIHRlbXBsYXRlIGFyZ3VtZW50IGFzIGEgdHlwZS4KKyAgLy8vIFxwcmUgXGMgaXNBcmdUeXBlKEFyZykKKyAgY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmZ2V0QXJnKHVuc2lnbmVkIElkeCkgY29uc3Q7IC8vIGluIFRlbXBsYXRlQmFzZS5oCisKKyAgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gdGVtcGxhdGVfYXJndW1lbnRzKCkgY29uc3QgeworICAgIHJldHVybiB7Z2V0QXJncygpLCBOdW1BcmdzfTsKKyAgfQorCisgIGJvb2wgaXNTdWdhcmVkKCkgY29uc3QgeworICAgIHJldHVybiAhaXNEZXBlbmRlbnRUeXBlKCkgfHwgaXNDdXJyZW50SW5zdGFudGlhdGlvbigpIHx8IGlzVHlwZUFsaWFzKCk7CisgIH0KKworICBRdWFsVHlwZSBkZXN1Z2FyKCkgY29uc3QgeyByZXR1cm4gZ2V0Q2Fub25pY2FsVHlwZUludGVybmFsKCk7IH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIGNvbnN0IEFTVENvbnRleHQgJkN0eCkgeworICAgIFByb2ZpbGUoSUQsIFRlbXBsYXRlLCB0ZW1wbGF0ZV9hcmd1bWVudHMoKSwgQ3R4KTsKKyAgICBpZiAoaXNUeXBlQWxpYXMoKSkKKyAgICAgIGdldEFsaWFzZWRUeXBlKCkuUHJvZmlsZShJRCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELCBUZW1wbGF0ZU5hbWUgVCwKKyAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlQ2xhc3MoKSA9PSBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uOworICB9Cit9OworCisvLy8gXGJyaWVmIFByaW50IGEgdGVtcGxhdGUgYXJndW1lbnQgbGlzdCwgaW5jbHVkaW5nIHRoZSAnPCcgYW5kICc+JworLy8vIGVuY2xvc2luZyB0aGUgdGVtcGxhdGUgYXJndW1lbnRzLgordm9pZCBwcmludFRlbXBsYXRlQXJndW1lbnRMaXN0KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpOworCit2b2lkIHByaW50VGVtcGxhdGVBcmd1bWVudExpc3QocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnRMb2M+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSk7CisKK3ZvaWQgcHJpbnRUZW1wbGF0ZUFyZ3VtZW50TGlzdChyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpOworCisvLy8gVGhlIGluamVjdGVkIGNsYXNzIG5hbWUgb2YgYSBDKysgY2xhc3MgdGVtcGxhdGUgb3IgY2xhc3MKKy8vLyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLiAgVXNlZCB0byByZWNvcmQgdGhhdCBhIHR5cGUgd2FzCisvLy8gc3BlbGxlZCB3aXRoIGEgYmFyZSBpZGVudGlmaWVyIHJhdGhlciB0aGFuIGFzIGEgdGVtcGxhdGUtaWQ7IHRoZQorLy8vIGVxdWl2YWxlbnQgZm9yIG5vbi10ZW1wbGF0ZWQgY2xhc3NlcyBpcyBqdXN0IFJlY29yZFR5cGUuCisvLy8KKy8vLyBJbmplY3RlZCBjbGFzcyBuYW1lIHR5cGVzIGFyZSBhbHdheXMgZGVwZW5kZW50LiAgVGVtcGxhdGUKKy8vLyBpbnN0YW50aWF0aW9uIHR1cm5zIHRoZXNlIGludG8gUmVjb3JkVHlwZXMuCisvLy8KKy8vLyBJbmplY3RlZCBjbGFzcyBuYW1lIHR5cGVzIGFyZSBhbHdheXMgY2Fub25pY2FsLiAgVGhpcyB3b3JrcworLy8vIGJlY2F1c2UgaXQgaXMgaW1wb3NzaWJsZSB0byBjb21wYXJlIGFuIGluamVjdGVkIGNsYXNzIG5hbWUgdHlwZQorLy8vIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbm9uLWluamVjdGVkIHRlbXBsYXRlIHR5cGUsIGZvciB0aGUgc2FtZQorLy8vIHJlYXNvbiB0aGF0IGl0IGlzIGltcG9zc2libGUgdG8gZGlyZWN0bHkgY29tcGFyZSB0ZW1wbGF0ZQorLy8vIHBhcmFtZXRlcnMgZnJvbSBkaWZmZXJlbnQgZGVwZW5kZW50IGNvbnRleHRzOiBpbmplY3RlZCBjbGFzcyBuYW1lCisvLy8gdHlwZXMgY2FuIG9ubHkgb2NjdXIgd2l0aGluIHRoZSBzY29wZSBvZiBhIHBhcnRpY3VsYXIgdGVtcGxhdGVkCisvLy8gZGVjbGFyYXRpb24sIGFuZCB3aXRoaW4gdGhhdCBzY29wZSBldmVyeSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbgorLy8vIHdpbGwgY2Fub25pY2FsaXplIHRvIHRoZSBpbmplY3RlZCBjbGFzcyBuYW1lICh3aGVuIGFwcHJvcHJpYXRlCisvLy8gYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvZiB0aGUgbGFuZ3VhZ2UpLgorY2xhc3MgSW5qZWN0ZWRDbGFzc05hbWVUeXBlIDogcHVibGljIFR5cGUgeworICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsgLy8gQVNUQ29udGV4dCBjcmVhdGVzIHRoZXNlLgorICBmcmllbmQgY2xhc3MgQVNUTm9kZUltcG9ydGVyOworICBmcmllbmQgY2xhc3MgQVNUUmVhZGVyOyAvLyBGSVhNRTogQVNUQ29udGV4dDo6Z2V0SW5qZWN0ZWRDbGFzc05hbWVUeXBlIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgc3VpdGFibGUgZm9yIEFTVCByZWFkaW5nLCB0b28gbXVjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcmRlcGVuZGVuY2llcy4KKworICBDWFhSZWNvcmREZWNsICpEZWNsOworCisgIC8vLyBUaGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gd2hpY2ggdGhpcyB0eXBlIHJlcHJlc2VudHMuCisgIC8vLyBGb3IgZXhhbXBsZSwgaW4KKyAgLy8vICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIEEgeyAuLi4gfTsKKyAgLy8vIHRoaXMgaXMgQTxUPiwgd2hlcmVhcyBpbgorICAvLy8gICB0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4gY2xhc3MgQTxCPFgsWT4gPiB7IC4uLiB9OworICAvLy8gdGhpcyBpcyBBPEI8WCxZPiA+LgorICAvLy8KKyAgLy8vIEl0IGlzIGFsd2F5cyB1bnF1YWxpZmllZCwgYWx3YXlzIGEgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdHlwZSwKKyAgLy8vIGFuZCBhbHdheXMgZGVwZW5kZW50LgorICBRdWFsVHlwZSBJbmplY3RlZFR5cGU7CisKKyAgSW5qZWN0ZWRDbGFzc05hbWVUeXBlKENYWFJlY29yZERlY2wgKkQsIFF1YWxUeXBlIFRTVCkKKyAgICAgIDogVHlwZShJbmplY3RlZENsYXNzTmFtZSwgUXVhbFR5cGUoKSwgLypEZXBlbmRlbnQ9Ki90cnVlLAorICAgICAgICAgICAgIC8qSW5zdGFudGlhdGlvbkRlcGVuZGVudD0qL3RydWUsCisgICAgICAgICAgICAgLypWYXJpYWJseU1vZGlmaWVkPSovZmFsc2UsCisgICAgICAgICAgICAgLypDb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrPSovZmFsc2UpLAorICAgICAgICBEZWNsKEQpLCBJbmplY3RlZFR5cGUoVFNUKSB7CisgICAgYXNzZXJ0KGlzYTxUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZT4oVFNUKSk7CisgICAgYXNzZXJ0KCFUU1QuaGFzUXVhbGlmaWVycygpKTsKKyAgICBhc3NlcnQoVFNULT5pc0RlcGVuZGVudFR5cGUoKSk7CisgIH0KKworcHVibGljOgorICBRdWFsVHlwZSBnZXRJbmplY3RlZFNwZWNpYWxpemF0aW9uVHlwZSgpIGNvbnN0IHsgcmV0dXJuIEluamVjdGVkVHlwZTsgfQorCisgIGNvbnN0IFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlICpnZXRJbmplY3RlZFRTVCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZT4oSW5qZWN0ZWRUeXBlLmdldFR5cGVQdHIoKSk7CisgIH0KKworICBUZW1wbGF0ZU5hbWUgZ2V0VGVtcGxhdGVOYW1lKCkgY29uc3QgeworICAgIHJldHVybiBnZXRJbmplY3RlZFRTVCgpLT5nZXRUZW1wbGF0ZU5hbWUoKTsKKyAgfQorCisgIENYWFJlY29yZERlY2wgKmdldERlY2woKSBjb25zdDsKKworICBib29sIGlzU3VnYXJlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIFF1YWxUeXBlIGRlc3VnYXIoKSBjb25zdCB7IHJldHVybiBRdWFsVHlwZSh0aGlzLCAwKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlQ2xhc3MoKSA9PSBJbmplY3RlZENsYXNzTmFtZTsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGUga2luZCBvZiBhIHRhZyB0eXBlLgorZW51bSBUYWdUeXBlS2luZCB7CisgIC8vLyBcYnJpZWYgVGhlICJzdHJ1Y3QiIGtleXdvcmQuCisgIFRUS19TdHJ1Y3QsCisKKyAgLy8vIFxicmllZiBUaGUgIl9faW50ZXJmYWNlIiBrZXl3b3JkLgorICBUVEtfSW50ZXJmYWNlLAorCisgIC8vLyBcYnJpZWYgVGhlICJ1bmlvbiIga2V5d29yZC4KKyAgVFRLX1VuaW9uLAorCisgIC8vLyBcYnJpZWYgVGhlICJjbGFzcyIga2V5d29yZC4KKyAgVFRLX0NsYXNzLAorCisgIC8vLyBcYnJpZWYgVGhlICJlbnVtIiBrZXl3b3JkLgorICBUVEtfRW51bQorfTsKKworLy8vIFxicmllZiBUaGUgZWxhYm9yYXRpb24ga2V5d29yZCB0aGF0IHByZWNlZGVzIGEgcXVhbGlmaWVkIHR5cGUgbmFtZSBvcgorLy8vIGludHJvZHVjZXMgYW4gZWxhYm9yYXRlZC10eXBlLXNwZWNpZmllci4KK2VudW0gRWxhYm9yYXRlZFR5cGVLZXl3b3JkIHsKKyAgLy8vIFxicmllZiBUaGUgInN0cnVjdCIga2V5d29yZCBpbnRyb2R1Y2VzIHRoZSBlbGFib3JhdGVkLXR5cGUtc3BlY2lmaWVyLgorICBFVEtfU3RydWN0LAorCisgIC8vLyBcYnJpZWYgVGhlICJfX2ludGVyZmFjZSIga2V5d29yZCBpbnRyb2R1Y2VzIHRoZSBlbGFib3JhdGVkLXR5cGUtc3BlY2lmaWVyLgorICBFVEtfSW50ZXJmYWNlLAorCisgIC8vLyBcYnJpZWYgVGhlICJ1bmlvbiIga2V5d29yZCBpbnRyb2R1Y2VzIHRoZSBlbGFib3JhdGVkLXR5cGUtc3BlY2lmaWVyLgorICBFVEtfVW5pb24sCisKKyAgLy8vIFxicmllZiBUaGUgImNsYXNzIiBrZXl3b3JkIGludHJvZHVjZXMgdGhlIGVsYWJvcmF0ZWQtdHlwZS1zcGVjaWZpZXIuCisgIEVUS19DbGFzcywKKworICAvLy8gXGJyaWVmIFRoZSAiZW51bSIga2V5d29yZCBpbnRyb2R1Y2VzIHRoZSBlbGFib3JhdGVkLXR5cGUtc3BlY2lmaWVyLgorICBFVEtfRW51bSwKKworICAvLy8gXGJyaWVmIFRoZSAidHlwZW5hbWUiIGtleXdvcmQgcHJlY2VkZXMgdGhlIHF1YWxpZmllZCB0eXBlIG5hbWUsIGUuZy4sCisgIC8vLyBcYyB0eXBlbmFtZSBUOjp0eXBlLgorICBFVEtfVHlwZW5hbWUsCisKKyAgLy8vIFxicmllZiBObyBrZXl3b3JkIHByZWNlZGVzIHRoZSBxdWFsaWZpZWQgdHlwZSBuYW1lLgorICBFVEtfTm9uZQorfTsKKworLy8vIEEgaGVscGVyIGNsYXNzIGZvciBUeXBlIG5vZGVzIGhhdmluZyBhbiBFbGFib3JhdGVkVHlwZUtleXdvcmQuCisvLy8gVGhlIGtleXdvcmQgaW4gc3RvcmVkIGluIHRoZSBmcmVlIGJpdHMgb2YgdGhlIGJhc2UgY2xhc3MuCisvLy8gQWxzbyBwcm92aWRlcyBhIGZldyBzdGF0aWMgaGVscGVycyBmb3IgY29udmVydGluZyBhbmQgcHJpbnRpbmcKKy8vLyBlbGFib3JhdGVkIHR5cGUga2V5d29yZCBhbmQgdGFnIHR5cGUga2luZCBlbnVtZXJhdGlvbnMuCitjbGFzcyBUeXBlV2l0aEtleXdvcmQgOiBwdWJsaWMgVHlwZSB7Citwcm90ZWN0ZWQ6CisgIFR5cGVXaXRoS2V5d29yZChFbGFib3JhdGVkVHlwZUtleXdvcmQgS2V5d29yZCwgVHlwZUNsYXNzIHRjLAorICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgQ2Fub25pY2FsLCBib29sIERlcGVuZGVudCwKKyAgICAgICAgICAgICAgICAgIGJvb2wgSW5zdGFudGlhdGlvbkRlcGVuZGVudCwgYm9vbCBWYXJpYWJseU1vZGlmaWVkLAorICAgICAgICAgICAgICAgICAgYm9vbCBDb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKQorICAgICAgOiBUeXBlKHRjLCBDYW5vbmljYWwsIERlcGVuZGVudCwgSW5zdGFudGlhdGlvbkRlcGVuZGVudCwgVmFyaWFibHlNb2RpZmllZCwKKyAgICAgICAgICAgICBDb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKSB7CisgICAgVHlwZVdpdGhLZXl3b3JkQml0cy5LZXl3b3JkID0gS2V5d29yZDsKKyAgfQorCitwdWJsaWM6CisgIEVsYWJvcmF0ZWRUeXBlS2V5d29yZCBnZXRLZXl3b3JkKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGFib3JhdGVkVHlwZUtleXdvcmQ+KFR5cGVXaXRoS2V5d29yZEJpdHMuS2V5d29yZCk7CisgIH0KKworICAvLy8gQ29udmVydHMgYSB0eXBlIHNwZWNpZmllciAoRGVjbFNwZWM6OlRTVCkgaW50byBhbiBlbGFib3JhdGVkIHR5cGUga2V5d29yZC4KKyAgc3RhdGljIEVsYWJvcmF0ZWRUeXBlS2V5d29yZCBnZXRLZXl3b3JkRm9yVHlwZVNwZWModW5zaWduZWQgVHlwZVNwZWMpOworCisgIC8vLyBDb252ZXJ0cyBhIHR5cGUgc3BlY2lmaWVyIChEZWNsU3BlYzo6VFNUKSBpbnRvIGEgdGFnIHR5cGUga2luZC4KKyAgLy8vIEl0IGlzIGFuIGVycm9yIHRvIHByb3ZpZGUgYSB0eXBlIHNwZWNpZmllciB3aGljaCAqaXNuJ3QqIGEgdGFnIGtpbmQgaGVyZS4KKyAgc3RhdGljIFRhZ1R5cGVLaW5kIGdldFRhZ1R5cGVLaW5kRm9yVHlwZVNwZWModW5zaWduZWQgVHlwZVNwZWMpOworCisgIC8vLyBDb252ZXJ0cyBhIFRhZ1R5cGVLaW5kIGludG8gYW4gZWxhYm9yYXRlZCB0eXBlIGtleXdvcmQuCisgIHN0YXRpYyBFbGFib3JhdGVkVHlwZUtleXdvcmQgZ2V0S2V5d29yZEZvclRhZ1R5cGVLaW5kKFRhZ1R5cGVLaW5kIFRhZyk7CisKKyAgLy8vIENvbnZlcnRzIGFuIGVsYWJvcmF0ZWQgdHlwZSBrZXl3b3JkIGludG8gYSBUYWdUeXBlS2luZC4KKyAgLy8vIEl0IGlzIGFuIGVycm9yIHRvIHByb3ZpZGUgYW4gZWxhYm9yYXRlZCB0eXBlIGtleXdvcmQKKyAgLy8vIHdoaWNoICppc24ndCogYSB0YWcga2luZCBoZXJlLgorICBzdGF0aWMgVGFnVHlwZUtpbmQgZ2V0VGFnVHlwZUtpbmRGb3JLZXl3b3JkKEVsYWJvcmF0ZWRUeXBlS2V5d29yZCBLZXl3b3JkKTsKKworICBzdGF0aWMgYm9vbCBLZXl3b3JkSXNUYWdUeXBlS2luZChFbGFib3JhdGVkVHlwZUtleXdvcmQgS2V5d29yZCk7CisKKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRLZXl3b3JkTmFtZShFbGFib3JhdGVkVHlwZUtleXdvcmQgS2V5d29yZCk7CisKKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRUYWdUeXBlS2luZE5hbWUoVGFnVHlwZUtpbmQgS2luZCkgeworICAgIHJldHVybiBnZXRLZXl3b3JkTmFtZShnZXRLZXl3b3JkRm9yVGFnVHlwZUtpbmQoS2luZCkpOworICB9CisKKyAgY2xhc3MgQ2Fubm90Q2FzdFRvVGhpc1R5cGUge307CisgIHN0YXRpYyBDYW5ub3RDYXN0VG9UaGlzVHlwZSBjbGFzc29mKGNvbnN0IFR5cGUgKik7Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSB0eXBlIHRoYXQgd2FzIHJlZmVycmVkIHRvIHVzaW5nIGFuIGVsYWJvcmF0ZWQgdHlwZQorLy8vIGtleXdvcmQsIGUuZy4sIHN0cnVjdCBTLCBvciB2aWEgYSBxdWFsaWZpZWQgbmFtZSwgZS5nLiwgTjo6TTo6dHlwZSwKKy8vLyBvciBib3RoLgorLy8vCisvLy8gVGhpcyB0eXBlIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBhIHR5cGUgbmFtZSBhcyB3cml0dGVuIGluIHRoZQorLy8vIHNvdXJjZSBjb2RlLCBpbmNsdWRpbmcgdGFnIGtleXdvcmRzIGFuZCBhbnkgbmVzdGVkLW5hbWUtc3BlY2lmaWVycy4KKy8vLyBUaGUgdHlwZSBpdHNlbGYgaXMgYWx3YXlzICJzdWdhciIsIHVzZWQgdG8gZXhwcmVzcyB3aGF0IHdhcyB3cml0dGVuCisvLy8gaW4gdGhlIHNvdXJjZSBjb2RlIGJ1dCBjb250YWluaW5nIG5vIGFkZGl0aW9uYWwgc2VtYW50aWMgaW5mb3JtYXRpb24uCitjbGFzcyBFbGFib3JhdGVkVHlwZSA6IHB1YmxpYyBUeXBlV2l0aEtleXdvcmQsIHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RDb250ZXh0OyAvLyBBU1RDb250ZXh0IGNyZWF0ZXMgdGhlc2UKKworICAvLy8gVGhlIG5lc3RlZCBuYW1lIHNwZWNpZmllciBjb250YWluaW5nIHRoZSBxdWFsaWZpZXIuCisgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUzsKKworICAvLy8gVGhlIHR5cGUgdGhhdCB0aGlzIHF1YWxpZmllZCBuYW1lIHJlZmVycyB0by4KKyAgUXVhbFR5cGUgTmFtZWRUeXBlOworCisgIEVsYWJvcmF0ZWRUeXBlKEVsYWJvcmF0ZWRUeXBlS2V5d29yZCBLZXl3b3JkLCBOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlMsCisgICAgICAgICAgICAgICAgIFF1YWxUeXBlIE5hbWVkVHlwZSwgUXVhbFR5cGUgQ2Fub25UeXBlKQorICAgIDogVHlwZVdpdGhLZXl3b3JkKEtleXdvcmQsIEVsYWJvcmF0ZWQsIENhbm9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBOYW1lZFR5cGUtPmlzRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgIE5hbWVkVHlwZS0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgIE5hbWVkVHlwZS0+aXNWYXJpYWJseU1vZGlmaWVkVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgIE5hbWVkVHlwZS0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSwKKyAgICAgIE5OUyhOTlMpLCBOYW1lZFR5cGUoTmFtZWRUeXBlKSB7CisgICAgYXNzZXJ0KCEoS2V5d29yZCA9PSBFVEtfTm9uZSAmJiBOTlMgPT0gbnVsbHB0cikgJiYKKyAgICAgICAgICAgIkVsYWJvcmF0ZWRUeXBlIGNhbm5vdCBoYXZlIGVsYWJvcmF0ZWQgdHlwZSBrZXl3b3JkICIKKyAgICAgICAgICAgImFuZCBuYW1lIHF1YWxpZmllciBib3RoIG51bGwuIik7CisgIH0KKworcHVibGljOgorICB+RWxhYm9yYXRlZFR5cGUoKTsKKworICAvLy8gUmV0cmlldmUgdGhlIHF1YWxpZmljYXRpb24gb24gdGhpcyB0eXBlLgorICBOZXN0ZWROYW1lU3BlY2lmaWVyICpnZXRRdWFsaWZpZXIoKSBjb25zdCB7IHJldHVybiBOTlM7IH0KKworICAvLy8gUmV0cmlldmUgdGhlIHR5cGUgbmFtZWQgYnkgdGhlIHF1YWxpZmllZC1pZC4KKyAgUXVhbFR5cGUgZ2V0TmFtZWRUeXBlKCkgY29uc3QgeyByZXR1cm4gTmFtZWRUeXBlOyB9CisKKyAgLy8vIFJlbW92ZSBhIHNpbmdsZSBsZXZlbCBvZiBzdWdhci4KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0IHsgcmV0dXJuIGdldE5hbWVkVHlwZSgpOyB9CisKKyAgLy8vIFJldHVybnMgd2hldGhlciB0aGlzIHR5cGUgZGlyZWN0bHkgcHJvdmlkZXMgc3VnYXIuCisgIGJvb2wgaXNTdWdhcmVkKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIFByb2ZpbGUoSUQsIGdldEtleXdvcmQoKSwgTk5TLCBOYW1lZFR5cGUpOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgRWxhYm9yYXRlZFR5cGVLZXl3b3JkIEtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllciAqTk5TLCBRdWFsVHlwZSBOYW1lZFR5cGUpIHsKKyAgICBJRC5BZGRJbnRlZ2VyKEtleXdvcmQpOworICAgIElELkFkZFBvaW50ZXIoTk5TKTsKKyAgICBOYW1lZFR5cGUuUHJvZmlsZShJRCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gRWxhYm9yYXRlZDsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgcXVhbGlmaWVkIHR5cGUgbmFtZSBmb3Igd2hpY2ggdGhlIHR5cGUgbmFtZSBpcworLy8vIGRlcGVuZGVudC4KKy8vLworLy8vIERlcGVuZGVudE5hbWVUeXBlIHJlcHJlc2VudHMgYSBjbGFzcyBvZiBkZXBlbmRlbnQgdHlwZXMgdGhhdCBpbnZvbHZlIGEKKy8vLyBwb3NzaWJseSBkZXBlbmRlbnQgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIChlLmcuLCAiVDo6IikgZm9sbG93ZWQgYnkgYQorLy8vIG5hbWUgb2YgYSB0eXBlLiBUaGUgRGVwZW5kZW50TmFtZVR5cGUgbWF5IHN0YXJ0IHdpdGggYSAidHlwZW5hbWUiIChmb3IgYQorLy8vIHR5cGVuYW1lLXNwZWNpZmllciksICJjbGFzcyIsICJzdHJ1Y3QiLCAidW5pb24iLCBvciAiZW51bSIgKGZvciBhCisvLy8gZGVwZW5kZW50IGVsYWJvcmF0ZWQtdHlwZS1zcGVjaWZpZXIpLCBvciBub3RoaW5nIChpbiBjb250ZXh0cyB3aGVyZSB3ZQorLy8vIGtub3cgdGhhdCB3ZSBtdXN0IGJlIHJlZmVycmluZyB0byBhIHR5cGUsIGUuZy4sIGluIGEgYmFzZSBjbGFzcyBzcGVjaWZpZXIpLgorLy8vIFR5cGljYWxseSB0aGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIGlzIGRlcGVuZGVudCwgYnV0IGluIE1TVkMgY29tcGF0aWJpbGl0eQorLy8vIG1vZGUsIHRoaXMgdHlwZSBpcyB1c2VkIHdpdGggbm9uLWRlcGVuZGVudCBuYW1lcyB0byBkZWxheSBuYW1lIGxvb2t1cCB1bnRpbAorLy8vIGluc3RhbnRpYXRpb24uCitjbGFzcyBEZXBlbmRlbnROYW1lVHlwZSA6IHB1YmxpYyBUeXBlV2l0aEtleXdvcmQsIHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RDb250ZXh0OyAvLyBBU1RDb250ZXh0IGNyZWF0ZXMgdGhlc2UKKworICAvLy8gXGJyaWVmIFRoZSBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIgY29udGFpbmluZyB0aGUgcXVhbGlmaWVyLgorICBOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlM7CisKKyAgLy8vIFxicmllZiBUaGUgdHlwZSB0aGF0IHRoaXMgdHlwZW5hbWUgc3BlY2lmaWVyIHJlZmVycyB0by4KKyAgY29uc3QgSWRlbnRpZmllckluZm8gKk5hbWU7CisKKyAgRGVwZW5kZW50TmFtZVR5cGUoRWxhYm9yYXRlZFR5cGVLZXl3b3JkIEtleXdvcmQsIE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSWRlbnRpZmllckluZm8gKk5hbWUsIFF1YWxUeXBlIENhbm9uVHlwZSkKKyAgICAgIDogVHlwZVdpdGhLZXl3b3JkKEtleXdvcmQsIERlcGVuZGVudE5hbWUsIENhbm9uVHlwZSwgLypEZXBlbmRlbnQ9Ki90cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgLypJbnN0YW50aWF0aW9uRGVwZW5kZW50PSovdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qVmFyaWFibHlNb2RpZmllZD0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTk5TLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgICBOTlMoTk5TKSwgTmFtZShOYW1lKSB7fQorCitwdWJsaWM6CisgIC8vLyBSZXRyaWV2ZSB0aGUgcXVhbGlmaWNhdGlvbiBvbiB0aGlzIHR5cGUuCisgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKmdldFF1YWxpZmllcigpIGNvbnN0IHsgcmV0dXJuIE5OUzsgfQorCisgIC8vLyBSZXRyaWV2ZSB0aGUgdHlwZSBuYW1lZCBieSB0aGUgdHlwZW5hbWUgc3BlY2lmaWVyIGFzIGFuIGlkZW50aWZpZXIuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIHdpbGwgcmV0dXJuIGEgbm9uLU5VTEwgaWRlbnRpZmllciBwb2ludGVyIHdoZW4gdGhlCisgIC8vLyBmb3JtIG9mIHRoZSBvcmlnaW5hbCB0eXBlbmFtZSB3YXMgdGVybWluYXRlZCBieSBhbiBpZGVudGlmaWVyLAorICAvLy8gZS5nLiwgInR5cGVuYW1lIFQ6OnR5cGUiLgorICBjb25zdCBJZGVudGlmaWVySW5mbyAqZ2V0SWRlbnRpZmllcigpIGNvbnN0IHsKKyAgICByZXR1cm4gTmFtZTsKKyAgfQorCisgIGJvb2wgaXNTdWdhcmVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0IHsgcmV0dXJuIFF1YWxUeXBlKHRoaXMsIDApOyB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgUHJvZmlsZShJRCwgZ2V0S2V5d29yZCgpLCBOTlMsIE5hbWUpOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgRWxhYm9yYXRlZFR5cGVLZXl3b3JkIEtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllciAqTk5TLCBjb25zdCBJZGVudGlmaWVySW5mbyAqTmFtZSkgeworICAgIElELkFkZEludGVnZXIoS2V5d29yZCk7CisgICAgSUQuQWRkUG9pbnRlcihOTlMpOworICAgIElELkFkZFBvaW50ZXIoTmFtZSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gRGVwZW5kZW50TmFtZTsKKyAgfQorfTsKKworLy8vIFJlcHJlc2VudHMgYSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0eXBlIHdob3NlIHRlbXBsYXRlIGNhbm5vdCBiZQorLy8vIHJlc29sdmVkLCBlLmcuCisvLy8gICBBPFQ+Ojp0ZW1wbGF0ZSBCPFQ+CitjbGFzcyBMTFZNX0FMSUdOQVMoLyphbGlnbm9mKHVpbnQ2NF90KSovIDgpIERlcGVuZGVudFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlCisgICAgOiBwdWJsaWMgVHlwZVdpdGhLZXl3b3JkLAorICAgICAgcHVibGljIGxsdm06OkZvbGRpbmdTZXROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7IC8vIEFTVENvbnRleHQgY3JlYXRlcyB0aGVzZQorCisgIC8vLyBUaGUgbmVzdGVkIG5hbWUgc3BlY2lmaWVyIGNvbnRhaW5pbmcgdGhlIHF1YWxpZmllci4KKyAgTmVzdGVkTmFtZVNwZWNpZmllciAqTk5TOworCisgIC8vLyBUaGUgaWRlbnRpZmllciBvZiB0aGUgdGVtcGxhdGUuCisgIGNvbnN0IElkZW50aWZpZXJJbmZvICpOYW1lOworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMgbmFtZWQgaW4gdGhpcyBjbGFzcyB0ZW1wbGF0ZQorICAvLy8gc3BlY2lhbGl6YXRpb24uCisgIHVuc2lnbmVkIE51bUFyZ3M7CisKKyAgRGVwZW5kZW50VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUoRWxhYm9yYXRlZFR5cGVLZXl3b3JkIEtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSWRlbnRpZmllckluZm8gKk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIENhbm9uKTsKKworICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpnZXRBcmdCdWZmZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVGVtcGxhdGVBcmd1bWVudCo+KHRoaXMrMSk7CisgIH0KKworICBUZW1wbGF0ZUFyZ3VtZW50ICpnZXRBcmdCdWZmZXIoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VGVtcGxhdGVBcmd1bWVudCo+KHRoaXMrMSk7CisgIH0KKworcHVibGljOgorICBOZXN0ZWROYW1lU3BlY2lmaWVyICpnZXRRdWFsaWZpZXIoKSBjb25zdCB7IHJldHVybiBOTlM7IH0KKyAgY29uc3QgSWRlbnRpZmllckluZm8gKmdldElkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdGVtcGxhdGUgYXJndW1lbnRzLgorICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpnZXRBcmdzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRBcmdCdWZmZXIoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMuCisgIHVuc2lnbmVkIGdldE51bUFyZ3MoKSBjb25zdCB7IHJldHVybiBOdW1BcmdzOyB9CisKKyAgY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmZ2V0QXJnKHVuc2lnbmVkIElkeCkgY29uc3Q7IC8vIGluIFRlbXBsYXRlQmFzZS5oCisKKyAgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gdGVtcGxhdGVfYXJndW1lbnRzKCkgY29uc3QgeworICAgIHJldHVybiB7Z2V0QXJncygpLCBOdW1BcmdzfTsKKyAgfQorCisgIHVzaW5nIGl0ZXJhdG9yID0gY29uc3QgVGVtcGxhdGVBcmd1bWVudCAqOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gZ2V0QXJncygpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0OyAvLyBpbmxpbmUgaW4gVGVtcGxhdGVCYXNlLmgKKworICBib29sIGlzU3VnYXJlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIFF1YWxUeXBlIGRlc3VnYXIoKSBjb25zdCB7IHJldHVybiBRdWFsVHlwZSh0aGlzLCAwKTsgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCkgeworICAgIFByb2ZpbGUoSUQsIENvbnRleHQsIGdldEtleXdvcmQoKSwgTk5TLCBOYW1lLCB7Z2V0QXJncygpLCBOdW1BcmdzfSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgRWxhYm9yYXRlZFR5cGVLZXl3b3JkIEtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllciAqUXVhbGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElkZW50aWZpZXJJbmZvICpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IEFyZ3MpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlQ2xhc3MoKSA9PSBEZXBlbmRlbnRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBwYWNrIGV4cGFuc2lvbiBvZiB0eXBlcy4KKy8vLworLy8vIFBhY2sgZXhwYW5zaW9ucyBhcmUgcGFydCBvZiBDKysxMSB2YXJpYWRpYyB0ZW1wbGF0ZXMuIEEgcGFjaworLy8vIGV4cGFuc2lvbiBjb250YWlucyBhIHBhdHRlcm4sIHdoaWNoIGl0c2VsZiBjb250YWlucyBvbmUgb3IgbW9yZQorLy8vICJ1bmV4cGFuZGVkIiBwYXJhbWV0ZXIgcGFja3MuIFdoZW4gaW5zdGFudGlhdGVkLCBhIHBhY2sgZXhwYW5zaW9uCisvLy8gcHJvZHVjZXMgYSBzZXJpZXMgb2YgdHlwZXMsIGVhY2ggaW5zdGFudGlhdGVkIGZyb20gdGhlIHBhdHRlcm4gb2YKKy8vLyB0aGUgZXhwYW5zaW9uLCB3aGVyZSB0aGUgSXRoIGluc3RhbnRpYXRpb24gb2YgdGhlIHBhdHRlcm4gdXNlcyB0aGUKKy8vLyBJdGggYXJndW1lbnRzIGJvdW5kIHRvIGVhY2ggb2YgdGhlIHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2tzLiBUaGUKKy8vLyBwYWNrIGV4cGFuc2lvbiBpcyBjb25zaWRlcmVkIHRvICJleHBhbmQiIHRoZXNlIHVuZXhwYW5kZWQKKy8vLyBwYXJhbWV0ZXIgcGFja3MuCisvLy8KKy8vLyBcY29kZQorLy8vIHRlbXBsYXRlPHR5cGVuYW1lIC4uLlR5cGVzPiBzdHJ1Y3QgdHVwbGU7CisvLy8KKy8vLyB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5UeXBlcz4KKy8vLyBzdHJ1Y3QgdHVwbGVfb2ZfcmVmZXJlbmNlcyB7CisvLy8gICB0eXBlZGVmIHR1cGxlPFR5cGVzJi4uLj4gdHlwZTsKKy8vLyB9OworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBIZXJlLCB0aGUgcGFjayBleHBhbnNpb24gXGMgVHlwZXMmLi4uIGlzIHJlcHJlc2VudGVkIHZpYSBhCisvLy8gUGFja0V4cGFuc2lvblR5cGUgd2hvc2UgcGF0dGVybiBpcyBUeXBlcyYuCitjbGFzcyBQYWNrRXhwYW5zaW9uVHlwZSA6IHB1YmxpYyBUeXBlLCBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsgLy8gQVNUQ29udGV4dCBjcmVhdGVzIHRoZXNlCisKKyAgLy8vIFxicmllZiBUaGUgcGF0dGVybiBvZiB0aGUgcGFjayBleHBhbnNpb24uCisgIFF1YWxUeXBlIFBhdHRlcm47CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGV4cGFuc2lvbnMgdGhhdCB0aGlzIHBhY2sgZXhwYW5zaW9uIHdpbGwKKyAgLy8vIGdlbmVyYXRlIHdoZW4gc3Vic3RpdHV0ZWQgKCsxKSwgb3IgaW5kaWNhdGVzIHRoYXQKKyAgLy8vCisgIC8vLyBUaGlzIGZpZWxkIHdpbGwgb25seSBoYXZlIGEgbm9uLXplcm8gdmFsdWUgd2hlbiBzb21lIG9mIHRoZSBwYXJhbWV0ZXIKKyAgLy8vIHBhY2tzIHRoYXQgb2NjdXIgd2l0aGluIHRoZSBwYXR0ZXJuIGhhdmUgYmVlbiBzdWJzdGl0dXRlZCBidXQgb3RoZXJzIGhhdmUKKyAgLy8vIG5vdC4KKyAgdW5zaWduZWQgTnVtRXhwYW5zaW9uczsKKworICBQYWNrRXhwYW5zaW9uVHlwZShRdWFsVHlwZSBQYXR0ZXJuLCBRdWFsVHlwZSBDYW5vbiwKKyAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8dW5zaWduZWQ+IE51bUV4cGFuc2lvbnMpCisgICAgICA6IFR5cGUoUGFja0V4cGFuc2lvbiwgQ2Fub24sIC8qRGVwZW5kZW50PSovUGF0dGVybi0+aXNEZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgICAgLypJbnN0YW50aWF0aW9uRGVwZW5kZW50PSovdHJ1ZSwKKyAgICAgICAgICAgICAvKlZhcmlhYmx5TW9kaWZpZWQ9Ki9QYXR0ZXJuLT5pc1ZhcmlhYmx5TW9kaWZpZWRUeXBlKCksCisgICAgICAgICAgICAgLypDb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrPSovZmFsc2UpLAorICAgICAgICBQYXR0ZXJuKFBhdHRlcm4pLAorICAgICAgICBOdW1FeHBhbnNpb25zKE51bUV4cGFuc2lvbnMgPyAqTnVtRXhwYW5zaW9ucyArIDEgOiAwKSB7fQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHBhdHRlcm4gb2YgdGhpcyBwYWNrIGV4cGFuc2lvbiwgd2hpY2ggaXMgdGhlCisgIC8vLyB0eXBlIHRoYXQgd2lsbCBiZSByZXBlYXRlZGx5IGluc3RhbnRpYXRlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlCisgIC8vLyBwYWNrIGV4cGFuc2lvbiBpdHNlbGYuCisgIFF1YWxUeXBlIGdldFBhdHRlcm4oKSBjb25zdCB7IHJldHVybiBQYXR0ZXJuOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIGV4cGFuc2lvbnMgdGhhdCB0aGlzIHBhY2sgZXhwYW5zaW9uIHdpbGwKKyAgLy8vIGdlbmVyYXRlLCBpZiBrbm93bi4KKyAgT3B0aW9uYWw8dW5zaWduZWQ+IGdldE51bUV4cGFuc2lvbnMoKSBjb25zdCB7CisgICAgaWYgKE51bUV4cGFuc2lvbnMpCisgICAgICByZXR1cm4gTnVtRXhwYW5zaW9ucyAtIDE7CisKKyAgICByZXR1cm4gTm9uZTsKKyAgfQorCisgIGJvb2wgaXNTdWdhcmVkKCkgY29uc3QgeyByZXR1cm4gIVBhdHRlcm4tPmlzRGVwZW5kZW50VHlwZSgpOyB9CisgIFF1YWxUeXBlIGRlc3VnYXIoKSBjb25zdCB7IHJldHVybiBpc1N1Z2FyZWQoKSA/IFBhdHRlcm4gOiBRdWFsVHlwZSh0aGlzLCAwKTsgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIFByb2ZpbGUoSUQsIGdldFBhdHRlcm4oKSwgZ2V0TnVtRXhwYW5zaW9ucygpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIFF1YWxUeXBlIFBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8dW5zaWduZWQ+IE51bUV4cGFuc2lvbnMpIHsKKyAgICBJRC5BZGRQb2ludGVyKFBhdHRlcm4uZ2V0QXNPcGFxdWVQdHIoKSk7CisgICAgSUQuQWRkQm9vbGVhbihOdW1FeHBhbnNpb25zLmhhc1ZhbHVlKCkpOworICAgIGlmIChOdW1FeHBhbnNpb25zKQorICAgICAgSUQuQWRkSW50ZWdlcigqTnVtRXhwYW5zaW9ucyk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gUGFja0V4cGFuc2lvbjsKKyAgfQorfTsKKworLy8vIFRoaXMgY2xhc3Mgd3JhcHMgdGhlIGxpc3Qgb2YgcHJvdG9jb2wgcXVhbGlmaWVycy4gRm9yIHR5cGVzIHRoYXQgY2FuCisvLy8gdGFrZSBPYmpDIHByb3RvY29sIHF1YWxpZmVycywgdGhleSBjYW4gc3ViY2xhc3MgdGhpcyBjbGFzcy4KK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgT2JqQ1Byb3RvY29sUXVhbGlmaWVycyB7Citwcm90ZWN0ZWQ6CisgIE9iakNQcm90b2NvbFF1YWxpZmllcnMoKSA9IGRlZmF1bHQ7CisKKyAgT2JqQ1Byb3RvY29sRGVjbCAqIGNvbnN0ICpnZXRQcm90b2NvbFN0b3JhZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8T2JqQ1Byb3RvY29sUXVhbGlmaWVycyo+KHRoaXMpLT5nZXRQcm90b2NvbFN0b3JhZ2UoKTsKKyAgfQorCisgIE9iakNQcm90b2NvbERlY2wgKipnZXRQcm90b2NvbFN0b3JhZ2UoKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPih0aGlzKS0+Z2V0UHJvdG9jb2xTdG9yYWdlSW1wbCgpOworICB9CisKKyAgdm9pZCBzZXROdW1Qcm90b2NvbHModW5zaWduZWQgTikgeworICAgIHN0YXRpY19jYXN0PFQqPih0aGlzKS0+c2V0TnVtUHJvdG9jb2xzSW1wbChOKTsKKyAgfQorCisgIHZvaWQgaW5pdGlhbGl6ZShBcnJheVJlZjxPYmpDUHJvdG9jb2xEZWNsICo+IHByb3RvY29scykgeworICAgIHNldE51bVByb3RvY29scyhwcm90b2NvbHMuc2l6ZSgpKTsKKyAgICBhc3NlcnQoZ2V0TnVtUHJvdG9jb2xzKCkgPT0gcHJvdG9jb2xzLnNpemUoKSAmJgorICAgICAgICAgICAiYml0ZmllbGQgb3ZlcmZsb3cgaW4gcHJvdG9jb2wgY291bnQiKTsKKyAgICBpZiAoIXByb3RvY29scy5lbXB0eSgpKQorICAgICAgbWVtY3B5KGdldFByb3RvY29sU3RvcmFnZSgpLCBwcm90b2NvbHMuZGF0YSgpLAorICAgICAgICAgICAgIHByb3RvY29scy5zaXplKCkgKiBzaXplb2YoT2JqQ1Byb3RvY29sRGVjbCopKTsKKyAgfQorCitwdWJsaWM6CisgIHVzaW5nIHF1YWxfaXRlcmF0b3IgPSBPYmpDUHJvdG9jb2xEZWNsICogY29uc3QgKjsKKyAgdXNpbmcgcXVhbF9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPHF1YWxfaXRlcmF0b3I+OworCisgIHF1YWxfcmFuZ2UgcXVhbHMoKSBjb25zdCB7IHJldHVybiBxdWFsX3JhbmdlKHF1YWxfYmVnaW4oKSwgcXVhbF9lbmQoKSk7IH0KKyAgcXVhbF9pdGVyYXRvciBxdWFsX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gZ2V0UHJvdG9jb2xTdG9yYWdlKCk7IH0KKyAgcXVhbF9pdGVyYXRvciBxdWFsX2VuZCgpIGNvbnN0IHsgcmV0dXJuIHF1YWxfYmVnaW4oKSArIGdldE51bVByb3RvY29scygpOyB9CisKKyAgYm9vbCBxdWFsX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtUHJvdG9jb2xzKCkgPT0gMDsgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBxdWFsaWZ5aW5nIHByb3RvY29scyBpbiB0aGlzIHR5cGUsIG9yIDAgaWYKKyAgLy8vIHRoZXJlIGFyZSBub25lLgorICB1bnNpZ25lZCBnZXROdW1Qcm90b2NvbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFQqPih0aGlzKS0+Z2V0TnVtUHJvdG9jb2xzSW1wbCgpOworICB9CisKKyAgLy8vIEZldGNoIGEgcHJvdG9jb2wgYnkgaW5kZXguCisgIE9iakNQcm90b2NvbERlY2wgKmdldFByb3RvY29sKHVuc2lnbmVkIEkpIGNvbnN0IHsKKyAgICBhc3NlcnQoSSA8IGdldE51bVByb3RvY29scygpICYmICJPdXQtb2YtcmFuZ2UgcHJvdG9jb2wgYWNjZXNzIik7CisgICAgcmV0dXJuIHF1YWxfYmVnaW4oKVtJXTsKKyAgfQorCisgIC8vLyBSZXRyaWV2ZSBhbGwgb2YgdGhlIHByb3RvY29sIHF1YWxpZmllcnMuCisgIEFycmF5UmVmPE9iakNQcm90b2NvbERlY2wgKj4gZ2V0UHJvdG9jb2xzKCkgY29uc3QgeworICAgIHJldHVybiBBcnJheVJlZjxPYmpDUHJvdG9jb2xEZWNsICo+KHF1YWxfYmVnaW4oKSwgZ2V0TnVtUHJvdG9jb2xzKCkpOworICB9Cit9OworCisvLy8gUmVwcmVzZW50cyBhIHR5cGUgcGFyYW1ldGVyIHR5cGUgaW4gT2JqZWN0aXZlIEMuIEl0IGNhbiB0YWtlCisvLy8gYSBsaXN0IG9mIHByb3RvY29scy4KK2NsYXNzIE9iakNUeXBlUGFyYW1UeXBlIDogcHVibGljIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmpDUHJvdG9jb2xRdWFsaWZpZXJzPE9iakNUeXBlUGFyYW1UeXBlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGxsdm06OkZvbGRpbmdTZXROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7CisgIGZyaWVuZCBjbGFzcyBPYmpDUHJvdG9jb2xRdWFsaWZpZXJzPE9iakNUeXBlUGFyYW1UeXBlPjsKKworICAvLy8gVGhlIG51bWJlciBvZiBwcm90b2NvbHMgc3RvcmVkIG9uIHRoaXMgdHlwZS4KKyAgdW5zaWduZWQgTnVtUHJvdG9jb2xzIDogNjsKKworICBPYmpDVHlwZVBhcmFtRGVjbCAqT1RQRGVjbDsKKworICAvLy8gVGhlIHByb3RvY29scyBhcmUgc3RvcmVkIGFmdGVyIHRoZSBPYmpDVHlwZVBhcmFtVHlwZSBub2RlLiBJbiB0aGUKKyAgLy8vIGNhbm9uaWNhbCB0eXBlLCB0aGUgbGlzdCBvZiBwcm90b2NvbHMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseQorICAvLy8gYW5kIHVuaXF1ZWQuCisgIE9iakNQcm90b2NvbERlY2wgKipnZXRQcm90b2NvbFN0b3JhZ2VJbXBsKCk7CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHF1YWxpZnlpbmcgcHJvdG9jb2xzIGluIHRoaXMgaW50ZXJmYWNlIHR5cGUsCisgIC8vLyBvciAwIGlmIHRoZXJlIGFyZSBub25lLgorICB1bnNpZ25lZCBnZXROdW1Qcm90b2NvbHNJbXBsKCkgY29uc3QgeworICAgIHJldHVybiBOdW1Qcm90b2NvbHM7CisgIH0KKworICB2b2lkIHNldE51bVByb3RvY29sc0ltcGwodW5zaWduZWQgTikgeworICAgIE51bVByb3RvY29scyA9IE47CisgIH0KKworICBPYmpDVHlwZVBhcmFtVHlwZShjb25zdCBPYmpDVHlwZVBhcmFtRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgY2FuLAorICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPYmpDUHJvdG9jb2xEZWNsICo+IHByb3RvY29scyk7CisKK3B1YmxpYzoKKyAgYm9vbCBpc1N1Z2FyZWQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIFF1YWxUeXBlIGRlc3VnYXIoKSBjb25zdCB7IHJldHVybiBnZXRDYW5vbmljYWxUeXBlSW50ZXJuYWwoKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlQ2xhc3MoKSA9PSBPYmpDVHlwZVBhcmFtOworICB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKTsKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDVHlwZVBhcmFtRGVjbCAqT1RQRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPYmpDUHJvdG9jb2xEZWNsICo+IHByb3RvY29scyk7CisKKyAgT2JqQ1R5cGVQYXJhbURlY2wgKmdldERlY2woKSBjb25zdCB7IHJldHVybiBPVFBEZWNsOyB9Cit9OworCisvLy8gUmVwcmVzZW50cyBhIGNsYXNzIHR5cGUgaW4gT2JqZWN0aXZlIEMuCisvLy8KKy8vLyBFdmVyeSBPYmplY3RpdmUgQyB0eXBlIGlzIGEgY29tYmluYXRpb24gb2YgYSBiYXNlIHR5cGUsIGEgc2V0IG9mCisvLy8gdHlwZSBhcmd1bWVudHMgKG9wdGlvbmFsLCBmb3IgcGFyYW1ldGVyaXplZCBjbGFzc2VzKSBhbmQgYSBsaXN0IG9mCisvLy8gcHJvdG9jb2xzLgorLy8vCisvLy8gR2l2ZW4gdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbnM6CisvLy8gXGNvZGUKKy8vLyAgIFxAY2xhc3MgQzxUPjsKKy8vLyAgIFxAcHJvdG9jb2wgUDsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gJ0MnIGlzIGFuIE9iakNJbnRlcmZhY2VUeXBlIEMuICBJdCBpcyBzdWdhciBmb3IgYW4gT2JqQ09iamVjdFR5cGUKKy8vLyB3aXRoIGJhc2UgQyBhbmQgbm8gcHJvdG9jb2xzLgorLy8vCisvLy8gJ0M8UD4nIGlzIGFuIHVuc3BlY2lhbGl6ZWQgT2JqQ09iamVjdFR5cGUgd2l0aCBiYXNlIEMgYW5kIHByb3RvY29sIGxpc3QgW1BdLgorLy8vICdDPEMqPicgaXMgYSBzcGVjaWFsaXplZCBPYmpDT2JqZWN0VHlwZSB3aXRoIHR5cGUgYXJndW1lbnRzICdDKicgYW5kIG5vIAorLy8vIHByb3RvY29sIGxpc3QuCisvLy8gJ0M8Qyo+PFA+JyBpcyBhIHNwZWNpYWxpemVkIE9iakNPYmplY3RUeXBlIHdpdGggYmFzZSBDLCB0eXBlIGFyZ3VtZW50cyAnQyonLAorLy8vIGFuZCBwcm90b2NvbCBsaXN0IFtQXS4KKy8vLworLy8vICdpZCcgaXMgYSBUeXBlZGVmVHlwZSB3aGljaCBpcyBzdWdhciBmb3IgYW4gT2JqQ09iamVjdFBvaW50ZXJUeXBlIHdob3NlCisvLy8gcG9pbnRlZSBpcyBhbiBPYmpDT2JqZWN0VHlwZSB3aXRoIGJhc2UgQnVpbHRpblR5cGU6Ok9iakNJZFR5cGUKKy8vLyBhbmQgbm8gcHJvdG9jb2xzLgorLy8vCisvLy8gJ2lkPFA+JyBpcyBhbiBPYmpDT2JqZWN0UG9pbnRlclR5cGUgd2hvc2UgcG9pbnRlZSBpcyBhbiBPYmpDT2JqZWN0VHlwZQorLy8vIHdpdGggYmFzZSBCdWlsdGluVHlwZTo6T2JqQ0lkVHlwZSBhbmQgcHJvdG9jb2wgbGlzdCBbUF0uICBFdmVudHVhbGx5CisvLy8gdGhpcyBzaG91bGQgZ2V0IGl0cyBvd24gc3VnYXIgY2xhc3MgdG8gYmV0dGVyIHJlcHJlc2VudCB0aGUgc291cmNlLgorY2xhc3MgT2JqQ09iamVjdFR5cGUgOiBwdWJsaWMgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iakNQcm90b2NvbFF1YWxpZmllcnM8T2JqQ09iamVjdFR5cGU+IHsKKyAgZnJpZW5kIGNsYXNzIE9iakNQcm90b2NvbFF1YWxpZmllcnM8T2JqQ09iamVjdFR5cGU+OworCisgIC8vIE9iakNPYmplY3RUeXBlLk51bVR5cGVBcmdzIC0gdGhlIG51bWJlciBvZiB0eXBlIGFyZ3VtZW50cyBzdG9yZWQKKyAgLy8gYWZ0ZXIgdGhlIE9iakNPYmplY3RQb2ludGVyVHlwZSBub2RlLgorICAvLyBPYmpDT2JqZWN0VHlwZS5OdW1Qcm90b2NvbHMgLSB0aGUgbnVtYmVyIG9mIHByb3RvY29scyBzdG9yZWQKKyAgLy8gYWZ0ZXIgdGhlIHR5cGUgYXJndW1lbnRzIG9mIE9iakNPYmplY3RQb2ludGVyVHlwZSBub2RlLgorICAvLworICAvLyBUaGVzZSBwcm90b2NvbHMgYXJlIHRob3NlIHdyaXR0ZW4gZGlyZWN0bHkgb24gdGhlIHR5cGUuICBJZgorICAvLyBwcm90b2NvbCBxdWFsaWZpZXJzIGV2ZXIgYmVjb21lIGFkZGl0aXZlLCB0aGUgaXRlcmF0b3JzIHdpbGwgbmVlZAorICAvLyB0byBnZXQga2luZG9mIGNvbXBsaWNhdGVkLgorICAvLworICAvLyBJbiB0aGUgY2Fub25pY2FsIG9iamVjdCB0eXBlLCB0aGVzZSBhcmUgc29ydGVkIGFscGhhYmV0aWNhbGx5CisgIC8vIGFuZCB1bmlxdWVkLgorCisgIC8vLyBFaXRoZXIgYSBCdWlsdGluVHlwZSBvciBhbiBJbnRlcmZhY2VUeXBlIG9yIHN1Z2FyIGZvciBlaXRoZXIuCisgIFF1YWxUeXBlIEJhc2VUeXBlOworCisgIC8vLyBDYWNoZWQgc3VwZXJjbGFzcyB0eXBlLgorICBtdXRhYmxlIGxsdm06OlBvaW50ZXJJbnRQYWlyPGNvbnN0IE9iakNPYmplY3RUeXBlICosIDEsIGJvb2w+CisgICAgQ2FjaGVkU3VwZXJDbGFzc1R5cGU7CisKKyAgUXVhbFR5cGUgKmdldFR5cGVBcmdTdG9yYWdlKCk7CisgIGNvbnN0IFF1YWxUeXBlICpnZXRUeXBlQXJnU3RvcmFnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxPYmpDT2JqZWN0VHlwZSAqPih0aGlzKS0+Z2V0VHlwZUFyZ1N0b3JhZ2UoKTsKKyAgfQorCisgIE9iakNQcm90b2NvbERlY2wgKipnZXRQcm90b2NvbFN0b3JhZ2VJbXBsKCk7CisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBxdWFsaWZ5aW5nIHByb3RvY29scyBpbiB0aGlzIGludGVyZmFjZSB0eXBlLAorICAvLy8gb3IgMCBpZiB0aGVyZSBhcmUgbm9uZS4KKyAgdW5zaWduZWQgZ2V0TnVtUHJvdG9jb2xzSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gT2JqQ09iamVjdFR5cGVCaXRzLk51bVByb3RvY29sczsKKyAgfQorICB2b2lkIHNldE51bVByb3RvY29sc0ltcGwodW5zaWduZWQgTikgeworICAgIE9iakNPYmplY3RUeXBlQml0cy5OdW1Qcm90b2NvbHMgPSBOOworICB9CisKK3Byb3RlY3RlZDoKKyAgZW51bSBOb25jZV9PYmpDSW50ZXJmYWNlIHsgTm9uY2VfT2JqQ0ludGVyZmFjZSB9OworCisgIE9iakNPYmplY3RUeXBlKFF1YWxUeXBlIENhbm9uaWNhbCwgUXVhbFR5cGUgQmFzZSwKKyAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UXVhbFR5cGU+IHR5cGVBcmdzLAorICAgICAgICAgICAgICAgICBBcnJheVJlZjxPYmpDUHJvdG9jb2xEZWNsICo+IHByb3RvY29scywKKyAgICAgICAgICAgICAgICAgYm9vbCBpc0tpbmRPZik7CisKKyAgT2JqQ09iamVjdFR5cGUoZW51bSBOb25jZV9PYmpDSW50ZXJmYWNlKQorICAgICAgICA6IFR5cGUoT2JqQ0ludGVyZmFjZSwgUXVhbFR5cGUoKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgIEJhc2VUeXBlKFF1YWxUeXBlKHRoaXNfKCksIDApKSB7CisgICAgT2JqQ09iamVjdFR5cGVCaXRzLk51bVByb3RvY29scyA9IDA7CisgICAgT2JqQ09iamVjdFR5cGVCaXRzLk51bVR5cGVBcmdzID0gMDsKKyAgICBPYmpDT2JqZWN0VHlwZUJpdHMuSXNLaW5kT2YgPSAwOworICB9CisKKyAgdm9pZCBjb21wdXRlU3VwZXJDbGFzc1R5cGVTbG93KCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIEdldHMgdGhlIGJhc2UgdHlwZSBvZiB0aGlzIG9iamVjdCB0eXBlLiAgVGhpcyBpcyBhbHdheXMgKHBvc3NpYmx5CisgIC8vLyBzdWdhciBmb3IpIG9uZSBvZjoKKyAgLy8vICAtIHRoZSAnaWQnIGJ1aWx0aW4gdHlwZSAoYXMgb3Bwb3NlZCB0byB0aGUgJ2lkJyB0eXBlIHZpc2libGUgdG8gdGhlCisgIC8vLyAgICB1c2VyLCB3aGljaCBpcyBhIHR5cGVkZWYgZm9yIGFuIE9iakNPYmplY3RQb2ludGVyVHlwZSkKKyAgLy8vICAtIHRoZSAnQ2xhc3MnIGJ1aWx0aW4gdHlwZSAoc2FtZSBjYXZlYXQpCisgIC8vLyAgLSBhbiBPYmpDT2JqZWN0VHlwZSAoY3VycmVudGx5IGFsd2F5cyBhbiBPYmpDSW50ZXJmYWNlVHlwZSkKKyAgUXVhbFR5cGUgZ2V0QmFzZVR5cGUoKSBjb25zdCB7IHJldHVybiBCYXNlVHlwZTsgfQorCisgIGJvb2wgaXNPYmpDSWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEJhc2VUeXBlKCktPmlzU3BlY2lmaWNCdWlsdGluVHlwZShCdWlsdGluVHlwZTo6T2JqQ0lkKTsKKyAgfQorCisgIGJvb2wgaXNPYmpDQ2xhc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEJhc2VUeXBlKCktPmlzU3BlY2lmaWNCdWlsdGluVHlwZShCdWlsdGluVHlwZTo6T2JqQ0NsYXNzKTsKKyAgfQorCisgIGJvb2wgaXNPYmpDVW5xdWFsaWZpZWRJZCgpIGNvbnN0IHsgcmV0dXJuIHF1YWxfZW1wdHkoKSAmJiBpc09iakNJZCgpOyB9CisgIGJvb2wgaXNPYmpDVW5xdWFsaWZpZWRDbGFzcygpIGNvbnN0IHsgcmV0dXJuIHF1YWxfZW1wdHkoKSAmJiBpc09iakNDbGFzcygpOyB9CisgIGJvb2wgaXNPYmpDVW5xdWFsaWZpZWRJZE9yQ2xhc3MoKSBjb25zdCB7CisgICAgaWYgKCFxdWFsX2VtcHR5KCkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoY29uc3QgQnVpbHRpblR5cGUgKlQgPSBnZXRCYXNlVHlwZSgpLT5nZXRBczxCdWlsdGluVHlwZT4oKSkKKyAgICAgIHJldHVybiBULT5nZXRLaW5kKCkgPT0gQnVpbHRpblR5cGU6Ok9iakNJZCB8fAorICAgICAgICAgICAgIFQtPmdldEtpbmQoKSA9PSBCdWlsdGluVHlwZTo6T2JqQ0NsYXNzOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIGlzT2JqQ1F1YWxpZmllZElkKCkgY29uc3QgeyByZXR1cm4gIXF1YWxfZW1wdHkoKSAmJiBpc09iakNJZCgpOyB9CisgIGJvb2wgaXNPYmpDUXVhbGlmaWVkQ2xhc3MoKSBjb25zdCB7IHJldHVybiAhcXVhbF9lbXB0eSgpICYmIGlzT2JqQ0NsYXNzKCk7IH0KKworICAvLy8gR2V0cyB0aGUgaW50ZXJmYWNlIGRlY2xhcmF0aW9uIGZvciB0aGlzIG9iamVjdCB0eXBlLCBpZiB0aGUgYmFzZSB0eXBlCisgIC8vLyByZWFsbHkgaXMgYW4gaW50ZXJmYWNlLgorICBPYmpDSW50ZXJmYWNlRGVjbCAqZ2V0SW50ZXJmYWNlKCkgY29uc3Q7CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgb2JqZWN0IHR5cGUgaXMgInNwZWNpYWxpemVkIiwgbWVhbmluZworICAvLy8gdGhhdCBpdCBoYXMgdHlwZSBhcmd1bWVudHMuCisgIGJvb2wgaXNTcGVjaWFsaXplZCgpIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIG9iamVjdCB0eXBlIHdhcyB3cml0dGVuIHdpdGggdHlwZSBhcmd1bWVudHMuCisgIGJvb2wgaXNTcGVjaWFsaXplZEFzV3JpdHRlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gT2JqQ09iamVjdFR5cGVCaXRzLk51bVR5cGVBcmdzID4gMDsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIG9iamVjdCB0eXBlIGlzICJ1bnNwZWNpYWxpemVkIiwgbWVhbmluZworICAvLy8gdGhhdCBpdCBoYXMgbm8gdHlwZSBhcmd1bWVudHMuCisgIGJvb2wgaXNVbnNwZWNpYWxpemVkKCkgY29uc3QgeyByZXR1cm4gIWlzU3BlY2lhbGl6ZWQoKTsgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIG9iamVjdCB0eXBlIGlzICJ1bnNwZWNpYWxpemVkIiBhcworICAvLy8gd3JpdHRlbiwgbWVhbmluZyB0aGF0IGl0IGhhcyBubyB0eXBlIGFyZ3VtZW50cy4KKyAgYm9vbCBpc1Vuc3BlY2lhbGl6ZWRBc1dyaXR0ZW4oKSBjb25zdCB7IHJldHVybiAhaXNTcGVjaWFsaXplZEFzV3JpdHRlbigpOyB9CisKKyAgLy8vIFJldHJpZXZlIHRoZSB0eXBlIGFyZ3VtZW50cyBvZiB0aGlzIG9iamVjdCB0eXBlIChzZW1hbnRpY2FsbHkpLgorICBBcnJheVJlZjxRdWFsVHlwZT4gZ2V0VHlwZUFyZ3MoKSBjb25zdDsKKworICAvLy8gUmV0cmlldmUgdGhlIHR5cGUgYXJndW1lbnRzIG9mIHRoaXMgb2JqZWN0IHR5cGUgYXMgdGhleSB3ZXJlCisgIC8vLyB3cml0dGVuLgorICBBcnJheVJlZjxRdWFsVHlwZT4gZ2V0VHlwZUFyZ3NBc1dyaXR0ZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZihnZXRUeXBlQXJnU3RvcmFnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ09iamVjdFR5cGVCaXRzLk51bVR5cGVBcmdzKTsKKyAgfQorCisgIC8vLyBXaGV0aGVyIHRoaXMgaXMgYSAiX19raW5kb2YiIHR5cGUgYXMgd3JpdHRlbi4KKyAgYm9vbCBpc0tpbmRPZlR5cGVBc1dyaXR0ZW4oKSBjb25zdCB7IHJldHVybiBPYmpDT2JqZWN0VHlwZUJpdHMuSXNLaW5kT2Y7IH0KKworICAvLy8gV2hldGhlciB0aGlzIGlhIGEgIl9fa2luZG9mIiB0eXBlIChzZW1hbnRpY2FsbHkpLgorICBib29sIGlzS2luZE9mVHlwZSgpIGNvbnN0OworCisgIC8vLyBSZXRyaWV2ZSB0aGUgdHlwZSBvZiB0aGUgc3VwZXJjbGFzcyBvZiB0aGlzIG9iamVjdCB0eXBlLgorICAvLy8KKyAgLy8vIFRoaXMgb3BlcmF0aW9uIHN1YnN0aXR1dGVzIGFueSB0eXBlIGFyZ3VtZW50cyBpbnRvIHRoZQorICAvLy8gc3VwZXJjbGFzcyBvZiB0aGUgY3VycmVudCBjbGFzcyB0eXBlLCBwb3RlbnRpYWxseSBwcm9kdWNpbmcgYQorICAvLy8gc3BlY2lhbGl6YXRpb24gb2YgdGhlIHN1cGVyY2xhc3MgdHlwZS4gUHJvZHVjZXMgYSBudWxsIHR5cGUgaWYKKyAgLy8vIHRoZXJlIGlzIG5vIHN1cGVyY2xhc3MuCisgIFF1YWxUeXBlIGdldFN1cGVyQ2xhc3NUeXBlKCkgY29uc3QgeworICAgIGlmICghQ2FjaGVkU3VwZXJDbGFzc1R5cGUuZ2V0SW50KCkpCisgICAgICBjb21wdXRlU3VwZXJDbGFzc1R5cGVTbG93KCk7CisKKyAgICBhc3NlcnQoQ2FjaGVkU3VwZXJDbGFzc1R5cGUuZ2V0SW50KCkgJiYgIlN1cGVyY2xhc3Mgbm90IHNldD8iKTsKKyAgICByZXR1cm4gUXVhbFR5cGUoQ2FjaGVkU3VwZXJDbGFzc1R5cGUuZ2V0UG9pbnRlcigpLCAwKTsKKyAgfQorCisgIC8vLyBTdHJpcCBvZmYgdGhlIE9iamVjdGl2ZS1DICJraW5kb2YiIHR5cGUgYW5kICh3aXRoIGl0KSBhbnkKKyAgLy8vIHByb3RvY29sIHF1YWxpZmllcnMuCisgIFF1YWxUeXBlIHN0cmlwT2JqQ0tpbmRPZlR5cGVBbmRRdWFscyhjb25zdCBBU1RDb250ZXh0ICZjdHgpIGNvbnN0OworCisgIGJvb2wgaXNTdWdhcmVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0IHsgcmV0dXJuIFF1YWxUeXBlKHRoaXMsIDApOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFR5cGVDbGFzcygpID09IE9iakNPYmplY3QgfHwKKyAgICAgICAgICAgVC0+Z2V0VHlwZUNsYXNzKCkgPT0gT2JqQ0ludGVyZmFjZTsKKyAgfQorfTsKKworLy8vIEEgY2xhc3MgcHJvdmlkaW5nIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24KKy8vLyBvZiBPYmpDT2JqZWN0VHlwZSwgc28gYXMgdG8gbm90IGluY3JlYXNlIHRoZSBmb290cHJpbnQgb2YKKy8vLyBPYmpDSW50ZXJmYWNlVHlwZS4gIENvZGUgb3V0c2lkZSBvZiBBU1RDb250ZXh0IGFuZCB0aGUgY29yZSB0eXBlCisvLy8gc3lzdGVtIHNob3VsZCBub3QgcmVmZXJlbmNlIHRoaXMgdHlwZS4KK2NsYXNzIE9iakNPYmplY3RUeXBlSW1wbCA6IHB1YmxpYyBPYmpDT2JqZWN0VHlwZSwgcHVibGljIGxsdm06OkZvbGRpbmdTZXROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7CisKKyAgLy8gSWYgYW55b25lIGFkZHMgZmllbGRzIGhlcmUsIE9iakNPYmplY3RUeXBlOjpnZXRQcm90b2NvbFN0b3JhZ2UoKQorICAvLyB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQuCisKKyAgT2JqQ09iamVjdFR5cGVJbXBsKFF1YWxUeXBlIENhbm9uaWNhbCwgUXVhbFR5cGUgQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFF1YWxUeXBlPiB0eXBlQXJncywKKyAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9iakNQcm90b2NvbERlY2wgKj4gcHJvdG9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0tpbmRPZikKKyAgICAgIDogT2JqQ09iamVjdFR5cGUoQ2Fub25pY2FsLCBCYXNlLCB0eXBlQXJncywgcHJvdG9jb2xzLCBpc0tpbmRPZikge30KKworcHVibGljOgorICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpOworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELAorICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UXVhbFR5cGU+IHR5cGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9iakNQcm90b2NvbERlY2wgKj4gcHJvdG9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNLaW5kT2YpOworfTsKKworaW5saW5lIFF1YWxUeXBlICpPYmpDT2JqZWN0VHlwZTo6Z2V0VHlwZUFyZ1N0b3JhZ2UoKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFF1YWxUeXBlICo+KHN0YXRpY19jYXN0PE9iakNPYmplY3RUeXBlSW1wbCo+KHRoaXMpKzEpOworfQorCitpbmxpbmUgT2JqQ1Byb3RvY29sRGVjbCAqKk9iakNPYmplY3RUeXBlOjpnZXRQcm90b2NvbFN0b3JhZ2VJbXBsKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PE9iakNQcm90b2NvbERlY2wqKj4oCisgICAgICAgICAgICAgZ2V0VHlwZUFyZ1N0b3JhZ2UoKSArIE9iakNPYmplY3RUeXBlQml0cy5OdW1UeXBlQXJncyk7Cit9CisKK2lubGluZSBPYmpDUHJvdG9jb2xEZWNsICoqT2JqQ1R5cGVQYXJhbVR5cGU6OmdldFByb3RvY29sU3RvcmFnZUltcGwoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8T2JqQ1Byb3RvY29sRGVjbCoqPigKKyAgICAgICAgICAgICBzdGF0aWNfY2FzdDxPYmpDVHlwZVBhcmFtVHlwZSo+KHRoaXMpKzEpOworfQorCisvLy8gSW50ZXJmYWNlcyBhcmUgdGhlIGNvcmUgY29uY2VwdCBpbiBPYmplY3RpdmUtQyBmb3Igb2JqZWN0IG9yaWVudGVkIGRlc2lnbi4KKy8vLyBUaGV5IGJhc2ljYWxseSBjb3JyZXNwb25kIHRvIEMrKyBjbGFzc2VzLiAgVGhlcmUgYXJlIHR3byBraW5kcyBvZiBpbnRlcmZhY2UKKy8vLyB0eXBlczogbm9ybWFsIGludGVyZmFjZXMgbGlrZSBgTlNTdHJpbmdgLCBhbmQgcXVhbGlmaWVkIGludGVyZmFjZXMsIHdoaWNoCisvLy8gYXJlIHF1YWxpZmllZCB3aXRoIGEgcHJvdG9jb2wgbGlzdCBsaWtlIGBOU1N0cmluZzxOU0NvcHlhYmxlLCBOU0FtYXppbmc+YC4KKy8vLworLy8vIE9iakNJbnRlcmZhY2VUeXBlIGd1YXJhbnRlZXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIHdoZW4gY29uc2lkZXJlZAorLy8vIGFzIGEgc3VidHlwZSBvZiBpdHMgc3VwZXJjbGFzcywgT2JqQ09iamVjdFR5cGU6CisvLy8gICAtIFRoZXJlIGFyZSBubyBwcm90b2NvbCBxdWFsaWZpZXJzLiAgVG8gcmVpbmZvcmNlIHRoaXMsIGNvZGUgd2hpY2gKKy8vLyAgICAgdHJpZXMgdG8gaW52b2tlIHRoZSBwcm90b2NvbCBtZXRob2RzIHZpYSBhbiBPYmpDSW50ZXJmYWNlVHlwZSB3aWxsCisvLy8gICAgIGZhaWwgdG8gY29tcGlsZS4KKy8vLyAgIC0gSXQgaXMgaXRzIG93biBiYXNlIHR5cGUuICBUaGF0IGlzLCBpZiBUIGlzIGFuIE9iakNJbnRlcmZhY2VUeXBlKiwKKy8vLyAgICAgVC0+Z2V0QmFzZVR5cGUoKSA9PSBRdWFsVHlwZShULCAwKS4KK2NsYXNzIE9iakNJbnRlcmZhY2VUeXBlIDogcHVibGljIE9iakNPYmplY3RUeXBlIHsKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7IC8vIEFTVENvbnRleHQgY3JlYXRlcyB0aGVzZS4KKyAgZnJpZW5kIGNsYXNzIEFTVFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIE9iakNJbnRlcmZhY2VEZWNsOworCisgIG11dGFibGUgT2JqQ0ludGVyZmFjZURlY2wgKkRlY2w7CisKKyAgT2JqQ0ludGVyZmFjZVR5cGUoY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKkQpCisgICAgICA6IE9iakNPYmplY3RUeXBlKE5vbmNlX09iakNJbnRlcmZhY2UpLAorICAgICAgICBEZWNsKGNvbnN0X2Nhc3Q8T2JqQ0ludGVyZmFjZURlY2wqPihEKSkge30KKworcHVibGljOgorICAvLy8gR2V0IHRoZSBkZWNsYXJhdGlvbiBvZiB0aGlzIGludGVyZmFjZS4KKyAgT2JqQ0ludGVyZmFjZURlY2wgKmdldERlY2woKSBjb25zdCB7IHJldHVybiBEZWNsOyB9CisKKyAgYm9vbCBpc1N1Z2FyZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICBRdWFsVHlwZSBkZXN1Z2FyKCkgY29uc3QgeyByZXR1cm4gUXVhbFR5cGUodGhpcywgMCk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gT2JqQ0ludGVyZmFjZTsKKyAgfQorCisgIC8vIE5vbnNlbnNlIHRvICJoaWRlIiBjZXJ0YWluIG1lbWJlcnMgb2YgT2JqQ09iamVjdFR5cGUgd2l0aGluIHRoaXMKKyAgLy8gY2xhc3MuICBQZW9wbGUgYXNraW5nIGZvciBwcm90b2NvbHMgb24gYW4gT2JqQ0ludGVyZmFjZVR5cGUgYXJlCisgIC8vIG5vdCBnb2luZyB0byBnZXQgd2hhdCB0aGV5IHdhbnQ6IE9iakNJbnRlcmZhY2VUeXBlcyBhcmUKKyAgLy8gZ3VhcmFudGVlZCB0byBoYXZlIG5vIHByb3RvY29scy4KKyAgZW51bSB7CisgICAgcXVhbF9pdGVyYXRvciwKKyAgICBxdWFsX2JlZ2luLAorICAgIHF1YWxfZW5kLAorICAgIGdldE51bVByb3RvY29scywKKyAgICBnZXRQcm90b2NvbAorICB9OworfTsKKworaW5saW5lIE9iakNJbnRlcmZhY2VEZWNsICpPYmpDT2JqZWN0VHlwZTo6Z2V0SW50ZXJmYWNlKCkgY29uc3QgeworICBRdWFsVHlwZSBiYXNlVHlwZSA9IGdldEJhc2VUeXBlKCk7CisgIHdoaWxlIChjb25zdCBhdXRvICpPYmpUID0gYmFzZVR5cGUtPmdldEFzPE9iakNPYmplY3RUeXBlPigpKSB7CisgICAgaWYgKGNvbnN0IGF1dG8gKlQgPSBkeW5fY2FzdDxPYmpDSW50ZXJmYWNlVHlwZT4oT2JqVCkpCisgICAgICByZXR1cm4gVC0+Z2V0RGVjbCgpOworCisgICAgYmFzZVR5cGUgPSBPYmpULT5nZXRCYXNlVHlwZSgpOworICB9CisKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vLyBSZXByZXNlbnRzIGEgcG9pbnRlciB0byBhbiBPYmplY3RpdmUgQyBvYmplY3QuCisvLy8KKy8vLyBUaGVzZSBhcmUgY29uc3RydWN0ZWQgZnJvbSBwb2ludGVyIGRlY2xhcmF0b3JzIHdoZW4gdGhlIHBvaW50ZWUgdHlwZSBpcworLy8vIGFuIE9iakNPYmplY3RUeXBlIChvciBzdWdhciBmb3Igb25lKS4gIEluIGFkZGl0aW9uLCB0aGUgJ2lkJyBhbmQgJ0NsYXNzJworLy8vIHR5cGVzIGFyZSB0eXBlZGVmcyBmb3IgdGhlc2UsIGFuZCB0aGUgcHJvdG9jb2wtcXVhbGlmaWVkIHR5cGVzICdpZDxQPicKKy8vLyBhbmQgJ0NsYXNzPFA+JyBhcmUgdHJhbnNsYXRlZCBpbnRvIHRoZXNlLgorLy8vCisvLy8gUG9pbnRlcnMgdG8gcG9pbnRlcnMgdG8gT2JqZWN0aXZlIEMgb2JqZWN0cyBhcmUgc3RpbGwgUG9pbnRlclR5cGVzOworLy8vIG9ubHkgdGhlIGZpcnN0IGxldmVsIG9mIHBvaW50ZXIgZ2V0cyBpdCBvd24gdHlwZSBpbXBsZW1lbnRhdGlvbi4KK2NsYXNzIE9iakNPYmplY3RQb2ludGVyVHlwZSA6IHB1YmxpYyBUeXBlLCBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsgLy8gQVNUQ29udGV4dCBjcmVhdGVzIHRoZXNlLgorCisgIFF1YWxUeXBlIFBvaW50ZWVUeXBlOworCisgIE9iakNPYmplY3RQb2ludGVyVHlwZShRdWFsVHlwZSBDYW5vbmljYWwsIFF1YWxUeXBlIFBvaW50ZWUpCisgICAgICA6IFR5cGUoT2JqQ09iamVjdFBvaW50ZXIsIENhbm9uaWNhbCwKKyAgICAgICAgICAgICBQb2ludGVlLT5pc0RlcGVuZGVudFR5cGUoKSwKKyAgICAgICAgICAgICBQb2ludGVlLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgICAgUG9pbnRlZS0+aXNWYXJpYWJseU1vZGlmaWVkVHlwZSgpLAorICAgICAgICAgICAgIFBvaW50ZWUtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIFBvaW50ZWVUeXBlKFBvaW50ZWUpIHt9CisKK3B1YmxpYzoKKyAgLy8vIEdldHMgdGhlIHR5cGUgcG9pbnRlZCB0byBieSB0aGlzIE9iakMgcG9pbnRlci4KKyAgLy8vIFRoZSByZXN1bHQgd2lsbCBhbHdheXMgYmUgYW4gT2JqQ09iamVjdFR5cGUgb3Igc3VnYXIgdGhlcmVvZi4KKyAgUXVhbFR5cGUgZ2V0UG9pbnRlZVR5cGUoKSBjb25zdCB7IHJldHVybiBQb2ludGVlVHlwZTsgfQorCisgIC8vLyBHZXRzIHRoZSB0eXBlIHBvaW50ZWQgdG8gYnkgdGhpcyBPYmpDIHBvaW50ZXIuICBBbHdheXMgcmV0dXJucyBub24tbnVsbC4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGdldFBvaW50ZWVUeXBlKCkgZXhjZXB0IHRoYXQKKyAgLy8vIGl0IGRpc2NhcmRzIGFueSB0eXBlZGVmcyAob3Igb3RoZXIgc3VnYXIpIGJldHdlZW4gdGhpcworICAvLy8gdHlwZSBhbmQgdGhlICJvdXRlcm1vc3QiIG9iamVjdCB0eXBlLiAgU28gZm9yOgorICAvLy8gXGNvZGUKKyAgLy8vICAgXEBjbGFzcyBBOyBcQHByb3RvY29sIFA7IFxAcHJvdG9jb2wgUTsKKyAgLy8vICAgdHlwZWRlZiBBPFA+IEFQOworICAvLy8gICB0eXBlZGVmIEEgQTE7CisgIC8vLyAgIHR5cGVkZWYgQTE8UD4gQTFQOworICAvLy8gICB0eXBlZGVmIEExUDxRPiBBMVBROworICAvLy8gXGVuZGNvZGUKKyAgLy8vIEZvciAnQSonLCBnZXRPYmplY3RUeXBlKCkgd2lsbCByZXR1cm4gJ0EnLgorICAvLy8gRm9yICdBPFA+KicsIGdldE9iamVjdFR5cGUoKSB3aWxsIHJldHVybiAnQTxQPicuCisgIC8vLyBGb3IgJ0FQKicsIGdldE9iamVjdFR5cGUoKSB3aWxsIHJldHVybiAnQTxQPicuCisgIC8vLyBGb3IgJ0ExKicsIGdldE9iamVjdFR5cGUoKSB3aWxsIHJldHVybiAnQScuCisgIC8vLyBGb3IgJ0ExPFA+KicsIGdldE9iamVjdFR5cGUoKSB3aWxsIHJldHVybiAnQTE8UD4nLgorICAvLy8gRm9yICdBMVAqJywgZ2V0T2JqZWN0VHlwZSgpIHdpbGwgcmV0dXJuICdBMTxQPicuCisgIC8vLyBGb3IgJ0ExUFEqJywgZ2V0T2JqZWN0VHlwZSgpIHdpbGwgcmV0dXJuICdBMTxRPicsIGJlY2F1c2UKKyAgLy8vICAgYWRkaW5nIHByb3RvY29scyB0byBhIHByb3RvY29sLXF1YWxpZmllZCBiYXNlIGRpc2NhcmRzIHRoZQorICAvLy8gICBvbGQgcXVhbGlmaWVycyAoZm9yIG5vdykuICBCdXQgaWYgaXQgZGlkbid0LCBnZXRPYmplY3RUeXBlKCkKKyAgLy8vICAgd291bGQgcmV0dXJuICdBMVA8UT4nIChhbmQgd2UnZCBoYXZlIHRvIG1ha2UgaXRlcmF0aW5nIG92ZXIKKyAgLy8vICAgcXVhbGlmaWVycyBtb3JlIGNvbXBsaWNhdGVkKS4KKyAgY29uc3QgT2JqQ09iamVjdFR5cGUgKmdldE9iamVjdFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIFBvaW50ZWVUeXBlLT5jYXN0QXM8T2JqQ09iamVjdFR5cGU+KCk7CisgIH0KKworICAvLy8gSWYgdGhpcyBwb2ludGVyIHBvaW50cyB0byBhbiBPYmplY3RpdmUgQworICAvLy8gXEBpbnRlcmZhY2UgdHlwZSwgZ2V0cyB0aGUgdHlwZSBmb3IgdGhhdCBpbnRlcmZhY2UuICBBbnkgcHJvdG9jb2wKKyAgLy8vIHF1YWxpZmllcnMgb24gdGhlIGludGVyZmFjZSBhcmUgaWdub3JlZC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIG51bGwgaWYgdGhlIGJhc2UgdHlwZSBmb3IgdGhpcyBwb2ludGVyIGlzICdpZCcgb3IgJ0NsYXNzJworICBjb25zdCBPYmpDSW50ZXJmYWNlVHlwZSAqZ2V0SW50ZXJmYWNlVHlwZSgpIGNvbnN0OworCisgIC8vLyBJZiB0aGlzIHBvaW50ZXIgcG9pbnRzIHRvIGFuIE9iamVjdGl2ZSBcQGludGVyZmFjZQorICAvLy8gdHlwZSwgZ2V0cyB0aGUgZGVjbGFyYXRpb24gZm9yIHRoYXQgaW50ZXJmYWNlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gbnVsbCBpZiB0aGUgYmFzZSB0eXBlIGZvciB0aGlzIHBvaW50ZXIgaXMgJ2lkJyBvciAnQ2xhc3MnCisgIE9iakNJbnRlcmZhY2VEZWNsICpnZXRJbnRlcmZhY2VEZWNsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPYmplY3RUeXBlKCktPmdldEludGVyZmFjZSgpOworICB9CisKKyAgLy8vIFRydWUgaWYgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSAnaWQnIHR5cGUsIGkuZS4gaWYKKyAgLy8vIGl0cyBvYmplY3QgdHlwZSBpcyB0aGUgcHJpbWl0aXZlICdpZCcgdHlwZSB3aXRoIG5vIHByb3RvY29scy4KKyAgYm9vbCBpc09iakNJZFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9iamVjdFR5cGUoKS0+aXNPYmpDVW5xdWFsaWZpZWRJZCgpOworICB9CisKKyAgLy8vIFRydWUgaWYgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSAnQ2xhc3MnIHR5cGUsCisgIC8vLyBpLmUuIGlmIGl0cyBvYmplY3QgdGl2ZSBpcyB0aGUgcHJpbWl0aXZlICdDbGFzcycgdHlwZSB3aXRoIG5vIHByb3RvY29scy4KKyAgYm9vbCBpc09iakNDbGFzc1R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9iamVjdFR5cGUoKS0+aXNPYmpDVW5xdWFsaWZpZWRDbGFzcygpOworICB9CisKKyAgLy8vIFRydWUgaWYgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSAnaWQnIG9yICdDbGFzcycgdHlwZSwKKyAgYm9vbCBpc09iakNJZE9yQ2xhc3NUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPYmplY3RUeXBlKCktPmlzT2JqQ1VucXVhbGlmaWVkSWRPckNsYXNzKCk7CisgIH0KKworICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gJ2lkPFA+JyBmb3Igc29tZSBub24tZW1wdHkgc2V0IG9mCisgIC8vLyBwcm90b2NvbHMuCisgIGJvb2wgaXNPYmpDUXVhbGlmaWVkSWRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPYmplY3RUeXBlKCktPmlzT2JqQ1F1YWxpZmllZElkKCk7CisgIH0KKworICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gJ0NsYXNzPFA+JyBmb3Igc29tZSBub24tZW1wdHkgc2V0IG9mCisgIC8vLyBwcm90b2NvbHMuCisgIGJvb2wgaXNPYmpDUXVhbGlmaWVkQ2xhc3NUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPYmplY3RUeXBlKCktPmlzT2JqQ1F1YWxpZmllZENsYXNzKCk7CisgIH0KKworICAvLy8gV2hldGhlciB0aGlzIGlzIGEgIl9fa2luZG9mIiB0eXBlLgorICBib29sIGlzS2luZE9mVHlwZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9iamVjdFR5cGUoKS0+aXNLaW5kT2ZUeXBlKCk7IH0KKworICAvLy8gV2hldGhlciB0aGlzIHR5cGUgaXMgc3BlY2lhbGl6ZWQsIG1lYW5pbmcgdGhhdCBpdCBoYXMgdHlwZSBhcmd1bWVudHMuCisgIGJvb2wgaXNTcGVjaWFsaXplZCgpIGNvbnN0IHsgcmV0dXJuIGdldE9iamVjdFR5cGUoKS0+aXNTcGVjaWFsaXplZCgpOyB9CisKKyAgLy8vIFdoZXRoZXIgdGhpcyB0eXBlIGlzIHNwZWNpYWxpemVkLCBtZWFuaW5nIHRoYXQgaXQgaGFzIHR5cGUgYXJndW1lbnRzLgorICBib29sIGlzU3BlY2lhbGl6ZWRBc1dyaXR0ZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9iamVjdFR5cGUoKS0+aXNTcGVjaWFsaXplZEFzV3JpdHRlbigpOworICB9CisKKyAgLy8vIFdoZXRoZXIgdGhpcyB0eXBlIGlzIHVuc3BlY2lhbGl6ZWQsIG1lYW5pbmcgdGhhdCBpcyBoYXMgbm8gdHlwZSBhcmd1bWVudHMuCisgIGJvb2wgaXNVbnNwZWNpYWxpemVkKCkgY29uc3QgeyByZXR1cm4gZ2V0T2JqZWN0VHlwZSgpLT5pc1Vuc3BlY2lhbGl6ZWQoKTsgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIG9iamVjdCB0eXBlIGlzICJ1bnNwZWNpYWxpemVkIiBhcworICAvLy8gd3JpdHRlbiwgbWVhbmluZyB0aGF0IGl0IGhhcyBubyB0eXBlIGFyZ3VtZW50cy4KKyAgYm9vbCBpc1Vuc3BlY2lhbGl6ZWRBc1dyaXR0ZW4oKSBjb25zdCB7IHJldHVybiAhaXNTcGVjaWFsaXplZEFzV3JpdHRlbigpOyB9CisKKyAgLy8vIFJldHJpZXZlIHRoZSB0eXBlIGFyZ3VtZW50cyBmb3IgdGhpcyB0eXBlLgorICBBcnJheVJlZjxRdWFsVHlwZT4gZ2V0VHlwZUFyZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9iamVjdFR5cGUoKS0+Z2V0VHlwZUFyZ3MoKTsKKyAgfQorCisgIC8vLyBSZXRyaWV2ZSB0aGUgdHlwZSBhcmd1bWVudHMgZm9yIHRoaXMgdHlwZS4KKyAgQXJyYXlSZWY8UXVhbFR5cGU+IGdldFR5cGVBcmdzQXNXcml0dGVuKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPYmplY3RUeXBlKCktPmdldFR5cGVBcmdzQXNXcml0dGVuKCk7CisgIH0KKworICAvLy8gQW4gaXRlcmF0b3Igb3ZlciB0aGUgcXVhbGlmaWVycyBvbiB0aGUgb2JqZWN0IHR5cGUuICBQcm92aWRlZAorICAvLy8gZm9yIGNvbnZlbmllbmNlLiAgVGhpcyB3aWxsIGFsd2F5cyBpdGVyYXRlIG92ZXIgdGhlIGZ1bGwgc2V0IG9mCisgIC8vLyBwcm90b2NvbHMgb24gYSB0eXBlLCBub3QganVzdCB0aG9zZSBwcm92aWRlZCBkaXJlY3RseS4KKyAgdXNpbmcgcXVhbF9pdGVyYXRvciA9IE9iakNPYmplY3RUeXBlOjpxdWFsX2l0ZXJhdG9yOworICB1c2luZyBxdWFsX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8cXVhbF9pdGVyYXRvcj47CisKKyAgcXVhbF9yYW5nZSBxdWFscygpIGNvbnN0IHsgcmV0dXJuIHF1YWxfcmFuZ2UocXVhbF9iZWdpbigpLCBxdWFsX2VuZCgpKTsgfQorCisgIHF1YWxfaXRlcmF0b3IgcXVhbF9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T2JqZWN0VHlwZSgpLT5xdWFsX2JlZ2luKCk7CisgIH0KKworICBxdWFsX2l0ZXJhdG9yIHF1YWxfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPYmplY3RUeXBlKCktPnF1YWxfZW5kKCk7CisgIH0KKworICBib29sIHF1YWxfZW1wdHkoKSBjb25zdCB7IHJldHVybiBnZXRPYmplY3RUeXBlKCktPnF1YWxfZW1wdHkoKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBxdWFsaWZ5aW5nIHByb3RvY29scyBvbiB0aGUgb2JqZWN0IHR5cGUuCisgIHVuc2lnbmVkIGdldE51bVByb3RvY29scygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T2JqZWN0VHlwZSgpLT5nZXROdW1Qcm90b2NvbHMoKTsKKyAgfQorCisgIC8vLyBSZXRyaWV2ZSBhIHF1YWxpZnlpbmcgcHJvdG9jb2wgYnkgaW5kZXggb24gdGhlIG9iamVjdCB0eXBlLgorICBPYmpDUHJvdG9jb2xEZWNsICpnZXRQcm90b2NvbCh1bnNpZ25lZCBJKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9iamVjdFR5cGUoKS0+Z2V0UHJvdG9jb2woSSk7CisgIH0KKworICBib29sIGlzU3VnYXJlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIFF1YWxUeXBlIGRlc3VnYXIoKSBjb25zdCB7IHJldHVybiBRdWFsVHlwZSh0aGlzLCAwKTsgfQorCisgIC8vLyBSZXRyaWV2ZSB0aGUgdHlwZSBvZiB0aGUgc3VwZXJjbGFzcyBvZiB0aGlzIG9iamVjdCBwb2ludGVyIHR5cGUuCisgIC8vLworICAvLy8gVGhpcyBvcGVyYXRpb24gc3Vic3RpdHV0ZXMgYW55IHR5cGUgYXJndW1lbnRzIGludG8gdGhlCisgIC8vLyBzdXBlcmNsYXNzIG9mIHRoZSBjdXJyZW50IGNsYXNzIHR5cGUsIHBvdGVudGlhbGx5IHByb2R1Y2luZyBhCisgIC8vLyBwb2ludGVyIHRvIGEgc3BlY2lhbGl6YXRpb24gb2YgdGhlIHN1cGVyY2xhc3MgdHlwZS4gUHJvZHVjZXMgYQorICAvLy8gbnVsbCB0eXBlIGlmIHRoZXJlIGlzIG5vIHN1cGVyY2xhc3MuCisgIFF1YWxUeXBlIGdldFN1cGVyQ2xhc3NUeXBlKCkgY29uc3Q7CisKKyAgLy8vIFN0cmlwIG9mZiB0aGUgT2JqZWN0aXZlLUMgImtpbmRvZiIgdHlwZSBhbmQgKHdpdGggaXQpIGFueQorICAvLy8gcHJvdG9jb2wgcXVhbGlmaWVycy4KKyAgY29uc3QgT2JqQ09iamVjdFBvaW50ZXJUeXBlICpzdHJpcE9iakNLaW5kT2ZUeXBlQW5kUXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBU1RDb250ZXh0ICZjdHgpIGNvbnN0OworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIFByb2ZpbGUoSUQsIGdldFBvaW50ZWVUeXBlKCkpOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgUXVhbFR5cGUgVCkgeworICAgIElELkFkZFBvaW50ZXIoVC5nZXRBc09wYXF1ZVB0cigpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlQ2xhc3MoKSA9PSBPYmpDT2JqZWN0UG9pbnRlcjsKKyAgfQorfTsKKworY2xhc3MgQXRvbWljVHlwZSA6IHB1YmxpYyBUeXBlLCBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsgLy8gQVNUQ29udGV4dCBjcmVhdGVzIHRoZXNlLgorCisgIFF1YWxUeXBlIFZhbHVlVHlwZTsKKworICBBdG9taWNUeXBlKFF1YWxUeXBlIFZhbFR5LCBRdWFsVHlwZSBDYW5vbmljYWwpCisgICAgICA6IFR5cGUoQXRvbWljLCBDYW5vbmljYWwsIFZhbFR5LT5pc0RlcGVuZGVudFR5cGUoKSwKKyAgICAgICAgICAgICBWYWxUeS0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgIFZhbFR5LT5pc1ZhcmlhYmx5TW9kaWZpZWRUeXBlKCksCisgICAgICAgICAgICAgVmFsVHktPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCisgICAgICAgIFZhbHVlVHlwZShWYWxUeSkge30KKworcHVibGljOgorICAvLy8gR2V0cyB0aGUgdHlwZSBjb250YWluZWQgYnkgdGhpcyBhdG9taWMgdHlwZSwgaS5lLgorICAvLy8gdGhlIHR5cGUgcmV0dXJuZWQgYnkgcGVyZm9ybWluZyBhbiBhdG9taWMgbG9hZCBvZiB0aGlzIGF0b21pYyB0eXBlLgorICBRdWFsVHlwZSBnZXRWYWx1ZVR5cGUoKSBjb25zdCB7IHJldHVybiBWYWx1ZVR5cGU7IH0KKworICBib29sIGlzU3VnYXJlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIFF1YWxUeXBlIGRlc3VnYXIoKSBjb25zdCB7IHJldHVybiBRdWFsVHlwZSh0aGlzLCAwKTsgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIFByb2ZpbGUoSUQsIGdldFZhbHVlVHlwZSgpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIFF1YWxUeXBlIFQpIHsKKyAgICBJRC5BZGRQb2ludGVyKFQuZ2V0QXNPcGFxdWVQdHIoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gQXRvbWljOworICB9Cit9OworCisvLy8gUGlwZVR5cGUgLSBPcGVuQ0wyMC4KK2NsYXNzIFBpcGVUeXBlIDogcHVibGljIFR5cGUsIHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RDb250ZXh0OyAvLyBBU1RDb250ZXh0IGNyZWF0ZXMgdGhlc2UuCisKKyAgUXVhbFR5cGUgRWxlbWVudFR5cGU7CisgIGJvb2wgaXNSZWFkOworCisgIFBpcGVUeXBlKFF1YWxUeXBlIGVsZW1UeXBlLCBRdWFsVHlwZSBDYW5vbmljYWxQdHIsIGJvb2wgaXNSZWFkKQorICAgICAgOiBUeXBlKFBpcGUsIENhbm9uaWNhbFB0ciwgZWxlbVR5cGUtPmlzRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgIGVsZW1UeXBlLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgICAgZWxlbVR5cGUtPmlzVmFyaWFibHlNb2RpZmllZFR5cGUoKSwKKyAgICAgICAgICAgICBlbGVtVHlwZS0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpKSwKKyAgICAgICAgRWxlbWVudFR5cGUoZWxlbVR5cGUpLCBpc1JlYWQoaXNSZWFkKSB7fQorCitwdWJsaWM6CisgIFF1YWxUeXBlIGdldEVsZW1lbnRUeXBlKCkgY29uc3QgeyByZXR1cm4gRWxlbWVudFR5cGU7IH0KKworICBib29sIGlzU3VnYXJlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgUXVhbFR5cGUgZGVzdWdhcigpIGNvbnN0IHsgcmV0dXJuIFF1YWxUeXBlKHRoaXMsIDApOyB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgUHJvZmlsZShJRCwgZ2V0RWxlbWVudFR5cGUoKSwgaXNSZWFkT25seSgpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIFF1YWxUeXBlIFQsIGJvb2wgaXNSZWFkKSB7CisgICAgSUQuQWRkUG9pbnRlcihULmdldEFzT3BhcXVlUHRyKCkpOworICAgIElELkFkZEJvb2xlYW4oaXNSZWFkKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlQ2xhc3MoKSA9PSBQaXBlOworICB9CisKKyAgYm9vbCBpc1JlYWRPbmx5KCkgY29uc3QgeyByZXR1cm4gaXNSZWFkOyB9Cit9OworCisvLy8gQSBxdWFsaWZpZXIgc2V0IGlzIHVzZWQgdG8gYnVpbGQgYSBzZXQgb2YgcXVhbGlmaWVycy4KK2NsYXNzIFF1YWxpZmllckNvbGxlY3RvciA6IHB1YmxpYyBRdWFsaWZpZXJzIHsKK3B1YmxpYzoKKyAgUXVhbGlmaWVyQ29sbGVjdG9yKFF1YWxpZmllcnMgUXMgPSBRdWFsaWZpZXJzKCkpIDogUXVhbGlmaWVycyhRcykge30KKworICAvLy8gQ29sbGVjdCBhbnkgcXVhbGlmaWVycyBvbiB0aGUgZ2l2ZW4gdHlwZSBhbmQgcmV0dXJuIGFuCisgIC8vLyB1bnF1YWxpZmllZCB0eXBlLiAgVGhlIHF1YWxpZmllcnMgYXJlIGFzc3VtZWQgdG8gYmUgY29uc2lzdGVudAorICAvLy8gd2l0aCB0aG9zZSBhbHJlYWR5IGluIHRoZSB0eXBlLgorICBjb25zdCBUeXBlICpzdHJpcChRdWFsVHlwZSB0eXBlKSB7CisgICAgYWRkRmFzdFF1YWxpZmllcnModHlwZS5nZXRMb2NhbEZhc3RRdWFsaWZpZXJzKCkpOworICAgIGlmICghdHlwZS5oYXNMb2NhbE5vbkZhc3RRdWFsaWZpZXJzKCkpCisgICAgICByZXR1cm4gdHlwZS5nZXRUeXBlUHRyVW5zYWZlKCk7CisKKyAgICBjb25zdCBFeHRRdWFscyAqZXh0UXVhbHMgPSB0eXBlLmdldEV4dFF1YWxzVW5zYWZlKCk7CisgICAgYWRkQ29uc2lzdGVudFF1YWxpZmllcnMoZXh0UXVhbHMtPmdldFF1YWxpZmllcnMoKSk7CisgICAgcmV0dXJuIGV4dFF1YWxzLT5nZXRCYXNlVHlwZSgpOworICB9CisKKyAgLy8vIEFwcGx5IHRoZSBjb2xsZWN0ZWQgcXVhbGlmaWVycyB0byB0aGUgZ2l2ZW4gdHlwZS4KKyAgUXVhbFR5cGUgYXBwbHkoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwgUXVhbFR5cGUgUVQpIGNvbnN0OworCisgIC8vLyBBcHBseSB0aGUgY29sbGVjdGVkIHF1YWxpZmllcnMgdG8gdGhlIGdpdmVuIHR5cGUuCisgIFF1YWxUeXBlIGFwcGx5KGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQsIGNvbnN0IFR5cGUqIFQpIGNvbnN0OworfTsKKworLy8gSW5saW5lIGZ1bmN0aW9uIGRlZmluaXRpb25zLgorCitpbmxpbmUgU3BsaXRRdWFsVHlwZSBTcGxpdFF1YWxUeXBlOjpnZXRTaW5nbGVTdGVwRGVzdWdhcmVkVHlwZSgpIGNvbnN0IHsKKyAgU3BsaXRRdWFsVHlwZSBkZXN1Z2FyID0KKyAgICBUeS0+Z2V0TG9jYWxseVVucXVhbGlmaWVkU2luZ2xlU3RlcERlc3VnYXJlZFR5cGUoKS5zcGxpdCgpOworICBkZXN1Z2FyLlF1YWxzLmFkZENvbnNpc3RlbnRRdWFsaWZpZXJzKFF1YWxzKTsKKyAgcmV0dXJuIGRlc3VnYXI7Cit9CisKK2lubGluZSBjb25zdCBUeXBlICpRdWFsVHlwZTo6Z2V0VHlwZVB0cigpIGNvbnN0IHsKKyAgcmV0dXJuIGdldENvbW1vblB0cigpLT5CYXNlVHlwZTsKK30KKworaW5saW5lIGNvbnN0IFR5cGUgKlF1YWxUeXBlOjpnZXRUeXBlUHRyT3JOdWxsKCkgY29uc3QgeworICByZXR1cm4gKGlzTnVsbCgpID8gbnVsbHB0ciA6IGdldENvbW1vblB0cigpLT5CYXNlVHlwZSk7Cit9CisKK2lubGluZSBTcGxpdFF1YWxUeXBlIFF1YWxUeXBlOjpzcGxpdCgpIGNvbnN0IHsKKyAgaWYgKCFoYXNMb2NhbE5vbkZhc3RRdWFsaWZpZXJzKCkpCisgICAgcmV0dXJuIFNwbGl0UXVhbFR5cGUoZ2V0VHlwZVB0clVuc2FmZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxpZmllcnM6OmZyb21GYXN0TWFzayhnZXRMb2NhbEZhc3RRdWFsaWZpZXJzKCkpKTsKKworICBjb25zdCBFeHRRdWFscyAqZXEgPSBnZXRFeHRRdWFsc1Vuc2FmZSgpOworICBRdWFsaWZpZXJzIHFzID0gZXEtPmdldFF1YWxpZmllcnMoKTsKKyAgcXMuYWRkRmFzdFF1YWxpZmllcnMoZ2V0TG9jYWxGYXN0UXVhbGlmaWVycygpKTsKKyAgcmV0dXJuIFNwbGl0UXVhbFR5cGUoZXEtPmdldEJhc2VUeXBlKCksIHFzKTsKK30KKworaW5saW5lIFF1YWxpZmllcnMgUXVhbFR5cGU6OmdldExvY2FsUXVhbGlmaWVycygpIGNvbnN0IHsKKyAgUXVhbGlmaWVycyBRdWFsczsKKyAgaWYgKGhhc0xvY2FsTm9uRmFzdFF1YWxpZmllcnMoKSkKKyAgICBRdWFscyA9IGdldEV4dFF1YWxzVW5zYWZlKCktPmdldFF1YWxpZmllcnMoKTsKKyAgUXVhbHMuYWRkRmFzdFF1YWxpZmllcnMoZ2V0TG9jYWxGYXN0UXVhbGlmaWVycygpKTsKKyAgcmV0dXJuIFF1YWxzOworfQorCitpbmxpbmUgUXVhbGlmaWVycyBRdWFsVHlwZTo6Z2V0UXVhbGlmaWVycygpIGNvbnN0IHsKKyAgUXVhbGlmaWVycyBxdWFscyA9IGdldENvbW1vblB0cigpLT5DYW5vbmljYWxUeXBlLmdldExvY2FsUXVhbGlmaWVycygpOworICBxdWFscy5hZGRGYXN0UXVhbGlmaWVycyhnZXRMb2NhbEZhc3RRdWFsaWZpZXJzKCkpOworICByZXR1cm4gcXVhbHM7Cit9CisKK2lubGluZSB1bnNpZ25lZCBRdWFsVHlwZTo6Z2V0Q1ZSUXVhbGlmaWVycygpIGNvbnN0IHsKKyAgdW5zaWduZWQgY3ZyID0gZ2V0Q29tbW9uUHRyKCktPkNhbm9uaWNhbFR5cGUuZ2V0TG9jYWxDVlJRdWFsaWZpZXJzKCk7CisgIGN2ciB8PSBnZXRMb2NhbENWUlF1YWxpZmllcnMoKTsKKyAgcmV0dXJuIGN2cjsKK30KKworaW5saW5lIFF1YWxUeXBlIFF1YWxUeXBlOjpnZXRDYW5vbmljYWxUeXBlKCkgY29uc3QgeworICBRdWFsVHlwZSBjYW5vbiA9IGdldENvbW1vblB0cigpLT5DYW5vbmljYWxUeXBlOworICByZXR1cm4gY2Fub24ud2l0aEZhc3RRdWFsaWZpZXJzKGdldExvY2FsRmFzdFF1YWxpZmllcnMoKSk7Cit9CisKK2lubGluZSBib29sIFF1YWxUeXBlOjppc0Nhbm9uaWNhbCgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFR5cGVQdHIoKS0+aXNDYW5vbmljYWxVbnF1YWxpZmllZCgpOworfQorCitpbmxpbmUgYm9vbCBRdWFsVHlwZTo6aXNDYW5vbmljYWxBc1BhcmFtKCkgY29uc3QgeworICBpZiAoIWlzQ2Fub25pY2FsKCkpIHJldHVybiBmYWxzZTsKKyAgaWYgKGhhc0xvY2FsUXVhbGlmaWVycygpKSByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgVHlwZSAqVCA9IGdldFR5cGVQdHIoKTsKKyAgaWYgKFQtPmlzVmFyaWFibHlNb2RpZmllZFR5cGUoKSAmJiBULT5oYXNTaXplZFZMQVR5cGUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuICFpc2E8RnVuY3Rpb25UeXBlPihUKSAmJiAhaXNhPEFycmF5VHlwZT4oVCk7Cit9CisKK2lubGluZSBib29sIFF1YWxUeXBlOjppc0NvbnN0UXVhbGlmaWVkKCkgY29uc3QgeworICByZXR1cm4gaXNMb2NhbENvbnN0UXVhbGlmaWVkKCkgfHwKKyAgICAgICAgIGdldENvbW1vblB0cigpLT5DYW5vbmljYWxUeXBlLmlzTG9jYWxDb25zdFF1YWxpZmllZCgpOworfQorCitpbmxpbmUgYm9vbCBRdWFsVHlwZTo6aXNSZXN0cmljdFF1YWxpZmllZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGlzTG9jYWxSZXN0cmljdFF1YWxpZmllZCgpIHx8CisgICAgICAgICBnZXRDb21tb25QdHIoKS0+Q2Fub25pY2FsVHlwZS5pc0xvY2FsUmVzdHJpY3RRdWFsaWZpZWQoKTsKK30KKworCitpbmxpbmUgYm9vbCBRdWFsVHlwZTo6aXNWb2xhdGlsZVF1YWxpZmllZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGlzTG9jYWxWb2xhdGlsZVF1YWxpZmllZCgpIHx8CisgICAgICAgICBnZXRDb21tb25QdHIoKS0+Q2Fub25pY2FsVHlwZS5pc0xvY2FsVm9sYXRpbGVRdWFsaWZpZWQoKTsKK30KKworaW5saW5lIGJvb2wgUXVhbFR5cGU6Omhhc1F1YWxpZmllcnMoKSBjb25zdCB7CisgIHJldHVybiBoYXNMb2NhbFF1YWxpZmllcnMoKSB8fAorICAgICAgICAgZ2V0Q29tbW9uUHRyKCktPkNhbm9uaWNhbFR5cGUuaGFzTG9jYWxRdWFsaWZpZXJzKCk7Cit9CisKK2lubGluZSBRdWFsVHlwZSBRdWFsVHlwZTo6Z2V0VW5xdWFsaWZpZWRUeXBlKCkgY29uc3QgeworICBpZiAoIWdldFR5cGVQdHIoKS0+Z2V0Q2Fub25pY2FsVHlwZUludGVybmFsKCkuaGFzTG9jYWxRdWFsaWZpZXJzKCkpCisgICAgcmV0dXJuIFF1YWxUeXBlKGdldFR5cGVQdHIoKSwgMCk7CisKKyAgcmV0dXJuIFF1YWxUeXBlKGdldFNwbGl0VW5xdWFsaWZpZWRUeXBlSW1wbCgqdGhpcykuVHksIDApOworfQorICAKK2lubGluZSBTcGxpdFF1YWxUeXBlIFF1YWxUeXBlOjpnZXRTcGxpdFVucXVhbGlmaWVkVHlwZSgpIGNvbnN0IHsKKyAgaWYgKCFnZXRUeXBlUHRyKCktPmdldENhbm9uaWNhbFR5cGVJbnRlcm5hbCgpLmhhc0xvY2FsUXVhbGlmaWVycygpKQorICAgIHJldHVybiBzcGxpdCgpOworCisgIHJldHVybiBnZXRTcGxpdFVucXVhbGlmaWVkVHlwZUltcGwoKnRoaXMpOworfQorCitpbmxpbmUgdm9pZCBRdWFsVHlwZTo6cmVtb3ZlTG9jYWxDb25zdCgpIHsKKyAgcmVtb3ZlTG9jYWxGYXN0UXVhbGlmaWVycyhRdWFsaWZpZXJzOjpDb25zdCk7Cit9CisKK2lubGluZSB2b2lkIFF1YWxUeXBlOjpyZW1vdmVMb2NhbFJlc3RyaWN0KCkgeworICByZW1vdmVMb2NhbEZhc3RRdWFsaWZpZXJzKFF1YWxpZmllcnM6OlJlc3RyaWN0KTsKK30KKworaW5saW5lIHZvaWQgUXVhbFR5cGU6OnJlbW92ZUxvY2FsVm9sYXRpbGUoKSB7CisgIHJlbW92ZUxvY2FsRmFzdFF1YWxpZmllcnMoUXVhbGlmaWVyczo6Vm9sYXRpbGUpOworfQorCitpbmxpbmUgdm9pZCBRdWFsVHlwZTo6cmVtb3ZlTG9jYWxDVlJRdWFsaWZpZXJzKHVuc2lnbmVkIE1hc2spIHsKKyAgYXNzZXJ0KCEoTWFzayAmIH5RdWFsaWZpZXJzOjpDVlJNYXNrKSAmJiAibWFzayBoYXMgbm9uLUNWUiBiaXRzIik7CisgIHN0YXRpY19hc3NlcnQoKGludClRdWFsaWZpZXJzOjpDVlJNYXNrID09IChpbnQpUXVhbGlmaWVyczo6RmFzdE1hc2ssCisgICAgICAgICAgICAgICAgIkZhc3QgYml0cyBkaWZmZXIgZnJvbSBDVlIgYml0cyEiKTsKKworICAvLyBGYXN0IHBhdGg6IHdlIGRvbid0IG5lZWQgdG8gdG91Y2ggdGhlIHNsb3cgcXVhbGlmaWVycy4KKyAgcmVtb3ZlTG9jYWxGYXN0UXVhbGlmaWVycyhNYXNrKTsKK30KKworLy8vIFJldHVybiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGlzIHR5cGUuCitpbmxpbmUgTGFuZ0FTIFF1YWxUeXBlOjpnZXRBZGRyZXNzU3BhY2UoKSBjb25zdCB7CisgIHJldHVybiBnZXRRdWFsaWZpZXJzKCkuZ2V0QWRkcmVzc1NwYWNlKCk7Cit9CisKKy8vLyBSZXR1cm4gdGhlIGdjIGF0dHJpYnV0ZSBvZiB0aGlzIHR5cGUuCitpbmxpbmUgUXVhbGlmaWVyczo6R0MgUXVhbFR5cGU6OmdldE9iakNHQ0F0dHIoKSBjb25zdCB7CisgIHJldHVybiBnZXRRdWFsaWZpZXJzKCkuZ2V0T2JqQ0dDQXR0cigpOworfQorCitpbmxpbmUgRnVuY3Rpb25UeXBlOjpFeHRJbmZvIGdldEZ1bmN0aW9uRXh0SW5mbyhjb25zdCBUeXBlICZ0KSB7CisgIGlmIChjb25zdCBhdXRvICpQVCA9IHQuZ2V0QXM8UG9pbnRlclR5cGU+KCkpIHsKKyAgICBpZiAoY29uc3QgYXV0byAqRlQgPSBQVC0+Z2V0UG9pbnRlZVR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpKQorICAgICAgcmV0dXJuIEZULT5nZXRFeHRJbmZvKCk7CisgIH0gZWxzZSBpZiAoY29uc3QgYXV0byAqRlQgPSB0LmdldEFzPEZ1bmN0aW9uVHlwZT4oKSkKKyAgICByZXR1cm4gRlQtPmdldEV4dEluZm8oKTsKKworICByZXR1cm4gRnVuY3Rpb25UeXBlOjpFeHRJbmZvKCk7Cit9CisKK2lubGluZSBGdW5jdGlvblR5cGU6OkV4dEluZm8gZ2V0RnVuY3Rpb25FeHRJbmZvKFF1YWxUeXBlIHQpIHsKKyAgcmV0dXJuIGdldEZ1bmN0aW9uRXh0SW5mbygqdCk7Cit9CisKKy8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHR5cGUgaXMgbW9yZQorLy8vIHF1YWxpZmllZCB0aGFuIHRoZSBPdGhlciB0eXBlLiBGb3IgZXhhbXBsZSwgImNvbnN0IHZvbGF0aWxlIGludCIKKy8vLyBpcyBtb3JlIHF1YWxpZmllZCB0aGFuICJjb25zdCBpbnQiLCAidm9sYXRpbGUgaW50IiwgYW5kCisvLy8gImludCIuIEhvd2V2ZXIsIGl0IGlzIG5vdCBtb3JlIHF1YWxpZmllZCB0aGFuICJjb25zdCB2b2xhdGlsZQorLy8vIGludCIuCitpbmxpbmUgYm9vbCBRdWFsVHlwZTo6aXNNb3JlUXVhbGlmaWVkVGhhbihRdWFsVHlwZSBvdGhlcikgY29uc3QgeworICBRdWFsaWZpZXJzIE15UXVhbHMgPSBnZXRRdWFsaWZpZXJzKCk7CisgIFF1YWxpZmllcnMgT3RoZXJRdWFscyA9IG90aGVyLmdldFF1YWxpZmllcnMoKTsKKyAgcmV0dXJuIChNeVF1YWxzICE9IE90aGVyUXVhbHMgJiYgTXlRdWFscy5jb21wYXRpYmx5SW5jbHVkZXMoT3RoZXJRdWFscykpOworfQorCisvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB0eXBlIGlzIGF0IGxhc3QKKy8vLyBhcyBxdWFsaWZpZWQgYXMgdGhlIE90aGVyIHR5cGUuIEZvciBleGFtcGxlLCAiY29uc3Qgdm9sYXRpbGUKKy8vLyBpbnQiIGlzIGF0IGxlYXN0IGFzIHF1YWxpZmllZCBhcyAiY29uc3QgaW50IiwgInZvbGF0aWxlIGludCIsCisvLy8gImludCIsIGFuZCAiY29uc3Qgdm9sYXRpbGUgaW50Ii4KK2lubGluZSBib29sIFF1YWxUeXBlOjppc0F0TGVhc3RBc1F1YWxpZmllZEFzKFF1YWxUeXBlIG90aGVyKSBjb25zdCB7CisgIFF1YWxpZmllcnMgT3RoZXJRdWFscyA9IG90aGVyLmdldFF1YWxpZmllcnMoKTsKKworICAvLyBJZ25vcmUgX191bmFsaWduZWQgcXVhbGlmaWVyIGlmIHRoaXMgdHlwZSBpcyBhIHZvaWQuCisgIGlmIChnZXRVbnF1YWxpZmllZFR5cGUoKS0+aXNWb2lkVHlwZSgpKQorICAgIE90aGVyUXVhbHMucmVtb3ZlVW5hbGlnbmVkKCk7CisKKyAgcmV0dXJuIGdldFF1YWxpZmllcnMoKS5jb21wYXRpYmx5SW5jbHVkZXMoT3RoZXJRdWFscyk7Cit9CisKKy8vLyBJZiBUeXBlIGlzIGEgcmVmZXJlbmNlIHR5cGUgKGUuZy4sIGNvbnN0CisvLy8gaW50JiksIHJldHVybnMgdGhlIHR5cGUgdGhhdCB0aGUgcmVmZXJlbmNlIHJlZmVycyB0byAoImNvbnN0CisvLy8gaW50IikuIE90aGVyd2lzZSwgcmV0dXJucyB0aGUgdHlwZSBpdHNlbGYuIFRoaXMgcm91dGluZSBpcyB1c2VkCisvLy8gdGhyb3VnaG91dCBTZW1hIHRvIGltcGxlbWVudCBDKysgNXA2OgorLy8vCisvLy8gICBJZiBhbiBleHByZXNzaW9uIGluaXRpYWxseSBoYXMgdGhlIHR5cGUgInJlZmVyZW5jZSB0byBUIiAoOC4zLjIsCisvLy8gICA4LjUuMyksIHRoZSB0eXBlIGlzIGFkanVzdGVkIHRvICJUIiBwcmlvciB0byBhbnkgZnVydGhlcgorLy8vICAgYW5hbHlzaXMsIHRoZSBleHByZXNzaW9uIGRlc2lnbmF0ZXMgdGhlIG9iamVjdCBvciBmdW5jdGlvbgorLy8vICAgZGVub3RlZCBieSB0aGUgcmVmZXJlbmNlLCBhbmQgdGhlIGV4cHJlc3Npb24gaXMgYW4gbHZhbHVlLgoraW5saW5lIFF1YWxUeXBlIFF1YWxUeXBlOjpnZXROb25SZWZlcmVuY2VUeXBlKCkgY29uc3QgeworICBpZiAoY29uc3QgYXV0byAqUmVmVHlwZSA9ICgqdGhpcyktPmdldEFzPFJlZmVyZW5jZVR5cGU+KCkpCisgICAgcmV0dXJuIFJlZlR5cGUtPmdldFBvaW50ZWVUeXBlKCk7CisgIGVsc2UKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2lubGluZSBib29sIFF1YWxUeXBlOjppc0NGb3JiaWRkZW5MVmFsdWVUeXBlKCkgY29uc3QgeworICByZXR1cm4gKChnZXRUeXBlUHRyKCktPmlzVm9pZFR5cGUoKSAmJiAhaGFzUXVhbGlmaWVycygpKSB8fAorICAgICAgICAgIGdldFR5cGVQdHIoKS0+aXNGdW5jdGlvblR5cGUoKSk7Cit9CisKKy8vLyBUZXN0cyB3aGV0aGVyIHRoZSB0eXBlIGlzIGNhdGVnb3JpemVkIGFzIGEgZnVuZGFtZW50YWwgdHlwZS4KKy8vLworLy8vIFxyZXR1cm5zIFRydWUgZm9yIHR5cGVzIHNwZWNpZmllZCBpbiBDKysweCBbYmFzaWMuZnVuZGFtZW50YWxdLgoraW5saW5lIGJvb2wgVHlwZTo6aXNGdW5kYW1lbnRhbFR5cGUoKSBjb25zdCB7CisgIHJldHVybiBpc1ZvaWRUeXBlKCkgfHwKKyAgICAgICAgIC8vIEZJWE1FOiBJdCdzIHJlYWxseSBhbm5veWluZyB0aGF0IHdlIGRvbid0IGhhdmUgYW4KKyAgICAgICAgIC8vICdpc0FyaXRobWV0aWNUeXBlKCknIHdoaWNoIGFncmVlcyB3aXRoIHRoZSBzdGFuZGFyZCBkZWZpbml0aW9uLgorICAgICAgICAgKGlzQXJpdGhtZXRpY1R5cGUoKSAmJiAhaXNFbnVtZXJhbFR5cGUoKSk7Cit9CisKKy8vLyBUZXN0cyB3aGV0aGVyIHRoZSB0eXBlIGlzIGNhdGVnb3JpemVkIGFzIGEgY29tcG91bmQgdHlwZS4KKy8vLworLy8vIFxyZXR1cm5zIFRydWUgZm9yIHR5cGVzIHNwZWNpZmllZCBpbiBDKysweCBbYmFzaWMuY29tcG91bmRdLgoraW5saW5lIGJvb2wgVHlwZTo6aXNDb21wb3VuZFR5cGUoKSBjb25zdCB7CisgIC8vIEMrKzB4IFtiYXNpYy5jb21wb3VuZF1wMToKKyAgLy8gICBDb21wb3VuZCB0eXBlcyBjYW4gYmUgY29uc3RydWN0ZWQgaW4gdGhlIGZvbGxvd2luZyB3YXlzOgorICAvLyAgICAtLSBhcnJheXMgb2Ygb2JqZWN0cyBvZiBhIGdpdmVuIHR5cGUgWy4uLl07CisgIHJldHVybiBpc0FycmF5VHlwZSgpIHx8CisgIC8vICAgIC0tIGZ1bmN0aW9ucywgd2hpY2ggaGF2ZSBwYXJhbWV0ZXJzIG9mIGdpdmVuIHR5cGVzIFsuLi5dOworICAgICAgICAgaXNGdW5jdGlvblR5cGUoKSB8fAorICAvLyAgICAtLSBwb2ludGVycyB0byB2b2lkIG9yIG9iamVjdHMgb3IgZnVuY3Rpb25zIFsuLi5dOworICAgICAgICAgaXNQb2ludGVyVHlwZSgpIHx8CisgIC8vICAgIC0tIHJlZmVyZW5jZXMgdG8gb2JqZWN0cyBvciBmdW5jdGlvbnMgb2YgYSBnaXZlbiB0eXBlLiBbLi4uXQorICAgICAgICAgaXNSZWZlcmVuY2VUeXBlKCkgfHwKKyAgLy8gICAgLS0gY2xhc3NlcyBjb250YWluaW5nIGEgc2VxdWVuY2Ugb2Ygb2JqZWN0cyBvZiB2YXJpb3VzIHR5cGVzLCBbLi4uXTsKKyAgICAgICAgIGlzUmVjb3JkVHlwZSgpIHx8CisgIC8vICAgIC0tIHVuaW9ucywgd2hpY2ggYXJlIGNsYXNzZXMgY2FwYWJsZSBvZiBjb250YWluaW5nIG9iamVjdHMgb2YgZGlmZmVyZW50CisgIC8vICAgICAgICAgICAgICAgdHlwZXMgYXQgZGlmZmVyZW50IHRpbWVzOworICAgICAgICAgaXNVbmlvblR5cGUoKSB8fAorICAvLyAgICAtLSBlbnVtZXJhdGlvbnMsIHdoaWNoIGNvbXByaXNlIGEgc2V0IG9mIG5hbWVkIGNvbnN0YW50IHZhbHVlcy4gWy4uLl07CisgICAgICAgICBpc0VudW1lcmFsVHlwZSgpIHx8CisgIC8vICAgIC0tIHBvaW50ZXJzIHRvIG5vbi1zdGF0aWMgY2xhc3MgbWVtYmVycywgWy4uLl0uCisgICAgICAgICBpc01lbWJlclBvaW50ZXJUeXBlKCk7Cit9CisKK2lubGluZSBib29sIFR5cGU6OmlzRnVuY3Rpb25UeXBlKCkgY29uc3QgeworICByZXR1cm4gaXNhPEZ1bmN0aW9uVHlwZT4oQ2Fub25pY2FsVHlwZSk7Cit9CisKK2lubGluZSBib29sIFR5cGU6OmlzUG9pbnRlclR5cGUoKSBjb25zdCB7CisgIHJldHVybiBpc2E8UG9pbnRlclR5cGU+KENhbm9uaWNhbFR5cGUpOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc0FueVBvaW50ZXJUeXBlKCkgY29uc3QgeworICByZXR1cm4gaXNQb2ludGVyVHlwZSgpIHx8IGlzT2JqQ09iamVjdFBvaW50ZXJUeXBlKCk7Cit9CisKK2lubGluZSBib29sIFR5cGU6OmlzQmxvY2tQb2ludGVyVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGlzYTxCbG9ja1BvaW50ZXJUeXBlPihDYW5vbmljYWxUeXBlKTsKK30KKworaW5saW5lIGJvb2wgVHlwZTo6aXNSZWZlcmVuY2VUeXBlKCkgY29uc3QgeworICByZXR1cm4gaXNhPFJlZmVyZW5jZVR5cGU+KENhbm9uaWNhbFR5cGUpOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc0xWYWx1ZVJlZmVyZW5jZVR5cGUoKSBjb25zdCB7CisgIHJldHVybiBpc2E8TFZhbHVlUmVmZXJlbmNlVHlwZT4oQ2Fub25pY2FsVHlwZSk7Cit9CisKK2lubGluZSBib29sIFR5cGU6OmlzUlZhbHVlUmVmZXJlbmNlVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGlzYTxSVmFsdWVSZWZlcmVuY2VUeXBlPihDYW5vbmljYWxUeXBlKTsKK30KKworaW5saW5lIGJvb2wgVHlwZTo6aXNGdW5jdGlvblBvaW50ZXJUeXBlKCkgY29uc3QgeworICBpZiAoY29uc3QgYXV0byAqVCA9IGdldEFzPFBvaW50ZXJUeXBlPigpKQorICAgIHJldHVybiBULT5nZXRQb2ludGVlVHlwZSgpLT5pc0Z1bmN0aW9uVHlwZSgpOworICBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc01lbWJlclBvaW50ZXJUeXBlKCkgY29uc3QgeworICByZXR1cm4gaXNhPE1lbWJlclBvaW50ZXJUeXBlPihDYW5vbmljYWxUeXBlKTsKK30KKworaW5saW5lIGJvb2wgVHlwZTo6aXNNZW1iZXJGdW5jdGlvblBvaW50ZXJUeXBlKCkgY29uc3QgeworICBpZiAoY29uc3QgYXV0byAqVCA9IGdldEFzPE1lbWJlclBvaW50ZXJUeXBlPigpKQorICAgIHJldHVybiBULT5pc01lbWJlckZ1bmN0aW9uUG9pbnRlcigpOworICBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc01lbWJlckRhdGFQb2ludGVyVHlwZSgpIGNvbnN0IHsKKyAgaWYgKGNvbnN0IGF1dG8gKlQgPSBnZXRBczxNZW1iZXJQb2ludGVyVHlwZT4oKSkKKyAgICByZXR1cm4gVC0+aXNNZW1iZXJEYXRhUG9pbnRlcigpOworICBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc0FycmF5VHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGlzYTxBcnJheVR5cGU+KENhbm9uaWNhbFR5cGUpOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc0NvbnN0YW50QXJyYXlUeXBlKCkgY29uc3QgeworICByZXR1cm4gaXNhPENvbnN0YW50QXJyYXlUeXBlPihDYW5vbmljYWxUeXBlKTsKK30KKworaW5saW5lIGJvb2wgVHlwZTo6aXNJbmNvbXBsZXRlQXJyYXlUeXBlKCkgY29uc3QgeworICByZXR1cm4gaXNhPEluY29tcGxldGVBcnJheVR5cGU+KENhbm9uaWNhbFR5cGUpOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc1ZhcmlhYmxlQXJyYXlUeXBlKCkgY29uc3QgeworICByZXR1cm4gaXNhPFZhcmlhYmxlQXJyYXlUeXBlPihDYW5vbmljYWxUeXBlKTsKK30KKworaW5saW5lIGJvb2wgVHlwZTo6aXNEZXBlbmRlbnRTaXplZEFycmF5VHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGlzYTxEZXBlbmRlbnRTaXplZEFycmF5VHlwZT4oQ2Fub25pY2FsVHlwZSk7Cit9CisKK2lubGluZSBib29sIFR5cGU6OmlzQnVpbHRpblR5cGUoKSBjb25zdCB7CisgIHJldHVybiBpc2E8QnVpbHRpblR5cGU+KENhbm9uaWNhbFR5cGUpOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc1JlY29yZFR5cGUoKSBjb25zdCB7CisgIHJldHVybiBpc2E8UmVjb3JkVHlwZT4oQ2Fub25pY2FsVHlwZSk7Cit9CisKK2lubGluZSBib29sIFR5cGU6OmlzRW51bWVyYWxUeXBlKCkgY29uc3QgeworICByZXR1cm4gaXNhPEVudW1UeXBlPihDYW5vbmljYWxUeXBlKTsKK30KKworaW5saW5lIGJvb2wgVHlwZTo6aXNBbnlDb21wbGV4VHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGlzYTxDb21wbGV4VHlwZT4oQ2Fub25pY2FsVHlwZSk7Cit9CisKK2lubGluZSBib29sIFR5cGU6OmlzVmVjdG9yVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGlzYTxWZWN0b3JUeXBlPihDYW5vbmljYWxUeXBlKTsKK30KKworaW5saW5lIGJvb2wgVHlwZTo6aXNFeHRWZWN0b3JUeXBlKCkgY29uc3QgeworICByZXR1cm4gaXNhPEV4dFZlY3RvclR5cGU+KENhbm9uaWNhbFR5cGUpOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc0RlcGVuZGVudEFkZHJlc3NTcGFjZVR5cGUoKSBjb25zdCB7CisgIHJldHVybiBpc2E8RGVwZW5kZW50QWRkcmVzc1NwYWNlVHlwZT4oQ2Fub25pY2FsVHlwZSk7Cit9CisKK2lubGluZSBib29sIFR5cGU6OmlzT2JqQ09iamVjdFBvaW50ZXJUeXBlKCkgY29uc3QgeworICByZXR1cm4gaXNhPE9iakNPYmplY3RQb2ludGVyVHlwZT4oQ2Fub25pY2FsVHlwZSk7Cit9CisKK2lubGluZSBib29sIFR5cGU6OmlzT2JqQ09iamVjdFR5cGUoKSBjb25zdCB7CisgIHJldHVybiBpc2E8T2JqQ09iamVjdFR5cGU+KENhbm9uaWNhbFR5cGUpOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc09iakNPYmplY3RPckludGVyZmFjZVR5cGUoKSBjb25zdCB7CisgIHJldHVybiBpc2E8T2JqQ0ludGVyZmFjZVR5cGU+KENhbm9uaWNhbFR5cGUpIHx8CisgICAgaXNhPE9iakNPYmplY3RUeXBlPihDYW5vbmljYWxUeXBlKTsKK30KKworaW5saW5lIGJvb2wgVHlwZTo6aXNBdG9taWNUeXBlKCkgY29uc3QgeworICByZXR1cm4gaXNhPEF0b21pY1R5cGU+KENhbm9uaWNhbFR5cGUpOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc09iakNRdWFsaWZpZWRJZFR5cGUoKSBjb25zdCB7CisgIGlmIChjb25zdCBhdXRvICpPUFQgPSBnZXRBczxPYmpDT2JqZWN0UG9pbnRlclR5cGU+KCkpCisgICAgcmV0dXJuIE9QVC0+aXNPYmpDUXVhbGlmaWVkSWRUeXBlKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgVHlwZTo6aXNPYmpDUXVhbGlmaWVkQ2xhc3NUeXBlKCkgY29uc3QgeworICBpZiAoY29uc3QgYXV0byAqT1BUID0gZ2V0QXM8T2JqQ09iamVjdFBvaW50ZXJUeXBlPigpKQorICAgIHJldHVybiBPUFQtPmlzT2JqQ1F1YWxpZmllZENsYXNzVHlwZSgpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSBib29sIFR5cGU6OmlzT2JqQ0lkVHlwZSgpIGNvbnN0IHsKKyAgaWYgKGNvbnN0IGF1dG8gKk9QVCA9IGdldEFzPE9iakNPYmplY3RQb2ludGVyVHlwZT4oKSkKKyAgICByZXR1cm4gT1BULT5pc09iakNJZFR5cGUoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc09iakNDbGFzc1R5cGUoKSBjb25zdCB7CisgIGlmIChjb25zdCBhdXRvICpPUFQgPSBnZXRBczxPYmpDT2JqZWN0UG9pbnRlclR5cGU+KCkpCisgICAgcmV0dXJuIE9QVC0+aXNPYmpDQ2xhc3NUeXBlKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgVHlwZTo6aXNPYmpDU2VsVHlwZSgpIGNvbnN0IHsKKyAgaWYgKGNvbnN0IGF1dG8gKk9QVCA9IGdldEFzPFBvaW50ZXJUeXBlPigpKQorICAgIHJldHVybiBPUFQtPmdldFBvaW50ZWVUeXBlKCktPmlzU3BlY2lmaWNCdWlsdGluVHlwZShCdWlsdGluVHlwZTo6T2JqQ1NlbCk7CisgIHJldHVybiBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgVHlwZTo6aXNPYmpDQnVpbHRpblR5cGUoKSBjb25zdCB7CisgIHJldHVybiBpc09iakNJZFR5cGUoKSB8fCBpc09iakNDbGFzc1R5cGUoKSB8fCBpc09iakNTZWxUeXBlKCk7Cit9CisKKyNkZWZpbmUgSU1BR0VfVFlQRShJbWdUeXBlLCBJZCwgU2luZ2xldG9uSWQsIEFjY2VzcywgU3VmZml4KSBcCisgIGlubGluZSBib29sIFR5cGU6OmlzIyNJZCMjVHlwZSgpIGNvbnN0IHsgXAorICAgIHJldHVybiBpc1NwZWNpZmljQnVpbHRpblR5cGUoQnVpbHRpblR5cGU6OklkKTsgXAorICB9CisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3BlbkNMSW1hZ2VUeXBlcy5kZWYiCisKK2lubGluZSBib29sIFR5cGU6OmlzU2FtcGxlclQoKSBjb25zdCB7CisgIHJldHVybiBpc1NwZWNpZmljQnVpbHRpblR5cGUoQnVpbHRpblR5cGU6Ok9DTFNhbXBsZXIpOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc0V2ZW50VCgpIGNvbnN0IHsKKyAgcmV0dXJuIGlzU3BlY2lmaWNCdWlsdGluVHlwZShCdWlsdGluVHlwZTo6T0NMRXZlbnQpOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc0Nsa0V2ZW50VCgpIGNvbnN0IHsKKyAgcmV0dXJuIGlzU3BlY2lmaWNCdWlsdGluVHlwZShCdWlsdGluVHlwZTo6T0NMQ2xrRXZlbnQpOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc1F1ZXVlVCgpIGNvbnN0IHsKKyAgcmV0dXJuIGlzU3BlY2lmaWNCdWlsdGluVHlwZShCdWlsdGluVHlwZTo6T0NMUXVldWUpOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc1Jlc2VydmVJRFQoKSBjb25zdCB7CisgIHJldHVybiBpc1NwZWNpZmljQnVpbHRpblR5cGUoQnVpbHRpblR5cGU6Ok9DTFJlc2VydmVJRCk7Cit9CisKK2lubGluZSBib29sIFR5cGU6OmlzSW1hZ2VUeXBlKCkgY29uc3QgeworI2RlZmluZSBJTUFHRV9UWVBFKEltZ1R5cGUsIElkLCBTaW5nbGV0b25JZCwgQWNjZXNzLCBTdWZmaXgpIGlzIyNJZCMjVHlwZSgpIHx8CisgIHJldHVybgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZW5DTEltYWdlVHlwZXMuZGVmIgorICAgICAgZmFsc2U7IC8vIGVuZCBib29sZWFuIG9yIG9wZXJhdGlvbgorfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc1BpcGVUeXBlKCkgY29uc3QgeworICByZXR1cm4gaXNhPFBpcGVUeXBlPihDYW5vbmljYWxUeXBlKTsKK30KKworaW5saW5lIGJvb2wgVHlwZTo6aXNPcGVuQ0xTcGVjaWZpY1R5cGUoKSBjb25zdCB7CisgIHJldHVybiBpc1NhbXBsZXJUKCkgfHwgaXNFdmVudFQoKSB8fCBpc0ltYWdlVHlwZSgpIHx8IGlzQ2xrRXZlbnRUKCkgfHwKKyAgICAgICAgIGlzUXVldWVUKCkgfHwgaXNSZXNlcnZlSURUKCkgfHwgaXNQaXBlVHlwZSgpOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc1RlbXBsYXRlVHlwZVBhcm1UeXBlKCkgY29uc3QgeworICByZXR1cm4gaXNhPFRlbXBsYXRlVHlwZVBhcm1UeXBlPihDYW5vbmljYWxUeXBlKTsKK30KKworaW5saW5lIGJvb2wgVHlwZTo6aXNTcGVjaWZpY0J1aWx0aW5UeXBlKHVuc2lnbmVkIEspIGNvbnN0IHsKKyAgaWYgKGNvbnN0IEJ1aWx0aW5UeXBlICpCVCA9IGdldEFzPEJ1aWx0aW5UeXBlPigpKQorICAgIGlmIChCVC0+Z2V0S2luZCgpID09IChCdWlsdGluVHlwZTo6S2luZCkgSykKKyAgICAgIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSBib29sIFR5cGU6OmlzUGxhY2Vob2xkZXJUeXBlKCkgY29uc3QgeworICBpZiAoY29uc3QgYXV0byAqQlQgPSBkeW5fY2FzdDxCdWlsdGluVHlwZT4odGhpcykpCisgICAgcmV0dXJuIEJULT5pc1BsYWNlaG9sZGVyVHlwZSgpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSBjb25zdCBCdWlsdGluVHlwZSAqVHlwZTo6Z2V0QXNQbGFjZWhvbGRlclR5cGUoKSBjb25zdCB7CisgIGlmIChjb25zdCBhdXRvICpCVCA9IGR5bl9jYXN0PEJ1aWx0aW5UeXBlPih0aGlzKSkKKyAgICBpZiAoQlQtPmlzUGxhY2Vob2xkZXJUeXBlKCkpCisgICAgICByZXR1cm4gQlQ7CisgIHJldHVybiBudWxscHRyOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc1NwZWNpZmljUGxhY2Vob2xkZXJUeXBlKHVuc2lnbmVkIEspIGNvbnN0IHsKKyAgYXNzZXJ0KEJ1aWx0aW5UeXBlOjppc1BsYWNlaG9sZGVyVHlwZUtpbmQoKEJ1aWx0aW5UeXBlOjpLaW5kKSBLKSk7CisgIGlmIChjb25zdCBhdXRvICpCVCA9IGR5bl9jYXN0PEJ1aWx0aW5UeXBlPih0aGlzKSkKKyAgICByZXR1cm4gKEJULT5nZXRLaW5kKCkgPT0gKEJ1aWx0aW5UeXBlOjpLaW5kKSBLKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc05vbk92ZXJsb2FkUGxhY2Vob2xkZXJUeXBlKCkgY29uc3QgeworICBpZiAoY29uc3QgYXV0byAqQlQgPSBkeW5fY2FzdDxCdWlsdGluVHlwZT4odGhpcykpCisgICAgcmV0dXJuIEJULT5pc05vbk92ZXJsb2FkUGxhY2Vob2xkZXJUeXBlKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgVHlwZTo6aXNWb2lkVHlwZSgpIGNvbnN0IHsKKyAgaWYgKGNvbnN0IGF1dG8gKkJUID0gZHluX2Nhc3Q8QnVpbHRpblR5cGU+KENhbm9uaWNhbFR5cGUpKQorICAgIHJldHVybiBCVC0+Z2V0S2luZCgpID09IEJ1aWx0aW5UeXBlOjpWb2lkOworICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSBib29sIFR5cGU6OmlzSGFsZlR5cGUoKSBjb25zdCB7CisgIGlmIChjb25zdCBhdXRvICpCVCA9IGR5bl9jYXN0PEJ1aWx0aW5UeXBlPihDYW5vbmljYWxUeXBlKSkKKyAgICByZXR1cm4gQlQtPmdldEtpbmQoKSA9PSBCdWlsdGluVHlwZTo6SGFsZjsKKyAgLy8gRklYTUU6IFNob3VsZCB3ZSBhbGxvdyBjb21wbGV4IF9fZnAxNj8gUHJvYmFibHkgbm90LgorICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSBib29sIFR5cGU6OmlzRmxvYXQxNlR5cGUoKSBjb25zdCB7CisgIGlmIChjb25zdCBhdXRvICpCVCA9IGR5bl9jYXN0PEJ1aWx0aW5UeXBlPihDYW5vbmljYWxUeXBlKSkKKyAgICByZXR1cm4gQlQtPmdldEtpbmQoKSA9PSBCdWlsdGluVHlwZTo6RmxvYXQxNjsKKyAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc051bGxQdHJUeXBlKCkgY29uc3QgeworICBpZiAoY29uc3QgYXV0byAqQlQgPSBnZXRBczxCdWlsdGluVHlwZT4oKSkKKyAgICByZXR1cm4gQlQtPmdldEtpbmQoKSA9PSBCdWlsdGluVHlwZTo6TnVsbFB0cjsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIElzRW51bURlY2xDb21wbGV0ZShFbnVtRGVjbCAqKTsKK2Jvb2wgSXNFbnVtRGVjbFNjb3BlZChFbnVtRGVjbCAqKTsKKworaW5saW5lIGJvb2wgVHlwZTo6aXNJbnRlZ2VyVHlwZSgpIGNvbnN0IHsKKyAgaWYgKGNvbnN0IGF1dG8gKkJUID0gZHluX2Nhc3Q8QnVpbHRpblR5cGU+KENhbm9uaWNhbFR5cGUpKQorICAgIHJldHVybiBCVC0+Z2V0S2luZCgpID49IEJ1aWx0aW5UeXBlOjpCb29sICYmCisgICAgICAgICAgIEJULT5nZXRLaW5kKCkgPD0gQnVpbHRpblR5cGU6OkludDEyODsKKyAgaWYgKGNvbnN0IEVudW1UeXBlICpFVCA9IGR5bl9jYXN0PEVudW1UeXBlPihDYW5vbmljYWxUeXBlKSkgeworICAgIC8vIEluY29tcGxldGUgZW51bSB0eXBlcyBhcmUgbm90IHRyZWF0ZWQgYXMgaW50ZWdlciB0eXBlcy4KKyAgICAvLyBGSVhNRTogSW4gQysrLCBlbnVtIHR5cGVzIGFyZSBuZXZlciBpbnRlZ2VyIHR5cGVzLgorICAgIHJldHVybiBJc0VudW1EZWNsQ29tcGxldGUoRVQtPmdldERlY2woKSkgJiYKKyAgICAgICFJc0VudW1EZWNsU2NvcGVkKEVULT5nZXREZWNsKCkpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgVHlwZTo6aXNTY2FsYXJUeXBlKCkgY29uc3QgeworICBpZiAoY29uc3QgYXV0byAqQlQgPSBkeW5fY2FzdDxCdWlsdGluVHlwZT4oQ2Fub25pY2FsVHlwZSkpCisgICAgcmV0dXJuIEJULT5nZXRLaW5kKCkgPiBCdWlsdGluVHlwZTo6Vm9pZCAmJgorICAgICAgICAgICBCVC0+Z2V0S2luZCgpIDw9IEJ1aWx0aW5UeXBlOjpOdWxsUHRyOworICBpZiAoY29uc3QgRW51bVR5cGUgKkVUID0gZHluX2Nhc3Q8RW51bVR5cGU+KENhbm9uaWNhbFR5cGUpKQorICAgIC8vIEVudW1zIGFyZSBzY2FsYXIgdHlwZXMsIGJ1dCBvbmx5IGlmIHRoZXkgYXJlIGRlZmluZWQuICBJbmNvbXBsZXRlIGVudW1zCisgICAgLy8gYXJlIG5vdCB0cmVhdGVkIGFzIHNjYWxhciB0eXBlcy4KKyAgICByZXR1cm4gSXNFbnVtRGVjbENvbXBsZXRlKEVULT5nZXREZWNsKCkpOworICByZXR1cm4gaXNhPFBvaW50ZXJUeXBlPihDYW5vbmljYWxUeXBlKSB8fAorICAgICAgICAgaXNhPEJsb2NrUG9pbnRlclR5cGU+KENhbm9uaWNhbFR5cGUpIHx8CisgICAgICAgICBpc2E8TWVtYmVyUG9pbnRlclR5cGU+KENhbm9uaWNhbFR5cGUpIHx8CisgICAgICAgICBpc2E8Q29tcGxleFR5cGU+KENhbm9uaWNhbFR5cGUpIHx8CisgICAgICAgICBpc2E8T2JqQ09iamVjdFBvaW50ZXJUeXBlPihDYW5vbmljYWxUeXBlKTsKK30KKworaW5saW5lIGJvb2wgVHlwZTo6aXNJbnRlZ3JhbE9yRW51bWVyYXRpb25UeXBlKCkgY29uc3QgeworICBpZiAoY29uc3QgYXV0byAqQlQgPSBkeW5fY2FzdDxCdWlsdGluVHlwZT4oQ2Fub25pY2FsVHlwZSkpCisgICAgcmV0dXJuIEJULT5nZXRLaW5kKCkgPj0gQnVpbHRpblR5cGU6OkJvb2wgJiYKKyAgICAgICAgICAgQlQtPmdldEtpbmQoKSA8PSBCdWlsdGluVHlwZTo6SW50MTI4OworCisgIC8vIENoZWNrIGZvciBhIGNvbXBsZXRlIGVudW0gdHlwZTsgaW5jb21wbGV0ZSBlbnVtIHR5cGVzIGFyZSBub3QgcHJvcGVybHkgYW4KKyAgLy8gZW51bWVyYXRpb24gdHlwZSBpbiB0aGUgc2Vuc2UgcmVxdWlyZWQgaGVyZS4KKyAgaWYgKGNvbnN0IGF1dG8gKkVUID0gZHluX2Nhc3Q8RW51bVR5cGU+KENhbm9uaWNhbFR5cGUpKQorICAgIHJldHVybiBJc0VudW1EZWNsQ29tcGxldGUoRVQtPmdldERlY2woKSk7CisKKyAgcmV0dXJuIGZhbHNlOyAgCit9CisKK2lubGluZSBib29sIFR5cGU6OmlzQm9vbGVhblR5cGUoKSBjb25zdCB7CisgIGlmIChjb25zdCBhdXRvICpCVCA9IGR5bl9jYXN0PEJ1aWx0aW5UeXBlPihDYW5vbmljYWxUeXBlKSkKKyAgICByZXR1cm4gQlQtPmdldEtpbmQoKSA9PSBCdWlsdGluVHlwZTo6Qm9vbDsKKyAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjppc1VuZGVkdWNlZFR5cGUoKSBjb25zdCB7CisgIGF1dG8gKkRUID0gZ2V0Q29udGFpbmVkRGVkdWNlZFR5cGUoKTsKKyAgcmV0dXJuIERUICYmICFEVC0+aXNEZWR1Y2VkKCk7Cit9CisKKy8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgaXMgYSB0eXBlIGZvciB3aGljaCBvbmUgY2FuIGRlZmluZQorLy8vIGFuIG92ZXJsb2FkZWQgb3BlcmF0b3IuCitpbmxpbmUgYm9vbCBUeXBlOjppc092ZXJsb2FkYWJsZVR5cGUoKSBjb25zdCB7CisgIHJldHVybiBpc0RlcGVuZGVudFR5cGUoKSB8fCBpc1JlY29yZFR5cGUoKSB8fCBpc0VudW1lcmFsVHlwZSgpOworfQorCisvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB0aGlzIHR5cGUgY2FuIGRlY2F5IHRvIGEgcG9pbnRlciB0eXBlLgoraW5saW5lIGJvb2wgVHlwZTo6Y2FuRGVjYXlUb1BvaW50ZXJUeXBlKCkgY29uc3QgeworICByZXR1cm4gaXNGdW5jdGlvblR5cGUoKSB8fCBpc0FycmF5VHlwZSgpOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjpoYXNQb2ludGVyUmVwcmVzZW50YXRpb24oKSBjb25zdCB7CisgIHJldHVybiAoaXNQb2ludGVyVHlwZSgpIHx8IGlzUmVmZXJlbmNlVHlwZSgpIHx8IGlzQmxvY2tQb2ludGVyVHlwZSgpIHx8CisgICAgICAgICAgaXNPYmpDT2JqZWN0UG9pbnRlclR5cGUoKSB8fCBpc051bGxQdHJUeXBlKCkpOworfQorCitpbmxpbmUgYm9vbCBUeXBlOjpoYXNPYmpDUG9pbnRlclJlcHJlc2VudGF0aW9uKCkgY29uc3QgeworICByZXR1cm4gaXNPYmpDT2JqZWN0UG9pbnRlclR5cGUoKTsKK30KKworaW5saW5lIGNvbnN0IFR5cGUgKlR5cGU6OmdldEJhc2VFbGVtZW50VHlwZVVuc2FmZSgpIGNvbnN0IHsKKyAgY29uc3QgVHlwZSAqdHlwZSA9IHRoaXM7CisgIHdoaWxlIChjb25zdCBBcnJheVR5cGUgKmFycmF5VHlwZSA9IHR5cGUtPmdldEFzQXJyYXlUeXBlVW5zYWZlKCkpCisgICAgdHlwZSA9IGFycmF5VHlwZS0+Z2V0RWxlbWVudFR5cGUoKS5nZXRUeXBlUHRyKCk7CisgIHJldHVybiB0eXBlOworfQorCitpbmxpbmUgY29uc3QgVHlwZSAqVHlwZTo6Z2V0UG9pbnRlZU9yQXJyYXlFbGVtZW50VHlwZSgpIGNvbnN0IHsKKyAgY29uc3QgVHlwZSAqdHlwZSA9IHRoaXM7CisgIGlmICh0eXBlLT5pc0FueVBvaW50ZXJUeXBlKCkpCisgICAgcmV0dXJuIHR5cGUtPmdldFBvaW50ZWVUeXBlKCkuZ2V0VHlwZVB0cigpOworICBlbHNlIGlmICh0eXBlLT5pc0FycmF5VHlwZSgpKQorICAgIHJldHVybiB0eXBlLT5nZXRCYXNlRWxlbWVudFR5cGVVbnNhZmUoKTsKKyAgcmV0dXJuIHR5cGU7Cit9CisKKy8vLyBJbnNlcnRpb24gb3BlcmF0b3IgZm9yIGRpYWdub3N0aWNzLiAgVGhpcyBhbGxvd3Mgc2VuZGluZyBRdWFsVHlwZSdzIGludG8gYQorLy8vIGRpYWdub3N0aWMgd2l0aCA8PC4KK2lubGluZSBjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmb3BlcmF0b3I8PChjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmREIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCkgeworICBEQi5BZGRUYWdnZWRWYWwocmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oVC5nZXRBc09wYXF1ZVB0cigpKSwKKyAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpha19xdWFsdHlwZSk7CisgIHJldHVybiBEQjsKK30KKworLy8vIEluc2VydGlvbiBvcGVyYXRvciBmb3IgcGFydGlhbCBkaWFnbm9zdGljcy4gIFRoaXMgYWxsb3dzIHNlbmRpbmcgUXVhbFR5cGUncworLy8vIGludG8gYSBkaWFnbm9zdGljIHdpdGggPDwuCitpbmxpbmUgY29uc3QgUGFydGlhbERpYWdub3N0aWMgJm9wZXJhdG9yPDwoY29uc3QgUGFydGlhbERpYWdub3N0aWMgJlBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQpIHsKKyAgUEQuQWRkVGFnZ2VkVmFsKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KFQuZ2V0QXNPcGFxdWVQdHIoKSksCisgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6YWtfcXVhbHR5cGUpOworICByZXR1cm4gUEQ7Cit9CisKKy8vIEhlbHBlciBjbGFzcyB0ZW1wbGF0ZSB0aGF0IGlzIHVzZWQgYnkgVHlwZTo6Z2V0QXMgdG8gZW5zdXJlIHRoYXQgb25lIGRvZXMKKy8vIG5vdCB0cnkgdG8gbG9vayB0aHJvdWdoIGEgcXVhbGlmaWVkIHR5cGUgdG8gZ2V0IHRvIGFuIGFycmF5IHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3VzaW5nIFR5cGVJc0FycmF5VHlwZSA9CisgICAgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBzdGQ6OmlzX3NhbWU8VCwgQXJyYXlUeXBlPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8QXJyYXlUeXBlLCBUPjo6dmFsdWU+OworCisvLyBNZW1iZXItdGVtcGxhdGUgZ2V0QXM8c3BlY2lmaWMgdHlwZT4nLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0IFQgKlR5cGU6OmdldEFzKCkgY29uc3QgeworICBzdGF0aWNfYXNzZXJ0KCFUeXBlSXNBcnJheVR5cGU8VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICJBcnJheVR5cGUgY2Fubm90IGJlIHVzZWQgd2l0aCBnZXRBcyEiKTsKKworICAvLyBJZiB0aGlzIGlzIGRpcmVjdGx5IGEgVCB0eXBlLCByZXR1cm4gaXQuCisgIGlmIChjb25zdCBhdXRvICpUeSA9IGR5bl9jYXN0PFQ+KHRoaXMpKQorICAgIHJldHVybiBUeTsKKworICAvLyBJZiB0aGUgY2Fub25pY2FsIGZvcm0gb2YgdGhpcyB0eXBlIGlzbid0IHRoZSByaWdodCBraW5kLCByZWplY3QgaXQuCisgIGlmICghaXNhPFQ+KENhbm9uaWNhbFR5cGUpKQorICAgIHJldHVybiBudWxscHRyOworCisgIC8vIElmIHRoaXMgaXMgYSB0eXBlZGVmIGZvciB0aGUgdHlwZSwgc3RyaXAgdGhlIHR5cGVkZWYgb2ZmIHdpdGhvdXQKKyAgLy8gbG9zaW5nIGFsbCB0eXBlZGVmIGluZm9ybWF0aW9uLgorICByZXR1cm4gY2FzdDxUPihnZXRVbnF1YWxpZmllZERlc3VnYXJlZFR5cGUoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjb25zdCBUICpUeXBlOjpnZXRBc0FkanVzdGVkKCkgY29uc3QgeworICBzdGF0aWNfYXNzZXJ0KCFUeXBlSXNBcnJheVR5cGU8VD46OnZhbHVlLCAiQXJyYXlUeXBlIGNhbm5vdCBiZSB1c2VkIHdpdGggZ2V0QXNBZGp1c3RlZCEiKTsKKworICAvLyBJZiB0aGlzIGlzIGRpcmVjdGx5IGEgVCB0eXBlLCByZXR1cm4gaXQuCisgIGlmIChjb25zdCBhdXRvICpUeSA9IGR5bl9jYXN0PFQ+KHRoaXMpKQorICAgIHJldHVybiBUeTsKKworICAvLyBJZiB0aGUgY2Fub25pY2FsIGZvcm0gb2YgdGhpcyB0eXBlIGlzbid0IHRoZSByaWdodCBraW5kLCByZWplY3QgaXQuCisgIGlmICghaXNhPFQ+KENhbm9uaWNhbFR5cGUpKQorICAgIHJldHVybiBudWxscHRyOworCisgIC8vIFN0cmlwIG9mZiB0eXBlIGFkanVzdG1lbnRzIHRoYXQgZG8gbm90IG1vZGlmeSB0aGUgdW5kZXJseWluZyBuYXR1cmUgb2YgdGhlCisgIC8vIHR5cGUuCisgIGNvbnN0IFR5cGUgKlR5ID0gdGhpczsKKyAgd2hpbGUgKFR5KSB7CisgICAgaWYgKGNvbnN0IGF1dG8gKkEgPSBkeW5fY2FzdDxBdHRyaWJ1dGVkVHlwZT4oVHkpKQorICAgICAgVHkgPSBBLT5nZXRNb2RpZmllZFR5cGUoKS5nZXRUeXBlUHRyKCk7CisgICAgZWxzZSBpZiAoY29uc3QgYXV0byAqRSA9IGR5bl9jYXN0PEVsYWJvcmF0ZWRUeXBlPihUeSkpCisgICAgICBUeSA9IEUtPmRlc3VnYXIoKS5nZXRUeXBlUHRyKCk7CisgICAgZWxzZSBpZiAoY29uc3QgYXV0byAqUCA9IGR5bl9jYXN0PFBhcmVuVHlwZT4oVHkpKQorICAgICAgVHkgPSBQLT5kZXN1Z2FyKCkuZ2V0VHlwZVB0cigpOworICAgIGVsc2UgaWYgKGNvbnN0IGF1dG8gKkEgPSBkeW5fY2FzdDxBZGp1c3RlZFR5cGU+KFR5KSkKKyAgICAgIFR5ID0gQS0+ZGVzdWdhcigpLmdldFR5cGVQdHIoKTsKKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorCisgIC8vIEp1c3QgYmVjYXVzZSB0aGUgY2Fub25pY2FsIHR5cGUgaXMgY29ycmVjdCBkb2VzIG5vdCBtZWFuIHdlIGNhbiB1c2UgY2FzdDw+LAorICAvLyBzaW5jZSB3ZSBtYXkgbm90IGhhdmUgc3RyaXBwZWQgb2ZmIGFsbCB0aGUgc3VnYXIgZG93biB0byB0aGUgYmFzZSB0eXBlLgorICByZXR1cm4gZHluX2Nhc3Q8VD4oVHkpOworfQorCitpbmxpbmUgY29uc3QgQXJyYXlUeXBlICpUeXBlOjpnZXRBc0FycmF5VHlwZVVuc2FmZSgpIGNvbnN0IHsKKyAgLy8gSWYgdGhpcyBpcyBkaXJlY3RseSBhbiBhcnJheSB0eXBlLCByZXR1cm4gaXQuCisgIGlmIChjb25zdCBhdXRvICphcnIgPSBkeW5fY2FzdDxBcnJheVR5cGU+KHRoaXMpKQorICAgIHJldHVybiBhcnI7CisKKyAgLy8gSWYgdGhlIGNhbm9uaWNhbCBmb3JtIG9mIHRoaXMgdHlwZSBpc24ndCB0aGUgcmlnaHQga2luZCwgcmVqZWN0IGl0LgorICBpZiAoIWlzYTxBcnJheVR5cGU+KENhbm9uaWNhbFR5cGUpKQorICAgIHJldHVybiBudWxscHRyOworCisgIC8vIElmIHRoaXMgaXMgYSB0eXBlZGVmIGZvciB0aGUgdHlwZSwgc3RyaXAgdGhlIHR5cGVkZWYgb2ZmIHdpdGhvdXQKKyAgLy8gbG9zaW5nIGFsbCB0eXBlZGVmIGluZm9ybWF0aW9uLgorICByZXR1cm4gY2FzdDxBcnJheVR5cGU+KGdldFVucXVhbGlmaWVkRGVzdWdhcmVkVHlwZSgpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0IFQgKlR5cGU6OmNhc3RBcygpIGNvbnN0IHsKKyAgc3RhdGljX2Fzc2VydCghVHlwZUlzQXJyYXlUeXBlPFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiQXJyYXlUeXBlIGNhbm5vdCBiZSB1c2VkIHdpdGggY2FzdEFzISIpOworCisgIGlmIChjb25zdCBhdXRvICp0eSA9IGR5bl9jYXN0PFQ+KHRoaXMpKSByZXR1cm4gdHk7CisgIGFzc2VydChpc2E8VD4oQ2Fub25pY2FsVHlwZSkpOworICByZXR1cm4gY2FzdDxUPihnZXRVbnF1YWxpZmllZERlc3VnYXJlZFR5cGUoKSk7Cit9CisKK2lubGluZSBjb25zdCBBcnJheVR5cGUgKlR5cGU6OmNhc3RBc0FycmF5VHlwZVVuc2FmZSgpIGNvbnN0IHsKKyAgYXNzZXJ0KGlzYTxBcnJheVR5cGU+KENhbm9uaWNhbFR5cGUpKTsKKyAgaWYgKGNvbnN0IGF1dG8gKmFyciA9IGR5bl9jYXN0PEFycmF5VHlwZT4odGhpcykpIHJldHVybiBhcnI7CisgIHJldHVybiBjYXN0PEFycmF5VHlwZT4oZ2V0VW5xdWFsaWZpZWREZXN1Z2FyZWRUeXBlKCkpOworfQorCitEZWNheWVkVHlwZTo6RGVjYXllZFR5cGUoUXVhbFR5cGUgT3JpZ2luYWxUeXBlLCBRdWFsVHlwZSBEZWNheWVkUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIENhbm9uaWNhbFB0cikKKyAgICA6IEFkanVzdGVkVHlwZShEZWNheWVkLCBPcmlnaW5hbFR5cGUsIERlY2F5ZWRQdHIsIENhbm9uaWNhbFB0cikgeworI2lmbmRlZiBOREVCVUcKKyAgUXVhbFR5cGUgQWRqdXN0ZWQgPSBnZXRBZGp1c3RlZFR5cGUoKTsKKyAgKHZvaWQpQXR0cmlidXRlZFR5cGU6OnN0cmlwT3V0ZXJOdWxsYWJpbGl0eShBZGp1c3RlZCk7CisgIGFzc2VydChpc2E8UG9pbnRlclR5cGU+KEFkanVzdGVkKSk7CisjZW5kaWYKK30KKworUXVhbFR5cGUgRGVjYXllZFR5cGU6OmdldFBvaW50ZWVUeXBlKCkgY29uc3QgeworICBRdWFsVHlwZSBEZWNheWVkID0gZ2V0RGVjYXllZFR5cGUoKTsKKyAgKHZvaWQpQXR0cmlidXRlZFR5cGU6OnN0cmlwT3V0ZXJOdWxsYWJpbGl0eShEZWNheWVkKTsKKyAgcmV0dXJuIGNhc3Q8UG9pbnRlclR5cGU+KERlY2F5ZWQpLT5nZXRQb2ludGVlVHlwZSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19BU1RfVFlQRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvVHlwZUxvYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1R5cGVMb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODA1MTYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1R5cGVMb2MuaApAQCAtMCwwICsxLDIzNjMgQEAKKy8vPT09LSBUeXBlTG9jLmggLSBUeXBlIFNvdXJjZSBJbmZvIFdyYXBwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgdGhlIGNsYW5nOjpUeXBlTG9jIGludGVyZmFjZSBhbmQgaXRzIHN1YmNsYXNzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9UWVBFTE9DX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfVFlQRUxPQ19ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9OZXN0ZWROYW1lU3BlY2lmaWVyLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1RlbXBsYXRlQmFzZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU3BlY2lmaWVycy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQVNUQ29udGV4dDsKK2NsYXNzIENYWFJlY29yZERlY2w7CitjbGFzcyBFeHByOworY2xhc3MgT2JqQ0ludGVyZmFjZURlY2w7CitjbGFzcyBPYmpDUHJvdG9jb2xEZWNsOworY2xhc3MgT2JqQ1R5cGVQYXJhbURlY2w7CitjbGFzcyBUZW1wbGF0ZVR5cGVQYXJtRGVjbDsKK2NsYXNzIFVucXVhbFR5cGVMb2M7CitjbGFzcyBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2w7CisKKy8vIFByZWRlY2xhcmUgYWxsIHRoZSB0eXBlIG5vZGVzLgorI2RlZmluZSBBQlNUUkFDVF9UWVBFTE9DKENsYXNzLCBCYXNlKQorI2RlZmluZSBUWVBFTE9DKENsYXNzLCBCYXNlKSBcCisgIGNsYXNzIENsYXNzIyNUeXBlTG9jOworI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTG9jTm9kZXMuZGVmIgorCisvLy8gXGJyaWVmIEJhc2Ugd3JhcHBlciBmb3IgYSBwYXJ0aWN1bGFyICJzZWN0aW9uIiBvZiB0eXBlIHNvdXJjZSBpbmZvLgorLy8vCisvLy8gQSBjbGllbnQgc2hvdWxkIHVzZSB0aGUgVHlwZUxvYyBzdWJjbGFzc2VzIHRocm91Z2ggY2FzdEFzKCkvZ2V0QXMoKQorLy8vIGluIG9yZGVyIHRvIGdldCBhdCB0aGUgYWN0dWFsIGluZm9ybWF0aW9uLgorY2xhc3MgVHlwZUxvYyB7Citwcm90ZWN0ZWQ6CisgIC8vIFRoZSBjb3JyZWN0bmVzcyBvZiB0aGlzIHJlbGllcyBvbiB0aGUgcHJvcGVydHkgdGhhdCwgZm9yIFR5cGUgKlR5LAorICAvLyAgIFF1YWxUeXBlKFR5LCAwKS5nZXRBc09wYXF1ZVB0cigpID09ICh2b2lkKikgVHkKKyAgY29uc3Qgdm9pZCAqVHkgPSBudWxscHRyOworICB2b2lkICpEYXRhID0gbnVsbHB0cjsKKworcHVibGljOgorICBUeXBlTG9jKCkgPSBkZWZhdWx0OworICBUeXBlTG9jKFF1YWxUeXBlIHR5LCB2b2lkICpvcGFxdWVEYXRhKQorICAgICAgOiBUeSh0eS5nZXRBc09wYXF1ZVB0cigpKSwgRGF0YShvcGFxdWVEYXRhKSB7fQorICBUeXBlTG9jKGNvbnN0IFR5cGUgKnR5LCB2b2lkICpvcGFxdWVEYXRhKQorICAgICAgOiBUeSh0eSksIERhdGEob3BhcXVlRGF0YSkge30KKworICAvLy8gXGJyaWVmIENvbnZlcnQgdG8gdGhlIHNwZWNpZmllZCBUeXBlTG9jIHR5cGUsIGFzc2VydGluZyB0aGF0IHRoaXMgVHlwZUxvYworICAvLy8gaXMgb2YgdGhlIGRlc2lyZWQgdHlwZS4KKyAgLy8vCisgIC8vLyBccHJlIFQ6OmlzS2luZCgqdGhpcykKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgVCBjYXN0QXMoKSBjb25zdCB7CisgICAgYXNzZXJ0KFQ6OmlzS2luZCgqdGhpcykpOworICAgIFQgdDsKKyAgICBUeXBlTG9jJiB0bCA9IHQ7CisgICAgdGwgPSAqdGhpczsKKyAgICByZXR1cm4gdDsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29udmVydCB0byB0aGUgc3BlY2lmaWVkIFR5cGVMb2MgdHlwZSwgcmV0dXJuaW5nIGEgbnVsbCBUeXBlTG9jIGlmCisgIC8vLyB0aGlzIFR5cGVMb2MgaXMgbm90IG9mIHRoZSBkZXNpcmVkIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIFQgZ2V0QXMoKSBjb25zdCB7CisgICAgaWYgKCFUOjppc0tpbmQoKnRoaXMpKQorICAgICAgcmV0dXJuIFQoKTsKKyAgICBUIHQ7CisgICAgVHlwZUxvYyYgdGwgPSB0OworICAgIHRsID0gKnRoaXM7CisgICAgcmV0dXJuIHQ7CisgIH0KKworICAvLy8gXGJyaWVmIENvbnZlcnQgdG8gdGhlIHNwZWNpZmllZCBUeXBlTG9jIHR5cGUsIHJldHVybmluZyBhIG51bGwgVHlwZUxvYyBpZgorICAvLy8gdGhpcyBUeXBlTG9jayBpcyBub3Qgb2YgdGhlIGRlc2lyZWQgdHlwZS4gSXQgd2lsbCBjb25zaWRlciB0eXBlCisgIC8vLyBhZGp1c3RtZW50cyBmcm9tIGEgdHlwZSB0aGF0IHdhZCB3cml0dGVuIGFzIGEgVCB0byBhbm90aGVyIHR5cGUgdGhhdCBpcworICAvLy8gc3RpbGwgY2Fub25pY2FsbHkgYSBUIChpZ25vcmVzIHBhcmVucywgYXR0cmlidXRlcywgZWxhYm9yYXRlZCB0eXBlcywgZXRjKS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFQgZ2V0QXNBZGp1c3RlZCgpIGNvbnN0OworCisgIC8vLyBUaGUga2luZHMgb2YgVHlwZUxvY3MuICBFcXVpdmFsZW50IHRvIHRoZSBUeXBlOjpUeXBlQ2xhc3MgZW51bSwKKyAgLy8vIGV4Y2VwdCBpdCBhbHNvIGRlZmluZXMgYSBRdWFsaWZpZWQgZW51bSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQorICAvLy8gUXVhbGlmaWVkTG9jIGNsYXNzLgorICBlbnVtIFR5cGVMb2NDbGFzcyB7CisjZGVmaW5lIEFCU1RSQUNUX1RZUEUoQ2xhc3MsIEJhc2UpCisjZGVmaW5lIFRZUEUoQ2xhc3MsIEJhc2UpIFwKKyAgICBDbGFzcyA9IFR5cGU6OkNsYXNzLAorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTm9kZXMuZGVmIgorICAgIFF1YWxpZmllZAorICB9OworCisgIFR5cGVMb2NDbGFzcyBnZXRUeXBlTG9jQ2xhc3MoKSBjb25zdCB7CisgICAgaWYgKGdldFR5cGUoKS5oYXNMb2NhbFF1YWxpZmllcnMoKSkgcmV0dXJuIFF1YWxpZmllZDsKKyAgICByZXR1cm4gKFR5cGVMb2NDbGFzcykgZ2V0VHlwZSgpLT5nZXRUeXBlQ2xhc3MoKTsKKyAgfQorCisgIGJvb2wgaXNOdWxsKCkgY29uc3QgeyByZXR1cm4gIVR5OyB9CisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBUeTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgc2l6ZSBvZiB0eXBlIHNvdXJjZSBpbmZvIGRhdGEgYmxvY2sgZm9yIHRoZSBnaXZlbiB0eXBlLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0RnVsbERhdGFTaXplRm9yVHlwZShRdWFsVHlwZSBUeSk7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBhbGlnbm1lbnQgb2YgdHlwZSBzb3VyY2UgaW5mbyBkYXRhIGJsb2NrIGZvcgorICAvLy8gdGhlIGdpdmVuIHR5cGUuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRMb2NhbEFsaWdubWVudEZvclR5cGUoUXVhbFR5cGUgVHkpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSB0eXBlIGZvciB3aGljaCB0aGlzIHNvdXJjZSBpbmZvIHdyYXBwZXIgcHJvdmlkZXMKKyAgLy8vIGluZm9ybWF0aW9uLgorICBRdWFsVHlwZSBnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBRdWFsVHlwZTo6Z2V0RnJvbU9wYXF1ZVB0cihUeSk7CisgIH0KKworICBjb25zdCBUeXBlICpnZXRUeXBlUHRyKCkgY29uc3QgeworICAgIHJldHVybiBRdWFsVHlwZTo6Z2V0RnJvbU9wYXF1ZVB0cihUeSkuZ2V0VHlwZVB0cigpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHBvaW50ZXIgd2hlcmUgc291cmNlIGluZm9ybWF0aW9uIGlzIHN0b3JlZC4KKyAgdm9pZCAqZ2V0T3BhcXVlRGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRGF0YTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBiZWdpbiBzb3VyY2UgbG9jYXRpb24uCisgIFNvdXJjZUxvY2F0aW9uIGdldEJlZ2luTG9jKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGVuZCBzb3VyY2UgbG9jYXRpb24uCisgIFNvdXJjZUxvY2F0aW9uIGdldEVuZExvYygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBmdWxsIHNvdXJjZSByYW5nZS4KKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0QmVnaW5Mb2MoKSwgZ2V0RW5kTG9jKCkpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIGdldEJlZ2luTG9jKCk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBnZXRFbmRMb2MoKTsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBsb2NhbCBzb3VyY2UgcmFuZ2UuCisgIFNvdXJjZVJhbmdlIGdldExvY2FsU291cmNlUmFuZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExvY2FsU291cmNlUmFuZ2VJbXBsKCp0aGlzKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgdHlwZSBzb3VyY2UgaW5mbyBkYXRhIGJsb2NrLgorICB1bnNpZ25lZCBnZXRGdWxsRGF0YVNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEZ1bGxEYXRhU2l6ZUZvclR5cGUoZ2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBuZXh0IFR5cGVMb2MgcG9pbnRlZCBieSB0aGlzIFR5cGVMb2MsIGUuZyBmb3IgImludCoiIHRoZQorICAvLy8gVHlwZUxvYyBpcyBhIFBvaW50ZXJMb2MgYW5kIG5leHQgVHlwZUxvYyBpcyBmb3IgImludCIuCisgIFR5cGVMb2MgZ2V0TmV4dFR5cGVMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE5leHRUeXBlTG9jSW1wbCgqdGhpcyk7CisgIH0KKworICAvLy8gXGJyaWVmIFNraXBzIHBhc3QgYW55IHF1YWxpZmllcnMsIGlmIHRoaXMgaXMgcXVhbGlmaWVkLgorICBVbnF1YWxUeXBlTG9jIGdldFVucXVhbGlmaWVkTG9jKCkgY29uc3Q7IC8vIGltcGxlbWVudGVkIGluIHRoaXMgaGVhZGVyCisKKyAgVHlwZUxvYyBJZ25vcmVQYXJlbnMoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEZpbmQgYSB0eXBlIHdpdGggdGhlIGxvY2F0aW9uIG9mIGFuIGV4cGxpY2l0IHR5cGUgcXVhbGlmaWVyLgorICAvLy8KKyAgLy8vIFRoZSByZXN1bHQsIGlmIG5vbi1udWxsLCB3aWxsIGJlIG9uZSBvZjoKKyAgLy8vICAgUXVhbGlmaWVkVHlwZUxvYworICAvLy8gICBBdG9taWNUeXBlTG9jCisgIC8vLyAgIEF0dHJpYnV0ZWRUeXBlTG9jLCBmb3IgdGhvc2UgdHlwZSBhdHRyaWJ1dGVzIHRoYXQgYmVoYXZlIGFzIHF1YWxpZmllcnMKKyAgVHlwZUxvYyBmaW5kRXhwbGljaXRRdWFsaWZpZXJMb2MoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEluaXRpYWxpemVzIHRoaXMgdG8gc3RhdGUgdGhhdCBldmVyeSBsb2NhdGlvbiBpbiB0aGlzCisgIC8vLyB0eXBlIGlzIHRoZSBnaXZlbiBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBleGlzdHMgdG8gcHJvdmlkZSBhIHNpbXBsZSB0cmFuc2l0aW9uIGZvciBjb2RlIHRoYXQKKyAgLy8vIHJlbGllcyBvbiBsb2NhdGlvbi1sZXNzIHR5cGVzLgorICB2b2lkIGluaXRpYWxpemUoQVNUQ29udGV4dCAmQ29udGV4dCwgU291cmNlTG9jYXRpb24gTG9jKSBjb25zdCB7CisgICAgaW5pdGlhbGl6ZUltcGwoQ29udGV4dCwgKnRoaXMsIExvYyk7CisgIH0KKworICAvLy8gXGJyaWVmIEluaXRpYWxpemVzIHRoaXMgYnkgY29weWluZyBpdHMgaW5mb3JtYXRpb24gZnJvbSBhbm90aGVyCisgIC8vLyBUeXBlTG9jIG9mIHRoZSBzYW1lIHR5cGUuCisgIHZvaWQgaW5pdGlhbGl6ZUZ1bGxDb3B5KFR5cGVMb2MgT3RoZXIpIHsKKyAgICBhc3NlcnQoZ2V0VHlwZSgpID09IE90aGVyLmdldFR5cGUoKSk7CisgICAgY29weShPdGhlcik7CisgIH0KKworICAvLy8gXGJyaWVmIEluaXRpYWxpemVzIHRoaXMgYnkgY29weWluZyBpdHMgaW5mb3JtYXRpb24gZnJvbSBhbm90aGVyCisgIC8vLyBUeXBlTG9jIG9mIHRoZSBzYW1lIHR5cGUuICBUaGUgZ2l2ZW4gc2l6ZSBtdXN0IGJlIHRoZSBmdWxsIGRhdGEKKyAgLy8vIHNpemUuCisgIHZvaWQgaW5pdGlhbGl6ZUZ1bGxDb3B5KFR5cGVMb2MgT3RoZXIsIHVuc2lnbmVkIFNpemUpIHsKKyAgICBhc3NlcnQoZ2V0VHlwZSgpID09IE90aGVyLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0KGdldEZ1bGxEYXRhU2l6ZSgpID09IFNpemUpOworICAgIGNvcHkoT3RoZXIpOworICB9CisKKyAgLy8vIENvcGllcyB0aGUgb3RoZXIgdHlwZSBsb2MgaW50byB0aGlzIG9uZS4KKyAgdm9pZCBjb3B5KFR5cGVMb2Mgb3RoZXIpOworCisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgVHlwZUxvYyAmTEhTLCBjb25zdCBUeXBlTG9jICZSSFMpIHsKKyAgICByZXR1cm4gTEhTLlR5ID09IFJIUy5UeSAmJiBMSFMuRGF0YSA9PSBSSFMuRGF0YTsKKyAgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgVHlwZUxvYyAmTEhTLCBjb25zdCBUeXBlTG9jICZSSFMpIHsKKyAgICByZXR1cm4gIShMSFMgPT0gUkhTKTsKKyAgfQorCisgIC8vLyBGaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgbnVsbGFiaWxpdHkgc3BlY2lmaWVyIChfX25vbm51bGwsCisgIC8vLyBfX251bGxhYmxlLCBvciBfX251bGxfdW5zcGVjaWZpZXIpLCBpZiB0aGVyZSBpcyBvbmUuCisgIFNvdXJjZUxvY2F0aW9uIGZpbmROdWxsYWJpbGl0eUxvYygpIGNvbnN0OworCitwcml2YXRlOgorICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgVHlwZUxvYyYpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIGluaXRpYWxpemVJbXBsKEFTVENvbnRleHQgJkNvbnRleHQsIFR5cGVMb2MgVEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYyk7CisgIHN0YXRpYyBUeXBlTG9jIGdldE5leHRUeXBlTG9jSW1wbChUeXBlTG9jIFRMKTsKKyAgc3RhdGljIFR5cGVMb2MgSWdub3JlUGFyZW5zSW1wbChUeXBlTG9jIFRMKTsKKyAgc3RhdGljIFNvdXJjZVJhbmdlIGdldExvY2FsU291cmNlUmFuZ2VJbXBsKFR5cGVMb2MgVEwpOworfTsKKworLy8vIFxicmllZiBSZXR1cm4gdGhlIFR5cGVMb2MgZm9yIGEgdHlwZSBzb3VyY2UgaW5mby4KK2lubGluZSBUeXBlTG9jIFR5cGVTb3VyY2VJbmZvOjpnZXRUeXBlTG9jKCkgY29uc3QgeworICAvLyBUT0RPOiBpcyB0aGlzIGFsaWdubWVudCBhbHJlYWR5IHN1ZmZpY2llbnQ/CisgIHJldHVybiBUeXBlTG9jKFR5LCBjb25zdF9jYXN0PHZvaWQqPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4odGhpcyArIDEpKSk7Cit9CisKKy8vLyBcYnJpZWYgV3JhcHBlciBvZiB0eXBlIHNvdXJjZSBpbmZvcm1hdGlvbiBmb3IgYSB0eXBlIHdpdGgKKy8vLyBubyBkaXJlY3QgcXVhbGlmaWVycy4KK2NsYXNzIFVucXVhbFR5cGVMb2MgOiBwdWJsaWMgVHlwZUxvYyB7CitwdWJsaWM6CisgIFVucXVhbFR5cGVMb2MoKSA9IGRlZmF1bHQ7CisgIFVucXVhbFR5cGVMb2MoY29uc3QgVHlwZSAqVHksIHZvaWQgKkRhdGEpIDogVHlwZUxvYyhUeSwgRGF0YSkge30KKworICBjb25zdCBUeXBlICpnZXRUeXBlUHRyKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFR5cGUqPihUeSk7CisgIH0KKworICBUeXBlTG9jQ2xhc3MgZ2V0VHlwZUxvY0NsYXNzKCkgY29uc3QgeworICAgIHJldHVybiAoVHlwZUxvY0NsYXNzKSBnZXRUeXBlUHRyKCktPmdldFR5cGVDbGFzcygpOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBUeXBlTG9jOworCisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBUeXBlTG9jICZUTCkgeworICAgIHJldHVybiAhVEwuZ2V0VHlwZSgpLmhhc0xvY2FsUXVhbGlmaWVycygpOworICB9Cit9OworCisvLy8gXGJyaWVmIFdyYXBwZXIgb2YgdHlwZSBzb3VyY2UgaW5mb3JtYXRpb24gZm9yIGEgdHlwZSB3aXRoCisvLy8gbm9uLXRyaXZpYWwgZGlyZWN0IHF1YWxpZmllcnMuCisvLy8KKy8vLyBDdXJyZW50bHksIHdlIGludGVudGlvbmFsbHkgZG8gbm90IHByb3ZpZGUgc291cmNlIGxvY2F0aW9uIGZvcgorLy8vIHR5cGUgcXVhbGlmaWVycy4KK2NsYXNzIFF1YWxpZmllZFR5cGVMb2MgOiBwdWJsaWMgVHlwZUxvYyB7CitwdWJsaWM6CisgIFNvdXJjZVJhbmdlIGdldExvY2FsU291cmNlUmFuZ2UoKSBjb25zdCB7IHJldHVybiB7fTsgfQorCisgIFVucXVhbFR5cGVMb2MgZ2V0VW5xdWFsaWZpZWRMb2MoKSBjb25zdCB7CisgICAgdW5zaWduZWQgYWxpZ24gPQorICAgICAgICBUeXBlTG9jOjpnZXRMb2NhbEFsaWdubWVudEZvclR5cGUoUXVhbFR5cGUoZ2V0VHlwZVB0cigpLCAwKSk7CisgICAgdWludHB0cl90IGRhdGFJbnQgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oRGF0YSk7CisgICAgZGF0YUludCA9IGxsdm06OmFsaWduVG8oZGF0YUludCwgYWxpZ24pOworICAgIHJldHVybiBVbnF1YWxUeXBlTG9jKGdldFR5cGVQdHIoKSwgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oZGF0YUludCkpOworICB9CisKKyAgLy8vIEluaXRpYWxpemVzIHRoZSBsb2NhbCBkYXRhIG9mIHRoaXMgdHlwZSBzb3VyY2UgaW5mbyBibG9jayB0bworICAvLy8gcHJvdmlkZSBubyBpbmZvcm1hdGlvbi4KKyAgdm9pZCBpbml0aWFsaXplTG9jYWwoQVNUQ29udGV4dCAmQ29udGV4dCwgU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgLy8gZG8gbm90aGluZworICB9CisKKyAgdm9pZCBjb3B5TG9jYWwoVHlwZUxvYyBvdGhlcikgeworICAgIC8vIGRvIG5vdGhpbmcKKyAgfQorCisgIFR5cGVMb2MgZ2V0TmV4dFR5cGVMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFVucXVhbGlmaWVkTG9jKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHR5cGUgc291cmNlIGluZm8gZGF0YSBibG9jayB0aGF0IGlzCisgIC8vLyBzcGVjaWZpYyB0byB0aGlzIHR5cGUuCisgIHVuc2lnbmVkIGdldExvY2FsRGF0YVNpemUoKSBjb25zdCB7CisgICAgLy8gSW4gZmFjdCwgd2UgZG9uJ3QgY3VycmVudGx5IHByZXNlcnZlIGFueSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorICAgIC8vIGZvciBxdWFsaWZpZXJzLgorICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBhbGlnbm1lbnQgb2YgdGhlIHR5cGUgc291cmNlIGluZm8gZGF0YSBibG9jayB0aGF0IGlzCisgIC8vLyBzcGVjaWZpYyB0byB0aGlzIHR5cGUuCisgIHVuc2lnbmVkIGdldExvY2FsRGF0YUFsaWdubWVudCgpIGNvbnN0IHsKKyAgICAvLyBXZSBkb24ndCBwcmVzZXJ2ZSBhbnkgbG9jYXRpb24gaW5mb3JtYXRpb24uCisgICAgcmV0dXJuIDE7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFR5cGVMb2M7CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IFR5cGVMb2MgJlRMKSB7CisgICAgcmV0dXJuIFRMLmdldFR5cGUoKS5oYXNMb2NhbFF1YWxpZmllcnMoKTsKKyAgfQorfTsKKworaW5saW5lIFVucXVhbFR5cGVMb2MgVHlwZUxvYzo6Z2V0VW5xdWFsaWZpZWRMb2MoKSBjb25zdCB7CisgIGlmIChRdWFsaWZpZWRUeXBlTG9jIExvYyA9IGdldEFzPFF1YWxpZmllZFR5cGVMb2M+KCkpCisgICAgcmV0dXJuIExvYy5nZXRVbnF1YWxpZmllZExvYygpOworICByZXR1cm4gY2FzdEFzPFVucXVhbFR5cGVMb2M+KCk7Cit9CisKKy8vLyBBIG1ldGFwcm9ncmFtbWluZyBiYXNlIGNsYXNzIGZvciBUeXBlTG9jIGNsYXNzZXMgd2hpY2ggY29ycmVzcG9uZAorLy8vIHRvIGEgcGFydGljdWxhciBUeXBlIHN1YmNsYXNzLiAgSXQgaXMgYWNjZXB0ZWQgZm9yIGEgc2luZ2xlCisvLy8gVHlwZUxvYyBjbGFzcyB0byBjb3JyZXNwb25kIHRvIG11bHRpcGxlIFR5cGUgY2xhc3Nlcy4KKy8vLworLy8vIFx0cGFyYW0gQmFzZSBhIGNsYXNzIGZyb20gd2hpY2ggdG8gZGVyaXZlCisvLy8gXHRwYXJhbSBEZXJpdmVkIHRoZSBjbGFzcyBkZXJpdmluZyBmcm9tIHRoaXMgb25lCisvLy8gXHRwYXJhbSBUeXBlQ2xhc3MgdGhlIGNvbmNyZXRlIFR5cGUgc3ViY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKy8vLyAgIGxvY2F0aW9uIHR5cGUKKy8vLyBcdHBhcmFtIExvY2FsRGF0YSB0aGUgc3RydWN0dXJlIHR5cGUgb2YgbG9jYWwgbG9jYXRpb24gZGF0YSBmb3IKKy8vLyAgIHRoaXMgdHlwZQorLy8vCisvLy8gVHlwZUxvY3Mgd2l0aCBub24tY29uc3RhbnQgYW1vdW50cyBvZiBsb2NhbCBkYXRhIHNob3VsZCBvdmVycmlkZQorLy8vIGdldEV4dHJhTG9jYWxEYXRhU2l6ZSgpOyBnZXRFeHRyYUxvY2FsRGF0YSgpIHdpbGwgdGhlbiBwb2ludCB0bworLy8vIHRoaXMgZXh0cmEgbWVtb3J5LgorLy8vCisvLy8gVHlwZUxvY3Mgd2l0aCBhbiBpbm5lciB0eXBlIHNob3VsZCBkZWZpbmUKKy8vLyAgIFF1YWxUeXBlIGdldElubmVyVHlwZSgpIGNvbnN0CisvLy8gYW5kIGdldElubmVyVHlwZUxvYygpIHdpbGwgdGhlbiBwb2ludCB0byB0aGlzIGlubmVyIHR5cGUncworLy8vIGxvY2F0aW9uIGRhdGEuCisvLy8KKy8vLyBBIHdvcmQgYWJvdXQgaGllcmFyY2hpZXM6IHRoaXMgdGVtcGxhdGUgaXMgbm90IGRlc2lnbmVkIHRvIGJlCisvLy8gZGVyaXZlZCBmcm9tIG11bHRpcGxlIHRpbWVzIGluIGEgaGllcmFyY2h5LiAgSXQgaXMgYWxzbyBub3QKKy8vLyBkZXNpZ25lZCB0byBiZSB1c2VkIGZvciBjbGFzc2VzIHdoZXJlIHN1YnR5cGVzIG1pZ2h0IHByb3ZpZGUKKy8vLyBkaWZmZXJlbnQgYW1vdW50cyBvZiBzb3VyY2UgaW5mb3JtYXRpb24uICBJdCBzaG91bGQgYmUgc3ViY2xhc3NlZAorLy8vIG9ubHkgYXQgdGhlIGRlZXBlc3QgcG9ydGlvbiBvZiB0aGUgaGllcmFyY2h5IHdoZXJlIGFsbCBjaGlsZHJlbgorLy8vIGhhdmUgaWRlbnRpY2FsIHNvdXJjZSBpbmZvcm1hdGlvbjsgaWYgdGhhdCdzIGFuIGFic3RyYWN0IHR5cGUsCisvLy8gdGhlbiBmdXJ0aGVyIGRlc2NlbmRlbnRzIHNob3VsZCBpbmhlcml0IGZyb20KKy8vLyBJbmhlcml0aW5nQ29uY3JldGVUeXBlTG9jIGluc3RlYWQuCit0ZW1wbGF0ZSA8Y2xhc3MgQmFzZSwgY2xhc3MgRGVyaXZlZCwgY2xhc3MgVHlwZUNsYXNzLCBjbGFzcyBMb2NhbERhdGE+CitjbGFzcyBDb25jcmV0ZVR5cGVMb2MgOiBwdWJsaWMgQmFzZSB7CisgIGZyaWVuZCBjbGFzcyBUeXBlTG9jOworCisgIGNvbnN0IERlcml2ZWQgKmFzRGVyaXZlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZCo+KHRoaXMpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IFR5cGVMb2MgJlRMKSB7CisgICAgcmV0dXJuICFUTC5nZXRUeXBlKCkuaGFzTG9jYWxRdWFsaWZpZXJzKCkgJiYKKyAgICAgICAgICAgRGVyaXZlZDo6Y2xhc3NvZlR5cGUoVEwuZ2V0VHlwZVB0cigpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2ZUeXBlKGNvbnN0IFR5cGUgKlR5KSB7CisgICAgcmV0dXJuIFR5cGVDbGFzczo6Y2xhc3NvZihUeSk7CisgIH0KKworcHVibGljOgorICB1bnNpZ25lZCBnZXRMb2NhbERhdGFBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6bWF4KHVuc2lnbmVkKGFsaWdub2YoTG9jYWxEYXRhKSksCisgICAgICAgICAgICAgICAgICAgIGFzRGVyaXZlZCgpLT5nZXRFeHRyYUxvY2FsRGF0YUFsaWdubWVudCgpKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldExvY2FsRGF0YVNpemUoKSBjb25zdCB7CisgICAgdW5zaWduZWQgc2l6ZSA9IHNpemVvZihMb2NhbERhdGEpOworICAgIHVuc2lnbmVkIGV4dHJhQWxpZ24gPSBhc0Rlcml2ZWQoKS0+Z2V0RXh0cmFMb2NhbERhdGFBbGlnbm1lbnQoKTsKKyAgICBzaXplID0gbGx2bTo6YWxpZ25UbyhzaXplLCBleHRyYUFsaWduKTsKKyAgICBzaXplICs9IGFzRGVyaXZlZCgpLT5nZXRFeHRyYUxvY2FsRGF0YVNpemUoKTsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorCisgIHZvaWQgY29weUxvY2FsKERlcml2ZWQgb3RoZXIpIHsKKyAgICAvLyBTb21lIHN1YmNsYXNzZXMgaGF2ZSBubyBkYXRhIHRvIGNvcHkuCisgICAgaWYgKGFzRGVyaXZlZCgpLT5nZXRMb2NhbERhdGFTaXplKCkgPT0gMCkgcmV0dXJuOworCisgICAgLy8gQ29weSB0aGUgZml4ZWQtc2l6ZWQgbG9jYWwgZGF0YS4KKyAgICBtZW1jcHkoZ2V0TG9jYWxEYXRhKCksIG90aGVyLmdldExvY2FsRGF0YSgpLCBzaXplb2YoTG9jYWxEYXRhKSk7CisKKyAgICAvLyBDb3B5IHRoZSB2YXJpYWJsZS1zaXplZCBsb2NhbCBkYXRhLiBXZSBuZWVkIHRvIGRvIHRoaXMKKyAgICAvLyBzZXBhcmF0ZWx5IGJlY2F1c2UgdGhlIHBhZGRpbmcgaW4gdGhlIHNvdXJjZSBhbmQgdGhlIHBhZGRpbmcgaW4KKyAgICAvLyB0aGUgZGVzdGluYXRpb24gbWlnaHQgYmUgZGlmZmVyZW50LgorICAgIG1lbWNweShnZXRFeHRyYUxvY2FsRGF0YSgpLCBvdGhlci5nZXRFeHRyYUxvY2FsRGF0YSgpLAorICAgICAgICAgICBhc0Rlcml2ZWQoKS0+Z2V0RXh0cmFMb2NhbERhdGFTaXplKCkpOworICB9CisKKyAgVHlwZUxvYyBnZXROZXh0VHlwZUxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TmV4dFR5cGVMb2MoYXNEZXJpdmVkKCktPmdldElubmVyVHlwZSgpKTsKKyAgfQorCisgIGNvbnN0IFR5cGVDbGFzcyAqZ2V0VHlwZVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxUeXBlQ2xhc3M+KEJhc2U6OmdldFR5cGVQdHIoKSk7CisgIH0KKworcHJvdGVjdGVkOgorICB1bnNpZ25lZCBnZXRFeHRyYUxvY2FsRGF0YVNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1bnNpZ25lZCBnZXRFeHRyYUxvY2FsRGF0YUFsaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIExvY2FsRGF0YSAqZ2V0TG9jYWxEYXRhKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxMb2NhbERhdGEqPihCYXNlOjpEYXRhKTsKKyAgfQorCisgIC8vLyBHZXRzIGEgcG9pbnRlciBwYXN0IHRoZSBJbmZvIHN0cnVjdHVyZTsgdXNlZnVsIGZvciBjbGFzc2VzIHdpdGgKKyAgLy8vIGxvY2FsIGRhdGEgdGhhdCBjYW4ndCBiZSBjYXB0dXJlZCBpbiB0aGUgSW5mbyAoZS5nLiBiZWNhdXNlIGl0J3MKKyAgLy8vIG9mIHZhcmlhYmxlIHNpemUpLgorICB2b2lkICpnZXRFeHRyYUxvY2FsRGF0YSgpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBzaXplID0gc2l6ZW9mKExvY2FsRGF0YSk7CisgICAgdW5zaWduZWQgZXh0cmFBbGlnbiA9IGFzRGVyaXZlZCgpLT5nZXRFeHRyYUxvY2FsRGF0YUFsaWdubWVudCgpOworICAgIHNpemUgPSBsbHZtOjphbGlnblRvKHNpemUsIGV4dHJhQWxpZ24pOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNoYXIqPihCYXNlOjpEYXRhKSArIHNpemU7CisgIH0KKworICB2b2lkICpnZXROb25Mb2NhbERhdGEoKSBjb25zdCB7CisgICAgdWludHB0cl90IGRhdGEgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oQmFzZTo6RGF0YSk7CisgICAgZGF0YSArPSBhc0Rlcml2ZWQoKS0+Z2V0TG9jYWxEYXRhU2l6ZSgpOworICAgIGRhdGEgPSBsbHZtOjphbGlnblRvKGRhdGEsIGdldE5leHRUeXBlQWxpZ24oKSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGRhdGEpOworICB9CisKKyAgc3RydWN0IEhhc05vSW5uZXJUeXBlIHt9OworICBIYXNOb0lubmVyVHlwZSBnZXRJbm5lclR5cGUoKSBjb25zdCB7IHJldHVybiBIYXNOb0lubmVyVHlwZSgpOyB9CisKKyAgVHlwZUxvYyBnZXRJbm5lclR5cGVMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIFR5cGVMb2MoYXNEZXJpdmVkKCktPmdldElubmVyVHlwZSgpLCBnZXROb25Mb2NhbERhdGEoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgdW5zaWduZWQgZ2V0SW5uZXJUeXBlU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW5uZXJUeXBlU2l6ZShhc0Rlcml2ZWQoKS0+Z2V0SW5uZXJUeXBlKCkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0SW5uZXJUeXBlU2l6ZShIYXNOb0lubmVyVHlwZSBfKSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1bnNpZ25lZCBnZXRJbm5lclR5cGVTaXplKFF1YWxUeXBlIF8pIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW5uZXJUeXBlTG9jKCkuZ2V0RnVsbERhdGFTaXplKCk7CisgIH0KKworICB1bnNpZ25lZCBnZXROZXh0VHlwZUFsaWduKCkgY29uc3QgeworICAgIHJldHVybiBnZXROZXh0VHlwZUFsaWduKGFzRGVyaXZlZCgpLT5nZXRJbm5lclR5cGUoKSk7CisgIH0KKworICB1bnNpZ25lZCBnZXROZXh0VHlwZUFsaWduKEhhc05vSW5uZXJUeXBlIF8pIGNvbnN0IHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE5leHRUeXBlQWxpZ24oUXVhbFR5cGUgVCkgY29uc3QgeworICAgIHJldHVybiBUeXBlTG9jOjpnZXRMb2NhbEFsaWdubWVudEZvclR5cGUoVCk7CisgIH0KKworICBUeXBlTG9jIGdldE5leHRUeXBlTG9jKEhhc05vSW5uZXJUeXBlIF8pIGNvbnN0IHsgcmV0dXJuIHt9OyB9CisKKyAgVHlwZUxvYyBnZXROZXh0VHlwZUxvYyhRdWFsVHlwZSBUKSBjb25zdCB7CisgICAgcmV0dXJuIFR5cGVMb2MoVCwgZ2V0Tm9uTG9jYWxEYXRhKCkpOworICB9Cit9OworCisvLy8gQSBtZXRhcHJvZ3JhbW1pbmcgY2xhc3MgZGVzaWduZWQgZm9yIGNvbmNyZXRlIHN1YnR5cGVzIG9mIGFic3RyYWN0CisvLy8gdHlwZXMgd2hlcmUgYWxsIHN1YnR5cGVzIHNoYXJlIGVxdWl2YWxlbnRseS1zdHJ1Y3R1cmVkIHNvdXJjZQorLy8vIGluZm9ybWF0aW9uLiAgU2VlIHRoZSBub3RlIG9uIENvbmNyZXRlVHlwZUxvYy4KK3RlbXBsYXRlIDxjbGFzcyBCYXNlLCBjbGFzcyBEZXJpdmVkLCBjbGFzcyBUeXBlQ2xhc3M+CitjbGFzcyBJbmhlcml0aW5nQ29uY3JldGVUeXBlTG9jIDogcHVibGljIEJhc2UgeworICBmcmllbmQgY2xhc3MgVHlwZUxvYzsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mVHlwZShjb25zdCBUeXBlICpUeSkgeworICAgIHJldHVybiBUeXBlQ2xhc3M6OmNsYXNzb2YoVHkpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IFR5cGVMb2MgJlRMKSB7CisgICAgcmV0dXJuICFUTC5nZXRUeXBlKCkuaGFzTG9jYWxRdWFsaWZpZXJzKCkgJiYKKyAgICAgICAgICAgRGVyaXZlZDo6Y2xhc3NvZlR5cGUoVEwuZ2V0VHlwZVB0cigpKTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgVW5xdWFsVHlwZUxvYyAmVEwpIHsKKyAgICByZXR1cm4gRGVyaXZlZDo6Y2xhc3NvZlR5cGUoVEwuZ2V0VHlwZVB0cigpKTsKKyAgfQorCitwdWJsaWM6CisgIGNvbnN0IFR5cGVDbGFzcyAqZ2V0VHlwZVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxUeXBlQ2xhc3M+KEJhc2U6OmdldFR5cGVQdHIoKSk7CisgIH0KK307CisKK3N0cnVjdCBUeXBlU3BlY0xvY0luZm8geworICBTb3VyY2VMb2NhdGlvbiBOYW1lTG9jOworfTsKKworLy8vIFxicmllZiBBIHJlYXNvbmFibGUgYmFzZSBjbGFzcyBmb3IgVHlwZUxvY3MgdGhhdCBjb3JyZXNwb25kIHRvCisvLy8gdHlwZXMgdGhhdCBhcmUgd3JpdHRlbiBhcyBhIHR5cGUtc3BlY2lmaWVyLgorY2xhc3MgVHlwZVNwZWNUeXBlTG9jIDogcHVibGljIENvbmNyZXRlVHlwZUxvYzxVbnF1YWxUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU3BlY1R5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTcGVjTG9jSW5mbz4geworcHVibGljOgorICBlbnVtIHsKKyAgICBMb2NhbERhdGFTaXplID0gc2l6ZW9mKFR5cGVTcGVjTG9jSW5mbyksCisgICAgTG9jYWxEYXRhQWxpZ25tZW50ID0gYWxpZ25vZihUeXBlU3BlY0xvY0luZm8pCisgIH07CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TmFtZUxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+Z2V0TG9jYWxEYXRhKCktPk5hbWVMb2M7CisgIH0KKworICB2b2lkIHNldE5hbWVMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgdGhpcy0+Z2V0TG9jYWxEYXRhKCktPk5hbWVMb2MgPSBMb2M7CisgIH0KKworICBTb3VyY2VSYW5nZSBnZXRMb2NhbFNvdXJjZVJhbmdlKCkgY29uc3QgeworICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXROYW1lTG9jKCksIGdldE5hbWVMb2MoKSk7CisgIH0KKworICB2b2lkIGluaXRpYWxpemVMb2NhbChBU1RDb250ZXh0ICZDb250ZXh0LCBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBzZXROYW1lTG9jKExvYyk7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFR5cGVMb2M7CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IFR5cGVMb2MgJlRMKTsKK307CisKK3N0cnVjdCBCdWlsdGluTG9jSW5mbyB7CisgIFNvdXJjZVJhbmdlIEJ1aWx0aW5SYW5nZTsKK307CisKKy8vLyBcYnJpZWYgV3JhcHBlciBmb3Igc291cmNlIGluZm8gZm9yIGJ1aWx0aW4gdHlwZXMuCitjbGFzcyBCdWlsdGluVHlwZUxvYyA6IHB1YmxpYyBDb25jcmV0ZVR5cGVMb2M8VW5xdWFsVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluTG9jSW5mbz4geworcHVibGljOgorICBTb3VyY2VMb2NhdGlvbiBnZXRCdWlsdGluTG9jKCkgY29uc3QgeworICAgIHJldHVybiBnZXRMb2NhbERhdGEoKS0+QnVpbHRpblJhbmdlLmdldEJlZ2luKCk7CisgIH0KKworICB2b2lkIHNldEJ1aWx0aW5Mb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgZ2V0TG9jYWxEYXRhKCktPkJ1aWx0aW5SYW5nZSA9IExvYzsKKyAgfQorCisgIHZvaWQgZXhwYW5kQnVpbHRpblJhbmdlKFNvdXJjZVJhbmdlIFJhbmdlKSB7CisgICAgU291cmNlUmFuZ2UgJkJ1aWx0aW5SYW5nZSA9IGdldExvY2FsRGF0YSgpLT5CdWlsdGluUmFuZ2U7CisgICAgaWYgKCFCdWlsdGluUmFuZ2UuZ2V0QmVnaW4oKS5pc1ZhbGlkKCkpIHsKKyAgICAgIEJ1aWx0aW5SYW5nZSA9IFJhbmdlOworICAgIH0gZWxzZSB7CisgICAgICBCdWlsdGluUmFuZ2Uuc2V0QmVnaW4oc3RkOjptaW4oUmFuZ2UuZ2V0QmVnaW4oKSwgQnVpbHRpblJhbmdlLmdldEJlZ2luKCkpKTsKKyAgICAgIEJ1aWx0aW5SYW5nZS5zZXRFbmQoc3RkOjptYXgoUmFuZ2UuZ2V0RW5kKCksIEJ1aWx0aW5SYW5nZS5nZXRFbmQoKSkpOworICAgIH0KKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldE5hbWVMb2MoKSBjb25zdCB7IHJldHVybiBnZXRCdWlsdGluTG9jKCk7IH0KKworICBXcml0dGVuQnVpbHRpblNwZWNzJiBnZXRXcml0dGVuQnVpbHRpblNwZWNzKCkgeworICAgIHJldHVybiAqKHN0YXRpY19jYXN0PFdyaXR0ZW5CdWlsdGluU3BlY3MqPihnZXRFeHRyYUxvY2FsRGF0YSgpKSk7CisgIH0KKyAgY29uc3QgV3JpdHRlbkJ1aWx0aW5TcGVjcyYgZ2V0V3JpdHRlbkJ1aWx0aW5TcGVjcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKihzdGF0aWNfY2FzdDxXcml0dGVuQnVpbHRpblNwZWNzKj4oZ2V0RXh0cmFMb2NhbERhdGEoKSkpOworICB9CisKKyAgYm9vbCBuZWVkc0V4dHJhTG9jYWxEYXRhKCkgY29uc3QgeworICAgIEJ1aWx0aW5UeXBlOjpLaW5kIGJrID0gZ2V0VHlwZVB0cigpLT5nZXRLaW5kKCk7CisgICAgcmV0dXJuIChiayA+PSBCdWlsdGluVHlwZTo6VVNob3J0ICYmIGJrIDw9IEJ1aWx0aW5UeXBlOjpVSW50MTI4KQorICAgICAgfHwgKGJrID49IEJ1aWx0aW5UeXBlOjpTaG9ydCAmJiBiayA8PSBCdWlsdGluVHlwZTo6RmxvYXQxMjgpCisgICAgICB8fCBiayA9PSBCdWlsdGluVHlwZTo6VUNoYXIKKyAgICAgIHx8IGJrID09IEJ1aWx0aW5UeXBlOjpTQ2hhcjsKKyAgfQorCisgIHVuc2lnbmVkIGdldEV4dHJhTG9jYWxEYXRhU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmVlZHNFeHRyYUxvY2FsRGF0YSgpID8gc2l6ZW9mKFdyaXR0ZW5CdWlsdGluU3BlY3MpIDogMDsKKyAgfQorCisgIHVuc2lnbmVkIGdldEV4dHJhTG9jYWxEYXRhQWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBuZWVkc0V4dHJhTG9jYWxEYXRhKCkgPyBhbGlnbm9mKFdyaXR0ZW5CdWlsdGluU3BlY3MpIDogMTsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldExvY2FsU291cmNlUmFuZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExvY2FsRGF0YSgpLT5CdWlsdGluUmFuZ2U7CisgIH0KKworICBUeXBlU3BlY2lmaWVyU2lnbiBnZXRXcml0dGVuU2lnblNwZWMoKSBjb25zdCB7CisgICAgaWYgKG5lZWRzRXh0cmFMb2NhbERhdGEoKSkKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUeXBlU3BlY2lmaWVyU2lnbj4oZ2V0V3JpdHRlbkJ1aWx0aW5TcGVjcygpLlNpZ24pOworICAgIGVsc2UKKyAgICAgIHJldHVybiBUU1NfdW5zcGVjaWZpZWQ7CisgIH0KKworICBib29sIGhhc1dyaXR0ZW5TaWduU3BlYygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0V3JpdHRlblNpZ25TcGVjKCkgIT0gVFNTX3Vuc3BlY2lmaWVkOworICB9CisKKyAgdm9pZCBzZXRXcml0dGVuU2lnblNwZWMoVHlwZVNwZWNpZmllclNpZ24gd3JpdHRlbikgeworICAgIGlmIChuZWVkc0V4dHJhTG9jYWxEYXRhKCkpCisgICAgICBnZXRXcml0dGVuQnVpbHRpblNwZWNzKCkuU2lnbiA9IHdyaXR0ZW47CisgIH0KKworICBUeXBlU3BlY2lmaWVyV2lkdGggZ2V0V3JpdHRlbldpZHRoU3BlYygpIGNvbnN0IHsKKyAgICBpZiAobmVlZHNFeHRyYUxvY2FsRGF0YSgpKQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGVTcGVjaWZpZXJXaWR0aD4oZ2V0V3JpdHRlbkJ1aWx0aW5TcGVjcygpLldpZHRoKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gVFNXX3Vuc3BlY2lmaWVkOworICB9CisKKyAgYm9vbCBoYXNXcml0dGVuV2lkdGhTcGVjKCkgY29uc3QgeworICAgIHJldHVybiBnZXRXcml0dGVuV2lkdGhTcGVjKCkgIT0gVFNXX3Vuc3BlY2lmaWVkOworICB9CisKKyAgdm9pZCBzZXRXcml0dGVuV2lkdGhTcGVjKFR5cGVTcGVjaWZpZXJXaWR0aCB3cml0dGVuKSB7CisgICAgaWYgKG5lZWRzRXh0cmFMb2NhbERhdGEoKSkKKyAgICAgIGdldFdyaXR0ZW5CdWlsdGluU3BlY3MoKS5XaWR0aCA9IHdyaXR0ZW47CisgIH0KKworICBUeXBlU3BlY2lmaWVyVHlwZSBnZXRXcml0dGVuVHlwZVNwZWMoKSBjb25zdDsKKworICBib29sIGhhc1dyaXR0ZW5UeXBlU3BlYygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0V3JpdHRlblR5cGVTcGVjKCkgIT0gVFNUX3Vuc3BlY2lmaWVkOworICB9CisKKyAgdm9pZCBzZXRXcml0dGVuVHlwZVNwZWMoVHlwZVNwZWNpZmllclR5cGUgd3JpdHRlbikgeworICAgIGlmIChuZWVkc0V4dHJhTG9jYWxEYXRhKCkpCisgICAgICBnZXRXcml0dGVuQnVpbHRpblNwZWNzKCkuVHlwZSA9IHdyaXR0ZW47CisgIH0KKworICBib29sIGhhc01vZGVBdHRyKCkgY29uc3QgeworICAgIGlmIChuZWVkc0V4dHJhTG9jYWxEYXRhKCkpCisgICAgICByZXR1cm4gZ2V0V3JpdHRlbkJ1aWx0aW5TcGVjcygpLk1vZGVBdHRyOworICAgIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZvaWQgc2V0TW9kZUF0dHIoYm9vbCB3cml0dGVuKSB7CisgICAgaWYgKG5lZWRzRXh0cmFMb2NhbERhdGEoKSkKKyAgICAgIGdldFdyaXR0ZW5CdWlsdGluU3BlY3MoKS5Nb2RlQXR0ciA9IHdyaXR0ZW47CisgIH0KKworICB2b2lkIGluaXRpYWxpemVMb2NhbChBU1RDb250ZXh0ICZDb250ZXh0LCBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBzZXRCdWlsdGluTG9jKExvYyk7CisgICAgaWYgKG5lZWRzRXh0cmFMb2NhbERhdGEoKSkgeworICAgICAgV3JpdHRlbkJ1aWx0aW5TcGVjcyAmd2JzID0gZ2V0V3JpdHRlbkJ1aWx0aW5TcGVjcygpOworICAgICAgd2JzLlNpZ24gPSBUU1NfdW5zcGVjaWZpZWQ7CisgICAgICB3YnMuV2lkdGggPSBUU1dfdW5zcGVjaWZpZWQ7CisgICAgICB3YnMuVHlwZSA9IFRTVF91bnNwZWNpZmllZDsKKyAgICAgIHdicy5Nb2RlQXR0ciA9IGZhbHNlOworICAgIH0KKyAgfQorfTsKKworLy8vIFxicmllZiBXcmFwcGVyIGZvciBzb3VyY2UgaW5mbyBmb3IgdHlwZWRlZnMuCitjbGFzcyBUeXBlZGVmVHlwZUxvYyA6IHB1YmxpYyBJbmhlcml0aW5nQ29uY3JldGVUeXBlTG9jPFR5cGVTcGVjVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZWRlZlR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkZWZUeXBlPiB7CitwdWJsaWM6CisgIFR5cGVkZWZOYW1lRGVjbCAqZ2V0VHlwZWRlZk5hbWVEZWNsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUeXBlUHRyKCktPmdldERlY2woKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBXcmFwcGVyIGZvciBzb3VyY2UgaW5mbyBmb3IgaW5qZWN0ZWQgY2xhc3MgbmFtZXMgb2YgY2xhc3MKKy8vLyB0ZW1wbGF0ZXMuCitjbGFzcyBJbmplY3RlZENsYXNzTmFtZVR5cGVMb2MgOgorICAgIHB1YmxpYyBJbmhlcml0aW5nQ29uY3JldGVUeXBlTG9jPFR5cGVTcGVjVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmplY3RlZENsYXNzTmFtZVR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5qZWN0ZWRDbGFzc05hbWVUeXBlPiB7CitwdWJsaWM6CisgIENYWFJlY29yZERlY2wgKmdldERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGVQdHIoKS0+Z2V0RGVjbCgpOworICB9Cit9OworCisvLy8gXGJyaWVmIFdyYXBwZXIgZm9yIHNvdXJjZSBpbmZvIGZvciB1bnJlc29sdmVkIHR5cGVuYW1lIHVzaW5nIGRlY2xzLgorY2xhc3MgVW5yZXNvbHZlZFVzaW5nVHlwZUxvYyA6CisgICAgcHVibGljIEluaGVyaXRpbmdDb25jcmV0ZVR5cGVMb2M8VHlwZVNwZWNUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmVzb2x2ZWRVc2luZ1R5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXNvbHZlZFVzaW5nVHlwZT4geworcHVibGljOgorICBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wgKmdldERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGVQdHIoKS0+Z2V0RGVjbCgpOworICB9Cit9OworCisvLy8gXGJyaWVmIFdyYXBwZXIgZm9yIHNvdXJjZSBpbmZvIGZvciB0YWcgdHlwZXMuICBOb3RlIHRoYXQgdGhpcyBvbmx5CisvLy8gcmVjb3JkcyBzb3VyY2UgaW5mbyBmb3IgdGhlIG5hbWUgaXRzZWxmOyBhIHR5cGUgd3JpdHRlbiAnc3RydWN0IGZvbycKKy8vLyBzaG91bGQgYmUgcmVwcmVzZW50ZWQgYXMgYW4gRWxhYm9yYXRlZFR5cGVMb2MuICBXZSBjdXJyZW50bHkKKy8vLyBvbmx5IGRvIHRoYXQgd2hlbiBDKysgaXMgZW5hYmxlZCBiZWNhdXNlIG9mIHRoZSBleHBlbnNlIG9mCisvLy8gY3JlYXRpbmcgYW4gRWxhYm9yYXRlZFR5cGUgbm9kZSBmb3Igc28gbWFueSB0eXBlIHJlZmVyZW5jZXMgaW4gQy4KK2NsYXNzIFRhZ1R5cGVMb2MgOiBwdWJsaWMgSW5oZXJpdGluZ0NvbmNyZXRlVHlwZUxvYzxUeXBlU3BlY1R5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFnVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWdUeXBlPiB7CitwdWJsaWM6CisgIFRhZ0RlY2wgKmdldERlY2woKSBjb25zdCB7IHJldHVybiBnZXRUeXBlUHRyKCktPmdldERlY2woKTsgfQorCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGUgdGFnIHdhcyBkZWZpbmVkIGluIHRoaXMgdHlwZSBzcGVjaWZpZXIuCisgIGJvb2wgaXNEZWZpbml0aW9uKCkgY29uc3QgeworICAgIFRhZ0RlY2wgKkQgPSBnZXREZWNsKCk7CisgICAgcmV0dXJuIEQtPmlzQ29tcGxldGVEZWZpbml0aW9uKCkgJiYKKyAgICAgICAgICAgKEQtPmdldElkZW50aWZpZXIoKSA9PSBudWxscHRyIHx8IEQtPmdldExvY2F0aW9uKCkgPT0gZ2V0TmFtZUxvYygpKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBXcmFwcGVyIGZvciBzb3VyY2UgaW5mbyBmb3IgcmVjb3JkIHR5cGVzLgorY2xhc3MgUmVjb3JkVHlwZUxvYyA6IHB1YmxpYyBJbmhlcml0aW5nQ29uY3JldGVUeXBlTG9jPFRhZ1R5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmRUeXBlPiB7CitwdWJsaWM6CisgIFJlY29yZERlY2wgKmdldERlY2woKSBjb25zdCB7IHJldHVybiBnZXRUeXBlUHRyKCktPmdldERlY2woKTsgfQorfTsKKworLy8vIFxicmllZiBXcmFwcGVyIGZvciBzb3VyY2UgaW5mbyBmb3IgZW51bSB0eXBlcy4KK2NsYXNzIEVudW1UeXBlTG9jIDogcHVibGljIEluaGVyaXRpbmdDb25jcmV0ZVR5cGVMb2M8VGFnVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bVR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1UeXBlPiB7CitwdWJsaWM6CisgIEVudW1EZWNsICpnZXREZWNsKCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZVB0cigpLT5nZXREZWNsKCk7IH0KK307CisKKy8vLyBcYnJpZWYgV3JhcHBlciBmb3IgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXJzLgorY2xhc3MgVGVtcGxhdGVUeXBlUGFybVR5cGVMb2MgOgorICAgIHB1YmxpYyBJbmhlcml0aW5nQ29uY3JldGVUeXBlTG9jPFR5cGVTcGVjVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVR5cGVQYXJtVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVR5cGVQYXJtVHlwZT4geworcHVibGljOgorICBUZW1wbGF0ZVR5cGVQYXJtRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVQdHIoKS0+Z2V0RGVjbCgpOyB9Cit9OworCitzdHJ1Y3QgT2JqQ1R5cGVQYXJhbVR5cGVMb2NJbmZvIHsKKyAgU291cmNlTG9jYXRpb24gTmFtZUxvYzsKK307CisKKy8vLyBQcm90b2NvbExBbmdsZUxvYywgUHJvdG9jb2xSQW5nbGVMb2MsIGFuZCB0aGUgc291cmNlIGxvY2F0aW9ucyBmb3IKKy8vLyBwcm90b2NvbCBxdWFsaWZpZXJzIGFyZSBzdG9yZWQgYWZ0ZXIgSW5mby4KK2NsYXNzIE9iakNUeXBlUGFyYW1UeXBlTG9jIDogcHVibGljIENvbmNyZXRlVHlwZUxvYzxVbnF1YWxUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNUeXBlUGFyYW1UeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNUeXBlUGFyYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNUeXBlUGFyYW1UeXBlTG9jSW5mbz4geworICAvLyBTb3VyY2VMb2NhdGlvbnMgYXJlIHN0b3JlZCBhZnRlciBJbmZvLCBvbmUgZm9yIGVhY2ggcHJvdG9jb2wgcXVhbGlmaWVyLgorICBTb3VyY2VMb2NhdGlvbiAqZ2V0UHJvdG9jb2xMb2NBcnJheSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKFNvdXJjZUxvY2F0aW9uKil0aGlzLT5nZXRFeHRyYUxvY2FsRGF0YSgpICsgMjsKKyAgfQorCitwdWJsaWM6CisgIE9iakNUeXBlUGFyYW1EZWNsICpnZXREZWNsKCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZVB0cigpLT5nZXREZWNsKCk7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXROYW1lTG9jKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRMb2NhbERhdGEoKS0+TmFtZUxvYzsKKyAgfQorCisgIHZvaWQgc2V0TmFtZUxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICB0aGlzLT5nZXRMb2NhbERhdGEoKS0+TmFtZUxvYyA9IExvYzsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFByb3RvY29sTEFuZ2xlTG9jKCkgY29uc3QgeworICAgIHJldHVybiBnZXROdW1Qcm90b2NvbHMoKSAgPworICAgICAgKigoU291cmNlTG9jYXRpb24qKXRoaXMtPmdldEV4dHJhTG9jYWxEYXRhKCkpIDoKKyAgICAgIFNvdXJjZUxvY2F0aW9uKCk7CisgIH0KKworICB2b2lkIHNldFByb3RvY29sTEFuZ2xlTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgICooKFNvdXJjZUxvY2F0aW9uKil0aGlzLT5nZXRFeHRyYUxvY2FsRGF0YSgpKSA9IExvYzsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFByb3RvY29sUkFuZ2xlTG9jKCkgY29uc3QgeworICAgIHJldHVybiBnZXROdW1Qcm90b2NvbHMoKSAgPworICAgICAgKigoU291cmNlTG9jYXRpb24qKXRoaXMtPmdldEV4dHJhTG9jYWxEYXRhKCkgKyAxKSA6CisgICAgICBTb3VyY2VMb2NhdGlvbigpOworICB9CisKKyAgdm9pZCBzZXRQcm90b2NvbFJBbmdsZUxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICAqKChTb3VyY2VMb2NhdGlvbiopdGhpcy0+Z2V0RXh0cmFMb2NhbERhdGEoKSArIDEpID0gTG9jOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtUHJvdG9jb2xzKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRUeXBlUHRyKCktPmdldE51bVByb3RvY29scygpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0UHJvdG9jb2xMb2ModW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgZ2V0TnVtUHJvdG9jb2xzKCkgJiYgIkluZGV4IGlzIG91dCBvZiBib3VuZHMhIik7CisgICAgcmV0dXJuIGdldFByb3RvY29sTG9jQXJyYXkoKVtpXTsKKyAgfQorCisgIHZvaWQgc2V0UHJvdG9jb2xMb2ModW5zaWduZWQgaSwgU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgYXNzZXJ0KGkgPCBnZXROdW1Qcm90b2NvbHMoKSAmJiAiSW5kZXggaXMgb3V0IG9mIGJvdW5kcyEiKTsKKyAgICBnZXRQcm90b2NvbExvY0FycmF5KClbaV0gPSBMb2M7CisgIH0KKworICBPYmpDUHJvdG9jb2xEZWNsICpnZXRQcm90b2NvbCh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBnZXROdW1Qcm90b2NvbHMoKSAmJiAiSW5kZXggaXMgb3V0IG9mIGJvdW5kcyEiKTsKKyAgICByZXR1cm4gKih0aGlzLT5nZXRUeXBlUHRyKCktPnF1YWxfYmVnaW4oKSArIGkpOworICB9CisKKyAgQXJyYXlSZWY8U291cmNlTG9jYXRpb24+IGdldFByb3RvY29sTG9jcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKGdldFByb3RvY29sTG9jQXJyYXkoKSwgZ2V0TnVtUHJvdG9jb2xzKCkpOworICB9CisKKyAgdm9pZCBpbml0aWFsaXplTG9jYWwoQVNUQ29udGV4dCAmQ29udGV4dCwgU291cmNlTG9jYXRpb24gTG9jKTsKKworICB1bnNpZ25lZCBnZXRFeHRyYUxvY2FsRGF0YVNpemUoKSBjb25zdCB7CisgICAgaWYgKCF0aGlzLT5nZXROdW1Qcm90b2NvbHMoKSkgcmV0dXJuIDA7CisgICAgLy8gV2hlbiB0aGVyZSBhcmUgcHJvdG9jb2wgcXVhbGlmZXJzLCB3ZSBoYXZlIExBbmdsZUxvYyBhbmQgUkFuZ2xlTG9jCisgICAgLy8gYXMgd2VsbC4KKyAgICByZXR1cm4gKHRoaXMtPmdldE51bVByb3RvY29scygpICsgMikgKiBzaXplb2YoU291cmNlTG9jYXRpb24pIDsKKyAgfQorCisgIHVuc2lnbmVkIGdldEV4dHJhTG9jYWxEYXRhQWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBhbGlnbm9mKFNvdXJjZUxvY2F0aW9uKTsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldExvY2FsU291cmNlUmFuZ2UoKSBjb25zdCB7CisgICAgU291cmNlTG9jYXRpb24gc3RhcnQgPSBnZXROYW1lTG9jKCk7CisgICAgU291cmNlTG9jYXRpb24gZW5kID0gZ2V0UHJvdG9jb2xSQW5nbGVMb2MoKTsKKyAgICBpZiAoZW5kLmlzSW52YWxpZCgpKSByZXR1cm4gU291cmNlUmFuZ2Uoc3RhcnQsIHN0YXJ0KTsKKyAgICByZXR1cm4gU291cmNlUmFuZ2Uoc3RhcnQsIGVuZCk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgV3JhcHBlciBmb3Igc3Vic3RpdHV0ZWQgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXJzLgorY2xhc3MgU3Vic3RUZW1wbGF0ZVR5cGVQYXJtVHlwZUxvYyA6CisgICAgcHVibGljIEluaGVyaXRpbmdDb25jcmV0ZVR5cGVMb2M8VHlwZVNwZWNUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnN0VGVtcGxhdGVUeXBlUGFybVR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vic3RUZW1wbGF0ZVR5cGVQYXJtVHlwZT4geworfTsKKworICAvLy8gXGJyaWVmIFdyYXBwZXIgZm9yIHN1YnN0aXR1dGVkIHRlbXBsYXRlIHR5cGUgcGFyYW1ldGVycy4KK2NsYXNzIFN1YnN0VGVtcGxhdGVUeXBlUGFybVBhY2tUeXBlTG9jIDoKKyAgICBwdWJsaWMgSW5oZXJpdGluZ0NvbmNyZXRlVHlwZUxvYzxUeXBlU3BlY1R5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vic3RUZW1wbGF0ZVR5cGVQYXJtUGFja1R5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vic3RUZW1wbGF0ZVR5cGVQYXJtUGFja1R5cGU+IHsKK307CisKK3N0cnVjdCBBdHRyaWJ1dGVkTG9jSW5mbyB7CisgIHVuaW9uIHsKKyAgICBFeHByICpFeHByT3BlcmFuZDsKKworICAgIC8vLyBBIHJhdyBTb3VyY2VMb2NhdGlvbi4KKyAgICB1bnNpZ25lZCBFbnVtT3BlcmFuZExvYzsKKyAgfTsKKworICBTb3VyY2VSYW5nZSBPcGVyYW5kUGFyZW5zOworCisgIFNvdXJjZUxvY2F0aW9uIEF0dHJMb2M7Cit9OworCisvLy8gXGJyaWVmIFR5cGUgc291cmNlIGluZm9ybWF0aW9uIGZvciBhbiBhdHRyaWJ1dGVkIHR5cGUuCitjbGFzcyBBdHRyaWJ1dGVkVHlwZUxvYyA6IHB1YmxpYyBDb25jcmV0ZVR5cGVMb2M8VW5xdWFsVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVkVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVkTG9jSW5mbz4geworcHVibGljOgorICBBdHRyaWJ1dGVkVHlwZTo6S2luZCBnZXRBdHRyS2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHlwZVB0cigpLT5nZXRBdHRyS2luZCgpOworICB9CisKKyAgYm9vbCBoYXNBdHRyRXhwck9wZXJhbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRBdHRyS2luZCgpID49IEF0dHJpYnV0ZWRUeXBlOjpGaXJzdEV4cHJPcGVyYW5kS2luZCAmJgorICAgICAgICAgICAgZ2V0QXR0cktpbmQoKSA8PSBBdHRyaWJ1dGVkVHlwZTo6TGFzdEV4cHJPcGVyYW5kS2luZCk7CisgIH0KKworICBib29sIGhhc0F0dHJFbnVtT3BlcmFuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldEF0dHJLaW5kKCkgPj0gQXR0cmlidXRlZFR5cGU6OkZpcnN0RW51bU9wZXJhbmRLaW5kICYmCisgICAgICAgICAgICBnZXRBdHRyS2luZCgpIDw9IEF0dHJpYnV0ZWRUeXBlOjpMYXN0RW51bU9wZXJhbmRLaW5kKTsKKyAgfQorCisgIGJvb2wgaGFzQXR0ck9wZXJhbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0F0dHJFeHByT3BlcmFuZCgpIHx8IGhhc0F0dHJFbnVtT3BlcmFuZCgpOworICB9CisKKyAgYm9vbCBpc1F1YWxpZmllcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHlwZVB0cigpLT5pc1F1YWxpZmllcigpOworICB9CisKKyAgLy8vIFRoZSBtb2RpZmllZCB0eXBlLCB3aGljaCBpcyBnZW5lcmFsbHkgY2Fub25pY2FsbHkgZGlmZmVyZW50IGZyb20KKyAgLy8vIHRoZSBhdHRyaWJ1dGUgdHlwZS4KKyAgLy8vICAgIGludCBtYWluKGludCwgY2hhcioqKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCisgIC8vLyAgICB+fn4gICAgIH5+fn5+fn5+fn5+fn4KKyAgVHlwZUxvYyBnZXRNb2RpZmllZExvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW5uZXJUeXBlTG9jKCk7CisgIH0KKworICAvLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZSwgaS5lLgorICAvLy8gICAgX19hdHRyaWJ1dGVfXygocmVncGFybSgxMDAwKSkpCisgIC8vLyAgICAgICAgICAgICAgICAgICBefn5+fn5+CisgIFNvdXJjZUxvY2F0aW9uIGdldEF0dHJOYW1lTG9jKCkgY29uc3QgeworICAgIHJldHVybiBnZXRMb2NhbERhdGEoKS0+QXR0ckxvYzsKKyAgfQorICB2b2lkIHNldEF0dHJOYW1lTG9jKFNvdXJjZUxvY2F0aW9uIGxvYykgeworICAgIGdldExvY2FsRGF0YSgpLT5BdHRyTG9jID0gbG9jOworICB9CisKKyAgLy8vIFRoZSBhdHRyaWJ1dGUncyBleHByZXNzaW9uIG9wZXJhbmQsIGlmIGl0IGhhcyBvbmUuCisgIC8vLyAgICB2b2lkICpjdXJfdGhyZWFkIF9fYXR0cmlidXRlX18oKGFkZHJlc3Nfc3BhY2UoMjEpKSkKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBefgorICBFeHByICpnZXRBdHRyRXhwck9wZXJhbmQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGhhc0F0dHJFeHByT3BlcmFuZCgpKTsKKyAgICByZXR1cm4gZ2V0TG9jYWxEYXRhKCktPkV4cHJPcGVyYW5kOworICB9CisgIHZvaWQgc2V0QXR0ckV4cHJPcGVyYW5kKEV4cHIgKmUpIHsKKyAgICBhc3NlcnQoaGFzQXR0ckV4cHJPcGVyYW5kKCkpOworICAgIGdldExvY2FsRGF0YSgpLT5FeHByT3BlcmFuZCA9IGU7CisgIH0KKworICAvLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSBhdHRyaWJ1dGUncyBlbnVtZXJhdGVkIG9wZXJhbmQsIGlmIGl0IGhhcyBvbmUuCisgIC8vLyAgICB2b2lkICogX19hdHRyaWJ1dGVfXygob2JqY19nYyh3ZWFrKSkpCisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBefn5+CisgIFNvdXJjZUxvY2F0aW9uIGdldEF0dHJFbnVtT3BlcmFuZExvYygpIGNvbnN0IHsKKyAgICBhc3NlcnQoaGFzQXR0ckVudW1PcGVyYW5kKCkpOworICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKGdldExvY2FsRGF0YSgpLT5FbnVtT3BlcmFuZExvYyk7CisgIH0KKyAgdm9pZCBzZXRBdHRyRW51bU9wZXJhbmRMb2MoU291cmNlTG9jYXRpb24gbG9jKSB7CisgICAgYXNzZXJ0KGhhc0F0dHJFbnVtT3BlcmFuZCgpKTsKKyAgICBnZXRMb2NhbERhdGEoKS0+RW51bU9wZXJhbmRMb2MgPSBsb2MuZ2V0UmF3RW5jb2RpbmcoKTsKKyAgfQorCisgIC8vLyBUaGUgbG9jYXRpb24gb2YgdGhlIHBhcmVudGhlc2VzIGFyb3VuZCB0aGUgb3BlcmFuZCwgaWYgdGhlcmUgaXMKKyAgLy8vIGFuIG9wZXJhbmQuCisgIC8vLyAgICB2b2lkICogX19hdHRyaWJ1dGVfXygob2JqY19nYyh3ZWFrKSkpCisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gICAgXgorICBTb3VyY2VSYW5nZSBnZXRBdHRyT3BlcmFuZFBhcmVuc1JhbmdlKCkgY29uc3QgeworICAgIGFzc2VydChoYXNBdHRyT3BlcmFuZCgpKTsKKyAgICByZXR1cm4gZ2V0TG9jYWxEYXRhKCktPk9wZXJhbmRQYXJlbnM7CisgIH0KKyAgdm9pZCBzZXRBdHRyT3BlcmFuZFBhcmVuc1JhbmdlKFNvdXJjZVJhbmdlIHJhbmdlKSB7CisgICAgYXNzZXJ0KGhhc0F0dHJPcGVyYW5kKCkpOworICAgIGdldExvY2FsRGF0YSgpLT5PcGVyYW5kUGFyZW5zID0gcmFuZ2U7CisgIH0KKworICBTb3VyY2VSYW5nZSBnZXRMb2NhbFNvdXJjZVJhbmdlKCkgY29uc3QgeworICAgIC8vIE5vdGUgdGhhdCB0aGlzIGRvZXMgKm5vdCogaW5jbHVkZSB0aGUgcmFuZ2Ugb2YgdGhlIGF0dHJpYnV0ZQorICAgIC8vIGVuY2xvc3VyZSwgZS5nLjoKKyAgICAvLyAgICBfX2F0dHJpYnV0ZV9fKChmb28oYmFyKSkpCisgICAgLy8gICAgXn5+fn5+fn5+fn5+fn5+ICAgICAgICB+fgorICAgIC8vIG9yCisgICAgLy8gICAgW1tmb28oYmFyKV1dCisgICAgLy8gICAgXn4gICAgICAgIH5+CisgICAgLy8gVGhhdCBlbmNsb3N1cmUgZG9lc24ndCBuZWNlc3NhcmlseSBiZWxvbmcgdG8gYSBzaW5nbGUgYXR0cmlidXRlCisgICAgLy8gYW55d2F5LgorICAgIFNvdXJjZVJhbmdlIHJhbmdlKGdldEF0dHJOYW1lTG9jKCkpOworICAgIGlmIChoYXNBdHRyT3BlcmFuZCgpKQorICAgICAgcmFuZ2Uuc2V0RW5kKGdldEF0dHJPcGVyYW5kUGFyZW5zUmFuZ2UoKS5nZXRFbmQoKSk7CisgICAgcmV0dXJuIHJhbmdlOworICB9CisKKyAgdm9pZCBpbml0aWFsaXplTG9jYWwoQVNUQ29udGV4dCAmQ29udGV4dCwgU291cmNlTG9jYXRpb24gbG9jKSB7CisgICAgc2V0QXR0ck5hbWVMb2MobG9jKTsKKyAgICBpZiAoaGFzQXR0ckV4cHJPcGVyYW5kKCkpIHsKKyAgICAgIHNldEF0dHJPcGVyYW5kUGFyZW5zUmFuZ2UoU291cmNlUmFuZ2UobG9jKSk7CisgICAgICBzZXRBdHRyRXhwck9wZXJhbmQobnVsbHB0cik7CisgICAgfSBlbHNlIGlmIChoYXNBdHRyRW51bU9wZXJhbmQoKSkgeworICAgICAgc2V0QXR0ck9wZXJhbmRQYXJlbnNSYW5nZShTb3VyY2VSYW5nZShsb2MpKTsKKyAgICAgIHNldEF0dHJFbnVtT3BlcmFuZExvYyhsb2MpOworICAgIH0KKyAgfQorCisgIFF1YWxUeXBlIGdldElubmVyVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHlwZVB0cigpLT5nZXRNb2RpZmllZFR5cGUoKTsKKyAgfQorfTsKKworc3RydWN0IE9iakNPYmplY3RUeXBlTG9jSW5mbyB7CisgIFNvdXJjZUxvY2F0aW9uIFR5cGVBcmdzTEFuZ2xlTG9jOworICBTb3VyY2VMb2NhdGlvbiBUeXBlQXJnc1JBbmdsZUxvYzsKKyAgU291cmNlTG9jYXRpb24gUHJvdG9jb2xMQW5nbGVMb2M7CisgIFNvdXJjZUxvY2F0aW9uIFByb3RvY29sUkFuZ2xlTG9jOworICBib29sIEhhc0Jhc2VUeXBlQXNXcml0dGVuOworfTsKKworLy8gQSBoZWxwZXIgY2xhc3MgZm9yIGRlZmluaW5nIE9iakMgVHlwZUxvY3MgdGhhdCBjYW4gcXVhbGlmaWVkIHdpdGgKKy8vIHByb3RvY29scy4KKy8vCisvLyBUeXBlQ2xhc3MgYmFzaWNhbGx5IGhhcyB0byBiZSBlaXRoZXIgT2JqQ0ludGVyZmFjZVR5cGUgb3IKKy8vIE9iakNPYmplY3RQb2ludGVyVHlwZS4KK2NsYXNzIE9iakNPYmplY3RUeXBlTG9jIDogcHVibGljIENvbmNyZXRlVHlwZUxvYzxVbnF1YWxUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNPYmplY3RUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNPYmplY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNPYmplY3RUeXBlTG9jSW5mbz4geworICAvLyBUeXBlU291cmNlSW5mbyoncyBhcmUgc3RvcmVkIGFmdGVyIEluZm8sIG9uZSBmb3IgZWFjaCB0eXBlIGFyZ3VtZW50LgorICBUeXBlU291cmNlSW5mbyAqKmdldFR5cGVBcmdMb2NBcnJheSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKFR5cGVTb3VyY2VJbmZvKiopdGhpcy0+Z2V0RXh0cmFMb2NhbERhdGEoKTsKKyAgfQorCisgIC8vIFNvdXJjZUxvY2F0aW9ucyBhcmUgc3RvcmVkIGFmdGVyIHRoZSB0eXBlIGFyZ3VtZW50IGluZm9ybWF0aW9uLCBvbmUgZm9yIAorICAvLyBlYWNoIFByb3RvY29sLgorICBTb3VyY2VMb2NhdGlvbiAqZ2V0UHJvdG9jb2xMb2NBcnJheSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKFNvdXJjZUxvY2F0aW9uKikoZ2V0VHlwZUFyZ0xvY0FycmF5KCkgKyBnZXROdW1UeXBlQXJncygpKTsKKyAgfQorCitwdWJsaWM6CisgIFNvdXJjZUxvY2F0aW9uIGdldFR5cGVBcmdzTEFuZ2xlTG9jKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRMb2NhbERhdGEoKS0+VHlwZUFyZ3NMQW5nbGVMb2M7CisgIH0KKworICB2b2lkIHNldFR5cGVBcmdzTEFuZ2xlTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIHRoaXMtPmdldExvY2FsRGF0YSgpLT5UeXBlQXJnc0xBbmdsZUxvYyA9IExvYzsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFR5cGVBcmdzUkFuZ2xlTG9jKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRMb2NhbERhdGEoKS0+VHlwZUFyZ3NSQW5nbGVMb2M7CisgIH0KKworICB2b2lkIHNldFR5cGVBcmdzUkFuZ2xlTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIHRoaXMtPmdldExvY2FsRGF0YSgpLT5UeXBlQXJnc1JBbmdsZUxvYyA9IExvYzsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bVR5cGVBcmdzKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRUeXBlUHRyKCktPmdldFR5cGVBcmdzQXNXcml0dGVuKCkuc2l6ZSgpOworICB9CisKKyAgVHlwZVNvdXJjZUluZm8gKmdldFR5cGVBcmdUSW5mbyh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBnZXROdW1UeXBlQXJncygpICYmICJJbmRleCBpcyBvdXQgb2YgYm91bmRzISIpOworICAgIHJldHVybiBnZXRUeXBlQXJnTG9jQXJyYXkoKVtpXTsKKyAgfQorCisgIHZvaWQgc2V0VHlwZUFyZ1RJbmZvKHVuc2lnbmVkIGksIFR5cGVTb3VyY2VJbmZvICpUSW5mbykgeworICAgIGFzc2VydChpIDwgZ2V0TnVtVHlwZUFyZ3MoKSAmJiAiSW5kZXggaXMgb3V0IG9mIGJvdW5kcyEiKTsKKyAgICBnZXRUeXBlQXJnTG9jQXJyYXkoKVtpXSA9IFRJbmZvOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0UHJvdG9jb2xMQW5nbGVMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPmdldExvY2FsRGF0YSgpLT5Qcm90b2NvbExBbmdsZUxvYzsKKyAgfQorCisgIHZvaWQgc2V0UHJvdG9jb2xMQW5nbGVMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgdGhpcy0+Z2V0TG9jYWxEYXRhKCktPlByb3RvY29sTEFuZ2xlTG9jID0gTG9jOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0UHJvdG9jb2xSQW5nbGVMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPmdldExvY2FsRGF0YSgpLT5Qcm90b2NvbFJBbmdsZUxvYzsKKyAgfQorCisgIHZvaWQgc2V0UHJvdG9jb2xSQW5nbGVMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgdGhpcy0+Z2V0TG9jYWxEYXRhKCktPlByb3RvY29sUkFuZ2xlTG9jID0gTG9jOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtUHJvdG9jb2xzKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRUeXBlUHRyKCktPmdldE51bVByb3RvY29scygpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0UHJvdG9jb2xMb2ModW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgZ2V0TnVtUHJvdG9jb2xzKCkgJiYgIkluZGV4IGlzIG91dCBvZiBib3VuZHMhIik7CisgICAgcmV0dXJuIGdldFByb3RvY29sTG9jQXJyYXkoKVtpXTsKKyAgfQorCisgIHZvaWQgc2V0UHJvdG9jb2xMb2ModW5zaWduZWQgaSwgU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgYXNzZXJ0KGkgPCBnZXROdW1Qcm90b2NvbHMoKSAmJiAiSW5kZXggaXMgb3V0IG9mIGJvdW5kcyEiKTsKKyAgICBnZXRQcm90b2NvbExvY0FycmF5KClbaV0gPSBMb2M7CisgIH0KKworICBPYmpDUHJvdG9jb2xEZWNsICpnZXRQcm90b2NvbCh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBnZXROdW1Qcm90b2NvbHMoKSAmJiAiSW5kZXggaXMgb3V0IG9mIGJvdW5kcyEiKTsKKyAgICByZXR1cm4gKih0aGlzLT5nZXRUeXBlUHRyKCktPnF1YWxfYmVnaW4oKSArIGkpOworICB9CisKKworICBBcnJheVJlZjxTb3VyY2VMb2NhdGlvbj4gZ2V0UHJvdG9jb2xMb2NzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoZ2V0UHJvdG9jb2xMb2NBcnJheSgpLCBnZXROdW1Qcm90b2NvbHMoKSk7CisgIH0KKworICBib29sIGhhc0Jhc2VUeXBlQXNXcml0dGVuKCkgY29uc3QgeworICAgIHJldHVybiBnZXRMb2NhbERhdGEoKS0+SGFzQmFzZVR5cGVBc1dyaXR0ZW47CisgIH0KKworICB2b2lkIHNldEhhc0Jhc2VUeXBlQXNXcml0dGVuKGJvb2wgSGFzQmFzZVR5cGUpIHsKKyAgICBnZXRMb2NhbERhdGEoKS0+SGFzQmFzZVR5cGVBc1dyaXR0ZW4gPSBIYXNCYXNlVHlwZTsKKyAgfQorCisgIFR5cGVMb2MgZ2V0QmFzZUxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW5uZXJUeXBlTG9jKCk7CisgIH0KKworICBTb3VyY2VSYW5nZSBnZXRMb2NhbFNvdXJjZVJhbmdlKCkgY29uc3QgeworICAgIFNvdXJjZUxvY2F0aW9uIHN0YXJ0ID0gZ2V0VHlwZUFyZ3NMQW5nbGVMb2MoKTsKKyAgICBpZiAoc3RhcnQuaXNJbnZhbGlkKCkpCisgICAgICBzdGFydCA9IGdldFByb3RvY29sTEFuZ2xlTG9jKCk7CisgICAgU291cmNlTG9jYXRpb24gZW5kID0gZ2V0UHJvdG9jb2xSQW5nbGVMb2MoKTsKKyAgICBpZiAoZW5kLmlzSW52YWxpZCgpKQorICAgICAgZW5kID0gZ2V0VHlwZUFyZ3NSQW5nbGVMb2MoKTsKKyAgICByZXR1cm4gU291cmNlUmFuZ2Uoc3RhcnQsIGVuZCk7CisgIH0KKworICB2b2lkIGluaXRpYWxpemVMb2NhbChBU1RDb250ZXh0ICZDb250ZXh0LCBTb3VyY2VMb2NhdGlvbiBMb2MpOworCisgIHVuc2lnbmVkIGdldEV4dHJhTG9jYWxEYXRhU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+Z2V0TnVtVHlwZUFyZ3MoKSAqIHNpemVvZihUeXBlU291cmNlSW5mbyAqKQorICAgICAgICAgKyB0aGlzLT5nZXROdW1Qcm90b2NvbHMoKSAqIHNpemVvZihTb3VyY2VMb2NhdGlvbik7CisgIH0KKworICB1bnNpZ25lZCBnZXRFeHRyYUxvY2FsRGF0YUFsaWdubWVudCgpIGNvbnN0IHsKKyAgICBzdGF0aWNfYXNzZXJ0KGFsaWdub2YoT2JqQ09iamVjdFR5cGVMb2MpID49IGFsaWdub2YoVHlwZVNvdXJjZUluZm8gKiksCisgICAgICAgICAgICAgICAgICAibm90IGVub3VnaCBhbGlnbm1lbnQgZm9yIHRhaWwtYWxsb2NhdGVkIGRhdGEiKTsKKyAgICByZXR1cm4gYWxpZ25vZihUeXBlU291cmNlSW5mbyAqKTsKKyAgfQorCisgIFF1YWxUeXBlIGdldElubmVyVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHlwZVB0cigpLT5nZXRCYXNlVHlwZSgpOworICB9Cit9OworCitzdHJ1Y3QgT2JqQ0ludGVyZmFjZUxvY0luZm8geworICBTb3VyY2VMb2NhdGlvbiBOYW1lTG9jOworICBTb3VyY2VMb2NhdGlvbiBOYW1lRW5kTG9jOworfTsKKworLy8vIFxicmllZiBXcmFwcGVyIGZvciBzb3VyY2UgaW5mbyBmb3IgT2JqQyBpbnRlcmZhY2VzLgorY2xhc3MgT2JqQ0ludGVyZmFjZVR5cGVMb2MgOiBwdWJsaWMgQ29uY3JldGVUeXBlTG9jPE9iakNPYmplY3RUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNJbnRlcmZhY2VUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNJbnRlcmZhY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNJbnRlcmZhY2VMb2NJbmZvPiB7CitwdWJsaWM6CisgIE9iakNJbnRlcmZhY2VEZWNsICpnZXRJRmFjZURlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGVQdHIoKS0+Z2V0RGVjbCgpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TmFtZUxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TG9jYWxEYXRhKCktPk5hbWVMb2M7CisgIH0KKworICB2b2lkIHNldE5hbWVMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgZ2V0TG9jYWxEYXRhKCktPk5hbWVMb2MgPSBMb2M7CisgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgU291cmNlUmFuZ2UgZ2V0TG9jYWxTb3VyY2VSYW5nZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0TmFtZUxvYygpLCBnZXROYW1lRW5kTG9jKCkpOworICB9CisgIAorICBTb3VyY2VMb2NhdGlvbiBnZXROYW1lRW5kTG9jKCkgY29uc3QgeworICAgIHJldHVybiBnZXRMb2NhbERhdGEoKS0+TmFtZUVuZExvYzsKKyAgfQorCisgIHZvaWQgc2V0TmFtZUVuZExvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBnZXRMb2NhbERhdGEoKS0+TmFtZUVuZExvYyA9IExvYzsKKyAgfQorCisgIHZvaWQgaW5pdGlhbGl6ZUxvY2FsKEFTVENvbnRleHQgJkNvbnRleHQsIFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIHNldE5hbWVMb2MoTG9jKTsKKyAgICBzZXROYW1lRW5kTG9jKExvYyk7CisgIH0KK307CisKK3N0cnVjdCBQYXJlbkxvY0luZm8geworICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2M7CisgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYzsKK307CisKK2NsYXNzIFBhcmVuVHlwZUxvYworICA6IHB1YmxpYyBDb25jcmV0ZVR5cGVMb2M8VW5xdWFsVHlwZUxvYywgUGFyZW5UeXBlTG9jLCBQYXJlblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJlbkxvY0luZm8+IHsKK3B1YmxpYzoKKyAgU291cmNlTG9jYXRpb24gZ2V0TFBhcmVuTG9jKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRMb2NhbERhdGEoKS0+TFBhcmVuTG9jOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0UlBhcmVuTG9jKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRMb2NhbERhdGEoKS0+UlBhcmVuTG9jOworICB9CisKKyAgdm9pZCBzZXRMUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgdGhpcy0+Z2V0TG9jYWxEYXRhKCktPkxQYXJlbkxvYyA9IExvYzsKKyAgfQorCisgIHZvaWQgc2V0UlBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIHRoaXMtPmdldExvY2FsRGF0YSgpLT5SUGFyZW5Mb2MgPSBMb2M7CisgIH0KKworICBTb3VyY2VSYW5nZSBnZXRMb2NhbFNvdXJjZVJhbmdlKCkgY29uc3QgeworICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRMUGFyZW5Mb2MoKSwgZ2V0UlBhcmVuTG9jKCkpOworICB9CisKKyAgdm9pZCBpbml0aWFsaXplTG9jYWwoQVNUQ29udGV4dCAmQ29udGV4dCwgU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgc2V0TFBhcmVuTG9jKExvYyk7CisgICAgc2V0UlBhcmVuTG9jKExvYyk7CisgIH0KKworICBUeXBlTG9jIGdldElubmVyTG9jKCkgY29uc3QgeworICAgIHJldHVybiBnZXRJbm5lclR5cGVMb2MoKTsKKyAgfQorCisgIFF1YWxUeXBlIGdldElubmVyVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+Z2V0VHlwZVB0cigpLT5nZXRJbm5lclR5cGUoKTsKKyAgfQorfTsKKworaW5saW5lIFR5cGVMb2MgVHlwZUxvYzo6SWdub3JlUGFyZW5zKCkgY29uc3QgeworICBpZiAoUGFyZW5UeXBlTG9jOjppc0tpbmQoKnRoaXMpKQorICAgIHJldHVybiBJZ25vcmVQYXJlbnNJbXBsKCp0aGlzKTsKKyAgcmV0dXJuICp0aGlzOworfQorCitzdHJ1Y3QgQWRqdXN0ZWRMb2NJbmZvIHt9OyAvLyBOb3RoaW5nLgorCitjbGFzcyBBZGp1c3RlZFR5cGVMb2MgOiBwdWJsaWMgQ29uY3JldGVUeXBlTG9jPFVucXVhbFR5cGVMb2MsIEFkanVzdGVkVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRqdXN0ZWRUeXBlLCBBZGp1c3RlZExvY0luZm8+IHsKK3B1YmxpYzoKKyAgVHlwZUxvYyBnZXRPcmlnaW5hbExvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW5uZXJUeXBlTG9jKCk7CisgIH0KKworICB2b2lkIGluaXRpYWxpemVMb2NhbChBU1RDb250ZXh0ICZDb250ZXh0LCBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICAvLyBkbyBub3RoaW5nCisgIH0KKworICBRdWFsVHlwZSBnZXRJbm5lclR5cGUoKSBjb25zdCB7CisgICAgLy8gVGhlIGlubmVyIHR5cGUgaXMgdGhlIHVuZGVjYXllZCB0eXBlLCBzaW5jZSB0aGF0J3Mgd2hhdCB3ZSBoYXZlIHNvdXJjZQorICAgIC8vIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvci4KKyAgICByZXR1cm4gZ2V0VHlwZVB0cigpLT5nZXRPcmlnaW5hbFR5cGUoKTsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldExvY2FsU291cmNlUmFuZ2UoKSBjb25zdCB7IHJldHVybiB7fTsgfQorCisgIHVuc2lnbmVkIGdldExvY2FsRGF0YVNpemUoKSBjb25zdCB7CisgICAgLy8gc2l6ZW9mKEFkanVzdGVkTG9jSW5mbykgaXMgMSwgYnV0IHdlIGRvbid0IG5lZWQgaXRzIGFkZHJlc3MgdG8gYmUgdW5pcXVlCisgICAgLy8gYW55d2F5LiAgVHlwZUxvY0J1aWxkZXIgY2FuJ3QgaGFuZGxlIGRhdGEgc2l6ZXMgb2YgMS4KKyAgICByZXR1cm4gMDsgIC8vIE5vIGRhdGEuCisgIH0KK307CisKKy8vLyBcYnJpZWYgV3JhcHBlciBmb3Igc291cmNlIGluZm8gZm9yIHBvaW50ZXJzIGRlY2F5ZWQgZnJvbSBhcnJheXMgYW5kCisvLy8gZnVuY3Rpb25zLgorY2xhc3MgRGVjYXllZFR5cGVMb2MgOiBwdWJsaWMgSW5oZXJpdGluZ0NvbmNyZXRlVHlwZUxvYzwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkanVzdGVkVHlwZUxvYywgRGVjYXllZFR5cGVMb2MsIERlY2F5ZWRUeXBlPiB7Cit9OworCitzdHJ1Y3QgUG9pbnRlckxpa2VMb2NJbmZvIHsKKyAgU291cmNlTG9jYXRpb24gU3RhckxvYzsKK307CisKKy8vLyBBIGJhc2UgY2xhc3MgZm9yCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZCwgY2xhc3MgVHlwZUNsYXNzLCBjbGFzcyBMb2NhbERhdGEgPSBQb2ludGVyTGlrZUxvY0luZm8+CitjbGFzcyBQb2ludGVyTGlrZVR5cGVMb2MgOiBwdWJsaWMgQ29uY3JldGVUeXBlTG9jPFVucXVhbFR5cGVMb2MsIERlcml2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVDbGFzcywgTG9jYWxEYXRhPiB7CitwdWJsaWM6CisgIFNvdXJjZUxvY2F0aW9uIGdldFNpZ2lsTG9jKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRMb2NhbERhdGEoKS0+U3RhckxvYzsKKyAgfQorCisgIHZvaWQgc2V0U2lnaWxMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgdGhpcy0+Z2V0TG9jYWxEYXRhKCktPlN0YXJMb2MgPSBMb2M7CisgIH0KKworICBUeXBlTG9jIGdldFBvaW50ZWVMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPmdldElubmVyVHlwZUxvYygpOworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0TG9jYWxTb3VyY2VSYW5nZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0U2lnaWxMb2MoKSwgZ2V0U2lnaWxMb2MoKSk7CisgIH0KKworICB2b2lkIGluaXRpYWxpemVMb2NhbChBU1RDb250ZXh0ICZDb250ZXh0LCBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBzZXRTaWdpbExvYyhMb2MpOworICB9CisKKyAgUXVhbFR5cGUgZ2V0SW5uZXJUeXBlKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRUeXBlUHRyKCktPmdldFBvaW50ZWVUeXBlKCk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgV3JhcHBlciBmb3Igc291cmNlIGluZm8gZm9yIHBvaW50ZXJzLgorY2xhc3MgUG9pbnRlclR5cGVMb2MgOiBwdWJsaWMgUG9pbnRlckxpa2VUeXBlTG9jPFBvaW50ZXJUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJUeXBlPiB7CitwdWJsaWM6CisgIFNvdXJjZUxvY2F0aW9uIGdldFN0YXJMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFNpZ2lsTG9jKCk7CisgIH0KKworICB2b2lkIHNldFN0YXJMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgc2V0U2lnaWxMb2MoTG9jKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBXcmFwcGVyIGZvciBzb3VyY2UgaW5mbyBmb3IgYmxvY2sgcG9pbnRlcnMuCitjbGFzcyBCbG9ja1BvaW50ZXJUeXBlTG9jIDogcHVibGljIFBvaW50ZXJMaWtlVHlwZUxvYzxCbG9ja1BvaW50ZXJUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tQb2ludGVyVHlwZT4geworcHVibGljOgorICBTb3VyY2VMb2NhdGlvbiBnZXRDYXJldExvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U2lnaWxMb2MoKTsKKyAgfQorCisgIHZvaWQgc2V0Q2FyZXRMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgc2V0U2lnaWxMb2MoTG9jKTsKKyAgfQorfTsKKworc3RydWN0IE1lbWJlclBvaW50ZXJMb2NJbmZvIDogcHVibGljIFBvaW50ZXJMaWtlTG9jSW5mbyB7CisgIFR5cGVTb3VyY2VJbmZvICpDbGFzc1RJbmZvOworfTsKKworLy8vIFxicmllZiBXcmFwcGVyIGZvciBzb3VyY2UgaW5mbyBmb3IgbWVtYmVyIHBvaW50ZXJzLgorY2xhc3MgTWVtYmVyUG9pbnRlclR5cGVMb2MgOiBwdWJsaWMgUG9pbnRlckxpa2VUeXBlTG9jPE1lbWJlclBvaW50ZXJUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlclBvaW50ZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlclBvaW50ZXJMb2NJbmZvPiB7CitwdWJsaWM6CisgIFNvdXJjZUxvY2F0aW9uIGdldFN0YXJMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFNpZ2lsTG9jKCk7CisgIH0KKworICB2b2lkIHNldFN0YXJMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgc2V0U2lnaWxMb2MoTG9jKTsKKyAgfQorCisgIGNvbnN0IFR5cGUgKmdldENsYXNzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUeXBlUHRyKCktPmdldENsYXNzKCk7CisgIH0KKworICBUeXBlU291cmNlSW5mbyAqZ2V0Q2xhc3NUSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TG9jYWxEYXRhKCktPkNsYXNzVEluZm87CisgIH0KKworICB2b2lkIHNldENsYXNzVEluZm8oVHlwZVNvdXJjZUluZm8qIFRJKSB7CisgICAgZ2V0TG9jYWxEYXRhKCktPkNsYXNzVEluZm8gPSBUSTsKKyAgfQorCisgIHZvaWQgaW5pdGlhbGl6ZUxvY2FsKEFTVENvbnRleHQgJkNvbnRleHQsIFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIHNldFNpZ2lsTG9jKExvYyk7CisgICAgc2V0Q2xhc3NUSW5mbyhudWxscHRyKTsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldExvY2FsU291cmNlUmFuZ2UoKSBjb25zdCB7CisgICAgaWYgKFR5cGVTb3VyY2VJbmZvICpUSSA9IGdldENsYXNzVEluZm8oKSkKKyAgICAgIHJldHVybiBTb3VyY2VSYW5nZShUSS0+Z2V0VHlwZUxvYygpLmdldEJlZ2luTG9jKCksIGdldFN0YXJMb2MoKSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIFNvdXJjZVJhbmdlKGdldFN0YXJMb2MoKSk7CisgIH0KK307CisKKy8vLyBXcmFwcyBhbiBPYmpDUG9pbnRlclR5cGUgd2l0aCBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitjbGFzcyBPYmpDT2JqZWN0UG9pbnRlclR5cGVMb2MgOgorICAgIHB1YmxpYyBQb2ludGVyTGlrZVR5cGVMb2M8T2JqQ09iamVjdFBvaW50ZXJUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ09iamVjdFBvaW50ZXJUeXBlPiB7CitwdWJsaWM6CisgIFNvdXJjZUxvY2F0aW9uIGdldFN0YXJMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFNpZ2lsTG9jKCk7CisgIH0KKworICB2b2lkIHNldFN0YXJMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgc2V0U2lnaWxMb2MoTG9jKTsKKyAgfQorfTsKKworY2xhc3MgUmVmZXJlbmNlVHlwZUxvYyA6IHB1YmxpYyBQb2ludGVyTGlrZVR5cGVMb2M8UmVmZXJlbmNlVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZVR5cGU+IHsKK3B1YmxpYzoKKyAgUXVhbFR5cGUgZ2V0SW5uZXJUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUeXBlUHRyKCktPmdldFBvaW50ZWVUeXBlQXNXcml0dGVuKCk7CisgIH0KK307CisKK2NsYXNzIExWYWx1ZVJlZmVyZW5jZVR5cGVMb2MgOgorICAgIHB1YmxpYyBJbmhlcml0aW5nQ29uY3JldGVUeXBlTG9jPFJlZmVyZW5jZVR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZhbHVlUmVmZXJlbmNlVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVmFsdWVSZWZlcmVuY2VUeXBlPiB7CitwdWJsaWM6CisgIFNvdXJjZUxvY2F0aW9uIGdldEFtcExvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U2lnaWxMb2MoKTsKKyAgfQorCisgIHZvaWQgc2V0QW1wTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIHNldFNpZ2lsTG9jKExvYyk7CisgIH0KK307CisKK2NsYXNzIFJWYWx1ZVJlZmVyZW5jZVR5cGVMb2MgOgorICAgIHB1YmxpYyBJbmhlcml0aW5nQ29uY3JldGVUeXBlTG9jPFJlZmVyZW5jZVR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlZhbHVlUmVmZXJlbmNlVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVmFsdWVSZWZlcmVuY2VUeXBlPiB7CitwdWJsaWM6CisgIFNvdXJjZUxvY2F0aW9uIGdldEFtcEFtcExvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U2lnaWxMb2MoKTsKKyAgfQorCisgIHZvaWQgc2V0QW1wQW1wTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIHNldFNpZ2lsTG9jKExvYyk7CisgIH0KK307CisKK3N0cnVjdCBGdW5jdGlvbkxvY0luZm8geworICBTb3VyY2VMb2NhdGlvbiBMb2NhbFJhbmdlQmVnaW47CisgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYzsKKyAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jOworICBTb3VyY2VMb2NhdGlvbiBMb2NhbFJhbmdlRW5kOworfTsKKworLy8vIFxicmllZiBXcmFwcGVyIGZvciBzb3VyY2UgaW5mbyBmb3IgZnVuY3Rpb25zLgorY2xhc3MgRnVuY3Rpb25UeXBlTG9jIDogcHVibGljIENvbmNyZXRlVHlwZUxvYzxVbnF1YWxUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25Mb2NJbmZvPiB7CisgIGJvb2wgaGFzRXhjZXB0aW9uU3BlYygpIGNvbnN0IHsKKyAgICBpZiAoYXV0byAqRlBUID0gZHluX2Nhc3Q8RnVuY3Rpb25Qcm90b1R5cGU+KGdldFR5cGVQdHIoKSkpIHsKKyAgICAgIHJldHVybiBGUFQtPmhhc0V4Y2VwdGlvblNwZWMoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgU291cmNlUmFuZ2UgKmdldEV4Y2VwdGlvblNwZWNSYW5nZVB0cigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaGFzRXhjZXB0aW9uU3BlYygpICYmICJObyBleGNlcHRpb24gc3BlYyByYW5nZSIpOworICAgIC8vIEFmdGVyIHRoZSBJbmZvIGNvbWVzIHRoZSBQYXJtVmFyRGVjbCBhcnJheSwgYW5kIGFmdGVyIHRoYXQgY29tZXMgdGhlCisgICAgLy8gZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gaW5mb3JtYXRpb24uCisgICAgcmV0dXJuIChTb3VyY2VSYW5nZSAqKShnZXRQYXJtQXJyYXkoKSArIGdldE51bVBhcmFtcygpKTsKKyAgfQorCitwdWJsaWM6CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2FsUmFuZ2VCZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TG9jYWxEYXRhKCktPkxvY2FsUmFuZ2VCZWdpbjsKKyAgfQorCisgIHZvaWQgc2V0TG9jYWxSYW5nZUJlZ2luKFNvdXJjZUxvY2F0aW9uIEwpIHsKKyAgICBnZXRMb2NhbERhdGEoKS0+TG9jYWxSYW5nZUJlZ2luID0gTDsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2FsUmFuZ2VFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExvY2FsRGF0YSgpLT5Mb2NhbFJhbmdlRW5kOworICB9CisKKyAgdm9pZCBzZXRMb2NhbFJhbmdlRW5kKFNvdXJjZUxvY2F0aW9uIEwpIHsKKyAgICBnZXRMb2NhbERhdGEoKS0+TG9jYWxSYW5nZUVuZCA9IEw7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMUGFyZW5Mb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPmdldExvY2FsRGF0YSgpLT5MUGFyZW5Mb2M7CisgIH0KKworICB2b2lkIHNldExQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICB0aGlzLT5nZXRMb2NhbERhdGEoKS0+TFBhcmVuTG9jID0gTG9jOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0UlBhcmVuTG9jKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRMb2NhbERhdGEoKS0+UlBhcmVuTG9jOworICB9CisKKyAgdm9pZCBzZXRSUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgdGhpcy0+Z2V0TG9jYWxEYXRhKCktPlJQYXJlbkxvYyA9IExvYzsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldFBhcmVuc1JhbmdlKCkgY29uc3QgeworICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRMUGFyZW5Mb2MoKSwgZ2V0UlBhcmVuTG9jKCkpOworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0RXhjZXB0aW9uU3BlY1JhbmdlKCkgY29uc3QgeworICAgIGlmIChoYXNFeGNlcHRpb25TcGVjKCkpCisgICAgICByZXR1cm4gKmdldEV4Y2VwdGlvblNwZWNSYW5nZVB0cigpOworICAgIHJldHVybiB7fTsKKyAgfQorCisgIHZvaWQgc2V0RXhjZXB0aW9uU3BlY1JhbmdlKFNvdXJjZVJhbmdlIFIpIHsKKyAgICBpZiAoaGFzRXhjZXB0aW9uU3BlYygpKQorICAgICAgKmdldEV4Y2VwdGlvblNwZWNSYW5nZVB0cigpID0gUjsKKyAgfQorCisgIEFycmF5UmVmPFBhcm1WYXJEZWNsICo+IGdldFBhcmFtcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKGdldFBhcm1BcnJheSgpLCBnZXROdW1QYXJhbXMoKSk7CisgIH0KKworICAvLyBQYXJtVmFyRGVjbHMqIGFyZSBzdG9yZWQgYWZ0ZXIgSW5mbywgb25lIGZvciBlYWNoIHBhcmFtZXRlci4KKyAgUGFybVZhckRlY2wgKipnZXRQYXJtQXJyYXkoKSBjb25zdCB7CisgICAgcmV0dXJuIChQYXJtVmFyRGVjbCoqKSBnZXRFeHRyYUxvY2FsRGF0YSgpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtUGFyYW1zKCkgY29uc3QgeworICAgIGlmIChpc2E8RnVuY3Rpb25Ob1Byb3RvVHlwZT4oZ2V0VHlwZVB0cigpKSkKKyAgICAgIHJldHVybiAwOworICAgIHJldHVybiBjYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihnZXRUeXBlUHRyKCkpLT5nZXROdW1QYXJhbXMoKTsKKyAgfQorCisgIFBhcm1WYXJEZWNsICpnZXRQYXJhbSh1bnNpZ25lZCBpKSBjb25zdCB7IHJldHVybiBnZXRQYXJtQXJyYXkoKVtpXTsgfQorICB2b2lkIHNldFBhcmFtKHVuc2lnbmVkIGksIFBhcm1WYXJEZWNsICpWRCkgeyBnZXRQYXJtQXJyYXkoKVtpXSA9IFZEOyB9CisKKyAgVHlwZUxvYyBnZXRSZXR1cm5Mb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldElubmVyVHlwZUxvYygpOworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0TG9jYWxTb3VyY2VSYW5nZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0TG9jYWxSYW5nZUJlZ2luKCksIGdldExvY2FsUmFuZ2VFbmQoKSk7CisgIH0KKworICB2b2lkIGluaXRpYWxpemVMb2NhbChBU1RDb250ZXh0ICZDb250ZXh0LCBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBzZXRMb2NhbFJhbmdlQmVnaW4oTG9jKTsKKyAgICBzZXRMUGFyZW5Mb2MoTG9jKTsKKyAgICBzZXRSUGFyZW5Mb2MoTG9jKTsKKyAgICBzZXRMb2NhbFJhbmdlRW5kKExvYyk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bVBhcmFtcygpOyBpICE9IGU7ICsraSkKKyAgICAgIHNldFBhcmFtKGksIG51bGxwdHIpOworICAgIGlmIChoYXNFeGNlcHRpb25TcGVjKCkpCisgICAgICBzZXRFeGNlcHRpb25TcGVjUmFuZ2UoTG9jKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgdHlwZSBzb3VyY2UgaW5mbyBkYXRhIGJsb2NrIHRoYXQgaXMKKyAgLy8vIHNwZWNpZmljIHRvIHRoaXMgdHlwZS4KKyAgdW5zaWduZWQgZ2V0RXh0cmFMb2NhbERhdGFTaXplKCkgY29uc3QgeworICAgIHVuc2lnbmVkIEV4Y2VwdFNwZWNTaXplID0gaGFzRXhjZXB0aW9uU3BlYygpID8gc2l6ZW9mKFNvdXJjZVJhbmdlKSA6IDA7CisgICAgcmV0dXJuIChnZXROdW1QYXJhbXMoKSAqIHNpemVvZihQYXJtVmFyRGVjbCAqKSkgKyBFeGNlcHRTcGVjU2l6ZTsKKyAgfQorCisgIHVuc2lnbmVkIGdldEV4dHJhTG9jYWxEYXRhQWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gYWxpZ25vZihQYXJtVmFyRGVjbCAqKTsgfQorCisgIFF1YWxUeXBlIGdldElubmVyVHlwZSgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVQdHIoKS0+Z2V0UmV0dXJuVHlwZSgpOyB9Cit9OworCitjbGFzcyBGdW5jdGlvblByb3RvVHlwZUxvYyA6CisgICAgcHVibGljIEluaGVyaXRpbmdDb25jcmV0ZVR5cGVMb2M8RnVuY3Rpb25UeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uUHJvdG9UeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uUHJvdG9UeXBlPiB7Cit9OworCitjbGFzcyBGdW5jdGlvbk5vUHJvdG9UeXBlTG9jIDoKKyAgICBwdWJsaWMgSW5oZXJpdGluZ0NvbmNyZXRlVHlwZUxvYzxGdW5jdGlvblR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25Ob1Byb3RvVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbk5vUHJvdG9UeXBlPiB7Cit9OworCitzdHJ1Y3QgQXJyYXlMb2NJbmZvIHsKKyAgU291cmNlTG9jYXRpb24gTEJyYWNrZXRMb2MsIFJCcmFja2V0TG9jOworICBFeHByICpTaXplOworfTsKKworLy8vIFxicmllZiBXcmFwcGVyIGZvciBzb3VyY2UgaW5mbyBmb3IgYXJyYXlzLgorY2xhc3MgQXJyYXlUeXBlTG9jIDogcHVibGljIENvbmNyZXRlVHlwZUxvYzxVbnF1YWxUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMb2NJbmZvPiB7CitwdWJsaWM6CisgIFNvdXJjZUxvY2F0aW9uIGdldExCcmFja2V0TG9jKCkgY29uc3QgeworICAgIHJldHVybiBnZXRMb2NhbERhdGEoKS0+TEJyYWNrZXRMb2M7CisgIH0KKworICB2b2lkIHNldExCcmFja2V0TG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIGdldExvY2FsRGF0YSgpLT5MQnJhY2tldExvYyA9IExvYzsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFJCcmFja2V0TG9jKCkgY29uc3QgeworICAgIHJldHVybiBnZXRMb2NhbERhdGEoKS0+UkJyYWNrZXRMb2M7CisgIH0KKworICB2b2lkIHNldFJCcmFja2V0TG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIGdldExvY2FsRGF0YSgpLT5SQnJhY2tldExvYyA9IExvYzsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldEJyYWNrZXRzUmFuZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIFNvdXJjZVJhbmdlKGdldExCcmFja2V0TG9jKCksIGdldFJCcmFja2V0TG9jKCkpOworICB9CisKKyAgRXhwciAqZ2V0U2l6ZUV4cHIoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExvY2FsRGF0YSgpLT5TaXplOworICB9CisKKyAgdm9pZCBzZXRTaXplRXhwcihFeHByICpTaXplKSB7CisgICAgZ2V0TG9jYWxEYXRhKCktPlNpemUgPSBTaXplOworICB9CisKKyAgVHlwZUxvYyBnZXRFbGVtZW50TG9jKCkgY29uc3QgeworICAgIHJldHVybiBnZXRJbm5lclR5cGVMb2MoKTsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldExvY2FsU291cmNlUmFuZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIFNvdXJjZVJhbmdlKGdldExCcmFja2V0TG9jKCksIGdldFJCcmFja2V0TG9jKCkpOworICB9CisKKyAgdm9pZCBpbml0aWFsaXplTG9jYWwoQVNUQ29udGV4dCAmQ29udGV4dCwgU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgc2V0TEJyYWNrZXRMb2MoTG9jKTsKKyAgICBzZXRSQnJhY2tldExvYyhMb2MpOworICAgIHNldFNpemVFeHByKG51bGxwdHIpOworICB9CisKKyAgUXVhbFR5cGUgZ2V0SW5uZXJUeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZVB0cigpLT5nZXRFbGVtZW50VHlwZSgpOyB9Cit9OworCitjbGFzcyBDb25zdGFudEFycmF5VHlwZUxvYyA6CisgICAgcHVibGljIEluaGVyaXRpbmdDb25jcmV0ZVR5cGVMb2M8QXJyYXlUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50QXJyYXlUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50QXJyYXlUeXBlPiB7Cit9OworCitjbGFzcyBJbmNvbXBsZXRlQXJyYXlUeXBlTG9jIDoKKyAgICBwdWJsaWMgSW5oZXJpdGluZ0NvbmNyZXRlVHlwZUxvYzxBcnJheVR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jb21wbGV0ZUFycmF5VHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNvbXBsZXRlQXJyYXlUeXBlPiB7Cit9OworCitjbGFzcyBEZXBlbmRlbnRTaXplZEFycmF5VHlwZUxvYyA6CisgICAgcHVibGljIEluaGVyaXRpbmdDb25jcmV0ZVR5cGVMb2M8QXJyYXlUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZGVudFNpemVkQXJyYXlUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZGVudFNpemVkQXJyYXlUeXBlPiB7CitwdWJsaWM6CisgIHZvaWQgaW5pdGlhbGl6ZUxvY2FsKEFTVENvbnRleHQgJkNvbnRleHQsIFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIEFycmF5VHlwZUxvYzo6aW5pdGlhbGl6ZUxvY2FsKENvbnRleHQsIExvYyk7CisgICAgc2V0U2l6ZUV4cHIoZ2V0VHlwZVB0cigpLT5nZXRTaXplRXhwcigpKTsKKyAgfQorfTsKKworY2xhc3MgVmFyaWFibGVBcnJheVR5cGVMb2MgOgorICAgIHB1YmxpYyBJbmhlcml0aW5nQ29uY3JldGVUeXBlTG9jPEFycmF5VHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZUFycmF5VHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZUFycmF5VHlwZT4geworfTsKKworLy8gTG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIGEgVGVtcGxhdGVOYW1lLiAgUnVkaW1lbnRhcnkgZm9yIG5vdy4KK3N0cnVjdCBUZW1wbGF0ZU5hbWVMb2NJbmZvIHsKKyAgU291cmNlTG9jYXRpb24gTmFtZUxvYzsKK307CisKK3N0cnVjdCBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uTG9jSW5mbyA6IFRlbXBsYXRlTmFtZUxvY0luZm8geworICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUtXTG9jOworICBTb3VyY2VMb2NhdGlvbiBMQW5nbGVMb2M7CisgIFNvdXJjZUxvY2F0aW9uIFJBbmdsZUxvYzsKK307CisKK2NsYXNzIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlTG9jIDoKKyAgICBwdWJsaWMgQ29uY3JldGVUeXBlTG9jPFVucXVhbFR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVTcGVjaWFsaXphdGlvbkxvY0luZm8+IHsKK3B1YmxpYzoKKyAgU291cmNlTG9jYXRpb24gZ2V0VGVtcGxhdGVLZXl3b3JkTG9jKCkgY29uc3QgeworICAgIHJldHVybiBnZXRMb2NhbERhdGEoKS0+VGVtcGxhdGVLV0xvYzsKKyAgfQorCisgIHZvaWQgc2V0VGVtcGxhdGVLZXl3b3JkTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIGdldExvY2FsRGF0YSgpLT5UZW1wbGF0ZUtXTG9jID0gTG9jOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TEFuZ2xlTG9jKCkgY29uc3QgeworICAgIHJldHVybiBnZXRMb2NhbERhdGEoKS0+TEFuZ2xlTG9jOworICB9CisKKyAgdm9pZCBzZXRMQW5nbGVMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgZ2V0TG9jYWxEYXRhKCktPkxBbmdsZUxvYyA9IExvYzsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFJBbmdsZUxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TG9jYWxEYXRhKCktPlJBbmdsZUxvYzsKKyAgfQorCisgIHZvaWQgc2V0UkFuZ2xlTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIGdldExvY2FsRGF0YSgpLT5SQW5nbGVMb2MgPSBMb2M7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUeXBlUHRyKCktPmdldE51bUFyZ3MoKTsKKyAgfQorCisgIHZvaWQgc2V0QXJnTG9jSW5mbyh1bnNpZ25lZCBpLCBUZW1wbGF0ZUFyZ3VtZW50TG9jSW5mbyBBSSkgeworICAgIGdldEFyZ0luZm9zKClbaV0gPSBBSTsKKyAgfQorCisgIFRlbXBsYXRlQXJndW1lbnRMb2NJbmZvIGdldEFyZ0xvY0luZm8odW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBnZXRBcmdJbmZvcygpW2ldOworICB9CisKKyAgVGVtcGxhdGVBcmd1bWVudExvYyBnZXRBcmdMb2ModW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBUZW1wbGF0ZUFyZ3VtZW50TG9jKGdldFR5cGVQdHIoKS0+Z2V0QXJnKGkpLCBnZXRBcmdMb2NJbmZvKGkpKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFRlbXBsYXRlTmFtZUxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TG9jYWxEYXRhKCktPk5hbWVMb2M7CisgIH0KKworICB2b2lkIHNldFRlbXBsYXRlTmFtZUxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBnZXRMb2NhbERhdGEoKS0+TmFtZUxvYyA9IExvYzsKKyAgfQorCisgIC8vLyBcYnJpZWYgLSBDb3B5IHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBnaXZlbiBpbmZvLgorICB2b2lkIGNvcHkoVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGVMb2MgTG9jKSB7CisgICAgdW5zaWduZWQgc2l6ZSA9IGdldEZ1bGxEYXRhU2l6ZSgpOworICAgIGFzc2VydChzaXplID09IExvYy5nZXRGdWxsRGF0YVNpemUoKSk7CisKKyAgICAvLyBXZSdyZSBwb3RlbnRpYWxseSBjb3B5aW5nIEV4cHIgcmVmZXJlbmNlcyBoZXJlLiAgV2UgZG9uJ3QKKyAgICAvLyBib3RoZXIgcmV0YWluaW5nIHRoZW0gYmVjYXVzZSBUeXBlU291cmNlSW5mb3MgbGl2ZSBmb3JldmVyLCBzbworICAgIC8vIGFzIGxvbmcgYXMgdGhlIEV4cHIgd2FzIHJldGFpbmVkIHdoZW4gb3JpZ2luYWxseSB3cml0dGVuIGludG8KKyAgICAvLyB0aGUgVHlwZUxvYywgd2UncmUgb2theS4KKyAgICBtZW1jcHkoRGF0YSwgTG9jLkRhdGEsIHNpemUpOworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0TG9jYWxTb3VyY2VSYW5nZSgpIGNvbnN0IHsKKyAgICBpZiAoZ2V0VGVtcGxhdGVLZXl3b3JkTG9jKCkuaXNWYWxpZCgpKQorICAgICAgcmV0dXJuIFNvdXJjZVJhbmdlKGdldFRlbXBsYXRlS2V5d29yZExvYygpLCBnZXRSQW5nbGVMb2MoKSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIFNvdXJjZVJhbmdlKGdldFRlbXBsYXRlTmFtZUxvYygpLCBnZXRSQW5nbGVMb2MoKSk7CisgIH0KKworICB2b2lkIGluaXRpYWxpemVMb2NhbChBU1RDb250ZXh0ICZDb250ZXh0LCBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBzZXRUZW1wbGF0ZUtleXdvcmRMb2MoTG9jKTsKKyAgICBzZXRUZW1wbGF0ZU5hbWVMb2MoTG9jKTsKKyAgICBzZXRMQW5nbGVMb2MoTG9jKTsKKyAgICBzZXRSQW5nbGVMb2MoTG9jKTsKKyAgICBpbml0aWFsaXplQXJnTG9jcyhDb250ZXh0LCBnZXROdW1BcmdzKCksIGdldFR5cGVQdHIoKS0+Z2V0QXJncygpLAorICAgICAgICAgICAgICAgICAgICAgIGdldEFyZ0luZm9zKCksIExvYyk7CisgIH0KKworICBzdGF0aWMgdm9pZCBpbml0aWFsaXplQXJnTG9jcyhBU1RDb250ZXh0ICZDb250ZXh0LCB1bnNpZ25lZCBOdW1BcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUFyZ3VtZW50TG9jSW5mbyAqQXJnSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYyk7CisKKyAgdW5zaWduZWQgZ2V0RXh0cmFMb2NhbERhdGFTaXplKCkgY29uc3QgeworICAgIHJldHVybiBnZXROdW1BcmdzKCkgKiBzaXplb2YoVGVtcGxhdGVBcmd1bWVudExvY0luZm8pOworICB9CisKKyAgdW5zaWduZWQgZ2V0RXh0cmFMb2NhbERhdGFBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGFsaWdub2YoVGVtcGxhdGVBcmd1bWVudExvY0luZm8pOworICB9CisKK3ByaXZhdGU6CisgIFRlbXBsYXRlQXJndW1lbnRMb2NJbmZvICpnZXRBcmdJbmZvcygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VGVtcGxhdGVBcmd1bWVudExvY0luZm8qPihnZXRFeHRyYUxvY2FsRGF0YSgpKTsKKyAgfQorfTsKKworc3RydWN0IERlcGVuZGVudEFkZHJlc3NTcGFjZUxvY0luZm8geworICBFeHByICpFeHByT3BlcmFuZDsKKyAgU291cmNlUmFuZ2UgT3BlcmFuZFBhcmVuczsKKyAgU291cmNlTG9jYXRpb24gQXR0ckxvYzsKK307CisKK2NsYXNzIERlcGVuZGVudEFkZHJlc3NTcGFjZVR5cGVMb2MKKyAgICA6IHB1YmxpYyBDb25jcmV0ZVR5cGVMb2M8VW5xdWFsVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwZW5kZW50QWRkcmVzc1NwYWNlVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwZW5kZW50QWRkcmVzc1NwYWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwZW5kZW50QWRkcmVzc1NwYWNlTG9jSW5mbz4geworcHVibGljOgorICAvLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZSwgaS5lLgorICAvLy8gICAgaW50ICogX19hdHRyaWJ1dGVfXygoYWRkcmVzc19zcGFjZSgxMSkpKQorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgXn5+fn5+fn5+fn5+fgorICBTb3VyY2VMb2NhdGlvbiBnZXRBdHRyTmFtZUxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TG9jYWxEYXRhKCktPkF0dHJMb2M7CisgIH0KKyAgdm9pZCBzZXRBdHRyTmFtZUxvYyhTb3VyY2VMb2NhdGlvbiBsb2MpIHsKKyAgICBnZXRMb2NhbERhdGEoKS0+QXR0ckxvYyA9IGxvYzsKKyAgfQorCisgIC8vLyBUaGUgYXR0cmlidXRlJ3MgZXhwcmVzc2lvbiBvcGVyYW5kLCBpZiBpdCBoYXMgb25lLgorICAvLy8gICAgaW50ICogX19hdHRyaWJ1dGVfXygoYWRkcmVzc19zcGFjZSgxMSkpKQorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBefgorICBFeHByICpnZXRBdHRyRXhwck9wZXJhbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExvY2FsRGF0YSgpLT5FeHByT3BlcmFuZDsKKyAgfQorICB2b2lkIHNldEF0dHJFeHByT3BlcmFuZChFeHByICplKSB7CisgICAgZ2V0TG9jYWxEYXRhKCktPkV4cHJPcGVyYW5kID0gZTsKKyAgfQorCisgIC8vLyBUaGUgbG9jYXRpb24gb2YgdGhlIHBhcmVudGhlc2VzIGFyb3VuZCB0aGUgb3BlcmFuZCwgaWYgdGhlcmUgaXMKKyAgLy8vIGFuIG9wZXJhbmQuCisgIC8vLyAgICBpbnQgKiBfX2F0dHJpYnV0ZV9fKChhZGRyZXNzX3NwYWNlKDExKSkpCisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgXgorICBTb3VyY2VSYW5nZSBnZXRBdHRyT3BlcmFuZFBhcmVuc1JhbmdlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRMb2NhbERhdGEoKS0+T3BlcmFuZFBhcmVuczsKKyAgfQorICB2b2lkIHNldEF0dHJPcGVyYW5kUGFyZW5zUmFuZ2UoU291cmNlUmFuZ2UgcmFuZ2UpIHsKKyAgICBnZXRMb2NhbERhdGEoKS0+T3BlcmFuZFBhcmVucyA9IHJhbmdlOworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0TG9jYWxTb3VyY2VSYW5nZSgpIGNvbnN0IHsKKyAgICBTb3VyY2VSYW5nZSByYW5nZShnZXRBdHRyTmFtZUxvYygpKTsKKyAgICByYW5nZS5zZXRFbmQoZ2V0QXR0ck9wZXJhbmRQYXJlbnNSYW5nZSgpLmdldEVuZCgpKTsKKyAgICByZXR1cm4gcmFuZ2U7CisgIH0KKworICAvLy8gIFJldHVybnMgdGhlIHR5cGUgYmVmb3JlIHRoZSBhZGRyZXNzIHNwYWNlIGF0dHJpYnV0ZSBhcHBsaWNhdGlvbiAKKyAgLy8vICBhcmVhLiAgIAorICAvLy8gICAgaW50ICogX19hdHRyaWJ1dGVfXygoYWRkcmVzc19zcGFjZSgxMSkpKSAqCisgIC8vLyAgICBeICAgXiAgICAgICAgICAKKyAgUXVhbFR5cGUgZ2V0SW5uZXJUeXBlKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRUeXBlUHRyKCktPmdldFBvaW50ZWVUeXBlKCk7CisgIH0KKworICBUeXBlTG9jIGdldFBvaW50ZWVUeXBlTG9jKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRJbm5lclR5cGVMb2MoKTsKKyAgfQorCisgIHZvaWQgaW5pdGlhbGl6ZUxvY2FsKEFTVENvbnRleHQgJkNvbnRleHQsIFNvdXJjZUxvY2F0aW9uIGxvYykgeworICAgIHNldEF0dHJOYW1lTG9jKGxvYyk7CisgICAgc2V0QXR0ck9wZXJhbmRQYXJlbnNSYW5nZShTb3VyY2VSYW5nZShsb2MpKTsKKyAgICBzZXRBdHRyRXhwck9wZXJhbmQoZ2V0VHlwZVB0cigpLT5nZXRBZGRyU3BhY2VFeHByKCkpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBBbGwgb2YgdGhlc2UgbmVlZCBwcm9wZXIgaW1wbGVtZW50YXRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIEZJWE1FOiBzaXplIGV4cHJlc3Npb24gYW5kIGF0dHJpYnV0ZSBsb2NhdGlvbnMgKG9yIGtleXdvcmQgaWYgd2UKKy8vIGV2ZXIgZnVsbHkgc3VwcG9ydCBhbHRpdmVjIHN5bnRheCkuCitjbGFzcyBWZWN0b3JUeXBlTG9jIDogcHVibGljIEluaGVyaXRpbmdDb25jcmV0ZVR5cGVMb2M8VHlwZVNwZWNUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvclR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZT4geworfTsKKworLy8gRklYTUU6IHNpemUgZXhwcmVzc2lvbiBhbmQgYXR0cmlidXRlIGxvY2F0aW9ucy4KK2NsYXNzIEV4dFZlY3RvclR5cGVMb2MgOiBwdWJsaWMgSW5oZXJpdGluZ0NvbmNyZXRlVHlwZUxvYzxWZWN0b3JUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZlY3RvclR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmVjdG9yVHlwZT4geworfTsKKworLy8gRklYTUU6IGF0dHJpYnV0ZSBsb2NhdGlvbnMuCisvLyBGb3Igc29tZSByZWFzb24sIHRoaXMgaXNuJ3QgYSBzdWJ0eXBlIG9mIFZlY3RvclR5cGUuCitjbGFzcyBEZXBlbmRlbnRTaXplZEV4dFZlY3RvclR5cGVMb2MgOgorICAgIHB1YmxpYyBJbmhlcml0aW5nQ29uY3JldGVUeXBlTG9jPFR5cGVTcGVjVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRlbnRTaXplZEV4dFZlY3RvclR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwZW5kZW50U2l6ZWRFeHRWZWN0b3JUeXBlPiB7Cit9OworCisvLyBGSVhNRTogbG9jYXRpb24gb2YgdGhlICdfQ29tcGxleCcga2V5d29yZC4KK2NsYXNzIENvbXBsZXhUeXBlTG9jIDogcHVibGljIEluaGVyaXRpbmdDb25jcmV0ZVR5cGVMb2M8VHlwZVNwZWNUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV4VHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxleFR5cGU+IHsKK307CisKK3N0cnVjdCBUeXBlb2ZMb2NJbmZvIHsKKyAgU291cmNlTG9jYXRpb24gVHlwZW9mTG9jOworICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2M7CisgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYzsKK307CisKK3N0cnVjdCBUeXBlT2ZFeHByVHlwZUxvY0luZm8gOiBwdWJsaWMgVHlwZW9mTG9jSW5mbyB7Cit9OworCitzdHJ1Y3QgVHlwZU9mVHlwZUxvY0luZm8gOiBwdWJsaWMgVHlwZW9mTG9jSW5mbyB7CisgIFR5cGVTb3VyY2VJbmZvKiBVbmRlcmx5aW5nVEluZm87Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZCwgY2xhc3MgVHlwZUNsYXNzLCBjbGFzcyBMb2NhbERhdGEgPSBUeXBlb2ZMb2NJbmZvPgorY2xhc3MgVHlwZW9mTGlrZVR5cGVMb2MKKyAgOiBwdWJsaWMgQ29uY3JldGVUeXBlTG9jPFVucXVhbFR5cGVMb2MsIERlcml2ZWQsIFR5cGVDbGFzcywgTG9jYWxEYXRhPiB7CitwdWJsaWM6CisgIFNvdXJjZUxvY2F0aW9uIGdldFR5cGVvZkxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+Z2V0TG9jYWxEYXRhKCktPlR5cGVvZkxvYzsKKyAgfQorCisgIHZvaWQgc2V0VHlwZW9mTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIHRoaXMtPmdldExvY2FsRGF0YSgpLT5UeXBlb2ZMb2MgPSBMb2M7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMUGFyZW5Mb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPmdldExvY2FsRGF0YSgpLT5MUGFyZW5Mb2M7CisgIH0KKworICB2b2lkIHNldExQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICB0aGlzLT5nZXRMb2NhbERhdGEoKS0+TFBhcmVuTG9jID0gTG9jOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0UlBhcmVuTG9jKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRMb2NhbERhdGEoKS0+UlBhcmVuTG9jOworICB9CisKKyAgdm9pZCBzZXRSUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgdGhpcy0+Z2V0TG9jYWxEYXRhKCktPlJQYXJlbkxvYyA9IExvYzsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldFBhcmVuc1JhbmdlKCkgY29uc3QgeworICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRMUGFyZW5Mb2MoKSwgZ2V0UlBhcmVuTG9jKCkpOworICB9CisKKyAgdm9pZCBzZXRQYXJlbnNSYW5nZShTb3VyY2VSYW5nZSByYW5nZSkgeworICAgICAgc2V0TFBhcmVuTG9jKHJhbmdlLmdldEJlZ2luKCkpOworICAgICAgc2V0UlBhcmVuTG9jKHJhbmdlLmdldEVuZCgpKTsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldExvY2FsU291cmNlUmFuZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIFNvdXJjZVJhbmdlKGdldFR5cGVvZkxvYygpLCBnZXRSUGFyZW5Mb2MoKSk7CisgIH0KKworICB2b2lkIGluaXRpYWxpemVMb2NhbChBU1RDb250ZXh0ICZDb250ZXh0LCBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBzZXRUeXBlb2ZMb2MoTG9jKTsKKyAgICBzZXRMUGFyZW5Mb2MoTG9jKTsKKyAgICBzZXRSUGFyZW5Mb2MoTG9jKTsKKyAgfQorfTsKKworY2xhc3MgVHlwZU9mRXhwclR5cGVMb2MgOiBwdWJsaWMgVHlwZW9mTGlrZVR5cGVMb2M8VHlwZU9mRXhwclR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlT2ZFeHByVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVPZkV4cHJUeXBlTG9jSW5mbz4geworcHVibGljOgorICBFeHByKiBnZXRVbmRlcmx5aW5nRXhwcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHlwZVB0cigpLT5nZXRVbmRlcmx5aW5nRXhwcigpOworICB9CisKKyAgLy8gUmVpbXBsZW1lbnRlZCB0byBhY2NvdW50IGZvciBHTlUvQysrIGV4dGVuc2lvbgorICAvLyAgICAgdHlwZW9mIHVuYXJ5LWV4cHJlc3Npb24KKyAgLy8gd2hlcmUgdGhlcmUgYXJlIG5vIHBhcmVudGhlc2VzLgorICBTb3VyY2VSYW5nZSBnZXRMb2NhbFNvdXJjZVJhbmdlKCkgY29uc3Q7Cit9OworCitjbGFzcyBUeXBlT2ZUeXBlTG9jCisgIDogcHVibGljIFR5cGVvZkxpa2VUeXBlTG9jPFR5cGVPZlR5cGVMb2MsIFR5cGVPZlR5cGUsIFR5cGVPZlR5cGVMb2NJbmZvPiB7CitwdWJsaWM6CisgIFF1YWxUeXBlIGdldFVuZGVybHlpbmdUeXBlKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRUeXBlUHRyKCktPmdldFVuZGVybHlpbmdUeXBlKCk7CisgIH0KKworICBUeXBlU291cmNlSW5mbyogZ2V0VW5kZXJseWluZ1RJbmZvKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRMb2NhbERhdGEoKS0+VW5kZXJseWluZ1RJbmZvOworICB9CisKKyAgdm9pZCBzZXRVbmRlcmx5aW5nVEluZm8oVHlwZVNvdXJjZUluZm8qIFRJKSBjb25zdCB7CisgICAgdGhpcy0+Z2V0TG9jYWxEYXRhKCktPlVuZGVybHlpbmdUSW5mbyA9IFRJOworICB9CisKKyAgdm9pZCBpbml0aWFsaXplTG9jYWwoQVNUQ29udGV4dCAmQ29udGV4dCwgU291cmNlTG9jYXRpb24gTG9jKTsKK307CisKKy8vIEZJWE1FOiBsb2NhdGlvbiBvZiB0aGUgJ2RlY2x0eXBlJyBhbmQgcGFyZW5zLgorY2xhc3MgRGVjbHR5cGVUeXBlTG9jIDogcHVibGljIEluaGVyaXRpbmdDb25jcmV0ZVR5cGVMb2M8VHlwZVNwZWNUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbHR5cGVUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbHR5cGVUeXBlPiB7CitwdWJsaWM6CisgIEV4cHIgKmdldFVuZGVybHlpbmdFeHByKCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZVB0cigpLT5nZXRVbmRlcmx5aW5nRXhwcigpOyB9Cit9OworCitzdHJ1Y3QgVW5hcnlUcmFuc2Zvcm1UeXBlTG9jSW5mbyB7CisgIC8vIEZJWE1FOiBXaGlsZSB0aGVyZSdzIG9ubHkgb25lIHVuYXJ5IHRyYW5zZm9ybSByaWdodCBub3csIGZ1dHVyZSBvbmVzIG1heQorICAvLyBuZWVkIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbnMKKyAgU291cmNlTG9jYXRpb24gS1dMb2MsIExQYXJlbkxvYywgUlBhcmVuTG9jOworICBUeXBlU291cmNlSW5mbyAqVW5kZXJseWluZ1RJbmZvOworfTsKKworY2xhc3MgVW5hcnlUcmFuc2Zvcm1UeXBlTG9jIDogcHVibGljIENvbmNyZXRlVHlwZUxvYzxVbnF1YWxUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuYXJ5VHJhbnNmb3JtVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmFyeVRyYW5zZm9ybVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5hcnlUcmFuc2Zvcm1UeXBlTG9jSW5mbz4geworcHVibGljOgorICBTb3VyY2VMb2NhdGlvbiBnZXRLV0xvYygpIGNvbnN0IHsgcmV0dXJuIGdldExvY2FsRGF0YSgpLT5LV0xvYzsgfQorICB2b2lkIHNldEtXTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBnZXRMb2NhbERhdGEoKS0+S1dMb2MgPSBMb2M7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBnZXRMb2NhbERhdGEoKS0+TFBhcmVuTG9jOyB9CisgIHZvaWQgc2V0TFBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBnZXRMb2NhbERhdGEoKS0+TFBhcmVuTG9jID0gTG9jOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0UlBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gZ2V0TG9jYWxEYXRhKCktPlJQYXJlbkxvYzsgfQorICB2b2lkIHNldFJQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgZ2V0TG9jYWxEYXRhKCktPlJQYXJlbkxvYyA9IExvYzsgfQorCisgIFR5cGVTb3VyY2VJbmZvKiBnZXRVbmRlcmx5aW5nVEluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExvY2FsRGF0YSgpLT5VbmRlcmx5aW5nVEluZm87CisgIH0KKworICB2b2lkIHNldFVuZGVybHlpbmdUSW5mbyhUeXBlU291cmNlSW5mbyAqVEluZm8pIHsKKyAgICBnZXRMb2NhbERhdGEoKS0+VW5kZXJseWluZ1RJbmZvID0gVEluZm87CisgIH0KKworICBTb3VyY2VSYW5nZSBnZXRMb2NhbFNvdXJjZVJhbmdlKCkgY29uc3QgeworICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRLV0xvYygpLCBnZXRSUGFyZW5Mb2MoKSk7CisgIH0KKworICBTb3VyY2VSYW5nZSBnZXRQYXJlbnNSYW5nZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0TFBhcmVuTG9jKCksIGdldFJQYXJlbkxvYygpKTsKKyAgfQorCisgIHZvaWQgc2V0UGFyZW5zUmFuZ2UoU291cmNlUmFuZ2UgUmFuZ2UpIHsKKyAgICBzZXRMUGFyZW5Mb2MoUmFuZ2UuZ2V0QmVnaW4oKSk7CisgICAgc2V0UlBhcmVuTG9jKFJhbmdlLmdldEVuZCgpKTsKKyAgfQorCisgIHZvaWQgaW5pdGlhbGl6ZUxvY2FsKEFTVENvbnRleHQgJkNvbnRleHQsIFNvdXJjZUxvY2F0aW9uIExvYyk7Cit9OworCitjbGFzcyBEZWR1Y2VkVHlwZUxvYworICAgIDogcHVibGljIEluaGVyaXRpbmdDb25jcmV0ZVR5cGVMb2M8VHlwZVNwZWNUeXBlTG9jLCBEZWR1Y2VkVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZHVjZWRUeXBlPiB7fTsKKworY2xhc3MgQXV0b1R5cGVMb2MKKyAgICA6IHB1YmxpYyBJbmhlcml0aW5nQ29uY3JldGVUeXBlTG9jPERlZHVjZWRUeXBlTG9jLCBBdXRvVHlwZUxvYywgQXV0b1R5cGU+IHsKK307CisKK2NsYXNzIERlZHVjZWRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZUxvYworICAgIDogcHVibGljIEluaGVyaXRpbmdDb25jcmV0ZVR5cGVMb2M8RGVkdWNlZFR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWR1Y2VkVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWR1Y2VkVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGU+IHsKK3B1YmxpYzoKKyAgU291cmNlTG9jYXRpb24gZ2V0VGVtcGxhdGVOYW1lTG9jKCkgY29uc3QgeworICAgIHJldHVybiBnZXROYW1lTG9jKCk7CisgIH0KKworICB2b2lkIHNldFRlbXBsYXRlTmFtZUxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBzZXROYW1lTG9jKExvYyk7CisgIH0KK307CisKK3N0cnVjdCBFbGFib3JhdGVkTG9jSW5mbyB7CisgIFNvdXJjZUxvY2F0aW9uIEVsYWJvcmF0ZWRLV0xvYzsKKworICAvLy8gXGJyaWVmIERhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgbG9jYXRpb24uCisgIHZvaWQgKlF1YWxpZmllckRhdGE7Cit9OworCitjbGFzcyBFbGFib3JhdGVkVHlwZUxvYyA6IHB1YmxpYyBDb25jcmV0ZVR5cGVMb2M8VW5xdWFsVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGFib3JhdGVkVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGFib3JhdGVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGFib3JhdGVkTG9jSW5mbz4geworcHVibGljOgorICBTb3VyY2VMb2NhdGlvbiBnZXRFbGFib3JhdGVkS2V5d29yZExvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+Z2V0TG9jYWxEYXRhKCktPkVsYWJvcmF0ZWRLV0xvYzsKKyAgfQorCisgIHZvaWQgc2V0RWxhYm9yYXRlZEtleXdvcmRMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgdGhpcy0+Z2V0TG9jYWxEYXRhKCktPkVsYWJvcmF0ZWRLV0xvYyA9IExvYzsKKyAgfQorCisgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgZ2V0UXVhbGlmaWVyTG9jKCkgY29uc3QgeworICAgIHJldHVybiBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKGdldFR5cGVQdHIoKS0+Z2V0UXVhbGlmaWVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYWxEYXRhKCktPlF1YWxpZmllckRhdGEpOworICB9CisKKyAgdm9pZCBzZXRRdWFsaWZpZXJMb2MoTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MpIHsKKyAgICBhc3NlcnQoUXVhbGlmaWVyTG9jLmdldE5lc3RlZE5hbWVTcGVjaWZpZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBnZXRUeXBlUHRyKCktPmdldFF1YWxpZmllcigpICYmCisgICAgICAgICAgICJJbmNvbnNpc3RlbnQgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHBvaW50ZXIiKTsKKyAgICBnZXRMb2NhbERhdGEoKS0+UXVhbGlmaWVyRGF0YSA9IFF1YWxpZmllckxvYy5nZXRPcGFxdWVEYXRhKCk7CisgIH0KKworICBTb3VyY2VSYW5nZSBnZXRMb2NhbFNvdXJjZVJhbmdlKCkgY29uc3QgeworICAgIGlmIChnZXRFbGFib3JhdGVkS2V5d29yZExvYygpLmlzVmFsaWQoKSkKKyAgICAgIGlmIChnZXRRdWFsaWZpZXJMb2MoKSkKKyAgICAgICAgcmV0dXJuIFNvdXJjZVJhbmdlKGdldEVsYWJvcmF0ZWRLZXl3b3JkTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRRdWFsaWZpZXJMb2MoKS5nZXRFbmRMb2MoKSk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRFbGFib3JhdGVkS2V5d29yZExvYygpKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gZ2V0UXVhbGlmaWVyTG9jKCkuZ2V0U291cmNlUmFuZ2UoKTsKKyAgfQorCisgIHZvaWQgaW5pdGlhbGl6ZUxvY2FsKEFTVENvbnRleHQgJkNvbnRleHQsIFNvdXJjZUxvY2F0aW9uIExvYyk7CisKKyAgVHlwZUxvYyBnZXROYW1lZFR5cGVMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldElubmVyVHlwZUxvYygpOworICB9CisKKyAgUXVhbFR5cGUgZ2V0SW5uZXJUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUeXBlUHRyKCktPmdldE5hbWVkVHlwZSgpOworICB9CisKKyAgdm9pZCBjb3B5KEVsYWJvcmF0ZWRUeXBlTG9jIExvYykgeworICAgIHVuc2lnbmVkIHNpemUgPSBnZXRGdWxsRGF0YVNpemUoKTsKKyAgICBhc3NlcnQoc2l6ZSA9PSBMb2MuZ2V0RnVsbERhdGFTaXplKCkpOworICAgIG1lbWNweShEYXRhLCBMb2MuRGF0YSwgc2l6ZSk7CisgIH0KK307CisKKy8vIFRoaXMgaXMgZXhhY3RseSB0aGUgc3RydWN0dXJlIG9mIGFuIEVsYWJvcmF0ZWRUeXBlTG9jIHdob3NlIGlubmVyCisvLyB0eXBlIGlzIHNvbWUgc29ydCBvZiBUeXBlRGVjbFR5cGVMb2MuCitzdHJ1Y3QgRGVwZW5kZW50TmFtZUxvY0luZm8gOiBFbGFib3JhdGVkTG9jSW5mbyB7CisgIFNvdXJjZUxvY2F0aW9uIE5hbWVMb2M7Cit9OworCitjbGFzcyBEZXBlbmRlbnROYW1lVHlwZUxvYyA6IHB1YmxpYyBDb25jcmV0ZVR5cGVMb2M8VW5xdWFsVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRlbnROYW1lVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRlbnROYW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRlbnROYW1lTG9jSW5mbz4geworcHVibGljOgorICBTb3VyY2VMb2NhdGlvbiBnZXRFbGFib3JhdGVkS2V5d29yZExvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+Z2V0TG9jYWxEYXRhKCktPkVsYWJvcmF0ZWRLV0xvYzsKKyAgfQorCisgIHZvaWQgc2V0RWxhYm9yYXRlZEtleXdvcmRMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgdGhpcy0+Z2V0TG9jYWxEYXRhKCktPkVsYWJvcmF0ZWRLV0xvYyA9IExvYzsKKyAgfQorCisgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgZ2V0UXVhbGlmaWVyTG9jKCkgY29uc3QgeworICAgIHJldHVybiBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKGdldFR5cGVQdHIoKS0+Z2V0UXVhbGlmaWVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYWxEYXRhKCktPlF1YWxpZmllckRhdGEpOworICB9CisKKyAgdm9pZCBzZXRRdWFsaWZpZXJMb2MoTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MpIHsKKyAgICBhc3NlcnQoUXVhbGlmaWVyTG9jLmdldE5lc3RlZE5hbWVTcGVjaWZpZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBnZXRUeXBlUHRyKCktPmdldFF1YWxpZmllcigpICYmCisgICAgICAgICAgICJJbmNvbnNpc3RlbnQgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHBvaW50ZXIiKTsKKyAgICBnZXRMb2NhbERhdGEoKS0+UXVhbGlmaWVyRGF0YSA9IFF1YWxpZmllckxvYy5nZXRPcGFxdWVEYXRhKCk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXROYW1lTG9jKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRMb2NhbERhdGEoKS0+TmFtZUxvYzsKKyAgfQorCisgIHZvaWQgc2V0TmFtZUxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICB0aGlzLT5nZXRMb2NhbERhdGEoKS0+TmFtZUxvYyA9IExvYzsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldExvY2FsU291cmNlUmFuZ2UoKSBjb25zdCB7CisgICAgaWYgKGdldEVsYWJvcmF0ZWRLZXl3b3JkTG9jKCkuaXNWYWxpZCgpKQorICAgICAgcmV0dXJuIFNvdXJjZVJhbmdlKGdldEVsYWJvcmF0ZWRLZXl3b3JkTG9jKCksIGdldE5hbWVMb2MoKSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIFNvdXJjZVJhbmdlKGdldFF1YWxpZmllckxvYygpLmdldEJlZ2luTG9jKCksIGdldE5hbWVMb2MoKSk7CisgIH0KKworICB2b2lkIGNvcHkoRGVwZW5kZW50TmFtZVR5cGVMb2MgTG9jKSB7CisgICAgdW5zaWduZWQgc2l6ZSA9IGdldEZ1bGxEYXRhU2l6ZSgpOworICAgIGFzc2VydChzaXplID09IExvYy5nZXRGdWxsRGF0YVNpemUoKSk7CisgICAgbWVtY3B5KERhdGEsIExvYy5EYXRhLCBzaXplKTsKKyAgfQorCisgIHZvaWQgaW5pdGlhbGl6ZUxvY2FsKEFTVENvbnRleHQgJkNvbnRleHQsIFNvdXJjZUxvY2F0aW9uIExvYyk7Cit9OworCitzdHJ1Y3QgRGVwZW5kZW50VGVtcGxhdGVTcGVjaWFsaXphdGlvbkxvY0luZm8gOiBEZXBlbmRlbnROYW1lTG9jSW5mbyB7CisgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlS1dMb2M7CisgIFNvdXJjZUxvY2F0aW9uIExBbmdsZUxvYzsKKyAgU291cmNlTG9jYXRpb24gUkFuZ2xlTG9jOworICAvLyBmb2xsb3dlZCBieSBhIFRlbXBsYXRlQXJndW1lbnRMb2NJbmZvW10KK307CisKK2NsYXNzIERlcGVuZGVudFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlTG9jIDoKKyAgICBwdWJsaWMgQ29uY3JldGVUeXBlTG9jPFVucXVhbFR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRlbnRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZGVudFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwZW5kZW50VGVtcGxhdGVTcGVjaWFsaXphdGlvbkxvY0luZm8+IHsKK3B1YmxpYzoKKyAgU291cmNlTG9jYXRpb24gZ2V0RWxhYm9yYXRlZEtleXdvcmRMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPmdldExvY2FsRGF0YSgpLT5FbGFib3JhdGVkS1dMb2M7CisgIH0KKworICB2b2lkIHNldEVsYWJvcmF0ZWRLZXl3b3JkTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIHRoaXMtPmdldExvY2FsRGF0YSgpLT5FbGFib3JhdGVkS1dMb2MgPSBMb2M7CisgIH0KKworICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIGdldFF1YWxpZmllckxvYygpIGNvbnN0IHsKKyAgICBpZiAoIWdldExvY2FsRGF0YSgpLT5RdWFsaWZpZXJEYXRhKQorICAgICAgcmV0dXJuIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoKTsKKworICAgIHJldHVybiBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKGdldFR5cGVQdHIoKS0+Z2V0UXVhbGlmaWVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYWxEYXRhKCktPlF1YWxpZmllckRhdGEpOworICB9CisKKyAgdm9pZCBzZXRRdWFsaWZpZXJMb2MoTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MpIHsKKyAgICBpZiAoIVF1YWxpZmllckxvYykgeworICAgICAgLy8gRXZlbiBpZiB3ZSBoYXZlIGEgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIGluIHRoZSBkZXBlbmRlbnQKKyAgICAgIC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHR5cGUsIHdlIHdvbid0IHJlY29yZCB0aGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyCisgICAgICAvLyBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3aGVuIHRoaXMgdHlwZS1zb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24gaXMKKyAgICAgIC8vIHBhcnQgb2YgYSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIuCisgICAgICBnZXRMb2NhbERhdGEoKS0+UXVhbGlmaWVyRGF0YSA9IG51bGxwdHI7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXNzZXJ0KFF1YWxpZmllckxvYy5nZXROZXN0ZWROYW1lU3BlY2lmaWVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBnZXRUeXBlUHRyKCktPmdldFF1YWxpZmllcigpICYmCisgICAgICAgICAgICJJbmNvbnNpc3RlbnQgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHBvaW50ZXIiKTsKKyAgICBnZXRMb2NhbERhdGEoKS0+UXVhbGlmaWVyRGF0YSA9IFF1YWxpZmllckxvYy5nZXRPcGFxdWVEYXRhKCk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRUZW1wbGF0ZUtleXdvcmRMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExvY2FsRGF0YSgpLT5UZW1wbGF0ZUtXTG9jOworICB9CisKKyAgdm9pZCBzZXRUZW1wbGF0ZUtleXdvcmRMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgZ2V0TG9jYWxEYXRhKCktPlRlbXBsYXRlS1dMb2MgPSBMb2M7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRUZW1wbGF0ZU5hbWVMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPmdldExvY2FsRGF0YSgpLT5OYW1lTG9jOworICB9CisKKyAgdm9pZCBzZXRUZW1wbGF0ZU5hbWVMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgdGhpcy0+Z2V0TG9jYWxEYXRhKCktPk5hbWVMb2MgPSBMb2M7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMQW5nbGVMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPmdldExvY2FsRGF0YSgpLT5MQW5nbGVMb2M7CisgIH0KKworICB2b2lkIHNldExBbmdsZUxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICB0aGlzLT5nZXRMb2NhbERhdGEoKS0+TEFuZ2xlTG9jID0gTG9jOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0UkFuZ2xlTG9jKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRMb2NhbERhdGEoKS0+UkFuZ2xlTG9jOworICB9CisKKyAgdm9pZCBzZXRSQW5nbGVMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgdGhpcy0+Z2V0TG9jYWxEYXRhKCktPlJBbmdsZUxvYyA9IExvYzsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUFyZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGVQdHIoKS0+Z2V0TnVtQXJncygpOworICB9CisKKyAgdm9pZCBzZXRBcmdMb2NJbmZvKHVuc2lnbmVkIGksIFRlbXBsYXRlQXJndW1lbnRMb2NJbmZvIEFJKSB7CisgICAgZ2V0QXJnSW5mb3MoKVtpXSA9IEFJOworICB9CisKKyAgVGVtcGxhdGVBcmd1bWVudExvY0luZm8gZ2V0QXJnTG9jSW5mbyh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEFyZ0luZm9zKClbaV07CisgIH0KKworICBUZW1wbGF0ZUFyZ3VtZW50TG9jIGdldEFyZ0xvYyh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgcmV0dXJuIFRlbXBsYXRlQXJndW1lbnRMb2MoZ2V0VHlwZVB0cigpLT5nZXRBcmcoaSksIGdldEFyZ0xvY0luZm8oaSkpOworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0TG9jYWxTb3VyY2VSYW5nZSgpIGNvbnN0IHsKKyAgICBpZiAoZ2V0RWxhYm9yYXRlZEtleXdvcmRMb2MoKS5pc1ZhbGlkKCkpCisgICAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0RWxhYm9yYXRlZEtleXdvcmRMb2MoKSwgZ2V0UkFuZ2xlTG9jKCkpOworICAgIGVsc2UgaWYgKGdldFF1YWxpZmllckxvYygpKQorICAgICAgcmV0dXJuIFNvdXJjZVJhbmdlKGdldFF1YWxpZmllckxvYygpLmdldEJlZ2luTG9jKCksIGdldFJBbmdsZUxvYygpKTsKKyAgICBlbHNlIGlmIChnZXRUZW1wbGF0ZUtleXdvcmRMb2MoKS5pc1ZhbGlkKCkpCisgICAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0VGVtcGxhdGVLZXl3b3JkTG9jKCksIGdldFJBbmdsZUxvYygpKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0VGVtcGxhdGVOYW1lTG9jKCksIGdldFJBbmdsZUxvYygpKTsKKyAgfQorCisgIHZvaWQgY29weShEZXBlbmRlbnRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZUxvYyBMb2MpIHsKKyAgICB1bnNpZ25lZCBzaXplID0gZ2V0RnVsbERhdGFTaXplKCk7CisgICAgYXNzZXJ0KHNpemUgPT0gTG9jLmdldEZ1bGxEYXRhU2l6ZSgpKTsKKyAgICBtZW1jcHkoRGF0YSwgTG9jLkRhdGEsIHNpemUpOworICB9CisKKyAgdm9pZCBpbml0aWFsaXplTG9jYWwoQVNUQ29udGV4dCAmQ29udGV4dCwgU291cmNlTG9jYXRpb24gTG9jKTsKKworICB1bnNpZ25lZCBnZXRFeHRyYUxvY2FsRGF0YVNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE51bUFyZ3MoKSAqIHNpemVvZihUZW1wbGF0ZUFyZ3VtZW50TG9jSW5mbyk7CisgIH0KKworICB1bnNpZ25lZCBnZXRFeHRyYUxvY2FsRGF0YUFsaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gYWxpZ25vZihUZW1wbGF0ZUFyZ3VtZW50TG9jSW5mbyk7CisgIH0KKworcHJpdmF0ZToKKyAgVGVtcGxhdGVBcmd1bWVudExvY0luZm8gKmdldEFyZ0luZm9zKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUZW1wbGF0ZUFyZ3VtZW50TG9jSW5mbyo+KGdldEV4dHJhTG9jYWxEYXRhKCkpOworICB9Cit9OworCitzdHJ1Y3QgUGFja0V4cGFuc2lvblR5cGVMb2NJbmZvIHsKKyAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2M7Cit9OworCitjbGFzcyBQYWNrRXhwYW5zaW9uVHlwZUxvYworICA6IHB1YmxpYyBDb25jcmV0ZVR5cGVMb2M8VW5xdWFsVHlwZUxvYywgUGFja0V4cGFuc2lvblR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrRXhwYW5zaW9uVHlwZSwgUGFja0V4cGFuc2lvblR5cGVMb2NJbmZvPiB7CitwdWJsaWM6CisgIFNvdXJjZUxvY2F0aW9uIGdldEVsbGlwc2lzTG9jKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRMb2NhbERhdGEoKS0+RWxsaXBzaXNMb2M7CisgIH0KKworICB2b2lkIHNldEVsbGlwc2lzTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIHRoaXMtPmdldExvY2FsRGF0YSgpLT5FbGxpcHNpc0xvYyA9IExvYzsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldExvY2FsU291cmNlUmFuZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIFNvdXJjZVJhbmdlKGdldEVsbGlwc2lzTG9jKCksIGdldEVsbGlwc2lzTG9jKCkpOworICB9CisKKyAgdm9pZCBpbml0aWFsaXplTG9jYWwoQVNUQ29udGV4dCAmQ29udGV4dCwgU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgc2V0RWxsaXBzaXNMb2MoTG9jKTsKKyAgfQorCisgIFR5cGVMb2MgZ2V0UGF0dGVybkxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW5uZXJUeXBlTG9jKCk7CisgIH0KKworICBRdWFsVHlwZSBnZXRJbm5lclR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPmdldFR5cGVQdHIoKS0+Z2V0UGF0dGVybigpOworICB9Cit9OworCitzdHJ1Y3QgQXRvbWljVHlwZUxvY0luZm8geworICBTb3VyY2VMb2NhdGlvbiBLV0xvYywgTFBhcmVuTG9jLCBSUGFyZW5Mb2M7Cit9OworCitjbGFzcyBBdG9taWNUeXBlTG9jIDogcHVibGljIENvbmNyZXRlVHlwZUxvYzxVbnF1YWxUeXBlTG9jLCBBdG9taWNUeXBlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljVHlwZSwgQXRvbWljVHlwZUxvY0luZm8+IHsKK3B1YmxpYzoKKyAgVHlwZUxvYyBnZXRWYWx1ZUxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+Z2V0SW5uZXJUeXBlTG9jKCk7CisgIH0KKworICBTb3VyY2VSYW5nZSBnZXRMb2NhbFNvdXJjZVJhbmdlKCkgY29uc3QgeworICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRLV0xvYygpLCBnZXRSUGFyZW5Mb2MoKSk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRLV0xvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+Z2V0TG9jYWxEYXRhKCktPktXTG9jOworICB9CisKKyAgdm9pZCBzZXRLV0xvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICB0aGlzLT5nZXRMb2NhbERhdGEoKS0+S1dMb2MgPSBMb2M7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMUGFyZW5Mb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPmdldExvY2FsRGF0YSgpLT5MUGFyZW5Mb2M7CisgIH0KKworICB2b2lkIHNldExQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICB0aGlzLT5nZXRMb2NhbERhdGEoKS0+TFBhcmVuTG9jID0gTG9jOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0UlBhcmVuTG9jKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5nZXRMb2NhbERhdGEoKS0+UlBhcmVuTG9jOworICB9CisKKyAgdm9pZCBzZXRSUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgdGhpcy0+Z2V0TG9jYWxEYXRhKCktPlJQYXJlbkxvYyA9IExvYzsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldFBhcmVuc1JhbmdlKCkgY29uc3QgeworICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRMUGFyZW5Mb2MoKSwgZ2V0UlBhcmVuTG9jKCkpOworICB9CisKKyAgdm9pZCBzZXRQYXJlbnNSYW5nZShTb3VyY2VSYW5nZSBSYW5nZSkgeworICAgIHNldExQYXJlbkxvYyhSYW5nZS5nZXRCZWdpbigpKTsKKyAgICBzZXRSUGFyZW5Mb2MoUmFuZ2UuZ2V0RW5kKCkpOworICB9CisKKyAgdm9pZCBpbml0aWFsaXplTG9jYWwoQVNUQ29udGV4dCAmQ29udGV4dCwgU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgc2V0S1dMb2MoTG9jKTsKKyAgICBzZXRMUGFyZW5Mb2MoTG9jKTsKKyAgICBzZXRSUGFyZW5Mb2MoTG9jKTsKKyAgfQorCisgIFF1YWxUeXBlIGdldElubmVyVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+Z2V0VHlwZVB0cigpLT5nZXRWYWx1ZVR5cGUoKTsKKyAgfQorfTsKKworc3RydWN0IFBpcGVUeXBlTG9jSW5mbyB7CisgIFNvdXJjZUxvY2F0aW9uIEtXTG9jOworfTsKKworY2xhc3MgUGlwZVR5cGVMb2MgOiBwdWJsaWMgQ29uY3JldGVUeXBlTG9jPFVucXVhbFR5cGVMb2MsIFBpcGVUeXBlTG9jLCBQaXBlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXBlVHlwZUxvY0luZm8+IHsKK3B1YmxpYzoKKyAgVHlwZUxvYyBnZXRWYWx1ZUxvYygpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmdldElubmVyVHlwZUxvYygpOyB9CisKKyAgU291cmNlUmFuZ2UgZ2V0TG9jYWxTb3VyY2VSYW5nZSgpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZVJhbmdlKGdldEtXTG9jKCkpOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0S1dMb2MoKSBjb25zdCB7IHJldHVybiB0aGlzLT5nZXRMb2NhbERhdGEoKS0+S1dMb2M7IH0KKyAgdm9pZCBzZXRLV0xvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgdGhpcy0+Z2V0TG9jYWxEYXRhKCktPktXTG9jID0gTG9jOyB9CisKKyAgdm9pZCBpbml0aWFsaXplTG9jYWwoQVNUQ29udGV4dCAmQ29udGV4dCwgU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgc2V0S1dMb2MoTG9jKTsKKyAgfQorCisgIFF1YWxUeXBlIGdldElubmVyVHlwZSgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmdldFR5cGVQdHIoKS0+Z2V0RWxlbWVudFR5cGUoKTsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgVCBUeXBlTG9jOjpnZXRBc0FkanVzdGVkKCkgY29uc3QgeworICBUeXBlTG9jIEN1ciA9ICp0aGlzOworICB3aGlsZSAoIVQ6OmlzS2luZChDdXIpKSB7CisgICAgaWYgKGF1dG8gUFRMID0gQ3VyLmdldEFzPFBhcmVuVHlwZUxvYz4oKSkKKyAgICAgIEN1ciA9IFBUTC5nZXRJbm5lckxvYygpOworICAgIGVsc2UgaWYgKGF1dG8gQVRMID0gQ3VyLmdldEFzPEF0dHJpYnV0ZWRUeXBlTG9jPigpKQorICAgICAgQ3VyID0gQVRMLmdldE1vZGlmaWVkTG9jKCk7CisgICAgZWxzZSBpZiAoYXV0byBFVEwgPSBDdXIuZ2V0QXM8RWxhYm9yYXRlZFR5cGVMb2M+KCkpCisgICAgICBDdXIgPSBFVEwuZ2V0TmFtZWRUeXBlTG9jKCk7CisgICAgZWxzZSBpZiAoYXV0byBBVEwgPSBDdXIuZ2V0QXM8QWRqdXN0ZWRUeXBlTG9jPigpKQorICAgICAgQ3VyID0gQVRMLmdldE9yaWdpbmFsTG9jKCk7CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIEN1ci5nZXRBczxUPigpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19BU1RfVFlQRUxPQ19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvVHlwZUxvY05vZGVzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9UeXBlTG9jTm9kZXMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OTBlNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvVHlwZUxvY05vZGVzLmRlZgpAQCAtMCwwICsxLDQxIEBACisvLz09PS0tIFR5cGVMb2NOb2Rlcy5kZWYgLSBNZXRhZGF0YSBhYm91dCBUeXBlTG9jIHdyYXBwZXJzIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgVHlwZUxvYyBpbmZvIGRhdGFiYXNlLiAgRWFjaCBub2RlIGlzCisvLyAgZW51bWVyYXRlZCBieSBwcm92aWRpbmcgaXRzIGNvcmUgbmFtZSAoZS5nLiwgIlBvaW50ZXIiIGZvciAiUG9pbnRlclR5cGVMb2MiKQorLy8gIGFuZCBiYXNlIGNsYXNzIChlLmcuLCAiRGVjbGFyYXRvckxvYyIpLiAgQWxsIG5vZGVzIGV4Y2VwdCBRdWFsaWZpZWRUeXBlTG9jCisvLyAgYXJlIGFzc29jaWF0ZWQKKy8vCisvLyAgICBUWVBFTE9DKENsYXNzLCBCYXNlKSAtIEEgVHlwZUxvYyBzdWJjbGFzcy4gIElmIFVOUVVBTF9UWVBFTE9DIGlzCisvLyAgICAgIHByb3ZpZGVkLCB0aGVyZSB3aWxsIGJlIGV4YWN0bHkgb25lIG9mIHRoZXNlLCBRdWFsaWZpZWQuCisvLworLy8gICAgVU5RVUFMX1RZUEVMT0MoQ2xhc3MsIEJhc2UsIFR5cGUpIC0gQW4gVW5xdWFsVHlwZUxvYyBzdWJjbGFzcy4KKy8vCisvLyAgICBBQlNUUkFDVF9UWVBFTE9DKENsYXNzKSAtIFJlZmVycyB0byBUeXBlU3BlY0xvYyBhbmQgRGVjbGFyYXRvckxvYy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFVOUVVBTF9UWVBFTE9DCisjICBkZWZpbmUgVU5RVUFMX1RZUEVMT0MoQ2xhc3MsIEJhc2UpIFRZUEVMT0MoQ2xhc3MsIEJhc2UpCisjZW5kaWYKKworI2lmbmRlZiBBQlNUUkFDVF9UWVBFTE9DCisjICBkZWZpbmUgQUJTVFJBQ1RfVFlQRUxPQyhDbGFzcywgQmFzZSkgVU5RVUFMX1RZUEVMT0MoQ2xhc3MsIEJhc2UpCisjZW5kaWYKKworVFlQRUxPQyhRdWFsaWZpZWQsIFR5cGVMb2MpCisjZGVmaW5lIFRZUEUoQ2xhc3MsIEJhc2UpIFVOUVVBTF9UWVBFTE9DKENsYXNzLCBCYXNlIyNMb2MpCisjZGVmaW5lIEFCU1RSQUNUX1RZUEUoQ2xhc3MsIEJhc2UpIEFCU1RSQUNUX1RZUEVMT0MoQ2xhc3MsIEJhc2UjI0xvYykKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZU5vZGVzLmRlZiIKKworI3VuZGVmIERFQ0xBUkFUT1JfVFlQRUxPQworI3VuZGVmIFRZUEVTUEVDX1RZUEVMT0MKKyN1bmRlZiBBQlNUUkFDVF9UWVBFTE9DCisjdW5kZWYgVU5RVUFMX1RZUEVMT0MKKyN1bmRlZiBUWVBFTE9DCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvVHlwZUxvY1Zpc2l0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9UeXBlTG9jVmlzaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNTc3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvVHlwZUxvY1Zpc2l0b3IuaApAQCAtMCwwICsxLDYyIEBACisvLz09PS0tLSBUeXBlTG9jVmlzaXRvci5oIC0gVmlzaXRvciBmb3IgVHlwZUxvYyBzdWJjbGFzc2VzIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgVHlwZUxvY1Zpc2l0b3IgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX1RZUEVMT0NWSVNJVE9SX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfVFlQRUxPQ1ZJU0lUT1JfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGVMb2MuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZVZpc2l0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCisjZGVmaW5lIERJU1BBVENIKENMQVNTTkFNRSkgXAorICByZXR1cm4gc3RhdGljX2Nhc3Q8SW1wbENsYXNzKj4odGhpcyktPiBcCisgICAgVmlzaXQjI0NMQVNTTkFNRShUeUxvYy5jYXN0QXM8Q0xBU1NOQU1FPigpKQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbXBsQ2xhc3MsIHR5cGVuYW1lIFJldFR5PXZvaWQ+CitjbGFzcyBUeXBlTG9jVmlzaXRvciB7CitwdWJsaWM6CisgIFJldFR5IFZpc2l0KFR5cGVMb2MgVHlMb2MpIHsKKyAgICBzd2l0Y2ggKFR5TG9jLmdldFR5cGVMb2NDbGFzcygpKSB7CisjZGVmaW5lIEFCU1RSQUNUX1RZUEVMT0MoQ0xBU1MsIFBBUkVOVCkKKyNkZWZpbmUgVFlQRUxPQyhDTEFTUywgUEFSRU5UKSBcCisgICAgY2FzZSBUeXBlTG9jOjpDTEFTUzogRElTUEFUQ0goQ0xBU1MjI1R5cGVMb2MpOworI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTG9jTm9kZXMuZGVmIgorICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJ1bmV4cGVjdGVkIHR5cGUgbG9jIGNsYXNzISIpOworICB9CisKKyAgUmV0VHkgVmlzaXQoVW5xdWFsVHlwZUxvYyBUeUxvYykgeworICAgIHN3aXRjaCAoVHlMb2MuZ2V0VHlwZUxvY0NsYXNzKCkpIHsKKyNkZWZpbmUgQUJTVFJBQ1RfVFlQRUxPQyhDTEFTUywgUEFSRU5UKQorI2RlZmluZSBUWVBFTE9DKENMQVNTLCBQQVJFTlQpIFwKKyAgICBjYXNlIFR5cGVMb2M6OkNMQVNTOiBESVNQQVRDSChDTEFTUyMjVHlwZUxvYyk7CisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGVMb2NOb2Rlcy5kZWYiCisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoInVuZXhwZWN0ZWQgdHlwZSBsb2MgY2xhc3MhIik7CisgIH0KKworI2RlZmluZSBUWVBFTE9DKENMQVNTLCBQQVJFTlQpICAgICAgXAorICBSZXRUeSBWaXNpdCMjQ0xBU1MjI1R5cGVMb2MoQ0xBU1MjI1R5cGVMb2MgVHlMb2MpIHsgXAorICAgIERJU1BBVENIKFBBUkVOVCk7ICAgICAgICAgICAgICAgXAorICB9CisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGVMb2NOb2Rlcy5kZWYiCisKKyAgUmV0VHkgVmlzaXRUeXBlTG9jKFR5cGVMb2MgVHlMb2MpIHsgcmV0dXJuIFJldFR5KCk7IH0KK307CisKKyN1bmRlZiBESVNQQVRDSAorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9UWVBFTE9DVklTSVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvVHlwZU5vZGVzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9UeXBlTm9kZXMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Njk3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvVHlwZU5vZGVzLmRlZgpAQCAtMCwwICsxLDEzNCBAQAorLy89PT0tLSBUeXBlTm9kZXMuZGVmIC0gTWV0YWRhdGEgYWJvdXQgVHlwZSBBU1Qgbm9kZXMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIEFTVCB0eXBlIGluZm8gZGF0YWJhc2UuIEVhY2ggdHlwZSBub2RlIGlzCisvLyAgZW51bWVyYXRlZCBieSBwcm92aWRpbmcgaXRzIG5hbWUgKGUuZy4sICJCdWlsdGluIiBvciAiRW51bSIpIGFuZAorLy8gIGJhc2UgY2xhc3MgKGUuZy4sICJUeXBlIiBvciAiVGFnVHlwZSIpLiBEZXBlbmRpbmcgb24gd2hlcmUgaW4gdGhlCisvLyAgYWJzdHJhY3Qgc3ludGF4IHRyZWUgdGhlIHR5cGUgd2lsbCBzaG93IHVwLCB0aGUgZW51bWVyYXRpb24gdXNlcworLy8gIG9uZSBvZiBmaXZlIGRpZmZlcmVudCBtYWNyb3M6CisvLworLy8gICAgVFlQRShDbGFzcywgQmFzZSkgLSBBIHR5cGUgdGhhdCBjYW4gc2hvdyB1cCBhbnl3aGVyZSBpbiB0aGUgQVNULAorLy8gICAgYW5kIG1pZ2h0IGJlIGRlcGVuZGVudCwgY2Fub25pY2FsLCBvciBub24tY2Fub25pY2FsLiBBbGwgY2xpZW50cworLy8gICAgd2lsbCBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlc2UgdHlwZXMuCisvLworLy8gICAgQUJTVFJBQ1RfVFlQRShDbGFzcywgQmFzZSkgLSBBbiBhYnN0cmFjdCBjbGFzcyB0aGF0IHNob3dzIHVwIGluCisvLyAgICB0aGUgdHlwZSBoaWVyYXJjaHkgYnV0IGhhcyBubyBjb25jcmV0ZSBpbnN0YW5jZXMuCisvLworLy8gICAgTk9OX0NBTk9OSUNBTF9UWVBFKENsYXNzLCBCYXNlKSAtIEEgdHlwZSB0aGF0IGNhbiBzaG93IHVwCisvLyAgICBhbnl3aGVyZSBpbiB0aGUgQVNUIGJ1dCB3aWxsIG5ldmVyIGJlIGEgcGFydCBvZiBhIGNhbm9uaWNhbAorLy8gICAgdHlwZS4gQ2xpZW50cyB0aGF0IG9ubHkgbmVlZCB0byBkZWFsIHdpdGggY2Fub25pY2FsIHR5cGVzCisvLyAgICAoaWdub3JpbmcsIGUuZy4sIHR5cGVkZWZzIGFuZCBvdGhlciB0eXBlIGFsaWFzZXMgdXNlZCBmb3IKKy8vICAgIHByZXR0eS1wcmludGluZykgY2FuIGlnbm9yZSB0aGVzZSB0eXBlcy4KKy8vCisvLyAgICBERVBFTkRFTlRfVFlQRShDbGFzcywgQmFzZSkgLSBBIHR5cGUgdGhhdCB3aWxsIG9ubHkgc2hvdyB1cAorLy8gICAgd2l0aGluIGEgQysrIHRlbXBsYXRlIHRoYXQgaGFzIG5vdCBiZWVuIGluc3RhbnRpYXRlZCwgZS5nLiwgYQorLy8gICAgdHlwZSB0aGF0IGlzIGFsd2F5cyBkZXBlbmRlbnQuIENsaWVudHMgdGhhdCBkbyBub3QgbmVlZCB0byBkZWFsCisvLyAgICB3aXRoIHVuaW5zdGFudGlhdGVkIEMrKyB0ZW1wbGF0ZXMgY2FuIGlnbm9yZSB0aGVzZSB0eXBlcy4KKy8vCisvLyAgICBOT05fQ0FOT05JQ0FMX1VOTEVTU19ERVBFTkRFTlRfVFlQRShDbGFzcywgQmFzZSkgLSBBIHR5cGUgdGhhdAorLy8gICAgaXMgbm9uLWNhbm9uaWNhbCB1bmxlc3MgaXQgaXMgZGVwZW5kZW50LiAgRGVmYXVsdHMgdG8gVFlQRSBiZWNhdXNlCisvLyAgICBpdCBpcyBuZWl0aGVyIHJlbGlhYmx5IGRlcGVuZGVudCBub3IgcmVsaWFibHkgbm9uLWNhbm9uaWNhbC4KKy8vCisvLyAgVGhlcmUgaXMgYSBzaXh0aCBtYWNybywgaW5kZXBlbmRlbnQgb2YgdGhlIG90aGVycy4gIE1vc3QgY2xpZW50cworLy8gIHdpbGwgbm90IG5lZWQgdG8gdXNlIGl0LgorLy8KKy8vICAgIExFQUZfVFlQRShDbGFzcykgLSBBIHR5cGUgdGhhdCBuZXZlciBoYXMgaW5uZXIgdHlwZXMuICBDbGllbnRzCisvLyAgICB3aGljaCBjYW4gb3BlcmF0ZSBvbiBzdWNoIHR5cGVzIG1vcmUgZWZmaWNpZW50bHkgbWF5IHdpc2ggdG8gZG8gc28uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBBQlNUUkFDVF9UWVBFCisjICBkZWZpbmUgQUJTVFJBQ1RfVFlQRShDbGFzcywgQmFzZSkgVFlQRShDbGFzcywgQmFzZSkKKyNlbmRpZgorCisjaWZuZGVmIE5PTl9DQU5PTklDQUxfVFlQRQorIyAgZGVmaW5lIE5PTl9DQU5PTklDQUxfVFlQRShDbGFzcywgQmFzZSkgVFlQRShDbGFzcywgQmFzZSkKKyNlbmRpZgorCisjaWZuZGVmIERFUEVOREVOVF9UWVBFCisjICBkZWZpbmUgREVQRU5ERU5UX1RZUEUoQ2xhc3MsIEJhc2UpIFRZUEUoQ2xhc3MsIEJhc2UpCisjZW5kaWYKKworI2lmbmRlZiBOT05fQ0FOT05JQ0FMX1VOTEVTU19ERVBFTkRFTlRfVFlQRQorIyAgZGVmaW5lIE5PTl9DQU5PTklDQUxfVU5MRVNTX0RFUEVOREVOVF9UWVBFKENsYXNzLCBCYXNlKSBUWVBFKENsYXNzLCBCYXNlKQorI2VuZGlmCisKK1RZUEUoQnVpbHRpbiwgVHlwZSkKK1RZUEUoQ29tcGxleCwgVHlwZSkKK1RZUEUoUG9pbnRlciwgVHlwZSkKK1RZUEUoQmxvY2tQb2ludGVyLCBUeXBlKQorQUJTVFJBQ1RfVFlQRShSZWZlcmVuY2UsIFR5cGUpCitUWVBFKExWYWx1ZVJlZmVyZW5jZSwgUmVmZXJlbmNlVHlwZSkKK1RZUEUoUlZhbHVlUmVmZXJlbmNlLCBSZWZlcmVuY2VUeXBlKQorVFlQRShNZW1iZXJQb2ludGVyLCBUeXBlKQorQUJTVFJBQ1RfVFlQRShBcnJheSwgVHlwZSkKK1RZUEUoQ29uc3RhbnRBcnJheSwgQXJyYXlUeXBlKQorVFlQRShJbmNvbXBsZXRlQXJyYXksIEFycmF5VHlwZSkKK1RZUEUoVmFyaWFibGVBcnJheSwgQXJyYXlUeXBlKQorREVQRU5ERU5UX1RZUEUoRGVwZW5kZW50U2l6ZWRBcnJheSwgQXJyYXlUeXBlKQorREVQRU5ERU5UX1RZUEUoRGVwZW5kZW50U2l6ZWRFeHRWZWN0b3IsIFR5cGUpCitERVBFTkRFTlRfVFlQRShEZXBlbmRlbnRBZGRyZXNzU3BhY2UsIFR5cGUpCitUWVBFKFZlY3RvciwgVHlwZSkKK1RZUEUoRXh0VmVjdG9yLCBWZWN0b3JUeXBlKQorQUJTVFJBQ1RfVFlQRShGdW5jdGlvbiwgVHlwZSkKK1RZUEUoRnVuY3Rpb25Qcm90bywgRnVuY3Rpb25UeXBlKQorVFlQRShGdW5jdGlvbk5vUHJvdG8sIEZ1bmN0aW9uVHlwZSkKK0RFUEVOREVOVF9UWVBFKFVucmVzb2x2ZWRVc2luZywgVHlwZSkKK05PTl9DQU5PTklDQUxfVFlQRShQYXJlbiwgVHlwZSkKK05PTl9DQU5PTklDQUxfVFlQRShUeXBlZGVmLCBUeXBlKQorTk9OX0NBTk9OSUNBTF9UWVBFKEFkanVzdGVkLCBUeXBlKQorTk9OX0NBTk9OSUNBTF9UWVBFKERlY2F5ZWQsIEFkanVzdGVkVHlwZSkKK05PTl9DQU5PTklDQUxfVU5MRVNTX0RFUEVOREVOVF9UWVBFKFR5cGVPZkV4cHIsIFR5cGUpCitOT05fQ0FOT05JQ0FMX1VOTEVTU19ERVBFTkRFTlRfVFlQRShUeXBlT2YsIFR5cGUpCitOT05fQ0FOT05JQ0FMX1VOTEVTU19ERVBFTkRFTlRfVFlQRShEZWNsdHlwZSwgVHlwZSkKK05PTl9DQU5PTklDQUxfVU5MRVNTX0RFUEVOREVOVF9UWVBFKFVuYXJ5VHJhbnNmb3JtLCBUeXBlKQorQUJTVFJBQ1RfVFlQRShUYWcsIFR5cGUpCitUWVBFKFJlY29yZCwgVGFnVHlwZSkKK1RZUEUoRW51bSwgVGFnVHlwZSkKK05PTl9DQU5PTklDQUxfVFlQRShFbGFib3JhdGVkLCBUeXBlKQorTk9OX0NBTk9OSUNBTF9UWVBFKEF0dHJpYnV0ZWQsIFR5cGUpCitERVBFTkRFTlRfVFlQRShUZW1wbGF0ZVR5cGVQYXJtLCBUeXBlKQorTk9OX0NBTk9OSUNBTF9UWVBFKFN1YnN0VGVtcGxhdGVUeXBlUGFybSwgVHlwZSkKK0RFUEVOREVOVF9UWVBFKFN1YnN0VGVtcGxhdGVUeXBlUGFybVBhY2ssIFR5cGUpCitOT05fQ0FOT05JQ0FMX1VOTEVTU19ERVBFTkRFTlRfVFlQRShUZW1wbGF0ZVNwZWNpYWxpemF0aW9uLCBUeXBlKQorQUJTVFJBQ1RfVFlQRShEZWR1Y2VkLCBUeXBlKQorVFlQRShBdXRvLCBEZWR1Y2VkVHlwZSkKK1RZUEUoRGVkdWNlZFRlbXBsYXRlU3BlY2lhbGl6YXRpb24sIERlZHVjZWRUeXBlKQorREVQRU5ERU5UX1RZUEUoSW5qZWN0ZWRDbGFzc05hbWUsIFR5cGUpCitERVBFTkRFTlRfVFlQRShEZXBlbmRlbnROYW1lLCBUeXBlKQorREVQRU5ERU5UX1RZUEUoRGVwZW5kZW50VGVtcGxhdGVTcGVjaWFsaXphdGlvbiwgVHlwZSkKK05PTl9DQU5PTklDQUxfVU5MRVNTX0RFUEVOREVOVF9UWVBFKFBhY2tFeHBhbnNpb24sIFR5cGUpCitOT05fQ0FOT05JQ0FMX1RZUEUoT2JqQ1R5cGVQYXJhbSwgVHlwZSkKK1RZUEUoT2JqQ09iamVjdCwgVHlwZSkKK1RZUEUoT2JqQ0ludGVyZmFjZSwgT2JqQ09iamVjdFR5cGUpCitUWVBFKE9iakNPYmplY3RQb2ludGVyLCBUeXBlKQorVFlQRShQaXBlLCBUeXBlKQorVFlQRShBdG9taWMsIFR5cGUpCisKKyNpZmRlZiBMQVNUX1RZUEUKK0xBU1RfVFlQRShBdG9taWMpCisjdW5kZWYgTEFTVF9UWVBFCisjZW5kaWYKKworLy8gVGhlc2UgdHlwZXMgYXJlIGFsd2F5cyBsZWF2ZXMgaW4gdGhlIHR5cGUgaGllcmFyY2h5LgorI2lmZGVmIExFQUZfVFlQRQorTEVBRl9UWVBFKEVudW0pCitMRUFGX1RZUEUoQnVpbHRpbikKK0xFQUZfVFlQRShSZWNvcmQpCitMRUFGX1RZUEUoSW5qZWN0ZWRDbGFzc05hbWUpCitMRUFGX1RZUEUoT2JqQ0ludGVyZmFjZSkKK0xFQUZfVFlQRShUZW1wbGF0ZVR5cGVQYXJtKQorI3VuZGVmIExFQUZfVFlQRQorI2VuZGlmCisKKyN1bmRlZiBOT05fQ0FOT05JQ0FMX1VOTEVTU19ERVBFTkRFTlRfVFlQRQorI3VuZGVmIERFUEVOREVOVF9UWVBFCisjdW5kZWYgTk9OX0NBTk9OSUNBTF9UWVBFCisjdW5kZWYgQUJTVFJBQ1RfVFlQRQorI3VuZGVmIFRZUEUKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9UeXBlT3JkZXJpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9UeXBlT3JkZXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTY0ZmFlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1R5cGVPcmRlcmluZy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0gVHlwZU9yZGVyaW5nLmggLSBUb3RhbCBvcmRlcmluZyBmb3IgdHlwZXMgLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBBbGxvd3MgUXVhbFR5cGVzIHRvIGJlIHNvcnRlZCBhbmQgaGVuY2UgdXNlZCBpbiBtYXBzIGFuZCBzZXRzLgorLy8vCisvLy8gRGVmaW5lcyBjbGFuZzo6UXVhbFR5cGVPcmRlcmluZywgYSB0b3RhbCBvcmRlcmluZyBvbiBjbGFuZzo6UXVhbFR5cGUsCisvLy8gYW5kIGhlbmNlIGVuYWJsZXMgUXVhbFR5cGUgdmFsdWVzIHRvIGJlIHNvcnRlZCBhbmQgdG8gYmUgdXNlZCBpbgorLy8vIHN0ZDo6bWFwcywgc3RkOjpzZXRzLCBsbHZtOjpEZW5zZU1hcHMsIGFuZCBsbHZtOjpEZW5zZVNldHMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfVFlQRU9SREVSSU5HX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfVFlQRU9SREVSSU5HX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9DYW5vbmljYWxUeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgY2xhbmcgeworCisvLy8gXGJyaWVmIEZ1bmN0aW9uIG9iamVjdCB0aGF0IHByb3ZpZGVzIGEgdG90YWwgb3JkZXJpbmcgb24gUXVhbFR5cGUgdmFsdWVzLgorc3RydWN0IFF1YWxUeXBlT3JkZXJpbmcgeworICBib29sIG9wZXJhdG9yKCkoUXVhbFR5cGUgVDEsIFF1YWxUeXBlIFQyKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6bGVzczx2b2lkKj4oKShUMS5nZXRBc09wYXF1ZVB0cigpLCBUMi5nZXRBc09wYXF1ZVB0cigpKTsKKyAgfQorfTsKKworfQorCituYW1lc3BhY2UgbGx2bSB7CisgIHRlbXBsYXRlPGNsYXNzPiBzdHJ1Y3QgRGVuc2VNYXBJbmZvOworCisgIHRlbXBsYXRlPD4gc3RydWN0IERlbnNlTWFwSW5mbzxjbGFuZzo6UXVhbFR5cGU+IHsKKyAgICBzdGF0aWMgaW5saW5lIGNsYW5nOjpRdWFsVHlwZSBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIGNsYW5nOjpRdWFsVHlwZSgpOyB9CisKKyAgICBzdGF0aWMgaW5saW5lIGNsYW5nOjpRdWFsVHlwZSBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgICB1c2luZyBjbGFuZzo6UXVhbFR5cGU7CisgICAgICByZXR1cm4gUXVhbFR5cGU6OmdldEZyb21PcGFxdWVQdHIocmVpbnRlcnByZXRfY2FzdDxjbGFuZzo6VHlwZSAqPigtMSkpOworICAgIH0KKworICAgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY2xhbmc6OlF1YWxUeXBlIFZhbCkgeworICAgICAgcmV0dXJuICh1bnNpZ25lZCkoKHVpbnRwdHJfdClWYWwuZ2V0QXNPcGFxdWVQdHIoKSkgXgorICAgICAgICAgICAgKCh1bnNpZ25lZCkoKHVpbnRwdHJfdClWYWwuZ2V0QXNPcGFxdWVQdHIoKSA+PiA5KSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNFcXVhbChjbGFuZzo6UXVhbFR5cGUgTEhTLCBjbGFuZzo6UXVhbFR5cGUgUkhTKSB7CisgICAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGU8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPGNsYW5nOjpDYW5RdWFsVHlwZT4geworICAgIHN0YXRpYyBpbmxpbmUgY2xhbmc6OkNhblF1YWxUeXBlIGdldEVtcHR5S2V5KCkgeyAKKyAgICAgIHJldHVybiBjbGFuZzo6Q2FuUXVhbFR5cGUoKTsgCisgICAgfQorICAgIAorICAgIHN0YXRpYyBpbmxpbmUgY2xhbmc6OkNhblF1YWxUeXBlIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICAgIHVzaW5nIGNsYW5nOjpDYW5RdWFsVHlwZTsKKyAgICAgIHJldHVybiBDYW5RdWFsVHlwZTo6Z2V0RnJvbU9wYXF1ZVB0cihyZWludGVycHJldF9jYXN0PGNsYW5nOjpUeXBlICo+KC0xKSk7CisgICAgfQorICAgIAorICAgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY2xhbmc6OkNhblF1YWxUeXBlIFZhbCkgeworICAgICAgcmV0dXJuICh1bnNpZ25lZCkoKHVpbnRwdHJfdClWYWwuZ2V0QXNPcGFxdWVQdHIoKSkgXgorICAgICAgKCh1bnNpZ25lZCkoKHVpbnRwdHJfdClWYWwuZ2V0QXNPcGFxdWVQdHIoKSA+PiA5KSk7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBib29sIGlzRXF1YWwoY2xhbmc6OkNhblF1YWxUeXBlIExIUywgY2xhbmc6OkNhblF1YWxUeXBlIFJIUykgeworICAgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgICAgfQorICB9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9UeXBlVmlzaXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1R5cGVWaXNpdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlNWE0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9UeXBlVmlzaXRvci5oCkBAIC0wLDAgKzEsOTUgQEAKKy8vPT09LS0tIFR5cGVWaXNpdG9yLmggLSBWaXNpdG9yIGZvciBUeXBlIHN1YmNsYXNzZXMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBUeXBlVmlzaXRvciBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9UWVBFVklTSVRPUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX1RZUEVWSVNJVE9SX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKKyNkZWZpbmUgRElTUEFUQ0goQ0xBU1MpIFwKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEltcGxDbGFzcyo+KHRoaXMpLT4gXAorICAgICAgICAgICBWaXNpdCMjQ0xBU1Moc3RhdGljX2Nhc3Q8Y29uc3QgQ0xBU1MqPihUKSkKKworLy8vIFxicmllZiBBbiBvcGVyYXRpb24gb24gYSB0eXBlLgorLy8vCisvLy8gXHRwYXJhbSBJbXBsQ2xhc3MgQ2xhc3MgaW1wbGVtZW50aW5nIHRoZSBvcGVyYXRpb24uIE11c3QgYmUgaW5oZXJpdGVkIGZyb20KKy8vLyAgICAgICAgIFR5cGVWaXNpdG9yLgorLy8vIFx0cGFyYW0gUmV0VHkgJVR5cGUgb2YgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBvcGVyYXRpb24uCisvLy8KKy8vLyBUaGUgY2xhc3MgaW1wbGVtZW50cyBwb2x5bW9ycGhpYyBvcGVyYXRpb24gb24gYW4gb2JqZWN0IG9mIHR5cGUgZGVyaXZlZAorLy8vIGZyb20gVHlwZS4gVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYnkgY2FsbGluZyBtZXRob2QgVmlzaXQuIEl0IHRoZW4KKy8vLyBkaXNwYXRjaGVzIHRoZSBjYWxsIHRvIGZ1bmN0aW9uIFxjIFZpc2l0Rm9vVHlwZSwgaWYgYWN0dWFsIGFyZ3VtZW50IHR5cGUKKy8vLyBpcyBcYyBGb29UeXBlLgorLy8vCisvLy8gVGhlIGNsYXNzIGltcGxlbWVudHMgc3RhdGljIHBvbHltb3JwaGlzbSB1c2luZyBDdXJpb3VzbHkgUmVjdXJyaW5nCisvLy8gVGVtcGxhdGUgUGF0dGVybi4gSXQgaXMgZGVzaWduZWQgdG8gYmUgYSBiYXNlIGNsYXNzIGZvciBzb21lIGNvbmNyZXRlCisvLy8gY2xhc3M6CisvLy8KKy8vLyBcY29kZQorLy8vICAgICBjbGFzcyBTb21lVmlzaXRvciA6IHB1YmxpYyBUeXBlVmlzaXRvcjxTb21lVmlzaXRvcixzb21ldHlwZT4geyAuLi4gfTsKKy8vLyAgICAgLi4uCisvLy8gICAgIFR5cGUgKmF0eXBlID0gLi4uCisvLy8gICAgIC4uLgorLy8vICAgICBTb21lVmlzaXRvciBhdmlzaXRvcjsKKy8vLyAgICAgc29tZXR5cGUgcmVzdWx0ID0gYXZpc2l0b3IuVmlzaXQoYXR5cGUpOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBBY3R1YWwgdHJlYXRtZW50IGlzIG1hZGUgYnkgbWV0aG9kcyBvZiB0aGUgZGVyaXZlZCBjbGFzcywgVHlwZVZpc2l0b3Igb25seQorLy8vIGRpc3BhdGNoZXMgY2FsbCB0byB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kLiBJZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MKKy8vLyBcYyBJbXBsQ2xhc3MgcHJvdmlkZXMgc3BlY2lmaWMgYWN0aW9uIGZvciBzb21lIHR5cGUsIHNheQorLy8vIFxjIENvbnN0YW50QXJyYXlUeXBlLCBpdCBzaG91bGQgZGVmaW5lIG1ldGhvZAorLy8vIDx0dD5WaXNpdENvbnN0YW50QXJyYXlUeXBlKGNvbnN0IENvbnN0YW50QXJyYXlUeXBlKik8L3R0Pi4gT3RoZXJ3aXNlCisvLy8gXGMgVHlwZVZpc2l0b3IgZGlzcGF0Y2hlcyBjYWxsIHRvIHRoZSBtZXRob2QgdGhhdCBoYW5kbGVzIHBhcmVudCB0eXBlLiBJbgorLy8vIHRoaXMgZXhhbXBsZSBoYW5kbGVycyBhcmUgdHJpZWQgaW4gdGhlIHNlcXVlbmNlOgorLy8vCisvLy8gXGxpIDx0dD5JbXBsQ2xhc3M6OlZpc2l0Q29uc3RhbnRBcnJheVR5cGUoY29uc3QgQ29uc3RhbnRBcnJheVR5cGUqKTwvdHQ+CisvLy8gXGxpIDx0dD5JbXBsQ2xhc3M6OlZpc2l0QXJyYXlUeXBlKGNvbnN0IEFycmF5VHlwZSopPC90dD4KKy8vLyBcbGkgPHR0PkltcGxDbGFzczo6VmlzaXRUeXBlKGNvbnN0IFR5cGUqKTwvdHQ+CisvLy8gXGxpIDx0dD5UeXBlVmlzaXRvcjo6VmlzaXRUeXBlKGNvbnN0IFR5cGUqKTwvdHQ+CisvLy8KKy8vLyBUaGUgZmlyc3QgZnVuY3Rpb24gb2YgdGhpcyBzZXF1ZW5jZSB0aGF0IGlzIGRlZmluZWQgd2lsbCBoYW5kbGUgb2JqZWN0IG9mCisvLy8gdHlwZSBcYyBDb25zdGFudEFycmF5VHlwZS4KK3RlbXBsYXRlPHR5cGVuYW1lIEltcGxDbGFzcywgdHlwZW5hbWUgUmV0VHk9dm9pZD4KK2NsYXNzIFR5cGVWaXNpdG9yIHsKK3B1YmxpYzoKKworICAvLy8gXGJyaWVmIFBlcmZvcm1zIHRoZSBvcGVyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmlzaXRvciBvYmplY3QuCisgIFJldFR5IFZpc2l0KGNvbnN0IFR5cGUgKlQpIHsKKyAgICAvLyBUb3Agc3dpdGNoIHN0bXQ6IGRpc3BhdGNoIHRvIFZpc2l0Rm9vVHlwZSBmb3IgZWFjaCBGb29UeXBlLgorICAgIHN3aXRjaCAoVC0+Z2V0VHlwZUNsYXNzKCkpIHsKKyNkZWZpbmUgQUJTVFJBQ1RfVFlQRShDTEFTUywgUEFSRU5UKQorI2RlZmluZSBUWVBFKENMQVNTLCBQQVJFTlQpIGNhc2UgVHlwZTo6Q0xBU1M6IERJU1BBVENIKENMQVNTIyNUeXBlKTsKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZU5vZGVzLmRlZiIKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biB0eXBlIGNsYXNzISIpOworICB9CisKKyAgLy8gSWYgdGhlIGltcGxlbWVudGF0aW9uIGNob29zZXMgbm90IHRvIGltcGxlbWVudCBhIGNlcnRhaW4gdmlzaXQgbWV0aG9kLCBmYWxsCisgIC8vIGJhY2sgb24gc3VwZXJjbGFzcy4KKyNkZWZpbmUgVFlQRShDTEFTUywgUEFSRU5UKSBSZXRUeSBWaXNpdCMjQ0xBU1MjI1R5cGUoY29uc3QgQ0xBU1MjI1R5cGUgKlQpIHsgXAorICBESVNQQVRDSChQQVJFTlQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGVOb2Rlcy5kZWYiCisKKyAgLy8vIFxicmllZiBNZXRob2QgY2FsbGVkIGlmIFxjIEltcENsYXNzIGRvZXNuJ3QgcHJvdmlkZSBzcGVjaWZpYyBoYW5kbGVyCisgIC8vLyBmb3Igc29tZSB0eXBlIGNsYXNzLgorICBSZXRUeSBWaXNpdFR5cGUoY29uc3QgVHlwZSopIHsgcmV0dXJuIFJldFR5KCk7IH0KK307CisKKyN1bmRlZiBESVNQQVRDSAorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUL1VucmVzb2x2ZWRTZXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9VbnJlc29sdmVkU2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0ZmY5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9VbnJlc29sdmVkU2V0LmgKQEAgLTAsMCArMSwxNTIgQEAKKy8vPT09LSBVbnJlc29sdmVkU2V0LmggLSBVbnJlc29sdmVkIHNldHMgb2YgZGVjbGFyYXRpb25zIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBVbnJlc29sdmVkU2V0IGNsYXNzLCB3aGljaCBpcyB1c2VkIHRvIHN0b3JlCisvLyAgY29sbGVjdGlvbnMgb2YgZGVjbGFyYXRpb25zIGluIHRoZSBBU1QuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9VTlJFU09MVkVEU0VUX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfVU5SRVNPTFZFRFNFVF9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbEFjY2Vzc1BhaXIuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU3BlY2lmaWVycy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBOYW1lZERlY2w7CisKKy8vLyBUaGUgaXRlcmF0b3Igb3ZlciBVbnJlc29sdmVkU2V0cy4gIFNlcnZlcyBhcyBib3RoIHRoZSBjb25zdCBhbmQKKy8vLyBub24tY29uc3QgaXRlcmF0b3IuCitjbGFzcyBVbnJlc29sdmVkU2V0SXRlcmF0b3IgOiBwdWJsaWMgbGx2bTo6aXRlcmF0b3JfYWRhcHRvcl9iYXNlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmVzb2x2ZWRTZXRJdGVyYXRvciwgRGVjbEFjY2Vzc1BhaXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBOYW1lZERlY2wgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnB0cmRpZmZfdCwgTmFtZWREZWNsICosIE5hbWVkRGVjbCAqPiB7CisgIGZyaWVuZCBjbGFzcyBBU1RVbnJlc29sdmVkU2V0OworICBmcmllbmQgY2xhc3MgT3ZlcmxvYWRFeHByOworICBmcmllbmQgY2xhc3MgVW5yZXNvbHZlZFNldEltcGw7CisKKyAgZXhwbGljaXQgVW5yZXNvbHZlZFNldEl0ZXJhdG9yKERlY2xBY2Nlc3NQYWlyICpJdGVyKQorICAgICAgOiBpdGVyYXRvcl9hZGFwdG9yX2Jhc2UoSXRlcikge30KKyAgZXhwbGljaXQgVW5yZXNvbHZlZFNldEl0ZXJhdG9yKGNvbnN0IERlY2xBY2Nlc3NQYWlyICpJdGVyKQorICAgICAgOiBpdGVyYXRvcl9hZGFwdG9yX2Jhc2UoY29uc3RfY2FzdDxEZWNsQWNjZXNzUGFpciAqPihJdGVyKSkge30KKworcHVibGljOgorICAvLyBXb3JrIGFyb3VuZCBhIGJ1ZyBpbiBNU1ZDIDIwMTMgd2hlcmUgZXhwbGljaXRseSBkZWZhdWx0IGNvbnN0cnVjdGVkCisgIC8vIHRlbXBvcmFyaWVzIHdpdGggZGVmYXVsdGVkIGN0b3JzIGFyZSBub3QgemVybyBpbml0aWFsaXplZC4KKyAgVW5yZXNvbHZlZFNldEl0ZXJhdG9yKCkgOiBpdGVyYXRvcl9hZGFwdG9yX2Jhc2UobnVsbHB0cikge30KKworICBOYW1lZERlY2wgKmdldERlY2woKSBjb25zdCB7IHJldHVybiBJLT5nZXREZWNsKCk7IH0KKyAgdm9pZCBzZXREZWNsKE5hbWVkRGVjbCAqTkQpIGNvbnN0IHsgcmV0dXJuIEktPnNldERlY2woTkQpOyB9CisgIEFjY2Vzc1NwZWNpZmllciBnZXRBY2Nlc3MoKSBjb25zdCB7IHJldHVybiBJLT5nZXRBY2Nlc3MoKTsgfQorICB2b2lkIHNldEFjY2VzcyhBY2Nlc3NTcGVjaWZpZXIgQVMpIHsgSS0+c2V0QWNjZXNzKEFTKTsgfQorICBjb25zdCBEZWNsQWNjZXNzUGFpciAmZ2V0UGFpcigpIGNvbnN0IHsgcmV0dXJuICpJOyB9CisKKyAgTmFtZWREZWNsICpvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBnZXREZWNsKCk7IH0KKyAgTmFtZWREZWNsICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gKip0aGlzOyB9Cit9OworCisvLy8gXGJyaWVmIEEgc2V0IG9mIHVucmVzb2x2ZWQgZGVjbGFyYXRpb25zLgorY2xhc3MgVW5yZXNvbHZlZFNldEltcGwgeworICB1c2luZyBEZWNsc1R5ID0gU21hbGxWZWN0b3JJbXBsPERlY2xBY2Nlc3NQYWlyPjsKKworICAvLyBEb24ndCBhbGxvdyBkaXJlY3QgY29uc3RydWN0aW9uLCBhbmQgb25seSBwZXJtaXQgc3ViY2xhc3NpbmcgYnkKKyAgLy8gVW5yZXNvbHZlZFNldC4KK3ByaXZhdGU6CisgIHRlbXBsYXRlIDx1bnNpZ25lZCBOPiBmcmllbmQgY2xhc3MgVW5yZXNvbHZlZFNldDsKKworICBVbnJlc29sdmVkU2V0SW1wbCgpID0gZGVmYXVsdDsKKyAgVW5yZXNvbHZlZFNldEltcGwoY29uc3QgVW5yZXNvbHZlZFNldEltcGwgJikgPSBkZWZhdWx0OworICBVbnJlc29sdmVkU2V0SW1wbCAmb3BlcmF0b3I9KGNvbnN0IFVucmVzb2x2ZWRTZXRJbXBsICYpID0gZGVmYXVsdDsKKworICAvLyBGSVhNRTogU3dpdGNoIHRoZXNlIHRvICI9IGRlZmF1bHQiIG9uY2UgTVNWQyBzdXBwb3J0cyBnZW5lcmF0aW5nIG1vdmUgb3BzCisgIFVucmVzb2x2ZWRTZXRJbXBsKFVucmVzb2x2ZWRTZXRJbXBsICYmKSB7fQorICBVbnJlc29sdmVkU2V0SW1wbCAmb3BlcmF0b3I9KFVucmVzb2x2ZWRTZXRJbXBsICYmKSB7IHJldHVybiAqdGhpczsgfQorCitwdWJsaWM6CisgIC8vIFdlIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IGFzc2lnbm1lbnQgdGhyb3VnaCB0aGlzIGl0ZXJhdG9yLCBzbyB3ZSBtaWdodAorICAvLyBhcyB3ZWxsIHVzZSB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiB0d2ljZS4KKyAgdXNpbmcgaXRlcmF0b3IgPSBVbnJlc29sdmVkU2V0SXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gVW5yZXNvbHZlZFNldEl0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gaXRlcmF0b3IoZGVjbHMoKS5iZWdpbigpKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcihkZWNscygpLmVuZCgpKTsgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoZGVjbHMoKS5iZWdpbigpKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihkZWNscygpLmVuZCgpKTsgfQorCisgIHZvaWQgYWRkRGVjbChOYW1lZERlY2wgKkQpIHsKKyAgICBhZGREZWNsKEQsIEFTX25vbmUpOworICB9CisKKyAgdm9pZCBhZGREZWNsKE5hbWVkRGVjbCAqRCwgQWNjZXNzU3BlY2lmaWVyIEFTKSB7CisgICAgZGVjbHMoKS5wdXNoX2JhY2soRGVjbEFjY2Vzc1BhaXI6Om1ha2UoRCwgQVMpKTsKKyAgfQorCisgIC8vLyBSZXBsYWNlcyB0aGUgZ2l2ZW4gZGVjbGFyYXRpb24gd2l0aCB0aGUgbmV3IG9uZSwgb25jZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIHRydWUgaWYgdGhlIHNldCBjaGFuZ2VkCisgIGJvb2wgcmVwbGFjZShjb25zdCBOYW1lZERlY2wqIE9sZCwgTmFtZWREZWNsICpOZXcpIHsKKyAgICBmb3IgKERlY2xzVHk6Oml0ZXJhdG9yIEkgPSBkZWNscygpLmJlZ2luKCksIEUgPSBkZWNscygpLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGlmIChJLT5nZXREZWNsKCkgPT0gT2xkKQorICAgICAgICByZXR1cm4gKEktPnNldERlY2woTmV3KSwgdHJ1ZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJlcGxhY2VzIHRoZSBkZWNsYXJhdGlvbiBhdCB0aGUgZ2l2ZW4gaXRlcmF0b3Igd2l0aCB0aGUgbmV3IG9uZSwKKyAgLy8vIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsIGFjY2VzcyBiaXRzLgorICB2b2lkIHJlcGxhY2UoaXRlcmF0b3IgSSwgTmFtZWREZWNsICpOZXcpIHsgSS5JLT5zZXREZWNsKE5ldyk7IH0KKworICB2b2lkIHJlcGxhY2UoaXRlcmF0b3IgSSwgTmFtZWREZWNsICpOZXcsIEFjY2Vzc1NwZWNpZmllciBBUykgeworICAgIEkuSS0+c2V0KE5ldywgQVMpOworICB9CisKKyAgdm9pZCBlcmFzZSh1bnNpZ25lZCBJKSB7IGRlY2xzKClbSV0gPSBkZWNscygpLnBvcF9iYWNrX3ZhbCgpOyB9CisKKyAgdm9pZCBlcmFzZShpdGVyYXRvciBJKSB7ICpJLkkgPSBkZWNscygpLnBvcF9iYWNrX3ZhbCgpOyB9CisKKyAgdm9pZCBzZXRBY2Nlc3MoaXRlcmF0b3IgSSwgQWNjZXNzU3BlY2lmaWVyIEFTKSB7IEkuSS0+c2V0QWNjZXNzKEFTKTsgfQorCisgIHZvaWQgY2xlYXIoKSB7IGRlY2xzKCkuY2xlYXIoKTsgfQorICB2b2lkIHNldF9zaXplKHVuc2lnbmVkIE4pIHsgZGVjbHMoKS5zZXRfc2l6ZShOKTsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBkZWNscygpLmVtcHR5KCk7IH0KKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGRlY2xzKCkuc2l6ZSgpOyB9CisKKyAgdm9pZCBhcHBlbmQoaXRlcmF0b3IgSSwgaXRlcmF0b3IgRSkgeyBkZWNscygpLmFwcGVuZChJLkksIEUuSSk7IH0KKworICBEZWNsQWNjZXNzUGFpciAmb3BlcmF0b3JbXSh1bnNpZ25lZCBJKSB7IHJldHVybiBkZWNscygpW0ldOyB9CisgIGNvbnN0IERlY2xBY2Nlc3NQYWlyICZvcGVyYXRvcltdKHVuc2lnbmVkIEkpIGNvbnN0IHsgcmV0dXJuIGRlY2xzKClbSV07IH0KKworcHJpdmF0ZToKKyAgLy8gVGhlc2Ugd29yayBiZWNhdXNlIHRoZSBvbmx5IHBlcm1pdHRlZCBzdWJjbGFzcyBpcyBVbnJlc29sdmVkU2V0SW1wbAorCisgIERlY2xzVHkgJmRlY2xzKCkgeworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxEZWNsc1R5Kj4odGhpcyk7CisgIH0KKyAgY29uc3QgRGVjbHNUeSAmZGVjbHMoKSBjb25zdCB7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IERlY2xzVHkqPih0aGlzKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBBIHNldCBvZiB1bnJlc29sdmVkIGRlY2xhcmF0aW9ucy4KK3RlbXBsYXRlIDx1bnNpZ25lZCBJbmxpbmVDYXBhY2l0eT4gY2xhc3MgVW5yZXNvbHZlZFNldCA6CisgICAgcHVibGljIFVucmVzb2x2ZWRTZXRJbXBsIHsKKyAgU21hbGxWZWN0b3I8RGVjbEFjY2Vzc1BhaXIsIElubGluZUNhcGFjaXR5PiBEZWNsczsKK307CisKKyAKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9VTlJFU09MVkVEU0VUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9WVFRCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvVlRUQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ODEzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvVlRUQnVpbGRlci5oCkBAIC0wLDAgKzEsMTY1IEBACisvLz09PS0gVlRUQnVpbGRlci5oIC0gQysrIFZUVCBsYXlvdXQgYnVpbGRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgY29udGFpbnMgY29kZSBkZWFsaW5nIHdpdGggZ2VuZXJhdGlvbiBvZiB0aGUgbGF5b3V0IG9mIHZpcnR1YWwgdGFibGUKKy8vIHRhYmxlcyAoVlRUKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX1ZUVEJVSUxERVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9WVFRCVUlMREVSX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9CYXNlU3Vib2JqZWN0LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0NoYXJVbml0cy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBBU1RSZWNvcmRMYXlvdXQ7CitjbGFzcyBDWFhSZWNvcmREZWNsOworCitjbGFzcyBWVFRWVGFibGUgeworICBsbHZtOjpQb2ludGVySW50UGFpcjxjb25zdCBDWFhSZWNvcmREZWNsICosIDEsIGJvb2w+IEJhc2VBbmRJc1ZpcnR1YWw7CisgIENoYXJVbml0cyBCYXNlT2Zmc2V0OworCitwdWJsaWM6CisgIFZUVFZUYWJsZSgpID0gZGVmYXVsdDsKKyAgVlRUVlRhYmxlKGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2UsIENoYXJVbml0cyBCYXNlT2Zmc2V0LCBib29sIEJhc2VJc1ZpcnR1YWwpCisgICAgICA6IEJhc2VBbmRJc1ZpcnR1YWwoQmFzZSwgQmFzZUlzVmlydHVhbCksIEJhc2VPZmZzZXQoQmFzZU9mZnNldCkge30KKyAgVlRUVlRhYmxlKEJhc2VTdWJvYmplY3QgQmFzZSwgYm9vbCBCYXNlSXNWaXJ0dWFsKQorICAgICAgOiBCYXNlQW5kSXNWaXJ0dWFsKEJhc2UuZ2V0QmFzZSgpLCBCYXNlSXNWaXJ0dWFsKSwKKyAgICAgICAgQmFzZU9mZnNldChCYXNlLmdldEJhc2VPZmZzZXQoKSkge30KKworICBjb25zdCBDWFhSZWNvcmREZWNsICpnZXRCYXNlKCkgY29uc3QgeworICAgIHJldHVybiBCYXNlQW5kSXNWaXJ0dWFsLmdldFBvaW50ZXIoKTsKKyAgfQorCisgIENoYXJVbml0cyBnZXRCYXNlT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBCYXNlT2Zmc2V0OworICB9CisKKyAgYm9vbCBpc1ZpcnR1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIEJhc2VBbmRJc1ZpcnR1YWwuZ2V0SW50KCk7CisgIH0KKworICBCYXNlU3Vib2JqZWN0IGdldEJhc2VTdWJvYmplY3QoKSBjb25zdCB7CisgICAgcmV0dXJuIEJhc2VTdWJvYmplY3QoZ2V0QmFzZSgpLCBnZXRCYXNlT2Zmc2V0KCkpOworICB9Cit9OworCitzdHJ1Y3QgVlRUQ29tcG9uZW50IHsKKyAgdWludDY0X3QgVlRhYmxlSW5kZXg7CisgIEJhc2VTdWJvYmplY3QgVlRhYmxlQmFzZTsKKworICBWVFRDb21wb25lbnQoKSA9IGRlZmF1bHQ7CisgIFZUVENvbXBvbmVudCh1aW50NjRfdCBWVGFibGVJbmRleCwgQmFzZVN1Ym9iamVjdCBWVGFibGVCYXNlKQorICAgICA6IFZUYWJsZUluZGV4KFZUYWJsZUluZGV4KSwgVlRhYmxlQmFzZShWVGFibGVCYXNlKSB7fQorfTsKKworLy8vIFxicmllZiBDbGFzcyBmb3IgYnVpbGRpbmcgVlRUIGxheW91dCBpbmZvcm1hdGlvbi4KK2NsYXNzIFZUVEJ1aWxkZXIgeworICBBU1RDb250ZXh0ICZDdHg7CisKKyAgLy8vIFxicmllZiBUaGUgbW9zdCBkZXJpdmVkIGNsYXNzIGZvciB3aGljaCB3ZSdyZSBidWlsZGluZyB0aGlzIHZ0YWJsZS4KKyAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqTW9zdERlcml2ZWRDbGFzczsKKworICB1c2luZyBWVFRWVGFibGVzVmVjdG9yVHkgPSBTbWFsbFZlY3RvcjxWVFRWVGFibGUsIDY0PjsKKyAgCisgIC8vLyBcYnJpZWYgVGhlIFZUVCB2dGFibGVzLgorICBWVFRWVGFibGVzVmVjdG9yVHkgVlRUVlRhYmxlczsKKyAgCisgIHVzaW5nIFZUVENvbXBvbmVudHNWZWN0b3JUeSA9IFNtYWxsVmVjdG9yPFZUVENvbXBvbmVudCwgNjQ+OworICAKKyAgLy8vIFxicmllZiBUaGUgVlRUIGNvbXBvbmVudHMuCisgIFZUVENvbXBvbmVudHNWZWN0b3JUeSBWVFRDb21wb25lbnRzOworICAKKyAgLy8vIFxicmllZiBUaGUgQVNUIHJlY29yZCBsYXlvdXQgb2YgdGhlIG1vc3QgZGVyaXZlZCBjbGFzcy4KKyAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZNb3N0RGVyaXZlZENsYXNzTGF5b3V0OworCisgIHVzaW5nIFZpc2l0ZWRWaXJ0dWFsQmFzZXNTZXRUeSA9IGxsdm06OlNtYWxsUHRyU2V0PGNvbnN0IENYWFJlY29yZERlY2wgKiwgND47CisKKyAgdXNpbmcgQWRkcmVzc1BvaW50c01hcFR5ID0gbGx2bTo6RGVuc2VNYXA8QmFzZVN1Ym9iamVjdCwgdWludDY0X3Q+OworCisgIC8vLyBcYnJpZWYgVGhlIHN1Yi1WVFQgaW5kaWNlcyBmb3IgdGhlIGJhc2VzIG9mIHRoZSBtb3N0IGRlcml2ZWQgY2xhc3MuCisgIGxsdm06OkRlbnNlTWFwPEJhc2VTdWJvYmplY3QsIHVpbnQ2NF90PiBTdWJWVFRJbmRpY2llczsKKworICAvLy8gXGJyaWVmIFRoZSBzZWNvbmRhcnkgdmlydHVhbCBwb2ludGVyIGluZGljZXMgb2YgYWxsIHN1Ym9iamVjdHMgb2YKKyAgLy8vIHRoZSBtb3N0IGRlcml2ZWQgY2xhc3MuCisgIGxsdm06OkRlbnNlTWFwPEJhc2VTdWJvYmplY3QsIHVpbnQ2NF90PiBTZWNvbmRhcnlWaXJ0dWFsUG9pbnRlckluZGljZXM7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoZSBWVFQgYnVpbGRlciBzaG91bGQgZ2VuZXJhdGUgTExWTSBJUiBmb3IgdGhlIFZUVC4KKyAgYm9vbCBHZW5lcmF0ZURlZmluaXRpb247CisKKyAgLy8vIFxicmllZiBBZGQgYSB2dGFibGUgcG9pbnRlciB0byB0aGUgVlRUIGN1cnJlbnRseSBiZWluZyBidWlsdC4KKyAgdm9pZCBBZGRWVGFibGVQb2ludGVyKEJhc2VTdWJvYmplY3QgQmFzZSwgdWludDY0X3QgVlRhYmxlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpWVGFibGVDbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgLy8vIFxicmllZiBMYXkgb3V0IHRoZSBzZWNvbmRhcnkgVlRUcyBvZiB0aGUgZ2l2ZW4gYmFzZSBzdWJvYmplY3QuCisgIHZvaWQgTGF5b3V0U2Vjb25kYXJ5VlRUcyhCYXNlU3Vib2JqZWN0IEJhc2UpOworICAKKyAgLy8vIFxicmllZiBMYXkgb3V0IHRoZSBzZWNvbmRhcnkgdmlydHVhbCBwb2ludGVycyBmb3IgdGhlIGdpdmVuIGJhc2UKKyAgLy8vIHN1Ym9iamVjdC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQmFzZUlzTW9yYWxseVZpcnR1YWwgd2hldGhlciB0aGUgYmFzZSBzdWJvYmplY3QgaXMgYSB2aXJ0dWFsIGJhc2UKKyAgLy8vIG9yIGEgZGlyZWN0IG9yIGluZGlyZWN0IGJhc2Ugb2YgYSB2aXJ0dWFsIGJhc2UuCisgIHZvaWQgTGF5b3V0U2Vjb25kYXJ5VmlydHVhbFBvaW50ZXJzKEJhc2VTdWJvYmplY3QgQmFzZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQmFzZUlzTW9yYWxseVZpcnR1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFZUYWJsZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpWVGFibGVDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzaXRlZFZpcnR1YWxCYXNlc1NldFR5ICZWQmFzZXMpOworICAKKyAgLy8vIFxicmllZiBMYXkgb3V0IHRoZSBzZWNvbmRhcnkgdmlydHVhbCBwb2ludGVycyBmb3IgdGhlIGdpdmVuIGJhc2UKKyAgLy8vIHN1Ym9iamVjdC4KKyAgdm9pZCBMYXlvdXRTZWNvbmRhcnlWaXJ0dWFsUG9pbnRlcnMoQmFzZVN1Ym9iamVjdCBCYXNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVlRhYmxlSW5kZXgpOworCisgIC8vLyBcYnJpZWYgTGF5IG91dCB0aGUgVlRUcyBmb3IgdGhlIHZpcnR1YWwgYmFzZSBjbGFzc2VzIG9mIHRoZSBnaXZlbgorICAvLy8gcmVjb3JkIGRlY2xhcmF0aW9uLgorICB2b2lkIExheW91dFZpcnR1YWxWVFRzKGNvbnN0IENYWFJlY29yZERlY2wgKlJELAorICAgICAgICAgICAgICAgICAgICAgICAgIFZpc2l0ZWRWaXJ0dWFsQmFzZXNTZXRUeSAmVkJhc2VzKTsKKyAgCisgIC8vLyBcYnJpZWYgTGF5IG91dCB0aGUgVlRUIGZvciB0aGUgZ2l2ZW4gc3Vib2JqZWN0LCBpbmNsdWRpbmcgYW55CisgIC8vLyBzZWNvbmRhcnkgVlRUcywgc2Vjb25kYXJ5IHZpcnR1YWwgcG9pbnRlcnMgYW5kIHZpcnR1YWwgVlRUcy4KKyAgdm9pZCBMYXlvdXRWVFQoQmFzZVN1Ym9iamVjdCBCYXNlLCBib29sIEJhc2VJc1ZpcnR1YWwpOworICAKK3B1YmxpYzoKKyAgVlRUQnVpbGRlcihBU1RDb250ZXh0ICZDdHgsIGNvbnN0IENYWFJlY29yZERlY2wgKk1vc3REZXJpdmVkQ2xhc3MsCisgICAgICAgICAgICAgYm9vbCBHZW5lcmF0ZURlZmluaXRpb24pOworCisgIC8vIFxicmllZiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBWVFQgY29tcG9uZW50cy4KKyAgY29uc3QgVlRUQ29tcG9uZW50c1ZlY3RvclR5ICZnZXRWVFRDb21wb25lbnRzKCkgY29uc3QgeworICAgIHJldHVybiBWVFRDb21wb25lbnRzOworICB9CisgIAorICAvLyBcYnJpZWYgUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgVlRUIHZ0YWJsZXMuCisgIGNvbnN0IFZUVFZUYWJsZXNWZWN0b3JUeSAmZ2V0VlRUVlRhYmxlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gVlRUVlRhYmxlczsKKyAgfQorICAKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzdWItVlRUIGluZGljZXMuCisgIGNvbnN0IGxsdm06OkRlbnNlTWFwPEJhc2VTdWJvYmplY3QsIHVpbnQ2NF90PiAmZ2V0U3ViVlRUSW5kaWNpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIFN1YlZUVEluZGljaWVzOworICB9CisgIAorICAvLy8gXGJyaWVmIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHNlY29uZGFyeSB2aXJ0dWFsIHBvaW50ZXIgaW5kaWNlcy4KKyAgY29uc3QgbGx2bTo6RGVuc2VNYXA8QmFzZVN1Ym9iamVjdCwgdWludDY0X3Q+ICYKKyAgZ2V0U2Vjb25kYXJ5VmlydHVhbFBvaW50ZXJJbmRpY2VzKCkgY29uc3QgeworICAgIHJldHVybiBTZWNvbmRhcnlWaXJ0dWFsUG9pbnRlckluZGljZXM7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9WVFRCVUlMREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVC9WVGFibGVCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvVlRhYmxlQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NTY1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1QvVlRhYmxlQnVpbGRlci5oCkBAIC0wLDAgKzEsNTg3IEBACisvLz09PS0tLSBWVGFibGVCdWlsZGVyLmggLSBDKysgdnRhYmxlIGxheW91dCBidWlsZGVyIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgY29udGFpbnMgY29kZSBkZWFsaW5nIHdpdGggZ2VuZXJhdGlvbiBvZiB0aGUgbGF5b3V0IG9mIHZpcnR1YWwgdGFibGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfVlRBQkxFQlVJTERFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX1ZUQUJMRUJVSUxERVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0Jhc2VTdWJvYmplY3QuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvQ1hYSW5oZXJpdGFuY2UuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvR2xvYmFsRGVjbC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9SZWNvcmRMYXlvdXQuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9BQkkuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgY2xhbmcgeworICBjbGFzcyBDWFhSZWNvcmREZWNsOworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBzaW5nbGUgY29tcG9uZW50IGluIGEgdnRhYmxlLgorY2xhc3MgVlRhYmxlQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgZW51bSBLaW5kIHsKKyAgICBDS19WQ2FsbE9mZnNldCwKKyAgICBDS19WQmFzZU9mZnNldCwKKyAgICBDS19PZmZzZXRUb1RvcCwKKyAgICBDS19SVFRJLAorICAgIENLX0Z1bmN0aW9uUG9pbnRlciwKKworICAgIC8vLyBcYnJpZWYgQSBwb2ludGVyIHRvIHRoZSBjb21wbGV0ZSBkZXN0cnVjdG9yLgorICAgIENLX0NvbXBsZXRlRHRvclBvaW50ZXIsCisKKyAgICAvLy8gXGJyaWVmIEEgcG9pbnRlciB0byB0aGUgZGVsZXRpbmcgZGVzdHJ1Y3Rvci4KKyAgICBDS19EZWxldGluZ0R0b3JQb2ludGVyLAorCisgICAgLy8vIFxicmllZiBBbiBlbnRyeSB0aGF0IGlzIG5ldmVyIHVzZWQuCisgICAgLy8vCisgICAgLy8vIEluIHNvbWUgY2FzZXMsIGEgdnRhYmxlIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBlbmQgdXAgbmV2ZXIgYmVpbmcKKyAgICAvLy8gY2FsbGVkLiBTdWNoIHZ0YWJsZSBmdW5jdGlvbiBwb2ludGVycyBhcmUgcmVwcmVzZW50ZWQgYXMgYQorICAgIC8vLyBDS19VbnVzZWRGdW5jdGlvblBvaW50ZXIuCisgICAgQ0tfVW51c2VkRnVuY3Rpb25Qb2ludGVyCisgIH07CisKKyAgVlRhYmxlQ29tcG9uZW50KCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBWVGFibGVDb21wb25lbnQgTWFrZVZDYWxsT2Zmc2V0KENoYXJVbml0cyBPZmZzZXQpIHsKKyAgICByZXR1cm4gVlRhYmxlQ29tcG9uZW50KENLX1ZDYWxsT2Zmc2V0LCBPZmZzZXQpOworICB9CisKKyAgc3RhdGljIFZUYWJsZUNvbXBvbmVudCBNYWtlVkJhc2VPZmZzZXQoQ2hhclVuaXRzIE9mZnNldCkgeworICAgIHJldHVybiBWVGFibGVDb21wb25lbnQoQ0tfVkJhc2VPZmZzZXQsIE9mZnNldCk7CisgIH0KKworICBzdGF0aWMgVlRhYmxlQ29tcG9uZW50IE1ha2VPZmZzZXRUb1RvcChDaGFyVW5pdHMgT2Zmc2V0KSB7CisgICAgcmV0dXJuIFZUYWJsZUNvbXBvbmVudChDS19PZmZzZXRUb1RvcCwgT2Zmc2V0KTsKKyAgfQorCisgIHN0YXRpYyBWVGFibGVDb21wb25lbnQgTWFrZVJUVEkoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIHsKKyAgICByZXR1cm4gVlRhYmxlQ29tcG9uZW50KENLX1JUVEksIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihSRCkpOworICB9CisKKyAgc3RhdGljIFZUYWJsZUNvbXBvbmVudCBNYWtlRnVuY3Rpb24oY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQpIHsKKyAgICBhc3NlcnQoIWlzYTxDWFhEZXN0cnVjdG9yRGVjbD4oTUQpICYmCisgICAgICAgICAgICJEb24ndCB1c2UgTWFrZUZ1bmN0aW9uIHdpdGggZGVzdHJ1Y3RvcnMhIik7CisKKyAgICByZXR1cm4gVlRhYmxlQ29tcG9uZW50KENLX0Z1bmN0aW9uUG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihNRCkpOworICB9CisKKyAgc3RhdGljIFZUYWJsZUNvbXBvbmVudCBNYWtlQ29tcGxldGVEdG9yKGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpERCkgeworICAgIHJldHVybiBWVGFibGVDb21wb25lbnQoQ0tfQ29tcGxldGVEdG9yUG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihERCkpOworICB9CisKKyAgc3RhdGljIFZUYWJsZUNvbXBvbmVudCBNYWtlRGVsZXRpbmdEdG9yKGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpERCkgeworICAgIHJldHVybiBWVGFibGVDb21wb25lbnQoQ0tfRGVsZXRpbmdEdG9yUG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihERCkpOworICB9CisKKyAgc3RhdGljIFZUYWJsZUNvbXBvbmVudCBNYWtlVW51c2VkRnVuY3Rpb24oY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQpIHsKKyAgICBhc3NlcnQoIWlzYTxDWFhEZXN0cnVjdG9yRGVjbD4oTUQpICYmCisgICAgICAgICAgICJEb24ndCB1c2UgTWFrZVVudXNlZEZ1bmN0aW9uIHdpdGggZGVzdHJ1Y3RvcnMhIik7CisgICAgcmV0dXJuIFZUYWJsZUNvbXBvbmVudChDS19VbnVzZWRGdW5jdGlvblBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oTUQpKTsKKyAgfQorCisgIHN0YXRpYyBWVGFibGVDb21wb25lbnQgZ2V0RnJvbU9wYXF1ZUludGVnZXIodWludDY0X3QgSSkgeworICAgIHJldHVybiBWVGFibGVDb21wb25lbnQoSSk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUga2luZCBvZiB0aGlzIHZ0YWJsZSBjb21wb25lbnQuCisgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKEtpbmQpKFZhbHVlICYgMHg3KTsKKyAgfQorCisgIENoYXJVbml0cyBnZXRWQ2FsbE9mZnNldCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0S2luZCgpID09IENLX1ZDYWxsT2Zmc2V0ICYmICJJbnZhbGlkIGNvbXBvbmVudCBraW5kISIpOworCisgICAgcmV0dXJuIGdldE9mZnNldCgpOworICB9CisKKyAgQ2hhclVuaXRzIGdldFZCYXNlT2Zmc2V0KCkgY29uc3QgeworICAgIGFzc2VydChnZXRLaW5kKCkgPT0gQ0tfVkJhc2VPZmZzZXQgJiYgIkludmFsaWQgY29tcG9uZW50IGtpbmQhIik7CisKKyAgICByZXR1cm4gZ2V0T2Zmc2V0KCk7CisgIH0KKworICBDaGFyVW5pdHMgZ2V0T2Zmc2V0VG9Ub3AoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEtpbmQoKSA9PSBDS19PZmZzZXRUb1RvcCAmJiAiSW52YWxpZCBjb21wb25lbnQga2luZCEiKTsKKworICAgIHJldHVybiBnZXRPZmZzZXQoKTsKKyAgfQorCisgIGNvbnN0IENYWFJlY29yZERlY2wgKmdldFJUVElEZWNsKCkgY29uc3QgeworICAgIGFzc2VydChpc1JUVElLaW5kKCkgJiYgIkludmFsaWQgY29tcG9uZW50IGtpbmQhIik7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q1hYUmVjb3JkRGVjbCAqPihnZXRQb2ludGVyKCkpOworICB9CisKKyAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqZ2V0RnVuY3Rpb25EZWNsKCkgY29uc3QgeworICAgIGFzc2VydChpc0Z1bmN0aW9uUG9pbnRlcktpbmQoKSAmJiAiSW52YWxpZCBjb21wb25lbnQga2luZCEiKTsKKyAgICBpZiAoaXNEZXN0cnVjdG9yS2luZCgpKQorICAgICAgcmV0dXJuIGdldERlc3RydWN0b3JEZWNsKCk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q1hYTWV0aG9kRGVjbCAqPihnZXRQb2ludGVyKCkpOworICB9CisKKyAgY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKmdldERlc3RydWN0b3JEZWNsKCkgY29uc3QgeworICAgIGFzc2VydChpc0Rlc3RydWN0b3JLaW5kKCkgJiYgIkludmFsaWQgY29tcG9uZW50IGtpbmQhIik7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q1hYRGVzdHJ1Y3RvckRlY2wgKj4oZ2V0UG9pbnRlcigpKTsKKyAgfQorCisgIGNvbnN0IENYWE1ldGhvZERlY2wgKmdldFVudXNlZEZ1bmN0aW9uRGVjbCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0S2luZCgpID09IENLX1VudXNlZEZ1bmN0aW9uUG9pbnRlciAmJiAiSW52YWxpZCBjb21wb25lbnQga2luZCEiKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDWFhNZXRob2REZWNsICo+KGdldFBvaW50ZXIoKSk7CisgIH0KKworICBib29sIGlzRGVzdHJ1Y3RvcktpbmQoKSBjb25zdCB7IHJldHVybiBpc0Rlc3RydWN0b3JLaW5kKGdldEtpbmQoKSk7IH0KKworICBib29sIGlzVXNlZEZ1bmN0aW9uUG9pbnRlcktpbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzVXNlZEZ1bmN0aW9uUG9pbnRlcktpbmQoZ2V0S2luZCgpKTsKKyAgfQorCisgIGJvb2wgaXNGdW5jdGlvblBvaW50ZXJLaW5kKCkgY29uc3QgeworICAgIHJldHVybiBpc0Z1bmN0aW9uUG9pbnRlcktpbmQoZ2V0S2luZCgpKTsKKyAgfQorCisgIGJvb2wgaXNSVFRJS2luZCgpIGNvbnN0IHsgcmV0dXJuIGlzUlRUSUtpbmQoZ2V0S2luZCgpKTsgfQorCisgIEdsb2JhbERlY2wgZ2V0R2xvYmFsRGVjbCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNVc2VkRnVuY3Rpb25Qb2ludGVyS2luZCgpICYmCisgICAgICAgICAgICJHbG9iYWxEZWNsIGNhbiBiZSBjcmVhdGVkIG9ubHkgZnJvbSB2aXJ0dWFsIGZ1bmN0aW9uIik7CisKKyAgICBhdXRvICpEdG9yRGVjbCA9IGR5bl9jYXN0PENYWERlc3RydWN0b3JEZWNsPihnZXRGdW5jdGlvbkRlY2woKSk7CisgICAgc3dpdGNoIChnZXRLaW5kKCkpIHsKKyAgICBjYXNlIENLX0Z1bmN0aW9uUG9pbnRlcjoKKyAgICAgIHJldHVybiBHbG9iYWxEZWNsKGdldEZ1bmN0aW9uRGVjbCgpKTsKKyAgICBjYXNlIENLX0NvbXBsZXRlRHRvclBvaW50ZXI6CisgICAgICByZXR1cm4gR2xvYmFsRGVjbChEdG9yRGVjbCwgQ1hYRHRvclR5cGU6OkR0b3JfQ29tcGxldGUpOworICAgIGNhc2UgQ0tfRGVsZXRpbmdEdG9yUG9pbnRlcjoKKyAgICAgIHJldHVybiBHbG9iYWxEZWNsKER0b3JEZWNsLCBDWFhEdG9yVHlwZTo6RHRvcl9EZWxldGluZyk7CisgICAgY2FzZSBDS19WQ2FsbE9mZnNldDoKKyAgICBjYXNlIENLX1ZCYXNlT2Zmc2V0OgorICAgIGNhc2UgQ0tfT2Zmc2V0VG9Ub3A6CisgICAgY2FzZSBDS19SVFRJOgorICAgIGNhc2UgQ0tfVW51c2VkRnVuY3Rpb25Qb2ludGVyOgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiT25seSBmdW5jdGlvbiBwb2ludGVycyBraW5kcyIpOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJTaG91bGQgYWxyZWFkeSByZXR1cm4iKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgYm9vbCBpc0Z1bmN0aW9uUG9pbnRlcktpbmQoS2luZCBDb21wb25lbnRLaW5kKSB7CisgICAgcmV0dXJuIGlzVXNlZEZ1bmN0aW9uUG9pbnRlcktpbmQoQ29tcG9uZW50S2luZCkgfHwKKyAgICAgICAgICAgQ29tcG9uZW50S2luZCA9PSBDS19VbnVzZWRGdW5jdGlvblBvaW50ZXI7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNVc2VkRnVuY3Rpb25Qb2ludGVyS2luZChLaW5kIENvbXBvbmVudEtpbmQpIHsKKyAgICByZXR1cm4gQ29tcG9uZW50S2luZCA9PSBDS19GdW5jdGlvblBvaW50ZXIgfHwKKyAgICAgICAgICAgaXNEZXN0cnVjdG9yS2luZChDb21wb25lbnRLaW5kKTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0Rlc3RydWN0b3JLaW5kKEtpbmQgQ29tcG9uZW50S2luZCkgeworICAgIHJldHVybiBDb21wb25lbnRLaW5kID09IENLX0NvbXBsZXRlRHRvclBvaW50ZXIgfHwKKyAgICAgICAgICAgQ29tcG9uZW50S2luZCA9PSBDS19EZWxldGluZ0R0b3JQb2ludGVyOworICB9CisgIHN0YXRpYyBib29sIGlzUlRUSUtpbmQoS2luZCBDb21wb25lbnRLaW5kKSB7CisgICAgcmV0dXJuIENvbXBvbmVudEtpbmQgPT0gQ0tfUlRUSTsKKyAgfQorCisgIFZUYWJsZUNvbXBvbmVudChLaW5kIENvbXBvbmVudEtpbmQsIENoYXJVbml0cyBPZmZzZXQpIHsKKyAgICBhc3NlcnQoKENvbXBvbmVudEtpbmQgPT0gQ0tfVkNhbGxPZmZzZXQgfHwKKyAgICAgICAgICAgIENvbXBvbmVudEtpbmQgPT0gQ0tfVkJhc2VPZmZzZXQgfHwKKyAgICAgICAgICAgIENvbXBvbmVudEtpbmQgPT0gQ0tfT2Zmc2V0VG9Ub3ApICYmICJJbnZhbGlkIGNvbXBvbmVudCBraW5kISIpOworICAgIGFzc2VydChPZmZzZXQuZ2V0UXVhbnRpdHkoKSA8ICgxTEwgPDwgNTYpICYmICJPZmZzZXQgaXMgdG9vIGJpZyEiKTsKKyAgICBhc3NlcnQoT2Zmc2V0LmdldFF1YW50aXR5KCkgPj0gLSgxTEwgPDwgNTYpICYmICJPZmZzZXQgaXMgdG9vIHNtYWxsISIpOworCisgICAgVmFsdWUgPSAodWludDY0X3QoT2Zmc2V0LmdldFF1YW50aXR5KCkpIDw8IDMpIHwgQ29tcG9uZW50S2luZDsKKyAgfQorCisgIFZUYWJsZUNvbXBvbmVudChLaW5kIENvbXBvbmVudEtpbmQsIHVpbnRwdHJfdCBQdHIpIHsKKyAgICBhc3NlcnQoKGlzUlRUSUtpbmQoQ29tcG9uZW50S2luZCkgfHwgaXNGdW5jdGlvblBvaW50ZXJLaW5kKENvbXBvbmVudEtpbmQpKSAmJgorICAgICAgICAgICAiSW52YWxpZCBjb21wb25lbnQga2luZCEiKTsKKworICAgIGFzc2VydCgoUHRyICYgNykgPT0gMCAmJiAiUG9pbnRlciBub3Qgc3VmZmljaWVudGx5IGFsaWduZWQhIik7CisKKyAgICBWYWx1ZSA9IFB0ciB8IENvbXBvbmVudEtpbmQ7CisgIH0KKworICBDaGFyVW5pdHMgZ2V0T2Zmc2V0KCkgY29uc3QgeworICAgIGFzc2VydCgoZ2V0S2luZCgpID09IENLX1ZDYWxsT2Zmc2V0IHx8IGdldEtpbmQoKSA9PSBDS19WQmFzZU9mZnNldCB8fAorICAgICAgICAgICAgZ2V0S2luZCgpID09IENLX09mZnNldFRvVG9wKSAmJiAiSW52YWxpZCBjb21wb25lbnQga2luZCEiKTsKKworICAgIHJldHVybiBDaGFyVW5pdHM6OmZyb21RdWFudGl0eShWYWx1ZSA+PiAzKTsKKyAgfQorCisgIHVpbnRwdHJfdCBnZXRQb2ludGVyKCkgY29uc3QgeworICAgIGFzc2VydCgoZ2V0S2luZCgpID09IENLX1JUVEkgfHwgaXNGdW5jdGlvblBvaW50ZXJLaW5kKCkpICYmCisgICAgICAgICAgICJJbnZhbGlkIGNvbXBvbmVudCBraW5kISIpOworCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oVmFsdWUgJiB+N1VMTCk7CisgIH0KKworICBleHBsaWNpdCBWVGFibGVDb21wb25lbnQodWludDY0X3QgVmFsdWUpCisgICAgOiBWYWx1ZShWYWx1ZSkgeyB9CisKKyAgLy8vIFRoZSBraW5kIGlzIHN0b3JlZCBpbiB0aGUgbG93ZXIgMyBiaXRzIG9mIHRoZSB2YWx1ZS4gRm9yIG9mZnNldHMsIHdlCisgIC8vLyBtYWtlIHVzZSBvZiB0aGUgZmFjdHMgdGhhdCBjbGFzc2VzIGNhbid0IGJlIGxhcmdlciB0aGFuIDJeNTUgYnl0ZXMsCisgIC8vLyBzbyB3ZSBzdG9yZSB0aGUgb2Zmc2V0IGluIHRoZSBsb3dlciBwYXJ0IG9mIHRoZSA2MSBiaXRzIHRoYXQgcmVtYWluLgorICAvLy8gKFRoZSByZWFzb24gdGhhdCB3ZSdyZSBub3Qgc2ltcGx5IHVzaW5nIGEgUG9pbnRlckludFBhaXIgaGVyZSBpcyB0aGF0IHdlCisgIC8vLyBuZWVkIHRoZSBvZmZzZXRzIHRvIGJlIDY0LWJpdCwgZXZlbiB3aGVuIG9uIGEgMzItYml0IG1hY2hpbmUpLgorICBpbnQ2NF90IFZhbHVlOworfTsKKworY2xhc3MgVlRhYmxlTGF5b3V0IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8dWludDY0X3QsIFRodW5rSW5mbz4gVlRhYmxlVGh1bmtUeTsKKyAgc3RydWN0IEFkZHJlc3NQb2ludExvY2F0aW9uIHsKKyAgICB1bnNpZ25lZCBWVGFibGVJbmRleCwgQWRkcmVzc1BvaW50SW5kZXg7CisgIH07CisgIHR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8QmFzZVN1Ym9iamVjdCwgQWRkcmVzc1BvaW50TG9jYXRpb24+CisgICAgICBBZGRyZXNzUG9pbnRzTWFwVHk7CisKK3ByaXZhdGU6CisgIC8vIFN0b3JlcyB0aGUgY29tcG9uZW50IGluZGljZXMgb2YgdGhlIGZpcnN0IGNvbXBvbmVudCBvZiBlYWNoIHZpcnR1YWwgdGFibGUgaW4KKyAgLy8gdGhlIHZpcnR1YWwgdGFibGUgZ3JvdXAuIFRvIHNhdmUgYSBsaXR0bGUgbWVtb3J5IGluIHRoZSBjb21tb24gY2FzZSB3aGVyZQorICAvLyB0aGUgdnRhYmxlIGdyb3VwIGNvbnRhaW5zIGEgc2luZ2xlIHZ0YWJsZSwgYW4gZW1wdHkgdmVjdG9yIGhlcmUgcmVwcmVzZW50cworICAvLyB0aGUgdmVjdG9yIHswfS4KKyAgT3duaW5nQXJyYXlSZWY8c2l6ZV90PiBWVGFibGVJbmRpY2VzOworCisgIE93bmluZ0FycmF5UmVmPFZUYWJsZUNvbXBvbmVudD4gVlRhYmxlQ29tcG9uZW50czsKKworICAvLy8gXGJyaWVmIENvbnRhaW5zIHRodW5rcyBuZWVkZWQgYnkgdnRhYmxlcywgc29ydGVkIGJ5IGluZGljZXMuCisgIE93bmluZ0FycmF5UmVmPFZUYWJsZVRodW5rVHk+IFZUYWJsZVRodW5rczsKKworICAvLy8gXGJyaWVmIEFkZHJlc3MgcG9pbnRzIGZvciBhbGwgdnRhYmxlcy4KKyAgQWRkcmVzc1BvaW50c01hcFR5IEFkZHJlc3NQb2ludHM7CisKK3B1YmxpYzoKKyAgVlRhYmxlTGF5b3V0KEFycmF5UmVmPHNpemVfdD4gVlRhYmxlSW5kaWNlcywKKyAgICAgICAgICAgICAgIEFycmF5UmVmPFZUYWJsZUNvbXBvbmVudD4gVlRhYmxlQ29tcG9uZW50cywKKyAgICAgICAgICAgICAgIEFycmF5UmVmPFZUYWJsZVRodW5rVHk+IFZUYWJsZVRodW5rcywKKyAgICAgICAgICAgICAgIGNvbnN0IEFkZHJlc3NQb2ludHNNYXBUeSAmQWRkcmVzc1BvaW50cyk7CisgIH5WVGFibGVMYXlvdXQoKTsKKworICBBcnJheVJlZjxWVGFibGVDb21wb25lbnQ+IHZ0YWJsZV9jb21wb25lbnRzKCkgY29uc3QgeworICAgIHJldHVybiBWVGFibGVDb21wb25lbnRzOworICB9CisKKyAgQXJyYXlSZWY8VlRhYmxlVGh1bmtUeT4gdnRhYmxlX3RodW5rcygpIGNvbnN0IHsKKyAgICByZXR1cm4gVlRhYmxlVGh1bmtzOworICB9CisKKyAgQWRkcmVzc1BvaW50TG9jYXRpb24gZ2V0QWRkcmVzc1BvaW50KEJhc2VTdWJvYmplY3QgQmFzZSkgY29uc3QgeworICAgIGFzc2VydChBZGRyZXNzUG9pbnRzLmNvdW50KEJhc2UpICYmICJEaWQgbm90IGZpbmQgYWRkcmVzcyBwb2ludCEiKTsKKyAgICByZXR1cm4gQWRkcmVzc1BvaW50cy5maW5kKEJhc2UpLT5zZWNvbmQ7CisgIH0KKworICBjb25zdCBBZGRyZXNzUG9pbnRzTWFwVHkgJmdldEFkZHJlc3NQb2ludHMoKSBjb25zdCB7CisgICAgcmV0dXJuIEFkZHJlc3NQb2ludHM7CisgIH0KKworICBzaXplX3QgZ2V0TnVtVlRhYmxlcygpIGNvbnN0IHsKKyAgICBpZiAoVlRhYmxlSW5kaWNlcy5lbXB0eSgpKQorICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIFZUYWJsZUluZGljZXMuc2l6ZSgpOworICB9CisKKyAgc2l6ZV90IGdldFZUYWJsZU9mZnNldChzaXplX3QgaSkgY29uc3QgeworICAgIGlmIChWVGFibGVJbmRpY2VzLmVtcHR5KCkpIHsKKyAgICAgIGFzc2VydChpID09IDApOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBWVGFibGVJbmRpY2VzW2ldOworICB9CisKKyAgc2l6ZV90IGdldFZUYWJsZVNpemUoc2l6ZV90IGkpIGNvbnN0IHsKKyAgICBpZiAoVlRhYmxlSW5kaWNlcy5lbXB0eSgpKSB7CisgICAgICBhc3NlcnQoaSA9PSAwKTsKKyAgICAgIHJldHVybiB2dGFibGVfY29tcG9uZW50cygpLnNpemUoKTsKKyAgICB9CisKKyAgICBzaXplX3QgdGhpc0luZGV4ID0gVlRhYmxlSW5kaWNlc1tpXTsKKyAgICBzaXplX3QgbmV4dEluZGV4ID0gKGkgKyAxID09IFZUYWJsZUluZGljZXMuc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB2dGFibGVfY29tcG9uZW50cygpLnNpemUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBWVGFibGVJbmRpY2VzW2kgKyAxXTsKKyAgICByZXR1cm4gbmV4dEluZGV4IC0gdGhpc0luZGV4OworICB9Cit9OworCitjbGFzcyBWVGFibGVDb250ZXh0QmFzZSB7CitwdWJsaWM6CisgIHR5cGVkZWYgU21hbGxWZWN0b3I8VGh1bmtJbmZvLCAxPiBUaHVua0luZm9WZWN0b3JUeTsKKworICBib29sIGlzTWljcm9zb2Z0KCkgY29uc3QgeyByZXR1cm4gSXNNaWNyb3NvZnRBQkk7IH0KKworICB2aXJ0dWFsIH5WVGFibGVDb250ZXh0QmFzZSgpIHt9CisKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBsbHZtOjpEZW5zZU1hcDxjb25zdCBDWFhNZXRob2REZWNsICosIFRodW5rSW5mb1ZlY3RvclR5PiBUaHVua3NNYXBUeTsKKworICAvLy8gXGJyaWVmIENvbnRhaW5zIGFsbCB0aHVua3MgdGhhdCBhIGdpdmVuIG1ldGhvZCBkZWNsIHdpbGwgbmVlZC4KKyAgVGh1bmtzTWFwVHkgVGh1bmtzOworCisgIC8vLyBDb21wdXRlIGFuZCBzdG9yZSBhbGwgdnRhYmxlIHJlbGF0ZWQgaW5mb3JtYXRpb24gKHZ0YWJsZSBsYXlvdXQsIHZiYXNlCisgIC8vLyBvZmZzZXQgb2Zmc2V0cywgdGh1bmtzIGV0YykgZm9yIHRoZSBnaXZlbiByZWNvcmQgZGVjbC4KKyAgdmlydHVhbCB2b2lkIGNvbXB1dGVWVGFibGVSZWxhdGVkSW5mb3JtYXRpb24oY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpID0gMDsKKworICBWVGFibGVDb250ZXh0QmFzZShib29sIE1TKSA6IElzTWljcm9zb2Z0QUJJKE1TKSB7fQorCitwdWJsaWM6CisgIHZpcnR1YWwgY29uc3QgVGh1bmtJbmZvVmVjdG9yVHkgKmdldFRodW5rSW5mbyhHbG9iYWxEZWNsIEdEKSB7CisgICAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQgPSBjYXN0PENYWE1ldGhvZERlY2w+KEdELmdldERlY2woKS0+Z2V0Q2Fub25pY2FsRGVjbCgpKTsKKyAgICBjb21wdXRlVlRhYmxlUmVsYXRlZEluZm9ybWF0aW9uKE1ELT5nZXRQYXJlbnQoKSk7CisKKyAgICAvLyBUaGlzIGFzc3VtZXMgdGhhdCBhbGwgdGhlIGRlc3RydWN0b3JzIHByZXNlbnQgaW4gdGhlIHZ0YWJsZQorICAgIC8vIHVzZSBleGFjdGx5IHRoZSBzYW1lIHNldCBvZiB0aHVua3MuCisgICAgVGh1bmtzTWFwVHk6OmNvbnN0X2l0ZXJhdG9yIEkgPSBUaHVua3MuZmluZChNRCk7CisgICAgaWYgKEkgPT0gVGh1bmtzLmVuZCgpKSB7CisgICAgICAvLyBXZSBkaWQgbm90IGZpbmQgYSB0aHVuayBmb3IgdGhpcyBtZXRob2QuCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gJkktPnNlY29uZDsKKyAgfQorCisgIGJvb2wgSXNNaWNyb3NvZnRBQkk7Cit9OworCitjbGFzcyBJdGFuaXVtVlRhYmxlQ29udGV4dCA6IHB1YmxpYyBWVGFibGVDb250ZXh0QmFzZSB7Citwcml2YXRlOgorCisgIC8vLyBcYnJpZWYgQ29udGFpbnMgdGhlIGluZGV4IChyZWxhdGl2ZSB0byB0aGUgdnRhYmxlIGFkZHJlc3MgcG9pbnQpCisgIC8vLyB3aGVyZSB0aGUgZnVuY3Rpb24gcG9pbnRlciBmb3IgYSB2aXJ0dWFsIGZ1bmN0aW9uIGlzIHN0b3JlZC4KKyAgdHlwZWRlZiBsbHZtOjpEZW5zZU1hcDxHbG9iYWxEZWNsLCBpbnQ2NF90PiBNZXRob2RWVGFibGVJbmRpY2VzVHk7CisgIE1ldGhvZFZUYWJsZUluZGljZXNUeSBNZXRob2RWVGFibGVJbmRpY2VzOworCisgIHR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBWVGFibGVMYXlvdXQ+PgorICAgICAgVlRhYmxlTGF5b3V0TWFwVHk7CisgIFZUYWJsZUxheW91dE1hcFR5IFZUYWJsZUxheW91dHM7CisKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICo+IENsYXNzUGFpclR5OworCisgIC8vLyBcYnJpZWYgdnRhYmxlIG9mZnNldHMgZm9yIG9mZnNldHMgb2YgdmlydHVhbCBiYXNlcyBvZiBhIGNsYXNzLgorICAvLy8KKyAgLy8vIENvbnRhaW5zIHRoZSB2dGFibGUgb2Zmc2V0IChyZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBwb2ludCkgaW4gY2hhcnMKKyAgLy8vIHdoZXJlIHRoZSBvZmZzZXRzIGZvciB2aXJ0dWFsIGJhc2VzIG9mIGEgY2xhc3MgYXJlIHN0b3JlZC4KKyAgdHlwZWRlZiBsbHZtOjpEZW5zZU1hcDxDbGFzc1BhaXJUeSwgQ2hhclVuaXRzPgorICAgIFZpcnR1YWxCYXNlQ2xhc3NPZmZzZXRPZmZzZXRzTWFwVHk7CisgIFZpcnR1YWxCYXNlQ2xhc3NPZmZzZXRPZmZzZXRzTWFwVHkgVmlydHVhbEJhc2VDbGFzc09mZnNldE9mZnNldHM7CisKKyAgdm9pZCBjb21wdXRlVlRhYmxlUmVsYXRlZEluZm9ybWF0aW9uKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSBvdmVycmlkZTsKKworcHVibGljOgorICBJdGFuaXVtVlRhYmxlQ29udGV4dChBU1RDb250ZXh0ICZDb250ZXh0KTsKKyAgfkl0YW5pdW1WVGFibGVDb250ZXh0KCkgb3ZlcnJpZGU7CisKKyAgY29uc3QgVlRhYmxlTGF5b3V0ICZnZXRWVGFibGVMYXlvdXQoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIHsKKyAgICBjb21wdXRlVlRhYmxlUmVsYXRlZEluZm9ybWF0aW9uKFJEKTsKKyAgICBhc3NlcnQoVlRhYmxlTGF5b3V0cy5jb3VudChSRCkgJiYgIk5vIGxheW91dCBmb3IgdGhpcyByZWNvcmQgZGVjbCEiKTsKKworICAgIHJldHVybiAqVlRhYmxlTGF5b3V0c1tSRF07CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8VlRhYmxlTGF5b3V0PiBjcmVhdGVDb25zdHJ1Y3Rpb25WVGFibGVMYXlvdXQoCisgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpNb3N0RGVyaXZlZENsYXNzLCBDaGFyVW5pdHMgTW9zdERlcml2ZWRDbGFzc09mZnNldCwKKyAgICAgIGJvb2wgTW9zdERlcml2ZWRDbGFzc0lzVmlydHVhbCwgY29uc3QgQ1hYUmVjb3JkRGVjbCAqTGF5b3V0Q2xhc3MpOworCisgIC8vLyBcYnJpZWYgTG9jYXRlIGEgdmlydHVhbCBmdW5jdGlvbiBpbiB0aGUgdnRhYmxlLgorICAvLy8KKyAgLy8vIFJldHVybiB0aGUgaW5kZXggKHJlbGF0aXZlIHRvIHRoZSB2dGFibGUgYWRkcmVzcyBwb2ludCkgd2hlcmUgdGhlCisgIC8vLyBmdW5jdGlvbiBwb2ludGVyIGZvciB0aGUgZ2l2ZW4gdmlydHVhbCBmdW5jdGlvbiBpcyBzdG9yZWQuCisgIHVpbnQ2NF90IGdldE1ldGhvZFZUYWJsZUluZGV4KEdsb2JhbERlY2wgR0QpOworCisgIC8vLyBSZXR1cm4gdGhlIG9mZnNldCBpbiBjaGFycyAocmVsYXRpdmUgdG8gdGhlIHZ0YWJsZSBhZGRyZXNzIHBvaW50KSB3aGVyZQorICAvLy8gdGhlIG9mZnNldCBvZiB0aGUgdmlydHVhbCBiYXNlIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIGJhc2UgaXMgc3RvcmVkLAorICAvLy8gb3RoZXJ3aXNlLCBpZiBubyB2aXJ0dWFsIGJhc2UgY29udGFpbnMgdGhlIGdpdmVuIGNsYXNzLCByZXR1cm4gMC4gCisgIC8vLworICAvLy8gQmFzZSBtdXN0IGJlIGEgdmlydHVhbCBiYXNlIGNsYXNzIG9yIGFuIHVuYW1iaWd1b3VzIGJhc2UuCisgIENoYXJVbml0cyBnZXRWaXJ0dWFsQmFzZU9mZnNldE9mZnNldChjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlZCYXNlKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZUYWJsZUNvbnRleHRCYXNlICpWVCkgeworICAgIHJldHVybiAhVlQtPmlzTWljcm9zb2Z0KCk7CisgIH0KK307CisKKy8vLyBIb2xkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5oZXJpdGFuY2UgcGF0aCB0byBhIHZpcnR1YWwgYmFzZSBvciBmdW5jdGlvbgorLy8vIHRhYmxlIHBvaW50ZXIuICBBIHJlY29yZCBtYXkgY29udGFpbiBhcyBtYW55IHZmcHRycyBvciB2YnB0cnMgYXMgdGhlcmUgYXJlCisvLy8gYmFzZSBzdWJvYmplY3RzLgorc3RydWN0IFZQdHJJbmZvIHsKKyAgdHlwZWRlZiBTbWFsbFZlY3Rvcjxjb25zdCBDWFhSZWNvcmREZWNsICosIDE+IEJhc2VQYXRoOworCisgIFZQdHJJbmZvKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKQorICAgICAgOiBPYmplY3RXaXRoVlB0cihSRCksIEludHJvZHVjaW5nT2JqZWN0KFJEKSwgTmV4dEJhc2VUb01hbmdsZShSRCkge30KKworICAvLy8gVGhpcyBpcyB0aGUgbW9zdCBkZXJpdmVkIGNsYXNzIHRoYXQgaGFzIHRoaXMgdnB0ciBhdCBvZmZzZXQgemVyby4gV2hlbgorICAvLy8gc2luZ2xlIGluaGVyaXRhbmNlIGlzIHVzZWQsIHRoaXMgaXMgYWx3YXlzIHRoZSBtb3N0IGRlcml2ZWQgY2xhc3MuIElmCisgIC8vLyBtdWx0aXBsZSBpbmhlcml0YW5jZSBpcyB1c2VkLCBpdCBtYXkgYmUgYW55IGRpcmVjdCBvciBpbmRpcmVjdCBiYXNlLgorICBjb25zdCBDWFhSZWNvcmREZWNsICpPYmplY3RXaXRoVlB0cjsKKworICAvLy8gVGhpcyBpcyB0aGUgY2xhc3MgdGhhdCBpbnRyb2R1Y2VkIHRoZSB2cHRyIGJ5IGRlY2xhcmluZyBuZXcgdmlydHVhbAorICAvLy8gbWV0aG9kcyBvciB2aXJ0dWFsIGJhc2VzLgorICBjb25zdCBDWFhSZWNvcmREZWNsICpJbnRyb2R1Y2luZ09iamVjdDsKKworICAvLy8gSW50cm9kdWNpbmdPYmplY3QgaXMgYXQgdGhpcyBvZmZzZXQgZnJvbSBpdHMgY29udGFpbmluZyBjb21wbGV0ZSBvYmplY3Qgb3IKKyAgLy8vIHZpcnR1YWwgYmFzZS4KKyAgQ2hhclVuaXRzIE5vblZpcnR1YWxPZmZzZXQ7CisKKyAgLy8vIFRoZSBiYXNlcyBmcm9tIHRoZSBpbmhlcml0YW5jZSBwYXRoIHRoYXQgZ290IHVzZWQgdG8gbWFuZ2xlIHRoZSB2YnRhYmxlCisgIC8vLyBuYW1lLiAgVGhpcyBpcyBub3QgcmVhbGx5IGEgZnVsbCBwYXRoIGxpa2UgYSBDWFhCYXNlUGF0aC4gIEl0IGhvbGRzIHRoZQorICAvLy8gc3Vic2V0IG9mIHJlY29yZHMgdGhhdCBuZWVkIHRvIGJlIG1hbmdsZWQgaW50byB0aGUgdmJ0YWJsZSBzeW1ib2wgbmFtZSBpbgorICAvLy8gb3JkZXIgdG8gZ2V0IGEgdW5pcXVlIG5hbWUuCisgIEJhc2VQYXRoIE1hbmdsZWRQYXRoOworCisgIC8vLyBUaGUgbmV4dCBiYXNlIHRvIHB1c2ggb250byB0aGUgbWFuZ2xlZCBwYXRoIGlmIHRoaXMgcGF0aCBpcyBhbWJpZ3VvdXMgaW4gYQorICAvLy8gZGVyaXZlZCBjbGFzcy4gIElmIGl0J3MgbnVsbCwgdGhlbiBpdCdzIGFscmVhZHkgYmVlbiBwdXNoZWQgb250byB0aGUgcGF0aC4KKyAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqTmV4dEJhc2VUb01hbmdsZTsKKworICAvLy8gVGhlIHNldCBvZiBwb3NzaWJseSBpbmRpcmVjdCB2YmFzZXMgdGhhdCBjb250YWluIHRoaXMgdmJ0YWJsZS4gIFdoZW4gYQorICAvLy8gZGVyaXZlZCBjbGFzcyBpbmRpcmVjdGx5IGluaGVyaXRzIGZyb20gdGhlIHNhbWUgdmJhc2UgdHdpY2UsIHdlIG9ubHkga2VlcAorICAvLy8gdnRhYmxlcyBhbmQgdGhlaXIgcGF0aHMgZnJvbSB0aGUgZmlyc3QgaW5zdGFuY2UuCisgIEJhc2VQYXRoIENvbnRhaW5pbmdWQmFzZXM7CisKKyAgLy8vIFRoaXMgaG9sZHMgdGhlIGJhc2UgY2xhc3NlcyBwYXRoIGZyb20gdGhlIGNvbXBsZXRlIHR5cGUgdG8gdGhlIGZpcnN0IGJhc2UKKyAgLy8vIHdpdGggdGhlIGdpdmVuIHZmcHRyIG9mZnNldCwgaW4gdGhlIGJhc2UtdG8tZGVyaXZlZCBvcmRlci4gIE9ubHkgdXNlZCBmb3IKKyAgLy8vIHZmdGFibGVzLgorICBCYXNlUGF0aCBQYXRoVG9JbnRyb2R1Y2luZ09iamVjdDsKKworICAvLy8gU3RhdGljIG9mZnNldCBmcm9tIHRoZSB0b3Agb2YgdGhlIG1vc3QgZGVyaXZlZCBjbGFzcyB0byB0aGlzIHZmcHRyLAorICAvLy8gaW5jbHVkaW5nIGFueSB2aXJ0dWFsIGJhc2Ugb2Zmc2V0LiAgT25seSB1c2VkIGZvciB2ZnRhYmxlcy4KKyAgQ2hhclVuaXRzIEZ1bGxPZmZzZXRJbk1EQzsKKworICAvLy8gVGhlIHZwdHIgaXMgc3RvcmVkIGluc2lkZSB0aGUgbm9uLXZpcnR1YWwgY29tcG9uZW50IG9mIHRoaXMgdmlydHVhbCBiYXNlLgorICBjb25zdCBDWFhSZWNvcmREZWNsICpnZXRWQmFzZVdpdGhWUHRyKCkgY29uc3QgeworICAgIHJldHVybiBDb250YWluaW5nVkJhc2VzLmVtcHR5KCkgPyBudWxscHRyIDogQ29udGFpbmluZ1ZCYXNlcy5mcm9udCgpOworICB9Cit9OworCit0eXBlZGVmIFNtYWxsVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxWUHRySW5mbz4sIDI+IFZQdHJJbmZvVmVjdG9yOworCisvLy8gQWxsIHZpcnR1YWwgYmFzZSByZWxhdGVkIGluZm9ybWF0aW9uIGFib3V0IGEgZ2l2ZW4gcmVjb3JkIGRlY2wuICBJbmNsdWRlcworLy8vIGluZm9ybWF0aW9uIG9uIGFsbCB2aXJ0dWFsIGJhc2UgdGFibGVzIGFuZCB0aGUgcGF0aCBjb21wb25lbnRzIHRoYXQgYXJlIHVzZWQKKy8vLyB0byBtYW5nbGUgdGhlbS4KK3N0cnVjdCBWaXJ0dWFsQmFzZUluZm8geworICAvLy8gQSBtYXAgZnJvbSB2aXJ0dWFsIGJhc2UgdG8gdmJ0YWJsZSBpbmRleCBmb3IgZG9pbmcgYSBjb252ZXJzaW9uIGZyb20gdGhlCisgIC8vLyB0aGUgZGVyaXZlZCBjbGFzcyB0byB0aGUgYSBiYXNlLgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBDWFhSZWNvcmREZWNsICosIHVuc2lnbmVkPiBWQlRhYmxlSW5kaWNlczsKKworICAvLy8gSW5mb3JtYXRpb24gb24gYWxsIHZpcnR1YWwgYmFzZSB0YWJsZXMgdXNlZCB3aGVuIHRoaXMgcmVjb3JkIGlzIHRoZSBtb3N0CisgIC8vLyBkZXJpdmVkIGNsYXNzLgorICBWUHRySW5mb1ZlY3RvciBWQlB0clBhdGhzOworfTsKKworc3RydWN0IE1ldGhvZFZGVGFibGVMb2NhdGlvbiB7CisgIC8vLyBJZiBub256ZXJvLCBob2xkcyB0aGUgdmJ0YWJsZSBpbmRleCBvZiB0aGUgdmlydHVhbCBiYXNlIHdpdGggdGhlIHZmcHRyLgorICB1aW50NjRfdCBWQlRhYmxlSW5kZXg7CisKKyAgLy8vIElmIG5vbm51bGwsIGhvbGRzIHRoZSBsYXN0IHZiYXNlIHdoaWNoIGNvbnRhaW5zIHRoZSB2ZnB0ciB0aGF0IHRoZQorICAvLy8gbWV0aG9kIGRlZmluaXRpb24gaXMgYWRqdXN0ZWQgdG8uCisgIGNvbnN0IENYWFJlY29yZERlY2wgKlZCYXNlOworCisgIC8vLyBUaGlzIGlzIHRoZSBvZmZzZXQgb2YgdGhlIHZmcHRyIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBsYXN0IHZiYXNlLCBvciB0aGUKKyAgLy8vIGNvbXBsZXRlIHR5cGUgaWYgdGhlcmUgYXJlIG5vIHZpcnR1YWwgYmFzZXMuCisgIENoYXJVbml0cyBWRlB0ck9mZnNldDsKKworICAvLy8gTWV0aG9kJ3MgaW5kZXggaW4gdGhlIHZmdGFibGUuCisgIHVpbnQ2NF90IEluZGV4OworCisgIE1ldGhvZFZGVGFibGVMb2NhdGlvbigpCisgICAgICA6IFZCVGFibGVJbmRleCgwKSwgVkJhc2UobnVsbHB0ciksIFZGUHRyT2Zmc2V0KENoYXJVbml0czo6WmVybygpKSwKKyAgICAgICAgSW5kZXgoMCkge30KKworICBNZXRob2RWRlRhYmxlTG9jYXRpb24odWludDY0X3QgVkJUYWJsZUluZGV4LCBjb25zdCBDWFhSZWNvcmREZWNsICpWQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBWRlB0ck9mZnNldCwgdWludDY0X3QgSW5kZXgpCisgICAgICA6IFZCVGFibGVJbmRleChWQlRhYmxlSW5kZXgpLCBWQmFzZShWQmFzZSksIFZGUHRyT2Zmc2V0KFZGUHRyT2Zmc2V0KSwKKyAgICAgICAgSW5kZXgoSW5kZXgpIHt9CisKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgTWV0aG9kVkZUYWJsZUxvY2F0aW9uICZvdGhlcikgY29uc3QgeworICAgIGlmIChWQlRhYmxlSW5kZXggIT0gb3RoZXIuVkJUYWJsZUluZGV4KSB7CisgICAgICBhc3NlcnQoVkJhc2UgIT0gb3RoZXIuVkJhc2UpOworICAgICAgcmV0dXJuIFZCVGFibGVJbmRleCA8IG90aGVyLlZCVGFibGVJbmRleDsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6dGllKFZGUHRyT2Zmc2V0LCBJbmRleCkgPAorICAgICAgICAgICBzdGQ6OnRpZShvdGhlci5WRlB0ck9mZnNldCwgb3RoZXIuSW5kZXgpOworICB9Cit9OworCitjbGFzcyBNaWNyb3NvZnRWVGFibGVDb250ZXh0IDogcHVibGljIFZUYWJsZUNvbnRleHRCYXNlIHsKK3B1YmxpYzoKKworcHJpdmF0ZToKKyAgQVNUQ29udGV4dCAmQ29udGV4dDsKKworICB0eXBlZGVmIGxsdm06OkRlbnNlTWFwPEdsb2JhbERlY2wsIE1ldGhvZFZGVGFibGVMb2NhdGlvbj4KKyAgICBNZXRob2RWRlRhYmxlTG9jYXRpb25zVHk7CisgIE1ldGhvZFZGVGFibGVMb2NhdGlvbnNUeSBNZXRob2RWRlRhYmxlTG9jYXRpb25zOworCisgIHR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLCBWUHRySW5mb1ZlY3Rvcj4KKyAgICAgIFZGUHRyTG9jYXRpb25zTWFwVHk7CisgIFZGUHRyTG9jYXRpb25zTWFwVHkgVkZQdHJMb2NhdGlvbnM7CisKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLCBDaGFyVW5pdHM+IFZGVGFibGVJZFR5OworICB0eXBlZGVmIGxsdm06OkRlbnNlTWFwPFZGVGFibGVJZFR5LCBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgVlRhYmxlTGF5b3V0Pj4KKyAgICAgIFZGVGFibGVMYXlvdXRNYXBUeTsKKyAgVkZUYWJsZUxheW91dE1hcFR5IFZGVGFibGVMYXlvdXRzOworCisgIGxsdm06OkRlbnNlTWFwPGNvbnN0IENYWFJlY29yZERlY2wgKiwgc3RkOjp1bmlxdWVfcHRyPFZpcnR1YWxCYXNlSW5mbz4+CisgICAgICBWQmFzZUluZm87CisKKyAgdm9pZCBlbnVtZXJhdGVWRlB0cnMoY29uc3QgQ1hYUmVjb3JkRGVjbCAqRm9yQ2xhc3MsIFZQdHJJbmZvVmVjdG9yICZSZXN1bHQpOworCisgIHZvaWQgY29tcHV0ZVZUYWJsZVJlbGF0ZWRJbmZvcm1hdGlvbihjb25zdCBDWFhSZWNvcmREZWNsICpSRCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBkdW1wTWV0aG9kTG9jYXRpb25zKGNvbnN0IENYWFJlY29yZERlY2wgKlJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0aG9kVkZUYWJsZUxvY2F0aW9uc1R5ICZOZXdNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJik7CisKKyAgY29uc3QgVmlydHVhbEJhc2VJbmZvICYKKyAgY29tcHV0ZVZCVGFibGVSZWxhdGVkSW5mb3JtYXRpb24oY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpOworCisgIHZvaWQgY29tcHV0ZVZUYWJsZVBhdGhzKGJvb2wgRm9yVkJUYWJsZXMsIGNvbnN0IENYWFJlY29yZERlY2wgKlJELAorICAgICAgICAgICAgICAgICAgICAgICAgICBWUHRySW5mb1ZlY3RvciAmUGF0aHMpOworCitwdWJsaWM6CisgIE1pY3Jvc29mdFZUYWJsZUNvbnRleHQoQVNUQ29udGV4dCAmQ29udGV4dCkKKyAgICAgIDogVlRhYmxlQ29udGV4dEJhc2UoLypNUz0qL3RydWUpLCBDb250ZXh0KENvbnRleHQpIHt9CisKKyAgfk1pY3Jvc29mdFZUYWJsZUNvbnRleHQoKSBvdmVycmlkZTsKKworICBjb25zdCBWUHRySW5mb1ZlY3RvciAmZ2V0VkZQdHJPZmZzZXRzKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKTsKKworICBjb25zdCBWVGFibGVMYXlvdXQgJmdldFZGVGFibGVMYXlvdXQoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVW5pdHMgVkZQdHJPZmZzZXQpOworCisgIGNvbnN0IE1ldGhvZFZGVGFibGVMb2NhdGlvbiAmZ2V0TWV0aG9kVkZUYWJsZUxvY2F0aW9uKEdsb2JhbERlY2wgR0QpOworCisgIGNvbnN0IFRodW5rSW5mb1ZlY3RvclR5ICpnZXRUaHVua0luZm8oR2xvYmFsRGVjbCBHRCkgb3ZlcnJpZGUgeworICAgIC8vIENvbXBsZXRlIGRlc3RydWN0b3JzIGRvbid0IGhhdmUgYSBzbG90IGluIGEgdmZ0YWJsZSwgc28gbm8gdGh1bmtzIG5lZWRlZC4KKyAgICBpZiAoaXNhPENYWERlc3RydWN0b3JEZWNsPihHRC5nZXREZWNsKCkpICYmCisgICAgICAgIEdELmdldER0b3JUeXBlKCkgPT0gRHRvcl9Db21wbGV0ZSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBWVGFibGVDb250ZXh0QmFzZTo6Z2V0VGh1bmtJbmZvKEdEKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgaW5kZXggb2YgVkJhc2UgaW4gdGhlIHZidGFibGUgb2YgRGVyaXZlZC4KKyAgLy8vIFZCYXNlIG11c3QgYmUgYSBtb3JhbGx5IHZpcnR1YWwgYmFzZSBvZiBEZXJpdmVkLgorICAvLy8gVGhlIHZidGFibGUgaXMgYW4gYXJyYXkgb2YgaTMyIG9mZnNldHMuICBUaGUgZmlyc3QgZW50cnkgaXMgYSBzZWxmIGVudHJ5LAorICAvLy8gYW5kIHRoZSByZXN0IGFyZSBvZmZzZXRzIGZyb20gdGhlIHZicHRyIHRvIHZpcnR1YWwgYmFzZXMuCisgIHVuc2lnbmVkIGdldFZCVGFibGVJbmRleChjb25zdCBDWFhSZWNvcmREZWNsICpEZXJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqVkJhc2UpOworCisgIGNvbnN0IFZQdHJJbmZvVmVjdG9yICZlbnVtZXJhdGVWQlRhYmxlcyhjb25zdCBDWFhSZWNvcmREZWNsICpSRCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWVGFibGVDb250ZXh0QmFzZSAqVlQpIHsgcmV0dXJuIFZULT5pc01pY3Jvc29mdCgpOyB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVE1hdGNoZXJzL0FTVE1hdGNoRmluZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaEZpbmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OWFmMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaEZpbmRlci5oCkBAIC0wLDAgKzEsMzE2IEBACisvLz09PS0tLSBBU1RNYXRjaEZpbmRlci5oIC0gU3RydWN0dXJhbCBxdWVyeSBmcmFtZXdvcmsgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBQcm92aWRlcyBhIHdheSB0byBjb25zdHJ1Y3QgYW4gQVNUQ29uc3VtZXIgdGhhdCBydW5zIGdpdmVuIG1hdGNoZXJzCisvLyAgb3ZlciB0aGUgQVNUIGFuZCBpbnZva2VzIGEgZ2l2ZW4gY2FsbGJhY2sgb24gZXZlcnkgbWF0Y2guCisvLworLy8gIFRoZSBnZW5lcmFsIGlkZWEgaXMgdG8gY29uc3RydWN0IGEgbWF0Y2hlciBleHByZXNzaW9uIHRoYXQgZGVzY3JpYmVzIGEKKy8vICBzdWJ0cmVlIG1hdGNoIG9uIHRoZSBBU1QuIE5leHQsIGEgY2FsbGJhY2sgdGhhdCBpcyBleGVjdXRlZCBldmVyeSB0aW1lIHRoZQorLy8gIGV4cHJlc3Npb24gbWF0Y2hlcyBpcyByZWdpc3RlcmVkLCBhbmQgdGhlIG1hdGNoZXIgaXMgcnVuIG92ZXIgdGhlIEFTVCBvZgorLy8gIHNvbWUgY29kZS4gTWF0Y2hlZCBzdWJleHByZXNzaW9ucyBjYW4gYmUgYm91bmQgdG8gc3RyaW5nIElEcyBhbmQgZWFzaWx5CisvLyAgYmUgYWNjZXNzZWQgZnJvbSB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjay4gVGhlIGNhbGxiYWNrIGNhbiB0aGFuIHVzZSB0aGUKKy8vICBBU1Qgbm9kZXMgdGhhdCB0aGUgc3ViZXhwcmVzc2lvbnMgbWF0Y2hlZCBvbiB0byBvdXRwdXQgaW5mb3JtYXRpb24gYWJvdXQKKy8vICB0aGUgbWF0Y2ggb3IgY29uc3RydWN0IGNoYW5nZXMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byB0aGUgY29kZS4KKy8vCisvLyAgRXhhbXBsZToKKy8vICBjbGFzcyBIYW5kbGVNYXRjaCA6IHB1YmxpYyBNYXRjaEZpbmRlcjo6TWF0Y2hDYWxsYmFjayB7CisvLyAgcHVibGljOgorLy8gICAgdmlydHVhbCB2b2lkIFJ1bihjb25zdCBNYXRjaEZpbmRlcjo6TWF0Y2hSZXN1bHQgJlJlc3VsdCkgeworLy8gICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpDbGFzcyA9CisvLyAgICAgICAgICBSZXN1bHQuTm9kZXMuR2V0RGVjbEFzPENYWFJlY29yZERlY2w+KCJpZCIpOworLy8gICAgICAuLi4KKy8vICAgIH0KKy8vICB9OworLy8KKy8vICBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKy8vICAgIENsYW5nVG9vbCBUb29sKGFyZ2MsIGFyZ3YpOworLy8gICAgTWF0Y2hGaW5kZXIgZmluZGVyOworLy8gICAgZmluZGVyLkFkZE1hdGNoZXIoSWQoImlkIiwgcmVjb3JkKGhhc05hbWUoIjo6YV9uYW1lc3BhY2U6OkFDbGFzcyIpKSksCisvLyAgICAgICAgICAgICAgICAgICAgICBuZXcgSGFuZGxlTWF0Y2gpOworLy8gICAgcmV0dXJuIFRvb2wuUnVuKG5ld0Zyb250ZW5kQWN0aW9uRmFjdG9yeSgmZmluZGVyKSk7CisvLyAgfQorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BU1RNQVRDSEVSU19BU1RNQVRDSEZJTkRFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUTUFUQ0hFUlNfQVNUTUFUQ0hGSU5ERVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hlcnMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9UaW1lci5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCituYW1lc3BhY2UgYXN0X21hdGNoZXJzIHsKKworLy8vIFxicmllZiBBIGNsYXNzIHRvIGFsbG93IGZpbmRpbmcgbWF0Y2hlcyBvdmVyIHRoZSBDbGFuZyBBU1QuCisvLy8KKy8vLyBBZnRlciBjcmVhdGlvbiwgeW91IGNhbiBhZGQgbXVsdGlwbGUgbWF0Y2hlcnMgdG8gdGhlIE1hdGNoRmluZGVyIHZpYQorLy8vIGNhbGxzIHRvIGFkZE1hdGNoZXIoLi4uKS4KKy8vLworLy8vIE9uY2UgYWxsIG1hdGNoZXJzIGFyZSBhZGRlZCwgbmV3QVNUQ29uc3VtZXIoKSByZXR1cm5zIGFuIEFTVENvbnN1bWVyCisvLy8gdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGNhbGxiYWNrcyBzcGVjaWZpZWQgdmlhIGFkZE1hdGNoZXIoLi4uKSB3aGVuIGEgbWF0Y2gKKy8vLyBpcyBmb3VuZC4KKy8vLworLy8vIFRoZSBvcmRlciBvZiBtYXRjaGVzIGlzIGd1YXJhbnRlZWQgdG8gYmUgZXF1aXZhbGVudCB0byBkb2luZyBhIHByZS1vcmRlcgorLy8vIHRyYXZlcnNhbCBvbiB0aGUgQVNULCBhbmQgYXBwbHlpbmcgdGhlIG1hdGNoZXJzIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5CisvLy8gd2VyZSBhZGRlZCB0byB0aGUgTWF0Y2hGaW5kZXIuCisvLy8KKy8vLyBTZWUgQVNUTWF0Y2hlcnMuaCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gY3JlYXRlIG1hdGNoZXJzLgorLy8vCisvLy8gTm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCitjbGFzcyBNYXRjaEZpbmRlciB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ29udGFpbnMgYWxsIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIG1hdGNoLgorICAvLy8KKyAgLy8vIEV2ZXJ5IHRpbWUgYSBtYXRjaCBpcyBmb3VuZCwgdGhlIE1hdGNoRmluZGVyIHdpbGwgaW52b2tlIHRoZSByZWdpc3RlcmVkCisgIC8vLyBNYXRjaENhbGxiYWNrIHdpdGggYSBNYXRjaFJlc3VsdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtYXRjaC4KKyAgc3RydWN0IE1hdGNoUmVzdWx0IHsKKyAgICBNYXRjaFJlc3VsdChjb25zdCBCb3VuZE5vZGVzICZOb2RlcywgY2xhbmc6OkFTVENvbnRleHQgKkNvbnRleHQpOworCisgICAgLy8vIFxicmllZiBDb250YWlucyB0aGUgbm9kZXMgYm91bmQgb24gdGhlIGN1cnJlbnQgbWF0Y2guCisgICAgLy8vCisgICAgLy8vIFRoaXMgYWxsb3dzIHVzZXIgY29kZSB0byBlYXNpbHkgZXh0cmFjdCBtYXRjaGVkIEFTVCBub2Rlcy4KKyAgICBjb25zdCBCb3VuZE5vZGVzIE5vZGVzOworCisgICAgLy8vIFxicmllZiBVdGlsaXRpZXMgZm9yIGludGVycHJldGluZyB0aGUgbWF0Y2hlZCBBU1Qgc3RydWN0dXJlcy4KKyAgICAvLy8gQHsKKyAgICBjbGFuZzo6QVNUQ29udGV4dCAqIGNvbnN0IENvbnRleHQ7CisgICAgY2xhbmc6OlNvdXJjZU1hbmFnZXIgKiBjb25zdCBTb3VyY2VNYW5hZ2VyOworICAgIC8vLyBAfQorICB9OworCisgIC8vLyBcYnJpZWYgQ2FsbGVkIHdoZW4gdGhlIE1hdGNoIHJlZ2lzdGVyZWQgZm9yIGl0IHdhcyBzdWNjZXNzZnVsbHkgZm91bmQKKyAgLy8vIGluIHRoZSBBU1QuCisgIGNsYXNzIE1hdGNoQ2FsbGJhY2sgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+TWF0Y2hDYWxsYmFjaygpOworCisgICAgLy8vIFxicmllZiBDYWxsZWQgb24gZXZlcnkgbWF0Y2ggYnkgdGhlIFxjIE1hdGNoRmluZGVyLgorICAgIHZpcnR1YWwgdm9pZCBydW4oY29uc3QgTWF0Y2hSZXN1bHQgJlJlc3VsdCkgPSAwOworCisgICAgLy8vIFxicmllZiBDYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggdHJhbnNsYXRpb24gdW5pdC4KKyAgICAvLy8KKyAgICAvLy8gT3B0aW9uYWxseSBvdmVycmlkZSB0byBkbyBwZXIgdHJhbnNsYXRpb24gdW5pdCB0YXNrcy4KKyAgICB2aXJ0dWFsIHZvaWQgb25TdGFydE9mVHJhbnNsYXRpb25Vbml0KCkge30KKworICAgIC8vLyBcYnJpZWYgQ2FsbGVkIGF0IHRoZSBlbmQgb2YgZWFjaCB0cmFuc2xhdGlvbiB1bml0LgorICAgIC8vLworICAgIC8vLyBPcHRpb25hbGx5IG92ZXJyaWRlIHRvIGRvIHBlciB0cmFuc2xhdGlvbiB1bml0IHRhc2tzLgorICAgIHZpcnR1YWwgdm9pZCBvbkVuZE9mVHJhbnNsYXRpb25Vbml0KCkge30KKworICAgIC8vLyBcYnJpZWYgQW4gaWQgdXNlZCB0byBncm91cCB0aGUgbWF0Y2hlcnMuCisgICAgLy8vCisgICAgLy8vIFRoaXMgaWQgaXMgdXNlZCwgZm9yIGV4YW1wbGUsIGZvciB0aGUgcHJvZmlsaW5nIG91dHB1dC4KKyAgICAvLy8gSXQgZGVmYXVsdHMgdG8gIjx1bmtub3duPiIuCisgICAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0SUQoKSBjb25zdDsKKyAgfTsKKworICAvLy8gXGJyaWVmIENhbGxlZCB3aGVuIHBhcnNpbmcgaXMgZmluaXNoZWQuIEludGVuZGVkIGZvciB0ZXN0aW5nIG9ubHkuCisgIGNsYXNzIFBhcnNpbmdEb25lVGVzdENhbGxiYWNrIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgflBhcnNpbmdEb25lVGVzdENhbGxiYWNrKCk7CisgICAgdmlydHVhbCB2b2lkIHJ1bigpID0gMDsKKyAgfTsKKworICBzdHJ1Y3QgTWF0Y2hGaW5kZXJPcHRpb25zIHsKKyAgICBzdHJ1Y3QgUHJvZmlsaW5nIHsKKyAgICAgIFByb2ZpbGluZyhsbHZtOjpTdHJpbmdNYXA8bGx2bTo6VGltZVJlY29yZD4gJlJlY29yZHMpCisgICAgICAgICAgOiBSZWNvcmRzKFJlY29yZHMpIHt9CisKKyAgICAgIC8vLyBcYnJpZWYgUGVyIGJ1Y2tldCB0aW1pbmcgaW5mb3JtYXRpb24uCisgICAgICBsbHZtOjpTdHJpbmdNYXA8bGx2bTo6VGltZVJlY29yZD4gJlJlY29yZHM7CisgICAgfTsKKworICAgIC8vLyBcYnJpZWYgRW5hYmxlcyBwZXItY2hlY2sgdGltZXJzLgorICAgIC8vLworICAgIC8vLyBJdCBwcmludHMgYSByZXBvcnQgYWZ0ZXIgbWF0Y2guCisgICAgbGx2bTo6T3B0aW9uYWw8UHJvZmlsaW5nPiBDaGVja1Byb2ZpbGluZzsKKyAgfTsKKworICBNYXRjaEZpbmRlcihNYXRjaEZpbmRlck9wdGlvbnMgT3B0aW9ucyA9IE1hdGNoRmluZGVyT3B0aW9ucygpKTsKKyAgfk1hdGNoRmluZGVyKCk7CisKKyAgLy8vIFxicmllZiBBZGRzIGEgbWF0Y2hlciB0byBleGVjdXRlIHdoZW4gcnVubmluZyBvdmVyIHRoZSBBU1QuCisgIC8vLworICAvLy8gQ2FsbHMgJ0FjdGlvbicgd2l0aCB0aGUgQm91bmROb2RlcyBvbiBldmVyeSBtYXRjaC4KKyAgLy8vIEFkZGluZyBtb3JlIHRoYW4gb25lICdOb2RlTWF0Y2gnIGFsbG93cyBmaW5kaW5nIGRpZmZlcmVudCBtYXRjaGVzIGluIGEKKyAgLy8vIHNpbmdsZSBwYXNzIG92ZXIgdGhlIEFTVC4KKyAgLy8vCisgIC8vLyBEb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiAnQWN0aW9uJy4KKyAgLy8vIEB7CisgIHZvaWQgYWRkTWF0Y2hlcihjb25zdCBEZWNsYXJhdGlvbk1hdGNoZXIgJk5vZGVNYXRjaCwKKyAgICAgICAgICAgICAgICAgIE1hdGNoQ2FsbGJhY2sgKkFjdGlvbik7CisgIHZvaWQgYWRkTWF0Y2hlcihjb25zdCBUeXBlTWF0Y2hlciAmTm9kZU1hdGNoLAorICAgICAgICAgICAgICAgICAgTWF0Y2hDYWxsYmFjayAqQWN0aW9uKTsKKyAgdm9pZCBhZGRNYXRjaGVyKGNvbnN0IFN0YXRlbWVudE1hdGNoZXIgJk5vZGVNYXRjaCwKKyAgICAgICAgICAgICAgICAgIE1hdGNoQ2FsbGJhY2sgKkFjdGlvbik7CisgIHZvaWQgYWRkTWF0Y2hlcihjb25zdCBOZXN0ZWROYW1lU3BlY2lmaWVyTWF0Y2hlciAmTm9kZU1hdGNoLAorICAgICAgICAgICAgICAgICAgTWF0Y2hDYWxsYmFjayAqQWN0aW9uKTsKKyAgdm9pZCBhZGRNYXRjaGVyKGNvbnN0IE5lc3RlZE5hbWVTcGVjaWZpZXJMb2NNYXRjaGVyICZOb2RlTWF0Y2gsCisgICAgICAgICAgICAgICAgICBNYXRjaENhbGxiYWNrICpBY3Rpb24pOworICB2b2lkIGFkZE1hdGNoZXIoY29uc3QgVHlwZUxvY01hdGNoZXIgJk5vZGVNYXRjaCwKKyAgICAgICAgICAgICAgICAgIE1hdGNoQ2FsbGJhY2sgKkFjdGlvbik7CisgIHZvaWQgYWRkTWF0Y2hlcihjb25zdCBDWFhDdG9ySW5pdGlhbGl6ZXJNYXRjaGVyICZOb2RlTWF0Y2gsCisgICAgICAgICAgICAgICAgICBNYXRjaENhbGxiYWNrICpBY3Rpb24pOworICAvLy8gQH0KKworICAvLy8gXGJyaWVmIEFkZHMgYSBtYXRjaGVyIHRvIGV4ZWN1dGUgd2hlbiBydW5uaW5nIG92ZXIgdGhlIEFTVC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHNpbWlsYXIgdG8gXGMgYWRkTWF0Y2hlcigpLCBidXQgaXQgdXNlcyB0aGUgZHluYW1pYyBpbnRlcmZhY2UuIEl0CisgIC8vLyBpcyBtb3JlIGZsZXhpYmxlLCBidXQgdGhlIGxvc3QgdHlwZSBpbmZvcm1hdGlvbiBlbmFibGVzIGEgY2FsbGVyIHRvIHBhc3MKKyAgLy8vIGEgbWF0Y2hlciB0aGF0IGNhbm5vdCBtYXRjaCBhbnl0aGluZy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBcYyB0cnVlIGlmIHRoZSBtYXRjaGVyIGlzIGEgdmFsaWQgdG9wLWxldmVsIG1hdGNoZXIsIFxjIGZhbHNlCisgIC8vLyAgIG90aGVyd2lzZS4KKyAgYm9vbCBhZGREeW5hbWljTWF0Y2hlcihjb25zdCBpbnRlcm5hbDo6RHluVHlwZWRNYXRjaGVyICZOb2RlTWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hDYWxsYmFjayAqQWN0aW9uKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYSBjbGFuZyBBU1RDb25zdW1lciB0aGF0IGZpbmRzIGFsbCBtYXRjaGVzLgorICBzdGQ6OnVuaXF1ZV9wdHI8Y2xhbmc6OkFTVENvbnN1bWVyPiBuZXdBU1RDb25zdW1lcigpOworCisgIC8vLyBcYnJpZWYgQ2FsbHMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2tzIG9uIGFsbCBtYXRjaGVzIG9uIHRoZSBnaXZlbiBccCBOb2RlLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgbWF0Y2hlcyBvbiBhIHNpbmdsZSBub2RlLCBmb3IKKyAgLy8vIGV4YW1wbGUgd2hlbiB1c2luZyBkZWNsKGZvckVhY2hEZXNjZW5kYW50KHN0bXQoKSkpLgorICAvLy8KKyAgLy8vIEB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIG1hdGNoKGNvbnN0IFQgJk5vZGUsIEFTVENvbnRleHQgJkNvbnRleHQpIHsKKyAgICBtYXRjaChjbGFuZzo6YXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGU6OmNyZWF0ZShOb2RlKSwgQ29udGV4dCk7CisgIH0KKyAgdm9pZCBtYXRjaChjb25zdCBjbGFuZzo6YXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGUgJk5vZGUsCisgICAgICAgICAgICAgQVNUQ29udGV4dCAmQ29udGV4dCk7CisgIC8vLyBAfQorCisgIC8vLyBcYnJpZWYgRmluZHMgYWxsIG1hdGNoZXMgaW4gdGhlIGdpdmVuIEFTVC4KKyAgdm9pZCBtYXRjaEFTVChBU1RDb250ZXh0ICZDb250ZXh0KTsKKworICAvLy8gXGJyaWVmIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIG5vdGlmeSB0aGUgZW5kIG9mIHBhcnNpbmcuCisgIC8vLworICAvLy8gVGhlIHByb3ZpZGVkIGNsb3N1cmUgaXMgY2FsbGVkIGFmdGVyIHBhcnNpbmcgaXMgZG9uZSwgYmVmb3JlIHRoZSBBU1QgaXMKKyAgLy8vIHRyYXZlcnNlZC4gVXNlZnVsIGZvciBiZW5jaG1hcmtpbmcuCisgIC8vLyBFYWNoIGNhbGwgdG8gRmluZEFsbCguLi4pIHdpbGwgY2FsbCB0aGUgY2xvc3VyZSBvbmNlLgorICB2b2lkIHJlZ2lzdGVyVGVzdENhbGxiYWNrQWZ0ZXJQYXJzaW5nKFBhcnNpbmdEb25lVGVzdENhbGxiYWNrICpQYXJzaW5nRG9uZSk7CisKKyAgLy8vIFxicmllZiBGb3IgZWFjaCBcYyBNYXRjaGVyPD4gYSBcYyBNYXRjaENhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWQKKyAgLy8vIHdoZW4gaXQgbWF0Y2hlcy4KKyAgc3RydWN0IE1hdGNoZXJzQnlUeXBlIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50ZXJuYWw6OkR5blR5cGVkTWF0Y2hlciwgTWF0Y2hDYWxsYmFjayAqPj4KKyAgICAgICAgRGVjbE9yU3RtdDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8VHlwZU1hdGNoZXIsIE1hdGNoQ2FsbGJhY2sgKj4+IFR5cGU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPE5lc3RlZE5hbWVTcGVjaWZpZXJNYXRjaGVyLCBNYXRjaENhbGxiYWNrICo+PgorICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxOZXN0ZWROYW1lU3BlY2lmaWVyTG9jTWF0Y2hlciwgTWF0Y2hDYWxsYmFjayAqPj4KKyAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8VHlwZUxvY01hdGNoZXIsIE1hdGNoQ2FsbGJhY2sgKj4+IFR5cGVMb2M7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENYWEN0b3JJbml0aWFsaXplck1hdGNoZXIsIE1hdGNoQ2FsbGJhY2sgKj4+IEN0b3JJbml0OworICAgIC8vLyBcYnJpZWYgQWxsIHRoZSBjYWxsYmFja3MgaW4gb25lIGNvbnRhaW5lciB0byBzaW1wbGlmeSBpdGVyYXRpb24uCisgICAgbGx2bTo6U21hbGxQdHJTZXQ8TWF0Y2hDYWxsYmFjayAqLCAxNj4gQWxsQ2FsbGJhY2tzOworICB9OworCitwcml2YXRlOgorICBNYXRjaGVyc0J5VHlwZSBNYXRjaGVyczsKKworICBNYXRjaEZpbmRlck9wdGlvbnMgT3B0aW9uczsKKworICAvLy8gXGJyaWVmIENhbGxlZCB3aGVuIHBhcnNpbmcgaXMgZG9uZS4KKyAgUGFyc2luZ0RvbmVUZXN0Q2FsbGJhY2sgKlBhcnNpbmdEb25lOworfTsKKworLy8vIFxicmllZiBSZXR1cm5zIHRoZSByZXN1bHRzIG9mIG1hdGNoaW5nIFxwIE1hdGNoZXIgb24gXHAgTm9kZS4KKy8vLworLy8vIENvbGxlY3RzIHRoZSBcYyBCb3VuZE5vZGVzIG9mIGFsbCBjYWxsYmFjayBpbnZvY2F0aW9ucyB3aGVuIG1hdGNoaW5nCisvLy8gXHAgTWF0Y2hlciBvbiBccCBOb2RlIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0ZWQgcmVzdWx0cy4KKy8vLworLy8vIE11bHRpcGxlIHJlc3VsdHMgb2NjdXIgd2hlbiB1c2luZyBtYXRjaGVycyBsaWtlIFxjIGZvckVhY2hEZXNjZW5kYW50LAorLy8vIHdoaWNoIGdlbmVyYXRlIGEgcmVzdWx0IGZvciBlYWNoIHN1Yi1tYXRjaC4KKy8vLworLy8vIElmIHlvdSB3YW50IHRvIGZpbmQgYWxsIG1hdGNoZXMgb24gdGhlIHN1Yi10cmVlIHJvb3RlZCBhdCBcYyBOb2RlIChyYXRoZXIKKy8vLyB0aGFuIG9ubHkgdGhlIG1hdGNoZXMgb24gXGMgTm9kZSBpdHNlbGYpLCBzdXJyb3VuZCB0aGUgXGMgTWF0Y2hlciB3aXRoIGEKKy8vLyBcYyBmaW5kQWxsKCkuCisvLy8KKy8vLyBcc2VlIHNlbGVjdEZpcnN0CisvLy8gQHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVCwgdHlwZW5hbWUgTm9kZVQ+CitTbWFsbFZlY3RvcjxCb3VuZE5vZGVzLCAxPgorbWF0Y2goTWF0Y2hlclQgTWF0Y2hlciwgY29uc3QgTm9kZVQgJk5vZGUsIEFTVENvbnRleHQgJkNvbnRleHQpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclQ+CitTbWFsbFZlY3RvcjxCb3VuZE5vZGVzLCAxPgorbWF0Y2goTWF0Y2hlclQgTWF0Y2hlciwgY29uc3QgYXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGUgJk5vZGUsCisgICAgICBBU1RDb250ZXh0ICZDb250ZXh0KTsKKy8vLyBAfQorCisvLy8gXGJyaWVmIFJldHVybnMgdGhlIHJlc3VsdHMgb2YgbWF0Y2hpbmcgXHAgTWF0Y2hlciBvbiB0aGUgdHJhbnNsYXRpb24gdW5pdCBvZgorLy8vIFxwIENvbnRleHQgYW5kIGNvbGxlY3RzIHRoZSBcYyBCb3VuZE5vZGVzIG9mIGFsbCBjYWxsYmFjayBpbnZvY2F0aW9ucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVD4KK1NtYWxsVmVjdG9yPEJvdW5kTm9kZXMsIDE+IG1hdGNoKE1hdGNoZXJUIE1hdGNoZXIsIEFTVENvbnRleHQgJkNvbnRleHQpOworCisvLy8gXGJyaWVmIFJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBvZiB0eXBlIFxjIE5vZGVUIGJvdW5kIHRvIFxwIEJvdW5kVG8uCisvLy8KKy8vLyBSZXR1cm5zIFxjIE5VTEwgaWYgdGhlcmUgaXMgbm8gbWF0Y2gsIG9yIGlmIHRoZSBtYXRjaGluZyBub2RlIGNhbm5vdCBiZQorLy8vIGNhc3RlZCB0byBcYyBOb2RlVC4KKy8vLworLy8vIFRoaXMgaXMgdXNlZnVsIGluIGNvbWJhbmF0aW9uIHdpdGggXGMgbWF0Y2goKToKKy8vLyBcY29kZQorLy8vICAgY29uc3QgRGVjbCAqRCA9IHNlbGVjdEZpcnN0PERlY2w+KCJpZCIsIG1hdGNoKE1hdGNoZXIuYmluZCgiaWQiKSwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLCBDb250ZXh0KSk7CisvLy8gXGVuZGNvZGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVD4KK2NvbnN0IE5vZGVUICoKK3NlbGVjdEZpcnN0KFN0cmluZ1JlZiBCb3VuZFRvLCBjb25zdCBTbWFsbFZlY3RvckltcGw8Qm91bmROb2Rlcz4gJlJlc3VsdHMpIHsKKyAgZm9yIChjb25zdCBCb3VuZE5vZGVzICZOIDogUmVzdWx0cykgeworICAgIGlmIChjb25zdCBOb2RlVCAqTm9kZSA9IE4uZ2V0Tm9kZUFzPE5vZGVUPihCb3VuZFRvKSkKKyAgICAgIHJldHVybiBOb2RlOworICB9CisgIHJldHVybiBudWxscHRyOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworY2xhc3MgQ29sbGVjdE1hdGNoZXNDYWxsYmFjayA6IHB1YmxpYyBNYXRjaEZpbmRlcjo6TWF0Y2hDYWxsYmFjayB7CitwdWJsaWM6CisgIHZvaWQgcnVuKGNvbnN0IE1hdGNoRmluZGVyOjpNYXRjaFJlc3VsdCAmUmVzdWx0KSBvdmVycmlkZSB7CisgICAgTm9kZXMucHVzaF9iYWNrKFJlc3VsdC5Ob2Rlcyk7CisgIH0KKyAgU21hbGxWZWN0b3I8Qm91bmROb2RlcywgMT4gTm9kZXM7Cit9OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclQ+CitTbWFsbFZlY3RvcjxCb3VuZE5vZGVzLCAxPgorbWF0Y2goTWF0Y2hlclQgTWF0Y2hlciwgY29uc3QgYXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGUgJk5vZGUsCisgICAgICBBU1RDb250ZXh0ICZDb250ZXh0KSB7CisgIGludGVybmFsOjpDb2xsZWN0TWF0Y2hlc0NhbGxiYWNrIENhbGxiYWNrOworICBNYXRjaEZpbmRlciBGaW5kZXI7CisgIEZpbmRlci5hZGRNYXRjaGVyKE1hdGNoZXIsICZDYWxsYmFjayk7CisgIEZpbmRlci5tYXRjaChOb2RlLCBDb250ZXh0KTsKKyAgcmV0dXJuIHN0ZDo6bW92ZShDYWxsYmFjay5Ob2Rlcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVCwgdHlwZW5hbWUgTm9kZVQ+CitTbWFsbFZlY3RvcjxCb3VuZE5vZGVzLCAxPgorbWF0Y2goTWF0Y2hlclQgTWF0Y2hlciwgY29uc3QgTm9kZVQgJk5vZGUsIEFTVENvbnRleHQgJkNvbnRleHQpIHsKKyAgcmV0dXJuIG1hdGNoKE1hdGNoZXIsIGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlOjpjcmVhdGUoTm9kZSksIENvbnRleHQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclQ+CitTbWFsbFZlY3RvcjxCb3VuZE5vZGVzLCAxPgorbWF0Y2goTWF0Y2hlclQgTWF0Y2hlciwgQVNUQ29udGV4dCAmQ29udGV4dCkgeworICBpbnRlcm5hbDo6Q29sbGVjdE1hdGNoZXNDYWxsYmFjayBDYWxsYmFjazsKKyAgTWF0Y2hGaW5kZXIgRmluZGVyOworICBGaW5kZXIuYWRkTWF0Y2hlcihNYXRjaGVyLCAmQ2FsbGJhY2spOworICBGaW5kZXIubWF0Y2hBU1QoQ29udGV4dCk7CisgIHJldHVybiBzdGQ6Om1vdmUoQ2FsbGJhY2suTm9kZXMpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgYXN0X21hdGNoZXJzCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaGVycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDA4ZDUzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hlcnMuaApAQCAtMCwwICsxLDU5ODQgQEAKKy8vPT09LSBBU1RNYXRjaGVycy5oIC0gU3RydWN0dXJhbCBxdWVyeSBmcmFtZXdvcmsgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBpbXBsZW1lbnRzIG1hdGNoZXJzIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCB0aGUgTWF0Y2hGaW5kZXIgdG8KKy8vICBtYXRjaCBBU1Qgbm9kZXMuCisvLworLy8gIE1hdGNoZXJzIGFyZSBjcmVhdGVkIGJ5IGdlbmVyYXRvciBmdW5jdGlvbnMsIHdoaWNoIGNhbiBiZSBjb21iaW5lZCBpbgorLy8gIGEgZnVuY3Rpb25hbCBpbi1sYW5ndWFnZSBEU0wgdG8gZXhwcmVzcyBxdWVyaWVzIG92ZXIgdGhlIEMrKyBBU1QuCisvLworLy8gIEZvciBleGFtcGxlLCB0byBtYXRjaCBhIGNsYXNzIHdpdGggYSBjZXJ0YWluIG5hbWUsIG9uZSB3b3VsZCBjYWxsOgorLy8gICAgY3h4UmVjb3JkRGVjbChoYXNOYW1lKCJNeUNsYXNzIikpCisvLyAgd2hpY2ggcmV0dXJucyBhIG1hdGNoZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBmaW5kIGFsbCBBU1Qgbm9kZXMgdGhhdCBkZWNsYXJlCisvLyAgYSBjbGFzcyBuYW1lZCAnTXlDbGFzcycuCisvLworLy8gIEZvciBtb3JlIGNvbXBsaWNhdGVkIG1hdGNoIGV4cHJlc3Npb25zIHdlJ3JlIG9mdGVuIGludGVyZXN0ZWQgaW4gYWNjZXNzaW5nCisvLyAgbXVsdGlwbGUgcGFydHMgb2YgdGhlIG1hdGNoZWQgQVNUIG5vZGVzIG9uY2UgYSBtYXRjaCBpcyBmb3VuZC4gSW4gdGhhdCBjYXNlLAorLy8gIHVzZSB0aGUgaWQoLi4uKSBtYXRjaGVyIGFyb3VuZCB0aGUgbWF0Y2ggZXhwcmVzc2lvbnMgdGhhdCBtYXRjaCB0aGUgbm9kZXMKKy8vICB5b3Ugd2FudCB0byBhY2Nlc3MuCisvLworLy8gIEZvciBleGFtcGxlLCB3aGVuIHdlJ3JlIGludGVyZXN0ZWQgaW4gY2hpbGQgY2xhc3NlcyBvZiBhIGNlcnRhaW4gY2xhc3MsIHdlCisvLyAgd291bGQgd3JpdGU6CisvLyAgICBjeHhSZWNvcmREZWNsKGhhc05hbWUoIk15Q2xhc3MiKSwgaGFzKGlkKCJjaGlsZCIsIHJlY29yZERlY2woKSkpKQorLy8gIFdoZW4gdGhlIG1hdGNoIGlzIGZvdW5kIHZpYSB0aGUgTWF0Y2hGaW5kZXIsIGEgdXNlciBwcm92aWRlZCBjYWxsYmFjayB3aWxsCisvLyAgYmUgY2FsbGVkIHdpdGggYSBCb3VuZE5vZGVzIGluc3RhbmNlIHRoYXQgY29udGFpbnMgYSBtYXBwaW5nIGZyb20gdGhlCisvLyAgc3RyaW5ncyB0aGF0IHdlIHByb3ZpZGVkIGZvciB0aGUgaWQoLi4uKSBjYWxscyB0byB0aGUgbm9kZXMgdGhhdCB3ZXJlCisvLyAgbWF0Y2hlZC4KKy8vICBJbiB0aGUgZ2l2ZW4gZXhhbXBsZSwgZWFjaCB0aW1lIG91ciBtYXRjaGVyIGZpbmRzIGEgbWF0Y2ggd2UgZ2V0IGEgY2FsbGJhY2sKKy8vICB3aGVyZSAiY2hpbGQiIGlzIGJvdW5kIHRvIHRoZSBSZWNvcmREZWNsIG5vZGUgb2YgdGhlIG1hdGNoaW5nIGNoaWxkCisvLyAgY2xhc3MgZGVjbGFyYXRpb24uCisvLworLy8gIFNlZSBBU1RNYXRjaGVyc0ludGVybmFsLmggZm9yIGEgbW9yZSBpbi1kZXB0aCBleHBsYW5hdGlvbiBvZiB0aGUKKy8vICBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIHRoZSBtYXRjaGVyIGZyYW1ld29yay4KKy8vCisvLyAgU2VlIEFTVE1hdGNoRmluZGVyLmggZm9yIGhvdyB0byB1c2UgdGhlIGdlbmVyYXRlZCBtYXRjaGVycyB0byBydW4gb3ZlcgorLy8gIGFuIEFTVC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUTUFUQ0hFUlNfQVNUTUFUQ0hFUlNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVE1BVENIRVJTX0FTVE1BVENIRVJTX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVFR5cGVUcmFpdHMuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvQXR0ci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDWFguaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbEZyaWVuZC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsT2JqQy5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsVGVtcGxhdGUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXhwci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByQ1hYLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHJPYmpDLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL05lc3RlZE5hbWVTcGVjaWZpZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvT3BlcmF0aW9uS2luZHMuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10Q1hYLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXRPYmpDLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1RlbXBsYXRlQmFzZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UZW1wbGF0ZU5hbWUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTG9jLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hlcnNJbnRlcm5hbC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVE1hdGNoZXJzL0FTVE1hdGNoZXJzTWFjcm9zLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQXR0cktpbmRzLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRXhjZXB0aW9uU3BlY2lmaWNhdGlvblR5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NwZWNpZmllcnMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9UeXBlVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUmVnZXguaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBhc3RfbWF0Y2hlcnMgeworCisvLy8gXGJyaWVmIE1hcHMgc3RyaW5nIElEcyB0byBBU1Qgbm9kZXMgbWF0Y2hlZCBieSBwYXJ0cyBvZiBhIG1hdGNoZXIuCisvLy8KKy8vLyBUaGUgYm91bmQgbm9kZXMgYXJlIGdlbmVyYXRlZCBieSBjYWxsaW5nIFxjIGJpbmQoImlkIikgb24gdGhlIG5vZGUgbWF0Y2hlcnMKKy8vLyBvZiB0aGUgbm9kZXMgd2Ugd2FudCB0byBhY2Nlc3MgbGF0ZXIuCisvLy8KKy8vLyBUaGUgaW5zdGFuY2VzIG9mIEJvdW5kTm9kZXMgYXJlIGNyZWF0ZWQgYnkgXGMgTWF0Y2hGaW5kZXIgd2hlbiB0aGUgdXNlcidzCisvLy8gY2FsbGJhY2tzIGFyZSBleGVjdXRlZCBldmVyeSB0aW1lIGEgbWF0Y2ggaXMgZm91bmQuCitjbGFzcyBCb3VuZE5vZGVzIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBBU1Qgbm9kZSBib3VuZCB0byBcYyBJRC4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIE5VTEwgaWYgdGhlcmUgd2FzIG5vIG5vZGUgYm91bmQgdG8gXGMgSUQgb3IgaWYgdGhlcmUgaXMgYSBub2RlIGJ1dAorICAvLy8gaXQgY2Fubm90IGJlIGNvbnZlcnRlZCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBjb25zdCBUICpnZXROb2RlQXMoU3RyaW5nUmVmIElEKSBjb25zdCB7CisgICAgcmV0dXJuIE15Qm91bmROb2Rlcy5nZXROb2RlQXM8VD4oSUQpOworICB9CisKKyAgLy8vIFxicmllZiBUeXBlIG9mIG1hcHBpbmcgZnJvbSBiaW5kaW5nIGlkZW50aWZpZXJzIHRvIGJvdW5kIG5vZGVzLiBUaGlzIHR5cGUKKyAgLy8vIGlzIGFuIGFzc29jaWF0aXZlIGNvbnRhaW5lciB3aXRoIGEga2V5IHR5cGUgb2YgXGMgc3RkOjpzdHJpbmcgYW5kIGEgdmFsdWUKKyAgLy8vIHR5cGUgb2YgXGMgY2xhbmc6OmFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlCisgIHVzaW5nIElEVG9Ob2RlTWFwID0gaW50ZXJuYWw6OkJvdW5kTm9kZXNNYXA6OklEVG9Ob2RlTWFwOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgbWFwcGluZyBmcm9tIGJpbmRpbmcgaWRlbnRpZmllcnMgdG8gYm91bmQgbm9kZXMuCisgIGNvbnN0IElEVG9Ob2RlTWFwICZnZXRNYXAoKSBjb25zdCB7CisgICAgcmV0dXJuIE15Qm91bmROb2Rlcy5nZXRNYXAoKTsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkJvdW5kTm9kZXNUcmVlQnVpbGRlcjsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBCb3VuZE5vZGVzIGZyb20gYSBwcmUtZmlsbGVkIG1hcCBvZiBiaW5kaW5ncy4KKyAgQm91bmROb2RlcyhpbnRlcm5hbDo6Qm91bmROb2Rlc01hcCAmTXlCb3VuZE5vZGVzKQorICAgICAgOiBNeUJvdW5kTm9kZXMoTXlCb3VuZE5vZGVzKSB7fQorCisgIGludGVybmFsOjpCb3VuZE5vZGVzTWFwIE15Qm91bmROb2RlczsKK307CisKKy8vLyBcYnJpZWYgSWYgdGhlIHByb3ZpZGVkIG1hdGNoZXIgbWF0Y2hlcyBhIG5vZGUsIGJpbmRzIHRoZSBub2RlIHRvIFxjIElELgorLy8vCisvLy8gRklYTUU6IERvIHdlIHdhbnQgdG8gc3VwcG9ydCB0aGlzIG5vdyB0aGF0IHdlIGhhdmUgYmluZCgpPwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbnRlcm5hbDo6TWF0Y2hlcjxUPiBpZChTdHJpbmdSZWYgSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbDo6QmluZGFibGVNYXRjaGVyPFQ+ICZJbm5lck1hdGNoZXIpIHsKKyAgcmV0dXJuIElubmVyTWF0Y2hlci5iaW5kKElEKTsKK30KKworLy8vIFxicmllZiBUeXBlcyBvZiBtYXRjaGVycyBmb3IgdGhlIHRvcC1sZXZlbCBjbGFzc2VzIGluIHRoZSBBU1QgY2xhc3MKKy8vLyBoaWVyYXJjaHkuCisvLy8gQHsKK3VzaW5nIERlY2xhcmF0aW9uTWF0Y2hlciA9IGludGVybmFsOjpNYXRjaGVyPERlY2w+OwordXNpbmcgU3RhdGVtZW50TWF0Y2hlciA9IGludGVybmFsOjpNYXRjaGVyPFN0bXQ+OwordXNpbmcgVHlwZU1hdGNoZXIgPSBpbnRlcm5hbDo6TWF0Y2hlcjxRdWFsVHlwZT47Cit1c2luZyBUeXBlTG9jTWF0Y2hlciA9IGludGVybmFsOjpNYXRjaGVyPFR5cGVMb2M+OwordXNpbmcgTmVzdGVkTmFtZVNwZWNpZmllck1hdGNoZXIgPSBpbnRlcm5hbDo6TWF0Y2hlcjxOZXN0ZWROYW1lU3BlY2lmaWVyPjsKK3VzaW5nIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2NNYXRjaGVyID0gaW50ZXJuYWw6Ok1hdGNoZXI8TmVzdGVkTmFtZVNwZWNpZmllckxvYz47Cit1c2luZyBDWFhDdG9ySW5pdGlhbGl6ZXJNYXRjaGVyID0gaW50ZXJuYWw6Ok1hdGNoZXI8Q1hYQ3RvckluaXRpYWxpemVyPjsKKy8vLyBAfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgYW55IG5vZGUuCisvLy8KKy8vLyBVc2VmdWwgd2hlbiBhbm90aGVyIG1hdGNoZXIgcmVxdWlyZXMgYSBjaGlsZCBtYXRjaGVyLCBidXQgdGhlcmUncyBubworLy8vIGFkZGl0aW9uYWwgY29uc3RyYWludC4gVGhpcyB3aWxsIG9mdGVuIGJlIHVzZWQgd2l0aCBhbiBleHBsaWNpdCBjb252ZXJzaW9uCisvLy8gdG8gYW4gXGMgaW50ZXJuYWw6Ok1hdGNoZXI8PiB0eXBlIHN1Y2ggYXMgXGMgVHlwZU1hdGNoZXIuCisvLy8KKy8vLyBFeGFtcGxlOiBcYyBEZWNsYXJhdGlvbk1hdGNoZXIoYW55dGhpbmcoKSkgbWF0Y2hlcyBhbGwgZGVjbGFyYXRpb25zLCBlLmcuLAorLy8vIFxjb2RlCisvLy8gImludCogcCIgYW5kICJ2b2lkIGYoKSIgaW4KKy8vLyAgIGludCogcDsKKy8vLyAgIHZvaWQgZigpOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBVc2FibGUgYXM6IEFueSBNYXRjaGVyCitpbmxpbmUgaW50ZXJuYWw6OlRydWVNYXRjaGVyIGFueXRoaW5nKCkgeyByZXR1cm4gaW50ZXJuYWw6OlRydWVNYXRjaGVyKCk7IH0KKworLy8vIFxicmllZiBNYXRjaGVzIHRoZSB0b3AgZGVjbGFyYXRpb24gY29udGV4dC4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGludCBYOworLy8vICAgbmFtZXNwYWNlIE5TIHsKKy8vLyAgIGludCBZOworLy8vICAgfSAgLy8gbmFtZXNwYWNlIE5TCisvLy8gXGVuZGNvZGUKKy8vLyBkZWNsKGhhc0RlY2xDb250ZXh0KHRyYW5zbGF0aW9uVW5pdERlY2woKSkpCisvLy8gICBtYXRjaGVzICJpbnQgWCIsIGJ1dCBub3QgImludCBZIi4KK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsIFRyYW5zbGF0aW9uVW5pdERlY2w+CisgICAgdHJhbnNsYXRpb25Vbml0RGVjbDsKKworLy8vIFxicmllZiBNYXRjaGVzIHR5cGVkZWYgZGVjbGFyYXRpb25zLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdHlwZWRlZiBpbnQgWDsKKy8vLyAgIHVzaW5nIFkgPSBpbnQ7CisvLy8gXGVuZGNvZGUKKy8vLyB0eXBlZGVmRGVjbCgpCisvLy8gICBtYXRjaGVzICJ0eXBlZGVmIGludCBYIiwgYnV0IG5vdCAidXNpbmcgWSA9IGludCIKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsIFR5cGVkZWZEZWNsPgorICAgIHR5cGVkZWZEZWNsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgdHlwZWRlZiBuYW1lIGRlY2xhcmF0aW9ucy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHR5cGVkZWYgaW50IFg7CisvLy8gICB1c2luZyBZID0gaW50OworLy8vIFxlbmRjb2RlCisvLy8gdHlwZWRlZk5hbWVEZWNsKCkKKy8vLyAgIG1hdGNoZXMgInR5cGVkZWYgaW50IFgiIGFuZCAidXNpbmcgWSA9IGludCIKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsIFR5cGVkZWZOYW1lRGVjbD4KKyAgICB0eXBlZGVmTmFtZURlY2w7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyB0eXBlIGFsaWFzIGRlY2xhcmF0aW9ucy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHR5cGVkZWYgaW50IFg7CisvLy8gICB1c2luZyBZID0gaW50OworLy8vIFxlbmRjb2RlCisvLy8gdHlwZUFsaWFzRGVjbCgpCisvLy8gICBtYXRjaGVzICJ1c2luZyBZID0gaW50IiwgYnV0IG5vdCAidHlwZWRlZiBpbnQgWCIKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsIFR5cGVBbGlhc0RlY2w+CisgICAgdHlwZUFsaWFzRGVjbDsKKworLy8vIFxicmllZiBNYXRjaGVzIHR5cGUgYWxpYXMgdGVtcGxhdGUgZGVjbGFyYXRpb25zLgorLy8vCisvLy8gdHlwZUFsaWFzVGVtcGxhdGVEZWNsKCkgbWF0Y2hlcworLy8vIFxjb2RlCisvLy8gICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKy8vLyAgIHVzaW5nIFkgPSBYPFQ+OworLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxEZWNsLCBUeXBlQWxpYXNUZW1wbGF0ZURlY2w+CisgICAgdHlwZUFsaWFzVGVtcGxhdGVEZWNsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgQVNUIG5vZGVzIHRoYXQgd2VyZSBleHBhbmRlZCB3aXRoaW4gdGhlIG1haW4tZmlsZS4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBYIGJ1dCBub3QgWQorLy8vICAgKG1hdGNoZXIgPSBjeHhSZWNvcmREZWNsKGlzRXhwYW5zaW9uSW5NYWluRmlsZSgpKQorLy8vIFxjb2RlCisvLy8gICAjaW5jbHVkZSA8WS5oPgorLy8vICAgY2xhc3MgWCB7fTsKKy8vLyBcZW5kY29kZQorLy8vIFkuaDoKKy8vLyBcY29kZQorLy8vICAgY2xhc3MgWSB7fTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVXNhYmxlIGFzOiBNYXRjaGVyPERlY2w+LCBNYXRjaGVyPFN0bXQ+LCBNYXRjaGVyPFR5cGVMb2M+CitBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUihpc0V4cGFuc2lvbkluTWFpbkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBBU1RfUE9MWU1PUlBISUNfU1VQUE9SVEVEX1RZUEVTKERlY2wsIFN0bXQsIFR5cGVMb2MpKSB7CisgIGF1dG8gJlNvdXJjZU1hbmFnZXIgPSBGaW5kZXItPmdldEFTVENvbnRleHQoKS5nZXRTb3VyY2VNYW5hZ2VyKCk7CisgIHJldHVybiBTb3VyY2VNYW5hZ2VyLmlzSW5NYWluRmlsZSgKKyAgICAgIFNvdXJjZU1hbmFnZXIuZ2V0RXhwYW5zaW9uTG9jKE5vZGUuZ2V0TG9jU3RhcnQoKSkpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgQVNUIG5vZGVzIHRoYXQgd2VyZSBleHBhbmRlZCB3aXRoaW4gc3lzdGVtLWhlYWRlci1maWxlcy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBZIGJ1dCBub3QgWAorLy8vICAgICAobWF0Y2hlciA9IGN4eFJlY29yZERlY2woaXNFeHBhbnNpb25JblN5c3RlbUhlYWRlcigpKQorLy8vIFxjb2RlCisvLy8gICAjaW5jbHVkZSA8U3lzdGVtSGVhZGVyLmg+CisvLy8gICBjbGFzcyBYIHt9OworLy8vIFxlbmRjb2RlCisvLy8gU3lzdGVtSGVhZGVyLmg6CisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIFkge307CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFVzYWJsZSBhczogTWF0Y2hlcjxEZWNsPiwgTWF0Y2hlcjxTdG10PiwgTWF0Y2hlcjxUeXBlTG9jPgorQVNUX1BPTFlNT1JQSElDX01BVENIRVIoaXNFeHBhbnNpb25JblN5c3RlbUhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoRGVjbCwgU3RtdCwgVHlwZUxvYykpIHsKKyAgYXV0byAmU291cmNlTWFuYWdlciA9IEZpbmRlci0+Z2V0QVNUQ29udGV4dCgpLmdldFNvdXJjZU1hbmFnZXIoKTsKKyAgYXV0byBFeHBhbnNpb25Mb2MgPSBTb3VyY2VNYW5hZ2VyLmdldEV4cGFuc2lvbkxvYyhOb2RlLmdldExvY1N0YXJ0KCkpOworICBpZiAoRXhwYW5zaW9uTG9jLmlzSW52YWxpZCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiBTb3VyY2VNYW5hZ2VyLmlzSW5TeXN0ZW1IZWFkZXIoRXhwYW5zaW9uTG9jKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIEFTVCBub2RlcyB0aGF0IHdlcmUgZXhwYW5kZWQgd2l0aGluIGZpbGVzIHdob3NlIG5hbWUgaXMKKy8vLyBwYXJ0aWFsbHkgbWF0Y2hpbmcgYSBnaXZlbiByZWdleC4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBZIGJ1dCBub3QgWAorLy8vICAgICAobWF0Y2hlciA9IGN4eFJlY29yZERlY2woaXNFeHBhbnNpb25JbkZpbGVNYXRjaGluZygiQVNULioiKSkKKy8vLyBcY29kZQorLy8vICAgI2luY2x1ZGUgIkFTVE1hdGNoZXIuaCIKKy8vLyAgIGNsYXNzIFgge307CisvLy8gXGVuZGNvZGUKKy8vLyBBU1RNYXRjaGVyLmg6CisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIFkge307CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFVzYWJsZSBhczogTWF0Y2hlcjxEZWNsPiwgTWF0Y2hlcjxTdG10PiwgTWF0Y2hlcjxUeXBlTG9jPgorQVNUX1BPTFlNT1JQSElDX01BVENIRVJfUChpc0V4cGFuc2lvbkluRmlsZU1hdGNoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RfUE9MWU1PUlBISUNfU1VQUE9SVEVEX1RZUEVTKERlY2wsIFN0bXQsIFR5cGVMb2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZywgUmVnRXhwKSB7CisgIGF1dG8gJlNvdXJjZU1hbmFnZXIgPSBGaW5kZXItPmdldEFTVENvbnRleHQoKS5nZXRTb3VyY2VNYW5hZ2VyKCk7CisgIGF1dG8gRXhwYW5zaW9uTG9jID0gU291cmNlTWFuYWdlci5nZXRFeHBhbnNpb25Mb2MoTm9kZS5nZXRMb2NTdGFydCgpKTsKKyAgaWYgKEV4cGFuc2lvbkxvYy5pc0ludmFsaWQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBhdXRvIEZpbGVFbnRyeSA9CisgICAgICBTb3VyY2VNYW5hZ2VyLmdldEZpbGVFbnRyeUZvcklEKFNvdXJjZU1hbmFnZXIuZ2V0RmlsZUlEKEV4cGFuc2lvbkxvYykpOworICBpZiAoIUZpbGVFbnRyeSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGF1dG8gRmlsZW5hbWUgPSBGaWxlRW50cnktPmdldE5hbWUoKTsKKyAgbGx2bTo6UmVnZXggUkUoUmVnRXhwKTsKKyAgcmV0dXJuIFJFLm1hdGNoKEZpbGVuYW1lKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGRlY2xhcmF0aW9ucy4KKy8vLworLy8vIEV4YW1wbGVzIG1hdGNoZXMgXGMgWCwgXGMgQywgYW5kIHRoZSBmcmllbmQgZGVjbGFyYXRpb24gaW5zaWRlIFxjIEM7CisvLy8gXGNvZGUKKy8vLyAgIHZvaWQgWCgpOworLy8vICAgY2xhc3MgQyB7CisvLy8gICAgIGZyaWVuZCBYOworLy8vICAgfTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0FsbE9mTWF0Y2hlcjxEZWNsPiBkZWNsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgYSBkZWNsYXJhdGlvbiBvZiBhIGxpbmthZ2Ugc3BlY2lmaWNhdGlvbi4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGV4dGVybiAiQyIge30KKy8vLyBcZW5kY29kZQorLy8vIGxpbmthZ2VTcGVjRGVjbCgpCisvLy8gICBtYXRjaGVzICJleHRlcm4gIkMiIHt9IgorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8RGVjbCwgTGlua2FnZVNwZWNEZWNsPgorICAgIGxpbmthZ2VTcGVjRGVjbDsKKworLy8vIFxicmllZiBNYXRjaGVzIGEgZGVjbGFyYXRpb24gb2YgYW55dGhpbmcgdGhhdCBjb3VsZCBoYXZlIGEgbmFtZS4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBcYyBYLCBcYyBTLCB0aGUgYW5vbnltb3VzIHVuaW9uIHR5cGUsIFxjIGksIGFuZCBcYyBVOworLy8vIFxjb2RlCisvLy8gICB0eXBlZGVmIGludCBYOworLy8vICAgc3RydWN0IFMgeworLy8vICAgICB1bmlvbiB7CisvLy8gICAgICAgaW50IGk7CisvLy8gICAgIH0gVTsKKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsIE5hbWVkRGVjbD4gbmFtZWREZWNsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgYSBkZWNsYXJhdGlvbiBvZiBsYWJlbC4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGdvdG8gRk9POworLy8vICAgRk9POiBiYXIoKTsKKy8vLyBcZW5kY29kZQorLy8vIGxhYmVsRGVjbCgpCisvLy8gICBtYXRjaGVzICdGT086JworZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8RGVjbCwgTGFiZWxEZWNsPiBsYWJlbERlY2w7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIGRlY2xhcmF0aW9uIG9mIGEgbmFtZXNwYWNlLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgbmFtZXNwYWNlIHt9CisvLy8gICBuYW1lc3BhY2UgdGVzdCB7fQorLy8vIFxlbmRjb2RlCisvLy8gbmFtZXNwYWNlRGVjbCgpCisvLy8gICBtYXRjaGVzICJuYW1lc3BhY2Uge30iIGFuZCAibmFtZXNwYWNlIHRlc3Qge30iCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxEZWNsLCBOYW1lc3BhY2VEZWNsPgorICAgIG5hbWVzcGFjZURlY2w7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIGRlY2xhcmF0aW9uIG9mIGEgbmFtZXNwYWNlIGFsaWFzLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgbmFtZXNwYWNlIHRlc3Qge30KKy8vLyAgIG5hbWVzcGFjZSBhbGlhcyA9IDo6dGVzdDsKKy8vLyBcZW5kY29kZQorLy8vIG5hbWVzcGFjZUFsaWFzRGVjbCgpCisvLy8gICBtYXRjaGVzICJuYW1lc3BhY2UgYWxpYXMiIGJ1dCBub3QgIm5hbWVzcGFjZSB0ZXN0IgorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8RGVjbCwgTmFtZXNwYWNlQWxpYXNEZWNsPgorICAgIG5hbWVzcGFjZUFsaWFzRGVjbDsKKworLy8vIFxicmllZiBNYXRjaGVzIGNsYXNzLCBzdHJ1Y3QsIGFuZCB1bmlvbiBkZWNsYXJhdGlvbnMuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgXGMgWCwgXGMgWiwgXGMgVSwgYW5kIFxjIFMKKy8vLyBcY29kZQorLy8vICAgY2xhc3MgWDsKKy8vLyAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIFoge307CisvLy8gICBzdHJ1Y3QgUyB7fTsKKy8vLyAgIHVuaW9uIFUge307CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsIFJlY29yZERlY2w+IHJlY29yZERlY2w7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBDKysgY2xhc3MgZGVjbGFyYXRpb25zLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIFxjIFgsIFxjIFoKKy8vLyBcY29kZQorLy8vICAgY2xhc3MgWDsKKy8vLyAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIFoge307CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsIENYWFJlY29yZERlY2w+CisgICAgY3h4UmVjb3JkRGVjbDsKKworLy8vIFxicmllZiBNYXRjaGVzIEMrKyBjbGFzcyB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgXGMgWgorLy8vIFxjb2RlCisvLy8gICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBaIHt9OworLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxEZWNsLCBDbGFzc1RlbXBsYXRlRGVjbD4KKyAgICBjbGFzc1RlbXBsYXRlRGVjbDsKKworLy8vIFxicmllZiBNYXRjaGVzIEMrKyBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBBIHt9OworLy8vICAgdGVtcGxhdGU8PiBjbGFzcyBBPGRvdWJsZT4ge307CisvLy8gICBBPGludD4gYTsKKy8vLyBcZW5kY29kZQorLy8vIGNsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2woKQorLy8vICAgbWF0Y2hlcyB0aGUgc3BlY2lhbGl6YXRpb25zIFxjIEE8aW50PiBhbmQgXGMgQTxkb3VibGU+CitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjwKKyAgICBEZWNsLCBDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsPgorICAgIGNsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBkZWNsYXJhdG9yIGRlY2xhcmF0aW9ucyAoZmllbGQsIHZhcmlhYmxlLCBmdW5jdGlvbgorLy8vIGFuZCBub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zKS4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIFggeyBpbnQgeTsgfTsKKy8vLyBcZW5kY29kZQorLy8vIGRlY2xhcmF0b3JEZWNsKCkKKy8vLyAgIG1hdGNoZXMgXGMgaW50IHkuCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxEZWNsLCBEZWNsYXJhdG9yRGVjbD4KKyAgICBkZWNsYXJhdG9yRGVjbDsKKworLy8vIFxicmllZiBNYXRjaGVzIHBhcmFtZXRlciB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB2b2lkIGYoaW50IHgpOworLy8vIFxlbmRjb2RlCisvLy8gcGFybVZhckRlY2woKQorLy8vICAgbWF0Y2hlcyBcYyBpbnQgeC4KK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsIFBhcm1WYXJEZWNsPgorICAgIHBhcm1WYXJEZWNsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgQysrIGFjY2VzcyBzcGVjaWZpZXIgZGVjbGFyYXRpb25zLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgY2xhc3MgQyB7CisvLy8gICBwdWJsaWM6CisvLy8gICAgIGludCBhOworLy8vICAgfTsKKy8vLyBcZW5kY29kZQorLy8vIGFjY2Vzc1NwZWNEZWNsKCkKKy8vLyAgIG1hdGNoZXMgJ3B1YmxpYzonCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxEZWNsLCBBY2Nlc3NTcGVjRGVjbD4KKyAgICBhY2Nlc3NTcGVjRGVjbDsKKworLy8vIFxicmllZiBNYXRjaGVzIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycy4KKy8vLworLy8vIEV4YW1wbGVzIG1hdGNoZXMgXGMgaSg0MikuCisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIEMgeworLy8vICAgICBDKCkgOiBpKDQyKSB7fQorLy8vICAgICBpbnQgaTsKKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNBbGxPZk1hdGNoZXI8Q1hYQ3RvckluaXRpYWxpemVyPgorICAgIGN4eEN0b3JJbml0aWFsaXplcjsKKworLy8vIFxicmllZiBNYXRjaGVzIHRlbXBsYXRlIGFyZ3VtZW50cy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgQyB7fTsKKy8vLyAgIEM8aW50PiBjOworLy8vIFxlbmRjb2RlCisvLy8gdGVtcGxhdGVBcmd1bWVudCgpCisvLy8gICBtYXRjaGVzICdpbnQnIGluIEM8aW50Pi4KK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNBbGxPZk1hdGNoZXI8VGVtcGxhdGVBcmd1bWVudD4gdGVtcGxhdGVBcmd1bWVudDsKKworLy8vIFxicmllZiBNYXRjaGVzIHRlbXBsYXRlIG5hbWUuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgWCB7IH07CisvLy8gICBYPGludD4geGk7CisvLy8gXGVuZGNvZGUKKy8vLyB0ZW1wbGF0ZU5hbWUoKQorLy8vICAgbWF0Y2hlcyAnWCcgaW4gWDxpbnQ+LgorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0FsbE9mTWF0Y2hlcjxUZW1wbGF0ZU5hbWU+IHRlbXBsYXRlTmFtZTsKKworLy8vIFxicmllZiBNYXRjaGVzIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE4+IHN0cnVjdCBDIHt9OworLy8vIFxlbmRjb2RlCisvLy8gbm9uVHlwZVRlbXBsYXRlUGFybURlY2woKQorLy8vICAgbWF0Y2hlcyAnTicsIGJ1dCBub3QgJ1QnLgorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8RGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsPgorICAgIG5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOPiBzdHJ1Y3QgQyB7fTsKKy8vLyBcZW5kY29kZQorLy8vIHRlbXBsYXRlVHlwZVBhcm1EZWNsKCkKKy8vLyAgIG1hdGNoZXMgJ1QnLCBidXQgbm90ICdOJy4KK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsIFRlbXBsYXRlVHlwZVBhcm1EZWNsPgorICAgIHRlbXBsYXRlVHlwZVBhcm1EZWNsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgcHVibGljIEMrKyBkZWNsYXJhdGlvbnMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBDIHsKKy8vLyAgIHB1YmxpYzogICAgaW50IGE7CisvLy8gICBwcm90ZWN0ZWQ6IGludCBiOworLy8vICAgcHJpdmF0ZTogICBpbnQgYzsKKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKKy8vLyBmaWVsZERlY2woaXNQdWJsaWMoKSkKKy8vLyAgIG1hdGNoZXMgJ2ludCBhOycKK0FTVF9NQVRDSEVSKERlY2wsIGlzUHVibGljKSB7CisgIHJldHVybiBOb2RlLmdldEFjY2VzcygpID09IEFTX3B1YmxpYzsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHByb3RlY3RlZCBDKysgZGVjbGFyYXRpb25zLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgY2xhc3MgQyB7CisvLy8gICBwdWJsaWM6ICAgIGludCBhOworLy8vICAgcHJvdGVjdGVkOiBpbnQgYjsKKy8vLyAgIHByaXZhdGU6ICAgaW50IGM7CisvLy8gICB9OworLy8vIFxlbmRjb2RlCisvLy8gZmllbGREZWNsKGlzUHJvdGVjdGVkKCkpCisvLy8gICBtYXRjaGVzICdpbnQgYjsnCitBU1RfTUFUQ0hFUihEZWNsLCBpc1Byb3RlY3RlZCkgeworICByZXR1cm4gTm9kZS5nZXRBY2Nlc3MoKSA9PSBBU19wcm90ZWN0ZWQ7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBwcml2YXRlIEMrKyBkZWNsYXJhdGlvbnMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBDIHsKKy8vLyAgIHB1YmxpYzogICAgaW50IGE7CisvLy8gICBwcm90ZWN0ZWQ6IGludCBiOworLy8vICAgcHJpdmF0ZTogICBpbnQgYzsKKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKKy8vLyBmaWVsZERlY2woaXNQcml2YXRlKCkpCisvLy8gICBtYXRjaGVzICdpbnQgYzsnCitBU1RfTUFUQ0hFUihEZWNsLCBpc1ByaXZhdGUpIHsKKyAgcmV0dXJuIE5vZGUuZ2V0QWNjZXNzKCkgPT0gQVNfcHJpdmF0ZTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXJzIHRoYXQgYXJlIGJpdC1maWVsZHMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBDIHsKKy8vLyAgICAgaW50IGEgOiAyOworLy8vICAgICBpbnQgYjsKKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKKy8vLyBmaWVsZERlY2woaXNCaXRGaWVsZCgpKQorLy8vICAgbWF0Y2hlcyAnaW50IGE7JyBidXQgbm90ICdpbnQgYjsnLgorQVNUX01BVENIRVIoRmllbGREZWNsLCBpc0JpdEZpZWxkKSB7CisgIHJldHVybiBOb2RlLmlzQml0RmllbGQoKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXJzIHRoYXQgYXJlIGJpdC1maWVsZHMgb2YgdGhlIHNwZWNpZmllZAorLy8vIGJpdCB3aWR0aC4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIEMgeworLy8vICAgICBpbnQgYSA6IDI7CisvLy8gICAgIGludCBiIDogNDsKKy8vLyAgICAgaW50IGMgOiAyOworLy8vICAgfTsKKy8vLyBcZW5kY29kZQorLy8vIGZpZWxkRGVjbChoYXNCaXRXaWR0aCgyKSkKKy8vLyAgIG1hdGNoZXMgJ2ludCBhOycgYW5kICdpbnQgYzsnIGJ1dCBub3QgJ2ludCBiOycuCitBU1RfTUFUQ0hFUl9QKEZpZWxkRGVjbCwgaGFzQml0V2lkdGgsIHVuc2lnbmVkLCBXaWR0aCkgeworICByZXR1cm4gTm9kZS5pc0JpdEZpZWxkKCkgJiYKKyAgICAgICAgIE5vZGUuZ2V0Qml0V2lkdGhWYWx1ZShGaW5kZXItPmdldEFTVENvbnRleHQoKSkgPT0gV2lkdGg7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBub24tc3RhdGljIGRhdGEgbWVtYmVycyB0aGF0IGhhdmUgYW4gaW4tY2xhc3MgaW5pdGlhbGl6ZXIuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBDIHsKKy8vLyAgICAgaW50IGEgPSAyOworLy8vICAgICBpbnQgYiA9IDM7CisvLy8gICAgIGludCBjOworLy8vICAgfTsKKy8vLyBcZW5kY29kZQorLy8vIGZpZWxkRGVjbChoYXNJbkNsYXNzSW5pdGlhbGl6ZXIoaW50ZWdlckxpdGVyYWwoZXF1YWxzKDIpKSkpCisvLy8gICBtYXRjaGVzICdpbnQgYTsnIGJ1dCBub3QgJ2ludCBiOycuCisvLy8gZmllbGREZWNsKGhhc0luQ2xhc3NJbml0aWFsaXplcihhbnl0aGluZygpKSkKKy8vLyAgIG1hdGNoZXMgJ2ludCBhOycgYW5kICdpbnQgYjsnIGJ1dCBub3QgJ2ludCBjOycuCitBU1RfTUFUQ0hFUl9QKEZpZWxkRGVjbCwgaGFzSW5DbGFzc0luaXRpYWxpemVyLCBpbnRlcm5hbDo6TWF0Y2hlcjxFeHByPiwKKyAgICAgICAgICAgICAgSW5uZXJNYXRjaGVyKSB7CisgIGNvbnN0IEV4cHIgKkluaXRpYWxpemVyID0gTm9kZS5nZXRJbkNsYXNzSW5pdGlhbGl6ZXIoKTsKKyAgcmV0dXJuIChJbml0aWFsaXplciAhPSBudWxscHRyICYmCisgICAgICAgICAgSW5uZXJNYXRjaGVyLm1hdGNoZXMoKkluaXRpYWxpemVyLCBGaW5kZXIsIEJ1aWxkZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHRoZSBzcGVjaWFsaXplZCB0ZW1wbGF0ZSBvZiBhIHNwZWNpYWxpemF0aW9uIGRlY2xhcmF0aW9uLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdGVtcGFsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIEEge307CisvLy8gICB0eXBlZGVmIEE8aW50PiBCOworLy8vIFxlbmRjb2RlCisvLy8gY2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbChoYXNTcGVjaWFsaXplZFRlbXBsYXRlKGNsYXNzVGVtcGxhdGVEZWNsKCkpKQorLy8vICAgbWF0Y2hlcyAnQicgd2l0aCBjbGFzc1RlbXBsYXRlRGVjbCgpIG1hdGNoaW5nIHRoZSBjbGFzcyB0ZW1wbGF0ZQorLy8vICAgZGVjbGFyYXRpb24gb2YgJ0EnLgorQVNUX01BVENIRVJfUChDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsLCBoYXNTcGVjaWFsaXplZFRlbXBsYXRlLAorICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxDbGFzc1RlbXBsYXRlRGVjbD4sIElubmVyTWF0Y2hlcikgeworICBjb25zdCBDbGFzc1RlbXBsYXRlRGVjbCogRGVjbCA9IE5vZGUuZ2V0U3BlY2lhbGl6ZWRUZW1wbGF0ZSgpOworICByZXR1cm4gKERlY2wgIT0gbnVsbHB0ciAmJgorICAgICAgICAgIElubmVyTWF0Y2hlci5tYXRjaGVzKCpEZWNsLCBGaW5kZXIsIEJ1aWxkZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGEgZGVjbGFyYXRpb24gdGhhdCBoYXMgYmVlbiBpbXBsaWNpdGx5IGFkZGVkCisvLy8gYnkgdGhlIGNvbXBpbGVyIChlZy4gaW1wbGljaXQgZGVmYXVsdC9jb3B5IGNvbnN0cnVjdG9ycykuCitBU1RfTUFUQ0hFUihEZWNsLCBpc0ltcGxpY2l0KSB7CisgIHJldHVybiBOb2RlLmlzSW1wbGljaXQoKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGNsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbnMsIHRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlIGFuZAorLy8vIGZ1bmN0aW9uRGVjbCB0aGF0IGhhdmUgYXQgbGVhc3Qgb25lIFRlbXBsYXRlQXJndW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuCisvLy8gSW5uZXJNYXRjaGVyLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgQSB7fTsKKy8vLyAgIHRlbXBsYXRlPD4gY2xhc3MgQTxkb3VibGU+IHt9OworLy8vICAgQTxpbnQ+IGE7CisvLy8KKy8vLyAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGYoKSB7fTsKKy8vLyAgIHZvaWQgZnVuYygpIHsgZjxpbnQ+KCk7IH07CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFxlbmRjb2RlCisvLy8gY2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbChoYXNBbnlUZW1wbGF0ZUFyZ3VtZW50KAorLy8vICAgICByZWZlcnNUb1R5cGUoYXNTdHJpbmcoImludCIpKSkpCisvLy8gICBtYXRjaGVzIHRoZSBzcGVjaWFsaXphdGlvbiBcYyBBPGludD4KKy8vLworLy8vIGZ1bmN0aW9uRGVjbChoYXNBbnlUZW1wbGF0ZUFyZ3VtZW50KHJlZmVyc1RvVHlwZShhc1N0cmluZygiaW50IikpKSkKKy8vLyAgIG1hdGNoZXMgdGhlIHNwZWNpYWxpemF0aW9uIFxjIGY8aW50PgorQVNUX1BPTFlNT1JQSElDX01BVENIRVJfUCgKKyAgICBoYXNBbnlUZW1wbGF0ZUFyZ3VtZW50LAorICAgIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25EZWNsKSwKKyAgICBpbnRlcm5hbDo6TWF0Y2hlcjxUZW1wbGF0ZUFyZ3VtZW50PiwgSW5uZXJNYXRjaGVyKSB7CisgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IExpc3QgPQorICAgICAgaW50ZXJuYWw6OmdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25BcmdzKE5vZGUpOworICByZXR1cm4gbWF0Y2hlc0ZpcnN0SW5SYW5nZShJbm5lck1hdGNoZXIsIExpc3QuYmVnaW4oKSwgTGlzdC5lbmQoKSwgRmluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGV4cHJlc3Npb25zIHRoYXQgbWF0Y2ggSW5uZXJNYXRjaGVyIGFmdGVyIGFueSBpbXBsaWNpdCBBU1QKKy8vLyBub2RlcyBhcmUgc3RyaXBwZWQgb2ZmLgorLy8vCisvLy8gUGFyZW50aGVzZXMgYW5kIGV4cGxpY2l0IGNhc3RzIGFyZSBub3QgZGlzY2FyZGVkLgorLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIEMge307CisvLy8gICBDIGEgPSBDKCk7CisvLy8gICBDIGI7CisvLy8gICBDIGMgPSBiOworLy8vIFxlbmRjb2RlCisvLy8gVGhlIG1hdGNoZXJzCisvLy8gXGNvZGUKKy8vLyAgICB2YXJEZWNsKGhhc0luaXRpYWxpemVyKGlnbm9yaW5nSW1wbGljaXQoY3h4Q29uc3RydWN0RXhwcigpKSkpCisvLy8gXGVuZGNvZGUKKy8vLyB3b3VsZCBtYXRjaCB0aGUgZGVjbGFyYXRpb25zIGZvciBhLCBiLCBhbmQgYy4KKy8vLyBXaGlsZQorLy8vIFxjb2RlCisvLy8gICAgdmFyRGVjbChoYXNJbml0aWFsaXplcihjeHhDb25zdHJ1Y3RFeHByKCkpKQorLy8vIFxlbmRjb2RlCisvLy8gb25seSBtYXRjaCB0aGUgZGVjbGFyYXRpb25zIGZvciBiIGFuZCBjLgorQVNUX01BVENIRVJfUChFeHByLCBpZ25vcmluZ0ltcGxpY2l0LCBpbnRlcm5hbDo6TWF0Y2hlcjxFeHByPiwKKyAgICAgICAgICAgICAgSW5uZXJNYXRjaGVyKSB7CisgIHJldHVybiBJbm5lck1hdGNoZXIubWF0Y2hlcygqTm9kZS5JZ25vcmVJbXBsaWNpdCgpLCBGaW5kZXIsIEJ1aWxkZXIpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgZXhwcmVzc2lvbnMgdGhhdCBtYXRjaCBJbm5lck1hdGNoZXIgYWZ0ZXIgYW55IGltcGxpY2l0IGNhc3RzCisvLy8gYXJlIHN0cmlwcGVkIG9mZi4KKy8vLworLy8vIFBhcmVudGhlc2VzIGFuZCBleHBsaWNpdCBjYXN0cyBhcmUgbm90IGRpc2NhcmRlZC4KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBpbnQgYXJyWzVdOworLy8vICAgaW50IGEgPSAwOworLy8vICAgY2hhciBiID0gMDsKKy8vLyAgIGNvbnN0IGludCBjID0gYTsKKy8vLyAgIGludCAqZCA9IGFycjsKKy8vLyAgIGxvbmcgZSA9IChsb25nKSAwbDsKKy8vLyBcZW5kY29kZQorLy8vIFRoZSBtYXRjaGVycworLy8vIFxjb2RlCisvLy8gICAgdmFyRGVjbChoYXNJbml0aWFsaXplcihpZ25vcmluZ0ltcENhc3RzKGludGVnZXJMaXRlcmFsKCkpKSkKKy8vLyAgICB2YXJEZWNsKGhhc0luaXRpYWxpemVyKGlnbm9yaW5nSW1wQ2FzdHMoZGVjbFJlZkV4cHIoKSkpKQorLy8vIFxlbmRjb2RlCisvLy8gd291bGQgbWF0Y2ggdGhlIGRlY2xhcmF0aW9ucyBmb3IgYSwgYiwgYywgYW5kIGQsIGJ1dCBub3QgZS4KKy8vLyBXaGlsZQorLy8vIFxjb2RlCisvLy8gICAgdmFyRGVjbChoYXNJbml0aWFsaXplcihpbnRlZ2VyTGl0ZXJhbCgpKSkKKy8vLyAgICB2YXJEZWNsKGhhc0luaXRpYWxpemVyKGRlY2xSZWZFeHByKCkpKQorLy8vIFxlbmRjb2RlCisvLy8gb25seSBtYXRjaCB0aGUgZGVjbGFyYXRpb25zIGZvciBiLCBjLCBhbmQgZC4KK0FTVF9NQVRDSEVSX1AoRXhwciwgaWdub3JpbmdJbXBDYXN0cywKKyAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8RXhwcj4sIElubmVyTWF0Y2hlcikgeworICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoKk5vZGUuSWdub3JlSW1wQ2FzdHMoKSwgRmluZGVyLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGV4cHJlc3Npb25zIHRoYXQgbWF0Y2ggSW5uZXJNYXRjaGVyIGFmdGVyIHBhcmVudGhlc2VzIGFuZAorLy8vIGNhc3RzIGFyZSBzdHJpcHBlZCBvZmYuCisvLy8KKy8vLyBJbXBsaWNpdCBhbmQgbm9uLUMgU3R5bGUgY2FzdHMgYXJlIGFsc28gZGlzY2FyZGVkLgorLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGludCBhID0gMDsKKy8vLyAgIGNoYXIgYiA9ICgwKTsKKy8vLyAgIHZvaWQqIGMgPSByZWludGVycHJldF9jYXN0PGNoYXIqPigwKTsKKy8vLyAgIGNoYXIgZCA9IGNoYXIoMCk7CisvLy8gXGVuZGNvZGUKKy8vLyBUaGUgbWF0Y2hlcgorLy8vICAgIHZhckRlY2woaGFzSW5pdGlhbGl6ZXIoaWdub3JpbmdQYXJlbkNhc3RzKGludGVnZXJMaXRlcmFsKCkpKSkKKy8vLyB3b3VsZCBtYXRjaCB0aGUgZGVjbGFyYXRpb25zIGZvciBhLCBiLCBjLCBhbmQgZC4KKy8vLyB3aGlsZQorLy8vICAgIHZhckRlY2woaGFzSW5pdGlhbGl6ZXIoaW50ZWdlckxpdGVyYWwoKSkpCisvLy8gb25seSBtYXRjaCB0aGUgZGVjbGFyYXRpb24gZm9yIGEuCitBU1RfTUFUQ0hFUl9QKEV4cHIsIGlnbm9yaW5nUGFyZW5DYXN0cywgaW50ZXJuYWw6Ok1hdGNoZXI8RXhwcj4sIElubmVyTWF0Y2hlcikgeworICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoKk5vZGUuSWdub3JlUGFyZW5DYXN0cygpLCBGaW5kZXIsIEJ1aWxkZXIpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgZXhwcmVzc2lvbnMgdGhhdCBtYXRjaCBJbm5lck1hdGNoZXIgYWZ0ZXIgaW1wbGljaXQgY2FzdHMgYW5kCisvLy8gcGFyZW50aGVzZXMgYXJlIHN0cmlwcGVkIG9mZi4KKy8vLworLy8vIEV4cGxpY2l0IGNhc3RzIGFyZSBub3QgZGlzY2FyZGVkLgorLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGludCBhcnJbNV07CisvLy8gICBpbnQgYSA9IDA7CisvLy8gICBjaGFyIGIgPSAoMCk7CisvLy8gICBjb25zdCBpbnQgYyA9IGE7CisvLy8gICBpbnQgKmQgPSAoYXJyKTsKKy8vLyAgIGxvbmcgZSA9ICgobG9uZykgMGwpOworLy8vIFxlbmRjb2RlCisvLy8gVGhlIG1hdGNoZXJzCisvLy8gICAgdmFyRGVjbChoYXNJbml0aWFsaXplcihpZ25vcmluZ1BhcmVuSW1wQ2FzdHMoaW50ZWdlckxpdGVyYWwoKSkpKQorLy8vICAgIHZhckRlY2woaGFzSW5pdGlhbGl6ZXIoaWdub3JpbmdQYXJlbkltcENhc3RzKGRlY2xSZWZFeHByKCkpKSkKKy8vLyB3b3VsZCBtYXRjaCB0aGUgZGVjbGFyYXRpb25zIGZvciBhLCBiLCBjLCBhbmQgZCwgYnV0IG5vdCBlLgorLy8vIHdoaWxlCisvLy8gICAgdmFyRGVjbChoYXNJbml0aWFsaXplcihpbnRlZ2VyTGl0ZXJhbCgpKSkKKy8vLyAgICB2YXJEZWNsKGhhc0luaXRpYWxpemVyKGRlY2xSZWZFeHByKCkpKQorLy8vIHdvdWxkIG9ubHkgbWF0Y2ggdGhlIGRlY2xhcmF0aW9uIGZvciBhLgorQVNUX01BVENIRVJfUChFeHByLCBpZ25vcmluZ1BhcmVuSW1wQ2FzdHMsCisgICAgICAgICAgICAgIGludGVybmFsOjpNYXRjaGVyPEV4cHI+LCBJbm5lck1hdGNoZXIpIHsKKyAgcmV0dXJuIElubmVyTWF0Y2hlci5tYXRjaGVzKCpOb2RlLklnbm9yZVBhcmVuSW1wQ2FzdHMoKSwgRmluZGVyLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHR5cGVzIHRoYXQgbWF0Y2ggSW5uZXJNYXRjaGVyIGFmdGVyIGFueSBwYXJlbnMgYXJlIHN0cmlwcGVkLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdm9pZCAoKmZwKSh2b2lkKTsKKy8vLyBcZW5kY29kZQorLy8vIFRoZSBtYXRjaGVyCisvLy8gXGNvZGUKKy8vLyAgIHZhckRlY2woaGFzVHlwZShwb2ludGVyVHlwZShwb2ludGVlKGlnbm9yaW5nUGFyZW5zKGZ1bmN0aW9uVHlwZSgpKSkpKSkKKy8vLyBcZW5kY29kZQorLy8vIHdvdWxkIG1hdGNoIHRoZSBkZWNsYXJhdGlvbiBmb3IgZnAuCitBU1RfTUFUQ0hFUl9QKFF1YWxUeXBlLCBpZ25vcmluZ1BhcmVucywKKyAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8UXVhbFR5cGU+LCBJbm5lck1hdGNoZXIpIHsKKyAgcmV0dXJuIElubmVyTWF0Y2hlci5tYXRjaGVzKE5vZGUuSWdub3JlUGFyZW5zKCksIEZpbmRlciwgQnVpbGRlcik7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBjbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25zLCB0ZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZSBhbmQKKy8vLyBmdW5jdGlvbkRlY2wgd2hlcmUgdGhlIG4ndGggVGVtcGxhdGVBcmd1bWVudCBtYXRjaGVzIHRoZSBnaXZlbiBJbm5lck1hdGNoZXIuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPiBjbGFzcyBBIHt9OworLy8vICAgQTxib29sLCBpbnQ+IGI7CisvLy8gICBBPGludCwgYm9vbD4gYzsKKy8vLworLy8vICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBmKCkge30KKy8vLyAgIHZvaWQgZnVuYygpIHsgZjxpbnQ+KCk7IH07CisvLy8gXGVuZGNvZGUKKy8vLyBjbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsKGhhc1RlbXBsYXRlQXJndW1lbnQoCisvLy8gICAgIDEsIHJlZmVyc1RvVHlwZShhc1N0cmluZygiaW50IikpKSkKKy8vLyAgIG1hdGNoZXMgdGhlIHNwZWNpYWxpemF0aW9uIFxjIEE8Ym9vbCwgaW50PgorLy8vCisvLy8gZnVuY3Rpb25EZWNsKGhhc1RlbXBsYXRlQXJndW1lbnQoMCwgcmVmZXJzVG9UeXBlKGFzU3RyaW5nKCJpbnQiKSkpKQorLy8vICAgbWF0Y2hlcyB0aGUgc3BlY2lhbGl6YXRpb24gXGMgZjxpbnQ+CitBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUl9QMigKKyAgICBoYXNUZW1wbGF0ZUFyZ3VtZW50LAorICAgIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25EZWNsKSwKKyAgICB1bnNpZ25lZCwgTiwgaW50ZXJuYWw6Ok1hdGNoZXI8VGVtcGxhdGVBcmd1bWVudD4sIElubmVyTWF0Y2hlcikgeworICBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBMaXN0ID0KKyAgICAgIGludGVybmFsOjpnZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uQXJncyhOb2RlKTsKKyAgaWYgKExpc3Quc2l6ZSgpIDw9IE4pCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoTGlzdFtOXSwgRmluZGVyLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGlmIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUgYXJndW1lbnRzIGVxdWFscyBccCBOLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEMge307CisvLy8gICBDPGludD4gYzsKKy8vLyBcZW5kY29kZQorLy8vIGNsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wodGVtcGxhdGVBcmd1bWVudENvdW50SXMoMSkpCisvLy8gICBtYXRjaGVzIEM8aW50Pi4KK0FTVF9QT0xZTU9SUEhJQ19NQVRDSEVSX1AoCisgICAgdGVtcGxhdGVBcmd1bWVudENvdW50SXMsCisgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUpLAorICAgIHVuc2lnbmVkLCBOKSB7CisgIHJldHVybiBpbnRlcm5hbDo6Z2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbkFyZ3MoTm9kZSkuc2l6ZSgpID09IE47Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIFRlbXBsYXRlQXJndW1lbnQgdGhhdCByZWZlcnMgdG8gYSBjZXJ0YWluIHR5cGUuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBzdHJ1Y3QgWCB7fTsKKy8vLyAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBBIHt9OworLy8vICAgQTxYPiBhOworLy8vIFxlbmRjb2RlCisvLy8gY2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbChoYXNBbnlUZW1wbGF0ZUFyZ3VtZW50KAorLy8vICAgICByZWZlcnNUb1R5cGUoY2xhc3MoaGFzTmFtZSgiWCIpKSkpKQorLy8vICAgbWF0Y2hlcyB0aGUgc3BlY2lhbGl6YXRpb24gXGMgQTxYPgorQVNUX01BVENIRVJfUChUZW1wbGF0ZUFyZ3VtZW50LCByZWZlcnNUb1R5cGUsCisgICAgICAgICAgICAgIGludGVybmFsOjpNYXRjaGVyPFF1YWxUeXBlPiwgSW5uZXJNYXRjaGVyKSB7CisgIGlmIChOb2RlLmdldEtpbmQoKSAhPSBUZW1wbGF0ZUFyZ3VtZW50OjpUeXBlKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIElubmVyTWF0Y2hlci5tYXRjaGVzKE5vZGUuZ2V0QXNUeXBlKCksIEZpbmRlciwgQnVpbGRlcik7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIFRlbXBsYXRlQXJndW1lbnQgdGhhdCByZWZlcnMgdG8gYSBjZXJ0YWluIHRlbXBsYXRlLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdGVtcGxhdGU8dGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBTPiBjbGFzcyBYIHt9OworLy8vICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgWSB7fTsiCisvLy8gICBYPFk+IHhpOworLy8vIFxlbmRjb2RlCisvLy8gY2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbChoYXNBbnlUZW1wbGF0ZUFyZ3VtZW50KAorLy8vICAgICByZWZlcnNUb1RlbXBsYXRlKHRlbXBsYXRlTmFtZSgpKSkpCisvLy8gICBtYXRjaGVzIHRoZSBzcGVjaWFsaXphdGlvbiBcYyBYPFk+CitBU1RfTUFUQ0hFUl9QKFRlbXBsYXRlQXJndW1lbnQsIHJlZmVyc1RvVGVtcGxhdGUsCisgICAgICAgICAgICAgIGludGVybmFsOjpNYXRjaGVyPFRlbXBsYXRlTmFtZT4sIElubmVyTWF0Y2hlcikgeworICBpZiAoTm9kZS5nZXRLaW5kKCkgIT0gVGVtcGxhdGVBcmd1bWVudDo6VGVtcGxhdGUpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoTm9kZS5nZXRBc1RlbXBsYXRlKCksIEZpbmRlciwgQnVpbGRlcik7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIGNhbm9uaWNhbCBUZW1wbGF0ZUFyZ3VtZW50IHRoYXQgcmVmZXJzIHRvIGEgY2VydGFpbgorLy8vIGRlY2xhcmF0aW9uLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgc3RydWN0IEIgeyBpbnQgbmV4dDsgfTsKKy8vLyAgIHRlbXBsYXRlPGludChCOjoqbmV4dF9wdHIpPiBzdHJ1Y3QgQSB7fTsKKy8vLyAgIEE8JkI6Om5leHQ+IGE7CisvLy8gXGVuZGNvZGUKKy8vLyBjbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsKGhhc0FueVRlbXBsYXRlQXJndW1lbnQoCisvLy8gICAgIHJlZmVyc1RvRGVjbGFyYXRpb24oZmllbGREZWNsKGhhc05hbWUoIm5leHQiKSkpKSkKKy8vLyAgIG1hdGNoZXMgdGhlIHNwZWNpYWxpemF0aW9uIFxjIEE8JkI6Om5leHQ+IHdpdGggXGMgZmllbGREZWNsKC4uLikgbWF0Y2hpbmcKKy8vLyAgICAgXGMgQjo6bmV4dAorQVNUX01BVENIRVJfUChUZW1wbGF0ZUFyZ3VtZW50LCByZWZlcnNUb0RlY2xhcmF0aW9uLAorICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxEZWNsPiwgSW5uZXJNYXRjaGVyKSB7CisgIGlmIChOb2RlLmdldEtpbmQoKSA9PSBUZW1wbGF0ZUFyZ3VtZW50OjpEZWNsYXJhdGlvbikKKyAgICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoKk5vZGUuZ2V0QXNEZWNsKCksIEZpbmRlciwgQnVpbGRlcik7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGEgc3VnYXIgVGVtcGxhdGVBcmd1bWVudCB0aGF0IHJlZmVycyB0byBhIGNlcnRhaW4gZXhwcmVzc2lvbi4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHN0cnVjdCBCIHsgaW50IG5leHQ7IH07CisvLy8gICB0ZW1wbGF0ZTxpbnQoQjo6Km5leHRfcHRyKT4gc3RydWN0IEEge307CisvLy8gICBBPCZCOjpuZXh0PiBhOworLy8vIFxlbmRjb2RlCisvLy8gdGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUoaGFzQW55VGVtcGxhdGVBcmd1bWVudCgKKy8vLyAgIGlzRXhwcihoYXNEZXNjZW5kYW50KGRlY2xSZWZFeHByKHRvKGZpZWxkRGVjbChoYXNOYW1lKCJuZXh0IikpKSkpKSkpCisvLy8gICBtYXRjaGVzIHRoZSBzcGVjaWFsaXphdGlvbiBcYyBBPCZCOjpuZXh0PiB3aXRoIFxjIGZpZWxkRGVjbCguLi4pIG1hdGNoaW5nCisvLy8gICAgIFxjIEI6Om5leHQKK0FTVF9NQVRDSEVSX1AoVGVtcGxhdGVBcmd1bWVudCwgaXNFeHByLCBpbnRlcm5hbDo6TWF0Y2hlcjxFeHByPiwgSW5uZXJNYXRjaGVyKSB7CisgIGlmIChOb2RlLmdldEtpbmQoKSA9PSBUZW1wbGF0ZUFyZ3VtZW50OjpFeHByZXNzaW9uKQorICAgIHJldHVybiBJbm5lck1hdGNoZXIubWF0Y2hlcygqTm9kZS5nZXRBc0V4cHIoKSwgRmluZGVyLCBCdWlsZGVyKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgYSBUZW1wbGF0ZUFyZ3VtZW50IHRoYXQgaXMgYW4gaW50ZWdyYWwgdmFsdWUuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB0ZW1wbGF0ZTxpbnQgVD4gc3RydWN0IEMge307CisvLy8gICBDPDQyPiBjOworLy8vIFxlbmRjb2RlCisvLy8gY2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCgKKy8vLyAgIGhhc0FueVRlbXBsYXRlQXJndW1lbnQoaXNJbnRlZ3JhbCgpKSkKKy8vLyAgIG1hdGNoZXMgdGhlIGltcGxpY2l0IGluc3RhbnRpYXRpb24gb2YgQyBpbiBDPDQyPgorLy8vICAgd2l0aCBpc0ludGVncmFsKCkgbWF0Y2hpbmcgNDIuCitBU1RfTUFUQ0hFUihUZW1wbGF0ZUFyZ3VtZW50LCBpc0ludGVncmFsKSB7CisgIHJldHVybiBOb2RlLmdldEtpbmQoKSA9PSBUZW1wbGF0ZUFyZ3VtZW50OjpJbnRlZ3JhbDsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGEgVGVtcGxhdGVBcmd1bWVudCB0aGF0IHJlZmVyZXMgdG8gYW4gaW50ZWdyYWwgdHlwZS4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHRlbXBsYXRlPGludCBUPiBzdHJ1Y3QgQyB7fTsKKy8vLyAgIEM8NDI+IGM7CisvLy8gXGVuZGNvZGUKKy8vLyBjbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsKAorLy8vICAgaGFzQW55VGVtcGxhdGVBcmd1bWVudChyZWZlcnNUb0ludGVncmFsVHlwZShhc1N0cmluZygiaW50IikpKSkKKy8vLyAgIG1hdGNoZXMgdGhlIGltcGxpY2l0IGluc3RhbnRpYXRpb24gb2YgQyBpbiBDPDQyPi4KK0FTVF9NQVRDSEVSX1AoVGVtcGxhdGVBcmd1bWVudCwgcmVmZXJzVG9JbnRlZ3JhbFR5cGUsCisgICAgICAgICAgICAgIGludGVybmFsOjpNYXRjaGVyPFF1YWxUeXBlPiwgSW5uZXJNYXRjaGVyKSB7CisgIGlmIChOb2RlLmdldEtpbmQoKSAhPSBUZW1wbGF0ZUFyZ3VtZW50OjpJbnRlZ3JhbCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBJbm5lck1hdGNoZXIubWF0Y2hlcyhOb2RlLmdldEludGVncmFsVHlwZSgpLCBGaW5kZXIsIEJ1aWxkZXIpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgYSBUZW1wbGF0ZUFyZ3VtZW50IG9mIGludGVncmFsIHR5cGUgd2l0aCBhIGdpdmVuIHZhbHVlLgorLy8vCisvLy8gTm90ZSB0aGF0ICdWYWx1ZScgaXMgYSBzdHJpbmcgYXMgdGhlIHRlbXBsYXRlIGFyZ3VtZW50J3MgdmFsdWUgaXMKKy8vLyBhbiBhcmJpdHJhcnkgcHJlY2lzaW9uIGludGVnZXIuICdWYWx1ZScgbXVzdCBiZSBldXFhbCB0byB0aGUgY2Fub25pY2FsCisvLy8gcmVwcmVzZW50YXRpb24gb2YgdGhhdCBpbnRlZ3JhbCB2YWx1ZSBpbiBiYXNlIDEwLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdGVtcGxhdGU8aW50IFQ+IHN0cnVjdCBDIHt9OworLy8vICAgQzw0Mj4gYzsKKy8vLyBcZW5kY29kZQorLy8vIGNsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2woCisvLy8gICBoYXNBbnlUZW1wbGF0ZUFyZ3VtZW50KGVxdWFsc0ludGVncmFsVmFsdWUoIjQyIikpKQorLy8vICAgbWF0Y2hlcyB0aGUgaW1wbGljaXQgaW5zdGFudGlhdGlvbiBvZiBDIGluIEM8NDI+LgorQVNUX01BVENIRVJfUChUZW1wbGF0ZUFyZ3VtZW50LCBlcXVhbHNJbnRlZ3JhbFZhbHVlLAorICAgICAgICAgICAgICBzdGQ6OnN0cmluZywgVmFsdWUpIHsKKyAgaWYgKE5vZGUuZ2V0S2luZCgpICE9IFRlbXBsYXRlQXJndW1lbnQ6OkludGVncmFsKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIE5vZGUuZ2V0QXNJbnRlZ3JhbCgpLnRvU3RyaW5nKDEwKSA9PSBWYWx1ZTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGFueSB2YWx1ZSBkZWNsYXJhdGlvbi4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBBLCBCLCBDIGFuZCBGCisvLy8gXGNvZGUKKy8vLyAgIGVudW0gWCB7IEEsIEIsIEMgfTsKKy8vLyAgIHZvaWQgRigpOworLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxEZWNsLCBWYWx1ZURlY2w+IHZhbHVlRGVjbDsKKworLy8vIFxicmllZiBNYXRjaGVzIEMrKyBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbnMuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgRm9vOjpGb28oKSBhbmQgRm9vOjpGb28oaW50KQorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBGb28geworLy8vICAgIHB1YmxpYzoKKy8vLyAgICAgRm9vKCk7CisvLy8gICAgIEZvbyhpbnQpOworLy8vICAgICBpbnQgRG9Tb21ldGhpbmcoKTsKKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsIENYWENvbnN0cnVjdG9yRGVjbD4KKyAgICBjeHhDb25zdHJ1Y3RvckRlY2w7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBleHBsaWNpdCBDKysgZGVzdHJ1Y3RvciBkZWNsYXJhdGlvbnMuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgRm9vOjp+Rm9vKCkKKy8vLyBcY29kZQorLy8vICAgY2xhc3MgRm9vIHsKKy8vLyAgICBwdWJsaWM6CisvLy8gICAgIHZpcnR1YWwgfkZvbygpOworLy8vICAgfTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8RGVjbCwgQ1hYRGVzdHJ1Y3RvckRlY2w+CisgICAgY3h4RGVzdHJ1Y3RvckRlY2w7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBlbnVtIGRlY2xhcmF0aW9ucy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBYCisvLy8gXGNvZGUKKy8vLyAgIGVudW0gWCB7CisvLy8gICAgIEEsIEIsIEMKKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsIEVudW1EZWNsPiBlbnVtRGVjbDsKKworLy8vIFxicmllZiBNYXRjaGVzIGVudW0gY29uc3RhbnRzLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIEEsIEIsIEMKKy8vLyBcY29kZQorLy8vICAgZW51bSBYIHsKKy8vLyAgICAgQSwgQiwgQworLy8vICAgfTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8RGVjbCwgRW51bUNvbnN0YW50RGVjbD4KKyAgICBlbnVtQ29uc3RhbnREZWNsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgbWV0aG9kIGRlY2xhcmF0aW9ucy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyB5CisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIFggeyB2b2lkIHkoKTsgfTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8RGVjbCwgQ1hYTWV0aG9kRGVjbD4KKyAgICBjeHhNZXRob2REZWNsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgY29udmVyc2lvbiBvcGVyYXRvciBkZWNsYXJhdGlvbnMuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgdGhlIG9wZXJhdG9yLgorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBYIHsgb3BlcmF0b3IgaW50KCkgY29uc3Q7IH07CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsIENYWENvbnZlcnNpb25EZWNsPgorICAgIGN4eENvbnZlcnNpb25EZWNsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgdmFyaWFibGUgZGVjbGFyYXRpb25zLgorLy8vCisvLy8gTm90ZTogdGhpcyBkb2VzIG5vdCBtYXRjaCBkZWNsYXJhdGlvbnMgb2YgbWVtYmVyIHZhcmlhYmxlcywgd2hpY2ggYXJlCisvLy8gImZpZWxkIiBkZWNsYXJhdGlvbnMgaW4gQ2xhbmcgcGFybGFuY2UuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgYQorLy8vIFxjb2RlCisvLy8gICBpbnQgYTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8RGVjbCwgVmFyRGVjbD4gdmFyRGVjbDsKKworLy8vIFxicmllZiBNYXRjaGVzIGZpZWxkIGRlY2xhcmF0aW9ucy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIFggeyBpbnQgbTsgfTsKKy8vLyBcZW5kY29kZQorLy8vIGZpZWxkRGVjbCgpCisvLy8gICBtYXRjaGVzICdtJy4KK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsIEZpZWxkRGVjbD4gZmllbGREZWNsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIGYKKy8vLyBcY29kZQorLy8vICAgdm9pZCBmKCk7CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsIEZ1bmN0aW9uRGVjbD4KKyAgICBmdW5jdGlvbkRlY2w7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBDKysgZnVuY3Rpb24gdGVtcGxhdGUgZGVjbGFyYXRpb25zLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIGYKKy8vLyBcY29kZQorLy8vICAgdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBmKFQgdCkge30KKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8RGVjbCwgRnVuY3Rpb25UZW1wbGF0ZURlY2w+CisgICAgZnVuY3Rpb25UZW1wbGF0ZURlY2w7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBmcmllbmQgZGVjbGFyYXRpb25zLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgY2xhc3MgWCB7IGZyaWVuZCB2b2lkIGZvbygpOyB9OworLy8vIFxlbmRjb2RlCisvLy8gZnJpZW5kRGVjbCgpCisvLy8gICBtYXRjaGVzICdmcmllbmQgdm9pZCBmb28oKScuCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxEZWNsLCBGcmllbmREZWNsPiBmcmllbmREZWNsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgc3RhdGVtZW50cy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHsgKythOyB9CisvLy8gXGVuZGNvZGUKKy8vLyBzdG10KCkKKy8vLyAgIG1hdGNoZXMgYm90aCB0aGUgY29tcG91bmQgc3RhdGVtZW50ICd7ICsrYTsgfScgYW5kICcrK2EnLgorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0FsbE9mTWF0Y2hlcjxTdG10PiBzdG10OworCisvLy8gXGJyaWVmIE1hdGNoZXMgZGVjbGFyYXRpb24gc3RhdGVtZW50cy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGludCBhOworLy8vIFxlbmRjb2RlCisvLy8gZGVjbFN0bXQoKQorLy8vICAgbWF0Y2hlcyAnaW50IGEnLgorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgRGVjbFN0bXQ+IGRlY2xTdG10OworCisvLy8gXGJyaWVmIE1hdGNoZXMgbWVtYmVyIGV4cHJlc3Npb25zLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgY2xhc3MgWSB7CisvLy8gICAgIHZvaWQgeCgpIHsgdGhpcy0+eCgpOyB4KCk7IFkgeTsgeS54KCk7IGE7IHRoaXMtPmI7IFk6OmI7IH0KKy8vLyAgICAgaW50IGE7IHN0YXRpYyBpbnQgYjsKKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKKy8vLyBtZW1iZXJFeHByKCkKKy8vLyAgIG1hdGNoZXMgdGhpcy0+eCwgeCwgeS54LCBhLCB0aGlzLT5iCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBNZW1iZXJFeHByPiBtZW1iZXJFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgY2FsbCBleHByZXNzaW9ucy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyB4LnkoKSBhbmQgeSgpCisvLy8gXGNvZGUKKy8vLyAgIFggeDsKKy8vLyAgIHgueSgpOworLy8vICAgeSgpOworLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBDYWxsRXhwcj4gY2FsbEV4cHI7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBsYW1iZGEgZXhwcmVzc2lvbnMuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgWyZdKCl7cmV0dXJuIDU7fQorLy8vIFxjb2RlCisvLy8gICBbJl0oKXtyZXR1cm4gNTt9CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIExhbWJkYUV4cHI+IGxhbWJkYUV4cHI7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBtZW1iZXIgY2FsbCBleHByZXNzaW9ucy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyB4LnkoKQorLy8vIFxjb2RlCisvLy8gICBYIHg7CisvLy8gICB4LnkoKTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgQ1hYTWVtYmVyQ2FsbEV4cHI+CisgICAgY3h4TWVtYmVyQ2FsbEV4cHI7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBPYmplY3RpdmVDIE1lc3NhZ2UgaW52b2NhdGlvbiBleHByZXNzaW9ucy4KKy8vLworLy8vIFRoZSBpbm5lcm1vc3QgbWVzc2FnZSBzZW5kIGludm9rZXMgdGhlICJhbGxvYyIgY2xhc3MgbWV0aG9kIG9uIHRoZQorLy8vIE5TU3RyaW5nIGNsYXNzLCB3aGlsZSB0aGUgb3V0ZXJtb3N0IG1lc3NhZ2Ugc2VuZCBpbnZva2VzIHRoZQorLy8vICJpbml0V2l0aFN0cmluZyIgaW5zdGFuY2UgbWV0aG9kIG9uIHRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbQorLy8vIE5TU3RyaW5nJ3MgImFsbG9jIi4gVGhpcyBtYXRjaGVyIHNob3VsZCBtYXRjaCBib3RoIG1lc3NhZ2Ugc2VuZHMuCisvLy8gXGNvZGUKKy8vLyAgIFtbTlNTdHJpbmcgYWxsb2NdIGluaXRXaXRoU3RyaW5nOkAiSGVsbG8iXQorLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBPYmpDTWVzc2FnZUV4cHI+CisgICAgb2JqY01lc3NhZ2VFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgT2JqZWN0aXZlLUMgaW50ZXJmYWNlIGRlY2xhcmF0aW9ucy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBGb28KKy8vLyBcY29kZQorLy8vICAgQGludGVyZmFjZSBGb28KKy8vLyAgIEBlbmQKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8RGVjbCwgT2JqQ0ludGVyZmFjZURlY2w+CisgICAgb2JqY0ludGVyZmFjZURlY2w7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBPYmplY3RpdmUtQyBpbXBsZW1lbnRhdGlvbiBkZWNsYXJhdGlvbnMuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgRm9vCisvLy8gXGNvZGUKKy8vLyAgIEBpbXBsZW1lbnRhdGlvbiBGb28KKy8vLyAgIEBlbmQKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8RGVjbCwgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbD4KKyAgICBvYmpjSW1wbGVtZW50YXRpb25EZWNsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgT2JqZWN0aXZlLUMgcHJvdG9jb2wgZGVjbGFyYXRpb25zLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIEZvb0RlbGVnYXRlCisvLy8gXGNvZGUKKy8vLyAgIEBwcm90b2NvbCBGb29EZWxlZ2F0ZQorLy8vICAgQGVuZAorLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxEZWNsLCBPYmpDUHJvdG9jb2xEZWNsPgorICAgIG9iamNQcm90b2NvbERlY2w7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBPYmplY3RpdmUtQyBjYXRlZ29yeSBkZWNsYXJhdGlvbnMuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgRm9vIChBZGRpdGlvbnMpCisvLy8gXGNvZGUKKy8vLyAgIEBpbnRlcmZhY2UgRm9vIChBZGRpdGlvbnMpCisvLy8gICBAZW5kCisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsIE9iakNDYXRlZ29yeURlY2w+CisgICAgb2JqY0NhdGVnb3J5RGVjbDsKKworLy8vIFxicmllZiBNYXRjaGVzIE9iamVjdGl2ZS1DIGNhdGVnb3J5IGRlZmluaXRpb25zLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIEZvbyAoQWRkaXRpb25zKQorLy8vIFxjb2RlCisvLy8gICBAaW1wbGVtZW50YXRpb24gRm9vIChBZGRpdGlvbnMpCisvLy8gICBAZW5kCisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsIE9iakNDYXRlZ29yeUltcGxEZWNsPgorICAgIG9iamNDYXRlZ29yeUltcGxEZWNsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgT2JqZWN0aXZlLUMgbWV0aG9kIGRlY2xhcmF0aW9ucy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBib3RoIGRlY2xhcmF0aW9uIGFuZCBkZWZpbml0aW9uIG9mIC1bRm9vIG1ldGhvZF0KKy8vLyBcY29kZQorLy8vICAgQGludGVyZmFjZSBGb28KKy8vLyAgIC0gKHZvaWQpbWV0aG9kOworLy8vICAgQGVuZAorLy8vCisvLy8gICBAaW1wbGVtZW50YXRpb24gRm9vCisvLy8gICAtICh2b2lkKW1ldGhvZCB7fQorLy8vICAgQGVuZAorLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxEZWNsLCBPYmpDTWV0aG9kRGVjbD4KKyAgICBvYmpjTWV0aG9kRGVjbDsKKworLy8vIFxicmllZiBNYXRjaGVzIE9iamVjdGl2ZS1DIGluc3RhbmNlIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBfZW5hYmxlZAorLy8vIFxjb2RlCisvLy8gICBAaW1wbGVtZW50YXRpb24gRm9vIHsKKy8vLyAgICAgQk9PTCBfZW5hYmxlZDsKKy8vLyAgIH0KKy8vLyAgIEBlbmQKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8RGVjbCwgT2JqQ0l2YXJEZWNsPgorICAgIG9iamNJdmFyRGVjbDsKKworLy8vIFxicmllZiBNYXRjaGVzIE9iamVjdGl2ZS1DIHByb3BlcnR5IGRlY2xhcmF0aW9ucy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBlbmFibGVkCisvLy8gXGNvZGUKKy8vLyAgIEBpbnRlcmZhY2UgRm9vCisvLy8gICBAcHJvcGVydHkgQk9PTCBlbmFibGVkOworLy8vICAgQGVuZAorLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxEZWNsLCBPYmpDUHJvcGVydHlEZWNsPgorICAgIG9iamNQcm9wZXJ0eURlY2w7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBPYmplY3RpdmUtQyBcQHRocm93IHN0YXRlbWVudHMuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgXEB0aHJvdworLy8vIFxjb2RlCisvLy8gICBAdGhyb3cgb2JqOworLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBPYmpDQXRUaHJvd1N0bXQ+CisgICAgb2JqY1Rocm93U3RtdDsKKworLy8vIFxicmllZiBNYXRjaGVzIE9iamVjdGl2ZS1DIEB0cnkgc3RhdGVtZW50cy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBAdHJ5CisvLy8gXGNvZGUKKy8vLyAgIEB0cnkge30KKy8vLyAgIEBjYXRjaCAoLi4uKSB7fQorLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBPYmpDQXRUcnlTdG10PgorICAgIG9iamNUcnlTdG10OworCisvLy8gXGJyaWVmIE1hdGNoZXMgT2JqZWN0aXZlLUMgQGNhdGNoIHN0YXRlbWVudHMuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgQGNhdGNoCisvLy8gXGNvZGUKKy8vLyAgIEB0cnkge30KKy8vLyAgIEBjYXRjaCAoLi4uKSB7fQorLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBPYmpDQXRDYXRjaFN0bXQ+CisgICAgb2JqY0NhdGNoU3RtdDsKKworLy8vIFxicmllZiBNYXRjaGVzIE9iamVjdGl2ZS1DIEBmaW5hbGx5IHN0YXRlbWVudHMuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgQGZpbmFsbHkKKy8vLyBcY29kZQorLy8vICAgQHRyeSB7fQorLy8vICAgQGZpbmFsbHkge30KKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgT2JqQ0F0RmluYWxseVN0bXQ+CisgICAgb2JqY0ZpbmFsbHlTdG10OworCisvLy8gXGJyaWVmIE1hdGNoZXMgZXhwcmVzc2lvbnMgdGhhdCBpbnRyb2R1Y2UgY2xlYW51cHMgdG8gYmUgcnVuIGF0IHRoZSBlbmQKKy8vLyBvZiB0aGUgc3ViLWV4cHJlc3Npb24ncyBldmFsdWF0aW9uLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIHN0ZDo6c3RyaW5nKCkKKy8vLyBcY29kZQorLy8vICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RyID0gc3RkOjpzdHJpbmcoKTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgRXhwcldpdGhDbGVhbnVwcz4KKyAgICBleHByV2l0aENsZWFudXBzOworCisvLy8gXGJyaWVmIE1hdGNoZXMgaW5pdCBsaXN0IGV4cHJlc3Npb25zLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgaW50IGFbXSA9IHsgMSwgMiB9OworLy8vICAgc3RydWN0IEIgeyBpbnQgeCwgeTsgfTsKKy8vLyAgIEIgYiA9IHsgNSwgNiB9OworLy8vIFxlbmRjb2RlCisvLy8gaW5pdExpc3RFeHByKCkKKy8vLyAgIG1hdGNoZXMgInsgMSwgMiB9IiBhbmQgInsgNSwgNiB9IgorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgSW5pdExpc3RFeHByPgorICAgIGluaXRMaXN0RXhwcjsKKworLy8vIFxicmllZiBNYXRjaGVzIHRoZSBzeW50YWN0aWMgZm9ybSBvZiBpbml0IGxpc3QgZXhwcmVzc2lvbnMKKy8vLyAoaWYgZXhwcmVzc2lvbiBoYXZlIGl0KS4KK0FTVF9NQVRDSEVSX1AoSW5pdExpc3RFeHByLCBoYXNTeW50YWN0aWNGb3JtLAorICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxFeHByPiwgSW5uZXJNYXRjaGVyKSB7CisgIGNvbnN0IEV4cHIgKlN5bnRGb3JtID0gTm9kZS5nZXRTeW50YWN0aWNGb3JtKCk7CisgIHJldHVybiAoU3ludEZvcm0gIT0gbnVsbHB0ciAmJgorICAgICAgICAgIElubmVyTWF0Y2hlci5tYXRjaGVzKCpTeW50Rm9ybSwgRmluZGVyLCBCdWlsZGVyKSk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBDKysgaW5pdGlhbGl6ZXIgbGlzdCBleHByZXNzaW9ucy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHN0ZDo6dmVjdG9yPGludD4gYSh7IDEsIDIsIDMgfSk7CisvLy8gICBzdGQ6OnZlY3RvcjxpbnQ+IGIgPSB7IDQsIDUgfTsKKy8vLyAgIGludCBjW10gPSB7IDYsIDcgfTsKKy8vLyAgIHN0ZDo6cGFpcjxpbnQsIGludD4gZCA9IHsgOCwgOSB9OworLy8vIFxlbmRjb2RlCisvLy8gY3h4U3RkSW5pdGlhbGl6ZXJMaXN0RXhwcigpCisvLy8gICBtYXRjaGVzICJ7IDEsIDIsIDMgfSIgYW5kICJ7IDQsIDUgfSIKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhTdGRJbml0aWFsaXplckxpc3RFeHByPgorICAgIGN4eFN0ZEluaXRpYWxpemVyTGlzdEV4cHI7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBpbXBsaWNpdCBpbml0aWFsaXplcnMgb2YgaW5pdCBsaXN0IGV4cHJlc3Npb25zLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgcG9pbnQgcHRhcnJheVsxMF0gPSB7IFsyXS55ID0gMS4wLCBbMl0ueCA9IDIuMCwgWzBdLnggPSAxLjAgfTsKKy8vLyBcZW5kY29kZQorLy8vIGltcGxpY2l0VmFsdWVJbml0RXhwcigpCisvLy8gICBtYXRjaGVzICJbMF0ueSIgKGltcGxpY2l0bHkpCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBJbXBsaWNpdFZhbHVlSW5pdEV4cHI+CisgICAgaW1wbGljaXRWYWx1ZUluaXRFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgcGFyZW4gbGlzdCBleHByZXNzaW9ucy4KKy8vLyBQYXJlbkxpc3RFeHBycyBkb24ndCBoYXZlIGEgcHJlZGVmaW5lZCB0eXBlIGFuZCBhcmUgdXNlZCBmb3IgbGF0ZSBwYXJzaW5nLgorLy8vIEluIHRoZSBmaW5hbCBBU1QsIHRoZXkgY2FuIGJlIG1ldCBpbiB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBYIHsKKy8vLyAgICAgdm9pZCBmKCkgeworLy8vICAgICAgIFggeCgqdGhpcyk7CisvLy8gICAgICAgaW50IGEgPSAwLCBiID0gMTsgaW50IGkgPSAoYSwgYik7CisvLy8gICAgIH0KKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKKy8vLyBwYXJlbkxpc3RFeHByKCkgbWF0Y2hlcyAiKnRoaXMiIGJ1dCBOT1QgbWF0Y2hlcyAoYSwgYikgYmVjYXVzZSAoYSwgYikKKy8vLyBoYXMgYSBwcmVkZWZpbmVkIHR5cGUgYW5kIGlzIGEgUGFyZW5FeHByLCBub3QgYSBQYXJlbkxpc3RFeHByLgorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgUGFyZW5MaXN0RXhwcj4KKyAgICBwYXJlbkxpc3RFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgc3Vic3RpdHV0aW9ucyBvZiBub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdGVtcGxhdGUgPGludCBOPgorLy8vICAgc3RydWN0IEEgeyBzdGF0aWMgY29uc3QgaW50IG4gPSBOOyB9OworLy8vICAgc3RydWN0IEIgOiBwdWJsaWMgQTw0Mj4ge307CisvLy8gXGVuZGNvZGUKKy8vLyBzdWJzdE5vblR5cGVUZW1wbGF0ZVBhcm1FeHByKCkKKy8vLyAgIG1hdGNoZXMgIk4iIGluIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgInN0YXRpYyBjb25zdCBpbnQgbiA9IE47IgorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnN0Tm9uVHlwZVRlbXBsYXRlUGFybUV4cHI+CisgICAgc3Vic3ROb25UeXBlVGVtcGxhdGVQYXJtRXhwcjsKKworLy8vIFxicmllZiBNYXRjaGVzIHVzaW5nIGRlY2xhcmF0aW9ucy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIG5hbWVzcGFjZSBYIHsgaW50IHg7IH0KKy8vLyAgIHVzaW5nIFg6Ong7CisvLy8gXGVuZGNvZGUKKy8vLyB1c2luZ0RlY2woKQorLy8vICAgbWF0Y2hlcyBcY29kZSB1c2luZyBYOjp4IFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxEZWNsLCBVc2luZ0RlY2w+IHVzaW5nRGVjbDsKKworLy8vIFxicmllZiBNYXRjaGVzIHVzaW5nIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBuYW1lc3BhY2UgWCB7IGludCB4OyB9CisvLy8gICB1c2luZyBuYW1lc3BhY2UgWDsKKy8vLyBcZW5kY29kZQorLy8vIHVzaW5nRGlyZWN0aXZlRGVjbCgpCisvLy8gICBtYXRjaGVzIFxjb2RlIHVzaW5nIG5hbWVzcGFjZSBYIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxEZWNsLCBVc2luZ0RpcmVjdGl2ZURlY2w+CisgICAgdXNpbmdEaXJlY3RpdmVEZWNsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgcmVmZXJlbmNlIHRvIGEgbmFtZSB0aGF0IGNhbiBiZSBsb29rZWQgdXAgZHVyaW5nIHBhcnNpbmcKKy8vLyBidXQgY291bGQgbm90IGJlIHJlc29sdmVkIHRvIGEgc3BlY2lmaWMgZGVjbGFyYXRpb24uCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorLy8vICAgVCBmb28oKSB7IFQgYTsgcmV0dXJuIGE7IH0KKy8vLyAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisvLy8gICB2b2lkIGJhcigpIHsKKy8vLyAgICAgZm9vPFQ+KCk7CisvLy8gICB9CisvLy8gXGVuZGNvZGUKKy8vLyB1bnJlc29sdmVkTG9va3VwRXhwcigpCisvLy8gICBtYXRjaGVzIFxjb2RlIGZvbzxUPigpIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBVbnJlc29sdmVkTG9va3VwRXhwcj4KKyAgICB1bnJlc29sdmVkTG9va3VwRXhwcjsKKworLy8vIFxicmllZiBNYXRjaGVzIHVucmVzb2x2ZWQgdXNpbmcgdmFsdWUgZGVjbGFyYXRpb25zLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdGVtcGxhdGU8dHlwZW5hbWUgWD4KKy8vLyAgIGNsYXNzIEMgOiBwcml2YXRlIFggeworLy8vICAgICB1c2luZyBYOjp4OworLy8vICAgfTsKKy8vLyBcZW5kY29kZQorLy8vIHVucmVzb2x2ZWRVc2luZ1ZhbHVlRGVjbCgpCisvLy8gICBtYXRjaGVzIFxjb2RlIHVzaW5nIFg6OnggXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJlc29sdmVkVXNpbmdWYWx1ZURlY2w+CisgICAgdW5yZXNvbHZlZFVzaW5nVmFsdWVEZWNsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgdW5yZXNvbHZlZCB1c2luZyB2YWx1ZSBkZWNsYXJhdGlvbnMgdGhhdCBpbnZvbHZlIHRoZQorLy8vIHR5cGVuYW1lLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisvLy8gICBzdHJ1Y3QgQmFzZSB7IHR5cGVkZWYgVCBGb287IH07CisvLy8KKy8vLyAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisvLy8gICBzdHJ1Y3QgUyA6IHByaXZhdGUgQmFzZTxUPiB7CisvLy8gICAgIHVzaW5nIHR5cGVuYW1lIEJhc2U8VD46OkZvbzsKKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKKy8vLyB1bnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2woKQorLy8vICAgbWF0Y2hlcyBcY29kZSB1c2luZyBCYXNlPFQ+OjpGb28gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2w+CisgICAgdW5yZXNvbHZlZFVzaW5nVHlwZW5hbWVEZWNsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgcGFyZW50aGVzZXMgdXNlZCBpbiBleHByZXNzaW9ucy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyAoZm9vKCkgKyAxKQorLy8vIFxjb2RlCisvLy8gICBpbnQgZm9vKCkgeyByZXR1cm4gMTsgfQorLy8vICAgaW50IGEgPSAoZm9vKCkgKyAxKTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgUGFyZW5FeHByPiBwYXJlbkV4cHI7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBjb25zdHJ1Y3RvciBjYWxsIGV4cHJlc3Npb25zIChpbmNsdWRpbmcgaW1wbGljaXQgb25lcykuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgc3RyaW5nKHB0ciwgbikgYW5kIHB0ciB3aXRoaW4gYXJndW1lbnRzIG9mIGYKKy8vLyAgICAgKG1hdGNoZXIgPSBjeHhDb25zdHJ1Y3RFeHByKCkpCisvLy8gXGNvZGUKKy8vLyAgIHZvaWQgZihjb25zdCBzdHJpbmcgJmEsIGNvbnN0IHN0cmluZyAmYik7CisvLy8gICBjaGFyICpwdHI7CisvLy8gICBpbnQgbjsKKy8vLyAgIGYoc3RyaW5nKHB0ciwgbiksIHB0cik7CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIENYWENvbnN0cnVjdEV4cHI+CisgICAgY3h4Q29uc3RydWN0RXhwcjsKKworLy8vIFxicmllZiBNYXRjaGVzIHVucmVzb2x2ZWQgY29uc3RydWN0b3IgY2FsbCBleHByZXNzaW9ucy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBUKHQpIGluIHJldHVybiBzdGF0ZW1lbnQgb2YgZgorLy8vICAgICAobWF0Y2hlciA9IGN4eFVucmVzb2x2ZWRDb25zdHJ1Y3RFeHByKCkpCisvLy8gXGNvZGUKKy8vLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorLy8vICAgdm9pZCBmKGNvbnN0IFQmIHQpIHsgcmV0dXJuIFQodCk7IH0KKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFVucmVzb2x2ZWRDb25zdHJ1Y3RFeHByPgorICAgIGN4eFVucmVzb2x2ZWRDb25zdHJ1Y3RFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgaW1wbGljaXQgYW5kIGV4cGxpY2l0IHRoaXMgZXhwcmVzc2lvbnMuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgdGhlIGltcGxpY2l0IHRoaXMgZXhwcmVzc2lvbiBpbiAicmV0dXJuIGkiLgorLy8vICAgICAobWF0Y2hlciA9IGN4eFRoaXNFeHByKCkpCisvLy8gXGNvZGUKKy8vLyBzdHJ1Y3QgZm9vIHsKKy8vLyAgIGludCBpOworLy8vICAgaW50IGYoKSB7IHJldHVybiBpOyB9CisvLy8gfTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgQ1hYVGhpc0V4cHI+CisgICAgY3h4VGhpc0V4cHI7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBub2RlcyB3aGVyZSB0ZW1wb3JhcmllcyBhcmUgY3JlYXRlZC4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBGdW5jdGlvblRha2VzU3RyaW5nKEdldFN0cmluZ0J5VmFsdWUoKSkKKy8vLyAgICAgKG1hdGNoZXIgPSBjeHhCaW5kVGVtcG9yYXJ5RXhwcigpKQorLy8vIFxjb2RlCisvLy8gICBGdW5jdGlvblRha2VzU3RyaW5nKEdldFN0cmluZ0J5VmFsdWUoKSk7CisvLy8gICBGdW5jdGlvblRha2VzU3RyaW5nQnlQb2ludGVyKEdldFN0cmluZ1BvaW50ZXIoKSk7CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIENYWEJpbmRUZW1wb3JhcnlFeHByPgorICAgIGN4eEJpbmRUZW1wb3JhcnlFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgbm9kZXMgd2hlcmUgdGVtcG9yYXJpZXMgYXJlIG1hdGVyaWFsaXplZC4KKy8vLworLy8vIEV4YW1wbGU6IEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHN0cnVjdCBUIHt2b2lkIGZ1bmMoKTt9OworLy8vICAgVCBmKCk7CisvLy8gICB2b2lkIGcoVCk7CisvLy8gXGVuZGNvZGUKKy8vLyBtYXRlcmlhbGl6ZVRlbXBvcmFyeUV4cHIoKSBtYXRjaGVzICdmKCknIGluIHRoZXNlIHN0YXRlbWVudHMKKy8vLyBcY29kZQorLy8vICAgVCB1KGYoKSk7CisvLy8gICBnKGYoKSk7CisvLy8gICBmKCkuZnVuYygpOworLy8vIFxlbmRjb2RlCisvLy8gYnV0IGRvZXMgbm90IG1hdGNoCisvLy8gXGNvZGUKKy8vLyAgIGYoKTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGVyaWFsaXplVGVtcG9yYXJ5RXhwcj4KKyAgICBtYXRlcmlhbGl6ZVRlbXBvcmFyeUV4cHI7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBuZXcgZXhwcmVzc2lvbnMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBuZXcgWDsKKy8vLyBcZW5kY29kZQorLy8vIGN4eE5ld0V4cHIoKQorLy8vICAgbWF0Y2hlcyAnbmV3IFgnLgorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgQ1hYTmV3RXhwcj4gY3h4TmV3RXhwcjsKKworLy8vIFxicmllZiBNYXRjaGVzIGRlbGV0ZSBleHByZXNzaW9ucy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGRlbGV0ZSBYOworLy8vIFxlbmRjb2RlCisvLy8gY3h4RGVsZXRlRXhwcigpCisvLy8gICBtYXRjaGVzICdkZWxldGUgWCcuCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBDWFhEZWxldGVFeHByPgorICAgIGN4eERlbGV0ZUV4cHI7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhcnJheSBzdWJzY3JpcHQgZXhwcmVzc2lvbnMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBpbnQgaSA9IGFbMV07CisvLy8gXGVuZGNvZGUKKy8vLyBhcnJheVN1YnNjcmlwdEV4cHIoKQorLy8vICAgbWF0Y2hlcyAiYVsxXSIKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIEFycmF5U3Vic2NyaXB0RXhwcj4KKyAgICBhcnJheVN1YnNjcmlwdEV4cHI7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyB0aGUgdmFsdWUgb2YgYSBkZWZhdWx0IGFyZ3VtZW50IGF0IHRoZSBjYWxsIHNpdGUuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgdGhlIENYWERlZmF1bHRBcmdFeHByIHBsYWNlaG9sZGVyIGluc2VydGVkIGZvciB0aGUKKy8vLyAgICAgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpbiB0aGUgY2FsbCBleHByZXNzaW9uIGYoNDIpCisvLy8gICAgIChtYXRjaGVyID0gY3h4RGVmYXVsdEFyZ0V4cHIoKSkKKy8vLyBcY29kZQorLy8vICAgdm9pZCBmKGludCB4LCBpbnQgeSA9IDApOworLy8vICAgZig0Mik7CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIENYWERlZmF1bHRBcmdFeHByPgorICAgIGN4eERlZmF1bHRBcmdFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgb3ZlcmxvYWRlZCBvcGVyYXRvciBjYWxscy4KKy8vLworLy8vIE5vdGUgdGhhdCBpZiBhbiBvcGVyYXRvciBpc24ndCBvdmVybG9hZGVkLCBpdCB3b24ndCBtYXRjaC4gSW5zdGVhZCwgdXNlCisvLy8gYmluYXJ5T3BlcmF0b3IgbWF0Y2hlci4KKy8vLyBDdXJyZW50bHkgaXQgZG9lcyBub3QgbWF0Y2ggb3BlcmF0b3JzIHN1Y2ggYXMgbmV3IGRlbGV0ZS4KKy8vLyBGSVhNRTogZmlndXJlIG91dCB3aHkgdGhlc2UgZG8gbm90IG1hdGNoPworLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIGJvdGggb3BlcmF0b3I8PCgobyA8PCBiKSwgYykgYW5kIG9wZXJhdG9yPDwobywgYikKKy8vLyAgICAgKG1hdGNoZXIgPSBjeHhPcGVyYXRvckNhbGxFeHByKCkpCisvLy8gXGNvZGUKKy8vLyAgIG9zdHJlYW0gJm9wZXJhdG9yPDwgKG9zdHJlYW0gJm91dCwgaW50IGkpIHsgfTsKKy8vLyAgIG9zdHJlYW0gJm87IGludCBiID0gMSwgYyA9IDE7CisvLy8gICBvIDw8IGIgPDwgYzsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgQ1hYT3BlcmF0b3JDYWxsRXhwcj4KKyAgICBjeHhPcGVyYXRvckNhbGxFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgZXhwcmVzc2lvbnMuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgeCgpCisvLy8gXGNvZGUKKy8vLyAgIHZvaWQgZigpIHsgeCgpOyB9CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIEV4cHI+IGV4cHI7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBleHByZXNzaW9ucyB0aGF0IHJlZmVyIHRvIGRlY2xhcmF0aW9ucy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyB4IGluIGlmICh4KQorLy8vIFxjb2RlCisvLy8gICBib29sIHg7CisvLy8gICBpZiAoeCkge30KKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgRGVjbFJlZkV4cHI+CisgICAgZGVjbFJlZkV4cHI7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBpZiBzdGF0ZW1lbnRzLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzICdpZiAoeCkge30nCisvLy8gXGNvZGUKKy8vLyAgIGlmICh4KSB7fQorLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBJZlN0bXQ+IGlmU3RtdDsKKworLy8vIFxicmllZiBNYXRjaGVzIGZvciBzdGF0ZW1lbnRzLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzICdmb3IgKDs7KSB7fScKKy8vLyBcY29kZQorLy8vICAgZm9yICg7Oykge30KKy8vLyAgIGludCBpW10gPSAgezEsIDIsIDN9OyBmb3IgKGF1dG8gYSA6IGkpOworLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBGb3JTdG10PiBmb3JTdG10OworCisvLy8gXGJyaWVmIE1hdGNoZXMgdGhlIGluY3JlbWVudCBzdGF0ZW1lbnQgb2YgYSBmb3IgbG9vcC4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8gICAgIGZvclN0bXQoaGFzSW5jcmVtZW50KHVuYXJ5T3BlcmF0b3IoaGFzT3BlcmF0b3JOYW1lKCIrKyIpKSkpCisvLy8gbWF0Y2hlcyAnKyt4JyBpbgorLy8vIFxjb2RlCisvLy8gICAgIGZvciAoeDsgeCA8IE47ICsreCkgeyB9CisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSX1AoRm9yU3RtdCwgaGFzSW5jcmVtZW50LCBpbnRlcm5hbDo6TWF0Y2hlcjxTdG10PiwKKyAgICAgICAgICAgICAgSW5uZXJNYXRjaGVyKSB7CisgIGNvbnN0IFN0bXQgKmNvbnN0IEluY3JlbWVudCA9IE5vZGUuZ2V0SW5jKCk7CisgIHJldHVybiAoSW5jcmVtZW50ICE9IG51bGxwdHIgJiYKKyAgICAgICAgICBJbm5lck1hdGNoZXIubWF0Y2hlcygqSW5jcmVtZW50LCBGaW5kZXIsIEJ1aWxkZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHRoZSBpbml0aWFsaXphdGlvbiBzdGF0ZW1lbnQgb2YgYSBmb3IgbG9vcC4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8gICAgIGZvclN0bXQoaGFzTG9vcEluaXQoZGVjbFN0bXQoKSkpCisvLy8gbWF0Y2hlcyAnaW50IHggPSAwJyBpbgorLy8vIFxjb2RlCisvLy8gICAgIGZvciAoaW50IHggPSAwOyB4IDwgTjsgKyt4KSB7IH0KKy8vLyBcZW5kY29kZQorQVNUX01BVENIRVJfUChGb3JTdG10LCBoYXNMb29wSW5pdCwgaW50ZXJuYWw6Ok1hdGNoZXI8U3RtdD4sCisgICAgICAgICAgICAgIElubmVyTWF0Y2hlcikgeworICBjb25zdCBTdG10ICpjb25zdCBJbml0ID0gTm9kZS5nZXRJbml0KCk7CisgIHJldHVybiAoSW5pdCAhPSBudWxscHRyICYmIElubmVyTWF0Y2hlci5tYXRjaGVzKCpJbml0LCBGaW5kZXIsIEJ1aWxkZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHJhbmdlLWJhc2VkIGZvciBzdGF0ZW1lbnRzLgorLy8vCisvLy8gY3h4Rm9yUmFuZ2VTdG10KCkgbWF0Y2hlcyAnZm9yIChhdXRvIGEgOiBpKScKKy8vLyBcY29kZQorLy8vICAgaW50IGlbXSA9ICB7MSwgMiwgM307IGZvciAoYXV0byBhIDogaSk7CisvLy8gICBmb3IoaW50IGogPSAwOyBqIDwgNTsgKytqKTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgQ1hYRm9yUmFuZ2VTdG10PgorICAgIGN4eEZvclJhbmdlU3RtdDsKKworLy8vIFxicmllZiBNYXRjaGVzIHRoZSBpbml0aWFsaXphdGlvbiBzdGF0ZW1lbnQgb2YgYSBmb3IgbG9vcC4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8gICAgIGZvclN0bXQoaGFzTG9vcFZhcmlhYmxlKGFueXRoaW5nKCkpKQorLy8vIG1hdGNoZXMgJ2ludCB4JyBpbgorLy8vIFxjb2RlCisvLy8gICAgIGZvciAoaW50IHggOiBhKSB7IH0KKy8vLyBcZW5kY29kZQorQVNUX01BVENIRVJfUChDWFhGb3JSYW5nZVN0bXQsIGhhc0xvb3BWYXJpYWJsZSwgaW50ZXJuYWw6Ok1hdGNoZXI8VmFyRGVjbD4sCisgICAgICAgICAgICAgIElubmVyTWF0Y2hlcikgeworICBjb25zdCBWYXJEZWNsICpjb25zdCBWYXIgPSBOb2RlLmdldExvb3BWYXJpYWJsZSgpOworICByZXR1cm4gKFZhciAhPSBudWxscHRyICYmIElubmVyTWF0Y2hlci5tYXRjaGVzKCpWYXIsIEZpbmRlciwgQnVpbGRlcikpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgdGhlIHJhbmdlIGluaXRpYWxpemF0aW9uIHN0YXRlbWVudCBvZiBhIGZvciBsb29wLgorLy8vCisvLy8gRXhhbXBsZToKKy8vLyAgICAgZm9yU3RtdChoYXNSYW5nZUluaXQoYW55dGhpbmcoKSkpCisvLy8gbWF0Y2hlcyAnYScgaW4KKy8vLyBcY29kZQorLy8vICAgICBmb3IgKGludCB4IDogYSkgeyB9CisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSX1AoQ1hYRm9yUmFuZ2VTdG10LCBoYXNSYW5nZUluaXQsIGludGVybmFsOjpNYXRjaGVyPEV4cHI+LAorICAgICAgICAgICAgICBJbm5lck1hdGNoZXIpIHsKKyAgY29uc3QgRXhwciAqY29uc3QgSW5pdCA9IE5vZGUuZ2V0UmFuZ2VJbml0KCk7CisgIHJldHVybiAoSW5pdCAhPSBudWxscHRyICYmIElubmVyTWF0Y2hlci5tYXRjaGVzKCpJbml0LCBGaW5kZXIsIEJ1aWxkZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHdoaWxlIHN0YXRlbWVudHMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB3aGlsZSAodHJ1ZSkge30KKy8vLyBcZW5kY29kZQorLy8vIHdoaWxlU3RtdCgpCisvLy8gICBtYXRjaGVzICd3aGlsZSAodHJ1ZSkge30nLgorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgV2hpbGVTdG10PiB3aGlsZVN0bXQ7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBkbyBzdGF0ZW1lbnRzLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgZG8ge30gd2hpbGUgKHRydWUpOworLy8vIFxlbmRjb2RlCisvLy8gZG9TdG10KCkKKy8vLyAgIG1hdGNoZXMgJ2RvIHt9IHdoaWxlKHRydWUpJworZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgRG9TdG10PiBkb1N0bXQ7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBicmVhayBzdGF0ZW1lbnRzLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgd2hpbGUgKHRydWUpIHsgYnJlYWs7IH0KKy8vLyBcZW5kY29kZQorLy8vIGJyZWFrU3RtdCgpCisvLy8gICBtYXRjaGVzICdicmVhaycKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIEJyZWFrU3RtdD4gYnJlYWtTdG10OworCisvLy8gXGJyaWVmIE1hdGNoZXMgY29udGludWUgc3RhdGVtZW50cy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHdoaWxlICh0cnVlKSB7IGNvbnRpbnVlOyB9CisvLy8gXGVuZGNvZGUKKy8vLyBjb250aW51ZVN0bXQoKQorLy8vICAgbWF0Y2hlcyAnY29udGludWUnCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBDb250aW51ZVN0bXQ+CisgICAgY29udGludWVTdG10OworCisvLy8gXGJyaWVmIE1hdGNoZXMgcmV0dXJuIHN0YXRlbWVudHMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICByZXR1cm4gMTsKKy8vLyBcZW5kY29kZQorLy8vIHJldHVyblN0bXQoKQorLy8vICAgbWF0Y2hlcyAncmV0dXJuIDEnCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBSZXR1cm5TdG10PiByZXR1cm5TdG10OworCisvLy8gXGJyaWVmIE1hdGNoZXMgZ290byBzdGF0ZW1lbnRzLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgZ290byBGT087CisvLy8gICBGT086IGJhcigpOworLy8vIFxlbmRjb2RlCisvLy8gZ290b1N0bXQoKQorLy8vICAgbWF0Y2hlcyAnZ290byBGT08nCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBHb3RvU3RtdD4gZ290b1N0bXQ7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBsYWJlbCBzdGF0ZW1lbnRzLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgZ290byBGT087CisvLy8gICBGT086IGJhcigpOworLy8vIFxlbmRjb2RlCisvLy8gbGFiZWxTdG10KCkKKy8vLyAgIG1hdGNoZXMgJ0ZPTzonCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBMYWJlbFN0bXQ+IGxhYmVsU3RtdDsKKworLy8vIFxicmllZiBNYXRjaGVzIGFkZHJlc3Mgb2YgbGFiZWwgc3RhdGVtZW50cyAoR05VIGV4dGVuc2lvbikuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBGT086IGJhcigpOworLy8vICAgdm9pZCAqcHRyID0gJiZGT087CisvLy8gICBnb3RvICpiYXI7CisvLy8gXGVuZGNvZGUKKy8vLyBhZGRyTGFiZWxFeHByKCkKKy8vLyAgIG1hdGNoZXMgJyYmRk9PJworZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgQWRkckxhYmVsRXhwcj4KKyAgICBhZGRyTGFiZWxFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgc3dpdGNoIHN0YXRlbWVudHMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBzd2l0Y2goYSkgeyBjYXNlIDQyOiBicmVhazsgZGVmYXVsdDogYnJlYWs7IH0KKy8vLyBcZW5kY29kZQorLy8vIHN3aXRjaFN0bXQoKQorLy8vICAgbWF0Y2hlcyAnc3dpdGNoKGEpJy4KK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIFN3aXRjaFN0bXQ+IHN3aXRjaFN0bXQ7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBjYXNlIGFuZCBkZWZhdWx0IHN0YXRlbWVudHMgaW5zaWRlIHN3aXRjaCBzdGF0ZW1lbnRzLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgc3dpdGNoKGEpIHsgY2FzZSA0MjogYnJlYWs7IGRlZmF1bHQ6IGJyZWFrOyB9CisvLy8gXGVuZGNvZGUKKy8vLyBzd2l0Y2hDYXNlKCkKKy8vLyAgIG1hdGNoZXMgJ2Nhc2UgNDI6JyBhbmQgJ2RlZmF1bHQ6Jy4KK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIFN3aXRjaENhc2U+IHN3aXRjaENhc2U7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBjYXNlIHN0YXRlbWVudHMgaW5zaWRlIHN3aXRjaCBzdGF0ZW1lbnRzLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgc3dpdGNoKGEpIHsgY2FzZSA0MjogYnJlYWs7IGRlZmF1bHQ6IGJyZWFrOyB9CisvLy8gXGVuZGNvZGUKKy8vLyBjYXNlU3RtdCgpCisvLy8gICBtYXRjaGVzICdjYXNlIDQyOicuCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBDYXNlU3RtdD4gY2FzZVN0bXQ7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBkZWZhdWx0IHN0YXRlbWVudHMgaW5zaWRlIHN3aXRjaCBzdGF0ZW1lbnRzLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgc3dpdGNoKGEpIHsgY2FzZSA0MjogYnJlYWs7IGRlZmF1bHQ6IGJyZWFrOyB9CisvLy8gXGVuZGNvZGUKKy8vLyBkZWZhdWx0U3RtdCgpCisvLy8gICBtYXRjaGVzICdkZWZhdWx0OicuCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBEZWZhdWx0U3RtdD4KKyAgICBkZWZhdWx0U3RtdDsKKworLy8vIFxicmllZiBNYXRjaGVzIGNvbXBvdW5kIHN0YXRlbWVudHMuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgJ3t9JyBhbmQgJ3t7fX0nIGluICdmb3IgKDs7KSB7e319JworLy8vIFxjb2RlCisvLy8gICBmb3IgKDs7KSB7e319CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIENvbXBvdW5kU3RtdD4KKyAgICBjb21wb3VuZFN0bXQ7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBjYXRjaCBzdGF0ZW1lbnRzLgorLy8vCisvLy8gXGNvZGUKKy8vLyAgIHRyeSB7fSBjYXRjaChpbnQgaSkge30KKy8vLyBcZW5kY29kZQorLy8vIGN4eENhdGNoU3RtdCgpCisvLy8gICBtYXRjaGVzICdjYXRjaChpbnQgaSknCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBDWFhDYXRjaFN0bXQ+CisgICAgY3h4Q2F0Y2hTdG10OworCisvLy8gXGJyaWVmIE1hdGNoZXMgdHJ5IHN0YXRlbWVudHMuCisvLy8KKy8vLyBcY29kZQorLy8vICAgdHJ5IHt9IGNhdGNoKGludCBpKSB7fQorLy8vIFxlbmRjb2RlCisvLy8gY3h4VHJ5U3RtdCgpCisvLy8gICBtYXRjaGVzICd0cnkge30nCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBDWFhUcnlTdG10PiBjeHhUcnlTdG10OworCisvLy8gXGJyaWVmIE1hdGNoZXMgdGhyb3cgZXhwcmVzc2lvbnMuCisvLy8KKy8vLyBcY29kZQorLy8vICAgdHJ5IHsgdGhyb3cgNTsgfSBjYXRjaChpbnQgaSkge30KKy8vLyBcZW5kY29kZQorLy8vIGN4eFRocm93RXhwcigpCisvLy8gICBtYXRjaGVzICd0aHJvdyA1JworZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgQ1hYVGhyb3dFeHByPgorICAgIGN4eFRocm93RXhwcjsKKworLy8vIFxicmllZiBNYXRjaGVzIG51bGwgc3RhdGVtZW50cy4KKy8vLworLy8vIFxjb2RlCisvLy8gICBmb28oKTs7CisvLy8gXGVuZGNvZGUKKy8vLyBudWxsU3RtdCgpCisvLy8gICBtYXRjaGVzIHRoZSBzZWNvbmQgJzsnCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBOdWxsU3RtdD4gbnVsbFN0bXQ7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhc20gc3RhdGVtZW50cy4KKy8vLworLy8vIFxjb2RlCisvLy8gIGludCBpID0gMTAwOworLy8vICAgX19hc20oIm1vdiBhbCwgMiIpOworLy8vIFxlbmRjb2RlCisvLy8gYXNtU3RtdCgpCisvLy8gICBtYXRjaGVzICdfX2FzbSgibW92IGFsLCAyIiknCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBBc21TdG10PiBhc21TdG10OworCisvLy8gXGJyaWVmIE1hdGNoZXMgYm9vbCBsaXRlcmFscy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyB0cnVlCisvLy8gXGNvZGUKKy8vLyAgIHRydWUKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgQ1hYQm9vbExpdGVyYWxFeHByPgorICAgIGN4eEJvb2xMaXRlcmFsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgc3RyaW5nIGxpdGVyYWxzIChhbHNvIG1hdGNoZXMgd2lkZSBzdHJpbmcgbGl0ZXJhbHMpLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzICJhYmNkIiwgTCJhYmNkIgorLy8vIFxjb2RlCisvLy8gICBjaGFyICpzID0gImFiY2QiOworLy8vICAgd2NoYXJfdCAqd3MgPSBMImFiY2QiOworLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBTdHJpbmdMaXRlcmFsPgorICAgIHN0cmluZ0xpdGVyYWw7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBjaGFyYWN0ZXIgbGl0ZXJhbHMgKGFsc28gbWF0Y2hlcyB3Y2hhcl90KS4KKy8vLworLy8vIE5vdCBtYXRjaGluZyBIZXgtZW5jb2RlZCBjaGFycyAoZS5nLiAweDEyMzQsIHdoaWNoIGlzIGEgSW50ZWdlckxpdGVyYWwpLAorLy8vIHRob3VnaC4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyAnYScsIEwnYScKKy8vLyBcY29kZQorLy8vICAgY2hhciBjaCA9ICdhJzsKKy8vLyAgIHdjaGFyX3QgY2h3ID0gTCdhJzsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgQ2hhcmFjdGVyTGl0ZXJhbD4KKyAgICBjaGFyYWN0ZXJMaXRlcmFsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgaW50ZWdlciBsaXRlcmFscyBvZiBhbGwgc2l6ZXMgLyBlbmNvZGluZ3MsIGUuZy4KKy8vLyAxLCAxTCwgMHgxIGFuZCAxVS4KKy8vLworLy8vIERvZXMgbm90IG1hdGNoIGNoYXJhY3Rlci1lbmNvZGVkIGludGVnZXJzIHN1Y2ggYXMgTCdhJy4KK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIEludGVnZXJMaXRlcmFsPgorICAgIGludGVnZXJMaXRlcmFsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgZmxvYXQgbGl0ZXJhbHMgb2YgYWxsIHNpemVzIC8gZW5jb2RpbmdzLCBlLmcuCisvLy8gMS4wLCAxLjBmLCAxLjBMIGFuZCAxZTEwLgorLy8vCisvLy8gRG9lcyBub3QgbWF0Y2ggaW1wbGljaXQgY29udmVyc2lvbnMgc3VjaCBhcworLy8vIFxjb2RlCisvLy8gICBmbG9hdCBhID0gMTA7CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIEZsb2F0aW5nTGl0ZXJhbD4KKyAgICBmbG9hdExpdGVyYWw7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyB1c2VyIGRlZmluZWQgbGl0ZXJhbCBvcGVyYXRvciBjYWxsLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaDogImZvbyJfc3VmZml4CitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBVc2VyRGVmaW5lZExpdGVyYWw+CisgICAgdXNlckRlZmluZWRMaXRlcmFsOworCisvLy8gXGJyaWVmIE1hdGNoZXMgY29tcG91bmQgKGkuZS4gbm9uLXNjYWxhcikgbGl0ZXJhbHMKKy8vLworLy8vIEV4YW1wbGUgbWF0Y2g6IHsxfSwgKDEsIDIpCisvLy8gXGNvZGUKKy8vLyAgIGludCBhcnJheVs0XSA9IHsxfTsKKy8vLyAgIHZlY3RvciBpbnQgbXl2ZWMgPSAodmVjdG9yIGludCkoMSwgMik7CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIENvbXBvdW5kTGl0ZXJhbEV4cHI+CisgICAgY29tcG91bmRMaXRlcmFsRXhwcjsKKworLy8vIFxicmllZiBNYXRjaGVzIG51bGxwdHIgbGl0ZXJhbC4KK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIENYWE51bGxQdHJMaXRlcmFsRXhwcj4KKyAgICBjeHhOdWxsUHRyTGl0ZXJhbEV4cHI7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBHTlUgX19udWxsIGV4cHJlc3Npb24uCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBHTlVOdWxsRXhwcj4KKyAgICBnbnVOdWxsRXhwcjsKKworLy8vIFxicmllZiBNYXRjaGVzIGF0b21pYyBidWlsdGlucy4KKy8vLyBFeGFtcGxlIG1hdGNoZXMgX19hdG9taWNfbG9hZF9uKHB0ciwgMSkKKy8vLyBcY29kZQorLy8vICAgdm9pZCBmb28oKSB7IGludCAqcHRyOyBfX2F0b21pY19sb2FkX24ocHRyLCAxKTsgfQorLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBBdG9taWNFeHByPiBhdG9taWNFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgc3RhdGVtZW50IGV4cHJlc3Npb24gKEdOVSBleHRlbnNpb24pLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaDogKHsgaW50IFggPSA0OyBYOyB9KQorLy8vIFxjb2RlCisvLy8gICBpbnQgQyA9ICh7IGludCBYID0gNDsgWDsgfSk7CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIFN0bXRFeHByPiBzdG10RXhwcjsKKworLy8vIFxicmllZiBNYXRjaGVzIGJpbmFyeSBvcGVyYXRvciBleHByZXNzaW9ucy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBhIHx8IGIKKy8vLyBcY29kZQorLy8vICAgIShhIHx8IGIpCisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIEJpbmFyeU9wZXJhdG9yPgorICAgIGJpbmFyeU9wZXJhdG9yOworCisvLy8gXGJyaWVmIE1hdGNoZXMgdW5hcnkgb3BlcmF0b3IgZXhwcmVzc2lvbnMuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgIWEKKy8vLyBcY29kZQorLy8vICAgIWEgfHwgYgorLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBVbmFyeU9wZXJhdG9yPgorICAgIHVuYXJ5T3BlcmF0b3I7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBjb25kaXRpb25hbCBvcGVyYXRvciBleHByZXNzaW9ucy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBhID8gYiA6IGMKKy8vLyBcY29kZQorLy8vICAgKGEgPyBiIDogYykgKyA0MgorLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBDb25kaXRpb25hbE9wZXJhdG9yPgorICAgIGNvbmRpdGlvbmFsT3BlcmF0b3I7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBiaW5hcnkgY29uZGl0aW9uYWwgb3BlcmF0b3IgZXhwcmVzc2lvbnMgKEdOVSBleHRlbnNpb24pLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIGEgPzogYgorLy8vIFxjb2RlCisvLy8gICAoYSA/OiBiKSArIDQyOworLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5Q29uZGl0aW9uYWxPcGVyYXRvcj4KKyAgICBiaW5hcnlDb25kaXRpb25hbE9wZXJhdG9yOworCisvLy8gXGJyaWVmIE1hdGNoZXMgb3BhcXVlIHZhbHVlIGV4cHJlc3Npb25zLiBUaGV5IGFyZSB1c2VkIGFzIGhlbHBlcnMKKy8vLyB0byByZWZlcmVuY2UgYW5vdGhlciBleHByZXNzaW9ucyBhbmQgY2FuIGJlIG1ldAorLy8vIGluIEJpbmFyeUNvbmRpdGlvbmFsT3BlcmF0b3JzLCBmb3IgZXhhbXBsZS4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyAnYScKKy8vLyBcY29kZQorLy8vICAgKGEgPzogYykgKyA0MjsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgT3BhcXVlVmFsdWVFeHByPgorICAgIG9wYXF1ZVZhbHVlRXhwcjsKKworLy8vIFxicmllZiBNYXRjaGVzIGEgQysrIHN0YXRpY19hc3NlcnQgZGVjbGFyYXRpb24uCisvLy8KKy8vLyBFeGFtcGxlOgorLy8vICAgc3RhdGljQXNzZXJ0RXhwcigpCisvLy8gbWF0Y2hlcworLy8vICAgc3RhdGljX2Fzc2VydChzaXplb2YoUykgPT0gc2l6ZW9mKGludCkpCisvLy8gaW4KKy8vLyBcY29kZQorLy8vICAgc3RydWN0IFMgeworLy8vICAgICBpbnQgeDsKKy8vLyAgIH07CisvLy8gICBzdGF0aWNfYXNzZXJ0KHNpemVvZihTKSA9PSBzaXplb2YoaW50KSk7CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPERlY2wsIFN0YXRpY0Fzc2VydERlY2w+CisgICAgc3RhdGljQXNzZXJ0RGVjbDsKKworLy8vIFxicmllZiBNYXRjaGVzIGEgcmVpbnRlcnByZXRfY2FzdCBleHByZXNzaW9uLgorLy8vCisvLy8gRWl0aGVyIHRoZSBzb3VyY2UgZXhwcmVzc2lvbiBvciB0aGUgZGVzdGluYXRpb24gdHlwZSBjYW4gYmUgbWF0Y2hlZAorLy8vIHVzaW5nIGhhcygpLCBidXQgaGFzRGVzdGluYXRpb25UeXBlKCkgaXMgbW9yZSBzcGVjaWZpYyBhbmQgY2FuIGJlCisvLy8gbW9yZSByZWFkYWJsZS4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyByZWludGVycHJldF9jYXN0PGNoYXIqPigmcCkgaW4KKy8vLyBcY29kZQorLy8vICAgdm9pZCogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZwKTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgQ1hYUmVpbnRlcnByZXRDYXN0RXhwcj4KKyAgICBjeHhSZWludGVycHJldENhc3RFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgYSBDKysgc3RhdGljX2Nhc3QgZXhwcmVzc2lvbi4KKy8vLworLy8vIFxzZWUgaGFzRGVzdGluYXRpb25UeXBlCisvLy8gXHNlZSByZWludGVycHJldENhc3QKKy8vLworLy8vIEV4YW1wbGU6CisvLy8gICBjeHhTdGF0aWNDYXN0RXhwcigpCisvLy8gbWF0Y2hlcworLy8vICAgc3RhdGljX2Nhc3Q8bG9uZz4oOCkKKy8vLyBpbgorLy8vIFxjb2RlCisvLy8gICBsb25nIGVpZ2h0KHN0YXRpY19jYXN0PGxvbmc+KDgpKTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgQ1hYU3RhdGljQ2FzdEV4cHI+CisgICAgY3h4U3RhdGljQ2FzdEV4cHI7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIGR5bmFtaWNfY2FzdCBleHByZXNzaW9uLgorLy8vCisvLy8gRXhhbXBsZToKKy8vLyAgIGN4eER5bmFtaWNDYXN0RXhwcigpCisvLy8gbWF0Y2hlcworLy8vICAgZHluYW1pY19jYXN0PEQqPigmYik7CisvLy8gaW4KKy8vLyBcY29kZQorLy8vICAgc3RydWN0IEIgeyB2aXJ0dWFsIH5CKCkge30gfTsgc3RydWN0IEQgOiBCIHt9OworLy8vICAgQiBiOworLy8vICAgRCogcCA9IGR5bmFtaWNfY2FzdDxEKj4oJmIpOworLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBDWFhEeW5hbWljQ2FzdEV4cHI+CisgICAgY3h4RHluYW1pY0Nhc3RFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgYSBjb25zdF9jYXN0IGV4cHJlc3Npb24uCisvLy8KKy8vLyBFeGFtcGxlOiBNYXRjaGVzIGNvbnN0X2Nhc3Q8aW50Kj4oJnIpIGluCisvLy8gXGNvZGUKKy8vLyAgIGludCBuID0gNDI7CisvLy8gICBjb25zdCBpbnQgJnIobik7CisvLy8gICBpbnQqIHAgPSBjb25zdF9jYXN0PGludCo+KCZyKTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgQ1hYQ29uc3RDYXN0RXhwcj4KKyAgICBjeHhDb25zdENhc3RFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgYSBDLXN0eWxlIGNhc3QgZXhwcmVzc2lvbi4KKy8vLworLy8vIEV4YW1wbGU6IE1hdGNoZXMgKGludCkgMi4yZiBpbgorLy8vIFxjb2RlCisvLy8gICBpbnQgaSA9IChpbnQpIDIuMmY7CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIENTdHlsZUNhc3RFeHByPgorICAgIGNTdHlsZUNhc3RFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgZXhwbGljaXQgY2FzdCBleHByZXNzaW9ucy4KKy8vLworLy8vIE1hdGNoZXMgYW55IGNhc3QgZXhwcmVzc2lvbiB3cml0dGVuIGluIHVzZXIgY29kZSwgd2hldGhlciBpdCBiZSBhCisvLy8gQy1zdHlsZSBjYXN0LCBhIGZ1bmN0aW9uYWwtc3R5bGUgY2FzdCwgb3IgYSBrZXl3b3JkIGNhc3QuCisvLy8KKy8vLyBEb2VzIG5vdCBtYXRjaCBpbXBsaWNpdCBjb252ZXJzaW9ucy4KKy8vLworLy8vIE5vdGU6IHRoZSBuYW1lICJleHBsaWNpdENhc3QiIGlzIGNob3NlbiB0byBtYXRjaCBDbGFuZydzIHRlcm1pbm9sb2d5LCBhcworLy8vIENsYW5nIHVzZXMgdGhlIHRlcm0gImNhc3QiIHRvIGFwcGx5IHRvIGltcGxpY2l0IGNvbnZlcnNpb25zIGFzIHdlbGwgYXMgdG8KKy8vLyBhY3R1YWwgY2FzdCBleHByZXNzaW9ucy4KKy8vLworLy8vIFxzZWUgaGFzRGVzdGluYXRpb25UeXBlLgorLy8vCisvLy8gRXhhbXBsZTogbWF0Y2hlcyBhbGwgZml2ZSBvZiB0aGUgY2FzdHMgaW4KKy8vLyBcY29kZQorLy8vICAgaW50KChpbnQpKHJlaW50ZXJwcmV0X2Nhc3Q8aW50PihzdGF0aWNfY2FzdDxpbnQ+KGNvbnN0X2Nhc3Q8aW50Pig0MikpKSkpCisvLy8gXGVuZGNvZGUKKy8vLyBidXQgZG9lcyBub3QgbWF0Y2ggdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gaW4KKy8vLyBcY29kZQorLy8vICAgbG9uZyBlbGwgPSA0MjsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgRXhwbGljaXRDYXN0RXhwcj4KKyAgICBleHBsaWNpdENhc3RFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgdGhlIGltcGxpY2l0IGNhc3Qgbm9kZXMgb2YgQ2xhbmcncyBBU1QuCisvLy8KKy8vLyBUaGlzIG1hdGNoZXMgbWFueSBkaWZmZXJlbnQgcGxhY2VzLCBpbmNsdWRpbmcgZnVuY3Rpb24gY2FsbCByZXR1cm4gdmFsdWUKKy8vLyBlbGlkaW5nLCBhcyB3ZWxsIGFzIGFueSB0eXBlIGNvbnZlcnNpb25zLgorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgSW1wbGljaXRDYXN0RXhwcj4KKyAgICBpbXBsaWNpdENhc3RFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgYW55IGNhc3Qgbm9kZXMgb2YgQ2xhbmcncyBBU1QuCisvLy8KKy8vLyBFeGFtcGxlOiBjYXN0RXhwcigpIG1hdGNoZXMgZWFjaCBvZiB0aGUgZm9sbG93aW5nOgorLy8vIFxjb2RlCisvLy8gICAoaW50KSAzOworLy8vICAgY29uc3RfY2FzdDxFeHByICo+KFN1YkV4cHIpOworLy8vICAgY2hhciBjID0gMDsKKy8vLyBcZW5kY29kZQorLy8vIGJ1dCBkb2VzIG5vdCBtYXRjaAorLy8vIFxjb2RlCisvLy8gICBpbnQgaSA9ICgwKTsKKy8vLyAgIGludCBrID0gMDsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgQ2FzdEV4cHI+IGNhc3RFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgZnVuY3Rpb25hbCBjYXN0IGV4cHJlc3Npb25zCisvLy8KKy8vLyBFeGFtcGxlOiBNYXRjaGVzIEZvbyhiYXIpOworLy8vIFxjb2RlCisvLy8gICBGb28gZiA9IGJhcjsKKy8vLyAgIEZvbyBnID0gKEZvbykgYmFyOworLy8vICAgRm9vIGggPSBGb28oYmFyKTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgQ1hYRnVuY3Rpb25hbENhc3RFeHByPgorICAgIGN4eEZ1bmN0aW9uYWxDYXN0RXhwcjsKKworLy8vIFxicmllZiBNYXRjaGVzIGZ1bmN0aW9uYWwgY2FzdCBleHByZXNzaW9ucyBoYXZpbmcgTiAhPSAxIGFyZ3VtZW50cworLy8vCisvLy8gRXhhbXBsZTogTWF0Y2hlcyBGb28oYmFyLCBiYXIpCisvLy8gXGNvZGUKKy8vLyAgIEZvbyBoID0gRm9vKGJhciwgYmFyKTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8U3RtdCwgQ1hYVGVtcG9yYXJ5T2JqZWN0RXhwcj4KKyAgICBjeHhUZW1wb3JhcnlPYmplY3RFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgcHJlZGVmaW5lZCBpZGVudGlmaWVyIGV4cHJlc3Npb25zIFtDOTkgNi40LjIuMl0uCisvLy8KKy8vLyBFeGFtcGxlOiBNYXRjaGVzIF9fZnVuY19fCisvLy8gXGNvZGUKKy8vLyAgIHByaW50ZigiJXMiLCBfX2Z1bmNfXyk7CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIFByZWRlZmluZWRFeHByPgorICAgIHByZWRlZmluZWRFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgQzk5IGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbnMgW0M5OSA2LjcuOF0uCisvLy8KKy8vLyBFeGFtcGxlOiBNYXRjaGVzIHsgWzJdLnkgPSAxLjAsIFswXS54ID0gMS4wIH0KKy8vLyBcY29kZQorLy8vICAgcG9pbnQgcHRhcnJheVsxMF0gPSB7IFsyXS55ID0gMS4wLCBbMF0ueCA9IDEuMCB9OworLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBEZXNpZ25hdGVkSW5pdEV4cHI+CisgICAgZGVzaWduYXRlZEluaXRFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgZGVzaWduYXRlZCBpbml0aWFsaXplciBleHByZXNzaW9ucyB0aGF0IGNvbnRhaW4KKy8vLyBhIHNwZWNpZmljIG51bWJlciBvZiBkZXNpZ25hdG9ycy4KKy8vLworLy8vIEV4YW1wbGU6IEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHBvaW50IHB0YXJyYXlbMTBdID0geyBbMl0ueSA9IDEuMCwgWzBdLnggPSAxLjAgfTsKKy8vLyAgIHBvaW50IHB0YXJyYXkyWzEwXSA9IHsgWzJdLnkgPSAxLjAsIFsyXS54ID0gMC4wLCBbMF0ueCA9IDEuMCB9OworLy8vIFxlbmRjb2RlCisvLy8gZGVzaWduYXRvckNvdW50SXMoMikKKy8vLyAgIG1hdGNoZXMgJ3sgWzJdLnkgPSAxLjAsIFswXS54ID0gMS4wIH0nLAorLy8vICAgYnV0IG5vdCAneyBbMl0ueSA9IDEuMCwgWzJdLnggPSAwLjAsIFswXS54ID0gMS4wIH0nLgorQVNUX01BVENIRVJfUChEZXNpZ25hdGVkSW5pdEV4cHIsIGRlc2lnbmF0b3JDb3VudElzLCB1bnNpZ25lZCwgTikgeworICByZXR1cm4gTm9kZS5zaXplKCkgPT0gTjsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIFxjIFF1YWxUeXBlcyBpbiB0aGUgY2xhbmcgQVNULgorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0FsbE9mTWF0Y2hlcjxRdWFsVHlwZT4gcXVhbFR5cGU7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBcYyBUeXBlcyBpbiB0aGUgY2xhbmcgQVNULgorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0FsbE9mTWF0Y2hlcjxUeXBlPiB0eXBlOworCisvLy8gXGJyaWVmIE1hdGNoZXMgXGMgVHlwZUxvY3MgaW4gdGhlIGNsYW5nIEFTVC4KK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNBbGxPZk1hdGNoZXI8VHlwZUxvYz4gdHlwZUxvYzsKKworLy8vIFxicmllZiBNYXRjaGVzIGlmIGFueSBvZiB0aGUgZ2l2ZW4gbWF0Y2hlcnMgbWF0Y2hlcy4KKy8vLworLy8vIFVubGlrZSBcYyBhbnlPZiwgXGMgZWFjaE9mIHdpbGwgZ2VuZXJhdGUgYSBtYXRjaCByZXN1bHQgZm9yIGVhY2gKKy8vLyBtYXRjaGluZyBzdWJtYXRjaGVyLgorLy8vCisvLy8gRm9yIGV4YW1wbGUsIGluOgorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBBIHsgaW50IGE7IGludCBiOyB9OworLy8vIFxlbmRjb2RlCisvLy8gVGhlIG1hdGNoZXI6CisvLy8gXGNvZGUKKy8vLyAgIGN4eFJlY29yZERlY2woZWFjaE9mKGhhcyhmaWVsZERlY2woaGFzTmFtZSgiYSIpKS5iaW5kKCJ2IikpLAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgaGFzKGZpZWxkRGVjbChoYXNOYW1lKCJiIikpLmJpbmQoInYiKSkpKQorLy8vIFxlbmRjb2RlCisvLy8gd2lsbCBnZW5lcmF0ZSB0d28gcmVzdWx0cyBiaW5kaW5nICJ2IiwgdGhlIGZpcnN0IG9mIHdoaWNoIGJpbmRzCisvLy8gdGhlIGZpZWxkIGRlY2xhcmF0aW9uIG9mIFxjIGEsIHRoZSBzZWNvbmQgdGhlIGZpZWxkIGRlY2xhcmF0aW9uIG9mCisvLy8gXGMgYi4KKy8vLworLy8vIFVzYWJsZSBhczogQW55IE1hdGNoZXIKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNPcGVyYXRvck1hdGNoZXJGdW5jPAorICAgIDIsIHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKT4KKyAgICBlYWNoT2Y7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBpZiBhbnkgb2YgdGhlIGdpdmVuIG1hdGNoZXJzIG1hdGNoZXMuCisvLy8KKy8vLyBVc2FibGUgYXM6IEFueSBNYXRjaGVyCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljT3BlcmF0b3JNYXRjaGVyRnVuYzwKKyAgICAyLCBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCk+CisgICAgYW55T2Y7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBpZiBhbGwgZ2l2ZW4gbWF0Y2hlcnMgbWF0Y2guCisvLy8KKy8vLyBVc2FibGUgYXM6IEFueSBNYXRjaGVyCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljT3BlcmF0b3JNYXRjaGVyRnVuYzwKKyAgICAyLCBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCk+CisgICAgYWxsT2Y7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBzaXplb2YgKEM5OSksIGFsaWdub2YgKEMrKzExKSBhbmQgdmVjX3N0ZXAgKE9wZW5DTCkKKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIEZvbyB4ID0gYmFyOworLy8vICAgaW50IHkgPSBzaXplb2YoeCkgKyBhbGlnbm9mKHgpOworLy8vIFxlbmRjb2RlCisvLy8gdW5hcnlFeHByT3JUeXBlVHJhaXRFeHByKCkKKy8vLyAgIG1hdGNoZXMgXGMgc2l6ZW9mKHgpIGFuZCBcYyBhbGlnbm9mKHgpCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5hcnlFeHByT3JUeXBlVHJhaXRFeHByPgorICAgIHVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwcjsKKworLy8vIFxicmllZiBNYXRjaGVzIHVuYXJ5IGV4cHJlc3Npb25zIHRoYXQgaGF2ZSBhIHNwZWNpZmljIHR5cGUgb2YgYXJndW1lbnQuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBpbnQgYSwgYzsgZmxvYXQgYjsgaW50IHMgPSBzaXplb2YoYSkgKyBzaXplb2YoYikgKyBhbGlnbm9mKGMpOworLy8vIFxlbmRjb2RlCisvLy8gdW5hcnlFeHByT3JUeXBlVHJhaXRFeHByKGhhc0FyZ3VtZW50T2ZUeXBlKGFzU3RyaW5nKCJpbnQiKSkKKy8vLyAgIG1hdGNoZXMgXGMgc2l6ZW9mKGEpIGFuZCBcYyBhbGlnbm9mKGMpCitBU1RfTUFUQ0hFUl9QKFVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwciwgaGFzQXJndW1lbnRPZlR5cGUsCisgICAgICAgICAgICAgIGludGVybmFsOjpNYXRjaGVyPFF1YWxUeXBlPiwgSW5uZXJNYXRjaGVyKSB7CisgIGNvbnN0IFF1YWxUeXBlIEFyZ3VtZW50VHlwZSA9IE5vZGUuZ2V0VHlwZU9mQXJndW1lbnQoKTsKKyAgcmV0dXJuIElubmVyTWF0Y2hlci5tYXRjaGVzKEFyZ3VtZW50VHlwZSwgRmluZGVyLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHVuYXJ5IGV4cHJlc3Npb25zIG9mIGEgY2VydGFpbiBraW5kLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgaW50IHg7CisvLy8gICBpbnQgcyA9IHNpemVvZih4KSArIGFsaWdub2YoeCkKKy8vLyBcZW5kY29kZQorLy8vIHVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwcihvZktpbmQoVUVUVF9TaXplT2YpKQorLy8vICAgbWF0Y2hlcyBcYyBzaXplb2YoeCkKK0FTVF9NQVRDSEVSX1AoVW5hcnlFeHByT3JUeXBlVHJhaXRFeHByLCBvZktpbmQsIFVuYXJ5RXhwck9yVHlwZVRyYWl0LCBLaW5kKSB7CisgIHJldHVybiBOb2RlLmdldEtpbmQoKSA9PSBLaW5kOworfQorCisvLy8gXGJyaWVmIFNhbWUgYXMgdW5hcnlFeHByT3JUeXBlVHJhaXRFeHByLCBidXQgb25seSBtYXRjaGluZworLy8vIGFsaWdub2YuCitpbmxpbmUgaW50ZXJuYWw6Ok1hdGNoZXI8U3RtdD4gYWxpZ25PZkV4cHIoCisgICAgY29uc3QgaW50ZXJuYWw6Ok1hdGNoZXI8VW5hcnlFeHByT3JUeXBlVHJhaXRFeHByPiAmSW5uZXJNYXRjaGVyKSB7CisgIHJldHVybiBzdG10KHVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwcihhbGxPZigKKyAgICAgIG9mS2luZChVRVRUX0FsaWduT2YpLCBJbm5lck1hdGNoZXIpKSk7Cit9CisKKy8vLyBcYnJpZWYgU2FtZSBhcyB1bmFyeUV4cHJPclR5cGVUcmFpdEV4cHIsIGJ1dCBvbmx5IG1hdGNoaW5nCisvLy8gc2l6ZW9mLgoraW5saW5lIGludGVybmFsOjpNYXRjaGVyPFN0bXQ+IHNpemVPZkV4cHIoCisgICAgY29uc3QgaW50ZXJuYWw6Ok1hdGNoZXI8VW5hcnlFeHByT3JUeXBlVHJhaXRFeHByPiAmSW5uZXJNYXRjaGVyKSB7CisgIHJldHVybiBzdG10KHVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwcigKKyAgICAgIGFsbE9mKG9mS2luZChVRVRUX1NpemVPZiksIElubmVyTWF0Y2hlcikpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIE5hbWVkRGVjbCBub2RlcyB0aGF0IGhhdmUgdGhlIHNwZWNpZmllZCBuYW1lLgorLy8vCisvLy8gU3VwcG9ydHMgc3BlY2lmeWluZyBlbmNsb3NpbmcgbmFtZXNwYWNlcyBvciBjbGFzc2VzIGJ5IHByZWZpeGluZyB0aGUgbmFtZQorLy8vIHdpdGggJzxlbmNsb3Npbmc+OjonLgorLy8vIERvZXMgbm90IG1hdGNoIHR5cGVkZWZzIG9mIGFuIHVuZGVybHlpbmcgdHlwZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIFggKE5hbWUgPT0gIlgiKQorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBYOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgWCAoTmFtZSBpcyBvbmUgb2YgIjo6YTo6Yjo6WCIsICJhOjpiOjpYIiwgImI6OlgiLCAiWCIpCisvLy8gXGNvZGUKKy8vLyAgIG5hbWVzcGFjZSBhIHsgbmFtZXNwYWNlIGIgeyBjbGFzcyBYOyB9IH0KKy8vLyBcZW5kY29kZQoraW5saW5lIGludGVybmFsOjpNYXRjaGVyPE5hbWVkRGVjbD4gaGFzTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworICByZXR1cm4gaW50ZXJuYWw6Ok1hdGNoZXI8TmFtZWREZWNsPihuZXcgaW50ZXJuYWw6Okhhc05hbWVNYXRjaGVyKHtOYW1lfSkpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgTmFtZWREZWNsIG5vZGVzIHRoYXQgaGF2ZSBhbnkgb2YgdGhlIHNwZWNpZmllZCBuYW1lcy4KKy8vLworLy8vIFRoaXMgbWF0Y2hlciBpcyBvbmx5IHByb3ZpZGVkIGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIG9mIGhhc05hbWUuCisvLy8gXGNvZGUKKy8vLyAgICAgaGFzQW55TmFtZShhLCBiLCBjKQorLy8vIFxlbmRjb2RlCisvLy8gIGlzIGVxdWl2YWxlbnQgdG8sIGJ1dCBmYXN0ZXIgdGhhbgorLy8vIFxjb2RlCisvLy8gICAgIGFueU9mKGhhc05hbWUoYSksIGhhc05hbWUoYiksIGhhc05hbWUoYykpCisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNGdW5jdGlvbjxpbnRlcm5hbDo6TWF0Y2hlcjxOYW1lZERlY2w+LCBTdHJpbmdSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6Omhhc0FueU5hbWVGdW5jPgorICAgIGhhc0FueU5hbWU7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBOYW1lZERlY2wgbm9kZXMgd2hvc2UgZnVsbHkgcXVhbGlmaWVkIG5hbWVzIGNvbnRhaW4KKy8vLyBhIHN1YnN0cmluZyBtYXRjaGVkIGJ5IHRoZSBnaXZlbiBSZWdFeHAuCisvLy8KKy8vLyBTdXBwb3J0cyBzcGVjaWZ5aW5nIGVuY2xvc2luZyBuYW1lc3BhY2VzIG9yIGNsYXNzZXMgYnkKKy8vLyBwcmVmaXhpbmcgdGhlIG5hbWUgd2l0aCAnPGVuY2xvc2luZz46OicuICBEb2VzIG5vdCBtYXRjaCB0eXBlZGVmcworLy8vIG9mIGFuIHVuZGVybHlpbmcgdHlwZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIFggKHJlZ2V4cCA9PSAiOjpYIikKKy8vLyBcY29kZQorLy8vICAgY2xhc3MgWDsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIFggKHJlZ2V4cCBpcyBvbmUgb2YgIjo6WCIsICJeZm9vOjouKlgiLCBhbW9uZyBvdGhlcnMpCisvLy8gXGNvZGUKKy8vLyAgIG5hbWVzcGFjZSBmb28geyBuYW1lc3BhY2UgYmFyIHsgY2xhc3MgWDsgfSB9CisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSX1AoTmFtZWREZWNsLCBtYXRjaGVzTmFtZSwgc3RkOjpzdHJpbmcsIFJlZ0V4cCkgeworICBhc3NlcnQoIVJlZ0V4cC5lbXB0eSgpKTsKKyAgc3RkOjpzdHJpbmcgRnVsbE5hbWVTdHJpbmcgPSAiOjoiICsgTm9kZS5nZXRRdWFsaWZpZWROYW1lQXNTdHJpbmcoKTsKKyAgbGx2bTo6UmVnZXggUkUoUmVnRXhwKTsKKyAgcmV0dXJuIFJFLm1hdGNoKEZ1bGxOYW1lU3RyaW5nKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIG92ZXJsb2FkZWQgb3BlcmF0b3IgbmFtZXMuCisvLy8KKy8vLyBNYXRjaGVzIG92ZXJsb2FkZWQgb3BlcmF0b3IgbmFtZXMgc3BlY2lmaWVkIGluIHN0cmluZ3Mgd2l0aG91dCB0aGUKKy8vLyAib3BlcmF0b3IiIHByZWZpeDogZS5nLiAiPDwiLgorLy8vCisvLy8gR2l2ZW46CisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIEEgeyBpbnQgb3BlcmF0b3IqKCk7IH07CisvLy8gICBjb25zdCBBICZvcGVyYXRvcjw8KGNvbnN0IEEgJmEsIGNvbnN0IEEgJmIpOworLy8vICAgQSBhOworLy8vICAgYSA8PCBhOyAgIC8vIDwtLSBUaGlzIG1hdGNoZXMKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gXGMgY3h4T3BlcmF0b3JDYWxsRXhwcihoYXNPdmVybG9hZGVkT3BlcmF0b3JOYW1lKCI8PCIpKSkgbWF0Y2hlcyB0aGUKKy8vLyBzcGVjaWZpZWQgbGluZSBhbmQKKy8vLyBcYyBjeHhSZWNvcmREZWNsKGhhc01ldGhvZChoYXNPdmVybG9hZGVkT3BlcmF0b3JOYW1lKCIqIikpKQorLy8vIG1hdGNoZXMgdGhlIGRlY2xhcmF0aW9uIG9mIFxjIEEuCisvLy8KKy8vLyBVc2FibGUgYXM6IE1hdGNoZXI8Q1hYT3BlcmF0b3JDYWxsRXhwcj4sIE1hdGNoZXI8RnVuY3Rpb25EZWNsPgoraW5saW5lIGludGVybmFsOjpQb2x5bW9ycGhpY01hdGNoZXJXaXRoUGFyYW0xPAorICAgIGludGVybmFsOjpIYXNPdmVybG9hZGVkT3BlcmF0b3JOYW1lTWF0Y2hlciwgU3RyaW5nUmVmLAorICAgIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoQ1hYT3BlcmF0b3JDYWxsRXhwciwgRnVuY3Rpb25EZWNsKT4KK2hhc092ZXJsb2FkZWRPcGVyYXRvck5hbWUoU3RyaW5nUmVmIE5hbWUpIHsKKyAgcmV0dXJuIGludGVybmFsOjpQb2x5bW9ycGhpY01hdGNoZXJXaXRoUGFyYW0xPAorICAgICAgaW50ZXJuYWw6Okhhc092ZXJsb2FkZWRPcGVyYXRvck5hbWVNYXRjaGVyLCBTdHJpbmdSZWYsCisgICAgICBBU1RfUE9MWU1PUlBISUNfU1VQUE9SVEVEX1RZUEVTKENYWE9wZXJhdG9yQ2FsbEV4cHIsIEZ1bmN0aW9uRGVjbCk+KE5hbWUpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgQysrIGNsYXNzZXMgdGhhdCBhcmUgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBkZXJpdmVkIGZyb20KKy8vLyBhIGNsYXNzIG1hdGNoaW5nIFxjIEJhc2UuCisvLy8KKy8vLyBOb3RlIHRoYXQgYSBjbGFzcyBpcyBub3QgY29uc2lkZXJlZCB0byBiZSBkZXJpdmVkIGZyb20gaXRzZWxmLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIFksIFosIEMgKEJhc2UgPT0gaGFzTmFtZSgiWCIpKQorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBYOworLy8vICAgY2xhc3MgWSA6IHB1YmxpYyBYIHt9OyAgLy8gZGlyZWN0bHkgZGVyaXZlZAorLy8vICAgY2xhc3MgWiA6IHB1YmxpYyBZIHt9OyAgLy8gaW5kaXJlY3RseSBkZXJpdmVkCisvLy8gICB0eXBlZGVmIFggQTsKKy8vLyAgIHR5cGVkZWYgQSBCOworLy8vICAgY2xhc3MgQyA6IHB1YmxpYyBCIHt9OyAgLy8gZGVyaXZlZCBmcm9tIGEgdHlwZWRlZiBvZiBYCisvLy8gXGVuZGNvZGUKKy8vLworLy8vIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgQmFyIG1hdGNoZXMgaXNEZXJpdmVkRnJvbShoYXNOYW1lKCJYIikpOgorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBGb287CisvLy8gICB0eXBlZGVmIEZvbyBYOworLy8vICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7fTsgIC8vIGRlcml2ZWQgZnJvbSBhIHR5cGUgdGhhdCBYIGlzIGEgdHlwZWRlZiBvZgorLy8vIFxlbmRjb2RlCitBU1RfTUFUQ0hFUl9QKENYWFJlY29yZERlY2wsIGlzRGVyaXZlZEZyb20sCisgICAgICAgICAgICAgIGludGVybmFsOjpNYXRjaGVyPE5hbWVkRGVjbD4sIEJhc2UpIHsKKyAgcmV0dXJuIEZpbmRlci0+Y2xhc3NJc0Rlcml2ZWRGcm9tKCZOb2RlLCBCYXNlLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBPdmVybG9hZGVkIG1ldGhvZCBhcyBzaG9ydGN1dCBmb3IgXGMgaXNEZXJpdmVkRnJvbShoYXNOYW1lKC4uLikpLgorQVNUX01BVENIRVJfUF9PVkVSTE9BRChDWFhSZWNvcmREZWNsLCBpc0Rlcml2ZWRGcm9tLCBzdGQ6OnN0cmluZywgQmFzZU5hbWUsIDEpIHsKKyAgYXNzZXJ0KCFCYXNlTmFtZS5lbXB0eSgpKTsKKyAgcmV0dXJuIGlzRGVyaXZlZEZyb20oaGFzTmFtZShCYXNlTmFtZSkpLm1hdGNoZXMoTm9kZSwgRmluZGVyLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBTaW1pbGFyIHRvIFxjIGlzRGVyaXZlZEZyb20oKSwgYnV0IGFsc28gbWF0Y2hlcyBjbGFzc2VzIHRoYXQgZGlyZWN0bHkKKy8vLyBtYXRjaCBcYyBCYXNlLgorQVNUX01BVENIRVJfUF9PVkVSTE9BRChDWFhSZWNvcmREZWNsLCBpc1NhbWVPckRlcml2ZWRGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxOYW1lZERlY2w+LCBCYXNlLCAwKSB7CisgIHJldHVybiBNYXRjaGVyPENYWFJlY29yZERlY2w+KGFueU9mKEJhc2UsIGlzRGVyaXZlZEZyb20oQmFzZSkpKQorICAgICAgLm1hdGNoZXMoTm9kZSwgRmluZGVyLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBPdmVybG9hZGVkIG1ldGhvZCBhcyBzaG9ydGN1dCBmb3IKKy8vLyBcYyBpc1NhbWVPckRlcml2ZWRGcm9tKGhhc05hbWUoLi4uKSkuCitBU1RfTUFUQ0hFUl9QX09WRVJMT0FEKENYWFJlY29yZERlY2wsIGlzU2FtZU9yRGVyaXZlZEZyb20sIHN0ZDo6c3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICBCYXNlTmFtZSwgMSkgeworICBhc3NlcnQoIUJhc2VOYW1lLmVtcHR5KCkpOworICByZXR1cm4gaXNTYW1lT3JEZXJpdmVkRnJvbShoYXNOYW1lKEJhc2VOYW1lKSkubWF0Y2hlcyhOb2RlLCBGaW5kZXIsIEJ1aWxkZXIpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgdGhlIGZpcnN0IG1ldGhvZCBvZiBhIGNsYXNzIG9yIHN0cnVjdCB0aGF0IHNhdGlzZmllcyBcYworLy8vIElubmVyTWF0Y2hlci4KKy8vLworLy8vIEdpdmVuOgorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBBIHsgdm9pZCBmdW5jKCk7IH07CisvLy8gICBjbGFzcyBCIHsgdm9pZCBtZW1iZXIoKTsgfTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gXGMgY3h4UmVjb3JkRGVjbChoYXNNZXRob2QoaGFzTmFtZSgiZnVuYyIpKSkgbWF0Y2hlcyB0aGUgZGVjbGFyYXRpb24gb2YKKy8vLyBcYyBBIGJ1dCBub3QgXGMgQi4KK0FTVF9NQVRDSEVSX1AoQ1hYUmVjb3JkRGVjbCwgaGFzTWV0aG9kLCBpbnRlcm5hbDo6TWF0Y2hlcjxDWFhNZXRob2REZWNsPiwKKyAgICAgICAgICAgICAgSW5uZXJNYXRjaGVyKSB7CisgIHJldHVybiBtYXRjaGVzRmlyc3RJblBvaW50ZXJSYW5nZShJbm5lck1hdGNoZXIsIE5vZGUubWV0aG9kX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLm1ldGhvZF9lbmQoKSwgRmluZGVyLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHRoZSBnZW5lcmF0ZWQgY2xhc3Mgb2YgbGFtYmRhIGV4cHJlc3Npb25zLgorLy8vCisvLy8gR2l2ZW46CisvLy8gXGNvZGUKKy8vLyAgIGF1dG8geCA9IFtde307CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFxjIGN4eFJlY29yZERlY2woaXNMYW1iZGEoKSkgbWF0Y2hlcyB0aGUgaW1wbGljaXQgY2xhc3MgZGVjbGFyYXRpb24gb2YKKy8vLyBcYyBkZWNsdHlwZSh4KQorQVNUX01BVENIRVIoQ1hYUmVjb3JkRGVjbCwgaXNMYW1iZGEpIHsKKyAgcmV0dXJuIE5vZGUuaXNMYW1iZGEoKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIEFTVCBub2RlcyB0aGF0IGhhdmUgY2hpbGQgQVNUIG5vZGVzIHRoYXQgbWF0Y2ggdGhlCisvLy8gcHJvdmlkZWQgbWF0Y2hlci4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBYLCBZCisvLy8gICAobWF0Y2hlciA9IGN4eFJlY29yZERlY2woaGFzKGN4eFJlY29yZERlY2woaGFzTmFtZSgiWCIpKSkKKy8vLyBcY29kZQorLy8vICAgY2xhc3MgWCB7fTsgIC8vIE1hdGNoZXMgWCwgYmVjYXVzZSBYOjpYIGlzIGEgY2xhc3Mgb2YgbmFtZSBYIGluc2lkZSBYLgorLy8vICAgY2xhc3MgWSB7IGNsYXNzIFgge307IH07CisvLy8gICBjbGFzcyBaIHsgY2xhc3MgWSB7IGNsYXNzIFgge307IH07IH07ICAvLyBEb2VzIG5vdCBtYXRjaCBaLgorLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBDaGlsZFQgbXVzdCBiZSBhbiBBU1QgYmFzZSB0eXBlLgorLy8vCisvLy8gVXNhYmxlIGFzOiBBbnkgTWF0Y2hlcgorLy8vIE5vdGUgdGhhdCBoYXMgaXMgZGlyZWN0IG1hdGNoZXIsIHNvIGl0IGFsc28gbWF0Y2hlcyB0aGluZ3MgbGlrZSBpbXBsaWNpdAorLy8vIGNhc3RzIGFuZCBwYXJlbiBjYXN0cy4gSWYgeW91IGFyZSBtYXRjaGluZyB3aXRoIGV4cHIgdGhlbiB5b3Ugc2hvdWxkCisvLy8gcHJvYmFibHkgY29uc2lkZXIgdXNpbmcgaWdub3JpbmdQYXJlbkltcENhc3RzIGxpa2U6CisvLy8gaGFzKGlnbm9yaW5nUGFyZW5JbXBDYXN0cyhleHByKCkpKS4KK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6QXJndW1lbnRBZGFwdGluZ01hdGNoZXJGdW5jPGludGVybmFsOjpIYXNNYXRjaGVyPiBoYXM7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBBU1Qgbm9kZXMgdGhhdCBoYXZlIGRlc2NlbmRhbnQgQVNUIG5vZGVzIHRoYXQgbWF0Y2ggdGhlCisvLy8gcHJvdmlkZWQgbWF0Y2hlci4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBYLCBZLCBaCisvLy8gICAgIChtYXRjaGVyID0gY3h4UmVjb3JkRGVjbChoYXNEZXNjZW5kYW50KGN4eFJlY29yZERlY2woaGFzTmFtZSgiWCIpKSkpKQorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBYIHt9OyAgLy8gTWF0Y2hlcyBYLCBiZWNhdXNlIFg6OlggaXMgYSBjbGFzcyBvZiBuYW1lIFggaW5zaWRlIFguCisvLy8gICBjbGFzcyBZIHsgY2xhc3MgWCB7fTsgfTsKKy8vLyAgIGNsYXNzIFogeyBjbGFzcyBZIHsgY2xhc3MgWCB7fTsgfTsgfTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gRGVzY2VuZGFudFQgbXVzdCBiZSBhbiBBU1QgYmFzZSB0eXBlLgorLy8vCisvLy8gVXNhYmxlIGFzOiBBbnkgTWF0Y2hlcgorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpBcmd1bWVudEFkYXB0aW5nTWF0Y2hlckZ1bmM8CisgICAgaW50ZXJuYWw6Okhhc0Rlc2NlbmRhbnRNYXRjaGVyPgorICAgIGhhc0Rlc2NlbmRhbnQ7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBBU1Qgbm9kZXMgdGhhdCBoYXZlIGNoaWxkIEFTVCBub2RlcyB0aGF0IG1hdGNoIHRoZQorLy8vIHByb3ZpZGVkIG1hdGNoZXIuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgWCwgWSwgWTo6WCwgWjo6WSwgWjo6WTo6WAorLy8vICAgKG1hdGNoZXIgPSBjeHhSZWNvcmREZWNsKGZvckVhY2goY3h4UmVjb3JkRGVjbChoYXNOYW1lKCJYIikpKQorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBYIHt9OworLy8vICAgY2xhc3MgWSB7IGNsYXNzIFgge307IH07ICAvLyBNYXRjaGVzIFksIGJlY2F1c2UgWTo6WCBpcyBhIGNsYXNzIG9mIG5hbWUgWAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNpZGUgWS4KKy8vLyAgIGNsYXNzIFogeyBjbGFzcyBZIHsgY2xhc3MgWCB7fTsgfTsgfTsgIC8vIERvZXMgbm90IG1hdGNoIFouCisvLy8gXGVuZGNvZGUKKy8vLworLy8vIENoaWxkVCBtdXN0IGJlIGFuIEFTVCBiYXNlIHR5cGUuCisvLy8KKy8vLyBBcyBvcHBvc2VkIHRvICdoYXMnLCAnZm9yRWFjaCcgd2lsbCBjYXVzZSBhIG1hdGNoIGZvciBlYWNoIHJlc3VsdCB0aGF0CisvLy8gbWF0Y2hlcyBpbnN0ZWFkIG9mIG9ubHkgb24gdGhlIGZpcnN0IG9uZS4KKy8vLworLy8vIFVzYWJsZSBhczogQW55IE1hdGNoZXIKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6QXJndW1lbnRBZGFwdGluZ01hdGNoZXJGdW5jPGludGVybmFsOjpGb3JFYWNoTWF0Y2hlcj4KKyAgICBmb3JFYWNoOworCisvLy8gXGJyaWVmIE1hdGNoZXMgQVNUIG5vZGVzIHRoYXQgaGF2ZSBkZXNjZW5kYW50IEFTVCBub2RlcyB0aGF0IG1hdGNoIHRoZQorLy8vIHByb3ZpZGVkIG1hdGNoZXIuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgWCwgQSwgQTo6WCwgQiwgQjo6QywgQjo6Qzo6WAorLy8vICAgKG1hdGNoZXIgPSBjeHhSZWNvcmREZWNsKGZvckVhY2hEZXNjZW5kYW50KGN4eFJlY29yZERlY2woaGFzTmFtZSgiWCIpKSkpKQorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBYIHt9OworLy8vICAgY2xhc3MgQSB7IGNsYXNzIFgge307IH07ICAvLyBNYXRjaGVzIEEsIGJlY2F1c2UgQTo6WCBpcyBhIGNsYXNzIG9mIG5hbWUKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWCBpbnNpZGUgQS4KKy8vLyAgIGNsYXNzIEIgeyBjbGFzcyBDIHsgY2xhc3MgWCB7fTsgfTsgfTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gRGVzY2VuZGFudFQgbXVzdCBiZSBhbiBBU1QgYmFzZSB0eXBlLgorLy8vCisvLy8gQXMgb3Bwb3NlZCB0byAnaGFzRGVzY2VuZGFudCcsICdmb3JFYWNoRGVzY2VuZGFudCcgd2lsbCBjYXVzZSBhIG1hdGNoIGZvcgorLy8vIGVhY2ggcmVzdWx0IHRoYXQgbWF0Y2hlcyBpbnN0ZWFkIG9mIG9ubHkgb24gdGhlIGZpcnN0IG9uZS4KKy8vLworLy8vIE5vdGU6IFJlY3Vyc2l2ZWx5IGNvbWJpbmVkIEZvckVhY2hEZXNjZW5kYW50IGNhbiBjYXVzZSBtYW55IG1hdGNoZXM6CisvLy8gICBjeHhSZWNvcmREZWNsKGZvckVhY2hEZXNjZW5kYW50KGN4eFJlY29yZERlY2woCisvLy8gICAgIGZvckVhY2hEZXNjZW5kYW50KGN4eFJlY29yZERlY2woKSkKKy8vLyAgICkpKQorLy8vIHdpbGwgbWF0Y2ggMTAgdGltZXMgKHBsdXMgaW5qZWN0ZWQgY2xhc3MgbmFtZSBtYXRjaGVzKSBvbjoKKy8vLyBcY29kZQorLy8vICAgY2xhc3MgQSB7IGNsYXNzIEIgeyBjbGFzcyBDIHsgY2xhc3MgRCB7IGNsYXNzIEUge307IH07IH07IH07IH07CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFVzYWJsZSBhczogQW55IE1hdGNoZXIKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6QXJndW1lbnRBZGFwdGluZ01hdGNoZXJGdW5jPAorICAgIGludGVybmFsOjpGb3JFYWNoRGVzY2VuZGFudE1hdGNoZXI+CisgICAgZm9yRWFjaERlc2NlbmRhbnQ7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBpZiB0aGUgbm9kZSBvciBhbnkgZGVzY2VuZGFudCBtYXRjaGVzLgorLy8vCisvLy8gR2VuZXJhdGVzIHJlc3VsdHMgZm9yIGVhY2ggbWF0Y2guCisvLy8KKy8vLyBGb3IgZXhhbXBsZSwgaW46CisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIEEgeyBjbGFzcyBCIHt9OyBjbGFzcyBDIHt9OyB9OworLy8vIFxlbmRjb2RlCisvLy8gVGhlIG1hdGNoZXI6CisvLy8gXGNvZGUKKy8vLyAgIGN4eFJlY29yZERlY2woaGFzTmFtZSgiOjpBIiksCisvLy8gICAgICAgICAgICAgICAgIGZpbmRBbGwoY3h4UmVjb3JkRGVjbChpc0RlZmluaXRpb24oKSkuYmluZCgibSIpKSkKKy8vLyBcZW5kY29kZQorLy8vIHdpbGwgZ2VuZXJhdGUgcmVzdWx0cyBmb3IgXGMgQSwgXGMgQiBhbmQgXGMgQy4KKy8vLworLy8vIFVzYWJsZSBhczogQW55IE1hdGNoZXIKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW50ZXJuYWw6Ok1hdGNoZXI8VD4gZmluZEFsbChjb25zdCBpbnRlcm5hbDo6TWF0Y2hlcjxUPiAmTWF0Y2hlcikgeworICByZXR1cm4gZWFjaE9mKE1hdGNoZXIsIGZvckVhY2hEZXNjZW5kYW50KE1hdGNoZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIEFTVCBub2RlcyB0aGF0IGhhdmUgYSBwYXJlbnQgdGhhdCBtYXRjaGVzIHRoZSBwcm92aWRlZAorLy8vIG1hdGNoZXIuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gdm9pZCBmKCkgeyBmb3IgKDs7KSB7IGludCB4ID0gNDI7IGlmICh0cnVlKSB7IGludCB4ID0gNDM7IH0gfSB9CisvLy8gXGVuZGNvZGUKKy8vLyBcYyBjb21wb3VuZFN0bXQoaGFzUGFyZW50KGlmU3RtdCgpKSkgbWF0Y2hlcyAieyBpbnQgeCA9IDQzOyB9Ii4KKy8vLworLy8vIFVzYWJsZSBhczogQW55IE1hdGNoZXIKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6QXJndW1lbnRBZGFwdGluZ01hdGNoZXJGdW5jPAorICAgIGludGVybmFsOjpIYXNQYXJlbnRNYXRjaGVyLAorICAgIGludGVybmFsOjpUeXBlTGlzdDxEZWNsLCBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jLCBTdG10LCBUeXBlTG9jPiwKKyAgICBpbnRlcm5hbDo6VHlwZUxpc3Q8RGVjbCwgTmVzdGVkTmFtZVNwZWNpZmllckxvYywgU3RtdCwgVHlwZUxvYz4+CisgICAgaGFzUGFyZW50OworCisvLy8gXGJyaWVmIE1hdGNoZXMgQVNUIG5vZGVzIHRoYXQgaGF2ZSBhbiBhbmNlc3RvciB0aGF0IG1hdGNoZXMgdGhlIHByb3ZpZGVkCisvLy8gbWF0Y2hlci4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyB2b2lkIGYoKSB7IGlmICh0cnVlKSB7IGludCB4ID0gNDI7IH0gfQorLy8vIHZvaWQgZygpIHsgZm9yICg7OykgeyBpbnQgeCA9IDQzOyB9IH0KKy8vLyBcZW5kY29kZQorLy8vIFxjIGV4cHIoaW50ZWdlckxpdGVyYWwoaGFzQW5jZXN0b3IoaWZTdG10KCkpKSkgbWF0Y2hlcyBcYyA0MiwgYnV0IG5vdCA0My4KKy8vLworLy8vIFVzYWJsZSBhczogQW55IE1hdGNoZXIKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6QXJndW1lbnRBZGFwdGluZ01hdGNoZXJGdW5jPAorICAgIGludGVybmFsOjpIYXNBbmNlc3Rvck1hdGNoZXIsCisgICAgaW50ZXJuYWw6OlR5cGVMaXN0PERlY2wsIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MsIFN0bXQsIFR5cGVMb2M+LAorICAgIGludGVybmFsOjpUeXBlTGlzdDxEZWNsLCBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jLCBTdG10LCBUeXBlTG9jPj4KKyAgICBoYXNBbmNlc3RvcjsKKworLy8vIFxicmllZiBNYXRjaGVzIGlmIHRoZSBwcm92aWRlZCBtYXRjaGVyIGRvZXMgbm90IG1hdGNoLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIFkgKG1hdGNoZXIgPSBjeHhSZWNvcmREZWNsKHVubGVzcyhoYXNOYW1lKCJYIikpKSkKKy8vLyBcY29kZQorLy8vICAgY2xhc3MgWCB7fTsKKy8vLyAgIGNsYXNzIFkge307CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFVzYWJsZSBhczogQW55IE1hdGNoZXIKK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNPcGVyYXRvck1hdGNoZXJGdW5jPDEsIDE+IHVubGVzczsKKworLy8vIFxicmllZiBNYXRjaGVzIGEgbm9kZSBpZiB0aGUgZGVjbGFyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoYXQgbm9kZQorLy8vIG1hdGNoZXMgdGhlIGdpdmVuIG1hdGNoZXIuCisvLy8KKy8vLyBUaGUgYXNzb2NpYXRlZCBkZWNsYXJhdGlvbiBpczoKKy8vLyAtIGZvciB0eXBlIG5vZGVzLCB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIHVuZGVybHlpbmcgdHlwZQorLy8vIC0gZm9yIENhbGxFeHByLCB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGNhbGxlZQorLy8vIC0gZm9yIE1lbWJlckV4cHIsIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgcmVmZXJlbmNlZCBtZW1iZXIKKy8vLyAtIGZvciBDWFhDb25zdHJ1Y3RFeHByLCB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGNvbnN0cnVjdG9yCisvLy8gLSBmb3IgQ1hYTmV3RXhwciwgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBvcGVyYXRvciBuZXcKKy8vLworLy8vIEZvciB0eXBlIG5vZGVzLCBoYXNEZWNsYXJhdGlvbiB3aWxsIGdlbmVyYWxseSBtYXRjaCB0aGUgZGVjbGFyYXRpb24gb2YgdGhlCisvLy8gc3VnYXJlZCB0eXBlLiBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBYIHt9OworLy8vICAgdHlwZWRlZiBYIFk7CisvLy8gICBZIHk7CisvLy8gXGVuZGNvZGUKKy8vLyBpbiB2YXJEZWNsKGhhc1R5cGUoaGFzRGVjbGFyYXRpb24oZGVjbCgpKSkpIHRoZSBkZWNsIHdpbGwgbWF0Y2ggdGhlCisvLy8gdHlwZWRlZkRlY2wuIEEgY29tbW9uIHVzZSBjYXNlIGlzIHRvIG1hdGNoIHRoZSB1bmRlcmx5aW5nLCBkZXN1Z2FyZWQgdHlwZS4KKy8vLyBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSB1c2luZyB0aGUgaGFzVW5xdWFsaWZpZWREZXN1Z2FyZWRUeXBlIG1hdGNoZXI6CisvLy8gXGNvZGUKKy8vLyAgIHZhckRlY2woaGFzVHlwZShoYXNVbnF1YWxpZmllZERlc3VnYXJlZFR5cGUoCisvLy8gICAgICAgcmVjb3JkVHlwZShoYXNEZWNsYXJhdGlvbihkZWNsKCkpKSkpKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBtYXRjaGVyLCB0aGUgZGVjbCB3aWxsIG1hdGNoIHRoZSBDWFhSZWNvcmREZWNsIG9mIGNsYXNzIFguCisvLy8KKy8vLyBVc2FibGUgYXM6IE1hdGNoZXI8QWRkckxhYmVsRXhwcj4sIE1hdGNoZXI8Q2FsbEV4cHI+LAorLy8vICAgTWF0Y2hlcjxDWFhDb25zdHJ1Y3RFeHByPiwgTWF0Y2hlcjxDWFhOZXdFeHByPiwgTWF0Y2hlcjxEZWNsUmVmRXhwcj4sCisvLy8gICBNYXRjaGVyPEVudW1UeXBlPiwgTWF0Y2hlcjxJbmplY3RlZENsYXNzTmFtZVR5cGU+LCBNYXRjaGVyPExhYmVsU3RtdD4sCisvLy8gICBNYXRjaGVyPE1lbWJlckV4cHI+LCBNYXRjaGVyPFF1YWxUeXBlPiwgTWF0Y2hlcjxSZWNvcmRUeXBlPiwKKy8vLyAgIE1hdGNoZXI8VGFnVHlwZT4sIE1hdGNoZXI8VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGU+LAorLy8vICAgTWF0Y2hlcjxUZW1wbGF0ZVR5cGVQYXJtVHlwZT4sIE1hdGNoZXI8VHlwZWRlZlR5cGU+LAorLy8vICAgTWF0Y2hlcjxVbnJlc29sdmVkVXNpbmdUeXBlPgoraW5saW5lIGludGVybmFsOjpQb2x5bW9ycGhpY01hdGNoZXJXaXRoUGFyYW0xPAorICAgIGludGVybmFsOjpIYXNEZWNsYXJhdGlvbk1hdGNoZXIsIGludGVybmFsOjpNYXRjaGVyPERlY2w+LAorICAgIHZvaWQoaW50ZXJuYWw6Okhhc0RlY2xhcmF0aW9uU3VwcG9ydGVkVHlwZXMpPgoraGFzRGVjbGFyYXRpb24oY29uc3QgaW50ZXJuYWw6Ok1hdGNoZXI8RGVjbD4gJklubmVyTWF0Y2hlcikgeworICByZXR1cm4gaW50ZXJuYWw6OlBvbHltb3JwaGljTWF0Y2hlcldpdGhQYXJhbTE8CisgICAgICBpbnRlcm5hbDo6SGFzRGVjbGFyYXRpb25NYXRjaGVyLCBpbnRlcm5hbDo6TWF0Y2hlcjxEZWNsPiwKKyAgICAgIHZvaWQoaW50ZXJuYWw6Okhhc0RlY2xhcmF0aW9uU3VwcG9ydGVkVHlwZXMpPihJbm5lck1hdGNoZXIpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgYSBcYyBOYW1lZERlY2wgd2hvc2UgdW5kZXJseWluZyBkZWNsYXJhdGlvbiBtYXRjaGVzIHRoZSBnaXZlbgorLy8vIG1hdGNoZXIuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBuYW1lc3BhY2UgTiB7IHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgZihUIHQpOyB9CisvLy8gICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBnKCkgeyB1c2luZyBOOjpmOyBmKFQoKSk7IH0KKy8vLyBcZW5kY29kZQorLy8vIFxjIHVucmVzb2x2ZWRMb29rdXBFeHByKGhhc0FueURlY2xhcmF0aW9uKAorLy8vICAgICBuYW1lZERlY2woaGFzVW5kZXJseWluZ0RlY2woaGFzTmFtZSgiOjpOOjpmIikpKSkpCisvLy8gICBtYXRjaGVzIHRoZSB1c2Ugb2YgXGMgZiBpbiBcYyBnKCkgLgorQVNUX01BVENIRVJfUChOYW1lZERlY2wsIGhhc1VuZGVybHlpbmdEZWNsLCBpbnRlcm5hbDo6TWF0Y2hlcjxOYW1lZERlY2w+LAorICAgICAgICAgICAgICBJbm5lck1hdGNoZXIpIHsKKyAgY29uc3QgTmFtZWREZWNsICpVbmRlcmx5aW5nRGVjbCA9IE5vZGUuZ2V0VW5kZXJseWluZ0RlY2woKTsKKworICByZXR1cm4gVW5kZXJseWluZ0RlY2wgIT0gbnVsbHB0ciAmJgorICAgICAgICAgSW5uZXJNYXRjaGVyLm1hdGNoZXMoKlVuZGVybHlpbmdEZWNsLCBGaW5kZXIsIEJ1aWxkZXIpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgb24gdGhlIGltcGxpY2l0IG9iamVjdCBhcmd1bWVudCBvZiBhIG1lbWJlciBjYWxsIGV4cHJlc3Npb24uCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgeS54KCkKKy8vLyAgIChtYXRjaGVyID0gY3h4TWVtYmVyQ2FsbEV4cHIob24oaGFzVHlwZShjeHhSZWNvcmREZWNsKGhhc05hbWUoIlkiKSkpKSkpCisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIFkgeyBwdWJsaWM6IHZvaWQgeCgpOyB9OworLy8vICAgdm9pZCB6KCkgeyBZIHk7IHkueCgpOyB9CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIEZJWE1FOiBPdmVybG9hZCB0byBhbGxvdyBkaXJlY3RseSBtYXRjaGluZyB0eXBlcz8KK0FTVF9NQVRDSEVSX1AoQ1hYTWVtYmVyQ2FsbEV4cHIsIG9uLCBpbnRlcm5hbDo6TWF0Y2hlcjxFeHByPiwKKyAgICAgICAgICAgICAgSW5uZXJNYXRjaGVyKSB7CisgIGNvbnN0IEV4cHIgKkV4cHJOb2RlID0gTm9kZS5nZXRJbXBsaWNpdE9iamVjdEFyZ3VtZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPklnbm9yZVBhcmVuSW1wQ2FzdHMoKTsKKyAgcmV0dXJuIChFeHByTm9kZSAhPSBudWxscHRyICYmCisgICAgICAgICAgSW5uZXJNYXRjaGVyLm1hdGNoZXMoKkV4cHJOb2RlLCBGaW5kZXIsIEJ1aWxkZXIpKTsKK30KKworCisvLy8gXGJyaWVmIE1hdGNoZXMgb24gdGhlIHJlY2VpdmVyIG9mIGFuIE9iamVjdGl2ZUMgTWVzc2FnZSBleHByZXNzaW9uLgorLy8vCisvLy8gRXhhbXBsZQorLy8vIG1hdGNoZXIgPSBvYmpDTWVzc2FnZUV4cHIoaGFzUmVjZWl2ZXJUeXBlKGFzU3RyaW5nKCJVSVdlYlZpZXcgKiIpKSk7CisvLy8gbWF0Y2hlcyB0aGUgW3dlYlZpZXcgLi4uXSBtZXNzYWdlIGludm9jYXRpb24uCisvLy8gXGNvZGUKKy8vLyAgIE5TU3RyaW5nICp3ZWJWaWV3SmF2YVNjcmlwdCA9IC4uLgorLy8vICAgVUlXZWJWaWV3ICp3ZWJWaWV3ID0gLi4uCisvLy8gICBbd2ViVmlldyBzdHJpbmdCeUV2YWx1YXRpbmdKYXZhU2NyaXB0RnJvbVN0cmluZzp3ZWJWaWV3SmF2YXNjcmlwdF07CisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSX1AoT2JqQ01lc3NhZ2VFeHByLCBoYXNSZWNlaXZlclR5cGUsIGludGVybmFsOjpNYXRjaGVyPFF1YWxUeXBlPiwKKyAgICAgICAgICAgICAgSW5uZXJNYXRjaGVyKSB7CisgIGNvbnN0IFF1YWxUeXBlIFR5cGVEZWNsID0gTm9kZS5nZXRSZWNlaXZlclR5cGUoKTsKKyAgcmV0dXJuIElubmVyTWF0Y2hlci5tYXRjaGVzKFR5cGVEZWNsLCBGaW5kZXIsIEJ1aWxkZXIpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgd2hlbiBCYXNlTmFtZSA9PSBTZWxlY3Rvci5nZXRBc1N0cmluZygpCisvLy8KKy8vLyAgbWF0Y2hlciA9IG9iakNNZXNzYWdlRXhwcihoYXNTZWxlY3RvcigibG9hZEhUTUxTdHJpbmc6YmFzZVVSTDoiKSk7CisvLy8gIG1hdGNoZXMgdGhlIG91dGVyIG1lc3NhZ2UgZXhwciBpbiB0aGUgY29kZSBiZWxvdywgYnV0IE5PVCB0aGUgbWVzc2FnZQorLy8vICBpbnZvY2F0aW9uIGZvciBzZWxmLmJvZHlWaWV3LgorLy8vIFxjb2RlCisvLy8gICAgIFtzZWxmLmJvZHlWaWV3IGxvYWRIVE1MU3RyaW5nOmh0bWwgYmFzZVVSTDpOVUxMXTsKKy8vLyBcZW5kY29kZQorQVNUX01BVENIRVJfUChPYmpDTWVzc2FnZUV4cHIsIGhhc1NlbGVjdG9yLCBzdGQ6OnN0cmluZywgQmFzZU5hbWUpIHsKKyAgU2VsZWN0b3IgU2VsID0gTm9kZS5nZXRTZWxlY3RvcigpOworICByZXR1cm4gQmFzZU5hbWUuY29tcGFyZShTZWwuZ2V0QXNTdHJpbmcoKSkgPT0gMDsKK30KKworCisvLy8gXGJyaWVmIE1hdGNoZXMgd2hlbiBhdCBsZWFzdCBvbmUgb2YgdGhlIHN1cHBsaWVkIHN0cmluZyBlcXVhbHMgdG8gdGhlCisvLy8gU2VsZWN0b3IuZ2V0QXNTdHJpbmcoKQorLy8vCisvLy8gIG1hdGNoZXIgPSBvYmpDTWVzc2FnZUV4cHIoaGFzU2VsZWN0b3IoIm1ldGhvZEE6IiwgIm1ldGhvZEI6IikpOworLy8vICBtYXRjaGVzIGJvdGggb2YgdGhlIGV4cHJlc3Npb25zIGJlbG93OgorLy8vIFxjb2RlCisvLy8gICAgIFtteU9iaiBtZXRob2RBOmFyZ0FdOworLy8vICAgICBbbXlPYmogbWV0aG9kQjphcmdCXTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0Z1bmN0aW9uPGludGVybmFsOjpNYXRjaGVyPE9iakNNZXNzYWdlRXhwcj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpoYXNBbnlTZWxlY3RvckZ1bmM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQW55U2VsZWN0b3I7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBPYmpDIHNlbGVjdG9ycyB3aG9zZSBuYW1lIGNvbnRhaW5zCisvLy8gYSBzdWJzdHJpbmcgbWF0Y2hlZCBieSB0aGUgZ2l2ZW4gUmVnRXhwLgorLy8vICBtYXRjaGVyID0gb2JqQ01lc3NhZ2VFeHByKG1hdGNoZXNTZWxlY3RvcigibG9hZEhUTUxTdHJpbmdcOmJhc2VVUkw/IikpOworLy8vICBtYXRjaGVzIHRoZSBvdXRlciBtZXNzYWdlIGV4cHIgaW4gdGhlIGNvZGUgYmVsb3csIGJ1dCBOT1QgdGhlIG1lc3NhZ2UKKy8vLyAgaW52b2NhdGlvbiBmb3Igc2VsZi5ib2R5Vmlldy4KKy8vLyBcY29kZQorLy8vICAgICBbc2VsZi5ib2R5VmlldyBsb2FkSFRNTFN0cmluZzpodG1sIGJhc2VVUkw6TlVMTF07CisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSX1AoT2JqQ01lc3NhZ2VFeHByLCBtYXRjaGVzU2VsZWN0b3IsIHN0ZDo6c3RyaW5nLCBSZWdFeHApIHsKKyAgYXNzZXJ0KCFSZWdFeHAuZW1wdHkoKSk7CisgIHN0ZDo6c3RyaW5nIFNlbGVjdG9yU3RyaW5nID0gTm9kZS5nZXRTZWxlY3RvcigpLmdldEFzU3RyaW5nKCk7CisgIGxsdm06OlJlZ2V4IFJFKFJlZ0V4cCk7CisgIHJldHVybiBSRS5tYXRjaChTZWxlY3RvclN0cmluZyk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyB3aGVuIHRoZSBzZWxlY3RvciBpcyB0aGUgZW1wdHkgc2VsZWN0b3IKKy8vLworLy8vIE1hdGNoZXMgb25seSB3aGVuIHRoZSBzZWxlY3RvciBvZiB0aGUgb2JqQ01lc3NhZ2VFeHByIGlzIE5VTEwuIFRoaXMgbWF5CisvLy8gcmVwcmVzZW50IGFuIGVycm9yIGNvbmRpdGlvbiBpbiB0aGUgdHJlZSEKK0FTVF9NQVRDSEVSKE9iakNNZXNzYWdlRXhwciwgaGFzTnVsbFNlbGVjdG9yKSB7CisgIHJldHVybiBOb2RlLmdldFNlbGVjdG9yKCkuaXNOdWxsKCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyB3aGVuIHRoZSBzZWxlY3RvciBpcyBhIFVuYXJ5IFNlbGVjdG9yCisvLy8KKy8vLyAgbWF0Y2hlciA9IG9iakNNZXNzYWdlRXhwcihtYXRjaGVzU2VsZWN0b3IoaGFzVW5hcnlTZWxlY3RvcigpKTsKKy8vLyAgbWF0Y2hlcyBzZWxmLmJvZHlWaWV3IGluIHRoZSBjb2RlIGJlbG93LCBidXQgTk9UIHRoZSBvdXRlciBtZXNzYWdlCisvLy8gIGludm9jYXRpb24gb2YgImxvYWRIVE1MU3RyaW5nOmJhc2VVUkw6Ii4KKy8vLyBcY29kZQorLy8vICAgICBbc2VsZi5ib2R5VmlldyBsb2FkSFRNTFN0cmluZzpodG1sIGJhc2VVUkw6TlVMTF07CisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSKE9iakNNZXNzYWdlRXhwciwgaGFzVW5hcnlTZWxlY3RvcikgeworICByZXR1cm4gTm9kZS5nZXRTZWxlY3RvcigpLmlzVW5hcnlTZWxlY3RvcigpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgd2hlbiB0aGUgc2VsZWN0b3IgaXMgYSBrZXl3b3JkIHNlbGVjdG9yCisvLy8KKy8vLyBvYmpDTWVzc2FnZUV4cHIoaGFzS2V5d29yZFNlbGVjdG9yKCkpIG1hdGNoZXMgdGhlIGdlbmVyYXRlZCBzZXRGcmFtZQorLy8vIG1lc3NhZ2UgZXhwcmVzc2lvbiBpbgorLy8vCisvLy8gXGNvZGUKKy8vLyAgIFVJV2ViVmlldyAqd2ViVmlldyA9IC4uLjsKKy8vLyAgIENHUmVjdCBib2R5RnJhbWUgPSB3ZWJWaWV3LmZyYW1lOworLy8vICAgYm9keUZyYW1lLnNpemUuaGVpZ2h0ID0gc2VsZi5ib2R5Q29udGVudEhlaWdodDsKKy8vLyAgIHdlYlZpZXcuZnJhbWUgPSBib2R5RnJhbWU7CisvLy8gICAvLyAgICAgXi0tLS0gbWF0Y2hlcyBoZXJlCisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSKE9iakNNZXNzYWdlRXhwciwgaGFzS2V5d29yZFNlbGVjdG9yKSB7CisgIHJldHVybiBOb2RlLmdldFNlbGVjdG9yKCkuaXNLZXl3b3JkU2VsZWN0b3IoKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHdoZW4gdGhlIHNlbGVjdG9yIGhhcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBhcmd1bWVudHMKKy8vLworLy8vICBtYXRjaGVyID0gb2JqQ01lc3NhZ2VFeHByKG51bVNlbGVjdG9yQXJncygwKSk7CisvLy8gIG1hdGNoZXMgc2VsZi5ib2R5VmlldyBpbiB0aGUgY29kZSBiZWxvdworLy8vCisvLy8gIG1hdGNoZXIgPSBvYmpDTWVzc2FnZUV4cHIobnVtU2VsZWN0b3JBcmdzKDIpKTsKKy8vLyAgbWF0Y2hlcyB0aGUgaW52b2NhdGlvbiBvZiAibG9hZEhUTUxTdHJpbmc6YmFzZVVSTDoiIGJ1dCBub3QgdGhhdAorLy8vICBvZiBzZWxmLmJvZHlWaWV3CisvLy8gXGNvZGUKKy8vLyAgICAgW3NlbGYuYm9keVZpZXcgbG9hZEhUTUxTdHJpbmc6aHRtbCBiYXNlVVJMOk5VTExdOworLy8vIFxlbmRjb2RlCitBU1RfTUFUQ0hFUl9QKE9iakNNZXNzYWdlRXhwciwgbnVtU2VsZWN0b3JBcmdzLCB1bnNpZ25lZCwgTikgeworICByZXR1cm4gTm9kZS5nZXRTZWxlY3RvcigpLmdldE51bUFyZ3MoKSA9PSBOOworfQorICAgCisvLy8gXGJyaWVmIE1hdGNoZXMgaWYgdGhlIGNhbGwgZXhwcmVzc2lvbidzIGNhbGxlZSBleHByZXNzaW9uIG1hdGNoZXMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBZIHsgdm9pZCB4KCkgeyB0aGlzLT54KCk7IHgoKTsgWSB5OyB5LngoKTsgfSB9OworLy8vICAgdm9pZCBmKCkgeyBmKCk7IH0KKy8vLyBcZW5kY29kZQorLy8vIGNhbGxFeHByKGNhbGxlZShleHByKCkpKQorLy8vICAgbWF0Y2hlcyB0aGlzLT54KCksIHgoKSwgeS54KCksIGYoKQorLy8vIHdpdGggY2FsbGVlKC4uLikKKy8vLyAgIG1hdGNoaW5nIHRoaXMtPngsIHgsIHkueCwgZiByZXNwZWN0aXZlbHkKKy8vLworLy8vIE5vdGU6IENhbGxlZSBjYW5ub3QgdGFrZSB0aGUgbW9yZSBnZW5lcmFsIGludGVybmFsOjpNYXRjaGVyPEV4cHI+CisvLy8gYmVjYXVzZSB0aGlzIGludHJvZHVjZXMgYW1iaWd1b3VzIG92ZXJsb2FkcyB3aXRoIGNhbGxzIHRvIENhbGxlZSB0YWtpbmcgYQorLy8vIGludGVybmFsOjpNYXRjaGVyPERlY2w+LCBhcyB0aGUgbWF0Y2hlciBoaWVyYXJjaHkgaXMgcHVyZWx5CisvLy8gaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgaW1wbGljaXQgY2FzdHMuCitBU1RfTUFUQ0hFUl9QKENhbGxFeHByLCBjYWxsZWUsIGludGVybmFsOjpNYXRjaGVyPFN0bXQ+LAorICAgICAgICAgICAgICBJbm5lck1hdGNoZXIpIHsKKyAgY29uc3QgRXhwciAqRXhwck5vZGUgPSBOb2RlLmdldENhbGxlZSgpOworICByZXR1cm4gKEV4cHJOb2RlICE9IG51bGxwdHIgJiYKKyAgICAgICAgICBJbm5lck1hdGNoZXIubWF0Y2hlcygqRXhwck5vZGUsIEZpbmRlciwgQnVpbGRlcikpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgaWYgdGhlIGNhbGwgZXhwcmVzc2lvbidzIGNhbGxlZSdzIGRlY2xhcmF0aW9uIG1hdGNoZXMgdGhlCisvLy8gZ2l2ZW4gbWF0Y2hlci4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyB5LngoKSAobWF0Y2hlciA9IGNhbGxFeHByKGNhbGxlZSgKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4eE1ldGhvZERlY2woaGFzTmFtZSgieCIpKSkpKQorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBZIHsgcHVibGljOiB2b2lkIHgoKTsgfTsKKy8vLyAgIHZvaWQgeigpIHsgWSB5OyB5LngoKTsgfQorLy8vIFxlbmRjb2RlCitBU1RfTUFUQ0hFUl9QX09WRVJMT0FEKENhbGxFeHByLCBjYWxsZWUsIGludGVybmFsOjpNYXRjaGVyPERlY2w+LCBJbm5lck1hdGNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgIDEpIHsKKyAgcmV0dXJuIGNhbGxFeHByKGhhc0RlY2xhcmF0aW9uKElubmVyTWF0Y2hlcikpLm1hdGNoZXMoTm9kZSwgRmluZGVyLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGlmIHRoZSBleHByZXNzaW9uJ3Mgb3IgZGVjbGFyYXRpb24ncyB0eXBlIG1hdGNoZXMgYSB0eXBlCisvLy8gbWF0Y2hlci4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyB4IChtYXRjaGVyID0gZXhwcihoYXNUeXBlKGN4eFJlY29yZERlY2woaGFzTmFtZSgiWCIpKSkpKQorLy8vICAgICAgICAgICAgIGFuZCB6IChtYXRjaGVyID0gdmFyRGVjbChoYXNUeXBlKGN4eFJlY29yZERlY2woaGFzTmFtZSgiWCIpKSkpKQorLy8vICAgICAgICAgICAgIGFuZCBVIChtYXRjaGVyID0gdHlwZWRlZkRlY2woaGFzVHlwZShhc1N0cmluZygiaW50IikpKQorLy8vIFxjb2RlCisvLy8gIGNsYXNzIFgge307CisvLy8gIHZvaWQgeShYICZ4KSB7IHg7IFggejsgfQorLy8vICB0eXBlZGVmIGludCBVOworLy8vIFxlbmRjb2RlCitBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUl9QX09WRVJMT0FEKAorICAgIGhhc1R5cGUsIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoRXhwciwgVHlwZWRlZk5hbWVEZWNsLCBWYWx1ZURlY2wpLAorICAgIGludGVybmFsOjpNYXRjaGVyPFF1YWxUeXBlPiwgSW5uZXJNYXRjaGVyLCAwKSB7CisgIFF1YWxUeXBlIFFUID0gaW50ZXJuYWw6OmdldFVuZGVybHlpbmdUeXBlKE5vZGUpOworICBpZiAoIVFULmlzTnVsbCgpKQorICAgIHJldHVybiBJbm5lck1hdGNoZXIubWF0Y2hlcyhRVCwgRmluZGVyLCBCdWlsZGVyKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gXGJyaWVmIE92ZXJsb2FkZWQgdG8gbWF0Y2ggdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBleHByZXNzaW9uJ3Mgb3IgdmFsdWUKKy8vLyBkZWNsYXJhdGlvbidzIHR5cGUuCisvLy8KKy8vLyBJbiBjYXNlIG9mIGEgdmFsdWUgZGVjbGFyYXRpb24gKGZvciBleGFtcGxlIGEgdmFyaWFibGUgZGVjbGFyYXRpb24pLAorLy8vIHRoaXMgcmVzb2x2ZXMgb25lIGxheWVyIG9mIGluZGlyZWN0aW9uLiBGb3IgZXhhbXBsZSwgaW4gdGhlIHZhbHVlCisvLy8gZGVjbGFyYXRpb24gIlggeDsiLCBjeHhSZWNvcmREZWNsKGhhc05hbWUoIlgiKSkgbWF0Y2hlcyB0aGUgZGVjbGFyYXRpb24gb2YKKy8vLyBYLCB3aGlsZSB2YXJEZWNsKGhhc1R5cGUoY3h4UmVjb3JkRGVjbChoYXNOYW1lKCJYIikpKSkgbWF0Y2hlcyB0aGUKKy8vLyBkZWNsYXJhdGlvbiBvZiB4LgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIHggKG1hdGNoZXIgPSBleHByKGhhc1R5cGUoY3h4UmVjb3JkRGVjbChoYXNOYW1lKCJYIikpKSkpCisvLy8gICAgICAgICAgICAgYW5kIHogKG1hdGNoZXIgPSB2YXJEZWNsKGhhc1R5cGUoY3h4UmVjb3JkRGVjbChoYXNOYW1lKCJYIikpKSkpCisvLy8gXGNvZGUKKy8vLyAgY2xhc3MgWCB7fTsKKy8vLyAgdm9pZCB5KFggJngpIHsgeDsgWCB6OyB9CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFVzYWJsZSBhczogTWF0Y2hlcjxFeHByPiwgTWF0Y2hlcjxWYWx1ZURlY2w+CitBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUl9QX09WRVJMT0FEKGhhc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZURlY2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxEZWNsPiwgSW5uZXJNYXRjaGVyLCAxKSB7CisgIHJldHVybiBxdWFsVHlwZShoYXNEZWNsYXJhdGlvbihJbm5lck1hdGNoZXIpKQorICAgICAgLm1hdGNoZXMoTm9kZS5nZXRUeXBlKCksIEZpbmRlciwgQnVpbGRlcik7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBpZiB0aGUgdHlwZSBsb2NhdGlvbiBvZiB0aGUgZGVjbGFyYXRvciBkZWNsJ3MgdHlwZSBtYXRjaGVzCisvLy8gdGhlIGlubmVyIG1hdGNoZXIuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBpbnQgeDsKKy8vLyBcZW5kY29kZQorLy8vIGRlY2xhcmF0b3JEZWNsKGhhc1R5cGVMb2MobG9jKGFzU3RyaW5nKCJpbnQiKSkpKQorLy8vICAgbWF0Y2hlcyBpbnQgeAorQVNUX01BVENIRVJfUChEZWNsYXJhdG9yRGVjbCwgaGFzVHlwZUxvYywgaW50ZXJuYWw6Ok1hdGNoZXI8VHlwZUxvYz4sIElubmVyKSB7CisgIGlmICghTm9kZS5nZXRUeXBlU291cmNlSW5mbygpKQorICAgIC8vIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBmb3IgaW1wbGljaXQgZGVzdHJ1Y3RvcnMuCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gSW5uZXIubWF0Y2hlcyhOb2RlLmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSwgRmluZGVyLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGlmIHRoZSBtYXRjaGVkIHR5cGUgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIHN0cmluZy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIFkgeyBwdWJsaWM6IHZvaWQgeCgpOyB9OworLy8vICAgdm9pZCB6KCkgeyBZKiB5OyB5LT54KCk7IH0KKy8vLyBcZW5kY29kZQorLy8vIGN4eE1lbWJlckNhbGxFeHByKG9uKGhhc1R5cGUoYXNTdHJpbmcoImNsYXNzIFkgKiIpKSkpCisvLy8gICBtYXRjaGVzIHktPngoKQorQVNUX01BVENIRVJfUChRdWFsVHlwZSwgYXNTdHJpbmcsIHN0ZDo6c3RyaW5nLCBOYW1lKSB7CisgIHJldHVybiBOYW1lID09IE5vZGUuZ2V0QXNTdHJpbmcoKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGlmIHRoZSBtYXRjaGVkIHR5cGUgaXMgYSBwb2ludGVyIHR5cGUgYW5kIHRoZSBwb2ludGVlIHR5cGUKKy8vLyBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgbWF0Y2hlci4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyB5LT54KCkKKy8vLyAgIChtYXRjaGVyID0gY3h4TWVtYmVyQ2FsbEV4cHIob24oaGFzVHlwZShwb2ludHNUbworLy8vICAgICAgY3h4UmVjb3JkRGVjbChoYXNOYW1lKCJZIikpKSkpKSkKKy8vLyBcY29kZQorLy8vICAgY2xhc3MgWSB7IHB1YmxpYzogdm9pZCB4KCk7IH07CisvLy8gICB2b2lkIHooKSB7IFkgKnk7IHktPngoKTsgfQorLy8vIFxlbmRjb2RlCitBU1RfTUFUQ0hFUl9QKAorICAgIFF1YWxUeXBlLCBwb2ludHNUbywgaW50ZXJuYWw6Ok1hdGNoZXI8UXVhbFR5cGU+LAorICAgIElubmVyTWF0Y2hlcikgeworICByZXR1cm4gKCFOb2RlLmlzTnVsbCgpICYmIE5vZGUtPmlzQW55UG9pbnRlclR5cGUoKSAmJgorICAgICAgICAgIElubmVyTWF0Y2hlci5tYXRjaGVzKE5vZGUtPmdldFBvaW50ZWVUeXBlKCksIEZpbmRlciwgQnVpbGRlcikpOworfQorCisvLy8gXGJyaWVmIE92ZXJsb2FkZWQgdG8gbWF0Y2ggdGhlIHBvaW50ZWUgdHlwZSdzIGRlY2xhcmF0aW9uLgorQVNUX01BVENIRVJfUF9PVkVSTE9BRChRdWFsVHlwZSwgcG9pbnRzVG8sIGludGVybmFsOjpNYXRjaGVyPERlY2w+LAorICAgICAgICAgICAgICAgICAgICAgICBJbm5lck1hdGNoZXIsIDEpIHsKKyAgcmV0dXJuIHBvaW50c1RvKHF1YWxUeXBlKGhhc0RlY2xhcmF0aW9uKElubmVyTWF0Y2hlcikpKQorICAgICAgLm1hdGNoZXMoTm9kZSwgRmluZGVyLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGlmIHRoZSBtYXRjaGVkIHR5cGUgbWF0Y2hlcyB0aGUgdW5xdWFsaWZpZWQgZGVzdWdhcmVkCisvLy8gdHlwZSBvZiB0aGUgbWF0Y2hlZCBub2RlLgorLy8vCisvLy8gRm9yIGV4YW1wbGUsIGluOgorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBBIHt9OworLy8vICAgdXNpbmcgQiA9IEE7CisvLy8gXGVuZGNvZGUKKy8vLyBUaGUgbWF0Y2hlciB0eXBlKGhhc1VucXVhbGlmZWlkRGVzdWdhcmVkVHlwZShyZWNvcmRUeXBlKCkpKSBtYXRjaGVzCisvLy8gYm90aCBCIGFuZCBBLgorQVNUX01BVENIRVJfUChUeXBlLCBoYXNVbnF1YWxpZmllZERlc3VnYXJlZFR5cGUsIGludGVybmFsOjpNYXRjaGVyPFR5cGU+LAorICAgICAgICAgICAgICBJbm5lck1hdGNoZXIpIHsKKyAgcmV0dXJuIElubmVyTWF0Y2hlci5tYXRjaGVzKCpOb2RlLmdldFVucXVhbGlmaWVkRGVzdWdhcmVkVHlwZSgpLCBGaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGlmIHRoZSBtYXRjaGVkIHR5cGUgaXMgYSByZWZlcmVuY2UgdHlwZSBhbmQgdGhlIHJlZmVyZW5jZWQKKy8vLyB0eXBlIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBtYXRjaGVyLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIFggJnggYW5kIGNvbnN0IFggJnkKKy8vLyAgICAgKG1hdGNoZXIgPSB2YXJEZWNsKGhhc1R5cGUocmVmZXJlbmNlcyhjeHhSZWNvcmREZWNsKGhhc05hbWUoIlgiKSkpKSkpCisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIFggeworLy8vICAgICB2b2lkIGEoWCBiKSB7CisvLy8gICAgICAgWCAmeCA9IGI7CisvLy8gICAgICAgY29uc3QgWCAmeSA9IGI7CisvLy8gICAgIH0KKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSX1AoUXVhbFR5cGUsIHJlZmVyZW5jZXMsIGludGVybmFsOjpNYXRjaGVyPFF1YWxUeXBlPiwKKyAgICAgICAgICAgICAgSW5uZXJNYXRjaGVyKSB7CisgIHJldHVybiAoIU5vZGUuaXNOdWxsKCkgJiYgTm9kZS0+aXNSZWZlcmVuY2VUeXBlKCkgJiYKKyAgICAgICAgICBJbm5lck1hdGNoZXIubWF0Y2hlcyhOb2RlLT5nZXRQb2ludGVlVHlwZSgpLCBGaW5kZXIsIEJ1aWxkZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIFF1YWxUeXBlcyB3aG9zZSBjYW5vbmljYWwgdHlwZSBtYXRjaGVzIElubmVyTWF0Y2hlci4KKy8vLworLy8vIEdpdmVuOgorLy8vIFxjb2RlCisvLy8gICB0eXBlZGVmIGludCAmaW50X3JlZjsKKy8vLyAgIGludCBhOworLy8vICAgaW50X3JlZiBiID0gYTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gXGMgdmFyRGVjbChoYXNUeXBlKHF1YWxUeXBlKHJlZmVyZW5jZVR5cGUoKSkpKSkpIHdpbGwgbm90IG1hdGNoIHRoZQorLy8vIGRlY2xhcmF0aW9uIG9mIGIgYnV0IFxjCisvLy8gdmFyRGVjbChoYXNUeXBlKHF1YWxUeXBlKGhhc0Nhbm9uaWNhbFR5cGUocmVmZXJlbmNlVHlwZSgpKSkpKSkpIGRvZXMuCitBU1RfTUFUQ0hFUl9QKFF1YWxUeXBlLCBoYXNDYW5vbmljYWxUeXBlLCBpbnRlcm5hbDo6TWF0Y2hlcjxRdWFsVHlwZT4sCisgICAgICAgICAgICAgIElubmVyTWF0Y2hlcikgeworICBpZiAoTm9kZS5pc051bGwoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBJbm5lck1hdGNoZXIubWF0Y2hlcyhOb2RlLmdldENhbm9uaWNhbFR5cGUoKSwgRmluZGVyLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBPdmVybG9hZGVkIHRvIG1hdGNoIHRoZSByZWZlcmVuY2VkIHR5cGUncyBkZWNsYXJhdGlvbi4KK0FTVF9NQVRDSEVSX1BfT1ZFUkxPQUQoUXVhbFR5cGUsIHJlZmVyZW5jZXMsIGludGVybmFsOjpNYXRjaGVyPERlY2w+LAorICAgICAgICAgICAgICAgICAgICAgICBJbm5lck1hdGNoZXIsIDEpIHsKKyAgcmV0dXJuIHJlZmVyZW5jZXMocXVhbFR5cGUoaGFzRGVjbGFyYXRpb24oSW5uZXJNYXRjaGVyKSkpCisgICAgICAubWF0Y2hlcyhOb2RlLCBGaW5kZXIsIEJ1aWxkZXIpOworfQorCitBU1RfTUFUQ0hFUl9QKENYWE1lbWJlckNhbGxFeHByLCBvbkltcGxpY2l0T2JqZWN0QXJndW1lbnQsCisgICAgICAgICAgICAgIGludGVybmFsOjpNYXRjaGVyPEV4cHI+LCBJbm5lck1hdGNoZXIpIHsKKyAgY29uc3QgRXhwciAqRXhwck5vZGUgPSBOb2RlLmdldEltcGxpY2l0T2JqZWN0QXJndW1lbnQoKTsKKyAgcmV0dXJuIChFeHByTm9kZSAhPSBudWxscHRyICYmCisgICAgICAgICAgSW5uZXJNYXRjaGVyLm1hdGNoZXMoKkV4cHJOb2RlLCBGaW5kZXIsIEJ1aWxkZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGlmIHRoZSBleHByZXNzaW9uJ3MgdHlwZSBlaXRoZXIgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkCisvLy8gbWF0Y2hlciwgb3IgaXMgYSBwb2ludGVyIHRvIGEgdHlwZSB0aGF0IG1hdGNoZXMgdGhlIElubmVyTWF0Y2hlci4KK0FTVF9NQVRDSEVSX1BfT1ZFUkxPQUQoQ1hYTWVtYmVyQ2FsbEV4cHIsIHRoaXNQb2ludGVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8UXVhbFR5cGU+LCBJbm5lck1hdGNoZXIsIDApIHsKKyAgcmV0dXJuIG9uSW1wbGljaXRPYmplY3RBcmd1bWVudCgKKyAgICAgIGFueU9mKGhhc1R5cGUoSW5uZXJNYXRjaGVyKSwgaGFzVHlwZShwb2ludHNUbyhJbm5lck1hdGNoZXIpKSkpCisgICAgICAubWF0Y2hlcyhOb2RlLCBGaW5kZXIsIEJ1aWxkZXIpOworfQorCisvLy8gXGJyaWVmIE92ZXJsb2FkZWQgdG8gbWF0Y2ggdGhlIHR5cGUncyBkZWNsYXJhdGlvbi4KK0FTVF9NQVRDSEVSX1BfT1ZFUkxPQUQoQ1hYTWVtYmVyQ2FsbEV4cHIsIHRoaXNQb2ludGVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8RGVjbD4sIElubmVyTWF0Y2hlciwgMSkgeworICByZXR1cm4gb25JbXBsaWNpdE9iamVjdEFyZ3VtZW50KAorICAgICAgYW55T2YoaGFzVHlwZShJbm5lck1hdGNoZXIpLCBoYXNUeXBlKHBvaW50c1RvKElubmVyTWF0Y2hlcikpKSkKKyAgICAgIC5tYXRjaGVzKE5vZGUsIEZpbmRlciwgQnVpbGRlcik7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIERlY2xSZWZFeHByIHRoYXQgcmVmZXJzIHRvIGEgZGVjbGFyYXRpb24gdGhhdCBtYXRjaGVzIHRoZQorLy8vIHNwZWNpZmllZCBtYXRjaGVyLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIHggaW4gaWYoeCkKKy8vLyAgICAgKG1hdGNoZXIgPSBkZWNsUmVmRXhwcih0byh2YXJEZWNsKGhhc05hbWUoIngiKSkpKSkKKy8vLyBcY29kZQorLy8vICAgYm9vbCB4OworLy8vICAgaWYgKHgpIHt9CisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSX1AoRGVjbFJlZkV4cHIsIHRvLCBpbnRlcm5hbDo6TWF0Y2hlcjxEZWNsPiwKKyAgICAgICAgICAgICAgSW5uZXJNYXRjaGVyKSB7CisgIGNvbnN0IERlY2wgKkRlY2xOb2RlID0gTm9kZS5nZXREZWNsKCk7CisgIHJldHVybiAoRGVjbE5vZGUgIT0gbnVsbHB0ciAmJgorICAgICAgICAgIElubmVyTWF0Y2hlci5tYXRjaGVzKCpEZWNsTm9kZSwgRmluZGVyLCBCdWlsZGVyKSk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIFxjIERlY2xSZWZFeHByIHRoYXQgcmVmZXJzIHRvIGEgZGVjbGFyYXRpb24gdGhyb3VnaCBhCisvLy8gc3BlY2lmaWMgdXNpbmcgc2hhZG93IGRlY2xhcmF0aW9uLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgbmFtZXNwYWNlIGEgeyB2b2lkIGYoKSB7fSB9CisvLy8gICB1c2luZyBhOjpmOworLy8vICAgdm9pZCBnKCkgeworLy8vICAgICBmKCk7ICAgICAvLyBNYXRjaGVzIHRoaXMgLi4KKy8vLyAgICAgYTo6ZigpOyAgLy8gLi4gYnV0IG5vdCB0aGlzLgorLy8vICAgfQorLy8vIFxlbmRjb2RlCisvLy8gZGVjbFJlZkV4cHIodGhyb3VnaFVzaW5nRGVjbChhbnl0aGluZygpKSkKKy8vLyAgIG1hdGNoZXMgXGMgZigpCitBU1RfTUFUQ0hFUl9QKERlY2xSZWZFeHByLCB0aHJvdWdoVXNpbmdEZWNsLAorICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxVc2luZ1NoYWRvd0RlY2w+LCBJbm5lck1hdGNoZXIpIHsKKyAgY29uc3QgTmFtZWREZWNsICpGb3VuZERlY2wgPSBOb2RlLmdldEZvdW5kRGVjbCgpOworICBpZiAoY29uc3QgVXNpbmdTaGFkb3dEZWNsICpVc2luZ0RlY2wgPSBkeW5fY2FzdDxVc2luZ1NoYWRvd0RlY2w+KEZvdW5kRGVjbCkpCisgICAgcmV0dXJuIElubmVyTWF0Y2hlci5tYXRjaGVzKCpVc2luZ0RlY2wsIEZpbmRlciwgQnVpbGRlcik7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGFuIFxjIE92ZXJsb2FkRXhwciBpZiBhbnkgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgc2V0IG9mCisvLy8gb3ZlcmxvYWRzIG1hdGNoZXMgdGhlIGdpdmVuIG1hdGNoZXIuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBmb28oVCk7CisvLy8gICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBiYXIoVCk7CisvLy8gICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBiYXooVCB0KSB7CisvLy8gICAgIGZvbyh0KTsKKy8vLyAgICAgYmFyKHQpOworLy8vICAgfQorLy8vIFxlbmRjb2RlCisvLy8gdW5yZXNvbHZlZExvb2t1cEV4cHIoaGFzQW55RGVjbGFyYXRpb24oCisvLy8gICAgIGZ1bmN0aW9uVGVtcGxhdGVEZWNsKGhhc05hbWUoImZvbyIpKSkpCisvLy8gICBtYXRjaGVzIFxjIGZvbyBpbiBcYyBmb28odCk7IGJ1dCBub3QgXGMgYmFyIGluIFxjIGJhcih0KTsKK0FTVF9NQVRDSEVSX1AoT3ZlcmxvYWRFeHByLCBoYXNBbnlEZWNsYXJhdGlvbiwgaW50ZXJuYWw6Ok1hdGNoZXI8RGVjbD4sCisgICAgICAgICAgICAgIElubmVyTWF0Y2hlcikgeworICByZXR1cm4gbWF0Y2hlc0ZpcnN0SW5Qb2ludGVyUmFuZ2UoSW5uZXJNYXRjaGVyLCBOb2RlLmRlY2xzX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLmRlY2xzX2VuZCgpLCBGaW5kZXIsIEJ1aWxkZXIpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgdGhlIERlY2wgb2YgYSBEZWNsU3RtdCB3aGljaCBoYXMgYSBzaW5nbGUgZGVjbGFyYXRpb24uCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBpbnQgYSwgYjsKKy8vLyAgIGludCBjOworLy8vIFxlbmRjb2RlCisvLy8gZGVjbFN0bXQoaGFzU2luZ2xlRGVjbChhbnl0aGluZygpKSkKKy8vLyAgIG1hdGNoZXMgJ2ludCBjOycgYnV0IG5vdCAnaW50IGEsIGI7Jy4KK0FTVF9NQVRDSEVSX1AoRGVjbFN0bXQsIGhhc1NpbmdsZURlY2wsIGludGVybmFsOjpNYXRjaGVyPERlY2w+LCBJbm5lck1hdGNoZXIpIHsKKyAgaWYgKE5vZGUuaXNTaW5nbGVEZWNsKCkpIHsKKyAgICBjb25zdCBEZWNsICpGb3VuZERlY2wgPSBOb2RlLmdldFNpbmdsZURlY2woKTsKKyAgICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoKkZvdW5kRGVjbCwgRmluZGVyLCBCdWlsZGVyKTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHRoYXQgaGFzIGFuIGluaXRpYWxpemVyIGV4cHJlc3Npb24KKy8vLyB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIG1hdGNoZXIuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgeCAobWF0Y2hlciA9IHZhckRlY2woaGFzSW5pdGlhbGl6ZXIoY2FsbEV4cHIoKSkpKQorLy8vIFxjb2RlCisvLy8gICBib29sIHkoKSB7IHJldHVybiB0cnVlOyB9CisvLy8gICBib29sIHggPSB5KCk7CisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSX1AoCisgICAgVmFyRGVjbCwgaGFzSW5pdGlhbGl6ZXIsIGludGVybmFsOjpNYXRjaGVyPEV4cHI+LAorICAgIElubmVyTWF0Y2hlcikgeworICBjb25zdCBFeHByICpJbml0aWFsaXplciA9IE5vZGUuZ2V0QW55SW5pdGlhbGl6ZXIoKTsKKyAgcmV0dXJuIChJbml0aWFsaXplciAhPSBudWxscHRyICYmCisgICAgICAgICAgSW5uZXJNYXRjaGVyLm1hdGNoZXMoKkluaXRpYWxpemVyLCBGaW5kZXIsIEJ1aWxkZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGEgdmFyaWFibGUgZGVjbGFyYXRpb24gdGhhdCBoYXMgZnVuY3Rpb24gc2NvcGUgYW5kIGlzIGEKKy8vLyBub24tc3RhdGljIGxvY2FsIHZhcmlhYmxlLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIHggKG1hdGNoZXIgPSB2YXJEZWNsKGhhc0xvY2FsU3RvcmFnZSgpKQorLy8vIFxjb2RlCisvLy8gdm9pZCBmKCkgeworLy8vICAgaW50IHg7CisvLy8gICBzdGF0aWMgaW50IHk7CisvLy8gfQorLy8vIGludCB6OworLy8vIFxlbmRjb2RlCitBU1RfTUFUQ0hFUihWYXJEZWNsLCBoYXNMb2NhbFN0b3JhZ2UpIHsKKyAgcmV0dXJuIE5vZGUuaGFzTG9jYWxTdG9yYWdlKCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHRoYXQgZG9lcyBub3QgaGF2ZSBsb2NhbCBzdG9yYWdlLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIHkgYW5kIHogKG1hdGNoZXIgPSB2YXJEZWNsKGhhc0dsb2JhbFN0b3JhZ2UoKSkKKy8vLyBcY29kZQorLy8vIHZvaWQgZigpIHsKKy8vLyAgIGludCB4OworLy8vICAgc3RhdGljIGludCB5OworLy8vIH0KKy8vLyBpbnQgejsKKy8vLyBcZW5kY29kZQorQVNUX01BVENIRVIoVmFyRGVjbCwgaGFzR2xvYmFsU3RvcmFnZSkgeworICByZXR1cm4gTm9kZS5oYXNHbG9iYWxTdG9yYWdlKCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHRoYXQgaGFzIGF1dG9tYXRpYyBzdG9yYWdlIGR1cmF0aW9uLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIHgsIGJ1dCBub3QgeSwgeiwgb3IgYS4KKy8vLyAobWF0Y2hlciA9IHZhckRlY2woaGFzQXV0b21hdGljU3RvcmFnZUR1cmF0aW9uKCkpCisvLy8gXGNvZGUKKy8vLyB2b2lkIGYoKSB7CisvLy8gICBpbnQgeDsKKy8vLyAgIHN0YXRpYyBpbnQgeTsKKy8vLyAgIHRocmVhZF9sb2NhbCBpbnQgejsKKy8vLyB9CisvLy8gaW50IGE7CisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSKFZhckRlY2wsIGhhc0F1dG9tYXRpY1N0b3JhZ2VEdXJhdGlvbikgeworICByZXR1cm4gTm9kZS5nZXRTdG9yYWdlRHVyYXRpb24oKSA9PSBTRF9BdXRvbWF0aWM7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHRoYXQgaGFzIHN0YXRpYyBzdG9yYWdlIGR1cmF0aW9uLgorLy8vIEl0IGluY2x1ZGVzIHRoZSB2YXJpYWJsZSBkZWNsYXJlZCBhdCBuYW1lc3BhY2Ugc2NvcGUgYW5kIHRob3NlIGRlY2xhcmVkCisvLy8gd2l0aCAic3RhdGljIiBhbmQgImV4dGVybiIgc3RvcmFnZSBjbGFzcyBzcGVjaWZpZXJzLgorLy8vCisvLy8gXGNvZGUKKy8vLyB2b2lkIGYoKSB7CisvLy8gICBpbnQgeDsKKy8vLyAgIHN0YXRpYyBpbnQgeTsKKy8vLyAgIHRocmVhZF9sb2NhbCBpbnQgejsKKy8vLyB9CisvLy8gaW50IGE7CisvLy8gc3RhdGljIGludCBiOworLy8vIGV4dGVybiBpbnQgYzsKKy8vLyB2YXJEZWNsKGhhc1N0YXRpY1N0b3JhZ2VEdXJhdGlvbigpKQorLy8vICAgbWF0Y2hlcyB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24geSwgYSwgYiBhbmQgYy4KKy8vLyBcZW5kY29kZQorQVNUX01BVENIRVIoVmFyRGVjbCwgaGFzU3RhdGljU3RvcmFnZUR1cmF0aW9uKSB7CisgIHJldHVybiBOb2RlLmdldFN0b3JhZ2VEdXJhdGlvbigpID09IFNEX1N0YXRpYzsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGEgdmFyaWFibGUgZGVjbGFyYXRpb24gdGhhdCBoYXMgdGhyZWFkIHN0b3JhZ2UgZHVyYXRpb24uCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgeiwgYnV0IG5vdCB4LCB6LCBvciBhLgorLy8vIChtYXRjaGVyID0gdmFyRGVjbChoYXNUaHJlYWRTdG9yYWdlRHVyYXRpb24oKSkKKy8vLyBcY29kZQorLy8vIHZvaWQgZigpIHsKKy8vLyAgIGludCB4OworLy8vICAgc3RhdGljIGludCB5OworLy8vICAgdGhyZWFkX2xvY2FsIGludCB6OworLy8vIH0KKy8vLyBpbnQgYTsKKy8vLyBcZW5kY29kZQorQVNUX01BVENIRVIoVmFyRGVjbCwgaGFzVGhyZWFkU3RvcmFnZUR1cmF0aW9uKSB7CisgIHJldHVybiBOb2RlLmdldFN0b3JhZ2VEdXJhdGlvbigpID09IFNEX1RocmVhZDsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGEgdmFyaWFibGUgZGVjbGFyYXRpb24gdGhhdCBpcyBhbiBleGNlcHRpb24gdmFyaWFibGUgZnJvbQorLy8vIGEgQysrIGNhdGNoIGJsb2NrLCBvciBhbiBPYmplY3RpdmUtQyBcQGNhdGNoIHN0YXRlbWVudC4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyB4IChtYXRjaGVyID0gdmFyRGVjbChpc0V4Y2VwdGlvblZhcmlhYmxlKCkpCisvLy8gXGNvZGUKKy8vLyB2b2lkIGYoaW50IHkpIHsKKy8vLyAgIHRyeSB7CisvLy8gICB9IGNhdGNoIChpbnQgeCkgeworLy8vICAgfQorLy8vIH0KKy8vLyBcZW5kY29kZQorQVNUX01BVENIRVIoVmFyRGVjbCwgaXNFeGNlcHRpb25WYXJpYWJsZSkgeworICByZXR1cm4gTm9kZS5pc0V4Y2VwdGlvblZhcmlhYmxlKCk7Cit9CisKKy8vLyBcYnJpZWYgQ2hlY2tzIHRoYXQgYSBjYWxsIGV4cHJlc3Npb24gb3IgYSBjb25zdHJ1Y3RvciBjYWxsIGV4cHJlc3Npb24gaGFzCisvLy8gYSBzcGVjaWZpYyBudW1iZXIgb2YgYXJndW1lbnRzIChpbmNsdWRpbmcgYWJzZW50IGRlZmF1bHQgYXJndW1lbnRzKS4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBmKDAsIDApIChtYXRjaGVyID0gY2FsbEV4cHIoYXJndW1lbnRDb3VudElzKDIpKSkKKy8vLyBcY29kZQorLy8vICAgdm9pZCBmKGludCB4LCBpbnQgeSk7CisvLy8gICBmKDAsIDApOworLy8vIFxlbmRjb2RlCitBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUl9QKGFyZ3VtZW50Q291bnRJcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhDYWxsRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhDb25zdHJ1Y3RFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXNzYWdlRXhwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkLCBOKSB7CisgIHJldHVybiBOb2RlLmdldE51bUFyZ3MoKSA9PSBOOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgdGhlIG4ndGggYXJndW1lbnQgb2YgYSBjYWxsIGV4cHJlc3Npb24gb3IgYSBjb25zdHJ1Y3RvcgorLy8vIGNhbGwgZXhwcmVzc2lvbi4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyB5IGluIHgoeSkKKy8vLyAgICAgKG1hdGNoZXIgPSBjYWxsRXhwcihoYXNBcmd1bWVudCgwLCBkZWNsUmVmRXhwcigpKSkpCisvLy8gXGNvZGUKKy8vLyAgIHZvaWQgeChpbnQpIHsgaW50IHk7IHgoeSk7IH0KKy8vLyBcZW5kY29kZQorQVNUX1BPTFlNT1JQSElDX01BVENIRVJfUDIoaGFzQXJndW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RfUE9MWU1PUlBISUNfU1VQUE9SVEVEX1RZUEVTKENhbGxFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhDb25zdHJ1Y3RFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDTWVzc2FnZUV4cHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQsIE4sIGludGVybmFsOjpNYXRjaGVyPEV4cHI+LCBJbm5lck1hdGNoZXIpIHsKKyAgcmV0dXJuIChOIDwgTm9kZS5nZXROdW1BcmdzKCkgJiYKKyAgICAgICAgICBJbm5lck1hdGNoZXIubWF0Y2hlcygKKyAgICAgICAgICAgICAgKk5vZGUuZ2V0QXJnKE4pLT5JZ25vcmVQYXJlbkltcENhc3RzKCksIEZpbmRlciwgQnVpbGRlcikpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgZGVjbGFyYXRpb24gc3RhdGVtZW50cyB0aGF0IGNvbnRhaW4gYSBzcGVjaWZpYyBudW1iZXIgb2YKKy8vLyBkZWNsYXJhdGlvbnMuCisvLy8KKy8vLyBFeGFtcGxlOiBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBpbnQgYSwgYjsKKy8vLyAgIGludCBjOworLy8vICAgaW50IGQgPSAyLCBlOworLy8vIFxlbmRjb2RlCisvLy8gZGVjbENvdW50SXMoMikKKy8vLyAgIG1hdGNoZXMgJ2ludCBhLCBiOycgYW5kICdpbnQgZCA9IDIsIGU7JywgYnV0IG5vdCAnaW50IGM7Jy4KK0FTVF9NQVRDSEVSX1AoRGVjbFN0bXQsIGRlY2xDb3VudElzLCB1bnNpZ25lZCwgTikgeworICByZXR1cm4gc3RkOjpkaXN0YW5jZShOb2RlLmRlY2xfYmVnaW4oKSwgTm9kZS5kZWNsX2VuZCgpKSA9PSAocHRyZGlmZl90KU47Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyB0aGUgbid0aCBkZWNsYXJhdGlvbiBvZiBhIGRlY2xhcmF0aW9uIHN0YXRlbWVudC4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IHdvcmsgZm9yIGdsb2JhbCBkZWNsYXJhdGlvbnMgYmVjYXVzZSB0aGUgQVNUCisvLy8gYnJlYWtzIHVwIG11bHRpcGxlLWRlY2xhcmF0aW9uIERlY2xTdG10J3MgaW50byBtdWx0aXBsZSBzaW5nbGUtZGVjbGFyYXRpb24KKy8vLyBEZWNsU3RtdCdzLgorLy8vIEV4YW1wbGU6IEdpdmVuIG5vbi1nbG9iYWwgZGVjbGFyYXRpb25zCisvLy8gXGNvZGUKKy8vLyAgIGludCBhLCBiID0gMDsKKy8vLyAgIGludCBjOworLy8vICAgaW50IGQgPSAyLCBlOworLy8vIFxlbmRjb2RlCisvLy8gZGVjbFN0bXQoY29udGFpbnNEZWNsYXJhdGlvbigKKy8vLyAgICAgICAwLCB2YXJEZWNsKGhhc0luaXRpYWxpemVyKGFueXRoaW5nKCkpKSkpCisvLy8gICBtYXRjaGVzIG9ubHkgJ2ludCBkID0gMiwgZTsnLCBhbmQKKy8vLyBkZWNsU3RtdChjb250YWluc0RlY2xhcmF0aW9uKDEsIHZhckRlY2woKSkpCisvLy8gXGNvZGUKKy8vLyAgIG1hdGNoZXMgJ2ludCBhLCBiID0gMCcgYXMgd2VsbCBhcyAnaW50IGQgPSAyLCBlOycKKy8vLyAgIGJ1dCAnaW50IGM7JyBpcyBub3QgbWF0Y2hlZC4KKy8vLyBcZW5kY29kZQorQVNUX01BVENIRVJfUDIoRGVjbFN0bXQsIGNvbnRhaW5zRGVjbGFyYXRpb24sIHVuc2lnbmVkLCBOLAorICAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8RGVjbD4sIElubmVyTWF0Y2hlcikgeworICBjb25zdCB1bnNpZ25lZCBOdW1EZWNscyA9IHN0ZDo6ZGlzdGFuY2UoTm9kZS5kZWNsX2JlZ2luKCksIE5vZGUuZGVjbF9lbmQoKSk7CisgIGlmIChOID49IE51bURlY2xzKQorICAgIHJldHVybiBmYWxzZTsKKyAgRGVjbFN0bXQ6OmNvbnN0X2RlY2xfaXRlcmF0b3IgSXRlcmF0b3IgPSBOb2RlLmRlY2xfYmVnaW4oKTsKKyAgc3RkOjphZHZhbmNlKEl0ZXJhdG9yLCBOKTsKKyAgcmV0dXJuIElubmVyTWF0Y2hlci5tYXRjaGVzKCoqSXRlcmF0b3IsIEZpbmRlciwgQnVpbGRlcik7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIEMrKyBjYXRjaCBzdGF0ZW1lbnQgdGhhdCBoYXMgYSBjYXRjaC1hbGwgaGFuZGxlci4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHRyeSB7CisvLy8gICAgIC8vIC4uLgorLy8vICAgfSBjYXRjaCAoaW50KSB7CisvLy8gICAgIC8vIC4uLgorLy8vICAgfSBjYXRjaCAoLi4uKSB7CisvLy8gICAgIC8vIC4uLgorLy8vICAgfQorLy8vIC9lbmRjb2RlCisvLy8gY3h4Q2F0Y2hTdG10KGlzQ2F0Y2hBbGwoKSkgbWF0Y2hlcyBjYXRjaCguLi4pIGJ1dCBub3QgY2F0Y2goaW50KS4KK0FTVF9NQVRDSEVSKENYWENhdGNoU3RtdCwgaXNDYXRjaEFsbCkgeworICByZXR1cm4gTm9kZS5nZXRFeGNlcHRpb25EZWNsKCkgPT0gbnVsbHB0cjsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGEgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXIuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBzdHJ1Y3QgRm9vIHsKKy8vLyAgICAgRm9vKCkgOiBmb29fKDEpIHsgfQorLy8vICAgICBpbnQgZm9vXzsKKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKKy8vLyBjeHhSZWNvcmREZWNsKGhhcyhjeHhDb25zdHJ1Y3RvckRlY2woCisvLy8gICBoYXNBbnlDb25zdHJ1Y3RvckluaXRpYWxpemVyKGFueXRoaW5nKCkpCisvLy8gKSkpCisvLy8gICByZWNvcmQgbWF0Y2hlcyBGb28sIGhhc0FueUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXIgbWF0Y2hlcyBmb29fKDEpCitBU1RfTUFUQ0hFUl9QKENYWENvbnN0cnVjdG9yRGVjbCwgaGFzQW55Q29uc3RydWN0b3JJbml0aWFsaXplciwKKyAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8Q1hYQ3RvckluaXRpYWxpemVyPiwgSW5uZXJNYXRjaGVyKSB7CisgIHJldHVybiBtYXRjaGVzRmlyc3RJblBvaW50ZXJSYW5nZShJbm5lck1hdGNoZXIsIE5vZGUuaW5pdF9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS5pbml0X2VuZCgpLCBGaW5kZXIsIEJ1aWxkZXIpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgdGhlIGZpZWxkIGRlY2xhcmF0aW9uIG9mIGEgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXIuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBzdHJ1Y3QgRm9vIHsKKy8vLyAgICAgRm9vKCkgOiBmb29fKDEpIHsgfQorLy8vICAgICBpbnQgZm9vXzsKKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKKy8vLyBjeHhSZWNvcmREZWNsKGhhcyhjeHhDb25zdHJ1Y3RvckRlY2woaGFzQW55Q29uc3RydWN0b3JJbml0aWFsaXplcigKKy8vLyAgICAgZm9yRmllbGQoaGFzTmFtZSgiZm9vXyIpKSkpKSkKKy8vLyAgIG1hdGNoZXMgRm9vCisvLy8gd2l0aCBmb3JGaWVsZCBtYXRjaGluZyBmb29fCitBU1RfTUFUQ0hFUl9QKENYWEN0b3JJbml0aWFsaXplciwgZm9yRmllbGQsCisgICAgICAgICAgICAgIGludGVybmFsOjpNYXRjaGVyPEZpZWxkRGVjbD4sIElubmVyTWF0Y2hlcikgeworICBjb25zdCBGaWVsZERlY2wgKk5vZGVBc0RlY2wgPSBOb2RlLmdldEFueU1lbWJlcigpOworICByZXR1cm4gKE5vZGVBc0RlY2wgIT0gbnVsbHB0ciAmJgorICAgICAgSW5uZXJNYXRjaGVyLm1hdGNoZXMoKk5vZGVBc0RlY2wsIEZpbmRlciwgQnVpbGRlcikpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgdGhlIGluaXRpYWxpemVyIGV4cHJlc3Npb24gb2YgYSBjb25zdHJ1Y3RvciBpbml0aWFsaXplci4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHN0cnVjdCBGb28geworLy8vICAgICBGb28oKSA6IGZvb18oMSkgeyB9CisvLy8gICAgIGludCBmb29fOworLy8vICAgfTsKKy8vLyBcZW5kY29kZQorLy8vIGN4eFJlY29yZERlY2woaGFzKGN4eENvbnN0cnVjdG9yRGVjbChoYXNBbnlDb25zdHJ1Y3RvckluaXRpYWxpemVyKAorLy8vICAgICB3aXRoSW5pdGlhbGl6ZXIoaW50ZWdlckxpdGVyYWwoZXF1YWxzKDEpKSkpKSkpCisvLy8gICBtYXRjaGVzIEZvbworLy8vIHdpdGggd2l0aEluaXRpYWxpemVyIG1hdGNoaW5nICgxKQorQVNUX01BVENIRVJfUChDWFhDdG9ySW5pdGlhbGl6ZXIsIHdpdGhJbml0aWFsaXplciwKKyAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8RXhwcj4sIElubmVyTWF0Y2hlcikgeworICBjb25zdCBFeHByKiBOb2RlQXNFeHByID0gTm9kZS5nZXRJbml0KCk7CisgIHJldHVybiAoTm9kZUFzRXhwciAhPSBudWxscHRyICYmCisgICAgICBJbm5lck1hdGNoZXIubWF0Y2hlcygqTm9kZUFzRXhwciwgRmluZGVyLCBCdWlsZGVyKSk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIGNvbnN0cnVjdG9yIGluaXRpYWxpemVyIGlmIGl0IGlzIGV4cGxpY2l0bHkgd3JpdHRlbiBpbgorLy8vIGNvZGUgKGFzIG9wcG9zZWQgdG8gaW1wbGljaXRseSBhZGRlZCBieSB0aGUgY29tcGlsZXIpLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgc3RydWN0IEZvbyB7CisvLy8gICAgIEZvbygpIHsgfQorLy8vICAgICBGb28oaW50KSA6IGZvb18oIkEiKSB7IH0KKy8vLyAgICAgc3RyaW5nIGZvb187CisvLy8gICB9OworLy8vIFxlbmRjb2RlCisvLy8gY3h4Q29uc3RydWN0b3JEZWNsKGhhc0FueUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXIoaXNXcml0dGVuKCkpKQorLy8vICAgd2lsbCBtYXRjaCBGb28oaW50KSwgYnV0IG5vdCBGb28oKQorQVNUX01BVENIRVIoQ1hYQ3RvckluaXRpYWxpemVyLCBpc1dyaXR0ZW4pIHsKKyAgcmV0dXJuIE5vZGUuaXNXcml0dGVuKCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIGNvbnN0cnVjdG9yIGluaXRpYWxpemVyIGlmIGl0IGlzIGluaXRpYWxpemluZyBhIGJhc2UsIGFzCisvLy8gb3Bwb3NlZCB0byBhIG1lbWJlci4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHN0cnVjdCBCIHt9OworLy8vICAgc3RydWN0IEQgOiBCIHsKKy8vLyAgICAgaW50IEk7CisvLy8gICAgIEQoaW50IGkpIDogSShpKSB7fQorLy8vICAgfTsKKy8vLyAgIHN0cnVjdCBFIDogQiB7CisvLy8gICAgIEUoKSA6IEIoKSB7fQorLy8vICAgfTsKKy8vLyBcZW5kY29kZQorLy8vIGN4eENvbnN0cnVjdG9yRGVjbChoYXNBbnlDb25zdHJ1Y3RvckluaXRpYWxpemVyKGlzQmFzZUluaXRpYWxpemVyKCkpKQorLy8vICAgd2lsbCBtYXRjaCBFKCksIGJ1dCBub3QgbWF0Y2ggRChpbnQpLgorQVNUX01BVENIRVIoQ1hYQ3RvckluaXRpYWxpemVyLCBpc0Jhc2VJbml0aWFsaXplcikgeworICByZXR1cm4gTm9kZS5pc0Jhc2VJbml0aWFsaXplcigpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgYSBjb25zdHJ1Y3RvciBpbml0aWFsaXplciBpZiBpdCBpcyBpbml0aWFsaXppbmcgYSBtZW1iZXIsIGFzCisvLy8gb3Bwb3NlZCB0byBhIGJhc2UuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBzdHJ1Y3QgQiB7fTsKKy8vLyAgIHN0cnVjdCBEIDogQiB7CisvLy8gICAgIGludCBJOworLy8vICAgICBEKGludCBpKSA6IEkoaSkge30KKy8vLyAgIH07CisvLy8gICBzdHJ1Y3QgRSA6IEIgeworLy8vICAgICBFKCkgOiBCKCkge30KKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKKy8vLyBjeHhDb25zdHJ1Y3RvckRlY2woaGFzQW55Q29uc3RydWN0b3JJbml0aWFsaXplcihpc01lbWJlckluaXRpYWxpemVyKCkpKQorLy8vICAgd2lsbCBtYXRjaCBEKGludCksIGJ1dCBub3QgbWF0Y2ggRSgpLgorQVNUX01BVENIRVIoQ1hYQ3RvckluaXRpYWxpemVyLCBpc01lbWJlckluaXRpYWxpemVyKSB7CisgIHJldHVybiBOb2RlLmlzTWVtYmVySW5pdGlhbGl6ZXIoKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGFueSBhcmd1bWVudCBvZiBhIGNhbGwgZXhwcmVzc2lvbiBvciBhIGNvbnN0cnVjdG9yIGNhbGwKKy8vLyBleHByZXNzaW9uLCBvciBhbiBPYmpDLW1lc3NhZ2Utc2VuZCBleHByZXNzaW9uLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdm9pZCB4KGludCwgaW50LCBpbnQpIHsgaW50IHk7IHgoMSwgeSwgNDIpOyB9CisvLy8gXGVuZGNvZGUKKy8vLyBjYWxsRXhwcihoYXNBbnlBcmd1bWVudChkZWNsUmVmRXhwcigpKSkKKy8vLyAgIG1hdGNoZXMgeCgxLCB5LCA0MikKKy8vLyB3aXRoIGhhc0FueUFyZ3VtZW50KC4uLikKKy8vLyAgIG1hdGNoaW5nIHkKKy8vLworLy8vIEZvciBPYmplY3RpdmVDLCBnaXZlbgorLy8vIFxjb2RlCisvLy8gICBAaW50ZXJmYWNlIEkgLSAodm9pZCkgZjooaW50KSB5OyBAZW5kCisvLy8gICB2b2lkIGZvbyhJICppKSB7IFtpIGY6MTJdOyB9CisvLy8gXGVuZGNvZGUKKy8vLyBvYmpjTWVzc2FnZUV4cHIoaGFzQW55QXJndW1lbnQoaW50ZWdlckxpdGVyYWwoZXF1YWxzKDEyKSkpKQorLy8vICAgbWF0Y2hlcyBbaSBmOjEyXQorQVNUX1BPTFlNT1JQSElDX01BVENIRVJfUChoYXNBbnlBcmd1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhDYWxsRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhDb25zdHJ1Y3RFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXNzYWdlRXhwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpNYXRjaGVyPEV4cHI+LCBJbm5lck1hdGNoZXIpIHsKKyAgZm9yIChjb25zdCBFeHByICpBcmcgOiBOb2RlLmFyZ3VtZW50cygpKSB7CisgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyIFJlc3VsdCgqQnVpbGRlcik7CisgICAgaWYgKElubmVyTWF0Y2hlci5tYXRjaGVzKCpBcmcsIEZpbmRlciwgJlJlc3VsdCkpIHsKKyAgICAgICpCdWlsZGVyID0gc3RkOjptb3ZlKFJlc3VsdCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgYSBjb25zdHJ1Y3RvciBjYWxsIGV4cHJlc3Npb24gd2hpY2ggdXNlcyBsaXN0IGluaXRpYWxpemF0aW9uLgorQVNUX01BVENIRVIoQ1hYQ29uc3RydWN0RXhwciwgaXNMaXN0SW5pdGlhbGl6YXRpb24pIHsKKyAgcmV0dXJuIE5vZGUuaXNMaXN0SW5pdGlhbGl6YXRpb24oKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGEgY29uc3RydWN0b3IgY2FsbCBleHByZXNzaW9uIHdoaWNoIHJlcXVpcmVzCisvLy8gemVybyBpbml0aWFsaXphdGlvbi4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyB2b2lkIGZvbygpIHsKKy8vLyAgIHN0cnVjdCBwb2ludCB7IGRvdWJsZSB4OyBkb3VibGUgeTsgfTsKKy8vLyAgIHBvaW50IHB0WzJdID0geyB7IDEuMCwgMi4wIH0gfTsKKy8vLyB9CisvLy8gXGVuZGNvZGUKKy8vLyBpbml0TGlzdEV4cHIoaGFzKGN4eENvbnN0cnVjdEV4cHIocmVxdWlyZXNaZXJvSW5pdGlhbGl6YXRpb24oKSkpCisvLy8gd2lsbCBtYXRjaCB0aGUgaW1wbGljaXQgYXJyYXkgZmlsbGVyIGZvciBwdFsxXS4KK0FTVF9NQVRDSEVSKENYWENvbnN0cnVjdEV4cHIsIHJlcXVpcmVzWmVyb0luaXRpYWxpemF0aW9uKSB7CisgIHJldHVybiBOb2RlLnJlcXVpcmVzWmVyb0luaXRpYWxpemF0aW9uKCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyB0aGUgbid0aCBwYXJhbWV0ZXIgb2YgYSBmdW5jdGlvbiBvciBhbiBPYmpDIG1ldGhvZAorLy8vIGRlY2xhcmF0aW9uLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgY2xhc3MgWCB7IHZvaWQgZihpbnQgeCkge30gfTsKKy8vLyBcZW5kY29kZQorLy8vIGN4eE1ldGhvZERlY2woaGFzUGFyYW1ldGVyKDAsIGhhc1R5cGUodmFyRGVjbCgpKSkpCisvLy8gICBtYXRjaGVzIGYoaW50IHgpIHt9CisvLy8gd2l0aCBoYXNQYXJhbWV0ZXIoLi4uKQorLy8vICAgbWF0Y2hpbmcgaW50IHgKKy8vLworLy8vIEZvciBPYmplY3RpdmVDLCBnaXZlbgorLy8vIFxjb2RlCisvLy8gICBAaW50ZXJmYWNlIEkgLSAodm9pZCkgZjooaW50KSB5OyBAZW5kCisvLy8gXGVuZGNvZGUKKy8vCisvLy8gdGhlIG1hdGNoZXIgb2JqY01ldGhvZERlY2woaGFzUGFyYW1ldGVyKDAsIGhhc05hbWUoInkiKSkpCisvLy8gbWF0Y2hlcyB0aGUgZGVjbGFyYXRpb24gb2YgbWV0aG9kIGYgd2l0aCBoYXNQYXJhbWV0ZXIKKy8vLyBtYXRjaGluZyB5LgorQVNUX1BPTFlNT1JQSElDX01BVENIRVJfUDIoaGFzUGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhGdW5jdGlvbkRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkLCBOLCBpbnRlcm5hbDo6TWF0Y2hlcjxQYXJtVmFyRGVjbD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbm5lck1hdGNoZXIpIHsKKyAgcmV0dXJuIChOIDwgTm9kZS5wYXJhbWV0ZXJzKCkuc2l6ZSgpCisgICAgICAgICAgJiYgSW5uZXJNYXRjaGVyLm1hdGNoZXMoKk5vZGUucGFyYW1ldGVycygpW05dLCBGaW5kZXIsIEJ1aWxkZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGFsbCBhcmd1bWVudHMgYW5kIHRoZWlyIHJlc3BlY3RpdmUgUGFybVZhckRlY2wuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB2b2lkIGYoaW50IGkpOworLy8vICAgaW50IHk7CisvLy8gICBmKHkpOworLy8vIFxlbmRjb2RlCisvLy8gY2FsbEV4cHIoCisvLy8gICBmb3JFYWNoQXJndW1lbnRXaXRoUGFyYW0oCisvLy8gICAgIGRlY2xSZWZFeHByKHRvKHZhckRlY2woaGFzTmFtZSgieSIpKSkpLAorLy8vICAgICBwYXJtVmFyRGVjbChoYXNUeXBlKGlzSW50ZWdlcigpKSkKKy8vLyApKQorLy8vICAgbWF0Y2hlcyBmKHkpOworLy8vIHdpdGggZGVjbFJlZkV4cHIoLi4uKQorLy8vICAgbWF0Y2hpbmcgaW50IHkKKy8vLyBhbmQgcGFybVZhckRlY2woLi4uKQorLy8vICAgbWF0Y2hpbmcgaW50IGkKK0FTVF9QT0xZTU9SUEhJQ19NQVRDSEVSX1AyKGZvckVhY2hBcmd1bWVudFdpdGhQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoQ2FsbEV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWENvbnN0cnVjdEV4cHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8RXhwcj4sIEFyZ01hdGNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxQYXJtVmFyRGVjbD4sIFBhcmFtTWF0Y2hlcikgeworICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgUmVzdWx0OworICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgb2YgYW4gb3ZlcmxvYWRlZCBtZW1iZXIgb3BlcmF0b3IgaXMgdGhlIGltcGxpY2l0IG9iamVjdAorICAvLyBhcmd1bWVudCBvZiB0aGUgbWV0aG9kIHdoaWNoIHNob3VsZCBub3QgYmUgbWF0Y2hlZCBhZ2FpbnN0IGEgcGFyYW1ldGVyLCBzbworICAvLyB3ZSBza2lwIG92ZXIgaXQgaGVyZS4KKyAgQm91bmROb2Rlc1RyZWVCdWlsZGVyIE1hdGNoZXM7CisgIHVuc2lnbmVkIEFyZ0luZGV4ID0gY3h4T3BlcmF0b3JDYWxsRXhwcihjYWxsZWUoY3h4TWV0aG9kRGVjbCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXRjaGVzKE5vZGUsIEZpbmRlciwgJk1hdGNoZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gMQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgIGludCBQYXJhbUluZGV4ID0gMDsKKyAgYm9vbCBNYXRjaGVkID0gZmFsc2U7CisgIGZvciAoOyBBcmdJbmRleCA8IE5vZGUuZ2V0TnVtQXJncygpOyArK0FyZ0luZGV4KSB7CisgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyIEFyZ01hdGNoZXMoKkJ1aWxkZXIpOworICAgIGlmIChBcmdNYXRjaGVyLm1hdGNoZXMoKihOb2RlLmdldEFyZyhBcmdJbmRleCktPklnbm9yZVBhcmVuQ2FzdHMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5kZXIsICZBcmdNYXRjaGVzKSkgeworICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyIFBhcmFtTWF0Y2hlcyhBcmdNYXRjaGVzKTsKKyAgICAgIGlmIChleHByKGFueU9mKGN4eENvbnN0cnVjdEV4cHIoaGFzRGVjbGFyYXRpb24oY3h4Q29uc3RydWN0b3JEZWNsKAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1BhcmFtZXRlcihQYXJhbUluZGV4LCBQYXJhbU1hdGNoZXIpKSkpLAorICAgICAgICAgICAgICAgICAgICAgY2FsbEV4cHIoY2FsbGVlKGZ1bmN0aW9uRGVjbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQYXJhbWV0ZXIoUGFyYW1JbmRleCwgUGFyYW1NYXRjaGVyKSkpKSkpCisgICAgICAgICAgICAgIC5tYXRjaGVzKE5vZGUsIEZpbmRlciwgJlBhcmFtTWF0Y2hlcykpIHsKKyAgICAgICAgUmVzdWx0LmFkZE1hdGNoKFBhcmFtTWF0Y2hlcyk7CisgICAgICAgIE1hdGNoZWQgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgICArK1BhcmFtSW5kZXg7CisgIH0KKyAgKkJ1aWxkZXIgPSBzdGQ6Om1vdmUoUmVzdWx0KTsKKyAgcmV0dXJuIE1hdGNoZWQ7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhbnkgcGFyYW1ldGVyIG9mIGEgZnVuY3Rpb24gb3IgT2JqQyBtZXRob2QgZGVjbGFyYXRpb24uCisvLy8KKy8vLyBEb2VzIG5vdCBtYXRjaCB0aGUgJ3RoaXMnIHBhcmFtZXRlciBvZiBhIG1ldGhvZC4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIFggeyB2b2lkIGYoaW50IHgsIGludCB5LCBpbnQgeikge30gfTsKKy8vLyBcZW5kY29kZQorLy8vIGN4eE1ldGhvZERlY2woaGFzQW55UGFyYW1ldGVyKGhhc05hbWUoInkiKSkpCisvLy8gICBtYXRjaGVzIGYoaW50IHgsIGludCB5LCBpbnQgeikge30KKy8vLyB3aXRoIGhhc0FueVBhcmFtZXRlciguLi4pCisvLy8gICBtYXRjaGluZyBpbnQgeQorLy8vCisvLy8gRm9yIE9iamVjdGl2ZUMsIGdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIEBpbnRlcmZhY2UgSSAtICh2b2lkKSBmOihpbnQpIHk7IEBlbmQKKy8vLyBcZW5kY29kZQorLy8KKy8vLyB0aGUgbWF0Y2hlciBvYmpjTWV0aG9kRGVjbChoYXNBbnlQYXJhbWV0ZXIoaGFzTmFtZSgieSIpKSkKKy8vLyBtYXRjaGVzIHRoZSBkZWNsYXJhdGlvbiBvZiBtZXRob2QgZiB3aXRoIGhhc1BhcmFtZXRlcgorLy8vIG1hdGNoaW5nIHkuCitBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUl9QKGhhc0FueVBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhGdW5jdGlvbkRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ01ldGhvZERlY2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxQYXJtVmFyRGVjbD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIElubmVyTWF0Y2hlcikgeworICByZXR1cm4gbWF0Y2hlc0ZpcnN0SW5Qb2ludGVyUmFuZ2UoSW5uZXJNYXRjaGVyLCBOb2RlLnBhcmFtX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLnBhcmFtX2VuZCgpLCBGaW5kZXIsIEJ1aWxkZXIpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgXGMgRnVuY3Rpb25EZWNscyBhbmQgXGMgRnVuY3Rpb25Qcm90b1R5cGVzIHRoYXQgaGF2ZSBhCisvLy8gc3BlY2lmaWMgcGFyYW1ldGVyIGNvdW50LgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdm9pZCBmKGludCBpKSB7fQorLy8vICAgdm9pZCBnKGludCBpLCBpbnQgaikge30KKy8vLyAgIHZvaWQgaChpbnQgaSwgaW50IGopOworLy8vICAgdm9pZCBqKGludCBpKTsKKy8vLyAgIHZvaWQgayhpbnQgeCwgaW50IHksIGludCB6LCAuLi4pOworLy8vIFxlbmRjb2RlCisvLy8gZnVuY3Rpb25EZWNsKHBhcmFtZXRlckNvdW50SXMoMikpCisvLy8gICBtYXRjaGVzIFxjIGcgYW5kIFxjIGgKKy8vLyBmdW5jdGlvblByb3RvVHlwZShwYXJhbWV0ZXJDb3VudElzKDIpKQorLy8vICAgbWF0Y2hlcyBcYyBnIGFuZCBcYyBoCisvLy8gZnVuY3Rpb25Qcm90b1R5cGUocGFyYW1ldGVyQ291bnRJcygzKSkKKy8vLyAgIG1hdGNoZXMgXGMgaworQVNUX1BPTFlNT1JQSElDX01BVENIRVJfUChwYXJhbWV0ZXJDb3VudElzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RfUE9MWU1PUlBISUNfU1VQUE9SVEVEX1RZUEVTKEZ1bmN0aW9uRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblByb3RvVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkLCBOKSB7CisgIHJldHVybiBOb2RlLmdldE51bVBhcmFtcygpID09IE47Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBcYyBGdW5jdGlvbkRlY2xzIHRoYXQgaGF2ZSBhIG5vcmV0dXJuIGF0dHJpYnV0ZS4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHZvaWQgbm9wZSgpOworLy8vICAgW1tub3JldHVybl1dIHZvaWQgYSgpOworLy8vICAgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKSB2b2lkIGIoKTsKKy8vLyAgIHN0cnVjdCBjIHsgW1tub3JldHVybl1dIGMoKTsgfTsKKy8vLyBcZW5kY29kZQorLy8vIGZ1bmN0aW9uRGVjbChpc05vUmV0dXJuKCkpCisvLy8gICBtYXRjaGVzIGFsbCBvZiB0aG9zZSBleGNlcHQKKy8vLyBcY29kZQorLy8vICAgdm9pZCBub3BlKCk7CisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSKEZ1bmN0aW9uRGVjbCwgaXNOb1JldHVybikgeyByZXR1cm4gTm9kZS5pc05vUmV0dXJuKCk7IH0KKworLy8vIFxicmllZiBNYXRjaGVzIHRoZSByZXR1cm4gdHlwZSBvZiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgorLy8vCisvLy8gR2l2ZW46CisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIFggeyBpbnQgZigpIHsgcmV0dXJuIDE7IH0gfTsKKy8vLyBcZW5kY29kZQorLy8vIGN4eE1ldGhvZERlY2wocmV0dXJucyhhc1N0cmluZygiaW50IikpKQorLy8vICAgbWF0Y2hlcyBpbnQgZigpIHsgcmV0dXJuIDE7IH0KK0FTVF9NQVRDSEVSX1AoRnVuY3Rpb25EZWNsLCByZXR1cm5zLAorICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxRdWFsVHlwZT4sIElubmVyTWF0Y2hlcikgeworICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoTm9kZS5nZXRSZXR1cm5UeXBlKCksIEZpbmRlciwgQnVpbGRlcik7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBleHRlcm4gIkMiIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4KKy8vLworLy8vIEdpdmVuOgorLy8vIFxjb2RlCisvLy8gICBleHRlcm4gIkMiIHZvaWQgZigpIHt9CisvLy8gICBleHRlcm4gIkMiIHsgdm9pZCBnKCkge30gfQorLy8vICAgdm9pZCBoKCkge30KKy8vLyAgIGV4dGVybiAiQyIgaW50IHggPSAxOworLy8vICAgZXh0ZXJuICJDIiBpbnQgeSA9IDI7CisvLy8gICBpbnQgeiA9IDM7CisvLy8gXGVuZGNvZGUKKy8vLyBmdW5jdGlvbkRlY2woaXNFeHRlcm5DKCkpCisvLy8gICBtYXRjaGVzIHRoZSBkZWNsYXJhdGlvbiBvZiBmIGFuZCBnLCBidXQgbm90IHRoZSBkZWNsYXJhdGlvbiBvZiBoLgorLy8vIHZhckRlY2woaXNFeHRlcm5DKCkpCisvLy8gICBtYXRjaGVzIHRoZSBkZWNsYXJhdGlvbiBvZiB4IGFuZCB5LCBidXQgbm90IHRoZSBkZWNsYXJhdGlvbiBvZiB6LgorQVNUX1BPTFlNT1JQSElDX01BVENIRVIoaXNFeHRlcm5DLCBBU1RfUE9MWU1PUlBISUNfU1VQUE9SVEVEX1RZUEVTKEZ1bmN0aW9uRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJEZWNsKSkgeworICByZXR1cm4gTm9kZS5pc0V4dGVybkMoKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHZhcmlhYmxlL2Z1bmN0aW9uIGRlY2xhcmF0aW9ucyB0aGF0IGhhdmUgInN0YXRpYyIgc3RvcmFnZQorLy8vIGNsYXNzIHNwZWNpZmllciAoInN0YXRpYyIga2V5d29yZCkgd3JpdHRlbiBpbiB0aGUgc291cmNlLgorLy8vCisvLy8gR2l2ZW46CisvLy8gXGNvZGUKKy8vLyAgIHN0YXRpYyB2b2lkIGYoKSB7fQorLy8vICAgc3RhdGljIGludCBpID0gMDsKKy8vLyAgIGV4dGVybiBpbnQgajsKKy8vLyAgIGludCBrOworLy8vIFxlbmRjb2RlCisvLy8gZnVuY3Rpb25EZWNsKGlzU3RhdGljU3RvcmFnZUNsYXNzKCkpCisvLy8gICBtYXRjaGVzIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBmLgorLy8vIHZhckRlY2woaXNTdGF0aWNTdG9yYWdlQ2xhc3MoKSkKKy8vLyAgIG1hdGNoZXMgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGkuCitBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUihpc1N0YXRpY1N0b3JhZ2VDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoRnVuY3Rpb25EZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJEZWNsKSkgeworICByZXR1cm4gTm9kZS5nZXRTdG9yYWdlQ2xhc3MoKSA9PSBTQ19TdGF0aWM7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBkZWxldGVkIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KKy8vLworLy8vIEdpdmVuOgorLy8vIFxjb2RlCisvLy8gICB2b2lkIEZ1bmMoKTsKKy8vLyAgIHZvaWQgRGVsZXRlZEZ1bmMoKSA9IGRlbGV0ZTsKKy8vLyBcZW5kY29kZQorLy8vIGZ1bmN0aW9uRGVjbChpc0RlbGV0ZWQoKSkKKy8vLyAgIG1hdGNoZXMgdGhlIGRlY2xhcmF0aW9uIG9mIERlbGV0ZWRGdW5jLCBidXQgbm90IEZ1bmMuCitBU1RfTUFUQ0hFUihGdW5jdGlvbkRlY2wsIGlzRGVsZXRlZCkgeworICByZXR1cm4gTm9kZS5pc0RlbGV0ZWQoKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGRlZmF1bHRlZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCisvLy8KKy8vLyBHaXZlbjoKKy8vLyBcY29kZQorLy8vICAgY2xhc3MgQSB7IH5BKCk7IH07CisvLy8gICBjbGFzcyBCIHsgfkIoKSA9IGRlZmF1bHQ7IH07CisvLy8gXGVuZGNvZGUKKy8vLyBmdW5jdGlvbkRlY2woaXNEZWZhdWx0ZWQoKSkKKy8vLyAgIG1hdGNoZXMgdGhlIGRlY2xhcmF0aW9uIG9mIH5CLCBidXQgbm90IH5BLgorQVNUX01BVENIRVIoRnVuY3Rpb25EZWNsLCBpc0RlZmF1bHRlZCkgeworICByZXR1cm4gTm9kZS5pc0RlZmF1bHRlZCgpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgZnVuY3Rpb25zIHRoYXQgaGF2ZSBhIGR5bmFtaWMgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uCisvLy8KKy8vLyBHaXZlbjoKKy8vLyBcY29kZQorLy8vICAgdm9pZCBmKCk7CisvLy8gICB2b2lkIGcoKSBub2V4Y2VwdDsKKy8vLyAgIHZvaWQgaCgpIG5vZXhjZXB0KHRydWUpOworLy8vICAgdm9pZCBpKCkgbm9leGNlcHQoZmFsc2UpOworLy8vICAgdm9pZCBqKCkgdGhyb3coKTsKKy8vLyAgIHZvaWQgaygpIHRocm93KGludCk7CisvLy8gICB2b2lkIGwoKSB0aHJvdyguLi4pOworLy8vIFxlbmRjb2RlCisvLy8gZnVuY3Rpb25EZWNsKGhhc0R5bmFtaWNFeGNlcHRpb25TcGVjKCkpIGFuZAorLy8vICAgZnVuY3Rpb25Qcm90b1R5cGUoaGFzRHluYW1pY0V4Y2VwdGlvblNwZWMoKSkKKy8vLyAgIG1hdGNoIHRoZSBkZWNsYXJhdGlvbnMgb2YgaiwgaywgYW5kIGwsIGJ1dCBub3QgZiwgZywgaCwgb3IgaS4KK0FTVF9QT0xZTU9SUEhJQ19NQVRDSEVSKGhhc0R5bmFtaWNFeGNlcHRpb25TcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhGdW5jdGlvbkRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uUHJvdG9UeXBlKSkgeworICBpZiAoY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZuVHkgPSBpbnRlcm5hbDo6Z2V0RnVuY3Rpb25Qcm90b1R5cGUoTm9kZSkpCisgICAgcmV0dXJuIEZuVHktPmhhc0R5bmFtaWNFeGNlcHRpb25TcGVjKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYSBub24tdGhyb3dpbmcgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uCisvLy8KKy8vLyBHaXZlbjoKKy8vLyBcY29kZQorLy8vICAgdm9pZCBmKCk7CisvLy8gICB2b2lkIGcoKSBub2V4Y2VwdDsKKy8vLyAgIHZvaWQgaCgpIHRocm93KCk7CisvLy8gICB2b2lkIGkoKSB0aHJvdyhpbnQpOworLy8vICAgdm9pZCBqKCkgbm9leGNlcHQoZmFsc2UpOworLy8vIFxlbmRjb2RlCisvLy8gZnVuY3Rpb25EZWNsKGlzTm9UaHJvdygpKSBhbmQgZnVuY3Rpb25Qcm90b1R5cGUoaXNOb1Rocm93KCkpCisvLy8gICBtYXRjaCB0aGUgZGVjbGFyYXRpb25zIG9mIGcsIGFuZCBoLCBidXQgbm90IGYsIGkgb3Igai4KK0FTVF9QT0xZTU9SUEhJQ19NQVRDSEVSKGlzTm9UaHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoRnVuY3Rpb25EZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblByb3RvVHlwZSkpIHsKKyAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZuVHkgPSBpbnRlcm5hbDo6Z2V0RnVuY3Rpb25Qcm90b1R5cGUoTm9kZSk7CisKKyAgLy8gSWYgdGhlIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYSBwcm90b3R5cGUsIHRoZW4gaXQgaXMgYXNzdW1lZCB0byBiZSBhCisgIC8vIHRocm93aW5nIGZ1bmN0aW9uIChhcyBpdCB3b3VsZCBpZiB0aGUgZnVuY3Rpb24gZGlkIG5vdCBoYXZlIGFueSBleGNlcHRpb24KKyAgLy8gc3BlY2lmaWNhdGlvbikuCisgIGlmICghRm5UeSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQXNzdW1lIHRoZSBiZXN0IGZvciBhbnkgdW5yZXNvbHZlZCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4KKyAgaWYgKGlzVW5yZXNvbHZlZEV4Y2VwdGlvblNwZWMoRm5UeS0+Z2V0RXhjZXB0aW9uU3BlY1R5cGUoKSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIEZuVHktPmlzTm90aHJvdyhGaW5kZXItPmdldEFTVENvbnRleHQoKSk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBjb25zdGV4cHIgdmFyaWFibGUgYW5kIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KKy8vLworLy8vIEdpdmVuOgorLy8vIFxjb2RlCisvLy8gICBjb25zdGV4cHIgaW50IGZvbyA9IDQyOworLy8vICAgY29uc3RleHByIGludCBiYXIoKTsKKy8vLyBcZW5kY29kZQorLy8vIHZhckRlY2woaXNDb25zdGV4cHIoKSkKKy8vLyAgIG1hdGNoZXMgdGhlIGRlY2xhcmF0aW9uIG9mIGZvby4KKy8vLyBmdW5jdGlvbkRlY2woaXNDb25zdGV4cHIoKSkKKy8vLyAgIG1hdGNoZXMgdGhlIGRlY2xhcmF0aW9uIG9mIGJhci4KK0FTVF9QT0xZTU9SUEhJQ19NQVRDSEVSKGlzQ29uc3RleHByLAorICAgICAgICAgICAgICAgICAgICAgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhWYXJEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkRlY2wpKSB7CisgIHJldHVybiBOb2RlLmlzQ29uc3RleHByKCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24gb2YgYW4gaWYgc3RhdGVtZW50LCBmb3IgbG9vcCwKKy8vLyBzd2l0Y2ggc3RhdGVtZW50IG9yIGNvbmRpdGlvbmFsIG9wZXJhdG9yLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIHRydWUgKG1hdGNoZXIgPSBoYXNDb25kaXRpb24oY3h4Qm9vbExpdGVyYWwoZXF1YWxzKHRydWUpKSkpCisvLy8gXGNvZGUKKy8vLyAgIGlmICh0cnVlKSB7fQorLy8vIFxlbmRjb2RlCitBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUl9QKAorICAgIGhhc0NvbmRpdGlvbiwKKyAgICBBU1RfUE9MWU1PUlBISUNfU1VQUE9SVEVEX1RZUEVTKElmU3RtdCwgRm9yU3RtdCwgV2hpbGVTdG10LCBEb1N0bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hTdG10LCBBYnN0cmFjdENvbmRpdGlvbmFsT3BlcmF0b3IpLAorICAgIGludGVybmFsOjpNYXRjaGVyPEV4cHI+LCBJbm5lck1hdGNoZXIpIHsKKyAgY29uc3QgRXhwciAqY29uc3QgQ29uZGl0aW9uID0gTm9kZS5nZXRDb25kKCk7CisgIHJldHVybiAoQ29uZGl0aW9uICE9IG51bGxwdHIgJiYKKyAgICAgICAgICBJbm5lck1hdGNoZXIubWF0Y2hlcygqQ29uZGl0aW9uLCBGaW5kZXIsIEJ1aWxkZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHRoZSB0aGVuLXN0YXRlbWVudCBvZiBhbiBpZiBzdGF0ZW1lbnQuCisvLy8KKy8vLyBFeGFtcGxlcyBtYXRjaGVzIHRoZSBpZiBzdGF0ZW1lbnQKKy8vLyAgIChtYXRjaGVyID0gaWZTdG10KGhhc1RoZW4oY3h4Qm9vbExpdGVyYWwoZXF1YWxzKHRydWUpKSkpKQorLy8vIFxjb2RlCisvLy8gICBpZiAoZmFsc2UpIHRydWU7IGVsc2UgZmFsc2U7CisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSX1AoSWZTdG10LCBoYXNUaGVuLCBpbnRlcm5hbDo6TWF0Y2hlcjxTdG10PiwgSW5uZXJNYXRjaGVyKSB7CisgIGNvbnN0IFN0bXQgKmNvbnN0IFRoZW4gPSBOb2RlLmdldFRoZW4oKTsKKyAgcmV0dXJuIChUaGVuICE9IG51bGxwdHIgJiYgSW5uZXJNYXRjaGVyLm1hdGNoZXMoKlRoZW4sIEZpbmRlciwgQnVpbGRlcikpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgdGhlIGVsc2Utc3RhdGVtZW50IG9mIGFuIGlmIHN0YXRlbWVudC4KKy8vLworLy8vIEV4YW1wbGVzIG1hdGNoZXMgdGhlIGlmIHN0YXRlbWVudAorLy8vICAgKG1hdGNoZXIgPSBpZlN0bXQoaGFzRWxzZShjeHhCb29sTGl0ZXJhbChlcXVhbHModHJ1ZSkpKSkpCisvLy8gXGNvZGUKKy8vLyAgIGlmIChmYWxzZSkgZmFsc2U7IGVsc2UgdHJ1ZTsKKy8vLyBcZW5kY29kZQorQVNUX01BVENIRVJfUChJZlN0bXQsIGhhc0Vsc2UsIGludGVybmFsOjpNYXRjaGVyPFN0bXQ+LCBJbm5lck1hdGNoZXIpIHsKKyAgY29uc3QgU3RtdCAqY29uc3QgRWxzZSA9IE5vZGUuZ2V0RWxzZSgpOworICByZXR1cm4gKEVsc2UgIT0gbnVsbHB0ciAmJiBJbm5lck1hdGNoZXIubWF0Y2hlcygqRWxzZSwgRmluZGVyLCBCdWlsZGVyKSk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBpZiBhIG5vZGUgZXF1YWxzIGEgcHJldmlvdXNseSBib3VuZCBub2RlLgorLy8vCisvLy8gTWF0Y2hlcyBhIG5vZGUgaWYgaXQgZXF1YWxzIHRoZSBub2RlIHByZXZpb3VzbHkgYm91bmQgdG8gXHAgSUQuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBYIHsgaW50IGE7IGludCBiOyB9OworLy8vIFxlbmRjb2RlCisvLy8gY3h4UmVjb3JkRGVjbCgKKy8vLyAgICAgaGFzKGZpZWxkRGVjbChoYXNOYW1lKCJhIiksIGhhc1R5cGUodHlwZSgpLmJpbmQoInQiKSkpKSwKKy8vLyAgICAgaGFzKGZpZWxkRGVjbChoYXNOYW1lKCJiIiksIGhhc1R5cGUodHlwZShlcXVhbHNCb3VuZE5vZGUoInQiKSkpKSkpCisvLy8gICBtYXRjaGVzIHRoZSBjbGFzcyBcYyBYLCBhcyBcYyBhIGFuZCBcYyBiIGhhdmUgdGhlIHNhbWUgdHlwZS4KKy8vLworLy8vIE5vdGUgdGhhdCB3aGVuIG11bHRpcGxlIG1hdGNoZXMgYXJlIGludm9sdmVkIHZpYSBcYyBmb3JFYWNoKiBtYXRjaGVycywKKy8vLyBcYyBlcXVhbHNCb3VuZE5vZGVzIGFjdHMgYXMgYSBmaWx0ZXIuCisvLy8gRm9yIGV4YW1wbGU6CisvLy8gY29tcG91bmRTdG10KAorLy8vICAgICBmb3JFYWNoRGVzY2VuZGFudCh2YXJEZWNsKCkuYmluZCgiZCIpKSwKKy8vLyAgICAgZm9yRWFjaERlc2NlbmRhbnQoZGVjbFJlZkV4cHIodG8oZGVjbChlcXVhbHNCb3VuZE5vZGUoImQiKSkpKSkpCisvLy8gd2lsbCB0cmlnZ2VyIGEgbWF0Y2ggZm9yIGVhY2ggY29tYmluYXRpb24gb2YgdmFyaWFibGUgZGVjbGFyYXRpb24KKy8vLyBhbmQgcmVmZXJlbmNlIHRvIHRoYXQgdmFyaWFibGUgZGVjbGFyYXRpb24gd2l0aGluIGEgY29tcG91bmQgc3RhdGVtZW50LgorQVNUX1BPTFlNT1JQSElDX01BVENIRVJfUChlcXVhbHNCb3VuZE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoU3RtdCwgRGVjbCwgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nLCBJRCkgeworICAvLyBGSVhNRTogRmlndXJlIG91dCB3aGV0aGVyIGl0IG1ha2VzIHNlbnNlIHRvIGFsbG93IHRoaXMKKyAgLy8gb24gYW55IG90aGVyIG5vZGUgdHlwZXMuCisgIC8vIEZvciAqTG9jIGl0IHByb2JhYmx5IGRvZXMgbm90IG1ha2Ugc2Vuc2UsIGFzIHRob3NlIHNlZW0KKyAgLy8gdW5pcXVlLiBGb3IgTmVzdGVkTmFtZVNlcGNpZmllciBpdCBtaWdodCBtYWtlIHNlbnNlLCBhcworICAvLyB0aG9zZSBhbHNvIGhhdmUgcG9pbnRlciBpZGVudGl0eSwgYnV0IEknbSBub3Qgc3VyZSB3aGV0aGVyCisgIC8vIHRoZXkncmUgZXZlciByZXVzZWQuCisgIGludGVybmFsOjpOb3RFcXVhbHNCb3VuZE5vZGVQcmVkaWNhdGUgUHJlZGljYXRlOworICBQcmVkaWNhdGUuSUQgPSBJRDsKKyAgUHJlZGljYXRlLk5vZGUgPSBhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZTo6Y3JlYXRlKE5vZGUpOworICByZXR1cm4gQnVpbGRlci0+cmVtb3ZlQmluZGluZ3MoUHJlZGljYXRlKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHRoZSBjb25kaXRpb24gdmFyaWFibGUgc3RhdGVtZW50IGluIGFuIGlmIHN0YXRlbWVudC4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGlmIChBKiBhID0gR2V0QVBvaW50ZXIoKSkge30KKy8vLyBcZW5kY29kZQorLy8vIGhhc0NvbmRpdGlvblZhcmlhYmxlU3RhdGVtZW50KC4uLikKKy8vLyAgIG1hdGNoZXMgJ0EqIGEgPSBHZXRBUG9pbnRlcigpJy4KK0FTVF9NQVRDSEVSX1AoSWZTdG10LCBoYXNDb25kaXRpb25WYXJpYWJsZVN0YXRlbWVudCwKKyAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8RGVjbFN0bXQ+LCBJbm5lck1hdGNoZXIpIHsKKyAgY29uc3QgRGVjbFN0bXQqIGNvbnN0IERlY2xhcmF0aW9uU3RhdGVtZW50ID0KKyAgICBOb2RlLmdldENvbmRpdGlvblZhcmlhYmxlRGVjbFN0bXQoKTsKKyAgcmV0dXJuIERlY2xhcmF0aW9uU3RhdGVtZW50ICE9IG51bGxwdHIgJiYKKyAgICAgICAgIElubmVyTWF0Y2hlci5tYXRjaGVzKCpEZWNsYXJhdGlvblN0YXRlbWVudCwgRmluZGVyLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHRoZSBpbmRleCBleHByZXNzaW9uIG9mIGFuIGFycmF5IHN1YnNjcmlwdCBleHByZXNzaW9uLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgaW50IGlbNV07CisvLy8gICB2b2lkIGYoKSB7IGlbMV0gPSA0MjsgfQorLy8vIFxlbmRjb2RlCisvLy8gYXJyYXlTdWJzY3JpcHRFeHByZXNzaW9uKGhhc0luZGV4KGludGVnZXJMaXRlcmFsKCkpKQorLy8vICAgbWF0Y2hlcyBcYyBpWzFdIHdpdGggdGhlIFxjIGludGVnZXJMaXRlcmFsKCkgbWF0Y2hpbmcgXGMgMQorQVNUX01BVENIRVJfUChBcnJheVN1YnNjcmlwdEV4cHIsIGhhc0luZGV4LAorICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxFeHByPiwgSW5uZXJNYXRjaGVyKSB7CisgIGlmIChjb25zdCBFeHByKiBFeHByZXNzaW9uID0gTm9kZS5nZXRJZHgoKSkKKyAgICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoKkV4cHJlc3Npb24sIEZpbmRlciwgQnVpbGRlcik7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHRoZSBiYXNlIGV4cHJlc3Npb24gb2YgYW4gYXJyYXkgc3Vic2NyaXB0IGV4cHJlc3Npb24uCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBpbnQgaVs1XTsKKy8vLyAgIHZvaWQgZigpIHsgaVsxXSA9IDQyOyB9CisvLy8gXGVuZGNvZGUKKy8vLyBhcnJheVN1YnNjcmlwdEV4cHJlc3Npb24oaGFzQmFzZShpbXBsaWNpdENhc3RFeHByKAorLy8vICAgICBoYXNTb3VyY2VFeHByZXNzaW9uKGRlY2xSZWZFeHByKCkpKSkpCisvLy8gICBtYXRjaGVzIFxjIGlbMV0gd2l0aCB0aGUgXGMgZGVjbFJlZkV4cHIoKSBtYXRjaGluZyBcYyBpCitBU1RfTUFUQ0hFUl9QKEFycmF5U3Vic2NyaXB0RXhwciwgaGFzQmFzZSwKKyAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8RXhwcj4sIElubmVyTWF0Y2hlcikgeworICBpZiAoY29uc3QgRXhwciogRXhwcmVzc2lvbiA9IE5vZGUuZ2V0QmFzZSgpKQorICAgIHJldHVybiBJbm5lck1hdGNoZXIubWF0Y2hlcygqRXhwcmVzc2lvbiwgRmluZGVyLCBCdWlsZGVyKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgYSAnZm9yJywgJ3doaWxlJywgJ2RvIHdoaWxlJyBzdGF0ZW1lbnQgb3IgYSBmdW5jdGlvbgorLy8vIGRlZmluaXRpb24gdGhhdCBoYXMgYSBnaXZlbiBib2R5LgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgZm9yICg7Oykge30KKy8vLyBcZW5kY29kZQorLy8vIGhhc0JvZHkoY29tcG91bmRTdG10KCkpCisvLy8gICBtYXRjaGVzICdmb3IgKDs7KSB7fScKKy8vLyB3aXRoIGNvbXBvdW5kU3RtdCgpCisvLy8gICBtYXRjaGluZyAne30nCitBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUl9QKGhhc0JvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoRG9TdG10LCBGb3JTdG10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoaWxlU3RtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhGb3JSYW5nZVN0bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25EZWNsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8U3RtdD4sIElubmVyTWF0Y2hlcikgeworICBjb25zdCBTdG10ICpjb25zdCBTdGF0ZW1lbnQgPSBpbnRlcm5hbDo6R2V0Qm9keU1hdGNoZXI8Tm9kZVR5cGU+OjpnZXQoTm9kZSk7CisgIHJldHVybiAoU3RhdGVtZW50ICE9IG51bGxwdHIgJiYKKyAgICAgICAgICBJbm5lck1hdGNoZXIubWF0Y2hlcygqU3RhdGVtZW50LCBGaW5kZXIsIEJ1aWxkZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGNvbXBvdW5kIHN0YXRlbWVudHMgd2hlcmUgYXQgbGVhc3Qgb25lIHN1YnN0YXRlbWVudCBtYXRjaGVzCisvLy8gYSBnaXZlbiBtYXRjaGVyLiBBbHNvIG1hdGNoZXMgU3RtdEV4cHJzIHRoYXQgaGF2ZSBDb21wb3VuZFN0bXQgYXMgY2hpbGRyZW4uCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB7IHt9OyAxKzI7IH0KKy8vLyBcZW5kY29kZQorLy8vIGhhc0FueVN1YnN0YXRlbWVudChjb21wb3VuZFN0bXQoKSkKKy8vLyAgIG1hdGNoZXMgJ3sge307IDErMjsgfScKKy8vLyB3aXRoIGNvbXBvdW5kU3RtdCgpCisvLy8gICBtYXRjaGluZyAne30nCitBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUl9QKGhhc0FueVN1YnN0YXRlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhDb21wb3VuZFN0bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdEV4cHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxTdG10PiwgSW5uZXJNYXRjaGVyKSB7CisgIGNvbnN0IENvbXBvdW5kU3RtdCAqQ1MgPSBDb21wb3VuZFN0bXRNYXRjaGVyPE5vZGVUeXBlPjo6Z2V0KE5vZGUpOworICByZXR1cm4gQ1MgJiYgbWF0Y2hlc0ZpcnN0SW5Qb2ludGVyUmFuZ2UoSW5uZXJNYXRjaGVyLCBDUy0+Ym9keV9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1MtPmJvZHlfZW5kKCksIEZpbmRlciwgQnVpbGRlcik7Cit9CisKKy8vLyBcYnJpZWYgQ2hlY2tzIHRoYXQgYSBjb21wb3VuZCBzdGF0ZW1lbnQgY29udGFpbnMgYSBzcGVjaWZpYyBudW1iZXIgb2YKKy8vLyBjaGlsZCBzdGF0ZW1lbnRzLgorLy8vCisvLy8gRXhhbXBsZTogR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgeyBmb3IgKDs7KSB7fSB9CisvLy8gXGVuZGNvZGUKKy8vLyBjb21wb3VuZFN0bXQoc3RhdGVtZW50Q291bnRJcygwKSkpCisvLy8gICBtYXRjaGVzICd7fScKKy8vLyAgIGJ1dCBkb2VzIG5vdCBtYXRjaCB0aGUgb3V0ZXIgY29tcG91bmQgc3RhdGVtZW50LgorQVNUX01BVENIRVJfUChDb21wb3VuZFN0bXQsIHN0YXRlbWVudENvdW50SXMsIHVuc2lnbmVkLCBOKSB7CisgIHJldHVybiBOb2RlLnNpemUoKSA9PSBOOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgbGl0ZXJhbHMgdGhhdCBhcmUgZXF1YWwgdG8gdGhlIGdpdmVuIHZhbHVlIG9mIHR5cGUgVmFsdWVULgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgZignXDAnLCBmYWxzZSwgMy4xNCwgNDIpOworLy8vIFxlbmRjb2RlCisvLy8gY2hhcmFjdGVyTGl0ZXJhbChlcXVhbHMoMCkpCisvLy8gICBtYXRjaGVzICdcMCcKKy8vLyBjeHhCb29sTGl0ZXJhbChlcXVhbHMoZmFsc2UpKSBhbmQgY3h4Qm9vbExpdGVyYWwoZXF1YWxzKDApKQorLy8vICAgbWF0Y2ggZmFsc2UKKy8vLyBmbG9hdExpdGVyYWwoZXF1YWxzKDMuMTQpKSBhbmQgZmxvYXRMaXRlcmFsKGVxdWFscygzMTRlLTIpKQorLy8vICAgbWF0Y2ggMy4xNAorLy8vIGludGVnZXJMaXRlcmFsKGVxdWFscyg0MikpCisvLy8gICBtYXRjaGVzIDQyCisvLy8KKy8vLyBOb3RlIHRoYXQgeW91IGNhbm5vdCBkaXJlY3RseSBtYXRjaCBhIG5lZ2F0aXZlIG51bWVyaWMgbGl0ZXJhbCBiZWNhdXNlIHRoZQorLy8vIG1pbnVzIHNpZ24gaXMgbm90IHBhcnQgb2YgdGhlIGxpdGVyYWw6IEl0IGlzIGEgdW5hcnkgb3BlcmF0b3Igd2hvc2Ugb3BlcmFuZAorLy8vIGlzIHRoZSBwb3NpdGl2ZSBudW1lcmljIGxpdGVyYWwuIEluc3RlYWQsIHlvdSBtdXN0IHVzZSBhIHVuYXJ5T3BlcmF0b3IoKQorLy8vIG1hdGNoZXIgdG8gbWF0Y2ggdGhlIG1pbnVzIHNpZ246CisvLy8KKy8vLyB1bmFyeU9wZXJhdG9yKGhhc09wZXJhdG9yTmFtZSgiLSIpLAorLy8vICAgICAgICAgICAgICAgaGFzVW5hcnlPcGVyYW5kKGludGVnZXJMaXRlcmFsKGVxdWFscygxMykpKSkKKy8vLworLy8vIFVzYWJsZSBhczogTWF0Y2hlcjxDaGFyYWN0ZXJMaXRlcmFsPiwgTWF0Y2hlcjxDWFhCb29sTGl0ZXJhbEV4cHI+LAorLy8vICAgICAgICAgICAgTWF0Y2hlcjxGbG9hdGluZ0xpdGVyYWw+LCBNYXRjaGVyPEludGVnZXJMaXRlcmFsPgordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVD4KK2ludGVybmFsOjpQb2x5bW9ycGhpY01hdGNoZXJXaXRoUGFyYW0xPGludGVybmFsOjpWYWx1ZUVxdWFsc01hdGNoZXIsIFZhbHVlVD4KK2VxdWFscyhjb25zdCBWYWx1ZVQgJlZhbHVlKSB7CisgIHJldHVybiBpbnRlcm5hbDo6UG9seW1vcnBoaWNNYXRjaGVyV2l0aFBhcmFtMTwKKyAgICBpbnRlcm5hbDo6VmFsdWVFcXVhbHNNYXRjaGVyLAorICAgIFZhbHVlVD4oVmFsdWUpOworfQorCitBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUl9QX09WRVJMT0FEKGVxdWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhDaGFyYWN0ZXJMaXRlcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWEJvb2xMaXRlcmFsRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyTGl0ZXJhbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wsIFZhbHVlLCAwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVFcXVhbHNNYXRjaGVyPE5vZGVUeXBlLCBQYXJhbVQ+KFZhbHVlKQorICAgIC5tYXRjaGVzTm9kZShOb2RlKTsKK30KKworQVNUX1BPTFlNT1JQSElDX01BVENIRVJfUF9PVkVSTE9BRChlcXVhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoQ2hhcmFjdGVyTGl0ZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhCb29sTGl0ZXJhbEV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlckxpdGVyYWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCwgVmFsdWUsIDEpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUVxdWFsc01hdGNoZXI8Tm9kZVR5cGUsIFBhcmFtVD4oVmFsdWUpCisgICAgLm1hdGNoZXNOb2RlKE5vZGUpOworfQorCitBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUl9QX09WRVJMT0FEKGVxdWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhDaGFyYWN0ZXJMaXRlcmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWEJvb2xMaXRlcmFsRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9hdGluZ0xpdGVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlckxpdGVyYWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUsIFZhbHVlLCAyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVFcXVhbHNNYXRjaGVyPE5vZGVUeXBlLCBQYXJhbVQ+KFZhbHVlKQorICAgIC5tYXRjaGVzTm9kZShOb2RlKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHRoZSBvcGVyYXRvciBOYW1lIG9mIG9wZXJhdG9yIGV4cHJlc3Npb25zIChiaW5hcnkgb3IKKy8vLyB1bmFyeSkuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgYSB8fCBiIChtYXRjaGVyID0gYmluYXJ5T3BlcmF0b3IoaGFzT3BlcmF0b3JOYW1lKCJ8fCIpKSkKKy8vLyBcY29kZQorLy8vICAgIShhIHx8IGIpCisvLy8gXGVuZGNvZGUKK0FTVF9QT0xZTU9SUEhJQ19NQVRDSEVSX1AoaGFzT3BlcmF0b3JOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RfUE9MWU1PUlBISUNfU1VQUE9SVEVEX1RZUEVTKEJpbmFyeU9wZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuYXJ5T3BlcmF0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZywgTmFtZSkgeworICByZXR1cm4gTmFtZSA9PSBOb2RlLmdldE9wY29kZVN0cihOb2RlLmdldE9wY29kZSgpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIG9uIGFsbCBraW5kcyBvZiBhc3NpZ25tZW50IG9wZXJhdG9ycy4KKy8vLworLy8vIEV4YW1wbGUgMTogbWF0Y2hlcyBhICs9IGIgKG1hdGNoZXIgPSBiaW5hcnlPcGVyYXRvcihpc0Fzc2lnbm1lbnRPcGVyYXRvcigpKSkKKy8vLyBcY29kZQorLy8vICAgaWYgKGEgPT0gYikKKy8vLyAgICAgYSArPSBiOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBFeGFtcGxlIDI6IG1hdGNoZXMgczEgPSBzMgorLy8vICAgICAgICAgICAgKG1hdGNoZXIgPSBjeHhPcGVyYXRvckNhbGxFeHByKGlzQXNzaWdubWVudE9wZXJhdG9yKCkpKQorLy8vIFxjb2RlCisvLy8gICBzdHJ1Y3QgUyB7IFMmIG9wZXJhdG9yPShjb25zdCBTJik7IH07CisvLy8gICB2b2lkIHgoKSB7IFMgczEsIHMyOyBzMSA9IHMyOyB9KQorLy8vIFxlbmRjb2RlCitBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUihpc0Fzc2lnbm1lbnRPcGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoQmluYXJ5T3BlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWE9wZXJhdG9yQ2FsbEV4cHIpKSB7CisgIHJldHVybiBOb2RlLmlzQXNzaWdubWVudE9wKCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgYmluYXJ5IG9wZXJhdG9yIGV4cHJlc3Npb25zLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIGEgKG1hdGNoZXIgPSBiaW5hcnlPcGVyYXRvcihoYXNMSFMoKSkpCisvLy8gXGNvZGUKKy8vLyAgIGEgfHwgYgorLy8vIFxlbmRjb2RlCitBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUl9QKGhhc0xIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhCaW5hcnlPcGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVN1YnNjcmlwdEV4cHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxFeHByPiwgSW5uZXJNYXRjaGVyKSB7CisgIGNvbnN0IEV4cHIgKkxlZnRIYW5kU2lkZSA9IE5vZGUuZ2V0TEhTKCk7CisgIHJldHVybiAoTGVmdEhhbmRTaWRlICE9IG51bGxwdHIgJiYKKyAgICAgICAgICBJbm5lck1hdGNoZXIubWF0Y2hlcygqTGVmdEhhbmRTaWRlLCBGaW5kZXIsIEJ1aWxkZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgYmluYXJ5IG9wZXJhdG9yIGV4cHJlc3Npb25zLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIGIgKG1hdGNoZXIgPSBiaW5hcnlPcGVyYXRvcihoYXNSSFMoKSkpCisvLy8gXGNvZGUKKy8vLyAgIGEgfHwgYgorLy8vIFxlbmRjb2RlCitBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUl9QKGhhc1JIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhCaW5hcnlPcGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVN1YnNjcmlwdEV4cHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxFeHByPiwgSW5uZXJNYXRjaGVyKSB7CisgIGNvbnN0IEV4cHIgKlJpZ2h0SGFuZFNpZGUgPSBOb2RlLmdldFJIUygpOworICByZXR1cm4gKFJpZ2h0SGFuZFNpZGUgIT0gbnVsbHB0ciAmJgorICAgICAgICAgIElubmVyTWF0Y2hlci5tYXRjaGVzKCpSaWdodEhhbmRTaWRlLCBGaW5kZXIsIEJ1aWxkZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGlmIGVpdGhlciB0aGUgbGVmdCBoYW5kIHNpZGUgb3IgdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiBhCisvLy8gYmluYXJ5IG9wZXJhdG9yIG1hdGNoZXMuCitpbmxpbmUgaW50ZXJuYWw6Ok1hdGNoZXI8QmluYXJ5T3BlcmF0b3I+IGhhc0VpdGhlck9wZXJhbmQoCisgICAgY29uc3QgaW50ZXJuYWw6Ok1hdGNoZXI8RXhwcj4gJklubmVyTWF0Y2hlcikgeworICByZXR1cm4gYW55T2YoaGFzTEhTKElubmVyTWF0Y2hlciksIGhhc1JIUyhJbm5lck1hdGNoZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGlmIHRoZSBvcGVyYW5kIG9mIGEgdW5hcnkgb3BlcmF0b3IgbWF0Y2hlcy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyB0cnVlIChtYXRjaGVyID0gaGFzVW5hcnlPcGVyYW5kKAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeHhCb29sTGl0ZXJhbChlcXVhbHModHJ1ZSkpKSkKKy8vLyBcY29kZQorLy8vICAgIXRydWUKKy8vLyBcZW5kY29kZQorQVNUX01BVENIRVJfUChVbmFyeU9wZXJhdG9yLCBoYXNVbmFyeU9wZXJhbmQsCisgICAgICAgICAgICAgIGludGVybmFsOjpNYXRjaGVyPEV4cHI+LCBJbm5lck1hdGNoZXIpIHsKKyAgY29uc3QgRXhwciAqIGNvbnN0IE9wZXJhbmQgPSBOb2RlLmdldFN1YkV4cHIoKTsKKyAgcmV0dXJuIChPcGVyYW5kICE9IG51bGxwdHIgJiYKKyAgICAgICAgICBJbm5lck1hdGNoZXIubWF0Y2hlcygqT3BlcmFuZCwgRmluZGVyLCBCdWlsZGVyKSk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBpZiB0aGUgY2FzdCdzIHNvdXJjZSBleHByZXNzaW9uCisvLy8gb3Igb3BhcXVlIHZhbHVlJ3Mgc291cmNlIGV4cHJlc3Npb24gbWF0Y2hlcyB0aGUgZ2l2ZW4gbWF0Y2hlci4KKy8vLworLy8vIEV4YW1wbGUgMTogbWF0Y2hlcyAiYSBzdHJpbmciCisvLy8gKG1hdGNoZXIgPSBjYXN0RXhwcihoYXNTb3VyY2VFeHByZXNzaW9uKGN4eENvbnN0cnVjdEV4cHIoKSkpKQorLy8vIFxjb2RlCisvLy8gY2xhc3MgVVJMIHsgVVJMKHN0cmluZyk7IH07CisvLy8gVVJMIHVybCA9ICJhIHN0cmluZyI7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIEV4YW1wbGUgMjogbWF0Y2hlcyAnYicgKG1hdGNoZXIgPQorLy8vIG9wYXF1ZVZhbHVlRXhwcihoYXNTb3VyY2VFeHByZXNzaW9uKGltcGxpY2l0Q2FzdEV4cHIoZGVjbFJlZkV4cHIoKSkpKQorLy8vIFxjb2RlCisvLy8gaW50IGEgPSBiID86IDE7CisvLy8gXGVuZGNvZGUKK0FTVF9QT0xZTU9SUEhJQ19NQVRDSEVSX1AoaGFzU291cmNlRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhDYXN0RXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGFxdWVWYWx1ZUV4cHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxFeHByPiwgSW5uZXJNYXRjaGVyKSB7CisgIGNvbnN0IEV4cHIgKmNvbnN0IFN1YkV4cHJlc3Npb24gPQorICAgICAgaW50ZXJuYWw6OkdldFNvdXJjZUV4cHJlc3Npb25NYXRjaGVyPE5vZGVUeXBlPjo6Z2V0KE5vZGUpOworICByZXR1cm4gKFN1YkV4cHJlc3Npb24gIT0gbnVsbHB0ciAmJgorICAgICAgICAgIElubmVyTWF0Y2hlci5tYXRjaGVzKCpTdWJFeHByZXNzaW9uLCBGaW5kZXIsIEJ1aWxkZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGNhc3RzIHRoYXQgaGFzIGEgZ2l2ZW4gY2FzdCBraW5kLgorLy8vCisvLy8gRXhhbXBsZTogbWF0Y2hlcyB0aGUgaW1wbGljaXQgY2FzdCBhcm91bmQgXGMgMAorLy8vIChtYXRjaGVyID0gY2FzdEV4cHIoaGFzQ2FzdEtpbmQoQ0tfTnVsbFRvUG9pbnRlcikpKQorLy8vIFxjb2RlCisvLy8gICBpbnQgKnAgPSAwOworLy8vIFxlbmRjb2RlCitBU1RfTUFUQ0hFUl9QKENhc3RFeHByLCBoYXNDYXN0S2luZCwgQ2FzdEtpbmQsIEtpbmQpIHsKKyAgcmV0dXJuIE5vZGUuZ2V0Q2FzdEtpbmQoKSA9PSBLaW5kOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgY2FzdHMgd2hvc2UgZGVzdGluYXRpb24gdHlwZSBtYXRjaGVzIGEgZ2l2ZW4gbWF0Y2hlci4KKy8vLworLy8vIChOb3RlOiBDbGFuZydzIEFTVCByZWZlcnMgdG8gb3RoZXIgY29udmVyc2lvbnMgYXMgImNhc3RzIiB0b28sIGFuZCBjYWxscworLy8vIGFjdHVhbCBjYXN0cyAiZXhwbGljaXQiIGNhc3RzLikKK0FTVF9NQVRDSEVSX1AoRXhwbGljaXRDYXN0RXhwciwgaGFzRGVzdGluYXRpb25UeXBlLAorICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxRdWFsVHlwZT4sIElubmVyTWF0Y2hlcikgeworICBjb25zdCBRdWFsVHlwZSBOb2RlVHlwZSA9IE5vZGUuZ2V0VHlwZUFzV3JpdHRlbigpOworICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoTm9kZVR5cGUsIEZpbmRlciwgQnVpbGRlcik7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBpbXBsaWNpdCBjYXN0cyB3aG9zZSBkZXN0aW5hdGlvbiB0eXBlIG1hdGNoZXMgYSBnaXZlbgorLy8vIG1hdGNoZXIuCisvLy8KKy8vLyBGSVhNRTogVW5pdCB0ZXN0IHRoaXMgbWF0Y2hlcgorQVNUX01BVENIRVJfUChJbXBsaWNpdENhc3RFeHByLCBoYXNJbXBsaWNpdERlc3RpbmF0aW9uVHlwZSwKKyAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8UXVhbFR5cGU+LCBJbm5lck1hdGNoZXIpIHsKKyAgcmV0dXJuIElubmVyTWF0Y2hlci5tYXRjaGVzKE5vZGUuZ2V0VHlwZSgpLCBGaW5kZXIsIEJ1aWxkZXIpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgUmVjb3JkRGVjbCBvYmplY3QgdGhhdCBhcmUgc3BlbGxlZCB3aXRoICJzdHJ1Y3QuIgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIFMsIGJ1dCBub3QgQyBvciBVLgorLy8vIFxjb2RlCisvLy8gICBzdHJ1Y3QgUyB7fTsKKy8vLyAgIGNsYXNzIEMge307CisvLy8gICB1bmlvbiBVIHt9OworLy8vIFxlbmRjb2RlCitBU1RfTUFUQ0hFUihSZWNvcmREZWNsLCBpc1N0cnVjdCkgeworICByZXR1cm4gTm9kZS5pc1N0cnVjdCgpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgUmVjb3JkRGVjbCBvYmplY3QgdGhhdCBhcmUgc3BlbGxlZCB3aXRoICJ1bmlvbi4iCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgVSwgYnV0IG5vdCBDIG9yIFMuCisvLy8gXGNvZGUKKy8vLyAgIHN0cnVjdCBTIHt9OworLy8vICAgY2xhc3MgQyB7fTsKKy8vLyAgIHVuaW9uIFUge307CisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSKFJlY29yZERlY2wsIGlzVW5pb24pIHsKKyAgcmV0dXJuIE5vZGUuaXNVbmlvbigpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgUmVjb3JkRGVjbCBvYmplY3QgdGhhdCBhcmUgc3BlbGxlZCB3aXRoICJjbGFzcy4iCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgQywgYnV0IG5vdCBTIG9yIFUuCisvLy8gXGNvZGUKKy8vLyAgIHN0cnVjdCBTIHt9OworLy8vICAgY2xhc3MgQyB7fTsKKy8vLyAgIHVuaW9uIFUge307CisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSKFJlY29yZERlY2wsIGlzQ2xhc3MpIHsKKyAgcmV0dXJuIE5vZGUuaXNDbGFzcygpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgdGhlIHRydWUgYnJhbmNoIGV4cHJlc3Npb24gb2YgYSBjb25kaXRpb25hbCBvcGVyYXRvci4KKy8vLworLy8vIEV4YW1wbGUgMSAoY29uZGl0aW9uYWwgdGVybmFyeSBvcGVyYXRvcik6IG1hdGNoZXMgYQorLy8vIFxjb2RlCisvLy8gICBjb25kaXRpb24gPyBhIDogYgorLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBFeGFtcGxlIDIgKGNvbmRpdGlvbmFsIGJpbmFyeSBvcGVyYXRvcik6IG1hdGNoZXMgb3BhcXVlVmFsdWVFeHByKGNvbmRpdGlvbikKKy8vLyBcY29kZQorLy8vICAgY29uZGl0aW9uID86IGIKKy8vLyBcZW5kY29kZQorQVNUX01BVENIRVJfUChBYnN0cmFjdENvbmRpdGlvbmFsT3BlcmF0b3IsIGhhc1RydWVFeHByZXNzaW9uLAorICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxFeHByPiwgSW5uZXJNYXRjaGVyKSB7CisgIGNvbnN0IEV4cHIgKkV4cHJlc3Npb24gPSBOb2RlLmdldFRydWVFeHByKCk7CisgIHJldHVybiAoRXhwcmVzc2lvbiAhPSBudWxscHRyICYmCisgICAgICAgICAgSW5uZXJNYXRjaGVyLm1hdGNoZXMoKkV4cHJlc3Npb24sIEZpbmRlciwgQnVpbGRlcikpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgdGhlIGZhbHNlIGJyYW5jaCBleHByZXNzaW9uIG9mIGEgY29uZGl0aW9uYWwgb3BlcmF0b3IKKy8vLyAoYmluYXJ5IG9yIHRlcm5hcnkpLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIGIKKy8vLyBcY29kZQorLy8vICAgY29uZGl0aW9uID8gYSA6IGIKKy8vLyAgIGNvbmRpdGlvbiA/OiBiCisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSX1AoQWJzdHJhY3RDb25kaXRpb25hbE9wZXJhdG9yLCBoYXNGYWxzZUV4cHJlc3Npb24sCisgICAgICAgICAgICAgIGludGVybmFsOjpNYXRjaGVyPEV4cHI+LCBJbm5lck1hdGNoZXIpIHsKKyAgY29uc3QgRXhwciAqRXhwcmVzc2lvbiA9IE5vZGUuZ2V0RmFsc2VFeHByKCk7CisgIHJldHVybiAoRXhwcmVzc2lvbiAhPSBudWxscHRyICYmCisgICAgICAgICAgSW5uZXJNYXRjaGVyLm1hdGNoZXMoKkV4cHJlc3Npb24sIEZpbmRlciwgQnVpbGRlcikpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgaWYgYSBkZWNsYXJhdGlvbiBoYXMgYSBib2R5IGF0dGFjaGVkLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIEEsIHZhLCBmYQorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBBIHt9OworLy8vICAgY2xhc3MgQjsgIC8vIERvZXNuJ3QgbWF0Y2gsIGFzIGl0IGhhcyBubyBib2R5LgorLy8vICAgaW50IHZhOworLy8vICAgZXh0ZXJuIGludCB2YjsgIC8vIERvZXNuJ3QgbWF0Y2gsIGFzIGl0IGRvZXNuJ3QgZGVmaW5lIHRoZSB2YXJpYWJsZS4KKy8vLyAgIHZvaWQgZmEoKSB7fQorLy8vICAgdm9pZCBmYigpOyAgLy8gRG9lc24ndCBtYXRjaCwgYXMgaXQgaGFzIG5vIGJvZHkuCisvLy8gICBAaW50ZXJmYWNlIFgKKy8vLyAgIC0gKHZvaWQpbWE7IC8vIERvZXNuJ3QgbWF0Y2gsIGludGVyZmFjZSBpcyBkZWNsYXJhdGlvbi4KKy8vLyAgIEBlbmQKKy8vLyAgIEBpbXBsZW1lbnRhdGlvbiBYCisvLy8gICAtICh2b2lkKW1hIHt9CisvLy8gICBAZW5kCisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFVzYWJsZSBhczogTWF0Y2hlcjxUYWdEZWNsPiwgTWF0Y2hlcjxWYXJEZWNsPiwgTWF0Y2hlcjxGdW5jdGlvbkRlY2w+LAorLy8vICAgTWF0Y2hlcjxPYmpDTWV0aG9kRGVjbD4KK0FTVF9QT0xZTU9SUEhJQ19NQVRDSEVSKGlzRGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoVGFnRGVjbCwgVmFyRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ01ldGhvZERlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uRGVjbCkpIHsKKyAgcmV0dXJuIE5vZGUuaXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgaWYgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpcyB2YXJpYWRpYy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBmLCBidXQgbm90IGcgb3IgaC4gVGhlIGZ1bmN0aW9uIGkgd2lsbCBub3QgbWF0Y2gsIGV2ZW4gd2hlbgorLy8vIGNvbXBpbGVkIGluIEMgbW9kZS4KKy8vLyBcY29kZQorLy8vICAgdm9pZCBmKC4uLik7CisvLy8gICB2b2lkIGcoaW50KTsKKy8vLyAgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUcz4gdm9pZCBoKFRzLi4uKTsKKy8vLyAgIHZvaWQgaSgpOworLy8vIFxlbmRjb2RlCitBU1RfTUFUQ0hFUihGdW5jdGlvbkRlY2wsIGlzVmFyaWFkaWMpIHsKKyAgcmV0dXJuIE5vZGUuaXNWYXJpYWRpYygpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgdGhlIGNsYXNzIGRlY2xhcmF0aW9uIHRoYXQgdGhlIGdpdmVuIG1ldGhvZCBkZWNsYXJhdGlvbgorLy8vIGJlbG9uZ3MgdG8uCisvLy8KKy8vLyBGSVhNRTogR2VuZXJhbGl6ZSB0aGlzIGZvciBvdGhlciBraW5kcyBvZiBkZWNsYXJhdGlvbnMuCisvLy8gRklYTUU6IFdoYXQgb3RoZXIga2luZCBvZiBkZWNsYXJhdGlvbnMgd291bGQgd2UgbmVlZCB0byBnZW5lcmFsaXplCisvLy8gdGhpcyB0bz8KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBBKCkgaW4gdGhlIGxhc3QgbGluZQorLy8vICAgICAobWF0Y2hlciA9IGN4eENvbnN0cnVjdEV4cHIoaGFzRGVjbGFyYXRpb24oY3h4TWV0aG9kRGVjbCgKKy8vLyAgICAgICAgIG9mQ2xhc3MoaGFzTmFtZSgiQSIpKSkpKSkKKy8vLyBcY29kZQorLy8vICAgY2xhc3MgQSB7CisvLy8gICAgcHVibGljOgorLy8vICAgICBBKCk7CisvLy8gICB9OworLy8vICAgQSBhID0gQSgpOworLy8vIFxlbmRjb2RlCitBU1RfTUFUQ0hFUl9QKENYWE1ldGhvZERlY2wsIG9mQ2xhc3MsCisgICAgICAgICAgICAgIGludGVybmFsOjpNYXRjaGVyPENYWFJlY29yZERlY2w+LCBJbm5lck1hdGNoZXIpIHsKKyAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUGFyZW50ID0gTm9kZS5nZXRQYXJlbnQoKTsKKyAgcmV0dXJuIChQYXJlbnQgIT0gbnVsbHB0ciAmJgorICAgICAgICAgIElubmVyTWF0Y2hlci5tYXRjaGVzKCpQYXJlbnQsIEZpbmRlciwgQnVpbGRlcikpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgZWFjaCBtZXRob2Qgb3ZlcnJpZGVuIGJ5IHRoZSBnaXZlbiBtZXRob2QuIFRoaXMgbWF0Y2hlciBtYXkKKy8vLyBwcm9kdWNlIG11bHRpcGxlIG1hdGNoZXMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBBIHsgdmlydHVhbCB2b2lkIGYoKTsgfTsKKy8vLyAgIGNsYXNzIEIgOiBwdWJsaWMgQSB7IHZvaWQgZigpOyB9OworLy8vICAgY2xhc3MgQyA6IHB1YmxpYyBCIHsgdm9pZCBmKCk7IH07CisvLy8gXGVuZGNvZGUKKy8vLyBjeHhNZXRob2REZWNsKG9mQ2xhc3MoaGFzTmFtZSgiQyIpKSwKKy8vLyAgICAgICAgICAgICAgIGZvckVhY2hPdmVycmlkZGVuKGN4eE1ldGhvZERlY2woKS5iaW5kKCJiIikpKS5iaW5kKCJkIikKKy8vLyAgIG1hdGNoZXMgb25jZSwgd2l0aCAiYiIgYmluZGluZyAiQTo6ZiIgYW5kICJkIiBiaW5kaW5nICJDOjpmIiAoTm90ZQorLy8vICAgdGhhdCBCOjpmIGlzIG5vdCBvdmVycmlkZGVuIGJ5IEM6OmYpLgorLy8vCisvLy8gVGhlIGNoZWNrIGNhbiBwcm9kdWNlIG11bHRpcGxlIG1hdGNoZXMgaW4gY2FzZSBvZiBtdWx0aXBsZSBpbmhlcml0YW5jZSwgZS5nLgorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBBMSB7IHZpcnR1YWwgdm9pZCBmKCk7IH07CisvLy8gICBjbGFzcyBBMiB7IHZpcnR1YWwgdm9pZCBmKCk7IH07CisvLy8gICBjbGFzcyBDIDogcHVibGljIEExLCBwdWJsaWMgQTIgeyB2b2lkIGYoKTsgfTsKKy8vLyBcZW5kY29kZQorLy8vIGN4eE1ldGhvZERlY2wob2ZDbGFzcyhoYXNOYW1lKCJDIikpLAorLy8vICAgICAgICAgICAgICAgZm9yRWFjaE92ZXJyaWRkZW4oY3h4TWV0aG9kRGVjbCgpLmJpbmQoImIiKSkpLmJpbmQoImQiKQorLy8vICAgbWF0Y2hlcyB0d2ljZSwgb25jZSB3aXRoICJiIiBiaW5kaW5nICJBMTo6ZiIgYW5kICJkIiBiaW5kaW5nICJDOjpmIiwgYW5kCisvLy8gICBvbmNlIHdpdGggImIiIGJpbmRpbmcgIkEyOjpmIiBhbmQgImQiIGJpbmRpbmcgIkM6OmYiLgorQVNUX01BVENIRVJfUChDWFhNZXRob2REZWNsLCBmb3JFYWNoT3ZlcnJpZGRlbiwKKyAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8Q1hYTWV0aG9kRGVjbD4sIElubmVyTWF0Y2hlcikgeworICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgUmVzdWx0OworICBib29sIE1hdGNoZWQgPSBmYWxzZTsKKyAgZm9yIChjb25zdCBhdXRvICpPdmVycmlkZGVuIDogTm9kZS5vdmVycmlkZGVuX21ldGhvZHMoKSkgeworICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciBPdmVycmlkZGVuQnVpbGRlcigqQnVpbGRlcik7CisgICAgY29uc3QgYm9vbCBPdmVycmlkZGVuTWF0Y2hlZCA9CisgICAgICAgIElubmVyTWF0Y2hlci5tYXRjaGVzKCpPdmVycmlkZGVuLCBGaW5kZXIsICZPdmVycmlkZGVuQnVpbGRlcik7CisgICAgaWYgKE92ZXJyaWRkZW5NYXRjaGVkKSB7CisgICAgICBNYXRjaGVkID0gdHJ1ZTsKKyAgICAgIFJlc3VsdC5hZGRNYXRjaChPdmVycmlkZGVuQnVpbGRlcik7CisgICAgfQorICB9CisgICpCdWlsZGVyID0gc3RkOjptb3ZlKFJlc3VsdCk7CisgIHJldHVybiBNYXRjaGVkOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgaWYgdGhlIGdpdmVuIG1ldGhvZCBkZWNsYXJhdGlvbiBpcyB2aXJ0dWFsLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgY2xhc3MgQSB7CisvLy8gICAgcHVibGljOgorLy8vICAgICB2aXJ0dWFsIHZvaWQgeCgpOworLy8vICAgfTsKKy8vLyBcZW5kY29kZQorLy8vICAgbWF0Y2hlcyBBOjp4CitBU1RfTUFUQ0hFUihDWFhNZXRob2REZWNsLCBpc1ZpcnR1YWwpIHsKKyAgcmV0dXJuIE5vZGUuaXNWaXJ0dWFsKCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGRlY2xhcmF0aW9uIGhhcyBhbiBleHBsaWNpdCAidmlydHVhbCIuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBBIHsKKy8vLyAgICBwdWJsaWM6CisvLy8gICAgIHZpcnR1YWwgdm9pZCB4KCk7CisvLy8gICB9OworLy8vICAgY2xhc3MgQiA6IHB1YmxpYyBBIHsKKy8vLyAgICBwdWJsaWM6CisvLy8gICAgIHZvaWQgeCgpOworLy8vICAgfTsKKy8vLyBcZW5kY29kZQorLy8vICAgbWF0Y2hlcyBBOjp4IGJ1dCBub3QgQjo6eAorQVNUX01BVENIRVIoQ1hYTWV0aG9kRGVjbCwgaXNWaXJ0dWFsQXNXcml0dGVuKSB7CisgIHJldHVybiBOb2RlLmlzVmlydHVhbEFzV3JpdHRlbigpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgaWYgdGhlIGdpdmVuIG1ldGhvZCBvciBjbGFzcyBkZWNsYXJhdGlvbiBpcyBmaW5hbC4KKy8vLworLy8vIEdpdmVuOgorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBBIGZpbmFsIHt9OworLy8vCisvLy8gICBzdHJ1Y3QgQiB7CisvLy8gICAgIHZpcnR1YWwgdm9pZCBmKCk7CisvLy8gICB9OworLy8vCisvLy8gICBzdHJ1Y3QgQyA6IEIgeworLy8vICAgICB2b2lkIGYoKSBmaW5hbDsKKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKKy8vLyBtYXRjaGVzIEEgYW5kIEM6OmYsIGJ1dCBub3QgQiwgQywgb3IgQjo6ZgorQVNUX1BPTFlNT1JQSElDX01BVENIRVIoaXNGaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoQ1hYUmVjb3JkRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYTWV0aG9kRGVjbCkpIHsKKyAgcmV0dXJuIE5vZGUudGVtcGxhdGUgaGFzQXR0cjxGaW5hbEF0dHI+KCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGRlY2xhcmF0aW9uIGlzIHB1cmUuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBjbGFzcyBBIHsKKy8vLyAgICBwdWJsaWM6CisvLy8gICAgIHZpcnR1YWwgdm9pZCB4KCkgPSAwOworLy8vICAgfTsKKy8vLyBcZW5kY29kZQorLy8vICAgbWF0Y2hlcyBBOjp4CitBU1RfTUFUQ0hFUihDWFhNZXRob2REZWNsLCBpc1B1cmUpIHsKKyAgcmV0dXJuIE5vZGUuaXNQdXJlKCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGRlY2xhcmF0aW9uIGlzIGNvbnN0LgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vIHN0cnVjdCBBIHsKKy8vLyAgIHZvaWQgZm9vKCkgY29uc3Q7CisvLy8gICB2b2lkIGJhcigpOworLy8vIH07CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIGN4eE1ldGhvZERlY2woaXNDb25zdCgpKSBtYXRjaGVzIEE6OmZvbygpIGJ1dCBub3QgQTo6YmFyKCkKK0FTVF9NQVRDSEVSKENYWE1ldGhvZERlY2wsIGlzQ29uc3QpIHsKKyAgcmV0dXJuIE5vZGUuaXNDb25zdCgpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgaWYgdGhlIGdpdmVuIG1ldGhvZCBkZWNsYXJhdGlvbiBkZWNsYXJlcyBhIGNvcHkgYXNzaWdubWVudAorLy8vIG9wZXJhdG9yLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vIHN0cnVjdCBBIHsKKy8vLyAgIEEgJm9wZXJhdG9yPShjb25zdCBBICYpOworLy8vICAgQSAmb3BlcmF0b3I9KEEgJiYpOworLy8vIH07CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIGN4eE1ldGhvZERlY2woaXNDb3B5QXNzaWdubWVudE9wZXJhdG9yKCkpIG1hdGNoZXMgdGhlIGZpcnN0IG1ldGhvZCBidXQgbm90CisvLy8gdGhlIHNlY29uZCBvbmUuCitBU1RfTUFUQ0hFUihDWFhNZXRob2REZWNsLCBpc0NvcHlBc3NpZ25tZW50T3BlcmF0b3IpIHsKKyAgcmV0dXJuIE5vZGUuaXNDb3B5QXNzaWdubWVudE9wZXJhdG9yKCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGRlY2xhcmF0aW9uIGRlY2xhcmVzIGEgbW92ZSBhc3NpZ25tZW50CisvLy8gb3BlcmF0b3IuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gc3RydWN0IEEgeworLy8vICAgQSAmb3BlcmF0b3I9KGNvbnN0IEEgJik7CisvLy8gICBBICZvcGVyYXRvcj0oQSAmJik7CisvLy8gfTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gY3h4TWV0aG9kRGVjbChpc01vdmVBc3NpZ25tZW50T3BlcmF0b3IoKSkgbWF0Y2hlcyB0aGUgc2Vjb25kIG1ldGhvZCBidXQgbm90CisvLy8gdGhlIGZpcnN0IG9uZS4KK0FTVF9NQVRDSEVSKENYWE1ldGhvZERlY2wsIGlzTW92ZUFzc2lnbm1lbnRPcGVyYXRvcikgeworICByZXR1cm4gTm9kZS5pc01vdmVBc3NpZ25tZW50T3BlcmF0b3IoKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGlmIHRoZSBnaXZlbiBtZXRob2QgZGVjbGFyYXRpb24gb3ZlcnJpZGVzIGFub3RoZXIgbWV0aG9kLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgY2xhc3MgQSB7CisvLy8gICAgcHVibGljOgorLy8vICAgICB2aXJ0dWFsIHZvaWQgeCgpOworLy8vICAgfTsKKy8vLyAgIGNsYXNzIEIgOiBwdWJsaWMgQSB7CisvLy8gICAgcHVibGljOgorLy8vICAgICB2aXJ0dWFsIHZvaWQgeCgpOworLy8vICAgfTsKKy8vLyBcZW5kY29kZQorLy8vICAgbWF0Y2hlcyBCOjp4CitBU1RfTUFUQ0hFUihDWFhNZXRob2REZWNsLCBpc092ZXJyaWRlKSB7CisgIHJldHVybiBOb2RlLnNpemVfb3ZlcnJpZGRlbl9tZXRob2RzKCkgPiAwIHx8IE5vZGUuaGFzQXR0cjxPdmVycmlkZUF0dHI+KCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBtZXRob2QgZGVjbGFyYXRpb25zIHRoYXQgYXJlIHVzZXItcHJvdmlkZWQuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBzdHJ1Y3QgUyB7CisvLy8gICAgIFMoKTsgLy8gIzEKKy8vLyAgICAgUyhjb25zdCBTICYpID0gZGVmYXVsdDsgLy8gIzIKKy8vLyAgICAgUyhTICYmKSA9IGRlbGV0ZTsgLy8gIzMKKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKKy8vLyBjeHhDb25zdHJ1Y3RvckRlY2woaXNVc2VyUHJvdmlkZWQoKSkgd2lsbCBtYXRjaCAjMSwgYnV0IG5vdCAjMiBvciAjMy4KK0FTVF9NQVRDSEVSKENYWE1ldGhvZERlY2wsIGlzVXNlclByb3ZpZGVkKSB7CisgIHJldHVybiBOb2RlLmlzVXNlclByb3ZpZGVkKCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBtZW1iZXIgZXhwcmVzc2lvbnMgdGhhdCBhcmUgY2FsbGVkIHdpdGggJy0+JyBhcyBvcHBvc2VkCisvLy8gdG8gJy4nLgorLy8vCisvLy8gTWVtYmVyIGNhbGxzIG9uIHRoZSBpbXBsaWNpdCB0aGlzIHBvaW50ZXIgbWF0Y2ggYXMgY2FsbGVkIHdpdGggJy0+Jy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIFkgeworLy8vICAgICB2b2lkIHgoKSB7IHRoaXMtPngoKTsgeCgpOyBZIHk7IHkueCgpOyBhOyB0aGlzLT5iOyBZOjpiOyB9CisvLy8gICAgIGludCBhOworLy8vICAgICBzdGF0aWMgaW50IGI7CisvLy8gICB9OworLy8vIFxlbmRjb2RlCisvLy8gbWVtYmVyRXhwcihpc0Fycm93KCkpCisvLy8gICBtYXRjaGVzIHRoaXMtPngsIHgsIHkueCwgYSwgdGhpcy0+YgorQVNUX01BVENIRVIoTWVtYmVyRXhwciwgaXNBcnJvdykgeworICByZXR1cm4gTm9kZS5pc0Fycm93KCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBRdWFsVHlwZSBub2RlcyB0aGF0IGFyZSBvZiBpbnRlZ2VyIHR5cGUuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB2b2lkIGEoaW50KTsKKy8vLyAgIHZvaWQgYihsb25nKTsKKy8vLyAgIHZvaWQgYyhkb3VibGUpOworLy8vIFxlbmRjb2RlCisvLy8gZnVuY3Rpb25EZWNsKGhhc0FueVBhcmFtZXRlcihoYXNUeXBlKGlzSW50ZWdlcigpKSkpCisvLy8gbWF0Y2hlcyAiYShpbnQpIiwgImIobG9uZykiLCBidXQgbm90ICJjKGRvdWJsZSkiLgorQVNUX01BVENIRVIoUXVhbFR5cGUsIGlzSW50ZWdlcikgeworICAgIHJldHVybiBOb2RlLT5pc0ludGVnZXJUeXBlKCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBRdWFsVHlwZSBub2RlcyB0aGF0IGFyZSBvZiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB2b2lkIGEoaW50KTsKKy8vLyAgIHZvaWQgYih1bnNpZ25lZCBsb25nKTsKKy8vLyAgIHZvaWQgYyhkb3VibGUpOworLy8vIFxlbmRjb2RlCisvLy8gZnVuY3Rpb25EZWNsKGhhc0FueVBhcmFtZXRlcihoYXNUeXBlKGlzVW5zaWduZWRJbnRlZ2VyKCkpKSkKKy8vLyBtYXRjaGVzICJiKHVuc2lnbmVkIGxvbmcpIiwgYnV0IG5vdCAiYShpbnQpIiBhbmQgImMoZG91YmxlKSIuCitBU1RfTUFUQ0hFUihRdWFsVHlwZSwgaXNVbnNpZ25lZEludGVnZXIpIHsKKyAgICByZXR1cm4gTm9kZS0+aXNVbnNpZ25lZEludGVnZXJUeXBlKCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBRdWFsVHlwZSBub2RlcyB0aGF0IGFyZSBvZiBzaWduZWQgaW50ZWdlciB0eXBlLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdm9pZCBhKGludCk7CisvLy8gICB2b2lkIGIodW5zaWduZWQgbG9uZyk7CisvLy8gICB2b2lkIGMoZG91YmxlKTsKKy8vLyBcZW5kY29kZQorLy8vIGZ1bmN0aW9uRGVjbChoYXNBbnlQYXJhbWV0ZXIoaGFzVHlwZShpc1NpZ25lZEludGVnZXIoKSkpKQorLy8vIG1hdGNoZXMgImEoaW50KSIsIGJ1dCBub3QgImIodW5zaWduZWQgbG9uZykiIGFuZCAiYyhkb3VibGUpIi4KK0FTVF9NQVRDSEVSKFF1YWxUeXBlLCBpc1NpZ25lZEludGVnZXIpIHsKKyAgICByZXR1cm4gTm9kZS0+aXNTaWduZWRJbnRlZ2VyVHlwZSgpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgUXVhbFR5cGUgbm9kZXMgdGhhdCBhcmUgb2YgY2hhcmFjdGVyIHR5cGUuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB2b2lkIGEoY2hhcik7CisvLy8gICB2b2lkIGIod2NoYXJfdCk7CisvLy8gICB2b2lkIGMoZG91YmxlKTsKKy8vLyBcZW5kY29kZQorLy8vIGZ1bmN0aW9uRGVjbChoYXNBbnlQYXJhbWV0ZXIoaGFzVHlwZShpc0FueUNoYXJhY3RlcigpKSkpCisvLy8gbWF0Y2hlcyAiYShjaGFyKSIsICJiKHdjaGFyX3QpIiwgYnV0IG5vdCAiYyhkb3VibGUpIi4KK0FTVF9NQVRDSEVSKFF1YWxUeXBlLCBpc0FueUNoYXJhY3RlcikgeworICAgIHJldHVybiBOb2RlLT5pc0FueUNoYXJhY3RlclR5cGUoKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIFF1YWxUeXBlIG5vZGVzIHRoYXQgYXJlIG9mIGFueSBwb2ludGVyIHR5cGU7IHRoaXMgaW5jbHVkZXMKKy8vLyB0aGUgT2JqZWN0aXZlLUMgb2JqZWN0IHBvaW50ZXIgdHlwZSwgd2hpY2ggaXMgZGlmZmVyZW50IGRlc3BpdGUgYmVpbmcKKy8vLyBzeW50YWN0aWNhbGx5IHNpbWlsYXIuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBpbnQgKmkgPSBudWxscHRyOworLy8vCisvLy8gICBAaW50ZXJmYWNlIEZvbworLy8vICAgQGVuZAorLy8vICAgRm9vICpmOworLy8vCisvLy8gICBpbnQgajsKKy8vLyBcZW5kY29kZQorLy8vIHZhckRlY2woaGFzVHlwZShpc0FueVBvaW50ZXIoKSkpCisvLy8gICBtYXRjaGVzICJpbnQgKmkiIGFuZCAiRm9vICpmIiwgYnV0IG5vdCAiaW50IGoiLgorQVNUX01BVENIRVIoUXVhbFR5cGUsIGlzQW55UG9pbnRlcikgeworICByZXR1cm4gTm9kZS0+aXNBbnlQb2ludGVyVHlwZSgpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgUXVhbFR5cGUgbm9kZXMgdGhhdCBhcmUgY29uc3QtcXVhbGlmaWVkLCBpLmUuLCB0aGF0CisvLy8gaW5jbHVkZSAidG9wLWxldmVsIiBjb25zdC4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHZvaWQgYShpbnQpOworLy8vICAgdm9pZCBiKGludCBjb25zdCk7CisvLy8gICB2b2lkIGMoY29uc3QgaW50KTsKKy8vLyAgIHZvaWQgZChjb25zdCBpbnQqKTsKKy8vLyAgIHZvaWQgZShpbnQgY29uc3QpIHt9OworLy8vIFxlbmRjb2RlCisvLy8gZnVuY3Rpb25EZWNsKGhhc0FueVBhcmFtZXRlcihoYXNUeXBlKGlzQ29uc3RRdWFsaWZpZWQoKSkpKQorLy8vICAgbWF0Y2hlcyAidm9pZCBiKGludCBjb25zdCkiLCAidm9pZCBjKGNvbnN0IGludCkiIGFuZAorLy8vICAgInZvaWQgZShpbnQgY29uc3QpIHt9Ii4gSXQgZG9lcyBub3QgbWF0Y2ggZCBhcyB0aGVyZQorLy8vICAgaXMgbm8gdG9wLWxldmVsIGNvbnN0IG9uIHRoZSBwYXJhbWV0ZXIgdHlwZSAiY29uc3QgaW50ICoiLgorQVNUX01BVENIRVIoUXVhbFR5cGUsIGlzQ29uc3RRdWFsaWZpZWQpIHsKKyAgcmV0dXJuIE5vZGUuaXNDb25zdFF1YWxpZmllZCgpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgUXVhbFR5cGUgbm9kZXMgdGhhdCBhcmUgdm9sYXRpbGUtcXVhbGlmaWVkLCBpLmUuLCB0aGF0CisvLy8gaW5jbHVkZSAidG9wLWxldmVsIiB2b2xhdGlsZS4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHZvaWQgYShpbnQpOworLy8vICAgdm9pZCBiKGludCB2b2xhdGlsZSk7CisvLy8gICB2b2lkIGModm9sYXRpbGUgaW50KTsKKy8vLyAgIHZvaWQgZCh2b2xhdGlsZSBpbnQqKTsKKy8vLyAgIHZvaWQgZShpbnQgdm9sYXRpbGUpIHt9OworLy8vIFxlbmRjb2RlCisvLy8gZnVuY3Rpb25EZWNsKGhhc0FueVBhcmFtZXRlcihoYXNUeXBlKGlzVm9sYXRpbGVRdWFsaWZpZWQoKSkpKQorLy8vICAgbWF0Y2hlcyAidm9pZCBiKGludCB2b2xhdGlsZSkiLCAidm9pZCBjKHZvbGF0aWxlIGludCkiIGFuZAorLy8vICAgInZvaWQgZShpbnQgdm9sYXRpbGUpIHt9Ii4gSXQgZG9lcyBub3QgbWF0Y2ggZCBhcyB0aGVyZQorLy8vICAgaXMgbm8gdG9wLWxldmVsIHZvbGF0aWxlIG9uIHRoZSBwYXJhbWV0ZXIgdHlwZSAidm9sYXRpbGUgaW50ICoiLgorQVNUX01BVENIRVIoUXVhbFR5cGUsIGlzVm9sYXRpbGVRdWFsaWZpZWQpIHsKKyAgcmV0dXJuIE5vZGUuaXNWb2xhdGlsZVF1YWxpZmllZCgpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgUXVhbFR5cGUgbm9kZXMgdGhhdCBoYXZlIGxvY2FsIENWLXF1YWxpZmllcnMgYXR0YWNoZWQgdG8KKy8vLyB0aGUgbm9kZSwgbm90IGhpZGRlbiB3aXRoaW4gYSB0eXBlZGVmLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdHlwZWRlZiBjb25zdCBpbnQgY29uc3RfaW50OworLy8vICAgY29uc3RfaW50IGk7CisvLy8gICBpbnQgKmNvbnN0IGo7CisvLy8gICBpbnQgKnZvbGF0aWxlIGs7CisvLy8gICBpbnQgbTsKKy8vLyBcZW5kY29kZQorLy8vIFxjIHZhckRlY2woaGFzVHlwZShoYXNMb2NhbFF1YWxpZmllcnMoKSkpIG1hdGNoZXMgb25seSBcYyBqIGFuZCBcYyBrLgorLy8vIFxjIGkgaXMgY29uc3QtcXVhbGlmaWVkIGJ1dCB0aGUgcXVhbGlmaWVyIGlzIG5vdCBsb2NhbC4KK0FTVF9NQVRDSEVSKFF1YWxUeXBlLCBoYXNMb2NhbFF1YWxpZmllcnMpIHsKKyAgcmV0dXJuIE5vZGUuaGFzTG9jYWxRdWFsaWZpZXJzKCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIG1lbWJlciBleHByZXNzaW9uIHdoZXJlIHRoZSBtZW1iZXIgaXMgbWF0Y2hlZCBieSBhCisvLy8gZ2l2ZW4gbWF0Y2hlci4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHN0cnVjdCB7IGludCBmaXJzdCwgc2Vjb25kOyB9IGZpcnN0LCBzZWNvbmQ7CisvLy8gICBpbnQgaShzZWNvbmQuZmlyc3QpOworLy8vICAgaW50IGooZmlyc3Quc2Vjb25kKTsKKy8vLyBcZW5kY29kZQorLy8vIG1lbWJlckV4cHIobWVtYmVyKGhhc05hbWUoImZpcnN0IikpKQorLy8vICAgbWF0Y2hlcyBzZWNvbmQuZmlyc3QKKy8vLyAgIGJ1dCBub3QgZmlyc3Quc2Vjb25kIChiZWNhdXNlIHRoZSBtZW1iZXIgbmFtZSB0aGVyZSBpcyAic2Vjb25kIikuCitBU1RfTUFUQ0hFUl9QKE1lbWJlckV4cHIsIG1lbWJlciwKKyAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8VmFsdWVEZWNsPiwgSW5uZXJNYXRjaGVyKSB7CisgIHJldHVybiBJbm5lck1hdGNoZXIubWF0Y2hlcygqTm9kZS5nZXRNZW1iZXJEZWNsKCksIEZpbmRlciwgQnVpbGRlcik7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIG1lbWJlciBleHByZXNzaW9uIHdoZXJlIHRoZSBvYmplY3QgZXhwcmVzc2lvbiBpcworLy8vIG1hdGNoZWQgYnkgYSBnaXZlbiBtYXRjaGVyLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgc3RydWN0IFggeyBpbnQgbTsgfTsKKy8vLyAgIHZvaWQgZihYIHgpIHsgeC5tOyBtOyB9CisvLy8gXGVuZGNvZGUKKy8vLyBtZW1iZXJFeHByKGhhc09iamVjdEV4cHJlc3Npb24oaGFzVHlwZShjeHhSZWNvcmREZWNsKGhhc05hbWUoIlgiKSkpKSkpKQorLy8vICAgbWF0Y2hlcyAieC5tIiBhbmQgIm0iCisvLy8gd2l0aCBoYXNPYmplY3RFeHByZXNzaW9uKC4uLikKKy8vLyAgIG1hdGNoaW5nICJ4IiBhbmQgdGhlIGltcGxpY2l0IG9iamVjdCBleHByZXNzaW9uIG9mICJtIiB3aGljaCBoYXMgdHlwZSBYKi4KK0FTVF9NQVRDSEVSX1AoTWVtYmVyRXhwciwgaGFzT2JqZWN0RXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8RXhwcj4sIElubmVyTWF0Y2hlcikgeworICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoKk5vZGUuZ2V0QmFzZSgpLCBGaW5kZXIsIEJ1aWxkZXIpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgYW55IHVzaW5nIHNoYWRvdyBkZWNsYXJhdGlvbi4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIG5hbWVzcGFjZSBYIHsgdm9pZCBiKCk7IH0KKy8vLyAgIHVzaW5nIFg6OmI7CisvLy8gXGVuZGNvZGUKKy8vLyB1c2luZ0RlY2woaGFzQW55VXNpbmdTaGFkb3dEZWNsKGhhc05hbWUoImIiKSkpKQorLy8vICAgbWF0Y2hlcyBcY29kZSB1c2luZyBYOjpiIFxlbmRjb2RlCitBU1RfTUFUQ0hFUl9QKFVzaW5nRGVjbCwgaGFzQW55VXNpbmdTaGFkb3dEZWNsLAorICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxVc2luZ1NoYWRvd0RlY2w+LCBJbm5lck1hdGNoZXIpIHsKKyAgcmV0dXJuIG1hdGNoZXNGaXJzdEluUG9pbnRlclJhbmdlKElubmVyTWF0Y2hlciwgTm9kZS5zaGFkb3dfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUuc2hhZG93X2VuZCgpLCBGaW5kZXIsIEJ1aWxkZXIpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgYSB1c2luZyBzaGFkb3cgZGVjbGFyYXRpb24gd2hlcmUgdGhlIHRhcmdldCBkZWNsYXJhdGlvbiBpcworLy8vIG1hdGNoZWQgYnkgdGhlIGdpdmVuIG1hdGNoZXIuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBuYW1lc3BhY2UgWCB7IGludCBhOyB2b2lkIGIoKTsgfQorLy8vICAgdXNpbmcgWDo6YTsKKy8vLyAgIHVzaW5nIFg6OmI7CisvLy8gXGVuZGNvZGUKKy8vLyB1c2luZ0RlY2woaGFzQW55VXNpbmdTaGFkb3dEZWNsKGhhc1RhcmdldERlY2woZnVuY3Rpb25EZWNsKCkpKSkKKy8vLyAgIG1hdGNoZXMgXGNvZGUgdXNpbmcgWDo6YiBcZW5kY29kZQorLy8vICAgYnV0IG5vdCBcY29kZSB1c2luZyBYOjphIFxlbmRjb2RlCitBU1RfTUFUQ0hFUl9QKFVzaW5nU2hhZG93RGVjbCwgaGFzVGFyZ2V0RGVjbCwKKyAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8TmFtZWREZWNsPiwgSW5uZXJNYXRjaGVyKSB7CisgIHJldHVybiBJbm5lck1hdGNoZXIubWF0Y2hlcygqTm9kZS5nZXRUYXJnZXREZWNsKCksIEZpbmRlciwgQnVpbGRlcik7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9ucyBvZiBmdW5jdGlvbiwgY2xhc3MsIG9yIHN0YXRpYworLy8vIG1lbWJlciB2YXJpYWJsZSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9ucy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBYIHt9OyBjbGFzcyBBIHt9OyBYPEE+IHg7CisvLy8gXGVuZGNvZGUKKy8vLyBvcgorLy8vIFxjb2RlCisvLy8gICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgWCB7fTsgY2xhc3MgQSB7fTsgdGVtcGxhdGUgY2xhc3MgWDxBPjsKKy8vLyBcZW5kY29kZQorLy8vIG9yCisvLy8gXGNvZGUKKy8vLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBYIHt9OyBjbGFzcyBBIHt9OyBleHRlcm4gdGVtcGxhdGUgY2xhc3MgWDxBPjsKKy8vLyBcZW5kY29kZQorLy8vIGN4eFJlY29yZERlY2woaGFzTmFtZSgiOjpYIiksIGlzVGVtcGxhdGVJbnN0YW50aWF0aW9uKCkpCisvLy8gICBtYXRjaGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIG9mIFg8QT4uCisvLy8KKy8vLyBCdXQgZ2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+ICBjbGFzcyBYIHt9OyBjbGFzcyBBIHt9OworLy8vICAgdGVtcGxhdGUgPD4gY2xhc3MgWDxBPiB7fTsgWDxBPiB4OworLy8vIFxlbmRjb2RlCisvLy8gY3h4UmVjb3JkRGVjbChoYXNOYW1lKCI6OlgiKSwgaXNUZW1wbGF0ZUluc3RhbnRpYXRpb24oKSkKKy8vLyAgIGRvZXMgbm90IG1hdGNoLCBhcyBYPEE+IGlzIGFuIGV4cGxpY2l0IHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgorLy8vCisvLy8gVXNhYmxlIGFzOiBNYXRjaGVyPEZ1bmN0aW9uRGVjbD4sIE1hdGNoZXI8VmFyRGVjbD4sIE1hdGNoZXI8Q1hYUmVjb3JkRGVjbD4KK0FTVF9QT0xZTU9SUEhJQ19NQVRDSEVSKGlzVGVtcGxhdGVJbnN0YW50aWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhGdW5jdGlvbkRlY2wsIFZhckRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFJlY29yZERlY2wpKSB7CisgIHJldHVybiAoTm9kZS5nZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpID09IFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb24gfHwKKyAgICAgICAgICBOb2RlLmdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKCkgPT0KKyAgICAgICAgICAgICAgVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlZmluaXRpb24gfHwKKyAgICAgICAgICBOb2RlLmdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKCkgPT0KKyAgICAgICAgICAgICAgVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlY2xhcmF0aW9uKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGRlY2xhcmF0aW9ucyB0aGF0IGFyZSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9ucyBvciBhcmUgaW5zaWRlCisvLy8gdGVtcGxhdGUgaW5zdGFudGlhdGlvbnMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIEEoVCB0KSB7IFQgaTsgfQorLy8vICAgQSgwKTsKKy8vLyAgIEEoMFUpOworLy8vIFxlbmRjb2RlCisvLy8gZnVuY3Rpb25EZWNsKGlzSW5zdGFudGlhdGVkKCkpCisvLy8gICBtYXRjaGVzICdBKGludCkgey4uLn07JyBhbmQgJ0EodW5zaWduZWQpIHsuLi59Jy4KK0FTVF9NQVRDSEVSX0ZVTkNUSU9OKGludGVybmFsOjpNYXRjaGVyPERlY2w+LCBpc0luc3RhbnRpYXRlZCkgeworICBhdXRvIElzSW5zdGFudGlhdGlvbiA9IGRlY2woYW55T2YoY3h4UmVjb3JkRGVjbChpc1RlbXBsYXRlSW5zdGFudGlhdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRGVjbChpc1RlbXBsYXRlSW5zdGFudGlhdGlvbigpKSkpOworICByZXR1cm4gZGVjbChhbnlPZihJc0luc3RhbnRpYXRpb24sIGhhc0FuY2VzdG9yKElzSW5zdGFudGlhdGlvbikpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHN0YXRlbWVudHMgaW5zaWRlIG9mIGEgdGVtcGxhdGUgaW5zdGFudGlhdGlvbi4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGludCBqOworLy8vICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBBKFQgdCkgeyBUIGk7IGogKz0gNDI7fQorLy8vICAgQSgwKTsKKy8vLyAgIEEoMFUpOworLy8vIFxlbmRjb2RlCisvLy8gZGVjbFN0bXQoaXNJblRlbXBsYXRlSW5zdGFudGlhdGlvbigpKQorLy8vICAgbWF0Y2hlcyAnaW50IGk7JyBhbmQgJ3Vuc2lnbmVkIGknLgorLy8vIHVubGVzcyhzdG10KGlzSW5UZW1wbGF0ZUluc3RhbnRpYXRpb24oKSkpCisvLy8gICB3aWxsIE5PVCBtYXRjaCBqICs9IDQyOyBhcyBpdCdzIHNoYXJlZCBiZXR3ZWVuIHRoZSB0ZW1wbGF0ZSBkZWZpbml0aW9uIGFuZAorLy8vICAgaW5zdGFudGlhdGlvbi4KK0FTVF9NQVRDSEVSX0ZVTkNUSU9OKGludGVybmFsOjpNYXRjaGVyPFN0bXQ+LCBpc0luVGVtcGxhdGVJbnN0YW50aWF0aW9uKSB7CisgIHJldHVybiBzdG10KAorICAgICAgaGFzQW5jZXN0b3IoZGVjbChhbnlPZihjeHhSZWNvcmREZWNsKGlzVGVtcGxhdGVJbnN0YW50aWF0aW9uKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkRlY2woaXNUZW1wbGF0ZUluc3RhbnRpYXRpb24oKSkpKSkpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgZXhwbGljaXQgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIG9mIGZ1bmN0aW9uLCBjbGFzcywgb3IKKy8vLyBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlIHRlbXBsYXRlIGluc3RhbnRpYXRpb25zLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBBKFQgdCkgeyB9CisvLy8gICB0ZW1wbGF0ZTw+IHZvaWQgQShpbnQgTikgeyB9CisvLy8gXGVuZGNvZGUKKy8vLyBmdW5jdGlvbkRlY2woaXNFeHBsaWNpdFRlbXBsYXRlU3BlY2lhbGl6YXRpb24oKSkKKy8vLyAgIG1hdGNoZXMgdGhlIHNwZWNpYWxpemF0aW9uIEE8aW50PigpLgorLy8vCisvLy8gVXNhYmxlIGFzOiBNYXRjaGVyPEZ1bmN0aW9uRGVjbD4sIE1hdGNoZXI8VmFyRGVjbD4sIE1hdGNoZXI8Q1hYUmVjb3JkRGVjbD4KK0FTVF9QT0xZTU9SUEhJQ19NQVRDSEVSKGlzRXhwbGljaXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhGdW5jdGlvbkRlY2wsIFZhckRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFJlY29yZERlY2wpKSB7CisgIHJldHVybiAoTm9kZS5nZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpID09IFRTS19FeHBsaWNpdFNwZWNpYWxpemF0aW9uKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIFxjIFR5cGVMb2NzIGZvciB3aGljaCB0aGUgZ2l2ZW4gaW5uZXIKKy8vLyBRdWFsVHlwZS1tYXRjaGVyIG1hdGNoZXMuCitBU1RfTUFUQ0hFUl9GVU5DVElPTl9QX09WRVJMT0FEKGludGVybmFsOjpCaW5kYWJsZU1hdGNoZXI8VHlwZUxvYz4sIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8UXVhbFR5cGU+LCBJbm5lck1hdGNoZXIsIDApIHsKKyAgcmV0dXJuIGludGVybmFsOjpCaW5kYWJsZU1hdGNoZXI8VHlwZUxvYz4oCisgICAgICBuZXcgaW50ZXJuYWw6OlR5cGVMb2NUeXBlTWF0Y2hlcihJbm5lck1hdGNoZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHR5cGUgXGMgYm9vbC4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgc3RydWN0IFMgeyBib29sIGZ1bmMoKTsgfTsKKy8vLyBcZW5kY29kZQorLy8vIGZ1bmN0aW9uRGVjbChyZXR1cm5zKGJvb2xlYW5UeXBlKCkpKQorLy8vICAgbWF0Y2hlcyAiYm9vbCBmdW5jKCk7IgorQVNUX01BVENIRVIoVHlwZSwgYm9vbGVhblR5cGUpIHsKKyAgcmV0dXJuIE5vZGUuaXNCb29sZWFuVHlwZSgpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgdHlwZSBcYyB2b2lkLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICBzdHJ1Y3QgUyB7IHZvaWQgZnVuYygpOyB9OworLy8vIFxlbmRjb2RlCisvLy8gZnVuY3Rpb25EZWNsKHJldHVybnModm9pZFR5cGUoKSkpCisvLy8gICBtYXRjaGVzICJ2b2lkIGZ1bmMoKTsiCitBU1RfTUFUQ0hFUihUeXBlLCB2b2lkVHlwZSkgeworICByZXR1cm4gTm9kZS5pc1ZvaWRUeXBlKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVHlwZT4KK3VzaW5nIEFzdFR5cGVNYXRjaGVyID0gaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxUeXBlLCBOb2RlVHlwZT47CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBidWlsdGluIFR5cGVzLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgc3RydWN0IEEge307CisvLy8gICBBIGE7CisvLy8gICBpbnQgYjsKKy8vLyAgIGZsb2F0IGM7CisvLy8gICBib29sIGQ7CisvLy8gXGVuZGNvZGUKKy8vLyBidWlsdGluVHlwZSgpCisvLy8gICBtYXRjaGVzICJpbnQgYiIsICJmbG9hdCBjIiBhbmQgImJvb2wgZCIKK2V4dGVybiBjb25zdCBBc3RUeXBlTWF0Y2hlcjxCdWlsdGluVHlwZT4gYnVpbHRpblR5cGU7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhbGwga2luZHMgb2YgYXJyYXlzLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgaW50IGFbXSA9IHsgMiwgMyB9OworLy8vICAgaW50IGJbNF07CisvLy8gICB2b2lkIGYoKSB7IGludCBjW2FbMF1dOyB9CisvLy8gXGVuZGNvZGUKKy8vLyBhcnJheVR5cGUoKQorLy8vICAgbWF0Y2hlcyAiaW50IGFbXSIsICJpbnQgYls0XSIgYW5kICJpbnQgY1thWzBdXSI7CitleHRlcm4gY29uc3QgQXN0VHlwZU1hdGNoZXI8QXJyYXlUeXBlPiBhcnJheVR5cGU7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBDOTkgY29tcGxleCB0eXBlcy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIF9Db21wbGV4IGZsb2F0IGY7CisvLy8gXGVuZGNvZGUKKy8vLyBjb21wbGV4VHlwZSgpCisvLy8gICBtYXRjaGVzICJfQ29tcGxleCBmbG9hdCBmIgorZXh0ZXJuIGNvbnN0IEFzdFR5cGVNYXRjaGVyPENvbXBsZXhUeXBlPiBjb21wbGV4VHlwZTsKKworLy8vIFxicmllZiBNYXRjaGVzIGFueSByZWFsIGZsb2F0aW5nLXBvaW50IHR5cGUgKGZsb2F0LCBkb3VibGUsIGxvbmcgZG91YmxlKS4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGludCBpOworLy8vICAgZmxvYXQgZjsKKy8vLyBcZW5kY29kZQorLy8vIHJlYWxGbG9hdGluZ1BvaW50VHlwZSgpCisvLy8gICBtYXRjaGVzICJmbG9hdCBmIiBidXQgbm90ICJpbnQgaSIKK0FTVF9NQVRDSEVSKFR5cGUsIHJlYWxGbG9hdGluZ1BvaW50VHlwZSkgeworICByZXR1cm4gTm9kZS5pc1JlYWxGbG9hdGluZ1R5cGUoKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGFycmF5cyBhbmQgQzk5IGNvbXBsZXggdHlwZXMgdGhhdCBoYXZlIGEgc3BlY2lmaWMgZWxlbWVudAorLy8vIHR5cGUuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBzdHJ1Y3QgQSB7fTsKKy8vLyAgIEEgYVs3XTsKKy8vLyAgIGludCBiWzddOworLy8vIFxlbmRjb2RlCisvLy8gYXJyYXlUeXBlKGhhc0VsZW1lbnRUeXBlKGJ1aWx0aW5UeXBlKCkpKQorLy8vICAgbWF0Y2hlcyAiaW50IGJbN10iCisvLy8KKy8vLyBVc2FibGUgYXM6IE1hdGNoZXI8QXJyYXlUeXBlPiwgTWF0Y2hlcjxDb21wbGV4VHlwZT4KK0FTVF9UWVBFTE9DX1RSQVZFUlNFX01BVENIRVJfREVDTChoYXNFbGVtZW50VHlwZSwgZ2V0RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RfUE9MWU1PUlBISUNfU1VQUE9SVEVEX1RZUEVTKEFycmF5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXhUeXBlKSk7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBDIGFycmF5cyB3aXRoIGEgc3BlY2lmaWVkIGNvbnN0YW50IHNpemUuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB2b2lkKCkgeworLy8vICAgICBpbnQgYVsyXTsKKy8vLyAgICAgaW50IGJbXSA9IHsgMiwgMyB9OworLy8vICAgICBpbnQgY1tiWzBdXTsKKy8vLyAgIH0KKy8vLyBcZW5kY29kZQorLy8vIGNvbnN0YW50QXJyYXlUeXBlKCkKKy8vLyAgIG1hdGNoZXMgImludCBhWzJdIgorZXh0ZXJuIGNvbnN0IEFzdFR5cGVNYXRjaGVyPENvbnN0YW50QXJyYXlUeXBlPiBjb25zdGFudEFycmF5VHlwZTsKKworLy8vIFxicmllZiBNYXRjaGVzIG5vZGVzIHRoYXQgaGF2ZSB0aGUgc3BlY2lmaWVkIHNpemUuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBpbnQgYVs0Ml07CisvLy8gICBpbnQgYlsyICogMjFdOworLy8vICAgaW50IGNbNDFdLCBkWzQzXTsKKy8vLyAgIGNoYXIgKnMgPSAiYWJjZCI7CisvLy8gICB3Y2hhcl90ICp3cyA9IEwiYWJjZCI7CisvLy8gICBjaGFyICp3ID0gImEiOworLy8vIFxlbmRjb2RlCisvLy8gY29uc3RhbnRBcnJheVR5cGUoaGFzU2l6ZSg0MikpCisvLy8gICBtYXRjaGVzICJpbnQgYVs0Ml0iIGFuZCAiaW50IGJbMiAqIDIxXSIKKy8vLyBzdHJpbmdMaXRlcmFsKGhhc1NpemUoNCkpCisvLy8gICBtYXRjaGVzICJhYmNkIiwgTCJhYmNkIgorQVNUX1BPTFlNT1JQSElDX01BVENIRVJfUChoYXNTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RfUE9MWU1PUlBISUNfU1VQUE9SVEVEX1RZUEVTKENvbnN0YW50QXJyYXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCwgTikgeworICByZXR1cm4gaW50ZXJuYWw6Okhhc1NpemVNYXRjaGVyPE5vZGVUeXBlPjo6aGFzU2l6ZShOb2RlLCBOKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIEMrKyBhcnJheXMgd2hvc2Ugc2l6ZSBpcyBhIHZhbHVlLWRlcGVuZGVudCBleHByZXNzaW9uLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IFNpemU+CisvLy8gICBjbGFzcyBhcnJheSB7CisvLy8gICAgIFQgZGF0YVtTaXplXTsKKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKKy8vLyBkZXBlbmRlbnRTaXplZEFycmF5VHlwZQorLy8vICAgbWF0Y2hlcyAiVCBkYXRhW1NpemVdIgorZXh0ZXJuIGNvbnN0IEFzdFR5cGVNYXRjaGVyPERlcGVuZGVudFNpemVkQXJyYXlUeXBlPiBkZXBlbmRlbnRTaXplZEFycmF5VHlwZTsKKworLy8vIFxicmllZiBNYXRjaGVzIEMgYXJyYXlzIHdpdGggdW5zcGVjaWZpZWQgc2l6ZS4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGludCBhW10gPSB7IDIsIDMgfTsKKy8vLyAgIGludCBiWzQyXTsKKy8vLyAgIHZvaWQgZihpbnQgY1tdKSB7IGludCBkW2FbMF1dOyB9OworLy8vIFxlbmRjb2RlCisvLy8gaW5jb21wbGV0ZUFycmF5VHlwZSgpCisvLy8gICBtYXRjaGVzICJpbnQgYVtdIiBhbmQgImludCBjW10iCitleHRlcm4gY29uc3QgQXN0VHlwZU1hdGNoZXI8SW5jb21wbGV0ZUFycmF5VHlwZT4gaW5jb21wbGV0ZUFycmF5VHlwZTsKKworLy8vIFxicmllZiBNYXRjaGVzIEMgYXJyYXlzIHdpdGggYSBzcGVjaWZpZWQgc2l6ZSB0aGF0IGlzIG5vdCBhbgorLy8vIGludGVnZXItY29uc3RhbnQtZXhwcmVzc2lvbi4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHZvaWQgZigpIHsKKy8vLyAgICAgaW50IGFbXSA9IHsgMiwgMyB9CisvLy8gICAgIGludCBiWzQyXTsKKy8vLyAgICAgaW50IGNbYVswXV07CisvLy8gICB9CisvLy8gXGVuZGNvZGUKKy8vLyB2YXJpYWJsZUFycmF5VHlwZSgpCisvLy8gICBtYXRjaGVzICJpbnQgY1thWzBdXSIKK2V4dGVybiBjb25zdCBBc3RUeXBlTWF0Y2hlcjxWYXJpYWJsZUFycmF5VHlwZT4gdmFyaWFibGVBcnJheVR5cGU7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBcYyBWYXJpYWJsZUFycmF5VHlwZSBub2RlcyB0aGF0IGhhdmUgYSBzcGVjaWZpYyBzaXplCisvLy8gZXhwcmVzc2lvbi4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHZvaWQgZihpbnQgYikgeworLy8vICAgICBpbnQgYVtiXTsKKy8vLyAgIH0KKy8vLyBcZW5kY29kZQorLy8vIHZhcmlhYmxlQXJyYXlUeXBlKGhhc1NpemVFeHByKGlnbm9yaW5nSW1wQ2FzdHMoZGVjbFJlZkV4cHIodG8oCisvLy8gICB2YXJEZWNsKGhhc05hbWUoImIiKSkpKSkpKQorLy8vICAgbWF0Y2hlcyAiaW50IGFbYl0iCitBU1RfTUFUQ0hFUl9QKFZhcmlhYmxlQXJyYXlUeXBlLCBoYXNTaXplRXhwciwKKyAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8RXhwcj4sIElubmVyTWF0Y2hlcikgeworICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoKk5vZGUuZ2V0U2l6ZUV4cHIoKSwgRmluZGVyLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGF0b21pYyB0eXBlcy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIF9BdG9taWMoaW50KSBpOworLy8vIFxlbmRjb2RlCisvLy8gYXRvbWljVHlwZSgpCisvLy8gICBtYXRjaGVzICJfQXRvbWljKGludCkgaSIKK2V4dGVybiBjb25zdCBBc3RUeXBlTWF0Y2hlcjxBdG9taWNUeXBlPiBhdG9taWNUeXBlOworCisvLy8gXGJyaWVmIE1hdGNoZXMgYXRvbWljIHR5cGVzIHdpdGggYSBzcGVjaWZpYyB2YWx1ZSB0eXBlLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgX0F0b21pYyhpbnQpIGk7CisvLy8gICBfQXRvbWljKGZsb2F0KSBmOworLy8vIFxlbmRjb2RlCisvLy8gYXRvbWljVHlwZShoYXNWYWx1ZVR5cGUoaXNJbnRlZ2VyKCkpKQorLy8vICBtYXRjaGVzICJfQXRvbWljKGludCkgaSIKKy8vLworLy8vIFVzYWJsZSBhczogTWF0Y2hlcjxBdG9taWNUeXBlPgorQVNUX1RZUEVMT0NfVFJBVkVSU0VfTUFUQ0hFUl9ERUNMKGhhc1ZhbHVlVHlwZSwgZ2V0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhBdG9taWNUeXBlKSk7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyB0eXBlcyBub2RlcyByZXByZXNlbnRpbmcgQysrMTEgYXV0byB0eXBlcy4KKy8vLworLy8vIEdpdmVuOgorLy8vIFxjb2RlCisvLy8gICBhdXRvIG4gPSA0OworLy8vICAgaW50IHZbXSA9IHsgMiwgMyB9CisvLy8gICBmb3IgKGF1dG8gaSA6IHYpIHsgfQorLy8vIFxlbmRjb2RlCisvLy8gYXV0b1R5cGUoKQorLy8vICAgbWF0Y2hlcyAiYXV0byBuIiBhbmQgImF1dG8gaSIKK2V4dGVybiBjb25zdCBBc3RUeXBlTWF0Y2hlcjxBdXRvVHlwZT4gYXV0b1R5cGU7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBcYyBBdXRvVHlwZSBub2RlcyB3aGVyZSB0aGUgZGVkdWNlZCB0eXBlIGlzIGEgc3BlY2lmaWMgdHlwZS4KKy8vLworLy8vIE5vdGU6IFRoZXJlIGlzIG5vIFxjIFR5cGVMb2MgZm9yIHRoZSBkZWR1Y2VkIHR5cGUgYW5kIHRodXMgbm8KKy8vLyBcYyBnZXREZWR1Y2VkTG9jKCkgbWF0Y2hlci4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGF1dG8gYSA9IDE7CisvLy8gICBhdXRvIGIgPSAyLjA7CisvLy8gXGVuZGNvZGUKKy8vLyBhdXRvVHlwZShoYXNEZWR1Y2VkVHlwZShpc0ludGVnZXIoKSkpCisvLy8gICBtYXRjaGVzICJhdXRvIGEiCisvLy8KKy8vLyBVc2FibGUgYXM6IE1hdGNoZXI8QXV0b1R5cGU+CitBU1RfVFlQRV9UUkFWRVJTRV9NQVRDSEVSKGhhc0RlZHVjZWRUeXBlLCBnZXREZWR1Y2VkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhBdXRvVHlwZSkpOworCisvLy8gXGJyaWVmIE1hdGNoZXMgXGMgRnVuY3Rpb25UeXBlIG5vZGVzLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgaW50ICgqZikoaW50KTsKKy8vLyAgIHZvaWQgZygpOworLy8vIFxlbmRjb2RlCisvLy8gZnVuY3Rpb25UeXBlKCkKKy8vLyAgIG1hdGNoZXMgImludCAoKmYpKGludCkiIGFuZCB0aGUgdHlwZSBvZiAiZyIuCitleHRlcm4gY29uc3QgQXN0VHlwZU1hdGNoZXI8RnVuY3Rpb25UeXBlPiBmdW5jdGlvblR5cGU7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBcYyBGdW5jdGlvblByb3RvVHlwZSBub2Rlcy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGludCAoKmYpKGludCk7CisvLy8gICB2b2lkIGcoKTsKKy8vLyBcZW5kY29kZQorLy8vIGZ1bmN0aW9uUHJvdG9UeXBlKCkKKy8vLyAgIG1hdGNoZXMgImludCAoKmYpKGludCkiIGFuZCB0aGUgdHlwZSBvZiAiZyIgaW4gQysrIG1vZGUuCisvLy8gICBJbiBDIG1vZGUsICJnIiBpcyBub3QgbWF0Y2hlZCBiZWNhdXNlIGl0IGRvZXMgbm90IGNvbnRhaW4gYSBwcm90b3R5cGUuCitleHRlcm4gY29uc3QgQXN0VHlwZU1hdGNoZXI8RnVuY3Rpb25Qcm90b1R5cGU+IGZ1bmN0aW9uUHJvdG9UeXBlOworCisvLy8gXGJyaWVmIE1hdGNoZXMgXGMgUGFyZW5UeXBlIG5vZGVzLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgaW50ICgqcHRyX3RvX2FycmF5KVs0XTsKKy8vLyAgIGludCAqYXJyYXlfb2ZfcHRyc1s0XTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gXGMgdmFyRGVjbChoYXNUeXBlKHBvaW50c1RvKHBhcmVuVHlwZSgpKSkpIG1hdGNoZXMgXGMgcHRyX3RvX2FycmF5IGJ1dCBub3QKKy8vLyBcYyBhcnJheV9vZl9wdHJzLgorZXh0ZXJuIGNvbnN0IEFzdFR5cGVNYXRjaGVyPFBhcmVuVHlwZT4gcGFyZW5UeXBlOworCisvLy8gXGJyaWVmIE1hdGNoZXMgXGMgUGFyZW5UeXBlIG5vZGVzIHdoZXJlIHRoZSBpbm5lciB0eXBlIGlzIGEgc3BlY2lmaWMgdHlwZS4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGludCAoKnB0cl90b19hcnJheSlbNF07CisvLy8gICBpbnQgKCpwdHJfdG9fZnVuYykoaW50KTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gXGMgdmFyRGVjbChoYXNUeXBlKHBvaW50c1RvKHBhcmVuVHlwZShpbm5lclR5cGUoZnVuY3Rpb25UeXBlKCkpKSkpKSBtYXRjaGVzCisvLy8gXGMgcHRyX3RvX2Z1bmMgYnV0IG5vdCBcYyBwdHJfdG9fYXJyYXkuCisvLy8KKy8vLyBVc2FibGUgYXM6IE1hdGNoZXI8UGFyZW5UeXBlPgorQVNUX1RZUEVfVFJBVkVSU0VfTUFUQ0hFUihpbm5lclR5cGUsIGdldElubmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhQYXJlblR5cGUpKTsKKworLy8vIFxicmllZiBNYXRjaGVzIGJsb2NrIHBvaW50ZXIgdHlwZXMsIGkuZS4gdHlwZXMgc3ludGFjdGljYWxseSByZXByZXNlbnRlZCBhcworLy8vICJ2b2lkICheKShpbnQpIi4KKy8vLworLy8vIFRoZSBcYyBwb2ludGVlIGlzIGFsd2F5cyByZXF1aXJlZCB0byBiZSBhIFxjIEZ1bmN0aW9uVHlwZS4KK2V4dGVybiBjb25zdCBBc3RUeXBlTWF0Y2hlcjxCbG9ja1BvaW50ZXJUeXBlPiBibG9ja1BvaW50ZXJUeXBlOworCisvLy8gXGJyaWVmIE1hdGNoZXMgbWVtYmVyIHBvaW50ZXIgdHlwZXMuCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgc3RydWN0IEEgeyBpbnQgaTsgfQorLy8vICAgQTo6KiBwdHIgPSBBOjppOworLy8vIFxlbmRjb2RlCisvLy8gbWVtYmVyUG9pbnRlclR5cGUoKQorLy8vICAgbWF0Y2hlcyAiQTo6KiBwdHIiCitleHRlcm4gY29uc3QgQXN0VHlwZU1hdGNoZXI8TWVtYmVyUG9pbnRlclR5cGU+IG1lbWJlclBvaW50ZXJUeXBlOworCisvLy8gXGJyaWVmIE1hdGNoZXMgcG9pbnRlciB0eXBlcywgYnV0IGRvZXMgbm90IG1hdGNoIE9iamVjdGl2ZS1DIG9iamVjdCBwb2ludGVyCisvLy8gdHlwZXMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBpbnQgKmE7CisvLy8gICBpbnQgJmIgPSAqYTsKKy8vLyAgIGludCBjID0gNTsKKy8vLworLy8vICAgQGludGVyZmFjZSBGb28KKy8vLyAgIEBlbmQKKy8vLyAgIEZvbyAqZjsKKy8vLyBcZW5kY29kZQorLy8vIHBvaW50ZXJUeXBlKCkKKy8vLyAgIG1hdGNoZXMgImludCAqYSIsIGJ1dCBkb2VzIG5vdCBtYXRjaCAiRm9vICpmIi4KK2V4dGVybiBjb25zdCBBc3RUeXBlTWF0Y2hlcjxQb2ludGVyVHlwZT4gcG9pbnRlclR5cGU7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhbiBPYmplY3RpdmUtQyBvYmplY3QgcG9pbnRlciB0eXBlLCB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbQorLy8vIGEgcG9pbnRlciB0eXBlLCBkZXNwaXRlIGJlaW5nIHN5bnRhY3RpY2FsbHkgc2ltaWxhci4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGludCAqYTsKKy8vLworLy8vICAgQGludGVyZmFjZSBGb28KKy8vLyAgIEBlbmQKKy8vLyAgIEZvbyAqZjsKKy8vLyBcZW5kY29kZQorLy8vIHBvaW50ZXJUeXBlKCkKKy8vLyAgIG1hdGNoZXMgIkZvbyAqZiIsIGJ1dCBkb2VzIG5vdCBtYXRjaCAiaW50ICphIi4KK2V4dGVybiBjb25zdCBBc3RUeXBlTWF0Y2hlcjxPYmpDT2JqZWN0UG9pbnRlclR5cGU+IG9iamNPYmplY3RQb2ludGVyVHlwZTsKKworLy8vIFxicmllZiBNYXRjaGVzIGJvdGggbHZhbHVlIGFuZCBydmFsdWUgcmVmZXJlbmNlIHR5cGVzLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgaW50ICphOworLy8vICAgaW50ICZiID0gKmE7CisvLy8gICBpbnQgJiZjID0gMTsKKy8vLyAgIGF1dG8gJmQgPSBiOworLy8vICAgYXV0byAmJmUgPSBjOworLy8vICAgYXV0byAmJmYgPSAyOworLy8vICAgaW50IGcgPSA1OworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBcYyByZWZlcmVuY2VUeXBlKCkgbWF0Y2hlcyB0aGUgdHlwZXMgb2YgXGMgYiwgXGMgYywgXGMgZCwgXGMgZSwgYW5kIFxjIGYuCitleHRlcm4gY29uc3QgQXN0VHlwZU1hdGNoZXI8UmVmZXJlbmNlVHlwZT4gcmVmZXJlbmNlVHlwZTsKKworLy8vIFxicmllZiBNYXRjaGVzIGx2YWx1ZSByZWZlcmVuY2UgdHlwZXMuCisvLy8KKy8vLyBHaXZlbjoKKy8vLyBcY29kZQorLy8vICAgaW50ICphOworLy8vICAgaW50ICZiID0gKmE7CisvLy8gICBpbnQgJiZjID0gMTsKKy8vLyAgIGF1dG8gJmQgPSBiOworLy8vICAgYXV0byAmJmUgPSBjOworLy8vICAgYXV0byAmJmYgPSAyOworLy8vICAgaW50IGcgPSA1OworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBcYyBsVmFsdWVSZWZlcmVuY2VUeXBlKCkgbWF0Y2hlcyB0aGUgdHlwZXMgb2YgXGMgYiwgXGMgZCwgYW5kIFxjIGUuIFxjIGUgaXMKKy8vLyBtYXRjaGVkIHNpbmNlIHRoZSB0eXBlIGlzIGRlZHVjZWQgYXMgaW50JiBieSByZWZlcmVuY2UgY29sbGFwc2luZyBydWxlcy4KK2V4dGVybiBjb25zdCBBc3RUeXBlTWF0Y2hlcjxMVmFsdWVSZWZlcmVuY2VUeXBlPiBsVmFsdWVSZWZlcmVuY2VUeXBlOworCisvLy8gXGJyaWVmIE1hdGNoZXMgcnZhbHVlIHJlZmVyZW5jZSB0eXBlcy4KKy8vLworLy8vIEdpdmVuOgorLy8vIFxjb2RlCisvLy8gICBpbnQgKmE7CisvLy8gICBpbnQgJmIgPSAqYTsKKy8vLyAgIGludCAmJmMgPSAxOworLy8vICAgYXV0byAmZCA9IGI7CisvLy8gICBhdXRvICYmZSA9IGM7CisvLy8gICBhdXRvICYmZiA9IDI7CisvLy8gICBpbnQgZyA9IDU7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFxjIHJWYWx1ZVJlZmVyZW5jZVR5cGUoKSBtYXRjaGVzIHRoZSB0eXBlcyBvZiBcYyBjIGFuZCBcYyBmLiBcYyBlIGlzIG5vdAorLy8vIG1hdGNoZWQgYXMgaXQgaXMgZGVkdWNlZCB0byBpbnQmIGJ5IHJlZmVyZW5jZSBjb2xsYXBzaW5nIHJ1bGVzLgorZXh0ZXJuIGNvbnN0IEFzdFR5cGVNYXRjaGVyPFJWYWx1ZVJlZmVyZW5jZVR5cGU+IHJWYWx1ZVJlZmVyZW5jZVR5cGU7CisKKy8vLyBcYnJpZWYgTmFycm93cyBQb2ludGVyVHlwZSAoYW5kIHNpbWlsYXIpIG1hdGNoZXJzIHRvIHRob3NlIHdoZXJlIHRoZQorLy8vIFxjIHBvaW50ZWUgbWF0Y2hlcyBhIGdpdmVuIG1hdGNoZXIuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBpbnQgKmE7CisvLy8gICBpbnQgY29uc3QgKmI7CisvLy8gICBmbG9hdCBjb25zdCAqZjsKKy8vLyBcZW5kY29kZQorLy8vIHBvaW50ZXJUeXBlKHBvaW50ZWUoaXNDb25zdFF1YWxpZmllZCgpLCBpc0ludGVnZXIoKSkpCisvLy8gICBtYXRjaGVzICJpbnQgY29uc3QgKmIiCisvLy8KKy8vLyBVc2FibGUgYXM6IE1hdGNoZXI8QmxvY2tQb2ludGVyVHlwZT4sIE1hdGNoZXI8TWVtYmVyUG9pbnRlclR5cGU+LAorLy8vICAgTWF0Y2hlcjxQb2ludGVyVHlwZT4sIE1hdGNoZXI8UmVmZXJlbmNlVHlwZT4KK0FTVF9UWVBFTE9DX1RSQVZFUlNFX01BVENIRVJfREVDTCgKKyAgICBwb2ludGVlLCBnZXRQb2ludGVlLAorICAgIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoQmxvY2tQb2ludGVyVHlwZSwgTWVtYmVyUG9pbnRlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyVHlwZSwgUmVmZXJlbmNlVHlwZSkpOworCisvLy8gXGJyaWVmIE1hdGNoZXMgdHlwZWRlZiB0eXBlcy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHR5cGVkZWYgaW50IFg7CisvLy8gXGVuZGNvZGUKKy8vLyB0eXBlZGVmVHlwZSgpCisvLy8gICBtYXRjaGVzICJ0eXBlZGVmIGludCBYIgorZXh0ZXJuIGNvbnN0IEFzdFR5cGVNYXRjaGVyPFR5cGVkZWZUeXBlPiB0eXBlZGVmVHlwZTsKKworLy8vIFxicmllZiBNYXRjaGVzIGVudW0gdHlwZXMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBlbnVtIEMgeyBHcmVlbiB9OworLy8vICAgZW51bSBjbGFzcyBTIHsgUmVkIH07CisvLy8KKy8vLyAgIEMgYzsKKy8vLyAgIFMgczsKKy8vLyBcZW5kY29kZQorLy8KKy8vLyBcYyBlbnVtVHlwZSgpIG1hdGNoZXMgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBvZiBib3RoIFxjIGMgYW5kCisvLy8gXGMgcy4KK2V4dGVybiBjb25zdCBBc3RUeXBlTWF0Y2hlcjxFbnVtVHlwZT4gZW51bVR5cGU7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0eXBlcy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorLy8vICAgY2xhc3MgQyB7IH07CisvLy8KKy8vLyAgIHRlbXBsYXRlIGNsYXNzIEM8aW50PjsgIC8vIEEKKy8vLyAgIEM8Y2hhcj4gdmFyOyAgICAgICAgICAgIC8vIEIKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gXGMgdGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUoKSBtYXRjaGVzIHRoZSB0eXBlIG9mIHRoZSBleHBsaWNpdAorLy8vIGluc3RhbnRpYXRpb24gaW4gXGMgQSBhbmQgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGluIFxjIEIuCitleHRlcm4gY29uc3QgQXN0VHlwZU1hdGNoZXI8VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGU+CisgICAgdGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGU7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyB0eXBlcyBub2RlcyByZXByZXNlbnRpbmcgdW5hcnkgdHlwZSB0cmFuc2Zvcm1hdGlvbnMuCisvLy8KKy8vLyBHaXZlbjoKKy8vLyBcY29kZQorLy8vICAgdHlwZWRlZiBfX3VuZGVybHlpbmdfdHlwZShUKSB0eXBlOworLy8vIFxlbmRjb2RlCisvLy8gdW5hcnlUcmFuc2Zvcm1UeXBlKCkKKy8vLyAgIG1hdGNoZXMgIl9fdW5kZXJseWluZ190eXBlKFQpIgorZXh0ZXJuIGNvbnN0IEFzdFR5cGVNYXRjaGVyPFVuYXJ5VHJhbnNmb3JtVHlwZT4gdW5hcnlUcmFuc2Zvcm1UeXBlOworCisvLy8gXGJyaWVmIE1hdGNoZXMgcmVjb3JkIHR5cGVzIChlLmcuIHN0cnVjdHMsIGNsYXNzZXMpLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgY2xhc3MgQyB7fTsKKy8vLyAgIHN0cnVjdCBTIHt9OworLy8vCisvLy8gICBDIGM7CisvLy8gICBTIHM7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFxjIHJlY29yZFR5cGUoKSBtYXRjaGVzIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgb2YgYm90aCBcYyBjCisvLy8gYW5kIFxjIHMuCitleHRlcm4gY29uc3QgQXN0VHlwZU1hdGNoZXI8UmVjb3JkVHlwZT4gcmVjb3JkVHlwZTsKKworLy8vIFxicmllZiBNYXRjaGVzIHRhZyB0eXBlcyAocmVjb3JkIGFuZCBlbnVtIHR5cGVzKS4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGVudW0gRSB7fTsKKy8vLyAgIGNsYXNzIEMge307CisvLy8KKy8vLyAgIEUgZTsKKy8vLyAgIEMgYzsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gXGMgdGFnVHlwZSgpIG1hdGNoZXMgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBvZiBib3RoIFxjIGUKKy8vLyBhbmQgXGMgYy4KK2V4dGVybiBjb25zdCBBc3RUeXBlTWF0Y2hlcjxUYWdUeXBlPiB0YWdUeXBlOworCisvLy8gXGJyaWVmIE1hdGNoZXMgdHlwZXMgc3BlY2lmaWVkIHdpdGggYW4gZWxhYm9yYXRlZCB0eXBlIGtleXdvcmQgb3Igd2l0aCBhCisvLy8gcXVhbGlmaWVkIG5hbWUuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBuYW1lc3BhY2UgTiB7CisvLy8gICAgIG5hbWVzcGFjZSBNIHsKKy8vLyAgICAgICBjbGFzcyBEIHt9OworLy8vICAgICB9CisvLy8gICB9CisvLy8gICBjbGFzcyBDIHt9OworLy8vCisvLy8gICBjbGFzcyBDIGM7CisvLy8gICBOOjpNOjpEIGQ7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFxjIGVsYWJvcmF0ZWRUeXBlKCkgbWF0Y2hlcyB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb25zIG9mIGJvdGgKKy8vLyBcYyBjIGFuZCBcYyBkLgorZXh0ZXJuIGNvbnN0IEFzdFR5cGVNYXRjaGVyPEVsYWJvcmF0ZWRUeXBlPiBlbGFib3JhdGVkVHlwZTsKKworLy8vIFxicmllZiBNYXRjaGVzIEVsYWJvcmF0ZWRUeXBlcyB3aG9zZSBxdWFsaWZpZXIsIGEgTmVzdGVkTmFtZVNwZWNpZmllciwKKy8vLyBtYXRjaGVzIFxjIElubmVyTWF0Y2hlciBpZiB0aGUgcXVhbGlmaWVyIGV4aXN0cy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIG5hbWVzcGFjZSBOIHsKKy8vLyAgICAgbmFtZXNwYWNlIE0geworLy8vICAgICAgIGNsYXNzIEQge307CisvLy8gICAgIH0KKy8vLyAgIH0KKy8vLyAgIE46Ok06OkQgZDsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gXGMgZWxhYm9yYXRlZFR5cGUoaGFzUXVhbGlmaWVyKGhhc1ByZWZpeChzcGVjaWZpZXNOYW1lc3BhY2UoaGFzTmFtZSgiTiIpKSkpCisvLy8gbWF0Y2hlcyB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gb2YgXGMgZC4KK0FTVF9NQVRDSEVSX1AoRWxhYm9yYXRlZFR5cGUsIGhhc1F1YWxpZmllciwKKyAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8TmVzdGVkTmFtZVNwZWNpZmllcj4sIElubmVyTWF0Y2hlcikgeworICBpZiAoY29uc3QgTmVzdGVkTmFtZVNwZWNpZmllciAqUXVhbGlmaWVyID0gTm9kZS5nZXRRdWFsaWZpZXIoKSkKKyAgICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoKlF1YWxpZmllciwgRmluZGVyLCBCdWlsZGVyKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBFbGFib3JhdGVkVHlwZXMgd2hvc2UgbmFtZWQgdHlwZSBtYXRjaGVzIFxjIElubmVyTWF0Y2hlci4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIG5hbWVzcGFjZSBOIHsKKy8vLyAgICAgbmFtZXNwYWNlIE0geworLy8vICAgICAgIGNsYXNzIEQge307CisvLy8gICAgIH0KKy8vLyAgIH0KKy8vLyAgIE46Ok06OkQgZDsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gXGMgZWxhYm9yYXRlZFR5cGUobmFtZXNUeXBlKHJlY29yZFR5cGUoCisvLy8gaGFzRGVjbGFyYXRpb24obmFtZWREZWNsKGhhc05hbWUoIkQiKSkpKSkpIG1hdGNoZXMgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlCisvLy8gZGVjbGFyYXRpb24gb2YgXGMgZC4KK0FTVF9NQVRDSEVSX1AoRWxhYm9yYXRlZFR5cGUsIG5hbWVzVHlwZSwgaW50ZXJuYWw6Ok1hdGNoZXI8UXVhbFR5cGU+LAorICAgICAgICAgICAgICBJbm5lck1hdGNoZXIpIHsKKyAgcmV0dXJuIElubmVyTWF0Y2hlci5tYXRjaGVzKE5vZGUuZ2V0TmFtZWRUeXBlKCksIEZpbmRlciwgQnVpbGRlcik7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyB0eXBlcyB0aGF0IHJlcHJlc2VudCB0aGUgcmVzdWx0IG9mIHN1YnN0aXR1dGluZyBhIHR5cGUgZm9yIGEKKy8vLyB0ZW1wbGF0ZSB0eXBlIHBhcmFtZXRlci4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorLy8vICAgdm9pZCBGKFQgdCkgeworLy8vICAgICBpbnQgaSA9IDEgKyB0OworLy8vICAgfQorLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBcYyBzdWJzdFRlbXBsYXRlVHlwZVBhcm1UeXBlKCkgbWF0Y2hlcyB0aGUgdHlwZSBvZiAndCcgYnV0IG5vdCAnMScKK2V4dGVybiBjb25zdCBBc3RUeXBlTWF0Y2hlcjxTdWJzdFRlbXBsYXRlVHlwZVBhcm1UeXBlPgorICAgIHN1YnN0VGVtcGxhdGVUeXBlUGFybVR5cGU7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyB0ZW1wbGF0ZSB0eXBlIHBhcmFtZXRlciBzdWJzdGl0dXRpb25zIHRoYXQgaGF2ZSBhIHJlcGxhY2VtZW50CisvLy8gdHlwZSB0aGF0IG1hdGNoZXMgdGhlIHByb3ZpZGVkIG1hdGNoZXIuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKy8vLyAgIGRvdWJsZSBGKFQgdCk7CisvLy8gICBpbnQgaTsKKy8vLyAgIGRvdWJsZSBqID0gRihpKTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gXGMgc3Vic3RUZW1wbGF0ZVR5cGVQYXJtVHlwZShoYXNSZXBsYWNlbWVudFR5cGUodHlwZSgpKSkgbWF0Y2hlcyBpbnQKK0FTVF9UWVBFX1RSQVZFUlNFX01BVENIRVIoCisgICAgaGFzUmVwbGFjZW1lbnRUeXBlLCBnZXRSZXBsYWNlbWVudFR5cGUsCisgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyhTdWJzdFRlbXBsYXRlVHlwZVBhcm1UeXBlKSk7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyB0ZW1wbGF0ZSB0eXBlIHBhcmFtZXRlciB0eXBlcy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBULCBidXQgbm90IGludC4KKy8vLyAgICAgKG1hdGNoZXIgPSB0ZW1wbGF0ZVR5cGVQYXJtVHlwZSgpKQorLy8vIFxjb2RlCisvLy8gICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBmKGludCBpKTsKKy8vLyBcZW5kY29kZQorZXh0ZXJuIGNvbnN0IEFzdFR5cGVNYXRjaGVyPFRlbXBsYXRlVHlwZVBhcm1UeXBlPiB0ZW1wbGF0ZVR5cGVQYXJtVHlwZTsKKworLy8vIFxicmllZiBNYXRjaGVzIGluamVjdGVkIGNsYXNzIG5hbWUgdHlwZXMuCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgUyBzLCBidXQgbm90IFM8VD4gcy4KKy8vLyAgICAgKG1hdGNoZXIgPSBwYXJtVmFyRGVjbChoYXNUeXBlKGluamVjdGVkQ2xhc3NOYW1lVHlwZSgpKSkpCisvLy8gXGNvZGUKKy8vLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgUyB7CisvLy8gICAgIHZvaWQgZihTIHMpOworLy8vICAgICB2b2lkIGcoUzxUPiBzKTsKKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKK2V4dGVybiBjb25zdCBBc3RUeXBlTWF0Y2hlcjxJbmplY3RlZENsYXNzTmFtZVR5cGU+IGluamVjdGVkQ2xhc3NOYW1lVHlwZTsKKworLy8vIFxicmllZiBNYXRjaGVzIGRlY2F5ZWQgdHlwZQorLy8vIEV4YW1wbGUgbWF0Y2hlcyBpW10gaW4gZGVjbGFyYXRpb24gb2YgZi4KKy8vLyAgICAgKG1hdGNoZXIgPSB2YWx1ZURlY2woaGFzVHlwZShkZWNheWVkVHlwZShoYXNEZWNheWVkVHlwZShwb2ludGVyVHlwZSgpKSkpKSkKKy8vLyBFeGFtcGxlIG1hdGNoZXMgaVsxXS4KKy8vLyAgICAgKG1hdGNoZXIgPSBleHByKGhhc1R5cGUoZGVjYXllZFR5cGUoaGFzRGVjYXllZFR5cGUocG9pbnRlclR5cGUoKSkpKSkpCisvLy8gXGNvZGUKKy8vLyAgIHZvaWQgZihpbnQgaVtdKSB7CisvLy8gICAgIGlbMV0gPSAwOworLy8vICAgfQorLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgQXN0VHlwZU1hdGNoZXI8RGVjYXllZFR5cGU+IGRlY2F5ZWRUeXBlOworCisvLy8gXGJyaWVmIE1hdGNoZXMgdGhlIGRlY2F5ZWQgdHlwZSwgd2hvcyBkZWNheWVkIHR5cGUgbWF0Y2hlcyBcYyBJbm5lck1hdGNoZXIKK0FTVF9NQVRDSEVSX1AoRGVjYXllZFR5cGUsIGhhc0RlY2F5ZWRUeXBlLCBpbnRlcm5hbDo6TWF0Y2hlcjxRdWFsVHlwZT4sCisgICAgICAgICAgICAgIElubmVyVHlwZSkgeworICByZXR1cm4gSW5uZXJUeXBlLm1hdGNoZXMoTm9kZS5nZXREZWNheWVkVHlwZSgpLCBGaW5kZXIsIEJ1aWxkZXIpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgZGVjbGFyYXRpb25zIHdob3NlIGRlY2xhcmF0aW9uIGNvbnRleHQsIGludGVycHJldGVkIGFzIGEKKy8vLyBEZWNsLCBtYXRjaGVzIFxjIElubmVyTWF0Y2hlci4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIG5hbWVzcGFjZSBOIHsKKy8vLyAgICAgbmFtZXNwYWNlIE0geworLy8vICAgICAgIGNsYXNzIEQge307CisvLy8gICAgIH0KKy8vLyAgIH0KKy8vLyBcZW5kY29kZQorLy8vCisvLy8gXGMgY3h4UmNvcmREZWNsKGhhc0RlY2xDb250ZXh0KG5hbWVkRGVjbChoYXNOYW1lKCJNIikpKSkgbWF0Y2hlcyB0aGUKKy8vLyBkZWNsYXJhdGlvbiBvZiBcYyBjbGFzcyBcYyBELgorQVNUX01BVENIRVJfUChEZWNsLCBoYXNEZWNsQ29udGV4dCwgaW50ZXJuYWw6Ok1hdGNoZXI8RGVjbD4sIElubmVyTWF0Y2hlcikgeworICBjb25zdCBEZWNsQ29udGV4dCAqREMgPSBOb2RlLmdldERlY2xDb250ZXh0KCk7CisgIGlmICghREMpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIElubmVyTWF0Y2hlci5tYXRjaGVzKCpEZWNsOjpjYXN0RnJvbURlY2xDb250ZXh0KERDKSwgRmluZGVyLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIG5lc3RlZCBuYW1lIHNwZWNpZmllcnMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBuYW1lc3BhY2UgbnMgeworLy8vICAgICBzdHJ1Y3QgQSB7IHN0YXRpYyB2b2lkIGYoKTsgfTsKKy8vLyAgICAgdm9pZCBBOjpmKCkge30KKy8vLyAgICAgdm9pZCBnKCkgeyBBOjpmKCk7IH0KKy8vLyAgIH0KKy8vLyAgIG5zOjpBIGE7CisvLy8gXGVuZGNvZGUKKy8vLyBuZXN0ZWROYW1lU3BlY2lmaWVyKCkKKy8vLyAgIG1hdGNoZXMgIm5zOjoiIGFuZCBib3RoICJBOjoiCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljQWxsT2ZNYXRjaGVyPE5lc3RlZE5hbWVTcGVjaWZpZXI+CisgICAgbmVzdGVkTmFtZVNwZWNpZmllcjsKKworLy8vIFxicmllZiBTYW1lIGFzIFxjIG5lc3RlZE5hbWVTcGVjaWZpZXIgYnV0IG1hdGNoZXMgXGMgTmVzdGVkTmFtZVNwZWNpZmllckxvYy4KK2V4dGVybiBjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNBbGxPZk1hdGNoZXI8TmVzdGVkTmFtZVNwZWNpZmllckxvYz4KKyAgICBuZXN0ZWROYW1lU3BlY2lmaWVyTG9jOworCisvLy8gXGJyaWVmIE1hdGNoZXMgXGMgTmVzdGVkTmFtZVNwZWNpZmllckxvY3MgZm9yIHdoaWNoIHRoZSBnaXZlbiBpbm5lcgorLy8vIE5lc3RlZE5hbWVTcGVjaWZpZXItbWF0Y2hlciBtYXRjaGVzLgorQVNUX01BVENIRVJfRlVOQ1RJT05fUF9PVkVSTE9BRCgKKyAgICBpbnRlcm5hbDo6QmluZGFibGVNYXRjaGVyPE5lc3RlZE5hbWVTcGVjaWZpZXJMb2M+LCBsb2MsCisgICAgaW50ZXJuYWw6Ok1hdGNoZXI8TmVzdGVkTmFtZVNwZWNpZmllcj4sIElubmVyTWF0Y2hlciwgMSkgeworICByZXR1cm4gaW50ZXJuYWw6OkJpbmRhYmxlTWF0Y2hlcjxOZXN0ZWROYW1lU3BlY2lmaWVyTG9jPigKKyAgICAgIG5ldyBpbnRlcm5hbDo6TG9jTWF0Y2hlcjxOZXN0ZWROYW1lU3BlY2lmaWVyTG9jLCBOZXN0ZWROYW1lU3BlY2lmaWVyPigKKyAgICAgICAgICBJbm5lck1hdGNoZXIpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIG5lc3RlZCBuYW1lIHNwZWNpZmllcnMgdGhhdCBzcGVjaWZ5IGEgdHlwZSBtYXRjaGluZyB0aGUKKy8vLyBnaXZlbiBcYyBRdWFsVHlwZSBtYXRjaGVyIHdpdGhvdXQgcXVhbGlmaWVycy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHN0cnVjdCBBIHsgc3RydWN0IEIgeyBzdHJ1Y3QgQyB7fTsgfTsgfTsKKy8vLyAgIEE6OkI6OkMgYzsKKy8vLyBcZW5kY29kZQorLy8vIG5lc3RlZE5hbWVTcGVjaWZpZXIoc3BlY2lmaWVzVHlwZSgKKy8vLyAgIGhhc0RlY2xhcmF0aW9uKGN4eFJlY29yZERlY2woaGFzTmFtZSgiQSIpKSkKKy8vLyApKQorLy8vICAgbWF0Y2hlcyAiQTo6IgorQVNUX01BVENIRVJfUChOZXN0ZWROYW1lU3BlY2lmaWVyLCBzcGVjaWZpZXNUeXBlLAorICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxRdWFsVHlwZT4sIElubmVyTWF0Y2hlcikgeworICBpZiAoIU5vZGUuZ2V0QXNUeXBlKCkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoUXVhbFR5cGUoTm9kZS5nZXRBc1R5cGUoKSwgMCksIEZpbmRlciwgQnVpbGRlcik7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIgbG9jcyB0aGF0IHNwZWNpZnkgYSB0eXBlIG1hdGNoaW5nIHRoZQorLy8vIGdpdmVuIFxjIFR5cGVMb2MuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBzdHJ1Y3QgQSB7IHN0cnVjdCBCIHsgc3RydWN0IEMge307IH07IH07CisvLy8gICBBOjpCOjpDIGM7CisvLy8gXGVuZGNvZGUKKy8vLyBuZXN0ZWROYW1lU3BlY2lmaWVyTG9jKHNwZWNpZmllc1R5cGVMb2MobG9jKHR5cGUoCisvLy8gICBoYXNEZWNsYXJhdGlvbihjeHhSZWNvcmREZWNsKGhhc05hbWUoIkEiKSkpKSkpKQorLy8vICAgbWF0Y2hlcyAiQTo6IgorQVNUX01BVENIRVJfUChOZXN0ZWROYW1lU3BlY2lmaWVyTG9jLCBzcGVjaWZpZXNUeXBlTG9jLAorICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxUeXBlTG9jPiwgSW5uZXJNYXRjaGVyKSB7CisgIHJldHVybiBOb2RlICYmIElubmVyTWF0Y2hlci5tYXRjaGVzKE5vZGUuZ2V0VHlwZUxvYygpLCBGaW5kZXIsIEJ1aWxkZXIpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgb24gdGhlIHByZWZpeCBvZiBhIFxjIE5lc3RlZE5hbWVTcGVjaWZpZXIuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBzdHJ1Y3QgQSB7IHN0cnVjdCBCIHsgc3RydWN0IEMge307IH07IH07CisvLy8gICBBOjpCOjpDIGM7CisvLy8gXGVuZGNvZGUKKy8vLyBuZXN0ZWROYW1lU3BlY2lmaWVyKGhhc1ByZWZpeChzcGVjaWZpZXNUeXBlKGFzU3RyaW5nKCJzdHJ1Y3QgQSIpKSkpIGFuZAorLy8vICAgbWF0Y2hlcyAiQTo6IgorQVNUX01BVENIRVJfUF9PVkVSTE9BRChOZXN0ZWROYW1lU3BlY2lmaWVyLCBoYXNQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpNYXRjaGVyPE5lc3RlZE5hbWVTcGVjaWZpZXI+LCBJbm5lck1hdGNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgIDApIHsKKyAgY29uc3QgTmVzdGVkTmFtZVNwZWNpZmllciAqTmV4dE5vZGUgPSBOb2RlLmdldFByZWZpeCgpOworICBpZiAoIU5leHROb2RlKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIElubmVyTWF0Y2hlci5tYXRjaGVzKCpOZXh0Tm9kZSwgRmluZGVyLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIG9uIHRoZSBwcmVmaXggb2YgYSBcYyBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgc3RydWN0IEEgeyBzdHJ1Y3QgQiB7IHN0cnVjdCBDIHt9OyB9OyB9OworLy8vICAgQTo6Qjo6QyBjOworLy8vIFxlbmRjb2RlCisvLy8gbmVzdGVkTmFtZVNwZWNpZmllckxvYyhoYXNQcmVmaXgobG9jKHNwZWNpZmllc1R5cGUoYXNTdHJpbmcoInN0cnVjdCBBIikpKSkpCisvLy8gICBtYXRjaGVzICJBOjoiCitBU1RfTUFUQ0hFUl9QX09WRVJMT0FEKE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MsIGhhc1ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8TmVzdGVkTmFtZVNwZWNpZmllckxvYz4sIElubmVyTWF0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgICAgMSkgeworICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIE5leHROb2RlID0gTm9kZS5nZXRQcmVmaXgoKTsKKyAgaWYgKCFOZXh0Tm9kZSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBJbm5lck1hdGNoZXIubWF0Y2hlcyhOZXh0Tm9kZSwgRmluZGVyLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIG5lc3RlZCBuYW1lIHNwZWNpZmllcnMgdGhhdCBzcGVjaWZ5IGEgbmFtZXNwYWNlIG1hdGNoaW5nIHRoZQorLy8vIGdpdmVuIG5hbWVzcGFjZSBtYXRjaGVyLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgbmFtZXNwYWNlIG5zIHsgc3RydWN0IEEge307IH0KKy8vLyAgIG5zOjpBIGE7CisvLy8gXGVuZGNvZGUKKy8vLyBuZXN0ZWROYW1lU3BlY2lmaWVyKHNwZWNpZmllc05hbWVzcGFjZShoYXNOYW1lKCJucyIpKSkKKy8vLyAgIG1hdGNoZXMgIm5zOjoiCitBU1RfTUFUQ0hFUl9QKE5lc3RlZE5hbWVTcGVjaWZpZXIsIHNwZWNpZmllc05hbWVzcGFjZSwKKyAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8TmFtZXNwYWNlRGVjbD4sIElubmVyTWF0Y2hlcikgeworICBpZiAoIU5vZGUuZ2V0QXNOYW1lc3BhY2UoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBJbm5lck1hdGNoZXIubWF0Y2hlcygqTm9kZS5nZXRBc05hbWVzcGFjZSgpLCBGaW5kZXIsIEJ1aWxkZXIpOworfQorCisvLy8gXGJyaWVmIE92ZXJsb2FkcyBmb3IgdGhlIFxjIGVxdWFsc05vZGUgbWF0Y2hlci4KKy8vLyBGSVhNRTogSW1wbGVtZW50IGZvciBvdGhlciBub2RlIHR5cGVzLgorLy8vIEB7CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBpZiBhIG5vZGUgZXF1YWxzIGFub3RoZXIgbm9kZS4KKy8vLworLy8vIFxjIERlY2wgaGFzIHBvaW50ZXIgaWRlbnRpdHkgaW4gdGhlIEFTVC4KK0FTVF9NQVRDSEVSX1BfT1ZFUkxPQUQoRGVjbCwgZXF1YWxzTm9kZSwgY29uc3QgRGVjbCosIE90aGVyLCAwKSB7CisgIHJldHVybiAmTm9kZSA9PSBPdGhlcjsKK30KKy8vLyBcYnJpZWYgTWF0Y2hlcyBpZiBhIG5vZGUgZXF1YWxzIGFub3RoZXIgbm9kZS4KKy8vLworLy8vIFxjIFN0bXQgaGFzIHBvaW50ZXIgaWRlbnRpdHkgaW4gdGhlIEFTVC4KK0FTVF9NQVRDSEVSX1BfT1ZFUkxPQUQoU3RtdCwgZXF1YWxzTm9kZSwgY29uc3QgU3RtdCosIE90aGVyLCAxKSB7CisgIHJldHVybiAmTm9kZSA9PSBPdGhlcjsKK30KKy8vLyBcYnJpZWYgTWF0Y2hlcyBpZiBhIG5vZGUgZXF1YWxzIGFub3RoZXIgbm9kZS4KKy8vLworLy8vIFxjIFR5cGUgaGFzIHBvaW50ZXIgaWRlbnRpdHkgaW4gdGhlIEFTVC4KK0FTVF9NQVRDSEVSX1BfT1ZFUkxPQUQoVHlwZSwgZXF1YWxzTm9kZSwgY29uc3QgVHlwZSosIE90aGVyLCAyKSB7CisgICAgcmV0dXJuICZOb2RlID09IE90aGVyOworfQorCisvLy8gQH0KKworLy8vIFxicmllZiBNYXRjaGVzIGVhY2ggY2FzZSBvciBkZWZhdWx0IHN0YXRlbWVudCBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHN3aXRjaAorLy8vIHN0YXRlbWVudC4gVGhpcyBtYXRjaGVyIG1heSBwcm9kdWNlIG11bHRpcGxlIG1hdGNoZXMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBzd2l0Y2ggKDEpIHsgY2FzZSAxOiBjYXNlIDI6IGRlZmF1bHQ6IHN3aXRjaCAoMikgeyBjYXNlIDM6IGNhc2UgNDogOyB9IH0KKy8vLyBcZW5kY29kZQorLy8vIHN3aXRjaFN0bXQoZm9yRWFjaFN3aXRjaENhc2UoY2FzZVN0bXQoKS5iaW5kKCJjIikpKS5iaW5kKCJzIikKKy8vLyAgIG1hdGNoZXMgZm91ciB0aW1lcywgd2l0aCAiYyIgYmluZGluZyBlYWNoIG9mICJjYXNlIDE6IiwgImNhc2UgMjoiLAorLy8vICJjYXNlIDM6IiBhbmQgImNhc2UgNDoiLCBhbmQgInMiIHJlc3BlY3RpdmVseSBiaW5kaW5nICJzd2l0Y2ggKDEpIiwKKy8vLyAic3dpdGNoICgxKSIsICJzd2l0Y2ggKDIpIiBhbmQgInN3aXRjaCAoMikiLgorQVNUX01BVENIRVJfUChTd2l0Y2hTdG10LCBmb3JFYWNoU3dpdGNoQ2FzZSwgaW50ZXJuYWw6Ok1hdGNoZXI8U3dpdGNoQ2FzZT4sCisgICAgICAgICAgICAgIElubmVyTWF0Y2hlcikgeworICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgUmVzdWx0OworICAvLyBGSVhNRTogZ2V0U3dpdGNoQ2FzZUxpc3QoKSBkb2VzIG5vdCBuZWNlc3NhcmlseSBndWFyYW50ZWUgYSBzdGFibGUKKyAgLy8gaXRlcmF0aW9uIG9yZGVyLiBXZSBzaG91bGQgdXNlIHRoZSBtb3JlIGdlbmVyYWwgaXRlcmF0aW5nIG1hdGNoZXJzIG9uY2UKKyAgLy8gdGhleSBhcmUgY2FwYWJsZSBvZiBleHByZXNzaW5nIHRoaXMgbWF0Y2hlciAoZm9yIGV4YW1wbGUsIGl0IHNob3VsZCBpZ25vcmUKKyAgLy8gY2FzZSBzdGF0ZW1lbnRzIGJlbG9uZ2luZyB0byBuZXN0ZWQgc3dpdGNoIHN0YXRlbWVudHMpLgorICBib29sIE1hdGNoZWQgPSBmYWxzZTsKKyAgZm9yIChjb25zdCBTd2l0Y2hDYXNlICpTQyA9IE5vZGUuZ2V0U3dpdGNoQ2FzZUxpc3QoKTsgU0M7CisgICAgICAgU0MgPSBTQy0+Z2V0TmV4dFN3aXRjaENhc2UoKSkgeworICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciBDYXNlQnVpbGRlcigqQnVpbGRlcik7CisgICAgYm9vbCBDYXNlTWF0Y2hlZCA9IElubmVyTWF0Y2hlci5tYXRjaGVzKCpTQywgRmluZGVyLCAmQ2FzZUJ1aWxkZXIpOworICAgIGlmIChDYXNlTWF0Y2hlZCkgeworICAgICAgTWF0Y2hlZCA9IHRydWU7CisgICAgICBSZXN1bHQuYWRkTWF0Y2goQ2FzZUJ1aWxkZXIpOworICAgIH0KKyAgfQorICAqQnVpbGRlciA9IHN0ZDo6bW92ZShSZXN1bHQpOworICByZXR1cm4gTWF0Y2hlZDsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGVhY2ggY29uc3RydWN0b3IgaW5pdGlhbGl6ZXIgaW4gYSBjb25zdHJ1Y3RvciBkZWZpbml0aW9uLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgY2xhc3MgQSB7IEEoKSA6IGkoNDIpLCBqKDQyKSB7fSBpbnQgaTsgaW50IGo7IH07CisvLy8gXGVuZGNvZGUKKy8vLyBjeHhDb25zdHJ1Y3RvckRlY2woZm9yRWFjaENvbnN0cnVjdG9ySW5pdGlhbGl6ZXIoCisvLy8gICBmb3JGaWVsZChkZWNsKCkuYmluZCgieCIpKQorLy8vICkpCisvLy8gICB3aWxsIHRyaWdnZXIgdHdvIG1hdGNoZXMsIGJpbmRpbmcgZm9yICdpJyBhbmQgJ2onIHJlc3BlY3RpdmVseS4KK0FTVF9NQVRDSEVSX1AoQ1hYQ29uc3RydWN0b3JEZWNsLCBmb3JFYWNoQ29uc3RydWN0b3JJbml0aWFsaXplciwKKyAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8Q1hYQ3RvckluaXRpYWxpemVyPiwgSW5uZXJNYXRjaGVyKSB7CisgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciBSZXN1bHQ7CisgIGJvb2wgTWF0Y2hlZCA9IGZhbHNlOworICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBOb2RlLmluaXRzKCkpIHsKKyAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgSW5pdEJ1aWxkZXIoKkJ1aWxkZXIpOworICAgIGlmIChJbm5lck1hdGNoZXIubWF0Y2hlcygqSSwgRmluZGVyLCAmSW5pdEJ1aWxkZXIpKSB7CisgICAgICBNYXRjaGVkID0gdHJ1ZTsKKyAgICAgIFJlc3VsdC5hZGRNYXRjaChJbml0QnVpbGRlcik7CisgICAgfQorICB9CisgICpCdWlsZGVyID0gc3RkOjptb3ZlKFJlc3VsdCk7CisgIHJldHVybiBNYXRjaGVkOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgY29uc3RydWN0b3IgZGVjbGFyYXRpb25zIHRoYXQgYXJlIGNvcHkgY29uc3RydWN0b3JzLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgc3RydWN0IFMgeworLy8vICAgICBTKCk7IC8vICMxCisvLy8gICAgIFMoY29uc3QgUyAmKTsgLy8gIzIKKy8vLyAgICAgUyhTICYmKTsgLy8gIzMKKy8vLyAgIH07CisvLy8gXGVuZGNvZGUKKy8vLyBjeHhDb25zdHJ1Y3RvckRlY2woaXNDb3B5Q29uc3RydWN0b3IoKSkgd2lsbCBtYXRjaCAjMiwgYnV0IG5vdCAjMSBvciAjMy4KK0FTVF9NQVRDSEVSKENYWENvbnN0cnVjdG9yRGVjbCwgaXNDb3B5Q29uc3RydWN0b3IpIHsKKyAgcmV0dXJuIE5vZGUuaXNDb3B5Q29uc3RydWN0b3IoKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9ucyB0aGF0IGFyZSBtb3ZlIGNvbnN0cnVjdG9ycy4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHN0cnVjdCBTIHsKKy8vLyAgICAgUygpOyAvLyAjMQorLy8vICAgICBTKGNvbnN0IFMgJik7IC8vICMyCisvLy8gICAgIFMoUyAmJik7IC8vICMzCisvLy8gICB9OworLy8vIFxlbmRjb2RlCisvLy8gY3h4Q29uc3RydWN0b3JEZWNsKGlzTW92ZUNvbnN0cnVjdG9yKCkpIHdpbGwgbWF0Y2ggIzMsIGJ1dCBub3QgIzEgb3IgIzIuCitBU1RfTUFUQ0hFUihDWFhDb25zdHJ1Y3RvckRlY2wsIGlzTW92ZUNvbnN0cnVjdG9yKSB7CisgIHJldHVybiBOb2RlLmlzTW92ZUNvbnN0cnVjdG9yKCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgZGVmYXVsdCBjb25zdHJ1Y3RvcnMuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBzdHJ1Y3QgUyB7CisvLy8gICAgIFMoKTsgLy8gIzEKKy8vLyAgICAgUyhjb25zdCBTICYpOyAvLyAjMgorLy8vICAgICBTKFMgJiYpOyAvLyAjMworLy8vICAgfTsKKy8vLyBcZW5kY29kZQorLy8vIGN4eENvbnN0cnVjdG9yRGVjbChpc0RlZmF1bHRDb25zdHJ1Y3RvcigpKSB3aWxsIG1hdGNoICMxLCBidXQgbm90ICMyIG9yICMzLgorQVNUX01BVENIRVIoQ1hYQ29uc3RydWN0b3JEZWNsLCBpc0RlZmF1bHRDb25zdHJ1Y3RvcikgeworICByZXR1cm4gTm9kZS5pc0RlZmF1bHRDb25zdHJ1Y3RvcigpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgY29uc3RydWN0b3JzIHRoYXQgZGVsZWdhdGUgdG8gYW5vdGhlciBjb25zdHJ1Y3Rvci4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHN0cnVjdCBTIHsKKy8vLyAgICAgUygpOyAvLyAjMQorLy8vICAgICBTKGludCkge30gLy8gIzIKKy8vLyAgICAgUyhTICYmKSA6IFMoKSB7fSAvLyAjMworLy8vICAgfTsKKy8vLyAgIFM6OlMoKSA6IFMoMCkge30gLy8gIzQKKy8vLyBcZW5kY29kZQorLy8vIGN4eENvbnN0cnVjdG9yRGVjbChpc0RlbGVnYXRpbmdDb25zdHJ1Y3RvcigpKSB3aWxsIG1hdGNoICMzIGFuZCAjNCwgYnV0IG5vdAorLy8vICMxIG9yICMyLgorQVNUX01BVENIRVIoQ1hYQ29uc3RydWN0b3JEZWNsLCBpc0RlbGVnYXRpbmdDb25zdHJ1Y3RvcikgeworICByZXR1cm4gTm9kZS5pc0RlbGVnYXRpbmdDb25zdHJ1Y3RvcigpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgY29uc3RydWN0b3IgYW5kIGNvbnZlcnNpb24gZGVjbGFyYXRpb25zIHRoYXQgYXJlIG1hcmtlZCB3aXRoCisvLy8gdGhlIGV4cGxpY2l0IGtleXdvcmQuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBzdHJ1Y3QgUyB7CisvLy8gICAgIFMoaW50KTsgLy8gIzEKKy8vLyAgICAgZXhwbGljaXQgUyhkb3VibGUpOyAvLyAjMgorLy8vICAgICBvcGVyYXRvciBpbnQoKTsgLy8gIzMKKy8vLyAgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpOyAvLyAjNAorLy8vICAgfTsKKy8vLyBcZW5kY29kZQorLy8vIGN4eENvbnN0cnVjdG9yRGVjbChpc0V4cGxpY2l0KCkpIHdpbGwgbWF0Y2ggIzIsIGJ1dCBub3QgIzEuCisvLy8gY3h4Q29udmVyc2lvbkRlY2woaXNFeHBsaWNpdCgpKSB3aWxsIG1hdGNoICM0LCBidXQgbm90ICMzLgorQVNUX1BPTFlNT1JQSElDX01BVENIRVIoaXNFeHBsaWNpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoQ1hYQ29uc3RydWN0b3JEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhDb252ZXJzaW9uRGVjbCkpIHsKKyAgcmV0dXJuIE5vZGUuaXNFeHBsaWNpdCgpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgZnVuY3Rpb24gYW5kIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgbWFya2VkIHdpdGgKKy8vLyB0aGUgaW5saW5lIGtleXdvcmQuCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICBpbmxpbmUgdm9pZCBmKCk7CisvLy8gICB2b2lkIGcoKTsKKy8vLyAgIG5hbWVzcGFjZSBuIHsKKy8vLyAgIGlubGluZSBuYW1lc3BhY2UgbSB7fQorLy8vICAgfQorLy8vIFxlbmRjb2RlCisvLy8gZnVuY3Rpb25EZWNsKGlzSW5saW5lKCkpIHdpbGwgbWF0Y2ggOjpmKCkuCisvLy8gbmFtZXNwYWNlRGVjbChpc0lubGluZSgpKSB3aWxsIG1hdGNoIG46Om0uCitBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUihpc0lubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTVF9QT0xZTU9SUEhJQ19TVVBQT1JURURfVFlQRVMoTmFtZXNwYWNlRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25EZWNsKSkgeworICAvLyBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgdGhlIHNwZWxsaW5nIG9mIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZQorICAvLyB3aGV0aGVyIGlubGluZSBpcyBzcGVjaWZpZWQgb3Igbm90IGRpZmZlcnMgYmV0d2VlbiB0aGUgcG9seW1vcnBoaWMgdHlwZXMuCisgIGlmIChjb25zdCBhdXRvICpGRCA9IGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oJk5vZGUpKQorICAgIHJldHVybiBGRC0+aXNJbmxpbmVTcGVjaWZpZWQoKTsKKyAgZWxzZSBpZiAoY29uc3QgYXV0byAqTlNEID0gZHluX2Nhc3Q8TmFtZXNwYWNlRGVjbD4oJk5vZGUpKQorICAgIHJldHVybiBOU0QtPmlzSW5saW5lKCk7CisgIGxsdm1fdW5yZWFjaGFibGUoIk5vdCBhIHZhbGlkIHBvbHltb3JwaGljIHR5cGUiKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGFub255bW91cyBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgbmFtZXNwYWNlIG4geworLy8vICAgbmFtZXNwYWNlIHt9IC8vICMxCisvLy8gICB9CisvLy8gXGVuZGNvZGUKKy8vLyBuYW1lc3BhY2VEZWNsKGlzQW5vbnltb3VzKCkpIHdpbGwgbWF0Y2ggIzEgYnV0IG5vdCA6Om4uCitBU1RfTUFUQ0hFUihOYW1lc3BhY2VEZWNsLCBpc0Fub255bW91cykgeworICByZXR1cm4gTm9kZS5pc0Fub255bW91c05hbWVzcGFjZSgpOworfQorCisvLy8gXGJyaWVmIElmIHRoZSBnaXZlbiBjYXNlIHN0YXRlbWVudCBkb2VzIG5vdCB1c2UgdGhlIEdOVSBjYXNlIHJhbmdlCisvLy8gZXh0ZW5zaW9uLCBtYXRjaGVzIHRoZSBjb25zdGFudCBnaXZlbiBpbiB0aGUgc3RhdGVtZW50LgorLy8vCisvLy8gR2l2ZW4KKy8vLyBcY29kZQorLy8vICAgc3dpdGNoICgxKSB7IGNhc2UgMTogY2FzZSAxKzE6IGNhc2UgMyAuLi4gNDogOyB9CisvLy8gXGVuZGNvZGUKKy8vLyBjYXNlU3RtdChoYXNDYXNlQ29uc3RhbnQoaW50ZWdlckxpdGVyYWwoKSkpCisvLy8gICBtYXRjaGVzICJjYXNlIDE6IgorQVNUX01BVENIRVJfUChDYXNlU3RtdCwgaGFzQ2FzZUNvbnN0YW50LCBpbnRlcm5hbDo6TWF0Y2hlcjxFeHByPiwKKyAgICAgICAgICAgICAgSW5uZXJNYXRjaGVyKSB7CisgIGlmIChOb2RlLmdldFJIUygpKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoKk5vZGUuZ2V0TEhTKCksIEZpbmRlciwgQnVpbGRlcik7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBkZWNsYXJhdGlvbiB0aGF0IGhhcyBhIGdpdmVuIGF0dHJpYnV0ZS4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIF9fYXR0cmlidXRlX18oKGRldmljZSkpIHZvaWQgZigpIHsgLi4uIH0KKy8vLyBcZW5kY29kZQorLy8vIGRlY2woaGFzQXR0cihjbGFuZzo6YXR0cjo6Q1VEQURldmljZSkpIG1hdGNoZXMgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIG9mCisvLy8gZi4gSWYgdGhlIG1hdGNoZXIgaXMgdXNlIGZyb20gY2xhbmctcXVlcnksIGF0dHI6OktpbmQgcGFyYW1ldGVyIHNob3VsZCBiZQorLy8vIHBhc3NlZCBhcyBhIHF1b3RlZCBzdHJpbmcuIGUuZy4sIGhhc0F0dHIoImF0dHI6OkNVREFEZXZpY2UiKS4KK0FTVF9NQVRDSEVSX1AoRGVjbCwgaGFzQXR0ciwgYXR0cjo6S2luZCwgQXR0cktpbmQpIHsKKyAgZm9yIChjb25zdCBhdXRvICpBdHRyIDogTm9kZS5hdHRycygpKSB7CisgICAgaWYgKEF0dHItPmdldEtpbmQoKSA9PSBBdHRyS2luZCkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIHRoZSByZXR1cm4gdmFsdWUgZXhwcmVzc2lvbiBvZiBhIHJldHVybiBzdGF0ZW1lbnQKKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIHJldHVybiBhICsgYjsKKy8vLyBcZW5kY29kZQorLy8vIGhhc1JldHVyblZhbHVlKGJpbmFyeU9wZXJhdG9yKCkpCisvLy8gICBtYXRjaGVzICdyZXR1cm4gYSArIGInCisvLy8gd2l0aCBiaW5hcnlPcGVyYXRvcigpCisvLy8gICBtYXRjaGluZyAnYSArIGInCitBU1RfTUFUQ0hFUl9QKFJldHVyblN0bXQsIGhhc1JldHVyblZhbHVlLCBpbnRlcm5hbDo6TWF0Y2hlcjxFeHByPiwKKyAgICAgICAgICAgICAgSW5uZXJNYXRjaGVyKSB7CisgIGlmIChjb25zdCBhdXRvICpSZXRWYWx1ZSA9IE5vZGUuZ2V0UmV0VmFsdWUoKSkKKyAgICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoKlJldFZhbHVlLCBGaW5kZXIsIEJ1aWxkZXIpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBDVURBIGtlcm5lbCBjYWxsIGV4cHJlc3Npb24uCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMsCisvLy8gXGNvZGUKKy8vLyAgIGtlcm5lbDw8PGksaj4+PigpOworLy8vIFxlbmRjb2RlCitleHRlcm4gY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBDVURBS2VybmVsQ2FsbEV4cHI+CisgICAgY3VkYUtlcm5lbENhbGxFeHByOworCisvLy8gXGJyaWVmIE1hdGNoZXMgZXhwcmVzc2lvbnMgdGhhdCByZXNvbHZlIHRvIGEgbnVsbCBwb2ludGVyIGNvbnN0YW50LCBzdWNoIGFzCisvLy8gR05VJ3MgX19udWxsLCBDKysxMSdzIG51bGxwdHIsIG9yIEMncyBOVUxMIG1hY3JvLgorLy8vCisvLy8gR2l2ZW46CisvLy8gXGNvZGUKKy8vLyAgIHZvaWQgKnYxID0gTlVMTDsKKy8vLyAgIHZvaWQgKnYyID0gbnVsbHB0cjsKKy8vLyAgIHZvaWQgKnYzID0gX19udWxsOyAvLyBHTlUgZXh0ZW5zaW9uCisvLy8gICBjaGFyICpjcCA9IChjaGFyICopMDsKKy8vLyAgIGludCAqaXAgPSAwOworLy8vICAgaW50IGkgPSAwOworLy8vIFxlbmRjb2RlCisvLy8gZXhwcihudWxsUG9pbnRlckNvbnN0YW50KCkpCisvLy8gICBtYXRjaGVzIHRoZSBpbml0aWFsaXplciBmb3IgdjEsIHYyLCB2MywgY3AsIGFuZCBpcC4gRG9lcyBub3QgbWF0Y2ggdGhlCisvLy8gICBpbml0aWFsaXplciBmb3IgaS4KK0FTVF9NQVRDSEVSX0ZVTkNUSU9OKGludGVybmFsOjpNYXRjaGVyPEV4cHI+LCBudWxsUG9pbnRlckNvbnN0YW50KSB7CisgIHJldHVybiBhbnlPZigKKyAgICAgIGdudU51bGxFeHByKCksIGN4eE51bGxQdHJMaXRlcmFsRXhwcigpLAorICAgICAgaW50ZWdlckxpdGVyYWwoZXF1YWxzKDApLCBoYXNQYXJlbnQoZXhwcihoYXNUeXBlKHBvaW50ZXJUeXBlKCkpKSkpKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGRlY2xhcmF0aW9uIG9mIHRoZSBmdW5jdGlvbiB0aGUgc3RhdGVtZW50IGJlbG9uZ3MgdG8KKy8vLworLy8vIEdpdmVuOgorLy8vIFxjb2RlCisvLy8gRiYgb3BlcmF0b3I9KGNvbnN0IEYmIG8pIHsKKy8vLyAgIHN0ZDo6Y29weV9pZihvLmJlZ2luKCksIG8uZW5kKCksIGJlZ2luKCksIFtdKFYgdikgeyByZXR1cm4gdiA+IDA7IH0pOworLy8vICAgcmV0dXJuICp0aGlzOworLy8vIH0KKy8vLyBcZW5kY29kZQorLy8vIHJldHVyblN0bXQoZm9yRnVuY3Rpb24oaGFzTmFtZSgib3BlcmF0b3I9IikpKQorLy8vICAgbWF0Y2hlcyAncmV0dXJuICp0aGlzJworLy8vICAgYnV0IGRvZXMgbWF0Y2ggJ3JldHVybiA+IDAnCitBU1RfTUFUQ0hFUl9QKFN0bXQsIGZvckZ1bmN0aW9uLCBpbnRlcm5hbDo6TWF0Y2hlcjxGdW5jdGlvbkRlY2w+LAorICAgICAgICAgICAgICBJbm5lck1hdGNoZXIpIHsKKyAgY29uc3QgYXV0byAmUGFyZW50cyA9IEZpbmRlci0+Z2V0QVNUQ29udGV4dCgpLmdldFBhcmVudHMoTm9kZSk7CisKKyAgbGx2bTo6U21hbGxWZWN0b3I8YXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGUsIDg+IFN0YWNrKFBhcmVudHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmVudHMuZW5kKCkpOworICB3aGlsZSghU3RhY2suZW1wdHkoKSkgeworICAgIGNvbnN0IGF1dG8gJkN1ck5vZGUgPSBTdGFjay5iYWNrKCk7CisgICAgU3RhY2sucG9wX2JhY2soKTsKKyAgICBpZihjb25zdCBhdXRvICpGdW5jRGVjbE5vZGUgPSBDdXJOb2RlLmdldDxGdW5jdGlvbkRlY2w+KCkpIHsKKyAgICAgIGlmKElubmVyTWF0Y2hlci5tYXRjaGVzKCpGdW5jRGVjbE5vZGUsIEZpbmRlciwgQnVpbGRlcikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfSBlbHNlIGlmKGNvbnN0IGF1dG8gKkxhbWJkYUV4cHJOb2RlID0gQ3VyTm9kZS5nZXQ8TGFtYmRhRXhwcj4oKSkgeworICAgICAgaWYoSW5uZXJNYXRjaGVyLm1hdGNoZXMoKkxhbWJkYUV4cHJOb2RlLT5nZXRDYWxsT3BlcmF0b3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRlciwgQnVpbGRlcikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvcihjb25zdCBhdXRvICZQYXJlbnQ6IEZpbmRlci0+Z2V0QVNUQ29udGV4dCgpLmdldFBhcmVudHMoQ3VyTm9kZSkpCisgICAgICAgIFN0YWNrLnB1c2hfYmFjayhQYXJlbnQpOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIGRlY2xhcmF0aW9uIHRoYXQgaGFzIGV4dGVybmFsIGZvcm1hbCBsaW5rYWdlLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIG9ubHkgeiAobWF0Y2hlciA9IHZhckRlY2woaGFzRXh0ZXJuYWxGb3JtYWxMaW5rYWdlKCkpKQorLy8vIFxjb2RlCisvLy8gdm9pZCBmKCkgeworLy8vICAgaW50IHg7CisvLy8gICBzdGF0aWMgaW50IHk7CisvLy8gfQorLy8vIGludCB6OworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgZigpIGJlY2F1c2UgaXQgaGFzIGV4dGVybmFsIGZvcm1hbCBsaW5rYWdlIGRlc3BpdGUgYmVpbmcKKy8vLyB1bmlxdWUgdG8gdGhlIHRyYW5zbGF0aW9uIHVuaXQgYXMgdGhvdWdoIGl0IGhhcyBpbnRlcm5hbCBsaWthZ2UKKy8vLyAobWF0Y2hlciA9IGZ1bmN0aW9uRGVjbChoYXNFeHRlcm5hbEZvcm1hbExpbmthZ2UoKSkpCisvLy8KKy8vLyBcY29kZQorLy8vIG5hbWVzcGFjZSB7CisvLy8gdm9pZCBmKCkge30KKy8vLyB9CisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSKE5hbWVkRGVjbCwgaGFzRXh0ZXJuYWxGb3JtYWxMaW5rYWdlKSB7CisgIHJldHVybiBOb2RlLmhhc0V4dGVybmFsRm9ybWFsTGlua2FnZSgpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgYSBkZWNsYXJhdGlvbiB0aGF0IGhhcyBkZWZhdWx0IGFyZ3VtZW50cy4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyB5IChtYXRjaGVyID0gcGFybVZhckRlY2woaGFzRGVmYXVsdEFyZ3VtZW50KCkpKQorLy8vIFxjb2RlCisvLy8gdm9pZCB4KGludCB2YWwpIHt9CisvLy8gdm9pZCB5KGludCB2YWwgPSAwKSB7fQorLy8vIFxlbmRjb2RlCitBU1RfTUFUQ0hFUihQYXJtVmFyRGVjbCwgaGFzRGVmYXVsdEFyZ3VtZW50KSB7IAorICByZXR1cm4gTm9kZS5oYXNEZWZhdWx0QXJnKCk7IAorfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgYXJyYXkgbmV3IGV4cHJlc3Npb25zLgorLy8vCisvLy8gR2l2ZW46CisvLy8gXGNvZGUKKy8vLyAgIE15Q2xhc3MgKnAxID0gbmV3IE15Q2xhc3NbMTBdOworLy8vIFxlbmRjb2RlCisvLy8gY3h4TmV3RXhwcihpc0FycmF5KCkpCisvLy8gICBtYXRjaGVzIHRoZSBleHByZXNzaW9uICduZXcgTXlDbGFzc1sxMF0nLgorQVNUX01BVENIRVIoQ1hYTmV3RXhwciwgaXNBcnJheSkgeworICByZXR1cm4gTm9kZS5pc0FycmF5KCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhcnJheSBuZXcgZXhwcmVzc2lvbnMgd2l0aCBhIGdpdmVuIGFycmF5IHNpemUuCisvLy8KKy8vLyBHaXZlbjoKKy8vLyBcY29kZQorLy8vICAgTXlDbGFzcyAqcDEgPSBuZXcgTXlDbGFzc1sxMF07CisvLy8gXGVuZGNvZGUKKy8vLyBjeHhOZXdFeHByKGhhc0FycmF5U2l6ZShpbnRnZXJMaXRlcmFsKGVxdWFscygxMCkpKSkKKy8vLyAgIG1hdGNoZXMgdGhlIGV4cHJlc3Npb24gJ25ldyBNeUNsYXNzWzEwXScuCitBU1RfTUFUQ0hFUl9QKENYWE5ld0V4cHIsIGhhc0FycmF5U2l6ZSwgaW50ZXJuYWw6Ok1hdGNoZXI8RXhwcj4sIElubmVyTWF0Y2hlcikgeworICByZXR1cm4gTm9kZS5pc0FycmF5KCkgJiYKKyAgICBJbm5lck1hdGNoZXIubWF0Y2hlcygqTm9kZS5nZXRBcnJheVNpemUoKSwgRmluZGVyLCBCdWlsZGVyKTsKK30KKworLy8vIFxicmllZiBNYXRjaGVzIGEgY2xhc3MgZGVjbGFyYXRpb24gdGhhdCBpcyBkZWZpbmVkLgorLy8vCisvLy8gRXhhbXBsZSBtYXRjaGVzIHggKG1hdGNoZXIgPSBjeHhSZWNvcmREZWNsKGhhc0RlZmluaXRpb24oKSkpCisvLy8gXGNvZGUKKy8vLyBjbGFzcyB4IHt9OworLy8vIGNsYXNzIHk7CisvLy8gXGVuZGNvZGUKK0FTVF9NQVRDSEVSKENYWFJlY29yZERlY2wsIGhhc0RlZmluaXRpb24pIHsKKyAgcmV0dXJuIE5vZGUuaGFzRGVmaW5pdGlvbigpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgQysrMTEgc2NvcGVkIGVudW0gZGVjbGFyYXRpb24uCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgWSAobWF0Y2hlciA9IGVudW1EZWNsKGlzU2NvcGVkKCkpKQorLy8vIFxjb2RlCisvLy8gZW51bSBYIHt9OworLy8vIGVudW0gY2xhc3MgWSB7fTsKKy8vLyBcZW5kY29kZQorQVNUX01BVENIRVIoRW51bURlY2wsIGlzU2NvcGVkKSB7CisgIHJldHVybiBOb2RlLmlzU2NvcGVkKCk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIGZ1bmN0aW9uIGRlY2xhcmVkIHdpdGggYSB0cmFpbGluZyByZXR1cm4gdHlwZS4KKy8vLworLy8vIEV4YW1wbGUgbWF0Y2hlcyBZIChtYXRjaGVyID0gZnVuY3Rpb25EZWNsKGhhc1RyYWlsaW5nUmV0dXJuKCkpKQorLy8vIFxjb2RlCisvLy8gaW50IFgoKSB7fQorLy8vIGF1dG8gWSgpIC0+IGludCB7fQorLy8vIFxlbmRjb2RlCitBU1RfTUFUQ0hFUihGdW5jdGlvbkRlY2wsIGhhc1RyYWlsaW5nUmV0dXJuKSB7CisgIGlmIChjb25zdCBhdXRvICpGID0gTm9kZS5nZXRUeXBlKCktPmdldEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpKQorICAgIHJldHVybiBGLT5oYXNUcmFpbGluZ1JldHVybigpOworICByZXR1cm4gZmFsc2U7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFzdF9tYXRjaGVycworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUTUFUQ0hFUlNfQVNUTUFUQ0hFUlNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hlcnNJbnRlcm5hbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hlcnNJbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMTI2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaGVyc0ludGVybmFsLmgKQEAgLTAsMCArMSwxODExIEBACisvLz09PS0gQVNUTWF0Y2hlcnNJbnRlcm5hbC5oIC0gU3RydWN0dXJhbCBxdWVyeSBmcmFtZXdvcmsgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBJbXBsZW1lbnRzIHRoZSBiYXNlIGxheWVyIG9mIHRoZSBtYXRjaGVyIGZyYW1ld29yay4KKy8vCisvLyAgTWF0Y2hlcnMgYXJlIG1ldGhvZHMgdGhhdCByZXR1cm4gYSBNYXRjaGVyPFQ+IHdoaWNoIHByb3ZpZGVzIGEgbWV0aG9kCisvLyAgTWF0Y2hlcyguLi4pIHdoaWNoIGlzIGEgcHJlZGljYXRlIG9uIGFuIEFTVCBub2RlLiBUaGUgTWF0Y2hlcyBtZXRob2QncworLy8gIHBhcmFtZXRlcnMgZGVmaW5lIHRoZSBjb250ZXh0IG9mIHRoZSBtYXRjaCwgd2hpY2ggYWxsb3dzIG1hdGNoZXJzIHRvIHJlY3Vyc2UKKy8vICBvciBzdG9yZSB0aGUgY3VycmVudCBub2RlIGFzIGJvdW5kIHRvIGEgc3BlY2lmaWMgc3RyaW5nLCBzbyB0aGF0IGl0IGNhbiBiZQorLy8gIHJldHJpZXZlZCBsYXRlci4KKy8vCisvLyAgSW4gZ2VuZXJhbCwgbWF0Y2hlcnMgaGF2ZSB0d28gcGFydHM6CisvLyAgMS4gQSBmdW5jdGlvbiBNYXRjaGVyPFQ+IE1hdGNoZXJOYW1lKDxhcmd1bWVudHM+KSB3aGljaCByZXR1cm5zIGEgTWF0Y2hlcjxUPgorLy8gICAgIGJhc2VkIG9uIHRoZSBhcmd1bWVudHMgYW5kIG9wdGlvbmFsbHkgb24gdGVtcGxhdGUgdHlwZSBkZWR1Y3Rpb24gYmFzZWQKKy8vICAgICBvbiB0aGUgYXJndW1lbnRzLiBNYXRjaGVyPFQ+cyBmb3JtIGFuIGltcGxpY2l0IHJldmVyc2UgaGllcmFyY2h5CisvLyAgICAgdG8gY2xhbmcncyBBU1QgY2xhc3MgaGllcmFyY2h5LCBtZWFuaW5nIHRoYXQgeW91IGNhbiB1c2UgYSBNYXRjaGVyPEJhc2U+CisvLyAgICAgZXZlcnl3aGVyZSBhIE1hdGNoZXI8RGVyaXZlZD4gaXMgcmVxdWlyZWQuCisvLyAgMi4gQW4gaW1wbGVtZW50YXRpb24gb2YgYSBjbGFzcyBkZXJpdmVkIGZyb20gTWF0Y2hlckludGVyZmFjZTxUPi4KKy8vCisvLyAgVGhlIG1hdGNoZXIgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluIEFTVE1hdGNoZXJzLmguIFRvIG1ha2UgaXQgcG9zc2libGUKKy8vICB0byBpbXBsZW1lbnQgYm90aCB0aGUgbWF0Y2hlciBmdW5jdGlvbiBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtYXRjaGVyCisvLyAgaW50ZXJmYWNlIGluIG9uZSBwbGFjZSwgQVNUTWF0Y2hlck1hY3Jvcy5oIGRlZmluZXMgbWFjcm9zIHRoYXQgYWxsb3cKKy8vICBpbXBsZW1lbnRpbmcgYSBtYXRjaGVyIGluIGEgc2luZ2xlIHBsYWNlLgorLy8KKy8vICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGJhc2UgY2xhc3NlcyBuZWVkZWQgdG8gY29uc3RydWN0IHRoZSBhY3R1YWwgbWF0Y2hlcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVE1BVENIRVJTX0FTVE1BVENIRVJTSU5URVJOQUxfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVE1BVENIRVJTX0FTVE1BVENIRVJTSU5URVJOQUxfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVFR5cGVUcmFpdHMuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQ1hYLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xUZW1wbGF0ZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHJDWFguaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvTmVzdGVkTmFtZVNwZWNpZmllci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1RlbXBsYXRlTmFtZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGVMb2MuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3BlcmF0b3JLaW5kcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FQRmxvYXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFTVENvbnRleHQ7CisKK25hbWVzcGFjZSBhc3RfbWF0Y2hlcnMgeworCitjbGFzcyBCb3VuZE5vZGVzOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLy8gXGJyaWVmIFZhcmlhZGljIGZ1bmN0aW9uIG9iamVjdC4KKy8vLworLy8vIE1vc3Qgb2YgdGhlIGZ1bmN0aW9ucyBiZWxvdyB0aGF0IHVzZSBWYXJpYWRpY0Z1bmN0aW9uIGNvdWxkIGJlIGltcGxlbWVudGVkCisvLy8gdXNpbmcgcGxhaW4gQysrMTEgdmFyaWFkaWMgZnVuY3Rpb25zLCBidXQgdGhlIGZ1bmN0aW9uIG9iamVjdCBhbGxvd3MgdXMgdG8KKy8vLyBjYXB0dXJlIGl0IG9uIHRoZSBkeW5hbWljIG1hdGNoZXIgcmVnaXN0cnkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0VCwgdHlwZW5hbWUgQXJnVCwKKyAgICAgICAgICBSZXN1bHRUICgqRnVuYykoQXJyYXlSZWY8Y29uc3QgQXJnVCAqPik+CitzdHJ1Y3QgVmFyaWFkaWNGdW5jdGlvbiB7CisgIFJlc3VsdFQgb3BlcmF0b3IoKSgpIGNvbnN0IHsgcmV0dXJuIEZ1bmMoTm9uZSk7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJnc1Q+CisgIFJlc3VsdFQgb3BlcmF0b3IoKShjb25zdCBBcmdUICZBcmcxLCBjb25zdCBBcmdzVCAmLi4uIEFyZ3MpIGNvbnN0IHsKKyAgICByZXR1cm4gRXhlY3V0ZShBcmcxLCBzdGF0aWNfY2FzdDxjb25zdCBBcmdUICY+KEFyZ3MpLi4uKTsKKyAgfQorCisgIC8vIFdlIGFsc28gYWxsb3cgY2FsbHMgd2l0aCBhbiBhbHJlYWR5IGNyZWF0ZWQgYXJyYXksIGluIGNhc2UgdGhlIGNhbGxlcgorICAvLyBhbHJlYWR5IGhhZCBpdC4KKyAgUmVzdWx0VCBvcGVyYXRvcigpKEFycmF5UmVmPEFyZ1Q+IEFyZ3MpIGNvbnN0IHsKKyAgICBTbWFsbFZlY3Rvcjxjb25zdCBBcmdUKiwgOD4gSW5uZXJBcmdzOworICAgIGZvciAoY29uc3QgQXJnVCAmQXJnIDogQXJncykKKyAgICAgIElubmVyQXJncy5wdXNoX2JhY2soJkFyZyk7CisgICAgcmV0dXJuIEZ1bmMoSW5uZXJBcmdzKTsKKyAgfQorCitwcml2YXRlOgorICAvLyBUcmFtcG9saW5lIGZ1bmN0aW9uIHRvIGFsbG93IGZvciBpbXBsaWNpdCBjb252ZXJzaW9ucyB0byB0YWtlIHBsYWNlCisgIC8vIGJlZm9yZSB3ZSBtYWtlIHRoZSBhcnJheS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3NUPiBSZXN1bHRUIEV4ZWN1dGUoY29uc3QgQXJnc1QgJi4uLiBBcmdzKSBjb25zdCB7CisgICAgY29uc3QgQXJnVCAqY29uc3QgQXJnc0FycmF5W10gPSB7JkFyZ3MuLi59OworICAgIHJldHVybiBGdW5jKEFycmF5UmVmPGNvbnN0IEFyZ1QgKj4oQXJnc0FycmF5LCBzaXplb2YuLi4oQXJnc1QpKSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVW5pZmllcyBvYnRhaW5pbmcgdGhlIHVuZGVybHlpbmcgdHlwZSBvZiBhIHJlZ3VsYXIgbm9kZSB0aHJvdWdoCisvLy8gYGdldFR5cGVgIGFuZCBhIFR5cGVkZWZOYW1lRGVjbCBub2RlIHRocm91Z2ggYGdldFVuZGVybHlpbmdUeXBlYC4KK2lubGluZSBRdWFsVHlwZSBnZXRVbmRlcmx5aW5nVHlwZShjb25zdCBFeHByICZOb2RlKSB7IHJldHVybiBOb2RlLmdldFR5cGUoKTsgfQorCitpbmxpbmUgUXVhbFR5cGUgZ2V0VW5kZXJseWluZ1R5cGUoY29uc3QgVmFsdWVEZWNsICZOb2RlKSB7CisgIHJldHVybiBOb2RlLmdldFR5cGUoKTsKK30KKworaW5saW5lIFF1YWxUeXBlIGdldFVuZGVybHlpbmdUeXBlKGNvbnN0IFR5cGVkZWZOYW1lRGVjbCAmTm9kZSkgeworICByZXR1cm4gTm9kZS5nZXRVbmRlcmx5aW5nVHlwZSgpOworfQorCisvLy8gXGJyaWVmIFVuaWZpZXMgb2J0YWluaW5nIHRoZSBGdW5jdGlvblByb3RvVHlwZSBwb2ludGVyIGZyb20gYm90aAorLy8vIEZ1bmN0aW9uUHJvdG9UeXBlIGFuZCBGdW5jdGlvbkRlY2wgbm9kZXMuLgoraW5saW5lIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICoKK2dldEZ1bmN0aW9uUHJvdG9UeXBlKGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICZOb2RlKSB7CisgIHJldHVybiAmTm9kZTsKK30KKworaW5saW5lIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpnZXRGdW5jdGlvblByb3RvVHlwZShjb25zdCBGdW5jdGlvbkRlY2wgJk5vZGUpIHsKKyAgcmV0dXJuIE5vZGUuZ2V0VHlwZSgpLT5nZXRBczxGdW5jdGlvblByb3RvVHlwZT4oKTsKK30KKworLy8vIFxicmllZiBJbnRlcm5hbCB2ZXJzaW9uIG9mIEJvdW5kTm9kZXMuIEhvbGRzIGFsbCB0aGUgYm91bmQgbm9kZXMuCitjbGFzcyBCb3VuZE5vZGVzTWFwIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBBZGRzIFxjIE5vZGUgdG8gdGhlIG1hcCB3aXRoIGtleSBcYyBJRC4KKyAgLy8vCisgIC8vLyBUaGUgbm9kZSdzIGJhc2UgdHlwZSBzaG91bGQgYmUgaW4gTm9kZUJhc2VUeXBlIG9yIGl0IHdpbGwgYmUgdW5hY2Nlc3NpYmxlLgorICB2b2lkIGFkZE5vZGUoU3RyaW5nUmVmIElELCBjb25zdCBhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZSYgRHluTm9kZSkgeworICAgIE5vZGVNYXBbSURdID0gRHluTm9kZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgQVNUIG5vZGUgYm91bmQgdG8gXGMgSUQuCisgIC8vLworICAvLy8gUmV0dXJucyBOVUxMIGlmIHRoZXJlIHdhcyBubyBub2RlIGJvdW5kIHRvIFxjIElEIG9yIGlmIHRoZXJlIGlzIGEgbm9kZSBidXQKKyAgLy8vIGl0IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgY29uc3QgVCAqZ2V0Tm9kZUFzKFN0cmluZ1JlZiBJRCkgY29uc3QgeworICAgIElEVG9Ob2RlTWFwOjpjb25zdF9pdGVyYXRvciBJdCA9IE5vZGVNYXAuZmluZChJRCk7CisgICAgaWYgKEl0ID09IE5vZGVNYXAuZW5kKCkpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gSXQtPnNlY29uZC5nZXQ8VD4oKTsKKyAgfQorCisgIGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlIGdldE5vZGUoU3RyaW5nUmVmIElEKSBjb25zdCB7CisgICAgSURUb05vZGVNYXA6OmNvbnN0X2l0ZXJhdG9yIEl0ID0gTm9kZU1hcC5maW5kKElEKTsKKyAgICBpZiAoSXQgPT0gTm9kZU1hcC5lbmQoKSkgeworICAgICAgcmV0dXJuIGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlKCk7CisgICAgfQorICAgIHJldHVybiBJdC0+c2Vjb25kOworICB9CisKKyAgLy8vIFxicmllZiBJbXBvc2VzIGFuIG9yZGVyIG9uIEJvdW5kTm9kZXNNYXBzLgorICBib29sIG9wZXJhdG9yPChjb25zdCBCb3VuZE5vZGVzTWFwICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBOb2RlTWFwIDwgT3RoZXIuTm9kZU1hcDsKKyAgfQorCisgIC8vLyBcYnJpZWYgQSBtYXAgZnJvbSBJRHMgdG8gdGhlIGJvdW5kIG5vZGVzLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB3ZSdyZSB1c2luZyBzdGQ6Om1hcCBoZXJlLCBhcyBmb3IgbWVtb2l6YXRpb246CisgIC8vLyAtIHdlIG5lZWQgYSBjb21wYXJpc29uIG9wZXJhdG9yCisgIC8vLyAtIHdlIG5lZWQgYW4gYXNzaWdubWVudCBvcGVyYXRvcgorICB1c2luZyBJRFRvTm9kZU1hcCA9IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZT47CisKKyAgY29uc3QgSURUb05vZGVNYXAgJmdldE1hcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9kZU1hcDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBcYyB0cnVlIGlmIHRoaXMgXGMgQm91bmROb2Rlc01hcCBjYW4gYmUgY29tcGFyZWQsIGkuZS4gYWxsCisgIC8vLyBzdG9yZWQgbm9kZXMgaGF2ZSBtZW1vaXphdGlvbiBkYXRhLgorICBib29sIGlzQ29tcGFyYWJsZSgpIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJklEQW5kTm9kZSA6IE5vZGVNYXApIHsKKyAgICAgIGlmICghSURBbmROb2RlLnNlY29uZC5nZXRNZW1vaXphdGlvbkRhdGEoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCitwcml2YXRlOgorICBJRFRvTm9kZU1hcCBOb2RlTWFwOworfTsKKworLy8vIFxicmllZiBDcmVhdGVzIEJvdW5kTm9kZXNUcmVlIG9iamVjdHMuCisvLy8KKy8vLyBUaGUgdHJlZSBidWlsZGVyIGlzIHVzZWQgZHVyaW5nIHRoZSBtYXRjaGluZyBwcm9jZXNzIHRvIGluc2VydCB0aGUgYm91bmQKKy8vLyBub2RlcyBmcm9tIHRoZSBJZCBtYXRjaGVyLgorY2xhc3MgQm91bmROb2Rlc1RyZWVCdWlsZGVyIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBBIHZpc2l0b3IgaW50ZXJmYWNlIHRvIHZpc2l0IGFsbCBCb3VuZE5vZGVzIHJlc3VsdHMgZm9yIGEKKyAgLy8vIEJvdW5kTm9kZXNUcmVlLgorICBjbGFzcyBWaXNpdG9yIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgflZpc2l0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gXGJyaWVmIENhbGxlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgYSBzaW5nbGUgY2FsbCB0byBWaXNpdE1hdGNoZXMoLi4uKS4KKyAgICAvLy8KKyAgICAvLy8gJ0JvdW5kTm9kZXNWaWV3JyBjb250YWlucyB0aGUgYm91bmQgbm9kZXMgZm9yIGEgc2luZ2xlIG1hdGNoLgorICAgIHZpcnR1YWwgdm9pZCB2aXNpdE1hdGNoKGNvbnN0IEJvdW5kTm9kZXMmIEJvdW5kTm9kZXNWaWV3KSA9IDA7CisgIH07CisKKyAgLy8vIFxicmllZiBBZGQgYSBiaW5kaW5nIGZyb20gYW4gaWQgdG8gYSBub2RlLgorICB2b2lkIHNldEJpbmRpbmcoU3RyaW5nUmVmIElkLCBjb25zdCBhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZSAmRHluTm9kZSkgeworICAgIGlmIChCaW5kaW5ncy5lbXB0eSgpKQorICAgICAgQmluZGluZ3MuZW1wbGFjZV9iYWNrKCk7CisgICAgZm9yIChCb3VuZE5vZGVzTWFwICZCaW5kaW5nIDogQmluZGluZ3MpCisgICAgICBCaW5kaW5nLmFkZE5vZGUoSWQsIER5bk5vZGUpOworICB9CisKKyAgLy8vIFxicmllZiBBZGRzIGEgYnJhbmNoIGluIHRoZSB0cmVlLgorICB2b2lkIGFkZE1hdGNoKGNvbnN0IEJvdW5kTm9kZXNUcmVlQnVpbGRlciAmQmluZGluZ3MpOworCisgIC8vLyBcYnJpZWYgVmlzaXRzIGFsbCBtYXRjaGVzIHRoYXQgdGhpcyBCb3VuZE5vZGVzVHJlZSByZXByZXNlbnRzLgorICAvLy8KKyAgLy8vIFRoZSBvd25lcnNoaXAgb2YgJ1Jlc3VsdFZpc2l0b3InIHJlbWFpbnMgYXQgdGhlIGNhbGxlci4KKyAgdm9pZCB2aXNpdE1hdGNoZXMoVmlzaXRvciogUmVzdWx0VmlzaXRvcik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEV4Y2x1ZGVQcmVkaWNhdGU+CisgIGJvb2wgcmVtb3ZlQmluZGluZ3MoY29uc3QgRXhjbHVkZVByZWRpY2F0ZSAmUHJlZGljYXRlKSB7CisgICAgQmluZGluZ3MuZXJhc2Uoc3RkOjpyZW1vdmVfaWYoQmluZGluZ3MuYmVnaW4oKSwgQmluZGluZ3MuZW5kKCksIFByZWRpY2F0ZSksCisgICAgICAgICAgICAgICAgICAgQmluZGluZ3MuZW5kKCkpOworICAgIHJldHVybiAhQmluZGluZ3MuZW1wdHkoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSW1wb3NlcyBhbiBvcmRlciBvbiBCb3VuZE5vZGVzVHJlZUJ1aWxkZXJzLgorICBib29sIG9wZXJhdG9yPChjb25zdCBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmRpbmdzIDwgT3RoZXIuQmluZGluZ3M7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgXGMgdHJ1ZSBpZiB0aGlzIFxjIEJvdW5kTm9kZXNUcmVlQnVpbGRlciBjYW4gYmUgY29tcGFyZWQsCisgIC8vLyBpLmUuIGFsbCBzdG9yZWQgbm9kZSBtYXBzIGhhdmUgbWVtb2l6YXRpb24gZGF0YS4KKyAgYm9vbCBpc0NvbXBhcmFibGUoKSBjb25zdCB7CisgICAgZm9yIChjb25zdCBCb3VuZE5vZGVzTWFwICZOb2Rlc01hcCA6IEJpbmRpbmdzKSB7CisgICAgICBpZiAoIU5vZGVzTWFwLmlzQ29tcGFyYWJsZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKK3ByaXZhdGU6CisgIFNtYWxsVmVjdG9yPEJvdW5kTm9kZXNNYXAsIDE2PiBCaW5kaW5nczsKK307CisKK2NsYXNzIEFTVE1hdGNoRmluZGVyOworCisvLy8gXGJyaWVmIEdlbmVyaWMgaW50ZXJmYWNlIGZvciBhbGwgbWF0Y2hlcnMuCisvLy8KKy8vLyBVc2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBNYXRjaGVyPFQ+IGFuZCBEeW5UeXBlZE1hdGNoZXIuCisvLy8gSW4gZ2VuZXJhbCwgaW1wbGVtZW50IE1hdGNoZXJJbnRlcmZhY2U8VD4gb3IgU2luZ2xlTm9kZU1hdGNoZXJJbnRlcmZhY2U8VD4KKy8vLyBpbnN0ZWFkLgorY2xhc3MgRHluTWF0Y2hlckludGVyZmFjZQorICAgIDogcHVibGljIGxsdm06OlRocmVhZFNhZmVSZWZDb3VudGVkQmFzZTxEeW5NYXRjaGVySW50ZXJmYWNlPiB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkR5bk1hdGNoZXJJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgXHAgRHluTm9kZSBjYW4gYmUgbWF0Y2hlZC4KKyAgLy8vCisgIC8vLyBNYXkgYmluZCBccCBEeW5Ob2RlIHRvIGFuIElEIHZpYSBccCBCdWlsZGVyLCBvciByZWN1cnNlIGludG8KKyAgLy8vIHRoZSBBU1QgdmlhIFxwIEZpbmRlci4KKyAgdmlydHVhbCBib29sIGR5bk1hdGNoZXMoY29uc3QgYXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGUgJkR5bk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3QgPSAwOworfTsKKworLy8vIFxicmllZiBHZW5lcmljIGludGVyZmFjZSBmb3IgbWF0Y2hlcnMgb24gYW4gQVNUIG5vZGUgb2YgdHlwZSBULgorLy8vCisvLy8gSW1wbGVtZW50IHRoaXMgaWYgeW91ciBtYXRjaGVyIG1heSBuZWVkIHRvIGluc3BlY3QgdGhlIGNoaWxkcmVuIG9yCisvLy8gZGVzY2VuZGFudHMgb2YgdGhlIG5vZGUgb3IgYmluZCBtYXRjaGVkIG5vZGVzIHRvIG5hbWVzLiBJZiB5b3UgYXJlCisvLy8gd3JpdGluZyBhIHNpbXBsZSBtYXRjaGVyIHRoYXQgb25seSBpbnNwZWN0cyBwcm9wZXJ0aWVzIG9mIHRoZQorLy8vIGN1cnJlbnQgbm9kZSBhbmQgZG9lc24ndCBjYXJlIGFib3V0IGl0cyBjaGlsZHJlbiBvciBkZXNjZW5kYW50cywKKy8vLyBpbXBsZW1lbnQgU2luZ2xlTm9kZU1hdGNoZXJJbnRlcmZhY2UgaW5zdGVhZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgTWF0Y2hlckludGVyZmFjZSA6IHB1YmxpYyBEeW5NYXRjaGVySW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgJ05vZGUnIGNhbiBiZSBtYXRjaGVkLgorICAvLy8KKyAgLy8vIE1heSBiaW5kICdOb2RlJyB0byBhbiBJRCB2aWEgJ0J1aWxkZXInLCBvciByZWN1cnNlIGludG8KKyAgLy8vIHRoZSBBU1QgdmlhICdGaW5kZXInLgorICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyhjb25zdCBUICZOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0ID0gMDsKKworICBib29sIGR5bk1hdGNoZXMoY29uc3QgYXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGUgJkR5bk5vZGUsCisgICAgICAgICAgICAgICAgICBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAorICAgICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIG1hdGNoZXMoRHluTm9kZS5nZXRVbmNoZWNrZWQ8VD4oKSwgRmluZGVyLCBCdWlsZGVyKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBJbnRlcmZhY2UgZm9yIG1hdGNoZXJzIHRoYXQgb25seSBldmFsdWF0ZSBwcm9wZXJ0aWVzIG9uIGEgc2luZ2xlCisvLy8gbm9kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgU2luZ2xlTm9kZU1hdGNoZXJJbnRlcmZhY2UgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBtYXRjaGVyIG1hdGNoZXMgdGhlIHByb3ZpZGVkIG5vZGUuCisgIC8vLworICAvLy8gQSBzdWJjbGFzcyBtdXN0IGltcGxlbWVudCB0aGlzIGluc3RlYWQgb2YgTWF0Y2hlcygpLgorICB2aXJ0dWFsIGJvb2wgbWF0Y2hlc05vZGUoY29uc3QgVCAmTm9kZSkgY29uc3QgPSAwOworCitwcml2YXRlOgorICAvLy8gSW1wbGVtZW50cyBNYXRjaGVySW50ZXJmYWNlOjpNYXRjaGVzLgorICBib29sIG1hdGNoZXMoY29uc3QgVCAmTm9kZSwKKyAgICAgICAgICAgICAgIEFTVE1hdGNoRmluZGVyICogLyogRmluZGVyICovLAorICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICogLyogIEJ1aWxkZXIgKi8pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbWF0Y2hlc05vZGUoTm9kZSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgTWF0Y2hlcjsKKworLy8vIFxicmllZiBNYXRjaGVyIHRoYXQgd29ya3Mgb24gYSBcYyBEeW5UeXBlZE5vZGUuCisvLy8KKy8vLyBJdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIGEgXGMgTWF0Y2hlcjxUPiBvYmplY3QgYW5kIHJlZGlyZWN0cyBtb3N0IGNhbGxzIHRvCisvLy8gdW5kZXJseWluZyBtYXRjaGVyLgorLy8vIEl0IGNoZWNrcyB3aGV0aGVyIHRoZSBcYyBEeW5UeXBlZE5vZGUgaXMgY29udmVydGlibGUgaW50byB0aGUgdHlwZSBvZiB0aGUKKy8vLyB1bmRlcmx5aW5nIG1hdGNoZXIgYW5kIHRoZW4gZG8gdGhlIGFjdHVhbCBtYXRjaCBvbiB0aGUgYWN0dWFsIG5vZGUsIG9yCisvLy8gcmV0dXJuIGZhbHNlIGlmIGl0IGlzIG5vdCBjb252ZXJ0aWJsZS4KK2NsYXNzIER5blR5cGVkTWF0Y2hlciB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgVGFrZXMgb3duZXJzaGlwIG9mIHRoZSBwcm92aWRlZCBpbXBsZW1lbnRhdGlvbiBwb2ludGVyLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgRHluVHlwZWRNYXRjaGVyKE1hdGNoZXJJbnRlcmZhY2U8VD4gKkltcGxlbWVudGF0aW9uKQorICAgICAgOiBTdXBwb3J0ZWRLaW5kKGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQ6OmdldEZyb21Ob2RlS2luZDxUPigpKSwKKyAgICAgICAgUmVzdHJpY3RLaW5kKFN1cHBvcnRlZEtpbmQpLCBJbXBsZW1lbnRhdGlvbihJbXBsZW1lbnRhdGlvbikge30KKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBmcm9tIGEgdmFyaWFkaWMgZnVuY3Rpb24uCisgIGVudW0gVmFyaWFkaWNPcGVyYXRvciB7CisgICAgLy8vIFxicmllZiBNYXRjaGVzIG5vZGVzIGZvciB3aGljaCBhbGwgcHJvdmlkZWQgbWF0Y2hlcnMgbWF0Y2guCisgICAgVk9fQWxsT2YsCisKKyAgICAvLy8gXGJyaWVmIE1hdGNoZXMgbm9kZXMgZm9yIHdoaWNoIGF0IGxlYXN0IG9uZSBvZiB0aGUgcHJvdmlkZWQgbWF0Y2hlcnMKKyAgICAvLy8gbWF0Y2hlcy4KKyAgICBWT19BbnlPZiwKKworICAgIC8vLyBcYnJpZWYgTWF0Y2hlcyBub2RlcyBmb3Igd2hpY2ggYXQgbGVhc3Qgb25lIG9mIHRoZSBwcm92aWRlZCBtYXRjaGVycworICAgIC8vLyBtYXRjaGVzLCBidXQgZG9lc24ndCBzdG9wIGF0IHRoZSBmaXJzdCBtYXRjaC4KKyAgICBWT19FYWNoT2YsCisKKyAgICAvLy8gXGJyaWVmIE1hdGNoZXMgbm9kZXMgdGhhdCBkbyBub3QgbWF0Y2ggdGhlIHByb3ZpZGVkIG1hdGNoZXIuCisgICAgLy8vCisgICAgLy8vIFVzZXMgdGhlIHZhcmlhZGljIG1hdGNoZXIgaW50ZXJmYWNlLCBidXQgZmFpbHMgaWYKKyAgICAvLy8gSW5uZXJNYXRjaGVycy5zaXplKCkgIT0gMS4KKyAgICBWT19VbmFyeU5vdAorICB9OworCisgIHN0YXRpYyBEeW5UeXBlZE1hdGNoZXIKKyAgY29uc3RydWN0VmFyaWFkaWMoVmFyaWFkaWNPcGVyYXRvciBPcCwKKyAgICAgICAgICAgICAgICAgICAgYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZCBTdXBwb3J0ZWRLaW5kLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEeW5UeXBlZE1hdGNoZXI+IElubmVyTWF0Y2hlcnMpOworCisgIC8vLyBcYnJpZWYgR2V0IGEgInRydWUiIG1hdGNoZXIgZm9yIFxwIE5vZGVLaW5kLgorICAvLy8KKyAgLy8vIEl0IG9ubHkgY2hlY2tzIHRoYXQgdGhlIG5vZGUgaXMgb2YgdGhlIHJpZ2h0IGtpbmQuCisgIHN0YXRpYyBEeW5UeXBlZE1hdGNoZXIgdHJ1ZU1hdGNoZXIoYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZCBOb2RlS2luZCk7CisKKyAgdm9pZCBzZXRBbGxvd0JpbmQoYm9vbCBBQikgeyBBbGxvd0JpbmQgPSBBQjsgfQorCisgIC8vLyBcYnJpZWYgQ2hlY2sgd2hldGhlciB0aGlzIG1hdGNoZXIgY291bGQgZXZlciBtYXRjaCBhIG5vZGUgb2Yga2luZCBccCBLaW5kLgorICAvLy8gXHJldHVybiBcYyBmYWxzZSBpZiB0aGlzIG1hdGNoZXIgd2lsbCBuZXZlciBtYXRjaCBzdWNoIGEgbm9kZS4gT3RoZXJ3aXNlLAorICAvLy8gcmV0dXJuIFxjIHRydWUuCisgIGJvb2wgY2FuTWF0Y2hOb2Rlc09mS2luZChhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kIEtpbmQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgbWF0Y2hlciB0aGF0IHBvaW50cyB0byB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiwgYnV0CisgIC8vLyAgIHJlc3RyaWN0cyB0aGUgbm9kZSB0eXBlcyBmb3IgXHAgS2luZC4KKyAgRHluVHlwZWRNYXRjaGVyIGR5bkNhc3RUbyhjb25zdCBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kIEtpbmQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBtYXRjaGVyIG1hdGNoZXMgdGhlIGdpdmVuIFxjIER5bk5vZGUuCisgIGJvb2wgbWF0Y2hlcyhjb25zdCBhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZSAmRHluTm9kZSwKKyAgICAgICAgICAgICAgIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTYW1lIGFzIG1hdGNoZXMoKSwgYnV0IHNraXBzIHRoZSBraW5kIGNoZWNrLgorICAvLy8KKyAgLy8vIEl0IGlzIGZhc3RlciwgYnV0IHRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhlIG5vZGUgaXMgdmFsaWQgZm9yIHRoZQorICAvLy8ga2luZCBvZiB0aGlzIG1hdGNoZXIuCisgIGJvb2wgbWF0Y2hlc05vS2luZENoZWNrKGNvbnN0IGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlICZEeW5Ob2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQmluZCB0aGUgc3BlY2lmaWVkIFxwIElEIHRvIHRoZSBtYXRjaGVyLgorICAvLy8gXHJldHVybiBBIG5ldyBtYXRjaGVyIHdpdGggdGhlIFxwIElEIGJvdW5kIHRvIGl0IGlmIHRoaXMgbWF0Y2hlciBzdXBwb3J0cworICAvLy8gICBiaW5kaW5nLiBPdGhlcndpc2UsIHJldHVybnMgYW4gZW1wdHkgXGMgT3B0aW9uYWw8Pi4KKyAgbGx2bTo6T3B0aW9uYWw8RHluVHlwZWRNYXRjaGVyPiB0cnlCaW5kKFN0cmluZ1JlZiBJRCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgdW5pcXVlIFxwIElEIGZvciB0aGUgbWF0Y2hlci4KKyAgLy8vCisgIC8vLyBDYXN0aW5nIGEgTWF0Y2hlcjxUPiB0byBNYXRjaGVyPFU+IGNyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgaGFzIHRoZQorICAvLy8gc2FtZSBcYyBJbXBsZW1lbnRhdGlvbiBwb2ludGVyLCBidXQgZGlmZmVyZW50IFxjIFJlc3RyaWN0S2luZC4gV2UgbmVlZCB0bworICAvLy8gaW5jbHVkZSBib3RoIGluIHRoZSBJRCB0byBtYWtlIGl0IHVuaXF1ZS4KKyAgLy8vCisgIC8vLyBcYyBNYXRjaGVySURUeXBlIHN1cHBvcnRzIG9wZXJhdG9yPCBhbmQgcHJvdmlkZXMgc3RyaWN0IHdlYWsgb3JkZXJpbmcuCisgIHVzaW5nIE1hdGNoZXJJRFR5cGUgPSBzdGQ6OnBhaXI8YXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZCwgdWludDY0X3Q+OworICBNYXRjaGVySURUeXBlIGdldElEKCkgY29uc3QgeworICAgIC8vLyBGSVhNRTogRG9jdW1lbnQgdGhlIHJlcXVpcmVtZW50cyB0aGlzIGltcG9zZXMgb24gbWF0Y2hlcgorICAgIC8vLyBpbXBsZW1lbnRhdGlvbnMgKG5vIG5ldygpIGltcGxlbWVudGF0aW9uXyBkdXJpbmcgYSBNYXRjaGVzKCkpLgorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihSZXN0cmljdEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3Q+KEltcGxlbWVudGF0aW9uLmdldCgpKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHR5cGUgdGhpcyBtYXRjaGVyIHdvcmtzIG9uLgorICAvLy8KKyAgLy8vIFxjIG1hdGNoZXMoKSB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UgdW5sZXNzIHRoZSBub2RlIHBhc3NlZCBpcyBvZiB0aGlzCisgIC8vLyBvciBhIGRlcml2ZWQgdHlwZS4KKyAgYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZCBnZXRTdXBwb3J0ZWRLaW5kKCkgY29uc3QgeworICAgIHJldHVybiBTdXBwb3J0ZWRLaW5kOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIFxjIHRydWUgaWYgdGhlIHBhc3NlZCBcYyBEeW5UeXBlZE1hdGNoZXIgY2FuIGJlIGNvbnZlcnRlZAorICAvLy8gICB0byBhIFxjIE1hdGNoZXI8VD4uCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgdmVyaWZpZXMgdGhhdCB0aGUgdW5kZXJseWluZyBtYXRjaGVyIGluIFxjIE90aGVyIGNhbiBwcm9jZXNzCisgIC8vLyBub2RlcyBvZiB0eXBlcyBULgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYm9vbCBjYW5Db252ZXJ0VG8oKSBjb25zdCB7CisgICAgcmV0dXJuIGNhbkNvbnZlcnRUbyhhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZUtpbmQ8VD4oKSk7CisgIH0KKyAgYm9vbCBjYW5Db252ZXJ0VG8oYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZCBUbykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBcYyBNYXRjaGVyPFQ+IGludGVyZmFjZSBhcm91bmQgdGhlIGR5bmFtaWMgbWF0Y2hlci4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBhc3NlcnRzIHRoYXQgXGMgY2FuQ29udmVydFRvKCkgaXMgXGMgdHJ1ZS4gQ2FsbGVycworICAvLy8gc2hvdWxkIGNhbGwgXGMgY2FuQ29udmVydFRvKCkgZmlyc3QgdG8gbWFrZSBzdXJlIHRoYXQgXGMgdGhpcyBpcworICAvLy8gY29tcGF0aWJsZSB3aXRoIFQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBNYXRjaGVyPFQ+IGNvbnZlcnRUbygpIGNvbnN0IHsKKyAgICBhc3NlcnQoY2FuQ29udmVydFRvPFQ+KCkpOworICAgIHJldHVybiB1bmNvbmRpdGlvbmFsQ29udmVydFRvPFQ+KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFNhbWUgYXMgXGMgY29udmVydFRvKCksIGJ1dCBkb2VzIG5vdCBjaGVjayB0aGF0IHRoZSB1bmRlcmx5aW5nCisgIC8vLyAgIG1hdGNoZXIgY2FuIGhhbmRsZSBhIHZhbHVlIG9mIFQuCisgIC8vLworICAvLy8gSWYgaXQgaXMgbm90IGNvbXBhdGlibGUsIHRoZW4gdGhpcyBtYXRjaGVyIHdpbGwgbmV2ZXIgbWF0Y2ggYW55dGhpbmcuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBNYXRjaGVyPFQ+IHVuY29uZGl0aW9uYWxDb252ZXJ0VG8oKSBjb25zdDsKKworcHJpdmF0ZToKKyBEeW5UeXBlZE1hdGNoZXIoYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZCBTdXBwb3J0ZWRLaW5kLAorICAgICAgICAgICAgICAgICBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kIFJlc3RyaWN0S2luZCwKKyAgICAgICAgICAgICAgICAgSW50cnVzaXZlUmVmQ250UHRyPER5bk1hdGNoZXJJbnRlcmZhY2U+IEltcGxlbWVudGF0aW9uKQorICAgICA6IFN1cHBvcnRlZEtpbmQoU3VwcG9ydGVkS2luZCksIFJlc3RyaWN0S2luZChSZXN0cmljdEtpbmQpLAorICAgICAgIEltcGxlbWVudGF0aW9uKHN0ZDo6bW92ZShJbXBsZW1lbnRhdGlvbikpIHt9CisKKyAgYm9vbCBBbGxvd0JpbmQgPSBmYWxzZTsKKyAgYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZCBTdXBwb3J0ZWRLaW5kOworCisgIC8vLyBcYnJpZWYgQSBwb3RlbnRpYWxseSBzdHJpY3RlciBub2RlIGtpbmQuCisgIC8vLworICAvLy8gSXQgYWxsb3dzIHRvIHBlcmZvcm0gaW1wbGljaXQgYW5kIGR5bmFtaWMgY2FzdCBvZiBtYXRjaGVycyB3aXRob3V0CisgIC8vLyBuZWVkaW5nIHRvIGNoYW5nZSBcYyBJbXBsZW1lbnRhdGlvbi4KKyAgYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZCBSZXN0cmljdEtpbmQ7CisgIEludHJ1c2l2ZVJlZkNudFB0cjxEeW5NYXRjaGVySW50ZXJmYWNlPiBJbXBsZW1lbnRhdGlvbjsKK307CisKKy8vLyBcYnJpZWYgV3JhcHBlciBiYXNlIGNsYXNzIGZvciBhIHdyYXBwaW5nIG1hdGNoZXIuCisvLy8KKy8vLyBUaGlzIGlzIGp1c3QgYSBjb250YWluZXIgZm9yIGEgRHluVHlwZWRNYXRjaGVyIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBiYXNlCisvLy8gY2xhc3MgZm9yIGFub3RoZXIgbWF0Y2hlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgV3JhcHBlck1hdGNoZXJJbnRlcmZhY2UgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Citwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IFdyYXBwZXJNYXRjaGVySW50ZXJmYWNlKER5blR5cGVkTWF0Y2hlciAmJklubmVyTWF0Y2hlcikKKyAgICAgIDogSW5uZXJNYXRjaGVyKHN0ZDo6bW92ZShJbm5lck1hdGNoZXIpKSB7fQorCisgIGNvbnN0IER5blR5cGVkTWF0Y2hlciBJbm5lck1hdGNoZXI7Cit9OworCisvLy8gXGJyaWVmIFdyYXBwZXIgb2YgYSBNYXRjaGVySW50ZXJmYWNlPFQ+ICp0aGF0IGFsbG93cyBjb3B5aW5nLgorLy8vCisvLy8gQSBNYXRjaGVyPEJhc2U+IGNhbiBiZSB1c2VkIGFueXdoZXJlIGEgTWF0Y2hlcjxEZXJpdmVkPiBpcworLy8vIHJlcXVpcmVkLiBUaGlzIGVzdGFibGlzaGVzIGFuIGlzLWEgcmVsYXRpb25zaGlwIHdoaWNoIGlzIHJldmVyc2UKKy8vLyB0byB0aGUgQVNUIGhpZXJhcmNoeS4gSW4gb3RoZXIgd29yZHMsIE1hdGNoZXI8VD4gaXMgY29udHJhdmFyaWFudAorLy8vIHdpdGggcmVzcGVjdCB0byBULiBUaGUgcmVsYXRpb25zaGlwIGlzIGJ1aWx0IHZpYSBhIHR5cGUgY29udmVyc2lvbgorLy8vIG9wZXJhdG9yIHJhdGhlciB0aGFuIGEgdHlwZSBoaWVyYXJjaHkgdG8gYmUgYWJsZSB0byB0ZW1wbGF0aXplIHRoZQorLy8vIHR5cGUgaGllcmFyY2h5IGluc3RlYWQgb2Ygc3BlbGxpbmcgaXQgb3V0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBNYXRjaGVyIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBUYWtlcyBvd25lcnNoaXAgb2YgdGhlIHByb3ZpZGVkIGltcGxlbWVudGF0aW9uIHBvaW50ZXIuCisgIGV4cGxpY2l0IE1hdGNoZXIoTWF0Y2hlckludGVyZmFjZTxUPiAqSW1wbGVtZW50YXRpb24pCisgICAgICA6IEltcGxlbWVudGF0aW9uKEltcGxlbWVudGF0aW9uKSB7fQorCisgIC8vLyBcYnJpZWYgSW1wbGljaXRseSBjb252ZXJ0cyBcYyBPdGhlciB0byBhIE1hdGNoZXI8VD4uCisgIC8vLworICAvLy8gUmVxdWlyZXMgXGMgVCB0byBiZSBkZXJpdmVkIGZyb20gXGMgRnJvbS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+CisgIE1hdGNoZXIoY29uc3QgTWF0Y2hlcjxGcm9tPiAmT3RoZXIsCisgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19iYXNlX29mPEZyb20sIFQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdGQ6OmlzX3NhbWU8RnJvbSwgVD46OnZhbHVlPjo6dHlwZSAqID0gbnVsbHB0cikKKyAgICAgIDogSW1wbGVtZW50YXRpb24ocmVzdHJpY3RNYXRjaGVyKE90aGVyLkltcGxlbWVudGF0aW9uKSkgeworICAgIGFzc2VydChJbXBsZW1lbnRhdGlvbi5nZXRTdXBwb3J0ZWRLaW5kKCkuaXNTYW1lKAorICAgICAgICBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZUtpbmQ8VD4oKSkpOworICB9CisKKyAgLy8vIFxicmllZiBJbXBsaWNpdGx5IGNvbnZlcnRzIFxjIE1hdGNoZXI8VHlwZT4gdG8gXGMgTWF0Y2hlcjxRdWFsVHlwZT4uCisgIC8vLworICAvLy8gVGhlIHJlc3VsdGluZyBtYXRjaGVyIGlzIG5vdCBzdHJpY3QsIGkuZS4gaWdub3JlcyBxdWFsaWZpZXJzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZVQ+CisgIE1hdGNoZXIoY29uc3QgTWF0Y2hlcjxUeXBlVD4gJk90aGVyLAorICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIFF1YWxUeXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxUeXBlVCwgVHlwZT46OnZhbHVlPjo6dHlwZSogPSBudWxscHRyKQorICAgICAgOiBJbXBsZW1lbnRhdGlvbihuZXcgVHlwZVRvUXVhbFR5cGU8VHlwZVQ+KE90aGVyKSkge30KKworICAvLy8gXGJyaWVmIENvbnZlcnQgXGMgdGhpcyBpbnRvIGEgXGMgTWF0Y2hlcjxUPiBieSBhcHBseWluZyBkeW5fY2FzdDw+IHRvIHRoZQorICAvLy8gYXJndW1lbnQuCisgIC8vLyBcYyBUbyBtdXN0IGJlIGEgYmFzZSBjbGFzcyBvZiBcYyBULgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVG8+CisgIE1hdGNoZXI8VG8+IGR5bkNhc3RUbygpIGNvbnN0IHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfYmFzZV9vZjxUbywgVD46OnZhbHVlLCAiSW52YWxpZCBkeW5DYXN0IGNhbGwuIik7CisgICAgcmV0dXJuIE1hdGNoZXI8VG8+KEltcGxlbWVudGF0aW9uKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRm9yd2FyZHMgdGhlIGNhbGwgdG8gdGhlIHVuZGVybHlpbmcgTWF0Y2hlckludGVyZmFjZTxUPiBwb2ludGVyLgorICBib29sIG1hdGNoZXMoY29uc3QgVCAmTm9kZSwKKyAgICAgICAgICAgICAgIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCisgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gSW1wbGVtZW50YXRpb24ubWF0Y2hlcyhhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZTo6Y3JlYXRlKE5vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRlciwgQnVpbGRlcik7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgYW4gSUQgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBtYXRjaGVyLgorICBEeW5UeXBlZE1hdGNoZXI6Ok1hdGNoZXJJRFR5cGUgZ2V0SUQoKSBjb25zdCB7CisgICAgcmV0dXJuIEltcGxlbWVudGF0aW9uLmdldElEKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEV4dHJhY3QgdGhlIGR5bmFtaWMgbWF0Y2hlci4KKyAgLy8vCisgIC8vLyBUaGUgcmV0dXJuZWQgbWF0Y2hlciBrZWVwcyB0aGUgc2FtZSByZXN0cmljdGlvbnMgYXMgXGMgdGhpcyBhbmQgcmVtZW1iZXJzCisgIC8vLyB0aGF0IGl0IGlzIG1lYW50IHRvIHN1cHBvcnQgbm9kZXMgb2YgdHlwZSBcYyBULgorICBvcGVyYXRvciBEeW5UeXBlZE1hdGNoZXIoKSBjb25zdCB7IHJldHVybiBJbXBsZW1lbnRhdGlvbjsgfQorCisgIC8vLyBcYnJpZWYgQWxsb3dzIHRoZSBjb252ZXJzaW9uIG9mIGEgXGMgTWF0Y2hlcjxUeXBlPiB0byBhIFxjCisgIC8vLyBNYXRjaGVyPFF1YWxUeXBlPi4KKyAgLy8vCisgIC8vLyBEZXBlbmRpbmcgb24gdGhlIGNvbnN0cnVjdG9yIGFyZ3VtZW50LCB0aGUgbWF0Y2hlciBpcyBlaXRoZXIgc3RyaWN0LCBpLmUuCisgIC8vLyBkb2VzIG9ubHkgbWF0Y2hlcyBpbiB0aGUgYWJzZW5jZSBvZiBxdWFsaWZpZXJzLCBvciBub3QsIGkuZS4gc2ltcGx5CisgIC8vLyBpZ25vcmVzIGFueSBxdWFsaWZpZXJzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZVQ+CisgIGNsYXNzIFR5cGVUb1F1YWxUeXBlIDogcHVibGljIFdyYXBwZXJNYXRjaGVySW50ZXJmYWNlPFF1YWxUeXBlPiB7CisgIHB1YmxpYzoKKyAgICBUeXBlVG9RdWFsVHlwZShjb25zdCBNYXRjaGVyPFR5cGVUPiAmSW5uZXJNYXRjaGVyKQorICAgICAgICA6IFR5cGVUb1F1YWxUeXBlOjpXcmFwcGVyTWF0Y2hlckludGVyZmFjZShJbm5lck1hdGNoZXIpIHt9CisKKyAgICBib29sIG1hdGNoZXMoY29uc3QgUXVhbFR5cGUgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCisgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgaWYgKE5vZGUuaXNOdWxsKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiB0aGlzLT5Jbm5lck1hdGNoZXIubWF0Y2hlcygKKyAgICAgICAgICBhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZTo6Y3JlYXRlKCpOb2RlKSwgRmluZGVyLCBCdWlsZGVyKTsKKyAgICB9CisgIH07CisKK3ByaXZhdGU6CisgIC8vIEZvciBNYXRjaGVyPFQ+IDw9PiBNYXRjaGVyPFU+IGNvbnZlcnNpb25zLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gZnJpZW5kIGNsYXNzIE1hdGNoZXI7CisKKyAgLy8gRm9yIER5blR5cGVkTWF0Y2hlcjo6dW5jb25kaXRpb25hbENvbnZlcnRUbzxUPi4KKyAgZnJpZW5kIGNsYXNzIER5blR5cGVkTWF0Y2hlcjsKKworICBzdGF0aWMgRHluVHlwZWRNYXRjaGVyIHJlc3RyaWN0TWF0Y2hlcihjb25zdCBEeW5UeXBlZE1hdGNoZXIgJk90aGVyKSB7CisgICAgcmV0dXJuIE90aGVyLmR5bkNhc3RUbyhhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZUtpbmQ8VD4oKSk7CisgIH0KKworICBleHBsaWNpdCBNYXRjaGVyKGNvbnN0IER5blR5cGVkTWF0Y2hlciAmSW1wbGVtZW50YXRpb24pCisgICAgICA6IEltcGxlbWVudGF0aW9uKHJlc3RyaWN0TWF0Y2hlcihJbXBsZW1lbnRhdGlvbikpIHsKKyAgICBhc3NlcnQodGhpcy0+SW1wbGVtZW50YXRpb24uZ2V0U3VwcG9ydGVkS2luZCgpCisgICAgICAgICAgICAgICAuaXNTYW1lKGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQ6OmdldEZyb21Ob2RlS2luZDxUPigpKSk7CisgIH0KKworICBEeW5UeXBlZE1hdGNoZXIgSW1wbGVtZW50YXRpb247Cit9OyAgLy8gY2xhc3MgTWF0Y2hlcgorCisvLy8gXGJyaWVmIEEgY29udmVuaWVudCBoZWxwZXIgZm9yIGNyZWF0aW5nIGEgTWF0Y2hlcjxUPiB3aXRob3V0IHNwZWNpZnlpbmcKKy8vLyB0aGUgdGVtcGxhdGUgdHlwZSBhcmd1bWVudC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIE1hdGNoZXI8VD4gbWFrZU1hdGNoZXIoTWF0Y2hlckludGVyZmFjZTxUPiAqSW1wbGVtZW50YXRpb24pIHsKKyAgcmV0dXJuIE1hdGNoZXI8VD4oSW1wbGVtZW50YXRpb24pOworfQorCisvLy8gXGJyaWVmIFNwZWNpYWxpemF0aW9uIG9mIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBmb3IgUXVhbFR5cGUuCisvLy8KKy8vLyBUaGlzIHNwZWNpYWxpemF0aW9uIHByb3ZpZGVzIHRoZSBNYXRjaGVyPFR5cGU+LT5NYXRjaGVyPFF1YWxUeXBlPgorLy8vIGNvbnZlcnNpb24gdGhhdCB0aGUgc3RhdGljIEFQSSBkb2VzLgordGVtcGxhdGUgPD4KK2lubGluZSBNYXRjaGVyPFF1YWxUeXBlPiBEeW5UeXBlZE1hdGNoZXI6OmNvbnZlcnRUbzxRdWFsVHlwZT4oKSBjb25zdCB7CisgIGFzc2VydChjYW5Db252ZXJ0VG88UXVhbFR5cGU+KCkpOworICBjb25zdCBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kIFNvdXJjZUtpbmQgPSBnZXRTdXBwb3J0ZWRLaW5kKCk7CisgIGlmIChTb3VyY2VLaW5kLmlzU2FtZSgKKyAgICAgICAgICBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZUtpbmQ8VHlwZT4oKSkpIHsKKyAgICAvLyBXZSBzdXBwb3J0IGltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSBNYXRjaGVyPFR5cGU+IHRvIE1hdGNoZXI8UXVhbFR5cGU+CisgICAgcmV0dXJuIHVuY29uZGl0aW9uYWxDb252ZXJ0VG88VHlwZT4oKTsKKyAgfQorICByZXR1cm4gdW5jb25kaXRpb25hbENvbnZlcnRUbzxRdWFsVHlwZT4oKTsKK30KKworLy8vIFxicmllZiBGaW5kcyB0aGUgZmlyc3Qgbm9kZSBpbiBhIHJhbmdlIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gbWF0Y2hlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVCwgdHlwZW5hbWUgSXRlcmF0b3JUPgorYm9vbCBtYXRjaGVzRmlyc3RJblJhbmdlKGNvbnN0IE1hdGNoZXJUICZNYXRjaGVyLCBJdGVyYXRvclQgU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JUIEVuZCwgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIHsKKyAgZm9yIChJdGVyYXRvclQgSSA9IFN0YXJ0OyBJICE9IEVuZDsgKytJKSB7CisgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyIFJlc3VsdCgqQnVpbGRlcik7CisgICAgaWYgKE1hdGNoZXIubWF0Y2hlcygqSSwgRmluZGVyLCAmUmVzdWx0KSkgeworICAgICAgKkJ1aWxkZXIgPSBzdGQ6Om1vdmUoUmVzdWx0KTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBcYnJpZWYgRmluZHMgdGhlIGZpcnN0IG5vZGUgaW4gYSBwb2ludGVyIHJhbmdlIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4KKy8vLyBtYXRjaGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXJULCB0eXBlbmFtZSBJdGVyYXRvclQ+Citib29sIG1hdGNoZXNGaXJzdEluUG9pbnRlclJhbmdlKGNvbnN0IE1hdGNoZXJUICZNYXRjaGVyLCBJdGVyYXRvclQgU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yVCBFbmQsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgeworICBmb3IgKEl0ZXJhdG9yVCBJID0gU3RhcnQ7IEkgIT0gRW5kOyArK0kpIHsKKyAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgUmVzdWx0KCpCdWlsZGVyKTsKKyAgICBpZiAoTWF0Y2hlci5tYXRjaGVzKCoqSSwgRmluZGVyLCAmUmVzdWx0KSkgeworICAgICAgKkJ1aWxkZXIgPSBzdGQ6Om1vdmUoUmVzdWx0KTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIE1ldGFmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgdHlwZSBUIGhhcyBhIG1lbWJlciBjYWxsZWQgZ2V0RGVjbC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUeT4KK2NsYXNzIGhhc19nZXREZWNsIHsKKyAgdXNpbmcgeWVzID0gY2hhclsxXTsKKyAgdXNpbmcgbm8gPSBjaGFyWzJdOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lcj4KKyAgc3RhdGljIHllcyYgdGVzdChJbm5lciAqSSwgZGVjbHR5cGUoSS0+Z2V0RGVjbCgpKSAqID0gbnVsbHB0cik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lPgorICBzdGF0aWMgbm8mIHRlc3QoLi4uKTsKKworcHVibGljOgorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHNpemVvZih0ZXN0PFR5PihudWxscHRyKSkgPT0gc2l6ZW9mKHllcyk7Cit9OworCisvLy8gXGJyaWVmIE1hdGNoZXMgb3ZlcmxvYWRlZCBvcGVyYXRvcnMgd2l0aCBhIHNwZWNpZmljIG5hbWUuCisvLy8KKy8vLyBUaGUgdHlwZSBhcmd1bWVudCBBcmdUIGlzIG5vdCB1c2VkIGJ5IHRoaXMgbWF0Y2hlciBidXQgaXMgdXNlZCBieQorLy8vIFBvbHltb3JwaGljTWF0Y2hlcldpdGhQYXJhbTEgYW5kIHNob3VsZCBiZSBTdHJpbmdSZWYuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnVD4KK2NsYXNzIEhhc092ZXJsb2FkZWRPcGVyYXRvck5hbWVNYXRjaGVyIDogcHVibGljIFNpbmdsZU5vZGVNYXRjaGVySW50ZXJmYWNlPFQ+IHsKKyAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8VCwgQ1hYT3BlcmF0b3JDYWxsRXhwcj46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mPEZ1bmN0aW9uRGVjbCwgVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBjbGFzcyBmb3IgbWF0Y2hlciIpOworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxBcmdULCBTdHJpbmdSZWY+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiYXJndW1lbnQgdHlwZSBtdXN0IGJlIFN0cmluZ1JlZiIpOworCitwdWJsaWM6CisgIGV4cGxpY2l0IEhhc092ZXJsb2FkZWRPcGVyYXRvck5hbWVNYXRjaGVyKGNvbnN0IFN0cmluZ1JlZiBOYW1lKQorICAgICAgOiBTaW5nbGVOb2RlTWF0Y2hlckludGVyZmFjZTxUPigpLCBOYW1lKE5hbWUpIHt9CisKKyAgYm9vbCBtYXRjaGVzTm9kZShjb25zdCBUICZOb2RlKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIG1hdGNoZXNTcGVjaWFsaXplZChOb2RlKTsKKyAgfQorCitwcml2YXRlOgorCisgIC8vLyBcYnJpZWYgQ1hYT3BlcmF0b3JDYWxsRXhwciBleGlzdCBvbmx5IGZvciBjYWxscyB0byBvdmVybG9hZGVkIG9wZXJhdG9ycworICAvLy8gc28gdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIGNhbGwgaXMgdG8gYW4gb3BlcmF0b3Igb2YgdGhlIGdpdmVuCisgIC8vLyBuYW1lLgorICBib29sIG1hdGNoZXNTcGVjaWFsaXplZChjb25zdCBDWFhPcGVyYXRvckNhbGxFeHByICZOb2RlKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wZXJhdG9yU3BlbGxpbmcoTm9kZS5nZXRPcGVyYXRvcigpKSA9PSBOYW1lOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgb25seSBpZiBDWFhNZXRob2REZWNsIHJlcHJlc2VudHMgYW4gb3ZlcmxvYWRlZAorICAvLy8gb3BlcmF0b3IgYW5kIGhhcyB0aGUgZ2l2ZW4gb3BlcmF0b3IgbmFtZS4KKyAgYm9vbCBtYXRjaGVzU3BlY2lhbGl6ZWQoY29uc3QgRnVuY3Rpb25EZWNsICZOb2RlKSBjb25zdCB7CisgICAgcmV0dXJuIE5vZGUuaXNPdmVybG9hZGVkT3BlcmF0b3IoKSAmJgorICAgICAgICAgICBnZXRPcGVyYXRvclNwZWxsaW5nKE5vZGUuZ2V0T3ZlcmxvYWRlZE9wZXJhdG9yKCkpID09IE5hbWU7CisgIH0KKworICBzdGQ6OnN0cmluZyBOYW1lOworfTsKKworLy8vIFxicmllZiBNYXRjaGVzIG5hbWVkIGRlY2xhcmF0aW9ucyB3aXRoIGEgc3BlY2lmaWMgbmFtZS4KKy8vLworLy8vIFNlZSBcYyBoYXNOYW1lKCkgYW5kIFxjIGhhc0FueU5hbWUoKSBpbiBBU1RNYXRjaGVycy5oIGZvciBkZXRhaWxzLgorY2xhc3MgSGFzTmFtZU1hdGNoZXIgOiBwdWJsaWMgU2luZ2xlTm9kZU1hdGNoZXJJbnRlcmZhY2U8TmFtZWREZWNsPiB7CisgcHVibGljOgorICBleHBsaWNpdCBIYXNOYW1lTWF0Y2hlcihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTmFtZXMpOworCisgIGJvb2wgbWF0Y2hlc05vZGUoY29uc3QgTmFtZWREZWNsICZOb2RlKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIC8vLyBcYnJpZWYgVW5xdWFsaWZpZWQgbWF0Y2ggcm91dGluZS4KKyAgLy8vCisgIC8vLyBJdCBpcyBtdWNoIGZhc3RlciB0aGFuIHRoZSBmdWxsIG1hdGNoLCBidXQgaXQgb25seSB3b3JrcyBmb3IgdW5xdWFsaWZpZWQKKyAgLy8vIG1hdGNoZXMuCisgIGJvb2wgbWF0Y2hlc05vZGVVbnF1YWxpZmllZChjb25zdCBOYW1lZERlY2wgJk5vZGUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRnVsbCBtYXRjaCByb3V0aW5lCisgIC8vLworICAvLy8gRmFzdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHNpbXBsZSBjYXNlIG9mIGEgbmFtZWQgZGVjbGFyYXRpb24gYXQKKyAgLy8vIG5hbWVzcGFjZSBvciBSZWNvcmREZWNsIHNjb3BlLgorICAvLy8gSXQgaXMgc2xvd2VyIHRoYW4gbWF0Y2hlc05vZGVVbnF1YWxpZmllZCwgYnV0IGZhc3RlciB0aGFuCisgIC8vLyBtYXRjaGVzTm9kZUZ1bGxTbG93LgorICBib29sIG1hdGNoZXNOb2RlRnVsbEZhc3QoY29uc3QgTmFtZWREZWNsICZOb2RlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEZ1bGwgbWF0Y2ggcm91dGluZQorICAvLy8KKyAgLy8vIEl0IGdlbmVyYXRlcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGRlY2xhcmF0aW9uICh3aGljaCBpcworICAvLy8gZXhwZW5zaXZlKSBiZWZvcmUgdHJ5aW5nIHRvIG1hdGNoLgorICAvLy8gSXQgaXMgc2xvd2VyIGJ1dCBzaW1wbGUgYW5kIHdvcmtzIG9uIGFsbCBjYXNlcy4KKyAgYm9vbCBtYXRjaGVzTm9kZUZ1bGxTbG93KGNvbnN0IE5hbWVkRGVjbCAmTm9kZSkgY29uc3Q7CisKKyAgY29uc3QgYm9vbCBVc2VVbnF1YWxpZmllZE1hdGNoOworICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTmFtZXM7Cit9OworCisvLy8gXGJyaWVmIFRyYW1wb2xpbmUgZnVuY3Rpb24gdG8gdXNlIFZhcmlhZGljRnVuY3Rpb248PiB0byBjb25zdHJ1Y3QgYQorLy8vICAgICAgICBIYXNOYW1lTWF0Y2hlci4KK01hdGNoZXI8TmFtZWREZWNsPiBoYXNBbnlOYW1lRnVuYyhBcnJheVJlZjxjb25zdCBTdHJpbmdSZWYgKj4gTmFtZVJlZnMpOworCisvLy8gXGJyaWVmIFRyYW1wb2xpbmUgZnVuY3Rpb24gdG8gdXNlIFZhcmlhZGljRnVuY3Rpb248PiB0byBjb25zdHJ1Y3QgYQorLy8vICAgICAgICBoYXNBbnlTZWxlY3RvciBtYXRjaGVyLgorTWF0Y2hlcjxPYmpDTWVzc2FnZUV4cHI+IGhhc0FueVNlbGVjdG9yRnVuYygKKyAgICBBcnJheVJlZjxjb25zdCBTdHJpbmdSZWYgKj4gTmFtZVJlZnMpOworCisvLy8gXGJyaWVmIE1hdGNoZXMgZGVjbGFyYXRpb25zIGZvciBRdWFsVHlwZSBhbmQgQ2FsbEV4cHIuCisvLy8KKy8vLyBUeXBlIGFyZ3VtZW50IERlY2xNYXRjaGVyVCBpcyByZXF1aXJlZCBieSBQb2x5bW9ycGhpY01hdGNoZXJXaXRoUGFyYW0xIGJ1dAorLy8vIG5vdCBhY3R1YWxseSB1c2VkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIERlY2xNYXRjaGVyVD4KK2NsYXNzIEhhc0RlY2xhcmF0aW9uTWF0Y2hlciA6IHB1YmxpYyBXcmFwcGVyTWF0Y2hlckludGVyZmFjZTxUPiB7CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPERlY2xNYXRjaGVyVCwgTWF0Y2hlcjxEZWNsPj46OnZhbHVlLAorICAgICAgICAgICAgICAgICJpbnN0YW50aWF0ZWQgd2l0aCB3cm9uZyB0eXBlcyIpOworCitwdWJsaWM6CisgIGV4cGxpY2l0IEhhc0RlY2xhcmF0aW9uTWF0Y2hlcihjb25zdCBNYXRjaGVyPERlY2w+ICZJbm5lck1hdGNoZXIpCisgICAgICA6IEhhc0RlY2xhcmF0aW9uTWF0Y2hlcjo6V3JhcHBlck1hdGNoZXJJbnRlcmZhY2UoSW5uZXJNYXRjaGVyKSB7fQorCisgIGJvb2wgbWF0Y2hlcyhjb25zdCBUICZOb2RlLCBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAorICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIG1hdGNoZXNTcGVjaWFsaXplZChOb2RlLCBGaW5kZXIsIEJ1aWxkZXIpOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgRm9yd2FyZHMgdG8gbWF0Y2hpbmcgb24gdGhlIHVuZGVybHlpbmcgdHlwZSBvZiB0aGUgUXVhbFR5cGUuCisgIGJvb2wgbWF0Y2hlc1NwZWNpYWxpemVkKGNvbnN0IFF1YWxUeXBlICZOb2RlLCBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0IHsKKyAgICBpZiAoTm9kZS5pc051bGwoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBtYXRjaGVzU3BlY2lhbGl6ZWQoKk5vZGUsIEZpbmRlciwgQnVpbGRlcik7CisgIH0KKworICAvLy8gXGJyaWVmIEZpbmRzIHRoZSBiZXN0IGRlY2xhcmF0aW9uIGZvciBhIHR5cGUgYW5kIHJldHVybnMgd2hldGhlciB0aGUgaW5uZXIKKyAgLy8vIG1hdGNoZXIgbWF0Y2hlcyBvbiBpdC4KKyAgYm9vbCBtYXRjaGVzU3BlY2lhbGl6ZWQoY29uc3QgVHlwZSAmTm9kZSwgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyKSBjb25zdCB7CisgICAgLy8gRGVkdWNlZFR5cGUgZG9lcyBub3QgaGF2ZSBkZWNsYXJhdGlvbnMgb2YgaXRzIG93biwgc28KKyAgICAvLyBtYXRjaCB0aGUgZGVkdWNlZCB0eXBlIGluc3RlYWQuCisgICAgY29uc3QgVHlwZSAqRWZmZWN0aXZlVHlwZSA9ICZOb2RlOworICAgIGlmIChjb25zdCBhdXRvICpTID0gZHluX2Nhc3Q8RGVkdWNlZFR5cGU+KCZOb2RlKSkgeworICAgICAgRWZmZWN0aXZlVHlwZSA9IFMtPmdldERlZHVjZWRUeXBlKCkuZ2V0VHlwZVB0ck9yTnVsbCgpOworICAgICAgaWYgKCFFZmZlY3RpdmVUeXBlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gRmlyc3QsIGZvciBhbnkgdHlwZXMgdGhhdCBoYXZlIGEgZGVjbGFyYXRpb24sIGV4dHJhY3QgdGhlIGRlY2xhcmF0aW9uIGFuZAorICAgIC8vIG1hdGNoIG9uIGl0LgorICAgIGlmIChjb25zdCBhdXRvICpTID0gZHluX2Nhc3Q8VGFnVHlwZT4oRWZmZWN0aXZlVHlwZSkpIHsKKyAgICAgIHJldHVybiBtYXRjaGVzRGVjbChTLT5nZXREZWNsKCksIEZpbmRlciwgQnVpbGRlcik7CisgICAgfQorICAgIGlmIChjb25zdCBhdXRvICpTID0gZHluX2Nhc3Q8SW5qZWN0ZWRDbGFzc05hbWVUeXBlPihFZmZlY3RpdmVUeXBlKSkgeworICAgICAgcmV0dXJuIG1hdGNoZXNEZWNsKFMtPmdldERlY2woKSwgRmluZGVyLCBCdWlsZGVyKTsKKyAgICB9CisgICAgaWYgKGNvbnN0IGF1dG8gKlMgPSBkeW5fY2FzdDxUZW1wbGF0ZVR5cGVQYXJtVHlwZT4oRWZmZWN0aXZlVHlwZSkpIHsKKyAgICAgIHJldHVybiBtYXRjaGVzRGVjbChTLT5nZXREZWNsKCksIEZpbmRlciwgQnVpbGRlcik7CisgICAgfQorICAgIGlmIChjb25zdCBhdXRvICpTID0gZHluX2Nhc3Q8VHlwZWRlZlR5cGU+KEVmZmVjdGl2ZVR5cGUpKSB7CisgICAgICByZXR1cm4gbWF0Y2hlc0RlY2woUy0+Z2V0RGVjbCgpLCBGaW5kZXIsIEJ1aWxkZXIpOworICAgIH0KKyAgICBpZiAoY29uc3QgYXV0byAqUyA9IGR5bl9jYXN0PFVucmVzb2x2ZWRVc2luZ1R5cGU+KEVmZmVjdGl2ZVR5cGUpKSB7CisgICAgICByZXR1cm4gbWF0Y2hlc0RlY2woUy0+Z2V0RGVjbCgpLCBGaW5kZXIsIEJ1aWxkZXIpOworICAgIH0KKyAgICBpZiAoY29uc3QgYXV0byAqUyA9IGR5bl9jYXN0PE9iakNPYmplY3RUeXBlPihFZmZlY3RpdmVUeXBlKSkgeworICAgICAgcmV0dXJuIG1hdGNoZXNEZWNsKFMtPmdldEludGVyZmFjZSgpLCBGaW5kZXIsIEJ1aWxkZXIpOworICAgIH0KKworICAgIC8vIEEgU3Vic3RUZW1wbGF0ZVR5cGVQYXJtVHlwZSBleGlzdHMgc29sZWx5IHRvIG1hcmsgYSB0eXBlIHN1YnN0aXR1dGlvbgorICAgIC8vIG9uIHRoZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGUuIEFzIHVzZXJzIHVzdWFsbHkgd2FudCB0byBtYXRjaCB0aGUKKyAgICAvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb24gdGhlIHVuaW5pdGlhbGl6ZWQgdGVtcGxhdGUsIHdlIGNhbiBhbHdheXMgZGVzdWdhcgorICAgIC8vIG9uZSBsZXZlbCB3aXRob3V0IGxvc3Mgb2YgZXhwcmVzc2l2bmVzcy4KKyAgICAvLyBGb3IgZXhhbXBsZSwgZ2l2ZW46CisgICAgLy8gICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWCB7IFQgdDsgfSBjbGFzcyBBIHt9OyBYPEE+IGE7CisgICAgLy8gVGhlIGZvbGxvd2luZyBtYXRjaGVyIHdpbGwgbWF0Y2gsIHdoaWNoIG90aGVyd2lzZSB3b3VsZCBub3Q6CisgICAgLy8gICBmaWVsZERlY2woaGFzVHlwZShwb2ludGVyVHlwZSgpKSkuCisgICAgaWYgKGNvbnN0IGF1dG8gKlMgPSBkeW5fY2FzdDxTdWJzdFRlbXBsYXRlVHlwZVBhcm1UeXBlPihFZmZlY3RpdmVUeXBlKSkgeworICAgICAgcmV0dXJuIG1hdGNoZXNTcGVjaWFsaXplZChTLT5nZXRSZXBsYWNlbWVudFR5cGUoKSwgRmluZGVyLCBCdWlsZGVyKTsKKyAgICB9CisKKyAgICAvLyBGb3IgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdHlwZXMsIHdlIHdhbnQgdG8gbWF0Y2ggdGhlIHRlbXBsYXRlCisgICAgLy8gZGVjbGFyYXRpb24sIGFzIGxvbmcgYXMgdGhlIHR5cGUgaXMgc3RpbGwgZGVwZW5kZW50LCBhbmQgb3RoZXJ3aXNlIHRoZQorICAgIC8vIGRlY2xhcmF0aW9uIG9mIHRoZSBpbnN0YW50aWF0ZWQgdGFnIHR5cGUuCisgICAgaWYgKGNvbnN0IGF1dG8gKlMgPSBkeW5fY2FzdDxUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZT4oRWZmZWN0aXZlVHlwZSkpIHsKKyAgICAgIGlmICghUy0+aXNUeXBlQWxpYXMoKSAmJiBTLT5pc1N1Z2FyZWQoKSkgeworICAgICAgICAvLyBJZiB0aGUgdGVtcGxhdGUgaXMgbm9uLWRlcGVuZGVudCwgd2Ugd2FudCB0byBtYXRjaCB0aGUgaW5zdGFudGlhdGVkCisgICAgICAgIC8vIHRhZyB0eXBlLgorICAgICAgICAvLyBGb3IgZXhhbXBsZSwgZ2l2ZW46CisgICAgICAgIC8vICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFgge307IFg8aW50PiBhOworICAgICAgICAvLyBUaGUgZm9sbG93aW5nIG1hdGNoZXIgd2lsbCBtYXRjaCwgd2hpY2ggb3RoZXJ3aXNlIHdvdWxkIG5vdDoKKyAgICAgICAgLy8gICB0ZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZShoYXNEZWNsYXJhdGlvbihjeHhSZWNvcmREZWNsKCkpKS4KKyAgICAgICAgcmV0dXJuIG1hdGNoZXNTcGVjaWFsaXplZCgqUy0+ZGVzdWdhcigpLCBGaW5kZXIsIEJ1aWxkZXIpOworICAgICAgfQorICAgICAgLy8gSWYgdGhlIHRlbXBsYXRlIGlzIGRlcGVuZGVudCBvciBhbiBhbGlhcywgbWF0Y2ggdGhlIHRlbXBsYXRlCisgICAgICAvLyBkZWNsYXJhdGlvbi4KKyAgICAgIHJldHVybiBtYXRjaGVzRGVjbChTLT5nZXRUZW1wbGF0ZU5hbWUoKS5nZXRBc1RlbXBsYXRlRGVjbCgpLCBGaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlcik7CisgICAgfQorCisgICAgLy8gRklYTUU6IFdlIGRlc3VnYXIgZWxhYm9yYXRlZCB0eXBlcy4gVGhpcyBtYWtlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IHVzZXJzCisgICAgLy8gZG8gbmV2ZXIgd2FudCB0byBtYXRjaCBvbiB3aGV0aGVyIGEgdHlwZSBpcyBlbGFib3JhdGVkIC0gdGhlcmUgYXJlCisgICAgLy8gYXJndW1lbnRzIGZvciBib3RoIHNpZGVzOyBmb3Igbm93LCBjb250aW51ZSBkZXN1Z2FyaW5nLgorICAgIGlmIChjb25zdCBhdXRvICpTID0gZHluX2Nhc3Q8RWxhYm9yYXRlZFR5cGU+KEVmZmVjdGl2ZVR5cGUpKSB7CisgICAgICByZXR1cm4gbWF0Y2hlc1NwZWNpYWxpemVkKFMtPmRlc3VnYXIoKSwgRmluZGVyLCBCdWlsZGVyKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBFeHRyYWN0cyB0aGUgRGVjbCB0aGUgRGVjbFJlZkV4cHIgcmVmZXJlbmNlcyBhbmQgcmV0dXJucyB3aGV0aGVyCisgIC8vLyB0aGUgaW5uZXIgbWF0Y2hlciBtYXRjaGVzIG9uIGl0LgorICBib29sIG1hdGNoZXNTcGVjaWFsaXplZChjb25zdCBEZWNsUmVmRXhwciAmTm9kZSwgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyKSBjb25zdCB7CisgICAgcmV0dXJuIG1hdGNoZXNEZWNsKE5vZGUuZ2V0RGVjbCgpLCBGaW5kZXIsIEJ1aWxkZXIpOworICB9CisKKyAgLy8vIFxicmllZiBFeHRyYWN0cyB0aGUgRGVjbCBvZiB0aGUgY2FsbGVlIG9mIGEgQ2FsbEV4cHIgYW5kIHJldHVybnMgd2hldGhlcgorICAvLy8gdGhlIGlubmVyIG1hdGNoZXIgbWF0Y2hlcyBvbiBpdC4KKyAgYm9vbCBtYXRjaGVzU3BlY2lhbGl6ZWQoY29uc3QgQ2FsbEV4cHIgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3QgeworICAgIHJldHVybiBtYXRjaGVzRGVjbChOb2RlLmdldENhbGxlZURlY2woKSwgRmluZGVyLCBCdWlsZGVyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRXh0cmFjdHMgdGhlIERlY2wgb2YgdGhlIGNvbnN0cnVjdG9yIGNhbGwgYW5kIHJldHVybnMgd2hldGhlciB0aGUKKyAgLy8vIGlubmVyIG1hdGNoZXIgbWF0Y2hlcyBvbiBpdC4KKyAgYm9vbCBtYXRjaGVzU3BlY2lhbGl6ZWQoY29uc3QgQ1hYQ29uc3RydWN0RXhwciAmTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyKSBjb25zdCB7CisgICAgcmV0dXJuIG1hdGNoZXNEZWNsKE5vZGUuZ2V0Q29uc3RydWN0b3IoKSwgRmluZGVyLCBCdWlsZGVyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRXh0cmFjdHMgdGhlIG9wZXJhdG9yIG5ldyBvZiB0aGUgbmV3IGNhbGwgYW5kIHJldHVybnMgd2hldGhlciB0aGUKKyAgLy8vIGlubmVyIG1hdGNoZXIgbWF0Y2hlcyBvbiBpdC4KKyAgYm9vbCBtYXRjaGVzU3BlY2lhbGl6ZWQoY29uc3QgQ1hYTmV3RXhwciAmTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyKSBjb25zdCB7CisgICAgcmV0dXJuIG1hdGNoZXNEZWNsKE5vZGUuZ2V0T3BlcmF0b3JOZXcoKSwgRmluZGVyLCBCdWlsZGVyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRXh0cmFjdHMgdGhlIFxjIFZhbHVlRGVjbCBhIFxjIE1lbWJlckV4cHIgcmVmZXJzIHRvIGFuZCByZXR1cm5zCisgIC8vLyB3aGV0aGVyIHRoZSBpbm5lciBtYXRjaGVyIG1hdGNoZXMgb24gaXQuCisgIGJvb2wgbWF0Y2hlc1NwZWNpYWxpemVkKGNvbnN0IE1lbWJlckV4cHIgJk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3QgeworICAgIHJldHVybiBtYXRjaGVzRGVjbChOb2RlLmdldE1lbWJlckRlY2woKSwgRmluZGVyLCBCdWlsZGVyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRXh0cmFjdHMgdGhlIFxjIExhYmVsRGVjbCBhIFxjIEFkZHJMYWJlbEV4cHIgcmVmZXJzIHRvIGFuZCByZXR1cm5zCisgIC8vLyB3aGV0aGVyIHRoZSBpbm5lciBtYXRjaGVyIG1hdGNoZXMgb24gaXQuCisgIGJvb2wgbWF0Y2hlc1NwZWNpYWxpemVkKGNvbnN0IEFkZHJMYWJlbEV4cHIgJk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3QgeworICAgIHJldHVybiBtYXRjaGVzRGVjbChOb2RlLmdldExhYmVsKCksIEZpbmRlciwgQnVpbGRlcik7CisgIH0KKworICAvLy8gXGJyaWVmIEV4dHJhY3RzIHRoZSBkZWNsYXJhdGlvbiBvZiBhIExhYmVsU3RtdCBhbmQgcmV0dXJucyB3aGV0aGVyIHRoZQorICAvLy8gaW5uZXIgbWF0Y2hlciBtYXRjaGVzIG9uIGl0LgorICBib29sIG1hdGNoZXNTcGVjaWFsaXplZChjb25zdCBMYWJlbFN0bXQgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3QgeworICAgIHJldHVybiBtYXRjaGVzRGVjbChOb2RlLmdldERlY2woKSwgRmluZGVyLCBCdWlsZGVyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB3aGV0aGVyIHRoZSBpbm5lciBtYXRjaGVyIFxjIE5vZGUuIFJldHVybnMgZmFsc2UgaWYgXGMgTm9kZQorICAvLy8gaXMgXGMgTlVMTC4KKyAgYm9vbCBtYXRjaGVzRGVjbChjb25zdCBEZWNsICpOb2RlLCBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAorICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3QgeworICAgIHJldHVybiBOb2RlICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgdGhpcy0+SW5uZXJNYXRjaGVyLm1hdGNoZXMoCisgICAgICAgICAgICAgICBhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZTo6Y3JlYXRlKCpOb2RlKSwgRmluZGVyLCBCdWlsZGVyKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBJc0Jhc2VUeXBlPFQ+Ojp2YWx1ZSBpcyB0cnVlIGlmIFQgaXMgYSAiYmFzZSIgdHlwZSBpbiB0aGUgQVNUCisvLy8gbm9kZSBjbGFzcyBoaWVyYXJjaGllcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IElzQmFzZVR5cGUgeworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9CisgICAgICBzdGQ6OmlzX3NhbWU8VCwgRGVjbD46OnZhbHVlIHx8CisgICAgICBzdGQ6OmlzX3NhbWU8VCwgU3RtdD46OnZhbHVlIHx8CisgICAgICBzdGQ6OmlzX3NhbWU8VCwgUXVhbFR5cGU+Ojp2YWx1ZSB8fAorICAgICAgc3RkOjppc19zYW1lPFQsIFR5cGU+Ojp2YWx1ZSB8fAorICAgICAgc3RkOjppc19zYW1lPFQsIFR5cGVMb2M+Ojp2YWx1ZSB8fAorICAgICAgc3RkOjppc19zYW1lPFQsIE5lc3RlZE5hbWVTcGVjaWZpZXI+Ojp2YWx1ZSB8fAorICAgICAgc3RkOjppc19zYW1lPFQsIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2M+Ojp2YWx1ZSB8fAorICAgICAgc3RkOjppc19zYW1lPFQsIENYWEN0b3JJbml0aWFsaXplcj46OnZhbHVlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY29uc3QgYm9vbCBJc0Jhc2VUeXBlPFQ+Ojp2YWx1ZTsKKworLy8vIFxicmllZiBJbnRlcmZhY2UgdGhhdCBhbGxvd3MgbWF0Y2hlcnMgdG8gdHJhdmVyc2UgdGhlIEFTVC4KKy8vLyBGSVhNRTogRmluZCBhIGJldHRlciBuYW1lLgorLy8vCisvLy8gVGhpcyBwcm92aWRlcyB0aHJlZSBlbnRyeSBtZXRob2RzIGZvciBlYWNoIGJhc2Ugbm9kZSB0eXBlIGluIHRoZSBBU1Q6CisvLy8gLSBcYyBtYXRjaGVzQ2hpbGRPZjoKKy8vLyAgIE1hdGNoZXMgYSBtYXRjaGVyIG9uIGV2ZXJ5IGNoaWxkIG5vZGUgb2YgdGhlIGdpdmVuIG5vZGUuIFJldHVybnMgdHJ1ZQorLy8vICAgaWYgYXQgbGVhc3Qgb25lIGNoaWxkIG5vZGUgY291bGQgYmUgbWF0Y2hlZC4KKy8vLyAtIFxjIG1hdGNoZXNEZXNjZW5kYW50T2Y6CisvLy8gICBNYXRjaGVzIGEgbWF0Y2hlciBvbiBhbGwgZGVzY2VuZGFudCBub2RlcyBvZiB0aGUgZ2l2ZW4gbm9kZS4gUmV0dXJucyB0cnVlCisvLy8gICBpZiBhdCBsZWFzdCBvbmUgZGVzY2VuZGFudCBtYXRjaGVkLgorLy8vIC0gXGMgbWF0Y2hlc0FuY2VzdG9yT2Y6CisvLy8gICBNYXRjaGVzIGEgbWF0Y2hlciBvbiBhbGwgYW5jZXN0b3JzIG9mIHRoZSBnaXZlbiBub2RlLiBSZXR1cm5zIHRydWUgaWYKKy8vLyAgIGF0IGxlYXN0IG9uZSBhbmNlc3RvciBtYXRjaGVkLgorLy8vCisvLy8gRklYTUU6IEN1cnJlbnRseSB3ZSBvbmx5IGFsbG93IFN0bXQgYW5kIERlY2wgbm9kZXMgdG8gc3RhcnQgYSB0cmF2ZXJzYWwuCisvLy8gSW4gdGhlIGZ1dHVyZSwgd2Ugd2FudCB0byBpbXBsZW1lbnQgdGhpcyBmb3IgYWxsIG5vZGVzIGZvciB3aGljaCBpdCBtYWtlcworLy8vIHNlbnNlLiBJbiB0aGUgY2FzZSBvZiBtYXRjaGVzQW5jZXN0b3JPZiwgd2UnbGwgd2FudCB0byBpbXBsZW1lbnQgaXQgZm9yCisvLy8gYWxsIG5vZGVzLCBhcyBhbGwgbm9kZXMgaGF2ZSBhbmNlc3RvcnMuCitjbGFzcyBBU1RNYXRjaEZpbmRlciB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgRGVmaW5lcyBob3cgd2UgZGVzY2VuZCBhIGxldmVsIGluIHRoZSBBU1Qgd2hlbiB3ZSBwYXNzCisgIC8vLyB0aHJvdWdoIGV4cHJlc3Npb25zLgorICBlbnVtIFRyYXZlcnNhbEtpbmQgeworICAgIC8vLyBXaWxsIHRyYXZlcnNlIGFueSBjaGlsZCBub2Rlcy4KKyAgICBUS19Bc0lzLAorCisgICAgLy8vIFdpbGwgbm90IHRyYXZlcnNlIGltcGxpY2l0IGNhc3RzIGFuZCBwYXJlbnRoZXNlcy4KKyAgICBUS19JZ25vcmVJbXBsaWNpdENhc3RzQW5kUGFyZW50aGVzZXMKKyAgfTsKKworICAvLy8gXGJyaWVmIERlZmluZXMgaG93IGJpbmRpbmdzIGFyZSBwcm9jZXNzZWQgb24gcmVjdXJzaXZlIG1hdGNoZXMuCisgIGVudW0gQmluZEtpbmQgeworICAgIC8vLyBTdG9wIGF0IHRoZSBmaXJzdCBtYXRjaCBhbmQgb25seSBiaW5kIHRoZSBmaXJzdCBtYXRjaC4KKyAgICBCS19GaXJzdCwKKworICAgIC8vLyBDcmVhdGUgcmVzdWx0cyBmb3IgYWxsIGNvbWJpbmF0aW9ucyBvZiBiaW5kaW5ncyB0aGF0IG1hdGNoLgorICAgIEJLX0FsbAorICB9OworCisgIC8vLyBcYnJpZWYgRGVmaW5lcyB3aGljaCBhbmNlc3RvcnMgYXJlIGNvbnNpZGVyZWQgZm9yIGEgbWF0Y2guCisgIGVudW0gQW5jZXN0b3JNYXRjaE1vZGUgeworICAgIC8vLyBBbGwgYW5jZXN0b3JzLgorICAgIEFNTV9BbGwsCisKKyAgICAvLy8gRGlyZWN0IHBhcmVudCBvbmx5LgorICAgIEFNTV9QYXJlbnRPbmx5CisgIH07CisKKyAgdmlydHVhbCB+QVNUTWF0Y2hGaW5kZXIoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGNsYXNzIGlzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZGVyaXZlZAorICAvLy8gZnJvbSBhIGJhc2UgdHlwZSBtYXRjaGluZyBcYyBiYXNlLgorICAvLy8KKyAgLy8vIEEgY2xhc3MgaXMgY29uc2lkZXJlZCB0byBiZSBhbHNvIGRlcml2ZWQgZnJvbSBpdHNlbGYuCisgIHZpcnR1YWwgYm9vbCBjbGFzc0lzRGVyaXZlZEZyb20oY29uc3QgQ1hYUmVjb3JkRGVjbCAqRGVjbGFyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWF0Y2hlcjxOYW1lZERlY2w+ICZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgPSAwOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBib29sIG1hdGNoZXNDaGlsZE9mKGNvbnN0IFQgJk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHluVHlwZWRNYXRjaGVyICZNYXRjaGVyLAorICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICBUcmF2ZXJzYWxLaW5kIFRyYXZlcnNlLAorICAgICAgICAgICAgICAgICAgICAgIEJpbmRLaW5kIEJpbmQpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfYmFzZV9vZjxEZWNsLCBUPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxTdG10LCBUPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxOZXN0ZWROYW1lU3BlY2lmaWVyLCBUPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxOZXN0ZWROYW1lU3BlY2lmaWVyTG9jLCBUPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxUeXBlTG9jLCBUPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxRdWFsVHlwZSwgVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIHR5cGUgZm9yIHJlY3Vyc2l2ZSBtYXRjaGluZyIpOworICAgIHJldHVybiBtYXRjaGVzQ2hpbGRPZihhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZTo6Y3JlYXRlKE5vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaGVyLCBCdWlsZGVyLCBUcmF2ZXJzZSwgQmluZCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgYm9vbCBtYXRjaGVzRGVzY2VuZGFudE9mKGNvbnN0IFQgJk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEeW5UeXBlZE1hdGNoZXIgJk1hdGNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kS2luZCBCaW5kKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Jhc2Vfb2Y8RGVjbCwgVD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8U3RtdCwgVD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8TmVzdGVkTmFtZVNwZWNpZmllciwgVD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8TmVzdGVkTmFtZVNwZWNpZmllckxvYywgVD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8VHlwZUxvYywgVD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8UXVhbFR5cGUsIFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCB0eXBlIGZvciByZWN1cnNpdmUgbWF0Y2hpbmciKTsKKyAgICByZXR1cm4gbWF0Y2hlc0Rlc2NlbmRhbnRPZihhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZTo6Y3JlYXRlKE5vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoZXIsIEJ1aWxkZXIsIEJpbmQpOworICB9CisKKyAgLy8gRklYTUU6IEltcGxlbWVudCBzdXBwb3J0IGZvciBCaW5kS2luZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGJvb2wgbWF0Y2hlc0FuY2VzdG9yT2YoY29uc3QgVCAmTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEeW5UeXBlZE1hdGNoZXIgJk1hdGNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFuY2VzdG9yTWF0Y2hNb2RlIE1hdGNoTW9kZSkgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19iYXNlX29mPERlY2wsIFQ+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxOZXN0ZWROYW1lU3BlY2lmaWVyTG9jLCBUPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8U3RtdCwgVD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mPFR5cGVMb2MsIFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJ0eXBlIG5vdCBhbGxvd2VkIGZvciByZWN1cnNpdmUgbWF0Y2hpbmciKTsKKyAgICByZXR1cm4gbWF0Y2hlc0FuY2VzdG9yT2YoYXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGU6OmNyZWF0ZShOb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hlciwgQnVpbGRlciwgTWF0Y2hNb2RlKTsKKyAgfQorCisgIHZpcnR1YWwgQVNUQ29udGV4dCAmZ2V0QVNUQ29udGV4dCgpIGNvbnN0ID0gMDsKKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIGJvb2wgbWF0Y2hlc0NoaWxkT2YoY29uc3QgYXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGUgJk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEeW5UeXBlZE1hdGNoZXIgJk1hdGNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmF2ZXJzYWxLaW5kIFRyYXZlcnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZEtpbmQgQmluZCkgPSAwOworCisgIHZpcnR1YWwgYm9vbCBtYXRjaGVzRGVzY2VuZGFudE9mKGNvbnN0IGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlICZOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEeW5UeXBlZE1hdGNoZXIgJk1hdGNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZEtpbmQgQmluZCkgPSAwOworCisgIHZpcnR1YWwgYm9vbCBtYXRjaGVzQW5jZXN0b3JPZihjb25zdCBhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZSAmTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IER5blR5cGVkTWF0Y2hlciAmTWF0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuY2VzdG9yTWF0Y2hNb2RlIE1hdGNoTW9kZSkgPSAwOworfTsKKworLy8vIFxicmllZiBBIHR5cGUtbGlzdCBpbXBsZW1lbnRhdGlvbi4KKy8vLworLy8vIEEgImxpbmtlZCBsaXN0IiBvZiB0eXBlcywgYWNjZXNzaWJsZSBieSB1c2luZyB0aGUgOjpoZWFkIGFuZCA6OnRhaWwKKy8vLyB0eXBlZGVmcy4KK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBUcz4gc3RydWN0IFR5cGVMaXN0IHt9OyAvLyBFbXB0eSBzZW50aW5lbCB0eXBlIGxpc3QuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUuLi4gVHM+IHN0cnVjdCBUeXBlTGlzdDxUMSwgVHMuLi4+IHsKKyAgLy8vIFxicmllZiBUaGUgZmlyc3QgdHlwZSBvbiB0aGUgbGlzdC4KKyAgdXNpbmcgaGVhZCA9IFQxOworCisgIC8vLyBcYnJpZWYgQSBzdWJsaXN0IHdpdGggdGhlIHRhaWwuIGllIGV2ZXJ5dGhpbmcgYnV0IHRoZSBoZWFkLgorICAvLy8KKyAgLy8vIFRoaXMgdHlwZSBpcyB1c2VkIHRvIGRvIHJlY3Vyc2lvbi4gVHlwZUxpc3Q8Pi9FbXB0eVR5cGVMaXN0IGluZGljYXRlcyB0aGUKKyAgLy8vIGVuZCBvZiB0aGUgbGlzdC4KKyAgdXNpbmcgdGFpbCA9IFR5cGVMaXN0PFRzLi4uPjsKK307CisKKy8vLyBcYnJpZWYgVGhlIGVtcHR5IHR5cGUgbGlzdC4KK3VzaW5nIEVtcHR5VHlwZUxpc3QgPSBUeXBlTGlzdDw+OworCisvLy8gXGJyaWVmIEhlbHBlciBtZXRhLWZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBzb21lIHR5cGUgXGMgVCBpcyBwcmVzZW50IG9yCisvLy8gICBhIHBhcmVudCB0eXBlIGluIHRoZSBsaXN0LgordGVtcGxhdGUgPHR5cGVuYW1lIEFueVR5cGVMaXN0LCB0eXBlbmFtZSBUPgorc3RydWN0IFR5cGVMaXN0Q29udGFpbnNTdXBlck9mIHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPQorICAgICAgc3RkOjppc19iYXNlX29mPHR5cGVuYW1lIEFueVR5cGVMaXN0OjpoZWFkLCBUPjo6dmFsdWUgfHwKKyAgICAgIFR5cGVMaXN0Q29udGFpbnNTdXBlck9mPHR5cGVuYW1lIEFueVR5cGVMaXN0Ojp0YWlsLCBUPjo6dmFsdWU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgVHlwZUxpc3RDb250YWluc1N1cGVyT2Y8RW1wdHlUeXBlTGlzdCwgVD4geworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOworfTsKKworLy8vIFxicmllZiBBICJ0eXBlIGxpc3QiIHRoYXQgY29udGFpbnMgYWxsIHR5cGVzLgorLy8vCisvLy8gVXNlZnVsIGZvciBtYXRjaGVycyBsaWtlIFxjIGFueXRoaW5nIGFuZCBcYyB1bmxlc3MuCit1c2luZyBBbGxOb2RlQmFzZVR5cGVzID0KKyAgICBUeXBlTGlzdDxEZWNsLCBTdG10LCBOZXN0ZWROYW1lU3BlY2lmaWVyLCBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jLCBRdWFsVHlwZSwKKyAgICAgICAgICAgICBUeXBlLCBUeXBlTG9jLCBDWFhDdG9ySW5pdGlhbGl6ZXI+OworCisvLy8gXGJyaWVmIEhlbHBlciBtZXRhLWZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlIGFyZ3VtZW50IG91dCBvZiBhIGZ1bmN0aW9uIG9mCisvLy8gICB0eXBlIHZvaWQoQXJnKS4KKy8vLworLy8vIFNlZSBBU1RfUE9MWU1PUlBISUNfU1VQUE9SVEVEX1RZUEVTIGZvciBkZXRhaWxzLgordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBFeHRyYWN0RnVuY3Rpb25BcmdNZXRhOwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBFeHRyYWN0RnVuY3Rpb25BcmdNZXRhPHZvaWQoVCk+IHsKKyAgdXNpbmcgdHlwZSA9IFQ7Cit9OworCisvLy8gXGJyaWVmIERlZmF1bHQgdHlwZSBsaXN0cyBmb3IgQXJndW1lbnRBZGFwdGluZ01hdGNoZXIgbWF0Y2hlcnMuCit1c2luZyBBZGFwdGF0aXZlRGVmYXVsdEZyb21UeXBlcyA9IEFsbE5vZGVCYXNlVHlwZXM7Cit1c2luZyBBZGFwdGF0aXZlRGVmYXVsdFRvVHlwZXMgPQorICAgIFR5cGVMaXN0PERlY2wsIFN0bXQsIE5lc3RlZE5hbWVTcGVjaWZpZXIsIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MsIFR5cGVMb2MsCisgICAgICAgICAgICAgUXVhbFR5cGU+OworCisvLy8gXGJyaWVmIEFsbCB0eXBlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgSGFzRGVjbGFyYXRpb25NYXRjaGVyIGFib3ZlLgordXNpbmcgSGFzRGVjbGFyYXRpb25TdXBwb3J0ZWRUeXBlcyA9CisgICAgVHlwZUxpc3Q8Q2FsbEV4cHIsIENYWENvbnN0cnVjdEV4cHIsIENYWE5ld0V4cHIsIERlY2xSZWZFeHByLCBFbnVtVHlwZSwKKyAgICAgICAgICAgICBFbGFib3JhdGVkVHlwZSwgSW5qZWN0ZWRDbGFzc05hbWVUeXBlLCBMYWJlbFN0bXQsIEFkZHJMYWJlbEV4cHIsCisgICAgICAgICAgICAgTWVtYmVyRXhwciwgUXVhbFR5cGUsIFJlY29yZFR5cGUsIFRhZ1R5cGUsCisgICAgICAgICAgICAgVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUsIFRlbXBsYXRlVHlwZVBhcm1UeXBlLCBUeXBlZGVmVHlwZSwKKyAgICAgICAgICAgICBVbnJlc29sdmVkVXNpbmdUeXBlPjsKKworLy8vIFxicmllZiBDb252ZXJ0cyBhIFxjIE1hdGNoZXI8VD4gdG8gYSBtYXRjaGVyIG9mIGRlc2lyZWQgdHlwZSBcYyBUbyBieQorLy8vICJhZGFwdGluZyIgYSBcYyBUbyBpbnRvIGEgXGMgVC4KKy8vLworLy8vIFRoZSBcYyBBcmd1bWVudEFkYXB0ZXJUIGFyZ3VtZW50IHNwZWNpZmllcyBob3cgdGhlIGFkYXB0YXRpb24gaXMgZG9uZS4KKy8vLworLy8vIEZvciBleGFtcGxlOgorLy8vICAgXGMgQXJndW1lbnRBZGFwdGluZ01hdGNoZXI8SGFzTWF0Y2hlciwgVD4oSW5uZXJNYXRjaGVyKTsKKy8vLyBHaXZlbiB0aGF0IFxjIElubmVyTWF0Y2hlciBpcyBvZiB0eXBlIFxjIE1hdGNoZXI8VD4sIHRoaXMgcmV0dXJucyBhIG1hdGNoZXIKKy8vLyB0aGF0IGlzIGNvbnZlcnRpYmxlIGludG8gYW55IG1hdGNoZXIgb2YgdHlwZSBcYyBUbyBieSBjb25zdHJ1Y3RpbmcKKy8vLyBcYyBIYXNNYXRjaGVyPFRvLCBUPihJbm5lck1hdGNoZXIpLgorLy8vCisvLy8gSWYgYSBtYXRjaGVyIGRvZXMgbm90IG5lZWQga25vd2xlZGdlIGFib3V0IHRoZSBpbm5lciB0eXBlLCBwcmVmZXIgdG8gdXNlCisvLy8gUG9seW1vcnBoaWNNYXRjaGVyV2l0aFBhcmFtMS4KK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8dHlwZW5hbWUgVG9BcmcsIHR5cGVuYW1lIEZyb21Bcmc+IGNsYXNzIEFyZ3VtZW50QWRhcHRlclQsCisgICAgICAgICAgdHlwZW5hbWUgRnJvbVR5cGVzID0gQWRhcHRhdGl2ZURlZmF1bHRGcm9tVHlwZXMsCisgICAgICAgICAgdHlwZW5hbWUgVG9UeXBlcyA9IEFkYXB0YXRpdmVEZWZhdWx0VG9UeXBlcz4KK3N0cnVjdCBBcmd1bWVudEFkYXB0aW5nTWF0Y2hlckZ1bmMgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQWRhcHRvciB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBBZGFwdG9yKGNvbnN0IE1hdGNoZXI8VD4gJklubmVyTWF0Y2hlcikKKyAgICAgICAgOiBJbm5lck1hdGNoZXIoSW5uZXJNYXRjaGVyKSB7fQorCisgICAgdXNpbmcgUmV0dXJuVHlwZXMgPSBUb1R5cGVzOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRvPiBvcGVyYXRvciBNYXRjaGVyPFRvPigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBNYXRjaGVyPFRvPihuZXcgQXJndW1lbnRBZGFwdGVyVDxUbywgVD4oSW5uZXJNYXRjaGVyKSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgY29uc3QgTWF0Y2hlcjxUPiBJbm5lck1hdGNoZXI7CisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyBBZGFwdG9yPFQ+IGNyZWF0ZShjb25zdCBNYXRjaGVyPFQ+ICZJbm5lck1hdGNoZXIpIHsKKyAgICByZXR1cm4gQWRhcHRvcjxUPihJbm5lck1hdGNoZXIpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIEFkYXB0b3I8VD4gb3BlcmF0b3IoKShjb25zdCBNYXRjaGVyPFQ+ICZJbm5lck1hdGNoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gY3JlYXRlKElubmVyTWF0Y2hlcik7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQSBQb2x5bW9ycGhpY01hdGNoZXJXaXRoUGFyYW1OPE1hdGNoZXJULCBQMSwgLi4uLCBQTj4gb2JqZWN0IGNhbiBiZQorLy8vIGNyZWF0ZWQgZnJvbSBOIHBhcmFtZXRlcnMgcDEsIC4uLiwgcE4gKG9mIHR5cGUgUDEsIC4uLiwgUE4pIGFuZAorLy8vIHVzZWQgYXMgYSBNYXRjaGVyPFQ+IHdoZXJlIGEgTWF0Y2hlclQ8VCwgUDEsIC4uLiwgUE4+KHAxLCAuLi4sIHBOKQorLy8vIGNhbiBiZSBjb25zdHJ1Y3RlZC4KKy8vLworLy8vIEZvciBleGFtcGxlOgorLy8vIC0gUG9seW1vcnBoaWNNYXRjaGVyV2l0aFBhcmFtMDxJc0RlZmluaXRpb25NYXRjaGVyPigpCisvLy8gICBjcmVhdGVzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgTWF0Y2hlcjxUPiBmb3IgYW55IHR5cGUgVAorLy8vICAgd2hlcmUgYW4gSXNEZWZpbml0aW9uTWF0Y2hlcjxUPigpIGNhbiBiZSBjb25zdHJ1Y3RlZC4KKy8vLyAtIFBvbHltb3JwaGljTWF0Y2hlcldpdGhQYXJhbTE8VmFsdWVFcXVhbHNNYXRjaGVyLCBpbnQ+KDQyKQorLy8vICAgY3JlYXRlcyBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIE1hdGNoZXI8VD4gZm9yIGFueSB0eXBlIFQKKy8vLyAgIHdoZXJlIGEgVmFsdWVFcXVhbHNNYXRjaGVyPFQsIGludD4oNDIpIGNhbiBiZSBjb25zdHJ1Y3RlZC4KK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgTWF0Y2hlclQsCisgICAgICAgICAgdHlwZW5hbWUgUmV0dXJuVHlwZXNGID0gdm9pZChBbGxOb2RlQmFzZVR5cGVzKT4KK2NsYXNzIFBvbHltb3JwaGljTWF0Y2hlcldpdGhQYXJhbTAgeworcHVibGljOgorICB1c2luZyBSZXR1cm5UeXBlcyA9IHR5cGVuYW1lIEV4dHJhY3RGdW5jdGlvbkFyZ01ldGE8UmV0dXJuVHlwZXNGPjo6dHlwZTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgTWF0Y2hlcjxUPigpIGNvbnN0IHsKKyAgICBzdGF0aWNfYXNzZXJ0KFR5cGVMaXN0Q29udGFpbnNTdXBlck9mPFJldHVyblR5cGVzLCBUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAicmlnaHQgcG9seW1vcnBoaWMgY29udmVyc2lvbiIpOworICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBNYXRjaGVyVDxUPigpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBQMT4gY2xhc3MgTWF0Y2hlclQsCisgICAgICAgICAgdHlwZW5hbWUgUDEsCisgICAgICAgICAgdHlwZW5hbWUgUmV0dXJuVHlwZXNGID0gdm9pZChBbGxOb2RlQmFzZVR5cGVzKT4KK2NsYXNzIFBvbHltb3JwaGljTWF0Y2hlcldpdGhQYXJhbTEgeworcHVibGljOgorICBleHBsaWNpdCBQb2x5bW9ycGhpY01hdGNoZXJXaXRoUGFyYW0xKGNvbnN0IFAxICZQYXJhbTEpCisgICAgICA6IFBhcmFtMShQYXJhbTEpIHt9CisKKyAgdXNpbmcgUmV0dXJuVHlwZXMgPSB0eXBlbmFtZSBFeHRyYWN0RnVuY3Rpb25BcmdNZXRhPFJldHVyblR5cGVzRj46OnR5cGU7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIE1hdGNoZXI8VD4oKSBjb25zdCB7CisgICAgc3RhdGljX2Fzc2VydChUeXBlTGlzdENvbnRhaW5zU3VwZXJPZjxSZXR1cm5UeXBlcywgVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgInJpZ2h0IHBvbHltb3JwaGljIGNvbnZlcnNpb24iKTsKKyAgICByZXR1cm4gTWF0Y2hlcjxUPihuZXcgTWF0Y2hlclQ8VCwgUDE+KFBhcmFtMSkpOworICB9CisKK3ByaXZhdGU6CisgIGNvbnN0IFAxIFBhcmFtMTsKK307CisKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUDEsIHR5cGVuYW1lIFAyPiBjbGFzcyBNYXRjaGVyVCwKKyAgICAgICAgICB0eXBlbmFtZSBQMSwgdHlwZW5hbWUgUDIsCisgICAgICAgICAgdHlwZW5hbWUgUmV0dXJuVHlwZXNGID0gdm9pZChBbGxOb2RlQmFzZVR5cGVzKT4KK2NsYXNzIFBvbHltb3JwaGljTWF0Y2hlcldpdGhQYXJhbTIgeworcHVibGljOgorICBQb2x5bW9ycGhpY01hdGNoZXJXaXRoUGFyYW0yKGNvbnN0IFAxICZQYXJhbTEsIGNvbnN0IFAyICZQYXJhbTIpCisgICAgICA6IFBhcmFtMShQYXJhbTEpLCBQYXJhbTIoUGFyYW0yKSB7fQorCisgIHVzaW5nIFJldHVyblR5cGVzID0gdHlwZW5hbWUgRXh0cmFjdEZ1bmN0aW9uQXJnTWV0YTxSZXR1cm5UeXBlc0Y+Ojp0eXBlOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBNYXRjaGVyPFQ+KCkgY29uc3QgeworICAgIHN0YXRpY19hc3NlcnQoVHlwZUxpc3RDb250YWluc1N1cGVyT2Y8UmV0dXJuVHlwZXMsIFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJyaWdodCBwb2x5bW9ycGhpYyBjb252ZXJzaW9uIik7CisgICAgcmV0dXJuIE1hdGNoZXI8VD4obmV3IE1hdGNoZXJUPFQsIFAxLCBQMj4oUGFyYW0xLCBQYXJhbTIpKTsKKyAgfQorCitwcml2YXRlOgorICBjb25zdCBQMSBQYXJhbTE7CisgIGNvbnN0IFAyIFBhcmFtMjsKK307CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhbnkgaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIE5vZGVUeXBlLgorLy8vCisvLy8gVGhpcyBpcyB1c2VmdWwgd2hlbiBhIG1hdGNoZXIgc3ludGFjdGljYWxseSByZXF1aXJlcyBhIGNoaWxkIG1hdGNoZXIsCisvLy8gYnV0IHRoZSBjb250ZXh0IGRvZXNuJ3QgY2FyZS4gU2VlIGZvciBleGFtcGxlOiBhbnl0aGluZygpLgorY2xhc3MgVHJ1ZU1hdGNoZXIgeworcHVibGljOgorICB1c2luZyBSZXR1cm5UeXBlcyA9IEFsbE5vZGVCYXNlVHlwZXM7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIE1hdGNoZXI8VD4oKSBjb25zdCB7CisgICAgcmV0dXJuIER5blR5cGVkTWF0Y2hlcjo6dHJ1ZU1hdGNoZXIoCisgICAgICAgICAgICAgICBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZUtpbmQ8VD4oKSkKKyAgICAgICAgLnRlbXBsYXRlIHVuY29uZGl0aW9uYWxDb252ZXJ0VG88VD4oKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBBIE1hdGNoZXIgdGhhdCBhbGxvd3MgYmluZGluZyB0aGUgbm9kZSBpdCBtYXRjaGVzIHRvIGFuIGlkLgorLy8vCisvLy8gQmluZGFibGVNYXRjaGVyIHByb3ZpZGVzIGEgXGEgYmluZCgpIG1ldGhvZCB0aGF0IGFsbG93cyBiaW5kaW5nIHRoZQorLy8vIG1hdGNoZWQgbm9kZSB0byBhbiBpZCBpZiB0aGUgbWF0Y2ggd2FzIHN1Y2Nlc3NmdWwuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEJpbmRhYmxlTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVyPFQ+IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgQmluZGFibGVNYXRjaGVyKGNvbnN0IE1hdGNoZXI8VD4gJk0pIDogTWF0Y2hlcjxUPihNKSB7fQorICBleHBsaWNpdCBCaW5kYWJsZU1hdGNoZXIoTWF0Y2hlckludGVyZmFjZTxUPiAqSW1wbGVtZW50YXRpb24pCisgICAgOiBNYXRjaGVyPFQ+KEltcGxlbWVudGF0aW9uKSB7fQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhIG1hdGNoZXIgdGhhdCB3aWxsIGJpbmQgdGhlIG1hdGNoZWQgbm9kZSBvbiBhIG1hdGNoLgorICAvLy8KKyAgLy8vIFRoZSByZXR1cm5lZCBtYXRjaGVyIGlzIGVxdWl2YWxlbnQgdG8gdGhpcyBtYXRjaGVyLCBidXQgd2lsbAorICAvLy8gYmluZCB0aGUgbWF0Y2hlZCBub2RlIG9uIGEgbWF0Y2guCisgIE1hdGNoZXI8VD4gYmluZChTdHJpbmdSZWYgSUQpIGNvbnN0IHsKKyAgICByZXR1cm4gRHluVHlwZWRNYXRjaGVyKCp0aGlzKQorICAgICAgICAudHJ5QmluZChJRCkKKyAgICAgICAgLT50ZW1wbGF0ZSB1bmNvbmRpdGlvbmFsQ29udmVydFRvPFQ+KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFNhbWUgYXMgTWF0Y2hlcjxUPidzIGNvbnZlcnNpb24gb3BlcmF0b3IsIGJ1dCBlbmFibGVzIGJpbmRpbmcgb24KKyAgLy8vIHRoZSByZXR1cm5lZCBtYXRjaGVyLgorICBvcGVyYXRvciBEeW5UeXBlZE1hdGNoZXIoKSBjb25zdCB7CisgICAgRHluVHlwZWRNYXRjaGVyIFJlc3VsdCA9IHN0YXRpY19jYXN0PGNvbnN0IE1hdGNoZXI8VD4mPigqdGhpcyk7CisgICAgUmVzdWx0LnNldEFsbG93QmluZCh0cnVlKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9Cit9OworCisvLy8gXGJyaWVmIE1hdGNoZXMgbm9kZXMgb2YgdHlwZSBUIHRoYXQgaGF2ZSBjaGlsZCBub2RlcyBvZiB0eXBlIENoaWxkVCBmb3IKKy8vLyB3aGljaCBhIHNwZWNpZmllZCBjaGlsZCBtYXRjaGVyIG1hdGNoZXMuCisvLy8KKy8vLyBDaGlsZFQgbXVzdCBiZSBhbiBBU1QgYmFzZSB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENoaWxkVD4KK2NsYXNzIEhhc01hdGNoZXIgOiBwdWJsaWMgV3JhcHBlck1hdGNoZXJJbnRlcmZhY2U8VD4geworcHVibGljOgorICBleHBsaWNpdCBIYXNNYXRjaGVyKGNvbnN0IE1hdGNoZXI8Q2hpbGRUPiAmQ2hpbGRNYXRjaGVyKQorICAgICAgOiBIYXNNYXRjaGVyOjpXcmFwcGVyTWF0Y2hlckludGVyZmFjZShDaGlsZE1hdGNoZXIpIHt9CisKKyAgYm9vbCBtYXRjaGVzKGNvbnN0IFQgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCisgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gRmluZGVyLT5tYXRjaGVzQ2hpbGRPZihOb2RlLCB0aGlzLT5Jbm5lck1hdGNoZXIsIEJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUTWF0Y2hGaW5kZXI6OlRLX0FzSXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUTWF0Y2hGaW5kZXI6OkJLX0ZpcnN0KTsKKyAgfQorfTsKKworLy8vIFxicmllZiBNYXRjaGVzIG5vZGVzIG9mIHR5cGUgVCB0aGF0IGhhdmUgY2hpbGQgbm9kZXMgb2YgdHlwZSBDaGlsZFQgZm9yCisvLy8gd2hpY2ggYSBzcGVjaWZpZWQgY2hpbGQgbWF0Y2hlciBtYXRjaGVzLiBDaGlsZFQgbXVzdCBiZSBhbiBBU1QgYmFzZQorLy8vIHR5cGUuCisvLy8gQXMgb3Bwb3NlZCB0byB0aGUgSGFzTWF0Y2hlciwgdGhlIEZvckVhY2hNYXRjaGVyIHdpbGwgcHJvZHVjZSBhIG1hdGNoCisvLy8gZm9yIGVhY2ggY2hpbGQgdGhhdCBtYXRjaGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENoaWxkVD4KK2NsYXNzIEZvckVhY2hNYXRjaGVyIDogcHVibGljIFdyYXBwZXJNYXRjaGVySW50ZXJmYWNlPFQ+IHsKKyAgc3RhdGljX2Fzc2VydChJc0Jhc2VUeXBlPENoaWxkVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICJmb3IgZWFjaCBvbmx5IGFjY2VwdHMgYmFzZSB0eXBlIG1hdGNoZXIiKTsKKworIHB1YmxpYzoKKyAgIGV4cGxpY2l0IEZvckVhY2hNYXRjaGVyKGNvbnN0IE1hdGNoZXI8Q2hpbGRUPiAmQ2hpbGRNYXRjaGVyKQorICAgICAgIDogRm9yRWFjaE1hdGNoZXI6OldyYXBwZXJNYXRjaGVySW50ZXJmYWNlKENoaWxkTWF0Y2hlcikge30KKworICBib29sIG1hdGNoZXMoY29uc3QgVCYgTm9kZSwgQVNUTWF0Y2hGaW5kZXIqIEZpbmRlciwKKyAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciogQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBGaW5kZXItPm1hdGNoZXNDaGlsZE9mKAorICAgICAgICBOb2RlLCB0aGlzLT5Jbm5lck1hdGNoZXIsIEJ1aWxkZXIsCisgICAgICAgIEFTVE1hdGNoRmluZGVyOjpUS19JZ25vcmVJbXBsaWNpdENhc3RzQW5kUGFyZW50aGVzZXMsCisgICAgICAgIEFTVE1hdGNoRmluZGVyOjpCS19BbGwpOworICB9Cit9OworCisvLy8gXGJyaWVmIFZhcmlhZGljT3BlcmF0b3JNYXRjaGVyIHJlbGF0ZWQgdHlwZXMuCisvLy8gQHsKKworLy8vIFxicmllZiBQb2x5bW9ycGhpYyBtYXRjaGVyIG9iamVjdCB0aGF0IHVzZXMgYSBcYworLy8vIER5blR5cGVkTWF0Y2hlcjo6VmFyaWFkaWNPcGVyYXRvciBvcGVyYXRvci4KKy8vLworLy8vIElucHV0IG1hdGNoZXJzIGNhbiBoYXZlIGFueSB0eXBlIChpbmNsdWRpbmcgb3RoZXIgcG9seW1vcnBoaWMgbWF0Y2hlcgorLy8vIHR5cGVzKSwgYW5kIHRoZSBhY3R1YWwgTWF0Y2hlcjxUPiBpcyBnZW5lcmF0ZWQgb24gZGVtYW5kIHdpdGggYW4gaW1wbGljaXQKKy8vLyBjb3ZlcnNpb24gb3BlcmF0b3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gUHM+IGNsYXNzIFZhcmlhZGljT3BlcmF0b3JNYXRjaGVyIHsKK3B1YmxpYzoKKyAgVmFyaWFkaWNPcGVyYXRvck1hdGNoZXIoRHluVHlwZWRNYXRjaGVyOjpWYXJpYWRpY09wZXJhdG9yIE9wLCBQcyAmJi4uLiBQYXJhbXMpCisgICAgICA6IE9wKE9wKSwgUGFyYW1zKHN0ZDo6Zm9yd2FyZDxQcz4oUGFyYW1zKS4uLikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gb3BlcmF0b3IgTWF0Y2hlcjxUPigpIGNvbnN0IHsKKyAgICByZXR1cm4gRHluVHlwZWRNYXRjaGVyOjpjb25zdHJ1Y3RWYXJpYWRpYygKKyAgICAgICAgICAgICAgIE9wLCBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZUtpbmQ8VD4oKSwKKyAgICAgICAgICAgICAgIGdldE1hdGNoZXJzPFQ+KGxsdm06OmluZGV4X3NlcXVlbmNlX2ZvcjxQcy4uLj4oKSkpCisgICAgICAgIC50ZW1wbGF0ZSB1bmNvbmRpdGlvbmFsQ29udmVydFRvPFQ+KCk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gSGVscGVyIG1ldGhvZCB0byB1bnBhY2sgdGhlIHR1cGxlIGludG8gYSB2ZWN0b3IuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdC4uLiBJcz4KKyAgc3RkOjp2ZWN0b3I8RHluVHlwZWRNYXRjaGVyPiBnZXRNYXRjaGVycyhsbHZtOjppbmRleF9zZXF1ZW5jZTxJcy4uLj4pIGNvbnN0IHsKKyAgICByZXR1cm4ge01hdGNoZXI8VD4oc3RkOjpnZXQ8SXM+KFBhcmFtcykpLi4ufTsKKyAgfQorCisgIGNvbnN0IER5blR5cGVkTWF0Y2hlcjo6VmFyaWFkaWNPcGVyYXRvciBPcDsKKyAgc3RkOjp0dXBsZTxQcy4uLj4gUGFyYW1zOworfTsKKworLy8vIFxicmllZiBPdmVybG9hZGVkIGZ1bmN0aW9uIG9iamVjdCB0byBnZW5lcmF0ZSBWYXJpYWRpY09wZXJhdG9yTWF0Y2hlcgorLy8vICAgb2JqZWN0cyBmcm9tIGFyYml0cmFyeSBtYXRjaGVycy4KK3RlbXBsYXRlIDx1bnNpZ25lZCBNaW5Db3VudCwgdW5zaWduZWQgTWF4Q291bnQ+CitzdHJ1Y3QgVmFyaWFkaWNPcGVyYXRvck1hdGNoZXJGdW5jIHsKKyAgRHluVHlwZWRNYXRjaGVyOjpWYXJpYWRpY09wZXJhdG9yIE9wOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBNcz4KKyAgVmFyaWFkaWNPcGVyYXRvck1hdGNoZXI8TXMuLi4+IG9wZXJhdG9yKCkoTXMgJiYuLi4gUHMpIGNvbnN0IHsKKyAgICBzdGF0aWNfYXNzZXJ0KE1pbkNvdW50IDw9IHNpemVvZi4uLihNcykgJiYgc2l6ZW9mLi4uKE1zKSA8PSBNYXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICJpbnZhbGlkIG51bWJlciBvZiBwYXJhbWV0ZXJzIGZvciB2YXJpYWRpYyBtYXRjaGVyIik7CisgICAgcmV0dXJuIFZhcmlhZGljT3BlcmF0b3JNYXRjaGVyPE1zLi4uPihPcCwgc3RkOjpmb3J3YXJkPE1zPihQcykuLi4pOworICB9Cit9OworCisvLy8gQH0KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgTWF0Y2hlcjxUPiBEeW5UeXBlZE1hdGNoZXI6OnVuY29uZGl0aW9uYWxDb252ZXJ0VG8oKSBjb25zdCB7CisgIHJldHVybiBNYXRjaGVyPFQ+KCp0aGlzKTsKK30KKworLy8vIFxicmllZiBDcmVhdGVzIGEgTWF0Y2hlcjxUPiB0aGF0IG1hdGNoZXMgaWYgYWxsIGlubmVyIG1hdGNoZXJzIG1hdGNoLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0JpbmRhYmxlTWF0Y2hlcjxUPiBtYWtlQWxsT2ZDb21wb3NpdGUoCisgICAgQXJyYXlSZWY8Y29uc3QgTWF0Y2hlcjxUPiAqPiBJbm5lck1hdGNoZXJzKSB7CisgIC8vIEZvciB0aGUgc2l6ZSgpID09IDAgY2FzZSwgd2UgcmV0dXJuIGEgInRydWUiIG1hdGNoZXIuCisgIGlmIChJbm5lck1hdGNoZXJzLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gQmluZGFibGVNYXRjaGVyPFQ+KFRydWVNYXRjaGVyKCkpOworICB9CisgIC8vIEZvciB0aGUgc2l6ZSgpID09IDEgY2FzZSwgd2Ugc2ltcGx5IHJldHVybiB0aGF0IG9uZSBtYXRjaGVyLgorICAvLyBObyBuZWVkIHRvIHdyYXAgaXQgaW4gYSB2YXJpYWRpYyBvcGVyYXRpb24uCisgIGlmIChJbm5lck1hdGNoZXJzLnNpemUoKSA9PSAxKSB7CisgICAgcmV0dXJuIEJpbmRhYmxlTWF0Y2hlcjxUPigqSW5uZXJNYXRjaGVyc1swXSk7CisgIH0KKworICB1c2luZyBQSSA9IGxsdm06OnBvaW50ZWVfaXRlcmF0b3I8Y29uc3QgTWF0Y2hlcjxUPiAqY29uc3QgKj47CisKKyAgc3RkOjp2ZWN0b3I8RHluVHlwZWRNYXRjaGVyPiBEeW5NYXRjaGVycyhQSShJbm5lck1hdGNoZXJzLmJlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJKElubmVyTWF0Y2hlcnMuZW5kKCkpKTsKKyAgcmV0dXJuIEJpbmRhYmxlTWF0Y2hlcjxUPigKKyAgICAgIER5blR5cGVkTWF0Y2hlcjo6Y29uc3RydWN0VmFyaWFkaWMoCisgICAgICAgICAgRHluVHlwZWRNYXRjaGVyOjpWT19BbGxPZiwKKyAgICAgICAgICBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZUtpbmQ8VD4oKSwKKyAgICAgICAgICBzdGQ6Om1vdmUoRHluTWF0Y2hlcnMpKQorICAgICAgICAgIC50ZW1wbGF0ZSB1bmNvbmRpdGlvbmFsQ29udmVydFRvPFQ+KCkpOworfQorCisvLy8gXGJyaWVmIENyZWF0ZXMgYSBNYXRjaGVyPFQ+IHRoYXQgbWF0Y2hlcyBpZgorLy8vIFQgaXMgZHluX2Nhc3QnYWJsZSBpbnRvIElubmVyVCBhbmQgYWxsIGlubmVyIG1hdGNoZXJzIG1hdGNoLgorLy8vCisvLy8gUmV0dXJucyBCaW5kYWJsZU1hdGNoZXIsIGFzIG1hdGNoZXJzIHRoYXQgdXNlIGR5bl9jYXN0IGhhdmUKKy8vLyB0aGUgc2FtZSBvYmplY3QgYm90aCB0byBtYXRjaCBvbiBhbmQgdG8gcnVuIHN1Ym1hdGNoZXJzIG9uLAorLy8vIHNvIHRoZXJlIGlzIG5vIGFtYmlndWl0eSB3aXRoIHdoYXQgZ2V0cyBib3VuZC4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIElubmVyVD4KK0JpbmRhYmxlTWF0Y2hlcjxUPiBtYWtlRHluQ2FzdEFsbE9mQ29tcG9zaXRlKAorICAgIEFycmF5UmVmPGNvbnN0IE1hdGNoZXI8SW5uZXJUPiAqPiBJbm5lck1hdGNoZXJzKSB7CisgIHJldHVybiBCaW5kYWJsZU1hdGNoZXI8VD4oCisgICAgICBtYWtlQWxsT2ZDb21wb3NpdGUoSW5uZXJNYXRjaGVycykudGVtcGxhdGUgZHluQ2FzdFRvPFQ+KCkpOworfQorCisvLy8gXGJyaWVmIE1hdGNoZXMgbm9kZXMgb2YgdHlwZSBUIHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUgZGVzY2VuZGFudCBub2RlIG9mCisvLy8gdHlwZSBEZXNjZW5kYW50VCBmb3Igd2hpY2ggdGhlIGdpdmVuIGlubmVyIG1hdGNoZXIgbWF0Y2hlcy4KKy8vLworLy8vIERlc2NlbmRhbnRUIG11c3QgYmUgYW4gQVNUIGJhc2UgdHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBEZXNjZW5kYW50VD4KK2NsYXNzIEhhc0Rlc2NlbmRhbnRNYXRjaGVyIDogcHVibGljIFdyYXBwZXJNYXRjaGVySW50ZXJmYWNlPFQ+IHsKKyAgc3RhdGljX2Fzc2VydChJc0Jhc2VUeXBlPERlc2NlbmRhbnRUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgImhhcyBkZXNjZW5kYW50IG9ubHkgYWNjZXB0cyBiYXNlIHR5cGUgbWF0Y2hlciIpOworCitwdWJsaWM6CisgIGV4cGxpY2l0IEhhc0Rlc2NlbmRhbnRNYXRjaGVyKGNvbnN0IE1hdGNoZXI8RGVzY2VuZGFudFQ+ICZEZXNjZW5kYW50TWF0Y2hlcikKKyAgICAgIDogSGFzRGVzY2VuZGFudE1hdGNoZXI6OldyYXBwZXJNYXRjaGVySW50ZXJmYWNlKERlc2NlbmRhbnRNYXRjaGVyKSB7fQorCisgIGJvb2wgbWF0Y2hlcyhjb25zdCBUICZOb2RlLCBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAorICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEZpbmRlci0+bWF0Y2hlc0Rlc2NlbmRhbnRPZihOb2RlLCB0aGlzLT5Jbm5lck1hdGNoZXIsIEJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RNYXRjaEZpbmRlcjo6QktfRmlyc3QpOworICB9Cit9OworCisvLy8gXGJyaWVmIE1hdGNoZXMgbm9kZXMgb2YgdHlwZSBcYyBUIHRoYXQgaGF2ZSBhIHBhcmVudCBub2RlIG9mIHR5cGUgXGMgUGFyZW50VAorLy8vIGZvciB3aGljaCB0aGUgZ2l2ZW4gaW5uZXIgbWF0Y2hlciBtYXRjaGVzLgorLy8vCisvLy8gXGMgUGFyZW50VCBtdXN0IGJlIGFuIEFTVCBiYXNlIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUGFyZW50VD4KK2NsYXNzIEhhc1BhcmVudE1hdGNoZXIgOiBwdWJsaWMgV3JhcHBlck1hdGNoZXJJbnRlcmZhY2U8VD4geworICBzdGF0aWNfYXNzZXJ0KElzQmFzZVR5cGU8UGFyZW50VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICJoYXMgcGFyZW50IG9ubHkgYWNjZXB0cyBiYXNlIHR5cGUgbWF0Y2hlciIpOworCitwdWJsaWM6CisgIGV4cGxpY2l0IEhhc1BhcmVudE1hdGNoZXIoY29uc3QgTWF0Y2hlcjxQYXJlbnRUPiAmUGFyZW50TWF0Y2hlcikKKyAgICAgIDogSGFzUGFyZW50TWF0Y2hlcjo6V3JhcHBlck1hdGNoZXJJbnRlcmZhY2UoUGFyZW50TWF0Y2hlcikge30KKworICBib29sIG1hdGNoZXMoY29uc3QgVCAmTm9kZSwgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKKyAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBGaW5kZXItPm1hdGNoZXNBbmNlc3Rvck9mKE5vZGUsIHRoaXMtPklubmVyTWF0Y2hlciwgQnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RNYXRjaEZpbmRlcjo6QU1NX1BhcmVudE9ubHkpOworICB9Cit9OworCisvLy8gXGJyaWVmIE1hdGNoZXMgbm9kZXMgb2YgdHlwZSBcYyBUIHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUgYW5jZXN0b3Igbm9kZSBvZgorLy8vIHR5cGUgXGMgQW5jZXN0b3JUIGZvciB3aGljaCB0aGUgZ2l2ZW4gaW5uZXIgbWF0Y2hlciBtYXRjaGVzLgorLy8vCisvLy8gXGMgQW5jZXN0b3JUIG11c3QgYmUgYW4gQVNUIGJhc2UgdHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBbmNlc3RvclQ+CitjbGFzcyBIYXNBbmNlc3Rvck1hdGNoZXIgOiBwdWJsaWMgV3JhcHBlck1hdGNoZXJJbnRlcmZhY2U8VD4geworICBzdGF0aWNfYXNzZXJ0KElzQmFzZVR5cGU8QW5jZXN0b3JUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgImhhcyBhbmNlc3RvciBvbmx5IGFjY2VwdHMgYmFzZSB0eXBlIG1hdGNoZXIiKTsKKworcHVibGljOgorICBleHBsaWNpdCBIYXNBbmNlc3Rvck1hdGNoZXIoY29uc3QgTWF0Y2hlcjxBbmNlc3RvclQ+ICZBbmNlc3Rvck1hdGNoZXIpCisgICAgICA6IEhhc0FuY2VzdG9yTWF0Y2hlcjo6V3JhcHBlck1hdGNoZXJJbnRlcmZhY2UoQW5jZXN0b3JNYXRjaGVyKSB7fQorCisgIGJvb2wgbWF0Y2hlcyhjb25zdCBUICZOb2RlLCBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAorICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEZpbmRlci0+bWF0Y2hlc0FuY2VzdG9yT2YoTm9kZSwgdGhpcy0+SW5uZXJNYXRjaGVyLCBCdWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVE1hdGNoRmluZGVyOjpBTU1fQWxsKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBNYXRjaGVzIG5vZGVzIG9mIHR5cGUgVCB0aGF0IGhhdmUgYXQgbGVhc3Qgb25lIGRlc2NlbmRhbnQgbm9kZSBvZgorLy8vIHR5cGUgRGVzY2VuZGFudFQgZm9yIHdoaWNoIHRoZSBnaXZlbiBpbm5lciBtYXRjaGVyIG1hdGNoZXMuCisvLy8KKy8vLyBEZXNjZW5kYW50VCBtdXN0IGJlIGFuIEFTVCBiYXNlIHR5cGUuCisvLy8gQXMgb3Bwb3NlZCB0byBIYXNEZXNjZW5kYW50TWF0Y2hlciwgRm9yRWFjaERlc2NlbmRhbnRNYXRjaGVyIHdpbGwgbWF0Y2gKKy8vLyBmb3IgZWFjaCBkZXNjZW5kYW50IG5vZGUgdGhhdCBtYXRjaGVzIGluc3RlYWQgb2Ygb25seSBmb3IgdGhlIGZpcnN0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIERlc2NlbmRhbnRUPgorY2xhc3MgRm9yRWFjaERlc2NlbmRhbnRNYXRjaGVyIDogcHVibGljIFdyYXBwZXJNYXRjaGVySW50ZXJmYWNlPFQ+IHsKKyAgc3RhdGljX2Fzc2VydChJc0Jhc2VUeXBlPERlc2NlbmRhbnRUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgImZvciBlYWNoIGRlc2NlbmRhbnQgb25seSBhY2NlcHRzIGJhc2UgdHlwZSBtYXRjaGVyIik7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgRm9yRWFjaERlc2NlbmRhbnRNYXRjaGVyKAorICAgICAgY29uc3QgTWF0Y2hlcjxEZXNjZW5kYW50VD4gJkRlc2NlbmRhbnRNYXRjaGVyKQorICAgICAgOiBGb3JFYWNoRGVzY2VuZGFudE1hdGNoZXI6OldyYXBwZXJNYXRjaGVySW50ZXJmYWNlKERlc2NlbmRhbnRNYXRjaGVyKSB7fQorCisgIGJvb2wgbWF0Y2hlcyhjb25zdCBUICZOb2RlLCBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAorICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEZpbmRlci0+bWF0Y2hlc0Rlc2NlbmRhbnRPZihOb2RlLCB0aGlzLT5Jbm5lck1hdGNoZXIsIEJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RNYXRjaEZpbmRlcjo6QktfQWxsKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBNYXRjaGVzIG9uIG5vZGVzIHRoYXQgaGF2ZSBhIGdldFZhbHVlKCkgbWV0aG9kIGlmIGdldFZhbHVlKCkgZXF1YWxzCisvLy8gdGhlIHZhbHVlIHRoZSBWYWx1ZUVxdWFsc01hdGNoZXIgd2FzIGNvbnN0cnVjdGVkIHdpdGguCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVmFsdWVUPgorY2xhc3MgVmFsdWVFcXVhbHNNYXRjaGVyIDogcHVibGljIFNpbmdsZU5vZGVNYXRjaGVySW50ZXJmYWNlPFQ+IHsKKyAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Jhc2Vfb2Y8Q2hhcmFjdGVyTGl0ZXJhbCwgVD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mPENYWEJvb2xMaXRlcmFsRXhwciwgVD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mPEZsb2F0aW5nTGl0ZXJhbCwgVD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mPEludGVnZXJMaXRlcmFsLCBUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgInRoZSBub2RlIG11c3QgaGF2ZSBhIGdldFZhbHVlIG1ldGhvZCIpOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFZhbHVlRXF1YWxzTWF0Y2hlcihjb25zdCBWYWx1ZVQgJkV4cGVjdGVkVmFsdWUpCisgICAgICA6IEV4cGVjdGVkVmFsdWUoRXhwZWN0ZWRWYWx1ZSkge30KKworICBib29sIG1hdGNoZXNOb2RlKGNvbnN0IFQgJk5vZGUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gTm9kZS5nZXRWYWx1ZSgpID09IEV4cGVjdGVkVmFsdWU7CisgIH0KKworcHJpdmF0ZToKKyAgY29uc3QgVmFsdWVUIEV4cGVjdGVkVmFsdWU7Cit9OworCisvLy8gXGJyaWVmIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyB0byBlYXNpbHkgd3JpdGUgbWF0Y2hlcnMgZm9yIGZsb2F0aW5nIHBvaW50CisvLy8gbGl0ZXJhbHMuCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVmFsdWVFcXVhbHNNYXRjaGVyPEZsb2F0aW5nTGl0ZXJhbCwgZG91YmxlPjo6bWF0Y2hlc05vZGUoCisgICAgY29uc3QgRmxvYXRpbmdMaXRlcmFsICZOb2RlKSBjb25zdCB7CisgIGlmICgoJk5vZGUuZ2V0U2VtYW50aWNzKCkpID09ICZsbHZtOjpBUEZsb2F0OjpJRUVFc2luZ2xlKCkpCisgICAgcmV0dXJuIE5vZGUuZ2V0VmFsdWUoKS5jb252ZXJ0VG9GbG9hdCgpID09IEV4cGVjdGVkVmFsdWU7CisgIGlmICgoJk5vZGUuZ2V0U2VtYW50aWNzKCkpID09ICZsbHZtOjpBUEZsb2F0OjpJRUVFZG91YmxlKCkpCisgICAgcmV0dXJuIE5vZGUuZ2V0VmFsdWUoKS5jb252ZXJ0VG9Eb3VibGUoKSA9PSBFeHBlY3RlZFZhbHVlOworICByZXR1cm4gZmFsc2U7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVmFsdWVFcXVhbHNNYXRjaGVyPEZsb2F0aW5nTGl0ZXJhbCwgZmxvYXQ+OjptYXRjaGVzTm9kZSgKKyAgICBjb25zdCBGbG9hdGluZ0xpdGVyYWwgJk5vZGUpIGNvbnN0IHsKKyAgaWYgKCgmTm9kZS5nZXRTZW1hbnRpY3MoKSkgPT0gJmxsdm06OkFQRmxvYXQ6OklFRUVzaW5nbGUoKSkKKyAgICByZXR1cm4gTm9kZS5nZXRWYWx1ZSgpLmNvbnZlcnRUb0Zsb2F0KCkgPT0gRXhwZWN0ZWRWYWx1ZTsKKyAgaWYgKCgmTm9kZS5nZXRTZW1hbnRpY3MoKSkgPT0gJmxsdm06OkFQRmxvYXQ6OklFRUVkb3VibGUoKSkKKyAgICByZXR1cm4gTm9kZS5nZXRWYWx1ZSgpLmNvbnZlcnRUb0RvdWJsZSgpID09IEV4cGVjdGVkVmFsdWU7CisgIHJldHVybiBmYWxzZTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBWYWx1ZUVxdWFsc01hdGNoZXI8RmxvYXRpbmdMaXRlcmFsLCBsbHZtOjpBUEZsb2F0Pjo6bWF0Y2hlc05vZGUoCisgICAgY29uc3QgRmxvYXRpbmdMaXRlcmFsICZOb2RlKSBjb25zdCB7CisgIHJldHVybiBFeHBlY3RlZFZhbHVlLmNvbXBhcmUoTm9kZS5nZXRWYWx1ZSgpKSA9PSBsbHZtOjpBUEZsb2F0OjpjbXBFcXVhbDsKK30KKworLy8vIFxicmllZiBBIFZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTb3VyY2VULCBUYXJnZXRUPiBvYmplY3QgaXMgYQorLy8vIHZhcmlhZGljIGZ1bmN0b3IgdGhhdCB0YWtlcyBhIG51bWJlciBvZiBNYXRjaGVyPFRhcmdldFQ+IGFuZCByZXR1cm5zIGEKKy8vLyBNYXRjaGVyPFNvdXJjZVQ+IHRoYXQgbWF0Y2hlcyBUYXJnZXRUIG5vZGVzIHRoYXQgYXJlIG1hdGNoZWQgYnkgYWxsIG9mIHRoZQorLy8vIGdpdmVuIG1hdGNoZXJzLCBpZiBTb3VyY2VUIGNhbiBiZSBkeW5hbWljYWxseSBjYXN0ZWQgaW50byBUYXJnZXRULgorLy8vCisvLy8gRm9yIGV4YW1wbGU6CisvLy8gICBjb25zdCBWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8CisvLy8gICAgICAgRGVjbCwgQ1hYUmVjb3JkRGVjbD4gcmVjb3JkOworLy8vIENyZWF0ZXMgYSBmdW5jdG9yIHJlY29yZCguLi4pIHRoYXQgY3JlYXRlcyBhIE1hdGNoZXI8RGVjbD4gZ2l2ZW4KKy8vLyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgb2YgdHlwZSBNYXRjaGVyPENYWFJlY29yZERlY2w+LgorLy8vIFRoZSByZXR1cm5lZCBtYXRjaGVyIG1hdGNoZXMgaWYgdGhlIGdpdmVuIERlY2wgY2FuIGJ5IGR5bmFtaWNhbGx5CisvLy8gY2FzdGVkIHRvIENYWFJlY29yZERlY2wgYW5kIGFsbCBnaXZlbiBtYXRjaGVycyBtYXRjaC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VULCB0eXBlbmFtZSBUYXJnZXRUPgorY2xhc3MgVmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyCisgICAgOiBwdWJsaWMgVmFyaWFkaWNGdW5jdGlvbjxCaW5kYWJsZU1hdGNoZXI8U291cmNlVD4sIE1hdGNoZXI8VGFyZ2V0VD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlRHluQ2FzdEFsbE9mQ29tcG9zaXRlPFNvdXJjZVQsIFRhcmdldFQ+PiB7CitwdWJsaWM6CisgIFZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcigpIHt9Cit9OworCisvLy8gXGJyaWVmIEEgXGMgVmFyaWFkaWNBbGxPZk1hdGNoZXI8VD4gb2JqZWN0IGlzIGEgdmFyaWFkaWMgZnVuY3RvciB0aGF0IHRha2VzCisvLy8gYSBudW1iZXIgb2YgXGMgTWF0Y2hlcjxUPiBhbmQgcmV0dXJucyBhIFxjIE1hdGNoZXI8VD4gdGhhdCBtYXRjaGVzIFxjIFQKKy8vLyBub2RlcyB0aGF0IGFyZSBtYXRjaGVkIGJ5IGFsbCBvZiB0aGUgZ2l2ZW4gbWF0Y2hlcnMuCisvLy8KKy8vLyBGb3IgZXhhbXBsZToKKy8vLyAgIGNvbnN0IFZhcmlhZGljQWxsT2ZNYXRjaGVyPE5lc3RlZE5hbWVTcGVjaWZpZXI+IG5lc3RlZE5hbWVTcGVjaWZpZXI7CisvLy8gQ3JlYXRlcyBhIGZ1bmN0b3IgbmVzdGVkTmFtZVNwZWNpZmllciguLi4pIHRoYXQgY3JlYXRlcyBhCisvLy8gXGMgTWF0Y2hlcjxOZXN0ZWROYW1lU3BlY2lmaWVyPiBnaXZlbiBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgb2YgdHlwZQorLy8vIFxjIE1hdGNoZXI8TmVzdGVkTmFtZVNwZWNpZmllcj4uCisvLy8gVGhlIHJldHVybmVkIG1hdGNoZXIgbWF0Y2hlcyBpZiBhbGwgZ2l2ZW4gbWF0Y2hlcnMgbWF0Y2guCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFZhcmlhZGljQWxsT2ZNYXRjaGVyCisgICAgOiBwdWJsaWMgVmFyaWFkaWNGdW5jdGlvbjxCaW5kYWJsZU1hdGNoZXI8VD4sIE1hdGNoZXI8VD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlQWxsT2ZDb21wb3NpdGU8VD4+IHsKK3B1YmxpYzoKKyAgVmFyaWFkaWNBbGxPZk1hdGNoZXIoKSB7fQorfTsKKworLy8vIFxicmllZiBNYXRjaGVzIG5vZGVzIG9mIHR5cGUgXGMgVExvYyBmb3Igd2hpY2ggdGhlIGlubmVyCisvLy8gXGMgTWF0Y2hlcjxUPiBtYXRjaGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFRMb2MsIHR5cGVuYW1lIFQ+CitjbGFzcyBMb2NNYXRjaGVyIDogcHVibGljIFdyYXBwZXJNYXRjaGVySW50ZXJmYWNlPFRMb2M+IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgTG9jTWF0Y2hlcihjb25zdCBNYXRjaGVyPFQ+ICZJbm5lck1hdGNoZXIpCisgICAgICA6IExvY01hdGNoZXI6OldyYXBwZXJNYXRjaGVySW50ZXJmYWNlKElubmVyTWF0Y2hlcikge30KKworICBib29sIG1hdGNoZXMoY29uc3QgVExvYyAmTm9kZSwgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKKyAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmICghTm9kZSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdGhpcy0+SW5uZXJNYXRjaGVyLm1hdGNoZXMoZXh0cmFjdChOb2RlKSwgRmluZGVyLCBCdWlsZGVyKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgYXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGUKKyAgZXh0cmFjdChjb25zdCBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jICZMb2MpIHsKKyAgICByZXR1cm4gYXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGU6OmNyZWF0ZSgqTG9jLmdldE5lc3RlZE5hbWVTcGVjaWZpZXIoKSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgTWF0Y2hlcyBcYyBUeXBlTG9jcyBiYXNlZCBvbiBhbiBpbm5lciBtYXRjaGVyIG1hdGNoaW5nIGEgY2VydGFpbgorLy8vIFxjIFF1YWxUeXBlLgorLy8vCisvLy8gVXNlZCB0byBpbXBsZW1lbnQgdGhlIFxjIGxvYygpIG1hdGNoZXIuCitjbGFzcyBUeXBlTG9jVHlwZU1hdGNoZXIgOiBwdWJsaWMgV3JhcHBlck1hdGNoZXJJbnRlcmZhY2U8VHlwZUxvYz4geworcHVibGljOgorICBleHBsaWNpdCBUeXBlTG9jVHlwZU1hdGNoZXIoY29uc3QgTWF0Y2hlcjxRdWFsVHlwZT4gJklubmVyTWF0Y2hlcikKKyAgICAgIDogVHlwZUxvY1R5cGVNYXRjaGVyOjpXcmFwcGVyTWF0Y2hlckludGVyZmFjZShJbm5lck1hdGNoZXIpIHt9CisKKyAgYm9vbCBtYXRjaGVzKGNvbnN0IFR5cGVMb2MgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCisgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBpZiAoIU5vZGUpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRoaXMtPklubmVyTWF0Y2hlci5tYXRjaGVzKAorICAgICAgICBhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZTo6Y3JlYXRlKE5vZGUuZ2V0VHlwZSgpKSwgRmluZGVyLCBCdWlsZGVyKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBNYXRjaGVzIG5vZGVzIG9mIHR5cGUgXGMgVCBmb3Igd2hpY2ggdGhlIGlubmVyIG1hdGNoZXIgbWF0Y2hlcyBvbiBhCisvLy8gYW5vdGhlciBub2RlIG9mIHR5cGUgXGMgVCB0aGF0IGNhbiBiZSByZWFjaGVkIHVzaW5nIGEgZ2l2ZW4gdHJhdmVyc2UKKy8vLyBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZVRyYXZlcnNlTWF0Y2hlciA6IHB1YmxpYyBXcmFwcGVyTWF0Y2hlckludGVyZmFjZTxUPiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFR5cGVUcmF2ZXJzZU1hdGNoZXIoY29uc3QgTWF0Y2hlcjxRdWFsVHlwZT4gJklubmVyTWF0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSAoVDo6KlRyYXZlcnNlRnVuY3Rpb24pKCkgY29uc3QpCisgICAgICA6IFR5cGVUcmF2ZXJzZU1hdGNoZXI6OldyYXBwZXJNYXRjaGVySW50ZXJmYWNlKElubmVyTWF0Y2hlciksCisgICAgICAgIFRyYXZlcnNlRnVuY3Rpb24oVHJhdmVyc2VGdW5jdGlvbikge30KKworICBib29sIG1hdGNoZXMoY29uc3QgVCAmTm9kZSwgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKKyAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIFF1YWxUeXBlIE5leHROb2RlID0gKE5vZGUuKlRyYXZlcnNlRnVuY3Rpb24pKCk7CisgICAgaWYgKE5leHROb2RlLmlzTnVsbCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0aGlzLT5Jbm5lck1hdGNoZXIubWF0Y2hlcygKKyAgICAgICAgYXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGU6OmNyZWF0ZShOZXh0Tm9kZSksIEZpbmRlciwgQnVpbGRlcik7CisgIH0KKworcHJpdmF0ZToKKyAgUXVhbFR5cGUgKFQ6OipUcmF2ZXJzZUZ1bmN0aW9uKSgpIGNvbnN0OworfTsKKworLy8vIFxicmllZiBNYXRjaGVzIG5vZGVzIG9mIHR5cGUgXGMgVCBpbiBhIC4uTG9jIGhpZXJhcmNoeSwgZm9yIHdoaWNoIHRoZSBpbm5lcgorLy8vIG1hdGNoZXIgbWF0Y2hlcyBvbiBhIGFub3RoZXIgbm9kZSBvZiB0eXBlIFxjIFQgdGhhdCBjYW4gYmUgcmVhY2hlZCB1c2luZyBhCisvLy8gZ2l2ZW4gdHJhdmVyc2UgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVMb2NUcmF2ZXJzZU1hdGNoZXIgOiBwdWJsaWMgV3JhcHBlck1hdGNoZXJJbnRlcmZhY2U8VD4geworcHVibGljOgorICBleHBsaWNpdCBUeXBlTG9jVHJhdmVyc2VNYXRjaGVyKGNvbnN0IE1hdGNoZXI8VHlwZUxvYz4gJklubmVyTWF0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlTG9jIChUOjoqVHJhdmVyc2VGdW5jdGlvbikoKSBjb25zdCkKKyAgICAgIDogVHlwZUxvY1RyYXZlcnNlTWF0Y2hlcjo6V3JhcHBlck1hdGNoZXJJbnRlcmZhY2UoSW5uZXJNYXRjaGVyKSwKKyAgICAgICAgVHJhdmVyc2VGdW5jdGlvbihUcmF2ZXJzZUZ1bmN0aW9uKSB7fQorCisgIGJvb2wgbWF0Y2hlcyhjb25zdCBUICZOb2RlLCBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAorICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CisgICAgVHlwZUxvYyBOZXh0Tm9kZSA9IChOb2RlLipUcmF2ZXJzZUZ1bmN0aW9uKSgpOworICAgIGlmICghTmV4dE5vZGUpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRoaXMtPklubmVyTWF0Y2hlci5tYXRjaGVzKAorICAgICAgICBhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZTo6Y3JlYXRlKE5leHROb2RlKSwgRmluZGVyLCBCdWlsZGVyKTsKKyAgfQorCitwcml2YXRlOgorICBUeXBlTG9jIChUOjoqVHJhdmVyc2VGdW5jdGlvbikoKSBjb25zdDsKK307CisKKy8vLyBcYnJpZWYgQ29udmVydHMgYSBcYyBNYXRjaGVyPElubmVyVD4gdG8gYSBcYyBNYXRjaGVyPE91dGVyVD4sIHdoZXJlCisvLy8gXGMgT3V0ZXJUIGlzIGFueSB0eXBlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IFxjIEdldHRlci4KKy8vLworLy8vIFxjb2RlIEdldHRlcjxPdXRlclQ+Ojp2YWx1ZSgpIFxlbmRjb2RlIHJldHVybnMgYQorLy8vIFxjb2RlIElubmVyVEJhc2UgKE91dGVyVDo6KikoKSBcZW5kY29kZSwgd2hpY2ggaXMgdXNlZCB0byBhZGFwdCBhIFxjIE91dGVyVAorLy8vIG9iamVjdCBpbnRvIGEgXGMgSW5uZXJUCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJUQmFzZSwKKyAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3V0ZXJUPiBjbGFzcyBHZXR0ZXIsCisgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIE91dGVyVD4gY2xhc3MgTWF0Y2hlckltcGwsCisgICAgICAgICAgdHlwZW5hbWUgUmV0dXJuVHlwZXNGPgorY2xhc3MgVHlwZVRyYXZlcnNlUG9seW1vcnBoaWNNYXRjaGVyIHsKK3ByaXZhdGU6CisgIHVzaW5nIFNlbGYgPSBUeXBlVHJhdmVyc2VQb2x5bW9ycGhpY01hdGNoZXI8SW5uZXJUQmFzZSwgR2V0dGVyLCBNYXRjaGVySW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlc0Y+OworCisgIHN0YXRpYyBTZWxmIGNyZWF0ZShBcnJheVJlZjxjb25zdCBNYXRjaGVyPElubmVyVEJhc2U+ICo+IElubmVyTWF0Y2hlcnMpOworCitwdWJsaWM6CisgIHVzaW5nIFJldHVyblR5cGVzID0gdHlwZW5hbWUgRXh0cmFjdEZ1bmN0aW9uQXJnTWV0YTxSZXR1cm5UeXBlc0Y+Ojp0eXBlOworCisgIGV4cGxpY2l0IFR5cGVUcmF2ZXJzZVBvbHltb3JwaGljTWF0Y2hlcigKKyAgICAgIEFycmF5UmVmPGNvbnN0IE1hdGNoZXI8SW5uZXJUQmFzZT4gKj4gSW5uZXJNYXRjaGVycykKKyAgICAgIDogSW5uZXJNYXRjaGVyKG1ha2VBbGxPZkNvbXBvc2l0ZShJbm5lck1hdGNoZXJzKSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3V0ZXJUPiBvcGVyYXRvciBNYXRjaGVyPE91dGVyVD4oKSBjb25zdCB7CisgICAgcmV0dXJuIE1hdGNoZXI8T3V0ZXJUPigKKyAgICAgICAgbmV3IE1hdGNoZXJJbXBsPE91dGVyVD4oSW5uZXJNYXRjaGVyLCBHZXR0ZXI8T3V0ZXJUPjo6dmFsdWUoKSkpOworICB9CisKKyAgc3RydWN0IEZ1bmMKKyAgICAgIDogcHVibGljIFZhcmlhZGljRnVuY3Rpb248U2VsZiwgTWF0Y2hlcjxJbm5lclRCYXNlPiwgJlNlbGY6OmNyZWF0ZT4geworICAgIEZ1bmMoKSB7fQorICB9OworCitwcml2YXRlOgorICBjb25zdCBNYXRjaGVyPElubmVyVEJhc2U+IElubmVyTWF0Y2hlcjsKK307CisKKy8vLyBcYnJpZWYgQSBzaW1wbGUgbWVtb2l6ZXIgb2YgVCgqKSgpIGZ1bmN0aW9ucy4KKy8vLworLy8vIEl0IHdpbGwgY2FsbCB0aGUgcGFzc2VkICdGdW5jJyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgYXQgbW9zdCBvbmNlLgorLy8vIFVzZWQgdG8gc3VwcG9ydCBBU1RfTUFUQ0hFUl9GVU5DVElPTigpIG1hY3JvLgordGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXIsIE1hdGNoZXIgKCpGdW5jKSgpPiBjbGFzcyBNZW1vaXplZE1hdGNoZXIgeworICBzdHJ1Y3QgV3JhcHBlciB7CisgICAgV3JhcHBlcigpIDogTShGdW5jKCkpIHt9CisKKyAgICBNYXRjaGVyIE07CisgIH07CisKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IE1hdGNoZXIgJmdldEluc3RhbmNlKCkgeworICAgIHN0YXRpYyBsbHZtOjpNYW5hZ2VkU3RhdGljPFdyYXBwZXI+IEluc3RhbmNlOworICAgIHJldHVybiBJbnN0YW5jZS0+TTsKKyAgfQorfTsKKworLy8gRGVmaW5lIHRoZSBjcmVhdGUoKSBtZXRob2Qgb3V0IG9mIGxpbmUgdG8gc2lsZW5jZSBhIEdDQyB3YXJuaW5nIGFib3V0CisvLyB0aGUgc3RydWN0ICJGdW5jIiBoYXZpbmcgZ3JlYXRlciB2aXNpYmlsaXR5IHRoYW4gaXRzIGJhc2UsIHdoaWNoIGNvbWVzIGZyb20KKy8vIHVzaW5nIHRoZSBmbGFnIC1mdmlzaWJpbGl0eS1pbmxpbmVzLWhpZGRlbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbm5lclRCYXNlLCB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3V0ZXJUPiBjbGFzcyBHZXR0ZXIsCisgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIE91dGVyVD4gY2xhc3MgTWF0Y2hlckltcGwsIHR5cGVuYW1lIFJldHVyblR5cGVzRj4KK1R5cGVUcmF2ZXJzZVBvbHltb3JwaGljTWF0Y2hlcjxJbm5lclRCYXNlLCBHZXR0ZXIsIE1hdGNoZXJJbXBsLCBSZXR1cm5UeXBlc0Y+CitUeXBlVHJhdmVyc2VQb2x5bW9ycGhpY01hdGNoZXI8CisgICAgSW5uZXJUQmFzZSwgR2V0dGVyLCBNYXRjaGVySW1wbCwKKyAgICBSZXR1cm5UeXBlc0Y+OjpjcmVhdGUoQXJyYXlSZWY8Y29uc3QgTWF0Y2hlcjxJbm5lclRCYXNlPiAqPiBJbm5lck1hdGNoZXJzKSB7CisgIHJldHVybiBTZWxmKElubmVyTWF0Y2hlcnMpOworfQorCisvLyBGSVhNRTogdW5pZnkgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCBhbmQgVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUncworLy8gQVBJcyBmb3IgYWNjZXNzaW5nIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0LgoraW5saW5lIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+CitnZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uQXJncyhjb25zdCBDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICZEKSB7CisgIHJldHVybiBELmdldFRlbXBsYXRlQXJncygpLmFzQXJyYXkoKTsKK30KKworaW5saW5lIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+CitnZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uQXJncyhjb25zdCBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZSAmVCkgeworICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKFQuZ2V0QXJncygpLCBULmdldE51bUFyZ3MoKSk7Cit9CisKK2lubGluZSBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PgorZ2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbkFyZ3MoY29uc3QgRnVuY3Rpb25EZWNsICZGRCkgeworICBpZiAoY29uc3QgYXV0byogVGVtcGxhdGVBcmdzID0gRkQuZ2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbkFyZ3MoKSkKKyAgICByZXR1cm4gVGVtcGxhdGVBcmdzLT5hc0FycmF5KCk7CisgIHJldHVybiBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PigpOworfQorCitzdHJ1Y3QgTm90RXF1YWxzQm91bmROb2RlUHJlZGljYXRlIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGludGVybmFsOjpCb3VuZE5vZGVzTWFwICZOb2RlcykgY29uc3QgeworICAgIHJldHVybiBOb2Rlcy5nZXROb2RlKElEKSAhPSBOb2RlOworICB9CisKKyAgc3RkOjpzdHJpbmcgSUQ7CisgIGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlIE5vZGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHk+CitzdHJ1Y3QgR2V0Qm9keU1hdGNoZXIgeworICBzdGF0aWMgY29uc3QgU3RtdCAqZ2V0KGNvbnN0IFR5ICZOb2RlKSB7CisgICAgcmV0dXJuIE5vZGUuZ2V0Qm9keSgpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PgoraW5saW5lIGNvbnN0IFN0bXQgKkdldEJvZHlNYXRjaGVyPEZ1bmN0aW9uRGVjbD46OmdldChjb25zdCBGdW5jdGlvbkRlY2wgJk5vZGUpIHsKKyAgcmV0dXJuIE5vZGUuZG9lc1RoaXNEZWNsYXJhdGlvbkhhdmVBQm9keSgpID8gTm9kZS5nZXRCb2R5KCkgOiBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHk+CitzdHJ1Y3QgSGFzU2l6ZU1hdGNoZXIgeworICBzdGF0aWMgYm9vbCBoYXNTaXplKGNvbnN0IFR5ICZOb2RlLCB1bnNpZ25lZCBpbnQgTikgeworICAgIHJldHVybiBOb2RlLmdldFNpemUoKSA9PSBOOworICB9Cit9OworCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgSGFzU2l6ZU1hdGNoZXI8U3RyaW5nTGl0ZXJhbD46Omhhc1NpemUoCisgICAgY29uc3QgU3RyaW5nTGl0ZXJhbCAmTm9kZSwgdW5zaWduZWQgaW50IE4pIHsKKyAgcmV0dXJuIE5vZGUuZ2V0TGVuZ3RoKCkgPT0gTjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5Pgorc3RydWN0IEdldFNvdXJjZUV4cHJlc3Npb25NYXRjaGVyIHsKKyAgc3RhdGljIGNvbnN0IEV4cHIgKmdldChjb25zdCBUeSAmTm9kZSkgeworICAgIHJldHVybiBOb2RlLmdldFN1YkV4cHIoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK2lubGluZSBjb25zdCBFeHByICpHZXRTb3VyY2VFeHByZXNzaW9uTWF0Y2hlcjxPcGFxdWVWYWx1ZUV4cHI+OjpnZXQoCisgICAgY29uc3QgT3BhcXVlVmFsdWVFeHByICZOb2RlKSB7CisgIHJldHVybiBOb2RlLmdldFNvdXJjZUV4cHIoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5Pgorc3RydWN0IENvbXBvdW5kU3RtdE1hdGNoZXIgeworICBzdGF0aWMgY29uc3QgQ29tcG91bmRTdG10ICpnZXQoY29uc3QgVHkgJk5vZGUpIHsKKyAgICByZXR1cm4gJk5vZGU7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgQ29tcG91bmRTdG10ICoKK0NvbXBvdW5kU3RtdE1hdGNoZXI8U3RtdEV4cHI+OjpnZXQoY29uc3QgU3RtdEV4cHIgJk5vZGUpIHsKKyAgcmV0dXJuIE5vZGUuZ2V0U3ViU3RtdCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIG5hbWVzcGFjZSBhc3RfbWF0Y2hlcnMKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUTUFUQ0hFUlNfQVNUTUFUQ0hFUlNJTlRFUk5BTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaGVyc01hY3Jvcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hlcnNNYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTMzMzI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hlcnNNYWNyb3MuaApAQCAtMCwwICsxLDQ0NCBAQAorLy89PT0tLS0gQVNUTWF0Y2hlcnNNYWNyb3MuaCAtIFN0cnVjdHVyYWwgcXVlcnkgZnJhbWV3b3JrIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgRGVmaW5lcyBtYWNyb3MgdGhhdCBlbmFibGUgdXMgdG8gZGVmaW5lIG5ldyBtYXRjaGVycyBpbiBhIHNpbmdsZSBwbGFjZS4KKy8vICBTaW5jZSBhIG1hdGNoZXIgaXMgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgTWF0Y2hlcjxUPiBvYmplY3QsIHdoZXJlCisvLyAgVCBpcyB0aGUgdHlwZSBvZiB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtYXRjaGVyLCB0aGUgbWFjcm9zIGFsbG93CisvLyAgdXMgdG8gd3JpdGUgbWF0Y2hlcnMgbGlrZSBmdW5jdGlvbnMgYW5kIHRha2UgY2FyZSBvZiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKKy8vICBjbGFzcyBib2lsZXJwbGF0ZS4KKy8vCisvLyAgTm90ZSB0aGF0IHdoZW4geW91IGRlZmluZSBhIG1hdGNoZXIgd2l0aCBhbiBBU1RfTUFUQ0hFUiogbWFjcm8sIG9ubHkgdGhlCisvLyAgZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyB0aGUgbWF0Y2hlciBnb2VzIGludG8gdGhlIGN1cnJlbnQgbmFtZXNwYWNlIC0gdGhlCisvLyAgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBhY3R1YWwgbWF0Y2hlciwgd2hpY2ggZ2V0cyByZXR1cm5lZCBieSB0aGUKKy8vICBnZW5lcmF0b3IgZnVuY3Rpb24sIGlzIHB1dCBpbnRvIHRoZSAnaW50ZXJuYWwnIG5hbWVzcGFjZS4gVGhpcyBhbGxvd3MgdXMKKy8vICB0byBvbmx5IGhhdmUgdGhlIGZ1bmN0aW9ucyAod2hpY2ggaXMgYWxsIHRoZSB1c2VyIGNhcmVzIGFib3V0KSBpbiB0aGUKKy8vICAnYXN0X21hdGNoZXJzJyBuYW1lc3BhY2UgYW5kIGhpZGUgdGhlIGJvaWxlcnBsYXRlLgorLy8KKy8vICBUbyBkZWZpbmUgYSBtYXRjaGVyIGluIHVzZXIgY29kZSwgcHV0IGl0IGludG8geW91ciBvd24gbmFtZXNwYWNlLiBUaGlzIHdvdWxkCisvLyAgaGVscCB0byBwcmV2ZW50IE9EUiB2aW9sYXRpb25zIGluIGNhc2UgYSBtYXRjaGVyIHdpdGggdGhlIHNhbWUgbmFtZSBpcworLy8gIGRlZmluZWQgaW4gbXVsdGlwbGUgdHJhbnNsYXRpb24gdW5pdHM6CisvLworLy8gIG5hbWVzcGFjZSBteV9tYXRjaGVycyB7CisvLyAgQVNUX01BVENIRVJfUChjbGFuZzo6TWVtYmVyRXhwciwgTWVtYmVyLAorLy8gICAgICAgICAgICAgICAgY2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6Ok1hdGNoZXI8Y2xhbmc6OlZhbHVlRGVjbD4sCisvLyAgICAgICAgICAgICAgICBJbm5lck1hdGNoZXIpIHsKKy8vICAgIHJldHVybiBJbm5lck1hdGNoZXIubWF0Y2hlcygqTm9kZS5nZXRNZW1iZXJEZWNsKCksIEZpbmRlciwgQnVpbGRlcik7CisvLyAgfQorLy8gIH0gLy8gbmFtZXNwYWNlIG15X21hdGNoZXJzCisvLworLy8gIEFsdGVybmF0aXZlbHksIGFuIHVubmFtZWQgbmFtZXNwYWNlIG1heSBiZSB1c2VkOgorLy8KKy8vICBuYW1lc3BhY2UgY2xhbmcgeworLy8gIG5hbWVzcGFjZSBhc3RfbWF0Y2hlcnMgeworLy8gIG5hbWVzcGFjZSB7CisvLyAgQVNUX01BVENIRVJfUChNZW1iZXJFeHByLCBNZW1iZXIsCisvLyAgICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxWYWx1ZURlY2w+LCBJbm5lck1hdGNoZXIpIHsKKy8vICAgIHJldHVybiBJbm5lck1hdGNoZXIubWF0Y2hlcygqTm9kZS5nZXRNZW1iZXJEZWNsKCksIEZpbmRlciwgQnVpbGRlcik7CisvLyAgfQorLy8gIH0gLy8gbmFtZXNwYWNlCisvLyAgfSAvLyBuYW1lc3BhY2UgYXN0X21hdGNoZXJzCisvLyAgfSAvLyBuYW1lc3BhY2UgY2xhbmcKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUTUFUQ0hFUlNfQVNUTUFUQ0hFUlNNQUNST1NfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVE1BVENIRVJTX0FTVE1BVENIRVJTTUFDUk9TX0gKKworLy8vIFxicmllZiBBU1RfTUFUQ0hFUl9GVU5DVElPTihSZXR1cm5UeXBlLCBEZWZpbmVNYXRjaGVyKSB7IC4uLiB9CisvLy8gZGVmaW5lcyBhIHplcm8gcGFyYW1ldGVyIGZ1bmN0aW9uIG5hbWVkIERlZmluZU1hdGNoZXIoKSB0aGF0IHJldHVybnMgYQorLy8vIFJldHVyblR5cGUgb2JqZWN0LgorI2RlZmluZSBBU1RfTUFUQ0hFUl9GVU5DVElPTihSZXR1cm5UeXBlLCBEZWZpbmVNYXRjaGVyKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIFJldHVyblR5cGUgRGVmaW5lTWF0Y2hlciMjX2dldEluc3RhbmNlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBSZXR1cm5UeXBlIERlZmluZU1hdGNoZXIoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpNZW1vaXplZE1hdGNoZXI8ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUmV0dXJuVHlwZSwgRGVmaW5lTWF0Y2hlciMjX2dldEluc3RhbmNlPjo6Z2V0SW5zdGFuY2UoKTsgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgUmV0dXJuVHlwZSBEZWZpbmVNYXRjaGVyIyNfZ2V0SW5zdGFuY2UoKQorCisvLy8gXGJyaWVmIEFTVF9NQVRDSEVSX0ZVTkNUSU9OX1AoUmV0dXJuVHlwZSwgRGVmaW5lTWF0Y2hlciwgUGFyYW1UeXBlLCBQYXJhbSkgeworLy8vIC4uLiB9CisvLy8gZGVmaW5lcyBhIHNpbmdsZS1wYXJhbWV0ZXIgZnVuY3Rpb24gbmFtZWQgRGVmaW5lTWF0Y2hlcigpIHRoYXQgcmV0dXJucyBhCisvLy8gUmV0dXJuVHlwZSBvYmplY3QuCisvLy8KKy8vLyBUaGUgY29kZSBiZXR3ZWVuIHRoZSBjdXJseSBicmFjZXMgaGFzIGFjY2VzcyB0byB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKKy8vLworLy8vICAgUGFyYW06ICAgICAgICAgICAgICAgICB0aGUgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgZnVuY3Rpb247IGl0cyB0eXBlCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFBhcmFtVHlwZS4KKy8vLworLy8vIFRoZSBjb2RlIHNob3VsZCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgUmV0dXJuVHlwZS4KKyNkZWZpbmUgQVNUX01BVENIRVJfRlVOQ1RJT05fUChSZXR1cm5UeXBlLCBEZWZpbmVNYXRjaGVyLCBQYXJhbVR5cGUsIFBhcmFtKSAgICBcCisgIEFTVF9NQVRDSEVSX0ZVTkNUSU9OX1BfT1ZFUkxPQUQoUmV0dXJuVHlwZSwgRGVmaW5lTWF0Y2hlciwgUGFyYW1UeXBlLCBQYXJhbSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApCisjZGVmaW5lIEFTVF9NQVRDSEVSX0ZVTkNUSU9OX1BfT1ZFUkxPQUQoUmV0dXJuVHlwZSwgRGVmaW5lTWF0Y2hlciwgUGFyYW1UeXBlLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtLCBPdmVybG9hZElkKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIFJldHVyblR5cGUgRGVmaW5lTWF0Y2hlcihQYXJhbVR5cGUgY29uc3QgJlBhcmFtKTsgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGVkZWYgUmV0dXJuVHlwZSAoJkRlZmluZU1hdGNoZXIjI19UeXBlIyNPdmVybG9hZElkKShQYXJhbVR5cGUgY29uc3QgJik7ICAgXAorICBpbmxpbmUgUmV0dXJuVHlwZSBEZWZpbmVNYXRjaGVyKFBhcmFtVHlwZSBjb25zdCAmUGFyYW0pCisKKy8vLyBcYnJpZWYgQVNUX01BVENIRVIoVHlwZSwgRGVmaW5lTWF0Y2hlcikgeyAuLi4gfQorLy8vIGRlZmluZXMgYSB6ZXJvIHBhcmFtZXRlciBmdW5jdGlvbiBuYW1lZCBEZWZpbmVNYXRjaGVyKCkgdGhhdCByZXR1cm5zIGEKKy8vLyBNYXRjaGVyPFR5cGU+IG9iamVjdC4KKy8vLworLy8vIFRoZSBjb2RlIGJldHdlZW4gdGhlIGN1cmx5IGJyYWNlcyBoYXMgYWNjZXNzIHRvIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgorLy8vCisvLy8gICBOb2RlOiAgICAgICAgICAgICAgICAgIHRoZSBBU1Qgbm9kZSBiZWluZyBtYXRjaGVkOyBpdHMgdHlwZSBpcyBUeXBlLgorLy8vICAgRmluZGVyOiAgICAgICAgICAgICAgICBhbiBBU1RNYXRjaEZpbmRlciouCisvLy8gICBCdWlsZGVyOiAgICAgICAgICAgICAgIGEgQm91bmROb2Rlc1RyZWVCdWlsZGVyKi4KKy8vLworLy8vIFRoZSBjb2RlIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiAnTm9kZScgbWF0Y2hlcy4KKyNkZWZpbmUgQVNUX01BVENIRVIoVHlwZSwgRGVmaW5lTWF0Y2hlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSBpbnRlcm5hbCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGFzcyBtYXRjaGVyXyMjRGVmaW5lTWF0Y2hlciMjTWF0Y2hlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogcHVibGljIDo6Y2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6Ok1hdGNoZXJJbnRlcmZhY2U8VHlwZT4geyAgICAgICBcCisgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGV4cGxpY2l0IG1hdGNoZXJfIyNEZWZpbmVNYXRjaGVyIyNNYXRjaGVyKCkgPSBkZWZhdWx0OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBib29sIG1hdGNoZXMoY29uc3QgVHlwZSAmTm9kZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIDo6Y2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OkFTVE1hdGNoRmluZGVyICpGaW5kZXIsICAgICAgXAorICAgICAgICAgICAgICAgICA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICpCdWlsZGVyKSBjb25zdCBvdmVycmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIDo6Y2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6Ok1hdGNoZXI8VHlwZT4gRGVmaW5lTWF0Y2hlcigpIHsgICAgICBcCisgICAgcmV0dXJuIDo6Y2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6Om1ha2VNYXRjaGVyKCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXcgaW50ZXJuYWw6Om1hdGNoZXJfIyNEZWZpbmVNYXRjaGVyIyNNYXRjaGVyKCkpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBib29sIGludGVybmFsOjptYXRjaGVyXyMjRGVmaW5lTWF0Y2hlciMjTWF0Y2hlcjo6bWF0Y2hlcyggICAgICAgICAgICAgXAorICAgICAgY29uc3QgVHlwZSAmTm9kZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDo6Y2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OkFTVE1hdGNoRmluZGVyICpGaW5kZXIsICAgICAgICAgICAgICAgICBcCisgICAgICA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0CisKKy8vLyBcYnJpZWYgQVNUX01BVENIRVJfUChUeXBlLCBEZWZpbmVNYXRjaGVyLCBQYXJhbVR5cGUsIFBhcmFtKSB7IC4uLiB9CisvLy8gZGVmaW5lcyBhIHNpbmdsZS1wYXJhbWV0ZXIgZnVuY3Rpb24gbmFtZWQgRGVmaW5lTWF0Y2hlcigpIHRoYXQgcmV0dXJucyBhCisvLy8gTWF0Y2hlcjxUeXBlPiBvYmplY3QuCisvLy8KKy8vLyBUaGUgY29kZSBiZXR3ZWVuIHRoZSBjdXJseSBicmFjZXMgaGFzIGFjY2VzcyB0byB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKKy8vLworLy8vICAgTm9kZTogICAgICAgICAgICAgICAgICB0aGUgQVNUIG5vZGUgYmVpbmcgbWF0Y2hlZDsgaXRzIHR5cGUgaXMgVHlwZS4KKy8vLyAgIFBhcmFtOiAgICAgICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uOyBpdHMgdHlwZQorLy8vICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBQYXJhbVR5cGUuCisvLy8gICBGaW5kZXI6ICAgICAgICAgICAgICAgIGFuIEFTVE1hdGNoRmluZGVyKi4KKy8vLyAgIEJ1aWxkZXI6ICAgICAgICAgICAgICAgYSBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIqLgorLy8vCisvLy8gVGhlIGNvZGUgc2hvdWxkIHJldHVybiB0cnVlIGlmICdOb2RlJyBtYXRjaGVzLgorI2RlZmluZSBBU1RfTUFUQ0hFUl9QKFR5cGUsIERlZmluZU1hdGNoZXIsIFBhcmFtVHlwZSwgUGFyYW0pICAgICAgICAgICAgICAgICAgIFwKKyAgQVNUX01BVENIRVJfUF9PVkVSTE9BRChUeXBlLCBEZWZpbmVNYXRjaGVyLCBQYXJhbVR5cGUsIFBhcmFtLCAwKQorCisjZGVmaW5lIEFTVF9NQVRDSEVSX1BfT1ZFUkxPQUQoVHlwZSwgRGVmaW5lTWF0Y2hlciwgUGFyYW1UeXBlLCBQYXJhbSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJsb2FkSWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIGludGVybmFsIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIG1hdGNoZXJfIyNEZWZpbmVNYXRjaGVyIyNPdmVybG9hZElkIyNNYXRjaGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiBwdWJsaWMgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6TWF0Y2hlckludGVyZmFjZTxUeXBlPiB7ICAgICAgIFwKKyAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXhwbGljaXQgbWF0Y2hlcl8jI0RlZmluZU1hdGNoZXIjI092ZXJsb2FkSWQjI01hdGNoZXIoICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQYXJhbVR5cGUgY29uc3QgJkEjI1BhcmFtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiBQYXJhbShBIyNQYXJhbSkge30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYm9vbCBtYXRjaGVzKGNvbnN0IFR5cGUgJk5vZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpBU1RNYXRjaEZpbmRlciAqRmluZGVyLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6Qm91bmROb2Rlc1RyZWVCdWlsZGVyICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUGFyYW1UeXBlIGNvbnN0IFBhcmFtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpNYXRjaGVyPFR5cGU+IERlZmluZU1hdGNoZXIoICAgICAgICAgXAorICAgICAgUGFyYW1UeXBlIGNvbnN0ICZQYXJhbSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6bWFrZU1hdGNoZXIoICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ldyBpbnRlcm5hbDo6bWF0Y2hlcl8jI0RlZmluZU1hdGNoZXIjI092ZXJsb2FkSWQjI01hdGNoZXIoUGFyYW0pKTsgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpNYXRjaGVyPFR5cGU+KCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAmRGVmaW5lTWF0Y2hlciMjX1R5cGUjI092ZXJsb2FkSWQpKFBhcmFtVHlwZSBjb25zdCAmUGFyYW0pOyAgICAgICAgICAgICAgXAorICBpbmxpbmUgYm9vbCBpbnRlcm5hbDo6bWF0Y2hlcl8jI0RlZmluZU1hdGNoZXIjI092ZXJsb2FkSWQjI01hdGNoZXI6Om1hdGNoZXMoIFwKKyAgICAgIGNvbnN0IFR5cGUgJk5vZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpBU1RNYXRjaEZpbmRlciAqRmluZGVyLCAgICAgICAgICAgICAgICAgXAorICAgICAgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6Qm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyKSBjb25zdAorCisvLy8gXGJyaWVmIEFTVF9NQVRDSEVSX1AyKAorLy8vICAgICBUeXBlLCBEZWZpbmVNYXRjaGVyLCBQYXJhbVR5cGUxLCBQYXJhbTEsIFBhcmFtVHlwZTIsIFBhcmFtMikgeyAuLi4gfQorLy8vIGRlZmluZXMgYSB0d28tcGFyYW1ldGVyIGZ1bmN0aW9uIG5hbWVkIERlZmluZU1hdGNoZXIoKSB0aGF0IHJldHVybnMgYQorLy8vIE1hdGNoZXI8VHlwZT4gb2JqZWN0LgorLy8vCisvLy8gVGhlIGNvZGUgYmV0d2VlbiB0aGUgY3VybHkgYnJhY2VzIGhhcyBhY2Nlc3MgdG8gdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6CisvLy8KKy8vLyAgIE5vZGU6ICAgICAgICAgICAgICAgICAgdGhlIEFTVCBub2RlIGJlaW5nIG1hdGNoZWQ7IGl0cyB0eXBlIGlzIFR5cGUuCisvLy8gICBQYXJhbTEsIFBhcmFtMjogICAgICAgIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb247IHRoZWlyIHR5cGVzCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBQYXJhbVR5cGUxIGFuZCBQYXJhbVR5cGUyLgorLy8vICAgRmluZGVyOiAgICAgICAgICAgICAgICBhbiBBU1RNYXRjaEZpbmRlciouCisvLy8gICBCdWlsZGVyOiAgICAgICAgICAgICAgIGEgQm91bmROb2Rlc1RyZWVCdWlsZGVyKi4KKy8vLworLy8vIFRoZSBjb2RlIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiAnTm9kZScgbWF0Y2hlcy4KKyNkZWZpbmUgQVNUX01BVENIRVJfUDIoVHlwZSwgRGVmaW5lTWF0Y2hlciwgUGFyYW1UeXBlMSwgUGFyYW0xLCBQYXJhbVR5cGUyLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBU1RfTUFUQ0hFUl9QMl9PVkVSTE9BRChUeXBlLCBEZWZpbmVNYXRjaGVyLCBQYXJhbVR5cGUxLCBQYXJhbTEsIFBhcmFtVHlwZTIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW0yLCAwKQorCisjZGVmaW5lIEFTVF9NQVRDSEVSX1AyX09WRVJMT0FEKFR5cGUsIERlZmluZU1hdGNoZXIsIFBhcmFtVHlwZTEsIFBhcmFtMSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbVR5cGUyLCBQYXJhbTIsIE92ZXJsb2FkSWQpICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIGludGVybmFsIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIG1hdGNoZXJfIyNEZWZpbmVNYXRjaGVyIyNPdmVybG9hZElkIyNNYXRjaGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiBwdWJsaWMgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6TWF0Y2hlckludGVyZmFjZTxUeXBlPiB7ICAgICAgIFwKKyAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWF0Y2hlcl8jI0RlZmluZU1hdGNoZXIjI092ZXJsb2FkSWQjI01hdGNoZXIoUGFyYW1UeXBlMSBjb25zdCAmQSMjUGFyYW0xLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtVHlwZTIgY29uc3QgJkEjI1BhcmFtMikgIFwKKyAgICAgICAgOiBQYXJhbTEoQSMjUGFyYW0xKSwgUGFyYW0yKEEjI1BhcmFtMikge30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYm9vbCBtYXRjaGVzKGNvbnN0IFR5cGUgJk5vZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpBU1RNYXRjaEZpbmRlciAqRmluZGVyLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6Qm91bmROb2Rlc1RyZWVCdWlsZGVyICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUGFyYW1UeXBlMSBjb25zdCBQYXJhbTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBhcmFtVHlwZTIgY29uc3QgUGFyYW0yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6TWF0Y2hlcjxUeXBlPiBEZWZpbmVNYXRjaGVyKCAgICAgICAgIFwKKyAgICAgIFBhcmFtVHlwZTEgY29uc3QgJlBhcmFtMSwgUGFyYW1UeXBlMiBjb25zdCAmUGFyYW0yKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIDo6Y2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6Om1ha2VNYXRjaGVyKCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXcgaW50ZXJuYWw6Om1hdGNoZXJfIyNEZWZpbmVNYXRjaGVyIyNPdmVybG9hZElkIyNNYXRjaGVyKFBhcmFtMSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbTIpKTsgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlZGVmIDo6Y2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6Ok1hdGNoZXI8VHlwZT4oICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICZEZWZpbmVNYXRjaGVyIyNfVHlwZSMjT3ZlcmxvYWRJZCkoUGFyYW1UeXBlMSBjb25zdCAmUGFyYW0xLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtVHlwZTIgY29uc3QgJlBhcmFtMik7ICAgICAgICAgICAgXAorICBpbmxpbmUgYm9vbCBpbnRlcm5hbDo6bWF0Y2hlcl8jI0RlZmluZU1hdGNoZXIjI092ZXJsb2FkSWQjI01hdGNoZXI6Om1hdGNoZXMoIFwKKyAgICAgIGNvbnN0IFR5cGUgJk5vZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpBU1RNYXRjaEZpbmRlciAqRmluZGVyLCAgICAgICAgICAgICAgICAgXAorICAgICAgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6Qm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyKSBjb25zdAorCisvLy8gXGJyaWVmIENvbnN0cnVjdCBhIHR5cGUtbGlzdCB0byBiZSBwYXNzZWQgdG8gdGhlIEFTVF9QT0xZTU9SUEhJQ19NQVRDSEVSKgorLy8vICAgbWFjcm9zLgorLy8vCisvLy8gWW91IGNhbid0IHBhc3Mgc29tZXRoaW5nIGxpa2UgXGMgVHlwZUxpc3Q8Rm9vLCBCYXI+IHRvIGEgbWFjcm8sIGJlY2F1c2UgaXQKKy8vLyB3aWxsIGxvb2sgYXQgdGhhdCBhcyB0d28gYXJndW1lbnRzLiBIb3dldmVyLCB5b3UgY2FuIHBhc3MKKy8vLyBcYyB2b2lkKFR5cGVMaXN0PEZvbywgQmFyPiksIHdoaWNoIHdvcmtzIHRoYW5rcyB0byB0aGUgcGFyZW50aGVzaXMuCisvLy8gVGhlIFxjIFBvbHltb3JwaGljTWF0Y2hlcldpdGhQYXJhbSogY2xhc3NlcyB3aWxsIHVucGFjayB0aGUgZnVuY3Rpb24gdHlwZSB0bworLy8vIGV4dHJhY3QgdGhlIFR5cGVMaXN0IG9iamVjdC4KKyNkZWZpbmUgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFUyguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQoOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6VHlwZUxpc3Q8X19WQV9BUkdTX18+KQorCisvLy8gXGJyaWVmIEFTVF9QT0xZTU9SUEhJQ19NQVRDSEVSKERlZmluZU1hdGNoZXIpIHsgLi4uIH0KKy8vLyBkZWZpbmVzIGEgc2luZ2xlLXBhcmFtZXRlciBmdW5jdGlvbiBuYW1lZCBEZWZpbmVNYXRjaGVyKCkgdGhhdCBpcworLy8vIHBvbHltb3JwaGljIGluIHRoZSByZXR1cm4gdHlwZS4KKy8vLworLy8vIFRoZSB2YXJpYWJsZXMgYXJlIHRoZSBzYW1lIGFzIGZvciBBU1RfTUFUQ0hFUiwgYnV0IE5vZGVUeXBlIHdpbGwgYmUgZGVkdWNlZAorLy8vIGZyb20gdGhlIGNhbGxpbmcgY29udGV4dC4KKyNkZWZpbmUgQVNUX1BPTFlNT1JQSElDX01BVENIRVIoRGVmaW5lTWF0Y2hlciwgUmV0dXJuVHlwZXNGKSAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSBpbnRlcm5hbCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgbWF0Y2hlcl8jI0RlZmluZU1hdGNoZXIjI01hdGNoZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6IHB1YmxpYyA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpNYXRjaGVySW50ZXJmYWNlPE5vZGVUeXBlPiB7ICAgXAorICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBib29sIG1hdGNoZXMoY29uc3QgTm9kZVR5cGUgJk5vZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIDo6Y2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OkFTVE1hdGNoRmluZGVyICpGaW5kZXIsICAgICAgXAorICAgICAgICAgICAgICAgICA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICpCdWlsZGVyKSBjb25zdCBvdmVycmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIDo6Y2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OlBvbHltb3JwaGljTWF0Y2hlcldpdGhQYXJhbTA8ICAgICAgICBcCisgICAgICBpbnRlcm5hbDo6bWF0Y2hlcl8jI0RlZmluZU1hdGNoZXIjI01hdGNoZXIsIFJldHVyblR5cGVzRj4gICAgICAgICAgICAgICAgXAorICBEZWZpbmVNYXRjaGVyKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6UG9seW1vcnBoaWNNYXRjaGVyV2l0aFBhcmFtMDwgICAgICBcCisgICAgICAgIGludGVybmFsOjptYXRjaGVyXyMjRGVmaW5lTWF0Y2hlciMjTWF0Y2hlciwgUmV0dXJuVHlwZXNGPigpOyAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb2wgaW50ZXJuYWw6Om1hdGNoZXJfIyNEZWZpbmVNYXRjaGVyIyNNYXRjaGVyPE5vZGVUeXBlPjo6bWF0Y2hlcyggICAgICAgICAgXAorICAgICAgY29uc3QgTm9kZVR5cGUgJk5vZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDo6Y2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OkFTVE1hdGNoRmluZGVyICpGaW5kZXIsICAgICAgICAgICAgICAgICBcCisgICAgICA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0CisKKy8vLyBcYnJpZWYgQVNUX1BPTFlNT1JQSElDX01BVENIRVJfUChEZWZpbmVNYXRjaGVyLCBQYXJhbVR5cGUsIFBhcmFtKSB7IC4uLiB9CisvLy8gZGVmaW5lcyBhIHNpbmdsZS1wYXJhbWV0ZXIgZnVuY3Rpb24gbmFtZWQgRGVmaW5lTWF0Y2hlcigpIHRoYXQgaXMKKy8vLyBwb2x5bW9ycGhpYyBpbiB0aGUgcmV0dXJuIHR5cGUuCisvLy8KKy8vLyBUaGUgdmFyaWFibGVzIGFyZSB0aGUgc2FtZSBhcyBmb3IKKy8vLyBBU1RfTUFUQ0hFUl9QLCB3aXRoIHRoZSBhZGRpdGlvbiBvZiBOb2RlVHlwZSwgd2hpY2ggc3BlY2lmaWVzIHRoZSBub2RlIHR5cGUKKy8vLyBvZiB0aGUgbWF0Y2hlciBNYXRjaGVyPE5vZGVUeXBlPiByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24gbWF0Y2hlcigpLgorLy8vCisvLy8gRklYTUU6IFB1bGwgb3V0IGNvbW1vbiBjb2RlIHdpdGggYWJvdmUgbWFjcm8/CisjZGVmaW5lIEFTVF9QT0xZTU9SUEhJQ19NQVRDSEVSX1AoRGVmaW5lTWF0Y2hlciwgUmV0dXJuVHlwZXNGLCBQYXJhbVR5cGUsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQVNUX1BPTFlNT1JQSElDX01BVENIRVJfUF9PVkVSTE9BRChEZWZpbmVNYXRjaGVyLCBSZXR1cm5UeXBlc0YsIFBhcmFtVHlwZSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW0sIDApCisKKyNkZWZpbmUgQVNUX1BPTFlNT1JQSElDX01BVENIRVJfUF9PVkVSTE9BRChEZWZpbmVNYXRjaGVyLCBSZXR1cm5UeXBlc0YsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1UeXBlLCBQYXJhbSwgT3ZlcmxvYWRJZCkgICAgICAgXAorICBuYW1lc3BhY2UgaW50ZXJuYWwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVUeXBlLCB0eXBlbmFtZSBQYXJhbVQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIG1hdGNoZXJfIyNEZWZpbmVNYXRjaGVyIyNPdmVybG9hZElkIyNNYXRjaGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiBwdWJsaWMgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6TWF0Y2hlckludGVyZmFjZTxOb2RlVHlwZT4geyAgIFwKKyAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXhwbGljaXQgbWF0Y2hlcl8jI0RlZmluZU1hdGNoZXIjI092ZXJsb2FkSWQjI01hdGNoZXIoICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQYXJhbVR5cGUgY29uc3QgJkEjI1BhcmFtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiBQYXJhbShBIyNQYXJhbSkge30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYm9vbCBtYXRjaGVzKGNvbnN0IE5vZGVUeXBlICZOb2RlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpBU1RNYXRjaEZpbmRlciAqRmluZGVyLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6Qm91bmROb2Rlc1RyZWVCdWlsZGVyICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUGFyYW1UeXBlIGNvbnN0IFBhcmFtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpQb2x5bW9ycGhpY01hdGNoZXJXaXRoUGFyYW0xPCAgICAgICAgXAorICAgICAgaW50ZXJuYWw6Om1hdGNoZXJfIyNEZWZpbmVNYXRjaGVyIyNPdmVybG9hZElkIyNNYXRjaGVyLCBQYXJhbVR5cGUsICAgICAgIFwKKyAgICAgIFJldHVyblR5cGVzRj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERlZmluZU1hdGNoZXIoUGFyYW1UeXBlIGNvbnN0ICZQYXJhbSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpQb2x5bW9ycGhpY01hdGNoZXJXaXRoUGFyYW0xPCAgICAgIFwKKyAgICAgICAgaW50ZXJuYWw6Om1hdGNoZXJfIyNEZWZpbmVNYXRjaGVyIyNPdmVybG9hZElkIyNNYXRjaGVyLCBQYXJhbVR5cGUsICAgICBcCisgICAgICAgIFJldHVyblR5cGVzRj4oUGFyYW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpQb2x5bW9ycGhpY01hdGNoZXJXaXRoUGFyYW0xPCAgICAgICBcCisgICAgICBpbnRlcm5hbDo6bWF0Y2hlcl8jI0RlZmluZU1hdGNoZXIjI092ZXJsb2FkSWQjI01hdGNoZXIsIFBhcmFtVHlwZSwgICAgICAgXAorICAgICAgUmV0dXJuVHlwZXNGPigmRGVmaW5lTWF0Y2hlciMjX1R5cGUjI092ZXJsb2FkSWQpKCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFBhcmFtVHlwZSBjb25zdCAmUGFyYW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVHlwZSwgdHlwZW5hbWUgUGFyYW1UPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29sIGludGVybmFsOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1hdGNoZXJfIyNEZWZpbmVNYXRjaGVyIyNPdmVybG9hZElkIyNNYXRjaGVyPE5vZGVUeXBlLCBQYXJhbVQ+OjptYXRjaGVzKCBcCisgICAgICAgICAgY29uc3QgTm9kZVR5cGUgJk5vZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIDo6Y2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OkFTVE1hdGNoRmluZGVyICpGaW5kZXIsICAgICAgICAgICAgIFwKKyAgICAgICAgICA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpICAgICBcCisgICAgICAgICAgY29uc3QKKworLy8vIFxicmllZiBBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUl9QMigKKy8vLyAgICAgRGVmaW5lTWF0Y2hlciwgUGFyYW1UeXBlMSwgUGFyYW0xLCBQYXJhbVR5cGUyLCBQYXJhbTIpIHsgLi4uIH0KKy8vLyBkZWZpbmVzIGEgdHdvLXBhcmFtZXRlciBmdW5jdGlvbiBuYW1lZCBtYXRjaGVyKCkgdGhhdCBpcyBwb2x5bW9ycGhpYyBpbgorLy8vIHRoZSByZXR1cm4gdHlwZS4KKy8vLworLy8vIFRoZSB2YXJpYWJsZXMgYXJlIHRoZSBzYW1lIGFzIGZvciBBU1RfTUFUQ0hFUl9QMiwgd2l0aCB0aGUKKy8vLyBhZGRpdGlvbiBvZiBOb2RlVHlwZSwgd2hpY2ggc3BlY2lmaWVzIHRoZSBub2RlIHR5cGUgb2YgdGhlIG1hdGNoZXIKKy8vLyBNYXRjaGVyPE5vZGVUeXBlPiByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24gRGVmaW5lTWF0Y2hlcigpLgorI2RlZmluZSBBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUl9QMihEZWZpbmVNYXRjaGVyLCBSZXR1cm5UeXBlc0YsIFBhcmFtVHlwZTEsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW0xLCBQYXJhbVR5cGUyLCBQYXJhbTIpICAgICAgICAgICAgICAgICBcCisgIEFTVF9QT0xZTU9SUEhJQ19NQVRDSEVSX1AyX09WRVJMT0FEKERlZmluZU1hdGNoZXIsIFJldHVyblR5cGVzRiwgUGFyYW1UeXBlMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbTEsIFBhcmFtVHlwZTIsIFBhcmFtMiwgMCkKKworI2RlZmluZSBBU1RfUE9MWU1PUlBISUNfTUFUQ0hFUl9QMl9PVkVSTE9BRChEZWZpbmVNYXRjaGVyLCBSZXR1cm5UeXBlc0YsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1UeXBlMSwgUGFyYW0xLCBQYXJhbVR5cGUyLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtMiwgT3ZlcmxvYWRJZCkgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgaW50ZXJuYWwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVUeXBlLCB0eXBlbmFtZSBQYXJhbVQxLCB0eXBlbmFtZSBQYXJhbVQyPiAgICAgICAgICAgICBcCisgIGNsYXNzIG1hdGNoZXJfIyNEZWZpbmVNYXRjaGVyIyNPdmVybG9hZElkIyNNYXRjaGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiBwdWJsaWMgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6TWF0Y2hlckludGVyZmFjZTxOb2RlVHlwZT4geyAgIFwKKyAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWF0Y2hlcl8jI0RlZmluZU1hdGNoZXIjI092ZXJsb2FkSWQjI01hdGNoZXIoUGFyYW1UeXBlMSBjb25zdCAmQSMjUGFyYW0xLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtVHlwZTIgY29uc3QgJkEjI1BhcmFtMikgIFwKKyAgICAgICAgOiBQYXJhbTEoQSMjUGFyYW0xKSwgUGFyYW0yKEEjI1BhcmFtMikge30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYm9vbCBtYXRjaGVzKGNvbnN0IE5vZGVUeXBlICZOb2RlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpBU1RNYXRjaEZpbmRlciAqRmluZGVyLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6Qm91bmROb2Rlc1RyZWVCdWlsZGVyICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUGFyYW1UeXBlMSBjb25zdCBQYXJhbTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBhcmFtVHlwZTIgY29uc3QgUGFyYW0yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6UG9seW1vcnBoaWNNYXRjaGVyV2l0aFBhcmFtMjwgICAgICAgIFwKKyAgICAgIGludGVybmFsOjptYXRjaGVyXyMjRGVmaW5lTWF0Y2hlciMjT3ZlcmxvYWRJZCMjTWF0Y2hlciwgUGFyYW1UeXBlMSwgICAgICBcCisgICAgICBQYXJhbVR5cGUyLCBSZXR1cm5UeXBlc0Y+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBEZWZpbmVNYXRjaGVyKFBhcmFtVHlwZTEgY29uc3QgJlBhcmFtMSwgUGFyYW1UeXBlMiBjb25zdCAmUGFyYW0yKSB7ICAgICAgICAgIFwKKyAgICByZXR1cm4gOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6UG9seW1vcnBoaWNNYXRjaGVyV2l0aFBhcmFtMjwgICAgICBcCisgICAgICAgIGludGVybmFsOjptYXRjaGVyXyMjRGVmaW5lTWF0Y2hlciMjT3ZlcmxvYWRJZCMjTWF0Y2hlciwgUGFyYW1UeXBlMSwgICAgXAorICAgICAgICBQYXJhbVR5cGUyLCBSZXR1cm5UeXBlc0Y+KFBhcmFtMSwgUGFyYW0yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGVkZWYgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6UG9seW1vcnBoaWNNYXRjaGVyV2l0aFBhcmFtMjwgICAgICAgXAorICAgICAgaW50ZXJuYWw6Om1hdGNoZXJfIyNEZWZpbmVNYXRjaGVyIyNPdmVybG9hZElkIyNNYXRjaGVyLCBQYXJhbVR5cGUxLCAgICAgIFwKKyAgICAgIFBhcmFtVHlwZTIsIFJldHVyblR5cGVzRj4oJkRlZmluZU1hdGNoZXIjI19UeXBlIyNPdmVybG9hZElkKSggICAgICAgICAgICBcCisgICAgICBQYXJhbVR5cGUxIGNvbnN0ICZQYXJhbTEsIFBhcmFtVHlwZTIgY29uc3QgJlBhcmFtMik7ICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVR5cGUsIHR5cGVuYW1lIFBhcmFtVDEsIHR5cGVuYW1lIFBhcmFtVDI+ICAgICAgICAgICAgIFwKKyAgYm9vbCBpbnRlcm5hbDo6bWF0Y2hlcl8jI0RlZmluZU1hdGNoZXIjI092ZXJsb2FkSWQjI01hdGNoZXI8ICAgICAgICAgICAgICAgICBcCisgICAgICBOb2RlVHlwZSwgUGFyYW1UMSwgUGFyYW1UMj46OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWF0Y2hlcyhjb25zdCBOb2RlVHlwZSAmTm9kZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6QVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwgICAgICAgICBcCisgICAgICAgICAgICAgIDo6Y2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OkJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgXAorICAgICAgICAgIGNvbnN0CisKKy8vIEZJWE1FOiBhZGQgYSBtYXRjaGVyIGZvciBUeXBlTG9jIGRlcml2ZWQgY2xhc3NlcyB1c2luZyBpdHMgY3VzdG9tIGNhc3RpbmcKKy8vIEFQSSAobm8gbG9uZ2VyIGR5bl9jYXN0KSBpZi93aGVuIHdlIG5lZWQgc3VjaCBtYXRjaGluZworCisjZGVmaW5lIEFTVF9UWVBFX1RSQVZFUlNFX01BVENIRVJfREVDTChNYXRjaGVyTmFtZSwgRnVuY3Rpb25OYW1lLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZXNGKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIGludGVybmFsIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgVHlwZU1hdGNoZXIjI01hdGNoZXJOYW1lIyNHZXR0ZXIgeyAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBRdWFsVHlwZSAoVDo6KnZhbHVlKCkpKCkgY29uc3QgeyByZXR1cm4gJlQ6OkZ1bmN0aW9uTmFtZTsgfSAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBleHRlcm4gY29uc3QgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFR5cGVUcmF2ZXJzZVBvbHltb3JwaGljTWF0Y2hlcjwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgUXVhbFR5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIDo6Y2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OlR5cGVNYXRjaGVyIyNNYXRjaGVyTmFtZSMjR2V0dGVyLCAgIFwKKyAgICAgICAgICA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpUeXBlVHJhdmVyc2VNYXRjaGVyLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgUmV0dXJuVHlwZXNGPjo6RnVuYyBNYXRjaGVyTmFtZQorCisjZGVmaW5lIEFTVF9UWVBFX1RSQVZFUlNFX01BVENIRVJfREVGKE1hdGNoZXJOYW1lLCBSZXR1cm5UeXBlc0YpICAgICAgICAgICAgICAgXAorICBjb25zdCA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpUeXBlVHJhdmVyc2VQb2x5bW9ycGhpY01hdGNoZXI8ICAgICAgIFwKKyAgICAgIFF1YWxUeXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpUeXBlTWF0Y2hlciMjTWF0Y2hlck5hbWUjI0dldHRlciwgICAgICAgXAorICAgICAgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6VHlwZVRyYXZlcnNlTWF0Y2hlciwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFJldHVyblR5cGVzRj46OkZ1bmMgTWF0Y2hlck5hbWUKKworLy8vIFxicmllZiBBU1RfVFlQRV9UUkFWRVJTRV9NQVRDSEVSKE1hdGNoZXJOYW1lLCBGdW5jdGlvbk5hbWUpIGRlZmluZXMKKy8vLyB0aGUgbWF0Y2hlciBcYyBNYXRjaGVyTmFtZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYXZlcnNlIGZyb20gb25lIFxjIFR5cGUKKy8vLyB0byBhbm90aGVyLgorLy8vCisvLy8gRm9yIGEgc3BlY2lmaWMgXGMgU3BlY2lmaWNUeXBlLCB0aGUgdHJhdmVyc2FsIGlzIGRvbmUgdXNpbmcKKy8vLyBcYyBTcGVjaWZpY1R5cGU6OkZ1bmN0aW9uTmFtZS4gVGhlIGV4aXN0ZW5jZSBvZiBzdWNoIGEgZnVuY3Rpb24gZGV0ZXJtaW5lcworLy8vIHdoZXRoZXIgYSBjb3JyZXNwb25kaW5nIG1hdGNoZXIgY2FuIGJlIHVzZWQgb24gXGMgU3BlY2lmaWNUeXBlLgorI2RlZmluZSBBU1RfVFlQRV9UUkFWRVJTRV9NQVRDSEVSKE1hdGNoZXJOYW1lLCBGdW5jdGlvbk5hbWUsIFJldHVyblR5cGVzRikgICAgIFwKKyAgbmFtZXNwYWNlIGludGVybmFsIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgVHlwZU1hdGNoZXIjI01hdGNoZXJOYW1lIyNHZXR0ZXIgeyAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBRdWFsVHlwZSAoVDo6KnZhbHVlKCkpKCkgY29uc3QgeyByZXR1cm4gJlQ6OkZ1bmN0aW9uTmFtZTsgfSAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpUeXBlVHJhdmVyc2VQb2x5bW9ycGhpY01hdGNoZXI8ICAgICAgIFwKKyAgICAgIFF1YWxUeXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpUeXBlTWF0Y2hlciMjTWF0Y2hlck5hbWUjI0dldHRlciwgICAgICAgXAorICAgICAgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6VHlwZVRyYXZlcnNlTWF0Y2hlciwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFJldHVyblR5cGVzRj46OkZ1bmMgTWF0Y2hlck5hbWUKKworI2RlZmluZSBBU1RfVFlQRUxPQ19UUkFWRVJTRV9NQVRDSEVSX0RFQ0woTWF0Y2hlck5hbWUsIEZ1bmN0aW9uTmFtZSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGVzRikgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSBpbnRlcm5hbCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFR5cGVMb2NNYXRjaGVyIyNNYXRjaGVyTmFtZSMjR2V0dGVyIHsgICAgICAgICAgIFwKKyAgICBzdGF0aWMgVHlwZUxvYyAoVDo6KnZhbHVlKCkpKCkgY29uc3QgeyByZXR1cm4gJlQ6OkZ1bmN0aW9uTmFtZSMjTG9jOyB9ICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZXh0ZXJuIGNvbnN0IDo6Y2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUeXBlVHJhdmVyc2VQb2x5bW9ycGhpY01hdGNoZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFR5cGVMb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIFR5cGVMb2NNYXRjaGVyIyNNYXRjaGVyTmFtZSMjR2V0dGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIDo6Y2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OlR5cGVMb2NUcmF2ZXJzZU1hdGNoZXIsICAgICAgICAgICAgIFwKKyAgICAgICAgICBSZXR1cm5UeXBlc0Y+OjpGdW5jIE1hdGNoZXJOYW1lIyNMb2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFTVF9UWVBFX1RSQVZFUlNFX01BVENIRVJfREVDTChNYXRjaGVyTmFtZSwgRnVuY3Rpb25OYW1lIyNUeXBlLCBSZXR1cm5UeXBlc0YpCisKKyNkZWZpbmUgQVNUX1RZUEVMT0NfVFJBVkVSU0VfTUFUQ0hFUl9ERUYoTWF0Y2hlck5hbWUsIFJldHVyblR5cGVzRikgICAgICAgICAgICBcCisgIGNvbnN0IDo6Y2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OlR5cGVUcmF2ZXJzZVBvbHltb3JwaGljTWF0Y2hlcjwgICAgICAgXAorICAgICAgVHlwZUxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDo6Y2xhbmc6OmFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OlR5cGVMb2NNYXRjaGVyIyNNYXRjaGVyTmFtZSMjR2V0dGVyLCAgICBcCisgICAgICA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpUeXBlTG9jVHJhdmVyc2VNYXRjaGVyLCAgICAgICAgICAgICAgICAgXAorICAgICAgUmV0dXJuVHlwZXNGPjo6RnVuYyBNYXRjaGVyTmFtZSMjTG9jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQVNUX1RZUEVfVFJBVkVSU0VfTUFUQ0hFUl9ERUYoTWF0Y2hlck5hbWUsIFJldHVyblR5cGVzRikKKworLy8vIFxicmllZiBBU1RfVFlQRUxPQ19UUkFWRVJTRV9NQVRDSEVSKE1hdGNoZXJOYW1lLCBGdW5jdGlvbk5hbWUpIHdvcmtzCisvLy8gaWRlbnRpY2FsIHRvIFxjIEFTVF9UWVBFX1RSQVZFUlNFX01BVENIRVIgYnV0IG9wZXJhdGVzIG9uIFxjIFR5cGVMb2NzLgorI2RlZmluZSBBU1RfVFlQRUxPQ19UUkFWRVJTRV9NQVRDSEVSKE1hdGNoZXJOYW1lLCBGdW5jdGlvbk5hbWUsIFJldHVyblR5cGVzRikgIFwKKyAgbmFtZXNwYWNlIGludGVybmFsIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgVHlwZUxvY01hdGNoZXIjI01hdGNoZXJOYW1lIyNHZXR0ZXIgeyAgICAgICAgICAgXAorICAgIHN0YXRpYyBUeXBlTG9jIChUOjoqdmFsdWUoKSkoKSBjb25zdCB7IHJldHVybiAmVDo6RnVuY3Rpb25OYW1lIyNMb2M7IH0gICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpUeXBlVHJhdmVyc2VQb2x5bW9ycGhpY01hdGNoZXI8ICAgICAgIFwKKyAgICAgIFR5cGVMb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6OmNsYW5nOjphc3RfbWF0Y2hlcnM6OmludGVybmFsOjpUeXBlTG9jTWF0Y2hlciMjTWF0Y2hlck5hbWUjI0dldHRlciwgICAgXAorICAgICAgOjpjbGFuZzo6YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6VHlwZUxvY1RyYXZlcnNlTWF0Y2hlciwgICAgICAgICAgICAgICAgIFwKKyAgICAgIFJldHVyblR5cGVzRj46OkZ1bmMgTWF0Y2hlck5hbWUjI0xvYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFTVF9UWVBFX1RSQVZFUlNFX01BVENIRVIoTWF0Y2hlck5hbWUsIEZ1bmN0aW9uTmFtZSMjVHlwZSwgUmV0dXJuVHlwZXNGKQorCisjZW5kaWYgLy8gTExWTV9DTEFOR19BU1RNQVRDSEVSU19BU1RNQVRDSEVSU01BQ1JPU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL0RpYWdub3N0aWNzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL0RpYWdub3N0aWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4ZmEwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVE1hdGNoZXJzL0R5bmFtaWMvRGlhZ25vc3RpY3MuaApAQCAtMCwwICsxLDE4NSBAQAorLy89PT0tLS0gRGlhZ25vc3RpY3MuaCAtIEhlbHBlciBjbGFzcyBmb3IgZXJyb3IgZGlhZ25vc3RpY3MgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERpYWdub3N0aWNzIGNsYXNzIHRvIG1hbmFnZSBlcnJvciBtZXNzYWdlcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVE1BVENIRVJTX0RZTkFNSUNfRElBR05PU1RJQ1NfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVE1BVENIRVJTX0RZTkFNSUNfRElBR05PU1RJQ1NfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUTWF0Y2hlcnMvRHluYW1pYy9WYXJpYW50VmFsdWUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgYXN0X21hdGNoZXJzIHsKK25hbWVzcGFjZSBkeW5hbWljIHsKKworc3RydWN0IFNvdXJjZUxvY2F0aW9uIHsKKyAgU291cmNlTG9jYXRpb24oKSA6IExpbmUoKSwgQ29sdW1uKCkge30KKyAgdW5zaWduZWQgTGluZTsKKyAgdW5zaWduZWQgQ29sdW1uOworfTsKKworc3RydWN0IFNvdXJjZVJhbmdlIHsKKyAgU291cmNlTG9jYXRpb24gU3RhcnQ7CisgIFNvdXJjZUxvY2F0aW9uIEVuZDsKK307CisKKy8vLyBcYnJpZWYgQSBWYXJpYW50VmFsdWUgaW5zdGFuY2UgYW5ub3RhdGVkIHdpdGggaXRzIHBhcnNlciBjb250ZXh0Lgorc3RydWN0IFBhcnNlclZhbHVlIHsKKyAgUGFyc2VyVmFsdWUoKSA6IFRleHQoKSwgUmFuZ2UoKSwgVmFsdWUoKSB7fQorICBTdHJpbmdSZWYgVGV4dDsKKyAgU291cmNlUmFuZ2UgUmFuZ2U7CisgIFZhcmlhbnRWYWx1ZSBWYWx1ZTsKK307CisKKy8vLyBcYnJpZWYgSGVscGVyIGNsYXNzIHRvIG1hbmFnZSBlcnJvciBtZXNzYWdlcy4KK2NsYXNzIERpYWdub3N0aWNzIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBQYXJzZXIgY29udGV4dCB0eXBlcy4KKyAgZW51bSBDb250ZXh0VHlwZSB7CisgICAgQ1RfTWF0Y2hlckFyZyA9IDAsCisgICAgQ1RfTWF0Y2hlckNvbnN0cnVjdCA9IDEKKyAgfTsKKworICAvLy8gXGJyaWVmIEFsbCBlcnJvcnMgZnJvbSB0aGUgc3lzdGVtLgorICBlbnVtIEVycm9yVHlwZSB7CisgICAgRVRfTm9uZSA9IDAsCisKKyAgICBFVF9SZWdpc3RyeU1hdGNoZXJOb3RGb3VuZCA9IDEsCisgICAgRVRfUmVnaXN0cnlXcm9uZ0FyZ0NvdW50ID0gMiwKKyAgICBFVF9SZWdpc3RyeVdyb25nQXJnVHlwZSA9IDMsCisgICAgRVRfUmVnaXN0cnlOb3RCaW5kYWJsZSA9IDQsCisgICAgRVRfUmVnaXN0cnlBbWJpZ3VvdXNPdmVybG9hZCA9IDUsCisgICAgRVRfUmVnaXN0cnlWYWx1ZU5vdEZvdW5kID0gNiwKKworICAgIEVUX1BhcnNlclN0cmluZ0Vycm9yID0gMTAwLAorICAgIEVUX1BhcnNlck5vT3BlblBhcmVuID0gMTAxLAorICAgIEVUX1BhcnNlck5vQ2xvc2VQYXJlbiA9IDEwMiwKKyAgICBFVF9QYXJzZXJOb0NvbW1hID0gMTAzLAorICAgIEVUX1BhcnNlck5vQ29kZSA9IDEwNCwKKyAgICBFVF9QYXJzZXJOb3RBTWF0Y2hlciA9IDEwNSwKKyAgICBFVF9QYXJzZXJJbnZhbGlkVG9rZW4gPSAxMDYsCisgICAgRVRfUGFyc2VyTWFsZm9ybWVkQmluZEV4cHIgPSAxMDcsCisgICAgRVRfUGFyc2VyVHJhaWxpbmdDb2RlID0gMTA4LAorICAgIEVUX1BhcnNlck51bWJlckVycm9yID0gMTA5LAorICAgIEVUX1BhcnNlck92ZXJsb2FkZWRUeXBlID0gMTEwCisgIH07CisKKyAgLy8vIFxicmllZiBIZWxwZXIgc3RyZWFtIGNsYXNzLgorICBjbGFzcyBBcmdTdHJlYW0geworICBwdWJsaWM6CisgICAgQXJnU3RyZWFtKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAqT3V0KSA6IE91dChPdXQpIHt9CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IEFyZ1N0cmVhbSAmb3BlcmF0b3I8PChjb25zdCBUICZBcmcpIHsKKyAgICAgIHJldHVybiBvcGVyYXRvcjw8KFR3aW5lKEFyZykpOworICAgIH0KKyAgICBBcmdTdHJlYW0gJm9wZXJhdG9yPDwoY29uc3QgVHdpbmUgJkFyZyk7CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gKk91dDsKKyAgfTsKKworICAvLy8gXGJyaWVmIENsYXNzIGRlZmluaW5nIGEgcGFyc2VyIGNvbnRleHQuCisgIC8vLworICAvLy8gVXNlZCBieSB0aGUgcGFyc2VyIHRvIHNwZWNpZnkgKHBvc3NpYmx5IHJlY3Vyc2l2ZSkgY29udGV4dHMgd2hlcmUgdGhlCisgIC8vLyBwYXJzaW5nL2NvbnN0cnVjdGlvbiBjYW4gZmFpbC4gQW55IGVycm9yIHRyaWdnZXJlZCB3aXRoaW4gYSBjb250ZXh0IHdpbGwKKyAgLy8vIGtlZXAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRleHQgY2hhaW4uCisgIC8vLyBUaGlzIGNsYXNzIHNob3VsZCBiZSB1c2VkIGFzIGEgUkFJSSBpbnN0YW5jZSBpbiB0aGUgc3RhY2suCisgIHN0cnVjdCBDb250ZXh0IHsKKyAgcHVibGljOgorICAgIC8vLyBcYnJpZWYgQWJvdXQgdG8gY2FsbCB0aGUgY29uc3RydWN0b3IgZm9yIGEgbWF0Y2hlci4KKyAgICBlbnVtIENvbnN0cnVjdE1hdGNoZXJFbnVtIHsgQ29uc3RydWN0TWF0Y2hlciB9OworICAgIENvbnRleHQoQ29uc3RydWN0TWF0Y2hlckVudW0sIERpYWdub3N0aWNzICpFcnJvciwgU3RyaW5nUmVmIE1hdGNoZXJOYW1lLAorICAgICAgICAgICAgU291cmNlUmFuZ2UgTWF0Y2hlclJhbmdlKTsKKyAgICAvLy8gXGJyaWVmIEFib3V0IHRvIHJlY3Vyc2UgaW50byBwYXJzaW5nIG9uZSBhcmd1bWVudCBmb3IgYSBtYXRjaGVyLgorICAgIGVudW0gTWF0Y2hlckFyZ0VudW0geyBNYXRjaGVyQXJnIH07CisgICAgQ29udGV4dChNYXRjaGVyQXJnRW51bSwgRGlhZ25vc3RpY3MgKkVycm9yLCBTdHJpbmdSZWYgTWF0Y2hlck5hbWUsCisgICAgICAgICAgICBTb3VyY2VSYW5nZSBNYXRjaGVyUmFuZ2UsIHVuc2lnbmVkIEFyZ051bWJlcik7CisgICAgfkNvbnRleHQoKTsKKworICBwcml2YXRlOgorICAgIERpYWdub3N0aWNzICpjb25zdCBFcnJvcjsKKyAgfTsKKworICAvLy8gXGJyaWVmIENvbnRleHQgZm9yIG92ZXJsb2FkZWQgbWF0Y2hlciBjb25zdHJ1Y3Rpb24uCisgIC8vLworICAvLy8gVGhpcyBjb250ZXh0IHdpbGwgdGFrZSBjYXJlIG9mIG1lcmdpbmcgYWxsIGVycm9ycyB0aGF0IGhhcHBlbiB3aXRoaW4gaXQKKyAgLy8vIGFzICJjYW5kaWRhdGUiIG92ZXJsb2FkcyBmb3IgdGhlIHNhbWUgbWF0Y2hlci4KKyAgc3RydWN0IE92ZXJsb2FkQ29udGV4dCB7CisgIHB1YmxpYzoKKyAgIE92ZXJsb2FkQ29udGV4dChEaWFnbm9zdGljcyogRXJyb3IpOworICAgfk92ZXJsb2FkQ29udGV4dCgpOworCisgICAvLy8gXGJyaWVmIFJldmVydCBhbGwgZXJyb3JzIHRoYXQgaGFwcGVuZWQgd2l0aGluIHRoaXMgY29udGV4dC4KKyAgIHZvaWQgcmV2ZXJ0RXJyb3JzKCk7CisKKyAgcHJpdmF0ZToKKyAgICBEaWFnbm9zdGljcyAqY29uc3QgRXJyb3I7CisgICAgdW5zaWduZWQgQmVnaW5JbmRleDsKKyAgfTsKKworICAvLy8gXGJyaWVmIEFkZCBhbiBlcnJvciB0byB0aGUgZGlhZ25vc3RpY3MuCisgIC8vLworICAvLy8gQWxsIHRoZSBjb250ZXh0IGluZm9ybWF0aW9uIHdpbGwgYmUga2VwdCBvbiB0aGUgZXJyb3IgbWVzc2FnZS4KKyAgLy8vIFxyZXR1cm4gYSBoZWxwZXIgY2xhc3MgdG8gYWxsb3cgdGhlIGNhbGxlciB0byBwYXNzIHRoZSBhcmd1bWVudHMgZm9yIHRoZQorICAvLy8gZXJyb3IgbWVzc2FnZSwgdXNpbmcgdGhlIDw8IG9wZXJhdG9yLgorICBBcmdTdHJlYW0gYWRkRXJyb3IoU291cmNlUmFuZ2UgUmFuZ2UsIEVycm9yVHlwZSBFcnJvcik7CisKKyAgLy8vIFxicmllZiBJbmZvcm1hdGlvbiBzdG9yZWQgZm9yIG9uZSBmcmFtZSBvZiB0aGUgY29udGV4dC4KKyAgc3RydWN0IENvbnRleHRGcmFtZSB7CisgICAgQ29udGV4dFR5cGUgVHlwZTsKKyAgICBTb3VyY2VSYW5nZSBSYW5nZTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQXJnczsKKyAgfTsKKworICAvLy8gXGJyaWVmIEluZm9ybWF0aW9uIHN0b3JlZCBmb3IgZWFjaCBlcnJvciBmb3VuZC4KKyAgc3RydWN0IEVycm9yQ29udGVudCB7CisgICAgc3RkOjp2ZWN0b3I8Q29udGV4dEZyYW1lPiBDb250ZXh0U3RhY2s7CisgICAgc3RydWN0IE1lc3NhZ2UgeworICAgICAgU291cmNlUmFuZ2UgUmFuZ2U7CisgICAgICBFcnJvclR5cGUgVHlwZTsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBBcmdzOworICAgIH07CisgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZT4gTWVzc2FnZXM7CisgIH07CisgIEFycmF5UmVmPEVycm9yQ29udGVudD4gZXJyb3JzKCkgY29uc3QgeyByZXR1cm4gRXJyb3JzOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgc2ltcGxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBlYWNoIGVycm9yLgorICAvLy8KKyAgLy8vIEVhY2ggZXJyb3Igb25seSBzaG93cyB0aGUgZXJyb3IgbWVzc2FnZSB3aXRob3V0IGFueSBjb250ZXh0LgorICB2b2lkIHByaW50VG9TdHJlYW0obGx2bTo6cmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGZ1bGwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGVhY2ggZXJyb3IuCisgIC8vLworICAvLy8gRWFjaCBlcnJvciBtZXNzYWdlIGNvbnRhaW5zIHRoZSBmdWxsIGNvbnRleHQuCisgIHZvaWQgcHJpbnRUb1N0cmVhbUZ1bGwobGx2bTo6cmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgdG9TdHJpbmdGdWxsKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGNvbnN0cnVjdG9ycyBvZiBDb250ZXh0RnJhbWUuCisgIEFyZ1N0cmVhbSBwdXNoQ29udGV4dEZyYW1lKENvbnRleHRUeXBlIFR5cGUsIFNvdXJjZVJhbmdlIFJhbmdlKTsKKworICBzdGQ6OnZlY3RvcjxDb250ZXh0RnJhbWU+IENvbnRleHRTdGFjazsKKyAgc3RkOjp2ZWN0b3I8RXJyb3JDb250ZW50PiBFcnJvcnM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZHluYW1pYworfSAgLy8gbmFtZXNwYWNlIGFzdF9tYXRjaGVycworfSAgLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAgLy8gTExWTV9DTEFOR19BU1RfTUFUQ0hFUlNfRFlOQU1JQ19ESUFHTk9TVElDU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL1BhcnNlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUTWF0Y2hlcnMvRHluYW1pYy9QYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGZjZjBhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUTWF0Y2hlcnMvRHluYW1pYy9QYXJzZXIuaApAQCAtMCwwICsxLDI2NCBAQAorLy89PT0tIFBhcnNlci5oIC0gTWF0Y2hlciBleHByZXNzaW9uIHBhcnNlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgU2ltcGxlIG1hdGNoZXIgZXhwcmVzc2lvbiBwYXJzZXIuCisvLy8KKy8vLyBUaGUgcGFyc2VyIHVuZGVyc3RhbmRzIG1hdGNoZXIgZXhwcmVzc2lvbnMgb2YgdGhlIGZvcm06CisvLy8gICBNYXRjaGVyTmFtZShBcmcwLCBBcmcxLCAuLi4sIEFyZ04pCisvLy8gYXMgd2VsbCBhcyBzaW1wbGUgdHlwZXMgbGlrZSBzdHJpbmdzLgorLy8vIFRoZSBwYXJzZXIgZG9lcyBub3Qga25vdyBob3cgdG8gcHJvY2VzcyB0aGUgbWF0Y2hlcnMuIEl0IGRlbGVnYXRlcyB0aGlzIHRhc2sKKy8vLyB0byBhIFNlbWEgb2JqZWN0IHJlY2VpdmVkIGFzIGFuIGFyZ3VtZW50LgorLy8vCisvLy8gXGNvZGUKKy8vLyBHcmFtbWFyIGZvciB0aGUgZXhwcmVzc2lvbnMgc3VwcG9ydGVkOgorLy8vIDxFeHByZXNzaW9uPiAgICAgICAgOj0gPExpdGVyYWw+IHwgPE5hbWVkVmFsdWU+IHwgPE1hdGNoZXJFeHByZXNzaW9uPgorLy8vIDxMaXRlcmFsPiAgICAgICAgICAgOj0gPFN0cmluZ0xpdGVyYWw+IHwgPEJvb2xlYW4+IHwgPERvdWJsZT4gfCA8VW5zaWduZWQ+CisvLy8gPFN0cmluZ0xpdGVyYWw+ICAgICA6PSAicXVvdGVkIHN0cmluZyIKKy8vLyA8Qm9vbGVhbj4gICAgICAgICAgIDo9IHRydWUgfCBmYWxzZQorLy8vIDxEb3VibGU+ICAgICAgICAgICAgOj0gWzAtOV0rLlswLTldKiB8IFswLTldKy5bMC05XSpbZUVdWy0rXT9bMC05XSsKKy8vLyA8VW5zaWduZWQ+ICAgICAgICAgIDo9IFswLTldKworLy8vIDxOYW1lZFZhbHVlPiAgICAgICAgOj0gPElkZW50aWZpZXI+CisvLy8gPE1hdGNoZXJFeHByZXNzaW9uPiA6PSA8SWRlbnRpZmllcj4oPEFyZ3VtZW50TGlzdD4pIHwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgIDxJZGVudGlmaWVyPig8QXJndW1lbnRMaXN0PikuYmluZCg8U3RyaW5nTGl0ZXJhbD4pCisvLy8gPElkZW50aWZpZXI+ICAgICAgICA6PSBbYS16QS1aXSsKKy8vLyA8QXJndW1lbnRMaXN0PiAgICAgIDo9IDxFeHByZXNzaW9uPiB8IDxFeHByZXNzaW9uPiw8QXJndW1lbnRMaXN0PgorLy8vIFxlbmRjb2RlCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVE1BVENIRVJTX0RZTkFNSUNfUEFSU0VSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RNQVRDSEVSU19EWU5BTUlDX1BBUlNFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaGVyc0ludGVybmFsLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUTWF0Y2hlcnMvRHluYW1pYy9SZWdpc3RyeS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVE1hdGNoZXJzL0R5bmFtaWMvVmFyaWFudFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGFzdF9tYXRjaGVycyB7CituYW1lc3BhY2UgZHluYW1pYyB7CisKK2NsYXNzIERpYWdub3N0aWNzOworCisvLy8gXGJyaWVmIE1hdGNoZXIgZXhwcmVzc2lvbiBwYXJzZXIuCitjbGFzcyBQYXJzZXIgeworcHVibGljOgorICAvLy8gXGJyaWVmIEludGVyZmFjZSB0byBjb25uZWN0IHRoZSBwYXJzZXIgd2l0aCB0aGUgcmVnaXN0cnkgYW5kIG1vcmUuCisgIC8vLworICAvLy8gVGhlIHBhcnNlciB1c2VzIHRoZSBTZW1hIGluc3RhbmNlIHBhc3NlZCBpbnRvCisgIC8vLyBwYXJzZU1hdGNoZXJFeHByZXNzaW9uKCkgdG8gaGFuZGxlIGFsbCBtYXRjaGVyIHRva2Vucy4gVGhlIHNpbXBsZXN0CisgIC8vLyBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb24gd291bGQgc2ltcGx5IGNhbGwgaW50byB0aGUgcmVnaXN0cnkgdG8gY3JlYXRlCisgIC8vLyB0aGUgbWF0Y2hlcnMuCisgIC8vLyBIb3dldmVyLCBhIG1vcmUgY29tcGxleCBwcm9jZXNzb3IgbWlnaHQgZGVjaWRlIHRvIGludGVyY2VwdCB0aGUgbWF0Y2hlcgorICAvLy8gY3JlYXRpb24gYW5kIGRvIHNvbWUgZXh0cmEgd29yay4gRm9yIGV4YW1wbGUsIGl0IGNvdWxkIGFwcGx5IHNvbWUKKyAgLy8vIHRyYW5zZm9ybWF0aW9uIHRvIHRoZSBtYXRjaGVyIGJ5IGFkZGluZyBzb21lIGlkKCkgbm9kZXMsIG9yIGNvdWxkIGRldGVjdAorICAvLy8gc3BlY2lmaWMgbWF0Y2hlciBub2RlcyBmb3IgbW9yZSBlZmZpY2llbnQgbG9va3VwLgorICBjbGFzcyBTZW1hIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgflNlbWEoKTsKKworICAgIC8vLyBcYnJpZWYgUHJvY2VzcyBhIG1hdGNoZXIgZXhwcmVzc2lvbi4KKyAgICAvLy8KKyAgICAvLy8gQWxsIHRoZSBhcmd1bWVudHMgcGFzc2VkIGhlcmUgaGF2ZSBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gQ3RvciBBIG1hdGNoZXIgY29uc3RydWN0b3IgbG9va2VkIHVwIGJ5IGxvb2t1cE1hdGNoZXJDdG9yLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gTmFtZVJhbmdlIFRoZSBsb2NhdGlvbiBvZiB0aGUgbmFtZSBpbiB0aGUgbWF0Y2hlciBzb3VyY2UuCisgICAgLy8vICAgVXNlZnVsIGZvciBlcnJvciByZXBvcnRpbmcuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBCaW5kSUQgVGhlIElEIHRvIHVzZSB0byBiaW5kIHRoZSBtYXRjaGVyLCBvciBhIG51bGwgXGMgU3RyaW5nUmVmCisgICAgLy8vICAgaWYgbm8gSUQgaXMgc3BlY2lmaWVkLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gQXJncyBUaGUgYXJndW1lbnQgbGlzdCBmb3IgdGhlIG1hdGNoZXIuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm4gVGhlIG1hdGNoZXIgb2JqZWN0cyBjb25zdHJ1Y3RlZCBieSB0aGUgcHJvY2Vzc29yLCBvciBhIG51bGwKKyAgICAvLy8gICBtYXRjaGVyIGlmIGFuIGVycm9yIG9jY3VycmVkLiBJbiB0aGF0IGNhc2UsIFxjIEVycm9yIHdpbGwgY29udGFpbiBhCisgICAgLy8vICAgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLgorICAgIHZpcnR1YWwgVmFyaWFudE1hdGNoZXIgYWN0T25NYXRjaGVyRXhwcmVzc2lvbihNYXRjaGVyQ3RvciBDdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBOYW1lUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBCaW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlclZhbHVlPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljcyAqRXJyb3IpID0gMDsKKworICAgIC8vLyBcYnJpZWYgTG9vayB1cCBhIG1hdGNoZXIgYnkgbmFtZS4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIE1hdGNoZXJOYW1lIFRoZSBtYXRjaGVyIG5hbWUgZm91bmQgYnkgdGhlIHBhcnNlci4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybiBUaGUgbWF0Y2hlciBjb25zdHJ1Y3Rvciwgb3IgT3B0aW9uYWw8TWF0Y2hlckN0b3I+KCkgaWYgbm90CisgICAgLy8vIGZvdW5kLgorICAgIHZpcnR1YWwgbGx2bTo6T3B0aW9uYWw8TWF0Y2hlckN0b3I+CisgICAgbG9va3VwTWF0Y2hlckN0b3IoU3RyaW5nUmVmIE1hdGNoZXJOYW1lKSA9IDA7CisKKyAgICAvLy8gXGJyaWVmIENvbXB1dGUgdGhlIGxpc3Qgb2YgY29tcGxldGlvbiB0eXBlcyBmb3IgXHAgQ29udGV4dC4KKyAgICAvLy8KKyAgICAvLy8gRWFjaCBlbGVtZW50IG9mIFxwIENvbnRleHQgcmVwcmVzZW50cyBhIG1hdGNoZXIgaW52b2NhdGlvbiwgZ29pbmcgZnJvbQorICAgIC8vLyBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0LiBFbGVtZW50cyBhcmUgcGFpcnMgY29uc2lzdGluZyBvZiBhIHJlZmVyZW5jZSB0bworICAgIC8vLyB0aGUgbWF0Y2hlciBjb25zdHJ1Y3RvciBhbmQgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlCisgICAgLy8vIGFyZ3VtZW50IGxpc3Qgb2YgdGhhdCBtYXRjaGVyIChvciBmb3IgdGhlIGxhc3QgZWxlbWVudCwgdGhlIGluZGV4IG9mCisgICAgLy8vIHRoZSBjb21wbGV0aW9uIHBvaW50IGluIHRoZSBhcmd1bWVudCBsaXN0KS4gQW4gZW1wdHkgbGlzdCByZXF1ZXN0cworICAgIC8vLyBjb21wbGV0aW9uIGZvciB0aGUgcm9vdCBtYXRjaGVyLgorICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8QXJnS2luZD4gZ2V0QWNjZXB0ZWRDb21wbGV0aW9uVHlwZXMoCisgICAgICAgIGxsdm06OkFycmF5UmVmPHN0ZDo6cGFpcjxNYXRjaGVyQ3RvciwgdW5zaWduZWQ+PiBDb250ZXh0KTsKKworICAgIC8vLyBcYnJpZWYgQ29tcHV0ZSB0aGUgbGlzdCBvZiBjb21wbGV0aW9ucyB0aGF0IG1hdGNoIGFueSBvZgorICAgIC8vLyBccCBBY2NlcHRlZFR5cGVzLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gQWNjZXB0ZWRUeXBlcyBBbGwgdHlwZXMgYWNjZXB0ZWQgZm9yIHRoaXMgY29tcGxldGlvbi4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybiBBbGwgY29tcGxldGlvbnMgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZXMuCisgICAgLy8vIENvbXBsZXRpb25zIHNob3VsZCBiZSB2YWxpZCB3aGVuIHVzZWQgaW4gXGMgbG9va3VwTWF0Y2hlckN0b3IoKS4KKyAgICAvLy8gVGhlIG1hdGNoZXIgY29uc3RydWN0ZWQgZnJvbSB0aGUgcmV0dXJuIG9mIFxjIGxvb2t1cE1hdGNoZXJDdG9yKCkKKyAgICAvLy8gc2hvdWxkIGJlIGNvbnZlcnRpYmxlIHRvIHNvbWUgdHlwZSBpbiBccCBBY2NlcHRlZFR5cGVzLgorICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8TWF0Y2hlckNvbXBsZXRpb24+CisgICAgZ2V0TWF0Y2hlckNvbXBsZXRpb25zKGxsdm06OkFycmF5UmVmPEFyZ0tpbmQ+IEFjY2VwdGVkVHlwZXMpOworICB9OworCisgIC8vLyBcYnJpZWYgU2VtYSBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgdGhlIG1hdGNoZXIgcmVnaXN0cnkgdG8gcHJvY2VzcyB0aGUKKyAgLy8vICAgdG9rZW5zLgorICBjbGFzcyBSZWdpc3RyeVNlbWEgOiBwdWJsaWMgUGFyc2VyOjpTZW1hIHsKKyAgcHVibGljOgorICAgIH5SZWdpc3RyeVNlbWEoKSBvdmVycmlkZTsKKworICAgIGxsdm06Ok9wdGlvbmFsPE1hdGNoZXJDdG9yPgorICAgIGxvb2t1cE1hdGNoZXJDdG9yKFN0cmluZ1JlZiBNYXRjaGVyTmFtZSkgb3ZlcnJpZGU7CisKKyAgICBWYXJpYW50TWF0Y2hlciBhY3RPbk1hdGNoZXJFeHByZXNzaW9uKE1hdGNoZXJDdG9yIEN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBOYW1lUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQmluZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VyVmFsdWU+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljcyAqRXJyb3IpIG92ZXJyaWRlOworCisgICAgc3RkOjp2ZWN0b3I8QXJnS2luZD4gZ2V0QWNjZXB0ZWRDb21wbGV0aW9uVHlwZXMoCisgICAgICAgIGxsdm06OkFycmF5UmVmPHN0ZDo6cGFpcjxNYXRjaGVyQ3RvciwgdW5zaWduZWQ+PiBDb250ZXh0KSBvdmVycmlkZTsKKworICAgIHN0ZDo6dmVjdG9yPE1hdGNoZXJDb21wbGV0aW9uPgorICAgIGdldE1hdGNoZXJDb21wbGV0aW9ucyhsbHZtOjpBcnJheVJlZjxBcmdLaW5kPiBBY2NlcHRlZFR5cGVzKSBvdmVycmlkZTsKKyAgfTsKKworICB1c2luZyBOYW1lZFZhbHVlTWFwID0gbGx2bTo6U3RyaW5nTWFwPFZhcmlhbnRWYWx1ZT47CisKKyAgLy8vIFxicmllZiBQYXJzZSBhIG1hdGNoZXIgZXhwcmVzc2lvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gTWF0Y2hlckNvZGUgVGhlIG1hdGNoZXIgZXhwcmVzc2lvbiB0byBwYXJzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gUyBUaGUgU2VtYSBpbnN0YW5jZSB0aGF0IHdpbGwgaGVscCB0aGUgcGFyc2VyCisgIC8vLyAgIGNvbnN0cnVjdCB0aGUgbWF0Y2hlcnMuIElmIG51bGwsIGl0IHVzZXMgdGhlIGRlZmF1bHQgcmVnaXN0cnkuCisgIC8vLworICAvLy8gXHBhcmFtIE5hbWVkVmFsdWVzIEEgbWFwIG9mIHByZWNvbXB1dGVkIG5hbWVkIHZhbHVlcy4gIFRoaXMgcHJvdmlkZXMKKyAgLy8vICAgdGhlIGRpY3Rpb25hcnkgZm9yIHRoZSA8TmFtZWRWYWx1ZT4gcnVsZSBvZiB0aGUgZ3JhbW1hci4KKyAgLy8vICAgSWYgbnVsbCwgaXQgaXMgaWdub3JlZC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBtYXRjaGVyIG9iamVjdCBjb25zdHJ1Y3RlZCBieSB0aGUgcHJvY2Vzc29yLCBvciBhbiBlbXB0eQorICAvLy8gICBPcHRpb25hbCBpZiBhbiBlcnJvciBvY2N1cnJlZC4gSW4gdGhhdCBjYXNlLCBcYyBFcnJvciB3aWxsIGNvbnRhaW4gYQorICAvLy8gICBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuCisgIC8vLyAgIFRoZSBjYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBEeW5UeXBlZE1hdGNoZXIgb2JqZWN0IHJldHVybmVkLgorICBzdGF0aWMgbGx2bTo6T3B0aW9uYWw8RHluVHlwZWRNYXRjaGVyPgorICBwYXJzZU1hdGNoZXJFeHByZXNzaW9uKFN0cmluZ1JlZiBNYXRjaGVyQ29kZSwgU2VtYSAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOYW1lZFZhbHVlTWFwICpOYW1lZFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljcyAqRXJyb3IpOworICBzdGF0aWMgbGx2bTo6T3B0aW9uYWw8RHluVHlwZWRNYXRjaGVyPgorICBwYXJzZU1hdGNoZXJFeHByZXNzaW9uKFN0cmluZ1JlZiBNYXRjaGVyQ29kZSwgU2VtYSAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljcyAqRXJyb3IpIHsKKyAgICByZXR1cm4gcGFyc2VNYXRjaGVyRXhwcmVzc2lvbihNYXRjaGVyQ29kZSwgUywgbnVsbHB0ciwgRXJyb3IpOworICB9CisgIHN0YXRpYyBsbHZtOjpPcHRpb25hbDxEeW5UeXBlZE1hdGNoZXI+CisgIHBhcnNlTWF0Y2hlckV4cHJlc3Npb24oU3RyaW5nUmVmIE1hdGNoZXJDb2RlLCBEaWFnbm9zdGljcyAqRXJyb3IpIHsKKyAgICByZXR1cm4gcGFyc2VNYXRjaGVyRXhwcmVzc2lvbihNYXRjaGVyQ29kZSwgbnVsbHB0ciwgRXJyb3IpOworICB9CisKKyAgLy8vIFxicmllZiBQYXJzZSBhbiBleHByZXNzaW9uLgorICAvLy8KKyAgLy8vIFBhcnNlcyBhbnkgZXhwcmVzc2lvbiBzdXBwb3J0ZWQgYnkgdGhpcyBwYXJzZXIuIEluIGdlbmVyYWwsIHRoZQorICAvLy8gXGMgcGFyc2VNYXRjaGVyRXhwcmVzc2lvbiBmdW5jdGlvbiBpcyBhIGJldHRlciBhcHByb2FjaCB0byBnZXQgYSBtYXRjaGVyCisgIC8vLyBvYmplY3QuCisgIC8vLworICAvLy8gXHBhcmFtIFMgVGhlIFNlbWEgaW5zdGFuY2UgdGhhdCB3aWxsIGhlbHAgdGhlIHBhcnNlcgorICAvLy8gICBjb25zdHJ1Y3QgdGhlIG1hdGNoZXJzLiBJZiBudWxsLCBpdCB1c2VzIHRoZSBkZWZhdWx0IHJlZ2lzdHJ5LgorICAvLy8KKyAgLy8vIFxwYXJhbSBOYW1lZFZhbHVlcyBBIG1hcCBvZiBwcmVjb21wdXRlZCBuYW1lZCB2YWx1ZXMuICBUaGlzIHByb3ZpZGVzCisgIC8vLyAgIHRoZSBkaWN0aW9uYXJ5IGZvciB0aGUgPE5hbWVkVmFsdWU+IHJ1bGUgb2YgdGhlIGdyYW1tYXIuCisgIC8vLyAgIElmIG51bGwsIGl0IGlzIGlnbm9yZWQuCisgIHN0YXRpYyBib29sIHBhcnNlRXhwcmVzc2lvbihTdHJpbmdSZWYgQ29kZSwgU2VtYSAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWVkVmFsdWVNYXAgKk5hbWVkVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFudFZhbHVlICpWYWx1ZSwgRGlhZ25vc3RpY3MgKkVycm9yKTsKKyAgc3RhdGljIGJvb2wgcGFyc2VFeHByZXNzaW9uKFN0cmluZ1JlZiBDb2RlLCBTZW1hICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFudFZhbHVlICpWYWx1ZSwgRGlhZ25vc3RpY3MgKkVycm9yKSB7CisgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvbihDb2RlLCBTLCBudWxscHRyLCBWYWx1ZSwgRXJyb3IpOworICB9CisgIHN0YXRpYyBib29sIHBhcnNlRXhwcmVzc2lvbihTdHJpbmdSZWYgQ29kZSwgVmFyaWFudFZhbHVlICpWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzICpFcnJvcikgeworICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb24oQ29kZSwgbnVsbHB0ciwgVmFsdWUsIEVycm9yKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29tcGxldGUgYW4gZXhwcmVzc2lvbiBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBTIFRoZSBTZW1hIGluc3RhbmNlIHRoYXQgd2lsbCBoZWxwIHRoZSBwYXJzZXIKKyAgLy8vICAgY29uc3RydWN0IHRoZSBtYXRjaGVycy4gSWYgbnVsbCwgaXQgdXNlcyB0aGUgZGVmYXVsdCByZWdpc3RyeS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTmFtZWRWYWx1ZXMgQSBtYXAgb2YgcHJlY29tcHV0ZWQgbmFtZWQgdmFsdWVzLiAgVGhpcyBwcm92aWRlcworICAvLy8gICB0aGUgZGljdGlvbmFyeSBmb3IgdGhlIDxOYW1lZFZhbHVlPiBydWxlIG9mIHRoZSBncmFtbWFyLgorICAvLy8gICBJZiBudWxsLCBpdCBpcyBpZ25vcmVkLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVGhlIGxpc3Qgb2YgY29tcGxldGlvbnMsIHdoaWNoIG1heSBiZSBlbXB0eSBpZiB0aGVyZSBhcmUgbm8KKyAgLy8vIGF2YWlsYWJsZSBjb21wbGV0aW9ucyBvciBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAgc3RhdGljIHN0ZDo6dmVjdG9yPE1hdGNoZXJDb21wbGV0aW9uPgorICBjb21wbGV0ZUV4cHJlc3Npb24oU3RyaW5nUmVmIENvZGUsIHVuc2lnbmVkIENvbXBsZXRpb25PZmZzZXQsIFNlbWEgKlMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBOYW1lZFZhbHVlTWFwICpOYW1lZFZhbHVlcyk7CisgIHN0YXRpYyBzdGQ6OnZlY3RvcjxNYXRjaGVyQ29tcGxldGlvbj4KKyAgY29tcGxldGVFeHByZXNzaW9uKFN0cmluZ1JlZiBDb2RlLCB1bnNpZ25lZCBDb21wbGV0aW9uT2Zmc2V0LCBTZW1hICpTKSB7CisgICAgcmV0dXJuIGNvbXBsZXRlRXhwcmVzc2lvbihDb2RlLCBDb21wbGV0aW9uT2Zmc2V0LCBTLCBudWxscHRyKTsKKyAgfQorICBzdGF0aWMgc3RkOjp2ZWN0b3I8TWF0Y2hlckNvbXBsZXRpb24+CisgIGNvbXBsZXRlRXhwcmVzc2lvbihTdHJpbmdSZWYgQ29kZSwgdW5zaWduZWQgQ29tcGxldGlvbk9mZnNldCkgeworICAgIHJldHVybiBjb21wbGV0ZUV4cHJlc3Npb24oQ29kZSwgQ29tcGxldGlvbk9mZnNldCwgbnVsbHB0cik7CisgIH0KKworcHJpdmF0ZToKKyAgY2xhc3MgQ29kZVRva2VuaXplcjsKKyAgc3RydWN0IFNjb3BlZENvbnRleHRFbnRyeTsKKyAgc3RydWN0IFRva2VuSW5mbzsKKworICBQYXJzZXIoQ29kZVRva2VuaXplciAqVG9rZW5pemVyLCBTZW1hICpTLAorICAgICAgICAgY29uc3QgTmFtZWRWYWx1ZU1hcCAqTmFtZWRWYWx1ZXMsCisgICAgICAgICBEaWFnbm9zdGljcyAqRXJyb3IpOworCisgIGJvb2wgcGFyc2VFeHByZXNzaW9uSW1wbChWYXJpYW50VmFsdWUgKlZhbHVlKTsKKyAgYm9vbCBwYXJzZU1hdGNoZXJFeHByZXNzaW9uSW1wbChjb25zdCBUb2tlbkluZm8gJk5hbWVUb2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYW50VmFsdWUgKlZhbHVlKTsKKyAgYm9vbCBwYXJzZUlkZW50aWZpZXJQcmVmaXhJbXBsKFZhcmlhbnRWYWx1ZSAqVmFsdWUpOworCisgIHZvaWQgYWRkQ29tcGxldGlvbihjb25zdCBUb2tlbkluZm8gJkNvbXBUb2tlbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hdGNoZXJDb21wbGV0aW9uICZDb21wbGV0aW9uKTsKKyAgdm9pZCBhZGRFeHByZXNzaW9uQ29tcGxldGlvbnMoKTsKKworICBzdGQ6OnZlY3RvcjxNYXRjaGVyQ29tcGxldGlvbj4KKyAgZ2V0TmFtZWRWYWx1ZUNvbXBsZXRpb25zKEFycmF5UmVmPEFyZ0tpbmQ+IEFjY2VwdGVkVHlwZXMpOworCisgIENvZGVUb2tlbml6ZXIgKmNvbnN0IFRva2VuaXplcjsKKyAgU2VtYSAqY29uc3QgUzsKKyAgY29uc3QgTmFtZWRWYWx1ZU1hcCAqY29uc3QgTmFtZWRWYWx1ZXM7CisgIERpYWdub3N0aWNzICpjb25zdCBFcnJvcjsKKworICB1c2luZyBDb250ZXh0U3RhY2tUeSA9IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxNYXRjaGVyQ3RvciwgdW5zaWduZWQ+PjsKKworICBDb250ZXh0U3RhY2tUeSBDb250ZXh0U3RhY2s7CisgIHN0ZDo6dmVjdG9yPE1hdGNoZXJDb21wbGV0aW9uPiBDb21wbGV0aW9uczsKK307CisKK30gLy8gbmFtZXNwYWNlIGR5bmFtaWMKK30gLy8gbmFtZXNwYWNlIGFzdF9tYXRjaGVycworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUX01BVENIRVJTX0RZTkFNSUNfUEFSU0VSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVE1hdGNoZXJzL0R5bmFtaWMvUmVnaXN0cnkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVE1hdGNoZXJzL0R5bmFtaWMvUmVnaXN0cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzc0OTEyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQVNUTWF0Y2hlcnMvRHluYW1pYy9SZWdpc3RyeS5oCkBAIC0wLDAgKzEsMTM2IEBACisvLz09PS0gUmVnaXN0cnkuaCAtIE1hdGNoZXIgcmVnaXN0cnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBSZWdpc3RyeSBvZiBhbGwga25vd24gbWF0Y2hlcnMuCisvLy8KKy8vLyBUaGUgcmVnaXN0cnkgcHJvdmlkZXMgYSBnZW5lcmljIGludGVyZmFjZSB0byBjb25zdHJ1Y3QgYW55IG1hdGNoZXIgYnkgbmFtZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUTUFUQ0hFUlNfRFlOQU1JQ19SRUdJU1RSWV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUTUFUQ0hFUlNfRFlOQU1JQ19SRUdJU1RSWV9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL0RpYWdub3N0aWNzLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUTWF0Y2hlcnMvRHluYW1pYy9WYXJpYW50VmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGFzdF9tYXRjaGVycyB7CituYW1lc3BhY2UgZHluYW1pYyB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2NsYXNzIE1hdGNoZXJEZXNjcmlwdG9yOworCit9IC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit1c2luZyBNYXRjaGVyQ3RvciA9IGNvbnN0IGludGVybmFsOjpNYXRjaGVyRGVzY3JpcHRvciAqOworCitzdHJ1Y3QgTWF0Y2hlckNvbXBsZXRpb24geworICBNYXRjaGVyQ29tcGxldGlvbigpID0gZGVmYXVsdDsKKyAgTWF0Y2hlckNvbXBsZXRpb24oU3RyaW5nUmVmIFR5cGVkVGV4dCwgU3RyaW5nUmVmIE1hdGNoZXJEZWNsLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcGVjaWZpY2l0eSkKKyAgICAgIDogVHlwZWRUZXh0KFR5cGVkVGV4dCksIE1hdGNoZXJEZWNsKE1hdGNoZXJEZWNsKSwKKyAgICAgICAgU3BlY2lmaWNpdHkoU3BlY2lmaWNpdHkpIHt9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hdGNoZXJDb21wbGV0aW9uICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBUeXBlZFRleHQgPT0gT3RoZXIuVHlwZWRUZXh0ICYmIE1hdGNoZXJEZWNsID09IE90aGVyLk1hdGNoZXJEZWNsOworICB9CisKKyAgLy8vIFxicmllZiBUaGUgdGV4dCB0byB0eXBlIHRvIHNlbGVjdCB0aGlzIG1hdGNoZXIuCisgIHN0ZDo6c3RyaW5nIFR5cGVkVGV4dDsKKworICAvLy8gXGJyaWVmIFRoZSAiZGVjbGFyYXRpb24iIG9mIHRoZSBtYXRjaGVyLCB3aXRoIHR5cGUgaW5mb3JtYXRpb24uCisgIHN0ZDo6c3RyaW5nIE1hdGNoZXJEZWNsOworCisgIC8vLyBcYnJpZWYgVmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgInNwZWNpZmljaXR5IiBvZiB0aGUgY29udmVydGVkIG1hdGNoZXIuCisgIC8vLworICAvLy8gWmVybyBzcGVjaWZpY2l0eSBpbmRpY2F0ZXMgdGhhdCB0aGlzIGNvbnZlcnNpb24gd291bGQgcHJvZHVjZSBhIHRyaXZpYWwKKyAgLy8vIG1hdGNoZXIgdGhhdCB3aWxsIGVpdGhlciBhbHdheXMgb3IgbmV2ZXIgbWF0Y2guCisgIC8vLyBTdWNoIG1hdGNoZXJzIGFyZSBleGNsdWRlZCBmcm9tIGNvZGUgY29tcGxldGlvbiByZXN1bHRzLgorICB1bnNpZ25lZCBTcGVjaWZpY2l0eTsKK307CisKK2NsYXNzIFJlZ2lzdHJ5IHsKK3B1YmxpYzoKKyAgUmVnaXN0cnkoKSA9IGRlbGV0ZTsKKworICAvLy8gXGJyaWVmIExvb2sgdXAgYSBtYXRjaGVyIGluIHRoZSByZWdpc3RyeSBieSBuYW1lLAorICAvLy8KKyAgLy8vIFxyZXR1cm4gQW4gb3BhcXVlIHZhbHVlIHdoaWNoIG1heSBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBtYXRjaGVyCisgIC8vLyBjb25zdHJ1Y3Rvciwgb3IgT3B0aW9uYWw8TWF0Y2hlckN0b3I+KCkgaWYgbm90IGZvdW5kLgorICBzdGF0aWMgbGx2bTo6T3B0aW9uYWw8TWF0Y2hlckN0b3I+IGxvb2t1cE1hdGNoZXJDdG9yKFN0cmluZ1JlZiBNYXRjaGVyTmFtZSk7CisKKyAgLy8vIFxicmllZiBDb21wdXRlIHRoZSBsaXN0IG9mIGNvbXBsZXRpb24gdHlwZXMgZm9yIFxwIENvbnRleHQuCisgIC8vLworICAvLy8gRWFjaCBlbGVtZW50IG9mIFxwIENvbnRleHQgcmVwcmVzZW50cyBhIG1hdGNoZXIgaW52b2NhdGlvbiwgZ29pbmcgZnJvbQorICAvLy8gb3V0ZXJtb3N0IHRvIGlubmVybW9zdC4gRWxlbWVudHMgYXJlIHBhaXJzIGNvbnNpc3Rpbmcgb2YgYSByZWZlcmVuY2UgdG8KKyAgLy8vIHRoZSBtYXRjaGVyIGNvbnN0cnVjdG9yIGFuZCB0aGUgaW5kZXggb2YgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUKKyAgLy8vIGFyZ3VtZW50IGxpc3Qgb2YgdGhhdCBtYXRjaGVyIChvciBmb3IgdGhlIGxhc3QgZWxlbWVudCwgdGhlIGluZGV4IG9mCisgIC8vLyB0aGUgY29tcGxldGlvbiBwb2ludCBpbiB0aGUgYXJndW1lbnQgbGlzdCkuIEFuIGVtcHR5IGxpc3QgcmVxdWVzdHMKKyAgLy8vIGNvbXBsZXRpb24gZm9yIHRoZSByb290IG1hdGNoZXIuCisgIHN0YXRpYyBzdGQ6OnZlY3RvcjxBcmdLaW5kPiBnZXRBY2NlcHRlZENvbXBsZXRpb25UeXBlcygKKyAgICAgIGxsdm06OkFycmF5UmVmPHN0ZDo6cGFpcjxNYXRjaGVyQ3RvciwgdW5zaWduZWQ+PiBDb250ZXh0KTsKKworICAvLy8gXGJyaWVmIENvbXB1dGUgdGhlIGxpc3Qgb2YgY29tcGxldGlvbnMgdGhhdCBtYXRjaCBhbnkgb2YKKyAgLy8vIFxwIEFjY2VwdGVkVHlwZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEFjY2VwdGVkVHlwZXMgQWxsIHR5cGVzIGFjY2VwdGVkIGZvciB0aGlzIGNvbXBsZXRpb24uCisgIC8vLworICAvLy8gXHJldHVybiBBbGwgY29tcGxldGlvbnMgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZXMuCisgIC8vLyBDb21wbGV0aW9ucyBzaG91bGQgYmUgdmFsaWQgd2hlbiB1c2VkIGluIFxjIGxvb2t1cE1hdGNoZXJDdG9yKCkuCisgIC8vLyBUaGUgbWF0Y2hlciBjb25zdHJ1Y3RlZCBmcm9tIHRoZSByZXR1cm4gb2YgXGMgbG9va3VwTWF0Y2hlckN0b3IoKQorICAvLy8gc2hvdWxkIGJlIGNvbnZlcnRpYmxlIHRvIHNvbWUgdHlwZSBpbiBccCBBY2NlcHRlZFR5cGVzLgorICBzdGF0aWMgc3RkOjp2ZWN0b3I8TWF0Y2hlckNvbXBsZXRpb24+CisgIGdldE1hdGNoZXJDb21wbGV0aW9ucyhBcnJheVJlZjxBcmdLaW5kPiBBY2NlcHRlZFR5cGVzKTsKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIG1hdGNoZXIgZnJvbSB0aGUgcmVnaXN0cnkuCisgIC8vLworICAvLy8gXHBhcmFtIEN0b3IgVGhlIG1hdGNoZXIgY29uc3RydWN0b3IgdG8gaW5zdGFudGlhdGUuCisgIC8vLworICAvLy8gXHBhcmFtIE5hbWVSYW5nZSBUaGUgbG9jYXRpb24gb2YgdGhlIG5hbWUgaW4gdGhlIG1hdGNoZXIgc291cmNlLgorICAvLy8gICBVc2VmdWwgZm9yIGVycm9yIHJlcG9ydGluZy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQXJncyBUaGUgYXJndW1lbnQgbGlzdCBmb3IgdGhlIG1hdGNoZXIuIFRoZSBudW1iZXIgYW5kIHR5cGVzIG9mIHRoZQorICAvLy8gICB2YWx1ZXMgbXVzdCBiZSB2YWxpZCBmb3IgdGhlIG1hdGNoZXIgcmVxdWVzdGVkLiBPdGhlcndpc2UsIHRoZSBmdW5jdGlvbgorICAvLy8gICB3aWxsIHJldHVybiBhbiBlcnJvci4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBtYXRjaGVyIG9iamVjdCBjb25zdHJ1Y3RlZCBpZiBubyBlcnJvciB3YXMgZm91bmQuCisgIC8vLyAgIEEgbnVsbCBtYXRjaGVyIGlmIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIG9yIGFyZ3VtZW50IHR5cGVzIGRvIG5vdCBtYXRjaAorICAvLy8gICB0aGUgc2lnbmF0dXJlLiAgSW4gdGhhdCBjYXNlIFxjIEVycm9yIHdpbGwgY29udGFpbiB0aGUgZGVzY3JpcHRpb24gb2YKKyAgLy8vICAgdGhlIGVycm9yLgorICBzdGF0aWMgVmFyaWFudE1hdGNoZXIgY29uc3RydWN0TWF0Y2hlcihNYXRjaGVyQ3RvciBDdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBOYW1lUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlclZhbHVlPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljcyAqRXJyb3IpOworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgbWF0Y2hlciBmcm9tIHRoZSByZWdpc3RyeSBhbmQgYmluZCBpdC4KKyAgLy8vCisgIC8vLyBTaW1pbGFyIHRoZSBcYyBjb25zdHJ1Y3RNYXRjaGVyKCkgYWJvdmUsIGJ1dCBpdCB0aGVuIHRyaWVzIHRvIGJpbmQgdGhlCisgIC8vLyBtYXRjaGVyIHRvIHRoZSBzcGVjaWZpZWQgXGMgQmluZElELgorICAvLy8gSWYgdGhlIG1hdGNoZXIgaXMgbm90IGJpbmRhYmxlLCBpdCBzZXRzIGFuIGVycm9yIGluIFxjIEVycm9yIGFuZCByZXR1cm5zCisgIC8vLyBhIG51bGwgbWF0Y2hlci4KKyAgc3RhdGljIFZhcmlhbnRNYXRjaGVyIGNvbnN0cnVjdEJvdW5kTWF0Y2hlcihNYXRjaGVyQ3RvciBDdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIE5hbWVSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQmluZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlclZhbHVlPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzICpFcnJvcik7Cit9OworCit9IC8vIG5hbWVzcGFjZSBkeW5hbWljCit9IC8vIG5hbWVzcGFjZSBhc3RfbWF0Y2hlcnMKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FTVF9NQVRDSEVSU19EWU5BTUlDX1JFR0lTVFJZX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FTVE1hdGNoZXJzL0R5bmFtaWMvVmFyaWFudFZhbHVlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL1ZhcmlhbnRWYWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZWZlMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL1ZhcmlhbnRWYWx1ZS5oCkBAIC0wLDAgKzEsMzQ5IEBACisvLz09PS0tLSBWYXJpYW50VmFsdWUuaCAtIFBvbHltb3JwaGljIHZhbHVlIHR5cGUgLSotIEMrKyAtKi09PT0vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIFBvbHltb3JwaGljIHZhbHVlIHR5cGUuCisvLy8KKy8vLyBTdXBwb3J0cyBhbGwgdGhlIHR5cGVzIHJlcXVpcmVkIGZvciBkeW5hbWljIE1hdGNoZXIgY29uc3RydWN0aW9uLgorLy8vICBVc2VkIGJ5IHRoZSByZWdpc3RyeSB0byBjb25zdHJ1Y3QgbWF0Y2hlcnMgaW4gYSBnZW5lcmljIHdheS4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FTVE1BVENIRVJTX0RZTkFNSUNfVkFSSUFOVFZBTFVFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RNQVRDSEVSU19EWU5BTUlDX1ZBUklBTlRWQUxVRV9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaGVycy5oIgorI2luY2x1ZGUgImNsYW5nL0FTVE1hdGNoZXJzL0FTVE1hdGNoZXJzSW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgYXN0X21hdGNoZXJzIHsKK25hbWVzcGFjZSBkeW5hbWljIHsKKworLy8vIFxicmllZiBLaW5kIGlkZW50aWZpZXIuCisvLy8KKy8vLyBJdCBzdXBwb3J0cyBhbGwgdHlwZXMgdGhhdCBWYXJpYW50VmFsdWUgY2FuIGNvbnRhaW4uCitjbGFzcyBBcmdLaW5kIHsKKyBwdWJsaWM6CisgIGVudW0gS2luZCB7CisgICAgQUtfTWF0Y2hlciwKKyAgICBBS19Cb29sZWFuLAorICAgIEFLX0RvdWJsZSwKKyAgICBBS19VbnNpZ25lZCwKKyAgICBBS19TdHJpbmcKKyAgfTsKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3RvciBmb3Igbm9uLW1hdGNoZXIgdHlwZXMuCisgIEFyZ0tpbmQoS2luZCBLKSA6IEsoSykgeyBhc3NlcnQoSyAhPSBBS19NYXRjaGVyKTsgfQorCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0b3IgZm9yIG1hdGNoZXIgdHlwZXMuCisgIEFyZ0tpbmQoYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZCBNYXRjaGVyS2luZCkKKyAgICAgIDogSyhBS19NYXRjaGVyKSwgTWF0Y2hlcktpbmQoTWF0Y2hlcktpbmQpIHt9CisKKyAgS2luZCBnZXRBcmdLaW5kKCkgY29uc3QgeyByZXR1cm4gSzsgfQorICBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kIGdldE1hdGNoZXJLaW5kKCkgY29uc3QgeworICAgIGFzc2VydChLID09IEFLX01hdGNoZXIpOworICAgIHJldHVybiBNYXRjaGVyS2luZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGlzIHR5cGUgY2FuIGJlIGNvbnZlcnRlZCB0byBccCBUby4KKyAgLy8vCisgIC8vLyBccGFyYW0gVG8gdGhlIHJlcXVlc3RlZCBkZXN0aW5hdGlvbiB0eXBlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTcGVjaWZpY2l0eSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSAic3BlY2lmaWNpdHkiIG9mIHRoZQorICAvLy8gICBjb252ZXJzaW9uLgorICBib29sIGlzQ29udmVydGlibGVUbyhBcmdLaW5kIFRvLCB1bnNpZ25lZCAqU3BlY2lmaWNpdHkpIGNvbnN0OworCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEFyZ0tpbmQgJk90aGVyKSBjb25zdCB7CisgICAgaWYgKEsgPT0gQUtfTWF0Y2hlciAmJiBPdGhlci5LID09IEFLX01hdGNoZXIpCisgICAgICByZXR1cm4gTWF0Y2hlcktpbmQgPCBPdGhlci5NYXRjaGVyS2luZDsKKyAgICByZXR1cm4gSyA8IE90aGVyLks7CisgIH0KKworICAvLy8gXGJyaWVmIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZS4KKyAgc3RkOjpzdHJpbmcgYXNTdHJpbmcoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgS2luZCBLOworICBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kIE1hdGNoZXJLaW5kOworfTsKKwordXNpbmcgYXN0X21hdGNoZXJzOjppbnRlcm5hbDo6RHluVHlwZWRNYXRjaGVyOworCisvLy8gXGJyaWVmIEEgdmFyaWFudCBtYXRjaGVyIG9iamVjdC4KKy8vLworLy8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgb2JqZWN0IGlzIHRvIGFic3RyYWN0IHNpbXBsZSBhbmQgcG9seW1vcnBoaWMgbWF0Y2hlcnMKKy8vLyBpbnRvIGEgc2luZ2xlIG9iamVjdCB0eXBlLgorLy8vIFBvbHltb3JwaGljIG1hdGNoZXJzIG1pZ2h0IGJlIGltcGxlbWVudGVkIGFzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlCisvLy8gb3ZlcmxvYWRzIG9mIHRoZSBtYXRjaGVyLiBcYyBWYXJpYW50TWF0Y2hlciBrbm93cyBob3cgdG8gc2VsZWN0IHRoZQorLy8vIGFwcHJvcHJpYXRlIG92ZXJsb2FkIHdoZW4gbmVlZGVkLgorLy8vIFRvIGdldCBhIHJlYWwgbWF0Y2hlciBvYmplY3Qgb3V0IG9mIGEgXGMgVmFyaWFudE1hdGNoZXIgeW91IGNhbiBkbzoKKy8vLyAgLSBnZXRTaW5nbGVNYXRjaGVyKCkgd2hpY2ggcmV0dXJucyBhIG1hdGNoZXIsIG9ubHkgaWYgaXQgaXMgbm90IGFtYmlndW91cworLy8vICAgIHRvIGRlY2lkZSB3aGljaCBtYXRjaGVyIHRvIHJldHVybi4gRWcuIGl0IGNvbnRhaW5zIG9ubHkgYSBzaW5nbGUKKy8vLyAgICBtYXRjaGVyLCBvciBhIHBvbHltb3JwaGljIG9uZSB3aXRoIG9ubHkgb25lIG92ZXJsb2FkLgorLy8vICAtIGhhc1R5cGVkTWF0Y2hlcjxUPigpL2dldFR5cGVkTWF0Y2hlcjxUPigpOiBUaGVzZSBjYWxscyB3aWxsIGRldGVybWluZSBpZgorLy8vICAgIHRoZSB1bmRlcmx5aW5nIG1hdGNoZXIocykgY2FuIHVuYW1iaWd1b3VzbHkgcmV0dXJuIGEgTWF0Y2hlcjxUPi4KK2NsYXNzIFZhcmlhbnRNYXRjaGVyIHsKKyAgLy8vIFxicmllZiBNZXRob2RzIHRoYXQgZGVwZW5kIG9uIFQgZnJvbSBoYXNUeXBlZE1hdGNoZXIvZ2V0VHlwZWRNYXRjaGVyLgorICBjbGFzcyBNYXRjaGVyT3BzIHsKKyAgcHVibGljOgorICAgIE1hdGNoZXJPcHMoYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZCBOb2RlS2luZCkgOiBOb2RlS2luZChOb2RlS2luZCkge30KKworICAgIGJvb2wgY2FuQ29uc3RydWN0RnJvbShjb25zdCBEeW5UeXBlZE1hdGNoZXIgJk1hdGNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJklzRXhhY3RNYXRjaCkgY29uc3Q7CisKKyAgICAvLy8gXGJyaWVmIENvbnZlcnQgXHAgTWF0Y2hlciB0aGUgZGVzdGluYXRpb24gdHlwZSBhbmQgcmV0dXJuIGl0IGFzIGEgbmV3CisgICAgLy8vIER5blR5cGVkTWF0Y2hlci4KKyAgICB2aXJ0dWFsIER5blR5cGVkTWF0Y2hlcgorICAgIGNvbnZlcnRNYXRjaGVyKGNvbnN0IER5blR5cGVkTWF0Y2hlciAmTWF0Y2hlcikgY29uc3QgPSAwOworCisgICAgLy8vIFxicmllZiBDb25zdHJ1Y3RzIGEgdmFyaWFkaWMgdHlwZWQgbWF0Y2hlciBmcm9tIFxwIElubmVyTWF0Y2hlcnMuCisgICAgLy8vIFdpbGwgdHJ5IHRvIGNvbnZlcnQgZWFjaCBpbm5lciBtYXRjaGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB0eXBlIGFuZAorICAgIC8vLyByZXR1cm4gbGx2bTo6Tm9uZSBpZiBpdCBmYWlscyB0byBkbyBzby4KKyAgICBsbHZtOjpPcHRpb25hbDxEeW5UeXBlZE1hdGNoZXI+CisgICAgY29uc3RydWN0VmFyaWFkaWNPcGVyYXRvcihEeW5UeXBlZE1hdGNoZXI6OlZhcmlhZGljT3BlcmF0b3IgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYXJpYW50TWF0Y2hlcj4gSW5uZXJNYXRjaGVycykgY29uc3Q7CisKKyAgcHJvdGVjdGVkOgorICAgIH5NYXRjaGVyT3BzKCkgPSBkZWZhdWx0OworCisgIHByaXZhdGU6CisgICAgYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZCBOb2RlS2luZDsKKyAgfTsKKworICAvLy8gXGJyaWVmIFBheWxvYWQgaW50ZXJmYWNlIHRvIGJlIHNwZWNpYWxpemVkIGJ5IGVhY2ggbWF0Y2hlciB0eXBlLgorICAvLy8KKyAgLy8vIEl0IGZvbGxvd3MgYSBzaW1pbGFyIGludGVyZmFjZSBhcyBWYXJpYW50TWF0Y2hlciBpdHNlbGYuCisgIGNsYXNzIFBheWxvYWQgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+UGF5bG9hZCgpOworICAgIHZpcnR1YWwgbGx2bTo6T3B0aW9uYWw8RHluVHlwZWRNYXRjaGVyPiBnZXRTaW5nbGVNYXRjaGVyKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0VHlwZUFzU3RyaW5nKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgbGx2bTo6T3B0aW9uYWw8RHluVHlwZWRNYXRjaGVyPgorICAgIGdldFR5cGVkTWF0Y2hlcihjb25zdCBNYXRjaGVyT3BzICZPcHMpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNDb252ZXJ0aWJsZVRvKGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpTcGVjaWZpY2l0eSkgY29uc3QgPSAwOworICB9OworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQSBudWxsIG1hdGNoZXIuCisgIFZhcmlhbnRNYXRjaGVyKCk7CisKKyAgLy8vIFxicmllZiBDbG9uZXMgdGhlIHByb3ZpZGVkIG1hdGNoZXIuCisgIHN0YXRpYyBWYXJpYW50TWF0Y2hlciBTaW5nbGVNYXRjaGVyKGNvbnN0IER5blR5cGVkTWF0Y2hlciAmTWF0Y2hlcik7CisKKyAgLy8vIFxicmllZiBDbG9uZXMgdGhlIHByb3ZpZGVkIG1hdGNoZXJzLgorICAvLy8KKyAgLy8vIFRoZXkgc2hvdWxkIGJlIHRoZSByZXN1bHQgb2YgYSBwb2x5bW9ycGhpYyBtYXRjaGVyLgorICBzdGF0aWMgVmFyaWFudE1hdGNoZXIKKyAgUG9seW1vcnBoaWNNYXRjaGVyKHN0ZDo6dmVjdG9yPER5blR5cGVkTWF0Y2hlcj4gTWF0Y2hlcnMpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhICd2YXJpYWRpYycgb3BlcmF0b3IgbWF0Y2hlci4KKyAgLy8vCisgIC8vLyBJdCB3aWxsIGJpbmQgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUgb24gZ2V0VHlwZWRNYXRjaGVyPFQ+KCkuCisgIHN0YXRpYyBWYXJpYW50TWF0Y2hlcgorICBWYXJpYWRpY09wZXJhdG9yTWF0Y2hlcihEeW5UeXBlZE1hdGNoZXI6OlZhcmlhZGljT3BlcmF0b3IgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZhcmlhbnRNYXRjaGVyPiBBcmdzKTsKKworICAvLy8gXGJyaWVmIE1ha2VzIHRoZSBtYXRjaGVyIHRoZSAibnVsbCIgbWF0Y2hlci4KKyAgdm9pZCByZXNldCgpOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgbWF0Y2hlciBpcyBudWxsLgorICBib29sIGlzTnVsbCgpIGNvbnN0IHsgcmV0dXJuICFWYWx1ZTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgc2luZ2xlIG1hdGNoZXIsIGlmIHRoZXJlIGlzIG5vIGFtYmlndWl0eS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgbWF0Y2hlciwgaWYgdGhlcmUgaXMgb25seSBvbmUgbWF0Y2hlci4gQW4gZW1wdHkgT3B0aW9uYWwsIGlmCisgIC8vLyB0aGUgdW5kZXJseWluZyBtYXRjaGVyIGlzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB3aXRoIG1vcmUgdGhhbiBvbmUKKyAgLy8vIHJlcHJlc2VudGF0aW9uLgorICBsbHZtOjpPcHRpb25hbDxEeW5UeXBlZE1hdGNoZXI+IGdldFNpbmdsZU1hdGNoZXIoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZXMgaWYgdGhlIGNvbnRhaW5lZCBtYXRjaGVyIGNhbiBiZSBjb252ZXJ0ZWQgdG8KKyAgLy8vICAgXGMgTWF0Y2hlcjxUPi4KKyAgLy8vCisgIC8vLyBGb3IgdGhlIFNpbmdsZSBjYXNlLCBpdCByZXR1cm5zIHRydWUgaWYgaXQgY2FuIGJlIGNvbnZlcnRlZCB0bworICAvLy8gXGMgTWF0Y2hlcjxUPi4KKyAgLy8vIEZvciB0aGUgUG9seW1vcnBoaWMgY2FzZSwgaXQgcmV0dXJucyB0cnVlIGlmIG9uZSwgYW5kIG9ubHkgb25lLCBvZiB0aGUKKyAgLy8vIG92ZXJsb2FkcyBjYW4gYmUgY29udmVydGVkIHRvIFxjIE1hdGNoZXI8VD4uIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lCisgIC8vLyB0aGF0IGNhbiwgdGhlIHJlc3VsdCB3b3VsZCBiZSBhbWJpZ3VvdXMgYW5kIGZhbHNlIGlzIHJldHVybmVkLgorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgYm9vbCBoYXNUeXBlZE1hdGNoZXIoKSBjb25zdCB7CisgICAgaWYgKCFWYWx1ZSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBWYWx1ZS0+Z2V0VHlwZWRNYXRjaGVyKFR5cGVkTWF0Y2hlck9wczxUPigpKS5oYXNWYWx1ZSgpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIGlmIHRoZSBjb250YWluZWQgbWF0Y2hlciBjYW4gYmUgY29udmVydGVkIHRvIFxwIEtpbmQuCisgIC8vLworICAvLy8gXHBhcmFtIEtpbmQgdGhlIHJlcXVlc3RlZCBkZXN0aW5hdGlvbiB0eXBlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTcGVjaWZpY2l0eSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSAic3BlY2lmaWNpdHkiIG9mIHRoZQorICAvLy8gICBjb252ZXJzaW9uLgorICBib29sIGlzQ29udmVydGlibGVUbyhhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpTcGVjaWZpY2l0eSkgY29uc3QgeworICAgIGlmIChWYWx1ZSkKKyAgICAgIHJldHVybiBWYWx1ZS0+aXNDb252ZXJ0aWJsZVRvKEtpbmQsIFNwZWNpZmljaXR5KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGlzIG1hdGNoZXIgYXMgYSBcYyBNYXRjaGVyPFQ+LgorICAvLy8KKyAgLy8vIEhhbmRsZXMgdGhlIGRpZmZlcmVudCB0eXBlcyAoU2luZ2xlLCBQb2x5bW9ycGhpYykgYWNjb3JkaW5nbHkuCisgIC8vLyBBc3NlcnRzIHRoYXQgXGMgaGFzVHlwZWRNYXRjaGVyPFQ+KCkgaXMgdHJ1ZS4KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIGFzdF9tYXRjaGVyczo6aW50ZXJuYWw6Ok1hdGNoZXI8VD4gZ2V0VHlwZWRNYXRjaGVyKCkgY29uc3QgeworICAgIGFzc2VydChoYXNUeXBlZE1hdGNoZXI8VD4oKSAmJiAiaGFzVHlwZWRNYXRjaGVyPFQ+KCkgPT0gZmFsc2UiKTsKKyAgICByZXR1cm4gVmFsdWUtPmdldFR5cGVkTWF0Y2hlcihUeXBlZE1hdGNoZXJPcHM8VD4oKSkKKyAgICAgICAgLT50ZW1wbGF0ZSBjb252ZXJ0VG88VD4oKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBJZiB0aGUgdW5kZXJseWluZyBtYXRjaGVyIGlzIGEgcG9seW1vcnBoaWMgb25lLCB0aGUgc3RyaW5nIHdpbGwgc2hvdyBhbGwKKyAgLy8vIHRoZSB0eXBlcy4KKyAgc3RkOjpzdHJpbmcgZ2V0VHlwZUFzU3RyaW5nKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGV4cGxpY2l0IFZhcmlhbnRNYXRjaGVyKHN0ZDo6c2hhcmVkX3B0cjxQYXlsb2FkPiBWYWx1ZSkKKyAgICAgIDogVmFsdWUoc3RkOjptb3ZlKFZhbHVlKSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFR5cGVkTWF0Y2hlck9wczsKKworICBjbGFzcyBTaW5nbGVQYXlsb2FkOworICBjbGFzcyBQb2x5bW9ycGhpY1BheWxvYWQ7CisgIGNsYXNzIFZhcmlhZGljT3BQYXlsb2FkOworCisgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBQYXlsb2FkPiBWYWx1ZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFZhcmlhbnRNYXRjaGVyOjpUeXBlZE1hdGNoZXJPcHMgZmluYWwgOiBWYXJpYW50TWF0Y2hlcjo6TWF0Y2hlck9wcyB7CisgIFR5cGVkTWF0Y2hlck9wcygpCisgICAgICA6IE1hdGNoZXJPcHMoYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZDo6Z2V0RnJvbU5vZGVLaW5kPFQ+KCkpIHt9CisgIHR5cGVkZWYgYXN0X21hdGNoZXJzOjppbnRlcm5hbDo6TWF0Y2hlcjxUPiBNYXRjaGVyVDsKKworICBEeW5UeXBlZE1hdGNoZXIKKyAgY29udmVydE1hdGNoZXIoY29uc3QgRHluVHlwZWRNYXRjaGVyICZNYXRjaGVyKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIER5blR5cGVkTWF0Y2hlcihNYXRjaGVyLmNvbnZlcnRUbzxUPigpKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBWYXJpYW50IHZhbHVlIGNsYXNzLgorLy8vCisvLy8gQmFzaWNhbGx5LCBhIHRhZ2dlZCB1bmlvbiB3aXRoIHZhbHVlIHR5cGUgc2VtYW50aWNzLgorLy8vIEl0IGlzIHVzZWQgYnkgdGhlIHJlZ2lzdHJ5IGFzIHRoZSByZXR1cm4gdmFsdWUgYW5kIGFyZ3VtZW50IHR5cGUgZm9yIHRoZQorLy8vIG1hdGNoZXIgZmFjdG9yeSBtZXRob2RzLgorLy8vIEl0IGNhbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIGFueSBvZiB0aGUgc3VwcG9ydGVkIHR5cGVzLiBJdCBzdXBwb3J0cworLy8vIGNvcHkvYXNzaWdubWVudC4KKy8vLworLy8vIFN1cHBvcnRlZCB0eXBlczoKKy8vLyAgLSBcYyBib29sCisvLyAgIC0gXGMgZG91YmxlCisvLy8gIC0gXGMgdW5zaWduZWQKKy8vLyAgLSBcYyBsbHZtOjpTdHJpbmdSZWYKKy8vLyAgLSBcYyBWYXJpYW50TWF0Y2hlciAoXGMgRHluVHlwZWRNYXRjaGVyIC8gXGMgTWF0Y2hlcjxUPikKK2NsYXNzIFZhcmlhbnRWYWx1ZSB7CitwdWJsaWM6CisgIFZhcmlhbnRWYWx1ZSgpIDogVHlwZShWVF9Ob3RoaW5nKSB7fQorCisgIFZhcmlhbnRWYWx1ZShjb25zdCBWYXJpYW50VmFsdWUgJk90aGVyKTsKKyAgflZhcmlhbnRWYWx1ZSgpOworICBWYXJpYW50VmFsdWUgJm9wZXJhdG9yPShjb25zdCBWYXJpYW50VmFsdWUgJk90aGVyKTsKKworICAvLy8gXGJyaWVmIFNwZWNpZmljIGNvbnN0cnVjdG9ycyBmb3IgZWFjaCBzdXBwb3J0ZWQgdHlwZS4KKyAgVmFyaWFudFZhbHVlKGJvb2wgQm9vbGVhbik7CisgIFZhcmlhbnRWYWx1ZShkb3VibGUgRG91YmxlKTsKKyAgVmFyaWFudFZhbHVlKHVuc2lnbmVkIFVuc2lnbmVkKTsKKyAgVmFyaWFudFZhbHVlKFN0cmluZ1JlZiBTdHJpbmcpOworICBWYXJpYW50VmFsdWUoY29uc3QgVmFyaWFudE1hdGNoZXIgJk1hdGNoZXJzKTsKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdHMgYW4gXGMgdW5zaWduZWQgdmFsdWUgKGRpc2FtYmlndWF0aW9uIGZyb20gYm9vbCkuCisgIFZhcmlhbnRWYWx1ZShpbnQgU2lnbmVkKSA6IFZhcmlhbnRWYWx1ZShzdGF0aWNfY2FzdDx1bnNpZ25lZD4oU2lnbmVkKSkge30KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBub3QgYW4gZW1wdHkgdmFsdWUuCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBoYXNWYWx1ZSgpOyB9CisgIGJvb2wgaGFzVmFsdWUoKSBjb25zdCB7IHJldHVybiBUeXBlICE9IFZUX05vdGhpbmc7IH0KKworICAvLy8gXGJyaWVmIEJvb2xlYW4gdmFsdWUgZnVuY3Rpb25zLgorICBib29sIGlzQm9vbGVhbigpIGNvbnN0OworICBib29sIGdldEJvb2xlYW4oKSBjb25zdDsKKyAgdm9pZCBzZXRCb29sZWFuKGJvb2wgQm9vbGVhbik7CisKKyAgLy8vIFxicmllZiBEb3VibGUgdmFsdWUgZnVuY3Rpb25zLgorICBib29sIGlzRG91YmxlKCkgY29uc3Q7CisgIGRvdWJsZSBnZXREb3VibGUoKSBjb25zdDsKKyAgdm9pZCBzZXREb3VibGUoZG91YmxlIERvdWJsZSk7CisKKyAgLy8vIFxicmllZiBVbnNpZ25lZCB2YWx1ZSBmdW5jdGlvbnMuCisgIGJvb2wgaXNVbnNpZ25lZCgpIGNvbnN0OworICB1bnNpZ25lZCBnZXRVbnNpZ25lZCgpIGNvbnN0OworICB2b2lkIHNldFVuc2lnbmVkKHVuc2lnbmVkIFVuc2lnbmVkKTsKKworICAvLy8gXGJyaWVmIFN0cmluZyB2YWx1ZSBmdW5jdGlvbnMuCisgIGJvb2wgaXNTdHJpbmcoKSBjb25zdDsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldFN0cmluZygpIGNvbnN0OworICB2b2lkIHNldFN0cmluZyhTdHJpbmdSZWYgU3RyaW5nKTsKKworICAvLy8gXGJyaWVmIE1hdGNoZXIgdmFsdWUgZnVuY3Rpb25zLgorICBib29sIGlzTWF0Y2hlcigpIGNvbnN0OworICBjb25zdCBWYXJpYW50TWF0Y2hlciAmZ2V0TWF0Y2hlcigpIGNvbnN0OworICB2b2lkIHNldE1hdGNoZXIoY29uc3QgVmFyaWFudE1hdGNoZXIgJk1hdGNoZXIpOworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGUgY29udGFpbmVkIHZhbHVlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gXHAgS2luZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gS2luZCB0aGUgcmVxdWVzdGVkIGRlc3RpbmF0aW9uIHR5cGUuCisgIC8vLworICAvLy8gXHBhcmFtIFNwZWNpZmljaXR5IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlICJzcGVjaWZpY2l0eSIgb2YgdGhlCisgIC8vLyAgIGNvbnZlcnNpb24uCisgIGJvb2wgaXNDb252ZXJ0aWJsZVRvKEFyZ0tpbmQgS2luZCwgdW5zaWduZWQqIFNwZWNpZmljaXR5KSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZXMgaWYgdGhlIGNvbnRhaW5lZCB2YWx1ZSBjYW4gYmUgY29udmVydGVkIHRvIGFueSBraW5kCisgIC8vLyBpbiBccCBLaW5kcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gS2luZHMgdGhlIHJlcXVlc3RlZCBkZXN0aW5hdGlvbiB0eXBlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3BlY2lmaWNpdHkgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgInNwZWNpZmljaXR5IiBvZiB0aGUKKyAgLy8vICAgY29udmVyc2lvbi4gSXQgaXMgdGhlIG1heGltdW0gc3BlY2lmaWNpdHkgb2YgYWxsIHRoZSBwb3NzaWJsZQorICAvLy8gICBjb252ZXJzaW9ucy4KKyAgYm9vbCBpc0NvbnZlcnRpYmxlVG8oQXJyYXlSZWY8QXJnS2luZD4gS2luZHMsIHVuc2lnbmVkICpTcGVjaWZpY2l0eSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHR5cGUgb2YgdGhlIHZhbHVlLgorICBzdGQ6OnN0cmluZyBnZXRUeXBlQXNTdHJpbmcoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgdm9pZCByZXNldCgpOworCisgIC8vLyBcYnJpZWYgQWxsIHN1cHBvcnRlZCB2YWx1ZSB0eXBlcy4KKyAgZW51bSBWYWx1ZVR5cGUgeworICAgIFZUX05vdGhpbmcsCisgICAgVlRfQm9vbGVhbiwKKyAgICBWVF9Eb3VibGUsCisgICAgVlRfVW5zaWduZWQsCisgICAgVlRfU3RyaW5nLAorICAgIFZUX01hdGNoZXIKKyAgfTsKKworICAvLy8gXGJyaWVmIEFsbCBzdXBwb3J0ZWQgdmFsdWUgdHlwZXMuCisgIHVuaW9uIEFsbFZhbHVlcyB7CisgICAgdW5zaWduZWQgVW5zaWduZWQ7CisgICAgZG91YmxlIERvdWJsZTsKKyAgICBib29sIEJvb2xlYW47CisgICAgc3RkOjpzdHJpbmcgKlN0cmluZzsKKyAgICBWYXJpYW50TWF0Y2hlciAqTWF0Y2hlcjsKKyAgfTsKKworICBWYWx1ZVR5cGUgVHlwZTsKKyAgQWxsVmFsdWVzIFZhbHVlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGR5bmFtaWMKK30gLy8gZW5kIG5hbWVzcGFjZSBhc3RfbWF0Y2hlcnMKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgIC8vIExMVk1fQ0xBTkdfQVNUX01BVENIRVJTX0RZTkFNSUNfVkFSSUFOVF9WQUxVRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9DRkdSZWFjaGFiaWxpdHlBbmFseXNpcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvQ0ZHUmVhY2hhYmlsaXR5QW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTU5NTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvQ0ZHUmVhY2hhYmlsaXR5QW5hbHlzaXMuaApAQCAtMCwwICsxLDUxIEBACisvLz09PS0gQ0ZHUmVhY2hhYmlsaXR5QW5hbHlzaXMuaCAtIEJhc2ljIHJlYWNoYWJpbGl0eSBhbmFseXNpcyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgZmxvdy1zZW5zaXRpdmUsIChtb3N0bHkpIHBhdGgtaW5zZW5zaXRpdmUgcmVhY2hhYmlsaXR5CisvLyBhbmFseXNpcyBiYXNlZCBvbiBDbGFuZydzIENGR3MuICBDbGllbnRzIGNhbiBxdWVyeSBpZiBhIGdpdmVuIGJhc2ljIGJsb2NrCisvLyBpcyByZWFjaGFibGUgd2l0aGluIHRoZSBDRkcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FOQUxZU0lTX0FOQUxZU0VTX0NGR1JFQUNIQUJJTElUWUFOQUxZU0lTX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BTkFMWVNJU19BTkFMWVNFU19DRkdSRUFDSEFCSUxJVFlBTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBDRkc7CitjbGFzcyBDRkdCbG9jazsKKyAgCisvLyBBIGNsYXNzIHRoYXQgcGVyZm9ybXMgcmVhY2hhYmlsaXR5IHF1ZXJpZXMgZm9yIENGR0Jsb2Nrcy4gU2V2ZXJhbCBpbnRlcm5hbAorLy8gY2hlY2tzIGluIHRoaXMgY2hlY2tlciByZXF1aXJlIHJlYWNoYWJpbGl0eSBpbmZvcm1hdGlvbi4gVGhlIHJlcXVlc3RzIGFsbAorLy8gdGVuZCB0byBoYXZlIGEgY29tbW9uIGRlc3RpbmF0aW9uLCBzbyB3ZSBsYXppbHkgZG8gYSBwcmVkZWNlc3NvciBzZWFyY2gKKy8vIGZyb20gdGhlIGRlc3RpbmF0aW9uIG5vZGUgYW5kIGNhY2hlIHRoZSByZXN1bHRzIHRvIHByZXZlbnQgd29yaworLy8gZHVwbGljYXRpb24uCitjbGFzcyBDRkdSZXZlcnNlQmxvY2tSZWFjaGFiaWxpdHlBbmFseXNpcyB7CisgIHVzaW5nIFJlYWNoYWJsZVNldCA9IGxsdm06OkJpdFZlY3RvcjsKKyAgdXNpbmcgUmVhY2hhYmxlTWFwID0gbGx2bTo6RGVuc2VNYXA8dW5zaWduZWQsIFJlYWNoYWJsZVNldD47CisKKyAgUmVhY2hhYmxlU2V0IGFuYWx5emVkOworICBSZWFjaGFibGVNYXAgcmVhY2hhYmxlOworCitwdWJsaWM6CisgIENGR1JldmVyc2VCbG9ja1JlYWNoYWJpbGl0eUFuYWx5c2lzKGNvbnN0IENGRyAmY2ZnKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBibG9jayAnRHN0JyBjYW4gYmUgcmVhY2hlZCBmcm9tIGJsb2NrICdTcmMnLgorICBib29sIGlzUmVhY2hhYmxlKGNvbnN0IENGR0Jsb2NrICpTcmMsIGNvbnN0IENGR0Jsb2NrICpEc3QpOworCitwcml2YXRlOgorICB2b2lkIG1hcFJlYWNoYWJpbGl0eShjb25zdCBDRkdCbG9jayAqRHN0KTsKK307CisgIAorfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQU5BTFlTSVNfQU5BTFlTRVNfQ0ZHUkVBQ0hBQklMSVRZQU5BTFlTSVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvQ29uc3VtZWQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL0NvbnN1bWVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1ZDEyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL0NvbnN1bWVkLmgKQEAgLTAsMCArMSwyNzMgQEAKKy8vPT09LSBDb25zdW1lZC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQSBpbnRyYS1wcm9jZWR1cmFsIGFuYWx5c2lzIGZvciBjaGVja2luZyBjb25zdW1lZCBwcm9wZXJ0aWVzLiAgVGhpcyBpcyBiYXNlZCwKKy8vIGluIHBhcnQsIG9uIHJlc2VhcmNoIG9uIGxpbmVhciB0eXBlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQU5BTFlTSVNfQU5BTFlTRVNfQ09OU1VNRURfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FOQUxZU0lTX0FOQUxZU0VTX0NPTlNVTUVEX0gKKworI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL1Bvc3RPcmRlckNGR1ZpZXcuaCIKKyNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9DRkcuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvUGFydGlhbERpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQW5hbHlzaXNEZWNsQ29udGV4dDsKK2NsYXNzIENYWEJpbmRUZW1wb3JhcnlFeHByOworY2xhc3MgRnVuY3Rpb25EZWNsOworY2xhc3MgUG9zdE9yZGVyQ0ZHVmlldzsKK2NsYXNzIFN0bXQ7CitjbGFzcyBWYXJEZWNsOworCituYW1lc3BhY2UgY29uc3VtZWQgeworICAKKyAgY2xhc3MgQ29uc3VtZWRTdG10VmlzaXRvcjsKKworICBlbnVtIENvbnN1bWVkU3RhdGUgeworICAgIC8vIE5vIHN0YXRlIGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gdmFyaWFibGUuCisgICAgQ1NfTm9uZSwKKyAgICAKKyAgICBDU19Vbmtub3duLAorICAgIENTX1VuY29uc3VtZWQsCisgICAgQ1NfQ29uc3VtZWQKKyAgfTsKKyAgCisgIHVzaW5nIE9wdGlvbmFsTm90ZXMgPSBTbWFsbFZlY3RvcjxQYXJ0aWFsRGlhZ25vc3RpY0F0LCAxPjsKKyAgdXNpbmcgRGVsYXllZERpYWcgPSBzdGQ6OnBhaXI8UGFydGlhbERpYWdub3N0aWNBdCwgT3B0aW9uYWxOb3Rlcz47CisgIHVzaW5nIERpYWdMaXN0ID0gc3RkOjpsaXN0PERlbGF5ZWREaWFnPjsKKworICBjbGFzcyBDb25zdW1lZFdhcm5pbmdzSGFuZGxlckJhc2UgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+Q29uc3VtZWRXYXJuaW5nc0hhbmRsZXJCYXNlKCk7CisKKyAgICAvLy8gXGJyaWVmIEVtaXQgdGhlIHdhcm5pbmdzIGFuZCBub3RlcyBsZWZ0IGJ5IHRoZSBhbmFseXNpcy4KKyAgICB2aXJ0dWFsIHZvaWQgZW1pdERpYWdub3N0aWNzKCkge30KKyAgICAKKyAgICAvLy8gXGJyaWVmIFdhcm4gdGhhdCBhIHZhcmlhYmxlJ3Mgc3RhdGUgZG9lc24ndCBtYXRjaCBhdCB0aGUgZW50cnkgYW5kIGV4aXQKKyAgICAvLy8gb2YgYSBsb29wLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gTG9jIC0tIFRoZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBsb29wLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gVmFyaWFibGVOYW1lIC0tIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0aGF0IGhhcyBhIG1pc21hdGNoZWQKKyAgICAvLy8gc3RhdGUuCisgICAgdmlydHVhbCB2b2lkIHdhcm5Mb29wU3RhdGVNaXNtYXRjaChTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVmFyaWFibGVOYW1lKSB7fQorICAgIAorICAgIC8vLyBcYnJpZWYgV2FybiBhYm91dCBwYXJhbWV0ZXIgdHlwZXN0YXRlIG1pc21hdGNoZXMgdXBvbiByZXR1cm4uCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBMb2MgLS0gVGhlIFNvdXJjZUxvY2F0aW9uIG9mIHRoZSByZXR1cm4gc3RhdGVtZW50LgorICAgIC8vLworICAgIC8vLyBccGFyYW0gRXhwZWN0ZWRTdGF0ZSAtLSBUaGUgc3RhdGUgdGhlIHJldHVybiB2YWx1ZSB3YXMgZXhwZWN0ZWQgdG8gYmUKKyAgICAvLy8gaW4uCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBPYnNlcnZlZFN0YXRlIC0tIFRoZSBzdGF0ZSB0aGUgcmV0dXJuIHZhbHVlIHdhcyBvYnNlcnZlZCB0byBiZQorICAgIC8vLyBpbi4KKyAgICB2aXJ0dWFsIHZvaWQgd2FyblBhcmFtUmV0dXJuVHlwZXN0YXRlTWlzbWF0Y2goU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVmFyaWFibGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRXhwZWN0ZWRTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE9ic2VydmVkU3RhdGUpIHt9CisgICAgCisgICAgLy8gRklYTUU6IEFkZCBkb2N1bWVudGF0aW9uLgorICAgIHZpcnR1YWwgdm9pZCB3YXJuUGFyYW1UeXBlc3RhdGVNaXNtYXRjaChTb3VyY2VMb2NhdGlvbiBMT0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBFeHBlY3RlZFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgT2JzZXJ2ZWRTdGF0ZSkge30KKyAgICAKKyAgICAvLyBGSVhNRTogVGhpcyBjYW4gYmUgcmVtb3ZlZCB3aGVuIHRoZSBhdHRyIHByb3BhZ2F0aW9uIGZpeCBmb3IgdGVtcGxhdGVkCisgICAgLy8gICAgICAgIGNsYXNzZXMgbGFuZHMuCisgICAgLy8vIFxicmllZiBXYXJuIGFib3V0IHJldHVybiB0eXBlc3RhdGVzIHNldCBmb3IgdW5jb25zdW1hYmxlIHR5cGVzLgorICAgIC8vLyAKKyAgICAvLy8gXHBhcmFtIExvYyAtLSBUaGUgbG9jYXRpb24gb2YgdGhlIGF0dHJpYnV0ZXMuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBUeXBlTmFtZSAtLSBUaGUgbmFtZSBvZiB0aGUgdW5jb25zdW1hYmxlIHR5cGUuCisgICAgdmlydHVhbCB2b2lkIHdhcm5SZXR1cm5UeXBlc3RhdGVGb3JVbmNvbnN1bWFibGVUeXBlKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFR5cGVOYW1lKSB7fQorICAgIAorICAgIC8vLyBcYnJpZWYgV2FybiBhYm91dCByZXR1cm4gdHlwZXN0YXRlIG1pc21hdGNoZXMuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBMb2MgLS0gVGhlIFNvdXJjZUxvY2F0aW9uIG9mIHRoZSByZXR1cm4gc3RhdGVtZW50LgorICAgIC8vLworICAgIC8vLyBccGFyYW0gRXhwZWN0ZWRTdGF0ZSAtLSBUaGUgc3RhdGUgdGhlIHJldHVybiB2YWx1ZSB3YXMgZXhwZWN0ZWQgdG8gYmUKKyAgICAvLy8gaW4uCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBPYnNlcnZlZFN0YXRlIC0tIFRoZSBzdGF0ZSB0aGUgcmV0dXJuIHZhbHVlIHdhcyBvYnNlcnZlZCB0byBiZQorICAgIC8vLyBpbi4KKyAgICB2aXJ0dWFsIHZvaWQgd2FyblJldHVyblR5cGVzdGF0ZU1pc21hdGNoKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBFeHBlY3RlZFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE9ic2VydmVkU3RhdGUpIHt9CisKKyAgICAvLy8gXGJyaWVmIFdhcm4gYWJvdXQgdXNlLXdoaWxlLWNvbnN1bWVkIGVycm9ycy4KKyAgICAvLy8gXHBhcmFtIE1ldGhvZE5hbWUgLS0gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0aGF0IHdhcyBpbmNvcnJlY3RseQorICAgIC8vLyBpbnZva2VkLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gU3RhdGUgLS0gVGhlIHN0YXRlIHRoZSBvYmplY3Qgd2FzIHVzZWQgaW4uCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBMb2MgLS0gVGhlIFNvdXJjZUxvY2F0aW9uIG9mIHRoZSBtZXRob2QgaW52b2NhdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgd2FyblVzZU9mVGVtcEluSW52YWxpZFN0YXRlKFN0cmluZ1JlZiBNZXRob2ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKSB7fQorCisgICAgLy8vIFxicmllZiBXYXJuIGFib3V0IHVzZS13aGlsZS1jb25zdW1lZCBlcnJvcnMuCisgICAgLy8vIFxwYXJhbSBNZXRob2ROYW1lIC0tIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdGhhdCB3YXMgaW5jb3JyZWN0bHkKKyAgICAvLy8gaW52b2tlZC4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIFN0YXRlIC0tIFRoZSBzdGF0ZSB0aGUgb2JqZWN0IHdhcyB1c2VkIGluLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gVmFyaWFibGVOYW1lIC0tIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0aGF0IGhvbGRzIHRoZSB1bmlxdWUKKyAgICAvLy8gdmFsdWUuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBMb2MgLS0gVGhlIFNvdXJjZUxvY2F0aW9uIG9mIHRoZSBtZXRob2QgaW52b2NhdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgd2FyblVzZUluSW52YWxpZFN0YXRlKFN0cmluZ1JlZiBNZXRob2ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFZhcmlhYmxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYykge30KKyAgfTsKKworICBjbGFzcyBDb25zdW1lZFN0YXRlTWFwIHsKKyAgICB1c2luZyBWYXJNYXBUeXBlID0gbGx2bTo6RGVuc2VNYXA8Y29uc3QgVmFyRGVjbCAqLCBDb25zdW1lZFN0YXRlPjsKKyAgICB1c2luZyBUbXBNYXBUeXBlID0KKyAgICAgICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYQmluZFRlbXBvcmFyeUV4cHIgKiwgQ29uc3VtZWRTdGF0ZT47CisgICAgCisgIHByb3RlY3RlZDoKKyAgICBib29sIFJlYWNoYWJsZSA9IHRydWU7CisgICAgY29uc3QgU3RtdCAqRnJvbSA9IG51bGxwdHI7CisgICAgVmFyTWFwVHlwZSBWYXJNYXA7CisgICAgVG1wTWFwVHlwZSBUbXBNYXA7CisgICAgCisgIHB1YmxpYzoKKyAgICBDb25zdW1lZFN0YXRlTWFwKCkgPSBkZWZhdWx0OworICAgIENvbnN1bWVkU3RhdGVNYXAoY29uc3QgQ29uc3VtZWRTdGF0ZU1hcCAmT3RoZXIpCisgICAgICAgIDogUmVhY2hhYmxlKE90aGVyLlJlYWNoYWJsZSksIEZyb20oT3RoZXIuRnJvbSksIFZhck1hcChPdGhlci5WYXJNYXApLAorICAgICAgICAgIFRtcE1hcCgpIHt9CisgICAgCisgICAgLy8vIFxicmllZiBXYXJuIGlmIGFueSBvZiB0aGUgcGFyYW1ldGVycyBiZWluZyB0cmFja2VkIGFyZSBub3QgaW4gdGhlIHN0YXRlCisgICAgLy8vIHRoZXkgd2VyZSBkZWNsYXJlZCB0byBiZSBpbiB1cG9uIHJldHVybiBmcm9tIGEgZnVuY3Rpb24uCisgICAgdm9pZCBjaGVja1BhcmFtc0ZvclJldHVyblR5cGVzdGF0ZShTb3VyY2VMb2NhdGlvbiBCbGFtZUxvYywKKyAgICAgIENvbnN1bWVkV2FybmluZ3NIYW5kbGVyQmFzZSAmV2FybmluZ3NIYW5kbGVyKSBjb25zdDsKKyAgICAKKyAgICAvLy8gXGJyaWVmIENsZWFyIHRoZSBUbXBNYXAuCisgICAgdm9pZCBjbGVhclRlbXBvcmFyaWVzKCk7CisgICAgCisgICAgLy8vIFxicmllZiBHZXQgdGhlIGNvbnN1bWVkIHN0YXRlIG9mIGEgZ2l2ZW4gdmFyaWFibGUuCisgICAgQ29uc3VtZWRTdGF0ZSBnZXRTdGF0ZShjb25zdCBWYXJEZWNsICpWYXIpIGNvbnN0OworICAgIAorICAgIC8vLyBcYnJpZWYgR2V0IHRoZSBjb25zdW1lZCBzdGF0ZSBvZiBhIGdpdmVuIHRlbXBvcmFyeSB2YWx1ZS4KKyAgICBDb25zdW1lZFN0YXRlIGdldFN0YXRlKGNvbnN0IENYWEJpbmRUZW1wb3JhcnlFeHByICpUbXApIGNvbnN0OworICAgIAorICAgIC8vLyBcYnJpZWYgTWVyZ2UgdGhpcyBzdGF0ZSBtYXAgd2l0aCBhbm90aGVyIG1hcC4KKyAgICB2b2lkIGludGVyc2VjdChjb25zdCBDb25zdW1lZFN0YXRlTWFwICZPdGhlcik7CisKKyAgICB2b2lkIGludGVyc2VjdEF0TG9vcEhlYWQoY29uc3QgQ0ZHQmxvY2sgKkxvb3BIZWFkLCBjb25zdCBDRkdCbG9jayAqTG9vcEJhY2ssCisgICAgICBjb25zdCBDb25zdW1lZFN0YXRlTWFwICpMb29wQmFja1N0YXRlcywKKyAgICAgIENvbnN1bWVkV2FybmluZ3NIYW5kbGVyQmFzZSAmV2FybmluZ3NIYW5kbGVyKTsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgYmxvY2sgaXMgcmVhY2hhYmxlLgorICAgIGJvb2wgaXNSZWFjaGFibGUoKSBjb25zdCB7IHJldHVybiBSZWFjaGFibGU7IH0KKyAgICAKKyAgICAvLy8gXGJyaWVmIE1hcmsgdGhlIGJsb2NrIGFzIHVucmVhY2hhYmxlLgorICAgIHZvaWQgbWFya1VucmVhY2hhYmxlKCk7CisgICAgCisgICAgLy8vIFxicmllZiBTZXQgdGhlIHNvdXJjZSBmb3IgYSBkZWNpc2lvbiBhYm91dCB0aGUgYnJhbmNoaW5nIG9mIHN0YXRlcy4KKyAgICAvLy8gXHBhcmFtIFNvdXJjZSAtLSBUaGUgc3RhdGVtZW50IHRoYXQgd2FzIHRoZSBvcmlnaW4gb2YgYSBicmFuY2hpbmcKKyAgICAvLy8gZGVjaXNpb24uCisgICAgdm9pZCBzZXRTb3VyY2UoY29uc3QgU3RtdCAqU291cmNlKSB7IHRoaXMtPkZyb20gPSBTb3VyY2U7IH0KKyAgICAKKyAgICAvLy8gXGJyaWVmIFNldCB0aGUgY29uc3VtZWQgc3RhdGUgb2YgYSBnaXZlbiB2YXJpYWJsZS4KKyAgICB2b2lkIHNldFN0YXRlKGNvbnN0IFZhckRlY2wgKlZhciwgQ29uc3VtZWRTdGF0ZSBTdGF0ZSk7CisgICAgCisgICAgLy8vIFxicmllZiBTZXQgdGhlIGNvbnN1bWVkIHN0YXRlIG9mIGEgZ2l2ZW4gdGVtcG9yYXJ5IHZhbHVlLgorICAgIHZvaWQgc2V0U3RhdGUoY29uc3QgQ1hYQmluZFRlbXBvcmFyeUV4cHIgKlRtcCwgQ29uc3VtZWRTdGF0ZSBTdGF0ZSk7CisgICAgCisgICAgLy8vIFxicmllZiBSZW1vdmUgdGhlIHRlbXBvcmFyeSB2YWx1ZSBmcm9tIG91ciBzdGF0ZSBtYXAuCisgICAgdm9pZCByZW1vdmUoY29uc3QgQ1hYQmluZFRlbXBvcmFyeUV4cHIgKlRtcCk7CisgICAgCisgICAgLy8vIFxicmllZiBUZXN0cyB0byBzZWUgaWYgdGhlcmUgaXMgYSBtaXNtYXRjaCBpbiB0aGUgc3RhdGVzIHN0b3JlZCBpbiB0d28KKyAgICAvLy8gbWFwcy4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIE90aGVyIC0tIFRoZSBzZWNvbmQgbWFwIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ29uc3VtZWRTdGF0ZU1hcCAqT3RoZXIpIGNvbnN0OworICB9OworICAKKyAgY2xhc3MgQ29uc3VtZWRCbG9ja0luZm8geworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDb25zdW1lZFN0YXRlTWFwPj4gU3RhdGVNYXBzQXJyYXk7CisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiBWaXNpdE9yZGVyOworICAgIAorICBwdWJsaWM6CisgICAgQ29uc3VtZWRCbG9ja0luZm8oKSA9IGRlZmF1bHQ7CisKKyAgICBDb25zdW1lZEJsb2NrSW5mbyh1bnNpZ25lZCBpbnQgTnVtQmxvY2tzLCBQb3N0T3JkZXJDRkdWaWV3ICpTb3J0ZWRHcmFwaCkKKyAgICAgICAgOiBTdGF0ZU1hcHNBcnJheShOdW1CbG9ja3MpLCBWaXNpdE9yZGVyKE51bUJsb2NrcywgMCkgeworICAgICAgdW5zaWduZWQgaW50IFZpc2l0T3JkZXJDb3VudGVyID0gMDsKKyAgICAgIGZvciAoY29uc3QgYXV0byBCSSA6ICpTb3J0ZWRHcmFwaCkKKyAgICAgICAgVmlzaXRPcmRlcltCSS0+Z2V0QmxvY2tJRCgpXSA9IFZpc2l0T3JkZXJDb3VudGVyKys7CisgICAgfQorICAgIAorICAgIGJvb2wgYWxsQmFja0VkZ2VzVmlzaXRlZChjb25zdCBDRkdCbG9jayAqQ3VyckJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkdCbG9jayAqVGFyZ2V0QmxvY2spOworCisgICAgdm9pZCBhZGRJbmZvKGNvbnN0IENGR0Jsb2NrICpCbG9jaywgQ29uc3VtZWRTdGF0ZU1hcCAqU3RhdGVNYXAsCisgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDb25zdW1lZFN0YXRlTWFwPiAmT3duZWRTdGF0ZU1hcCk7CisgICAgdm9pZCBhZGRJbmZvKGNvbnN0IENGR0Jsb2NrICpCbG9jaywKKyAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENvbnN1bWVkU3RhdGVNYXA+IFN0YXRlTWFwKTsKKworICAgIENvbnN1bWVkU3RhdGVNYXAqIGJvcnJvd0luZm8oY29uc3QgQ0ZHQmxvY2sgKkJsb2NrKTsKKyAgICAKKyAgICB2b2lkIGRpc2NhcmRJbmZvKGNvbnN0IENGR0Jsb2NrICpCbG9jayk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29uc3VtZWRTdGF0ZU1hcD4gZ2V0SW5mbyhjb25zdCBDRkdCbG9jayAqQmxvY2spOworCisgICAgYm9vbCBpc0JhY2tFZGdlKGNvbnN0IENGR0Jsb2NrICpGcm9tLCBjb25zdCBDRkdCbG9jayAqVG8pOworICAgIGJvb2wgaXNCYWNrRWRnZVRhcmdldChjb25zdCBDRkdCbG9jayAqQmxvY2spOworICB9OworCisgIC8vLyBBIGNsYXNzIHRoYXQgaGFuZGxlcyB0aGUgYW5hbHlzaXMgb2YgdW5pcXVlbmVzcyB2aW9sYXRpb25zLgorICBjbGFzcyBDb25zdW1lZEFuYWx5emVyIHsKKyAgICBDb25zdW1lZEJsb2NrSW5mbyBCbG9ja0luZm87CisgICAgc3RkOjp1bmlxdWVfcHRyPENvbnN1bWVkU3RhdGVNYXA+IEN1cnJTdGF0ZXM7CisKKyAgICBDb25zdW1lZFN0YXRlIEV4cGVjdGVkUmV0dXJuU3RhdGU7CisgICAgCisgICAgdm9pZCBkZXRlcm1pbmVFeHBlY3RlZFJldHVyblN0YXRlKEFuYWx5c2lzRGVjbENvbnRleHQgJkFDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkQpOworICAgIGJvb2wgc3BsaXRTdGF0ZShjb25zdCBDRkdCbG9jayAqQ3VyckJsb2NrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25zdW1lZFN0bXRWaXNpdG9yICZWaXNpdG9yKTsKKyAgICAKKyAgcHVibGljOgorICAgIENvbnN1bWVkV2FybmluZ3NIYW5kbGVyQmFzZSAmV2FybmluZ3NIYW5kbGVyOworCisgICAgQ29uc3VtZWRBbmFseXplcihDb25zdW1lZFdhcm5pbmdzSGFuZGxlckJhc2UgJldhcm5pbmdzSGFuZGxlcikKKyAgICAgICAgOiBXYXJuaW5nc0hhbmRsZXIoV2FybmluZ3NIYW5kbGVyKSB7fQorCisgICAgQ29uc3VtZWRTdGF0ZSBnZXRFeHBlY3RlZFJldHVyblN0YXRlKCkgY29uc3QgeyByZXR1cm4gRXhwZWN0ZWRSZXR1cm5TdGF0ZTsgfQorICAgIAorICAgIC8vLyBcYnJpZWYgQ2hlY2sgYSBmdW5jdGlvbidzIENGRyBmb3IgY29uc3VtZWQgdmlvbGF0aW9ucy4KKyAgICAvLy8KKyAgICAvLy8gV2UgdHJhdmVyc2UgdGhlIGJsb2NrcyBpbiB0aGUgQ0ZHLCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBzdGF0ZSBvZiBlYWNoCisgICAgLy8vIHZhbHVlIHdobydzIHR5cGUgaGFzIHVuaXF1bmVzcyBhbm5vdGF0aW9ucy4gIElmIG1ldGhvZHMgYXJlIGludm9rZWQgaW4KKyAgICAvLy8gdGhlIHdyb25nIHN0YXRlIGEgd2FybmluZyBpcyBpc3N1ZWQuICBFYWNoIGJsb2NrIGluIHRoZSBDRkcgaXMgdHJhdmVyc2VkCisgICAgLy8vIGV4YWN0bHkgb25jZS4KKyAgICB2b2lkIHJ1bihBbmFseXNpc0RlY2xDb250ZXh0ICZBQyk7CisgIH07CisKK30gLy8gbmFtZXNwYWNlIGNvbnN1bWVkCisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FOQUxZU0lTX0FOQUxZU0VTX0NPTlNVTUVEX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL0RvbWluYXRvcnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL0RvbWluYXRvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjNiYmQzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvRG9taW5hdG9ycy5oCkBAIC0wLDAgKzEsMjAyIEBACisvLy0gRG9taW5hdG9ycy5oIC0gSW1wbGVtZW50YXRpb24gb2YgZG9taW5hdG9ycyB0cmVlIGZvciBDbGFuZyBDRkcgLSotIEMrKyAtKi0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBkb21pbmF0b3JzIHRyZWUgZnVuY3Rpb25hbGl0eSBmb3IgQ2xhbmcgQ0ZHcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQU5BTFlTSVNfQU5BTFlTRVNfRE9NSU5BVE9SU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQU5BTFlTSVNfQU5BTFlTRVNfRE9NSU5BVE9SU19ICisKKyNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9BbmFseXNpc0RlY2xDb250ZXh0LmgiCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVwdGhGaXJzdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9HZW5lcmljRG9tVHJlZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9HZW5lcmljRG9tVHJlZUNvbnN0cnVjdGlvbi5oIiAKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworLy8gRklYTUU6IFRoZXJlIGlzIG5vIGdvb2QgcmVhc29uIGZvciB0aGUgZG9tdHJlZSB0byByZXF1aXJlIGEgcHJpbnQgbWV0aG9kCisvLyB3aGljaCBhY2NlcHRzIGFuIExMVk0gTW9kdWxlLCBzbyByZW1vdmUgdGhpcyAoYW5kIHRoZSBtZXRob2QncyBhcmd1bWVudCB0aGF0CisvLyBuZWVkcyBpdCkgd2hlbiB0aGF0IGlzIGZpeGVkLgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCituYW1lc3BhY2UgY2xhbmcgeworCit1c2luZyBEb21UcmVlTm9kZSA9IGxsdm06OkRvbVRyZWVOb2RlQmFzZTxDRkdCbG9jaz47CisKKy8vLyBcYnJpZWYgQ29uY3JldGUgc3ViY2xhc3Mgb2YgRG9taW5hdG9yVHJlZUJhc2UgZm9yIENsYW5nCisvLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBkb21pbmF0b3JzIHRyZWUgZnVuY3Rpb25hbGl0eSBnaXZlbiBhIENsYW5nIENGRy4KKy8vLworY2xhc3MgRG9taW5hdG9yVHJlZSA6IHB1YmxpYyBNYW5hZ2VkQW5hbHlzaXMgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3B1YmxpYzoKKyAgbGx2bTo6RG9tVHJlZUJhc2U8Q0ZHQmxvY2s+ICpEVDsKKworICBEb21pbmF0b3JUcmVlKCkgeworICAgIERUID0gbmV3IGxsdm06OkRvbVRyZWVCYXNlPENGR0Jsb2NrPigpOworICB9CisKKyAgfkRvbWluYXRvclRyZWUoKSBvdmVycmlkZSB7IGRlbGV0ZSBEVDsgfQorCisgIGxsdm06OkRvbVRyZWVCYXNlPENGR0Jsb2NrPiYgZ2V0QmFzZSgpIHsgcmV0dXJuICpEVDsgfQorCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgcm9vdCBDRkdCbG9jayBvZiB0aGUgZG9taW5hdG9ycyB0cmVlLgorICBDRkdCbG9jayAqZ2V0Um9vdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRFQtPmdldFJvb3QoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgcm9vdCBEb21UcmVlTm9kZSwgd2hpY2ggaXMgdGhlIHdyYXBwZXIKKyAgLy8vIGZvciBDRkdCbG9jay4KKyAgRG9tVHJlZU5vZGUgKmdldFJvb3ROb2RlKCkgY29uc3QgeworICAgIHJldHVybiBEVC0+Z2V0Um9vdE5vZGUoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2QgY29tcGFyZXMgdHdvIGRvbWluYXRvciB0cmVlcy4KKyAgLy8vIFRoZSBtZXRob2QgcmV0dXJucyBmYWxzZSBpZiB0aGUgb3RoZXIgZG9taW5hdG9yIHRyZWUgbWF0Y2hlcyB0aGlzCisgIC8vLyBkb21pbmF0b3IgdHJlZSwgb3RoZXJ3aXNlIHJldHVybnMgdHJ1ZS4KKyAgYm9vbCBjb21wYXJlKERvbWluYXRvclRyZWUgJk90aGVyKSBjb25zdCB7CisgICAgRG9tVHJlZU5vZGUgKlIgPSBnZXRSb290Tm9kZSgpOworICAgIERvbVRyZWVOb2RlICpPdGhlclIgPSBPdGhlci5nZXRSb290Tm9kZSgpOworCisgICAgaWYgKCFSIHx8ICFPdGhlclIgfHwgUi0+Z2V0QmxvY2soKSAhPSBPdGhlclItPmdldEJsb2NrKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmIChEVC0+Y29tcGFyZShPdGhlci5nZXRCYXNlKCkpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gXGJyaWVmIFRoaXMgbWV0aG9kIGJ1aWxkcyB0aGUgZG9taW5hdG9yIHRyZWUgZm9yIGEgZ2l2ZW4gQ0ZHCisgIC8vLyBUaGUgQ0ZHIGluZm9ybWF0aW9uIGlzIHBhc3NlZCB2aWEgQW5hbHlzaXNEZWNsQ29udGV4dAorICB2b2lkIGJ1aWxkRG9taW5hdG9yVHJlZShBbmFseXNpc0RlY2xDb250ZXh0ICZBQykgeworICAgIGNmZyA9IEFDLmdldENGRygpOworICAgIERULT5yZWNhbGN1bGF0ZSgqY2ZnKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2QgZHVtcHMgaW1tZWRpYXRlIGRvbWluYXRvcnMgZm9yIGVhY2ggYmxvY2ssCisgIC8vLyBtYWlubHkgdXNlZCBmb3IgZGVidWcgcHVycG9zZXMuCisgIHZvaWQgZHVtcCgpIHsKKyAgICBsbHZtOjplcnJzKCkgPDwgIkltbWVkaWF0ZSBkb21pbmFuY2UgdHJlZSAoTm9kZSMsSURvbSMpOlxuIjsKKyAgICBmb3IgKENGRzo6Y29uc3RfaXRlcmF0b3IgSSA9IGNmZy0+YmVnaW4oKSwKKyAgICAgICAgRSA9IGNmZy0+ZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBpZihEVC0+Z2V0Tm9kZSgqSSktPmdldElEb20oKSkKKyAgICAgICAgbGx2bTo6ZXJycygpIDw8ICIoIiA8PCAoKkkpLT5nZXRCbG9ja0lEKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIsIgorICAgICAgICAgICAgICAgICAgICAgPDwgRFQtPmdldE5vZGUoKkkpLT5nZXRJRG9tKCktPmdldEJsb2NrKCktPmdldEJsb2NrSUQoKQorICAgICAgICAgICAgICAgICAgICAgPDwgIilcbiI7CisgICAgICBlbHNlIGxsdm06OmVycnMoKSA8PCAiKCIgPDwgKCpJKS0+Z2V0QmxvY2tJRCgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCIgPDwgKCpJKS0+Z2V0QmxvY2tJRCgpIDw8ICIpXG4iOworICAgIH0KKyAgfQorCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2QgdGVzdHMgaWYgb25lIENGR0Jsb2NrIGRvbWluYXRlcyB0aGUgb3RoZXIuCisgIC8vLyBUaGUgbWV0aG9kIHJldHVybiB0cnVlIGlmIEEgZG9taW5hdGVzIEIsIGZhbHNlIG90aGVyd2lzZS4KKyAgLy8vIE5vdGUgYSBibG9jayBhbHdheXMgZG9taW5hdGVzIGl0c2VsZi4KKyAgYm9vbCBkb21pbmF0ZXMoY29uc3QgQ0ZHQmxvY2sgKkEsIGNvbnN0IENGR0Jsb2NrICpCKSBjb25zdCB7CisgICAgcmV0dXJuIERULT5kb21pbmF0ZXMoQSwgQik7CisgIH0KKworICAvLy8gXGJyaWVmIFRoaXMgbWV0aG9kIHRlc3RzIGlmIG9uZSBDRkdCbG9jayBwcm9wZXJseSBkb21pbmF0ZXMgdGhlIG90aGVyLgorICAvLy8gVGhlIG1ldGhvZCByZXR1cm4gdHJ1ZSBpZiBBIHByb3Blcmx5IGRvbWluYXRlcyBCLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgcHJvcGVybHlEb21pbmF0ZXMoY29uc3QgQ0ZHQmxvY2sgKkEsIGNvbnN0IENGR0Jsb2NrICpCKSBjb25zdCB7CisgICAgcmV0dXJuIERULT5wcm9wZXJseURvbWluYXRlcyhBLCBCKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2QgZmluZHMgdGhlIG5lYXJlc3QgY29tbW9uIGRvbWluYXRvciBDRkcgYmxvY2sKKyAgLy8vIGZvciBDRkcgYmxvY2sgQSBhbmQgQi4gSWYgdGhlcmUgaXMgbm8gc3VjaCBibG9jayB0aGVuIHJldHVybiBOVUxMLgorICBDRkdCbG9jayAqZmluZE5lYXJlc3RDb21tb25Eb21pbmF0b3IoQ0ZHQmxvY2sgKkEsIENGR0Jsb2NrICpCKSB7CisgICAgcmV0dXJuIERULT5maW5kTmVhcmVzdENvbW1vbkRvbWluYXRvcihBLCBCKTsKKyAgfQorCisgIGNvbnN0IENGR0Jsb2NrICpmaW5kTmVhcmVzdENvbW1vbkRvbWluYXRvcihjb25zdCBDRkdCbG9jayAqQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGR0Jsb2NrICpCKSB7CisgICAgcmV0dXJuIERULT5maW5kTmVhcmVzdENvbW1vbkRvbWluYXRvcihBLCBCKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2QgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGRvbWluYXRvcgorICAvLy8gdHJlZSBpbmZvcm1hdGlvbiB3aGVuIGEgbm9kZSdzIGltbWVkaWF0ZSBkb21pbmF0b3IgY2hhbmdlcy4KKyAgdm9pZCBjaGFuZ2VJbW1lZGlhdGVEb21pbmF0b3IoQ0ZHQmxvY2sgKk4sIENGR0Jsb2NrICpOZXdJRG9tKSB7CisgICAgRFQtPmNoYW5nZUltbWVkaWF0ZURvbWluYXRvcihOLCBOZXdJRG9tKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2QgdGVzdHMgaWYgdGhlIGdpdmVuIENGR0Jsb2NrIGNhbiBiZSByZWFjaGFibGUgZnJvbSByb290LgorICAvLy8gUmV0dXJucyB0cnVlIGlmIHJlYWNoYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGlzUmVhY2hhYmxlRnJvbUVudHJ5KGNvbnN0IENGR0Jsb2NrICpBKSB7CisgICAgcmV0dXJuIERULT5pc1JlYWNoYWJsZUZyb21FbnRyeShBKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2QgcmVsZWFzZXMgdGhlIG1lbW9yeSBoZWxkIGJ5IHRoZSBkb21pbmF0b3IgdHJlZS4KKyAgdmlydHVhbCB2b2lkIHJlbGVhc2VNZW1vcnkoKSB7CisgICAgRFQtPnJlbGVhc2VNZW1vcnkoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2QgY29udmVydHMgdGhlIGRvbWluYXRvciB0cmVlIHRvIGh1bWFuIHJlYWRhYmxlIGZvcm0uCisgIHZpcnR1YWwgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IGxsdm06Ok1vZHVsZSogTT0gbnVsbHB0cikgY29uc3QgeworICAgIERULT5wcmludChPUyk7CisgIH0KKworcHJpdmF0ZToKKyAgQ0ZHICpjZmc7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLyBEb21pbmF0b3JUcmVlIEdyYXBoVHJhaXRzIHNwZWNpYWxpemF0aW9uIHNvIHRoZSBEb21pbmF0b3JUcmVlIGNhbiBiZQorLy8vIGl0ZXJhYmxlIGJ5IGdlbmVyaWMgZ3JhcGggaXRlcmF0b3JzLgorLy8vCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czwgOjpjbGFuZzo6RG9tVHJlZU5vZGUqID4geworICB1c2luZyBOb2RlUmVmID0gOjpjbGFuZzo6RG9tVHJlZU5vZGUgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSA6OmNsYW5nOjpEb21UcmVlTm9kZTo6aXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKE5vZGVSZWYgTikgeyByZXR1cm4gTjsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7IHJldHVybiBOLT5iZWdpbigpOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBOLT5lbmQoKTsgfQorCisgIHVzaW5nIG5vZGVzX2l0ZXJhdG9yID0KKyAgICAgIGxsdm06OnBvaW50ZXJfaXRlcmF0b3I8ZGZfaXRlcmF0b3I8OjpjbGFuZzo6RG9tVHJlZU5vZGUgKj4+OworCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbig6OmNsYW5nOjpEb21UcmVlTm9kZSAqTikgeworICAgIHJldHVybiBub2Rlc19pdGVyYXRvcihkZl9iZWdpbihnZXRFbnRyeU5vZGUoTikpKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoOjpjbGFuZzo6RG9tVHJlZU5vZGUgKk4pIHsKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3IoZGZfZW5kKGdldEVudHJ5Tm9kZShOKSkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8IDo6Y2xhbmc6OkRvbWluYXRvclRyZWUqID4KKyAgICA6IHB1YmxpYyBHcmFwaFRyYWl0czwgOjpjbGFuZzo6RG9tVHJlZU5vZGUqID4geworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoOjpjbGFuZzo6RG9taW5hdG9yVHJlZSAqRFQpIHsKKyAgICByZXR1cm4gRFQtPmdldFJvb3ROb2RlKCk7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oOjpjbGFuZzo6RG9taW5hdG9yVHJlZSAqTikgeworICAgIHJldHVybiBub2Rlc19pdGVyYXRvcihkZl9iZWdpbihnZXRFbnRyeU5vZGUoTikpKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoOjpjbGFuZzo6RG9taW5hdG9yVHJlZSAqTikgeworICAgIHJldHVybiBub2Rlc19pdGVyYXRvcihkZl9lbmQoZ2V0RW50cnlOb2RlKE4pKSk7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQU5BTFlTSVNfQU5BTFlTRVNfRE9NSU5BVE9SU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9Gb3JtYXRTdHJpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL0Zvcm1hdFN0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNTMxZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9Gb3JtYXRTdHJpbmcuaApAQCAtMCwwICsxLDY5NiBAQAorLy89IEZvcm1hdFN0cmluZy5oIC0gQW5hbHlzaXMgb2YgcHJpbnRmL2ZwcmludGYgZm9ybWF0IHN0cmluZ3MgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBBUElzIGZvciBhbmFseXppbmcgdGhlIGZvcm1hdCBzdHJpbmdzIG9mIHByaW50ZiwgZnNjYW5mLAorLy8gYW5kIGZyaWVuZHMuCisvLworLy8gVGhlIHN0cnVjdHVyZSBvZiBmb3JtYXQgc3RyaW5ncyBmb3IgZnByaW50ZiBhcmUgZGVzY3JpYmVkIGluIEM5OSA3LjE5LjYuMS4KKy8vCisvLyBUaGUgc3RydWN0dXJlIG9mIGZvcm1hdCBzdHJpbmdzIGZvciBmc2NhbmYgYXJlIGRlc2NyaWJlZCBpbiBDOTkgNy4xOS42LjIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FOQUxZU0lTX0FOQUxZU0VTX0ZPUk1BVFNUUklOR19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQU5BTFlTSVNfQU5BTFlTRVNfRk9STUFUU1RSSU5HX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9DYW5vbmljYWxUeXBlLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIFRhcmdldEluZm87CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQ29tbW9uIGNvbXBvbmVudHMgb2YgYm90aCBmcHJpbnRmIGFuZCBmc2NhbmYgZm9ybWF0IHN0cmluZ3MuCituYW1lc3BhY2UgYW5hbHl6ZV9mb3JtYXRfc3RyaW5nIHsKKworLy8vIENsYXNzIHJlcHJlc2VudGluZyBvcHRpb25hbCBmbGFncyB3aXRoIGxvY2F0aW9uIGFuZCByZXByZXNlbnRhdGlvbgorLy8vIGluZm9ybWF0aW9uLgorY2xhc3MgT3B0aW9uYWxGbGFnIHsKK3B1YmxpYzoKKyAgT3B0aW9uYWxGbGFnKGNvbnN0IGNoYXIgKlJlcHJlc2VudGF0aW9uKQorICAgICAgOiByZXByZXNlbnRhdGlvbihSZXByZXNlbnRhdGlvbiksIGZsYWcoZmFsc2UpIHt9CisgIGJvb2wgaXNTZXQoKSBjb25zdCB7IHJldHVybiBmbGFnOyB9CisgIHZvaWQgc2V0KCkgeyBmbGFnID0gdHJ1ZTsgfQorICB2b2lkIGNsZWFyKCkgeyBmbGFnID0gZmFsc2U7IH0KKyAgdm9pZCBzZXRQb3NpdGlvbihjb25zdCBjaGFyICpwb3NpdGlvbikgeworICAgIGFzc2VydChwb3NpdGlvbik7CisgICAgZmxhZyA9IHRydWU7CisgICAgdGhpcy0+cG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgfQorICBjb25zdCBjaGFyICpnZXRQb3NpdGlvbigpIGNvbnN0IHsKKyAgICBhc3NlcnQocG9zaXRpb24pOworICAgIHJldHVybiBwb3NpdGlvbjsKKyAgfQorICBjb25zdCBjaGFyICp0b1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIHJlcHJlc2VudGF0aW9uOyB9CisKKyAgLy8gT3ZlcmxvYWRlZCBvcGVyYXRvcnMgZm9yIGJvb2wgbGlrZSBxdWFsaXRpZXMKKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGZsYWc7IH0KKyAgT3B0aW9uYWxGbGFnJiBvcGVyYXRvcj0oY29uc3QgYm9vbCAmcmhzKSB7CisgICAgZmxhZyA9IHJoczsKKyAgICByZXR1cm4gKnRoaXM7ICAvLyBSZXR1cm4gYSByZWZlcmVuY2UgdG8gbXlzZWxmLgorICB9Citwcml2YXRlOgorICBjb25zdCBjaGFyICpyZXByZXNlbnRhdGlvbjsKKyAgY29uc3QgY2hhciAqcG9zaXRpb247CisgIGJvb2wgZmxhZzsKK307CisKKy8vLyBSZXByZXNlbnRzIHRoZSBsZW5ndGggbW9kaWZpZXIgaW4gYSBmb3JtYXQgc3RyaW5nIGluIHNjYW5mL3ByaW50Zi4KK2NsYXNzIExlbmd0aE1vZGlmaWVyIHsKK3B1YmxpYzoKKyAgZW51bSBLaW5kIHsKKyAgICBOb25lLAorICAgIEFzQ2hhciwgICAgICAgLy8gJ2hoJworICAgIEFzU2hvcnQsICAgICAgLy8gJ2gnCisgICAgQXNMb25nLCAgICAgICAvLyAnbCcKKyAgICBBc0xvbmdMb25nLCAgIC8vICdsbCcKKyAgICBBc1F1YWQsICAgICAgIC8vICdxJyAoQlNELCBkZXByZWNhdGVkLCBmb3IgNjQtYml0IGludGVnZXIgdHlwZXMpCisgICAgQXNJbnRNYXgsICAgICAvLyAnaicKKyAgICBBc1NpemVULCAgICAgIC8vICd6JworICAgIEFzUHRyRGlmZiwgICAgLy8gJ3QnCisgICAgQXNJbnQzMiwgICAgICAvLyAnSTMyJyAoTVNWQ1JULCBsaWtlIF9faW50MzIpCisgICAgQXNJbnQzMjY0LCAgICAvLyAnSScgICAoTVNWQ1JULCBsaWtlIF9faW50MzI2NCBmcm9tIE1JREwpCisgICAgQXNJbnQ2NCwgICAgICAvLyAnSTY0JyAoTVNWQ1JULCBsaWtlIF9faW50NjQpCisgICAgQXNMb25nRG91YmxlLCAvLyAnTCcKKyAgICBBc0FsbG9jYXRlLCAgIC8vIGZvciAnJWFzJywgR05VIGV4dGVuc2lvbiB0byBDOTAgc2NhbmYKKyAgICBBc01BbGxvY2F0ZSwgIC8vIGZvciAnJW1zJywgR05VIGV4dGVuc2lvbiB0byBzY2FuZgorICAgIEFzV2lkZSwgICAgICAgLy8gJ3cnIChNU1ZDUlQsIGxpa2UgbCBidXQgb25seSBmb3IgYywgQywgcywgUywgb3IgWgorICAgIEFzV2lkZUNoYXIgPSBBc0xvbmcgLy8gZm9yICclbHMnLCBvbmx5IG1ha2VzIHNlbnNlIGZvciBwcmludGYKKyAgfTsKKworICBMZW5ndGhNb2RpZmllcigpCisgICAgOiBQb3NpdGlvbihudWxscHRyKSwga2luZChOb25lKSB7fQorICBMZW5ndGhNb2RpZmllcihjb25zdCBjaGFyICpwb3MsIEtpbmQgaykKKyAgICA6IFBvc2l0aW9uKHBvcyksIGtpbmQoaykge30KKworICBjb25zdCBjaGFyICpnZXRTdGFydCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUG9zaXRpb247CisgIH0KKworICB1bnNpZ25lZCBnZXRMZW5ndGgoKSBjb25zdCB7CisgICAgc3dpdGNoIChraW5kKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMTsKKyAgICAgIGNhc2UgQXNMb25nTG9uZzoKKyAgICAgIGNhc2UgQXNDaGFyOgorICAgICAgICByZXR1cm4gMjsKKyAgICAgIGNhc2UgQXNJbnQzMjoKKyAgICAgIGNhc2UgQXNJbnQ2NDoKKyAgICAgICAgcmV0dXJuIDM7CisgICAgICBjYXNlIE5vbmU6CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIGtpbmQ7IH0KKyAgdm9pZCBzZXRLaW5kKEtpbmQgaykgeyBraW5kID0gazsgfQorCisgIGNvbnN0IGNoYXIgKnRvU3RyaW5nKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGNvbnN0IGNoYXIgKlBvc2l0aW9uOworICBLaW5kIGtpbmQ7Cit9OworCitjbGFzcyBDb252ZXJzaW9uU3BlY2lmaWVyIHsKK3B1YmxpYzoKKyAgZW51bSBLaW5kIHsKKyAgICBJbnZhbGlkU3BlY2lmaWVyID0gMCwKKyAgICAvLyBDOTkgY29udmVyc2lvbiBzcGVjaWZpZXJzLgorICAgIGNBcmcsCisgICAgZEFyZywKKyAgICBEQXJnLCAvLyBBcHBsZSBleHRlbnNpb24KKyAgICBpQXJnLAorICAgIEludEFyZ0JlZyA9IGRBcmcsCisgICAgSW50QXJnRW5kID0gaUFyZywKKworICAgIG9BcmcsCisgICAgT0FyZywgLy8gQXBwbGUgZXh0ZW5zaW9uCisgICAgdUFyZywKKyAgICBVQXJnLCAvLyBBcHBsZSBleHRlbnNpb24KKyAgICB4QXJnLAorICAgIFhBcmcsCisgICAgVUludEFyZ0JlZyA9IG9BcmcsCisgICAgVUludEFyZ0VuZCA9IFhBcmcsCisKKyAgICBmQXJnLAorICAgIEZBcmcsCisgICAgZUFyZywKKyAgICBFQXJnLAorICAgIGdBcmcsCisgICAgR0FyZywKKyAgICBhQXJnLAorICAgIEFBcmcsCisgICAgRG91YmxlQXJnQmVnID0gZkFyZywKKyAgICBEb3VibGVBcmdFbmQgPSBBQXJnLAorCisgICAgc0FyZywKKyAgICBwQXJnLAorICAgIG5BcmcsCisgICAgUGVyY2VudEFyZywKKyAgICBDQXJnLAorICAgIFNBcmcsCisKKyAgICAvLyBBcHBsZSBleHRlbnNpb246IFAgc3BlY2lmaWVzIHRvIG9zX2xvZyB0aGF0IHRoZSBkYXRhIGJlaW5nIHBvaW50ZWQgdG8gaXMKKyAgICAvLyB0byBiZSBjb3BpZWQgYnkgb3NfbG9nLiBUaGUgcHJlY2lzaW9uIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvCisgICAgLy8gY29weS4KKyAgICBQQXJnLAorCisgICAgLy8gKiogUHJpbnRmLXNwZWNpZmljICoqCisKKyAgICBaQXJnLCAvLyBNUyBleHRlbnNpb24KKworICAgIC8vIE9iamVjdGl2ZS1DIHNwZWNpZmljIHNwZWNpZmllcnMuCisgICAgT2JqQ09iakFyZywgLy8gJ0AnCisgICAgT2JqQ0JlZyA9IE9iakNPYmpBcmcsCisgICAgT2JqQ0VuZCA9IE9iakNPYmpBcmcsCisKKyAgICAvLyBGcmVlQlNEIGtlcm5lbCBzcGVjaWZpYyBzcGVjaWZpZXJzLgorICAgIEZyZWVCU0RiQXJnLAorICAgIEZyZWVCU0REQXJnLAorICAgIEZyZWVCU0RyQXJnLAorICAgIEZyZWVCU0R5QXJnLAorCisgICAgLy8gR2xpYkMgc3BlY2lmaWMgc3BlY2lmaWVycy4KKyAgICBQcmludEVycm5vLCAvLyAnbScKKworICAgIFByaW50ZkNvbnZCZWcgPSBPYmpDT2JqQXJnLAorICAgIFByaW50ZkNvbnZFbmQgPSBQcmludEVycm5vLAorCisgICAgLy8gKiogU2NhbmYtc3BlY2lmaWMgKioKKyAgICBTY2FuTGlzdEFyZywgLy8gJ1snCisgICAgU2NhbmZDb252QmVnID0gU2Nhbkxpc3RBcmcsCisgICAgU2NhbmZDb252RW5kID0gU2Nhbkxpc3RBcmcKKyAgfTsKKworICBDb252ZXJzaW9uU3BlY2lmaWVyKGJvb2wgaXNQcmludGYgPSB0cnVlKQorICAgIDogSXNQcmludGYoaXNQcmludGYpLCBQb3NpdGlvbihudWxscHRyKSwgRW5kU2Nhbkxpc3QobnVsbHB0ciksCisgICAgICBraW5kKEludmFsaWRTcGVjaWZpZXIpIHt9CisKKyAgQ29udmVyc2lvblNwZWNpZmllcihib29sIGlzUHJpbnRmLCBjb25zdCBjaGFyICpwb3MsIEtpbmQgaykKKyAgICA6IElzUHJpbnRmKGlzUHJpbnRmKSwgUG9zaXRpb24ocG9zKSwgRW5kU2Nhbkxpc3QobnVsbHB0ciksIGtpbmQoaykge30KKworICBjb25zdCBjaGFyICpnZXRTdGFydCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUG9zaXRpb247CisgIH0KKworICBTdHJpbmdSZWYgZ2V0Q2hhcmFjdGVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RyaW5nUmVmKGdldFN0YXJ0KCksIGdldExlbmd0aCgpKTsKKyAgfQorCisgIGJvb2wgY29uc3VtZXNEYXRhQXJndW1lbnQoKSBjb25zdCB7CisgICAgc3dpdGNoIChraW5kKSB7CisgICAgICBjYXNlIFByaW50RXJybm86CisgICAgICAgIGFzc2VydChJc1ByaW50Zik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGNhc2UgUGVyY2VudEFyZzoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgY2FzZSBJbnZhbGlkU3BlY2lmaWVyOgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBraW5kOyB9CisgIHZvaWQgc2V0S2luZChLaW5kIGspIHsga2luZCA9IGs7IH0KKyAgdW5zaWduZWQgZ2V0TGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiBFbmRTY2FuTGlzdCA/IEVuZFNjYW5MaXN0IC0gUG9zaXRpb24gOiAxOworICB9CisgIHZvaWQgc2V0RW5kU2Nhbkxpc3QoY29uc3QgY2hhciAqcG9zKSB7IEVuZFNjYW5MaXN0ID0gcG9zOyB9CisKKyAgYm9vbCBpc0ludEFyZygpIGNvbnN0IHsgcmV0dXJuIChraW5kID49IEludEFyZ0JlZyAmJiBraW5kIDw9IEludEFyZ0VuZCkgfHwKKyAgICBraW5kID09IEZyZWVCU0RyQXJnIHx8IGtpbmQgPT0gRnJlZUJTRHlBcmc7IH0KKyAgYm9vbCBpc1VJbnRBcmcoKSBjb25zdCB7IHJldHVybiBraW5kID49IFVJbnRBcmdCZWcgJiYga2luZCA8PSBVSW50QXJnRW5kOyB9CisgIGJvb2wgaXNBbnlJbnRBcmcoKSBjb25zdCB7IHJldHVybiBraW5kID49IEludEFyZ0JlZyAmJiBraW5kIDw9IFVJbnRBcmdFbmQ7IH0KKyAgYm9vbCBpc0RvdWJsZUFyZygpIGNvbnN0IHsKKyAgICByZXR1cm4ga2luZCA+PSBEb3VibGVBcmdCZWcgJiYga2luZCA8PSBEb3VibGVBcmdFbmQ7CisgIH0KKworICBjb25zdCBjaGFyICp0b1N0cmluZygpIGNvbnN0OworCisgIGJvb2wgaXNQcmludGZLaW5kKCkgY29uc3QgeyByZXR1cm4gSXNQcmludGY7IH0KKyAgCisgIE9wdGlvbmFsPENvbnZlcnNpb25TcGVjaWZpZXI+IGdldFN0YW5kYXJkU3BlY2lmaWVyKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgYm9vbCBJc1ByaW50ZjsKKyAgY29uc3QgY2hhciAqUG9zaXRpb247CisgIGNvbnN0IGNoYXIgKkVuZFNjYW5MaXN0OworICBLaW5kIGtpbmQ7Cit9OworCitjbGFzcyBBcmdUeXBlIHsKK3B1YmxpYzoKKyAgZW51bSBLaW5kIHsgVW5rbm93blR5LCBJbnZhbGlkVHksIFNwZWNpZmljVHksIE9iakNQb2ludGVyVHksIENQb2ludGVyVHksCisgICAgICAgICAgICAgIEFueUNoYXJUeSwgQ1N0clR5LCBXQ1N0clR5LCBXSW50VHkgfTsKKworICBlbnVtIE1hdGNoS2luZCB7IE5vTWF0Y2ggPSAwLCBNYXRjaCA9IDEsIE5vTWF0Y2hQZWRhbnRpYyB9OworCitwcml2YXRlOgorICBjb25zdCBLaW5kIEs7CisgIFF1YWxUeXBlIFQ7CisgIGNvbnN0IGNoYXIgKk5hbWU7CisgIGJvb2wgUHRyOworcHVibGljOgorICBBcmdUeXBlKEtpbmQgayA9IFVua25vd25UeSwgY29uc3QgY2hhciAqbiA9IG51bGxwdHIpCisgICAgICA6IEsoayksIE5hbWUobiksIFB0cihmYWxzZSkge30KKyAgQXJnVHlwZShRdWFsVHlwZSB0LCBjb25zdCBjaGFyICpuID0gbnVsbHB0cikKKyAgICAgIDogSyhTcGVjaWZpY1R5KSwgVCh0KSwgTmFtZShuKSwgUHRyKGZhbHNlKSB7fQorICBBcmdUeXBlKENhblF1YWxUeXBlIHQpIDogSyhTcGVjaWZpY1R5KSwgVCh0KSwgTmFtZShudWxscHRyKSwgUHRyKGZhbHNlKSB7fQorCisgIHN0YXRpYyBBcmdUeXBlIEludmFsaWQoKSB7IHJldHVybiBBcmdUeXBlKEludmFsaWRUeSk7IH0KKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gSyAhPSBJbnZhbGlkVHk7IH0KKworICAvLy8gQ3JlYXRlIGFuIEFyZ1R5cGUgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHR5cGUgcG9pbnRlciB0byBBLgorICBzdGF0aWMgQXJnVHlwZSBQdHJUbyhjb25zdCBBcmdUeXBlJiBBKSB7CisgICAgYXNzZXJ0KEEuSyA+PSBJbnZhbGlkVHkgJiYgIkFyZ1R5cGUgY2Fubm90IGJlIHBvaW50ZXIgdG8gaW52YWxpZC91bmtub3duIik7CisgICAgQXJnVHlwZSBSZXMgPSBBOworICAgIFJlcy5QdHIgPSB0cnVlOworICAgIHJldHVybiBSZXM7CisgIH0KKworICBNYXRjaEtpbmQgbWF0Y2hlc1R5cGUoQVNUQ29udGV4dCAmQywgUXVhbFR5cGUgYXJnVHkpIGNvbnN0OworCisgIFF1YWxUeXBlIGdldFJlcHJlc2VudGF0aXZlVHlwZShBU1RDb250ZXh0ICZDKSBjb25zdDsKKworICBzdGQ6OnN0cmluZyBnZXRSZXByZXNlbnRhdGl2ZVR5cGVOYW1lKEFTVENvbnRleHQgJkMpIGNvbnN0OworfTsKKworY2xhc3MgT3B0aW9uYWxBbW91bnQgeworcHVibGljOgorICBlbnVtIEhvd1NwZWNpZmllZCB7IE5vdFNwZWNpZmllZCwgQ29uc3RhbnQsIEFyZywgSW52YWxpZCB9OworCisgIE9wdGlvbmFsQW1vdW50KEhvd1NwZWNpZmllZCBob3dTcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFtb3VudCwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYW1vdW50U3RhcnQsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFtb3VudExlbmd0aCwKKyAgICAgICAgICAgICAgICAgYm9vbCB1c2VzUG9zaXRpb25hbEFyZykKKyAgOiBzdGFydChhbW91bnRTdGFydCksIGxlbmd0aChhbW91bnRMZW5ndGgpLCBocyhob3dTcGVjaWZpZWQpLCBhbXQoYW1vdW50KSwKKyAgVXNlc1Bvc2l0aW9uYWxBcmcodXNlc1Bvc2l0aW9uYWxBcmcpLCBVc2VzRG90UHJlZml4KDApIHt9CisKKyAgT3B0aW9uYWxBbW91bnQoYm9vbCB2YWxpZCA9IHRydWUpCisgIDogc3RhcnQobnVsbHB0ciksbGVuZ3RoKDApLCBocyh2YWxpZCA/IE5vdFNwZWNpZmllZCA6IEludmFsaWQpLCBhbXQoMCksCisgIFVzZXNQb3NpdGlvbmFsQXJnKDApLCBVc2VzRG90UHJlZml4KDApIHt9CisKKyAgYm9vbCBpc0ludmFsaWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGhzID09IEludmFsaWQ7CisgIH0KKworICBIb3dTcGVjaWZpZWQgZ2V0SG93U3BlY2lmaWVkKCkgY29uc3QgeyByZXR1cm4gaHM7IH0KKyAgdm9pZCBzZXRIb3dTcGVjaWZpZWQoSG93U3BlY2lmaWVkIGgpIHsgaHMgPSBoOyB9CisKKyAgYm9vbCBoYXNEYXRhQXJndW1lbnQoKSBjb25zdCB7IHJldHVybiBocyA9PSBBcmc7IH0KKworICB1bnNpZ25lZCBnZXRBcmdJbmRleCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaGFzRGF0YUFyZ3VtZW50KCkpOworICAgIHJldHVybiBhbXQ7CisgIH0KKworICB1bnNpZ25lZCBnZXRDb25zdGFudEFtb3VudCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaHMgPT0gQ29uc3RhbnQpOworICAgIHJldHVybiBhbXQ7CisgIH0KKworICBjb25zdCBjaGFyICpnZXRTdGFydCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIGluY2x1ZGUgdGhlIC4gY2hhcmFjdGVyIGlmIGl0IGlzIGdpdmVuLgorICAgIHJldHVybiBzdGFydCAtIFVzZXNEb3RQcmVmaXg7CisgIH0KKworICB1bnNpZ25lZCBnZXRDb25zdGFudExlbmd0aCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaHMgPT0gQ29uc3RhbnQpOworICAgIHJldHVybiBsZW5ndGggKyBVc2VzRG90UHJlZml4OworICB9CisKKyAgQXJnVHlwZSBnZXRBcmdUeXBlKEFTVENvbnRleHQgJkN0eCkgY29uc3Q7CisKKyAgdm9pZCB0b1N0cmluZyhyYXdfb3N0cmVhbSAmb3MpIGNvbnN0OworCisgIGJvb2wgdXNlc1Bvc2l0aW9uYWxBcmcoKSBjb25zdCB7IHJldHVybiAoYm9vbCkgVXNlc1Bvc2l0aW9uYWxBcmc7IH0KKyAgdW5zaWduZWQgZ2V0UG9zaXRpb25hbEFyZ0luZGV4KCkgY29uc3QgeworICAgIGFzc2VydChoYXNEYXRhQXJndW1lbnQoKSk7CisgICAgcmV0dXJuIGFtdCArIDE7CisgIH0KKworICBib29sIHVzZXNEb3RQcmVmaXgoKSBjb25zdCB7IHJldHVybiBVc2VzRG90UHJlZml4OyB9CisgIHZvaWQgc2V0VXNlc0RvdFByZWZpeCgpIHsgVXNlc0RvdFByZWZpeCA9IHRydWU7IH0KKworcHJpdmF0ZToKKyAgY29uc3QgY2hhciAqc3RhcnQ7CisgIHVuc2lnbmVkIGxlbmd0aDsKKyAgSG93U3BlY2lmaWVkIGhzOworICB1bnNpZ25lZCBhbXQ7CisgIGJvb2wgVXNlc1Bvc2l0aW9uYWxBcmcgOiAxOworICBib29sIFVzZXNEb3RQcmVmaXg7Cit9OworCisKK2NsYXNzIEZvcm1hdFNwZWNpZmllciB7Citwcm90ZWN0ZWQ6CisgIExlbmd0aE1vZGlmaWVyIExNOworICBPcHRpb25hbEFtb3VudCBGaWVsZFdpZHRoOworICBDb252ZXJzaW9uU3BlY2lmaWVyIENTOworICAvLy8gUG9zaXRpb25hbCBhcmd1bWVudHMsIGFuIElFRUUgZXh0ZW5zaW9uOgorICAvLy8gIElFRUUgU3RkIDEwMDMuMSwgMjAwNCBFZGl0aW9uCisgIC8vLyAgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L2Z1bmN0aW9ucy9wcmludGYuaHRtbAorICBib29sIFVzZXNQb3NpdGlvbmFsQXJnOworICB1bnNpZ25lZCBhcmdJbmRleDsKK3B1YmxpYzoKKyAgRm9ybWF0U3BlY2lmaWVyKGJvb2wgaXNQcmludGYpCisgICAgOiBDUyhpc1ByaW50ZiksIFVzZXNQb3NpdGlvbmFsQXJnKGZhbHNlKSwgYXJnSW5kZXgoMCkge30KKworICB2b2lkIHNldExlbmd0aE1vZGlmaWVyKExlbmd0aE1vZGlmaWVyIGxtKSB7CisgICAgTE0gPSBsbTsKKyAgfQorCisgIHZvaWQgc2V0VXNlc1Bvc2l0aW9uYWxBcmcoKSB7IFVzZXNQb3NpdGlvbmFsQXJnID0gdHJ1ZTsgfQorCisgIHZvaWQgc2V0QXJnSW5kZXgodW5zaWduZWQgaSkgeworICAgIGFyZ0luZGV4ID0gaTsKKyAgfQorCisgIHVuc2lnbmVkIGdldEFyZ0luZGV4KCkgY29uc3QgeworICAgIHJldHVybiBhcmdJbmRleDsKKyAgfQorCisgIHVuc2lnbmVkIGdldFBvc2l0aW9uYWxBcmdJbmRleCgpIGNvbnN0IHsKKyAgICByZXR1cm4gYXJnSW5kZXggKyAxOworICB9CisKKyAgY29uc3QgTGVuZ3RoTW9kaWZpZXIgJmdldExlbmd0aE1vZGlmaWVyKCkgY29uc3QgeworICAgIHJldHVybiBMTTsKKyAgfQorCisgIGNvbnN0IE9wdGlvbmFsQW1vdW50ICZnZXRGaWVsZFdpZHRoKCkgY29uc3QgeworICAgIHJldHVybiBGaWVsZFdpZHRoOworICB9CisKKyAgdm9pZCBzZXRGaWVsZFdpZHRoKGNvbnN0IE9wdGlvbmFsQW1vdW50ICZBbXQpIHsKKyAgICBGaWVsZFdpZHRoID0gQW10OworICB9CisKKyAgYm9vbCB1c2VzUG9zaXRpb25hbEFyZygpIGNvbnN0IHsgcmV0dXJuIFVzZXNQb3NpdGlvbmFsQXJnOyB9CisKKyAgYm9vbCBoYXNWYWxpZExlbmd0aE1vZGlmaWVyKGNvbnN0IFRhcmdldEluZm8gJlRhcmdldCkgY29uc3Q7CisKKyAgYm9vbCBoYXNTdGFuZGFyZExlbmd0aE1vZGlmaWVyKCkgY29uc3Q7CisKKyAgT3B0aW9uYWw8TGVuZ3RoTW9kaWZpZXI+IGdldENvcnJlY3RlZExlbmd0aE1vZGlmaWVyKCkgY29uc3Q7CisKKyAgYm9vbCBoYXNTdGFuZGFyZENvbnZlcnNpb25TcGVjaWZpZXIoY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHQpIGNvbnN0OworCisgIGJvb2wgaGFzU3RhbmRhcmRMZW5ndGhDb252ZXJzaW9uQ29tYmluYXRpb24oKSBjb25zdDsKKworICAvLy8gRm9yIGEgVHlwZWRlZlR5cGUgUVQsIGlmIGl0IGlzIGEgbmFtZWQgaW50ZWdlciB0eXBlIHN1Y2ggYXMgc2l6ZV90LAorICAvLy8gYXNzaWduIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSB0byBMTSBhbmQgcmV0dXJuIHRydWUuCisgIHN0YXRpYyBib29sIG5hbWVkVHlwZVRvTGVuZ3RoTW9kaWZpZXIoUXVhbFR5cGUgUVQsIExlbmd0aE1vZGlmaWVyICZMTSk7Cit9OworCit9IC8vIGVuZCBhbmFseXplX2Zvcm1hdF9zdHJpbmcgbmFtZXNwYWNlCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gUGllY2VzIHNwZWNpZmljIHRvIGZwcmludGYgZm9ybWF0IHN0cmluZ3MuCisKK25hbWVzcGFjZSBhbmFseXplX3ByaW50ZiB7CisKK2NsYXNzIFByaW50ZkNvbnZlcnNpb25TcGVjaWZpZXIgOgorICBwdWJsaWMgYW5hbHl6ZV9mb3JtYXRfc3RyaW5nOjpDb252ZXJzaW9uU3BlY2lmaWVyICB7CitwdWJsaWM6CisgIFByaW50ZkNvbnZlcnNpb25TcGVjaWZpZXIoKQorICAgIDogQ29udmVyc2lvblNwZWNpZmllcih0cnVlLCBudWxscHRyLCBJbnZhbGlkU3BlY2lmaWVyKSB7fQorCisgIFByaW50ZkNvbnZlcnNpb25TcGVjaWZpZXIoY29uc3QgY2hhciAqcG9zLCBLaW5kIGspCisgICAgOiBDb252ZXJzaW9uU3BlY2lmaWVyKHRydWUsIHBvcywgaykge30KKworICBib29sIGlzT2JqQ0FyZygpIGNvbnN0IHsgcmV0dXJuIGtpbmQgPj0gT2JqQ0JlZyAmJiBraW5kIDw9IE9iakNFbmQ7IH0KKyAgYm9vbCBpc0RvdWJsZUFyZygpIGNvbnN0IHsgcmV0dXJuIGtpbmQgPj0gRG91YmxlQXJnQmVnICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kIDw9IERvdWJsZUFyZ0VuZDsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgYW5hbHl6ZV9mb3JtYXRfc3RyaW5nOjpDb252ZXJzaW9uU3BlY2lmaWVyICpDUykgeworICAgIHJldHVybiBDUy0+aXNQcmludGZLaW5kKCk7CisgIH0KK307CisKK3VzaW5nIGFuYWx5emVfZm9ybWF0X3N0cmluZzo6QXJnVHlwZTsKK3VzaW5nIGFuYWx5emVfZm9ybWF0X3N0cmluZzo6TGVuZ3RoTW9kaWZpZXI7Cit1c2luZyBhbmFseXplX2Zvcm1hdF9zdHJpbmc6Ok9wdGlvbmFsQW1vdW50OwordXNpbmcgYW5hbHl6ZV9mb3JtYXRfc3RyaW5nOjpPcHRpb25hbEZsYWc7CisKK2NsYXNzIFByaW50ZlNwZWNpZmllciA6IHB1YmxpYyBhbmFseXplX2Zvcm1hdF9zdHJpbmc6OkZvcm1hdFNwZWNpZmllciB7CisgIE9wdGlvbmFsRmxhZyBIYXNUaG91c2FuZHNHcm91cGluZzsgLy8gJycnLCBQT1NJWCBleHRlbnNpb24uCisgIE9wdGlvbmFsRmxhZyBJc0xlZnRKdXN0aWZpZWQ7IC8vICctJworICBPcHRpb25hbEZsYWcgSGFzUGx1c1ByZWZpeDsgLy8gJysnCisgIE9wdGlvbmFsRmxhZyBIYXNTcGFjZVByZWZpeDsgLy8gJyAnCisgIE9wdGlvbmFsRmxhZyBIYXNBbHRlcm5hdGl2ZUZvcm07IC8vICcjJworICBPcHRpb25hbEZsYWcgSGFzTGVhZGluZ1plcm9lczsgLy8gJzAnCisgIE9wdGlvbmFsRmxhZyBIYXNPYmpDVGVjaG5pY2FsVGVybTsgLy8gJ1t0dF0nCisgIE9wdGlvbmFsRmxhZyBJc1ByaXZhdGU7ICAgICAgICAgICAgLy8gJ3twcml2YXRlfScKKyAgT3B0aW9uYWxGbGFnIElzUHVibGljOyAgICAgICAgICAgICAvLyAne3B1YmxpY30nCisgIE9wdGlvbmFsQW1vdW50IFByZWNpc2lvbjsKK3B1YmxpYzoKKyAgUHJpbnRmU3BlY2lmaWVyKCkKKyAgICAgIDogRm9ybWF0U3BlY2lmaWVyKC8qIGlzUHJpbnRmID0gKi8gdHJ1ZSksIEhhc1Rob3VzYW5kc0dyb3VwaW5nKCInIiksCisgICAgICAgIElzTGVmdEp1c3RpZmllZCgiLSIpLCBIYXNQbHVzUHJlZml4KCIrIiksIEhhc1NwYWNlUHJlZml4KCIgIiksCisgICAgICAgIEhhc0FsdGVybmF0aXZlRm9ybSgiIyIpLCBIYXNMZWFkaW5nWmVyb2VzKCIwIiksCisgICAgICAgIEhhc09iakNUZWNobmljYWxUZXJtKCJ0dCIpLCBJc1ByaXZhdGUoInByaXZhdGUiKSwgSXNQdWJsaWMoInB1YmxpYyIpIHt9CisKKyAgc3RhdGljIFByaW50ZlNwZWNpZmllciBQYXJzZShjb25zdCBjaGFyICpiZWcsIGNvbnN0IGNoYXIgKmVuZCk7CisKKyAgICAvLyBNZXRob2RzIGZvciBpbmNyZW1lbnRhbGx5IGNvbnN0cnVjdGluZyB0aGUgUHJpbnRmU3BlY2lmaWVyLgorICB2b2lkIHNldENvbnZlcnNpb25TcGVjaWZpZXIoY29uc3QgUHJpbnRmQ29udmVyc2lvblNwZWNpZmllciAmY3MpIHsKKyAgICBDUyA9IGNzOworICB9CisgIHZvaWQgc2V0SGFzVGhvdXNhbmRzR3JvdXBpbmcoY29uc3QgY2hhciAqcG9zaXRpb24pIHsKKyAgICBIYXNUaG91c2FuZHNHcm91cGluZy5zZXRQb3NpdGlvbihwb3NpdGlvbik7CisgIH0KKyAgdm9pZCBzZXRJc0xlZnRKdXN0aWZpZWQoY29uc3QgY2hhciAqcG9zaXRpb24pIHsKKyAgICBJc0xlZnRKdXN0aWZpZWQuc2V0UG9zaXRpb24ocG9zaXRpb24pOworICB9CisgIHZvaWQgc2V0SGFzUGx1c1ByZWZpeChjb25zdCBjaGFyICpwb3NpdGlvbikgeworICAgIEhhc1BsdXNQcmVmaXguc2V0UG9zaXRpb24ocG9zaXRpb24pOworICB9CisgIHZvaWQgc2V0SGFzU3BhY2VQcmVmaXgoY29uc3QgY2hhciAqcG9zaXRpb24pIHsKKyAgICBIYXNTcGFjZVByZWZpeC5zZXRQb3NpdGlvbihwb3NpdGlvbik7CisgIH0KKyAgdm9pZCBzZXRIYXNBbHRlcm5hdGl2ZUZvcm0oY29uc3QgY2hhciAqcG9zaXRpb24pIHsKKyAgICBIYXNBbHRlcm5hdGl2ZUZvcm0uc2V0UG9zaXRpb24ocG9zaXRpb24pOworICB9CisgIHZvaWQgc2V0SGFzTGVhZGluZ1plcm9zKGNvbnN0IGNoYXIgKnBvc2l0aW9uKSB7CisgICAgSGFzTGVhZGluZ1plcm9lcy5zZXRQb3NpdGlvbihwb3NpdGlvbik7CisgIH0KKyAgdm9pZCBzZXRIYXNPYmpDVGVjaG5pY2FsVGVybShjb25zdCBjaGFyICpwb3NpdGlvbikgeworICAgIEhhc09iakNUZWNobmljYWxUZXJtLnNldFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgfQorICB2b2lkIHNldElzUHJpdmF0ZShjb25zdCBjaGFyICpwb3NpdGlvbikgeyBJc1ByaXZhdGUuc2V0UG9zaXRpb24ocG9zaXRpb24pOyB9CisgIHZvaWQgc2V0SXNQdWJsaWMoY29uc3QgY2hhciAqcG9zaXRpb24pIHsgSXNQdWJsaWMuc2V0UG9zaXRpb24ocG9zaXRpb24pOyB9CisgIHZvaWQgc2V0VXNlc1Bvc2l0aW9uYWxBcmcoKSB7IFVzZXNQb3NpdGlvbmFsQXJnID0gdHJ1ZTsgfQorCisgICAgLy8gTWV0aG9kcyBmb3IgcXVlcnlpbmcgdGhlIGZvcm1hdCBzcGVjaWZpZXIuCisKKyAgY29uc3QgUHJpbnRmQ29udmVyc2lvblNwZWNpZmllciAmZ2V0Q29udmVyc2lvblNwZWNpZmllcigpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxQcmludGZDb252ZXJzaW9uU3BlY2lmaWVyPihDUyk7CisgIH0KKworICB2b2lkIHNldFByZWNpc2lvbihjb25zdCBPcHRpb25hbEFtb3VudCAmQW10KSB7CisgICAgUHJlY2lzaW9uID0gQW10OworICAgIFByZWNpc2lvbi5zZXRVc2VzRG90UHJlZml4KCk7CisgIH0KKworICBjb25zdCBPcHRpb25hbEFtb3VudCAmZ2V0UHJlY2lzaW9uKCkgY29uc3QgeworICAgIHJldHVybiBQcmVjaXNpb247CisgIH0KKworICBib29sIGNvbnN1bWVzRGF0YUFyZ3VtZW50KCkgY29uc3QgeworICAgIHJldHVybiBnZXRDb252ZXJzaW9uU3BlY2lmaWVyKCkuY29uc3VtZXNEYXRhQXJndW1lbnQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgYnVpbHRpbiB0eXBlIHRoYXQgYSBkYXRhIGFyZ3VtZW50CisgIC8vLyBwYWlyZWQgd2l0aCB0aGlzIGZvcm1hdCBzcGVjaWZpZXIgc2hvdWxkIGhhdmUuICBUaGlzIG1ldGhvZAorICAvLy8gd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgZm9ybWF0IHNwZWNpZmllciBkb2VzIG5vdCBoYXZlCisgIC8vLyBhIG1hdGNoaW5nIGRhdGEgYXJndW1lbnQgb3IgdGhlIG1hdGNoaW5nIGFyZ3VtZW50IG1hdGNoZXMKKyAgLy8vIG1vcmUgdGhhbiBvbmUgdHlwZS4KKyAgQXJnVHlwZSBnZXRBcmdUeXBlKEFTVENvbnRleHQgJkN0eCwgYm9vbCBJc09iakNMaXRlcmFsKSBjb25zdDsKKworICBjb25zdCBPcHRpb25hbEZsYWcgJmhhc1Rob3VzYW5kc0dyb3VwaW5nKCkgY29uc3QgeworICAgICAgcmV0dXJuIEhhc1Rob3VzYW5kc0dyb3VwaW5nOworICB9CisgIGNvbnN0IE9wdGlvbmFsRmxhZyAmaXNMZWZ0SnVzdGlmaWVkKCkgY29uc3QgeyByZXR1cm4gSXNMZWZ0SnVzdGlmaWVkOyB9CisgIGNvbnN0IE9wdGlvbmFsRmxhZyAmaGFzUGx1c1ByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIEhhc1BsdXNQcmVmaXg7IH0KKyAgY29uc3QgT3B0aW9uYWxGbGFnICZoYXNBbHRlcm5hdGl2ZUZvcm0oKSBjb25zdCB7IHJldHVybiBIYXNBbHRlcm5hdGl2ZUZvcm07IH0KKyAgY29uc3QgT3B0aW9uYWxGbGFnICZoYXNMZWFkaW5nWmVyb3MoKSBjb25zdCB7IHJldHVybiBIYXNMZWFkaW5nWmVyb2VzOyB9CisgIGNvbnN0IE9wdGlvbmFsRmxhZyAmaGFzU3BhY2VQcmVmaXgoKSBjb25zdCB7IHJldHVybiBIYXNTcGFjZVByZWZpeDsgfQorICBjb25zdCBPcHRpb25hbEZsYWcgJmhhc09iakNUZWNobmljYWxUZXJtKCkgY29uc3QgeyByZXR1cm4gSGFzT2JqQ1RlY2huaWNhbFRlcm07IH0KKyAgY29uc3QgT3B0aW9uYWxGbGFnICZpc1ByaXZhdGUoKSBjb25zdCB7IHJldHVybiBJc1ByaXZhdGU7IH0KKyAgY29uc3QgT3B0aW9uYWxGbGFnICZpc1B1YmxpYygpIGNvbnN0IHsgcmV0dXJuIElzUHVibGljOyB9CisgIGJvb2wgdXNlc1Bvc2l0aW9uYWxBcmcoKSBjb25zdCB7IHJldHVybiBVc2VzUG9zaXRpb25hbEFyZzsgfQorCisgIC8vLyBDaGFuZ2VzIHRoZSBzcGVjaWZpZXIgYW5kIGxlbmd0aCBhY2NvcmRpbmcgdG8gYSBRdWFsVHlwZSwgcmV0YWluaW5nIGFueQorICAvLy8gZmxhZ3Mgb3Igb3B0aW9ucy4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIG9yIGZhbHNlIHdoZW4gYSBjb252ZXJzaW9uCisgIC8vLyB3YXMgbm90IHN1Y2Nlc3NmdWwuCisgIGJvb2wgZml4VHlwZShRdWFsVHlwZSBRVCwgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHQsIEFTVENvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgIGJvb2wgSXNPYmpDTGl0ZXJhbCk7CisKKyAgdm9pZCB0b1N0cmluZyhyYXdfb3N0cmVhbSAmb3MpIGNvbnN0OworCisgIC8vIFZhbGlkYXRpb24gbWV0aG9kcyAtIHRvIGNoZWNrIGlmIGFueSBlbGVtZW50IHJlc3VsdHMgaW4gdW5kZWZpbmVkIGJlaGF2aW9yCisgIGJvb2wgaGFzVmFsaWRQbHVzUHJlZml4KCkgY29uc3Q7CisgIGJvb2wgaGFzVmFsaWRBbHRlcm5hdGl2ZUZvcm0oKSBjb25zdDsKKyAgYm9vbCBoYXNWYWxpZExlYWRpbmdaZXJvcygpIGNvbnN0OworICBib29sIGhhc1ZhbGlkU3BhY2VQcmVmaXgoKSBjb25zdDsKKyAgYm9vbCBoYXNWYWxpZExlZnRKdXN0aWZpZWQoKSBjb25zdDsKKyAgYm9vbCBoYXNWYWxpZFRob3VzYW5kc0dyb3VwaW5nUHJlZml4KCkgY29uc3Q7CisKKyAgYm9vbCBoYXNWYWxpZFByZWNpc2lvbigpIGNvbnN0OworICBib29sIGhhc1ZhbGlkRmllbGRXaWR0aCgpIGNvbnN0OworfTsKK30gIC8vIGVuZCBhbmFseXplX3ByaW50ZiBuYW1lc3BhY2UKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBQaWVjZXMgc3BlY2lmaWMgdG8gZnNjYW5mIGZvcm1hdCBzdHJpbmdzLgorCituYW1lc3BhY2UgYW5hbHl6ZV9zY2FuZiB7CisKK2NsYXNzIFNjYW5mQ29udmVyc2lvblNwZWNpZmllciA6CisgICAgcHVibGljIGFuYWx5emVfZm9ybWF0X3N0cmluZzo6Q29udmVyc2lvblNwZWNpZmllciAgeworcHVibGljOgorICBTY2FuZkNvbnZlcnNpb25TcGVjaWZpZXIoKQorICAgIDogQ29udmVyc2lvblNwZWNpZmllcihmYWxzZSwgbnVsbHB0ciwgSW52YWxpZFNwZWNpZmllcikge30KKworICBTY2FuZkNvbnZlcnNpb25TcGVjaWZpZXIoY29uc3QgY2hhciAqcG9zLCBLaW5kIGspCisgICAgOiBDb252ZXJzaW9uU3BlY2lmaWVyKGZhbHNlLCBwb3MsIGspIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBhbmFseXplX2Zvcm1hdF9zdHJpbmc6OkNvbnZlcnNpb25TcGVjaWZpZXIgKkNTKSB7CisgICAgcmV0dXJuICFDUy0+aXNQcmludGZLaW5kKCk7CisgIH0KK307CisKK3VzaW5nIGFuYWx5emVfZm9ybWF0X3N0cmluZzo6QXJnVHlwZTsKK3VzaW5nIGFuYWx5emVfZm9ybWF0X3N0cmluZzo6TGVuZ3RoTW9kaWZpZXI7Cit1c2luZyBhbmFseXplX2Zvcm1hdF9zdHJpbmc6Ok9wdGlvbmFsQW1vdW50OwordXNpbmcgYW5hbHl6ZV9mb3JtYXRfc3RyaW5nOjpPcHRpb25hbEZsYWc7CisKK2NsYXNzIFNjYW5mU3BlY2lmaWVyIDogcHVibGljIGFuYWx5emVfZm9ybWF0X3N0cmluZzo6Rm9ybWF0U3BlY2lmaWVyIHsKKyAgT3B0aW9uYWxGbGFnIFN1cHByZXNzQXNzaWdubWVudDsgLy8gJyonCitwdWJsaWM6CisgIFNjYW5mU3BlY2lmaWVyKCkgOgorICAgIEZvcm1hdFNwZWNpZmllcigvKiBpc1ByaW50ZiA9ICovIGZhbHNlKSwKKyAgICBTdXBwcmVzc0Fzc2lnbm1lbnQoIioiKSB7fQorCisgIHZvaWQgc2V0U3VwcHJlc3NBc3NpZ25tZW50KGNvbnN0IGNoYXIgKnBvc2l0aW9uKSB7CisgICAgU3VwcHJlc3NBc3NpZ25tZW50LnNldFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgfQorCisgIGNvbnN0IE9wdGlvbmFsRmxhZyAmZ2V0U3VwcHJlc3NBc3NpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBTdXBwcmVzc0Fzc2lnbm1lbnQ7CisgIH0KKworICB2b2lkIHNldENvbnZlcnNpb25TcGVjaWZpZXIoY29uc3QgU2NhbmZDb252ZXJzaW9uU3BlY2lmaWVyICZjcykgeworICAgIENTID0gY3M7CisgIH0KKworICBjb25zdCBTY2FuZkNvbnZlcnNpb25TcGVjaWZpZXIgJmdldENvbnZlcnNpb25TcGVjaWZpZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8U2NhbmZDb252ZXJzaW9uU3BlY2lmaWVyPihDUyk7CisgIH0KKworICBib29sIGNvbnN1bWVzRGF0YUFyZ3VtZW50KCkgY29uc3QgeworICAgIHJldHVybiBDUy5jb25zdW1lc0RhdGFBcmd1bWVudCgpICYmICFTdXBwcmVzc0Fzc2lnbm1lbnQ7CisgIH0KKworICBBcmdUeXBlIGdldEFyZ1R5cGUoQVNUQ29udGV4dCAmQ3R4KSBjb25zdDsKKworICBib29sIGZpeFR5cGUoUXVhbFR5cGUgUVQsIFF1YWxUeXBlIFJhd1FULCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdCwKKyAgICAgICAgICAgICAgIEFTVENvbnRleHQgJkN0eCk7CisKKyAgdm9pZCB0b1N0cmluZyhyYXdfb3N0cmVhbSAmb3MpIGNvbnN0OworCisgIHN0YXRpYyBTY2FuZlNwZWNpZmllciBQYXJzZShjb25zdCBjaGFyICpiZWcsIGNvbnN0IGNoYXIgKmVuZCk7Cit9OworCit9IC8vIGVuZCBhbmFseXplX3NjYW5mIG5hbWVzcGFjZQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUGFyc2luZyBhbmQgcHJvY2Vzc2luZyBvZiBmb3JtYXQgc3RyaW5ncyAoYm90aCBmcHJpbnRmIGFuZCBmc2NhbmYpLgorCituYW1lc3BhY2UgYW5hbHl6ZV9mb3JtYXRfc3RyaW5nIHsKKworZW51bSBQb3NpdGlvbkNvbnRleHQgeyBGaWVsZFdpZHRoUG9zID0gMCwgUHJlY2lzaW9uUG9zID0gMSB9OworCitjbGFzcyBGb3JtYXRTdHJpbmdIYW5kbGVyIHsKK3B1YmxpYzoKKyAgRm9ybWF0U3RyaW5nSGFuZGxlcigpIHt9CisgIHZpcnR1YWwgfkZvcm1hdFN0cmluZ0hhbmRsZXIoKTsKKworICB2aXJ0dWFsIHZvaWQgSGFuZGxlTnVsbENoYXIoY29uc3QgY2hhciAqbnVsbENoYXJhY3Rlcikge30KKworICB2aXJ0dWFsIHZvaWQgSGFuZGxlUG9zaXRpb24oY29uc3QgY2hhciAqc3RhcnRQb3MsIHVuc2lnbmVkIHBvc0xlbikge30KKworICB2aXJ0dWFsIHZvaWQgSGFuZGxlSW52YWxpZFBvc2l0aW9uKGNvbnN0IGNoYXIgKnN0YXJ0UG9zLCB1bnNpZ25lZCBwb3NMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zaXRpb25Db250ZXh0IHApIHt9CisKKyAgdmlydHVhbCB2b2lkIEhhbmRsZVplcm9Qb3NpdGlvbihjb25zdCBjaGFyICpzdGFydFBvcywgdW5zaWduZWQgcG9zTGVuKSB7fQorCisgIHZpcnR1YWwgdm9pZCBIYW5kbGVJbmNvbXBsZXRlU3BlY2lmaWVyKGNvbnN0IGNoYXIgKnN0YXJ0U3BlY2lmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzcGVjaWZpZXJMZW4pIHt9CisKKyAgdmlydHVhbCB2b2lkIEhhbmRsZUVtcHR5T2JqQ01vZGlmaWVyRmxhZyhjb25zdCBjaGFyICpzdGFydEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzTGVuKSB7fQorCisgIHZpcnR1YWwgdm9pZCBIYW5kbGVJbnZhbGlkT2JqQ01vZGlmaWVyRmxhZyhjb25zdCBjaGFyICpzdGFydEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFnTGVuKSB7fQorCisgIHZpcnR1YWwgdm9pZCBIYW5kbGVPYmpDRmxhZ3NXaXRoTm9uT2JqQ0NvbnZlcnNpb24oY29uc3QgY2hhciAqZmxhZ3NTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmxhZ3NFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnZlcnNpb25Qb3NpdGlvbikge30KKyAgLy8gUHJpbnRmLXNwZWNpZmljIGhhbmRsZXJzLgorCisgIHZpcnR1YWwgYm9vbCBIYW5kbGVJbnZhbGlkUHJpbnRmQ29udmVyc2lvblNwZWNpZmllcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5hbHl6ZV9wcmludGY6OlByaW50ZlNwZWNpZmllciAmRlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0U3BlY2lmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzcGVjaWZpZXJMZW4pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBIYW5kbGVQcmludGZTcGVjaWZpZXIoY29uc3QgYW5hbHl6ZV9wcmludGY6OlByaW50ZlNwZWNpZmllciAmRlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RhcnRTcGVjaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc3BlY2lmaWVyTGVuKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAgIC8vIFNjYW5mLXNwZWNpZmljIGhhbmRsZXJzLgorCisgIHZpcnR1YWwgYm9vbCBIYW5kbGVJbnZhbGlkU2NhbmZDb252ZXJzaW9uU3BlY2lmaWVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuYWx5emVfc2NhbmY6OlNjYW5mU3BlY2lmaWVyICZGUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydFNwZWNpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzcGVjaWZpZXJMZW4pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBIYW5kbGVTY2FuZlNwZWNpZmllcihjb25zdCBhbmFseXplX3NjYW5mOjpTY2FuZlNwZWNpZmllciAmRlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydFNwZWNpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNwZWNpZmllckxlbikgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdmlydHVhbCB2b2lkIEhhbmRsZUluY29tcGxldGVTY2FuTGlzdChjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqZW5kKSB7fQorfTsKKworYm9vbCBQYXJzZVByaW50ZlN0cmluZyhGb3JtYXRTdHJpbmdIYW5kbGVyICZILAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpiZWcsIGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgTGFuZ09wdGlvbnMgJkxPLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbmZvICZUYXJnZXQsIGJvb2wgaXNGcmVlQlNES1ByaW50Zik7CisKK2Jvb2wgUGFyc2VGb3JtYXRTdHJpbmdIYXNTQXJnKGNvbnN0IGNoYXIgKmJlZywgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxPLCBjb25zdCBUYXJnZXRJbmZvICZUYXJnZXQpOworCitib29sIFBhcnNlU2NhbmZTdHJpbmcoRm9ybWF0U3RyaW5nSGFuZGxlciAmSCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpiZWcsIGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgTGFuZ09wdGlvbnMgJkxPLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluZm8gJlRhcmdldCk7CisKK30gLy8gZW5kIGFuYWx5emVfZm9ybWF0X3N0cmluZyBuYW1lc3BhY2UKK30gLy8gZW5kIGNsYW5nIG5hbWVzcGFjZQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9MaXZlVmFyaWFibGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9MaXZlVmFyaWFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExMjIyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL0xpdmVWYXJpYWJsZXMuaApAQCAtMCwwICsxLDExNiBAQAorLy89PT0tIExpdmVWYXJpYWJsZXMuaCAtIExpdmUgVmFyaWFibGUgQW5hbHlzaXMgZm9yIFNvdXJjZSBDRkdzIC0qLSBDKysgLS0qLS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgTGl2ZSBWYXJpYWJsZXMgYW5hbHlzaXMgZm9yIHNvdXJjZS1sZXZlbCBDRkdzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BTkFMWVNJU19BTkFMWVNFU19MSVZFVkFSSUFCTEVTX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BTkFMWVNJU19BTkFMWVNFU19MSVZFVkFSSUFCTEVTX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQW5hbHlzaXNEZWNsQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ltbXV0YWJsZVNldC5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBDRkc7CitjbGFzcyBDRkdCbG9jazsKK2NsYXNzIFN0bXQ7CitjbGFzcyBEZWNsUmVmRXhwcjsKK2NsYXNzIFNvdXJjZU1hbmFnZXI7CisgIAorY2xhc3MgTGl2ZVZhcmlhYmxlcyA6IHB1YmxpYyBNYW5hZ2VkQW5hbHlzaXMgeworcHVibGljOgorICBjbGFzcyBMaXZlbmVzc1ZhbHVlcyB7CisgIHB1YmxpYzoKKworICAgIGxsdm06OkltbXV0YWJsZVNldDxjb25zdCBTdG10ICo+IGxpdmVTdG10czsKKyAgICBsbHZtOjpJbW11dGFibGVTZXQ8Y29uc3QgVmFyRGVjbCAqPiBsaXZlRGVjbHM7CisgICAgCisgICAgYm9vbCBlcXVhbHMoY29uc3QgTGl2ZW5lc3NWYWx1ZXMgJlYpIGNvbnN0OworCisgICAgTGl2ZW5lc3NWYWx1ZXMoKQorICAgICAgOiBsaXZlU3RtdHMobnVsbHB0ciksIGxpdmVEZWNscyhudWxscHRyKSB7fQorCisgICAgTGl2ZW5lc3NWYWx1ZXMobGx2bTo6SW1tdXRhYmxlU2V0PGNvbnN0IFN0bXQgKj4gTGl2ZVN0bXRzLAorICAgICAgICAgICAgICAgICAgIGxsdm06OkltbXV0YWJsZVNldDxjb25zdCBWYXJEZWNsICo+IExpdmVEZWNscykKKyAgICAgIDogbGl2ZVN0bXRzKExpdmVTdG10cyksIGxpdmVEZWNscyhMaXZlRGVjbHMpIHt9CisKKyAgICBib29sIGlzTGl2ZShjb25zdCBTdG10ICpTKSBjb25zdDsKKyAgICBib29sIGlzTGl2ZShjb25zdCBWYXJEZWNsICpEKSBjb25zdDsKKyAgICAKKyAgICBmcmllbmQgY2xhc3MgTGl2ZVZhcmlhYmxlczsgICAgCisgIH07CisgIAorICBjbGFzcyBPYnNlcnZlciB7CisgICAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICBwdWJsaWM6CisgICAgdmlydHVhbCB+T2JzZXJ2ZXIoKSB7fQorICAgIAorICAgIC8vLyBBIGNhbGxiYWNrIGludm9rZWQgcmlnaHQgYmVmb3JlIGludm9raW5nIHRoZQorICAgIC8vLyAgbGl2ZW5lc3MgdHJhbnNmZXIgZnVuY3Rpb24gb24gdGhlIGdpdmVuIHN0YXRlbWVudC4KKyAgICB2aXJ0dWFsIHZvaWQgb2JzZXJ2ZVN0bXQoY29uc3QgU3RtdCAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZHQmxvY2sgKmN1cnJlbnRCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGl2ZW5lc3NWYWx1ZXMmIFYpIHt9CisgICAgCisgICAgLy8vIENhbGxlZCB3aGVuIHRoZSBsaXZlIHZhcmlhYmxlcyBhbmFseXNpcyByZWdpc3RlcnMKKyAgICAvLy8gdGhhdCBhIHZhcmlhYmxlIGlzIGtpbGxlZC4KKyAgICB2aXJ0dWFsIHZvaWQgb2JzZXJ2ZXJLaWxsKGNvbnN0IERlY2xSZWZFeHByICpEUikge30KKyAgfTsKKworICB+TGl2ZVZhcmlhYmxlcygpIG92ZXJyaWRlOworCisgIC8vLyBDb21wdXRlIHRoZSBsaXZlbmVzcyBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBDRkcuCisgIHN0YXRpYyBMaXZlVmFyaWFibGVzICpjb21wdXRlTGl2ZW5lc3MoQW5hbHlzaXNEZWNsQ29udGV4dCAmYW5hbHlzaXNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wga2lsbEF0QXNzaWduKTsKKyAgCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhIHZhcmlhYmxlIGlzIGxpdmUgYXQgdGhlIGVuZCBvZiBhCisgIC8vLyBzcGVjaWZpZWQgYmxvY2suCisgIGJvb2wgaXNMaXZlKGNvbnN0IENGR0Jsb2NrICpCLCBjb25zdCBWYXJEZWNsICpEKTsKKyAgCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYSB2YXJpYWJsZSBpcyBsaXZlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgIC8vLyAgdGhlIHN0YXRlbWVudC4gIFRoaXMgcXVlcnkgb25seSB3b3JrcyBpZiBsaXZlbmVzcyBpbmZvcm1hdGlvbgorICAvLy8gIGhhcyBiZWVuIHJlY29yZGVkIGF0IHRoZSBzdGF0ZW1lbnQgbGV2ZWwgKHNlZSBydW5PbkFsbEJsb2NrcyksIGFuZAorICAvLy8gIG9ubHkgcmV0dXJucyBsaXZlbmVzcyBpbmZvcm1hdGlvbiBmb3IgYmxvY2stbGV2ZWwgZXhwcmVzc2lvbnMuCisgIGJvb2wgaXNMaXZlKGNvbnN0IFN0bXQgKlMsIGNvbnN0IFZhckRlY2wgKkQpOworICAKKyAgLy8vIFJldHVybnMgdHJ1ZSB0aGUgYmxvY2stbGV2ZWwgZXhwcmVzc2lvbiAidmFsdWUiIGlzIGxpdmUKKyAgLy8vICBiZWZvcmUgdGhlIGdpdmVuIGJsb2NrLWxldmVsIGV4cHJlc3Npb24gKHNlZSBydW5PbkFsbEJsb2NrcykuCisgIGJvb2wgaXNMaXZlKGNvbnN0IFN0bXQgKkxvYywgY29uc3QgU3RtdCAqU3RtdFZhbCk7CisgICAgCisgIC8vLyBQcmludCB0byBzdGRlcnIgdGhlIGxpdmVuZXNzIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aAorICAvLy8gZWFjaCBiYXNpYyBibG9jay4KKyAgdm9pZCBkdW1wQmxvY2tMaXZlbmVzcyhjb25zdCBTb3VyY2VNYW5hZ2VyJiBNKTsKKworICB2b2lkIHJ1bk9uQWxsQmxvY2tzKE9ic2VydmVyICZvYnMpOworICAKKyAgc3RhdGljIExpdmVWYXJpYWJsZXMgKmNyZWF0ZShBbmFseXNpc0RlY2xDb250ZXh0ICZhbmFseXNpc0NvbnRleHQpIHsKKyAgICByZXR1cm4gY29tcHV0ZUxpdmVuZXNzKGFuYWx5c2lzQ29udGV4dCwgdHJ1ZSk7CisgIH0KKyAgCisgIHN0YXRpYyBjb25zdCB2b2lkICpnZXRUYWcoKTsKKyAgCitwcml2YXRlOgorICBMaXZlVmFyaWFibGVzKHZvaWQgKmltcGwpOworICB2b2lkICppbXBsOworfTsKKyAgCitjbGFzcyBSZWxheGVkTGl2ZVZhcmlhYmxlcyA6IHB1YmxpYyBMaXZlVmFyaWFibGVzIHsKK3B1YmxpYzoKKyAgc3RhdGljIExpdmVWYXJpYWJsZXMgKmNyZWF0ZShBbmFseXNpc0RlY2xDb250ZXh0ICZhbmFseXNpc0NvbnRleHQpIHsKKyAgICByZXR1cm4gY29tcHV0ZUxpdmVuZXNzKGFuYWx5c2lzQ29udGV4dCwgZmFsc2UpOworICB9CisgIAorICBzdGF0aWMgY29uc3Qgdm9pZCAqZ2V0VGFnKCk7Cit9OworICAKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL09TTG9nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9PU0xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNjBhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9PU0xvZy5oCkBAIC0wLDAgKzEsMTU1IEBACisvLz0gT1NMb2cuaCAtIEFuYWx5c2lzIG9mIGNhbGxzIHRvIG9zX2xvZyBidWlsdGlucyAtLSotIEMrKyAtKi09PT09PT09PT09PT09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIEFQSXMgZm9yIGRldGVybWluaW5nIHRoZSBsYXlvdXQgb2YgdGhlIGRhdGEgYnVmZmVyIGZvcgorLy8gb3NfbG9nKCkgYW5kIG9zX3RyYWNlKCkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FOQUxZU0lTX0FOQUxZU0VTX09TTE9HX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BTkFMWVNJU19BTkFMWVNFU19PU0xPR19ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgYW5hbHl6ZV9vc19sb2cgeworCisvLy8gQW4gT1NMb2dCdWZmZXJJdGVtIHJlcHJlc2VudHMgYSBzaW5nbGUgaXRlbSBpbiB0aGUgZGF0YSB3cml0dGVuIGJ5IGEgY2FsbAorLy8vIHRvIG9zX2xvZygpIG9yIG9zX3RyYWNlKCkuCitjbGFzcyBPU0xvZ0J1ZmZlckl0ZW0geworcHVibGljOgorICBlbnVtIEtpbmQgeworICAgIC8vIFRoZSBpdGVtIGlzIGEgc2NhbGFyIChpbnQsIGZsb2F0LCByYXcgcG9pbnRlciwgZXRjLikuIE5vIGZ1cnRoZXIgY29weWluZworICAgIC8vIGlzIHJlcXVpcmVkLiBUaGlzIGlzIHRoZSBvbmx5IGtpbmQgYWxsb3dlZCBieSBvc190cmFjZSgpLgorICAgIFNjYWxhcktpbmQgPSAwLAorCisgICAgLy8gVGhlIGl0ZW0gaXMgYSBjb3VudCwgd2hpY2ggZGVzY3JpYmVzIHRoZSBsZW5ndGggb2YgdGhlIGZvbGxvd2luZyBpdGVtIHRvCisgICAgLy8gYmUgY29waWVkLiBBIGNvdW50IG1heSBvbmx5IGJlIGZvbGxvd2VkIGJ5IGFuIGl0ZW0gb2Yga2luZCBTdHJpbmdLaW5kLAorICAgIC8vIFdpZGVTdHJpbmdLaW5kLCBvciBQb2ludGVyS2luZC4KKyAgICBDb3VudEtpbmQsCisKKyAgICAvLyBUaGUgaXRlbSBpcyBhIHBvaW50ZXIgdG8gYSBDIHN0cmluZy4gSWYgcHJlY2VkZWQgYnkgYSBjb3VudCAnbicsCisgICAgLy8gb3NfbG9nKCkgd2lsbCBjb3B5IGF0IG1vc3QgJ24nIGJ5dGVzIGZyb20gdGhlIHBvaW50ZXIuCisgICAgU3RyaW5nS2luZCwKKworICAgIC8vIFRoZSBpdGVtIGlzIGEgcG9pbnRlciB0byBhIGJsb2NrIG9mIHJhdyBkYXRhLiBUaGlzIGl0ZW0gbXVzdCBiZSBwcmVjZWRlZAorICAgIC8vIGJ5IGEgY291bnQgJ24nLiBvc19sb2coKSB3aWxsIGNvcHkgZXhhY3RseSAnbicgYnl0ZXMgZnJvbSB0aGUgcG9pbnRlci4KKyAgICBQb2ludGVyS2luZCwKKworICAgIC8vIFRoZSBpdGVtIGlzIGEgcG9pbnRlciB0byBhbiBPYmplY3RpdmUtQyBvYmplY3QuIG9zX2xvZygpIG1heSByZXRhaW4gdGhlCisgICAgLy8gb2JqZWN0IGZvciBsYXRlciBwcm9jZXNzaW5nLgorICAgIE9iakNPYmpLaW5kLAorCisgICAgLy8gVGhlIGl0ZW0gaXMgYSBwb2ludGVyIHRvIHdpZGUtY2hhciBzdHJpbmcuCisgICAgV2lkZVN0cmluZ0tpbmQsCisKKyAgICAvLyBUaGUgaXRlbSBpcyBjb3JyZXNwb25kaW5nIHRvIHRoZSAnJW0nIGZvcm1hdCBzcGVjaWZpZXIsIG5vIHZhbHVlIGlzCisgICAgLy8gcG9wdWxhdGVkIGluIHRoZSBidWZmZXIgYW5kIHRoZSBydW50aW1lIGlzIGxvYWRpbmcgdGhlIGVycm5vIHZhbHVlLgorICAgIEVycm5vS2luZAorICB9OworCisgIGVudW0geworICAgIC8vIFRoZSBpdGVtIGlzIG1hcmtlZCAicHJpdmF0ZSIgaW4gdGhlIGZvcm1hdCBzdHJpbmcuCisgICAgSXNQcml2YXRlID0gMHgxLAorCisgICAgLy8gVGhlIGl0ZW0gaXMgbWFya2VkICJwdWJsaWMiIGluIHRoZSBmb3JtYXQgc3RyaW5nLgorICAgIElzUHVibGljID0gMHgyCisgIH07CisKK3ByaXZhdGU6CisgIEtpbmQgVGhlS2luZCA9IFNjYWxhcktpbmQ7CisgIGNvbnN0IEV4cHIgKlRoZUV4cHIgPSBudWxscHRyOworICBDaGFyVW5pdHMgQ29uc3RWYWx1ZTsKKyAgQ2hhclVuaXRzIFNpemU7IC8vIHNpemUgb2YgdGhlIGRhdGEsIG5vdCBpbmNsdWRpbmcgdGhlIGhlYWRlciBieXRlcworICB1bnNpZ25lZCBGbGFncyA9IDA7CisKK3B1YmxpYzoKKyAgT1NMb2dCdWZmZXJJdGVtKEtpbmQga2luZCwgY29uc3QgRXhwciAqZXhwciwgQ2hhclVuaXRzIHNpemUsIHVuc2lnbmVkIGZsYWdzKQorICAgICAgOiBUaGVLaW5kKGtpbmQpLCBUaGVFeHByKGV4cHIpLCBTaXplKHNpemUpLCBGbGFncyhmbGFncykge30KKworICBPU0xvZ0J1ZmZlckl0ZW0oQVNUQ29udGV4dCAmQ3R4LCBDaGFyVW5pdHMgdmFsdWUsIHVuc2lnbmVkIGZsYWdzKQorICAgICAgOiBUaGVLaW5kKENvdW50S2luZCksIENvbnN0VmFsdWUodmFsdWUpLAorICAgICAgICBTaXplKEN0eC5nZXRUeXBlU2l6ZUluQ2hhcnMoQ3R4LkludFR5KSksIEZsYWdzKGZsYWdzKSB7fQorCisgIHVuc2lnbmVkIGNoYXIgZ2V0RGVzY3JpcHRvckJ5dGUoKSBjb25zdCB7CisgICAgdW5zaWduZWQgY2hhciByZXN1bHQgPSAwOworICAgIGlmIChnZXRJc1ByaXZhdGUoKSkKKyAgICAgIHJlc3VsdCB8PSBJc1ByaXZhdGU7CisgICAgaWYgKGdldElzUHVibGljKCkpCisgICAgICByZXN1bHQgfD0gSXNQdWJsaWM7CisgICAgcmVzdWx0IHw9ICgodW5zaWduZWQpZ2V0S2luZCgpKSA8PCA0OworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICB1bnNpZ25lZCBjaGFyIGdldFNpemVCeXRlKCkgY29uc3QgeyByZXR1cm4gc2l6ZSgpLmdldFF1YW50aXR5KCk7IH0KKworICBLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBUaGVLaW5kOyB9CisgIGJvb2wgZ2V0SXNQcml2YXRlKCkgY29uc3QgeyByZXR1cm4gKEZsYWdzICYgSXNQcml2YXRlKSAhPSAwOyB9CisgIGJvb2wgZ2V0SXNQdWJsaWMoKSBjb25zdCB7IHJldHVybiAoRmxhZ3MgJiBJc1B1YmxpYykgIT0gMDsgfQorCisgIGNvbnN0IEV4cHIgKmdldEV4cHIoKSBjb25zdCB7IHJldHVybiBUaGVFeHByOyB9CisgIENoYXJVbml0cyBnZXRDb25zdFZhbHVlKCkgY29uc3QgeyByZXR1cm4gQ29uc3RWYWx1ZTsgfQorICBDaGFyVW5pdHMgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KK307CisKK2NsYXNzIE9TTG9nQnVmZmVyTGF5b3V0IHsKK3B1YmxpYzoKKyAgU21hbGxWZWN0b3I8T1NMb2dCdWZmZXJJdGVtLCA0PiBJdGVtczsKKworICBlbnVtIEZsYWdzIHsgSGFzUHJpdmF0ZUl0ZW1zID0gMSwgSGFzTm9uU2NhbGFySXRlbXMgPSAxIDw8IDEgfTsKKworICBDaGFyVW5pdHMgc2l6ZSgpIGNvbnN0IHsKKyAgICBDaGFyVW5pdHMgcmVzdWx0OworICAgIHJlc3VsdCArPSBDaGFyVW5pdHM6OmZyb21RdWFudGl0eSgyKTsgLy8gc3VtbWFyeSBieXRlLCBudW0tYXJncyBieXRlCisgICAgZm9yIChhdXRvICZpdGVtIDogSXRlbXMpIHsKKyAgICAgIC8vIGRlc2NyaXB0b3IgYnl0ZSwgc2l6ZSBieXRlCisgICAgICByZXN1bHQgKz0gaXRlbS5zaXplKCkgKyBDaGFyVW5pdHM6OmZyb21RdWFudGl0eSgyKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGJvb2wgaGFzUHJpdmF0ZUl0ZW1zKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjphbnlfb2YoCisgICAgICAgIEl0ZW1zLCBbXShjb25zdCBPU0xvZ0J1ZmZlckl0ZW0gJkl0ZW0pIHsgcmV0dXJuIEl0ZW0uZ2V0SXNQcml2YXRlKCk7IH0pOworICB9CisKKyAgYm9vbCBoYXNQdWJsaWNJdGVtcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6YW55X29mKAorICAgICAgICBJdGVtcywgW10oY29uc3QgT1NMb2dCdWZmZXJJdGVtICZJdGVtKSB7IHJldHVybiBJdGVtLmdldElzUHVibGljKCk7IH0pOworICB9CisKKyAgYm9vbCBoYXNOb25TY2FsYXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06OmFueV9vZihJdGVtcywgW10oY29uc3QgT1NMb2dCdWZmZXJJdGVtICZJdGVtKSB7CisgICAgICByZXR1cm4gSXRlbS5nZXRLaW5kKCkgIT0gT1NMb2dCdWZmZXJJdGVtOjpTY2FsYXJLaW5kOworICAgIH0pOworICB9CisKKyAgdW5zaWduZWQgY2hhciBnZXRTdW1tYXJ5Qnl0ZSgpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBjaGFyIHJlc3VsdCA9IDA7CisgICAgaWYgKGhhc1ByaXZhdGVJdGVtcygpKQorICAgICAgcmVzdWx0IHw9IEhhc1ByaXZhdGVJdGVtczsKKyAgICBpZiAoaGFzTm9uU2NhbGFyKCkpCisgICAgICByZXN1bHQgfD0gSGFzTm9uU2NhbGFySXRlbXM7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHVuc2lnbmVkIGNoYXIgZ2V0TnVtQXJnc0J5dGUoKSBjb25zdCB7IHJldHVybiBJdGVtcy5zaXplKCk7IH0KK307CisKKy8vIEdpdmVuIGEgY2FsbCAnRScgdG8gb25lIG9mIHRoZSBidWlsdGlucyBfX2J1aWx0aW5fb3NfbG9nX2Zvcm1hdCgpIG9yCisvLyBfX2J1aWx0aW5fb3NfbG9nX2Zvcm1hdF9idWZmZXJfc2l6ZSgpLCBjb21wdXRlIHRoZSBsYXlvdXQgb2YgdGhlIGJ1ZmZlciB0aGF0CisvLyB0aGUgY2FsbCB3aWxsIHdyaXRlIGludG8gYW5kIHN0b3JlIGl0IGluICdsYXlvdXQnLiBSZXR1cm5zICdmYWxzZScgaWYgdGhlcmUKKy8vIHdhcyBzb21lIGVycm9yIGVuY291bnRlcmVkIHdoaWxlIGNvbXB1dGluZyB0aGUgbGF5b3V0LCBhbmQgJ3RydWUnIG90aGVyd2lzZS4KK2Jvb2wgY29tcHV0ZU9TTG9nQnVmZmVyTGF5b3V0KGNsYW5nOjpBU1RDb250ZXh0ICZDdHgsIGNvbnN0IGNsYW5nOjpDYWxsRXhwciAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TTG9nQnVmZmVyTGF5b3V0ICZsYXlvdXQpOworCit9IC8vIG5hbWVzcGFjZSBhbmFseXplX29zX2xvZworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvUG9zdE9yZGVyQ0ZHVmlldy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvUG9zdE9yZGVyQ0ZHVmlldy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NmYzZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9Qb3N0T3JkZXJDRkdWaWV3LmgKQEAgLTAsMCArMSwxMTcgQEAKKy8vPT09LSBQb3N0T3JkZXJDRkdWaWV3LmggLSBQb3N0IG9yZGVyIHZpZXcgb2YgQ0ZHIGJsb2NrcyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgcG9zdCBvcmRlciB2aWV3IG9mIHRoZSBibG9ja3MgaW4gYSBDRkcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FOQUxZU0lTX0FOQUxZU0VTX1BPU1RPUkRFUkNGR1ZJRVdfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FOQUxZU0lTX0FOQUxZU0VTX1BPU1RPUkRFUkNGR1ZJRVdfSAorCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQW5hbHlzaXNEZWNsQ29udGV4dC5oIgorI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0NGRy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb3N0T3JkZXJJdGVyYXRvci5oIgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBQb3N0T3JkZXJDRkdWaWV3IDogcHVibGljIE1hbmFnZWRBbmFseXNpcyB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIEltcGxlbWVudHMgYSBzZXQgb2YgQ0ZHQmxvY2tzIHVzaW5nIGEgQml0VmVjdG9yLgorICAvLy8KKyAgLy8vIFRoaXMgY2xhc3MgY29udGFpbnMgYSBtaW5pbWFsIGludGVyZmFjZSwgcHJpbWFyaWx5IGRpY3RhdGVkIGJ5IHRoZSBTZXRUeXBlCisgIC8vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YgdGhlIGxsdm06OnBvX2l0ZXJhdG9yIHRlbXBsYXRlLCBhcyB1c2VkIHdpdGgKKyAgLy8vIGV4dGVybmFsIHN0b3JhZ2UuIFdlIGFsc28gdXNlIHRoaXMgc2V0IHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggQ0ZHQmxvY2tzIHdlCisgIC8vLyB2aXNpdCBkdXJpbmcgdGhlIGFuYWx5c2lzLgorICBjbGFzcyBDRkdCbG9ja1NldCB7CisgICAgbGx2bTo6Qml0VmVjdG9yIFZpc2l0ZWRCbG9ja0lEczsKKworICBwdWJsaWM6CisgICAgLy8gcG9faXRlcmF0b3IgcmVxdWlyZXMgdGhpcyBpdGVyYXRvciwgYnV0IHRoZSBvbmx5IGludGVyZmFjZSBuZWVkZWQgaXMgdGhlCisgICAgLy8gdmFsdWVfdHlwZSB0eXBlLgorICAgIHN0cnVjdCBpdGVyYXRvciB7IHVzaW5nIHZhbHVlX3R5cGUgPSBjb25zdCBDRkdCbG9jayAqOyB9OworCisgICAgQ0ZHQmxvY2tTZXQoKSA9IGRlZmF1bHQ7CisgICAgQ0ZHQmxvY2tTZXQoY29uc3QgQ0ZHICpHKSA6IFZpc2l0ZWRCbG9ja0lEcyhHLT5nZXROdW1CbG9ja0lEcygpLCBmYWxzZSkge30KKworICAgIC8vLyBcYnJpZWYgU2V0IHRoZSBiaXQgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBDRkdCbG9jay4KKyAgICAvLy8gVGhpcyBpcyB0aGUgaW1wb3J0YW50IG1ldGhvZCBmb3IgdGhlIFNldFR5cGUgdGVtcGxhdGUgcGFyYW1ldGVyLgorICAgIHN0ZDo6cGFpcjxsbHZtOjpOb25lVHlwZSwgYm9vbD4gaW5zZXJ0KGNvbnN0IENGR0Jsb2NrICpCbG9jaykgeworICAgICAgLy8gTm90ZSB0aGF0IGluc2VydCgpIGlzIGNhbGxlZCBieSBwb19pdGVyYXRvciwgd2hpY2ggZG9lc24ndCBjaGVjayB0bworICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgQmxvY2sgaXMgbm9uLW51bGwuICBNb3Jlb3ZlciwgdGhlIENGR0Jsb2NrIGl0ZXJhdG9yIHdpbGwKKyAgICAgIC8vIG9jY2FzaW9uYWxseSBoYW5kIG91dCBudWxsIHBvaW50ZXJzIGZvciBwcnVuZWQgZWRnZXMsIHNvIHdlIGNhdGNoIHRob3NlCisgICAgICAvLyBoZXJlLgorICAgICAgaWYgKCFCbG9jaykKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKE5vbmUsIGZhbHNlKTsgLy8gaWYgYW4gZWRnZSBpcyB0cml2aWFsbHkgZmFsc2UuCisgICAgICBpZiAoVmlzaXRlZEJsb2NrSURzLnRlc3QoQmxvY2stPmdldEJsb2NrSUQoKSkpCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihOb25lLCBmYWxzZSk7CisgICAgICBWaXNpdGVkQmxvY2tJRHMuc2V0KEJsb2NrLT5nZXRCbG9ja0lEKCkpOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKE5vbmUsIHRydWUpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgQ2hlY2sgaWYgdGhlIGJpdCBmb3IgYSBDRkdCbG9jayBoYXMgYmVlbiBhbHJlYWR5IHNldC4KKyAgICAvLy8gVGhpcyBtZXRob2QgaXMgZm9yIHRyYWNraW5nIHZpc2l0ZWQgYmxvY2tzIGluIHRoZSBtYWluIHRocmVhZHNhZmV0eQorICAgIC8vLyBsb29wLiBCbG9jayBtdXN0IG5vdCBiZSBudWxsLgorICAgIGJvb2wgYWxyZWFkeVNldChjb25zdCBDRkdCbG9jayAqQmxvY2spIHsKKyAgICAgIHJldHVybiBWaXNpdGVkQmxvY2tJRHMudGVzdChCbG9jay0+Z2V0QmxvY2tJRCgpKTsKKyAgICB9CisgIH07CisKK3ByaXZhdGU6CisgIHVzaW5nIHBvX2l0ZXJhdG9yID0gbGx2bTo6cG9faXRlcmF0b3I8Y29uc3QgQ0ZHICosIENGR0Jsb2NrU2V0LCB0cnVlPjsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZHQmxvY2sgKj4gQmxvY2tzOworCisgIHVzaW5nIEJsb2NrT3JkZXJUeSA9IGxsdm06OkRlbnNlTWFwPGNvbnN0IENGR0Jsb2NrICosIHVuc2lnbmVkPjsKKyAgQmxvY2tPcmRlclR5IEJsb2NrT3JkZXI7CisKK3B1YmxpYzoKKyAgZnJpZW5kIHN0cnVjdCBCbG9ja09yZGVyQ29tcGFyZTsKKworICB1c2luZyBpdGVyYXRvciA9IHN0ZDo6dmVjdG9yPGNvbnN0IENGR0Jsb2NrICo+OjpyZXZlcnNlX2l0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IHN0ZDo6dmVjdG9yPGNvbnN0IENGR0Jsb2NrICo+Ojpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgIFBvc3RPcmRlckNGR1ZpZXcoY29uc3QgQ0ZHICpjZmcpOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gQmxvY2tzLnJiZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIEJsb2Nrcy5yZW5kKCk7IH0KKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEJsb2Nrcy5yYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBCbG9ja3MucmVuZCgpOyB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIGJlZ2luKCkgPT0gZW5kKCk7IH0KKworICBzdHJ1Y3QgQmxvY2tPcmRlckNvbXBhcmUgeworICAgIGNvbnN0IFBvc3RPcmRlckNGR1ZpZXcgJlBPVjsKKworICBwdWJsaWM6CisgICAgQmxvY2tPcmRlckNvbXBhcmUoY29uc3QgUG9zdE9yZGVyQ0ZHVmlldyAmcG92KSA6IFBPVihwb3YpIHt9CisKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgQ0ZHQmxvY2sgKmIxLCBjb25zdCBDRkdCbG9jayAqYjIpIGNvbnN0OworICB9OworCisgIEJsb2NrT3JkZXJDb21wYXJlIGdldENvbXBhcmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIEJsb2NrT3JkZXJDb21wYXJlKCp0aGlzKTsKKyAgfQorCisgIC8vIFVzZWQgYnkgQW5hbHlpc0NvbnRleHQgdG8gY29uc3RydWN0IHRoaXMgb2JqZWN0LgorICBzdGF0aWMgY29uc3Qgdm9pZCAqZ2V0VGFnKCk7CisKKyAgc3RhdGljIFBvc3RPcmRlckNGR1ZpZXcgKmNyZWF0ZShBbmFseXNpc0RlY2xDb250ZXh0ICZhbmFseXNpc0NvbnRleHQpOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQU5BTFlTSVNfQU5BTFlTRVNfUE9TVE9SREVSQ0ZHVklFV19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9Qc2V1ZG9Db25zdGFudEFuYWx5c2lzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9Qc2V1ZG9Db25zdGFudEFuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlYzJmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL1BzZXVkb0NvbnN0YW50QW5hbHlzaXMuaApAQCAtMCwwICsxLDQ1IEBACisvLz09IFBzZXVkb0NvbnN0YW50QW5hbHlzaXMuaCAtIEZpbmQgUHNldWRvLWNvbnN0YW50cyBpbiB0aGUgQVNUIC0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSB0cmFja3MgdGhlIHVzYWdlIG9mIHZhcmlhYmxlcyBpbiBhIERlY2wgYm9keSB0byBzZWUgaWYgdGhleSBhcmUKKy8vIG5ldmVyIHdyaXR0ZW4gdG8sIGltcGx5aW5nIHRoYXQgdGhleSBjb25zdGFudC4gVGhpcyBpcyB1c2VmdWwgaW4gc3RhdGljCisvLyBhbmFseXNpcyB0byBzZWUgaWYgYSBkZXZlbG9wZXIgbWlnaHQgaGF2ZSBpbnRlbmRlZCBhIHZhcmlhYmxlIHRvIGJlIGNvbnN0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BTkFMWVNJU19BTkFMWVNFU19QU0VVRE9DT05TVEFOVEFOQUxZU0lTX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BTkFMWVNJU19BTkFMWVNFU19QU0VVRE9DT05TVEFOVEFOQUxZU0lTX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10LmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIFBzZXVkb0NvbnN0YW50QW5hbHlzaXMgeworcHVibGljOgorICBQc2V1ZG9Db25zdGFudEFuYWx5c2lzKGNvbnN0IFN0bXQgKkRlY2xCb2R5KTsKKyAgflBzZXVkb0NvbnN0YW50QW5hbHlzaXMoKTsKKworICBib29sIGlzUHNldWRvQ29uc3RhbnQoY29uc3QgVmFyRGVjbCAqVkQpOworICBib29sIHdhc1JlZmVyZW5jZWQoY29uc3QgVmFyRGVjbCAqVkQpOworCitwcml2YXRlOgorICB2b2lkIFJ1bkFuYWx5c2lzKCk7CisgIGlubGluZSBzdGF0aWMgY29uc3QgRGVjbCAqZ2V0RGVjbChjb25zdCBFeHByICpFKTsKKworICAvLyBmb3Igc3RvcmluZyB0aGUgcmVzdWx0IG9mIGFuYWx5emVkIFZhbHVlRGVjbHMKKyAgdm9pZCAqTm9uQ29uc3RhbnRzSW1wbDsKKyAgdm9pZCAqVXNlZFZhcnNJbXBsOworCisgIGNvbnN0IFN0bXQgKkRlY2xCb2R5OworICBib29sIEFuYWx5emVkOworfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL1JlYWNoYWJsZUNvZGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL1JlYWNoYWJsZUNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzUyM2JmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvUmVhY2hhYmxlQ29kZS5oCkBAIC0wLDAgKzEsNjkgQEAKKy8vPT09LSBSZWFjaGFibGVDb2RlLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLS0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQSBmbG93LXNlbnNpdGl2ZSwgcGF0aC1pbnNlbnNpdGl2ZSBhbmFseXNpcyBvZiB1bnJlYWNoYWJsZSBjb2RlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BTkFMWVNJU19BTkFMWVNFU19SRUFDSEFCTEVDT0RFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BTkFMWVNJU19BTkFMWVNFU19SRUFDSEFCTEVDT0RFX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQml0VmVjdG9yOworfQorCituYW1lc3BhY2UgY2xhbmcgeworICBjbGFzcyBBbmFseXNpc0RlY2xDb250ZXh0OworICBjbGFzcyBDRkdCbG9jazsKKyAgY2xhc3MgUHJlcHJvY2Vzc29yOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQVBJLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSByZWFjaGFibGVfY29kZSB7CisKKy8vLyBDbGFzc2lmaWNhdGlvbnMgb2YgdW5yZWFjaGFibGUgY29kZS4KK2VudW0gVW5yZWFjaGFibGVLaW5kIHsKKyAgVUtfUmV0dXJuLAorICBVS19CcmVhaywKKyAgVUtfTG9vcF9JbmNyZW1lbnQsCisgIFVLX090aGVyCit9OworCitjbGFzcyBDYWxsYmFjayB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKK3B1YmxpYzoKKyAgdmlydHVhbCB+Q2FsbGJhY2soKSB7fQorICB2aXJ0dWFsIHZvaWQgSGFuZGxlVW5yZWFjaGFibGUoVW5yZWFjaGFibGVLaW5kIFVLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIENvbmRpdGlvblZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgUjIpID0gMDsKK307CisKKy8vLyBTY2FuUmVhY2hhYmxlRnJvbUJsb2NrIC0gTWFyayBhbGwgYmxvY2tzIHJlYWNoYWJsZSBmcm9tIFN0YXJ0LgorLy8vIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBibG9ja3MgdGhhdCB3ZXJlIG1hcmtlZCByZWFjaGFibGUuICAKK3Vuc2lnbmVkIFNjYW5SZWFjaGFibGVGcm9tQmxvY2soY29uc3QgQ0ZHQmxvY2sgKlN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpCaXRWZWN0b3IgJlJlYWNoYWJsZSk7CisKK3ZvaWQgRmluZFVucmVhY2hhYmxlQ29kZShBbmFseXNpc0RlY2xDb250ZXh0ICZBQywgUHJlcHJvY2Vzc29yICZQUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFjayAmQ0IpOworCit9fSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nOjpyZWFjaGFibGVfY29kZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL1RocmVhZFNhZmV0eS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvVGhyZWFkU2FmZXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwZjNhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL1RocmVhZFNhZmV0eS5oCkBAIC0wLDAgKzEsMjQ5IEBACisvLz09PS0gVGhyZWFkU2FmZXR5LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vCisvLyBBIGludHJhLXByb2NlZHVyYWwgYW5hbHlzaXMgZm9yIHRocmVhZCBzYWZldHkgKGUuZy4gZGVhZGxvY2tzIGFuZCByYWNlCisvLyBjb25kaXRpb25zKSwgYmFzZWQgb2ZmIG9mIGFuIGFubm90YXRpb24gc3lzdGVtLgorLy8KKy8vIFNlZSBodHRwOi8vY2xhbmcubGx2bS5vcmcvZG9jcy9MYW5ndWFnZUV4dGVuc2lvbnMuaHRtbCN0aHJlYWQtc2FmZXR5LWFubm90YXRpb24tY2hlY2tpbmcKKy8vIGZvciBtb3JlIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BTkFMWVNJU19BTkFMWVNFU19USFJFQURTQUZFVFlfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FOQUxZU0lTX0FOQUxZU0VTX1RIUkVBRFNBRkVUWV9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBbmFseXNpc0RlY2xDb250ZXh0OworY2xhc3MgRnVuY3Rpb25EZWNsOworY2xhc3MgTmFtZWREZWNsOworCituYW1lc3BhY2UgdGhyZWFkU2FmZXR5IHsKKworY2xhc3MgQmVmb3JlU2V0OworCisvLy8gVGhpcyBlbnVtIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBkaWZmZXJlbnQga2luZHMgb2Ygb3BlcmF0aW9ucyB0aGF0IG1heQorLy8vIG5lZWQgdG8gYmUgcHJvdGVjdGVkIGJ5IGxvY2tzLiBXZSB1c2UgdGhpcyBlbnVtIGluIGVycm9yIGhhbmRsaW5nLgorZW51bSBQcm90ZWN0ZWRPcGVyYXRpb25LaW5kIHsKKyAgLy8vIERlcmVmZXJlbmNpbmcgYSB2YXJpYWJsZSAoZS5nLiBwIGluICpwID0gNTspCisgIFBPS19WYXJEZXJlZmVyZW5jZSwKKworICAvLy8gUmVhZGluZyBvciB3cml0aW5nIGEgdmFyaWFibGUgKGUuZy4geCBpbiB4ID0gNTspCisgIFBPS19WYXJBY2Nlc3MsCisKKyAgLy8vIE1ha2luZyBhIGZ1bmN0aW9uIGNhbGwgKGUuZy4gZm9vbCgpKQorICBQT0tfRnVuY3Rpb25DYWxsLAorCisgIC8vLyBQYXNzaW5nIGEgZ3VhcmRlZCB2YXJpYWJsZSBieSByZWZlcmVuY2UuCisgIFBPS19QYXNzQnlSZWYsCisKKyAgLy8vIFBhc3NpbmcgYSBwdC1ndWFyZGVkIHZhcmlhYmxlIGJ5IHJlZmVyZW5jZS4KKyAgUE9LX1B0UGFzc0J5UmVmCit9OworCisvLy8gVGhpcyBlbnVtIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBkaWZmZXJlbnQga2luZHMgb2YgbG9jayBhY3Rpb25zLiBGb3IKKy8vLyBleGFtcGxlLCBpdCBpcyBhbiBlcnJvciB0byB3cml0ZSBhIHZhcmlhYmxlIHByb3RlY3RlZCBieSBzaGFyZWQgdmVyc2lvbiBvZiBhCisvLy8gbXV0ZXguCitlbnVtIExvY2tLaW5kIHsKKyAgLy8vIFNoYXJlZC9yZWFkZXIgbG9jayBvZiBhIG11dGV4LgorICBMS19TaGFyZWQsCisKKyAgLy8vIEV4Y2x1c2l2ZS93cml0ZXIgbG9jayBvZiBhIG11dGV4LgorICBMS19FeGNsdXNpdmUsCisKKyAgLy8vIENhbiBiZSBlaXRoZXIgU2hhcmVkIG9yIEV4Y2x1c2l2ZS4KKyAgTEtfR2VuZXJpYworfTsKKworLy8vIFRoaXMgZW51bSBkaXN0aW5ndWlzaGVzIGJldHdlZW4gZGlmZmVyZW50IHdheXMgdG8gYWNjZXNzIChyZWFkIG9yIHdyaXRlKSBhCisvLy8gdmFyaWFibGUuCitlbnVtIEFjY2Vzc0tpbmQgeworICAvLy8gUmVhZGluZyBhIHZhcmlhYmxlLgorICBBS19SZWFkLAorCisgIC8vLyBXcml0aW5nIGEgdmFyaWFibGUuCisgIEFLX1dyaXR0ZW4KK307CisKKy8vLyBUaGlzIGVudW0gZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGRpZmZlcmVudCBzaXR1YXRpb25zIHdoZXJlIHdlIHdhcm4gZHVlIHRvCisvLy8gaW5jb25zaXN0ZW50IGxvY2tpbmcuCisvLy8gXGVudW0gU0tfTG9ja2VkU29tZUxvb3BJdGVyYXRpb25zIC0tIGEgbXV0ZXggaXMgbG9ja2VkIGZvciBzb21lIGJ1dCBub3QgYWxsCisvLy8gbG9vcCBpdGVyYXRpb25zLgorLy8vIFxlbnVtIFNLX0xvY2tlZFNvbWVQcmVkZWNlc3NvcnMgLS0gYSBtdXRleCBpcyBsb2NrZWQgaW4gc29tZSBidXQgbm90IGFsbAorLy8vIHByZWRlY2Vzc29ycyBvZiBhIENGR0Jsb2NrLgorLy8vIFxlbnVtIFNLX0xvY2tlZEF0RW5kT2ZGdW5jdGlvbiAtLSBhIG11dGV4IGlzIHN0aWxsIGxvY2tlZCBhdCB0aGUgZW5kIG9mIGEKKy8vLyBmdW5jdGlvbi4KK2VudW0gTG9ja0Vycm9yS2luZCB7CisgIExFS19Mb2NrZWRTb21lTG9vcEl0ZXJhdGlvbnMsCisgIExFS19Mb2NrZWRTb21lUHJlZGVjZXNzb3JzLAorICBMRUtfTG9ja2VkQXRFbmRPZkZ1bmN0aW9uLAorICBMRUtfTm90TG9ja2VkQXRFbmRPZkZ1bmN0aW9uCit9OworCisvLy8gSGFuZGxlciBjbGFzcyBmb3IgdGhyZWFkIHNhZmV0eSB3YXJuaW5ncy4KK2NsYXNzIFRocmVhZFNhZmV0eUhhbmRsZXIgeworcHVibGljOgorICB1c2luZyBOYW1lID0gU3RyaW5nUmVmOworCisgIFRocmVhZFNhZmV0eUhhbmRsZXIoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgflRocmVhZFNhZmV0eUhhbmRsZXIoKTsKKworICAvLy8gV2FybiBhYm91dCBsb2NrIGV4cHJlc3Npb25zIHdoaWNoIGZhaWwgdG8gcmVzb2x2ZSB0byBsb2NrYWJsZSBvYmplY3RzLgorICAvLy8gXHBhcmFtIEtpbmQgLS0gdGhlIGNhcGFiaWxpdHkncyBuYW1lIHBhcmFtZXRlciAocm9sZSwgbXV0ZXgsIGV0YykuCisgIC8vLyBccGFyYW0gTG9jIC0tIHRoZSBTb3VyY2VMb2NhdGlvbiBvZiB0aGUgdW5yZXNvbHZlZCBleHByZXNzaW9uLgorICB2aXJ0dWFsIHZvaWQgaGFuZGxlSW52YWxpZExvY2tFeHAoU3RyaW5nUmVmIEtpbmQsIFNvdXJjZUxvY2F0aW9uIExvYykge30KKworICAvLy8gV2FybiBhYm91dCB1bmxvY2sgZnVuY3Rpb24gY2FsbHMgdGhhdCBkbyBub3QgaGF2ZSBhIHByaW9yIG1hdGNoaW5nIGxvY2sKKyAgLy8vIGV4cHJlc3Npb24uCisgIC8vLyBccGFyYW0gS2luZCAtLSB0aGUgY2FwYWJpbGl0eSdzIG5hbWUgcGFyYW1ldGVyIChyb2xlLCBtdXRleCwgZXRjKS4KKyAgLy8vIFxwYXJhbSBMb2NrTmFtZSAtLSBBIFN0cmluZ1JlZiBuYW1lIGZvciB0aGUgbG9jayBleHByZXNzaW9uLCB0byBiZSBwcmludGVkCisgIC8vLyBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KKyAgLy8vIFxwYXJhbSBMb2MgLS0gVGhlIFNvdXJjZUxvY2F0aW9uIG9mIHRoZSBVbmxvY2sKKyAgdmlydHVhbCB2b2lkIGhhbmRsZVVubWF0Y2hlZFVubG9jayhTdHJpbmdSZWYgS2luZCwgTmFtZSBMb2NrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpIHt9CisKKyAgLy8vIFdhcm4gYWJvdXQgYW4gdW5sb2NrIGZ1bmN0aW9uIGNhbGwgdGhhdCBhdHRlbXB0cyB0byB1bmxvY2sgYSBsb2NrIHdpdGgKKyAgLy8vIHRoZSBpbmNvcnJlY3QgbG9jayBraW5kLiBGb3IgaW5zdGFuY2UsIGEgc2hhcmVkIGxvY2sgYmVpbmcgdW5sb2NrZWQKKyAgLy8vIGV4Y2x1c2l2ZWx5LCBvciB2aWNlIHZlcnNhLgorICAvLy8gXHBhcmFtIExvY2tOYW1lIC0tIEEgU3RyaW5nUmVmIG5hbWUgZm9yIHRoZSBsb2NrIGV4cHJlc3Npb24sIHRvIGJlIHByaW50ZWQKKyAgLy8vIGluIHRoZSBlcnJvciBtZXNzYWdlLgorICAvLy8gXHBhcmFtIEtpbmQgLS0gdGhlIGNhcGFiaWxpdHkncyBuYW1lIHBhcmFtZXRlciAocm9sZSwgbXV0ZXgsIGV0YykuCisgIC8vLyBccGFyYW0gRXhwZWN0ZWQgLS0gdGhlIGtpbmQgb2YgbG9jayBleHBlY3RlZC4KKyAgLy8vIFxwYXJhbSBSZWNlaXZlZCAtLSB0aGUga2luZCBvZiBsb2NrIHJlY2VpdmVkLgorICAvLy8gXHBhcmFtIExvYyAtLSBUaGUgU291cmNlTG9jYXRpb24gb2YgdGhlIFVubG9jay4KKyAgdmlydHVhbCB2b2lkIGhhbmRsZUluY29ycmVjdFVubG9ja0tpbmQoU3RyaW5nUmVmIEtpbmQsIE5hbWUgTG9ja05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2tLaW5kIEV4cGVjdGVkLCBMb2NrS2luZCBSZWNlaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKSB7fQorCisgIC8vLyBXYXJuIGFib3V0IGxvY2sgZnVuY3Rpb24gY2FsbHMgZm9yIGxvY2tzIHdoaWNoIGFyZSBhbHJlYWR5IGhlbGQuCisgIC8vLyBccGFyYW0gS2luZCAtLSB0aGUgY2FwYWJpbGl0eSdzIG5hbWUgcGFyYW1ldGVyIChyb2xlLCBtdXRleCwgZXRjKS4KKyAgLy8vIFxwYXJhbSBMb2NrTmFtZSAtLSBBIFN0cmluZ1JlZiBuYW1lIGZvciB0aGUgbG9jayBleHByZXNzaW9uLCB0byBiZSBwcmludGVkCisgIC8vLyBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KKyAgLy8vIFxwYXJhbSBMb2MgLS0gVGhlIGxvY2F0aW9uIG9mIHRoZSBzZWNvbmQgbG9jayBleHByZXNzaW9uLgorICB2aXJ0dWFsIHZvaWQgaGFuZGxlRG91YmxlTG9jayhTdHJpbmdSZWYgS2luZCwgTmFtZSBMb2NrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKSB7fQorCisgIC8vLyBXYXJuIGFib3V0IHNpdHVhdGlvbnMgd2hlcmUgYSBtdXRleCBpcyBzb21ldGltZXMgaGVsZCBhbmQgc29tZXRpbWVzIG5vdC4KKyAgLy8vIFRoZSB0aHJlZSBzaXR1YXRpb25zIGFyZToKKyAgLy8vIDEuIGEgbXV0ZXggaXMgbG9ja2VkIG9uIGFuICJpZiIgYnJhbmNoIGJ1dCBub3QgdGhlICJlbHNlIiBicmFuY2gsCisgIC8vLyAyLCBvciBhIG11dGV4IGlzIG9ubHkgaGVsZCBhdCB0aGUgc3RhcnQgb2Ygc29tZSBsb29wIGl0ZXJhdGlvbnMsCisgIC8vLyAzLiBvciB3aGVuIGEgbXV0ZXggaXMgbG9ja2VkIGJ1dCBub3QgdW5sb2NrZWQgaW5zaWRlIGEgZnVuY3Rpb24uCisgIC8vLyBccGFyYW0gS2luZCAtLSB0aGUgY2FwYWJpbGl0eSdzIG5hbWUgcGFyYW1ldGVyIChyb2xlLCBtdXRleCwgZXRjKS4KKyAgLy8vIFxwYXJhbSBMb2NrTmFtZSAtLSBBIFN0cmluZ1JlZiBuYW1lIGZvciB0aGUgbG9jayBleHByZXNzaW9uLCB0byBiZSBwcmludGVkCisgIC8vLyBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KKyAgLy8vIFxwYXJhbSBMb2NMb2NrZWQgLS0gVGhlIGxvY2F0aW9uIG9mIHRoZSBsb2NrIGV4cHJlc3Npb24gd2hlcmUgdGhlIG11dGV4IGlzCisgIC8vLyAgICAgICAgICAgICAgIGxvY2tlZAorICAvLy8gXHBhcmFtIExvY0VuZE9mU2NvcGUgLS0gVGhlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIHNjb3BlIHdoZXJlIHRoZQorICAvLy8gICAgICAgICAgICAgICBtdXRleCBpcyBubyBsb25nZXIgaGVsZAorICAvLy8gXHBhcmFtIExFSyAtLSB3aGljaCBvZiB0aGUgdGhyZWUgYWJvdmUgY2FzZXMgd2Ugc2hvdWxkIHdhcm4gZm9yCisgIHZpcnR1YWwgdm9pZCBoYW5kbGVNdXRleEhlbGRFbmRPZlNjb3BlKFN0cmluZ1JlZiBLaW5kLCBOYW1lIExvY2tOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2NMb2NrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvY0VuZE9mU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2tFcnJvcktpbmQgTEVLKSB7fQorCisgIC8vLyBXYXJuIHdoZW4gYSBtdXRleCBpcyBoZWxkIGV4Y2x1c2l2ZWx5IGFuZCBzaGFyZWQgYXQgdGhlIHNhbWUgcG9pbnQuIEZvcgorICAvLy8gZXhhbXBsZSwgaWYgYSBtdXRleCBpcyBsb2NrZWQgZXhjbHVzaXZlbHkgZHVyaW5nIGFuIGlmIGJyYW5jaCBhbmQgc2hhcmVkCisgIC8vLyBkdXJpbmcgdGhlIGVsc2UgYnJhbmNoLgorICAvLy8gXHBhcmFtIEtpbmQgLS0gdGhlIGNhcGFiaWxpdHkncyBuYW1lIHBhcmFtZXRlciAocm9sZSwgbXV0ZXgsIGV0YykuCisgIC8vLyBccGFyYW0gTG9ja05hbWUgLS0gQSBTdHJpbmdSZWYgbmFtZSBmb3IgdGhlIGxvY2sgZXhwcmVzc2lvbiwgdG8gYmUgcHJpbnRlZAorICAvLy8gaW4gdGhlIGVycm9yIG1lc3NhZ2UuCisgIC8vLyBccGFyYW0gTG9jMSAtLSBUaGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IGxvY2sgZXhwcmVzc2lvbi4KKyAgLy8vIFxwYXJhbSBMb2MyIC0tIFRoZSBsb2NhdGlvbiBvZiB0aGUgc2Vjb25kIGxvY2sgZXhwcmVzc2lvbi4KKyAgdmlydHVhbCB2b2lkIGhhbmRsZUV4Y2x1c2l2ZUFuZFNoYXJlZChTdHJpbmdSZWYgS2luZCwgTmFtZSBMb2NrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYzIpIHt9CisKKyAgLy8vIFdhcm4gd2hlbiBhIHByb3RlY3RlZCBvcGVyYXRpb24gb2NjdXJzIHdoaWxlIG5vIGxvY2tzIGFyZSBoZWxkLgorICAvLy8gXHBhcmFtIEtpbmQgLS0gdGhlIGNhcGFiaWxpdHkncyBuYW1lIHBhcmFtZXRlciAocm9sZSwgbXV0ZXgsIGV0YykuCisgIC8vLyBccGFyYW0gRCAtLSBUaGUgZGVjbCBmb3IgdGhlIHByb3RlY3RlZCB2YXJpYWJsZSBvciBmdW5jdGlvbgorICAvLy8gXHBhcmFtIFBPSyAtLSBUaGUga2luZCBvZiBwcm90ZWN0ZWQgb3BlcmF0aW9uIChlLmcuIHZhcmlhYmxlIGFjY2VzcykKKyAgLy8vIFxwYXJhbSBBSyAtLSBUaGUga2luZCBvZiBhY2Nlc3MgKGkuZS4gcmVhZCBvciB3cml0ZSkgdGhhdCBvY2N1cnJlZAorICAvLy8gXHBhcmFtIExvYyAtLSBUaGUgbG9jYXRpb24gb2YgdGhlIHByb3RlY3RlZCBvcGVyYXRpb24uCisgIHZpcnR1YWwgdm9pZCBoYW5kbGVOb011dGV4SGVsZChTdHJpbmdSZWYgS2luZCwgY29uc3QgTmFtZWREZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdGVjdGVkT3BlcmF0aW9uS2luZCBQT0ssIEFjY2Vzc0tpbmQgQUssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpIHt9CisKKyAgLy8vIFdhcm4gd2hlbiBhIHByb3RlY3RlZCBvcGVyYXRpb24gb2NjdXJzIHdoaWxlIHRoZSBzcGVjaWZpYyBtdXRleCBwcm90ZWN0aW5nCisgIC8vLyB0aGUgb3BlcmF0aW9uIGlzIG5vdCBsb2NrZWQuCisgIC8vLyBccGFyYW0gS2luZCAtLSB0aGUgY2FwYWJpbGl0eSdzIG5hbWUgcGFyYW1ldGVyIChyb2xlLCBtdXRleCwgZXRjKS4KKyAgLy8vIFxwYXJhbSBEIC0tIFRoZSBkZWNsIGZvciB0aGUgcHJvdGVjdGVkIHZhcmlhYmxlIG9yIGZ1bmN0aW9uCisgIC8vLyBccGFyYW0gUE9LIC0tIFRoZSBraW5kIG9mIHByb3RlY3RlZCBvcGVyYXRpb24gKGUuZy4gdmFyaWFibGUgYWNjZXNzKQorICAvLy8gXHBhcmFtIExvY2tOYW1lIC0tIEEgU3RyaW5nUmVmIG5hbWUgZm9yIHRoZSBsb2NrIGV4cHJlc3Npb24sIHRvIGJlIHByaW50ZWQKKyAgLy8vIGluIHRoZSBlcnJvciBtZXNzYWdlLgorICAvLy8gXHBhcmFtIExLIC0tIFRoZSBraW5kIG9mIGFjY2VzcyAoaS5lLiByZWFkIG9yIHdyaXRlKSB0aGF0IG9jY3VycmVkCisgIC8vLyBccGFyYW0gTG9jIC0tIFRoZSBsb2NhdGlvbiBvZiB0aGUgcHJvdGVjdGVkIG9wZXJhdGlvbi4KKyAgdmlydHVhbCB2b2lkIGhhbmRsZU11dGV4Tm90SGVsZChTdHJpbmdSZWYgS2luZCwgY29uc3QgTmFtZWREZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RlY3RlZE9wZXJhdGlvbktpbmQgUE9LLCBOYW1lIExvY2tOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2tLaW5kIExLLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAqUG9zc2libGVNYXRjaCA9IG51bGxwdHIpIHt9CisKKyAgLy8vIFdhcm4gd2hlbiBhY3F1aXJpbmcgYSBsb2NrIHRoYXQgdGhlIG5lZ2F0aXZlIGNhcGFiaWxpdHkgaXMgbm90IGhlbGQuCisgIC8vLyBccGFyYW0gS2luZCAtLSB0aGUgY2FwYWJpbGl0eSdzIG5hbWUgcGFyYW1ldGVyIChyb2xlLCBtdXRleCwgZXRjKS4KKyAgLy8vIFxwYXJhbSBMb2NrTmFtZSAtLSBUaGUgbmFtZSBmb3IgdGhlIGxvY2sgZXhwcmVzc2lvbiwgdG8gYmUgcHJpbnRlZCBpbiB0aGUKKyAgLy8vIGRpYWdub3N0aWMuCisgIC8vLyBccGFyYW0gTmVnIC0tIFRoZSBuYW1lIG9mIHRoZSBuZWdhdGl2ZSBjYXBhYmlsaXR5IHRvIGJlIHByaW50ZWQgaW4gdGhlCisgIC8vLyBkaWFnbm9zdGljLgorICAvLy8gXHBhcmFtIExvYyAtLSBUaGUgbG9jYXRpb24gb2YgdGhlIHByb3RlY3RlZCBvcGVyYXRpb24uCisgIHZpcnR1YWwgdm9pZCBoYW5kbGVOZWdhdGl2ZU5vdEhlbGQoU3RyaW5nUmVmIEtpbmQsIE5hbWUgTG9ja05hbWUsIE5hbWUgTmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYykge30KKworICAvLy8gV2FybiB3aGVuIGEgZnVuY3Rpb24gaXMgY2FsbGVkIHdoaWxlIGFuIGV4Y2x1ZGVkIG11dGV4IGlzIGxvY2tlZC4gRm9yCisgIC8vLyBleGFtcGxlLCB0aGUgbXV0ZXggbWF5IGJlIGxvY2tlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLgorICAvLy8gXHBhcmFtIEtpbmQgLS0gdGhlIGNhcGFiaWxpdHkncyBuYW1lIHBhcmFtZXRlciAocm9sZSwgbXV0ZXgsIGV0YykuCisgIC8vLyBccGFyYW0gRnVuTmFtZSAtLSBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KKyAgLy8vIFxwYXJhbSBMb2NrTmFtZSAtLSBBIFN0cmluZ1JlZiBuYW1lIGZvciB0aGUgbG9jayBleHByZXNzaW9uLCB0byBiZSBwcmludGVkCisgIC8vLyBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KKyAgLy8vIFxwYXJhbSBMb2MgLS0gVGhlIGxvY2F0aW9uIG9mIHRoZSBmdW5jdGlvbiBjYWxsLgorICB2aXJ0dWFsIHZvaWQgaGFuZGxlRnVuRXhjbHVkZXNMb2NrKFN0cmluZ1JlZiBLaW5kLCBOYW1lIEZ1bk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSBMb2NrTmFtZSwgU291cmNlTG9jYXRpb24gTG9jKSB7fQorCisgIC8vLyBXYXJuIHRoYXQgTDEgY2Fubm90IGJlIGFjcXVpcmVkIGJlZm9yZSBMMi4KKyAgdmlydHVhbCB2b2lkIGhhbmRsZUxvY2tBY3F1aXJlZEJlZm9yZShTdHJpbmdSZWYgS2luZCwgTmFtZSBMMU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSBMMk5hbWUsIFNvdXJjZUxvY2F0aW9uIExvYykge30KKworICAvLy8gV2FybiB0aGF0IHRoZXJlIGlzIGEgY3ljbGUgaW4gYWNxdWlyZWRfYmVmb3JlL2FmdGVyIGRlcGVuZGVuY2llcy4KKyAgdmlydHVhbCB2b2lkIGhhbmRsZUJlZm9yZUFmdGVyQ3ljbGUoTmFtZSBMMU5hbWUsIFNvdXJjZUxvY2F0aW9uIExvYykge30KKworICAvLy8gQ2FsbGVkIGJ5IHRoZSBhbmFseXNpcyB3aGVuIHN0YXJ0aW5nIGFuYWx5c2lzIG9mIGEgZnVuY3Rpb24uCisgIC8vLyBVc2VkIHRvIGlzc3VlIHN1Z2dlc3Rpb25zIGZvciBjaGFuZ2VzIHRvIGFubm90YXRpb25zLgorICB2aXJ0dWFsIHZvaWQgZW50ZXJGdW5jdGlvbihjb25zdCBGdW5jdGlvbkRlY2wgKkZEKSB7fQorCisgIC8vLyBDYWxsZWQgYnkgdGhlIGFuYWx5c2lzIHdoZW4gZmluaXNoaW5nIGFuYWx5c2lzIG9mIGEgZnVuY3Rpb24uCisgIHZpcnR1YWwgdm9pZCBsZWF2ZUZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQpIHt9CisKKyAgYm9vbCBpc3N1ZUJldGFXYXJuaW5ncygpIHsgcmV0dXJuIElzc3VlQmV0YVdhcm5pbmdzOyB9CisgIHZvaWQgc2V0SXNzdWVCZXRhV2FybmluZ3MoYm9vbCBiKSB7IElzc3VlQmV0YVdhcm5pbmdzID0gYjsgfQorCitwcml2YXRlOgorICBib29sIElzc3VlQmV0YVdhcm5pbmdzID0gZmFsc2U7Cit9OworCisvLy8gXGJyaWVmIENoZWNrIGEgZnVuY3Rpb24ncyBDRkcgZm9yIHRocmVhZC1zYWZldHkgdmlvbGF0aW9ucy4KKy8vLworLy8vIFdlIHRyYXZlcnNlIHRoZSBibG9ja3MgaW4gdGhlIENGRywgY29tcHV0ZSB0aGUgc2V0IG9mIG11dGV4ZXMgdGhhdCBhcmUgaGVsZAorLy8vIGF0IHRoZSBlbmQgb2YgZWFjaCBibG9jaywgYW5kIGlzc3VlIHdhcm5pbmdzIGZvciB0aHJlYWQgc2FmZXR5IHZpb2xhdGlvbnMuCisvLy8gRWFjaCBibG9jayBpbiB0aGUgQ0ZHIGlzIHRyYXZlcnNlZCBleGFjdGx5IG9uY2UuCit2b2lkIHJ1blRocmVhZFNhZmV0eUFuYWx5c2lzKEFuYWx5c2lzRGVjbENvbnRleHQgJkFDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRTYWZldHlIYW5kbGVyICZIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWZvcmVTZXQgKipCc2V0KTsKKwordm9pZCB0aHJlYWRTYWZldHlDbGVhbnVwKEJlZm9yZVNldCAqQ2FjaGUpOworCisvLy8gXGJyaWVmIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBMb2NrS2luZCByZXF1aXJlZCBmb3IgdGhlIGdpdmVuIGxldmVsCisvLy8gb2YgYWNjZXNzLgorTG9ja0tpbmQgZ2V0TG9ja0tpbmRGcm9tQWNjZXNzS2luZChBY2Nlc3NLaW5kIEFLKTsKKworfSAvLyBuYW1lc3BhY2UgdGhyZWFkU2FmZXR5Cit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19BTkFMWVNJU19BTkFMWVNFU19USFJFQURTQUZFVFlfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvVGhyZWFkU2FmZXR5Q29tbW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9UaHJlYWRTYWZldHlDb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODY3N2JhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvVGhyZWFkU2FmZXR5Q29tbW9uLmgKQEAgLTAsMCArMSw1MTkgQEAKKy8vPT09LSBUaHJlYWRTYWZldHlDb21tb24uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gUGFydHMgb2YgdGhyZWFkIHNhZmV0eSBhbmFseXNpcyB0aGF0IGFyZSBub3Qgc3BlY2lmaWMgdG8gdGhyZWFkIHNhZmV0eQorLy8gaXRzZWxmIGhhdmUgYmVlbiBmYWN0b3JlZCBpbnRvIGNsYXNzZXMgaGVyZSwgd2hlcmUgdGhleSBjYW4gYmUgcG90ZW50aWFsbHkKKy8vIHVzZWQgYnkgb3RoZXIgYW5hbHlzZXMuICBDdXJyZW50bHkgdGhlc2UgaW5jbHVkZToKKy8vCisvLyAqIEdlbmVyYWxpemUgY2xhbmcgQ0ZHIHZpc2l0b3JzLgorLy8gKiBDb252ZXJzaW9uIG9mIHRoZSBjbGFuZyBDRkcgdG8gU1NBIGZvcm0uCisvLyAqIFRyYW5zbGF0aW9uIG9mIGNsYW5nIEV4cHJzIHRvIFRJTCBTRXhwcnMKKy8vCisvLyBVTkRFUiBDT05TVFJVQ1RJT04uICBVU0UgQVQgWU9VUiBPV04gUklTSy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQU5BTFlTSVNfQU5BTFlTRVNfVEhSRUFEU0FGRVRZQ09NTU9OX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BTkFMWVNJU19BTkFMWVNFU19USFJFQURTQUZFVFlDT01NT05fSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2wuaCIKKyNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9BbmFseXNlcy9Qb3N0T3JkZXJDRkdWaWV3LmgiCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvVGhyZWFkU2FmZXR5VElMLmgiCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvVGhyZWFkU2FmZXR5VHJhdmVyc2UuaCIKKyNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9BbmFseXNlcy9UaHJlYWRTYWZldHlVdGlsLmgiCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQW5hbHlzaXNEZWNsQ29udGV4dC5oIgorI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0NGRy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQWJzdHJhY3RDb25kaXRpb25hbE9wZXJhdG9yOworY2xhc3MgQXJyYXlTdWJzY3JpcHRFeHByOworY2xhc3MgQmluYXJ5T3BlcmF0b3I7CitjbGFzcyBDYWxsRXhwcjsKK2NsYXNzIENhc3RFeHByOworY2xhc3MgQ1hYRGVzdHJ1Y3RvckRlY2w7CitjbGFzcyBDWFhNZW1iZXJDYWxsRXhwcjsKK2NsYXNzIENYWE9wZXJhdG9yQ2FsbEV4cHI7CitjbGFzcyBDWFhUaGlzRXhwcjsKK2NsYXNzIERlY2xSZWZFeHByOworY2xhc3MgRGVjbFN0bXQ7CitjbGFzcyBFeHByOworY2xhc3MgTWVtYmVyRXhwcjsKK2NsYXNzIFN0bXQ7CitjbGFzcyBVbmFyeU9wZXJhdG9yOworCituYW1lc3BhY2UgdGhyZWFkU2FmZXR5IHsKKworLy8gVmFyaW91cyBoZWxwZXIgZnVuY3Rpb25zIG9uIHRpbDo6U0V4cHIKK25hbWVzcGFjZSBzeCB7CisKK2lubGluZSBib29sIGVxdWFscyhjb25zdCB0aWw6OlNFeHByICpFMSwgY29uc3QgdGlsOjpTRXhwciAqRTIpIHsKKyAgcmV0dXJuIHRpbDo6RXF1YWxzQ29tcGFyYXRvcjo6Y29tcGFyZUV4cHJzKEUxLCBFMik7Cit9CisKK2lubGluZSBib29sIG1hdGNoZXMoY29uc3QgdGlsOjpTRXhwciAqRTEsIGNvbnN0IHRpbDo6U0V4cHIgKkUyKSB7CisgIC8vIFdlIHRyZWF0IGEgdG9wLWxldmVsIHdpbGRjYXJkIGFzIHRoZSAidW5pdnNlcnNhbCIgbG9jay4KKyAgLy8gSXQgbWF0Y2hlcyBldmVyeXRoaW5nIGZvciB0aGUgcHVycG9zZSBvZiBjaGVja2luZyBsb2NrcywgYnV0IG5vdAorICAvLyBmb3IgdW5sb2NraW5nIHRoZW0uCisgIGlmIChpc2E8dGlsOjpXaWxkY2FyZD4oRTEpKQorICAgIHJldHVybiBpc2E8dGlsOjpXaWxkY2FyZD4oRTIpOworICBpZiAoaXNhPHRpbDo6V2lsZGNhcmQ+KEUyKSkKKyAgICByZXR1cm4gaXNhPHRpbDo6V2lsZGNhcmQ+KEUxKTsKKworICByZXR1cm4gdGlsOjpNYXRjaENvbXBhcmF0b3I6OmNvbXBhcmVFeHBycyhFMSwgRTIpOworfQorCitpbmxpbmUgYm9vbCBwYXJ0aWFsbHlNYXRjaGVzKGNvbnN0IHRpbDo6U0V4cHIgKkUxLCBjb25zdCB0aWw6OlNFeHByICpFMikgeworICBjb25zdCBhdXRvICpQRTEgPSBkeW5fY2FzdF9vcl9udWxsPHRpbDo6UHJvamVjdD4oRTEpOworICBpZiAoIVBFMSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGNvbnN0IGF1dG8gKlBFMiA9IGR5bl9jYXN0X29yX251bGw8dGlsOjpQcm9qZWN0PihFMik7CisgIGlmICghUEUyKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIFBFMS0+Y2xhbmdEZWNsKCkgPT0gUEUyLT5jbGFuZ0RlY2woKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IHRpbDo6U0V4cHIgKkUpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHRpbDo6U3RkUHJpbnRlcjo6cHJpbnQoRSwgc3MpOworICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzeAorCisvLyBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIGludGVyZmFjZSBvZiBhIGNsYW5nIENGRyBWaXNpdG9yLgorLy8gQ0ZHV2Fsa2VyIHdpbGwgaW52b2tlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcy4KKy8vIE5vdGUgdGhhdCBtZXRob2RzIGFyZSBub3QgdmlydHVhbDsgdGhlIHZpc2l0b3IgaXMgdGVtcGxhdGl6ZWQuCitjbGFzcyBDRkdWaXNpdG9yIHsKKyAgLy8gRW50ZXIgdGhlIENGRyBmb3IgRGVjbCBELCBhbmQgcGVyZm9ybSBhbnkgaW5pdGlhbCBzZXR1cCBvcGVyYXRpb25zLgorICB2b2lkIGVudGVyQ0ZHKENGRyAqQ2ZnLCBjb25zdCBOYW1lZERlY2wgKkQsIGNvbnN0IENGR0Jsb2NrICpGaXJzdCkge30KKworICAvLyBFbnRlciBhIENGR0Jsb2NrLgorICB2b2lkIGVudGVyQ0ZHQmxvY2soY29uc3QgQ0ZHQmxvY2sgKkIpIHt9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdmlzaXRvciBpbXBsZW1lbnRzIGhhbmRsZVByZWRlY2Vzc29yCisgIGJvb2wgdmlzaXRQcmVkZWNlc3NvcnMoKSB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8gUHJvY2VzcyBhIHByZWRlY2Vzc29yIGVkZ2UuCisgIHZvaWQgaGFuZGxlUHJlZGVjZXNzb3IoY29uc3QgQ0ZHQmxvY2sgKlByZWQpIHt9CisKKyAgLy8gUHJvY2VzcyBhIHN1Y2Nlc3NvciBiYWNrIGVkZ2UgdG8gYSBwcmV2aW91c2x5IHZpc2l0ZWQgYmxvY2suCisgIHZvaWQgaGFuZGxlUHJlZGVjZXNzb3JCYWNrRWRnZShjb25zdCBDRkdCbG9jayAqUHJlZCkge30KKworICAvLyBDYWxsZWQganVzdCBiZWZvcmUgcHJvY2Vzc2luZyBzdGF0ZW1lbnRzLgorICB2b2lkIGVudGVyQ0ZHQmxvY2tCb2R5KGNvbnN0IENGR0Jsb2NrICpCKSB7fQorCisgIC8vIFByb2Nlc3MgYW4gb3JkaW5hcnkgc3RhdGVtZW50LgorICB2b2lkIGhhbmRsZVN0YXRlbWVudChjb25zdCBTdG10ICpTKSB7fQorCisgIC8vIFByb2Nlc3MgYSBkZXN0cnVjdG9yIGNhbGwKKyAgdm9pZCBoYW5kbGVEZXN0cnVjdG9yQ2FsbChjb25zdCBWYXJEZWNsICpWRCwgY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkREKSB7fQorCisgIC8vIENhbGxlZCBhZnRlciBhbGwgc3RhdGVtZW50cyBoYXZlIGJlZW4gaGFuZGxlZC4KKyAgdm9pZCBleGl0Q0ZHQmxvY2tCb2R5KGNvbnN0IENGR0Jsb2NrICpCKSB7fQorCisgIC8vIFJldHVybiB0cnVlCisgIGJvb2wgdmlzaXRTdWNjZXNzb3JzKCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vIFByb2Nlc3MgYSBzdWNjZXNzb3IgZWRnZS4KKyAgdm9pZCBoYW5kbGVTdWNjZXNzb3IoY29uc3QgQ0ZHQmxvY2sgKlN1Y2MpIHt9CisKKyAgLy8gUHJvY2VzcyBhIHN1Y2Nlc3NvciBiYWNrIGVkZ2UgdG8gYSBwcmV2aW91c2x5IHZpc2l0ZWQgYmxvY2suCisgIHZvaWQgaGFuZGxlU3VjY2Vzc29yQmFja0VkZ2UoY29uc3QgQ0ZHQmxvY2sgKlN1Y2MpIHt9CisKKyAgLy8gTGVhdmUgYSBDRkdCbG9jay4KKyAgdm9pZCBleGl0Q0ZHQmxvY2soY29uc3QgQ0ZHQmxvY2sgKkIpIHt9CisKKyAgLy8gTGVhdmUgdGhlIENGRywgYW5kIHBlcmZvcm0gYW55IGZpbmFsIGNsZWFudXAgb3BlcmF0aW9ucy4KKyAgdm9pZCBleGl0Q0ZHKGNvbnN0IENGR0Jsb2NrICpMYXN0KSB7fQorfTsKKworLy8gV2Fsa3MgdGhlIGNsYW5nIENGRywgYW5kIGludm9rZXMgbWV0aG9kcyBvbiBhIGdpdmVuIENGR1Zpc2l0b3IuCitjbGFzcyBDRkdXYWxrZXIgeworcHVibGljOgorICBDRkdXYWxrZXIoKSA9IGRlZmF1bHQ7CisKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgQ0ZHV2Fsa2VyLiAgVGhpcyBzZXR1cCBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgb25jZSwgZXZlbgorICAvLyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgcGFzc2VzIG92ZXIgdGhlIENGRy4KKyAgYm9vbCBpbml0KEFuYWx5c2lzRGVjbENvbnRleHQgJkFDKSB7CisgICAgQUN0eCA9ICZBQzsKKyAgICBDRkdyYXBoID0gQUMuZ2V0Q0ZHKCk7CisgICAgaWYgKCFDRkdyYXBoKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWdub3JlIGFub255bW91cyBmdW5jdGlvbnMuCisgICAgaWYgKCFkeW5fY2FzdF9vcl9udWxsPE5hbWVkRGVjbD4oQUMuZ2V0RGVjbCgpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFNvcnRlZEdyYXBoID0gQUMuZ2V0QW5hbHlzaXM8UG9zdE9yZGVyQ0ZHVmlldz4oKTsKKyAgICBpZiAoIVNvcnRlZEdyYXBoKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBUcmF2ZXJzZSB0aGUgQ0ZHLCBjYWxsaW5nIG1ldGhvZHMgb24gViBhcyBhcHByb3ByaWF0ZS4KKyAgdGVtcGxhdGUgPGNsYXNzIFZpc2l0b3I+CisgIHZvaWQgd2FsayhWaXNpdG9yICZWKSB7CisgICAgUG9zdE9yZGVyQ0ZHVmlldzo6Q0ZHQmxvY2tTZXQgVmlzaXRlZEJsb2NrcyhDRkdyYXBoKTsKKworICAgIFYuZW50ZXJDRkcoQ0ZHcmFwaCwgZ2V0RGVjbCgpLCAmQ0ZHcmFwaC0+Z2V0RW50cnkoKSk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gKkN1cnJCbG9jayA6ICpTb3J0ZWRHcmFwaCkgeworICAgICAgVmlzaXRlZEJsb2Nrcy5pbnNlcnQoQ3VyckJsb2NrKTsKKworICAgICAgVi5lbnRlckNGR0Jsb2NrKEN1cnJCbG9jayk7CisKKyAgICAgIC8vIFByb2Nlc3MgcHJlZGVjZXNzb3JzLCBoYW5kbGluZyBiYWNrIGVkZ2VzIGxhc3QKKyAgICAgIGlmIChWLnZpc2l0UHJlZGVjZXNzb3JzKCkpIHsKKyAgICAgICAgU21hbGxWZWN0b3I8Q0ZHQmxvY2sqLCA0PiBCYWNrRWRnZXM7CisgICAgICAgIC8vIFByb2Nlc3Mgc3VjY2Vzc29ycworICAgICAgICBmb3IgKENGR0Jsb2NrOjpjb25zdF9wcmVkX2l0ZXJhdG9yIFNJID0gQ3VyckJsb2NrLT5wcmVkX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0UgPSBDdXJyQmxvY2stPnByZWRfZW5kKCk7CisgICAgICAgICAgICAgU0kgIT0gU0U7ICsrU0kpIHsKKyAgICAgICAgICBpZiAoKlNJID09IG51bGxwdHIpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGlmICghVmlzaXRlZEJsb2Nrcy5hbHJlYWR5U2V0KCpTSSkpIHsKKyAgICAgICAgICAgIEJhY2tFZGdlcy5wdXNoX2JhY2soKlNJKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBWLmhhbmRsZVByZWRlY2Vzc29yKCpTSSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8gKkJsayA6IEJhY2tFZGdlcykKKyAgICAgICAgICBWLmhhbmRsZVByZWRlY2Vzc29yQmFja0VkZ2UoQmxrKTsKKyAgICAgIH0KKworICAgICAgVi5lbnRlckNGR0Jsb2NrQm9keShDdXJyQmxvY2spOworCisgICAgICAvLyBQcm9jZXNzIHN0YXRlbWVudHMKKyAgICAgIGZvciAoY29uc3QgYXV0byAmQkkgOiAqQ3VyckJsb2NrKSB7CisgICAgICAgIHN3aXRjaCAoQkkuZ2V0S2luZCgpKSB7CisgICAgICAgIGNhc2UgQ0ZHRWxlbWVudDo6U3RhdGVtZW50OgorICAgICAgICAgIFYuaGFuZGxlU3RhdGVtZW50KEJJLmNhc3RBczxDRkdTdG10PigpLmdldFN0bXQoKSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDRkdFbGVtZW50OjpBdXRvbWF0aWNPYmplY3REdG9yOiB7CisgICAgICAgICAgQ0ZHQXV0b21hdGljT2JqRHRvciBBRCA9IEJJLmNhc3RBczxDRkdBdXRvbWF0aWNPYmpEdG9yPigpOworICAgICAgICAgIGF1dG8gKkREID0gY29uc3RfY2FzdDxDWFhEZXN0cnVjdG9yRGVjbCAqPigKKyAgICAgICAgICAgICAgQUQuZ2V0RGVzdHJ1Y3RvckRlY2woQUN0eC0+Z2V0QVNUQ29udGV4dCgpKSk7CisgICAgICAgICAgYXV0byAqVkQgPSBjb25zdF9jYXN0PFZhckRlY2wgKj4oQUQuZ2V0VmFyRGVjbCgpKTsKKyAgICAgICAgICBWLmhhbmRsZURlc3RydWN0b3JDYWxsKFZELCBERCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBWLmV4aXRDRkdCbG9ja0JvZHkoQ3VyckJsb2NrKTsKKworICAgICAgLy8gUHJvY2VzcyBzdWNjZXNzb3JzLCBoYW5kbGluZyBiYWNrIGVkZ2VzIGZpcnN0LgorICAgICAgaWYgKFYudmlzaXRTdWNjZXNzb3JzKCkpIHsKKyAgICAgICAgU21hbGxWZWN0b3I8Q0ZHQmxvY2sqLCA4PiBGb3J3YXJkRWRnZXM7CisKKyAgICAgICAgLy8gUHJvY2VzcyBzdWNjZXNzb3JzCisgICAgICAgIGZvciAoQ0ZHQmxvY2s6OmNvbnN0X3N1Y2NfaXRlcmF0b3IgU0kgPSBDdXJyQmxvY2stPnN1Y2NfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRSA9IEN1cnJCbG9jay0+c3VjY19lbmQoKTsKKyAgICAgICAgICAgICBTSSAhPSBTRTsgKytTSSkgeworICAgICAgICAgIGlmICgqU0kgPT0gbnVsbHB0cikKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgaWYgKCFWaXNpdGVkQmxvY2tzLmFscmVhZHlTZXQoKlNJKSkgeworICAgICAgICAgICAgRm9yd2FyZEVkZ2VzLnB1c2hfYmFjaygqU0kpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIFYuaGFuZGxlU3VjY2Vzc29yQmFja0VkZ2UoKlNJKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byAqQmxrIDogRm9yd2FyZEVkZ2VzKQorICAgICAgICAgIFYuaGFuZGxlU3VjY2Vzc29yKEJsayk7CisgICAgICB9CisKKyAgICAgIFYuZXhpdENGR0Jsb2NrKEN1cnJCbG9jayk7CisgICAgfQorICAgIFYuZXhpdENGRygmQ0ZHcmFwaC0+Z2V0RXhpdCgpKTsKKyAgfQorCisgIGNvbnN0IENGRyAqZ2V0R3JhcGgoKSBjb25zdCB7IHJldHVybiBDRkdyYXBoOyB9CisgIENGRyAqZ2V0R3JhcGgoKSB7IHJldHVybiBDRkdyYXBoOyB9CisKKyAgY29uc3QgTmFtZWREZWNsICpnZXREZWNsKCkgY29uc3QgeworICAgIHJldHVybiBkeW5fY2FzdDxOYW1lZERlY2w+KEFDdHgtPmdldERlY2woKSk7CisgIH0KKworICBjb25zdCBQb3N0T3JkZXJDRkdWaWV3ICpnZXRTb3J0ZWRHcmFwaCgpIGNvbnN0IHsgcmV0dXJuIFNvcnRlZEdyYXBoOyB9CisKK3ByaXZhdGU6CisgIENGRyAqQ0ZHcmFwaCA9IG51bGxwdHI7CisgIEFuYWx5c2lzRGVjbENvbnRleHQgKkFDdHggPSBudWxscHRyOworICBQb3N0T3JkZXJDRkdWaWV3ICpTb3J0ZWRHcmFwaCA9IG51bGxwdHI7Cit9OworCisvLyBUT0RPOiBtb3ZlIHRoaXMgYmFjayBpbnRvIFRocmVhZFNhZmV0eS5jcHAKKy8vIFRoaXMgaXMgc3BlY2lmaWMgdG8gdGhyZWFkIHNhZmV0eS4gIEl0IGlzIGhlcmUgYmVjYXVzZQorLy8gdHJhbnNsYXRlQXR0ckV4cHIgbmVlZHMgaXQsIGJ1dCB0aGF0IHNob3VsZCBiZSBtb3ZlZCB0b28uCitjbGFzcyBDYXBhYmlsaXR5RXhwciB7Citwcml2YXRlOgorICAvLy8gVGhlIGNhcGFiaWxpdHkgZXhwcmVzc2lvbi4KKyAgY29uc3QgdGlsOjpTRXhwciogQ2FwRXhwcjsKKworICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIGEgbmVnYXRpdmUgY2FwYWJpbGl0eS4KKyAgYm9vbCBOZWdhdGVkOworCitwdWJsaWM6CisgIENhcGFiaWxpdHlFeHByKGNvbnN0IHRpbDo6U0V4cHIgKkUsIGJvb2wgTmVnKSA6IENhcEV4cHIoRSksIE5lZ2F0ZWQoTmVnKSB7fQorCisgIGNvbnN0IHRpbDo6U0V4cHIqIHNleHByKCkgY29uc3QgeyByZXR1cm4gQ2FwRXhwcjsgfQorICBib29sIG5lZ2F0aXZlKCkgY29uc3QgeyByZXR1cm4gTmVnYXRlZDsgfQorCisgIENhcGFiaWxpdHlFeHByIG9wZXJhdG9yISgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2FwYWJpbGl0eUV4cHIoQ2FwRXhwciwgIU5lZ2F0ZWQpOworICB9CisKKyAgYm9vbCBlcXVhbHMoY29uc3QgQ2FwYWJpbGl0eUV4cHIgJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIChOZWdhdGVkID09IG90aGVyLk5lZ2F0ZWQpICYmIHN4OjplcXVhbHMoQ2FwRXhwciwgb3RoZXIuQ2FwRXhwcik7CisgIH0KKworICBib29sIG1hdGNoZXMoY29uc3QgQ2FwYWJpbGl0eUV4cHIgJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIChOZWdhdGVkID09IG90aGVyLk5lZ2F0ZWQpICYmIHN4OjptYXRjaGVzKENhcEV4cHIsIG90aGVyLkNhcEV4cHIpOworICB9CisKKyAgYm9vbCBtYXRjaGVzVW5pdihjb25zdCBDYXBhYmlsaXR5RXhwciAmQ2FwRSkgY29uc3QgeworICAgIHJldHVybiBpc1VuaXZlcnNhbCgpIHx8IG1hdGNoZXMoQ2FwRSk7CisgIH0KKworICBib29sIHBhcnRpYWxseU1hdGNoZXMoY29uc3QgQ2FwYWJpbGl0eUV4cHIgJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIChOZWdhdGVkID09IG90aGVyLk5lZ2F0ZWQpICYmCisgICAgICAgICAgICBzeDo6cGFydGlhbGx5TWF0Y2hlcyhDYXBFeHByLCBvdGhlci5DYXBFeHByKTsKKyAgfQorCisgIGNvbnN0IFZhbHVlRGVjbCogdmFsdWVEZWNsKCkgY29uc3QgeworICAgIGlmIChOZWdhdGVkIHx8IENhcEV4cHIgPT0gbnVsbHB0cikKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIGlmIChjb25zdCBhdXRvICpQID0gZHluX2Nhc3Q8dGlsOjpQcm9qZWN0PihDYXBFeHByKSkKKyAgICAgIHJldHVybiBQLT5jbGFuZ0RlY2woKTsKKyAgICBpZiAoY29uc3QgYXV0byAqUCA9IGR5bl9jYXN0PHRpbDo6TGl0ZXJhbFB0cj4oQ2FwRXhwcikpCisgICAgICByZXR1cm4gUC0+Y2xhbmdEZWNsKCk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICBpZiAoTmVnYXRlZCkKKyAgICAgIHJldHVybiAiISIgKyBzeDo6dG9TdHJpbmcoQ2FwRXhwcik7CisgICAgcmV0dXJuIHN4Ojp0b1N0cmluZyhDYXBFeHByKTsKKyAgfQorCisgIGJvb2wgc2hvdWxkSWdub3JlKCkgY29uc3QgeyByZXR1cm4gQ2FwRXhwciA9PSBudWxscHRyOyB9CisKKyAgYm9vbCBpc0ludmFsaWQoKSBjb25zdCB7IHJldHVybiBzZXhwcigpICYmIGlzYTx0aWw6OlVuZGVmaW5lZD4oc2V4cHIoKSk7IH0KKworICBib29sIGlzVW5pdmVyc2FsKCkgY29uc3QgeyByZXR1cm4gc2V4cHIoKSAmJiBpc2E8dGlsOjpXaWxkY2FyZD4oc2V4cHIoKSk7IH0KK307CisKKy8vIFRyYW5zbGF0ZSBjbGFuZzo6RXhwciB0byB0aWw6OlNFeHByLgorY2xhc3MgU0V4cHJCdWlsZGVyIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBFbmNhcHN1bGF0ZXMgdGhlIGxleGljYWwgY29udGV4dCBvZiBhIGZ1bmN0aW9uIGNhbGwuICBUaGUgbGV4aWNhbAorICAvLy8gY29udGV4dCBpbmNsdWRlcyB0aGUgYXJndW1lbnRzIHRvIHRoZSBjYWxsLCBpbmNsdWRpbmcgdGhlIGltcGxpY2l0IG9iamVjdAorICAvLy8gYXJndW1lbnQuICBXaGVuIGFuIGF0dHJpYnV0ZSBjb250YWluaW5nIGEgbXV0ZXggZXhwcmVzc2lvbiBpcyBhdHRhY2hlZCB0bworICAvLy8gYSBtZXRob2QsIHRoZSBleHByZXNzaW9uIG1heSByZWZlciB0byBmb3JtYWwgcGFyYW1ldGVycyBvZiB0aGUgbWV0aG9kLgorICAvLy8gQWN0dWFsIGFyZ3VtZW50cyBtdXN0IGJlIHN1YnN0aXR1dGVkIGZvciBmb3JtYWwgcGFyYW1ldGVycyB0byBkZXJpdmUKKyAgLy8vIHRoZSBhcHByb3ByaWF0ZSBtdXRleCBleHByZXNzaW9uIGluIHRoZSBsZXhpY2FsIGNvbnRleHQgd2hlcmUgdGhlIGZ1bmN0aW9uCisgIC8vLyBpcyBjYWxsZWQuICBQcmV2Q3R4IGhvbGRzIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBhcmd1bWVudHMgdGhlbXNlbHZlcworICAvLy8gc2hvdWxkIGJlIGV2YWx1YXRlZDsgbXVsdGlwbGUgY2FsbGluZyBjb250ZXh0cyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlcgorICAvLy8gYnkgdGhlIGxvY2tfcmV0dXJuZWQgYXR0cmlidXRlLgorICBzdHJ1Y3QgQ2FsbGluZ0NvbnRleHQgeworICAgIC8vIFRoZSBwcmV2aW91cyBjb250ZXh0OyBvciAwIGlmIG5vbmUuCisgICAgQ2FsbGluZ0NvbnRleHQgICpQcmV2OworCisgICAgLy8gVGhlIGRlY2wgdG8gd2hpY2ggdGhlIGF0dHIgaXMgYXR0YWNoZWQuCisgICAgY29uc3QgTmFtZWREZWNsICpBdHRyRGVjbDsKKworICAgIC8vIEltcGxpY2l0IG9iamVjdCBhcmd1bWVudCAtLSBlLmcuICd0aGlzJworICAgIGNvbnN0IEV4cHIgKlNlbGZBcmcgPSBudWxscHRyOworCisgICAgLy8gTnVtYmVyIG9mIGZ1bkFyZ3MKKyAgICB1bnNpZ25lZCBOdW1BcmdzID0gMDsKKworICAgIC8vIEZ1bmN0aW9uIGFyZ3VtZW50cworICAgIGNvbnN0IEV4cHIgKmNvbnN0ICpGdW5BcmdzID0gbnVsbHB0cjsKKworICAgIC8vIGlzIFNlbGYgcmVmZXJyZWQgdG8gd2l0aCAtPiBvciAuPworICAgIGJvb2wgU2VsZkFycm93ID0gZmFsc2U7CisKKyAgICBDYWxsaW5nQ29udGV4dChDYWxsaW5nQ29udGV4dCAqUCwgY29uc3QgTmFtZWREZWNsICpEID0gbnVsbHB0cikKKyAgICAgICAgOiBQcmV2KFApLCBBdHRyRGVjbChEKSB7fQorICB9OworCisgIFNFeHByQnVpbGRlcih0aWw6Ok1lbVJlZ2lvblJlZiBBKSA6IEFyZW5hKEEpIHsKKyAgICAvLyBGSVhNRTogd2UgZG9uJ3QgYWx3YXlzIGhhdmUgYSBzZWxmLXZhcmlhYmxlLgorICAgIFNlbGZWYXIgPSBuZXcgKEFyZW5hKSB0aWw6OlZhcmlhYmxlKG51bGxwdHIpOworICAgIFNlbGZWYXItPnNldEtpbmQodGlsOjpWYXJpYWJsZTo6VktfU0Z1bik7CisgIH0KKworICAvLyBUcmFuc2xhdGUgYSBjbGFuZyBleHByZXNzaW9uIGluIGFuIGF0dHJpYnV0ZSB0byBhIHRpbDo6U0V4cHIuCisgIC8vIENvbnN0cnVjdHMgdGhlIGNvbnRleHQgZnJvbSBELCBEZWNsRXhwLCBhbmQgU2VsZkRlY2wuCisgIENhcGFiaWxpdHlFeHByIHRyYW5zbGF0ZUF0dHJFeHByKGNvbnN0IEV4cHIgKkF0dHJFeHAsIGNvbnN0IE5hbWVkRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqRGVjbEV4cCwgVmFyRGVjbCAqU2VsZkQ9bnVsbHB0cik7CisKKyAgQ2FwYWJpbGl0eUV4cHIgdHJhbnNsYXRlQXR0ckV4cHIoY29uc3QgRXhwciAqQXR0ckV4cCwgQ2FsbGluZ0NvbnRleHQgKkN0eCk7CisKKyAgLy8gVHJhbnNsYXRlIGEgY2xhbmcgc3RhdGVtZW50IG9yIGV4cHJlc3Npb24gdG8gYSBUSUwgZXhwcmVzc2lvbi4KKyAgLy8gQWxzbyBwZXJmb3JtcyBzdWJzdGl0dXRpb24gb2YgdmFyaWFibGVzOyBDdHggcHJvdmlkZXMgdGhlIGNvbnRleHQuCisgIC8vIERpc3BhdGNoZXMgb24gdGhlIHR5cGUgb2YgUy4KKyAgdGlsOjpTRXhwciAqdHJhbnNsYXRlKGNvbnN0IFN0bXQgKlMsIENhbGxpbmdDb250ZXh0ICpDdHgpOworICB0aWw6OlNDRkcgICpidWlsZENGRyhDRkdXYWxrZXIgJldhbGtlcik7CisKKyAgdGlsOjpTRXhwciAqbG9va3VwU3RtdChjb25zdCBTdG10ICpTKTsKKworICB0aWw6OkJhc2ljQmxvY2sgKmxvb2t1cEJsb2NrKGNvbnN0IENGR0Jsb2NrICpCKSB7CisgICAgcmV0dXJuIEJsb2NrTWFwW0ItPmdldEJsb2NrSUQoKV07CisgIH0KKworICBjb25zdCB0aWw6OlNDRkcgKmdldENGRygpIGNvbnN0IHsgcmV0dXJuIFNjZmc7IH0KKyAgdGlsOjpTQ0ZHICpnZXRDRkcoKSB7IHJldHVybiBTY2ZnOyB9CisKK3ByaXZhdGU6CisgIC8vIFdlIGltcGxlbWVudCB0aGUgQ0ZHVmlzaXRvciBBUEkKKyAgZnJpZW5kIGNsYXNzIENGR1dhbGtlcjsKKworICB0aWw6OlNFeHByICp0cmFuc2xhdGVEZWNsUmVmRXhwcihjb25zdCBEZWNsUmVmRXhwciAqRFJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udGV4dCAqQ3R4KSA7CisgIHRpbDo6U0V4cHIgKnRyYW5zbGF0ZUNYWFRoaXNFeHByKGNvbnN0IENYWFRoaXNFeHByICpURSwgQ2FsbGluZ0NvbnRleHQgKkN0eCk7CisgIHRpbDo6U0V4cHIgKnRyYW5zbGF0ZU1lbWJlckV4cHIoY29uc3QgTWVtYmVyRXhwciAqTUUsIENhbGxpbmdDb250ZXh0ICpDdHgpOworICB0aWw6OlNFeHByICp0cmFuc2xhdGVDYWxsRXhwcihjb25zdCBDYWxsRXhwciAqQ0UsIENhbGxpbmdDb250ZXh0ICpDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHIgKlNlbGZFID0gbnVsbHB0cik7CisgIHRpbDo6U0V4cHIgKnRyYW5zbGF0ZUNYWE1lbWJlckNhbGxFeHByKGNvbnN0IENYWE1lbWJlckNhbGxFeHByICpNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnRleHQgKkN0eCk7CisgIHRpbDo6U0V4cHIgKnRyYW5zbGF0ZUNYWE9wZXJhdG9yQ2FsbEV4cHIoY29uc3QgQ1hYT3BlcmF0b3JDYWxsRXhwciAqT0NFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb250ZXh0ICpDdHgpOworICB0aWw6OlNFeHByICp0cmFuc2xhdGVVbmFyeU9wZXJhdG9yKGNvbnN0IFVuYXJ5T3BlcmF0b3IgKlVPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb250ZXh0ICpDdHgpOworICB0aWw6OlNFeHByICp0cmFuc2xhdGVCaW5PcCh0aWw6OlRJTF9CaW5hcnlPcGNvZGUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJpbmFyeU9wZXJhdG9yICpCTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnRleHQgKkN0eCwgYm9vbCBSZXZlcnNlID0gZmFsc2UpOworICB0aWw6OlNFeHByICp0cmFuc2xhdGVCaW5Bc3NpZ24odGlsOjpUSUxfQmluYXJ5T3Bjb2RlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmluYXJ5T3BlcmF0b3IgKkJPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnRleHQgKkN0eCwgYm9vbCBBc3NpZ24gPSBmYWxzZSk7CisgIHRpbDo6U0V4cHIgKnRyYW5zbGF0ZUJpbmFyeU9wZXJhdG9yKGNvbnN0IEJpbmFyeU9wZXJhdG9yICpCTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnRleHQgKkN0eCk7CisgIHRpbDo6U0V4cHIgKnRyYW5zbGF0ZUNhc3RFeHByKGNvbnN0IENhc3RFeHByICpDRSwgQ2FsbGluZ0NvbnRleHQgKkN0eCk7CisgIHRpbDo6U0V4cHIgKnRyYW5zbGF0ZUFycmF5U3Vic2NyaXB0RXhwcihjb25zdCBBcnJheVN1YnNjcmlwdEV4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udGV4dCAqQ3R4KTsKKyAgdGlsOjpTRXhwciAqdHJhbnNsYXRlQWJzdHJhY3RDb25kaXRpb25hbE9wZXJhdG9yKAorICAgICAgY29uc3QgQWJzdHJhY3RDb25kaXRpb25hbE9wZXJhdG9yICpDLCBDYWxsaW5nQ29udGV4dCAqQ3R4KTsKKworICB0aWw6OlNFeHByICp0cmFuc2xhdGVEZWNsU3RtdChjb25zdCBEZWNsU3RtdCAqUywgQ2FsbGluZ0NvbnRleHQgKkN0eCk7CisKKyAgLy8gTWFwIGZyb20gc3RhdGVtZW50cyBpbiB0aGUgY2xhbmcgQ0ZHIHRvIFNFeHBycyBpbiB0aGUgdGlsOjpTQ0ZHLgorICB1c2luZyBTdGF0ZW1lbnRNYXAgPSBsbHZtOjpEZW5zZU1hcDxjb25zdCBTdG10ICosIHRpbDo6U0V4cHIgKj47CisKKyAgLy8gTWFwIGZyb20gY2xhbmcgbG9jYWwgdmFyaWFibGVzIHRvIGluZGljZXMgaW4gYSBMVmFyRGVmaW5pdGlvbk1hcC4KKyAgdXNpbmcgTFZhckluZGV4TWFwID0gbGx2bTo6RGVuc2VNYXA8Y29uc3QgVmFsdWVEZWNsICosIHVuc2lnbmVkPjsKKworICAvLyBNYXAgZnJvbSBsb2NhbCB2YXJpYWJsZSBpbmRpY2VzIHRvIFNTQSB2YXJpYWJsZXMgKG9yIGNvbnN0YW50cykuCisgIHVzaW5nIE5hbWVWYXJQYWlyID0gc3RkOjpwYWlyPGNvbnN0IFZhbHVlRGVjbCAqLCB0aWw6OlNFeHByICo+OworICB1c2luZyBMVmFyRGVmaW5pdGlvbk1hcCA9IENvcHlPbldyaXRlVmVjdG9yPE5hbWVWYXJQYWlyPjsKKworICBzdHJ1Y3QgQmxvY2tJbmZvIHsKKyAgICBMVmFyRGVmaW5pdGlvbk1hcCBFeGl0TWFwOworICAgIGJvb2wgSGFzQmFja0VkZ2VzID0gZmFsc2U7CisKKyAgICAvLyBTdWNjZXNzb3JzIHlldCB0byBiZSBwcm9jZXNzZWQKKyAgICB1bnNpZ25lZCBVbnByb2Nlc3NlZFN1Y2Nlc3NvcnMgPSAwOworCisgICAgLy8gUHJlZGVjZXNzb3JzIGFscmVhZHkgcHJvY2Vzc2VkCisgICAgdW5zaWduZWQgUHJvY2Vzc2VkUHJlZGVjZXNzb3JzID0gMDsKKworICAgIEJsb2NrSW5mbygpID0gZGVmYXVsdDsKKyAgICBCbG9ja0luZm8oQmxvY2tJbmZvICYmKSA9IGRlZmF1bHQ7CisgICAgQmxvY2tJbmZvICZvcGVyYXRvcj0oQmxvY2tJbmZvICYmKSA9IGRlZmF1bHQ7CisgIH07CisKKyAgdm9pZCBlbnRlckNGRyhDRkcgKkNmZywgY29uc3QgTmFtZWREZWNsICpELCBjb25zdCBDRkdCbG9jayAqRmlyc3QpOworICB2b2lkIGVudGVyQ0ZHQmxvY2soY29uc3QgQ0ZHQmxvY2sgKkIpOworICBib29sIHZpc2l0UHJlZGVjZXNzb3JzKCkgeyByZXR1cm4gdHJ1ZTsgfQorICB2b2lkIGhhbmRsZVByZWRlY2Vzc29yKGNvbnN0IENGR0Jsb2NrICpQcmVkKTsKKyAgdm9pZCBoYW5kbGVQcmVkZWNlc3NvckJhY2tFZGdlKGNvbnN0IENGR0Jsb2NrICpQcmVkKTsKKyAgdm9pZCBlbnRlckNGR0Jsb2NrQm9keShjb25zdCBDRkdCbG9jayAqQik7CisgIHZvaWQgaGFuZGxlU3RhdGVtZW50KGNvbnN0IFN0bXQgKlMpOworICB2b2lkIGhhbmRsZURlc3RydWN0b3JDYWxsKGNvbnN0IFZhckRlY2wgKlZELCBjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqREQpOworICB2b2lkIGV4aXRDRkdCbG9ja0JvZHkoY29uc3QgQ0ZHQmxvY2sgKkIpOworICBib29sIHZpc2l0U3VjY2Vzc29ycygpIHsgcmV0dXJuIHRydWU7IH0KKyAgdm9pZCBoYW5kbGVTdWNjZXNzb3IoY29uc3QgQ0ZHQmxvY2sgKlN1Y2MpOworICB2b2lkIGhhbmRsZVN1Y2Nlc3NvckJhY2tFZGdlKGNvbnN0IENGR0Jsb2NrICpTdWNjKTsKKyAgdm9pZCBleGl0Q0ZHQmxvY2soY29uc3QgQ0ZHQmxvY2sgKkIpOworICB2b2lkIGV4aXRDRkcoY29uc3QgQ0ZHQmxvY2sgKkxhc3QpOworCisgIHZvaWQgaW5zZXJ0U3RtdChjb25zdCBTdG10ICpTLCB0aWw6OlNFeHByICpFKSB7CisgICAgU01hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoUywgRSkpOworICB9CisKKyAgdGlsOjpTRXhwciAqZ2V0Q3VycmVudExWYXJEZWZpbml0aW9uKGNvbnN0IFZhbHVlRGVjbCAqVkQpOworCisgIHRpbDo6U0V4cHIgKmFkZFN0YXRlbWVudCh0aWw6OlNFeHByICpFLCBjb25zdCBTdG10ICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVEZWNsICpWRCA9IG51bGxwdHIpOworICB0aWw6OlNFeHByICpsb29rdXBWYXJEZWNsKGNvbnN0IFZhbHVlRGVjbCAqVkQpOworICB0aWw6OlNFeHByICphZGRWYXJEZWNsKGNvbnN0IFZhbHVlRGVjbCAqVkQsIHRpbDo6U0V4cHIgKkUpOworICB0aWw6OlNFeHByICp1cGRhdGVWYXJEZWNsKGNvbnN0IFZhbHVlRGVjbCAqVkQsIHRpbDo6U0V4cHIgKkUpOworCisgIHZvaWQgbWFrZVBoaU5vZGVWYXIodW5zaWduZWQgaSwgdW5zaWduZWQgTlByZWRzLCB0aWw6OlNFeHByICpFKTsKKyAgdm9pZCBtZXJnZUVudHJ5TWFwKExWYXJEZWZpbml0aW9uTWFwIE1hcCk7CisgIHZvaWQgbWVyZ2VFbnRyeU1hcEJhY2tFZGdlKCk7CisgIHZvaWQgbWVyZ2VQaGlOb2Rlc0JhY2tFZGdlKGNvbnN0IENGR0Jsb2NrICpCbGspOworCitwcml2YXRlOgorICAvLyBTZXQgdG8gdHJ1ZSB3aGVuIHBhcnNpbmcgY2FwYWJpbGl0eSBleHByZXNzaW9ucywgd2hpY2ggZ2V0IHRyYW5zbGF0ZWQKKyAgLy8gaW5hY2N1cmF0ZWx5IGluIG9yZGVyIHRvIGhhY2sgYXJvdW5kIHNtYXJ0IHBvaW50ZXJzIGV0Yy4KKyAgc3RhdGljIGNvbnN0IGJvb2wgQ2FwYWJpbGl0eUV4cHJNb2RlID0gdHJ1ZTsKKworICB0aWw6Ok1lbVJlZ2lvblJlZiBBcmVuYTsKKworICAvLyBWYXJpYWJsZSB0byB1c2UgZm9yICd0aGlzJy4gIE1heSBiZSBudWxsLgorICB0aWw6OlZhcmlhYmxlICpTZWxmVmFyID0gbnVsbHB0cjsKKworICB0aWw6OlNDRkcgKlNjZmcgPSBudWxscHRyOworCisgIC8vIE1hcCBmcm9tIFN0bXQgdG8gVElMIFZhcmlhYmxlcworICBTdGF0ZW1lbnRNYXAgU01hcDsKKworICAvLyBJbmRpY2VzIG9mIGNsYW5nIGxvY2FsIHZhcnMuCisgIExWYXJJbmRleE1hcCBMVmFySWR4TWFwOworCisgIC8vIE1hcCBmcm9tIGNsYW5nIHRvIHRpbCBCQnMuCisgIHN0ZDo6dmVjdG9yPHRpbDo6QmFzaWNCbG9jayAqPiBCbG9ja01hcDsKKworICAvLyBFeHRyYSBpbmZvcm1hdGlvbiBwZXIgQkIuIEluZGV4ZWQgYnkgY2xhbmcgQmxvY2tJRC4KKyAgc3RkOjp2ZWN0b3I8QmxvY2tJbmZvPiBCQkluZm87ICAgICAgICAgICAKKworICBMVmFyRGVmaW5pdGlvbk1hcCBDdXJyZW50TFZhck1hcDsKKyAgc3RkOjp2ZWN0b3I8dGlsOjpQaGkgKj4gQ3VycmVudEFyZ3VtZW50czsKKyAgc3RkOjp2ZWN0b3I8dGlsOjpTRXhwciAqPiBDdXJyZW50SW5zdHJ1Y3Rpb25zOworICBzdGQ6OnZlY3Rvcjx0aWw6OlBoaSAqPiBJbmNvbXBsZXRlQXJnczsKKyAgdGlsOjpCYXNpY0Jsb2NrICpDdXJyZW50QkIgPSBudWxscHRyOworICBCbG9ja0luZm8gKkN1cnJlbnRCbG9ja0luZm8gPSBudWxscHRyOworfTsKKworLy8gRHVtcCBhbiBTQ0ZHIHRvIGxsdm06OmVycnMoKS4KK3ZvaWQgcHJpbnRTQ0ZHKENGR1dhbGtlciAmV2Fsa2VyKTsKKworfSAvLyBuYW1lc3BhY2UgdGhyZWFkU2FmZXR5Cit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19USFJFQURfU0FGRVRZX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9UaHJlYWRTYWZldHlMb2dpY2FsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9UaHJlYWRTYWZldHlMb2dpY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3ODAyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL1RocmVhZFNhZmV0eUxvZ2ljYWwuaApAQCAtMCwwICsxLDEwOCBAQAorLy89PT0tIFRocmVhZFNhZmV0eUxvZ2ljYWwuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgcmVwcmVzZW50YXRpb24gZm9yIGxvZ2ljYWwgZXhwcmVzc2lvbnMgd2l0aCBTRXhwciBsZWF2ZXMKKy8vIHRoYXQgYXJlIHVzZWQgYXMgcGFydCBvZiBmYWN0LWNoZWNraW5nIGNhcGFiaWxpdHkgZXhwcmVzc2lvbnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQU5BTFlTSVNfQU5BTFlTRVNfVEhSRUFEU0FGRVRZTE9HSUNBTF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQU5BTFlTSVNfQU5BTFlTRVNfVEhSRUFEU0FGRVRZTE9HSUNBTF9ICisKKyNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9BbmFseXNlcy9UaHJlYWRTYWZldHlUSUwuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSB0aHJlYWRTYWZldHkgeworbmFtZXNwYWNlIGxleHByIHsKKworY2xhc3MgTEV4cHIgeworcHVibGljOgorICBlbnVtIE9wY29kZSB7CisgICAgVGVybWluYWwsCisgICAgQW5kLAorICAgIE9yLAorICAgIE5vdAorICB9OworICBPcGNvZGUga2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICAvLy8gXGJyaWVmIExvZ2ljYWwgaW1wbGljYXRpb24uIFJldHVybnMgdHJ1ZSBpZiB0aGUgTEV4cHIgaW1wbGllcyBSSFMsIGkuZS4gaWYKKyAgLy8vIHRoZSBMRXhwciBob2xkcywgdGhlbiBSSFMgbXVzdCBob2xkLiBGb3IgZXhhbXBsZSwgKEEgJiBCKSBpbXBsaWVzIEEuCisgIGlubGluZSBib29sIGltcGxpZXMoY29uc3QgTEV4cHIgKlJIUykgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgTEV4cHIoT3Bjb2RlIEtpbmQpIDogS2luZChLaW5kKSB7fQorCitwcml2YXRlOgorICBPcGNvZGUgS2luZDsKK307CisKK2NsYXNzIFRlcm1pbmFsIDogcHVibGljIExFeHByIHsKKyAgdGlsOjpTRXhwciAqRXhwcjsKKworcHVibGljOgorICBUZXJtaW5hbCh0aWw6OlNFeHByICpFeHByKSA6IExFeHByKExFeHByOjpUZXJtaW5hbCksIEV4cHIoRXhwcikge30KKworICBjb25zdCB0aWw6OlNFeHByICpleHByKCkgY29uc3QgeyByZXR1cm4gRXhwcjsgfQorICB0aWw6OlNFeHByICpleHByKCkgeyByZXR1cm4gRXhwcjsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTEV4cHIgKkUpIHsgcmV0dXJuIEUtPmtpbmQoKSA9PSBMRXhwcjo6VGVybWluYWw7IH0KK307CisKK2NsYXNzIEJpbk9wIDogcHVibGljIExFeHByIHsKKyAgTEV4cHIgKkxIUywgKlJIUzsKKworcHJvdGVjdGVkOgorICBCaW5PcChMRXhwciAqTEhTLCBMRXhwciAqUkhTLCBPcGNvZGUgQ29kZSkgOiBMRXhwcihDb2RlKSwgTEhTKExIUyksIFJIUyhSSFMpIHt9CisKK3B1YmxpYzoKKyAgY29uc3QgTEV4cHIgKmxlZnQoKSBjb25zdCB7IHJldHVybiBMSFM7IH0KKyAgTEV4cHIgKmxlZnQoKSB7IHJldHVybiBMSFM7IH0KKworICBjb25zdCBMRXhwciAqcmlnaHQoKSBjb25zdCB7IHJldHVybiBSSFM7IH0KKyAgTEV4cHIgKnJpZ2h0KCkgeyByZXR1cm4gUkhTOyB9Cit9OworCitjbGFzcyBBbmQgOiBwdWJsaWMgQmluT3AgeworcHVibGljOgorICBBbmQoTEV4cHIgKkxIUywgTEV4cHIgKlJIUykgOiBCaW5PcChMSFMsIFJIUywgTEV4cHI6OkFuZCkge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IExFeHByICpFKSB7IHJldHVybiBFLT5raW5kKCkgPT0gTEV4cHI6OkFuZDsgfQorfTsKKworY2xhc3MgT3IgOiBwdWJsaWMgQmluT3AgeworcHVibGljOgorICBPcihMRXhwciAqTEhTLCBMRXhwciAqUkhTKSA6IEJpbk9wKExIUywgUkhTLCBMRXhwcjo6T3IpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBMRXhwciAqRSkgeyByZXR1cm4gRS0+a2luZCgpID09IExFeHByOjpPcjsgfQorfTsKKworY2xhc3MgTm90IDogcHVibGljIExFeHByIHsKKyAgTEV4cHIgKkV4cDsKKworcHVibGljOgorICBOb3QoTEV4cHIgKkV4cCkgOiBMRXhwcihMRXhwcjo6Tm90KSwgRXhwKEV4cCkge30KKworICBjb25zdCBMRXhwciAqZXhwKCkgY29uc3QgeyByZXR1cm4gRXhwOyB9CisgIExFeHByICpleHAoKSB7IHJldHVybiBFeHA7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IExFeHByICpFKSB7IHJldHVybiBFLT5raW5kKCkgPT0gTEV4cHI6Ok5vdDsgfQorfTsKKworLy8vIFxicmllZiBMb2dpY2FsIGltcGxpY2F0aW9uLiBSZXR1cm5zIHRydWUgaWYgTEhTIGltcGxpZXMgUkhTLCBpLmUuIGlmIExIUworLy8vIGhvbGRzLCB0aGVuIFJIUyBtdXN0IGhvbGQuIEZvciBleGFtcGxlLCAoQSAmIEIpIGltcGxpZXMgQS4KK2Jvb2wgaW1wbGllcyhjb25zdCBMRXhwciAqTEhTLCBjb25zdCBMRXhwciAqUkhTKTsKKworYm9vbCBMRXhwcjo6aW1wbGllcyhjb25zdCBMRXhwciAqUkhTKSBjb25zdCB7CisgIHJldHVybiBsZXhwcjo6aW1wbGllcyh0aGlzLCBSSFMpOworfQorCit9Cit9Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9UaHJlYWRTYWZldHlPcHMuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvVGhyZWFkU2FmZXR5T3BzLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDI0NThiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvVGhyZWFkU2FmZXR5T3BzLmRlZgpAQCAtMCwwICsxLDU3IEBACisvLz09PS0gVGhyZWFkU2FmZXR5VElMLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0tKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBsaXN0IG9mIGNvcmUgb3Bjb2RlcyBmb3IgdGhlIFRocmVhZCBTYWZldHkKKy8vIFR5cGVkIEludGVybWVkaWF0ZSBsYW5ndWFnZS4gIFBsZWFzZSBzZWUgVGhyZWFkU2FmZXR5VElMLmggZm9yIG1vcmUKKy8vIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworVElMX09QQ09ERV9ERUYoRnV0dXJlKQorVElMX09QQ09ERV9ERUYoVW5kZWZpbmVkKQorVElMX09QQ09ERV9ERUYoV2lsZGNhcmQpCisKK1RJTF9PUENPREVfREVGKExpdGVyYWwpCitUSUxfT1BDT0RFX0RFRihMaXRlcmFsUHRyKQorVElMX09QQ09ERV9ERUYoVmFyaWFibGUpCitUSUxfT1BDT0RFX0RFRihGdW5jdGlvbikKK1RJTF9PUENPREVfREVGKFNGdW5jdGlvbikKK1RJTF9PUENPREVfREVGKENvZGUpCitUSUxfT1BDT0RFX0RFRihGaWVsZCkKKworVElMX09QQ09ERV9ERUYoQXBwbHkpCitUSUxfT1BDT0RFX0RFRihTQXBwbHkpCitUSUxfT1BDT0RFX0RFRihQcm9qZWN0KQorCitUSUxfT1BDT0RFX0RFRihDYWxsKQorVElMX09QQ09ERV9ERUYoQWxsb2MpCitUSUxfT1BDT0RFX0RFRihMb2FkKQorVElMX09QQ09ERV9ERUYoU3RvcmUpCitUSUxfT1BDT0RFX0RFRihBcnJheUluZGV4KQorVElMX09QQ09ERV9ERUYoQXJyYXlBZGQpCisKK1RJTF9PUENPREVfREVGKFVuYXJ5T3ApCitUSUxfT1BDT0RFX0RFRihCaW5hcnlPcCkKK1RJTF9PUENPREVfREVGKENhc3QpCisKK1RJTF9PUENPREVfREVGKFNDRkcpCitUSUxfT1BDT0RFX0RFRihCYXNpY0Jsb2NrKQorVElMX09QQ09ERV9ERUYoUGhpKQorCisvLyBUZXJtaW5hdG9yIGluc3RydWN0aW9ucworVElMX09QQ09ERV9ERUYoR290bykKK1RJTF9PUENPREVfREVGKEJyYW5jaCkKK1RJTF9PUENPREVfREVGKFJldHVybikKKworLy8gcHNldWRvLXRlcm1zCitUSUxfT1BDT0RFX0RFRihJZGVudGlmaWVyKQorVElMX09QQ09ERV9ERUYoSWZUaGVuRWxzZSkKK1RJTF9PUENPREVfREVGKExldCkKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvVGhyZWFkU2FmZXR5VElMLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9UaHJlYWRTYWZldHlUSUwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTBmMjA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvVGhyZWFkU2FmZXR5VElMLmgKQEAgLTAsMCArMSwxOTExIEBACisvLz09PS0gVGhyZWFkU2FmZXR5VElMLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBpbiB0aGUgbGx2bSByZXBvc2l0b3J5IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBzaW1wbGUgVHlwZWQgSW50ZXJtZWRpYXRlIExhbmd1YWdlLCBvciBUSUwsIHRoYXQgaXMgdXNlZAorLy8gYnkgdGhlIHRocmVhZCBzYWZldHkgYW5hbHlzaXMgKFNlZSBUaHJlYWRTYWZldHkuY3BwKS4gIFRoZSBUSUwgaXMgaW50ZW5kZWQKKy8vIHRvIGJlIGxhcmdlbHkgaW5kZXBlbmRlbnQgb2YgY2xhbmcsIGluIHRoZSBob3BlIHRoYXQgdGhlIGFuYWx5c2lzIGNhbiBiZQorLy8gcmV1c2VkIGZvciBvdGhlciBub24tQysrIGxhbmd1YWdlcy4gIEFsbCBkZXBlbmRlbmNpZXMgb24gY2xhbmcvbGx2bSBzaG91bGQKKy8vIGdvIGluIFRocmVhZFNhZmV0eVV0aWwuaC4KKy8vCisvLyBUaHJlYWQgc2FmZXR5IGFuYWx5c2lzIHdvcmtzIGJ5IGNvbXBhcmluZyBtdXRleCBleHByZXNzaW9ucywgZS5nLgorLy8KKy8vIGNsYXNzIEEgeyBNdXRleCBtdTsgaW50IGRhdCBHVUFSREVEX0JZKHRoaXMtPm11KTsgfQorLy8gY2xhc3MgQiB7IEEgYTsgfQorLy8KKy8vIHZvaWQgZm9vKEIqIGIpIHsKKy8vICAgKCpiKS5hLm11LmxvY2soKTsgICAgIC8vIGxvY2tzICgqYikuYS5tdQorLy8gICBiLT5hLmRhdCA9IDA7ICAgICAgICAgLy8gc3Vic3RpdHV0ZSAmYi0+YSBmb3IgJ3RoaXMnOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZXMgbG9jayBvbiAoJmItPmEpLT5tdQorLy8gICAoYi0+YS5tdSkudW5sb2NrKCk7ICAgLy8gdW5sb2NrcyAoYi0+YS5tdSkKKy8vIH0KKy8vCisvLyBBcyBpbGx1c3RyYXRlZCBieSB0aGUgYWJvdmUgZXhhbXBsZSwgY2xhbmcgRXhwcnMgYXJlIG5vdCB3ZWxsLXN1aXRlZCB0bworLy8gcmVwcmVzZW50IG11dGV4IGV4cHJlc3Npb25zIGRpcmVjdGx5LCBzaW5jZSB0aGVyZSBpcyBubyBlYXN5IHdheSB0byBjb21wYXJlCisvLyBFeHBycyBmb3IgZXF1aXZhbGVuY2UuICBUaGUgdGhyZWFkIHNhZmV0eSBhbmFseXNpcyB0aHVzIGxvd2VycyBjbGFuZyBFeHBycworLy8gaW50byBhIHNpbXBsZSBpbnRlcm1lZGlhdGUgbGFuZ3VhZ2UgKElMKS4gIFRoZSBJTCBzdXBwb3J0czoKKy8vCisvLyAoMSkgY29tcGFyaXNvbnMgZm9yIHNlbWFudGljIGVxdWFsaXR5IG9mIGV4cHJlc3Npb25zCisvLyAoMikgU1NBIHJlbmFtaW5nIG9mIHZhcmlhYmxlcworLy8gKDMpIHdpbGRjYXJkcyBhbmQgcGF0dGVybiBtYXRjaGluZyBvdmVyIGV4cHJlc3Npb25zCisvLyAoNCkgaGFzaC1iYXNlZCBleHByZXNzaW9uIGxvb2t1cAorLy8KKy8vIFRoZSBUSUwgaXMgY3VycmVudGx5IHZlcnkgZXhwZXJpbWVudGFsLCBpcyBpbnRlbmRlZCBvbmx5IGZvciB1c2Ugd2l0aGluCisvLyB0aGUgdGhyZWFkIHNhZmV0eSBhbmFseXNpcywgYW5kIGlzIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgorLy8gQWZ0ZXIgdGhlIEFQSSBzdGFiaWxpemVzIGFuZCBtYXR1cmVzLCBpdCBtYXkgYmUgYXBwcm9wcmlhdGUgdG8gbWFrZSB0aGlzCisvLyBtb3JlIGdlbmVyYWxseSBhdmFpbGFibGUgdG8gb3RoZXIgYW5hbHlzZXMuCisvLworLy8gVU5ERVIgQ09OU1RSVUNUSU9OLiAgVVNFIEFUIFlPVVIgT1dOIFJJU0suCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FOQUxZU0lTX0FOQUxZU0VTX1RIUkVBRFNBRkVUWVRJTF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQU5BTFlTSVNfQU5BTFlTRVNfVEhSRUFEU0FGRVRZVElMX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvVGhyZWFkU2FmZXR5VXRpbC5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBDYWxsRXhwcjsKK2NsYXNzIEV4cHI7CitjbGFzcyBTdG10OworCituYW1lc3BhY2UgdGhyZWFkU2FmZXR5IHsKK25hbWVzcGFjZSB0aWwgeworCitjbGFzcyBCYXNpY0Jsb2NrOworCisvLy8gRW51bSBmb3IgdGhlIGRpZmZlcmVudCBkaXN0aW5jdCBjbGFzc2VzIG9mIFNFeHByCitlbnVtIFRJTF9PcGNvZGUgeworI2RlZmluZSBUSUxfT1BDT0RFX0RFRihYKSBDT1BfIyNYLAorI2luY2x1ZGUgIlRocmVhZFNhZmV0eU9wcy5kZWYiCisjdW5kZWYgVElMX09QQ09ERV9ERUYKK307CisKKy8vLyBPcGNvZGUgZm9yIHVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucy4KK2VudW0gVElMX1VuYXJ5T3Bjb2RlIDogdW5zaWduZWQgY2hhciB7CisgIFVPUF9NaW51cywgICAgICAgIC8vICAtCisgIFVPUF9CaXROb3QsICAgICAgIC8vICB+CisgIFVPUF9Mb2dpY05vdCAgICAgIC8vICAhCit9OworCisvLy8gT3Bjb2RlIGZvciBiaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zLgorZW51bSBUSUxfQmluYXJ5T3Bjb2RlIDogdW5zaWduZWQgY2hhciB7CisgIEJPUF9BZGQsICAgICAgICAgIC8vICArCisgIEJPUF9TdWIsICAgICAgICAgIC8vICAtCisgIEJPUF9NdWwsICAgICAgICAgIC8vICAqCisgIEJPUF9EaXYsICAgICAgICAgIC8vICAvCisgIEJPUF9SZW0sICAgICAgICAgIC8vICAlCisgIEJPUF9TaGwsICAgICAgICAgIC8vICA8PAorICBCT1BfU2hyLCAgICAgICAgICAvLyAgPj4KKyAgQk9QX0JpdEFuZCwgICAgICAgLy8gICYKKyAgQk9QX0JpdFhvciwgICAgICAgLy8gIF4KKyAgQk9QX0JpdE9yLCAgICAgICAgLy8gIHwKKyAgQk9QX0VxLCAgICAgICAgICAgLy8gID09CisgIEJPUF9OZXEsICAgICAgICAgIC8vICAhPQorICBCT1BfTHQsICAgICAgICAgICAvLyAgPAorICBCT1BfTGVxLCAgICAgICAgICAvLyAgPD0KKyAgQk9QX0NtcCwgICAgICAgICAgLy8gIDw9PgorICBCT1BfTG9naWNBbmQsICAgICAvLyAgJiYgIChubyBzaG9ydC1jaXJjdWl0KQorICBCT1BfTG9naWNPciAgICAgICAvLyAgfHwgIChubyBzaG9ydC1jaXJjdWl0KQorfTsKKworLy8vIE9wY29kZSBmb3IgY2FzdCBvcGVyYXRpb25zLgorZW51bSBUSUxfQ2FzdE9wY29kZSA6IHVuc2lnbmVkIGNoYXIgeworICBDQVNUX25vbmUgPSAwLAorCisgIC8vIEV4dGVuZCBwcmVjaXNpb24gb2YgbnVtZXJpYyB0eXBlCisgIENBU1RfZXh0ZW5kTnVtLAorCisgIC8vIFRydW5jYXRlIHByZWNpc2lvbiBvZiBudW1lcmljIHR5cGUKKyAgQ0FTVF90cnVuY051bSwKKworICAvLyBDb252ZXJ0IHRvIGZsb2F0aW5nIHBvaW50IHR5cGUKKyAgQ0FTVF90b0Zsb2F0LAorCisgIC8vIENvbnZlcnQgdG8gaW50ZWdlciB0eXBlCisgIENBU1RfdG9JbnQsCisKKyAgLy8gQ29udmVydCBzbWFydCBwb2ludGVyIHRvIHBvaW50ZXIgKEMrKyBvbmx5KQorICBDQVNUX29ialRvUHRyCit9OworCitjb25zdCBUSUxfT3Bjb2RlICAgICAgIENPUF9NaW4gID0gQ09QX0Z1dHVyZTsKK2NvbnN0IFRJTF9PcGNvZGUgICAgICAgQ09QX01heCAgPSBDT1BfQnJhbmNoOworY29uc3QgVElMX1VuYXJ5T3Bjb2RlICBVT1BfTWluICA9IFVPUF9NaW51czsKK2NvbnN0IFRJTF9VbmFyeU9wY29kZSAgVU9QX01heCAgPSBVT1BfTG9naWNOb3Q7Citjb25zdCBUSUxfQmluYXJ5T3Bjb2RlIEJPUF9NaW4gID0gQk9QX0FkZDsKK2NvbnN0IFRJTF9CaW5hcnlPcGNvZGUgQk9QX01heCAgPSBCT1BfTG9naWNPcjsKK2NvbnN0IFRJTF9DYXN0T3Bjb2RlICAgQ0FTVF9NaW4gPSBDQVNUX25vbmU7Citjb25zdCBUSUxfQ2FzdE9wY29kZSAgIENBU1RfTWF4ID0gQ0FTVF90b0ludDsKKworLy8vIFJldHVybiB0aGUgbmFtZSBvZiBhIHVuYXJ5IG9wY29kZS4KK1N0cmluZ1JlZiBnZXRVbmFyeU9wY29kZVN0cmluZyhUSUxfVW5hcnlPcGNvZGUgT3ApOworCisvLy8gUmV0dXJuIHRoZSBuYW1lIG9mIGEgYmluYXJ5IG9wY29kZS4KK1N0cmluZ1JlZiBnZXRCaW5hcnlPcGNvZGVTdHJpbmcoVElMX0JpbmFyeU9wY29kZSBPcCk7CisKKy8vLyBWYWx1ZVR5cGVzIGFyZSBkYXRhIHR5cGVzIHRoYXQgY2FuIGFjdHVhbGx5IGJlIGhlbGQgaW4gcmVnaXN0ZXJzLgorLy8vIEFsbCB2YXJpYWJsZXMgYW5kIGV4cHJlc3Npb25zIG11c3QgaGF2ZSBhIHZhbHVlIHR5cGUuCisvLy8gUG9pbnRlciB0eXBlcyBhcmUgZnVydGhlciBzdWJkaXZpZGVkIGludG8gdGhlIHZhcmlvdXMgaGVhcC1hbGxvY2F0ZWQKKy8vLyB0eXBlcywgc3VjaCBhcyBmdW5jdGlvbnMsIHJlY29yZHMsIGV0Yy4KKy8vLyBTdHJ1Y3R1cmVkIHR5cGVzIHRoYXQgYXJlIHBhc3NlZCBieSB2YWx1ZSAoZS5nLiBjb21wbGV4IG51bWJlcnMpCisvLy8gcmVxdWlyZSBzcGVjaWFsIGhhbmRsaW5nOyB0aGV5IHVzZSBCVF9WYWx1ZVJlZiwgYW5kIHNpemUgU1RfMC4KK3N0cnVjdCBWYWx1ZVR5cGUgeworICBlbnVtIEJhc2VUeXBlIDogdW5zaWduZWQgY2hhciB7CisgICAgQlRfVm9pZCA9IDAsCisgICAgQlRfQm9vbCwKKyAgICBCVF9JbnQsCisgICAgQlRfRmxvYXQsCisgICAgQlRfU3RyaW5nLCAgICAvLyBTdHJpbmcgbGl0ZXJhbHMKKyAgICBCVF9Qb2ludGVyLAorICAgIEJUX1ZhbHVlUmVmCisgIH07CisKKyAgZW51bSBTaXplVHlwZSA6IHVuc2lnbmVkIGNoYXIgeworICAgIFNUXzAgPSAwLAorICAgIFNUXzEsCisgICAgU1RfOCwKKyAgICBTVF8xNiwKKyAgICBTVF8zMiwKKyAgICBTVF82NCwKKyAgICBTVF8xMjgKKyAgfTsKKworICBWYWx1ZVR5cGUoQmFzZVR5cGUgQiwgU2l6ZVR5cGUgU3osIGJvb2wgUywgdW5zaWduZWQgY2hhciBWUykKKyAgICAgIDogQmFzZShCKSwgU2l6ZShTeiksIFNpZ25lZChTKSwgVmVjdFNpemUoVlMpIHt9CisKKyAgaW5saW5lIHN0YXRpYyBTaXplVHlwZSBnZXRTaXplVHlwZSh1bnNpZ25lZCBuYnl0ZXMpOworCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICBpbmxpbmUgc3RhdGljIFZhbHVlVHlwZSBnZXRWYWx1ZVR5cGUoKTsKKworICBCYXNlVHlwZSBCYXNlOworICBTaXplVHlwZSBTaXplOworICBib29sIFNpZ25lZDsKKworICAvLyAwIGZvciBzY2FsYXIsIG90aGVyd2lzZSBudW0gZWxlbWVudHMgaW4gdmVjdG9yCisgIHVuc2lnbmVkIGNoYXIgVmVjdFNpemU7Cit9OworCitpbmxpbmUgVmFsdWVUeXBlOjpTaXplVHlwZSBWYWx1ZVR5cGU6OmdldFNpemVUeXBlKHVuc2lnbmVkIG5ieXRlcykgeworICBzd2l0Y2ggKG5ieXRlcykgeworICAgIGNhc2UgMTogcmV0dXJuIFNUXzg7CisgICAgY2FzZSAyOiByZXR1cm4gU1RfMTY7CisgICAgY2FzZSA0OiByZXR1cm4gU1RfMzI7CisgICAgY2FzZSA4OiByZXR1cm4gU1RfNjQ7CisgICAgY2FzZSAxNjogcmV0dXJuIFNUXzEyODsKKyAgICBkZWZhdWx0OiByZXR1cm4gU1RfMDsKKyAgfQorfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgVmFsdWVUeXBlIFZhbHVlVHlwZTo6Z2V0VmFsdWVUeXBlPHZvaWQ+KCkgeworICByZXR1cm4gVmFsdWVUeXBlKEJUX1ZvaWQsIFNUXzAsIGZhbHNlLCAwKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIFZhbHVlVHlwZSBWYWx1ZVR5cGU6OmdldFZhbHVlVHlwZTxib29sPigpIHsKKyAgcmV0dXJuIFZhbHVlVHlwZShCVF9Cb29sLCBTVF8xLCBmYWxzZSwgMCk7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBWYWx1ZVR5cGUgVmFsdWVUeXBlOjpnZXRWYWx1ZVR5cGU8aW50OF90PigpIHsKKyAgcmV0dXJuIFZhbHVlVHlwZShCVF9JbnQsIFNUXzgsIHRydWUsIDApOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgVmFsdWVUeXBlIFZhbHVlVHlwZTo6Z2V0VmFsdWVUeXBlPHVpbnQ4X3Q+KCkgeworICByZXR1cm4gVmFsdWVUeXBlKEJUX0ludCwgU1RfOCwgZmFsc2UsIDApOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgVmFsdWVUeXBlIFZhbHVlVHlwZTo6Z2V0VmFsdWVUeXBlPGludDE2X3Q+KCkgeworICByZXR1cm4gVmFsdWVUeXBlKEJUX0ludCwgU1RfMTYsIHRydWUsIDApOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgVmFsdWVUeXBlIFZhbHVlVHlwZTo6Z2V0VmFsdWVUeXBlPHVpbnQxNl90PigpIHsKKyAgcmV0dXJuIFZhbHVlVHlwZShCVF9JbnQsIFNUXzE2LCBmYWxzZSwgMCk7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBWYWx1ZVR5cGUgVmFsdWVUeXBlOjpnZXRWYWx1ZVR5cGU8aW50MzJfdD4oKSB7CisgIHJldHVybiBWYWx1ZVR5cGUoQlRfSW50LCBTVF8zMiwgdHJ1ZSwgMCk7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBWYWx1ZVR5cGUgVmFsdWVUeXBlOjpnZXRWYWx1ZVR5cGU8dWludDMyX3Q+KCkgeworICByZXR1cm4gVmFsdWVUeXBlKEJUX0ludCwgU1RfMzIsIGZhbHNlLCAwKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIFZhbHVlVHlwZSBWYWx1ZVR5cGU6OmdldFZhbHVlVHlwZTxpbnQ2NF90PigpIHsKKyAgcmV0dXJuIFZhbHVlVHlwZShCVF9JbnQsIFNUXzY0LCB0cnVlLCAwKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIFZhbHVlVHlwZSBWYWx1ZVR5cGU6OmdldFZhbHVlVHlwZTx1aW50NjRfdD4oKSB7CisgIHJldHVybiBWYWx1ZVR5cGUoQlRfSW50LCBTVF82NCwgZmFsc2UsIDApOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgVmFsdWVUeXBlIFZhbHVlVHlwZTo6Z2V0VmFsdWVUeXBlPGZsb2F0PigpIHsKKyAgcmV0dXJuIFZhbHVlVHlwZShCVF9GbG9hdCwgU1RfMzIsIHRydWUsIDApOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgVmFsdWVUeXBlIFZhbHVlVHlwZTo6Z2V0VmFsdWVUeXBlPGRvdWJsZT4oKSB7CisgIHJldHVybiBWYWx1ZVR5cGUoQlRfRmxvYXQsIFNUXzY0LCB0cnVlLCAwKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIFZhbHVlVHlwZSBWYWx1ZVR5cGU6OmdldFZhbHVlVHlwZTxsb25nIGRvdWJsZT4oKSB7CisgIHJldHVybiBWYWx1ZVR5cGUoQlRfRmxvYXQsIFNUXzEyOCwgdHJ1ZSwgMCk7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBWYWx1ZVR5cGUgVmFsdWVUeXBlOjpnZXRWYWx1ZVR5cGU8U3RyaW5nUmVmPigpIHsKKyAgcmV0dXJuIFZhbHVlVHlwZShCVF9TdHJpbmcsIGdldFNpemVUeXBlKHNpemVvZihTdHJpbmdSZWYpKSwgZmFsc2UsIDApOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgVmFsdWVUeXBlIFZhbHVlVHlwZTo6Z2V0VmFsdWVUeXBlPHZvaWQqPigpIHsKKyAgcmV0dXJuIFZhbHVlVHlwZShCVF9Qb2ludGVyLCBnZXRTaXplVHlwZShzaXplb2Yodm9pZCopKSwgZmFsc2UsIDApOworfQorCisvLy8gQmFzZSBjbGFzcyBmb3IgQVNUIG5vZGVzIGluIHRoZSB0eXBlZCBpbnRlcm1lZGlhdGUgbGFuZ3VhZ2UuCitjbGFzcyBTRXhwciB7CitwdWJsaWM6CisgIFNFeHByKCkgPSBkZWxldGU7CisKKyAgVElMX09wY29kZSBvcGNvZGUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxUSUxfT3Bjb2RlPihPcGNvZGUpOyB9CisKKyAgLy8gU3ViY2xhc3NlcyBvZiBTRXhwciBtdXN0IGRlZmluZSB0aGUgZm9sbG93aW5nOgorICAvLworICAvLyBUaGlzKGNvbnN0IFRoaXMmIEUsIC4uLikgeworICAvLyAgIGNvcHkgY29uc3RydWN0b3I6IGNvbnN0cnVjdCBjb3B5IG9mIEUsIHdpdGggc29tZSBhZGRpdGlvbmFsIGFyZ3VtZW50cy4KKyAgLy8gfQorICAvLworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVj4KKyAgLy8gdHlwZW5hbWUgVjo6Ul9TRXhwciB0cmF2ZXJzZShWICZWcywgdHlwZW5hbWUgVjo6Ul9DdHggQ3R4KSB7CisgIC8vICAgdHJhdmVyc2UgYWxsIHN1YmV4cHJlc3Npb25zLCBmb2xsb3dpbmcgdGhlIHRyYXZlcnNhbC9yZXdyaXRlciBpbnRlcmZhY2UuCisgIC8vIH0KKyAgLy8KKyAgLy8gdGVtcGxhdGUgPGNsYXNzIEM+IHR5cGVuYW1lIEM6OkNUeXBlIGNvbXBhcmUoQ1R5cGUqIEUsIEMmIENtcCkgeworICAvLyAgIGNvbXBhcmUgYWxsIHN1YmV4cHJlc3Npb25zLCBmb2xsb3dpbmcgdGhlIGNvbXBhcmF0b3IgaW50ZXJmYWNlCisgIC8vIH0KKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBTLCBNZW1SZWdpb25SZWYgJlIpIHsKKyAgICByZXR1cm4gOjpvcGVyYXRvciBuZXcoUywgUik7CisgIH0KKworICAvLy8gU0V4cHIgb2JqZWN0cyBtdXN0IGJlIGNyZWF0ZWQgaW4gYW4gYXJlbmEuCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QpID0gZGVsZXRlOworCisgIC8vLyBTRXhwciBvYmplY3RzIGNhbm5vdCBiZSBkZWxldGVkLgorICAvLyBUaGlzIGRlY2xhcmF0aW9uIGlzIHB1YmxpYyB0byB3b3JrYXJvdW5kIGEgZ2NjIGJ1ZyB0aGF0IGJyZWFrcyBidWlsZGluZworICAvLyB3aXRoIFJFUVVJUkVTX0VIPTEuCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgPSBkZWxldGU7CisKKyAgLy8vIFJldHVybnMgdGhlIGluc3RydWN0aW9uIElEIGZvciB0aGlzIGV4cHJlc3Npb24uCisgIC8vLyBBbGwgYmFzaWMgYmxvY2sgaW5zdHJ1Y3Rpb25zIGhhdmUgYSB1bmlxdWUgSUQgKGkuZS4gdmlydHVhbCByZWdpc3RlcikuCisgIHVuc2lnbmVkIGlkKCkgY29uc3QgeyByZXR1cm4gU0V4cHJJRDsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBibG9jaywgaWYgdGhpcyBpcyBhbiBpbnN0cnVjdGlvbiBpbiBhIGJhc2ljIGJsb2NrLAorICAvLy8gb3RoZXJ3aXNlIHJldHVybnMgbnVsbC4KKyAgQmFzaWNCbG9jayAqYmxvY2soKSBjb25zdCB7IHJldHVybiBCbG9jazsgfQorCisgIC8vLyBTZXQgdGhlIGJhc2ljIGJsb2NrIGFuZCBpbnN0cnVjdGlvbiBJRCBmb3IgdGhpcyBleHByZXNzaW9uLgorICB2b2lkIHNldElEKEJhc2ljQmxvY2sgKkIsIHVuc2lnbmVkIGlkKSB7IEJsb2NrID0gQjsgU0V4cHJJRCA9IGlkOyB9CisKK3Byb3RlY3RlZDoKKyAgU0V4cHIoVElMX09wY29kZSBPcCkgOiBPcGNvZGUoT3ApIHt9CisgIFNFeHByKGNvbnN0IFNFeHByICZFKSA6IE9wY29kZShFLk9wY29kZSksIEZsYWdzKEUuRmxhZ3MpIHt9CisKKyAgY29uc3QgdW5zaWduZWQgY2hhciBPcGNvZGU7CisgIHVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQgPSAwOworICB1bnNpZ25lZCBzaG9ydCBGbGFncyA9IDA7CisgIHVuc2lnbmVkIFNFeHBySUQgPSAwOworICBCYXNpY0Jsb2NrICpCbG9jayA9IG51bGxwdHI7Cit9OworCisvLyBDb250YWlucyB2YXJpb3VzIGhlbHBlciBmdW5jdGlvbnMgZm9yIFNFeHBycy4KK25hbWVzcGFjZSBUaHJlYWRTYWZldHlUSUwgeworCitpbmxpbmUgYm9vbCBpc1RyaXZpYWwoY29uc3QgU0V4cHIgKkUpIHsKKyAgdW5zaWduZWQgT3AgPSBFLT5vcGNvZGUoKTsKKyAgcmV0dXJuIE9wID09IENPUF9WYXJpYWJsZSB8fCBPcCA9PSBDT1BfTGl0ZXJhbCB8fCBPcCA9PSBDT1BfTGl0ZXJhbFB0cjsKK30KKworfSAvLyBuYW1lc3BhY2UgVGhyZWFkU2FmZXR5VElMCisKKy8vIE5vZGVzIHdoaWNoIGRlY2xhcmUgdmFyaWFibGVzCisKKy8vLyBBIG5hbWVkIHZhcmlhYmxlLCBlLmcuICJ4Ii4KKy8vLworLy8vIFRoZXJlIGFyZSB0d28gZGlzdGluY3QgcGxhY2VzIGluIHdoaWNoIGEgVmFyaWFibGUgY2FuIGFwcGVhciBpbiB0aGUgQVNULgorLy8vIEEgdmFyaWFibGUgZGVjbGFyYXRpb24gaW50cm9kdWNlcyBhIG5ldyB2YXJpYWJsZSwgYW5kIGNhbiBvY2N1ciBpbiAzIHBsYWNlczoKKy8vLyAgIExldC1leHByZXNzaW9uczogICAgICAgICAgIChMZXQgKHggPSB0KSB1KQorLy8vICAgRnVuY3Rpb25zOiAgICAgICAgICAgICAgICAgKEZ1bmN0aW9uICh4IDogdCkgdSkKKy8vLyAgIFNlbGYtYXBwbGljYWJsZSBmdW5jdGlvbnMgIChTRnVuY3Rpb24gKHgpIHQpCisvLy8KKy8vLyBJZiBhIHZhcmlhYmxlIG9jY3VycyBpbiBhbnkgb3RoZXIgbG9jYXRpb24sIGl0IGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nCisvLy8gdmFyaWFibGUgZGVjbGFyYXRpb24gLS0gZS5nLiAneCcgaW4gKHggKiB5ICsgeikuIFRvIHNhdmUgc3BhY2UsIHdlIGRvbid0CisvLy8gYWxsb2NhdGUgYSBzZXBhcmF0ZSBBU1Qgbm9kZSBmb3IgdmFyaWFibGUgcmVmZXJlbmNlczsgYSByZWZlcmVuY2UgaXMganVzdCBhCisvLy8gcG9pbnRlciB0byB0aGUgb3JpZ2luYWwgZGVjbGFyYXRpb24uCitjbGFzcyBWYXJpYWJsZSA6IHB1YmxpYyBTRXhwciB7CitwdWJsaWM6CisgIGVudW0gVmFyaWFibGVLaW5kIHsKKyAgICAvLy8gTGV0LXZhcmlhYmxlCisgICAgVktfTGV0LAorCisgICAgLy8vIEZ1bmN0aW9uIHBhcmFtZXRlcgorICAgIFZLX0Z1biwKKworICAgIC8vLyBTRnVuY3Rpb24gKHNlbGYpIHBhcmFtZXRlcgorICAgIFZLX1NGdW4KKyAgfTsKKworICBWYXJpYWJsZShTdHJpbmdSZWYgcywgU0V4cHIgKkQgPSBudWxscHRyKQorICAgICAgOiBTRXhwcihDT1BfVmFyaWFibGUpLCBOYW1lKHMpLCBEZWZpbml0aW9uKEQpIHsKKyAgICBGbGFncyA9IFZLX0xldDsKKyAgfQorCisgIFZhcmlhYmxlKFNFeHByICpELCBjb25zdCBWYWx1ZURlY2wgKkN2ZCA9IG51bGxwdHIpCisgICAgICA6IFNFeHByKENPUF9WYXJpYWJsZSksIE5hbWUoQ3ZkID8gQ3ZkLT5nZXROYW1lKCkgOiAiX3giKSwKKyAgICAgICAgRGVmaW5pdGlvbihEKSwgQ3ZkZWNsKEN2ZCkgeworICAgIEZsYWdzID0gVktfTGV0OworICB9CisKKyAgVmFyaWFibGUoY29uc3QgVmFyaWFibGUgJlZkLCBTRXhwciAqRCkgIC8vIHJld3JpdGUgY29uc3RydWN0b3IKKyAgICAgIDogU0V4cHIoVmQpLCBOYW1lKFZkLk5hbWUpLCBEZWZpbml0aW9uKEQpLCBDdmRlY2woVmQuQ3ZkZWNsKSB7CisgICAgRmxhZ3MgPSBWZC5raW5kKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNFeHByICpFKSB7IHJldHVybiBFLT5vcGNvZGUoKSA9PSBDT1BfVmFyaWFibGU7IH0KKworICAvLy8gUmV0dXJuIHRoZSBraW5kIG9mIHZhcmlhYmxlIChsZXQsIGZ1bmN0aW9uIHBhcmFtLCBvciBzZWxmKQorICBWYXJpYWJsZUtpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PFZhcmlhYmxlS2luZD4oRmxhZ3MpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUsIGlmIGFueS4KKyAgU3RyaW5nUmVmIG5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgLy8vIFJldHVybiB0aGUgY2xhbmcgZGVjbGFyYXRpb24gZm9yIHRoaXMgdmFyaWFibGUsIGlmIGFueS4KKyAgY29uc3QgVmFsdWVEZWNsICpjbGFuZ0RlY2woKSBjb25zdCB7IHJldHVybiBDdmRlY2w7IH0KKworICAvLy8gUmV0dXJuIHRoZSBkZWZpbml0aW9uIG9mIHRoZSB2YXJpYWJsZS4KKyAgLy8vIEZvciBsZXQtdmFycywgdGhpcyBpcyB0aGUgc2V0dGluZyBleHByZXNzaW9uLgorICAvLy8gRm9yIGZ1bmN0aW9uIGFuZCBzZWxmIHBhcmFtZXRlcnMsIGl0IGlzIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZS4KKyAgU0V4cHIgKmRlZmluaXRpb24oKSB7IHJldHVybiBEZWZpbml0aW9uOyB9CisgIGNvbnN0IFNFeHByICpkZWZpbml0aW9uKCkgY29uc3QgeyByZXR1cm4gRGVmaW5pdGlvbjsgfQorCisgIHZvaWQgc2V0TmFtZShTdHJpbmdSZWYgUykgICAgeyBOYW1lID0gUzsgIH0KKyAgdm9pZCBzZXRLaW5kKFZhcmlhYmxlS2luZCBLKSB7IEZsYWdzID0gSzsgfQorICB2b2lkIHNldERlZmluaXRpb24oU0V4cHIgKkUpIHsgRGVmaW5pdGlvbiA9IEU7IH0KKyAgdm9pZCBzZXRDbGFuZ0RlY2woY29uc3QgVmFsdWVEZWNsICpWRCkgeyBDdmRlY2wgPSBWRDsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBWPgorICB0eXBlbmFtZSBWOjpSX1NFeHByIHRyYXZlcnNlKFYgJlZzLCB0eXBlbmFtZSBWOjpSX0N0eCBDdHgpIHsKKyAgICAvLyBUaGlzIHJvdXRpbmUgaXMgb25seSBjYWxsZWQgZm9yIHZhcmlhYmxlIHJlZmVyZW5jZXMuCisgICAgcmV0dXJuIFZzLnJlZHVjZVZhcmlhYmxlUmVmKHRoaXMpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIEM+CisgIHR5cGVuYW1lIEM6OkNUeXBlIGNvbXBhcmUoY29uc3QgVmFyaWFibGUqIEUsIEMmIENtcCkgY29uc3QgeworICAgIHJldHVybiBDbXAuY29tcGFyZVZhcmlhYmxlUmVmcyh0aGlzLCBFKTsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQmFzaWNCbG9jazsKKyAgZnJpZW5kIGNsYXNzIEZ1bmN0aW9uOworICBmcmllbmQgY2xhc3MgTGV0OworICBmcmllbmQgY2xhc3MgU0Z1bmN0aW9uOworCisgIC8vIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4KKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgLy8gVGhlIFRJTCB0eXBlIG9yIGRlZmluaXRpb24uCisgIFNFeHByICpEZWZpbml0aW9uOworCisgIC8vIFRoZSBjbGFuZyBkZWNsYXJhdGlvbiBmb3IgdGhpcyB2YXJpYWJsZS4KKyAgY29uc3QgVmFsdWVEZWNsICpDdmRlY2wgPSBudWxscHRyOworfTsKKworLy8vIFBsYWNlaG9sZGVyIGZvciBhbiBleHByZXNzaW9uIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLgorLy8vIFVzZWQgdG8gaW1wbGVtZW50IGxhenkgY29weSBhbmQgcmV3cml0aW5nIHN0cmF0ZWdpZXMuCitjbGFzcyBGdXR1cmUgOiBwdWJsaWMgU0V4cHIgeworcHVibGljOgorICBlbnVtIEZ1dHVyZVN0YXR1cyB7CisgICAgRlNfcGVuZGluZywKKyAgICBGU19ldmFsdWF0aW5nLAorICAgIEZTX2RvbmUKKyAgfTsKKworICBGdXR1cmUoKSA6IFNFeHByKENPUF9GdXR1cmUpIHt9CisgIHZpcnR1YWwgfkZ1dHVyZSgpID0gZGVsZXRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0V4cHIgKkUpIHsgcmV0dXJuIEUtPm9wY29kZSgpID09IENPUF9GdXR1cmU7IH0KKworICAvLyBBIGxhenkgcmV3cml0aW5nIHN0cmF0ZWd5IHNob3VsZCBzdWJjbGFzcyBGdXR1cmUgYW5kIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorICB2aXJ0dWFsIFNFeHByICpjb21wdXRlKCkgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgIC8vIFJldHVybiB0aGUgcmVzdWx0IG9mIHRoaXMgZnV0dXJlIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIHJldHVybiBudWxsLgorICBTRXhwciAqbWF5YmVHZXRSZXN1bHQoKSBjb25zdCB7IHJldHVybiBSZXN1bHQ7IH0KKworICAvLyBSZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGlzIGZ1dHVyZTsgZm9yY2luZyBpdCBpZiBuZWNlc3NhcnkuCisgIFNFeHByICpyZXN1bHQoKSB7CisgICAgc3dpdGNoIChTdGF0dXMpIHsKKyAgICBjYXNlIEZTX3BlbmRpbmc6CisgICAgICByZXR1cm4gZm9yY2UoKTsKKyAgICBjYXNlIEZTX2V2YWx1YXRpbmc6CisgICAgICByZXR1cm4gbnVsbHB0cjsgLy8gaW5maW5pdGUgbG9vcDsgaWxsZWdhbCByZWN1cnNpb24uCisgICAgY2FzZSBGU19kb25lOgorICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVj4KKyAgdHlwZW5hbWUgVjo6Ul9TRXhwciB0cmF2ZXJzZShWICZWcywgdHlwZW5hbWUgVjo6Ul9DdHggQ3R4KSB7CisgICAgYXNzZXJ0KFJlc3VsdCAmJiAiQ2Fubm90IHRyYXZlcnNlIEZ1dHVyZSB0aGF0IGhhcyBub3QgYmVlbiBmb3JjZWQuIik7CisgICAgcmV0dXJuIFZzLnRyYXZlcnNlKFJlc3VsdCwgQ3R4KTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDPgorICB0eXBlbmFtZSBDOjpDVHlwZSBjb21wYXJlKGNvbnN0IEZ1dHVyZSogRSwgQyYgQ21wKSBjb25zdCB7CisgICAgaWYgKCFSZXN1bHQgfHwgIUUtPlJlc3VsdCkKKyAgICAgIHJldHVybiBDbXAuY29tcGFyZVBvaW50ZXJzKHRoaXMsIEUpOworICAgIHJldHVybiBDbXAuY29tcGFyZShSZXN1bHQsIEUtPlJlc3VsdCk7CisgIH0KKworcHJpdmF0ZToKKyAgU0V4cHIqIGZvcmNlKCk7CisKKyAgRnV0dXJlU3RhdHVzIFN0YXR1cyA9IEZTX3BlbmRpbmc7CisgIFNFeHByICpSZXN1bHQgPSBudWxscHRyOworfTsKKworLy8vIFBsYWNlaG9sZGVyIGZvciBleHByZXNzaW9ucyB0aGF0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiB0aGUgVElMLgorY2xhc3MgVW5kZWZpbmVkIDogcHVibGljIFNFeHByIHsKK3B1YmxpYzoKKyAgVW5kZWZpbmVkKGNvbnN0IFN0bXQgKlMgPSBudWxscHRyKSA6IFNFeHByKENPUF9VbmRlZmluZWQpLCBDc3RtdChTKSB7fQorICBVbmRlZmluZWQoY29uc3QgVW5kZWZpbmVkICZVKSA6IFNFeHByKFUpLCBDc3RtdChVLkNzdG10KSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0V4cHIgKkUpIHsgcmV0dXJuIEUtPm9wY29kZSgpID09IENPUF9VbmRlZmluZWQ7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVj4KKyAgdHlwZW5hbWUgVjo6Ul9TRXhwciB0cmF2ZXJzZShWICZWcywgdHlwZW5hbWUgVjo6Ul9DdHggQ3R4KSB7CisgICAgcmV0dXJuIFZzLnJlZHVjZVVuZGVmaW5lZCgqdGhpcyk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KKyAgdHlwZW5hbWUgQzo6Q1R5cGUgY29tcGFyZShjb25zdCBVbmRlZmluZWQqIEUsIEMmIENtcCkgY29uc3QgeworICAgIHJldHVybiBDbXAudHJ1ZVJlc3VsdCgpOworICB9CisKK3ByaXZhdGU6CisgIGNvbnN0IFN0bXQgKkNzdG10OworfTsKKworLy8vIFBsYWNlaG9sZGVyIGZvciBhIHdpbGRjYXJkIHRoYXQgbWF0Y2hlcyBhbnkgb3RoZXIgZXhwcmVzc2lvbi4KK2NsYXNzIFdpbGRjYXJkIDogcHVibGljIFNFeHByIHsKK3B1YmxpYzoKKyAgV2lsZGNhcmQoKSA6IFNFeHByKENPUF9XaWxkY2FyZCkge30KKyAgV2lsZGNhcmQoY29uc3QgV2lsZGNhcmQgJikgPSBkZWZhdWx0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0V4cHIgKkUpIHsgcmV0dXJuIEUtPm9wY29kZSgpID09IENPUF9XaWxkY2FyZDsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBWPiB0eXBlbmFtZSBWOjpSX1NFeHByIHRyYXZlcnNlKFYgJlZzLCB0eXBlbmFtZSBWOjpSX0N0eCBDdHgpIHsKKyAgICByZXR1cm4gVnMucmVkdWNlV2lsZGNhcmQoKnRoaXMpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIEM+CisgIHR5cGVuYW1lIEM6OkNUeXBlIGNvbXBhcmUoY29uc3QgV2lsZGNhcmQqIEUsIEMmIENtcCkgY29uc3QgeworICAgIHJldHVybiBDbXAudHJ1ZVJlc3VsdCgpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgTGl0ZXJhbFQ7CisKKy8vIEJhc2UgY2xhc3MgZm9yIGxpdGVyYWwgdmFsdWVzLgorY2xhc3MgTGl0ZXJhbCA6IHB1YmxpYyBTRXhwciB7CitwdWJsaWM6CisgIExpdGVyYWwoY29uc3QgRXhwciAqQykKKyAgICAgOiBTRXhwcihDT1BfTGl0ZXJhbCksIFZhbFR5cGUoVmFsdWVUeXBlOjpnZXRWYWx1ZVR5cGU8dm9pZD4oKSksIENleHByKEMpIHt9CisgIExpdGVyYWwoVmFsdWVUeXBlIFZUKSA6IFNFeHByKENPUF9MaXRlcmFsKSwgVmFsVHlwZShWVCkge30KKyAgTGl0ZXJhbChjb25zdCBMaXRlcmFsICYpID0gZGVmYXVsdDsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNFeHByICpFKSB7IHJldHVybiBFLT5vcGNvZGUoKSA9PSBDT1BfTGl0ZXJhbDsgfQorCisgIC8vIFRoZSBjbGFuZyBleHByZXNzaW9uIGZvciB0aGlzIGxpdGVyYWwuCisgIGNvbnN0IEV4cHIgKmNsYW5nRXhwcigpIGNvbnN0IHsgcmV0dXJuIENleHByOyB9CisKKyAgVmFsdWVUeXBlIHZhbHVlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFZhbFR5cGU7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBUPiBjb25zdCBMaXRlcmFsVDxUPiYgYXMoKSBjb25zdCB7CisgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBMaXRlcmFsVDxUPio+KHRoaXMpOworICB9CisgIHRlbXBsYXRlPGNsYXNzIFQ+IExpdGVyYWxUPFQ+JiBhcygpIHsKKyAgICByZXR1cm4gKnN0YXRpY19jYXN0PExpdGVyYWxUPFQ+Kj4odGhpcyk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVj4gdHlwZW5hbWUgVjo6Ul9TRXhwciB0cmF2ZXJzZShWICZWcywgdHlwZW5hbWUgVjo6Ul9DdHggQ3R4KTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KKyAgdHlwZW5hbWUgQzo6Q1R5cGUgY29tcGFyZShjb25zdCBMaXRlcmFsKiBFLCBDJiBDbXApIGNvbnN0IHsKKyAgICAvLyBUT0RPOiBkZWZlciBhY3R1YWwgY29tcGFyaXNvbiB0byBMaXRlcmFsVAorICAgIHJldHVybiBDbXAudHJ1ZVJlc3VsdCgpOworICB9CisKK3ByaXZhdGU6CisgIGNvbnN0IFZhbHVlVHlwZSBWYWxUeXBlOworICBjb25zdCBFeHByICpDZXhwciA9IG51bGxwdHI7Cit9OworCisvLyBEZXJpdmVkIGNsYXNzIGZvciBsaXRlcmFsIHZhbHVlcywgd2hpY2ggc3RvcmVzIHRoZSBhY3R1YWwgdmFsdWUuCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2xhc3MgTGl0ZXJhbFQgOiBwdWJsaWMgTGl0ZXJhbCB7CitwdWJsaWM6CisgIExpdGVyYWxUKFQgRGF0KSA6IExpdGVyYWwoVmFsdWVUeXBlOjpnZXRWYWx1ZVR5cGU8VD4oKSksIFZhbChEYXQpIHt9CisgIExpdGVyYWxUKGNvbnN0IExpdGVyYWxUPFQ+ICZMKSA6IExpdGVyYWwoTCksIFZhbChMLlZhbCkge30KKworICBUIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsO30KKyAgVCYgdmFsdWUoKSB7IHJldHVybiBWYWw7IH0KKworcHJpdmF0ZToKKyAgVCBWYWw7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVj4KK3R5cGVuYW1lIFY6OlJfU0V4cHIgTGl0ZXJhbDo6dHJhdmVyc2UoViAmVnMsIHR5cGVuYW1lIFY6OlJfQ3R4IEN0eCkgeworICBpZiAoQ2V4cHIpCisgICAgcmV0dXJuIFZzLnJlZHVjZUxpdGVyYWwoKnRoaXMpOworCisgIHN3aXRjaCAoVmFsVHlwZS5CYXNlKSB7CisgIGNhc2UgVmFsdWVUeXBlOjpCVF9Wb2lkOgorICAgIGJyZWFrOworICBjYXNlIFZhbHVlVHlwZTo6QlRfQm9vbDoKKyAgICByZXR1cm4gVnMucmVkdWNlTGl0ZXJhbFQoYXM8Ym9vbD4oKSk7CisgIGNhc2UgVmFsdWVUeXBlOjpCVF9JbnQ6IHsKKyAgICBzd2l0Y2ggKFZhbFR5cGUuU2l6ZSkgeworICAgIGNhc2UgVmFsdWVUeXBlOjpTVF84OgorICAgICAgaWYgKFZhbFR5cGUuU2lnbmVkKQorICAgICAgICByZXR1cm4gVnMucmVkdWNlTGl0ZXJhbFQoYXM8aW50OF90PigpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFZzLnJlZHVjZUxpdGVyYWxUKGFzPHVpbnQ4X3Q+KCkpOworICAgIGNhc2UgVmFsdWVUeXBlOjpTVF8xNjoKKyAgICAgIGlmIChWYWxUeXBlLlNpZ25lZCkKKyAgICAgICAgcmV0dXJuIFZzLnJlZHVjZUxpdGVyYWxUKGFzPGludDE2X3Q+KCkpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gVnMucmVkdWNlTGl0ZXJhbFQoYXM8dWludDE2X3Q+KCkpOworICAgIGNhc2UgVmFsdWVUeXBlOjpTVF8zMjoKKyAgICAgIGlmIChWYWxUeXBlLlNpZ25lZCkKKyAgICAgICAgcmV0dXJuIFZzLnJlZHVjZUxpdGVyYWxUKGFzPGludDMyX3Q+KCkpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gVnMucmVkdWNlTGl0ZXJhbFQoYXM8dWludDMyX3Q+KCkpOworICAgIGNhc2UgVmFsdWVUeXBlOjpTVF82NDoKKyAgICAgIGlmIChWYWxUeXBlLlNpZ25lZCkKKyAgICAgICAgcmV0dXJuIFZzLnJlZHVjZUxpdGVyYWxUKGFzPGludDY0X3Q+KCkpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gVnMucmVkdWNlTGl0ZXJhbFQoYXM8dWludDY0X3Q+KCkpOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgY2FzZSBWYWx1ZVR5cGU6OkJUX0Zsb2F0OiB7CisgICAgc3dpdGNoIChWYWxUeXBlLlNpemUpIHsKKyAgICBjYXNlIFZhbHVlVHlwZTo6U1RfMzI6CisgICAgICByZXR1cm4gVnMucmVkdWNlTGl0ZXJhbFQoYXM8ZmxvYXQ+KCkpOworICAgIGNhc2UgVmFsdWVUeXBlOjpTVF82NDoKKyAgICAgIHJldHVybiBWcy5yZWR1Y2VMaXRlcmFsVChhczxkb3VibGU+KCkpOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgY2FzZSBWYWx1ZVR5cGU6OkJUX1N0cmluZzoKKyAgICByZXR1cm4gVnMucmVkdWNlTGl0ZXJhbFQoYXM8U3RyaW5nUmVmPigpKTsKKyAgY2FzZSBWYWx1ZVR5cGU6OkJUX1BvaW50ZXI6CisgICAgcmV0dXJuIFZzLnJlZHVjZUxpdGVyYWxUKGFzPHZvaWQqPigpKTsKKyAgY2FzZSBWYWx1ZVR5cGU6OkJUX1ZhbHVlUmVmOgorICAgIGJyZWFrOworICB9CisgIHJldHVybiBWcy5yZWR1Y2VMaXRlcmFsKCp0aGlzKTsKK30KKworLy8vIEEgTGl0ZXJhbCBwb2ludGVyIHRvIGFuIG9iamVjdCBhbGxvY2F0ZWQgaW4gbWVtb3J5LgorLy8vIEF0IGNvbXBpbGUgdGltZSwgcG9pbnRlciBsaXRlcmFscyBhcmUgcmVwcmVzZW50ZWQgYnkgc3ltYm9saWMgbmFtZXMuCitjbGFzcyBMaXRlcmFsUHRyIDogcHVibGljIFNFeHByIHsKK3B1YmxpYzoKKyAgTGl0ZXJhbFB0cihjb25zdCBWYWx1ZURlY2wgKkQpIDogU0V4cHIoQ09QX0xpdGVyYWxQdHIpLCBDdmRlY2woRCkge30KKyAgTGl0ZXJhbFB0cihjb25zdCBMaXRlcmFsUHRyICYpID0gZGVmYXVsdDsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNFeHByICpFKSB7IHJldHVybiBFLT5vcGNvZGUoKSA9PSBDT1BfTGl0ZXJhbFB0cjsgfQorCisgIC8vIFRoZSBjbGFuZyBkZWNsYXJhdGlvbiBmb3IgdGhlIHZhbHVlIHRoYXQgdGhpcyBwb2ludGVyIHBvaW50cyB0by4KKyAgY29uc3QgVmFsdWVEZWNsICpjbGFuZ0RlY2woKSBjb25zdCB7IHJldHVybiBDdmRlY2w7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVj4KKyAgdHlwZW5hbWUgVjo6Ul9TRXhwciB0cmF2ZXJzZShWICZWcywgdHlwZW5hbWUgVjo6Ul9DdHggQ3R4KSB7CisgICAgcmV0dXJuIFZzLnJlZHVjZUxpdGVyYWxQdHIoKnRoaXMpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIEM+CisgIHR5cGVuYW1lIEM6OkNUeXBlIGNvbXBhcmUoY29uc3QgTGl0ZXJhbFB0ciogRSwgQyYgQ21wKSBjb25zdCB7CisgICAgcmV0dXJuIENtcC5jb21wYXJlUG9pbnRlcnMoQ3ZkZWNsLCBFLT5DdmRlY2wpOworICB9CisKK3ByaXZhdGU6CisgIGNvbnN0IFZhbHVlRGVjbCAqQ3ZkZWNsOworfTsKKworLy8vIEEgZnVuY3Rpb24gLS0gYS5rLmEuIGxhbWJkYSBhYnN0cmFjdGlvbi4KKy8vLyBGdW5jdGlvbnMgd2l0aCBtdWx0aXBsZSBhcmd1bWVudHMgYXJlIGNyZWF0ZWQgYnkgY3VycnlpbmcsCisvLy8gZS5nLiAoRnVuY3Rpb24gKHg6IEludCkgKEZ1bmN0aW9uICh5OiBJbnQpIChDb2RlIHsgcmV0dXJuIHggKyB5IH0pKSkKK2NsYXNzIEZ1bmN0aW9uIDogcHVibGljIFNFeHByIHsKK3B1YmxpYzoKKyAgRnVuY3Rpb24oVmFyaWFibGUgKlZkLCBTRXhwciAqQmQpCisgICAgICA6IFNFeHByKENPUF9GdW5jdGlvbiksIFZhckRlY2woVmQpLCBCb2R5KEJkKSB7CisgICAgVmQtPnNldEtpbmQoVmFyaWFibGU6OlZLX0Z1bik7CisgIH0KKworICBGdW5jdGlvbihjb25zdCBGdW5jdGlvbiAmRiwgVmFyaWFibGUgKlZkLCBTRXhwciAqQmQpIC8vIHJld3JpdGUgY29uc3RydWN0b3IKKyAgICAgIDogU0V4cHIoRiksIFZhckRlY2woVmQpLCBCb2R5KEJkKSB7CisgICAgVmQtPnNldEtpbmQoVmFyaWFibGU6OlZLX0Z1bik7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNFeHByICpFKSB7IHJldHVybiBFLT5vcGNvZGUoKSA9PSBDT1BfRnVuY3Rpb247IH0KKworICBWYXJpYWJsZSAqdmFyaWFibGVEZWNsKCkgIHsgcmV0dXJuIFZhckRlY2w7IH0KKyAgY29uc3QgVmFyaWFibGUgKnZhcmlhYmxlRGVjbCgpIGNvbnN0IHsgcmV0dXJuIFZhckRlY2w7IH0KKworICBTRXhwciAqYm9keSgpIHsgcmV0dXJuIEJvZHk7IH0KKyAgY29uc3QgU0V4cHIgKmJvZHkoKSBjb25zdCB7IHJldHVybiBCb2R5OyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFY+CisgIHR5cGVuYW1lIFY6OlJfU0V4cHIgdHJhdmVyc2UoViAmVnMsIHR5cGVuYW1lIFY6OlJfQ3R4IEN0eCkgeworICAgIC8vIFRoaXMgaXMgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiwgc28gdHJhdmVyc2UgdGhlIGRlZmluaXRpb24uCisgICAgYXV0byBFMCA9IFZzLnRyYXZlcnNlKFZhckRlY2wtPkRlZmluaXRpb24sIFZzLnR5cGVDdHgoQ3R4KSk7CisgICAgLy8gVGVsbCB0aGUgcmV3cml0ZXIgdG8gZW50ZXIgdGhlIHNjb3BlIG9mIHRoZSBmdW5jdGlvbi4KKyAgICBWYXJpYWJsZSAqTnZkID0gVnMuZW50ZXJTY29wZSgqVmFyRGVjbCwgRTApOworICAgIGF1dG8gRTEgPSBWcy50cmF2ZXJzZShCb2R5LCBWcy5kZWNsQ3R4KEN0eCkpOworICAgIFZzLmV4aXRTY29wZSgqVmFyRGVjbCk7CisgICAgcmV0dXJuIFZzLnJlZHVjZUZ1bmN0aW9uKCp0aGlzLCBOdmQsIEUxKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDPgorICB0eXBlbmFtZSBDOjpDVHlwZSBjb21wYXJlKGNvbnN0IEZ1bmN0aW9uKiBFLCBDJiBDbXApIGNvbnN0IHsKKyAgICB0eXBlbmFtZSBDOjpDVHlwZSBDdCA9CisgICAgICBDbXAuY29tcGFyZShWYXJEZWNsLT5kZWZpbml0aW9uKCksIEUtPlZhckRlY2wtPmRlZmluaXRpb24oKSk7CisgICAgaWYgKENtcC5ub3RUcnVlKEN0KSkKKyAgICAgIHJldHVybiBDdDsKKyAgICBDbXAuZW50ZXJTY29wZSh2YXJpYWJsZURlY2woKSwgRS0+dmFyaWFibGVEZWNsKCkpOworICAgIEN0ID0gQ21wLmNvbXBhcmUoYm9keSgpLCBFLT5ib2R5KCkpOworICAgIENtcC5sZWF2ZVNjb3BlKCk7CisgICAgcmV0dXJuIEN0OworICB9CisKK3ByaXZhdGU6CisgIFZhcmlhYmxlICpWYXJEZWNsOworICBTRXhwciogQm9keTsKK307CisKKy8vLyBBIHNlbGYtYXBwbGljYWJsZSBmdW5jdGlvbi4KKy8vLyBBIHNlbGYtYXBwbGljYWJsZSBmdW5jdGlvbiBjYW4gYmUgYXBwbGllZCB0byBpdHNlbGYuICBJdCdzIHVzZWZ1bCBmb3IKKy8vLyBpbXBsZW1lbnRpbmcgb2JqZWN0cyBhbmQgbGF0ZSBiaW5kaW5nLgorY2xhc3MgU0Z1bmN0aW9uIDogcHVibGljIFNFeHByIHsKK3B1YmxpYzoKKyAgU0Z1bmN0aW9uKFZhcmlhYmxlICpWZCwgU0V4cHIgKkIpCisgICAgICA6IFNFeHByKENPUF9TRnVuY3Rpb24pLCBWYXJEZWNsKFZkKSwgQm9keShCKSB7CisgICAgYXNzZXJ0KFZkLT5EZWZpbml0aW9uID09IG51bGxwdHIpOworICAgIFZkLT5zZXRLaW5kKFZhcmlhYmxlOjpWS19TRnVuKTsKKyAgICBWZC0+RGVmaW5pdGlvbiA9IHRoaXM7CisgIH0KKworICBTRnVuY3Rpb24oY29uc3QgU0Z1bmN0aW9uICZGLCBWYXJpYWJsZSAqVmQsIFNFeHByICpCKSAvLyByZXdyaXRlIGNvbnN0cnVjdG9yCisgICAgICA6IFNFeHByKEYpLCBWYXJEZWNsKFZkKSwgQm9keShCKSB7CisgICAgYXNzZXJ0KFZkLT5EZWZpbml0aW9uID09IG51bGxwdHIpOworICAgIFZkLT5zZXRLaW5kKFZhcmlhYmxlOjpWS19TRnVuKTsKKyAgICBWZC0+RGVmaW5pdGlvbiA9IHRoaXM7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNFeHByICpFKSB7IHJldHVybiBFLT5vcGNvZGUoKSA9PSBDT1BfU0Z1bmN0aW9uOyB9CisKKyAgVmFyaWFibGUgKnZhcmlhYmxlRGVjbCgpIHsgcmV0dXJuIFZhckRlY2w7IH0KKyAgY29uc3QgVmFyaWFibGUgKnZhcmlhYmxlRGVjbCgpIGNvbnN0IHsgcmV0dXJuIFZhckRlY2w7IH0KKworICBTRXhwciAqYm9keSgpIHsgcmV0dXJuIEJvZHk7IH0KKyAgY29uc3QgU0V4cHIgKmJvZHkoKSBjb25zdCB7IHJldHVybiBCb2R5OyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFY+CisgIHR5cGVuYW1lIFY6OlJfU0V4cHIgdHJhdmVyc2UoViAmVnMsIHR5cGVuYW1lIFY6OlJfQ3R4IEN0eCkgeworICAgIC8vIEEgc2VsZi12YXJpYWJsZSBwb2ludHMgdG8gdGhlIFNGdW5jdGlvbiBpdHNlbGYuCisgICAgLy8gQSByZXdyaXRlIG11c3QgaW50cm9kdWNlIHRoZSB2YXJpYWJsZSB3aXRoIGEgbnVsbCBkZWZpbml0aW9uLCBhbmQgdXBkYXRlCisgICAgLy8gaXQgYWZ0ZXIgJ3RoaXMnIGhhcyBiZWVuIHJld3JpdHRlbi4KKyAgICBWYXJpYWJsZSAqTnZkID0gVnMuZW50ZXJTY29wZSgqVmFyRGVjbCwgbnVsbHB0cik7CisgICAgYXV0byBFMSA9IFZzLnRyYXZlcnNlKEJvZHksIFZzLmRlY2xDdHgoQ3R4KSk7CisgICAgVnMuZXhpdFNjb3BlKCpWYXJEZWNsKTsKKyAgICAvLyBBIHJld3JpdGUgb3BlcmF0aW9uIHdpbGwgY2FsbCBTRnVuIGNvbnN0cnVjdG9yIHRvIHNldCBWdmQtPkRlZmluaXRpb24uCisgICAgcmV0dXJuIFZzLnJlZHVjZVNGdW5jdGlvbigqdGhpcywgTnZkLCBFMSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KKyAgdHlwZW5hbWUgQzo6Q1R5cGUgY29tcGFyZShjb25zdCBTRnVuY3Rpb24qIEUsIEMmIENtcCkgY29uc3QgeworICAgIENtcC5lbnRlclNjb3BlKHZhcmlhYmxlRGVjbCgpLCBFLT52YXJpYWJsZURlY2woKSk7CisgICAgdHlwZW5hbWUgQzo6Q1R5cGUgQ3QgPSBDbXAuY29tcGFyZShib2R5KCksIEUtPmJvZHkoKSk7CisgICAgQ21wLmxlYXZlU2NvcGUoKTsKKyAgICByZXR1cm4gQ3Q7CisgIH0KKworcHJpdmF0ZToKKyAgVmFyaWFibGUgKlZhckRlY2w7CisgIFNFeHByKiBCb2R5OworfTsKKworLy8vIEEgYmxvY2sgb2YgY29kZSAtLSBlLmcuIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uCitjbGFzcyBDb2RlIDogcHVibGljIFNFeHByIHsKK3B1YmxpYzoKKyAgQ29kZShTRXhwciAqVCwgU0V4cHIgKkIpIDogU0V4cHIoQ09QX0NvZGUpLCBSZXR1cm5UeXBlKFQpLCBCb2R5KEIpIHt9CisgIENvZGUoY29uc3QgQ29kZSAmQywgU0V4cHIgKlQsIFNFeHByICpCKSAvLyByZXdyaXRlIGNvbnN0cnVjdG9yCisgICAgICA6IFNFeHByKEMpLCBSZXR1cm5UeXBlKFQpLCBCb2R5KEIpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRXhwciAqRSkgeyByZXR1cm4gRS0+b3Bjb2RlKCkgPT0gQ09QX0NvZGU7IH0KKworICBTRXhwciAqcmV0dXJuVHlwZSgpIHsgcmV0dXJuIFJldHVyblR5cGU7IH0KKyAgY29uc3QgU0V4cHIgKnJldHVyblR5cGUoKSBjb25zdCB7IHJldHVybiBSZXR1cm5UeXBlOyB9CisKKyAgU0V4cHIgKmJvZHkoKSB7IHJldHVybiBCb2R5OyB9CisgIGNvbnN0IFNFeHByICpib2R5KCkgY29uc3QgeyByZXR1cm4gQm9keTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBWPgorICB0eXBlbmFtZSBWOjpSX1NFeHByIHRyYXZlcnNlKFYgJlZzLCB0eXBlbmFtZSBWOjpSX0N0eCBDdHgpIHsKKyAgICBhdXRvIE50ID0gVnMudHJhdmVyc2UoUmV0dXJuVHlwZSwgVnMudHlwZUN0eChDdHgpKTsKKyAgICBhdXRvIE5iID0gVnMudHJhdmVyc2UoQm9keSwgICAgICAgVnMubGF6eUN0eChDdHgpKTsKKyAgICByZXR1cm4gVnMucmVkdWNlQ29kZSgqdGhpcywgTnQsIE5iKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDPgorICB0eXBlbmFtZSBDOjpDVHlwZSBjb21wYXJlKGNvbnN0IENvZGUqIEUsIEMmIENtcCkgY29uc3QgeworICAgIHR5cGVuYW1lIEM6OkNUeXBlIEN0ID0gQ21wLmNvbXBhcmUocmV0dXJuVHlwZSgpLCBFLT5yZXR1cm5UeXBlKCkpOworICAgIGlmIChDbXAubm90VHJ1ZShDdCkpCisgICAgICByZXR1cm4gQ3Q7CisgICAgcmV0dXJuIENtcC5jb21wYXJlKGJvZHkoKSwgRS0+Ym9keSgpKTsKKyAgfQorCitwcml2YXRlOgorICBTRXhwciogUmV0dXJuVHlwZTsKKyAgU0V4cHIqIEJvZHk7Cit9OworCisvLy8gQSB0eXBlZCwgd3JpdGFibGUgbG9jYXRpb24gaW4gbWVtb3J5CitjbGFzcyBGaWVsZCA6IHB1YmxpYyBTRXhwciB7CitwdWJsaWM6CisgIEZpZWxkKFNFeHByICpSLCBTRXhwciAqQikgOiBTRXhwcihDT1BfRmllbGQpLCBSYW5nZShSKSwgQm9keShCKSB7fQorICBGaWVsZChjb25zdCBGaWVsZCAmQywgU0V4cHIgKlIsIFNFeHByICpCKSAvLyByZXdyaXRlIGNvbnN0cnVjdG9yCisgICAgICA6IFNFeHByKEMpLCBSYW5nZShSKSwgQm9keShCKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0V4cHIgKkUpIHsgcmV0dXJuIEUtPm9wY29kZSgpID09IENPUF9GaWVsZDsgfQorCisgIFNFeHByICpyYW5nZSgpIHsgcmV0dXJuIFJhbmdlOyB9CisgIGNvbnN0IFNFeHByICpyYW5nZSgpIGNvbnN0IHsgcmV0dXJuIFJhbmdlOyB9CisKKyAgU0V4cHIgKmJvZHkoKSB7IHJldHVybiBCb2R5OyB9CisgIGNvbnN0IFNFeHByICpib2R5KCkgY29uc3QgeyByZXR1cm4gQm9keTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBWPgorICB0eXBlbmFtZSBWOjpSX1NFeHByIHRyYXZlcnNlKFYgJlZzLCB0eXBlbmFtZSBWOjpSX0N0eCBDdHgpIHsKKyAgICBhdXRvIE5yID0gVnMudHJhdmVyc2UoUmFuZ2UsIFZzLnR5cGVDdHgoQ3R4KSk7CisgICAgYXV0byBOYiA9IFZzLnRyYXZlcnNlKEJvZHksICBWcy5sYXp5Q3R4KEN0eCkpOworICAgIHJldHVybiBWcy5yZWR1Y2VGaWVsZCgqdGhpcywgTnIsIE5iKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDPgorICB0eXBlbmFtZSBDOjpDVHlwZSBjb21wYXJlKGNvbnN0IEZpZWxkKiBFLCBDJiBDbXApIGNvbnN0IHsKKyAgICB0eXBlbmFtZSBDOjpDVHlwZSBDdCA9IENtcC5jb21wYXJlKHJhbmdlKCksIEUtPnJhbmdlKCkpOworICAgIGlmIChDbXAubm90VHJ1ZShDdCkpCisgICAgICByZXR1cm4gQ3Q7CisgICAgcmV0dXJuIENtcC5jb21wYXJlKGJvZHkoKSwgRS0+Ym9keSgpKTsKKyAgfQorCitwcml2YXRlOgorICBTRXhwciogUmFuZ2U7CisgIFNFeHByKiBCb2R5OworfTsKKworLy8vIEFwcGx5IGFuIGFyZ3VtZW50IHRvIGEgZnVuY3Rpb24uCisvLy8gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYWN0dWFsbHkgY2FsbCB0aGUgZnVuY3Rpb24uICBGdW5jdGlvbnMgYXJlIGN1cnJpZWQsCisvLy8gc28gdGhpcyByZXR1cm5zIGEgY2xvc3VyZSBpbiB3aGljaCB0aGUgZmlyc3QgcGFyYW1ldGVyIGhhcyBiZWVuIGFwcGxpZWQuCisvLy8gT25jZSBhbGwgcGFyYW1ldGVycyBoYXZlIGJlZW4gYXBwbGllZCwgQ2FsbCBjYW4gYmUgdXNlZCB0byBpbnZva2UgdGhlCisvLy8gZnVuY3Rpb24uCitjbGFzcyBBcHBseSA6IHB1YmxpYyBTRXhwciB7CitwdWJsaWM6CisgIEFwcGx5KFNFeHByICpGLCBTRXhwciAqQSkgOiBTRXhwcihDT1BfQXBwbHkpLCBGdW4oRiksIEFyZyhBKSB7fQorICBBcHBseShjb25zdCBBcHBseSAmQSwgU0V4cHIgKkYsIFNFeHByICpBcikgIC8vIHJld3JpdGUgY29uc3RydWN0b3IKKyAgICAgIDogU0V4cHIoQSksIEZ1bihGKSwgQXJnKEFyKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0V4cHIgKkUpIHsgcmV0dXJuIEUtPm9wY29kZSgpID09IENPUF9BcHBseTsgfQorCisgIFNFeHByICpmdW4oKSB7IHJldHVybiBGdW47IH0KKyAgY29uc3QgU0V4cHIgKmZ1bigpIGNvbnN0IHsgcmV0dXJuIEZ1bjsgfQorCisgIFNFeHByICphcmcoKSB7IHJldHVybiBBcmc7IH0KKyAgY29uc3QgU0V4cHIgKmFyZygpIGNvbnN0IHsgcmV0dXJuIEFyZzsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBWPgorICB0eXBlbmFtZSBWOjpSX1NFeHByIHRyYXZlcnNlKFYgJlZzLCB0eXBlbmFtZSBWOjpSX0N0eCBDdHgpIHsKKyAgICBhdXRvIE5mID0gVnMudHJhdmVyc2UoRnVuLCBWcy5zdWJFeHByQ3R4KEN0eCkpOworICAgIGF1dG8gTmEgPSBWcy50cmF2ZXJzZShBcmcsIFZzLnN1YkV4cHJDdHgoQ3R4KSk7CisgICAgcmV0dXJuIFZzLnJlZHVjZUFwcGx5KCp0aGlzLCBOZiwgTmEpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIEM+CisgIHR5cGVuYW1lIEM6OkNUeXBlIGNvbXBhcmUoY29uc3QgQXBwbHkqIEUsIEMmIENtcCkgY29uc3QgeworICAgIHR5cGVuYW1lIEM6OkNUeXBlIEN0ID0gQ21wLmNvbXBhcmUoZnVuKCksIEUtPmZ1bigpKTsKKyAgICBpZiAoQ21wLm5vdFRydWUoQ3QpKQorICAgICAgcmV0dXJuIEN0OworICAgIHJldHVybiBDbXAuY29tcGFyZShhcmcoKSwgRS0+YXJnKCkpOworICB9CisKK3ByaXZhdGU6CisgIFNFeHByKiBGdW47CisgIFNFeHByKiBBcmc7Cit9OworCisvLy8gQXBwbHkgYSBzZWxmLWFyZ3VtZW50IHRvIGEgc2VsZi1hcHBsaWNhYmxlIGZ1bmN0aW9uLgorY2xhc3MgU0FwcGx5IDogcHVibGljIFNFeHByIHsKK3B1YmxpYzoKKyAgU0FwcGx5KFNFeHByICpTZiwgU0V4cHIgKkEgPSBudWxscHRyKSA6IFNFeHByKENPUF9TQXBwbHkpLCBTZnVuKFNmKSwgQXJnKEEpIHt9CisgIFNBcHBseShTQXBwbHkgJkEsIFNFeHByICpTZiwgU0V4cHIgKkFyID0gbnVsbHB0cikgLy8gcmV3cml0ZSBjb25zdHJ1Y3RvcgorICAgICAgOiBTRXhwcihBKSwgU2Z1bihTZiksIEFyZyhBcikge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNFeHByICpFKSB7IHJldHVybiBFLT5vcGNvZGUoKSA9PSBDT1BfU0FwcGx5OyB9CisKKyAgU0V4cHIgKnNmdW4oKSB7IHJldHVybiBTZnVuOyB9CisgIGNvbnN0IFNFeHByICpzZnVuKCkgY29uc3QgeyByZXR1cm4gU2Z1bjsgfQorCisgIFNFeHByICphcmcoKSB7IHJldHVybiBBcmcgPyBBcmcgOiBTZnVuOyB9CisgIGNvbnN0IFNFeHByICphcmcoKSBjb25zdCB7IHJldHVybiBBcmcgPyBBcmcgOiBTZnVuOyB9CisKKyAgYm9vbCBpc0RlbGVnYXRpb24oKSBjb25zdCB7IHJldHVybiBBcmcgIT0gbnVsbHB0cjsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBWPgorICB0eXBlbmFtZSBWOjpSX1NFeHByIHRyYXZlcnNlKFYgJlZzLCB0eXBlbmFtZSBWOjpSX0N0eCBDdHgpIHsKKyAgICBhdXRvIE5mID0gVnMudHJhdmVyc2UoU2Z1biwgVnMuc3ViRXhwckN0eChDdHgpKTsKKyAgICB0eXBlbmFtZSBWOjpSX1NFeHByIE5hID0gQXJnID8gVnMudHJhdmVyc2UoQXJnLCBWcy5zdWJFeHByQ3R4KEN0eCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgICAgcmV0dXJuIFZzLnJlZHVjZVNBcHBseSgqdGhpcywgTmYsIE5hKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDPgorICB0eXBlbmFtZSBDOjpDVHlwZSBjb21wYXJlKGNvbnN0IFNBcHBseSogRSwgQyYgQ21wKSBjb25zdCB7CisgICAgdHlwZW5hbWUgQzo6Q1R5cGUgQ3QgPSBDbXAuY29tcGFyZShzZnVuKCksIEUtPnNmdW4oKSk7CisgICAgaWYgKENtcC5ub3RUcnVlKEN0KSB8fCAoIWFyZygpICYmICFFLT5hcmcoKSkpCisgICAgICByZXR1cm4gQ3Q7CisgICAgcmV0dXJuIENtcC5jb21wYXJlKGFyZygpLCBFLT5hcmcoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgU0V4cHIqIFNmdW47CisgIFNFeHByKiBBcmc7Cit9OworCisvLy8gUHJvamVjdCBhIG5hbWVkIHNsb3QgZnJvbSBhIEMrKyBzdHJ1Y3Qgb3IgY2xhc3MuCitjbGFzcyBQcm9qZWN0IDogcHVibGljIFNFeHByIHsKK3B1YmxpYzoKKyAgUHJvamVjdChTRXhwciAqUiwgY29uc3QgVmFsdWVEZWNsICpDdmQpCisgICAgICA6IFNFeHByKENPUF9Qcm9qZWN0KSwgUmVjKFIpLCBDdmRlY2woQ3ZkKSB7CisgICAgYXNzZXJ0KEN2ZCAmJiAiVmFsdWVEZWNsIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0V4cHIgKkUpIHsgcmV0dXJuIEUtPm9wY29kZSgpID09IENPUF9Qcm9qZWN0OyB9CisKKyAgU0V4cHIgKnJlY29yZCgpIHsgcmV0dXJuIFJlYzsgfQorICBjb25zdCBTRXhwciAqcmVjb3JkKCkgY29uc3QgeyByZXR1cm4gUmVjOyB9CisKKyAgY29uc3QgVmFsdWVEZWNsICpjbGFuZ0RlY2woKSBjb25zdCB7IHJldHVybiBDdmRlY2w7IH0KKworICBib29sIGlzQXJyb3coKSBjb25zdCB7IHJldHVybiAoRmxhZ3MgJiAweDAxKSAhPSAwOyB9CisKKyAgdm9pZCBzZXRBcnJvdyhib29sIGIpIHsKKyAgICBpZiAoYikgRmxhZ3MgfD0gMHgwMTsKKyAgICBlbHNlIEZsYWdzICY9IDB4RkZGRTsKKyAgfQorCisgIFN0cmluZ1JlZiBzbG90TmFtZSgpIGNvbnN0IHsKKyAgICBpZiAoQ3ZkZWNsLT5nZXREZWNsTmFtZSgpLmlzSWRlbnRpZmllcigpKQorICAgICAgcmV0dXJuIEN2ZGVjbC0+Z2V0TmFtZSgpOworICAgIGlmICghU2xvdE5hbWUpIHsKKyAgICAgIFNsb3ROYW1lID0gIiI7CisgICAgICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gT1MoKlNsb3ROYW1lKTsKKyAgICAgIEN2ZGVjbC0+cHJpbnROYW1lKE9TKTsKKyAgICB9CisgICAgcmV0dXJuICpTbG90TmFtZTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBWPgorICB0eXBlbmFtZSBWOjpSX1NFeHByIHRyYXZlcnNlKFYgJlZzLCB0eXBlbmFtZSBWOjpSX0N0eCBDdHgpIHsKKyAgICBhdXRvIE5yID0gVnMudHJhdmVyc2UoUmVjLCBWcy5zdWJFeHByQ3R4KEN0eCkpOworICAgIHJldHVybiBWcy5yZWR1Y2VQcm9qZWN0KCp0aGlzLCBOcik7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KKyAgdHlwZW5hbWUgQzo6Q1R5cGUgY29tcGFyZShjb25zdCBQcm9qZWN0KiBFLCBDJiBDbXApIGNvbnN0IHsKKyAgICB0eXBlbmFtZSBDOjpDVHlwZSBDdCA9IENtcC5jb21wYXJlKHJlY29yZCgpLCBFLT5yZWNvcmQoKSk7CisgICAgaWYgKENtcC5ub3RUcnVlKEN0KSkKKyAgICAgIHJldHVybiBDdDsKKyAgICByZXR1cm4gQ21wLmNvbXBhcmVQb2ludGVycyhDdmRlY2wsIEUtPkN2ZGVjbCk7CisgIH0KKworcHJpdmF0ZToKKyAgU0V4cHIqIFJlYzsKKyAgbXV0YWJsZSBsbHZtOjpPcHRpb25hbDxzdGQ6OnN0cmluZz4gU2xvdE5hbWU7CisgIGNvbnN0IFZhbHVlRGVjbCAqQ3ZkZWNsOworfTsKKworLy8vIENhbGwgYSBmdW5jdGlvbiAoYWZ0ZXIgYWxsIGFyZ3VtZW50cyBoYXZlIGJlZW4gYXBwbGllZCkuCitjbGFzcyBDYWxsIDogcHVibGljIFNFeHByIHsKK3B1YmxpYzoKKyAgQ2FsbChTRXhwciAqVCwgY29uc3QgQ2FsbEV4cHIgKkNlID0gbnVsbHB0cikKKyAgICAgIDogU0V4cHIoQ09QX0NhbGwpLCBUYXJnZXQoVCksIENleHByKENlKSB7fQorICBDYWxsKGNvbnN0IENhbGwgJkMsIFNFeHByICpUKSA6IFNFeHByKEMpLCBUYXJnZXQoVCksIENleHByKEMuQ2V4cHIpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRXhwciAqRSkgeyByZXR1cm4gRS0+b3Bjb2RlKCkgPT0gQ09QX0NhbGw7IH0KKworICBTRXhwciAqdGFyZ2V0KCkgeyByZXR1cm4gVGFyZ2V0OyB9CisgIGNvbnN0IFNFeHByICp0YXJnZXQoKSBjb25zdCB7IHJldHVybiBUYXJnZXQ7IH0KKworICBjb25zdCBDYWxsRXhwciAqY2xhbmdDYWxsRXhwcigpIGNvbnN0IHsgcmV0dXJuIENleHByOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFY+CisgIHR5cGVuYW1lIFY6OlJfU0V4cHIgdHJhdmVyc2UoViAmVnMsIHR5cGVuYW1lIFY6OlJfQ3R4IEN0eCkgeworICAgIGF1dG8gTnQgPSBWcy50cmF2ZXJzZShUYXJnZXQsIFZzLnN1YkV4cHJDdHgoQ3R4KSk7CisgICAgcmV0dXJuIFZzLnJlZHVjZUNhbGwoKnRoaXMsIE50KTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDPgorICB0eXBlbmFtZSBDOjpDVHlwZSBjb21wYXJlKGNvbnN0IENhbGwqIEUsIEMmIENtcCkgY29uc3QgeworICAgIHJldHVybiBDbXAuY29tcGFyZSh0YXJnZXQoKSwgRS0+dGFyZ2V0KCkpOworICB9CisKK3ByaXZhdGU6CisgIFNFeHByKiBUYXJnZXQ7CisgIGNvbnN0IENhbGxFeHByICpDZXhwcjsKK307CisKKy8vLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgbmV3IHZhbHVlIG9uIHRoZSBoZWFwIG9yIHN0YWNrLgorY2xhc3MgQWxsb2MgOiBwdWJsaWMgU0V4cHIgeworcHVibGljOgorICBlbnVtIEFsbG9jS2luZCB7CisgICAgQUtfU3RhY2ssCisgICAgQUtfSGVhcAorICB9OworCisgIEFsbG9jKFNFeHByICpELCBBbGxvY0tpbmQgSykgOiBTRXhwcihDT1BfQWxsb2MpLCBEdHlwZShEKSB7IEZsYWdzID0gSzsgfQorICBBbGxvYyhjb25zdCBBbGxvYyAmQSwgU0V4cHIgKkR0KSA6IFNFeHByKEEpLCBEdHlwZShEdCkgeyBGbGFncyA9IEEua2luZCgpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRXhwciAqRSkgeyByZXR1cm4gRS0+b3Bjb2RlKCkgPT0gQ09QX0NhbGw7IH0KKworICBBbGxvY0tpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PEFsbG9jS2luZD4oRmxhZ3MpOyB9CisKKyAgU0V4cHIgKmRhdGFUeXBlKCkgeyByZXR1cm4gRHR5cGU7IH0KKyAgY29uc3QgU0V4cHIgKmRhdGFUeXBlKCkgY29uc3QgeyByZXR1cm4gRHR5cGU7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVj4KKyAgdHlwZW5hbWUgVjo6Ul9TRXhwciB0cmF2ZXJzZShWICZWcywgdHlwZW5hbWUgVjo6Ul9DdHggQ3R4KSB7CisgICAgYXV0byBOZCA9IFZzLnRyYXZlcnNlKER0eXBlLCBWcy5kZWNsQ3R4KEN0eCkpOworICAgIHJldHVybiBWcy5yZWR1Y2VBbGxvYygqdGhpcywgTmQpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIEM+CisgIHR5cGVuYW1lIEM6OkNUeXBlIGNvbXBhcmUoY29uc3QgQWxsb2MqIEUsIEMmIENtcCkgY29uc3QgeworICAgIHR5cGVuYW1lIEM6OkNUeXBlIEN0ID0gQ21wLmNvbXBhcmVJbnRlZ2VycyhraW5kKCksIEUtPmtpbmQoKSk7CisgICAgaWYgKENtcC5ub3RUcnVlKEN0KSkKKyAgICAgIHJldHVybiBDdDsKKyAgICByZXR1cm4gQ21wLmNvbXBhcmUoZGF0YVR5cGUoKSwgRS0+ZGF0YVR5cGUoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgU0V4cHIqIER0eXBlOworfTsKKworLy8vIExvYWQgYSB2YWx1ZSBmcm9tIG1lbW9yeS4KK2NsYXNzIExvYWQgOiBwdWJsaWMgU0V4cHIgeworcHVibGljOgorICBMb2FkKFNFeHByICpQKSA6IFNFeHByKENPUF9Mb2FkKSwgUHRyKFApIHt9CisgIExvYWQoY29uc3QgTG9hZCAmTCwgU0V4cHIgKlApIDogU0V4cHIoTCksIFB0cihQKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0V4cHIgKkUpIHsgcmV0dXJuIEUtPm9wY29kZSgpID09IENPUF9Mb2FkOyB9CisKKyAgU0V4cHIgKnBvaW50ZXIoKSB7IHJldHVybiBQdHI7IH0KKyAgY29uc3QgU0V4cHIgKnBvaW50ZXIoKSBjb25zdCB7IHJldHVybiBQdHI7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVj4KKyAgdHlwZW5hbWUgVjo6Ul9TRXhwciB0cmF2ZXJzZShWICZWcywgdHlwZW5hbWUgVjo6Ul9DdHggQ3R4KSB7CisgICAgYXV0byBOcCA9IFZzLnRyYXZlcnNlKFB0ciwgVnMuc3ViRXhwckN0eChDdHgpKTsKKyAgICByZXR1cm4gVnMucmVkdWNlTG9hZCgqdGhpcywgTnApOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIEM+CisgIHR5cGVuYW1lIEM6OkNUeXBlIGNvbXBhcmUoY29uc3QgTG9hZCogRSwgQyYgQ21wKSBjb25zdCB7CisgICAgcmV0dXJuIENtcC5jb21wYXJlKHBvaW50ZXIoKSwgRS0+cG9pbnRlcigpKTsKKyAgfQorCitwcml2YXRlOgorICBTRXhwciogUHRyOworfTsKKworLy8vIFN0b3JlIGEgdmFsdWUgdG8gbWVtb3J5LgorLy8vIFRoZSBkZXN0aW5hdGlvbiBpcyBhIHBvaW50ZXIgdG8gYSBmaWVsZCwgdGhlIHNvdXJjZSBpcyB0aGUgdmFsdWUgdG8gc3RvcmUuCitjbGFzcyBTdG9yZSA6IHB1YmxpYyBTRXhwciB7CitwdWJsaWM6CisgIFN0b3JlKFNFeHByICpQLCBTRXhwciAqVikgOiBTRXhwcihDT1BfU3RvcmUpLCBEZXN0KFApLCBTb3VyY2UoVikge30KKyAgU3RvcmUoY29uc3QgU3RvcmUgJlMsIFNFeHByICpQLCBTRXhwciAqVikgOiBTRXhwcihTKSwgRGVzdChQKSwgU291cmNlKFYpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRXhwciAqRSkgeyByZXR1cm4gRS0+b3Bjb2RlKCkgPT0gQ09QX1N0b3JlOyB9CisKKyAgU0V4cHIgKmRlc3RpbmF0aW9uKCkgeyByZXR1cm4gRGVzdDsgfSAgLy8gQWRkcmVzcyB0byBzdG9yZSB0bworICBjb25zdCBTRXhwciAqZGVzdGluYXRpb24oKSBjb25zdCB7IHJldHVybiBEZXN0OyB9CisKKyAgU0V4cHIgKnNvdXJjZSgpIHsgcmV0dXJuIFNvdXJjZTsgfSAgICAgLy8gVmFsdWUgdG8gc3RvcmUKKyAgY29uc3QgU0V4cHIgKnNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBWPgorICB0eXBlbmFtZSBWOjpSX1NFeHByIHRyYXZlcnNlKFYgJlZzLCB0eXBlbmFtZSBWOjpSX0N0eCBDdHgpIHsKKyAgICBhdXRvIE5wID0gVnMudHJhdmVyc2UoRGVzdCwgICBWcy5zdWJFeHByQ3R4KEN0eCkpOworICAgIGF1dG8gTnYgPSBWcy50cmF2ZXJzZShTb3VyY2UsIFZzLnN1YkV4cHJDdHgoQ3R4KSk7CisgICAgcmV0dXJuIFZzLnJlZHVjZVN0b3JlKCp0aGlzLCBOcCwgTnYpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIEM+CisgIHR5cGVuYW1lIEM6OkNUeXBlIGNvbXBhcmUoY29uc3QgU3RvcmUqIEUsIEMmIENtcCkgY29uc3QgeworICAgIHR5cGVuYW1lIEM6OkNUeXBlIEN0ID0gQ21wLmNvbXBhcmUoZGVzdGluYXRpb24oKSwgRS0+ZGVzdGluYXRpb24oKSk7CisgICAgaWYgKENtcC5ub3RUcnVlKEN0KSkKKyAgICAgIHJldHVybiBDdDsKKyAgICByZXR1cm4gQ21wLmNvbXBhcmUoc291cmNlKCksIEUtPnNvdXJjZSgpKTsKKyAgfQorCitwcml2YXRlOgorICBTRXhwciogRGVzdDsKKyAgU0V4cHIqIFNvdXJjZTsKK307CisKKy8vLyBJZiBwIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGFycmF5LCB0aGVuIHBbaV0gaXMgYSByZWZlcmVuY2UgdG8gdGhlIGkndGgKKy8vLyBlbGVtZW50IG9mIHRoZSBhcnJheS4KK2NsYXNzIEFycmF5SW5kZXggOiBwdWJsaWMgU0V4cHIgeworcHVibGljOgorICBBcnJheUluZGV4KFNFeHByICpBLCBTRXhwciAqTikgOiBTRXhwcihDT1BfQXJyYXlJbmRleCksIEFycmF5KEEpLCBJbmRleChOKSB7fQorICBBcnJheUluZGV4KGNvbnN0IEFycmF5SW5kZXggJkUsIFNFeHByICpBLCBTRXhwciAqTikKKyAgICAgIDogU0V4cHIoRSksIEFycmF5KEEpLCBJbmRleChOKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0V4cHIgKkUpIHsgcmV0dXJuIEUtPm9wY29kZSgpID09IENPUF9BcnJheUluZGV4OyB9CisKKyAgU0V4cHIgKmFycmF5KCkgeyByZXR1cm4gQXJyYXk7IH0KKyAgY29uc3QgU0V4cHIgKmFycmF5KCkgY29uc3QgeyByZXR1cm4gQXJyYXk7IH0KKworICBTRXhwciAqaW5kZXgoKSB7IHJldHVybiBJbmRleDsgfQorICBjb25zdCBTRXhwciAqaW5kZXgoKSBjb25zdCB7IHJldHVybiBJbmRleDsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBWPgorICB0eXBlbmFtZSBWOjpSX1NFeHByIHRyYXZlcnNlKFYgJlZzLCB0eXBlbmFtZSBWOjpSX0N0eCBDdHgpIHsKKyAgICBhdXRvIE5hID0gVnMudHJhdmVyc2UoQXJyYXksIFZzLnN1YkV4cHJDdHgoQ3R4KSk7CisgICAgYXV0byBOaSA9IFZzLnRyYXZlcnNlKEluZGV4LCBWcy5zdWJFeHByQ3R4KEN0eCkpOworICAgIHJldHVybiBWcy5yZWR1Y2VBcnJheUluZGV4KCp0aGlzLCBOYSwgTmkpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIEM+CisgIHR5cGVuYW1lIEM6OkNUeXBlIGNvbXBhcmUoY29uc3QgQXJyYXlJbmRleCogRSwgQyYgQ21wKSBjb25zdCB7CisgICAgdHlwZW5hbWUgQzo6Q1R5cGUgQ3QgPSBDbXAuY29tcGFyZShhcnJheSgpLCBFLT5hcnJheSgpKTsKKyAgICBpZiAoQ21wLm5vdFRydWUoQ3QpKQorICAgICAgcmV0dXJuIEN0OworICAgIHJldHVybiBDbXAuY29tcGFyZShpbmRleCgpLCBFLT5pbmRleCgpKTsKKyAgfQorCitwcml2YXRlOgorICBTRXhwciogQXJyYXk7CisgIFNFeHByKiBJbmRleDsKK307CisKKy8vLyBQb2ludGVyIGFyaXRobWV0aWMsIHJlc3RyaWN0ZWQgdG8gYXJyYXlzIG9ubHkuCisvLy8gSWYgcCBpcyBhIHJlZmVyZW5jZSB0byBhbiBhcnJheSwgdGhlbiBwICsgbiwgd2hlcmUgbiBpcyBhbiBpbnRlZ2VyLCBpcworLy8vIGEgcmVmZXJlbmNlIHRvIGEgc3ViYXJyYXkuCitjbGFzcyBBcnJheUFkZCA6IHB1YmxpYyBTRXhwciB7CitwdWJsaWM6CisgIEFycmF5QWRkKFNFeHByICpBLCBTRXhwciAqTikgOiBTRXhwcihDT1BfQXJyYXlBZGQpLCBBcnJheShBKSwgSW5kZXgoTikge30KKyAgQXJyYXlBZGQoY29uc3QgQXJyYXlBZGQgJkUsIFNFeHByICpBLCBTRXhwciAqTikKKyAgICAgIDogU0V4cHIoRSksIEFycmF5KEEpLCBJbmRleChOKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0V4cHIgKkUpIHsgcmV0dXJuIEUtPm9wY29kZSgpID09IENPUF9BcnJheUFkZDsgfQorCisgIFNFeHByICphcnJheSgpIHsgcmV0dXJuIEFycmF5OyB9CisgIGNvbnN0IFNFeHByICphcnJheSgpIGNvbnN0IHsgcmV0dXJuIEFycmF5OyB9CisKKyAgU0V4cHIgKmluZGV4KCkgeyByZXR1cm4gSW5kZXg7IH0KKyAgY29uc3QgU0V4cHIgKmluZGV4KCkgY29uc3QgeyByZXR1cm4gSW5kZXg7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVj4KKyAgdHlwZW5hbWUgVjo6Ul9TRXhwciB0cmF2ZXJzZShWICZWcywgdHlwZW5hbWUgVjo6Ul9DdHggQ3R4KSB7CisgICAgYXV0byBOYSA9IFZzLnRyYXZlcnNlKEFycmF5LCBWcy5zdWJFeHByQ3R4KEN0eCkpOworICAgIGF1dG8gTmkgPSBWcy50cmF2ZXJzZShJbmRleCwgVnMuc3ViRXhwckN0eChDdHgpKTsKKyAgICByZXR1cm4gVnMucmVkdWNlQXJyYXlBZGQoKnRoaXMsIE5hLCBOaSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KKyAgdHlwZW5hbWUgQzo6Q1R5cGUgY29tcGFyZShjb25zdCBBcnJheUFkZCogRSwgQyYgQ21wKSBjb25zdCB7CisgICAgdHlwZW5hbWUgQzo6Q1R5cGUgQ3QgPSBDbXAuY29tcGFyZShhcnJheSgpLCBFLT5hcnJheSgpKTsKKyAgICBpZiAoQ21wLm5vdFRydWUoQ3QpKQorICAgICAgcmV0dXJuIEN0OworICAgIHJldHVybiBDbXAuY29tcGFyZShpbmRleCgpLCBFLT5pbmRleCgpKTsKKyAgfQorCitwcml2YXRlOgorICBTRXhwciogQXJyYXk7CisgIFNFeHByKiBJbmRleDsKK307CisKKy8vLyBTaW1wbGUgYXJpdGhtZXRpYyB1bmFyeSBvcGVyYXRpb25zLCBlLmcuIG5lZ2F0ZSBhbmQgbm90LgorLy8vIFRoZXNlIG9wZXJhdGlvbnMgaGF2ZSBubyBzaWRlLWVmZmVjdHMuCitjbGFzcyBVbmFyeU9wIDogcHVibGljIFNFeHByIHsKK3B1YmxpYzoKKyAgVW5hcnlPcChUSUxfVW5hcnlPcGNvZGUgT3AsIFNFeHByICpFKSA6IFNFeHByKENPUF9VbmFyeU9wKSwgRXhwcjAoRSkgeworICAgIEZsYWdzID0gT3A7CisgIH0KKworICBVbmFyeU9wKGNvbnN0IFVuYXJ5T3AgJlUsIFNFeHByICpFKSA6IFNFeHByKFUpLCBFeHByMChFKSB7IEZsYWdzID0gVS5GbGFnczsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0V4cHIgKkUpIHsgcmV0dXJuIEUtPm9wY29kZSgpID09IENPUF9VbmFyeU9wOyB9CisKKyAgVElMX1VuYXJ5T3Bjb2RlIHVuYXJ5T3Bjb2RlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUSUxfVW5hcnlPcGNvZGU+KEZsYWdzKTsKKyAgfQorCisgIFNFeHByICpleHByKCkgeyByZXR1cm4gRXhwcjA7IH0KKyAgY29uc3QgU0V4cHIgKmV4cHIoKSBjb25zdCB7IHJldHVybiBFeHByMDsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBWPgorICB0eXBlbmFtZSBWOjpSX1NFeHByIHRyYXZlcnNlKFYgJlZzLCB0eXBlbmFtZSBWOjpSX0N0eCBDdHgpIHsKKyAgICBhdXRvIE5lID0gVnMudHJhdmVyc2UoRXhwcjAsIFZzLnN1YkV4cHJDdHgoQ3R4KSk7CisgICAgcmV0dXJuIFZzLnJlZHVjZVVuYXJ5T3AoKnRoaXMsIE5lKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDPgorICB0eXBlbmFtZSBDOjpDVHlwZSBjb21wYXJlKGNvbnN0IFVuYXJ5T3AqIEUsIEMmIENtcCkgY29uc3QgeworICAgIHR5cGVuYW1lIEM6OkNUeXBlIEN0ID0KKyAgICAgIENtcC5jb21wYXJlSW50ZWdlcnModW5hcnlPcGNvZGUoKSwgRS0+dW5hcnlPcGNvZGUoKSk7CisgICAgaWYgKENtcC5ub3RUcnVlKEN0KSkKKyAgICAgIHJldHVybiBDdDsKKyAgICByZXR1cm4gQ21wLmNvbXBhcmUoZXhwcigpLCBFLT5leHByKCkpOworICB9CisKK3ByaXZhdGU6CisgIFNFeHByKiBFeHByMDsKK307CisKKy8vLyBTaW1wbGUgYXJpdGhtZXRpYyBiaW5hcnkgb3BlcmF0aW9ucywgZS5nLiArLCAtLCBldGMuCisvLy8gVGhlc2Ugb3BlcmF0aW9ucyBoYXZlIG5vIHNpZGUgZWZmZWN0cy4KK2NsYXNzIEJpbmFyeU9wIDogcHVibGljIFNFeHByIHsKK3B1YmxpYzoKKyAgQmluYXJ5T3AoVElMX0JpbmFyeU9wY29kZSBPcCwgU0V4cHIgKkUwLCBTRXhwciAqRTEpCisgICAgICA6IFNFeHByKENPUF9CaW5hcnlPcCksIEV4cHIwKEUwKSwgRXhwcjEoRTEpIHsKKyAgICBGbGFncyA9IE9wOworICB9CisKKyAgQmluYXJ5T3AoY29uc3QgQmluYXJ5T3AgJkIsIFNFeHByICpFMCwgU0V4cHIgKkUxKQorICAgICAgOiBTRXhwcihCKSwgRXhwcjAoRTApLCBFeHByMShFMSkgeworICAgIEZsYWdzID0gQi5GbGFnczsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0V4cHIgKkUpIHsgcmV0dXJuIEUtPm9wY29kZSgpID09IENPUF9CaW5hcnlPcDsgfQorCisgIFRJTF9CaW5hcnlPcGNvZGUgYmluYXJ5T3Bjb2RlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUSUxfQmluYXJ5T3Bjb2RlPihGbGFncyk7CisgIH0KKworICBTRXhwciAqZXhwcjAoKSB7IHJldHVybiBFeHByMDsgfQorICBjb25zdCBTRXhwciAqZXhwcjAoKSBjb25zdCB7IHJldHVybiBFeHByMDsgfQorCisgIFNFeHByICpleHByMSgpIHsgcmV0dXJuIEV4cHIxOyB9CisgIGNvbnN0IFNFeHByICpleHByMSgpIGNvbnN0IHsgcmV0dXJuIEV4cHIxOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFY+CisgIHR5cGVuYW1lIFY6OlJfU0V4cHIgdHJhdmVyc2UoViAmVnMsIHR5cGVuYW1lIFY6OlJfQ3R4IEN0eCkgeworICAgIGF1dG8gTmUwID0gVnMudHJhdmVyc2UoRXhwcjAsIFZzLnN1YkV4cHJDdHgoQ3R4KSk7CisgICAgYXV0byBOZTEgPSBWcy50cmF2ZXJzZShFeHByMSwgVnMuc3ViRXhwckN0eChDdHgpKTsKKyAgICByZXR1cm4gVnMucmVkdWNlQmluYXJ5T3AoKnRoaXMsIE5lMCwgTmUxKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDPgorICB0eXBlbmFtZSBDOjpDVHlwZSBjb21wYXJlKGNvbnN0IEJpbmFyeU9wKiBFLCBDJiBDbXApIGNvbnN0IHsKKyAgICB0eXBlbmFtZSBDOjpDVHlwZSBDdCA9CisgICAgICBDbXAuY29tcGFyZUludGVnZXJzKGJpbmFyeU9wY29kZSgpLCBFLT5iaW5hcnlPcGNvZGUoKSk7CisgICAgaWYgKENtcC5ub3RUcnVlKEN0KSkKKyAgICAgIHJldHVybiBDdDsKKyAgICBDdCA9IENtcC5jb21wYXJlKGV4cHIwKCksIEUtPmV4cHIwKCkpOworICAgIGlmIChDbXAubm90VHJ1ZShDdCkpCisgICAgICByZXR1cm4gQ3Q7CisgICAgcmV0dXJuIENtcC5jb21wYXJlKGV4cHIxKCksIEUtPmV4cHIxKCkpOworICB9CisKK3ByaXZhdGU6CisgIFNFeHByKiBFeHByMDsKKyAgU0V4cHIqIEV4cHIxOworfTsKKworLy8vIENhc3QgZXhwcmVzc2lvbnMuCisvLy8gQ2FzdCBleHByZXNzaW9ucyBhcmUgZXNzZW50aWFsbHkgdW5hcnkgb3BlcmF0aW9ucywgYnV0IHdlIHRyZWF0IHRoZW0KKy8vLyBhcyBhIGRpc3RpbmN0IEFTVCBub2RlIGJlY2F1c2UgdGhleSBvbmx5IGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0LgorY2xhc3MgQ2FzdCA6IHB1YmxpYyBTRXhwciB7CitwdWJsaWM6CisgIENhc3QoVElMX0Nhc3RPcGNvZGUgT3AsIFNFeHByICpFKSA6IFNFeHByKENPUF9DYXN0KSwgRXhwcjAoRSkgeyBGbGFncyA9IE9wOyB9CisgIENhc3QoY29uc3QgQ2FzdCAmQywgU0V4cHIgKkUpIDogU0V4cHIoQyksIEV4cHIwKEUpIHsgRmxhZ3MgPSBDLkZsYWdzOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRXhwciAqRSkgeyByZXR1cm4gRS0+b3Bjb2RlKCkgPT0gQ09QX0Nhc3Q7IH0KKworICBUSUxfQ2FzdE9wY29kZSBjYXN0T3Bjb2RlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUSUxfQ2FzdE9wY29kZT4oRmxhZ3MpOworICB9CisKKyAgU0V4cHIgKmV4cHIoKSB7IHJldHVybiBFeHByMDsgfQorICBjb25zdCBTRXhwciAqZXhwcigpIGNvbnN0IHsgcmV0dXJuIEV4cHIwOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFY+CisgIHR5cGVuYW1lIFY6OlJfU0V4cHIgdHJhdmVyc2UoViAmVnMsIHR5cGVuYW1lIFY6OlJfQ3R4IEN0eCkgeworICAgIGF1dG8gTmUgPSBWcy50cmF2ZXJzZShFeHByMCwgVnMuc3ViRXhwckN0eChDdHgpKTsKKyAgICByZXR1cm4gVnMucmVkdWNlQ2FzdCgqdGhpcywgTmUpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIEM+CisgIHR5cGVuYW1lIEM6OkNUeXBlIGNvbXBhcmUoY29uc3QgQ2FzdCogRSwgQyYgQ21wKSBjb25zdCB7CisgICAgdHlwZW5hbWUgQzo6Q1R5cGUgQ3QgPQorICAgICAgQ21wLmNvbXBhcmVJbnRlZ2VycyhjYXN0T3Bjb2RlKCksIEUtPmNhc3RPcGNvZGUoKSk7CisgICAgaWYgKENtcC5ub3RUcnVlKEN0KSkKKyAgICAgIHJldHVybiBDdDsKKyAgICByZXR1cm4gQ21wLmNvbXBhcmUoZXhwcigpLCBFLT5leHByKCkpOworICB9CisKK3ByaXZhdGU6CisgIFNFeHByKiBFeHByMDsKK307CisKK2NsYXNzIFNDRkc7CisKKy8vLyBQaGkgTm9kZSwgZm9yIGNvZGUgaW4gU1NBIGZvcm0uCisvLy8gRWFjaCBQaGkgbm9kZSBoYXMgYW4gYXJyYXkgb2YgcG9zc2libGUgdmFsdWVzIHRoYXQgaXQgY2FuIHRha2UsCisvLy8gZGVwZW5kaW5nIG9uIHdoZXJlIGNvbnRyb2wgZmxvdyBjb21lcyBmcm9tLgorY2xhc3MgUGhpIDogcHVibGljIFNFeHByIHsKK3B1YmxpYzoKKyAgdXNpbmcgVmFsQXJyYXkgPSBTaW1wbGVBcnJheTxTRXhwciAqPjsKKworICAvLyBJbiBtaW5pbWFsIFNTQSBmb3JtLCBhbGwgUGhpIG5vZGVzIGFyZSBNdWx0aVZhbC4KKyAgLy8gRHVyaW5nIGNvbnZlcnNpb24gdG8gU1NBLCBpbmNvbXBsZXRlIFBoaSBub2RlcyBtYXkgYmUgaW50cm9kdWNlZCwgd2hpY2gKKyAgLy8gYXJlIGxhdGVyIGRldGVybWluZWQgdG8gYmUgU2luZ2xlVmFsLCBhbmQgYXJlIHRodXMgcmVkdW5kYW50LgorICBlbnVtIFN0YXR1cyB7CisgICAgUEhfTXVsdGlWYWwgPSAwLCAvLyBQaGkgbm9kZSBoYXMgbXVsdGlwbGUgZGlzdGluY3QgdmFsdWVzLiAgKE5vcm1hbCkKKyAgICBQSF9TaW5nbGVWYWwsICAgIC8vIFBoaSBub2RlIGhhcyBvbmUgZGlzdGluY3QgdmFsdWUsIGFuZCBjYW4gYmUgZWxpbWluYXRlZAorICAgIFBIX0luY29tcGxldGUgICAgLy8gUGhpIG5vZGUgaXMgaW5jb21wbGV0ZQorICB9OworCisgIFBoaSgpIDogU0V4cHIoQ09QX1BoaSkge30KKyAgUGhpKE1lbVJlZ2lvblJlZiBBLCB1bnNpZ25lZCBOdmFscykgOiBTRXhwcihDT1BfUGhpKSwgVmFsdWVzKEEsIE52YWxzKSAge30KKyAgUGhpKGNvbnN0IFBoaSAmUCwgVmFsQXJyYXkgJiZWcykgOiBTRXhwcihQKSwgVmFsdWVzKHN0ZDo6bW92ZShWcykpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRXhwciAqRSkgeyByZXR1cm4gRS0+b3Bjb2RlKCkgPT0gQ09QX1BoaTsgfQorCisgIGNvbnN0IFZhbEFycmF5ICZ2YWx1ZXMoKSBjb25zdCB7IHJldHVybiBWYWx1ZXM7IH0KKyAgVmFsQXJyYXkgJnZhbHVlcygpIHsgcmV0dXJuIFZhbHVlczsgfQorCisgIFN0YXR1cyBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KEZsYWdzKTsgfQorICB2b2lkIHNldFN0YXR1cyhTdGF0dXMgcykgeyBGbGFncyA9IHM7IH0KKworICAvLy8gUmV0dXJuIHRoZSBjbGFuZyBkZWNsYXJhdGlvbiBvZiB0aGUgdmFyaWFibGUgZm9yIHRoaXMgUGhpIG5vZGUsIGlmIGFueS4KKyAgY29uc3QgVmFsdWVEZWNsICpjbGFuZ0RlY2woKSBjb25zdCB7IHJldHVybiBDdmRlY2w7IH0KKworICAvLy8gU2V0IHRoZSBjbGFuZyB2YXJpYWJsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBQaGkgbm9kZS4KKyAgdm9pZCBzZXRDbGFuZ0RlY2woY29uc3QgVmFsdWVEZWNsICpDdmQpIHsgQ3ZkZWNsID0gQ3ZkOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFY+CisgIHR5cGVuYW1lIFY6OlJfU0V4cHIgdHJhdmVyc2UoViAmVnMsIHR5cGVuYW1lIFY6OlJfQ3R4IEN0eCkgeworICAgIHR5cGVuYW1lIFY6OnRlbXBsYXRlIENvbnRhaW5lcjx0eXBlbmFtZSBWOjpSX1NFeHByPgorICAgICAgTnZzKFZzLCBWYWx1ZXMuc2l6ZSgpKTsKKworICAgIGZvciAoY29uc3QgYXV0byAqVmFsIDogVmFsdWVzKQorICAgICAgTnZzLnB1c2hfYmFjayggVnMudHJhdmVyc2UoVmFsLCBWcy5zdWJFeHByQ3R4KEN0eCkpICk7CisgICAgcmV0dXJuIFZzLnJlZHVjZVBoaSgqdGhpcywgTnZzKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDPgorICB0eXBlbmFtZSBDOjpDVHlwZSBjb21wYXJlKGNvbnN0IFBoaSAqRSwgQyAmQ21wKSBjb25zdCB7CisgICAgLy8gVE9ETzogaW1wbGVtZW50IENGRyBjb21wYXJpc29ucworICAgIHJldHVybiBDbXAuY29tcGFyZVBvaW50ZXJzKHRoaXMsIEUpOworICB9CisKK3ByaXZhdGU6CisgIFZhbEFycmF5IFZhbHVlczsKKyAgY29uc3QgVmFsdWVEZWNsKiBDdmRlY2wgPSBudWxscHRyOworfTsKKworLy8vIEJhc2UgY2xhc3MgZm9yIGJhc2ljIGJsb2NrIHRlcm1pbmF0b3JzOiAgQnJhbmNoLCBHb3RvLCBhbmQgUmV0dXJuLgorY2xhc3MgVGVybWluYXRvciA6IHB1YmxpYyBTRXhwciB7Citwcm90ZWN0ZWQ6CisgIFRlcm1pbmF0b3IoVElMX09wY29kZSBPcCkgOiBTRXhwcihPcCkge30KKyAgVGVybWluYXRvcihjb25zdCBTRXhwciAmRSkgOiBTRXhwcihFKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0V4cHIgKkUpIHsKKyAgICByZXR1cm4gRS0+b3Bjb2RlKCkgPj0gQ09QX0dvdG8gJiYgRS0+b3Bjb2RlKCkgPD0gQ09QX1JldHVybjsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGxpc3Qgb2YgYmFzaWMgYmxvY2tzIHRoYXQgdGhpcyB0ZXJtaW5hdG9yIGNhbiBicmFuY2ggdG8uCisgIEFycmF5UmVmPEJhc2ljQmxvY2sgKj4gc3VjY2Vzc29ycygpOworCisgIEFycmF5UmVmPEJhc2ljQmxvY2sgKj4gc3VjY2Vzc29ycygpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxUZXJtaW5hdG9yKj4odGhpcyktPnN1Y2Nlc3NvcnMoKTsKKyAgfQorfTsKKworLy8vIEp1bXAgdG8gYW5vdGhlciBiYXNpYyBibG9jay4KKy8vLyBBIGdvdG8gaW5zdHJ1Y3Rpb24gaXMgZXNzZW50aWFsbHkgYSB0YWlsLXJlY3Vyc2l2ZSBjYWxsIGludG8gYW5vdGhlcgorLy8vIGJsb2NrLiAgSW4gYWRkaXRpb24gdG8gdGhlIGJsb2NrIHBvaW50ZXIsIGl0IHNwZWNpZmllcyBhbiBpbmRleCBpbnRvIHRoZQorLy8vIHBoaSBub2RlcyBvZiB0aGF0IGJsb2NrLiAgVGhlIGluZGV4IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSAiYXJndW1lbnRzIgorLy8vIG9mIHRoZSBjYWxsLgorY2xhc3MgR290byA6IHB1YmxpYyBUZXJtaW5hdG9yIHsKK3B1YmxpYzoKKyAgR290byhCYXNpY0Jsb2NrICpCLCB1bnNpZ25lZCBJKQorICAgICAgOiBUZXJtaW5hdG9yKENPUF9Hb3RvKSwgVGFyZ2V0QmxvY2soQiksIEluZGV4KEkpIHt9CisgIEdvdG8oY29uc3QgR290byAmRywgQmFzaWNCbG9jayAqQiwgdW5zaWduZWQgSSkKKyAgICAgIDogVGVybWluYXRvcihDT1BfR290byksIFRhcmdldEJsb2NrKEIpLCBJbmRleChJKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0V4cHIgKkUpIHsgcmV0dXJuIEUtPm9wY29kZSgpID09IENPUF9Hb3RvOyB9CisKKyAgY29uc3QgQmFzaWNCbG9jayAqdGFyZ2V0QmxvY2soKSBjb25zdCB7IHJldHVybiBUYXJnZXRCbG9jazsgfQorICBCYXNpY0Jsb2NrICp0YXJnZXRCbG9jaygpIHsgcmV0dXJuIFRhcmdldEJsb2NrOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIGluZGV4IGludG8gdGhlCisgIHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeyByZXR1cm4gSW5kZXg7IH0KKworICAvLy8gUmV0dXJuIHRoZSBsaXN0IG9mIGJhc2ljIGJsb2NrcyB0aGF0IHRoaXMgdGVybWluYXRvciBjYW4gYnJhbmNoIHRvLgorICBBcnJheVJlZjxCYXNpY0Jsb2NrICo+IHN1Y2Nlc3NvcnMoKSB7IHJldHVybiBUYXJnZXRCbG9jazsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBWPgorICB0eXBlbmFtZSBWOjpSX1NFeHByIHRyYXZlcnNlKFYgJlZzLCB0eXBlbmFtZSBWOjpSX0N0eCBDdHgpIHsKKyAgICBCYXNpY0Jsb2NrICpOdGIgPSBWcy5yZWR1Y2VCYXNpY0Jsb2NrUmVmKFRhcmdldEJsb2NrKTsKKyAgICByZXR1cm4gVnMucmVkdWNlR290bygqdGhpcywgTnRiKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDPgorICB0eXBlbmFtZSBDOjpDVHlwZSBjb21wYXJlKGNvbnN0IEdvdG8gKkUsIEMgJkNtcCkgY29uc3QgeworICAgIC8vIFRPRE86IGltcGxlbWVudCBDRkcgY29tcGFyaXNvbnMKKyAgICByZXR1cm4gQ21wLmNvbXBhcmVQb2ludGVycyh0aGlzLCBFKTsKKyAgfQorCitwcml2YXRlOgorICBCYXNpY0Jsb2NrICpUYXJnZXRCbG9jazsKKyAgdW5zaWduZWQgSW5kZXg7Cit9OworCisvLy8gQSBjb25kaXRpb25hbCBicmFuY2ggdG8gdHdvIG90aGVyIGJsb2Nrcy4KKy8vLyBOb3RlIHRoYXQgdW5saWtlIEdvdG8sIEJyYW5jaCBkb2VzIG5vdCBoYXZlIGFuIGluZGV4LiAgVGhlIHRhcmdldCBibG9ja3MKKy8vLyBtdXN0IGJlIGNoaWxkLWJsb2NrcywgYW5kIGNhbm5vdCBoYXZlIFBoaSBub2Rlcy4KK2NsYXNzIEJyYW5jaCA6IHB1YmxpYyBUZXJtaW5hdG9yIHsKK3B1YmxpYzoKKyAgQnJhbmNoKFNFeHByICpDLCBCYXNpY0Jsb2NrICpULCBCYXNpY0Jsb2NrICpFKQorICAgICAgOiBUZXJtaW5hdG9yKENPUF9CcmFuY2gpLCBDb25kaXRpb24oQykgeworICAgIEJyYW5jaGVzWzBdID0gVDsKKyAgICBCcmFuY2hlc1sxXSA9IEU7CisgIH0KKworICBCcmFuY2goY29uc3QgQnJhbmNoICZCciwgU0V4cHIgKkMsIEJhc2ljQmxvY2sgKlQsIEJhc2ljQmxvY2sgKkUpCisgICAgICA6IFRlcm1pbmF0b3IoQnIpLCBDb25kaXRpb24oQykgeworICAgIEJyYW5jaGVzWzBdID0gVDsKKyAgICBCcmFuY2hlc1sxXSA9IEU7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNFeHByICpFKSB7IHJldHVybiBFLT5vcGNvZGUoKSA9PSBDT1BfQnJhbmNoOyB9CisKKyAgY29uc3QgU0V4cHIgKmNvbmRpdGlvbigpIGNvbnN0IHsgcmV0dXJuIENvbmRpdGlvbjsgfQorICBTRXhwciAqY29uZGl0aW9uKCkgeyByZXR1cm4gQ29uZGl0aW9uOyB9CisKKyAgY29uc3QgQmFzaWNCbG9jayAqdGhlbkJsb2NrKCkgY29uc3QgeyByZXR1cm4gQnJhbmNoZXNbMF07IH0KKyAgQmFzaWNCbG9jayAqdGhlbkJsb2NrKCkgeyByZXR1cm4gQnJhbmNoZXNbMF07IH0KKworICBjb25zdCBCYXNpY0Jsb2NrICplbHNlQmxvY2soKSBjb25zdCB7IHJldHVybiBCcmFuY2hlc1sxXTsgfQorICBCYXNpY0Jsb2NrICplbHNlQmxvY2soKSB7IHJldHVybiBCcmFuY2hlc1sxXTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIGxpc3Qgb2YgYmFzaWMgYmxvY2tzIHRoYXQgdGhpcyB0ZXJtaW5hdG9yIGNhbiBicmFuY2ggdG8uCisgIEFycmF5UmVmPEJhc2ljQmxvY2sqPiBzdWNjZXNzb3JzKCkgeworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoQnJhbmNoZXMpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFY+CisgIHR5cGVuYW1lIFY6OlJfU0V4cHIgdHJhdmVyc2UoViAmVnMsIHR5cGVuYW1lIFY6OlJfQ3R4IEN0eCkgeworICAgIGF1dG8gTmMgPSBWcy50cmF2ZXJzZShDb25kaXRpb24sIFZzLnN1YkV4cHJDdHgoQ3R4KSk7CisgICAgQmFzaWNCbG9jayAqTnRiID0gVnMucmVkdWNlQmFzaWNCbG9ja1JlZihCcmFuY2hlc1swXSk7CisgICAgQmFzaWNCbG9jayAqTnRlID0gVnMucmVkdWNlQmFzaWNCbG9ja1JlZihCcmFuY2hlc1sxXSk7CisgICAgcmV0dXJuIFZzLnJlZHVjZUJyYW5jaCgqdGhpcywgTmMsIE50YiwgTnRlKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDPgorICB0eXBlbmFtZSBDOjpDVHlwZSBjb21wYXJlKGNvbnN0IEJyYW5jaCAqRSwgQyAmQ21wKSBjb25zdCB7CisgICAgLy8gVE9ETzogaW1wbGVtZW50IENGRyBjb21wYXJpc29ucworICAgIHJldHVybiBDbXAuY29tcGFyZVBvaW50ZXJzKHRoaXMsIEUpOworICB9CisKK3ByaXZhdGU6CisgIFNFeHByICpDb25kaXRpb247CisgIEJhc2ljQmxvY2sgKkJyYW5jaGVzWzJdOworfTsKKworLy8vIFJldHVybiBmcm9tIHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24sIHBhc3NpbmcgdGhlIHJldHVybiB2YWx1ZSB0byB0aGUgY2FsbGVyLgorLy8vIE9ubHkgdGhlIGV4aXQgYmxvY2sgc2hvdWxkIGVuZCB3aXRoIGEgcmV0dXJuIHN0YXRlbWVudC4KK2NsYXNzIFJldHVybiA6IHB1YmxpYyBUZXJtaW5hdG9yIHsKK3B1YmxpYzoKKyAgUmV0dXJuKFNFeHByKiBSdmFsKSA6IFRlcm1pbmF0b3IoQ09QX1JldHVybiksIFJldHZhbChSdmFsKSB7fQorICBSZXR1cm4oY29uc3QgUmV0dXJuICZSLCBTRXhwciogUnZhbCkgOiBUZXJtaW5hdG9yKFIpLCBSZXR2YWwoUnZhbCkge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNFeHByICpFKSB7IHJldHVybiBFLT5vcGNvZGUoKSA9PSBDT1BfUmV0dXJuOyB9CisKKyAgLy8vIFJldHVybiBhbiBlbXB0eSBsaXN0LgorICBBcnJheVJlZjxCYXNpY0Jsb2NrICo+IHN1Y2Nlc3NvcnMoKSB7IHJldHVybiBOb25lOyB9CisKKyAgU0V4cHIgKnJldHVyblZhbHVlKCkgeyByZXR1cm4gUmV0dmFsOyB9CisgIGNvbnN0IFNFeHByICpyZXR1cm5WYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFJldHZhbDsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBWPgorICB0eXBlbmFtZSBWOjpSX1NFeHByIHRyYXZlcnNlKFYgJlZzLCB0eXBlbmFtZSBWOjpSX0N0eCBDdHgpIHsKKyAgICBhdXRvIE5lID0gVnMudHJhdmVyc2UoUmV0dmFsLCBWcy5zdWJFeHByQ3R4KEN0eCkpOworICAgIHJldHVybiBWcy5yZWR1Y2VSZXR1cm4oKnRoaXMsIE5lKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDPgorICB0eXBlbmFtZSBDOjpDVHlwZSBjb21wYXJlKGNvbnN0IFJldHVybiAqRSwgQyAmQ21wKSBjb25zdCB7CisgICAgcmV0dXJuIENtcC5jb21wYXJlKFJldHZhbCwgRS0+UmV0dmFsKTsKKyAgfQorCitwcml2YXRlOgorICBTRXhwciogUmV0dmFsOworfTsKKworaW5saW5lIEFycmF5UmVmPEJhc2ljQmxvY2sqPiBUZXJtaW5hdG9yOjpzdWNjZXNzb3JzKCkgeworICBzd2l0Y2ggKG9wY29kZSgpKSB7CisgICAgY2FzZSBDT1BfR290bzogICByZXR1cm4gY2FzdDxHb3RvPih0aGlzKS0+c3VjY2Vzc29ycygpOworICAgIGNhc2UgQ09QX0JyYW5jaDogcmV0dXJuIGNhc3Q8QnJhbmNoPih0aGlzKS0+c3VjY2Vzc29ycygpOworICAgIGNhc2UgQ09QX1JldHVybjogcmV0dXJuIGNhc3Q8UmV0dXJuPih0aGlzKS0+c3VjY2Vzc29ycygpOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTm9uZTsKKyAgfQorfQorCisvLy8gQSBiYXNpYyBibG9jayBpcyBwYXJ0IG9mIGFuIFNDRkcuICBJdCBjYW4gYmUgdHJlYXRlZCBhcyBhIGZ1bmN0aW9uIGluCisvLy8gY29udGludWF0aW9uIHBhc3Npbmcgc3R5bGUuICBBIGJsb2NrIGNvbnNpc3RzIG9mIGEgc2VxdWVuY2Ugb2YgcGhpIG5vZGVzLAorLy8vIHdoaWNoIGFyZSAiYXJndW1lbnRzIiB0byB0aGUgZnVuY3Rpb24sIGZvbGxvd2VkIGJ5IGEgc2VxdWVuY2Ugb2YKKy8vLyBpbnN0cnVjdGlvbnMuICBJdCBlbmRzIHdpdGggYSBUZXJtaW5hdG9yLCB3aGljaCBpcyBhIEJyYW5jaCBvciBHb3RvIHRvCisvLy8gYW5vdGhlciBiYXNpYyBibG9jayBpbiB0aGUgc2FtZSBTQ0ZHLgorY2xhc3MgQmFzaWNCbG9jayA6IHB1YmxpYyBTRXhwciB7CitwdWJsaWM6CisgIHVzaW5nIEluc3RyQXJyYXkgPSBTaW1wbGVBcnJheTxTRXhwciAqPjsKKyAgdXNpbmcgQmxvY2tBcnJheSA9IFNpbXBsZUFycmF5PEJhc2ljQmxvY2sgKj47CisKKyAgLy8gVG9wb2xvZ3lOb2RlcyBhcmUgdXNlZCB0byBvdmVybGF5IHRyZWUgc3RydWN0dXJlcyBvbiB0b3Agb2YgdGhlIENGRywKKyAgLy8gc3VjaCBhcyBkb21pbmF0b3IgYW5kIHBvc3Rkb21pbmF0b3IgdHJlZXMuICBFYWNoIGJsb2NrIGlzIGFzc2lnbmVkIGFuCisgIC8vIElEIGluIHRoZSB0cmVlIGFjY29yZGluZyB0byBhIGRlcHRoLWZpcnN0IHNlYXJjaC4gIFRyZWUgdHJhdmVyc2FscyBhcmUKKyAgLy8gYWx3YXlzIHVwLCB0b3dhcmRzIHRoZSBwYXJlbnRzLgorICBzdHJ1Y3QgVG9wb2xvZ3lOb2RlIHsKKyAgICBpbnQgTm9kZUlEID0gMDsKKworICAgIC8vIEluY2x1ZGVzIHRoaXMgbm9kZSwgc28gbXVzdCBiZSA+IDEuCisgICAgaW50IFNpemVPZlN1YlRyZWUgPSAwOworCisgICAgLy8gUG9pbnRlciB0byBwYXJlbnQuCisgICAgQmFzaWNCbG9jayAqUGFyZW50ID0gbnVsbHB0cjsKKworICAgIFRvcG9sb2d5Tm9kZSgpID0gZGVmYXVsdDsKKworICAgIGJvb2wgaXNQYXJlbnRPZihjb25zdCBUb3BvbG9neU5vZGUmIE90aGVyTm9kZSkgeworICAgICAgcmV0dXJuIE90aGVyTm9kZS5Ob2RlSUQgPiBOb2RlSUQgJiYKKyAgICAgICAgICAgICBPdGhlck5vZGUuTm9kZUlEIDwgTm9kZUlEICsgU2l6ZU9mU3ViVHJlZTsKKyAgICB9CisKKyAgICBib29sIGlzUGFyZW50T2ZPckVxdWFsKGNvbnN0IFRvcG9sb2d5Tm9kZSYgT3RoZXJOb2RlKSB7CisgICAgICByZXR1cm4gT3RoZXJOb2RlLk5vZGVJRCA+PSBOb2RlSUQgJiYKKyAgICAgICAgICAgICBPdGhlck5vZGUuTm9kZUlEIDwgTm9kZUlEICsgU2l6ZU9mU3ViVHJlZTsKKyAgICB9CisgIH07CisKKyAgZXhwbGljaXQgQmFzaWNCbG9jayhNZW1SZWdpb25SZWYgQSkKKyAgICAgIDogU0V4cHIoQ09QX0Jhc2ljQmxvY2spLCBBcmVuYShBKSwgQmxvY2tJRCgwKSwgVmlzaXRlZChmYWxzZSkge30KKyAgQmFzaWNCbG9jayhCYXNpY0Jsb2NrICZCLCBNZW1SZWdpb25SZWYgQSwgSW5zdHJBcnJheSAmJkFzLCBJbnN0ckFycmF5ICYmSXMsCisgICAgICAgICAgICAgVGVybWluYXRvciAqVCkKKyAgICAgIDogU0V4cHIoQ09QX0Jhc2ljQmxvY2spLCBBcmVuYShBKSwgQmxvY2tJRCgwKSwgVmlzaXRlZChmYWxzZSksCisgICAgICAgIEFyZ3Moc3RkOjptb3ZlKEFzKSksIEluc3RycyhzdGQ6Om1vdmUoSXMpKSwgVGVybUluc3RyKFQpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRXhwciAqRSkgeyByZXR1cm4gRS0+b3Bjb2RlKCkgPT0gQ09QX0Jhc2ljQmxvY2s7IH0KKworICAvLy8gUmV0dXJucyB0aGUgYmxvY2sgSUQuICBFdmVyeSBibG9jayBoYXMgYSB1bmlxdWUgSUQgaW4gdGhlIENGRy4KKyAgaW50IGJsb2NrSUQoKSBjb25zdCB7IHJldHVybiBCbG9ja0lEOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBwcmVkZWNlc3NvcnMuCisgIHNpemVfdCBudW1QcmVkZWNlc3NvcnMoKSBjb25zdCB7IHJldHVybiBQcmVkZWNlc3NvcnMuc2l6ZSgpOyB9CisgIHNpemVfdCBudW1TdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gc3VjY2Vzc29ycygpLnNpemUoKTsgfQorCisgIGNvbnN0IFNDRkcqIGNmZygpIGNvbnN0IHsgcmV0dXJuIENGR1B0cjsgfQorICBTQ0ZHKiBjZmcoKSB7IHJldHVybiBDRkdQdHI7IH0KKworICBjb25zdCBCYXNpY0Jsb2NrICpwYXJlbnQoKSBjb25zdCB7IHJldHVybiBEb21pbmF0b3JOb2RlLlBhcmVudDsgfQorICBCYXNpY0Jsb2NrICpwYXJlbnQoKSB7IHJldHVybiBEb21pbmF0b3JOb2RlLlBhcmVudDsgfQorCisgIGNvbnN0IEluc3RyQXJyYXkgJmFyZ3VtZW50cygpIGNvbnN0IHsgcmV0dXJuIEFyZ3M7IH0KKyAgSW5zdHJBcnJheSAmYXJndW1lbnRzKCkgeyByZXR1cm4gQXJnczsgfQorCisgIEluc3RyQXJyYXkgJmluc3RydWN0aW9ucygpIHsgcmV0dXJuIEluc3RyczsgfQorICBjb25zdCBJbnN0ckFycmF5ICZpbnN0cnVjdGlvbnMoKSBjb25zdCB7IHJldHVybiBJbnN0cnM7IH0KKworICAvLy8gUmV0dXJucyBhIGxpc3Qgb2YgcHJlZGVjZXNzb3JzLgorICAvLy8gVGhlIG9yZGVyIG9mIHByZWRlY2Vzc29ycyBpbiB0aGUgbGlzdCBpcyBpbXBvcnRhbnQ7IGVhY2ggcGhpIG5vZGUgaGFzCisgIC8vLyBleGFjdGx5IG9uZSBhcmd1bWVudCBmb3IgZWFjaCBwcmVjZXNzb3IsIGluIHRoZSBzYW1lIG9yZGVyLgorICBCbG9ja0FycmF5ICZwcmVkZWNlc3NvcnMoKSB7IHJldHVybiBQcmVkZWNlc3NvcnM7IH0KKyAgY29uc3QgQmxvY2tBcnJheSAmcHJlZGVjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gUHJlZGVjZXNzb3JzOyB9CisKKyAgQXJyYXlSZWY8QmFzaWNCbG9jayo+IHN1Y2Nlc3NvcnMoKSB7IHJldHVybiBUZXJtSW5zdHItPnN1Y2Nlc3NvcnMoKTsgfQorICBBcnJheVJlZjxCYXNpY0Jsb2NrKj4gc3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIFRlcm1JbnN0ci0+c3VjY2Vzc29ycygpOyB9CisKKyAgY29uc3QgVGVybWluYXRvciAqdGVybWluYXRvcigpIGNvbnN0IHsgcmV0dXJuIFRlcm1JbnN0cjsgfQorICBUZXJtaW5hdG9yICp0ZXJtaW5hdG9yKCkgeyByZXR1cm4gVGVybUluc3RyOyB9CisKKyAgdm9pZCBzZXRUZXJtaW5hdG9yKFRlcm1pbmF0b3IgKkUpIHsgVGVybUluc3RyID0gRTsgfQorCisgIGJvb2wgRG9taW5hdGVzKGNvbnN0IEJhc2ljQmxvY2sgJk90aGVyKSB7CisgICAgcmV0dXJuIERvbWluYXRvck5vZGUuaXNQYXJlbnRPZk9yRXF1YWwoT3RoZXIuRG9taW5hdG9yTm9kZSk7CisgIH0KKworICBib29sIFBvc3REb21pbmF0ZXMoY29uc3QgQmFzaWNCbG9jayAmT3RoZXIpIHsKKyAgICByZXR1cm4gUG9zdERvbWluYXRvck5vZGUuaXNQYXJlbnRPZk9yRXF1YWwoT3RoZXIuUG9zdERvbWluYXRvck5vZGUpOworICB9CisKKyAgLy8vIEFkZCBhIG5ldyBhcmd1bWVudC4KKyAgdm9pZCBhZGRBcmd1bWVudChQaGkgKlYpIHsKKyAgICBBcmdzLnJlc2VydmVDaGVjaygxLCBBcmVuYSk7CisgICAgQXJncy5wdXNoX2JhY2soVik7CisgIH0KKworICAvLy8gQWRkIGEgbmV3IGluc3RydWN0aW9uLgorICB2b2lkIGFkZEluc3RydWN0aW9uKFNFeHByICpWKSB7CisgICAgSW5zdHJzLnJlc2VydmVDaGVjaygxLCBBcmVuYSk7CisgICAgSW5zdHJzLnB1c2hfYmFjayhWKTsKKyAgfQorCisgIC8vIEFkZCBhIG5ldyBwcmVkZWNlc3NvciwgYW5kIHJldHVybiB0aGUgcGhpLW5vZGUgaW5kZXggZm9yIGl0LgorICAvLyBXaWxsIGFkZCBhbiBhcmd1bWVudCB0byBhbGwgcGhpLW5vZGVzLCBpbml0aWFsaXplZCB0byBudWxscHRyLgorICB1bnNpZ25lZCBhZGRQcmVkZWNlc3NvcihCYXNpY0Jsb2NrICpQcmVkKTsKKworICAvLyBSZXNlcnZlIHNwYWNlIGZvciBOYXJncyBhcmd1bWVudHMuCisgIHZvaWQgcmVzZXJ2ZUFyZ3VtZW50cyh1bnNpZ25lZCBOYXJncykgICB7IEFyZ3MucmVzZXJ2ZShOYXJncywgQXJlbmEpOyB9CisKKyAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgTmlucyBpbnN0cnVjdGlvbnMuCisgIHZvaWQgcmVzZXJ2ZUluc3RydWN0aW9ucyh1bnNpZ25lZCBOaW5zKSB7IEluc3Rycy5yZXNlcnZlKE5pbnMsIEFyZW5hKTsgfQorCisgIC8vIFJlc2VydmUgc3BhY2UgZm9yIE51bVByZWRzIHByZWRlY2Vzc29ycywgaW5jbHVkaW5nIHNwYWNlIGluIHBoaSBub2Rlcy4KKyAgdm9pZCByZXNlcnZlUHJlZGVjZXNzb3JzKHVuc2lnbmVkIE51bVByZWRzKTsKKworICAvLy8gUmV0dXJuIHRoZSBpbmRleCBvZiBCQiwgb3IgUHJlZGVjZXNzb3JzLnNpemUgaWYgQkIgaXMgbm90IGEgcHJlZGVjZXNzb3IuCisgIHVuc2lnbmVkIGZpbmRQcmVkZWNlc3NvckluZGV4KGNvbnN0IEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgYXV0byBJID0gc3RkOjpmaW5kKFByZWRlY2Vzc29ycy5jYmVnaW4oKSwgUHJlZGVjZXNzb3JzLmNlbmQoKSwgQkIpOworICAgIHJldHVybiBzdGQ6OmRpc3RhbmNlKFByZWRlY2Vzc29ycy5jYmVnaW4oKSwgSSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVj4KKyAgdHlwZW5hbWUgVjo6Ul9CYXNpY0Jsb2NrIHRyYXZlcnNlKFYgJlZzLCB0eXBlbmFtZSBWOjpSX0N0eCBDdHgpIHsKKyAgICB0eXBlbmFtZSBWOjp0ZW1wbGF0ZSBDb250YWluZXI8U0V4cHIqPiBOYXMoVnMsIEFyZ3Muc2l6ZSgpKTsKKyAgICB0eXBlbmFtZSBWOjp0ZW1wbGF0ZSBDb250YWluZXI8U0V4cHIqPiBOaXMoVnMsIEluc3Rycy5zaXplKCkpOworCisgICAgLy8gRW50ZXJpbmcgdGhlIGJhc2ljIGJsb2NrIHNob3VsZCBkbyBhbnkgc2NvcGUgaW5pdGlhbGl6YXRpb24uCisgICAgVnMuZW50ZXJCYXNpY0Jsb2NrKCp0aGlzKTsKKworICAgIGZvciAoY29uc3QgYXV0byAqRSA6IEFyZ3MpIHsKKyAgICAgIGF1dG8gTmUgPSBWcy50cmF2ZXJzZShFLCBWcy5zdWJFeHByQ3R4KEN0eCkpOworICAgICAgTmFzLnB1c2hfYmFjayhOZSk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byAqRSA6IEluc3RycykgeworICAgICAgYXV0byBOZSA9IFZzLnRyYXZlcnNlKEUsIFZzLnN1YkV4cHJDdHgoQ3R4KSk7CisgICAgICBOaXMucHVzaF9iYWNrKE5lKTsKKyAgICB9CisgICAgYXV0byBOdCA9IFZzLnRyYXZlcnNlKFRlcm1JbnN0ciwgQ3R4KTsKKworICAgIC8vIEV4aXRpbmcgdGhlIGJhc2ljIGJsb2NrIHNob3VsZCBoYW5kbGUgYW55IHNjb3BlIGNsZWFudXAuCisgICAgVnMuZXhpdEJhc2ljQmxvY2soKnRoaXMpOworCisgICAgcmV0dXJuIFZzLnJlZHVjZUJhc2ljQmxvY2soKnRoaXMsIE5hcywgTmlzLCBOdCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KKyAgdHlwZW5hbWUgQzo6Q1R5cGUgY29tcGFyZShjb25zdCBCYXNpY0Jsb2NrICpFLCBDICZDbXApIGNvbnN0IHsKKyAgICAvLyBUT0RPOiBpbXBsZW1lbnQgQ0ZHIGNvbXBhcmlzb25zCisgICAgcmV0dXJuIENtcC5jb21wYXJlUG9pbnRlcnModGhpcywgRSk7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFNDRkc7CisKKyAgLy8gYXNzaWduIHVuaXF1ZSBpZHMgdG8gYWxsIGluc3RydWN0aW9ucworICBpbnQgcmVudW1iZXJJbnN0cnMoaW50IGlkKTsKKworICBpbnQgdG9wb2xvZ2ljYWxTb3J0KFNpbXBsZUFycmF5PEJhc2ljQmxvY2sgKj4gJkJsb2NrcywgaW50IElEKTsKKyAgaW50IHRvcG9sb2dpY2FsRmluYWxTb3J0KFNpbXBsZUFycmF5PEJhc2ljQmxvY2sgKj4gJkJsb2NrcywgaW50IElEKTsKKyAgdm9pZCBjb21wdXRlRG9taW5hdG9yKCk7CisgIHZvaWQgY29tcHV0ZVBvc3REb21pbmF0b3IoKTsKKworICAvLyBUaGUgYXJlbmEgdXNlZCB0byBhbGxvY2F0ZSB0aGlzIGJsb2NrLgorICBNZW1SZWdpb25SZWYgQXJlbmE7CisKKyAgLy8gVGhlIENGRyB0aGF0IGNvbnRhaW5zIHRoaXMgYmxvY2suCisgIFNDRkcgKkNGR1B0ciA9IG51bGxwdHI7CisKKyAgLy8gVW5pcXVlIElEIGZvciB0aGlzIEJCIGluIHRoZSBjb250YWluaW5nIENGRy4gSURzIGFyZSBpbiB0b3BvbG9naWNhbCBvcmRlci4KKyAgaW50IEJsb2NrSUQgOiAzMTsKKworICAvLyBCaXQgdG8gZGV0ZXJtaW5lIGlmIGEgYmxvY2sgaGFzIGJlZW4gdmlzaXRlZCBkdXJpbmcgYSB0cmF2ZXJzYWwuCisgIGJvb2wgVmlzaXRlZCA6IDE7CisKKyAgLy8gUHJlZGVjZXNzb3IgYmxvY2tzIGluIHRoZSBDRkcuCisgIEJsb2NrQXJyYXkgUHJlZGVjZXNzb3JzOworCisgIC8vIFBoaSBub2Rlcy4gT25lIGFyZ3VtZW50IHBlciBwcmVkZWNlc3Nvci4KKyAgSW5zdHJBcnJheSBBcmdzOworCisgIC8vIEluc3RydWN0aW9ucy4KKyAgSW5zdHJBcnJheSBJbnN0cnM7CisKKyAgLy8gVGVybWluYXRpbmcgaW5zdHJ1Y3Rpb24uCisgIFRlcm1pbmF0b3IgKlRlcm1JbnN0ciA9IG51bGxwdHI7CisKKyAgLy8gVGhlIGRvbWluYXRvciB0cmVlLgorICBUb3BvbG9neU5vZGUgRG9taW5hdG9yTm9kZTsKKworICAvLyBUaGUgcG9zdC1kb21pbmF0b3IgdHJlZS4KKyAgVG9wb2xvZ3lOb2RlIFBvc3REb21pbmF0b3JOb2RlOworfTsKKworLy8vIEFuIFNDRkcgaXMgYSBjb250cm9sLWZsb3cgZ3JhcGguICBJdCBjb25zaXN0cyBvZiBhIHNldCBvZiBiYXNpYyBibG9ja3MsCisvLy8gZWFjaCBvZiB3aGljaCB0ZXJtaW5hdGVzIGluIGEgYnJhbmNoIHRvIGFub3RoZXIgYmFzaWMgYmxvY2suICBUaGVyZSBpcyBvbmUKKy8vLyBlbnRyeSBwb2ludCwgYW5kIG9uZSBleGl0IHBvaW50LgorY2xhc3MgU0NGRyA6IHB1YmxpYyBTRXhwciB7CitwdWJsaWM6CisgIHVzaW5nIEJsb2NrQXJyYXkgPSBTaW1wbGVBcnJheTxCYXNpY0Jsb2NrICo+OworICB1c2luZyBpdGVyYXRvciA9IEJsb2NrQXJyYXk6Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IEJsb2NrQXJyYXk6OmNvbnN0X2l0ZXJhdG9yOworCisgIFNDRkcoTWVtUmVnaW9uUmVmIEEsIHVuc2lnbmVkIE5ibG9ja3MpCisgICAgICA6IFNFeHByKENPUF9TQ0ZHKSwgQXJlbmEoQSksIEJsb2NrcyhBLCBOYmxvY2tzKSB7CisgICAgRW50cnkgPSBuZXcgKEEpIEJhc2ljQmxvY2soQSk7CisgICAgRXhpdCAgPSBuZXcgKEEpIEJhc2ljQmxvY2soQSk7CisgICAgYXV0byAqViA9IG5ldyAoQSkgUGhpKCk7CisgICAgRXhpdC0+YWRkQXJndW1lbnQoVik7CisgICAgRXhpdC0+c2V0VGVybWluYXRvcihuZXcgKEEpIFJldHVybihWKSk7CisgICAgYWRkKEVudHJ5KTsKKyAgICBhZGQoRXhpdCk7CisgIH0KKworICBTQ0ZHKGNvbnN0IFNDRkcgJkNmZywgQmxvY2tBcnJheSAmJkJhKSAvLyBzdGVhbHMgbWVtb3J5IGZyb20gQmEKKyAgICAgIDogU0V4cHIoQ09QX1NDRkcpLCBBcmVuYShDZmcuQXJlbmEpLCBCbG9ja3Moc3RkOjptb3ZlKEJhKSkgeworICAgIC8vIFRPRE86IHNldCBlbnRyeSBhbmQgZXhpdCEKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0V4cHIgKkUpIHsgcmV0dXJuIEUtPm9wY29kZSgpID09IENPUF9TQ0ZHOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgQ0ZHIGlzIHZhbGlkLgorICBib29sIHZhbGlkKCkgY29uc3QgeyByZXR1cm4gRW50cnkgJiYgRXhpdCAmJiBCbG9ja3Muc2l6ZSgpID4gMDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIENGRyBoYXMgYmVlbiBub3JtYWxpemVkLgorICAvLy8gQWZ0ZXIgbm9ybWFsaXphdGlvbiwgYmxvY2tzIGFyZSBpbiB0b3BvbG9naWNhbCBvcmRlciwgYW5kIGJsb2NrIGFuZAorICAvLy8gaW5zdHJ1Y3Rpb24gSURzIGhhdmUgYmVlbiBhc3NpZ25lZC4KKyAgYm9vbCBub3JtYWwoKSBjb25zdCB7IHJldHVybiBOb3JtYWw7IH0KKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIEJsb2Nrcy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIEJsb2Nrcy5lbmQoKTsgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gY2JlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY2VuZCgpOyB9CisKKyAgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3QgeyByZXR1cm4gQmxvY2tzLmNiZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGNlbmQoKSBjb25zdCB7IHJldHVybiBCbG9ja3MuY2VuZCgpOyB9CisKKyAgY29uc3QgQmFzaWNCbG9jayAqZW50cnkoKSBjb25zdCB7IHJldHVybiBFbnRyeTsgfQorICBCYXNpY0Jsb2NrICplbnRyeSgpIHsgcmV0dXJuIEVudHJ5OyB9CisgIGNvbnN0IEJhc2ljQmxvY2sgKmV4aXQoKSBjb25zdCB7IHJldHVybiBFeGl0OyB9CisgIEJhc2ljQmxvY2sgKmV4aXQoKSB7IHJldHVybiBFeGl0OyB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgQ0ZHLgorICAvLy8gQmxvY2s6OmJsb2NrSUQoKSB3aWxsIHJldHVybiBhIG51bWJlciBsZXNzIHRoYW4gbnVtQmxvY2tzKCk7CisgIHNpemVfdCBudW1CbG9ja3MoKSBjb25zdCB7IHJldHVybiBCbG9ja3Muc2l6ZSgpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiB0aGUgQ0ZHLgorICAvLy8gVGhpcyBpcyB1c2VmdWwgZm9yIGJ1aWxkaW5nIGluc3RydWN0aW9uIHNpZGUtdGFibGVzOworICAvLy8gQSBjYWxsIHRvIFNFeHByOjppZCgpIHdpbGwgcmV0dXJuIGEgbnVtYmVyIGxlc3MgdGhhbiBudW1JbnN0cnVjdGlvbnMoKS4KKyAgdW5zaWduZWQgbnVtSW5zdHJ1Y3Rpb25zKCkgeyByZXR1cm4gTnVtSW5zdHJ1Y3Rpb25zOyB9CisKKyAgaW5saW5lIHZvaWQgYWRkKEJhc2ljQmxvY2sgKkJCKSB7CisgICAgYXNzZXJ0KEJCLT5DRkdQdHIgPT0gbnVsbHB0cik7CisgICAgQkItPkNGR1B0ciA9IHRoaXM7CisgICAgQmxvY2tzLnJlc2VydmVDaGVjaygxLCBBcmVuYSk7CisgICAgQmxvY2tzLnB1c2hfYmFjayhCQik7CisgIH0KKworICB2b2lkIHNldEVudHJ5KEJhc2ljQmxvY2sgKkJCKSB7IEVudHJ5ID0gQkI7IH0KKyAgdm9pZCBzZXRFeGl0KEJhc2ljQmxvY2sgKkJCKSAgeyBFeGl0ID0gQkI7ICB9CisKKyAgdm9pZCBjb21wdXRlTm9ybWFsRm9ybSgpOworCisgIHRlbXBsYXRlIDxjbGFzcyBWPgorICB0eXBlbmFtZSBWOjpSX1NFeHByIHRyYXZlcnNlKFYgJlZzLCB0eXBlbmFtZSBWOjpSX0N0eCBDdHgpIHsKKyAgICBWcy5lbnRlckNGRygqdGhpcyk7CisgICAgdHlwZW5hbWUgVjo6dGVtcGxhdGUgQ29udGFpbmVyPEJhc2ljQmxvY2sgKj4gQmJzKFZzLCBCbG9ja3Muc2l6ZSgpKTsKKworICAgIGZvciAoY29uc3QgYXV0byAqQiA6IEJsb2NrcykgeworICAgICAgQmJzLnB1c2hfYmFjayggQi0+dHJhdmVyc2UoVnMsIFZzLnN1YkV4cHJDdHgoQ3R4KSkgKTsKKyAgICB9CisgICAgVnMuZXhpdENGRygqdGhpcyk7CisgICAgcmV0dXJuIFZzLnJlZHVjZVNDRkcoKnRoaXMsIEJicyk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KKyAgdHlwZW5hbWUgQzo6Q1R5cGUgY29tcGFyZShjb25zdCBTQ0ZHICpFLCBDICZDbXApIGNvbnN0IHsKKyAgICAvLyBUT0RPOiBpbXBsZW1lbnQgQ0ZHIGNvbXBhcmlzb25zCisgICAgcmV0dXJuIENtcC5jb21wYXJlUG9pbnRlcnModGhpcywgRSk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gYXNzaWduIHVuaXF1ZSBpZHMgdG8gYWxsIGluc3RydWN0aW9ucworICB2b2lkIHJlbnVtYmVySW5zdHJzKCk7CisKKyAgTWVtUmVnaW9uUmVmIEFyZW5hOworICBCbG9ja0FycmF5IEJsb2NrczsKKyAgQmFzaWNCbG9jayAqRW50cnkgPSBudWxscHRyOworICBCYXNpY0Jsb2NrICpFeGl0ID0gbnVsbHB0cjsKKyAgdW5zaWduZWQgTnVtSW5zdHJ1Y3Rpb25zID0gMDsKKyAgYm9vbCBOb3JtYWwgPSBmYWxzZTsKK307CisKKy8vLyBBbiBpZGVudGlmaWVyLCBlLmcuICdmb28nIG9yICd4Jy4KKy8vLyBUaGlzIGlzIGEgcHNlZHVvLXRlcm07IGl0IHdpbGwgYmUgbG93ZXJlZCB0byBhIHZhcmlhYmxlIG9yIHByb2plY3Rpb24uCitjbGFzcyBJZGVudGlmaWVyIDogcHVibGljIFNFeHByIHsKK3B1YmxpYzoKKyAgSWRlbnRpZmllcihTdHJpbmdSZWYgSWQpOiBTRXhwcihDT1BfSWRlbnRpZmllciksIE5hbWUoSWQpIHt9CisgIElkZW50aWZpZXIoY29uc3QgSWRlbnRpZmllciAmKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRXhwciAqRSkgeyByZXR1cm4gRS0+b3Bjb2RlKCkgPT0gQ09QX0lkZW50aWZpZXI7IH0KKworICBTdHJpbmdSZWYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVj4KKyAgdHlwZW5hbWUgVjo6Ul9TRXhwciB0cmF2ZXJzZShWICZWcywgdHlwZW5hbWUgVjo6Ul9DdHggQ3R4KSB7CisgICAgcmV0dXJuIFZzLnJlZHVjZUlkZW50aWZpZXIoKnRoaXMpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIEM+CisgIHR5cGVuYW1lIEM6OkNUeXBlIGNvbXBhcmUoY29uc3QgSWRlbnRpZmllciogRSwgQyYgQ21wKSBjb25zdCB7CisgICAgcmV0dXJuIENtcC5jb21wYXJlU3RyaW5ncyhuYW1lKCksIEUtPm5hbWUoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgU3RyaW5nUmVmIE5hbWU7Cit9OworCisvLy8gQW4gaWYtdGhlbi1lbHNlIGV4cHJlc3Npb24uCisvLy8gVGhpcyBpcyBhIHBzZWR1by10ZXJtOyBpdCB3aWxsIGJlIGxvd2VyZWQgdG8gYSBicmFuY2ggaW4gYSBDRkcuCitjbGFzcyBJZlRoZW5FbHNlIDogcHVibGljIFNFeHByIHsKK3B1YmxpYzoKKyAgSWZUaGVuRWxzZShTRXhwciAqQywgU0V4cHIgKlQsIFNFeHByICpFKQorICAgICAgOiBTRXhwcihDT1BfSWZUaGVuRWxzZSksIENvbmRpdGlvbihDKSwgVGhlbkV4cHIoVCksIEVsc2VFeHByKEUpIHt9CisgIElmVGhlbkVsc2UoY29uc3QgSWZUaGVuRWxzZSAmSSwgU0V4cHIgKkMsIFNFeHByICpULCBTRXhwciAqRSkKKyAgICAgIDogU0V4cHIoSSksIENvbmRpdGlvbihDKSwgVGhlbkV4cHIoVCksIEVsc2VFeHByKEUpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRXhwciAqRSkgeyByZXR1cm4gRS0+b3Bjb2RlKCkgPT0gQ09QX0lmVGhlbkVsc2U7IH0KKworICBTRXhwciAqY29uZGl0aW9uKCkgeyByZXR1cm4gQ29uZGl0aW9uOyB9ICAgLy8gQWRkcmVzcyB0byBzdG9yZSB0bworICBjb25zdCBTRXhwciAqY29uZGl0aW9uKCkgY29uc3QgeyByZXR1cm4gQ29uZGl0aW9uOyB9CisKKyAgU0V4cHIgKnRoZW5FeHByKCkgeyByZXR1cm4gVGhlbkV4cHI7IH0gICAgIC8vIFZhbHVlIHRvIHN0b3JlCisgIGNvbnN0IFNFeHByICp0aGVuRXhwcigpIGNvbnN0IHsgcmV0dXJuIFRoZW5FeHByOyB9CisKKyAgU0V4cHIgKmVsc2VFeHByKCkgeyByZXR1cm4gRWxzZUV4cHI7IH0gICAgIC8vIFZhbHVlIHRvIHN0b3JlCisgIGNvbnN0IFNFeHByICplbHNlRXhwcigpIGNvbnN0IHsgcmV0dXJuIEVsc2VFeHByOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFY+CisgIHR5cGVuYW1lIFY6OlJfU0V4cHIgdHJhdmVyc2UoViAmVnMsIHR5cGVuYW1lIFY6OlJfQ3R4IEN0eCkgeworICAgIGF1dG8gTmMgPSBWcy50cmF2ZXJzZShDb25kaXRpb24sIFZzLnN1YkV4cHJDdHgoQ3R4KSk7CisgICAgYXV0byBOdCA9IFZzLnRyYXZlcnNlKFRoZW5FeHByLCAgVnMuc3ViRXhwckN0eChDdHgpKTsKKyAgICBhdXRvIE5lID0gVnMudHJhdmVyc2UoRWxzZUV4cHIsICBWcy5zdWJFeHByQ3R4KEN0eCkpOworICAgIHJldHVybiBWcy5yZWR1Y2VJZlRoZW5FbHNlKCp0aGlzLCBOYywgTnQsIE5lKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDPgorICB0eXBlbmFtZSBDOjpDVHlwZSBjb21wYXJlKGNvbnN0IElmVGhlbkVsc2UqIEUsIEMmIENtcCkgY29uc3QgeworICAgIHR5cGVuYW1lIEM6OkNUeXBlIEN0ID0gQ21wLmNvbXBhcmUoY29uZGl0aW9uKCksIEUtPmNvbmRpdGlvbigpKTsKKyAgICBpZiAoQ21wLm5vdFRydWUoQ3QpKQorICAgICAgcmV0dXJuIEN0OworICAgIEN0ID0gQ21wLmNvbXBhcmUodGhlbkV4cHIoKSwgRS0+dGhlbkV4cHIoKSk7CisgICAgaWYgKENtcC5ub3RUcnVlKEN0KSkKKyAgICAgIHJldHVybiBDdDsKKyAgICByZXR1cm4gQ21wLmNvbXBhcmUoZWxzZUV4cHIoKSwgRS0+ZWxzZUV4cHIoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgU0V4cHIqIENvbmRpdGlvbjsKKyAgU0V4cHIqIFRoZW5FeHByOworICBTRXhwciogRWxzZUV4cHI7Cit9OworCisvLy8gQSBsZXQtZXhwcmVzc2lvbiwgIGUuZy4gIGxldCB4PXQ7IHUuCisvLy8gVGhpcyBpcyBhIHBzZWR1by10ZXJtOyBpdCB3aWxsIGJlIGxvd2VyZWQgdG8gaW5zdHJ1Y3Rpb25zIGluIGEgQ0ZHLgorY2xhc3MgTGV0IDogcHVibGljIFNFeHByIHsKK3B1YmxpYzoKKyAgTGV0KFZhcmlhYmxlICpWZCwgU0V4cHIgKkJkKSA6IFNFeHByKENPUF9MZXQpLCBWYXJEZWNsKFZkKSwgQm9keShCZCkgeworICAgIFZkLT5zZXRLaW5kKFZhcmlhYmxlOjpWS19MZXQpOworICB9CisKKyAgTGV0KGNvbnN0IExldCAmTCwgVmFyaWFibGUgKlZkLCBTRXhwciAqQmQpIDogU0V4cHIoTCksIFZhckRlY2woVmQpLCBCb2R5KEJkKSB7CisgICAgVmQtPnNldEtpbmQoVmFyaWFibGU6OlZLX0xldCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNFeHByICpFKSB7IHJldHVybiBFLT5vcGNvZGUoKSA9PSBDT1BfTGV0OyB9CisKKyAgVmFyaWFibGUgKnZhcmlhYmxlRGVjbCgpICB7IHJldHVybiBWYXJEZWNsOyB9CisgIGNvbnN0IFZhcmlhYmxlICp2YXJpYWJsZURlY2woKSBjb25zdCB7IHJldHVybiBWYXJEZWNsOyB9CisKKyAgU0V4cHIgKmJvZHkoKSB7IHJldHVybiBCb2R5OyB9CisgIGNvbnN0IFNFeHByICpib2R5KCkgY29uc3QgeyByZXR1cm4gQm9keTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBWPgorICB0eXBlbmFtZSBWOjpSX1NFeHByIHRyYXZlcnNlKFYgJlZzLCB0eXBlbmFtZSBWOjpSX0N0eCBDdHgpIHsKKyAgICAvLyBUaGlzIGlzIGEgdmFyaWFibGUgZGVjbGFyYXRpb24sIHNvIHRyYXZlcnNlIHRoZSBkZWZpbml0aW9uLgorICAgIGF1dG8gRTAgPSBWcy50cmF2ZXJzZShWYXJEZWNsLT5EZWZpbml0aW9uLCBWcy5zdWJFeHByQ3R4KEN0eCkpOworICAgIC8vIFRlbGwgdGhlIHJld3JpdGVyIHRvIGVudGVyIHRoZSBzY29wZSBvZiB0aGUgbGV0IHZhcmlhYmxlLgorICAgIFZhcmlhYmxlICpOdmQgPSBWcy5lbnRlclNjb3BlKCpWYXJEZWNsLCBFMCk7CisgICAgYXV0byBFMSA9IFZzLnRyYXZlcnNlKEJvZHksIEN0eCk7CisgICAgVnMuZXhpdFNjb3BlKCpWYXJEZWNsKTsKKyAgICByZXR1cm4gVnMucmVkdWNlTGV0KCp0aGlzLCBOdmQsIEUxKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDPgorICB0eXBlbmFtZSBDOjpDVHlwZSBjb21wYXJlKGNvbnN0IExldCogRSwgQyYgQ21wKSBjb25zdCB7CisgICAgdHlwZW5hbWUgQzo6Q1R5cGUgQ3QgPQorICAgICAgQ21wLmNvbXBhcmUoVmFyRGVjbC0+ZGVmaW5pdGlvbigpLCBFLT5WYXJEZWNsLT5kZWZpbml0aW9uKCkpOworICAgIGlmIChDbXAubm90VHJ1ZShDdCkpCisgICAgICByZXR1cm4gQ3Q7CisgICAgQ21wLmVudGVyU2NvcGUodmFyaWFibGVEZWNsKCksIEUtPnZhcmlhYmxlRGVjbCgpKTsKKyAgICBDdCA9IENtcC5jb21wYXJlKGJvZHkoKSwgRS0+Ym9keSgpKTsKKyAgICBDbXAubGVhdmVTY29wZSgpOworICAgIHJldHVybiBDdDsKKyAgfQorCitwcml2YXRlOgorICBWYXJpYWJsZSAqVmFyRGVjbDsKKyAgU0V4cHIqIEJvZHk7Cit9OworCitjb25zdCBTRXhwciAqZ2V0Q2Fub25pY2FsVmFsKGNvbnN0IFNFeHByICpFKTsKK1NFeHByKiBzaW1wbGlmeVRvQ2Fub25pY2FsVmFsKFNFeHByICpFKTsKK3ZvaWQgc2ltcGxpZnlJbmNvbXBsZXRlQXJnKHRpbDo6UGhpICpQaCk7CisKK30gLy8gbmFtZXNwYWNlIHRpbAorfSAvLyBuYW1lc3BhY2UgdGhyZWFkU2FmZXR5CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FOQUxZU0lTX0FOQUxZU0VTX1RIUkVBRFNBRkVUWVRJTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9UaHJlYWRTYWZldHlUcmF2ZXJzZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvVGhyZWFkU2FmZXR5VHJhdmVyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGU2MjA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvVGhyZWFkU2FmZXR5VHJhdmVyc2UuaApAQCAtMCwwICsxLDkxMyBAQAorLy89PT0tIFRocmVhZFNhZmV0eVRyYXZlcnNlLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIGZyYW1ld29yayBmb3IgZG9pbmcgZ2VuZXJpYyB0cmF2ZXJzYWxzIGFuZCByZXdyaXRpbmcKKy8vIG9wZXJhdGlvbnMgb3ZlciB0aGUgVGhyZWFkIFNhZmV0eSBUSUwuCisvLworLy8gVU5ERVIgQ09OU1RSVUNUSU9OLiAgVVNFIEFUIFlPVVIgT1dOIFJJU0suCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FOQUxZU0lTX0FOQUxZU0VTX1RIUkVBRFNBRkVUWVRSQVZFUlNFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BTkFMWVNJU19BTkFMWVNFU19USFJFQURTQUZFVFlUUkFWRVJTRV9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgorI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL1RocmVhZFNhZmV0eVRJTC5oIgorI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL1RocmVhZFNhZmV0eVV0aWwuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG9zdHJlYW0+CisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgdGhyZWFkU2FmZXR5IHsKK25hbWVzcGFjZSB0aWwgeworCisvLyBEZWZpbmVzIGFuIGludGVyZmFjZSB1c2VkIHRvIHRyYXZlcnNlIFNFeHBycy4gIFRyYXZlcnNhbHMgaGF2ZSBiZWVuIG1hZGUgYXMKKy8vIGdlbmVyaWMgYXMgcG9zc2libGUsIGFuZCBhcmUgaW50ZW5kZWQgdG8gaGFuZGxlIGFueSBraW5kIG9mIHBhc3Mgb3ZlciB0aGUKKy8vIEFTVCwgZS5nLiB2aXNpdGVycywgY29weWluZywgbm9uLWRlc3RydWN0aXZlIHJld3JpdGluZywgZGVzdHJ1Y3RpdmUKKy8vIChpbi1wbGFjZSkgcmV3cml0aW5nLCBoYXNoaW5nLCB0eXBpbmcsIGV0Yy4KKy8vCisvLyBUcmF2ZXJzYWxzIGltcGxlbWVudCB0aGUgZnVuY3Rpb25hbCBub3Rpb24gb2YgYSAiZm9sZCIgb3BlcmF0aW9uIG9uIFNFeHBycy4KKy8vIEVhY2ggU0V4cHIgY2xhc3MgcHJvdmlkZXMgYSB0cmF2ZXJzZSBtZXRob2QsIHdoaWNoIGRvZXMgdGhlIGZvbGxvd2luZzoKKy8vICAgKiBlLT50cmF2ZXJzZSh2KToKKy8vICAgICAgIC8vIGNvbXB1dGUgYSByZXN1bHQgcl9pIGZvciBlYWNoIHN1YmV4cHJlc3Npb24gZV9pCisvLyAgICAgICBmb3IgKGkgPSAxLi5uKSAgcl9pID0gdi50cmF2ZXJzZShlX2kpOworLy8gICAgICAgLy8gY29tYmluZSByZXN1bHRzIGludG8gYSByZXN1bHQgZm9yIGUsICB3aGVyZSBYIGlzIHRoZSBjbGFzcyBvZiBlCisvLyAgICAgICByZXR1cm4gdi5yZWR1Y2VYKCplLCByXzEsIC4uIHJfbikuCisvLworLy8gQSB2aXNpdG9yIGNhbiBjb250cm9sIHRoZSB0cmF2ZXJzYWwgYnkgb3ZlcnJpZGluZyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisvLyAgICogdi50cmF2ZXJzZShlKToKKy8vICAgICAgIHJldHVybiB2LnRyYXZlcnNlQnlDYXNlKGUpLCB3aGljaCByZXR1cm5zIHYudHJhdmVyc2VYKGUpCisvLyAgICogdi50cmF2ZXJzZVgoZSk6ICAgKFggaXMgdGhlIGNsYXNzIG9mIGUpCisvLyAgICAgICByZXR1cm4gZS0+dHJhdmVyc2UodikuCisvLyAgICogdi5yZWR1Y2VYKCplLCByXzEsIC4uIHJfbik6CisvLyAgICAgICBjb21wdXRlIGEgcmVzdWx0IGZvciBhIG5vZGUgb2YgdHlwZSBYCisvLworLy8gVGhlIHJlZHVjZVggbWV0aG9kcyBjb250cm9sIHRoZSBraW5kIG9mIHRyYXZlcnNhbCAodmlzaXRvciwgY29weSwgZXRjLikuCisvLyBUaGV5IGFyZSBkZWZpbmVkIGluIGRlcml2ZWQgY2xhc3Nlcy4KKy8vCisvLyBDbGFzcyBSIGRlZmluZXMgdGhlIGJhc2ljIGludGVyZmFjZSB0eXBlcyAoUl9TRXhwcikuCit0ZW1wbGF0ZSA8Y2xhc3MgU2VsZiwgY2xhc3MgUj4KK2NsYXNzIFRyYXZlcnNhbCB7CitwdWJsaWM6CisgIFNlbGYgKnNlbGYoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxTZWxmICo+KHRoaXMpOyB9CisKKyAgLy8gVHJhdmVyc2UgYW4gZXhwcmVzc2lvbiAtLSByZXR1cm5pbmcgYSByZXN1bHQgb2YgdHlwZSBSX1NFeHByLgorICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBkbyBzb21ldGhpbmcgZm9yIGV2ZXJ5IGV4cHJlc3Npb24sIHJlZ2FyZGxlc3MKKyAgLy8gb2Ygd2hpY2gga2luZCBpdCBpcy4KKyAgLy8gRSBpcyBhIHJlZmVyZW5jZSwgc28gdGhpcyBjYW4gYmUgdXNlIGZvciBpbi1wbGFjZSB1cGRhdGVzLgorICAvLyBUaGUgdHlwZSBUIG11c3QgYmUgYSBzdWJjbGFzcyBvZiBTRXhwci4KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHR5cGVuYW1lIFI6OlJfU0V4cHIgdHJhdmVyc2UoVCogJkUsIHR5cGVuYW1lIFI6OlJfQ3R4IEN0eCkgeworICAgIHJldHVybiB0cmF2ZXJzZVNFeHByKEUsIEN0eCk7CisgIH0KKworICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBkbyBzb21ldGhpbmcgZm9yIGV2ZXJ5IGV4cHJlc3Npb24uCisgIC8vIERvZXMgbm90IGFsbG93IGluLXBsYWNlIHVwZGF0ZXMuCisgIHR5cGVuYW1lIFI6OlJfU0V4cHIgdHJhdmVyc2VTRXhwcihTRXhwciAqRSwgdHlwZW5hbWUgUjo6Ul9DdHggQ3R4KSB7CisgICAgcmV0dXJuIHRyYXZlcnNlQnlDYXNlKEUsIEN0eCk7CisgIH0KKworICAvLyBIZWxwZXIgbWV0aG9kIHRvIGNhbGwgdHJhdmVyc2VYKGUpIG9uIHRoZSBhcHByb3ByaWF0ZSB0eXBlLgorICB0eXBlbmFtZSBSOjpSX1NFeHByIHRyYXZlcnNlQnlDYXNlKFNFeHByICpFLCB0eXBlbmFtZSBSOjpSX0N0eCBDdHgpIHsKKyAgICBzd2l0Y2ggKEUtPm9wY29kZSgpKSB7CisjZGVmaW5lIFRJTF9PUENPREVfREVGKFgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgQ09QXyMjWDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBzZWxmKCktPnRyYXZlcnNlIyNYKGNhc3Q8WD4oRSksIEN0eCk7CisjaW5jbHVkZSAiVGhyZWFkU2FmZXR5T3BzLmRlZiIKKyN1bmRlZiBUSUxfT1BDT0RFX0RFRgorICAgIH0KKyAgICByZXR1cm4gc2VsZigpLT5yZWR1Y2VOdWxsKCk7CisgIH0KKworLy8gVHJhdmVyc2UgZSwgYnkgc3RhdGljIGRpc3BhdGNoIG9uIHRoZSB0eXBlICJYIiBvZiBlLgorLy8gT3ZlcnJpZGUgdGhlc2UgbWV0aG9kcyB0byBkbyBzb21ldGhpbmcgZm9yIGEgcGFydGljdWxhciBraW5kIG9mIHRlcm0uCisjZGVmaW5lIFRJTF9PUENPREVfREVGKFgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlbmFtZSBSOjpSX1NFeHByIHRyYXZlcnNlIyNYKFggKmUsIHR5cGVuYW1lIFI6OlJfQ3R4IEN0eCkgeyAgICAgICAgICAgIFwKKyAgICByZXR1cm4gZS0+dHJhdmVyc2UoKnNlbGYoKSwgQ3R4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNpbmNsdWRlICJUaHJlYWRTYWZldHlPcHMuZGVmIgorI3VuZGVmIFRJTF9PUENPREVfREVGCit9OworCisvLyBCYXNlIGNsYXNzIGZvciBzaW1wbGUgcmVkdWNlcnMgdGhhdCBkb24ndCBtdWNoIGNhcmUgYWJvdXQgdGhlIGNvbnRleHQuCitjbGFzcyBTaW1wbGVSZWR1Y2VyQmFzZSB7CitwdWJsaWM6CisgIGVudW0gVHJhdmVyc2FsS2luZCB7CisgICAgLy8gT3JkaW5hcnkgc3ViZXhwcmVzc2lvbnMuCisgICAgVFJWX05vcm1hbCwKKworICAgIC8vIERlY2xhcmF0aW9ucyAoZS5nLiBmdW5jdGlvbiBib2RpZXMpLgorICAgIFRSVl9EZWNsLAorCisgICAgLy8gRXhwcmVzc2lvbnMgdGhhdCByZXF1aXJlIGxhenkgZXZhbHVhdGlvbi4KKyAgICBUUlZfTGF6eSwKKworICAgIC8vIFR5cGUgZXhwcmVzc2lvbnMuCisgICAgVFJWX1R5cGUKKyAgfTsKKworICAvLyBSX0N0eCBkZWZpbmVzIGEgImNvbnRleHQiIGZvciB0aGUgdHJhdmVyc2FsLCB3aGljaCBlbmNvZGVzIGluZm9ybWF0aW9uCisgIC8vIGFib3V0IHdoZXJlIGEgdGVybSBhcHBlYXJzLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBlbmNvZGluZyB0aGUKKyAgLy8gImN1cnJlbnQgY29udGludWF0aW9uIiBmb3IgQ1BTIHRyYW5zZm9ybXMsIG9yIG90aGVyIGluZm9ybWF0aW9uLgorICB1c2luZyBSX0N0eCA9IFRyYXZlcnNhbEtpbmQ7CisKKyAgLy8gQ3JlYXRlIGNvbnRleHQgZm9yIGFuIG9yZGluYXJ5IHN1YmV4cHJlc3Npb24uCisgIFJfQ3R4IHN1YkV4cHJDdHgoUl9DdHggQ3R4KSB7IHJldHVybiBUUlZfTm9ybWFsOyB9CisKKyAgLy8gQ3JlYXRlIGNvbnRleHQgZm9yIGEgc3ViZXhwcmVzc2lvbiB0aGF0IG9jY3VycyBpbiBhIGRlY2xhcmF0aW9uIHBvc2l0aW9uCisgIC8vIChlLmcuIGZ1bmN0aW9uIGJvZHkpLgorICBSX0N0eCBkZWNsQ3R4KFJfQ3R4IEN0eCkgeyByZXR1cm4gVFJWX0RlY2w7IH0KKworICAvLyBDcmVhdGUgY29udGV4dCBmb3IgYSBzdWJleHByZXNzaW9uIHRoYXQgb2NjdXJzIGluIGEgcG9zaXRpb24gdGhhdAorICAvLyBzaG91bGQgYmUgcmVkdWNlZCBsYXppbHkuICAoZS5nLiBjb2RlIGJvZHkpLgorICBSX0N0eCBsYXp5Q3R4KFJfQ3R4IEN0eCkgeyByZXR1cm4gVFJWX0xhenk7IH0KKworICAvLyBDcmVhdGUgY29udGV4dCBmb3IgYSBzdWJleHByZXNzaW9uIHRoYXQgb2NjdXJzIGluIGEgdHlwZSBwb3NpdGlvbi4KKyAgUl9DdHggdHlwZUN0eChSX0N0eCBDdHgpIHsgcmV0dXJuIFRSVl9UeXBlOyB9Cit9OworCisvLyBCYXNlIGNsYXNzIGZvciB0cmF2ZXJzYWxzIHRoYXQgcmV3cml0ZSBhbiBTRXhwciB0byBhbm90aGVyIFNFeHByLgorY2xhc3MgQ29weVJlZHVjZXJCYXNlIDogcHVibGljIFNpbXBsZVJlZHVjZXJCYXNlIHsKK3B1YmxpYzoKKyAgLy8gUl9TRXhwciBpcyB0aGUgcmVzdWx0IHR5cGUgZm9yIGEgdHJhdmVyc2FsLgorICAvLyBBIGNvcHkgb3Igbm9uLWRlc3RydWN0aXZlIHJld3JpdGUgcmV0dXJucyBhIG5ld2x5IGFsbG9jYXRlZCB0ZXJtLgorICB1c2luZyBSX1NFeHByID0gU0V4cHIgKjsKKyAgdXNpbmcgUl9CYXNpY0Jsb2NrID0gQmFzaWNCbG9jayAqOworCisgIC8vIENvbnRhaW5lciBpcyBhIG1pbmltYWwgaW50ZXJmYWNlIHVzZWQgdG8gc3RvcmUgcmVzdWx0cyB3aGVuIHRyYXZlcnNpbmcKKyAgLy8gU0V4cHJzIG9mIHZhcmlhYmxlIGFyaXR5LCBzdWNoIGFzIFBoaSwgR290bywgYW5kIFNDRkcuCisgIHRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBDb250YWluZXIgeworICBwdWJsaWM6CisgICAgLy8gQWxsb2NhdGUgYSBuZXcgY29udGFpbmVyIHdpdGggYSBjYXBhY2l0eSBmb3IgbiBlbGVtZW50cy4KKyAgICBDb250YWluZXIoQ29weVJlZHVjZXJCYXNlICZTLCB1bnNpZ25lZCBOKSA6IEVsZW1zKFMuQXJlbmEsIE4pIHt9CisKKyAgICAvLyBQdXNoIGEgbmV3IGVsZW1lbnQgb250byB0aGUgY29udGFpbmVyLgorICAgIHZvaWQgcHVzaF9iYWNrKFQgRSkgeyBFbGVtcy5wdXNoX2JhY2soRSk7IH0KKworICAgIFNpbXBsZUFycmF5PFQ+IEVsZW1zOworICB9OworCisgIENvcHlSZWR1Y2VyQmFzZShNZW1SZWdpb25SZWYgQSkgOiBBcmVuYShBKSB7fQorCitwcm90ZWN0ZWQ6CisgIE1lbVJlZ2lvblJlZiBBcmVuYTsKK307CisKKy8vIEJhc2UgY2xhc3MgZm9yIHZpc2l0IHRyYXZlcnNhbHMuCitjbGFzcyBWaXNpdFJlZHVjZXJCYXNlIDogcHVibGljIFNpbXBsZVJlZHVjZXJCYXNlIHsKK3B1YmxpYzoKKyAgLy8gQSB2aXNpdG9yIHJldHVybnMgYSBib29sLCByZXByZXNlbnRpbmcgc3VjY2VzcyBvciBmYWlsdXJlLgorICB1c2luZyBSX1NFeHByID0gYm9vbDsKKyAgdXNpbmcgUl9CYXNpY0Jsb2NrID0gYm9vbDsKKworICAvLyBBIHZpc2l0b3IgImNvbnRhaW5lciIgaXMgYSBzaW5nbGUgYm9vbCwgd2hpY2ggYWNjdW11bGF0ZXMgc3VjY2Vzcy4KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIENvbnRhaW5lciB7CisgIHB1YmxpYzoKKyAgICBib29sIFN1Y2Nlc3MgPSB0cnVlOworCisgICAgQ29udGFpbmVyKFZpc2l0UmVkdWNlckJhc2UgJlMsIHVuc2lnbmVkIE4pIHt9CisKKyAgICB2b2lkIHB1c2hfYmFjayhib29sIEUpIHsgU3VjY2VzcyA9IFN1Y2Nlc3MgJiYgRTsgfQorICB9OworfTsKKworLy8gSW1wbGVtZW50cyBhIHRyYXZlcnNhbCB0aGF0IHZpc2l0cyBlYWNoIHN1YmV4cHJlc3Npb24sIGFuZCByZXR1cm5zIGVpdGhlcgorLy8gdHJ1ZSBvciBmYWxzZS4KK3RlbXBsYXRlIDxjbGFzcyBTZWxmPgorY2xhc3MgVmlzaXRSZWR1Y2VyIDogcHVibGljIFRyYXZlcnNhbDxTZWxmLCBWaXNpdFJlZHVjZXJCYXNlPiwKKyAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBWaXNpdFJlZHVjZXJCYXNlIHsKK3B1YmxpYzoKKyAgVmlzaXRSZWR1Y2VyKCkgPSBkZWZhdWx0OworCitwdWJsaWM6CisgIFJfU0V4cHIgcmVkdWNlTnVsbCgpIHsgcmV0dXJuIHRydWU7IH0KKyAgUl9TRXhwciByZWR1Y2VVbmRlZmluZWQoVW5kZWZpbmVkICZPcmlnKSB7IHJldHVybiB0cnVlOyB9CisgIFJfU0V4cHIgcmVkdWNlV2lsZGNhcmQoV2lsZGNhcmQgJk9yaWcpIHsgcmV0dXJuIHRydWU7IH0KKworICBSX1NFeHByIHJlZHVjZUxpdGVyYWwoTGl0ZXJhbCAmT3JpZykgeyByZXR1cm4gdHJ1ZTsgfQorICB0ZW1wbGF0ZTxjbGFzcyBUPgorICBSX1NFeHByIHJlZHVjZUxpdGVyYWxUKExpdGVyYWxUPFQ+ICZPcmlnKSB7IHJldHVybiB0cnVlOyB9CisgIFJfU0V4cHIgcmVkdWNlTGl0ZXJhbFB0cihMaXRlcmFsICZPcmlnKSB7IHJldHVybiB0cnVlOyB9CisKKyAgUl9TRXhwciByZWR1Y2VGdW5jdGlvbihGdW5jdGlvbiAmT3JpZywgVmFyaWFibGUgKk52ZCwgUl9TRXhwciBFMCkgeworICAgIHJldHVybiBOdmQgJiYgRTA7CisgIH0KKworICBSX1NFeHByIHJlZHVjZVNGdW5jdGlvbihTRnVuY3Rpb24gJk9yaWcsIFZhcmlhYmxlICpOdmQsIFJfU0V4cHIgRTApIHsKKyAgICByZXR1cm4gTnZkICYmIEUwOworICB9CisKKyAgUl9TRXhwciByZWR1Y2VDb2RlKENvZGUgJk9yaWcsIFJfU0V4cHIgRTAsIFJfU0V4cHIgRTEpIHsKKyAgICByZXR1cm4gRTAgJiYgRTE7CisgIH0KKworICBSX1NFeHByIHJlZHVjZUZpZWxkKEZpZWxkICZPcmlnLCBSX1NFeHByIEUwLCBSX1NFeHByIEUxKSB7CisgICAgcmV0dXJuIEUwICYmIEUxOworICB9CisKKyAgUl9TRXhwciByZWR1Y2VBcHBseShBcHBseSAmT3JpZywgUl9TRXhwciBFMCwgUl9TRXhwciBFMSkgeworICAgIHJldHVybiBFMCAmJiBFMTsKKyAgfQorCisgIFJfU0V4cHIgcmVkdWNlU0FwcGx5KFNBcHBseSAmT3JpZywgUl9TRXhwciBFMCwgUl9TRXhwciBFMSkgeworICAgIHJldHVybiBFMCAmJiBFMTsKKyAgfQorCisgIFJfU0V4cHIgcmVkdWNlUHJvamVjdChQcm9qZWN0ICZPcmlnLCBSX1NFeHByIEUwKSB7IHJldHVybiBFMDsgfQorICBSX1NFeHByIHJlZHVjZUNhbGwoQ2FsbCAmT3JpZywgUl9TRXhwciBFMCkgeyByZXR1cm4gRTA7IH0KKyAgUl9TRXhwciByZWR1Y2VBbGxvYyhBbGxvYyAmT3JpZywgUl9TRXhwciBFMCkgeyByZXR1cm4gRTA7IH0KKyAgUl9TRXhwciByZWR1Y2VMb2FkKExvYWQgJk9yaWcsIFJfU0V4cHIgRTApIHsgcmV0dXJuIEUwOyB9CisgIFJfU0V4cHIgcmVkdWNlU3RvcmUoU3RvcmUgJk9yaWcsIFJfU0V4cHIgRTAsIFJfU0V4cHIgRTEpIHsgcmV0dXJuIEUwICYmIEUxOyB9CisKKyAgUl9TRXhwciByZWR1Y2VBcnJheUluZGV4KFN0b3JlICZPcmlnLCBSX1NFeHByIEUwLCBSX1NFeHByIEUxKSB7CisgICAgcmV0dXJuIEUwICYmIEUxOworICB9CisKKyAgUl9TRXhwciByZWR1Y2VBcnJheUFkZChTdG9yZSAmT3JpZywgUl9TRXhwciBFMCwgUl9TRXhwciBFMSkgeworICAgIHJldHVybiBFMCAmJiBFMTsKKyAgfQorCisgIFJfU0V4cHIgcmVkdWNlVW5hcnlPcChVbmFyeU9wICZPcmlnLCBSX1NFeHByIEUwKSB7IHJldHVybiBFMDsgfQorCisgIFJfU0V4cHIgcmVkdWNlQmluYXJ5T3AoQmluYXJ5T3AgJk9yaWcsIFJfU0V4cHIgRTAsIFJfU0V4cHIgRTEpIHsKKyAgICByZXR1cm4gRTAgJiYgRTE7CisgIH0KKworICBSX1NFeHByIHJlZHVjZUNhc3QoQ2FzdCAmT3JpZywgUl9TRXhwciBFMCkgeyByZXR1cm4gRTA7IH0KKworICBSX1NFeHByIHJlZHVjZVNDRkcoU0NGRyAmT3JpZywgQ29udGFpbmVyPEJhc2ljQmxvY2sgKj4gQmJzKSB7CisgICAgcmV0dXJuIEJicy5TdWNjZXNzOworICB9CisKKyAgUl9CYXNpY0Jsb2NrIHJlZHVjZUJhc2ljQmxvY2soQmFzaWNCbG9jayAmT3JpZywgQ29udGFpbmVyPFJfU0V4cHI+ICZBcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyPFJfU0V4cHI+ICZJcywgUl9TRXhwciBUKSB7CisgICAgcmV0dXJuIChBcy5TdWNjZXNzICYmIElzLlN1Y2Nlc3MgJiYgVCk7CisgIH0KKworICBSX1NFeHByIHJlZHVjZVBoaShQaGkgJk9yaWcsIENvbnRhaW5lcjxSX1NFeHByPiAmQXMpIHsKKyAgICByZXR1cm4gQXMuU3VjY2VzczsKKyAgfQorCisgIFJfU0V4cHIgcmVkdWNlR290byhHb3RvICZPcmlnLCBCYXNpY0Jsb2NrICpCKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBSX1NFeHByIHJlZHVjZUJyYW5jaChCcmFuY2ggJk8sIFJfU0V4cHIgQywgQmFzaWNCbG9jayAqQjAsIEJhc2ljQmxvY2sgKkIxKSB7CisgICAgcmV0dXJuIEM7CisgIH0KKworICBSX1NFeHByIHJlZHVjZVJldHVybihSZXR1cm4gJk8sIFJfU0V4cHIgRSkgeworICAgIHJldHVybiBFOworICB9CisKKyAgUl9TRXhwciByZWR1Y2VJZGVudGlmaWVyKElkZW50aWZpZXIgJk9yaWcpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIFJfU0V4cHIgcmVkdWNlSWZUaGVuRWxzZShJZlRoZW5FbHNlICZPcmlnLCBSX1NFeHByIEMsIFJfU0V4cHIgVCwgUl9TRXhwciBFKSB7CisgICAgcmV0dXJuIEMgJiYgVCAmJiBFOworICB9CisKKyAgUl9TRXhwciByZWR1Y2VMZXQoTGV0ICZPcmlnLCBWYXJpYWJsZSAqTnZkLCBSX1NFeHByIEIpIHsKKyAgICByZXR1cm4gTnZkICYmIEI7CisgIH0KKworICBWYXJpYWJsZSAqZW50ZXJTY29wZShWYXJpYWJsZSAmT3JpZywgUl9TRXhwciBFMCkgeyByZXR1cm4gJk9yaWc7IH0KKyAgdm9pZCBleGl0U2NvcGUoY29uc3QgVmFyaWFibGUgJk9yaWcpIHt9CisgIHZvaWQgZW50ZXJDRkcoU0NGRyAmQ2ZnKSB7fQorICB2b2lkIGV4aXRDRkcoU0NGRyAmQ2ZnKSB7fQorICB2b2lkIGVudGVyQmFzaWNCbG9jayhCYXNpY0Jsb2NrICZCQikge30KKyAgdm9pZCBleGl0QmFzaWNCbG9jayhCYXNpY0Jsb2NrICZCQikge30KKworICBWYXJpYWJsZSAqcmVkdWNlVmFyaWFibGVSZWYoVmFyaWFibGUgKk92ZCkgeyByZXR1cm4gT3ZkOyB9CisgIEJhc2ljQmxvY2sgKnJlZHVjZUJhc2ljQmxvY2tSZWYoQmFzaWNCbG9jayAqT2JiKSB7IHJldHVybiBPYmI7IH0KKworcHVibGljOgorICBib29sIHRyYXZlcnNlKFNFeHByICpFLCBUcmF2ZXJzYWxLaW5kIEsgPSBUUlZfTm9ybWFsKSB7CisgICAgU3VjY2VzcyA9IFN1Y2Nlc3MgJiYgdGhpcy0+dHJhdmVyc2VCeUNhc2UoRSk7CisgICAgcmV0dXJuIFN1Y2Nlc3M7CisgIH0KKworICBzdGF0aWMgYm9vbCB2aXNpdChTRXhwciAqRSkgeworICAgIFNlbGYgVmlzaXRvcjsKKyAgICByZXR1cm4gVmlzaXRvci50cmF2ZXJzZShFLCBUUlZfTm9ybWFsKTsKKyAgfQorCitwcml2YXRlOgorICBib29sIFN1Y2Nlc3M7Cit9OworCisvLyBCYXNpYyBjbGFzcyBmb3IgY29tcGFyaXNvbiBvcGVyYXRpb25zIG92ZXIgZXhwcmVzc2lvbnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VsZj4KK2NsYXNzIENvbXBhcmF0b3IgeworcHJvdGVjdGVkOgorICBTZWxmICpzZWxmKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTZWxmICo+KHRoaXMpOyB9CisKK3B1YmxpYzoKKyAgYm9vbCBjb21wYXJlQnlDYXNlKGNvbnN0IFNFeHByICpFMSwgY29uc3QgU0V4cHIqIEUyKSB7CisgICAgc3dpdGNoIChFMS0+b3Bjb2RlKCkpIHsKKyNkZWZpbmUgVElMX09QQ09ERV9ERUYoWCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIENPUF8jI1g6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBjYXN0PFg+KEUxKS0+Y29tcGFyZShjYXN0PFg+KEUyKSwgKnNlbGYoKSk7CisjaW5jbHVkZSAiVGhyZWFkU2FmZXR5T3BzLmRlZiIKKyN1bmRlZiBUSUxfT1BDT0RFX0RFRgorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK2NsYXNzIEVxdWFsc0NvbXBhcmF0b3IgOiBwdWJsaWMgQ29tcGFyYXRvcjxFcXVhbHNDb21wYXJhdG9yPiB7CitwdWJsaWM6CisgIC8vIFJlc3VsdCB0eXBlIGZvciB0aGUgY29tcGFyaXNvbiwgZS5nLiBib29sIGZvciBzaW1wbGUgZXF1YWxpdHksCisgIC8vIG9yIGludCBmb3IgbGV4aWdyYXBoaWMgY29tcGFyaXNvbiAoLTEsIDAsIDEpLiAgTXVzdCBoYXZlIG9uZSB2YWx1ZSB3aGljaAorICAvLyBkZW5vdGVzICJ0cnVlIi4KKyAgdXNpbmcgQ1R5cGUgPSBib29sOworCisgIENUeXBlIHRydWVSZXN1bHQoKSB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgbm90VHJ1ZShDVHlwZSBjdCkgeyByZXR1cm4gIWN0OyB9CisKKyAgYm9vbCBjb21wYXJlSW50ZWdlcnModW5zaWduZWQgaSwgdW5zaWduZWQgaikgeyByZXR1cm4gaSA9PSBqOyB9CisgIGJvb2wgY29tcGFyZVN0cmluZ3MgKFN0cmluZ1JlZiBzLCBTdHJpbmdSZWYgcikgeyByZXR1cm4gcyA9PSByOyB9CisgIGJvb2wgY29tcGFyZVBvaW50ZXJzKGNvbnN0IHZvaWQqIFAsIGNvbnN0IHZvaWQqIFEpIHsgcmV0dXJuIFAgPT0gUTsgfQorCisgIGJvb2wgY29tcGFyZShjb25zdCBTRXhwciAqRTEsIGNvbnN0IFNFeHByKiBFMikgeworICAgIGlmIChFMS0+b3Bjb2RlKCkgIT0gRTItPm9wY29kZSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBjb21wYXJlQnlDYXNlKEUxLCBFMik7CisgIH0KKworICAvLyBUT0RPIC0tIGhhbmRsZSBhbHBoYS1yZW5hbWluZyBvZiB2YXJpYWJsZXMKKyAgdm9pZCBlbnRlclNjb3BlKGNvbnN0IFZhcmlhYmxlICpWMSwgY29uc3QgVmFyaWFibGUgKlYyKSB7fQorICB2b2lkIGxlYXZlU2NvcGUoKSB7fQorCisgIGJvb2wgY29tcGFyZVZhcmlhYmxlUmVmcyhjb25zdCBWYXJpYWJsZSAqVjEsIGNvbnN0IFZhcmlhYmxlICpWMikgeworICAgIHJldHVybiBWMSA9PSBWMjsKKyAgfQorCisgIHN0YXRpYyBib29sIGNvbXBhcmVFeHBycyhjb25zdCBTRXhwciAqRTEsIGNvbnN0IFNFeHByKiBFMikgeworICAgIEVxdWFsc0NvbXBhcmF0b3IgRXE7CisgICAgcmV0dXJuIEVxLmNvbXBhcmUoRTEsIEUyKTsKKyAgfQorfTsKKworY2xhc3MgTWF0Y2hDb21wYXJhdG9yIDogcHVibGljIENvbXBhcmF0b3I8TWF0Y2hDb21wYXJhdG9yPiB7CitwdWJsaWM6CisgIC8vIFJlc3VsdCB0eXBlIGZvciB0aGUgY29tcGFyaXNvbiwgZS5nLiBib29sIGZvciBzaW1wbGUgZXF1YWxpdHksCisgIC8vIG9yIGludCBmb3IgbGV4aWdyYXBoaWMgY29tcGFyaXNvbiAoLTEsIDAsIDEpLiAgTXVzdCBoYXZlIG9uZSB2YWx1ZSB3aGljaAorICAvLyBkZW5vdGVzICJ0cnVlIi4KKyAgdXNpbmcgQ1R5cGUgPSBib29sOworCisgIENUeXBlIHRydWVSZXN1bHQoKSB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgbm90VHJ1ZShDVHlwZSBjdCkgeyByZXR1cm4gIWN0OyB9CisKKyAgYm9vbCBjb21wYXJlSW50ZWdlcnModW5zaWduZWQgaSwgdW5zaWduZWQgaikgeyByZXR1cm4gaSA9PSBqOyB9CisgIGJvb2wgY29tcGFyZVN0cmluZ3MgKFN0cmluZ1JlZiBzLCBTdHJpbmdSZWYgcikgeyByZXR1cm4gcyA9PSByOyB9CisgIGJvb2wgY29tcGFyZVBvaW50ZXJzKGNvbnN0IHZvaWQgKlAsIGNvbnN0IHZvaWQgKlEpIHsgcmV0dXJuIFAgPT0gUTsgfQorCisgIGJvb2wgY29tcGFyZShjb25zdCBTRXhwciAqRTEsIGNvbnN0IFNFeHByICpFMikgeworICAgIC8vIFdpbGRjYXJkcyBtYXRjaCBhbnl0aGluZy4KKyAgICBpZiAoRTEtPm9wY29kZSgpID09IENPUF9XaWxkY2FyZCB8fCBFMi0+b3Bjb2RlKCkgPT0gQ09QX1dpbGRjYXJkKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gb3RoZXJ3aXNlIG5vcm1hbCBlcXVhbGl0eS4KKyAgICBpZiAoRTEtPm9wY29kZSgpICE9IEUyLT5vcGNvZGUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gY29tcGFyZUJ5Q2FzZShFMSwgRTIpOworICB9CisKKyAgLy8gVE9ETyAtLSBoYW5kbGUgYWxwaGEtcmVuYW1pbmcgb2YgdmFyaWFibGVzCisgIHZvaWQgZW50ZXJTY29wZShjb25zdCBWYXJpYWJsZSogVjEsIGNvbnN0IFZhcmlhYmxlKiBWMikge30KKyAgdm9pZCBsZWF2ZVNjb3BlKCkge30KKworICBib29sIGNvbXBhcmVWYXJpYWJsZVJlZnMoY29uc3QgVmFyaWFibGUqIFYxLCBjb25zdCBWYXJpYWJsZSogVjIpIHsKKyAgICByZXR1cm4gVjEgPT0gVjI7CisgIH0KKworICBzdGF0aWMgYm9vbCBjb21wYXJlRXhwcnMoY29uc3QgU0V4cHIgKkUxLCBjb25zdCBTRXhwciogRTIpIHsKKyAgICBNYXRjaENvbXBhcmF0b3IgTWF0Y2hlcjsKKyAgICByZXR1cm4gTWF0Y2hlci5jb21wYXJlKEUxLCBFMik7CisgIH0KK307CisKKy8vIGlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBTUywgU3RyaW5nUmVmIFIpIHsKKy8vICAgcmV0dXJuIFNTLndyaXRlKFIuZGF0YSgpLCBSLnNpemUoKSk7CisvLyB9CisKKy8vIFByZXR0eSBwcmludGVyIGZvciBUSUwgZXhwcmVzc2lvbnMKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZWxmLCB0eXBlbmFtZSBTdHJlYW1UeXBlPgorY2xhc3MgUHJldHR5UHJpbnRlciB7Citwcml2YXRlOgorICAvLyBQcmludCBvdXQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKyAgYm9vbCBWZXJib3NlOworCisgIC8vIE9taXQgcmVkdW5kYW50IGRlY2xzLgorICBib29sIENsZWFudXA7CisKKyAgLy8gUHJpbnQgZXhwcnMgaW4gQy1saWtlIHN5bnRheC4KKyAgYm9vbCBDU3R5bGU7CisKK3B1YmxpYzoKKyAgUHJldHR5UHJpbnRlcihib29sIFYgPSBmYWxzZSwgYm9vbCBDID0gdHJ1ZSwgYm9vbCBDUyA9IHRydWUpCisgICAgICA6IFZlcmJvc2UoViksIENsZWFudXAoQyksIENTdHlsZShDUykge30KKworICBzdGF0aWMgdm9pZCBwcmludChjb25zdCBTRXhwciAqRSwgU3RyZWFtVHlwZSAmU1MpIHsKKyAgICBTZWxmIHByaW50ZXI7CisgICAgcHJpbnRlci5wcmludFNFeHByKEUsIFNTLCBQcmVjX01BWCk7CisgIH0KKworcHJvdGVjdGVkOgorICBTZWxmICpzZWxmKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTZWxmICo+KHRoaXMpOyB9CisKKyAgdm9pZCBuZXdsaW5lKFN0cmVhbVR5cGUgJlNTKSB7CisgICAgU1MgPDwgIlxuIjsKKyAgfQorCisgIC8vIFRPRE86IGZ1cnRoZXIgZGlzdGluZ3Vpc2ggYmV0d2VlbiBiaW5hcnkgb3BlcmF0aW9ucy4KKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFByZWNfQXRvbSA9IDA7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBQcmVjX1Bvc3RmaXggPSAxOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUHJlY19VbmFyeSA9IDI7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBQcmVjX0JpbmFyeSA9IDM7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBQcmVjX090aGVyID0gNDsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFByZWNfRGVjbCA9IDU7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBQcmVjX01BWCA9IDY7CisKKyAgLy8gUmV0dXJuIHRoZSBwcmVjZWRlbmNlIG9mIGEgZ2l2ZW4gbm9kZSwgZm9yIHVzZSBpbiBwcmV0dHkgcHJpbnRpbmcuCisgIHVuc2lnbmVkIHByZWNlZGVuY2UoY29uc3QgU0V4cHIgKkUpIHsKKyAgICBzd2l0Y2ggKEUtPm9wY29kZSgpKSB7CisgICAgICBjYXNlIENPUF9GdXR1cmU6ICAgICByZXR1cm4gUHJlY19BdG9tOworICAgICAgY2FzZSBDT1BfVW5kZWZpbmVkOiAgcmV0dXJuIFByZWNfQXRvbTsKKyAgICAgIGNhc2UgQ09QX1dpbGRjYXJkOiAgIHJldHVybiBQcmVjX0F0b207CisKKyAgICAgIGNhc2UgQ09QX0xpdGVyYWw6ICAgIHJldHVybiBQcmVjX0F0b207CisgICAgICBjYXNlIENPUF9MaXRlcmFsUHRyOiByZXR1cm4gUHJlY19BdG9tOworICAgICAgY2FzZSBDT1BfVmFyaWFibGU6ICAgcmV0dXJuIFByZWNfQXRvbTsKKyAgICAgIGNhc2UgQ09QX0Z1bmN0aW9uOiAgIHJldHVybiBQcmVjX0RlY2w7CisgICAgICBjYXNlIENPUF9TRnVuY3Rpb246ICByZXR1cm4gUHJlY19EZWNsOworICAgICAgY2FzZSBDT1BfQ29kZTogICAgICAgcmV0dXJuIFByZWNfRGVjbDsKKyAgICAgIGNhc2UgQ09QX0ZpZWxkOiAgICAgIHJldHVybiBQcmVjX0RlY2w7CisKKyAgICAgIGNhc2UgQ09QX0FwcGx5OiAgICAgIHJldHVybiBQcmVjX1Bvc3RmaXg7CisgICAgICBjYXNlIENPUF9TQXBwbHk6ICAgICByZXR1cm4gUHJlY19Qb3N0Zml4OworICAgICAgY2FzZSBDT1BfUHJvamVjdDogICAgcmV0dXJuIFByZWNfUG9zdGZpeDsKKworICAgICAgY2FzZSBDT1BfQ2FsbDogICAgICAgcmV0dXJuIFByZWNfUG9zdGZpeDsKKyAgICAgIGNhc2UgQ09QX0FsbG9jOiAgICAgIHJldHVybiBQcmVjX090aGVyOworICAgICAgY2FzZSBDT1BfTG9hZDogICAgICAgcmV0dXJuIFByZWNfUG9zdGZpeDsKKyAgICAgIGNhc2UgQ09QX1N0b3JlOiAgICAgIHJldHVybiBQcmVjX090aGVyOworICAgICAgY2FzZSBDT1BfQXJyYXlJbmRleDogcmV0dXJuIFByZWNfUG9zdGZpeDsKKyAgICAgIGNhc2UgQ09QX0FycmF5QWRkOiAgIHJldHVybiBQcmVjX1Bvc3RmaXg7CisKKyAgICAgIGNhc2UgQ09QX1VuYXJ5T3A6ICAgIHJldHVybiBQcmVjX1VuYXJ5OworICAgICAgY2FzZSBDT1BfQmluYXJ5T3A6ICAgcmV0dXJuIFByZWNfQmluYXJ5OworICAgICAgY2FzZSBDT1BfQ2FzdDogICAgICAgcmV0dXJuIFByZWNfQXRvbTsKKworICAgICAgY2FzZSBDT1BfU0NGRzogICAgICAgcmV0dXJuIFByZWNfRGVjbDsKKyAgICAgIGNhc2UgQ09QX0Jhc2ljQmxvY2s6IHJldHVybiBQcmVjX01BWDsKKyAgICAgIGNhc2UgQ09QX1BoaTogICAgICAgIHJldHVybiBQcmVjX0F0b207CisgICAgICBjYXNlIENPUF9Hb3RvOiAgICAgICByZXR1cm4gUHJlY19BdG9tOworICAgICAgY2FzZSBDT1BfQnJhbmNoOiAgICAgcmV0dXJuIFByZWNfQXRvbTsKKyAgICAgIGNhc2UgQ09QX1JldHVybjogICAgIHJldHVybiBQcmVjX090aGVyOworCisgICAgICBjYXNlIENPUF9JZGVudGlmaWVyOiByZXR1cm4gUHJlY19BdG9tOworICAgICAgY2FzZSBDT1BfSWZUaGVuRWxzZTogcmV0dXJuIFByZWNfT3RoZXI7CisgICAgICBjYXNlIENPUF9MZXQ6ICAgICAgICByZXR1cm4gUHJlY19EZWNsOworICAgIH0KKyAgICByZXR1cm4gUHJlY19NQVg7CisgIH0KKworICB2b2lkIHByaW50QmxvY2tMYWJlbChTdHJlYW1UeXBlICYgU1MsIGNvbnN0IEJhc2ljQmxvY2sgKkJCLCBpbnQgaW5kZXgpIHsKKyAgICBpZiAoIUJCKSB7CisgICAgICBTUyA8PCAiQkJfbnVsbCI7CisgICAgICByZXR1cm47CisgICAgfQorICAgIFNTIDw8ICJCQl8iOworICAgIFNTIDw8IEJCLT5ibG9ja0lEKCk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgIFNTIDw8ICI6IjsKKyAgICAgIFNTIDw8IGluZGV4OworICAgIH0KKyAgfQorCisgIHZvaWQgcHJpbnRTRXhwcihjb25zdCBTRXhwciAqRSwgU3RyZWFtVHlwZSAmU1MsIHVuc2lnbmVkIFAsIGJvb2wgU3ViPXRydWUpIHsKKyAgICBpZiAoIUUpIHsKKyAgICAgIHNlbGYoKS0+cHJpbnROdWxsKFNTKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKFN1YiAmJiBFLT5ibG9jaygpICYmIEUtPm9wY29kZSgpICE9IENPUF9WYXJpYWJsZSkgeworICAgICAgU1MgPDwgIl94IiA8PCBFLT5pZCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoc2VsZigpLT5wcmVjZWRlbmNlKEUpID4gUCkgeworICAgICAgLy8gV3JhcCBleHByIGluICgpIGlmIG5lY2Vzc2FyeS4KKyAgICAgIFNTIDw8ICIoIjsKKyAgICAgIHNlbGYoKS0+cHJpbnRTRXhwcihFLCBTUywgUHJlY19NQVgpOworICAgICAgU1MgPDwgIikiOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAoRS0+b3Bjb2RlKCkpIHsKKyNkZWZpbmUgVElMX09QQ09ERV9ERUYoWCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIENPUF8jI1g6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHNlbGYoKS0+cHJpbnQjI1goY2FzdDxYPihFKSwgU1MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybjsKKyNpbmNsdWRlICJUaHJlYWRTYWZldHlPcHMuZGVmIgorI3VuZGVmIFRJTF9PUENPREVfREVGCisgICAgfQorICB9CisKKyAgdm9pZCBwcmludE51bGwoU3RyZWFtVHlwZSAmU1MpIHsKKyAgICBTUyA8PCAiI251bGwiOworICB9CisKKyAgdm9pZCBwcmludEZ1dHVyZShjb25zdCBGdXR1cmUgKkUsIFN0cmVhbVR5cGUgJlNTKSB7CisgICAgc2VsZigpLT5wcmludFNFeHByKEUtPm1heWJlR2V0UmVzdWx0KCksIFNTLCBQcmVjX0F0b20pOworICB9CisKKyAgdm9pZCBwcmludFVuZGVmaW5lZChjb25zdCBVbmRlZmluZWQgKkUsIFN0cmVhbVR5cGUgJlNTKSB7CisgICAgU1MgPDwgIiN1bmRlZmluZWQiOworICB9CisKKyAgdm9pZCBwcmludFdpbGRjYXJkKGNvbnN0IFdpbGRjYXJkICpFLCBTdHJlYW1UeXBlICZTUykgeworICAgIFNTIDw8ICIqIjsKKyAgfQorCisgIHRlbXBsYXRlPGNsYXNzIFQ+CisgIHZvaWQgcHJpbnRMaXRlcmFsVChjb25zdCBMaXRlcmFsVDxUPiAqRSwgU3RyZWFtVHlwZSAmU1MpIHsKKyAgICBTUyA8PCBFLT52YWx1ZSgpOworICB9CisKKyAgdm9pZCBwcmludExpdGVyYWxUKGNvbnN0IExpdGVyYWxUPHVpbnQ4X3Q+ICpFLCBTdHJlYW1UeXBlICZTUykgeworICAgIFNTIDw8ICInIiA8PCBFLT52YWx1ZSgpIDw8ICInIjsKKyAgfQorCisgIHZvaWQgcHJpbnRMaXRlcmFsKGNvbnN0IExpdGVyYWwgKkUsIFN0cmVhbVR5cGUgJlNTKSB7CisgICAgaWYgKEUtPmNsYW5nRXhwcigpKSB7CisgICAgICBTUyA8PCBnZXRTb3VyY2VMaXRlcmFsU3RyaW5nKEUtPmNsYW5nRXhwcigpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBWYWx1ZVR5cGUgVlQgPSBFLT52YWx1ZVR5cGUoKTsKKyAgICAgIHN3aXRjaCAoVlQuQmFzZSkgeworICAgICAgY2FzZSBWYWx1ZVR5cGU6OkJUX1ZvaWQ6CisgICAgICAgIFNTIDw8ICJ2b2lkIjsKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSBWYWx1ZVR5cGU6OkJUX0Jvb2w6CisgICAgICAgIGlmIChFLT5hczxib29sPigpLnZhbHVlKCkpCisgICAgICAgICAgU1MgPDwgInRydWUiOworICAgICAgICBlbHNlCisgICAgICAgICAgU1MgPDwgImZhbHNlIjsKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSBWYWx1ZVR5cGU6OkJUX0ludDoKKyAgICAgICAgc3dpdGNoIChWVC5TaXplKSB7CisgICAgICAgIGNhc2UgVmFsdWVUeXBlOjpTVF84OgorICAgICAgICAgIGlmIChWVC5TaWduZWQpCisgICAgICAgICAgICBwcmludExpdGVyYWxUKCZFLT5hczxpbnQ4X3Q+KCksIFNTKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludExpdGVyYWxUKCZFLT5hczx1aW50OF90PigpLCBTUyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIFZhbHVlVHlwZTo6U1RfMTY6CisgICAgICAgICAgaWYgKFZULlNpZ25lZCkKKyAgICAgICAgICAgIHByaW50TGl0ZXJhbFQoJkUtPmFzPGludDE2X3Q+KCksIFNTKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludExpdGVyYWxUKCZFLT5hczx1aW50MTZfdD4oKSwgU1MpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSBWYWx1ZVR5cGU6OlNUXzMyOgorICAgICAgICAgIGlmIChWVC5TaWduZWQpCisgICAgICAgICAgICBwcmludExpdGVyYWxUKCZFLT5hczxpbnQzMl90PigpLCBTUyk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRMaXRlcmFsVCgmRS0+YXM8dWludDMyX3Q+KCksIFNTKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgVmFsdWVUeXBlOjpTVF82NDoKKyAgICAgICAgICBpZiAoVlQuU2lnbmVkKQorICAgICAgICAgICAgcHJpbnRMaXRlcmFsVCgmRS0+YXM8aW50NjRfdD4oKSwgU1MpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50TGl0ZXJhbFQoJkUtPmFzPHVpbnQ2NF90PigpLCBTUyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBWYWx1ZVR5cGU6OkJUX0Zsb2F0OgorICAgICAgICBzd2l0Y2ggKFZULlNpemUpIHsKKyAgICAgICAgY2FzZSBWYWx1ZVR5cGU6OlNUXzMyOgorICAgICAgICAgIHByaW50TGl0ZXJhbFQoJkUtPmFzPGZsb2F0PigpLCBTUyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIFZhbHVlVHlwZTo6U1RfNjQ6CisgICAgICAgICAgcHJpbnRMaXRlcmFsVCgmRS0+YXM8ZG91YmxlPigpLCBTUyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBWYWx1ZVR5cGU6OkJUX1N0cmluZzoKKyAgICAgICAgU1MgPDwgIlwiIjsKKyAgICAgICAgcHJpbnRMaXRlcmFsVCgmRS0+YXM8U3RyaW5nUmVmPigpLCBTUyk7CisgICAgICAgIFNTIDw8ICJcIiI7CisgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgVmFsdWVUeXBlOjpCVF9Qb2ludGVyOgorICAgICAgICBTUyA8PCAiI3B0ciI7CisgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgVmFsdWVUeXBlOjpCVF9WYWx1ZVJlZjoKKyAgICAgICAgU1MgPDwgIiN2cmVmIjsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICBTUyA8PCAiI2xpdCI7CisgIH0KKworICB2b2lkIHByaW50TGl0ZXJhbFB0cihjb25zdCBMaXRlcmFsUHRyICpFLCBTdHJlYW1UeXBlICZTUykgeworICAgIFNTIDw8IEUtPmNsYW5nRGVjbCgpLT5nZXROYW1lQXNTdHJpbmcoKTsKKyAgfQorCisgIHZvaWQgcHJpbnRWYXJpYWJsZShjb25zdCBWYXJpYWJsZSAqViwgU3RyZWFtVHlwZSAmU1MsIGJvb2wgSXNWYXJEZWNsPWZhbHNlKSB7CisgICAgaWYgKENTdHlsZSAmJiBWLT5raW5kKCkgPT0gVmFyaWFibGU6OlZLX1NGdW4pCisgICAgICBTUyA8PCAidGhpcyI7CisgICAgZWxzZQorICAgICAgU1MgPDwgVi0+bmFtZSgpIDw8IFYtPmlkKCk7CisgIH0KKworICB2b2lkIHByaW50RnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gKkUsIFN0cmVhbVR5cGUgJlNTLCB1bnNpZ25lZCBzdWdhcmVkID0gMCkgeworICAgIHN3aXRjaCAoc3VnYXJlZCkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgU1MgPDwgIlxcKCI7ICAgLy8gTGFtYmRhCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBTUyA8PCAiKCI7ICAgICAvLyBTbG90IGRlY2xhcmF0aW9ucworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgU1MgPDwgIiwgIjsgICAgLy8gQ3VycmllZCBmdW5jdGlvbnMKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHNlbGYoKS0+cHJpbnRWYXJpYWJsZShFLT52YXJpYWJsZURlY2woKSwgU1MsIHRydWUpOworICAgIFNTIDw8ICI6ICI7CisgICAgc2VsZigpLT5wcmludFNFeHByKEUtPnZhcmlhYmxlRGVjbCgpLT5kZWZpbml0aW9uKCksIFNTLCBQcmVjX01BWCk7CisKKyAgICBjb25zdCBTRXhwciAqQiA9IEUtPmJvZHkoKTsKKyAgICBpZiAoQiAmJiBCLT5vcGNvZGUoKSA9PSBDT1BfRnVuY3Rpb24pCisgICAgICBzZWxmKCktPnByaW50RnVuY3Rpb24oY2FzdDxGdW5jdGlvbj4oQiksIFNTLCAyKTsKKyAgICBlbHNlIHsKKyAgICAgIFNTIDw8ICIpIjsKKyAgICAgIHNlbGYoKS0+cHJpbnRTRXhwcihCLCBTUywgUHJlY19EZWNsKTsKKyAgICB9CisgIH0KKworICB2b2lkIHByaW50U0Z1bmN0aW9uKGNvbnN0IFNGdW5jdGlvbiAqRSwgU3RyZWFtVHlwZSAmU1MpIHsKKyAgICBTUyA8PCAiQCI7CisgICAgc2VsZigpLT5wcmludFZhcmlhYmxlKEUtPnZhcmlhYmxlRGVjbCgpLCBTUywgdHJ1ZSk7CisgICAgU1MgPDwgIiAiOworICAgIHNlbGYoKS0+cHJpbnRTRXhwcihFLT5ib2R5KCksIFNTLCBQcmVjX0RlY2wpOworICB9CisKKyAgdm9pZCBwcmludENvZGUoY29uc3QgQ29kZSAqRSwgU3RyZWFtVHlwZSAmU1MpIHsKKyAgICBTUyA8PCAiOiAiOworICAgIHNlbGYoKS0+cHJpbnRTRXhwcihFLT5yZXR1cm5UeXBlKCksIFNTLCBQcmVjX0RlY2wtMSk7CisgICAgU1MgPDwgIiAtPiAiOworICAgIHNlbGYoKS0+cHJpbnRTRXhwcihFLT5ib2R5KCksIFNTLCBQcmVjX0RlY2wpOworICB9CisKKyAgdm9pZCBwcmludEZpZWxkKGNvbnN0IEZpZWxkICpFLCBTdHJlYW1UeXBlICZTUykgeworICAgIFNTIDw8ICI6ICI7CisgICAgc2VsZigpLT5wcmludFNFeHByKEUtPnJhbmdlKCksIFNTLCBQcmVjX0RlY2wtMSk7CisgICAgU1MgPDwgIiA9ICI7CisgICAgc2VsZigpLT5wcmludFNFeHByKEUtPmJvZHkoKSwgU1MsIFByZWNfRGVjbCk7CisgIH0KKworICB2b2lkIHByaW50QXBwbHkoY29uc3QgQXBwbHkgKkUsIFN0cmVhbVR5cGUgJlNTLCBib29sIHN1Z2FyZWQgPSBmYWxzZSkgeworICAgIGNvbnN0IFNFeHByICpGID0gRS0+ZnVuKCk7CisgICAgaWYgKEYtPm9wY29kZSgpID09IENPUF9BcHBseSkgeworICAgICAgcHJpbnRBcHBseShjYXN0PEFwcGx5PihGKSwgU1MsIHRydWUpOworICAgICAgU1MgPDwgIiwgIjsKKyAgICB9IGVsc2UgeworICAgICAgc2VsZigpLT5wcmludFNFeHByKEYsIFNTLCBQcmVjX1Bvc3RmaXgpOworICAgICAgU1MgPDwgIigiOworICAgIH0KKyAgICBzZWxmKCktPnByaW50U0V4cHIoRS0+YXJnKCksIFNTLCBQcmVjX01BWCk7CisgICAgaWYgKCFzdWdhcmVkKQorICAgICAgU1MgPDwgIikkIjsKKyAgfQorCisgIHZvaWQgcHJpbnRTQXBwbHkoY29uc3QgU0FwcGx5ICpFLCBTdHJlYW1UeXBlICZTUykgeworICAgIHNlbGYoKS0+cHJpbnRTRXhwcihFLT5zZnVuKCksIFNTLCBQcmVjX1Bvc3RmaXgpOworICAgIGlmIChFLT5pc0RlbGVnYXRpb24oKSkgeworICAgICAgU1MgPDwgIkAoIjsKKyAgICAgIHNlbGYoKS0+cHJpbnRTRXhwcihFLT5hcmcoKSwgU1MsIFByZWNfTUFYKTsKKyAgICAgIFNTIDw8ICIpIjsKKyAgICB9CisgIH0KKworICB2b2lkIHByaW50UHJvamVjdChjb25zdCBQcm9qZWN0ICpFLCBTdHJlYW1UeXBlICZTUykgeworICAgIGlmIChDU3R5bGUpIHsKKyAgICAgIC8vIE9taXQgdGhlICB0aGlzLT4KKyAgICAgIGlmIChjb25zdCBhdXRvICpTQVAgPSBkeW5fY2FzdDxTQXBwbHk+KEUtPnJlY29yZCgpKSkgeworICAgICAgICBpZiAoY29uc3QgYXV0byAqViA9IGR5bl9jYXN0PFZhcmlhYmxlPihTQVAtPnNmdW4oKSkpIHsKKyAgICAgICAgICBpZiAoIVNBUC0+aXNEZWxlZ2F0aW9uKCkgJiYgVi0+a2luZCgpID09IFZhcmlhYmxlOjpWS19TRnVuKSB7CisgICAgICAgICAgICBTUyA8PCBFLT5zbG90TmFtZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGlzYTxXaWxkY2FyZD4oRS0+cmVjb3JkKCkpKSB7CisgICAgICAgIC8vIGhhbmRsZSBleGlzdGVudGlhbHMKKyAgICAgICAgU1MgPDwgIiYiOworICAgICAgICBTUyA8PCBFLT5jbGFuZ0RlY2woKS0+Z2V0UXVhbGlmaWVkTmFtZUFzU3RyaW5nKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgc2VsZigpLT5wcmludFNFeHByKEUtPnJlY29yZCgpLCBTUywgUHJlY19Qb3N0Zml4KTsKKyAgICBpZiAoQ1N0eWxlICYmIEUtPmlzQXJyb3coKSkKKyAgICAgIFNTIDw8ICItPiI7CisgICAgZWxzZQorICAgICAgU1MgPDwgIi4iOworICAgIFNTIDw8IEUtPnNsb3ROYW1lKCk7CisgIH0KKworICB2b2lkIHByaW50Q2FsbChjb25zdCBDYWxsICpFLCBTdHJlYW1UeXBlICZTUykgeworICAgIGNvbnN0IFNFeHByICpUID0gRS0+dGFyZ2V0KCk7CisgICAgaWYgKFQtPm9wY29kZSgpID09IENPUF9BcHBseSkgeworICAgICAgc2VsZigpLT5wcmludEFwcGx5KGNhc3Q8QXBwbHk+KFQpLCBTUywgdHJ1ZSk7CisgICAgICBTUyA8PCAiKSI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgc2VsZigpLT5wcmludFNFeHByKFQsIFNTLCBQcmVjX1Bvc3RmaXgpOworICAgICAgU1MgPDwgIigpIjsKKyAgICB9CisgIH0KKworICB2b2lkIHByaW50QWxsb2MoY29uc3QgQWxsb2MgKkUsIFN0cmVhbVR5cGUgJlNTKSB7CisgICAgU1MgPDwgIm5ldyAiOworICAgIHNlbGYoKS0+cHJpbnRTRXhwcihFLT5kYXRhVHlwZSgpLCBTUywgUHJlY19PdGhlci0xKTsKKyAgfQorCisgIHZvaWQgcHJpbnRMb2FkKGNvbnN0IExvYWQgKkUsIFN0cmVhbVR5cGUgJlNTKSB7CisgICAgc2VsZigpLT5wcmludFNFeHByKEUtPnBvaW50ZXIoKSwgU1MsIFByZWNfUG9zdGZpeCk7CisgICAgaWYgKCFDU3R5bGUpCisgICAgICBTUyA8PCAiXiI7CisgIH0KKworICB2b2lkIHByaW50U3RvcmUoY29uc3QgU3RvcmUgKkUsIFN0cmVhbVR5cGUgJlNTKSB7CisgICAgc2VsZigpLT5wcmludFNFeHByKEUtPmRlc3RpbmF0aW9uKCksIFNTLCBQcmVjX090aGVyLTEpOworICAgIFNTIDw8ICIgOj0gIjsKKyAgICBzZWxmKCktPnByaW50U0V4cHIoRS0+c291cmNlKCksIFNTLCBQcmVjX090aGVyLTEpOworICB9CisKKyAgdm9pZCBwcmludEFycmF5SW5kZXgoY29uc3QgQXJyYXlJbmRleCAqRSwgU3RyZWFtVHlwZSAmU1MpIHsKKyAgICBzZWxmKCktPnByaW50U0V4cHIoRS0+YXJyYXkoKSwgU1MsIFByZWNfUG9zdGZpeCk7CisgICAgU1MgPDwgIlsiOworICAgIHNlbGYoKS0+cHJpbnRTRXhwcihFLT5pbmRleCgpLCBTUywgUHJlY19NQVgpOworICAgIFNTIDw8ICJdIjsKKyAgfQorCisgIHZvaWQgcHJpbnRBcnJheUFkZChjb25zdCBBcnJheUFkZCAqRSwgU3RyZWFtVHlwZSAmU1MpIHsKKyAgICBzZWxmKCktPnByaW50U0V4cHIoRS0+YXJyYXkoKSwgU1MsIFByZWNfUG9zdGZpeCk7CisgICAgU1MgPDwgIiArICI7CisgICAgc2VsZigpLT5wcmludFNFeHByKEUtPmluZGV4KCksIFNTLCBQcmVjX0F0b20pOworICB9CisKKyAgdm9pZCBwcmludFVuYXJ5T3AoY29uc3QgVW5hcnlPcCAqRSwgU3RyZWFtVHlwZSAmU1MpIHsKKyAgICBTUyA8PCBnZXRVbmFyeU9wY29kZVN0cmluZyhFLT51bmFyeU9wY29kZSgpKTsKKyAgICBzZWxmKCktPnByaW50U0V4cHIoRS0+ZXhwcigpLCBTUywgUHJlY19VbmFyeSk7CisgIH0KKworICB2b2lkIHByaW50QmluYXJ5T3AoY29uc3QgQmluYXJ5T3AgKkUsIFN0cmVhbVR5cGUgJlNTKSB7CisgICAgc2VsZigpLT5wcmludFNFeHByKEUtPmV4cHIwKCksIFNTLCBQcmVjX0JpbmFyeS0xKTsKKyAgICBTUyA8PCAiICIgPDwgZ2V0QmluYXJ5T3Bjb2RlU3RyaW5nKEUtPmJpbmFyeU9wY29kZSgpKSA8PCAiICI7CisgICAgc2VsZigpLT5wcmludFNFeHByKEUtPmV4cHIxKCksIFNTLCBQcmVjX0JpbmFyeS0xKTsKKyAgfQorCisgIHZvaWQgcHJpbnRDYXN0KGNvbnN0IENhc3QgKkUsIFN0cmVhbVR5cGUgJlNTKSB7CisgICAgaWYgKCFDU3R5bGUpIHsKKyAgICAgIFNTIDw8ICJjYXN0WyI7CisgICAgICBTUyA8PCBFLT5jYXN0T3Bjb2RlKCk7CisgICAgICBTUyA8PCAiXSgiOworICAgICAgc2VsZigpLT5wcmludFNFeHByKEUtPmV4cHIoKSwgU1MsIFByZWNfVW5hcnkpOworICAgICAgU1MgPDwgIikiOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZWxmKCktPnByaW50U0V4cHIoRS0+ZXhwcigpLCBTUywgUHJlY19VbmFyeSk7CisgIH0KKworICB2b2lkIHByaW50U0NGRyhjb25zdCBTQ0ZHICpFLCBTdHJlYW1UeXBlICZTUykgeworICAgIFNTIDw8ICJDRkcge1xuIjsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKkJCSSA6ICpFKQorICAgICAgcHJpbnRCYXNpY0Jsb2NrKEJCSSwgU1MpOworICAgIFNTIDw8ICJ9IjsKKyAgICBuZXdsaW5lKFNTKTsKKyAgfQorCisgIHZvaWQgcHJpbnRCQkluc3RyKGNvbnN0IFNFeHByICpFLCBTdHJlYW1UeXBlICZTUykgeworICAgIGJvb2wgU3ViID0gZmFsc2U7CisgICAgaWYgKEUtPm9wY29kZSgpID09IENPUF9WYXJpYWJsZSkgeworICAgICAgY29uc3QgYXV0byAqViA9IGNhc3Q8VmFyaWFibGU+KEUpOworICAgICAgU1MgPDwgImxldCAiIDw8IFYtPm5hbWUoKSA8PCBWLT5pZCgpIDw8ICIgPSAiOworICAgICAgRSA9IFYtPmRlZmluaXRpb24oKTsKKyAgICAgIFN1YiA9IHRydWU7CisgICAgfQorICAgIGVsc2UgaWYgKEUtPm9wY29kZSgpICE9IENPUF9TdG9yZSkgeworICAgICAgU1MgPDwgImxldCBfeCIgPDwgRS0+aWQoKSA8PCAiID0gIjsKKyAgICB9CisgICAgc2VsZigpLT5wcmludFNFeHByKEUsIFNTLCBQcmVjX01BWCwgU3ViKTsKKyAgICBTUyA8PCAiOyI7CisgICAgbmV3bGluZShTUyk7CisgIH0KKworICB2b2lkIHByaW50QmFzaWNCbG9jayhjb25zdCBCYXNpY0Jsb2NrICpFLCBTdHJlYW1UeXBlICZTUykgeworICAgIFNTIDw8ICJCQl8iIDw8IEUtPmJsb2NrSUQoKSA8PCAiOiI7CisgICAgaWYgKEUtPnBhcmVudCgpKQorICAgICAgU1MgPDwgIiBCQl8iIDw8IEUtPnBhcmVudCgpLT5ibG9ja0lEKCk7CisgICAgbmV3bGluZShTUyk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gKkEgOiBFLT5hcmd1bWVudHMoKSkKKyAgICAgIHByaW50QkJJbnN0cihBLCBTUyk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBFLT5pbnN0cnVjdGlvbnMoKSkKKyAgICAgIHByaW50QkJJbnN0cihJLCBTUyk7CisKKyAgICBjb25zdCBTRXhwciAqVCA9IEUtPnRlcm1pbmF0b3IoKTsKKyAgICBpZiAoVCkgeworICAgICAgc2VsZigpLT5wcmludFNFeHByKFQsIFNTLCBQcmVjX01BWCwgZmFsc2UpOworICAgICAgU1MgPDwgIjsiOworICAgICAgbmV3bGluZShTUyk7CisgICAgfQorICAgIG5ld2xpbmUoU1MpOworICB9CisKKyAgdm9pZCBwcmludFBoaShjb25zdCBQaGkgKkUsIFN0cmVhbVR5cGUgJlNTKSB7CisgICAgU1MgPDwgInBoaSgiOworICAgIGlmIChFLT5zdGF0dXMoKSA9PSBQaGk6OlBIX1NpbmdsZVZhbCkKKyAgICAgIHNlbGYoKS0+cHJpbnRTRXhwcihFLT52YWx1ZXMoKVswXSwgU1MsIFByZWNfTUFYKTsKKyAgICBlbHNlIHsKKyAgICAgIHVuc2lnbmVkIGkgPSAwOworICAgICAgZm9yIChjb25zdCBhdXRvICpWIDogRS0+dmFsdWVzKCkpIHsKKyAgICAgICAgaWYgKGkrKyA+IDApCisgICAgICAgICAgU1MgPDwgIiwgIjsKKyAgICAgICAgc2VsZigpLT5wcmludFNFeHByKFYsIFNTLCBQcmVjX01BWCk7CisgICAgICB9CisgICAgfQorICAgIFNTIDw8ICIpIjsKKyAgfQorCisgIHZvaWQgcHJpbnRHb3RvKGNvbnN0IEdvdG8gKkUsIFN0cmVhbVR5cGUgJlNTKSB7CisgICAgU1MgPDwgImdvdG8gIjsKKyAgICBwcmludEJsb2NrTGFiZWwoU1MsIEUtPnRhcmdldEJsb2NrKCksIEUtPmluZGV4KCkpOworICB9CisKKyAgdm9pZCBwcmludEJyYW5jaChjb25zdCBCcmFuY2ggKkUsIFN0cmVhbVR5cGUgJlNTKSB7CisgICAgU1MgPDwgImJyYW5jaCAoIjsKKyAgICBzZWxmKCktPnByaW50U0V4cHIoRS0+Y29uZGl0aW9uKCksIFNTLCBQcmVjX01BWCk7CisgICAgU1MgPDwgIikgIjsKKyAgICBwcmludEJsb2NrTGFiZWwoU1MsIEUtPnRoZW5CbG9jaygpLCAtMSk7CisgICAgU1MgPDwgIiAiOworICAgIHByaW50QmxvY2tMYWJlbChTUywgRS0+ZWxzZUJsb2NrKCksIC0xKTsKKyAgfQorCisgIHZvaWQgcHJpbnRSZXR1cm4oY29uc3QgUmV0dXJuICpFLCBTdHJlYW1UeXBlICZTUykgeworICAgIFNTIDw8ICJyZXR1cm4gIjsKKyAgICBzZWxmKCktPnByaW50U0V4cHIoRS0+cmV0dXJuVmFsdWUoKSwgU1MsIFByZWNfT3RoZXIpOworICB9CisKKyAgdm9pZCBwcmludElkZW50aWZpZXIoY29uc3QgSWRlbnRpZmllciAqRSwgU3RyZWFtVHlwZSAmU1MpIHsKKyAgICBTUyA8PCBFLT5uYW1lKCk7CisgIH0KKworICB2b2lkIHByaW50SWZUaGVuRWxzZShjb25zdCBJZlRoZW5FbHNlICpFLCBTdHJlYW1UeXBlICZTUykgeworICAgIGlmIChDU3R5bGUpIHsKKyAgICAgIHByaW50U0V4cHIoRS0+Y29uZGl0aW9uKCksIFNTLCBQcmVjX1VuYXJ5KTsKKyAgICAgIFNTIDw8ICIgPyAiOworICAgICAgcHJpbnRTRXhwcihFLT50aGVuRXhwcigpLCBTUywgUHJlY19VbmFyeSk7CisgICAgICBTUyA8PCAiIDogIjsKKyAgICAgIHByaW50U0V4cHIoRS0+ZWxzZUV4cHIoKSwgU1MsIFByZWNfVW5hcnkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTUyA8PCAiaWYgKCI7CisgICAgcHJpbnRTRXhwcihFLT5jb25kaXRpb24oKSwgU1MsIFByZWNfTUFYKTsKKyAgICBTUyA8PCAiKSB0aGVuICI7CisgICAgcHJpbnRTRXhwcihFLT50aGVuRXhwcigpLCBTUywgUHJlY19PdGhlcik7CisgICAgU1MgPDwgIiBlbHNlICI7CisgICAgcHJpbnRTRXhwcihFLT5lbHNlRXhwcigpLCBTUywgUHJlY19PdGhlcik7CisgIH0KKworICB2b2lkIHByaW50TGV0KGNvbnN0IExldCAqRSwgU3RyZWFtVHlwZSAmU1MpIHsKKyAgICBTUyA8PCAibGV0ICI7CisgICAgcHJpbnRWYXJpYWJsZShFLT52YXJpYWJsZURlY2woKSwgU1MsIHRydWUpOworICAgIFNTIDw8ICIgPSAiOworICAgIHByaW50U0V4cHIoRS0+dmFyaWFibGVEZWNsKCktPmRlZmluaXRpb24oKSwgU1MsIFByZWNfRGVjbC0xKTsKKyAgICBTUyA8PCAiOyAiOworICAgIHByaW50U0V4cHIoRS0+Ym9keSgpLCBTUywgUHJlY19EZWNsLTEpOworICB9Cit9OworCitjbGFzcyBTdGRQcmludGVyIDogcHVibGljIFByZXR0eVByaW50ZXI8U3RkUHJpbnRlciwgc3RkOjpvc3RyZWFtPiB7fTsKKworfSAvLyBuYW1lc3BhY2UgdGlsCit9IC8vIG5hbWVzcGFjZSB0aHJlYWRTYWZldHkKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FOQUxZU0lTX0FOQUxZU0VTX1RIUkVBRFNBRkVUWVRSQVZFUlNFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL1RocmVhZFNhZmV0eVV0aWwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL1RocmVhZFNhZmV0eVV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjU4MzkzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvVGhyZWFkU2FmZXR5VXRpbC5oCkBAIC0wLDAgKzEsMzU4IEBACisvLz09PS0gVGhyZWFkU2FmZXR5VXRpbC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHNvbWUgYmFzaWMgdXRpbGl0eSBjbGFzc2VzIGZvciB1c2UgYnkgVGhyZWFkU2FmZXR5VElMLmgKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQU5BTFlTSVNfQU5BTFlTRVNfVEhSRUFEU0FGRVRZVVRJTF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQU5BTFlTSVNfQU5BTFlTRVNfVEhSRUFEU0FGRVRZVVRJTF9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEV4cHI7CisKK25hbWVzcGFjZSB0aHJlYWRTYWZldHkgeworbmFtZXNwYWNlIHRpbCB7CisKKy8vIFNpbXBsZSB3cmFwcGVyIGNsYXNzIHRvIGFic3RyYWN0IGF3YXkgZnJvbSB0aGUgZGV0YWlscyBvZiBtZW1vcnkgbWFuYWdlbWVudC4KKy8vIFNFeHBycyBhcmUgYWxsb2NhdGVkIGluIHBvb2xzLCBhbmQgZGVhbGxvY2F0ZWQgYWxsIGF0IG9uY2UuCitjbGFzcyBNZW1SZWdpb25SZWYgeworcHJpdmF0ZToKKyAgdW5pb24gQWxpZ25tZW50VHlwZSB7CisgICAgZG91YmxlIGQ7CisgICAgdm9pZCAqcDsKKyAgICBsb25nIGRvdWJsZSBkZDsKKyAgICBsb25nIGxvbmcgaWk7CisgIH07CisKK3B1YmxpYzoKKyAgTWVtUmVnaW9uUmVmKCkgPSBkZWZhdWx0OworICBNZW1SZWdpb25SZWYobGx2bTo6QnVtcFB0ckFsbG9jYXRvciAqQSkgOiBBbGxvY2F0b3IoQSkge30KKworICB2b2lkICphbGxvY2F0ZShzaXplX3QgU3opIHsKKyAgICByZXR1cm4gQWxsb2NhdG9yLT5BbGxvY2F0ZShTeiwgYWxpZ25vZihBbGlnbm1lbnRUeXBlKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCAqYWxsb2NhdGVUKCkgeyByZXR1cm4gQWxsb2NhdG9yLT5BbGxvY2F0ZTxUPigpOyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgKmFsbG9jYXRlVChzaXplX3QgTnVtRWxlbXMpIHsKKyAgICByZXR1cm4gQWxsb2NhdG9yLT5BbGxvY2F0ZTxUPihOdW1FbGVtcyk7CisgIH0KKworcHJpdmF0ZToKKyAgbGx2bTo6QnVtcFB0ckFsbG9jYXRvciAqQWxsb2NhdG9yID0gbnVsbHB0cjsKK307CisKK30gLy8gbmFtZXNwYWNlIHRpbAorfSAvLyBuYW1lc3BhY2UgdGhyZWFkU2FmZXR5CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKK2lubGluZSB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IFN6LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFuZzo6dGhyZWFkU2FmZXR5Ojp0aWw6Ok1lbVJlZ2lvblJlZiAmUikgeworICByZXR1cm4gUi5hbGxvY2F0ZShTeik7Cit9CisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgdGhyZWFkU2FmZXR5IHsKKworc3RkOjpzdHJpbmcgZ2V0U291cmNlTGl0ZXJhbFN0cmluZyhjb25zdCBFeHByICpDRSk7CisKK25hbWVzcGFjZSB0aWwgeworCisvLyBBIHNpbXBsZSBmaXhlZCBzaXplIGFycmF5IGNsYXNzIHRoYXQgZG9lcyBub3QgbWFuYWdlIGl0cyBvd24gbWVtb3J5LAorLy8gc3VpdGFibGUgZm9yIHVzZSB3aXRoIGJ1bXAgcG9pbnRlciBhbGxvY2F0aW9uLgordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIFNpbXBsZUFycmF5IHsKK3B1YmxpYzoKKyAgU2ltcGxlQXJyYXkoKSA9IGRlZmF1bHQ7CisgIFNpbXBsZUFycmF5KFQgKkRhdCwgc2l6ZV90IENwLCBzaXplX3QgU3ogPSAwKQorICAgICAgOiBEYXRhKERhdCksIFNpemUoU3opLCBDYXBhY2l0eShDcCkge30KKyAgU2ltcGxlQXJyYXkoTWVtUmVnaW9uUmVmIEEsIHNpemVfdCBDcCkKKyAgICAgIDogRGF0YShDcCA9PSAwID8gbnVsbHB0ciA6IEEuYWxsb2NhdGVUPFQ+KENwKSksIENhcGFjaXR5KENwKSB7fQorICBTaW1wbGVBcnJheShjb25zdCBTaW1wbGVBcnJheTxUPiAmQSkgPSBkZWxldGU7CisKKyAgU2ltcGxlQXJyYXkoU2ltcGxlQXJyYXk8VD4gJiZBKQorICAgICAgOiBEYXRhKEEuRGF0YSksIFNpemUoQS5TaXplKSwgQ2FwYWNpdHkoQS5DYXBhY2l0eSkgeworICAgIEEuRGF0YSA9IG51bGxwdHI7CisgICAgQS5TaXplID0gMDsKKyAgICBBLkNhcGFjaXR5ID0gMDsKKyAgfQorCisgIFNpbXBsZUFycmF5ICZvcGVyYXRvcj0oU2ltcGxlQXJyYXkgJiZSSFMpIHsKKyAgICBpZiAodGhpcyAhPSAmUkhTKSB7CisgICAgICBEYXRhID0gUkhTLkRhdGE7CisgICAgICBTaXplID0gUkhTLlNpemU7CisgICAgICBDYXBhY2l0eSA9IFJIUy5DYXBhY2l0eTsKKworICAgICAgUkhTLkRhdGEgPSBudWxscHRyOworICAgICAgUkhTLlNpemUgPSBSSFMuQ2FwYWNpdHkgPSAwOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBSZXNlcnZlIHNwYWNlIGZvciBhdCBsZWFzdCBOY3AgaXRlbXMsIHJlYWxsb2NhdGluZyBpZiBuZWNlc3NhcnkuCisgIHZvaWQgcmVzZXJ2ZShzaXplX3QgTmNwLCBNZW1SZWdpb25SZWYgQSkgeworICAgIGlmIChOY3AgPD0gQ2FwYWNpdHkpCisgICAgICByZXR1cm47CisgICAgVCAqT2RhdGEgPSBEYXRhOworICAgIERhdGEgPSBBLmFsbG9jYXRlVDxUPihOY3ApOworICAgIENhcGFjaXR5ID0gTmNwOworICAgIG1lbWNweShEYXRhLCBPZGF0YSwgc2l6ZW9mKFQpICogU2l6ZSk7CisgIH0KKworICAvLyBSZXNlcnZlIHNwYWNlIGZvciBhdCBsZWFzdCBOIG1vcmUgaXRlbXMuCisgIHZvaWQgcmVzZXJ2ZUNoZWNrKHNpemVfdCBOLCBNZW1SZWdpb25SZWYgQSkgeworICAgIGlmIChDYXBhY2l0eSA9PSAwKQorICAgICAgcmVzZXJ2ZSh1X21heChJbml0aWFsQ2FwYWNpdHksIE4pLCBBKTsKKyAgICBlbHNlIGlmIChTaXplICsgTiA8IENhcGFjaXR5KQorICAgICAgcmVzZXJ2ZSh1X21heChTaXplICsgTiwgQ2FwYWNpdHkgKiAyKSwgQSk7CisgIH0KKworICB1c2luZyBpdGVyYXRvciA9IFQgKjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBjb25zdCBUICo7CisgIHVzaW5nIHJldmVyc2VfaXRlcmF0b3IgPSBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+OworICB1c2luZyBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yID0gc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPjsKKworICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKyAgc2l6ZV90IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gQ2FwYWNpdHk7IH0KKworICBUICZvcGVyYXRvcltdKHVuc2lnbmVkIGkpIHsKKyAgICBhc3NlcnQoaSA8IFNpemUgJiYgIkFycmF5IGluZGV4IG91dCBvZiBib3VuZHMuIik7CisgICAgcmV0dXJuIERhdGFbaV07CisgIH0KKworICBjb25zdCBUICZvcGVyYXRvcltdKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IFNpemUgJiYgIkFycmF5IGluZGV4IG91dCBvZiBib3VuZHMuIik7CisgICAgcmV0dXJuIERhdGFbaV07CisgIH0KKworICBUICZiYWNrKCkgeworICAgIGFzc2VydChTaXplICYmICJObyBlbGVtZW50cyBpbiB0aGUgYXJyYXkuIik7CisgICAgcmV0dXJuIERhdGFbU2l6ZSAtIDFdOworICB9CisKKyAgY29uc3QgVCAmYmFjaygpIGNvbnN0IHsKKyAgICBhc3NlcnQoU2l6ZSAmJiAiTm8gZWxlbWVudHMgaW4gdGhlIGFycmF5LiIpOworICAgIHJldHVybiBEYXRhW1NpemUgLSAxXTsKKyAgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gRGF0YTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBEYXRhICsgU2l6ZTsgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBEYXRhICsgU2l6ZTsgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IHsgcmV0dXJuIERhdGE7IH0KKyAgY29uc3RfaXRlcmF0b3IgY2VuZCgpIGNvbnN0IHsgcmV0dXJuIERhdGEgKyBTaXplOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOworICB9CisKKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOworICB9CisKKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgVCAmRWxlbSkgeworICAgIGFzc2VydChTaXplIDwgQ2FwYWNpdHkpOworICAgIERhdGFbU2l6ZSsrXSA9IEVsZW07CisgIH0KKworICAvLyBkcm9wIGxhc3QgbiBlbGVtZW50cyBmcm9tIGFycmF5CisgIHZvaWQgZHJvcCh1bnNpZ25lZCBuID0gMCkgeworICAgIGFzc2VydChTaXplID4gbik7CisgICAgU2l6ZSAtPSBuOworICB9CisKKyAgdm9pZCBzZXRWYWx1ZXModW5zaWduZWQgU3osIGNvbnN0IFQmIEMpIHsKKyAgICBhc3NlcnQoU3ogPD0gQ2FwYWNpdHkpOworICAgIFNpemUgPSBTejsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgU3o7ICsraSkgeworICAgICAgRGF0YVtpXSA9IEM7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIEl0ZXI+IHVuc2lnbmVkIGFwcGVuZChJdGVyIEksIEl0ZXIgRSkgeworICAgIHNpemVfdCBPc3ogPSBTaXplOworICAgIHNpemVfdCBKID0gT3N6OworICAgIGZvciAoOyBKIDwgQ2FwYWNpdHkgJiYgSSAhPSBFOyArK0osICsrSSkKKyAgICAgIERhdGFbSl0gPSAqSTsKKyAgICBTaXplID0gSjsKKyAgICByZXR1cm4gSiAtIE9zejsKKyAgfQorCisgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHJldmVyc2VfaXRlcmF0b3I+IHJldmVyc2UoKSB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VfcmFuZ2UocmJlZ2luKCksIHJlbmQoKSk7CisgIH0KKworICBsbHZtOjppdGVyYXRvcl9yYW5nZTxjb25zdF9yZXZlcnNlX2l0ZXJhdG9yPiByZXZlcnNlKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlX3JhbmdlKHJiZWdpbigpLCByZW5kKCkpOworICB9CisKK3ByaXZhdGU6CisgIC8vIHN0ZDo6bWF4IGlzIGFubm95aW5nIGhlcmUsIGJlY2F1c2UgaXQgcmVxdWlyZXMgYSByZWZlcmVuY2UsCisgIC8vIHRodXMgZm9yY2luZyBJbml0aWFsQ2FwYWNpdHkgdG8gYmUgaW5pdGlhbGl6ZWQgb3V0c2lkZSB0aGUgLmggZmlsZS4KKyAgc2l6ZV90IHVfbWF4KHNpemVfdCBpLCBzaXplX3QgaikgeyByZXR1cm4gKGkgPCBqKSA/IGogOiBpOyB9CisKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBJbml0aWFsQ2FwYWNpdHkgPSA0OworCisgIFQgKkRhdGEgPSBudWxscHRyOworICBzaXplX3QgU2l6ZSA9IDA7CisgIHNpemVfdCBDYXBhY2l0eSA9IDA7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGlsCisKKy8vIEEgY29weSBvbiB3cml0ZSB2ZWN0b3IuCisvLyBUaGUgdmVjdG9yIGNhbiBiZSBpbiBvbmUgb2YgdGhyZWUgc3RhdGVzOgorLy8gKiBpbnZhbGlkIC0tIG5vIG9wZXJhdGlvbnMgYXJlIHBlcm1pdHRlZC4KKy8vICogcmVhZC1vbmx5IC0tIHJlYWQgb3BlcmF0aW9ucyBhcmUgcGVybWl0dGVkLgorLy8gKiB3cml0YWJsZSAtLSByZWFkIGFuZCB3cml0ZSBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQuCisvLyBUaGUgaW5pdCgpLCBkZXN0cm95KCksIGFuZCBtYWtlV3JpdGFibGUoKSBtZXRob2RzIHdpbGwgY2hhbmdlIHN0YXRlLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIENvcHlPbldyaXRlVmVjdG9yIHsKKyAgY2xhc3MgVmVjdG9yRGF0YSB7CisgIHB1YmxpYzoKKyAgICB1bnNpZ25lZCBOdW1SZWZzID0gMTsKKyAgICBzdGQ6OnZlY3RvcjxUPiBWZWN0OworCisgICAgVmVjdG9yRGF0YSgpID0gZGVmYXVsdDsKKyAgICBWZWN0b3JEYXRhKGNvbnN0IFZlY3RvckRhdGEgJlZEKSA6IFZlY3QoVkQuVmVjdCkge30KKyAgfTsKKworcHVibGljOgorICBDb3B5T25Xcml0ZVZlY3RvcigpID0gZGVmYXVsdDsKKyAgQ29weU9uV3JpdGVWZWN0b3IoQ29weU9uV3JpdGVWZWN0b3IgJiZWKSA6IERhdGEoVi5EYXRhKSB7IFYuRGF0YSA9IG51bGxwdHI7IH0KKworICBDb3B5T25Xcml0ZVZlY3RvciAmb3BlcmF0b3I9KENvcHlPbldyaXRlVmVjdG9yICYmVikgeworICAgIGRlc3Ryb3koKTsKKyAgICBEYXRhID0gVi5EYXRhOworICAgIFYuRGF0YSA9IG51bGxwdHI7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gTm8gY29weSBjb25zdHJ1Y3RvciBvciBjb3B5IGFzc2lnbm1lbnQuICBVc2UgY2xvbmUoKSB3aXRoIG1vdmUgYXNzaWdubWVudC4KKyAgQ29weU9uV3JpdGVWZWN0b3IoY29uc3QgQ29weU9uV3JpdGVWZWN0b3IgJikgPSBkZWxldGU7CisgIENvcHlPbldyaXRlVmVjdG9yICZvcGVyYXRvcj0oY29uc3QgQ29weU9uV3JpdGVWZWN0b3IgJikgPSBkZWxldGU7CisKKyAgfkNvcHlPbldyaXRlVmVjdG9yKCkgeyBkZXN0cm95KCk7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBob2xkcyBhIHZhbGlkIHZlY3Rvci4KKyAgYm9vbCB2YWxpZCgpIGNvbnN0ICB7IHJldHVybiBEYXRhOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdmVjdG9yIGlzIHdyaXRhYmxlLgorICBib29sIHdyaXRhYmxlKCkgY29uc3QgeyByZXR1cm4gRGF0YSAmJiBEYXRhLT5OdW1SZWZzID09IDE7IH0KKworICAvLyBJZiB0aGlzIHZlY3RvciBpcyBub3QgdmFsaWQsIGluaXRpYWxpemUgaXQgdG8gYSB2YWxpZCB2ZWN0b3IuCisgIHZvaWQgaW5pdCgpIHsKKyAgICBpZiAoIURhdGEpIHsKKyAgICAgIERhdGEgPSBuZXcgVmVjdG9yRGF0YSgpOworICAgIH0KKyAgfQorCisgIC8vIERlc3Ryb3kgdGhpcyB2ZWN0b3I7IHRodXMgbWFraW5nIGl0IGludmFsaWQuCisgIHZvaWQgZGVzdHJveSgpIHsKKyAgICBpZiAoIURhdGEpCisgICAgICByZXR1cm47CisgICAgaWYgKERhdGEtPk51bVJlZnMgPD0gMSkKKyAgICAgIGRlbGV0ZSBEYXRhOworICAgIGVsc2UKKyAgICAgIC0tRGF0YS0+TnVtUmVmczsKKyAgICBEYXRhID0gbnVsbHB0cjsKKyAgfQorCisgIC8vIE1ha2UgdGhpcyB2ZWN0b3Igd3JpdGFibGUsIGNyZWF0aW5nIGEgY29weSBpZiBuZWVkZWQuCisgIHZvaWQgbWFrZVdyaXRhYmxlKCkgeworICAgIGlmICghRGF0YSkgeworICAgICAgRGF0YSA9IG5ldyBWZWN0b3JEYXRhKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChEYXRhLT5OdW1SZWZzID09IDEpCisgICAgICByZXR1cm47ICAgLy8gYWxyZWFkeSB3cml0ZWFibGUuCisgICAgLS1EYXRhLT5OdW1SZWZzOworICAgIERhdGEgPSBuZXcgVmVjdG9yRGF0YSgqRGF0YSk7CisgIH0KKworICAvLyBDcmVhdGUgYSBsYXp5IGNvcHkgb2YgdGhpcyB2ZWN0b3IuCisgIENvcHlPbldyaXRlVmVjdG9yIGNsb25lKCkgeyByZXR1cm4gQ29weU9uV3JpdGVWZWN0b3IoRGF0YSk7IH0KKworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IHR5cGVuYW1lIHN0ZDo6dmVjdG9yPFQ+Ojpjb25zdF9pdGVyYXRvcjsKKworICBjb25zdCBzdGQ6OnZlY3RvcjxUPiAmZWxlbWVudHMoKSBjb25zdCB7IHJldHVybiBEYXRhLT5WZWN0OyB9CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBlbGVtZW50cygpLmNiZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGVsZW1lbnRzKCkuY2VuZCgpOyB9CisKKyAgY29uc3QgVCYgb3BlcmF0b3JbXSh1bnNpZ25lZCBpKSBjb25zdCB7IHJldHVybiBlbGVtZW50cygpW2ldOyB9CisKKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIERhdGEgPyBlbGVtZW50cygpLnNpemUoKSA6IDA7IH0KKworICAvLyBSZXR1cm4gdHJ1ZSBpZiBWIGFuZCB0aGlzIHZlY3RvciByZWZlciB0byB0aGUgc2FtZSBkYXRhLgorICBib29sIHNhbWVBcyhjb25zdCBDb3B5T25Xcml0ZVZlY3RvciAmVikgY29uc3QgeyByZXR1cm4gRGF0YSA9PSBWLkRhdGE7IH0KKworICAvLyBDbGVhciB2ZWN0b3IuICBUaGUgdmVjdG9yIG11c3QgYmUgd3JpdGFibGUuCisgIHZvaWQgY2xlYXIoKSB7CisgICAgYXNzZXJ0KHdyaXRhYmxlKCkgJiYgIlZlY3RvciBpcyBub3Qgd3JpdGFibGUhIik7CisgICAgRGF0YS0+VmVjdC5jbGVhcigpOworICB9CisKKyAgLy8gUHVzaCBhIG5ldyBlbGVtZW50IG9udG8gdGhlIGVuZC4gIFRoZSB2ZWN0b3IgbXVzdCBiZSB3cml0YWJsZS4KKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgVCAmRWxlbSkgeworICAgIGFzc2VydCh3cml0YWJsZSgpICYmICJWZWN0b3IgaXMgbm90IHdyaXRhYmxlISIpOworICAgIERhdGEtPlZlY3QucHVzaF9iYWNrKEVsZW0pOworICB9CisKKyAgLy8gR2V0cyBhIG11dGFibGUgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IGluZGV4KGkpLgorICAvLyBUaGUgdmVjdG9yIG11c3QgYmUgd3JpdGFibGUuCisgIFQmIGVsZW0odW5zaWduZWQgaSkgeworICAgIGFzc2VydCh3cml0YWJsZSgpICYmICJWZWN0b3IgaXMgbm90IHdyaXRhYmxlISIpOworICAgIHJldHVybiBEYXRhLT5WZWN0W2ldOworICB9CisKKyAgLy8gRHJvcHMgZWxlbWVudHMgZnJvbSB0aGUgYmFjayB1bnRpbCB0aGUgdmVjdG9yIGhhcyBzaXplIGkuCisgIHZvaWQgZG93bnNpemUodW5zaWduZWQgaSkgeworICAgIGFzc2VydCh3cml0YWJsZSgpICYmICJWZWN0b3IgaXMgbm90IHdyaXRhYmxlISIpOworICAgIERhdGEtPlZlY3QuZXJhc2UoRGF0YS0+VmVjdC5iZWdpbigpICsgaSwgRGF0YS0+VmVjdC5lbmQoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgQ29weU9uV3JpdGVWZWN0b3IoVmVjdG9yRGF0YSAqRCkgOiBEYXRhKEQpIHsKKyAgICBpZiAoIURhdGEpCisgICAgICByZXR1cm47CisgICAgKytEYXRhLT5OdW1SZWZzOworICB9CisKKyAgVmVjdG9yRGF0YSAqRGF0YSA9IG51bGxwdHI7Cit9OworCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgc3MsIGNvbnN0IFN0cmluZ1JlZiBzdHIpIHsKKyAgcmV0dXJuIHNzLndyaXRlKHN0ci5kYXRhKCksIHN0ci5zaXplKCkpOworfQorCit9IC8vIG5hbWVzcGFjZSB0aHJlYWRTYWZldHkKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1RIUkVBRF9TQUZFVFlfVVRJTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9VbmluaXRpYWxpemVkVmFsdWVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9VbmluaXRpYWxpemVkVmFsdWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkODllMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL1VuaW5pdGlhbGl6ZWRWYWx1ZXMuaApAQCAtMCwwICsxLDEzMiBAQAorLy89LSBVbmluaXRpYWxpemVkVmFsdWVzLmggLSBGaW5kaW5nIHVzZXMgb2YgdW5pbml0aWFsaXplZCB2YWx1ZXMgLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBBUElzIGZvciBpbnZva2luZyBhbmQgcmVwb3J0ZWQgdW5pbml0aWFsaXplZCB2YWx1ZXMKKy8vIHdhcm5pbmdzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BTkFMWVNJU19BTkFMWVNFU19VTklOSVRJQUxJWkVEVkFMVUVTX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BTkFMWVNJU19BTkFMWVNFU19VTklOSVRJQUxJWkVEVkFMVUVTX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBbmFseXNpc0RlY2xDb250ZXh0OworY2xhc3MgQ0ZHOworY2xhc3MgRGVjbENvbnRleHQ7CitjbGFzcyBFeHByOworY2xhc3MgU3RtdDsKK2NsYXNzIFZhckRlY2w7CisKKy8vLyBBIHVzZSBvZiBhIHZhcmlhYmxlLCB3aGljaCBtaWdodCBiZSB1bmluaXRpYWxpemVkLgorY2xhc3MgVW5pbml0VXNlIHsKK3B1YmxpYzoKKyAgc3RydWN0IEJyYW5jaCB7CisgICAgY29uc3QgU3RtdCAqVGVybWluYXRvcjsKKyAgICB1bnNpZ25lZCBPdXRwdXQ7CisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBUaGUgZXhwcmVzc2lvbiB3aGljaCB1c2VzIHRoaXMgdmFyaWFibGUuCisgIGNvbnN0IEV4cHIgKlVzZXI7CisKKyAgLy8vIElzIHRoaXMgdXNlIHVuaW5pdGlhbGl6ZWQgd2hlbmV2ZXIgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZD8KKyAgYm9vbCBVbmluaXRBZnRlckNhbGwgPSBmYWxzZTsKKworICAvLy8gSXMgdGhpcyB1c2UgdW5pbml0aWFsaXplZCB3aGVuZXZlciB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gaXMgcmVhY2hlZD8KKyAgYm9vbCBVbmluaXRBZnRlckRlY2wgPSBmYWxzZTsKKworICAvLy8gRG9lcyB0aGlzIHVzZSBhbHdheXMgc2VlIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWU/CisgIGJvb2wgQWx3YXlzVW5pbml0OworCisgIC8vLyBUaGlzIHVzZSBpcyBhbHdheXMgdW5pbml0aWFsaXplZCBpZiBpdCBvY2N1cnMgYWZ0ZXIgYW55IG9mIHRoZXNlIGJyYW5jaGVzCisgIC8vLyBpcyB0YWtlbi4KKyAgU21hbGxWZWN0b3I8QnJhbmNoLCAyPiBVbmluaXRCcmFuY2hlczsKKworcHVibGljOgorICBVbmluaXRVc2UoY29uc3QgRXhwciAqVXNlciwgYm9vbCBBbHdheXNVbmluaXQpCisgICAgICA6IFVzZXIoVXNlciksIEFsd2F5c1VuaW5pdChBbHdheXNVbmluaXQpIHt9CisKKyAgdm9pZCBhZGRVbmluaXRCcmFuY2goQnJhbmNoIEIpIHsKKyAgICBVbmluaXRCcmFuY2hlcy5wdXNoX2JhY2soQik7CisgIH0KKworICB2b2lkIHNldFVuaW5pdEFmdGVyQ2FsbCgpIHsgVW5pbml0QWZ0ZXJDYWxsID0gdHJ1ZTsgfQorICB2b2lkIHNldFVuaW5pdEFmdGVyRGVjbCgpIHsgVW5pbml0QWZ0ZXJEZWNsID0gdHJ1ZTsgfQorCisgIC8vLyBHZXQgdGhlIGV4cHJlc3Npb24gY29udGFpbmluZyB0aGUgdW5pbml0aWFsaXplZCB1c2UuCisgIGNvbnN0IEV4cHIgKmdldFVzZXIoKSBjb25zdCB7IHJldHVybiBVc2VyOyB9CisKKyAgLy8vIFRoZSBraW5kIG9mIHVuaW5pdGlhbGl6ZWQgdXNlLgorICBlbnVtIEtpbmQgeworICAgIC8vLyBUaGUgdXNlIG1pZ2h0IGJlIHVuaW5pdGlhbGl6ZWQuCisgICAgTWF5YmUsCisKKyAgICAvLy8gVGhlIHVzZSBpcyB1bmluaXRpYWxpemVkIHdoZW5ldmVyIGEgY2VydGFpbiBicmFuY2ggaXMgdGFrZW4uCisgICAgU29tZXRpbWVzLAorCisgICAgLy8vIFRoZSB1c2UgaXMgdW5pbml0aWFsaXplZCB0aGUgZmlyc3QgdGltZSBpdCBpcyByZWFjaGVkIGFmdGVyIHdlIHJlYWNoCisgICAgLy8vIHRoZSB2YXJpYWJsZSdzIGRlY2xhcmF0aW9uLgorICAgIEFmdGVyRGVjbCwKKworICAgIC8vLyBUaGUgdXNlIGlzIHVuaW5pdGlhbGl6ZWQgdGhlIGZpcnN0IHRpbWUgaXQgaXMgcmVhY2hlZCBhZnRlciB0aGUgZnVuY3Rpb24KKyAgICAvLy8gaXMgY2FsbGVkLgorICAgIEFmdGVyQ2FsbCwKKworICAgIC8vLyBUaGUgdXNlIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkLgorICAgIEFsd2F5cworICB9OworCisgIC8vLyBHZXQgdGhlIGtpbmQgb2YgdW5pbml0aWFsaXplZCB1c2UuCisgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQWx3YXlzVW5pbml0ID8gQWx3YXlzIDoKKyAgICAgICAgICAgVW5pbml0QWZ0ZXJDYWxsID8gQWZ0ZXJDYWxsIDoKKyAgICAgICAgICAgVW5pbml0QWZ0ZXJEZWNsID8gQWZ0ZXJEZWNsIDoKKyAgICAgICAgICAgIWJyYW5jaF9lbXB0eSgpID8gU29tZXRpbWVzIDogTWF5YmU7CisgIH0KKworICB1c2luZyBicmFuY2hfaXRlcmF0b3IgPSBTbWFsbFZlY3RvckltcGw8QnJhbmNoPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgLy8vIEJyYW5jaGVzIHdoaWNoIGluZXZpdGFibHkgcmVzdWx0IGluIHRoZSB2YXJpYWJsZSBiZWluZyB1c2VkIHVuaW5pdGlhbGl6ZWQuCisgIGJyYW5jaF9pdGVyYXRvciBicmFuY2hfYmVnaW4oKSBjb25zdCB7IHJldHVybiBVbmluaXRCcmFuY2hlcy5iZWdpbigpOyB9CisgIGJyYW5jaF9pdGVyYXRvciBicmFuY2hfZW5kKCkgY29uc3QgeyByZXR1cm4gVW5pbml0QnJhbmNoZXMuZW5kKCk7IH0KKyAgYm9vbCBicmFuY2hfZW1wdHkoKSBjb25zdCB7IHJldHVybiBVbmluaXRCcmFuY2hlcy5lbXB0eSgpOyB9Cit9OworCitjbGFzcyBVbmluaXRWYXJpYWJsZXNIYW5kbGVyIHsKK3B1YmxpYzoKKyAgVW5pbml0VmFyaWFibGVzSGFuZGxlcigpID0gZGVmYXVsdDsKKyAgdmlydHVhbCB+VW5pbml0VmFyaWFibGVzSGFuZGxlcigpOworCisgIC8vLyBDYWxsZWQgd2hlbiB0aGUgdW5pbml0aWFsaXplZCB2YXJpYWJsZSBpcyB1c2VkIGF0IHRoZSBnaXZlbiBleHByZXNzaW9uLgorICB2aXJ0dWFsIHZvaWQgaGFuZGxlVXNlT2ZVbmluaXRWYXJpYWJsZShjb25zdCBWYXJEZWNsICp2ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5pbml0VXNlICZ1c2UpIHt9CisKKyAgLy8vIENhbGxlZCB3aGVuIHRoZSB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGFuYWx5c2lzIGRldGVjdHMgdGhlCisgIC8vLyBpZGlvbSAnaW50IHggPSB4Jy4gIEFsbCBvdGhlciB1c2VzIG9mICd4JyB3aXRoaW4gdGhlIGluaXRpYWxpemVyCisgIC8vLyBhcmUgaGFuZGxlZCBieSBoYW5kbGVVc2VPZlVuaW5pdFZhcmlhYmxlLgorICB2aXJ0dWFsIHZvaWQgaGFuZGxlU2VsZkluaXQoY29uc3QgVmFyRGVjbCAqdmQpIHt9Cit9OworCitzdHJ1Y3QgVW5pbml0VmFyaWFibGVzQW5hbHlzaXNTdGF0cyB7CisgIHVuc2lnbmVkIE51bVZhcmlhYmxlc0FuYWx5emVkOworICB1bnNpZ25lZCBOdW1CbG9ja1Zpc2l0czsKK307CisKK3ZvaWQgcnVuVW5pbml0aWFsaXplZFZhcmlhYmxlc0FuYWx5c2lzKGNvbnN0IERlY2xDb250ZXh0ICZkYywgY29uc3QgQ0ZHICZjZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFseXNpc0RlY2xDb250ZXh0ICZhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaW5pdFZhcmlhYmxlc0hhbmRsZXIgJmhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmluaXRWYXJpYWJsZXNBbmFseXNpc1N0YXRzICZzdGF0cyk7CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FOQUxZU0lTX0FOQUxZU0VTX1VOSU5JVElBTElaRURWQUxVRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzaXNEZWNsQ29udGV4dC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzaXNEZWNsQ29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OGQ4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNpc0RlY2xDb250ZXh0LmgKQEAgLTAsMCArMSw1MDkgQEAKKy8vIEFuYWx5c2lzRGVjbENvbnRleHQuaCAtIEFuYWx5c2lzIGNvbnRleHQgZm9yIFBhdGggU2VucyBhbmFseXNpcyAtKi0gQysrIC0qLS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgQW5hbHlzaXNEZWNsQ29udGV4dCwgYSBjbGFzcyB0aGF0IG1hbmFnZXMgdGhlIGFuYWx5c2lzCisvLyBjb250ZXh0IGRhdGEgZm9yIHBhdGggc2Vuc2l0aXZlIGFuYWx5c2lzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BTkFMWVNJU19BTkFMWVNJU0RFQ0xDT05URVhUX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BTkFMWVNJU19BTkFMWVNJU0RFQ0xDT05URVhUX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQmFzZS5oIgorI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0JvZHlGYXJtLmgiCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQ0ZHLmgiCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQ29kZUluamVjdG9yLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBbmFseXNpc0RlY2xDb250ZXh0TWFuYWdlcjsKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBCbG9ja0RlY2w7CitjbGFzcyBCbG9ja0ludm9jYXRpb25Db250ZXh0OworY2xhc3MgQ0ZHUmV2ZXJzZUJsb2NrUmVhY2hhYmlsaXR5QW5hbHlzaXM7CitjbGFzcyBDRkdTdG10TWFwOworY2xhc3MgSW1wbGljaXRQYXJhbURlY2w7CitjbGFzcyBMb2NhdGlvbkNvbnRleHQ7CitjbGFzcyBMb2NhdGlvbkNvbnRleHRNYW5hZ2VyOworY2xhc3MgUGFyZW50TWFwOworY2xhc3MgUHNldWRvQ29uc3RhbnRBbmFseXNpczsKK2NsYXNzIFN0YWNrRnJhbWVDb250ZXh0OworY2xhc3MgU3RtdDsKK2NsYXNzIFZhckRlY2w7CisKKy8vLyBUaGUgYmFzZSBjbGFzcyBvZiBhIGhpZXJhcmNoeSBvZiBvYmplY3RzIHJlcHJlc2VudGluZyBhbmFseXNlcyB0aWVkCisvLy8gdG8gQW5hbHlzaXNEZWNsQ29udGV4dC4KK2NsYXNzIE1hbmFnZWRBbmFseXNpcyB7Citwcm90ZWN0ZWQ6CisgIE1hbmFnZWRBbmFseXNpcygpID0gZGVmYXVsdDsKKworcHVibGljOgorICB2aXJ0dWFsIH5NYW5hZ2VkQW5hbHlzaXMoKTsKKworICAvLyBTdWJjbGFzc2VzIG5lZWQgdG8gaW1wbGVtZW50OgorICAvLworICAvLyAgc3RhdGljIGNvbnN0IHZvaWQgKmdldFRhZygpOworICAvLworICAvLyBXaGljaCByZXR1cm5zIGEgZml4ZWQgcG9pbnRlciBhZGRyZXNzIHRvIGRpc3Rpbmd1aXNoIGNsYXNzZXMgb2YKKyAgLy8gYW5hbHlzaXMgb2JqZWN0cy4gIFRoZXkgYWxzbyBuZWVkIHRvIGltcGxlbWVudDoKKyAgLy8KKyAgLy8gIHN0YXRpYyBbRGVyaXZlZCpdIGNyZWF0ZShBbmFseXNpc0RlY2xDb250ZXh0ICZDdHgpOworICAvLworICAvLyB3aGljaCBjcmVhdGVzIHRoZSBhbmFseXNpcyBvYmplY3QgZ2l2ZW4gYW4gQW5hbHlzaXNEZWNsQ29udGV4dC4KK307CisKKy8vLyBBbmFseXNpc0RlY2xDb250ZXh0IGNvbnRhaW5zIHRoZSBjb250ZXh0IGRhdGEgZm9yIHRoZSBmdW5jdGlvbiBvciBtZXRob2QKKy8vLyB1bmRlciBhbmFseXNpcy4KK2NsYXNzIEFuYWx5c2lzRGVjbENvbnRleHQgeworICAvLy8gQmFja3BvaW50IHRvIHRoZSBBbmFseXNpc01hbmFnZXIgb2JqZWN0IHRoYXQgY3JlYXRlZCB0aGlzCisgIC8vLyBBbmFseXNpc0RlY2xDb250ZXh0LiBUaGlzIG1heSBiZSBudWxsLgorICBBbmFseXNpc0RlY2xDb250ZXh0TWFuYWdlciAqTWFuYWdlcjsKKworICBjb25zdCBEZWNsICogY29uc3QgRDsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZHPiBjZmcsIGNvbXBsZXRlQ0ZHOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZHU3RtdE1hcD4gY2ZnU3RtdE1hcDsKKworICBDRkc6OkJ1aWxkT3B0aW9ucyBjZmdCdWlsZE9wdGlvbnM7CisgIENGRzo6QnVpbGRPcHRpb25zOjpGb3JjZWRCbGtFeHBycyAqZm9yY2VkQmxrRXhwcnMgPSBudWxscHRyOworCisgIGJvb2wgYnVpbHRDRkcgPSBmYWxzZTsKKyAgYm9vbCBidWlsdENvbXBsZXRlQ0ZHID0gZmFsc2U7CisgIHN0ZDo6dW5pcXVlX3B0cjxQYXJlbnRNYXA+IFBNOworICBzdGQ6OnVuaXF1ZV9wdHI8UHNldWRvQ29uc3RhbnRBbmFseXNpcz4gUENBOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZHUmV2ZXJzZUJsb2NrUmVhY2hhYmlsaXR5QW5hbHlzaXM+IENGQTsKKworICBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yIEE7CisKKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQmxvY2tEZWNsICosdm9pZCAqPiAqUmVmZXJlbmNlZEJsb2NrVmFycyA9IG51bGxwdHI7CisKKyAgdm9pZCAqTWFuYWdlZEFuYWx5c2VzID0gbnVsbHB0cjsKKworcHVibGljOgorICBBbmFseXNpc0RlY2xDb250ZXh0KEFuYWx5c2lzRGVjbENvbnRleHRNYW5hZ2VyICpNZ3IsCisgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsICpEKTsKKworICBBbmFseXNpc0RlY2xDb250ZXh0KEFuYWx5c2lzRGVjbENvbnRleHRNYW5hZ2VyICpNZ3IsCisgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsICpELAorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZHOjpCdWlsZE9wdGlvbnMgJkJ1aWxkT3B0aW9ucyk7CisKKyAgfkFuYWx5c2lzRGVjbENvbnRleHQoKTsKKworICBBU1RDb250ZXh0ICZnZXRBU1RDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gRC0+Z2V0QVNUQ29udGV4dCgpOyB9CisgIGNvbnN0IERlY2wgKmdldERlY2woKSBjb25zdCB7IHJldHVybiBEOyB9CisKKyAgLy8vIFJldHVybiB0aGUgQW5hbHlzaXNEZWNsQ29udGV4dE1hbmFnZXIgKGlmIGFueSkgdGhhdCBjcmVhdGVkCisgIC8vLyB0aGlzIEFuYWx5c2lzRGVjbENvbnRleHQuCisgIEFuYWx5c2lzRGVjbENvbnRleHRNYW5hZ2VyICpnZXRNYW5hZ2VyKCkgY29uc3QgeworICAgIHJldHVybiBNYW5hZ2VyOworICB9CisgIAorICAvLy8gUmV0dXJuIHRoZSBidWlsZCBvcHRpb25zIHVzZWQgdG8gY29uc3RydWN0IHRoZSBDRkcuCisgIENGRzo6QnVpbGRPcHRpb25zICZnZXRDRkdCdWlsZE9wdGlvbnMoKSB7CisgICAgcmV0dXJuIGNmZ0J1aWxkT3B0aW9uczsKKyAgfQorCisgIGNvbnN0IENGRzo6QnVpbGRPcHRpb25zICZnZXRDRkdCdWlsZE9wdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNmZ0J1aWxkT3B0aW9uczsKKyAgfQorCisgIC8vLyBnZXRBZGRFSEVkZ2VzIC0gUmV0dXJuIHRydWUgaWZmIHdlIGFyZSBhZGRpbmcgZXhjZXB0aW9uYWwgZWRnZXMgZnJvbQorICAvLy8gY2FsbEV4cHJzLiAgSWYgdGhpcyBpcyBmYWxzZSwgdGhlbiB0cnkvY2F0Y2ggc3RhdGVtZW50cyBhbmQgYmxvY2tzCisgIC8vLyByZWFjaGFibGUgZnJvbSB0aGVtIGNhbiBhcHBlYXIgdG8gYmUgZGVhZCBpbiB0aGUgQ0ZHLCBhbmFseXNpcyBwYXNzZXMgbXVzdAorICAvLy8gY29wZSB3aXRoIHRoYXQuCisgIGJvb2wgZ2V0QWRkRUhFZGdlcygpIGNvbnN0IHsgcmV0dXJuIGNmZ0J1aWxkT3B0aW9ucy5BZGRFSEVkZ2VzOyB9CisgIGJvb2wgZ2V0VXNlVW5vcHRpbWl6ZWRDRkcoKSBjb25zdCB7CisgICAgICByZXR1cm4gIWNmZ0J1aWxkT3B0aW9ucy5QcnVuZVRyaXZpYWxseUZhbHNlRWRnZXM7CisgIH0KKyAgYm9vbCBnZXRBZGRJbXBsaWNpdER0b3JzKCkgY29uc3QgeyByZXR1cm4gY2ZnQnVpbGRPcHRpb25zLkFkZEltcGxpY2l0RHRvcnM7IH0KKyAgYm9vbCBnZXRBZGRJbml0aWFsaXplcnMoKSBjb25zdCB7IHJldHVybiBjZmdCdWlsZE9wdGlvbnMuQWRkSW5pdGlhbGl6ZXJzOyB9CisKKyAgdm9pZCByZWdpc3RlckZvcmNlZEJsb2NrRXhwcmVzc2lvbihjb25zdCBTdG10ICpzdG10KTsKKyAgY29uc3QgQ0ZHQmxvY2sgKmdldEJsb2NrRm9yUmVnaXN0ZXJlZEV4cHJlc3Npb24oY29uc3QgU3RtdCAqc3RtdCk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGJvZHkgb2YgdGhlIERlY2xhcmF0aW9uLgorICBTdG10ICpnZXRCb2R5KCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGJvZHkgb2YgdGhlIERlY2xhcmF0aW9uLgorICAvLy8gXHBhcmFtW291dF0gSXNBdXRvc3ludGhlc2l6ZWQgU3BlY2lmaWVzIGlmIHRoZSBib2R5IGlzIGF1dG8tZ2VuZXJhdGVkCisgIC8vLyAgICAgICAgICAgICBieSB0aGUgQm9keUZhcm0uCisgIFN0bXQgKmdldEJvZHkoYm9vbCAmSXNBdXRvc3ludGhlc2l6ZWQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQ2hlY2tzIGlmIHRoZSBib2R5IG9mIHRoZSBEZWNsIGlzIGdlbmVyYXRlZCBieSB0aGUgQm9keUZhcm0uCisgIC8vLworICAvLy8gTm90ZSwgdGhlIGxvb2t1cCBpcyBub3QgZnJlZS4gV2UgYXJlIGdvaW5nIHRvIGNhbGwgZ2V0Qm9keSBiZWhpbmQKKyAgLy8vIHRoZSBzY2VuZXMuCisgIC8vLyBcc2EgZ2V0Qm9keQorICBib29sIGlzQm9keUF1dG9zeW50aGVzaXplZCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQ2hlY2tzIGlmIHRoZSBib2R5IG9mIHRoZSBEZWNsIGlzIGdlbmVyYXRlZCBieSB0aGUgQm9keUZhcm0gZnJvbSBhCisgIC8vLyBtb2RlbCBmaWxlLgorICAvLy8KKyAgLy8vIE5vdGUsIHRoZSBsb29rdXAgaXMgbm90IGZyZWUuIFdlIGFyZSBnb2luZyB0byBjYWxsIGdldEJvZHkgYmVoaW5kCisgIC8vLyB0aGUgc2NlbmVzLgorICAvLy8gXHNhIGdldEJvZHkKKyAgYm9vbCBpc0JvZHlBdXRvc3ludGhlc2l6ZWRGcm9tTW9kZWxGaWxlKCkgY29uc3Q7CisKKyAgQ0ZHICpnZXRDRkcoKTsKKworICBDRkdTdG10TWFwICpnZXRDRkdTdG10TWFwKCk7CisKKyAgQ0ZHUmV2ZXJzZUJsb2NrUmVhY2hhYmlsaXR5QW5hbHlzaXMgKmdldENGR1JlYWNoYWJsaXR5QW5hbHlzaXMoKTsKKworICAvLy8gUmV0dXJuIGEgdmVyc2lvbiBvZiB0aGUgQ0ZHIHdpdGhvdXQgYW55IGVkZ2VzIHBydW5lZC4KKyAgQ0ZHICpnZXRVbm9wdGltaXplZENGRygpOworCisgIHZvaWQgZHVtcENGRyhib29sIFNob3dDb2xvcnMpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHdlIGhhdmUgYnVpbHQgYSBDRkcgZm9yIHRoaXMgYW5hbHlzaXMgY29udGV4dC4KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgY29ycmVzcG9uZCB0byB3aGV0aGVyIG9yIG5vdCBhIHZhbGlkIENGRyBleGlzdHMsIGl0CisgIC8vLyBjb3JyZXNwb25kcyB0byB3aGV0aGVyIHdlICphdHRlbXB0ZWQqIHRvIGJ1aWxkIG9uZS4KKyAgYm9vbCBpc0NGR0J1aWx0KCkgY29uc3QgeyByZXR1cm4gYnVpbHRDRkc7IH0KKworICBQYXJlbnRNYXAgJmdldFBhcmVudE1hcCgpOworICBQc2V1ZG9Db25zdGFudEFuYWx5c2lzICpnZXRQc2V1ZG9Db25zdGFudEFuYWx5c2lzKCk7CisKKyAgdXNpbmcgcmVmZXJlbmNlZF9kZWNsc19pdGVyYXRvciA9IGNvbnN0IFZhckRlY2wgKiBjb25zdCAqOworCisgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHJlZmVyZW5jZWRfZGVjbHNfaXRlcmF0b3I+CisgIGdldFJlZmVyZW5jZWRCbG9ja1ZhcnMoY29uc3QgQmxvY2tEZWNsICpCRCk7CisKKyAgLy8vIFJldHVybiB0aGUgSW1wbGljaXRQYXJhbURlY2wqIGFzc29jaWF0ZWQgd2l0aCAnc2VsZicgaWYgdGhpcworICAvLy8gQW5hbHlzaXNEZWNsQ29udGV4dCB3cmFwcyBhbiBPYmpDTWV0aG9kRGVjbC4gIFJldHVybnMgTlVMTCBvdGhlcndpc2UuCisgIGNvbnN0IEltcGxpY2l0UGFyYW1EZWNsICpnZXRTZWxmRGVjbCgpIGNvbnN0OworCisgIGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpnZXRTdGFja0ZyYW1lKExvY2F0aW9uQ29udGV4dCBjb25zdCAqUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdG10ICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkdCbG9jayAqQmxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJZHgpOworICAKKyAgY29uc3QgQmxvY2tJbnZvY2F0aW9uQ29udGV4dCAqCisgIGdldEJsb2NrSW52b2NhdGlvbkNvbnRleHQoY29uc3QgTG9jYXRpb25Db250ZXh0ICpwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvY2tEZWNsICpCRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpDb250ZXh0RGF0YSk7CisKKyAgLy8vIFJldHVybiB0aGUgc3BlY2lmaWVkIGFuYWx5c2lzIG9iamVjdCwgbGF6aWx5IHJ1bm5pbmcgdGhlIGFuYWx5c2lzIGlmCisgIC8vLyBuZWNlc3NhcnkuICBSZXR1cm4gTlVMTCBpZiB0aGUgYW5hbHlzaXMgY291bGQgbm90IHJ1bi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFQgKmdldEFuYWx5c2lzKCkgeworICAgIGNvbnN0IHZvaWQgKnRhZyA9IFQ6OmdldFRhZygpOworICAgIE1hbmFnZWRBbmFseXNpcyAqJmRhdGEgPSBnZXRBbmFseXNpc0ltcGwodGFnKTsKKyAgICBpZiAoIWRhdGEpIHsKKyAgICAgIGRhdGEgPSBUOjpjcmVhdGUoKnRoaXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPihkYXRhKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHJvb3QgbmFtZXNwYWNlIG9mIHRoZSBnaXZlbiBkZWNsYXJhdGlvbiBpcyB0aGUgJ3N0ZCcKKyAgLy8vIEMrKyBuYW1lc3BhY2UuCisgIHN0YXRpYyBib29sIGlzSW5TdGROYW1lc3BhY2UoY29uc3QgRGVjbCAqRCk7CisKK3ByaXZhdGU6CisgIE1hbmFnZWRBbmFseXNpcyAqJmdldEFuYWx5c2lzSW1wbChjb25zdCB2b2lkKiB0YWcpOworCisgIExvY2F0aW9uQ29udGV4dE1hbmFnZXIgJmdldExvY2F0aW9uQ29udGV4dE1hbmFnZXIoKTsKK307CisKK2NsYXNzIExvY2F0aW9uQ29udGV4dCA6IHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CitwdWJsaWM6CisgIGVudW0gQ29udGV4dEtpbmQgeyBTdGFja0ZyYW1lLCBTY29wZSwgQmxvY2sgfTsKKworcHJpdmF0ZToKKyAgQ29udGV4dEtpbmQgS2luZDsKKworICAvLyBBbmFseXNpc0RlY2xDb250ZXh0IGNhbid0IGJlIGNvbnN0IHNpbmNlIHNvbWUgbWV0aG9kcyBtYXkgbW9kaWZ5IGl0cworICAvLyBtZW1iZXIuCisgIEFuYWx5c2lzRGVjbENvbnRleHQgKkN0eDsKKworICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKlBhcmVudDsKKworcHJvdGVjdGVkOgorICBMb2NhdGlvbkNvbnRleHQoQ29udGV4dEtpbmQgaywgQW5hbHlzaXNEZWNsQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpwYXJlbnQpCisgICAgICA6IEtpbmQoayksIEN0eChjdHgpLCBQYXJlbnQocGFyZW50KSB7fQorCitwdWJsaWM6CisgIHZpcnR1YWwgfkxvY2F0aW9uQ29udGV4dCgpOworCisgIENvbnRleHRLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgQW5hbHlzaXNEZWNsQ29udGV4dCAqZ2V0QW5hbHlzaXNEZWNsQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIEN0eDsgfQorCisgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gUGFyZW50OyB9CisKKyAgYm9vbCBpc1BhcmVudE9mKGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEMpIGNvbnN0OworCisgIGNvbnN0IERlY2wgKmdldERlY2woKSBjb25zdCB7IHJldHVybiBnZXRBbmFseXNpc0RlY2xDb250ZXh0KCktPmdldERlY2woKTsgfQorCisgIENGRyAqZ2V0Q0ZHKCkgY29uc3QgeyByZXR1cm4gZ2V0QW5hbHlzaXNEZWNsQ29udGV4dCgpLT5nZXRDRkcoKTsgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBUICpnZXRBbmFseXNpcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QW5hbHlzaXNEZWNsQ29udGV4dCgpLT5nZXRBbmFseXNpczxUPigpOworICB9CisKKyAgUGFyZW50TWFwICZnZXRQYXJlbnRNYXAoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEFuYWx5c2lzRGVjbENvbnRleHQoKS0+Z2V0UGFyZW50TWFwKCk7CisgIH0KKworICBjb25zdCBJbXBsaWNpdFBhcmFtRGVjbCAqZ2V0U2VsZkRlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIEN0eC0+Z2V0U2VsZkRlY2woKTsKKyAgfQorCisgIGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpnZXRDdXJyZW50U3RhY2tGcmFtZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY3VycmVudCBMb2NhdGlvbkNvbnRleHQgaGFzIG5vIGNhbGxlciBjb250ZXh0LgorICB2aXJ0dWFsIGJvb2wgaW5Ub3BGcmFtZSgpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSA9IDA7CisKKyAgdm9pZCBkdW1wU3RhY2soCisgICAgICByYXdfb3N0cmVhbSAmT1MsIFN0cmluZ1JlZiBJbmRlbnQgPSB7fSwgY29uc3QgY2hhciAqTkwgPSAiXG4iLAorICAgICAgY29uc3QgY2hhciAqU2VwID0gIiIsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgTG9jYXRpb25Db250ZXh0ICopPiBwcmludE1vcmVJbmZvUGVyQ29udGV4dCA9CisgICAgICAgICAgW10oY29uc3QgTG9jYXRpb25Db250ZXh0ICopIHt9KSBjb25zdDsKKyAgdm9pZCBkdW1wU3RhY2soKSBjb25zdDsKKworcHVibGljOgorICBzdGF0aWMgdm9pZCBQcm9maWxlQ29tbW9uKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHRLaW5kIGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWx5c2lzRGVjbENvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhKTsKK307CisKK2NsYXNzIFN0YWNrRnJhbWVDb250ZXh0IDogcHVibGljIExvY2F0aW9uQ29udGV4dCB7CisgIGZyaWVuZCBjbGFzcyBMb2NhdGlvbkNvbnRleHRNYW5hZ2VyOworCisgIC8vIFRoZSBjYWxsc2l0ZSB3aGVyZSB0aGlzIHN0YWNrIGZyYW1lIGlzIGVzdGFibGlzaGVkLgorICBjb25zdCBTdG10ICpDYWxsU2l0ZTsKKworICAvLyBUaGUgcGFyZW50IGJsb2NrIG9mIHRoZSBjYWxsc2l0ZS4KKyAgY29uc3QgQ0ZHQmxvY2sgKkJsb2NrOworCisgIC8vIFRoZSBpbmRleCBvZiB0aGUgY2FsbHNpdGUgaW4gdGhlIENGR0Jsb2NrLgorICB1bnNpZ25lZCBJbmRleDsKKworICBTdGFja0ZyYW1lQ29udGV4dChBbmFseXNpc0RlY2xDb250ZXh0ICpjdHgsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqcGFyZW50LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTdG10ICpzLCBjb25zdCBDRkdCbG9jayAqYmxrLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpZHgpCisgICAgICA6IExvY2F0aW9uQ29udGV4dChTdGFja0ZyYW1lLCBjdHgsIHBhcmVudCksIENhbGxTaXRlKHMpLAorICAgICAgICBCbG9jayhibGspLCBJbmRleChpZHgpIHt9CisKK3B1YmxpYzoKKyAgflN0YWNrRnJhbWVDb250ZXh0KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIGNvbnN0IFN0bXQgKmdldENhbGxTaXRlKCkgY29uc3QgeyByZXR1cm4gQ2FsbFNpdGU7IH0KKworICBjb25zdCBDRkdCbG9jayAqZ2V0Q2FsbFNpdGVCbG9jaygpIGNvbnN0IHsgcmV0dXJuIEJsb2NrOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IExvY2F0aW9uQ29udGV4dCBoYXMgbm8gY2FsbGVyIGNvbnRleHQuCisgIGJvb2wgaW5Ub3BGcmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGdldFBhcmVudCgpID09IG51bGxwdHI7ICB9CisKKyAgdW5zaWduZWQgZ2V0SW5kZXgoKSBjb25zdCB7IHJldHVybiBJbmRleDsgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgb3ZlcnJpZGU7CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgQW5hbHlzaXNEZWNsQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqcGFyZW50LCBjb25zdCBTdG10ICpzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGR0Jsb2NrICpibGssIHVuc2lnbmVkIGlkeCkgeworICAgIFByb2ZpbGVDb21tb24oSUQsIFN0YWNrRnJhbWUsIGN0eCwgcGFyZW50LCBzKTsKKyAgICBJRC5BZGRQb2ludGVyKGJsayk7CisgICAgSUQuQWRkSW50ZWdlcihpZHgpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBMb2NhdGlvbkNvbnRleHQgKkN0eCkgeworICAgIHJldHVybiBDdHgtPmdldEtpbmQoKSA9PSBTdGFja0ZyYW1lOworICB9Cit9OworCitjbGFzcyBTY29wZUNvbnRleHQgOiBwdWJsaWMgTG9jYXRpb25Db250ZXh0IHsKKyAgZnJpZW5kIGNsYXNzIExvY2F0aW9uQ29udGV4dE1hbmFnZXI7CisKKyAgY29uc3QgU3RtdCAqRW50ZXI7CisKKyAgU2NvcGVDb250ZXh0KEFuYWx5c2lzRGVjbENvbnRleHQgKmN0eCwgY29uc3QgTG9jYXRpb25Db250ZXh0ICpwYXJlbnQsCisgICAgICAgICAgICAgICBjb25zdCBTdG10ICpzKQorICAgICAgOiBMb2NhdGlvbkNvbnRleHQoU2NvcGUsIGN0eCwgcGFyZW50KSwgRW50ZXIocykge30KKworcHVibGljOgorICB+U2NvcGVDb250ZXh0KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgb3ZlcnJpZGU7CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgQW5hbHlzaXNEZWNsQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqcGFyZW50LCBjb25zdCBTdG10ICpzKSB7CisgICAgUHJvZmlsZUNvbW1vbihJRCwgU2NvcGUsIGN0eCwgcGFyZW50LCBzKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTG9jYXRpb25Db250ZXh0ICpDdHgpIHsKKyAgICByZXR1cm4gQ3R4LT5nZXRLaW5kKCkgPT0gU2NvcGU7CisgIH0KK307CisKK2NsYXNzIEJsb2NrSW52b2NhdGlvbkNvbnRleHQgOiBwdWJsaWMgTG9jYXRpb25Db250ZXh0IHsKKyAgZnJpZW5kIGNsYXNzIExvY2F0aW9uQ29udGV4dE1hbmFnZXI7CisKKyAgY29uc3QgQmxvY2tEZWNsICpCRDsKKyAgCisgIC8vIEZJWE1FOiBDb21lIHVwIHdpdGggYSBtb3JlIHR5cGUtc2FmZSB3YXkgdG8gbW9kZWwgY29udGV4dC1zZW5zaXRpdml0eS4KKyAgY29uc3Qgdm9pZCAqQ29udGV4dERhdGE7CisKKyAgQmxvY2tJbnZvY2F0aW9uQ29udGV4dChBbmFseXNpc0RlY2xDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvY2tEZWNsICpiZCwgY29uc3Qgdm9pZCAqY29udGV4dERhdGEpCisgICAgICA6IExvY2F0aW9uQ29udGV4dChCbG9jaywgY3R4LCBwYXJlbnQpLCBCRChiZCksIENvbnRleHREYXRhKGNvbnRleHREYXRhKSB7fQorCitwdWJsaWM6CisgIH5CbG9ja0ludm9jYXRpb25Db250ZXh0KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIGNvbnN0IEJsb2NrRGVjbCAqZ2V0QmxvY2tEZWNsKCkgY29uc3QgeyByZXR1cm4gQkQ7IH0KKyAgCisgIGNvbnN0IHZvaWQgKmdldENvbnRleHREYXRhKCkgY29uc3QgeyByZXR1cm4gQ29udGV4dERhdGE7IH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIG92ZXJyaWRlOworCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIEFuYWx5c2lzRGVjbENvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKnBhcmVudCwgY29uc3QgQmxvY2tEZWNsICpiZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjb250ZXh0RGF0YSkgeworICAgIFByb2ZpbGVDb21tb24oSUQsIEJsb2NrLCBjdHgsIHBhcmVudCwgYmQpOworICAgIElELkFkZFBvaW50ZXIoY29udGV4dERhdGEpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBMb2NhdGlvbkNvbnRleHQgKkN0eCkgeworICAgIHJldHVybiBDdHgtPmdldEtpbmQoKSA9PSBCbG9jazsKKyAgfQorfTsKKworY2xhc3MgTG9jYXRpb25Db250ZXh0TWFuYWdlciB7CisgIGxsdm06OkZvbGRpbmdTZXQ8TG9jYXRpb25Db250ZXh0PiBDb250ZXh0czsKKworcHVibGljOgorICB+TG9jYXRpb25Db250ZXh0TWFuYWdlcigpOworCisgIGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpnZXRTdGFja0ZyYW1lKEFuYWx5c2lzRGVjbENvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0bXQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGR0Jsb2NrICpibGssIHVuc2lnbmVkIGlkeCk7CisKKyAgY29uc3QgU2NvcGVDb250ZXh0ICpnZXRTY29wZShBbmFseXNpc0RlY2xDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RtdCAqcyk7CisgIAorICBjb25zdCBCbG9ja0ludm9jYXRpb25Db250ZXh0ICoKKyAgZ2V0QmxvY2tJbnZvY2F0aW9uQ29udGV4dChBbmFseXNpc0RlY2xDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvY2tEZWNsICpCRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpDb250ZXh0RGF0YSk7CisKKyAgLy8vIERpc2NhcmQgYWxsIHByZXZpb3VzbHkgY3JlYXRlZCBMb2NhdGlvbkNvbnRleHQgb2JqZWN0cy4KKyAgdm9pZCBjbGVhcigpOworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIExPQywgdHlwZW5hbWUgREFUQT4KKyAgY29uc3QgTE9DICpnZXRMb2NhdGlvbkNvbnRleHQoQW5hbHlzaXNEZWNsQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREFUQSAqZCk7Cit9OworCitjbGFzcyBBbmFseXNpc0RlY2xDb250ZXh0TWFuYWdlciB7CisgIHVzaW5nIENvbnRleHRNYXAgPQorICAgICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgRGVjbCAqLCBzdGQ6OnVuaXF1ZV9wdHI8QW5hbHlzaXNEZWNsQ29udGV4dD4+OworCisgIENvbnRleHRNYXAgQ29udGV4dHM7CisgIExvY2F0aW9uQ29udGV4dE1hbmFnZXIgTG9jQ29udGV4dHM7CisgIENGRzo6QnVpbGRPcHRpb25zIGNmZ0J1aWxkT3B0aW9uczsKKworICAvLy8gUG9pbnRlciB0byBhbiBpbnRlcmZhY2UgdGhhdCBjYW4gcHJvdmlkZSBmdW5jdGlvbiBib2RpZXMgZm9yCisgIC8vLyBkZWNsYXJhdGlvbnMgZnJvbSBleHRlcm5hbCBzb3VyY2UuCisgIHN0ZDo6dW5pcXVlX3B0cjxDb2RlSW5qZWN0b3I+IEluamVjdG9yOworCisgIC8vLyBBIGZhY3RvcnkgZm9yIGNyZWF0aW5nIGFuZCBjYWNoaW5nIGltcGxlbWVudGF0aW9ucyBmb3IgY29tbW9uCisgIC8vLyBtZXRob2RzIGR1cmluZyB0aGUgYW5hbHlzaXMuCisgIEJvZHlGYXJtIEZ1bmN0aW9uQm9keUZhcm07CisKKyAgLy8vIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgYm9kaWVzIHNob3VsZCBiZSBzeW50aGVzaXplZAorICAvLy8gZm9yIHdlbGwta25vd24gZnVuY3Rpb25zLgorICBib29sIFN5bnRoZXNpemVCb2RpZXM7CisKK3B1YmxpYzoKKyAgQW5hbHlzaXNEZWNsQ29udGV4dE1hbmFnZXIoQVNUQ29udGV4dCAmQVNUQ3R4LCBib29sIHVzZVVub3B0aW1pemVkQ0ZHID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkSW1wbGljaXREdG9ycyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZEluaXRpYWxpemVycyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZFRlbXBvcmFyeUR0b3JzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkTGlmZXRpbWUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZGRMb29wRXhpdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZFNjb3BlcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5bnRoZXNpemVCb2RpZXMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZGRTdGF0aWNJbml0QnJhbmNoZXMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZGRDWFhOZXdBbGxvY2F0b3IgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZFJpY2hDWFhDb25zdHJ1Y3RvcnMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlSW5qZWN0b3IgKmluamVjdG9yID0gbnVsbHB0cik7CisKKyAgQW5hbHlzaXNEZWNsQ29udGV4dCAqZ2V0Q29udGV4dChjb25zdCBEZWNsICpEKTsKKworICBib29sIGdldFVzZVVub3B0aW1pemVkQ0ZHKCkgY29uc3QgeworICAgIHJldHVybiAhY2ZnQnVpbGRPcHRpb25zLlBydW5lVHJpdmlhbGx5RmFsc2VFZGdlczsKKyAgfQorCisgIENGRzo6QnVpbGRPcHRpb25zICZnZXRDRkdCdWlsZE9wdGlvbnMoKSB7CisgICAgcmV0dXJuIGNmZ0J1aWxkT3B0aW9uczsKKyAgfQorICAKKyAgLy8vIFJldHVybiB0cnVlIGlmIGZhdXggYm9kaWVzIHNob3VsZCBiZSBzeW50aGVzaXplZCBmb3Igd2VsbC1rbm93bgorICAvLy8gZnVuY3Rpb25zLgorICBib29sIHN5bnRoZXNpemVCb2RpZXMoKSBjb25zdCB7IHJldHVybiBTeW50aGVzaXplQm9kaWVzOyB9CisKKyAgY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKmdldFN0YWNrRnJhbWUoQW5hbHlzaXNEZWNsQ29udGV4dCAqQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbkNvbnRleHQgY29uc3QgKlBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RtdCAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZHQmxvY2sgKkJsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSWR4KSB7CisgICAgcmV0dXJuIExvY0NvbnRleHRzLmdldFN0YWNrRnJhbWUoQ3R4LCBQYXJlbnQsIFMsIEJsaywgSWR4KTsKKyAgfQorCisgIC8vIEdldCB0aGUgdG9wIGxldmVsIHN0YWNrIGZyYW1lLgorICBjb25zdCBTdGFja0ZyYW1lQ29udGV4dCAqZ2V0U3RhY2tGcmFtZShjb25zdCBEZWNsICpEKSB7CisgICAgcmV0dXJuIExvY0NvbnRleHRzLmdldFN0YWNrRnJhbWUoZ2V0Q29udGV4dChEKSwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgfQorCisgIC8vIEdldCBhIHN0YWNrIGZyYW1lIHdpdGggcGFyZW50LgorICBTdGFja0ZyYW1lQ29udGV4dCBjb25zdCAqZ2V0U3RhY2tGcmFtZShjb25zdCBEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbkNvbnRleHQgY29uc3QgKlBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RtdCAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZHQmxvY2sgKkJsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSWR4KSB7CisgICAgcmV0dXJuIExvY0NvbnRleHRzLmdldFN0YWNrRnJhbWUoZ2V0Q29udGV4dChEKSwgUGFyZW50LCBTLCBCbGssIElkeCk7CisgIH0KKworICAvLy8gR2V0IGEgcmVmZXJlbmNlIHRvIHtAY29kZSBCb2R5RmFybX0gaW5zdGFuY2UuCisgIEJvZHlGYXJtICZnZXRCb2R5RmFybSgpOworCisgIC8vLyBEaXNjYXJkIGFsbCBwcmV2aW91c2x5IGNyZWF0ZWQgQW5hbHlzaXNEZWNsQ29udGV4dHMuCisgIHZvaWQgY2xlYXIoKTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEFuYWx5c2lzRGVjbENvbnRleHQ7CisKKyAgTG9jYXRpb25Db250ZXh0TWFuYWdlciAmZ2V0TG9jYXRpb25Db250ZXh0TWFuYWdlcigpIHsKKyAgICByZXR1cm4gTG9jQ29udGV4dHM7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FOQUxZU0lTX0FOQUxZU0lTREVDTENPTlRFWFRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzaXNEaWFnbm9zdGljLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNpc0RpYWdub3N0aWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDI4OTcxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzaXNEaWFnbm9zdGljLmgKQEAgLTAsMCArMSwyOCBAQAorLy89PT0tLS0gRGlhZ25vc3RpY0FuYWx5c2lzLmggLSBEaWFnbm9zdGljcyBmb3IgbGliYW5hbHlzaXMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FOQUxZU0lTX0FOQUxZU0lTRElBR05PU1RJQ19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQU5BTFlTSVNfQU5BTFlTSVNESUFHTk9TVElDX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWMuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgbmFtZXNwYWNlIGRpYWcgeworICAgIGVudW0geworI2RlZmluZSBESUFHKEVOVU0sRkxBR1MsREVGQVVMVF9NQVBQSU5HLERFU0MsR1JPVVAsXAorICAgICAgICAgICAgIFNGSU5BRSxOT1dFUlJPUixTSE9XSU5TWVNIRUFERVIsQ0FURUdPUlkpIEVOVU0sCisjZGVmaW5lIEFOQUxZU0lTU1RBUlQKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljQW5hbHlzaXNLaW5kcy5pbmMiCisjdW5kZWYgRElBRworICAgICAgTlVNX0JVSUxUSU5fQU5BTFlTSVNfRElBR05PU1RJQ1MKKyAgICB9OworICB9ICAvLyBlbmQgbmFtZXNwYWNlIGRpYWcKK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9Cb2R5RmFybS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQm9keUZhcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjA4NTliCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQm9keUZhcm0uaApAQCAtMCwwICsxLDU0IEBACisvLz09IEJvZHlGYXJtLmggLSBGYWN0b3J5IGZvciBjb25qdXJpbmcgdXAgZmFrZSBib2RpZXMgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEJvZHlGYXJtIGlzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgZmF1eCBpbXBsZW1lbnRhdGlvbnMgZm9yIGZ1bmN0aW9ucy9tZXRob2RzCisvLyBmb3IgYW5hbHlzaXMgcHVycG9zZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0xJQl9BTkFMWVNJU19CT0RZRkFSTV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfTElCX0FOQUxZU0lTX0JPRFlGQVJNX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQmFzZS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBGdW5jdGlvbkRlY2w7CitjbGFzcyBPYmpDTWV0aG9kRGVjbDsKK2NsYXNzIE9iakNQcm9wZXJ0eURlY2w7CitjbGFzcyBTdG10OworY2xhc3MgQ29kZUluamVjdG9yOworCitjbGFzcyBCb2R5RmFybSB7CitwdWJsaWM6CisgIEJvZHlGYXJtKEFTVENvbnRleHQgJkMsIENvZGVJbmplY3RvciAqaW5qZWN0b3IpIDogQyhDKSwgSW5qZWN0b3IoaW5qZWN0b3IpIHt9CisKKyAgLy8vIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBib2RpZXMgZm9yIG9yZGluYXJ5IGZ1bmN0aW9ucy4KKyAgU3RtdCAqZ2V0Qm9keShjb25zdCBGdW5jdGlvbkRlY2wgKkQpOworCisgIC8vLyBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYm9kaWVzIGZvciBPYmplY3RpdmUtQyBwcm9wZXJ0aWVzLgorICBTdG10ICpnZXRCb2R5KGNvbnN0IE9iakNNZXRob2REZWNsICpEKTsKKworICAvLy8gUmVtb3ZlIGNvcHkgY29uc3RydWN0b3IgdG8gYXZvaWQgYWNjaWRlbnRhbCBjb3B5aW5nLgorICBCb2R5RmFybShjb25zdCBCb2R5RmFybSAmb3RoZXIpID0gZGVsZXRlOworCitwcml2YXRlOgorICB0eXBlZGVmIGxsdm06OkRlbnNlTWFwPGNvbnN0IERlY2wgKiwgT3B0aW9uYWw8U3RtdCAqPj4gQm9keU1hcDsKKworICBBU1RDb250ZXh0ICZDOworICBCb2R5TWFwIEJvZGllczsKKyAgQ29kZUluamVjdG9yICpJbmplY3RvcjsKK307Cit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0NGRy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQ0ZHLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyMDA0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0NGRy5oCkBAIC0wLDAgKzEsMTMzOCBAQAorLy89PT0tIENGRy5oIC0gQ2xhc3NlcyBmb3IgcmVwcmVzZW50aW5nIGFuZCBidWlsZGluZyBDRkdzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIENGRyBhbmQgQ0ZHQnVpbGRlciBjbGFzc2VzIGZvciByZXByZXNlbnRpbmcgYW5kCisvLyAgYnVpbGRpbmcgQ29udHJvbC1GbG93IEdyYXBocyAoQ0ZHcykgZnJvbSBBU1RzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BTkFMWVNJU19DRkdfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FOQUxZU0lTX0NGR19ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXhwckNYWC5oIgorI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL1N1cHBvcnQvQnVtcFZlY3Rvci5oIgorI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0NvbnN0cnVjdGlvbkNvbnRleHQuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBU1RDb250ZXh0OworY2xhc3MgQmluYXJ5T3BlcmF0b3I7CitjbGFzcyBDRkc7CitjbGFzcyBDWFhCYXNlU3BlY2lmaWVyOworY2xhc3MgQ1hYQmluZFRlbXBvcmFyeUV4cHI7CitjbGFzcyBDWFhDdG9ySW5pdGlhbGl6ZXI7CitjbGFzcyBDWFhEZWxldGVFeHByOworY2xhc3MgQ1hYRGVzdHJ1Y3RvckRlY2w7CitjbGFzcyBDWFhOZXdFeHByOworY2xhc3MgQ1hYUmVjb3JkRGVjbDsKK2NsYXNzIERlY2w7CitjbGFzcyBGaWVsZERlY2w7CitjbGFzcyBMYW5nT3B0aW9uczsKK2NsYXNzIFZhckRlY2w7CisKKy8vLyBDRkdFbGVtZW50IC0gUmVwcmVzZW50cyBhIHRvcC1sZXZlbCBleHByZXNzaW9uIGluIGEgYmFzaWMgYmxvY2suCitjbGFzcyBDRkdFbGVtZW50IHsKK3B1YmxpYzoKKyAgZW51bSBLaW5kIHsKKyAgICAvLyBtYWluIGtpbmQKKyAgICBJbml0aWFsaXplciwKKyAgICBTY29wZUJlZ2luLAorICAgIFNjb3BlRW5kLAorICAgIE5ld0FsbG9jYXRvciwKKyAgICBMaWZldGltZUVuZHMsCisgICAgTG9vcEV4aXQsCisgICAgLy8gc3RtdCBraW5kCisgICAgU3RhdGVtZW50LAorICAgIENvbnN0cnVjdG9yLAorICAgIENYWFJlY29yZFR5cGVkQ2FsbCwKKyAgICBTVE1UX0JFR0lOID0gU3RhdGVtZW50LAorICAgIFNUTVRfRU5EID0gQ1hYUmVjb3JkVHlwZWRDYWxsLAorICAgIC8vIGR0b3Iga2luZAorICAgIEF1dG9tYXRpY09iamVjdER0b3IsCisgICAgRGVsZXRlRHRvciwKKyAgICBCYXNlRHRvciwKKyAgICBNZW1iZXJEdG9yLAorICAgIFRlbXBvcmFyeUR0b3IsCisgICAgRFRPUl9CRUdJTiA9IEF1dG9tYXRpY09iamVjdER0b3IsCisgICAgRFRPUl9FTkQgPSBUZW1wb3JhcnlEdG9yCisgIH07CisKK3Byb3RlY3RlZDoKKyAgLy8gVGhlIGludCBiaXRzIGFyZSB1c2VkIHRvIG1hcmsgdGhlIGtpbmQuCisgIGxsdm06OlBvaW50ZXJJbnRQYWlyPHZvaWQgKiwgMj4gRGF0YTE7CisgIGxsdm06OlBvaW50ZXJJbnRQYWlyPHZvaWQgKiwgMj4gRGF0YTI7CisKKyAgQ0ZHRWxlbWVudChLaW5kIGtpbmQsIGNvbnN0IHZvaWQgKlB0cjEsIGNvbnN0IHZvaWQgKlB0cjIgPSBudWxscHRyKQorICAgICAgOiBEYXRhMShjb25zdF9jYXN0PHZvaWQqPihQdHIxKSwgKCh1bnNpZ25lZCkga2luZCkgJiAweDMpLAorICAgICAgICBEYXRhMihjb25zdF9jYXN0PHZvaWQqPihQdHIyKSwgKCgodW5zaWduZWQpIGtpbmQpID4+IDIpICYgMHgzKSB7CisgICAgYXNzZXJ0KGdldEtpbmQoKSA9PSBraW5kKTsKKyAgfQorCisgIENGR0VsZW1lbnQoKSA9IGRlZmF1bHQ7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDb252ZXJ0IHRvIHRoZSBzcGVjaWZpZWQgQ0ZHRWxlbWVudCB0eXBlLCBhc3NlcnRpbmcgdGhhdCB0aGlzCisgIC8vLyBDRkdFbGVtZW50IGlzIG9mIHRoZSBkZXNpcmVkIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIFQgY2FzdEFzKCkgY29uc3QgeworICAgIGFzc2VydChUOjppc0tpbmQoKnRoaXMpKTsKKyAgICBUIHQ7CisgICAgQ0ZHRWxlbWVudCYgZSA9IHQ7CisgICAgZSA9ICp0aGlzOworICAgIHJldHVybiB0OworICB9CisKKyAgLy8vIFxicmllZiBDb252ZXJ0IHRvIHRoZSBzcGVjaWZpZWQgQ0ZHRWxlbWVudCB0eXBlLCByZXR1cm5pbmcgTm9uZSBpZiB0aGlzCisgIC8vLyBDRkdFbGVtZW50IGlzIG5vdCBvZiB0aGUgZGVzaXJlZCB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBPcHRpb25hbDxUPiBnZXRBcygpIGNvbnN0IHsKKyAgICBpZiAoIVQ6OmlzS2luZCgqdGhpcykpCisgICAgICByZXR1cm4gTm9uZTsKKyAgICBUIHQ7CisgICAgQ0ZHRWxlbWVudCYgZSA9IHQ7CisgICAgZSA9ICp0aGlzOworICAgIHJldHVybiB0OworICB9CisKKyAgS2luZCBnZXRLaW5kKCkgY29uc3QgeworICAgIHVuc2lnbmVkIHggPSBEYXRhMi5nZXRJbnQoKTsKKyAgICB4IDw8PSAyOworICAgIHggfD0gRGF0YTEuZ2V0SW50KCk7CisgICAgcmV0dXJuIChLaW5kKSB4OworICB9Cit9OworCitjbGFzcyBDRkdTdG10IDogcHVibGljIENGR0VsZW1lbnQgeworcHVibGljOgorICBleHBsaWNpdCBDRkdTdG10KFN0bXQgKlMsIEtpbmQgSyA9IFN0YXRlbWVudCkgOiBDRkdFbGVtZW50KEssIFMpIHsKKyAgICBhc3NlcnQoaXNLaW5kKCp0aGlzKSk7CisgIH0KKworICBjb25zdCBTdG10ICpnZXRTdG10KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBTdG10ICo+KERhdGExLmdldFBvaW50ZXIoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIENGR0VsZW1lbnQ7CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IENGR0VsZW1lbnQgJkUpIHsKKyAgICByZXR1cm4gRS5nZXRLaW5kKCkgPj0gU1RNVF9CRUdJTiAmJiBFLmdldEtpbmQoKSA8PSBTVE1UX0VORDsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIENGR1N0bXQoKSA9IGRlZmF1bHQ7Cit9OworCisvLy8gQ0ZHQ29uc3RydWN0b3IgLSBSZXByZXNlbnRzIEMrKyBjb25zdHJ1Y3RvciBjYWxsLiBNYWludGFpbnMgaW5mb3JtYXRpb24KKy8vLyBuZWNlc3NhcnkgdG8gZmlndXJlIG91dCB3aGF0IG1lbW9yeSBpcyBiZWluZyBpbml0aWFsaXplZCBieSB0aGUKKy8vLyBjb25zdHJ1Y3RvciBleHByZXNzaW9uLiBGb3Igbm93IHRoaXMgaXMgb25seSB1c2VkIGJ5IHRoZSBhbmFseXplcidzIENGRy4KK2NsYXNzIENGR0NvbnN0cnVjdG9yIDogcHVibGljIENGR1N0bXQgeworcHVibGljOgorICBleHBsaWNpdCBDRkdDb25zdHJ1Y3RvcihDWFhDb25zdHJ1Y3RFeHByICpDRSwgY29uc3QgQ29uc3RydWN0aW9uQ29udGV4dCAqQykKKyAgICAgIDogQ0ZHU3RtdChDRSwgQ29uc3RydWN0b3IpIHsKKyAgICBhc3NlcnQoQyk7CisgICAgRGF0YTIuc2V0UG9pbnRlcihjb25zdF9jYXN0PENvbnN0cnVjdGlvbkNvbnRleHQgKj4oQykpOworICB9CisKKyAgY29uc3QgQ29uc3RydWN0aW9uQ29udGV4dCAqZ2V0Q29uc3RydWN0aW9uQ29udGV4dCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q29uc3RydWN0aW9uQ29udGV4dCAqPihEYXRhMi5nZXRQb2ludGVyKCkpOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBDRkdFbGVtZW50OworCisgIENGR0NvbnN0cnVjdG9yKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBDRkdFbGVtZW50ICZFKSB7CisgICAgcmV0dXJuIEUuZ2V0S2luZCgpID09IENvbnN0cnVjdG9yOworICB9Cit9OworCisvLy8gQ0ZHQ1hYUmVjb3JkVHlwZWRDYWxsIC0gUmVwcmVzZW50cyBhIGZ1bmN0aW9uIGNhbGwgdGhhdCByZXR1cm5zIGEgQysrIG9iamVjdAorLy8vIGJ5IHZhbHVlLiBUaGlzLCBsaWtlIGNvbnN0cnVjdG9yLCByZXF1aXJlcyBhIGNvbnN0cnVjdGlvbiBjb250ZXh0IGluIG9yZGVyCisvLy8gdG8gdW5kZXJzdGFuZCB0aGUgc3RvcmFnZSBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IC4gSW4gQyBzdWNoIHRyYWNraW5nIGlzIG5vdAorLy8vIG5lY2Vzc2FyeSBiZWNhdXNlIG5vIGFkZGl0aW9uYWwgZWZmb3J0IGlzIHJlcXVpcmVkIGZvciBkZXN0cm95aW5nIHRoZSBvYmplY3QKKy8vLyBvciBtb2RlbGluZyBjb3B5IGVsaXNpb24uIExpa2UgQ0ZHQ29uc3RydWN0b3IsIHRoaXMgZWxlbWVudCBpcyBmb3Igbm93IG9ubHkKKy8vLyB1c2VkIGJ5IHRoZSBhbmFseXplcidzIENGRy4KK2NsYXNzIENGR0NYWFJlY29yZFR5cGVkQ2FsbCA6IHB1YmxpYyBDRkdTdG10IHsKK3B1YmxpYzoKKyAgLy8vIFJldHVybnMgdHJ1ZSB3aGVuIGNhbGwgZXhwcmVzc2lvbiBccCBDRSBuZWVkcyB0byBiZSByZXByZXNlbnRlZAorICAvLy8gYnkgQ0ZHQ1hYUmVjb3JkVHlwZWRDYWxsLCBhcyBvcHBvc2VkIHRvIGEgcmVndWxhciBDRkdTdG10LgorICBzdGF0aWMgYm9vbCBpc0NYWFJlY29yZFR5cGVkQ2FsbChDYWxsRXhwciAqQ0UsIGNvbnN0IEFTVENvbnRleHQgJkFDdHgpIHsKKyAgICByZXR1cm4gQ0UtPmdldENhbGxSZXR1cm5UeXBlKEFDdHgpLmdldENhbm9uaWNhbFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CisgIH0KKworICBleHBsaWNpdCBDRkdDWFhSZWNvcmRUeXBlZENhbGwoQ2FsbEV4cHIgKkNFLCBjb25zdCBDb25zdHJ1Y3Rpb25Db250ZXh0ICpDKQorICAgICAgOiBDRkdTdG10KENFLCBDWFhSZWNvcmRUeXBlZENhbGwpIHsKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBub3QgcHJvdGVjdGVkIGFnYWluc3Qgc3F1ZWV6aW5nIGEgbm9uLXJlY29yZC10eXBlZC1jYWxsCisgICAgLy8gaW50byB0aGUgY29uc3RydWN0b3IuIEFuIGFzc2VydGlvbiB3b3VsZCByZXF1aXJlIHBhc3NpbmcgYW4gQVNUQ29udGV4dAorICAgIC8vIHdoaWNoIHdvdWxkIG1lYW4gcGF5aW5nIGZvciBzb21ldGhpbmcgd2UgZG9uJ3QgdXNlLgorICAgIGFzc2VydChDICYmIChpc2E8VGVtcG9yYXJ5T2JqZWN0Q29uc3RydWN0aW9uQ29udGV4dD4oQykgfHwKKyAgICAgICAgICAgICAgICAgLy8gVGhlc2UgYXJlIHBvc3NpYmxlIGluIEMrKzE3IGR1ZSB0byBtYW5kYXRvcnkgY29weSBlbGlzaW9uLgorICAgICAgICAgICAgICAgICBpc2E8UmV0dXJuZWRWYWx1ZUNvbnN0cnVjdGlvbkNvbnRleHQ+KEMpIHx8CisgICAgICAgICAgICAgICAgIGlzYTxWYXJpYWJsZUNvbnN0cnVjdGlvbkNvbnRleHQ+KEMpIHx8CisgICAgICAgICAgICAgICAgIGlzYTxDb25zdHJ1Y3RvckluaXRpYWxpemVyQ29uc3RydWN0aW9uQ29udGV4dD4oQykpKTsKKyAgICBEYXRhMi5zZXRQb2ludGVyKGNvbnN0X2Nhc3Q8Q29uc3RydWN0aW9uQ29udGV4dCAqPihDKSk7CisgIH0KKworICBjb25zdCBDb25zdHJ1Y3Rpb25Db250ZXh0ICpnZXRDb25zdHJ1Y3Rpb25Db250ZXh0KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDb25zdHJ1Y3Rpb25Db250ZXh0ICo+KERhdGEyLmdldFBvaW50ZXIoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIENGR0VsZW1lbnQ7CisKKyAgQ0ZHQ1hYUmVjb3JkVHlwZWRDYWxsKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBDRkdFbGVtZW50ICZFKSB7CisgICAgcmV0dXJuIEUuZ2V0S2luZCgpID09IENYWFJlY29yZFR5cGVkQ2FsbDsKKyAgfQorfTsKKworLy8vIENGR0luaXRpYWxpemVyIC0gUmVwcmVzZW50cyBDKysgYmFzZSBvciBtZW1iZXIgaW5pdGlhbGl6ZXIgZnJvbQorLy8vIGNvbnN0cnVjdG9yJ3MgaW5pdGlhbGl6YXRpb24gbGlzdC4KK2NsYXNzIENGR0luaXRpYWxpemVyIDogcHVibGljIENGR0VsZW1lbnQgeworcHVibGljOgorICBleHBsaWNpdCBDRkdJbml0aWFsaXplcihDWFhDdG9ySW5pdGlhbGl6ZXIgKmluaXRpYWxpemVyKQorICAgICAgOiBDRkdFbGVtZW50KEluaXRpYWxpemVyLCBpbml0aWFsaXplcikge30KKworICBDWFhDdG9ySW5pdGlhbGl6ZXIqIGdldEluaXRpYWxpemVyKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDWFhDdG9ySW5pdGlhbGl6ZXIqPihEYXRhMS5nZXRQb2ludGVyKCkpOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBDRkdFbGVtZW50OworCisgIENGR0luaXRpYWxpemVyKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBDRkdFbGVtZW50ICZFKSB7CisgICAgcmV0dXJuIEUuZ2V0S2luZCgpID09IEluaXRpYWxpemVyOworICB9Cit9OworCisvLy8gQ0ZHTmV3QWxsb2NhdG9yIC0gUmVwcmVzZW50cyBDKysgYWxsb2NhdG9yIGNhbGwuCitjbGFzcyBDRkdOZXdBbGxvY2F0b3IgOiBwdWJsaWMgQ0ZHRWxlbWVudCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IENGR05ld0FsbG9jYXRvcihjb25zdCBDWFhOZXdFeHByICpTKQorICAgIDogQ0ZHRWxlbWVudChOZXdBbGxvY2F0b3IsIFMpIHt9CisKKyAgLy8gR2V0IHRoZSBuZXcgZXhwcmVzc2lvbi4KKyAgY29uc3QgQ1hYTmV3RXhwciAqZ2V0QWxsb2NhdG9yRXhwcigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hYTmV3RXhwciAqPihEYXRhMS5nZXRQb2ludGVyKCkpOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBDRkdFbGVtZW50OworCisgIENGR05ld0FsbG9jYXRvcigpID0gZGVmYXVsdDsKKworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgQ0ZHRWxlbWVudCAmZWxlbSkgeworICAgIHJldHVybiBlbGVtLmdldEtpbmQoKSA9PSBOZXdBbGxvY2F0b3I7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIHRoZSBwb2ludCB3aGVyZSBhIGxvb3AgZW5kcy4KKy8vLyBUaGlzIGVsZW1lbnQgaXMgaXMgb25seSBwcm9kdWNlZCB3aGVuIGJ1aWxkaW5nIHRoZSBDRkcgZm9yIHRoZSBzdGF0aWMKKy8vLyBhbmFseXplciBhbmQgaGlkZGVuIGJlaGluZCB0aGUgJ2NmZy1sb29wZXhpdCcgYW5hbHl6ZXIgY29uZmlnIGZsYWcuCisvLy8KKy8vLyBOb3RlOiBhIGxvb3AgZXhpdCBlbGVtZW50IGNhbiBiZSByZWFjaGVkIGV2ZW4gd2hlbiB0aGUgbG9vcCBib2R5IHdhcyBuZXZlcgorLy8vIGVudGVyZWQuCitjbGFzcyBDRkdMb29wRXhpdCA6IHB1YmxpYyBDRkdFbGVtZW50IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ0ZHTG9vcEV4aXQoY29uc3QgU3RtdCAqc3RtdCkgOiBDRkdFbGVtZW50KExvb3BFeGl0LCBzdG10KSB7fQorCisgIGNvbnN0IFN0bXQgKmdldExvb3BTdG10KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdG10ICo+KERhdGExLmdldFBvaW50ZXIoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIENGR0VsZW1lbnQ7CisKKyAgQ0ZHTG9vcEV4aXQoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IENGR0VsZW1lbnQgJmVsZW0pIHsKKyAgICByZXR1cm4gZWxlbS5nZXRLaW5kKCkgPT0gTG9vcEV4aXQ7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIHRoZSBwb2ludCB3aGVyZSB0aGUgbGlmZXRpbWUgb2YgYW4gYXV0b21hdGljIG9iamVjdCBlbmRzCitjbGFzcyBDRkdMaWZldGltZUVuZHMgOiBwdWJsaWMgQ0ZHRWxlbWVudCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IENGR0xpZmV0aW1lRW5kcyhjb25zdCBWYXJEZWNsICp2YXIsIGNvbnN0IFN0bXQgKnN0bXQpCisgICAgICA6IENGR0VsZW1lbnQoTGlmZXRpbWVFbmRzLCB2YXIsIHN0bXQpIHt9CisKKyAgY29uc3QgVmFyRGVjbCAqZ2V0VmFyRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VmFyRGVjbCAqPihEYXRhMS5nZXRQb2ludGVyKCkpOworICB9CisKKyAgY29uc3QgU3RtdCAqZ2V0VHJpZ2dlclN0bXQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0bXQgKj4oRGF0YTIuZ2V0UG9pbnRlcigpKTsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQ0ZHRWxlbWVudDsKKworICBDRkdMaWZldGltZUVuZHMoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IENGR0VsZW1lbnQgJmVsZW0pIHsKKyAgICByZXR1cm4gZWxlbS5nZXRLaW5kKCkgPT0gTGlmZXRpbWVFbmRzOworICB9Cit9OworCisvLy8gUmVwcmVzZW50cyBiZWdpbm5pbmcgb2YgYSBzY29wZSBpbXBsaWNpdGx5IGdlbmVyYXRlZAorLy8vIGJ5IHRoZSBjb21waWxlciBvbiBlbmNvdW50ZXJpbmcgYSBDb21wb3VuZFN0bXQKK2NsYXNzIENGR1Njb3BlQmVnaW4gOiBwdWJsaWMgQ0ZHRWxlbWVudCB7CitwdWJsaWM6CisgIENGR1Njb3BlQmVnaW4oKSB7fQorICBDRkdTY29wZUJlZ2luKGNvbnN0IFZhckRlY2wgKlZELCBjb25zdCBTdG10ICpTKQorICAgICAgOiBDRkdFbGVtZW50KFNjb3BlQmVnaW4sIFZELCBTKSB7fQorCisgIC8vIEdldCBzdGF0ZW1lbnQgdGhhdCB0cmlnZ2VyZWQgYSBuZXcgc2NvcGUuCisgIGNvbnN0IFN0bXQgKmdldFRyaWdnZXJTdG10KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdG10Kj4oRGF0YTIuZ2V0UG9pbnRlcigpKTsKKyAgfQorCisgIC8vIEdldCBWRCB0aGF0IHRyaWdnZXJlZCBhIG5ldyBzY29wZS4KKyAgY29uc3QgVmFyRGVjbCAqZ2V0VmFyRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VmFyRGVjbCAqPihEYXRhMS5nZXRQb2ludGVyKCkpOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBDRkdFbGVtZW50OworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgQ0ZHRWxlbWVudCAmRSkgeworICAgIEtpbmQga2luZCA9IEUuZ2V0S2luZCgpOworICAgIHJldHVybiBraW5kID09IFNjb3BlQmVnaW47CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGVuZCBvZiBhIHNjb3BlIGltcGxpY2l0bHkgZ2VuZXJhdGVkIGJ5CisvLy8gdGhlIGNvbXBpbGVyIGFmdGVyIHRoZSBsYXN0IFN0bXQgaW4gYSBDb21wb3VuZFN0bXQncyBib2R5CitjbGFzcyBDRkdTY29wZUVuZCA6IHB1YmxpYyBDRkdFbGVtZW50IHsKK3B1YmxpYzoKKyAgQ0ZHU2NvcGVFbmQoKSB7fQorICBDRkdTY29wZUVuZChjb25zdCBWYXJEZWNsICpWRCwgY29uc3QgU3RtdCAqUykgOiBDRkdFbGVtZW50KFNjb3BlRW5kLCBWRCwgUykge30KKworICBjb25zdCBWYXJEZWNsICpnZXRWYXJEZWNsKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxWYXJEZWNsICo+KERhdGExLmdldFBvaW50ZXIoKSk7CisgIH0KKworICBjb25zdCBTdG10ICpnZXRUcmlnZ2VyU3RtdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RtdCAqPihEYXRhMi5nZXRQb2ludGVyKCkpOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBDRkdFbGVtZW50OworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgQ0ZHRWxlbWVudCAmRSkgeworICAgIEtpbmQga2luZCA9IEUuZ2V0S2luZCgpOworICAgIHJldHVybiBraW5kID09IFNjb3BlRW5kOworICB9Cit9OworCisvLy8gQ0ZHSW1wbGljaXREdG9yIC0gUmVwcmVzZW50cyBDKysgb2JqZWN0IGRlc3RydWN0b3IgaW1wbGljaXRseSBnZW5lcmF0ZWQKKy8vLyBieSBjb21waWxlciBvbiB2YXJpb3VzIG9jY2FzaW9ucy4KK2NsYXNzIENGR0ltcGxpY2l0RHRvciA6IHB1YmxpYyBDRkdFbGVtZW50IHsKK3Byb3RlY3RlZDoKKyAgQ0ZHSW1wbGljaXREdG9yKCkgPSBkZWZhdWx0OworCisgIENGR0ltcGxpY2l0RHRvcihLaW5kIGtpbmQsIGNvbnN0IHZvaWQgKmRhdGExLCBjb25zdCB2b2lkICpkYXRhMiA9IG51bGxwdHIpCisgICAgOiBDRkdFbGVtZW50KGtpbmQsIGRhdGExLCBkYXRhMikgeworICAgIGFzc2VydChraW5kID49IERUT1JfQkVHSU4gJiYga2luZCA8PSBEVE9SX0VORCk7CisgIH0KKworcHVibGljOgorICBjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqZ2V0RGVzdHJ1Y3RvckRlY2woQVNUQ29udGV4dCAmYXN0Q29udGV4dCkgY29uc3Q7CisgIGJvb2wgaXNOb1JldHVybihBU1RDb250ZXh0ICZhc3RDb250ZXh0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIENGR0VsZW1lbnQ7CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IENGR0VsZW1lbnQgJkUpIHsKKyAgICBLaW5kIGtpbmQgPSBFLmdldEtpbmQoKTsKKyAgICByZXR1cm4ga2luZCA+PSBEVE9SX0JFR0lOICYmIGtpbmQgPD0gRFRPUl9FTkQ7CisgIH0KK307CisKKy8vLyBDRkdBdXRvbWF0aWNPYmpEdG9yIC0gUmVwcmVzZW50cyBDKysgb2JqZWN0IGRlc3RydWN0b3IgaW1wbGljaXRseSBnZW5lcmF0ZWQKKy8vLyBmb3IgYXV0b21hdGljIG9iamVjdCBvciB0ZW1wb3JhcnkgYm91bmQgdG8gY29uc3QgcmVmZXJlbmNlIGF0IHRoZSBwb2ludAorLy8vIG9mIGxlYXZpbmcgaXRzIGxvY2FsIHNjb3BlLgorY2xhc3MgQ0ZHQXV0b21hdGljT2JqRHRvcjogcHVibGljIENGR0ltcGxpY2l0RHRvciB7CitwdWJsaWM6CisgIENGR0F1dG9tYXRpY09iakR0b3IoY29uc3QgVmFyRGVjbCAqdmFyLCBjb25zdCBTdG10ICpzdG10KQorICAgICAgOiBDRkdJbXBsaWNpdER0b3IoQXV0b21hdGljT2JqZWN0RHRvciwgdmFyLCBzdG10KSB7fQorCisgIGNvbnN0IFZhckRlY2wgKmdldFZhckRlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFZhckRlY2wqPihEYXRhMS5nZXRQb2ludGVyKCkpOworICB9CisKKyAgLy8gR2V0IHN0YXRlbWVudCBlbmQgb2Ygd2hpY2ggdHJpZ2dlcmVkIHRoZSBkZXN0cnVjdG9yIGNhbGwuCisgIGNvbnN0IFN0bXQgKmdldFRyaWdnZXJTdG10KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdG10Kj4oRGF0YTIuZ2V0UG9pbnRlcigpKTsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQ0ZHRWxlbWVudDsKKworICBDRkdBdXRvbWF0aWNPYmpEdG9yKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBDRkdFbGVtZW50ICZlbGVtKSB7CisgICAgcmV0dXJuIGVsZW0uZ2V0S2luZCgpID09IEF1dG9tYXRpY09iamVjdER0b3I7CisgIH0KK307CisKKy8vLyBDRkdEZWxldGVEdG9yIC0gUmVwcmVzZW50cyBDKysgb2JqZWN0IGRlc3RydWN0b3IgZ2VuZXJhdGVkCisvLy8gZnJvbSBhIGNhbGwgdG8gZGVsZXRlLgorY2xhc3MgQ0ZHRGVsZXRlRHRvciA6IHB1YmxpYyBDRkdJbXBsaWNpdER0b3IgeworcHVibGljOgorICBDRkdEZWxldGVEdG9yKGNvbnN0IENYWFJlY29yZERlY2wgKlJELCBjb25zdCBDWFhEZWxldGVFeHByICpERSkKKyAgICAgIDogQ0ZHSW1wbGljaXREdG9yKERlbGV0ZUR0b3IsIFJELCBERSkge30KKworICBjb25zdCBDWFhSZWNvcmREZWNsICpnZXRDWFhSZWNvcmREZWNsKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDWFhSZWNvcmREZWNsKj4oRGF0YTEuZ2V0UG9pbnRlcigpKTsKKyAgfQorCisgIC8vIEdldCBEZWxldGUgZXhwcmVzc2lvbiB3aGljaCB0cmlnZ2VyZWQgdGhlIGRlc3RydWN0b3IgY2FsbC4KKyAgY29uc3QgQ1hYRGVsZXRlRXhwciAqZ2V0RGVsZXRlRXhwcigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hYRGVsZXRlRXhwciAqPihEYXRhMi5nZXRQb2ludGVyKCkpOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBDRkdFbGVtZW50OworCisgIENGR0RlbGV0ZUR0b3IoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IENGR0VsZW1lbnQgJmVsZW0pIHsKKyAgICByZXR1cm4gZWxlbS5nZXRLaW5kKCkgPT0gRGVsZXRlRHRvcjsKKyAgfQorfTsKKworLy8vIENGR0Jhc2VEdG9yIC0gUmVwcmVzZW50cyBDKysgb2JqZWN0IGRlc3RydWN0b3IgaW1wbGljaXRseSBnZW5lcmF0ZWQgZm9yCisvLy8gYmFzZSBvYmplY3QgaW4gZGVzdHJ1Y3Rvci4KK2NsYXNzIENGR0Jhc2VEdG9yIDogcHVibGljIENGR0ltcGxpY2l0RHRvciB7CitwdWJsaWM6CisgIENGR0Jhc2VEdG9yKGNvbnN0IENYWEJhc2VTcGVjaWZpZXIgKmJhc2UpCisgICAgICA6IENGR0ltcGxpY2l0RHRvcihCYXNlRHRvciwgYmFzZSkge30KKworICBjb25zdCBDWFhCYXNlU3BlY2lmaWVyICpnZXRCYXNlU3BlY2lmaWVyKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBDWFhCYXNlU3BlY2lmaWVyKj4oRGF0YTEuZ2V0UG9pbnRlcigpKTsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQ0ZHRWxlbWVudDsKKworICBDRkdCYXNlRHRvcigpID0gZGVmYXVsdDsKKworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgQ0ZHRWxlbWVudCAmRSkgeworICAgIHJldHVybiBFLmdldEtpbmQoKSA9PSBCYXNlRHRvcjsKKyAgfQorfTsKKworLy8vIENGR01lbWJlckR0b3IgLSBSZXByZXNlbnRzIEMrKyBvYmplY3QgZGVzdHJ1Y3RvciBpbXBsaWNpdGx5IGdlbmVyYXRlZCBmb3IKKy8vLyBtZW1iZXIgb2JqZWN0IGluIGRlc3RydWN0b3IuCitjbGFzcyBDRkdNZW1iZXJEdG9yIDogcHVibGljIENGR0ltcGxpY2l0RHRvciB7CitwdWJsaWM6CisgIENGR01lbWJlckR0b3IoY29uc3QgRmllbGREZWNsICpmaWVsZCkKKyAgICAgIDogQ0ZHSW1wbGljaXREdG9yKE1lbWJlckR0b3IsIGZpZWxkLCBudWxscHRyKSB7fQorCisgIGNvbnN0IEZpZWxkRGVjbCAqZ2V0RmllbGREZWNsKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBGaWVsZERlY2wqPihEYXRhMS5nZXRQb2ludGVyKCkpOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBDRkdFbGVtZW50OworCisgIENGR01lbWJlckR0b3IoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IENGR0VsZW1lbnQgJkUpIHsKKyAgICByZXR1cm4gRS5nZXRLaW5kKCkgPT0gTWVtYmVyRHRvcjsKKyAgfQorfTsKKworLy8vIENGR1RlbXBvcmFyeUR0b3IgLSBSZXByZXNlbnRzIEMrKyBvYmplY3QgZGVzdHJ1Y3RvciBpbXBsaWNpdGx5IGdlbmVyYXRlZAorLy8vIGF0IHRoZSBlbmQgb2YgZnVsbCBleHByZXNzaW9uIGZvciB0ZW1wb3Jhcnkgb2JqZWN0LgorY2xhc3MgQ0ZHVGVtcG9yYXJ5RHRvciA6IHB1YmxpYyBDRkdJbXBsaWNpdER0b3IgeworcHVibGljOgorICBDRkdUZW1wb3JhcnlEdG9yKENYWEJpbmRUZW1wb3JhcnlFeHByICpleHByKQorICAgICAgOiBDRkdJbXBsaWNpdER0b3IoVGVtcG9yYXJ5RHRvciwgZXhwciwgbnVsbHB0cikge30KKworICBjb25zdCBDWFhCaW5kVGVtcG9yYXJ5RXhwciAqZ2V0QmluZFRlbXBvcmFyeUV4cHIoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IENYWEJpbmRUZW1wb3JhcnlFeHByICo+KERhdGExLmdldFBvaW50ZXIoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIENGR0VsZW1lbnQ7CisKKyAgQ0ZHVGVtcG9yYXJ5RHRvcigpID0gZGVmYXVsdDsKKworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgQ0ZHRWxlbWVudCAmRSkgeworICAgIHJldHVybiBFLmdldEtpbmQoKSA9PSBUZW1wb3JhcnlEdG9yOworICB9Cit9OworCisvLy8gQ0ZHVGVybWluYXRvciAtIFJlcHJlc2VudHMgQ0ZHQmxvY2sgdGVybWluYXRvciBzdGF0ZW1lbnQuCisvLy8KKy8vLyBUZW1wb3JhcnlEdG9yc0JyYW5jaCBiaXQgaXMgc2V0IHRvIHRydWUgaWYgdGhlIHRlcm1pbmF0b3IgbWFya3MgYSBicmFuY2gKKy8vLyBpbiBjb250cm9sIGZsb3cgb2YgZGVzdHJ1Y3RvcnMgb2YgdGVtcG9yYXJpZXMuIEluIHRoaXMgY2FzZSB0ZXJtaW5hdG9yCisvLy8gc3RhdGVtZW50IGlzIHRoZSBzYW1lIHN0YXRlbWVudCB0aGF0IGJyYW5jaGVzIGNvbnRyb2wgZmxvdyBpbiBldmFsdWF0aW9uCisvLy8gb2YgbWF0Y2hpbmcgZnVsbCBleHByZXNzaW9uLgorY2xhc3MgQ0ZHVGVybWluYXRvciB7CisgIGxsdm06OlBvaW50ZXJJbnRQYWlyPFN0bXQgKiwgMT4gRGF0YTsKKworcHVibGljOgorICBDRkdUZXJtaW5hdG9yKCkgPSBkZWZhdWx0OworICBDRkdUZXJtaW5hdG9yKFN0bXQgKlMsIGJvb2wgVGVtcG9yYXJ5RHRvcnNCcmFuY2ggPSBmYWxzZSkKKyAgICAgIDogRGF0YShTLCBUZW1wb3JhcnlEdG9yc0JyYW5jaCkge30KKworICBTdG10ICpnZXRTdG10KCkgeyByZXR1cm4gRGF0YS5nZXRQb2ludGVyKCk7IH0KKyAgY29uc3QgU3RtdCAqZ2V0U3RtdCgpIGNvbnN0IHsgcmV0dXJuIERhdGEuZ2V0UG9pbnRlcigpOyB9CisKKyAgYm9vbCBpc1RlbXBvcmFyeUR0b3JzQnJhbmNoKCkgY29uc3QgeyByZXR1cm4gRGF0YS5nZXRJbnQoKTsgfQorCisgIG9wZXJhdG9yIFN0bXQgKigpIHsgcmV0dXJuIGdldFN0bXQoKTsgfQorICBvcGVyYXRvciBjb25zdCBTdG10ICooKSBjb25zdCB7IHJldHVybiBnZXRTdG10KCk7IH0KKworICBTdG10ICpvcGVyYXRvci0+KCkgeyByZXR1cm4gZ2V0U3RtdCgpOyB9CisgIGNvbnN0IFN0bXQgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBnZXRTdG10KCk7IH0KKworICBTdG10ICZvcGVyYXRvciooKSB7IHJldHVybiAqZ2V0U3RtdCgpOyB9CisgIGNvbnN0IFN0bXQgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpnZXRTdG10KCk7IH0KKworICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RtdCgpOyB9Cit9OworCisvLy8gQ0ZHQmxvY2sgLSBSZXByZXNlbnRzIGEgc2luZ2xlIGJhc2ljIGJsb2NrIGluIGEgc291cmNlLWxldmVsIENGRy4KKy8vLyAgSXQgY29uc2lzdHMgb2Y6CisvLy8KKy8vLyAgKDEpIEEgc2V0IG9mIHN0YXRlbWVudHMvZXhwcmVzc2lvbnMgKHdoaWNoIG1heSBjb250YWluIHN1YmV4cHJlc3Npb25zKS4KKy8vLyAgKDIpIEEgInRlcm1pbmF0b3IiIHN0YXRlbWVudCAobm90IGluIHRoZSBzZXQgb2Ygc3RhdGVtZW50cykuCisvLy8gICgzKSBBIGxpc3Qgb2Ygc3VjY2Vzc29ycyBhbmQgcHJlZGVjZXNzb3JzLgorLy8vCisvLy8gVGVybWluYXRvcjogVGhlIHRlcm1pbmF0b3IgcmVwcmVzZW50cyB0aGUgdHlwZSBvZiBjb250cm9sLWZsb3cgdGhhdCBvY2N1cnMKKy8vLyBhdCB0aGUgZW5kIG9mIHRoZSBiYXNpYyBibG9jay4gIFRoZSB0ZXJtaW5hdG9yIGlzIGEgU3RtdCogcmVmZXJyaW5nIHRvIGFuCisvLy8gQVNUIG5vZGUgdGhhdCBoYXMgY29udHJvbC1mbG93OiBpZi1zdGF0ZW1lbnRzLCBicmVha3MsIGxvb3BzLCBldGMuCisvLy8gSWYgdGhlIGNvbnRyb2wtZmxvdyBpcyBjb25kaXRpb25hbCwgdGhlIGNvbmRpdGlvbiBleHByZXNzaW9uIHdpbGwgYXBwZWFyCisvLy8gd2l0aGluIHRoZSBzZXQgb2Ygc3RhdGVtZW50cyBpbiB0aGUgYmxvY2sgKHVzdWFsbHkgdGhlIGxhc3Qgc3RhdGVtZW50KS4KKy8vLworLy8vIFByZWRlY2Vzc29yczogdGhlIG9yZGVyIGluIHRoZSBzZXQgb2YgcHJlZGVjZXNzb3JzIGlzIGFyYml0cmFyeS4KKy8vLworLy8vIFN1Y2Nlc3NvcnM6IHRoZSBvcmRlciBpbiB0aGUgc2V0IG9mIHN1Y2Nlc3NvcnMgaXMgTk9UIGFyYml0cmFyeS4gIFdlCisvLy8gIGN1cnJlbnRseSBoYXZlIHRoZSBmb2xsb3dpbmcgb3JkZXJpbmdzIGJhc2VkIG9uIHRoZSB0ZXJtaW5hdG9yOgorLy8vCisvLy8gICAgIFRlcm1pbmF0b3IgICAgICAgU3VjY2Vzc29yIE9yZGVyaW5nCisvLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gICAgICAgaWYgICAgICAgICAgICBUaGVuIEJsb2NrOyAgRWxzZSBCbG9jaworLy8vICAgICA/IG9wZXJhdG9yICAgICAgTEhTIGV4cHJlc3Npb247ICBSSFMgZXhwcmVzc2lvbgorLy8vICAgICAmJiwgfHwgICAgICAgICAgZXhwcmVzc2lvbiB0aGF0IHVzZXMgcmVzdWx0IG9mICYmIG9yIHx8LCBSSFMKKy8vLworLy8vIEJ1dCBub3RlIHRoYXQgYW55IG9mIHRoYXQgbWF5IGJlIE5VTEwgaW4gY2FzZSBvZiBvcHRpbWl6ZWQtb3V0IGVkZ2VzLgorY2xhc3MgQ0ZHQmxvY2sgeworICBjbGFzcyBFbGVtZW50TGlzdCB7CisgICAgdXNpbmcgSW1wbFR5ID0gQnVtcFZlY3RvcjxDRkdFbGVtZW50PjsKKworICAgIEltcGxUeSBJbXBsOworCisgIHB1YmxpYzoKKyAgICBFbGVtZW50TGlzdChCdW1wVmVjdG9yQ29udGV4dCAmQykgOiBJbXBsKEMsIDQpIHt9CisKKyAgICB1c2luZyBpdGVyYXRvciA9IHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxJbXBsVHk6Oml0ZXJhdG9yPjsKKyAgICB1c2luZyBjb25zdF9pdGVyYXRvciA9IHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxJbXBsVHk6OmNvbnN0X2l0ZXJhdG9yPjsKKyAgICB1c2luZyByZXZlcnNlX2l0ZXJhdG9yID0gSW1wbFR5OjppdGVyYXRvcjsKKyAgICB1c2luZyBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yID0gSW1wbFR5Ojpjb25zdF9pdGVyYXRvcjsKKyAgICB1c2luZyBjb25zdF9yZWZlcmVuY2UgPSBJbXBsVHk6OmNvbnN0X3JlZmVyZW5jZTsKKworICAgIHZvaWQgcHVzaF9iYWNrKENGR0VsZW1lbnQgZSwgQnVtcFZlY3RvckNvbnRleHQgJkMpIHsgSW1wbC5wdXNoX2JhY2soZSwgQyk7IH0KKworICAgIHJldmVyc2VfaXRlcmF0b3IgaW5zZXJ0KHJldmVyc2VfaXRlcmF0b3IgSSwgc2l6ZV90IENudCwgQ0ZHRWxlbWVudCBFLAorICAgICAgICBCdW1wVmVjdG9yQ29udGV4dCAmQykgeworICAgICAgcmV0dXJuIEltcGwuaW5zZXJ0KEksIENudCwgRSwgQyk7CisgICAgfQorCisgICAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4gSW1wbC5iYWNrKCk7IH0KKyAgICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0IHsgcmV0dXJuIEltcGwuZnJvbnQoKTsgfQorCisgICAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBJbXBsLnJiZWdpbigpOyB9CisgICAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gSW1wbC5yZW5kKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEltcGwucmJlZ2luKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBJbXBsLnJlbmQoKTsgfQorICAgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gSW1wbC5iZWdpbigpOyB9CisgICAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gSW1wbC5lbmQoKTsgfQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gSW1wbC5iZWdpbigpOyB9CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4gSW1wbC5lbmQoKTsgfQorCisgICAgQ0ZHRWxlbWVudCBvcGVyYXRvcltdKHNpemVfdCBpKSBjb25zdCAgeworICAgICAgYXNzZXJ0KGkgPCBJbXBsLnNpemUoKSk7CisgICAgICByZXR1cm4gSW1wbFtJbXBsLnNpemUoKSAtIDEgLSBpXTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEltcGwuc2l6ZSgpOyB9CisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEltcGwuZW1wdHkoKTsgfQorICB9OworCisgIC8vLyBTdG10cyAtIFRoZSBzZXQgb2Ygc3RhdGVtZW50cyBpbiB0aGUgYmFzaWMgYmxvY2suCisgIEVsZW1lbnRMaXN0IEVsZW1lbnRzOworCisgIC8vLyBMYWJlbCAtIEFuIChvcHRpb25hbCkgbGFiZWwgdGhhdCBwcmVmaXhlcyB0aGUgZXhlY3V0YWJsZQorICAvLy8gIHN0YXRlbWVudHMgaW4gdGhlIGJsb2NrLiAgV2hlbiB0aGlzIHZhcmlhYmxlIGlzIG5vbi1OVUxMLCBpdCBpcworICAvLy8gIGVpdGhlciBhbiBpbnN0YW5jZSBvZiBMYWJlbFN0bXQsIFN3aXRjaENhc2Ugb3IgQ1hYQ2F0Y2hTdG10LgorICBTdG10ICpMYWJlbCA9IG51bGxwdHI7CisKKyAgLy8vIFRlcm1pbmF0b3IgLSBUaGUgdGVybWluYXRvciBmb3IgYSBiYXNpYyBibG9jayB0aGF0CisgIC8vLyAgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGNvbnRyb2wtZmxvdyB0aGF0IG9jY3VycyBiZXR3ZWVuIGEgYmxvY2sKKyAgLy8vICBhbmQgaXRzIHN1Y2Nlc3NvcnMuCisgIENGR1Rlcm1pbmF0b3IgVGVybWluYXRvcjsKKworICAvLy8gTG9vcFRhcmdldCAtIFNvbWUgYmxvY2tzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgImxvb3AgZWRnZSIgdG8KKyAgLy8vICB0aGUgc3RhcnQgb2YgYSBsb29wIGZyb20gd2l0aGluIHRoZSBsb29wIGJvZHkuICBUaGlzIFN0bXQqIHdpbGwgYmUKKyAgLy8vICByZWZlciB0byB0aGUgbG9vcCBzdGF0ZW1lbnQgZm9yIHN1Y2ggYmxvY2tzIChhbmQgYmUgbnVsbCBvdGhlcndpc2UpLgorICBjb25zdCBTdG10ICpMb29wVGFyZ2V0ID0gbnVsbHB0cjsKKworICAvLy8gQmxvY2tJRCAtIEEgbnVtZXJpY2FsIElEIGFzc2lnbmVkIHRvIGEgQ0ZHQmxvY2sgZHVyaW5nIGNvbnN0cnVjdGlvbgorICAvLy8gICBvZiB0aGUgQ0ZHLgorICB1bnNpZ25lZCBCbG9ja0lEOworCitwdWJsaWM6CisgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwb3RlbnRpYWwgYWRqYWNlbnQgYmxvY2sgaW4gdGhlIENGRy4gIEl0IGVuY29kZXMKKyAgLy8vIHdoZXRoZXIgb3Igbm90IHRoZSBibG9jayBpcyBhY3R1YWxseSByZWFjaGFibGUsIG9yIGNhbiBiZSBwcm92ZWQgdG8gYmUKKyAgLy8vIHRyaXZpYWxseSB1bnJlYWNoYWJsZS4gIEZvciBzb21lIGNhc2VzIGl0IGFsbG93cyBvbmUgdG8gZW5jb2RlIHNjZW5hcmlvcworICAvLy8gd2hlcmUgYSBibG9jayB3YXMgc3Vic3RpdHV0ZWQgYmVjYXVzZSB0aGUgb3JpZ2luYWwgKG5vdyBhbHRlcm5hdGUpIGJsb2NrCisgIC8vLyBpcyB1bnJlYWNoYWJsZS4KKyAgY2xhc3MgQWRqYWNlbnRCbG9jayB7CisgICAgZW51bSBLaW5kIHsKKyAgICAgIEFCX05vcm1hbCwKKyAgICAgIEFCX1VucmVhY2hhYmxlLAorICAgICAgQUJfQWx0ZXJuYXRlCisgICAgfTsKKworICAgIENGR0Jsb2NrICpSZWFjaGFibGVCbG9jazsKKyAgICBsbHZtOjpQb2ludGVySW50UGFpcjxDRkdCbG9jayAqLCAyPiBVbnJlYWNoYWJsZUJsb2NrOworCisgIHB1YmxpYzoKKyAgICAvLy8gQ29uc3RydWN0IGFuIEFkamFjZW50QmxvY2sgd2l0aCBhIHBvc3NpYmx5IHVucmVhY2hhYmxlIGJsb2NrLgorICAgIEFkamFjZW50QmxvY2soQ0ZHQmxvY2sgKkIsIGJvb2wgSXNSZWFjaGFibGUpOworICAgIAorICAgIC8vLyBDb25zdHJ1Y3QgYW4gQWRqYWNlbnRCbG9jayB3aXRoIGEgcmVhY2hhYmxlIGJsb2NrIGFuZCBhbiBhbHRlcm5hdGUKKyAgICAvLy8gdW5yZWFjaGFibGUgYmxvY2suCisgICAgQWRqYWNlbnRCbG9jayhDRkdCbG9jayAqQiwgQ0ZHQmxvY2sgKkFsdGVybmF0ZUJsb2NrKTsKKworICAgIC8vLyBHZXQgdGhlIHJlYWNoYWJsZSBibG9jaywgaWYgb25lIGV4aXN0cy4KKyAgICBDRkdCbG9jayAqZ2V0UmVhY2hhYmxlQmxvY2soKSBjb25zdCB7CisgICAgICByZXR1cm4gUmVhY2hhYmxlQmxvY2s7CisgICAgfQorCisgICAgLy8vIEdldCB0aGUgcG90ZW50aWFsbHkgdW5yZWFjaGFibGUgYmxvY2suCisgICAgQ0ZHQmxvY2sgKmdldFBvc3NpYmx5VW5yZWFjaGFibGVCbG9jaygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBVbnJlYWNoYWJsZUJsb2NrLmdldFBvaW50ZXIoKTsKKyAgICB9CisKKyAgICAvLy8gUHJvdmlkZSBhbiBpbXBsaWNpdCBjb252ZXJzaW9uIHRvIENGR0Jsb2NrKiBzbyB0aGF0CisgICAgLy8vIEFkamFjZW50QmxvY2sgY2FuIGJlIHN1YnN0aXR1dGVkIGZvciBDRkdCbG9jayouCisgICAgb3BlcmF0b3IgQ0ZHQmxvY2sqKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFJlYWNoYWJsZUJsb2NrKCk7CisgICAgfQorCisgICAgQ0ZHQmxvY2smIG9wZXJhdG9yICooKSBjb25zdCB7CisgICAgICByZXR1cm4gKmdldFJlYWNoYWJsZUJsb2NrKCk7CisgICAgfQorCisgICAgQ0ZHQmxvY2sqIG9wZXJhdG9yIC0+KCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFJlYWNoYWJsZUJsb2NrKCk7CisgICAgfQorCisgICAgYm9vbCBpc1JlYWNoYWJsZSgpIGNvbnN0IHsKKyAgICAgIEtpbmQgSyA9IChLaW5kKSBVbnJlYWNoYWJsZUJsb2NrLmdldEludCgpOworICAgICAgcmV0dXJuIEsgPT0gQUJfTm9ybWFsIHx8IEsgPT0gQUJfQWx0ZXJuYXRlOworICAgIH0KKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIFByZWRlY2Vzc29ycy9TdWNjZXNzb3JzIC0gS2VlcCB0cmFjayBvZiB0aGUgcHJlZGVjZXNzb3IgLyBzdWNjZXNzb3IKKyAgLy8vIENGRyBibG9ja3MuCisgIHVzaW5nIEFkamFjZW50QmxvY2tzID0gQnVtcFZlY3RvcjxBZGphY2VudEJsb2NrPjsKKyAgQWRqYWNlbnRCbG9ja3MgUHJlZHM7CisgIEFkamFjZW50QmxvY2tzIFN1Y2NzOworCisgIC8vLyBOb1JldHVybiAtIFRoaXMgYml0IGlzIHNldCB3aGVuIHRoZSBiYXNpYyBibG9jayBjb250YWlucyBhIGZ1bmN0aW9uIGNhbGwKKyAgLy8vIG9yIGltcGxpY2l0IGRlc3RydWN0b3IgdGhhdCBpcyBhdHRyaWJ1dGVkIGFzICdub3JldHVybicuIEluIHRoYXQgY2FzZSwKKyAgLy8vIGNvbnRyb2wgY2Fubm90IHRlY2huaWNhbGx5IGV2ZXIgcHJvY2VlZCBwYXN0IHRoaXMgYmxvY2suIEFsbCBzdWNoIGJsb2NrcworICAvLy8gd2lsbCBoYXZlIGEgc2luZ2xlIGltbWVkaWF0ZSBzdWNjZXNzb3I6IHRoZSBleGl0IGJsb2NrLiBUaGlzIGFsbG93cyB0aGVtCisgIC8vLyB0byBiZSBlYXNpbHkgcmVhY2hlZCBmcm9tIHRoZSBleGl0IGJsb2NrIGFuZCB1c2luZyB0aGlzIGJpdCBxdWlja2x5CisgIC8vLyByZWNvZ25pemVkIHdpdGhvdXQgc2Nhbm5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBibG9jay4KKyAgLy8vCisgIC8vLyBPcHRpbWl6YXRpb24gTm90ZTogVGhpcyBiaXQgY291bGQgYmUgcHJvZml0YWJseSBmb2xkZWQgd2l0aCBUZXJtaW5hdG9yJ3MKKyAgLy8vIHN0b3JhZ2UgaWYgdGhlIG1lbW9yeSB1c2FnZSBvZiBDRkdCbG9jayBiZWNvbWVzIGFuIGlzc3VlLgorICB1bnNpZ25lZCBIYXNOb1JldHVybkVsZW1lbnQgOiAxOworCisgIC8vLyBQYXJlbnQgLSBUaGUgcGFyZW50IENGRyB0aGF0IG93bnMgdGhpcyBDRkdCbG9jay4KKyAgQ0ZHICpQYXJlbnQ7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ0ZHQmxvY2sodW5zaWduZWQgYmxvY2tpZCwgQnVtcFZlY3RvckNvbnRleHQgJkMsIENGRyAqcGFyZW50KQorICAgICAgOiBFbGVtZW50cyhDKSwgVGVybWluYXRvcihudWxscHRyKSwgQmxvY2tJRChibG9ja2lkKSwgUHJlZHMoQywgMSksCisgICAgICAgIFN1Y2NzKEMsIDEpLCBIYXNOb1JldHVybkVsZW1lbnQoZmFsc2UpLCBQYXJlbnQocGFyZW50KSB7fQorCisgIC8vIFN0YXRlbWVudCBpdGVyYXRvcnMKKyAgdXNpbmcgaXRlcmF0b3IgPSBFbGVtZW50TGlzdDo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gRWxlbWVudExpc3Q6OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyByZXZlcnNlX2l0ZXJhdG9yID0gRWxlbWVudExpc3Q6OnJldmVyc2VfaXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgPSBFbGVtZW50TGlzdDo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICBDRkdFbGVtZW50ICAgICAgICAgICAgICAgICBmcm9udCgpICAgICAgIGNvbnN0IHsgcmV0dXJuIEVsZW1lbnRzLmZyb250KCk7ICAgfQorICBDRkdFbGVtZW50ICAgICAgICAgICAgICAgICBiYWNrKCkgICAgICAgIGNvbnN0IHsgcmV0dXJuIEVsZW1lbnRzLmJhY2soKTsgICAgfQorCisgIGl0ZXJhdG9yICAgICAgICAgICAgICAgICAgIGJlZ2luKCkgICAgICAgICAgICAgeyByZXR1cm4gRWxlbWVudHMuYmVnaW4oKTsgICB9CisgIGl0ZXJhdG9yICAgICAgICAgICAgICAgICAgIGVuZCgpICAgICAgICAgICAgICAgeyByZXR1cm4gRWxlbWVudHMuZW5kKCk7ICAgICB9CisgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgICAgIGJlZ2luKCkgICAgICAgY29uc3QgeyByZXR1cm4gRWxlbWVudHMuYmVnaW4oKTsgICB9CisgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgICAgIGVuZCgpICAgICAgICAgY29uc3QgeyByZXR1cm4gRWxlbWVudHMuZW5kKCk7ICAgICB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciAgICAgICAgICAgcmJlZ2luKCkgICAgICAgICAgICB7IHJldHVybiBFbGVtZW50cy5yYmVnaW4oKTsgIH0KKyAgcmV2ZXJzZV9pdGVyYXRvciAgICAgICAgICAgcmVuZCgpICAgICAgICAgICAgICB7IHJldHVybiBFbGVtZW50cy5yZW5kKCk7ICAgIH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAgICAgcmJlZ2luKCkgICAgICBjb25zdCB7IHJldHVybiBFbGVtZW50cy5yYmVnaW4oKTsgIH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAgICAgcmVuZCgpICAgICAgICBjb25zdCB7IHJldHVybiBFbGVtZW50cy5yZW5kKCk7ICAgIH0KKworICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICBzaXplKCkgICAgICAgIGNvbnN0IHsgcmV0dXJuIEVsZW1lbnRzLnNpemUoKTsgICAgfQorICBib29sICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSgpICAgICAgIGNvbnN0IHsgcmV0dXJuIEVsZW1lbnRzLmVtcHR5KCk7ICAgfQorCisgIENGR0VsZW1lbnQgb3BlcmF0b3JbXShzaXplX3QgaSkgY29uc3QgIHsgcmV0dXJuIEVsZW1lbnRzW2ldOyB9CisKKyAgLy8gQ0ZHIGl0ZXJhdG9ycworICB1c2luZyBwcmVkX2l0ZXJhdG9yID0gQWRqYWNlbnRCbG9ja3M6Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9wcmVkX2l0ZXJhdG9yID0gQWRqYWNlbnRCbG9ja3M6OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBwcmVkX3JldmVyc2VfaXRlcmF0b3IgPSBBZGphY2VudEJsb2Nrczo6cmV2ZXJzZV9pdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfcHJlZF9yZXZlcnNlX2l0ZXJhdG9yID0gQWRqYWNlbnRCbG9ja3M6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgIHVzaW5nIHByZWRfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxwcmVkX2l0ZXJhdG9yPjsKKyAgdXNpbmcgcHJlZF9jb25zdF9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPGNvbnN0X3ByZWRfaXRlcmF0b3I+OworCisgIHVzaW5nIHN1Y2NfaXRlcmF0b3IgPSBBZGphY2VudEJsb2Nrczo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X3N1Y2NfaXRlcmF0b3IgPSBBZGphY2VudEJsb2Nrczo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIHN1Y2NfcmV2ZXJzZV9pdGVyYXRvciA9IEFkamFjZW50QmxvY2tzOjpyZXZlcnNlX2l0ZXJhdG9yOworICB1c2luZyBjb25zdF9zdWNjX3JldmVyc2VfaXRlcmF0b3IgPSBBZGphY2VudEJsb2Nrczo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdXNpbmcgc3VjY19yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPHN1Y2NfaXRlcmF0b3I+OworICB1c2luZyBzdWNjX2NvbnN0X3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8Y29uc3Rfc3VjY19pdGVyYXRvcj47CisKKyAgcHJlZF9pdGVyYXRvciAgICAgICAgICAgICAgICBwcmVkX2JlZ2luKCkgICAgICAgIHsgcmV0dXJuIFByZWRzLmJlZ2luKCk7ICAgfQorICBwcmVkX2l0ZXJhdG9yICAgICAgICAgICAgICAgIHByZWRfZW5kKCkgICAgICAgICAgeyByZXR1cm4gUHJlZHMuZW5kKCk7ICAgICB9CisgIGNvbnN0X3ByZWRfaXRlcmF0b3IgICAgICAgICAgcHJlZF9iZWdpbigpICBjb25zdCB7IHJldHVybiBQcmVkcy5iZWdpbigpOyAgIH0KKyAgY29uc3RfcHJlZF9pdGVyYXRvciAgICAgICAgICBwcmVkX2VuZCgpICAgIGNvbnN0IHsgcmV0dXJuIFByZWRzLmVuZCgpOyAgICAgfQorCisgIHByZWRfcmV2ZXJzZV9pdGVyYXRvciAgICAgICAgcHJlZF9yYmVnaW4oKSAgICAgICB7IHJldHVybiBQcmVkcy5yYmVnaW4oKTsgIH0KKyAgcHJlZF9yZXZlcnNlX2l0ZXJhdG9yICAgICAgICBwcmVkX3JlbmQoKSAgICAgICAgIHsgcmV0dXJuIFByZWRzLnJlbmQoKTsgICAgfQorICBjb25zdF9wcmVkX3JldmVyc2VfaXRlcmF0b3IgIHByZWRfcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gUHJlZHMucmJlZ2luKCk7ICB9CisgIGNvbnN0X3ByZWRfcmV2ZXJzZV9pdGVyYXRvciAgcHJlZF9yZW5kKCkgICBjb25zdCB7IHJldHVybiBQcmVkcy5yZW5kKCk7ICAgIH0KKworICBwcmVkX3JhbmdlIHByZWRzKCkgeworICAgIHJldHVybiBwcmVkX3JhbmdlKHByZWRfYmVnaW4oKSwgcHJlZF9lbmQoKSk7CisgIH0KKworICBwcmVkX2NvbnN0X3JhbmdlIHByZWRzKCkgY29uc3QgeworICAgIHJldHVybiBwcmVkX2NvbnN0X3JhbmdlKHByZWRfYmVnaW4oKSwgcHJlZF9lbmQoKSk7CisgIH0KKworICBzdWNjX2l0ZXJhdG9yICAgICAgICAgICAgICAgIHN1Y2NfYmVnaW4oKSAgICAgICAgeyByZXR1cm4gU3VjY3MuYmVnaW4oKTsgICB9CisgIHN1Y2NfaXRlcmF0b3IgICAgICAgICAgICAgICAgc3VjY19lbmQoKSAgICAgICAgICB7IHJldHVybiBTdWNjcy5lbmQoKTsgICAgIH0KKyAgY29uc3Rfc3VjY19pdGVyYXRvciAgICAgICAgICBzdWNjX2JlZ2luKCkgIGNvbnN0IHsgcmV0dXJuIFN1Y2NzLmJlZ2luKCk7ICAgfQorICBjb25zdF9zdWNjX2l0ZXJhdG9yICAgICAgICAgIHN1Y2NfZW5kKCkgICAgY29uc3QgeyByZXR1cm4gU3VjY3MuZW5kKCk7ICAgICB9CisKKyAgc3VjY19yZXZlcnNlX2l0ZXJhdG9yICAgICAgICBzdWNjX3JiZWdpbigpICAgICAgIHsgcmV0dXJuIFN1Y2NzLnJiZWdpbigpOyAgfQorICBzdWNjX3JldmVyc2VfaXRlcmF0b3IgICAgICAgIHN1Y2NfcmVuZCgpICAgICAgICAgeyByZXR1cm4gU3VjY3MucmVuZCgpOyAgICB9CisgIGNvbnN0X3N1Y2NfcmV2ZXJzZV9pdGVyYXRvciAgc3VjY19yYmVnaW4oKSBjb25zdCB7IHJldHVybiBTdWNjcy5yYmVnaW4oKTsgIH0KKyAgY29uc3Rfc3VjY19yZXZlcnNlX2l0ZXJhdG9yICBzdWNjX3JlbmQoKSAgIGNvbnN0IHsgcmV0dXJuIFN1Y2NzLnJlbmQoKTsgICAgfQorCisgIHN1Y2NfcmFuZ2Ugc3VjY3MoKSB7CisgICAgcmV0dXJuIHN1Y2NfcmFuZ2Uoc3VjY19iZWdpbigpLCBzdWNjX2VuZCgpKTsKKyAgfQorCisgIHN1Y2NfY29uc3RfcmFuZ2Ugc3VjY3MoKSBjb25zdCB7CisgICAgcmV0dXJuIHN1Y2NfY29uc3RfcmFuZ2Uoc3VjY19iZWdpbigpLCBzdWNjX2VuZCgpKTsKKyAgfQorCisgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgc3VjY19zaXplKCkgICBjb25zdCB7IHJldHVybiBTdWNjcy5zaXplKCk7ICAgIH0KKyAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjX2VtcHR5KCkgIGNvbnN0IHsgcmV0dXJuIFN1Y2NzLmVtcHR5KCk7ICAgfQorCisgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgcHJlZF9zaXplKCkgICBjb25zdCB7IHJldHVybiBQcmVkcy5zaXplKCk7ICAgIH0KKyAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkX2VtcHR5KCkgIGNvbnN0IHsgcmV0dXJuIFByZWRzLmVtcHR5KCk7ICAgfQorCisKKyAgY2xhc3MgRmlsdGVyT3B0aW9ucyB7CisgIHB1YmxpYzoKKyAgICB1bnNpZ25lZCBJZ25vcmVOdWxsUHJlZGVjZXNzb3JzIDogMTsKKyAgICB1bnNpZ25lZCBJZ25vcmVEZWZhdWx0c1dpdGhDb3ZlcmVkRW51bXMgOiAxOworCisgICAgRmlsdGVyT3B0aW9ucygpCisgICAgICAgIDogSWdub3JlTnVsbFByZWRlY2Vzc29ycygxKSwgSWdub3JlRGVmYXVsdHNXaXRoQ292ZXJlZEVudW1zKDApIHt9CisgIH07CisKKyAgc3RhdGljIGJvb2wgRmlsdGVyRWRnZShjb25zdCBGaWx0ZXJPcHRpb25zICZGLCBjb25zdCBDRkdCbG9jayAqU3JjLAorICAgICAgIGNvbnN0IENGR0Jsb2NrICpEc3QpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJTVBMLCBib29sIElzUHJlZD4KKyAgY2xhc3MgRmlsdGVyZWRDRkdCbG9ja0l0ZXJhdG9yIHsKKyAgcHJpdmF0ZToKKyAgICBJTVBMIEksIEU7CisgICAgY29uc3QgRmlsdGVyT3B0aW9ucyBGOworICAgIGNvbnN0IENGR0Jsb2NrICpGcm9tOworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBGaWx0ZXJlZENGR0Jsb2NrSXRlcmF0b3IoY29uc3QgSU1QTCAmaSwgY29uc3QgSU1QTCAmZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZHQmxvY2sgKmZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbHRlck9wdGlvbnMgJmYpCisgICAgICAgIDogSShpKSwgRShlKSwgRihmKSwgRnJvbShmcm9tKSB7CisgICAgICB3aGlsZSAoaGFzTW9yZSgpICYmIEZpbHRlcigqSSkpCisgICAgICAgICsrSTsKKyAgICB9CisKKyAgICBib29sIGhhc01vcmUoKSBjb25zdCB7IHJldHVybiBJICE9IEU7IH0KKworICAgIEZpbHRlcmVkQ0ZHQmxvY2tJdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICAgIGRvIHsgKytJOyB9IHdoaWxlIChoYXNNb3JlKCkgJiYgRmlsdGVyKCpJKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgY29uc3QgQ0ZHQmxvY2sgKm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpJOyB9CisKKyAgcHJpdmF0ZToKKyAgICBib29sIEZpbHRlcihjb25zdCBDRkdCbG9jayAqVG8pIHsKKyAgICAgIHJldHVybiBJc1ByZWQgPyBGaWx0ZXJFZGdlKEYsIFRvLCBGcm9tKSA6IEZpbHRlckVkZ2UoRiwgRnJvbSwgVG8pOworICAgIH0KKyAgfTsKKworICB1c2luZyBmaWx0ZXJlZF9wcmVkX2l0ZXJhdG9yID0KKyAgICAgIEZpbHRlcmVkQ0ZHQmxvY2tJdGVyYXRvcjxjb25zdF9wcmVkX2l0ZXJhdG9yLCB0cnVlPjsKKworICB1c2luZyBmaWx0ZXJlZF9zdWNjX2l0ZXJhdG9yID0KKyAgICAgIEZpbHRlcmVkQ0ZHQmxvY2tJdGVyYXRvcjxjb25zdF9zdWNjX2l0ZXJhdG9yLCBmYWxzZT47CisKKyAgZmlsdGVyZWRfcHJlZF9pdGVyYXRvciBmaWx0ZXJlZF9wcmVkX3N0YXJ0X2VuZChjb25zdCBGaWx0ZXJPcHRpb25zICZmKSBjb25zdCB7CisgICAgcmV0dXJuIGZpbHRlcmVkX3ByZWRfaXRlcmF0b3IocHJlZF9iZWdpbigpLCBwcmVkX2VuZCgpLCB0aGlzLCBmKTsKKyAgfQorCisgIGZpbHRlcmVkX3N1Y2NfaXRlcmF0b3IgZmlsdGVyZWRfc3VjY19zdGFydF9lbmQoY29uc3QgRmlsdGVyT3B0aW9ucyAmZikgY29uc3QgeworICAgIHJldHVybiBmaWx0ZXJlZF9zdWNjX2l0ZXJhdG9yKHN1Y2NfYmVnaW4oKSwgc3VjY19lbmQoKSwgdGhpcywgZik7CisgIH0KKworICAvLyBNYW5pcHVsYXRpb24gb2YgYmxvY2sgY29udGVudHMKKworICB2b2lkIHNldFRlcm1pbmF0b3IoQ0ZHVGVybWluYXRvciBUZXJtKSB7IFRlcm1pbmF0b3IgPSBUZXJtOyB9CisgIHZvaWQgc2V0TGFiZWwoU3RtdCAqU3RhdGVtZW50KSB7IExhYmVsID0gU3RhdGVtZW50OyB9CisgIHZvaWQgc2V0TG9vcFRhcmdldChjb25zdCBTdG10ICpsb29wVGFyZ2V0KSB7IExvb3BUYXJnZXQgPSBsb29wVGFyZ2V0OyB9CisgIHZvaWQgc2V0SGFzTm9SZXR1cm5FbGVtZW50KCkgeyBIYXNOb1JldHVybkVsZW1lbnQgPSB0cnVlOyB9CisKKyAgQ0ZHVGVybWluYXRvciBnZXRUZXJtaW5hdG9yKCkgeyByZXR1cm4gVGVybWluYXRvcjsgfQorICBjb25zdCBDRkdUZXJtaW5hdG9yIGdldFRlcm1pbmF0b3IoKSBjb25zdCB7IHJldHVybiBUZXJtaW5hdG9yOyB9CisKKyAgU3RtdCAqZ2V0VGVybWluYXRvckNvbmRpdGlvbihib29sIFN0cmlwUGFyZW5zID0gdHJ1ZSk7CisKKyAgY29uc3QgU3RtdCAqZ2V0VGVybWluYXRvckNvbmRpdGlvbihib29sIFN0cmlwUGFyZW5zID0gdHJ1ZSkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PENGR0Jsb2NrKj4odGhpcyktPmdldFRlcm1pbmF0b3JDb25kaXRpb24oU3RyaXBQYXJlbnMpOworICB9CisKKyAgY29uc3QgU3RtdCAqZ2V0TG9vcFRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIExvb3BUYXJnZXQ7IH0KKworICBTdG10ICpnZXRMYWJlbCgpIHsgcmV0dXJuIExhYmVsOyB9CisgIGNvbnN0IFN0bXQgKmdldExhYmVsKCkgY29uc3QgeyByZXR1cm4gTGFiZWw7IH0KKworICBib29sIGhhc05vUmV0dXJuRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIEhhc05vUmV0dXJuRWxlbWVudDsgfQorCisgIHVuc2lnbmVkIGdldEJsb2NrSUQoKSBjb25zdCB7IHJldHVybiBCbG9ja0lEOyB9CisKKyAgQ0ZHICpnZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBQYXJlbnQ7IH0KKworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICB2b2lkIGR1bXAoY29uc3QgQ0ZHICpjZmcsIGNvbnN0IExhbmdPcHRpb25zICZMTywgYm9vbCBTaG93Q29sb3JzID0gZmFsc2UpIGNvbnN0OworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgQ0ZHKiBjZmcsIGNvbnN0IExhbmdPcHRpb25zICZMTywKKyAgICAgICAgICAgICBib29sIFNob3dDb2xvcnMpIGNvbnN0OworICB2b2lkIHByaW50VGVybWluYXRvcihyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IExhbmdPcHRpb25zICZMTykgY29uc3Q7CisgIHZvaWQgcHJpbnRBc09wZXJhbmQocmF3X29zdHJlYW0gJk9TLCBib29sIC8qUHJpbnRUeXBlKi8pIHsKKyAgICBPUyA8PCAiQkIjIiA8PCBnZXRCbG9ja0lEKCk7CisgIH0KKworICAvLy8gQWRkcyBhIChwb3RlbnRpYWxseSB1bnJlYWNoYWJsZSkgc3VjY2Vzc29yIGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLgorICB2b2lkIGFkZFN1Y2Nlc3NvcihBZGphY2VudEJsb2NrIFN1Y2MsIEJ1bXBWZWN0b3JDb250ZXh0ICZDKTsKKworICB2b2lkIGFwcGVuZFN0bXQoU3RtdCAqc3RhdGVtZW50LCBCdW1wVmVjdG9yQ29udGV4dCAmQykgeworICAgIEVsZW1lbnRzLnB1c2hfYmFjayhDRkdTdG10KHN0YXRlbWVudCksIEMpOworICB9CisKKyAgdm9pZCBhcHBlbmRDb25zdHJ1Y3RvcihDWFhDb25zdHJ1Y3RFeHByICpDRSwgY29uc3QgQ29uc3RydWN0aW9uQ29udGV4dCAqQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVtcFZlY3RvckNvbnRleHQgJkMpIHsKKyAgICBFbGVtZW50cy5wdXNoX2JhY2soQ0ZHQ29uc3RydWN0b3IoQ0UsIENDKSwgQyk7CisgIH0KKworICB2b2lkIGFwcGVuZENYWFJlY29yZFR5cGVkQ2FsbChDYWxsRXhwciAqQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN0cnVjdGlvbkNvbnRleHQgKkNDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW1wVmVjdG9yQ29udGV4dCAmQykgeworICAgIEVsZW1lbnRzLnB1c2hfYmFjayhDRkdDWFhSZWNvcmRUeXBlZENhbGwoQ0UsIENDKSwgQyk7CisgIH0KKworICB2b2lkIGFwcGVuZEluaXRpYWxpemVyKENYWEN0b3JJbml0aWFsaXplciAqaW5pdGlhbGl6ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBCdW1wVmVjdG9yQ29udGV4dCAmQykgeworICAgIEVsZW1lbnRzLnB1c2hfYmFjayhDRkdJbml0aWFsaXplcihpbml0aWFsaXplciksIEMpOworICB9CisKKyAgdm9pZCBhcHBlbmROZXdBbGxvY2F0b3IoQ1hYTmV3RXhwciAqTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bXBWZWN0b3JDb250ZXh0ICZDKSB7CisgICAgRWxlbWVudHMucHVzaF9iYWNrKENGR05ld0FsbG9jYXRvcihORSksIEMpOworICB9CisKKyAgdm9pZCBhcHBlbmRTY29wZUJlZ2luKGNvbnN0IFZhckRlY2wgKlZELCBjb25zdCBTdG10ICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgQnVtcFZlY3RvckNvbnRleHQgJkMpIHsKKyAgICBFbGVtZW50cy5wdXNoX2JhY2soQ0ZHU2NvcGVCZWdpbihWRCwgUyksIEMpOworICB9CisKKyAgdm9pZCBwcmVwZW5kU2NvcGVCZWdpbihjb25zdCBWYXJEZWNsICpWRCwgY29uc3QgU3RtdCAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdW1wVmVjdG9yQ29udGV4dCAmQykgeworICAgIEVsZW1lbnRzLmluc2VydChFbGVtZW50cy5yYmVnaW4oKSwgMSwgQ0ZHU2NvcGVCZWdpbihWRCwgUyksIEMpOworICB9CisKKyAgdm9pZCBhcHBlbmRTY29wZUVuZChjb25zdCBWYXJEZWNsICpWRCwgY29uc3QgU3RtdCAqUywgQnVtcFZlY3RvckNvbnRleHQgJkMpIHsKKyAgICBFbGVtZW50cy5wdXNoX2JhY2soQ0ZHU2NvcGVFbmQoVkQsIFMpLCBDKTsKKyAgfQorCisgIHZvaWQgcHJlcGVuZFNjb3BlRW5kKGNvbnN0IFZhckRlY2wgKlZELCBjb25zdCBTdG10ICpTLCBCdW1wVmVjdG9yQ29udGV4dCAmQykgeworICAgIEVsZW1lbnRzLmluc2VydChFbGVtZW50cy5yYmVnaW4oKSwgMSwgQ0ZHU2NvcGVFbmQoVkQsIFMpLCBDKTsKKyAgfQorCisgIHZvaWQgYXBwZW5kQmFzZUR0b3IoY29uc3QgQ1hYQmFzZVNwZWNpZmllciAqQlMsIEJ1bXBWZWN0b3JDb250ZXh0ICZDKSB7CisgICAgRWxlbWVudHMucHVzaF9iYWNrKENGR0Jhc2VEdG9yKEJTKSwgQyk7CisgIH0KKworICB2b2lkIGFwcGVuZE1lbWJlckR0b3IoRmllbGREZWNsICpGRCwgQnVtcFZlY3RvckNvbnRleHQgJkMpIHsKKyAgICBFbGVtZW50cy5wdXNoX2JhY2soQ0ZHTWVtYmVyRHRvcihGRCksIEMpOworICB9CisKKyAgdm9pZCBhcHBlbmRUZW1wb3JhcnlEdG9yKENYWEJpbmRUZW1wb3JhcnlFeHByICpFLCBCdW1wVmVjdG9yQ29udGV4dCAmQykgeworICAgIEVsZW1lbnRzLnB1c2hfYmFjayhDRkdUZW1wb3JhcnlEdG9yKEUpLCBDKTsKKyAgfQorCisgIHZvaWQgYXBwZW5kQXV0b21hdGljT2JqRHRvcihWYXJEZWNsICpWRCwgU3RtdCAqUywgQnVtcFZlY3RvckNvbnRleHQgJkMpIHsKKyAgICBFbGVtZW50cy5wdXNoX2JhY2soQ0ZHQXV0b21hdGljT2JqRHRvcihWRCwgUyksIEMpOworICB9CisKKyAgdm9pZCBhcHBlbmRMaWZldGltZUVuZHMoVmFyRGVjbCAqVkQsIFN0bXQgKlMsIEJ1bXBWZWN0b3JDb250ZXh0ICZDKSB7CisgICAgRWxlbWVudHMucHVzaF9iYWNrKENGR0xpZmV0aW1lRW5kcyhWRCwgUyksIEMpOworICB9CisKKyAgdm9pZCBhcHBlbmRMb29wRXhpdChjb25zdCBTdG10ICpMb29wU3RtdCwgQnVtcFZlY3RvckNvbnRleHQgJkMpIHsKKyAgICBFbGVtZW50cy5wdXNoX2JhY2soQ0ZHTG9vcEV4aXQoTG9vcFN0bXQpLCBDKTsKKyAgfQorCisgIHZvaWQgYXBwZW5kRGVsZXRlRHRvcihDWFhSZWNvcmREZWNsICpSRCwgQ1hYRGVsZXRlRXhwciAqREUsIEJ1bXBWZWN0b3JDb250ZXh0ICZDKSB7CisgICAgRWxlbWVudHMucHVzaF9iYWNrKENGR0RlbGV0ZUR0b3IoUkQsIERFKSwgQyk7CisgIH0KKworICAvLyBEZXN0cnVjdG9ycyBtdXN0IGJlIGluc2VydGVkIGluIHJldmVyc2VkIG9yZGVyLiBTbyBpbnNlcnRpb24gaXMgaW4gdHdvCisgIC8vIHN0ZXBzLiBGaXJzdCB3ZSBwcmVwYXJlIHNwYWNlIGZvciBzb21lIG51bWJlciBvZiBlbGVtZW50cywgdGhlbiB3ZSBpbnNlcnQKKyAgLy8gdGhlIGVsZW1lbnRzIGJlZ2lubmluZyBhdCB0aGUgbGFzdCBwb3NpdGlvbiBpbiBwcmVwYXJlZCBzcGFjZS4KKyAgaXRlcmF0b3IgYmVnaW5BdXRvbWF0aWNPYmpEdG9yc0luc2VydChpdGVyYXRvciBJLCBzaXplX3QgQ250LAorICAgICAgQnVtcFZlY3RvckNvbnRleHQgJkMpIHsKKyAgICByZXR1cm4gaXRlcmF0b3IoRWxlbWVudHMuaW5zZXJ0KEkuYmFzZSgpLCBDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkdBdXRvbWF0aWNPYmpEdG9yKG51bGxwdHIsIG51bGxwdHIpLCBDKSk7CisgIH0KKyAgaXRlcmF0b3IgaW5zZXJ0QXV0b21hdGljT2JqRHRvcihpdGVyYXRvciBJLCBWYXJEZWNsICpWRCwgU3RtdCAqUykgeworICAgICpJID0gQ0ZHQXV0b21hdGljT2JqRHRvcihWRCwgUyk7CisgICAgcmV0dXJuICsrSTsKKyAgfQorCisgIC8vIFNjb3BlIGxlYXZpbmcgbXVzdCBiZSBwZXJmb3JtZWQgaW4gcmV2ZXJzZWQgb3JkZXIuIFNvIGluc2VydGlvbiBpcyBpbiB0d28KKyAgLy8gc3RlcHMuIEZpcnN0IHdlIHByZXBhcmUgc3BhY2UgZm9yIHNvbWUgbnVtYmVyIG9mIGVsZW1lbnRzLCB0aGVuIHdlIGluc2VydAorICAvLyB0aGUgZWxlbWVudHMgYmVnaW5uaW5nIGF0IHRoZSBsYXN0IHBvc2l0aW9uIGluIHByZXBhcmVkIHNwYWNlLgorICBpdGVyYXRvciBiZWdpbkxpZmV0aW1lRW5kc0luc2VydChpdGVyYXRvciBJLCBzaXplX3QgQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW1wVmVjdG9yQ29udGV4dCAmQykgeworICAgIHJldHVybiBpdGVyYXRvcigKKyAgICAgICAgRWxlbWVudHMuaW5zZXJ0KEkuYmFzZSgpLCBDbnQsIENGR0xpZmV0aW1lRW5kcyhudWxscHRyLCBudWxscHRyKSwgQykpOworICB9CisgIGl0ZXJhdG9yIGluc2VydExpZmV0aW1lRW5kcyhpdGVyYXRvciBJLCBWYXJEZWNsICpWRCwgU3RtdCAqUykgeworICAgICpJID0gQ0ZHTGlmZXRpbWVFbmRzKFZELCBTKTsKKyAgICByZXR1cm4gKytJOworICB9CisKKyAgLy8gU2NvcGUgbGVhdmluZyBtdXN0IGJlIHBlcmZvcm1lZCBpbiByZXZlcnNlZCBvcmRlci4gU28gaW5zZXJ0aW9uIGlzIGluIHR3bworICAvLyBzdGVwcy4gRmlyc3Qgd2UgcHJlcGFyZSBzcGFjZSBmb3Igc29tZSBudW1iZXIgb2YgZWxlbWVudHMsIHRoZW4gd2UgaW5zZXJ0CisgIC8vIHRoZSBlbGVtZW50cyBiZWdpbm5pbmcgYXQgdGhlIGxhc3QgcG9zaXRpb24gaW4gcHJlcGFyZWQgc3BhY2UuCisgIGl0ZXJhdG9yIGJlZ2luU2NvcGVFbmRJbnNlcnQoaXRlcmF0b3IgSSwgc2l6ZV90IENudCwgQnVtcFZlY3RvckNvbnRleHQgJkMpIHsKKyAgICByZXR1cm4gaXRlcmF0b3IoCisgICAgICAgIEVsZW1lbnRzLmluc2VydChJLmJhc2UoKSwgQ250LCBDRkdTY29wZUVuZChudWxscHRyLCBudWxscHRyKSwgQykpOworICB9CisgIGl0ZXJhdG9yIGluc2VydFNjb3BlRW5kKGl0ZXJhdG9yIEksIFZhckRlY2wgKlZELCBTdG10ICpTKSB7CisgICAgKkkgPSBDRkdTY29wZUVuZChWRCwgUyk7CisgICAgcmV0dXJuICsrSTsKKyAgfQorCit9OworCisvLy8gXGJyaWVmIENGR0NhbGxiYWNrIGRlZmluZXMgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIGxvZ2ljYWwKKy8vLyBvcGVyYXRvciBlcnJvciBpcyBmb3VuZCB3aGVuIGJ1aWxkaW5nIHRoZSBDRkcuCitjbGFzcyBDRkdDYWxsYmFjayB7CitwdWJsaWM6CisgIENGR0NhbGxiYWNrKCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIH5DRkdDYWxsYmFjaygpID0gZGVmYXVsdDsKKworICB2aXJ0dWFsIHZvaWQgY29tcGFyZUFsd2F5c1RydWUoY29uc3QgQmluYXJ5T3BlcmF0b3IgKkIsIGJvb2wgaXNBbHdheXNUcnVlKSB7fQorICB2aXJ0dWFsIHZvaWQgY29tcGFyZUJpdHdpc2VFcXVhbGl0eShjb25zdCBCaW5hcnlPcGVyYXRvciAqQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0Fsd2F5c1RydWUpIHt9Cit9OworCisvLy8gQ0ZHIC0gUmVwcmVzZW50cyBhIHNvdXJjZS1sZXZlbCwgaW50cmEtcHJvY2VkdXJhbCBDRkcgdGhhdCByZXByZXNlbnRzIHRoZQorLy8vICBjb250cm9sLWZsb3cgb2YgYSBTdG10LiAgVGhlIFN0bXQgY2FuIHJlcHJlc2VudCBhbiBlbnRpcmUgZnVuY3Rpb24gYm9keSwKKy8vLyAgb3IgYSBzaW5nbGUgZXhwcmVzc2lvbi4gIEEgQ0ZHIHdpbGwgYWx3YXlzIGNvbnRhaW4gb25lIGVtcHR5IGJsb2NrIHRoYXQKKy8vLyAgcmVwcmVzZW50cyB0aGUgRXhpdCBwb2ludCBvZiB0aGUgQ0ZHLiAgQSBDRkcgd2lsbCBhbHNvIGNvbnRhaW4gYSBkZXNpZ25hdGVkCisvLy8gIEVudHJ5IGJsb2NrLiAgVGhlIENGRyBzb2xlbHkgcmVwcmVzZW50cyBjb250cm9sLWZsb3c7IGl0IGNvbnNpc3RzIG9mCisvLy8gIENGR0Jsb2NrcyB3aGljaCBhcmUgc2ltcGx5IGNvbnRhaW5lcnMgb2YgU3RtdConcyBpbiB0aGUgQVNUIHRoZSBDRkcKKy8vLyAgd2FzIGNvbnN0cnVjdGVkIGZyb20uCitjbGFzcyBDRkcgeworcHVibGljOgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQ0ZHIENvbnN0cnVjdGlvbiAmIE1hbmlwdWxhdGlvbi4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgY2xhc3MgQnVpbGRPcHRpb25zIHsKKyAgICBzdGQ6OmJpdHNldDxTdG10OjpsYXN0U3RtdENvbnN0YW50PiBhbHdheXNBZGRNYXNrOworCisgIHB1YmxpYzoKKyAgICB1c2luZyBGb3JjZWRCbGtFeHBycyA9IGxsdm06OkRlbnNlTWFwPGNvbnN0IFN0bXQgKiwgY29uc3QgQ0ZHQmxvY2sgKj47CisKKyAgICBGb3JjZWRCbGtFeHBycyAqKmZvcmNlZEJsa0V4cHJzID0gbnVsbHB0cjsKKyAgICBDRkdDYWxsYmFjayAqT2JzZXJ2ZXIgPSBudWxscHRyOworICAgIGJvb2wgUHJ1bmVUcml2aWFsbHlGYWxzZUVkZ2VzID0gdHJ1ZTsKKyAgICBib29sIEFkZEVIRWRnZXMgPSBmYWxzZTsKKyAgICBib29sIEFkZEluaXRpYWxpemVycyA9IGZhbHNlOworICAgIGJvb2wgQWRkSW1wbGljaXREdG9ycyA9IGZhbHNlOworICAgIGJvb2wgQWRkTGlmZXRpbWUgPSBmYWxzZTsKKyAgICBib29sIEFkZExvb3BFeGl0ID0gZmFsc2U7CisgICAgYm9vbCBBZGRUZW1wb3JhcnlEdG9ycyA9IGZhbHNlOworICAgIGJvb2wgQWRkU2NvcGVzID0gZmFsc2U7CisgICAgYm9vbCBBZGRTdGF0aWNJbml0QnJhbmNoZXMgPSBmYWxzZTsKKyAgICBib29sIEFkZENYWE5ld0FsbG9jYXRvciA9IGZhbHNlOworICAgIGJvb2wgQWRkQ1hYRGVmYXVsdEluaXRFeHBySW5DdG9ycyA9IGZhbHNlOworICAgIGJvb2wgQWRkUmljaENYWENvbnN0cnVjdG9ycyA9IGZhbHNlOworCisgICAgQnVpbGRPcHRpb25zKCkgPSBkZWZhdWx0OworCisgICAgYm9vbCBhbHdheXNBZGQoY29uc3QgU3RtdCAqc3RtdCkgY29uc3QgeworICAgICAgcmV0dXJuIGFsd2F5c0FkZE1hc2tbc3RtdC0+Z2V0U3RtdENsYXNzKCldOworICAgIH0KKworICAgIEJ1aWxkT3B0aW9ucyAmc2V0QWx3YXlzQWRkKFN0bXQ6OlN0bXRDbGFzcyBzdG10Q2xhc3MsIGJvb2wgdmFsID0gdHJ1ZSkgeworICAgICAgYWx3YXlzQWRkTWFza1tzdG10Q2xhc3NdID0gdmFsOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJ1aWxkT3B0aW9ucyAmc2V0QWxsQWx3YXlzQWRkKCkgeworICAgICAgYWx3YXlzQWRkTWFzay5zZXQoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgIH07CisKKyAgLy8vIGJ1aWxkQ0ZHIC0gQnVpbGRzIGEgQ0ZHIGZyb20gYW4gQVNULgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPENGRz4gYnVpbGRDRkcoY29uc3QgRGVjbCAqRCwgU3RtdCAqQVNULCBBU1RDb250ZXh0ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVpbGRPcHRpb25zICZCTyk7CisKKyAgLy8vIGNyZWF0ZUJsb2NrIC0gQ3JlYXRlIGEgbmV3IGJsb2NrIGluIHRoZSBDRkcuICBUaGUgQ0ZHIG93bnMgdGhlIGJsb2NrOworICAvLy8gIHRoZSBjYWxsZXIgc2hvdWxkIG5vdCBkaXJlY3RseSBmcmVlIGl0LgorICBDRkdCbG9jayAqY3JlYXRlQmxvY2soKTsKKworICAvLy8gc2V0RW50cnkgLSBTZXQgdGhlIGVudHJ5IGJsb2NrIG9mIHRoZSBDRkcuICBUaGlzIGlzIHR5cGljYWxseSB1c2VkCisgIC8vLyAgb25seSBkdXJpbmcgQ0ZHIGNvbnN0cnVjdGlvbi4gIE1vc3QgQ0ZHIGNsaWVudHMgZXhwZWN0IHRoYXQgdGhlCisgIC8vLyAgZW50cnkgYmxvY2sgaGFzIG5vIHByZWRlY2Vzc29ycyBhbmQgY29udGFpbnMgbm8gc3RhdGVtZW50cy4KKyAgdm9pZCBzZXRFbnRyeShDRkdCbG9jayAqQikgeyBFbnRyeSA9IEI7IH0KKworICAvLy8gc2V0SW5kaXJlY3RHb3RvQmxvY2sgLSBTZXQgdGhlIGJsb2NrIHVzZWQgZm9yIGluZGlyZWN0IGdvdG8ganVtcHMuCisgIC8vLyAgVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBvbmx5IGR1cmluZyBDRkcgY29uc3RydWN0aW9uLgorICB2b2lkIHNldEluZGlyZWN0R290b0Jsb2NrKENGR0Jsb2NrICpCKSB7IEluZGlyZWN0R290b0Jsb2NrID0gQjsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBCbG9jayBJdGVyYXRvcnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgdXNpbmcgQ0ZHQmxvY2tMaXN0VHkgPSBCdW1wVmVjdG9yPENGR0Jsb2NrICo+OworICB1c2luZyBpdGVyYXRvciA9IENGR0Jsb2NrTGlzdFR5OjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBDRkdCbG9ja0xpc3RUeTo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIHJldmVyc2VfaXRlcmF0b3IgPSBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+OworICB1c2luZyBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yID0gc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPjsKKworICBDRkdCbG9jayAmICAgICAgICAgICAgICAgIGZyb250KCkgICAgICAgICAgICAgICAgeyByZXR1cm4gKkJsb2Nrcy5mcm9udCgpOyB9CisgIENGR0Jsb2NrICYgICAgICAgICAgICAgICAgYmFjaygpICAgICAgICAgICAgICAgICB7IHJldHVybiAqQmxvY2tzLmJhY2soKTsgfQorCisgIGl0ZXJhdG9yICAgICAgICAgICAgICAgICAgYmVnaW4oKSAgICAgICAgICAgICAgICB7IHJldHVybiBCbG9ja3MuYmVnaW4oKTsgfQorICBpdGVyYXRvciAgICAgICAgICAgICAgICAgIGVuZCgpICAgICAgICAgICAgICAgICAgeyByZXR1cm4gQmxvY2tzLmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgICAgYmVnaW4oKSAgICAgICBjb25zdCAgICB7IHJldHVybiBCbG9ja3MuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciAgICAgICAgICAgIGVuZCgpICAgICAgICAgY29uc3QgICAgeyByZXR1cm4gQmxvY2tzLmVuZCgpOyB9CisKKyAgaXRlcmF0b3Igbm9kZXNfYmVnaW4oKSB7IHJldHVybiBpdGVyYXRvcihCbG9ja3MuYmVnaW4oKSk7IH0KKyAgaXRlcmF0b3Igbm9kZXNfZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IoQmxvY2tzLmVuZCgpKTsgfQorICBjb25zdF9pdGVyYXRvciBub2Rlc19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKEJsb2Nrcy5iZWdpbigpKTsgfQorICBjb25zdF9pdGVyYXRvciBub2Rlc19lbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihCbG9ja3MuZW5kKCkpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciAgICAgICAgICByYmVnaW4oKSAgICAgICAgICAgICAgIHsgcmV0dXJuIEJsb2Nrcy5yYmVnaW4oKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yICAgICAgICAgIHJlbmQoKSAgICAgICAgICAgICAgICAgeyByZXR1cm4gQmxvY2tzLnJlbmQoKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yICAgIHJiZWdpbigpICAgICAgY29uc3QgICAgeyByZXR1cm4gQmxvY2tzLnJiZWdpbigpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgICAgcmVuZCgpICAgICAgICBjb25zdCAgICB7IHJldHVybiBCbG9ja3MucmVuZCgpOyB9CisKKyAgQ0ZHQmxvY2sgJiAgICAgICAgICAgICAgICBnZXRFbnRyeSgpICAgICAgICAgICAgIHsgcmV0dXJuICpFbnRyeTsgfQorICBjb25zdCBDRkdCbG9jayAmICAgICAgICAgIGdldEVudHJ5KCkgICAgY29uc3QgICAgeyByZXR1cm4gKkVudHJ5OyB9CisgIENGR0Jsb2NrICYgICAgICAgICAgICAgICAgZ2V0RXhpdCgpICAgICAgICAgICAgICB7IHJldHVybiAqRXhpdDsgfQorICBjb25zdCBDRkdCbG9jayAmICAgICAgICAgIGdldEV4aXQoKSAgICAgY29uc3QgICAgeyByZXR1cm4gKkV4aXQ7IH0KKworICBDRkdCbG9jayAqICAgICAgIGdldEluZGlyZWN0R290b0Jsb2NrKCkgeyByZXR1cm4gSW5kaXJlY3RHb3RvQmxvY2s7IH0KKyAgY29uc3QgQ0ZHQmxvY2sgKiBnZXRJbmRpcmVjdEdvdG9CbG9jaygpIGNvbnN0IHsgcmV0dXJuIEluZGlyZWN0R290b0Jsb2NrOyB9CisKKyAgdXNpbmcgdHJ5X2Jsb2NrX2l0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZHQmxvY2sgKj46OmNvbnN0X2l0ZXJhdG9yOworCisgIHRyeV9ibG9ja19pdGVyYXRvciB0cnlfYmxvY2tzX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBUcnlEaXNwYXRjaEJsb2Nrcy5iZWdpbigpOworICB9CisKKyAgdHJ5X2Jsb2NrX2l0ZXJhdG9yIHRyeV9ibG9ja3NfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBUcnlEaXNwYXRjaEJsb2Nrcy5lbmQoKTsKKyAgfQorCisgIHZvaWQgYWRkVHJ5RGlzcGF0Y2hCbG9jayhjb25zdCBDRkdCbG9jayAqYmxvY2spIHsKKyAgICBUcnlEaXNwYXRjaEJsb2Nrcy5wdXNoX2JhY2soYmxvY2spOworICB9CisKKyAgLy8vIFJlY29yZHMgYSBzeW50aGV0aWMgRGVjbFN0bXQgYW5kIHRoZSBEZWNsU3RtdCBpdCB3YXMgY29uc3RydWN0ZWQgZnJvbS4KKyAgLy8vCisgIC8vLyBUaGUgQ0ZHIHVzZXMgc3ludGhldGljIERlY2xTdG10cyB3aGVuIGEgc2luZ2xlIEFTVCBEZWNsU3RtdCBjb250YWlucworICAvLy8gbXVsdGlwbGUgZGVjbHMuCisgIHZvaWQgYWRkU3ludGhldGljRGVjbFN0bXQoY29uc3QgRGVjbFN0bXQgKlN5bnRoZXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsU3RtdCAqU291cmNlKSB7CisgICAgYXNzZXJ0KFN5bnRoZXRpYy0+aXNTaW5nbGVEZWNsKCkgJiYgIkNhbiBoYW5kbGUgc2luZ2xlIGRlY2xhcmF0aW9ucyBvbmx5Iik7CisgICAgYXNzZXJ0KFN5bnRoZXRpYyAhPSBTb3VyY2UgJiYgIkRvbid0IGluY2x1ZGUgb3JpZ2luYWwgRGVjbFN0bXRzIGluIG1hcCIpOworICAgIGFzc2VydCghU3ludGhldGljRGVjbFN0bXRzLmNvdW50KFN5bnRoZXRpYykgJiYgIkFscmVhZHkgaW4gbWFwIik7CisgICAgU3ludGhldGljRGVjbFN0bXRzW1N5bnRoZXRpY10gPSBTb3VyY2U7CisgIH0KKworICB1c2luZyBzeW50aGV0aWNfc3RtdF9pdGVyYXRvciA9CisgICAgICBsbHZtOjpEZW5zZU1hcDxjb25zdCBEZWNsU3RtdCAqLCBjb25zdCBEZWNsU3RtdCAqPjo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIHN5bnRoZXRpY19zdG10X3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c3ludGhldGljX3N0bXRfaXRlcmF0b3I+OworCisgIC8vLyBJdGVyYXRlcyBvdmVyIHN5bnRoZXRpYyBEZWNsU3RtdHMgaW4gdGhlIENGRy4KKyAgLy8vCisgIC8vLyBFYWNoIGVsZW1lbnQgaXMgYSAoc3ludGhldGljIHN0YXRlbWVudCwgc291cmNlIHN0YXRlbWVudCkgcGFpci4KKyAgLy8vCisgIC8vLyBcc2EgYWRkU3ludGhldGljRGVjbFN0bXQKKyAgc3ludGhldGljX3N0bXRfaXRlcmF0b3Igc3ludGhldGljX3N0bXRfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIFN5bnRoZXRpY0RlY2xTdG10cy5iZWdpbigpOworICB9CisKKyAgLy8vIFxzYSBzeW50aGV0aWNfc3RtdF9iZWdpbgorICBzeW50aGV0aWNfc3RtdF9pdGVyYXRvciBzeW50aGV0aWNfc3RtdF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIFN5bnRoZXRpY0RlY2xTdG10cy5lbmQoKTsKKyAgfQorCisgIC8vLyBcc2Egc3ludGhldGljX3N0bXRfYmVnaW4KKyAgc3ludGhldGljX3N0bXRfcmFuZ2Ugc3ludGhldGljX3N0bXRzKCkgY29uc3QgeworICAgIHJldHVybiBzeW50aGV0aWNfc3RtdF9yYW5nZShzeW50aGV0aWNfc3RtdF9iZWdpbigpLCBzeW50aGV0aWNfc3RtdF9lbmQoKSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTWVtYmVyIHRlbXBsYXRlcyB1c2VmdWwgZm9yIHZhcmlvdXMgYmF0Y2ggb3BlcmF0aW9ucyBvdmVyIENGR3MuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDQUxMQkFDSz4KKyAgdm9pZCBWaXNpdEJsb2NrU3RtdHMoQ0FMTEJBQ0smIE8pIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0X2l0ZXJhdG9yIEk9YmVnaW4oKSwgRT1lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBmb3IgKENGR0Jsb2NrOjpjb25zdF9pdGVyYXRvciBCST0oKkkpLT5iZWdpbigpLCBCRT0oKkkpLT5lbmQoKTsKKyAgICAgICAgICAgQkkgIT0gQkU7ICsrQkkpIHsKKyAgICAgICAgaWYgKE9wdGlvbmFsPENGR1N0bXQ+IHN0bXQgPSBCSS0+Z2V0QXM8Q0ZHU3RtdD4oKSkKKyAgICAgICAgICBPKGNvbnN0X2Nhc3Q8U3RtdCo+KHN0bXQtPmdldFN0bXQoKSkpOworICAgICAgfQorICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIENGRyBJbnRyb3NwZWN0aW9uLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gZ2V0TnVtQmxvY2tJRHMgLSBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgQmxvY2tJRHMgYWxsb2NhdGVkICh3aGljaAorICAvLy8gc3RhcnQgYXQgMCkuCisgIHVuc2lnbmVkIGdldE51bUJsb2NrSURzKCkgY29uc3QgeyByZXR1cm4gTnVtQmxvY2tJRHM7IH0KKworICAvLy8gc2l6ZSAtIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIENGR0Jsb2NrcyB3aXRoaW4gdGhlIENGRworICAvLy8gVGhpcyBpcyBzaW1wbHkgYSByZW5hbWluZyBvZiB0aGUgZ2V0TnVtQmxvY2tJRHMoKS4gVGhpcyBpcyBuZWNlc3NhcnkgCisgIC8vLyBiZWNhdXNlIHRoZSBkb21pbmF0b3IgaW1wbGVtZW50YXRpb24gbmVlZHMgc3VjaCBhbiBpbnRlcmZhY2UuCisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBOdW1CbG9ja0lEczsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDRkcgRGVidWdnaW5nOiBQcmV0dHktUHJpbnRpbmcgYW5kIFZpc3VhbGl6YXRpb24uCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIHZvaWQgdmlld0NGRyhjb25zdCBMYW5nT3B0aW9ucyAmTE8pIGNvbnN0OworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTGFuZ09wdGlvbnMgJkxPLCBib29sIFNob3dDb2xvcnMpIGNvbnN0OworICB2b2lkIGR1bXAoY29uc3QgTGFuZ09wdGlvbnMgJkxPLCBib29sIFNob3dDb2xvcnMpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnRlcm5hbDogY29uc3RydWN0b3JzIGFuZCBkYXRhLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBDRkcoKSA6IEJsb2NrcyhCbGtCVkMsIDEwKSB7fQorCisgIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3ImIGdldEFsbG9jYXRvcigpIHsKKyAgICByZXR1cm4gQmxrQlZDLmdldEFsbG9jYXRvcigpOworICB9CisKKyAgQnVtcFZlY3RvckNvbnRleHQgJmdldEJ1bXBWZWN0b3JDb250ZXh0KCkgeworICAgIHJldHVybiBCbGtCVkM7CisgIH0KKworcHJpdmF0ZToKKyAgQ0ZHQmxvY2sgKkVudHJ5ID0gbnVsbHB0cjsKKyAgQ0ZHQmxvY2sgKkV4aXQgPSBudWxscHRyOworCisgIC8vIFNwZWNpYWwgYmxvY2sgdG8gY29udGFpbiBjb2xsZWN0aXZlIGRpc3BhdGNoIGZvciBpbmRpcmVjdCBnb3RvcworICBDRkdCbG9jayogSW5kaXJlY3RHb3RvQmxvY2sgPSBudWxscHRyOworCisgIHVuc2lnbmVkICBOdW1CbG9ja0lEcyA9IDA7CisKKyAgQnVtcFZlY3RvckNvbnRleHQgQmxrQlZDOworCisgIENGR0Jsb2NrTGlzdFR5IEJsb2NrczsKKworICAvLy8gQysrICd0cnknIHN0YXRlbWVudHMgYXJlIG1vZGVsZWQgd2l0aCBhbiBpbmRpcmVjdCBkaXNwYXRjaCBibG9jay4KKyAgLy8vIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gb2Ygc3VjaCBibG9ja3MgcHJlc2VudCBpbiB0aGUgQ0ZHLgorICBzdGQ6OnZlY3Rvcjxjb25zdCBDRkdCbG9jayAqPiBUcnlEaXNwYXRjaEJsb2NrczsKKworICAvLy8gQ29sbGVjdHMgRGVjbFN0bXRzIHN5bnRoZXNpemVkIGZvciB0aGlzIENGRyBhbmQgbWFwcyBlYWNoIG9uZSBiYWNrIHRvIGl0cworICAvLy8gc291cmNlIERlY2xTdG10LgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBEZWNsU3RtdCAqLCBjb25zdCBEZWNsU3RtdCAqPiBTeW50aGV0aWNEZWNsU3RtdHM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gR3JhcGhUcmFpdHMgc3BlY2lhbGl6YXRpb25zIGZvciBDRkcgYmFzaWMgYmxvY2sgZ3JhcGhzIChzb3VyY2UtbGV2ZWwgQ0ZHcykKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEltcGxlbWVudCBzaW1wbGlmeV90eXBlIGZvciBDRkdUZXJtaW5hdG9yLCBzbyB0aGF0IHdlIGNhbiBkeW5fY2FzdCBmcm9tCisvLy8gQ0ZHVGVybWluYXRvciB0byBhIHNwZWNpZmljIFN0bXQgY2xhc3MuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTwgOjpjbGFuZzo6Q0ZHVGVybWluYXRvcj4geworICB1c2luZyBTaW1wbGVUeXBlID0gOjpjbGFuZzo6U3RtdCAqOworCisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZSg6OmNsYW5nOjpDRkdUZXJtaW5hdG9yIFZhbCkgeworICAgIHJldHVybiBWYWwuZ2V0U3RtdCgpOworICB9Cit9OworCisvLyBUcmFpdHMgZm9yOiBDRkdCbG9jaworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8IDo6Y2xhbmc6OkNGR0Jsb2NrICo+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IDo6Y2xhbmc6OkNGR0Jsb2NrICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gOjpjbGFuZzo6Q0ZHQmxvY2s6OnN1Y2NfaXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKDo6Y2xhbmc6OkNGR0Jsb2NrICpCQikgeyByZXR1cm4gQkI7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+c3VjY19iZWdpbigpOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBOLT5zdWNjX2VuZCgpOyB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8IGNvbnN0IDo6Y2xhbmc6OkNGR0Jsb2NrICo+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IGNvbnN0IDo6Y2xhbmc6OkNGR0Jsb2NrICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gOjpjbGFuZzo6Q0ZHQmxvY2s6OmNvbnN0X3N1Y2NfaXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKGNvbnN0IGNsYW5nOjpDRkdCbG9jayAqQkIpIHsgcmV0dXJuIEJCOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPnN1Y2NfYmVnaW4oKTsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+c3VjY19lbmQoKTsgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEludmVyc2U8IDo6Y2xhbmc6OkNGR0Jsb2NrICo+PiB7CisgIHVzaW5nIE5vZGVSZWYgPSA6OmNsYW5nOjpDRkdCbG9jayAqOworICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9IDo6Y2xhbmc6OkNGR0Jsb2NrOjpjb25zdF9wcmVkX2l0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShJbnZlcnNlPDo6Y2xhbmc6OkNGR0Jsb2NrICo+IEcpIHsKKyAgICByZXR1cm4gRy5HcmFwaDsKKyAgfQorCisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPnByZWRfYmVnaW4oKTsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+cHJlZF9lbmQoKTsgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEludmVyc2U8Y29uc3QgOjpjbGFuZzo6Q0ZHQmxvY2sgKj4+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IGNvbnN0IDo6Y2xhbmc6OkNGR0Jsb2NrICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gOjpjbGFuZzo6Q0ZHQmxvY2s6OmNvbnN0X3ByZWRfaXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKEludmVyc2U8Y29uc3QgOjpjbGFuZzo6Q0ZHQmxvY2sgKj4gRykgeworICAgIHJldHVybiBHLkdyYXBoOworICB9CisKKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+cHJlZF9iZWdpbigpOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBOLT5wcmVkX2VuZCgpOyB9Cit9OworCisvLyBUcmFpdHMgZm9yOiBDRkcKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPCA6OmNsYW5nOjpDRkcqID4KKyAgICA6IHB1YmxpYyBHcmFwaFRyYWl0czwgOjpjbGFuZzo6Q0ZHQmxvY2sgKj4gIHsKKyAgdXNpbmcgbm9kZXNfaXRlcmF0b3IgPSA6OmNsYW5nOjpDRkc6Oml0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZSg6OmNsYW5nOjpDRkcgKkYpIHsgcmV0dXJuICZGLT5nZXRFbnRyeSgpOyB9CisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbig6OmNsYW5nOjpDRkcqIEYpIHsgcmV0dXJuIEYtPm5vZGVzX2JlZ2luKCk7fQorICBzdGF0aWMgbm9kZXNfaXRlcmF0b3IgICBub2Rlc19lbmQoOjpjbGFuZzo6Q0ZHKiBGKSB7IHJldHVybiBGLT5ub2Rlc19lbmQoKTsgfQorICBzdGF0aWMgdW5zaWduZWQgICAgICAgICAgICAgIHNpemUoOjpjbGFuZzo6Q0ZHKiBGKSB7IHJldHVybiBGLT5zaXplKCk7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxjb25zdCA6OmNsYW5nOjpDRkcqID4KKyAgICA6IHB1YmxpYyBHcmFwaFRyYWl0czxjb25zdCA6OmNsYW5nOjpDRkdCbG9jayAqPiAgeworICB1c2luZyBub2Rlc19pdGVyYXRvciA9IDo6Y2xhbmc6OkNGRzo6Y29uc3RfaXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKGNvbnN0IDo6Y2xhbmc6OkNGRyAqRikgeyByZXR1cm4gJkYtPmdldEVudHJ5KCk7IH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oIGNvbnN0IDo6Y2xhbmc6OkNGRyogRikgeworICAgIHJldHVybiBGLT5ub2Rlc19iZWdpbigpOworICB9CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2VuZCggY29uc3QgOjpjbGFuZzo6Q0ZHKiBGKSB7CisgICAgcmV0dXJuIEYtPm5vZGVzX2VuZCgpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIHNpemUoY29uc3QgOjpjbGFuZzo6Q0ZHKiBGKSB7CisgICAgcmV0dXJuIEYtPnNpemUoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEludmVyc2U8IDo6Y2xhbmc6OkNGRyAqPj4KKyAgOiBwdWJsaWMgR3JhcGhUcmFpdHM8SW52ZXJzZTwgOjpjbGFuZzo6Q0ZHQmxvY2sgKj4+IHsKKyAgdXNpbmcgbm9kZXNfaXRlcmF0b3IgPSA6OmNsYW5nOjpDRkc6Oml0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZSg6OmNsYW5nOjpDRkcgKkYpIHsgcmV0dXJuICZGLT5nZXRFeGl0KCk7IH0KKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKCA6OmNsYW5nOjpDRkcqIEYpIHtyZXR1cm4gRi0+bm9kZXNfYmVnaW4oKTt9CisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoIDo6Y2xhbmc6OkNGRyogRikgeyByZXR1cm4gRi0+bm9kZXNfZW5kKCk7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxJbnZlcnNlPGNvbnN0IDo6Y2xhbmc6OkNGRyAqPj4KKyAgOiBwdWJsaWMgR3JhcGhUcmFpdHM8SW52ZXJzZTxjb25zdCA6OmNsYW5nOjpDRkdCbG9jayAqPj4geworICB1c2luZyBub2Rlc19pdGVyYXRvciA9IDo6Y2xhbmc6OkNGRzo6Y29uc3RfaXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKGNvbnN0IDo6Y2xhbmc6OkNGRyAqRikgeyByZXR1cm4gJkYtPmdldEV4aXQoKTsgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihjb25zdCA6OmNsYW5nOjpDRkcqIEYpIHsKKyAgICByZXR1cm4gRi0+bm9kZXNfYmVnaW4oKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoY29uc3QgOjpjbGFuZzo6Q0ZHKiBGKSB7CisgICAgcmV0dXJuIEYtPm5vZGVzX2VuZCgpOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FOQUxZU0lTX0NGR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9DRkdTdG10TWFwLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9DRkdTdG10TWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRmYTkxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0NGR1N0bXRNYXAuaApAQCAtMCwwICsxLDUyIEBACisvLz09PS0tLSBDRkdTdG10TWFwLmggLSBNYXAgZnJvbSBTdG10KiB0byBDRkdCbG9jayogLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIENGR1N0bXRNYXAgY2xhc3MsIHdoaWNoIGRlZmluZXMgYSBtYXBwaW5nIGZyb20KKy8vICBTdG10KiB0byBDRkdCbG9jayoKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQU5BTFlTSVNfQ0ZHU1RNVE1BUF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQU5BTFlTSVNfQ0ZHU1RNVE1BUF9ICisKKyNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9DRkcuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQ0ZHOworY2xhc3MgQ0ZHQmxvY2s7CitjbGFzcyBQYXJlbnRNYXA7CitjbGFzcyBTdG10OworCitjbGFzcyBDRkdTdG10TWFwIHsKKyAgUGFyZW50TWFwICpQTTsKKyAgdm9pZCAqTTsKKyAgCisgIENGR1N0bXRNYXAoUGFyZW50TWFwICpwbSwgdm9pZCAqbSkgOiBQTShwbSksIE0obSkge30KKyAgCitwdWJsaWM6CisgIH5DRkdTdG10TWFwKCk7CisgIAorICAvLy8gUmV0dXJucyBhIG5ldyBDRkdNYXAgZm9yIHRoZSBnaXZlbiBDRkcuICBJdCBpcyB0aGUgY2FsbGVyJ3MKKyAgLy8vIHJlc3BvbnNpYmlsaXR5IHRvICdkZWxldGUnIHRoaXMgb2JqZWN0IHdoZW4gZG9uZSB1c2luZyBpdC4KKyAgc3RhdGljIENGR1N0bXRNYXAgKkJ1aWxkKENGRyogQywgUGFyZW50TWFwICpQTSk7CisKKyAgLy8vIFJldHVybnMgdGhlIENGR0Jsb2NrIHRoZSBzcGVjaWZpZWQgU3RtdCogYXBwZWFycyBpbi4gIEZvciBTdG10KiB0aGF0CisgIC8vLyBhcmUgdGVybWluYXRvcnMsIHRoZSBDRkdCbG9jayBpcyB0aGUgYmxvY2sgdGhleSBhcHBlYXIgYXMgYSB0ZXJtaW5hdG9yLAorICAvLy8gYW5kIG5vdCB0aGUgYmxvY2sgdGhleSBhcHBlYXIgYXMgYSBibG9jay1sZXZlbCBleHByZXNzaW9uIChlLmcsICcmJicpLgorICAvLy8gQ2FzZVN0bXRzIGFuZCBMYWJlbFN0bXRzIG1hcCB0byB0aGUgQ0ZHQmxvY2sgdGhleSBsYWJlbC4KKyAgQ0ZHQmxvY2sgKmdldEJsb2NrKFN0bXQgKiBTKTsKKworICBjb25zdCBDRkdCbG9jayAqZ2V0QmxvY2soY29uc3QgU3RtdCAqIFMpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxDRkdTdG10TWFwKj4odGhpcyktPmdldEJsb2NrKGNvbnN0X2Nhc3Q8U3RtdCo+KFMpKTsKKyAgfQorfTsKKworfSAvLyBlbmQgY2xhbmcgbmFtZXNwYWNlCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0NhbGxHcmFwaC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQ2FsbEdyYXBoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjZGZlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0NhbGxHcmFwaC5oCkBAIC0wLDAgKzEsMjU4IEBACisvLz09PS0gQ2FsbEdyYXBoLmggLSBBU1QtYmFzZWQgQ2FsbCBncmFwaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIEFTVC1iYXNlZCBDYWxsR3JhcGguCisvLworLy8gIEEgY2FsbCBncmFwaCBmb3IgZnVuY3Rpb25zIHdob3NlIGRlZmluaXRpb25zL2JvZGllcyBhcmUgYXZhaWxhYmxlIGluIHRoZQorLy8gIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdC4gVGhlIGdyYXBoIGhhcyBhICJ2aXJ0dWFsIiByb290IG5vZGUgdGhhdCBjb250YWlucworLy8gIGVkZ2VzIHRvIGFsbCBleHRlcm5hbGx5IGF2YWlsYWJsZSBmdW5jdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FOQUxZU0lTX0NBTExHUkFQSF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQU5BTFlTSVNfQ0FMTEdSQVBIX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1JlY3Vyc2l2ZUFTVFZpc2l0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU2V0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIENhbGxHcmFwaE5vZGU7CitjbGFzcyBEZWNsOworY2xhc3MgRGVjbENvbnRleHQ7CitjbGFzcyBTdG10OworCisvLy8gXGJyaWVmIFRoZSBBU1QtYmFzZWQgY2FsbCBncmFwaC4KKy8vLworLy8vIFRoZSBjYWxsIGdyYXBoIGV4dGVuZHMgaXRzZWxmIHdpdGggdGhlIGdpdmVuIGRlY2xhcmF0aW9ucyBieSBpbXBsZW1lbnRpbmcKKy8vLyB0aGUgcmVjdXJzaXZlIEFTVCB2aXNpdG9yLCB3aGljaCBjb25zdHJ1Y3RzIHRoZSBncmFwaCBieSB2aXNpdGluZyB0aGUgZ2l2ZW4KKy8vLyBkZWNsYXJhdGlvbnMuCitjbGFzcyBDYWxsR3JhcGggOiBwdWJsaWMgUmVjdXJzaXZlQVNUVmlzaXRvcjxDYWxsR3JhcGg+IHsKKyAgZnJpZW5kIGNsYXNzIENhbGxHcmFwaE5vZGU7CisKKyAgdXNpbmcgRnVuY3Rpb25NYXBUeSA9CisgICAgICBsbHZtOjpEZW5zZU1hcDxjb25zdCBEZWNsICosIHN0ZDo6dW5pcXVlX3B0cjxDYWxsR3JhcGhOb2RlPj47CisKKyAgLy8vIEZ1bmN0aW9uTWFwIG93bnMgYWxsIENhbGxHcmFwaE5vZGVzLgorICBGdW5jdGlvbk1hcFR5IEZ1bmN0aW9uTWFwOworCisgIC8vLyBUaGlzIGlzIGEgdmlydHVhbCByb290IG5vZGUgdGhhdCBoYXMgZWRnZXMgdG8gYWxsIHRoZSBmdW5jdGlvbnMuCisgIENhbGxHcmFwaE5vZGUgKlJvb3Q7CisKK3B1YmxpYzoKKyAgQ2FsbEdyYXBoKCk7CisgIH5DYWxsR3JhcGgoKTsKKworICAvLy8gXGJyaWVmIFBvcHVsYXRlIHRoZSBjYWxsIGdyYXBoIHdpdGggdGhlIGZ1bmN0aW9ucyBpbiB0aGUgZ2l2ZW4KKyAgLy8vIGRlY2xhcmF0aW9uLgorICAvLy8KKyAgLy8vIFJlY3Vyc2l2ZWx5IHdhbGtzIHRoZSBkZWNsYXJhdGlvbiB0byBmaW5kIGFsbCB0aGUgZGVwZW5kZW50IERlY2xzIGFzIHdlbGwuCisgIHZvaWQgYWRkVG9DYWxsR3JhcGgoRGVjbCAqRCkgeworICAgIFRyYXZlcnNlRGVjbChEKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIGEgZGVjbGFyYXRpb24gc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBncmFwaC4KKyAgc3RhdGljIGJvb2wgaW5jbHVkZUluR3JhcGgoY29uc3QgRGVjbCAqRCk7CisKKyAgLy8vIFxicmllZiBMb29rdXAgdGhlIG5vZGUgZm9yIHRoZSBnaXZlbiBkZWNsYXJhdGlvbi4KKyAgQ2FsbEdyYXBoTm9kZSAqZ2V0Tm9kZShjb25zdCBEZWNsICopIGNvbnN0OworCisgIC8vLyBcYnJpZWYgTG9va3VwIHRoZSBub2RlIGZvciB0aGUgZ2l2ZW4gZGVjbGFyYXRpb24uIElmIG5vbmUgZm91bmQsIGluc2VydAorICAvLy8gb25lIGludG8gdGhlIGdyYXBoLgorICBDYWxsR3JhcGhOb2RlICpnZXRPckluc2VydE5vZGUoRGVjbCAqKTsKKworICB1c2luZyBpdGVyYXRvciA9IEZ1bmN0aW9uTWFwVHk6Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IEZ1bmN0aW9uTWFwVHk6OmNvbnN0X2l0ZXJhdG9yOworCisgIC8vLyBJdGVyYXRvcnMgdGhyb3VnaCBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBncmFwaC4gTm90ZSwgdGhpcyBnaXZlcworICAvLy8gbm9uLWRldGVybWluaXN0aWMgb3JkZXIuCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gRnVuY3Rpb25NYXAuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSAgIHsgcmV0dXJuIEZ1bmN0aW9uTWFwLmVuZCgpOyAgIH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBGdW5jdGlvbk1hcC5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpICAgY29uc3QgeyByZXR1cm4gRnVuY3Rpb25NYXAuZW5kKCk7ICAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGdyYXBoLgorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gRnVuY3Rpb25NYXAuc2l6ZSgpOyB9CisKKyAgLy8vIFwgYnJpZWYgR2V0IHRoZSB2aXJ0dWFsIHJvb3Qgb2YgdGhlIGdyYXBoLCBhbGwgdGhlIGZ1bmN0aW9ucyBhdmFpbGFibGUKKyAgLy8vIGV4dGVybmFsbHkgYXJlIHJlcHJlc2VudGVkIGFzIGNhbGxlZXMgb2YgdGhlIG5vZGUuCisgIENhbGxHcmFwaE5vZGUgKmdldFJvb3QoKSBjb25zdCB7IHJldHVybiBSb290OyB9CisKKyAgLy8vIEl0ZXJhdG9ycyB0aHJvdWdoIGFsbCB0aGUgbm9kZXMgb2YgdGhlIGdyYXBoIHRoYXQgaGF2ZSBubyBwYXJlbnQuIFRoZXNlCisgIC8vLyBhcmUgdGhlIHVucmVhY2hhYmxlIG5vZGVzLCB3aGljaCBhcmUgZWl0aGVyIHVudXNlZCBvciBhcmUgZHVlIHRvIHVzCisgIC8vLyBmYWlsaW5nIHRvIGFkZCBhIGNhbGwgZWRnZSBkdWUgdG8gdGhlIGFuYWx5c2lzIGltcHJlY2lzaW9uLgorICB1c2luZyBub2Rlc19pdGVyYXRvciA9IGxsdm06OlNldFZlY3RvcjxDYWxsR3JhcGhOb2RlICo+OjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3Rfbm9kZXNfaXRlcmF0b3IgPSBsbHZtOjpTZXRWZWN0b3I8Q2FsbEdyYXBoTm9kZSAqPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmb3MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgdm9pZCB2aWV3R3JhcGgoKSBjb25zdDsKKworICB2b2lkIGFkZE5vZGVzRm9yQmxvY2tzKERlY2xDb250ZXh0ICpEKTsKKworICAvLy8gUGFydCBvZiByZWN1cnNpdmUgZGVjbGFyYXRpb24gdmlzaXRhdGlvbi4gV2UgcmVjdXJzaXZlbHkgdmlzaXQgYWxsIHRoZQorICAvLy8gZGVjbGFyYXRpb25zIHRvIGNvbGxlY3QgdGhlIHJvb3QgZnVuY3Rpb25zLgorICBib29sIFZpc2l0RnVuY3Rpb25EZWNsKEZ1bmN0aW9uRGVjbCAqRkQpIHsKKyAgICAvLyBXZSBza2lwIGZ1bmN0aW9uIHRlbXBsYXRlIGRlZmluaXRpb25zLCBhcyB0aGVpciBzZW1hbnRpY3MgaXMKKyAgICAvLyBvbmx5IGRldGVybWluZWQgd2hlbiB0aGV5IGFyZSBpbnN0YW50aWF0ZWQuCisgICAgaWYgKGluY2x1ZGVJbkdyYXBoKEZEKSAmJiBGRC0+aXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpKSB7CisgICAgICAvLyBBZGQgYWxsIGJsb2NrcyBkZWNsYXJlZCBpbnNpZGUgdGhpcyBmdW5jdGlvbiB0byB0aGUgZ3JhcGguCisgICAgICBhZGROb2Rlc0ZvckJsb2NrcyhGRCk7CisgICAgICAvLyBJZiB0aGlzIGZ1bmN0aW9uIGhhcyBleHRlcm5hbCBsaW5rYWdlLCBhbnl0aGluZyBjb3VsZCBjYWxsIGl0LgorICAgICAgLy8gTm90ZSwgd2UgYXJlIG5vdCBwcmVjaXNlIGhlcmUuIEZvciBleGFtcGxlLCB0aGUgZnVuY3Rpb24gY291bGQgaGF2ZQorICAgICAgLy8gaXRzIGFkZHJlc3MgdGFrZW4uCisgICAgICBhZGROb2RlRm9yRGVjbChGRCwgRkQtPmlzR2xvYmFsKCkpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBQYXJ0IG9mIHJlY3Vyc2l2ZSBkZWNsYXJhdGlvbiB2aXNpdGF0aW9uLgorICBib29sIFZpc2l0T2JqQ01ldGhvZERlY2woT2JqQ01ldGhvZERlY2wgKk1EKSB7CisgICAgaWYgKGluY2x1ZGVJbkdyYXBoKE1EKSkgeworICAgICAgYWRkTm9kZXNGb3JCbG9ja3MoTUQpOworICAgICAgYWRkTm9kZUZvckRlY2woTUQsIHRydWUpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFdlIGFyZSBvbmx5IGNvbGxlY3RpbmcgdGhlIGRlY2xhcmF0aW9ucywgc28gZG8gbm90IHN0ZXAgaW50byB0aGUgYm9kaWVzLgorICBib29sIFRyYXZlcnNlU3RtdChTdG10ICpTKSB7IHJldHVybiB0cnVlOyB9CisKKyAgYm9vbCBzaG91bGRXYWxrVHlwZXNPZlR5cGVMb2NzKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBBZGQgdGhlIGdpdmVuIGRlY2xhcmF0aW9uIHRvIHRoZSBjYWxsIGdyYXBoLgorICB2b2lkIGFkZE5vZGVGb3JEZWNsKERlY2wgKkQsIGJvb2wgSXNHbG9iYWwpOworCisgIC8vLyBcYnJpZWYgQWxsb2NhdGUgYSBuZXcgbm9kZSBpbiB0aGUgZ3JhcGguCisgIENhbGxHcmFwaE5vZGUgKmFsbG9jYXRlTmV3Tm9kZShEZWNsICopOworfTsKKworY2xhc3MgQ2FsbEdyYXBoTm9kZSB7CitwdWJsaWM6CisgIHVzaW5nIENhbGxSZWNvcmQgPSBDYWxsR3JhcGhOb2RlICo7CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgVGhlIGZ1bmN0aW9uL21ldGhvZCBkZWNsYXJhdGlvbi4KKyAgRGVjbCAqRkQ7CisKKyAgLy8vIFxicmllZiBUaGUgbGlzdCBvZiBmdW5jdGlvbnMgY2FsbGVkIGZyb20gdGhpcyBub2RlLgorICBTbWFsbFZlY3RvcjxDYWxsUmVjb3JkLCA1PiBDYWxsZWRGdW5jdGlvbnM7CisKK3B1YmxpYzoKKyAgQ2FsbEdyYXBoTm9kZShEZWNsICpEKSA6IEZEKEQpIHt9CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBTbWFsbFZlY3RvckltcGw8Q2FsbFJlY29yZD46Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IFNtYWxsVmVjdG9ySW1wbDxDYWxsUmVjb3JkPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgLy8vIEl0ZXJhdG9ycyB0aHJvdWdoIGFsbCB0aGUgY2FsbGVlcy9jaGlsZHJlbiBvZiB0aGUgbm9kZS4KKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBDYWxsZWRGdW5jdGlvbnMuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBDYWxsZWRGdW5jdGlvbnMuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBDYWxsZWRGdW5jdGlvbnMuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBDYWxsZWRGdW5jdGlvbnMuZW5kKCk7IH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gQ2FsbGVkRnVuY3Rpb25zLmVtcHR5KCk7IH0KKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIENhbGxlZEZ1bmN0aW9ucy5zaXplKCk7IH0KKworICB2b2lkIGFkZENhbGxlZShDYWxsR3JhcGhOb2RlICpOKSB7CisgICAgQ2FsbGVkRnVuY3Rpb25zLnB1c2hfYmFjayhOKTsKKyAgfQorCisgIERlY2wgKmdldERlY2woKSBjb25zdCB7IHJldHVybiBGRDsgfQorCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisvLyBHcmFwaCB0cmFpdHMgZm9yIGl0ZXJhdGlvbiwgdmlld2luZy4KK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPGNsYW5nOjpDYWxsR3JhcGhOb2RlKj4geworICB1c2luZyBOb2RlVHlwZSA9IGNsYW5nOjpDYWxsR3JhcGhOb2RlOworICB1c2luZyBOb2RlUmVmID0gY2xhbmc6OkNhbGxHcmFwaE5vZGUgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBOb2RlVHlwZTo6aXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoY2xhbmc6OkNhbGxHcmFwaE5vZGUgKkNHTikgeyByZXR1cm4gQ0dOOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlVHlwZSAqTikgeyByZXR1cm4gTi0+YmVnaW4oKTsgIH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlVHlwZSAqTikgeyByZXR1cm4gTi0+ZW5kKCk7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxjb25zdCBjbGFuZzo6Q2FsbEdyYXBoTm9kZSo+IHsKKyAgdXNpbmcgTm9kZVR5cGUgPSBjb25zdCBjbGFuZzo6Q2FsbEdyYXBoTm9kZTsKKyAgdXNpbmcgTm9kZVJlZiA9IGNvbnN0IGNsYW5nOjpDYWxsR3JhcGhOb2RlICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gTm9kZVR5cGU6OmNvbnN0X2l0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlVHlwZSAqZ2V0RW50cnlOb2RlKGNvbnN0IGNsYW5nOjpDYWxsR3JhcGhOb2RlICpDR04pIHsgcmV0dXJuIENHTjsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVR5cGUgKk4pIHsgcmV0dXJuIE4tPmJlZ2luKCk7fQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVUeXBlICpOKSB7IHJldHVybiBOLT5lbmQoKTsgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPGNsYW5nOjpDYWxsR3JhcGgqPgorICA6IHB1YmxpYyBHcmFwaFRyYWl0czxjbGFuZzo6Q2FsbEdyYXBoTm9kZSo+IHsKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoY2xhbmc6OkNhbGxHcmFwaCAqQ0dOKSB7CisgICAgcmV0dXJuIENHTi0+Z2V0Um9vdCgpOyAgLy8gU3RhcnQgYXQgdGhlIGV4dGVybmFsIG5vZGUhCisgIH0KKworICBzdGF0aWMgY2xhbmc6OkNhbGxHcmFwaE5vZGUgKgorICBDR0dldFZhbHVlKGNsYW5nOjpDYWxsR3JhcGg6OmNvbnN0X2l0ZXJhdG9yOjp2YWx1ZV90eXBlICZQKSB7CisgICAgcmV0dXJuIFAuc2Vjb25kLmdldCgpOworICB9CisKKyAgLy8gbm9kZXNfaXRlcmF0b3IvYmVnaW4vZW5kIC0gQWxsb3cgaXRlcmF0aW9uIG92ZXIgYWxsIG5vZGVzIGluIHRoZSBncmFwaAorICB1c2luZyBub2Rlc19pdGVyYXRvciA9CisgICAgICBtYXBwZWRfaXRlcmF0b3I8Y2xhbmc6OkNhbGxHcmFwaDo6aXRlcmF0b3IsIGRlY2x0eXBlKCZDR0dldFZhbHVlKT47CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKGNsYW5nOjpDYWxsR3JhcGggKkNHKSB7CisgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yKENHLT5iZWdpbigpLCAmQ0dHZXRWYWx1ZSk7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kICAoY2xhbmc6OkNhbGxHcmFwaCAqQ0cpIHsKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3IoQ0ctPmVuZCgpLCAmQ0dHZXRWYWx1ZSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgc2l6ZShjbGFuZzo6Q2FsbEdyYXBoICpDRykgeyByZXR1cm4gQ0ctPnNpemUoKTsgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPGNvbnN0IGNsYW5nOjpDYWxsR3JhcGgqPiA6CisgIHB1YmxpYyBHcmFwaFRyYWl0czxjb25zdCBjbGFuZzo6Q2FsbEdyYXBoTm9kZSo+IHsKKyAgc3RhdGljIE5vZGVUeXBlICpnZXRFbnRyeU5vZGUoY29uc3QgY2xhbmc6OkNhbGxHcmFwaCAqQ0dOKSB7CisgICAgcmV0dXJuIENHTi0+Z2V0Um9vdCgpOworICB9CisKKyAgc3RhdGljIGNsYW5nOjpDYWxsR3JhcGhOb2RlICoKKyAgQ0dHZXRWYWx1ZShjbGFuZzo6Q2FsbEdyYXBoOjpjb25zdF9pdGVyYXRvcjo6dmFsdWVfdHlwZSAmUCkgeworICAgIHJldHVybiBQLnNlY29uZC5nZXQoKTsKKyAgfQorCisgIC8vIG5vZGVzX2l0ZXJhdG9yL2JlZ2luL2VuZCAtIEFsbG93IGl0ZXJhdGlvbiBvdmVyIGFsbCBub2RlcyBpbiB0aGUgZ3JhcGgKKyAgdXNpbmcgbm9kZXNfaXRlcmF0b3IgPQorICAgICAgbWFwcGVkX2l0ZXJhdG9yPGNsYW5nOjpDYWxsR3JhcGg6OmNvbnN0X2l0ZXJhdG9yLCBkZWNsdHlwZSgmQ0dHZXRWYWx1ZSk+OworCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihjb25zdCBjbGFuZzo6Q2FsbEdyYXBoICpDRykgeworICAgIHJldHVybiBub2Rlc19pdGVyYXRvcihDRy0+YmVnaW4oKSwgJkNHR2V0VmFsdWUpOworICB9CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2VuZChjb25zdCBjbGFuZzo6Q2FsbEdyYXBoICpDRykgeworICAgIHJldHVybiBub2Rlc19pdGVyYXRvcihDRy0+ZW5kKCksICZDR0dldFZhbHVlKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBzaXplKGNvbnN0IGNsYW5nOjpDYWxsR3JhcGggKkNHKSB7IHJldHVybiBDRy0+c2l6ZSgpOyB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0FOQUxZU0lTX0NBTExHUkFQSF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9DbG9uZURldGVjdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQ2xvbmVEZXRlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWY0NDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQ2xvbmVEZXRlY3Rpb24uaApAQCAtMCwwICsxLDQ0NyBAQAorLy89PT0tLS0gQ2xvbmVEZXRlY3Rpb24uaCAtIEZpbmRzIGNvZGUgY2xvbmVzIGluIGFuIEFTVCAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIGRlZmluZXMgY2xhc3NlcyBmb3Igc2VhcmNoaW5nIGFuZCBhbmFseXppbmcgc291cmNlIGNvZGUgY2xvbmVzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX0NMT05FREVURUNUSU9OX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BU1RfQ0xPTkVERVRFQ1RJT05fSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXRWaXNpdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1JlZ2V4LmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBTdG10OworY2xhc3MgRGVjbDsKK2NsYXNzIFZhckRlY2w7CitjbGFzcyBBU1RDb250ZXh0OworY2xhc3MgQ29tcG91bmRTdG10OworCisvLy8gSWRlbnRpZmllcyBhIGxpc3Qgb2Ygc3RhdGVtZW50cy4KKy8vLworLy8vIENhbiBlaXRoZXIgaWRlbnRpZnkgYSBzaW5nbGUgYXJiaXRyYXJ5IFN0bXQgb2JqZWN0LCBhIGNvbnRpbnVvdXMgc2VxdWVuY2Ugb2YKKy8vLyBjaGlsZCBzdGF0ZW1lbnRzIGluc2lkZSBhIENvbXBvdW5kU3RtdCBvciBubyBzdGF0ZW1lbnRzIGF0IGFsbC4KK2NsYXNzIFN0bXRTZXF1ZW5jZSB7CisgIC8vLyBJZiB0aGlzIG9iamVjdCBpZGVudGlmaWVzIGEgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBpbnNpZGUgYSBDb21wb3VuZFN0bXQsCisgIC8vLyBTIHBvaW50cyB0byB0aGlzIENvbXBvdW5kU3RtdC4gSWYgdGhpcyBvYmplY3Qgb25seSBpZGVudGlmaWVzIGEgc2luZ2xlCisgIC8vLyBTdG10LCB0aGVuIFMgaXMgYSBwb2ludGVyIHRvIHRoaXMgU3RtdC4KKyAgY29uc3QgU3RtdCAqUzsKKworICAvLy8gVGhlIGRlY2xhcmF0aW9uIHRoYXQgY29udGFpbnMgdGhlIHN0YXRlbWVudHMuCisgIGNvbnN0IERlY2wgKkQ7CisKKyAgLy8vIElmIEVuZEluZGV4IGlzIG5vbi16ZXJvLCB0aGVuIFMgaXMgYSBDb21wb3VuZFN0bXQgYW5kIHRoaXMgU3RtdFNlcXVlbmNlCisgIC8vLyBpbnN0YW5jZSBpcyByZXByZXNlbnRpbmcgdGhlIENvbXBvdW5kU3RtdCBjaGlsZHJlbiBpbnNpZGUgdGhlIGFycmF5CisgIC8vLyBbU3RhcnRJbmRleCwgRW5kSW5kZXgpLgorICB1bnNpZ25lZCBTdGFydEluZGV4OworICB1bnNpZ25lZCBFbmRJbmRleDsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0cyBhIFN0bXRTZXF1ZW5jZSBob2xkaW5nIG11bHRpcGxlIHN0YXRlbWVudHMuCisgIC8vLworICAvLy8gVGhlIHJlc3VsdGluZyBTdG10U2VxdWVuY2UgaWRlbnRpZmllcyBhIGNvbnRpbnVvdXMgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cworICAvLy8gaW4gdGhlIGJvZHkgb2YgdGhlIGdpdmVuIENvbXBvdW5kU3RtdC4gV2hpY2ggc3RhdGVtZW50cyBvZiB0aGUgYm9keSBzaG91bGQKKyAgLy8vIGJlIGlkZW50aWZpZWQgbmVlZHMgdG8gYmUgc3BlY2lmaWVkIGJ5IHByb3ZpZGluZyBhIHN0YXJ0IGFuZCBlbmQgaW5kZXgKKyAgLy8vIHRoYXQgZGVzY3JpYmUgYSBub24tZW1wdHkgc3ViLWFycmF5IGluIHRoZSBib2R5IG9mIHRoZSBnaXZlbiBDb21wb3VuZFN0bXQuCisgIC8vLworICAvLy8gXHBhcmFtIFN0bXQgQSBDb21wb3VuZFN0bXQgdGhhdCBjb250YWlucyBhbGwgc3RhdGVtZW50cyBpbiBpdHMgYm9keS4KKyAgLy8vIFxwYXJhbSBEIFRoZSBEZWNsIGNvbnRhaW5pbmcgdGhpcyBTdG10LgorICAvLy8gXHBhcmFtIFN0YXJ0SW5kZXggVGhlIGluY2x1c2l2ZSBzdGFydCBpbmRleCBpbiB0aGUgY2hpbGRyZW4gYXJyYXkgb2YKKyAgLy8vICAgICAgICAgICAgICAgICAgIFxwIFN0bXQKKyAgLy8vIFxwYXJhbSBFbmRJbmRleCBUaGUgZXhjbHVzaXZlIGVuZCBpbmRleCBpbiB0aGUgY2hpbGRyZW4gYXJyYXkgb2YgXHAgU3RtdC4KKyAgU3RtdFNlcXVlbmNlKGNvbnN0IENvbXBvdW5kU3RtdCAqU3RtdCwgY29uc3QgRGVjbCAqRCwgdW5zaWduZWQgU3RhcnRJbmRleCwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIEVuZEluZGV4KTsKKworICAvLy8gQ29uc3RydWN0cyBhIFN0bXRTZXF1ZW5jZSBob2xkaW5nIGEgc2luZ2xlIHN0YXRlbWVudC4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RtdCBBbiBhcmJpdHJhcnkgU3RtdC4KKyAgLy8vIFxwYXJhbSBEIFRoZSBEZWNsIGNvbnRhaW5pbmcgdGhpcyBTdG10LgorICBTdG10U2VxdWVuY2UoY29uc3QgU3RtdCAqU3RtdCwgY29uc3QgRGVjbCAqRCk7CisKKyAgLy8vIENvbnN0cnVjdHMgYW4gZW1wdHkgU3RtdFNlcXVlbmNlLgorICBTdG10U2VxdWVuY2UoKTsKKworICB0eXBlZGVmIGNvbnN0IFN0bXQgKmNvbnN0ICppdGVyYXRvcjsKKworICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoaXMgc2VxdWVuY2UuCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgYW4gaXRlcmF0b3IgcG9pbnRpbmcgYmVoaW5kIHRoZSBsYXN0IHN0YXRlbWVudCBpbiB0aGlzIHNlcXVlbmNlLgorICBpdGVyYXRvciBlbmQoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoaXMgc2VxdWVuY2UuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgbm9uLWVtcHR5IFN0bXRTZXF1ZW5jZSBvYmplY3QuCisgIGNvbnN0IFN0bXQgKmZyb250KCkgY29uc3QgeworICAgIGFzc2VydCghZW1wdHkoKSk7CisgICAgcmV0dXJuIGJlZ2luKClbMF07CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbGFzdCBzdGF0ZW1lbnQgaW4gdGhpcyBzZXF1ZW5jZS4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBub24tZW1wdHkgU3RtdFNlcXVlbmNlIG9iamVjdC4KKyAgY29uc3QgU3RtdCAqYmFjaygpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWVtcHR5KCkpOworICAgIHJldHVybiBiZWdpbigpW3NpemUoKSAtIDFdOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBzdGF0ZW1lbnRzIHRoaXMgb2JqZWN0IGhvbGRzLgorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeworICAgIGlmIChob2xkc1NlcXVlbmNlKCkpCisgICAgICByZXR1cm4gRW5kSW5kZXggLSBTdGFydEluZGV4OworICAgIGlmIChTID09IG51bGxwdHIpCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBTdG10U2VxdWVuY2UgY29udGFpbnMgbm8gc3RhdGVtZW50cy4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIHJlbGF0ZWQgQVNUQ29udGV4dCBmb3IgdGhlIHN0b3JlZCBTdG10cy4KKyAgQVNUQ29udGV4dCAmZ2V0QVNUQ29udGV4dCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBkZWNsYXJhdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBzdG9yZWQgU3RtdHMuCisgIGNvbnN0IERlY2wgKmdldENvbnRhaW5pbmdEZWNsKCkgY29uc3QgeworICAgIGFzc2VydChEKTsKKyAgICByZXR1cm4gRDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBvYmplY3RzIGhvbGRzIGEgbGlzdCBvZiBzdGF0ZW1lbnRzLgorICBib29sIGhvbGRzU2VxdWVuY2UoKSBjb25zdCB7IHJldHVybiBFbmRJbmRleCAhPSAwOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIHN0YXJ0IHNvdXJjZWxvY2F0aW9uIG9mIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhpcyBzZXF1ZW5jZS4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBub24tZW1wdHkgU3RtdFNlcXVlbmNlIG9iamVjdC4KKyAgU291cmNlTG9jYXRpb24gZ2V0U3RhcnRMb2MoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgZW5kIHNvdXJjZWxvY2F0aW9uIG9mIHRoZSBsYXN0IHN0YXRlbWVudCBpbiB0aGlzIHNlcXVlbmNlLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIG5vbi1lbXB0eSBTdG10U2VxdWVuY2Ugb2JqZWN0LgorICBTb3VyY2VMb2NhdGlvbiBnZXRFbmRMb2MoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgc291cmNlIHJhbmdlIG9mIHRoZSB3aG9sZSBzZXF1ZW5jZSAtIGZyb20gdGhlIGJlZ2lubmluZworICAvLy8gb2YgdGhlIGZpcnN0IHN0YXRlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBsYXN0IHN0YXRlbWVudC4KKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdDsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgU3RtdFNlcXVlbmNlICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShTLCBTdGFydEluZGV4LCBFbmRJbmRleCkgPT0KKyAgICAgICAgICAgc3RkOjp0aWUoT3RoZXIuUywgT3RoZXIuU3RhcnRJbmRleCwgT3RoZXIuRW5kSW5kZXgpOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN0bXRTZXF1ZW5jZSAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoUywgU3RhcnRJbmRleCwgRW5kSW5kZXgpICE9CisgICAgICAgICAgIHN0ZDo6dGllKE90aGVyLlMsIE90aGVyLlN0YXJ0SW5kZXgsIE90aGVyLkVuZEluZGV4KTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBzZXF1ZW5jZSBjb3ZlcnMgYSBzb3VyY2UgcmFuZ2UgdGhhdAorICAvLy8gY29udGFpbnMgdGhlIHNvdXJjZSByYW5nZSBvZiB0aGUgZ2l2ZW4gc2VxdWVuY2UgXHAgT3RoZXIuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgbm9uLWVtcHR5IFN0bXRTZXF1ZW5jZSBvYmplY3QKKyAgLy8vIGFuZCBwYXNzZWQgYSBub24tZW1wdHkgU3RtdFNlcXVlbmNlIG9iamVjdC4KKyAgYm9vbCBjb250YWlucyhjb25zdCBTdG10U2VxdWVuY2UgJk90aGVyKSBjb25zdDsKK307CisKKy8vLyBTZWFyY2hlcyBmb3Igc2ltaWxhciBzdWJ0cmVlcyBpbiB0aGUgQVNULgorLy8vCisvLy8gRmlyc3QsIHRoaXMgY2xhc3MgbmVlZHMgc2V2ZXJhbCBkZWNsYXJhdGlvbnMgd2l0aCBzdGF0ZW1lbnQgYm9kaWVzIHdoaWNoCisvLy8gY2FuIGJlIHBhc3NlZCB2aWEgYW5hbHl6ZUNvZGVCb2R5LiBBZnRlcndhcmRzIGFsbCBzdGF0ZW1lbnRzIGNhbiBiZQorLy8vIHNlYXJjaGVkIGZvciBjbG9uZXMgYnkgY2FsbGluZyBmaW5kQ2xvbmVzIHdpdGggYSBnaXZlbiBsaXN0IG9mIGNvbnN0cmFpbnRzCisvLy8gdGhhdCBzaG91bGQgc3BlY2lmeSB0aGUgd2FudGVkIHByb3BlcnRpZXMgb2YgdGhlIGNsb25lcy4KKy8vLworLy8vIFRoZSByZXN1bHQgb2YgZmluZENsb25lcyBjYW4gYmUgZnVydGhlciBjb25zdHJhaW5lZCB3aXRoIHRoZSBjb25zdHJhaW5DbG9uZXMKKy8vLyBtZXRob2QuCisvLy8KKy8vLyBUaGlzIGNsYXNzIG9ubHkgc2VhcmNoZXMgZm9yIGNsb25lcyBpbiBleGVjdHVhYmxlIHNvdXJjZSBjb2RlCisvLy8gKGUuZy4gZnVuY3Rpb24gYm9kaWVzKS4gT3RoZXIgY2xvbmVzIChlLmcuIGNsb25lZCBjb21tZW50cyBvciBkZWNsYXJhdGlvbnMpCisvLy8gYXJlIG5vdCBzdXBwb3J0ZWQuCitjbGFzcyBDbG9uZURldGVjdG9yIHsKKworcHVibGljOgorICAvLy8gQSBjb2xsZWN0aW9uIG9mIFN0bXRTZXF1ZW5jZXMgdGhhdCBzaGFyZSBhbiBhcmJpdHJhcnkgcHJvcGVydHkuCisgIHR5cGVkZWYgbGx2bTo6U21hbGxWZWN0b3I8U3RtdFNlcXVlbmNlLCA4PiBDbG9uZUdyb3VwOworCisgIC8vLyBHZW5lcmF0ZXMgYW5kIHN0b3JlcyBzZWFyY2ggZGF0YSBmb3IgYWxsIHN0YXRlbWVudHMgaW4gdGhlIGJvZHkgb2YKKyAgLy8vIHRoZSBnaXZlbiBEZWNsLgorICB2b2lkIGFuYWx5emVDb2RlQm9keShjb25zdCBEZWNsICpEKTsKKworICAvLy8gQ29uc3RyYWlucyB0aGUgZ2l2ZW4gbGlzdCBvZiBjbG9uZSBncm91cHMgd2l0aCB0aGUgZ2l2ZW4gY29uc3RyYWludC4KKyAgLy8vCisgIC8vLyBUaGUgY29uc3RyYWludCBpcyBleHBlY3RlZCB0byBoYXZlIGEgbWV0aG9kIHdpdGggdGhlIHNpZ25hdHVyZQorICAvLy8gICAgIGB2b2lkIGNvbnN0cmFpbihzdGQ6OnZlY3RvcjxDbG9uZURldGVjdG9yOjpDbG9uZUdyb3VwPiAmU2VxdWVuY2VzKWAKKyAgLy8vIGFzIHRoaXMgaXMgdGhlIGludGVyZmFjZSB0aGF0IHRoZSBDbG9uZURldGVjdG9yIHVzZXMgZm9yIGFwcGx5aW5nIHRoZQorICAvLy8gY29uc3RyYWludC4gVGhlIGNvbnN0cmFpbnQgaXMgc3VwcG9zZWQgdG8gZGlyZWN0bHkgbW9kaWZ5IHRoZSBwYXNzZWQgbGlzdAorICAvLy8gc28gdGhhdCBhbGwgY2xvbmVzIGluIHRoZSBsaXN0IGZ1bGZpbGwgdGhlIHNwZWNpZmljIHByb3BlcnR5IHRoaXMKKyAgLy8vIGNvbnN0cmFpbnQgZW5zdXJlcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyB2b2lkIGNvbnN0cmFpbkNsb25lcyhzdGQ6OnZlY3RvcjxDbG9uZUdyb3VwPiAmQ2xvbmVHcm91cHMsIFQgQykgeworICAgIEMuY29uc3RyYWluKENsb25lR3JvdXBzKTsKKyAgfQorCisgIC8vLyBDb25zdHJhaW5zIHRoZSBnaXZlbiBsaXN0IG9mIGNsb25lIGdyb3VwcyB3aXRoIHRoZSBnaXZlbiBsaXN0IG9mCisgIC8vLyBjb25zdHJhaW50cy4KKyAgLy8vCisgIC8vLyBUaGUgY29uc3RyYWludHMgYXJlIGFwcGxpZWQgaW4gc2VxdWVuY2UgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlCisgIC8vLyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZS4uLiBUcz4KKyAgc3RhdGljIHZvaWQgY29uc3RyYWluQ2xvbmVzKHN0ZDo6dmVjdG9yPENsb25lR3JvdXA+ICZDbG9uZUdyb3VwcywgVDEgQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRzLi4uIENvbnN0cmFpbnRMaXN0KSB7CisgICAgY29uc3RyYWluQ2xvbmVzKENsb25lR3JvdXBzLCBDKTsKKyAgICBjb25zdHJhaW5DbG9uZXMoQ2xvbmVHcm91cHMsIENvbnN0cmFpbnRMaXN0Li4uKTsKKyAgfQorCisgIC8vLyBTZWFyY2hlcyBmb3IgY2xvbmVzIGluIGFsbCBwcmV2aW91c2x5IHBhc3NlZCBzdGF0ZW1lbnRzLgorICAvLy8gXHBhcmFtIFJlc3VsdCBPdXRwdXQgcGFyYW1ldGVyIHRvIHdoaWNoIGFsbCBjcmVhdGVkIGNsb25lIGdyb3VwcyBhcmUKKyAgLy8vICAgICAgICAgICAgICAgYWRkZWQuCisgIC8vLyBccGFyYW0gQ29uc3RyYWludExpc3QgVGhlIGNvbnN0cmFpbnRzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlCisgIC8vICAgICAgICAgcmVzdWx0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHM+CisgIHZvaWQgZmluZENsb25lcyhzdGQ6OnZlY3RvcjxDbG9uZUdyb3VwPiAmUmVzdWx0LCBUcy4uLiBDb25zdHJhaW50TGlzdCkgeworICAgIC8vIFRoZSBpbml0aWFsIGFzc3VtcHRpb24gaXMgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBjbG9uZSBncm91cCBhbmQgZXZlcnkKKyAgICAvLyBzdGF0ZW1lbnQgaXMgYSBjbG9uZSBvZiB0aGUgb3RoZXJzLiBUaGlzIGNsb25lIGdyb3VwIHdpbGwgdGhlbiBiZQorICAgIC8vIHNwbGl0IHVwIHdpdGggdGhlIGhlbHAgb2YgdGhlIGNvbnN0cmFpbnRzLgorICAgIENsb25lR3JvdXAgQWxsQ2xvbmVzOworICAgIEFsbENsb25lcy5yZXNlcnZlKFNlcXVlbmNlcy5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmQyA6IFNlcXVlbmNlcykgeworICAgICAgQWxsQ2xvbmVzLnB1c2hfYmFjayhDKTsKKyAgICB9CisKKyAgICBSZXN1bHQucHVzaF9iYWNrKEFsbENsb25lcyk7CisKKyAgICBjb25zdHJhaW5DbG9uZXMoUmVzdWx0LCBDb25zdHJhaW50TGlzdC4uLik7CisgIH0KKworcHJpdmF0ZToKKyAgQ2xvbmVHcm91cCBTZXF1ZW5jZXM7Cit9OworCisvLy8gVGhpcyBjbGFzcyBpcyBhIHV0aWxpdHkgY2xhc3MgdGhhdCBjb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgYnVpbGRpbmcKKy8vLyBjdXN0b20gY29uc3RyYWludHMuCitjbGFzcyBDbG9uZUNvbnN0cmFpbnQgeworcHVibGljOgorICAvLy8gUmVtb3ZlcyBhbGwgZ3JvdXBzIGJ5IHVzaW5nIGEgZmlsdGVyIGZ1bmN0aW9uLgorICAvLy8gXHBhcmFtIENsb25lR3JvdXBzIFRoZSBsaXN0IG9mIENsb25lR3JvdXBzIHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUKKyAgLy8vICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC4KKyAgLy8vIFxwYXJhbSBGaWx0ZXIgVGhlIGZpbHRlciBmdW5jdGlvbiB0aGF0IHNob3VsZCByZXR1cm4gdHJ1ZSBmb3IgYWxsIGdyb3VwcworICAvLy8gICAgICAgICAgICAgICB0aGF0IHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3QuCisgIHN0YXRpYyB2b2lkIGZpbHRlckdyb3VwcygKKyAgICAgIHN0ZDo6dmVjdG9yPENsb25lRGV0ZWN0b3I6OkNsb25lR3JvdXA+ICZDbG9uZUdyb3VwcywKKyAgICAgIGxsdm06OmZ1bmN0aW9uX3JlZjxib29sKGNvbnN0IENsb25lRGV0ZWN0b3I6OkNsb25lR3JvdXAgJik+IEZpbHRlcikgeworICAgIENsb25lR3JvdXBzLmVyYXNlKAorICAgICAgICBzdGQ6OnJlbW92ZV9pZihDbG9uZUdyb3Vwcy5iZWdpbigpLCBDbG9uZUdyb3Vwcy5lbmQoKSwgRmlsdGVyKSwKKyAgICAgICAgQ2xvbmVHcm91cHMuZW5kKCkpOworICB9CisKKyAgLy8vIFNwbGl0cyB0aGUgZ2l2ZW4gQ2xvbmVHcm91cHMgdW50aWwgdGhlIGdpdmVuIENvbXBhcmUgZnVuY3Rpb24gcmV0dXJucyB0cnVlCisgIC8vLyBmb3IgYWxsIGNsb25lcyBpbiBhIHNpbmdsZSBncm91cC4KKyAgLy8vIFxwYXJhbSBDbG9uZUdyb3VwcyBBIGxpc3Qgb2YgQ2xvbmVHcm91cHMgdGhhdCBzaG91bGQgYmUgbW9kaWZpZWQuCisgIC8vLyBccGFyYW0gQ29tcGFyZSBUaGUgY29tcGFyaXNvbiBmdW5jdGlvbiB0aGF0IGFsbCBjbG9uZXMgYXJlIHN1cHBvc2VkIHRvCisgIC8vLyAgICAgICAgICAgICAgICBwYXNzLiBTaG91bGQgcmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYgdHdvIGNsb25lcyBiZWxvbmcKKyAgLy8vICAgICAgICAgICAgICAgIHRvIHRoZSBzYW1lIENsb25lR3JvdXAuCisgIHN0YXRpYyB2b2lkIHNwbGl0Q2xvbmVHcm91cHMoCisgICAgICBzdGQ6OnZlY3RvcjxDbG9uZURldGVjdG9yOjpDbG9uZUdyb3VwPiAmQ2xvbmVHcm91cHMsCisgICAgICBsbHZtOjpmdW5jdGlvbl9yZWY8Ym9vbChjb25zdCBTdG10U2VxdWVuY2UgJiwgY29uc3QgU3RtdFNlcXVlbmNlICYpPgorICAgICAgICAgIENvbXBhcmUpOworfTsKKworLy8vIFRoaXMgY29uc3RyYWludCBtb3ZlcyBjbG9uZXMgaW50byBjbG9uZSBncm91cHMgb2YgdHlwZSBJSSB2aWEgaGFzaGluZy4KKy8vLworLy8vIENsb25lcyB3aXRoIGRpZmZlcmVudCBoYXNoIHZhbHVlcyBhcmUgbW92ZWQgaW50byBzZXBhcmF0ZSBjbG9uZSBncm91cHMuCisvLy8gQ29sbGlzaW9ucyBhcmUgcG9zc2libGUsIGFuZCB0aGlzIGNvbnN0cmFpbnQgZG9lcyBub3RoaW5nIHRvIGFkZHJlc3MgdGhpcworLy8vIHRoZW0uIEFkZCB0aGUgc2xvd2VyIFJlY3Vyc2l2ZUNsb25lVHlwZUlJVmVyaWZ5Q29uc3RyYWludCBsYXRlciBpbiB0aGUKKy8vLyBjb25zdHJhaW50IGNoYWluLCBub3QgbmVjZXNzYXJpbHkgaW1tZWRpYXRlbHksIHRvIGVsaW1pbmF0ZSBoYXNoIGNvbGxpc2lvbnMKKy8vLyB0aHJvdWdoIGEgbW9yZSBkZXRhaWxlZCBhbmFseXNpcy4KK2NsYXNzIFJlY3Vyc2l2ZUNsb25lVHlwZUlJSGFzaENvbnN0cmFpbnQgeworcHVibGljOgorICB2b2lkIGNvbnN0cmFpbihzdGQ6OnZlY3RvcjxDbG9uZURldGVjdG9yOjpDbG9uZUdyb3VwPiAmU2VxdWVuY2VzKTsKK307CisKKy8vLyBUaGlzIGNvbnN0cmFpbnQgbW92ZXMgY2xvbmVzIGludG8gY2xvbmUgZ3JvdXBzIG9mIHR5cGUgSUkgYnkgY29tcGFyaW5nIHRoZW0uCisvLy8KKy8vLyBDbG9uZXMgdGhhdCBhcmVuJ3QgdHlwZSBJSSBjbG9uZXMgYXJlIG1vdmVkIGludG8gc2VwYXJhdGUgY2xvbmUgZ3JvdXBzLgorLy8vIEluIGNvbnRyYXN0IHRvIHRoZSBSZWN1cnNpdmVDbG9uZVR5cGVJSUhhc2hDb25zdHJhaW50LCBhbGwgY2xvbmVzIGluIGEgY2xvbmUKKy8vLyBncm91cCBhcmUgZ3VhcmFudGVlZCB0byBiZSBiZSB0eXBlIElJIGNsb25lcyBvZiBlYWNoIG90aGVyLCBidXQgaXQgaXMgdG9vCisvLy8gc2xvdyB0byBlZmZpY2llbnRseSBoYW5kbGUgbGFyZ2UgYW1vdW50cyBvZiBjbG9uZXMuCitjbGFzcyBSZWN1cnNpdmVDbG9uZVR5cGVJSVZlcmlmeUNvbnN0cmFpbnQgeworcHVibGljOgorICB2b2lkIGNvbnN0cmFpbihzdGQ6OnZlY3RvcjxDbG9uZURldGVjdG9yOjpDbG9uZUdyb3VwPiAmU2VxdWVuY2VzKTsKK307CisKKy8vLyBFbnN1cmVzIHRoYXQgZXZlcnkgY2xvbmUgaGFzIGF0IGxlYXN0IHRoZSBnaXZlbiBjb21wbGV4aXR5LgorLy8vCisvLy8gQ29tcGxleGl0eSBpcyBoZXJlIGRlZmluZWQgYXMgdGhlIHRvdGFsIGFtb3VudCBvZiBjaGlsZHJlbiBvZiBhIHN0YXRlbWVudC4KKy8vLyBUaGlzIGNvbnN0cmFpbnQgYXNzdW1lcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBncm91cCBpcyByZXByZXNlbnRhdGl2ZQorLy8vIGZvciBhbGwgb3RoZXIgc3RhdGVtZW50cyBpbiB0aGUgZ3JvdXAgaW4gdGVybXMgb2YgY29tcGxleGl0eS4KK2NsYXNzIE1pbkNvbXBsZXhpdHlDb25zdHJhaW50IHsKKyAgdW5zaWduZWQgTWluQ29tcGxleGl0eTsKKworcHVibGljOgorICBNaW5Db21wbGV4aXR5Q29uc3RyYWludCh1bnNpZ25lZCBNaW5Db21wbGV4aXR5KQorICAgICAgOiBNaW5Db21wbGV4aXR5KE1pbkNvbXBsZXhpdHkpIHt9CisKKyAgLy8vIENhbGN1bGF0ZXMgdGhlIGNvbXBsZXhpdHkgb2YgdGhlIGdpdmVuIFN0bXRTZXF1ZW5jZS4KKyAgLy8vIFxwYXJhbSBMaW1pdCBUaGUgbGltaXQgb2YgY29tcGxleGl0eSB3ZSBwcm9iZSBmb3IuIEFmdGVyIHJlYWNoaW5nCisgIC8vLyAgICAgICAgICAgICAgdGhpcyBsaW1pdCBkdXJpbmcgY2FsY3VsYXRpb24sIHRoaXMgbWV0aG9kIGlzIGV4aXRpbmcKKyAgLy8vICAgICAgICAgICAgICBlYXJseSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGFuZCByZXR1cm5zIHRoaXMgbGltaXQuCisgIHNpemVfdCBjYWxjdWxhdGVTdG10Q29tcGxleGl0eShjb25zdCBTdG10U2VxdWVuY2UgJlNlcSwgc3RkOjpzaXplX3QgTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmUGFyZW50TWFjcm9TdGFjayA9ICIiKTsKKworICB2b2lkIGNvbnN0cmFpbihzdGQ6OnZlY3RvcjxDbG9uZURldGVjdG9yOjpDbG9uZUdyb3VwPiAmQ2xvbmVHcm91cHMpIHsKKyAgICBDbG9uZUNvbnN0cmFpbnQ6OmZpbHRlckdyb3VwcygKKyAgICAgICAgQ2xvbmVHcm91cHMsIFt0aGlzXShjb25zdCBDbG9uZURldGVjdG9yOjpDbG9uZUdyb3VwICZBKSB7CisgICAgICAgICAgaWYgKCFBLmVtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gY2FsY3VsYXRlU3RtdENvbXBsZXhpdHkoQS5mcm9udCgpLCBNaW5Db21wbGV4aXR5KSA8CisgICAgICAgICAgICAgICAgICAgTWluQ29tcGxleGl0eTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0pOworICB9Cit9OworCisvLy8gRW5zdXJlcyB0aGF0IGFsbCBjbG9uZSBncm91cHMgY29udGFpbiBhdCBsZWFzdCB0aGUgZ2l2ZW4gYW1vdW50IG9mIGNsb25lcy4KK2NsYXNzIE1pbkdyb3VwU2l6ZUNvbnN0cmFpbnQgeworICB1bnNpZ25lZCBNaW5Hcm91cFNpemU7CisKK3B1YmxpYzoKKyAgTWluR3JvdXBTaXplQ29uc3RyYWludCh1bnNpZ25lZCBNaW5Hcm91cFNpemUgPSAyKQorICAgICAgOiBNaW5Hcm91cFNpemUoTWluR3JvdXBTaXplKSB7fQorCisgIHZvaWQgY29uc3RyYWluKHN0ZDo6dmVjdG9yPENsb25lRGV0ZWN0b3I6OkNsb25lR3JvdXA+ICZDbG9uZUdyb3VwcykgeworICAgIENsb25lQ29uc3RyYWludDo6ZmlsdGVyR3JvdXBzKENsb25lR3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzXShjb25zdCBDbG9uZURldGVjdG9yOjpDbG9uZUdyb3VwICZBKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQS5zaXplKCkgPCBNaW5Hcm91cFNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgIH0KK307CisKKy8vLyBFbnN1cmVzIHRoYXQgbm8gY2xvbmUgZ3JvdXAgZnVsbHkgY29udGFpbnMgYW5vdGhlciBjbG9uZSBncm91cC4KK3N0cnVjdCBPbmx5TGFyZ2VzdENsb25lQ29uc3RyYWludCB7CisgIHZvaWQgY29uc3RyYWluKHN0ZDo6dmVjdG9yPENsb25lRGV0ZWN0b3I6OkNsb25lR3JvdXA+ICZSZXN1bHQpOworfTsKKworc3RydWN0IEZpbGVuYW1lUGF0dGVybkNvbnN0cmFpbnQgeworICBTdHJpbmdSZWYgSWdub3JlZEZpbGVzUGF0dGVybjsKKyAgc3RkOjpzaGFyZWRfcHRyPGxsdm06OlJlZ2V4PiBJZ25vcmVkRmlsZXNSZWdleDsKKworICBGaWxlbmFtZVBhdHRlcm5Db25zdHJhaW50KFN0cmluZ1JlZiBJZ25vcmVkRmlsZXNQYXR0ZXJuKSAKKyAgICAgIDogSWdub3JlZEZpbGVzUGF0dGVybihJZ25vcmVkRmlsZXNQYXR0ZXJuKSB7CisgICAgSWdub3JlZEZpbGVzUmVnZXggPSBzdGQ6Om1ha2Vfc2hhcmVkPGxsdm06OlJlZ2V4PigiXigiICsKKyAgICAgICAgSWdub3JlZEZpbGVzUGF0dGVybi5zdHIoKSArICIkKSIpOworICB9CisKKyAgYm9vbCBpc0F1dG9HZW5lcmF0ZWQoY29uc3QgQ2xvbmVEZXRlY3Rvcjo6Q2xvbmVHcm91cCAmR3JvdXApOworCisgIHZvaWQgY29uc3RyYWluKHN0ZDo6dmVjdG9yPENsb25lRGV0ZWN0b3I6OkNsb25lR3JvdXA+ICZDbG9uZUdyb3VwcykgeworICAgIENsb25lQ29uc3RyYWludDo6ZmlsdGVyR3JvdXBzKAorICAgICAgICBDbG9uZUdyb3VwcywgW3RoaXNdKGNvbnN0IENsb25lRGV0ZWN0b3I6OkNsb25lR3JvdXAgJkdyb3VwKSB7CisgICAgICAgICAgcmV0dXJuIGlzQXV0b0dlbmVyYXRlZChHcm91cCk7CisgICAgICAgIH0pOworICB9Cit9OworCisvLy8gQW5hbHl6ZXMgdGhlIHBhdHRlcm4gb2YgdGhlIHJlZmVyZW5jZWQgdmFyaWFibGVzIGluIGEgc3RhdGVtZW50LgorY2xhc3MgVmFyaWFibGVQYXR0ZXJuIHsKKworICAvLy8gRGVzY3JpYmVzIGFuIG9jY3VycmVuY2Ugb2YgYSB2YXJpYWJsZSByZWZlcmVuY2UgaW4gYSBzdGF0ZW1lbnQuCisgIHN0cnVjdCBWYXJpYWJsZU9jY3VyZW5jZSB7CisgICAgLy8vIFRoZSBpbmRleCBvZiB0aGUgYXNzb2NpYXRlZCBWYXJEZWNsIGluIHRoZSBWYXJpYWJsZXMgdmVjdG9yLgorICAgIHNpemVfdCBLaW5kSUQ7CisgICAgLy8vIFRoZSBzdGF0ZW1lbnQgaW4gdGhlIGNvZGUgd2hlcmUgdGhlIHZhcmlhYmxlIHdhcyByZWZlcmVuY2VkLgorICAgIGNvbnN0IFN0bXQgKk1lbnRpb247CisKKyAgICBWYXJpYWJsZU9jY3VyZW5jZShzaXplX3QgS2luZElELCBjb25zdCBTdG10ICpNZW50aW9uKQorICAgICAgICA6IEtpbmRJRChLaW5kSUQpLCBNZW50aW9uKE1lbnRpb24pIHt9CisgIH07CisKKyAgLy8vIEFsbCBvY2N1cnJlbmNlcyBvZiByZWZlcmVuY2VkIHZhcmlhYmxlcyBpbiB0aGUgb3JkZXIgb2YgYXBwZWFyYW5jZS4KKyAgc3RkOjp2ZWN0b3I8VmFyaWFibGVPY2N1cmVuY2U+IE9jY3VyZW5jZXM7CisgIC8vLyBMaXN0IG9mIHJlZmVyZW5jZWQgdmFyaWFibGVzIGluIHRoZSBvcmRlciBvZiBhcHBlYXJhbmNlLgorICAvLy8gRXZlcnkgaXRlbSBpbiB0aGlzIGxpc3QgaXMgdW5pcXVlLgorICBzdGQ6OnZlY3Rvcjxjb25zdCBWYXJEZWNsICo+IFZhcmlhYmxlczsKKworICAvLy8gQWRkcyBhIG5ldyB2YXJpYWJsZSByZWZlcmVuY2VkIHRvIHRoaXMgcGF0dGVybi4KKyAgLy8vIFxwYXJhbSBWYXJEZWNsIFRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgdmFyaWFibGUgdGhhdCBpcyByZWZlcmVuY2VkLgorICAvLy8gXHBhcmFtIE1lbnRpb24gVGhlIFNvdXJjZVJhbmdlIHdoZXJlIHRoaXMgdmFyaWFibGUgaXMgcmVmZXJlbmNlZC4KKyAgdm9pZCBhZGRWYXJpYWJsZU9jY3VyZW5jZShjb25zdCBWYXJEZWNsICpWYXJEZWNsLCBjb25zdCBTdG10ICpNZW50aW9uKTsKKworICAvLy8gQWRkcyBlYWNoIHJlZmVyZW5jZWQgdmFyaWFibGUgZnJvbSB0aGUgZ2l2ZW4gc3RhdGVtZW50LgorICB2b2lkIGFkZFZhcmlhYmxlcyhjb25zdCBTdG10ICpTKTsKKworcHVibGljOgorICAvLy8gQ3JlYXRlcyBhbiBWYXJpYWJsZVBhdHRlcm4gb2JqZWN0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdpdmVuCisgIC8vLyBTdG10U2VxdWVuY2UuCisgIFZhcmlhYmxlUGF0dGVybihjb25zdCBTdG10U2VxdWVuY2UgJlNlcXVlbmNlKSB7CisgICAgZm9yIChjb25zdCBTdG10ICpTIDogU2VxdWVuY2UpCisgICAgICBhZGRWYXJpYWJsZXMoUyk7CisgIH0KKworICAvLy8gRGVzY3JpYmVzIHR3byBjbG9uZXMgdGhhdCByZWZlcmVuY2UgdGhlaXIgdmFyaWFibGVzIGluIGEgZGlmZmVyZW50IHBhdHRlcm4KKyAgLy8vIHdoaWNoIGNvdWxkIGluZGljYXRlIGEgcHJvZ3JhbW1pbmcgZXJyb3IuCisgIHN0cnVjdCBTdXNwaWNpb3VzQ2xvbmVQYWlyIHsKKyAgICAvLy8gVXRpbGl0eSBjbGFzcyBob2xkaW5nIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZQorICAgIC8vLyBjbG9uZSBpbiB0aGlzIHBhaXIuCisgICAgc3RydWN0IFN1c3BpY2lvdXNDbG9uZUluZm8geworICAgICAgLy8vIFRoZSB2YXJpYWJsZSB3aGljaCByZWZlcmVuY2luZyBpbiB0aGlzIGNsb25lIHdhcyBhZ2FpbnN0IHRoZSBwYXR0ZXJuLgorICAgICAgY29uc3QgVmFyRGVjbCAqVmFyaWFibGU7CisgICAgICAvLy8gV2hlcmUgdGhlIHZhcmlhYmxlIHdhcyByZWZlcmVuY2VkLgorICAgICAgY29uc3QgU3RtdCAqTWVudGlvbjsKKyAgICAgIC8vLyBUaGUgdmFyaWFibGUgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHJlZmVyZW5jZWQgdG8gZm9sbG93IHRoZSBwYXR0ZXJuLgorICAgICAgLy8vIElmIFN1Z2dlc3Rpb24gaXMgYSBudWxscHRyIHRoZW4gaXQncyBub3QgcG9zc2libGUgdG8gZml4IHRoZSBwYXR0ZXJuCisgICAgICAvLy8gYnkgcmVmZXJlbmNpbmcgYSBkaWZmZXJlbnQgdmFyaWFibGUgaW4gdGhpcyBjbG9uZS4KKyAgICAgIGNvbnN0IFZhckRlY2wgKlN1Z2dlc3Rpb247CisgICAgICBTdXNwaWNpb3VzQ2xvbmVJbmZvKGNvbnN0IFZhckRlY2wgKlZhcmlhYmxlLCBjb25zdCBTdG10ICpNZW50aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYXJEZWNsICpTdWdnZXN0aW9uKQorICAgICAgICAgIDogVmFyaWFibGUoVmFyaWFibGUpLCBNZW50aW9uKE1lbnRpb24pLCBTdWdnZXN0aW9uKFN1Z2dlc3Rpb24pIHt9CisgICAgICBTdXNwaWNpb3VzQ2xvbmVJbmZvKCkge30KKyAgICB9OworICAgIC8vLyBUaGUgZmlyc3QgY2xvbmUgaW4gdGhlIHBhaXIgd2hpY2ggYWx3YXlzIGhhcyBhIHN1Z2dlc3RlZCB2YXJpYWJsZS4KKyAgICBTdXNwaWNpb3VzQ2xvbmVJbmZvIEZpcnN0Q2xvbmVJbmZvOworICAgIC8vLyBUaGlzIG90aGVyIGNsb25lIGluIHRoZSBwYWlyIHdoaWNoIGNhbiBoYXZlIGEgc3VnZ2VzdGVkIHZhcmlhYmxlLgorICAgIFN1c3BpY2lvdXNDbG9uZUluZm8gU2Vjb25kQ2xvbmVJbmZvOworICB9OworCisgIC8vLyBDb3VudHMgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhpcyBwYXR0ZXJuIGFuZCB0aGUgZ2l2ZW4gb25lLgorICAvLy8gXHBhcmFtIE90aGVyIFRoZSBnaXZlbiBWYXJpYWJsZVBhdHRlcm4gdG8gY29tcGFyZSB3aXRoLgorICAvLy8gXHBhcmFtIEZpcnN0TWlzbWF0Y2ggT3V0cHV0IHBhcmFtZXRlciB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggaW5mb3JtYXRpb24KKyAgLy8vICAgICAgICBhYm91dCB0aGUgZmlyc3QgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gcGF0dGVybnMuIFRoaXMgcGFyYW1ldGVyCisgIC8vLyAgICAgICAgY2FuIGJlIGEgbnVsbHB0ciwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGJlIGlnbm9yZWQuCisgIC8vLyBccmV0dXJuIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBwYXR0ZXJuIHRoaXMgb2JqZWN0CisgIC8vLyAgICAgICAgIGlzIGZvbGxvd2luZyBhbmQgdGhlIGdpdmVuIFZhcmlhYmxlUGF0dGVybi4KKyAgLy8vCisgIC8vLyBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnRzIGFsbCBoYXZlIHRoZSBzYW1lIHBhdHRlcm4gYW5kIHRoaXMKKyAgLy8vIGZ1bmN0aW9uIHdvdWxkIHJldHVybiB6ZXJvOgorICAvLy8KKyAgLy8vICAgaWYgKGEgPCBiKSByZXR1cm4gYTsgcmV0dXJuIGI7CisgIC8vLyAgIGlmICh4IDwgeSkgcmV0dXJuIHg7IHJldHVybiB5OworICAvLy8gICBpZiAodTIgPCB1MSkgcmV0dXJuIHUyOyByZXR1cm4gdTE7CisgIC8vLworICAvLy8gQnV0IHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50IGhhcyBhIGRpZmZlcmVudCBwYXR0ZXJuIChub3RlIHRoZSBjaGFuZ2VkCisgIC8vLyB2YXJpYWJsZXMgaW4gdGhlIHJldHVybiBzdGF0ZW1lbnRzKSBhbmQgd291bGQgaGF2ZSB0d28gZGlmZmVyZW5jZXMgd2hlbgorICAvLy8gY29tcGFyZWQgd2l0aCBvbmUgb2YgdGhlIHN0YXRlbWVudHMgYWJvdmUuCisgIC8vLworICAvLy8gICBpZiAoYSA8IGIpIHJldHVybiBiOyByZXR1cm4gYTsKKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgcmVsYXRlZCBzdGF0ZW1lbnRzIG9mIHRoZSBnaXZlbgorICAvLy8gcGF0dGVybiBhbmQgdGhlIHN0YXRlbWVudHMgb2YgdGhpcyBvYmplY3RzIGFyZSBjbG9uZXMgb2YgZWFjaCBvdGhlci4KKyAgdW5zaWduZWQgY291bnRQYXR0ZXJuRGlmZmVyZW5jZXMoCisgICAgICBjb25zdCBWYXJpYWJsZVBhdHRlcm4gJk90aGVyLAorICAgICAgVmFyaWFibGVQYXR0ZXJuOjpTdXNwaWNpb3VzQ2xvbmVQYWlyICpGaXJzdE1pc21hdGNoID0gbnVsbHB0cik7Cit9OworCisvLy8gRW5zdXJlcyB0aGF0IGFsbCBjbG9uZXMgcmVmZXJlbmNlIHZhcmlhYmxlcyBpbiB0aGUgc2FtZSBwYXR0ZXJuLgorc3RydWN0IE1hdGNoaW5nVmFyaWFibGVQYXR0ZXJuQ29uc3RyYWludCB7CisgIHZvaWQgY29uc3RyYWluKHN0ZDo6dmVjdG9yPENsb25lRGV0ZWN0b3I6OkNsb25lR3JvdXA+ICZDbG9uZUdyb3Vwcyk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQVNUX0NMT05FREVURUNUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0NvZGVJbmplY3Rvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQ29kZUluamVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzYTU1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0NvZGVJbmplY3Rvci5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vPT09LS0gQ29kZUluamVjdG9yLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHRoZSBjbGFuZzo6Q29kZUluamVjdG9yIGludGVyZmFjZSB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IKKy8vLyBpbmplY3RpbmcgQVNUIG9mIGZ1bmN0aW9uIGRlZmluaXRpb25zIHRoYXQgbWF5IG5vdCBiZSBhdmFpbGFibGUgaW4gdGhlCisvLy8gb3JpZ2luYWwgc291cmNlLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQU5BTFlTSVNfQ09ERUlOSkVDVE9SX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BTkFMWVNJU19DT0RFSU5KRUNUT1JfSAorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBTdG10OworY2xhc3MgRnVuY3Rpb25EZWNsOworY2xhc3MgT2JqQ01ldGhvZERlY2w7CisKKy8vLyBcYnJpZWYgQ29kZUluamVjdG9yIGlzIGFuIGludGVyZmFjZSB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgaW5qZWN0aW5nIEFTVAorLy8vIG9mIGZ1bmN0aW9uIGRlZmluaXRpb25zIHRoYXQgbWF5IG5vdCBiZSBhdmFpbGFibGUgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4KKy8vLworLy8vIFRoZSBnZXRCb2R5IGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZSB0aGUgc3RhdGljIGFuYWx5emVyIGV4YW1pbmVzIGEKKy8vLyBmdW5jdGlvbiBjYWxsIHRoYXQgaGFzIG5vIGRlZmluaXRpb24gYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uCisvLy8gdW5pdC4gSWYgdGhlIHJldHVybmVkIHN0YXRlbWVudCBpcyBub3QgYSBudWxsIHBvaW50ZXIsIGl0IGlzIGFzc3VtZWQgdG8gYmUKKy8vLyB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGFuYWx5c2lzLiBUaGUgc291cmNlIG9mCisvLy8gdGhlIGJvZHkgY2FuIGJlIGFyYml0cmFyeSwgYnV0IGl0IGlzIGFkdmlzZWQgdG8gdXNlIG1lbW9pemF0aW9uIHRvIGF2b2lkCisvLy8gdW5uZWNlc3NhcnkgcmVwYXJzaW5nIG9mIHRoZSBleHRlcm5hbCBzb3VyY2UgdGhhdCBwcm92aWRlcyB0aGUgYm9keSBvZiB0aGUKKy8vLyBmdW5jdGlvbnMuCitjbGFzcyBDb2RlSW5qZWN0b3IgeworcHVibGljOgorICBDb2RlSW5qZWN0b3IoKTsKKyAgdmlydHVhbCB+Q29kZUluamVjdG9yKCk7CisKKyAgdmlydHVhbCBTdG10ICpnZXRCb2R5KGNvbnN0IEZ1bmN0aW9uRGVjbCAqRCkgPSAwOworICB2aXJ0dWFsIFN0bXQgKmdldEJvZHkoY29uc3QgT2JqQ01ldGhvZERlY2wgKkQpID0gMDsKK307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQ29uc3RydWN0aW9uQ29udGV4dC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQ29uc3RydWN0aW9uQ29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZjk1YTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9Db25zdHJ1Y3Rpb25Db250ZXh0LmgKQEAgLTAsMCArMSw0MTIgQEAKKy8vPT09LSBDb25zdHJ1Y3Rpb25Db250ZXh0LmggLSBDRkcgY29uc3RydWN0b3IgaW5mb3JtYXRpb24gLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIENvbnN0cnVjdGlvbkNvbnRleHQgY2xhc3MgYW5kIGl0cyBzdWItY2xhc3NlcywKKy8vIHdoaWNoIHJlcHJlc2VudCB2YXJpb3VzIGRpZmZlcmVudCB3YXlzIG9mIGNvbnN0cnVjdGluZyBDKysgb2JqZWN0cworLy8gd2l0aCB0aGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGUgdXNlcnMgbWF5IHdhbnQgdG8ga25vdyBhYm91dAorLy8gdGhlIGNvbnN0cnVjdG9yLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BTkFMWVNJU19DT05TVFJVQ1RJT05DT05URVhUX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BTkFMWVNJU19DT05TVFJVQ1RJT05DT05URVhUX0gKKworI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL1N1cHBvcnQvQnVtcFZlY3Rvci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByQ1hYLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKKy8vLyBDb25zdHJ1Y3Rpb24gY29udGV4dCBpcyBhIGxpbmtlZCBsaXN0IG9mIG11bHRpcGxlIGxheWVycy4gTGF5ZXJzIGFyZQorLy8vIGNyZWF0ZWQgZ3JhZHVhbGx5IHdoaWxlIHRyYXZlcnNpbmcgdGhlIEFTVCwgYW5kIGxheWVycyB0aGF0IHJlcHJlc2VudAorLy8vIHRoZSBvdXRtb3N0IEFTVCBub2RlcyBhcmUgYnVpbHQgZmlyc3QsIHdoaWxlIHRoZSBub2RlIHRoYXQgaW1tZWRpYXRlbHkKKy8vLyBjb250YWlucyB0aGUgY29uc3RydWN0b3Igd291bGQgYmUgYnVpbHQgbGFzdCBhbmQgY2FwdHVyZSB0aGUgcHJldmlvdXMKKy8vLyBsYXllcnMgYXMgaXRzIHBhcmVudHMuIENvbnN0cnVjdGlvbiBjb250ZXh0IGNhcHR1cmVzIHRoZSBsYXN0IGxheWVyCisvLy8gKHdoaWNoIGhhcyBsaW5rcyB0byB0aGUgcHJldmlvdXMgbGF5ZXJzKSBhbmQgY2xhc3NpZmllcyB0aGUgc2VlbWluZ2x5CisvLy8gYXJiaXRyYXJ5IGNoYWluIG9mIGxheWVycyBpbnRvIG9uZSBvZiB0aGUgcG9zc2libGUgd2F5cyBvZiBjb25zdHJ1Y3RpbmcKKy8vLyBhbiBvYmplY3QgaW4gQysrIGZvciB1c2VyLWZyaWVuZGx5IGV4cGVyaWVuY2UuCitjbGFzcyBDb25zdHJ1Y3Rpb25Db250ZXh0TGF5ZXIgeworcHVibGljOgorICB0eXBlZGVmIGxsdm06OlBvaW50ZXJVbmlvbjxTdG10ICosIENYWEN0b3JJbml0aWFsaXplciAqPiBUcmlnZ2VyVHk7CisKK3ByaXZhdGU6CisgIC8vLyBUaGUgY29uc3RydWN0aW9uIHNpdGUgLSB0aGUgc3RhdGVtZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBjb25zdHJ1Y3Rpb24KKyAgLy8vIGZvciBvbmUgb2YgaXRzIHBhcnRzLiBGb3IgaW5zdGFuY2UsIHN0YWNrIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudAorICAvLy8gdHJpZ2dlcnMgY29uc3RydWN0aW9uIG9mIGl0c2VsZiBvciBpdHMgZWxlbWVudHMgaWYgaXQncyBhbiBhcnJheSwKKyAgLy8vIG5ldy1leHByZXNzaW9uIHRyaWdnZXJzIGNvbnN0cnVjdGlvbiBvZiB0aGUgbmV3bHkgYWxsb2NhdGVkIG9iamVjdChzKS4KKyAgVHJpZ2dlclR5IFRyaWdnZXI7CisKKyAgLy8vIFNvbWV0aW1lcyBhIHNpbmdsZSB0cmlnZ2VyIGlzIG5vdCBlbm91Z2ggdG8gZGVzY3JpYmUgdGhlIGNvbnN0cnVjdGlvbgorICAvLy8gc2l0ZS4gSW4gdGhpcyBjYXNlIHdlJ2QgaGF2ZSBhIGNoYWluIG9mICJwYXJ0aWFsIiBjb25zdHJ1Y3Rpb24gY29udGV4dAorICAvLy8gbGF5ZXJzLgorICAvLy8gU29tZSBleGFtcGxlczoKKyAgLy8vIC0gQSBjb25zdHJ1Y3RvciB3aXRoaW4gaW4gYW4gYWdncmVnYXRlIGluaXRpYWxpemVyIGxpc3Qgd2l0aGluIGEgdmFyaWFibGUKKyAgLy8vICAgd291bGQgaGF2ZSBhIGNvbnN0cnVjdGlvbiBjb250ZXh0IG9mIHRoZSBpbml0aWFsaXplciBsaXN0IHdpdGgKKyAgLy8vICAgdGhlIHBhcmVudCBjb25zdHJ1Y3Rpb24gY29udGV4dCBvZiBhIHZhcmlhYmxlLgorICAvLy8gLSBBIGNvbnN0cnVjdG9yIGZvciBhIHRlbXBvcmFyeSB0aGF0IG5lZWRzIHRvIGJlIGJvdGggZGVzdHJveWVkCisgIC8vLyAgIGFuZCBtYXRlcmlhbGl6ZWQgaW50byBhbiBlbGlkYWJsZSBjb3B5IGNvbnN0cnVjdG9yIHdvdWxkIGhhdmUgYQorICAvLy8gICBjb25zdHJ1Y3Rpb24gY29udGV4dCBvZiBhIENYWEJpbmRUZW1wb3JhcnlFeHByIHdpdGggdGhlIHBhcmVudAorICAvLy8gICBjb25zdHJ1Y3Rpb24gY29udGV4dCBvZiBhIE1hdGVyaWFsaXplVGVtcHJvcmFyeUV4cHIuCisgIC8vLyBOb3QgYWxsIG9mIHRoZXNlIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkLgorICBjb25zdCBDb25zdHJ1Y3Rpb25Db250ZXh0TGF5ZXIgKlBhcmVudCA9IG51bGxwdHI7CisKKyAgQ29uc3RydWN0aW9uQ29udGV4dExheWVyKFRyaWdnZXJUeSBUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25zdHJ1Y3Rpb25Db250ZXh0TGF5ZXIgKlBhcmVudCkKKyAgICAgIDogVHJpZ2dlcihUcmlnZ2VyKSwgUGFyZW50KFBhcmVudCkge30KKworcHVibGljOgorICBzdGF0aWMgY29uc3QgQ29uc3RydWN0aW9uQ29udGV4dExheWVyICoKKyAgY3JlYXRlKEJ1bXBWZWN0b3JDb250ZXh0ICZDLCBUcmlnZ2VyVHkgVHJpZ2dlciwKKyAgICAgICAgIGNvbnN0IENvbnN0cnVjdGlvbkNvbnRleHRMYXllciAqUGFyZW50ID0gbnVsbHB0cik7CisKKyAgY29uc3QgQ29uc3RydWN0aW9uQ29udGV4dExheWVyICpnZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBQYXJlbnQ7IH0KKyAgYm9vbCBpc0xhc3QoKSBjb25zdCB7IHJldHVybiAhUGFyZW50OyB9CisKKyAgY29uc3QgU3RtdCAqZ2V0VHJpZ2dlclN0bXQoKSBjb25zdCB7CisgICAgcmV0dXJuIFRyaWdnZXIuZHluX2Nhc3Q8U3RtdCAqPigpOworICB9CisKKyAgY29uc3QgQ1hYQ3RvckluaXRpYWxpemVyICpnZXRUcmlnZ2VySW5pdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVHJpZ2dlci5keW5fY2FzdDxDWFhDdG9ySW5pdGlhbGl6ZXIgKj4oKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlc2UgbGF5ZXJzIGFyZSBlcXVhbCBhcyBpbmRpdmlkdWFsIGxheWVycywgZXZlbiBpZgorICAvLy8gdGhlaXIgcGFyZW50cyBhcmUgZGlmZmVyZW50LgorICBib29sIGlzU2FtZUxheWVyKGNvbnN0IENvbnN0cnVjdGlvbkNvbnRleHRMYXllciAqT3RoZXIpIGNvbnN0IHsKKyAgICBhc3NlcnQoT3RoZXIpOworICAgIHJldHVybiAoVHJpZ2dlciA9PSBPdGhlci0+VHJpZ2dlcik7CisgIH0KKworICAvLy8gU2VlIGlmIE90aGVyIGlzIGEgcHJvcGVyIGluaXRpYWwgc2VnbWVudCBvZiB0aGlzIGNvbnN0cnVjdGlvbiBjb250ZXh0CisgIC8vLyBpbiB0ZXJtcyBvZiB0aGUgcGFyZW50IGNoYWluIC0gaS5lLiBhIGZldyBmaXJzdCBwYXJlbnRzIGNvaW5jaWRlIGFuZAorICAvLy8gdGhlbiB0aGUgb3RoZXIgY29udGV4dCB0ZXJtaW5hdGVzIGJ1dCBvdXIgY29udGV4dCBnb2VzIGZ1cnRoZXIgLSBpLmUuLAorICAvLy8gd2UgYXJlIHByb3ZpZGluZyB0aGUgc2FtZSBjb250ZXh0IHRoYXQgdGhlIG90aGVyIGNvbnRleHQgcHJvdmlkZXMsCisgIC8vLyBhbmQgYSBiaXQgbW9yZSBhYm92ZSB0aGF0LgorICBib29sIGlzU3RyaWN0bHlNb3JlU3BlY2lmaWNUaGFuKGNvbnN0IENvbnN0cnVjdGlvbkNvbnRleHRMYXllciAqT3RoZXIpIGNvbnN0OworfTsKKworCisvLy8gQ29uc3RydWN0aW9uQ29udGV4dCdzIHN1YmNsYXNzZXMgZGVzY3JpYmUgZGlmZmVyZW50IHdheXMgb2YgY29uc3RydWN0aW5nCisvLy8gYW4gb2JqZWN0IGluIEMrKy4gVGhlIGNvbnRleHQgcmUtY2FwdHVyZXMgdGhlIGVzc2VudGlhbCBwYXJlbnQgQVNUIG5vZGVzCisvLy8gb2YgdGhlIENYWENvbnN0cnVjdEV4cHIgaXQgaXMgYXNzaWduZWQgdG8gYW5kIHByZXNlbnRzIHRoZXNlIG5vZGVzCisvLy8gdGhyb3VnaCBlYXN5LXRvLXVuZGVyc3RhbmQgYWNjZXNzb3IgbWV0aG9kcy4KK2NsYXNzIENvbnN0cnVjdGlvbkNvbnRleHQgeworcHVibGljOgorICBlbnVtIEtpbmQgeworICAgIFNpbXBsZVZhcmlhYmxlS2luZCwKKyAgICBDWFgxN0VsaWRlZENvcHlWYXJpYWJsZUtpbmQsCisgICAgVkFSSUFCTEVfQkVHSU4gPSBTaW1wbGVWYXJpYWJsZUtpbmQsCisgICAgVkFSSUFCTEVfRU5EID0gQ1hYMTdFbGlkZWRDb3B5VmFyaWFibGVLaW5kLAorICAgIFNpbXBsZUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJLaW5kLAorICAgIENYWDE3RWxpZGVkQ29weUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJLaW5kLAorICAgIElOSVRJQUxJWkVSX0JFR0lOID0gU2ltcGxlQ29uc3RydWN0b3JJbml0aWFsaXplcktpbmQsCisgICAgSU5JVElBTElaRVJfRU5EID0gQ1hYMTdFbGlkZWRDb3B5Q29uc3RydWN0b3JJbml0aWFsaXplcktpbmQsCisgICAgTmV3QWxsb2NhdGVkT2JqZWN0S2luZCwKKyAgICBUZW1wb3JhcnlPYmplY3RLaW5kLAorICAgIFNpbXBsZVJldHVybmVkVmFsdWVLaW5kLAorICAgIENYWDE3RWxpZGVkQ29weVJldHVybmVkVmFsdWVLaW5kLAorICAgIFJFVFVSTkVEX1ZBTFVFX0JFR0lOID0gU2ltcGxlUmV0dXJuZWRWYWx1ZUtpbmQsCisgICAgUkVUVVJORURfVkFMVUVfRU5EID0gQ1hYMTdFbGlkZWRDb3B5UmV0dXJuZWRWYWx1ZUtpbmQKKyAgfTsKKworcHJvdGVjdGVkOgorICBLaW5kIEs7CisKKyAgLy8gRG8gbm90IG1ha2UgcHVibGljISBUaGVzZSBuZWVkIHRvIG9ubHkgYmUgY29uc3RydWN0ZWQKKyAgLy8gdmlhIGNyZWF0ZUZyb21MYXllcnMoKS4KKyAgZXhwbGljaXQgQ29uc3RydWN0aW9uQ29udGV4dChLaW5kIEspIDogSyhLKSB7fQorCitwcml2YXRlOgorICAvLyBBIGhlbHBlciBmdW5jdGlvbiBmb3IgY29uc3RydWN0aW5nIGFuIGluc3RhbmNlIGludG8gYSBidW1wIHZlY3RvciBjb250ZXh0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJnVHlwZXM+CisgIHN0YXRpYyBUICpjcmVhdGUoQnVtcFZlY3RvckNvbnRleHQgJkMsIEFyZ1R5cGVzLi4uIEFyZ3MpIHsKKyAgICBhdXRvICpDQyA9IEMuZ2V0QWxsb2NhdG9yKCkuQWxsb2NhdGU8VD4oKTsKKyAgICByZXR1cm4gbmV3IChDQykgVChBcmdzLi4uKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBDb25zdW1lIHRoZSBjb25zdHJ1Y3Rpb24gY29udGV4dCBsYXllciwgdG9nZXRoZXIgd2l0aCBpdHMgcGFyZW50IGxheWVycywKKyAgLy8vIGFuZCB3cmFwIGl0IHVwIGludG8gYSBjb21wbGV0ZSBjb25zdHJ1Y3Rpb24gY29udGV4dC4gTWF5IHJldHVybiBudWxsCisgIC8vLyBpZiBsYXllcnMgZG8gbm90IGZvcm0gYW55IHN1cHBvcnRlZCBjb25zdHJ1Y3Rpb24gY29udGV4dC4KKyAgc3RhdGljIGNvbnN0IENvbnN0cnVjdGlvbkNvbnRleHQgKgorICBjcmVhdGVGcm9tTGF5ZXJzKEJ1bXBWZWN0b3JDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN0cnVjdGlvbkNvbnRleHRMYXllciAqVG9wTGF5ZXIpOworCisgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEs7IH0KK307CisKKy8vLyBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBsb2NhbCB2YXJpYWJsZSBjb25zdHJ1Y3RvcnMuCitjbGFzcyBWYXJpYWJsZUNvbnN0cnVjdGlvbkNvbnRleHQgOiBwdWJsaWMgQ29uc3RydWN0aW9uQ29udGV4dCB7CisgIGNvbnN0IERlY2xTdG10ICpEUzsKKworcHJvdGVjdGVkOgorICBWYXJpYWJsZUNvbnN0cnVjdGlvbkNvbnRleHQoQ29uc3RydWN0aW9uQ29udGV4dDo6S2luZCBLLCBjb25zdCBEZWNsU3RtdCAqRFMpCisgICAgICA6IENvbnN0cnVjdGlvbkNvbnRleHQoSyksIERTKERTKSB7CisgICAgYXNzZXJ0KGNsYXNzb2YodGhpcykpOworICAgIGFzc2VydChEUyk7CisgIH0KKworcHVibGljOgorICBjb25zdCBEZWNsU3RtdCAqZ2V0RGVjbFN0bXQoKSBjb25zdCB7IHJldHVybiBEUzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ29uc3RydWN0aW9uQ29udGV4dCAqQ0MpIHsKKyAgICByZXR1cm4gQ0MtPmdldEtpbmQoKSA+PSBWQVJJQUJMRV9CRUdJTiAmJgorICAgICAgICAgICBDQy0+Z2V0S2luZCgpIDw9IFZBUklBQkxFX0VORDsKKyAgfQorfTsKKworLy8vIFJlcHJlc2VudHMgY29uc3RydWN0aW9uIGludG8gYSBzaW1wbGUgbG9jYWwgdmFyaWFibGUsIGVnLiBUIHZhcigxMjMpOy4KKy8vLyBJZiBhIHZhcmlhYmxlIGhhcyBhbiBpbml0aWFsaXplciwgZWcuIFQgdmFyID0gbWFrZVQoKTssIHRoZW4gdGhlIGZpbmFsCisvLy8gZWxpZGFibGUgY29weS1jb25zdHJ1Y3RvciBmcm9tIG1ha2VUKCkgaW50byB2YXIgd291bGQgYWxzbyBiZSBhIHNpbXBsZQorLy8vIHZhcmlhYmxlIGNvbnN0cnVjdG9yIGhhbmRsZWQgYnkgdGhpcyBjbGFzcy4KK2NsYXNzIFNpbXBsZVZhcmlhYmxlQ29uc3RydWN0aW9uQ29udGV4dCA6IHB1YmxpYyBWYXJpYWJsZUNvbnN0cnVjdGlvbkNvbnRleHQgeworICBmcmllbmQgY2xhc3MgQ29uc3RydWN0aW9uQ29udGV4dDsgLy8gQWxsb3dzIHRvIGNyZWF0ZTw+KCkgaXRzZWxmLgorCisgIGV4cGxpY2l0IFNpbXBsZVZhcmlhYmxlQ29uc3RydWN0aW9uQ29udGV4dChjb25zdCBEZWNsU3RtdCAqRFMpCisgICAgICA6IFZhcmlhYmxlQ29uc3RydWN0aW9uQ29udGV4dChDb25zdHJ1Y3Rpb25Db250ZXh0OjpTaW1wbGVWYXJpYWJsZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUykge30KKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0cnVjdGlvbkNvbnRleHQgKkNDKSB7CisgICAgcmV0dXJuIENDLT5nZXRLaW5kKCkgPT0gU2ltcGxlVmFyaWFibGVLaW5kOworICB9Cit9OworCisvLy8gUmVwcmVzZW50cyBjb25zdHJ1Y3Rpb24gaW50byBhIHNpbXBsZSB2YXJpYWJsZSB3aXRoIGFuIGluaXRpYWxpemVyIHN5bnRheCwKKy8vLyB3aXRoIGEgc2luZ2xlIGNvbnN0cnVjdG9yLCBlZy4gVCB2YXIgPSBtYWtlVCgpOy4gU3VjaCBjb25zdHJ1Y3Rpb24gY29udGV4dAorLy8vIG1heSBvbmx5IGFwcGVhciBpbiBDKysxNyBiZWNhdXNlIHByZXZpb3VzbHkgaXQgd2FzIHNwbGl0IGludG8gYSB0ZW1wb3JhcnkKKy8vLyBvYmplY3QgY29uc3RydWN0b3IgYW5kIGFuIGVsaWRhYmxlIHNpbXBsZSB2YXJpYWJsZSBjb3B5LWNvbnN0cnVjdG9yIGFuZAorLy8vIHdlIHdlcmUgcHJvZHVjaW5nIHNlcGFyYXRlIGNvbnN0cnVjdGlvbiBjb250ZXh0cyBmb3IgdGhlc2UgY29uc3RydWN0b3JzLgorLy8vIEluIEMrKzE3IHdlIGhhdmUgYSBzaW5nbGUgY29uc3RydWN0aW9uIGNvbnRleHQgdGhhdCBjb21iaW5lcyBib3RoLgorLy8vIE5vdGUgdGhhdCBpZiB0aGUgb2JqZWN0IGhhcyB0cml2aWFsIGRlc3RydWN0b3IsIHRoZW4gdGhpcyBjb2RlIGlzCisvLy8gaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhIHNpbXBsZSB2YXJpYWJsZSBjb25zdHJ1Y3RvciBvbiB0aGUgQVNUIGxldmVsOworLy8vIGluIHRoaXMgY2FzZSB3ZSBwcm92aWRlIGEgc2ltcGxlIHZhcmlhYmxlIGNvbnN0cnVjdGlvbiBjb250ZXh0LgorY2xhc3MgQ1hYMTdFbGlkZWRDb3B5VmFyaWFibGVDb25zdHJ1Y3Rpb25Db250ZXh0CisgICAgOiBwdWJsaWMgVmFyaWFibGVDb25zdHJ1Y3Rpb25Db250ZXh0IHsKKyAgY29uc3QgQ1hYQmluZFRlbXBvcmFyeUV4cHIgKkJURTsKKworICBmcmllbmQgY2xhc3MgQ29uc3RydWN0aW9uQ29udGV4dDsgLy8gQWxsb3dzIHRvIGNyZWF0ZTw+KCkgaXRzZWxmLgorCisgIGV4cGxpY2l0IENYWDE3RWxpZGVkQ29weVZhcmlhYmxlQ29uc3RydWN0aW9uQ29udGV4dCgKKyAgICAgIGNvbnN0IERlY2xTdG10ICpEUywgY29uc3QgQ1hYQmluZFRlbXBvcmFyeUV4cHIgKkJURSkKKyAgICAgIDogVmFyaWFibGVDb25zdHJ1Y3Rpb25Db250ZXh0KENYWDE3RWxpZGVkQ29weVZhcmlhYmxlS2luZCwgRFMpLCBCVEUoQlRFKSB7CisgICAgYXNzZXJ0KEJURSk7CisgIH0KKworcHVibGljOgorICBjb25zdCBDWFhCaW5kVGVtcG9yYXJ5RXhwciAqZ2V0Q1hYQmluZFRlbXBvcmFyeUV4cHIoKSBjb25zdCB7IHJldHVybiBCVEU7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0cnVjdGlvbkNvbnRleHQgKkNDKSB7CisgICAgcmV0dXJuIENDLT5nZXRLaW5kKCkgPT0gQ1hYMTdFbGlkZWRDb3B5VmFyaWFibGVLaW5kOworICB9Cit9OworCisvLyBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjb25zdHJ1Y3Rvci1pbml0aWFsaXplci1iYXNlZCBjb25zdHJ1Y3RvcnMuCitjbGFzcyBDb25zdHJ1Y3RvckluaXRpYWxpemVyQ29uc3RydWN0aW9uQ29udGV4dCA6IHB1YmxpYyBDb25zdHJ1Y3Rpb25Db250ZXh0IHsKKyAgY29uc3QgQ1hYQ3RvckluaXRpYWxpemVyICpJOworCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IENvbnN0cnVjdG9ySW5pdGlhbGl6ZXJDb25zdHJ1Y3Rpb25Db250ZXh0KAorICAgICAgQ29uc3RydWN0aW9uQ29udGV4dDo6S2luZCBLLCBjb25zdCBDWFhDdG9ySW5pdGlhbGl6ZXIgKkkpCisgICAgICA6IENvbnN0cnVjdGlvbkNvbnRleHQoSyksIEkoSSkgeworICAgIGFzc2VydChjbGFzc29mKHRoaXMpKTsKKyAgICBhc3NlcnQoSSk7CisgIH0KKworcHVibGljOgorICBjb25zdCBDWFhDdG9ySW5pdGlhbGl6ZXIgKmdldENYWEN0b3JJbml0aWFsaXplcigpIGNvbnN0IHsgcmV0dXJuIEk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0cnVjdGlvbkNvbnRleHQgKkNDKSB7CisgICAgcmV0dXJuIENDLT5nZXRLaW5kKCkgPj0gSU5JVElBTElaRVJfQkVHSU4gJiYKKyAgICAgICAgICAgQ0MtPmdldEtpbmQoKSA8PSBJTklUSUFMSVpFUl9FTkQ7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGNvbnN0cnVjdGlvbiBpbnRvIGEgZmllbGQgb3IgYSBiYXNlIGNsYXNzIHdpdGhpbiBhIGJpZ2dlciBvYmplY3QKKy8vLyB2aWEgYSBjb25zdHJ1Y3RvciBpbml0aWFsaXplciwgZWcuIFQoKTogZmllbGQoMTIzKSB7IC4uLiB9LgorY2xhc3MgU2ltcGxlQ29uc3RydWN0b3JJbml0aWFsaXplckNvbnN0cnVjdGlvbkNvbnRleHQKKyAgICA6IHB1YmxpYyBDb25zdHJ1Y3RvckluaXRpYWxpemVyQ29uc3RydWN0aW9uQ29udGV4dCB7CisgIGZyaWVuZCBjbGFzcyBDb25zdHJ1Y3Rpb25Db250ZXh0OyAvLyBBbGxvd3MgdG8gY3JlYXRlPD4oKSBpdHNlbGYuCisKKyAgZXhwbGljaXQgU2ltcGxlQ29uc3RydWN0b3JJbml0aWFsaXplckNvbnN0cnVjdGlvbkNvbnRleHQoCisgICAgICBjb25zdCBDWFhDdG9ySW5pdGlhbGl6ZXIgKkkpCisgICAgICA6IENvbnN0cnVjdG9ySW5pdGlhbGl6ZXJDb25zdHJ1Y3Rpb25Db250ZXh0KAorICAgICAgICAgICAgQ29uc3RydWN0aW9uQ29udGV4dDo6U2ltcGxlQ29uc3RydWN0b3JJbml0aWFsaXplcktpbmQsIEkpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDb25zdHJ1Y3Rpb25Db250ZXh0ICpDQykgeworICAgIHJldHVybiBDQy0+Z2V0S2luZCgpID09IFNpbXBsZUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJLaW5kOworICB9Cit9OworCisvLy8gUmVwcmVzZW50cyBjb25zdHJ1Y3Rpb24gaW50byBhIGZpZWxkIG9yIGEgYmFzZSBjbGFzcyB3aXRoaW4gYSBiaWdnZXIgb2JqZWN0CisvLy8gdmlhIGEgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXIsIHdpdGggYSBzaW5nbGUgY29uc3RydWN0b3IsIGVnLgorLy8vIFQoKTogZmllbGQoRmllbGQoMTIzKSkgeyAuLi4gfS4gU3VjaCBjb25zdHJ1Y3Rpb24gY29udGV4dCBtYXkgb25seSBhcHBlYXIKKy8vLyBpbiBDKysxNyBiZWNhdXNlIHByZXZpb3VzbHkgaXQgd2FzIHNwbGl0IGludG8gYSB0ZW1wb3Jhcnkgb2JqZWN0IGNvbnN0cnVjdG9yCisvLy8gYW5kIGFuIGVsaWRhYmxlIHNpbXBsZSBjb25zdHJ1Y3Rvci1pbml0aWFsaXplciBjb3B5LWNvbnN0cnVjdG9yIGFuZCB3ZSB3ZXJlCisvLy8gcHJvZHVjaW5nIHNlcGFyYXRlIGNvbnN0cnVjdGlvbiBjb250ZXh0cyBmb3IgdGhlc2UgY29uc3RydWN0b3JzLiBJbiBDKysxNworLy8vIHdlIGhhdmUgYSBzaW5nbGUgY29uc3RydWN0aW9uIGNvbnRleHQgdGhhdCBjb21iaW5lcyBib3RoLiBOb3RlIHRoYXQgaWYgdGhlCisvLy8gb2JqZWN0IGhhcyB0cml2aWFsIGRlc3RydWN0b3IsIHRoZW4gdGhpcyBjb2RlIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20KKy8vLyBhIHNpbXBsZSBjb25zdHJ1Y3Rvci1pbml0aWFsaXplciBjb25zdHJ1Y3RvciBvbiB0aGUgQVNUIGxldmVsOyBpbiB0aGlzIGNhc2UKKy8vLyB3ZSBwcm92aWRlIGEgc2ltcGxlIGNvbnN0cnVjdG9yLWluaXRpYWxpemVyIGNvbnN0cnVjdGlvbiBjb250ZXh0LgorY2xhc3MgQ1hYMTdFbGlkZWRDb3B5Q29uc3RydWN0b3JJbml0aWFsaXplckNvbnN0cnVjdGlvbkNvbnRleHQKKyAgICA6IHB1YmxpYyBDb25zdHJ1Y3RvckluaXRpYWxpemVyQ29uc3RydWN0aW9uQ29udGV4dCB7CisgIGNvbnN0IENYWEJpbmRUZW1wb3JhcnlFeHByICpCVEU7CisKKyAgZnJpZW5kIGNsYXNzIENvbnN0cnVjdGlvbkNvbnRleHQ7IC8vIEFsbG93cyB0byBjcmVhdGU8PigpIGl0c2VsZi4KKworICBleHBsaWNpdCBDWFgxN0VsaWRlZENvcHlDb25zdHJ1Y3RvckluaXRpYWxpemVyQ29uc3RydWN0aW9uQ29udGV4dCgKKyAgICAgIGNvbnN0IENYWEN0b3JJbml0aWFsaXplciAqSSwgY29uc3QgQ1hYQmluZFRlbXBvcmFyeUV4cHIgKkJURSkKKyAgICAgIDogQ29uc3RydWN0b3JJbml0aWFsaXplckNvbnN0cnVjdGlvbkNvbnRleHQoCisgICAgICAgICAgICBDWFgxN0VsaWRlZENvcHlDb25zdHJ1Y3RvckluaXRpYWxpemVyS2luZCwgSSksCisgICAgICAgIEJURShCVEUpIHsKKyAgICBhc3NlcnQoQlRFKTsKKyAgfQorCitwdWJsaWM6CisgIGNvbnN0IENYWEJpbmRUZW1wb3JhcnlFeHByICpnZXRDWFhCaW5kVGVtcG9yYXJ5RXhwcigpIGNvbnN0IHsgcmV0dXJuIEJURTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ29uc3RydWN0aW9uQ29udGV4dCAqQ0MpIHsKKyAgICByZXR1cm4gQ0MtPmdldEtpbmQoKSA9PSBDWFgxN0VsaWRlZENvcHlDb25zdHJ1Y3RvckluaXRpYWxpemVyS2luZDsKKyAgfQorfTsKKworLy8vIFJlcHJlc2VudHMgaW1tZWRpYXRlIGluaXRpYWxpemF0aW9uIG9mIG1lbW9yeSBhbGxvY2F0ZWQgYnkgb3BlcmF0b3IgbmV3LAorLy8vIGVnLiBuZXcgVCgxMjMpOy4KK2NsYXNzIE5ld0FsbG9jYXRlZE9iamVjdENvbnN0cnVjdGlvbkNvbnRleHQgOiBwdWJsaWMgQ29uc3RydWN0aW9uQ29udGV4dCB7CisgIGNvbnN0IENYWE5ld0V4cHIgKk5FOworCisgIGZyaWVuZCBjbGFzcyBDb25zdHJ1Y3Rpb25Db250ZXh0OyAvLyBBbGxvd3MgdG8gY3JlYXRlPD4oKSBpdHNlbGYuCisKKyAgZXhwbGljaXQgTmV3QWxsb2NhdGVkT2JqZWN0Q29uc3RydWN0aW9uQ29udGV4dChjb25zdCBDWFhOZXdFeHByICpORSkKKyAgICAgIDogQ29uc3RydWN0aW9uQ29udGV4dChDb25zdHJ1Y3Rpb25Db250ZXh0OjpOZXdBbGxvY2F0ZWRPYmplY3RLaW5kKSwKKyAgICAgICAgTkUoTkUpIHsKKyAgICBhc3NlcnQoTkUpOworICB9CisKK3B1YmxpYzoKKyAgY29uc3QgQ1hYTmV3RXhwciAqZ2V0Q1hYTmV3RXhwcigpIGNvbnN0IHsgcmV0dXJuIE5FOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDb25zdHJ1Y3Rpb25Db250ZXh0ICpDQykgeworICAgIHJldHVybiBDQy0+Z2V0S2luZCgpID09IE5ld0FsbG9jYXRlZE9iamVjdEtpbmQ7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgdGVtcG9yYXJ5IG9iamVjdCwgZWcuIFQoMTIzKSwgdGhhdCBkb2VzIG5vdCBpbW1lZGlhdGVseSBjcm9zcworLy8vIGZ1bmN0aW9uIGJvdW5kYXJpZXMgImJ5IHZhbHVlIjsgY29uc3RydWN0b3JzIHRoYXQgY29uc3RydWN0IGZ1bmN0aW9uCisvLy8gdmFsdWUtdHlwZSBhcmd1bWVudHMgb3IgdmFsdWVzIHRoYXQgYXJlIGltbWVkaWF0ZWx5IHJldHVybmVkIGZyb20gdGhlCisvLy8gZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgdmFsdWUgcmVjZWl2ZSBzZXBhcmF0ZSBjb25zdHJ1Y3Rpb24gY29udGV4dCBraW5kcy4KK2NsYXNzIFRlbXBvcmFyeU9iamVjdENvbnN0cnVjdGlvbkNvbnRleHQgOiBwdWJsaWMgQ29uc3RydWN0aW9uQ29udGV4dCB7CisgIGNvbnN0IENYWEJpbmRUZW1wb3JhcnlFeHByICpCVEU7CisgIGNvbnN0IE1hdGVyaWFsaXplVGVtcG9yYXJ5RXhwciAqTVRFOworCisgIGZyaWVuZCBjbGFzcyBDb25zdHJ1Y3Rpb25Db250ZXh0OyAvLyBBbGxvd3MgdG8gY3JlYXRlPD4oKSBpdHNlbGYuCisKKyAgZXhwbGljaXQgVGVtcG9yYXJ5T2JqZWN0Q29uc3RydWN0aW9uQ29udGV4dCgKKyAgICAgIGNvbnN0IENYWEJpbmRUZW1wb3JhcnlFeHByICpCVEUsIGNvbnN0IE1hdGVyaWFsaXplVGVtcG9yYXJ5RXhwciAqTVRFKQorICAgICAgOiBDb25zdHJ1Y3Rpb25Db250ZXh0KENvbnN0cnVjdGlvbkNvbnRleHQ6OlRlbXBvcmFyeU9iamVjdEtpbmQpLAorICAgICAgICBCVEUoQlRFKSwgTVRFKE1URSkgeworICAgIC8vIEJvdGggQlRFIGFuZCBNVEUgY2FuIGJlIG51bGwgaGVyZSwgYWxsIGNvbWJpbmF0aW9ucyBwb3NzaWJsZS4KKyAgICAvLyBFdmVuIHRob3VnaCBmb3Igbm93IGF0IGxlYXN0IG9uZSBzaG91bGQgYmUgbm9uLW51bGwsIHdlIHNpbXBseSBoYXZlbid0CisgICAgLy8gaW1wbGVtZW50ZWQgdGhpcyBjYXNlIHlldCAodGhpcyB3b3VsZCBiZSBhIHRlbXBvcmFyeSBpbiB0aGUgbWlkZGxlIG9mCisgICAgLy8gbm93aGVyZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIG5vbi10cml2aWFsIGRlc3RydWN0b3IpLgorICB9CisKK3B1YmxpYzoKKyAgLy8vIENYWEJpbmRUZW1wb3JhcnlFeHByIGhlcmUgaXMgbm9uLW51bGwgYXMgbG9uZyBhcyB0aGUgdGVtcG9yYXJ5IGhhcworICAvLy8gYSBub24tdHJpdmlhbCBkZXN0cnVjdG9yLgorICBjb25zdCBDWFhCaW5kVGVtcG9yYXJ5RXhwciAqZ2V0Q1hYQmluZFRlbXBvcmFyeUV4cHIoKSBjb25zdCB7CisgICAgcmV0dXJuIEJURTsKKyAgfQorCisgIC8vLyBNYXRlcmlhbGl6ZVRlbXBvcmFyeUV4cHIgaXMgbm9uLW51bGwgYXMgbG9uZyBhcyB0aGUgdGVtcG9yYXJ5IGlzIGFjdHVhbGx5CisgIC8vLyB1c2VkIGFmdGVyIGNvbnN0cnVjdGlvbiwgZWcuIGJ5IGJpbmRpbmcgdG8gYSByZWZlcmVuY2UgKGxpZmV0aW1lCisgIC8vLyBleHRlbnNpb24pLCBhY2Nlc3NpbmcgYSBmaWVsZCwgY2FsbGluZyBhIG1ldGhvZCwgb3IgcGFzc2luZyBpdCBpbnRvCisgIC8vLyBhIGZ1bmN0aW9uIChhbiBlbGlkYWJsZSBjb3B5IG9yIG1vdmUgY29uc3RydWN0b3Igd291bGQgYmUgYSBjb21tb24KKyAgLy8vIGV4YW1wbGUpIGJ5IHJlZmVyZW5jZS4KKyAgY29uc3QgTWF0ZXJpYWxpemVUZW1wb3JhcnlFeHByICpnZXRNYXRlcmlhbGl6ZWRUZW1wb3JhcnlFeHByKCkgY29uc3QgeworICAgIHJldHVybiBNVEU7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0cnVjdGlvbkNvbnRleHQgKkNDKSB7CisgICAgcmV0dXJuIENDLT5nZXRLaW5kKCkgPT0gVGVtcG9yYXJ5T2JqZWN0S2luZDsKKyAgfQorfTsKKworY2xhc3MgUmV0dXJuZWRWYWx1ZUNvbnN0cnVjdGlvbkNvbnRleHQgOiBwdWJsaWMgQ29uc3RydWN0aW9uQ29udGV4dCB7CisgIGNvbnN0IFJldHVyblN0bXQgKlJTOworCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IFJldHVybmVkVmFsdWVDb25zdHJ1Y3Rpb25Db250ZXh0KENvbnN0cnVjdGlvbkNvbnRleHQ6OktpbmQgSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0dXJuU3RtdCAqUlMpCisgICAgICA6IENvbnN0cnVjdGlvbkNvbnRleHQoSyksIFJTKFJTKSB7CisgICAgYXNzZXJ0KGNsYXNzb2YodGhpcykpOworICAgIGFzc2VydChSUyk7CisgIH0KKworcHVibGljOgorICBjb25zdCBSZXR1cm5TdG10ICpnZXRSZXR1cm5TdG10KCkgY29uc3QgeyByZXR1cm4gUlM7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0cnVjdGlvbkNvbnRleHQgKkNDKSB7CisgICAgcmV0dXJuIENDLT5nZXRLaW5kKCkgPj0gUkVUVVJORURfVkFMVUVfQkVHSU4gJiYKKyAgICAgICAgICAgQ0MtPmdldEtpbmQoKSA8PSBSRVRVUk5FRF9WQUxVRV9FTkQ7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgdGVtcG9yYXJ5IG9iamVjdCB0aGF0IGlzIGJlaW5nIGltbWVkaWF0ZWx5IHJldHVybmVkIGZyb20gYQorLy8vIGZ1bmN0aW9uIGJ5IHZhbHVlLCBlZy4gcmV0dXJuIHQ7IG9yIHJldHVybiBUKDEyMyk7LiBJbiB0aGlzIGNhc2UgdGhlcmUgaXMKKy8vLyBhbHdheXMgZ29pbmcgdG8gYmUgYSBjb25zdHJ1Y3RvciBhdCB0aGUgcmV0dXJuIHNpdGUuIEhvd2V2ZXIsIHRoZSB1c3VhbAorLy8vIHRlbXBvcmFyeS1yZWxhdGVkIGJ1cmVhdWNyYWN5IChDWFhCaW5kVGVtcG9yYXJ5RXhwciwKKy8vLyBNYXRlcmlhbGl6ZVRlbXBvcmFyeUV4cHIpIGlzIG5vcm1hbGx5IGxvY2F0ZWQgaW4gdGhlIGNhbGxlciBmdW5jdGlvbidzIEFTVC4KK2NsYXNzIFNpbXBsZVJldHVybmVkVmFsdWVDb25zdHJ1Y3Rpb25Db250ZXh0CisgICAgOiBwdWJsaWMgUmV0dXJuZWRWYWx1ZUNvbnN0cnVjdGlvbkNvbnRleHQgeworICBmcmllbmQgY2xhc3MgQ29uc3RydWN0aW9uQ29udGV4dDsgLy8gQWxsb3dzIHRvIGNyZWF0ZTw+KCkgaXRzZWxmLgorCisgIGV4cGxpY2l0IFNpbXBsZVJldHVybmVkVmFsdWVDb25zdHJ1Y3Rpb25Db250ZXh0KGNvbnN0IFJldHVyblN0bXQgKlJTKQorICAgICAgOiBSZXR1cm5lZFZhbHVlQ29uc3RydWN0aW9uQ29udGV4dCgKKyAgICAgICAgICAgIENvbnN0cnVjdGlvbkNvbnRleHQ6OlNpbXBsZVJldHVybmVkVmFsdWVLaW5kLCBSUykge30KKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0cnVjdGlvbkNvbnRleHQgKkNDKSB7CisgICAgcmV0dXJuIENDLT5nZXRLaW5kKCkgPT0gU2ltcGxlUmV0dXJuZWRWYWx1ZUtpbmQ7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgdGVtcG9yYXJ5IG9iamVjdCB0aGF0IGlzIGJlaW5nIGltbWVkaWF0ZWx5IHJldHVybmVkIGZyb20gYQorLy8vIGZ1bmN0aW9uIGJ5IHZhbHVlLCBlZy4gcmV0dXJuIHQ7IG9yIHJldHVybiBUKDEyMyk7IGluIEMrKzE3LgorLy8vIEluIEMrKzE3IHRoZXJlIGlzIG5vdCBnb2luZyB0byBiZSBhbiBlbGlkYWJsZSBjb3B5IGNvbnN0cnVjdG9yIGF0IHRoZQorLy8vIHJldHVybiBzaXRlLiAgSG93ZXZlciwgdGhlIHVzdWFsIHRlbXBvcmFyeS1yZWxhdGVkIGJ1cmVhdWNyYWN5IChDWFhCaW5kVGVtcG9yYXJ5RXhwciwKKy8vLyBNYXRlcmlhbGl6ZVRlbXBvcmFyeUV4cHIpIGlzIG5vcm1hbGx5IGxvY2F0ZWQgaW4gdGhlIGNhbGxlciBmdW5jdGlvbidzIEFTVC4KKy8vLyBOb3RlIHRoYXQgaWYgdGhlIG9iamVjdCBoYXMgdHJpdmlhbCBkZXN0cnVjdG9yLCB0aGVuIHRoaXMgY29kZSBpcworLy8vIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBzaW1wbGUgcmV0dXJuZWQgdmFsdWUgY29uc3RydWN0b3Igb24gdGhlIEFTVCBsZXZlbDsKKy8vLyBpbiB0aGlzIGNhc2Ugd2UgcHJvdmlkZSBhIHNpbXBsZSByZXR1cm5lZCB2YWx1ZSBjb25zdHJ1Y3Rpb24gY29udGV4dC4KK2NsYXNzIENYWDE3RWxpZGVkQ29weVJldHVybmVkVmFsdWVDb25zdHJ1Y3Rpb25Db250ZXh0CisgICAgOiBwdWJsaWMgUmV0dXJuZWRWYWx1ZUNvbnN0cnVjdGlvbkNvbnRleHQgeworICBjb25zdCBDWFhCaW5kVGVtcG9yYXJ5RXhwciAqQlRFOworCisgIGZyaWVuZCBjbGFzcyBDb25zdHJ1Y3Rpb25Db250ZXh0OyAvLyBBbGxvd3MgdG8gY3JlYXRlPD4oKSBpdHNlbGYuCisKKyAgZXhwbGljaXQgQ1hYMTdFbGlkZWRDb3B5UmV0dXJuZWRWYWx1ZUNvbnN0cnVjdGlvbkNvbnRleHQoCisgICAgICBjb25zdCBSZXR1cm5TdG10ICpSUywgY29uc3QgQ1hYQmluZFRlbXBvcmFyeUV4cHIgKkJURSkKKyAgICAgIDogUmV0dXJuZWRWYWx1ZUNvbnN0cnVjdGlvbkNvbnRleHQoCisgICAgICAgICAgICBDb25zdHJ1Y3Rpb25Db250ZXh0OjpDWFgxN0VsaWRlZENvcHlSZXR1cm5lZFZhbHVlS2luZCwgUlMpLAorICAgICAgICBCVEUoQlRFKSB7CisgICAgYXNzZXJ0KEJURSk7CisgIH0KKworcHVibGljOgorICBjb25zdCBDWFhCaW5kVGVtcG9yYXJ5RXhwciAqZ2V0Q1hYQmluZFRlbXBvcmFyeUV4cHIoKSBjb25zdCB7IHJldHVybiBCVEU7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0cnVjdGlvbkNvbnRleHQgKkNDKSB7CisgICAgcmV0dXJuIENDLT5nZXRLaW5kKCkgPT0gQ1hYMTdFbGlkZWRDb3B5UmV0dXJuZWRWYWx1ZUtpbmQ7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19BTkFMWVNJU19DT05TVFJVQ1RJT05DT05URVhUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0RvbWFpblNwZWNpZmljL0NvY29hQ29udmVudGlvbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0RvbWFpblNwZWNpZmljL0NvY29hQ29udmVudGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjNmY2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvRG9tYWluU3BlY2lmaWMvQ29jb2FDb252ZW50aW9ucy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vPT09LSBDb2NvYUNvbnZlbnRpb25zLmggLSBTcGVjaWFsIGhhbmRsaW5nIG9mIENvY29hIGNvbnZlbnRpb25zIC0qLSBDKysgLSotLS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgY29jb2EgbmFtaW5nIGNvbnZlbnRpb24gYW5hbHlzaXMuIAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BTkFMWVNJU19ET01BSU5TUEVDSUZJQ19DT0NPQUNPTlZFTlRJT05TX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BTkFMWVNJU19ET01BSU5TUEVDSUZJQ19DT0NPQUNPTlZFTlRJT05TX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK2NsYXNzIEZ1bmN0aW9uRGVjbDsKK2NsYXNzIFF1YWxUeXBlOworICAKK25hbWVzcGFjZSBlbnRvIHsKK25hbWVzcGFjZSBjb2NvYSB7CisgIAorICBib29sIGlzUmVmVHlwZShRdWFsVHlwZSBSZXRUeSwgU3RyaW5nUmVmIFByZWZpeCwKKyAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUgPSBTdHJpbmdSZWYoKSk7CisgICAgCisgIGJvb2wgaXNDb2NvYU9iamVjdFJlZihRdWFsVHlwZSBUKTsKKworfQorCituYW1lc3BhY2UgY29yZUZvdW5kYXRpb24geworICBib29sIGlzQ0ZPYmplY3RSZWYoUXVhbFR5cGUgVCk7CisgIAorICBib29sIGZvbGxvd3NDcmVhdGVSdWxlKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQpOworfQorCit9fSAvLyBlbmQ6ICJjbGFuZzplbnRvIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0RvbWFpblNwZWNpZmljL09iakNOb1JldHVybi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvRG9tYWluU3BlY2lmaWMvT2JqQ05vUmV0dXJuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllODAwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0RvbWFpblNwZWNpZmljL09iakNOb1JldHVybi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vPSBPYmpDTm9SZXR1cm4uaCAtIEhhbmRsaW5nIG9mIENvY29hIEFQSXMga25vd24gbm90IHRvIHJldHVybiAtLSotIEMrKyAtKi0tLS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgc3BlY2lhbCBoYW5kbGluZyBvZiByZWNvZ25pemluZyBPYmpDIEFQSSBob29rcyB0aGF0CisvLyBkbyBub3QgcmV0dXJuIGJ1dCBhcmVuJ3QgbWFya2VkIGFzIHN1Y2ggaW4gQVBJIGhlYWRlcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FOQUxZU0lTX0RPTUFJTlNQRUNJRklDX09CSkNOT1JFVFVSTl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQU5BTFlTSVNfRE9NQUlOU1BFQ0lGSUNfT0JKQ05PUkVUVVJOX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0lkZW50aWZpZXJUYWJsZS5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBU1RDb250ZXh0OworY2xhc3MgT2JqQ01lc3NhZ2VFeHByOworICAKK2NsYXNzIE9iakNOb1JldHVybiB7CisgIC8vLyBDYWNoZWQgInJhaXNlIiBzZWxlY3Rvci4KKyAgU2VsZWN0b3IgUmFpc2VTZWw7CisKKyAgLy8vIENhY2hlZCBpZGVudGlmaWVyIGZvciAiTlNFeGNlcHRpb24iLgorICBJZGVudGlmaWVySW5mbyAqTlNFeGNlcHRpb25JSTsKKworICBlbnVtIHsgTlVNX1JBSVNFX1NFTEVDVE9SUyA9IDIgfTsKKworICAvLy8gQ2FjaGVkIHNldCBvZiBzZWxlY3RvcnMgaW4gTlNFeGNlcHRpb24gdGhhdCBhcmUgJ25vcmV0dXJuJy4KKyAgU2VsZWN0b3IgTlNFeGNlcHRpb25JbnN0YW5jZVJhaXNlU2VsZWN0b3JzW05VTV9SQUlTRV9TRUxFQ1RPUlNdOworCitwdWJsaWM6CisgIE9iakNOb1JldHVybihBU1RDb250ZXh0ICZDKTsKKyAgCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbWVzc2FnZSBleHByZXNzaW9uIGlzIGtub3duIHRvIG5ldmVyCisgIC8vLyByZXR1cm4uCisgIGJvb2wgaXNJbXBsaWNpdE5vUmV0dXJuKGNvbnN0IE9iakNNZXNzYWdlRXhwciAqTUUpOworfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9GbG93U2Vuc2l0aXZlL0RhdGFmbG93VmFsdWVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9GbG93U2Vuc2l0aXZlL0RhdGFmbG93VmFsdWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg2YjJiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0Zsb3dTZW5zaXRpdmUvRGF0YWZsb3dWYWx1ZXMuaApAQCAtMCwwICsxLDE3MiBAQAorLy89PT0tLS0gRGF0YWZsb3dWYWx1ZXMuaCAtIERhdGEgc3RydWN0dXJlIGZvciBkYXRhZmxvdyB2YWx1ZXMgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIHNrZWxldG9uIGRhdGEgc3RydWN0dXJlIGZvciBlbmNhcHN1bGF0aW5nIHRoZSBkYXRhZmxvdworLy8gdmFsdWVzIGZvciBhIENGRy4gIFR5cGljYWxseSB0aGlzIGlzIHN1YmNsYXNzZWQgdG8gcHJvdmlkZSBtZXRob2RzIGZvcgorLy8gY29tcHV0aW5nIHRoZXNlIHZhbHVlcyBmcm9tIGEgQ0ZHLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19BTkFMWVNFU19EQVRBRkxPV19WQUxVRVMKKyNkZWZpbmUgTExWTV9DTEFOR19BTkFMWVNFU19EQVRBRkxPV19WQUxVRVMKKworI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0NGRy5oIgorI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL1Byb2dyYW1Qb2ludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRGF0YWZsb3cgRGlyZWN0aW9uYWwgVGFnIENsYXNzZXMuICBUaGVzZSBhcmUgdXNlZCBmb3IgdGFnIGRpc3BhdGNoaW5nCisvLy8gIHdpdGhpbiB0aGUgZGF0YWZsb3cgc29sdmVyL3RyYW5zZmVyIGZ1bmN0aW9ucyB0byBkZXRlcm1pbmUgd2hhdCBkaXJlY3Rpb24KKy8vLyAgYSBkYXRhZmxvdyBhbmFseXNpcyBmbG93cy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgZGF0YWZsb3cgeworICBzdHJ1Y3QgZm9yd2FyZF9hbmFseXNpc190YWcge307CisgIHN0cnVjdCBiYWNrd2FyZF9hbmFseXNpc190YWcge307Cit9IC8vIGVuZCBuYW1lc3BhY2UgZGF0YWZsb3cKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBEYXRhZmxvd1ZhbHVlcy4gIENvbnRhaW5lciBjbGFzcyB0byBzdG9yZSBkYXRhZmxvdyB2YWx1ZXMgZm9yIGEgQ0ZHLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVHlwZXMsCisgICAgICAgICAgdHlwZW5hbWUgX0FuYWx5c2lzRGlyVGFnID0gZGF0YWZsb3c6OmZvcndhcmRfYW5hbHlzaXNfdGFnID4KK2NsYXNzIERhdGFmbG93VmFsdWVzIHsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVHlwZSBkZWNsYXJhdGlvbnMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgVmFsdWVUeXBlczo6VmFsVHkgICAgICAgICAgICAgICBWYWxUeTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBWYWx1ZVR5cGVzOjpBbmFseXNpc0RhdGFUeSAgICAgIEFuYWx5c2lzRGF0YVR5OworICB0eXBlZGVmIF9BbmFseXNpc0RpclRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbHlzaXNEaXJUYWc7CisgIHR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8UHJvZ3JhbVBvaW50LCBWYWxUeT4gICAgICBFZGdlRGF0YU1hcFR5OworICB0eXBlZGVmIGxsdm06OkRlbnNlTWFwPGNvbnN0IENGR0Jsb2NrKiwgVmFsVHk+ICAgQmxvY2tEYXRhTWFwVHk7CisgIHR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8Y29uc3QgU3RtdCosIFZhbFR5PiAgICAgICBTdG10RGF0YU1hcFR5OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBQcmVkaWNhdGVzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworcHVibGljOgorICAvLy8gaXNGb3J3YXJkQW5hbHlzaXMgLSBSZXR1cm5zIHRydWUgaWYgdGhlIGRhdGFmbG93IHZhbHVlcyBhcmUgY29tcHV0ZWQKKyAgLy8vICBmcm9tIGEgZm9yd2FyZCBhbmFseXNpcy4KKyAgYm9vbCBpc0ZvcndhcmRBbmFseXNpcygpIHsgcmV0dXJuIGlzRm9yd2FyZEFuYWx5c2lzKEFuYWx5c2lzRGlyVGFnKCkpOyB9CisKKyAgLy8vIGlzQmFja3dhcmRBbmFseXNpcyAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGF0YWZsb3cgdmFsdWVzIGFyZSBjb21wdXRlZAorICAvLy8gIGZyb20gYSBiYWNrd2FyZCBhbmFseXNpcy4KKyAgYm9vbCBpc0JhY2t3YXJkQW5hbHlzaXMoKSB7IHJldHVybiAhaXNGb3J3YXJkQW5hbHlzaXMoKTsgfQorCitwcml2YXRlOgorICBib29sIGlzRm9yd2FyZEFuYWx5c2lzKGRhdGFmbG93Ojpmb3J3YXJkX2FuYWx5c2lzX3RhZykgIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCBpc0ZvcndhcmRBbmFseXNpcyhkYXRhZmxvdzo6YmFja3dhcmRfYW5hbHlzaXNfdGFnKSB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbml0aWFsaXphdGlvbiBhbmQgYWNjZXNzb3JzIG1ldGhvZHMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitwdWJsaWM6CisgIERhdGFmbG93VmFsdWVzKCkgOiBTdG10RGF0YU1hcChOVUxMKSB7fQorICB+RGF0YWZsb3dWYWx1ZXMoKSB7IGRlbGV0ZSBTdG10RGF0YU1hcDsgfQorCisgIC8vLyBJbml0aWFsaXplVmFsdWVzIC0gSW52b2tlZCBieSB0aGUgc29sdmVyIHRvIGluaXRpYWxpemUgc3RhdGUgbmVlZGVkIGZvcgorICAvLy8gIGRhdGFmbG93IGFuYWx5c2lzLiAgVGhpcyBtZXRob2QgaXMgdXN1YWxseSBzcGVjaWFsaXplZCBieSBzdWJjbGFzc2VzLgorICB2b2lkIEluaXRpYWxpemVWYWx1ZXMoY29uc3QgQ0ZHJiBjZmcpIHt9CisKKworICAvLy8gZ2V0RWRnZURhdGEgLSBSZXRyaWV2ZXMgdGhlIGRhdGFmbG93IHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggYQorICAvLy8gIENGRyBlZGdlLgorICBWYWxUeSYgZ2V0RWRnZURhdGEoY29uc3QgQmxvY2tFZGdlICZFKSB7CisgICAgdHlwZW5hbWUgRWRnZURhdGFNYXBUeTo6aXRlcmF0b3IgSSA9IEVkZ2VEYXRhTWFwLmZpbmQoRSk7CisgICAgYXNzZXJ0IChJICE9IEVkZ2VEYXRhTWFwLmVuZCgpICYmICJObyBkYXRhIGFzc29jaWF0ZWQgd2l0aCBFZGdlLiIpOworICAgIHJldHVybiBJLT5zZWNvbmQ7CisgIH0KKworICBjb25zdCBWYWxUeSYgZ2V0RWRnZURhdGEoY29uc3QgQmxvY2tFZGdlICZFKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RGF0YWZsb3dWYWx1ZXMqPih0aGlzKS0+Z2V0RWRnZURhdGEoRSk7CisgIH0KKworICAvLy8gZ2V0QmxvY2tEYXRhIC0gUmV0cmlldmVzIHRoZSBkYXRhZmxvdyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEKKyAgLy8vICBzcGVjaWZpZWQgQ0ZHQmxvY2suICBJZiB0aGUgZGF0YWZsb3cgYW5hbHlzaXMgaXMgYSBmb3J3YXJkIGFuYWx5c2lzLAorICAvLy8gIHRoaXMgZGF0YSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEVORCBvZiB0aGUgYmxvY2suICBJZiB0aGUgYW5hbHlzaXMKKyAgLy8vICBpcyBhIGJhY2t3YXJkcyBhbmFseXNpcywgaXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBFTlRSWSBvZiB0aGUgYmxvY2suCisgIFZhbFR5JiBnZXRCbG9ja0RhdGEoY29uc3QgQ0ZHQmxvY2sgKkIpIHsKKyAgICB0eXBlbmFtZSBCbG9ja0RhdGFNYXBUeTo6aXRlcmF0b3IgSSA9IEJsb2NrRGF0YU1hcC5maW5kKEIpOworICAgIGFzc2VydCAoSSAhPSBCbG9ja0RhdGFNYXAuZW5kKCkgJiYgIk5vIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGJsb2NrLiIpOworICAgIHJldHVybiBJLT5zZWNvbmQ7CisgIH0KKworICBjb25zdCBWYWxUeSYgZ2V0QmxvY2tEYXRhKGNvbnN0IENGR0Jsb2NrICpCKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RGF0YWZsb3dWYWx1ZXMqPih0aGlzKS0+Z2V0QmxvY2tEYXRhKEIpOworICB9CisKKyAgLy8vIGdldFN0bXREYXRhIC0gUmV0cmlldmVzIHRoZSBkYXRhZmxvdyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEKKyAgLy8vICBzcGVjaWZpZWQgU3RtdC4gIElmIHRoZSBkYXRhZmxvdyBhbmFseXNpcyBpcyBhIGZvcndhcmQgYW5hbHlzaXMsCisgIC8vLyAgdGhpcyBkYXRhIGNvcnJlc3BvbmRzIHRvIHRoZSBwb2ludCBpbW1lZGlhdGVseSBiZWZvcmUgYSBTdG10LgorICAvLy8gIElmIHRoZSBhbmFseXNpcyBpcyBhIGJhY2t3YXJkcyBhbmFseXNpcywgaXQgaXMgYXNzb2NpYXRlZCB3aXRoCisgIC8vLyAgdGhlIHBvaW50IGFmdGVyIGEgU3RtdC4gIFRoaXMgZGF0YSBpcyBvbmx5IGNvbXB1dGVkIGZvciBibG9jay1sZXZlbAorICAvLy8gIGV4cHJlc3Npb25zLCBhbmQgb25seSB3aGVuIHJlcXVlc3RlZCB3aGVuIHRoZSBhbmFseXNpcyBpcyBleGVjdXRlZC4KKyAgVmFsVHkmIGdldFN0bXREYXRhKGNvbnN0IFN0bXQgKlMpIHsKKyAgICBhc3NlcnQgKFN0bXREYXRhTWFwICYmICJEYXRhZmxvdyB2YWx1ZXMgd2VyZSBub3QgY29tcHV0ZWQgZm9yIHN0YXRlbWVudHMuIik7CisgICAgdHlwZW5hbWUgU3RtdERhdGFNYXBUeTo6aXRlcmF0b3IgSSA9IFN0bXREYXRhTWFwLT5maW5kKFMpOworICAgIGFzc2VydCAoSSAhPSBTdG10RGF0YU1hcC0+ZW5kKCkgJiYgIk5vIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHN0YXRlbWVudC4iKTsKKyAgICByZXR1cm4gSS0+c2Vjb25kOworICB9CisKKyAgY29uc3QgVmFsVHkmIGdldFN0bXREYXRhKGNvbnN0IFN0bXQgKlMpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxEYXRhZmxvd1ZhbHVlcyo+KHRoaXMpLT5nZXRTdG10RGF0YShTKTsKKyAgfQorCisgIC8vLyBnZXRFZGdlRGF0YU1hcCAtIFJldHJpZXZlcyB0aGUgaW50ZXJuYWwgbWFwIGJldHdlZW4gQ0ZHIGVkZ2VzIGFuZAorICAvLy8gIGRhdGFmbG93IHZhbHVlcy4gIFVzdWFsbHkgdXNlZCBieSBhIGRhdGFmbG93IHNvbHZlciB0byBjb21wdXRlCisgIC8vLyAgdmFsdWVzIGZvciBibG9ja3MuCisgIEVkZ2VEYXRhTWFwVHkmIGdldEVkZ2VEYXRhTWFwKCkgeyByZXR1cm4gRWRnZURhdGFNYXA7IH0KKyAgY29uc3QgRWRnZURhdGFNYXBUeSYgZ2V0RWRnZURhdGFNYXAoKSBjb25zdCB7IHJldHVybiBFZGdlRGF0YU1hcDsgfQorCisgIC8vLyBnZXRCbG9ja0RhdGFNYXAgLSBSZXRyaWV2ZXMgdGhlIGludGVybmFsIG1hcCBiZXR3ZWVuIENGR0Jsb2NrcyBhbmQKKyAgLy8vIGRhdGFmbG93IHZhbHVlcy4gIElmIHRoZSBkYXRhZmxvdyBhbmFseXNpcyBvcGVyYXRlcyBpbiB0aGUgZm9yd2FyZAorICAvLy8gZGlyZWN0aW9uLCB0aGUgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRhdGFmbG93IHZhbHVlcyBhdCB0aGUgc3RhcnQKKyAgLy8vIG9mIHRoZSBibG9jay4gIE90aGVyd2lzZSwgZm9yIGEgYmFja3dhcmQgYW5hbHlzaXMsIHRoZSB2YWx1ZXMgY29ycmVwc29uZAorICAvLy8gdG8gdGhlIGRhdGFmbG93IHZhbHVlcyBhdCB0aGUgZW5kIG9mIHRoZSBibG9jay4KKyAgQmxvY2tEYXRhTWFwVHkmIGdldEJsb2NrRGF0YU1hcCgpIHsgcmV0dXJuIEJsb2NrRGF0YU1hcDsgfQorICBjb25zdCBCbG9ja0RhdGFNYXBUeSYgZ2V0QmxvY2tEYXRhTWFwKCkgY29uc3QgeyByZXR1cm4gQmxvY2tEYXRhTWFwOyB9CisKKyAgLy8vIGdldFN0bXREYXRhTWFwIC0gUmV0cmlldmVzIHRoZSBpbnRlcm5hbCBtYXAgYmV0d2VlbiBTdG10cyBhbmQKKyAgLy8vIGRhdGFmbG93IHZhbHVlcy4KKyAgU3RtdERhdGFNYXBUeSYgZ2V0U3RtdERhdGFNYXAoKSB7CisgICAgaWYgKCFTdG10RGF0YU1hcCkgU3RtdERhdGFNYXAgPSBuZXcgU3RtdERhdGFNYXBUeSgpOworICAgIHJldHVybiAqU3RtdERhdGFNYXA7CisgIH0KKworICBjb25zdCBTdG10RGF0YU1hcFR5JiBnZXRTdG10RGF0YU1hcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxEYXRhZmxvd1ZhbHVlcyo+KHRoaXMpLT5nZXRTdG10RGF0YU1hcCgpOworICB9CisKKyAgLy8vIGdldEFuYWx5c2lzRGF0YSAtIFJldHJpZXZlcyB0aGUgbWV0YSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhCisgIC8vLyAgZGF0YWZsb3cgYW5hbHlzaXMgZm9yIGFuYWx5emluZyBhIHBhcnRpY3VsYXIgQ0ZHLgorICAvLy8gIFRoaXMgaXMgdHlwaWNhbGx5IGNvbnN1bWVkIGJ5IHRyYW5zZmVyIGZ1bmN0aW9uIGNvZGUgKHZpYSB0aGUgc29sdmVyKS4KKyAgLy8vICBUaGlzIGNhbiBhbHNvIGJlIHVzZWQgYnkgc3ViY2xhc3NlcyB0byBpbnRlcnByZXQgdGhlIGRhdGFmbG93IHZhbHVlcy4KKyAgQW5hbHlzaXNEYXRhVHkmIGdldEFuYWx5c2lzRGF0YSgpIHsgcmV0dXJuIEFuYWx5c2lzRGF0YTsgfQorICBjb25zdCBBbmFseXNpc0RhdGFUeSYgZ2V0QW5hbHlzaXNEYXRhKCkgY29uc3QgeyByZXR1cm4gQW5hbHlzaXNEYXRhOyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEludGVybmFsIGRhdGEuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitwcm90ZWN0ZWQ6CisgIEVkZ2VEYXRhTWFwVHkgICAgICBFZGdlRGF0YU1hcDsKKyAgQmxvY2tEYXRhTWFwVHkgICAgIEJsb2NrRGF0YU1hcDsKKyAgU3RtdERhdGFNYXBUeSogICAgIFN0bXREYXRhTWFwOworICBBbmFseXNpc0RhdGFUeSAgICAgQW5hbHlzaXNEYXRhOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL1Byb2dyYW1Qb2ludC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvUHJvZ3JhbVBvaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiZDFiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL1Byb2dyYW1Qb2ludC5oCkBAIC0wLDAgKzEsNzU0IEBACisvLz09LSBQcm9ncmFtUG9pbnQuaCAtIFByb2dyYW0gUG9pbnRzIGZvciBQYXRoLVNlbnNpdGl2ZSBBbmFseXNpcyAtLSotIEMrKyAtKi0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIFByb2dyYW1Qb2ludCwgd2hpY2ggaWRlbnRpZmllcyBhCisvLyAgZGlzdGluY3QgbG9jYXRpb24gaW4gYSBmdW5jdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQU5BTFlTSVNfUFJPR1JBTVBPSU5UX0gKKyNkZWZpbmUgTExWTV9DTEFOR19BTkFMWVNJU19QUk9HUkFNUE9JTlRfSAorCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQW5hbHlzaXNEZWNsQ29udGV4dC5oIgorI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0NGRy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBbmFseXNpc0RlY2xDb250ZXh0OworY2xhc3MgRnVuY3Rpb25EZWNsOworY2xhc3MgTG9jYXRpb25Db250ZXh0OworICAKKy8vLyBQcm9ncmFtUG9pbnRzIGNhbiBiZSAidGFnZ2VkIiBhcyByZXByZXNlbnRpbmcgcG9pbnRzIHNwZWNpZmljIHRvIGEgZ2l2ZW4KKy8vLyBhbmFseXNpcyBlbnRpdHkuICBUYWdzIGFyZSBhYnN0cmFjdCBhbm5vdGF0aW9ucywgd2l0aCBhbiBhc3NvY2lhdGVkCisvLy8gZGVzY3JpcHRpb24gYW5kIHBvdGVudGlhbGx5IG90aGVyIGluZm9ybWF0aW9uLgorY2xhc3MgUHJvZ3JhbVBvaW50VGFnIHsKK3B1YmxpYzoKKyAgUHJvZ3JhbVBvaW50VGFnKHZvaWQgKnRhZ0tpbmQgPSBudWxscHRyKSA6IFRhZ0tpbmQodGFnS2luZCkge30KKyAgdmlydHVhbCB+UHJvZ3JhbVBvaW50VGFnKCk7CisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldFRhZ0Rlc2NyaXB0aW9uKCkgY29uc3QgPSAwOyAgICAKKworcHJvdGVjdGVkOgorICAvLy8gVXNlZCB0byBpbXBsZW1lbnQgJ2lzS2luZCcgaW4gc3ViY2xhc3Nlcy4KKyAgY29uc3Qgdm9pZCAqZ2V0VGFnS2luZCgpIHsgcmV0dXJuIFRhZ0tpbmQ7IH0KKyAgCitwcml2YXRlOgorICBjb25zdCB2b2lkICpUYWdLaW5kOworfTsKKworY2xhc3MgU2ltcGxlUHJvZ3JhbVBvaW50VGFnIDogcHVibGljIFByb2dyYW1Qb2ludFRhZyB7CisgIHN0ZDo6c3RyaW5nIERlc2M7CitwdWJsaWM6CisgIFNpbXBsZVByb2dyYW1Qb2ludFRhZyhTdHJpbmdSZWYgTXNnUHJvdmlkZXIsIFN0cmluZ1JlZiBNc2cpOworICBTdHJpbmdSZWYgZ2V0VGFnRGVzY3JpcHRpb24oKSBjb25zdCBvdmVycmlkZTsKK307CisKK2NsYXNzIFByb2dyYW1Qb2ludCB7CitwdWJsaWM6CisgIGVudW0gS2luZCB7IEJsb2NrRWRnZUtpbmQsCisgICAgICAgICAgICAgIEJsb2NrRW50cmFuY2VLaW5kLAorICAgICAgICAgICAgICBCbG9ja0V4aXRLaW5kLAorICAgICAgICAgICAgICBQcmVTdG10S2luZCwKKyAgICAgICAgICAgICAgUHJlU3RtdFB1cmdlRGVhZFN5bWJvbHNLaW5kLAorICAgICAgICAgICAgICBQb3N0U3RtdFB1cmdlRGVhZFN5bWJvbHNLaW5kLAorICAgICAgICAgICAgICBQb3N0U3RtdEtpbmQsCisgICAgICAgICAgICAgIFByZUxvYWRLaW5kLAorICAgICAgICAgICAgICBQb3N0TG9hZEtpbmQsCisgICAgICAgICAgICAgIFByZVN0b3JlS2luZCwKKyAgICAgICAgICAgICAgUG9zdFN0b3JlS2luZCwKKyAgICAgICAgICAgICAgUG9zdENvbmRpdGlvbktpbmQsCisgICAgICAgICAgICAgIFBvc3RMVmFsdWVLaW5kLAorICAgICAgICAgICAgICBQb3N0QWxsb2NhdG9yQ2FsbEtpbmQsCisgICAgICAgICAgICAgIE1pblBvc3RTdG10S2luZCA9IFBvc3RTdG10S2luZCwKKyAgICAgICAgICAgICAgTWF4UG9zdFN0bXRLaW5kID0gUG9zdEFsbG9jYXRvckNhbGxLaW5kLAorICAgICAgICAgICAgICBQb3N0SW5pdGlhbGl6ZXJLaW5kLAorICAgICAgICAgICAgICBDYWxsRW50ZXJLaW5kLAorICAgICAgICAgICAgICBDYWxsRXhpdEJlZ2luS2luZCwKKyAgICAgICAgICAgICAgQ2FsbEV4aXRFbmRLaW5kLAorICAgICAgICAgICAgICBQcmVJbXBsaWNpdENhbGxLaW5kLAorICAgICAgICAgICAgICBQb3N0SW1wbGljaXRDYWxsS2luZCwKKyAgICAgICAgICAgICAgTWluSW1wbGljaXRDYWxsS2luZCA9IFByZUltcGxpY2l0Q2FsbEtpbmQsCisgICAgICAgICAgICAgIE1heEltcGxpY2l0Q2FsbEtpbmQgPSBQb3N0SW1wbGljaXRDYWxsS2luZCwKKyAgICAgICAgICAgICAgTG9vcEV4aXRLaW5kLAorICAgICAgICAgICAgICBFcHNpbG9uS2luZH07CisKK3ByaXZhdGU6CisgIGNvbnN0IHZvaWQgKkRhdGExOworICBsbHZtOjpQb2ludGVySW50UGFpcjxjb25zdCB2b2lkICosIDIsIHVuc2lnbmVkPiBEYXRhMjsKKworICAvLyBUaGUgTG9jYXRpb25Db250ZXh0IGNvdWxkIGJlIE5VTEwgdG8gYWxsb3cgUHJvZ3JhbVBvaW50IHRvIGJlIHVzZWQgaW4KKyAgLy8gY29udGV4dCBpbnNlbnNpdGl2ZSBhbmFseXNpcy4KKyAgbGx2bTo6UG9pbnRlckludFBhaXI8Y29uc3QgTG9jYXRpb25Db250ZXh0ICosIDIsIHVuc2lnbmVkPiBMOworCisgIGxsdm06OlBvaW50ZXJJbnRQYWlyPGNvbnN0IFByb2dyYW1Qb2ludFRhZyAqLCAyLCB1bnNpZ25lZD4gVGFnOworCitwcm90ZWN0ZWQ6CisgIFByb2dyYW1Qb2ludCgpID0gZGVmYXVsdDsKKyAgUHJvZ3JhbVBvaW50KGNvbnN0IHZvaWQgKlAsCisgICAgICAgICAgICAgICBLaW5kIGssCisgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKmwsCisgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKnRhZyA9IG51bGxwdHIpCisgICAgOiBEYXRhMShQKSwKKyAgICAgIERhdGEyKG51bGxwdHIsICgoKHVuc2lnbmVkKSBrKSA+PiAwKSAmIDB4MyksCisgICAgICBMKGwsICgoKHVuc2lnbmVkKSBrKSA+PiAyKSAmIDB4MyksCisgICAgICBUYWcodGFnLCAoKCh1bnNpZ25lZCkgaykgPj4gNCkgJiAweDMpIHsKKyAgICAgICAgYXNzZXJ0KGdldEtpbmQoKSA9PSBrKTsKKyAgICAgICAgYXNzZXJ0KGdldExvY2F0aW9uQ29udGV4dCgpID09IGwpOworICAgICAgICBhc3NlcnQoZ2V0RGF0YTEoKSA9PSBQKTsKKyAgICAgIH0KKyAgICAgICAgCisgIFByb2dyYW1Qb2ludChjb25zdCB2b2lkICpQMSwKKyAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKlAyLAorICAgICAgICAgICAgICAgS2luZCBrLAorICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpsLAorICAgICAgICAgICAgICAgY29uc3QgUHJvZ3JhbVBvaW50VGFnICp0YWcgPSBudWxscHRyKQorICAgIDogRGF0YTEoUDEpLAorICAgICAgRGF0YTIoUDIsICgoKHVuc2lnbmVkKSBrKSA+PiAwKSAmIDB4MyksCisgICAgICBMKGwsICgoKHVuc2lnbmVkKSBrKSA+PiAyKSAmIDB4MyksCisgICAgICBUYWcodGFnLCAoKCh1bnNpZ25lZCkgaykgPj4gNCkgJiAweDMpIHt9CisKK3Byb3RlY3RlZDoKKyAgY29uc3Qgdm9pZCAqZ2V0RGF0YTEoKSBjb25zdCB7IHJldHVybiBEYXRhMTsgfQorICBjb25zdCB2b2lkICpnZXREYXRhMigpIGNvbnN0IHsgcmV0dXJuIERhdGEyLmdldFBvaW50ZXIoKTsgfQorICB2b2lkIHNldERhdGEyKGNvbnN0IHZvaWQgKmQpIHsgRGF0YTIuc2V0UG9pbnRlcihkKTsgfQorCitwdWJsaWM6CisgIC8vLyBDcmVhdGUgYSBuZXcgUHJvZ3JhbVBvaW50IG9iamVjdCB0aGF0IGlzIHRoZSBzYW1lIGFzIHRoZSBvcmlnaW5hbAorICAvLy8gZXhjZXB0IGZvciB1c2luZyB0aGUgc3BlY2lmaWVkIHRhZyB2YWx1ZS4KKyAgUHJvZ3JhbVBvaW50IHdpdGhUYWcoY29uc3QgUHJvZ3JhbVBvaW50VGFnICp0YWcpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJvZ3JhbVBvaW50KGdldERhdGExKCksIGdldERhdGEyKCksIGdldEtpbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uQ29udGV4dCgpLCB0YWcpOworICB9CisKKyAgLy8vIFxicmllZiBDb252ZXJ0IHRvIHRoZSBzcGVjaWZpZWQgUHJvZ3JhbVBvaW50IHR5cGUsIGFzc2VydGluZyB0aGF0IHRoaXMKKyAgLy8vIFByb2dyYW1Qb2ludCBpcyBvZiB0aGUgZGVzaXJlZCB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBUIGNhc3RBcygpIGNvbnN0IHsKKyAgICBhc3NlcnQoVDo6aXNLaW5kKCp0aGlzKSk7CisgICAgVCB0OworICAgIFByb2dyYW1Qb2ludCYgUFAgPSB0OworICAgIFBQID0gKnRoaXM7CisgICAgcmV0dXJuIHQ7CisgIH0KKworICAvLy8gXGJyaWVmIENvbnZlcnQgdG8gdGhlIHNwZWNpZmllZCBQcm9ncmFtUG9pbnQgdHlwZSwgcmV0dXJuaW5nIE5vbmUgaWYgdGhpcworICAvLy8gUHJvZ3JhbVBvaW50IGlzIG5vdCBvZiB0aGUgZGVzaXJlZCB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBPcHRpb25hbDxUPiBnZXRBcygpIGNvbnN0IHsKKyAgICBpZiAoIVQ6OmlzS2luZCgqdGhpcykpCisgICAgICByZXR1cm4gTm9uZTsKKyAgICBUIHQ7CisgICAgUHJvZ3JhbVBvaW50JiBQUCA9IHQ7CisgICAgUFAgPSAqdGhpczsKKyAgICByZXR1cm4gdDsKKyAgfQorCisgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCB4ID0gVGFnLmdldEludCgpOworICAgIHggPDw9IDI7CisgICAgeCB8PSBMLmdldEludCgpOworICAgIHggPDw9IDI7CisgICAgeCB8PSBEYXRhMi5nZXRJbnQoKTsKKyAgICByZXR1cm4gKEtpbmQpIHg7CisgIH0KKworICAvLy8gXGJyaWVmIElzIHRoaXMgYSBwcm9ncmFtIHBvaW50IGNvcnJlc3BvbmRpbmcgdG8gcHVyZ2UvcmVtb3ZhbCBvZiBkZWFkCisgIC8vLyBzeW1ib2xzIGFuZCBiaW5kaW5ncy4KKyAgYm9vbCBpc1B1cmdlS2luZCgpIHsKKyAgICBLaW5kIEsgPSBnZXRLaW5kKCk7CisgICAgcmV0dXJuIChLID09IFBvc3RTdG10UHVyZ2VEZWFkU3ltYm9sc0tpbmQgfHwKKyAgICAgICAgICAgIEsgPT0gUHJlU3RtdFB1cmdlRGVhZFN5bWJvbHNLaW5kKTsKKyAgfQorCisgIGNvbnN0IFByb2dyYW1Qb2ludFRhZyAqZ2V0VGFnKCkgY29uc3QgeyByZXR1cm4gVGFnLmdldFBvaW50ZXIoKTsgfQorCisgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqZ2V0TG9jYXRpb25Db250ZXh0KCkgY29uc3QgeworICAgIHJldHVybiBMLmdldFBvaW50ZXIoKTsKKyAgfQorCisgIC8vIEZvciB1c2Ugd2l0aCBEZW5zZU1hcC4gIFRoaXMgaGFzaCBpcyBwcm9iYWJseSBzbG93LgorICB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoKSBjb25zdCB7CisgICAgbGx2bTo6Rm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgICBQcm9maWxlKElEKTsKKyAgICByZXR1cm4gSUQuQ29tcHV0ZUhhc2goKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQcm9ncmFtUG9pbnQgJiBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRGF0YTEgPT0gUkhTLkRhdGExICYmCisgICAgICAgICAgIERhdGEyID09IFJIUy5EYXRhMiAmJgorICAgICAgICAgICBMID09IFJIUy5MICYmCisgICAgICAgICAgIFRhZyA9PSBSSFMuVGFnOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFByb2dyYW1Qb2ludCAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIERhdGExICE9IFJIUy5EYXRhMSB8fAorICAgICAgICAgICBEYXRhMiAhPSBSSFMuRGF0YTIgfHwKKyAgICAgICAgICAgTCAhPSBSSFMuTCB8fAorICAgICAgICAgICBUYWcgIT0gUkhTLlRhZzsKKyAgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgY29uc3QgeworICAgIElELkFkZEludGVnZXIoKHVuc2lnbmVkKSBnZXRLaW5kKCkpOworICAgIElELkFkZFBvaW50ZXIoZ2V0RGF0YTEoKSk7CisgICAgSUQuQWRkUG9pbnRlcihnZXREYXRhMigpKTsKKyAgICBJRC5BZGRQb2ludGVyKGdldExvY2F0aW9uQ29udGV4dCgpKTsKKyAgICBJRC5BZGRQb2ludGVyKGdldFRhZygpKTsKKyAgfQorCisgIHN0YXRpYyBQcm9ncmFtUG9pbnQgZ2V0UHJvZ3JhbVBvaW50KGNvbnN0IFN0bXQgKlMsIFByb2dyYW1Qb2ludDo6S2luZCBLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKnRhZyk7Cit9OworCitjbGFzcyBCbG9ja0VudHJhbmNlIDogcHVibGljIFByb2dyYW1Qb2ludCB7CitwdWJsaWM6CisgIEJsb2NrRW50cmFuY2UoY29uc3QgQ0ZHQmxvY2sgKkIsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTCwKKyAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKnRhZyA9IG51bGxwdHIpCisgICAgOiBQcm9ncmFtUG9pbnQoQiwgQmxvY2tFbnRyYW5jZUtpbmQsIEwsIHRhZykgeyAgICAKKyAgICBhc3NlcnQoQiAmJiAiQmxvY2tFbnRyYW5jZSByZXF1aXJlcyBub24tbnVsbCBibG9jayIpOworICB9CisKKyAgY29uc3QgQ0ZHQmxvY2sgKmdldEJsb2NrKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IENGR0Jsb2NrKj4oZ2V0RGF0YTEoKSk7CisgIH0KKworICBPcHRpb25hbDxDRkdFbGVtZW50PiBnZXRGaXJzdEVsZW1lbnQoKSBjb25zdCB7CisgICAgY29uc3QgQ0ZHQmxvY2sgKkIgPSBnZXRCbG9jaygpOworICAgIHJldHVybiBCLT5lbXB0eSgpID8gT3B0aW9uYWw8Q0ZHRWxlbWVudD4oKSA6IEItPmZyb250KCk7CisgIH0KKyAgCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgUHJvZ3JhbVBvaW50OworICBCbG9ja0VudHJhbmNlKCkgPSBkZWZhdWx0OworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgUHJvZ3JhbVBvaW50ICZMb2NhdGlvbikgeworICAgIHJldHVybiBMb2NhdGlvbi5nZXRLaW5kKCkgPT0gQmxvY2tFbnRyYW5jZUtpbmQ7CisgIH0KK307CisKK2NsYXNzIEJsb2NrRXhpdCA6IHB1YmxpYyBQcm9ncmFtUG9pbnQgeworcHVibGljOgorICBCbG9ja0V4aXQoY29uc3QgQ0ZHQmxvY2sgKkIsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTCkKKyAgICA6IFByb2dyYW1Qb2ludChCLCBCbG9ja0V4aXRLaW5kLCBMKSB7fQorCisgIGNvbnN0IENGR0Jsb2NrICpnZXRCbG9jaygpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDRkdCbG9jayo+KGdldERhdGExKCkpOworICB9CisKKyAgY29uc3QgU3RtdCAqZ2V0VGVybWluYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QmxvY2soKS0+Z2V0VGVybWluYXRvcigpOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBQcm9ncmFtUG9pbnQ7CisgIEJsb2NrRXhpdCgpID0gZGVmYXVsdDsKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IFByb2dyYW1Qb2ludCAmTG9jYXRpb24pIHsKKyAgICByZXR1cm4gTG9jYXRpb24uZ2V0S2luZCgpID09IEJsb2NrRXhpdEtpbmQ7CisgIH0KK307CisKK2NsYXNzIFN0bXRQb2ludCA6IHB1YmxpYyBQcm9ncmFtUG9pbnQgeworcHVibGljOgorICBTdG10UG9pbnQoY29uc3QgU3RtdCAqUywgY29uc3Qgdm9pZCAqcDIsIEtpbmQgaywgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMLAorICAgICAgICAgICAgY29uc3QgUHJvZ3JhbVBvaW50VGFnICp0YWcpCisgICAgOiBQcm9ncmFtUG9pbnQoUywgcDIsIGssIEwsIHRhZykgeworICAgIGFzc2VydChTKTsKKyAgfQorCisgIGNvbnN0IFN0bXQgKmdldFN0bXQoKSBjb25zdCB7IHJldHVybiAoY29uc3QgU3RtdCopIGdldERhdGExKCk7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgY29uc3QgVCogZ2V0U3RtdEFzKCkgY29uc3QgeyByZXR1cm4gZHluX2Nhc3Q8VD4oZ2V0U3RtdCgpKTsgfQorCitwcm90ZWN0ZWQ6CisgIFN0bXRQb2ludCgpID0gZGVmYXVsdDsKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBQcm9ncmFtUG9pbnQ7CisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBQcm9ncmFtUG9pbnQgJkxvY2F0aW9uKSB7CisgICAgdW5zaWduZWQgayA9IExvY2F0aW9uLmdldEtpbmQoKTsKKyAgICByZXR1cm4gayA+PSBQcmVTdG10S2luZCAmJiBrIDw9IE1heFBvc3RTdG10S2luZDsKKyAgfQorfTsKKworCitjbGFzcyBQcmVTdG10IDogcHVibGljIFN0bXRQb2ludCB7CitwdWJsaWM6CisgIFByZVN0bXQoY29uc3QgU3RtdCAqUywgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMLCBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKnRhZywKKyAgICAgICAgICBjb25zdCBTdG10ICpTdWJTdG10ID0gbnVsbHB0cikKKyAgICA6IFN0bXRQb2ludChTLCBTdWJTdG10LCBQcmVTdG10S2luZCwgTCwgdGFnKSB7fQorCisgIGNvbnN0IFN0bXQgKmdldFN1YlN0bXQoKSBjb25zdCB7IHJldHVybiAoY29uc3QgU3RtdCopIGdldERhdGEyKCk7IH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFByb2dyYW1Qb2ludDsKKyAgUHJlU3RtdCgpID0gZGVmYXVsdDsKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IFByb2dyYW1Qb2ludCAmTG9jYXRpb24pIHsKKyAgICByZXR1cm4gTG9jYXRpb24uZ2V0S2luZCgpID09IFByZVN0bXRLaW5kOworICB9Cit9OworCitjbGFzcyBQb3N0U3RtdCA6IHB1YmxpYyBTdG10UG9pbnQgeworcHJvdGVjdGVkOgorICBQb3N0U3RtdCgpID0gZGVmYXVsdDsKKyAgUG9zdFN0bXQoY29uc3QgU3RtdCAqUywgY29uc3Qgdm9pZCAqZGF0YSwgS2luZCBrLCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkwsCisgICAgICAgICAgIGNvbnN0IFByb2dyYW1Qb2ludFRhZyAqdGFnID0gbnVsbHB0cikKKyAgICA6IFN0bXRQb2ludChTLCBkYXRhLCBrLCBMLCB0YWcpIHt9CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgUG9zdFN0bXQoY29uc3QgU3RtdCAqUywgS2luZCBrLCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkwsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2dyYW1Qb2ludFRhZyAqdGFnID0gbnVsbHB0cikKKyAgICA6IFN0bXRQb2ludChTLCBudWxscHRyLCBrLCBMLCB0YWcpIHt9CisKKyAgZXhwbGljaXQgUG9zdFN0bXQoY29uc3QgU3RtdCAqUywgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKnRhZyA9IG51bGxwdHIpCisgICAgOiBTdG10UG9pbnQoUywgbnVsbHB0ciwgUG9zdFN0bXRLaW5kLCBMLCB0YWcpIHt9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBQcm9ncmFtUG9pbnQ7CisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBQcm9ncmFtUG9pbnQgJkxvY2F0aW9uKSB7CisgICAgdW5zaWduZWQgayA9IExvY2F0aW9uLmdldEtpbmQoKTsKKyAgICByZXR1cm4gayA+PSBNaW5Qb3N0U3RtdEtpbmQgJiYgayA8PSBNYXhQb3N0U3RtdEtpbmQ7CisgIH0KK307CisKKy8vIFBvc3RDb25kaXRpb24gcmVwcmVzZW50cyB0aGUgcG9zdCBwcm9ncmFtIHBvaW50IG9mIGEgYnJhbmNoIGNvbmRpdGlvbi4KK2NsYXNzIFBvc3RDb25kaXRpb24gOiBwdWJsaWMgUG9zdFN0bXQgeworcHVibGljOgorICBQb3N0Q29uZGl0aW9uKGNvbnN0IFN0bXQgKlMsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTCwKKyAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKnRhZyA9IG51bGxwdHIpCisgICAgOiBQb3N0U3RtdChTLCBQb3N0Q29uZGl0aW9uS2luZCwgTCwgdGFnKSB7fQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgUHJvZ3JhbVBvaW50OworICBQb3N0Q29uZGl0aW9uKCkgPSBkZWZhdWx0OworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgUHJvZ3JhbVBvaW50ICZMb2NhdGlvbikgeworICAgIHJldHVybiBMb2NhdGlvbi5nZXRLaW5kKCkgPT0gUG9zdENvbmRpdGlvbktpbmQ7CisgIH0KK307CisKK2NsYXNzIExvY2F0aW9uQ2hlY2sgOiBwdWJsaWMgU3RtdFBvaW50IHsKK3Byb3RlY3RlZDoKKyAgTG9jYXRpb25DaGVjaygpID0gZGVmYXVsdDsKKyAgTG9jYXRpb25DaGVjayhjb25zdCBTdG10ICpTLCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkwsCisgICAgICAgICAgICAgICAgUHJvZ3JhbVBvaW50OjpLaW5kIEssIGNvbnN0IFByb2dyYW1Qb2ludFRhZyAqdGFnKQorICAgIDogU3RtdFBvaW50KFMsIG51bGxwdHIsIEssIEwsIHRhZykge30KKyAgICAKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBQcm9ncmFtUG9pbnQ7CisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBQcm9ncmFtUG9pbnQgJmxvY2F0aW9uKSB7CisgICAgdW5zaWduZWQgayA9IGxvY2F0aW9uLmdldEtpbmQoKTsKKyAgICByZXR1cm4gayA9PSBQcmVMb2FkS2luZCB8fCBrID09IFByZVN0b3JlS2luZDsKKyAgfQorfTsKKyAgCitjbGFzcyBQcmVMb2FkIDogcHVibGljIExvY2F0aW9uQ2hlY2sgeworcHVibGljOgorICBQcmVMb2FkKGNvbnN0IFN0bXQgKlMsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTCwKKyAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKnRhZyA9IG51bGxwdHIpCisgICAgOiBMb2NhdGlvbkNoZWNrKFMsIEwsIFByZUxvYWRLaW5kLCB0YWcpIHt9CisgIAorcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFByb2dyYW1Qb2ludDsKKyAgUHJlTG9hZCgpID0gZGVmYXVsdDsKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IFByb2dyYW1Qb2ludCAmbG9jYXRpb24pIHsKKyAgICByZXR1cm4gbG9jYXRpb24uZ2V0S2luZCgpID09IFByZUxvYWRLaW5kOworICB9Cit9OworCitjbGFzcyBQcmVTdG9yZSA6IHB1YmxpYyBMb2NhdGlvbkNoZWNrIHsKK3B1YmxpYzoKKyAgUHJlU3RvcmUoY29uc3QgU3RtdCAqUywgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMLAorICAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKnRhZyA9IG51bGxwdHIpCisgIDogTG9jYXRpb25DaGVjayhTLCBMLCBQcmVTdG9yZUtpbmQsIHRhZykge30KKyAgCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgUHJvZ3JhbVBvaW50OworICBQcmVTdG9yZSgpID0gZGVmYXVsdDsKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IFByb2dyYW1Qb2ludCAmbG9jYXRpb24pIHsKKyAgICByZXR1cm4gbG9jYXRpb24uZ2V0S2luZCgpID09IFByZVN0b3JlS2luZDsKKyAgfQorfTsKKworY2xhc3MgUG9zdExvYWQgOiBwdWJsaWMgUG9zdFN0bXQgeworcHVibGljOgorICBQb3N0TG9hZChjb25zdCBTdG10ICpTLCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkwsCisgICAgICAgICAgIGNvbnN0IFByb2dyYW1Qb2ludFRhZyAqdGFnID0gbnVsbHB0cikKKyAgICA6IFBvc3RTdG10KFMsIFBvc3RMb2FkS2luZCwgTCwgdGFnKSB7fQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgUHJvZ3JhbVBvaW50OworICBQb3N0TG9hZCgpID0gZGVmYXVsdDsKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IFByb2dyYW1Qb2ludCAmTG9jYXRpb24pIHsKKyAgICByZXR1cm4gTG9jYXRpb24uZ2V0S2luZCgpID09IFBvc3RMb2FkS2luZDsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgcHJvZ3JhbSBwb2ludCBhZnRlciBhIHN0b3JlIGV2YWx1YXRpb24uCitjbGFzcyBQb3N0U3RvcmUgOiBwdWJsaWMgUG9zdFN0bXQgeworcHVibGljOgorICAvLy8gQ29uc3RydWN0IHRoZSBwb3N0IHN0b3JlIHBvaW50LgorICAvLy8gXHBhcmFtIExvYyBjYW4gYmUgdXNlZCB0byBzdG9yZSB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uIAorICAvLy8gdXNlZCBpbiB0aGUgZm9ybSBpdCB3YXMgdXR0ZXJlZCBpbiB0aGUgY29kZS4KKyAgUG9zdFN0b3JlKGNvbnN0IFN0bXQgKlMsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTCwgY29uc3Qgdm9pZCAqTG9jLAorICAgICAgICAgICAgY29uc3QgUHJvZ3JhbVBvaW50VGFnICp0YWcgPSBudWxscHRyKQorICAgIDogUG9zdFN0bXQoUywgUG9zdFN0b3JlS2luZCwgTCwgdGFnKSB7CisgICAgYXNzZXJ0KGdldERhdGEyKCkgPT0gbnVsbHB0cik7CisgICAgc2V0RGF0YTIoTG9jKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uIHVzZWQgaW4gdGhlIHN0b3JlLAorICAvLy8gaG93IGl0IHdhcyB1dHRlcmVkIGluIHRoZSBjb2RlLgorICBjb25zdCB2b2lkICpnZXRMb2NhdGlvblZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBnZXREYXRhMigpOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBQcm9ncmFtUG9pbnQ7CisgIFBvc3RTdG9yZSgpID0gZGVmYXVsdDsKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IFByb2dyYW1Qb2ludCAmTG9jYXRpb24pIHsKKyAgICByZXR1cm4gTG9jYXRpb24uZ2V0S2luZCgpID09IFBvc3RTdG9yZUtpbmQ7CisgIH0KK307CisKK2NsYXNzIFBvc3RMVmFsdWUgOiBwdWJsaWMgUG9zdFN0bXQgeworcHVibGljOgorICBQb3N0TFZhbHVlKGNvbnN0IFN0bXQgKlMsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTCwKKyAgICAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKnRhZyA9IG51bGxwdHIpCisgICAgOiBQb3N0U3RtdChTLCBQb3N0TFZhbHVlS2luZCwgTCwgdGFnKSB7fQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgUHJvZ3JhbVBvaW50OworICBQb3N0TFZhbHVlKCkgPSBkZWZhdWx0OworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgUHJvZ3JhbVBvaW50ICZMb2NhdGlvbikgeworICAgIHJldHVybiBMb2NhdGlvbi5nZXRLaW5kKCkgPT0gUG9zdExWYWx1ZUtpbmQ7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgcG9pbnQgYWZ0ZXIgd2UgcmFuIHJlbW92ZSBkZWFkIGJpbmRpbmdzIEJFRk9SRQorLy8vIHByb2Nlc3NpbmcgdGhlIGdpdmVuIHN0YXRlbWVudC4KK2NsYXNzIFByZVN0bXRQdXJnZURlYWRTeW1ib2xzIDogcHVibGljIFN0bXRQb2ludCB7CitwdWJsaWM6CisgIFByZVN0bXRQdXJnZURlYWRTeW1ib2xzKGNvbnN0IFN0bXQgKlMsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZ3JhbVBvaW50VGFnICp0YWcgPSBudWxscHRyKQorICAgIDogU3RtdFBvaW50KFMsIG51bGxwdHIsIFByZVN0bXRQdXJnZURlYWRTeW1ib2xzS2luZCwgTCwgdGFnKSB7IH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFByb2dyYW1Qb2ludDsKKyAgUHJlU3RtdFB1cmdlRGVhZFN5bWJvbHMoKSA9IGRlZmF1bHQ7CisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBQcm9ncmFtUG9pbnQgJkxvY2F0aW9uKSB7CisgICAgcmV0dXJuIExvY2F0aW9uLmdldEtpbmQoKSA9PSBQcmVTdG10UHVyZ2VEZWFkU3ltYm9sc0tpbmQ7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgcG9pbnQgYWZ0ZXIgd2UgcmFuIHJlbW92ZSBkZWFkIGJpbmRpbmdzIEFGVEVSCisvLy8gcHJvY2Vzc2luZyB0aGUgIGdpdmVuIHN0YXRlbWVudC4KK2NsYXNzIFBvc3RTdG10UHVyZ2VEZWFkU3ltYm9scyA6IHB1YmxpYyBTdG10UG9pbnQgeworcHVibGljOgorICBQb3N0U3RtdFB1cmdlRGVhZFN5bWJvbHMoY29uc3QgU3RtdCAqUywgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKnRhZyA9IG51bGxwdHIpCisgICAgOiBTdG10UG9pbnQoUywgbnVsbHB0ciwgUG9zdFN0bXRQdXJnZURlYWRTeW1ib2xzS2luZCwgTCwgdGFnKSB7IH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFByb2dyYW1Qb2ludDsKKyAgUG9zdFN0bXRQdXJnZURlYWRTeW1ib2xzKCkgPSBkZWZhdWx0OworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgUHJvZ3JhbVBvaW50ICZMb2NhdGlvbikgeworICAgIHJldHVybiBMb2NhdGlvbi5nZXRLaW5kKCkgPT0gUG9zdFN0bXRQdXJnZURlYWRTeW1ib2xzS2luZDsKKyAgfQorfTsKKworY2xhc3MgQmxvY2tFZGdlIDogcHVibGljIFByb2dyYW1Qb2ludCB7CitwdWJsaWM6CisgIEJsb2NrRWRnZShjb25zdCBDRkdCbG9jayAqQjEsIGNvbnN0IENGR0Jsb2NrICpCMiwgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMKQorICAgIDogUHJvZ3JhbVBvaW50KEIxLCBCMiwgQmxvY2tFZGdlS2luZCwgTCkgeworICAgIGFzc2VydChCMSAmJiAiQmxvY2tFZGdlOiBzb3VyY2UgYmxvY2sgbXVzdCBiZSBub24tbnVsbCIpOworICAgIGFzc2VydChCMiAmJiAiQmxvY2tFZGdlOiBkZXN0aW5hdGlvbiBibG9jayBtdXN0IGJlIG5vbi1udWxsIik7ICAgIAorICB9CisKKyAgY29uc3QgQ0ZHQmxvY2sgKmdldFNyYygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgQ0ZHQmxvY2sqPihnZXREYXRhMSgpKTsKKyAgfQorCisgIGNvbnN0IENGR0Jsb2NrICpnZXREc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IENGR0Jsb2NrKj4oZ2V0RGF0YTIoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFByb2dyYW1Qb2ludDsKKyAgQmxvY2tFZGdlKCkgPSBkZWZhdWx0OworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgUHJvZ3JhbVBvaW50ICZMb2NhdGlvbikgeworICAgIHJldHVybiBMb2NhdGlvbi5nZXRLaW5kKCkgPT0gQmxvY2tFZGdlS2luZDsKKyAgfQorfTsKKworY2xhc3MgUG9zdEluaXRpYWxpemVyIDogcHVibGljIFByb2dyYW1Qb2ludCB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgUG9zdEluaXRpYWxpemVyIHBvaW50IHRoYXQgcmVwcmVzZW50cyBhIGxvY2F0aW9uIGFmdGVyCisgIC8vLyAgIENYWEN0b3JJbml0aWFsaXplciBleHByZXNzaW9uIGV2YWx1YXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIEkgVGhlIGluaXRpYWxpemVyLgorICAvLy8gXHBhcmFtIExvYyBUaGUgbG9jYXRpb24gb2YgdGhlIGZpZWxkIGJlaW5nIGluaXRpYWxpemVkLgorICBQb3N0SW5pdGlhbGl6ZXIoY29uc3QgQ1hYQ3RvckluaXRpYWxpemVyICpJLAorICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqTG9jLAorICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMKQorICAgIDogUHJvZ3JhbVBvaW50KEksIExvYywgUG9zdEluaXRpYWxpemVyS2luZCwgTCkge30KKworICBjb25zdCBDWFhDdG9ySW5pdGlhbGl6ZXIgKmdldEluaXRpYWxpemVyKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBDWFhDdG9ySW5pdGlhbGl6ZXIgKj4oZ2V0RGF0YTEoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaWVsZC4KKyAgY29uc3Qgdm9pZCAqZ2V0TG9jYXRpb25WYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RGF0YTIoKTsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgUHJvZ3JhbVBvaW50OworICBQb3N0SW5pdGlhbGl6ZXIoKSA9IGRlZmF1bHQ7CisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBQcm9ncmFtUG9pbnQgJkxvY2F0aW9uKSB7CisgICAgcmV0dXJuIExvY2F0aW9uLmdldEtpbmQoKSA9PSBQb3N0SW5pdGlhbGl6ZXJLaW5kOworICB9Cit9OworCisvLy8gUmVwcmVzZW50cyBhbiBpbXBsaWNpdCBjYWxsIGV2ZW50LgorLy8vCisvLy8gVGhlIG5lYXJlc3Qgc3RhdGVtZW50IGlzIHByb3ZpZGVkIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzLgorY2xhc3MgSW1wbGljaXRDYWxsUG9pbnQgOiBwdWJsaWMgUHJvZ3JhbVBvaW50IHsKK3B1YmxpYzoKKyAgSW1wbGljaXRDYWxsUG9pbnQoY29uc3QgRGVjbCAqRCwgU291cmNlTG9jYXRpb24gTG9jLCBLaW5kIEssCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTCwgY29uc3QgUHJvZ3JhbVBvaW50VGFnICpUYWcpCisgICAgOiBQcm9ncmFtUG9pbnQoTG9jLmdldFB0ckVuY29kaW5nKCksIEQsIEssIEwsIFRhZykge30KKworICBjb25zdCBEZWNsICpnZXREZWNsKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgRGVjbCAqPihnZXREYXRhMigpKTsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NhdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZyb21QdHJFbmNvZGluZyhnZXREYXRhMSgpKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIEltcGxpY2l0Q2FsbFBvaW50KCkgPSBkZWZhdWx0OworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFByb2dyYW1Qb2ludDsKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IFByb2dyYW1Qb2ludCAmTG9jYXRpb24pIHsKKyAgICByZXR1cm4gTG9jYXRpb24uZ2V0S2luZCgpID49IE1pbkltcGxpY2l0Q2FsbEtpbmQgJiYKKyAgICAgICAgICAgTG9jYXRpb24uZ2V0S2luZCgpIDw9IE1heEltcGxpY2l0Q2FsbEtpbmQ7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgcHJvZ3JhbSBwb2ludCBqdXN0IGJlZm9yZSBhbiBpbXBsaWNpdCBjYWxsIGV2ZW50LgorLy8vCisvLy8gRXhwbGljaXQgY2FsbHMgd2lsbCBhcHBlYXIgYXMgUHJlU3RtdCBwcm9ncmFtIHBvaW50cy4KK2NsYXNzIFByZUltcGxpY2l0Q2FsbCA6IHB1YmxpYyBJbXBsaWNpdENhbGxQb2ludCB7CitwdWJsaWM6CisgIFByZUltcGxpY2l0Q2FsbChjb25zdCBEZWNsICpELCBTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2dyYW1Qb2ludFRhZyAqVGFnID0gbnVsbHB0cikKKyAgICA6IEltcGxpY2l0Q2FsbFBvaW50KEQsIExvYywgUHJlSW1wbGljaXRDYWxsS2luZCwgTCwgVGFnKSB7fQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgUHJvZ3JhbVBvaW50OworICBQcmVJbXBsaWNpdENhbGwoKSA9IGRlZmF1bHQ7CisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBQcm9ncmFtUG9pbnQgJkxvY2F0aW9uKSB7CisgICAgcmV0dXJuIExvY2F0aW9uLmdldEtpbmQoKSA9PSBQcmVJbXBsaWNpdENhbGxLaW5kOworICB9Cit9OworCisvLy8gUmVwcmVzZW50cyBhIHByb2dyYW0gcG9pbnQganVzdCBhZnRlciBhbiBpbXBsaWNpdCBjYWxsIGV2ZW50LgorLy8vCisvLy8gRXhwbGljaXQgY2FsbHMgd2lsbCBhcHBlYXIgYXMgUG9zdFN0bXQgcHJvZ3JhbSBwb2ludHMuCitjbGFzcyBQb3N0SW1wbGljaXRDYWxsIDogcHVibGljIEltcGxpY2l0Q2FsbFBvaW50IHsKK3B1YmxpYzoKKyAgUG9zdEltcGxpY2l0Q2FsbChjb25zdCBEZWNsICpELCBTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKlRhZyA9IG51bGxwdHIpCisgICAgOiBJbXBsaWNpdENhbGxQb2ludChELCBMb2MsIFBvc3RJbXBsaWNpdENhbGxLaW5kLCBMLCBUYWcpIHt9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBQcm9ncmFtUG9pbnQ7CisgIFBvc3RJbXBsaWNpdENhbGwoKSA9IGRlZmF1bHQ7CisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBQcm9ncmFtUG9pbnQgJkxvY2F0aW9uKSB7CisgICAgcmV0dXJuIExvY2F0aW9uLmdldEtpbmQoKSA9PSBQb3N0SW1wbGljaXRDYWxsS2luZDsKKyAgfQorfTsKKworY2xhc3MgUG9zdEFsbG9jYXRvckNhbGwgOiBwdWJsaWMgU3RtdFBvaW50IHsKK3B1YmxpYzoKKyAgUG9zdEFsbG9jYXRvckNhbGwoY29uc3QgU3RtdCAqUywgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKlRhZyA9IG51bGxwdHIpCisgICAgICA6IFN0bXRQb2ludChTLCBudWxscHRyLCBQb3N0QWxsb2NhdG9yQ2FsbEtpbmQsIEwsIFRhZykge30KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFByb2dyYW1Qb2ludDsKKyAgUG9zdEFsbG9jYXRvckNhbGwoKSA9IGRlZmF1bHQ7CisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBQcm9ncmFtUG9pbnQgJkxvY2F0aW9uKSB7CisgICAgcmV0dXJuIExvY2F0aW9uLmdldEtpbmQoKSA9PSBQb3N0QWxsb2NhdG9yQ2FsbEtpbmQ7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgcG9pbnQgd2hlbiB3ZSBiZWdpbiBwcm9jZXNzaW5nIGFuIGlubGluZWQgY2FsbC4KKy8vLyBDYWxsRW50ZXIgdXNlcyB0aGUgY2FsbGVyJ3MgbG9jYXRpb24gY29udGV4dC4KK2NsYXNzIENhbGxFbnRlciA6IHB1YmxpYyBQcm9ncmFtUG9pbnQgeworcHVibGljOgorICBDYWxsRW50ZXIoY29uc3QgU3RtdCAqc3RtdCwgY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKmNhbGxlZUN0eCwgCisgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKmNhbGxlckN0eCkKKyAgICA6IFByb2dyYW1Qb2ludChzdG10LCBjYWxsZWVDdHgsIENhbGxFbnRlcktpbmQsIGNhbGxlckN0eCwgbnVsbHB0cikge30KKworICBjb25zdCBTdG10ICpnZXRDYWxsRXhwcigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgU3RtdCAqPihnZXREYXRhMSgpKTsKKyAgfQorCisgIGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpnZXRDYWxsZWVDb250ZXh0KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBTdGFja0ZyYW1lQ29udGV4dCAqPihnZXREYXRhMigpKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBlbnRyeSBibG9jayBpbiB0aGUgQ0ZHIGZvciB0aGUgZW50ZXJlZCBmdW5jdGlvbi4KKyAgY29uc3QgQ0ZHQmxvY2sgKmdldEVudHJ5KCkgY29uc3QgeworICAgIGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpDYWxsZWVDdHggPSBnZXRDYWxsZWVDb250ZXh0KCk7CisgICAgY29uc3QgQ0ZHICpDYWxsZWVDRkcgPSBDYWxsZWVDdHgtPmdldENGRygpOworICAgIHJldHVybiAmKENhbGxlZUNGRy0+Z2V0RW50cnkoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFByb2dyYW1Qb2ludDsKKyAgQ2FsbEVudGVyKCkgPSBkZWZhdWx0OworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgUHJvZ3JhbVBvaW50ICZMb2NhdGlvbikgeworICAgIHJldHVybiBMb2NhdGlvbi5nZXRLaW5kKCkgPT0gQ2FsbEVudGVyS2luZDsKKyAgfQorfTsKKworLy8vIFJlcHJlc2VudHMgYSBwb2ludCB3aGVuIHdlIHN0YXJ0IHRoZSBjYWxsIGV4aXQgc2VxdWVuY2UgKGZvciBpbmxpbmVkIGNhbGwpLgorLy8vCisvLy8gVGhlIGNhbGwgZXhpdCBpcyBzaW11bGF0ZWQgd2l0aCBhIHNlcXVlbmNlIG9mIG5vZGVzLCB3aGljaCBvY2N1ciBiZXR3ZWVuCisvLy8gQ2FsbEV4aXRCZWdpbiBhbmQgQ2FsbEV4aXRFbmQuIFRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBvY2N1ciBiZXR3ZWVuIHRoZQorLy8vIHR3byBwcm9ncmFtIHBvaW50czoKKy8vLyAtIENhbGxFeGl0QmVnaW4KKy8vLyAtIEJpbmQgdGhlIHJldHVybiB2YWx1ZQorLy8vIC0gUnVuIFJlbW92ZSBkZWFkIGJpbmRpbmdzICh0byBjbGVhbiB1cCB0aGUgZGVhZCBzeW1ib2xzIGZyb20gdGhlIGNhbGxlZSkuCisvLy8gLSBDYWxsRXhpdEVuZAorY2xhc3MgQ2FsbEV4aXRCZWdpbiA6IHB1YmxpYyBQcm9ncmFtUG9pbnQgeworcHVibGljOgorICAvLyBDYWxsRXhpdEJlZ2luIHVzZXMgdGhlIGNhbGxlZSdzIGxvY2F0aW9uIGNvbnRleHQuCisgIENhbGxFeGl0QmVnaW4oY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKkwsIGNvbnN0IFJldHVyblN0bXQgKlJTKQorICAgIDogUHJvZ3JhbVBvaW50KFJTLCBDYWxsRXhpdEJlZ2luS2luZCwgTCwgbnVsbHB0cikgeyB9CisKKyAgY29uc3QgUmV0dXJuU3RtdCAqZ2V0UmV0dXJuU3RtdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgUmV0dXJuU3RtdCAqPihnZXREYXRhMSgpKTsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgUHJvZ3JhbVBvaW50OworICBDYWxsRXhpdEJlZ2luKCkgPSBkZWZhdWx0OworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgUHJvZ3JhbVBvaW50ICZMb2NhdGlvbikgeworICAgIHJldHVybiBMb2NhdGlvbi5nZXRLaW5kKCkgPT0gQ2FsbEV4aXRCZWdpbktpbmQ7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgcG9pbnQgd2hlbiB3ZSBmaW5pc2ggdGhlIGNhbGwgZXhpdCBzZXF1ZW5jZSAoZm9yIGlubGluZWQgY2FsbCkuCisvLy8gXHNhIENhbGxFeGl0QmVnaW4KK2NsYXNzIENhbGxFeGl0RW5kIDogcHVibGljIFByb2dyYW1Qb2ludCB7CitwdWJsaWM6CisgIC8vIENhbGxFeGl0RW5kIHVzZXMgdGhlIGNhbGxlcidzIGxvY2F0aW9uIGNvbnRleHQuCisgIENhbGxFeGl0RW5kKGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpDYWxsZWVDdHgsCisgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqQ2FsbGVyQ3R4KQorICAgIDogUHJvZ3JhbVBvaW50KENhbGxlZUN0eCwgQ2FsbEV4aXRFbmRLaW5kLCBDYWxsZXJDdHgsIG51bGxwdHIpIHt9CisKKyAgY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKmdldENhbGxlZUNvbnRleHQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICo+KGdldERhdGExKCkpOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBQcm9ncmFtUG9pbnQ7CisgIENhbGxFeGl0RW5kKCkgPSBkZWZhdWx0OworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgUHJvZ3JhbVBvaW50ICZMb2NhdGlvbikgeworICAgIHJldHVybiBMb2NhdGlvbi5nZXRLaW5kKCkgPT0gQ2FsbEV4aXRFbmRLaW5kOworICB9Cit9OworCisvLy8gUmVwcmVzZW50cyBhIHBvaW50IHdoZW4gd2UgZXhpdCBhIGxvb3AuCisvLy8gV2hlbiB0aGlzIFByb2dyYW1Qb2ludCBpcyBlbmNvdW50ZXJlZCB3ZSBjYW4gYmUgc3VyZSB0aGF0IHRoZSBzeW1ib2xpYworLy8vIGV4ZWN1dGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZyBMb29wU3RtdCBpcyBmaW5pc2hlZCBvbiB0aGUgZ2l2ZW4gcGF0aC4KKy8vLyBOb3RlOiBJdCBpcyBwb3NzaWJsZSB0byBlbmNvdW50ZXIgYSBMb29wRXhpdCBlbGVtZW50IHdoZW4gd2UgaGF2ZW4ndCBldmVuCisvLy8gZW5jb3VudGVyZWQgdGhlIGxvb3AgaXRzZWxmLiBBdCB0aGUgY3VycmVudCBzdGF0ZSBub3QgYWxsIGxvb3AgZXhpdHMgd2lsbAorLy8vIHJlc3VsdCBpbiBhIExvb3BFeGl0IHByb2dyYW0gcG9pbnQuCitjbGFzcyBMb29wRXhpdCA6IHB1YmxpYyBQcm9ncmFtUG9pbnQgeworcHVibGljOgorICAgIExvb3BFeGl0KGNvbnN0IFN0bXQgKkxvb3BTdG10LCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDKQorICAgICAgICAgICAgOiBQcm9ncmFtUG9pbnQoTG9vcFN0bXQsIG51bGxwdHIsIExvb3BFeGl0S2luZCwgTEMpIHt9CisKKyAgICBjb25zdCBTdG10ICpnZXRMb29wU3RtdCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBTdG10ICo+KGdldERhdGExKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUHJvZ3JhbVBvaW50OworICAgIExvb3BFeGl0KCkgPSBkZWZhdWx0OworICAgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBQcm9ncmFtUG9pbnQgJkxvY2F0aW9uKSB7CisgICAgICByZXR1cm4gTG9jYXRpb24uZ2V0S2luZCgpID09IExvb3BFeGl0S2luZDsKKyAgICB9Cit9OworCisvLy8gVGhpcyBpcyBhIG1ldGEgcHJvZ3JhbSBwb2ludCwgd2hpY2ggc2hvdWxkIGJlIHNraXBwZWQgYnkgYWxsIHRoZSBkaWFnbm9zdGljCisvLy8gcmVhc29uaW5nIGV0Yy4KK2NsYXNzIEVwc2lsb25Qb2ludCA6IHB1YmxpYyBQcm9ncmFtUG9pbnQgeworcHVibGljOgorICBFcHNpbG9uUG9pbnQoY29uc3QgTG9jYXRpb25Db250ZXh0ICpMLCBjb25zdCB2b2lkICpEYXRhMSwKKyAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKkRhdGEyID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgIGNvbnN0IFByb2dyYW1Qb2ludFRhZyAqdGFnID0gbnVsbHB0cikKKyAgICA6IFByb2dyYW1Qb2ludChEYXRhMSwgRGF0YTIsIEVwc2lsb25LaW5kLCBMLCB0YWcpIHt9CisKKyAgY29uc3Qgdm9pZCAqZ2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuIGdldERhdGExKCk7IH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFByb2dyYW1Qb2ludDsKKyAgRXBzaWxvblBvaW50KCkgPSBkZWZhdWx0OworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgUHJvZ3JhbVBvaW50ICZMb2NhdGlvbikgeworICAgIHJldHVybiBMb2NhdGlvbi5nZXRLaW5kKCkgPT0gRXBzaWxvbktpbmQ7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisKK25hbWVzcGFjZSBsbHZtIHsgLy8gVHJhaXRzIHNwZWNpYWxpemF0aW9uIGZvciBEZW5zZU1hcAorCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPGNsYW5nOjpQcm9ncmFtUG9pbnQ+IHsKKworc3RhdGljIGlubGluZSBjbGFuZzo6UHJvZ3JhbVBvaW50IGdldEVtcHR5S2V5KCkgeworICB1aW50cHRyX3QgeCA9CisgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oRGVuc2VNYXBJbmZvPHZvaWQqPjo6Z2V0RW1wdHlLZXkoKSkgJiB+MHg3OworICByZXR1cm4gY2xhbmc6OkJsb2NrRW50cmFuY2UocmVpbnRlcnByZXRfY2FzdDxjbGFuZzo6Q0ZHQmxvY2sqPih4KSwgbnVsbHB0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2xhbmc6OlByb2dyYW1Qb2ludCBnZXRUb21ic3RvbmVLZXkoKSB7CisgIHVpbnRwdHJfdCB4ID0KKyAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihEZW5zZU1hcEluZm88dm9pZCo+OjpnZXRUb21ic3RvbmVLZXkoKSkgJiB+MHg3OworICByZXR1cm4gY2xhbmc6OkJsb2NrRW50cmFuY2UocmVpbnRlcnByZXRfY2FzdDxjbGFuZzo6Q0ZHQmxvY2sqPih4KSwgbnVsbHB0cik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgY2xhbmc6OlByb2dyYW1Qb2ludCAmTG9jKSB7CisgIHJldHVybiBMb2MuZ2V0SGFzaFZhbHVlKCk7Cit9CisKK3N0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgY2xhbmc6OlByb2dyYW1Qb2ludCAmTCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhbmc6OlByb2dyYW1Qb2ludCAmUikgeworICByZXR1cm4gTCA9PSBSOworfQorCit9OworICAKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaXNQb2RMaWtlPGNsYW5nOjpQcm9ncmFtUG9pbnQ+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL1N1cHBvcnQvQnVtcFZlY3Rvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvU3VwcG9ydC9CdW1wVmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0MDUyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL1N1cHBvcnQvQnVtcFZlY3Rvci5oCkBAIC0wLDAgKzEsMjU3IEBACisvLz09PS0gQnVtcFZlY3Rvci5oIC0gVmVjdG9yLWxpa2UgQURUIHRoYXQgdXNlcyBidW1wIGFsbG9jYXRpb24gLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgcHJvdmlkZXMgQnVtcFZlY3RvciwgYSB2ZWN0b3ItbGlrZSBBRFQgd2hvc2UgY29udGVudHMgYXJlCisvLyAgYWxsb2NhdGVkIGZyb20gYSBCdW1wUHRyQWxsb2NhdG9yLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIEZJWE1FOiBNb3N0IG9mIHRoaXMgaXMgY29weS1hbmQtcGFzdGUgZnJvbSBTbWFsbFZlY3Rvci5oLiAgV2UgY2FuCisvLyByZWZhY3RvciB0aGlzIGNvcmUgbG9naWMgaW50byBzb21ldGhpbmcgY29tbW9uIHRoYXQgaXMgc2hhcmVkIGJldHdlZW4KKy8vIHRoZSB0d28uICBUaGUgbWFpbiB0aGluZyB0aGF0IGlzIGRpZmZlcmVudCBpcyB0aGUgYWxsb2NhdGlvbiBzdHJhdGVneS4KKworI2lmbmRlZiBMTFZNX0NMQU5HX0FOQUxZU0lTX1NVUFBPUlRfQlVNUFZFQ1RPUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQU5BTFlTSVNfU1VQUE9SVF9CVU1QVkVDVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgCitjbGFzcyBCdW1wVmVjdG9yQ29udGV4dCB7CisgIGxsdm06OlBvaW50ZXJJbnRQYWlyPGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IqLCAxPiBBbGxvYzsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0IGEgbmV3IEJ1bXBWZWN0b3JDb250ZXh0IHRoYXQgY3JlYXRlcyBhIG5ldyBCdW1wUHRyQWxsb2NhdG9yCisgIC8vLyBhbmQgZGVzdHJveXMgaXQgd2hlbiB0aGUgQnVtcFZlY3RvckNvbnRleHQgb2JqZWN0IGlzIGRlc3Ryb3llZC4KKyAgQnVtcFZlY3RvckNvbnRleHQoKSA6IEFsbG9jKG5ldyBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yKCksIDEpIHt9CisKKyAgQnVtcFZlY3RvckNvbnRleHQoQnVtcFZlY3RvckNvbnRleHQgJiZPdGhlcikgOiBBbGxvYyhPdGhlci5BbGxvYykgeworICAgIE90aGVyLkFsbG9jLnNldEludChmYWxzZSk7CisgICAgT3RoZXIuQWxsb2Muc2V0UG9pbnRlcihudWxscHRyKTsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3QgYSBuZXcgQnVtcFZlY3RvckNvbnRleHQgdGhhdCByZXVzZXMgYW4gZXhpc3RpbmcKKyAgLy8vIEJ1bXBQdHJBbGxvY2F0b3IuICBUaGlzIEJ1bXBQdHJBbGxvY2F0b3IgaXMgbm90IGRlc3Ryb3llZCB3aGVuIHRoZQorICAvLy8gQnVtcFZlY3RvckNvbnRleHQgb2JqZWN0IGlzIGRlc3Ryb3llZC4KKyAgQnVtcFZlY3RvckNvbnRleHQobGx2bTo6QnVtcFB0ckFsbG9jYXRvciAmQSkgOiBBbGxvYygmQSwgMCkge30KKyAgCisgIH5CdW1wVmVjdG9yQ29udGV4dCgpIHsKKyAgICBpZiAoQWxsb2MuZ2V0SW50KCkpCisgICAgICBkZWxldGUgQWxsb2MuZ2V0UG9pbnRlcigpOworICB9CisgIAorICBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yICZnZXRBbGxvY2F0b3IoKSB7IHJldHVybiAqQWxsb2MuZ2V0UG9pbnRlcigpOyB9Cit9OworICAKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBCdW1wVmVjdG9yIHsKKyAgVCAqQmVnaW4gPSBudWxscHRyOworICBUICpFbmQgPSBudWxscHRyOworICBUICpDYXBhY2l0eSA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgLy8gRGVmYXVsdCBjdG9yIC0gSW5pdGlhbGl6ZSB0byBlbXB0eS4KKyAgZXhwbGljaXQgQnVtcFZlY3RvcihCdW1wVmVjdG9yQ29udGV4dCAmQywgdW5zaWduZWQgTikgeworICAgIHJlc2VydmUoQywgTik7CisgIH0KKyAgCisgIH5CdW1wVmVjdG9yKCkgeworICAgIGlmIChzdGQ6OmlzX2NsYXNzPFQ+Ojp2YWx1ZSkgeworICAgICAgLy8gRGVzdHJveSB0aGUgY29uc3RydWN0ZWQgZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KKyAgICAgIGRlc3Ryb3lfcmFuZ2UoQmVnaW4sIEVuZCk7CisgICAgfQorICB9CisgIAorICB1c2luZyBzaXplX3R5cGUgPSBzaXplX3Q7CisgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHB0cmRpZmZfdDsKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IFQ7CisgIHVzaW5nIGl0ZXJhdG9yID0gVCAqOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IGNvbnN0IFQgKjsKKyAgCisgIHVzaW5nIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgPSBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+OworICB1c2luZyByZXZlcnNlX2l0ZXJhdG9yID0gc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPjsKKyAgCisgIHVzaW5nIHJlZmVyZW5jZSA9IFQgJjsKKyAgdXNpbmcgY29uc3RfcmVmZXJlbmNlID0gY29uc3QgVCAmOworICB1c2luZyBwb2ludGVyID0gVCAqOworICB1c2luZyBjb25zdF9wb2ludGVyID0gY29uc3QgVCAqOworICAKKyAgLy8gZm9yd2FyZCBpdGVyYXRvciBjcmVhdGlvbiBtZXRob2RzLgorICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIEJlZ2luOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gQmVnaW47IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gRW5kOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEVuZDsgfQorICAKKyAgLy8gcmV2ZXJzZSBpdGVyYXRvciBjcmVhdGlvbiBtZXRob2RzLgorICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3R7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsKKyAgfQorICAgIAorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gQmVnaW4gPT0gRW5kOyB9CisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gRW5kLUJlZ2luOyB9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10odW5zaWduZWQgaWR4KSB7CisgICAgYXNzZXJ0KEJlZ2luICsgaWR4IDwgRW5kKTsKKyAgICByZXR1cm4gQmVnaW5baWR4XTsKKyAgfQorICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXSh1bnNpZ25lZCBpZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoQmVnaW4gKyBpZHggPCBFbmQpOworICAgIHJldHVybiBCZWdpbltpZHhdOworICB9CisgIAorICByZWZlcmVuY2UgZnJvbnQoKSB7CisgICAgcmV0dXJuIGJlZ2luKClbMF07CisgIH0KKyAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeworICAgIHJldHVybiBiZWdpbigpWzBdOworICB9CisgIAorICByZWZlcmVuY2UgYmFjaygpIHsKKyAgICByZXR1cm4gZW5kKClbLTFdOworICB9CisgIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgeworICAgIHJldHVybiBlbmQoKVstMV07CisgIH0KKyAgCisgIHZvaWQgcG9wX2JhY2soKSB7CisgICAgLS1FbmQ7CisgICAgRW5kLT5+VCgpOworICB9CisgIAorICBUIHBvcF9iYWNrX3ZhbCgpIHsKKyAgICBUIFJlc3VsdCA9IGJhY2soKTsKKyAgICBwb3BfYmFjaygpOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKyAgCisgIHZvaWQgY2xlYXIoKSB7CisgICAgaWYgKHN0ZDo6aXNfY2xhc3M8VD46OnZhbHVlKSB7CisgICAgICBkZXN0cm95X3JhbmdlKEJlZ2luLCBFbmQpOworICAgIH0KKyAgICBFbmQgPSBCZWdpbjsKKyAgfQorICAKKyAgLy8vIGRhdGEgLSBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB2ZWN0b3IncyBidWZmZXIsIGV2ZW4gaWYgZW1wdHkoKS4KKyAgcG9pbnRlciBkYXRhKCkgeworICAgIHJldHVybiBwb2ludGVyKEJlZ2luKTsKKyAgfQorICAKKyAgLy8vIGRhdGEgLSBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB2ZWN0b3IncyBidWZmZXIsIGV2ZW4gaWYgZW1wdHkoKS4KKyAgY29uc3RfcG9pbnRlciBkYXRhKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9wb2ludGVyKEJlZ2luKTsKKyAgfQorICAKKyAgdm9pZCBwdXNoX2JhY2soY29uc3RfcmVmZXJlbmNlIEVsdCwgQnVtcFZlY3RvckNvbnRleHQgJkMpIHsKKyAgICBpZiAoRW5kIDwgQ2FwYWNpdHkpIHsKKyAgICBSZXRyeToKKyAgICAgIG5ldyAoRW5kKSBUKEVsdCk7CisgICAgICArK0VuZDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZ3JvdyhDKTsKKyAgICBnb3RvIFJldHJ5OyAgICAKKyAgfQorCisgIC8vLyBpbnNlcnQgLSBJbnNlcnQgc29tZSBudW1iZXIgb2YgY29waWVzIG9mIGVsZW1lbnQgaW50byBhIHBvc2l0aW9uLiBSZXR1cm4KKyAgLy8vIGl0ZXJhdG9yIHRvIHBvc2l0aW9uIGFmdGVyIGxhc3QgaW5zZXJ0ZWQgY29weS4KKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIEksIHNpemVfdCBDbnQsIGNvbnN0X3JlZmVyZW5jZSBFLAorICAgICAgQnVtcFZlY3RvckNvbnRleHQgJkMpIHsKKyAgICBhc3NlcnQoSSA+PSBCZWdpbiAmJiBJIDw9IEVuZCAmJiAiSXRlcmF0b3Igb3V0IG9mIGJvdW5kcy4iKTsKKyAgICBpZiAoRW5kICsgQ250IDw9IENhcGFjaXR5KSB7CisgICAgUmV0cnk6CisgICAgICBtb3ZlX3JhbmdlX3JpZ2h0KEksIEVuZCwgQ250KTsKKyAgICAgIGNvbnN0cnVjdF9yYW5nZShJLCBJICsgQ250LCBFKTsKKyAgICAgIEVuZCArPSBDbnQ7CisgICAgICByZXR1cm4gSSArIENudDsKKyAgICB9CisgICAgcHRyZGlmZl90IEQgPSBJIC0gQmVnaW47CisgICAgZ3JvdyhDLCBzaXplKCkgKyBDbnQpOworICAgIEkgPSBCZWdpbiArIEQ7CisgICAgZ290byBSZXRyeTsKKyAgfQorCisgIHZvaWQgcmVzZXJ2ZShCdW1wVmVjdG9yQ29udGV4dCAmQywgdW5zaWduZWQgTikgeworICAgIGlmICh1bnNpZ25lZChDYXBhY2l0eS1CZWdpbikgPCBOKQorICAgICAgZ3JvdyhDLCBOKTsKKyAgfQorCisgIC8vLyBjYXBhY2l0eSAtIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50bHkgYWxsb2NhdGVkCisgIC8vLyBidWZmZXIuCisgIHNpemVfdCBjYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIENhcGFjaXR5IC0gQmVnaW47IH0gIAorICAgIAorcHJpdmF0ZToKKyAgLy8vIGdyb3cgLSBkb3VibGUgdGhlIHNpemUgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnksIGd1YXJhbnRlZWluZyBzcGFjZSBmb3IgYXQKKyAgLy8vIGxlYXN0IG9uZSBtb3JlIGVsZW1lbnQgb3IgTWluU2l6ZSBpZiBzcGVjaWZpZWQuCisgIHZvaWQgZ3JvdyhCdW1wVmVjdG9yQ29udGV4dCAmQywgc2l6ZV90eXBlIE1pblNpemUgPSAxKTsKKyAgCisgIHZvaWQgY29uc3RydWN0X3JhbmdlKFQgKlMsIFQgKkUsIGNvbnN0IFQgJkVsdCkgeworICAgIGZvciAoOyBTICE9IEU7ICsrUykKKyAgICAgIG5ldyAoUykgVChFbHQpOworICB9CisgIAorICB2b2lkIGRlc3Ryb3lfcmFuZ2UoVCAqUywgVCAqRSkgeworICAgIHdoaWxlIChTICE9IEUpIHsKKyAgICAgIC0tRTsKKyAgICAgIEUtPn5UKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBtb3ZlX3JhbmdlX3JpZ2h0KFQgKlMsIFQgKkUsIHNpemVfdCBEKSB7CisgICAgZm9yIChUICpJID0gRSArIEQgLSAxLCAqSUwgPSBTICsgRCAtIDE7IEkgIT0gSUw7IC0tSSkgeworICAgICAgLS1FOworICAgICAgbmV3IChJKSBUKCpFKTsKKyAgICAgIEUtPn5UKCk7CisgICAgfQorICB9Cit9OworICAKKy8vIERlZmluZSB0aGlzIG91dC1vZi1saW5lIHRvIGRpc3N1YWRlIHRoZSBDKysgY29tcGlsZXIgZnJvbSBpbmxpbmluZyBpdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBCdW1wVmVjdG9yPFQ+Ojpncm93KEJ1bXBWZWN0b3JDb250ZXh0ICZDLCBzaXplX3QgTWluU2l6ZSkgeworICBzaXplX3QgQ3VyQ2FwYWNpdHkgPSBDYXBhY2l0eS1CZWdpbjsKKyAgc2l6ZV90IEN1clNpemUgPSBzaXplKCk7CisgIHNpemVfdCBOZXdDYXBhY2l0eSA9IDIqQ3VyQ2FwYWNpdHk7CisgIGlmIChOZXdDYXBhY2l0eSA8IE1pblNpemUpCisgICAgTmV3Q2FwYWNpdHkgPSBNaW5TaXplOworCisgIC8vIEFsbG9jYXRlIHRoZSBtZW1vcnkgZnJvbSB0aGUgQnVtcFB0ckFsbG9jYXRvci4KKyAgVCAqTmV3RWx0cyA9IEMuZ2V0QWxsb2NhdG9yKCkudGVtcGxhdGUgQWxsb2NhdGU8VD4oTmV3Q2FwYWNpdHkpOworICAKKyAgLy8gQ29weSB0aGUgZWxlbWVudHMgb3Zlci4KKyAgaWYgKEJlZ2luICE9IEVuZCkgeworICAgIGlmIChzdGQ6OmlzX2NsYXNzPFQ+Ojp2YWx1ZSkgeworICAgICAgc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoQmVnaW4sIEVuZCwgTmV3RWx0cyk7CisgICAgICAvLyBEZXN0cm95IHRoZSBvcmlnaW5hbCBlbGVtZW50cy4KKyAgICAgIGRlc3Ryb3lfcmFuZ2UoQmVnaW4sIEVuZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFVzZSBtZW1jcHkgZm9yIFBPRHMgKHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5IG9wdGltaXplcyB0byBtZW1tb3ZlKS4KKyAgICAgIG1lbWNweShOZXdFbHRzLCBCZWdpbiwgQ3VyU2l6ZSAqIHNpemVvZihUKSk7CisgICAgfQorICB9CisKKyAgLy8gRm9yIG5vdywgbGVhayAnQmVnaW4nLiAgV2UgY2FuIGFkZCBpdCBiYWNrIHRvIGEgZnJlZWxpc3QgaW4KKyAgLy8gQnVtcFZlY3RvckNvbnRleHQuCisgIEJlZ2luID0gTmV3RWx0czsKKyAgRW5kID0gTmV3RWx0cytDdXJTaXplOworICBDYXBhY2l0eSA9IEJlZ2luK05ld0NhcGFjaXR5OworfQorCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19BTkFMWVNJU19TVVBQT1JUX0JVTVBWRUNUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQUJJLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9BQkkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWU5ZmFmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQUJJLmgKQEAgLTAsMCArMSwyMTEgQEAKKy8vPT09LS0tLS0gQUJJLmggLSBBQkkgcmVsYXRlZCBkZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBFbnVtcy9jbGFzc2VzIGRlc2NyaWJpbmcgQUJJIHJlbGF0ZWQgaW5mb3JtYXRpb24gYWJvdXQgY29uc3RydWN0b3JzLAorLy8vIGRlc3RydWN0b3JzIGFuZCB0aHVua3MuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19BQklfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX0FCSV9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBDKysgY29uc3RydWN0b3IgdHlwZXMuCitlbnVtIENYWEN0b3JUeXBlIHsKKyAgQ3Rvcl9Db21wbGV0ZSwgICAgICAgLy8vPCBDb21wbGV0ZSBvYmplY3QgY3RvcgorICBDdG9yX0Jhc2UsICAgICAgICAgICAvLy88IEJhc2Ugb2JqZWN0IGN0b3IKKyAgQ3Rvcl9Db21kYXQsICAgICAgICAgLy8vPCBUaGUgQ09NREFUIHVzZWQgZm9yIGN0b3JzCisgIEN0b3JfQ29weWluZ0Nsb3N1cmUsIC8vLzwgQ29weWluZyBjbG9zdXJlIHZhcmlhbnQgb2YgYSBjdG9yCisgIEN0b3JfRGVmYXVsdENsb3N1cmUsIC8vLzwgRGVmYXVsdCBjbG9zdXJlIHZhcmlhbnQgb2YgYSBjdG9yCit9OworCisvLy8gXGJyaWVmIEMrKyBkZXN0cnVjdG9yIHR5cGVzLgorZW51bSBDWFhEdG9yVHlwZSB7CisgICAgRHRvcl9EZWxldGluZywgLy8vPCBEZWxldGluZyBkdG9yCisgICAgRHRvcl9Db21wbGV0ZSwgLy8vPCBDb21wbGV0ZSBvYmplY3QgZHRvcgorICAgIER0b3JfQmFzZSwgICAgIC8vLzwgQmFzZSBvYmplY3QgZHRvcgorICAgIER0b3JfQ29tZGF0ICAgIC8vLzwgVGhlIENPTURBVCB1c2VkIGZvciBkdG9ycworfTsKKworLy8vIFxicmllZiBBIHJldHVybiBhZGp1c3RtZW50Lgorc3RydWN0IFJldHVybkFkanVzdG1lbnQgeworICAvLy8gXGJyaWVmIFRoZSBub24tdmlydHVhbCBhZGp1c3RtZW50IGZyb20gdGhlIGRlcml2ZWQgb2JqZWN0IHRvIGl0cworICAvLy8gbmVhcmVzdCB2aXJ0dWFsIGJhc2UuCisgIGludDY0X3QgTm9uVmlydHVhbDsKKworICAvLy8gXGJyaWVmIEhvbGRzIHRoZSBBQkktc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZpcnR1YWwgcmV0dXJuCisgIC8vLyBhZGp1c3RtZW50LCBpZiBuZWVkZWQuCisgIHVuaW9uIFZpcnR1YWxBZGp1c3RtZW50IHsKKyAgICAvLyBJdGFuaXVtIEFCSQorICAgIHN0cnVjdCB7CisgICAgICAvLy8gXGJyaWVmIFRoZSBvZmZzZXQgKGluIGJ5dGVzKSwgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3MgcG9pbnQKKyAgICAgIC8vLyBvZiB0aGUgdmlydHVhbCBiYXNlIGNsYXNzIG9mZnNldC4KKyAgICAgIGludDY0X3QgVkJhc2VPZmZzZXRPZmZzZXQ7CisgICAgfSBJdGFuaXVtOworCisgICAgLy8gTWljcm9zb2Z0IEFCSQorICAgIHN0cnVjdCB7CisgICAgICAvLy8gXGJyaWVmIFRoZSBvZmZzZXQgKGluIGJ5dGVzKSBvZiB0aGUgdmJwdHIsIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgIC8vLyBvZiB0aGUgZGVyaXZlZCBjbGFzcy4KKyAgICAgIHVpbnQzMl90IFZCUHRyT2Zmc2V0OworCisgICAgICAvLy8gXGJyaWVmIEluZGV4IG9mIHRoZSB2aXJ0dWFsIGJhc2UgaW4gdGhlIHZidGFibGUuCisgICAgICB1aW50MzJfdCBWQkluZGV4OworICAgIH0gTWljcm9zb2Z0OworCisgICAgVmlydHVhbEFkanVzdG1lbnQoKSB7CisgICAgICBtZW1zZXQodGhpcywgMCwgc2l6ZW9mKCp0aGlzKSk7CisgICAgfQorCisgICAgYm9vbCBFcXVhbHMoY29uc3QgVmlydHVhbEFkanVzdG1lbnQgJk90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gbWVtY21wKHRoaXMsICZPdGhlciwgc2l6ZW9mKE90aGVyKSkgPT0gMDsKKyAgICB9CisKKyAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICBWaXJ0dWFsQWRqdXN0bWVudCBaZXJvOworICAgICAgcmV0dXJuIEVxdWFscyhaZXJvKTsKKyAgICB9CisKKyAgICBib29sIExlc3MoY29uc3QgVmlydHVhbEFkanVzdG1lbnQgJlJIUykgY29uc3QgeworICAgICAgcmV0dXJuIG1lbWNtcCh0aGlzLCAmUkhTLCBzaXplb2YoUkhTKSkgPCAwOworICAgIH0KKyAgfSBWaXJ0dWFsOworICAKKyAgUmV0dXJuQWRqdXN0bWVudCgpIDogTm9uVmlydHVhbCgwKSB7fQorICAKKyAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIU5vblZpcnR1YWwgJiYgVmlydHVhbC5pc0VtcHR5KCk7IH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJldHVybkFkanVzdG1lbnQgJkxIUywgCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0dXJuQWRqdXN0bWVudCAmUkhTKSB7CisgICAgcmV0dXJuIExIUy5Ob25WaXJ0dWFsID09IFJIUy5Ob25WaXJ0dWFsICYmIExIUy5WaXJ0dWFsLkVxdWFscyhSSFMuVmlydHVhbCk7CisgIH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJldHVybkFkanVzdG1lbnQgJkxIUywgY29uc3QgUmV0dXJuQWRqdXN0bWVudCAmUkhTKSB7CisgICAgcmV0dXJuICEoTEhTID09IFJIUyk7CisgIH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoY29uc3QgUmV0dXJuQWRqdXN0bWVudCAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0dXJuQWRqdXN0bWVudCAmUkhTKSB7CisgICAgaWYgKExIUy5Ob25WaXJ0dWFsIDwgUkhTLk5vblZpcnR1YWwpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBMSFMuTm9uVmlydHVhbCA9PSBSSFMuTm9uVmlydHVhbCAmJiBMSFMuVmlydHVhbC5MZXNzKFJIUy5WaXJ0dWFsKTsKKyAgfQorfTsKKyAgCisvLy8gXGJyaWVmIEEgXGMgdGhpcyBwb2ludGVyIGFkanVzdG1lbnQuCitzdHJ1Y3QgVGhpc0FkanVzdG1lbnQgeworICAvLy8gXGJyaWVmIFRoZSBub24tdmlydHVhbCBhZGp1c3RtZW50IGZyb20gdGhlIGRlcml2ZWQgb2JqZWN0IHRvIGl0cworICAvLy8gbmVhcmVzdCB2aXJ0dWFsIGJhc2UuCisgIGludDY0X3QgTm9uVmlydHVhbDsKKworICAvLy8gXGJyaWVmIEhvbGRzIHRoZSBBQkktc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZpcnR1YWwgdGhpcworICAvLy8gYWRqdXN0bWVudCwgaWYgbmVlZGVkLgorICB1bmlvbiBWaXJ0dWFsQWRqdXN0bWVudCB7CisgICAgLy8gSXRhbml1bSBBQkkKKyAgICBzdHJ1Y3QgeworICAgICAgLy8vIFxicmllZiBUaGUgb2Zmc2V0IChpbiBieXRlcyksIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIHBvaW50LAorICAgICAgLy8vIG9mIHRoZSB2aXJ0dWFsIGNhbGwgb2Zmc2V0LgorICAgICAgaW50NjRfdCBWQ2FsbE9mZnNldE9mZnNldDsKKyAgICB9IEl0YW5pdW07CisKKyAgICBzdHJ1Y3QgeworICAgICAgLy8vIFxicmllZiBUaGUgb2Zmc2V0IG9mIHRoZSB2dG9yZGlzcCAoaW4gYnl0ZXMpLCByZWxhdGl2ZSB0byB0aGUgRUNYLgorICAgICAgaW50MzJfdCBWdG9yZGlzcE9mZnNldDsKKworICAgICAgLy8vIFxicmllZiBUaGUgb2Zmc2V0IG9mIHRoZSB2YnB0ciBvZiB0aGUgZGVyaXZlZCBjbGFzcyAoaW4gYnl0ZXMpLAorICAgICAgLy8vIHJlbGF0aXZlIHRvIHRoZSBFQ1ggYWZ0ZXIgdnRvcmRpc3AgYWRqdXN0bWVudC4KKyAgICAgIGludDMyX3QgVkJQdHJPZmZzZXQ7CisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIG9mZnNldCAoaW4gYnl0ZXMpIG9mIHRoZSB2YmFzZSBvZmZzZXQgaW4gdGhlIHZidGFibGUuCisgICAgICBpbnQzMl90IFZCT2Zmc2V0T2Zmc2V0OworICAgIH0gTWljcm9zb2Z0OworCisgICAgVmlydHVhbEFkanVzdG1lbnQoKSB7CisgICAgICBtZW1zZXQodGhpcywgMCwgc2l6ZW9mKCp0aGlzKSk7CisgICAgfQorCisgICAgYm9vbCBFcXVhbHMoY29uc3QgVmlydHVhbEFkanVzdG1lbnQgJk90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gbWVtY21wKHRoaXMsICZPdGhlciwgc2l6ZW9mKE90aGVyKSkgPT0gMDsKKyAgICB9CisKKyAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICBWaXJ0dWFsQWRqdXN0bWVudCBaZXJvOworICAgICAgcmV0dXJuIEVxdWFscyhaZXJvKTsKKyAgICB9CisKKyAgICBib29sIExlc3MoY29uc3QgVmlydHVhbEFkanVzdG1lbnQgJlJIUykgY29uc3QgeworICAgICAgcmV0dXJuIG1lbWNtcCh0aGlzLCAmUkhTLCBzaXplb2YoUkhTKSkgPCAwOworICAgIH0KKyAgfSBWaXJ0dWFsOworICAKKyAgVGhpc0FkanVzdG1lbnQoKSA6IE5vblZpcnR1YWwoMCkgeyB9CisKKyAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIU5vblZpcnR1YWwgJiYgVmlydHVhbC5pc0VtcHR5KCk7IH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRoaXNBZGp1c3RtZW50ICZMSFMsIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRoaXNBZGp1c3RtZW50ICZSSFMpIHsKKyAgICByZXR1cm4gTEhTLk5vblZpcnR1YWwgPT0gUkhTLk5vblZpcnR1YWwgJiYgTEhTLlZpcnR1YWwuRXF1YWxzKFJIUy5WaXJ0dWFsKTsKKyAgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgVGhpc0FkanVzdG1lbnQgJkxIUywgY29uc3QgVGhpc0FkanVzdG1lbnQgJlJIUykgeworICAgIHJldHVybiAhKExIUyA9PSBSSFMpOworICB9CisgIAorICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoY29uc3QgVGhpc0FkanVzdG1lbnQgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRoaXNBZGp1c3RtZW50ICZSSFMpIHsKKyAgICBpZiAoTEhTLk5vblZpcnR1YWwgPCBSSFMuTm9uVmlydHVhbCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIAorICAgIHJldHVybiBMSFMuTm9uVmlydHVhbCA9PSBSSFMuTm9uVmlydHVhbCAmJiBMSFMuVmlydHVhbC5MZXNzKFJIUy5WaXJ0dWFsKTsKKyAgfQorfTsKKworY2xhc3MgQ1hYTWV0aG9kRGVjbDsKKworLy8vIFxicmllZiBUaGUgXGMgdGhpcyBwb2ludGVyIGFkanVzdG1lbnQgYXMgd2VsbCBhcyBhbiBvcHRpb25hbCByZXR1cm4KKy8vLyBhZGp1c3RtZW50IGZvciBhIHRodW5rLgorc3RydWN0IFRodW5rSW5mbyB7CisgIC8vLyBcYnJpZWYgVGhlIFxjIHRoaXMgcG9pbnRlciBhZGp1c3RtZW50LgorICBUaGlzQWRqdXN0bWVudCBUaGlzOworICAgIAorICAvLy8gXGJyaWVmIFRoZSByZXR1cm4gYWRqdXN0bWVudC4KKyAgUmV0dXJuQWRqdXN0bWVudCBSZXR1cm47CisKKyAgLy8vIFxicmllZiBIb2xkcyBhIHBvaW50ZXIgdG8gdGhlIG92ZXJyaWRkZW4gbWV0aG9kIHRoaXMgdGh1bmsgaXMgZm9yLAorICAvLy8gaWYgbmVlZGVkIGJ5IHRoZSBBQkkgdG8gZGlzdGluZ3Vpc2ggZGlmZmVyZW50IHRodW5rcyB3aXRoIGVxdWFsCisgIC8vLyBhZGp1c3RtZW50cy4gT3RoZXJ3aXNlLCBudWxsLgorICAvLy8gQ0FVVElPTjogSW4gdGhlIHVubGlrZWx5IGV2ZW50IHlvdSBuZWVkIHRvIHNvcnQgVGh1bmtJbmZvcywgY29uc2lkZXIgdXNpbmcKKyAgLy8vIGFuIEFCSS1zcGVjaWZpYyBjb21wYXJhdG9yLgorICBjb25zdCBDWFhNZXRob2REZWNsICpNZXRob2Q7CisKKyAgVGh1bmtJbmZvKCkgOiBNZXRob2QobnVsbHB0cikgeyB9CisKKyAgVGh1bmtJbmZvKGNvbnN0IFRoaXNBZGp1c3RtZW50ICZUaGlzLCBjb25zdCBSZXR1cm5BZGp1c3RtZW50ICZSZXR1cm4sCisgICAgICAgICAgICBjb25zdCBDWFhNZXRob2REZWNsICpNZXRob2QgPSBudWxscHRyKQorICAgICAgOiBUaGlzKFRoaXMpLCBSZXR1cm4oUmV0dXJuKSwgTWV0aG9kKE1ldGhvZCkge30KKworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRodW5rSW5mbyAmTEhTLCBjb25zdCBUaHVua0luZm8gJlJIUykgeworICAgIHJldHVybiBMSFMuVGhpcyA9PSBSSFMuVGhpcyAmJiBMSFMuUmV0dXJuID09IFJIUy5SZXR1cm4gJiYKKyAgICAgICAgICAgTEhTLk1ldGhvZCA9PSBSSFMuTWV0aG9kOworICB9CisKKyAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBUaGlzLmlzRW1wdHkoKSAmJiBSZXR1cm4uaXNFbXB0eSgpICYmIE1ldGhvZCA9PSBudWxscHRyOworICB9Cit9OyAgCisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0FkZHJlc3NTcGFjZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0FkZHJlc3NTcGFjZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODZiMDMzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQWRkcmVzc1NwYWNlcy5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vPT09LSBBZGRyZXNzU3BhY2VzLmggLSBMYW5ndWFnZS1zcGVjaWZpYyBhZGRyZXNzIHNwYWNlcyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIFByb3ZpZGVzIGRlZmluaXRpb25zIGZvciB0aGUgdmFyaW91cyBsYW5ndWFnZS1zcGVjaWZpYyBhZGRyZXNzCisvLy8gc3BhY2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19BRERSRVNTU1BBQ0VTX0gKKyNkZWZpbmUgTExWTV9DTEFOR19CQVNJQ19BRERSRVNTU1BBQ0VTX0gKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgYWRkcmVzcyBzcGFjZSB2YWx1ZXMgdXNlZCBieSB0aGUgYWRkcmVzcyBzcGFjZSBxdWFsaWZpZXIKKy8vLyBvZiBRdWFsVHlwZS4KKy8vLworZW51bSBjbGFzcyBMYW5nQVMgOiB1bnNpZ25lZCB7CisgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIDAgaXMgdGhlIHZhbHVlIHVzZWQgaW4gUXVhbFR5cGUgZm9yIHRoZSBzaXR1YXRpb24KKyAgLy8gd2hlcmUgdGhlcmUgaXMgbm8gYWRkcmVzcyBzcGFjZSBxdWFsaWZpZXIuCisgIERlZmF1bHQgPSAwLAorCisgIC8vIE9wZW5DTCBzcGVjaWZpYyBhZGRyZXNzIHNwYWNlcy4KKyAgLy8gSW4gT3BlbkNMIGVhY2ggbC12YWx1ZSBtdXN0IGhhdmUgY2VydGFpbiBub24tZGVmYXVsdCBhZGRyZXNzIHNwYWNlLCBlYWNoCisgIC8vIHItdmFsdWUgbXVzdCBoYXZlIG5vIGFkZHJlc3Mgc3BhY2UgKGkuZS4gdGhlIGRlZmF1bHQgYWRkcmVzcyBzcGFjZSkuIFRoZQorICAvLyBwb2ludGVlIG9mIGEgcG9pbnRlciBtdXN0IGhhdmUgbm9uLWRlZmF1bHQgYWRkcmVzcyBzcGFjZS4KKyAgb3BlbmNsX2dsb2JhbCwKKyAgb3BlbmNsX2xvY2FsLAorICBvcGVuY2xfY29uc3RhbnQsCisgIG9wZW5jbF9wcml2YXRlLAorICBvcGVuY2xfZ2VuZXJpYywKKworICAvLyBDVURBIHNwZWNpZmljIGFkZHJlc3Mgc3BhY2VzLgorICBjdWRhX2RldmljZSwKKyAgY3VkYV9jb25zdGFudCwKKyAgY3VkYV9zaGFyZWQsCisKKyAgLy8gVGhpcyBkZW5vdGVzIHRoZSBjb3VudCBvZiBsYW5ndWFnZS1zcGVjaWZpYyBhZGRyZXNzIHNwYWNlcyBhbmQgYWxzbworICAvLyB0aGUgb2Zmc2V0IGFkZGVkIHRvIHRoZSB0YXJnZXQtc3BlY2lmaWMgYWRkcmVzcyBzcGFjZXMsIHdoaWNoIGFyZSB1c3VhbGx5CisgIC8vIHNwZWNpZmllZCBieSBhZGRyZXNzIHNwYWNlIGF0dHJpYnV0ZXMgX19hdHRyaWJ1dGVfXyhhZGRyZXNzX3NwYWNlKG4pKSkuCisgIEZpcnN0VGFyZ2V0QWRkcmVzc1NwYWNlCit9OworCisvLy8gVGhlIHR5cGUgb2YgYSBsb29rdXAgdGFibGUgd2hpY2ggbWFwcyBmcm9tIGxhbmd1YWdlLXNwZWNpZmljIGFkZHJlc3Mgc3BhY2VzCisvLy8gdG8gdGFyZ2V0LXNwZWNpZmljIG9uZXMuCit1c2luZyBMYW5nQVNNYXAgPSB1bnNpZ25lZFsodW5zaWduZWQpTGFuZ0FTOjpGaXJzdFRhcmdldEFkZHJlc3NTcGFjZV07CisKKy8vLyBccmV0dXJuIHdoZXRoZXIgXHAgQVMgaXMgYSB0YXJnZXQtc3BlY2lmaWMgYWRkcmVzcyBzcGFjZSByYXRoZXIgdGhhbiBhCisvLy8gY2xhbmcgQVNUIGFkZHJlc3Mgc3BhY2UKK2lubGluZSBib29sIGlzVGFyZ2V0QWRkcmVzc1NwYWNlKExhbmdBUyBBUykgeworICByZXR1cm4gKHVuc2lnbmVkKUFTID49ICh1bnNpZ25lZClMYW5nQVM6OkZpcnN0VGFyZ2V0QWRkcmVzc1NwYWNlOworfQorCitpbmxpbmUgdW5zaWduZWQgdG9UYXJnZXRBZGRyZXNzU3BhY2UoTGFuZ0FTIEFTKSB7CisgIGFzc2VydChpc1RhcmdldEFkZHJlc3NTcGFjZShBUykpOworICByZXR1cm4gKHVuc2lnbmVkKUFTIC0gKHVuc2lnbmVkKUxhbmdBUzo6Rmlyc3RUYXJnZXRBZGRyZXNzU3BhY2U7Cit9CisKK2lubGluZSBMYW5nQVMgZ2V0TGFuZ0FTRnJvbVRhcmdldEFTKHVuc2lnbmVkIFRhcmdldEFTKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxMYW5nQVM+KChUYXJnZXRBUykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpTGFuZ0FTOjpGaXJzdFRhcmdldEFkZHJlc3NTcGFjZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0JBU0lDX0FERFJFU1NTUEFDRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQWxpZ25lZEFsbG9jYXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0FsaWduZWRBbGxvY2F0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0OTY5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0FsaWduZWRBbGxvY2F0aW9uLmgKQEAgLTAsMCArMSw0NCBAQAorLy89PT0tLS0gQWxpZ25lZEFsbG9jYXRpb24uaCAtIEFsaWduZWQgQWxsb2NhdGlvbiAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1pbmltdW0gT1MgdmVyc2lvbnMgc3VwcG9ydGluZworLy8vIEMrKzE3J3MgYWxpZ25lZCBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX0FMSUdORURfQUxMT0NBVElPTl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfQUxJR05FRF9BTExPQ0FUSU9OX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1ZlcnNpb25UdXBsZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2lubGluZSBWZXJzaW9uVHVwbGUgYWxpZ25lZEFsbG9jTWluVmVyc2lvbihsbHZtOjpUcmlwbGU6Ok9TVHlwZSBPUykgeworICBzd2l0Y2ggKE9TKSB7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIGNhc2UgbGx2bTo6VHJpcGxlOjpEYXJ3aW46CisgIGNhc2UgbGx2bTo6VHJpcGxlOjpNYWNPU1g6IC8vIEVhcmxpZXN0IHN1cHBvcnRpbmcgdmVyc2lvbiBpcyAxMC4xMy4KKyAgICByZXR1cm4gVmVyc2lvblR1cGxlKDEwVSwgMTNVKTsKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OklPUzoKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OlR2T1M6IC8vIEVhcmxpZXN0IHN1cHBvcnRpbmcgdmVyc2lvbiBpcyAxMS4wLjAuCisgICAgcmV0dXJuIFZlcnNpb25UdXBsZSgxMVUpOworICBjYXNlIGxsdm06OlRyaXBsZTo6V2F0Y2hPUzogLy8gRWFybGllc3Qgc3VwcG9ydGluZyB2ZXJzaW9uIGlzIDQuMC4wLgorICAgIHJldHVybiBWZXJzaW9uVHVwbGUoNFUpOworICB9CisKKyAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBPUyIpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQkFTSUNfQUxJR05FRF9BTExPQ0FUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0FsbERpYWdub3N0aWNzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9BbGxEaWFnbm9zdGljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjODNlMmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9BbGxEaWFnbm9zdGljcy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vPT09LS0tIEFsbERpYWdub3N0aWNzLmggLSBBZ2dyZWdhdGUgRGlhZ25vc3RpYyBoZWFkZXJzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBJbmNsdWRlcyBhbGwgdGhlIHNlcGFyYXRlIERpYWdub3N0aWMgaGVhZGVycyAmIHNvbWUgcmVsYXRlZCBoZWxwZXJzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfQUxMRElBR05PU1RJQ1NfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX0FMTERJQUdOT1NUSUNTX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BU1REaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0NvbW1lbnREaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQW5hbHlzaXNEaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvQ3Jvc3NUVS9Dcm9zc1RVRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL0RyaXZlci9Ecml2ZXJEaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmREaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L0xleERpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJjbGFuZy9QYXJzZS9QYXJzZURpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJjbGFuZy9TZW1hL1NlbWFEaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VyaWFsaXphdGlvbi9TZXJpYWxpemF0aW9uRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdEaWFnbm9zdGljLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7Cit0ZW1wbGF0ZSA8c2l6ZV90IFNpemVPZlN0ciwgdHlwZW5hbWUgRmllbGRUeXBlPgorY2xhc3MgU3RyaW5nU2l6ZXJIZWxwZXIgeworICBzdGF0aWNfYXNzZXJ0KFNpemVPZlN0ciA8PSBGaWVsZFR5cGUofjBVKSwgIkZpZWxkIHRvbyBzbWFsbCEiKTsKK3B1YmxpYzoKKyAgZW51bSB7IFNpemUgPSBTaXplT2ZTdHIgfTsKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcgCisKKyNkZWZpbmUgU1RSX1NJWkUoc3RyLCBmaWVsZFR5KSBjbGFuZzo6U3RyaW5nU2l6ZXJIZWxwZXI8c2l6ZW9mKHN0ciktMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFR5Pjo6U2l6ZSAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRySGFzQXR0cmlidXRlSW1wbC5pbmMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRySGFzQXR0cmlidXRlSW1wbC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkMmQxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHJIYXNBdHRyaWJ1dGVJbXBsLmluYwpAQCAtMCwwICsxLDc0OSBAQAorLyo9PT0tIFRhYmxlR2VuJ2VyYXRlZCBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBDb2RlIHRvIGltcGxlbWVudCB0aGUgX19oYXNfYXR0cmlidXRlIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGUsIGRvIG5vdCBlZGl0ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworY29uc3QgbGx2bTo6VHJpcGxlICZUID0gVGFyZ2V0LmdldFRyaXBsZSgpOworc3dpdGNoIChTeW50YXgpIHsKK2Nhc2UgQXR0clN5bnRheDo6R05VOgorICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPGludD4oTmFtZSkKKyAgICAuQ2FzZSgiYW1kZ3B1X2ZsYXRfd29ya19ncm91cF9zaXplIiwgMSkKKyAgICAuQ2FzZSgiYW1kZ3B1X251bV9zZ3ByIiwgMSkKKyAgICAuQ2FzZSgiYW1kZ3B1X251bV92Z3ByIiwgMSkKKyAgICAuQ2FzZSgiYW1kZ3B1X3dhdmVzX3Blcl9ldSIsIDEpCisgICAgLkNhc2UoImludGVycnVwdCIsIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6dGh1bWIgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphcm1lYiB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OnRodW1iZWIpID8gMSA6IDApCisgICAgLkNhc2UoImludGVycnVwdCIsIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXZyKSA/IDEgOiAwKQorICAgIC5DYXNlKCJzaWduYWwiLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmF2cikgPyAxIDogMCkKKyAgICAuQ2FzZSgiYWJpX3RhZyIsIDEpCisgICAgLkNhc2UoImFjcXVpcmVfY2FwYWJpbGl0eSIsIDEpCisgICAgLkNhc2UoImFjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJleGNsdXNpdmVfbG9ja19mdW5jdGlvbiIsIDEpCisgICAgLkNhc2UoInNoYXJlZF9sb2NrX2Z1bmN0aW9uIiwgMSkKKyAgICAuQ2FzZSgiYWNxdWlyZV9jYXBhYmlsaXR5IiwgMSkKKyAgICAuQ2FzZSgiYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSIsIDEpCisgICAgLkNhc2UoImV4Y2x1c2l2ZV9sb2NrX2Z1bmN0aW9uIiwgMSkKKyAgICAuQ2FzZSgic2hhcmVkX2xvY2tfZnVuY3Rpb24iLCAxKQorICAgIC5DYXNlKCJhY3F1aXJlX2NhcGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJhY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5IiwgMSkKKyAgICAuQ2FzZSgiZXhjbHVzaXZlX2xvY2tfZnVuY3Rpb24iLCAxKQorICAgIC5DYXNlKCJzaGFyZWRfbG9ja19mdW5jdGlvbiIsIDEpCisgICAgLkNhc2UoImFjcXVpcmVfY2FwYWJpbGl0eSIsIDEpCisgICAgLkNhc2UoImFjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJleGNsdXNpdmVfbG9ja19mdW5jdGlvbiIsIDEpCisgICAgLkNhc2UoInNoYXJlZF9sb2NrX2Z1bmN0aW9uIiwgMSkKKyAgICAuQ2FzZSgiYWNxdWlyZWRfYWZ0ZXIiLCAxKQorICAgIC5DYXNlKCJhY3F1aXJlZF9iZWZvcmUiLCAxKQorICAgIC5DYXNlKCJhZGRyZXNzX3NwYWNlIiwgMSkKKyAgICAuQ2FzZSgiYWxpYXMiLCAxKQorICAgIC5DYXNlKCJhbGlnbl92YWx1ZSIsIDEpCisgICAgLkNhc2UoImFsaWduZWQiLCAxKQorICAgIC5DYXNlKCJhbGxvY19hbGlnbiIsIDEpCisgICAgLkNhc2UoImFsbG9jX3NpemUiLCAxKQorICAgIC5DYXNlKCJhbHdheXNfaW5saW5lIiwgMSkKKyAgICAuQ2FzZSgiYW5hbHl6ZXJfbm9yZXR1cm4iLCAxKQorICAgIC5DYXNlKCJhbm5vdGF0ZSIsIDEpCisgICAgLkNhc2UoImludGVycnVwdCIsIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2IHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2XzY0KSA/IDEgOiAwKQorICAgIC5DYXNlKCJub19jYWxsZXJfc2F2ZWRfcmVnaXN0ZXJzIiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODZfNjQpID8gMSA6IDApCisgICAgLkNhc2UoIm5vY2ZfY2hlY2siLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4NiB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4Nl82NCkgPyAxIDogMCkKKyAgICAuQ2FzZSgib2JqY19hcmNfd2Vha19yZWZlcmVuY2VfdW5hdmFpbGFibGUiLCAxKQorICAgIC5DYXNlKCJhcmd1bWVudF93aXRoX3R5cGVfdGFnIiwgMSkKKyAgICAuQ2FzZSgicG9pbnRlcl93aXRoX3R5cGVfdGFnIiwgMSkKKyAgICAuQ2FzZSgiYXJndW1lbnRfd2l0aF90eXBlX3RhZyIsIDEpCisgICAgLkNhc2UoInBvaW50ZXJfd2l0aF90eXBlX3RhZyIsIDEpCisgICAgLkNhc2UoImFydGlmaWNpYWwiLCAxKQorICAgIC5DYXNlKCJhc3NlcnRfY2FwYWJpbGl0eSIsIDEpCisgICAgLkNhc2UoImFzc2VydF9zaGFyZWRfY2FwYWJpbGl0eSIsIDEpCisgICAgLkNhc2UoImFzc2VydF9jYXBhYmlsaXR5IiwgMSkKKyAgICAuQ2FzZSgiYXNzZXJ0X3NoYXJlZF9jYXBhYmlsaXR5IiwgMSkKKyAgICAuQ2FzZSgiYXNzZXJ0X2V4Y2x1c2l2ZV9sb2NrIiwgMSkKKyAgICAuQ2FzZSgiYXNzZXJ0X3NoYXJlZF9sb2NrIiwgMSkKKyAgICAuQ2FzZSgiYXNzdW1lX2FsaWduZWQiLCAxKQorICAgIC5DYXNlKCJhdmFpbGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJibG9ja3MiLCAxKQorICAgIC5DYXNlKCJib3VuZGVkIiwgMSkKKyAgICAuQ2FzZSgiY2RlY2wiLCAxKQorICAgIC5DYXNlKCJjZl9hdWRpdGVkX3RyYW5zZmVyIiwgMSkKKyAgICAuQ2FzZSgiY2ZfY29uc3VtZWQiLCAxKQorICAgIC5DYXNlKCJjZl9yZXR1cm5zX25vdF9yZXRhaW5lZCIsIDEpCisgICAgLkNhc2UoImNmX3JldHVybnNfcmV0YWluZWQiLCAxKQorICAgIC5DYXNlKCJjZl91bmtub3duX3RyYW5zZmVyIiwgMSkKKyAgICAuQ2FzZSgiY29uc3RhbnQiLCAxKQorICAgIC5DYXNlKCJjdWRhcnRfYnVpbHRpbiIsIDEpCisgICAgLkNhc2UoImRldmljZSIsIDEpCisgICAgLkNhc2UoImRldmljZV9idWlsdGluIiwgMSkKKyAgICAuQ2FzZSgiZGV2aWNlX2J1aWx0aW5fc3VyZmFjZV90eXBlIiwgMSkKKyAgICAuQ2FzZSgiZGV2aWNlX2J1aWx0aW5fdGV4dHVyZV90eXBlIiwgMSkKKyAgICAuQ2FzZSgiZ2xvYmFsIiwgMSkKKyAgICAuQ2FzZSgiaG9zdCIsIDEpCisgICAgLkNhc2UoImxhdW5jaF9ib3VuZHMiLCAxKQorICAgIC5DYXNlKCJzaGFyZWQiLCAxKQorICAgIC5DYXNlKCJjYWxsYWJsZV93aGVuIiwgMSkKKyAgICAuQ2FzZSgiY2FwYWJpbGl0eSIsIDEpCisgICAgLkNhc2UoInNoYXJlZF9jYXBhYmlsaXR5IiwgMSkKKyAgICAuQ2FzZSgiY2FwYWJpbGl0eSIsIDEpCisgICAgLkNhc2UoInNoYXJlZF9jYXBhYmlsaXR5IiwgMSkKKyAgICAuQ2FzZSgiY2Fycmllc19kZXBlbmRlbmN5IiwgMSkKKyAgICAuQ2FzZSgiY2xlYW51cCIsIDEpCisgICAgLkNhc2UoImNvbGQiLCAxKQorICAgIC5DYXNlKCJjb21tb24iLCAxKQorICAgIC5DYXNlKCJjb25zdCIsIDEpCisgICAgLkNhc2UoIl9fY29uc3QiLCAxKQorICAgIC5DYXNlKCJjb25zdCIsIDEpCisgICAgLkNhc2UoIl9fY29uc3QiLCAxKQorICAgIC5DYXNlKCJjb25zdHJ1Y3RvciIsIDEpCisgICAgLkNhc2UoImNvbnN1bWFibGUiLCAxKQorICAgIC5DYXNlKCJjb25zdW1hYmxlX2F1dG9fY2FzdF9zdGF0ZSIsIDEpCisgICAgLkNhc2UoImNvbnN1bWFibGVfc2V0X3N0YXRlX29uX3JlYWQiLCAxKQorICAgIC5DYXNlKCJjb252ZXJnZW50IiwgMSkKKyAgICAuQ2FzZSgiZGxsZXhwb3J0IiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODZfNjQgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphcm0gfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp0aHVtYiB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFhcmNoNjQpICYmIChULmdldE9TKCkgPT0gbGx2bTo6VHJpcGxlOjpXaW4zMikgPyAxIDogMCkKKyAgICAuQ2FzZSgiZGxsaW1wb3J0IiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODZfNjQgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphcm0gfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp0aHVtYiB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFhcmNoNjQpICYmIChULmdldE9TKCkgPT0gbGx2bTo6VHJpcGxlOjpXaW4zMikgPyAxIDogMCkKKyAgICAuQ2FzZSgiZGVwcmVjYXRlZCIsIDEpCisgICAgLkNhc2UoImRlc3RydWN0b3IiLCAxKQorICAgIC5DYXNlKCJkaWFnbm9zZV9pZiIsIDEpCisgICAgLkNhc2UoImRpc2FibGVfdGFpbF9jYWxscyIsIDEpCisgICAgLkNhc2UoImVuYWJsZV9pZiIsIDEpCisgICAgLkNhc2UoImVudW1fZXh0ZW5zaWJpbGl0eSIsIDEpCisgICAgLkNhc2UoImV4Y2x1c2l2ZV90cnlsb2NrX2Z1bmN0aW9uIiwgMSkKKyAgICAuQ2FzZSgiZXh0X3ZlY3Rvcl90eXBlIiwgMSkKKyAgICAuQ2FzZSgiZXh0ZXJuYWxfc291cmNlX3N5bWJvbCIsIDEpCisgICAgLkNhc2UoImZhc3RjYWxsIiwgMSkKKyAgICAuQ2FzZSgiZmxhZ19lbnVtIiwgMSkKKyAgICAuQ2FzZSgiZmxhdHRlbiIsIDEpCisgICAgLkNhc2UoImZvcm1hdCIsIDEpCisgICAgLkNhc2UoImZvcm1hdF9hcmciLCAxKQorICAgIC5DYXNlKCJnbnVfaW5saW5lIiwgMSkKKyAgICAuQ2FzZSgiZ3VhcmRlZF9ieSIsIDEpCisgICAgLkNhc2UoImd1YXJkZWRfdmFyIiwgMSkKKyAgICAuQ2FzZSgiaG90IiwgMSkKKyAgICAuQ2FzZSgiaWJhY3Rpb24iLCAxKQorICAgIC5DYXNlKCJpYm91dGxldCIsIDEpCisgICAgLkNhc2UoImlib3V0bGV0Y29sbGVjdGlvbiIsIDEpCisgICAgLkNhc2UoImlmdW5jIiwgdHJ1ZSAmJiAoVC5nZXRPYmplY3RGb3JtYXQoKSA9PSBsbHZtOjpUcmlwbGU6OkVMRikgPyAxIDogMCkKKyAgICAuQ2FzZSgiaW5pdF9wcmlvcml0eSIsIDEpCisgICAgLkNhc2UoImludGVsX29jbF9iaWNjIiwgMSkKKyAgICAuQ2FzZSgiaW50ZXJuYWxfbGlua2FnZSIsIDEpCisgICAgLkNhc2UoImx0b192aXNpYmlsaXR5X3B1YmxpYyIsIDEpCisgICAgLkNhc2UoImxvY2tfcmV0dXJuZWQiLCAxKQorICAgIC5DYXNlKCJsb2NrYWJsZSIsIDEpCisgICAgLkNhc2UoImxvY2tzX2V4Y2x1ZGVkIiwgMSkKKyAgICAuQ2FzZSgibXNfYWJpIiwgMSkKKyAgICAuQ2FzZSgiaW50ZXJydXB0IiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptc3A0MzApID8gMSA6IDApCisgICAgLkNhc2UoIm1zX3N0cnVjdCIsIDEpCisgICAgLkNhc2UoIm1heV9hbGlhcyIsIDEpCisgICAgLkNhc2UoIm1pY3JvbWlwcyIsIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwcyB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHNlbCkgPyAxIDogMCkKKyAgICAuQ2FzZSgibWluc2l6ZSIsIDEpCisgICAgLkNhc2UoIm1pcHMxNiIsIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwcyB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHNlbCkgPyAxIDogMCkKKyAgICAuQ2FzZSgiaW50ZXJydXB0IiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwc2VsKSA/IDEgOiAwKQorICAgIC5DYXNlKCJsb25nX2NhbGwiLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHMgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzZWwgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzNjQgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzNjRlbCkgPyAxIDogMCkKKyAgICAuQ2FzZSgiZmFyIiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwc2VsIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwczY0IHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwczY0ZWwpID8gMSA6IDApCisgICAgLkNhc2UoImxvbmdfY2FsbCIsIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwcyB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHNlbCB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHM2NCB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHM2NGVsKSA/IDEgOiAwKQorICAgIC5DYXNlKCJmYXIiLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHMgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzZWwgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzNjQgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzNjRlbCkgPyAxIDogMCkKKyAgICAuQ2FzZSgic2hvcnRfY2FsbCIsIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwcyB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHNlbCB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHM2NCB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHM2NGVsKSA/IDEgOiAwKQorICAgIC5DYXNlKCJuZWFyIiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwc2VsIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwczY0IHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwczY0ZWwpID8gMSA6IDApCisgICAgLkNhc2UoInNob3J0X2NhbGwiLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHMgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzZWwgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzNjQgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzNjRlbCkgPyAxIDogMCkKKyAgICAuQ2FzZSgibmVhciIsIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwcyB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHNlbCB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHM2NCB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHM2NGVsKSA/IDEgOiAwKQorICAgIC5DYXNlKCJtb2RlIiwgMSkKKyAgICAuQ2FzZSgibnNfY29uc3VtZWQiLCAxKQorICAgIC5DYXNlKCJuc19jb25zdW1lc19zZWxmIiwgMSkKKyAgICAuQ2FzZSgibnNfcmV0dXJuc19hdXRvcmVsZWFzZWQiLCAxKQorICAgIC5DYXNlKCJuc19yZXR1cm5zX25vdF9yZXRhaW5lZCIsIDEpCisgICAgLkNhc2UoIm5zX3JldHVybnNfcmV0YWluZWQiLCAxKQorICAgIC5DYXNlKCJuYWtlZCIsIDEpCisgICAgLkNhc2UoIm5lb25fcG9seXZlY3Rvcl90eXBlIiwgMSkKKyAgICAuQ2FzZSgibmVvbl92ZWN0b3JfdHlwZSIsIDEpCisgICAgLkNhc2UoIm5vY29tbW9uIiwgMSkKKyAgICAuQ2FzZSgibm9kZWJ1ZyIsIDEpCisgICAgLkNhc2UoIm5vZHVwbGljYXRlIiwgMSkKKyAgICAuQ2FzZSgibm9lc2NhcGUiLCAxKQorICAgIC5DYXNlKCJub2lubGluZSIsIDEpCisgICAgLkNhc2UoIm5vX2luc3RydW1lbnRfZnVuY3Rpb24iLCAxKQorICAgIC5DYXNlKCJub21pY3JvbWlwcyIsIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwcyB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHNlbCkgPyAxIDogMCkKKyAgICAuQ2FzZSgibm9taXBzMTYiLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHMgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzZWwpID8gMSA6IDApCisgICAgLkNhc2UoIm5vcmV0dXJuIiwgMSkKKyAgICAuQ2FzZSgibm9fc2FuaXRpemUiLCAxKQorICAgIC5DYXNlKCJub19hZGRyZXNzX3NhZmV0eV9hbmFseXNpcyIsIDEpCisgICAgLkNhc2UoIm5vX3Nhbml0aXplX2FkZHJlc3MiLCAxKQorICAgIC5DYXNlKCJub19zYW5pdGl6ZV90aHJlYWQiLCAxKQorICAgIC5DYXNlKCJub19zYW5pdGl6ZV9tZW1vcnkiLCAxKQorICAgIC5DYXNlKCJub19hZGRyZXNzX3NhZmV0eV9hbmFseXNpcyIsIDEpCisgICAgLkNhc2UoIm5vX3Nhbml0aXplX2FkZHJlc3MiLCAxKQorICAgIC5DYXNlKCJub19zYW5pdGl6ZV90aHJlYWQiLCAxKQorICAgIC5DYXNlKCJub19zYW5pdGl6ZV9tZW1vcnkiLCAxKQorICAgIC5DYXNlKCJub19hZGRyZXNzX3NhZmV0eV9hbmFseXNpcyIsIDEpCisgICAgLkNhc2UoIm5vX3Nhbml0aXplX2FkZHJlc3MiLCAxKQorICAgIC5DYXNlKCJub19zYW5pdGl6ZV90aHJlYWQiLCAxKQorICAgIC5DYXNlKCJub19zYW5pdGl6ZV9tZW1vcnkiLCAxKQorICAgIC5DYXNlKCJub19hZGRyZXNzX3NhZmV0eV9hbmFseXNpcyIsIDEpCisgICAgLkNhc2UoIm5vX3Nhbml0aXplX2FkZHJlc3MiLCAxKQorICAgIC5DYXNlKCJub19zYW5pdGl6ZV90aHJlYWQiLCAxKQorICAgIC5DYXNlKCJub19zYW5pdGl6ZV9tZW1vcnkiLCAxKQorICAgIC5DYXNlKCJub19zcGxpdF9zdGFjayIsIDEpCisgICAgLkNhc2UoIm5vX3RocmVhZF9zYWZldHlfYW5hbHlzaXMiLCAxKQorICAgIC5DYXNlKCJub3Rocm93IiwgMSkKKyAgICAuQ2FzZSgibm9ubnVsbCIsIDEpCisgICAgLkNhc2UoIm5vdF90YWlsX2NhbGxlZCIsIDEpCisgICAgLkNhc2UoIm52X3dlYWsiLCAxKQorICAgIC5DYXNlKCJvYmpjX2JveGFibGUiLCAxKQorICAgIC5DYXNlKCJvYmpjX2JyaWRnZSIsIDEpCisgICAgLkNhc2UoIm9iamNfYnJpZGdlX211dGFibGUiLCAxKQorICAgIC5DYXNlKCJvYmpjX2JyaWRnZV9yZWxhdGVkIiwgMSkKKyAgICAuQ2FzZSgib2JqY19kZXNpZ25hdGVkX2luaXRpYWxpemVyIiwgMSkKKyAgICAuQ2FzZSgib2JqY19leGNlcHRpb24iLCAxKQorICAgIC5DYXNlKCJvYmpjX3Byb3RvY29sX3JlcXVpcmVzX2V4cGxpY2l0X2ltcGxlbWVudGF0aW9uIiwgMSkKKyAgICAuQ2FzZSgib2JqY19nYyIsIDEpCisgICAgLkNhc2UoIm9iamNfaW5kZXBlbmRlbnRfY2xhc3MiLCAxKQorICAgIC5DYXNlKCJvYmpjX21ldGhvZF9mYW1pbHkiLCAxKQorICAgIC5DYXNlKCJOU09iamVjdCIsIDEpCisgICAgLkNhc2UoIm9iamNfb3duZXJzaGlwIiwgMSkKKyAgICAuQ2FzZSgib2JqY19wcmVjaXNlX2xpZmV0aW1lIiwgMSkKKyAgICAuQ2FzZSgib2JqY19yZXF1aXJlc19wcm9wZXJ0eV9kZWZpbml0aW9ucyIsIDEpCisgICAgLkNhc2UoIm9iamNfcmVxdWlyZXNfc3VwZXIiLCAxKQorICAgIC5DYXNlKCJvYmpjX3JldHVybnNfaW5uZXJfcG9pbnRlciIsIDEpCisgICAgLkNhc2UoIm9iamNfcm9vdF9jbGFzcyIsIDEpCisgICAgLkNhc2UoIm9iamNfcnVudGltZV9uYW1lIiwgMSkKKyAgICAuQ2FzZSgib2JqY19ydW50aW1lX3Zpc2libGUiLCAxKQorICAgIC5DYXNlKCJvYmpjX3N1YmNsYXNzaW5nX3Jlc3RyaWN0ZWQiLCAxKQorICAgIC5DYXNlKCJpbnRlbF9yZXFkX3N1Yl9ncm91cF9zaXplIiwgMSkKKyAgICAuQ2FzZSgibm9zdm0iLCAxKQorICAgIC5DYXNlKCJvcGVuY2xfdW5yb2xsX2hpbnQiLCAxKQorICAgIC5DYXNlKCJvcHRub25lIiwgMSkKKyAgICAuQ2FzZSgib3ZlcmxvYWRhYmxlIiwgMSkKKyAgICAuQ2FzZSgib3duZXJzaGlwX2hvbGRzIiwgMSkKKyAgICAuQ2FzZSgib3duZXJzaGlwX3JldHVybnMiLCAxKQorICAgIC5DYXNlKCJvd25lcnNoaXBfdGFrZXMiLCAxKQorICAgIC5DYXNlKCJvd25lcnNoaXBfaG9sZHMiLCAxKQorICAgIC5DYXNlKCJvd25lcnNoaXBfcmV0dXJucyIsIDEpCisgICAgLkNhc2UoIm93bmVyc2hpcF90YWtlcyIsIDEpCisgICAgLkNhc2UoIm93bmVyc2hpcF9ob2xkcyIsIDEpCisgICAgLkNhc2UoIm93bmVyc2hpcF9yZXR1cm5zIiwgMSkKKyAgICAuQ2FzZSgib3duZXJzaGlwX3Rha2VzIiwgMSkKKyAgICAuQ2FzZSgicGFja2VkIiwgMSkKKyAgICAuQ2FzZSgicGFyYW1fdHlwZXN0YXRlIiwgMSkKKyAgICAuQ2FzZSgicGFzY2FsIiwgMSkKKyAgICAuQ2FzZSgicGFzc19vYmplY3Rfc2l6ZSIsIDEpCisgICAgLkNhc2UoInBjcyIsIDEpCisgICAgLkNhc2UoInByZXNlcnZlX2FsbCIsIDEpCisgICAgLkNhc2UoInByZXNlcnZlX21vc3QiLCAxKQorICAgIC5DYXNlKCJwdF9ndWFyZGVkX2J5IiwgMSkKKyAgICAuQ2FzZSgicHRfZ3VhcmRlZF92YXIiLCAxKQorICAgIC5DYXNlKCJwdXJlIiwgMSkKKyAgICAuQ2FzZSgicmVnY2FsbCIsIDEpCisgICAgLkNhc2UoInJlZ3Bhcm0iLCAxKQorICAgIC5DYXNlKCJyZWxlYXNlX2NhcGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5IiwgMSkKKyAgICAuQ2FzZSgicmVsZWFzZV9nZW5lcmljX2NhcGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJ1bmxvY2tfZnVuY3Rpb24iLCAxKQorICAgIC5DYXNlKCJyZWxlYXNlX2NhcGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5IiwgMSkKKyAgICAuQ2FzZSgicmVsZWFzZV9nZW5lcmljX2NhcGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJ1bmxvY2tfZnVuY3Rpb24iLCAxKQorICAgIC5DYXNlKCJyZWxlYXNlX2NhcGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5IiwgMSkKKyAgICAuQ2FzZSgicmVsZWFzZV9nZW5lcmljX2NhcGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJ1bmxvY2tfZnVuY3Rpb24iLCAxKQorICAgIC5DYXNlKCJyZWxlYXNlX2NhcGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5IiwgMSkKKyAgICAuQ2FzZSgicmVsZWFzZV9nZW5lcmljX2NhcGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJ1bmxvY2tfZnVuY3Rpb24iLCAxKQorICAgIC5DYXNlKCJrZXJuZWwiLCAxKQorICAgIC5DYXNlKCJyZXFkX3dvcmtfZ3JvdXBfc2l6ZSIsIDEpCisgICAgLkNhc2UoInJlcXVpcmVfY29uc3RhbnRfaW5pdGlhbGl6YXRpb24iLCAxKQorICAgIC5DYXNlKCJyZXF1aXJlc19jYXBhYmlsaXR5IiwgMSkKKyAgICAuQ2FzZSgiZXhjbHVzaXZlX2xvY2tzX3JlcXVpcmVkIiwgMSkKKyAgICAuQ2FzZSgicmVxdWlyZXNfc2hhcmVkX2NhcGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJzaGFyZWRfbG9ja3NfcmVxdWlyZWQiLCAxKQorICAgIC5DYXNlKCJyZXF1aXJlc19jYXBhYmlsaXR5IiwgMSkKKyAgICAuQ2FzZSgiZXhjbHVzaXZlX2xvY2tzX3JlcXVpcmVkIiwgMSkKKyAgICAuQ2FzZSgicmVxdWlyZXNfc2hhcmVkX2NhcGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJzaGFyZWRfbG9ja3NfcmVxdWlyZWQiLCAxKQorICAgIC5DYXNlKCJyZXF1aXJlc19jYXBhYmlsaXR5IiwgMSkKKyAgICAuQ2FzZSgiZXhjbHVzaXZlX2xvY2tzX3JlcXVpcmVkIiwgMSkKKyAgICAuQ2FzZSgicmVxdWlyZXNfc2hhcmVkX2NhcGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJzaGFyZWRfbG9ja3NfcmVxdWlyZWQiLCAxKQorICAgIC5DYXNlKCJyZXF1aXJlc19jYXBhYmlsaXR5IiwgMSkKKyAgICAuQ2FzZSgiZXhjbHVzaXZlX2xvY2tzX3JlcXVpcmVkIiwgMSkKKyAgICAuQ2FzZSgicmVxdWlyZXNfc2hhcmVkX2NhcGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJzaGFyZWRfbG9ja3NfcmVxdWlyZWQiLCAxKQorICAgIC5DYXNlKCJtYWxsb2MiLCAxKQorICAgIC5DYXNlKCJyZXR1cm5fdHlwZXN0YXRlIiwgMSkKKyAgICAuQ2FzZSgicmV0dXJuc19ub25udWxsIiwgMSkKKyAgICAuQ2FzZSgicmV0dXJuc190d2ljZSIsIDEpCisgICAgLkNhc2UoInNjb3BlZF9sb2NrYWJsZSIsIDEpCisgICAgLkNhc2UoInNlY3Rpb24iLCAxKQorICAgIC5DYXNlKCJzZWxlY3RhbnkiLCAxKQorICAgIC5DYXNlKCJzZW50aW5lbCIsIDEpCisgICAgLkNhc2UoInNldF90eXBlc3RhdGUiLCAxKQorICAgIC5DYXNlKCJzaGFyZWRfdHJ5bG9ja19mdW5jdGlvbiIsIDEpCisgICAgLkNhc2UoInN0ZGNhbGwiLCAxKQorICAgIC5DYXNlKCJzd2lmdGNhbGwiLCAxKQorICAgIC5DYXNlKCJzd2lmdF9jb250ZXh0IiwgMSkKKyAgICAuQ2FzZSgic3dpZnRfZXJyb3JfcmVzdWx0IiwgMSkKKyAgICAuQ2FzZSgic3dpZnRfaW5kaXJlY3RfcmVzdWx0IiwgMSkKKyAgICAuQ2FzZSgic3lzdl9hYmkiLCAxKQorICAgIC5DYXNlKCJ0bHNfbW9kZWwiLCAxKQorICAgIC5DYXNlKCJ0YXJnZXQiLCAxKQorICAgIC5DYXNlKCJ0ZXN0X3R5cGVzdGF0ZSIsIDEpCisgICAgLkNhc2UoInRoaXNjYWxsIiwgMSkKKyAgICAuQ2FzZSgidHJhbnNwYXJlbnRfdW5pb24iLCAxKQorICAgIC5DYXNlKCJ0cml2aWFsX2FiaSIsIDEpCisgICAgLkNhc2UoInRyeV9hY3F1aXJlX2NhcGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJ0cnlfYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSIsIDEpCisgICAgLkNhc2UoInRyeV9hY3F1aXJlX2NhcGFiaWxpdHkiLCAxKQorICAgIC5DYXNlKCJ0cnlfYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSIsIDEpCisgICAgLkNhc2UoInR5cGVfdGFnX2Zvcl9kYXRhdHlwZSIsIDEpCisgICAgLkNhc2UoInR5cGVfdmlzaWJpbGl0eSIsIDEpCisgICAgLkNhc2UoInVuYXZhaWxhYmxlIiwgMSkKKyAgICAuQ2FzZSgidW51c2VkIiwgMSkKKyAgICAuQ2FzZSgidXNlZCIsIDEpCisgICAgLkNhc2UoInZlY3JldHVybiIsIDEpCisgICAgLkNhc2UoInZlY190eXBlX2hpbnQiLCAxKQorICAgIC5DYXNlKCJ2ZWN0b3JjYWxsIiwgMSkKKyAgICAuQ2FzZSgidmVjdG9yX3NpemUiLCAxKQorICAgIC5DYXNlKCJ2aXNpYmlsaXR5IiwgMSkKKyAgICAuQ2FzZSgid2Fybl91bnVzZWQiLCAxKQorICAgIC5DYXNlKCJ3YXJuX3VudXNlZF9yZXN1bHQiLCAxKQorICAgIC5DYXNlKCJ3ZWFrIiwgMSkKKyAgICAuQ2FzZSgid2Vha19pbXBvcnQiLCAxKQorICAgIC5DYXNlKCJ3ZWFrcmVmIiwgMSkKKyAgICAuQ2FzZSgid29ya19ncm91cF9zaXplX2hpbnQiLCAxKQorICAgIC5DYXNlKCJmb3JjZV9hbGlnbl9hcmdfcG9pbnRlciIsIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2IHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2XzY0KSA/IDEgOiAwKQorICAgIC5DYXNlKCJ4cmF5X2Fsd2F5c19pbnN0cnVtZW50IiwgMSkKKyAgICAuQ2FzZSgieHJheV9uZXZlcl9pbnN0cnVtZW50IiwgMSkKKyAgICAuQ2FzZSgieHJheV9hbHdheXNfaW5zdHJ1bWVudCIsIDEpCisgICAgLkNhc2UoInhyYXlfbmV2ZXJfaW5zdHJ1bWVudCIsIDEpCisgICAgLkNhc2UoInhyYXlfbG9nX2FyZ3MiLCAxKQorICAgIC5EZWZhdWx0KDApOworY2FzZSBBdHRyU3ludGF4OjpEZWNsc3BlYzoKKyAgcmV0dXJuIGxsdm06OlN0cmluZ1N3aXRjaDxpbnQ+KE5hbWUpCisgICAgLkNhc2UoImFsaWduIiwgMSkKKyAgICAuQ2FzZSgiX19jb25zdGFudF9fIiwgMSkKKyAgICAuQ2FzZSgiX19jdWRhcnRfYnVpbHRpbl9fIiwgMSkKKyAgICAuQ2FzZSgiX19kZXZpY2VfXyIsIDEpCisgICAgLkNhc2UoIl9fZGV2aWNlX2J1aWx0aW5fXyIsIDEpCisgICAgLkNhc2UoIl9fZGV2aWNlX2J1aWx0aW5fc3VyZmFjZV90eXBlX18iLCAxKQorICAgIC5DYXNlKCJfX2RldmljZV9idWlsdGluX3RleHR1cmVfdHlwZV9fIiwgMSkKKyAgICAuQ2FzZSgiX19nbG9iYWxfXyIsIDEpCisgICAgLkNhc2UoIl9faG9zdF9fIiwgMSkKKyAgICAuQ2FzZSgiX19sYXVuY2hfYm91bmRzX18iLCAxKQorICAgIC5DYXNlKCJfX3NoYXJlZF9fIiwgMSkKKyAgICAuQ2FzZSgiZGxsZXhwb3J0IiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODZfNjQgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphcm0gfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp0aHVtYiB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFhcmNoNjQpICYmIChULmdldE9TKCkgPT0gbGx2bTo6VHJpcGxlOjpXaW4zMikgPyAxIDogMCkKKyAgICAuQ2FzZSgiZGxsaW1wb3J0IiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODZfNjQgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphcm0gfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp0aHVtYiB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFhcmNoNjQpICYmIChULmdldE9TKCkgPT0gbGx2bTo6VHJpcGxlOjpXaW4zMikgPyAxIDogMCkKKyAgICAuQ2FzZSgiZGVwcmVjYXRlZCIsIDEpCisgICAgLkNhc2UoImVtcHR5X2Jhc2VzIiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODZfNjQgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphcm0gfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp0aHVtYiB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFhcmNoNjQpICYmIChUYXJnZXQuZ2V0Q1hYQUJJKCkuZ2V0S2luZCgpID09IFRhcmdldENYWEFCSTo6TWljcm9zb2Z0KSA/IDEgOiAwKQorICAgIC5DYXNlKCJsYXlvdXRfdmVyc2lvbiIsIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2IHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2XzY0IHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6dGh1bWIgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphYXJjaDY0KSAmJiAoVGFyZ2V0LmdldENYWEFCSSgpLmdldEtpbmQoKSA9PSBUYXJnZXRDWFhBQkk6Ok1pY3Jvc29mdCkgPyAxIDogMCkKKyAgICAuQ2FzZSgibm92dGFibGUiLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4NiB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4Nl82NCB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybSB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OnRodW1iIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YWFyY2g2NCkgJiYgKFRhcmdldC5nZXRDWFhBQkkoKS5nZXRLaW5kKCkgPT0gVGFyZ2V0Q1hYQUJJOjpNaWNyb3NvZnQpID8gMSA6IDApCisgICAgLkNhc2UoIm5ha2VkIiwgMSkKKyAgICAuQ2FzZSgibm9hbGlhcyIsIDEpCisgICAgLkNhc2UoIm5vaW5saW5lIiwgMSkKKyAgICAuQ2FzZSgibm9yZXR1cm4iLCAxKQorICAgIC5DYXNlKCJub3Rocm93IiwgMSkKKyAgICAuQ2FzZSgicmVzdHJpY3QiLCAxKQorICAgIC5DYXNlKCJhbGxvY2F0ZSIsIDEpCisgICAgLkNhc2UoInNlbGVjdGFueSIsIDEpCisgICAgLkNhc2UoInRocmVhZCIsIDEpCisgICAgLkNhc2UoInV1aWQiLCAxKQorICAgIC5DYXNlKCJwcm9wZXJ0eSIsIDEpCisgICAgLkRlZmF1bHQoMCk7CitjYXNlIEF0dHJTeW50YXg6Ok1pY3Jvc29mdDoKKyAgcmV0dXJuIGxsdm06OlN0cmluZ1N3aXRjaDxpbnQ+KE5hbWUpCisgICAgLkNhc2UoInV1aWQiLCAxKQorICAgIC5EZWZhdWx0KDApOworY2FzZSBBdHRyU3ludGF4OjpQcmFnbWE6CisgIHJldHVybiBsbHZtOjpTdHJpbmdTd2l0Y2g8aW50PihOYW1lKQorICAgIC5DYXNlKCJpbml0X3NlZyIsIDEpCisgICAgLkNhc2UoImxvb3AiLCAxKQorICAgIC5DYXNlKCJ1bnJvbGwiLCAxKQorICAgIC5DYXNlKCJub3Vucm9sbCIsIDEpCisgICAgLkNhc2UoImxvb3AiLCAxKQorICAgIC5DYXNlKCJ1bnJvbGwiLCAxKQorICAgIC5DYXNlKCJub3Vucm9sbCIsIDEpCisgICAgLkNhc2UoImxvb3AiLCAxKQorICAgIC5DYXNlKCJ1bnJvbGwiLCAxKQorICAgIC5DYXNlKCJub3Vucm9sbCIsIDEpCisgICAgLkNhc2UoImRlY2xhcmUgc2ltZCIsIDEpCisgICAgLkNhc2UoImRlY2xhcmUgdGFyZ2V0IiwgMSkKKyAgICAuRGVmYXVsdCgwKTsKK2Nhc2UgQXR0clN5bnRheDo6Q1hYOiB7CitpZiAoIVNjb3BlIHx8IFNjb3BlLT5nZXROYW1lKCkgPT0gIiIpIHsKKyAgcmV0dXJuIGxsdm06OlN0cmluZ1N3aXRjaDxpbnQ+KE5hbWUpCisgICAgLkNhc2UoIm5vcmV0dXJuIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAyMDA4MDkgOiAwKQorICAgIC5DYXNlKCJjYXJyaWVzX2RlcGVuZGVuY3kiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDIwMDgwOSA6IDApCisgICAgLkNhc2UoImRlcHJlY2F0ZWQiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDIwMTMwOSA6IDApCisgICAgLkNhc2UoImRlcHJlY2F0ZWQiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDIwMTMwOSA6IDApCisgICAgLkNhc2UoImZhbGx0aHJvdWdoIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAyMDE2MDMgOiAwKQorICAgIC5DYXNlKCJmYWxsdGhyb3VnaCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMjAxNjAzIDogMCkKKyAgICAuQ2FzZSgibWF5YmVfdW51c2VkIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAyMDE2MDMgOiAwKQorICAgIC5DYXNlKCJ1bnVzZWQiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDIwMTYwMyA6IDApCisgICAgLkNhc2UoIm5vZGlzY2FyZCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMjAxNjAzIDogMCkKKyAgICAuQ2FzZSgid2Fybl91bnVzZWRfcmVzdWx0IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAyMDE2MDMgOiAwKQorICAgIC5DYXNlKCJ3YXJuX3VudXNlZF9yZXN1bHQiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDIwMTYwMyA6IDApCisgICAgLkRlZmF1bHQoMCk7Cit9IGVsc2UgaWYgKFNjb3BlLT5nZXROYW1lKCkgPT0gImNsYW5nIikgeworICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPGludD4oTmFtZSkKKyAgICAuQ2FzZSgiYW1kZ3B1X2ZsYXRfd29ya19ncm91cF9zaXplIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiYW1kZ3B1X251bV9zZ3ByIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiYW1kZ3B1X251bV92Z3ByIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiYW1kZ3B1X3dhdmVzX3Blcl9ldSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImFjcXVpcmVfY2FwYWJpbGl0eSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImFjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJhY3F1aXJlX2NhcGFiaWxpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJhY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiYWRkcmVzc19zcGFjZSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImFubm90YXRlIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgib2JqY19hcmNfd2Vha19yZWZlcmVuY2VfdW5hdmFpbGFibGUiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJhcmd1bWVudF93aXRoX3R5cGVfdGFnIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgicG9pbnRlcl93aXRoX3R5cGVfdGFnIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiYXJndW1lbnRfd2l0aF90eXBlX3RhZyIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInBvaW50ZXJfd2l0aF90eXBlX3RhZyIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImFzc2VydF9jYXBhYmlsaXR5IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiYXNzZXJ0X3NoYXJlZF9jYXBhYmlsaXR5IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiYXNzZXJ0X2NhcGFiaWxpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJhc3NlcnRfc2hhcmVkX2NhcGFiaWxpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJhdmFpbGFiaWxpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJibG9ja3MiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJjZl9hdWRpdGVkX3RyYW5zZmVyIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiY2ZfY29uc3VtZWQiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJjZl9yZXR1cm5zX25vdF9yZXRhaW5lZCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImNmX3JldHVybnNfcmV0YWluZWQiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJjZl91bmtub3duX3RyYW5zZmVyIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiY2FsbGFibGVfd2hlbiIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImNhcGFiaWxpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJzaGFyZWRfY2FwYWJpbGl0eSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImNhcGFiaWxpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJzaGFyZWRfY2FwYWJpbGl0eSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImNvbnN1bWFibGUiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJjb25zdW1hYmxlX2F1dG9fY2FzdF9zdGF0ZSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImNvbnN1bWFibGVfc2V0X3N0YXRlX29uX3JlYWQiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJjb252ZXJnZW50IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiZGlzYWJsZV90YWlsX2NhbGxzIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiZW51bV9leHRlbnNpYmlsaXR5IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiZXh0ZXJuYWxfc291cmNlX3N5bWJvbCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImZhbGx0aHJvdWdoIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAyMDE2MDMgOiAwKQorICAgIC5DYXNlKCJmbGFnX2VudW0iLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJndWFyZGVkX3ZhciIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImliYWN0aW9uIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiaWJvdXRsZXQiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJpYm91dGxldGNvbGxlY3Rpb24iLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJpbnRlbF9vY2xfYmljYyIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImludGVybmFsX2xpbmthZ2UiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJsdG9fdmlzaWJpbGl0eV9wdWJsaWMiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJtaW5zaXplIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibnNfY29uc3VtZWQiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJuc19jb25zdW1lc19zZWxmIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibnNfcmV0dXJuc19hdXRvcmVsZWFzZWQiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJuc19yZXR1cm5zX25vdF9yZXRhaW5lZCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm5zX3JldHVybnNfcmV0YWluZWQiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJuZW9uX3BvbHl2ZWN0b3JfdHlwZSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm5lb25fdmVjdG9yX3R5cGUiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJub2R1cGxpY2F0ZSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm5vZXNjYXBlIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibm9fc2FuaXRpemUiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJub19zYW5pdGl6ZV9tZW1vcnkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJub190aHJlYWRfc2FmZXR5X2FuYWx5c2lzIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibm90X3RhaWxfY2FsbGVkIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgib2JqY19ib3hhYmxlIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgib2JqY19icmlkZ2UiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJvYmpjX2JyaWRnZV9tdXRhYmxlIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgib2JqY19icmlkZ2VfcmVsYXRlZCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm9iamNfZGVzaWduYXRlZF9pbml0aWFsaXplciIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm9iamNfZXhjZXB0aW9uIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgib2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbiIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm9iamNfZ2MiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJvYmpjX2luZGVwZW5kZW50X2NsYXNzIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgib2JqY19tZXRob2RfZmFtaWx5IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiTlNPYmplY3QiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJvYmpjX293bmVyc2hpcCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm9iamNfcHJlY2lzZV9saWZldGltZSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm9iamNfcmVxdWlyZXNfcHJvcGVydHlfZGVmaW5pdGlvbnMiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJvYmpjX3JlcXVpcmVzX3N1cGVyIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgib2JqY19yZXR1cm5zX2lubmVyX3BvaW50ZXIiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJvYmpjX3Jvb3RfY2xhc3MiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJvYmpjX3J1bnRpbWVfbmFtZSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm9iamNfcnVudGltZV92aXNpYmxlIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgib2JqY19zdWJjbGFzc2luZ19yZXN0cmljdGVkIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgib3B0bm9uZSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm92ZXJsb2FkYWJsZSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm93bmVyc2hpcF9ob2xkcyIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm93bmVyc2hpcF9yZXR1cm5zIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgib3duZXJzaGlwX3Rha2VzIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgib3duZXJzaGlwX2hvbGRzIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgib3duZXJzaGlwX3JldHVybnMiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJvd25lcnNoaXBfdGFrZXMiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJvd25lcnNoaXBfaG9sZHMiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJvd25lcnNoaXBfcmV0dXJucyIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm93bmVyc2hpcF90YWtlcyIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInBhcmFtX3R5cGVzdGF0ZSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInBhc2NhbCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInBhc3Nfb2JqZWN0X3NpemUiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJwcmVzZXJ2ZV9hbGwiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJwcmVzZXJ2ZV9tb3N0IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgicHRfZ3VhcmRlZF92YXIiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJyZWxlYXNlX2NhcGFiaWxpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgicmVsZWFzZV9nZW5lcmljX2NhcGFiaWxpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJ1bmxvY2tfZnVuY3Rpb24iLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJyZWxlYXNlX2NhcGFiaWxpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgicmVsZWFzZV9nZW5lcmljX2NhcGFiaWxpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJ1bmxvY2tfZnVuY3Rpb24iLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJyZWxlYXNlX2NhcGFiaWxpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgicmVsZWFzZV9nZW5lcmljX2NhcGFiaWxpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJ1bmxvY2tfZnVuY3Rpb24iLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJyZWxlYXNlX2NhcGFiaWxpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgicmVsZWFzZV9nZW5lcmljX2NhcGFiaWxpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJ1bmxvY2tfZnVuY3Rpb24iLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJyZXF1aXJlX2NvbnN0YW50X2luaXRpYWxpemF0aW9uIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgicmVxdWlyZXNfY2FwYWJpbGl0eSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImV4Y2x1c2l2ZV9sb2Nrc19yZXF1aXJlZCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInJlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgic2hhcmVkX2xvY2tzX3JlcXVpcmVkIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgicmVxdWlyZXNfY2FwYWJpbGl0eSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImV4Y2x1c2l2ZV9sb2Nrc19yZXF1aXJlZCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInJlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgic2hhcmVkX2xvY2tzX3JlcXVpcmVkIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgicmVxdWlyZXNfY2FwYWJpbGl0eSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImV4Y2x1c2l2ZV9sb2Nrc19yZXF1aXJlZCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInJlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgic2hhcmVkX2xvY2tzX3JlcXVpcmVkIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgicmVxdWlyZXNfY2FwYWJpbGl0eSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImV4Y2x1c2l2ZV9sb2Nrc19yZXF1aXJlZCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInJlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgic2hhcmVkX2xvY2tzX3JlcXVpcmVkIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgicmV0dXJuX3R5cGVzdGF0ZSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInNjb3BlZF9sb2NrYWJsZSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInNldF90eXBlc3RhdGUiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJzd2lmdGNhbGwiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJzd2lmdF9jb250ZXh0IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgic3dpZnRfZXJyb3JfcmVzdWx0IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgic3dpZnRfaW5kaXJlY3RfcmVzdWx0IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgidGVzdF90eXBlc3RhdGUiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJ0cml2aWFsX2FiaSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInRyeV9hY3F1aXJlX2NhcGFiaWxpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJ0cnlfYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInRyeV9hY3F1aXJlX2NhcGFiaWxpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJ0cnlfYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInR5cGVfdGFnX2Zvcl9kYXRhdHlwZSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInR5cGVfdmlzaWJpbGl0eSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInVuYXZhaWxhYmxlIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgidmVjcmV0dXJuIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgidmVjdG9yY2FsbCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIndhcm5fdW51c2VkX3Jlc3VsdCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMjAxNjAzIDogMCkKKyAgICAuQ2FzZSgid2Vha19pbXBvcnQiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJ4cmF5X2Fsd2F5c19pbnN0cnVtZW50IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgieHJheV9uZXZlcl9pbnN0cnVtZW50IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgieHJheV9hbHdheXNfaW5zdHJ1bWVudCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInhyYXlfbmV2ZXJfaW5zdHJ1bWVudCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInhyYXlfbG9nX2FyZ3MiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5EZWZhdWx0KDApOworfSBlbHNlIGlmIChTY29wZS0+Z2V0TmFtZSgpID09ICJnbnUiKSB7CisgIHJldHVybiBsbHZtOjpTdHJpbmdTd2l0Y2g8aW50PihOYW1lKQorICAgIC5DYXNlKCJpbnRlcnJ1cHQiLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybSB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OnRodW1iIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtZWIgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp0aHVtYmViKSAmJiBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJpbnRlcnJ1cHQiLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmF2cikgJiYgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgic2lnbmFsIiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphdnIpICYmIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImFiaV90YWciLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJhbGlhcyIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImFsaWduZWQiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJhbGxvY19hbGlnbiIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImFsbG9jX3NpemUiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJhbHdheXNfaW5saW5lIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiaW50ZXJydXB0IiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODZfNjQpICYmIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm5vX2NhbGxlcl9zYXZlZF9yZWdpc3RlcnMiLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4NiB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4Nl82NCkgJiYgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibm9jZl9jaGVjayIsIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2IHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2XzY0KSAmJiBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJhcnRpZmljaWFsIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiYXNzdW1lX2FsaWduZWQiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJjZGVjbCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImNsZWFudXAiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJjb2xkIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiY29tbW9uIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiY29uc3QiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJfX2NvbnN0IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiY29uc3QiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJfX2NvbnN0IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiY29uc3RydWN0b3IiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJkbGxleHBvcnQiLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4NiB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4Nl82NCB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybSB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OnRodW1iIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YWFyY2g2NCkgJiYgKFQuZ2V0T1MoKSA9PSBsbHZtOjpUcmlwbGU6OldpbjMyKSAmJiBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJkbGxpbXBvcnQiLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4NiB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4Nl82NCB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybSB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OnRodW1iIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YWFyY2g2NCkgJiYgKFQuZ2V0T1MoKSA9PSBsbHZtOjpUcmlwbGU6OldpbjMyKSAmJiBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJkZXByZWNhdGVkIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAyMDEzMDkgOiAwKQorICAgIC5DYXNlKCJkZXN0cnVjdG9yIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiZmFzdGNhbGwiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJmbGF0dGVuIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiZm9ybWF0IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiZm9ybWF0X2FyZyIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImdudV9pbmxpbmUiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJob3QiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJpZnVuYyIsIHRydWUgJiYgKFQuZ2V0T2JqZWN0Rm9ybWF0KCkgPT0gbGx2bTo6VHJpcGxlOjpFTEYpICYmIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImluaXRfcHJpb3JpdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJtc19hYmkiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJpbnRlcnJ1cHQiLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1zcDQzMCkgJiYgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibXNfc3RydWN0IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibWF5X2FsaWFzIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibWljcm9taXBzIiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwc2VsKSAmJiBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJtaXBzMTYiLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHMgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzZWwpICYmIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImludGVycnVwdCIsIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwcyB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHNlbCkgJiYgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibG9uZ19jYWxsIiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwc2VsIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwczY0IHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwczY0ZWwpICYmIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImZhciIsIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwcyB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHNlbCB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHM2NCB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHM2NGVsKSAmJiBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJsb25nX2NhbGwiLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHMgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzZWwgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzNjQgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzNjRlbCkgJiYgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgiZmFyIiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwc2VsIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwczY0IHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwczY0ZWwpICYmIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInNob3J0X2NhbGwiLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHMgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzZWwgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzNjQgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzNjRlbCkgJiYgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibmVhciIsIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwcyB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHNlbCB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHM2NCB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHM2NGVsKSAmJiBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJzaG9ydF9jYWxsIiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwc2VsIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwczY0IHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwczY0ZWwpICYmIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm5lYXIiLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHMgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzZWwgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzNjQgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzNjRlbCkgJiYgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibW9kZSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm5ha2VkIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibm9jb21tb24iLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJub2RlYnVnIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibm9pbmxpbmUiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJub19pbnN0cnVtZW50X2Z1bmN0aW9uIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibm9taWNyb21pcHMiLCB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHMgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzZWwpICYmIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm5vbWlwczE2IiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwc2VsKSAmJiBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJub3JldHVybiIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm5vX2FkZHJlc3Nfc2FmZXR5X2FuYWx5c2lzIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibm9fc2FuaXRpemVfYWRkcmVzcyIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm5vX3Nhbml0aXplX3RocmVhZCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm5vX2FkZHJlc3Nfc2FmZXR5X2FuYWx5c2lzIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibm9fc2FuaXRpemVfYWRkcmVzcyIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm5vX3Nhbml0aXplX3RocmVhZCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm5vX2FkZHJlc3Nfc2FmZXR5X2FuYWx5c2lzIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibm9fc2FuaXRpemVfYWRkcmVzcyIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm5vX3Nhbml0aXplX3RocmVhZCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm5vX3NwbGl0X3N0YWNrIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgibm90aHJvdyIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIm5vbm51bGwiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJwYWNrZWQiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJwY3MiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJwdXJlIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgicmVnY2FsbCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInJlZ3Bhcm0iLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJtYWxsb2MiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJyZXR1cm5zX25vbm51bGwiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJyZXR1cm5zX3R3aWNlIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgic2VjdGlvbiIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInNlbGVjdGFueSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInNlbnRpbmVsIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgic3RkY2FsbCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInN5c3ZfYWJpIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgidGxzX21vZGVsIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgidGFyZ2V0IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgidGhpc2NhbGwiLCBMYW5nT3B0cy5DUGx1c1BsdXMxMSA/IDEgOiAwKQorICAgIC5DYXNlKCJ0cmFuc3BhcmVudF91bmlvbiIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInVudXNlZCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMjAxNjAzIDogMCkKKyAgICAuQ2FzZSgidXNlZCIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoInZlY3Rvcl9zaXplIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgidmlzaWJpbGl0eSIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoIndhcm5fdW51c2VkIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgid2Fybl91bnVzZWRfcmVzdWx0IiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAyMDE2MDMgOiAwKQorICAgIC5DYXNlKCJ3ZWFrIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuQ2FzZSgid2Vha3JlZiIsIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkNhc2UoImZvcmNlX2FsaWduX2FyZ19wb2ludGVyIiwgdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODZfNjQpICYmIExhbmdPcHRzLkNQbHVzUGx1czExID8gMSA6IDApCisgICAgLkRlZmF1bHQoMCk7Cit9IGVsc2UgaWYgKFNjb3BlLT5nZXROYW1lKCkgPT0gImdzbCIpIHsKKyAgcmV0dXJuIGxsdm06OlN0cmluZ1N3aXRjaDxpbnQ+KE5hbWUpCisgICAgLkNhc2UoInN1cHByZXNzIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEgPyAxIDogMCkKKyAgICAuRGVmYXVsdCgwKTsKK30KK30gYnJlYWs7CitjYXNlIEF0dHJTeW50YXg6OkM6IHsKK2lmICghU2NvcGUgfHwgU2NvcGUtPmdldE5hbWUoKSA9PSAiIikgeworICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPGludD4oTmFtZSkKKyAgICAuQ2FzZSgiZGVwcmVjYXRlZCIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoImZhbGx0aHJvdWdoIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgibWF5YmVfdW51c2VkIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgibm9kaXNjYXJkIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuRGVmYXVsdCgwKTsKK30gZWxzZSBpZiAoU2NvcGUtPmdldE5hbWUoKSA9PSAiY2xhbmciKSB7CisgIHJldHVybiBsbHZtOjpTdHJpbmdTd2l0Y2g8aW50PihOYW1lKQorICAgIC5DYXNlKCJhZGRyZXNzX3NwYWNlIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgiYW5ub3RhdGUiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJvYmpjX2FyY193ZWFrX3JlZmVyZW5jZV91bmF2YWlsYWJsZSIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoImFyZ3VtZW50X3dpdGhfdHlwZV90YWciLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJwb2ludGVyX3dpdGhfdHlwZV90YWciLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJhcmd1bWVudF93aXRoX3R5cGVfdGFnIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgicG9pbnRlcl93aXRoX3R5cGVfdGFnIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgiYXZhaWxhYmlsaXR5IiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgiYmxvY2tzIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgiY2ZfYXVkaXRlZF90cmFuc2ZlciIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoImNmX2NvbnN1bWVkIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgiY2ZfcmV0dXJuc19ub3RfcmV0YWluZWQiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJjZl9yZXR1cm5zX3JldGFpbmVkIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgiY2ZfdW5rbm93bl90cmFuc2ZlciIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoImNvbnZlcmdlbnQiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJkaXNhYmxlX3RhaWxfY2FsbHMiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJlbnVtX2V4dGVuc2liaWxpdHkiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJleHRlcm5hbF9zb3VyY2Vfc3ltYm9sIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgiZmxhZ19lbnVtIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgiaWJhY3Rpb24iLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJpYm91dGxldCIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoImlib3V0bGV0Y29sbGVjdGlvbiIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoImludGVybmFsX2xpbmthZ2UiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJsdG9fdmlzaWJpbGl0eV9wdWJsaWMiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJtaW5zaXplIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgibnNfY29uc3VtZWQiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJuc19jb25zdW1lc19zZWxmIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgibnNfcmV0dXJuc19hdXRvcmVsZWFzZWQiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJuc19yZXR1cm5zX25vdF9yZXRhaW5lZCIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoIm5zX3JldHVybnNfcmV0YWluZWQiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJuZW9uX3BvbHl2ZWN0b3JfdHlwZSIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoIm5lb25fdmVjdG9yX3R5cGUiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJub2R1cGxpY2F0ZSIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoIm5vZXNjYXBlIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgibm9fc2FuaXRpemUiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJub19zYW5pdGl6ZV9tZW1vcnkiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJub190aHJlYWRfc2FmZXR5X2FuYWx5c2lzIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgibm90X3RhaWxfY2FsbGVkIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgib2JqY19ib3hhYmxlIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgib2JqY19icmlkZ2UiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJvYmpjX2JyaWRnZV9tdXRhYmxlIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgib2JqY19icmlkZ2VfcmVsYXRlZCIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoIm9iamNfZGVzaWduYXRlZF9pbml0aWFsaXplciIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoIm9iamNfZXhjZXB0aW9uIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgib2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbiIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoIm9iamNfZ2MiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJvYmpjX2luZGVwZW5kZW50X2NsYXNzIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgib2JqY19tZXRob2RfZmFtaWx5IiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgiTlNPYmplY3QiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJvYmpjX293bmVyc2hpcCIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoIm9iamNfcHJlY2lzZV9saWZldGltZSIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoIm9iamNfcmVxdWlyZXNfcHJvcGVydHlfZGVmaW5pdGlvbnMiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJvYmpjX3JlcXVpcmVzX3N1cGVyIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgib2JqY19yZXR1cm5zX2lubmVyX3BvaW50ZXIiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJvYmpjX3Jvb3RfY2xhc3MiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJvYmpjX3J1bnRpbWVfbmFtZSIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoIm9iamNfcnVudGltZV92aXNpYmxlIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgib2JqY19zdWJjbGFzc2luZ19yZXN0cmljdGVkIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgib3B0bm9uZSIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoIm92ZXJsb2FkYWJsZSIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoIm93bmVyc2hpcF9ob2xkcyIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoIm93bmVyc2hpcF9yZXR1cm5zIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgib3duZXJzaGlwX3Rha2VzIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgib3duZXJzaGlwX2hvbGRzIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgib3duZXJzaGlwX3JldHVybnMiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJvd25lcnNoaXBfdGFrZXMiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJvd25lcnNoaXBfaG9sZHMiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJvd25lcnNoaXBfcmV0dXJucyIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoIm93bmVyc2hpcF90YWtlcyIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoInBhc2NhbCIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoInBhc3Nfb2JqZWN0X3NpemUiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJwcmVzZXJ2ZV9hbGwiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJwcmVzZXJ2ZV9tb3N0IiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgic3dpZnRjYWxsIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgic3dpZnRfY29udGV4dCIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoInN3aWZ0X2Vycm9yX3Jlc3VsdCIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoInN3aWZ0X2luZGlyZWN0X3Jlc3VsdCIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoInR5cGVfdGFnX2Zvcl9kYXRhdHlwZSIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoInR5cGVfdmlzaWJpbGl0eSIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoInVuYXZhaWxhYmxlIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgidmVjdG9yY2FsbCIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoIndlYWtfaW1wb3J0IiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuQ2FzZSgieHJheV9hbHdheXNfaW5zdHJ1bWVudCIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoInhyYXlfbmV2ZXJfaW5zdHJ1bWVudCIsIExhbmdPcHRzLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzID8gMSA6IDApCisgICAgLkNhc2UoInhyYXlfYWx3YXlzX2luc3RydW1lbnQiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJ4cmF5X25ldmVyX2luc3RydW1lbnQiLCBMYW5nT3B0cy5Eb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcyA/IDEgOiAwKQorICAgIC5DYXNlKCJ4cmF5X2xvZ19hcmdzIiwgTGFuZ09wdHMuRG91YmxlU3F1YXJlQnJhY2tldEF0dHJpYnV0ZXMgPyAxIDogMCkKKyAgICAuRGVmYXVsdCgwKTsKK30KK30gYnJlYWs7Cit9CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyS2luZHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHJLaW5kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNzM5NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyS2luZHMuaApAQCAtMCwwICsxLDM0IEBACisvLz09PS0tLS0tIEF0dHIuaCAtIEVudW0gdmFsdWVzIGZvciBDIEF0dHJpYnV0ZSBLaW5kcyAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHRoZSBjbGFuZzo6YXR0cjo6S2luZCBlbnVtLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfQVRUUktJTkRTX0gKKyNkZWZpbmUgTExWTV9DTEFOR19CQVNJQ19BVFRSS0lORFNfSAorCituYW1lc3BhY2UgY2xhbmcgeworCituYW1lc3BhY2UgYXR0ciB7CisKKy8vIFxicmllZiBBIGxpc3Qgb2YgYWxsIHRoZSByZWNvZ25pemVkIGtpbmRzIG9mIGF0dHJpYnV0ZXMuCitlbnVtIEtpbmQgeworI2RlZmluZSBBVFRSKFgpIFgsCisjZGVmaW5lIEFUVFJfUkFOR0UoQ0xBU1MsIEZJUlNUX05BTUUsIExBU1RfTkFNRSkgXAorICBGaXJzdCMjQ0xBU1MgPSBGSVJTVF9OQU1FLCAgICAgICAgICAgICAgICAgICAgXAorICBMYXN0IyNDTEFTUyA9IExBU1RfTkFNRSwKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9BdHRyTGlzdC5pbmMiCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgYXR0cgorfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ckxpc3QuaW5jIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ckxpc3QuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDYyOTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyTGlzdC5pbmMKQEAgLTAsMCArMSwyNzUgQEAKKy8qPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogTGlzdCBvZiBhbGwgYXR0cmlidXRlcyB0aGF0IENsYW5nIHJlY29nbml6ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLCBkbyBub3QgZWRpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgU1RNVF9BVFRSCisjZGVmaW5lIFNUTVRfQVRUUihOQU1FKSBBVFRSKE5BTUUpCisjZW5kaWYKKworI2lmbmRlZiBJTkhFUklUQUJMRV9BVFRSCisjZGVmaW5lIElOSEVSSVRBQkxFX0FUVFIoTkFNRSkgQVRUUihOQU1FKQorI2VuZGlmCisKKyNpZm5kZWYgSU5IRVJJVEFCTEVfUEFSQU1fQVRUUgorI2RlZmluZSBJTkhFUklUQUJMRV9QQVJBTV9BVFRSKE5BTUUpIElOSEVSSVRBQkxFX0FUVFIoTkFNRSkKKyNlbmRpZgorCisjaWZuZGVmIFBBUkFNRVRFUl9BQklfQVRUUgorI2RlZmluZSBQQVJBTUVURVJfQUJJX0FUVFIoTkFNRSkgSU5IRVJJVEFCTEVfUEFSQU1fQVRUUihOQU1FKQorI2VuZGlmCisKKyNpZm5kZWYgUFJBR01BX1NQRUxMSU5HX0FUVFIKKyNkZWZpbmUgUFJBR01BX1NQRUxMSU5HX0FUVFIoTkFNRSkgCisjZW5kaWYKKworU1RNVF9BVFRSKEZhbGxUaHJvdWdoKQorU1RNVF9BVFRSKFN1cHByZXNzKQorUEFSQU1FVEVSX0FCSV9BVFRSKFN3aWZ0Q29udGV4dCkKK1BBUkFNRVRFUl9BQklfQVRUUihTd2lmdEVycm9yUmVzdWx0KQorUEFSQU1FVEVSX0FCSV9BVFRSKFN3aWZ0SW5kaXJlY3RSZXN1bHQpCitJTkhFUklUQUJMRV9QQVJBTV9BVFRSKEFubm90YXRlKQorSU5IRVJJVEFCTEVfUEFSQU1fQVRUUihDRkNvbnN1bWVkKQorSU5IRVJJVEFCTEVfUEFSQU1fQVRUUihDYXJyaWVzRGVwZW5kZW5jeSkKK0lOSEVSSVRBQkxFX1BBUkFNX0FUVFIoTlNDb25zdW1lZCkKK0lOSEVSSVRBQkxFX1BBUkFNX0FUVFIoTm9uTnVsbCkKK0lOSEVSSVRBQkxFX1BBUkFNX0FUVFIoUGFzc09iamVjdFNpemUpCitJTkhFUklUQUJMRV9BVFRSKEFNREdQVUZsYXRXb3JrR3JvdXBTaXplKQorSU5IRVJJVEFCTEVfQVRUUihBTURHUFVOdW1TR1BSKQorSU5IRVJJVEFCTEVfQVRUUihBTURHUFVOdW1WR1BSKQorSU5IRVJJVEFCTEVfQVRUUihBTURHUFVXYXZlc1BlckVVKQorSU5IRVJJVEFCTEVfQVRUUihBUk1JbnRlcnJ1cHQpCitJTkhFUklUQUJMRV9BVFRSKEFWUkludGVycnVwdCkKK0lOSEVSSVRBQkxFX0FUVFIoQVZSU2lnbmFsKQorSU5IRVJJVEFCTEVfQVRUUihBY3F1aXJlQ2FwYWJpbGl0eSkKK0lOSEVSSVRBQkxFX0FUVFIoQWNxdWlyZWRBZnRlcikKK0lOSEVSSVRBQkxFX0FUVFIoQWNxdWlyZWRCZWZvcmUpCitJTkhFUklUQUJMRV9BVFRSKEFsaWduTWFjNjhrKQorSU5IRVJJVEFCTEVfQVRUUihBbGlnbmVkKQorSU5IRVJJVEFCTEVfQVRUUihBbGxvY0FsaWduKQorSU5IRVJJVEFCTEVfQVRUUihBbGxvY1NpemUpCitJTkhFUklUQUJMRV9BVFRSKEFsd2F5c0lubGluZSkKK0lOSEVSSVRBQkxFX0FUVFIoQW5hbHl6ZXJOb1JldHVybikKK0lOSEVSSVRBQkxFX0FUVFIoQW55WDg2SW50ZXJydXB0KQorSU5IRVJJVEFCTEVfQVRUUihBbnlYODZOb0NhbGxlclNhdmVkUmVnaXN0ZXJzKQorSU5IRVJJVEFCTEVfQVRUUihBbnlYODZOb0NmQ2hlY2spCitJTkhFUklUQUJMRV9BVFRSKEFyY1dlYWtyZWZVbmF2YWlsYWJsZSkKK0lOSEVSSVRBQkxFX0FUVFIoQXJndW1lbnRXaXRoVHlwZVRhZykKK0lOSEVSSVRBQkxFX0FUVFIoQXJ0aWZpY2lhbCkKK0lOSEVSSVRBQkxFX0FUVFIoQXNtTGFiZWwpCitJTkhFUklUQUJMRV9BVFRSKEFzc2VydENhcGFiaWxpdHkpCitJTkhFUklUQUJMRV9BVFRSKEFzc2VydEV4Y2x1c2l2ZUxvY2spCitJTkhFUklUQUJMRV9BVFRSKEFzc2VydFNoYXJlZExvY2spCitJTkhFUklUQUJMRV9BVFRSKEFzc3VtZUFsaWduZWQpCitJTkhFUklUQUJMRV9BVFRSKEF2YWlsYWJpbGl0eSkKK0lOSEVSSVRBQkxFX0FUVFIoQmxvY2tzKQorSU5IRVJJVEFCTEVfQVRUUihDMTFOb1JldHVybikKK0lOSEVSSVRBQkxFX0FUVFIoQ0RlY2wpCitJTkhFUklUQUJMRV9BVFRSKENGQXVkaXRlZFRyYW5zZmVyKQorSU5IRVJJVEFCTEVfQVRUUihDRlJldHVybnNOb3RSZXRhaW5lZCkKK0lOSEVSSVRBQkxFX0FUVFIoQ0ZSZXR1cm5zUmV0YWluZWQpCitJTkhFUklUQUJMRV9BVFRSKENGVW5rbm93blRyYW5zZmVyKQorSU5IRVJJVEFCTEVfQVRUUihDVURBQ29uc3RhbnQpCitJTkhFUklUQUJMRV9BVFRSKENVREFEZXZpY2UpCitJTkhFUklUQUJMRV9BVFRSKENVREFHbG9iYWwpCitJTkhFUklUQUJMRV9BVFRSKENVREFIb3N0KQorSU5IRVJJVEFCTEVfQVRUUihDVURBSW52YWxpZFRhcmdldCkKK0lOSEVSSVRBQkxFX0FUVFIoQ1VEQUxhdW5jaEJvdW5kcykKK0lOSEVSSVRBQkxFX0FUVFIoQ1VEQVNoYXJlZCkKK0lOSEVSSVRBQkxFX0FUVFIoQ1hYMTFOb1JldHVybikKK0lOSEVSSVRBQkxFX0FUVFIoQ2FsbGFibGVXaGVuKQorSU5IRVJJVEFCTEVfQVRUUihDYXBhYmlsaXR5KQorSU5IRVJJVEFCTEVfQVRUUihDYXB0dXJlZFJlY29yZCkKK0lOSEVSSVRBQkxFX0FUVFIoQ2xlYW51cCkKK0lOSEVSSVRBQkxFX0FUVFIoQ29sZCkKK0lOSEVSSVRBQkxFX0FUVFIoQ29tbW9uKQorSU5IRVJJVEFCTEVfQVRUUihDb25zdCkKK0lOSEVSSVRBQkxFX0FUVFIoQ29uc3RydWN0b3IpCitJTkhFUklUQUJMRV9BVFRSKENvbnN1bWFibGUpCitJTkhFUklUQUJMRV9BVFRSKENvbnN1bWFibGVBdXRvQ2FzdCkKK0lOSEVSSVRBQkxFX0FUVFIoQ29uc3VtYWJsZVNldE9uUmVhZCkKK0lOSEVSSVRBQkxFX0FUVFIoQ29udmVyZ2VudCkKK0lOSEVSSVRBQkxFX0FUVFIoRExMRXhwb3J0KQorSU5IRVJJVEFCTEVfQVRUUihETExJbXBvcnQpCitJTkhFUklUQUJMRV9BVFRSKERlcHJlY2F0ZWQpCitJTkhFUklUQUJMRV9BVFRSKERlc3RydWN0b3IpCitJTkhFUklUQUJMRV9BVFRSKERpYWdub3NlSWYpCitJTkhFUklUQUJMRV9BVFRSKERpc2FibGVUYWlsQ2FsbHMpCitJTkhFUklUQUJMRV9BVFRSKEVtcHR5QmFzZXMpCitJTkhFUklUQUJMRV9BVFRSKEVuYWJsZUlmKQorSU5IRVJJVEFCTEVfQVRUUihFbnVtRXh0ZW5zaWJpbGl0eSkKK0lOSEVSSVRBQkxFX0FUVFIoRXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uKQorSU5IRVJJVEFCTEVfQVRUUihFeHRlcm5hbFNvdXJjZVN5bWJvbCkKK0lOSEVSSVRBQkxFX0FUVFIoRmFzdENhbGwpCitJTkhFUklUQUJMRV9BVFRSKEZpbmFsKQorSU5IRVJJVEFCTEVfQVRUUihGbGFnRW51bSkKK0lOSEVSSVRBQkxFX0FUVFIoRmxhdHRlbikKK0lOSEVSSVRBQkxFX0FUVFIoRm9ybWF0KQorSU5IRVJJVEFCTEVfQVRUUihGb3JtYXRBcmcpCitJTkhFUklUQUJMRV9BVFRSKEdOVUlubGluZSkKK0lOSEVSSVRBQkxFX0FUVFIoR3VhcmRlZEJ5KQorSU5IRVJJVEFCTEVfQVRUUihHdWFyZGVkVmFyKQorSU5IRVJJVEFCTEVfQVRUUihIb3QpCitJTkhFUklUQUJMRV9BVFRSKElCQWN0aW9uKQorSU5IRVJJVEFCTEVfQVRUUihJQk91dGxldCkKK0lOSEVSSVRBQkxFX0FUVFIoSUJPdXRsZXRDb2xsZWN0aW9uKQorSU5IRVJJVEFCTEVfQVRUUihJbml0UHJpb3JpdHkpCitJTkhFUklUQUJMRV9BVFRSKEludGVsT2NsQmljYykKK0lOSEVSSVRBQkxFX0FUVFIoSW50ZXJuYWxMaW5rYWdlKQorSU5IRVJJVEFCTEVfQVRUUihMVE9WaXNpYmlsaXR5UHVibGljKQorSU5IRVJJVEFCTEVfQVRUUihMYXlvdXRWZXJzaW9uKQorSU5IRVJJVEFCTEVfQVRUUihMb2NrUmV0dXJuZWQpCitJTkhFUklUQUJMRV9BVFRSKExvY2tzRXhjbHVkZWQpCitJTkhFUklUQUJMRV9BVFRSKE1TQUJJKQorSU5IRVJJVEFCTEVfQVRUUihNU0luaGVyaXRhbmNlKQorSU5IRVJJVEFCTEVfQVRUUihNU05vVlRhYmxlKQorSU5IRVJJVEFCTEVfQVRUUihNU1A0MzBJbnRlcnJ1cHQpCitJTkhFUklUQUJMRV9BVFRSKE1TU3RydWN0KQorSU5IRVJJVEFCTEVfQVRUUihNU1Z0b3JEaXNwKQorSU5IRVJJVEFCTEVfQVRUUihNYXhGaWVsZEFsaWdubWVudCkKK0lOSEVSSVRBQkxFX0FUVFIoTWF5QWxpYXMpCitJTkhFUklUQUJMRV9BVFRSKE1pY3JvTWlwcykKK0lOSEVSSVRBQkxFX0FUVFIoTWluU2l6ZSkKK0lOSEVSSVRBQkxFX0FUVFIoTWlwczE2KQorSU5IRVJJVEFCTEVfQVRUUihNaXBzSW50ZXJydXB0KQorSU5IRVJJVEFCTEVfQVRUUihNaXBzTG9uZ0NhbGwpCitJTkhFUklUQUJMRV9BVFRSKE1pcHNTaG9ydENhbGwpCitJTkhFUklUQUJMRV9BVFRSKE5TQ29uc3VtZXNTZWxmKQorSU5IRVJJVEFCTEVfQVRUUihOU1JldHVybnNBdXRvcmVsZWFzZWQpCitJTkhFUklUQUJMRV9BVFRSKE5TUmV0dXJuc05vdFJldGFpbmVkKQorSU5IRVJJVEFCTEVfQVRUUihOU1JldHVybnNSZXRhaW5lZCkKK0lOSEVSSVRBQkxFX0FUVFIoTmFrZWQpCitJTkhFUklUQUJMRV9BVFRSKE5vQWxpYXMpCitJTkhFUklUQUJMRV9BVFRSKE5vQ29tbW9uKQorSU5IRVJJVEFCTEVfQVRUUihOb0RlYnVnKQorSU5IRVJJVEFCTEVfQVRUUihOb0R1cGxpY2F0ZSkKK0lOSEVSSVRBQkxFX0FUVFIoTm9JbmxpbmUpCitJTkhFUklUQUJMRV9BVFRSKE5vSW5zdHJ1bWVudEZ1bmN0aW9uKQorSU5IRVJJVEFCTEVfQVRUUihOb01pY3JvTWlwcykKK0lOSEVSSVRBQkxFX0FUVFIoTm9NaXBzMTYpCitJTkhFUklUQUJMRV9BVFRSKE5vUmV0dXJuKQorSU5IRVJJVEFCTEVfQVRUUihOb1Nhbml0aXplKQorSU5IRVJJVEFCTEVfQVRUUihOb1NwbGl0U3RhY2spCitJTkhFUklUQUJMRV9BVFRSKE5vVGhyZWFkU2FmZXR5QW5hbHlzaXMpCitJTkhFUklUQUJMRV9BVFRSKE5vVGhyb3cpCitJTkhFUklUQUJMRV9BVFRSKE5vdFRhaWxDYWxsZWQpCitJTkhFUklUQUJMRV9BVFRSKE9NUENhcHR1cmVOb0luaXQpCitJTkhFUklUQUJMRV9BVFRSKE9NUFRocmVhZFByaXZhdGVEZWNsKQorSU5IRVJJVEFCTEVfQVRUUihPYmpDQnJpZGdlKQorSU5IRVJJVEFCTEVfQVRUUihPYmpDQnJpZGdlTXV0YWJsZSkKK0lOSEVSSVRBQkxFX0FUVFIoT2JqQ0JyaWRnZVJlbGF0ZWQpCitJTkhFUklUQUJMRV9BVFRSKE9iakNFeGNlcHRpb24pCitJTkhFUklUQUJMRV9BVFRSKE9iakNFeHBsaWNpdFByb3RvY29sSW1wbCkKK0lOSEVSSVRBQkxFX0FUVFIoT2JqQ0luZGVwZW5kZW50Q2xhc3MpCitJTkhFUklUQUJMRV9BVFRSKE9iakNNZXRob2RGYW1pbHkpCitJTkhFUklUQUJMRV9BVFRSKE9iakNOU09iamVjdCkKK0lOSEVSSVRBQkxFX0FUVFIoT2JqQ1ByZWNpc2VMaWZldGltZSkKK0lOSEVSSVRBQkxFX0FUVFIoT2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzKQorSU5IRVJJVEFCTEVfQVRUUihPYmpDUmVxdWlyZXNTdXBlcikKK0lOSEVSSVRBQkxFX0FUVFIoT2JqQ1JldHVybnNJbm5lclBvaW50ZXIpCitJTkhFUklUQUJMRV9BVFRSKE9iakNSb290Q2xhc3MpCitJTkhFUklUQUJMRV9BVFRSKE9iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWQpCitJTkhFUklUQUJMRV9BVFRSKE9wZW5DTEludGVsUmVxZFN1Ykdyb3VwU2l6ZSkKK0lOSEVSSVRBQkxFX0FUVFIoT3BlbkNMS2VybmVsKQorSU5IRVJJVEFCTEVfQVRUUihPcGVuQ0xVbnJvbGxIaW50KQorSU5IRVJJVEFCTEVfQVRUUihPcHRpbWl6ZU5vbmUpCitJTkhFUklUQUJMRV9BVFRSKE92ZXJyaWRlKQorSU5IRVJJVEFCTEVfQVRUUihPd25lcnNoaXApCitJTkhFUklUQUJMRV9BVFRSKFBhY2tlZCkKK0lOSEVSSVRBQkxFX0FUVFIoUGFyYW1UeXBlc3RhdGUpCitJTkhFUklUQUJMRV9BVFRSKFBhc2NhbCkKK0lOSEVSSVRBQkxFX0FUVFIoUGNzKQorSU5IRVJJVEFCTEVfQVRUUihQcmFnbWFDbGFuZ0JTU1NlY3Rpb24pCitJTkhFUklUQUJMRV9BVFRSKFByYWdtYUNsYW5nRGF0YVNlY3Rpb24pCitJTkhFUklUQUJMRV9BVFRSKFByYWdtYUNsYW5nUm9kYXRhU2VjdGlvbikKK0lOSEVSSVRBQkxFX0FUVFIoUHJhZ21hQ2xhbmdUZXh0U2VjdGlvbikKK0lOSEVSSVRBQkxFX0FUVFIoUHJlc2VydmVBbGwpCitJTkhFUklUQUJMRV9BVFRSKFByZXNlcnZlTW9zdCkKK0lOSEVSSVRBQkxFX0FUVFIoUHRHdWFyZGVkQnkpCitJTkhFUklUQUJMRV9BVFRSKFB0R3VhcmRlZFZhcikKK0lOSEVSSVRBQkxFX0FUVFIoUHVyZSkKK0lOSEVSSVRBQkxFX0FUVFIoUmVnQ2FsbCkKK0lOSEVSSVRBQkxFX0FUVFIoUmVsZWFzZUNhcGFiaWxpdHkpCitJTkhFUklUQUJMRV9BVFRSKFJlcWRXb3JrR3JvdXBTaXplKQorSU5IRVJJVEFCTEVfQVRUUihSZXF1aXJlQ29uc3RhbnRJbml0KQorSU5IRVJJVEFCTEVfQVRUUihSZXF1aXJlc0NhcGFiaWxpdHkpCitJTkhFUklUQUJMRV9BVFRSKFJlc3RyaWN0KQorSU5IRVJJVEFCTEVfQVRUUihSZXR1cm5UeXBlc3RhdGUpCitJTkhFUklUQUJMRV9BVFRSKFJldHVybnNOb25OdWxsKQorSU5IRVJJVEFCTEVfQVRUUihSZXR1cm5zVHdpY2UpCitJTkhFUklUQUJMRV9BVFRSKFNjb3BlZExvY2thYmxlKQorSU5IRVJJVEFCTEVfQVRUUihTZWN0aW9uKQorSU5IRVJJVEFCTEVfQVRUUihTZWxlY3RBbnkpCitJTkhFUklUQUJMRV9BVFRSKFNlbnRpbmVsKQorSU5IRVJJVEFCTEVfQVRUUihTZXRUeXBlc3RhdGUpCitJTkhFUklUQUJMRV9BVFRSKFNoYXJlZFRyeWxvY2tGdW5jdGlvbikKK0lOSEVSSVRBQkxFX0FUVFIoU3RkQ2FsbCkKK0lOSEVSSVRBQkxFX0FUVFIoU3dpZnRDYWxsKQorSU5IRVJJVEFCTEVfQVRUUihTeXNWQUJJKQorSU5IRVJJVEFCTEVfQVRUUihUTFNNb2RlbCkKK0lOSEVSSVRBQkxFX0FUVFIoVGFyZ2V0KQorSU5IRVJJVEFCTEVfQVRUUihUZXN0VHlwZXN0YXRlKQorSU5IRVJJVEFCTEVfQVRUUihUaGlzQ2FsbCkKK0lOSEVSSVRBQkxFX0FUVFIoVHJhbnNwYXJlbnRVbmlvbikKK0lOSEVSSVRBQkxFX0FUVFIoVHJpdmlhbEFCSSkKK0lOSEVSSVRBQkxFX0FUVFIoVHJ5QWNxdWlyZUNhcGFiaWxpdHkpCitJTkhFUklUQUJMRV9BVFRSKFR5cGVUYWdGb3JEYXRhdHlwZSkKK0lOSEVSSVRBQkxFX0FUVFIoVHlwZVZpc2liaWxpdHkpCitJTkhFUklUQUJMRV9BVFRSKFVuYXZhaWxhYmxlKQorSU5IRVJJVEFCTEVfQVRUUihVbnVzZWQpCitJTkhFUklUQUJMRV9BVFRSKFVzZWQpCitJTkhFUklUQUJMRV9BVFRSKFV1aWQpCitJTkhFUklUQUJMRV9BVFRSKFZlY1JldHVybikKK0lOSEVSSVRBQkxFX0FUVFIoVmVjVHlwZUhpbnQpCitJTkhFUklUQUJMRV9BVFRSKFZlY3RvckNhbGwpCitJTkhFUklUQUJMRV9BVFRSKFZpc2liaWxpdHkpCitJTkhFUklUQUJMRV9BVFRSKFdhcm5VbnVzZWQpCitJTkhFUklUQUJMRV9BVFRSKFdhcm5VbnVzZWRSZXN1bHQpCitJTkhFUklUQUJMRV9BVFRSKFdlYWspCitJTkhFUklUQUJMRV9BVFRSKFdlYWtJbXBvcnQpCitJTkhFUklUQUJMRV9BVFRSKFdlYWtSZWYpCitJTkhFUklUQUJMRV9BVFRSKFdvcmtHcm91cFNpemVIaW50KQorSU5IRVJJVEFCTEVfQVRUUihYODZGb3JjZUFsaWduQXJnUG9pbnRlcikKK0lOSEVSSVRBQkxFX0FUVFIoWFJheUluc3RydW1lbnQpCitJTkhFUklUQUJMRV9BVFRSKFhSYXlMb2dBcmdzKQorQVRUUihBYmlUYWcpCitBVFRSKEFsaWFzKQorQVRUUihBbGlnblZhbHVlKQorQVRUUihJRnVuYykKK0FUVFIoSW5pdFNlZykKK0FUVFIoTG9vcEhpbnQpCitBVFRSKE1vZGUpCitBVFRSKE5vRXNjYXBlKQorQVRUUihPTVBDYXB0dXJlS2luZCkKK0FUVFIoT01QRGVjbGFyZVNpbWREZWNsKQorQVRUUihPTVBEZWNsYXJlVGFyZ2V0RGVjbCkKK0FUVFIoT01QUmVmZXJlbmNlZFZhcikKK0FUVFIoT2JqQ0JveGFibGUpCitBVFRSKE9iakNEZXNpZ25hdGVkSW5pdGlhbGl6ZXIpCitBVFRSKE9iakNSdW50aW1lTmFtZSkKK0FUVFIoT2JqQ1J1bnRpbWVWaXNpYmxlKQorQVRUUihPcGVuQ0xBY2Nlc3MpCitBVFRSKE92ZXJsb2FkYWJsZSkKK0FUVFIoUmVuZGVyU2NyaXB0S2VybmVsKQorQVRUUihUaHJlYWQpCitQUkFHTUFfU1BFTExJTkdfQVRUUihJbml0U2VnKQorUFJBR01BX1NQRUxMSU5HX0FUVFIoTG9vcEhpbnQpCitQUkFHTUFfU1BFTExJTkdfQVRUUihPTVBEZWNsYXJlU2ltZERlY2wpCitQUkFHTUFfU1BFTExJTkdfQVRUUihPTVBEZWNsYXJlVGFyZ2V0RGVjbCkKKyNpZmRlZiBBVFRSX1JBTkdFCitBVFRSX1JBTkdFKEF0dHIsIEZhbGxUaHJvdWdoLCBUaHJlYWQpCitBVFRSX1JBTkdFKFN0bXRBdHRyLCBGYWxsVGhyb3VnaCwgU3VwcHJlc3MpCitBVFRSX1JBTkdFKEluaGVyaXRhYmxlQXR0ciwgU3dpZnRDb250ZXh0LCBYUmF5TG9nQXJncykKK0FUVFJfUkFOR0UoSW5oZXJpdGFibGVQYXJhbUF0dHIsIFN3aWZ0Q29udGV4dCwgUGFzc09iamVjdFNpemUpCitBVFRSX1JBTkdFKFBhcmFtZXRlckFCSUF0dHIsIFN3aWZ0Q29udGV4dCwgU3dpZnRJbmRpcmVjdFJlc3VsdCkKKyN1bmRlZiBBVFRSX1JBTkdFCisjZW5kaWYKKyN1bmRlZiBBVFRSCisjdW5kZWYgU1RNVF9BVFRSCisjdW5kZWYgSU5IRVJJVEFCTEVfQVRUUgorI3VuZGVmIElOSEVSSVRBQkxFX1BBUkFNX0FUVFIKKyN1bmRlZiBQQVJBTUVURVJfQUJJX0FUVFIKKyN1bmRlZiBQUkFHTUFfU1BFTExJTkdfQVRUUgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0clN1Yk1hdGNoUnVsZXNMaXN0LmluYyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHJTdWJNYXRjaFJ1bGVzTGlzdC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwNGRlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHJTdWJNYXRjaFJ1bGVzTGlzdC5pbmMKQEAgLTAsMCArMSw0MCBAQAorLyo9PT0tIFRhYmxlR2VuJ2VyYXRlZCBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBMaXN0IG9mIGFsbCBhdHRyaWJ1dGUgc3ViamVjdCBtYXRjaGluZyBydWxlcyB0aGF0IENsYW5nIHJlY29nbml6ZXMgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGUsIGRvIG5vdCBlZGl0ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBBVFRSX01BVENIX1JVTEUKKyNkZWZpbmUgQVRUUl9NQVRDSF9SVUxFKE5BTUUpIAorI2VuZGlmCisKKyNpZm5kZWYgQVRUUl9NQVRDSF9TVUJfUlVMRQorI2RlZmluZSBBVFRSX01BVENIX1NVQl9SVUxFKFZhbHVlLCBTcGVsbGluZywgSXNBYnN0cmFjdCwgUGFyZW50LCBJc05lZ2F0ZWQpIEFUVFJfTUFUQ0hfUlVMRShWYWx1ZSwgU3BlbGxpbmcsIElzQWJzdHJhY3QpCisjZW5kaWYKK0FUVFJfTUFUQ0hfUlVMRShTdWJqZWN0TWF0Y2hSdWxlX2Jsb2NrLCAiYmxvY2siLCAwKQorQVRUUl9NQVRDSF9SVUxFKFN1YmplY3RNYXRjaFJ1bGVfZW51bSwgImVudW0iLCAwKQorQVRUUl9NQVRDSF9SVUxFKFN1YmplY3RNYXRjaFJ1bGVfZW51bV9jb25zdGFudCwgImVudW1fY29uc3RhbnQiLCAwKQorQVRUUl9NQVRDSF9SVUxFKFN1YmplY3RNYXRjaFJ1bGVfZmllbGQsICJmaWVsZCIsIDApCitBVFRSX01BVENIX1JVTEUoU3ViamVjdE1hdGNoUnVsZV9mdW5jdGlvbiwgImZ1bmN0aW9uIiwgMCkKK0FUVFJfTUFUQ0hfU1VCX1JVTEUoU3ViamVjdE1hdGNoUnVsZV9mdW5jdGlvbl9pc19tZW1iZXIsICJmdW5jdGlvbihpc19tZW1iZXIpIiwgMCwgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9mdW5jdGlvbiwgMCkKK0FUVFJfTUFUQ0hfUlVMRShTdWJqZWN0TWF0Y2hSdWxlX25hbWVzcGFjZSwgIm5hbWVzcGFjZSIsIDApCitBVFRSX01BVENIX1JVTEUoU3ViamVjdE1hdGNoUnVsZV9vYmpjX2NhdGVnb3J5LCAib2JqY19jYXRlZ29yeSIsIDApCitBVFRSX01BVENIX1JVTEUoU3ViamVjdE1hdGNoUnVsZV9vYmpjX2ludGVyZmFjZSwgIm9iamNfaW50ZXJmYWNlIiwgMCkKK0FUVFJfTUFUQ0hfUlVMRShTdWJqZWN0TWF0Y2hSdWxlX29iamNfbWV0aG9kLCAib2JqY19tZXRob2QiLCAwKQorQVRUUl9NQVRDSF9TVUJfUlVMRShTdWJqZWN0TWF0Y2hSdWxlX29iamNfbWV0aG9kX2lzX2luc3RhbmNlLCAib2JqY19tZXRob2QoaXNfaW5zdGFuY2UpIiwgMCwgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9vYmpjX21ldGhvZCwgMCkKK0FUVFJfTUFUQ0hfUlVMRShTdWJqZWN0TWF0Y2hSdWxlX29iamNfcHJvcGVydHksICJvYmpjX3Byb3BlcnR5IiwgMCkKK0FUVFJfTUFUQ0hfUlVMRShTdWJqZWN0TWF0Y2hSdWxlX29iamNfcHJvdG9jb2wsICJvYmpjX3Byb3RvY29sIiwgMCkKK0FUVFJfTUFUQ0hfUlVMRShTdWJqZWN0TWF0Y2hSdWxlX3JlY29yZCwgInJlY29yZCIsIDApCitBVFRSX01BVENIX1NVQl9SVUxFKFN1YmplY3RNYXRjaFJ1bGVfcmVjb3JkX25vdF9pc191bmlvbiwgInJlY29yZCh1bmxlc3MoaXNfdW5pb24pKSIsIDAsIGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfcmVjb3JkLCAxKQorQVRUUl9NQVRDSF9SVUxFKFN1YmplY3RNYXRjaFJ1bGVfaGFzVHlwZV9hYnN0cmFjdCwgImhhc1R5cGUiLCAxKQorQVRUUl9NQVRDSF9TVUJfUlVMRShTdWJqZWN0TWF0Y2hSdWxlX2hhc1R5cGVfZnVuY3Rpb25UeXBlLCAiaGFzVHlwZShmdW5jdGlvblR5cGUpIiwgMCwgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9oYXNUeXBlX2Fic3RyYWN0LCAwKQorQVRUUl9NQVRDSF9SVUxFKFN1YmplY3RNYXRjaFJ1bGVfdHlwZV9hbGlhcywgInR5cGVfYWxpYXMiLCAwKQorQVRUUl9NQVRDSF9SVUxFKFN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGUsICJ2YXJpYWJsZSIsIDApCitBVFRSX01BVENIX1NVQl9SVUxFKFN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGVfaXNfdGhyZWFkX2xvY2FsLCAidmFyaWFibGUoaXNfdGhyZWFkX2xvY2FsKSIsIDAsIGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGUsIDApCitBVFRSX01BVENIX1NVQl9SVUxFKFN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGVfaXNfZ2xvYmFsLCAidmFyaWFibGUoaXNfZ2xvYmFsKSIsIDAsIGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGUsIDApCitBVFRSX01BVENIX1NVQl9SVUxFKFN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGVfaXNfcGFyYW1ldGVyLCAidmFyaWFibGUoaXNfcGFyYW1ldGVyKSIsIDAsIGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGUsIDApCitBVFRSX01BVENIX1NVQl9SVUxFKFN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGVfbm90X2lzX3BhcmFtZXRlciwgInZhcmlhYmxlKHVubGVzcyhpc19wYXJhbWV0ZXIpKSIsIDAsIGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGUsIDEpCisjdW5kZWYgQVRUUl9NQVRDSF9TVUJfUlVMRQorI3VuZGVmIEFUVFJfTUFUQ0hfUlVMRQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0clN1YmplY3RNYXRjaFJ1bGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyU3ViamVjdE1hdGNoUnVsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzg4YWRmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0clN1YmplY3RNYXRjaFJ1bGVzLmgKQEAgLTAsMCArMSwzMiBAQAorLy89PT0tLSBBdHRyU3ViamVjdE1hdGNoUnVsZXMuaCAtIEF0dHJpYnV0ZSBzdWJqZWN0IG1hdGNoIHJ1bGVzIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX0FUVFJfU1VCSkVDVF9NQVRDSF9SVUxFU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfQVRUUl9TVUJKRUNUX01BVENIX1JVTEVTX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBhdHRyIHsKKworLy8vIFxicmllZiBBIGxpc3Qgb2YgYWxsIHRoZSByZWNvZ25pemVkIGtpbmRzIG9mIGF0dHJpYnV0ZXMuCitlbnVtIFN1YmplY3RNYXRjaFJ1bGUgeworI2RlZmluZSBBVFRSX01BVENIX1JVTEUoWCwgU3BlbGxpbmcsIElzQWJzdHJhY3QpIFgsCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQXR0clN1Yk1hdGNoUnVsZXNMaXN0LmluYyIKK307CisKK2NvbnN0IGNoYXIgKmdldFN1YmplY3RNYXRjaFJ1bGVTcGVsbGluZyhTdWJqZWN0TWF0Y2hSdWxlIFJ1bGUpOworCit1c2luZyBQYXJzZWRTdWJqZWN0TWF0Y2hSdWxlU2V0ID0gbGx2bTo6RGVuc2VNYXA8aW50LCBTb3VyY2VSYW5nZT47CisKK30gLy8gZW5kIG5hbWVzcGFjZSBhdHRyCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyaWJ1dGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyaWJ1dGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY1MWFiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHJpYnV0ZXMuaApAQCAtMCwwICsxLDQzIEBACisvLz09PS0tLSBBdHRyaWJ1dGVzLmggLSBBdHRyaWJ1dGVzIGhlYWRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfQVRUUklCVVRFU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfQVRUUklCVVRFU19ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MYW5nT3B0aW9ucy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1RhcmdldEluZm8uaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgSWRlbnRpZmllckluZm87CisKK2VudW0gY2xhc3MgQXR0clN5bnRheCB7CisgIC8vLyBJcyB0aGUgaWRlbnRpZmllciBrbm93biBhcyBhIEdOVS1zdHlsZSBhdHRyaWJ1dGU/CisgIEdOVSwKKyAgLy8vIElzIHRoZSBpZGVudGlmaWVyIGtub3duIGFzIGEgX19kZWNsc3BlYy1zdHlsZSBhdHRyaWJ1dGU/CisgIERlY2xzcGVjLAorICAvLy8gSXMgdGhlIGlkZW50aWZpZXIga25vd24gYXMgYSBbXSBNaWNyb3NvZnQtc3R5bGUgYXR0cmlidXRlPworICBNaWNyb3NvZnQsCisgIC8vIElzIHRoZSBpZGVudGlmaWVyIGtub3duIGFzIGEgQysrLXN0eWxlIGF0dHJpYnV0ZT8KKyAgQ1hYLAorICAvLyBJcyB0aGUgaWRlbnRpZmllciBrbm93biBhcyBhIEMtc3R5bGUgYXR0cmlidXRlPworICBDLAorICAvLyBJcyB0aGUgaWRlbnRpZmllciBrbm93biBhcyBhIHByYWdtYSBhdHRyaWJ1dGU/CisgIFByYWdtYQorfTsKKworLy8vIFxicmllZiBSZXR1cm4gdGhlIHZlcnNpb24gbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXR0cmlidXRlIGlmIHdlCisvLy8gcmVjb2duaXplIGFuZCBpbXBsZW1lbnQgdGhlIGF0dHJpYnV0ZSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIGluZm9ybWF0aW9uLgoraW50IGhhc0F0dHJpYnV0ZShBdHRyU3ludGF4IFN5bnRheCwgY29uc3QgSWRlbnRpZmllckluZm8gKlNjb3BlLAorICAgICAgICAgICAgICAgICBjb25zdCBJZGVudGlmaWVySW5mbyAqQXR0ciwgY29uc3QgVGFyZ2V0SW5mbyAmVGFyZ2V0LAorICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQkFTSUNfQVRUUklCVVRFU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGlucy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGlucy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZiNzJiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zLmRlZgpAQCAtMCwwICsxLDE0NjQgQEAKKy8vPT09LS0tIEJ1aWx0aW5zLmRlZiAtIEJ1aWx0aW4gZnVuY3Rpb24gaW5mbyBkYXRhYmFzZSAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIHN0YW5kYXJkIGJ1aWx0aW4gZnVuY3Rpb24gZGF0YWJhc2UuICBVc2VycyBvZiB0aGlzIGZpbGUKKy8vIG11c3QgZGVmaW5lIHRoZSBCVUlMVElOIG1hY3JvIHRvIG1ha2UgdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gRklYTUU6IFRoaXMgc2hvdWxkIHJlYWxseSBiZSBhIC50ZCBmaWxlLCBidXQgdGhhdCByZXF1aXJlcyBtb2RpZnlpbmcgdGJsZ2VuLgorLy8gUGVyaGFwcyB0YmxnZW4gc2hvdWxkIGhhdmUgcGx1Z2lucy4KKworLy8gVGhlIGZpcnN0IHZhbHVlIHByb3ZpZGVkIHRvIHRoZSBtYWNybyBzcGVjaWZpZXMgdGhlIGZ1bmN0aW9uIG5hbWUgb2YgdGhlCisvLyBidWlsdGluLCBhbmQgcmVzdWx0cyBpbiBhIGNsYW5nOjpidWlsdGluOjpCSVhYIGVudW0gdmFsdWUgZm9yIFhYLgorCisvLyBUaGUgc2Vjb25kIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSBtYWNybyBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uCisvLyAocmVzdWx0IHZhbHVlLCB0aGVuIGVhY2ggYXJndW1lbnQpIGFzIGZvbGxvd3M6CisvLyAgdiAtPiB2b2lkCisvLyAgYiAtPiBib29sZWFuCisvLyAgYyAtPiBjaGFyCisvLyAgcyAtPiBzaG9ydAorLy8gIGkgLT4gaW50CisvLyAgaCAtPiBoYWxmCisvLyAgZiAtPiBmbG9hdAorLy8gIGQgLT4gZG91YmxlCisvLyAgeiAtPiBzaXplX3QKKy8vICB3IC0+IHdjaGFyX3QKKy8vICBGIC0+IGNvbnN0YW50IENGU3RyaW5nCisvLyAgRyAtPiBpZAorLy8gIEggLT4gU0VMCisvLyAgTSAtPiBzdHJ1Y3Qgb2JqY19zdXBlcgorLy8gIGEgLT4gX19idWlsdGluX3ZhX2xpc3QKKy8vICBBIC0+ICJyZWZlcmVuY2UiIHRvIF9fYnVpbHRpbl92YV9saXN0CisvLyAgViAtPiBWZWN0b3IsIGZvbGxvd2VkIGJ5IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgYW5kIHRoZSBiYXNlIHR5cGUuCisvLyAgRSAtPiBleHRfdmVjdG9yLCBmb2xsb3dlZCBieSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFuZCB0aGUgYmFzZSB0eXBlLgorLy8gIFggLT4gX0NvbXBsZXgsIGZvbGxvd2VkIGJ5IHRoZSBiYXNlIHR5cGUuCisvLyAgWSAtPiBwdHJkaWZmX3QKKy8vICBQIC0+IEZJTEUKKy8vICBKIC0+IGptcF9idWYKKy8vICBTSiAtPiBzaWdqbXBfYnVmCisvLyAgSyAtPiB1Y29udGV4dF90CisvLyAgcCAtPiBwaWRfdAorLy8gIC4gLT4gIi4uLiIuICBUaGlzIG1heSBvbmx5IG9jY3VyIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIGxpc3QuCisvLworLy8gVHlwZXMgbWF5IGJlIHByZWZpeGVkIHdpdGggdGhlIGZvbGxvd2luZyBtb2RpZmllcnM6CisvLyAgTCAgIC0+IGxvbmcgKGUuZy4gTGkgZm9yICdsb25nIGludCcsIExkIGZvciAnbG9uZyBkb3VibGUnKQorLy8gIExMICAtPiBsb25nIGxvbmcgKGUuZy4gTExpIGZvciAnbG9uZyBsb25nIGludCcsIExMZCBmb3IgX19mbG9hdDEyOCkKKy8vICBMTEwgLT4gX19pbnQxMjhfdCAoZS5nLiBMTExpKQorLy8gIFcgICAtPiBpbnQ2NF90CisvLyAgTiAgIC0+ICdpbnQnIHNpemUgaWYgdGFyZ2V0IGlzIExQNjQsICdMJyBvdGhlcndpc2UuCisvLyAgUyAgIC0+IHNpZ25lZAorLy8gIFUgICAtPiB1bnNpZ25lZAorLy8gIEkgICAtPiBSZXF1aXJlZCB0byBjb25zdGFudCBmb2xkIHRvIGFuIGludGVnZXIgY29uc3RhbnQgZXhwcmVzc2lvbi4KKy8vCisvLyBUeXBlcyBtYXkgYmUgcG9zdGZpeGVkIHdpdGggdGhlIGZvbGxvd2luZyBtb2RpZmllcnM6CisvLyAqIC0+IHBvaW50ZXIgKG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYW4gYWRkcmVzcyBzcGFjZSBudW1iZXIsIGlmIG5vIGFkZHJlc3MKKy8vICAgICAgICAgICAgICAgc3BhY2UgaXMgc3BlY2lmaWVkIHRoYW4gYW55IGFkZHJlc3Mgc3BhY2Ugd2lsbCBiZSBhY2NlcHRlZCkKKy8vICYgLT4gcmVmZXJlbmNlIChvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGFuIGFkZHJlc3Mgc3BhY2UgbnVtYmVyKQorLy8gQyAtPiBjb25zdAorLy8gRCAtPiB2b2xhdGlsZQorCisvLyBUaGUgdGhpcmQgdmFsdWUgcHJvdmlkZWQgdG8gdGhlIG1hY3JvIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhdHRyaWJ1dGVzCisvLyBvZiB0aGUgZnVuY3Rpb24uICBUaGVzZSBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBwcmVkaWNhdGVzIGluIHRoZQorLy8gQnVpbHRpbjo6Q29udGV4dCBjbGFzcy4gIEN1cnJlbnRseSB3ZSBoYXZlOgorLy8gIG4gLT4gbm90aHJvdworLy8gIHIgLT4gbm9yZXR1cm4KKy8vICBVIC0+IHB1cmUKKy8vICBjIC0+IGNvbnN0CisvLyAgdCAtPiBzaWduYXR1cmUgaXMgbWVhbmluZ2xlc3MsIHVzZSBjdXN0b20gdHlwZWNoZWNraW5nCisvLyAgRiAtPiB0aGlzIGlzIGEgbGliYy9saWJtIGZ1bmN0aW9uIHdpdGggYSAnX19idWlsdGluXycgcHJlZml4IGFkZGVkLgorLy8gIGYgLT4gdGhpcyBpcyBhIGxpYmMvbGlibSBmdW5jdGlvbiB3aXRob3V0IHRoZSAnX19idWlsdGluXycgcHJlZml4LiBJdCBjYW4KKy8vICAgICAgIGJlIGZvbGxvd2VkIGJ5ICc6aGVhZGVybmFtZTonIHRvIHN0YXRlIHdoaWNoIGhlYWRlciB0aGlzIGZ1bmN0aW9uCisvLyAgICAgICBjb21lcyBmcm9tLgorLy8gIGggLT4gdGhpcyBmdW5jdGlvbiByZXF1aXJlcyBhIHNwZWNpZmljIGhlYWRlciBvciBhbiBleHBsaWNpdCBkZWNsYXJhdGlvbi4KKy8vICBpIC0+IHRoaXMgaXMgYSBydW50aW1lIGxpYnJhcnkgaW1wbGVtZW50ZWQgZnVuY3Rpb24gd2l0aG91dCB0aGUKKy8vICAgICAgICdfX2J1aWx0aW5fJyBwcmVmaXguIEl0IHdpbGwgYmUgaW1wbGVtZW50ZWQgaW4gY29tcGlsZXItcnQgb3IgbGliZ2NjLgorLy8gIHA6TjogLT4gdGhpcyBpcyBhIHByaW50Zi1saWtlIGZ1bmN0aW9uIHdob3NlIE50aCBhcmd1bWVudCBpcyB0aGUgZm9ybWF0CisvLyAgICAgICAgICBzdHJpbmcuCisvLyAgUDpOOiAtPiBzaW1pbGFyIHRvIHRoZSBwOk46IGF0dHJpYnV0ZSwgYnV0IHRoZSBmdW5jdGlvbiBpcyBsaWtlIHZwcmludGYKKy8vICAgICAgICAgIGluIHRoYXQgaXQgYWNjZXB0cyBpdHMgYXJndW1lbnRzIGFzIGEgdmFfbGlzdCByYXRoZXIgdGhhbgorLy8gICAgICAgICAgdGhyb3VnaCBhbiBlbGxpcHNpcworLy8gIHM6TjogLT4gdGhpcyBpcyBhIHNjYW5mLWxpa2UgZnVuY3Rpb24gd2hvc2UgTnRoIGFyZ3VtZW50IGlzIHRoZSBmb3JtYXQKKy8vICAgICAgICAgIHN0cmluZy4KKy8vICBTOk46IC0+IHNpbWlsYXIgdG8gdGhlIHM6TjogYXR0cmlidXRlLCBidXQgdGhlIGZ1bmN0aW9uIGlzIGxpa2UgdnNjYW5mCisvLyAgICAgICAgICBpbiB0aGF0IGl0IGFjY2VwdHMgaXRzIGFyZ3VtZW50cyBhcyBhIHZhX2xpc3QgcmF0aGVyIHRoYW4KKy8vICAgICAgICAgIHRocm91Z2ggYW4gZWxsaXBzaXMKKy8vICBlIC0+IGNvbnN0LCBidXQgb25seSB3aGVuIC1mbWF0aC1lcnJubz0wCisvLyAgaiAtPiByZXR1cm5zX3R3aWNlIChsaWtlIHNldGptcCkKKy8vICB1IC0+IGFyZ3VtZW50cyBhcmUgbm90IGV2YWx1YXRlZCBmb3IgdGhlaXIgc2lkZS1lZmZlY3RzCisvLyAgRklYTUU6IGdjYyBoYXMgbm9ubnVsbAorCisjaWYgZGVmaW5lZChCVUlMVElOKSAmJiAhZGVmaW5lZChMSUJCVUlMVElOKQorIyAgZGVmaW5lIExJQkJVSUxUSU4oSUQsIFRZUEUsIEFUVFJTLCBIRUFERVIsIEJVSUxUSU5fTEFORykgQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMpCisjZW5kaWYKKworI2lmIGRlZmluZWQoQlVJTFRJTikgJiYgIWRlZmluZWQoTEFOR0JVSUxUSU4pCisjICBkZWZpbmUgTEFOR0JVSUxUSU4oSUQsIFRZUEUsIEFUVFJTLCBCVUlMVElOX0xBTkcpIEJVSUxUSU4oSUQsIFRZUEUsIEFUVFJTKQorI2VuZGlmCisKKy8vIFN0YW5kYXJkIGxpYmMvbGlibSBmdW5jdGlvbnM6CitCVUlMVElOKF9fYnVpbHRpbl9hdGFuMiAsICJkZGQiICAsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fYXRhbjJmLCAiZmZmIiAgLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2F0YW4ybCwgIkxkTGRMZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fYWJzICAsICJpaSIgICwgIm5jRiIpCitCVUlMVElOKF9fYnVpbHRpbl9jb3B5c2lnbiwgImRkZCIsICJuY0YiKQorQlVJTFRJTihfX2J1aWx0aW5fY29weXNpZ25mLCAiZmZmIiwgIm5jRiIpCitCVUlMVElOKF9fYnVpbHRpbl9jb3B5c2lnbmwsICJMZExkTGQiLCAibmNGIikKK0JVSUxUSU4oX19idWlsdGluX2NvcHlzaWduZjEyOCwgIkxMZExMZExMZCIsICJuY0YiKQorQlVJTFRJTihfX2J1aWx0aW5fZmFicyAsICJkZCIgICwgIm5jRiIpCitCVUlMVElOKF9fYnVpbHRpbl9mYWJzZiwgImZmIiAgLCAibmNGIikKK0JVSUxUSU4oX19idWlsdGluX2ZhYnNsLCAiTGRMZCIsICJuY0YiKQorQlVJTFRJTihfX2J1aWx0aW5fZmFic2YxMjgsICJMTGRMTGQiLCAibmNGIikKK0JVSUxUSU4oX19idWlsdGluX2Ztb2QgLCAiZGRkIiAgLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2Ztb2RmLCAiZmZmIiAgLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2Ztb2RsLCAiTGRMZExkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9mcmV4cCAsICJkZGkqIiAgLCAiRm4iKQorQlVJTFRJTihfX2J1aWx0aW5fZnJleHBmLCAiZmZpKiIgICwgIkZuIikKK0JVSUxUSU4oX19idWlsdGluX2ZyZXhwbCwgIkxkTGRpKiIsICJGbiIpCitCVUlMVElOKF9fYnVpbHRpbl9odWdlX3ZhbCwgImQiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5faHVnZV92YWxmLCAiZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9odWdlX3ZhbGwsICJMZCIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9odWdlX3ZhbGYxMjgsICJMTGQiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5faW5mICAsICJkIiAgICwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2luZmYgLCAiZiIgICAsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9pbmZsICwgIkxkIiAgLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5faW5mZjEyOCAsICJMTGQiICAsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9sYWJzICwgIkxpTGkiICAsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbGxhYnMsICJMTGlMTGkiLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX2xkZXhwICwgImRkaSIgICwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9sZGV4cGYsICJmZmkiICAsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fbGRleHBsLCAiTGRMZGkiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX21vZGYgLCAiZGRkKiIgICwgIkZuIikKK0JVSUxUSU4oX19idWlsdGluX21vZGZmLCAiZmZmKiIgICwgIkZuIikKK0JVSUxUSU4oX19idWlsdGluX21vZGZsLCAiTGRMZExkKiIsICJGbiIpCitCVUlMVElOKF9fYnVpbHRpbl9uYW4sICAiZGNDKiIgLCAibmNGIikKK0JVSUxUSU4oX19idWlsdGluX25hbmYsICJmY0MqIiAsICJuY0YiKQorQlVJTFRJTihfX2J1aWx0aW5fbmFubCwgIkxkY0MqIiwgIm5jRiIpCitCVUlMVElOKF9fYnVpbHRpbl9uYW5mMTI4LCAiTExkY0MqIiwgIm5jRiIpCitCVUlMVElOKF9fYnVpbHRpbl9uYW5zLCAgImRjQyoiICwgIm5jRiIpCitCVUlMVElOKF9fYnVpbHRpbl9uYW5zZiwgImZjQyoiICwgIm5jRiIpCitCVUlMVElOKF9fYnVpbHRpbl9uYW5zbCwgIkxkY0MqIiwgIm5jRiIpCitCVUlMVElOKF9fYnVpbHRpbl9uYW5zZjEyOCwgIkxMZGNDKiIsICJuY0YiKQorQlVJTFRJTihfX2J1aWx0aW5fcG93aSAsICJkZGkiICAsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fcG93aWYsICJmZmkiICAsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fcG93aWwsICJMZExkaSIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fcG93ICwgImRkZCIgICwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9wb3dmLCAiZmZmIiAgLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX3Bvd2wsICJMZExkTGQiLCAiRm5lIikKKworLy8gU3RhbmRhcmQgdW5hcnkgbGliYy9saWJtIGZ1bmN0aW9ucyB3aXRoIGRvdWJsZS9mbG9hdC9sb25nIGRvdWJsZSB2YXJpYW50czoKK0JVSUxUSU4oX19idWlsdGluX2Fjb3MgLCAiZGQiICAsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fYWNvc2YsICJmZiIgICwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9hY29zbCwgIkxkTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2Fjb3NoICwgImRkIiAgLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2Fjb3NoZiwgImZmIiAgLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2Fjb3NobCwgIkxkTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2FzaW4gLCAiZGQiICAsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fYXNpbmYsICJmZiIgICwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9hc2lubCwgIkxkTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2FzaW5oICwgImRkIiAgLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2FzaW5oZiwgImZmIiAgLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2FzaW5obCwgIkxkTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2F0YW4gLCAiZGQiICAsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fYXRhbmYsICJmZiIgICwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9hdGFubCwgIkxkTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2F0YW5oICwgImRkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9hdGFuaGYsICJmZiIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fYXRhbmhsLCAiTGRMZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY2JydCAsICJkZCIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fY2JydGYsICJmZiIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fY2JydGwsICJMZExkIiwgIkZuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9jZWlsICwgImRkIiAgLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX2NlaWxmLCAiZmYiICAsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fY2VpbGwsICJMZExkIiwgIkZuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9jb3MgLCAiZGQiICAsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY29zZiwgImZmIiAgLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2Nvc2ggLCAiZGQiICAsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY29zaGYsICJmZiIgICwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9jb3NobCwgIkxkTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2Nvc2wsICJMZExkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9lcmYgLCAiZGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2VyZmYsICJmZiIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fZXJmbCwgIkxkTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2VyZmMgLCAiZGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2VyZmNmLCAiZmYiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2VyZmNsLCAiTGRMZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fZXhwICwgImRkIiAgLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2V4cGYsICJmZiIgICwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9leHBsLCAiTGRMZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fZXhwMiAsICJkZCIgICwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9leHAyZiwgImZmIiAgLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2V4cDJsLCAiTGRMZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fZXhwbTEgLCAiZGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2V4cG0xZiwgImZmIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9leHBtMWwsICJMZExkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9mZGltLCAiZGRkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9mZGltZiwgImZmZiIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fZmRpbWwsICJMZExkTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2Zsb29yICwgImRkIiAgLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX2Zsb29yZiwgImZmIiAgLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX2Zsb29ybCwgIkxkTGQiLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX2ZtYSwgImRkZGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2ZtYWYsICJmZmZmIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9mbWFsLCAiTGRMZExkTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2ZtYXgsICJkZGQiLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX2ZtYXhmLCAiZmZmIiwgIkZuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9mbWF4bCwgIkxkTGRMZCIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fZm1pbiwgImRkZCIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fZm1pbmYsICJmZmYiLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX2ZtaW5sLCAiTGRMZExkIiwgIkZuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9oeXBvdCAsICJkZGQiICAsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5faHlwb3RmLCAiZmZmIiAgLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2h5cG90bCwgIkxkTGRMZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5faWxvZ2IgLCAiaWQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2lsb2diZiwgImlmIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9pbG9nYmwsICJpTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2xnYW1tYSAsICJkZCIsICJGbiIpCitCVUlMVElOKF9fYnVpbHRpbl9sZ2FtbWFmLCAiZmYiLCAiRm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbGdhbW1hbCwgIkxkTGQiLCAiRm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbGxyaW50LCAiTExpZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fbGxyaW50ZiwgIkxMaWYiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2xscmludGwsICJMTGlMZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fbGxyb3VuZCAsICJMTGlkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9sbHJvdW5kZiwgIkxMaWYiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2xscm91bmRsLCAiTExpTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2xvZyAsICJkZCIgICwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9sb2cxMCAsICJkZCIgICwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9sb2cxMGYsICJmZiIgICwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9sb2cxMGwsICJMZExkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9sb2cxcCAsICJkZCIgICwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9sb2cxcGYsICJmZiIgICwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9sb2cxcGwsICJMZExkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9sb2cyLCAiZGQiICAsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fbG9nMmYsICJmZiIgICwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9sb2cybCwgIkxkTGQiICAsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fbG9nYiAsICJkZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fbG9nYmYsICJmZiIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fbG9nYmwsICJMZExkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9sb2dmLCAiZmYiICAsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fbG9nbCwgIkxkTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2xyaW50ICwgIkxpZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fbHJpbnRmLCAiTGlmIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9scmludGwsICJMaUxkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9scm91bmQgLCAiTGlkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9scm91bmRmLCAiTGlmIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9scm91bmRsLCAiTGlMZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fbmVhcmJ5aW50ICwgImRkIiwgIkZuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9uZWFyYnlpbnRmLCAiZmYiLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX25lYXJieWludGwsICJMZExkIiwgIkZuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9uZXh0YWZ0ZXIgLCAiZGRkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9uZXh0YWZ0ZXJmLCAiZmZmIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9uZXh0YWZ0ZXJsLCAiTGRMZExkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9uZXh0dG93YXJkICwgImRkTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX25leHR0b3dhcmRmLCAiZmZMZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fbmV4dHRvd2FyZGwsICJMZExkTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX3JlbWFpbmRlciAsICJkZGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX3JlbWFpbmRlcmYsICJmZmYiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX3JlbWFpbmRlcmwsICJMZExkTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX3JlbXF1byAsICJkZGRpKiIsICJGbiIpCitCVUlMVElOKF9fYnVpbHRpbl9yZW1xdW9mLCAiZmZmaSoiLCAiRm4iKQorQlVJTFRJTihfX2J1aWx0aW5fcmVtcXVvbCwgIkxkTGRMZGkqIiwgIkZuIikKK0JVSUxUSU4oX19idWlsdGluX3JpbnQgLCAiZGQiLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX3JpbnRmLCAiZmYiLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX3JpbnRsLCAiTGRMZCIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fcm91bmQsICJkZCIgICwgIkZuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9yb3VuZGYsICJmZiIgICwgIkZuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9yb3VuZGwsICJMZExkIiAgLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX3NjYWxibG4gLCAiZGRMaSIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fc2NhbGJsbmYsICJmZkxpIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9zY2FsYmxubCwgIkxkTGRMaSIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fc2NhbGJuICwgImRkaSIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fc2NhbGJuZiwgImZmaSIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fc2NhbGJubCwgIkxkTGRpIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9zaW4gLCAiZGQiICAsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fc2luZiwgImZmIiAgLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX3NpbmggLCAiZGQiICAsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fc2luaGYsICJmZiIgICwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9zaW5obCwgIkxkTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX3NpbmwsICJMZExkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9zcXJ0ICwgImRkIiAgLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX3NxcnRmLCAiZmYiICAsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fc3FydGwsICJMZExkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl90YW4gLCAiZGQiICAsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fdGFuZiwgImZmIiAgLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX3RhbmggLCAiZGQiICAsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fdGFuaGYsICJmZiIgICwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl90YW5obCwgIkxkTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX3RhbmwsICJMZExkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl90Z2FtbWEgLCAiZGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX3RnYW1tYWYsICJmZiIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fdGdhbW1hbCwgIkxkTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX3RydW5jICwgImRkIiwgIkZuYyIpCitCVUlMVElOKF9fYnVpbHRpbl90cnVuY2YsICJmZiIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fdHJ1bmNsLCAiTGRMZCIsICJGbmMiKQorCisvLyBDOTkgY29tcGxleCBidWlsdGlucworQlVJTFRJTihfX2J1aWx0aW5fY2FicywgImRYZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY2Fic2YsICJmWGYiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2NhYnNsLCAiTGRYTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2NhY29zLCAiWGRYZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY2Fjb3NmLCAiWGZYZiIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY2Fjb3NoLCAiWGRYZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY2Fjb3NoZiwgIlhmWGYiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2NhY29zaGwsICJYTGRYTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2NhY29zbCwgIlhMZFhMZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY2FyZywgImRYZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY2FyZ2YsICJmWGYiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2NhcmdsLCAiTGRYTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2Nhc2luLCAiWGRYZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY2FzaW5mLCAiWGZYZiIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY2FzaW5oLCAiWGRYZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY2FzaW5oZiwgIlhmWGYiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2Nhc2luaGwsICJYTGRYTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2Nhc2lubCwgIlhMZFhMZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY2F0YW4sICJYZFhkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9jYXRhbmYsICJYZlhmIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9jYXRhbmgsICJYZFhkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9jYXRhbmhmLCAiWGZYZiIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY2F0YW5obCwgIlhMZFhMZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY2F0YW5sLCAiWExkWExkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9jY29zLCAiWGRYZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY2Nvc2YsICJYZlhmIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9jY29zbCwgIlhMZFhMZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY2Nvc2gsICJYZFhkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9jY29zaGYsICJYZlhmIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9jY29zaGwsICJYTGRYTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2NleHAsICJYZFhkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9jZXhwZiwgIlhmWGYiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2NleHBsLCAiWExkWExkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9jaW1hZywgImRYZCIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fY2ltYWdmLCAiZlhmIiwgIkZuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9jaW1hZ2wsICJMZFhMZCIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fY29uaiwgIlhkWGQiLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX2NvbmpmLCAiWGZYZiIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fY29uamwsICJYTGRYTGQiLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX2Nsb2csICJYZFhkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9jbG9nZiwgIlhmWGYiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2Nsb2dsLCAiWExkWExkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9jcHJvaiwgIlhkWGQiLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX2Nwcm9qZiwgIlhmWGYiLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX2Nwcm9qbCwgIlhMZFhMZCIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fY3BvdywgIlhkWGRYZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY3Bvd2YsICJYZlhmWGYiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2Nwb3dsLCAiWExkWExkWExkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9jcmVhbCwgImRYZCIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fY3JlYWxmLCAiZlhmIiwgIkZuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9jcmVhbGwsICJMZFhMZCIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fY3NpbiwgIlhkWGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2NzaW5mLCAiWGZYZiIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY3NpbmwsICJYTGRYTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2NzaW5oLCAiWGRYZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY3NpbmhmLCAiWGZYZiIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY3NpbmhsLCAiWExkWExkIiwgIkZuZSIpCitCVUlMVElOKF9fYnVpbHRpbl9jc3FydCwgIlhkWGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2NzcXJ0ZiwgIlhmWGYiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2NzcXJ0bCwgIlhMZFhMZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY3RhbiwgIlhkWGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2N0YW5mLCAiWGZYZiIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY3RhbmwsICJYTGRYTGQiLCAiRm5lIikKK0JVSUxUSU4oX19idWlsdGluX2N0YW5oLCAiWGRYZCIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY3RhbmhmLCAiWGZYZiIsICJGbmUiKQorQlVJTFRJTihfX2J1aWx0aW5fY3RhbmhsLCAiWExkWExkIiwgIkZuZSIpCisKKy8vIEZQIENvbXBhcmlzb25zLgorQlVJTFRJTihfX2J1aWx0aW5faXNncmVhdGVyICAgICAsICJpLiIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5faXNncmVhdGVyZXF1YWwsICJpLiIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5faXNsZXNzICAgICAgICAsICJpLiIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5faXNsZXNzZXF1YWwgICAsICJpLiIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5faXNsZXNzZ3JlYXRlciAsICJpLiIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5faXN1bm9yZGVyZWQgICAsICJpLiIsICJGbmMiKQorCisvLyBVbmFyeSBGUCBjbGFzc2lmaWNhdGlvbgorQlVJTFRJTihfX2J1aWx0aW5fZnBjbGFzc2lmeSwgImlpaWlpaS4iLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX2lzZmluaXRlLCAgICJpLiIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5faXNpbmYsICAgICAgImkuIiwgIkZuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9pc2luZl9zaWduLCAiaS4iLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX2lzbmFuLCAgICAgICJpLiIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5faXNub3JtYWwsICAgImkuIiwgIkZuYyIpCisKKy8vIEZQIHNpZ25iaXQgYnVpbHRpbnMKK0JVSUxUSU4oX19idWlsdGluX3NpZ25iaXQsICJpLiIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fc2lnbmJpdGYsICJpZiIsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fc2lnbmJpdGwsICJpTGQiLCAiRm5jIikKKworLy8gU3BlY2lhbCBGUCBidWlsdGlucy4KK0JVSUxUSU4oX19idWlsdGluX2Nhbm9uaWNhbGl6ZSwgImRkIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2Nhbm9uaWNhbGl6ZWYsICJmZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9jYW5vbmljYWxpemVsLCAiTGRMZCIsICJuYyIpCisKKy8vIEJ1aWx0aW5zIGZvciBhcml0aG1ldGljLgorQlVJTFRJTihfX2J1aWx0aW5fY2x6cyAsICJpVXMiICAsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9jbHogICwgImlVaSIgICwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2NsemwgLCAiaVVMaSIgLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fY2x6bGwsICJpVUxMaSIsICJuYyIpCisvLyBUT0RPOiBpbnQgY2x6aW1heCh1aW50bWF4X3QpCitCVUlMVElOKF9fYnVpbHRpbl9jdHpzICwgImlVcyIgICwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2N0eiAgLCAiaVVpIiAgLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fY3R6bCAsICJpVUxpIiAsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9jdHpsbCwgImlVTExpIiwgIm5jIikKKy8vIFRPRE86IGludCBjdHppbWF4KHVpbnRtYXhfdCkKK0JVSUxUSU4oX19idWlsdGluX2ZmcyAgLCAiaWkiICAsICJGbmMiKQorQlVJTFRJTihfX2J1aWx0aW5fZmZzbCAsICJpTGkiICwgIkZuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9mZnNsbCwgImlMTGkiLCAiRm5jIikKK0JVSUxUSU4oX19idWlsdGluX3Bhcml0eSAgLCAiaVVpIiAgLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fcGFyaXR5bCAsICJpVUxpIiAsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9wYXJpdHlsbCwgImlVTExpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX3BvcGNvdW50ICAsICJpVWkiICAsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9wb3Bjb3VudGwgLCAiaVVMaSIgLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fcG9wY291bnRsbCwgImlVTExpIiwgIm5jIikKKworLy8gRklYTUU6IFRoZXNlIHR5cGUgc2lnbmF0dXJlcyBhcmUgbm90IGNvcnJlY3QgZm9yIHRhcmdldHMgd2l0aCBpbnQgIT0gMzItYml0cworLy8gb3Igd2l0aCBVTEwgIT0gNjQtYml0cy4KK0JVSUxUSU4oX19idWlsdGluX2Jzd2FwMTYsICJVc1VzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2Jzd2FwMzIsICJVaVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2Jzd2FwNjQsICJVTExpVUxMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX2JpdHJldmVyc2U4LCAiVWNVYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9iaXRyZXZlcnNlMTYsICJVc1VzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2JpdHJldmVyc2UzMiwgIlVpVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYml0cmV2ZXJzZTY0LCAiVUxMaVVMTGkiLCAibmMiKQorCisvLyBSYW5kb20gR0NDIGJ1aWx0aW5zCitCVUlMVElOKF9fYnVpbHRpbl9jb25zdGFudF9wLCAiaS4iLCAibmN0dSIpCitCVUlMVElOKF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlLCAiaS4iLCAibmN0dSIpCitCVUlMVElOKF9fYnVpbHRpbl9fX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nLCAiRkMqY0MqIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX19fTlNTdHJpbmdNYWtlQ29uc3RhbnRTdHJpbmcsICJGQypjQyoiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fdmFfc3RhcnQsICJ2QS4iLCAibnQiKQorQlVJTFRJTihfX2J1aWx0aW5fdmFfZW5kLCAidkEiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl92YV9jb3B5LCAidkFBIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fc3RkYXJnX3N0YXJ0LCAidkEuIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQsICJ2KnZDKnouIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2JjbXAsICJpdip2KnoiLCAiRm4iKQorQlVJTFRJTihfX2J1aWx0aW5fYmNvcHksICJ2dip2KnoiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9iemVybywgInZ2KnoiLCAibkYiKQorQlVJTFRJTihfX2J1aWx0aW5fZnByaW50ZiwgImlQKmNDKi4iLCAiRnA6MToiKQorQlVJTFRJTihfX2J1aWx0aW5fbWVtY2hyLCAidip2QyppeiIsICJuRiIpCitCVUlMVElOKF9fYnVpbHRpbl9tZW1jbXAsICJpdkMqdkMqeiIsICJuRiIpCitCVUlMVElOKF9fYnVpbHRpbl9tZW1jcHksICJ2KnYqdkMqeiIsICJuRiIpCitCVUlMVElOKF9fYnVpbHRpbl9tZW1tb3ZlLCAidip2KnZDKnoiLCAibkYiKQorQlVJTFRJTihfX2J1aWx0aW5fbWVtcGNweSwgInYqdip2Qyp6IiwgIm5GIikKK0JVSUxUSU4oX19idWlsdGluX21lbXNldCwgInYqdippeiIsICJuRiIpCitCVUlMVElOKF9fYnVpbHRpbl9wcmludGYsICJpY0MqLiIsICJGcDowOiIpCitCVUlMVElOKF9fYnVpbHRpbl9zdHBjcHksICJjKmMqY0MqIiwgIm5GIikKK0JVSUxUSU4oX19idWlsdGluX3N0cG5jcHksICJjKmMqY0MqeiIsICJuRiIpCitCVUlMVElOKF9fYnVpbHRpbl9zdHJjYXNlY21wLCAiaWNDKmNDKiIsICJuRiIpCitCVUlMVElOKF9fYnVpbHRpbl9zdHJjYXQsICJjKmMqY0MqIiwgIm5GIikKK0JVSUxUSU4oX19idWlsdGluX3N0cmNociwgImMqY0MqaSIsICJuRiIpCitCVUlMVElOKF9fYnVpbHRpbl9zdHJjbXAsICJpY0MqY0MqIiwgIm5GIikKK0JVSUxUSU4oX19idWlsdGluX3N0cmNweSwgImMqYypjQyoiLCAibkYiKQorQlVJTFRJTihfX2J1aWx0aW5fc3RyY3NwbiwgInpjQypjQyoiLCAibkYiKQorQlVJTFRJTihfX2J1aWx0aW5fc3RyZHVwLCAiYypjQyoiLCAibkYiKQorQlVJTFRJTihfX2J1aWx0aW5fc3RybGVuLCAiemNDKiIsICJuRiIpCitCVUlMVElOKF9fYnVpbHRpbl9zdHJuY2FzZWNtcCwgImljQypjQyp6IiwgIm5GIikKK0JVSUxUSU4oX19idWlsdGluX3N0cm5jYXQsICJjKmMqY0MqeiIsICJuRiIpCitCVUlMVElOKF9fYnVpbHRpbl9zdHJuY21wLCAiaWNDKmNDKnoiLCAibkYiKQorQlVJTFRJTihfX2J1aWx0aW5fc3RybmNweSwgImMqYypjQyp6IiwgIm5GIikKK0JVSUxUSU4oX19idWlsdGluX3N0cm5kdXAsICJjKmNDKnoiLCAibkYiKQorQlVJTFRJTihfX2J1aWx0aW5fc3RycGJyaywgImMqY0MqY0MqIiwgIm5GIikKK0JVSUxUSU4oX19idWlsdGluX3N0cnJjaHIsICJjKmNDKmkiLCAibkYiKQorQlVJTFRJTihfX2J1aWx0aW5fc3Ryc3BuLCAiemNDKmNDKiIsICJuRiIpCitCVUlMVElOKF9fYnVpbHRpbl9zdHJzdHIsICJjKmNDKmNDKiIsICJuRiIpCitCVUlMVElOKF9fYnVpbHRpbl93Y3NjaHIsICJ3KndDKnciLCAibkYiKQorQlVJTFRJTihfX2J1aWx0aW5fd2NzY21wLCAiaXdDKndDKiIsICJuRiIpCitCVUlMVElOKF9fYnVpbHRpbl93Y3NsZW4sICJ6d0MqIiwgIm5GIikKK0JVSUxUSU4oX19idWlsdGluX3djc25jbXAsICJpd0Mqd0MqeiIsICJuRiIpCitCVUlMVElOKF9fYnVpbHRpbl93bWVtY2hyLCAidyp3Qyp3eiIsICJuRiIpCitCVUlMVElOKF9fYnVpbHRpbl93bWVtY21wLCAiaXdDKndDKnoiLCAibkYiKQorQlVJTFRJTihfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MsICJ2KklVaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX2V4dHJhY3RfcmV0dXJuX2FkZHIsICJ2KnYqIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcywgInYqSVVpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fX19jbGVhcl9jYWNoZSwgInZjKmMqIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fZmx0X3JvdW5kcywgImkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fc2V0am1wLCAiaXYqKiIsICJqIikKK0JVSUxUSU4oX19idWlsdGluX2xvbmdqbXAsICJ2dioqaSIsICJyIikKK0JVSUxUSU4oX19idWlsdGluX3Vud2luZF9pbml0LCAidiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fZWhfcmV0dXJuX2RhdGFfcmVnbm8sICJpSWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fc25wcmludGYsICJpYyp6Y0MqLiIsICJuRnA6MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fdnNwcmludGYsICJpYypjQyphIiwgIm5GUDoxOiIpCitCVUlMVElOKF9fYnVpbHRpbl92c25wcmludGYsICJpYyp6Y0MqYSIsICJuRlA6MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fdGhyZWFkX3BvaW50ZXIsICJ2KiIsICJuYyIpCisKKy8vIEdDQyBleGNlcHRpb24gYnVpbHRpbnMKK0JVSUxUSU4oX19idWlsdGluX2VoX3JldHVybiwgInZ6dioiLCAiciIpIC8vIEZJWE1FOiBUYWtlcyBpbnRwdHJfdCwgbm90IHNpemVfdCEKK0JVSUxUSU4oX19idWlsdGluX2Zyb2JfcmV0dXJuX2FkZHIsICJ2KnYqIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fZHdhcmZfY2ZhLCAidioiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9pbml0X2R3YXJmX3JlZ19zaXplX3RhYmxlLCAidnYqIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fZHdhcmZfc3BfY29sdW1uLCAiVWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9leHRlbmRfcG9pbnRlciwgIlVMTGl2KiIsICJuIikgLy8gX1Vud2luZF9Xb3JkID09IHVpbnQ2NF90CisKKy8vIEdDQyBPYmplY3Qgc2l6ZSBjaGVja2luZyBidWlsdGlucworQlVJTFRJTihfX2J1aWx0aW5fb2JqZWN0X3NpemUsICJ6dkMqaSIsICJudSIpCitCVUlMVElOKF9fYnVpbHRpbl9fX21lbWNweV9jaGssICJ2KnYqdkMqenoiLCAibkYiKQorQlVJTFRJTihfX2J1aWx0aW5fX19tZW1jY3B5X2NoaywgInYqdip2QyppenoiLCAibkYiKQorQlVJTFRJTihfX2J1aWx0aW5fX19tZW1tb3ZlX2NoaywgInYqdip2Qyp6eiIsICJuRiIpCitCVUlMVElOKF9fYnVpbHRpbl9fX21lbXBjcHlfY2hrLCAidip2KnZDKnp6IiwgIm5GIikKK0JVSUxUSU4oX19idWlsdGluX19fbWVtc2V0X2NoaywgInYqdippenoiLCAibkYiKQorQlVJTFRJTihfX2J1aWx0aW5fX19zdHBjcHlfY2hrLCAiYypjKmNDKnoiLCAibkYiKQorQlVJTFRJTihfX2J1aWx0aW5fX19zdHJjYXRfY2hrLCAiYypjKmNDKnoiLCAibkYiKQorQlVJTFRJTihfX2J1aWx0aW5fX19zdHJjcHlfY2hrLCAiYypjKmNDKnoiLCAibkYiKQorQlVJTFRJTihfX2J1aWx0aW5fX19zdHJsY2F0X2NoaywgInpjKmNDKnp6IiwgIm5GIikKK0JVSUxUSU4oX19idWlsdGluX19fc3RybGNweV9jaGssICJ6YypjQyp6eiIsICJuRiIpCitCVUlMVElOKF9fYnVpbHRpbl9fX3N0cm5jYXRfY2hrLCAiYypjKmNDKnp6IiwgIm5GIikKK0JVSUxUSU4oX19idWlsdGluX19fc3RybmNweV9jaGssICJjKmMqY0MqenoiLCAibkYiKQorQlVJTFRJTihfX2J1aWx0aW5fX19zdHBuY3B5X2NoaywgImMqYypjQyp6eiIsICJuRiIpCitCVUlMVElOKF9fYnVpbHRpbl9fX3NucHJpbnRmX2NoaywgImljKnppemNDKi4iLCAiRnA6NDoiKQorQlVJTFRJTihfX2J1aWx0aW5fX19zcHJpbnRmX2NoaywgImljKml6Y0MqLiIsICJGcDozOiIpCitCVUlMVElOKF9fYnVpbHRpbl9fX3ZzbnByaW50Zl9jaGssICJpYyp6aXpjQyphIiwgIkZQOjQ6IikKK0JVSUxUSU4oX19idWlsdGluX19fdnNwcmludGZfY2hrLCAiaWMqaXpjQyphIiwgIkZQOjM6IikKK0JVSUxUSU4oX19idWlsdGluX19fZnByaW50Zl9jaGssICJpUCppY0MqLiIsICJGcDoyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9fX3ByaW50Zl9jaGssICJpaWNDKi4iLCAiRnA6MToiKQorQlVJTFRJTihfX2J1aWx0aW5fX192ZnByaW50Zl9jaGssICJpUCppY0MqYSIsICJGUDoyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9fX3ZwcmludGZfY2hrLCAiaWljQyphIiwgIkZQOjE6IikKKworQlVJTFRJTihfX2J1aWx0aW5fdW5wcmVkaWN0YWJsZSwgIkxpTGkiICAgLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fZXhwZWN0LCAiTGlMaUxpIiAgICwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX3ByZWZldGNoLCAidnZDKi4iLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fcmVhZGN5Y2xlY291bnRlciwgIlVMTGkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl90cmFwLCAidiIsICJuciIpCitCVUlMVElOKF9fYnVpbHRpbl9kZWJ1Z3RyYXAsICJ2IiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fdW5yZWFjaGFibGUsICJ2IiwgIm5yIikKK0JVSUxUSU4oX19idWlsdGluX3NodWZmbGV2ZWN0b3IsICJ2LiIgICAsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yLCAidi4iICAgLCAibmN0IikKK0JVSUxUSU4oX19idWlsdGluX2FsbG9jYSwgInYqeiIgICAsICJGbiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbGxvY2Ffd2l0aF9hbGlnbiwgInYqekl6IiwgIkZuIikKK0JVSUxUSU4oX19idWlsdGluX2NhbGxfd2l0aF9zdGF0aWNfY2hhaW4sICJ2LiIsICJudCIpCisKKy8vICJPdmVybG9hZGVkIiBBdG9taWMgb3BlcmF0b3IgYnVpbHRpbnMuICBUaGVzZSBhcmUgb3ZlcmxvYWRlZCB0byBzdXBwb3J0IGRhdGEKKy8vIHR5cGVzIG9mIGk4LCBpMTYsIGkzMiwgaTY0LCBhbmQgaTEyOC4gIFRoZSBmcm9udC1lbmQgc2VlcyBjYWxscyB0byB0aGUKKy8vIG5vbi1zdWZmaXhlZCB2ZXJzaW9uIG9mIHRoZXNlICh3aGljaCBoYXMgYSBib2d1cyB0eXBlKSBhbmQgdHJhbnNmb3JtcyB0aGVtIHRvCisvLyB0aGUgcmlnaHQgb3ZlcmxvYWRlZCB2ZXJzaW9uIGluIFNlbWEgKHBsdXMgY2FzdHMpLgorCisvLyBGSVhNRTogVGhlc2UgYXNzdW1lIHRoYXQgY2hhciAtPiBpOCwgc2hvcnQgLT4gaTE2LCBpbnQgLT4gaTMyLAorLy8gbG9uZyBsb25nIC0+IGk2NC4KKworQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX2FkZCwgInYuIiwgInQiKQorQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX2FkZF8xLCAiY2NEKmMuIiwgIm50IikKK0JVSUxUSU4oX19zeW5jX2ZldGNoX2FuZF9hZGRfMiwgInNzRCpzLiIsICJudCIpCitCVUlMVElOKF9fc3luY19mZXRjaF9hbmRfYWRkXzQsICJpaUQqaS4iLCAibnQiKQorQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX2FkZF84LCAiTExpTExpRCpMTGkuIiwgIm50IikKK0JVSUxUSU4oX19zeW5jX2ZldGNoX2FuZF9hZGRfMTYsICJMTExpTExMaUQqTExMaS4iLCAibnQiKQorCitCVUlMVElOKF9fc3luY19mZXRjaF9hbmRfc3ViLCAidi4iLCAidCIpCitCVUlMVElOKF9fc3luY19mZXRjaF9hbmRfc3ViXzEsICJjY0QqYy4iLCAibnQiKQorQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX3N1Yl8yLCAic3NEKnMuIiwgIm50IikKK0JVSUxUSU4oX19zeW5jX2ZldGNoX2FuZF9zdWJfNCwgImlpRCppLiIsICJudCIpCitCVUlMVElOKF9fc3luY19mZXRjaF9hbmRfc3ViXzgsICJMTGlMTGlEKkxMaS4iLCAibnQiKQorQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX3N1Yl8xNiwgIkxMTGlMTExpRCpMTExpLiIsICJudCIpCisKK0JVSUxUSU4oX19zeW5jX2ZldGNoX2FuZF9vciwgInYuIiwgInQiKQorQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX29yXzEsICJjY0QqYy4iLCAibnQiKQorQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX29yXzIsICJzc0Qqcy4iLCAibnQiKQorQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX29yXzQsICJpaUQqaS4iLCAibnQiKQorQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX29yXzgsICJMTGlMTGlEKkxMaS4iLCAibnQiKQorQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX29yXzE2LCAiTExMaUxMTGlEKkxMTGkuIiwgIm50IikKKworQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX2FuZCwgInYuIiwgInQiKQorQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX2FuZF8xLCAiY2NEKmMuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX2ZldGNoX2FuZF9hbmRfMiwgInNzRCpzLiIsICJ0biIpCitCVUlMVElOKF9fc3luY19mZXRjaF9hbmRfYW5kXzQsICJpaUQqaS4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX2FuZF84LCAiTExpTExpRCpMTGkuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX2ZldGNoX2FuZF9hbmRfMTYsICJMTExpTExMaUQqTExMaS4iLCAidG4iKQorCitCVUlMVElOKF9fc3luY19mZXRjaF9hbmRfeG9yLCAidi4iLCAidCIpCitCVUlMVElOKF9fc3luY19mZXRjaF9hbmRfeG9yXzEsICJjY0QqYy4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX3hvcl8yLCAic3NEKnMuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX2ZldGNoX2FuZF94b3JfNCwgImlpRCppLiIsICJ0biIpCitCVUlMVElOKF9fc3luY19mZXRjaF9hbmRfeG9yXzgsICJMTGlMTGlEKkxMaS4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX3hvcl8xNiwgIkxMTGlMTExpRCpMTExpLiIsICJ0biIpCisKK0JVSUxUSU4oX19zeW5jX2ZldGNoX2FuZF9uYW5kLCAidi4iLCAidCIpCitCVUlMVElOKF9fc3luY19mZXRjaF9hbmRfbmFuZF8xLCAiY2NEKmMuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX2ZldGNoX2FuZF9uYW5kXzIsICJzc0Qqcy4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX25hbmRfNCwgImlpRCppLiIsICJ0biIpCitCVUlMVElOKF9fc3luY19mZXRjaF9hbmRfbmFuZF84LCAiTExpTExpRCpMTGkuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX2ZldGNoX2FuZF9uYW5kXzE2LCAiTExMaUxMTGlEKkxMTGkuIiwgInRuIikKKworQlVJTFRJTihfX3N5bmNfYWRkX2FuZF9mZXRjaCwgInYuIiwgInQiKQorQlVJTFRJTihfX3N5bmNfYWRkX2FuZF9mZXRjaF8xLCAiY2NEKmMuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX2FkZF9hbmRfZmV0Y2hfMiwgInNzRCpzLiIsICJ0biIpCitCVUlMVElOKF9fc3luY19hZGRfYW5kX2ZldGNoXzQsICJpaUQqaS4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfYWRkX2FuZF9mZXRjaF84LCAiTExpTExpRCpMTGkuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX2FkZF9hbmRfZmV0Y2hfMTYsICJMTExpTExMaUQqTExMaS4iLCAidG4iKQorCitCVUlMVElOKF9fc3luY19zdWJfYW5kX2ZldGNoLCAidi4iLCAidCIpCitCVUlMVElOKF9fc3luY19zdWJfYW5kX2ZldGNoXzEsICJjY0QqYy4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfc3ViX2FuZF9mZXRjaF8yLCAic3NEKnMuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX3N1Yl9hbmRfZmV0Y2hfNCwgImlpRCppLiIsICJ0biIpCitCVUlMVElOKF9fc3luY19zdWJfYW5kX2ZldGNoXzgsICJMTGlMTGlEKkxMaS4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfc3ViX2FuZF9mZXRjaF8xNiwgIkxMTGlMTExpRCpMTExpLiIsICJ0biIpCisKK0JVSUxUSU4oX19zeW5jX29yX2FuZF9mZXRjaCwgInYuIiwgInQiKQorQlVJTFRJTihfX3N5bmNfb3JfYW5kX2ZldGNoXzEsICJjY0QqYy4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfb3JfYW5kX2ZldGNoXzIsICJzc0Qqcy4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfb3JfYW5kX2ZldGNoXzQsICJpaUQqaS4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfb3JfYW5kX2ZldGNoXzgsICJMTGlMTGlEKkxMaS4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfb3JfYW5kX2ZldGNoXzE2LCAiTExMaUxMTGlEKkxMTGkuIiwgInRuIikKKworQlVJTFRJTihfX3N5bmNfYW5kX2FuZF9mZXRjaCwgInYuIiwgInQiKQorQlVJTFRJTihfX3N5bmNfYW5kX2FuZF9mZXRjaF8xLCAiY2NEKmMuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX2FuZF9hbmRfZmV0Y2hfMiwgInNzRCpzLiIsICJ0biIpCitCVUlMVElOKF9fc3luY19hbmRfYW5kX2ZldGNoXzQsICJpaUQqaS4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfYW5kX2FuZF9mZXRjaF84LCAiTExpTExpRCpMTGkuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX2FuZF9hbmRfZmV0Y2hfMTYsICJMTExpTExMaUQqTExMaS4iLCAidG4iKQorCitCVUlMVElOKF9fc3luY194b3JfYW5kX2ZldGNoLCAidi4iLCAidCIpCitCVUlMVElOKF9fc3luY194b3JfYW5kX2ZldGNoXzEsICJjY0QqYy4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfeG9yX2FuZF9mZXRjaF8yLCAic3NEKnMuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX3hvcl9hbmRfZmV0Y2hfNCwgImlpRCppLiIsICJ0biIpCitCVUlMVElOKF9fc3luY194b3JfYW5kX2ZldGNoXzgsICJMTGlMTGlEKkxMaS4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfeG9yX2FuZF9mZXRjaF8xNiwgIkxMTGlMTExpRCpMTExpLiIsICJ0biIpCisKK0JVSUxUSU4oX19zeW5jX25hbmRfYW5kX2ZldGNoLCAidi4iLCAidCIpCitCVUlMVElOKF9fc3luY19uYW5kX2FuZF9mZXRjaF8xLCAiY2NEKmMuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX25hbmRfYW5kX2ZldGNoXzIsICJzc0Qqcy4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfbmFuZF9hbmRfZmV0Y2hfNCwgImlpRCppLiIsICJ0biIpCitCVUlMVElOKF9fc3luY19uYW5kX2FuZF9mZXRjaF84LCAiTExpTExpRCpMTGkuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX25hbmRfYW5kX2ZldGNoXzE2LCAiTExMaUxMTGlEKkxMTGkuIiwgInRuIikKKworQlVJTFRJTihfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwLCAidi4iLCAidCIpCitCVUlMVElOKF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXBfMSwgImJjRCpjYy4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwXzIsICJic0Qqc3MuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcF80LCAiYmlEKmlpLiIsICJ0biIpCitCVUlMVElOKF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXBfOCwgImJMTGlEKkxMaUxMaS4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwXzE2LCAiYkxMTGlEKkxMTGlMTExpLiIsICJ0biIpCisKK0JVSUxUSU4oX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwLCAidi4iLCAidCIpCitCVUlMVElOKF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcF8xLCAiY2NEKmNjLiIsICJ0biIpCitCVUlMVElOKF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcF8yLCAic3NEKnNzLiIsICJ0biIpCitCVUlMVElOKF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcF80LCAiaWlEKmlpLiIsICJ0biIpCitCVUlMVElOKF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcF84LCAiTExpTExpRCpMTGlMTGkuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwXzE2LCAiTExMaUxMTGlEKkxMTGlMTExpLiIsICJ0biIpCisKK0JVSUxUSU4oX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0LCAidi4iLCAidCIpCitCVUlMVElOKF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldF8xLCAiY2NEKmMuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0XzIsICJzc0Qqcy4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXRfNCwgImlpRCppLiIsICJ0biIpCitCVUlMVElOKF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldF84LCAiTExpTExpRCpMTGkuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0XzE2LCAiTExMaUxMTGlEKkxMTGkuIiwgInRuIikKKworQlVJTFRJTihfX3N5bmNfbG9ja19yZWxlYXNlLCAidi4iLCAidCIpCitCVUlMVElOKF9fc3luY19sb2NrX3JlbGVhc2VfMSwgInZjRCouIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX2xvY2tfcmVsZWFzZV8yLCAidnNEKi4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfbG9ja19yZWxlYXNlXzQsICJ2aUQqLiIsICJ0biIpCitCVUlMVElOKF9fc3luY19sb2NrX3JlbGVhc2VfOCwgInZMTGlEKi4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfbG9ja19yZWxlYXNlXzE2LCAidkxMTGlEKi4iLCAidG4iKQorCitCVUlMVElOKF9fc3luY19zd2FwLCAidi4iLCAidCIpCitCVUlMVElOKF9fc3luY19zd2FwXzEsICJjY0QqYy4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfc3dhcF8yLCAic3NEKnMuIiwgInRuIikKK0JVSUxUSU4oX19zeW5jX3N3YXBfNCwgImlpRCppLiIsICJ0biIpCitCVUlMVElOKF9fc3luY19zd2FwXzgsICJMTGlMTGlEKkxMaS4iLCAidG4iKQorQlVJTFRJTihfX3N5bmNfc3dhcF8xNiwgIkxMTGlMTExpRCpMTExpLiIsICJ0biIpCisKKy8vIFNvbWUgb2Ygb3VyIGF0b21pY3MgYnVpbHRpbnMgYXJlIGhhbmRsZWQgYnkgQXRvbWljRXhwciByYXRoZXIgdGhhbgorLy8gYXMgbm9ybWFsIGJ1aWx0aW4gQ2FsbEV4cHJzLiBUaGlzIG1hY3JvIGlzIHVzZWQgZm9yIHN1Y2ggYnVpbHRpbnMuCisjaWZuZGVmIEFUT01JQ19CVUlMVElOCisjZGVmaW5lIEFUT01JQ19CVUlMVElOKElELCBUWVBFLCBBVFRSUykgQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMpCisjZW5kaWYKKworLy8gQzExIF9BdG9taWMgb3BlcmF0aW9ucyBmb3IgPHN0ZGF0b21pYy5oPi4KK0FUT01JQ19CVUlMVElOKF9fYzExX2F0b21pY19pbml0LCAidi4iLCAidCIpCitBVE9NSUNfQlVJTFRJTihfX2MxMV9hdG9taWNfbG9hZCwgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19jMTFfYXRvbWljX3N0b3JlLCAidi4iLCAidCIpCitBVE9NSUNfQlVJTFRJTihfX2MxMV9hdG9taWNfZXhjaGFuZ2UsICJ2LiIsICJ0IikKK0FUT01JQ19CVUlMVElOKF9fYzExX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZywgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19jMTFfYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhaywgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19jMTFfYXRvbWljX2ZldGNoX2FkZCwgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19jMTFfYXRvbWljX2ZldGNoX3N1YiwgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19jMTFfYXRvbWljX2ZldGNoX2FuZCwgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19jMTFfYXRvbWljX2ZldGNoX29yLCAidi4iLCAidCIpCitBVE9NSUNfQlVJTFRJTihfX2MxMV9hdG9taWNfZmV0Y2hfeG9yLCAidi4iLCAidCIpCitCVUlMVElOKF9fYzExX2F0b21pY190aHJlYWRfZmVuY2UsICJ2aSIsICJuIikKK0JVSUxUSU4oX19jMTFfYXRvbWljX3NpZ25hbF9mZW5jZSwgInZpIiwgIm4iKQorQlVJTFRJTihfX2MxMV9hdG9taWNfaXNfbG9ja19mcmVlLCAiaXoiLCAibiIpCisKKy8vIEdOVSBhdG9taWMgYnVpbHRpbnMuCitBVE9NSUNfQlVJTFRJTihfX2F0b21pY19sb2FkLCAidi4iLCAidCIpCitBVE9NSUNfQlVJTFRJTihfX2F0b21pY19sb2FkX24sICJ2LiIsICJ0IikKK0FUT01JQ19CVUlMVElOKF9fYXRvbWljX3N0b3JlLCAidi4iLCAidCIpCitBVE9NSUNfQlVJTFRJTihfX2F0b21pY19zdG9yZV9uLCAidi4iLCAidCIpCitBVE9NSUNfQlVJTFRJTihfX2F0b21pY19leGNoYW5nZSwgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19hdG9taWNfZXhjaGFuZ2VfbiwgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19hdG9taWNfY29tcGFyZV9leGNoYW5nZSwgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV9uLCAidi4iLCAidCIpCitBVE9NSUNfQlVJTFRJTihfX2F0b21pY19mZXRjaF9hZGQsICJ2LiIsICJ0IikKK0FUT01JQ19CVUlMVElOKF9fYXRvbWljX2ZldGNoX3N1YiwgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19hdG9taWNfZmV0Y2hfYW5kLCAidi4iLCAidCIpCitBVE9NSUNfQlVJTFRJTihfX2F0b21pY19mZXRjaF9vciwgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19hdG9taWNfZmV0Y2hfeG9yLCAidi4iLCAidCIpCitBVE9NSUNfQlVJTFRJTihfX2F0b21pY19mZXRjaF9uYW5kLCAidi4iLCAidCIpCitBVE9NSUNfQlVJTFRJTihfX2F0b21pY19hZGRfZmV0Y2gsICJ2LiIsICJ0IikKK0FUT01JQ19CVUlMVElOKF9fYXRvbWljX3N1Yl9mZXRjaCwgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19hdG9taWNfYW5kX2ZldGNoLCAidi4iLCAidCIpCitBVE9NSUNfQlVJTFRJTihfX2F0b21pY19vcl9mZXRjaCwgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19hdG9taWNfeG9yX2ZldGNoLCAidi4iLCAidCIpCitBVE9NSUNfQlVJTFRJTihfX2F0b21pY19uYW5kX2ZldGNoLCAidi4iLCAidCIpCitCVUlMVElOKF9fYXRvbWljX3Rlc3RfYW5kX3NldCwgImJ2RCppIiwgIm4iKQorQlVJTFRJTihfX2F0b21pY19jbGVhciwgInZ2RCppIiwgIm4iKQorQlVJTFRJTihfX2F0b21pY190aHJlYWRfZmVuY2UsICJ2aSIsICJuIikKK0JVSUxUSU4oX19hdG9taWNfc2lnbmFsX2ZlbmNlLCAidmkiLCAibiIpCitCVUlMVElOKF9fYXRvbWljX2Fsd2F5c19sb2NrX2ZyZWUsICJpenZDRCoiLCAibiIpCitCVUlMVElOKF9fYXRvbWljX2lzX2xvY2tfZnJlZSwgIml6dkNEKiIsICJuIikKKworLy8gT3BlbkNMIDIuMCBhdG9taWMgYnVpbHRpbnMuCitBVE9NSUNfQlVJTFRJTihfX29wZW5jbF9hdG9taWNfaW5pdCwgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19vcGVuY2xfYXRvbWljX2xvYWQsICJ2LiIsICJ0IikKK0FUT01JQ19CVUlMVElOKF9fb3BlbmNsX2F0b21pY19zdG9yZSwgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19vcGVuY2xfYXRvbWljX2V4Y2hhbmdlLCAidi4iLCAidCIpCitBVE9NSUNfQlVJTFRJTihfX29wZW5jbF9hdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcsICJ2LiIsICJ0IikKK0FUT01JQ19CVUlMVElOKF9fb3BlbmNsX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWssICJ2LiIsICJ0IikKK0FUT01JQ19CVUlMVElOKF9fb3BlbmNsX2F0b21pY19mZXRjaF9hZGQsICJ2LiIsICJ0IikKK0FUT01JQ19CVUlMVElOKF9fb3BlbmNsX2F0b21pY19mZXRjaF9zdWIsICJ2LiIsICJ0IikKK0FUT01JQ19CVUlMVElOKF9fb3BlbmNsX2F0b21pY19mZXRjaF9hbmQsICJ2LiIsICJ0IikKK0FUT01JQ19CVUlMVElOKF9fb3BlbmNsX2F0b21pY19mZXRjaF9vciwgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19vcGVuY2xfYXRvbWljX2ZldGNoX3hvciwgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19vcGVuY2xfYXRvbWljX2ZldGNoX21pbiwgInYuIiwgInQiKQorQVRPTUlDX0JVSUxUSU4oX19vcGVuY2xfYXRvbWljX2ZldGNoX21heCwgInYuIiwgInQiKQorCisjdW5kZWYgQVRPTUlDX0JVSUxUSU4KKworLy8gTm9uLW92ZXJsb2FkZWQgYXRvbWljIGJ1aWx0aW5zLgorQlVJTFRJTihfX3N5bmNfc3luY2hyb25pemUsICJ2IiwgIm4iKQorLy8gR0NDIGRvZXMgbm90IHN1cHBvcnQgdGhlc2UsIHRoZXkgYXJlIGEgQ2xhbmcgZXh0ZW5zaW9uLgorQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX21pbiwgImlpRCppIiwgIm4iKQorQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX21heCwgImlpRCppIiwgIm4iKQorQlVJTFRJTihfX3N5bmNfZmV0Y2hfYW5kX3VtaW4sICJVaVVpRCpVaSIsICJuIikKK0JVSUxUSU4oX19zeW5jX2ZldGNoX2FuZF91bWF4LCAiVWlVaUQqVWkiLCAibiIpCisKKy8vIFJhbmRvbSBsaWJjIGJ1aWx0aW5zLgorQlVJTFRJTihfX2J1aWx0aW5fYWJvcnQsICJ2IiwgIkZuciIpCitCVUlMVElOKF9fYnVpbHRpbl9pbmRleCwgImMqY0MqaSIsICJGbiIpCitCVUlMVElOKF9fYnVpbHRpbl9yaW5kZXgsICJjKmNDKmkiLCAiRm4iKQorCisvLyBNaWNyb3NvZnQgYnVpbHRpbnMuICBUaGVzZSBhcmUgb25seSBhY3RpdmUgd2l0aCAtZm1zLWV4dGVuc2lvbnMuCitMQU5HQlVJTFRJTihfYWxsb2NhLCAgICAgICAgICAidip6IiwgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX19hbm5vdGF0aW9uLCAgICAgIndDKi4iLCJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9fYXNzdW1lLCAgICAgICAgICJ2YiIsICAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMSUJCVUlMVElOKF9ieXRlc3dhcF91c2hvcnQsICJVc1VzIiwgICAgICJmbmMiLCAic3RkbGliLmgiLCBBTExfTVNfTEFOR1VBR0VTKQorTElCQlVJTFRJTihfYnl0ZXN3YXBfdWxvbmcsICAiVU5pVU5pIiwgICAiZm5jIiwgInN0ZGxpYi5oIiwgQUxMX01TX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oX2J5dGVzd2FwX3VpbnQ2NCwgIlVMTGlVTExpIiwgImZuYyIsICJzdGRsaWIuaCIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfX2RlYnVnYnJlYWssICAgICAidiIsICAgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX19leGNlcHRpb25fY29kZSwgIlVOaSIsICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9leGNlcHRpb25fY29kZSwgICJVTmkiLCAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfX2V4Y2VwdGlvbl9pbmZvLCAidioiLCAgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX2V4Y2VwdGlvbl9pbmZvLCAgInYqIiwgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9fYWJub3JtYWxfdGVybWluYXRpb24sICJpIiwgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX2Fibm9ybWFsX3Rlcm1pbmF0aW9uLCAgImkiLCAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfX0dldEV4Y2VwdGlvbkluZm8sICJ2Ki4iLCAibnR1IiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9JbnRlcmxvY2tlZEFuZDgsICAgImNjRCpjIiwgICAgICAgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9JbnRlcmxvY2tlZEFuZDE2LCAgInNzRCpzIiwgICAgICAgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9JbnRlcmxvY2tlZEFuZCwgICAgIk5pTmlEKk5pIiwgICAgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9JbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTgsICAgImNjRCpjYyIsICAgICAgICAgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlMTYsICAic3NEKnNzIiwgICAgICAgICAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UsICAgICJOaU5pRCpOaU5pIiwgICAgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9JbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0LCAgIkxMaUxMaUQqTExpTExpIiwgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlciwgInYqdipEKnYqdioiLCAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfSW50ZXJsb2NrZWREZWNyZW1lbnQxNiwgICAgICAgICJzc0QqIiwgICAgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9JbnRlcmxvY2tlZERlY3JlbWVudCwgICAgICAgICAgIk5pTmlEKiIsICAgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX0ludGVybG9ja2VkRXhjaGFuZ2UsICAgICAgICAgICAiTmlOaUQqTmkiLCAgICAgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX0ludGVybG9ja2VkRXhjaGFuZ2U4LCAgICAgICAgICAiY2NEKmMiLCAgICAgICAgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX0ludGVybG9ja2VkRXhjaGFuZ2UxNiwgICAgICAgICAic3NEKnMiLCAgICAgICAgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX0ludGVybG9ja2VkRXhjaGFuZ2VBZGQ4LCAgICAgICAiY2NEKmMiLCAgICAgICAgICAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDE2LCAgICAgICJzc0QqcyIsICAgICAgICAgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9JbnRlcmxvY2tlZEV4Y2hhbmdlQWRkLCAgICAgICAgIk5pTmlEKk5pIiwgICAgICAgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX0ludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyLCAgICAidip2KkQqdioiLCAgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9JbnRlcmxvY2tlZEV4Y2hhbmdlU3ViOCwgICAiY2NEKmMiLCAgICAgICAgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX0ludGVybG9ja2VkRXhjaGFuZ2VTdWIxNiwgICJzc0QqcyIsICAgICAgICAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfSW50ZXJsb2NrZWRFeGNoYW5nZVN1YiwgICAgIk5pTmlEKk5pIiwgICAgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9JbnRlcmxvY2tlZEluY3JlbWVudDE2LCAgICAgICAgInNzRCoiLCAgICAgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX0ludGVybG9ja2VkSW5jcmVtZW50LCAgICAgICAgICAiTmlOaUQqIiwgICAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfSW50ZXJsb2NrZWRPcjgsICAiY2NEKmMiLCAgICAgICAgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX0ludGVybG9ja2VkT3IxNiwgInNzRCpzIiwgICAgICAgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9JbnRlcmxvY2tlZE9yLCAgICJOaU5pRCpOaSIsICAgICAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfSW50ZXJsb2NrZWRYb3I4LCAgImNjRCpjIiwgICAgICAgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX0ludGVybG9ja2VkWG9yMTYsICJzc0QqcyIsICAgICAgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9JbnRlcmxvY2tlZFhvciwgICAiTmlOaUQqTmkiLCAgICAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfaW50ZXJsb2NrZWRiaXR0ZXN0YW5kc2V0LCAiVWNOaUQqTmkiLCAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfX25vb3AsICAgICAgICAgICAiaS4iLCAgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX19wb3BjbnQxNiwgIlVzVXMiLCAgICAgIm5jIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9fcG9wY250LCAgICJVaVVpIiwgICAgICJuYyIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfX3BvcGNudDY0LCAiVUxMaVVMTGkiLCAibmMiLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX1JldHVybkFkZHJlc3MsICJ2KiIsICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9yb3RsOCwgICJVY1VjVWMiLCAgICAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfcm90bDE2LCAiVXNVc1VjIiwgICAgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX3JvdGwsICAgIlVpVWlpIiwgICAgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9scm90bCwgICJVTmlVTmlpIiwgICAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfcm90bDY0LCAiVUxMaVVMTGlpIiwgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX3JvdHI4LCAgIlVjVWNVYyIsICAgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9yb3RyMTYsICJVc1VzVWMiLCAgICAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfcm90ciwgICAiVWlVaWkiLCAgICAgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX2xyb3RyLCAgIlVOaVVOaWkiLCAgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9yb3RyNjQsICJVTExpVUxMaWkiLCAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfX3ZhX3N0YXJ0LCAgICAgICAidmMqKi4iLCAibnQiLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX19mYXN0ZmFpbCwgInZVaSIsICAgICJuciIsIEFMTF9NU19MQU5HVUFHRVMpCisKKy8vIE1pY3Jvc29mdCBsaWJyYXJ5IGJ1aWx0aW5zLgorTElCQlVJTFRJTihfc2V0am1wZXgsICJpSiIsICJmaiIsICAgInNldGptcGV4LmgiLCBBTExfTVNfTEFOR1VBR0VTKQorCisvLyBDOTkgbGlicmFyeSBmdW5jdGlvbnMKKy8vIEM5OSBzdGRhcmcuaAorTElCQlVJTFRJTih2YV9zdGFydCwgInZBLiIsICAgICAgICJmbiIsICAgICJzdGRhcmcuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHZhX2VuZCwgInZBIiwgICAgICAgICAgImZuIiwgICAgInN0ZGFyZy5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4odmFfY29weSwgInZBQSIsICAgICAgICAiZm4iLCAgICAic3RkYXJnLmgiLCBBTExfTEFOR1VBR0VTKQorLy8gQzk5IHN0ZGxpYi5oCitMSUJCVUlMVElOKGFib3J0LCAidiIsICAgICAgICAgICAgImZyIiwgICAgInN0ZGxpYi5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oY2FsbG9jLCAidip6eiIsICAgICAgICAiZiIsICAgICAic3RkbGliLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihleGl0LCAidmkiLCAgICAgICAgICAgICJmciIsICAgICJzdGRsaWIuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKF9FeGl0LCAidmkiLCAgICAgICAgICAgImZyIiwgICAgInN0ZGxpYi5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4obWFsbG9jLCAidip6IiwgICAgICAgICAiZiIsICAgICAic3RkbGliLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihyZWFsbG9jLCAidip2KnoiLCAgICAgICJmIiwgICAgICJzdGRsaWIuaCIsIEFMTF9MQU5HVUFHRVMpCisvLyBDOTkgc3RyaW5nLmgKK0xJQkJVSUxUSU4obWVtY3B5LCAidip2KnZDKnoiLCAgICAiZiIsICAgICAic3RyaW5nLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihtZW1jbXAsICJpdkMqdkMqeiIsICAgICJmIiwgICAgICJzdHJpbmcuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKG1lbW1vdmUsICJ2KnYqdkMqeiIsICAgImYiLCAgICAgInN0cmluZy5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oc3RyY3B5LCAiYypjKmNDKiIsICAgICAiZiIsICAgICAic3RyaW5nLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihzdHJuY3B5LCAiYypjKmNDKnoiLCAgICJmIiwgICAgICJzdHJpbmcuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHN0cmNtcCwgImljQypjQyoiLCAgICAgImYiLCAgICAgInN0cmluZy5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oc3RybmNtcCwgImljQypjQyp6IiwgICAiZiIsICAgICAic3RyaW5nLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihzdHJjYXQsICJjKmMqY0MqIiwgICAgICJmIiwgICAgICJzdHJpbmcuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHN0cm5jYXQsICJjKmMqY0MqeiIsICAgImYiLCAgICAgInN0cmluZy5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oc3RyeGZybSwgInpjKmNDKnoiLCAgICAiZiIsICAgICAic3RyaW5nLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihtZW1jaHIsICJ2KnZDKml6IiwgICAgICJmIiwgICAgICJzdHJpbmcuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHN0cmNociwgImMqY0MqaSIsICAgICAgImYiLCAgICAgInN0cmluZy5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oc3RyY3NwbiwgInpjQypjQyoiLCAgICAiZiIsICAgICAic3RyaW5nLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihzdHJwYnJrLCAiYypjQypjQyoiLCAgICJmIiwgICAgICJzdHJpbmcuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHN0cnJjaHIsICJjKmNDKmkiLCAgICAgImYiLCAgICAgInN0cmluZy5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oc3Ryc3BuLCAiemNDKmNDKiIsICAgICAiZiIsICAgICAic3RyaW5nLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihzdHJzdHIsICJjKmNDKmNDKiIsICAgICJmIiwgICAgICJzdHJpbmcuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHN0cnRvaywgImMqYypjQyoiLCAgICAgImYiLCAgICAgInN0cmluZy5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4obWVtc2V0LCAidip2Kml6IiwgICAgICAiZiIsICAgICAic3RyaW5nLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihzdHJlcnJvciwgImMqaSIsICAgICAgICJmIiwgICAgICJzdHJpbmcuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHN0cmxlbiwgInpjQyoiLCAgICAgICAgImYiLCAgICAgInN0cmluZy5oIiwgQUxMX0xBTkdVQUdFUykKKy8vIEM5OSBzdGRpby5oCitMSUJCVUlMVElOKHByaW50ZiwgImljQyouIiwgICAgICAgImZwOjA6IiwgInN0ZGlvLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihmcHJpbnRmLCAiaVAqY0MqLiIsICAgICJmcDoxOiIsICJzdGRpby5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oc25wcmludGYsICJpYyp6Y0MqLiIsICAiZnA6MjoiLCAic3RkaW8uaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHNwcmludGYsICJpYypjQyouIiwgICAgImZwOjE6IiwgInN0ZGlvLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTih2cHJpbnRmLCAiaWNDKmEiLCAgICAgICJmUDowOiIsICJzdGRpby5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4odmZwcmludGYsICJpUCpjQyphIiwgICAiZlA6MToiLCAic3RkaW8uaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHZzbnByaW50ZiwgImljKnpjQyphIiwgImZQOjI6IiwgInN0ZGlvLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTih2c3ByaW50ZiwgImljKmNDKmEiLCAgICJmUDoxOiIsICJzdGRpby5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oc2NhbmYsICJpY0MqUi4iLCAgICAgICAiZnM6MDoiLCAic3RkaW8uaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGZzY2FuZiwgImlQKlJjQypSLiIsICAgImZzOjE6IiwgInN0ZGlvLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihzc2NhbmYsICJpY0MqUmNDKlIuIiwgICJmczoxOiIsICJzdGRpby5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4odnNjYW5mLCAiaWNDKlJhIiwgICAgICAiZlM6MDoiLCAic3RkaW8uaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHZmc2NhbmYsICJpUCpSY0MqUmEiLCAgImZTOjE6IiwgInN0ZGlvLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTih2c3NjYW5mLCAiaWNDKlJjQypSYSIsICJmUzoxOiIsICJzdGRpby5oIiwgQUxMX0xBTkdVQUdFUykKKy8vIEM5OSBjdHlwZS5oCitMSUJCVUlMVElOKGlzYWxudW0sICJpaSIsICJmblUiLCAiY3R5cGUuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGlzYWxwaGEsICJpaSIsICJmblUiLCAiY3R5cGUuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGlzYmxhbmssICJpaSIsICJmblUiLCAiY3R5cGUuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGlzY250cmwsICJpaSIsICJmblUiLCAiY3R5cGUuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGlzZGlnaXQsICJpaSIsICJmblUiLCAiY3R5cGUuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGlzZ3JhcGgsICJpaSIsICJmblUiLCAiY3R5cGUuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGlzbG93ZXIsICJpaSIsICJmblUiLCAiY3R5cGUuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGlzcHJpbnQsICJpaSIsICJmblUiLCAiY3R5cGUuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGlzcHVuY3QsICJpaSIsICJmblUiLCAiY3R5cGUuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGlzc3BhY2UsICJpaSIsICJmblUiLCAiY3R5cGUuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGlzdXBwZXIsICJpaSIsICJmblUiLCAiY3R5cGUuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGlzeGRpZ2l0LCAiaWkiLCAiZm5VIiwgImN0eXBlLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTih0b2xvd2VyLCAiaWkiLCAiZm5VIiwgImN0eXBlLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTih0b3VwcGVyLCAiaWkiLCAiZm5VIiwgImN0eXBlLmgiLCBBTExfTEFOR1VBR0VTKQorLy8gQzk5IHdjaGFyLmgKKy8vIEZJWE1FOiBUaGlzIGxpc3QgaXMgaW5jb21wbGV0ZS4gV2Ugc2hvdWxkIGNvdmVyIGF0IGxlYXN0IHRoZSBmdW5jdGlvbnMgdGhhdAorLy8gdGFrZSBmb3JtYXQgc3RyaW5ncy4KK0xJQkJVSUxUSU4od2NzY2hyLCAgIncqd0MqdyIsICAgImYiLCAid2NoYXIuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHdjc2NtcCwgICJpd0Mqd0MqIiwgICJmIiwgIndjaGFyLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTih3Y3NsZW4sICAiendDKiIsICAgICAiZiIsICJ3Y2hhci5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4od2NzbmNtcCwgIml3Qyp3Qyp6IiwgImYiLCAid2NoYXIuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHdtZW1jaHIsICJ3KndDKnd6IiwgICJmIiwgIndjaGFyLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTih3bWVtY21wLCAiaXdDKndDKnoiLCAiZiIsICJ3Y2hhci5oIiwgQUxMX0xBTkdVQUdFUykKKworLy8gQzk5CisvLyBJbiBzb21lIHN5c3RlbXMgc2V0am1wIGlzIGEgbWFjcm8gdGhhdCBleHBhbmRzIHRvIF9zZXRqbXAuIFdlIHVuZGVmaW5lCisvLyBpdCBoZXJlIHRvIGF2b2lkIGhhdmluZyB0d28gaWRlbnRpY2FsIExJQkJVSUxUSU4gZW50cmllcy4KKyN1bmRlZiBzZXRqbXAKK0xJQkJVSUxUSU4oc2V0am1wLCAiaUoiLCAgICAgICAgICAiZmoiLCAgICAic2V0am1wLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihsb25nam1wLCAidkppIiwgICAgICAgICJmciIsICAgICJzZXRqbXAuaCIsIEFMTF9MQU5HVUFHRVMpCisKKy8vIE5vbi1DIGxpYnJhcnkgZnVuY3Rpb25zLCBhY3RpdmUgaW4gR05VIG1vZGUgb25seS4KKy8vIEZ1bmN0aW9ucyB3aXRoIChyZXR1cm5zX3R3aWNlKSBhdHRyaWJ1dGUgKG1hcmtlZCBhcyAiaiIpIGFyZSBzdGlsbCBhY3RpdmUgaW4KKy8vIGFsbCBsYW5ndWFnZXMsIGJlY2F1c2UgbG9zaW5nIHRoaXMgYXR0cmlidXRlIHdvdWxkIHJlc3VsdCBpbiBtaXNjb21waWxhdGlvbgorLy8gd2hlbiB0aGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgaW4gbm9uLUdOVSBtb2RlLiBQUjE2MTM4LgorTElCQlVJTFRJTihhbGxvY2EsICJ2KnoiLCAgICAgICAgICJmIiwgICAgICJzdGRsaWIuaCIsIEFMTF9HTlVfTEFOR1VBR0VTKQorLy8gUE9TSVggc3RyaW5nLmgKK0xJQkJVSUxUSU4oc3RwY3B5LCAiYypjKmNDKiIsICAgICAiZiIsICAgICAic3RyaW5nLmgiLCBBTExfR05VX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oc3RwbmNweSwgImMqYypjQyp6IiwgICAiZiIsICAgICAic3RyaW5nLmgiLCBBTExfR05VX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oc3RyZHVwLCAiYypjQyoiLCAgICAgICAiZiIsICAgICAic3RyaW5nLmgiLCBBTExfR05VX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oc3RybmR1cCwgImMqY0MqeiIsICAgICAiZiIsICAgICAic3RyaW5nLmgiLCBBTExfR05VX0xBTkdVQUdFUykKKy8vIFBPU0lYIHN0cmluZ3MuaAorTElCQlVJTFRJTihpbmRleCwgImMqY0MqaSIsICAgICAgICJmIiwgICAgICJzdHJpbmdzLmgiLCBBTExfR05VX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4ocmluZGV4LCAiYypjQyppIiwgICAgICAiZiIsICAgICAic3RyaW5ncy5oIiwgQUxMX0dOVV9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGJ6ZXJvLCAidnYqeiIsICAgICAgICAgImYiLCAgICAgInN0cmluZ3MuaCIsIEFMTF9HTlVfTEFOR1VBR0VTKQorLy8gSW4gc29tZSBzeXN0ZW1zIHN0cltuXWNhc2VqbXAgaXMgYSBtYWNybyB0aGF0IGV4cGFuZHMgdG8gX3N0cltuXWljbXAuCisvLyBXZSB1bmRlZmluZSB0aGVuIGhlcmUgdG8gYXZvaWQgd3JvbmcgbmFtZS4KKyN1bmRlZiBzdHJjYXNlY21wCisjdW5kZWYgc3RybmNhc2VjbXAKK0xJQkJVSUxUSU4oc3RyY2FzZWNtcCwgImljQypjQyoiLCAiZiIsICAgICAic3RyaW5ncy5oIiwgQUxMX0dOVV9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHN0cm5jYXNlY21wLCAiaWNDKmNDKnoiLCAiZiIsICAgInN0cmluZ3MuaCIsIEFMTF9HTlVfTEFOR1VBR0VTKQorLy8gUE9TSVggdW5pc3RkLmgKK0xJQkJVSUxUSU4oX2V4aXQsICJ2aSIsICAgICAgICAgICAiZnIiLCAgICAidW5pc3RkLmgiLCBBTExfR05VX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4odmZvcmssICJwIiwgICAgICAgICAgICAiZmoiLCAgICAidW5pc3RkLmgiLCBBTExfTEFOR1VBR0VTKQorLy8gUE9TSVggc2V0am1wLmgKKworTElCQlVJTFRJTihfc2V0am1wLCAiaUoiLCAgICAgICAgICJmaiIsICAgInNldGptcC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oX19zaWdzZXRqbXAsICJpU0ppIiwgICAiZmoiLCAgICJzZXRqbXAuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHNpZ3NldGptcCwgImlTSmkiLCAgICAgImZqIiwgICAic2V0am1wLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihzZXRqbXBfc3lzY2FsbCwgImlKIiwgICJmaiIsICAgInNldGptcC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oc2F2ZWN0eCwgImlKIiwgICAgICAgICAiZmoiLCAgICJzZXRqbXAuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHFzZXRqbXAsICJpSiIsICAgICAgICAgImZqIiwgICAic2V0am1wLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihnZXRjb250ZXh0LCAiaUsqIiwgICAgICJmaiIsICAgInNldGptcC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihfbG9uZ2ptcCwgInZKaSIsICAgICAgICJmciIsICAgICJzZXRqbXAuaCIsIEFMTF9HTlVfTEFOR1VBR0VTKQorTElCQlVJTFRJTihzaWdsb25nam1wLCAidlNKaSIsICAgICJmciIsICAgICJzZXRqbXAuaCIsIEFMTF9HTlVfTEFOR1VBR0VTKQorLy8gbm9uLXN0YW5kYXJkIGJ1dCB2ZXJ5IGNvbW1vbgorTElCQlVJTFRJTihzdHJsY3B5LCAiemMqY0MqeiIsICAgICJmIiwgICAgICJzdHJpbmcuaCIsIEFMTF9HTlVfTEFOR1VBR0VTKQorTElCQlVJTFRJTihzdHJsY2F0LCAiemMqY0MqeiIsICAgICJmIiwgICAgICJzdHJpbmcuaCIsIEFMTF9HTlVfTEFOR1VBR0VTKQorLy8gICBpZCBvYmpjX21zZ1NlbmQoaWQsIFNFTCwgLi4uKQorTElCQlVJTFRJTihvYmpjX21zZ1NlbmQsICJHR0guIiwgICAiZiIsICAgICAib2JqYy9tZXNzYWdlLmgiLCBPQkpDX0xBTkcpCisvLyBsb25nIGRvdWJsZSBvYmpjX21zZ1NlbmRfZnByZXQoaWQgc2VsZiwgU0VMIG9wLCAuLi4pIAorTElCQlVJTFRJTihvYmpjX21zZ1NlbmRfZnByZXQsICJMZEdILiIsICJmIiwgIm9iamMvbWVzc2FnZS5oIiwgT0JKQ19MQU5HKQorLy8gX0NvbXBsZXggbG9uZyBkb3VibGUgb2JqY19tc2dTZW5kX2ZwMnJldChpZCBzZWxmLCBTRUwgb3AsIC4uLikKK0xJQkJVSUxUSU4ob2JqY19tc2dTZW5kX2ZwMnJldCwgIlhMZEdILiIsICJmIiwgIm9iamMvbWVzc2FnZS5oIiwgT0JKQ19MQU5HKQorLy8gdm9pZCBvYmpjX21zZ1NlbmRfc3RyZXQgKGlkLCBTRUwsIC4uLikKK0xJQkJVSUxUSU4ob2JqY19tc2dTZW5kX3N0cmV0LCAidkdILiIsICJmIiwgIm9iamMvbWVzc2FnZS5oIiwgT0JKQ19MQU5HKQorLy8gaWQgb2JqY19tc2dTZW5kU3VwZXIoc3RydWN0IG9iamNfc3VwZXIgKnN1cGVyLCBTRUwgb3AsIC4uLikKK0xJQkJVSUxUSU4ob2JqY19tc2dTZW5kU3VwZXIsICJHTSpILiIsICJmIiwgIm9iamMvbWVzc2FnZS5oIiwgT0JKQ19MQU5HKQorLy8gdm9pZCBvYmpjX21zZ1NlbmRTdXBlcl9zdHJldChzdHJ1Y3Qgb2JqY19zdXBlciAqc3VwZXIsIFNFTCBvcCwgLi4uKQorTElCQlVJTFRJTihvYmpjX21zZ1NlbmRTdXBlcl9zdHJldCwgInZNKkguIiwgImYiLCAib2JqYy9tZXNzYWdlLmgiLCBPQkpDX0xBTkcpCisvLyAgIGlkIG9iamNfZ2V0Q2xhc3MoY29uc3QgY2hhciAqbmFtZSkKK0xJQkJVSUxUSU4ob2JqY19nZXRDbGFzcywgIkdjQyoiLCAgICJmIiwgICAgICJvYmpjL3J1bnRpbWUuaCIsIE9CSkNfTEFORykKKy8vICAgaWQgb2JqY19nZXRNZXRhQ2xhc3MoY29uc3QgY2hhciAqbmFtZSkKK0xJQkJVSUxUSU4ob2JqY19nZXRNZXRhQ2xhc3MsICJHY0MqIiwgICAiZiIsICJvYmpjL3J1bnRpbWUuaCIsIE9CSkNfTEFORykKKy8vIHZvaWQgb2JqY19lbnVtZXJhdGlvbk11dGF0aW9uKGlkKQorTElCQlVJTFRJTihvYmpjX2VudW1lcmF0aW9uTXV0YXRpb24sICJ2RyIsICJmIiwgIm9iamMvcnVudGltZS5oIiwgT0JKQ19MQU5HKQorCisvLyBpZCBvYmpjX3JlYWRfd2VhayhpZCAqbG9jYXRpb24pCitMSUJCVUlMVElOKG9iamNfcmVhZF93ZWFrLCAiR0cqIiwgImYiLCAib2JqYy9vYmpjLWF1dG8uaCIsIE9CSkNfTEFORykKKy8vIGlkIG9iamNfYXNzaWduX3dlYWsoaWQgdmFsdWUsIGlkICpsb2NhdGlvbikKK0xJQkJVSUxUSU4ob2JqY19hc3NpZ25fd2VhaywgIkdHRyoiLCAiZiIsICJvYmpjL29iamMtYXV0by5oIiwgT0JKQ19MQU5HKQorLy8gaWQgb2JqY19hc3NpZ25faXZhcihpZCB2YWx1ZSwgaWQgZGVzdCwgcHRyZGlmZl90IG9mZnNldCkKK0xJQkJVSUxUSU4ob2JqY19hc3NpZ25faXZhciwgIkdHR1kiLCAiZiIsICJvYmpjL29iamMtYXV0by5oIiwgT0JKQ19MQU5HKQorLy8gaWQgb2JqY19hc3NpZ25fZ2xvYmFsKGlkIHZhbCwgaWQgKmRlc3QpCitMSUJCVUlMVElOKG9iamNfYXNzaWduX2dsb2JhbCwgIkdHRyoiLCAiZiIsICJvYmpjL29iamMtYXV0by5oIiwgT0JKQ19MQU5HKQorLy8gaWQgb2JqY19hc3NpZ25fc3Ryb25nQ2FzdChpZCB2YWwsIGlkICpkZXN0CitMSUJCVUlMVElOKG9iamNfYXNzaWduX3N0cm9uZ0Nhc3QsICJHR0cqIiwgImYiLCAib2JqYy9vYmpjLWF1dG8uaCIsIE9CSkNfTEFORykKKworLy8gaWQgb2JqY19leGNlcHRpb25fZXh0cmFjdCh2b2lkICpsb2NhbEV4Y2VwdGlvbkRhdGEpCitMSUJCVUlMVElOKG9iamNfZXhjZXB0aW9uX2V4dHJhY3QsICJHdioiLCAiZiIsICJvYmpjL29iamMtZXhjZXB0aW9uLmgiLCBPQkpDX0xBTkcpCisvLyB2b2lkIG9iamNfZXhjZXB0aW9uX3RyeV9lbnRlcih2b2lkICpsb2NhbEV4Y2VwdGlvbkRhdGEpCitMSUJCVUlMVElOKG9iamNfZXhjZXB0aW9uX3RyeV9lbnRlciwgInZ2KiIsICJmIiwgIm9iamMvb2JqYy1leGNlcHRpb24uaCIsIE9CSkNfTEFORykKKy8vIHZvaWQgb2JqY19leGNlcHRpb25fdHJ5X2V4aXQodm9pZCAqbG9jYWxFeGNlcHRpb25EYXRhKQorTElCQlVJTFRJTihvYmpjX2V4Y2VwdGlvbl90cnlfZXhpdCwgInZ2KiIsICJmIiwgIm9iamMvb2JqYy1leGNlcHRpb24uaCIsIE9CSkNfTEFORykKKy8vIGludCBvYmpjX2V4Y2VwdGlvbl9tYXRjaChDbGFzcyBleGNlcHRpb25DbGFzcywgaWQgZXhjZXB0aW9uKQorTElCQlVJTFRJTihvYmpjX2V4Y2VwdGlvbl9tYXRjaCwgImlHRyIsICJmIiwgIm9iamMvb2JqYy1leGNlcHRpb24uaCIsIE9CSkNfTEFORykKKy8vIHZvaWQgb2JqY19leGNlcHRpb25fdGhyb3coaWQgZXhjZXB0aW9uKQorTElCQlVJTFRJTihvYmpjX2V4Y2VwdGlvbl90aHJvdywgInZHIiwgImYiLCAib2JqYy9vYmpjLWV4Y2VwdGlvbi5oIiwgT0JKQ19MQU5HKQorCisvLyBpbnQgb2JqY19zeW5jX2VudGVyKGlkIG9iaikKK0xJQkJVSUxUSU4ob2JqY19zeW5jX2VudGVyLCAiaUciLCAiZiIsICJvYmpjL29iamMtc3luYy5oIiwgT0JKQ19MQU5HKQorLy8gaW50IG9iamNfc3luY19leGl0KGlkIG9iaikKK0xJQkJVSUxUSU4ob2JqY19zeW5jX2V4aXQsICJpRyIsICJmIiwgIm9iamMvb2JqYy1zeW5jLmgiLCBPQkpDX0xBTkcpCisKK0JVSUxUSU4oX19idWlsdGluX29iamNfbWVtbW92ZV9jb2xsZWN0YWJsZSwgInYqdip2Qyp6IiwgIm5GIikKKworLy8gdm9pZCBOU0xvZyhOU1N0cmluZyAqZm10LCAuLi4pCitMSUJCVUlMVElOKE5TTG9nLCAidkcuIiwgImZwOjA6IiwgIkZvdW5kYXRpb24vTlNPYmpDUnVudGltZS5oIiwgT0JKQ19MQU5HKQorLy8gdm9pZCBOU0xvZ3YoTlNTdHJpbmcgKmZtdCwgdmFfbGlzdCBhcmdzKQorTElCQlVJTFRJTihOU0xvZ3YsICJ2R2EiLCAiZlA6MDoiLCAiRm91bmRhdGlvbi9OU09iakNSdW50aW1lLmgiLCBPQkpDX0xBTkcpCisKKy8vIEJ1aWx0aW4gbWF0aCBsaWJyYXJ5IGZ1bmN0aW9ucworTElCQlVJTFRJTihhdGFuMiwgImRkZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oYXRhbjJmLCAiZmZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihhdGFuMmwsICJMZExkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oYWJzLCAiaWkiLCAiZm5jIiwgInN0ZGxpYi5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4obGFicywgIkxpTGkiLCAiZm5jIiwgInN0ZGxpYi5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4obGxhYnMsICJMTGlMTGkiLCAiZm5jIiwgInN0ZGxpYi5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihjb3B5c2lnbiwgImRkZCIsICJmbmMiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oY29weXNpZ25mLCAiZmZmIiwgImZuYyIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjb3B5c2lnbmwsICJMZExkTGQiLCAiZm5jIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oZmFicywgImRkIiwgImZuYyIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihmYWJzZiwgImZmIiwgImZuYyIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihmYWJzbCwgIkxkTGQiLCAiZm5jIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKKy8vIFNvbWUgc3lzdGVtcyBkZWZpbmUgZmluaXRlZiBhcyBhbGlhcyBvZiBfZmluaXRlZi4KKyNpZiBkZWZpbmVkIChmaW5pdGVmKQorI3VuZGVmIGZpbml0ZWYKKyNlbmRpZgorTElCQlVJTFRJTihmaW5pdGUsICJpZCIsICJmbmMiLCAibWF0aC5oIiwgR05VX0xBTkcpCitMSUJCVUlMVElOKGZpbml0ZWYsICJpZiIsICJmbmMiLCAibWF0aC5oIiwgR05VX0xBTkcpCitMSUJCVUlMVElOKGZpbml0ZWwsICJpTGQiLCAiZm5jIiwgIm1hdGguaCIsIEdOVV9MQU5HKQorLy8gZ2xpYmMncyBtYXRoLmggZ2VuZXJhdGVzIGNhbGxzIHRvIF9fZmluaXRlCitMSUJCVUlMVElOKF9fZmluaXRlLCAiaWQiLCAiZm5jIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKF9fZmluaXRlZiwgImlmIiwgImZuYyIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihfX2Zpbml0ZWwsICJpTGQiLCAiZm5jIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oZm1vZCwgImRkZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oZm1vZGYsICJmZmYiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGZtb2RsLCAiTGRMZExkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorCitMSUJCVUlMVElOKGZyZXhwLCAiZGRpKiIsICJmbiIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihmcmV4cGYsICJmZmkqIiwgImZuIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGZyZXhwbCwgIkxkTGRpKiIsICJmbiIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorCitMSUJCVUlMVElOKGxkZXhwLCAiZGRpIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihsZGV4cGYsICJmZmkiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGxkZXhwbCwgIkxkTGRpIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorCitMSUJCVUlMVElOKG1vZGYsICJkZGQqIiwgImZuIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKG1vZGZmLCAiZmZmKiIsICJmbiIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihtb2RmbCwgIkxkTGRMZCoiLCAiZm4iLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihuYW4sICAiZGNDKiIsICJmVW4iLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4obmFuZiwgImZjQyoiLCAiZlVuIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKG5hbmwsICJMZGNDKiIsICJmVW4iLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihwb3csICJkZGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHBvd2YsICJmZmYiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHBvd2wsICJMZExkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oYWNvcywgImRkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihhY29zZiwgImZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihhY29zbCwgIkxkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oYWNvc2gsICJkZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oYWNvc2hmLCAiZmYiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGFjb3NobCwgIkxkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oYXNpbiwgImRkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihhc2luZiwgImZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihhc2lubCwgIkxkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oYXNpbmgsICJkZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oYXNpbmhmLCAiZmYiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGFzaW5obCwgIkxkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oYXRhbiwgImRkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihhdGFuZiwgImZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihhdGFubCwgIkxkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oYXRhbmgsICJkZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oYXRhbmhmLCAiZmYiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGF0YW5obCwgIkxkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oY2JydCwgImRkIiwgImZuYyIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjYnJ0ZiwgImZmIiwgImZuYyIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjYnJ0bCwgIkxkTGQiLCAiZm5jIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oY2VpbCwgImRkIiwgImZuYyIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjZWlsZiwgImZmIiwgImZuYyIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjZWlsbCwgIkxkTGQiLCAiZm5jIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oY29zLCAiZGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGNvc2YsICJmZiIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oY29zbCwgIkxkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oY29zaCwgImRkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjb3NoZiwgImZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjb3NobCwgIkxkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oZXJmLCAiZGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGVyZmYsICJmZiIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oZXJmbCwgIkxkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oZXJmYywgImRkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihlcmZjZiwgImZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihlcmZjbCwgIkxkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oZXhwLCAiZGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGV4cGYsICJmZiIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oZXhwbCwgIkxkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oZXhwMiwgImRkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihleHAyZiwgImZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihleHAybCwgIkxkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oZXhwbTEsICJkZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oZXhwbTFmLCAiZmYiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGV4cG0xbCwgIkxkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oZmRpbSwgImRkZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oZmRpbWYsICJmZmYiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGZkaW1sLCAiTGRMZExkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorCitMSUJCVUlMVElOKGZsb29yLCAiZGQiLCAiZm5jIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGZsb29yZiwgImZmIiwgImZuYyIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihmbG9vcmwsICJMZExkIiwgImZuYyIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorCitMSUJCVUlMVElOKGZtYSwgImRkZGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGZtYWYsICJmZmZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihmbWFsLCAiTGRMZExkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oZm1heCwgImRkZCIsICJmbmMiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oZm1heGYsICJmZmYiLCAiZm5jIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGZtYXhsLCAiTGRMZExkIiwgImZuYyIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorCitMSUJCVUlMVElOKGZtaW4sICJkZGQiLCAiZm5jIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGZtaW5mLCAiZmZmIiwgImZuYyIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihmbWlubCwgIkxkTGRMZCIsICJmbmMiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihoeXBvdCwgImRkZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oaHlwb3RmLCAiZmZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihoeXBvdGwsICJMZExkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oaWxvZ2IsICJpZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oaWxvZ2JmLCAiaWYiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGlsb2dibCwgImlMZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworLy8gUE9TSVggbWF0aC5oIGRlY2xhcmVzIGEgZ2xvYmFsLCBzaWduZ2FtLCB0aGF0IGxnYW1tYSB3cml0ZXMgdG8sIHNvIHRoZXNlCisvLyBzaG91bGRuJ3QgaGF2ZSAiZSIgb3IgImMiIGF0dHJpYnV0ZXMKK0xJQkJVSUxUSU4obGdhbW1hLCAiZGQiLCAiZm4iLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4obGdhbW1hZiwgImZmIiwgImZuIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGxnYW1tYWwsICJMZExkIiwgImZuIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4obGxyaW50LCAiTExpZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4obGxyaW50ZiwgIkxMaWYiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGxscmludGwsICJMTGlMZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihsbHJvdW5kLCAiTExpZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4obGxyb3VuZGYsICJMTGlmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihsbHJvdW5kbCwgIkxMaUxkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorCitMSUJCVUlMVElOKGxvZywgImRkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihsb2dmLCAiZmYiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGxvZ2wsICJMZExkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorCitMSUJCVUlMVElOKGxvZzEwLCAiZGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGxvZzEwZiwgImZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihsb2cxMGwsICJMZExkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorCitMSUJCVUlMVElOKGxvZzFwLCAiZGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGxvZzFwZiwgImZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihsb2cxcGwsICJMZExkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorCitMSUJCVUlMVElOKGxvZzIsICJkZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4obG9nMmYsICJmZiIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4obG9nMmwsICJMZExkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorCitMSUJCVUlMVElOKGxvZ2IsICJkZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4obG9nYmYsICJmZiIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4obG9nYmwsICJMZExkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorCitMSUJCVUlMVElOKGxyaW50LCAiTGlkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihscmludGYsICJMaWYiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGxyaW50bCwgIkxpTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4obHJvdW5kLCAiTGlkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihscm91bmRmLCAiTGlmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihscm91bmRsLCAiTGlMZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihuZWFyYnlpbnQsICJkZCIsICJmbmMiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4obmVhcmJ5aW50ZiwgImZmIiwgImZuYyIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihuZWFyYnlpbnRsLCAiTGRMZCIsICJmbmMiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihuZXh0YWZ0ZXIsICJkZGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKG5leHRhZnRlcmYsICJmZmYiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKG5leHRhZnRlcmwsICJMZExkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4obmV4dHRvd2FyZCwgImRkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKG5leHR0b3dhcmRmLCAiZmZMZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4obmV4dHRvd2FyZGwsICJMZExkTGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4ocmVtYWluZGVyLCAiZGRkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihyZW1haW5kZXJmLCAiZmZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihyZW1haW5kZXJsLCAiTGRMZExkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorCitMSUJCVUlMVElOKHJlbXF1bywgImRkZGkqIiwgImZuIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHJlbXF1b2YsICJmZmZpKiIsICJmbiIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihyZW1xdW9sLCAiTGRMZExkaSoiLCAiZm4iLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihyaW50LCAiZGQiLCAiZm5jIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHJpbnRmLCAiZmYiLCAiZm5jIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHJpbnRsLCAiTGRMZCIsICJmbmMiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihyb3VuZCwgImRkIiwgImZuYyIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihyb3VuZGYsICJmZiIsICJmbmMiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4ocm91bmRsLCAiTGRMZCIsICJmbmMiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihzY2FsYmxuLCAiZGRMaSIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oc2NhbGJsbmYsICJmZkxpIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihzY2FsYmxubCwgIkxkTGRMaSIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihzY2FsYm4sICJkZGkiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHNjYWxibmYsICJmZmkiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHNjYWxibmwsICJMZExkaSIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihzaW4sICJkZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oc2luZiwgImZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihzaW5sLCAiTGRMZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihzaW5oLCAiZGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHNpbmhmLCAiZmYiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHNpbmhsLCAiTGRMZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihzcXJ0LCAiZGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHNxcnRmLCAiZmYiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHNxcnRsLCAiTGRMZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTih0YW4sICJkZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4odGFuZiwgImZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTih0YW5sLCAiTGRMZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTih0YW5oLCAiZGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHRhbmhmLCAiZmYiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKHRhbmhsLCAiTGRMZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTih0Z2FtbWEsICJkZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4odGdhbW1hZiwgImZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTih0Z2FtbWFsLCAiTGRMZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTih0cnVuYywgImRkIiwgImZuYyIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTih0cnVuY2YsICJmZiIsICJmbmMiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4odHJ1bmNsLCAiTGRMZCIsICJmbmMiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihjYWJzLCAiZFhkIiwgImZuZSIsICJjb21wbGV4LmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjYWJzZiwgImZYZiIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oY2Fic2wsICJMZFhMZCIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihjYWNvcywgIlhkWGQiLCAiZm5lIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGNhY29zZiwgIlhmWGYiLCAiZm5lIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGNhY29zbCwgIlhMZFhMZCIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihjYWNvc2gsICJYZFhkIiwgImZuZSIsICJjb21wbGV4LmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjYWNvc2hmLCAiWGZYZiIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oY2Fjb3NobCwgIlhMZFhMZCIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihjYXJnLCAiZFhkIiwgImZuZSIsICJjb21wbGV4LmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjYXJnZiwgImZYZiIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oY2FyZ2wsICJMZFhMZCIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihjYXNpbiwgIlhkWGQiLCAiZm5lIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGNhc2luZiwgIlhmWGYiLCAiZm5lIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGNhc2lubCwgIlhMZFhMZCIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihjYXNpbmgsICJYZFhkIiwgImZuZSIsICJjb21wbGV4LmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjYXNpbmhmLCAiWGZYZiIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oY2FzaW5obCwgIlhMZFhMZCIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihjYXRhbiwgIlhkWGQiLCAiZm5lIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGNhdGFuZiwgIlhmWGYiLCAiZm5lIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGNhdGFubCwgIlhMZFhMZCIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihjYXRhbmgsICJYZFhkIiwgImZuZSIsICJjb21wbGV4LmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjYXRhbmhmLCAiWGZYZiIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oY2F0YW5obCwgIlhMZFhMZCIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihjY29zLCAiWGRYZCIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oY2Nvc2YsICJYZlhmIiwgImZuZSIsICJjb21wbGV4LmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjY29zbCwgIlhMZFhMZCIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihjY29zaCwgIlhkWGQiLCAiZm5lIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGNjb3NoZiwgIlhmWGYiLCAiZm5lIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGNjb3NobCwgIlhMZFhMZCIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihjZXhwLCAiWGRYZCIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oY2V4cGYsICJYZlhmIiwgImZuZSIsICJjb21wbGV4LmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjZXhwbCwgIlhMZFhMZCIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihjaW1hZywgImRYZCIsICJmbmMiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oY2ltYWdmLCAiZlhmIiwgImZuYyIsICJjb21wbGV4LmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjaW1hZ2wsICJMZFhMZCIsICJmbmMiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihjb25qLCAiWGRYZCIsICJmbmMiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oY29uamYsICJYZlhmIiwgImZuYyIsICJjb21wbGV4LmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjb25qbCwgIlhMZFhMZCIsICJmbmMiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihjbG9nLCAiWGRYZCIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oY2xvZ2YsICJYZlhmIiwgImZuZSIsICJjb21wbGV4LmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjbG9nbCwgIlhMZFhMZCIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihjcHJvaiwgIlhkWGQiLCAiZm5jIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGNwcm9qZiwgIlhmWGYiLCAiZm5jIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGNwcm9qbCwgIlhMZFhMZCIsICJmbmMiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihjcG93LCAiWGRYZFhkIiwgImZuZSIsICJjb21wbGV4LmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjcG93ZiwgIlhmWGZYZiIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oY3Bvd2wsICJYTGRYTGRYTGQiLCAiZm5lIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oY3JlYWwsICJkWGQiLCAiZm5jIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGNyZWFsZiwgImZYZiIsICJmbmMiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oY3JlYWxsLCAiTGRYTGQiLCAiZm5jIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oY3NpbiwgIlhkWGQiLCAiZm5lIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGNzaW5mLCAiWGZYZiIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oY3NpbmwsICJYTGRYTGQiLCAiZm5lIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oY3NpbmgsICJYZFhkIiwgImZuZSIsICJjb21wbGV4LmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjc2luaGYsICJYZlhmIiwgImZuZSIsICJjb21wbGV4LmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjc2luaGwsICJYTGRYTGQiLCAiZm5lIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oY3NxcnQsICJYZFhkIiwgImZuZSIsICJjb21wbGV4LmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjc3FydGYsICJYZlhmIiwgImZuZSIsICJjb21wbGV4LmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjc3FydGwsICJYTGRYTGQiLCAiZm5lIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oY3RhbiwgIlhkWGQiLCAiZm5lIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKGN0YW5mLCAiWGZYZiIsICJmbmUiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oY3RhbmwsICJYTGRYTGQiLCAiZm5lIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oY3RhbmgsICJYZFhkIiwgImZuZSIsICJjb21wbGV4LmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjdGFuaGYsICJYZlhmIiwgImZuZSIsICJjb21wbGV4LmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihjdGFuaGwsICJYTGRYTGQiLCAiZm5lIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCisKKy8vIF9fc2lucGkgYW5kIGZyaWVuZHMgYXJlIE9TIFggc3BlY2lmaWMgbGlicmFyeSBmdW5jdGlvbnMsIGJ1dCBvdGhlcndpc2UgbXVjaAorLy8gbGlrZSB0aGUgc3RhbmRhcmQgKG5vbi1jb21wbGV4KSBzaW4gKGV0YykuCitMSUJCVUlMVElOKF9fc2lucGksICJkZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oX19zaW5waWYsICJmZiIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihfX2Nvc3BpLCAiZGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKF9fY29zcGlmLCAiZmYiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKK0xJQkJVSUxUSU4oX190YW5waSwgImRkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihfX3RhbnBpZiwgImZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorCisvLyBTaW1pbGFybHksIF9fZXhwMTAgaXMgT1MgWCBvbmx5CitMSUJCVUlMVElOKF9fZXhwMTAsICJkZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oX19leHAxMGYsICJmZiIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworLy8gQmxvY2tzIHJ1bnRpbWUgQnVpbHRpbiBtYXRoIGxpYnJhcnkgZnVuY3Rpb25zCitMSUJCVUlMVElOKF9CbG9ja19vYmplY3RfYXNzaWduLCAidnYqdkMqaUMiLCAiZiIsICJCbG9ja3MuaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKF9CbG9ja19vYmplY3RfZGlzcG9zZSwgInZ2QyppQyIsICJmIiwgIkJsb2Nrcy5oIiwgQUxMX0xBTkdVQUdFUykKKy8vIEZJWE1FOiBBbHNvIGRlY2xhcmUgTlNDb25jcmV0ZUdsb2JhbEJsb2NrIGFuZCBOU0NvbmNyZXRlU3RhY2tCbG9jay4KKworLy8gQW5ub3RhdGlvbiBmdW5jdGlvbgorQlVJTFRJTihfX2J1aWx0aW5fYW5ub3RhdGlvbiwgInYuIiwgInRuIikKKworLy8gSW52YXJpYW50cworQlVJTFRJTihfX2J1aWx0aW5fYXNzdW1lLCAidmIiLCAibiIpCisKKy8vIE11bHRpcHJlY2lzaW9uIEFyaXRobWV0aWMgQnVpbHRpbnMuCitCVUlMVElOKF9fYnVpbHRpbl9hZGRjYiwgIlVjVWNDVWNDVWNDVWMqIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fYWRkY3MsICJVc1VzQ1VzQ1VzQ1VzKiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX2FkZGMsICJVaVVpQ1VpQ1VpQ1VpKiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX2FkZGNsLCAiVUxpVUxpQ1VMaUNVTGlDVUxpKiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX2FkZGNsbCwgIlVMTGlVTExpQ1VMTGlDVUxMaUNVTExpKiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX3N1YmNiLCAiVWNVY0NVY0NVY0NVYyoiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9zdWJjcywgIlVzVXNDVXNDVXNDVXMqIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fc3ViYywgIlVpVWlDVWlDVWlDVWkqIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fc3ViY2wsICJVTGlVTGlDVUxpQ1VMaUNVTGkqIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fc3ViY2xsLCAiVUxMaVVMTGlDVUxMaUNVTExpQ1VMTGkqIiwgIm4iKQorCisvLyBDaGVja2VkIEFyaXRobWV0aWMgQnVpbHRpbnMgZm9yIFNlY3VyaXR5LgorQlVJTFRJTihfX2J1aWx0aW5fYWRkX292ZXJmbG93LCAidi4iLCAibnQiKQorQlVJTFRJTihfX2J1aWx0aW5fc3ViX292ZXJmbG93LCAidi4iLCAibnQiKQorQlVJTFRJTihfX2J1aWx0aW5fbXVsX292ZXJmbG93LCAidi4iLCAibnQiKQorQlVJTFRJTihfX2J1aWx0aW5fdWFkZF9vdmVyZmxvdywgImJVaUNVaUNVaSoiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl91YWRkbF9vdmVyZmxvdywgImJVTGlDVUxpQ1VMaSoiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl91YWRkbGxfb3ZlcmZsb3csICJiVUxMaUNVTExpQ1VMTGkqIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fdXN1Yl9vdmVyZmxvdywgImJVaUNVaUNVaSoiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl91c3VibF9vdmVyZmxvdywgImJVTGlDVUxpQ1VMaSoiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl91c3VibGxfb3ZlcmZsb3csICJiVUxMaUNVTExpQ1VMTGkqIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fdW11bF9vdmVyZmxvdywgImJVaUNVaUNVaSoiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl91bXVsbF9vdmVyZmxvdywgImJVTGlDVUxpQ1VMaSoiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl91bXVsbGxfb3ZlcmZsb3csICJiVUxMaUNVTExpQ1VMTGkqIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fc2FkZF9vdmVyZmxvdywgImJTaUNTaUNTaSoiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9zYWRkbF9vdmVyZmxvdywgImJTTGlDU0xpQ1NMaSoiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9zYWRkbGxfb3ZlcmZsb3csICJiU0xMaUNTTExpQ1NMTGkqIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fc3N1Yl9vdmVyZmxvdywgImJTaUNTaUNTaSoiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9zc3VibF9vdmVyZmxvdywgImJTTGlDU0xpQ1NMaSoiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9zc3VibGxfb3ZlcmZsb3csICJiU0xMaUNTTExpQ1NMTGkqIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fc211bF9vdmVyZmxvdywgImJTaUNTaUNTaSoiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9zbXVsbF9vdmVyZmxvdywgImJTTGlDU0xpQ1NMaSoiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9zbXVsbGxfb3ZlcmZsb3csICJiU0xMaUNTTExpQ1NMTGkqIiwgIm4iKQorCisvLyBDbGFuZyBidWlsdGlucyAobm90IGF2YWlsYWJsZSBpbiBHQ0MpLgorQlVJTFRJTihfX2J1aWx0aW5fYWRkcmVzc29mLCAidip2JiIsICJuY3QiKQorQlVJTFRJTihfX2J1aWx0aW5fb3BlcmF0b3JfbmV3LCAidip6IiwgInRjIikKK0JVSUxUSU4oX19idWlsdGluX29wZXJhdG9yX2RlbGV0ZSwgInZ2KiIsICJ0biIpCitCVUlMVElOKF9fYnVpbHRpbl9jaGFyX21lbWNociwgImMqY0MqaXoiLCAibiIpCisKKy8vIFNhZmVzdGFjayBidWlsdGlucworQlVJTFRJTihfX2J1aWx0aW5fX19nZXRfdW5zYWZlX3N0YWNrX3N0YXJ0LCAidioiLCAiRm4iKQorQlVJTFRJTihfX2J1aWx0aW5fX19nZXRfdW5zYWZlX3N0YWNrX3B0ciwgInYqIiwgIkZuIikKKworLy8gTm9udGVtcG9yYWwgbG9hZHMvc3RvcmVzIGJ1aWx0aW5zCitCVUlMVElOKF9fYnVpbHRpbl9ub250ZW1wb3JhbF9zdG9yZSwgInYuIiwgInQiKQorQlVJTFRJTihfX2J1aWx0aW5fbm9udGVtcG9yYWxfbG9hZCwgInYuIiwgInQiKQorCisvLyBDb3JvdXRpbmUgaW50cmluc2ljcy4KK0JVSUxUSU4oX19idWlsdGluX2Nvcm9fcmVzdW1lLCAidnYqIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9jb3JvX2Rlc3Ryb3ksICJ2dioiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2Nvcm9fZG9uZSwgImJ2KiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX2Nvcm9fcHJvbWlzZSwgInYqdipJaUliIiwgIm4iKQorCitCVUlMVElOKF9fYnVpbHRpbl9jb3JvX3NpemUsICJ6IiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fY29yb19mcmFtZSwgInYqIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fY29yb19mcmVlLCAidip2KiIsICJuIikKKworQlVJTFRJTihfX2J1aWx0aW5fY29yb19pZCwgInYqSWl2KnYqdioiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9jb3JvX2FsbG9jLCAiYiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX2Nvcm9fYmVnaW4sICJ2KnYqIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fY29yb19lbmQsICJidipJYiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX2Nvcm9fc3VzcGVuZCwgImNJYiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX2Nvcm9fcGFyYW0sICJidip2KiIsICJuIikKKy8vIE9wZW5DTCB2Mi4wIHM2LjEzLjE2LCBzOS4xNy4zLjUgLSBQaXBlIGZ1bmN0aW9ucy4KKy8vIFdlIG5lZWQgdGhlIGdlbmVyaWMgcHJvdG90eXBlLCBzaW5jZSB0aGUgcGFja2V0IHR5cGUgY291bGQgYmUgYW55dGhpbmcuCitMQU5HQlVJTFRJTihyZWFkX3BpcGUsICJpLiIsICJ0biIsIE9DTEMyMF9MQU5HKQorTEFOR0JVSUxUSU4od3JpdGVfcGlwZSwgImkuIiwgInRuIiwgT0NMQzIwX0xBTkcpCisKK0xBTkdCVUlMVElOKHJlc2VydmVfcmVhZF9waXBlLCAiaS4iLCAidG4iLCBPQ0xDMjBfTEFORykKK0xBTkdCVUlMVElOKHJlc2VydmVfd3JpdGVfcGlwZSwgImkuIiwgInRuIiwgT0NMQzIwX0xBTkcpCisKK0xBTkdCVUlMVElOKGNvbW1pdF93cml0ZV9waXBlLCAidi4iLCAidG4iLCBPQ0xDMjBfTEFORykKK0xBTkdCVUlMVElOKGNvbW1pdF9yZWFkX3BpcGUsICJ2LiIsICJ0biIsIE9DTEMyMF9MQU5HKQorCitMQU5HQlVJTFRJTihzdWJfZ3JvdXBfcmVzZXJ2ZV9yZWFkX3BpcGUsICJpLiIsICJ0biIsIE9DTEMyMF9MQU5HKQorTEFOR0JVSUxUSU4oc3ViX2dyb3VwX3Jlc2VydmVfd3JpdGVfcGlwZSwgImkuIiwgInRuIiwgT0NMQzIwX0xBTkcpCisKK0xBTkdCVUlMVElOKHN1Yl9ncm91cF9jb21taXRfcmVhZF9waXBlLCAidi4iLCAidG4iLCBPQ0xDMjBfTEFORykKK0xBTkdCVUlMVElOKHN1Yl9ncm91cF9jb21taXRfd3JpdGVfcGlwZSwgInYuIiwgInRuIiwgT0NMQzIwX0xBTkcpCisKK0xBTkdCVUlMVElOKHdvcmtfZ3JvdXBfcmVzZXJ2ZV9yZWFkX3BpcGUsICJpLiIsICJ0biIsIE9DTEMyMF9MQU5HKQorTEFOR0JVSUxUSU4od29ya19ncm91cF9yZXNlcnZlX3dyaXRlX3BpcGUsICJpLiIsICJ0biIsIE9DTEMyMF9MQU5HKQorCitMQU5HQlVJTFRJTih3b3JrX2dyb3VwX2NvbW1pdF9yZWFkX3BpcGUsICJ2LiIsICJ0biIsIE9DTEMyMF9MQU5HKQorTEFOR0JVSUxUSU4od29ya19ncm91cF9jb21taXRfd3JpdGVfcGlwZSwgInYuIiwgInRuIiwgT0NMQzIwX0xBTkcpCisKK0xBTkdCVUlMVElOKGdldF9waXBlX251bV9wYWNrZXRzLCAiVWkuIiwgInRuIiwgT0NMQzIwX0xBTkcpCitMQU5HQlVJTFRJTihnZXRfcGlwZV9tYXhfcGFja2V0cywgIlVpLiIsICJ0biIsIE9DTEMyMF9MQU5HKQorCisvLyBPcGVuQ0wgdjIuMCBzNi4xMy4xNyAtIEVucXVldWUga2VybmVsIGZ1bmN0aW9ucy4KKy8vIEN1c3RvbSBidWlsdGluIGNoZWNrIGFsbG93cyB0byBwZXJmb3JtIHNwZWNpYWwgY2hlY2sgb2YgcGFzc2VkIGJsb2NrIGFyZ3VtZW50cy4KK0xBTkdCVUlMVElOKGVucXVldWVfa2VybmVsLCAiaS4iLCAidG4iLCBPQ0xDMjBfTEFORykKK0xBTkdCVUlMVElOKGdldF9rZXJuZWxfd29ya19ncm91cF9zaXplLCAiVWkuIiwgInRuIiwgT0NMQzIwX0xBTkcpCitMQU5HQlVJTFRJTihnZXRfa2VybmVsX3ByZWZlcnJlZF93b3JrX2dyb3VwX3NpemVfbXVsdGlwbGUsICJVaS4iLCAidG4iLCBPQ0xDMjBfTEFORykKK0xBTkdCVUlMVElOKGdldF9rZXJuZWxfbWF4X3N1Yl9ncm91cF9zaXplX2Zvcl9uZHJhbmdlLCAiVWkuIiwgInRuIiwgT0NMQzIwX0xBTkcpCitMQU5HQlVJTFRJTihnZXRfa2VybmVsX3N1Yl9ncm91cF9jb3VudF9mb3JfbmRyYW5nZSwgIlVpLiIsICJ0biIsIE9DTEMyMF9MQU5HKQorCisvLyBPcGVuQ0wgdjIuMCBzNi4xMy45IC0gQWRkcmVzcyBzcGFjZSBxdWFsaWZpZXIgZnVuY3Rpb25zLgorTEFOR0JVSUxUSU4odG9fZ2xvYmFsLCAidip2KiIsICJ0biIsIE9DTEMyMF9MQU5HKQorTEFOR0JVSUxUSU4odG9fbG9jYWwsICJ2KnYqIiwgInRuIiwgT0NMQzIwX0xBTkcpCitMQU5HQlVJTFRJTih0b19wcml2YXRlLCAidip2KiIsICJ0biIsIE9DTEMyMF9MQU5HKQorCisvLyBPcGVuQ0wgaGFsZiBsb2FkL3N0b3JlIGJ1aWx0aW4KK0xBTkdCVUlMVElOKF9fYnVpbHRpbl9zdG9yZV9oYWxmLCAidmRoKiIsICJuIiwgQUxMX09DTENfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX19idWlsdGluX3N0b3JlX2hhbGZmLCAidmZoKiIsICJuIiwgQUxMX09DTENfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX19idWlsdGluX2xvYWRfaGFsZiwgImRoQyoiLCAibmMiLCBBTExfT0NMQ19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfX2J1aWx0aW5fbG9hZF9oYWxmZiwgImZoQyoiLCAibmMiLCBBTExfT0NMQ19MQU5HVUFHRVMpCisKKy8vIEJ1aWx0aW5zIGZvciBvc19sb2cvb3NfdHJhY2UKK0JVSUxUSU4oX19idWlsdGluX29zX2xvZ19mb3JtYXRfYnVmZmVyX3NpemUsICJ6Y0MqLiIsICJwOjA6bnV0IikKK0JVSUxUSU4oX19idWlsdGluX29zX2xvZ19mb3JtYXQsICJ2KnYqY0MqLiIsICJwOjA6bnQiKQorCisvLyBPcGVuTVAgNC4wCitMQU5HQlVJTFRJTihvbXBfaXNfaW5pdGlhbF9kZXZpY2UsICJpIiwgIm5jIiwgT01QX0xBTkcpCisKKy8vIEJ1aWx0aW5zIGZvciBYUmF5CitCVUlMVElOKF9feHJheV9jdXN0b21ldmVudCwgInZjQyp6IiwgIiIpCisKKy8vIFdpbjY0LWNvbXBhdGlibGUgdmFfbGlzdCBmdW5jdGlvbnMKK0JVSUxUSU4oX19idWlsdGluX21zX3ZhX3N0YXJ0LCAidmMqJi4iLCAibnQiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNfdmFfZW5kLCAidmMqJiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21zX3ZhX2NvcHksICJ2YyomYyomIiwgIm4iKQorCisjdW5kZWYgQlVJTFRJTgorI3VuZGVmIExJQkJVSUxUSU4KKyN1bmRlZiBMQU5HQlVJTFRJTgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzYzcyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zLmgKQEAgLTAsMCArMSwyMzkgQEAKKy8vPT09LS0tIEJ1aWx0aW5zLmggLSBCdWlsdGluIGZ1bmN0aW9uIGhlYWRlciAtLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIGVudW0gdmFsdWVzIGZvciBhbGwgdGhlIHRhcmdldC1pbmRlcGVuZGVudCBidWlsdGluCisvLy8gZnVuY3Rpb25zLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfQlVJTFRJTlNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX0JVSUxUSU5TX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSA8Y3N0cmluZz4KKworLy8gVkMrKyBkZWZpbmVzICdhbGxvY2EnIGFzIGFuIG9iamVjdC1saWtlIG1hY3JvLCB3aGljaCBpbnRlcmZlcmVzIHdpdGggb3VyCisvLyBidWlsdGlucy4KKyN1bmRlZiBhbGxvY2EKKworbmFtZXNwYWNlIGNsYW5nIHsKK2NsYXNzIFRhcmdldEluZm87CitjbGFzcyBJZGVudGlmaWVyVGFibGU7CitjbGFzcyBBU1RDb250ZXh0OworY2xhc3MgUXVhbFR5cGU7CitjbGFzcyBMYW5nT3B0aW9uczsKKworZW51bSBMYW5ndWFnZUlEIHsKKyAgR05VX0xBTkcgPSAweDEsICAgICAvLyBidWlsdGluIHJlcXVpcmVzIEdOVSBtb2RlLgorICBDX0xBTkcgPSAweDIsICAgICAgIC8vIGJ1aWx0aW4gZm9yIGMgb25seS4KKyAgQ1hYX0xBTkcgPSAweDQsICAgICAvLyBidWlsdGluIGZvciBjcGx1c3BsdXMgb25seS4KKyAgT0JKQ19MQU5HID0gMHg4LCAgICAvLyBidWlsdGluIGZvciBvYmplY3RpdmUtYyBhbmQgb2JqZWN0aXZlLWMrKworICBNU19MQU5HID0gMHgxMCwgICAgIC8vIGJ1aWx0aW4gcmVxdWlyZXMgTVMgbW9kZS4KKyAgT0NMQzIwX0xBTkcgPSAweDIwLCAvLyBidWlsdGluIGZvciBPcGVuQ0wgQyAyLjAgb25seS4KKyAgT0NMQzFYX0xBTkcgPSAweDQwLCAvLyBidWlsdGluIGZvciBPcGVuQ0wgQyAxLnggb25seS4KKyAgT01QX0xBTkcgPSAweDgwLCAgICAvLyBidWlsdGluIHJlcXVpcmVzIE9wZW5NUC4KKyAgQUxMX0xBTkdVQUdFUyA9IENfTEFORyB8IENYWF9MQU5HIHwgT0JKQ19MQU5HLCAvLyBidWlsdGluIGZvciBhbGwgbGFuZ3VhZ2VzLgorICBBTExfR05VX0xBTkdVQUdFUyA9IEFMTF9MQU5HVUFHRVMgfCBHTlVfTEFORywgIC8vIGJ1aWx0aW4gcmVxdWlyZXMgR05VIG1vZGUuCisgIEFMTF9NU19MQU5HVUFHRVMgPSBBTExfTEFOR1VBR0VTIHwgTVNfTEFORywgICAgLy8gYnVpbHRpbiByZXF1aXJlcyBNUyBtb2RlLgorICBBTExfT0NMQ19MQU5HVUFHRVMgPSBPQ0xDMVhfTEFORyB8IE9DTEMyMF9MQU5HIC8vIGJ1aWx0aW4gZm9yIE9DTEMgbGFuZ3VhZ2VzLgorfTsKKworbmFtZXNwYWNlIEJ1aWx0aW4geworZW51bSBJRCB7CisgIE5vdEJ1aWx0aW4gID0gMCwgICAgICAvLyBUaGlzIGlzIG5vdCBhIGJ1aWx0aW4gZnVuY3Rpb24uCisjZGVmaW5lIEJVSUxUSU4oSUQsIFRZUEUsIEFUVFJTKSBCSSMjSUQsCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQnVpbHRpbnMuZGVmIgorICBGaXJzdFRTQnVpbHRpbgorfTsKKworc3RydWN0IEluZm8geworICBjb25zdCBjaGFyICpOYW1lLCAqVHlwZSwgKkF0dHJpYnV0ZXMsICpIZWFkZXJOYW1lOworICBMYW5ndWFnZUlEIExhbmdzOworICBjb25zdCBjaGFyICpGZWF0dXJlczsKK307CisKKy8vLyBcYnJpZWYgSG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYm90aCB0YXJnZXQtaW5kZXBlbmRlbnQgYW5kCisvLy8gdGFyZ2V0LXNwZWNpZmljIGJ1aWx0aW5zLCBhbGxvd2luZyBlYXN5IHF1ZXJpZXMgYnkgY2xpZW50cy4KKy8vLworLy8vIEJ1aWx0aW5zIGZyb20gYW4gb3B0aW9uYWwgYXV4aWxpYXJ5IHRhcmdldCBhcmUgc3RvcmVkIGluCisvLy8gQXV4VFNSZWNvcmRzLiBUaGVpciBJRHMgYXJlIHNoaWZ0ZWQgdXAgYnkgVFNSZWNvcmRzLnNpemUoKSBhbmQgbmVlZCB0bworLy8vIGJlIHRyYW5zbGF0ZWQgYmFjayB3aXRoIGdldEF1eEJ1aWx0aW5JRCgpIGJlZm9yZSB1c2UuCitjbGFzcyBDb250ZXh0IHsKKyAgbGx2bTo6QXJyYXlSZWY8SW5mbz4gVFNSZWNvcmRzOworICBsbHZtOjpBcnJheVJlZjxJbmZvPiBBdXhUU1JlY29yZHM7CisKK3B1YmxpYzoKKyAgQ29udGV4dCgpIHt9CisKKyAgLy8vIFxicmllZiBQZXJmb3JtIHRhcmdldC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbgorICAvLy8gXHBhcmFtIEF1eFRhcmdldCBUYXJnZXQgaW5mbyB0byBpbmNvcnBvcmF0ZSBidWlsdGlucyBmcm9tLiBNYXkgYmUgbnVsbHB0ci4KKyAgdm9pZCBJbml0aWFsaXplVGFyZ2V0KGNvbnN0IFRhcmdldEluZm8gJlRhcmdldCwgY29uc3QgVGFyZ2V0SW5mbyAqQXV4VGFyZ2V0KTsKKworICAvLy8gXGJyaWVmIE1hcmsgdGhlIGlkZW50aWZpZXJzIGZvciBhbGwgdGhlIGJ1aWx0aW5zIHdpdGggdGhlaXIKKyAgLy8vIGFwcHJvcHJpYXRlIGJ1aWx0aW4gSUQgIyBhbmQgbWFyayBhbnkgbm9uLXBvcnRhYmxlIGJ1aWx0aW4gaWRlbnRpZmllcnMgYXMKKyAgLy8vIHN1Y2guCisgIHZvaWQgaW5pdGlhbGl6ZUJ1aWx0aW5zKElkZW50aWZpZXJUYWJsZSAmVGFibGUsIGNvbnN0IExhbmdPcHRpb25zJiBMYW5nT3B0cyk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGlkZW50aWZpZXIgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBidWlsdGluLAorICAvLy8gZS5nLiAiX19idWlsdGluX2FicyIuCisgIGNvbnN0IGNoYXIgKmdldE5hbWUodW5zaWduZWQgSUQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UmVjb3JkKElEKS5OYW1lOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHR5cGUgZGVzY3JpcHRvciBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgYnVpbHRpbi4KKyAgY29uc3QgY2hhciAqZ2V0VHlwZVN0cmluZyh1bnNpZ25lZCBJRCkgY29uc3QgeworICAgIHJldHVybiBnZXRSZWNvcmQoSUQpLlR5cGU7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgZnVuY3Rpb24gaXMgYSB0YXJnZXQtc3BlY2lmaWMgYnVpbHRpbi4KKyAgYm9vbCBpc1RTQnVpbHRpbih1bnNpZ25lZCBJRCkgY29uc3QgeworICAgIHJldHVybiBJRCA+PSBCdWlsdGluOjpGaXJzdFRTQnVpbHRpbjsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBmdW5jdGlvbiBoYXMgbm8gc2lkZSBlZmZlY3RzLgorICBib29sIGlzUHVyZSh1bnNpZ25lZCBJRCkgY29uc3QgeworICAgIHJldHVybiBzdHJjaHIoZ2V0UmVjb3JkKElEKS5BdHRyaWJ1dGVzLCAnVScpICE9IG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgZnVuY3Rpb24gaGFzIG5vIHNpZGUgZWZmZWN0cyBhbmQgZG9lc24ndAorICAvLy8gcmVhZCBtZW1vcnkuCisgIGJvb2wgaXNDb25zdCh1bnNpZ25lZCBJRCkgY29uc3QgeworICAgIHJldHVybiBzdHJjaHIoZ2V0UmVjb3JkKElEKS5BdHRyaWJ1dGVzLCAnYycpICE9IG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHdlIGtub3cgdGhpcyBidWlsdGluIG5ldmVyIHRocm93cyBhbiBleGNlcHRpb24uCisgIGJvb2wgaXNOb1Rocm93KHVuc2lnbmVkIElEKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmNocihnZXRSZWNvcmQoSUQpLkF0dHJpYnV0ZXMsICduJykgIT0gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgd2Uga25vdyB0aGlzIGJ1aWx0aW4gbmV2ZXIgcmV0dXJucy4KKyAgYm9vbCBpc05vUmV0dXJuKHVuc2lnbmVkIElEKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmNocihnZXRSZWNvcmQoSUQpLkF0dHJpYnV0ZXMsICdyJykgIT0gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgd2Uga25vdyB0aGlzIGJ1aWx0aW4gY2FuIHJldHVybiB0d2ljZS4KKyAgYm9vbCBpc1JldHVybnNUd2ljZSh1bnNpZ25lZCBJRCkgY29uc3QgeworICAgIHJldHVybiBzdHJjaHIoZ2V0UmVjb3JkKElEKS5BdHRyaWJ1dGVzLCAnaicpICE9IG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGJ1aWx0aW4gZG9lcyBub3QgcGVyZm9ybSB0aGUgc2lkZS1lZmZlY3RzCisgIC8vLyBvZiBpdHMgYXJndW1lbnRzLgorICBib29sIGlzVW5ldmFsdWF0ZWQodW5zaWduZWQgSUQpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyY2hyKGdldFJlY29yZChJRCkuQXR0cmlidXRlcywgJ3UnKSAhPSBudWxscHRyOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgYnVpbHRpbiBmb3IgYSBsaWJjL2xpYm0gZnVuY3Rpb24sCisgIC8vLyB3aXRoIGEgIl9fYnVpbHRpbl8iIHByZWZpeCAoZS5nLiBfX2J1aWx0aW5fYWJzKS4KKyAgYm9vbCBpc0xpYkZ1bmN0aW9uKHVuc2lnbmVkIElEKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmNocihnZXRSZWNvcmQoSUQpLkF0dHJpYnV0ZXMsICdGJykgIT0gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgYnVpbHRpbiBpcyBhIHByZWRlZmluZWQgbGliYy9saWJtCisgIC8vLyBmdW5jdGlvbiwgc3VjaCBhcyAibWFsbG9jIiwgd2hlcmUgd2Uga25vdyB0aGUgc2lnbmF0dXJlIGEKKyAgLy8vIHByaW9yaS4KKyAgYm9vbCBpc1ByZWRlZmluZWRMaWJGdW5jdGlvbih1bnNpZ25lZCBJRCkgY29uc3QgeworICAgIHJldHVybiBzdHJjaHIoZ2V0UmVjb3JkKElEKS5BdHRyaWJ1dGVzLCAnZicpICE9IG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGJ1aWx0aW4gcmVxdWlyZXMgYXBwcm9wcmlhdGUgaGVhZGVyIGluIG90aGVyCisgIC8vLyBjb21waWxlcnMuIEluIENsYW5nIGl0IHdpbGwgd29yayBldmVuIHdpdGhvdXQgaW5jbHVkaW5nIGl0LCBidXQgd2UgY2FuIGVtaXQKKyAgLy8vIGEgd2FybmluZyBhYm91dCBtaXNzaW5nIGhlYWRlci4KKyAgYm9vbCBpc0hlYWRlckRlcGVuZGVudEZ1bmN0aW9uKHVuc2lnbmVkIElEKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmNocihnZXRSZWNvcmQoSUQpLkF0dHJpYnV0ZXMsICdoJykgIT0gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgYnVpbHRpbiBpcyBhIHByZWRlZmluZWQgY29tcGlsZXItcnQvbGliZ2NjCisgIC8vLyBmdW5jdGlvbiwgc3VjaCBhcyAiX19jbGVhcl9jYWNoZSIsIHdoZXJlIHdlIGtub3cgdGhlIHNpZ25hdHVyZSBhCisgIC8vLyBwcmlvcmkuCisgIGJvb2wgaXNQcmVkZWZpbmVkUnVudGltZUZ1bmN0aW9uKHVuc2lnbmVkIElEKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmNocihnZXRSZWNvcmQoSUQpLkF0dHJpYnV0ZXMsICdpJykgIT0gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgYnVpbHRpbiBoYXMgY3VzdG9tIHR5cGVjaGVja2luZy4KKyAgYm9vbCBoYXNDdXN0b21UeXBlY2hlY2tpbmcodW5zaWduZWQgSUQpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyY2hyKGdldFJlY29yZChJRCkuQXR0cmlidXRlcywgJ3QnKSAhPSBudWxscHRyOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBidWlsdGluIGhhcyBhIHJlc3VsdCBvciBhbnkgYXJndW1lbnRzIHdoaWNoCisgIC8vLyBhcmUgcG9pbnRlciB0eXBlcy4KKyAgYm9vbCBoYXNQdHJBcmdzT3JSZXN1bHQodW5zaWduZWQgSUQpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyY2hyKGdldFJlY29yZChJRCkuVHlwZSwgJyonKSAhPSBudWxscHRyOworICB9CisKKyAgLy8vIFxicmllZiBDb21wbGV0ZWx5IGZvcmdldCB0aGF0IHRoZSBnaXZlbiBJRCB3YXMgZXZlciBjb25zaWRlcmVkIGEgYnVpbHRpbiwKKyAgLy8vIGUuZy4sIGJlY2F1c2UgdGhlIHVzZXIgcHJvdmlkZWQgYSBjb25mbGljdGluZyBzaWduYXR1cmUuCisgIHZvaWQgZm9yZ2V0QnVpbHRpbih1bnNpZ25lZCBJRCwgSWRlbnRpZmllclRhYmxlICZUYWJsZSk7CisKKyAgLy8vIFxicmllZiBJZiB0aGlzIGlzIGEgbGlicmFyeSBmdW5jdGlvbiB0aGF0IGNvbWVzIGZyb20gYSBzcGVjaWZpYworICAvLy8gaGVhZGVyLCByZXRyaWV2ZSB0aGF0IGhlYWRlciBuYW1lLgorICBjb25zdCBjaGFyICpnZXRIZWFkZXJOYW1lKHVuc2lnbmVkIElEKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFJlY29yZChJRCkuSGVhZGVyTmFtZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBidWlsdGluIGlzIGxpa2UgcHJpbnRmIGluIGl0cworICAvLy8gZm9ybWF0dGluZyBydWxlcyBhbmQsIGlmIHNvLCBzZXQgdGhlIGluZGV4IHRvIHRoZSBmb3JtYXQgc3RyaW5nCisgIC8vLyBhcmd1bWVudCBhbmQgd2hldGhlciB0aGlzIGZ1bmN0aW9uIGFzIGEgdmFfbGlzdCBhcmd1bWVudC4KKyAgYm9vbCBpc1ByaW50Zkxpa2UodW5zaWduZWQgSUQsIHVuc2lnbmVkICZGb3JtYXRJZHgsIGJvb2wgJkhhc1ZBTGlzdEFyZyk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGJ1aWx0aW4gaXMgbGlrZSBzY2FuZiBpbiBpdHMKKyAgLy8vIGZvcm1hdHRpbmcgcnVsZXMgYW5kLCBpZiBzbywgc2V0IHRoZSBpbmRleCB0byB0aGUgZm9ybWF0IHN0cmluZworICAvLy8gYXJndW1lbnQgYW5kIHdoZXRoZXIgdGhpcyBmdW5jdGlvbiBhcyBhIHZhX2xpc3QgYXJndW1lbnQuCisgIGJvb2wgaXNTY2FuZkxpa2UodW5zaWduZWQgSUQsIHVuc2lnbmVkICZGb3JtYXRJZHgsIGJvb2wgJkhhc1ZBTGlzdEFyZyk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGhhcyBubyBzaWRlIGVmZmVjdHMgYW5kIGRvZXNuJ3QKKyAgLy8vIHJlYWQgbWVtb3J5LCBleGNlcHQgZm9yIHBvc3NpYmx5IGVycm5vLgorICAvLy8KKyAgLy8vIFN1Y2ggZnVuY3Rpb25zIGNhbiBiZSBjb25zdCB3aGVuIHRoZSBNYXRoRXJybm8gbGFuZyBvcHRpb24gaXMgZGlzYWJsZWQuCisgIGJvb2wgaXNDb25zdFdpdGhvdXRFcnJubyh1bnNpZ25lZCBJRCkgY29uc3QgeworICAgIHJldHVybiBzdHJjaHIoZ2V0UmVjb3JkKElEKS5BdHRyaWJ1dGVzLCAnZScpICE9IG51bGxwdHI7CisgIH0KKworICBjb25zdCBjaGFyICpnZXRSZXF1aXJlZEZlYXR1cmVzKHVuc2lnbmVkIElEKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFJlY29yZChJRCkuRmVhdHVyZXM7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIGJ1aWx0aW4gSUQgYmVsb25ncyB0byBBdXhUYXJnZXQuCisgIGJvb2wgaXNBdXhCdWlsdGluSUQodW5zaWduZWQgSUQpIGNvbnN0IHsKKyAgICByZXR1cm4gSUQgPj0gKEJ1aWx0aW46OkZpcnN0VFNCdWlsdGluICsgVFNSZWNvcmRzLnNpemUoKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHJlYWwgYnVpdGluIElEIChpLmUuIElEIGl0IHdvdWxkIGhhdmUgZnVyaW5nIGNvbXBpbGF0aW9uCisgIC8vLyBmb3IgQXV4VGFyZ2V0KS4KKyAgdW5zaWduZWQgZ2V0QXV4QnVpbHRpbklEKHVuc2lnbmVkIElEKSBjb25zdCB7IHJldHVybiBJRCAtIFRTUmVjb3Jkcy5zaXplKCk7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBsaWJjL2xpYm0gZnVuY3Rpb24gd2l0aG91dCB0aGUgJ19fYnVpbHRpbl8nCisgIC8vLyBwcmVmaXguCisgIHN0YXRpYyBib29sIGlzQnVpbHRpbkZ1bmMoY29uc3QgY2hhciAqTmFtZSk7CisKK3ByaXZhdGU6CisgIGNvbnN0IEluZm8gJmdldFJlY29yZCh1bnNpZ25lZCBJRCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJcyB0aGlzIGJ1aWx0aW4gc3VwcG9ydGVkIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gbGFuZ3VhZ2Ugb3B0aW9ucz8KKyAgYm9vbCBidWlsdGluSXNTdXBwb3J0ZWQoY29uc3QgQnVpbHRpbjo6SW5mbyAmQnVpbHRpbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cyk7CisKKyAgLy8vIFxicmllZiBIZWxwZXIgZnVuY3Rpb24gZm9yIGlzUHJpbnRmTGlrZSBhbmQgaXNTY2FuZkxpa2UuCisgIGJvb2wgaXNMaWtlKHVuc2lnbmVkIElELCB1bnNpZ25lZCAmRm9ybWF0SWR4LCBib29sICZIYXNWQUxpc3RBcmcsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkZtdCkgY29uc3Q7Cit9OworCit9CisKKy8vLyBcYnJpZWYgS2luZHMgb2YgQnVpbHRpblRlbXBsYXRlRGVjbC4KK2VudW0gQnVpbHRpblRlbXBsYXRlS2luZCA6IGludCB7CisgIC8vLyBcYnJpZWYgVGhpcyBuYW1lcyB0aGUgX19tYWtlX2ludGVnZXJfc2VxIEJ1aWx0aW5UZW1wbGF0ZURlY2wuCisgIEJUS19fbWFrZV9pbnRlZ2VyX3NlcSwKKworICAvLy8gXGJyaWVmIFRoaXMgbmFtZXMgdGhlIF9fdHlwZV9wYWNrX2VsZW1lbnQgQnVpbHRpblRlbXBsYXRlRGVjbC4KKyAgQlRLX190eXBlX3BhY2tfZWxlbWVudAorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zQUFyY2g2NC5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc0FBcmNoNjQuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YTRmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc0FBcmNoNjQuZGVmCkBAIC0wLDAgKzEsNzMgQEAKKy8vPT0tIEJ1aWx0aW5zQUFyY2g2NC5kZWYgLSBBQXJjaDY0IEJ1aWx0aW4gZnVuY3Rpb24gZGF0YWJhc2UgLS0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEFBcmNoNjQtc3BlY2lmaWMgYnVpbHRpbiBmdW5jdGlvbiBkYXRhYmFzZS4gIFVzZXJzIG9mCisvLyB0aGlzIGZpbGUgbXVzdCBkZWZpbmUgdGhlIEJVSUxUSU4gbWFjcm8gdG8gbWFrZSB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBUaGUgZm9ybWF0IG9mIHRoaXMgZGF0YWJhc2UgbWF0Y2hlcyBjbGFuZy9CYXNpYy9CdWlsdGlucy5kZWYuCisKKyNpZiBkZWZpbmVkKEJVSUxUSU4pICYmICFkZWZpbmVkKExBTkdCVUlMVElOKQorIyAgIGRlZmluZSBMQU5HQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMsIEJVSUxUSU5fTEFORykgQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMpCisjZW5kaWYKKworLy8gSW4gbGliZ2NjCitCVUlMVElOKF9fY2xlYXJfY2FjaGUsICJ2dip2KiIsICJpIikKKworQlVJTFRJTihfX2J1aWx0aW5fYXJtX2xkcmV4LCAidi4iLCAidCIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fbGRhZXgsICJ2LiIsICJ0IikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zdHJleCwgImkuIiwgInQiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3N0bGV4LCAiaS4iLCAidCIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fY2xyZXgsICJ2IiwgIiIpCisKKy8vIEJpdCBtYW5pcHVsYXRpb24KK0JVSUxUSU4oX19idWlsdGluX2FybV9yYml0LCAiVWlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fcmJpdDY0LCAiTFVpTFVpIiwgIm5jIikKKworLy8gSElOVAorQlVJTFRJTihfX2J1aWx0aW5fYXJtX25vcCwgInYiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FybV95aWVsZCwgInYiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FybV93ZmUsICJ2IiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fd2ZpLCAidiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3NldiwgInYiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zZXZsLCAidiIsICIiKQorCisvLyBDUkMzMgorQlVJTFRJTihfX2J1aWx0aW5fYXJtX2NyYzMyYiwgIlVpVWlVYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fY3JjMzJjYiwgIlVpVWlVYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fY3JjMzJoLCAiVWlVaVVzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9jcmMzMmNoLCAiVWlVaVVzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9jcmMzMncsICJVaVVpVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX2NyYzMyY3csICJVaVVpVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX2NyYzMyZCwgIlVpVWlMVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX2NyYzMyY2QsICJVaVVpTFVpIiwgIm5jIikKKworLy8gTWVtb3J5IGJhcnJpZXIKK0JVSUxUSU4oX19idWlsdGluX2FybV9kbWIsICJ2VWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX2RzYiwgInZVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1faXNiLCAidlVpIiwgIm5jIikKKworLy8gUHJlZmV0Y2gKK0JVSUxUSU4oX19idWlsdGluX2FybV9wcmVmZXRjaCwgInZ2QypVaVVpVWlVaSIsICJuYyIpCisKKy8vIFN5c3RlbSBSZWdpc3RlcnMKK0JVSUxUSU4oX19idWlsdGluX2FybV9yc3IsICJVaWNDKiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fcnNyNjQsICJMVWljQyoiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3JzcnAsICJ2KmNDKiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fd3NyLCAidmNDKlVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV93c3I2NCwgInZjQypMVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3dzcnAsICJ2Y0MqdkMqIiwgIm5jIikKKworTEFOR0JVSUxUSU4oX19kbWIsICJ2VWkiLCAibmMiLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX19kc2IsICJ2VWkiLCAibmMiLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX19pc2IsICJ2VWkiLCAibmMiLCBBTExfTVNfTEFOR1VBR0VTKQorCisjdW5kZWYgQlVJTFRJTgorI3VuZGVmIExBTkdCVUlMVElOCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc0FNREdQVS5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc0FNREdQVS5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY2ODdmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zQU1ER1BVLmRlZgpAQCAtMCwwICsxLDE0OCBAQAorLy89PS0gQnVpbHRpbnNBTURHUFUuZGVmIC0gQU1ER1BVIEJ1aWx0aW4gZnVuY3Rpb24gZGF0YWJhc2UgLS0tLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQU1ER1BVLXNwZWNpZmljIGJ1aWx0aW4gZnVuY3Rpb24gZGF0YWJhc2UuIFVzZXJzIG9mCisvLyB0aGlzIGZpbGUgbXVzdCBkZWZpbmUgdGhlIEJVSUxUSU4gbWFjcm8gdG8gbWFrZSB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBUaGUgZm9ybWF0IG9mIHRoaXMgZGF0YWJhc2UgbWF0Y2hlcyBjbGFuZy9CYXNpYy9CdWlsdGlucy5kZWYuCisKKyNpZiBkZWZpbmVkKEJVSUxUSU4pICYmICFkZWZpbmVkKFRBUkdFVF9CVUlMVElOKQorIyAgIGRlZmluZSBUQVJHRVRfQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMsIEZFQVRVUkUpIEJVSUxUSU4oSUQsIFRZUEUsIEFUVFJTKQorI2VuZGlmCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU0krIG9ubHkgYnVpbHRpbnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fZGlzcGF0Y2hfcHRyLCAiVWMqNCIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fa2VybmFyZ19zZWdtZW50X3B0ciwgIlVjKjQiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX2ltcGxpY2l0YXJnX3B0ciwgIlVjKjQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fd29ya2dyb3VwX2lkX3gsICJVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fd29ya2dyb3VwX2lkX3ksICJVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fd29ya2dyb3VwX2lkX3osICJVaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl93b3JraXRlbV9pZF94LCAiVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX3dvcmtpdGVtX2lkX3ksICJVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fd29ya2l0ZW1faWRfeiwgIlVpIiwgIm5jIikKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIGJ1aWx0aW5zLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9zX2dldHJlZywgIlVpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fc19nZXRwYywgIkxVaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9zX3dhaXRjbnQsICJ2SWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fc19zZW5kbXNnLCAidklpVWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fc19zZW5kbXNnaGFsdCwgInZJaVVpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX3NfYmFycmllciwgInYiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fd2F2ZV9iYXJyaWVyLCAidiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9zX2RjYWNoZV9pbnYsICJ2IiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX2J1ZmZlcl93YmludmwxLCAidiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9kaXZfc2NhbGUsICJkZGRiYioiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fZGl2X3NjYWxlZiwgImZmZmJiKiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9kaXZfZm1hcywgImRkZGRiIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9kaXZfZm1hc2YsICJmZmZmYiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fZGl2X2ZpeHVwLCAiZGRkZCIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fZGl2X2ZpeHVwZiwgImZmZmYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX3RyaWdfcHJlb3AsICJkZGkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX3RyaWdfcHJlb3BmLCAiZmZpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9yY3AsICJkZCIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fcmNwZiwgImZmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9yc3EsICJkZCIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fcnNxZiwgImZmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9yc3FfY2xhbXAsICJkZCIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fcnNxX2NsYW1wZiwgImZmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9zaW5mLCAiZmYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX2Nvc2YsICJmZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fbG9nX2NsYW1wZiwgImZmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9sZGV4cCwgImRkaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fbGRleHBmLCAiZmZpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9mcmV4cF9tYW50LCAiZGQiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX2ZyZXhwX21hbnRmLCAiZmYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX2ZyZXhwX2V4cCwgImlkIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9mcmV4cF9leHBmLCAiaWYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX2ZyYWN0LCAiZGQiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX2ZyYWN0ZiwgImZmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9sZXJwLCAiVWlVaVVpVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX2NsYXNzLCAiYmRpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9jbGFzc2YsICJiZmkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX2N1YmVpZCwgImZmZmYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX2N1YmVzYywgImZmZmYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX2N1YmV0YywgImZmZmYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX2N1YmVtYSwgImZmZmYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX3NfbWVtdGltZSwgIkxVaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9zX3NsZWVwLCAidklpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX3NfaW5jcGVyZmxldmVsLCAidklpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX3NfZGVjcGVyZmxldmVsLCAidklpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX3VpY21wLCAiTFVpVWlVaUlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl91aWNtcGwsICJMVWlMVWlMVWlJaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fc2ljbXAsICJMVWlpaUlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9zaWNtcGwsICJMVWlMaUxpSWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX2ZjbXAsICJMVWlkZElpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9mY21wZiwgIkxVaWZmSWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX2RzX3N3aXp6bGUsICJpaUlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9kc19wZXJtdXRlLCAiaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9kc19icGVybXV0ZSwgImlpaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fcmVhZGZpcnN0bGFuZSwgImlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9yZWFkbGFuZSwgImlpaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fZm1lZDNmLCAiZmZmZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fZHNfZmFkZCwgImZmKjNmaWliIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX2RzX2ZtaW4sICJmZiozZmlpYiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9kc19mbWF4LCAiZmYqM2ZpaWIiLCAibiIpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBWSSsgb25seSBidWlsdGlucy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fZGl2X2ZpeHVwaCwgImhoaGgiLCAibmMiLCAiMTYtYml0LWluc3RzIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fcmNwaCwgImhoIiwgIm5jIiwgIjE2LWJpdC1pbnN0cyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX3JzcWgsICJoaCIsICJuYyIsICIxNi1iaXQtaW5zdHMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9zaW5oLCAiaGgiLCAibmMiLCAiMTYtYml0LWluc3RzIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fY29zaCwgImhoIiwgIm5jIiwgIjE2LWJpdC1pbnN0cyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX2xkZXhwaCwgImhoaSIsICJuYyIsICIxNi1iaXQtaW5zdHMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9mcmV4cF9tYW50aCwgImhoIiwgIm5jIiwgIjE2LWJpdC1pbnN0cyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX2ZyZXhwX2V4cGgsICJzaCIsICJuYyIsICIxNi1iaXQtaW5zdHMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9mcmFjdGgsICJoaCIsICJuYyIsICIxNi1iaXQtaW5zdHMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9jbGFzc2gsICJiaGkiLCAibmMiLCAiMTYtYml0LWluc3RzIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fc19tZW1yZWFsdGltZSwgIkxVaSIsICJuIiwgInMtbWVtcmVhbHRpbWUiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2FtZGdjbl9tb3ZfZHBwLCAiaWlJaUlpSWlJYiIsICJuYyIsICJkcHAiKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gR0ZYOSsgb25seSBidWlsdGlucy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fZm1lZDNoLCAiaGhoaCIsICJuYyIsICJnZng5LWluc3RzIikKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNwZWNpYWwgYnVpbHRpbnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX3JlYWRfZXhlYywgIkxVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hbWRnY25fcmVhZF9leGVjX2xvLCAiVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYW1kZ2NuX3JlYWRfZXhlY19oaSwgIlVpIiwgIm5jIikKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFI2MDAtTkkgb25seSBidWlsdGlucy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK0JVSUxUSU4oX19idWlsdGluX3I2MDBfaW1wbGljaXRhcmdfcHRyLCAiVWMqNyIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX3I2MDBfcmVhZF90Z2lkX3gsICJVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9yNjAwX3JlYWRfdGdpZF95LCAiVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fcjYwMF9yZWFkX3RnaWRfeiwgIlVpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fcjYwMF9yZWFkX3RpZGlnX3gsICJVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9yNjAwX3JlYWRfdGlkaWdfeSwgIlVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX3I2MDBfcmVhZF90aWRpZ196LCAiVWkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9yNjAwX3JlY2lwc3FydF9pZWVlLCAiZGQiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fcjYwMF9yZWNpcHNxcnRfaWVlZWYsICJmZiIsICJuYyIpCisKKyN1bmRlZiBCVUlMVElOCisjdW5kZWYgVEFSR0VUX0JVSUxUSU4KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zQVJNLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zQVJNLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDFkMzIwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNBUk0uZGVmCkBAIC0wLDAgKzEsMjM1IEBACisvLz09PS0tLSBCdWlsdGluc0FSTS5kZWYgLSBBUk0gQnVpbHRpbiBmdW5jdGlvbiBkYXRhYmFzZSAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEFSTS1zcGVjaWZpYyBidWlsdGluIGZ1bmN0aW9uIGRhdGFiYXNlLiAgVXNlcnMgb2YKKy8vIHRoaXMgZmlsZSBtdXN0IGRlZmluZSB0aGUgQlVJTFRJTiBtYWNybyB0byBtYWtlIHVzZSBvZiB0aGlzIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFRoZSBmb3JtYXQgb2YgdGhpcyBkYXRhYmFzZSBtYXRjaGVzIGNsYW5nL0Jhc2ljL0J1aWx0aW5zLmRlZi4KKworI2lmIGRlZmluZWQoQlVJTFRJTikgJiYgIWRlZmluZWQoTEFOR0JVSUxUSU4pCisjICAgZGVmaW5lIExBTkdCVUlMVElOKElELCBUWVBFLCBBVFRSUywgQlVJTFRJTl9MQU5HKSBCVUlMVElOKElELCBUWVBFLCBBVFRSUykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCVUlMVElOKSAmJiAhZGVmaW5lZChUQVJHRVRfSEVBREVSX0JVSUxUSU4pCisjICBkZWZpbmUgVEFSR0VUX0hFQURFUl9CVUlMVElOKElELCBUWVBFLCBBVFRSUywgSEVBREVSLCBMQU5HLCBGRUFUVVJFKSBCVUlMVElOKElELCBUWVBFLCBBVFRSUykKKyNlbmRpZgorCisvLyBJbiBsaWJnY2MKK0JVSUxUSU4oX19jbGVhcl9jYWNoZSwgInZ2KnYqIiwgImkiKQorCisvLyAxNi1iaXQgbXVsdGlwbGljYXRpb25zCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fc211bGJiLCAiaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zbXVsYnQsICJpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3NtdWx0YiwgImlpaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fc211bHR0LCAiaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zbXVsd2IsICJpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3NtdWx3dCwgImlpaSIsICJuYyIpCisKKy8vIFNhdHVyYXRpbmcgYXJpdGhtZXRpYworQlVJTFRJTihfX2J1aWx0aW5fYXJtX3FhZGQsICJpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3FzdWIsICJpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3FkYmwsICJpaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fc3NhdCwgImlpVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3VzYXQsICJVaWlVaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX2FybV9zbWxhYmIsICJpaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zbWxhYnQsICJpaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zbWxhdGIsICJpaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zbWxhdHQsICJpaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zbWxhd2IsICJpaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zbWxhd3QsICJpaWlpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fYXJtX3NzYXQxNiwgImlpaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fdXNhdDE2LCAiaWlpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fYXJtX3N4dGFiMTYsICJpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3N4dGIxNiwgImlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV91eHRhYjE2LCAiaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV91eHRiMTYsICJpaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX2FybV9zZWwsICJpaWkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fcWFkZDgsICJpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3FzdWI4LCAiaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zYWRkOCwgImlpaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fc2hhZGQ4LCAiaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zaHN1YjgsICJpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3NzdWI4LCAiaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV91YWRkOCwgIlVpVWlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fdWhhZGQ4LCAiVWlVaVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV91aHN1YjgsICJVaVVpVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3VxYWRkOCwgIlVpVWlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fdXFzdWI4LCAiVWlVaVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV91c3ViOCwgIlVpVWlVaSIsICJuYyIpCisKKy8vIFN1bSBvZiA4LWJpdCBhYnNvbHV0ZSBkaWZmZXJlbmNlcworQlVJTFRJTihfX2J1aWx0aW5fYXJtX3VzYWQ4LCAiVWlVaVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV91c2FkYTgsICJVaVVpVWlVaSIsICJuYyIpCisKKy8vIFBhcmFsbGVsIDE2LWJpdCBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24KK0JVSUxUSU4oX19idWlsdGluX2FybV9xYWRkMTYsICJpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3Fhc3gsICJpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3FzYXgsICJpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3FzdWIxNiwgImlpaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fc2FkZDE2LCAiaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zYXN4LCAiaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zaGFkZDE2LCAiaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zaGFzeCwgImlpaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fc2hzYXgsICJpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3Noc3ViMTYsICJpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3NzYXgsICJpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3NzdWIxNiwgImlpaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fdWFkZDE2LCAiVWlVaVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV91YXN4LCAiVWlVaVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV91aGFkZDE2LCAiVWlVaVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV91aGFzeCwgIlVpVWlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fdWhzYXgsICJVaVVpVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3Voc3ViMTYsICJVaVVpVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3VxYWRkMTYsICJVaVVpVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3VxYXN4LCAiVWlVaVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV91cXNheCwgIlVpVWlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fdXFzdWIxNiwgIlVpVWlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fdXNheCwgIlVpVWlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fdXN1YjE2LCAiVWlVaVVpIiwgIm5jIikKKworLy8gUGFyYWxsZWwgMTYtYml0IG11bHRpcGxpY2F0aW9uCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fc21sYWQsICJpaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zbWxhZHgsICJpaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zbWxhbGQsICJMTGlpaUxMaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fc21sYWxkeCwgIkxMaWlpTExpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zbWxzZCwgImlpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3NtbHNkeCwgImlpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3NtbHNsZCwgIkxMaWlpTExpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zbWxzbGR4LCAiTExpaWlMTGkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3NtdWFkLCAiaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zbXVhZHgsICJpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3NtdXNkLCAiaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zbXVzZHgsICJpaWkiLCAibmMiKQorCisvLyBCaXQgbWFuaXB1bGF0aW9uCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fcmJpdCwgIlVpVWkiLCAibmMiKQorCisvLyBTdG9yZSBhbmQgbG9hZCBleGNsdXNpdmUKK0JVSUxUSU4oX19idWlsdGluX2FybV9sZHJleGQsICJMTFVpdioiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zdHJleGQsICJpTExVaXYqIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FybV9sZHJleCwgInYuIiwgInQiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX2xkYWV4LCAidi4iLCAidCIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fc3RyZXgsICJpLiIsICJ0IikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zdGxleCwgImkuIiwgInQiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX2NscmV4LCAidiIsICIiKQorCisvLyBWRlAKK0JVSUxUSU4oX19idWlsdGluX2FybV9nZXRfZnBzY3IsICJVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fc2V0X2Zwc2NyLCAidlVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV92Y3Z0cl9mLCAiZmZpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV92Y3Z0cl9kLCAiZmRpIiwgIm5jIikKKworLy8gQ29wcm9jZXNzb3IKK0JVSUxUSU4oX19idWlsdGluX2FybV9sZGMsICJ2VUlpVUlpdkMqIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fbGRjbCwgInZVSWlVSWl2QyoiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9sZGMyLCAidlVJaVVJaXZDKiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX2xkYzJsLCAidlVJaVVJaXZDKiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fc3RjLCAidlVJaVVJaXYqIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fc3RjbCwgInZVSWlVSWl2KiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3N0YzIsICJ2VUlpVUlpdioiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zdGMybCwgInZVSWlVSWl2KiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fY2RwLCAidlVJaVVJaVVJaVVJaVVJaVVJaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX2NkcDIsICJ2VUlpVUlpVUlpVUlpVUlpVUlpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fbWNyLCAidlVJaVVJaVVpVUlpVUlpVUlpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fbWNyMiwgInZVSWlVSWlVaVVJaVVJaVVJaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX21yYywgIlVpVUlpVUlpVUlpVUlpVUlpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fbXJjMiwgIlVpVUlpVUlpVUlpVUlpVUlpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fbWNyciwgInZVSWlVSWlMTFVpVUlpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fbWNycjIsICJ2VUlpVUlpTExVaVVJaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX21ycmMsICJMTFVpVUlpVUlpVUlpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fbXJyYzIsICJMTFVpVUlpVUlpVUlpIiwgIiIpCisKKy8vIENSQzMyCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fY3JjMzJiLCAiVWlVaVVjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9jcmMzMmNiLCAiVWlVaVVjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9jcmMzMmgsICJVaVVpVXMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX2NyYzMyY2gsICJVaVVpVXMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX2NyYzMydywgIlVpVWlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fY3JjMzJjdywgIlVpVWlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fY3JjMzJkLCAiVWlVaUxMVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX2NyYzMyY2QsICJVaVVpTExVaSIsICJuYyIpCisKKy8vIEhJTlQKK0JVSUxUSU4oX19idWlsdGluX2FybV9ub3AsICJ2IiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1feWllbGQsICJ2IiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fd2ZlLCAidiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3dmaSwgInYiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9zZXYsICJ2IiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fc2V2bCwgInYiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9kYmcsICJ2VWkiLCAiIikKKworLy8gRGF0YSBiYXJyaWVyCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fZG1iLCAidlVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9kc2IsICJ2VWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX2lzYiwgInZVaSIsICJuYyIpCisKKy8vIFByZWZldGNoCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fcHJlZmV0Y2gsICJ2dkMqVWlVaSIsICJuYyIpCisKKy8vIFN5c3RlbSByZWdpc3RlcnMgKEFDTEUpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fcnNyLCAiVWljQyoiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3JzcjY0LCAiTExVaWNDKiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fcnNycCwgInYqY0MqIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV93c3IsICJ2Y0MqVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3dzcjY0LCAidmNDKkxMVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3dzcnAsICJ2Y0MqdkMqIiwgIm5jIikKKworLy8gTVNWQworTEFOR0JVSUxUSU4oX19lbWl0LCAidklVaUMiLCAiIiwgQUxMX01TX0xBTkdVQUdFUykKKworTEFOR0JVSUxUSU4oX195aWVsZCwgInYiLCAiIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9fd2ZlLCAidiIsICIiLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX193ZmksICJ2IiwgIiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfX3NldiwgInYiLCAiIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9fc2V2bCwgInYiLCAiIiwgQUxMX01TX0xBTkdVQUdFUykKKworTEFOR0JVSUxUSU4oX19kbWIsICJ2VWkiLCAibmMiLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX19kc2IsICJ2VWkiLCAibmMiLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX19pc2IsICJ2VWkiLCAibmMiLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX19pc29fdm9sYXRpbGVfbG9hZDgsICAgImNjQ0QqIiwgICAgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9faXNvX3ZvbGF0aWxlX2xvYWQxNiwgICJzc0NEKiIsICAgICAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfX2lzb192b2xhdGlsZV9sb2FkMzIsICAiaWlDRCoiLCAgICAgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX19pc29fdm9sYXRpbGVfbG9hZDY0LCAgIkxMaUxMaUNEKiIsICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9faXNvX3ZvbGF0aWxlX3N0b3JlOCwgICJ2Y0QqYyIsICAgICAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfX2lzb192b2xhdGlsZV9zdG9yZTE2LCAidnNEKnMiLCAgICAgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQorTEFOR0JVSUxUSU4oX19pc29fdm9sYXRpbGVfc3RvcmUzMiwgInZpRCppIiwgICAgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9faXNvX3ZvbGF0aWxlX3N0b3JlNjQsICJ2TExpRCpMTGkiLCAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfX2xkcmV4ZCwgIldpV2lDRCoiLCAiIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9Nb3ZlRnJvbUNvcHJvY2Vzc29yLCAiVWlJVWlJVWlJVWlJVWlJVWkiLCAiIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9Nb3ZlRnJvbUNvcHJvY2Vzc29yMiwgIlVpSVVpSVVpSVVpSVVpSVVpIiwgIiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfTW92ZVRvQ29wcm9jZXNzb3IsICJ2VWlJVWlJVWlJVWlJVWlJVWkiLCAiIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9Nb3ZlVG9Db3Byb2Nlc3NvcjIsICJ2VWlJVWlJVWlJVWlJVWlJVWkiLCAiIiwgQUxMX01TX0xBTkdVQUdFUykKKworVEFSR0VUX0hFQURFUl9CVUlMVElOKF9CaXRTY2FuRm9yd2FyZCwgIlVjVU5pKlVOaSIsICJuaCIsICJpbnRyaW4uaCIsIEFMTF9NU19MQU5HVUFHRVMsICIiKQorVEFSR0VUX0hFQURFUl9CVUlMVElOKF9CaXRTY2FuUmV2ZXJzZSwgIlVjVU5pKlVOaSIsICJuaCIsICJpbnRyaW4uaCIsIEFMTF9NU19MQU5HVUFHRVMsICIiKQorVEFSR0VUX0hFQURFUl9CVUlMVElOKF9CaXRTY2FuRm9yd2FyZDY0LCAiVWNVTmkqVUxMaSIsICJuaCIsICJpbnRyaW4uaCIsIEFMTF9NU19MQU5HVUFHRVMsICIiKQorVEFSR0VUX0hFQURFUl9CVUlMVElOKF9CaXRTY2FuUmV2ZXJzZTY0LCAiVWNVTmkqVUxMaSIsICJuaCIsICJpbnRyaW4uaCIsIEFMTF9NU19MQU5HVUFHRVMsICIiKQorCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX0ludGVybG9ja2VkQW5kNjQsICAgICAgICAgIkxMaUxMaUQqTExpIiwgIm5oIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX0ludGVybG9ja2VkRGVjcmVtZW50NjQsICAgIkxMaUxMaUQqIiwgICAgIm5oIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX0ludGVybG9ja2VkRXhjaGFuZ2U2NCwgICAgIkxMaUxMaUQqTExpIiwgIm5oIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX0ludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NCwgIkxMaUxMaUQqTExpIiwgIm5oIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX0ludGVybG9ja2VkRXhjaGFuZ2VTdWI2NCwgIkxMaUxMaUQqTExpIiwgIm5oIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX0ludGVybG9ja2VkSW5jcmVtZW50NjQsICAgIkxMaUxMaUQqIiwgICAgIm5oIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX0ludGVybG9ja2VkT3I2NCwgICAgICAgICAgIkxMaUxMaUQqTExpIiwgIm5oIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX0ludGVybG9ja2VkWG9yNjQsICAgICAgICAgIkxMaUxMaUQqTExpIiwgIm5oIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCisKKyN1bmRlZiBCVUlMVElOCisjdW5kZWYgTEFOR0JVSUxUSU4KKyN1bmRlZiBUQVJHRVRfSEVBREVSX0JVSUxUSU4KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zSGV4YWdvbi5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc0hleGFnb24uZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NzY3MjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc0hleGFnb24uZGVmCkBAIC0wLDAgKzEsMTczOCBAQAorLy89PT0tLSBCdWlsdGluc0hleGFnb24uZGVmIC0gSGV4YWdvbiBCdWlsdGluIGZ1bmN0aW9uIGRhdGFiYXNlIC0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgSGV4YWdvbi1zcGVjaWZpYyBidWlsdGluIGZ1bmN0aW9uIGRhdGFiYXNlLiBVc2VycyBvZgorLy8gdGhpcyBmaWxlIG11c3QgZGVmaW5lIHRoZSBCVUlMVElOIG1hY3JvIHRvIG1ha2UgdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gVGhlIGZvcm1hdCBvZiB0aGlzIGRhdGFiYXNlIG1hdGNoZXMgY2xhbmcvQmFzaWMvQnVpbHRpbnMuZGVmLgorCisvLyBUaGUgYnVpbHRpbnMgYmVsb3cgYXJlIG5vdCBhdXRvZ2VuZXJhdGVkIGZyb20gaXNldC5weS4KKy8vIE1ha2Ugc3VyZSB5b3UgZG8gbm90IG92ZXJ3cml0ZSB0aGVzZS4KKworQlVJTFRJTihfX2J1aWx0aW5fYnJldl9sZGQsICAgInYqTExpKkNMTGkqaUMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2JyZXZfbGR3LCAgICJ2KmkqQ2kqaUMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2JyZXZfbGRoLCAgICJ2KnMqQ3MqaUMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2JyZXZfbGR1aCwgICJ2KlVzKkNVcyppQyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYnJldl9sZGIsICAgInYqU2MqQ1NjKmlDIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9icmV2X2xkdWIsICAidipVYypDVWMqaUMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2NpcmNfbGRkLCAgICJMTGkqTExpKkxMaSppSWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2NpcmNfbGR3LCAgICJpKmkqaSppSWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2NpcmNfbGRoLCAgICJzKnMqcyppSWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2NpcmNfbGR1aCwgICJVcypVcypVcyppSWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2NpcmNfbGRiLCAgICJjKmMqYyppSWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2NpcmNfbGR1YiwgICJVYypVYypVYyppSWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2JyZXZfc3RkLCAgICJMTGkqQ0xMaSpMTGlpQyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYnJldl9zdHcsICAgImkqQ2kqaWlDIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9icmV2X3N0aCwgICAicypDcyppaUMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2JyZXZfc3RoaGksICJzKkNzKmlpQyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYnJldl9zdGIsICAgImMqQ2MqaWlDIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9jaXJjX3N0ZCwgICAiTExpKkxMaSpMTGlpSWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2NpcmNfc3R3LCAgICJpKmkqaWlJaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fY2lyY19zdGgsICAgInMqcyppaUlpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9jaXJjX3N0aGhpLCAicypzKmlpSWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2NpcmNfc3RiLCAgICJjKmMqaWlJaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9MMl9sb2FkcnViX3BjaSwgIml2KklpaXZDKiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9MMl9sb2FkcmJfcGNpLCAiaXYqSWlpdkMqIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0wyX2xvYWRydWhfcGNpLCAiaXYqSWlpdkMqIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0wyX2xvYWRyaF9wY2ksICJpdipJaWl2QyoiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTDJfbG9hZHJpX3BjaSwgIml2KklpaXZDKiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9MMl9sb2FkcmRfcGNpLCAiTExpdipJaWl2QyoiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTDJfbG9hZHJ1Yl9wY3IsICJpdippdkMqIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0wyX2xvYWRyYl9wY3IsICJpdippdkMqIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0wyX2xvYWRydWhfcGNyLCAiaXYqaXZDKiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9MMl9sb2FkcmhfcGNyLCAiaXYqaXZDKiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9MMl9sb2FkcmlfcGNyLCAiaXYqaXZDKiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9MMl9sb2FkcmRfcGNyLCAiTExpdippdkMqIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfc3RvcmVyYl9wY2ksICJ2dipJaWlpdkMqIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3N0b3JlcmhfcGNpLCAidnYqSWlpaXZDKiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9zdG9yZXJmX3BjaSwgInZ2KklpaWl2QyoiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfc3RvcmVyaV9wY2ksICJ2dipJaWlpdkMqIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3N0b3JlcmRfcGNpLCAidnYqSWlpTExpdkMqIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3N0b3JlcmJfcGNyLCAidnYqaWl2QyoiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfc3RvcmVyaF9wY3IsICJ2dippaXZDKiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9zdG9yZXJmX3BjciwgInZ2KmlpdkMqIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3N0b3JlcmlfcGNyLCAidnYqaWl2QyoiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfc3RvcmVyZF9wY3IsICJ2dippTExpdkMqIiwgIiIpCisKKy8vIFRoZSBidWlsdGlucyBhYm92ZSBhcmUgbm90IGF1dG9nZW5lcmF0ZWQgZnJvbSBpc2V0LnB5LgorLy8gTWFrZSBzdXJlIHlvdSBkbyBub3Qgb3ZlcndyaXRlIHRoZXNlLgorCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0MyX2NtcGVxLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DMl9jbXBndCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzJfY21wZ3R1LCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DMl9jbXBlcXAsImlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DMl9jbXBndHAsImlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DMl9jbXBndHVwLCJpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfcmNtcGVxaSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfcmNtcG5lcWksImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0E0X3JjbXBlcSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfcmNtcG5lcSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzJfYml0c3NldCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzJfYml0c2NsciwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzRfbmJpdHNzZXQsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0M0X25iaXRzY2xyLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DMl9jbXBlcWksImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0MyX2NtcGd0aSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzJfY21wZ3R1aSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzJfY21wZ2VpLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DMl9jbXBnZXVpLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DMl9jbXBsdCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzJfY21wbHR1LCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DMl9iaXRzY2xyaSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzRfbmJpdHNjbHJpLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DNF9jbXBuZXFpLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DNF9jbXBsdGVpLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DNF9jbXBsdGV1aSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzRfY21wbmVxLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DNF9jbXBsdGUsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0M0X2NtcGx0ZXUsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0MyX2FuZCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzJfb3IsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0MyX3hvciwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzJfYW5kbiwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzJfbm90LCJpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0MyX29ybiwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzRfYW5kX2FuZCwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0M0X2FuZF9vciwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0M0X29yX2FuZCwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0M0X29yX29yLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzRfYW5kX2FuZG4sImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DNF9hbmRfb3JuLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzRfb3JfYW5kbiwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0M0X29yX29ybiwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0MyX3B4ZmVyX21hcCwiaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DMl9hbnk4LCJpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0MyX2FsbDgsImlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzJfdml0cGFjaywiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzJfbXV4LCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzJfbXV4aWksImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DMl9tdXhpciwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0MyX211eHJpLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzJfdm11eCwiTExpaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0MyX21hc2ssIkxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92Y21wYmVxLCJpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfdmNtcGJlcWksImlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfdmNtcGJlcV9hbnksImlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92Y21wYmd0dSwiaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZjbXBiZ3R1aSwiaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF92Y21wYmd0LCJpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfdmNtcGJndGksImlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfY21wYmVxLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF9jbXBiZXFpLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF9jbXBiZ3R1LCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF9jbXBiZ3R1aSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfY21wYmd0LCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF9jbXBiZ3RpLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92Y21waGVxLCJpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdmNtcGhndCwiaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZjbXBoZ3R1LCJpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfdmNtcGhlcWksImlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfdmNtcGhndGksImlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfdmNtcGhndHVpLCJpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0E0X2NtcGhlcSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfY21waGd0LCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF9jbXBoZ3R1LCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF9jbXBoZXFpLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF9jbXBoZ3RpLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF9jbXBoZ3R1aSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdmNtcHdlcSwiaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZjbXB3Z3QsImlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92Y21wd2d0dSwiaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZjbXB3ZXFpLCJpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZjbXB3Z3RpLCJpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZjbXB3Z3R1aSwiaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF9ib3VuZHNjaGVjaywiaWlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF90bGJtYXRjaCwiaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DMl90ZnJwciwiaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DMl90ZnJycCwiaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9DNF9mYXN0Y29ybmVyOSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQzRfZmFzdGNvcm5lcjlfbm90LCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfYWNjX2hoX3MwLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19oaF9zMSwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2NfaGxfczAsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfYWNjX2hsX3MxLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19saF9zMCwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2NfbGhfczEsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfYWNjX2xsX3MwLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19sbF9zMSwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfaGhfczAsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfbmFjX2hoX3MxLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19obF9zMCwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfaGxfczEsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfbmFjX2xoX3MwLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19saF9zMSwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfbGxfczAsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfbmFjX2xsX3MxLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19zYXRfaGhfczAsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfYWNjX3NhdF9oaF9zMSwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2Nfc2F0X2hsX3MwLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19zYXRfaGxfczEsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfYWNjX3NhdF9saF9zMCwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2Nfc2F0X2xoX3MxLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19zYXRfbGxfczAsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfYWNjX3NhdF9sbF9zMSwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfc2F0X2hoX3MwLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19zYXRfaGhfczEsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfbmFjX3NhdF9obF9zMCwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfc2F0X2hsX3MxLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19zYXRfbGhfczAsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfbmFjX3NhdF9saF9zMSwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfc2F0X2xsX3MwLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19zYXRfbGxfczEsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfaGhfczAsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9oaF9zMSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2hsX3MwLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfaGxfczEsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9saF9zMCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2xoX3MxLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfbGxfczAsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9sbF9zMSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3NhdF9oaF9zMCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3NhdF9oaF9zMSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3NhdF9obF9zMCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3NhdF9obF9zMSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3NhdF9saF9zMCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3NhdF9saF9zMSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3NhdF9sbF9zMCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3NhdF9sbF9zMSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3JuZF9oaF9zMCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3JuZF9oaF9zMSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3JuZF9obF9zMCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3JuZF9obF9zMSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3JuZF9saF9zMCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3JuZF9saF9zMSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3JuZF9sbF9zMCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3JuZF9sbF9zMSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3NhdF9ybmRfaGhfczAsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9zYXRfcm5kX2hoX3MxLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfc2F0X3JuZF9obF9zMCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3NhdF9ybmRfaGxfczEsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9zYXRfcm5kX2xoX3MwLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfc2F0X3JuZF9saF9zMSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3NhdF9ybmRfbGxfczAsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9zYXRfcm5kX2xsX3MxLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX2FjY19oaF9zMCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX2FjY19oaF9zMSwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX2FjY19obF9zMCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX2FjY19obF9zMSwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX2FjY19saF9zMCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX2FjY19saF9zMSwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX2FjY19sbF9zMCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX2FjY19sbF9zMSwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX25hY19oaF9zMCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX25hY19oaF9zMSwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX25hY19obF9zMCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX25hY19obF9zMSwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX25hY19saF9zMCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX25hY19saF9zMSwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX25hY19sbF9zMCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX25hY19sbF9zMSwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX2hoX3MwLCJMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weWRfaGhfczEsIkxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9obF9zMCwiTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX2hsX3MxLCJMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weWRfbGhfczAsIkxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9saF9zMSwiTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX2xsX3MwLCJMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weWRfbGxfczEsIkxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9ybmRfaGhfczAsIkxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9ybmRfaGhfczEsIkxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9ybmRfaGxfczAsIkxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9ybmRfaGxfczEsIkxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9ybmRfbGhfczAsIkxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9ybmRfbGhfczEsIkxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9ybmRfbGxfczAsIkxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9ybmRfbGxfczEsIkxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9hY2NfaGhfczAsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2FjY19oaF9zMSwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfYWNjX2hsX3MwLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9hY2NfaGxfczEsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2FjY19saF9zMCwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfYWNjX2xoX3MxLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9hY2NfbGxfczAsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2FjY19sbF9zMSwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfbmFjX2hoX3MwLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9uYWNfaGhfczEsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X25hY19obF9zMCwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfbmFjX2hsX3MxLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9uYWNfbGhfczAsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X25hY19saF9zMSwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfbmFjX2xsX3MwLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9uYWNfbGxfczEsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2hoX3MwLCJVaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9oaF9zMSwiVWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfaGxfczAsIlVpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2hsX3MxLCJVaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9saF9zMCwiVWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfbGhfczEsIlVpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2xsX3MwLCJVaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9sbF9zMSwiVWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2FjY19oaF9zMCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9hY2NfaGhfczEsIkxMaUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfYWNjX2hsX3MwLCJMTGlMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2FjY19obF9zMSwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9hY2NfbGhfczAsIkxMaUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfYWNjX2xoX3MxLCJMTGlMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2FjY19sbF9zMCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9hY2NfbGxfczEsIkxMaUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfbmFjX2hoX3MwLCJMTGlMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX25hY19oaF9zMSwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9uYWNfaGxfczAsIkxMaUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfbmFjX2hsX3MxLCJMTGlMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX25hY19saF9zMCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9uYWNfbGhfczEsIkxMaUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfbmFjX2xsX3MwLCJMTGlMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX25hY19sbF9zMSwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9oaF9zMCwiVUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfaGhfczEsIlVMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2hsX3MwLCJVTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9obF9zMSwiVUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfbGhfczAsIlVMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2xoX3MxLCJVTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9sbF9zMCwiVUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfbGxfczEsIlVMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weXNtaSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbWFjc2lwLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbWFjc2luLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfZHBtcHlzc19zMCwiTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9kcG1weXNzX2FjY19zMCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9kcG1weXNzX25hY19zMCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9kcG1weXV1X3MwLCJVTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9kcG1weXV1X2FjY19zMCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9kcG1weXV1X25hY19zMCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfdXAsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weV91cF9zMSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3VwX3MxX3NhdCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV91cCwiVWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21weXN1X3VwLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9kcG1weXNzX3JuZF9zMCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTRfbWFjX3VwX3MxX3NhdCwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX000X25hY191cF9zMV9zYXQsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlpLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1aSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbWFjaSwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX2FjY2ksImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9hY2NpaSwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX25hY2NpLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbmFjY2lpLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfc3ViYWNjLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTRfbXB5cnJfYWRkciwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX000X21weXJpX2FkZHJfdTIsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NNF9tcHlyaV9hZGRyLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTRfbXB5cmlfYWRkaSwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX000X21weXJyX2FkZGksImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92bXB5MnNfczAsIkxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfdm1weTJzX3MxLCJMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX3ZtYWMyc19zMCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92bWFjMnNfczEsIkxMaUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfdm1weTJzdV9zMCwiTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92bXB5MnN1X3MxLCJMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX3ZtYWMyc3VfczAsIkxMaUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfdm1hYzJzdV9zMSwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92bXB5MnNfczBwYWNrLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92bXB5MnNfczFwYWNrLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92bWFjMiwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92bXB5MmVzX3MwLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92bXB5MmVzX3MxLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92bWFjMmVzX3MwLCJMTGlMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92bWFjMmVzX3MxLCJMTGlMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92bWFjMmVzLCJMTGlMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92cm1hY19zMCwiTExpTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfdnJtcHlfczAsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX3ZkbXB5cnNfczAsImlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92ZG1weXJzX3MxLCJpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTVfdnJtcHlidXUsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX001X3ZybWFjYnV1LCJMTGlMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NNV92cm1weWJzdSwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTVfdnJtYWNic3UsIkxMaUxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX001X3ZtcHlidXUsIkxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTVfdm1weWJzdSwiTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NNV92bWFjYnV1LCJMTGlMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX001X3ZtYWNic3UsIkxMaUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTVfdmRtcHlic3UsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX001X3ZkbWFjYnN1LCJMTGlMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92ZG1hY3NfczAsIkxMaUxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX3ZkbWFjc19zMSwiTExpTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfdmRtcHlzX3MwLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92ZG1weXNfczEsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX2NtcHlyc19zMCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfY21weXJzX3MxLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbXB5cnNjX3MwLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbXB5cnNjX3MxLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbWFjc19zMCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbWFjc19zMSwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbWFjc2NfczAsIkxMaUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfY21hY3NjX3MxLCJMTGlMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX2NtcHlzX3MwLCJMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX2NtcHlzX3MxLCJMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX2NtcHlzY19zMCwiTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbXB5c2NfczEsIkxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfY25hY3NfczAsIkxMaUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfY25hY3NfczEsIkxMaUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfY25hY3NjX3MwLCJMTGlMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX2NuYWNzY19zMSwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92cmNtcHlzX3MxLCJMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfdnJjbXB5c19hY2NfczEsIkxMaUxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92cmNtcHlzX3MxcnAsImlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbW1hY2xzX3MwLCJMTGlMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbWFjbHNfczEsIkxMaUxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWNoc19zMCwiTExpTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbW1hY2hzX3MxLCJMTGlMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbXB5bF9zMCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbW1weWxfczEsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHloX3MwLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbXB5aF9zMSwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbW1hY2xzX3JzMCwiTExpTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbW1hY2xzX3JzMSwiTExpTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbW1hY2hzX3JzMCwiTExpTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbW1hY2hzX3JzMSwiTExpTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbW1weWxfcnMwLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbXB5bF9yczEsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHloX3JzMCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbW1weWhfcnMxLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NNF92cm1weWVoX3MwLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NNF92cm1weWVoX3MxLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NNF92cm1weWVoX2FjY19zMCwiTExpTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTRfdnJtcHllaF9hY2NfczEsIkxMaUxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX000X3ZybXB5b2hfczAsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX000X3ZybXB5b2hfczEsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX000X3ZybXB5b2hfYWNjX3MwLCJMTGlMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NNF92cm1weW9oX2FjY19zMSwiTExpTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfaG1tcHlsX3JzMSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfaG1tcHloX3JzMSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfaG1tcHlsX3MxLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9obW1weWhfczEsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWN1bHNfczAsIkxMaUxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWN1bHNfczEsIkxMaUxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWN1aHNfczAsIkxMaUxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWN1aHNfczEsIkxMaUxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHl1bF9zMCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbW1weXVsX3MxLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbXB5dWhfczAsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHl1aF9zMSwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbW1hY3Vsc19yczAsIkxMaUxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWN1bHNfcnMxLCJMTGlMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbWFjdWhzX3JzMCwiTExpTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfbW1hY3Voc19yczEsIkxMaUxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHl1bF9yczAsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHl1bF9yczEsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHl1aF9yczAsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHl1aF9yczEsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX3ZyY21hY2lfczAsIkxMaUxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX3ZyY21hY3JfczAsIkxMaUxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX3ZyY21hY2lfczBjLCJMTGlMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92cmNtYWNyX3MwYywiTExpTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfY21hY2lfczAsIkxMaUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfY21hY3JfczAsIkxMaUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfdnJjbXB5aV9zMCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfdnJjbXB5cl9zMCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfdnJjbXB5aV9zMGMsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX3ZyY21weXJfczBjLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbXB5aV9zMCwiTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbXB5cl9zMCwiTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NNF9jbXB5aV93aCwiaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NNF9jbXB5cl93aCwiaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NNF9jbXB5aV93aGMsImlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTRfY21weXJfd2hjLCJpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX3ZjbXB5X3MwX3NhdF9pLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92Y21weV9zMF9zYXRfciwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfdmNtcHlfczFfc2F0X2ksIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX00yX3ZjbXB5X3MxX3NhdF9yLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92Y21hY19zMF9zYXRfaSwiTExpTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfdmNtYWNfczBfc2F0X3IsIkxMaUxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3Zjcm90YXRlLCJMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzRfdnJjcm90YXRlX2FjYywiTExpTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TNF92cmNyb3RhdGUsIkxMaUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfdmNuZWdoLCJMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfdnJjbmVnaCwiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX000X3BtcHl3LCJMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX000X3ZwbXB5aCwiTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NNF9wbXB5d19hY2MsIkxMaUxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTRfdnBtcHloX2FjYywiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGQsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YiwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfYWRkc2F0LCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWJzYXQsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX2FkZGksImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX2FkZGhfbDE2X2xsLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRoX2wxNl9obCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfYWRkaF9sMTZfc2F0X2xsLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRoX2wxNl9zYXRfaGwsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YmhfbDE2X2xsLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWJoX2wxNl9obCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfc3ViaF9sMTZfc2F0X2xsLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWJoX2wxNl9zYXRfaGwsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX2FkZGhfaDE2X2xsLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRoX2gxNl9saCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfYWRkaF9oMTZfaGwsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX2FkZGhfaDE2X2hoLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRoX2gxNl9zYXRfbGwsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX2FkZGhfaDE2X3NhdF9saCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfYWRkaF9oMTZfc2F0X2hsLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRoX2gxNl9zYXRfaGgsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YmhfaDE2X2xsLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWJoX2gxNl9saCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfc3ViaF9oMTZfaGwsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YmhfaDE2X2hoLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWJoX2gxNl9zYXRfbGwsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YmhfaDE2X3NhdF9saCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfc3ViaF9oMTZfc2F0X2hsLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWJoX2gxNl9zYXRfaGgsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX2FzbGgsImlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfYXNyaCwiaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRwLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRwc2F0LCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRzcCwiTExpaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YnAsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX25lZywiaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9uZWdzYXQsImlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfYWJzLCJpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX2Fic3NhdCwiaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92Y29uaiwiTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfbmVncCwiTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfYWJzcCwiTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfbWF4LCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9tYXh1LCJVaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfbWluLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9taW51LCJVaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfbWF4cCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfbWF4dXAsIlVMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9taW5wLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9taW51cCwiVUxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3RmciwiaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl90ZnJzaSwiaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl90ZnJwLCJMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl90ZnJwaSwiTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3p4dGIsImlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfc3h0YiwiaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl96eHRoLCJpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3N4dGgsImlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfY29tYmluZXcsIkxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfY29tYmluZXJpLCJMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0E0X2NvbWJpbmVpciwiTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9jb21iaW5laWksIkxMaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfY29tYmluZV9oaCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfY29tYmluZV9obCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfY29tYmluZV9saCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfY29tYmluZV9sbCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdGZyaWwsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3RmcmloLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9hbmQsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX29yLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl94b3IsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX25vdCwiaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl94b3JfeGFjYywiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX000X3hvcl94YWNjLCJMTGlMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF9hbmRuLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF9vcm4sImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0E0X2FuZG5wLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF9vcm5wLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TNF9hZGRhZGRpLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzRfc3ViYWRkaSwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX000X2FuZF9hbmQsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NNF9hbmRfYW5kbiwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX000X2FuZF9vciwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX000X2FuZF94b3IsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NNF9vcl9hbmQsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NNF9vcl9hbmRuLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTRfb3Jfb3IsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NNF9vcl94b3IsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TNF9vcl9hbmRpeCwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M0X29yX2FuZGksImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TNF9vcl9vcmksImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NNF94b3JfYW5kLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTRfeG9yX29yLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTRfeG9yX2FuZG4sImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWJyaSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfYW5kaXIsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX29yaXIsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX2FuZHAsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX29ycCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfeG9ycCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfbm90cCwiTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfc3h0dywiTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3NhdCwiaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3JvdW5kc2F0LCJpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfc2F0aCwiaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9zYXR1aCwiaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9zYXR1YiwiaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9zYXRiLCJpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZhZGR1YiwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdmFkZGJfbWFwLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92YWRkdWJzLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92YWRkaCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdmFkZGhzLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92YWRkdWhzLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNV92YWRkaHVicywiaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZhZGR3LCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92YWRkd3MsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M0X3Z4YWRkc3VidywiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzRfdnhzdWJhZGR3LCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TNF92eGFkZHN1YmgsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M0X3Z4c3ViYWRkaCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzRfdnhhZGRzdWJociwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzRfdnhzdWJhZGRociwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfc3ZhdmdoLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdmF2Z2hzLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdm5hdmdoLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdmFkZGgsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3N2YWRkaHMsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3N2YWRkdWhzLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdnN1YmgsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3N2c3ViaHMsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3N2c3VidWhzLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92cmFkZHViLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92cmFkZHViX2FjYywiTExpTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfdnJhZGRoLCJpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfdnJhZGR1aCwiaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZzdWJ1YiwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdnN1YmJfbWFwLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92c3VidWJzLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92c3ViaCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdnN1YmhzLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92c3VidWhzLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92c3VidywiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdnN1YndzLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92YWJzaCwiTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdmFic2hzYXQsIkxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZhYnN3LCJMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92YWJzd3NhdCwiTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fTTJfdmFic2RpZmZ3LCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NMl92YWJzZGlmZmgsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3Zyc2FkdWIsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3Zyc2FkdWJfYWNjLCJMTGlMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92YXZndWIsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3Zhdmd1aCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdmF2Z2gsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZuYXZnaCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdmF2Z3csIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZuYXZndywiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdmF2Z3dyLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92bmF2Z3dyLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92YXZnd2NyLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92bmF2Z3djciwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdmF2Z2hjciwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdm5hdmdoY3IsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3Zhdmd1dywiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdmF2Z3V3ciwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdmF2Z3ViciwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdmF2Z3VociwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdmF2Z2hyLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92bmF2Z2hyLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF9yb3VuZF9yaSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfcm91bmRfcnIsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0E0X3JvdW5kX3JpX3NhdCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfcm91bmRfcnJfc2F0LCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF9jcm91bmRfcmksImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0E0X2Nyb3VuZF9yciwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfdnJtaW5oLCJMTGlMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfdnJtYXhoLCJMTGlMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfdnJtaW51aCwiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZybWF4dWgsIkxMaUxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF92cm1pbncsIkxMaUxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF92cm1heHcsIkxMaUxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF92cm1pbnV3LCJMTGlMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTRfdnJtYXh1dywiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZtaW5iLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92bWF4YiwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdm1pbnViLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92bWF4dWIsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZtaW5oLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92bWF4aCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdm1pbnVoLCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92bWF4dWgsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZtaW53LCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92bWF4dywiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTJfdm1pbnV3LCJMTGlMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl92bWF4dXcsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0E0X21vZHdyYXB1LCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmFkZCwiZmZmIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfc2ZzdWIsImZmZiIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmbXB5LCJmZmYiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmZtYSwiZmZmZiIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmZm1hX3NjLCJmZmZmaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmZm1zLCJmZmZmIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfc2ZmbWFfbGliLCJmZmZmIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfc2ZmbXNfbGliLCJmZmZmIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfc2ZjbXBlcSwiaWZmIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfc2ZjbXBndCwiaWZmIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfc2ZjbXBnZSwiaWZmIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfc2ZjbXB1bywiaWZmIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfc2ZtYXgsImZmZiIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmbWluLCJmZmYiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmNsYXNzLCJpZmkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmltbV9wLCJmaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmaW1tX24sImZpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfc2ZmaXh1cG4sImZmZiIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmZml4dXBkLCJmZmYiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmZpeHVwciwiZmYiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9kZmNtcGVxLCJpZGQiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9kZmNtcGd0LCJpZGQiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9kZmNtcGdlLCJpZGQiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9kZmNtcHVvLCJpZGQiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9kZmNsYXNzLCJpZGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9kZmltbV9wLCJkaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0YyX2RmaW1tX24sImRpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfY29udl9zZjJkZiwiZGYiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X2RmMnNmLCJmZCIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfdXcyc2YsImZpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfY29udl91dzJkZiwiZGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X3cyc2YsImZpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfY29udl93MmRmLCJkaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfdWQyc2YsImZMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X3VkMmRmLCJkTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfY29udl9kMnNmLCJmTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfY29udl9kMmRmLCJkTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfY29udl9zZjJ1dywiaWYiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X3NmMncsImlmIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfY29udl9zZjJ1ZCwiTExpZiIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfc2YyZCwiTExpZiIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfZGYydXcsImlkIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfY29udl9kZjJ3LCJpZCIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfZGYydWQsIkxMaWQiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X2RmMmQsIkxMaWQiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X3NmMnV3X2Nob3AsImlmIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfY29udl9zZjJ3X2Nob3AsImlmIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfY29udl9zZjJ1ZF9jaG9wLCJMTGlmIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfY29udl9zZjJkX2Nob3AsIkxMaWYiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X2RmMnV3X2Nob3AsImlkIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfY29udl9kZjJ3X2Nob3AsImlkIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfY29udl9kZjJ1ZF9jaG9wLCJMTGlkIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fRjJfY29udl9kZjJkX2Nob3AsIkxMaWQiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3Jfcl9yLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfcl9yLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3Jfcl9yLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc2xfcl9yLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3Jfcl9wLCJMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNsX3JfcCwiTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9yX3AsIkxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc2xfcl9wLCJMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNyX3Jfcl9hY2MsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfcl9yX2FjYywiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9yX3JfYWNjLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfbHNsX3Jfcl9hY2MsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3Jfcl9wX2FjYywiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9yX3BfYWNjLCJMTGlMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfbHNyX3JfcF9hY2MsIkxMaUxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc2xfcl9wX2FjYywiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9yX3JfbmFjLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNsX3Jfcl9uYWMsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3Jfcl9yX25hYywiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzbF9yX3JfbmFjLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNyX3JfcF9uYWMsIkxMaUxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfcl9wX25hYywiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9yX3BfbmFjLCJMTGlMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfbHNsX3JfcF9uYWMsIkxMaUxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3Jfcl9yX2FuZCwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9yX3JfYW5kLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfbHNyX3Jfcl9hbmQsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc2xfcl9yX2FuZCwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9yX3Jfb3IsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfcl9yX29yLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfbHNyX3Jfcl9vciwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzbF9yX3Jfb3IsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3Jfcl9wX2FuZCwiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9yX3BfYW5kLCJMTGlMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfbHNyX3JfcF9hbmQsIkxMaUxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc2xfcl9wX2FuZCwiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9yX3Bfb3IsIkxMaUxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfcl9wX29yLCJMTGlMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfbHNyX3JfcF9vciwiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzbF9yX3Bfb3IsIkxMaUxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3Jfcl9wX3hvciwiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9yX3BfeG9yLCJMTGlMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfbHNyX3JfcF94b3IsIkxMaUxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc2xfcl9wX3hvciwiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9yX3Jfc2F0LCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfcl9yX3NhdCwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfciwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfbHNyX2lfciwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNsX2lfciwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfcCwiTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9pX3AsIkxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfaV9wLCJMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfcl9hY2MsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV9yX2FjYywiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9pX3JfYWNjLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfcF9hY2MsIkxMaUxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV9wX2FjYywiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9pX3BfYWNjLCJMTGlMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfcl9uYWMsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV9yX25hYywiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9pX3JfbmFjLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfcF9uYWMsIkxMaUxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV9wX25hYywiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9pX3BfbmFjLCJMTGlMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfbHNyX2lfcl94YWNjLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNsX2lfcl94YWNjLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfbHNyX2lfcF94YWNjLCJMTGlMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNsX2lfcF94YWNjLCJMTGlMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfcl9hbmQsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV9yX2FuZCwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9pX3JfYW5kLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfcl9vciwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9pX3Jfb3IsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfaV9yX29yLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfcF9hbmQsIkxMaUxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV9wX2FuZCwiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9pX3BfYW5kLCJMTGlMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfcF9vciwiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9pX3Bfb3IsIkxMaUxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfaV9wX29yLCJMTGlMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNsX2lfcl9zYXQsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9pX3Jfcm5kLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3JfaV9yX3JuZF9nb29kc3ludGF4LCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3JfaV9wX3JuZCwiTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9pX3Bfcm5kX2dvb2RzeW50YXgsIkxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TNF9sc2xpLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hZGRhc2xfcnJyaSwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M0X2FuZGlfYXNsX3JpLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzRfb3JpX2FzbF9yaSwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M0X2FkZGlfYXNsX3JpLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzRfc3ViaV9hc2xfcmksImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TNF9hbmRpX2xzcl9yaSwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M0X29yaV9sc3JfcmksImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TNF9hZGRpX2xzcl9yaSwiaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M0X3N1YmlfbHNyX3JpLCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfdmFsaWduaWIsIkxMaUxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl92YWxpZ25yYiwiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZzcGxpY2VpYiwiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZzcGxpY2VyYiwiTExpTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZzcGxhdHJoLCJMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfdnNwbGF0cmIsImlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfaW5zZXJ0LCJpaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3RhYmxlaWR4Yl9nb29kc3ludGF4LCJpaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3RhYmxlaWR4aF9nb29kc3ludGF4LCJpaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3RhYmxlaWR4d19nb29kc3ludGF4LCJpaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3RhYmxlaWR4ZF9nb29kc3ludGF4LCJpaWlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0E0X2JpdHNwbGl0aSwiTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BNF9iaXRzcGxpdCwiTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TNF9leHRyYWN0LCJpaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfZXh0cmFjdHUsImlpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9pbnNlcnRwLCJMTGlMTGlMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M0X2V4dHJhY3RwLCJMTGlMTGlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2V4dHJhY3R1cCwiTExpTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9pbnNlcnRfcnAsImlpaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M0X2V4dHJhY3RfcnAsImlpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfZXh0cmFjdHVfcnAsImlpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfaW5zZXJ0cF9ycCwiTExpTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzRfZXh0cmFjdHBfcnAsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2V4dHJhY3R1cF9ycCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfdHN0Yml0X2ksImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M0X250c3RiaXRfaSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfc2V0Yml0X2ksImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3RvZ2dsZWJpdF9pLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9jbHJiaXRfaSwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfdHN0Yml0X3IsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M0X250c3RiaXRfciwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfc2V0Yml0X3IsImlpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3RvZ2dsZWJpdF9yLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9jbHJiaXRfciwiaWlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfdmgsIkxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV92aCwiTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9pX3ZoLCJMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNyX3JfdmgsIkxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TNV9hc3JodWJfcm5kX3NhdF9nb29kc3ludGF4LCJpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M1X2Fzcmh1Yl9zYXQsImlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzVfdmFzcmhybmRfZ29vZHN5bnRheCwiTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9yX3ZoLCJMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfbHNyX3JfdmgsIkxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc2xfcl92aCwiTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9pX3Z3LCJMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfc3Z3X3RydW4sImlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNyX3Jfc3Z3X3RydW4sImlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfbHNyX2lfdncsIkxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfaV92dywiTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9yX3Z3LCJMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYXNsX3JfdncsIkxMaUxMaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3Jfcl92dywiTExpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzbF9yX3Z3LCJMTGlMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfdnJuZHBhY2t3aCwiaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZybmRwYWNrd2hzLCJpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfdnN4dGJoLCJMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfdnp4dGJoLCJMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfdnNhdGh1YiwiaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3N2c2F0aHViLCJpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3N2c2F0aGIsImlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfdnNhdGhiLCJpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfdnRydW5vaGIsImlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl92dHJ1bmV3aCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfdnRydW5vd2gsIkxMaUxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3Z0cnVuZWhiLCJpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfdnN4dGh3LCJMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfdnp4dGh3LCJMTGlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfdnNhdHdoLCJpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfdnNhdHd1aCwiaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3BhY2tobCwiTExpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9BMl9zd2l6LCJpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZzYXRodWJfbm9wYWNrLCJMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl92c2F0aGJfbm9wYWNrLCJMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl92c2F0d2hfbm9wYWNrLCJMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl92c2F0d3VoX25vcGFjaywiTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfc2h1ZmZvYiwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfc2h1ZmZlYiwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfc2h1ZmZvaCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfc2h1ZmZlaCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzVfcG9wY291bnRwLCJpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzRfcGFyaXR5LCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9wYXJpdHlwLCJpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfbGZzcCwiTExpTExpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfY2xibm9ybSwiaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TNF9jbGJhZGRpLCJpaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TNF9jbGJwbm9ybSwiaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M0X2NsYnBhZGRpLCJpTExpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2NsYiwiaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9jbDAsImlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfY2wxLCJpaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2NsYnAsImlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9jbDBwLCJpTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfY2wxcCwiaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2JyZXYsImlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfYnJldnAsIkxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2N0MCwiaWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9jdDEsImlpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzJfY3QwcCwiaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1MyX2N0MXAsImlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9pbnRlcmxlYXZlLCJMTGlMTGkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9kZWludGVybGVhdmUsIkxMaUxMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX3ByZWZldGNoLCJ2dioiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9ZMl9kY2NsZWFuYSwidnYqIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fWTJfZGNjbGVhbmludmEsInZ2KiIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1kyX2RjaW52YSwidnYqIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fWTJfZGN6ZXJvYSwidnYqIiwiIikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fWTRfbDJmZXRjaCwidnYqVWkiLCIiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9ZNV9sMmZldGNoLCJ2dipMTFVpIiwiIikKKworQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TNl9yb2xfaV9yLCJpaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M2X3JvbF9pX3AsIkxMaUxMaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M2X3JvbF9pX3JfYWNjLCJpaWlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TNl9yb2xfaV9wX2FjYywiTExpTExpTExpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzZfcm9sX2lfcl9uYWMsImlpaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M2X3JvbF9pX3BfbmFjLCJMTGlMTGlMTGlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TNl9yb2xfaV9yX3hhY2MsImlpaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M2X3JvbF9pX3BfeGFjYywiTExpTExpTExpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzZfcm9sX2lfcl9hbmQsImlpaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M2X3JvbF9pX3Jfb3IsImlpaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1M2X3JvbF9pX3BfYW5kLCJMTGlMTGlMTGlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TNl9yb2xfaV9wX29yLCJMTGlMTGlMTGlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TMl9jYWJhY2VuY2JpbiwiTExpTExpTExpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFsaWduYiwiVjE2aVYxNmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFsaWduYl8xMjhCLCJWMzJpVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bGFsaWduYiwiVjE2aVYxNmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmxhbGlnbmJfMTI4QiwiVjMyaVYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFsaWduYmksIlYxNmlWMTZpVjE2aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbGlnbmJpXzEyOEIsIlYzMmlWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsYWxpZ25iaSwiVjE2aVYxNmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmxhbGlnbmJpXzEyOEIsIlYzMmlWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyb3IsIlYxNmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJvcl8xMjhCLCJWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z1bnBhY2t1YiwiVjMyaVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z1bnBhY2t1Yl8xMjhCLCJWNjRpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnVucGFja2IsIlYzMmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92dW5wYWNrYl8xMjhCLCJWNjRpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnVucGFja3VoLCJWMzJpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnVucGFja3VoXzEyOEIsIlY2NGlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92dW5wYWNraCwiVjMyaVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z1bnBhY2toXzEyOEIsIlY2NGlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92dW5wYWNrb2IsIlYzMmlWMzJpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnVucGFja29iXzEyOEIsIlY2NGlWNjRpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnVucGFja29oLCJWMzJpVjMyaVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z1bnBhY2tvaF8xMjhCLCJWNjRpVjY0aVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZwYWNrZWIsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2tlYl8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZwYWNrZWgsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2tlaF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZwYWNrb2IsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2tvYl8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZwYWNrb2gsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2tvaF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZwYWNraHViX3NhdCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja2h1Yl9zYXRfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja2hiX3NhdCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja2hiX3NhdF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZwYWNrd3VoX3NhdCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja3d1aF9zYXRfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja3doX3NhdCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja3doX3NhdF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z6YiwiVjMyaVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z6Yl8xMjhCLCJWNjRpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnNiLCJWMzJpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnNiXzEyOEIsIlY2NGlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92emgsIlYzMmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92emhfMTI4QiwiVjY0aVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaCwiVjMyaVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaF8xMjhCLCJWNjRpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHlidXMsIlYxNmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHlidXNfMTI4QiwiVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWJ1c19hY2MsIlYxNmlWMTZpVjE2aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5YnVzX2FjY18xMjhCLCJWMzJpVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWJ1c19kdiwiVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWJ1c19kdl8xMjhCLCJWNjRpVjY0aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5YnVzX2R2X2FjYywiVjMyaVYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHlidXNfZHZfYWNjXzEyOEIsIlY2NGlWNjRpVjY0aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aGIsIlYxNmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloYl8xMjhCLCJWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aGJfYWNjLCJWMTZpVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhiX2FjY18xMjhCLCJWMzJpVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhiX2R2LCJWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aGJfZHZfMTI4QiwiVjY0aVY2NGlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhiX2R2X2FjYywiVjMyaVYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloYl9kdl9hY2NfMTI4QiwiVjY0aVY2NGlWNjRpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHlodnNhdCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWh2c2F0XzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHlodnNhdF9hY2MsIlYxNmlWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aHZzYXRfYWNjXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aHNhdCwiVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhzYXRfMTI4QiwiVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhzYXRfYWNjLCJWMTZpVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhzYXRfYWNjXzEyOEIsIlYzMmlWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aGlzYXQsIlYxNmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloaXNhdF8xMjhCLCJWMzJpVjY0aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aGlzYXRfYWNjLCJWMTZpVjE2aVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhpc2F0X2FjY18xMjhCLCJWMzJpVjMyaVY2NGlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhzdXNhdCwiVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhzdXNhdF8xMjhCLCJWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aHN1c2F0X2FjYywiVjE2aVYxNmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloc3VzYXRfYWNjXzEyOEIsIlYzMmlWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aHN1aXNhdCwiVjE2aVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhzdWlzYXRfMTI4QiwiVjMyaVY2NGlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhzdWlzYXRfYWNjLCJWMTZpVjE2aVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhzdWlzYXRfYWNjXzEyOEIsIlYzMmlWMzJpVjY0aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z0bXB5YiwiVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92dG1weWJfMTI4QiwiVjY0aVY2NGlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92dG1weWJfYWNjLCJWMzJpVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92dG1weWJfYWNjXzEyOEIsIlY2NGlWNjRpVjY0aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z0bXB5YnVzLCJWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z0bXB5YnVzXzEyOEIsIlY2NGlWNjRpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnRtcHlidXNfYWNjLCJWMzJpVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92dG1weWJ1c19hY2NfMTI4QiwiVjY0aVY2NGlWNjRpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnRtcHloYiwiVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92dG1weWhiXzEyOEIsIlY2NGlWNjRpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnRtcHloYl9hY2MsIlYzMmlWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z0bXB5aGJfYWNjXzEyOEIsIlY2NGlWNjRpVjY0aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5dWIsIlYxNmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHl1Yl8xMjhCLCJWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5dWJfYWNjLCJWMTZpVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXViX2FjY18xMjhCLCJWMzJpVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXVidiwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXVidl8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5dWJ2X2FjYywiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHl1YnZfYWNjXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5YnYsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidl8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5YnZfYWNjLCJWMTZpVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ2X2FjY18xMjhCLCJWMzJpVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXViaSwiVjMyaVYzMmlpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHl1YmlfMTI4QiwiVjY0aVY2NGlpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHl1YmlfYWNjLCJWMzJpVjMyaVYzMmlpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHl1YmlfYWNjXzEyOEIsIlY2NGlWNjRpVjY0aWlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1cywiVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1c18xMjhCLCJWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5YnVzX2FjYywiVjE2aVYxNmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidXNfYWNjXzEyOEIsIlYzMmlWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5YnVzaSwiVjMyaVYzMmlpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidXNpXzEyOEIsIlY2NGlWNjRpaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5YnVzaV9hY2MsIlYzMmlWMzJpVjMyaWlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1c2lfYWNjXzEyOEIsIlY2NGlWNjRpVjY0aWlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1c3YsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidXN2XzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidXN2X2FjYywiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidXN2X2FjY18xMjhCLCJWMzJpVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZHNhZHVoLCJWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zkc2FkdWhfMTI4QiwiVjY0aVY2NGlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZHNhZHVoX2FjYywiVjMyaVYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmRzYWR1aF9hY2NfMTI4QiwiVjY0aVY2NGlWNjRpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJzYWR1YmksIlYzMmlWMzJpaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyc2FkdWJpXzEyOEIsIlY2NGlWNjRpaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyc2FkdWJpX2FjYywiVjMyaVYzMmlWMzJpaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyc2FkdWJpX2FjY18xMjhCLCJWNjRpVjY0aVY2NGlpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzcncsIlYxNmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzcndfMTI4QiwiVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNsdywiVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNsd18xMjhCLCJWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zsc3J3LCJWMTZpVjE2aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zsc3J3XzEyOEIsIlYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzcnd2LCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J3dl8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc2x3diwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNsd3ZfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHNyd3YsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmxzcnd2XzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzcmgsIlYxNmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzcmhfMTI4QiwiVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNsaCwiVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNsaF8xMjhCLCJWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zsc3JoLCJWMTZpVjE2aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zsc3JoXzEyOEIsIlYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzcmh2LCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3Jodl8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc2xodiwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNsaHZfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHNyaHYsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmxzcmh2XzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzcndoLCJWMTZpVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyd2hfMTI4QiwiVjMyaVYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzcndoc2F0LCJWMTZpVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyd2hzYXRfMTI4QiwiVjMyaVYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzcndocm5kc2F0LCJWMTZpVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyd2hybmRzYXRfMTI4QiwiVjMyaVYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzcnd1aHNhdCwiVjE2aVYxNmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzcnd1aHNhdF8xMjhCLCJWMzJpVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmR3aCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmR3aF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyb3VuZHd1aCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmR3dWhfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyaHVic2F0LCJWMTZpVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyaHVic2F0XzEyOEIsIlYzMmlWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3JodWJybmRzYXQsIlYxNmlWMTZpVjE2aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3JodWJybmRzYXRfMTI4QiwiVjMyaVYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzcmhicm5kc2F0LCJWMTZpVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyaGJybmRzYXRfMTI4QiwiVjMyaVYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJvdW5kaGIsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJvdW5kaGJfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmRodWIsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJvdW5kaHViXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzbHdfYWNjLCJWMTZpVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNsd19hY2NfMTI4QiwiVjMyaVYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzcndfYWNjLCJWMTZpVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyd19hY2NfMTI4QiwiVjMyaVYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGIsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGJfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViYiwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViYl8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRiX2R2LCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRiX2R2XzEyOEIsIlY2NGlWNjRpVjY0aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmJfZHYsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmJfZHZfMTI4QiwiVjY0aVY2NGlWNjRpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJoLCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJoXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGhfZHYsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGhfZHZfMTI4QiwiVjY0aVY2NGlWNjRpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViaF9kdiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViaF9kdl8xMjhCLCJWNjRpVjY0aVY2NGkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR3LCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR3XzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YncsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YndfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkd19kdiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkd19kdl8xMjhCLCJWNjRpVjY0aVY2NGkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ3X2R2LCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ3X2R2XzEyOEIsIlY2NGlWNjRpVjY0aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHVic2F0LCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1YnNhdF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1YnNhdF9kdiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWJzYXRfZHZfMTI4QiwiVjY0aVY2NGlWNjRpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidWJzYXQsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnVic2F0XzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnVic2F0X2R2LCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1YnNhdF9kdl8xMjhCLCJWNjRpVjY0aVY2NGkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1aHNhdCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWhzYXRfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWhzYXRfZHYsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHVoc2F0X2R2XzEyOEIsIlY2NGlWNjRpVjY0aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnVoc2F0LCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1aHNhdF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1aHNhdF9kdiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidWhzYXRfZHZfMTI4QiwiVjY0aVY2NGlWNjRpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaHNhdCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaHNhdF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRoc2F0X2R2LCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRoc2F0X2R2XzEyOEIsIlY2NGlWNjRpVjY0aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmhzYXQsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmhzYXRfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViaHNhdF9kdiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViaHNhdF9kdl8xMjhCLCJWNjRpVjY0aVY2NGkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR3c2F0LCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR3c2F0XzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHdzYXRfZHYsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHdzYXRfZHZfMTI4QiwiVjY0aVY2NGlWNjRpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3Vid3NhdCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3Vid3NhdF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ3c2F0X2R2LCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ3c2F0X2R2XzEyOEIsIlY2NGlWNjRpVjY0aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z3ViLCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhdmd1Yl8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhdmd1YnJuZCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZndWJybmRfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZndWgsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z3VoXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z3Vocm5kLCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhdmd1aHJuZF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhdmdoLCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhdmdoXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z2hybmQsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z2hybmRfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bmF2Z2gsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm5hdmdoXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z3csIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z3dfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZnd3JuZCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZnd3JuZF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZuYXZndywiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bmF2Z3dfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzZGlmZnViLCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnNkaWZmdWJfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzZGlmZnVoLCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnNkaWZmdWhfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzZGlmZmgsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFic2RpZmZoXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFic2RpZmZ3LCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnNkaWZmd18xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZuYXZndWIsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm5hdmd1Yl8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1YmgsIlYzMmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHViaF8xMjhCLCJWNjRpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1YmgsIlYzMmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnViaF8xMjhCLCJWNjRpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRodywiVjMyaVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaHdfMTI4QiwiVjY0aVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViaHcsIlYzMmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1Ymh3XzEyOEIsIlY2NGlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHVodywiVjMyaVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWh3XzEyOEIsIlY2NGlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnVodywiVjMyaVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidWh3XzEyOEIsIlY2NGlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmQwLCJWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZDBfMTI4QiwiVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGJxLCJWMTZpVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkYnFfMTI4QiwiVjMyaVYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmJxLCJWMTZpVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViYnFfMTI4QiwiVjMyaVYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGJucSwiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGJucV8xMjhCLCJWMzJpVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViYm5xLCJWMTZpVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViYm5xXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRocSwiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGhxXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJocSwiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmhxXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRobnEsIlYxNmlWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRobnFfMTI4QiwiVjMyaVYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmhucSwiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmhucV8xMjhCLCJWMzJpVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkd3EsIlYxNmlWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR3cV8xMjhCLCJWMzJpVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3Vid3EsIlYxNmlWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ3cV8xMjhCLCJWMzJpVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkd25xLCJWMTZpVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkd25xXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ3bnEsIlYxNmlWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ3bnFfMTI4QiwiVjMyaVYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFic2gsIlYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzaF8xMjhCLCJWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFic2hfc2F0LCJWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFic2hfc2F0XzEyOEIsIlYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzdywiVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnN3XzEyOEIsIlYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzd19zYXQsIlYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzd19zYXRfMTI4QiwiVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlidiwiVjMyaVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5YnZfMTI4QiwiVjY0aVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5YnZfYWNjLCJWMzJpVjMyaVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5YnZfYWNjXzEyOEIsIlY2NGlWNjRpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1YnYsIlYzMmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weXVidl8xMjhCLCJWNjRpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1YnZfYWNjLCJWMzJpVjMyaVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5dWJ2X2FjY18xMjhCLCJWNjRpVjY0aVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5YnVzdiwiVjMyaVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5YnVzdl8xMjhCLCJWNjRpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlidXN2X2FjYywiVjMyaVYzMmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWJ1c3ZfYWNjXzEyOEIsIlY2NGlWNjRpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFidXN2LCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFidXN2XzEyOEIsIlY2NGlWNjRpVjY0aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1wYWJ1dXYsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1wYWJ1dXZfMTI4QiwiVjY0aVY2NGlWNjRpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aHYsIlYzMmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWh2XzEyOEIsIlY2NGlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWh2X2FjYywiVjMyaVYzMmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWh2X2FjY18xMjhCLCJWNjRpVjY0aVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5dWh2LCJWMzJpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1aHZfMTI4QiwiVjY0aVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5dWh2X2FjYywiVjMyaVYzMmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weXVodl9hY2NfMTI4QiwiVjY0aVY2NGlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWh2c3JzLCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlodnNyc18xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlodXMsIlYzMmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWh1c18xMjhCLCJWNjRpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlodXNfYWNjLCJWMzJpVjMyaVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aHVzX2FjY18xMjhCLCJWNjRpVjY0aVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aWgsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWloXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWloX2FjYywiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWloX2FjY18xMjhCLCJWMzJpVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5ZXd1aCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5ZXd1aF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlvd2gsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weW93aF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlvd2hfcm5kLCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlvd2hfcm5kXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weW93aF9zYWNjLCJWMTZpVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5b3doX3NhY2NfMTI4QiwiVjMyaVYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weW93aF9ybmRfc2FjYywiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weW93aF9ybmRfc2FjY18xMjhCLCJWMzJpVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aWVvaCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aWVvaF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpZXd1aCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aWV3dWhfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aW93aCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aW93aF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpZXdoX2FjYywiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWlld2hfYWNjXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpZXd1aF9hY2MsIlYxNmlWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpZXd1aF9hY2NfMTI4QiwiVjMyaVYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weXViLCJWMzJpVjE2aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1Yl8xMjhCLCJWNjRpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1Yl9hY2MsIlYzMmlWMzJpVjE2aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1Yl9hY2NfMTI4QiwiVjY0aVY2NGlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWJ1cywiVjMyaVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5YnVzXzEyOEIsIlY2NGlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWJ1c19hY2MsIlYzMmlWMzJpVjE2aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlidXNfYWNjXzEyOEIsIlY2NGlWNjRpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFidXMsIlYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1wYWJ1c18xMjhCLCJWNjRpVjY0aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFidXNfYWNjLCJWMzJpVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhYnVzX2FjY18xMjhCLCJWNjRpVjY0aVY2NGlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhaGIsIlYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1wYWhiXzEyOEIsIlY2NGlWNjRpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1wYWhiX2FjYywiVjMyaVYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1wYWhiX2FjY18xMjhCLCJWNjRpVjY0aVY2NGlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aCwiVjMyaVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aF8xMjhCLCJWNjRpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHloc2F0X2FjYywiVjMyaVYzMmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWhzYXRfYWNjXzEyOEIsIlY2NGlWNjRpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHloc3MsIlYxNmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWhzc18xMjhCLCJWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHloc3JzLCJWMTZpVjE2aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHloc3JzXzEyOEIsIlYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weXVoLCJWMzJpVjE2aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1aF8xMjhCLCJWNjRpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1aF9hY2MsIlYzMmlWMzJpVjE2aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1aF9hY2NfMTI4QiwiVjY0aVY2NGlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWloYiwiVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aWhiXzEyOEIsIlYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWloYl9hY2MsIlYxNmlWMTZpVjE2aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpaGJfYWNjXzEyOEIsIlYzMmlWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpd2IsIlYxNmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWl3Yl8xMjhCLCJWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpd2JfYWNjLCJWMTZpVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aXdiX2FjY18xMjhCLCJWMzJpVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aXdoLCJWMTZpVjE2aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpd2hfMTI4QiwiVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aXdoX2FjYywiVjE2aVYxNmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWl3aF9hY2NfMTI4QiwiVjMyaVYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFuZCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm9yLCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zvcl8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z4b3IsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnhvcl8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zub3QsIlYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bm90XzEyOEIsIlYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kcXJ0LCJWMTZpVjE2aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmRxcnRfMTI4QiwiVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kcXJ0X2FjYywiVjE2aVYxNmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFuZHFydF9hY2NfMTI4QiwiVjMyaVYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFuZHZydCwiVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kdnJ0XzEyOEIsIlYzMmlWMzJpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFuZHZydF9hY2MsIlYxNmlWMTZpVjE2aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmR2cnRfYWNjXzEyOEIsIlYzMmlWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHcsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmd0d18xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHdfYW5kLCJWMTZpVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R3X2FuZF8xMjhCLCJWMzJpVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R3X29yLCJWMTZpVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R3X29yXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHdfeG9yLCJWMTZpVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R3X3hvcl8xMjhCLCJWMzJpVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXF3LCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcXdfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXF3X2FuZCwiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmVxd19hbmRfMTI4QiwiVjMyaVYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmVxd19vciwiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmVxd19vcl8xMjhCLCJWMzJpVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXF3X3hvciwiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmVxd194b3JfMTI4QiwiVjMyaVYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmd0aCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3RoXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmd0aF9hbmQsIlYxNmlWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndGhfYW5kXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndGhfb3IsIlYxNmlWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndGhfb3JfMTI4QiwiVjMyaVYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmd0aF94b3IsIlYxNmlWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndGhfeG9yXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWgsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmVxaF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWhfYW5kLCJWMTZpVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXFoX2FuZF8xMjhCLCJWMzJpVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXFoX29yLCJWMTZpVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXFoX29yXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWhfeG9yLCJWMTZpVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXFoX3hvcl8xMjhCLCJWMzJpVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3RiLCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndGJfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3RiX2FuZCwiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmd0Yl9hbmRfMTI4QiwiVjMyaVYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmd0Yl9vciwiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmd0Yl9vcl8xMjhCLCJWMzJpVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3RiX3hvciwiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmd0Yl94b3JfMTI4QiwiVjMyaVYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmVxYiwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXFiXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmVxYl9hbmQsIlYxNmlWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWJfYW5kXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWJfb3IsIlYxNmlWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWJfb3JfMTI4QiwiVjMyaVYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmVxYl94b3IsIlYxNmlWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWJfeG9yXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHV3LCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHV3XzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmd0dXdfYW5kLCJWMTZpVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1d19hbmRfMTI4QiwiVjMyaVYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmd0dXdfb3IsIlYxNmlWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHV3X29yXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHV3X3hvciwiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmd0dXdfeG9yXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHVoLCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHVoXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmd0dWhfYW5kLCJWMTZpVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1aF9hbmRfMTI4QiwiVjMyaVYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmd0dWhfb3IsIlYxNmlWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHVoX29yXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHVoX3hvciwiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmd0dWhfeG9yXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHViLCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHViXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmd0dWJfYW5kLCJWMTZpVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1Yl9hbmRfMTI4QiwiVjMyaVYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmd0dWJfb3IsIlYxNmlWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHViX29yXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHViX3hvciwiVjE2aVYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmd0dWJfeG9yXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ByZWRfb3IsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF9vcl8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ByZWRfYW5kLCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ByZWRfYW5kXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF9ub3QsIlYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl9wcmVkX25vdF8xMjhCLCJWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF94b3IsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF94b3JfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl9wcmVkX2FuZF9uLCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ByZWRfYW5kX25fMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl9wcmVkX29yX24sIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF9vcl9uXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF9zY2FsYXIyLCJWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF9zY2FsYXIyXzEyOEIsIlYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXV4LCJWMTZpVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXV4XzEyOEIsIlYzMmlWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zzd2FwLCJWMzJpVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3dhcF8xMjhCLCJWNjRpVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWF4dWIsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1heHViXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1pbnViLCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtaW51Yl8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtYXh1aCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWF4dWhfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWludWgsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1pbnVoXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1heGgsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1heGhfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWluaCwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWluaF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtYXh3LCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtYXh3XzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1pbncsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1pbndfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2F0aHViLCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzYXRodWJfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2F0d2gsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnNhdHdoXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZmZWIsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZmZWJfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2h1ZmZvYiwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2h1ZmZvYl8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaHVmZWgsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZlaF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaHVmb2gsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZvaF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaHVmZnZkZCwiVjMyaVYxNmlWMTZpaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZmdmRkXzEyOEIsIlY2NGlWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkZWFsdmRkLCJWMzJpVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZGVhbHZkZF8xMjhCLCJWNjRpVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2h1Zm9laCwiVjMyaVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2h1Zm9laF8xMjhCLCJWNjRpVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaHVmb2ViLCJWMzJpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaHVmb2ViXzEyOEIsIlY2NGlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmRlYWxoLCJWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmRlYWxoXzEyOEIsIlYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZGVhbGIsIlYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZGVhbGJfMTI4QiwiVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkZWFsYjR3LCJWMTZpVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkZWFsYjR3XzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZmaCwiVjE2aVYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaHVmZmhfMTI4QiwiVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaHVmZmIsIlYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2h1ZmZiXzEyOEIsIlYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl9leHRyYWN0dywiaVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl9leHRyYWN0d18xMjhCLCJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZpbnNlcnR3ciwiVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92aW5zZXJ0d3JfMTI4QiwiVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl9sdnNwbGF0dywiVjE2aWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X2x2c3BsYXR3XzEyOEIsIlYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNzaWduLCJWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzc2lnbl8xMjhCLCJWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmNvbWJpbmUsIlYzMmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmNvbWJpbmVfMTI4QiwiVjY0aVYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZGVsdGEsIlYxNmlWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmRlbHRhXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJkZWx0YSwiVjE2aVYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cmRlbHRhXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmNsMHcsIlYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92Y2wwd18xMjhCLCJWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmNsMGgsIlYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92Y2wwaF8xMjhCLCJWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm5vcm1hbXR3LCJWMTZpVjE2aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm5vcm1hbXR3XzEyOEIsIlYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bm9ybWFtdGgsIlYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bm9ybWFtdGhfMTI4QiwiVjMyaVYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zwb3Bjb3VudGgsIlYxNmlWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cG9wY291bnRoXzEyOEIsIlYzMmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dnZiLCJWMTZpVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dnZiXzEyOEIsIlYzMmlWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2dmJfb3JhY2MsIlYxNmlWMTZpVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dnZiX29yYWNjXzEyOEIsIlYzMmlWMzJpVjMyaVYzMmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dndoLCJWMzJpVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dndoXzEyOEIsIlY2NGlWMzJpVjMyaWkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2d2hfb3JhY2MsIlYzMmlWMzJpVjE2aVYxNmlpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dndoX29yYWNjXzEyOEIsIlY2NGlWNjRpVjMyaVYzMmlpIiwidjo2MDoiKQorCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X2hpLCJWMTZpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfbG8sIlYxNmlWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl9oaV8xMjhCLCJWMzJpVjY0aSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfbG9fMTI4QiwiVjMyaVY2NGkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3NpZ25wLCJWMzJpVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzc2lnbnBfMTI4QiwiVjY0aVY2NGkiLCJ2OjYwOiIpCisKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdlMzMmJfcXByZWRfYWksInZWMTZpdipWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92UzMyYl9ucXByZWRfYWksInZWMTZpdipWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92UzMyYl9udF9xcHJlZF9haSwidlYxNml2KlYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZTMzJiX250X25xcHJlZF9haSwidlYxNml2KlYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZTMzJiX3FwcmVkX2FpXzEyOEIsInZWMzJpdipWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92UzMyYl9ucXByZWRfYWlfMTI4QiwidlYzMml2KlYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZTMzJiX250X3FwcmVkX2FpXzEyOEIsInZWMzJpdipWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92UzMyYl9udF9ucXByZWRfYWlfMTI4QiwidlYzMml2KlYzMmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtYXNrZWRzdG9yZXEsInZWMTZpdipWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWFza2Vkc3RvcmVucSwidlYxNml2KlYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtYXNrZWRzdG9yZW50cSwidlYxNml2KlYxNmkiLCJ2OjYwOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtYXNrZWRzdG9yZW50bnEsInZWMTZpdipWMTZpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWFza2Vkc3RvcmVxXzEyOEIsInZWMzJpdipWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWFza2Vkc3RvcmVucV8xMjhCLCJ2VjMyaXYqVjMyaSIsInY6NjA6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1hc2tlZHN0b3JlbnRxXzEyOEIsInZWMzJpdipWMzJpIiwidjo2MDoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWFza2Vkc3RvcmVudG5xXzEyOEIsInZWMzJpdipWMzJpIiwidjo2MDoiKQorCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX002X3ZhYnNkaWZmYiwiTExpTExpTExpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9NNl92YWJzZGlmZnViLCJMTGlMTGlMTGkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0E2X3ZtaW51Yl9SZFAsIkxMaUxMaUxMaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzZfdnNwbGF0cmJwLCJMTGlpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9TNl92dHJ1bmVoYl9wcHAsIkxMaUxMaUxMaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fUzZfdnRydW5vaGJfcHBwLCJMTGlMTGlMTGkiLCJ2OjYyOiIpCisKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmxzcmIsIlYxNmlWMTZpaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmxzcmJfMTI4QiwiVjMyaVYzMmlpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyd3Vocm5kc2F0LCJWMTZpVjE2aVYxNmlpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyd3Vocm5kc2F0XzEyOEIsIlYzMmlWMzJpVjMyaWkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J1d3Vocm5kc2F0LCJWMTZpVjE2aVYxNmlpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNydXd1aHJuZHNhdF8xMjhCLCJWMzJpVjMyaVYzMmlpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyaGJzYXQsIlYxNmlWMTZpVjE2aWkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3JoYnNhdF8xMjhCLCJWMzJpVjMyaVYzMmlpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmR1d3VoLCJWMTZpVjE2aVYxNmkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyb3VuZHV3dWhfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmR1aHViLCJWMTZpVjE2aVYxNmkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyb3VuZHVodWJfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdXdzYXQsIlYxNmlWMTZpVjE2aSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHV3c2F0XzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHV3c2F0X2R2LCJWMzJpVjMyaVYzMmkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1d3NhdF9kdl8xMjhCLCJWNjRpVjY0aVY2NGkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1d3NhdCwiVjE2aVYxNmlWMTZpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidXdzYXRfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidXdzYXRfZHYsIlYzMmlWMzJpVjMyaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnV3c2F0X2R2XzEyOEIsIlY2NGlWNjRpVjY0aSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGJzYXQsIlYxNmlWMTZpVjE2aSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGJzYXRfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkYnNhdF9kdiwiVjMyaVYzMmlWMzJpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkYnNhdF9kdl8xMjhCLCJWNjRpVjY0aVY2NGkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJic2F0LCJWMTZpVjE2aVYxNmkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJic2F0XzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmJzYXRfZHYsIlYzMmlWMzJpVjMyaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmJzYXRfZHZfMTI4QiwiVjY0aVY2NGlWNjRpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWJ1YmJfc2F0LCJWMTZpVjE2aVYxNmkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1YnViYl9zYXRfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidWJ1YmJfc2F0LCJWMTZpVjE2aVYxNmkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1YnViYl9zYXRfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaHdfYWNjLCJWMzJpVjMyaVYxNmlWMTZpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaHdfYWNjXzEyOEIsIlY2NGlWNjRpVjMyaVYzMmkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1aHdfYWNjLCJWMzJpVjMyaVYxNmlWMTZpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWh3X2FjY18xMjhCLCJWNjRpVjY0aVYzMmlWMzJpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWJoX2FjYywiVjMyaVYzMmlWMTZpVjE2aSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHViaF9hY2NfMTI4QiwiVjY0aVY2NGlWMzJpVjMyaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWV3dWhfNjQsIlYzMmlWMTZpVjE2aSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWV3dWhfNjRfMTI4QiwiVjY0aVYzMmlWMzJpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5b3doXzY0X2FjYywiVjMyaVYzMmlWMTZpVjE2aSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weW93aF82NF9hY2NfMTI4QiwiVjY0aVY2NGlWMzJpVjMyaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1wYXVoYiwiVjMyaVYzMmlpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhdWhiXzEyOEIsIlY2NGlWNjRpaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1wYXVoYl9hY2MsIlYzMmlWMzJpVjMyaWkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGF1aGJfYWNjXzEyOEIsIlY2NGlWNjRpVjY0aWkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpd3ViLCJWMTZpVjE2aWkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpd3ViXzEyOEIsIlYzMmlWMzJpaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weWl3dWJfYWNjLCJWMTZpVjE2aVYxNmlpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aXd1Yl9hY2NfMTI4QiwiVjMyaVYzMmlWMzJpaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFuZG5xcnQsIlYxNmlWMTZpaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFuZG5xcnRfMTI4QiwiVjMyaVYzMmlpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kbnFydF9hY2MsIlYxNmlWMTZpVjE2aWkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmRucXJ0X2FjY18xMjhCLCJWMzJpVjMyaVYzMmlpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kdnF2LCJWMTZpVjE2aVYxNmkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmR2cXZfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kdm5xdiwiVjE2aVYxNmlWMTZpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kdm5xdl8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ByZWRfc2NhbGFyMnYyLCJWMTZpaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF9zY2FsYXIydjJfMTI4QiwiVjMyaWkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3NodWZmZXF3LCJWMTZpVjE2aVYxNmkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3NodWZmZXF3XzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfc2h1ZmZlcWgsIlYxNmlWMTZpVjE2aSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfc2h1ZmZlcWhfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWF4YiwiVjE2aVYxNmlWMTZpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWF4Yl8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtaW5iLCJWMTZpVjE2aVYxNmkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtaW5iXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnNhdHV3dWgsIlYxNmlWMTZpVjE2aSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnNhdHV3dWhfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl9sdnNwbGF0aCwiVjE2aWkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X2x2c3BsYXRoXzEyOEIsIlYzMmlpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl9sdnNwbGF0YiwiVjE2aWkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X2x2c3BsYXRiXzEyOEIsIlYzMmlpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkY2xidywiVjE2aVYxNmlWMTZpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkY2xid18xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRjbGJoLCJWMTZpVjE2aVYxNmkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRjbGJoXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmx1dHZ2YmksIlYxNmlWMTZpVjE2aWkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2dmJpXzEyOEIsIlYzMmlWMzJpVjMyaWkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2dmJfb3JhY2NpLCJWMTZpVjE2aVYxNmlWMTZpaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmx1dHZ2Yl9vcmFjY2lfMTI4QiwiVjMyaVYzMmlWMzJpVjMyaWkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2d2hpLCJWMzJpVjE2aVYxNmlpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dndoaV8xMjhCLCJWNjRpVjMyaVYzMmlpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dndoX29yYWNjaSwiVjMyaVYzMmlWMTZpVjE2aWkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2d2hfb3JhY2NpXzEyOEIsIlY2NGlWNjRpVjMyaVYzMmlpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dnZiX25tLCJWMTZpVjE2aVYxNmlpIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dnZiX25tXzEyOEIsIlYzMmlWMzJpVjMyaWkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2d2hfbm0sIlYzMmlWMTZpVjE2aWkiLCJ2OjYyOiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2d2hfbm1fMTI4QiwiVjY0aVYzMmlWMzJpaSIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGNhcnJ5LCJWMTZpVjE2aVYxNml2KiIsInY6NjI6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGNhcnJ5XzEyOEIsIlYzMmlWMzJpVjMyaXYqIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViY2FycnksIlYxNmlWMTZpVjE2aXYqIiwidjo2MjoiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViY2FycnlfMTI4QiwiVjMyaVYzMmlWMzJpdioiLCJ2OjYyOiIpCisKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fQTZfdmNtcGJlcV9ub3RhbnksImlMTGlMTGkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX0E2X3ZjbXBiZXFfbm90YW55XzEyOEIsImlMTGlMTGkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5dWJfcnR0LCJWMzJpVjE2aUxMaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHl1Yl9ydHRfMTI4QiwiVjY0aVYzMmlMTGkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5dWJfcnR0X2FjYywiVjMyaVYzMmlWMTZpTExpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXViX3J0dF9hY2NfMTI4QiwiVjY0aVY2NGlWMzJpTExpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1Yl9ydHQsIlYzMmlWMTZpTExpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1Yl9ydHRfMTI4QiwiVjY0aVYzMmlMTGkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5YnViX3J0dF9hY2MsIlYzMmlWMzJpVjE2aUxMaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidWJfcnR0X2FjY18xMjhCLCJWNjRpVjY0aVYzMmlMTGkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J1d3Voc2F0LCJWMTZpVjE2aVYxNmlpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNydXd1aHNhdF8xMjhCLCJWMzJpVjMyaVYzMmlpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNydWh1YnNhdCwiVjE2aVYxNmlWMTZpaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzcnVodWJzYXRfMTI4QiwiVjMyaVYzMmlWMzJpaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzcnVodWJybmRzYXQsIlYxNmlWMTZpVjE2aWkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J1aHVicm5kc2F0XzEyOEIsIlYzMmlWMzJpVjMyaWkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc2xoX2FjYywiVjE2aVYxNmlWMTZpaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzbGhfYWNjXzEyOEIsIlYzMmlWMzJpVjMyaWkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3JoX2FjYywiVjE2aVYxNmlWMTZpaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmFzcmhfYWNjXzEyOEIsIlYzMmlWMzJpVjMyaWkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhdmd1dywiVjE2aVYxNmlWMTZpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZndXdfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZndXdybmQsIlYxNmlWMTZpVjE2aSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z3V3cm5kXzEyOEIsIlYzMmlWMzJpVjMyaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z2IsIlYxNmlWMTZpVjE2aSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z2JfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZnYnJuZCwiVjE2aVYxNmlWMTZpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZnYnJuZF8xMjhCLCJWMzJpVjMyaVYzMmkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZuYXZnYiwiVjE2aVYxNmlWMTZpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bmF2Z2JfMTI4QiwiVjMyaVYzMmlWMzJpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzYiwiVjE2aVYxNmkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnNiXzEyOEIsIlYzMmlWMzJpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzYl9zYXQsIlYxNmlWMTZpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzYl9zYXRfMTI4QiwiVjMyaVYzMmkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFidXUsIlYzMmlWMzJpaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1wYWJ1dV8xMjhCLCJWNjRpVjY0aWkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFidXVfYWNjLCJWMzJpVjMyaVYzMmlpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhYnV1X2FjY18xMjhCLCJWNjRpVjY0aVY2NGlpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aF9hY2MsIlYzMmlWMzJpVjE2aWkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHloX2FjY18xMjhCLCJWNjRpVjY0aVYzMmlpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhaGhzYXQsIlYxNmlWMTZpVjE2aUxMaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1wYWhoc2F0XzEyOEIsIlYzMmlWMzJpVjMyaUxMaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1wYXVodWhzYXQsIlYxNmlWMTZpVjE2aUxMaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1wYXVodWhzYXRfMTI4QiwiVjMyaVYzMmlWMzJpTExpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBzdWh1aHNhdCwiVjE2aVYxNmlWMTZpTExpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBzdWh1aHNhdF8xMjhCLCJWMzJpVjMyaVYzMmlMTGkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXQ0LCJWMTZpVjE2aUxMaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmx1dDRfMTI4QiwiVjMyaVYzMmlMTGkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1aGUsIlYxNmlWMTZpaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdm1weXVoZV8xMjhCLCJWMzJpVjMyaWkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1aGVfYWNjLCJWMTZpVjE2aVYxNmlpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5dWhlX2FjY18xMjhCLCJWMzJpVjMyaVYzMmlpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z2F0aGVybXcsInZ2KmlpVjE2aSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmdhdGhlcm13XzEyOEIsInZ2KmlpVjMyaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmdhdGhlcm1oLCJ2dippaVYxNmkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZnYXRoZXJtaF8xMjhCLCJ2dippaVYzMmkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZnYXRoZXJtaHcsInZ2KmlpVjMyaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmdhdGhlcm1od18xMjhCLCJ2dippaVY2NGkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZnYXRoZXJtd3EsInZ2KlYxNmlpaVYxNmkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZnYXRoZXJtd3FfMTI4QiwidnYqVjMyaWlpVjMyaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmdhdGhlcm1ocSwidnYqVjE2aWlpVjE2aSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmdhdGhlcm1ocV8xMjhCLCJ2dipWMzJpaWlWMzJpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z2F0aGVybWh3cSwidnYqVjE2aWlpVjMyaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdmdhdGhlcm1od3FfMTI4QiwidnYqVjMyaWlpVjY0aSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnNjYXR0ZXJtdywidmlpVjE2aVYxNmkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybXdfMTI4QiwidmlpVjMyaVYzMmkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybWgsInZpaVYxNmlWMTZpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm1oXzEyOEIsInZpaVYzMmlWMzJpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm13X2FkZCwidmlpVjE2aVYxNmkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybXdfYWRkXzEyOEIsInZpaVYzMmlWMzJpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm1oX2FkZCwidmlpVjE2aVYxNmkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybWhfYWRkXzEyOEIsInZpaVYzMmlWMzJpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm13cSwidlYxNmlpaVYxNmlWMTZpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm13cV8xMjhCLCJ2VjMyaWlpVjMyaVYzMmkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybWhxLCJ2VjE2aWlpVjE2aVYxNmkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybWhxXzEyOEIsInZWMzJpaWlWMzJpVjMyaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnNjYXR0ZXJtaHcsInZpaVYzMmlWMTZpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm1od18xMjhCLCJ2aWlWNjRpVjMyaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnNjYXR0ZXJtaHdxLCJ2VjE2aWlpVjMyaVYxNmkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybWh3cV8xMjhCLCJ2VjMyaWlpVjY0aVYzMmkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybWh3X2FkZCwidmlpVjMyaVYxNmkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybWh3X2FkZF8xMjhCLCJ2aWlWNjRpVjMyaSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnByZWZpeHFiLCJWMTZpVjE2aSIsInY6NjU6IikKK0JVSUxUSU4oX19idWlsdGluX0hFWEFHT05fVjZfdnByZWZpeHFiXzEyOEIsIlYzMmlWMzJpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cHJlZml4cWgsIlYxNmlWMTZpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92cHJlZml4cWhfMTI4QiwiVjMyaVYzMmkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZwcmVmaXhxdywiVjE2aVYxNmkiLCJ2OjY1OiIpCitCVUlMVElOKF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZwcmVmaXhxd18xMjhCLCJWMzJpVjMyaSIsInY6NjU6IikKKworQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZGQwLCJWMzJpIiwidjo2NToiKQorQlVJTFRJTihfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZGQwXzEyOEIsIlY2NGkiLCJ2OjY1OiIpCisKKworI3VuZGVmIEJVSUxUSU4KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zTGU2NC5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc0xlNjQuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMjg2MDYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc0xlNjQuZGVmCkBAIC0wLDAgKzEsMTkgQEAKKy8vPT0tIEJ1aWx0aW5zTGU2NC5kZWYgLSBMZTY0IEJ1aWx0aW4gZnVuY3Rpb24gZGF0YWJhc2UgLS0tLS0tLS0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIExlNjQtc3BlY2lmaWMgYnVpbHRpbiBmdW5jdGlvbiBkYXRhYmFzZS4gIFVzZXJzIG9mIHRoaXMKKy8vIGZpbGUgbXVzdCBkZWZpbmUgdGhlIEJVSUxUSU4gbWFjcm8gdG8gbWFrZSB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBUaGUgZm9ybWF0IG9mIHRoaXMgZGF0YWJhc2UgbWF0Y2hlcyBjbGFuZy9CYXNpYy9CdWlsdGlucy5kZWYuCisKK0JVSUxUSU4oX19jbGVhcl9jYWNoZSwgInZ2KnYqIiwgImkiKQorCisjdW5kZWYgQlVJTFRJTgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNNaXBzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zTWlwcy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyMTdmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zTWlwcy5kZWYKQEAgLTAsMCArMSw5MDAgQEAKKy8vPT09LS0gQnVpbHRpbnNNaXBzLmRlZiAtIE1pcHMgQnVpbHRpbiBmdW5jdGlvbiBkYXRhYmFzZSAtLS0tLS0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIE1JUFMtc3BlY2lmaWMgYnVpbHRpbiBmdW5jdGlvbiBkYXRhYmFzZS4gVXNlcnMgb2YKKy8vIHRoaXMgZmlsZSBtdXN0IGRlZmluZSB0aGUgQlVJTFRJTiBtYWNybyB0byBtYWtlIHVzZSBvZiB0aGlzIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFRoZSBmb3JtYXQgb2YgdGhpcyBkYXRhYmFzZSBtYXRjaGVzIGNsYW5nL0Jhc2ljL0J1aWx0aW5zLmRlZi4KKworLy8gTUlQUyBEU1AgUmV2IDEKKworLy8gQWRkL3N1YnRyYWN0IHdpdGggb3B0aW9uYWwgc2F0dXJhdGlvbgorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19hZGR1X3FiLCAiVjRTY1Y0U2NWNFNjIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19hZGR1X3NfcWIsICJWNFNjVjRTY1Y0U2MiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3N1YnVfcWIsICJWNFNjVjRTY1Y0U2MiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3N1YnVfc19xYiwgIlY0U2NWNFNjVjRTYyIsICJuIikKKworQlVJTFRJTihfX2J1aWx0aW5fbWlwc19hZGRxX3BoLCAiVjJzVjJzVjJzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19hZGRxX3NfcGgsICJWMnNWMnNWMnMiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3N1YnFfcGgsICJWMnNWMnNWMnMiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3N1YnFfc19waCwgIlYyc1Yyc1YycyIsICJuIikKKworQlVJTFRJTihfX2J1aWx0aW5fbWlwc19tYWRkLCAiTExpTExpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19tYWRkdSwgIkxMaUxMaVVpVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19tc3ViLCAiTExpTExpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19tc3VidSwgIkxMaUxMaVVpVWkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2FkZHFfc193LCAiaWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19zdWJxX3NfdywgImlpaSIsICJuIikKKworQlVJTFRJTihfX2J1aWx0aW5fbWlwc19hZGRzYywgImlpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfYWRkd2MsICJpaWkiLCAibiIpCisKK0JVSUxUSU4oX19idWlsdGluX21pcHNfbW9kc3ViLCAiaWlpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbWlwc19yYWRkdV93X3FiLCAiaVY0U2MiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2Fic3Ffc19waCwgIlYyc1YycyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfYWJzcV9zX3csICJpaSIsICJuIikKKworQlVJTFRJTihfX2J1aWx0aW5fbWlwc19wcmVjcnFfcWJfcGgsICJWNFNjVjJzVjJzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfcHJlY3JxdV9zX3FiX3BoLCAiVjRTY1Yyc1YycyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfcHJlY3JxX3BoX3csICJWMnNpaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3ByZWNycV9yc19waF93LCAiVjJzaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3ByZWNlcV93X3BobCwgImlWMnMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19wcmVjZXFfd19waHIsICJpVjJzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfcHJlY2VxdV9waF9xYmwsICJWMnNWNFNjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfcHJlY2VxdV9waF9xYnIsICJWMnNWNFNjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfcHJlY2VxdV9waF9xYmxhLCAiVjJzVjRTYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3ByZWNlcXVfcGhfcWJyYSwgIlYyc1Y0U2MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19wcmVjZXVfcGhfcWJsLCAiVjJzVjRTYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3ByZWNldV9waF9xYnIsICJWMnNWNFNjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfcHJlY2V1X3BoX3FibGEsICJWMnNWNFNjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfcHJlY2V1X3BoX3FicmEsICJWMnNWNFNjIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbWlwc19zaGxsX3FiLCAiVjRTY1Y0U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19zaHJsX3FiLCAiVjRTY1Y0U2NpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfc2hsbF9waCwgIlYyc1Yyc2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3NobGxfc19waCwgIlYyc1Yyc2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3NocmFfcGgsICJWMnNWMnNpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfc2hyYV9yX3BoLCAiVjJzVjJzaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3NobGxfc193LCAiaWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19zaHJhX3JfdywgImlpaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3NoaWxvLCAiTExpTExpaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21pcHNfbXVsZXVfc19waF9xYmwsICJWMnNWNFNjVjJzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19tdWxldV9zX3BoX3FiciwgIlYyc1Y0U2NWMnMiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX211bHFfcnNfcGgsICJWMnNWMnNWMnMiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX211bGVxX3Nfd19waGwsICJpVjJzVjJzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19tdWxlcV9zX3dfcGhyLCAiaVYyc1YycyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfbXVsc2FxX3Nfd19waCwgIkxMaUxMaVYyc1YycyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfbWFxX3Nfd19waGwsICJMTGlMTGlWMnNWMnMiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX21hcV9zX3dfcGhyLCAiTExpTExpVjJzVjJzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19tYXFfc2Ffd19waGwsICJMTGlMTGlWMnNWMnMiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX21hcV9zYV93X3BociwgIkxMaUxMaVYyc1YycyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfbXVsdCwgIkxMaWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfbXVsdHUsICJMTGlVaVVpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbWlwc19kcGF1X2hfcWJsLCAiTExpTExpVjRTY1Y0U2MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19kcGF1X2hfcWJyLCAiTExpTExpVjRTY1Y0U2MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19kcHN1X2hfcWJsLCAiTExpTExpVjRTY1Y0U2MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19kcHN1X2hfcWJyLCAiTExpTExpVjRTY1Y0U2MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19kcGFxX3Nfd19waCwgIkxMaUxMaVYyc1YycyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfZHBzcV9zX3dfcGgsICJMTGlMTGlWMnNWMnMiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2RwYXFfc2FfbF93LCAiTExpTExpaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2Rwc3Ffc2FfbF93LCAiTExpTExpaWkiLCAibiIpCisKK0JVSUxUSU4oX19idWlsdGluX21pcHNfY21wdV9lcV9xYiwgInZWNFNjVjRTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfY21wdV9sdF9xYiwgInZWNFNjVjRTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfY21wdV9sZV9xYiwgInZWNFNjVjRTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfY21wZ3VfZXFfcWIsICJpVjRTY1Y0U2MiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2NtcGd1X2x0X3FiLCAiaVY0U2NWNFNjIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19jbXBndV9sZV9xYiwgImlWNFNjVjRTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfY21wX2VxX3BoLCAidlYyc1YycyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfY21wX2x0X3BoLCAidlYyc1YycyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfY21wX2xlX3BoLCAidlYyc1YycyIsICJuIikKKworQlVJTFRJTihfX2J1aWx0aW5fbWlwc19leHRyX3NfaCwgImlMTGlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19leHRyX3csICJpTExpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfZXh0cl9yc193LCAiaUxMaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2V4dHJfcl93LCAiaUxMaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2V4dHAsICJpTExpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfZXh0cGRwLCAiaUxMaWkiLCAibiIpCisKK0JVSUxUSU4oX19idWlsdGluX21pcHNfd3Jkc3AsICJ2aUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19yZGRzcCwgImlJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfaW5zdiwgImlpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfYml0cmV2LCAiaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19wYWNrcmxfcGgsICJWMnNWMnNWMnMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19yZXBsX3FiLCAiVjRTY2kiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19yZXBsX3BoLCAiVjJzaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3BpY2tfcWIsICJWNFNjVjRTY1Y0U2MiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3BpY2tfcGgsICJWMnNWMnNWMnMiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX210aGxpcCwgIkxMaUxMaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2Jwb3NnZTMyLCAiaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfbGJ1eCwgIml2KmkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2xoeCwgIml2KmkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2x3eCwgIml2KmkiLCAibiIpCisKKy8vIE1JUFMgRFNQIFJldiAyCisKK0JVSUxUSU4oX19idWlsdGluX21pcHNfYWJzcV9zX3FiLCAiVjRTY1Y0U2MiLCAibiIpCisKK0JVSUxUSU4oX19idWlsdGluX21pcHNfYWRkcWhfcGgsICJWMnNWMnNWMnMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19hZGRxaF9yX3BoLCAiVjJzVjJzVjJzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfYWRkcWhfdywgImlpaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2FkZHFoX3JfdywgImlpaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21pcHNfYWRkdV9waCwgIlYyc1Yyc1YycyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfYWRkdV9zX3BoLCAiVjJzVjJzVjJzIiwgIm4iKQorCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2FkZHVoX3FiLCAiVjRTY1Y0U2NWNFNjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfYWRkdWhfcl9xYiwgIlY0U2NWNFNjVjRTYyIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21pcHNfYXBwZW5kLCAiaWlpSWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19iYWxpZ24sICJpaWlJaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21pcHNfY21wZ2R1X2VxX3FiLCAiaVY0U2NWNFNjIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19jbXBnZHVfbHRfcWIsICJpVjRTY1Y0U2MiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2NtcGdkdV9sZV9xYiwgImlWNFNjVjRTYyIsICJuIikKKworQlVJTFRJTihfX2J1aWx0aW5fbWlwc19kcGFfd19waCwgIkxMaUxMaVYyc1YycyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2Rwc193X3BoLCAiTExpTExpVjJzVjJzIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbWlwc19kcGFxeF9zX3dfcGgsICJMTGlMTGlWMnNWMnMiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2RwYXF4X3NhX3dfcGgsICJMTGlMTGlWMnNWMnMiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2RwYXhfd19waCwgIkxMaUxMaVYyc1YycyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2Rwc3hfd19waCwgIkxMaUxMaVYyc1YycyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX2Rwc3F4X3Nfd19waCwgIkxMaUxMaVYyc1YycyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfZHBzcXhfc2Ffd19waCwgIkxMaUxMaVYyc1YycyIsICJuIikKKworQlVJTFRJTihfX2J1aWx0aW5fbWlwc19tdWxfcGgsICJWMnNWMnNWMnMiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX211bF9zX3BoLCAiVjJzVjJzVjJzIiwgIm4iKQorCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX211bHFfcnNfdywgImlpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfbXVscV9zX3BoLCAiVjJzVjJzVjJzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19tdWxxX3NfdywgImlpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfbXVsc2Ffd19waCwgIkxMaUxMaVYyc1YycyIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21pcHNfcHJlY3JfcWJfcGgsICJWNFNjVjJzVjJzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19wcmVjcl9zcmFfcGhfdywgIlYyc2lpSWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19wcmVjcl9zcmFfcl9waF93LCAiVjJzaWlJaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21pcHNfcHJlcGVuZCwgImlpaUlpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbWlwc19zaHJhX3FiLCAiVjRTY1Y0U2NpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfc2hyYV9yX3FiLCAiVjRTY1Y0U2NpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfc2hybF9waCwgIlYyc1Yyc2kiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3N1YnFoX3BoLCAiVjJzVjJzVjJzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21pcHNfc3VicWhfcl9waCwgIlYyc1Yyc1YycyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3N1YnFoX3csICJpaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbWlwc19zdWJxaF9yX3csICJpaWkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3N1YnVfcGgsICJWMnNWMnNWMnMiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3N1YnVfc19waCwgIlYyc1Yyc1YycyIsICJuIikKKworQlVJTFRJTihfX2J1aWx0aW5fbWlwc19zdWJ1aF9xYiwgIlY0U2NWNFNjVjRTYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9taXBzX3N1YnVoX3JfcWIsICJWNFNjVjRTY1Y0U2MiLCAibmMiKQorCisvLyBNSVBTIE1TQQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYWRkX2FfYiwgIlYxNlNjVjE2U2NWMTZTYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYWRkX2FfaCwgIlY4U3NWOFNzVjhTcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYWRkX2FfdywgIlY0U2lWNFNpVjRTaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYWRkX2FfZCwgIlYyU0xMaVYyU0xMaVYyU0xMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9hZGRzX2FfYiwgIlYxNlNjVjE2U2NWMTZTYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYWRkc19hX2gsICJWOFNzVjhTc1Y4U3MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2FkZHNfYV93LCAiVjRTaVY0U2lWNFNpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9hZGRzX2FfZCwgIlYyU0xMaVYyU0xMaVYyU0xMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9hZGRzX3NfYiwgIlYxNlNjVjE2U2NWMTZTYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYWRkc19zX2gsICJWOFNzVjhTc1Y4U3MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2FkZHNfc193LCAiVjRTaVY0U2lWNFNpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9hZGRzX3NfZCwgIlYyU0xMaVYyU0xMaVYyU0xMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9hZGRzX3VfYiwgIlYxNlVjVjE2VWNWMTZVYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYWRkc191X2gsICJWOFVzVjhVc1Y4VXMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2FkZHNfdV93LCAiVjRVaVY0VWlWNFVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9hZGRzX3VfZCwgIlYyVUxMaVYyVUxMaVYyVUxMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9hZGR2X2IsICJWMTZjVjE2Y1YxNmMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2FkZHZfaCwgIlY4c1Y4c1Y4cyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYWRkdl93LCAiVjRpVjRpVjRpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9hZGR2X2QsICJWMkxMaVYyTExpVjJMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYWRkdmlfYiwgIlYxNmNWMTZjSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9hZGR2aV9oLCAiVjhzVjhzSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9hZGR2aV93LCAiVjRpVjRpSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9hZGR2aV9kLCAiVjJMTGlWMkxMaUlVaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9hbmRfdiwgIlYxNlVjVjE2VWNWMTZVYyIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9hbmRpX2IsICJWMTZVY1YxNlVjSVVpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2FzdWJfc19iLCAiVjE2U2NWMTZTY1YxNlNjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9hc3ViX3NfaCwgIlY4U3NWOFNzVjhTcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYXN1Yl9zX3csICJWNFNpVjRTaVY0U2kiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2FzdWJfc19kLCAiVjJTTExpVjJTTExpVjJTTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2FzdWJfdV9iLCAiVjE2VWNWMTZVY1YxNlVjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9hc3ViX3VfaCwgIlY4VXNWOFVzVjhVcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYXN1Yl91X3csICJWNFVpVjRVaVY0VWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2FzdWJfdV9kLCAiVjJVTExpVjJVTExpVjJVTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2F2ZV9zX2IsICJWMTZTY1YxNlNjVjE2U2MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2F2ZV9zX2gsICJWOFNzVjhTc1Y4U3MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2F2ZV9zX3csICJWNFNpVjRTaVY0U2kiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2F2ZV9zX2QsICJWMlNMTGlWMlNMTGlWMlNMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYXZlX3VfYiwgIlYxNlVjVjE2VWNWMTZVYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYXZlX3VfaCwgIlY4VXNWOFVzVjhVcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYXZlX3VfdywgIlY0VWlWNFVpVjRVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYXZlX3VfZCwgIlYyVUxMaVYyVUxMaVYyVUxMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9hdmVyX3NfYiwgIlYxNlNjVjE2U2NWMTZTYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYXZlcl9zX2gsICJWOFNzVjhTc1Y4U3MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2F2ZXJfc193LCAiVjRTaVY0U2lWNFNpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9hdmVyX3NfZCwgIlYyU0xMaVYyU0xMaVYyU0xMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9hdmVyX3VfYiwgIlYxNlVjVjE2VWNWMTZVYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYXZlcl91X2gsICJWOFVzVjhVc1Y4VXMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2F2ZXJfdV93LCAiVjRVaVY0VWlWNFVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9hdmVyX3VfZCwgIlYyVUxMaVYyVUxMaVYyVUxMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9iY2xyX2IsICJWMTZVY1YxNlVjVjE2VWMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JjbHJfaCwgIlY4VXNWOFVzVjhVcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYmNscl93LCAiVjRVaVY0VWlWNFVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9iY2xyX2QsICJWMlVMTGlWMlVMTGlWMlVMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYmNscmlfYiwgIlYxNlVjVjE2VWNJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JjbHJpX2gsICJWOFVzVjhVc0lVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYmNscmlfdywgIlY0VWlWNFVpSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9iY2xyaV9kLCAiVjJVTExpVjJVTExpSVVpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JpbnNsX2IsICJWMTZVY1YxNlVjVjE2VWNWMTZVYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYmluc2xfaCwgIlY4VXNWOFVzVjhVc1Y4VXMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JpbnNsX3csICJWNFVpVjRVaVY0VWlWNFVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9iaW5zbF9kLCAiVjJVTExpVjJVTExpVjJVTExpVjJVTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JpbnNsaV9iLCAiVjE2VWNWMTZVY1YxNlVjSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9iaW5zbGlfaCwgIlY4VXNWOFVzVjhVc0lVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYmluc2xpX3csICJWNFVpVjRVaVY0VWlJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JpbnNsaV9kLCAiVjJVTExpVjJVTExpVjJVTExpSVVpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JpbnNyX2IsICJWMTZVY1YxNlVjVjE2VWNWMTZVYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYmluc3JfaCwgIlY4VXNWOFVzVjhVc1Y4VXMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JpbnNyX3csICJWNFVpVjRVaVY0VWlWNFVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9iaW5zcl9kLCAiVjJVTExpVjJVTExpVjJVTExpVjJVTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JpbnNyaV9iLCAiVjE2VWNWMTZVY1YxNlVjSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9iaW5zcmlfaCwgIlY4VXNWOFVzVjhVc0lVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYmluc3JpX3csICJWNFVpVjRVaVY0VWlJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JpbnNyaV9kLCAiVjJVTExpVjJVTExpVjJVTExpSVVpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JtbnpfdiwgIlYxNlVjVjE2VWNWMTZVY1YxNlVjIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JtbnppX2IsICJWMTZVY1YxNlVjVjE2VWNJVWkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYm16X3YsICJWMTZVY1YxNlVjVjE2VWNWMTZVYyIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9ibXppX2IsICJWMTZVY1YxNlVjVjE2VWNJVWkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYm5lZ19iLCAiVjE2VWNWMTZVY1YxNlVjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9ibmVnX2gsICJWOFVzVjhVc1Y4VXMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JuZWdfdywgIlY0VWlWNFVpVjRVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYm5lZ19kLCAiVjJVTExpVjJVTExpVjJVTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JuZWdpX2IsICJWMTZVY1YxNlVjSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9ibmVnaV9oLCAiVjhVc1Y4VXNJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JuZWdpX3csICJWNFVpVjRVaUlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYm5lZ2lfZCwgIlYyVUxMaVYyVUxMaUlVaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9ibnpfYiwgImlWMTZVYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYm56X2gsICJpVjhVcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYm56X3csICJpVjRVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYm56X2QsICJpVjJVTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2Juel92LCAiaVYxNlVjIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JzZWxfdiwgIlYxNlVjVjE2VWNWMTZVY1YxNlVjIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JzZWxpX2IsICJWMTZVY1YxNlVjVjE2VWNJVWkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYnNldF9iLCAiVjE2VWNWMTZVY1YxNlVjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9ic2V0X2gsICJWOFVzVjhVc1Y4VXMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JzZXRfdywgIlY0VWlWNFVpVjRVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYnNldF9kLCAiVjJVTExpVjJVTExpVjJVTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JzZXRpX2IsICJWMTZVY1YxNlVjSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9ic2V0aV9oLCAiVjhVc1Y4VXNJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2JzZXRpX3csICJWNFVpVjRVaUlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYnNldGlfZCwgIlYyVUxMaVYyVUxMaUlVaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9iel9iLCAiaVYxNlVjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9iel9oLCAiaVY4VXMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2J6X3csICJpVjRVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYnpfZCwgImlWMlVMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfYnpfdiwgImlWMTZVYyIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9jZXFfYiwgIlYxNlNjVjE2U2NWMTZTYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfY2VxX2gsICJWOFNzVjhTc1Y4U3MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NlcV93LCAiVjRTaVY0U2lWNFNpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9jZXFfZCwgIlYyU0xMaVYyU0xMaVYyU0xMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9jZXFpX2IsICJWMTZTY1YxNlNjSVNpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9jZXFpX2gsICJWOFNzVjhTc0lTaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfY2VxaV93LCAiVjRTaVY0U2lJU2kiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NlcWlfZCwgIlYyU0xMaVYyU0xMaUlTaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9jZmNtc2EsICJpSWkiLCAibiIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9jbGVfc19iLCAiVjE2U2NWMTZTY1YxNlNjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9jbGVfc19oLCAiVjhTc1Y4U3NWOFNzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9jbGVfc193LCAiVjRTaVY0U2lWNFNpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9jbGVfc19kLCAiVjJTTExpVjJTTExpVjJTTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NsZV91X2IsICJWMTZTY1YxNlVjVjE2VWMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NsZV91X2gsICJWOFNzVjhVc1Y4VXMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NsZV91X3csICJWNFNpVjRVaVY0VWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NsZV91X2QsICJWMlNMTGlWMlVMTGlWMlVMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfY2xlaV9zX2IsICJWMTZTY1YxNlNjSVNpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9jbGVpX3NfaCwgIlY4U3NWOFNzSVNpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9jbGVpX3NfdywgIlY0U2lWNFNpSVNpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9jbGVpX3NfZCwgIlYyU0xMaVYyU0xMaUlTaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9jbGVpX3VfYiwgIlYxNlNjVjE2VWNJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NsZWlfdV9oLCAiVjhTc1Y4VXNJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NsZWlfdV93LCAiVjRTaVY0VWlJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NsZWlfdV9kLCAiVjJTTExpVjJVTExpSVVpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NsdF9zX2IsICJWMTZTY1YxNlNjVjE2U2MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NsdF9zX2gsICJWOFNzVjhTc1Y4U3MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NsdF9zX3csICJWNFNpVjRTaVY0U2kiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NsdF9zX2QsICJWMlNMTGlWMlNMTGlWMlNMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfY2x0X3VfYiwgIlYxNlNjVjE2VWNWMTZVYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfY2x0X3VfaCwgIlY4U3NWOFVzVjhVcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfY2x0X3VfdywgIlY0U2lWNFVpVjRVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfY2x0X3VfZCwgIlYyU0xMaVYyVUxMaVYyVUxMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9jbHRpX3NfYiwgIlYxNlNjVjE2U2NJU2kiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NsdGlfc19oLCAiVjhTc1Y4U3NJU2kiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NsdGlfc193LCAiVjRTaVY0U2lJU2kiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NsdGlfc19kLCAiVjJTTExpVjJTTExpSVNpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NsdGlfdV9iLCAiVjE2U2NWMTZVY0lVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfY2x0aV91X2gsICJWOFNzVjhVc0lVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfY2x0aV91X3csICJWNFNpVjRVaUlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfY2x0aV91X2QsICJWMlNMTGlWMlVMTGlJVWkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfY29weV9zX2IsICJpVjE2U2NJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NvcHlfc19oLCAiaVY4U3NJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NvcHlfc193LCAiaVY0U2lJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NvcHlfc19kLCAiTExpVjJTTExpSVVpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2NvcHlfdV9iLCAiaVYxNlVjSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9jb3B5X3VfaCwgImlWOFVzSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9jb3B5X3VfdywgImlWNFVpSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9jb3B5X3VfZCwgIkxMaVYyVUxMaUlVaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9jdGNtc2EsICJ2SWlpIiwgIm4iKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZGl2X3NfYiwgIlYxNlNjVjE2U2NWMTZTYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZGl2X3NfaCwgIlY4U3NWOFNzVjhTcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZGl2X3NfdywgIlY0U2lWNFNpVjRTaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZGl2X3NfZCwgIlYyU0xMaVYyU0xMaVYyU0xMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9kaXZfdV9iLCAiVjE2VWNWMTZVY1YxNlVjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9kaXZfdV9oLCAiVjhVc1Y4VXNWOFVzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9kaXZfdV93LCAiVjRVaVY0VWlWNFVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9kaXZfdV9kLCAiVjJVTExpVjJVTExpVjJVTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2RvdHBfc19oLCAiVjhTc1YxNlNjVjE2U2MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2RvdHBfc193LCAiVjRTaVY4U3NWOFNzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9kb3RwX3NfZCwgIlYyU0xMaVY0U2lWNFNpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2RvdHBfdV9oLCAiVjhVc1YxNlVjVjE2VWMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2RvdHBfdV93LCAiVjRVaVY4VXNWOFVzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9kb3RwX3VfZCwgIlYyVUxMaVY0VWlWNFVpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2RwYWRkX3NfaCwgIlY4U3NWOFNzVjE2U2NWMTZTYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZHBhZGRfc193LCAiVjRTaVY0U2lWOFNzVjhTcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZHBhZGRfc19kLCAiVjJTTExpVjJTTExpVjRTaVY0U2kiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZHBhZGRfdV9oLCAiVjhVc1Y4VXNWMTZVY1YxNlVjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9kcGFkZF91X3csICJWNFVpVjRVaVY4VXNWOFVzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9kcGFkZF91X2QsICJWMlVMTGlWMlVMTGlWNFVpVjRVaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9kcHN1Yl9zX2gsICJWOFNzVjhTc1YxNlNjVjE2U2MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2Rwc3ViX3NfdywgIlY0U2lWNFNpVjhTc1Y4U3MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2Rwc3ViX3NfZCwgIlYyU0xMaVYyU0xMaVY0U2lWNFNpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2Rwc3ViX3VfaCwgIlY4VXNWOFVzVjE2VWNWMTZVYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZHBzdWJfdV93LCAiVjRVaVY0VWlWOFVzVjhVcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZHBzdWJfdV9kLCAiVjJVTExpVjJVTExpVjRVaVY0VWkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZmFkZF93LCAiVjRmVjRmVjRmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9mYWRkX2QsICJWMmRWMmRWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZmNhZl93LCAiVjRpVjRmVjRmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9mY2FmX2QsICJWMkxMaVYyZFYyZCIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9mY2VxX3csICJWNGlWNGZWNGYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZjZXFfZCwgIlYyTExpVjJkVjJkIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZjbGFzc193LCAiVjRpVjRmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9mY2xhc3NfZCwgIlYyTExpVjJkIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZjbGVfdywgIlY0aVY0ZlY0ZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZmNsZV9kLCAiVjJMTGlWMmRWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZmNsdF93LCAiVjRpVjRmVjRmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9mY2x0X2QsICJWMkxMaVYyZFYyZCIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9mY25lX3csICJWNGlWNGZWNGYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZjbmVfZCwgIlYyTExpVjJkVjJkIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2Zjb3JfdywgIlY0aVY0ZlY0ZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZmNvcl9kLCAiVjJMTGlWMmRWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZmN1ZXFfdywgIlY0aVY0ZlY0ZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZmN1ZXFfZCwgIlYyTExpVjJkVjJkIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZjdWxlX3csICJWNGlWNGZWNGYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZjdWxlX2QsICJWMkxMaVYyZFYyZCIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9mY3VsdF93LCAiVjRpVjRmVjRmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9mY3VsdF9kLCAiVjJMTGlWMmRWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZmN1bl93LCAiVjRpVjRmVjRmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9mY3VuX2QsICJWMkxMaVYyZFYyZCIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9mY3VuZV93LCAiVjRpVjRmVjRmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9mY3VuZV9kLCAiVjJMTGlWMmRWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZmRpdl93LCAiVjRmVjRmVjRmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9mZGl2X2QsICJWMmRWMmRWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZmV4ZG9faCwgIlY4aFY0ZlY0ZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZmV4ZG9fdywgIlY0ZlYyZFYyZCIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9mZXhwMl93LCAiVjRmVjRmVjRpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9mZXhwMl9kLCAiVjJkVjJkVjJMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZmV4dXBsX3csICJWNGZWOGgiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZleHVwbF9kLCAiVjJkVjRmIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZleHVwcl93LCAiVjRmVjhoIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9mZXh1cHJfZCwgIlYyZFY0ZiIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9mZmludF9zX3csICJWNGZWNFNpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9mZmludF9zX2QsICJWMmRWMlNMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZmZpbnRfdV93LCAiVjRmVjRVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZmZpbnRfdV9kLCAiVjJkVjJVTExpIiwgIm5jIikKKworLy8gZmZxbCB1c2VzIGludGVnZXJzIHNpbmNlIGxvbmcgX0ZyYWN0IGlzIG5vdCBpbXBsZW1lbnRlZAorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZmcWxfdywgIlY0ZlY4U3MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZmcWxfZCwgIlYyZFY0U2kiLCAibmMiKQorCisvLyBmZnFyIHVzZXMgaW50ZWdlcnMgc2luY2UgbG9uZyBfRnJhY3QgaXMgbm90IGltcGxlbWVudGVkCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZmZxcl93LCAiVjRmVjhTcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZmZxcl9kLCAiVjJkVjRTaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9maWxsX2IsICJWMTZTY2kiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZpbGxfaCwgIlY4U3NpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9maWxsX3csICJWNFNpaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZmlsbF9kLCAiVjJTTExpTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2Zsb2cyX3csICJWNGZWNGYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2Zsb2cyX2QsICJWMmRWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZm1hZGRfdywgIlY0ZlY0ZlY0ZlY0ZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZm1hZGRfZCwgIlYyZFYyZFYyZFYyZCIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9mbWF4X3csICJWNGZWNGZWNGYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZtYXhfZCwgIlYyZFYyZFYyZCIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9mbWF4X2FfdywgIlY0ZlY0ZlY0ZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZm1heF9hX2QsICJWMmRWMmRWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZm1pbl93LCAiVjRmVjRmVjRmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9mbWluX2QsICJWMmRWMmRWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZm1pbl9hX3csICJWNGZWNGZWNGYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZtaW5fYV9kLCAiVjJkVjJkVjJkIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2Ztc3ViX3csICJWNGZWNGZWNGZWNGYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2Ztc3ViX2QsICJWMmRWMmRWMmRWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZm11bF93LCAiVjRmVjRmVjRmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9mbXVsX2QsICJWMmRWMmRWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZnJpbnRfdywgIlY0ZlY0ZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZnJpbnRfZCwgIlYyZFYyZCIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9mcmNwX3csICJWNGZWNGYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZyY3BfZCwgIlYyZFYyZCIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9mcnNxcnRfdywgIlY0ZlY0ZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZnJzcXJ0X2QsICJWMmRWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZnNhZl93LCAiVjRpVjRmVjRmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9mc2FmX2QsICJWMkxMaVYyZFYyZCIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9mc2VxX3csICJWNGlWNGZWNGYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZzZXFfZCwgIlYyTExpVjJkVjJkIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZzbGVfdywgIlY0aVY0ZlY0ZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZnNsZV9kLCAiVjJMTGlWMmRWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZnNsdF93LCAiVjRpVjRmVjRmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9mc2x0X2QsICJWMkxMaVYyZFYyZCIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9mc25lX3csICJWNGlWNGZWNGYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZzbmVfZCwgIlYyTExpVjJkVjJkIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2Zzb3JfdywgIlY0aVY0ZlY0ZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZnNvcl9kLCAiVjJMTGlWMmRWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZnNxcnRfdywgIlY0ZlY0ZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZnNxcnRfZCwgIlYyZFYyZCIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9mc3ViX3csICJWNGZWNGZWNGYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZzdWJfZCwgIlYyZFYyZFYyZCIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9mc3VlcV93LCAiVjRpVjRmVjRmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9mc3VlcV9kLCAiVjJMTGlWMmRWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZnN1bGVfdywgIlY0aVY0ZlY0ZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZnN1bGVfZCwgIlYyTExpVjJkVjJkIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZzdWx0X3csICJWNGlWNGZWNGYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZzdWx0X2QsICJWMkxMaVYyZFYyZCIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9mc3VuX3csICJWNGlWNGZWNGYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZzdW5fZCwgIlYyTExpVjJkVjJkIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZzdW5lX3csICJWNGlWNGZWNGYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2ZzdW5lX2QsICJWMkxMaVYyZFYyZCIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9mdGludF9zX3csICJWNFNpVjRmIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9mdGludF9zX2QsICJWMlNMTGlWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZnRpbnRfdV93LCAiVjRVaVY0ZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZnRpbnRfdV9kLCAiVjJVTExpVjJkIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2Z0cV9oLCAiVjRVaVY0ZlY0ZiIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZnRxX3csICJWMlVMTGlWMmRWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZnRydW5jX3NfdywgIlY0U2lWNGYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2Z0cnVuY19zX2QsICJWMlNMTGlWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfZnRydW5jX3VfdywgIlY0VWlWNGYiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2Z0cnVuY191X2QsICJWMlVMTGlWMmQiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaGFkZF9zX2gsICJWOFNzVjE2U2NWMTZTYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaGFkZF9zX3csICJWNFNpVjhTc1Y4U3MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2hhZGRfc19kLCAiVjJTTExpVjRTaVY0U2kiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaGFkZF91X2gsICJWOFVzVjE2VWNWMTZVYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaGFkZF91X3csICJWNFVpVjhVc1Y4VXMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2hhZGRfdV9kLCAiVjJVTExpVjRVaVY0VWkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaHN1Yl9zX2gsICJWOFNzVjE2U2NWMTZTYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaHN1Yl9zX3csICJWNFNpVjhTc1Y4U3MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2hzdWJfc19kLCAiVjJTTExpVjRTaVY0U2kiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaHN1Yl91X2gsICJWOFVzVjE2VWNWMTZVYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaHN1Yl91X3csICJWNFVpVjhVc1Y4VXMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2hzdWJfdV9kLCAiVjJVTExpVjRVaVY0VWkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaWx2ZXZfYiwgIlYxNmNWMTZjVjE2YyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaWx2ZXZfaCwgIlY4c1Y4c1Y4cyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaWx2ZXZfdywgIlY0aVY0aVY0aSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaWx2ZXZfZCwgIlYyTExpVjJMTGlWMkxMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9pbHZsX2IsICJWMTZjVjE2Y1YxNmMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2lsdmxfaCwgIlY4c1Y4c1Y4cyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaWx2bF93LCAiVjRpVjRpVjRpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9pbHZsX2QsICJWMkxMaVYyTExpVjJMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaWx2b2RfYiwgIlYxNmNWMTZjVjE2YyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaWx2b2RfaCwgIlY4c1Y4c1Y4cyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaWx2b2RfdywgIlY0aVY0aVY0aSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaWx2b2RfZCwgIlYyTExpVjJMTGlWMkxMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9pbHZyX2IsICJWMTZjVjE2Y1YxNmMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2lsdnJfaCwgIlY4c1Y4c1Y4cyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaWx2cl93LCAiVjRpVjRpVjRpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9pbHZyX2QsICJWMkxMaVYyTExpVjJMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaW5zZXJ0X2IsICJWMTZTY1YxNlNjSVVpaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfaW5zZXJ0X2gsICJWOFNzVjhTc0lVaWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2luc2VydF93LCAiVjRTaVY0U2lJVWlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9pbnNlcnRfZCwgIlYyU0xMaVYyU0xMaUlVaUxMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9pbnN2ZV9iLCAiVjE2U2NWMTZTY0lVaVYxNlNjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9pbnN2ZV9oLCAiVjhTc1Y4U3NJVWlWOFNzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9pbnN2ZV93LCAiVjRTaVY0U2lJVWlWNFNpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9pbnN2ZV9kLCAiVjJTTExpVjJTTExpSVVpVjJTTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX2xkX2IsICJWMTZTY3YqSWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX2xkX2gsICJWOFNzdipJaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbGRfdywgIlY0U2l2KklpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9sZF9kLCAiVjJTTExpdipJaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9sZGlfYiwgIlYxNmNJaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbGRpX2gsICJWOHNJaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbGRpX3csICJWNGlJaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbGRpX2QsICJWMkxMaUlpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX21hZGRfcV9oLCAiVjhTc1Y4U3NWOFNzVjhTcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbWFkZF9xX3csICJWNFNpVjRTaVY0U2lWNFNpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX21hZGRyX3FfaCwgIlY4U3NWOFNzVjhTc1Y4U3MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX21hZGRyX3FfdywgIlY0U2lWNFNpVjRTaVY0U2kiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbWFkZHZfYiwgIlYxNlNjVjE2U2NWMTZTY1YxNlNjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9tYWRkdl9oLCAiVjhTc1Y4U3NWOFNzVjhTcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbWFkZHZfdywgIlY0U2lWNFNpVjRTaVY0U2kiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX21hZGR2X2QsICJWMlNMTGlWMlNMTGlWMlNMTGlWMlNMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbWF4X2FfYiwgIlYxNlNjVjE2U2NWMTZTYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbWF4X2FfaCwgIlY4U3NWOFNzVjhTcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbWF4X2FfdywgIlY0U2lWNFNpVjRTaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbWF4X2FfZCwgIlYyU0xMaVYyU0xMaVYyU0xMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9tYXhfc19iLCAiVjE2U2NWMTZTY1YxNlNjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9tYXhfc19oLCAiVjhTc1Y4U3NWOFNzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9tYXhfc193LCAiVjRTaVY0U2lWNFNpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9tYXhfc19kLCAiVjJTTExpVjJTTExpVjJTTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX21heF91X2IsICJWMTZVY1YxNlVjVjE2VWMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX21heF91X2gsICJWOFVzVjhVc1Y4VXMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX21heF91X3csICJWNFVpVjRVaVY0VWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX21heF91X2QsICJWMlVMTGlWMlVMTGlWMlVMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbWF4aV9zX2IsICJWMTZTY1YxNlNjSWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX21heGlfc19oLCAiVjhTc1Y4U3NJaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbWF4aV9zX3csICJWNFNpVjRTaUlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9tYXhpX3NfZCwgIlYyU0xMaVYyU0xMaUlpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX21heGlfdV9iLCAiVjE2VWNWMTZVY0lpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9tYXhpX3VfaCwgIlY4VXNWOFVzSWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX21heGlfdV93LCAiVjRVaVY0VWlJaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbWF4aV91X2QsICJWMlVMTGlWMlVMTGlJaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9taW5fYV9iLCAiVjE2U2NWMTZTY1YxNlNjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9taW5fYV9oLCAiVjhTc1Y4U3NWOFNzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9taW5fYV93LCAiVjRTaVY0U2lWNFNpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9taW5fYV9kLCAiVjJTTExpVjJTTExpVjJTTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX21pbl9zX2IsICJWMTZTY1YxNlNjVjE2U2MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX21pbl9zX2gsICJWOFNzVjhTc1Y4U3MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX21pbl9zX3csICJWNFNpVjRTaVY0U2kiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX21pbl9zX2QsICJWMlNMTGlWMlNMTGlWMlNMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbWluX3VfYiwgIlYxNlVjVjE2VWNWMTZVYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbWluX3VfaCwgIlY4VXNWOFVzVjhVcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbWluX3VfdywgIlY0VWlWNFVpVjRVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbWluX3VfZCwgIlYyVUxMaVYyVUxMaVYyVUxMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9taW5pX3NfYiwgIlYxNlNjVjE2U2NJaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbWluaV9zX2gsICJWOFNzVjhTc0lpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9taW5pX3NfdywgIlY0U2lWNFNpSWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX21pbmlfc19kLCAiVjJTTExpVjJTTExpSWkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbWluaV91X2IsICJWMTZVY1YxNlVjSWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX21pbmlfdV9oLCAiVjhVc1Y4VXNJaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbWluaV91X3csICJWNFVpVjRVaUlpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9taW5pX3VfZCwgIlYyVUxMaVYyVUxMaUlpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX21vZF9zX2IsICJWMTZTY1YxNlNjVjE2U2MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX21vZF9zX2gsICJWOFNzVjhTc1Y4U3MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX21vZF9zX3csICJWNFNpVjRTaVY0U2kiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX21vZF9zX2QsICJWMlNMTGlWMlNMTGlWMlNMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbW9kX3VfYiwgIlYxNlVjVjE2VWNWMTZVYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbW9kX3VfaCwgIlY4VXNWOFVzVjhVcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbW9kX3VfdywgIlY0VWlWNFVpVjRVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbW9kX3VfZCwgIlYyVUxMaVYyVUxMaVYyVUxMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9tb3ZlX3YsICJWMTZTY1YxNlNjIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX21zdWJfcV9oLCAiVjhTc1Y4U3NWOFNzVjhTcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbXN1Yl9xX3csICJWNFNpVjRTaVY0U2lWNFNpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX21zdWJyX3FfaCwgIlY4U3NWOFNzVjhTc1Y4U3MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX21zdWJyX3FfdywgIlY0U2lWNFNpVjRTaVY0U2kiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbXN1YnZfYiwgIlYxNlNjVjE2U2NWMTZTY1YxNlNjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9tc3Vidl9oLCAiVjhTc1Y4U3NWOFNzVjhTcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbXN1YnZfdywgIlY0U2lWNFNpVjRTaVY0U2kiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX21zdWJ2X2QsICJWMlNMTGlWMlNMTGlWMlNMTGlWMlNMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbXVsX3FfaCwgIlY4U3NWOFNzVjhTcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbXVsX3FfdywgIlY0U2lWNFNpVjRTaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9tdWxyX3FfaCwgIlY4U3NWOFNzVjhTcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbXVscl9xX3csICJWNFNpVjRTaVY0U2kiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbXVsdl9iLCAiVjE2U2NWMTZTY1YxNlNjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9tdWx2X2gsICJWOFNzVjhTc1Y4U3MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX211bHZfdywgIlY0U2lWNFNpVjRTaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbXVsdl9kLCAiVjJTTExpVjJTTExpVjJTTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX25sb2NfYiwgIlYxNlNjVjE2U2MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX25sb2NfaCwgIlY4U3NWOFNzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9ubG9jX3csICJWNFNpVjRTaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfbmxvY19kLCAiVjJTTExpVjJTTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX25semNfYiwgIlYxNlNjVjE2U2MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX25semNfaCwgIlY4U3NWOFNzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9ubHpjX3csICJWNFNpVjRTaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffbmx6Y19kLCAiVjJTTExpVjJTTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX25vcl92LCAiVjE2VWNWMTZVY1YxNlVjIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX25vcmlfYiwgIlYxNlVjVjE2Y0lVaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9vcl92LCAiVjE2VWNWMTZVY1YxNlVjIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX29yaV9iLCAiVjE2VWNWMTZVY0lVaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9wY2tldl9iLCAiVjE2Y1YxNmNWMTZjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9wY2tldl9oLCAiVjhzVjhzVjhzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9wY2tldl93LCAiVjRpVjRpVjRpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9wY2tldl9kLCAiVjJMTGlWMkxMaVYyTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX3Bja29kX2IsICJWMTZjVjE2Y1YxNmMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3Bja29kX2gsICJWOHNWOHNWOHMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3Bja29kX3csICJWNGlWNGlWNGkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3Bja29kX2QsICJWMkxMaVYyTExpVjJMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfcGNudF9iLCAiVjE2U2NWMTZTYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfcGNudF9oLCAiVjhTc1Y4U3MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3BjbnRfdywgIlY0U2lWNFNpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9wY250X2QsICJWMlNMTGlWMlNMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2F0X3NfYiwgIlYxNlNjVjE2U2NJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NhdF9zX2gsICJWOFNzVjhTc0lVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2F0X3NfdywgIlY0U2lWNFNpSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zYXRfc19kLCAiVjJTTExpVjJTTExpSVVpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NhdF91X2IsICJWMTZVY1YxNlVjSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zYXRfdV9oLCAiVjhVc1Y4VXNJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NhdF91X3csICJWNFVpVjRVaUlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2F0X3VfZCwgIlYyVUxMaVYyVUxMaUlVaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9zaGZfYiwgIlYxNmNWMTZjSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zaGZfaCwgIlY4c1Y4c0lVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2hmX3csICJWNGlWNGlJVWkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2xkX2IsICJWMTZjVjE2Y1YxNmNVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2xkX2gsICJWOHNWOHNWOHNVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2xkX3csICJWNGlWNGlWNGlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2xkX2QsICJWMkxMaVYyTExpVjJMTGlVaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9zbGRpX2IsICJWMTZjVjE2Y1YxNmNJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NsZGlfaCwgIlY4c1Y4c1Y4c0lVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2xkaV93LCAiVjRpVjRpVjRpSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zbGRpX2QsICJWMkxMaVYyTExpVjJMTGlJVWkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2xsX2IsICJWMTZjVjE2Y1YxNmMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NsbF9oLCAiVjhzVjhzVjhzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zbGxfdywgIlY0aVY0aVY0aSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2xsX2QsICJWMkxMaVYyTExpVjJMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2xsaV9iLCAiVjE2Y1YxNmNJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NsbGlfaCwgIlY4c1Y4c0lVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2xsaV93LCAiVjRpVjRpSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zbGxpX2QsICJWMkxMaVYyTExpSVVpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NwbGF0X2IsICJWMTZjVjE2Y1VpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zcGxhdF9oLCAiVjhzVjhzVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NwbGF0X3csICJWNGlWNGlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3BsYXRfZCwgIlYyTExpVjJMTGlVaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9zcGxhdGlfYiwgIlYxNmNWMTZjSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zcGxhdGlfaCwgIlY4c1Y4c0lVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3BsYXRpX3csICJWNGlWNGlJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NwbGF0aV9kLCAiVjJMTGlWMkxMaUlVaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9zcmFfYiwgIlYxNmNWMTZjVjE2YyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3JhX2gsICJWOHNWOHNWOHMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NyYV93LCAiVjRpVjRpVjRpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zcmFfZCwgIlYyTExpVjJMTGlWMkxMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9zcmFpX2IsICJWMTZjVjE2Y0lVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3JhaV9oLCAiVjhzVjhzSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zcmFpX3csICJWNGlWNGlJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NyYWlfZCwgIlYyTExpVjJMTGlJVWkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3Jhcl9iLCAiVjE2Y1YxNmNWMTZjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zcmFyX2gsICJWOHNWOHNWOHMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NyYXJfdywgIlY0aVY0aVY0aSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3Jhcl9kLCAiVjJMTGlWMkxMaVYyTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NyYXJpX2IsICJWMTZjVjE2Y0lVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3JhcmlfaCwgIlY4c1Y4c0lVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3JhcmlfdywgIlY0aVY0aUlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3JhcmlfZCwgIlYyTExpVjJMTGlJVWkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3JsX2IsICJWMTZjVjE2Y1YxNmMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NybF9oLCAiVjhzVjhzVjhzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zcmxfdywgIlY0aVY0aVY0aSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3JsX2QsICJWMkxMaVYyTExpVjJMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3JsaV9iLCAiVjE2Y1YxNmNJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NybGlfaCwgIlY4c1Y4c0lVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3JsaV93LCAiVjRpVjRpSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zcmxpX2QsICJWMkxMaVYyTExpSVVpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NybHJfYiwgIlYxNmNWMTZjVjE2YyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3Jscl9oLCAiVjhzVjhzVjhzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zcmxyX3csICJWNGlWNGlWNGkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NybHJfZCwgIlYyTExpVjJMTGlWMkxMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9zcmxyaV9iLCAiVjE2Y1YxNmNJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NybHJpX2gsICJWOHNWOHNJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NybHJpX3csICJWNGlWNGlJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NybHJpX2QsICJWMkxMaVYyTExpSVVpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX3N0X2IsICJ2VjE2U2N2KklpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zdF9oLCAidlY4U3N2KklpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zdF93LCAidlY0U2l2KklpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zdF9kLCAidlYyU0xMaXYqSWkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3Vic19zX2IsICJWMTZTY1YxNlNjVjE2U2MiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3N1YnNfc19oLCAiVjhTc1Y4U3NWOFNzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zdWJzX3NfdywgIlY0U2lWNFNpVjRTaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3Vic19zX2QsICJWMlNMTGlWMlNMTGlWMlNMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3Vic191X2IsICJWMTZVY1YxNlVjVjE2VWMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3N1YnNfdV9oLCAiVjhVc1Y4VXNWOFVzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zdWJzX3VfdywgIlY0VWlWNFVpVjRVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3Vic191X2QsICJWMlVMTGlWMlVMTGlWMlVMTGkiLCAibmMiKQorCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3Vic3VzX3VfYiwgIlYxNlVjVjE2VWNWMTZTYyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3Vic3VzX3VfaCwgIlY4VXNWOFVzVjhTcyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3Vic3VzX3VfdywgIlY0VWlWNFVpVjRTaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3Vic3VzX3VfZCwgIlYyVUxMaVYyVUxMaVYyU0xMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9zdWJzdXVfc19iLCAiVjE2U2NWMTZVY1YxNlVjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zdWJzdXVfc19oLCAiVjhTc1Y4VXNWOFVzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zdWJzdXVfc193LCAiVjRTaVY0VWlWNFVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zdWJzdXVfc19kLCAiVjJTTExpVjJVTExpVjJVTExpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX3N1YnZfYiwgIlYxNmNWMTZjVjE2YyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc3Vidl9oLCAiVjhzVjhzVjhzIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zdWJ2X3csICJWNGlWNGlWNGkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3N1YnZfZCwgIlYyTExpVjJMTGlWMkxMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV9zdWJ2aV9iLCAiVjE2Y1YxNmNJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3N1YnZpX2gsICJWOHNWOHNJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3N1YnZpX3csICJWNGlWNGlJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3N1YnZpX2QsICJWMkxMaVYyTExpSVVpIiwgIm5jIikKKworQlVJTFRJTihfX2J1aWx0aW5fbXNhX3ZzaGZfYiwgIlYxNmNWMTZjVjE2Y1YxNmMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3ZzaGZfaCwgIlY4c1Y4c1Y4c1Y4cyIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2FfdnNoZl93LCAiVjRpVjRpVjRpVjRpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV92c2hmX2QsICJWMkxMaVYyTExpVjJMTGlWMkxMaSIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV94b3JfdiwgIlYxNmNWMTZjVjE2YyIsICJuYyIpCisKK0JVSUxUSU4oX19idWlsdGluX21zYV94b3JpX2IsICJWMTZjVjE2Y0lVaSIsICJuYyIpCisKKyN1bmRlZiBCVUlMVElOCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc05FT04uZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNORU9OLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDFiOTNhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNORU9OLmRlZgpAQCAtMCwwICsxLDIyIEBACisvLz09PS0tLSBCdWlsdGluc05FT04uZGVmIC0gTkVPTiBCdWlsdGluIGZ1bmN0aW9uIGRhdGFiYXNlIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBORU9OLXNwZWNpZmljIGJ1aWx0aW4gZnVuY3Rpb24gZGF0YWJhc2UuICBVc2VycyBvZgorLy8gdGhpcyBmaWxlIG11c3QgZGVmaW5lIHRoZSBCVUlMVElOIG1hY3JvIHRvIG1ha2UgdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gVGhlIGZvcm1hdCBvZiB0aGlzIGRhdGFiYXNlIG1hdGNoZXMgY2xhbmcvQmFzaWMvQnVpbHRpbnMuZGVmLgorCisjZGVmaW5lIEdFVF9ORU9OX0JVSUxUSU5TCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvYXJtX25lb24uaW5jIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL2FybV9mcDE2LmluYyIKKyN1bmRlZiBHRVRfTkVPTl9CVUlMVElOUworCisjdW5kZWYgQlVJTFRJTgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNOVlBUWC5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc05WUFRYLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmFiNzNhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNOVlBUWC5kZWYKQEAgLTAsMCArMSw3MDggQEAKKy8vPT09LS0tIEJ1aWx0aW5zUFRYLmRlZiAtIFBUWCBCdWlsdGluIGZ1bmN0aW9uIGRhdGFiYXNlIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUFRYLXNwZWNpZmljIGJ1aWx0aW4gZnVuY3Rpb24gZGF0YWJhc2UuICBVc2VycyBvZgorLy8gdGhpcyBmaWxlIG11c3QgZGVmaW5lIHRoZSBCVUlMVElOIG1hY3JvIHRvIG1ha2UgdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gVGhlIGZvcm1hdCBvZiB0aGlzIGRhdGFiYXNlIG1hdGNoZXMgY2xhbmcvQmFzaWMvQnVpbHRpbnMuZGVmLgorCisjaWYgZGVmaW5lZChCVUlMVElOKSAmJiAhZGVmaW5lZChUQVJHRVRfQlVJTFRJTikKKyMgICBkZWZpbmUgVEFSR0VUX0JVSUxUSU4oSUQsIFRZUEUsIEFUVFJTLCBGRUFUVVJFKSBCVUlMVElOKElELCBUWVBFLCBBVFRSUykKKyNlbmRpZgorCisvLyBTcGVjaWFsIFJlZ2lzdGVycworCitCVUlMVElOKF9fbnZ2bV9yZWFkX3B0eF9zcmVnX3RpZF94LCAiaSIsICJuYyIpCitCVUlMVElOKF9fbnZ2bV9yZWFkX3B0eF9zcmVnX3RpZF95LCAiaSIsICJuYyIpCitCVUlMVElOKF9fbnZ2bV9yZWFkX3B0eF9zcmVnX3RpZF96LCAiaSIsICJuYyIpCitCVUlMVElOKF9fbnZ2bV9yZWFkX3B0eF9zcmVnX3RpZF93LCAiaSIsICJuYyIpCisKK0JVSUxUSU4oX19udnZtX3JlYWRfcHR4X3NyZWdfbnRpZF94LCAiaSIsICJuYyIpCitCVUlMVElOKF9fbnZ2bV9yZWFkX3B0eF9zcmVnX250aWRfeSwgImkiLCAibmMiKQorQlVJTFRJTihfX252dm1fcmVhZF9wdHhfc3JlZ19udGlkX3osICJpIiwgIm5jIikKK0JVSUxUSU4oX19udnZtX3JlYWRfcHR4X3NyZWdfbnRpZF93LCAiaSIsICJuYyIpCisKK0JVSUxUSU4oX19udnZtX3JlYWRfcHR4X3NyZWdfY3RhaWRfeCwgImkiLCAibmMiKQorQlVJTFRJTihfX252dm1fcmVhZF9wdHhfc3JlZ19jdGFpZF95LCAiaSIsICJuYyIpCitCVUlMVElOKF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2N0YWlkX3osICJpIiwgIm5jIikKK0JVSUxUSU4oX19udnZtX3JlYWRfcHR4X3NyZWdfY3RhaWRfdywgImkiLCAibmMiKQorCitCVUlMVElOKF9fbnZ2bV9yZWFkX3B0eF9zcmVnX25jdGFpZF94LCAiaSIsICJuYyIpCitCVUlMVElOKF9fbnZ2bV9yZWFkX3B0eF9zcmVnX25jdGFpZF95LCAiaSIsICJuYyIpCitCVUlMVElOKF9fbnZ2bV9yZWFkX3B0eF9zcmVnX25jdGFpZF96LCAiaSIsICJuYyIpCitCVUlMVElOKF9fbnZ2bV9yZWFkX3B0eF9zcmVnX25jdGFpZF93LCAiaSIsICJuYyIpCisKK0JVSUxUSU4oX19udnZtX3JlYWRfcHR4X3NyZWdfbGFuZWlkLCAiaSIsICJuYyIpCitCVUlMVElOKF9fbnZ2bV9yZWFkX3B0eF9zcmVnX3dhcnBpZCwgImkiLCAibmMiKQorQlVJTFRJTihfX252dm1fcmVhZF9wdHhfc3JlZ19ud2FycGlkLCAiaSIsICJuYyIpCisKK0JVSUxUSU4oX19udnZtX3JlYWRfcHR4X3NyZWdfc21pZCwgImkiLCAibmMiKQorQlVJTFRJTihfX252dm1fcmVhZF9wdHhfc3JlZ19uc21pZCwgImkiLCAibmMiKQorQlVJTFRJTihfX252dm1fcmVhZF9wdHhfc3JlZ19ncmlkaWQsICJpIiwgIm5jIikKKworQlVJTFRJTihfX252dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19lcSwgImkiLCAibmMiKQorQlVJTFRJTihfX252dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19sZSwgImkiLCAibmMiKQorQlVJTFRJTihfX252dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19sdCwgImkiLCAibmMiKQorQlVJTFRJTihfX252dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19nZSwgImkiLCAibmMiKQorQlVJTFRJTihfX252dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19ndCwgImkiLCAibmMiKQorCitCVUlMVElOKF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2Nsb2NrLCAiaSIsICJuIikKK0JVSUxUSU4oX19udnZtX3JlYWRfcHR4X3NyZWdfY2xvY2s2NCwgIkxMaSIsICJuIikKKworQlVJTFRJTihfX252dm1fcmVhZF9wdHhfc3JlZ19wbTAsICJpIiwgIm4iKQorQlVJTFRJTihfX252dm1fcmVhZF9wdHhfc3JlZ19wbTEsICJpIiwgIm4iKQorQlVJTFRJTihfX252dm1fcmVhZF9wdHhfc3JlZ19wbTIsICJpIiwgIm4iKQorQlVJTFRJTihfX252dm1fcmVhZF9wdHhfc3JlZ19wbTMsICJpIiwgIm4iKQorCisvLyBNSVNDCisKK0JVSUxUSU4oX19udnZtX3BybXQsICJVaVVpVWlVaSIsICIiKQorCisvLyBNaW4gTWF4CisKK0JVSUxUSU4oX19udnZtX2ZtYXhfZnR6X2YsICJmZmYiLCAgIiIpCitCVUlMVElOKF9fbnZ2bV9mbWF4X2YsICJmZmYiLCAgIiIpCitCVUlMVElOKF9fbnZ2bV9mbWluX2Z0el9mLCAiZmZmIiwgICIiKQorQlVJTFRJTihfX252dm1fZm1pbl9mLCAiZmZmIiwgICIiKQorCitCVUlMVElOKF9fbnZ2bV9mbWF4X2QsICJkZGQiLCAiIikKK0JVSUxUSU4oX19udnZtX2ZtaW5fZCwgImRkZCIsICIiKQorCisvLyBNdWx0aXBsaWNhdGlvbgorCitCVUlMVElOKF9fbnZ2bV9tdWxoaV9pLCAiaWlpIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9tdWxoaV91aSwgIlVpVWlVaSIsICIiKQorQlVJTFRJTihfX252dm1fbXVsaGlfbGwsICJMTGlMTGlMTGkiLCAiIikKK0JVSUxUSU4oX19udnZtX211bGhpX3VsbCwgIlVMTGlVTExpVUxMaSIsICIiKQorCitCVUlMVElOKF9fbnZ2bV9tdWxfcm5fZnR6X2YsICAiZmZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9tdWxfcm5fZiwgICJmZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX211bF9yel9mdHpfZiwgICJmZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX211bF9yel9mLCAgImZmZiIsICIiKQorQlVJTFRJTihfX252dm1fbXVsX3JtX2Z0el9mLCAgImZmZiIsICIiKQorQlVJTFRJTihfX252dm1fbXVsX3JtX2YsICAiZmZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9tdWxfcnBfZnR6X2YsICAiZmZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9tdWxfcnBfZiwgICJmZmYiLCAiIikKKworQlVJTFRJTihfX252dm1fbXVsX3JuX2QsICAiZGRkIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9tdWxfcnpfZCwgICJkZGQiLCAiIikKK0JVSUxUSU4oX19udnZtX211bF9ybV9kLCAgImRkZCIsICIiKQorQlVJTFRJTihfX252dm1fbXVsX3JwX2QsICAiZGRkIiwgIiIpCisKK0JVSUxUSU4oX19udnZtX211bDI0X2ksICAiaWlpIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9tdWwyNF91aSwgICJVaVVpVWkiLCAiIikKKworLy8gRGl2CisKK0JVSUxUSU4oX19udnZtX2Rpdl9hcHByb3hfZnR6X2YsICAiZmZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9kaXZfYXBwcm94X2YsICAiZmZmIiwgIiIpCisKK0JVSUxUSU4oX19udnZtX2Rpdl9ybl9mdHpfZiwgICJmZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX2Rpdl9ybl9mLCAgImZmZiIsICIiKQorQlVJTFRJTihfX252dm1fZGl2X3J6X2Z0el9mLCAgImZmZiIsICIiKQorQlVJTFRJTihfX252dm1fZGl2X3J6X2YsICAiZmZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9kaXZfcm1fZnR6X2YsICAiZmZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9kaXZfcm1fZiwgICJmZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX2Rpdl9ycF9mdHpfZiwgICJmZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX2Rpdl9ycF9mLCAgImZmZiIsICIiKQorCitCVUlMVElOKF9fbnZ2bV9kaXZfcm5fZCwgICJkZGQiLCAiIikKK0JVSUxUSU4oX19udnZtX2Rpdl9yel9kLCAgImRkZCIsICIiKQorQlVJTFRJTihfX252dm1fZGl2X3JtX2QsICAiZGRkIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9kaXZfcnBfZCwgICJkZGQiLCAiIikKKworLy8gU2FkCisKK0JVSUxUSU4oX19udnZtX3NhZF9pLCAiaWlpaSIsICIiKQorQlVJTFRJTihfX252dm1fc2FkX3VpLCAiVWlVaVVpVWkiLCAiIikKKworLy8gRmxvb3IsIENlaWwKKworQlVJTFRJTihfX252dm1fZmxvb3JfZnR6X2YsICJmZiIsICIiKQorQlVJTFRJTihfX252dm1fZmxvb3JfZiwgImZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9mbG9vcl9kLCAiZGQiLCAiIikKKworQlVJTFRJTihfX252dm1fY2VpbF9mdHpfZiwgImZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9jZWlsX2YsICJmZiIsICIiKQorQlVJTFRJTihfX252dm1fY2VpbF9kLCAiZGQiLCAiIikKKworLy8gQWJzCisKK0JVSUxUSU4oX19udnZtX2ZhYnNfZnR6X2YsICJmZiIsICIiKQorQlVJTFRJTihfX252dm1fZmFic19mLCAiZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX2ZhYnNfZCwgImRkIiwgIiIpCisKKy8vIFJvdW5kCisKK0JVSUxUSU4oX19udnZtX3JvdW5kX2Z0el9mLCAiZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX3JvdW5kX2YsICJmZiIsICIiKQorQlVJTFRJTihfX252dm1fcm91bmRfZCwgImRkIiwgIiIpCisKKy8vIFRydW5jCisKK0JVSUxUSU4oX19udnZtX3RydW5jX2Z0el9mLCAiZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX3RydW5jX2YsICJmZiIsICIiKQorQlVJTFRJTihfX252dm1fdHJ1bmNfZCwgImRkIiwgIiIpCisKKy8vIFNhdHVyYXRlCisKK0JVSUxUSU4oX19udnZtX3NhdHVyYXRlX2Z0el9mLCAiZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX3NhdHVyYXRlX2YsICJmZiIsICIiKQorQlVJTFRJTihfX252dm1fc2F0dXJhdGVfZCwgImRkIiwgIiIpCisKKy8vIEV4cDIsIExvZzIKKworQlVJTFRJTihfX252dm1fZXgyX2FwcHJveF9mdHpfZiwgImZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9leDJfYXBwcm94X2YsICJmZiIsICIiKQorQlVJTFRJTihfX252dm1fZXgyX2FwcHJveF9kLCAiZGQiLCAiIikKKworQlVJTFRJTihfX252dm1fbGcyX2FwcHJveF9mdHpfZiwgImZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9sZzJfYXBwcm94X2YsICJmZiIsICIiKQorQlVJTFRJTihfX252dm1fbGcyX2FwcHJveF9kLCAiZGQiLCAiIikKKworLy8gU2luLCBDb3MKKworQlVJTFRJTihfX252dm1fc2luX2FwcHJveF9mdHpfZiwgImZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9zaW5fYXBwcm94X2YsICJmZiIsICIiKQorCitCVUlMVElOKF9fbnZ2bV9jb3NfYXBwcm94X2Z0el9mLCAiZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX2Nvc19hcHByb3hfZiwgImZmIiwgIiIpCisKKy8vIEZtYQorCitCVUlMVElOKF9fbnZ2bV9mbWFfcm5fZnR6X2YsICJmZmZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9mbWFfcm5fZiwgImZmZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX2ZtYV9yel9mdHpfZiwgImZmZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX2ZtYV9yel9mLCAiZmZmZiIsICIiKQorQlVJTFRJTihfX252dm1fZm1hX3JtX2Z0el9mLCAiZmZmZiIsICIiKQorQlVJTFRJTihfX252dm1fZm1hX3JtX2YsICJmZmZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9mbWFfcnBfZnR6X2YsICJmZmZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9mbWFfcnBfZiwgImZmZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX2ZtYV9ybl9kLCAiZGRkZCIsICIiKQorQlVJTFRJTihfX252dm1fZm1hX3J6X2QsICJkZGRkIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9mbWFfcm1fZCwgImRkZGQiLCAiIikKK0JVSUxUSU4oX19udnZtX2ZtYV9ycF9kLCAiZGRkZCIsICIiKQorCisvLyBSY3AKKworQlVJTFRJTihfX252dm1fcmNwX3JuX2Z0el9mLCAiZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX3JjcF9ybl9mLCAiZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX3JjcF9yel9mdHpfZiwgImZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9yY3BfcnpfZiwgImZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9yY3Bfcm1fZnR6X2YsICJmZiIsICIiKQorQlVJTFRJTihfX252dm1fcmNwX3JtX2YsICJmZiIsICIiKQorQlVJTFRJTihfX252dm1fcmNwX3JwX2Z0el9mLCAiZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX3JjcF9ycF9mLCAiZmYiLCAiIikKKworQlVJTFRJTihfX252dm1fcmNwX3JuX2QsICJkZCIsICIiKQorQlVJTFRJTihfX252dm1fcmNwX3J6X2QsICJkZCIsICIiKQorQlVJTFRJTihfX252dm1fcmNwX3JtX2QsICJkZCIsICIiKQorQlVJTFRJTihfX252dm1fcmNwX3JwX2QsICJkZCIsICIiKQorQlVJTFRJTihfX252dm1fcmNwX2FwcHJveF9mdHpfZCwgImRkIiwgIiIpCisKKy8vIFNxcnQKKworQlVJTFRJTihfX252dm1fc3FydF9ybl9mdHpfZiwgImZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9zcXJ0X3JuX2YsICJmZiIsICIiKQorQlVJTFRJTihfX252dm1fc3FydF9yel9mdHpfZiwgImZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9zcXJ0X3J6X2YsICJmZiIsICIiKQorQlVJTFRJTihfX252dm1fc3FydF9ybV9mdHpfZiwgImZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9zcXJ0X3JtX2YsICJmZiIsICIiKQorQlVJTFRJTihfX252dm1fc3FydF9ycF9mdHpfZiwgImZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9zcXJ0X3JwX2YsICJmZiIsICIiKQorQlVJTFRJTihfX252dm1fc3FydF9hcHByb3hfZnR6X2YsICJmZiIsICIiKQorQlVJTFRJTihfX252dm1fc3FydF9hcHByb3hfZiwgImZmIiwgIiIpCisKK0JVSUxUSU4oX19udnZtX3NxcnRfcm5fZCwgImRkIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9zcXJ0X3J6X2QsICJkZCIsICIiKQorQlVJTFRJTihfX252dm1fc3FydF9ybV9kLCAiZGQiLCAiIikKK0JVSUxUSU4oX19udnZtX3NxcnRfcnBfZCwgImRkIiwgIiIpCisKKy8vIFJzcXJ0CisKK0JVSUxUSU4oX19udnZtX3JzcXJ0X2FwcHJveF9mdHpfZiwgImZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9yc3FydF9hcHByb3hfZiwgImZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9yc3FydF9hcHByb3hfZCwgImRkIiwgIiIpCisKKy8vIEFkZAorCitCVUlMVElOKF9fbnZ2bV9hZGRfcm5fZnR6X2YsICJmZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX2FkZF9ybl9mLCAiZmZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9hZGRfcnpfZnR6X2YsICJmZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX2FkZF9yel9mLCAiZmZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9hZGRfcm1fZnR6X2YsICJmZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX2FkZF9ybV9mLCAiZmZmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9hZGRfcnBfZnR6X2YsICJmZmYiLCAiIikKK0JVSUxUSU4oX19udnZtX2FkZF9ycF9mLCAiZmZmIiwgIiIpCisKK0JVSUxUSU4oX19udnZtX2FkZF9ybl9kLCAiZGRkIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9hZGRfcnpfZCwgImRkZCIsICIiKQorQlVJTFRJTihfX252dm1fYWRkX3JtX2QsICJkZGQiLCAiIikKK0JVSUxUSU4oX19udnZtX2FkZF9ycF9kLCAiZGRkIiwgIiIpCisKKy8vIENvbnZlcnQKKworQlVJTFRJTihfX252dm1fZDJmX3JuX2Z0eiwgImZkIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9kMmZfcm4sICJmZCIsICIiKQorQlVJTFRJTihfX252dm1fZDJmX3J6X2Z0eiwgImZkIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9kMmZfcnosICJmZCIsICIiKQorQlVJTFRJTihfX252dm1fZDJmX3JtX2Z0eiwgImZkIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9kMmZfcm0sICJmZCIsICIiKQorQlVJTFRJTihfX252dm1fZDJmX3JwX2Z0eiwgImZkIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9kMmZfcnAsICJmZCIsICIiKQorCitCVUlMVElOKF9fbnZ2bV9kMmlfcm4sICJpZCIsICIiKQorQlVJTFRJTihfX252dm1fZDJpX3J6LCAiaWQiLCAiIikKK0JVSUxUSU4oX19udnZtX2QyaV9ybSwgImlkIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9kMmlfcnAsICJpZCIsICIiKQorCitCVUlMVElOKF9fbnZ2bV9kMnVpX3JuLCAiVWlkIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9kMnVpX3J6LCAiVWlkIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9kMnVpX3JtLCAiVWlkIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9kMnVpX3JwLCAiVWlkIiwgIiIpCisKK0JVSUxUSU4oX19udnZtX2kyZF9ybiwgImRpIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9pMmRfcnosICJkaSIsICIiKQorQlVJTFRJTihfX252dm1faTJkX3JtLCAiZGkiLCAiIikKK0JVSUxUSU4oX19udnZtX2kyZF9ycCwgImRpIiwgIiIpCisKK0JVSUxUSU4oX19udnZtX3VpMmRfcm4sICJkVWkiLCAiIikKK0JVSUxUSU4oX19udnZtX3VpMmRfcnosICJkVWkiLCAiIikKK0JVSUxUSU4oX19udnZtX3VpMmRfcm0sICJkVWkiLCAiIikKK0JVSUxUSU4oX19udnZtX3VpMmRfcnAsICJkVWkiLCAiIikKKworQlVJTFRJTihfX252dm1fZjJpX3JuX2Z0eiwgImlmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9mMmlfcm4sICJpZiIsICIiKQorQlVJTFRJTihfX252dm1fZjJpX3J6X2Z0eiwgImlmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9mMmlfcnosICJpZiIsICIiKQorQlVJTFRJTihfX252dm1fZjJpX3JtX2Z0eiwgImlmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9mMmlfcm0sICJpZiIsICIiKQorQlVJTFRJTihfX252dm1fZjJpX3JwX2Z0eiwgImlmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9mMmlfcnAsICJpZiIsICIiKQorCitCVUlMVElOKF9fbnZ2bV9mMnVpX3JuX2Z0eiwgIlVpZiIsICIiKQorQlVJTFRJTihfX252dm1fZjJ1aV9ybiwgIlVpZiIsICIiKQorQlVJTFRJTihfX252dm1fZjJ1aV9yel9mdHosICJVaWYiLCAiIikKK0JVSUxUSU4oX19udnZtX2YydWlfcnosICJVaWYiLCAiIikKK0JVSUxUSU4oX19udnZtX2YydWlfcm1fZnR6LCAiVWlmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9mMnVpX3JtLCAiVWlmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9mMnVpX3JwX2Z0eiwgIlVpZiIsICIiKQorQlVJTFRJTihfX252dm1fZjJ1aV9ycCwgIlVpZiIsICIiKQorCitCVUlMVElOKF9fbnZ2bV9pMmZfcm4sICJmaSIsICIiKQorQlVJTFRJTihfX252dm1faTJmX3J6LCAiZmkiLCAiIikKK0JVSUxUSU4oX19udnZtX2kyZl9ybSwgImZpIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9pMmZfcnAsICJmaSIsICIiKQorCitCVUlMVElOKF9fbnZ2bV91aTJmX3JuLCAiZlVpIiwgIiIpCitCVUlMVElOKF9fbnZ2bV91aTJmX3J6LCAiZlVpIiwgIiIpCitCVUlMVElOKF9fbnZ2bV91aTJmX3JtLCAiZlVpIiwgIiIpCitCVUlMVElOKF9fbnZ2bV91aTJmX3JwLCAiZlVpIiwgIiIpCisKK0JVSUxUSU4oX19udnZtX2xvaGlfaTJkLCAiZGlpIiwgIiIpCisKK0JVSUxUSU4oX19udnZtX2QyaV9sbywgImlkIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9kMmlfaGksICJpZCIsICIiKQorCitCVUlMVElOKF9fbnZ2bV9mMmxsX3JuX2Z0eiwgIkxMaWYiLCAiIikKK0JVSUxUSU4oX19udnZtX2YybGxfcm4sICJMTGlmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9mMmxsX3J6X2Z0eiwgIkxMaWYiLCAiIikKK0JVSUxUSU4oX19udnZtX2YybGxfcnosICJMTGlmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9mMmxsX3JtX2Z0eiwgIkxMaWYiLCAiIikKK0JVSUxUSU4oX19udnZtX2YybGxfcm0sICJMTGlmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9mMmxsX3JwX2Z0eiwgIkxMaWYiLCAiIikKK0JVSUxUSU4oX19udnZtX2YybGxfcnAsICJMTGlmIiwgIiIpCisKK0JVSUxUSU4oX19udnZtX2YydWxsX3JuX2Z0eiwgIlVMTGlmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9mMnVsbF9ybiwgIlVMTGlmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9mMnVsbF9yel9mdHosICJVTExpZiIsICIiKQorQlVJTFRJTihfX252dm1fZjJ1bGxfcnosICJVTExpZiIsICIiKQorQlVJTFRJTihfX252dm1fZjJ1bGxfcm1fZnR6LCAiVUxMaWYiLCAiIikKK0JVSUxUSU4oX19udnZtX2YydWxsX3JtLCAiVUxMaWYiLCAiIikKK0JVSUxUSU4oX19udnZtX2YydWxsX3JwX2Z0eiwgIlVMTGlmIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9mMnVsbF9ycCwgIlVMTGlmIiwgIiIpCisKK0JVSUxUSU4oX19udnZtX2QybGxfcm4sICJMTGlkIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9kMmxsX3J6LCAiTExpZCIsICIiKQorQlVJTFRJTihfX252dm1fZDJsbF9ybSwgIkxMaWQiLCAiIikKK0JVSUxUSU4oX19udnZtX2QybGxfcnAsICJMTGlkIiwgIiIpCisKK0JVSUxUSU4oX19udnZtX2QydWxsX3JuLCAiVUxMaWQiLCAiIikKK0JVSUxUSU4oX19udnZtX2QydWxsX3J6LCAiVUxMaWQiLCAiIikKK0JVSUxUSU4oX19udnZtX2QydWxsX3JtLCAiVUxMaWQiLCAiIikKK0JVSUxUSU4oX19udnZtX2QydWxsX3JwLCAiVUxMaWQiLCAiIikKKworQlVJTFRJTihfX252dm1fbGwyZl9ybiwgImZMTGkiLCAiIikKK0JVSUxUSU4oX19udnZtX2xsMmZfcnosICJmTExpIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9sbDJmX3JtLCAiZkxMaSIsICIiKQorQlVJTFRJTihfX252dm1fbGwyZl9ycCwgImZMTGkiLCAiIikKKworQlVJTFRJTihfX252dm1fdWxsMmZfcm4sICJmVUxMaSIsICIiKQorQlVJTFRJTihfX252dm1fdWxsMmZfcnosICJmVUxMaSIsICIiKQorQlVJTFRJTihfX252dm1fdWxsMmZfcm0sICJmVUxMaSIsICIiKQorQlVJTFRJTihfX252dm1fdWxsMmZfcnAsICJmVUxMaSIsICIiKQorCitCVUlMVElOKF9fbnZ2bV9sbDJkX3JuLCAiZExMaSIsICIiKQorQlVJTFRJTihfX252dm1fbGwyZF9yeiwgImRMTGkiLCAiIikKK0JVSUxUSU4oX19udnZtX2xsMmRfcm0sICJkTExpIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9sbDJkX3JwLCAiZExMaSIsICIiKQorCitCVUlMVElOKF9fbnZ2bV91bGwyZF9ybiwgImRVTExpIiwgIiIpCitCVUlMVElOKF9fbnZ2bV91bGwyZF9yeiwgImRVTExpIiwgIiIpCitCVUlMVElOKF9fbnZ2bV91bGwyZF9ybSwgImRVTExpIiwgIiIpCitCVUlMVElOKF9fbnZ2bV91bGwyZF9ycCwgImRVTExpIiwgIiIpCisKK0JVSUxUSU4oX19udnZtX2YyaF9ybl9mdHosICJVc2YiLCAiIikKK0JVSUxUSU4oX19udnZtX2YyaF9ybiwgIlVzZiIsICIiKQorCisvLyBCaXRjYXN0CisKK0JVSUxUSU4oX19udnZtX2JpdGNhc3RfZjJpLCAiaWYiLCAiIikKK0JVSUxUSU4oX19udnZtX2JpdGNhc3RfaTJmLCAiZmkiLCAiIikKKworQlVJTFRJTihfX252dm1fYml0Y2FzdF9sbDJkLCAiZExMaSIsICIiKQorQlVJTFRJTihfX252dm1fYml0Y2FzdF9kMmxsLCAiTExpZCIsICIiKQorCisvLyBGTlMKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9mbnMsICJVaVVpVWlpIiwgIm4iLCAicHR4NjAiKQorCisvLyBTeW5jCisKK0JVSUxUSU4oX19zeW5jdGhyZWFkcywgInYiLCAiIikKK0JVSUxUSU4oX19udnZtX2JhcjBfcG9wYywgImlpIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9iYXIwX2FuZCwgImlpIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9iYXIwX29yLCAiaWkiLCAiIikKK0JVSUxUSU4oX19udnZtX2Jhcl9zeW5jLCAidmkiLCAibiIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYmFyX3dhcnBfc3luYywgInZVaSIsICJuIiwgInB0eDYwIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9iYXJyaWVyX3N5bmMsICJ2VWkiLCAibiIsICJwdHg2MCIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYmFycmllcl9zeW5jX2NudCwgInZVaVVpIiwgIm4iLCAicHR4NjAiKQorCisvLyBTaHVmZmxlCisKK0JVSUxUSU4oX19udnZtX3NoZmxfZG93bl9pMzIsICJpaWlpIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9zaGZsX2Rvd25fZjMyLCAiZmZpaSIsICIiKQorQlVJTFRJTihfX252dm1fc2hmbF91cF9pMzIsICJpaWlpIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9zaGZsX3VwX2YzMiwgImZmaWkiLCAiIikKK0JVSUxUSU4oX19udnZtX3NoZmxfYmZseV9pMzIsICJpaWlpIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9zaGZsX2JmbHlfZjMyLCAiZmZpaSIsICIiKQorQlVJTFRJTihfX252dm1fc2hmbF9pZHhfaTMyLCAiaWlpaSIsICIiKQorQlVJTFRJTihfX252dm1fc2hmbF9pZHhfZjMyLCAiZmZpaSIsICIiKQorCitUQVJHRVRfQlVJTFRJTihfX252dm1fc2hmbF9zeW5jX2Rvd25faTMyLCAiaVVpaWlpIiwgIiIsICJwdHg2MCIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fc2hmbF9zeW5jX2Rvd25fZjMyLCAiZlVpZmlpIiwgIiIsICJwdHg2MCIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fc2hmbF9zeW5jX3VwX2kzMiwgImlVaWlpaSIsICIiLCAicHR4NjAiKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX3NoZmxfc3luY191cF9mMzIsICJmVWlmaWkiLCAiIiwgInB0eDYwIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9zaGZsX3N5bmNfYmZseV9pMzIsICJpVWlpaWkiLCAiIiwgInB0eDYwIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9zaGZsX3N5bmNfYmZseV9mMzIsICJmVWlmaWkiLCAiIiwgInB0eDYwIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9zaGZsX3N5bmNfaWR4X2kzMiwgImlVaWlpaSIsICIiLCAicHR4NjAiKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX3NoZmxfc3luY19pZHhfZjMyLCAiZlVpZmlpIiwgIiIsICJwdHg2MCIpCisKKy8vIFZvdGUKK0JVSUxUSU4oX19udnZtX3ZvdGVfYWxsLCAiYmIiLCAiIikKK0JVSUxUSU4oX19udnZtX3ZvdGVfYW55LCAiYmIiLCAiIikKK0JVSUxUSU4oX19udnZtX3ZvdGVfdW5pLCAiYmIiLCAiIikKK0JVSUxUSU4oX19udnZtX3ZvdGVfYmFsbG90LCAiVWliIiwgIiIpCisKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV92b3RlX2FsbF9zeW5jLCAiYlVpYiIsICIiLCAicHR4NjAiKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX3ZvdGVfYW55X3N5bmMsICJiVWliIiwgIiIsICJwdHg2MCIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fdm90ZV91bmlfc3luYywgImJVaWIiLCAiIiwgInB0eDYwIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV92b3RlX2JhbGxvdF9zeW5jLCAiVWlVaWIiLCAiIiwgInB0eDYwIikKKworLy8gTWF0Y2gKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9tYXRjaF9hbnlfc3luY19pMzIsICJVaVVpVWkiLCAiIiwgInB0eDYwIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9tYXRjaF9hbnlfc3luY19pNjQsICJXaVVpV2kiLCAiIiwgInB0eDYwIikKKy8vIFRoZXNlIHJldHVybiBhIHBhaXIge3ZhbHVlLCBwcmVkaWNhdGV9LCB3aGljaCByZXF1aXJlcyBjdXN0b20gbG93ZXJpbmcuCitUQVJHRVRfQlVJTFRJTihfX252dm1fbWF0Y2hfYWxsX3N5bmNfaTMycCwgIlVpVWlVaWkqIiwgIiIsICJwdHg2MCIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fbWF0Y2hfYWxsX3N5bmNfaTY0cCwgIldpVWlXaWkqIiwgIiIsICJwdHg2MCIpCisKKy8vIE1lbWJhcgorCitCVUlMVElOKF9fbnZ2bV9tZW1iYXJfY3RhLCAidiIsICIiKQorQlVJTFRJTihfX252dm1fbWVtYmFyX2dsLCAidiIsICIiKQorQlVJTFRJTihfX252dm1fbWVtYmFyX3N5cywgInYiLCAiIikKKworLy8gTWVtY3B5LCBNZW1zZXQKKworQlVJTFRJTihfX252dm1fbWVtY3B5LCAidlVjKlVjKnppIiwiIikKK0JVSUxUSU4oX19udnZtX21lbXNldCwgInZVYypVY3ppIiwiIikKKworLy8gSW1hZ2UKKworQlVJTFRJTihfX2J1aWx0aW5fcHR4X3JlYWRfaW1hZ2UyRGZpXywgIlY0ZmlpaWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3B0eF9yZWFkX2ltYWdlMkRmZl8sICJWNGZpaWZmIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9wdHhfcmVhZF9pbWFnZTJEaWlfLCAiVjRpaWlpaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fcHR4X3JlYWRfaW1hZ2UyRGlmXywgIlY0aWlpZmYiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fcHR4X3JlYWRfaW1hZ2UzRGZpXywgIlY0ZmlpaWlpaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fcHR4X3JlYWRfaW1hZ2UzRGZmXywgIlY0ZmlpZmZmZiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fcHR4X3JlYWRfaW1hZ2UzRGlpXywgIlY0aWlpaWlpaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fcHR4X3JlYWRfaW1hZ2UzRGlmXywgIlY0aWlpZmZmZiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9wdHhfd3JpdGVfaW1hZ2UyRGZfLCAidmlpaWZmZmYiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3B0eF93cml0ZV9pbWFnZTJEaV8sICJ2aWlpaWlpaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fcHR4X3dyaXRlX2ltYWdlMkR1aV8sICJ2aWlpVWlVaVVpVWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3B0eF9nZXRfaW1hZ2VfZGVwdGhpXywgImlpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9wdHhfZ2V0X2ltYWdlX2hlaWdodGlfLCAiaWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3B0eF9nZXRfaW1hZ2Vfd2lkdGhpXywgImlpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9wdHhfZ2V0X2ltYWdlX2NoYW5uZWxfZGF0YV90eXBlaV8sICJpaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fcHR4X2dldF9pbWFnZV9jaGFubmVsX29yZGVyaV8sICJpaSIsICIiKQorCisvLyBBdG9taWMKKy8vCisvLyBXZSBuZWVkIHRoZSBhdG9tIGludHJpbnNpY3MgYmVjYXVzZQorLy8gLSB0aGV5IGFyZSB1c2VkIGluIGNvbnZlcmdpbmcgYW5hbHlzaXMKKy8vIC0gdGhleSBhcmUgdXNlZCBpbiBhZGRyZXNzIHNwYWNlIGFuYWx5c2lzIGFuZCBvcHRpbWl6YXRpb24KKy8vIFNvIGl0IGRvZXMgbm90IGh1cnQgdG8gZXhwb3NlIHRoZW0gYXMgYnVpbHRpbnMuCisvLworQlVJTFRJTihfX252dm1fYXRvbV9hZGRfZ19pLCAiaWlEKjFpIiwgIm4iKQorQlVJTFRJTihfX252dm1fYXRvbV9hZGRfc19pLCAiaWlEKjNpIiwgIm4iKQorQlVJTFRJTihfX252dm1fYXRvbV9hZGRfZ2VuX2ksICJpaUQqaSIsICJuIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX2N0YV9hZGRfZ2VuX2ksICJpaUQqaSIsICJuIiwgInNhdG9tIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX3N5c19hZGRfZ2VuX2ksICJpaUQqaSIsICJuIiwgInNhdG9tIikKK0JVSUxUSU4oX19udnZtX2F0b21fYWRkX2dfbCwgIkxpTGlEKjFMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fYWRkX3NfbCwgIkxpTGlEKjNMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fYWRkX2dlbl9sLCAiTGlMaUQqTGkiLCAibiIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9jdGFfYWRkX2dlbl9sLCAiTGlMaUQqTGkiLCAibiIsICJzYXRvbSIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9zeXNfYWRkX2dlbl9sLCAiTGlMaUQqTGkiLCAibiIsICJzYXRvbSIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX2FkZF9nX2xsLCAiTExpTExpRCoxTExpIiwgIm4iKQorQlVJTFRJTihfX252dm1fYXRvbV9hZGRfc19sbCwgIkxMaUxMaUQqM0xMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fYWRkX2dlbl9sbCwgIkxMaUxMaUQqTExpIiwgIm4iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fY3RhX2FkZF9nZW5fbGwsICJMTGlMTGlEKkxMaSIsICJuIiwgInNhdG9tIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX3N5c19hZGRfZ2VuX2xsLCAiTExpTExpRCpMTGkiLCAibiIsICJzYXRvbSIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX2FkZF9nX2YsICJmZkQqMWYiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX2FkZF9zX2YsICJmZkQqM2YiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX2FkZF9nZW5fZiwgImZmRCpmIiwgIm4iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fY3RhX2FkZF9nZW5fZiwgImZmRCpmIiwgIm4iLCAic2F0b20iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fc3lzX2FkZF9nZW5fZiwgImZmRCpmIiwgIm4iLCAic2F0b20iKQorQlVJTFRJTihfX252dm1fYXRvbV9hZGRfZ19kLCAiZGREKjFkIiwgIm4iKQorQlVJTFRJTihfX252dm1fYXRvbV9hZGRfc19kLCAiZGREKjNkIiwgIm4iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fYWRkX2dlbl9kLCAiZGREKmQiLCAibiIsICJzYXRvbSIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9jdGFfYWRkX2dlbl9kLCAiZGREKmQiLCAibiIsICJzYXRvbSIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9zeXNfYWRkX2dlbl9kLCAiZGREKmQiLCAibiIsICJzYXRvbSIpCisKK0JVSUxUSU4oX19udnZtX2F0b21fc3ViX2dfaSwgImlpRCoxaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fc3ViX3NfaSwgImlpRCozaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fc3ViX2dlbl9pLCAiaWlEKmkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX3N1Yl9nX2wsICJMaUxpRCoxTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX3N1Yl9zX2wsICJMaUxpRCozTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX3N1Yl9nZW5fbCwgIkxpTGlEKkxpIiwgIm4iKQorQlVJTFRJTihfX252dm1fYXRvbV9zdWJfZ19sbCwgIkxMaUxMaUQqMUxMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fc3ViX3NfbGwsICJMTGlMTGlEKjNMTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX3N1Yl9nZW5fbGwsICJMTGlMTGlEKkxMaSIsICJuIikKKworQlVJTFRJTihfX252dm1fYXRvbV94Y2hnX2dfaSwgImlpRCoxaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21feGNoZ19zX2ksICJpaUQqM2kiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX3hjaGdfZ2VuX2ksICJpaUQqaSIsICJuIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX2N0YV94Y2hnX2dlbl9pLCAiaWlEKmkiLCAibiIsICJzYXRvbSIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9zeXNfeGNoZ19nZW5faSwgImlpRCppIiwgIm4iLCAic2F0b20iKQorQlVJTFRJTihfX252dm1fYXRvbV94Y2hnX2dfbCwgIkxpTGlEKjFMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21feGNoZ19zX2wsICJMaUxpRCozTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX3hjaGdfZ2VuX2wsICJMaUxpRCpMaSIsICJuIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX2N0YV94Y2hnX2dlbl9sLCAiTGlMaUQqTGkiLCAibiIsICJzYXRvbSIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9zeXNfeGNoZ19nZW5fbCwgIkxpTGlEKkxpIiwgIm4iLCAic2F0b20iKQorQlVJTFRJTihfX252dm1fYXRvbV94Y2hnX2dfbGwsICJMTGlMTGlEKjFMTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX3hjaGdfc19sbCwgIkxMaUxMaUQqM0xMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21feGNoZ19nZW5fbGwsICJMTGlMTGlEKkxMaSIsICJuIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX2N0YV94Y2hnX2dlbl9sbCwgIkxMaUxMaUQqTExpIiwgIm4iLCAic2F0b20iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fc3lzX3hjaGdfZ2VuX2xsLCAiTExpTExpRCpMTGkiLCAibiIsICJzYXRvbSIpCisKK0JVSUxUSU4oX19udnZtX2F0b21fbWF4X2dfaSwgImlpRCoxaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fbWF4X3NfaSwgImlpRCozaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fbWF4X2dlbl9pLCAiaWlEKmkiLCAibiIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9jdGFfbWF4X2dlbl9pLCAiaWlEKmkiLCAibiIsICJzYXRvbSIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9zeXNfbWF4X2dlbl9pLCAiaWlEKmkiLCAibiIsICJzYXRvbSIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX21heF9nX3VpLCAiVWlVaUQqMVVpIiwgIm4iKQorQlVJTFRJTihfX252dm1fYXRvbV9tYXhfc191aSwgIlVpVWlEKjNVaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fbWF4X2dlbl91aSwgIlVpVWlEKlVpIiwgIm4iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fY3RhX21heF9nZW5fdWksICJVaVVpRCpVaSIsICJuIiwgInNhdG9tIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX3N5c19tYXhfZ2VuX3VpLCAiVWlVaUQqVWkiLCAibiIsICJzYXRvbSIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX21heF9nX2wsICJMaUxpRCoxTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX21heF9zX2wsICJMaUxpRCozTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX21heF9nZW5fbCwgIkxpTGlEKkxpIiwgIm4iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fY3RhX21heF9nZW5fbCwgIkxpTGlEKkxpIiwgIm4iLCAic2F0b20iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fc3lzX21heF9nZW5fbCwgIkxpTGlEKkxpIiwgIm4iLCAic2F0b20iKQorQlVJTFRJTihfX252dm1fYXRvbV9tYXhfZ191bCwgIlVMaVVMaUQqMVVMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fbWF4X3NfdWwsICJVTGlVTGlEKjNVTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX21heF9nZW5fdWwsICJVTGlVTGlEKlVMaSIsICJuIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX2N0YV9tYXhfZ2VuX3VsLCAiVUxpVUxpRCpVTGkiLCAibiIsICJzYXRvbSIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9zeXNfbWF4X2dlbl91bCwgIlVMaVVMaUQqVUxpIiwgIm4iLCAic2F0b20iKQorQlVJTFRJTihfX252dm1fYXRvbV9tYXhfZ19sbCwgIkxMaUxMaUQqMUxMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fbWF4X3NfbGwsICJMTGlMTGlEKjNMTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX21heF9nZW5fbGwsICJMTGlMTGlEKkxMaSIsICJuIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX2N0YV9tYXhfZ2VuX2xsLCAiTExpTExpRCpMTGkiLCAibiIsICJzYXRvbSIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9zeXNfbWF4X2dlbl9sbCwgIkxMaUxMaUQqTExpIiwgIm4iLCAic2F0b20iKQorQlVJTFRJTihfX252dm1fYXRvbV9tYXhfZ191bGwsICJVTExpVUxMaUQqMVVMTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX21heF9zX3VsbCwgIlVMTGlVTExpRCozVUxMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fbWF4X2dlbl91bGwsICJVTExpVUxMaUQqVUxMaSIsICJuIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX2N0YV9tYXhfZ2VuX3VsbCwgIlVMTGlVTExpRCpVTExpIiwgIm4iLCAic2F0b20iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fc3lzX21heF9nZW5fdWxsLCAiVUxMaVVMTGlEKlVMTGkiLCAibiIsICJzYXRvbSIpCisKK0JVSUxUSU4oX19udnZtX2F0b21fbWluX2dfaSwgImlpRCoxaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fbWluX3NfaSwgImlpRCozaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fbWluX2dlbl9pLCAiaWlEKmkiLCAibiIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9jdGFfbWluX2dlbl9pLCAiaWlEKmkiLCAibiIsICJzYXRvbSIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9zeXNfbWluX2dlbl9pLCAiaWlEKmkiLCAibiIsICJzYXRvbSIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX21pbl9nX3VpLCAiVWlVaUQqMVVpIiwgIm4iKQorQlVJTFRJTihfX252dm1fYXRvbV9taW5fc191aSwgIlVpVWlEKjNVaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fbWluX2dlbl91aSwgIlVpVWlEKlVpIiwgIm4iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fY3RhX21pbl9nZW5fdWksICJVaVVpRCpVaSIsICJuIiwgInNhdG9tIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX3N5c19taW5fZ2VuX3VpLCAiVWlVaUQqVWkiLCAibiIsICJzYXRvbSIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX21pbl9nX2wsICJMaUxpRCoxTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX21pbl9zX2wsICJMaUxpRCozTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX21pbl9nZW5fbCwgIkxpTGlEKkxpIiwgIm4iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fY3RhX21pbl9nZW5fbCwgIkxpTGlEKkxpIiwgIm4iLCAic2F0b20iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fc3lzX21pbl9nZW5fbCwgIkxpTGlEKkxpIiwgIm4iLCAic2F0b20iKQorQlVJTFRJTihfX252dm1fYXRvbV9taW5fZ191bCwgIlVMaVVMaUQqMVVMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fbWluX3NfdWwsICJVTGlVTGlEKjNVTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX21pbl9nZW5fdWwsICJVTGlVTGlEKlVMaSIsICJuIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX2N0YV9taW5fZ2VuX3VsLCAiVUxpVUxpRCpVTGkiLCAibiIsICJzYXRvbSIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9zeXNfbWluX2dlbl91bCwgIlVMaVVMaUQqVUxpIiwgIm4iLCAic2F0b20iKQorQlVJTFRJTihfX252dm1fYXRvbV9taW5fZ19sbCwgIkxMaUxMaUQqMUxMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fbWluX3NfbGwsICJMTGlMTGlEKjNMTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX21pbl9nZW5fbGwsICJMTGlMTGlEKkxMaSIsICJuIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX2N0YV9taW5fZ2VuX2xsLCAiTExpTExpRCpMTGkiLCAibiIsICJzYXRvbSIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9zeXNfbWluX2dlbl9sbCwgIkxMaUxMaUQqTExpIiwgIm4iLCAic2F0b20iKQorQlVJTFRJTihfX252dm1fYXRvbV9taW5fZ191bGwsICJVTExpVUxMaUQqMVVMTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX21pbl9zX3VsbCwgIlVMTGlVTExpRCozVUxMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fbWluX2dlbl91bGwsICJVTExpVUxMaUQqVUxMaSIsICJuIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX2N0YV9taW5fZ2VuX3VsbCwgIlVMTGlVTExpRCpVTExpIiwgIm4iLCAic2F0b20iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fc3lzX21pbl9nZW5fdWxsLCAiVUxMaVVMTGlEKlVMTGkiLCAibiIsICJzYXRvbSIpCisKK0JVSUxUSU4oX19udnZtX2F0b21faW5jX2dfdWksICJVaVVpRCoxVWkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX2luY19zX3VpLCAiVWlVaUQqM1VpIiwgIm4iKQorQlVJTFRJTihfX252dm1fYXRvbV9pbmNfZ2VuX3VpLCAiVWlVaUQqVWkiLCAibiIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9jdGFfaW5jX2dlbl91aSwgIlVpVWlEKlVpIiwgIm4iLCAic2F0b20iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fc3lzX2luY19nZW5fdWksICJVaVVpRCpVaSIsICJuIiwgInNhdG9tIikKK0JVSUxUSU4oX19udnZtX2F0b21fZGVjX2dfdWksICJVaVVpRCoxVWkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX2RlY19zX3VpLCAiVWlVaUQqM1VpIiwgIm4iKQorQlVJTFRJTihfX252dm1fYXRvbV9kZWNfZ2VuX3VpLCAiVWlVaUQqVWkiLCAibiIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9jdGFfZGVjX2dlbl91aSwgIlVpVWlEKlVpIiwgIm4iLCAic2F0b20iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fc3lzX2RlY19nZW5fdWksICJVaVVpRCpVaSIsICJuIiwgInNhdG9tIikKKworQlVJTFRJTihfX252dm1fYXRvbV9hbmRfZ19pLCAiaWlEKjFpIiwgIm4iKQorQlVJTFRJTihfX252dm1fYXRvbV9hbmRfc19pLCAiaWlEKjNpIiwgIm4iKQorQlVJTFRJTihfX252dm1fYXRvbV9hbmRfZ2VuX2ksICJpaUQqaSIsICJuIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX2N0YV9hbmRfZ2VuX2ksICJpaUQqaSIsICJuIiwgInNhdG9tIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX3N5c19hbmRfZ2VuX2ksICJpaUQqaSIsICJuIiwgInNhdG9tIikKK0JVSUxUSU4oX19udnZtX2F0b21fYW5kX2dfbCwgIkxpTGlEKjFMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fYW5kX3NfbCwgIkxpTGlEKjNMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fYW5kX2dlbl9sLCAiTGlMaUQqTGkiLCAibiIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9jdGFfYW5kX2dlbl9sLCAiTGlMaUQqTGkiLCAibiIsICJzYXRvbSIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9zeXNfYW5kX2dlbl9sLCAiTGlMaUQqTGkiLCAibiIsICJzYXRvbSIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX2FuZF9nX2xsLCAiTExpTExpRCoxTExpIiwgIm4iKQorQlVJTFRJTihfX252dm1fYXRvbV9hbmRfc19sbCwgIkxMaUxMaUQqM0xMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fYW5kX2dlbl9sbCwgIkxMaUxMaUQqTExpIiwgIm4iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fY3RhX2FuZF9nZW5fbGwsICJMTGlMTGlEKkxMaSIsICJuIiwgInNhdG9tIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX3N5c19hbmRfZ2VuX2xsLCAiTExpTExpRCpMTGkiLCAibiIsICJzYXRvbSIpCisKK0JVSUxUSU4oX19udnZtX2F0b21fb3JfZ19pLCAiaWlEKjFpIiwgIm4iKQorQlVJTFRJTihfX252dm1fYXRvbV9vcl9zX2ksICJpaUQqM2kiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX29yX2dlbl9pLCAiaWlEKmkiLCAibiIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9jdGFfb3JfZ2VuX2ksICJpaUQqaSIsICJuIiwgInNhdG9tIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX3N5c19vcl9nZW5faSwgImlpRCppIiwgIm4iLCAic2F0b20iKQorQlVJTFRJTihfX252dm1fYXRvbV9vcl9nX2wsICJMaUxpRCoxTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX29yX3NfbCwgIkxpTGlEKjNMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fb3JfZ2VuX2wsICJMaUxpRCpMaSIsICJuIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX2N0YV9vcl9nZW5fbCwgIkxpTGlEKkxpIiwgIm4iLCAic2F0b20iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fc3lzX29yX2dlbl9sLCAiTGlMaUQqTGkiLCAibiIsICJzYXRvbSIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX29yX2dfbGwsICJMTGlMTGlEKjFMTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX29yX3NfbGwsICJMTGlMTGlEKjNMTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX29yX2dlbl9sbCwgIkxMaUxMaUQqTExpIiwgIm4iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fY3RhX29yX2dlbl9sbCwgIkxMaUxMaUQqTExpIiwgIm4iLCAic2F0b20iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fc3lzX29yX2dlbl9sbCwgIkxMaUxMaUQqTExpIiwgIm4iLCAic2F0b20iKQorCitCVUlMVElOKF9fbnZ2bV9hdG9tX3hvcl9nX2ksICJpaUQqMWkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX3hvcl9zX2ksICJpaUQqM2kiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX3hvcl9nZW5faSwgImlpRCppIiwgIm4iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fY3RhX3hvcl9nZW5faSwgImlpRCppIiwgIm4iLCAic2F0b20iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fc3lzX3hvcl9nZW5faSwgImlpRCppIiwgIm4iLCAic2F0b20iKQorQlVJTFRJTihfX252dm1fYXRvbV94b3JfZ19sLCAiTGlMaUQqMUxpIiwgIm4iKQorQlVJTFRJTihfX252dm1fYXRvbV94b3Jfc19sLCAiTGlMaUQqM0xpIiwgIm4iKQorQlVJTFRJTihfX252dm1fYXRvbV94b3JfZ2VuX2wsICJMaUxpRCpMaSIsICJuIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX2N0YV94b3JfZ2VuX2wsICJMaUxpRCpMaSIsICJuIiwgInNhdG9tIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX3N5c194b3JfZ2VuX2wsICJMaUxpRCpMaSIsICJuIiwgInNhdG9tIikKK0JVSUxUSU4oX19udnZtX2F0b21feG9yX2dfbGwsICJMTGlMTGlEKjFMTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX3hvcl9zX2xsLCAiTExpTExpRCozTExpIiwgIm4iKQorQlVJTFRJTihfX252dm1fYXRvbV94b3JfZ2VuX2xsLCAiTExpTExpRCpMTGkiLCAibiIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9jdGFfeG9yX2dlbl9sbCwgIkxMaUxMaUQqTExpIiwgIm4iLCAic2F0b20iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fc3lzX3hvcl9nZW5fbGwsICJMTGlMTGlEKkxMaSIsICJuIiwgInNhdG9tIikKKworQlVJTFRJTihfX252dm1fYXRvbV9jYXNfZ19pLCAiaWlEKjFpaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fY2FzX3NfaSwgImlpRCozaWkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX2Nhc19nZW5faSwgImlpRCppaSIsICJuIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX2N0YV9jYXNfZ2VuX2ksICJpaUQqaWkiLCAibiIsICJzYXRvbSIpCitUQVJHRVRfQlVJTFRJTihfX252dm1fYXRvbV9zeXNfY2FzX2dlbl9pLCAiaWlEKmlpIiwgIm4iLCAic2F0b20iKQorQlVJTFRJTihfX252dm1fYXRvbV9jYXNfZ19sLCAiTGlMaUQqMUxpTGkiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX2Nhc19zX2wsICJMaUxpRCozTGlMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fY2FzX2dlbl9sLCAiTGlMaUQqTGlMaSIsICJuIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX2N0YV9jYXNfZ2VuX2wsICJMaUxpRCpMaUxpIiwgIm4iLCAic2F0b20iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fc3lzX2Nhc19nZW5fbCwgIkxpTGlEKkxpTGkiLCAibiIsICJzYXRvbSIpCitCVUlMVElOKF9fbnZ2bV9hdG9tX2Nhc19nX2xsLCAiTExpTExpRCoxTExpTExpIiwgIm4iKQorQlVJTFRJTihfX252dm1fYXRvbV9jYXNfc19sbCwgIkxMaUxMaUQqM0xMaUxMaSIsICJuIikKK0JVSUxUSU4oX19udnZtX2F0b21fY2FzX2dlbl9sbCwgIkxMaUxMaUQqTExpTExpIiwgIm4iKQorVEFSR0VUX0JVSUxUSU4oX19udnZtX2F0b21fY3RhX2Nhc19nZW5fbGwsICJMTGlMTGlEKkxMaUxMaSIsICJuIiwgInNhdG9tIikKK1RBUkdFVF9CVUlMVElOKF9fbnZ2bV9hdG9tX3N5c19jYXNfZ2VuX2xsLCAiTExpTExpRCpMTGlMTGkiLCAibiIsICJzYXRvbSIpCisKKy8vIENvbXBpbGVyIEVycm9yIFdhcm4KK0JVSUxUSU4oX19udnZtX2NvbXBpbGVyX2Vycm9yLCAidmNDKjQiLCAibiIpCitCVUlMVElOKF9fbnZ2bV9jb21waWxlcl93YXJuLCAidmNDKjQiLCAibiIpCisKKy8vIF9fbGRnLiAgVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQgYXMgYSBidWlsdGluIGJ5IG52Y2MuCitCVUlMVElOKF9fbnZ2bV9sZGdfYywgImNjQyoiLCAiIikKK0JVSUxUSU4oX19udnZtX2xkZ19zLCAic3NDKiIsICIiKQorQlVJTFRJTihfX252dm1fbGRnX2ksICJpaUMqIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9sZGdfbCwgIkxpTGlDKiIsICIiKQorQlVJTFRJTihfX252dm1fbGRnX2xsLCAiTExpTExpQyoiLCAiIikKKworQlVJTFRJTihfX252dm1fbGRnX3VjLCAiVWNVY0MqIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9sZGdfdXMsICJVc1VzQyoiLCAiIikKK0JVSUxUSU4oX19udnZtX2xkZ191aSwgIlVpVWlDKiIsICIiKQorQlVJTFRJTihfX252dm1fbGRnX3VsLCAiVUxpVUxpQyoiLCAiIikKK0JVSUxUSU4oX19udnZtX2xkZ191bGwsICJVTExpVUxMaUMqIiwgIiIpCisKK0JVSUxUSU4oX19udnZtX2xkZ19mLCAiZmZDKiIsICIiKQorQlVJTFRJTihfX252dm1fbGRnX2QsICJkZEMqIiwgIiIpCisKK0JVSUxUSU4oX19udnZtX2xkZ19jMiwgIkUyY0UyY0MqIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9sZGdfYzQsICJFNGNFNGNDKiIsICIiKQorQlVJTFRJTihfX252dm1fbGRnX3MyLCAiRTJzRTJzQyoiLCAiIikKK0JVSUxUSU4oX19udnZtX2xkZ19zNCwgIkU0c0U0c0MqIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9sZGdfaTIsICJFMmlFMmlDKiIsICIiKQorQlVJTFRJTihfX252dm1fbGRnX2k0LCAiRTRpRTRpQyoiLCAiIikKK0JVSUxUSU4oX19udnZtX2xkZ19sbDIsICJFMkxMaUUyTExpQyoiLCAiIikKKworQlVJTFRJTihfX252dm1fbGRnX3VjMiwgIkUyVWNFMlVjQyoiLCAiIikKK0JVSUxUSU4oX19udnZtX2xkZ191YzQsICJFNFVjRTRVY0MqIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9sZGdfdXMyLCAiRTJVc0UyVXNDKiIsICIiKQorQlVJTFRJTihfX252dm1fbGRnX3VzNCwgIkU0VXNFNFVzQyoiLCAiIikKK0JVSUxUSU4oX19udnZtX2xkZ191aTIsICJFMlVpRTJVaUMqIiwgIiIpCitCVUlMVElOKF9fbnZ2bV9sZGdfdWk0LCAiRTRVaUU0VWlDKiIsICIiKQorQlVJTFRJTihfX252dm1fbGRnX3VsbDIsICJFMlVMTGlFMlVMTGlDKiIsICIiKQorCitCVUlMVElOKF9fbnZ2bV9sZGdfZjIsICJFMmZFMmZDKiIsICIiKQorQlVJTFRJTihfX252dm1fbGRnX2Y0LCAiRTRmRTRmQyoiLCAiIikKK0JVSUxUSU4oX19udnZtX2xkZ19kMiwgIkUyZEUyZEMqIiwgIiIpCisKKy8vIEJ1aWx0aW5zIHRvIHN1cHBvcnQgV01NQSBpbnN0cnVjdGlvbnMgb24gc21fNzAKK1RBUkdFVF9CVUlMVElOKF9faG1tYV9tMTZuMTZrMTZfbGRfYSwgInZpKmlDKlVpSWkiLCAiIiwgInB0eDYwIikKK1RBUkdFVF9CVUlMVElOKF9faG1tYV9tMTZuMTZrMTZfbGRfYiwgInZpKmlDKlVpSWkiLCAiIiwgInB0eDYwIikKK1RBUkdFVF9CVUlMVElOKF9faG1tYV9tMTZuMTZrMTZfbGRfY19mMTYsICJ2aSppQypVaUlpIiwgIiIsICJwdHg2MCIpCitUQVJHRVRfQlVJTFRJTihfX2htbWFfbTE2bjE2azE2X2xkX2NfZjMyLCAidmYqZkMqVWlJaSIsICIiLCAicHR4NjAiKQorVEFSR0VUX0JVSUxUSU4oX19obW1hX20xNm4xNmsxNl9zdF9jX2YxNiwgInZpKmkqVWlJaSIsICIiLCAicHR4NjAiKQorVEFSR0VUX0JVSUxUSU4oX19obW1hX20xNm4xNmsxNl9zdF9jX2YzMiwgInZmKmYqVWlJaSIsICIiLCAicHR4NjAiKQorCitUQVJHRVRfQlVJTFRJTihfX2htbWFfbTE2bjE2azE2X21tYV9mMTZmMTYsICJ2aSppQyppQyppQypJaUlpIiwgIiIsICJwdHg2MCIpCitUQVJHRVRfQlVJTFRJTihfX2htbWFfbTE2bjE2azE2X21tYV9mMzJmMTYsICJ2ZippQyppQyppQypJaUlpIiwgIiIsICJwdHg2MCIpCitUQVJHRVRfQlVJTFRJTihfX2htbWFfbTE2bjE2azE2X21tYV9mMzJmMzIsICJ2ZippQyppQypmQypJaUlpIiwgIiIsICJwdHg2MCIpCitUQVJHRVRfQlVJTFRJTihfX2htbWFfbTE2bjE2azE2X21tYV9mMTZmMzIsICJ2aSppQyppQypmQypJaUlpIiwgIiIsICJwdHg2MCIpCisKKyN1bmRlZiBCVUlMVElOCisjdW5kZWYgVEFSR0VUX0JVSUxUSU4KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zTmlvczIuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNOaW9zMi5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2OTdlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zTmlvczIuZGVmCkBAIC0wLDAgKzEsNzAgQEAKKy8vPT09LS0gQnVpbHRpbnNOaW9zMi5kZWYgLSBOaW9zMiBCdWlsdGluIGZ1bmN0aW9uIGRhdGFiYXNlIC0tLS0tLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgTmlvczItc3BlY2lmaWMgYnVpbHRpbiBmdW5jdGlvbiBkYXRhYmFzZS4gVXNlcnMgb2YKKy8vIHRoaXMgZmlsZSBtdXN0IGRlZmluZSB0aGUgQlVJTFRJTiBtYWNybyB0byBtYWtlIHVzZSBvZiB0aGlzIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFRoZSBmb3JtYXQgb2YgdGhpcyBkYXRhYmFzZSBtYXRjaGVzIGNsYW5nL0Jhc2ljL0J1aWx0aW5zLmRlZi4KKworI2lmIGRlZmluZWQoQlVJTFRJTikgJiYgIWRlZmluZWQoVEFSR0VUX0JVSUxUSU4pCisjICAgZGVmaW5lIFRBUkdFVF9CVUlMVElOKElELCBUWVBFLCBBVFRSUywgRkVBVFVSRSkgQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMpCisjZW5kaWYKKworLy8gTmlvczIgUjEgYnVpbHRpbnM6CisKKy8vaW50IF9fYnVpbHRpbl9sZGJpbyh2b2xhdGlsZSBjb25zdCB2b2lkICopOworQlVJTFRJTihfX2J1aWx0aW5fbGRiaW8sICJpdkRDKiIsICIiKQorLy9pbnQgX19idWlsdGluX2xkYnVpbyh2b2xhdGlsZSBjb25zdCB2b2lkICopOworQlVJTFRJTihfX2J1aWx0aW5fbGRidWlvLCAiaXZEQyoiLCAiIikKKy8vaW50IF9fYnVpbHRpbl9sZGhpbyh2b2xhdGlsZSBjb25zdCB2b2lkICopOworQlVJTFRJTihfX2J1aWx0aW5fbGRoaW8sICJpdkRDKiIsICIiKQorLy9pbnQgX19idWlsdGluX2xkaHVpbyh2b2xhdGlsZSBjb25zdCB2b2lkICopOworQlVJTFRJTihfX2J1aWx0aW5fbGRodWlvLCAiaXZEQyoiLCAiIikKKy8vaW50IF9fYnVpbHRpbl9sZHdpbyh2b2xhdGlsZSBjb25zdCB2b2lkICopOworQlVJTFRJTihfX2J1aWx0aW5fbGR3aW8sICJpdkRDKiIsICIiKQorLy9pbnQgX19idWlsdGluX2xkd3VpbyhpbnQpOworQlVJTFRJTihfX2J1aWx0aW5fbGR3dWlvLCAiaWkiLCAiIikKKy8vIGludCBfX2J1aWx0aW5fcmRjdGwoaW50KTsKK0JVSUxUSU4oX19idWlsdGluX3JkY3RsLCAiaUlpIiwgIiIpCisvLyB2b2lkIF9fYnVpbHRpbl93cmN0bChpbnQsIGludCk7CitCVUlMVElOKF9fYnVpbHRpbl93cmN0bCwgInZJaWkiLCAiIikKKy8vIGludCBfX2J1aWx0aW5fcmRwcnMoaW50LCBpbnQpOworQlVJTFRJTihfX2J1aWx0aW5fcmRwcnMsICJpaWkiLCAiIikKKy8vdm9pZCBfX2J1aWx0aW5fc3RiaW8odm9sYXRpbGUgdm9pZCAqLCBpbnQpOworQlVJTFRJTihfX2J1aWx0aW5fc3RiaW8sICJ2dkQqaSIsICIiKQorLy92b2lkIF9fYnVpbHRpbl9zdGhpbyh2b2xhdGlsZSB2b2lkICosIGludCk7CitCVUlMVElOKF9fYnVpbHRpbl9zdGhpbywgInZ2RCppIiwgIiIpCisvL3ZvaWQgX19idWlsdGluX3N0d2lvKHZvbGF0aWxlIHZvaWQgKiwgaW50KTsKK0JVSUxUSU4oX19idWlsdGluX3N0d2lvLCAidnZEKmkiLCAiIikKKy8vdm9pZCBfX2J1aWx0aW5fc3luYyh2b2lkKTsKK0JVSUxUSU4oX19idWlsdGluX3N5bmMsICJ2IiwgIiIpCisvLyB2b2lkIF9fYnVpbHRpbl9mbHVzaGQodm9sYXRpbGUgdm9pZCAqKTsKK0JVSUxUSU4oX19idWlsdGluX2ZsdXNoZCwgInZ2RCoiLCAiIikKKy8vIHZvaWQgX19idWlsdGluX2ZsdXNoZGEodm9sYXRpbGUgdm9pZCAqKTsKK0JVSUxUSU4oX19idWlsdGluX2ZsdXNoZGEsICJ2dkQqIiwgIiIpCisKKy8vIE5pb3MyIFIyIGJ1aWx0aW5zOgorCisvLyBpbnQgX19idWlsdGluX3dycGllKGludCk7CitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fd3JwaWUsICJpaSIsICIiLCAibmlvczJyMm1hbmRhdG9yeSIpCisvLyB2b2lkIF9fYnVpbHRpbl9lbmkoaW50KTsKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9lbmksICJ2aSIsICIiLCAibmlvczJyMm1hbmRhdG9yeSIpCisvLyBpbnQgX19idWlsdGluX2xkZXgodm9sYXRpbGUgY29uc3Qgdm9pZCAqKTsKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9sZGV4LCAiaXZEQyoiLCAiIiwgIm5pb3MycjJtYW5kYXRvcnkiKQorLy8gaW50IF9fYnVpbHRpbl9zdGV4KHZvbGF0aWxlIHZvaWQgKiwgaW50KTsKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zdGV4LCAiaXZEKmkiLCAiIiwgIm5pb3MycjJtYW5kYXRvcnkiKQorLy8gaW50IF9fYnVpbHRpbl9sZHNleCh2b2xhdGlsZSBjb25zdCB2b2lkICopOworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2xkc2V4LCAiaXZEQyoiLCAiIiwgIm5pb3MycjJtcHgiKQorLy8gaW50IF9fYnVpbHRpbl9zdHNleCh2b2xhdGlsZSB2b2lkICosIGludCk7CitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fc3RzZXgsICJpdkRDKmkiLCAiIiwgIm5pb3MycjJtcHgiKQorCisjdW5kZWYgQlVJTFRJTgorI3VuZGVmIFRBUkdFVF9CVUlMVElOCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc1BQQy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc1BQQy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhNzBhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zUFBDLmRlZgpAQCAtMCwwICsxLDQ2NiBAQAorLy89PT0tLS0gQnVpbHRpbnNQUEMuZGVmIC0gUG93ZXJQQyBCdWlsdGluIGZ1bmN0aW9uIGRhdGFiYXNlIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUG93ZXJQQy1zcGVjaWZpYyBidWlsdGluIGZ1bmN0aW9uIGRhdGFiYXNlLiAgVXNlcnMgb2YKKy8vIHRoaXMgZmlsZSBtdXN0IGRlZmluZSB0aGUgQlVJTFRJTiBtYWNybyB0byBtYWtlIHVzZSBvZiB0aGlzIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIEZJWE1FOiB0aGlzIG5lZWRzIHRvIGJlIHRoZSBmdWxsIGxpc3Qgc3VwcG9ydGVkIGJ5IEdDQy4gIFJpZ2h0IG5vdywgSSdtIGp1c3QKKy8vIGFkZGluZyBzdHVmZiBvbiBkZW1hbmQuCisKKy8vIFRoZSBmb3JtYXQgb2YgdGhpcyBkYXRhYmFzZSBtYXRjaGVzIGNsYW5nL0Jhc2ljL0J1aWx0aW5zLmRlZi4KKworQlVJTFRJTihfX2J1aWx0aW5fcHBjX2dldF90aW1lYmFzZSwgIlVMTGkiLCAibiIpCisKKy8vIFRoaXMgaXMganVzdCBhIHBsYWNlaG9sZGVyLCB0aGUgdHlwZXMgYW5kIGF0dHJpYnV0ZXMgYXJlIHdyb25nLgorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192YWRkY3V3LCAiVjRVaVY0VWlWNFVpIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmFkZHNicywgIlYxNlNjVjE2U2NWMTZTYyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192YWRkdWJzLCAiVjE2VWNWMTZVY1YxNlVjIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGRzaHMsICJWOFNzVjhTc1Y4U3MiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmFkZHVocywgIlY4VXNWOFVzVjhVcyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192YWRkc3dzLCAiVjRTaVY0U2lWNFNpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGR1d3MsICJWNFVpVjRVaVY0VWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmFkZGV1cW0sICJWMVVMTExpVjFVTExMaVYxVUxMTGlWMVVMTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmFkZGN1cSwgIlYxVUxMTGlWMVVMTExpVjFVTExMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGRlY3VxLCAiVjFVTExMaVYxVUxMTGlWMVVMTExpVjFVTExMaSIsIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnN1YnNicywgIlYxNlNjVjE2U2NWMTZTYyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192c3VidWJzLCAiVjE2VWNWMTZVY1YxNlVjIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJzaHMsICJWOFNzVjhTc1Y4U3MiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnN1YnVocywgIlY4VXNWOFVzVjhVcyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192c3Vic3dzLCAiVjRTaVY0U2lWNFNpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJ1d3MsICJWNFVpVjRVaVY0VWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnN1YmV1cW0sICJWMVVMTExpVjFVTExMaVYxVUxMTGlWMVVMTExpIiwiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnN1YmN1cSwgIlYxVUxMTGlWMVVMTExpVjFVTExMaSIsIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJlY3VxLCAiVjFVTExMaVYxVUxMTGlWMVVMTExpVjFVTExMaSIsIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmF2Z3NiLCAiVjE2U2NWMTZTY1YxNlNjIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3Zhdmd1YiwgIlYxNlVjVjE2VWNWMTZVYyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192YXZnc2gsICJWOFNzVjhTc1Y4U3MiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmF2Z3VoLCAiVjhVc1Y4VXNWOFVzIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZhdmdzdywgIlY0U2lWNFNpVjRTaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192YXZndXcsICJWNFVpVjRVaVY0VWkiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192cmZpcCwgIlY0ZlY0ZiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjZnN4LCAiVjRmVjRpSWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmNmdXgsICJWNGZWNGlJaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192Y3RzeHMsICJWNFNpVjRmSWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmN0dXhzLCAiVjRVaVY0ZklpIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfZHNzLCAidlVpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX2Rzc2FsbCwgInYiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfZHN0LCAidnZDKmlVaSIsICIiKSAKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfZHN0dCwgInZ2QyppVWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfZHN0c3QsICJ2dkMqaVVpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX2RzdHN0dCwgInZ2QyppVWkiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192ZXhwdGVmcCwgIlY0ZlY0ZiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZyZmltLCAiVjRmVjRmIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfbHZ4LCAiVjRpaXZDKiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY19sdnhsLCAiVjRpaXZDKiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY19sdmVieCwgIlYxNmNpdkMqIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX2x2ZWh4LCAiVjhzaXZDKiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY19sdmV3eCwgIlY0aWl2QyoiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192bG9nZWZwLCAiVjRmVjRmIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfbHZzbCwgIlYxNmNVY3ZDKiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY19sdnNyLCAiVjE2Y1VjdkMqIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdm1hZGRmcCwgIlY0ZlY0ZlY0ZlY0ZiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192bWhhZGRzaHMsICJWOHNWOHNWOHNWOHMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdm1ocmFkZHNocywgIlY4c1Y4c1Y4c1Y4cyIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3Ztc3VtdWJtLCAiVjRVaVYxNlVjVjE2VWNWNFVpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3Ztc3VtbWJtLCAiVjRTaVYxNlNjVjE2VWNWNFNpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3Ztc3VtdWhtLCAiVjRVaVY4VXNWOFVzVjRVaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192bXN1bXNobSwgIlY0U2lWOFNzVjhTc1Y0U2kiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdm1zdW11aHMsICJWNFVpVjhVc1Y4VXNWNFVpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3Ztc3Vtc2hzLCAiVjRTaVY4U3NWOFNzVjRTaSIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxldWIsICJWOFVzVjE2VWNWMTZVYyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192bXVsZXNiLCAiVjhTc1YxNlNjVjE2U2MiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdm11bGV1aCwgIlY0VWlWOFVzVjhVcyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192bXVsZXNoLCAiVjRTaVY4U3NWOFNzIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxldXcsICJWMlVMTGlWNFVpVjRVaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192bXVsZXN3LCAiVjJTTExpVjRTaVY0U2kiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdm11bG91YiwgIlY4VXNWMTZVY1YxNlVjIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxvc2IsICJWOFNzVjE2U2NWMTZTYyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192bXVsb3VoLCAiVjRVaVY4VXNWOFVzIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxvc2gsICJWNFNpVjhTc1Y4U3MiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdm11bG91dywgIlYyVUxMaVY0VWlWNFVpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxvc3csICJWMlNMTGlWNFNpVjRTaSIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZubXN1YmZwLCAiVjRmVjRmVjRmVjRmIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnBrcHgsICJWOHNWNFVpVjRVaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192cGt1aHVzLCAiVjE2VWNWOFVzVjhVcyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192cGtzaHNzLCAiVjE2U2NWOFNzVjhTcyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192cGt1d3VzLCAiVjhVc1Y0VWlWNFVpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3Zwa3N3c3MsICJWOFNzVjRTaVY0U2kiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnBrc2h1cywgIlYxNlVjVjhTc1Y4U3MiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnBrc3d1cywgIlY4VXNWNFNpVjRTaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192cGtzZHNzLCAiVjRTaVYyU0xMaVYyU0xMaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192cGtzZHVzLCAiVjRVaVYyU0xMaVYyU0xMaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192cGt1ZHVzLCAiVjRVaVYyVUxMaVYyVUxMaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192cGt1ZHVtLCAiVjRVaVYyVUxMaVYyVUxMaSIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZwZXJtXzRzaSwgIlY0aVY0aVY0aVYxNlVjIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfc3R2eCwgInZWNGlpdioiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfc3R2eGwsICJ2VjRpaXYqIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3N0dmVieCwgInZWMTZjaXYqIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3N0dmVoeCwgInZWOHNpdioiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfc3R2ZXd4LCAidlY0aWl2KiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBiZnAsICJWNGlWNGZWNGYiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192Y21wZ2VmcCwgIlY0aVY0ZlY0ZiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXViLCAiVjE2Y1YxNmNWMTZjIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVoLCAiVjhzVjhzVjhzIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXV3LCAiVjRpVjRpVjRpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVkLCAiVjJMTGlWMkxMaVYyTExpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcWZwLCAiVjRpVjRmVjRmIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmNtcG5lYiwgIlYxNmNWMTZjVjE2YyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192Y21wbmVoLCAiVjhzVjhzVjhzIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBuZXcsICJWNGlWNGlWNGkiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192Y21wbmV6YiwgIlYxNmNWMTZjVjE2YyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192Y21wbmV6aCwgIlY4c1Y4c1Y4cyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192Y21wbmV6dywgIlY0aVY0aVY0aSIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNiLCAiVjE2Y1YxNlNjVjE2U2MiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWIsICJWMTZjVjE2VWNWMTZVYyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzaCwgIlY4c1Y4U3NWOFNzIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoLCAiVjhzVjhVc1Y4VXMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c3csICJWNGlWNFNpVjRTaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1dywgIlY0aVY0VWlWNFVpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNkLCAiVjJMTGlWMkxMaVYyTExpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVkLCAiVjJMTGlWMlVMTGlWMlVMTGkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0ZnAsICJWNGlWNGZWNGYiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192bWF4c2IsICJWMTZTY1YxNlNjVjE2U2MiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdm1heHViLCAiVjE2VWNWMTZVY1YxNlVjIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXhzaCwgIlY4U3NWOFNzVjhTcyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192bWF4dWgsICJWOFVzVjhVc1Y4VXMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdm1heHN3LCAiVjRTaVY0U2lWNFNpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXh1dywgIlY0VWlWNFVpVjRVaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192bWF4c2QsICJWMkxMaVYyTExpVjJMTGkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdm1heHVkLCAiVjJVTExpVjJVTExpVjJVTExpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXhmcCwgIlY0ZlY0ZlY0ZiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX21mdnNjciwgIlY4VXMiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192bWluc2IsICJWMTZTY1YxNlNjVjE2U2MiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdm1pbnViLCAiVjE2VWNWMTZVY1YxNlVjIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW5zaCwgIlY4U3NWOFNzVjhTcyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192bWludWgsICJWOFVzVjhVc1Y4VXMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdm1pbnN3LCAiVjRTaVY0U2lWNFNpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW51dywgIlY0VWlWNFVpVjRVaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192bWluc2QsICJWMkxMaVYyTExpVjJMTGkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdm1pbnVkLCAiVjJVTExpVjJVTExpVjJVTExpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW5mcCwgIlY0ZlY0ZlY0ZiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX210dnNjciwgInZWNGkiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192cmVmcCwgIlY0ZlY0ZiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZybGIsICJWMTZjVjE2Y1YxNlVjIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZybGgsICJWOHNWOHNWOFVzIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZybHcsICJWNGlWNGlWNFVpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZybGQsICJWMkxMaVYyTExpVjJVTExpIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnNlbF80c2ksICJWNGlWNGlWNGlWNFVpIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnNsLCAiVjRpVjRpVjRpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZzbG8sICJWNGlWNGlWNGkiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192c3JhYiwgIlYxNmNWMTZjVjE2VWMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnNyYWgsICJWOHNWOHNWOFVzIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZzcmF3LCAiVjRpVjRpVjRVaSIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZzciwgIlY0aVY0aVY0aSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192c3JvLCAiVjRpVjRpVjRpIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnJmaW4sICJWNGZWNGYiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192cnNxcnRlZnAsICJWNGZWNGYiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192c3ViY3V3LCAiVjRVaVY0VWlWNFVpIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnN1bTRzYnMsICJWNFNpVjE2U2NWNFNpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZzdW00dWJzLCAiVjRVaVYxNlVjVjRVaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192c3VtNHNocywgIlY0U2lWOFNzVjRTaSIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZzdW0yc3dzLCAiVjRTaVY0U2lWNFNpIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnN1bXN3cywgIlY0U2lWNFNpVjRTaSIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZyZml6LCAiVjRmVjRmIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnVwa2hzYiwgIlY4c1YxNmMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnVwa2hweCwgIlY0VWlWOHMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnVwa2hzaCwgIlY0aVY4cyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192dXBraHN3LCAiVjJMTGlWNGkiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192dXBrbHNiLCAiVjhzVjE2YyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192dXBrbHB4LCAiVjRVaVY4cyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192dXBrbHNoLCAiVjRpVjhzIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtsc3csICJWMkxMaVY0aSIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBiZnBfcCwgImlpVjRmVjRmIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmNtcGdlZnBfcCwgImlpVjRmVjRmIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWJfcCwgImlpVjE2Y1YxNmMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWhfcCwgImlpVjhzVjhzIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXV3X3AsICJpaVY0aVY0aSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1ZF9wLCAiaWlWMkxMaVYyTExpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcWZwX3AsICJpaVY0ZlY0ZiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBuZWJfcCwgImlpVjE2Y1YxNmMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmNtcG5laF9wLCAiaWlWOHNWOHMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmNtcG5ld19wLCAiaWlWNGlWNGkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmNtcG5lZF9wLCAiaWlWMkxMaVYyTExpIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2JfcCwgImlpVjE2U2NWMTZTYyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1Yl9wLCAiaWlWMTZVY1YxNlVjIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNoX3AsICJpaVY4U3NWOFNzIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoX3AsICJpaVY4VXNWOFVzIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHN3X3AsICJpaVY0U2lWNFNpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AsICJpaVY0VWlWNFVpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNkX3AsICJpaVYyTExpVjJMTGkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWRfcCwgImlpVjJVTExpVjJVTExpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndGZwX3AsICJpaVY0ZlY0ZiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZnYmJkLCAiVjE2VWNWMTZVYyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192YnBlcm1xLCAiVjJVTExpVjE2VWNWMTZVYyIsICIiKQorCisvLyBQOCBDcnlwdG8gYnVpbHQtaW5zLgorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnNib3gsICJWMlVMTGlWMlVMTGkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZwZXJteG9yLCAiVjE2VWNWMTZVY1YxNlVjVjE2VWMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZzaGFzaWdtYXcsICJWNFVpVjRVaUlpSWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZzaGFzaWdtYWQsICJWMlVMTGlWMlVMTGlJaUlpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192Y2lwaGVyLCAiVjJVTExpVjJVTExpVjJVTExpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192Y2lwaGVybGFzdCwgIlYyVUxMaVYyVUxMaVYyVUxMaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdm5jaXBoZXIsICJWMlVMTGlWMlVMTGlWMlVMTGkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZuY2lwaGVybGFzdCwgIlYyVUxMaVYyVUxMaVYyVUxMaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnBtc3VtYiwgIlYxNlVjVjE2VWNWMTZVYyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnBtc3VtaCwgIlY4VXNWOFVzVjhVcyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnBtc3VtdywgIlY0VWlWNFVpVjRVaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnBtc3VtZCwgIlYyVUxMaVYyVUxMaVYyVUxMaSIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbHpiLCAiVjE2VWNWMTZVYyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192Y2x6aCwgIlY4VXNWOFVzIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbHp3LCAiVjRVaVY0VWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmNsemQsICJWMlVMTGlWMlVMTGkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmN0emIsICJWMTZVY1YxNlVjIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjdHpoLCAiVjhVc1Y4VXMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmN0encsICJWNFVpVjRVaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192Y3R6ZCwgIlYyVUxMaVYyVUxMaSIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZjbHpsc2JiLCAiU2lWMTZVYyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192Y3R6bHNiYiwgIlNpVjE2VWMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnBydHlidywgIlY0VWlWNFVpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZwcnR5YmQsICJWMlVMTGlWMlVMTGkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnBydHlicSwgIlYxVUxMTGlWMVVMTExpIiwgIiIpCisKKy8vIFZlY3RvciBwb3B1bGF0aW9uIGNvdW50IGJ1aWx0LWlucworQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192cG9wY250YiwgIlYxNlVjVjE2VWMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnBvcGNudGgsICJWOFVzVjhVcyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192cG9wY250dywgIlY0VWlWNFVpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3Zwb3BjbnRkLCAiVjJVTExpVjJVTExpIiwgIiIpCisKKy8vIEFic29sdXRlIGRpZmZlcmVuY2UgYnVpbHQtaW5zCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZhYnNkdWIsICJWMTZVY1YxNlVjVjE2VWMiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdmFic2R1aCwgIlY4VXNWOFVzVjhVcyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192YWJzZHV3LCAiVjRVaVY0VWlWNFVpIiwgIiIpCisKKy8vIFA5IFNoaWZ0IGJ1aWx0LWlucy4KK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnNsdiwgIlYxNlVjVjE2VWNWMTZVYyIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192c3J2LCAiVjE2VWNWMTZVY1YxNlVjIiwgIiIpCisKKy8vIFA5IFZlY3RvciByb3RhdGUgYnVpbHQtaW5zCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZybHdtaSwgIlY0VWlWNFVpVjRVaVY0VWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2FsdGl2ZWNfdnJsZG1pLCAiVjJVTExpVjJVTExpVjJVTExpVjJVTExpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9hbHRpdmVjX3ZybHdubSwgIlY0VWlWNFVpVjRVaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fYWx0aXZlY192cmxkbm0sICJWMlVMTGlWMlVMTGlWMlVMTGkiLCAiIikKKworLy8gVlNYIGJ1aWx0LWlucy4KKworQlVJTFRJTihfX2J1aWx0aW5fdnN4X2x4dmQyeCwgIlYyZGl2QyoiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3ZzeF9seHZ3NHgsICJWNGlpdkMqIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfbHh2ZDJ4X2JlLCAiVjJkU0xMaXZDKiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fdnN4X2x4dnc0eF9iZSwgIlY0aVNMTGl2QyoiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fdnN4X3N0eHZkMngsICJ2VjJkaXYqIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfc3R4dnc0eCwgInZWNGlpdioiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3ZzeF9zdHh2ZDJ4X2JlLCAidlYyZFNMTGl2QyoiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3ZzeF9zdHh2dzR4X2JlLCAidlY0aVNMTGl2QyoiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fdnN4X2x4dmwsICJWNGl2QypVTExpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfbHh2bGwsICJWNGl2QypVTExpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfc3R4dmwsICJ2VjRpdipVTExpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfc3R4dmxsLCAidlY0aXYqVUxMaSIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZtYXhkcCwgIlYyZFYyZFYyZCIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2bWF4c3AsICJWNGZWNGZWNGYiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94c21heGRwLCAiZGRkIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dm1pbmRwLCAiVjJkVjJkVjJkIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZtaW5zcCwgIlY0ZlY0ZlY0ZiIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fdnN4X3hzbWluZHAsICJkZGQiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2ZGl2ZHAsICJWMmRWMmRWMmQiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dmRpdnNwLCAiVjRmVjRmVjRmIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dnJkcGlwLCAiVjJkVjJkIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZyc3BpcCwgIlY0ZlY0ZiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZjbXBlcWRwLCAiVjJVTExpVjJkVjJkIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZjbXBlcXNwLCAiVjRVaVY0ZlY0ZiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZjbXBlcWRwX3AsICJpaVYyZFYyZCIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2Y21wZXFzcF9wLCAiaWlWNGZWNGYiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2Y21wZ2VkcCwgIlYyVUxMaVYyZFYyZCIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2Y21wZ2VzcCwgIlY0VWlWNGZWNGYiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2Y21wZ2VkcF9wLCAiaWlWMmRWMmQiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dmNtcGdlc3BfcCwgImlpVjRmVjRmIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dmNtcGd0ZHAsICJWMlVMTGlWMmRWMmQiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dmNtcGd0c3AsICJWNFVpVjRmVjRmIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dmNtcGd0ZHBfcCwgImlpVjJkVjJkIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZjbXBndHNwX3AsICJpaVY0ZlY0ZiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZyZHBpbSwgIlYyZFYyZCIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2cnNwaW0sICJWNGZWNGYiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2cmRwaSwgIlYyZFYyZCIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2cnNwaSwgIlY0ZlY0ZiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZyZHBpYywgIlYyZFYyZCIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2cnNwaWMsICJWNGZWNGYiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2cmRwaXosICJWMmRWMmQiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dnJzcGl6LCAiVjRmVjRmIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dm1hZGRhZHAsICJWMmRWMmRWMmRWMmQiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dm1hZGRhc3AsICJWNGZWNGZWNGZWNGYiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2bXN1YmFkcCwgIlYyZFYyZFYyZFYyZCIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2bXN1YmFzcCwgIlY0ZlY0ZlY0ZlY0ZiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZtdWxkcCwgIlYyZFYyZFYyZCIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2bXVsc3AsICJWNGZWNGZWNGYiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2bm1hZGRhZHAsICJWMmRWMmRWMmRWMmQiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dm5tYWRkYXNwLCAiVjRmVjRmVjRmVjRmIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dm5tc3ViYWRwLCAiVjJkVjJkVjJkVjJkIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZubXN1YmFzcCwgIlY0ZlY0ZlY0ZlY0ZiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZyZWRwLCAiVjJkVjJkIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZyZXNwLCAiVjRmVjRmIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dnJzcXJ0ZWRwLCAiVjJkVjJkIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZyc3FydGVzcCwgIlY0ZlY0ZiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZzcXJ0ZHAsICJWMmRWMmQiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dnNxcnRzcCwgIlY0ZlY0ZiIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHhsZXF2LCAiVjRVaVY0VWlWNFVpIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dmNwc2duZHAsICJWMmRWMmRWMmQiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dmNwc2duc3AsICJWNGZWNGZWNGYiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2YWJzc3AsICJWNGZWNGYiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dmFic2RwLCAiVjJkVjJkIiwgIiIpCisKKy8vIHZlY3RvciBJbnNlcnQvRXh0cmFjdCBleHBvbmVudC9zaWduaWZpY2FuZCBidWlsdGlucworQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2aWV4cGRwLCAiVjJkVjJVTExpVjJVTExpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZpZXhwc3AsICJWNGZWNFVpVjRVaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2eGV4cGRwLCAiVjJVTExpVjJkIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZ4ZXhwc3AsICJWNFVpVjRmIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZ4c2lnZHAsICJWMlVMTGlWMmQiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dnhzaWdzcCwgIlY0VWlWNGYiLCAiIikKKworLy8gQ29udmVyc2lvbiBidWlsdGlucworQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2Y3ZkcHN4d3MsICJWNFNpVjJkIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZjdmRwdXh3cywgIlY0VWlWMmQiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dmN2c3h3ZHAsICJWMmRWNFNpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZjdnV4d2RwLCAiVjJkVjRVaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2Y3ZzcGRwLCAiVjJkVjRmIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZjdnN4ZHNwLCAiVjRmVjJTTExpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZjdnV4ZHNwLCAiVjRmVjJVTExpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZjdmRwc3AsICJWNGZWMmQiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2Y3ZzcGhwLCAiVjRmVjRmIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl92c3hfeHZjdmhwc3AsICJWNGZWOFVzIiwgIiIpCisKKy8vIFZlY3RvciBUZXN0IERhdGEgQ2xhc3MgYnVpbHRpbnMKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94dnRzdGRjZHAsICJWMlVMTGlWMmRJaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h2dHN0ZGNzcCwgIlY0VWlWNGZJaSIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl92c3hfaW5zZXJ0d29yZCwgIlYxNlVjVjRVaVYxNlVjSWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3ZzeF9leHRyYWN0dXdvcmQsICJWMlVMTGlWMTZVY0lpIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX3ZzeF94eHBlcm1kaSwgInYuIiwgInQiKQorQlVJTFRJTihfX2J1aWx0aW5fdnN4X3h4c2xkd2ksICJ2LiIsICJ0IikKKworLy8gSFRNIGJ1aWx0aW5zCitCVUlMVElOKF9fYnVpbHRpbl90YmVnaW4sICJVaVVJaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fdGVuZCwgIlVpVUlpIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX3RhYm9ydCwgIlVpVWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3RhYm9ydGRjLCAiVWlVaVVpVWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3RhYm9ydGRjaSwgIlVpVWlVaWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3RhYm9ydHdjLCAiVWlVaVVpVWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3RhYm9ydHdjaSwgIlVpVWlVaWkiLCAiIikKKworQlVJTFRJTihfX2J1aWx0aW5fdGNoZWNrLCAiVWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3RyZWNsYWltLCAiVWlVaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fdHJlY2hrcHQsICJVaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fdHNyLCAiVWlVaSIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl90ZW5kYWxsLCAiVWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX3RyZXN1bWUsICJVaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5fdHN1c3BlbmQsICJVaSIsICIiKQorCitCVUlMVElOKF9fYnVpbHRpbl9nZXRfdGV4YXNyLCAiTFVpIiwgImMiKQorQlVJTFRJTihfX2J1aWx0aW5fZ2V0X3RleGFzcnUsICJMVWkiLCAiYyIpCitCVUlMVElOKF9fYnVpbHRpbl9nZXRfdGZoYXIsICJMVWkiLCAiYyIpCitCVUlMVElOKF9fYnVpbHRpbl9nZXRfdGZpYXIsICJMVWkiLCAiYyIpCisKK0JVSUxUSU4oX19idWlsdGluX3NldF90ZXhhc3IsICJ2TFVpIiwgImMiKQorQlVJTFRJTihfX2J1aWx0aW5fc2V0X3RleGFzcnUsICJ2TFVpIiwgImMiKQorQlVJTFRJTihfX2J1aWx0aW5fc2V0X3RmaGFyLCAidkxVaSIsICJjIikKK0JVSUxUSU4oX19idWlsdGluX3NldF90ZmlhciwgInZMVWkiLCAiYyIpCisKK0JVSUxUSU4oX19idWlsdGluX3R0ZXN0LCAiTFVpIiwgIiIpCisKKy8vIFNjYWxhciBidWlsdC1pbnMKK0JVSUxUSU4oX19idWlsdGluX2RpdndlLCAiU2lTaVNpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9kaXZ3ZXUsICJVaVVpVWkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2RpdmRlLCAiU0xMaVNMTGlTTExpIiwgIiIpCitCVUlMVElOKF9fYnVpbHRpbl9kaXZkZXUsICJVTExpVUxMaVVMTGkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2JwZXJtZCwgIlNMTGlTTExpU0xMaSIsICIiKQorCisvLyBGSVhNRTogT2J2aW91c2x5IGluY29tcGxldGUuCisKKyN1bmRlZiBCVUlMVElOCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc1N5c3RlbVouZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNTeXN0ZW1aLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzkyMjg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNTeXN0ZW1aLmRlZgpAQCAtMCwwICsxLDI4MSBAQAorLy89PT0tLSBCdWlsdGluc1N5c3RlbVouZGVmIC0gU3lzdGVtWiBCdWlsdGluIGZ1bmN0aW9uIGRhdGFiYXNlIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgU3lzdGVtWi1zcGVjaWZpYyBidWlsdGluIGZ1bmN0aW9uIGRhdGFiYXNlLiAgVXNlcnMgb2YKKy8vIHRoaXMgZmlsZSBtdXN0IGRlZmluZSB0aGUgQlVJTFRJTiBtYWNybyB0byBtYWtlIHVzZSBvZiB0aGlzIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFRoZSBmb3JtYXQgb2YgdGhpcyBkYXRhYmFzZSBtYXRjaGVzIGNsYW5nL0Jhc2ljL0J1aWx0aW5zLmRlZi4KKworI2lmIGRlZmluZWQoQlVJTFRJTikgJiYgIWRlZmluZWQoVEFSR0VUX0JVSUxUSU4pCisjICAgZGVmaW5lIFRBUkdFVF9CVUlMVElOKElELCBUWVBFLCBBVFRSUywgRkVBVFVSRSkgQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMpCisjZW5kaWYKKworLy8gVHJhbnNhY3Rpb25hbC1tZW1vcnkgaW50cmluc2ljcworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3RiZWdpbiwgIml2KiIsICJqIiwgInRyYW5zYWN0aW9uYWwtZXhlY3V0aW9uIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl90YmVnaW5fbm9mbG9hdCwgIml2KiIsICJqIiwgInRyYW5zYWN0aW9uYWwtZXhlY3V0aW9uIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl90YmVnaW5jLCAidiIsICJuaiIsICJ0cmFuc2FjdGlvbmFsLWV4ZWN1dGlvbiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fdGFib3J0LCAidmkiLCAiciIsICJ0cmFuc2FjdGlvbmFsLWV4ZWN1dGlvbiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fdGVuZCwgImkiLCAibiIsICJ0cmFuc2FjdGlvbmFsLWV4ZWN1dGlvbiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fdHhfbmVzdGluZ19kZXB0aCwgImkiLCAibmMiLCAidHJhbnNhY3Rpb25hbC1leGVjdXRpb24iKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3R4X2Fzc2lzdCwgInZpIiwgIm4iLCAidHJhbnNhY3Rpb25hbC1leGVjdXRpb24iKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX25vbl90eF9zdG9yZSwgInZVTGkqVUxpIiwgIiIsICJ0cmFuc2FjdGlvbmFsLWV4ZWN1dGlvbiIpCisKKy8vIFZlY3RvciBpbnRyaW5zaWNzLgorLy8gVGhlc2UgYWxsIG1hcCBkaXJlY3RseSB0byB6IGluc3RydWN0aW9ucywgZXhjZXB0IHRoYXQgc29tZSB2YXJpYW50cyBlbmRpbmcKKy8vIGluICJzIiBoYXZlIGEgZmluYWwgImludCAqIiB0aGF0IHJlY2VpdmVzIHRoZSBwb3N0LWluc3RydWN0aW9uIENDIHZhbHVlLgorCisvLyBWZWN0b3Igc3VwcG9ydCBpbnN0cnVjdGlvbnMgKGNoYXB0ZXIgMjEgb2YgdGhlIFBvUCkKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX2xjYmIsICJVaXZDKklpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92bGJiLCAiVjE2U2N2QypJaSIsICIiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZsbCwgIlYxNlNjVWl2QyoiLCAiIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92c3RsLCAidlYxNlNjVWl2KiIsICIiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZwZXJtLCAiVjE2VWNWMTZVY1YxNlVjVjE2VWMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZwZGksICJWMlVMTGlWMlVMTGlWMlVMTGlJaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnBrc2gsICJWMTZTY1Y4U3NWOFNzIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92cGtzaHMsICJWMTZTY1Y4U3NWOFNzaSoiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3Zwa3NmLCAiVjhTc1Y0U2lWNFNpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92cGtzZnMsICJWOFNzVjRTaVY0U2lpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnBrc2csICJWNFNpVjJTTExpVjJTTExpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92cGtzZ3MsICJWNFNpVjJTTExpVjJTTExpaSoiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3Zwa2xzaCwgIlYxNlVjVjhVc1Y4VXMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3Zwa2xzaHMsICJWMTZVY1Y4VXNWOFVzaSoiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3Zwa2xzZiwgIlY4VXNWNFVpVjRVaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnBrbHNmcywgIlY4VXNWNFVpVjRVaWkqIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92cGtsc2csICJWNFVpVjJVTExpVjJVTExpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92cGtsc2dzLCAiVjRVaVYyVUxMaVYyVUxMaWkqIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92dXBoYiwgIlY4U3NWMTZTYyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnVwaGgsICJWNFNpVjhTcyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnVwaGYsICJWMlNMTGlWNFNpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92dXBsYiwgIlY4U3NWMTZTYyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnVwbGh3LCAiVjRTaVY4U3MiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3Z1cGxmLCAiVjJTTExpVjRTaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnVwbGhiLCAiVjhVc1YxNlVjIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92dXBsaGgsICJWNFVpVjhVcyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnVwbGhmLCAiVjJVTExpVjRVaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnVwbGxiLCAiVjhVc1YxNlVjIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92dXBsbGgsICJWNFVpVjhVcyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnVwbGxmLCAiVjJVTExpVjRVaSIsICJuYyIsICJ2ZWN0b3IiKQorCisvLyBWZWN0b3IgaW50ZWdlciBpbnN0cnVjdGlvbnMgKGNoYXB0ZXIgMjIgb2YgdGhlIFBvUCkKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZhcSwgIlYxNlVjVjE2VWNWMTZVYyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmFjcSwgIlYxNlVjVjE2VWNWMTZVY1YxNlVjIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92YWNjYiwgIlYxNlVjVjE2VWNWMTZVYyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmFjY2gsICJWOFVzVjhVc1Y4VXMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZhY2NmLCAiVjRVaVY0VWlWNFVpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92YWNjZywgIlYyVUxMaVYyVUxMaVYyVUxMaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmFjY3EsICJWMTZVY1YxNlVjVjE2VWMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZhY2NjcSwgIlYxNlVjVjE2VWNWMTZVY1YxNlVjIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92YXZnYiwgIlYxNlNjVjE2U2NWMTZTYyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmF2Z2gsICJWOFNzVjhTc1Y4U3MiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZhdmdmLCAiVjRTaVY0U2lWNFNpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92YXZnZywgIlYyU0xMaVYyU0xMaVYyU0xMaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmF2Z2xiLCAiVjE2VWNWMTZVY1YxNlVjIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92YXZnbGgsICJWOFVzVjhVc1Y4VXMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZhdmdsZiwgIlY0VWlWNFVpVjRVaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmF2Z2xnLCAiVjJVTExpVjJVTExpVjJVTExpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92Y2VxYnMsICJWMTZTY1YxNlNjVjE2U2NpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmNlcWhzLCAiVjhTc1Y4U3NWOFNzaSoiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZjZXFmcywgIlY0U2lWNFNpVjRTaWkqIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92Y2VxZ3MsICJWMlNMTGlWMlNMTGlWMlNMTGlpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmNoYnMsICJWMTZTY1YxNlNjVjE2U2NpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmNoaHMsICJWOFNzVjhTc1Y4U3NpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmNoZnMsICJWNFNpVjRTaVY0U2lpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmNoZ3MsICJWMlNMTGlWMlNMTGlWMlNMTGlpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmNobGJzLCAiVjE2U2NWMTZVY1YxNlVjaSoiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZjaGxocywgIlY4U3NWOFVzVjhVc2kqIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92Y2hsZnMsICJWNFNpVjRVaVY0VWlpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmNobGdzLCAiVjJTTExpVjJVTExpVjJVTExpaSoiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3Zja3NtLCAiVjRVaVY0VWlWNFVpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92Y2x6YiwgIlYxNlVjVjE2VWMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZjbHpoLCAiVjhVc1Y4VXMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZjbHpmLCAiVjRVaVY0VWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZjbHpnLCAiVjJVTExpVjJVTExpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92Y3R6YiwgIlYxNlVjVjE2VWMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZjdHpoLCAiVjhVc1Y4VXMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZjdHpmLCAiVjRVaVY0VWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZjdHpnLCAiVjJVTExpVjJVTExpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92ZXJpbWIsICJWMTZVY1YxNlVjVjE2VWNWMTZVY0lpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92ZXJpbWgsICJWOFVzVjhVc1Y4VXNWOFVzSWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZlcmltZiwgIlY0VWlWNFVpVjRVaVY0VWlJaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmVyaW1nLCAiVjJVTExpVjJVTExpVjJVTExpVjJVTExpSWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZlcmxsYiwgIlYxNlVjVjE2VWNVaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmVybGxoLCAiVjhVc1Y4VXNVaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmVybGxmLCAiVjRVaVY0VWlVaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmVybGxnLCAiVjJVTExpVjJVTExpVWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZlcmxsdmIsICJWMTZVY1YxNlVjVjE2VWMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZlcmxsdmgsICJWOFVzVjhVc1Y4VXMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZlcmxsdmYsICJWNFVpVjRVaVY0VWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZlcmxsdmcsICJWMlVMTGlWMlVMTGlWMlVMTGkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZnZm1iLCAiVjhVc1YxNlVjVjE2VWMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZnZm1oLCAiVjRVaVY4VXNWOFVzIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92Z2ZtZiwgIlYyVUxMaVY0VWlWNFVpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92Z2ZtZywgIlYxNlVjVjJVTExpVjJVTExpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92Z2ZtYWIsICJWOFVzVjE2VWNWMTZVY1Y4VXMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZnZm1haCwgIlY0VWlWOFVzVjhVc1Y0VWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZnZm1hZiwgIlYyVUxMaVY0VWlWNFVpVjJVTExpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92Z2ZtYWcsICJWMTZVY1YyVUxMaVYyVUxMaVYxNlVjIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92bWFoYiwgIlYxNlNjVjE2U2NWMTZTY1YxNlNjIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92bWFoaCwgIlY4U3NWOFNzVjhTc1Y4U3MiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZtYWhmLCAiVjRTaVY0U2lWNFNpVjRTaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdm1hbGhiLCAiVjE2VWNWMTZVY1YxNlVjVjE2VWMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZtYWxoaCwgIlY4VXNWOFVzVjhVc1Y4VXMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZtYWxoZiwgIlY0VWlWNFVpVjRVaVY0VWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZtYWViLCAiVjhTc1YxNlNjVjE2U2NWOFNzIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92bWFlaCwgIlY0U2lWOFNzVjhTc1Y0U2kiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZtYWVmLCAiVjJTTExpVjRTaVY0U2lWMlNMTGkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZtYWxlYiwgIlY4VXNWMTZVY1YxNlVjVjhVcyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdm1hbGVoLCAiVjRVaVY4VXNWOFVzVjRVaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdm1hbGVmLCAiVjJVTExpVjRVaVY0VWlWMlVMTGkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZtYW9iLCAiVjhTc1YxNlNjVjE2U2NWOFNzIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92bWFvaCwgIlY0U2lWOFNzVjhTc1Y0U2kiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZtYW9mLCAiVjJTTExpVjRTaVY0U2lWMlNMTGkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZtYWxvYiwgIlY4VXNWMTZVY1YxNlVjVjhVcyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdm1hbG9oLCAiVjRVaVY4VXNWOFVzVjRVaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdm1hbG9mLCAiVjJVTExpVjRVaVY0VWlWMlVMTGkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZtaGIsICJWMTZTY1YxNlNjVjE2U2MiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZtaGgsICJWOFNzVjhTc1Y4U3MiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZtaGYsICJWNFNpVjRTaVY0U2kiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZtbGhiLCAiVjE2VWNWMTZVY1YxNlVjIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92bWxoaCwgIlY4VXNWOFVzVjhVcyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdm1saGYsICJWNFVpVjRVaVY0VWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZtZWIsICJWOFNzVjE2U2NWMTZTYyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdm1laCwgIlY0U2lWOFNzVjhTcyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdm1lZiwgIlYyU0xMaVY0U2lWNFNpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92bWxlYiwgIlY4VXNWMTZVY1YxNlVjIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92bWxlaCwgIlY0VWlWOFVzVjhVcyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdm1sZWYsICJWMlVMTGlWNFVpVjRVaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdm1vYiwgIlY4U3NWMTZTY1YxNlNjIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92bW9oLCAiVjRTaVY4U3NWOFNzIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92bW9mLCAiVjJTTExpVjRTaVY0U2kiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZtbG9iLCAiVjhVc1YxNlVjVjE2VWMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZtbG9oLCAiVjRVaVY4VXNWOFVzIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92bWxvZiwgIlYyVUxMaVY0VWlWNFVpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92cG9wY3RiLCAiVjE2VWNWMTZVYyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnBvcGN0aCwgIlY4VXNWOFVzIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92cG9wY3RmLCAiVjRVaVY0VWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3Zwb3BjdGcsICJWMlVMTGlWMlVMTGkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZzcSwgIlYxNlVjVjE2VWNWMTZVYyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnNiY2JpcSwgIlYxNlVjVjE2VWNWMTZVY1YxNlVjIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92c2JpcSwgIlYxNlVjVjE2VWNWMTZVY1YxNlVjIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92c2NiaWIsICJWMTZVY1YxNlVjVjE2VWMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZzY2JpaCwgIlY4VXNWOFVzVjhVcyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnNjYmlmLCAiVjRVaVY0VWlWNFVpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92c2NiaWcsICJWMlVMTGlWMlVMTGlWMlVMTGkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZzY2JpcSwgIlYxNlVjVjE2VWNWMTZVYyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnNsLCAiVjE2VWNWMTZVY1YxNlVjIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92c2xiLCAiVjE2VWNWMTZVY1YxNlVjIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92c2xkYiwgIlYxNlVjVjE2VWNWMTZVY0lpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92c3JhLCAiVjE2VWNWMTZVY1YxNlVjIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92c3JhYiwgIlYxNlVjVjE2VWNWMTZVYyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnNybCwgIlYxNlVjVjE2VWNWMTZVYyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnNybGIsICJWMTZVY1YxNlVjVjE2VWMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZzdW1iLCAiVjRVaVYxNlVjVjE2VWMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZzdW1oLCAiVjRVaVY4VXNWOFVzIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92c3VtZ2gsICJWMlVMTGlWOFVzVjhVcyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnN1bWdmLCAiVjJVTExpVjRVaVY0VWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZzdW1xZiwgIlYxNlVjVjRVaVY0VWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZzdW1xZywgIlYxNlVjVjJVTExpVjJVTExpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92dG0sICJpVjE2VWNWMTZVYyIsICJuYyIsICJ2ZWN0b3IiKQorCisvLyBWZWN0b3Igc3RyaW5nIGluc3RydWN0aW9ucyAoY2hhcHRlciAyMyBvZiB0aGUgUG9QKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZhZWIsICJWMTZVY1YxNlVjVjE2VWNJaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZhZWJzLCAiVjE2VWNWMTZVY1YxNlVjSWlpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZhZWgsICJWOFVzVjhVc1Y4VXNJaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZhZWhzLCAiVjhVc1Y4VXNWOFVzSWlpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZhZWYsICJWNFVpVjRVaVY0VWlJaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZhZWZzLCAiVjRVaVY0VWlWNFVpSWlpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZhZXpiLCAiVjE2VWNWMTZVY1YxNlVjSWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZmYWV6YnMsICJWMTZVY1YxNlVjVjE2VWNJaWkqIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92ZmFlemgsICJWOFVzVjhVc1Y4VXNJaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZhZXpocywgIlY4VXNWOFVzVjhVc0lpaSoiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZmYWV6ZiwgIlY0VWlWNFVpVjRVaUlpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92ZmFlemZzLCAiVjRVaVY0VWlWNFVpSWlpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZlZWIsICJWMTZVY1YxNlVjVjE2VWMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZmZWVicywgIlYxNlVjVjE2VWNWMTZVY2kqIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92ZmVlaCwgIlY4VXNWOFVzVjhVcyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZlZWhzLCAiVjhVc1Y4VXNWOFVzaSoiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZmZWVmLCAiVjRVaVY0VWlWNFVpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92ZmVlZnMsICJWNFVpVjRVaVY0VWlpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZlZXpiLCAiVjE2VWNWMTZVY1YxNlVjIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92ZmVlemJzLCAiVjE2VWNWMTZVY1YxNlVjaSoiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZmZWV6aCwgIlY4VXNWOFVzVjhVcyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZlZXpocywgIlY4VXNWOFVzVjhVc2kqIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92ZmVlemYsICJWNFVpVjRVaVY0VWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZmZWV6ZnMsICJWNFVpVjRVaVY0VWlpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZlbmViLCAiVjE2VWNWMTZVY1YxNlVjIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92ZmVuZWJzLCAiVjE2VWNWMTZVY1YxNlVjaSoiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZmZW5laCwgIlY4VXNWOFVzVjhVcyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZlbmVocywgIlY4VXNWOFVzVjhVc2kqIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92ZmVuZWYsICJWNFVpVjRVaVY0VWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZmZW5lZnMsICJWNFVpVjRVaVY0VWlpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZlbmV6YiwgIlYxNlVjVjE2VWNWMTZVYyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZlbmV6YnMsICJWMTZVY1YxNlVjVjE2VWNpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZlbmV6aCwgIlY4VXNWOFVzVjhVcyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZlbmV6aHMsICJWOFVzVjhVc1Y4VXNpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZlbmV6ZiwgIlY0VWlWNFVpVjRVaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZlbmV6ZnMsICJWNFVpVjRVaVY0VWlpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmlzdHJiLCAiVjE2VWNWMTZVYyIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmlzdHJicywgIlYxNlVjVjE2VWNpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmlzdHJoLCAiVjhVc1Y4VXMiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3Zpc3RyaHMsICJWOFVzVjhVc2kqIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92aXN0cmYsICJWNFVpVjRVaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmlzdHJmcywgIlY0VWlWNFVpaSoiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZzdHJjYiwgIlYxNlVjVjE2VWNWMTZVY1YxNlVjSWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZzdHJjYnMsICJWMTZVY1YxNlVjVjE2VWNWMTZVY0lpaSoiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZzdHJjaCwgIlY4VXNWOFVzVjhVc1Y4VXNJaSIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnN0cmNocywgIlY4VXNWOFVzVjhVc1Y4VXNJaWkqIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92c3RyY2YsICJWNFVpVjRVaVY0VWlWNFVpSWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZzdHJjZnMsICJWNFVpVjRVaVY0VWlWNFVpSWlpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnN0cmN6YiwgIlYxNlVjVjE2VWNWMTZVY1YxNlVjSWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZzdHJjemJzLCAiVjE2VWNWMTZVY1YxNlVjVjE2VWNJaWkqIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92c3RyY3poLCAiVjhVc1Y4VXNWOFVzVjhVc0lpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92c3RyY3pocywgIlY4VXNWOFVzVjhVc1Y4VXNJaWkqIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92c3RyY3pmLCAiVjRVaVY0VWlWNFVpVjRVaUlpIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92c3RyY3pmcywgIlY0VWlWNFVpVjRVaVY0VWlJaWkqIiwgIm5jIiwgInZlY3RvciIpCisKKy8vIFZlY3RvciBmbG9hdGluZy1wb2ludCBpbnN0cnVjdGlvbnMgKGNoYXB0ZXIgMjQgb2YgdGhlIFBvUCkKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZmY2VkYnMsICJWMlNMTGlWMmRWMmRpKiIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZjaGRicywgIlYyU0xMaVYyZFYyZGkqIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92ZmNoZWRicywgIlYyU0xMaVYyZFYyZGkqIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92ZmlkYiwgIlYyZFYyZElpSWkiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZmbG5kYiwgIlYyZFYyZCIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZscGRiLCAiVjJkVjJkIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92Zm1hZGIsICJWMmRWMmRWMmRWMmQiLCAibmMiLCAidmVjdG9yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZmbXNkYiwgIlYyZFYyZFYyZFYyZCIsICJuYyIsICJ2ZWN0b3IiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZzcWRiLCAiVjJkVjJkIiwgIm5jIiwgInZlY3RvciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92ZnRjaWRiLCAiVjJTTExpVjJkSWlpKiIsICJuYyIsICJ2ZWN0b3IiKQorCisvLyBWZWN0b3ItZW5oYW5jZW1lbnRzIGZhY2lsaXR5IDEgaW50cmluc2ljcy4KK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZscmwsICJWMTZTY1VpdkMqIiwgIiIsICJ2ZWN0b3ItZW5oYW5jZW1lbnRzLTEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdnN0cmwsICJ2VjE2U2NVaXYqIiwgIiIsICJ2ZWN0b3ItZW5oYW5jZW1lbnRzLTEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmJwZXJtLCAiVjJVTExpVjE2VWNWMTZVYyIsICJuYyIsICJ2ZWN0b3ItZW5oYW5jZW1lbnRzLTEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdm1zbGcsICJWMTZVY1YyVUxMaVYyVUxMaVYxNlVjSWkiLCAibmMiLCAidmVjdG9yLWVuaGFuY2VtZW50cy0xIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZmbWF4ZGIsICJWMmRWMmRWMmRJaSIsICJuYyIsICJ2ZWN0b3ItZW5oYW5jZW1lbnRzLTEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZtaW5kYiwgIlYyZFYyZFYyZElpIiwgIm5jIiwgInZlY3Rvci1lbmhhbmNlbWVudHMtMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92Zm5tYWRiLCAiVjJkVjJkVjJkVjJkIiwgIm5jIiwgInZlY3Rvci1lbmhhbmNlbWVudHMtMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92Zm5tc2RiLCAiVjJkVjJkVjJkVjJkIiwgIm5jIiwgInZlY3Rvci1lbmhhbmNlbWVudHMtMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92ZmNlc2JzLCAiVjRTaVY0ZlY0ZmkqIiwgIm5jIiwgInZlY3Rvci1lbmhhbmNlbWVudHMtMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92ZmNoc2JzLCAiVjRTaVY0ZlY0ZmkqIiwgIm5jIiwgInZlY3Rvci1lbmhhbmNlbWVudHMtMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92ZmNoZXNicywgIlY0U2lWNGZWNGZpKiIsICJuYyIsICJ2ZWN0b3ItZW5oYW5jZW1lbnRzLTEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZpc2IsICJWNGZWNGZJaUlpIiwgIm5jIiwgInZlY3Rvci1lbmhhbmNlbWVudHMtMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92Zm1heHNiLCAiVjRmVjRmVjRmSWkiLCAibmMiLCAidmVjdG9yLWVuaGFuY2VtZW50cy0xIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZmbWluc2IsICJWNGZWNGZWNGZJaSIsICJuYyIsICJ2ZWN0b3ItZW5oYW5jZW1lbnRzLTEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZsbnNiLCAiVjRmVjRmIiwgIm5jIiwgInZlY3Rvci1lbmhhbmNlbWVudHMtMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92Zmxwc2IsICJWNGZWNGYiLCAibmMiLCAidmVjdG9yLWVuaGFuY2VtZW50cy0xIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZmbWFzYiwgIlY0ZlY0ZlY0ZlY0ZiIsICJuYyIsICJ2ZWN0b3ItZW5oYW5jZW1lbnRzLTEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX3MzOTBfdmZtc3NiLCAiVjRmVjRmVjRmVjRmIiwgIm5jIiwgInZlY3Rvci1lbmhhbmNlbWVudHMtMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92Zm5tYXNiLCAiVjRmVjRmVjRmVjRmIiwgIm5jIiwgInZlY3Rvci1lbmhhbmNlbWVudHMtMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92Zm5tc3NiLCAiVjRmVjRmVjRmVjRmIiwgIm5jIiwgInZlY3Rvci1lbmhhbmNlbWVudHMtMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5fczM5MF92ZnNxc2IsICJWNGZWNGYiLCAibmMiLCAidmVjdG9yLWVuaGFuY2VtZW50cy0xIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9zMzkwX3ZmdGNpc2IsICJWNFNpVjRmSWlpKiIsICJuYyIsICJ2ZWN0b3ItZW5oYW5jZW1lbnRzLTEiKQorCisjdW5kZWYgQlVJTFRJTgorI3VuZGVmIFRBUkdFVF9CVUlMVElOCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc1dlYkFzc2VtYmx5LmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zV2ViQXNzZW1ibHkuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OTgxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc1dlYkFzc2VtYmx5LmRlZgpAQCAtMCwwICsxLDM2IEBACisvLyBCdWlsdGluc1dlYkFzc2VtYmx5LmRlZiAtIFdlYkFzc2VtYmx5IGJ1aWx0aW4gZnVuY3Rpb24gZGF0YWJhc2UgLSotIEMrKyAtKi0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgVGhpcyBmaWxlIGRlZmluZXMgdGhlIFdlYkFzc2VtYmx5LXNwZWNpZmljIGJ1aWx0aW4gZnVuY3Rpb24gZGF0YWJhc2UuCisvLy8gVXNlcnMgb2YgdGhpcyBmaWxlIG11c3QgZGVmaW5lIHRoZSBCVUlMVElOIG1hY3JvIHRvIG1ha2UgdXNlIG9mIHRoaXMKKy8vLyBpbmZvcm1hdGlvbi4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gVGhlIGZvcm1hdCBvZiB0aGlzIGRhdGFiYXNlIG1hdGNoZXMgY2xhbmcvQmFzaWMvQnVpbHRpbnMuZGVmLgorCisvLyBRdWVyeSB0aGUgY3VycmVudCBtZW1vcnkgc2l6ZSwgYW5kIGluY3JlYXNlIHRoZSBjdXJyZW50IG1lbW9yeSBzaXplLgorLy8gTm90ZSB0aGF0IG1lbS5zaXplIGlzIG5vdCAiYyIgKHJlYWRub25lKSBiZWNhdXNlIGl0IG11c3QgYmUgc2VxdWVuY2VkCisvLyB3aXRoIHJlc3BlY3QgdG8gZ3Jvd19tZW1vcnkgY2FsbHMuCisvLyBUaGVzZSBhcmUgdGhlIG5ldyBwcm9wb3NlZCBuYW1lcywgd2hpY2ggYXJlbid0IHlldCBvZmZpY2lhbC4gVXNlIGF0IHlvdXIgb3duCisvLyByaXNrLgorQlVJTFRJTihfX2J1aWx0aW5fd2FzbV9tZW1fc2l6ZSwgInpJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX3dhc21fbWVtX2dyb3csICJ6SWl6IiwgIm4iKQorCisvLyBUaGVzZSBhcmUgdGhlIGV4aXN0aW5nIG5hbWVzLCB3aGljaCBhcmUgY3VycmVudGx5IG9mZmljaWFsLCBidXQgZXhwZWN0ZWQKKy8vIHRvIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZS4gVGhleSBhbHNvIGxhY2sgdGhlIGltbWVkaWF0ZSBmaWVsZC4KK0JVSUxUSU4oX19idWlsdGluX3dhc21fY3VycmVudF9tZW1vcnksICJ6IiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fd2FzbV9ncm93X21lbW9yeSwgInp6IiwgIm4iKQorCisvLyBFeGNlcHRpb24gaGFuZGxpbmcgYnVpbHRpbnMuCitCVUlMVElOKF9fYnVpbHRpbl93YXNtX3Rocm93LCAidlVpdioiLCAiciIpCitCVUlMVElOKF9fYnVpbHRpbl93YXNtX3JldGhyb3csICJ2IiwgInIiKQorCisjdW5kZWYgQlVJTFRJTgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNYODYuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNYODYuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NTkyZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc1g4Ni5kZWYKQEAgLTAsMCArMSwxOTExIEBACisvLz09PS0tLSBCdWlsdGluc1g4Ni5kZWYgLSBYODYgQnVpbHRpbiBmdW5jdGlvbiBkYXRhYmFzZSAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBYODYtc3BlY2lmaWMgYnVpbHRpbiBmdW5jdGlvbiBkYXRhYmFzZS4gIFVzZXJzIG9mCisvLyB0aGlzIGZpbGUgbXVzdCBkZWZpbmUgdGhlIEJVSUxUSU4gbWFjcm8gdG8gbWFrZSB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBUaGUgZm9ybWF0IG9mIHRoaXMgZGF0YWJhc2UgbWF0Y2hlcyBjbGFuZy9CYXNpYy9CdWlsdGlucy5kZWYuCisKKy8vIEZJWE1FOiBJZGVhbGx5IHdlIHdvdWxkIGJlIGFibGUgdG8gcHVsbCB0aGlzIGluZm9ybWF0aW9uIGZyb20gd2hhdAorLy8gTExWTSBhbHJlYWR5IGtub3dzIGFib3V0IFg4NiBidWlsdGlucy4gV2UgbmVlZCB0byBtYXRjaCB0aGUgTExWTQorLy8gZGVmaW5pdGlvbiBhbnl3YXksIHNpbmNlIGNvZGUgZ2VuZXJhdGlvbiB3aWxsIGxvd2VyIHRvIHRoZQorLy8gaW50cmluc2ljIGlmIG9uZSBleGlzdHMuCisKKyNpZiBkZWZpbmVkKEJVSUxUSU4pICYmICFkZWZpbmVkKFRBUkdFVF9CVUlMVElOKQorIyAgIGRlZmluZSBUQVJHRVRfQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMsIEZFQVRVUkUpIEJVSUxUSU4oSUQsIFRZUEUsIEFUVFJTKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJVSUxUSU4pICYmICFkZWZpbmVkKFRBUkdFVF9IRUFERVJfQlVJTFRJTikKKyMgIGRlZmluZSBUQVJHRVRfSEVBREVSX0JVSUxUSU4oSUQsIFRZUEUsIEFUVFJTLCBIRUFERVIsIExBTkcsIEZFQVRVUkUpIEJVSUxUSU4oSUQsIFRZUEUsIEFUVFJTKQorI2VuZGlmCisKKy8vIEZJWE1FOiBBcmUgdGhlc2Ugbm90aHJvdy9jb25zdD8KKworLy8gTWlzY2VsbGFuZW91cyBidWlsdGluIGZvciBjaGVja2luZyB4ODYgY3B1IGZlYXR1cmVzLgorLy8gVE9ETzogTWFrZSB0aGlzIHNvbWV3aGF0IGdlbmVyaWMgc28gdGhhdCBvdGhlciBiYWNrZW5kcworLy8gY2FuIHVzZSBpdD8KK0JVSUxUSU4oX19idWlsdGluX2NwdV9pbml0LCAidiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX2NwdV9zdXBwb3J0cywgImJjQyoiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fY3B1X2lzLCAiYmNDKiIsICJuYyIpCisKKy8vIFVuZGVmaW5lZCBWYWx1ZXMKKy8vCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl91bmRlZjEyOCwgIlYyZCIsICJuYyIsICIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdW5kZWYyNTYsICJWNGQiLCAibmMiLCAiIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3VuZGVmNTEyLCAiVjhkIiwgIm5jIiwgIiIpCisKKy8vIEZMQUdTCisvLworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcmVhZGVmbGFnc191MzIsICJVaSIsICJuIiwgIiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl93cml0ZWVmbGFnc191MzIsICJ2VWkiLCAibiIsICIiKQorCisvLyAzRE5vdyEKKy8vCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9mZW1tcywgInYiLCAiIiwgIjNkbm93IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Bhdmd1c2IsICJWOGNWOGNWOGMiLCAibmMiLCAiM2Rub3ciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGYyaWQsICJWMmlWMmYiLCAibmMiLCAiM2Rub3ciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGZhY2MsICJWMmZWMmZWMmYiLCAibmMiLCAiM2Rub3ciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGZhZGQsICJWMmZWMmZWMmYiLCAibmMiLCAiM2Rub3ciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGZjbXBlcSwgIlYyaVYyZlYyZiIsICJuYyIsICIzZG5vdyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wZmNtcGdlLCAiVjJpVjJmVjJmIiwgIm5jIiwgIjNkbm93IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BmY21wZ3QsICJWMmlWMmZWMmYiLCAibmMiLCAiM2Rub3ciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGZtYXgsICJWMmZWMmZWMmYiLCAibmMiLCAiM2Rub3ciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGZtaW4sICJWMmZWMmZWMmYiLCAibmMiLCAiM2Rub3ciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGZtdWwsICJWMmZWMmZWMmYiLCAibmMiLCAiM2Rub3ciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGZyY3AsICJWMmZWMmYiLCAibmMiLCAiM2Rub3ciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGZyY3BpdDEsICJWMmZWMmZWMmYiLCAibmMiLCAiM2Rub3ciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGZyY3BpdDIsICJWMmZWMmZWMmYiLCAibmMiLCAiM2Rub3ciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGZyc3FydCwgIlYyZlYyZiIsICJuYyIsICIzZG5vdyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wZnJzcWl0MSwgIlYyZlYyZlYyZiIsICJuYyIsICIzZG5vdyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wZnN1YiwgIlYyZlYyZlYyZiIsICJuYyIsICIzZG5vdyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wZnN1YnIsICJWMmZWMmZWMmYiLCAibmMiLCAiM2Rub3ciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGkyZmQsICJWMmZWMmkiLCAibmMiLCAiM2Rub3ciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG11bGhydywgIlY0c1Y0c1Y0cyIsICJuYyIsICIzZG5vdyIpCisvLyAzRE5vdyEgRXh0ZW5zaW9ucyAoM2Rub3dhKS4KK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BmMml3LCAiVjJpVjJmIiwgIm5jIiwgIjNkbm93YSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wZm5hY2MsICJWMmZWMmZWMmYiLCAibmMiLCAiM2Rub3dhIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BmcG5hY2MsICJWMmZWMmZWMmYiLCAibmMiLCAiM2Rub3dhIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BpMmZ3LCAiVjJmVjJpIiwgIm5jIiwgIjNkbm93YSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3dhcGRzZiwgIlYyZlYyZiIsICJuYyIsICIzZG5vd2EiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHN3YXBkc2ksICJWMmlWMmkiLCAibmMiLCAiM2Rub3dhIikKKworLy8gTU1YCisvLworLy8gQWxsIE1NWCBpbnN0cnVjdGlvbnMgd2lsbCBiZSBnZW5lcmF0ZWQgdmlhIGJ1aWx0aW5zLiBBbnkgTU1YIHZlY3RvcgorLy8gdHlwZXMgKDwxIHggaTY0PiwgPDIgeCBpMzI+LCBldGMuKSB0aGF0IGFyZW4ndCB1c2VkIGJ5IHRoZXNlIGJ1aWx0aW5zIHdpbGwgYmUKKy8vIGV4cGFuZGVkIGJ5IHRoZSBiYWNrLWVuZC4KKy8vIEZJWE1FOiBfbW1fcHJlZmV0Y2ggbXVzdCBiZSBhIGJ1aWx0LWluIGJlY2F1c2UgaXQgdGFrZXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQKKy8vIGFyZ3VtZW50IGFuZCBvdXIgcHJpb3IgYXBwcm9hY2ggb2YgdXNpbmcgYSAjZGVmaW5lIHRvIHRoZSBjdXJyZW50IGJ1aWx0LWluCisvLyBkb2Vzbid0IHdvcmsgaW4gdGhlIHByZXNlbmNlIG9mIHJlLWRlY2xhcmF0aW9uIG9mIF9tbV9wcmVmZXRjaCBmb3Igd2luZG93cy4KK1RBUkdFVF9CVUlMVElOKF9tbV9wcmVmZXRjaCwgInZjQyppIiwgIm5jIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9lbW1zLCAidiIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhZGRiLCAiVjhjVjhjVjhjIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFkZHcsICJWNHNWNHNWNHMiLCAiIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wYWRkZCwgIlYyaVYyaVYyaSIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhZGRzYiwgIlY4Y1Y4Y1Y4YyIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhZGRzdywgIlY0c1Y0c1Y0cyIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhZGR1c2IsICJWOGNWOGNWOGMiLCAiIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wYWRkdXN3LCAiVjRzVjRzVjRzIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHN1YmIsICJWOGNWOGNWOGMiLCAiIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3VidywgIlY0c1Y0c1Y0cyIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzdWJkLCAiVjJpVjJpVjJpIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHN1YnNiLCAiVjhjVjhjVjhjIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHN1YnN3LCAiVjRzVjRzVjRzIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHN1YnVzYiwgIlY4Y1Y4Y1Y4YyIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzdWJ1c3csICJWNHNWNHNWNHMiLCAiIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbXVsaHcsICJWNHNWNHNWNHMiLCAiIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbXVsbHcsICJWNHNWNHNWNHMiLCAiIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWFkZHdkLCAiVjJpVjRzVjRzIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFuZCwgIlYxTExpVjFMTGlWMUxMaSIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhbmRuLCAiVjFMTGlWMUxMaVYxTExpIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG9yLCAiVjFMTGlWMUxMaVYxTExpIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHhvciwgIlYxTExpVjFMTGlWMUxMaSIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzbGx3LCAiVjRzVjRzVjFMTGkiLCAiIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2xsZCwgIlYyaVYyaVYxTExpIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNsbHEsICJWMUxMaVYxTExpVjFMTGkiLCAiIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JsdywgIlY0c1Y0c1YxTExpIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNybGQsICJWMmlWMmlWMUxMaSIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzcmxxLCAiVjFMTGlWMUxMaVYxTExpIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNyYXcsICJWNHNWNHNWMUxMaSIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzcmFkLCAiVjJpVjJpVjFMTGkiLCAiIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2xsd2ksICJWNHNWNHNpIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNsbGRpLCAiVjJpVjJpaSIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzbGxxaSwgIlYxTExpVjFMTGlpIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNybHdpLCAiVjRzVjRzaSIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzcmxkaSwgIlYyaVYyaWkiLCAiIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JscWksICJWMUxMaVYxTExpaSIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzcmF3aSwgIlY0c1Y0c2kiLCAiIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JhZGksICJWMmlWMmlpIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFja3Nzd2IsICJWOGNWNHNWNHMiLCAiIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wYWNrc3NkdywgIlY0c1YyaVYyaSIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhY2t1c3diLCAiVjhjVjRzVjRzIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHVucGNraGJ3LCAiVjhjVjhjVjhjIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHVucGNraHdkLCAiVjRzVjRzVjRzIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHVucGNraGRxLCAiVjJpVjJpVjJpIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHVucGNrbGJ3LCAiVjhjVjhjVjhjIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHVucGNrbHdkLCAiVjRzVjRzVjRzIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHVucGNrbGRxLCAiVjJpVjJpVjJpIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGNtcGVxYiwgIlY4Y1Y4Y1Y4YyIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BjbXBlcXcsICJWNHNWNHNWNHMiLCAiIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wY21wZXFkLCAiVjJpVjJpVjJpIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGNtcGd0YiwgIlY4Y1Y4Y1Y4YyIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BjbXBndHcsICJWNHNWNHNWNHMiLCAiIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wY21wZ3RkLCAiVjJpVjJpVjJpIiwgIiIsICJtbXgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbWFza21vdnEsICJ2VjhjVjhjYyoiLCAiIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tb3ZudHEsICJ2VjFMTGkqVjFMTGkiLCAiIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92ZWNfaW5pdF92MnNpLCAiVjJpaWkiLCAiIiwgIm1teCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92ZWNfaW5pdF92NGhpLCAiVjRzc3NzcyIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZlY19pbml0X3Y4cWksICJWOGNjY2NjY2NjYyIsICIiLCAibW14IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjJzaSwgImlWMmlpIiwgIiIsICJtbXgiKQorCisvLyBNTVgyIChNTVgrU1NFKSBpbnRyaW5zaWNzCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRwaTJwcywgIlY0ZlY0ZlYyaSIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHBzMnBpLCAiVjJpVjRmIiwgIiIsICJzc2UiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0dHBzMnBpLCAiVjJpVjRmIiwgIiIsICJzc2UiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGF2Z2IsICJWOGNWOGNWOGMiLCAiIiwgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wYXZndywgIlY0c1Y0c1Y0cyIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtYXhzdywgIlY0c1Y0c1Y0cyIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtYXh1YiwgIlY4Y1Y4Y1Y4YyIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtaW5zdywgIlY0c1Y0c1Y0cyIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtaW51YiwgIlY4Y1Y4Y1Y4YyIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Ztc2tiLCAiaVY4YyIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtdWxodXcsICJWNHNWNHNWNHMiLCAiIiwgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2FkYncsICJWNHNWOGNWOGMiLCAiIiwgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2h1ZncsICJWNHNWNHNJYyIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjRoaSwgImlWNHNJaSIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZlY19zZXRfdjRoaSwgIlY0c1Y0c2lJaSIsICIiLCAic3NlIikKKworLy8gTU1YK1NTRTIKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHBkMnBpLCAiVjJpVjJkIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHBpMnBkLCAiVjJkVjJpIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJwaSwgIlYyaVYyZCIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wYWRkcSwgIlYxTExpVjFMTGlWMUxMaSIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbXVsdWRxLCAiVjFMTGlWMmlWMmkiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHN1YnEsICJWMUxMaVYxTExpVjFMTGkiLCAiIiwgInNzZTIiKQorCisvLyBNTVgrU1NTRTMKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhYnNiLCAiVjhjVjhjIiwgIiIsICJzc3NlMyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wYWJzZCwgIlYyaVYyaSIsICIiLCAic3NzZTMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFic3csICJWNHNWNHMiLCAiIiwgInNzc2UzIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhbGlnbnIsICJWOGNWOGNWOGNJYyIsICIiLCAic3NzZTMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGhhZGRkLCAiVjJpVjJpVjJpIiwgIiIsICJzc3NlMyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9waGFkZHN3LCAiVjRzVjRzVjRzIiwgIiIsICJzc3NlMyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9waGFkZHcsICJWNHNWNHNWNHMiLCAiIiwgInNzc2UzIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Boc3ViZCwgIlYyaVYyaVYyaSIsICIiLCAic3NzZTMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGhzdWJzdywgIlY0c1Y0c1Y0cyIsICIiLCAic3NzZTMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGhzdWJ3LCAiVjRzVjRzVjRzIiwgIiIsICJzc3NlMyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWFkZHVic3csICJWOGNWOGNWOGMiLCAiIiwgInNzc2UzIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtdWxocnN3LCAiVjRzVjRzVjRzIiwgIiIsICJzc3NlMyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2h1ZmIsICJWOGNWOGNWOGMiLCAiIiwgInNzc2UzIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzaWdudywgIlY0c1Y0c1Y0cyIsICIiLCAic3NzZTMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNpZ25iLCAiVjhjVjhjVjhjIiwgIiIsICJzc3NlMyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2lnbmQsICJWMmlWMmlWMmkiLCAiIiwgInNzc2UzIikKKworLy8gU1NFIGludHJpbnNpY3MuCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jb21pZXEsICJpVjRmVjRmIiwgIiIsICJzc2UiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29taWx0LCAiaVY0ZlY0ZiIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NvbWlsZSwgImlWNGZWNGYiLCAiIiwgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jb21pZ3QsICJpVjRmVjRmIiwgIiIsICJzc2UiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29taWdlLCAiaVY0ZlY0ZiIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NvbWluZXEsICJpVjRmVjRmIiwgIiIsICJzc2UiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdWNvbWllcSwgImlWNGZWNGYiLCAiIiwgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl91Y29taWx0LCAiaVY0ZlY0ZiIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Vjb21pbGUsICJpVjRmVjRmIiwgIiIsICJzc2UiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdWNvbWlndCwgImlWNGZWNGYiLCAiIiwgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl91Y29taWdlLCAiaVY0ZlY0ZiIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Vjb21pbmVxLCAiaVY0ZlY0ZiIsICIiLCAic3NlIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29taXNkZXEsICJpVjJkVjJkIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NvbWlzZGx0LCAiaVYyZFYyZCIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jb21pc2RsZSwgImlWMmRWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29taXNkZ3QsICJpVjJkVjJkIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NvbWlzZGdlLCAiaVYyZFYyZCIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jb21pc2RuZXEsICJpVjJkVjJkIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Vjb21pc2RlcSwgImlWMmRWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdWNvbWlzZGx0LCAiaVYyZFYyZCIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl91Y29taXNkbGUsICJpVjJkVjJkIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Vjb21pc2RndCwgImlWMmRWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdWNvbWlzZGdlLCAiaVYyZFYyZCIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl91Y29taXNkbmVxLCAiaVYyZFYyZCIsICIiLCAic3NlMiIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcGVxcHMsICJWNGZWNGZWNGYiLCAiIiwgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXBsdHBzLCAiVjRmVjRmVjRmIiwgIiIsICJzc2UiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY21wbGVwcywgIlY0ZlY0ZlY0ZiIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcHVub3JkcHMsICJWNGZWNGZWNGYiLCAiIiwgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXBuZXFwcywgIlY0ZlY0ZlY0ZiIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcG5sdHBzLCAiVjRmVjRmVjRmIiwgIiIsICJzc2UiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY21wbmxlcHMsICJWNGZWNGZWNGYiLCAiIiwgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXBvcmRwcywgIlY0ZlY0ZlY0ZiIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcGVxc3MsICJWNGZWNGZWNGYiLCAiIiwgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXBsdHNzLCAiVjRmVjRmVjRmIiwgIiIsICJzc2UiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY21wbGVzcywgIlY0ZlY0ZlY0ZiIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcHVub3Jkc3MsICJWNGZWNGZWNGYiLCAiIiwgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXBuZXFzcywgIlY0ZlY0ZlY0ZiIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcG5sdHNzLCAiVjRmVjRmVjRmIiwgIiIsICJzc2UiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY21wbmxlc3MsICJWNGZWNGZWNGYiLCAiIiwgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXBvcmRzcywgIlY0ZlY0ZlY0ZiIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21pbnBzLCAiVjRmVjRmVjRmIiwgIiIsICJzc2UiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbWF4cHMsICJWNGZWNGZWNGYiLCAiIiwgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9taW5zcywgIlY0ZlY0ZlY0ZiIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21heHNzLCAiVjRmVjRmVjRmIiwgIiIsICJzc2UiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXBlcXBkLCAiVjJkVjJkVjJkIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcGx0cGQsICJWMmRWMmRWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY21wbGVwZCwgIlYyZFYyZFYyZCIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXB1bm9yZHBkLCAiVjJkVjJkVjJkIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcG5lcXBkLCAiVjJkVjJkVjJkIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcG5sdHBkLCAiVjJkVjJkVjJkIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcG5sZXBkLCAiVjJkVjJkVjJkIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcG9yZHBkLCAiVjJkVjJkVjJkIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcGVxc2QsICJWMmRWMmRWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY21wbHRzZCwgIlYyZFYyZFYyZCIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXBsZXNkLCAiVjJkVjJkVjJkIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcHVub3Jkc2QsICJWMmRWMmRWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY21wbmVxc2QsICJWMmRWMmRWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY21wbmx0c2QsICJWMmRWMmRWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY21wbmxlc2QsICJWMmRWMmRWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY21wb3Jkc2QsICJWMmRWMmRWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbWlucGQsICJWMmRWMmRWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbWF4cGQsICJWMmRWMmRWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbWluc2QsICJWMmRWMmRWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbWF4c2QsICJWMmRWMmRWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFkZHNiMTI4LCAiVjE2Y1YxNmNWMTZjIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhZGRzdzEyOCwgIlY4c1Y4c1Y4cyIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3Vic2IxMjgsICJWMTZjVjE2Y1YxNmMiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHN1YnN3MTI4LCAiVjhzVjhzVjhzIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhZGR1c2IxMjgsICJWMTZjVjE2Y1YxNmMiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFkZHVzdzEyOCwgIlY4c1Y4c1Y4cyIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3VidXNiMTI4LCAiVjE2Y1YxNmNWMTZjIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzdWJ1c3cxMjgsICJWOHNWOHNWOHMiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG11bGh3MTI4LCAiVjhzVjhzVjhzIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtYXh1YjEyOCwgIlYxNmNWMTZjVjE2YyIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWF4c3cxMjgsICJWOHNWOHNWOHMiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1pbnViMTI4LCAiVjE2Y1YxNmNWMTZjIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtaW5zdzEyOCwgIlY4c1Y4c1Y4cyIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wYWNrc3N3YjEyOCwgIlYxNmNWOHNWOHMiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFja3NzZHcxMjgsICJWOHNWNGlWNGkiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFja3Vzd2IxMjgsICJWMTZjVjhzVjhzIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtdWxodXcxMjgsICJWOHNWOHNWOHMiLCAiIiwgInNzZTIiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9hZGRzdWJwcywgIlY0ZlY0ZlY0ZiIsICIiLCAic3NlMyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9hZGRzdWJwZCwgIlYyZFYyZFYyZCIsICIiLCAic3NlMyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9oYWRkcHMsICJWNGZWNGZWNGYiLCAiIiwgInNzZTMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfaGFkZHBkLCAiVjJkVjJkVjJkIiwgIiIsICJzc2UzIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2hzdWJwcywgIlY0ZlY0ZlY0ZiIsICIiLCAic3NlMyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9oc3VicGQsICJWMmRWMmRWMmQiLCAiIiwgInNzZTMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGhhZGR3MTI4LCAiVjhzVjhzVjhzIiwgIiIsICJzc3NlMyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9waGFkZGQxMjgsICJWNGlWNGlWNGkiLCAiIiwgInNzc2UzIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BoYWRkc3cxMjgsICJWOHNWOHNWOHMiLCAiIiwgInNzc2UzIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Boc3VidzEyOCwgIlY4c1Y4c1Y4cyIsICIiLCAic3NzZTMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGhzdWJkMTI4LCAiVjRpVjRpVjRpIiwgIiIsICJzc3NlMyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9waHN1YnN3MTI4LCAiVjhzVjhzVjhzIiwgIiIsICJzc3NlMyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWFkZHVic3cxMjgsICJWOHNWMTZjVjE2YyIsICIiLCAic3NzZTMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG11bGhyc3cxMjgsICJWOHNWOHNWOHMiLCAiIiwgInNzc2UzIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzaHVmYjEyOCwgIlYxNmNWMTZjVjE2YyIsICIiLCAic3NzZTMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNpZ25iMTI4LCAiVjE2Y1YxNmNWMTZjIiwgIiIsICJzc3NlMyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2lnbncxMjgsICJWOHNWOHNWOHMiLCAiIiwgInNzc2UzIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzaWduZDEyOCwgIlY0aVY0aVY0aSIsICIiLCAic3NzZTMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFic2IxMjgsICJWMTZjVjE2YyIsICIiLCAic3NzZTMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFic3cxMjgsICJWOHNWOHMiLCAiIiwgInNzc2UzIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhYnNkMTI4LCAiVjRpVjRpIiwgIiIsICJzc3NlMyIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2xkbXhjc3IsICJ2VWkiLCAiIiwgInNzZSIpCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX21tX3NldGNzciwgInZVaSIsICJoIiwieG1taW50cmluLmgiLCBBTExfTEFOR1VBR0VTLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3N0bXhjc3IsICJVaSIsICIiLCAic3NlIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfbW1fZ2V0Y3NyLCAiVWkiLCAiaCIsICJ4bW1pbnRyaW4uaCIsIEFMTF9MQU5HVUFHRVMsICJzc2UiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0c3Myc2ksICJpVjRmIiwgIiIsICJzc2UiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0dHNzMnNpLCAiaVY0ZiIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3N0b3JlaHBzLCAidlYyaSpWNGYiLCAiIiwgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zdG9yZWxwcywgInZWMmkqVjRmIiwgIiIsICJzc2UiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbW92bXNrcHMsICJpVjRmIiwgIiIsICJzc2UiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2ZlbmNlLCAidiIsICIiLCAic3NlIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfbW1fc2ZlbmNlLCAidiIsICJoIiwgInhtbWludHJpbi5oIiwgQUxMX0xBTkdVQUdFUywgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yY3BwcywgIlY0ZlY0ZiIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JjcHNzLCAiVjRmVjRmIiwgIiIsICJzc2UiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcnNxcnRwcywgIlY0ZlY0ZiIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JzcXJ0c3MsICJWNGZWNGYiLCAiIiwgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zcXJ0cHMsICJWNGZWNGYiLCAiIiwgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zcXJ0c3MsICJWNGZWNGYiLCAiIiwgInNzZSIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21hc2ttb3ZkcXUsICJ2VjE2Y1YxNmNjKiIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tb3Ztc2twZCwgImlWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdm1za2IxMjgsICJpVjE2YyIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tb3ZudGksICJ2aSppIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21vdm50aTY0LCAidkxMaSpMTGkiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNhZGJ3MTI4LCAiVjJMTGlWMTZjVjE2YyIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zcXJ0cGQsICJWMmRWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc3FydHNkLCAiVjJkVjJkIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dGRxMnBzLCAiVjRmVjRpIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHBkMmRxLCAiVjJMTGlWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0cGQycHMsICJWNGZWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0dHBkMmRxLCAiVjRpVjJkIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHNkMnNpLCAiaVYyZCIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnR0c2Qyc2ksICJpVjJkIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHNkMnNzLCAiVjRmVjRmVjJkIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHBzMmRxLCAiVjRpVjRmIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHRwczJkcSwgIlY0aVY0ZiIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbGZsdXNoLCAidnZDKiIsICIiLCAic3NlMiIpCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX21tX2NsZmx1c2gsICJ2dkMqIiwgImgiLCAiZW1taW50cmluLmgiLCBBTExfTEFOR1VBR0VTLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9sZmVuY2UsICJ2IiwgIiIsICJzc2UyIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfbW1fbGZlbmNlLCAidiIsICJoIiwgImVtbWludHJpbi5oIiwgQUxMX0xBTkdVQUdFUywgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbWZlbmNlLCAidiIsICIiLCAic3NlMiIpCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX21tX21mZW5jZSwgInYiLCAiaCIsICJlbW1pbnRyaW4uaCIsIEFMTF9MQU5HVUFHRVMsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhdXNlLCAidiIsICIiLCAiIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfbW1fcGF1c2UsICJ2IiwgImgiLCAiZW1taW50cmluLmgiLCBBTExfTEFOR1VBR0VTLCAiIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtdWx1ZHExMjgsICJWMkxMaVY0aVY0aSIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JhdzEyOCwgIlY4c1Y4c1Y4cyIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JhZDEyOCwgIlY0aVY0aVY0aSIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JsdzEyOCwgIlY4c1Y4c1Y4cyIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JsZDEyOCwgIlY0aVY0aVY0aSIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JscTEyOCwgIlYyTExpVjJMTGlWMkxMaSIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2xsdzEyOCwgIlY4c1Y4c1Y4cyIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2xsZDEyOCwgIlY0aVY0aVY0aSIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2xscTEyOCwgIlYyTExpVjJMTGlWMkxMaSIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2xsd2kxMjgsICJWOHNWOHNpIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzbGxkaTEyOCwgIlY0aVY0aWkiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNsbHFpMTI4LCAiVjJMTGlWMkxMaWkiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNybHdpMTI4LCAiVjhzVjhzaSIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JsZGkxMjgsICJWNGlWNGlpIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzcmxxaTEyOCwgIlYyTExpVjJMTGlpIiwgIiIsICJzc2UyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzcmF3aTEyOCwgIlY4c1Y4c2kiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNyYWRpMTI4LCAiVjRpVjRpaSIsICIiLCAic3NlMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWFkZHdkMTI4LCAiVjRpVjhzVjhzIiwgIiIsICJzc2UyIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbW9uaXRvciwgInZ2KlVpVWkiLCAiIiwgInNzZTMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbXdhaXQsICJ2VWlVaSIsICIiLCAic3NlMyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9sZGRxdSwgIlYxNmNjQyoiLCAiIiwgInNzZTMiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wYWxpZ25yMTI4LCAiVjE2Y1YxNmNWMTZjSWkiLCAiIiwgInNzc2UzIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfaW5zZXJ0cHMxMjgsICJWNGZWNGZWNGZJYyIsICIiLCAic3NlNC4xIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BibGVuZHZiMTI4LCAiVjE2Y1YxNmNWMTZjVjE2YyIsICIiLCAic3NlNC4xIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2JsZW5kdnBkLCAiVjJkVjJkVjJkVjJkIiwgIiIsICJzc2U0LjEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfYmxlbmR2cHMsICJWNGZWNGZWNGZWNGYiLCAiIiwgInNzZTQuMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wYWNrdXNkdzEyOCwgIlY4c1Y0aVY0aSIsICIiLCAic3NlNC4xIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1heHNiMTI4LCAiVjE2Y1YxNmNWMTZjIiwgIiIsICJzc2U0LjEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1heHNkMTI4LCAiVjRpVjRpVjRpIiwgIiIsICJzc2U0LjEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1heHVkMTI4LCAiVjRpVjRpVjRpIiwgIiIsICJzc2U0LjEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1heHV3MTI4LCAiVjhzVjhzVjhzIiwgIiIsICJzc2U0LjEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1pbnNiMTI4LCAiVjE2Y1YxNmNWMTZjIiwgIiIsICJzc2U0LjEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1pbnNkMTI4LCAiVjRpVjRpVjRpIiwgIiIsICJzc2U0LjEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1pbnVkMTI4LCAiVjRpVjRpVjRpIiwgIiIsICJzc2U0LjEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1pbnV3MTI4LCAiVjhzVjhzVjhzIiwgIiIsICJzc2U0LjEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG11bGRxMTI4LCAiVjJMTGlWNGlWNGkiLCAiIiwgInNzZTQuMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yb3VuZHBzLCAiVjRmVjRmSWkiLCAiIiwgInNzZTQuMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yb3VuZHNzLCAiVjRmVjRmVjRmSWkiLCAiIiwgInNzZTQuMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yb3VuZHNkLCAiVjJkVjJkVjJkSWkiLCAiIiwgInNzZTQuMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yb3VuZHBkLCAiVjJkVjJkSWkiLCAiIiwgInNzZTQuMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9kcHBzLCAiVjRmVjRmVjRmSWMiLCAiIiwgInNzZTQuMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9kcHBkLCAiVjJkVjJkVjJkSWMiLCAiIiwgInNzZTQuMSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wdGVzdHoxMjgsICJpVjJMTGlWMkxMaSIsICIiLCAic3NlNC4xIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3B0ZXN0YzEyOCwgImlWMkxMaVYyTExpIiwgIiIsICJzc2U0LjEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHRlc3RuemMxMjgsICJpVjJMTGlWMkxMaSIsICIiLCAic3NlNC4xIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21wc2FkYncxMjgsICJWMTZjVjE2Y1YxNmNJYyIsICIiLCAic3NlNC4xIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BobWlucG9zdXcxMjgsICJWOHNWOHMiLCAiIiwgInNzZTQuMSIpCisKKy8vIFNTRSA0LjIKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RybTEyOCwgIlYxNmNWMTZjVjE2Y0ljIiwgIiIsICJzc2U0LjIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGNtcGlzdHJpMTI4LCAiaVYxNmNWMTZjSWMiLCAiIiwgInNzZTQuMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wY21wZXN0cm0xMjgsICJWMTZjVjE2Y2lWMTZjaUljIiwgIiIsICJzc2U0LjIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGNtcGVzdHJpMTI4LCAiaVYxNmNpVjE2Y2lJYyIsIiIsICJzc2U0LjIiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wY21waXN0cmlhMTI4LCAiaVYxNmNWMTZjSWMiLCIiLCAic3NlNC4yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaWMxMjgsICJpVjE2Y1YxNmNJYyIsIiIsICJzc2U0LjIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGNtcGlzdHJpbzEyOCwgImlWMTZjVjE2Y0ljIiwiIiwgInNzZTQuMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wY21waXN0cmlzMTI4LCAiaVYxNmNWMTZjSWMiLCIiLCAic3NlNC4yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaXoxMjgsICJpVjE2Y1YxNmNJYyIsIiIsICJzc2U0LjIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGNtcGVzdHJpYTEyOCwgImlWMTZjaVYxNmNpSWMiLCIiLCAic3NlNC4yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaWMxMjgsICJpVjE2Y2lWMTZjaUljIiwiIiwgInNzZTQuMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wY21wZXN0cmlvMTI4LCAiaVYxNmNpVjE2Y2lJYyIsIiIsICJzc2U0LjIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGNtcGVzdHJpczEyOCwgImlWMTZjaVYxNmNpSWMiLCIiLCAic3NlNC4yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaXoxMjgsICJpVjE2Y2lWMTZjaUljIiwiIiwgInNzZTQuMiIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NyYzMycWksICJVaVVpVWMiLCAiIiwgInNzZTQuMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jcmMzMmhpLCAiVWlVaVVzIiwgIiIsICJzc2U0LjIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3JjMzJzaSwgIlVpVWlVaSIsICIiLCAic3NlNC4yIikKKworLy8gU1NFNGEKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2V4dHJxaSwgIlYyTExpVjJMTGlJY0ljIiwgIiIsICJzc2U0YSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9leHRycSwgIlYyTExpVjJMTGlWMTZjIiwgIiIsICJzc2U0YSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9pbnNlcnRxaSwgIlYyTExpVjJMTGlWMkxMaUljSWMiLCAiIiwgInNzZTRhIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2luc2VydHEsICJWMkxMaVYyTExpVjJMTGkiLCAiIiwgInNzZTRhIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21vdm50c2QsICJ2ZCpWMmQiLCAiIiwgInNzZTRhIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21vdm50c3MsICJ2ZipWNGYiLCAiIiwgInNzZTRhIikKKworLy8gQUVTCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9hZXNlbmMxMjgsICJWMkxMaVYyTExpVjJMTGkiLCAiIiwgImFlcyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9hZXNlbmNsYXN0MTI4LCAiVjJMTGlWMkxMaVYyTExpIiwgIiIsICJhZXMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfYWVzZGVjMTI4LCAiVjJMTGlWMkxMaVYyTExpIiwgIiIsICJhZXMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfYWVzZGVjbGFzdDEyOCwgIlYyTExpVjJMTGlWMkxMaSIsICIiLCAiYWVzIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2Flc2ltYzEyOCwgIlYyTExpVjJMTGkiLCAiIiwgImFlcyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9hZXNrZXlnZW5hc3Npc3QxMjgsICJWMkxMaVYyTExpSWMiLCAiIiwgImFlcyIpCisKKy8vIFZBRVMKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2Flc2VuYzI1NiwgIlY0TExpVjRMTGlWNExMaSIsICIiLCAidmFlcyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9hZXNlbmM1MTIsICJWOExMaVY4TExpVjhMTGkiLCAiIiwgImF2eDUxMmYsdmFlcyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9hZXNlbmNsYXN0MjU2LCAiVjRMTGlWNExMaVY0TExpIiwgIiIsICJ2YWVzIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2Flc2VuY2xhc3Q1MTIsICJWOExMaVY4TExpVjhMTGkiLCAiIiwgImF2eDUxMmYsdmFlcyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9hZXNkZWMyNTYsICJWNExMaVY0TExpVjRMTGkiLCAiIiwgInZhZXMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfYWVzZGVjNTEyLCAiVjhMTGlWOExMaVY4TExpIiwgIiIsICJhdng1MTJmLHZhZXMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfYWVzZGVjbGFzdDI1NiwgIlY0TExpVjRMTGlWNExMaSIsICIiLCAidmFlcyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9hZXNkZWNsYXN0NTEyLCAiVjhMTGlWOExMaVY4TExpIiwgIiIsICJhdng1MTJmLHZhZXMiKQorCisvLyBHRk5JCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Z2YycDhhZmZpbmVpbnZxYl92MTZxaSwgIlYxNmNWMTZjVjE2Y0ljIiwgIiIsICJnZm5pIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZnZjJwOGFmZmluZWludnFiX3YzMnFpLCAiVjMyY1YzMmNWMzJjSWMiLCAiIiwgImF2eCxnZm5pIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZnZjJwOGFmZmluZWludnFiX3Y2NHFpLCAiVjY0Y1Y2NGNWNjRjSWMiLCAiIiwgImF2eDUxMmJ3LGdmbmkiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmdmMnA4YWZmaW5lcWJfdjE2cWksICJWMTZjVjE2Y1YxNmNJYyIsICIiLCAiZ2ZuaSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Z2YycDhhZmZpbmVxYl92MzJxaSwgIlYzMmNWMzJjVjMyY0ljIiwgIiIsICJhdngsZ2ZuaSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Z2YycDhhZmZpbmVxYl92NjRxaSwgIlY2NGNWNjRjVjY0Y0ljIiwgIiIsICJhdng1MTJidyxnZm5pIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZnZjJwOG11bGJfdjE2cWksICJWMTZjVjE2Y1YxNmMiLCAiIiwgImdmbmkiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmdmMnA4bXVsYl92MzJxaSwgIlYzMmNWMzJjVjMyYyIsICIiLCAiYXZ4LGdmbmkiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmdmMnA4bXVsYl92NjRxaSwgIlY2NGNWNjRjVjY0YyIsICIiLCAiYXZ4NTEyYncsZ2ZuaSIpCisKKy8vIENMTVVMCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wY2xtdWxxZHExMjgsICJWMkxMaVYyTExpVjJMTGlJYyIsICIiLCAicGNsbXVsIikKKworLy8gVlBDTE1VTFFEUQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGNsbXVscWRxMjU2LCAiVjRMTGlWNExMaVY0TExpSWMiLCAiIiwgInZwY2xtdWxxZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGNsbXVscWRxNTEyLCAiVjhMTGlWOExMaVY4TExpSWMiLCAiIiwgImF2eDUxMmYsdnBjbG11bHFkcSIpCisKKy8vIEFWWAorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfYWRkc3VicGQyNTYsICJWNGRWNGRWNGQiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9hZGRzdWJwczI1NiwgIlY4ZlY4ZlY4ZiIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2hhZGRwZDI1NiwgIlY0ZFY0ZFY0ZCIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2hzdWJwczI1NiwgIlY4ZlY4ZlY4ZiIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2hzdWJwZDI1NiwgIlY0ZFY0ZFY0ZCIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2hhZGRwczI1NiwgIlY4ZlY4ZlY4ZiIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21heHBkMjU2LCAiVjRkVjRkVjRkIiwgIiIsICJhdngiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbWF4cHMyNTYsICJWOGZWOGZWOGYiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9taW5wZDI1NiwgIlY0ZFY0ZFY0ZCIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21pbnBzMjU2LCAiVjhmVjhmVjhmIiwgIiIsICJhdngiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBkLCAiVjJkVjJkVjJMTGkiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycHMsICJWNGZWNGZWNGkiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycGQyNTYsICJWNGRWNGRWNExMaSIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwczI1NiwgIlY4ZlY4ZlY4aSIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2JsZW5kdnBkMjU2LCAiVjRkVjRkVjRkVjRkIiwgIiIsICJhdngiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfYmxlbmR2cHMyNTYsICJWOGZWOGZWOGZWOGYiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9kcHBzMjU2LCAiVjhmVjhmVjhmSWMiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXBwZCwgIlYyZFYyZFYyZEljIiwgIiIsICJhdngiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY21wcGQyNTYsICJWNGRWNGRWNGRJYyIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcHBzLCAiVjRmVjRmVjRmSWMiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXBwczI1NiwgIlY4ZlY4ZlY4ZkljIiwgIiIsICJhdngiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY21wc2QsICJWMmRWMmRWMmRJYyIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcHNzLCAiVjRmVjRmVjRmSWMiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRkcTJwczI1NiwgIlY4ZlY4aSIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHBkMnBzMjU2LCAiVjRmVjRkIiwgIiIsICJhdngiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0cHMyZHEyNTYsICJWOGlWOGYiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnR0cGQyZHEyNTYsICJWNGlWNGQiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRwZDJkcTI1NiwgIlY0aVY0ZCIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHRwczJkcTI1NiwgIlY4aVY4ZiIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtMmYxMjhfcGQyNTYsICJWNGRWNGRWNGRJYyIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtMmYxMjhfcHMyNTYsICJWOGZWOGZWOGZJYyIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtMmYxMjhfc2kyNTYsICJWOGlWOGlWOGlJYyIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NxcnRwZDI1NiwgIlY0ZFY0ZCIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NxcnRwczI1NiwgIlY4ZlY4ZiIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JzcXJ0cHMyNTYsICJWOGZWOGYiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yY3BwczI1NiwgIlY4ZlY4ZiIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JvdW5kcGQyNTYsICJWNGRWNGRJaSIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JvdW5kcHMyNTYsICJWOGZWOGZJaSIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Z0ZXN0enBkLCAiaVYyZFYyZCIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Z0ZXN0Y3BkLCAiaVYyZFYyZCIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Z0ZXN0bnpjcGQsICJpVjJkVjJkIiwgIiIsICJhdngiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnRlc3R6cHMsICJpVjRmVjRmIiwgIiIsICJhdngiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnRlc3RjcHMsICJpVjRmVjRmIiwgIiIsICJhdngiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnRlc3RuemNwcywgImlWNGZWNGYiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92dGVzdHpwZDI1NiwgImlWNGRWNGQiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92dGVzdGNwZDI1NiwgImlWNGRWNGQiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92dGVzdG56Y3BkMjU2LCAiaVY0ZFY0ZCIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Z0ZXN0enBzMjU2LCAiaVY4ZlY4ZiIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Z0ZXN0Y3BzMjU2LCAiaVY4ZlY4ZiIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Z0ZXN0bnpjcHMyNTYsICJpVjhmVjhmIiwgIiIsICJhdngiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHRlc3R6MjU2LCAiaVY0TExpVjRMTGkiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wdGVzdGMyNTYsICJpVjRMTGlWNExMaSIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3B0ZXN0bnpjMjU2LCAiaVY0TExpVjRMTGkiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tb3Ztc2twZDI1NiwgImlWNGQiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tb3Ztc2twczI1NiwgImlWOGYiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92emVyb2FsbCwgInYiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92emVyb3VwcGVyLCAidiIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zicm9hZGNhc3RmMTI4X3BkMjU2LCAiVjRkVjJkQyoiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92YnJvYWRjYXN0ZjEyOF9wczI1NiwgIlY4ZlY0ZkMqIiwgIiIsICJhdngiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbGRkcXUyNTYsICJWMzJjY0MqIiwgIiIsICJhdngiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbWFza2xvYWRwZCwgIlYyZFYyZEMqVjJMTGkiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHBzLCAiVjRmVjRmQypWNGkiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHBkMjU2LCAiVjRkVjRkQypWNExMaSIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21hc2tsb2FkcHMyNTYsICJWOGZWOGZDKlY4aSIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXBkLCAidlYyZCpWMkxMaVYyZCIsICIiLCAiYXZ4IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXBzLCAidlY0ZipWNGlWNGYiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVwZDI1NiwgInZWNGQqVjRMTGlWNGQiLCAiIiwgImF2eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVwczI1NiwgInZWOGYqVjhpVjhmIiwgIiIsICJhdngiKQorCisvLyBBVlgyCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tcHNhZGJ3MjU2LCAiVjMyY1YzMmNWMzJjSWMiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFic2IyNTYsICJWMzJjVjMyYyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wYWJzdzI1NiwgIlYxNnNWMTZzIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhYnNkMjU2LCAiVjhpVjhpIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhY2tzc3diMjU2LCAiVjMyY1YxNnNWMTZzIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhY2tzc2R3MjU2LCAiVjE2c1Y4aVY4aSIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wYWNrdXN3YjI1NiwgIlYzMmNWMTZzVjE2cyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wYWNrdXNkdzI1NiwgIlYxNnNWOGlWOGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFkZHNiMjU2LCAiVjMyY1YzMmNWMzJjIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhZGRzdzI1NiwgIlYxNnNWMTZzVjE2cyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3Vic2IyNTYsICJWMzJjVjMyY1YzMmMiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHN1YnN3MjU2LCAiVjE2c1YxNnNWMTZzIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhZGR1c2IyNTYsICJWMzJjVjMyY1YzMmMiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFkZHVzdzI1NiwgIlYxNnNWMTZzVjE2cyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3VidXNiMjU2LCAiVjMyY1YzMmNWMzJjIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzdWJ1c3cyNTYsICJWMTZzVjE2c1YxNnMiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFsaWducjI1NiwgIlYzMmNWMzJjVjMyY0lpIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BibGVuZHZiMjU2LCAiVjMyY1YzMmNWMzJjVjMyYyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9waGFkZHcyNTYsICJWMTZzVjE2c1YxNnMiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGhhZGRkMjU2LCAiVjhpVjhpVjhpIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BoYWRkc3cyNTYsICJWMTZzVjE2c1YxNnMiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGhzdWJ3MjU2LCAiVjE2c1YxNnNWMTZzIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Boc3ViZDI1NiwgIlY4aVY4aVY4aSIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9waHN1YnN3MjU2LCAiVjE2c1YxNnNWMTZzIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtYWRkdWJzdzI1NiwgIlYxNnNWMzJjVjMyYyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWFkZHdkMjU2LCAiVjhpVjE2c1YxNnMiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1heHViMjU2LCAiVjMyY1YzMmNWMzJjIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtYXh1dzI1NiwgIlYxNnNWMTZzVjE2cyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWF4dWQyNTYsICJWOGlWOGlWOGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1heHNiMjU2LCAiVjMyY1YzMmNWMzJjIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtYXhzdzI1NiwgIlYxNnNWMTZzVjE2cyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWF4c2QyNTYsICJWOGlWOGlWOGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1pbnViMjU2LCAiVjMyY1YzMmNWMzJjIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtaW51dzI1NiwgIlYxNnNWMTZzVjE2cyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWludWQyNTYsICJWOGlWOGlWOGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1pbnNiMjU2LCAiVjMyY1YzMmNWMzJjIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtaW5zdzI1NiwgIlYxNnNWMTZzVjE2cyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWluc2QyNTYsICJWOGlWOGlWOGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdm1za2IyNTYsICJpVjMyYyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbXVsZHEyNTYsICJWNExMaVY4aVY4aSIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbXVsaHJzdzI1NiwgIlYxNnNWMTZzVjE2cyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbXVsaHV3MjU2LCAiVjE2c1YxNnNWMTZzIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtdWxodzI1NiwgIlYxNnNWMTZzVjE2cyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbXVsdWRxMjU2LCAiVjRMTGlWOGlWOGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNhZGJ3MjU2LCAiVjRMTGlWMzJjVjMyYyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2h1ZmIyNTYsICJWMzJjVjMyY1YzMmMiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNpZ25iMjU2LCAiVjMyY1YzMmNWMzJjIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzaWdudzI1NiwgIlYxNnNWMTZzVjE2cyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2lnbmQyNTYsICJWOGlWOGlWOGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNsbHdpMjU2LCAiVjE2c1YxNnNpIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzbGx3MjU2LCAiVjE2c1YxNnNWOHMiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNsbGRpMjU2LCAiVjhpVjhpaSIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2xsZDI1NiwgIlY4aVY4aVY0aSIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2xscWkyNTYsICJWNExMaVY0TExpaSIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2xscTI1NiwgIlY0TExpVjRMTGlWMkxMaSIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3Jhd2kyNTYsICJWMTZzVjE2c2kiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNyYXcyNTYsICJWMTZzVjE2c1Y4cyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JhZGkyNTYsICJWOGlWOGlpIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzcmFkMjU2LCAiVjhpVjhpVjRpIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Bzcmx3aTI1NiwgIlYxNnNWMTZzaSIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JsdzI1NiwgIlYxNnNWMTZzVjhzIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzcmxkaTI1NiwgIlY4aVY4aWkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNybGQyNTYsICJWOGlWOGlWNGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNybHFpMjU2LCAiVjRMTGlWNExMaWkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNybHEyNTYsICJWNExMaVY0TExpVjJMTGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGVybXZhcnNpMjU2LCAiVjhpVjhpVjhpIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Blcm12YXJzZjI1NiwgIlY4ZlY4ZlY4aSIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wZXJtdGkyNTYsICJWNExMaVY0TExpVjRMTGlJYyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tYXNrbG9hZGQyNTYsICJWOGlWOGlDKlY4aSIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHEyNTYsICJWNExMaVY0TExpQypWNExMaSIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tYXNrbG9hZGQsICJWNGlWNGlDKlY0aSIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHEsICJWMkxMaVYyTExpQypWMkxMaSIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVkMjU2LCAidlY4aSpWOGlWOGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbWFza3N0b3JlcTI1NiwgInZWNExMaSpWNExMaVY0TExpIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZWQsICJ2VjRpKlY0aVY0aSIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVxLCAidlYyTExpKlYyTExpVjJMTGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNsbHY4c2ksICJWOGlWOGlWOGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNsbHY0c2ksICJWNGlWNGlWNGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNsbHY0ZGksICJWNExMaVY0TExpVjRMTGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNsbHYyZGksICJWMkxMaVYyTExpVjJMTGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNyYXY4c2ksICJWOGlWOGlWOGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNyYXY0c2ksICJWNGlWNGlWNGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNybHY4c2ksICJWOGlWOGlWOGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNybHY0c2ksICJWNGlWNGlWNGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNybHY0ZGksICJWNExMaVY0TExpVjRMTGkiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNybHYyZGksICJWMkxMaVYyTExpVjJMTGkiLCAiIiwgImF2eDIiKQorCisvLyBHQVRIRVIKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcGQsICJWMmRWMmRkQypWNGlWMmRJYyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nYXRoZXJkX3BkMjU2LCAiVjRkVjRkZEMqVjRpVjRkSWMiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2F0aGVycV9wZCwgIlYyZFYyZGRDKlYyTExpVjJkSWMiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2F0aGVycV9wZDI1NiwgIlY0ZFY0ZGRDKlY0TExpVjRkSWMiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2F0aGVyZF9wcywgIlY0ZlY0ZmZDKlY0aVY0ZkljIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcHMyNTYsICJWOGZWOGZmQypWOGlWOGZJYyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3BzLCAiVjRmVjRmZkMqVjJMTGlWNGZJYyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3BzMjU2LCAiVjRmVjRmZkMqVjRMTGlWNGZJYyIsICIiLCAiYXZ4MiIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcSwgIlYyTExpVjJMTGlMTGlDKlY0aVYyTExpSWMiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2F0aGVyZF9xMjU2LCAiVjRMTGlWNExMaUxMaUMqVjRpVjRMTGlJYyIsICIiLCAiYXZ4MiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3EsICJWMkxMaVYyTExpTExpQypWMkxMaVYyTExpSWMiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2F0aGVycV9xMjU2LCAiVjRMTGlWNExMaUxMaUMqVjRMTGlWNExMaUljIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfZCwgIlY0aVY0aWlDKlY0aVY0aUljIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfZDI1NiwgIlY4aVY4aWlDKlY4aVY4aUljIiwgIiIsICJhdngyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dhdGhlcnFfZCwgIlY0aVY0aWlDKlYyTExpVjRpSWMiLCAiIiwgImF2eDIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2F0aGVycV9kMjU2LCAiVjRpVjRpaUMqVjRMTGlWNGlJYyIsICIiLCAiYXZ4MiIpCisKKy8vIEYxNkMKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaCwgIlY4c1Y0ZklpIiwgIiIsICJmMTZjIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaDI1NiwgIlY4c1Y4ZklpIiwgIiIsICJmMTZjIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZjdnRwaDJwcywgIlY0ZlY4cyIsICIiLCAiZjE2YyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Y3Z0cGgycHMyNTYsICJWOGZWOHMiLCAiIiwgImYxNmMiKQorCisvLyBSRFJBTkQKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JkcmFuZDE2X3N0ZXAsICJVaVVzKiIsICIiLCAicmRybmQiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcmRyYW5kMzJfc3RlcCwgIlVpVWkqIiwgIiIsICJyZHJuZCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yZHJhbmQ2NF9zdGVwLCAiVWlVTExpKiIsICIiLCAicmRybmQiKQorCisvLyBGU0dTQkFTRQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcmRmc2Jhc2UzMiwgIlVpIiwgIiIsICJmc2dzYmFzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yZGdzYmFzZTMyLCAiVWkiLCAiIiwgImZzZ3NiYXNlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3dyZnNiYXNlMzIsICJ2VWkiLCAiIiwgImZzZ3NiYXNlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3dyZ3NiYXNlMzIsICJ2VWkiLCAiIiwgImZzZ3NiYXNlIikKKworLy8gRlhTUgorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZnhyc3RvciwgInZ2KiIsICIiLCAiZnhzciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9meHNhdmUsICJ2dioiLCAiIiwgImZ4c3IiKQorCisvLyBYU0FWRQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfeHNhdmUsICJ2dipVTExpIiwgIiIsICJ4c2F2ZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl94cnN0b3IsICJ2dipVTExpIiwgIiIsICJ4c2F2ZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl94c2F2ZW9wdCwgInZ2KlVMTGkiLCAiIiwgInhzYXZlb3B0IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3hyc3RvcnMsICJ2dipVTExpIiwgIiIsICJ4c2F2ZXMiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfeHNhdmVjLCAidnYqVUxMaSIsICIiLCAieHNhdmVjIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3hzYXZlcywgInZ2KlVMTGkiLCAiIiwgInhzYXZlcyIpCisKKy8vIFNIU1RLCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9pbmNzc3BkLCAidlVpIiwgInUiLCAic2hzdGsiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcmRzc3BkLCAiVWlVaSIsICJVbiIsICJzaHN0ayIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zYXZlcHJldnNzcCwgInYiLCAiIiwgInNoc3RrIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JzdG9yc3NwLCAidnYqIiwgIiIsICJzaHN0ayIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl93cnNzZCwgInZVaXYqIiwgIiIsICJzaHN0ayIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl93cnVzc2QsICJ2VWl2KiIsICIiLCAic2hzdGsiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2V0c3Nic3ksICJ2IiwgIiIsICJzaHN0ayIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbHJzc2JzeSwgInZ2KiIsICIiLCAic2hzdGsiKQorCisvL0NMRkxVU0hPUFQKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NsZmx1c2hvcHQsICJ2dkMqIiwgIiIsICJjbGZsdXNob3B0IikKKworLy9DTFdCCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbHdiLCAidnZDKiIsICIiLCAiY2x3YiIpCisKKy8vIEFEWAorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfYWRkY2Fycnl4X3UzMiwgIlVjVWNVaVVpVWkqIiwgIiIsICJhZHgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfYWRkY2FycnlfdTMyLCAiVWNVY1VpVWlVaSoiLCAiIiwgIiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zdWJib3Jyb3dfdTMyLCAiVWNVY1VpVWlVaSoiLCAiIiwgIiIpCisKKy8vIFJEU0VFRAorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcmRzZWVkMTZfc3RlcCwgIlVpVXMqIiwgIiIsICJyZHNlZWQiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcmRzZWVkMzJfc3RlcCwgIlVpVWkqIiwgIiIsICJyZHNlZWQiKQorCisvLyBCTUkKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2JleHRyX3UzMiwgIlVpVWlVaSIsICIiLCAiYm1pIikKKworLy8gQk1JMgorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfYnpoaV9zaSwgIlVpVWlVaSIsICIiLCAiYm1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wZGVwX3NpLCAiVWlVaVVpIiwgIiIsICJibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BleHRfc2ksICJVaVVpVWkiLCAiIiwgImJtaTIiKQorCisvLyBUQk0KK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2JleHRyaV91MzIsICJVaVVpSVVpIiwgIiIsICJ0Ym0iKQorCisvLyBMV1AKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2xsd3BjYiwgInZ2KiIsICIiLCAibHdwIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Nsd3BjYiwgInYqIiwgIiIsICJsd3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbHdwaW5zMzIsICJVY1VpVWlVaSIsICIiLCAibHdwIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2x3cHZhbDMyLCAidlVpVWlVaSIsICIiLCAibHdwIikKKworLy8gU0hBCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zaGExcm5kczQsICJWNGlWNGlWNGlJYyIsICIiLCAic2hhIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NoYTFuZXh0ZSwgIlY0aVY0aVY0aSIsICIiLCAic2hhIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NoYTFtc2cxLCAiVjRpVjRpVjRpIiwgIiIsICJzaGEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2hhMW1zZzIsICJWNGlWNGlWNGkiLCAiIiwgInNoYSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zaGEyNTZybmRzMiwgIlY0aVY0aVY0aVY0aSIsICIiLCAic2hhIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NoYTI1Nm1zZzEsICJWNGlWNGlWNGkiLCAiIiwgInNoYSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zaGEyNTZtc2cyLCAiVjRpVjRpVjRpIiwgIiIsICJzaGEiKQorCisvLyBGTUEKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzLCAiVjRmVjRmVjRmVjRmIiwgIiIsICJmbWF8Zm1hNCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1hZGRwZCwgIlYyZFYyZFYyZFYyZCIsICIiLCAiZm1hfGZtYTQiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkc3MzLCAiVjRmVjRmVjRmVjRmIiwgIiIsICJmbWEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkc2QzLCAiVjJkVjJkVjJkVjJkIiwgIiIsICJmbWEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkc3MsICJWNGZWNGZWNGZWNGYiLCAiIiwgImZtYTQiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkc2QsICJWMmRWMmRWMmRWMmQiLCAiIiwgImZtYTQiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMsICJWNGZWNGZWNGZWNGYiLCAiIiwgImZtYXxmbWE0IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkLCAiVjJkVjJkVjJkVjJkIiwgIiIsICJmbWF8Zm1hNCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1NiwgIlY4ZlY4ZlY4ZlY4ZiIsICIiLCAiZm1hfGZtYTQiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkcGQyNTYsICJWNGRWNGRWNGRWNGQiLCAiIiwgImZtYXxmbWE0IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRwczI1NiwgIlY4ZlY4ZlY4ZlY4ZiIsICIiLCAiZm1hfGZtYTQiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZubWFkZHBkMjU2LCAiVjRkVjRkVjRkVjRkIiwgIiIsICJmbWF8Zm1hNCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczI1NiwgIlY4ZlY4ZlY4ZlY4ZiIsICIiLCAiZm1hfGZtYTQiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQyNTYsICJWNGRWNGRWNGRWNGQiLCAiIiwgImZtYXxmbWE0IikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkcGQxMjhfbWFzaywgIlYyZFYyZFYyZFYyZFVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDEyOF9tYXNrMywgIlYyZFYyZFYyZFYyZFVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDEyOF9tYXNreiwgIlYyZFYyZFYyZFYyZFVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1Nl9tYXNrLCAiVjRkVjRkVjRkVjRkVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMjU2X21hc2szLCAiVjRkVjRkVjRkVjRkVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMjU2X21hc2t6LCAiVjRkVjRkVjRkVjRkVWMiLCAiIiwgImF2eDUxMnZsIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkcGQ1MTJfbWFzaywgIlY4ZFY4ZFY4ZFY4ZFVjSWkiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkcGQ1MTJfbWFzazMsICJWOGRWOGRWOGRWOGRVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkNTEyX21hc2t6LCAiVjhkVjhkVjhkVjhkVWNJaSIsICIiLCAiYXZ4NTEyZiIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMTI4X21hc2ssICJWNGZWNGZWNGZWNGZVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkcHMxMjhfbWFzazMsICJWNGZWNGZWNGZWNGZVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkcHMxMjhfbWFza3osICJWNGZWNGZWNGZWNGZVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkcHMyNTZfbWFzaywgIlY4ZlY4ZlY4ZlY4ZlVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1Nl9tYXNrMywgIlY4ZlY4ZlY4ZlY4ZlVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1Nl9tYXNreiwgIlY4ZlY4ZlY4ZlY4ZlVjIiwgIiIsICJhdng1MTJ2bCIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzNTEyX21hc2ssICJWMTZmVjE2ZlYxNmZWMTZmVXNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1hZGRwczUxMl9tYXNrMywgIlYxNmZWMTZmVjE2ZlYxNmZVc0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzNTEyX21hc2t6LCAiVjE2ZlYxNmZWMTZmVjE2ZlVzSWkiLCAiIiwgImF2eDUxMmYiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDEyOF9tYXNrLCAiVjJkVjJkVjJkVjJkVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMTI4X21hc2szLCAiVjJkVjJkVjJkVjJkVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMTI4X21hc2t6LCAiVjJkVjJkVjJkVjJkVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMjU2X21hc2ssICJWNGRWNGRWNGRWNGRVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQyNTZfbWFzazMsICJWNGRWNGRWNGRWNGRVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQyNTZfbWFza3osICJWNGRWNGRWNGRWNGRVYyIsICIiLCAiYXZ4NTEydmwiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDUxMl9tYXNrLCAiVjhkVjhkVjhkVjhkVWNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDUxMl9tYXNrMywgIlY4ZFY4ZFY4ZFY4ZFVjSWkiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQ1MTJfbWFza3osICJWOGRWOGRWOGRWOGRVY0lpIiwgIiIsICJhdng1MTJmIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMxMjhfbWFzaywgIlY0ZlY0ZlY0ZlY0ZlVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczEyOF9tYXNrMywgIlY0ZlY0ZlY0ZlY0ZlVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczEyOF9tYXNreiwgIlY0ZlY0ZlY0ZlY0ZlVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczI1Nl9tYXNrLCAiVjhmVjhmVjhmVjhmVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMjU2X21hc2szLCAiVjhmVjhmVjhmVjhmVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMjU2X21hc2t6LCAiVjhmVjhmVjhmVjhmVWMiLCAiIiwgImF2eDUxMnZsIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHM1MTJfbWFzaywgIlYxNmZWMTZmVjE2ZlYxNmZVc0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzNTEyX21hc2szLCAiVjE2ZlYxNmZWMTZmVjE2ZlVzSWkiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHM1MTJfbWFza3osICJWMTZmVjE2ZlYxNmZWMTZmVXNJaSIsICIiLCAiYXZ4NTEyZiIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbXN1YnBkMTI4X21hc2szLCAiVjJkVjJkVjJkVjJkVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbXN1YnBkMjU2X21hc2szLCAiVjRkVjRkVjRkVjRkVWMiLCAiIiwgImF2eDUxMnZsIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtc3VicGQ1MTJfbWFzazMsICJWOGRWOGRWOGRWOGRVY0lpIiwgIiIsICJhdng1MTJmIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtc3VicHMxMjhfbWFzazMsICJWNGZWNGZWNGZWNGZVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtc3VicHMyNTZfbWFzazMsICJWOGZWOGZWOGZWOGZVYyIsICIiLCAiYXZ4NTEydmwiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1zdWJwczUxMl9tYXNrMywgIlYxNmZWMTZmVjE2ZlYxNmZVc0lpIiwgIiIsICJhdng1MTJmIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcGQxMjhfbWFzazMsICJWMmRWMmRWMmRWMmRVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcGQyNTZfbWFzazMsICJWNGRWNGRWNGRWNGRVYyIsICIiLCAiYXZ4NTEydmwiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1zdWJhZGRwZDUxMl9tYXNrMywgIlY4ZFY4ZFY4ZFY4ZFVjSWkiLCAiIiwgImF2eDUxMmYiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1zdWJhZGRwczEyOF9tYXNrMywgIlY0ZlY0ZlY0ZlY0ZlVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1zdWJhZGRwczI1Nl9tYXNrMywgIlY4ZlY4ZlY4ZlY4ZlVjIiwgIiIsICJhdng1MTJ2bCIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbXN1YmFkZHBzNTEyX21hc2szLCAiVjE2ZlYxNmZWMTZmVjE2ZlVzSWkiLCAiIiwgImF2eDUxMmYiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm5tYWRkcGQxMjhfbWFzaywgIlYyZFYyZFYyZFYyZFVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm5tYWRkcGQyNTZfbWFzaywgIlY0ZFY0ZFY0ZFY0ZFVjIiwgIiIsICJhdng1MTJ2bCIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRwZDUxMl9tYXNrLCAiVjhkVjhkVjhkVjhkVWNJaSIsICIiLCAiYXZ4NTEyZiIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRwczEyOF9tYXNrLCAiVjRmVjRmVjRmVjRmVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRwczI1Nl9tYXNrLCAiVjhmVjhmVjhmVjhmVWMiLCAiIiwgImF2eDUxMnZsIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZubWFkZHBzNTEyX21hc2ssICJWMTZmVjE2ZlYxNmZWMTZmVXNJaSIsICIiLCAiYXZ4NTEyZiIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwZDEyOF9tYXNrLCAiVjJkVjJkVjJkVjJkVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwZDEyOF9tYXNrMywgIlYyZFYyZFYyZFYyZFVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm5tc3VicGQyNTZfbWFzaywgIlY0ZFY0ZFY0ZFY0ZFVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm5tc3VicGQyNTZfbWFzazMsICJWNGRWNGRWNGRWNGRVYyIsICIiLCAiYXZ4NTEydmwiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm5tc3VicGQ1MTJfbWFzaywgIlY4ZFY4ZFY4ZFY4ZFVjSWkiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZubXN1YnBkNTEyX21hc2szLCAiVjhkVjhkVjhkVjhkVWNJaSIsICIiLCAiYXZ4NTEyZiIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwczEyOF9tYXNrLCAiVjRmVjRmVjRmVjRmVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwczEyOF9tYXNrMywgIlY0ZlY0ZlY0ZlY0ZlVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm5tc3VicHMyNTZfbWFzaywgIlY4ZlY4ZlY4ZlY4ZlVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm5tc3VicHMyNTZfbWFzazMsICJWOGZWOGZWOGZWOGZVYyIsICIiLCAiYXZ4NTEydmwiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm5tc3VicHM1MTJfbWFzaywgIlYxNmZWMTZmVjE2ZlYxNmZVc0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwczUxMl9tYXNrMywgIlYxNmZWMTZmVjE2ZlYxNmZVc0lpIiwgIiIsICJhdng1MTJmIikKKworLy8gWE9QCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cG1hY3Nzd3csICJWOHNWOHNWOHNWOHMiLCAiIiwgInhvcCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cG1hY3N3dywgIlY4c1Y4c1Y4c1Y4cyIsICIiLCAieG9wIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwbWFjc3N3ZCwgIlY0aVY4c1Y4c1Y0aSIsICIiLCAieG9wIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwbWFjc3dkLCAiVjRpVjhzVjhzVjRpIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBtYWNzc2RkLCAiVjRpVjRpVjRpVjRpIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBtYWNzZGQsICJWNGlWNGlWNGlWNGkiLCAiIiwgInhvcCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cG1hY3NzZHFsLCAiVjJMTGlWNGlWNGlWMkxMaSIsICIiLCAieG9wIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwbWFjc2RxbCwgIlYyTExpVjRpVjRpVjJMTGkiLCAiIiwgInhvcCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cG1hY3NzZHFoLCAiVjJMTGlWNGlWNGlWMkxMaSIsICIiLCAieG9wIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwbWFjc2RxaCwgIlYyTExpVjRpVjRpVjJMTGkiLCAiIiwgInhvcCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cG1hZGNzc3dkLCAiVjRpVjhzVjhzVjRpIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBtYWRjc3dkLCAiVjRpVjhzVjhzVjRpIiwgIiIsICJ4b3AiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGhhZGRidywgIlY4c1YxNmMiLCAiIiwgInhvcCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGhhZGRiZCwgIlY0aVYxNmMiLCAiIiwgInhvcCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGhhZGRicSwgIlYyTExpVjE2YyIsICIiLCAieG9wIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHdkLCAiVjRpVjhzIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBoYWRkd3EsICJWMkxMaVY4cyIsICIiLCAieG9wIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwaGFkZGRxLCAiVjJMTGlWNGkiLCAiIiwgInhvcCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGhhZGR1YncsICJWOHNWMTZjIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBoYWRkdWJkLCAiVjRpVjE2YyIsICIiLCAieG9wIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHVicSwgIlYyTExpVjE2YyIsICIiLCAieG9wIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHV3ZCwgIlY0aVY4cyIsICIiLCAieG9wIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHV3cSwgIlYyTExpVjhzIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBoYWRkdWRxLCAiVjJMTGlWNGkiLCAiIiwgInhvcCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGhzdWJidywgIlY4c1YxNmMiLCAiIiwgInhvcCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGhzdWJ3ZCwgIlY0aVY4cyIsICIiLCAieG9wIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwaHN1YmRxLCAiVjJMTGlWNGkiLCAiIiwgInhvcCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHBlcm0sICJWMTZjVjE2Y1YxNmNWMTZjIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnByb3RiLCAiVjE2Y1YxNmNWMTZjIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnByb3R3LCAiVjhzVjhzVjhzIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnByb3RkLCAiVjRpVjRpVjRpIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnByb3RxLCAiVjJMTGlWMkxMaVYyTExpIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnByb3RiaSwgIlYxNmNWMTZjSWMiLCAiIiwgInhvcCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHJvdHdpLCAiVjhzVjhzSWMiLCAiIiwgInhvcCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHJvdGRpLCAiVjRpVjRpSWMiLCAiIiwgInhvcCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHJvdHFpLCAiVjJMTGlWMkxMaUljIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaGxiLCAiVjE2Y1YxNmNWMTZjIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaGx3LCAiVjhzVjhzVjhzIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaGxkLCAiVjRpVjRpVjRpIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaGxxLCAiVjJMTGlWMkxMaVYyTExpIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaGFiLCAiVjE2Y1YxNmNWMTZjIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaGF3LCAiVjhzVjhzVjhzIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaGFkLCAiVjRpVjRpVjRpIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaGFxLCAiVjJMTGlWMkxMaVYyTExpIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBjb211YiwgIlYxNmNWMTZjVjE2Y0ljIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBjb211dywgIlY4c1Y4c1Y4c0ljIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBjb211ZCwgIlY0aVY0aVY0aUljIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBjb211cSwgIlYyTExpVjJMTGlWMkxMaUljIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBjb21iLCAiVjE2Y1YxNmNWMTZjSWMiLCAiIiwgInhvcCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGNvbXcsICJWOHNWOHNWOHNJYyIsICIiLCAieG9wIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwY29tZCwgIlY0aVY0aVY0aUljIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBjb21xLCAiVjJMTGlWMkxMaVYyTExpSWMiLCAiIiwgInhvcCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybWlsMnBkLCAiVjJkVjJkVjJkVjJMTGlJYyIsICIiLCAieG9wIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWwycGQyNTYsICJWNGRWNGRWNGRWNExMaUljIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm1pbDJwcywgIlY0ZlY0ZlY0ZlY0aUljIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm1pbDJwczI1NiwgIlY4ZlY4ZlY4ZlY4aUljIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZyY3pzcywgIlY0ZlY0ZiIsICIiLCAieG9wIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmcmN6c2QsICJWMmRWMmQiLCAiIiwgInhvcCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92ZnJjenBzLCAiVjRmVjRmIiwgIiIsICJ4b3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZyY3pwZCwgIlYyZFYyZCIsICIiLCAieG9wIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmcmN6cHMyNTYsICJWOGZWOGYiLCAiIiwgInhvcCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92ZnJjenBkMjU2LCAiVjRkVjRkIiwgIiIsICJ4b3AiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl94YmVnaW4sICJpIiwgIiIsICJydG0iKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfeGVuZCwgInYiLCAiIiwgInJ0bSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl94YWJvcnQsICJ2SWMiLCAiIiwgInJ0bSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl94dGVzdCwgImkiLCAiIiwgInJ0bSIpCisKK0JVSUxUSU4oX19idWlsdGluX2lhMzJfcmRwbWMsICJVTExpaSIsICIiKQorQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yZHRzYywgIlVMTGkiLCAiIikKK0JVSUxUSU4oX19yZHRzYywgIlVMTGkiLCAiIikKK0JVSUxUSU4oX19idWlsdGluX2lhMzJfcmR0c2NwLCAiVUxMaVVpKiIsICIiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yZHBpZCwgIlVpIiwgIiIsICJyZHBpZCIpCisKKy8vIFBLVQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcmRwa3J1LCAiVWkiLCAiIiwgInBrdSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl93cnBrcnUsICJ2VWkiLCAiIiwgInBrdSIpCisKKy8vIEFWWC01MTIKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NxcnRwZDUxMl9tYXNrLCAiVjhkVjhkVjhkVWNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zcXJ0cHM1MTJfbWFzaywgIlYxNmZWMTZmVjE2ZlVzSWkiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcnNxcnQxNHNkX21hc2ssICJWMmRWMmRWMmRWMmRVYyIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yc3FydDE0c3NfbWFzaywgIlY0ZlY0ZlY0ZlY0ZlVjIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRwZDUxMl9tYXNrLCAiVjhkVjhkVjhkVWMiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcnNxcnQxNHBzNTEyX21hc2ssICJWMTZmVjE2ZlYxNmZVcyIsICIiLCAiYXZ4NTEyZiIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JzcXJ0MjhzZF9yb3VuZF9tYXNrLCAiVjJkVjJkVjJkVjJkVWNJaSIsICIiLCAiYXZ4NTEyZXIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcnNxcnQyOHNzX3JvdW5kX21hc2ssICJWNGZWNGZWNGZWNGZVY0lpIiwgIiIsICJhdng1MTJlciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yc3FydDI4cGRfbWFzaywgIlY4ZFY4ZFY4ZFVjSWkiLCAiIiwgImF2eDUxMmVyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JzcXJ0Mjhwc19tYXNrLCAiVjE2ZlYxNmZWMTZmVXNJaSIsICIiLCAiYXZ4NTEyZXIiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yY3AxNHNkX21hc2ssICJWMmRWMmRWMmRWMmRVYyIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yY3AxNHNzX21hc2ssICJWNGZWNGZWNGZWNGZVYyIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yY3AxNHBkNTEyX21hc2ssICJWOGRWOGRWOGRVYyIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yY3AxNHBzNTEyX21hc2ssICJWMTZmVjE2ZlYxNmZVcyIsICIiLCAiYXZ4NTEyZiIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JjcDI4c2Rfcm91bmRfbWFzaywgIlYyZFYyZFYyZFYyZFVjSWkiLCAiIiwgImF2eDUxMmVyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JjcDI4c3Nfcm91bmRfbWFzaywgIlY0ZlY0ZlY0ZlY0ZlVjSWkiLCAiIiwgImF2eDUxMmVyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JjcDI4cGRfbWFzaywgIlY4ZFY4ZFY4ZFVjSWkiLCAiIiwgImF2eDUxMmVyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JjcDI4cHNfbWFzaywgIlYxNmZWMTZmVjE2ZlVzSWkiLCAiIiwgImF2eDUxMmVyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2V4cDJwZF9tYXNrLCAiVjhkVjhkVjhkVWNJaSIsICIiLCAiYXZ4NTEyZXIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZXhwMnBzX21hc2ssICJWMTZmVjE2ZlYxNmZVc0lpIiwgIiIsICJhdng1MTJlciIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHRwczJkcTUxMl9tYXNrLCAiVjE2aVYxNmZWMTZpVXNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnR0cHMydWRxNTEyX21hc2ssICJWMTZpVjE2ZlYxNmlVc0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJkcTUxMl9tYXNrLCAiVjhpVjhkVjhpVWNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnR0cGQydWRxNTEyX21hc2ssICJWOGlWOGRWOGlVY0lpIiwgIiIsICJhdng1MTJmIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY21wcHM1MTJfbWFzaywgICAiVXNWMTZmVjE2ZklpVXNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXBwczI1Nl9tYXNrLCAgICJVY1Y4ZlY4ZklpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcHBzMTI4X21hc2ssICAgIlVjVjRmVjRmSWlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY21wcGQ1MTJfbWFzaywgIlVjVjhkVjhkSWlVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcHBkMjU2X21hc2ssICJVY1Y0ZFY0ZElpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcHBkMTI4X21hc2ssICJVY1YyZFYyZElpVWMiLCAiIiwgImF2eDUxMnZsIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcm5kc2NhbGVwc19tYXNrLCAiVjE2ZlYxNmZJaVYxNmZVc0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcGRfbWFzaywgIlY4ZFY4ZElpVjhkVWNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRwczJkcTUxMl9tYXNrLCAiVjE2aVYxNmZWMTZpVXNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRwZDJkcTUxMl9tYXNrLCAiVjhpVjhkVjhpVWNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRwczJ1ZHE1MTJfbWFzaywgIlYxNmlWMTZmVjE2aVVzSWkiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0cGQydWRxNTEyX21hc2ssICJWOGlWOGRWOGlVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21pbnBzNTEyX21hc2ssICJWMTZmVjE2ZlYxNmZWMTZmVXNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9taW5wZDUxMl9tYXNrLCAiVjhkVjhkVjhkVjhkVWNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tYXhwczUxMl9tYXNrLCAiVjE2ZlYxNmZWMTZmVjE2ZlVzSWkiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbWF4cGQ1MTJfbWFzaywgIlY4ZFY4ZFY4ZFY4ZFVjSWkiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0ZHEycHM1MTJfbWFzaywgIlYxNmZWMTZpVjE2ZlVzSWkiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0dWRxMnBzNTEyX21hc2ssICJWMTZmVjE2aVYxNmZVc0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHBkMnBzNTEyX21hc2ssICJWOGZWOGRWOGZVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaDUxMl9tYXNrLCAiVjE2c1YxNmZJaVYxNnNVcyIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Y3Z0cGgycHM1MTJfbWFzaywgIlYxNmZWMTZzVjE2ZlVzSWkiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFic2Q1MTJfbWFzaywgIlYxNmlWMTZpVjE2aVVzIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhYnNxNTEyX21hc2ssICJWOExMaVY4TExpVjhMTGlVYyIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWF4c2Q1MTJfbWFzaywgIlYxNmlWMTZpVjE2aVYxNmlVcyIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWF4c3E1MTJfbWFzaywgIlY4TExpVjhMTGlWOExMaVY4TExpVWMiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1heHVkNTEyX21hc2ssICJWMTZpVjE2aVYxNmlWMTZpVXMiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1heHVxNTEyX21hc2ssICJWOExMaVY4TExpVjhMTGlWOExMaVVjIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtaW5zZDUxMl9tYXNrLCAiVjE2aVYxNmlWMTZpVjE2aVVzIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtaW5zcTUxMl9tYXNrLCAiVjhMTGlWOExMaVY4TExpVjhMTGlVYyIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWludWQ1MTJfbWFzaywgIlYxNmlWMTZpVjE2aVYxNmlVcyIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWludXE1MTJfbWFzaywgIlY4TExpVjhMTGlWOExMaVY4TExpVWMiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG11bGRxNTEyLCAiVjhMTGlWMTZpVjE2aSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbXVsdWRxNTEyLCAiVjhMTGlWMTZpVjE2aSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9sb2FkZHF1c2k1MTJfbWFzaywgIlYxNmlpQypWMTZpVXMiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbG9hZGRxdWRpNTEyX21hc2ssICJWOExMaUxMaUMqVjhMTGlVYyIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9sb2FkdXBzNTEyX21hc2ssICJWMTZmZkMqVjE2ZlVzIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2xvYWRhcHM1MTJfbWFzaywgIlYxNmZWMTZmQypWMTZmVXMiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbG9hZHVwZDUxMl9tYXNrLCAiVjhkZEMqVjhkVWMiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbG9hZGFwZDUxMl9tYXNrLCAiVjhkVjhkQypWOGRVYyIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zdG9yZWRxdWRpNTEyX21hc2ssICJ2TExpKlY4TExpVWMiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc3RvcmVkcXVzaTUxMl9tYXNrLCAidmkqVjE2aVVzIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3N0b3JldXBkNTEyX21hc2ssICJ2ZCpWOGRVYyIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zdG9yZWFwZDUxMl9tYXNrLCAidlY4ZCpWOGRVYyIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zdG9yZXVwczUxMl9tYXNrLCAidmYqVjE2ZlVzIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3N0b3JlYXBzNTEyX21hc2ssICJ2VjE2ZipWMTZmVXMiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmQ1MTJfbWFzaywgIlYxNmlWMTZpVjE2aVYxNmlVcyIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybXQydmFycTUxMl9tYXNrLCAiVjhMTGlWOExMaVY4TExpVjhMTGlVYyIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybXQydmFycHM1MTJfbWFzaywgIlYxNmZWMTZpVjE2ZlYxNmZVcyIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybXQydmFycGQ1MTJfbWFzaywgIlY4ZFY4TExpVjhkVjhkVWMiLCAiIiwgImF2eDUxMmYiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGRwYnVzZDEyOF9tYXNrLCAiVjRpVjRpVjRpVjRpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZubmkiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBkcGJ1c2QyNTZfbWFzaywgIlY4aVY4aVY4aVY4aVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2bm5pIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkNTEyX21hc2ssICJWMTZpVjE2aVYxNmlWMTZpVXMiLCAiIiwgImF2eDUxMnZubmkiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBkcGJ1c2RzMTI4X21hc2ssICJWNGlWNGlWNGlWNGlVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydm5uaSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGRwYnVzZHMyNTZfbWFzaywgIlY4aVY4aVY4aVY4aVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2bm5pIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkczUxMl9tYXNrLCAiVjE2aVYxNmlWMTZpVjE2aVVzIiwgIiIsICJhdng1MTJ2bm5pIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkMTI4X21hc2ssICJWNGlWNGlWNGlWNGlVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydm5uaSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGRwd3NzZDI1Nl9tYXNrLCAiVjhpVjhpVjhpVjhpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZubmkiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBkcHdzc2Q1MTJfbWFzaywgIlYxNmlWMTZpVjE2aVYxNmlVcyIsICIiLCAiYXZ4NTEydm5uaSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGRwd3NzZHMxMjhfbWFzaywgIlY0aVY0aVY0aVY0aVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2bm5pIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkczI1Nl9tYXNrLCAiVjhpVjhpVjhpVjhpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZubmkiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBkcHdzc2RzNTEyX21hc2ssICJWMTZpVjE2aVYxNmlWMTZpVXMiLCAiIiwgImF2eDUxMnZubmkiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBkcGJ1c2QxMjhfbWFza3osICJWNGlWNGlWNGlWNGlVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydm5uaSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGRwYnVzZDI1Nl9tYXNreiwgIlY4aVY4aVY4aVY4aVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2bm5pIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkNTEyX21hc2t6LCAiVjE2aVYxNmlWMTZpVjE2aVVzIiwgIiIsICJhdng1MTJ2bm5pIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkczEyOF9tYXNreiwgIlY0aVY0aVY0aVY0aVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2bm5pIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkczI1Nl9tYXNreiwgIlY4aVY4aVY4aVY4aVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2bm5pIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkczUxMl9tYXNreiwgIlYxNmlWMTZpVjE2aVYxNmlVcyIsICIiLCAiYXZ4NTEydm5uaSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGRwd3NzZDEyOF9tYXNreiwgIlY0aVY0aVY0aVY0aVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2bm5pIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkMjU2X21hc2t6LCAiVjhpVjhpVjhpVjhpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZubmkiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBkcHdzc2Q1MTJfbWFza3osICJWMTZpVjE2aVYxNmlWMTZpVXMiLCAiIiwgImF2eDUxMnZubmkiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBkcHdzc2RzMTI4X21hc2t6LCAiVjRpVjRpVjRpVjRpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZubmkiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBkcHdzc2RzMjU2X21hc2t6LCAiVjhpVjhpVjhpVjhpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZubmkiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBkcHdzc2RzNTEyX21hc2t6LCAiVjE2aVYxNmlWMTZpVjE2aVVzIiwgIiIsICJhdng1MTJ2bm5pIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2F0aGVyM2RpdjJkZiwgIlYyZFYyZGRDKlYyTExpVWNJaSIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNkaXYyZGksICJWMkxMaVYyTExpTExpQypWMkxMaVVjSWkiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2NGRmLCAiVjRkVjRkZEMqVjRMTGlVY0lpIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2F0aGVyM2RpdjRkaSwgIlY0TExpVjRMTGlMTGlDKlY0TExpVWNJaSIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNkaXY0c2YsICJWNGZWNGZmQypWMkxMaVVjSWkiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2NHNpLCAiVjRpVjRpaUMqVjJMTGlVY0lpIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2F0aGVyM2RpdjhzZiwgIlY0ZlY0ZmZDKlY0TExpVWNJaSIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNkaXY4c2ksICJWNGlWNGlpQypWNExMaVVjSWkiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2MmRmLCAiVjJkVjJkZEMqVjRpVWNJaSIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNzaXYyZGksICJWMkxMaVYyTExpTExpQypWNGlVY0lpIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2F0aGVyM3NpdjRkZiwgIlY0ZFY0ZGRDKlY0aVVjSWkiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2NGRpLCAiVjRMTGlWNExMaUxMaUMqVjRpVWNJaSIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNzaXY0c2YsICJWNGZWNGZmQypWNGlVY0lpIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2F0aGVyM3NpdjRzaSwgIlY0aVY0aWlDKlY0aVVjSWkiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2OHNmLCAiVjhmVjhmZkMqVjhpVWNJaSIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNzaXY4c2ksICJWOGlWOGlpQypWOGlVY0lpIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2OGRmLCAiVjhkVjhkZEMqVjhpVWNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXYxNnNmLCAiVjE2ZlYxNmZmQypWMTZmVXNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY4ZGYsICJWOGRWOGRkQypWOExMaVVjSWkiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2MTZzZiwgIlY4ZlY4ZmZDKlY4TExpVWNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY4ZGksICJWOExMaVY4TExpTExpQypWOGlVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjE2c2ksICJWMTZpVjE2aWlDKlYxNmlVc0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjhkaSwgIlY4TExpVjhMTGlMTGlDKlY4TExpVWNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXYxNnNpLCAiVjhpVjhpaUMqVjhMTGlVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY4ZGYsICJ2ZCpVY1Y4aVY4ZElpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXYxNnNmLCAidmYqVXNWMTZpVjE2ZklpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY4ZGYsICAidmQqVWNWOExMaVY4ZElpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXYxNnNmLCAidmYqVWNWOExMaVY4ZklpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY4ZGksICAidkxMaSpVY1Y4aVY4TExpSWkiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjE2c2ksICJ2aSpVc1YxNmlWMTZpSWkiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjhkaSwgICJ2TExpKlVjVjhMTGlWOExMaUlpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXYxNnNpLCAidmkqVWNWOExMaVY4aUlpIiwgIiIsICJhdng1MTJmIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2F0aGVycGZkcGQsICAidlVjVjhpTExpQypJaUlpIiwgIiIsICJhdng1MTJwZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nYXRoZXJwZmRwcywgICJ2VXNWMTZpaUMqSWlJaSIsICIiLCAiYXZ4NTEycGYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2F0aGVycGZxcGQsICAidlVjVjhMTGlMTGlDKklpSWkiLCAiIiwgImF2eDUxMnBmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dhdGhlcnBmcXBzLCAgInZVY1Y4TExpaUMqSWlJaSIsICIiLCAiYXZ4NTEycGYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2NhdHRlcnBmZHBkLCAidlVjVjhpTExpKklpSWkiLCAiIiwgImF2eDUxMnBmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJwZmRwcywgInZVc1YxNmlpKklpSWkiLCAiIiwgImF2eDUxMnBmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJwZnFwZCwgInZVY1Y4TExpTExpKklpSWkiLCAiIiwgImF2eDUxMnBmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJwZnFwcywgInZVY1Y4TExpaSpJaUlpIiwgIiIsICJhdng1MTJwZiIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2tub3RoaSwgIlVzVXMiLCAiIiwgImF2eDUxMmYiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXBiMTI4X21hc2ssICJVc1YxNmNWMTZjSWlVcyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY21wZDEyOF9tYXNrLCAiVWNWNGlWNGlJaVVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXBxMTI4X21hc2ssICJVY1YyTExpVjJMTGlJaVVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXB3MTI4X21hc2ssICJVY1Y4c1Y4c0lpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcGIyNTZfbWFzaywgIlVpVjMyY1YzMmNJaVVpIiwgIiIsICJhdng1MTJ2bCxhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXBkMjU2X21hc2ssICJVY1Y4aVY4aUlpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcHEyNTZfbWFzaywgIlVjVjRMTGlWNExMaUlpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcHcyNTZfbWFzaywgIlVzVjE2c1YxNnNJaVVzIiwgIiIsICJhdng1MTJ2bCxhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXBiNTEyX21hc2ssICJVTExpVjY0Y1Y2NGNJaVVMTGkiLCAiIiwgImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcGQ1MTJfbWFzaywgIlVzVjE2aVYxNmlJaVVzIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NtcHE1MTJfbWFzaywgIlVjVjhMTGlWOExMaUlpVWMiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY21wdzUxMl9tYXNrLCAiVWlWMzJzVjMyc0lpVWkiLCAiIiwgImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3VjbXBiMTI4X21hc2ssICJVc1YxNmNWMTZjSWlVcyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdWNtcGQxMjhfbWFzaywgIlVjVjRpVjRpSWlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdWNtcHExMjhfbWFzaywgIlVjVjJMTGlWMkxMaUlpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3VjbXB3MTI4X21hc2ssICJVY1Y4c1Y4c0lpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3VjbXBiMjU2X21hc2ssICJVaVYzMmNWMzJjSWlVaSIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdWNtcGQyNTZfbWFzaywgIlVjVjhpVjhpSWlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdWNtcHEyNTZfbWFzaywgIlVjVjRMTGlWNExMaUlpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3VjbXB3MjU2X21hc2ssICJVc1YxNnNWMTZzSWlVcyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdWNtcGI1MTJfbWFzaywgIlVMTGlWNjRjVjY0Y0lpVUxMaSIsICIiLCAiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdWNtcGQ1MTJfbWFzaywgIlVzVjE2aVYxNmlJaVVzIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3VjbXBxNTEyX21hc2ssICJVY1Y4TExpVjhMTGlJaVVjIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3VjbXB3NTEyX21hc2ssICJVaVYzMnNWMzJzSWlVaSIsICIiLCAiYXZ4NTEyYnciKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wYWJzYjUxMl9tYXNrLCAiVjY0Y1Y2NGNWNjRjVUxMaSIsICIiLCAiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFic3c1MTJfbWFzaywgIlYzMnNWMzJzVjMyc1VpIiwgIiIsICJhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wYWNrc3NkdzUxMiwgIlYzMnNWMTZpVjE2aSIsICIiLCAiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFja3Nzd2I1MTIsICJWNjRjVjMyc1YzMnMiLCAiIiwgImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhY2t1c2R3NTEyLCAiVjMyc1YxNmlWMTZpIiwgIiIsICJhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wYWNrdXN3YjUxMiwgIlY2NGNWMzJzVjMycyIsICIiLCAiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFkZHNiNTEyX21hc2ssICJWNjRjVjY0Y1Y2NGNWNjRjVUxMaSIsICIiLCAiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFkZHN3NTEyX21hc2ssICJWMzJzVjMyc1YzMnNWMzJzVWkiLCAiIiwgImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhZGR1c2I1MTJfbWFzaywgIlY2NGNWNjRjVjY0Y1Y2NGNVTExpIiwgIiIsICJhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wYWRkdXN3NTEyX21hc2ssICJWMzJzVjMyc1YzMnNWMzJzVWkiLCAiIiwgImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtYXhzYjUxMl9tYXNrLCAiVjY0Y1Y2NGNWNjRjVjY0Y1VMTGkiLCAiIiwgImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtYXhzdzUxMl9tYXNrLCAiVjMyc1YzMnNWMzJzVjMyc1VpIiwgIiIsICJhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWF4dWI1MTJfbWFzaywgIlY2NGNWNjRjVjY0Y1Y2NGNVTExpIiwgIiIsICJhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWF4dXc1MTJfbWFzaywgIlYzMnNWMzJzVjMyc1YzMnNVaSIsICIiLCAiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1pbnNiNTEyX21hc2ssICJWNjRjVjY0Y1Y2NGNWNjRjVUxMaSIsICIiLCAiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1pbnN3NTEyX21hc2ssICJWMzJzVjMyc1YzMnNWMzJzVWkiLCAiIiwgImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtaW51YjUxMl9tYXNrLCAiVjY0Y1Y2NGNWNjRjVjY0Y1VMTGkiLCAiIiwgImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtaW51dzUxMl9tYXNrLCAiVjMyc1YzMnNWMzJzVjMyc1VpIiwgIiIsICJhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2h1ZmI1MTIsICJWNjRjVjY0Y1Y2NGMiLCAiIiwgImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzdWJzYjUxMl9tYXNrLCAiVjY0Y1Y2NGNWNjRjVjY0Y1VMTGkiLCAiIiwgImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzdWJzdzUxMl9tYXNrLCAiVjMyc1YzMnNWMzJzVjMyc1VpIiwgIiIsICJhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3VidXNiNTEyX21hc2ssICJWNjRjVjY0Y1Y2NGNWNjRjVUxMaSIsICIiLCAiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHN1YnVzdzUxMl9tYXNrLCAiVjMyc1YzMnNWMzJzVjMyc1VpIiwgIiIsICJhdng1MTJidyIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJoaTUxMl9tYXNrLCAiVjMyc1YzMnNWMzJzVjMyc1VpIiwgIiIsICJhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybXQydmFyaGk1MTJfbWFzaywgIlYzMnNWMzJzVjMyc1YzMnNVaSIsICIiLCAiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmhpNTEyX21hc2t6LCAiVjMyc1YzMnNWMzJzVjMyc1VpIiwgIiIsICJhdng1MTJidyIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwY29uZmxpY3RkaV8xMjhfbWFzaywgIlYyTExpVjJMTGlWMkxMaVVjIiwiIiwiYXZ4NTEyY2QsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBjb25mbGljdGRpXzI1Nl9tYXNrLCAiVjRMTGlWNExMaVY0TExpVWMiLCIiLCJhdng1MTJjZCxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0c2lfMTI4X21hc2ssICJWNGlWNGlWNGlVYyIsIiIsImF2eDUxMmNkLGF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwY29uZmxpY3RzaV8yNTZfbWFzaywgIlY4aVY4aVY4aVVjIiwiIiwiYXZ4NTEyY2QsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBjb25mbGljdGRpXzUxMl9tYXNrLCAiVjhMTGlWOExMaVY4TExpVWMiLCAiIiwgImF2eDUxMmNkIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwY29uZmxpY3RzaV81MTJfbWFzaywgIlYxNmlWMTZpVjE2aVVzIiwgIiIsICJhdng1MTJjZCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGx6Y250ZF81MTJfbWFzaywgIlYxNmlWMTZpVjE2aVVzIiwgIiIsICJhdng1MTJjZCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGx6Y250cV81MTJfbWFzaywgIlY4TExpVjhMTGlWOExMaVVjIiwgIiIsICJhdng1MTJjZCIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwb3BjbnRkXzEyOCwgIlY0aVY0aSIsICIiLCAiYXZ4NTEydnBvcGNudGRxLGF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwb3BjbnRxXzEyOCwgIlYyTExpVjJMTGkiLCAiIiwgImF2eDUxMnZwb3BjbnRkcSxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cG9wY250ZF8yNTYsICJWOGlWOGkiLCAiIiwgImF2eDUxMnZwb3BjbnRkcSxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cG9wY250cV8yNTYsICJWNExMaVY0TExpIiwgIiIsICJhdng1MTJ2cG9wY250ZHEsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBvcGNudGRfNTEyLCAiVjE2aVYxNmkiLCAiIiwgImF2eDUxMnZwb3BjbnRkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cG9wY250cV81MTIsICJWOExMaVY4TExpIiwgIiIsICJhdng1MTJ2cG9wY250ZHEiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cG9wY250Yl8xMjgsICJWMTZjVjE2YyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyYml0YWxnIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwb3BjbnR3XzEyOCwgIlY4c1Y4cyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyYml0YWxnIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwb3BjbnRiXzI1NiwgIlYzMmNWMzJjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJiaXRhbGciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBvcGNudHdfMjU2LCAiVjE2c1YxNnMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmJpdGFsZyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cG9wY250Yl81MTIsICJWNjRjVjY0YyIsICIiLCAiYXZ4NTEyYml0YWxnIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwb3BjbnR3XzUxMiwgIlYzMnNWMzJzIiwgIiIsICJhdng1MTJiaXRhbGciKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNodWZiaXRxbWIxMjhfbWFzaywgIlVzVjE2Y1YxNmNVcyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyYml0YWxnIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2h1ZmJpdHFtYjI1Nl9tYXNrLCAiVWlWMzJjVjMyY1VpIiwgIiIsICJhdng1MTJ2bCxhdng1MTJiaXRhbGciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaHVmYml0cW1iNTEyX21hc2ssICJVTExpVjY0Y1Y2NGNVTExpIiwgIiIsICJhdng1MTJiaXRhbGciKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybWkydmFyaGkxMjhfbWFzaywgIlY4c1Y4c1Y4c1Y4c1VjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybWkydmFyaGkyNTZfbWFzaywgIlYxNnNWMTZzVjE2c1YxNnNVcyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmhpMTI4X21hc2ssICJWOHNWOHNWOHNWOHNVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmhpMTI4X21hc2t6LCAiVjhzVjhzVjhzVjhzVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJoaTI1Nl9tYXNrLCAiVjE2c1YxNnNWMTZzVjE2c1VzIiwgIiIsICJhdng1MTJ2bCxhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybXQydmFyaGkyNTZfbWFza3osICJWMTZzVjE2c1YxNnNWMTZzVXMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmJ3IikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG11bGhyc3c1MTIsICJWMzJzVjMyc1YzMnMiLCAiIiwgImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtdWxodXc1MTIsICJWMzJzVjMyc1YzMnMiLCAiIiwgImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtdWxodzUxMiwgIlYzMnNWMzJzVjMycyIsICIiLCAiYXZ4NTEyYnciKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9hZGRwZDUxMl9tYXNrLCAiVjhkVjhkVjhkVjhkVWNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9hZGRwczUxMl9tYXNrLCAiVjE2ZlYxNmZWMTZmVjE2ZlVzSWkiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZGl2cGQ1MTJfbWFzaywgIlY4ZFY4ZFY4ZFY4ZFVjSWkiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZGl2cHM1MTJfbWFzaywgIlYxNmZWMTZmVjE2ZlYxNmZVc0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX211bHBkNTEyX21hc2ssICJWOGRWOGRWOGRWOGRVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX211bHBzNTEyX21hc2ssICJWMTZmVjE2ZlYxNmZWMTZmVXNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zdWJwZDUxMl9tYXNrLCAiVjhkVjhkVjhkVjhkVWNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zdWJwczUxMl9tYXNrLCAiVjE2ZlYxNmZWMTZmVjE2ZlVzSWkiLCAiIiwgImF2eDUxMmYiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWFkZHVic3c1MTJfbWFzaywgIlYzMnNWNjRjVjY0Y1YzMnNVaSIsICIiLCAiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1hZGR3ZDUxMl9tYXNrLCAiVjE2aVYzMnNWMzJzVjE2aVVzIiwgIiIsICJhdng1MTJidyIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2FkZHNzX3JvdW5kX21hc2ssICJWNGZWNGZWNGZWNGZVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2RpdnNzX3JvdW5kX21hc2ssICJWNGZWNGZWNGZWNGZVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX211bHNzX3JvdW5kX21hc2ssICJWNGZWNGZWNGZWNGZVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3N1YnNzX3JvdW5kX21hc2ssICJWNGZWNGZWNGZWNGZVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21heHNzX3JvdW5kX21hc2ssICJWNGZWNGZWNGZWNGZVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21pbnNzX3JvdW5kX21hc2ssICJWNGZWNGZWNGZWNGZVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2FkZHNkX3JvdW5kX21hc2ssICJWMmRWMmRWMmRWMmRVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2RpdnNkX3JvdW5kX21hc2ssICJWMmRWMmRWMmRWMmRVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX211bHNkX3JvdW5kX21hc2ssICJWMmRWMmRWMmRWMmRVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3N1YnNkX3JvdW5kX21hc2ssICJWMmRWMmRWMmRWMmRVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21heHNkX3JvdW5kX21hc2ssICJWMmRWMmRWMmRWMmRVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21pbnNkX3JvdW5kX21hc2ssICJWMmRWMmRWMmRWMmRVY0lpIiwgIiIsICJhdng1MTJmIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29tcHJlc3NkZjEyOF9tYXNrLCAiVjJkVjJkVjJkVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzZGYyNTZfbWFzaywgIlY0ZFY0ZFY0ZFVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jb21wcmVzc2RpMTI4X21hc2ssICJWMkxMaVYyTExpVjJMTGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29tcHJlc3NkaTI1Nl9tYXNrLCAiVjRMTGlWNExMaVY0TExpVWMiLCAiIiwgImF2eDUxMnZsIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29tcHJlc3NoaTEyOF9tYXNrLCAiVjhzVjhzVjhzVWMiLCIiLCJhdng1MTJ2bCxhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jb21wcmVzc2hpMjU2X21hc2ssICJWMTZzVjE2c1YxNnNVcyIsIiIsImF2eDUxMnZsLGF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzcWkxMjhfbWFzaywgIlYxNmNWMTZjVjE2Y1VzIiwiIiwiYXZ4NTEydmwsYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29tcHJlc3NxaTI1Nl9tYXNrLCAiVjMyY1YzMmNWMzJjVWkiLCIiLCJhdng1MTJ2bCxhdng1MTJ2Ym1pMiIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc2YxMjhfbWFzaywgIlY0ZlY0ZlY0ZlVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jb21wcmVzc3NmMjU2X21hc2ssICJWOGZWOGZWOGZVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29tcHJlc3NzaTEyOF9tYXNrLCAiVjRpVjRpVjRpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc2kyNTZfbWFzaywgIlY4aVY4aVY4aVVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3JlZGYxMjhfbWFzaywgInZWMmQqVjJkVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVkZjI1Nl9tYXNrLCAidlY0ZCpWNGRVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWRpMTI4X21hc2ssICJ2VjJMTGkqVjJMTGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWRpMjU2X21hc2ssICJ2VjRMTGkqVjRMTGlVYyIsICIiLCAiYXZ4NTEydmwiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3JlaGkxMjhfbWFzaywgInZWOHMqVjhzVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVoaTI1Nl9tYXNrLCAidlYxNnMqVjE2c1VzIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3JlcWkxMjhfbWFzaywgInZWMTZjKlYxNmNVcyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXFpMjU2X21hc2ssICJ2VjMyYypWMzJjVWkiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZibWkyIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXNmMTI4X21hc2ssICJ2VjRmKlY0ZlVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3Jlc2YyNTZfbWFzaywgInZWOGYqVjhmVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVzaTEyOF9tYXNrLCAidlY0aSpWNGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXNpMjU2X21hc2ssICJ2VjhpKlY4aVVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRwZDJkcTEyOF9tYXNrLCAiVjRpVjJkVjRpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHBkMnBzX21hc2ssICJWNGZWMmRWNGZVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0cGQydWRxMTI4X21hc2ssICJWNGlWMmRWNGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0cGQydWRxMjU2X21hc2ssICJWNGlWNGRWNGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0cHMydWRxMTI4X21hc2ssICJWNGlWNGZWNGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0cHMydWRxMjU2X21hc2ssICJWOGlWOGZWOGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0dHBkMmRxMTI4X21hc2ssICJWNGlWMmRWNGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0dHBkMnVkcTEyOF9tYXNrLCAiVjRpVjJkVjRpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1ZHEyNTZfbWFzaywgIlY0aVY0ZFY0aVVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnR0cHMydWRxMTI4X21hc2ssICJWNGlWNGZWNGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0dHBzMnVkcTI1Nl9tYXNrLCAiVjhpVjhmVjhpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHVkcTJwczEyOF9tYXNrLCAiVjRmVjRpVjRmVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHVkcTJwczI1Nl9tYXNrLCAiVjhmVjhpVjhmVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2V4cGFuZGRmMTI4X21hc2ssICJWMmRWMmRWMmRVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZXhwYW5kZGYyNTZfbWFzaywgIlY0ZFY0ZFY0ZFVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9leHBhbmRkaTEyOF9tYXNrLCAiVjJMTGlWMkxMaVYyTExpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2V4cGFuZGRpMjU2X21hc2ssICJWNExMaVY0TExpVjRMTGlVYyIsICIiLCAiYXZ4NTEydmwiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9leHBhbmRoaTEyOF9tYXNrLCAiVjhzVjhzVjhzVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2V4cGFuZGhpMjU2X21hc2ssICJWMTZzVjE2c1YxNnNVcyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZXhwYW5kcWkxMjhfbWFzaywgIlYxNmNWMTZjVjE2Y1VzIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9leHBhbmRxaTI1Nl9tYXNrLCAiVjMyY1YzMmNWMzJjVWkiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZibWkyIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZGRmMTI4X21hc2ssICJWMmRWMmQqVjJkVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRkZjI1Nl9tYXNrLCAiVjRkVjRkKlY0ZFVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkZGkxMjhfbWFzaywgIlY0aVYyTExpKlYyTExpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRkaTI1Nl9tYXNrLCAiVjRMTGlWNExMaSpWNExMaVVjIiwgIiIsICJhdng1MTJ2bCIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRoaTEyOF9tYXNrLCAiVjhzVjhzQypWOHNVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZGhpMjU2X21hc2ssICJWMTZzVjE2c0MqVjE2c1VzIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkcWkxMjhfbWFzaywgIlYxNmNWMTZjQypWMTZjVXMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRxaTI1Nl9tYXNrLCAiVjMyY1YzMmNDKlYzMmNVaSIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydmJtaTIiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9leHBhbmRsb2Fkc2YxMjhfbWFzaywgIlY0ZlY0ZipWNGZVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZHNmMjU2X21hc2ssICJWOGZWOGYqVjhmVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRzaTEyOF9tYXNrLCAiVjRpVjRpKlY0aVVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9leHBhbmRsb2Fkc2kyNTZfbWFzaywgIlY4aVY4aSpWOGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZXhwYW5kc2YxMjhfbWFzaywgIlY0ZlY0ZlY0ZlVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9leHBhbmRzZjI1Nl9tYXNrLCAiVjhmVjhmVjhmVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2V4cGFuZHNpMTI4X21hc2ssICJWNGlWNGlWNGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZXhwYW5kc2kyNTZfbWFzaywgIlY4aVY4aVY4aVVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nZXRleHBwZDEyOF9tYXNrLCAiVjJkVjJkVjJkVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dldGV4cHBkMjU2X21hc2ssICJWNGRWNGRWNGRVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2V0ZXhwcHMxMjhfbWFzaywgIlY0ZlY0ZlY0ZlVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nZXRleHBwczI1Nl9tYXNrLCAiVjhmVjhmVjhmVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BhYnNxMTI4X21hc2ssICJWMkxMaVYyTExpVjJMTGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGFic3EyNTZfbWFzaywgIlY0TExpVjRMTGlWNExMaVVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWF4c3ExMjhfbWFzaywgIlYyTExpVjJMTGlWMkxMaVYyTExpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtYXhzcTI1Nl9tYXNrLCAiVjRMTGlWNExMaVY0TExpVjRMTGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1heHVxMTI4X21hc2ssICJWMkxMaVYyTExpVjJMTGlWMkxMaVVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWF4dXEyNTZfbWFzaywgIlY0TExpVjRMTGlWNExMaVY0TExpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtaW5zcTEyOF9tYXNrLCAiVjJMTGlWMkxMaVYyTExpVjJMTGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1pbnNxMjU2X21hc2ssICJWNExMaVY0TExpVjRMTGlWNExMaVVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbWludXExMjhfbWFzaywgIlYyTExpVjJMTGlWMkxMaVYyTExpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BtaW51cTI1Nl9tYXNrLCAiVjRMTGlWNExMaVY0TExpVjRMTGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcm5kc2NhbGVwZF8xMjhfbWFzaywgIlYyZFYyZElpVjJkVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcGRfMjU2X21hc2ssICJWNGRWNGRJaVY0ZFVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBzXzEyOF9tYXNrLCAiVjRmVjRmSWlWNGZVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcm5kc2NhbGVwc18yNTZfbWFzaywgIlY4ZlY4ZklpVjhmVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYWxlZnBkMTI4X21hc2ssICJWMmRWMmRWMmRWMmRVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2NhbGVmcGQyNTZfbWFzaywgIlY0ZFY0ZFY0ZFY0ZFVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zY2FsZWZwczEyOF9tYXNrLCAiVjRmVjRmVjRmVjRmVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYWxlZnBzMjU2X21hc2ssICJWOGZWOGZWOGZWOGZVYyIsICIiLCAiYXZ4NTEydmwiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2MmRmLCAidmQqVWNWMkxMaVYyZElpIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2MmRpLCAidkxMaSpVY1YyTExpVjJMTGlJaSIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjRkZiwgInZkKlVjVjRMTGlWNGRJaSIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjRkaSwgInZMTGkqVWNWNExMaVY0TExpSWkiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY0c2YsICJ2ZipVY1YyTExpVjRmSWkiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY0c2ksICJ2aSpVY1YyTExpVjRpSWkiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY4c2YsICJ2ZipVY1Y0TExpVjRmSWkiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY4c2ksICJ2aSpVY1Y0TExpVjRpSWkiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXYyZGYsICJ2ZCpVY1Y0aVYyZElpIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2MmRpLCAidkxMaSpVY1Y0aVYyTExpSWkiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY0ZGYsICJ2ZCpVY1Y0aVY0ZElpIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2NGRpLCAidkxMaSpVY1Y0aVY0TExpSWkiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY0c2YsICJ2ZipVY1Y0aVY0ZklpIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2NHNpLCAidmkqVWNWNGlWNGlJaSIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjhzZiwgInZmKlVjVjhpVjhmSWkiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY4c2ksICJ2aSpVY1Y4aVY4aUlpIiwgIiIsICJhdng1MTJ2bCIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJkMTI4X21hc2ssICJWNGlWNGlWNGlWNGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcmQyNTZfbWFzaywgIlY4aVY4aVY4aVY4aVVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybWkydmFycGQxMjhfbWFzaywgIlYyZFYyZFYyTExpVjJkVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJwZDI1Nl9tYXNrLCAiVjRkVjRkVjRMTGlWNGRVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnBzMTI4X21hc2ssICJWNGZWNGZWNGlWNGZVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnBzMjU2X21hc2ssICJWOGZWOGZWOGlWOGZVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnExMjhfbWFzaywgIlYyTExpVjJMTGlWMkxMaVYyTExpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJxMjU2X21hc2ssICJWNExMaVY0TExpVjRMTGlWNExMaVVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybXQydmFyZDEyOF9tYXNrLCAiVjRpVjRpVjRpVjRpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJkMTI4X21hc2t6LCAiVjRpVjRpVjRpVjRpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJkMjU2X21hc2ssICJWOGlWOGlWOGlWOGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmQyNTZfbWFza3osICJWOGlWOGlWOGlWOGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBkMTI4X21hc2ssICJWMmRWMkxMaVYyZFYyZFVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybXQydmFycGQxMjhfbWFza3osICJWMmRWMkxMaVYyZFYyZFVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybXQydmFycGQyNTZfbWFzaywgIlY0ZFY0TExpVjRkVjRkVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwZDI1Nl9tYXNreiwgIlY0ZFY0TExpVjRkVjRkVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwczEyOF9tYXNrLCAiVjRmVjRpVjRmVjRmVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwczEyOF9tYXNreiwgIlY0ZlY0aVY0ZlY0ZlVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybXQydmFycHMyNTZfbWFzaywgIlY4ZlY4aVY4ZlY4ZlVjIiwgIiIsICJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybXQydmFycHMyNTZfbWFza3osICJWOGZWOGlWOGZWOGZVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnExMjhfbWFzaywgIlYyTExpVjJMTGlWMkxMaVYyTExpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxMTI4X21hc2t6LCAiVjJMTGlWMkxMaVYyTExpVjJMTGlVYyIsICIiLCAiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnEyNTZfbWFzaywgIlY0TExpVjRMTGlWNExMaVY0TExpVWMiLCAiIiwgImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxMjU2X21hc2t6LCAiVjRMTGlWNExMaVY0TExpVjRMTGlVYyIsICIiLCAiYXZ4NTEydmwiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNobGRkMTI4X21hc2ssICJWNGlWNGlWNGlJaVY0aVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNobGRkMjU2X21hc2ssICJWOGlWOGlWOGlJaVY4aVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNobGRkNTEyX21hc2ssICJWMTZpVjE2aVYxNmlJaVYxNmlVcyIsICIiLCAiYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaGxkcTEyOF9tYXNrLCAiVjJMTGlWMkxMaVYyTExpSWlWMkxMaVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNobGRxMjU2X21hc2ssICJWNExMaVY0TExpVjRMTGlJaVY0TExpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHE1MTJfbWFzaywgIlY4TExpVjhMTGlWOExMaUlpVjhMTGlVYyIsICIiLCAiYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaGxkdzEyOF9tYXNrLCAiVjhzVjhzVjhzSWlWOHNVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaGxkdzI1Nl9tYXNrLCAiVjE2c1YxNnNWMTZzSWlWMTZzVXMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHc1MTJfbWFzaywgIlYzMnNWMzJzVjMyc0lpVjMyc1VpIiwgIiIsICJhdng1MTJ2Ym1pMiIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZkMTI4X21hc2ssICJWNGlWNGlWNGlWNGlVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaGxkdmQyNTZfbWFzaywgIlY4aVY4aVY4aVY4aVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNobGR2ZDUxMl9tYXNrLCAiVjE2aVYxNmlWMTZpVjE2aVVzIiwgIiIsICJhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNobGR2cTEyOF9tYXNrLCAiVjJMTGlWMkxMaVYyTExpVjJMTGlVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaGxkdnEyNTZfbWFzaywgIlY0TExpVjRMTGlWNExMaVY0TExpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZxNTEyX21hc2ssICJWOExMaVY4TExpVjhMTGlWOExMaVVjIiwgIiIsICJhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNobGR2dzEyOF9tYXNrLCAiVjhzVjhzVjhzVjhzVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZ3MjU2X21hc2ssICJWMTZzVjE2c1YxNnNWMTZzVXMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZ3NTEyX21hc2ssICJWMzJzVjMyc1YzMnNWMzJzVWkiLCAiIiwgImF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZkMTI4X21hc2t6LCAiVjRpVjRpVjRpVjRpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZkMjU2X21hc2t6LCAiVjhpVjhpVjhpVjhpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZkNTEyX21hc2t6LCAiVjE2aVYxNmlWMTZpVjE2aVVzIiwgIiIsICJhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNobGR2cTEyOF9tYXNreiwgIlYyTExpVjJMTGlWMkxMaVYyTExpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZxMjU2X21hc2t6LCAiVjRMTGlWNExMaVY0TExpVjRMTGlVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaGxkdnE1MTJfbWFza3osICJWOExMaVY4TExpVjhMTGlWOExMaVVjIiwgIiIsICJhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNobGR2dzEyOF9tYXNreiwgIlY4c1Y4c1Y4c1Y4c1VjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNobGR2dzI1Nl9tYXNreiwgIlYxNnNWMTZzVjE2c1YxNnNVcyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaGxkdnc1MTJfbWFza3osICJWMzJzVjMyc1YzMnNWMzJzVWkiLCAiIiwgImF2eDUxMnZibWkyIikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaHJkdmQxMjhfbWFzaywgIlY0aVY0aVY0aVY0aVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNocmR2ZDI1Nl9tYXNrLCAiVjhpVjhpVjhpVjhpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZkNTEyX21hc2ssICJWMTZpVjE2aVYxNmlWMTZpVXMiLCAiIiwgImF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZxMTI4X21hc2ssICJWMkxMaVYyTExpVjJMTGlWMkxMaVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNocmR2cTI1Nl9tYXNrLCAiVjRMTGlWNExMaVY0TExpVjRMTGlVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaHJkdnE1MTJfbWFzaywgIlY4TExpVjhMTGlWOExMaVY4TExpVWMiLCAiIiwgImF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZ3MTI4X21hc2ssICJWOHNWOHNWOHNWOHNVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaHJkdncyNTZfbWFzaywgIlYxNnNWMTZzVjE2c1YxNnNVcyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaHJkdnc1MTJfbWFzaywgIlYzMnNWMzJzVjMyc1YzMnNVaSIsICIiLCAiYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaHJkdmQxMjhfbWFza3osICJWNGlWNGlWNGlWNGlVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaHJkdmQyNTZfbWFza3osICJWOGlWOGlWOGlWOGlVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaHJkdmQ1MTJfbWFza3osICJWMTZpVjE2aVYxNmlWMTZpVXMiLCAiIiwgImF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZxMTI4X21hc2t6LCAiVjJMTGlWMkxMaVYyTExpVjJMTGlVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaHJkdnEyNTZfbWFza3osICJWNExMaVY0TExpVjRMTGlWNExMaVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNocmR2cTUxMl9tYXNreiwgIlY4TExpVjhMTGlWOExMaVY4TExpVWMiLCAiIiwgImF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZ3MTI4X21hc2t6LCAiVjhzVjhzVjhzVjhzVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZ3MjU2X21hc2t6LCAiVjE2c1YxNnNWMTZzVjE2c1VzIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNocmR2dzUxMl9tYXNreiwgIlYzMnNWMzJzVjMyc1YzMnNVaSIsICIiLCAiYXZ4NTEydmJtaTIiKQorCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNocmRkMTI4X21hc2ssICJWNGlWNGlWNGlJaVY0aVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNocmRkMjU2X21hc2ssICJWOGlWOGlWOGlJaVY4aVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNocmRkNTEyX21hc2ssICJWMTZpVjE2aVYxNmlJaVYxNmlVcyIsICIiLCAiYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaHJkcTEyOF9tYXNrLCAiVjJMTGlWMkxMaVYyTExpSWlWMkxMaVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cHNocmRxMjU2X21hc2ssICJWNExMaVY0TExpVjRMTGlJaVY0TExpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHE1MTJfbWFzaywgIlY4TExpVjhMTGlWOExMaUlpVjhMTGlVYyIsICIiLCAiYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaHJkdzEyOF9tYXNrLCAiVjhzVjhzVjhzSWlWOHNVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBzaHJkdzI1Nl9tYXNrLCAiVjE2c1YxNnNWMTZzSWlWMTZzVXMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHc1MTJfbWFzaywgIlYzMnNWMzJzVjMyc0lpVjMyc1VpIiwgIiIsICJhdng1MTJ2Ym1pMiIpCisKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Zzd2I1MTJfbWFzaywgIlYzMmNWMzJzVjMyY1VpIiwgIiIsICJhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92dXN3YjUxMl9tYXNrLCAiVjMyY1YzMnNWMzJjVWkiLCAiIiwgImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Z3YjUxMl9tYXNrLCAiVjMyY1YzMnNWMzJjVWkiLCAiIiwgImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHBkMnFxMTI4X21hc2ssICJWMkxMaVYyZFYyTExpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHBkMnFxMjU2X21hc2ssICJWNExMaVY0ZFY0TExpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHBkMnVxcTEyOF9tYXNrLCAiVjJMTGlWMmRWMkxMaVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRwZDJ1cXEyNTZfbWFzaywgIlY0TExpVjRkVjRMTGlVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0cHMycXExMjhfbWFzaywgIlYyTExpVjRmVjJMTGlVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0cHMycXEyNTZfbWFzaywgIlY0TExpVjRmVjRMTGlVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0cHMydXFxMTI4X21hc2ssICJWMkxMaVY0ZlYyTExpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHBzMnVxcTI1Nl9tYXNrLCAiVjRMTGlWNGZWNExMaVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRxcTJwZDEyOF9tYXNrLCAiVjJkVjJMTGlWMmRVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0cXEycGQyNTZfbWFzaywgIlY0ZFY0TExpVjRkVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHFxMnBzMTI4X21hc2ssICJWNGZWMkxMaVY0ZlVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRxcTJwczI1Nl9tYXNrLCAiVjRmVjRMTGlWNGZVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0dHBkMnFxMTI4X21hc2ssICJWMkxMaVYyZFYyTExpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJxcTI1Nl9tYXNrLCAiVjRMTGlWNGRWNExMaVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnR0cGQydXFxMTI4X21hc2ssICJWMkxMaVYyZFYyTExpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1cXEyNTZfbWFzaywgIlY0TExpVjRkVjRMTGlVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0dHBzMnFxMTI4X21hc2ssICJWMkxMaVY0ZlYyTExpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHRwczJxcTI1Nl9tYXNrLCAiVjRMTGlWNGZWNExMaVVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnR0cHMydXFxMTI4X21hc2ssICJWMkxMaVY0ZlYyTExpVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1cXEyNTZfbWFzaywgIlY0TExpVjRmVjRMTGlVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0dXFxMnBkMTI4X21hc2ssICJWMmRWMkxMaVYyZFVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnR1cXEycGQyNTZfbWFzaywgIlY0ZFY0TExpVjRkVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwczEyOF9tYXNrLCAiVjRmVjJMTGlWNGZVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0dXFxMnBzMjU2X21hc2ssICJWNGZWNExMaVY0ZlVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yYW5nZXBkMTI4X21hc2ssICJWMmRWMmRWMmRJaVYyZFVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yYW5nZXBkMjU2X21hc2ssICJWNGRWNGRWNGRJaVY0ZFVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yYW5nZXBzMTI4X21hc2ssICJWNGZWNGZWNGZJaVY0ZlVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yYW5nZXBzMjU2X21hc2ssICJWOGZWOGZWOGZJaVY4ZlVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yYW5nZXNkMTI4X3JvdW5kX21hc2ssICJWMmRWMmRWMmRWMmRVY0lpSWkiLCAiIiwgImF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Jhbmdlc3MxMjhfcm91bmRfbWFzaywgIlY0ZlY0ZlY0ZlY0ZlVjSWlJaSIsICIiLCAiYXZ4NTEyZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcmVkdWNlcGQxMjhfbWFzaywgIlYyZFYyZElpVjJkVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JlZHVjZXBkMjU2X21hc2ssICJWNGRWNGRJaVY0ZFVjIiwgIiIsICJhdng1MTJ2bCxhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yZWR1Y2VwczEyOF9tYXNrLCAiVjRmVjRmSWlWNGZVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcmVkdWNlcHMyNTZfbWFzaywgIlY4ZlY4ZklpVjhmVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JlZHVjZXNkX21hc2ssICJWMmRWMmRWMmRWMmRVY0lpSWkiLCAiIiwgImF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JlZHVjZXNzX21hc2ssICJWNGZWNGZWNGZWNGZVY0lpSWkiLCAiIiwgImF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Zzd2IxMjhfbWFzaywgIlYxNmNWOHNWMTZjVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Zzd2IyNTZfbWFzaywgIlYxNmNWMTZzVjE2Y1VzIiwgIiIsICJhdng1MTJ2bCxhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92dXN3YjEyOF9tYXNrLCAiVjE2Y1Y4c1YxNmNVYyIsICIiLCAiYXZ4NTEydmwsYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnVzd2IyNTZfbWFzaywgIlYxNmNWMTZzVjE2Y1VzIiwgIiIsICJhdng1MTJ2bCxhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92d2IxMjhfbWFzaywgIlYxNmNWOHNWMTZjVWMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Z3YjI1Nl9tYXNrLCAiVjE2Y1YxNnNWMTZjVXMiLCAiIiwgImF2eDUxMnZsLGF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHBkMnFxNTEyX21hc2ssICJWOExMaVY4ZFY4TExpVWNJaSIsICIiLCAiYXZ4NTEyZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0cGQydXFxNTEyX21hc2ssICJWOExMaVY4ZFY4TExpVWNJaSIsICIiLCAiYXZ4NTEyZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0cHMycXE1MTJfbWFzaywgIlY4TExpVjhmVjhMTGlVY0lpIiwgIiIsICJhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRwczJ1cXE1MTJfbWFzaywgIlY4TExpVjhmVjhMTGlVY0lpIiwgIiIsICJhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRxcTJwZDUxMl9tYXNrLCAiVjhkVjhMTGlWOGRVY0lpIiwgIiIsICJhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRxcTJwczUxMl9tYXNrLCAiVjhmVjhMTGlWOGZVY0lpIiwgIiIsICJhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnR0cGQycXE1MTJfbWFzaywgIlY4TExpVjhkVjhMTGlVY0lpIiwgIiIsICJhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnR0cGQydXFxNTEyX21hc2ssICJWOExMaVY4ZFY4TExpVWNJaSIsICIiLCAiYXZ4NTEyZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0dHBzMnFxNTEyX21hc2ssICJWOExMaVY4ZlY4TExpVWNJaSIsICIiLCAiYXZ4NTEyZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0dHBzMnVxcTUxMl9tYXNrLCAiVjhMTGlWOGZWOExMaVVjSWkiLCAiIiwgImF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwZDUxMl9tYXNrLCAiVjhkVjhMTGlWOGRVY0lpIiwgIiIsICJhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnR1cXEycHM1MTJfbWFzaywgIlY4ZlY4TExpVjhmVWNJaSIsICIiLCAiYXZ4NTEyZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcmFuZ2VwZDUxMl9tYXNrLCAiVjhkVjhkVjhkSWlWOGRVY0lpIiwgIiIsICJhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yYW5nZXBzNTEyX21hc2ssICJWMTZmVjE2ZlYxNmZJaVYxNmZVc0lpIiwgIiIsICJhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yZWR1Y2VwZDUxMl9tYXNrLCAiVjhkVjhkSWlWOGRVY0lpIiwgIiIsICJhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yZWR1Y2VwczUxMl9tYXNrLCAiVjE2ZlYxNmZJaVYxNmZVc0lpIiwgIiIsICJhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wcm9sZDUxMl9tYXNrLCAiVjE2aVYxNmlJaVYxNmlVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHJvbHE1MTJfbWFzaywgIlY4TExpVjhMTGlJaVY4TExpVWMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Byb2xkMTI4X21hc2ssICJWNGlWNGlJaVY0aVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHJvbGQyNTZfbWFzaywgIlY4aVY4aUlpVjhpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wcm9scTEyOF9tYXNrLCAiVjJMTGlWMkxMaUlpVjJMTGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Byb2xxMjU2X21hc2ssICJWNExMaVY0TExpSWlWNExMaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHJvbHZkNTEyX21hc2ssICJWMTZpVjE2aVYxNmlWMTZpVXMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Byb2x2cTUxMl9tYXNrLCAiVjhMTGlWOExMaVY4TExpVjhMTGlVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHJvcmQ1MTJfbWFzaywgIlYxNmlWMTZpaVYxNmlVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHJvcnE1MTJfbWFzaywgIlY4TExpVjhMTGlpVjhMTGlVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHJvbHZkMTI4X21hc2ssICJWNGlWNGlWNGlWNGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Byb2x2ZDI1Nl9tYXNrLCAiVjhpVjhpVjhpVjhpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wcm9sdnExMjhfbWFzaywgIlYyTExpVjJMTGlWMkxMaVYyTExpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wcm9sdnEyNTZfbWFzaywgIlY0TExpVjRMTGlWNExMaVY0TExpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wcm9yZDEyOF9tYXNrLCAiVjRpVjRpSWlWNGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Byb3JkMjU2X21hc2ssICJWOGlWOGlJaVY4aVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHJvcnExMjhfbWFzaywgIlYyTExpVjJMTGlJaVYyTExpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wcm9ycTI1Nl9tYXNrLCAiVjRMTGlWNExMaUlpVjRMTGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Byb3J2ZDUxMl9tYXNrLCAiVjE2aVYxNmlWMTZpVjE2aVVzIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wcm9ydnE1MTJfbWFzaywgIlY4TExpVjhMTGlWOExMaVY4TExpVWMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Byb3J2ZDEyOF9tYXNrLCAiVjRpVjRpVjRpVjRpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wcm9ydmQyNTZfbWFzaywgIlY4aVY4aVY4aVY4aVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHJvcnZxMTI4X21hc2ssICJWMkxMaVYyTExpVjJMTGlWMkxMaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHJvcnZxMjU2X21hc2ssICJWNExMaVY0TExpVjRMTGlWNExMaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNsbHYzMmhpLCAiVjMyc1YzMnNWMzJzIiwiIiwiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNsbHc1MTIsICJWMzJzVjMyc1Y4cyIsIiIsImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzbGx3aTUxMiwgIlYzMnNWMzJzaSIsIiIsImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzbGx2MTZoaSwgIlYxNnNWMTZzVjE2cyIsIiIsImF2eDUxMmJ3LGF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzbGx2OGhpLCAiVjhzVjhzVjhzIiwiIiwiYXZ4NTEyYncsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNsbGRpNTEyLCAiVjE2aVYxNmlpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2xscWk1MTIsICJWOExMaVY4TExpaSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNybHYzMmhpLCAiVjMyc1YzMnNWMzJzIiwiIiwiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNybHYxNmhpLCAiVjE2c1YxNnNWMTZzIiwiIiwiYXZ4NTEyYncsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNybHY4aGksICJWOHNWOHNWOHMiLCIiLCJhdng1MTJidyxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JsZGk1MTIsICJWMTZpVjE2aWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzcmxxaTUxMiwgIlY4TExpVjhMTGlpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JhdjMyaGksICJWMzJzVjMyc1YzMnMiLCIiLCJhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JhdjE2aGksICJWMTZzVjE2c1YxNnMiLCIiLCJhdng1MTJidyxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JhdjhoaSwgIlY4c1Y4c1Y4cyIsIiIsImF2eDUxMmJ3LGF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzcmF2cTEyOCwgIlYyTExpVjJMTGlWMkxMaSIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzcmF2cTI1NiwgIlY0TExpVjRMTGlWNExMaSIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzcmF3NTEyLCAiVjMyc1YzMnNWOHMiLCIiLCJhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3Jhd2k1MTIsICJWMzJzVjMyc2kiLCIiLCJhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JsdzUxMiwgIlYzMnNWMzJzVjhzIiwiIiwiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNybHdpNTEyLCAiVjMyc1YzMnNpIiwiIiwiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbW92ZHFhMzJsb2FkMTI4X21hc2ssICJWNGlWNGkqVjRpVWMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21vdmRxYTMybG9hZDI1Nl9tYXNrLCAiVjhpVjhpKlY4aVVjIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tb3ZkcWEzMmxvYWQ1MTJfbWFzaywgIlYxNmlWMTZpQypWMTZpVXMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21vdmRxYTMyc3RvcmU1MTJfbWFzaywgInZWMTZpKlYxNmlVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbW92ZHFhNjRsb2FkNTEyX21hc2ssICJWOExMaVY4TExpQypWOExMaVVjIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tb3ZkcWE2NHN0b3JlNTEyX21hc2ssICJ2VjhMTGkqVjhMTGlVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbW92ZHFhMzJzdG9yZTEyOF9tYXNrLCAidlY0aSpWNGlVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbW92ZHFhMzJzdG9yZTI1Nl9tYXNrLCAidlY4aSpWOGlVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbW92ZHFhNjRsb2FkMTI4X21hc2ssICJWMkxMaVYyTExpQypWMkxMaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbW92ZHFhNjRsb2FkMjU2X21hc2ssICJWNExMaVY0TExpQypWNExMaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbW92ZHFhNjRzdG9yZTEyOF9tYXNrLCAidlYyTExpKlYyTExpVWMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX21vdmRxYTY0c3RvcmUyNTZfbWFzaywgInZWNExMaSpWNExMaVVjIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmh1cTUxMl9tYXNrLCAiVjhMTGlWOExMaVY4TExpVjhMTGlVYyIsIiIsImF2eDUxMmlmbWEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBtYWRkNTJodXE1MTJfbWFza3osICJWOExMaVY4TExpVjhMTGlWOExMaVVjIiwiIiwiYXZ4NTEyaWZtYSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmx1cTUxMl9tYXNrLCAiVjhMTGlWOExMaVY4TExpVjhMTGlVYyIsIiIsImF2eDUxMmlmbWEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBtYWRkNTJsdXE1MTJfbWFza3osICJWOExMaVY4TExpVjhMTGlWOExMaVVjIiwiIiwiYXZ4NTEyaWZtYSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmh1cTEyOF9tYXNrLCAiVjJMTGlWMkxMaVYyTExpVjJMTGlVYyIsIiIsImF2eDUxMmlmbWEsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBtYWRkNTJodXExMjhfbWFza3osICJWMkxMaVYyTExpVjJMTGlWMkxMaVVjIiwiIiwiYXZ4NTEyaWZtYSxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmh1cTI1Nl9tYXNrLCAiVjRMTGlWNExMaVY0TExpVjRMTGlVYyIsIiIsImF2eDUxMmlmbWEsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBtYWRkNTJodXEyNTZfbWFza3osICJWNExMaVY0TExpVjRMTGlWNExMaVVjIiwiIiwiYXZ4NTEyaWZtYSxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmx1cTEyOF9tYXNrLCAiVjJMTGlWMkxMaVYyTExpVjJMTGlVYyIsIiIsImF2eDUxMmlmbWEsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBtYWRkNTJsdXExMjhfbWFza3osICJWMkxMaVYyTExpVjJMTGlWMkxMaVVjIiwiIiwiYXZ4NTEyaWZtYSxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmx1cTI1Nl9tYXNrLCAiVjRMTGlWNExMaVY0TExpVjRMTGlVYyIsIiIsImF2eDUxMmlmbWEsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBtYWRkNTJsdXEyNTZfbWFza3osICJWNExMaVY0TExpVjRMTGlWNExMaVVjIiwiIiwiYXZ4NTEyaWZtYSxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybWkydmFycWk1MTJfbWFzaywgIlY2NGNWNjRjVjY0Y1Y2NGNVTExpIiwiIiwiYXZ4NTEydmJtaSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybXQydmFycWk1MTJfbWFzaywgIlY2NGNWNjRjVjY0Y1Y2NGNVTExpIiwiIiwiYXZ4NTEydmJtaSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybXQydmFycWk1MTJfbWFza3osICJWNjRjVjY0Y1Y2NGNWNjRjVUxMaSIsIiIsImF2eDUxMnZibWkiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnFpMTI4X21hc2ssICJWMTZjVjE2Y1YxNmNWMTZjVXMiLCIiLCJhdng1MTJ2Ym1pLGF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJxaTI1Nl9tYXNrLCAiVjMyY1YzMmNWMzJjVjMyY1VpIiwiIiwiYXZ4NTEydmJtaSxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybXQydmFycWkxMjhfbWFzaywgIlYxNmNWMTZjVjE2Y1YxNmNVcyIsIiIsImF2eDUxMnZibWksYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnFpMTI4X21hc2t6LCAiVjE2Y1YxNmNWMTZjVjE2Y1VzIiwiIiwiYXZ4NTEydmJtaSxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybXQydmFycWkyNTZfbWFzaywgIlYzMmNWMzJjVjMyY1YzMmNVaSIsIiIsImF2eDUxMnZibWksYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnFpMjU2X21hc2t6LCAiVjMyY1YzMmNWMzJjVjMyY1VpIiwiIiwiYXZ4NTEydmJtaSxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Y29taXNkLCAiaVYyZFYyZElpSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zjb21pc3MsICJpVjRmVjRmSWlJaSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfa3VucGNrZGksICJVTExpVUxMaVVMTGkiLCIiLCJhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9rdW5wY2tzaSwgIlVpVWlVaSIsIiIsImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2xvYWRkcXVoaTUxMl9tYXNrLCAiVjMyc1YzMnMqVjMyc1VpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9sb2FkZHF1cWk1MTJfbWFzaywgIlY2NGNWNjRjKlY2NGNVTExpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkNTEyX21hc2ssICJWOGRWOGRWOGRWOExMaUlpVWNJaSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZml4dXBpbW1wZDUxMl9tYXNreiwgIlY4ZFY4ZFY4ZFY4TExpSWlVY0lpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9maXh1cGltbXBzNTEyX21hc2ssICJWMTZmVjE2ZlYxNmZWMTZpSWlVc0lpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9maXh1cGltbXBzNTEyX21hc2t6LCAiVjE2ZlYxNmZWMTZmVjE2aUlpVXNJaSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZml4dXBpbW1zZF9tYXNrLCAiVjJkVjJkVjJkVjJMTGlJaVVjSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tc2RfbWFza3osICJWMmRWMmRWMmRWMkxMaUlpVWNJaSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZml4dXBpbW1zc19tYXNrLCAiVjRmVjRmVjRmVjRpSWlVY0lpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9maXh1cGltbXNzX21hc2t6LCAiVjRmVjRmVjRmVjRpSWlVY0lpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nZXRleHBzZDEyOF9yb3VuZF9tYXNrLCAiVjJkVjJkVjJkVjJkVWNJaSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2V0ZXhwc3MxMjhfcm91bmRfbWFzaywgIlY0ZlY0ZlY0ZlY0ZlVjSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dldG1hbnRzZF9yb3VuZF9tYXNrLCAiVjJkVjJkVjJkSWlWMmRVY0lpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nZXRtYW50c3Nfcm91bmRfbWFzaywgIlY0ZlY0ZlY0ZklpVjRmVWNJaSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbG9hZGRxdWhpMTI4X21hc2ssICJWOHNWOHMqVjhzVWMiLCIiLCJhdng1MTJidyxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9sb2FkZHF1aGkyNTZfbWFzaywgIlYxNnNWMTZzKlYxNnNVcyIsIiIsImF2eDUxMmJ3LGF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2xvYWRkcXVxaTEyOF9tYXNrLCAiVjE2Y1YxNmMqVjE2Y1VzIiwiIiwiYXZ4NTEyYncsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbG9hZGRxdXFpMjU2X21hc2ssICJWMzJjVjMyYypWMzJjVWkiLCIiLCJhdng1MTJidyxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkMTI4X21hc2ssICJWMmRWMmRWMmRWMkxMaUlpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkMTI4X21hc2t6LCAiVjJkVjJkVjJkVjJMTGlJaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZml4dXBpbW1wZDI1Nl9tYXNrLCAiVjRkVjRkVjRkVjRMTGlJaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZml4dXBpbW1wZDI1Nl9tYXNreiwgIlY0ZFY0ZFY0ZFY0TExpSWlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tcHMxMjhfbWFzaywgIlY0ZlY0ZlY0ZlY0aUlpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9maXh1cGltbXBzMTI4X21hc2t6LCAiVjRmVjRmVjRmVjRpSWlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tcHMyNTZfbWFzaywgIlY4ZlY4ZlY4ZlY4aUlpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9maXh1cGltbXBzMjU2X21hc2t6LCAiVjhmVjhmVjhmVjhpSWlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2xvYWRhcGQxMjhfbWFzaywgIlYyZFYyZCpWMmRVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2xvYWRzZDEyOF9tYXNrLCAiVjhkVjhkKlY4ZFVjIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9sb2FkYXBkMjU2X21hc2ssICJWNGRWNGQqVjRkVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9sb2FkYXBzMTI4X21hc2ssICJWNGZWNGYqVjRmVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9sb2Fkc3MxMjhfbWFzaywgIlYxNmZWMTZmKlYxNmZVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbG9hZGFwczI1Nl9tYXNrLCAiVjhmVjhmKlY4ZlVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbG9hZGRxdWRpMTI4X21hc2ssICJWMkxMaVYyTExpKlYyTExpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9sb2FkZHF1ZGkyNTZfbWFzaywgIlY0TExpVjRMTGkqVjRMTGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2xvYWRkcXVzaTEyOF9tYXNrLCAiVjRpVjRpKlY0aVVjIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9sb2FkZHF1c2kyNTZfbWFzaywgIlY4aVY4aSpWOGlVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbG9hZHVwZDEyOF9tYXNrLCAiVjJkVjJkKlYyZFVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbG9hZHVwZDI1Nl9tYXNrLCAiVjRkVjRkKlY0ZFVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbG9hZHVwczEyOF9tYXNrLCAiVjRmVjRmKlY0ZlVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbG9hZHVwczI1Nl9tYXNrLCAiVjhmVjhmKlY4ZlVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc3RvcmVkcXVoaTUxMl9tYXNrLCAidlYzMnMqVjMyc1VpIiwiIiwiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc3RvcmVkcXVxaTUxMl9tYXNrLCAidlY2NGMqVjY0Y1VMTGkiLCIiLCJhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zdG9yZWRxdWhpMTI4X21hc2ssICJ2VjhzKlY4c1VjIiwiIiwiYXZ4NTEydmwsYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc3RvcmVkcXVoaTI1Nl9tYXNrLCAidlYxNnMqVjE2c1VzIiwiIiwiYXZ4NTEydmwsYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc3RvcmVkcXVxaTEyOF9tYXNrLCAidlYxNmMqVjE2Y1VzIiwiIiwiYXZ4NTEydmwsYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc3RvcmVkcXVxaTI1Nl9tYXNrLCAidlYzMmMqVjMyY1VpIiwiIiwiYXZ4NTEydmwsYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc3RvcmVhcGQxMjhfbWFzaywgInZWMmQqVjJkVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zdG9yZXNkMTI4X21hc2ssICJ2VjhkKlY4ZFVjIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zdG9yZWFwZDI1Nl9tYXNrLCAidlY0ZCpWNGRVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3N0b3JlYXBzMTI4X21hc2ssICJ2VjRmKlY0ZlVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc3RvcmVzczEyOF9tYXNrLCAidlYxNmYqVjE2ZlVzIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zdG9yZWFwczI1Nl9tYXNrLCAidlY4ZipWOGZVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3N0b3JlZHF1ZGkxMjhfbWFzaywgInZWMkxMaSpWMkxMaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc3RvcmVkcXVkaTI1Nl9tYXNrLCAidlY0TExpKlY0TExpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zdG9yZWRxdXNpMTI4X21hc2ssICJ2VjRpKlY0aVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc3RvcmVkcXVzaTI1Nl9tYXNrLCAidlY4aSpWOGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3N0b3JldXBkMTI4X21hc2ssICJ2VjJkKlYyZFVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc3RvcmV1cGQyNTZfbWFzaywgInZWNGQqVjRkVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zdG9yZXVwczEyOF9tYXNrLCAidlY0ZipWNGZVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3N0b3JldXBzMjU2X21hc2ssICJ2VjhmKlY4ZlVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcmNwMTRwZDEyOF9tYXNrLCAiVjJkVjJkVjJkVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yY3AxNHBkMjU2X21hc2ssICJWNGRWNGRWNGRVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JjcDE0cHMxMjhfbWFzaywgIlY0ZlY0ZlY0ZlVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcmNwMTRwczI1Nl9tYXNrLCAiVjhmVjhmVjhmVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGx6Y250ZF8xMjhfbWFzaywgIlY0aVY0aVY0aVVjIiwiIiwiYXZ4NTEyY2QsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBsemNudGRfMjU2X21hc2ssICJWOGlWOGlWOGlVYyIsIiIsImF2eDUxMmNkLGF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwbHpjbnRxXzEyOF9tYXNrLCAiVjJMTGlWMkxMaVYyTExpVWMiLCIiLCJhdng1MTJjZCxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGx6Y250cV8yNTZfbWFzaywgIlY0TExpVjRMTGlWNExMaVVjIiwiIiwiYXZ4NTEyY2QsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmN2dHNkMnNpMzIsICJpVjJkSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZjdnRzZDJ1c2kzMiwgIlVpVjJkSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZjdnRzczJzaTMyLCAiaVY0ZklpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Y3Z0c3MydXNpMzIsICJVaVY0ZklpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Y3Z0dHNkMnNpMzIsICJpVjJkSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZjdnR0c2QydXNpMzIsICJVaVYyZElpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Y3Z0dHNzMnNpMzIsICJpVjRmSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZjdnR0c3MydXNpMzIsICJVaVY0ZklpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybWkydmFyZDUxMl9tYXNrLCAiVjE2aVYxNmlWMTZpVjE2aVVzIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybWkydmFycGQ1MTJfbWFzaywgIlY4ZFY4ZFY4TExpVjhkVWMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJwczUxMl9tYXNrLCAiVjE2ZlYxNmZWMTZpVjE2ZlVzIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92cGVybWkydmFycTUxMl9tYXNrLCAiVjhMTGlWOExMaVY4TExpVjhMTGlVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBkNTEyLCAiVjhkVjhkVjhMTGkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwczUxMiwgIlYxNmZWMTZmVjE2aSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmQ1MTJfbWFza3osICJWMTZpVjE2aVYxNmlWMTZpVXMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwZDUxMl9tYXNreiwgIlY4ZFY4TExpVjhkVjhkVWMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwczUxMl9tYXNreiwgIlYxNmZWMTZpVjE2ZlYxNmZVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnE1MTJfbWFza3osICJWOExMaVY4TExpVjhMTGlWOExMaVVjIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXNkX3JvdW5kX21hc2ssICJWMmRWMmRWMmRWMmRVY0lpSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlc3Nfcm91bmRfbWFzaywgIlY0ZlY0ZlY0ZlY0ZlVjSWlJaSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2NhbGVmcGQ1MTJfbWFzaywgIlY4ZFY4ZFY4ZFY4ZFVjSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYWxlZnBzNTEyX21hc2ssICJWMTZmVjE2ZlYxNmZWMTZmVXNJaSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2NhbGVmc2Rfcm91bmRfbWFzaywgIlYyZFYyZFYyZFYyZFVjSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NjYWxlZnNzX3JvdW5kX21hc2ssICJWNGZWNGZWNGZWNGZVY0lpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JhZGk1MTIsICJWMTZpVjE2aWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzcmFxaTUxMiwgIlY4TExpVjhMTGlpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JhcTEyOCwgIlYyTExpVjJMTGlWMkxMaSIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzcmFxMjU2LCAiVjRMTGlWNExMaVYyTExpIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNyYXFpMTI4LCAiVjJMTGlWMkxMaWkiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JhcWkyNTYsICJWNExMaVY0TExpaSIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzbGxkNTEyLCAiVjE2aVYxNmlWNGkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzbGxxNTEyLCAiVjhMTGlWOExMaVYyTExpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc2xsdjE2c2ksICJWMTZpVjE2aVYxNmkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzbGx2OGRpLCAiVjhMTGlWOExMaVY4TExpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JhZDUxMiwgIlYxNmlWMTZpVjRpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JhcTUxMiwgIlY4TExpVjhMTGlWMkxMaSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNyYXYxNnNpLCAiVjE2aVYxNmlWMTZpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wc3JhdjhkaSwgIlY4TExpVjhMTGlWOExMaSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNybGQ1MTIsICJWMTZpVjE2aVY0aSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNybHE1MTIsICJWOExMaVY4TExpVjJMTGkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Bzcmx2MTZzaSwgIlYxNmlWMTZpVjE2aSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHNybHY4ZGksICJWOExMaVY4TExpVjhMTGkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3B0ZXJubG9nZDUxMl9tYXNrLCAiVjE2aVYxNmlWMTZpVjE2aUlpVXMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3B0ZXJubG9nZDUxMl9tYXNreiwgIlYxNmlWMTZpVjE2aVYxNmlJaVVzIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wdGVybmxvZ3E1MTJfbWFzaywgIlY4TExpVjhMTGlWOExMaVY4TExpSWlVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHRlcm5sb2dxNTEyX21hc2t6LCAiVjhMTGlWOExMaVY4TExpVjhMTGlJaVVjIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wdGVybmxvZ2QxMjhfbWFzaywgIlY0aVY0aVY0aVY0aUlpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wdGVybmxvZ2QxMjhfbWFza3osICJWNGlWNGlWNGlWNGlJaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHRlcm5sb2dkMjU2X21hc2ssICJWOGlWOGlWOGlWOGlJaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHRlcm5sb2dkMjU2X21hc2t6LCAiVjhpVjhpVjhpVjhpSWlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3B0ZXJubG9ncTEyOF9tYXNrLCAiVjJMTGlWMkxMaVYyTExpVjJMTGlJaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHRlcm5sb2dxMTI4X21hc2t6LCAiVjJMTGlWMkxMaVYyTExpVjJMTGlJaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcHRlcm5sb2dxMjU2X21hc2ssICJWNExMaVY0TExpVjRMTGlWNExMaUlpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wdGVybmxvZ3EyNTZfbWFza3osICJWNExMaVY0TExpVjRMTGlWNExMaUlpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zaHVmX2YzMng0X21hc2ssICJWMTZmVjE2ZlYxNmZJaVYxNmZVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2h1Zl9mNjR4Ml9tYXNrLCAiVjhkVjhkVjhkSWlWOGRVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2h1Zl9pMzJ4NF9tYXNrLCAiVjE2aVYxNmlWMTZpSWlWMTZpVXMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NodWZfaTY0eDJfbWFzaywgIlY4TExpVjhMTGlWOExMaUlpVjhMTGlVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2h1Zl9mMzJ4NF8yNTZfbWFzaywgIlY4ZlY4ZlY4ZklpVjhmVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zaHVmX2Y2NHgyXzI1Nl9tYXNrLCAiVjRkVjRkVjRkSWlWNGRVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NodWZfaTMyeDRfMjU2X21hc2ssICJWOGlWOGlWOGlJaVY4aVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2h1Zl9pNjR4Ml8yNTZfbWFzaywgIlY0TExpVjRMTGlWNExMaUlpVjRMTGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NxcnRzZF9yb3VuZF9tYXNrLCAiVjJkVjJkVjJkVjJkVWNJaSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc3FydHNzX3JvdW5kX21hc2ssICJWNGZWNGZWNGZWNGZVY0lpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yc3FydDE0cGQxMjhfbWFzaywgIlYyZFYyZFYyZFVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcnNxcnQxNHBkMjU2X21hc2ssICJWNGRWNGRWNGRVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRwczEyOF9tYXNrLCAiVjRmVjRmVjRmVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yc3FydDE0cHMyNTZfbWFzaywgIlY4ZlY4ZlY4ZlVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0YjJtYXNrNTEyLCAiVUxMaVY2NGMiLCIiLCJhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRtYXNrMmI1MTIsICJWNjRjVUxMaSIsIiIsImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dG1hc2sydzUxMiwgIlYzMnNVaSIsIiIsImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dGQybWFzazUxMiwgIlVzVjE2aSIsIiIsImF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dG1hc2syZDUxMiwgIlYxNmlVcyIsIiIsImF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dG1hc2sycTUxMiwgIlY4TExpVWMiLCIiLCJhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRxMm1hc2s1MTIsICJVY1Y4TExpIiwiIiwiYXZ4NTEyZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0YjJtYXNrMTI4LCAiVXNWMTZjIiwiIiwiYXZ4NTEyYncsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0YjJtYXNrMjU2LCAiVWlWMzJjIiwiIiwiYXZ4NTEyYncsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0bWFzazJiMTI4LCAiVjE2Y1VzIiwiIiwiYXZ4NTEyYncsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0bWFzazJiMjU2LCAiVjMyY1VpIiwiIiwiYXZ4NTEyYncsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0bWFzazJ3MTI4LCAiVjhzVWMiLCIiLCJhdng1MTJidyxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRtYXNrMncyNTYsICJWMTZzVXMiLCIiLCJhdng1MTJidyxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRkMm1hc2sxMjgsICJVY1Y0aSIsIiIsImF2eDUxMmRxLGF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dGQybWFzazI1NiwgIlVjVjhpIiwiIiwiYXZ4NTEyZHEsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0bWFzazJkMTI4LCAiVjRpVWMiLCIiLCJhdng1MTJkcSxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRtYXNrMmQyNTYsICJWOGlVYyIsIiIsImF2eDUxMmRxLGF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dG1hc2sycTEyOCwgIlYyTExpVWMiLCIiLCJhdng1MTJkcSxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRtYXNrMnEyNTYsICJWNExMaVVjIiwiIiwiYXZ4NTEyZHEsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0cTJtYXNrMTI4LCAiVWNWMkxMaSIsIiIsImF2eDUxMmRxLGF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHEybWFzazI1NiwgIlVjVjRMTGkiLCIiLCJhdng1MTJkcSxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92c2RiNTEyX21hc2ssICJWMTZjVjE2aVYxNmNVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnNkYjUxMm1lbV9tYXNrLCAidlYxNmMqVjE2aVVzIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92c3diNTEybWVtX21hc2ssICJ2VjMyYypWMzJzVWkiLCIiLCJhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92c2R3NTEyX21hc2ssICJWMTZzVjE2aVYxNnNVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnNkdzUxMm1lbV9tYXNrLCAidlYxNnMqVjE2aVVzIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92c3FiNTEyX21hc2ssICJWMTZjVjhMTGlWMTZjVWMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWI1MTJtZW1fbWFzaywgInZWMTZjKlY4TExpVWMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWQ1MTJfbWFzaywgIlY4aVY4TExpVjhpVWMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWQ1MTJtZW1fbWFzaywgInZWOGkqVjhMTGlVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnNxdzUxMl9tYXNrLCAiVjhzVjhMTGlWOHNVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnNxdzUxMm1lbV9tYXNrLCAidlY4cypWOExMaVVjIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92c2RiMTI4X21hc2ssICJWMTZjVjRpVjE2Y1VjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnNkYjEyOG1lbV9tYXNrLCAidlYxNmMqVjRpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92c3diMTI4bWVtX21hc2ssICJ2VjE2YypWOHNVYyIsIiIsImF2eDUxMnZsLGF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZzZGIyNTZfbWFzaywgIlYxNmNWOGlWMTZjVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92c2RiMjU2bWVtX21hc2ssICJ2VjE2YypWOGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Zzd2IyNTZtZW1fbWFzaywgInZWMTZjKlYxNnNVcyIsIiIsImF2eDUxMnZsLGF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZzZHcxMjhfbWFzaywgIlY4c1Y0aVY4c1VjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnNkdzEyOG1lbV9tYXNrLCAidlY4cypWNGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZzZHcyNTZfbWFzaywgIlY4c1Y4aVY4c1VjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnNkdzI1Nm1lbV9tYXNrLCAidlY4cypWOGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWIxMjhfbWFzaywgIlYxNmNWMkxMaVYxNmNVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWIxMjhtZW1fbWFzaywgInZWMTZjKlYyTExpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92c3FiMjU2X21hc2ssICJWMTZjVjRMTGlWMTZjVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92c3FiMjU2bWVtX21hc2ssICJ2VjE2YypWNExMaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnNxZDEyOF9tYXNrLCAiVjRpVjJMTGlWNGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWQxMjhtZW1fbWFzaywgInZWNGkqVjJMTGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWQyNTZfbWFzaywgIlY0aVY0TExpVjRpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92c3FkMjU2bWVtX21hc2ssICJ2VjRpKlY0TExpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92c3F3MTI4X21hc2ssICJWOHNWMkxMaVY4c1VjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnNxdzEyOG1lbV9tYXNrLCAidlY4cypWMkxMaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnNxdzI1Nl9tYXNrLCAiVjhzVjRMTGlWOHNVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZzcXcyNTZtZW1fbWFzaywgInZWOHMqVjRMTGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2RiNTEyX21hc2ssICJWMTZjVjE2aVYxNmNVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnVzZGI1MTJtZW1fbWFzaywgInZWMTZjKlYxNmlVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnVzd2I1MTJtZW1fbWFzaywgInZWMzJjKlYzMnNVaSIsIiIsImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2R3NTEyX21hc2ssICJWMTZzVjE2aVYxNnNVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnVzZHc1MTJtZW1fbWFzaywgInZWMTZzKlYxNmlVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnVzcWI1MTJfbWFzaywgIlYxNmNWOExMaVYxNmNVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnVzcWI1MTJtZW1fbWFzaywgInZWMTZjKlY4TExpVWMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FkNTEyX21hc2ssICJWOGlWOExMaVY4aVVjIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92dXNxZDUxMm1lbV9tYXNrLCAidlY4aSpWOExMaVVjIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92dXNxdzUxMl9tYXNrLCAiVjhzVjhMTGlWOHNVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnVzcXc1MTJtZW1fbWFzaywgInZWOHMqVjhMTGlVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnVzZGIxMjhfbWFzaywgIlYxNmNWNGlWMTZjVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92dXNkYjEyOG1lbV9tYXNrLCAidlYxNmMqVjRpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92dXN3YjEyOG1lbV9tYXNrLCAidlYxNmMqVjhzVWMiLCIiLCJhdng1MTJ2bCxhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92dXNkYjI1Nl9tYXNrLCAiVjE2Y1Y4aVYxNmNVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2RiMjU2bWVtX21hc2ssICJ2VjE2YypWOGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3diMjU2bWVtX21hc2ssICJ2VjE2YypWMTZzVXMiLCIiLCJhdng1MTJ2bCxhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92dXNkdzEyOF9tYXNrLCAiVjhzVjRpVjhzVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92dXNkdzEyOG1lbV9tYXNrLCAidlY4cypWNGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2R3MjU2X21hc2ssICJWOHNWOGlWOHNVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2R3MjU2bWVtX21hc2ssICJ2VjhzKlY4aVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnVzcWIxMjhfbWFzaywgIlYxNmNWMkxMaVYxNmNVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FiMTI4bWVtX21hc2ssICJ2VjE2YypWMkxMaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnVzcWIyNTZfbWFzaywgIlYxNmNWNExMaVYxNmNVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FiMjU2bWVtX21hc2ssICJ2VjE2YypWNExMaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnVzcWQxMjhfbWFzaywgIlY0aVYyTExpVjRpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92dXNxZDEyOG1lbV9tYXNrLCAidlY0aSpWMkxMaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnVzcWQyNTZfbWFzaywgIlY0aVY0TExpVjRpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92dXNxZDI1Nm1lbV9tYXNrLCAidlY0aSpWNExMaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnVzcXcxMjhfbWFzaywgIlY4c1YyTExpVjhzVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92dXNxdzEyOG1lbV9tYXNrLCAidlY4cypWMkxMaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnVzcXcyNTZfbWFzaywgIlY4c1Y0TExpVjhzVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92dXNxdzI1Nm1lbV9tYXNrLCAidlY4cypWNExMaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdmRiNTEyX21hc2ssICJWMTZjVjE2aVYxNmNVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdmRiNTEybWVtX21hc2ssICJ2VjE2YypWMTZpVXMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Z3YjUxMm1lbV9tYXNrLCAidlYzMmMqVjMyc1VpIiwiIiwiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdmR3NTEyX21hc2ssICJWMTZzVjE2aVYxNnNVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdmR3NTEybWVtX21hc2ssICJ2VjE2cypWMTZpVXMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZxYjUxMl9tYXNrLCAiVjE2Y1Y4TExpVjE2Y1VjIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92cWI1MTJtZW1fbWFzaywgInZWMTZjKlY4TExpVWMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZxZDUxMl9tYXNrLCAiVjhpVjhMTGlWOGlVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnFkNTEybWVtX21hc2ssICJ2VjhpKlY4TExpVWMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZxdzUxMl9tYXNrLCAiVjhzVjhMTGlWOHNVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnF3NTEybWVtX21hc2ssICJ2VjhzKlY4TExpVWMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZkYjEyOF9tYXNrLCAiVjE2Y1Y0aVYxNmNVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Z3YjEyOG1lbV9tYXNrLCAidlYxNmMqVjhzVWMiLCIiLCJhdng1MTJ2bCxhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92ZGIxMjhtZW1fbWFzaywgInZWMTZjKlY0aVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdmRiMjU2X21hc2ssICJWMTZjVjhpVjE2Y1VjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdmRiMjU2bWVtX21hc2ssICJ2VjE2YypWOGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3Z3YjI1Nm1lbV9tYXNrLCAidlYxNmMqVjE2c1VzIiwiIiwiYXZ4NTEydmwsYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdmR3MTI4X21hc2ssICJWOHNWNGlWOHNVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZkdzEyOG1lbV9tYXNrLCAidlY4cypWNGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZkdzI1Nl9tYXNrLCAiVjhzVjhpVjhzVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92ZHcyNTZtZW1fbWFzaywgInZWOHMqVjhpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92cWIxMjhfbWFzaywgIlYxNmNWMkxMaVYxNmNVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZxYjEyOG1lbV9tYXNrLCAidlYxNmMqVjJMTGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZxYjI1Nl9tYXNrLCAiVjE2Y1Y0TExpVjE2Y1VjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnFiMjU2bWVtX21hc2ssICJ2VjE2YypWNExMaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnFkMTI4X21hc2ssICJWNGlWMkxMaVY0aVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnFkMTI4bWVtX21hc2ssICJ2VjRpKlYyTExpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92cWQyNTZfbWFzaywgIlY0aVY0TExpVjRpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wbW92cWQyNTZtZW1fbWFzaywgInZWNGkqVjRMTGlVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZxdzEyOF9tYXNrLCAiVjhzVjJMTGlWOHNVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Btb3ZxdzEyOG1lbV9tYXNrLCAidlY4cypWMkxMaVVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnF3MjU2X21hc2ssICJWOHNWNExMaVY4c1VjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcG1vdnF3MjU2bWVtX21hc2ssICJ2VjhzKlY0TExpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nZXRtYW50cGQxMjhfbWFzaywgIlYyZFYyZGlWMmRVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dldG1hbnRwZDI1Nl9tYXNrLCAiVjRkVjRkaVY0ZFVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZ2V0bWFudHBzMTI4X21hc2ssICJWNGZWNGZpVjRmVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nZXRtYW50cHMyNTZfbWFzaywgIlY4ZlY4ZmlWOGZVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dldG1hbnRwZDUxMl9tYXNrLCAiVjhkVjhkaVY4ZFVjSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dldG1hbnRwczUxMl9tYXNrLCAiVjE2ZlYxNmZpVjE2ZlVzSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2dldGV4cHBkNTEyX21hc2ssICJWOGRWOGRWOGRVY0lpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9nZXRleHBwczUxMl9tYXNrLCAiVjE2ZlYxNmZWMTZmVXNJaSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2ssICAiVjRmVjRmVjRmVjRmVWNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1hZGRzczNfbWFza3osICJWNGZWNGZWNGZWNGZVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzM19tYXNrMywgIlY0ZlY0ZlY0ZlY0ZlVjSWkiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtYWRkc2QzX21hc2ssICAiVjJkVjJkVjJkVjJkVWNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1hZGRzZDNfbWFza3osICJWMmRWMmRWMmRWMmRVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkM19tYXNrMywgIlYyZFYyZFYyZFYyZFVjSWkiLCAiIiwgImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmZtc3Vic2QzX21hc2szLCAiVjJkVjJkVjJkVjJkVWNJaSIsICIiLCAiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Zm1zdWJzczNfbWFzazMsICJWNGZWNGZWNGZWNGZVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJzZDNfbWFzazMsICJWMmRWMmRWMmRWMmRVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJzczNfbWFzazMsICJWNGZWNGZWNGZWNGZVY0lpIiwgIiIsICJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Blcm12YXJoaTUxMl9tYXNrLCAiVjMyc1YzMnNWMzJzVjMyc1VpIiwiIiwiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGVybXZhcmRmNTEyX21hc2ssICJWOGRWOGRWOExMaVY4ZFVjIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wZXJtdmFyZGk1MTJfbWFzaywgIlY4TExpVjhMTGlWOExMaVY4TExpVWMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Blcm12YXJzZjUxMl9tYXNrLCAiVjE2ZlYxNmZWMTZpVjE2ZlVzIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wZXJtdmFyc2k1MTJfbWFzaywgIlYxNmlWMTZpVjE2aVYxNmlVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGVybXZhcnFpNTEyX21hc2ssICJWNjRjVjY0Y1Y2NGNWNjRjVUxMaSIsIiIsImF2eDUxMnZibWkiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGVybXZhcnFpMTI4X21hc2ssICJWMTZjVjE2Y1YxNmNWMTZjVXMiLCIiLCJhdng1MTJ2Ym1pLGF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Blcm12YXJxaTI1Nl9tYXNrLCAiVjMyY1YzMmNWMzJjVjMyY1VpIiwiIiwiYXZ4NTEydmJtaSxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wZXJtdmFyaGkxMjhfbWFzaywgIlY4c1Y4c1Y4c1Y4c1VjIiwiIiwiYXZ4NTEyYncsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGVybXZhcmhpMjU2X21hc2ssICJWMTZzVjE2c1YxNnNWMTZzVXMiLCIiLCJhdng1MTJidyxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wZXJtdmFyZGYyNTZfbWFzaywgIlY0ZFY0ZFY0TExpVjRkVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wZXJtdmFyZGkyNTZfbWFzaywgIlY0TExpVjRMTGlWNExMaVY0TExpVWMiLCIiLCJhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9mcGNsYXNzcGQxMjhfbWFzaywgIlVjVjJkSWlVYyIsIiIsImF2eDUxMmRxLGF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NwZDI1Nl9tYXNrLCAiVWNWNGRJaVVjIiwiIiwiYXZ4NTEyZHEsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZnBjbGFzc3BzMTI4X21hc2ssICJVY1Y0ZklpVWMiLCIiLCJhdng1MTJkcSxhdng1MTJ2bCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9mcGNsYXNzcHMyNTZfbWFzaywgIlVjVjhmSWlVYyIsIiIsImF2eDUxMmRxLGF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NwczUxMl9tYXNrLCAiVXNWMTZmSWlVcyIsIiIsImF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NwZDUxMl9tYXNrLCAiVWNWOGRJaVVjIiwiIiwiYXZ4NTEyZHEiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZnBjbGFzc3NkX21hc2ssICJVY1YyZElpVWMiLCIiLCJhdng1MTJkcSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9mcGNsYXNzc3NfbWFzaywgIlVjVjRmSWlVYyIsIiIsImF2eDUxMmRxIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2thbmRoaSwgIlVzVXNVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfa2FuZG5oaSwgIlVzVXNVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfa29yaGksICJVc1VzVXMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2tvcnRlc3RjaGksICJpVXNVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfa29ydGVzdHpoaSwgImlVc1VzIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9rdW5wY2toaSwgIlVzVXNVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfa3hub3JoaSwgIlVzVXNVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfa3hvcmhpLCAiVXNVc1VzIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wYWxpZ25yNTEyX21hc2ssICJWNjRjVjY0Y1Y2NGNJaVY2NGNVTExpIiwiIiwiYXZ4NTEyYnciKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZGJwc2FkYncxMjhfbWFzaywgIlY4c1YxNmNWMTZjSWlWOHNVYyIsIiIsImF2eDUxMmJ3LGF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2RicHNhZGJ3MjU2X21hc2ssICJWMTZzVjMyY1YzMmNJaVYxNnNVcyIsIiIsImF2eDUxMmJ3LGF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2RicHNhZGJ3NTEyX21hc2ssICJWMzJzVjY0Y1Y2NGNJaVYzMnNVaSIsIiIsImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3BzYWRidzUxMiwgIlY4TExpVjY0Y1Y2NGMiLCIiLCJhdng1MTJidyIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jb21wcmVzc2RmNTEyX21hc2ssICJWOGRWOGRWOGRVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29tcHJlc3NkaTUxMl9tYXNrLCAiVjhMTGlWOExMaVY4TExpVWMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzaGk1MTJfbWFzaywgIlYzMnNWMzJzVjMyc1VpIiwiIiwiYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29tcHJlc3NxaTUxMl9tYXNrLCAiVjY0Y1Y2NGNWNjRjVUxMaSIsIiIsImF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc2Y1MTJfbWFzaywgIlYxNmZWMTZmVjE2ZlVzIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jb21wcmVzc3NpNTEyX21hc2ssICJWMTZpVjE2aVYxNmlVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY21wc2RfbWFzaywgIlVjVjJkVjJkSWlVY0lpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jbXBzc19tYXNrLCAiVWNWNGZWNGZJaVVjSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2V4cGFuZGRmNTEyX21hc2ssICJWOGRWOGRWOGRVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZXhwYW5kZGk1MTJfbWFzaywgIlY4TExpVjhMTGlWOExMaVVjIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9leHBhbmRoaTUxMl9tYXNrLCAiVjMyc1YzMnNWMzJzVWkiLCIiLCJhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9leHBhbmRxaTUxMl9tYXNrLCAiVjY0Y1Y2NGNWNjRjVUxMaSIsIiIsImF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRkZjUxMl9tYXNrLCAiVjhkVjhkQypWOGRVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZGRpNTEyX21hc2ssICJWOExMaVY4TExpQypWOExMaVVjIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkaGk1MTJfbWFzaywgIlYzMnNWMzJzQypWMzJzVWkiLCIiLCJhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkcWk1MTJfbWFzaywgIlY2NGNWNjRjQypWNjRjVUxMaSIsIiIsImF2eDUxMnZibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRzZjUxMl9tYXNrLCAiVjE2ZlYxNmZDKlYxNmZVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZHNpNTEyX21hc2ssICJWMTZpVjE2aUMqVjE2aVVzIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9leHBhbmRzZjUxMl9tYXNrLCAiVjE2ZlYxNmZWMTZmVXMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2V4cGFuZHNpNTEyX21hc2ssICJWMTZpVjE2aVYxNmlVcyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0cHMycGQ1MTJfbWFzaywgIlY4ZFY4ZlY4ZFVjSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVkZjUxMl9tYXNrLCAidlY4ZCpWOGRVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWRpNTEyX21hc2ssICJ2VjhMTGkqVjhMTGlVYyIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWhpNTEyX21hc2ssICJ2VjMycypWMzJzVWkiLCIiLCJhdng1MTJ2Ym1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3JlcWk1MTJfbWFzaywgInZWNjRjKlY2NGNVTExpIiwiIiwiYXZ4NTEydmJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXNmNTEyX21hc2ssICJ2VjE2ZipWMTZmVXMiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVzaTUxMl9tYXNrLCAidlYxNmkqVjE2aVVzIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Y3Z0cGgycHNfbWFzaywgIlY0ZlY4c1Y0ZlVjIiwiIiwiYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmN2dHBoMnBzMjU2X21hc2ssICJWOGZWOHNWOGZVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaF9tYXNrLCAiVjhzVjRmSWlWOHNVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaDI1Nl9tYXNrLCAiVjhzVjhmSWlWOHNVYyIsIiIsImF2eDUxMnZsIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHcybWFzazUxMiwgIlVpVjMycyIsIiIsImF2eDUxMmJ3IikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHcybWFzazEyOCwgIlVjVjhzIiwiIiwiYXZ4NTEyYncsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0dzJtYXNrMjU2LCAiVXNWMTZzIiwiIiwiYXZ4NTEyYncsYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0c2Qyc3Nfcm91bmRfbWFzaywgIlY0ZlY0ZlYyZFY0ZlVjSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHNpMnNzMzIsICJWNGZWNGZpSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHNzMnNkX3JvdW5kX21hc2ssICJWMmRWMmRWNGZWMmRVY0lpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnR1c2kyc2QzMiwgIlYyZFYyZFVpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnR1c2kyc3MzMiwgIlY0ZlY0ZlVpSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZwbXVsdGlzaGlmdHFiNTEyX21hc2ssICJWNjRjVjY0Y1Y2NGNWNjRjVUxMaSIsIiIsImF2eDUxMnZibWkiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBtdWx0aXNoaWZ0cWIxMjhfbWFzaywgIlYxNmNWMTZjVjE2Y1YxNmNVcyIsIiIsImF2eDUxMnZibWksYXZ4NTEydmwiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdnBtdWx0aXNoaWZ0cWIyNTZfbWFzaywgIlYzMmNWMzJjVjMyY1YzMmNVaSIsIiIsImF2eDUxMnZibWksYXZ4NTEydmwiKQorCisvLyBnZW5lcmljIHNlbGVjdCBpbnRyaW5zaWNzCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zZWxlY3RiXzEyOCwgIlYxNmNVc1YxNmNWMTZjIiwgIiIsICIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2VsZWN0Yl8yNTYsICJWMzJjVWlWMzJjVjMyYyIsICIiLCAiIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NlbGVjdGJfNTEyLCAiVjY0Y1VMTGlWNjRjVjY0YyIsICIiLCAiIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NlbGVjdHdfMTI4LCAiVjhzVWNWOHNWOHMiLCAiIiwgIiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zZWxlY3R3XzI1NiwgIlYxNnNVc1YxNnNWMTZzIiwgIiIsICIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2VsZWN0d181MTIsICJWMzJzVWlWMzJzVjMycyIsICIiLCAiIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NlbGVjdGRfMTI4LCAiVjRpVWNWNGlWNGkiLCAiIiwgIiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zZWxlY3RkXzI1NiwgIlY4aVVjVjhpVjhpIiwgIiIsICIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2VsZWN0ZF81MTIsICJWMTZpVXNWMTZpVjE2aSIsICIiLCAiIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NlbGVjdHFfMTI4LCAiVjJMTGlVY1YyTExpVjJMTGkiLCAiIiwgIiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zZWxlY3RxXzI1NiwgIlY0TExpVWNWNExMaVY0TExpIiwgIiIsICIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2VsZWN0cV81MTIsICJWOExMaVVjVjhMTGlWOExMaSIsICIiLCAiIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NlbGVjdHBzXzEyOCwgIlY0ZlVjVjRmVjRmIiwgIiIsICIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2VsZWN0cHNfMjU2LCAiVjhmVWNWOGZWOGYiLCAiIiwgIiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zZWxlY3Rwc181MTIsICJWMTZmVXNWMTZmVjE2ZiIsICIiLCAiIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3NlbGVjdHBkXzEyOCwgIlYyZFVjVjJkVjJkIiwgIiIsICIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfc2VsZWN0cGRfMjU2LCAiVjRkVWNWNGRWNGQiLCAiIiwgIiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zZWxlY3RwZF81MTIsICJWOGRVY1Y4ZFY4ZCIsICIiLCAiIikKKworLy8gTU9OSVRPUlgvTVdBSVRYCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9tb25pdG9yeCwgInZ2KlVpVWkiLCAiIiwgIm13YWl0eCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9td2FpdHgsICJ2VWlVaVVpIiwgIiIsICJtd2FpdHgiKQorCisvLyBDTFpFUk8KK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2NsemVybywgInZ2KiIsICIiLCAiY2x6ZXJvIikKKworLy8gTVNWQworVEFSR0VUX0hFQURFUl9CVUlMVElOKF9CaXRTY2FuRm9yd2FyZCwgIlVjVU5pKlVOaSIsICJuaCIsICJpbnRyaW4uaCIsIEFMTF9NU19MQU5HVUFHRVMsICIiKQorVEFSR0VUX0hFQURFUl9CVUlMVElOKF9CaXRTY2FuUmV2ZXJzZSwgIlVjVU5pKlVOaSIsICJuaCIsICJpbnRyaW4uaCIsIEFMTF9NU19MQU5HVUFHRVMsICIiKQorCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX1JlYWRXcml0ZUJhcnJpZXIsICJ2IiwgIm5oIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX1JlYWRCYXJyaWVyLCAgICAgICJ2IiwgIm5oIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX1dyaXRlQmFycmllciwgICAgICJ2IiwgIm5oIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCisKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfX2VtdWwsICAiTExpaWkiLCAgICAibmgiLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfX2VtdWx1LCAiVUxMaVVpVWkiLCAibmgiLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKKworVEFSR0VUX0hFQURFUl9CVUlMVElOKF9BZGRyZXNzT2ZSZXR1cm5BZGRyZXNzLCAidioiLCAibmgiLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKKworVEFSR0VUX0hFQURFUl9CVUlMVElOKF9fc3Rvc2IsICJ2VWMqVWN6IiwgIm5oIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX19pbnQyYywgInYiLCAgICAgICAibnIiLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfX3VkMiwgICAidiIsICAgICAgICJuciIsICJpbnRyaW4uaCIsIEFMTF9NU19MQU5HVUFHRVMsICIiKQorCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX19yZWFkZnNieXRlLCAgIlVjVU5pIiwgIm5oIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX19yZWFkZnN3b3JkLCAgIlVzVU5pIiwgIm5oIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX19yZWFkZnNkd29yZCwgIlVOaVVOaSIsICJuaCIsICJpbnRyaW4uaCIsIEFMTF9NU19MQU5HVUFHRVMsICIiKQorVEFSR0VUX0hFQURFUl9CVUlMVElOKF9fcmVhZGZzcXdvcmQsICJVTExpVU5pIiwgIm5oIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCisKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfX3JlYWRnc2J5dGUsICAiVWNVTmkiLCAibmgiLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfX3JlYWRnc3dvcmQsICAiVXNVTmkiLCAibmgiLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfX3JlYWRnc2R3b3JkLCAiVU5pVU5pIiwgIm5oIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX19yZWFkZ3Nxd29yZCwgIlVMTGlVTmkiLCAibmgiLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKKworI3VuZGVmIEJVSUxUSU4KKyN1bmRlZiBUQVJHRVRfQlVJTFRJTgorI3VuZGVmIFRBUkdFVF9IRUFERVJfQlVJTFRJTgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNYODZfNjQuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNYODZfNjQuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMmM4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc1g4Nl82NC5kZWYKQEAgLTAsMCArMSw5NCBAQAorLy89PT0tLS0gQnVpbHRpbnNYODZfNjQuZGVmIC0gWDg2LTY0IEJ1aWx0aW4gZnVuY3Rpb24gZGF0YWJhc2UgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgWDg2LTY0LXNwZWNpZmljIGJ1aWx0aW4gZnVuY3Rpb24gZGF0YWJhc2UuIFVzZXJzIG9mCisvLyB0aGlzIGZpbGUgbXVzdCBkZWZpbmUgdGhlIEJVSUxUSU4gbWFjcm8gdG8gbWFrZSB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBUaGUgZm9ybWF0IG9mIHRoaXMgZGF0YWJhc2UgbWF0Y2hlcyBjbGFuZy9CYXNpYy9CdWlsdGlucy5kZWYuCisKKyNpZiBkZWZpbmVkKEJVSUxUSU4pICYmICFkZWZpbmVkKFRBUkdFVF9CVUlMVElOKQorIyAgIGRlZmluZSBUQVJHRVRfQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMsIEZFQVRVUkUpIEJVSUxUSU4oSUQsIFRZUEUsIEFUVFJTKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJVSUxUSU4pICYmICFkZWZpbmVkKFRBUkdFVF9IRUFERVJfQlVJTFRJTikKKyMgIGRlZmluZSBUQVJHRVRfSEVBREVSX0JVSUxUSU4oSUQsIFRZUEUsIEFUVFJTLCBIRUFERVIsIExBTkcsIEZFQVRVUkUpIEJVSUxUSU4oSUQsIFRZUEUsIEFUVFJTKQorI2VuZGlmCisKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfQml0U2NhbkZvcndhcmQ2NCwgIlVjVU5pKlVMTGkiLCAibmgiLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfQml0U2NhblJldmVyc2U2NCwgIlVjVU5pKlVMTGkiLCAibmgiLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKKworVEFSR0VUX0hFQURFUl9CVUlMVElOKF9fbXVsaCwgICJMTGlMTGlMTGkiLCAgICAibmNoIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCitUQVJHRVRfSEVBREVSX0JVSUxUSU4oX191bXVsaCwgIlVMTGlVTExpVUxMaSIsICJuY2giLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfbXVsMTI4LCAiTExpTExpTExpTExpKiIsICAgICAgIm5oIiwgICAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfdW11bDEyOCwgIlVMTGlVTExpVUxMaVVMTGkqIiwgIm5oIiwgICAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKKworVEFSR0VUX0hFQURFUl9CVUlMVElOKF9fZmFzdHN0b3JlZmVuY2UsICJ2IiwgIm5oIiwgImludHJpbi5oIiwgQUxMX01TX0xBTkdVQUdFUywgIiIpCisKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfSW50ZXJsb2NrZWRBbmQ2NCwgICAgICAgICAiTExpTExpRCpMTGkiLCAibmgiLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfSW50ZXJsb2NrZWREZWNyZW1lbnQ2NCwgICAiTExpTExpRCoiLCAgICAibmgiLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfSW50ZXJsb2NrZWRFeGNoYW5nZTY0LCAgICAiTExpTExpRCpMTGkiLCAibmgiLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0LCAiTExpTExpRCpMTGkiLCAibmgiLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfSW50ZXJsb2NrZWRFeGNoYW5nZVN1YjY0LCAiTExpTExpRCpMTGkiLCAibmgiLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfSW50ZXJsb2NrZWRJbmNyZW1lbnQ2NCwgICAiTExpTExpRCoiLCAgICAibmgiLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfSW50ZXJsb2NrZWRPcjY0LCAgICAgICAgICAiTExpTExpRCpMTGkiLCAibmgiLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfSW50ZXJsb2NrZWRYb3I2NCwgICAgICAgICAiTExpTExpRCpMTGkiLCAibmgiLCAiaW50cmluLmgiLCBBTExfTVNfTEFOR1VBR0VTLCAiIikKK1RBUkdFVF9IRUFERVJfQlVJTFRJTihfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UxMjgsICJVY0xMaUQqTExpTExpTExpKiIsICJuaCIsICJpbnRyaW4uaCIsIEFMTF9NU19MQU5HVUFHRVMsICJjeDE2IikKKworVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcmVhZGVmbGFnc191NjQsICJVTExpIiwgIm4iLCAiIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3dyaXRlZWZsYWdzX3U2NCwgInZVTExpIiwgIm4iLCAiIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHNzMnNpNjQsICJMTGlWNGYiLCAiIiwgInNzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnR0c3Myc2k2NCwgIkxMaVY0ZiIsICIiLCAic3NlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHNkMnNpNjQsICJMTGlWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0dHNkMnNpNjQsICJMTGlWMmQiLCAiIiwgInNzZTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3JjMzJkaSwgIlVMTGlVTExpVUxMaSIsICIiLCAic3NlNC4yIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3JkZnNiYXNlNjQsICJVTExpIiwgIiIsICJmc2dzYmFzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yZGdzYmFzZTY0LCAiVUxMaSIsICIiLCAiZnNnc2Jhc2UiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfd3Jmc2Jhc2U2NCwgInZVTExpIiwgIiIsICJmc2dzYmFzZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl93cmdzYmFzZTY0LCAidlVMTGkiLCAiIiwgImZzZ3NiYXNlIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2Z4cnN0b3I2NCwgInZ2KiIsICIiLCAiZnhzciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9meHNhdmU2NCwgInZ2KiIsICIiLCAiZnhzciIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl94c2F2ZTY0LCAidnYqVUxMaSIsICIiLCAieHNhdmUiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfeHJzdG9yNjQsICJ2dipVTExpIiwgIiIsICJ4c2F2ZSIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl94c2F2ZW9wdDY0LCAidnYqVUxMaSIsICIiLCAieHNhdmVvcHQiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfeHJzdG9yczY0LCAidnYqVUxMaSIsICIiLCAieHNhdmVzIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3hzYXZlYzY0LCAidnYqVUxMaSIsICIiLCAieHNhdmVjIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3hzYXZlczY0LCAidnYqVUxMaSIsICIiLCAieHNhdmVzIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2luY3NzcHEsICJ2VUxMaSIsICJ1IiwgInNoc3RrIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3Jkc3NwcSwgIlVMTGlVTExpIiwgIlVuIiwgInNoc3RrIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3dyc3NxLCAidlVMTGl2KiIsICIiLCAic2hzdGsiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfd3J1c3NxLCAidlVMTGl2KiIsICIiLCAic2hzdGsiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfYWRkY2Fycnl4X3U2NCwgIlVjVWNVTExpVUxMaVVMTGkqIiwgIiIsICJhZHgiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfYWRkY2FycnlfdTY0LCAiVWNVY1VMTGlVTExpVUxMaSoiLCAiIiwgIiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9zdWJib3Jyb3dfdTY0LCAiVWNVY1VMTGlVTExpVUxMaSoiLCAiIiwgIiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9yZHNlZWQ2NF9zdGVwLCAiVWlVTExpKiIsICIiLCAicmRzZWVkIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2JleHRyX3U2NCwgIlVMTGlVTExpVUxMaSIsICIiLCAiYm1pIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2J6aGlfZGksICJVTExpVUxMaVVMTGkiLCAiIiwgImJtaTIiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfcGRlcF9kaSwgIlVMTGlVTExpVUxMaSIsICIiLCAiYm1pMiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9wZXh0X2RpLCAiVUxMaVVMTGlVTExpIiwgIiIsICJibWkyIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2JleHRyaV91NjQsICJVTExpVUxMaUlVTExpIiwgIiIsICJ0Ym0iKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbHdwaW5zNjQsICJVY1VMTGlVaVVpIiwgIiIsICJsd3AiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfbHdwdmFsNjQsICJ2VUxMaVVpVWkiLCAiIiwgImx3cCIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Y3Z0c2Qyc2k2NCwgIkxMaVYyZElpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Y3Z0c2QydXNpNjQsICJVTExpVjJkSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZjdnRzczJzaTY0LCAiTExpVjRmSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZjdnRzczJ1c2k2NCwgIlVMTGlWNGZJaSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfdmN2dHRzZDJzaTY0LCAiTExpVjJkSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZjdnR0c2QydXNpNjQsICJVTExpVjJkSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX3ZjdnR0c3Myc2k2NCwgIkxMaVY0ZklpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl92Y3Z0dHNzMnVzaTY0LCAiVUxMaVY0ZklpIiwiIiwiYXZ4NTEyZiIpCitUQVJHRVRfQlVJTFRJTihfX2J1aWx0aW5faWEzMl9jdnRzaTJzZDY0LCAiVjJkVjJkTExpSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHNpMnNzNjQsICJWNGZWNGZMTGlJaSIsIiIsImF2eDUxMmYiKQorVEFSR0VUX0JVSUxUSU4oX19idWlsdGluX2lhMzJfY3Z0dXNpMnNkNjQsICJWMmRWMmRVTExpSWkiLCIiLCJhdng1MTJmIikKK1RBUkdFVF9CVUlMVElOKF9fYnVpbHRpbl9pYTMyX2N2dHVzaTJzczY0LCAiVjRmVjRmVUxMaUlpIiwiIiwiYXZ4NTEyZiIpCisKKyN1bmRlZiBCVUlMVElOCisjdW5kZWYgVEFSR0VUX0JVSUxUSU4KKyN1bmRlZiBUQVJHRVRfSEVBREVSX0JVSUxUSU4KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zWENvcmUuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNYQ29yZS5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcyZDIwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zWENvcmUuZGVmCkBAIC0wLDAgKzEsMjIgQEAKKy8vPT09LS0tIEJ1aWx0aW5zWENvcmUuZGVmIC0gWENvcmUgQnVpbHRpbiBmdW5jdGlvbiBkYXRhYmFzZSAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFhDb3JlLXNwZWNpZmljIGJ1aWx0aW4gZnVuY3Rpb24gZGF0YWJhc2UuICBVc2VycyBvZgorLy8gdGhpcyBmaWxlIG11c3QgZGVmaW5lIHRoZSBCVUlMVElOIG1hY3JvIHRvIG1ha2UgdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gVGhlIGZvcm1hdCBvZiB0aGlzIGRhdGFiYXNlIG1hdGNoZXMgY2xhbmcvQmFzaWMvQnVpbHRpbnMuZGVmLgorCitCVUlMVElOKF9fYnVpbHRpbl9iaXRyZXYsICJVaVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2dldGlkLCAiU2kiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fZ2V0cHMsICJVaVVpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fc2V0cHMsICJ2VWlVaSIsICJuIikKKworI3VuZGVmIEJVSUxUSU4KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0NhcHR1cmVkU3RtdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQ2FwdHVyZWRTdG10LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhMjg5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0NhcHR1cmVkU3RtdC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vPT09LS0tIENhcHR1cmVkU3RtdC5oIC0gVHlwZXMgZm9yIENhcHR1cmVkU3RtdHMgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX0NBUFRVUkVEU1RNVF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfQ0FQVFVSRURTVE1UX0gKKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBUaGUgZGlmZmVyZW50IGtpbmRzIG9mIGNhcHR1cmVkIHN0YXRlbWVudC4KK2VudW0gQ2FwdHVyZWRSZWdpb25LaW5kIHsKKyAgQ1JfRGVmYXVsdCwKKyAgQ1JfT3Blbk1QCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQkFTSUNfQ0FQVFVSRURTVE1UX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0NoYXJJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9DaGFySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDlmMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9DaGFySW5mby5oCkBAIC0wLDAgKzEsMTk5IEBACisvLz09PS0tLSBjbGFuZy9CYXNpYy9DaGFySW5mby5oIC0gQ2xhc3NpZnlpbmcgQVNDSUkgQ2hhcmFjdGVycyAtLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfQ0hBUklORk9fSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX0NIQVJJTkZPX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgY2hhcmluZm8geworICBleHRlcm4gY29uc3QgdWludDE2X3QgSW5mb1RhYmxlWzI1Nl07CisKKyAgZW51bSB7CisgICAgQ0hBUl9IT1JaX1dTICA9IDB4MDAwMSwgIC8vICdcdCcsICdcZicsICdcdicuICBOb3RlLCBubyAnXDAnCisgICAgQ0hBUl9WRVJUX1dTICA9IDB4MDAwMiwgIC8vICdccicsICdcbicKKyAgICBDSEFSX1NQQUNFICAgID0gMHgwMDA0LCAgLy8gJyAnCisgICAgQ0hBUl9ESUdJVCAgICA9IDB4MDAwOCwgIC8vIDAtOQorICAgIENIQVJfWExFVFRFUiAgPSAweDAwMTAsICAvLyBhLWYsQS1GCisgICAgQ0hBUl9VUFBFUiAgICA9IDB4MDAyMCwgIC8vIEEtWgorICAgIENIQVJfTE9XRVIgICAgPSAweDAwNDAsICAvLyBhLXoKKyAgICBDSEFSX1VOREVSICAgID0gMHgwMDgwLCAgLy8gXworICAgIENIQVJfUEVSSU9EICAgPSAweDAxMDAsICAvLyAuCisgICAgQ0hBUl9SQVdERUwgICA9IDB4MDIwMCwgIC8vIHt9W10jPD4lOjs/KistL14mfH4hPSwiJworICAgIENIQVJfUFVOQ1QgICAgPSAweDA0MDAgICAvLyBgJEAoKQorICB9OworCisgIGVudW0geworICAgIENIQVJfWFVQUEVSID0gQ0hBUl9YTEVUVEVSIHwgQ0hBUl9VUFBFUiwKKyAgICBDSEFSX1hMT1dFUiA9IENIQVJfWExFVFRFUiB8IENIQVJfTE9XRVIKKyAgfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBjaGFyaW5mbworCisvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYW4gQVNDSUkgY2hhcmFjdGVyLgorTExWTV9SRUFETk9ORSBpbmxpbmUgYm9vbCBpc0FTQ0lJKGNoYXIgYykgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYykgPD0gMTI3OworfQorCisvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSB2YWxpZCBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBDIGlkZW50aWZpZXIsCisvLy8gd2hpY2ggaXMgW2EtekEtWl9dLgorTExWTV9SRUFET05MWSBpbmxpbmUgYm9vbCBpc0lkZW50aWZpZXJIZWFkKHVuc2lnbmVkIGNoYXIgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93RG9sbGFyID0gZmFsc2UpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIGNoYXJpbmZvOworICBpZiAoSW5mb1RhYmxlW2NdICYgKENIQVJfVVBQRVJ8Q0hBUl9MT1dFUnxDSEFSX1VOREVSKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIEFsbG93RG9sbGFyICYmIGMgPT0gJyQnOworfQorCisvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBib2R5IGNoYXJhY3RlciBvZiBhIEMgaWRlbnRpZmllciwKKy8vLyB3aGljaCBpcyBbYS16QS1aMC05X10uCitMTFZNX1JFQURPTkxZIGlubGluZSBib29sIGlzSWRlbnRpZmllckJvZHkodW5zaWduZWQgY2hhciBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dEb2xsYXIgPSBmYWxzZSkgeworICB1c2luZyBuYW1lc3BhY2UgY2hhcmluZm87CisgIGlmIChJbmZvVGFibGVbY10gJiAoQ0hBUl9VUFBFUnxDSEFSX0xPV0VSfENIQVJfRElHSVR8Q0hBUl9VTkRFUikpCisgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBBbGxvd0RvbGxhciAmJiBjID09ICckJzsKK30KKworLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNoYXJhY3RlciBpcyBob3Jpem9udGFsIEFTQ0lJIHdoaXRlc3BhY2U6CisvLy8gJyAnLCAnXFx0JywgJ1xcZicsICdcXHYnLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgcmV0dXJucyBmYWxzZSBmb3IgJ1xcMCcuCitMTFZNX1JFQURPTkxZIGlubGluZSBib29sIGlzSG9yaXpvbnRhbFdoaXRlc3BhY2UodW5zaWduZWQgY2hhciBjKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBjaGFyaW5mbzsKKyAgcmV0dXJuIChJbmZvVGFibGVbY10gJiAoQ0hBUl9IT1JaX1dTfENIQVJfU1BBQ0UpKSAhPSAwOworfQorCisvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgY2hhcmFjdGVyIGlzIHZlcnRpY2FsIEFTQ0lJIHdoaXRlc3BhY2U6ICdcXG4nLCAnXFxyJy4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIHJldHVybnMgZmFsc2UgZm9yICdcXDAnLgorTExWTV9SRUFET05MWSBpbmxpbmUgYm9vbCBpc1ZlcnRpY2FsV2hpdGVzcGFjZSh1bnNpZ25lZCBjaGFyIGMpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIGNoYXJpbmZvOworICByZXR1cm4gKEluZm9UYWJsZVtjXSAmIENIQVJfVkVSVF9XUykgIT0gMDsKK30KKworLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgY2hhcmFjdGVyIGlzIGhvcml6b250YWwgb3IgdmVydGljYWwgQVNDSUkgd2hpdGVzcGFjZToKKy8vLyAnICcsICdcXHQnLCAnXFxmJywgJ1xcdicsICdcXG4nLCAnXFxyJy4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIHJldHVybnMgZmFsc2UgZm9yICdcXDAnLgorTExWTV9SRUFET05MWSBpbmxpbmUgYm9vbCBpc1doaXRlc3BhY2UodW5zaWduZWQgY2hhciBjKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBjaGFyaW5mbzsKKyAgcmV0dXJuIChJbmZvVGFibGVbY10gJiAoQ0hBUl9IT1JaX1dTfENIQVJfVkVSVF9XU3xDSEFSX1NQQUNFKSkgIT0gMDsKK30KKworLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgY2hhcmFjdGVyIGlzIGFuIEFTQ0lJIGRpZ2l0OiBbMC05XQorTExWTV9SRUFET05MWSBpbmxpbmUgYm9vbCBpc0RpZ2l0KHVuc2lnbmVkIGNoYXIgYykgeworICB1c2luZyBuYW1lc3BhY2UgY2hhcmluZm87CisgIHJldHVybiAoSW5mb1RhYmxlW2NdICYgQ0hBUl9ESUdJVCkgIT0gMDsKK30KKworLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgY2hhcmFjdGVyIGlzIGEgbG93ZXJjYXNlIEFTQ0lJIGxldHRlcjogW2Etel0KK0xMVk1fUkVBRE9OTFkgaW5saW5lIGJvb2wgaXNMb3dlcmNhc2UodW5zaWduZWQgY2hhciBjKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBjaGFyaW5mbzsKKyAgcmV0dXJuIChJbmZvVGFibGVbY10gJiBDSEFSX0xPV0VSKSAhPSAwOworfQorCisvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBjaGFyYWN0ZXIgaXMgYW4gdXBwZXJjYXNlIEFTQ0lJIGxldHRlcjogW0EtWl0KK0xMVk1fUkVBRE9OTFkgaW5saW5lIGJvb2wgaXNVcHBlcmNhc2UodW5zaWduZWQgY2hhciBjKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBjaGFyaW5mbzsKKyAgcmV0dXJuIChJbmZvVGFibGVbY10gJiBDSEFSX1VQUEVSKSAhPSAwOworfQorCisvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBjaGFyYWN0ZXIgaXMgYW4gQVNDSUkgbGV0dGVyOiBbYS16QS1aXQorTExWTV9SRUFET05MWSBpbmxpbmUgYm9vbCBpc0xldHRlcih1bnNpZ25lZCBjaGFyIGMpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIGNoYXJpbmZvOworICByZXR1cm4gKEluZm9UYWJsZVtjXSAmIChDSEFSX1VQUEVSfENIQVJfTE9XRVIpKSAhPSAwOworfQorCisvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBjaGFyYWN0ZXIgaXMgYW4gQVNDSUkgbGV0dGVyIG9yIGRpZ2l0OiBbYS16QS1aMC05XQorTExWTV9SRUFET05MWSBpbmxpbmUgYm9vbCBpc0FscGhhbnVtZXJpYyh1bnNpZ25lZCBjaGFyIGMpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIGNoYXJpbmZvOworICByZXR1cm4gKEluZm9UYWJsZVtjXSAmIChDSEFSX0RJR0lUfENIQVJfVVBQRVJ8Q0hBUl9MT1dFUikpICE9IDA7Cit9CisKKy8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGNoYXJhY3RlciBpcyBhbiBBU0NJSSBoZXggZGlnaXQ6IFswLTlhLWZBLUZdCitMTFZNX1JFQURPTkxZIGlubGluZSBib29sIGlzSGV4RGlnaXQodW5zaWduZWQgY2hhciBjKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBjaGFyaW5mbzsKKyAgcmV0dXJuIChJbmZvVGFibGVbY10gJiAoQ0hBUl9ESUdJVHxDSEFSX1hMRVRURVIpKSAhPSAwOworfQorCisvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBjaGFyYWN0ZXIgaXMgYW4gQVNDSUkgcHVuY3R1YXRpb24gY2hhcmFjdGVyLgorLy8vCisvLy8gTm90ZSB0aGF0ICdfJyBpcyBib3RoIGEgcHVuY3R1YXRpb24gY2hhcmFjdGVyIGFuZCBhbiBpZGVudGlmaWVyIGNoYXJhY3RlciEKK0xMVk1fUkVBRE9OTFkgaW5saW5lIGJvb2wgaXNQdW5jdHVhdGlvbih1bnNpZ25lZCBjaGFyIGMpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIGNoYXJpbmZvOworICByZXR1cm4gKEluZm9UYWJsZVtjXSAmIChDSEFSX1VOREVSfENIQVJfUEVSSU9EfENIQVJfUkFXREVMfENIQVJfUFVOQ1QpKSAhPSAwOworfQorCisvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBjaGFyYWN0ZXIgaXMgYW4gQVNDSUkgcHJpbnRhYmxlIGNoYXJhY3RlcjsgdGhhdCBpcywgYQorLy8vIGNoYXJhY3RlciB0aGF0IHNob3VsZCB0YWtlIGV4YWN0bHkgb25lIGNvbHVtbiB0byBwcmludCBpbiBhIGZpeGVkLXdpZHRoCisvLy8gdGVybWluYWwuCitMTFZNX1JFQURPTkxZIGlubGluZSBib29sIGlzUHJpbnRhYmxlKHVuc2lnbmVkIGNoYXIgYykgeworICB1c2luZyBuYW1lc3BhY2UgY2hhcmluZm87CisgIHJldHVybiAoSW5mb1RhYmxlW2NdICYgKENIQVJfVVBQRVJ8Q0hBUl9MT1dFUnxDSEFSX1BFUklPRHxDSEFSX1BVTkNUfAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSX0RJR0lUfENIQVJfVU5ERVJ8Q0hBUl9SQVdERUx8Q0hBUl9TUEFDRSkpICE9IDA7Cit9CisKKy8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIHRoZSBib2R5IGNoYXJhY3RlciBvZiBhIEMgcHJlcHJvY2Vzc2luZyBudW1iZXIsCisvLy8gd2hpY2ggaXMgW2EtekEtWjAtOV8uXS4KK0xMVk1fUkVBRE9OTFkgaW5saW5lIGJvb2wgaXNQcmVwcm9jZXNzaW5nTnVtYmVyQm9keSh1bnNpZ25lZCBjaGFyIGMpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIGNoYXJpbmZvOworICByZXR1cm4gKEluZm9UYWJsZVtjXSAmCisgICAgICAgICAgKENIQVJfVVBQRVJ8Q0hBUl9MT1dFUnxDSEFSX0RJR0lUfENIQVJfVU5ERVJ8Q0hBUl9QRVJJT0QpKSAhPSAwOworfQorCisvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgYm9keSBjaGFyYWN0ZXIgb2YgYSBDKysgcmF3IHN0cmluZyBkZWxpbWl0ZXIuCitMTFZNX1JFQURPTkxZIGlubGluZSBib29sIGlzUmF3U3RyaW5nRGVsaW1Cb2R5KHVuc2lnbmVkIGNoYXIgYykgeworICB1c2luZyBuYW1lc3BhY2UgY2hhcmluZm87CisgIHJldHVybiAoSW5mb1RhYmxlW2NdICYgKENIQVJfVVBQRVJ8Q0hBUl9MT1dFUnxDSEFSX1BFUklPRHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUl9ESUdJVHxDSEFSX1VOREVSfENIQVJfUkFXREVMKSkgIT0gMDsKK30KKworCisvLy8gQ29udmVydHMgdGhlIGdpdmVuIEFTQ0lJIGNoYXJhY3RlciB0byBpdHMgbG93ZXJjYXNlIGVxdWl2YWxlbnQuCisvLy8KKy8vLyBJZiB0aGUgY2hhcmFjdGVyIGlzIG5vdCBhbiB1cHBlcmNhc2UgY2hhcmFjdGVyLCBpdCBpcyByZXR1cm5lZCBhcyBpcy4KK0xMVk1fUkVBRE9OTFkgaW5saW5lIGNoYXIgdG9Mb3dlcmNhc2UoY2hhciBjKSB7CisgIGlmIChpc1VwcGVyY2FzZShjKSkKKyAgICByZXR1cm4gYyArICdhJyAtICdBJzsKKyAgcmV0dXJuIGM7Cit9CisKKy8vLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gQVNDSUkgY2hhcmFjdGVyIHRvIGl0cyB1cHBlcmNhc2UgZXF1aXZhbGVudC4KKy8vLworLy8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IGEgbG93ZXJjYXNlIGNoYXJhY3RlciwgaXQgaXMgcmV0dXJuZWQgYXMgaXMuCitMTFZNX1JFQURPTkxZIGlubGluZSBjaGFyIHRvVXBwZXJjYXNlKGNoYXIgYykgeworICBpZiAoaXNMb3dlcmNhc2UoYykpCisgICAgcmV0dXJuIGMgKyAnQScgLSAnYSc7CisgIHJldHVybiBjOworfQorCisKKy8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgdmFsaWQgQVNDSUkgaWRlbnRpZmllci4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIGlzIGEgdmVyeSBzaW1wbGUgY2hlY2s7IGl0IGRvZXMgbm90IGFjY2VwdCBVQ05zIGFzIHZhbGlkCisvLy8gaWRlbnRpZmllciBjaGFyYWN0ZXJzLgorTExWTV9SRUFET05MWSBpbmxpbmUgYm9vbCBpc1ZhbGlkSWRlbnRpZmllcihTdHJpbmdSZWYgUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0RvbGxhciA9IGZhbHNlKSB7CisgIGlmIChTLmVtcHR5KCkgfHwgIWlzSWRlbnRpZmllckhlYWQoU1swXSwgQWxsb3dEb2xsYXIpKQorICAgIHJldHVybiBmYWxzZTsKKworICBmb3IgKFN0cmluZ1JlZjo6aXRlcmF0b3IgSSA9IFMuYmVnaW4oKSwgRSA9IFMuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGlmICghaXNJZGVudGlmaWVyQm9keSgqSSwgQWxsb3dEb2xsYXIpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9Db21tZW50T3B0aW9ucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQ29tbWVudE9wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmQ5NGU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQ29tbWVudE9wdGlvbnMuaApAQCAtMCwwICsxLDM5IEBACisvLz09PS0gQ29tbWVudE9wdGlvbnMuaCAtIE9wdGlvbnMgZm9yIHBhcnNpbmcgY29tbWVudHMgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHRoZSBjbGFuZzo6Q29tbWVudE9wdGlvbnMgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19DT01NRU5UT1BUSU9OU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfQ09NTUVOVE9QVElPTlNfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBPcHRpb25zIGZvciBjb250cm9sbGluZyBjb21tZW50IHBhcnNpbmcuCitzdHJ1Y3QgQ29tbWVudE9wdGlvbnMgeworICB1c2luZyBCbG9ja0NvbW1hbmROYW1lc1R5ID0gc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+OworCisgIC8vLyBcYnJpZWYgQ29tbWFuZCBuYW1lcyB0byB0cmVhdCBhcyBibG9jayBjb21tYW5kcyBpbiBjb21tZW50cy4KKyAgLy8vIFNob3VsZCBub3QgaW5jbHVkZSB0aGUgbGVhZGluZyBiYWNrc2xhc2guCisgIEJsb2NrQ29tbWFuZE5hbWVzVHkgQmxvY2tDb21tYW5kTmFtZXM7CisKKyAgLy8vIFxicmllZiBUcmVhdCBvcmRpbmFyeSBjb21tZW50cyBhcyBkb2N1bWVudGF0aW9uIGNvbW1lbnRzLgorICBib29sIFBhcnNlQWxsQ29tbWVudHMgPSBmYWxzZTsKKworICBDb21tZW50T3B0aW9ucygpID0gZGVmYXVsdDsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0JBU0lDX0NPTU1FTlRPUFRJT05TX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0N1ZGEuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0N1ZGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2UzODA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvQ3VkYS5oCkBAIC0wLDAgKzEsODggQEAKKy8vPT09LS0tIEN1ZGEuaCAtIFV0aWxpdGllcyBmb3IgY29tcGlsaW5nIENVREEgY29kZSAgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19DVURBX0gKKyNkZWZpbmUgTExWTV9DTEFOR19CQVNJQ19DVURBX0gKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworfSAvLyBuYW1lc3BhY2UgbGx2bQorCituYW1lc3BhY2UgY2xhbmcgeworCitlbnVtIGNsYXNzIEN1ZGFWZXJzaW9uIHsKKyAgVU5LTk9XTiwKKyAgQ1VEQV83MCwKKyAgQ1VEQV83NSwKKyAgQ1VEQV84MCwKKyAgQ1VEQV85MCwKKyAgQ1VEQV85MSwKKyAgTEFURVNUID0gQ1VEQV85MSwKK307Citjb25zdCBjaGFyICpDdWRhVmVyc2lvblRvU3RyaW5nKEN1ZGFWZXJzaW9uIFYpOworCisvLyBObyBzdHJpbmcgLT4gQ3VkYVZlcnNpb24gY29udmVyc2lvbiBmdW5jdGlvbiBiZWNhdXNlIHRoZXJlJ3Mgbm8gY2Fub25pY2FsCisvLyBzcGVsbGluZyBvZiB0aGUgdmFyaW91cyBDVURBIHZlcnNpb25zLgorCitlbnVtIGNsYXNzIEN1ZGFBcmNoIHsKKyAgVU5LTk9XTiwKKyAgU01fMjAsCisgIFNNXzIxLAorICBTTV8zMCwKKyAgU01fMzIsCisgIFNNXzM1LAorICBTTV8zNywKKyAgU01fNTAsCisgIFNNXzUyLAorICBTTV81MywKKyAgU01fNjAsCisgIFNNXzYxLAorICBTTV82MiwKKyAgU01fNzAsCisgIFNNXzcyLAorICBMQVNULAorfTsKK2NvbnN0IGNoYXIgKkN1ZGFBcmNoVG9TdHJpbmcoQ3VkYUFyY2ggQSk7CisKKy8vIFRoZSBpbnB1dCBzaG91bGQgaGF2ZSB0aGUgZm9ybSAic21fMjAiLgorQ3VkYUFyY2ggU3RyaW5nVG9DdWRhQXJjaChsbHZtOjpTdHJpbmdSZWYgUyk7CisKK2VudW0gY2xhc3MgQ3VkYVZpcnR1YWxBcmNoIHsKKyAgVU5LTk9XTiwKKyAgQ09NUFVURV8yMCwKKyAgQ09NUFVURV8zMCwKKyAgQ09NUFVURV8zMiwKKyAgQ09NUFVURV8zNSwKKyAgQ09NUFVURV8zNywKKyAgQ09NUFVURV81MCwKKyAgQ09NUFVURV81MiwKKyAgQ09NUFVURV81MywKKyAgQ09NUFVURV82MCwKKyAgQ09NUFVURV82MSwKKyAgQ09NUFVURV82MiwKKyAgQ09NUFVURV83MCwKKyAgQ09NUFVURV83MiwKK307Citjb25zdCBjaGFyICpDdWRhVmlydHVhbEFyY2hUb1N0cmluZyhDdWRhVmlydHVhbEFyY2ggQSk7CisKKy8vIFRoZSBpbnB1dCBzaG91bGQgaGF2ZSB0aGUgZm9ybSAiY29tcHV0ZV8yMCIuCitDdWRhVmlydHVhbEFyY2ggU3RyaW5nVG9DdWRhVmlydHVhbEFyY2gobGx2bTo6U3RyaW5nUmVmIFMpOworCisvLy8gR2V0IHRoZSBjb21wdXRlX3h4IGNvcnJlc3BvbmRpbmcgdG8gYW4gc21feXkuCitDdWRhVmlydHVhbEFyY2ggVmlydHVhbEFyY2hGb3JDdWRhQXJjaChDdWRhQXJjaCBBKTsKKworLy8vIEdldCB0aGUgZWFybGllc3QgQ3VkYVZlcnNpb24gdGhhdCBzdXBwb3J0cyB0aGUgZ2l2ZW4gQ3VkYUFyY2guCitDdWRhVmVyc2lvbiBNaW5WZXJzaW9uRm9yQ3VkYUFyY2goQ3VkYUFyY2ggQSk7CisKKy8vLyBHZXQgdGhlIGxhdGVzdCBDdWRhVmVyc2lvbiB0aGF0IHN1cHBvcnRzIHRoZSBnaXZlbiBDdWRhQXJjaC4KK0N1ZGFWZXJzaW9uIE1heFZlcnNpb25Gb3JDdWRhQXJjaChDdWRhQXJjaCBBKTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EZWJ1Z0luZm9PcHRpb25zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EZWJ1Z0luZm9PcHRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmZjRhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RlYnVnSW5mb09wdGlvbnMuaApAQCAtMCwwICsxLDM5IEBACisvLz09PS0tLSBEZWJ1Z0luZm9PcHRpb25zLmggLSBEZWJ1ZyBJbmZvIEVtaXNzaW9uIFR5cGVzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfREVCVUdJTkZPT1BUSU9OU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfREVCVUdJTkZPT1BUSU9OU19ICisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgY29kZWdlbm9wdGlvbnMgeworCitlbnVtIERlYnVnSW5mb0tpbmQgeworICBOb0RlYnVnSW5mbywgICAgICAgICAvLy8gRG9uJ3QgZ2VuZXJhdGUgZGVidWcgaW5mby4KKyAgTG9jVHJhY2tpbmdPbmx5LCAgICAgLy8vIEVtaXQgbG9jYXRpb24gaW5mb3JtYXRpb24gYnV0IGRvIG5vdCBnZW5lcmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAvLy8gZGVidWcgaW5mbyBpbiB0aGUgb3V0cHV0LiBUaGlzIGlzIHVzZWZ1bCBpbgorICAgICAgICAgICAgICAgICAgICAgICAvLy8gY2FzZXMgd2hlcmUgdGhlIGJhY2tlbmQgd2FudHMgdG8gdHJhY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgIC8vLyBsb2NhdGlvbnMgZm9yIGluc3RydWN0aW9ucyB3aXRob3V0IGFjdHVhbGx5CisgICAgICAgICAgICAgICAgICAgICAgIC8vLyBlbWl0dGluZyBkZWJ1ZyBpbmZvIGZvciB0aGVtIChlLmcuLCB3aGVuIC1ScGFzcworICAgICAgICAgICAgICAgICAgICAgICAvLy8gaXMgdXNlZCkuCisgIERlYnVnTGluZVRhYmxlc09ubHksIC8vLyBFbWl0IG9ubHkgZGVidWcgaW5mbyBuZWNlc3NhcnkgZm9yIGdlbmVyYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgLy8vIGxpbmUgbnVtYmVyIHRhYmxlcyAoLWdsaW5lLXRhYmxlcy1vbmx5KS4KKyAgTGltaXRlZERlYnVnSW5mbywgICAgLy8vIExpbWl0IGdlbmVyYXRlZCBkZWJ1ZyBpbmZvIHRvIHJlZHVjZSBzaXplCisgICAgICAgICAgICAgICAgICAgICAgIC8vLyAoLWZuby1zdGFuZGFsb25lLWRlYnVnKS4gVGhpcyBlbWl0cworICAgICAgICAgICAgICAgICAgICAgICAvLy8gZm9yd2FyZCBkZWNscyBmb3IgdHlwZXMgdGhhdCBjb3VsZCBiZQorICAgICAgICAgICAgICAgICAgICAgICAvLy8gcmVwbGFjZWQgd2l0aCBmb3J3YXJkIGRlY2xzIGluIHRoZSBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgLy8vIGNvZGUuIEZvciBkeW5hbWljIEMrKyBjbGFzc2VzIHR5cGUgaW5mbworICAgICAgICAgICAgICAgICAgICAgICAvLy8gaXMgb25seSBlbWl0dGVkIGludCB0aGUgbW9kdWxlIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgLy8vIGNvbnRhaW5zIHRoZSBjbGFzc2UncyB2dGFibGUuCisgIEZ1bGxEZWJ1Z0luZm8gICAgICAgIC8vLyBHZW5lcmF0ZSBjb21wbGV0ZSBkZWJ1ZyBpbmZvLgorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGVnZW5vcHRpb25zCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmMGZkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWMuaApAQCAtMCwwICsxLDE1OTMgQEAKKy8vPT09LSBEaWFnbm9zdGljLmggLSBDIExhbmd1YWdlIEZhbWlseSBEaWFnbm9zdGljIEhhbmRsaW5nIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgdGhlIERpYWdub3N0aWMtcmVsYXRlZCBpbnRlcmZhY2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19ESUFHTk9TVElDX0gKKyNkZWZpbmUgTExWTV9DTEFOR19CQVNJQ19ESUFHTk9TVElDX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWNJRHMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljT3B0aW9ucy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU3BlY2lmaWVycy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiIAorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgRGVjbENvbnRleHQ7CitjbGFzcyBEaWFnbm9zdGljQnVpbGRlcjsKK2NsYXNzIERpYWdub3N0aWNDb25zdW1lcjsKK2NsYXNzIElkZW50aWZpZXJJbmZvOworY2xhc3MgTGFuZ09wdGlvbnM7CitjbGFzcyBQcmVwcm9jZXNzb3I7CitjbGFzcyBTb3VyY2VNYW5hZ2VyOworY2xhc3MgU3RvcmVkRGlhZ25vc3RpYzsKKworbmFtZXNwYWNlIHRvayB7CisKK2VudW0gVG9rZW5LaW5kIDogdW5zaWduZWQgc2hvcnQ7CisKK30gLy8gbmFtZXNwYWNlIHRvaworCisvLy8gXGJyaWVmIEFubm90YXRlcyBhIGRpYWdub3N0aWMgd2l0aCBzb21lIGNvZGUgdGhhdCBzaG91bGQgYmUKKy8vLyBpbnNlcnRlZCwgcmVtb3ZlZCwgb3IgcmVwbGFjZWQgdG8gZml4IHRoZSBwcm9ibGVtLgorLy8vCisvLy8gVGhpcyBraW5kIG9mIGhpbnQgc2hvdWxkIGJlIHVzZWQgd2hlbiB3ZSBhcmUgY2VydGFpbiB0aGF0IHRoZQorLy8vIGludHJvZHVjdGlvbiwgcmVtb3ZhbCwgb3IgbW9kaWZpY2F0aW9uIG9mIGEgcGFydGljdWxhciAoc21hbGwhKQorLy8vIGFtb3VudCBvZiBjb2RlIHdpbGwgY29ycmVjdCBhIGNvbXBpbGF0aW9uIGVycm9yLiBUaGUgY29tcGlsZXIKKy8vLyBzaG91bGQgYWxzbyBwcm92aWRlIGZ1bGwgcmVjb3ZlcnkgZnJvbSBzdWNoIGVycm9ycywgc3VjaCB0aGF0CisvLy8gc3VwcHJlc3NpbmcgdGhlIGRpYWdub3N0aWMgb3V0cHV0IGNhbiBzdGlsbCByZXN1bHQgaW4gc3VjY2Vzc2Z1bAorLy8vIGNvbXBpbGF0aW9uLgorY2xhc3MgRml4SXRIaW50IHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDb2RlIHRoYXQgc2hvdWxkIGJlIHJlcGxhY2VkIHRvIGNvcnJlY3QgdGhlIGVycm9yLiBFbXB0eSBmb3IgYW4KKyAgLy8vIGluc2VydGlvbiBoaW50LgorICBDaGFyU291cmNlUmFuZ2UgUmVtb3ZlUmFuZ2U7CisKKyAgLy8vIFxicmllZiBDb2RlIGluIHRoZSBzcGVjaWZpYyByYW5nZSB0aGF0IHNob3VsZCBiZSBpbnNlcnRlZCBpbiB0aGUgaW5zZXJ0aW9uCisgIC8vLyBsb2NhdGlvbi4KKyAgQ2hhclNvdXJjZVJhbmdlIEluc2VydEZyb21SYW5nZTsKKworICAvLy8gXGJyaWVmIFRoZSBhY3R1YWwgY29kZSB0byBpbnNlcnQgYXQgdGhlIGluc2VydGlvbiBsb2NhdGlvbiwgYXMgYQorICAvLy8gc3RyaW5nLgorICBzdGQ6OnN0cmluZyBDb2RlVG9JbnNlcnQ7CisKKyAgYm9vbCBCZWZvcmVQcmV2aW91c0luc2VydGlvbnMgPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIEVtcHR5IGNvZGUgbW9kaWZpY2F0aW9uIGhpbnQsIGluZGljYXRpbmcgdGhhdCBubyBjb2RlCisgIC8vLyBtb2RpZmljYXRpb24gaXMga25vd24uCisgIEZpeEl0SGludCgpID0gZGVmYXVsdDsKKworICBib29sIGlzTnVsbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gIVJlbW92ZVJhbmdlLmlzVmFsaWQoKTsKKyAgfQorICAKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBjb2RlIG1vZGlmaWNhdGlvbiBoaW50IHRoYXQgaW5zZXJ0cyB0aGUgZ2l2ZW4KKyAgLy8vIGNvZGUgc3RyaW5nIGF0IGEgc3BlY2lmaWMgbG9jYXRpb24uCisgIHN0YXRpYyBGaXhJdEhpbnQgQ3JlYXRlSW5zZXJ0aW9uKFNvdXJjZUxvY2F0aW9uIEluc2VydGlvbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQmVmb3JlUHJldmlvdXNJbnNlcnRpb25zID0gZmFsc2UpIHsKKyAgICBGaXhJdEhpbnQgSGludDsKKyAgICBIaW50LlJlbW92ZVJhbmdlID0KKyAgICAgIENoYXJTb3VyY2VSYW5nZTo6Z2V0Q2hhclJhbmdlKEluc2VydGlvbkxvYywgSW5zZXJ0aW9uTG9jKTsKKyAgICBIaW50LkNvZGVUb0luc2VydCA9IENvZGU7CisgICAgSGludC5CZWZvcmVQcmV2aW91c0luc2VydGlvbnMgPSBCZWZvcmVQcmV2aW91c0luc2VydGlvbnM7CisgICAgcmV0dXJuIEhpbnQ7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgY29kZSBtb2RpZmljYXRpb24gaGludCB0aGF0IGluc2VydHMgdGhlIGdpdmVuCisgIC8vLyBjb2RlIGZyb20gXHAgRnJvbVJhbmdlIGF0IGEgc3BlY2lmaWMgbG9jYXRpb24uCisgIHN0YXRpYyBGaXhJdEhpbnQgQ3JlYXRlSW5zZXJ0aW9uRnJvbVJhbmdlKFNvdXJjZUxvY2F0aW9uIEluc2VydGlvbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNvdXJjZVJhbmdlIEZyb21SYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEJlZm9yZVByZXZpb3VzSW5zZXJ0aW9ucyA9IGZhbHNlKSB7CisgICAgRml4SXRIaW50IEhpbnQ7CisgICAgSGludC5SZW1vdmVSYW5nZSA9CisgICAgICBDaGFyU291cmNlUmFuZ2U6OmdldENoYXJSYW5nZShJbnNlcnRpb25Mb2MsIEluc2VydGlvbkxvYyk7CisgICAgSGludC5JbnNlcnRGcm9tUmFuZ2UgPSBGcm9tUmFuZ2U7CisgICAgSGludC5CZWZvcmVQcmV2aW91c0luc2VydGlvbnMgPSBCZWZvcmVQcmV2aW91c0luc2VydGlvbnM7CisgICAgcmV0dXJuIEhpbnQ7CisgIH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIGNvZGUgbW9kaWZpY2F0aW9uIGhpbnQgdGhhdCByZW1vdmVzIHRoZSBnaXZlbgorICAvLy8gc291cmNlIHJhbmdlLgorICBzdGF0aWMgRml4SXRIaW50IENyZWF0ZVJlbW92YWwoQ2hhclNvdXJjZVJhbmdlIFJlbW92ZVJhbmdlKSB7CisgICAgRml4SXRIaW50IEhpbnQ7CisgICAgSGludC5SZW1vdmVSYW5nZSA9IFJlbW92ZVJhbmdlOworICAgIHJldHVybiBIaW50OworICB9CisgIHN0YXRpYyBGaXhJdEhpbnQgQ3JlYXRlUmVtb3ZhbChTb3VyY2VSYW5nZSBSZW1vdmVSYW5nZSkgeworICAgIHJldHVybiBDcmVhdGVSZW1vdmFsKENoYXJTb3VyY2VSYW5nZTo6Z2V0VG9rZW5SYW5nZShSZW1vdmVSYW5nZSkpOworICB9CisgIAorICAvLy8gXGJyaWVmIENyZWF0ZSBhIGNvZGUgbW9kaWZpY2F0aW9uIGhpbnQgdGhhdCByZXBsYWNlcyB0aGUgZ2l2ZW4KKyAgLy8vIHNvdXJjZSByYW5nZSB3aXRoIHRoZSBnaXZlbiBjb2RlIHN0cmluZy4KKyAgc3RhdGljIEZpeEl0SGludCBDcmVhdGVSZXBsYWNlbWVudChDaGFyU291cmNlUmFuZ2UgUmVtb3ZlUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENvZGUpIHsKKyAgICBGaXhJdEhpbnQgSGludDsKKyAgICBIaW50LlJlbW92ZVJhbmdlID0gUmVtb3ZlUmFuZ2U7CisgICAgSGludC5Db2RlVG9JbnNlcnQgPSBDb2RlOworICAgIHJldHVybiBIaW50OworICB9CisgIAorICBzdGF0aWMgRml4SXRIaW50IENyZWF0ZVJlcGxhY2VtZW50KFNvdXJjZVJhbmdlIFJlbW92ZVJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDb2RlKSB7CisgICAgcmV0dXJuIENyZWF0ZVJlcGxhY2VtZW50KENoYXJTb3VyY2VSYW5nZTo6Z2V0VG9rZW5SYW5nZShSZW1vdmVSYW5nZSksIENvZGUpOworICB9Cit9OworCisvLy8gXGJyaWVmIENvbmNyZXRlIGNsYXNzIHVzZWQgYnkgdGhlIGZyb250LWVuZCB0byByZXBvcnQgcHJvYmxlbXMgYW5kIGlzc3Vlcy4KKy8vLworLy8vIFRoaXMgbWFzc2FnZXMgdGhlIGRpYWdub3N0aWNzIChlLmcuIGhhbmRsaW5nIHRoaW5ncyBsaWtlICJyZXBvcnQgd2FybmluZ3MKKy8vLyBhcyBlcnJvcnMiIGFuZCBwYXNzZXMgdGhlbSBvZmYgdG8gdGhlIERpYWdub3N0aWNDb25zdW1lciBmb3IgcmVwb3J0aW5nIHRvCisvLy8gdGhlIHVzZXIuIERpYWdub3N0aWNzRW5naW5lIGlzIHRpZWQgdG8gb25lIHRyYW5zbGF0aW9uIHVuaXQgYW5kIG9uZQorLy8vIFNvdXJjZU1hbmFnZXIuCitjbGFzcyBEaWFnbm9zdGljc0VuZ2luZSA6IHB1YmxpYyBSZWZDb3VudGVkQmFzZTxEaWFnbm9zdGljc0VuZ2luZT4geworcHVibGljOgorICAvLy8gXGJyaWVmIFRoZSBsZXZlbCBvZiB0aGUgZGlhZ25vc3RpYywgYWZ0ZXIgaXQgaGFzIGJlZW4gdGhyb3VnaCBtYXBwaW5nLgorICBlbnVtIExldmVsIHsKKyAgICBJZ25vcmVkID0gRGlhZ25vc3RpY0lEczo6SWdub3JlZCwKKyAgICBOb3RlID0gRGlhZ25vc3RpY0lEczo6Tm90ZSwKKyAgICBSZW1hcmsgPSBEaWFnbm9zdGljSURzOjpSZW1hcmssCisgICAgV2FybmluZyA9IERpYWdub3N0aWNJRHM6Oldhcm5pbmcsCisgICAgRXJyb3IgPSBEaWFnbm9zdGljSURzOjpFcnJvciwKKyAgICBGYXRhbCA9IERpYWdub3N0aWNJRHM6OkZhdGFsCisgIH07CisKKyAgZW51bSBBcmd1bWVudEtpbmQgeworICAgIC8vLyBzdGQ6OnN0cmluZworICAgIGFrX3N0ZF9zdHJpbmcsCisKKyAgICAvLy8gY29uc3QgY2hhciAqCisgICAgYWtfY19zdHJpbmcsCisKKyAgICAvLy8gaW50CisgICAgYWtfc2ludCwKKworICAgIC8vLyB1bnNpZ25lZAorICAgIGFrX3VpbnQsCisKKyAgICAvLy8gZW51bSBUb2tlbktpbmQgOiB1bnNpZ25lZAorICAgIGFrX3Rva2Vua2luZCwKKworICAgIC8vLyBJZGVudGlmaWVySW5mbworICAgIGFrX2lkZW50aWZpZXJpbmZvLAorCisgICAgLy8vIFF1YWxUeXBlCisgICAgYWtfcXVhbHR5cGUsCisKKyAgICAvLy8gRGVjbGFyYXRpb25OYW1lCisgICAgYWtfZGVjbGFyYXRpb25uYW1lLAorCisgICAgLy8vIE5hbWVkRGVjbCAqCisgICAgYWtfbmFtZWRkZWNsLAorCisgICAgLy8vIE5lc3RlZE5hbWVTcGVjaWZpZXIgKgorICAgIGFrX25lc3RlZG5hbWVzcGVjLAorCisgICAgLy8vIERlY2xDb250ZXh0ICoKKyAgICBha19kZWNsY29udGV4dCwKKworICAgIC8vLyBwYWlyPFF1YWxUeXBlLCBRdWFsVHlwZT4KKyAgICBha19xdWFsdHlwZV9wYWlyLAorCisgICAgLy8vIEF0dHIgKgorICAgIGFrX2F0dHIKKyAgfTsKKworICAvLy8gXGJyaWVmIFJlcHJlc2VudHMgb24gYXJndW1lbnQgdmFsdWUsIHdoaWNoIGlzIGEgdW5pb24gZGlzY3JpbWluYXRlZAorICAvLy8gYnkgQXJndW1lbnRLaW5kLCB3aXRoIGEgdmFsdWUuCisgIHVzaW5nIEFyZ3VtZW50VmFsdWUgPSBzdGQ6OnBhaXI8QXJndW1lbnRLaW5kLCBpbnRwdHJfdD47CisKK3ByaXZhdGU6CisgIC8vIFVzZWQgYnkgX19leHRlbnNpb25fXworICB1bnNpZ25lZCBjaGFyIEFsbEV4dGVuc2lvbnNTaWxlbmNlZCA9IDA7CisKKyAgLy8gU3VwcHJlc3MgZGlhZ25vc3RpY3MgYWZ0ZXIgYSBmYXRhbCBlcnJvcj8KKyAgYm9vbCBTdXBwcmVzc0FmdGVyRmF0YWxFcnJvciA9IHRydWU7CisKKyAgLy8gU3VwcHJlc3MgYWxsIGRpYWdub3N0aWNzLgorICBib29sIFN1cHByZXNzQWxsRGlhZ25vc3RpY3MgPSBmYWxzZTsKKworICAvLyBFbGlkZSBjb21tb24gdHlwZXMgb2YgdGVtcGxhdGVzLgorICBib29sIEVsaWRlVHlwZSA9IHRydWU7CisKKyAgLy8gUHJpbnQgYSB0cmVlIHdoZW4gY29tcGFyaW5nIHRlbXBsYXRlcy4KKyAgYm9vbCBQcmludFRlbXBsYXRlVHJlZSA9IGZhbHNlOworCisgIC8vIENvbG9yIHByaW50aW5nIGlzIGVuYWJsZWQuCisgIGJvb2wgU2hvd0NvbG9ycyA9IGZhbHNlOworCisgIC8vIFdoaWNoIG92ZXJsb2FkIGNhbmRpZGF0ZXMgdG8gc2hvdy4KKyAgT3ZlcmxvYWRzU2hvd24gU2hvd092ZXJsb2FkcyA9IE92bF9BbGw7CisKKyAgLy8gQ2FwIG9mICMgZXJyb3JzIGVtaXR0ZWQsIDAgLT4gbm8gbGltaXQuCisgIHVuc2lnbmVkIEVycm9yTGltaXQgPSAwOworCisgIC8vIENhcCBvbiBkZXB0aCBvZiB0ZW1wbGF0ZSBiYWNrdHJhY2Ugc3RhY2ssIDAgLT4gbm8gbGltaXQuCisgIHVuc2lnbmVkIFRlbXBsYXRlQmFja3RyYWNlTGltaXQgPSAwOworCisgIC8vIENhcCBvbiBkZXB0aCBvZiBjb25zdGV4cHIgZXZhbHVhdGlvbiBiYWNrdHJhY2Ugc3RhY2ssIDAgLT4gbm8gbGltaXQuCisgIHVuc2lnbmVkIENvbnN0ZXhwckJhY2t0cmFjZUxpbWl0ID0gMDsKKworICBJbnRydXNpdmVSZWZDbnRQdHI8RGlhZ25vc3RpY0lEcz4gRGlhZ3M7CisgIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljT3B0aW9ucz4gRGlhZ09wdHM7CisgIERpYWdub3N0aWNDb25zdW1lciAqQ2xpZW50ID0gbnVsbHB0cjsKKyAgc3RkOjp1bmlxdWVfcHRyPERpYWdub3N0aWNDb25zdW1lcj4gT3duZXI7CisgIFNvdXJjZU1hbmFnZXIgKlNvdXJjZU1nciA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBNYXBwaW5nIGluZm9ybWF0aW9uIGZvciBkaWFnbm9zdGljcy4KKyAgLy8vCisgIC8vLyBNYXBwaW5nIGluZm8gaXMgcGFja2VkIGludG8gZm91ciBiaXRzIHBlciBkaWFnbm9zdGljLiAgVGhlIGxvdyB0aHJlZQorICAvLy8gYml0cyBhcmUgdGhlIG1hcHBpbmcgKGFuIGluc3RhbmNlIG9mIGRpYWc6OlNldmVyaXR5KSwgb3IgemVybyBpZiB1bnNldC4KKyAgLy8vIFRoZSBoaWdoIGJpdCBpcyBzZXQgd2hlbiB0aGUgbWFwcGluZyB3YXMgZXN0YWJsaXNoZWQgYXMgYSB1c2VyIG1hcHBpbmcuCisgIC8vLyBJZiB0aGUgaGlnaCBiaXQgaXMgY2xlYXIsIHRoZW4gdGhlIGxvdyBiaXRzIGFyZSBzZXQgdG8gdGhlIGRlZmF1bHQKKyAgLy8vIHZhbHVlLCBhbmQgc2hvdWxkIGJlIG1hcHBlZCB3aXRoIC1wZWRhbnRpYywgLVdlcnJvciwgZXRjLgorICAvLy8KKyAgLy8vIEEgbmV3IERpYWdTdGF0ZSBpcyBjcmVhdGVkIGFuZCBrZXB0IGFyb3VuZCB3aGVuIGRpYWdub3N0aWMgcHJhZ21hcyBtb2RpZnkKKyAgLy8vIHRoZSBzdGF0ZSBzbyB0aGF0IHdlIGtub3cgd2hhdCBpcyB0aGUgZGlhZ25vc3RpYyBzdGF0ZSBhdCBhbnkgZ2l2ZW4KKyAgLy8vIHNvdXJjZSBsb2NhdGlvbi4KKyAgY2xhc3MgRGlhZ1N0YXRlIHsKKyAgICBsbHZtOjpEZW5zZU1hcDx1bnNpZ25lZCwgRGlhZ25vc3RpY01hcHBpbmc+IERpYWdNYXA7CisKKyAgcHVibGljOgorICAgIC8vICJHbG9iYWwiIGNvbmZpZ3VyYXRpb24gc3RhdGUgdGhhdCBjYW4gYWN0dWFsbHkgdmFyeSBiZXR3ZWVuIG1vZHVsZXMuCisKKyAgICAvLyBJZ25vcmUgYWxsIHdhcm5pbmdzOiAtdworICAgIHVuc2lnbmVkIElnbm9yZUFsbFdhcm5pbmdzIDogMTsKKworICAgIC8vIEVuYWJsZSBhbGwgd2FybmluZ3MuCisgICAgdW5zaWduZWQgRW5hYmxlQWxsV2FybmluZ3MgOiAxOworCisgICAgLy8gVHJlYXQgd2FybmluZ3MgbGlrZSBlcnJvcnMuCisgICAgdW5zaWduZWQgV2FybmluZ3NBc0Vycm9ycyA6IDE7CisKKyAgICAvLyBUcmVhdCBlcnJvcnMgbGlrZSBmYXRhbCBlcnJvcnMuCisgICAgdW5zaWduZWQgRXJyb3JzQXNGYXRhbCA6IDE7CisKKyAgICAvLyBTdXBwcmVzcyB3YXJuaW5ncyBpbiBzeXN0ZW0gaGVhZGVycy4KKyAgICB1bnNpZ25lZCBTdXBwcmVzc1N5c3RlbVdhcm5pbmdzIDogMTsKKworICAgIC8vIE1hcCBleHRlbnNpb25zIHRvIHdhcm5pbmdzIG9yIGVycm9ycz8KKyAgICBkaWFnOjpTZXZlcml0eSBFeHRCZWhhdmlvciA9IGRpYWc6OlNldmVyaXR5OjpJZ25vcmVkOworCisgICAgRGlhZ1N0YXRlKCkKKyAgICAgICAgOiBJZ25vcmVBbGxXYXJuaW5ncyhmYWxzZSksIEVuYWJsZUFsbFdhcm5pbmdzKGZhbHNlKSwKKyAgICAgICAgICBXYXJuaW5nc0FzRXJyb3JzKGZhbHNlKSwgRXJyb3JzQXNGYXRhbChmYWxzZSksCisgICAgICAgICAgU3VwcHJlc3NTeXN0ZW1XYXJuaW5ncyhmYWxzZSkge30KKworICAgIHVzaW5nIGl0ZXJhdG9yID0gbGx2bTo6RGVuc2VNYXA8dW5zaWduZWQsIERpYWdub3N0aWNNYXBwaW5nPjo6aXRlcmF0b3I7CisgICAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPQorICAgICAgICBsbHZtOjpEZW5zZU1hcDx1bnNpZ25lZCwgRGlhZ25vc3RpY01hcHBpbmc+Ojpjb25zdF9pdGVyYXRvcjsKKworICAgIHZvaWQgc2V0TWFwcGluZyhkaWFnOjpraW5kIERpYWcsIERpYWdub3N0aWNNYXBwaW5nIEluZm8pIHsKKyAgICAgIERpYWdNYXBbRGlhZ10gPSBJbmZvOworICAgIH0KKworICAgIERpYWdub3N0aWNNYXBwaW5nIGxvb2t1cE1hcHBpbmcoZGlhZzo6a2luZCBEaWFnKSBjb25zdCB7CisgICAgICByZXR1cm4gRGlhZ01hcC5sb29rdXAoRGlhZyk7CisgICAgfQorCisgICAgRGlhZ25vc3RpY01hcHBpbmcgJmdldE9yQWRkTWFwcGluZyhkaWFnOjpraW5kIERpYWcpOworCisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBEaWFnTWFwLmJlZ2luKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBEaWFnTWFwLmVuZCgpOyB9CisgIH07CisKKyAgLy8vIFxicmllZiBLZWVwcyBhbmQgYXV0b21hdGljYWxseSBkaXNwb3NlcyBhbGwgRGlhZ1N0YXRlcyB0aGF0IHdlIGNyZWF0ZS4KKyAgc3RkOjpsaXN0PERpYWdTdGF0ZT4gRGlhZ1N0YXRlczsKKworICAvLy8gQSBtYXBwaW5nIGZyb20gZmlsZXMgdG8gdGhlIGRpYWdub3N0aWMgc3RhdGVzIGZvciB0aG9zZSBmaWxlcy4gTGF6aWx5CisgIC8vLyBidWlsdCBvbiBkZW1hbmQgZm9yIGZpbGVzIGluIHdoaWNoIHRoZSBkaWFnbm9zdGljIHN0YXRlIGhhcyBub3QgY2hhbmdlZC4KKyAgY2xhc3MgRGlhZ1N0YXRlTWFwIHsKKyAgcHVibGljOgorICAgIC8vLyBBZGQgYW4gaW5pdGlhbCBkaWFnbm9zdGljIHN0YXRlLgorICAgIHZvaWQgYXBwZW5kRmlyc3QoRGlhZ1N0YXRlICpTdGF0ZSk7CisKKyAgICAvLy8gQWRkIGEgbmV3IGxhdGVzdCBzdGF0ZSBwb2ludC4KKyAgICB2b2lkIGFwcGVuZChTb3VyY2VNYW5hZ2VyICZTcmNNZ3IsIFNvdXJjZUxvY2F0aW9uIExvYywgRGlhZ1N0YXRlICpTdGF0ZSk7CisKKyAgICAvLy8gTG9vayB1cCB0aGUgZGlhZ25vc3RpYyBzdGF0ZSBhdCBhIGdpdmVuIHNvdXJjZSBsb2NhdGlvbi4KKyAgICBEaWFnU3RhdGUgKmxvb2t1cChTb3VyY2VNYW5hZ2VyICZTcmNNZ3IsIFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3Q7CisKKyAgICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBtYXAgaXMgZW1wdHkuCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEZpbGVzLmVtcHR5KCk7IH0KKworICAgIC8vLyBDbGVhciBvdXQgdGhpcyBtYXAuCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgIEZpbGVzLmNsZWFyKCk7CisgICAgICBGaXJzdERpYWdTdGF0ZSA9IEN1ckRpYWdTdGF0ZSA9IG51bGxwdHI7CisgICAgICBDdXJEaWFnU3RhdGVMb2MgPSBTb3VyY2VMb2NhdGlvbigpOworICAgIH0KKworICAgIC8vLyBQcm9kdWNlIGEgZGVidWdnaW5nIGR1bXAgb2YgdGhlIGRpYWdub3N0aWMgc3RhdGUuCisgICAgTExWTV9EVU1QX01FVEhPRCB2b2lkIGR1bXAoU291cmNlTWFuYWdlciAmU3JjTWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEaWFnTmFtZSA9IFN0cmluZ1JlZigpKSBjb25zdDsKKworICAgIC8vLyBHcmFiIHRoZSBtb3N0LXJlY2VudGx5LWFkZGVkIHN0YXRlIHBvaW50LgorICAgIERpYWdTdGF0ZSAqZ2V0Q3VyRGlhZ1N0YXRlKCkgY29uc3QgeyByZXR1cm4gQ3VyRGlhZ1N0YXRlOyB9CisKKyAgICAvLy8gR2V0IHRoZSBsb2NhdGlvbiBhdCB3aGljaCBhIGRpYWdub3N0aWMgc3RhdGUgd2FzIGxhc3QgYWRkZWQuCisgICAgU291cmNlTG9jYXRpb24gZ2V0Q3VyRGlhZ1N0YXRlTG9jKCkgY29uc3QgeyByZXR1cm4gQ3VyRGlhZ1N0YXRlTG9jOyB9CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQVNUUmVhZGVyOworICAgIGZyaWVuZCBjbGFzcyBBU1RXcml0ZXI7CisKKyAgICAvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBwb2ludCBpbiBzb3VyY2Ugd2hlcmUgdGhlIGRpYWdub3N0aWMgc3RhdGUgd2FzCisgICAgLy8vIG1vZGlmaWVkIGJlY2F1c2Ugb2YgYSBwcmFnbWEuCisgICAgLy8vCisgICAgLy8vICdMb2MnIGNhbiBiZSBudWxsIGlmIHRoZSBwb2ludCByZXByZXNlbnRzIHRoZSBkaWFnbm9zdGljIHN0YXRlCisgICAgLy8vIG1vZGlmaWNhdGlvbnMgZG9uZSB0aHJvdWdoIHRoZSBjb21tYW5kLWxpbmUuCisgICAgc3RydWN0IERpYWdTdGF0ZVBvaW50IHsKKyAgICAgIERpYWdTdGF0ZSAqU3RhdGU7CisgICAgICB1bnNpZ25lZCBPZmZzZXQ7CisKKyAgICAgIERpYWdTdGF0ZVBvaW50KERpYWdTdGF0ZSAqU3RhdGUsIHVuc2lnbmVkIE9mZnNldCkKKyAgICAgICAgICA6IFN0YXRlKFN0YXRlKSwgT2Zmc2V0KE9mZnNldCkge30gCisgICAgfTsKKworICAgIC8vLyBEZXNjcmlwdGlvbiBvZiB0aGUgZGlhZ25vc3RpYyBzdGF0ZXMgYW5kIHN0YXRlIHRyYW5zaXRpb25zIGZvciBhCisgICAgLy8vIHBhcnRpY3VsYXIgRmlsZUlELgorICAgIHN0cnVjdCBGaWxlIHsKKyAgICAgIC8vLyBUaGUgZGlhZ25vc3RpYyBzdGF0ZSBmb3IgdGhlIHBhcmVudCBmaWxlLiBUaGlzIGlzIHN0cmljdGx5IHJlZHVuZGFudCwKKyAgICAgIC8vLyBhcyBsb29raW5nIHVwIHRoZSBEZWNvbXBvc2VkSW5jbHVkZWRMb2MgZm9yIHRoZSBGaWxlSUQgaW4gdGhlIEZpbGVzCisgICAgICAvLy8gbWFwIHdvdWxkIGdpdmUgdXMgdGhpcywgYnV0IHdlIGNhY2hlIGl0IGhlcmUgZm9yIHBlcmZvcm1hbmNlLgorICAgICAgRmlsZSAqUGFyZW50ID0gbnVsbHB0cjsKKworICAgICAgLy8vIFRoZSBvZmZzZXQgb2YgdGhpcyBmaWxlIHdpdGhpbiBpdHMgcGFyZW50LgorICAgICAgdW5zaWduZWQgUGFyZW50T2Zmc2V0ID0gMDsKKworICAgICAgLy8vIFdoZXRoZXIgdGhpcyBmaWxlIGhhcyBhbnkgbG9jYWwgKG5vdCBpbXBvcnRlZCBmcm9tIGFuIEFTVCBmaWxlKQorICAgICAgLy8vIGRpYWdub3N0aWMgc3RhdGUgdHJhbnNpdGlvbnMuCisgICAgICBib29sIEhhc0xvY2FsVHJhbnNpdGlvbnMgPSBmYWxzZTsKKworICAgICAgLy8vIFRoZSBwb2ludHMgd2l0aGluIHRoZSBmaWxlIHdoZXJlIHRoZSBzdGF0ZSBjaGFuZ2VzLiBUaGVyZSB3aWxsIGFsd2F5cworICAgICAgLy8vIGJlIGF0IGxlYXN0IG9uZSBvZiB0aGVzZSAodGhlIHN0YXRlIG9uIGVudHJ5IHRvIHRoZSBmaWxlKS4KKyAgICAgIGxsdm06OlNtYWxsVmVjdG9yPERpYWdTdGF0ZVBvaW50LCA0PiBTdGF0ZVRyYW5zaXRpb25zOworCisgICAgICBEaWFnU3RhdGUgKmxvb2t1cCh1bnNpZ25lZCBPZmZzZXQpIGNvbnN0OworICAgIH07CisKKyAgICAvLy8gVGhlIGRpYWdub3N0aWMgc3RhdGVzIGZvciBlYWNoIGZpbGUuCisgICAgbXV0YWJsZSBzdGQ6Om1hcDxGaWxlSUQsIEZpbGU+IEZpbGVzOworCisgICAgLy8vIFRoZSBpbml0aWFsIGRpYWdub3N0aWMgc3RhdGUuCisgICAgRGlhZ1N0YXRlICpGaXJzdERpYWdTdGF0ZTsKKworICAgIC8vLyBUaGUgY3VycmVudCBkaWFnbm9zdGljIHN0YXRlLgorICAgIERpYWdTdGF0ZSAqQ3VyRGlhZ1N0YXRlOworCisgICAgLy8vIFRoZSBsb2NhdGlvbiBhdCB3aGljaCB0aGUgY3VycmVudCBkaWFnbm9zdGljIHN0YXRlIHdhcyBlc3RhYmxpc2hlZC4KKyAgICBTb3VyY2VMb2NhdGlvbiBDdXJEaWFnU3RhdGVMb2M7CisKKyAgICAvLy8gR2V0IHRoZSBkaWFnbm9zdGljIHN0YXRlIGluZm9ybWF0aW9uIGZvciBhIGZpbGUuCisgICAgRmlsZSAqZ2V0RmlsZShTb3VyY2VNYW5hZ2VyICZTcmNNZ3IsIEZpbGVJRCBJRCkgY29uc3Q7CisgIH07CisKKyAgRGlhZ1N0YXRlTWFwIERpYWdTdGF0ZXNCeUxvYzsKKworICAvLy8gXGJyaWVmIEtlZXBzIHRoZSBEaWFnU3RhdGUgdGhhdCB3YXMgYWN0aXZlIGR1cmluZyBlYWNoIGRpYWdub3N0aWMgJ3B1c2gnCisgIC8vLyBzbyB3ZSBjYW4gZ2V0IGJhY2sgYXQgaXQgd2hlbiB3ZSAncG9wJy4KKyAgc3RkOjp2ZWN0b3I8RGlhZ1N0YXRlICo+IERpYWdTdGF0ZU9uUHVzaFN0YWNrOworCisgIERpYWdTdGF0ZSAqR2V0Q3VyRGlhZ1N0YXRlKCkgY29uc3QgeworICAgIHJldHVybiBEaWFnU3RhdGVzQnlMb2MuZ2V0Q3VyRGlhZ1N0YXRlKCk7CisgIH0KKworICB2b2lkIFB1c2hEaWFnU3RhdGVQb2ludChEaWFnU3RhdGUgKlN0YXRlLCBTb3VyY2VMb2NhdGlvbiBMKTsKKworICAvLy8gXGJyaWVmIEZpbmRzIHRoZSBEaWFnU3RhdGVQb2ludCB0aGF0IGNvbnRhaW5zIHRoZSBkaWFnbm9zdGljIHN0YXRlIG9mCisgIC8vLyB0aGUgZ2l2ZW4gc291cmNlIGxvY2F0aW9uLgorICBEaWFnU3RhdGUgKkdldERpYWdTdGF0ZUZvckxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0IHsKKyAgICByZXR1cm4gU291cmNlTWdyID8gRGlhZ1N0YXRlc0J5TG9jLmxvb2t1cCgqU291cmNlTWdyLCBMb2MpCisgICAgICAgICAgICAgICAgICAgICA6IERpYWdTdGF0ZXNCeUxvYy5nZXRDdXJEaWFnU3RhdGUoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU3RpY2t5IGZsYWcgc2V0IHRvIFxjIHRydWUgd2hlbiBhbiBlcnJvciBpcyBlbWl0dGVkLgorICBib29sIEVycm9yT2NjdXJyZWQ7CisKKyAgLy8vIFxicmllZiBTdGlja3kgZmxhZyBzZXQgdG8gXGMgdHJ1ZSB3aGVuIGFuICJ1bmNvbXBpbGFibGUgZXJyb3IiIG9jY3Vycy4KKyAgLy8vIEkuZS4gYW4gZXJyb3IgdGhhdCB3YXMgbm90IHVwZ3JhZGVkIGZyb20gYSB3YXJuaW5nIGJ5IC1XZXJyb3IuCisgIGJvb2wgVW5jb21waWxhYmxlRXJyb3JPY2N1cnJlZDsKKworICAvLy8gXGJyaWVmIFN0aWNreSBmbGFnIHNldCB0byBcYyB0cnVlIHdoZW4gYSBmYXRhbCBlcnJvciBpcyBlbWl0dGVkLgorICBib29sIEZhdGFsRXJyb3JPY2N1cnJlZDsKKworICAvLy8gXGJyaWVmIEluZGljYXRlcyB0aGF0IGFuIHVucmVjb3ZlcmFibGUgZXJyb3IgaGFzIG9jY3VycmVkLgorICBib29sIFVucmVjb3ZlcmFibGVFcnJvck9jY3VycmVkOworICAKKyAgLy8vIFxicmllZiBDb3VudHMgZm9yIERpYWdub3N0aWNFcnJvclRyYXAgdG8gY2hlY2sgd2hldGhlciBhbiBlcnJvciBvY2N1cnJlZAorICAvLy8gZHVyaW5nIGEgcGFyc2luZyBzZWN0aW9uLCBlLmcuIGR1cmluZyBwYXJzaW5nIGEgZnVuY3Rpb24uCisgIHVuc2lnbmVkIFRyYXBOdW1FcnJvcnNPY2N1cnJlZDsKKyAgdW5zaWduZWQgVHJhcE51bVVucmVjb3ZlcmFibGVFcnJvcnNPY2N1cnJlZDsKKworICAvLy8gXGJyaWVmIFRoZSBsZXZlbCBvZiB0aGUgbGFzdCBkaWFnbm9zdGljIGVtaXR0ZWQuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHRvIGVtaXQgY29udGludWF0aW9uIGRpYWdub3N0aWNzIHdpdGggdGhlIHNhbWUgbGV2ZWwgYXMgdGhlCisgIC8vLyBkaWFnbm9zdGljIHRoYXQgdGhleSBmb2xsb3cuCisgIERpYWdub3N0aWNJRHM6OkxldmVsIExhc3REaWFnTGV2ZWw7CisKKyAgLy8vIE51bWJlciBvZiB3YXJuaW5ncyByZXBvcnRlZAorICB1bnNpZ25lZCBOdW1XYXJuaW5nczsKKworICAvLy8gTnVtYmVyIG9mIGVycm9ycyByZXBvcnRlZAorICB1bnNpZ25lZCBOdW1FcnJvcnM7CisKKyAgLy8vIFxicmllZiBBIGZ1bmN0aW9uIHBvaW50ZXIgdGhhdCBjb252ZXJ0cyBhbiBvcGFxdWUgZGlhZ25vc3RpYworICAvLy8gYXJndW1lbnQgdG8gYSBzdHJpbmdzLgorICAvLy8KKyAgLy8vIFRoaXMgdGFrZXMgdGhlIG1vZGlmaWVycyBhbmQgYXJndW1lbnQgdGhhdCB3YXMgcHJlc2VudCBpbiB0aGUgZGlhZ25vc3RpYy4KKyAgLy8vCisgIC8vLyBUaGUgUHJldkFyZ3MgYXJyYXkgaW5kaWNhdGVzIHRoZSBwcmV2aW91cyBhcmd1bWVudHMgZm9ybWF0dGVkIGZvciB0aGlzCisgIC8vLyBkaWFnbm9zdGljLiAgSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgZnVuY3Rpb24gY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvCisgIC8vLyBhdm9pZCByZWR1bmRhbmN5IGFjcm9zcyBhcmd1bWVudHMuCisgIC8vLworICAvLy8gVGhpcyBpcyBhIGhhY2sgdG8gYXZvaWQgYSBsYXllcmluZyB2aW9sYXRpb24gYmV0d2VlbiBsaWJiYXNpYyBhbmQgbGlic2VtYS4KKyAgdXNpbmcgQXJnVG9TdHJpbmdGblR5ID0gdm9pZCAoKikoCisgICAgICBBcmd1bWVudEtpbmQgS2luZCwgaW50cHRyX3QgVmFsLAorICAgICAgU3RyaW5nUmVmIE1vZGlmaWVyLCBTdHJpbmdSZWYgQXJndW1lbnQsCisgICAgICBBcnJheVJlZjxBcmd1bWVudFZhbHVlPiBQcmV2QXJncywKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmT3V0cHV0LAorICAgICAgdm9pZCAqQ29va2llLAorICAgICAgQXJyYXlSZWY8aW50cHRyX3Q+IFF1YWxUeXBlVmFscyk7CisKKyAgdm9pZCAqQXJnVG9TdHJpbmdDb29raWUgPSBudWxscHRyOworICBBcmdUb1N0cmluZ0ZuVHkgQXJnVG9TdHJpbmdGbjsKKworICAvLy8gXGJyaWVmIElEIG9mIHRoZSAiZGVsYXllZCIgZGlhZ25vc3RpYywgd2hpY2ggaXMgYSAodHlwaWNhbGx5CisgIC8vLyBmYXRhbCkgZGlhZ25vc3RpYyB0aGF0IGhhZCB0byBiZSBkZWxheWVkIGJlY2F1c2UgaXQgd2FzIGZvdW5kCisgIC8vLyB3aGlsZSBlbWl0dGluZyBhbm90aGVyIGRpYWdub3N0aWMuCisgIHVuc2lnbmVkIERlbGF5ZWREaWFnSUQ7CisKKyAgLy8vIFxicmllZiBGaXJzdCBzdHJpbmcgYXJndW1lbnQgZm9yIHRoZSBkZWxheWVkIGRpYWdub3N0aWMuCisgIHN0ZDo6c3RyaW5nIERlbGF5ZWREaWFnQXJnMTsKKworICAvLy8gXGJyaWVmIFNlY29uZCBzdHJpbmcgYXJndW1lbnQgZm9yIHRoZSBkZWxheWVkIGRpYWdub3N0aWMuCisgIHN0ZDo6c3RyaW5nIERlbGF5ZWREaWFnQXJnMjsKKworICAvLy8gXGJyaWVmIE9wdGlvbmFsIGZsYWcgdmFsdWUuCisgIC8vLworICAvLy8gU29tZSBmbGFncyBhY2NlcHQgdmFsdWVzLCBmb3IgaW5zdGFuY2U6IC1XZnJhbWUtbGFyZ2VyLXRoYW49PHZhbHVlPiBhbmQKKyAgLy8vIC1ScGFzcz08dmFsdWU+LiBUaGUgY29udGVudCBvZiB0aGlzIHN0cmluZyBpcyBlbWl0dGVkIGFmdGVyIHRoZSBmbGFnIG5hbWUKKyAgLy8vIGFuZCAnPScuCisgIHN0ZDo6c3RyaW5nIEZsYWdWYWx1ZTsKKworcHVibGljOgorICBleHBsaWNpdCBEaWFnbm9zdGljc0VuZ2luZShJbnRydXNpdmVSZWZDbnRQdHI8RGlhZ25vc3RpY0lEcz4gRGlhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljT3B0aW9ucz4gRGlhZ09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNDb25zdW1lciAqY2xpZW50ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRPd25DbGllbnQgPSB0cnVlKTsKKyAgRGlhZ25vc3RpY3NFbmdpbmUoY29uc3QgRGlhZ25vc3RpY3NFbmdpbmUgJikgPSBkZWxldGU7CisgIERpYWdub3N0aWNzRW5naW5lICZvcGVyYXRvcj0oY29uc3QgRGlhZ25vc3RpY3NFbmdpbmUgJikgPSBkZWxldGU7CisgIH5EaWFnbm9zdGljc0VuZ2luZSgpOworCisgIExMVk1fRFVNUF9NRVRIT0Qgdm9pZCBkdW1wKCkgY29uc3QgeyBEaWFnU3RhdGVzQnlMb2MuZHVtcCgqU291cmNlTWdyKTsgfQorICBMTFZNX0RVTVBfTUVUSE9EIHZvaWQgZHVtcChTdHJpbmdSZWYgRGlhZ05hbWUpIGNvbnN0IHsKKyAgICBEaWFnU3RhdGVzQnlMb2MuZHVtcCgqU291cmNlTWdyLCBEaWFnTmFtZSk7CisgIH0KKworICBjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8RGlhZ25vc3RpY0lEcz4gJmdldERpYWdub3N0aWNJRHMoKSBjb25zdCB7CisgICAgcmV0dXJuIERpYWdzOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgZGlhZ25vc3RpYyBvcHRpb25zLgorICBEaWFnbm9zdGljT3B0aW9ucyAmZ2V0RGlhZ25vc3RpY09wdGlvbnMoKSBjb25zdCB7IHJldHVybiAqRGlhZ09wdHM7IH0KKworICB1c2luZyBkaWFnX21hcHBpbmdfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxEaWFnU3RhdGU6OmNvbnN0X2l0ZXJhdG9yPjsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgY3VycmVudCBzZXQgb2YgZGlhZ25vc3RpYyBtYXBwaW5ncy4KKyAgZGlhZ19tYXBwaW5nX3JhbmdlIGdldERpYWdub3N0aWNNYXBwaW5ncygpIGNvbnN0IHsKKyAgICBjb25zdCBEaWFnU3RhdGUgJkRTID0gKkdldEN1ckRpYWdTdGF0ZSgpOworICAgIHJldHVybiBkaWFnX21hcHBpbmdfcmFuZ2UoRFMuYmVnaW4oKSwgRFMuZW5kKCkpOworICB9CisKKyAgRGlhZ25vc3RpY0NvbnN1bWVyICpnZXRDbGllbnQoKSB7IHJldHVybiBDbGllbnQ7IH0KKyAgY29uc3QgRGlhZ25vc3RpY0NvbnN1bWVyICpnZXRDbGllbnQoKSBjb25zdCB7IHJldHVybiBDbGllbnQ7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgXGMgRGlhZ25vc3RpY3NFbmdpbmUgb2JqZWN0IG93biBpdHMgY2xpZW50LgorICBib29sIG93bnNDbGllbnQoKSBjb25zdCB7IHJldHVybiBPd25lciAhPSBudWxscHRyOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGN1cnJlbnQgZGlhZ25vc3RpYyBjbGllbnQgYWxvbmcgd2l0aCBvd25lcnNoaXAgb2YgdGhhdAorICAvLy8gY2xpZW50LgorICBzdGQ6OnVuaXF1ZV9wdHI8RGlhZ25vc3RpY0NvbnN1bWVyPiB0YWtlQ2xpZW50KCkgeyByZXR1cm4gc3RkOjptb3ZlKE93bmVyKTsgfQorCisgIGJvb2wgaGFzU291cmNlTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZU1nciAhPSBudWxscHRyOyB9CisKKyAgU291cmNlTWFuYWdlciAmZ2V0U291cmNlTWFuYWdlcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoU291cmNlTWdyICYmICJTb3VyY2VNYW5hZ2VyIG5vdCBzZXQhIik7CisgICAgcmV0dXJuICpTb3VyY2VNZ3I7CisgIH0KKworICB2b2lkIHNldFNvdXJjZU1hbmFnZXIoU291cmNlTWFuYWdlciAqU3JjTWdyKSB7CisgICAgYXNzZXJ0KERpYWdTdGF0ZXNCeUxvYy5lbXB0eSgpICYmCisgICAgICAgICAgICJMZWZ0b3ZlciBkaWFnIHN0YXRlIGZyb20gYSBkaWZmZXJlbnQgU291cmNlTWFuYWdlci4iKTsKKyAgICBTb3VyY2VNZ3IgPSBTcmNNZ3I7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gIERpYWdub3N0aWNzRW5naW5lIGNoYXJhY3Rlcml6YXRpb24gbWV0aG9kcywgdXNlZCBieSBhIGNsaWVudCB0byBjdXN0b21pemUKKyAgLy8gIGhvdyBkaWFnbm9zdGljcyBhcmUgZW1pdHRlZC4KKyAgLy8KKworICAvLy8gXGJyaWVmIENvcGllcyB0aGUgY3VycmVudCBEaWFnTWFwcGluZ3MgYW5kIHB1c2hlcyB0aGUgbmV3IGNvcHkKKyAgLy8vIG9udG8gdGhlIHRvcCBvZiB0aGUgc3RhY2suCisgIHZvaWQgcHVzaE1hcHBpbmdzKFNvdXJjZUxvY2F0aW9uIExvYyk7CisKKyAgLy8vIFxicmllZiBQb3BzIHRoZSBjdXJyZW50IERpYWdNYXBwaW5ncyBvZmYgdGhlIHRvcCBvZiB0aGUgc3RhY2ssCisgIC8vLyBjYXVzaW5nIHRoZSBuZXcgdG9wIG9mIHRoZSBzdGFjayB0byBiZSB0aGUgYWN0aXZlIG1hcHBpbmdzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFxjIHRydWUgaWYgdGhlIHBvcCBoYXBwZW5zLCBcYyBmYWxzZSBpZiB0aGVyZSBpcyBvbmx5IG9uZQorICAvLy8gRGlhZ01hcHBpbmcgb24gdGhlIHN0YWNrLgorICBib29sIHBvcE1hcHBpbmdzKFNvdXJjZUxvY2F0aW9uIExvYyk7CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGRpYWdub3N0aWMgY2xpZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRpYWdub3N0aWMgb2JqZWN0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBTaG91bGRPd25DbGllbnQgdHJ1ZSBpZiB0aGUgZGlhZ25vc3RpYyBvYmplY3Qgc2hvdWxkIHRha2UKKyAgLy8vIG93bmVyc2hpcCBvZiBcYyBjbGllbnQuCisgIHZvaWQgc2V0Q2xpZW50KERpYWdub3N0aWNDb25zdW1lciAqY2xpZW50LCBib29sIFNob3VsZE93bkNsaWVudCA9IHRydWUpOworCisgIC8vLyBcYnJpZWYgU3BlY2lmeSBhIGxpbWl0IGZvciB0aGUgbnVtYmVyIG9mIGVycm9ycyB3ZSBzaG91bGQKKyAgLy8vIGVtaXQgYmVmb3JlIGdpdmluZyB1cC4KKyAgLy8vCisgIC8vLyBaZXJvIGRpc2FibGVzIHRoZSBsaW1pdC4KKyAgdm9pZCBzZXRFcnJvckxpbWl0KHVuc2lnbmVkIExpbWl0KSB7IEVycm9yTGltaXQgPSBMaW1pdDsgfQorICAKKyAgLy8vIFxicmllZiBTcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgIC8vLyBub3RlcyB0byBlbWl0IGFsb25nIHdpdGggYSBnaXZlbiBkaWFnbm9zdGljLgorICB2b2lkIHNldFRlbXBsYXRlQmFja3RyYWNlTGltaXQodW5zaWduZWQgTGltaXQpIHsKKyAgICBUZW1wbGF0ZUJhY2t0cmFjZUxpbWl0ID0gTGltaXQ7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgIC8vLyBub3RlcyB0byBlbWl0IGFsb25nIHdpdGggYSBnaXZlbiBkaWFnbm9zdGljLgorICB1bnNpZ25lZCBnZXRUZW1wbGF0ZUJhY2t0cmFjZUxpbWl0KCkgY29uc3QgeworICAgIHJldHVybiBUZW1wbGF0ZUJhY2t0cmFjZUxpbWl0OworICB9CisKKyAgLy8vIFxicmllZiBTcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25zdGV4cHIgZXZhbHVhdGlvbgorICAvLy8gbm90ZXMgdG8gZW1pdCBhbG9uZyB3aXRoIGEgZ2l2ZW4gZGlhZ25vc3RpYy4KKyAgdm9pZCBzZXRDb25zdGV4cHJCYWNrdHJhY2VMaW1pdCh1bnNpZ25lZCBMaW1pdCkgeworICAgIENvbnN0ZXhwckJhY2t0cmFjZUxpbWl0ID0gTGltaXQ7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25zdGV4cHIgZXZhbHVhdGlvbgorICAvLy8gbm90ZXMgdG8gZW1pdCBhbG9uZyB3aXRoIGEgZ2l2ZW4gZGlhZ25vc3RpYy4KKyAgdW5zaWduZWQgZ2V0Q29uc3RleHByQmFja3RyYWNlTGltaXQoKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0ZXhwckJhY2t0cmFjZUxpbWl0OworICB9CisKKyAgLy8vIFxicmllZiBXaGVuIHNldCB0byB0cnVlLCBhbnkgdW5tYXBwZWQgd2FybmluZ3MgYXJlIGlnbm9yZWQuCisgIC8vLworICAvLy8gSWYgdGhpcyBhbmQgV2FybmluZ3NBc0Vycm9ycyBhcmUgYm90aCBzZXQsIHRoZW4gdGhpcyBvbmUgd2lucy4KKyAgdm9pZCBzZXRJZ25vcmVBbGxXYXJuaW5ncyhib29sIFZhbCkgeworICAgIEdldEN1ckRpYWdTdGF0ZSgpLT5JZ25vcmVBbGxXYXJuaW5ncyA9IFZhbDsKKyAgfQorICBib29sIGdldElnbm9yZUFsbFdhcm5pbmdzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRDdXJEaWFnU3RhdGUoKS0+SWdub3JlQWxsV2FybmluZ3M7CisgIH0KKworICAvLy8gXGJyaWVmIFdoZW4gc2V0IHRvIHRydWUsIGFueSB1bm1hcHBlZCBpZ25vcmVkIHdhcm5pbmdzIGFyZSBubyBsb25nZXIKKyAgLy8vIGlnbm9yZWQuCisgIC8vLworICAvLy8gSWYgdGhpcyBhbmQgSWdub3JlQWxsV2FybmluZ3MgYXJlIGJvdGggc2V0LCB0aGVuIHRoYXQgb25lIHdpbnMuCisgIHZvaWQgc2V0RW5hYmxlQWxsV2FybmluZ3MoYm9vbCBWYWwpIHsKKyAgICBHZXRDdXJEaWFnU3RhdGUoKS0+RW5hYmxlQWxsV2FybmluZ3MgPSBWYWw7CisgIH0KKyAgYm9vbCBnZXRFbmFibGVBbGxXYXJuaW5ncygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0Q3VyRGlhZ1N0YXRlKCktPkVuYWJsZUFsbFdhcm5pbmdzOworICB9CisKKyAgLy8vIFxicmllZiBXaGVuIHNldCB0byB0cnVlLCBhbnkgd2FybmluZ3MgcmVwb3J0ZWQgYXJlIGlzc3VlZCBhcyBlcnJvcnMuCisgIHZvaWQgc2V0V2FybmluZ3NBc0Vycm9ycyhib29sIFZhbCkgeworICAgIEdldEN1ckRpYWdTdGF0ZSgpLT5XYXJuaW5nc0FzRXJyb3JzID0gVmFsOworICB9CisgIGJvb2wgZ2V0V2FybmluZ3NBc0Vycm9ycygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0Q3VyRGlhZ1N0YXRlKCktPldhcm5pbmdzQXNFcnJvcnM7CisgIH0KKworICAvLy8gXGJyaWVmIFdoZW4gc2V0IHRvIHRydWUsIGFueSBlcnJvciByZXBvcnRlZCBpcyBtYWRlIGEgZmF0YWwgZXJyb3IuCisgIHZvaWQgc2V0RXJyb3JzQXNGYXRhbChib29sIFZhbCkgeyBHZXRDdXJEaWFnU3RhdGUoKS0+RXJyb3JzQXNGYXRhbCA9IFZhbDsgfQorICBib29sIGdldEVycm9yc0FzRmF0YWwoKSBjb25zdCB7IHJldHVybiBHZXRDdXJEaWFnU3RhdGUoKS0+RXJyb3JzQXNGYXRhbDsgfQorCisgIC8vLyBcYnJpZWYgV2hlbiBzZXQgdG8gdHJ1ZSAodGhlIGRlZmF1bHQpLCBzdXBwcmVzcyBmdXJ0aGVyIGRpYWdub3N0aWNzIGFmdGVyCisgIC8vLyBhIGZhdGFsIGVycm9yLgorICB2b2lkIHNldFN1cHByZXNzQWZ0ZXJGYXRhbEVycm9yKGJvb2wgVmFsKSB7IFN1cHByZXNzQWZ0ZXJGYXRhbEVycm9yID0gVmFsOyB9CisKKyAgLy8vIFxicmllZiBXaGVuIHNldCB0byB0cnVlIG1hc2sgd2FybmluZ3MgdGhhdCBjb21lIGZyb20gc3lzdGVtIGhlYWRlcnMuCisgIHZvaWQgc2V0U3VwcHJlc3NTeXN0ZW1XYXJuaW5ncyhib29sIFZhbCkgeworICAgIEdldEN1ckRpYWdTdGF0ZSgpLT5TdXBwcmVzc1N5c3RlbVdhcm5pbmdzID0gVmFsOworICB9CisgIGJvb2wgZ2V0U3VwcHJlc3NTeXN0ZW1XYXJuaW5ncygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0Q3VyRGlhZ1N0YXRlKCktPlN1cHByZXNzU3lzdGVtV2FybmluZ3M7CisgIH0KKworICAvLy8gXGJyaWVmIFN1cHByZXNzIGFsbCBkaWFnbm9zdGljcywgdG8gc2lsZW5jZSB0aGUgZnJvbnQgZW5kIHdoZW4gd2UgCisgIC8vLyBrbm93IHRoYXQgd2UgZG9uJ3Qgd2FudCBhbnkgbW9yZSBkaWFnbm9zdGljcyB0byBiZSBwYXNzZWQgYWxvbmcgdG8gdGhlCisgIC8vLyBjbGllbnQKKyAgdm9pZCBzZXRTdXBwcmVzc0FsbERpYWdub3N0aWNzKGJvb2wgVmFsID0gdHJ1ZSkgeyAKKyAgICBTdXBwcmVzc0FsbERpYWdub3N0aWNzID0gVmFsOyAKKyAgfQorICBib29sIGdldFN1cHByZXNzQWxsRGlhZ25vc3RpY3MoKSBjb25zdCB7IHJldHVybiBTdXBwcmVzc0FsbERpYWdub3N0aWNzOyB9CisKKyAgLy8vIFxicmllZiBTZXQgdHlwZSBlbGlkaW5nLCB0byBza2lwIG91dHB1dHRpbmcgc2FtZSB0eXBlcyBvY2N1cnJpbmcgaW4KKyAgLy8vIHRlbXBsYXRlIHR5cGVzLgorICB2b2lkIHNldEVsaWRlVHlwZShib29sIFZhbCA9IHRydWUpIHsgRWxpZGVUeXBlID0gVmFsOyB9CisgIGJvb2wgZ2V0RWxpZGVUeXBlKCkgeyByZXR1cm4gRWxpZGVUeXBlOyB9CisgCisgIC8vLyBcYnJpZWYgU2V0IHRyZWUgcHJpbnRpbmcsIHRvIG91dHB1dHRpbmcgdGhlIHRlbXBsYXRlIGRpZmZlcmVuY2UgaW4gYQorICAvLy8gdHJlZSBmb3JtYXQuCisgIHZvaWQgc2V0UHJpbnRUZW1wbGF0ZVRyZWUoYm9vbCBWYWwgPSBmYWxzZSkgeyBQcmludFRlbXBsYXRlVHJlZSA9IFZhbDsgfQorICBib29sIGdldFByaW50VGVtcGxhdGVUcmVlKCkgeyByZXR1cm4gUHJpbnRUZW1wbGF0ZVRyZWU7IH0KKyAKKyAgLy8vIFxicmllZiBTZXQgY29sb3IgcHJpbnRpbmcsIHNvIHRoZSB0eXBlIGRpZmZpbmcgd2lsbCBpbmplY3QgY29sb3IgbWFya2VycworICAvLy8gaW50byB0aGUgb3V0cHV0LgorICB2b2lkIHNldFNob3dDb2xvcnMoYm9vbCBWYWwgPSBmYWxzZSkgeyBTaG93Q29sb3JzID0gVmFsOyB9CisgIGJvb2wgZ2V0U2hvd0NvbG9ycygpIHsgcmV0dXJuIFNob3dDb2xvcnM7IH0KKworICAvLy8gXGJyaWVmIFNwZWNpZnkgd2hpY2ggb3ZlcmxvYWQgY2FuZGlkYXRlcyB0byBzaG93IHdoZW4gb3ZlcmxvYWQgcmVzb2x1dGlvbgorICAvLy8gZmFpbHMuCisgIC8vLworICAvLy8gQnkgZGVmYXVsdCwgd2Ugc2hvdyBhbGwgY2FuZGlkYXRlcy4KKyAgdm9pZCBzZXRTaG93T3ZlcmxvYWRzKE92ZXJsb2Fkc1Nob3duIFZhbCkgeworICAgIFNob3dPdmVybG9hZHMgPSBWYWw7CisgIH0KKyAgT3ZlcmxvYWRzU2hvd24gZ2V0U2hvd092ZXJsb2FkcygpIGNvbnN0IHsgcmV0dXJuIFNob3dPdmVybG9hZHM7IH0KKyAgCisgIC8vLyBcYnJpZWYgUHJldGVuZCB0aGF0IHRoZSBsYXN0IGRpYWdub3N0aWMgaXNzdWVkIHdhcyBpZ25vcmVkLCBzbyBhbnkKKyAgLy8vIHN1YnNlcXVlbnQgbm90ZXMgd2lsbCBiZSBzdXBwcmVzc2VkLCBvciByZXN0b3JlIGEgcHJpb3IgaWdub3JpbmcKKyAgLy8vIHN0YXRlIGFmdGVyIGlnbm9yaW5nIHNvbWUgZGlhZ25vc3RpY3MgYW5kIHRoZWlyIG5vdGVzLCBwb3NzaWJseSBpbgorICAvLy8gdGhlIG1pZGRsZSBvZiBhbm90aGVyIGRpYWdub3N0aWMuCisgIC8vLworICAvLy8gVGhpcyBjYW4gYmUgdXNlZCBieSBjbGllbnRzIHdobyBzdXBwcmVzcyBkaWFnbm9zdGljcyB0aGVtc2VsdmVzLgorICB2b2lkIHNldExhc3REaWFnbm9zdGljSWdub3JlZChib29sIElnbm9yZWQgPSB0cnVlKSB7CisgICAgaWYgKExhc3REaWFnTGV2ZWwgPT0gRGlhZ25vc3RpY0lEczo6RmF0YWwpCisgICAgICBGYXRhbEVycm9yT2NjdXJyZWQgPSB0cnVlOworICAgIExhc3REaWFnTGV2ZWwgPSBJZ25vcmVkID8gRGlhZ25vc3RpY0lEczo6SWdub3JlZCA6IERpYWdub3N0aWNJRHM6Oldhcm5pbmc7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBwcmV2aW91cyBkaWFnbm9zdGljIHdhcyBpZ25vcmVkLiBUaGlzIGNhbgorICAvLy8gYmUgdXNlZCBieSBjbGllbnRzIHRoYXQgd2FudCB0byBkZXRlcm1pbmUgd2hldGhlciBub3RlcyBhdHRhY2hlZCB0byBhCisgIC8vLyBkaWFnbm9zdGljIHdpbGwgYmUgc3VwcHJlc3NlZC4KKyAgYm9vbCBpc0xhc3REaWFnbm9zdGljSWdub3JlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTGFzdERpYWdMZXZlbCA9PSBEaWFnbm9zdGljSURzOjpJZ25vcmVkOworICB9CisKKyAgLy8vIFxicmllZiBDb250cm9scyB3aGV0aGVyIG90aGVyd2lzZS11bm1hcHBlZCBleHRlbnNpb24gZGlhZ25vc3RpY3MgYXJlCisgIC8vLyBtYXBwZWQgb250byBpZ25vcmUvd2FybmluZy9lcnJvci4KKyAgLy8vCisgIC8vLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBHQ0MgLXBlZGFudGljIGFuZCAtcGVkYW50aWMtZXJyb3JzIG9wdGlvbi4KKyAgdm9pZCBzZXRFeHRlbnNpb25IYW5kbGluZ0JlaGF2aW9yKGRpYWc6OlNldmVyaXR5IEgpIHsKKyAgICBHZXRDdXJEaWFnU3RhdGUoKS0+RXh0QmVoYXZpb3IgPSBIOworICB9CisgIGRpYWc6OlNldmVyaXR5IGdldEV4dGVuc2lvbkhhbmRsaW5nQmVoYXZpb3IoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEN1ckRpYWdTdGF0ZSgpLT5FeHRCZWhhdmlvcjsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ291bnRlciBidW1wZWQgd2hlbiBhbiBfX2V4dGVuc2lvbl9fICBibG9jayBpcy8gZW5jb3VudGVyZWQuCisgIC8vLworICAvLy8gV2hlbiBub24temVybywgYWxsIGV4dGVuc2lvbiBkaWFnbm9zdGljcyBhcmUgZW50aXJlbHkgc2lsZW5jZWQsIG5vCisgIC8vLyBtYXR0ZXIgaG93IHRoZXkgYXJlIG1hcHBlZC4KKyAgdm9pZCBJbmNyZW1lbnRBbGxFeHRlbnNpb25zU2lsZW5jZWQoKSB7ICsrQWxsRXh0ZW5zaW9uc1NpbGVuY2VkOyB9CisgIHZvaWQgRGVjcmVtZW50QWxsRXh0ZW5zaW9uc1NpbGVuY2VkKCkgeyAtLUFsbEV4dGVuc2lvbnNTaWxlbmNlZDsgfQorICBib29sIGhhc0FsbEV4dGVuc2lvbnNTaWxlbmNlZCgpIHsgcmV0dXJuIEFsbEV4dGVuc2lvbnNTaWxlbmNlZCAhPSAwOyB9CisKKyAgLy8vIFxicmllZiBUaGlzIGFsbG93cyB0aGUgY2xpZW50IHRvIHNwZWNpZnkgdGhhdCBjZXJ0YWluIHdhcm5pbmdzIGFyZQorICAvLy8gaWdub3JlZC4KKyAgLy8vCisgIC8vLyBOb3RlcyBjYW4gbmV2ZXIgYmUgbWFwcGVkLCBlcnJvcnMgY2FuIG9ubHkgYmUgbWFwcGVkIHRvIGZhdGFsLCBhbmQKKyAgLy8vIFdBUk5JTkdzIGFuZCBFWFRFTlNJT05zIGNhbiBiZSBtYXBwZWQgYXJiaXRyYXJpbHkuCisgIC8vLworICAvLy8gXHBhcmFtIExvYyBUaGUgc291cmNlIGxvY2F0aW9uIHRoYXQgdGhpcyBjaGFuZ2Ugb2YgZGlhZ25vc3RpYyBzdGF0ZSBzaG91bGQKKyAgLy8vIHRha2UgYWZmZWN0LiBJdCBjYW4gYmUgbnVsbCBpZiB3ZSBhcmUgc2V0dGluZyB0aGUgbGF0ZXN0IHN0YXRlLgorICB2b2lkIHNldFNldmVyaXR5KGRpYWc6OmtpbmQgRGlhZywgZGlhZzo6U2V2ZXJpdHkgTWFwLCBTb3VyY2VMb2NhdGlvbiBMb2MpOworCisgIC8vLyBcYnJpZWYgQ2hhbmdlIGFuIGVudGlyZSBkaWFnbm9zdGljIGdyb3VwIChlLmcuICJ1bmtub3duLXByYWdtYXMiKSB0bworICAvLy8gaGF2ZSB0aGUgc3BlY2lmaWVkIG1hcHBpbmcuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSAoYW5kIGlnbm9yZXMgdGhlIHJlcXVlc3QpIGlmICJHcm91cCIgd2FzIHVua25vd24sIGZhbHNlCisgIC8vLyBvdGhlcndpc2UuCisgIC8vLworICAvLy8gXHBhcmFtIEZsYXZvciBUaGUgZmxhdm9yIG9mIGdyb3VwIHRvIGFmZmVjdC4gLVJmb28gZG9lcyBub3QgYWZmZWN0IHRoZQorICAvLy8gc3RhdGUgb2YgdGhlIC1XZm9vIGdyb3VwIGFuZCB2aWNlIHZlcnNhLgorICAvLy8KKyAgLy8vIFxwYXJhbSBMb2MgVGhlIHNvdXJjZSBsb2NhdGlvbiB0aGF0IHRoaXMgY2hhbmdlIG9mIGRpYWdub3N0aWMgc3RhdGUgc2hvdWxkCisgIC8vLyB0YWtlIGFmZmVjdC4gSXQgY2FuIGJlIG51bGwgaWYgd2UgYXJlIHNldHRpbmcgdGhlIHN0YXRlIGZyb20gY29tbWFuZC1saW5lLgorICBib29sIHNldFNldmVyaXR5Rm9yR3JvdXAoZGlhZzo6Rmxhdm9yIEZsYXZvciwgU3RyaW5nUmVmIEdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZzo6U2V2ZXJpdHkgTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jID0gU291cmNlTG9jYXRpb24oKSk7CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIHdhcm5pbmctYXMtZXJyb3IgZmxhZyBmb3IgdGhlIGdpdmVuIGRpYWdub3N0aWMgZ3JvdXAuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBhbHdheXMgb25seSBvcGVyYXRlcyBvbiB0aGUgY3VycmVudCBkaWFnbm9zdGljIHN0YXRlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRydWUgaWYgdGhlIGdpdmVuIGdyb3VwIGlzIHVua25vd24sIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBzZXREaWFnbm9zdGljR3JvdXBXYXJuaW5nQXNFcnJvcihTdHJpbmdSZWYgR3JvdXAsIGJvb2wgRW5hYmxlZCk7CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGVycm9yLWFzLWZhdGFsIGZsYWcgZm9yIHRoZSBnaXZlbiBkaWFnbm9zdGljIGdyb3VwLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gYWx3YXlzIG9ubHkgb3BlcmF0ZXMgb24gdGhlIGN1cnJlbnQgZGlhZ25vc3RpYyBzdGF0ZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBUcnVlIGlmIHRoZSBnaXZlbiBncm91cCBpcyB1bmtub3duLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgc2V0RGlhZ25vc3RpY0dyb3VwRXJyb3JBc0ZhdGFsKFN0cmluZ1JlZiBHcm91cCwgYm9vbCBFbmFibGVkKTsKKworICAvLy8gXGJyaWVmIEFkZCB0aGUgc3BlY2lmaWVkIG1hcHBpbmcgdG8gYWxsIGRpYWdub3N0aWNzIG9mIHRoZSBzcGVjaWZpZWQKKyAgLy8vIGZsYXZvci4KKyAgLy8vCisgIC8vLyBNYWlubHkgdG8gYmUgdXNlZCBieSAtV25vLWV2ZXJ5dGhpbmcgdG8gZGlzYWJsZSBhbGwgd2FybmluZ3MgYnV0IGFsbG93CisgIC8vLyBzdWJzZXF1ZW50IC1XIG9wdGlvbnMgdG8gZW5hYmxlIHNwZWNpZmljIHdhcm5pbmdzLgorICB2b2lkIHNldFNldmVyaXR5Rm9yQWxsKGRpYWc6OkZsYXZvciBGbGF2b3IsIGRpYWc6OlNldmVyaXR5IE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MgPSBTb3VyY2VMb2NhdGlvbigpKTsKKworICBib29sIGhhc0Vycm9yT2NjdXJyZWQoKSBjb25zdCB7IHJldHVybiBFcnJvck9jY3VycmVkOyB9CisKKyAgLy8vIFxicmllZiBFcnJvcnMgdGhhdCBhY3R1YWxseSBwcmV2ZW50IGNvbXBpbGF0aW9uLCBub3QgdGhvc2UgdGhhdCBhcmUKKyAgLy8vIHVwZ3JhZGVkIGZyb20gYSB3YXJuaW5nIGJ5IC1XZXJyb3IuCisgIGJvb2wgaGFzVW5jb21waWxhYmxlRXJyb3JPY2N1cnJlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVW5jb21waWxhYmxlRXJyb3JPY2N1cnJlZDsKKyAgfQorICBib29sIGhhc0ZhdGFsRXJyb3JPY2N1cnJlZCgpIGNvbnN0IHsgcmV0dXJuIEZhdGFsRXJyb3JPY2N1cnJlZDsgfQorICAKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciBhbnkga2luZCBvZiB1bnJlY292ZXJhYmxlIGVycm9yIGhhcyBvY2N1cnJlZC4KKyAgYm9vbCBoYXNVbnJlY292ZXJhYmxlRXJyb3JPY2N1cnJlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRmF0YWxFcnJvck9jY3VycmVkIHx8IFVucmVjb3ZlcmFibGVFcnJvck9jY3VycmVkOworICB9CisgIAorICB1bnNpZ25lZCBnZXROdW1XYXJuaW5ncygpIGNvbnN0IHsgcmV0dXJuIE51bVdhcm5pbmdzOyB9CisKKyAgdm9pZCBzZXROdW1XYXJuaW5ncyh1bnNpZ25lZCBOdW1XYXJuaW5ncykgeworICAgIHRoaXMtPk51bVdhcm5pbmdzID0gTnVtV2FybmluZ3M7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhbiBJRCBmb3IgYSBkaWFnbm9zdGljIHdpdGggdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nIGFuZAorICAvLy8gbGV2ZWwuCisgIC8vLworICAvLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgcmVxdWVzdCBmb3IgdGhpcyBkaWFnbm9zdGljLCBpdCBpcyByZWdpc3RlcmVkIGFuZAorICAvLy8gY3JlYXRlZCwgb3RoZXJ3aXNlIHRoZSBleGlzdGluZyBJRCBpcyByZXR1cm5lZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRm9ybWF0U3RyaW5nIEEgZml4ZWQgZGlhZ25vc3RpYyBmb3JtYXQgc3RyaW5nIHRoYXQgd2lsbCBiZSBoYXNoZWQKKyAgLy8vIGFuZCBtYXBwZWQgdG8gYSB1bmlxdWUgRGlhZ0lELgorICB0ZW1wbGF0ZSA8dW5zaWduZWQgTj4KKyAgdW5zaWduZWQgZ2V0Q3VzdG9tRGlhZ0lEKExldmVsIEwsIGNvbnN0IGNoYXIgKCZGb3JtYXRTdHJpbmcpW05dKSB7CisgICAgcmV0dXJuIERpYWdzLT5nZXRDdXN0b21EaWFnSUQoKERpYWdub3N0aWNJRHM6OkxldmVsKUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmKEZvcm1hdFN0cmluZywgTiAtIDEpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29udmVydHMgYSBkaWFnbm9zdGljIGFyZ3VtZW50IChhcyBhbiBpbnRwdHJfdCkgaW50byB0aGUgc3RyaW5nCisgIC8vLyB0aGF0IHJlcHJlc2VudHMgaXQuCisgIHZvaWQgQ29udmVydEFyZ1RvU3RyaW5nKEFyZ3VtZW50S2luZCBLaW5kLCBpbnRwdHJfdCBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNb2RpZmllciwgU3RyaW5nUmVmIEFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxBcmd1bWVudFZhbHVlPiBQcmV2QXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGludHB0cl90PiBRdWFsVHlwZVZhbHMpIGNvbnN0IHsKKyAgICBBcmdUb1N0cmluZ0ZuKEtpbmQsIFZhbCwgTW9kaWZpZXIsIEFyZ3VtZW50LCBQcmV2QXJncywgT3V0cHV0LAorICAgICAgICAgICAgICAgICAgQXJnVG9TdHJpbmdDb29raWUsIFF1YWxUeXBlVmFscyk7CisgIH0KKworICB2b2lkIFNldEFyZ1RvU3RyaW5nRm4oQXJnVG9TdHJpbmdGblR5IEZuLCB2b2lkICpDb29raWUpIHsKKyAgICBBcmdUb1N0cmluZ0ZuID0gRm47CisgICAgQXJnVG9TdHJpbmdDb29raWUgPSBDb29raWU7CisgIH0KKworICAvLy8gXGJyaWVmIE5vdGUgdGhhdCB0aGUgcHJpb3IgZGlhZ25vc3RpYyB3YXMgZW1pdHRlZCBieSBzb21lIG90aGVyCisgIC8vLyBcYyBEaWFnbm9zdGljc0VuZ2luZSwgYW5kIHdlIG1heSBiZSBhdHRhY2hpbmcgYSBub3RlIHRvIHRoYXQgZGlhZ25vc3RpYy4KKyAgdm9pZCBub3RlUHJpb3JEaWFnbm9zdGljRnJvbShjb25zdCBEaWFnbm9zdGljc0VuZ2luZSAmT3RoZXIpIHsKKyAgICBMYXN0RGlhZ0xldmVsID0gT3RoZXIuTGFzdERpYWdMZXZlbDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBkaWFnbm9zdGljIG9iamVjdCB0byBpdHMgaW5pdGlhbCAKKyAgLy8vIGNvbmZpZ3VyYXRpb24uCisgIHZvaWQgUmVzZXQoKTsKKyAgCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBEaWFnbm9zdGljc0VuZ2luZSBjbGFzc2lmaWNhdGlvbiBhbmQgcmVwb3J0aW5nIGludGVyZmFjZXMuCisgIC8vCisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGlhZ25vc3RpYyBpcyBrbm93biB0byBiZSBpZ25vcmVkLgorICAvLy8KKyAgLy8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gb3Bwb3J0dW5pc3RpY2FsbHkgYXZvaWQgZXhwZW5zaXZlIGNoZWNrcyB3aGVuIGl0J3MKKyAgLy8vIGtub3duIGZvciBjZXJ0YWluIHRoYXQgdGhlIGRpYWdub3N0aWMgaGFzIGJlZW4gc3VwcHJlc3NlZCBhdCB0aGUKKyAgLy8vIHNwZWNpZmllZCBsb2NhdGlvbiBccCBMb2MuCisgIC8vLworICAvLy8gXHBhcmFtIExvYyBUaGUgc291cmNlIGxvY2F0aW9uIHdlIGFyZSBpbnRlcmVzdGVkIGluIGZpbmRpbmcgb3V0IHRoZQorICAvLy8gZGlhZ25vc3RpYyBzdGF0ZS4gQ2FuIGJlIG51bGwgaW4gb3JkZXIgdG8gcXVlcnkgdGhlIGxhdGVzdCBzdGF0ZS4KKyAgYm9vbCBpc0lnbm9yZWQodW5zaWduZWQgRGlhZ0lELCBTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0IHsKKyAgICByZXR1cm4gRGlhZ3MtPmdldERpYWdub3N0aWNTZXZlcml0eShEaWFnSUQsIExvYywgKnRoaXMpID09CisgICAgICAgICAgIGRpYWc6OlNldmVyaXR5OjpJZ25vcmVkOworICB9CisKKyAgLy8vIFxicmllZiBCYXNlZCBvbiB0aGUgd2F5IHRoZSBjbGllbnQgY29uZmlndXJlZCB0aGUgRGlhZ25vc3RpY3NFbmdpbmUKKyAgLy8vIG9iamVjdCwgY2xhc3NpZnkgdGhlIHNwZWNpZmllZCBkaWFnbm9zdGljIElEIGludG8gYSBMZXZlbCwgY29uc3VtYWJsZSBieQorICAvLy8gdGhlIERpYWdub3N0aWNDb25zdW1lci4KKyAgLy8vCisgIC8vLyBUbyBwcmVzZXJ2ZSBpbnZhcmlhbnQgYXNzdW1wdGlvbnMsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSB1c2VkIHRvCisgIC8vLyBpbmZsdWVuY2UgcGFyc2Ugb3Igc2VtYW50aWMgYW5hbHlzaXMgYWN0aW9ucy4gSW5zdGVhZCBjb25zaWRlciB1c2luZworICAvLy8gXGMgaXNJZ25vcmVkKCkuCisgIC8vLworICAvLy8gXHBhcmFtIExvYyBUaGUgc291cmNlIGxvY2F0aW9uIHdlIGFyZSBpbnRlcmVzdGVkIGluIGZpbmRpbmcgb3V0IHRoZQorICAvLy8gZGlhZ25vc3RpYyBzdGF0ZS4gQ2FuIGJlIG51bGwgaW4gb3JkZXIgdG8gcXVlcnkgdGhlIGxhdGVzdCBzdGF0ZS4KKyAgTGV2ZWwgZ2V0RGlhZ25vc3RpY0xldmVsKHVuc2lnbmVkIERpYWdJRCwgU291cmNlTG9jYXRpb24gTG9jKSBjb25zdCB7CisgICAgcmV0dXJuIChMZXZlbClEaWFncy0+Z2V0RGlhZ25vc3RpY0xldmVsKERpYWdJRCwgTG9jLCAqdGhpcyk7CisgIH0KKworICAvLy8gXGJyaWVmIElzc3VlIHRoZSBtZXNzYWdlIHRvIHRoZSBjbGllbnQuCisgIC8vLworICAvLy8gVGhpcyBhY3R1YWxseSByZXR1cm5zIGFuIGluc3RhbmNlIG9mIERpYWdub3N0aWNCdWlsZGVyIHdoaWNoIGVtaXRzIHRoZQorICAvLy8gZGlhZ25vc3RpY3MgKHRocm91Z2ggQGMgUHJvY2Vzc0RpYWcpIHdoZW4gaXQgaXMgZGVzdHJveWVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBEaWFnSUQgQSBtZW1iZXIgb2YgdGhlIEBjIGRpYWc6OmtpbmQgZW51bS4KKyAgLy8vIFxwYXJhbSBMb2MgUmVwcmVzZW50cyB0aGUgc291cmNlIGxvY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlhZ25vc3RpYywKKyAgLy8vIHdoaWNoIGNhbiBiZSBhbiBpbnZhbGlkIGxvY2F0aW9uIGlmIG5vIHBvc2l0aW9uIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KKyAgaW5saW5lIERpYWdub3N0aWNCdWlsZGVyIFJlcG9ydChTb3VyY2VMb2NhdGlvbiBMb2MsIHVuc2lnbmVkIERpYWdJRCk7CisgIGlubGluZSBEaWFnbm9zdGljQnVpbGRlciBSZXBvcnQodW5zaWduZWQgRGlhZ0lEKTsKKworICB2b2lkIFJlcG9ydChjb25zdCBTdG9yZWREaWFnbm9zdGljICZzdG9yZWREaWFnKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyZSB0aGVyZSBpcyBhbHJlYWR5IGEgZGlhZ25vc3RpYyBpbiBmbGlnaHQuCisgIGJvb2wgaXNEaWFnbm9zdGljSW5GbGlnaHQoKSBjb25zdCB7CisgICAgcmV0dXJuIEN1ckRpYWdJRCAhPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgImRlbGF5ZWQiIGRpYWdub3N0aWMgdGhhdCB3aWxsIGJlIGVtaXR0ZWQgb25jZQorICAvLy8gdGhlIGN1cnJlbnQgZGlhZ25vc3RpYyBjb21wbGV0ZXMuCisgIC8vLworICAvLy8gIElmIGEgZGlhZ25vc3RpYyBpcyBhbHJlYWR5IGluLWZsaWdodCBidXQgdGhlIGZyb250IGVuZCBtdXN0CisgIC8vLyAgcmVwb3J0IGEgcHJvYmxlbSAoZS5nLiwgd2l0aCBhbiBpbmNvbnNpc3RlbnQgZmlsZSBzeXN0ZW0KKyAgLy8vICBzdGF0ZSksIHRoaXMgcm91dGluZSBzZXRzIGEgImRlbGF5ZWQiIGRpYWdub3N0aWMgdGhhdCB3aWxsIGJlCisgIC8vLyAgZW1pdHRlZCBhZnRlciB0aGUgY3VycmVudCBkaWFnbm9zdGljIGNvbXBsZXRlcy4gVGhpcyBzaG91bGQKKyAgLy8vICBvbmx5IGJlIHVzZWQgZm9yIGZhdGFsIGVycm9ycyBkZXRlY3RlZCBhdCBpbmNvbnZlbmllbnQKKyAgLy8vICB0aW1lcy4gSWYgZW1pdHRpbmcgYSBkZWxheWVkIGRpYWdub3N0aWMgY2F1c2VzIGEgc2Vjb25kIGRlbGF5ZWQKKyAgLy8vICBkaWFnbm9zdGljIHRvIGJlIGludHJvZHVjZWQsIHRoYXQgc2Vjb25kIGRlbGF5ZWQgZGlhZ25vc3RpYworICAvLy8gIHdpbGwgYmUgaWdub3JlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRGlhZ0lEIFRoZSBJRCBvZiB0aGUgZGlhZ25vc3RpYyBiZWluZyBkZWxheWVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBBcmcxIEEgc3RyaW5nIGFyZ3VtZW50IHRoYXQgd2lsbCBiZSBwcm92aWRlZCB0byB0aGUKKyAgLy8vIGRpYWdub3N0aWMuIEEgY29weSBvZiB0aGlzIHN0cmluZyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUKKyAgLy8vIERpYWdub3N0aWNzRW5naW5lIG9iamVjdCBpdHNlbGYuCisgIC8vLworICAvLy8gXHBhcmFtIEFyZzIgQSBzdHJpbmcgYXJndW1lbnQgdGhhdCB3aWxsIGJlIHByb3ZpZGVkIHRvIHRoZQorICAvLy8gZGlhZ25vc3RpYy4gQSBjb3B5IG9mIHRoaXMgc3RyaW5nIHdpbGwgYmUgc3RvcmVkIGluIHRoZQorICAvLy8gRGlhZ25vc3RpY3NFbmdpbmUgb2JqZWN0IGl0c2VsZi4KKyAgdm9pZCBTZXREZWxheWVkRGlhZ25vc3RpYyh1bnNpZ25lZCBEaWFnSUQsIFN0cmluZ1JlZiBBcmcxID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEFyZzIgPSAiIik7CisgIAorICAvLy8gXGJyaWVmIENsZWFyIG91dCB0aGUgY3VycmVudCBkaWFnbm9zdGljLgorICB2b2lkIENsZWFyKCkgeyBDdXJEaWFnSUQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGlhZ25vc3RpYyBmbGFnLgorICBTdHJpbmdSZWYgZ2V0RmxhZ1ZhbHVlKCkgY29uc3QgeyByZXR1cm4gRmxhZ1ZhbHVlOyB9CisKK3ByaXZhdGU6CisgIC8vIFRoaXMgaXMgcHJpdmF0ZSBzdGF0ZSB1c2VkIGJ5IERpYWdub3N0aWNCdWlsZGVyLiAgV2UgcHV0IGl0IGhlcmUgaW5zdGVhZCBvZgorICAvLyBpbiBEaWFnbm9zdGljQnVpbGRlciBpbiBvcmRlciB0byBrZWVwIERpYWdub3N0aWNCdWlsZGVyIGEgc21hbGwgbGlnaHR3ZWlnaHQKKyAgLy8gb2JqZWN0LiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBjaG9pY2UgbWVhbnMgdGhhdCB3ZSBjYW4gb25seSBoYXZlIG9uZQorICAvLyBkaWFnbm9zdGljICJpbiBmbGlnaHQiIGF0IGEgdGltZSwgYnV0IHRoaXMgc2VlbXMgdG8gYmUgYSByZWFzb25hYmxlCisgIC8vIHRyYWRlb2ZmIHRvIGtlZXAgdGhlc2Ugb2JqZWN0cyBzbWFsbC4gIEFzc2VydGlvbnMgdmVyaWZ5IHRoYXQgb25seSBvbmUKKyAgLy8gZGlhZ25vc3RpYyBpcyBpbiBmbGlnaHQgYXQgYSB0aW1lLgorICBmcmllbmQgY2xhc3MgRGlhZ25vc3RpYzsKKyAgZnJpZW5kIGNsYXNzIERpYWdub3N0aWNCdWlsZGVyOworICBmcmllbmQgY2xhc3MgRGlhZ25vc3RpY0Vycm9yVHJhcDsKKyAgZnJpZW5kIGNsYXNzIERpYWdub3N0aWNJRHM7CisgIGZyaWVuZCBjbGFzcyBQYXJ0aWFsRGlhZ25vc3RpYzsKKyAgCisgIC8vLyBcYnJpZWYgUmVwb3J0IHRoZSBkZWxheWVkIGRpYWdub3N0aWMuCisgIHZvaWQgUmVwb3J0RGVsYXllZCgpOworCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IGRpYWdub3N0aWMgdGhhdCBpcyBpbiBmbGlnaHQuCisgIFNvdXJjZUxvY2F0aW9uIEN1ckRpYWdMb2M7CisKKyAgLy8vIFxicmllZiBUaGUgSUQgb2YgdGhlIGN1cnJlbnQgZGlhZ25vc3RpYyB0aGF0IGlzIGluIGZsaWdodC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHNldCB0byBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkgd2hlbiB0aGVyZSBpcyBubworICAvLy8gZGlhZ25vc3RpYyBpbiBmbGlnaHQuCisgIHVuc2lnbmVkIEN1ckRpYWdJRDsKKworICBlbnVtIHsKKyAgICAvLy8gXGJyaWVmIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhcmd1bWVudHMgd2UgY2FuIGhvbGQuCisgICAgLy8vCisgICAgLy8vIFdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdXAgdG8gMTAgYXJndW1lbnRzICglMC0lOSkuICBBIHNpbmdsZQorICAgIC8vLyBkaWFnbm9zdGljIHdpdGggbW9yZSB0aGFuIHRoYXQgYWxtb3N0IGNlcnRhaW5seSBoYXMgdG8gYmUgc2ltcGxpZmllZAorICAgIC8vLyBhbnl3YXkuCisgICAgTWF4QXJndW1lbnRzID0gMTAsCisgIH07CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gQXJndW1lbnRzLgorICBzaWduZWQgY2hhciBOdW1EaWFnQXJnczsKKworICAvLy8gXGJyaWVmIFNwZWNpZmllcyB3aGV0aGVyIGFuIGFyZ3VtZW50IGlzIGluIERpYWdBcmd1bWVudHNTdHIgb3IKKyAgLy8vIGluIERpYWdBcmd1bWVudHMuCisgIC8vLworICAvLy8gVGhpcyBpcyBhbiBhcnJheSBvZiBBcmd1bWVudEtpbmQ6OkFyZ3VtZW50S2luZCBlbnVtIHZhbHVlcywgb25lIGZvciBlYWNoCisgIC8vLyBhcmd1bWVudC4KKyAgdW5zaWduZWQgY2hhciBEaWFnQXJndW1lbnRzS2luZFtNYXhBcmd1bWVudHNdOworCisgIC8vLyBcYnJpZWYgSG9sZHMgdGhlIHZhbHVlcyBvZiBlYWNoIHN0cmluZyBhcmd1bWVudCBmb3IgdGhlIGN1cnJlbnQKKyAgLy8vIGRpYWdub3N0aWMuCisgIC8vLworICAvLy8gVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBBcmd1bWVudEtpbmQgaXMgYWtfc3RkX3N0cmluZy4KKyAgc3RkOjpzdHJpbmcgRGlhZ0FyZ3VtZW50c1N0cltNYXhBcmd1bWVudHNdOworCisgIC8vLyBcYnJpZWYgVGhlIHZhbHVlcyBmb3IgdGhlIHZhcmlvdXMgc3Vic3RpdHV0aW9uIHBvc2l0aW9ucy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgYXJndW1lbnQgaXMgbm90IGFuIHN0ZDo6c3RyaW5nLiAgVGhlIHNwZWNpZmljCisgIC8vLyB2YWx1ZSBpcyBtYW5nbGVkIGludG8gYW4gaW50cHRyX3QgYW5kIHRoZSBpbnRlcnByZXRhdGlvbiBkZXBlbmRzIG9uCisgIC8vLyBleGFjdGx5IHdoYXQgc29ydCBvZiBhcmd1bWVudCBraW5kIGl0IGlzLgorICBpbnRwdHJfdCBEaWFnQXJndW1lbnRzVmFsW01heEFyZ3VtZW50c107CisKKyAgLy8vIFxicmllZiBUaGUgbGlzdCBvZiByYW5nZXMgYWRkZWQgdG8gdGhpcyBkaWFnbm9zdGljLgorICBTbWFsbFZlY3RvcjxDaGFyU291cmNlUmFuZ2UsIDg+IERpYWdSYW5nZXM7CisKKyAgLy8vIFxicmllZiBJZiB2YWxpZCwgcHJvdmlkZXMgYSBoaW50IHdpdGggc29tZSBjb2RlIHRvIGluc2VydCwgcmVtb3ZlLAorICAvLy8gb3IgbW9kaWZ5IGF0IGEgcGFydGljdWxhciBwb3NpdGlvbi4KKyAgU21hbGxWZWN0b3I8Rml4SXRIaW50LCA4PiBEaWFnRml4SXRIaW50czsKKworICBEaWFnbm9zdGljTWFwcGluZyBtYWtlVXNlck1hcHBpbmcoZGlhZzo6U2V2ZXJpdHkgTWFwLCBTb3VyY2VMb2NhdGlvbiBMKSB7CisgICAgYm9vbCBpc1ByYWdtYSA9IEwuaXNWYWxpZCgpOworICAgIERpYWdub3N0aWNNYXBwaW5nIE1hcHBpbmcgPQorICAgICAgICBEaWFnbm9zdGljTWFwcGluZzo6TWFrZShNYXAsIC8qSXNVc2VyPSovdHJ1ZSwgaXNQcmFnbWEpOworCisgICAgLy8gSWYgdGhpcyBpcyBhIHByYWdtYSBtYXBwaW5nLCB0aGVuIHNldCB0aGUgZGlhZ25vc3RpYyBtYXBwaW5nIGZsYWdzIHNvCisgICAgLy8gdGhhdCB3ZSBvdmVycmlkZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAgICBpZiAoaXNQcmFnbWEpIHsKKyAgICAgIE1hcHBpbmcuc2V0Tm9XYXJuaW5nQXNFcnJvcih0cnVlKTsKKyAgICAgIE1hcHBpbmcuc2V0Tm9FcnJvckFzRmF0YWwodHJ1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIE1hcHBpbmc7CisgIH0KKworICAvLy8gXGJyaWVmIFVzZWQgdG8gcmVwb3J0IGEgZGlhZ25vc3RpYyB0aGF0IGlzIGZpbmFsbHkgZnVsbHkgZm9ybWVkLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlIGRpYWdub3N0aWMgd2FzIGVtaXR0ZWQsIGZhbHNlIGlmIGl0IHdhcyBzdXBwcmVzc2VkLgorICBib29sIFByb2Nlc3NEaWFnKCkgeworICAgIHJldHVybiBEaWFncy0+UHJvY2Vzc0RpYWcoKnRoaXMpOworICB9CisKKyAgLy8vIEBuYW1lIERpYWdub3N0aWMgRW1pc3Npb24KKyAgLy8vIEB7Citwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBBU1RSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RXcml0ZXI7CisKKyAgLy8gU2VtYSByZXF1aXJlcyBhY2Nlc3MgdG8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYmVjYXVzZSB0aGUgY3VycmVudCBkZXNpZ24KKyAgLy8gb2YgU0ZJTkFFIHJlcXVpcmVzIGl0IHRvIHVzZSBpdHMgb3duIFNlbWFEaWFnbm9zdGljQnVpbGRlciwgd2hpY2ggbmVlZHMgdG8KKyAgLy8gYWNjZXNzIHVzIGRpcmVjdGx5IHRvIGVuc3VyZSB3ZSBtaW5pbWl6ZSB0aGUgZW1pdHRlZCBjb2RlIGZvciB0aGUgY29tbW9uCisgIC8vIFNlbWE6OkRpYWcoKSBwYXR0ZXJucy4KKyAgZnJpZW5kIGNsYXNzIFNlbWE7CisKKyAgLy8vIFxicmllZiBFbWl0IHRoZSBjdXJyZW50IGRpYWdub3N0aWMgYW5kIGNsZWFyIHRoZSBkaWFnbm9zdGljIHN0YXRlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBGb3JjZSBFbWl0IHRoZSBkaWFnbm9zdGljIHJlZ2FyZGxlc3Mgb2Ygc3VwcHJlc3Npb24gc2V0dGluZ3MuCisgIGJvb2wgRW1pdEN1cnJlbnREaWFnbm9zdGljKGJvb2wgRm9yY2UgPSBmYWxzZSk7CisKKyAgdW5zaWduZWQgZ2V0Q3VycmVudERpYWdJRCgpIGNvbnN0IHsgcmV0dXJuIEN1ckRpYWdJRDsgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEN1cnJlbnREaWFnTG9jKCkgY29uc3QgeyByZXR1cm4gQ3VyRGlhZ0xvYzsgfQorCisgIC8vLyBAfQorfTsKKworLy8vIFxicmllZiBSQUlJIGNsYXNzIHRoYXQgZGV0ZXJtaW5lcyB3aGVuIGFueSBlcnJvcnMgaGF2ZSBvY2N1cnJlZAorLy8vIGJldHdlZW4gdGhlIHRpbWUgdGhlIGluc3RhbmNlIHdhcyBjcmVhdGVkIGFuZCB0aGUgdGltZSBpdCB3YXMKKy8vLyBxdWVyaWVkLgorY2xhc3MgRGlhZ25vc3RpY0Vycm9yVHJhcCB7CisgIERpYWdub3N0aWNzRW5naW5lICZEaWFnOworICB1bnNpZ25lZCBOdW1FcnJvcnM7CisgIHVuc2lnbmVkIE51bVVucmVjb3ZlcmFibGVFcnJvcnM7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgRGlhZ25vc3RpY0Vycm9yVHJhcChEaWFnbm9zdGljc0VuZ2luZSAmRGlhZykKKyAgICAgIDogRGlhZyhEaWFnKSB7IHJlc2V0KCk7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIGFueSBlcnJvcnMgaGF2ZSBvY2N1cnJlZCBzaW5jZSB0aGlzCisgIC8vLyBvYmplY3QgaW5zdGFuY2Ugd2FzIGNyZWF0ZWQuCisgIGJvb2wgaGFzRXJyb3JPY2N1cnJlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRGlhZy5UcmFwTnVtRXJyb3JzT2NjdXJyZWQgPiBOdW1FcnJvcnM7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIGFueSB1bnJlY292ZXJhYmxlIGVycm9ycyBoYXZlIG9jY3VycmVkIHNpbmNlIHRoaXMKKyAgLy8vIG9iamVjdCBpbnN0YW5jZSB3YXMgY3JlYXRlZC4KKyAgYm9vbCBoYXNVbnJlY292ZXJhYmxlRXJyb3JPY2N1cnJlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRGlhZy5UcmFwTnVtVW5yZWNvdmVyYWJsZUVycm9yc09jY3VycmVkID4gTnVtVW5yZWNvdmVyYWJsZUVycm9yczsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRvIGluaXRpYWwgc3RhdGUgb2YgIm5vIGVycm9ycyBvY2N1cnJlZCIuCisgIHZvaWQgcmVzZXQoKSB7CisgICAgTnVtRXJyb3JzID0gRGlhZy5UcmFwTnVtRXJyb3JzT2NjdXJyZWQ7CisgICAgTnVtVW5yZWNvdmVyYWJsZUVycm9ycyA9IERpYWcuVHJhcE51bVVucmVjb3ZlcmFibGVFcnJvcnNPY2N1cnJlZDsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIERpYWdub3N0aWNCdWlsZGVyCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gXGJyaWVmIEEgbGl0dGxlIGhlbHBlciBjbGFzcyB1c2VkIHRvIHByb2R1Y2UgZGlhZ25vc3RpY3MuCisvLy8KKy8vLyBUaGlzIGlzIGNvbnN0cnVjdGVkIGJ5IHRoZSBEaWFnbm9zdGljc0VuZ2luZTo6UmVwb3J0IG1ldGhvZCwgYW5kCisvLy8gYWxsb3dzIGluc2VydGlvbiBvZiBleHRyYSBpbmZvcm1hdGlvbiAoYXJndW1lbnRzIGFuZCBzb3VyY2UgcmFuZ2VzKSBpbnRvCisvLy8gdGhlIGN1cnJlbnRseSAiaW4gZmxpZ2h0IiBkaWFnbm9zdGljLiAgV2hlbiB0aGUgdGVtcG9yYXJ5IGZvciB0aGUgYnVpbGRlcgorLy8vIGlzIGRlc3Ryb3llZCwgdGhlIGRpYWdub3N0aWMgaXMgaXNzdWVkLgorLy8vCisvLy8gTm90ZSB0aGF0IG1hbnkgb2YgdGhlc2Ugd2lsbCBiZSBjcmVhdGVkIGFzIHRlbXBvcmFyeSBvYmplY3RzIChtYW55IGNhbGwKKy8vLyBzaXRlcyksIHNvIHdlIHdhbnQgdGhlbSB0byBiZSBzbWFsbCBhbmQgd2UgbmV2ZXIgd2FudCB0aGVpciBhZGRyZXNzIHRha2VuLgorLy8vIFRoaXMgZW5zdXJlcyB0aGF0IGNvbXBpbGVycyB3aXRoIHNvbWV3aGF0IHJlYXNvbmFibGUgb3B0aW1pemVycyB3aWxsIHByb21vdGUKKy8vLyB0aGUgY29tbW9uIGZpZWxkcyB0byByZWdpc3RlcnMsIGVsaW1pbmF0aW5nIGluY3JlbWVudHMgb2YgdGhlIE51bUFyZ3MgZmllbGQsCisvLy8gZm9yIGV4YW1wbGUuCitjbGFzcyBEaWFnbm9zdGljQnVpbGRlciB7CisgIGZyaWVuZCBjbGFzcyBEaWFnbm9zdGljc0VuZ2luZTsKKyAgZnJpZW5kIGNsYXNzIFBhcnRpYWxEaWFnbm9zdGljOworICAKKyAgbXV0YWJsZSBEaWFnbm9zdGljc0VuZ2luZSAqRGlhZ09iaiA9IG51bGxwdHI7CisgIG11dGFibGUgdW5zaWduZWQgTnVtQXJncyA9IDA7CisKKyAgLy8vIFxicmllZiBTdGF0dXMgdmFyaWFibGUgaW5kaWNhdGluZyBpZiB0aGlzIGRpYWdub3N0aWMgaXMgc3RpbGwgYWN0aXZlLgorICAvLy8KKyAgLy8gTk9URTogVGhpcyBmaWVsZCBpcyByZWR1bmRhbnQgd2l0aCBEaWFnT2JqIChJc0FjdGl2ZSBpZmYgKERpYWdPYmogPT0gMCkpLAorICAvLyBidXQgTExWTSBpcyBub3QgY3VycmVudGx5IHNtYXJ0IGVub3VnaCB0byBlbGltaW5hdGUgdGhlIG51bGwgY2hlY2sgdGhhdAorICAvLyBFbWl0KCkgd291bGQgZW5kIHVwIHdpdGggaWYgd2UgdXNlZCB0aGF0IGFzIG91ciBzdGF0dXMgdmFyaWFibGUuCisgIG11dGFibGUgYm9vbCBJc0FjdGl2ZSA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhpcyBkaWFnbm9zdGljIGlzIGJlaW5nIGVtaXR0ZWQgdmlhIGEKKyAgLy8vIGNhbGwgdG8gRm9yY2VFbWl0LgorICBtdXRhYmxlIGJvb2wgSXNGb3JjZUVtaXQgPSBmYWxzZTsKKworICBEaWFnbm9zdGljQnVpbGRlcigpID0gZGVmYXVsdDsKKworICBleHBsaWNpdCBEaWFnbm9zdGljQnVpbGRlcihEaWFnbm9zdGljc0VuZ2luZSAqZGlhZ09iaikKKyAgICAgIDogRGlhZ09iaihkaWFnT2JqKSwgSXNBY3RpdmUodHJ1ZSkgeworICAgIGFzc2VydChkaWFnT2JqICYmICJEaWFnbm9zdGljQnVpbGRlciByZXF1aXJlcyBhIHZhbGlkIERpYWdub3N0aWNzRW5naW5lISIpOworICAgIGRpYWdPYmotPkRpYWdSYW5nZXMuY2xlYXIoKTsKKyAgICBkaWFnT2JqLT5EaWFnRml4SXRIaW50cy5jbGVhcigpOworICB9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBGbHVzaENvdW50cygpIHsKKyAgICBEaWFnT2JqLT5OdW1EaWFnQXJncyA9IE51bUFyZ3M7CisgIH0KKworICAvLy8gXGJyaWVmIENsZWFyIG91dCB0aGUgY3VycmVudCBkaWFnbm9zdGljLgorICB2b2lkIENsZWFyKCkgY29uc3QgeworICAgIERpYWdPYmogPSBudWxscHRyOworICAgIElzQWN0aXZlID0gZmFsc2U7CisgICAgSXNGb3JjZUVtaXQgPSBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBkaWFnbm9zdGljIGlzIHN0aWxsIGFjdGl2ZS4KKyAgYm9vbCBpc0FjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIElzQWN0aXZlOyB9CisKKyAgLy8vIFxicmllZiBGb3JjZSB0aGUgZGlhZ25vc3RpYyBidWlsZGVyIHRvIGVtaXQgdGhlIGRpYWdub3N0aWMgbm93LgorICAvLy8KKyAgLy8vIE9uY2UgdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWQsIHRoZSBEaWFnbm9zdGljQnVpbGRlciBvYmplY3QKKyAgLy8vIHNob3VsZCBub3QgYmUgdXNlZCBhZ2FpbiBiZWZvcmUgaXQgaXMgZGVzdHJveWVkLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgYSBkaWFnbm9zdGljIHdhcyBlbWl0dGVkLCBmYWxzZSBpZiB0aGUKKyAgLy8vIGRpYWdub3N0aWMgd2FzIHN1cHByZXNzZWQuCisgIGJvb2wgRW1pdCgpIHsKKyAgICAvLyBJZiB0aGlzIGRpYWdub3N0aWMgaXMgaW5hY3RpdmUsIHRoZW4gaXRzIHNvdWwgd2FzIHN0b2xlbiBieSB0aGUgY29weSBjdG9yCisgICAgLy8gKG9yIGJ5IGEgc3ViY2xhc3MsIGFzIGluIFNlbWFEaWFnbm9zdGljQnVpbGRlcikuCisgICAgaWYgKCFpc0FjdGl2ZSgpKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBXaGVuIGVtaXR0aW5nIGRpYWdub3N0aWNzLCB3ZSBzZXQgdGhlIGZpbmFsIGFyZ3VtZW50IGNvdW50IGludG8KKyAgICAvLyB0aGUgRGlhZ25vc3RpY3NFbmdpbmUgb2JqZWN0LgorICAgIEZsdXNoQ291bnRzKCk7CisKKyAgICAvLyBQcm9jZXNzIHRoZSBkaWFnbm9zdGljLgorICAgIGJvb2wgUmVzdWx0ID0gRGlhZ09iai0+RW1pdEN1cnJlbnREaWFnbm9zdGljKElzRm9yY2VFbWl0KTsKKworICAgIC8vIFRoaXMgZGlhZ25vc3RpYyBpcyBkZWFkLgorICAgIENsZWFyKCk7CisKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisgIAorcHVibGljOgorICAvLy8gQ29weSBjb25zdHJ1Y3Rvci4gIFdoZW4gY29waWVkLCB0aGlzICJ0YWtlcyIgdGhlIGRpYWdub3N0aWMgaW5mbyBmcm9tIHRoZQorICAvLy8gaW5wdXQgYW5kIG5ldXRlcnMgaXQuCisgIERpYWdub3N0aWNCdWlsZGVyKGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZEKSB7CisgICAgRGlhZ09iaiA9IEQuRGlhZ09iajsKKyAgICBJc0FjdGl2ZSA9IEQuSXNBY3RpdmU7CisgICAgSXNGb3JjZUVtaXQgPSBELklzRm9yY2VFbWl0OworICAgIEQuQ2xlYXIoKTsKKyAgICBOdW1BcmdzID0gRC5OdW1BcmdzOworICB9CisKKyAgRGlhZ25vc3RpY0J1aWxkZXIgJm9wZXJhdG9yPShjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmKSA9IGRlbGV0ZTsKKworICAvLy8gXGJyaWVmIEVtaXRzIHRoZSBkaWFnbm9zdGljLgorICB+RGlhZ25vc3RpY0J1aWxkZXIoKSB7CisgICAgRW1pdCgpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBhbiBlbXB0eSBkaWFnbm9zdGljIGJ1aWxkZXIuCisgIHN0YXRpYyBEaWFnbm9zdGljQnVpbGRlciBnZXRFbXB0eSgpIHsKKyAgICByZXR1cm4ge307CisgIH0KKworICAvLy8gXGJyaWVmIEZvcmNlcyB0aGUgZGlhZ25vc3RpYyB0byBiZSBlbWl0dGVkLgorICBjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmc2V0Rm9yY2VFbWl0KCkgY29uc3QgeworICAgIElzRm9yY2VFbWl0ID0gdHJ1ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIENvbnZlcnNpb24gb2YgRGlhZ25vc3RpY0J1aWxkZXIgdG8gYm9vbCBhbHdheXMgcmV0dXJucyBcYyB0cnVlLgorICAvLy8KKyAgLy8vIFRoaXMgYWxsb3dzIGlzIHRvIGJlIHVzZWQgaW4gYm9vbGVhbiBlcnJvciBjb250ZXh0cyAod2hlcmUgXGMgdHJ1ZSBpcworICAvLy8gdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGFuIGVycm9yIGhhcyBvY2N1cnJlZCksIGxpa2U6CisgIC8vLyBcY29kZQorICAvLy8gcmV0dXJuIERpYWcoLi4uKTsKKyAgLy8vIFxlbmRjb2RlCisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgdm9pZCBBZGRTdHJpbmcoU3RyaW5nUmVmIFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNBY3RpdmUoKSAmJiAiQ2xpZW50cyBtdXN0IG5vdCBhZGQgdG8gY2xlYXJlZCBkaWFnbm9zdGljISIpOworICAgIGFzc2VydChOdW1BcmdzIDwgRGlhZ25vc3RpY3NFbmdpbmU6Ok1heEFyZ3VtZW50cyAmJgorICAgICAgICAgICAiVG9vIG1hbnkgYXJndW1lbnRzIHRvIGRpYWdub3N0aWMhIik7CisgICAgRGlhZ09iai0+RGlhZ0FyZ3VtZW50c0tpbmRbTnVtQXJnc10gPSBEaWFnbm9zdGljc0VuZ2luZTo6YWtfc3RkX3N0cmluZzsKKyAgICBEaWFnT2JqLT5EaWFnQXJndW1lbnRzU3RyW051bUFyZ3MrK10gPSBTOworICB9CisKKyAgdm9pZCBBZGRUYWdnZWRWYWwoaW50cHRyX3QgViwgRGlhZ25vc3RpY3NFbmdpbmU6OkFyZ3VtZW50S2luZCBLaW5kKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQWN0aXZlKCkgJiYgIkNsaWVudHMgbXVzdCBub3QgYWRkIHRvIGNsZWFyZWQgZGlhZ25vc3RpYyEiKTsKKyAgICBhc3NlcnQoTnVtQXJncyA8IERpYWdub3N0aWNzRW5naW5lOjpNYXhBcmd1bWVudHMgJiYKKyAgICAgICAgICAgIlRvbyBtYW55IGFyZ3VtZW50cyB0byBkaWFnbm9zdGljISIpOworICAgIERpYWdPYmotPkRpYWdBcmd1bWVudHNLaW5kW051bUFyZ3NdID0gS2luZDsKKyAgICBEaWFnT2JqLT5EaWFnQXJndW1lbnRzVmFsW051bUFyZ3MrK10gPSBWOworICB9CisKKyAgdm9pZCBBZGRTb3VyY2VSYW5nZShjb25zdCBDaGFyU291cmNlUmFuZ2UgJlIpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNBY3RpdmUoKSAmJiAiQ2xpZW50cyBtdXN0IG5vdCBhZGQgdG8gY2xlYXJlZCBkaWFnbm9zdGljISIpOworICAgIERpYWdPYmotPkRpYWdSYW5nZXMucHVzaF9iYWNrKFIpOworICB9CisKKyAgdm9pZCBBZGRGaXhJdEhpbnQoY29uc3QgRml4SXRIaW50ICZIaW50KSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQWN0aXZlKCkgJiYgIkNsaWVudHMgbXVzdCBub3QgYWRkIHRvIGNsZWFyZWQgZGlhZ25vc3RpYyEiKTsKKyAgICBpZiAoIUhpbnQuaXNOdWxsKCkpCisgICAgICBEaWFnT2JqLT5EaWFnRml4SXRIaW50cy5wdXNoX2JhY2soSGludCk7CisgIH0KKworICB2b2lkIGFkZEZsYWdWYWx1ZShTdHJpbmdSZWYgVikgY29uc3QgeyBEaWFnT2JqLT5GbGFnVmFsdWUgPSBWOyB9Cit9OworCitzdHJ1Y3QgQWRkRmxhZ1ZhbHVlIHsKKyAgU3RyaW5nUmVmIFZhbDsKKworICBleHBsaWNpdCBBZGRGbGFnVmFsdWUoU3RyaW5nUmVmIFYpIDogVmFsKFYpIHt9Cit9OworCisvLy8gXGJyaWVmIFJlZ2lzdGVyIGEgdmFsdWUgZm9yIHRoZSBmbGFnIGluIHRoZSBjdXJyZW50IGRpYWdub3N0aWMuIFRoaXMKKy8vLyB2YWx1ZSB3aWxsIGJlIHNob3duIGFzIHRoZSBzdWZmaXggIj12YWx1ZSIgYWZ0ZXIgdGhlIGZsYWcgbmFtZS4gSXQgaXMKKy8vLyB1c2VmdWwgaW4gY2FzZXMgd2hlcmUgdGhlIGRpYWdub3N0aWMgZmxhZyBhY2NlcHRzIHZhbHVlcyAoZS5nLiwKKy8vLyAtUnBhc3Mgb3IgLVdmcmFtZS1sYXJnZXItdGhhbikuCitpbmxpbmUgY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJm9wZXJhdG9yPDwoY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJkRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFkZEZsYWdWYWx1ZSBWKSB7CisgIERCLmFkZEZsYWdWYWx1ZShWLlZhbCk7CisgIHJldHVybiBEQjsKK30KKworaW5saW5lIGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZvcGVyYXRvcjw8KGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZEQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgUykgeworICBEQi5BZGRTdHJpbmcoUyk7CisgIHJldHVybiBEQjsKK30KKworaW5saW5lIGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZvcGVyYXRvcjw8KGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZEQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpTdHIpIHsKKyAgREIuQWRkVGFnZ2VkVmFsKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KFN0ciksCisgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6YWtfY19zdHJpbmcpOworICByZXR1cm4gREI7Cit9CisKK2lubGluZSBjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmb3BlcmF0b3I8PChjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmREIsIGludCBJKSB7CisgIERCLkFkZFRhZ2dlZFZhbChJLCBEaWFnbm9zdGljc0VuZ2luZTo6YWtfc2ludCk7CisgIHJldHVybiBEQjsKK30KKworLy8gV2UgdXNlIGVuYWJsZV9pZiBoZXJlIHRvIHByZXZlbnQgdGhhdCB0aGlzIG92ZXJsb2FkIGlzIHNlbGVjdGVkIGZvcgorLy8gcG9pbnRlcnMgb3Igb3RoZXIgYXJndW1lbnRzIHRoYXQgYXJlIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gYm9vbC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8VCwgYm9vbD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJj46OnR5cGUKK29wZXJhdG9yPDwoY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJkRCLCBUIEkpIHsKKyAgREIuQWRkVGFnZ2VkVmFsKEksIERpYWdub3N0aWNzRW5naW5lOjpha19zaW50KTsKKyAgcmV0dXJuIERCOworfQorCitpbmxpbmUgY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJm9wZXJhdG9yPDwoY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJkRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEkpIHsKKyAgREIuQWRkVGFnZ2VkVmFsKEksIERpYWdub3N0aWNzRW5naW5lOjpha191aW50KTsKKyAgcmV0dXJuIERCOworfQorCitpbmxpbmUgY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJm9wZXJhdG9yPDwoY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJkRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6VG9rZW5LaW5kIEkpIHsKKyAgREIuQWRkVGFnZ2VkVmFsKHN0YXRpY19jYXN0PHVuc2lnbmVkPihJKSwgRGlhZ25vc3RpY3NFbmdpbmU6OmFrX3Rva2Vua2luZCk7CisgIHJldHVybiBEQjsKK30KKworaW5saW5lIGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZvcGVyYXRvcjw8KGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZEQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJZGVudGlmaWVySW5mbyAqSUkpIHsKKyAgREIuQWRkVGFnZ2VkVmFsKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KElJKSwKKyAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpha19pZGVudGlmaWVyaW5mbyk7CisgIHJldHVybiBEQjsKK30KKworLy8gQWRkcyBhIERlY2xDb250ZXh0IHRvIHRoZSBkaWFnbm9zdGljLiBUaGUgZW5hYmxlX2lmIHRlbXBsYXRlIG1hZ2ljIGlzIGhlcmUKKy8vIHNvIHRoYXQgd2Ugb25seSBtYXRjaCB0aG9zZSBhcmd1bWVudHMgdGhhdCBhcmUgKHN0YXRpY2FsbHkpIERlY2xDb250ZXh0czsKKy8vIG90aGVyIGFyZ3VtZW50cyB0aGF0IGRlcml2ZSBmcm9tIERlY2xDb250ZXh0IChlLmcuLCBSZWNvcmREZWNscykgd2lsbCBub3QKKy8vIG1hdGNoLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgc3RkOjppc19zYW1lPHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2NvbnN0PFQ+Ojp0eXBlLCBEZWNsQ29udGV4dD46OnZhbHVlLAorICAgIGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICY+Ojp0eXBlCitvcGVyYXRvcjw8KGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZEQiwgVCAqREMpIHsKKyAgREIuQWRkVGFnZ2VkVmFsKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KERDKSwKKyAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpha19kZWNsY29udGV4dCk7CisgIHJldHVybiBEQjsKK30KKworaW5saW5lIGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZvcGVyYXRvcjw8KGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZEQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSKSB7CisgIERCLkFkZFNvdXJjZVJhbmdlKENoYXJTb3VyY2VSYW5nZTo6Z2V0VG9rZW5SYW5nZShSKSk7CisgIHJldHVybiBEQjsKK30KKworaW5saW5lIGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZvcGVyYXRvcjw8KGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZEQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTb3VyY2VSYW5nZT4gUmFuZ2VzKSB7CisgIGZvciAoU291cmNlUmFuZ2UgUiA6IFJhbmdlcykKKyAgICBEQi5BZGRTb3VyY2VSYW5nZShDaGFyU291cmNlUmFuZ2U6OmdldFRva2VuUmFuZ2UoUikpOworICByZXR1cm4gREI7Cit9CisKK2lubGluZSBjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmb3BlcmF0b3I8PChjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmREIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2hhclNvdXJjZVJhbmdlICZSKSB7CisgIERCLkFkZFNvdXJjZVJhbmdlKFIpOworICByZXR1cm4gREI7Cit9CisKK2lubGluZSBjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmb3BlcmF0b3I8PChjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmREIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRml4SXRIaW50ICZIaW50KSB7CisgIERCLkFkZEZpeEl0SGludChIaW50KTsKKyAgcmV0dXJuIERCOworfQorCitpbmxpbmUgY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJm9wZXJhdG9yPDwoY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJkRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEZpeEl0SGludD4gSGludHMpIHsKKyAgZm9yIChjb25zdCBGaXhJdEhpbnQgJkhpbnQgOiBIaW50cykKKyAgICBEQi5BZGRGaXhJdEhpbnQoSGludCk7CisgIHJldHVybiBEQjsKK30KKworLy8vIEEgbnVsbGFiaWxpdHkga2luZCBwYWlyZWQgd2l0aCBhIGJpdCBpbmRpY2F0aW5nIHdoZXRoZXIgaXQgdXNlZCBhCisvLy8gY29udGV4dC1zZW5zaXRpdmUga2V5d29yZC4KK3VzaW5nIERpYWdOdWxsYWJpbGl0eUtpbmQgPSBzdGQ6OnBhaXI8TnVsbGFiaWxpdHlLaW5kLCBib29sPjsKKworY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJm9wZXJhdG9yPDwoY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJkRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ051bGxhYmlsaXR5S2luZCBudWxsYWJpbGl0eSk7CisKK2lubGluZSBEaWFnbm9zdGljQnVpbGRlciBEaWFnbm9zdGljc0VuZ2luZTo6UmVwb3J0KFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERpYWdJRCkgeworICBhc3NlcnQoQ3VyRGlhZ0lEID09IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSAmJgorICAgICAgICAgIk11bHRpcGxlIGRpYWdub3N0aWNzIGluIGZsaWdodCBhdCBvbmNlISIpOworICBDdXJEaWFnTG9jID0gTG9jOworICBDdXJEaWFnSUQgPSBEaWFnSUQ7CisgIEZsYWdWYWx1ZS5jbGVhcigpOworICByZXR1cm4gRGlhZ25vc3RpY0J1aWxkZXIodGhpcyk7Cit9CisKK2lubGluZSBEaWFnbm9zdGljQnVpbGRlciBEaWFnbm9zdGljc0VuZ2luZTo6UmVwb3J0KHVuc2lnbmVkIERpYWdJRCkgeworICByZXR1cm4gUmVwb3J0KFNvdXJjZUxvY2F0aW9uKCksIERpYWdJRCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBEaWFnbm9zdGljCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQSBsaXR0bGUgaGVscGVyIGNsYXNzICh3aGljaCBpcyBiYXNpY2FsbHkgYSBzbWFydCBwb2ludGVyIHRoYXQgZm9yd2FyZHMKKy8vLyBpbmZvIGZyb20gRGlhZ25vc3RpY3NFbmdpbmUpIHRoYXQgYWxsb3dzIGNsaWVudHMgdG8gZW5xdWlyZSBhYm91dCB0aGUKKy8vLyBjdXJyZW50bHkgaW4tZmxpZ2h0IGRpYWdub3N0aWMuCitjbGFzcyBEaWFnbm9zdGljIHsKKyAgY29uc3QgRGlhZ25vc3RpY3NFbmdpbmUgKkRpYWdPYmo7CisgIFN0cmluZ1JlZiBTdG9yZWREaWFnTWVzc2FnZTsKKworcHVibGljOgorICBleHBsaWNpdCBEaWFnbm9zdGljKGNvbnN0IERpYWdub3N0aWNzRW5naW5lICpETykgOiBEaWFnT2JqKERPKSB7fQorICBEaWFnbm9zdGljKGNvbnN0IERpYWdub3N0aWNzRW5naW5lICpETywgU3RyaW5nUmVmIHN0b3JlZERpYWdNZXNzYWdlKQorICAgICAgOiBEaWFnT2JqKERPKSwgU3RvcmVkRGlhZ01lc3NhZ2Uoc3RvcmVkRGlhZ01lc3NhZ2UpIHt9CisKKyAgY29uc3QgRGlhZ25vc3RpY3NFbmdpbmUgKmdldERpYWdzKCkgY29uc3QgeyByZXR1cm4gRGlhZ09iajsgfQorICB1bnNpZ25lZCBnZXRJRCgpIGNvbnN0IHsgcmV0dXJuIERpYWdPYmotPkN1ckRpYWdJRDsgfQorICBjb25zdCBTb3VyY2VMb2NhdGlvbiAmZ2V0TG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBEaWFnT2JqLT5DdXJEaWFnTG9jOyB9CisgIGJvb2wgaGFzU291cmNlTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIERpYWdPYmotPmhhc1NvdXJjZU1hbmFnZXIoKTsgfQorICBTb3VyY2VNYW5hZ2VyICZnZXRTb3VyY2VNYW5hZ2VyKCkgY29uc3QgeyByZXR1cm4gRGlhZ09iai0+Z2V0U291cmNlTWFuYWdlcigpO30KKworICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3QgeyByZXR1cm4gRGlhZ09iai0+TnVtRGlhZ0FyZ3M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUga2luZCBvZiB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAvLy8KKyAgLy8vIEJhc2VkIG9uIHRoZSBraW5kIG9mIGFyZ3VtZW50LCB0aGUgYWNjZXNzb3JzIGJlbG93IGNhbiBiZSB1c2VkIHRvIGdldAorICAvLy8gdGhlIHZhbHVlLgorICAvLy8KKyAgLy8vIFxwcmUgSWR4IDwgZ2V0TnVtQXJncygpCisgIERpYWdub3N0aWNzRW5naW5lOjpBcmd1bWVudEtpbmQgZ2V0QXJnS2luZCh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSWR4IDwgZ2V0TnVtQXJncygpICYmICJBcmd1bWVudCBpbmRleCBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIChEaWFnbm9zdGljc0VuZ2luZTo6QXJndW1lbnRLaW5kKURpYWdPYmotPkRpYWdBcmd1bWVudHNLaW5kW0lkeF07CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgc3RyaW5nIHNwZWNpZmllZCBieSBccCBJZHguCisgIC8vLyBccHJlIGdldEFyZ0tpbmQoSWR4KSA9PSBEaWFnbm9zdGljc0VuZ2luZTo6YWtfc3RkX3N0cmluZworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0QXJnU3RkU3RyKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGFzc2VydChnZXRBcmdLaW5kKElkeCkgPT0gRGlhZ25vc3RpY3NFbmdpbmU6OmFrX3N0ZF9zdHJpbmcgJiYKKyAgICAgICAgICAgImludmFsaWQgYXJndW1lbnQgYWNjZXNzb3IhIik7CisgICAgcmV0dXJuIERpYWdPYmotPkRpYWdBcmd1bWVudHNTdHJbSWR4XTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzcGVjaWZpZWQgQyBzdHJpbmcgYXJndW1lbnQuCisgIC8vLyBccHJlIGdldEFyZ0tpbmQoSWR4KSA9PSBEaWFnbm9zdGljc0VuZ2luZTo6YWtfY19zdHJpbmcKKyAgY29uc3QgY2hhciAqZ2V0QXJnQ1N0cih1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0QXJnS2luZChJZHgpID09IERpYWdub3N0aWNzRW5naW5lOjpha19jX3N0cmluZyAmJgorICAgICAgICAgICAiaW52YWxpZCBhcmd1bWVudCBhY2Nlc3NvciEiKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oRGlhZ09iai0+RGlhZ0FyZ3VtZW50c1ZhbFtJZHhdKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzcGVjaWZpZWQgc2lnbmVkIGludGVnZXIgYXJndW1lbnQuCisgIC8vLyBccHJlIGdldEFyZ0tpbmQoSWR4KSA9PSBEaWFnbm9zdGljc0VuZ2luZTo6YWtfc2ludAorICBpbnQgZ2V0QXJnU0ludCh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0QXJnS2luZChJZHgpID09IERpYWdub3N0aWNzRW5naW5lOjpha19zaW50ICYmCisgICAgICAgICAgICJpbnZhbGlkIGFyZ3VtZW50IGFjY2Vzc29yISIpOworICAgIHJldHVybiAoaW50KURpYWdPYmotPkRpYWdBcmd1bWVudHNWYWxbSWR4XTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzcGVjaWZpZWQgdW5zaWduZWQgaW50ZWdlciBhcmd1bWVudC4KKyAgLy8vIFxwcmUgZ2V0QXJnS2luZChJZHgpID09IERpYWdub3N0aWNzRW5naW5lOjpha191aW50CisgIHVuc2lnbmVkIGdldEFyZ1VJbnQodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEFyZ0tpbmQoSWR4KSA9PSBEaWFnbm9zdGljc0VuZ2luZTo6YWtfdWludCAmJgorICAgICAgICAgICAiaW52YWxpZCBhcmd1bWVudCBhY2Nlc3NvciEiKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkKURpYWdPYmotPkRpYWdBcmd1bWVudHNWYWxbSWR4XTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzcGVjaWZpZWQgSWRlbnRpZmllckluZm8gYXJndW1lbnQuCisgIC8vLyBccHJlIGdldEFyZ0tpbmQoSWR4KSA9PSBEaWFnbm9zdGljc0VuZ2luZTo6YWtfaWRlbnRpZmllcmluZm8KKyAgY29uc3QgSWRlbnRpZmllckluZm8gKmdldEFyZ0lkZW50aWZpZXIodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEFyZ0tpbmQoSWR4KSA9PSBEaWFnbm9zdGljc0VuZ2luZTo6YWtfaWRlbnRpZmllcmluZm8gJiYKKyAgICAgICAgICAgImludmFsaWQgYXJndW1lbnQgYWNjZXNzb3IhIik7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8SWRlbnRpZmllckluZm8qPihEaWFnT2JqLT5EaWFnQXJndW1lbnRzVmFsW0lkeF0pOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHNwZWNpZmllZCBub24tc3RyaW5nIGFyZ3VtZW50IGluIGFuIG9wYXF1ZSBmb3JtLgorICAvLy8gXHByZSBnZXRBcmdLaW5kKElkeCkgIT0gRGlhZ25vc3RpY3NFbmdpbmU6OmFrX3N0ZF9zdHJpbmcKKyAgaW50cHRyX3QgZ2V0UmF3QXJnKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGFzc2VydChnZXRBcmdLaW5kKElkeCkgIT0gRGlhZ25vc3RpY3NFbmdpbmU6OmFrX3N0ZF9zdHJpbmcgJiYKKyAgICAgICAgICAgImludmFsaWQgYXJndW1lbnQgYWNjZXNzb3IhIik7CisgICAgcmV0dXJuIERpYWdPYmotPkRpYWdBcmd1bWVudHNWYWxbSWR4XTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2Ygc291cmNlIHJhbmdlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkaWFnbm9zdGljLgorICB1bnNpZ25lZCBnZXROdW1SYW5nZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIERpYWdPYmotPkRpYWdSYW5nZXMuc2l6ZSgpOworICB9CisKKyAgLy8vIFxwcmUgSWR4IDwgZ2V0TnVtUmFuZ2VzKCkKKyAgY29uc3QgQ2hhclNvdXJjZVJhbmdlICZnZXRSYW5nZSh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSWR4IDwgZ2V0TnVtUmFuZ2VzKCkgJiYgIkludmFsaWQgZGlhZ25vc3RpYyByYW5nZSBpbmRleCEiKTsKKyAgICByZXR1cm4gRGlhZ09iai0+RGlhZ1Jhbmdlc1tJZHhdOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIGZvciB0aGlzIGRpYWdub3N0aWMncyByYW5nZXMuCisgIEFycmF5UmVmPENoYXJTb3VyY2VSYW5nZT4gZ2V0UmFuZ2VzKCkgY29uc3QgeworICAgIHJldHVybiBEaWFnT2JqLT5EaWFnUmFuZ2VzOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtRml4SXRIaW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gRGlhZ09iai0+RGlhZ0ZpeEl0SGludHMuc2l6ZSgpOworICB9CisKKyAgY29uc3QgRml4SXRIaW50ICZnZXRGaXhJdEhpbnQodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KElkeCA8IGdldE51bUZpeEl0SGludHMoKSAmJiAiSW52YWxpZCBpbmRleCEiKTsKKyAgICByZXR1cm4gRGlhZ09iai0+RGlhZ0ZpeEl0SGludHNbSWR4XTsKKyAgfQorCisgIEFycmF5UmVmPEZpeEl0SGludD4gZ2V0Rml4SXRIaW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gRGlhZ09iai0+RGlhZ0ZpeEl0SGludHM7CisgIH0KKworICAvLy8gXGJyaWVmIEZvcm1hdCB0aGlzIGRpYWdub3N0aWMgaW50byBhIHN0cmluZywgc3Vic3RpdHV0aW5nIHRoZQorICAvLy8gZm9ybWFsIGFyZ3VtZW50cyBpbnRvIHRoZSAlMCBzbG90cy4KKyAgLy8vCisgIC8vLyBUaGUgcmVzdWx0IGlzIGFwcGVuZGVkIG9udG8gdGhlIFxwIE91dFN0ciBhcnJheS4KKyAgdm9pZCBGb3JtYXREaWFnbm9zdGljKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmT3V0U3RyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEZvcm1hdCB0aGUgZ2l2ZW4gZm9ybWF0LXN0cmluZyBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyIHVzaW5nIHRoZQorICAvLy8gYXJndW1lbnRzIHN0b3JlZCBpbiB0aGlzIGRpYWdub3N0aWMuCisgIHZvaWQgRm9ybWF0RGlhZ25vc3RpYyhjb25zdCBjaGFyICpEaWFnU3RyLCBjb25zdCBjaGFyICpEaWFnRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZPdXRTdHIpIGNvbnN0OworfTsKKworLyoqCisgKiBcYnJpZWYgUmVwcmVzZW50cyBhIGRpYWdub3N0aWMgaW4gYSBmb3JtIHRoYXQgY2FuIGJlIHJldGFpbmVkIHVudGlsIGl0cyAKKyAqIGNvcnJlc3BvbmRpbmcgc291cmNlIG1hbmFnZXIgaXMgZGVzdHJveWVkLiAKKyAqLworY2xhc3MgU3RvcmVkRGlhZ25vc3RpYyB7CisgIHVuc2lnbmVkIElEOworICBEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWw7CisgIEZ1bGxTb3VyY2VMb2MgTG9jOworICBzdGQ6OnN0cmluZyBNZXNzYWdlOworICBzdGQ6OnZlY3RvcjxDaGFyU291cmNlUmFuZ2U+IFJhbmdlczsKKyAgc3RkOjp2ZWN0b3I8Rml4SXRIaW50PiBGaXhJdHM7CisKK3B1YmxpYzoKKyAgU3RvcmVkRGlhZ25vc3RpYygpID0gZGVmYXVsdDsKKyAgU3RvcmVkRGlhZ25vc3RpYyhEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwsIGNvbnN0IERpYWdub3N0aWMgJkluZm8pOworICBTdG9yZWREaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBMZXZlbCwgdW5zaWduZWQgSUQsIAorICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNZXNzYWdlKTsKKyAgU3RvcmVkRGlhZ25vc3RpYyhEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwsIHVuc2lnbmVkIElELCAKKyAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTWVzc2FnZSwgRnVsbFNvdXJjZUxvYyBMb2MsCisgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q2hhclNvdXJjZVJhbmdlPiBSYW5nZXMsCisgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Rml4SXRIaW50PiBGaXhpdHMpOworCisgIC8vLyBcYnJpZWYgRXZhbHVhdGVzIHRydWUgd2hlbiB0aGlzIG9iamVjdCBzdG9yZXMgYSBkaWFnbm9zdGljLgorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gIU1lc3NhZ2UuZW1wdHkoKTsgfQorCisgIHVuc2lnbmVkIGdldElEKCkgY29uc3QgeyByZXR1cm4gSUQ7IH0KKyAgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIGdldExldmVsKCkgY29uc3QgeyByZXR1cm4gTGV2ZWw7IH0KKyAgY29uc3QgRnVsbFNvdXJjZUxvYyAmZ2V0TG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKyAgU3RyaW5nUmVmIGdldE1lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBNZXNzYWdlOyB9CisKKyAgdm9pZCBzZXRMb2NhdGlvbihGdWxsU291cmNlTG9jIExvYykgeyB0aGlzLT5Mb2MgPSBMb2M7IH0KKworICB1c2luZyByYW5nZV9pdGVyYXRvciA9IHN0ZDo6dmVjdG9yPENoYXJTb3VyY2VSYW5nZT46OmNvbnN0X2l0ZXJhdG9yOworCisgIHJhbmdlX2l0ZXJhdG9yIHJhbmdlX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gUmFuZ2VzLmJlZ2luKCk7IH0KKyAgcmFuZ2VfaXRlcmF0b3IgcmFuZ2VfZW5kKCkgY29uc3QgeyByZXR1cm4gUmFuZ2VzLmVuZCgpOyB9CisgIHVuc2lnbmVkIHJhbmdlX3NpemUoKSBjb25zdCB7IHJldHVybiBSYW5nZXMuc2l6ZSgpOyB9CisgIAorICBBcnJheVJlZjxDaGFyU291cmNlUmFuZ2U+IGdldFJhbmdlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKFJhbmdlcyk7CisgIH0KKworICB1c2luZyBmaXhpdF9pdGVyYXRvciA9IHN0ZDo6dmVjdG9yPEZpeEl0SGludD46OmNvbnN0X2l0ZXJhdG9yOworCisgIGZpeGl0X2l0ZXJhdG9yIGZpeGl0X2JlZ2luKCkgY29uc3QgeyByZXR1cm4gRml4SXRzLmJlZ2luKCk7IH0KKyAgZml4aXRfaXRlcmF0b3IgZml4aXRfZW5kKCkgY29uc3QgeyByZXR1cm4gRml4SXRzLmVuZCgpOyB9CisgIHVuc2lnbmVkIGZpeGl0X3NpemUoKSBjb25zdCB7IHJldHVybiBGaXhJdHMuc2l6ZSgpOyB9CisgIAorICBBcnJheVJlZjxGaXhJdEhpbnQ+IGdldEZpeEl0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKEZpeEl0cyk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQWJzdHJhY3QgaW50ZXJmYWNlLCBpbXBsZW1lbnRlZCBieSBjbGllbnRzIG9mIHRoZSBmcm9udC1lbmQsIHdoaWNoCisvLy8gZm9ybWF0cyBhbmQgcHJpbnRzIGZ1bGx5IHByb2Nlc3NlZCBkaWFnbm9zdGljcy4KK2NsYXNzIERpYWdub3N0aWNDb25zdW1lciB7Citwcm90ZWN0ZWQ6CisgIHVuc2lnbmVkIE51bVdhcm5pbmdzID0gMDsgICAgICAgLy8vPCBOdW1iZXIgb2Ygd2FybmluZ3MgcmVwb3J0ZWQKKyAgdW5zaWduZWQgTnVtRXJyb3JzID0gMDsgICAgICAgICAvLy88IE51bWJlciBvZiBlcnJvcnMgcmVwb3J0ZWQKKyAgCitwdWJsaWM6CisgIERpYWdub3N0aWNDb25zdW1lcigpID0gZGVmYXVsdDsKKyAgdmlydHVhbCB+RGlhZ25vc3RpY0NvbnN1bWVyKCk7CisKKyAgdW5zaWduZWQgZ2V0TnVtRXJyb3JzKCkgY29uc3QgeyByZXR1cm4gTnVtRXJyb3JzOyB9CisgIHVuc2lnbmVkIGdldE51bVdhcm5pbmdzKCkgY29uc3QgeyByZXR1cm4gTnVtV2FybmluZ3M7IH0KKyAgdmlydHVhbCB2b2lkIGNsZWFyKCkgeyBOdW1XYXJuaW5ncyA9IE51bUVycm9ycyA9IDA7IH0KKworICAvLy8gXGJyaWVmIENhbGxiYWNrIHRvIGluZm9ybSB0aGUgZGlhZ25vc3RpYyBjbGllbnQgdGhhdCBwcm9jZXNzaW5nCisgIC8vLyBvZiBhIHNvdXJjZSBmaWxlIGlzIGJlZ2lubmluZy4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgZGlhZ25vc3RpY3MgbWF5IGJlIGVtaXR0ZWQgb3V0c2lkZSB0aGUgcHJvY2Vzc2luZyBvZiBhIHNvdXJjZQorICAvLy8gZmlsZSwgZm9yIGV4YW1wbGUgZHVyaW5nIHRoZSBwYXJzaW5nIG9mIGNvbW1hbmQgbGluZSBvcHRpb25zLiBIb3dldmVyLAorICAvLy8gZGlhZ25vc3RpY3Mgd2l0aCBzb3VyY2UgcmFuZ2UgaW5mb3JtYXRpb24gYXJlIHJlcXVpcmVkIHRvIG9ubHkgYmUgZW1pdHRlZAorICAvLy8gaW4gYmV0d2VlbiBCZWdpblNvdXJjZUZpbGUoKSBhbmQgRW5kU291cmNlRmlsZSgpLgorICAvLy8KKyAgLy8vIFxwYXJhbSBMYW5nT3B0cyBUaGUgbGFuZ3VhZ2Ugb3B0aW9ucyBmb3IgdGhlIHNvdXJjZSBmaWxlIGJlaW5nIHByb2Nlc3NlZC4KKyAgLy8vIFxwYXJhbSBQUCBUaGUgcHJlcHJvY2Vzc29yIG9iamVjdCBiZWluZyB1c2VkIGZvciB0aGUgc291cmNlOyB0aGlzIGlzIAorICAvLy8gb3B0aW9uYWwsIGUuZy4sIGl0IG1heSBub3QgYmUgcHJlc2VudCB3aGVuIHByb2Nlc3NpbmcgQVNUIHNvdXJjZSBmaWxlcy4KKyAgdmlydHVhbCB2b2lkIEJlZ2luU291cmNlRmlsZShjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJlcHJvY2Vzc29yICpQUCA9IG51bGxwdHIpIHt9CisKKyAgLy8vIFxicmllZiBDYWxsYmFjayB0byBpbmZvcm0gdGhlIGRpYWdub3N0aWMgY2xpZW50IHRoYXQgcHJvY2Vzc2luZworICAvLy8gb2YgYSBzb3VyY2UgZmlsZSBoYXMgZW5kZWQuCisgIC8vLworICAvLy8gVGhlIGRpYWdub3N0aWMgY2xpZW50IHNob3VsZCBhc3N1bWUgdGhhdCBhbnkgb2JqZWN0cyBtYWRlIGF2YWlsYWJsZSB2aWEKKyAgLy8vIEJlZ2luU291cmNlRmlsZSgpIGFyZSBpbmFjY2Vzc2libGUuCisgIHZpcnR1YWwgdm9pZCBFbmRTb3VyY2VGaWxlKCkge30KKworICAvLy8gXGJyaWVmIENhbGxiYWNrIHRvIGluZm9ybSB0aGUgZGlhZ25vc3RpYyBjbGllbnQgdGhhdCBwcm9jZXNzaW5nIG9mIGFsbAorICAvLy8gc291cmNlIGZpbGVzIGhhcyBlbmRlZC4KKyAgdmlydHVhbCB2b2lkIGZpbmlzaCgpIHt9CisKKyAgLy8vIFxicmllZiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGlhZ25vc3RpY3MgaGFuZGxlZCBieSB0aGlzCisgIC8vLyBEaWFnbm9zdGljQ29uc3VtZXIgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBudW1iZXIgb2YgZGlhZ25vc3RpY3MKKyAgLy8vIHJlcG9ydGVkIGJ5IERpYWdub3N0aWNzRW5naW5lLgorICAvLy8KKyAgLy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdHJ1ZS4KKyAgdmlydHVhbCBib29sIEluY2x1ZGVJbkRpYWdub3N0aWNDb3VudHMoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEhhbmRsZSB0aGlzIGRpYWdub3N0aWMsIHJlcG9ydGluZyBpdCB0byB0aGUgdXNlciBvcgorICAvLy8gY2FwdHVyaW5nIGl0IHRvIGEgbG9nIGFzIG5lZWRlZC4KKyAgLy8vCisgIC8vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IGtlZXBzIHRyYWNrIG9mIHRoZSB0b3RhbCBudW1iZXIgb2YKKyAgLy8vIHdhcm5pbmdzIGFuZCBlcnJvcnMuCisgIHZpcnR1YWwgdm9pZCBIYW5kbGVEaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBEaWFnTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWMgJkluZm8pOworfTsKKworLy8vIFxicmllZiBBIGRpYWdub3N0aWMgY2xpZW50IHRoYXQgaWdub3JlcyBhbGwgZGlhZ25vc3RpY3MuCitjbGFzcyBJZ25vcmluZ0RpYWdDb25zdW1lciA6IHB1YmxpYyBEaWFnbm9zdGljQ29uc3VtZXIgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKKyAgdm9pZCBIYW5kbGVEaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBEaWFnTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljICZJbmZvKSBvdmVycmlkZSB7CisgICAgLy8gSnVzdCBpZ25vcmUgaXQuCisgIH0KK307CisKKy8vLyBcYnJpZWYgRGlhZ25vc3RpYyBjb25zdW1lciB0aGF0IGZvcndhcmRzIGRpYWdub3N0aWNzIGFsb25nIHRvIGFuCisvLy8gZXhpc3RpbmcsIGFscmVhZHktaW5pdGlhbGl6ZWQgZGlhZ25vc3RpYyBjb25zdW1lci4KKy8vLworY2xhc3MgRm9yd2FyZGluZ0RpYWdub3N0aWNDb25zdW1lciA6IHB1YmxpYyBEaWFnbm9zdGljQ29uc3VtZXIgeworICBEaWFnbm9zdGljQ29uc3VtZXIgJlRhcmdldDsKKworcHVibGljOgorICBGb3J3YXJkaW5nRGlhZ25vc3RpY0NvbnN1bWVyKERpYWdub3N0aWNDb25zdW1lciAmVGFyZ2V0KSA6IFRhcmdldChUYXJnZXQpIHt9CisgIH5Gb3J3YXJkaW5nRGlhZ25vc3RpY0NvbnN1bWVyKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBIYW5kbGVEaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBEaWFnTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljICZJbmZvKSBvdmVycmlkZTsKKyAgdm9pZCBjbGVhcigpIG92ZXJyaWRlOworCisgIGJvb2wgSW5jbHVkZUluRGlhZ25vc3RpY0NvdW50cygpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8gU3RydWN0IHVzZWQgZm9yIHNlbmRpbmcgaW5mbyBhYm91dCBob3cgYSB0eXBlIHNob3VsZCBiZSBwcmludGVkLgorc3RydWN0IFRlbXBsYXRlRGlmZlR5cGVzIHsKKyAgaW50cHRyX3QgRnJvbVR5cGU7CisgIGludHB0cl90IFRvVHlwZTsKKyAgdW5zaWduZWQgUHJpbnRUcmVlIDogMTsKKyAgdW5zaWduZWQgUHJpbnRGcm9tVHlwZSA6IDE7CisgIHVuc2lnbmVkIEVsaWRlVHlwZSA6IDE7CisgIHVuc2lnbmVkIFNob3dDb2xvcnMgOiAxOworCisgIC8vIFRoZSBwcmludGVyIHNldHMgdGhpcyB2YXJpYWJsZSB0byB0cnVlIGlmIHRoZSB0ZW1wbGF0ZSBkaWZmIHdhcyB1c2VkLgorICB1bnNpZ25lZCBUZW1wbGF0ZURpZmZVc2VkIDogMTsKK307CisKKy8vLyBTcGVjaWFsIGNoYXJhY3RlciB0aGF0IHRoZSBkaWFnbm9zdGljIHByaW50ZXIgd2lsbCB1c2UgdG8gdG9nZ2xlIHRoZSBib2xkCisvLy8gYXR0cmlidXRlLiAgVGhlIGNoYXJhY3RlciBpdHNlbGYgd2lsbCBiZSBub3QgYmUgcHJpbnRlZC4KK2NvbnN0IGNoYXIgVG9nZ2xlSGlnaGxpZ2h0ID0gMTI3OworCisvLy8gUHJvY2Vzc1dhcm5pbmdPcHRpb25zIC0gSW5pdGlhbGl6ZSB0aGUgZGlhZ25vc3RpYyBjbGllbnQgYW5kIHByb2Nlc3MgdGhlCisvLy8gd2FybmluZyBvcHRpb25zIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgordm9pZCBQcm9jZXNzV2FybmluZ09wdGlvbnMoRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY09wdGlvbnMgJk9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJlcG9ydERpYWdzID0gdHJ1ZSk7CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0JBU0lDX0RJQUdOT1NUSUNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0FTVEtpbmRzLmluYyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNBU1RLaW5kcy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmZWIyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNBU1RLaW5kcy5pbmMKQEAgLTAsMCArMSwxMTUgQEAKKyNpZmRlZiBBU1RTVEFSVAorX19BU1RTVEFSVCA9IERJQUdfU1RBUlRfQVNULAorI3VuZGVmIEFTVFNUQVJUCisjZW5kaWYKKworRElBRyhlcnJfYXNtX2VtcHR5X3N5bWJvbGljX29wZXJhbmRfbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJlbXB0eSBzeW1ib2xpYyBvcGVyYW5kIG5hbWUgaW4gaW5saW5lIGFzc2VtYmx5IHN0cmluZyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTIpCitESUFHKGVycl9hc21faW52YWxpZF9lc2NhcGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCAlJSBlc2NhcGUgaW4gaW5saW5lIGFzc2VtYmx5IHN0cmluZyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTIpCitESUFHKGVycl9hc21faW52YWxpZF9vcGVyYW5kX251bWJlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIG9wZXJhbmQgbnVtYmVyIGluIGlubGluZSBhc20gc3RyaW5nIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMikKK0RJQUcoZXJyX2FzbV91bmtub3duX3N5bWJvbGljX29wZXJhbmRfbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmtub3duIHN5bWJvbGljIG9wZXJhbmQgbmFtZSBpbiBpbmxpbmUgYXNzZW1ibHkgc3RyaW5nIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMikKK0RJQUcoZXJyX2FzbV91bnRlcm1pbmF0ZWRfc3ltYm9saWNfb3BlcmFuZF9uYW1lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVudGVybWluYXRlZCBzeW1ib2xpYyBvcGVyYW5kIG5hbWUgaW4gaW5saW5lIGFzc2VtYmx5IHN0cmluZyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTIpCitESUFHKGVycl9vZHJfZGlmZmVyZW50X251bV90ZW1wbGF0ZV9wYXJhbWV0ZXJzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRlbXBsYXRlIHBhcmFtZXRlciBsaXN0cyBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBwYXJhbWV0ZXJzICglMCB2cyAlMSkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9vZHJfZGlmZmVyZW50X3RlbXBsYXRlX3BhcmFtZXRlcl9raW5kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRlbXBsYXRlIHBhcmFtZXRlciBoYXMgZGlmZmVyZW50IGtpbmRzIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX29kcl9maWVsZF90eXBlX2luY29uc2lzdGVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmaWVsZCAlMCBkZWNsYXJlZCB3aXRoIGluY29tcGF0aWJsZSB0eXBlcyBpbiBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMgKCUxIHZzLiAlMikiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9vZHJfZnVuY3Rpb25fdHlwZV9pbmNvbnNpc3RlbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXh0ZXJuYWwgZnVuY3Rpb24gJTAgZGVjbGFyZWQgd2l0aCBpbmNvbXBhdGlibGUgdHlwZXMgaW4gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzICglMSB2cy4gJTIpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfb2RyX2l2YXJfdHlwZV9pbmNvbnNpc3RlbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5zdGFuY2UgdmFyaWFibGUgJTAgZGVjbGFyZWQgd2l0aCBpbmNvbXBhdGlibGUgdHlwZXMgaW4gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzICglMSB2cy4gJTIpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfb2RyX25vbl90eXBlX3BhcmFtZXRlcl90eXBlX2luY29uc2lzdGVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVjbGFyZWQgd2l0aCBpbmNvbXBhdGlibGUgdHlwZXMgaW4gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzICglMCB2cy4gJTEpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfb2RyX29iamNfbWV0aG9kX251bV9wYXJhbXNfaW5jb25zaXN0ZW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7Y2xhc3N8aW5zdGFuY2V9MCBtZXRob2QgJTEgaGFzIGEgZGlmZmVyZW50IG51bWJlciBvZiBwYXJhbWV0ZXJzIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cyAoJTIgdnMuICUzKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX29kcl9vYmpjX21ldGhvZF9wYXJhbV90eXBlX2luY29uc2lzdGVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2NsYXNzfGluc3RhbmNlfTAgbWV0aG9kICUxIGhhcyBhIHBhcmFtZXRlciB3aXRoIGEgZGlmZmVyZW50IHR5cGVzIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cyAoJTIgdnMuICUzKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX29kcl9vYmpjX21ldGhvZF9yZXN1bHRfdHlwZV9pbmNvbnNpc3RlbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtjbGFzc3xpbnN0YW5jZX0wIG1ldGhvZCAlMSBoYXMgaW5jb21wYXRpYmxlIHJlc3VsdCB0eXBlcyBpbiBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMgKCUyIHZzLiAlMykiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9vZHJfb2JqY19tZXRob2RfdmFyaWFkaWNfaW5jb25zaXN0ZW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7Y2xhc3N8aW5zdGFuY2V9MCBtZXRob2QgJTEgaXMgdmFyaWFkaWMgaW4gb25lIHRyYW5zbGF0aW9uIHVuaXQgYW5kIG5vdCB2YXJpYWRpYyBpbiBhbm90aGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfb2RyX29iamNfcHJvcGVydHlfaW1wbF9raW5kX2luY29uc2lzdGVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwcm9wZXJ0eSAlMCBpcyBpbXBsZW1lbnRlZCB3aXRoICVzZWxlY3R7QHN5bnRoZXNpemV8QGR5bmFtaWN9MSBpbiBvbmUgdHJhbnNsYXRpb24gYnV0ICVzZWxlY3R7QGR5bmFtaWN8QHN5bnRoZXNpemV9MSBpbiBhbm90aGVyIHRyYW5zbGF0aW9uIHVuaXQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9vZHJfb2JqY19wcm9wZXJ0eV90eXBlX2luY29uc2lzdGVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwcm9wZXJ0eSAlMCBkZWNsYXJlZCB3aXRoIGluY29tcGF0aWJsZSB0eXBlcyBpbiBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMgKCUxIHZzLiAlMikiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9vZHJfb2JqY19zdXBlcmNsYXNzX2luY29uc2lzdGVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjbGFzcyAlMCBoYXMgaW5jb21wYXRpYmxlIHN1cGVyY2xhc3NlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX29kcl9vYmpjX3N5bnRoZXNpemVfaXZhcl9pbmNvbnNpc3RlbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicHJvcGVydHkgJTAgaXMgc3ludGhlc2l6ZWQgdG8gZGlmZmVyZW50IGl2YXJzIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cyAoJTEgdnMuICUyKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX29kcl9wYXJhbWV0ZXJfcGFja19ub25fcGFjaywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwYXJhbWV0ZXIga2luZCBtaXNtYXRjaDsgcGFyYW1ldGVyIGlzICVzZWxlY3R7bm90IGF8YX0wIHBhcmFtZXRlciBwYWNrIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfb2RyX3RhZ190eXBlX2luY29uc2lzdGVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlICUwIGhhcyBpbmNvbXBhdGlibGUgZGVmaW5pdGlvbnMgaW4gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfb2RyX3ZhcmlhYmxlX211bHRpcGxlX2RlZiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHRlcm5hbCB2YXJpYWJsZSAlMCBkZWZpbmVkIGluIG11bHRpcGxlIHRyYW5zbGF0aW9uIHVuaXRzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfb2RyX3ZhcmlhYmxlX3R5cGVfaW5jb25zaXN0ZW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4dGVybmFsIHZhcmlhYmxlICUwIGRlY2xhcmVkIHdpdGggaW5jb21wYXRpYmxlIHR5cGVzIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cyAoJTEgdnMuICUyKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX3Vuc3VwcG9ydGVkX2FzdF9ub2RlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBpbXBvcnQgdW5zdXBwb3J0ZWQgQVNUIG5vZGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl92ZnRhYmxlX2FtYmlndW91c19jb21wb25lbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYW1iaWd1b3VzIHZmdGFibGUgY29tcG9uZW50IGZvciAlMCBpbnRyb2R1Y2VkIHZpYSBjb3ZhcmlhbnQgdGh1bmtzOyB0aGlzIGlzIGFuIGluaGVyZW50IGxpbWl0YXRpb24gb2YgdGhlIEFCSSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMjMpCitESUFHKG5vdGVfY29uc3RleHByX2FjY2Vzc19pbmFjdGl2ZV91bmlvbl9tZW1iZXIsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e3JlYWQgb2Z8YXNzaWdubWVudCB0b3xpbmNyZW1lbnQgb2Z8ZGVjcmVtZW50IG9mfTAgbWVtYmVyICUxIG9mIHVuaW9uIHdpdGggJXNlbGVjdHthY3RpdmUgbWVtYmVyICUzfG5vIGFjdGl2ZSBtZW1iZXJ9MiBpcyBub3QgYWxsb3dlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfYWNjZXNzX251bGwsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e3JlYWQgb2Z8YXNzaWdubWVudCB0b3xpbmNyZW1lbnQgb2Z8ZGVjcmVtZW50IG9mfTAgZGVyZWZlcmVuY2VkIG51bGwgcG9pbnRlciBpcyBub3QgYWxsb3dlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfYWNjZXNzX3Bhc3RfZW5kLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJXNlbGVjdHtyZWFkIG9mfGFzc2lnbm1lbnQgdG98aW5jcmVtZW50IG9mfGRlY3JlbWVudCBvZn0wIGRlcmVmZXJlbmNlZCBvbmUtcGFzdC10aGUtZW5kIHBvaW50ZXIgaXMgbm90IGFsbG93ZWQgaW4gYSBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX2FjY2Vzc19zdGF0aWNfdGVtcG9yYXJ5LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJXNlbGVjdHtyZWFkIG9mfGFzc2lnbm1lbnQgdG98aW5jcmVtZW50IG9mfGRlY3JlbWVudCBvZn0wIHRlbXBvcmFyeSBpcyBub3QgYWxsb3dlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24gb3V0c2lkZSB0aGUgZXhwcmVzc2lvbiB0aGF0IGNyZWF0ZWQgdGhlIHRlbXBvcmFyeSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9hY2Nlc3NfdW5pbml0LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJXNlbGVjdHtyZWFkIG9mfGFzc2lnbm1lbnQgdG98aW5jcmVtZW50IG9mfGRlY3JlbWVudCBvZn0wIG9iamVjdCBvdXRzaWRlIGl0cyBsaWZldGltZSBpcyBub3QgYWxsb3dlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfYWNjZXNzX3Vuc2l6ZWRfYXJyYXksIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e3JlYWQgb2Z8YXNzaWdubWVudCB0b3xpbmNyZW1lbnQgb2Z8ZGVjcmVtZW50IG9mfTAgcG9pbnRlciB0byBlbGVtZW50IG9mIGFycmF5IHdpdGhvdXQga25vd24gYm91bmQgaXMgbm90IGFsbG93ZWQgaW4gYSBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX2FjY2Vzc192b2xhdGlsZV9vYmosIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e3JlYWQgb2Z8YXNzaWdubWVudCB0b3xpbmNyZW1lbnQgb2Z8ZGVjcmVtZW50IG9mfTAgdm9sYXRpbGUgJXNlbGVjdHt0ZW1wb3Jhcnl8b2JqZWN0ICUyfG1lbWJlciAlMn0xIGlzIG5vdCBhbGxvd2VkIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9hY2Nlc3Nfdm9sYXRpbGVfdHlwZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiVzZWxlY3R7cmVhZCBvZnxhc3NpZ25tZW50IHRvfGluY3JlbWVudCBvZnxkZWNyZW1lbnQgb2Z9MCB2b2xhdGlsZS1xdWFsaWZpZWQgdHlwZSAlMSBpcyBub3QgYWxsb3dlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfYXJyYXlfaW5kZXgsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjYW5ub3QgcmVmZXIgdG8gZWxlbWVudCAlMCBvZiAlc2VsZWN0e2FycmF5IG9mICUyIGVsZW1lbnQlcGx1cmFsezE6fDpzfTJ8bm9uLWFycmF5IG9iamVjdH0xIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9iYWFfaW5zdWZmaWNpZW50X2FsaWdubWVudCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiVzZWxlY3R7YWxpZ25tZW50IG9mfG9mZnNldCBvZiB0aGUgYWxpZ25lZCBwb2ludGVyIGZyb219MCB0aGUgYmFzZSBwb2ludGVlIG9iamVjdCAoJTEgJXBsdXJhbHsxOmJ5dGV8OmJ5dGVzfTEpIGlzICVzZWxlY3R7bGVzcyB0aGFufG5vdCBhIG11bHRpcGxlIG9mfTAgdGhlIGFzc2VydGVkICUyICVwbHVyYWx7MTpieXRlfDpieXRlc30yIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX2JhYV92YWx1ZV9pbnN1ZmZpY2llbnRfYWxpZ25tZW50LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidmFsdWUgb2YgdGhlIGFsaWduZWQgcG9pbnRlciAoJTApIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBhc3NlcnRlZCAlMSAlcGx1cmFsezE6Ynl0ZXw6Ynl0ZXN9MSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9jYWxsX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbiBjYWxsIHRvICclMCciLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfY2FsbF9saW1pdF9leGNlZWRlZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNvbnN0ZXhwciBldmFsdWF0aW9uIGhpdCBtYXhpbXVtIGNhbGwgbGltaXQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfY2FsbHNfc3VwcHJlc3NlZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIihza2lwcGluZyAlMCBjYWxsJXMwIGluIGJhY2t0cmFjZTsgdXNlIC1mY29uc3RleHByLWJhY2t0cmFjZS1saW1pdD0wIHRvIHNlZSBhbGwpIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX2NvbXBhcmVfdmlydHVhbF9tZW1fcHRyLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY29tcGFyaXNvbiBvZiBwb2ludGVyIHRvIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9uICUwIGhhcyB1bnNwZWNpZmllZCB2YWx1ZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9jb25kaXRpb25hbF9uZXZlcl9jb25zdCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImJvdGggYXJtcyBvZiBjb25kaXRpb25hbCBvcGVyYXRvciBhcmUgdW5hYmxlIHRvIHByb2R1Y2UgYSBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX2RlcHRoX2xpbWl0X2V4Y2VlZGVkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY29uc3RleHByIGV2YWx1YXRpb24gZXhjZWVkZWQgbWF4aW11bSBkZXB0aCBvZiAlMCBjYWxscyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9mbG9hdF9hcml0aG1ldGljLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyBwcm9kdWNlcyAlc2VsZWN0e2FuIGluZmluaXR5fGEgTmFOfTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfaW5oZXJpdGVkX2N0b3JfY2FsbF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW4gaW1wbGljaXQgaW5pdGlhbGl6YXRpb24gZm9yIGluaGVyaXRlZCBjb25zdHJ1Y3RvciBvZiAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9pbnZhbGlkX2Nhc3QsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e3JlaW50ZXJwcmV0X2Nhc3R8ZHluYW1pY19jYXN0fGNhc3QgdGhhdCBwZXJmb3JtcyB0aGUgY29udmVyc2lvbnMgb2YgYSByZWludGVycHJldF9jYXN0fGNhc3QgZnJvbSAlMX0wIGlzIG5vdCBhbGxvd2VkIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9pbnZhbGlkX2Rvd25jYXN0LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2Fubm90IGNhc3Qgb2JqZWN0IG9mIGR5bmFtaWMgdHlwZSAlMCB0byB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX2ludmFsaWRfZnVuY3Rpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e25vbi1jb25zdGV4cHJ8dW5kZWZpbmVkfTAgJXNlbGVjdHtmdW5jdGlvbnxjb25zdHJ1Y3Rvcn0xICUyIGNhbm5vdCBiZSB1c2VkIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9pbnZhbGlkX2luaGN0b3IsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjb25zdHJ1Y3RvciBpbmhlcml0ZWQgZnJvbSBiYXNlIGNsYXNzICUwIGNhbm5vdCBiZSB1c2VkIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbjsgZGVyaXZlZCBjbGFzcyBjYW5ub3QgYmUgaW1wbGljaXRseSBpbml0aWFsaXplZCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9sYXJnZV9zaGlmdCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInNoaWZ0IGNvdW50ICUwID49IHdpZHRoIG9mIHR5cGUgJTEgKCUyIGJpdCVzMikiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfbGlmZXRpbWVfZW5kZWQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e3JlYWQgb2Z8YXNzaWdubWVudCB0b3xpbmNyZW1lbnQgb2Z8ZGVjcmVtZW50IG9mfTAgJXNlbGVjdHt0ZW1wb3Jhcnl8dmFyaWFibGV9MSB3aG9zZSBsaWZldGltZSBoYXMgZW5kZWQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfbHNoaWZ0X2Rpc2NhcmRzLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAic2lnbmVkIGxlZnQgc2hpZnQgZGlzY2FyZHMgYml0cyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9sc2hpZnRfb2ZfbmVnYXRpdmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJsZWZ0IHNoaWZ0IG9mIG5lZ2F0aXZlIHZhbHVlICUwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX2x0b3JfbXV0YWJsZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInJlYWQgb2YgbXV0YWJsZSBtZW1iZXIgJTAgaXMgbm90IGFsbG93ZWQgaW4gYSBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX2x0b3Jfbm9uX2NvbnN0X2ludCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInJlYWQgb2Ygbm9uLWNvbnN0IHZhcmlhYmxlICUwIGlzIG5vdCBhbGxvd2VkIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9sdG9yX25vbl9jb25zdGV4cHIsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJyZWFkIG9mIG5vbi1jb25zdGV4cHIgdmFyaWFibGUgJTAgaXMgbm90IGFsbG93ZWQgaW4gYSBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX21vZGlmeV9jb25zdF90eXBlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAibW9kaWZpY2F0aW9uIG9mIG9iamVjdCBvZiBjb25zdC1xdWFsaWZpZWQgdHlwZSAlMCBpcyBub3QgYWxsb3dlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfbW9kaWZ5X2dsb2JhbCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImEgY29uc3RhbnQgZXhwcmVzc2lvbiBjYW5ub3QgbW9kaWZ5IGFuIG9iamVjdCB0aGF0IGlzIHZpc2libGUgb3V0c2lkZSB0aGF0IGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfbmVnYXRpdmVfc2hpZnQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJuZWdhdGl2ZSBzaGlmdCBjb3VudCAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9ub19yZXR1cm4sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjb250cm9sIHJlYWNoZWQgZW5kIG9mIGNvbnN0ZXhwciBmdW5jdGlvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9ub25fZ2xvYmFsLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJXNlbGVjdHtwb2ludGVyfHJlZmVyZW5jZX0wIHRvICVzZWxlY3R7fHN1Ym9iamVjdCBvZiB9MSVzZWxlY3R7dGVtcG9yYXJ5fCUzfTIgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9ub25saXRlcmFsLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAibm9uLWxpdGVyYWwgdHlwZSAlMCBjYW5ub3QgYmUgdXNlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfbnVsbF9zdWJvYmplY3QsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjYW5ub3QgJXNlbGVjdHthY2Nlc3MgYmFzZSBjbGFzcyBvZnxhY2Nlc3MgZGVyaXZlZCBjbGFzcyBvZnxhY2Nlc3MgZmllbGQgb2Z8YWNjZXNzIGFycmF5IGVsZW1lbnQgb2Z8cGVyZm9ybSBwb2ludGVyIGFyaXRobWV0aWMgb258Y2FsbCBtZW1iZXIgZnVuY3Rpb24gb258YWNjZXNzIHJlYWwgY29tcG9uZW50IG9mfGFjY2VzcyBpbWFnaW5hcnkgY29tcG9uZW50IG9mfTAgbnVsbCBwb2ludGVyIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX292ZXJmbG93LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidmFsdWUgJTAgaXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgcmVwcmVzZW50YWJsZSB2YWx1ZXMgb2YgdHlwZSAlMSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9wYXN0X2VuZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRlcmVmZXJlbmNlZCBwb2ludGVyIHBhc3QgdGhlIGVuZCBvZiAlc2VsZWN0e3xzdWJvYmplY3Qgb2YgfTAlc2VsZWN0e3RlbXBvcmFyeXwlMn0xIGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfcGFzdF9lbmRfc3Vib2JqZWN0LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2Fubm90ICVzZWxlY3R7YWNjZXNzIGJhc2UgY2xhc3Mgb2Z8YWNjZXNzIGRlcml2ZWQgY2xhc3Mgb2Z8YWNjZXNzIGZpZWxkIG9mfGFjY2VzcyBhcnJheSBlbGVtZW50IG9mfEVSUk9SfGNhbGwgbWVtYmVyIGZ1bmN0aW9uIG9ufGFjY2VzcyByZWFsIGNvbXBvbmVudCBvZnxhY2Nlc3MgaW1hZ2luYXJ5IGNvbXBvbmVudCBvZn0wIHBvaW50ZXIgcGFzdCB0aGUgZW5kIG9mIG9iamVjdCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9wb2ludGVyX2NvbXBhcmlzb25fYmFzZV9jbGFzc2VzLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY29tcGFyaXNvbiBvZiBhZGRyZXNzZXMgb2Ygc3Vib2JqZWN0cyBvZiBkaWZmZXJlbnQgYmFzZSBjbGFzc2VzIGhhcyB1bnNwZWNpZmllZCB2YWx1ZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9wb2ludGVyX2NvbXBhcmlzb25fYmFzZV9maWVsZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNvbXBhcmlzb24gb2YgYWRkcmVzcyBvZiBiYXNlIGNsYXNzIHN1Ym9iamVjdCAlMCBvZiBjbGFzcyAlMSB0byBmaWVsZCAlMiBoYXMgdW5zcGVjaWZpZWQgdmFsdWUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfcG9pbnRlcl9jb21wYXJpc29uX2RpZmZlcmluZ19hY2Nlc3MsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjb21wYXJpc29uIG9mIGFkZHJlc3Mgb2YgZmllbGRzICUwIGFuZCAlMiBvZiAlNCB3aXRoIGRpZmZlcmluZyBhY2Nlc3Mgc3BlY2lmaWVycyAoJTEgdnMgJTMpIGhhcyB1bnNwZWNpZmllZCB2YWx1ZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl9wb2ludGVyX3N1YnRyYWN0aW9uX25vdF9zYW1lX2FycmF5LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAic3VidHJhY3RlZCBwb2ludGVycyBhcmUgbm90IGVsZW1lbnRzIG9mIHRoZSBzYW1lIGFycmF5IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX3BvaW50ZXJfc3VidHJhY3Rpb25femVyb19zaXplLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAic3VidHJhY3Rpb24gb2YgcG9pbnRlcnMgdG8gdHlwZSAlMCBvZiB6ZXJvIHNpemUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfc3RlcF9saW1pdF9leGNlZWRlZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNvbnN0ZXhwciBldmFsdWF0aW9uIGhpdCBtYXhpbXVtIHN0ZXAgbGltaXQ7IHBvc3NpYmxlIGluZmluaXRlIGxvb3A/IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX3N0bXRfZXhwcl91bnN1cHBvcnRlZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInRoaXMgdXNlIG9mIHN0YXRlbWVudCBleHByZXNzaW9ucyBpcyBub3Qgc3VwcG9ydGVkIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl90ZW1wb3JhcnlfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInRlbXBvcmFyeSBjcmVhdGVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfdGhpcywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiVzZWxlY3R7fGltcGxpY2l0IH0wdXNlIG9mICd0aGlzJyBwb2ludGVyIGlzIG9ubHkgYWxsb3dlZCB3aXRoaW4gdGhlIGV2YWx1YXRpb24gb2YgYSBjYWxsIHRvIGEgJ2NvbnN0ZXhwcicgbWVtYmVyIGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX3R5cGVpZF9wb2x5bW9ycGhpYywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInR5cGVpZCBhcHBsaWVkIHRvIGV4cHJlc3Npb24gb2YgcG9seW1vcnBoaWMgdHlwZSAlMCBpcyBub3QgYWxsb3dlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfdW5pbml0aWFsaXplZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiVzZWxlY3R7fHN1Yn0wb2JqZWN0IG9mIHR5cGUgJTEgaXMgbm90IGluaXRpYWxpemVkIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX3Vuc2l6ZWRfYXJyYXlfaW5kZXhlZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImluZGV4aW5nIG9mIGFycmF5IHdpdGhvdXQga25vd24gYm91bmQgaXMgbm90IGFsbG93ZWQgaW4gYSBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX3Vuc3VwcG9ydGVkX3Vuc2l6ZWRfYXJyYXksIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJhcnJheS10by1wb2ludGVyIGRlY2F5IG9mIGFycmF5IG1lbWJlciB3aXRob3V0IGtub3duIGJvdW5kIGlzIG5vdCBzdXBwb3J0ZWQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9jb25zdGV4cHJfdXNlX3VuaW5pdF9yZWZlcmVuY2UsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ1c2Ugb2YgcmVmZXJlbmNlIG91dHNpZGUgaXRzIGxpZmV0aW1lIGlzIG5vdCBhbGxvd2VkIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvbnN0ZXhwcl92YXJfaW5pdF9ub25fY29uc3RhbnQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbml0aWFsaXplciBvZiAlMCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX3ZpcnR1YWxfYmFzZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbm5vdCBjb25zdHJ1Y3Qgb2JqZWN0IG9mIHR5cGUgJTAgd2l0aCB2aXJ0dWFsIGJhc2UgY2xhc3MgaW4gYSBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX3ZpcnR1YWxfY2FsbCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbm5vdCBldmFsdWF0ZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwgaW4gYSBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfY29uc3RleHByX3ZvaWRfY29tcGFyaXNvbiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNvbXBhcmlzb24gYmV0d2VlbiB1bmVxdWFsIHBvaW50ZXJzIHRvIHZvaWQgaGFzIHVuc3BlY2lmaWVkIHJlc3VsdCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2NvdmFyaWFudF90aHVuaywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNvdmFyaWFudCB0aHVuayByZXF1aXJlZCBieSAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyMykKK0RJQUcobm90ZV9leHByX2RpdmlkZV9ieV96ZXJvLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZGl2aXNpb24gYnkgemVybyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX29kcl9iYXNlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2xhc3MgaGFzIGJhc2UgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX29kcl9iaXRfZmllbGQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJiaXQtZmllbGQgJTAgd2l0aCB0eXBlICUxIGFuZCBsZW5ndGggJTIgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX29kcl9kZWZpbmVkX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJhbHNvIGRlZmluZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX29kcl9lbnVtZXJhdG9yLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZW51bWVyYXRvciAlMCB3aXRoIHZhbHVlICUxIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9vZHJfZmllbGQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJmaWVsZCAlMCBoYXMgdHlwZSAlMSBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfb2RyX2ZpZWxkX25hbWUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJmaWVsZCBoYXMgbmFtZSAlMCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfb2RyX21pc3NpbmdfYmFzZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm5vIGNvcnJlc3BvbmRpbmcgYmFzZSBjbGFzcyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfb2RyX21pc3NpbmdfZW51bWVyYXRvciwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm5vIGNvcnJlc3BvbmRpbmcgZW51bWVyYXRvciBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfb2RyX21pc3NpbmdfZmllbGQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJubyBjb3JyZXNwb25kaW5nIGZpZWxkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9vZHJfbm90X2JpdF9maWVsZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImZpZWxkICUwIGlzIG5vdCBhIGJpdC1maWVsZCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX29kcl9udW1iZXJfb2ZfYmFzZXMsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjbGFzcyBoYXMgJTAgYmFzZSAlcGx1cmFsezE6Y2xhc3N8OmNsYXNzZXN9MCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX29kcl9vYmpjX21ldGhvZF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJXNlbGVjdHtjbGFzc3xpbnN0YW5jZX0wIG1ldGhvZCAlMSBhbHNvIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9vZHJfb2JqY19taXNzaW5nX3N1cGVyY2xhc3MsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJubyBjb3JyZXNwb25kaW5nIHN1cGVyY2xhc3MgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX29kcl9vYmpjX3Byb3BlcnR5X2ltcGxfa2luZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInByb3BlcnR5ICUwIGlzIGltcGxlbWVudGVkIHdpdGggJXNlbGVjdHtAc3ludGhlc2l6ZXxAZHluYW1pY30xIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9vZHJfb2JqY19zdXBlcmNsYXNzLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW5oZXJpdHMgZnJvbSBzdXBlcmNsYXNzICUwIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9vZHJfb2JqY19zeW50aGVzaXplX2l2YXJfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInByb3BlcnR5IGlzIHN5bnRoZXNpemVkIHRvIGl2YXIgJTAgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX29kcl9wYXJhbWV0ZXJfcGFja19ub25fcGFjaywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiVzZWxlY3R7cGFyYW1ldGVyfHBhcmFtZXRlciBwYWNrfTAgZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX29kcl90YWdfa2luZF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJTAgaXMgYSAlc2VsZWN0e3N0cnVjdHxpbnRlcmZhY2V8dW5pb258Y2xhc3N8ZW51bX0xIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9vZHJfdGVtcGxhdGVfcGFyYW1ldGVyX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX29kcl90ZW1wbGF0ZV9wYXJhbWV0ZXJfbGlzdCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInRlbXBsYXRlIHBhcmFtZXRlciBsaXN0IGFsc28gZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX29kcl92YWx1ZV9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZGVjbGFyZWQgaGVyZSB3aXRoIHR5cGUgJTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9vZHJfdmlydHVhbF9iYXNlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJXNlbGVjdHtub24tdmlydHVhbHx2aXJ0dWFsfTAgZGVyaXZhdGlvbiBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfdW5pbXBsZW1lbnRlZF9jb25zdGV4cHJfbGFtYmRhX2ZlYXR1cmVfYXN0LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidW5pbXBsZW1lbnRlZCBjb25zdGV4cHIgbGFtYmRhIGZlYXR1cmU6ICUwIChjb21pbmcgc29vbiEpIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5faW50ZWdlcl9jb25zdGFudF9vdmVyZmxvdywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAib3ZlcmZsb3cgaW4gZXhwcmVzc2lvbjsgcmVzdWx0IGlzICUwIHdpdGggdHlwZSAlMSIsIDMxMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fb2RyX3RhZ190eXBlX2luY29uc2lzdGVudCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidHlwZSAlMCBoYXMgaW5jb21wYXRpYmxlIGRlZmluaXRpb25zIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cyIsIDQ3MiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljQW5hbHlzaXNLaW5kcy5pbmMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljQW5hbHlzaXNLaW5kcy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmZjBlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNBbmFseXNpc0tpbmRzLmluYwpAQCAtMCwwICsxLDUgQEAKKyNpZmRlZiBBTkFMWVNJU1NUQVJUCitfX0FOQUxZU0lTU1RBUlQgPSBESUFHX1NUQVJUX0FOQUxZU0lTLAorI3VuZGVmIEFOQUxZU0lTU1RBUlQKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljQ2F0ZWdvcmllcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0NhdGVnb3JpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGQwNjdiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0NhdGVnb3JpZXMuaApAQCAtMCwwICsxLDI2IEBACisvLz09PS0gRGlhZ25vc3RpY0NhdGVnb3JpZXMuaCAtIERpYWdub3N0aWMgQ2F0ZWdvcmllcyBFbnVtZXJhdG9ycy0qLSBDKysgLSo9PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfRElBR05PU1RJQ0NBVEVHT1JJRVNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX0RJQUdOT1NUSUNDQVRFR09SSUVTX0gKKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgbmFtZXNwYWNlIGRpYWcgeworICAgIGVudW0geworI2RlZmluZSBHRVRfQ0FURUdPUllfVEFCTEUKKyNkZWZpbmUgQ0FURUdPUlkoWCwgRU5VTSkgRU5VTSwKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljR3JvdXBzLmluYyIKKyN1bmRlZiBDQVRFR09SWQorI3VuZGVmIEdFVF9DQVRFR09SWV9UQUJMRQorICAgICAgRGlhZ0NhdF9OVU1fQ0FURUdPUklFUworICAgIH07CisgIH0gIC8vIGVuZCBuYW1lc3BhY2UgZGlhZworfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNDb21tZW50S2luZHMuaW5jIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0NvbW1lbnRLaW5kcy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE1MjQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNDb21tZW50S2luZHMuaW5jCkBAIC0wLDAgKzEsMzkgQEAKKyNpZmRlZiBDT01NRU5UU1RBUlQKK19fQ09NTUVOVFNUQVJUID0gRElBR19TVEFSVF9DT01NRU5ULAorI3VuZGVmIENPTU1FTlRTVEFSVAorI2VuZGlmCisKK0RJQUcobm90ZV9hZGRfZGVwcmVjYXRpb25fYXR0ciwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImFkZCBhIGRlcHJlY2F0aW9uIGF0dHJpYnV0ZSB0byB0aGUgZGVjbGFyYXRpb24gdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmciLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjUpCitESUFHKG5vdGVfZG9jX2Jsb2NrX2NvbW1hbmRfcHJldmlvdXMsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwcmV2aW91cyBjb21tYW5kICclc2VsZWN0e1xcfEB9MCUxJyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI1KQorRElBRyhub3RlX2RvY19ibG9ja19jb21tYW5kX3ByZXZpb3VzX2FsaWFzLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJldmlvdXMgY29tbWFuZCAnJXNlbGVjdHtcXHxAfTAlMScgKGFuIGFsaWFzIG9mICdcXCUyJykgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNSkKK0RJQUcobm90ZV9kb2NfaHRtbF9lbmRfdGFnLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZW5kIHRhZyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNSkKK0RJQUcobm90ZV9kb2NfaHRtbF90YWdfc3RhcnRlZF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiSFRNTCB0YWcgc3RhcnRlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI1KQorRElBRyhub3RlX2RvY19wYXJhbV9uYW1lX3N1Z2dlc3Rpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJkaWQgeW91IG1lYW4gJyUwJz8iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjUpCitESUFHKG5vdGVfZG9jX3BhcmFtX3ByZXZpb3VzLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJldmlvdXMgZG9jdW1lbnRhdGlvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNSkKK0RJQUcobm90ZV9kb2NfdHBhcmFtX25hbWVfc3VnZ2VzdGlvbiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRpZCB5b3UgbWVhbiAnJTAnPyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNSkKK0RJQUcobm90ZV9kb2NfdHBhcmFtX3ByZXZpb3VzLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJldmlvdXMgZG9jdW1lbnRhdGlvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNSkKK0RJQUcod2Fybl9jb3JyZWN0X2NvbW1lbnRfY29tbWFuZF9uYW1lLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ1bmtub3duIGNvbW1hbmQgdGFnIG5hbWUgJyUwJzsgZGlkIHlvdSBtZWFuICclMSc/IiwgMTc4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjUpCitESUFHKHdhcm5fZG9jX2FwaV9jb250YWluZXJfZGVjbF9taXNtYXRjaCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJyVzZWxlY3R7XFx8QH0wJXNlbGVjdHtjbGFzc3xpbnRlcmZhY2V8cHJvdG9jb2x8c3RydWN0fHVuaW9ufTEnIGNvbW1hbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGEgY29tbWVudCBhdHRhY2hlZCB0byBhIG5vbi0lc2VsZWN0e2NsYXNzfGludGVyZmFjZXxwcm90b2NvbHxzdHJ1Y3R8dW5pb259MiBkZWNsYXJhdGlvbiIsIDE3NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI1KQorRElBRyh3YXJuX2RvY19ibG9ja19jb21tYW5kX2R1cGxpY2F0ZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZHVwbGljYXRlZCBjb21tYW5kICclc2VsZWN0e1xcfEB9MCUxJyIsIDE3NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI1KQorRElBRyh3YXJuX2RvY19ibG9ja19jb21tYW5kX2VtcHR5X3BhcmFncmFwaCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZW1wdHkgcGFyYWdyYXBoIHBhc3NlZCB0byAnJXNlbGVjdHtcXHxAfTAlMScgY29tbWFuZCIsIDE3NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI1KQorRElBRyh3YXJuX2RvY19jb250YWluZXJfZGVjbF9taXNtYXRjaCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJyVzZWxlY3R7XFx8QH0wJXNlbGVjdHtjbGFzc2Rlc2lnbnxjb2NsYXNzfGRlcGVuZGVuY3l8aGVscGVyfGhlbHBlcmNsYXNzfGhlbHBzfGluc3RhbmNlc2l6ZXxvd25lcnNoaXB8cGVyZm9ybWFuY2V8c2VjdXJpdHl8c3VwZXJjbGFzc30xJyBjb21tYW5kIHNob3VsZCBub3QgYmUgdXNlZCBpbiBhIGNvbW1lbnQgYXR0YWNoZWQgdG8gYSBub24tY29udGFpbmVyIGRlY2xhcmF0aW9uIiwgMTc0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjUpCitESUFHKHdhcm5fZG9jX2RlcHJlY2F0ZWRfbm90X3N5bmMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImRlY2xhcmF0aW9uIGlzIG1hcmtlZCB3aXRoICdcXGRlcHJlY2F0ZWQnIGNvbW1hbmQgYnV0IGRvZXMgbm90IGhhdmUgYSBkZXByZWNhdGlvbiBhdHRyaWJ1dGUiLCAxNzUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNSkKK0RJQUcod2Fybl9kb2NfZnVuY3Rpb25fbWV0aG9kX2RlY2xfbWlzbWF0Y2gsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiclc2VsZWN0e1xcfEB9MCVzZWxlY3R7ZnVuY3Rpb258ZnVuY3Rpb25ncm91cHxtZXRob2R8bWV0aG9kZ3JvdXB8Y2FsbGJhY2t9MScgY29tbWFuZCBzaG91bGQgYmUgdXNlZCBpbiBhIGNvbW1lbnQgYXR0YWNoZWQgdG8gJXNlbGVjdHthIGZ1bmN0aW9ufGEgZnVuY3Rpb258YW4gT2JqZWN0aXZlLUMgbWV0aG9kfGFuIE9iamVjdGl2ZS1DIG1ldGhvZHxhIHBvaW50ZXIgdG8gZnVuY3Rpb259MiBkZWNsYXJhdGlvbiIsIDE3NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI1KQorRElBRyh3YXJuX2RvY19odG1sX2VuZF9mb3JiaWRkZW4sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIkhUTUwgZW5kIHRhZyAnJTAnIGlzIGZvcmJpZGRlbiIsIDE3NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI1KQorRElBRyh3YXJuX2RvY19odG1sX2VuZF91bmJhbGFuY2VkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJIVE1MIGVuZCB0YWcgZG9lcyBub3QgbWF0Y2ggYW55IHN0YXJ0IHRhZyIsIDE3NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI1KQorRElBRyh3YXJuX2RvY19odG1sX21pc3NpbmdfZW5kX3RhZywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiSFRNTCB0YWcgJyUwJyByZXF1aXJlcyBhbiBlbmQgdGFnIiwgMTc2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjUpCitESUFHKHdhcm5fZG9jX2h0bWxfc3RhcnRfZW5kX21pc21hdGNoLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJIVE1MIHN0YXJ0IHRhZyAnJTAnIGNsb3NlZCBieSAnJTEnIiwgMTc2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjUpCitESUFHKHdhcm5fZG9jX2h0bWxfc3RhcnRfdGFnX2V4cGVjdGVkX2lkZW50X29yX2dyZWF0ZXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIkhUTUwgc3RhcnQgdGFnIHByZW1hdHVyZWx5IGVuZGVkLCBleHBlY3RlZCBhdHRyaWJ1dGUgbmFtZSBvciAnPiciLCAxNzQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNSkKK0RJQUcod2Fybl9kb2NfaHRtbF9zdGFydF90YWdfZXhwZWN0ZWRfcXVvdGVkX3N0cmluZywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZXhwZWN0ZWQgcXVvdGVkIHN0cmluZyBhZnRlciBlcXVhbHMgc2lnbiIsIDE3NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI1KQorRElBRyh3YXJuX2RvY19wYXJhbV9kdXBsaWNhdGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInBhcmFtZXRlciAnJTAnIGlzIGFscmVhZHkgZG9jdW1lbnRlZCIsIDE3NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI1KQorRElBRyh3YXJuX2RvY19wYXJhbV9pbnZhbGlkX2RpcmVjdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidW5yZWNvZ25pemVkIHBhcmFtZXRlciBwYXNzaW5nIGRpcmVjdGlvbiwgdmFsaWQgZGlyZWN0aW9ucyBhcmUgJ1tpbl0nLCAnW291dF0nIGFuZCAnW2luLG91dF0nIiwgMTc0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjUpCitESUFHKHdhcm5fZG9jX3BhcmFtX25vdF9hdHRhY2hlZF90b19hX2Z1bmN0aW9uX2RlY2wsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiclc2VsZWN0e1xcfEB9MHBhcmFtJyBjb21tYW5kIHVzZWQgaW4gYSBjb21tZW50IHRoYXQgaXMgbm90IGF0dGFjaGVkIHRvIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24iLCAxNzQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNSkKK0RJQUcod2Fybl9kb2NfcGFyYW1fbm90X2ZvdW5kLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJwYXJhbWV0ZXIgJyUwJyBub3QgZm91bmQgaW4gdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIiwgMTc0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjUpCitESUFHKHdhcm5fZG9jX3BhcmFtX3NwYWNlc19pbl9kaXJlY3Rpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIndoaXRlc3BhY2UgaXMgbm90IGFsbG93ZWQgaW4gcGFyYW1ldGVyIHBhc3NpbmcgZGlyZWN0aW9uIiwgMTc3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjUpCitESUFHKHdhcm5fZG9jX3JldHVybnNfYXR0YWNoZWRfdG9fYV92b2lkX2Z1bmN0aW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICInJXNlbGVjdHtcXHxAfTAlMScgY29tbWFuZCB1c2VkIGluIGEgY29tbWVudCB0aGF0IGlzIGF0dGFjaGVkIHRvIGEgJXNlbGVjdHtmdW5jdGlvbiByZXR1cm5pbmcgdm9pZHxjb25zdHJ1Y3RvcnxkZXN0cnVjdG9yfG1ldGhvZCByZXR1cm5pbmcgdm9pZH0yIiwgMTc0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjUpCitESUFHKHdhcm5fZG9jX3JldHVybnNfbm90X2F0dGFjaGVkX3RvX2FfZnVuY3Rpb25fZGVjbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJyVzZWxlY3R7XFx8QH0wJTEnIGNvbW1hbmQgdXNlZCBpbiBhIGNvbW1lbnQgdGhhdCBpcyBub3QgYXR0YWNoZWQgdG8gYSBmdW5jdGlvbiBvciBtZXRob2QgZGVjbGFyYXRpb24iLCAxNzQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNSkKK0RJQUcod2Fybl9kb2NfdHBhcmFtX2R1cGxpY2F0ZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidGVtcGxhdGUgcGFyYW1ldGVyICclMCcgaXMgYWxyZWFkeSBkb2N1bWVudGVkIiwgMTc0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjUpCitESUFHKHdhcm5fZG9jX3RwYXJhbV9ub3RfYXR0YWNoZWRfdG9fYV90ZW1wbGF0ZV9kZWNsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICInJXNlbGVjdHtcXHxAfTB0cGFyYW0nIGNvbW1hbmQgdXNlZCBpbiBhIGNvbW1lbnQgdGhhdCBpcyBub3QgYXR0YWNoZWQgdG8gYSB0ZW1wbGF0ZSBkZWNsYXJhdGlvbiIsIDE3NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI1KQorRElBRyh3YXJuX2RvY190cGFyYW1fbm90X2ZvdW5kLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ0ZW1wbGF0ZSBwYXJhbWV0ZXIgJyUwJyBub3QgZm91bmQgaW4gdGhlIHRlbXBsYXRlIGRlY2xhcmF0aW9uIiwgMTc0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjUpCitESUFHKHdhcm5fdW5rbm93bl9jb21tZW50X2NvbW1hbmRfbmFtZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidW5rbm93biBjb21tYW5kIHRhZyBuYW1lIiwgMTc4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjUpCitESUFHKHdhcm5fdmVyYmF0aW1fYmxvY2tfZW5kX3dpdGhvdXRfc3RhcnQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiclc2VsZWN0e1xcfEB9MCUxJyBjb21tYW5kIGRvZXMgbm90IHRlcm1pbmF0ZSBhIHZlcmJhdGltIHRleHQgYmxvY2siLCAxNzQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNSkKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNDb21tb25LaW5kcy5pbmMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljQ29tbW9uS2luZHMuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYTYzYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljQ29tbW9uS2luZHMuaW5jCkBAIC0wLDAgKzEsOTQgQEAKKyNpZmRlZiBDT01NT05TVEFSVAorX19DT01NT05TVEFSVCA9IERJQUdfU1RBUlRfQ09NTU9OLAorI3VuZGVmIENPTU1PTlNUQVJUCisjZW5kaWYKKworRElBRyhlcnJfYXJjbXRfbnNpbnZvY2F0aW9uX293bmVyc2hpcCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJOU0ludm9jYXRpb24ncyAlMCBpcyBub3Qgc2FmZSB0byBiZSB1c2VkIHdpdGggYW4gb2JqZWN0IHdpdGggb3duZXJzaGlwIG90aGVyIHRoYW4gX191bnNhZmVfdW5yZXRhaW5lZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2F0dHJpYnV0ZV9ub3RfdHlwZV9hdHRyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGF0dHJpYnV0ZSBjYW5ub3QgYmUgYXBwbGllZCB0byB0eXBlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2Nhbm5vdF9vcGVuX2ZpbGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2Fubm90IG9wZW4gZmlsZSAnJTAnOiAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2RlZmF1bHRfc3BlY2lhbF9tZW1iZXJzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm9ubHkgc3BlY2lhbCBtZW1iZXIgZnVuY3Rpb25zIG1heSBiZSBkZWZhdWx0ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9kZWxldGVkX25vbl9mdW5jdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJvbmx5IGZ1bmN0aW9ucyBjYW4gaGF2ZSBkZWxldGVkIGRlZmluaXRpb25zIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZW51bV90ZW1wbGF0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJlbnVtZXJhdGlvbiBjYW5ub3QgYmUgYSB0ZW1wbGF0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfYWZ0ZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgJTEgYWZ0ZXIgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9jb2xvbl9hZnRlcl9zZXR0ZXJfbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtZXRob2QgbmFtZSByZWZlcmVuY2VkIGluIHByb3BlcnR5IHNldHRlciBhdHRyaWJ1dGUgbXVzdCBlbmQgd2l0aCAnOiciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9leHBlY3RlZF9laXRoZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgJTAgb3IgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9uYW1lc3BhY2VfbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBuYW1lc3BhY2UgbmFtZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX3N0cmluZ19saXRlcmFsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIHN0cmluZyBsaXRlcmFsICVzZWxlY3R7aW4gJTF8Zm9yIGRpYWdub3N0aWMgbWVzc2FnZSBpbiBzdGF0aWNfYXNzZXJ0fGZvciBvcHRpb25hbCBtZXNzYWdlIGluICdhdmFpbGFiaWxpdHknIGF0dHJpYnV0ZXxmb3IgJXNlbGVjdHtsYW5ndWFnZXxzb3VyY2UgY29udGFpbmVyfTEgbmFtZSBpbiAnZXh0ZXJuYWxfc291cmNlX3N5bWJvbCcgYXR0cmlidXRlfTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9maWxlX21vZGlmaWVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImZpbGUgJyUwJyBtb2RpZmllZCBzaW5jZSBpdCB3YXMgZmlyc3QgcHJvY2Vzc2VkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfaW50ZWdlcl9saXRlcmFsX3Rvb19sYXJnZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnRlZ2VyIGxpdGVyYWwgaXMgdG9vIGxhcmdlIHRvIGJlIHJlcHJlc2VudGVkIGluIGFueSAlc2VsZWN0e3NpZ25lZCB8fTBpbnRlZ2VyIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9pbnZhbGlkX2NoYXJhY3Rlcl91ZGwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2hhcmFjdGVyIGxpdGVyYWwgd2l0aCB1c2VyLWRlZmluZWQgc3VmZml4IGNhbm5vdCBiZSB1c2VkIGhlcmUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9pbnZhbGlkX251bWVyaWNfdWRsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm51bWVyaWMgbGl0ZXJhbCB3aXRoIHVzZXItZGVmaW5lZCBzdWZmaXggY2Fubm90IGJlIHVzZWQgaGVyZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX2ludmFsaWRfc3RvcmFnZV9jbGFzc19pbl9mdW5jX2RlY2wsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBzdG9yYWdlIGNsYXNzIHNwZWNpZmllciBpbiBmdW5jdGlvbiBkZWNsYXJhdG9yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfaW52YWxpZF9zdHJpbmdfdWRsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN0cmluZyBsaXRlcmFsIHdpdGggdXNlci1kZWZpbmVkIHN1ZmZpeCBjYW5ub3QgYmUgdXNlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfbW9kdWxlX2J1aWxkX2Rpc2FibGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm1vZHVsZSAnJTAnIGlzIG5lZWRlZCBidXQgaGFzIG5vdCBiZWVuIHByb3ZpZGVkLCBhbmQgaW1wbGljaXQgdXNlIG9mIG1vZHVsZSBmaWxlcyBpcyBkaXNhYmxlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX21vZHVsZV9idWlsZF9zaGFkb3dlZF9zdWJtb2R1bGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYnVpbGQgYSBzaGFkb3dlZCBzdWJtb2R1bGUgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX21vZHVsZV9jeWNsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjeWNsaWMgZGVwZW5kZW5jeSBpbiBtb2R1bGUgJyUwJzogJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9tb2R1bGVfZm9ybWF0X3VuaGFuZGxlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJubyBoYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIG1vZHVsZSBmb3JtYXQgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX21vZHVsZV9oZWFkZXJfbWlzc2luZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e3x1bWJyZWxsYSB9MGhlYWRlciAnJTEnIG5vdCBmb3VuZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX21vZHVsZV9ub3RfYnVpbHQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY291bGQgbm90IGJ1aWxkIG1vZHVsZSAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfbW9kdWxlX25vdF9mb3VuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJtb2R1bGUgJyUwJyBub3QgZm91bmQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9tb2R1bGVfcHJlYnVpbHQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZXJyb3IgaW4gbG9hZGluZyBtb2R1bGUgJyUwJyBmcm9tIHByZWJ1aWx0IG1vZHVsZSBwYXRoIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfbW9kdWxlX3NoYWRvd2VkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImltcG9ydCBvZiBzaGFkb3dlZCBtb2R1bGUgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX21vZHVsZV91bmF2YWlsYWJsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtb2R1bGUgJyUwJyAlc2VsZWN0e2lzIGluY29tcGF0aWJsZSB3aXRofHJlcXVpcmVzfTEgZmVhdHVyZSAnJTInIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfbXRfbWVzc2FnZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJbcmV3cml0ZXJdICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcoZXJyX251bGxhYmlsaXR5X2NvbmZsaWN0aW5nLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm51bGxhYmlsaXR5IHNwZWNpZmllciAlMCBjb25mbGljdHMgd2l0aCBleGlzdGluZyBzcGVjaWZpZXIgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE5KQorRElBRyhlcnJfb21wX21vcmVfb25lX2NsYXVzZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkaXJlY3RpdmUgJyNwcmFnbWEgb21wICUwJyBjYW5ub3QgY29udGFpbiBtb3JlIHRoYW4gb25lICclMScgY2xhdXNlJXNlbGVjdHt8IHdpdGggJyUzJyBuYW1lIG1vZGlmaWVyfCB3aXRoICdzb3VyY2UnIGRlcGVuZGVuY2V9MiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX29wdF9ub3RfdmFsaWRfd2l0aF9vcHQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib3B0aW9uICclMCcgY2Fubm90IGJlIHNwZWNpZmllZCB3aXRoICclMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9vcHRfbm90X3ZhbGlkX3dpdGhvdXRfb3B0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm9wdGlvbiAnJTAnIGNhbm5vdCBiZSBzcGVjaWZpZWQgd2l0aG91dCAnJTEnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfcGFyYW1fcmVkZWZpbml0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZGVmaW5pdGlvbiBvZiBwYXJhbWV0ZXIgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9zZWhfX19leGNlcHRfYmxvY2ssIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgb25seSBhbGxvd2VkIGluIF9fZXhjZXB0IGJsb2NrIG9yIGZpbHRlciBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfc2VoX19fZXhjZXB0X2ZpbHRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBvbmx5IGFsbG93ZWQgaW4gX19leGNlcHQgZmlsdGVyIGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9zZWhfX19maW5hbGx5X2Jsb2NrLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIG9ubHkgYWxsb3dlZCBpbiBfX2ZpbmFsbHkgYmxvY2siLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9zZWhfZXhwZWN0ZWRfaGFuZGxlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnX19leGNlcHQnIG9yICdfX2ZpbmFsbHknIGJsb2NrIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfdGFyZ2V0X3Vua25vd25fYWJpLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVua25vd24gdGFyZ2V0IEFCSSAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfdGFyZ2V0X3Vua25vd25fY3B1LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVua25vd24gdGFyZ2V0IENQVSAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfdGFyZ2V0X3Vua25vd25fZnBtYXRoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVua25vd24gRlAgdW5pdCAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfdGFyZ2V0X3Vua25vd25fdHJpcGxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVua25vd24gdGFyZ2V0IHRyaXBsZSAnJTAnLCBwbGVhc2UgdXNlIC10cmlwbGUgb3IgLWFyY2giLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl90YXJnZXRfdW5zdXBwb3J0ZWRfYWJpLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIkFCSSAnJTAnIGlzIG5vdCBzdXBwb3J0ZWQgb24gQ1BVICclMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl90YXJnZXRfdW5zdXBwb3J0ZWRfYWJpX2Zvcl90cmlwbGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiQUJJICclMCcgaXMgbm90IHN1cHBvcnRlZCBmb3IgJyUxJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX3RhcmdldF91bnN1cHBvcnRlZF9jcHVfZm9yX21pY3JvbWlwcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtaWNyb21pcHMgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGFyZ2V0IENQVSAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfdGFyZ2V0X3Vuc3VwcG9ydGVkX2V4ZWN1dGVfb25seSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleGVjdXRlIG9ubHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhlICUwIHN1Yi1hcmNoaXRlY3R1cmUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl90YXJnZXRfdW5zdXBwb3J0ZWRfZnBtYXRoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRoZSAnJTAnIHVuaXQgaXMgbm90IHN1cHBvcnRlZCB3aXRoIHRoaXMgaW5zdHJ1Y3Rpb24gc2V0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfdGFyZ2V0X3Vuc3VwcG9ydGVkX3VuYWxpZ25lZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aGUgJTAgc3ViLWFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IHVuYWxpZ25lZCBhY2Nlc3NlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX3VuYWJsZV90b19tYWtlX3RlbXAsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5hYmxlIHRvIG1ha2UgdGVtcG9yYXJ5IGZpbGU6ICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfdW5hYmxlX3RvX3JlbmFtZV90ZW1wLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuYWJsZSB0byByZW5hbWUgdGVtcG9yYXJ5ICclMCcgdG8gb3V0cHV0IGZpbGUgJyUxJzogJyUyJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX3Vuc3VwcG9ydGVkX2JvbSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlMCBieXRlIG9yZGVyIG1hcmsgZGV0ZWN0ZWQgaW4gJyUxJywgYnV0IGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGV4dF9jOTlfbG9uZ2xvbmcsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJ2xvbmcgbG9uZycgaXMgYW4gZXh0ZW5zaW9uIHdoZW4gQzk5IG1vZGUgaXMgbm90IGVuYWJsZWQiLCAzMzksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhleHRfY2xhbmdfZGlhZ25vc2VfaWYsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJ2RpYWdub3NlX2lmJyBpcyBhIGNsYW5nIGV4dGVuc2lvbiIsIDIzMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKGV4dF9jbGFuZ19lbmFibGVfaWYsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJ2VuYWJsZV9pZicgaXMgYSBjbGFuZyBleHRlbnNpb24iLCAyMzMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhleHRfY3h4MTFfbG9uZ2xvbmcsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJ2xvbmcgbG9uZycgaXMgYSBDKysxMSBleHRlbnNpb24iLCA4MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKGV4dF9pbnRlZ2VyX2xpdGVyYWxfdG9vX2xhcmdlX2Zvcl9zaWduZWQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW50ZWdlciBsaXRlcmFsIGlzIHRvbyBsYXJnZSB0byBiZSByZXByZXNlbnRlZCBpbiBhIHNpZ25lZCBpbnRlZ2VyIHR5cGUsIGludGVycHJldGluZyBhcyB1bnNpZ25lZCIsIDI4MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKGV4dF9vbGRfaW1wbGljaXRseV91bnNpZ25lZF9sb25nX2N4eCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpbnRlZ2VyIGxpdGVyYWwgaXMgdG9vIGxhcmdlIHRvIGJlIHJlcHJlc2VudGVkIGluIHR5cGUgJ2xvbmcnIGFuZCBpcyBzdWJqZWN0IHRvIHVuZGVmaW5lZCBiZWhhdmlvciB1bmRlciBDKys5OCwgaW50ZXJwcmV0aW5nIGFzICd1bnNpZ25lZCBsb25nJzsgdGhpcyBsaXRlcmFsIHdpbGwgJXNlbGVjdHtoYXZlIHR5cGUgJ2xvbmcgbG9uZyd8YmUgaWxsLWZvcm1lZH0wIGluIEMrKzExIG9ud2FyZHMiLCA3MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKGV4dF92YXJpYWRpY190ZW1wbGF0ZXMsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidmFyaWFkaWMgdGVtcGxhdGVzIGFyZSBhIEMrKzExIGV4dGVuc2lvbiIsIDc3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZmF0YWxfdG9vX21hbnlfZXJyb3JzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInRvbyBtYW55IGVycm9ycyBlbWl0dGVkLCBzdG9wcGluZyBub3ciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKG5vdGVfYWxzb19mb3VuZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImFsc28gZm91bmQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9kZWNsX2hpZGluZ190YWdfdHlwZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiUxICUwIGlzIGhpZGRlbiBieSBhIG5vbi10eXBlIGRlY2xhcmF0aW9uIG9mICUwIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcobm90ZV9kZWNsYXJlZF9hdCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9kdXBsaWNhdGVfY2FzZV9wcmV2LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJldmlvdXMgY2FzZSBkZWZpbmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9mb3J3YXJkX2RlY2xhcmF0aW9uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2ludmFsaWRfc3ViZXhwcl9pbl9jb25zdF9leHByLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAic3ViZXhwcmVzc2lvbiBub3QgdmFsaWQgaW4gYSBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfbWF0Y2hpbmcsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ0byBtYXRjaCB0aGlzICUwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfbXRfbWVzc2FnZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIltyZXdyaXRlcl0gJTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9wb3NzaWJpbGl0eSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm9uZSBwb3NzaWJpbGl0eSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX3ByYWdtYV9lbnRlcmVkX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIjcHJhZ21hIGVudGVyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhub3RlX3ByZXZpb3VzX2RlY2xhcmF0aW9uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJldmlvdXMgZGVjbGFyYXRpb24gaXMgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX3ByZXZpb3VzX2RlZmluaXRpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwcmV2aW91cyBkZWZpbml0aW9uIGlzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9wcmV2aW91c19pbXBsaWNpdF9kZWNsYXJhdGlvbiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInByZXZpb3VzIGltcGxpY2l0IGRlY2xhcmF0aW9uIGlzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9wcmV2aW91c191c2UsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwcmV2aW91cyB1c2UgaXMgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX3R5cGVfYmVpbmdfZGVmaW5lZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRlZmluaXRpb24gb2YgJTAgaXMgbm90IGNvbXBsZXRlIHVudGlsIHRoZSBjbG9zaW5nICd9JyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX3VzaW5nLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidXNpbmciLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV92YWxpZF9vcHRpb25zLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidmFsaWQgdGFyZ2V0IENQVSB2YWx1ZXMgYXJlOiAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhyZW1hcmtfbW9kdWxlX2xvY2tfZmFpbHVyZSwgQ0xBU1NfUkVNQVJLLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJjb3VsZCBub3QgYWNxdWlyZSBsb2NrIGZpbGUgZm9yIG1vZHVsZSAnJTAnOiAlMSIsIDM5NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHJlbWFya19tb2R1bGVfbG9ja190aW1lb3V0LCBDTEFTU19SRU1BUkssICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInRpbWVkIG91dCB3YWl0aW5nIHRvIGFjcXVpcmUgbG9jayBmaWxlIGZvciBtb2R1bGUgJyUwJyIsIDM5NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fYXJjbXRfbnNhbGxvY19yZWFsbG9jLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJbcmV3cml0ZXJdIGNhbGwgcmV0dXJucyBwb2ludGVyIHRvIEdDIG1hbmFnZWQgbWVtb3J5OyBpdCB3aWxsIGJlY29tZSB1bm1hbmFnZWQgaW4gQVJDIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fY29uZmxpY3RpbmdfbnVsbGFiaWxpdHlfYXR0cl9vdmVycmlkaW5nX3BhcmFtX3R5cGVzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJjb25mbGljdGluZyBudWxsYWJpbGl0eSBzcGVjaWZpZXIgb24gcGFyYW1ldGVyIHR5cGVzLCAlMCBjb25mbGljdHMgd2l0aCBleGlzdGluZyBzcGVjaWZpZXIgJTEiLCA0MzMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxOSkKK0RJQUcod2Fybl9jb25mbGljdGluZ19udWxsYWJpbGl0eV9hdHRyX292ZXJyaWRpbmdfcmV0X3R5cGVzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJjb25mbGljdGluZyBudWxsYWJpbGl0eSBzcGVjaWZpZXIgb24gcmV0dXJuIHR5cGVzLCAlMCBjb25mbGljdHMgd2l0aCBleGlzdGluZyBzcGVjaWZpZXIgJTEiLCA0MzMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxOSkKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfbG9uZ2xvbmcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIidsb25nIGxvbmcnIGlzIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfdmFyaWFkaWNfdGVtcGxhdGVzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ2YXJpYWRpYyB0ZW1wbGF0ZXMgYXJlIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9tZXRob2RfcGFyYW1fZGVjbGFyYXRpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInJlZGVjbGFyYXRpb24gb2YgbWV0aG9kIHBhcmFtZXRlciAlMCIsIDE4MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fbWV0aG9kX3BhcmFtX3JlZGVmaW5pdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicmVkZWZpbml0aW9uIG9mIG1ldGhvZCBwYXJhbWV0ZXIgJTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9tdF9tZXNzYWdlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJbcmV3cml0ZXJdICUwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fbnVsbGFiaWxpdHlfZHVwbGljYXRlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJkdXBsaWNhdGUgbnVsbGFiaWxpdHkgc3BlY2lmaWVyICUwIiwgNDMzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTkpCitESUFHKHdhcm5fb2xkX2ltcGxpY2l0bHlfdW5zaWduZWRfbG9uZywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW50ZWdlciBsaXRlcmFsIGlzIHRvbyBsYXJnZSB0byBiZSByZXByZXNlbnRlZCBpbiB0eXBlICdsb25nJywgaW50ZXJwcmV0aW5nIGFzICd1bnNpZ25lZCBsb25nJyBwZXIgQzg5OyB0aGlzIGxpdGVyYWwgd2lsbCAlc2VsZWN0e2hhdmUgdHlwZSAnbG9uZyBsb25nJ3xiZSBpbGwtZm9ybWVkfTAgaW4gQzk5IG9ud2FyZHMiLCAxMTEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX29sZF9pbXBsaWNpdGx5X3Vuc2lnbmVkX2xvbmdfY3h4LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpbnRlZ2VyIGxpdGVyYWwgaXMgdG9vIGxhcmdlIHRvIGJlIHJlcHJlc2VudGVkIGluIHR5cGUgJ2xvbmcnLCBpbnRlcnByZXRpbmcgYXMgJ3Vuc2lnbmVkIGxvbmcnIHBlciBDKys5ODsgdGhpcyBsaXRlcmFsIHdpbGwgJXNlbGVjdHtoYXZlIHR5cGUgJ2xvbmcgbG9uZyd8YmUgaWxsLWZvcm1lZH0wIGluIEMrKzExIG9ud2FyZHMiLCA3MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljQ3Jvc3NUVUtpbmRzLmluYyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNDcm9zc1RVS2luZHMuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjM2Y3MTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljQ3Jvc3NUVUtpbmRzLmluYwpAQCAtMCwwICsxLDcgQEAKKyNpZmRlZiBDUk9TU1RVU1RBUlQKK19fQ1JPU1NUVVNUQVJUID0gRElBR19TVEFSVF9DUk9TU1RVLAorI3VuZGVmIENST1NTVFVTVEFSVAorI2VuZGlmCisKK0RJQUcoZXJyX2ZubWFwX3BhcnNpbmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXJyb3IgcGFyc2luZyBpbmRleCBmaWxlOiAnJTAnIGxpbmU6ICUxICdVbmlxdWVJRCBmaWxlbmFtZScgZm9ybWF0IGV4cGVjdGVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfbXVsdGlwbGVfZGVmX2luZGV4LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm11bHRpcGxlIGRlZmluaXRpb25zIGFyZSBmb3VuZCBmb3IgdGhlIHNhbWUga2V5IGluIGluZGV4ICIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNEcml2ZXJLaW5kcy5pbmMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljRHJpdmVyS2luZHMuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNjYzNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljRHJpdmVyS2luZHMuaW5jCkBAIC0wLDAgKzEsMTYxIEBACisjaWZkZWYgRFJJVkVSU1RBUlQKK19fRFJJVkVSU1RBUlQgPSBESUFHX1NUQVJUX0RSSVZFUiwKKyN1bmRlZiBEUklWRVJTVEFSVAorI2VuZGlmCisKK0RJQUcoZXJyX2FuYWx5emVyX2NvbmZpZ19tdWx0aXBsZV92YWx1ZXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYW5hbHl6ZXItY29uZmlnIG9wdGlvbiAnJTAnIHNob3VsZCBjb250YWluIG9ubHkgb25lICc9JyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2FuYWx5emVyX2NvbmZpZ19ub192YWx1ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhbmFseXplci1jb25maWcgb3B0aW9uICclMCcgaGFzIGEga2V5IGJ1dCBubyB2YWx1ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2FyY191bnN1cHBvcnRlZF9vbl9ydW50aW1lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIi1mb2JqYy1hcmMgaXMgbm90IHN1cHBvcnRlZCBvbiBwbGF0Zm9ybXMgdXNpbmcgdGhlIGxlZ2FjeSBydW50aW1lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfYXJjX3Vuc3VwcG9ydGVkX29uX3Rvb2xjaGFpbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICItZm9iamMtYXJjIGlzIG5vdCBzdXBwb3J0ZWQgb24gdmVyc2lvbnMgb2YgT1MgWCBwcmlvciB0byAxMC42IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfYXJjaF91bnN1cHBvcnRlZF9pc2EsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiQXJjaGl0ZWN0dXJlICclMCcgZG9lcyBub3Qgc3VwcG9ydCAnJTEnIGV4ZWN1dGlvbiBtb2RlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfY3B1X3Vuc3VwcG9ydGVkX2lzYSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJDUFUgJyUwJyBkb2VzIG5vdCBzdXBwb3J0ICclMScgZXhlY3V0aW9uIG1vZGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfSV9kYXNoX25vdF9zdXBwb3J0ZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJyUwJyBub3Qgc3VwcG9ydGVkLCBwbGVhc2UgdXNlIC1pcXVvdGUgaW5zdGVhZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9Yb3Blbm1wX3RhcmdldF9taXNzaW5nX3RyaXBsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZGVkdWNlIGltcGxpY2l0IHRyaXBsZSB2YWx1ZSBmb3IgLVhvcGVubXAtdGFyZ2V0LCBzcGVjaWZ5IHRyaXBsZSB1c2luZyAtWG9wZW5tcC10YXJnZXQ9PHRyaXBsZT4iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfYXJndW1lbnRfbm90X2FsbG93ZWRfd2l0aCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIGFyZ3VtZW50ICclMCcgbm90IGFsbG93ZWQgd2l0aCAnJTEnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X2FyZ3VtZW50X29ubHlfYWxsb3dlZF93aXRoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgYXJndW1lbnQgJyUwJyBvbmx5IGFsbG93ZWQgd2l0aCAnJTEnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X2JpdGNvZGVfdW5zdXBwb3J0ZWRfb25fdG9vbGNoYWluLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIi1mZW1iZWQtYml0Y29kZSBpcyBub3Qgc3VwcG9ydGVkIG9uIHZlcnNpb25zIG9mIGlPUyBwcmlvciB0byA2LjAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfY2Fubm90X3JlYWRfY29uZmlnX2ZpbGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHJlYWQgY29uZmlndXJhdGlvbiBmaWxlICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfY2NfcHJpbnRfb3B0aW9uc19mYWlsdXJlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuYWJsZSB0byBvcGVuIENDX1BSSU5UX09QVElPTlMgZmlsZTogJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfY2xhbmdfdW5zdXBwb3J0ZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhlIGNsYW5nIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9jbGFuZ191bnN1cHBvcnRlZF9vcHRfY3h4X2Rhcndpbl9pMzg2LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRoZSBjbGFuZyBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0ICclMCcgZm9yIEMrKyBvbiBEYXJ3aW4vaTM4NiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9jbGFuZ191bnN1cHBvcnRlZF9vcHRfZmFsdGl2ZWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhlIGNsYW5nIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgJyUwJywgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfY29tbWFuZF9mYWlsZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgY29tbWFuZCBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJTEgKHVzZSAtdiB0byBzZWUgaW52b2NhdGlvbikiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfY29tbWFuZF9mYWlsdXJlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuYWJsZSB0byBleGVjdXRlIGNvbW1hbmQ6ICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X2NvbW1hbmRfc2lnbmFsbGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGNvbW1hbmQgZmFpbGVkIGR1ZSB0byBzaWduYWwgKHVzZSAtdiB0byBzZWUgaW52b2NhdGlvbikiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfY29tcGlsYXRpb25kYXRhYmFzZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb21waWxhdGlvbiBkYXRhYmFzZSAnJTAnIGNvdWxkIG5vdCBiZSBvcGVuZWQ6ICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X2NvbmZpZ19maWxlX25vdF9leGlzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb25maWd1cmF0aW9uIGZpbGUgJyUwJyBkb2VzIG5vdCBleGlzdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9jb25maWdfZmlsZV9ub3RfZm91bmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29uZmlndXJhdGlvbiBmaWxlICclMCcgY2Fubm90IGJlIGZvdW5kIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X2NvbmZsaWN0aW5nX2RlcGxveW1lbnRfdGFyZ2V0cywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb25mbGljdGluZyBkZXBsb3ltZW50IHRhcmdldHMsIGJvdGggJyUwJyBhbmQgJyUxJyBhcmUgcHJlc2VudCBpbiBlbnZpcm9ubWVudCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9jdWRhX2JhZF9ncHVfYXJjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJVbnN1cHBvcnRlZCBDVURBIGdwdSBhcmNoaXRlY3R1cmU6ICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X2N1ZGFfbnZwdHhfaG9zdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bnN1cHBvcnRlZCB1c2Ugb2YgTlZQVFggZm9yIGhvc3QgY29tcGlsYXRpb24uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X2N1ZGFfdmVyc2lvbl91bnN1cHBvcnRlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJHUFUgYXJjaCAlMCBpcyBzdXBwb3J0ZWQgYnkgQ1VEQSB2ZXJzaW9ucyBiZXR3ZWVuICUxIGFuZCAlMiAoaW5jbHVzaXZlKSwgYnV0IGluc3RhbGxhdGlvbiBhdCAlMyBpcyAlNC4gIFVzZSAtLWN1ZGEtcGF0aCB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IENVREEgaW5zdGFsbCwgcGFzcyBhIGRpZmZlcmVudCBHUFUgYXJjaCB3aXRoIC0tY3VkYS1ncHUtYXJjaCwgb3IgcGFzcyAtLW5vLWN1ZGEtdmVyc2lvbi1jaGVjay4iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfZGVmc3ltX2ludmFsaWRfZm9ybWF0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZnN5bSBtdXN0IGJlIG9mIHRoZSBmb3JtOiBzeW09dmFsdWU6ICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X2RlZnN5bV9pbnZhbGlkX3N5bXZhbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJWYWx1ZSBpcyBub3QgYW4gaW50ZWdlcjogJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfZHVwbGljYXRlX2NvbmZpZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyBtb3JlIHRoYW4gb25lIG9wdGlvbiAnLS1jb25maWcnIGlzIGFsbG93ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfZW1pdF9sbHZtX2xpbmssIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiLWVtaXQtbGx2bSBjYW5ub3QgYmUgdXNlZCB3aGVuIGxpbmtpbmciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfZXhwZWN0aW5nX2ZvcGVubXBfd2l0aF9mb3Blbm1wX3RhcmdldHMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiVGhlIG9wdGlvbiAtZm9wZW5tcC10YXJnZXRzIG11c3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEgLWZvcGVubXAgb3B0aW9uIGNvbXBhdGlibGUgd2l0aCBvZmZsb2FkaW5nLCBwbGVhc2UgdXNlIC1mb3Blbm1wPWxpYm9tcCBvciAtZm9wZW5tcD1saWJpb21wNS4iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfZm9yY2VfY3Jhc2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZmFpbGluZyBiZWNhdXNlICVzZWxlY3R7ZW52aXJvbm1lbnQgdmFyaWFibGUgJ0ZPUkNFX0NMQU5HX0RJQUdOT1NUSUNTX0NSQVNIJyBpcyBzZXR8Jy1nZW4tcmVwcm9kdWNlcicgaXMgdXNlZH0wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X2ludmFsaWRfWGFyY2hfYXJndW1lbnRfaXNkcml2ZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBYYXJjaCBhcmd1bWVudDogJyUwJywgY2Fubm90IGNoYW5nZSBkcml2ZXIgYmVoYXZpb3IgaW5zaWRlIFhhcmNoIGFyZ3VtZW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X2ludmFsaWRfWGFyY2hfYXJndW1lbnRfd2l0aF9hcmdzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgWGFyY2ggYXJndW1lbnQ6ICclMCcsIG9wdGlvbnMgcmVxdWlyaW5nIGFyZ3VtZW50cyBhcmUgdW5zdXBwb3J0ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfaW52YWxpZF9Yb3Blbm1wX3RhcmdldF93aXRoX2FyZ3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCAtWG9wZW5tcC10YXJnZXQgYXJndW1lbnQ6ICclMCcsIG9wdGlvbnMgcmVxdWlyaW5nIGFyZ3VtZW50cyBhcmUgdW5zdXBwb3J0ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfaW52YWxpZF9hcmNoX25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBhcmNoIG5hbWUgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9pbnZhbGlkX2FyZ3VtZW50X3RvX2ZkZWJ1Z19wcmVmaXhfbWFwLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgYXJndW1lbnQgJyUwJyB0byAtZmRlYnVnLXByZWZpeC1tYXAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfaW52YWxpZF9kYXJ3aW5fdmVyc2lvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIERhcndpbiB2ZXJzaW9uIG51bWJlcjogJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfaW52YWxpZF9nY2Nfb3V0cHV0X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBvdXRwdXQgdHlwZSAnJTAnIGZvciB1c2Ugd2l0aCBnY2MgdG9vbCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9pbnZhbGlkX2h2eF9sZW5ndGgsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiLW1odngtbGVuZ3RoIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aG91dCBhIC1taHZ4Ly1taHZ4PSBmbGFnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X2ludmFsaWRfaW50X3ZhbHVlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgaW50ZWdyYWwgdmFsdWUgJyUxJyBpbiAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X2ludmFsaWRfbGliY3h4X2RlcGxveW1lbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBkZXBsb3ltZW50IHRhcmdldCBmb3IgLXN0ZGxpYj1saWJjKysgKHJlcXVpcmVzICUwIG9yIGxhdGVyKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9pbnZhbGlkX2xpbmtlcl9uYW1lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgbGlua2VyIG5hbWUgaW4gYXJndW1lbnQgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9pbnZhbGlkX21mbG9hdF9hYmksIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBmbG9hdCBBQkkgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9pbnZhbGlkX210cCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIHRocmVhZCBwb2ludGVyIHJlYWRpbmcgbW9kZSAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X2ludmFsaWRfb21wX3RhcmdldCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJPcGVuTVAgdGFyZ2V0IGlzIGludmFsaWQ6ICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfaW52YWxpZF9vdXRwdXRfd2l0aF9tdWx0aXBsZV9hcmNocywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgdXNlICclMCcgb3V0cHV0IHdpdGggbXVsdGlwbGUgLWFyY2ggb3B0aW9ucyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9pbnZhbGlkX3Bnb19pbnN0cnVtZW50b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBQR08gaW5zdHJ1bWVudG9yIGluIGFyZ3VtZW50ICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfaW52YWxpZF9yZW1hcF9maWxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgb3B0aW9uICclMCcgbm90IG9mIHRoZSBmb3JtIDxmcm9tLWZpbGU+Ozx0by1maWxlPiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9pbnZhbGlkX3J0bGliX25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBydW50aW1lIGxpYnJhcnkgbmFtZSBpbiBhcmd1bWVudCAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X2ludmFsaWRfc3RkbGliX25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBsaWJyYXJ5IG5hbWUgaW4gYXJndW1lbnQgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9pbnZhbGlkX3RocmVhZF9tb2RlbF9mb3JfdGFyZ2V0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgdGhyZWFkIG1vZGVsICclMCcgaW4gJyUxJyBmb3IgdGhpcyB0YXJnZXQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfaW52YWxpZF92YWx1ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIHZhbHVlICclMScgaW4gJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9pbnZhbGlkX3ZlcnNpb25fbnVtYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgdmVyc2lvbiBudW1iZXIgaW4gJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9sdG9fd2l0aG91dF9sbGQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiTFRPIHJlcXVpcmVzIC1mdXNlLWxkPWxsZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9tYWxmb3JtZWRfc2FuaXRpemVyX2JsYWNrbGlzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtYWxmb3JtZWQgc2FuaXRpemVyIGJsYWNrbGlzdDogJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9tZ19yZXF1aXJlc19tX29yX21tLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm9wdGlvbiAnLU1HJyByZXF1aXJlcyAnLU0nIG9yICctTU0nIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X21pc3NpbmdfYXJnX210cCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtaXNzaW5nIGFyZ3VtZW50IHRvICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfbWlzc2luZ19hcmd1bWVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhcmd1bWVudCB0byAnJTAnIGlzIG1pc3NpbmcgKGV4cGVjdGVkICUxIHZhbHVlJXMxKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9tb2R1bGVzX3ZhbGlkYXRlX29uY2VfcmVxdWlyZXNfdGltZXN0YW1wLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm9wdGlvbiAnLWZtb2R1bGVzLXZhbGlkYXRlLW9uY2UtcGVyLWJ1aWxkLXNlc3Npb24nIHJlcXVpcmVzICctZmJ1aWxkLXNlc3Npb24tdGltZXN0YW1wPTxzZWNvbmRzIHNpbmNlIEVwb2NoPicgb3IgJy1mYnVpbGQtc2Vzc2lvbi1maWxlPTxmaWxlPiciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfbmVzdGVkX2NvbmZpZ19maWxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm9wdGlvbiAnLS1jb25maWcnIGlzIG5vdCBhbGxvd2VkIGluc2lkZSBjb25maWd1cmF0aW9uIGZpbGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfbm9fYXN0X3N1cHBvcnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJyUwJzogdW5hYmxlIHRvIHVzZSBBU1QgZmlsZXMgd2l0aCB0aGlzIHRvb2wiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfbm9fY3VkYV9pbnN0YWxsYXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGZpbmQgQ1VEQSBpbnN0YWxsYXRpb24uICBQcm92aWRlIGl0cyBwYXRoIHZpYSAtLWN1ZGEtcGF0aCwgb3IgcGFzcyAtbm9jdWRhaW5jIHRvIGJ1aWxkIHdpdGhvdXQgQ1VEQSBpbmNsdWRlcy4iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfbm9fY3VkYV9saWJkZXZpY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGZpbmQgbGliZGV2aWNlIGZvciAlMC4gUHJvdmlkZSBwYXRoIHRvIGRpZmZlcmVudCBDVURBIGluc3RhbGxhdGlvbiB2aWEgLS1jdWRhLXBhdGgsIG9yIHBhc3MgLW5vY3VkYWxpYiB0byBidWlsZCB3aXRob3V0IGxpbmtpbmcgd2l0aCBsaWJkZXZpY2UuIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X25vX2lucHV0X2ZpbGVzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIGlucHV0IGZpbGVzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X25vX2xpbmtlcl9sbHZtX3N1cHBvcnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJyUwJzogdW5hYmxlIHRvIHBhc3MgTExWTSBiaXQtY29kZSBmaWxlcyB0byBsaW5rZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfbm9fbW9kdWxlX3N1cHBvcnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJyUwJzogdW5hYmxlIHRvIHVzZSBtb2R1bGUgZmlsZXMgd2l0aCB0aGlzIHRvb2wiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfbm9fbmVvbl9tb2RpZmllciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJbbm9dbmVvbiBpcyBub3QgYWNjZXB0ZWQgYXMgbW9kaWZpZXIsIHBsZWFzZSB1c2UgW25vXXNpbWQgaW5zdGVhZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9ub19zdWNoX2ZpbGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeTogJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9vbXBfaG9zdF9pcl9maWxlX25vdF9mb3VuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJUaGUgcHJvdmlkZWQgaG9zdCBjb21waWxlciBJUiBmaWxlICclMCcgaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgY29kZSBmb3IgT3Blbk1QIHRhcmdldCByZWdpb25zIGJ1dCBjYW5ub3QgYmUgZm91bmQuIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X29tcF9ob3N0X3RhcmdldF9ub3Rfc3VwcG9ydGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIlRoZSB0YXJnZXQgJyUwJyBpcyBub3QgYSBzdXBwb3J0ZWQgT3Blbk1QIGhvc3QgdGFyZ2V0LiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9vcHRpbWl6YXRpb25fcmVtYXJrX3BhdHRlcm4sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgaW4gJyUxJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9vdXRfZmlsZV9hcmd1bWVudF93aXRoX211bHRpcGxlX3NvdXJjZXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHNwZWNpZnkgJyUwJTEnIHdoZW4gY29tcGlsaW5nIG11bHRpcGxlIHNvdXJjZSBmaWxlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9vdXRwdXRfYXJndW1lbnRfd2l0aF9tdWx0aXBsZV9maWxlcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3Qgc3BlY2lmeSAtbyB3aGVuIGdlbmVyYXRpbmcgbXVsdGlwbGUgb3V0cHV0IGZpbGVzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X3ByZWFtYmxlX2Zvcm1hdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbmNvcnJlY3QgZm9ybWF0IGZvciAtcHJlYW1ibGUtYnl0ZXM9TixFTkQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfcm9waV9pbmNvbXBhdGlibGVfd2l0aF9jeHgsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiUk9QSSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGMrKyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl9yb3BpX3J3cGlfaW5jb21wYXRpYmxlX3dpdGhfcGljLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImVtYmVkZGVkIGFuZCBHT1QtYmFzZWQgcG9zaXRpb24gaW5kZXBlbmRlbmNlIGFyZSBpbmNvbXBhdGlibGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfdW5hYmxlX3RvX3JlbW92ZV9maWxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuYWJsZSB0byByZW1vdmUgZmlsZTogJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfdW5rbm93bl9hcmd1bWVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmtub3duIGFyZ3VtZW50OiAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X3Vua25vd25fYXJndW1lbnRfd2l0aF9zdWdnZXN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVua25vd24gYXJndW1lbnQgJyUwJywgZGlkIHlvdSBtZWFuICclMSc/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X3Vua25vd25faW5kaXJlY3RfanVtcF9vcHQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5rbm93biAnLW1pbmRpcmVjdC1qdW1wPScgb3B0aW9uICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfdW5rbm93bl9sYW5ndWFnZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJsYW5ndWFnZSBub3QgcmVjb2duaXplZDogJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl91bmtub3duX29iamNfcnVudGltZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmtub3duIG9yIGlsbC1mb3JtZWQgT2JqZWN0aXZlLUMgcnVudGltZSAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X3Vua25vd25fc3RkaW5fdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICItRSBvciAteCByZXF1aXJlZCB3aGVuIGlucHV0IGlzIGZyb20gc3RhbmRhcmQgaW5wdXQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfdW5rbm93bl9zdGRpbl90eXBlX2NsYW5nX2NsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVzZSAvVGMgb3IgL1RwIHRvIHNldCBpbnB1dCB0eXBlIGZvciBzdGFuZGFyZCBpbnB1dCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl91bnN1cHBvcnRlZF9pbmRpcmVjdF9qdW1wX29wdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInLW1pbmRpcmVjdC1qdW1wPSUwJyBpcyB1bnN1cHBvcnRlZCB3aXRoIHRoZSAnJTEnIGFyY2hpdGVjdHVyZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl91bnN1cHBvcnRlZF9saW5rZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5zdXBwb3J0ZWQgdmFsdWUgJyUwJyBmb3IgLWxpbmtlciBvcHRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfdW5zdXBwb3J0ZWRfb3B0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuc3VwcG9ydGVkIG9wdGlvbiAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X3Vuc3VwcG9ydGVkX29wdF9mb3JfdGFyZ2V0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuc3VwcG9ydGVkIG9wdGlvbiAnJTAnIGZvciB0YXJnZXQgJyUxJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2Rydl91bnN1cHBvcnRlZF9vcHRfd2l0aF9zdWdnZXN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuc3VwcG9ydGVkIG9wdGlvbiAnJTAnLCBkaWQgeW91IG1lYW4gJyUxJz8iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfdW5zdXBwb3J0ZWRfb3B0aW9uX2FyZ3VtZW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuc3VwcG9ydGVkIGFyZ3VtZW50ICclMScgdG8gb3B0aW9uICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9kcnZfdW5zdXBwb3J0ZWRfcnRsaWJfZm9yX3BsYXRmb3JtLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuc3VwcG9ydGVkIHJ1bnRpbWUgbGlicmFyeSAnJTAnIGZvciBwbGF0Zm9ybSAnJTEnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZHJ2X3VzZV9vZl9aX29wdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bnN1cHBvcnRlZCB1c2Ugb2YgaW50ZXJuYWwgZ2NjIC1aIG9wdGlvbiAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfbm9fZXh0ZXJuYWxfYXNzZW1ibGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRoZXJlIGlzIG5vIGV4dGVybmFsIGFzc2VtYmxlciB0aGF0IGNhbiBiZSB1c2VkIG9uIHRoaXMgcGxhdGZvcm0iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9vYmpjX3dlYWtfdW5zdXBwb3J0ZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiLWZvYmpjLXdlYWsgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgY3VycmVudCBkZXBsb3ltZW50IHRhcmdldCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX29iamNfd2Vha193aXRoX2djLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIi1mb2JqYy13ZWFrIGlzIG5vdCBzdXBwb3J0ZWQgaW4gT2JqZWN0aXZlLUMgZ2FyYmFnZSBjb2xsZWN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfdGFyZ2V0X3Vuc3VwcG9ydGVkX2FyY2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgJyUwJyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0YXJnZXQgJyUxJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX3Rlc3RfbW9kdWxlX2ZpbGVfZXh0ZW5zaW9uX2Zvcm1hdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICItZnRlc3QtbW9kdWxlLWZpbGUtZXh0ZW5zaW9uIGFyZ3VtZW50ICclMCcgaXMgbm90IG9mIHRoZSByZXF1aXJlZCBmb3JtICdibG9ja25hbWU6bWFqb3I6bWlub3I6aGFzaGVkOnVzZXIgaW5mbyciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKG5vdGVfZHJ2X2FkZHJlc3Nfc2FuaXRpemVyX2RlYnVnX3J1bnRpbWUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJBZGRyZXNzU2FuaXRpemVyIGRvZXNuJ3Qgc3VwcG9ydCBsaW5raW5nIHdpdGggZGVidWcgcnVudGltZSBsaWJyYXJpZXMgeWV0IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfZHJ2X2NvbW1hbmRfZmFpbGVkX2RpYWdfbXNnLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZGlhZ25vc3RpYyBtc2c6ICUwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfZHJ2X2NvbmZpZ19maWxlX3NlYXJjaGVkX2luLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAid2FzIHNlYXJjaGVkIGZvciBpbiB0aGUgZGlyZWN0b3J5OiAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2Rydl90X29wdGlvbl9pc19nbG9iYWwsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJUaGUgbGFzdCAvVEMgb3IgL1RQIG9wdGlvbiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgZWFybGllciBpbnN0YW5jZXMiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9kcnZfdXNlX3N0YW5kYXJkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidXNlICclMCclc2VsZWN0e3wgb3IgJyUzJ3wsICclMycsIG9yICclNCd8LCAnJTMnLCAnJTQnLCBvciAnJTUnfTIgZm9yICclMScgc3RhbmRhcmQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9kcnZfdmVyaWZ5X3ByZWZpeF9zcGVsbGluZywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIi12ZXJpZnkgcHJlZml4ZXMgbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX3VzZV9kYXNoZGFzaCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIlVzZSAnLS0nIHRvIHRyZWF0IHN1YnNlcXVlbnQgYXJndW1lbnRzIGFzIGZpbGVuYW1lcyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX080X2lzX08zLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICItTzQgaXMgZXF1aXZhbGVudCB0byAtTzMiLCAxNTMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNykKK0RJQUcod2Fybl9jX2tleHQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImlnbm9yaW5nIC1mYXBwbGUta2V4dCB3aGljaCBpcyB2YWxpZCBmb3IgQysrIGFuZCBPYmplY3RpdmUtQysrIG9ubHkiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kZWJ1Z19jb21wcmVzc2lvbl91bmF2YWlsYWJsZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY2Fubm90IGNvbXByZXNzIGRlYnVnIHNlY3Rpb25zICh6bGliIG5vdCBpbnN0YWxsZWQpIiwgMTQ4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfYXNzdW1pbmdfbWZsb2F0X2FiaV9pcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidW5rbm93biBwbGF0Zm9ybSwgYXNzdW1pbmcgLW1mbG9hdC1hYmk9JTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfY2xhbmdfdW5zdXBwb3J0ZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInRoZSBjbGFuZyBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0ICclMCciLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfZGVwcmVjYXRlZF9hcmcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImFyZ3VtZW50ICclMCcgaXMgZGVwcmVjYXRlZCwgdXNlICclMScgaW5zdGVhZCIsIDE1MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI3KQorRElBRyh3YXJuX2Rydl9kaWFnbm9zdGljc19ob3RuZXNzX3JlcXVpcmVzX3BnbywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYXJndW1lbnQgJyUwJyByZXF1aXJlcyBwcm9maWxlLWd1aWRlZCBvcHRpbWl6YXRpb24gaW5mb3JtYXRpb24iLCA2ODMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX2Rydl9kaXNhYmxpbmdfdnB0cl9ub19ydHRpX2RlZmF1bHQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImltcGxpY2l0bHkgZGlzYWJsaW5nIHZwdHIgc2FuaXRpemVyIGJlY2F1c2UgcnR0aSB3YXNuJ3QgZW5hYmxlZCIsIDQ2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfZW1wdHlfam9pbmVkX2FyZ3VtZW50LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJqb2luZWQgYXJndW1lbnQgZXhwZWN0cyBhZGRpdGlvbmFsIHZhbHVlOiAnJTAnIiwgNjgzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfZW5hYmxpbmdfcnR0aV93aXRoX2V4Y2VwdGlvbnMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImltcGxpY2l0bHkgZW5hYmxpbmcgcnR0aSBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nIiwgNTQ2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfZXhwZXJpbWVudGFsX2lzZWxfaW5jb21wbGV0ZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiLWZleHBlcmltZW50YWwtaXNlbCBzdXBwb3J0IGZvciB0aGUgJyUwJyBhcmNoaXRlY3R1cmUgaXMgaW5jb21wbGV0ZSIsIDIwMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fZHJ2X2V4cGVyaW1lbnRhbF9pc2VsX2luY29tcGxldGVfb3B0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICItZmV4cGVyaW1lbnRhbC1pc2VsIHN1cHBvcnQgaXMgaW5jb21wbGV0ZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUgYXQgdGhlIGN1cnJlbnQgb3B0aW1pemF0aW9uIGxldmVsIiwgMjAyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfZmluZV9ncmFpbmVkX2JpdGZpZWxkX2FjY2Vzc2VzX2lnbm9yZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm9wdGlvbiAnLWZmaW5lLWdyYWluZWQtYml0ZmllbGQtYWNjZXNzZXMnIGNhbm5vdCBiZSBlbmFibGVkIHRvZ2V0aGVyIHdpdGggYSBzYW5pdGl6ZXI7IGZsYWcgaWdub3JlZCIsIDQ3OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fZHJ2X2lucHV0X2ZpbGVfdW51c2VkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMDogJyUxJyBpbnB1dCB1bnVzZWQlc2VsZWN0eyB3aGVuICclMycgaXMgcHJlc2VudHx9MiIsIDY4MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fZHJ2X2lucHV0X2ZpbGVfdW51c2VkX2J5X2NwcCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTA6ICclMScgaW5wdXQgdW51c2VkIGluIGNwcCBtb2RlIiwgNjgzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfaW52b2tpbmdfZmFsbGJhY2ssIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImZhbGxpbmcgYmFjayB0byAlMCIsIDIxMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fZHJ2X21zdmNfbm90X2ZvdW5kLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1bmFibGUgdG8gZmluZCBhIFZpc3VhbCBTdHVkaW8gaW5zdGFsbGF0aW9uOyB0cnkgcnVubmluZyBDbGFuZyBmcm9tIGEgZGV2ZWxvcGVyIGNvbW1hbmQgcHJvbXB0IiwgNDA2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfb2JqZWN0X3NpemVfZGlzYWJsZWRfTzAsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInRoZSBvYmplY3Qgc2l6ZSBzYW5pdGl6ZXIgaGFzIG5vIGVmZmVjdCBhdCAtTzAsIGJ1dCBpcyBleHBsaWNpdGx5IGVuYWJsZWQ6ICUwIiwgMzE0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfb21wX29mZmxvYWRfdGFyZ2V0X2R1cGxpY2F0ZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiVGhlIE9wZW5NUCBvZmZsb2FkaW5nIHRhcmdldCAnJTAnIGlzIHNpbWlsYXIgdG8gdGFyZ2V0ICclMScgYWxyZWFkeSBzcGVjaWZpZWQgLSB3aWxsIGJlIGlnbm9yZWQuIiwgNDc4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfb21wX29mZmxvYWRfdGFyZ2V0X21pc3NpbmdiY3J1bnRpbWUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIk5vIGxpYnJhcnkgJyUwJyBmb3VuZCBpbiB0aGUgZGVmYXVsdCBjbGFuZyBsaWIgZGlyZWN0b3J5IG9yIGluIExJQlJBUllfUEFUSC4gRXhwZWN0IGRlZ3JhZGVkIHBlcmZvcm1hbmNlIGR1ZSB0byBubyBpbmxpbmluZyBvZiBydW50aW1lIGZ1bmN0aW9ucyBvbiB0YXJnZXQgZGV2aWNlcy4iLCA0NzgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX2Rydl9vcHRpbWl6YXRpb25fdmFsdWUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm9wdGltaXphdGlvbiBsZXZlbCAnJTAnIGlzIG5vdCBzdXBwb3J0ZWQ7IHVzaW5nICclMSUyJyBpbnN0ZWFkIiwgMzE0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfb3ZlcnJpZGluZ19mbGFnX29wdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAib3ZlcnJpZGluZyAnJTAnIG9wdGlvbiB3aXRoICclMSciLCA0ODksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX2Rydl9wY2hfbm90X2ZpcnN0X2luY2x1ZGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInByZWNvbXBpbGVkIGhlYWRlciAnJTAnIHdhcyBpZ25vcmVkIGJlY2F1c2UgJyUxJyBpcyBub3QgZmlyc3QgJy1pbmNsdWRlJyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX2Rydl9wcmVwcm9jZXNzZWRfaW5wdXRfZmlsZV91bnVzZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiUwOiBwcmV2aW91c2x5IHByZXByb2Nlc3NlZCBpbnB1dCVzZWxlY3R7IHVudXNlZCB3aGVuICclMicgaXMgcHJlc2VudHx9MSIsIDY4MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fZHJ2X3BzNF9mb3JjZV9waWMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm9wdGlvbiAnJTAnIHdhcyBpZ25vcmVkIGJ5IHRoZSBQUzQgdG9vbGNoYWluLCB1c2luZyAnLWZQSUMnIiwgNDc5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfcHM0X3Nka19kaXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImVudmlyb25tZW50IHZhcmlhYmxlIFNDRV9PUkJJU19TREtfRElSIGlzIHNldCwgYnV0IHBvaW50cyB0byBpbnZhbGlkIG9yIG5vbmV4aXN0ZW50IGRpcmVjdG9yeSAnJTAnIiwgMzIxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfdHJlYXRpbmdfaW5wdXRfYXNfY3h4LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ0cmVhdGluZyAnJTAnIGlucHV0IGFzICclMScgd2hlbiBpbiBDKysgbW9kZSwgdGhpcyBiZWhhdmlvciBpcyBkZXByZWNhdGVkIiwgMTUzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjcpCitESUFHKHdhcm5fZHJ2X3VuYWJsZV90b19maW5kX2RpcmVjdG9yeV9leHBlY3RlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidW5hYmxlIHRvIGZpbmQgJTAgZGlyZWN0b3J5LCBleHBlY3RlZCB0byBiZSBpbiAnJTEnIiwgMzIxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfdW5rbm93bl9hcmd1bWVudF9jbGFuZ19jbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidW5rbm93biBhcmd1bWVudCBpZ25vcmVkIGluIGNsYW5nLWNsOiAnJTAnIiwgNjU3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfdW5rbm93bl9hcmd1bWVudF9jbGFuZ19jbF93aXRoX3N1Z2dlc3Rpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVua25vd24gYXJndW1lbnQgaWdub3JlZCBpbiBjbGFuZy1jbCAnJTAnIChkaWQgeW91IG1lYW4gJyUxJz8pIiwgNjU3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfdW5zdXBwb3J0ZWRfYWJpY2FsbHMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImlnbm9yaW5nICctbWFiaWNhbGxzJyBvcHRpb24gYXMgaXQgY2Fubm90IGJlIHVzZWQgd2l0aCBub24gcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZSBhbmQgdGhlIE42NCBBQkkiLCA0NzksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX2Rydl91bnN1cHBvcnRlZF9ncG9wdCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaWdub3JpbmcgJy1tZ3BvcHQnIG9wdGlvbiBhcyBpdCBjYW5ub3QgYmUgdXNlZCB3aXRoICVzZWxlY3R7fHRoZSBpbXBsaWNpdCB1c2FnZSBvZiB9MC1tYWJpY2FsbHMiLCA2NzcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX2Rydl91bnN1cHBvcnRlZF9sb25nY2FsbHMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImlnbm9yaW5nICctbWxvbmctY2FsbHMnIG9wdGlvbiBhcyBpdCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCB3aXRoICVzZWxlY3R7fHRoZSBpbXBsaWNpdCB1c2FnZSBvZiB9MC1tYWJpY2FsbHMiLCA0NzksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX2Rydl91bnN1cHBvcnRlZF9vcHRfZm9yX3RhcmdldCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAib3B0aW1pemF0aW9uIGZsYWcgJyUwJyBpcyBub3Qgc3VwcG9ydGVkIGZvciB0YXJnZXQgJyUxJyIsIDI2NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fZHJ2X3VudXNlZF9hcmd1bWVudCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYXJndW1lbnQgdW51c2VkIGR1cmluZyBjb21waWxhdGlvbjogJyUwJyIsIDY4MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fZHJ2X3ljX211bHRpcGxlX2lucHV0c19jbGFuZ19jbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAic3VwcG9ydCBmb3IgJy9ZYycgd2l0aCBtb3JlIHRoYW4gb25lIHNvdXJjZSBmaWxlIG5vdCBpbXBsZW1lbnRlZCB5ZXQ7IGZsYWcgaWdub3JlZCIsIDExOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fZHJ2X3ljeXVfZGlmZmVyZW50X2FyZ19jbGFuZ19jbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAic3VwcG9ydCBmb3IgJy9ZYycgYW5kICcvWXUnIHdpdGggZGlmZmVyZW50IGZpbGVuYW1lcyBub3QgaW1wbGVtZW50ZWQgeWV0OyBmbGFncyBpZ25vcmVkIiwgMTE5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9kcnZfeWN5dV9ub19hcmdfY2xhbmdfY2wsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInN1cHBvcnQgZm9yICclMCcgd2l0aG91dCBhIGZpbGVuYW1lIG5vdCBpbXBsZW1lbnRlZCB5ZXQ7IGZsYWcgaWdub3JlZCIsIDExOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fZHJ2X3ljeXVfbm9fZmlfYXJnX2NsYW5nX2NsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJzdXBwb3J0IGZvciAnJTAnIHdpdGhvdXQgYSBjb3JyZXNwb25kaW5nIC9GSSBmbGFnIG5vdCBpbXBsZW1lbnRlZCB5ZXQ7IGZsYWcgaWdub3JlZCIsIDExOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5faWdub3JlZF9jbGFuZ19vcHRpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInRoZSBmbGFnICclMCcgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSBpZ25vcmVkIiwgNjgzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9pZ25vcmVkX2djY19vcHRpbWl6YXRpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm9wdGltaXphdGlvbiBmbGFnICclMCcgaXMgbm90IHN1cHBvcnRlZCIsIDI2NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5faWdub3JpbmdfZnRhYnN0b3BfdmFsdWUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImlnbm9yaW5nIGludmFsaWQgLWZ0YWJzdG9wIHZhbHVlICclMCcsIHVzaW5nIGRlZmF1bHQgdmFsdWUgJTEiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9pbmNvbXBhdGlibGVfc3lzcm9vdCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidXNpbmcgc3lzcm9vdCBmb3IgJyUwJyBidXQgdGFyZ2V0aW5nICclMSciLCAyOTMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX2ludmFsaWRfaW9zX2RlcGxveW1lbnRfdGFyZ2V0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBpT1MgZGVwbG95bWVudCB2ZXJzaW9uICclMCcsIGlPUyAxMCBpcyB0aGUgbWF4aW11bSBkZXBsb3ltZW50IHRhcmdldCBmb3IgMzItYml0IHRhcmdldHMiLCAzMTgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX21pc3Npbmdfc3lzcm9vdCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibm8gc3VjaCBzeXNyb290IGRpcmVjdG9yeTogJyUwJyIsIDM5NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fc2xhc2hfdV9maWxlbmFtZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJy9VJTAnIHRyZWF0ZWQgYXMgdGhlICcvVScgb3B0aW9uIiwgNTc5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl90YXJnZXRfdW5zdXBwb3J0ZWRfYWJzMjAwOCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaWdub3JpbmcgJy1tYWJzPTIwMDgnIG9wdGlvbiBiZWNhdXNlIHRoZSAnJTAnIGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IGl0IiwgNjcyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl90YXJnZXRfdW5zdXBwb3J0ZWRfYWJzbGVnYWN5LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpZ25vcmluZyAnLW1hYnM9bGVnYWN5JyBvcHRpb24gYmVjYXVzZSB0aGUgJyUwJyBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCBpdCIsIDY3MiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fdGFyZ2V0X3Vuc3VwcG9ydGVkX2NvbXBhY3RfYnJhbmNoZXMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImlnbm9yaW5nICctbWNvbXBhY3QtYnJhbmNoZXM9JyBvcHRpb24gYmVjYXVzZSB0aGUgJyUwJyBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCBpdCIsIDY3NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fdGFyZ2V0X3Vuc3VwcG9ydGVkX25hbjIwMDgsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImlnbm9yaW5nICctbW5hbj0yMDA4JyBvcHRpb24gYmVjYXVzZSB0aGUgJyUwJyBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCBpdCIsIDY3OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fdGFyZ2V0X3Vuc3VwcG9ydGVkX25hbmxlZ2FjeSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaWdub3JpbmcgJy1tbmFuPWxlZ2FjeScgb3B0aW9uIGJlY2F1c2UgdGhlICclMCcgYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgaXQiLCA2NzgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0Vycm9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljRXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjRiMDczCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0Vycm9yLmgKQEAgLTAsMCArMSw2MSBAQAorLy89PT0tLS0gRGlhZ25vc3RpY0Vycm9yLmggLSBEaWFnbm9zdGljIHBheWxvYWQgZm9yIGxsdm06OkVycm9yIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX0RJQUdOT1NUSUNfRVJST1JfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX0RJQUdOT1NUSUNfRVJST1JfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvUGFydGlhbERpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBDYXJyaWVzIGEgQ2xhbmcgZGlhZ25vc3RpYyBpbiBhbiBsbHZtOjpFcnJvci4KKy8vLworLy8vIFVzZXJzIHNob3VsZCBlbWl0IHRoZSBzdG9yZWQgZGlhZ25vc3RpYyB1c2luZyB0aGUgRGlhZ25vc3RpY3NFbmdpbmUuCitjbGFzcyBEaWFnbm9zdGljRXJyb3IgOiBwdWJsaWMgbGx2bTo6RXJyb3JJbmZvPERpYWdub3N0aWNFcnJvcj4geworcHVibGljOgorICBEaWFnbm9zdGljRXJyb3IoUGFydGlhbERpYWdub3N0aWNBdCBEaWFnKSA6IERpYWcoc3RkOjptb3ZlKERpYWcpKSB7fQorCisgIHZvaWQgbG9nKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgeyBPUyA8PCAiY2xhbmcgZGlhZ25vc3RpYyI7IH0KKworICBQYXJ0aWFsRGlhZ25vc3RpY0F0ICZnZXREaWFnbm9zdGljKCkgeyByZXR1cm4gRGlhZzsgfQorICBjb25zdCBQYXJ0aWFsRGlhZ25vc3RpY0F0ICZnZXREaWFnbm9zdGljKCkgY29uc3QgeyByZXR1cm4gRGlhZzsgfQorCisgIC8vLyBDcmVhdGVzIGEgbmV3IFxjIERpYWdub3N0aWNFcnJvciB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBkaWFnbm9zdGljIGF0CisgIC8vLyB0aGUgZ2l2ZW4gbG9jYXRpb24uCisgIHN0YXRpYyBsbHZtOjpFcnJvciBjcmVhdGUoU291cmNlTG9jYXRpb24gTG9jLCBQYXJ0aWFsRGlhZ25vc3RpYyBEaWFnKSB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VfZXJyb3I8RGlhZ25vc3RpY0Vycm9yPigKKyAgICAgICAgUGFydGlhbERpYWdub3N0aWNBdChMb2MsIHN0ZDo6bW92ZShEaWFnKSkpOworICB9CisKKyAgLy8vIEV4dHJhY3RzIGFuZCByZXR1cm5zIHRoZSBkaWFnbm9zdGljIHBheWxvYWQgZnJvbSB0aGUgZ2l2ZW4gXGMgRXJyb3IgaWYKKyAgLy8vIHRoZSBlcnJvciBpcyBhIFxjIERpYWdub3N0aWNFcnJvci4gUmV0dXJucyBub25lIGlmIHRoZSBnaXZlbiBlcnJvciBpcyBub3QKKyAgLy8vIGEgXGMgRGlhZ25vc3RpY0Vycm9yLgorICBzdGF0aWMgT3B0aW9uYWw8UGFydGlhbERpYWdub3N0aWNBdD4gdGFrZShsbHZtOjpFcnJvciAmRXJyKSB7CisgICAgT3B0aW9uYWw8UGFydGlhbERpYWdub3N0aWNBdD4gUmVzdWx0OworICAgIEVyciA9IGxsdm06OmhhbmRsZUVycm9ycyhzdGQ6Om1vdmUoRXJyKSwgWyZdKERpYWdub3N0aWNFcnJvciAmRSkgeworICAgICAgUmVzdWx0ID0gc3RkOjptb3ZlKEUuZ2V0RGlhZ25vc3RpYygpKTsKKyAgICB9KTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgc3RhdGljIGNoYXIgSUQ7CisKK3ByaXZhdGU6CisgIC8vIFVzZXJzIGFyZSBub3QgZXhwZWN0ZWQgdG8gdXNlIGVycm9yX2NvZGUuCisgIHN0ZDo6ZXJyb3JfY29kZSBjb252ZXJ0VG9FcnJvckNvZGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGxsdm06OmluY29udmVydGlibGVFcnJvckNvZGUoKTsKKyAgfQorCisgIFBhcnRpYWxEaWFnbm9zdGljQXQgRGlhZzsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19CQVNJQ19ESUFHTk9TVElDX0VSUk9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNGcm9udGVuZEtpbmRzLmluYyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNGcm9udGVuZEtpbmRzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjIwMjk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0Zyb250ZW5kS2luZHMuaW5jCkBAIC0wLDAgKzEsMTAxIEBACisjaWZkZWYgRlJPTlRFTkRTVEFSVAorX19GUk9OVEVORFNUQVJUID0gRElBR19TVEFSVF9GUk9OVEVORCwKKyN1bmRlZiBGUk9OVEVORFNUQVJUCisjZW5kaWYKKworRElBRyhlcnJfZmVfYWN0aW9uX25vdF9hdmFpbGFibGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYWN0aW9uICUwIG5vdCBjb21waWxlZCBpbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2ZlX2JhY2tlbmRfZnJhbWVfbGFyZ2VyX3RoYW4sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE2KQorRElBRyhlcnJfZmVfYmFja2VuZF9wbHVnaW4sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE2KQorRElBRyhlcnJfZmVfYmFja2VuZF91bnN1cHBvcnRlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTYpCitESUFHKGVycl9mZV9jYW5ub3RfbGlua19tb2R1bGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2Fubm90IGxpbmsgbW9kdWxlICclMCc6ICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZmVfZGVwZW5kZW5jeV9maWxlX3JlcXVpcmVzX01ULCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIi1kZXBlbmRlbmN5LWZpbGUgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIC1NVCBvciAtTVEgb3B0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZmVfZXJyb3JfYmFja2VuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJlcnJvciBpbiBiYWNrZW5kOiAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2ZlX2Vycm9yX29wZW5pbmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXJyb3Igb3BlbmluZyAnJTAnOiAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2ZlX2Vycm9yX3JlYWRpbmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXJyb3IgcmVhZGluZyAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZmVfZXJyb3JfcmVhZGluZ19zdGRpbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJlcnJvciByZWFkaW5nIHN0ZGluOiAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2ZlX2V4cGVjdGVkX2NsYW5nX2NvbW1hbmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgYSBjbGFuZyBjb21waWxlciBjb21tYW5kIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZmVfZXhwZWN0ZWRfY29tcGlsZXJfam9iLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuYWJsZSB0byBoYW5kbGUgY29tcGlsYXRpb24sIGV4cGVjdGVkIGV4YWN0bHkgb25lIGNvbXBpbGVyIGpvYiBpbiAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZmVfaW5saW5lX2FzbSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTIpCitESUFHKGVycl9mZV9pbnZhbGlkX2FsaWdubWVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIHZhbHVlICclMScgaW4gJyUwJzsgYWxpZ25tZW50IG11c3QgYmUgYSBwb3dlciBvZiAyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZmVfaW52YWxpZF9jb2RlX2NvbXBsZXRlX2ZpbGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2Fubm90IGxvY2F0ZSBjb2RlLWNvbXBsZXRpb24gZmlsZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2ZlX2ludmFsaWRfcGx1Z2luX25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5hYmxlIHRvIGZpbmQgcGx1Z2luICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9mZV9pbnZhbGlkX3djaGFyX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCB3Y2hhcl90IHR5cGUgJyUwJzsgbXVzdCBiZSBvbmUgb2YgJ2NoYXInLCAnc2hvcnQnLCAnaW50JyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2ZlX25vX3BjaF9pbl9kaXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gc3VpdGFibGUgcHJlY29tcGlsZWQgaGVhZGVyIGZpbGUgZm91bmQgaW4gZGlyZWN0b3J5ICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9mZV9wdGhfZmlsZV9oYXNfbm9fc291cmNlX2hlYWRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJQVEggZmlsZSAnJTAnIGRvZXMgbm90IGRlc2lnbmF0ZSBhbiBvcmlnaW5hbCBzb3VyY2UgaGVhZGVyIGZpbGUgZm9yIC1pbmNsdWRlLXB0aCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2ZlX3JlbWFwX21pc3NpbmdfZnJvbV9maWxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNvdWxkIG5vdCByZW1hcCBmcm9tIG1pc3NpbmcgZmlsZSAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZmVfcmVtYXBfbWlzc2luZ190b19maWxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNvdWxkIG5vdCByZW1hcCBmaWxlICclMCcgdG8gdGhlIGNvbnRlbnRzIG9mIGZpbGUgJyUxJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2ZlX3N0ZG91dF9iaW5hcnksIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidW5hYmxlIHRvIGNoYW5nZSBzdGFuZGFyZCBvdXRwdXQgdG8gYmluYXJ5IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfZmVfdW5hYmxlX3RvX2NyZWF0ZV90YXJnZXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5hYmxlIHRvIGNyZWF0ZSB0YXJnZXQ6ICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9mZV91bmFibGVfdG9faW50ZXJmYWNlX3dpdGhfdGFyZ2V0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuYWJsZSB0byBpbnRlcmZhY2Ugd2l0aCB0YXJnZXQgbWFjaGluZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2ZlX3VuYWJsZV90b19sb2FkX3BjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmFibGUgdG8gbG9hZCBQQ0ggZmlsZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2ZlX3VuYWJsZV90b19sb2FkX3BsdWdpbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmFibGUgdG8gbG9hZCBwbHVnaW4gJyUwJzogJyUxJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX2ZlX3VuYWJsZV90b19vcGVuX291dHB1dCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmFibGUgdG8gb3BlbiBvdXRwdXQgZmlsZSAnJTAnOiAnJTEnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfaW52YWxpZF92ZnNfb3ZlcmxheSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbnZhbGlkIHZpcnR1YWwgZmlsZXN5c3RlbSBvdmVybGF5IGZpbGUgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX21pc3NpbmdfbW9kdWxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm5vIG1vZHVsZSBuYW1lZCAnJTAnIGRlY2xhcmVkIGluIG1vZHVsZSBtYXAgZmlsZSAnJTEnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfbWlzc2luZ19tb2R1bGVfbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJubyBtb2R1bGUgbmFtZSBwcm92aWRlZDsgc3BlY2lmeSBvbmUgd2l0aCAtZm1vZHVsZS1uYW1lPSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX21pc3NpbmdfdmZzX292ZXJsYXlfZmlsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ2aXJ0dWFsIGZpbGVzeXN0ZW0gb3ZlcmxheSBmaWxlICclMCcgbm90IGZvdW5kIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfbW9kdWxlX2J1aWxkX3JlcXVpcmVzX2Ztb2R1bGVzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1vZHVsZSBjb21waWxhdGlvbiByZXF1aXJlcyAnLWZtb2R1bGVzJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX21vZHVsZV9jYW5ub3RfY3JlYXRlX2luY2x1ZGVzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBjcmVhdGUgaW5jbHVkZXMgZmlsZSBmb3IgbW9kdWxlICUwOiAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX21vZHVsZV9pbnRlcmZhY2VfcmVxdWlyZXNfbW9kdWxlc190cywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtb2R1bGUgaW50ZXJmYWNlIGNvbXBpbGF0aW9uIHJlcXVpcmVzICctZm1vZHVsZXMtdHMnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfbW9kdWxlX21hcF9ub3RfZm91bmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAibW9kdWxlIG1hcCBmaWxlICclMCcgbm90IGZvdW5kIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfbW9kdWxlc19lbWJlZF9maWxlX25vdF9mb3VuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJmaWxlICclMCcgc3BlY2lmaWVkIGJ5ICctZm1vZHVsZXMtZW1iZWQtZmlsZT0nIG5vdCBmb3VuZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX25vX3N1Ym1vZHVsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyBzdWJtb2R1bGUgbmFtZWQgJTAgaW4gbW9kdWxlICclMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9ub19zdWJtb2R1bGVfc3VnZ2VzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyBzdWJtb2R1bGUgbmFtZWQgJTAgaW4gbW9kdWxlICclMSc7IGRpZCB5b3UgbWVhbiAnJTInPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX3JlbG9jYXRhYmxlX3dpdGhvdXRfaXN5c3Jvb3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibXVzdCBzcGVjaWZ5IHN5c3RlbSByb290IHdpdGggLWlzeXNyb290IHdoZW4gYnVpbGRpbmcgYSByZWxvY2F0YWJsZSBQQ0ggZmlsZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX3Rlc3RfbW9kdWxlX2ZpbGVfZXh0ZW5zaW9uX3ZlcnNpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGVzdCBtb2R1bGUgZmlsZSBleHRlbnNpb24gJyUwJyBoYXMgZGlmZmVyZW50IHZlcnNpb24gKCUxLiUyKSB0aGFuIGV4cGVjdGVkICglMy4lNCkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl91bmtub3duX2FuYWx5emVyX2NoZWNrZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gYW5hbHl6ZXIgY2hlY2tlcnMgYXJlIGFzc29jaWF0ZWQgd2l0aCAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfdmVyaWZ5X2luY29uc2lzdGVudF9kaWFncywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInJTAnIGRpYWdub3N0aWNzICVzZWxlY3R7ZXhwZWN0ZWR8c2Vlbn0xIGJ1dCBub3QgJXNlbGVjdHtzZWVufGV4cGVjdGVkfTE6ICUyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfdmVyaWZ5X2ludmFsaWRfY29udGVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIGV4cGVjdGVkICUwOiAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX3ZlcmlmeV9pbnZhbGlkX25vX2RpYWdzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7ZXhwZWN0ZWR8J2V4cGVjdGVkLW5vLWRpYWdub3N0aWNzJ30wIGRpcmVjdGl2ZSBjYW5ub3QgZm9sbG93ICVzZWxlY3R7J2V4cGVjdGVkLW5vLWRpYWdub3N0aWNzJyBkaXJlY3RpdmV8b3RoZXIgZXhwZWN0ZWQgZGlyZWN0aXZlc30wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfdmVyaWZ5X2ludmFsaWRfcmFuZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCByYW5nZSBmb2xsb3dpbmcgJy0nIGluIGV4cGVjdGVkICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfdmVyaWZ5X21pc3NpbmdfZW5kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBmaW5kIGVuZCAoJ319Jykgb2YgZXhwZWN0ZWQgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl92ZXJpZnlfbWlzc2luZ19maWxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZpbGUgJyUwJyBjb3VsZCBub3QgYmUgbG9jYXRlZCBpbiBleHBlY3RlZCAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX3ZlcmlmeV9taXNzaW5nX2xpbmUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWlzc2luZyBvciBpbnZhbGlkIGxpbmUgbnVtYmVyIGZvbGxvd2luZyAnQCcgaW4gZXhwZWN0ZWQgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl92ZXJpZnlfbWlzc2luZ19yZWdleCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZmluZCBzdGFydCBvZiByZWdleCAoJ3t7JykgaW4gJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl92ZXJpZnlfbWlzc2luZ19zdGFydCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZmluZCBzdGFydCAoJ3t7Jykgb2YgZXhwZWN0ZWQgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl92ZXJpZnlfbm9fZGlyZWN0aXZlcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyBleHBlY3RlZCBkaXJlY3RpdmVzIGZvdW5kOiBjb25zaWRlciB1c2Ugb2YgJ2V4cGVjdGVkLW5vLWRpYWdub3N0aWNzJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcobm90ZV9mZV9iYWNrZW5kX2ZyYW1lX2xhcmdlcl90aGFuLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCB0cnVlLCAxNikKK0RJQUcobm90ZV9mZV9iYWNrZW5kX2ludmFsaWRfbG9jLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY291bGQgbm90IGRldGVybWluZSB0aGUgb3JpZ2luYWwgc291cmNlIGxvY2F0aW9uIGZvciAlMDolMTolMiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIHRydWUsIDE2KQorRElBRyhub3RlX2ZlX2JhY2tlbmRfcGx1Z2luLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCB0cnVlLCAxNikKK0RJQUcobm90ZV9mZV9pbmxpbmVfYXNtLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTIpCitESUFHKG5vdGVfZmVfaW5saW5lX2FzbV9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW5zdGFudGlhdGVkIGludG8gYXNzZW1ibHkgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2ZpeGl0X2FwcGxpZWQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJGSVgtSVQgYXBwbGllZCBzdWdnZXN0ZWQgY29kZSBjaGFuZ2VzIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfZml4aXRfZmFpbGVkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiRklYLUlUIHVuYWJsZSB0byBhcHBseSBzdWdnZXN0ZWQgY29kZSBjaGFuZ2VzIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfZml4aXRfaW5fbWFjcm8sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJGSVgtSVQgdW5hYmxlIHRvIGFwcGx5IHN1Z2dlc3RlZCBjb2RlIGNoYW5nZXMgaW4gYSBtYWNybyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2ZpeGl0X3VuZml4ZWRfZXJyb3IsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJGSVgtSVQgZGV0ZWN0ZWQgYW4gZXJyb3IgaXQgY2Fubm90IGZpeCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2luY29tcGF0aWJsZV9hbmFseXplcl9wbHVnaW5fYXBpLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY3VycmVudCBBUEkgdmVyc2lvbiBpcyAnJTAnLCBidXQgcGx1Z2luIHdhcyBjb21waWxlZCB3aXRoIHZlcnNpb24gJyUxJyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX21vZHVsZV9kZWZfdW5kZWZfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm1hY3JvIHdhcyAlc2VsZWN0e2RlZmluZWR8I3VuZGVmJ2R9MCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKG5vdGVfbW9kdWxlX2ltcG9ydF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAibW9kdWxlIGltcG9ydGVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9wcml2YXRlX3RvcF9sZXZlbF9kZWZpbmVkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAibW9kdWxlIGRlZmluZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX3N1Z2dlc3RfZGlzYWJsaW5nX2FsbF9jaGVja2VycywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInVzZSAtYW5hbHl6ZXItZGlzYWJsZS1hbGwtY2hlY2tzIHRvIGRpc2FibGUgYWxsIHN0YXRpYyBhbmFseXplciBjaGVja2VycyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhyZW1hcmtfZmVfYmFja2VuZF9vcHRpbWl6YXRpb25fcmVtYXJrLCBDTEFTU19SRU1BUkssICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiUwIiwgNDk1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCB0cnVlLCAxNikKK0RJQUcocmVtYXJrX2ZlX2JhY2tlbmRfb3B0aW1pemF0aW9uX3JlbWFya19hbmFseXNpcywgQ0xBU1NfUkVNQVJLLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlMCIsIDQ5NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgdHJ1ZSwgMTYpCitESUFHKHJlbWFya19mZV9iYWNrZW5kX29wdGltaXphdGlvbl9yZW1hcmtfYW5hbHlzaXNfYWxpYXNpbmcsIENMQVNTX1JFTUFSSywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJTA7IGFsbG93IHJlb3JkZXJpbmcgYnkgc3BlY2lmeWluZyAnI3ByYWdtYSBjbGFuZyBsb29wIHZlY3Rvcml6ZShlbmFibGUpJyBiZWZvcmUgdGhlIGxvb3AuIElmIHRoZSBhcnJheXMgd2lsbCBhbHdheXMgYmUgaW5kZXBlbmRlbnQgc3BlY2lmeSAnI3ByYWdtYSBjbGFuZyBsb29wIHZlY3Rvcml6ZShhc3N1bWVfc2FmZXR5KScgYmVmb3JlIHRoZSBsb29wIG9yIHByb3ZpZGUgdGhlICdfX3Jlc3RyaWN0X18nIHF1YWxpZmllciB3aXRoIHRoZSBpbmRlcGVuZGVudCBhcnJheSBhcmd1bWVudHMuIEVycm9uZW91cyByZXN1bHRzIHdpbGwgb2NjdXIgaWYgdGhlc2Ugb3B0aW9ucyBhcmUgaW5jb3JyZWN0bHkgYXBwbGllZCEiLCA0OTYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIHRydWUsIDE2KQorRElBRyhyZW1hcmtfZmVfYmFja2VuZF9vcHRpbWl6YXRpb25fcmVtYXJrX2FuYWx5c2lzX2ZwY29tbXV0ZSwgQ0xBU1NfUkVNQVJLLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlMDsgYWxsb3cgcmVvcmRlcmluZyBieSBzcGVjaWZ5aW5nICcjcHJhZ21hIGNsYW5nIGxvb3AgdmVjdG9yaXplKGVuYWJsZSknIGJlZm9yZSB0aGUgbG9vcCBvciBieSBwcm92aWRpbmcgdGhlIGNvbXBpbGVyIG9wdGlvbiAnLWZmYXN0LW1hdGgnLiIsIDQ5NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgdHJ1ZSwgMTYpCitESUFHKHJlbWFya19mZV9iYWNrZW5kX29wdGltaXphdGlvbl9yZW1hcmtfbWlzc2VkLCBDTEFTU19SRU1BUkssICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiUwIiwgNDk4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCB0cnVlLCAxNikKK0RJQUcocmVtYXJrX2ZlX2JhY2tlbmRfcGx1Z2luLCBDTEFTU19SRU1BUkssICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiUwIiwgNTM3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCB0cnVlLCAxNikKK0RJQUcocmVtYXJrX21vZHVsZV9idWlsZCwgQ0xBU1NfUkVNQVJLLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJidWlsZGluZyBtb2R1bGUgJyUwJyBhcyAnJTEnIiwgMzk2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcocmVtYXJrX21vZHVsZV9idWlsZF9kb25lLCBDTEFTU19SRU1BUkssICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImZpbmlzaGVkIGJ1aWxkaW5nIG1vZHVsZSAnJTAnIiwgMzk2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcocmVtYXJrX3Nhbml0aXplX2FkZHJlc3NfaW5zZXJ0X2V4dHJhX3BhZGRpbmdfYWNjZXB0ZWQsIENMQVNTX1JFTUFSSywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiLWZzYW5pdGl6ZS1hZGRyZXNzLWZpZWxkLXBhZGRpbmcgYXBwbGllZCB0byAlMCIsIDU0NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcocmVtYXJrX3Nhbml0aXplX2FkZHJlc3NfaW5zZXJ0X2V4dHJhX3BhZGRpbmdfcmVqZWN0ZWQsIENMQVNTX1JFTUFSSywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiLWZzYW5pdGl6ZS1hZGRyZXNzLWZpZWxkLXBhZGRpbmcgaWdub3JlZCBmb3IgJTAgYmVjYXVzZSBpdCAlc2VsZWN0e2lzIG5vdCBDKyt8aXMgcGFja2VkfGlzIGEgdW5pb258aXMgdHJpdmlhbGx5IGNvcHlhYmxlfGhhcyB0cml2aWFsIGRlc3RydWN0b3J8aXMgc3RhbmRhcmQgbGF5b3V0fGlzIGluIGEgYmxhY2tsaXN0ZWQgZmlsZXxpcyBibGFja2xpc3RlZH0xIiwgNTQ3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCB0cnVlLCAwKQorRElBRyh3YXJuX2ZlX2JhY2tlbmRfZnJhbWVfbGFyZ2VyX3RoYW4sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiUwIiwgMjMwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCB0cnVlLCAxNikKK0RJQUcod2Fybl9mZV9iYWNrZW5kX29wdGltaXphdGlvbl9mYWlsdXJlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMCIsIDQ5NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgdHJ1ZSwgMTYpCitESUFHKHdhcm5fZmVfYmFja2VuZF9wbHVnaW4sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiUwIiwgNTEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIHRydWUsIDE2KQorRElBRyh3YXJuX2ZlX2NjX2xvZ19kaWFnbm9zdGljc19mYWlsdXJlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1bmFibGUgdG8gb3BlbiBDQ19MT0dfRElBR05PU1RJQ1MgZmlsZTogJTAgKHVzaW5nIHN0ZGVycikiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9mZV9jY19wcmludF9oZWFkZXJfZmFpbHVyZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidW5hYmxlIHRvIG9wZW4gQ0NfUFJJTlRfSEVBREVSUyBmaWxlOiAlMCAodXNpbmcgc3RkZXJyKSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX2ZlX2ZyYW1lX2xhcmdlcl90aGFuLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJzdGFjayBmcmFtZSBzaXplIG9mICUwIGJ5dGVzIGluICVxMSIsIDIzMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgdHJ1ZSwgMTYpCitESUFHKHdhcm5fZmVfaW5saW5lX2FzbSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAiLCAzMDYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxMikKK0RJQUcod2Fybl9mZV9tYWNyb19jb250YWluc19lbWJlZGRlZF9uZXdsaW5lLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJtYWNybyAnJTAnIGNvbnRhaW5zIGVtYmVkZGVkIG5ld2xpbmU7IHRleHQgYWZ0ZXIgdGhlIG5ld2xpbmUgaXMgaWdub3JlZCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX2ZlX292ZXJyaWRlX21vZHVsZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAib3ZlcnJpZGluZyB0aGUgbW9kdWxlIHRhcmdldCB0cmlwbGUgd2l0aCAlMCIsIDQ4NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fZmVfc2VyaWFsaXplZF9kaWFnX2ZhaWx1cmUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVuYWJsZSB0byBvcGVuIGZpbGUgJTAgZm9yIHNlcmlhbGl6aW5nIGRpYWdub3N0aWNzICglMSkiLCA1NTcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX2ZlX3NlcmlhbGl6ZWRfZGlhZ19tZXJnZV9mYWlsdXJlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1bmFibGUgdG8gbWVyZ2UgYSBzdWJwcm9jZXNzJ3Mgc2VyaWFsaXplZCBkaWFnbm9zdGljcyIsIDU1NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fZmVfdW5hYmxlX3RvX29wZW5fc3RhdHNfZmlsZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidW5hYmxlIHRvIG9wZW4gc3RhdGlzdGljcyBvdXRwdXQgZmlsZSAnJTAnOiAnJTEnIiwgNjM5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9maXhpdF9ub19jaGFuZ2VzLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiRklYLUlUIGRldGVjdGVkIGVycm9ycyBpdCBjb3VsZCBub3QgZml4OyBubyBvdXRwdXQgd2lsbCBiZSBnZW5lcmF0ZWQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9pbmNvbXBhdGlibGVfYW5hbHl6ZXJfcGx1Z2luX2FwaSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY2hlY2tlciBwbHVnaW4gJyUwJyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgdmVyc2lvbiBvZiB0aGUgYW5hbHl6ZXIiLCAyMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fbWlzc2luZ19zdWJtb2R1bGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm1pc3Npbmcgc3VibW9kdWxlICclMCciLCAyOTYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX21vZHVsZV9jb25maWdfbWFjcm9fdW5kZWYsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiVzZWxlY3R7ZGVmaW5pdGlvbnwjdW5kZWZ9MCBvZiBjb25maWd1cmF0aW9uIG1hY3JvICclMScgaGFzIG5vIGVmZmVjdCBvbiB0aGUgaW1wb3J0IG9mICclMic7IHBhc3MgJyVzZWxlY3R7LUQlMT0uLi58LVUlMX0wJyBvbiB0aGUgY29tbWFuZCBsaW5lIHRvIGNvbmZpZ3VyZSB0aGUgbW9kdWxlIiwgMTI4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9tb2R1bGVfY29uZmlnX21pc21hdGNoLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibW9kdWxlIGZpbGUgJTAgY2Fubm90IGJlIGxvYWRlZCBkdWUgdG8gYSBjb25maWd1cmF0aW9uIG1pc21hdGNoIHdpdGggdGhlIGN1cnJlbnQgY29tcGlsYXRpb24iLCAzOTgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX25vX3ByaXZfc3VibW9kdWxlX3VzZV90b3BsZXZlbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibm8gc3VibW9kdWxlIG5hbWVkICUwIGluIG1vZHVsZSAnJTEnOyB1c2luZyB0b3AgbGV2ZWwgJyUyJyIsIDUxOCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDApCitESUFHKHdhcm5fb3B0aW9uX2ludmFsaWRfb2NsX3ZlcnNpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIk9wZW5DTCB2ZXJzaW9uICUwIGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wdGlvbiAnJTEnIiwgMTUzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjcpCitESUFHKHdhcm5fdW5rbm93bl9kaWFnX29wdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidW5rbm93biAlc2VsZWN0e3dhcm5pbmd8cmVtYXJrfTAgb3B0aW9uICclMSclc2VsZWN0e3w7IGRpZCB5b3UgbWVhbiAnJTMnP30yIiwgNjYyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl91bmtub3duX3dhcm5pbmdfc3BlY2lmaWVyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1bmtub3duICUwIHdhcm5pbmcgc3BlY2lmaWVyOiAnJTEnIiwgNjYyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNHcm91cHMuaW5jIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0dyb3Vwcy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmNzU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNHcm91cHMuaW5jCkBAIC0wLDAgKzEsMTc1OSBAQAorCisjaWZkZWYgR0VUX0RJQUdfQVJSQVlTCitzdGF0aWMgY29uc3QgaW50MTZfdCBEaWFnQXJyYXlzW10gPSB7CisgIC8qIEVtcHR5ICovIC0xLAorICAvKiBEaWFnQXJyYXkxICovIGRpYWc6Ondhcm5fcHJhZ21hX21lc3NhZ2UsIC0xLAorICAvKiBEaWFnQXJyYXkyICovIGRpYWc6OnBwX2hhc2hfd2FybmluZywgLTEsCisgIC8qIERpYWdBcnJheTMgKi8gZGlhZzo6d2Fybl9jZnN0cmluZ190cnVuY2F0ZWQsIC0xLAorICAvKiBEaWFnQXJyYXk1ICovIGRpYWc6Ondhcm5faW5kZXBlbmRlbnRjbGFzc19hdHRyaWJ1dGUsIGRpYWc6Ondhcm5fcHRyX2luZGVwZW5kZW50Y2xhc3NfYXR0cmlidXRlLCAtMSwKKyAgLyogRGlhZ0FycmF5NiAqLyBkaWFnOjp3YXJuX25zb2JqZWN0X2F0dHJpYnV0ZSwgLTEsCisgIC8qIERpYWdBcnJheTggKi8gZGlhZzo6d2Fybl9hYnNfdG9vX3NtYWxsLCBkaWFnOjp3YXJuX3BvaW50ZXJfYWJzLCBkaWFnOjp3YXJuX3Vuc2lnbmVkX2FicywgZGlhZzo6d2Fybl93cm9uZ19hYnNvbHV0ZV92YWx1ZV90eXBlLCAtMSwKKyAgLyogRGlhZ0FycmF5OSAqLyBkaWFnOjp3YXJuX2Fic3RyYWN0X2ZpbmFsX2NsYXNzLCAtMSwKKyAgLyogRGlhZ0FycmF5MTAgKi8gZGlhZzo6d2Fybl9hYnN0cmFjdF92YmFzZV9pbml0X2lnbm9yZWQsIC0xLAorICAvKiBEaWFnQXJyYXkxMiAqLyBkaWFnOjp3YXJuX3RlbXBvcmFyeV9hcnJheV90b19wb2ludGVyX2RlY2F5LCAtMSwKKyAgLyogRGlhZ0FycmF5MTMgKi8gZGlhZzo6d2Fybl90YWtpbmdfYWRkcmVzc19vZl9wYWNrZWRfbWVtYmVyLCAtMSwKKyAgLyogRGlhZ0FycmF5MTQgKi8gZGlhZzo6ZXh0X3R5cGVjaGVja19hZGRyb2ZfdGVtcG9yYXJ5LCAtMSwKKyAgLyogRGlhZ0FycmF5MTYgKi8gZGlhZzo6d2Fybl9hbGlnbmVkX2FsbG9jYXRpb25fdW5hdmFpbGFibGUsIC0xLAorICAvKiBEaWFnQXJyYXkxOCAqLyBkaWFnOjp3YXJuX2FsbG9jYV9hbGlnbl9hbGlnbm9mLCAtMSwKKyAgLyogRGlhZ0FycmF5MTkgKi8gZGlhZzo6d2Fybl9hbWJpZ3VvdXNfc3VpdGFibGVfZGVsZXRlX2Z1bmN0aW9uX2ZvdW5kLCAtMSwKKyAgLyogRGlhZ0FycmF5MjAgKi8gZGlhZzo6d2Fybl9taXNwbGFjZWRfZWxsaXBzaXNfdmFyYXJnLCAtMSwKKyAgLyogRGlhZ0FycmF5MjEgKi8gZGlhZzo6d2Fybl9wcF9hbWJpZ3VvdXNfbWFjcm8sIC0xLAorICAvKiBEaWFnQXJyYXkyMiAqLyBkaWFnOjpleHRfbmVzdGVkX25hbWVfbWVtYmVyX3JlZl9sb29rdXBfYW1iaWd1b3VzLCAtMSwKKyAgLyogRGlhZ0FycmF5MjMgKi8gZGlhZzo6d2Fybl9pbmNvbXBhdGlibGVfYW5hbHl6ZXJfcGx1Z2luX2FwaSwgLTEsCisgIC8qIERpYWdBcnJheTI0ICovIGRpYWc6OmV4dF9hYnN0cmFjdF9wYWNrX2RlY2xhcmF0b3JfcGFyZW5zLCAtMSwKKyAgLyogRGlhZ0FycmF5MjYgKi8gZGlhZzo6d2Fybl9hcmNfYnJpZGdlX2Nhc3Rfbm9uYXJjLCAtMSwKKyAgLyogRGlhZ0FycmF5MjcgKi8gZGlhZzo6d2Fybl9hcmNfcG9zc2libGVfcmVwZWF0ZWRfdXNlX29mX3dlYWssIC0xLAorICAvKiBEaWFnQXJyYXkyOCAqLyBkaWFnOjp3YXJuX2FyY19vYmplY3RfbWVtYWNjZXNzLCAtMSwKKyAgLyogRGlhZ0FycmF5MjkgKi8gZGlhZzo6d2Fybl9hcmNfcGVyZm9ybV9zZWxlY3Rvcl9sZWFrcywgLTEsCisgIC8qIERpYWdBcnJheTMwICovIGRpYWc6Ondhcm5fYXJjX3JlcGVhdGVkX3VzZV9vZl93ZWFrLCAtMSwKKyAgLyogRGlhZ0FycmF5MzEgKi8gZGlhZzo6d2Fybl9hcmNfcmV0YWluX2N5Y2xlLCAtMSwKKyAgLyogRGlhZ0FycmF5MzIgKi8gZGlhZzo6d2Fybl9hcmNfbGl0ZXJhbF9hc3NpZ24sIGRpYWc6Ondhcm5fYXJjX3JldGFpbmVkX2Fzc2lnbiwgZGlhZzo6d2Fybl9hcmNfcmV0YWluZWRfcHJvcGVydHlfYXNzaWduLCAtMSwKKyAgLyogRGlhZ0FycmF5MzMgKi8gZGlhZzo6d2Fybl9hcnJheV9pbmRleF9leGNlZWRzX2JvdW5kcywgZGlhZzo6d2Fybl9hcnJheV9pbmRleF9wcmVjZWRlc19ib3VuZHMsIGRpYWc6Ondhcm5fc3RhdGljX2FycmF5X3Rvb19zbWFsbCwgZGlhZzo6d2Fybl90eXBlY2hlY2tfemVyb19zdGF0aWNfYXJyYXlfc2l6ZSwgLTEsCisgIC8qIERpYWdBcnJheTM0ICovIGRpYWc6Ondhcm5fcHRyX2FyaXRoX2V4Y2VlZHNfYm91bmRzLCBkaWFnOjp3YXJuX3B0cl9hcml0aF9wcmVjZWRlc19ib3VuZHMsIC0xLAorICAvKiBEaWFnQXJyYXkzNiAqLyBkaWFnOjp3YXJuX2FzbV9xdWFsaWZpZXJfaWdub3JlZCwgZGlhZzo6d2Fybl9maWxlX2FzbV92b2xhdGlsZSwgLTEsCisgIC8qIERpYWdBcnJheTM3ICovIGRpYWc6Ondhcm5fYXNtX21pc21hdGNoZWRfc2l6ZV9tb2RpZmllciwgLTEsCisgIC8qIERpYWdBcnJheTM4ICovIGRpYWc6Ondhcm5fbm90X2luX2VudW1fYXNzaWdubWVudCwgLTEsCisgIC8qIERpYWdBcnJheTM5ICovIGRpYWc6Ondhcm5fYXNzdW1lX3NpZGVfZWZmZWN0cywgLTEsCisgIC8qIERpYWdBcnJheTQwICovIGRpYWc6Ondhcm5fYXRwcm90b2NvbF9wcm90b2NvbCwgLTEsCisgIC8qIERpYWdBcnJheTQxICovIGRpYWc6Ondhcm5fYXRvbWljX29wX2hhc19pbnZhbGlkX21lbW9yeV9vcmRlciwgLTEsCisgIC8qIERpYWdBcnJheTQzICovIGRpYWc6Ondhcm5fYXRvbWljX3Byb3BlcnR5X3J1bGUsIC0xLAorICAvKiBEaWFnQXJyYXk0NCAqLyBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9wYWNrZWRfZm9yX2JpdGZpZWxkLCAtMSwKKyAgLyogRGlhZ0FycmF5NDYgKi8gZGlhZzo6d2Fybl9kcnZfZGlzYWJsaW5nX3ZwdHJfbm9fcnR0aV9kZWZhdWx0LCAtMSwKKyAgLyogRGlhZ0FycmF5NDcgKi8gZGlhZzo6d2Fybl9hdXRvX21vZHVsZV9pbXBvcnQsIC0xLAorICAvKiBEaWFnQXJyYXk0OCAqLyBkaWFnOjpleHRfYXV0b19zdG9yYWdlX2NsYXNzLCAtMSwKKyAgLyogRGlhZ0FycmF5NDkgKi8gZGlhZzo6d2Fybl9hdXRvX3Zhcl9pc19pZCwgLTEsCisgIC8qIERpYWdBcnJheTUwICovIGRpYWc6Ondhcm5fYXZhaWxhYmlsaXR5X2FuZF91bmF2YWlsYWJsZSwgZGlhZzo6d2Fybl9hdmFpbGFiaWxpdHlfdW5rbm93bl9wbGF0Zm9ybSwgZGlhZzo6d2Fybl9hdmFpbGFiaWxpdHlfdmVyc2lvbl9vcmRlcmluZywgZGlhZzo6d2Fybl9leHBlY3RlZF9jb25zaXN0ZW50X3ZlcnNpb25fc2VwYXJhdG9yLCBkaWFnOjp3YXJuX21pc21hdGNoZWRfYXZhaWxhYmlsaXR5LCBkaWFnOjp3YXJuX21pc21hdGNoZWRfYXZhaWxhYmlsaXR5X292ZXJyaWRlLCBkaWFnOjp3YXJuX21pc21hdGNoZWRfYXZhaWxhYmlsaXR5X292ZXJyaWRlX3VuYXZhaWwsIC0xLAorICAvKiBEaWFnQXJyYXk1MSAqLyBkaWFnOjp3YXJuX2ZlX2JhY2tlbmRfcGx1Z2luLCAtMSwKKyAgLyogRGlhZ0FycmF5NTIgKi8gZGlhZzo6YmFja3NsYXNoX25ld2xpbmVfc3BhY2UsIC0xLAorICAvKiBEaWFnQXJyYXk1MyAqLyBkaWFnOjp3YXJuX2JhZF9mdW5jdGlvbl9jYXN0LCAtMSwKKyAgLyogRGlhZ0FycmF5NTUgKi8gZGlhZzo6ZXh0X3J2YWx1ZV90b19yZWZlcmVuY2VfYWNjZXNzX2N0b3IsIGRpYWc6OmV4dF9ydmFsdWVfdG9fcmVmZXJlbmNlX3RlbXBfY29weV9ub192aWFibGUsIC0xLAorICAvKiBEaWFnQXJyYXk1NiAqLyBkaWFnOjpleHRfZGVjb21wX2RlY2xfY29uZCwgLTEsCisgIC8qIERpYWdBcnJheTU3ICovIGRpYWc6Ondhcm5faW1wY2FzdF9iaXRmaWVsZF9wcmVjaXNpb25fY29uc3RhbnQsIC0xLAorICAvKiBEaWFnQXJyYXk1OCAqLyBkaWFnOjp3YXJuX2JpdGZpZWxkX3Rvb19zbWFsbF9mb3JfZW51bSwgZGlhZzo6d2Fybl9zaWduZWRfYml0ZmllbGRfZW51bV9jb252ZXJzaW9uLCBkaWFnOjp3YXJuX3Vuc2lnbmVkX2JpdGZpZWxkX2Fzc2lnbmVkX3NpZ25lZF9lbnVtLCAtMSwKKyAgLyogRGlhZ0FycmF5NTkgKi8gZGlhZzo6d2Fybl9hbm9uX2JpdGZpZWxkX3dpZHRoX2V4Y2VlZHNfdHlwZV93aWR0aCwgZGlhZzo6d2Fybl9iaXRmaWVsZF93aWR0aF9leGNlZWRzX3R5cGVfd2lkdGgsIC0xLAorICAvKiBEaWFnQXJyYXk2MCAqLyBkaWFnOjp3YXJuX2JpdHdpc2Vfb3BfaW5fYml0d2lzZV9vcCwgLTEsCisgIC8qIERpYWdBcnJheTYxICovIGRpYWc6Ondhcm5fYmxvY2tfY2FwdHVyZV9hdXRvcmVsZWFzaW5nLCAtMSwKKyAgLyogRGlhZ0FycmF5NjIgKi8gZGlhZzo6d2Fybl9pbXBjYXN0X2Jvb2xfdG9fbnVsbF9wb2ludGVyLCAtMSwKKyAgLyogRGlhZ0FycmF5NjQgKi8gZGlhZzo6d2Fybl9icmFjZXNfYXJvdW5kX3NjYWxhcl9pbml0LCAtMSwKKyAgLyogRGlhZ0FycmF5NjUgKi8gZGlhZzo6d2Fybl9vYmpjX2ludmFsaWRfYnJpZGdlLCBkaWFnOjp3YXJuX29iamNfaW52YWxpZF9icmlkZ2VfdG9fY2YsIC0xLAorICAvKiBEaWFnQXJyYXk2NiAqLyBkaWFnOjpleHRfcHBfcmVkZWZfYnVpbHRpbl9tYWNybywgZGlhZzo6ZXh0X3BwX3VuZGVmX2J1aWx0aW5fbWFjcm8sIC0xLAorICAvKiBEaWFnQXJyYXk2NyAqLyBkaWFnOjp3YXJuX21lbWNweV9jaGtfb3ZlcmZsb3csIC0xLAorICAvKiBEaWFnQXJyYXk2OCAqLyBkaWFnOjp3YXJuX2ltcGxpY2l0X2RlY2xfcmVxdWlyZXNfc3lzaGVhZGVyLCAtMSwKKyAgLyogRGlhZ0FycmF5NjkgKi8gZGlhZzo6d2Fybl96ZXJvX3NpemVfc3RydWN0X3VuaW9uX2NvbXBhdCwgLTEsCisgIC8qIERpYWdBcnJheTczICovIGRpYWc6OmV4dF9vbGRfaW1wbGljaXRseV91bnNpZ25lZF9sb25nX2N4eCwgZGlhZzo6d2Fybl9hdXRvX3N0b3JhZ2VfY2xhc3MsIGRpYWc6Ondhcm5fY3h4MTFfY29tcGF0X3VzZXJfZGVmaW5lZF9saXRlcmFsLCBkaWFnOjp3YXJuX2N4eDExX2tleXdvcmQsIGRpYWc6Ondhcm5fY3h4MTFfcmlnaHRfc2hpZnRfaW5fdGVtcGxhdGVfYXJnLCBkaWFnOjp3YXJuX2V4cGxpY2l0X2luc3RhbnRpYXRpb25faW5saW5lXzB4LCBkaWFnOjp3YXJuX2V4cGxpY2l0X2luc3RhbnRpYXRpb25fbXVzdF9iZV9nbG9iYWxfMHgsIGRpYWc6Ondhcm5fZXhwbGljaXRfaW5zdGFudGlhdGlvbl9vdXRfb2Zfc2NvcGVfMHgsIGRpYWc6Ondhcm5fZXhwbGljaXRfaW5zdGFudGlhdGlvbl91bnF1YWxpZmllZF93cm9uZ19uYW1lc3BhY2VfMHgsIGRpYWc6Ondhcm5fb2xkX2ltcGxpY2l0bHlfdW5zaWduZWRfbG9uZ19jeHgsIC0xLAorICAvKiBEaWFnQXJyYXk3NCAqLyBkaWFnOjp3YXJuX2RlcHJlY2F0ZWRfc3RyaW5nX2xpdGVyYWxfY29udmVyc2lvbiwgLTEsCisgIC8qIERpYWdBcnJheTc2ICovIGRpYWc6Ondhcm5fY3h4MTFfY29tcGF0X3Jlc2VydmVkX3VzZXJfZGVmaW5lZF9saXRlcmFsLCAtMSwKKyAgLyogRGlhZ0FycmF5NzcgKi8gZGlhZzo6ZXh0X2FsaWFzX2RlY2xhcmF0aW9uLCBkaWFnOjpleHRfYXJyYXlfc2l6ZV9jb252ZXJzaW9uLCBkaWFnOjpleHRfYXV0b190eXBlX3NwZWNpZmllciwgZGlhZzo6ZXh0X2N4eDExX2VudW1fZml4ZWRfdW5kZXJseWluZ190eXBlLCBkaWFnOjpleHRfZGVmYXVsdGVkX2RlbGV0ZWRfZnVuY3Rpb24sIGRpYWc6OmV4dF9lbnVtX2ZyaWVuZCwgZGlhZzo6ZXh0X2VudW1lcmF0b3JfbGlzdF9jb21tYV9jeHgsIGRpYWc6OmV4dF9leHBsaWNpdF9jb252ZXJzaW9uX2Z1bmN0aW9ucywgZGlhZzo6ZXh0X2V4dGVybl90ZW1wbGF0ZSwgZGlhZzo6ZXh0X2Zvcl9yYW5nZSwgZGlhZzo6ZXh0X2dlbmVyYWxpemVkX2luaXRpYWxpemVyX2xpc3RzLCBkaWFnOjpleHRfbmVzdGVkX25hbWVfc3BlY19pc19lbnVtLCBkaWFnOjpleHRfbm9uY2xhc3NfdHlwZV9mcmllbmQsIGRpYWc6OmV4dF9ub25zdGF0aWNfbWVtYmVyX2luaXQsIGRpYWc6OmV4dF9vdmVycmlkZV9jb250cm9sX2tleXdvcmQsIGRpYWc6OmV4dF9yZWZfcXVhbGlmaWVyLCBkaWFnOjpleHRfcnZhbHVlX3JlZmVyZW5jZSwgZGlhZzo6ZXh0X3Njb3BlZF9lbnVtLCBkaWFnOjpleHRfc3RhdGljX2RhdGFfbWVtYmVyX2luX3VuaW9uLCBkaWFnOjpleHRfdGVtcGxhdGVfYXJnX29iamVjdF9pbnRlcm5hbCwgZGlhZzo6ZXh0X3RlbXBsYXRlX291dHNpZGVfb2ZfdGVtcGxhdGUsIGRpYWc6OmV4dF90ZW1wbGF0ZV9wYXJhbWV0ZXJfZGVmYXVsdF9pbl9mdW5jdGlvbl90ZW1wbGF0ZSwgZGlhZzo6ZXh0X3R5cGVuYW1lX291dHNpZGVfb2ZfdGVtcGxhdGUsIGRpYWc6OmV4dF91bmVsYWJvcmF0ZWRfZnJpZW5kX3R5cGUsIGRpYWc6OmV4dF92YXJpYWRpY190ZW1wbGF0ZXMsIC0xLAorICAvKiBEaWFnQXJyYXk3OCAqLyBkaWFnOjpleHRfZXh0cmFfc2VtaV9jeHgxMSwgLTEsCisgIC8qIERpYWdBcnJheTc5ICovIGRpYWc6OmV4dF9pbmxpbmVfbmFtZXNwYWNlLCAtMSwKKyAgLyogRGlhZ0FycmF5ODAgKi8gZGlhZzo6ZXh0X2N4eDExX2xvbmdsb25nLCAtMSwKKyAgLyogRGlhZ0FycmF5ODEgKi8gZGlhZzo6ZXh0X2NjZV9uYXJyb3dpbmcsIGRpYWc6OmV4dF9pbml0X2xpc3RfY29uc3RhbnRfbmFycm93aW5nLCBkaWFnOjpleHRfaW5pdF9saXN0X3R5cGVfbmFycm93aW5nLCBkaWFnOjpleHRfaW5pdF9saXN0X3ZhcmlhYmxlX25hcnJvd2luZywgZGlhZzo6d2Fybl9pbml0X2xpc3RfY29uc3RhbnRfbmFycm93aW5nLCBkaWFnOjp3YXJuX2luaXRfbGlzdF90eXBlX25hcnJvd2luZywgZGlhZzo6d2Fybl9pbml0X2xpc3RfdmFyaWFibGVfbmFycm93aW5nLCAtMSwKKyAgLyogRGlhZ0FycmF5ODIgKi8gZGlhZzo6ZXh0X2JpbmFyeV9saXRlcmFsX2N4eDE0LCAtMSwKKyAgLyogRGlhZ0FycmF5ODUgKi8gZGlhZzo6ZXh0X2NvbnN0ZXhwcl9ib2R5X2ludmFsaWRfc3RtdCwgZGlhZzo6ZXh0X2NvbnN0ZXhwcl9ib2R5X211bHRpcGxlX3JldHVybiwgZGlhZzo6ZXh0X2NvbnN0ZXhwcl9sb2NhbF92YXIsIGRpYWc6OmV4dF9jb25zdGV4cHJfdHlwZV9kZWZpbml0aW9uLCBkaWFnOjpleHRfY3h4MTRfYXR0ciwgZGlhZzo6ZXh0X2RlY2x0eXBlX2F1dG9fdHlwZV9zcGVjaWZpZXIsIGRpYWc6OmV4dF9pbml0X2NhcHR1cmUsIGRpYWc6OmV4dF92YXJpYWJsZV90ZW1wbGF0ZSwgLTEsCisgIC8qIERpYWdBcnJheTg3ICovIGRpYWc6Ondhcm5fY3h4MTdfY29tcGF0X2V4Y2VwdGlvbl9zcGVjX2luX3NpZ25hdHVyZSwgLTEsCisgIC8qIERpYWdBcnJheTg5ICovIGRpYWc6OmV4dF9hdXRvX25ld19saXN0X2luaXQsIGRpYWc6OmV4dF9jb25zdGV4cHJfaWYsIGRpYWc6OmV4dF9jb25zdGV4cHJfb25fbGFtYmRhX2N4eDE3LCBkaWFnOjpleHRfY3h4MTdfYXR0ciwgZGlhZzo6ZXh0X2RlY29tcF9kZWNsLCBkaWFnOjpleHRfZm9sZF9leHByZXNzaW9uLCBkaWFnOjpleHRfZm9yX3JhbmdlX2JlZ2luX2VuZF90eXBlc19kaWZmZXIsIGRpYWc6OmV4dF9oZXhfbGl0ZXJhbF9pbnZhbGlkLCBkaWFnOjpleHRfaW5pdF9zdGF0ZW1lbnQsIGRpYWc6OmV4dF9pbmxpbmVfdmFyaWFibGUsIGRpYWc6OmV4dF9tdWx0aV91c2luZ19kZWNsYXJhdGlvbiwgZGlhZzo6ZXh0X25lc3RlZF9uYW1lc3BhY2VfZGVmaW5pdGlvbiwgZGlhZzo6ZXh0X25zX2VudW1fYXR0cmlidXRlLCBkaWFnOjpleHRfc3Rhcl90aGlzX2xhbWJkYV9jYXB0dXJlX2N4eDE3LCBkaWFnOjpleHRfc3RhdGljX2Fzc2VydF9ub19tZXNzYWdlLCBkaWFnOjpleHRfdGVtcGxhdGVfdGVtcGxhdGVfcGFyYW1fdHlwZW5hbWUsIGRpYWc6OmV4dF91c2luZ19hdHRyaWJ1dGVfbnMsIGRpYWc6OmV4dF91c2luZ19kZWNsYXJhdGlvbl9wYWNrLCAtMSwKKyAgLyogRGlhZ0FycmF5OTQgKi8gZGlhZzo6d2Fybl9jeHgyYV9jb21wYXRfc3BhY2VzaGlwLCBkaWFnOjp3YXJuX2N4eDJhX2tleXdvcmQsIC0xLAorICAvKiBEaWFnQXJyYXk5NiAqLyBkaWFnOjpleHRfYml0ZmllbGRfbWVtYmVyX2luaXQsIGRpYWc6OmV4dF9lcXVhbHNfdGhpc19sYW1iZGFfY2FwdHVyZV9jeHgyYSwgZGlhZzo6ZXh0X3BvaW50ZXJfdG9fY29uc3RfcmVmX21lbWJlcl9vbl9ydmFsdWUsIC0xLAorICAvKiBEaWFnQXJyYXk5NyAqLyBkaWFnOjp3YXJuX2N4eDE3X2NvbXBhdF9iaXRmaWVsZF9tZW1iZXJfaW5pdCwgZGlhZzo6d2Fybl9jeHgxN19jb21wYXRfZXF1YWxzX3RoaXNfbGFtYmRhX2NhcHR1cmUsIGRpYWc6Ondhcm5fY3h4MTdfY29tcGF0X3NwYWNlc2hpcCwgLTEsCisgIC8qIERpYWdBcnJheTk4ICovIGRpYWc6Ondhcm5fY3h4MTdfY29tcGF0X3BvaW50ZXJfdG9fY29uc3RfcmVmX21lbWJlcl9vbl9ydmFsdWUsIC0xLAorICAvKiBEaWFnQXJyYXk5OSAqLyBkaWFnOjp3YXJuX2N4eDE0X2NvbXBhdF9jb25zdGV4cHJfaWYsIGRpYWc6Ondhcm5fY3h4MTRfY29tcGF0X2NvbnN0ZXhwcl9vbl9sYW1iZGEsIGRpYWc6Ondhcm5fY3h4MTRfY29tcGF0X2RlY29tcF9kZWNsLCBkaWFnOjp3YXJuX2N4eDE0X2NvbXBhdF9mb2xkX2V4cHJlc3Npb24sIGRpYWc6Ondhcm5fY3h4MTRfY29tcGF0X2luaXRfc3RhdGVtZW50LCBkaWFnOjp3YXJuX2N4eDE0X2NvbXBhdF9pbmxpbmVfdmFyaWFibGUsIGRpYWc6Ondhcm5fY3h4MTRfY29tcGF0X25lc3RlZF9uYW1lc3BhY2VfZGVmaW5pdGlvbiwgZGlhZzo6d2Fybl9jeHgxNF9jb21wYXRfc3Rhcl90aGlzX2xhbWJkYV9jYXB0dXJlLCBkaWFnOjp3YXJuX2N4eDE0X2NvbXBhdF9zdGF0aWNfYXNzZXJ0X25vX21lc3NhZ2UsIGRpYWc6Ondhcm5fY3h4MTRfY29tcGF0X3RlbXBsYXRlX25vbnR5cGVfcGFybV9hdXRvX3R5cGUsIGRpYWc6Ondhcm5fY3h4MTRfY29tcGF0X3RlbXBsYXRlX3RlbXBsYXRlX3BhcmFtX3R5cGVuYW1lLCBkaWFnOjp3YXJuX2N4eDE0X2NvbXBhdF91OF9jaGFyYWN0ZXJfbGl0ZXJhbCwgZGlhZzo6d2Fybl9jeHgxNF9jb21wYXRfdXNpbmdfYXR0cmlidXRlX25zLCBkaWFnOjp3YXJuX2N4eDE3X2NvbXBhdF9tdWx0aV91c2luZ19kZWNsYXJhdGlvbiwgZGlhZzo6d2Fybl9jeHgxN19jb21wYXRfdXNpbmdfZGVjbGFyYXRpb25fcGFjaywgZGlhZzo6d2Fybl9mb3JfcmFuZ2VfYmVnaW5fZW5kX3R5cGVzX2RpZmZlciwgLTEsCisgIC8qIERpYWdBcnJheTEwMCAqLyBkaWFnOjp3YXJuX2N4eDE0X2NvbXBhdF9uc19lbnVtX2F0dHJpYnV0ZSwgZGlhZzo6d2Fybl9jeHgxN19oZXhfbGl0ZXJhbCwgLTEsCisgIC8qIERpYWdBcnJheTEwMSAqLyBkaWFnOjp3YXJuX2N4eDExX2NvbXBhdF9jb25zdGV4cHJfYm9keV9pbnZhbGlkX3N0bXQsIGRpYWc6Ondhcm5fY3h4MTFfY29tcGF0X2NvbnN0ZXhwcl9ib2R5X211bHRpcGxlX3JldHVybiwgZGlhZzo6d2Fybl9jeHgxMV9jb21wYXRfY29uc3RleHByX2JvZHlfbm9fcmV0dXJuLCBkaWFnOjp3YXJuX2N4eDExX2NvbXBhdF9jb25zdGV4cHJfbG9jYWxfdmFyLCBkaWFnOjp3YXJuX2N4eDExX2NvbXBhdF9jb25zdGV4cHJfdHlwZV9kZWZpbml0aW9uLCBkaWFnOjp3YXJuX2N4eDExX2NvbXBhdF9kZWNsdHlwZV9hdXRvX3R5cGVfc3BlY2lmaWVyLCBkaWFnOjp3YXJuX2N4eDExX2NvbXBhdF9kaWdpdF9zZXBhcmF0b3IsIGRpYWc6Ondhcm5fY3h4MTFfY29tcGF0X2luaXRfY2FwdHVyZSwgZGlhZzo6d2Fybl9jeHgxMV9jb21wYXRfdmFyaWFibGVfdGVtcGxhdGUsIC0xLAorICAvKiBEaWFnQXJyYXkxMDIgKi8gZGlhZzo6d2Fybl9jeHgxMV9jb21wYXRfYmluYXJ5X2xpdGVyYWwsIC0xLAorICAvKiBEaWFnQXJyYXkxMDQgKi8gZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfYWxpYXNfZGVjbGFyYXRpb24sIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2FsaWduYXMsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2FsaWdub2YsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2F0dHJpYnV0ZSwgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfYXV0b190eXBlX3NwZWNpZmllciwgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfY29uc3RleHByLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9jdG9yX2xpc3RfaW5pdCwgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfZGVjbHR5cGUsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2RlZmF1bHRlZF9kZWxldGVkX2Z1bmN0aW9uLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9kZWxlZ2F0aW5nX2N0b3IsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2VtcHR5X3NjYWxhcl9pbml0aWFsaXplciwgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfZW51bV9maXhlZF91bmRlcmx5aW5nX3R5cGUsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2VudW1fZnJpZW5kLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9lbnVtX25lc3RlZF9uYW1lX3NwZWMsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2V4cGxpY2l0X2NvbnZlcnNpb25fZnVuY3Rpb25zLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9mb3JfcmFuZ2UsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2ZyaWVuZF9pc19tZW1iZXIsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2dlbmVyYWxpemVkX2luaXRpYWxpemVyX2xpc3RzLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9nb3RvX2ludG9fcHJvdGVjdGVkX3Njb3BlLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9pbmRpcmVjdF9nb3RvX2luX3Byb3RlY3RlZF9zY29wZSwgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfaW5pdGlhbGl6ZXJfbGlzdF9pbml0LCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9pbmxpbmVfbmFtZXNwYWNlLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9sYW1iZGEsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2xlc3NfY29sb25fY29sb24sIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2xpdGVyYWxfb3BlcmF0b3IsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2xpdGVyYWxfdWNuX2NvbnRyb2xfY2hhcmFjdGVyLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9saXRlcmFsX3Vjbl9lc2NhcGVfYmFzaWNfc2NzLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9ub2V4Y2VwdF9kZWNsLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9ub2V4Y2VwdF9leHByLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9ub25fc3RhdGljX21lbWJlcl91c2UsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X25vbmNsYXNzX3R5cGVfZnJpZW5kLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9ub25zdGF0aWNfbWVtYmVyX2luaXQsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X25vbnRyaXZpYWxfdW5pb25fb3JfYW5vbl9zdHJ1Y3RfbWVtYmVyLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9udWxscHRyLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9vdmVycmlkZV9jb250cm9sX2tleXdvcmQsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X3Bhc3Nfbm9uX3BvZF9hcmdfdG9fdmFyYXJnLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9yYXdfc3RyaW5nX2xpdGVyYWwsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X3JlZl9xdWFsaWZpZXIsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X3JlZmVyZW5jZV9saXN0X2luaXQsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X3J2YWx1ZV9yZWZlcmVuY2UsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X3Njb3BlZF9lbnVtLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9zZmluYWVfYWNjZXNzX2NvbnRyb2wsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X3N0YXRpY19hc3NlcnQsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X3N0YXRpY19kYXRhX21lbWJlcl9pbl91bmlvbiwgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfc3dpdGNoX2ludG9fcHJvdGVjdGVkX3Njb3BlLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF90ZW1wbGF0ZV9hcmdfZXh0cmFfcGFyZW5zLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF90ZW1wbGF0ZV9hcmdfbnVsbCwgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfdGVtcGxhdGVfYXJnX29iamVjdF9pbnRlcm5hbCwgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfdGVtcGxhdGVfb3V0c2lkZV9vZl90ZW1wbGF0ZSwgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfdGVtcGxhdGVfcGFyYW1ldGVyX2RlZmF1bHRfaW5fZnVuY3Rpb25fdGVtcGxhdGUsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X3RyYWlsaW5nX3JldHVybl90eXBlLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF90d29fcmlnaHRfYW5nbGVfYnJhY2tldHMsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X3R5cGVuYW1lX291dHNpZGVfb2ZfdGVtcGxhdGUsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X3VuZWxhYm9yYXRlZF9mcmllbmRfdHlwZSwgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfdW5pY29kZV9pZCwgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfdW5pY29kZV9saXRlcmFsLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF91bmljb2RlX3R5cGUsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X3VzaW5nX2RlY2xfY29uc3RydWN0b3IsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X3ZhcmlhZGljX3RlbXBsYXRlcywgLTEsCisgIC8qIERpYWdBcnJheTEwNSAqLyBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF90ZW1wX2NvcHksIC0xLAorICAvKiBEaWFnQXJyYXkxMDYgKi8gZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfdG9wX2xldmVsX3NlbWksIC0xLAorICAvKiBEaWFnQXJyYXkxMDcgKi8gZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfdGVtcGxhdGVfYXJnX2xvY2FsX3R5cGUsIC0xLAorICAvKiBEaWFnQXJyYXkxMDggKi8gZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfYXJyYXlfc2l6ZV9jb252ZXJzaW9uLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9jYXN0X2ZuX29iaiwgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfZW1wdHlfZm5tYWNyb19hcmcsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2VudW1lcmF0b3JfbGlzdF9jb21tYSwgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfZXh0ZXJuX3RlbXBsYXRlLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9sb25nbG9uZywgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfbm9fbmV3bGluZV9lb2YsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X3BwX2xpbmVfdG9vX2JpZywgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfdmFyaWFkaWNfbWFjcm8sIC0xLAorICAvKiBEaWFnQXJyYXkxMDkgKi8gZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfdGVtcGxhdGVfYXJnX3VubmFtZWRfdHlwZSwgLTEsCisgIC8qIERpYWdBcnJheTExMCAqLyBkaWFnOjpleHRfYW5vbnltb3VzX3VuaW9uLCBkaWFnOjpleHRfYzExX2FsaWdubWVudCwgZGlhZzo6ZXh0X2MxMV9hbm9ueW1vdXNfc3RydWN0LCBkaWFnOjpleHRfYzExX2dlbmVyaWNfc2VsZWN0aW9uLCBkaWFnOjpleHRfYzExX25vcmV0dXJuLCBkaWFnOjpleHRfYzExX3N0YXRpY19hc3NlcnQsIC0xLAorICAvKiBEaWFnQXJyYXkxMTEgKi8gZGlhZzo6d2Fybl9jOTlfY29tcGF0X3VuaWNvZGVfaWQsIGRpYWc6Ondhcm5fYzk5X2NvbXBhdF91bmljb2RlX2xpdGVyYWwsIGRpYWc6Ondhcm5fb2xkX2ltcGxpY2l0bHlfdW5zaWduZWRfbG9uZywgLTEsCisgIC8qIERpYWdBcnJheTExMiAqLyBkaWFnOjpleHRfYWdncmVnYXRlX2luaXRfbm90X2NvbnN0YW50LCBkaWFnOjpleHRfYzk5X2FycmF5X3VzYWdlLCBkaWFnOjpleHRfYzk5X2NvbXBvdW5kX2xpdGVyYWwsIGRpYWc6OmV4dF9jOTlfZmxleGlibGVfYXJyYXlfbWVtYmVyLCBkaWFnOjpleHRfYzk5X3ZhcmlhYmxlX2RlY2xfaW5fZm9yX2xvb3AsIGRpYWc6OmV4dF9jOTlfd2hpdGVzcGFjZV9yZXF1aXJlZF9hZnRlcl9tYWNyb19uYW1lLCBkaWFnOjpleHRfZGVzaWduYXRlZF9pbml0LCBkaWFnOjpleHRfZW1wdHlfZm5tYWNyb19hcmcsIGRpYWc6OmV4dF9lbnVtZXJhdG9yX2xpc3RfY29tbWFfYywgZGlhZzo6ZXh0X2hleF9jb25zdGFudF9pbnZhbGlkLCAtMSwKKyAgLyogRGlhZ0FycmF5MTEzICovIGRpYWc6Ondhcm5fY2FzdF9hbGlnbiwgLTEsCisgIC8qIERpYWdBcnJheTExNCAqLyBkaWFnOjp3YXJuX2Nhc3RfY2FsbGluZ19jb252LCAtMSwKKyAgLyogRGlhZ0FycmF5MTE1ICovIGRpYWc6Ondhcm5fY2FzdF9wb2ludGVyX2Zyb21fc2VsLCAtMSwKKyAgLyogRGlhZ0FycmF5MTE2ICovIGRpYWc6Ondhcm5fY2FzdF9xdWFsLCBkaWFnOjp3YXJuX2Nhc3RfcXVhbDIsIC0xLAorICAvKiBEaWFnQXJyYXkxMTggKi8gZGlhZzo6d2Fybl9vbXBfc2VjdGlvbl9pc19jaGFyLCBkaWFnOjp3YXJuX3N1YnNjcmlwdF9pc19jaGFyLCAtMSwKKyAgLyogRGlhZ0FycmF5MTE5ICovIGRpYWc6Ondhcm5fZHJ2X3ljX211bHRpcGxlX2lucHV0c19jbGFuZ19jbCwgZGlhZzo6d2Fybl9kcnZfeWN5dV9kaWZmZXJlbnRfYXJnX2NsYW5nX2NsLCBkaWFnOjp3YXJuX2Rydl95Y3l1X25vX2FyZ19jbGFuZ19jbCwgZGlhZzo6d2Fybl9kcnZfeWN5dV9ub19maV9hcmdfY2xhbmdfY2wsIC0xLAorICAvKiBEaWFnQXJyYXkxMjAgKi8gZGlhZzo6d2Fybl9wYXNzX2NsYXNzX2FyZ190b192YXJhcmcsIC0xLAorICAvKiBEaWFnQXJyYXkxMjEgKi8gZGlhZzo6d2Fybl9jb21tYV9vcGVyYXRvciwgLTEsCisgIC8qIERpYWdBcnJheTEyMiAqLyBkaWFnOjplc2NhcGVkX25ld2xpbmVfYmxvY2tfY29tbWVudF9lbmQsIGRpYWc6OmV4dF9saW5lX2NvbW1lbnQsIGRpYWc6OmV4dF9tdWx0aV9saW5lX2xpbmVfY29tbWVudCwgZGlhZzo6d2Fybl9uZXN0ZWRfYmxvY2tfY29tbWVudCwgLTEsCisgIC8qIERpYWdBcnJheTEyNCAqLyBkaWFnOjpleHRfdHlwZWNoZWNrX2NvbXBhcmlzb25fb2ZfZGlzdGluY3RfcG9pbnRlcnMsIC0xLAorICAvKiBEaWFnQXJyYXkxMjUgKi8gZGlhZzo6ZXh0X2NvbXBsZXhfY29tcG9uZW50X2luaXQsIC0xLAorICAvKiBEaWFnQXJyYXkxMjYgKi8gZGlhZzo6ZXh0X3R5cGVjaGVja19jb25kX3BvaW50ZXJfaW50ZWdlcl9taXNtYXRjaCwgLTEsCisgIC8qIERpYWdBcnJheTEyNyAqLyBkaWFnOjp3YXJuX21heWJlX3VuaW5pdF92YXIsIC0xLAorICAvKiBEaWFnQXJyYXkxMjggKi8gZGlhZzo6d2Fybl9tb2R1bGVfY29uZmlnX21hY3JvX3VuZGVmLCAtMSwKKyAgLyogRGlhZ0FycmF5MTI5ICovIGRpYWc6Ondhcm5faW1wY2FzdF9pbnRlZ2VyX3ByZWNpc2lvbl9jb25zdGFudCwgLTEsCisgIC8qIERpYWdBcnJheTEzMCAqLyBkaWFnOjp3YXJuX2xvZ2ljYWxfaW5zdGVhZF9vZl9iaXR3aXNlLCAtMSwKKyAgLyogRGlhZ0FycmF5MTMxICovIGRpYWc6Ondhcm5fY3h4MTRfY29tcGF0X2NvbnN0ZXhwcl9ub3RfY29uc3QsIC0xLAorICAvKiBEaWFnQXJyYXkxMzIgKi8gZGlhZzo6d2Fybl9hdHRyX29uX3VuY29uc3VtYWJsZV9jbGFzcywgZGlhZzo6d2Fybl9sb29wX3N0YXRlX21pc21hdGNoLCBkaWFnOjp3YXJuX3BhcmFtX3JldHVybl90eXBlc3RhdGVfbWlzbWF0Y2gsIGRpYWc6Ondhcm5fcGFyYW1fdHlwZXN0YXRlX21pc21hdGNoLCBkaWFnOjp3YXJuX3JldHVybl90eXBlc3RhdGVfZm9yX3VuY29uc3VtYWJsZV90eXBlLCBkaWFnOjp3YXJuX3JldHVybl90eXBlc3RhdGVfbWlzbWF0Y2gsIGRpYWc6Ondhcm5fdXNlX2luX2ludmFsaWRfc3RhdGUsIGRpYWc6Ondhcm5fdXNlX29mX3RlbXBfaW5faW52YWxpZF9zdGF0ZSwgLTEsCisgIC8qIERpYWdBcnJheTEzMyAqLyBkaWFnOjp3YXJuX2ltcGNhc3RfY29tcGxleF9zY2FsYXIsIGRpYWc6Ondhcm5faW1wY2FzdF9mbG9hdF9wcmVjaXNpb24sIGRpYWc6Ondhcm5faW1wY2FzdF9mbG9hdF9yZXN1bHRfcHJlY2lzaW9uLCBkaWFnOjp3YXJuX2ltcGNhc3RfaW50ZWdlcl9wcmVjaXNpb24sIGRpYWc6Ondhcm5faW1wY2FzdF92ZWN0b3Jfc2NhbGFyLCBkaWFnOjp3YXJuX3RlbXBsYXRlX2FyZ19uZWdhdGl2ZSwgZGlhZzo6d2Fybl90ZW1wbGF0ZV9hcmdfdG9vX2xhcmdlLCAtMSwKKyAgLyogRGlhZ0FycmF5MTM2ICovIGRpYWc6Ondhcm5fY29yb3V0aW5lX3Byb21pc2VfdW5oYW5kbGVkX2V4Y2VwdGlvbl9yZXF1aXJlZF93aXRoX2V4Y2VwdGlvbnMsIC0xLAorICAvKiBEaWFnQXJyYXkxMzcgKi8gZGlhZzo6d2Fybl91bnJlYWNoYWJsZV9kZWZhdWx0LCAtMSwKKyAgLyogRGlhZ0FycmF5MTM5ICovIGRpYWc6Ondhcm5fb2JqY19jZGlyZWN0aXZlX2Zvcm1hdF9zdHJpbmcsIC0xLAorICAvKiBEaWFnQXJyYXkxNDEgKi8gZGlhZzo6d2Fybl9hdHRyaWJ1dGVfYXJndW1lbnRfbl9uZWdhdGl2ZSwgZGlhZzo6d2Fybl9jdWRhX2F0dHJfbGFtYmRhX3Bvc2l0aW9uLCBkaWFnOjp3YXJuX2tlcm5faXNfaW5saW5lLCBkaWFnOjp3YXJuX2tlcm5faXNfbWV0aG9kLCBkaWFnOjp3YXJuX3ByYWdtYV91bnJvbGxfY3VkYV92YWx1ZV9pbl9wYXJlbnMsIC0xLAorICAvKiBEaWFnQXJyYXkxNDIgKi8gZGlhZzo6d2Fybl9kZWZhdWx0X2F0b21pY19jdXN0b21fZ2V0dGVyX3NldHRlciwgLTEsCisgIC8qIERpYWdBcnJheTE0MyAqLyBkaWFnOjp3YXJuX2RhbmdsaW5nX2Vsc2UsIC0xLAorICAvKiBEaWFnQXJyYXkxNDQgKi8gZGlhZzo6d2Fybl9iaW5kX3JlZl9tZW1iZXJfdG9fcGFyYW1ldGVyLCBkaWFnOjp3YXJuX2JpbmRfcmVmX21lbWJlcl90b190ZW1wb3JhcnksIGRpYWc6Ondhcm5faW5pdF9wdHJfbWVtYmVyX3RvX3BhcmFtZXRlcl9hZGRyLCAtMSwKKyAgLyogRGlhZ0FycmF5MTQ1ICovIGRpYWc6Ondhcm5fZGFuZ2xpbmdfc3RkX2luaXRpYWxpemVyX2xpc3QsIC0xLAorICAvKiBEaWFnQXJyYXkxNDYgKi8gZGlhZzo6d2Fybl9wcF9kYXRlX3RpbWUsIC0xLAorICAvKiBEaWFnQXJyYXkxNDcgKi8gZGlhZzo6d2Fybl9kZWFsbG9jX2luX2NhdGVnb3J5LCAtMSwKKyAgLyogRGlhZ0FycmF5MTQ4ICovIGRpYWc6Ondhcm5fZGVidWdfY29tcHJlc3Npb25fdW5hdmFpbGFibGUsIC0xLAorICAvKiBEaWFnQXJyYXkxNDkgKi8gZGlhZzo6ZXh0X21peGVkX2RlY2xzX2NvZGUsIC0xLAorICAvKiBEaWFnQXJyYXkxNTAgKi8gZGlhZzo6d2Fybl9kZWxlZ2F0aW5nX2N0b3JfY3ljbGUsIC0xLAorICAvKiBEaWFnQXJyYXkxNTEgKi8gZGlhZzo6ZXh0X2RlbGV0ZV92b2lkX3B0cl9vcGVyYW5kLCBkaWFnOjp3YXJuX2RlbGV0ZV9pbmNvbXBsZXRlLCAtMSwKKyAgLyogRGlhZ0FycmF5MTUyICovIGRpYWc6Ondhcm5fZGVsZXRlX2Fic3RyYWN0X25vbl92aXJ0dWFsX2R0b3IsIGRpYWc6Ondhcm5fZGVsZXRlX25vbl92aXJ0dWFsX2R0b3IsIC0xLAorICAvKiBEaWFnQXJyYXkxNTMgKi8gZGlhZzo6d2Fybl9PNF9pc19PMywgZGlhZzo6d2Fybl9hY2Nlc3NfZGVjbF9kZXByZWNhdGVkLCBkaWFnOjp3YXJuX2RlcHJlY2F0ZWRfY29weV9vcGVyYXRpb24sIGRpYWc6Ondhcm5fZGVwcmVjYXRlZF9yZWR1bmRhbnRfY29uc3RleHByX3N0YXRpY19kZWYsIGRpYWc6Ondhcm5fZHJ2X2RlcHJlY2F0ZWRfYXJnLCBkaWFnOjp3YXJuX2Rydl90cmVhdGluZ19pbnB1dF9hc19jeHgsIGRpYWc6Ondhcm5fb3B0aW9uX2ludmFsaWRfb2NsX3ZlcnNpb24sIGRpYWc6Ondhcm5fdmVjdG9yX2xvbmdfZGVjbF9zcGVjX2NvbWJpbmF0aW9uLCAtMSwKKyAgLyogRGlhZ0FycmF5MTU0ICovIGRpYWc6Ondhcm5fdmVjdG9yX21vZGVfZGVwcmVjYXRlZCwgLTEsCisgIC8qIERpYWdBcnJheTE1NSAqLyBkaWFnOjp3YXJuX2F0bF91dWlkX2RlcHJlY2F0ZWQsIGRpYWc6Ondhcm5fY3N0eWxlX3BhcmFtLCBkaWFnOjp3YXJuX2RlcHJlY2F0ZWQsIGRpYWc6Ondhcm5fZGVwcmVjYXRlZF9md2RjbGFzc19tZXNzYWdlLCBkaWFnOjp3YXJuX2RlcHJlY2F0ZWRfbWVzc2FnZSwgZGlhZzo6d2Fybl9wcm9wZXJ0eV9tZXRob2RfZGVwcmVjYXRlZCwgLTEsCisgIC8qIERpYWdBcnJheTE1NiAqLyBkaWFnOjp3YXJuX2V4Y2VwdGlvbl9zcGVjX2RlcHJlY2F0ZWQsIC0xLAorICAvKiBEaWFnQXJyYXkxNTcgKi8gZGlhZzo6d2Fybl9kZXByZWNhdGVkX2RlZiwgZGlhZzo6d2Fybl91bmF2YWlsYWJsZV9kZWYsIC0xLAorICAvKiBEaWFnQXJyYXkxNTggKi8gZGlhZzo6d2Fybl9pbmNyZW1lbnRfYm9vbCwgLTEsCisgIC8qIERpYWdBcnJheTE1OSAqLyBkaWFnOjp3YXJuX29iamNfaXNhX2Fzc2lnbiwgZGlhZzo6d2Fybl9vYmpjX2lzYV91c2UsIC0xLAorICAvKiBEaWFnQXJyYXkxNjAgKi8gZGlhZzo6d2Fybl9vYmpjX3BvaW50ZXJfbWFza2luZywgLTEsCisgIC8qIERpYWdBcnJheTE2MSAqLyBkaWFnOjp3YXJuX29iamNfcG9pbnRlcl9tYXNraW5nX3BlcmZvcm1TZWxlY3RvciwgLTEsCisgIC8qIERpYWdBcnJheTE2MiAqLyBkaWFnOjp3YXJuX2RlcHJlY2F0ZWRfcmVnaXN0ZXIsIC0xLAorICAvKiBEaWFnQXJyYXkxNjQgKi8gZGlhZzo6d2Fybl9kaXJlY3RfaXZhcl9hY2Nlc3MsIC0xLAorICAvKiBEaWFnQXJyYXkxNjUgKi8gZGlhZzo6cHBfZGlzYWJsZWRfbWFjcm9fZXhwYW5zaW9uLCAtMSwKKyAgLyogRGlhZ0FycmF5MTY4ICovIGRpYWc6Ondhcm5fY29uZmxpY3RpbmdfcGFyYW1fbW9kaWZpZXJzLCBkaWFnOjp3YXJuX2NvbmZsaWN0aW5nX3JldF90eXBlX21vZGlmaWVycywgLTEsCisgIC8qIERpYWdBcnJheTE3MCAqLyBkaWFnOjp3YXJuX3JlbWFpbmRlcl9kaXZpc2lvbl9ieV96ZXJvLCAtMSwKKyAgLyogRGlhZ0FycmF5MTcxICovIGRpYWc6Ondhcm5fYXR0cmlidXRlX2RsbF9yZWRlY2xhcmF0aW9uLCAtMSwKKyAgLyogRGlhZ0FycmF5MTcyICovIGRpYWc6Ondhcm5fYXR0cmlidXRlX2RsbGV4cG9ydF9leHBsaWNpdF9pbnN0YW50aWF0aW9uX2RlY2wsIC0xLAorICAvKiBEaWFnQXJyYXkxNzMgKi8gZGlhZzo6d2Fybl9hdHRyaWJ1dGVfZGxsaW1wb3J0X3N0YXRpY19maWVsZF9kZWZpbml0aW9uLCAtMSwKKyAgLyogRGlhZ0FycmF5MTc0ICovIGRpYWc6Ondhcm5fZG9jX2FwaV9jb250YWluZXJfZGVjbF9taXNtYXRjaCwgZGlhZzo6d2Fybl9kb2NfYmxvY2tfY29tbWFuZF9kdXBsaWNhdGUsIGRpYWc6Ondhcm5fZG9jX2Jsb2NrX2NvbW1hbmRfZW1wdHlfcGFyYWdyYXBoLCBkaWFnOjp3YXJuX2RvY19jb250YWluZXJfZGVjbF9taXNtYXRjaCwgZGlhZzo6d2Fybl9kb2NfZnVuY3Rpb25fbWV0aG9kX2RlY2xfbWlzbWF0Y2gsIGRpYWc6Ondhcm5fZG9jX2h0bWxfc3RhcnRfdGFnX2V4cGVjdGVkX2lkZW50X29yX2dyZWF0ZXIsIGRpYWc6Ondhcm5fZG9jX2h0bWxfc3RhcnRfdGFnX2V4cGVjdGVkX3F1b3RlZF9zdHJpbmcsIGRpYWc6Ondhcm5fZG9jX3BhcmFtX2R1cGxpY2F0ZSwgZGlhZzo6d2Fybl9kb2NfcGFyYW1faW52YWxpZF9kaXJlY3Rpb24sIGRpYWc6Ondhcm5fZG9jX3BhcmFtX25vdF9hdHRhY2hlZF90b19hX2Z1bmN0aW9uX2RlY2wsIGRpYWc6Ondhcm5fZG9jX3BhcmFtX25vdF9mb3VuZCwgZGlhZzo6d2Fybl9kb2NfcmV0dXJuc19hdHRhY2hlZF90b19hX3ZvaWRfZnVuY3Rpb24sIGRpYWc6Ondhcm5fZG9jX3JldHVybnNfbm90X2F0dGFjaGVkX3RvX2FfZnVuY3Rpb25fZGVjbCwgZGlhZzo6d2Fybl9kb2NfdHBhcmFtX2R1cGxpY2F0ZSwgZGlhZzo6d2Fybl9kb2NfdHBhcmFtX25vdF9hdHRhY2hlZF90b19hX3RlbXBsYXRlX2RlY2wsIGRpYWc6Ondhcm5fZG9jX3RwYXJhbV9ub3RfZm91bmQsIGRpYWc6Ondhcm5fbm90X2FfZG94eWdlbl90cmFpbGluZ19tZW1iZXJfY29tbWVudCwgZGlhZzo6d2Fybl92ZXJiYXRpbV9ibG9ja19lbmRfd2l0aG91dF9zdGFydCwgLTEsCisgIC8qIERpYWdBcnJheTE3NSAqLyBkaWFnOjp3YXJuX2RvY19kZXByZWNhdGVkX25vdF9zeW5jLCAtMSwKKyAgLyogRGlhZ0FycmF5MTc2ICovIGRpYWc6Ondhcm5fZG9jX2h0bWxfZW5kX2ZvcmJpZGRlbiwgZGlhZzo6d2Fybl9kb2NfaHRtbF9lbmRfdW5iYWxhbmNlZCwgZGlhZzo6d2Fybl9kb2NfaHRtbF9taXNzaW5nX2VuZF90YWcsIGRpYWc6Ondhcm5fZG9jX2h0bWxfc3RhcnRfZW5kX21pc21hdGNoLCAtMSwKKyAgLyogRGlhZ0FycmF5MTc3ICovIGRpYWc6Ondhcm5fZG9jX3BhcmFtX3NwYWNlc19pbl9kaXJlY3Rpb24sIC0xLAorICAvKiBEaWFnQXJyYXkxNzggKi8gZGlhZzo6d2Fybl9jb3JyZWN0X2NvbW1lbnRfY29tbWFuZF9uYW1lLCBkaWFnOjp3YXJuX3Vua25vd25fY29tbWVudF9jb21tYW5kX25hbWUsIC0xLAorICAvKiBEaWFnQXJyYXkxNzkgKi8gZGlhZzo6ZXh0X2RvbGxhcl9pbl9pZGVudGlmaWVyLCAtMSwKKyAgLyogRGlhZ0FycmF5MTgwICovIGRpYWc6Ondhcm5faW1wY2FzdF9kb3VibGVfcHJvbW90aW9uLCAtMSwKKyAgLyogRGlhZ0FycmF5MTgxICovIGRpYWc6OmV4dF9kdXBsaWNhdGVfZGVjbHNwZWMsIGRpYWc6Ondhcm5fZHVwbGljYXRlX2RlY2xzcGVjLCAtMSwKKyAgLyogRGlhZ0FycmF5MTgyICovIGRpYWc6Ondhcm5fZHVwbGljYXRlX2VudW1fdmFsdWVzLCAtMSwKKyAgLyogRGlhZ0FycmF5MTgzICovIGRpYWc6Ondhcm5fbWV0aG9kX3BhcmFtX2RlY2xhcmF0aW9uLCAtMSwKKyAgLyogRGlhZ0FycmF5MTg0ICovIGRpYWc6Ondhcm5fZHVwbGljYXRlX21ldGhvZF9kZWNsLCAtMSwKKyAgLyogRGlhZ0FycmF5MTg1ICovIGRpYWc6Ondhcm5fZHVwbGljYXRlX3Byb3RvY29sX2RlZiwgLTEsCisgIC8qIERpYWdBcnJheTE4NiAqLyBkaWFnOjp3YXJuX2R5bl9jbGFzc19tZW1hY2Nlc3MsIC0xLAorICAvKiBEaWFnQXJyYXkxODcgKi8gZGlhZzo6ZXh0X2R5bmFtaWNfZXhjZXB0aW9uX3NwZWMsIC0xLAorICAvKiBEaWFnQXJyYXkxODkgKi8gZGlhZzo6ZXh0X2VtYmVkZGVkX2RpcmVjdGl2ZSwgLTEsCisgIC8qIERpYWdBcnJheTE5MCAqLyBkaWFnOjp3YXJuX2VtcHR5X2Zvcl9ib2R5LCBkaWFnOjp3YXJuX2VtcHR5X2lmX2JvZHksIGRpYWc6Ondhcm5fZW1wdHlfcmFuZ2VfYmFzZWRfZm9yX2JvZHksIGRpYWc6Ondhcm5fZW1wdHlfc3dpdGNoX2JvZHksIGRpYWc6Ondhcm5fZW1wdHlfd2hpbGVfYm9keSwgLTEsCisgIC8qIERpYWdBcnJheTE5MSAqLyBkaWFnOjpleHRfZGVjb21wX2RlY2xfZW1wdHksIC0xLAorICAvKiBEaWFnQXJyYXkxOTIgKi8gZGlhZzo6ZXh0X2VtcHR5X3RyYW5zbGF0aW9uX3VuaXQsIC0xLAorICAvKiBEaWFnQXJyYXkxOTMgKi8gZGlhZzo6d2Fybl9pbmNvbXBsZXRlX2VuY29kZWRfdHlwZSwgLTEsCisgIC8qIERpYWdBcnJheTE5NSAqLyBkaWFnOjp3YXJuX2NvbXBhcmlzb25fb2ZfbWl4ZWRfZW51bV90eXBlcywgLTEsCisgIC8qIERpYWdBcnJheTE5NiAqLyBkaWFnOjp3YXJuX2NvbXBhcmlzb25fb2ZfbWl4ZWRfZW51bV90eXBlc19zd2l0Y2gsIC0xLAorICAvKiBEaWFnQXJyYXkxOTcgKi8gZGlhZzo6d2Fybl9pbXBjYXN0X2RpZmZlcmVudF9lbnVtX3R5cGVzLCAtMSwKKyAgLyogRGlhZ0FycmF5MTk4ICovIGRpYWc6OmV4dF9lbnVtX3Rvb19sYXJnZSwgZGlhZzo6ZXh0X2VudW1lcmF0b3JfaW5jcmVtZW50X3Rvb19sYXJnZSwgLTEsCisgIC8qIERpYWdBcnJheTE5OSAqLyBkaWFnOjp3YXJuX2NkdG9yX2Z1bmN0aW9uX3RyeV9oYW5kbGVyX21lbV9leHByLCBkaWFnOjp3YXJuX2V4Y2VwdGlvbl9jYXVnaHRfYnlfZWFybGllcl9oYW5kbGVyLCBkaWFnOjp3YXJuX3Rocm93X2luX25vZXhjZXB0X2Z1bmMsIC0xLAorICAvKiBEaWFnQXJyYXkyMDAgKi8gZGlhZzo6d2Fybl9leGl0X3RpbWVfZGVzdHJ1Y3RvciwgLTEsCisgIC8qIERpYWdBcnJheTIwMSAqLyBkaWFnOjp3YXJuX2RlZmluZWRfaW5fZnVuY3Rpb25fdHlwZV9tYWNybywgZGlhZzo6d2Fybl9kZWZpbmVkX2luX29iamVjdF90eXBlX21hY3JvLCAtMSwKKyAgLyogRGlhZ0FycmF5MjAyICovIGRpYWc6Ondhcm5fZHJ2X2V4cGVyaW1lbnRhbF9pc2VsX2luY29tcGxldGUsIGRpYWc6Ondhcm5fZHJ2X2V4cGVyaW1lbnRhbF9pc2VsX2luY29tcGxldGVfb3B0LCAtMSwKKyAgLyogRGlhZ0FycmF5MjAzICovIGRpYWc6Ondhcm5fZGlyZWN0X2luaXRpYWxpemVfY2FsbCwgZGlhZzo6d2Fybl9kaXJlY3Rfc3VwZXJfaW5pdGlhbGl6ZV9jYWxsLCAtMSwKKyAgLyogRGlhZ0FycmF5MjA0ICovIGRpYWc6Ondhcm5fYXJjX3N0cm9uZ19wb2ludGVyX29iamNfcG9pbnRlciwgLTEsCisgIC8qIERpYWdBcnJheTIwNSAqLyBkaWFnOjp3YXJuX3plcm9fc2l6ZV9zdHJ1Y3RfdW5pb25faW5fZXh0ZXJuX2MsIC0xLAorICAvKiBEaWFnQXJyYXkyMDYgKi8gZGlhZzo6d2Fybl9leHRlcm5faW5pdCwgLTEsCisgIC8qIERpYWdBcnJheTIwNyAqLyBkaWFnOjp3YXJuX2FybV9pbnRlcnJ1cHRfY2FsbGluZ19jb252ZW50aW9uLCAtMSwKKyAgLyogRGlhZ0FycmF5MjA4ICovIGRpYWc6Ondhcm5fbmFtZXNwYWNlX21lbWJlcl9leHRyYV9xdWFsaWZpY2F0aW9uLCAtMSwKKyAgLyogRGlhZ0FycmF5MjA5ICovIGRpYWc6OmV4dF9leHRyYV9zZW1pLCBkaWFnOjp3YXJuX2V4dHJhX3NlbWlfYWZ0ZXJfbWVtX2ZuX2RlZiwgLTEsCisgIC8qIERpYWdBcnJheTIxMCAqLyBkaWFnOjpleHRfcHBfZXh0cmFfdG9rZW5zX2F0X2VvbCwgZGlhZzo6d2Fybl9vbXBfZXh0cmFfdG9rZW5zX2F0X2VvbCwgLTEsCisgIC8qIERpYWdBcnJheTIxMSAqLyBkaWFnOjp3YXJuX2Rydl9pbnZva2luZ19mYWxsYmFjaywgLTEsCisgIC8qIERpYWdBcnJheTIxMiAqLyBkaWFnOjp3YXJuX2ZsYWdfZW51bV9jb25zdGFudF9vdXRfb2ZfcmFuZ2UsIC0xLAorICAvKiBEaWFnQXJyYXkyMTMgKi8gZGlhZzo6ZXh0X2ZsZXhpYmxlX2FycmF5X2luX2FycmF5LCBkaWFnOjpleHRfZmxleGlibGVfYXJyYXlfaW5fc3RydWN0LCAtMSwKKyAgLyogRGlhZ0FycmF5MjE0ICovIGRpYWc6Ondhcm5faW1wY2FzdF9mbG9hdF9pbnRlZ2VyLCAtMSwKKyAgLyogRGlhZ0FycmF5MjE1ICovIGRpYWc6Ondhcm5fZmxvYXRpbmdwb2ludF9lcSwgLTEsCisgIC8qIERpYWdBcnJheTIxNiAqLyBkaWFnOjp3YXJuX2ltcGNhc3RfZmxvYXRfdG9faW50ZWdlciwgLTEsCisgIC8qIERpYWdBcnJheTIxNyAqLyBkaWFnOjp3YXJuX2ltcGNhc3RfZmxvYXRfdG9faW50ZWdlcl96ZXJvLCAtMSwKKyAgLyogRGlhZ0FycmF5MjE4ICovIGRpYWc6Ondhcm5fcmVkdW5kYW50X2xvb3BfaXRlcmF0aW9uLCBkaWFnOjp3YXJuX3ZhcmlhYmxlc19ub3RfaW5fbG9vcF9ib2R5LCAtMSwKKyAgLyogRGlhZ0FycmF5MjE5ICovIGRpYWc6Ondhcm5fZm9ybWF0X1Bfbm9fcHJlY2lzaW9uLCBkaWFnOjp3YXJuX2Zvcm1hdF9hcmd1bWVudF9uZWVkc19jYXN0LCBkaWFnOjp3YXJuX2Zvcm1hdF9jb252ZXJzaW9uX2FyZ3VtZW50X3R5cGVfbWlzbWF0Y2gsIGRpYWc6Ondhcm5fZm9ybWF0X2ludmFsaWRfYW5ub3RhdGlvbiwgZGlhZzo6d2Fybl9mb3JtYXRfaW52YWxpZF9wb3NpdGlvbmFsX3NwZWNpZmllciwgZGlhZzo6d2Fybl9mb3JtYXRfbWl4X3Bvc2l0aW9uYWxfbm9ucG9zaXRpb25hbF9hcmdzLCBkaWFnOjp3YXJuX2Zvcm1hdF9ub25zZW5zaWNhbF9sZW5ndGgsIGRpYWc6Ondhcm5fZm9ybWF0X3N0cmluZ19pc193aWRlX2xpdGVyYWwsIGRpYWc6Ondhcm5fZm9ybWF0X3plcm9fcG9zaXRpb25hbF9zcGVjaWZpZXIsIGRpYWc6Ondhcm5fbWlzc2luZ19mb3JtYXRfc3RyaW5nLCBkaWFnOjp3YXJuX3ByaW50Zl9PYmpDZmxhZ3Nfd2l0aG91dF9PYmpDQ29udmVyc2lvbiwgZGlhZzo6d2Fybl9wcmludGZfYXN0ZXJpc2tfbWlzc2luZ19hcmcsIGRpYWc6Ondhcm5fcHJpbnRmX2FzdGVyaXNrX3dyb25nX3R5cGUsIGRpYWc6Ondhcm5fcHJpbnRmX2VtcHR5X29iamNfZmxhZywgZGlhZzo6d2Fybl9wcmludGZfZm9ybWF0X3N0cmluZ19jb250YWluc19udWxsX2NoYXIsIGRpYWc6Ondhcm5fcHJpbnRmX2Zvcm1hdF9zdHJpbmdfbm90X251bGxfdGVybWluYXRlZCwgZGlhZzo6d2Fybl9wcmludGZfaWdub3JlZF9mbGFnLCBkaWFnOjp3YXJuX3ByaW50Zl9pbmNvbXBsZXRlX3NwZWNpZmllciwgZGlhZzo6d2Fybl9wcmludGZfaW5zdWZmaWNpZW50X2RhdGFfYXJncywgZGlhZzo6d2Fybl9wcmludGZfaW52YWxpZF9vYmpjX2ZsYWcsIGRpYWc6Ondhcm5fcHJpbnRmX25vbnNlbnNpY2FsX2ZsYWcsIGRpYWc6Ondhcm5fcHJpbnRmX25vbnNlbnNpY2FsX29wdGlvbmFsX2Ftb3VudCwgZGlhZzo6d2Fybl9wcmludGZfcG9zaXRpb25hbF9hcmdfZXhjZWVkc19kYXRhX2FyZ3MsIGRpYWc6Ondhcm5fc2NhbmZfbm9uemVyb193aWR0aCwgZGlhZzo6d2Fybl9zY2FuZl9zY2FubGlzdF9pbmNvbXBsZXRlLCAtMSwKKyAgLyogRGlhZ0FycmF5MjIwICovIGRpYWc6Ondhcm5fcHJpbnRmX2RhdGFfYXJnX25vdF91c2VkLCAtMSwKKyAgLyogRGlhZ0FycmF5MjIxICovIGRpYWc6Ondhcm5fZm9ybWF0X2ludmFsaWRfY29udmVyc2lvbiwgLTEsCisgIC8qIERpYWdBcnJheTIyMiAqLyBkaWFnOjp3YXJuX2Zvcm1hdF9ub25fc3RhbmRhcmQsIGRpYWc6Ondhcm5fZm9ybWF0X25vbl9zdGFuZGFyZF9jb252ZXJzaW9uX3NwZWMsIGRpYWc6Ondhcm5fZm9ybWF0X25vbl9zdGFuZGFyZF9wb3NpdGlvbmFsX2FyZywgLTEsCisgIC8qIERpYWdBcnJheTIyMyAqLyBkaWFnOjp3YXJuX2Zvcm1hdF9ub25saXRlcmFsLCAtMSwKKyAgLyogRGlhZ0FycmF5MjI0ICovIGRpYWc6Ondhcm5fZm9ybWF0X2NvbnZlcnNpb25fYXJndW1lbnRfdHlwZV9taXNtYXRjaF9wZWRhbnRpYywgLTEsCisgIC8qIERpYWdBcnJheTIyNSAqLyBkaWFnOjp3YXJuX2Zvcm1hdF9ub25saXRlcmFsX25vYXJncywgLTEsCisgIC8qIERpYWdBcnJheTIyNyAqLyBkaWFnOjp3YXJuX2VtcHR5X2Zvcm1hdF9zdHJpbmcsIC0xLAorICAvKiBEaWFnQXJyYXkyMjkgKi8gZGlhZzo6ZXh0X2ZvdXJfY2hhcl9jaGFyYWN0ZXJfbGl0ZXJhbCwgLTEsCisgIC8qIERpYWdBcnJheTIzMCAqLyBkaWFnOjp3YXJuX2ZlX2JhY2tlbmRfZnJhbWVfbGFyZ2VyX3RoYW4sIGRpYWc6Ondhcm5fZmVfZnJhbWVfbGFyZ2VyX3RoYW4sIC0xLAorICAvKiBEaWFnQXJyYXkyMzEgKi8gZGlhZzo6d2Fybl9mdW5jdGlvbl9kZWZfaW5fb2JqY19jb250YWluZXIsIC0xLAorICAvKiBEaWFnQXJyYXkyMzMgKi8gZGlhZzo6ZXh0X2NsYW5nX2RpYWdub3NlX2lmLCBkaWFnOjpleHRfY2xhbmdfZW5hYmxlX2lmLCBkaWFnOjpleHRfd2Fybl9nbnVfZmluYWwsIGRpYWc6Ondhcm5fYXR0cmlidXRlX29uX2Z1bmN0aW9uX2RlZmluaXRpb24sIGRpYWc6Ondhcm5fYnJlYWtfYmluZHNfdG9fc3dpdGNoLCBkaWFnOjp3YXJuX2NsZWFudXBfZXh0LCBkaWFnOjp3YXJuX2djY19hdHRyaWJ1dGVfbG9jYXRpb24sIGRpYWc6Ondhcm5fbG9vcF9jdHJsX2JpbmRzX3RvX2lubmVyLCAtMSwKKyAgLyogRGlhZ0FycmF5MjM0ICovIGRpYWc6Ondhcm5fZ2xvYmFsX2NvbnN0cnVjdG9yLCBkaWFnOjp3YXJuX2dsb2JhbF9kZXN0cnVjdG9yLCAtMSwKKyAgLyogRGlhZ0FycmF5MjM2ICovIGRpYWc6OmV4dF9hbGlnbm9mX2V4cHIsIC0xLAorICAvKiBEaWFnQXJyYXkyMzcgKi8gZGlhZzo6ZXh0X2dudV9hbm9ueW1vdXNfc3RydWN0LCAtMSwKKyAgLyogRGlhZ0FycmF5MjM4ICovIGRpYWc6OmV4dF9hcnJheV9pbml0X3BhcmVucywgLTEsCisgIC8qIERpYWdBcnJheTIzOSAqLyBkaWFnOjpleHRfYXV0b190eXBlLCAtMSwKKyAgLyogRGlhZ0FycmF5MjQwICovIGRpYWc6OmV4dF9iaW5hcnlfbGl0ZXJhbCwgLTEsCisgIC8qIERpYWdBcnJheTI0MSAqLyBkaWFnOjpleHRfZ251X2Nhc2VfcmFuZ2UsIC0xLAorICAvKiBEaWFnQXJyYXkyNDIgKi8gZGlhZzo6ZXh0X2ludGVnZXJfY29tcGxleCwgLTEsCisgIC8qIERpYWdBcnJheTI0MyAqLyBkaWFnOjpleHRfYXJyYXlfaW5pdF9jb3B5LCAtMSwKKyAgLyogRGlhZ0FycmF5MjQ0ICovIGRpYWc6OmV4dF9nbnVfY29uZGl0aW9uYWxfZXhwciwgLTEsCisgIC8qIERpYWdBcnJheTI0NSAqLyBkaWFnOjpleHRfZ251X2FycmF5X3JhbmdlLCBkaWFnOjpleHRfZ251X21pc3NpbmdfZXF1YWxfZGVzaWduYXRvciwgZGlhZzo6ZXh0X2dudV9vbGRfc3R5bGVfZmllbGRfZGVzaWduYXRvciwgLTEsCisgIC8qIERpYWdBcnJheTI0NiAqLyBkaWFnOjpleHRfZ251X2VtcHR5X2luaXRpYWxpemVyLCAtMSwKKyAgLyogRGlhZ0FycmF5MjQ3ICovIGRpYWc6OmV4dF9lbXB0eV9zdHJ1Y3RfdW5pb24sIGRpYWc6OmV4dF9mbGV4aWJsZV9hcnJheV9lbXB0eV9hZ2dyZWdhdGVfZ251LCBkaWFnOjpleHRfbm9fbmFtZWRfbWVtYmVyc19pbl9zdHJ1Y3RfdW5pb24sIC0xLAorICAvKiBEaWFnQXJyYXkyNDggKi8gZGlhZzo6ZXh0X2ZsZXhpYmxlX2FycmF5X2luaXQsIC0xLAorICAvKiBEaWFnQXJyYXkyNDkgKi8gZGlhZzo6ZXh0X2ZsZXhpYmxlX2FycmF5X3VuaW9uX2dudSwgLTEsCisgIC8qIERpYWdBcnJheTI1MCAqLyBkaWFnOjpleHRfZXhwcl9ub3RfaWNlLCBkaWFnOjpleHRfaW5fY2xhc3NfaW5pdGlhbGl6ZXJfbm9uX2NvbnN0YW50LCBkaWFnOjpleHRfdmxhX2ZvbGRlZF90b19jb25zdGFudCwgLTEsCisgIC8qIERpYWdBcnJheTI1MSAqLyBkaWFnOjpleHRfaW1hZ2luYXJ5X2NvbnN0YW50LCAtMSwKKyAgLyogRGlhZ0FycmF5MjUyICovIGRpYWc6OmV4dF9wcF9pbmNsdWRlX25leHRfZGlyZWN0aXZlLCAtMSwKKyAgLyogRGlhZ0FycmF5MjUzICovIGRpYWc6OmV4dF9nbnVfYWRkcmVzc19vZl9sYWJlbCwgZGlhZzo6ZXh0X2dudV9pbmRpcmVjdF9nb3RvLCAtMSwKKyAgLyogRGlhZ0FycmF5MjU0ICovIGRpYWc6OmV4dF9mb3J3YXJkX3JlZl9lbnVtX2RlZiwgLTEsCisgIC8qIERpYWdBcnJheTI1NSAqLyBkaWFnOjpleHRfZ251X3N0YXRlbWVudF9leHByLCAtMSwKKyAgLyogRGlhZ0FycmF5MjU2ICovIGRpYWc6OmV4dF9pbl9jbGFzc19pbml0aWFsaXplcl9mbG9hdF90eXBlLCAtMSwKKyAgLyogRGlhZ0FycmF5MjU3ICovIGRpYWc6OmV4dF9zdHJpbmdfbGl0ZXJhbF9vcGVyYXRvcl90ZW1wbGF0ZSwgLTEsCisgIC8qIERpYWdBcnJheTI1OCAqLyBkaWFnOjpleHRfdHlwZWNoZWNrX2Nhc3RfdG9fdW5pb24sIC0xLAorICAvKiBEaWFnQXJyYXkyNTkgKi8gZGlhZzo6ZXh0X3ZhcmlhYmxlX3NpemVkX3R5cGVfaW5fc3RydWN0LCAtMSwKKyAgLyogRGlhZ0FycmF5MjYwICovIGRpYWc6OmV4dF9wcF9saW5lX3plcm8sIC0xLAorICAvKiBEaWFnQXJyYXkyNjEgKi8gZGlhZzo6ZXh0X21pc3NpbmdfdmFyYXJnc19hcmcsIGRpYWc6OmV4dF9wYXN0ZV9jb21tYSwgLTEsCisgIC8qIERpYWdBcnJheTI2MiAqLyBkaWFnOjp3YXJuX2hlYWRlcl9ndWFyZCwgLTEsCisgIC8qIERpYWdBcnJheTI2MyAqLyBkaWFnOjp3YXJuX3VzaW5nX2RpcmVjdGl2ZV9pbl9oZWFkZXIsIC0xLAorICAvKiBEaWFnQXJyYXkyNjQgKi8gZGlhZzo6d2Fybl9jb25kaXRpb25faXNfaWRpb21hdGljX2Fzc2lnbm1lbnQsIC0xLAorICAvKiBEaWFnQXJyYXkyNjUgKi8gZGlhZzo6ZXh0X2Nhbm5vdF91c2VfdHJpdmlhbF9hYmksIGRpYWc6Ondhcm5fYWxpYXNfdG9fd2Vha19hbGlhcywgZGlhZzo6d2Fybl9hbGlhc193aXRoX3NlY3Rpb24sIGRpYWc6Ondhcm5fYXR0cl9hYmlfdGFnX25hbWVzcGFjZSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfYWZ0ZXJfZGVmaW5pdGlvbl9pZ25vcmVkLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9pYm91dGxldCwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfaWdub3JlZCwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfaWdub3JlZF9mb3JfZmllbGRfb2ZfdHlwZSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfaWdub3JlZF9vbl9pbmxpbmUsIGRpYWc6Ondhcm5fYXR0cmlidXRlX2ludmFsaWRfb25fZGVmaW5pdGlvbiwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfbm9fZGVjbCwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfbm9ubnVsbF9ub19wb2ludGVycywgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfbm9ubnVsbF9wYXJtX25vX2FyZ3MsIGRpYWc6Ondhcm5fYXR0cmlidXRlX25vdF9vbl9kZWNsLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9wb2ludGVyX29yX3JlZmVyZW5jZV9vbmx5LCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9wb2ludGVyc19vbmx5LCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9wcmVjZWRlX2RlZmluaXRpb24sIGRpYWc6Ondhcm5fYXR0cmlidXRlX3JldHVybl9wb2ludGVyc19vbmx5LCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9yZXR1cm5fcG9pbnRlcnNfcmVmc19vbmx5LCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9zZW50aW5lbF9uYW1lZF9hcmd1bWVudHMsIGRpYWc6Ondhcm5fYXR0cmlidXRlX3NlbnRpbmVsX25vdF92YXJpYWRpYywgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfdHlwZV9ub3Rfc3VwcG9ydGVkLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV91bmtub3duX3Zpc2liaWxpdHksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3ZvaWRfZnVuY3Rpb25fbWV0aG9kLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93ZWFrX29uX2ZpZWxkLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93ZWFrX29uX2xvY2FsLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUsIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIsIGRpYWc6Ondhcm5fYmxvY2tfbGl0ZXJhbF9hdHRyaWJ1dGVzX29uX29taXR0ZWRfcmV0dXJuX3R5cGUsIGRpYWc6Ondhcm5fY2NvbnZfaWdub3JlZCwgZGlhZzo6d2Fybl9jY29udl9zdHJ1Y3RvcnMsIGRpYWc6Ondhcm5fY2NvbnZfdmFyYXJncywgZGlhZzo6d2Fybl9jeHgxMV9nbnVfYXR0cmlidXRlX29uX3R5cGUsIGRpYWc6Ondhcm5fZGVjbHNwZWNfYXR0cmlidXRlX2lnbm9yZWQsIGRpYWc6Ondhcm5fZGVwcmVjYXRlZF9hbm9ueW1vdXNfbmFtZXNwYWNlLCBkaWFnOjp3YXJuX2RsbGltcG9ydF9kcm9wcGVkX2Zyb21faW5saW5lX2Z1bmN0aW9uLCBkaWFnOjp3YXJuX2R1cGxpY2F0ZV9hdHRyaWJ1dGUsIGRpYWc6Ondhcm5fZHVwbGljYXRlX2F0dHJpYnV0ZV9leGFjdCwgZGlhZzo6d2Fybl9nY19hdHRyaWJ1dGVfd2Vha19vbl9sb2NhbCwgZGlhZzo6d2Fybl9nbnVfaW5saW5lX2F0dHJpYnV0ZV9yZXF1aXJlc19pbmxpbmUsIGRpYWc6Ondhcm5faWdub3JlZF9tc19pbmhlcml0YW5jZSwgZGlhZzo6d2Fybl9pbnRlcm5hbF9saW5rYWdlX2xvY2FsX3N0b3JhZ2UsIGRpYWc6Ondhcm5fbWljcm9zb2Z0X3F1YWxpZmllcnNfaWdub3JlZCwgZGlhZzo6d2Fybl9taXBzX2ludGVycnVwdF9hdHRyaWJ1dGUsIGRpYWc6Ondhcm5fbW1hcF91bmtub3duX2F0dHJpYnV0ZSwgZGlhZzo6d2Fybl9ub2NmX2NoZWNrX2F0dHJpYnV0ZV9pZ25vcmVkLCBkaWFnOjp3YXJuX25zX2F0dHJpYnV0ZV93cm9uZ19wYXJhbWV0ZXJfdHlwZSwgZGlhZzo6d2Fybl9uc19hdHRyaWJ1dGVfd3JvbmdfcmV0dXJuX3R5cGUsIGRpYWc6Ondhcm5fb3BlbmNsX2F0dHJfZGVwcmVjYXRlZF9pZ25vcmVkLCBkaWFnOjp3YXJuX3RyYW5zcGFyZW50X3VuaW9uX2F0dHJpYnV0ZV9maWVsZF9zaXplX2FsaWduLCBkaWFnOjp3YXJuX3RyYW5zcGFyZW50X3VuaW9uX2F0dHJpYnV0ZV9mbG9hdGluZywgZGlhZzo6d2Fybl90cmFuc3BhcmVudF91bmlvbl9hdHRyaWJ1dGVfbm90X2RlZmluaXRpb24sIGRpYWc6Ondhcm5fdHJhbnNwYXJlbnRfdW5pb25fYXR0cmlidXRlX3plcm9fZmllbGRzLCBkaWFnOjp3YXJuX3R5cGVfYXR0cmlidXRlX3dyb25nX3R5cGUsIGRpYWc6Ondhcm5fdW5oYW5kbGVkX21zX2F0dHJpYnV0ZV9pZ25vcmVkLCBkaWFnOjp3YXJuX3Vuc3VwcG9ydGVkX3RhcmdldF9hdHRyaWJ1dGUsIC0xLAorICAvKiBEaWFnQXJyYXkyNjYgKi8gZGlhZzo6d2Fybl9kcnZfdW5zdXBwb3J0ZWRfb3B0X2Zvcl90YXJnZXQsIGRpYWc6Ondhcm5faWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uLCAtMSwKKyAgLyogRGlhZ0FycmF5MjY3ICovIGRpYWc6Ondhcm5fcHJhZ21hX2ludHJpbnNpY19idWlsdGluLCAtMSwKKyAgLyogRGlhZ0FycmF5MjY4ICovIGRpYWc6Ondhcm5fcHJhZ21hX29wdGltaXplLCAtMSwKKyAgLyogRGlhZ0FycmF5MjY5ICovIGRpYWc6Ondhcm5fcHJhZ21hX2FsaWduX2V4cGVjdGVkX2VxdWFsLCBkaWFnOjp3YXJuX3ByYWdtYV9hbGlnbl9pbnZhbGlkX29wdGlvbiwgZGlhZzo6d2Fybl9wcmFnbWFfYmVnaW5fZW5kX21pc21hdGNoLCBkaWFnOjp3YXJuX3ByYWdtYV9jb21tZW50X2lnbm9yZWQsIGRpYWc6Ondhcm5fcHJhZ21hX2RlYnVnX21pc3NpbmdfYXJndW1lbnQsIGRpYWc6Ondhcm5fcHJhZ21hX2RlYnVnX3VuZXhwZWN0ZWRfY29tbWFuZCwgZGlhZzo6d2Fybl9wcmFnbWFfZXhwZWN0ZWRfYWN0aW9uX29yX3JfcGFyZW4sIGRpYWc6Ondhcm5fcHJhZ21hX2V4cGVjdGVkX2NvbG9uLCBkaWFnOjp3YXJuX3ByYWdtYV9leHBlY3RlZF9jb2xvbl9yX3BhcmVuLCBkaWFnOjp3YXJuX3ByYWdtYV9leHBlY3RlZF9jb21tYSwgZGlhZzo6d2Fybl9wcmFnbWFfZXhwZWN0ZWRfaWRlbnRpZmllciwgZGlhZzo6d2Fybl9wcmFnbWFfZXhwZWN0ZWRfaW5pdF9zZWcsIGRpYWc6Ondhcm5fcHJhZ21hX2V4cGVjdGVkX2ludGVnZXIsIGRpYWc6Ondhcm5fcHJhZ21hX2V4cGVjdGVkX2xwYXJlbiwgZGlhZzo6d2Fybl9wcmFnbWFfZXhwZWN0ZWRfbm9uX3dpZGVfc3RyaW5nLCBkaWFnOjp3YXJuX3ByYWdtYV9leHBlY3RlZF9wcmVkaWNhdGUsIGRpYWc6Ondhcm5fcHJhZ21hX2V4cGVjdGVkX3B1bmMsIGRpYWc6Ondhcm5fcHJhZ21hX2V4cGVjdGVkX3JwYXJlbiwgZGlhZzo6d2Fybl9wcmFnbWFfZXhwZWN0ZWRfc2VjdGlvbl9sYWJlbF9vcl9uYW1lLCBkaWFnOjp3YXJuX3ByYWdtYV9leHBlY3RlZF9zZWN0aW9uX25hbWUsIGRpYWc6Ondhcm5fcHJhZ21hX2V4cGVjdGVkX3NlY3Rpb25fcHVzaF9wb3Bfb3JfbmFtZSwgZGlhZzo6d2Fybl9wcmFnbWFfZXhwZWN0ZWRfc3RyaW5nLCBkaWFnOjp3YXJuX3ByYWdtYV9leHRyYV90b2tlbnNfYXRfZW9sLCBkaWFnOjp3YXJuX3ByYWdtYV9mb3JjZV9jdWRhX2hvc3RfZGV2aWNlX2JhZF9hcmcsIGRpYWc6Ondhcm5fcHJhZ21hX2luaXRfc2VnX3Vuc3VwcG9ydGVkX3RhcmdldCwgZGlhZzo6d2Fybl9wcmFnbWFfaW52YWxpZF9hY3Rpb24sIGRpYWc6Ondhcm5fcHJhZ21hX2ludmFsaWRfYXJndW1lbnQsIGRpYWc6Ondhcm5fcHJhZ21hX2ludmFsaWRfc3BlY2lmaWNfYWN0aW9uLCBkaWFnOjp3YXJuX3ByYWdtYV9taXNzaW5nX2FyZ3VtZW50LCBkaWFnOjp3YXJuX3ByYWdtYV9tc19zdHJ1Y3QsIGRpYWc6Ondhcm5fcHJhZ21hX29wdGlvbnNfYWxpZ25fcmVzZXRfZmFpbGVkLCBkaWFnOjp3YXJuX3ByYWdtYV9vcHRpb25zX2V4cGVjdGVkX2FsaWduLCBkaWFnOjp3YXJuX3ByYWdtYV9wYWNrX2ludmFsaWRfYWxpZ25tZW50LCBkaWFnOjp3YXJuX3ByYWdtYV9wYWNrX21hbGZvcm1lZCwgZGlhZzo6d2Fybl9wcmFnbWFfcG9wX2ZhaWxlZCwgZGlhZzo6d2Fybl9wcmFnbWFfcG9wX21hY3JvX25vX3B1c2gsIGRpYWc6Ondhcm5fcHJhZ21hX3Vua25vd25fZXh0ZW5zaW9uLCBkaWFnOjp3YXJuX3ByYWdtYV91bnN1cHBvcnRlZF9hY3Rpb24sIGRpYWc6Ondhcm5fcHJhZ21hX3Vuc3VwcG9ydGVkX2V4dGVuc2lvbiwgZGlhZzo6d2Fybl9wcmFnbWFfdW51c2VkX2V4cGVjdGVkX3ZhciwgZGlhZzo6d2Fybl9wcmFnbWFfdW51c2VkX2V4cGVjdGVkX3Zhcl9hcmcsIGRpYWc6Ondhcm5fcHJhZ21hX3VudXNlZF91bmRlY2xhcmVkX3ZhciwgLTEsCisgIC8qIERpYWdBcnJheTI3MCAqLyBkaWFnOjp3YXJuX2FyY19saWZldGltZV9yZXN1bHRfdHlwZSwgZGlhZzo6d2Fybl9ibG9ja19saXRlcmFsX3F1YWxpZmllcnNfb25fb21pdHRlZF9yZXR1cm5fdHlwZSwgZGlhZzo6d2Fybl9xdWFsX3JldHVybl90eXBlLCBkaWFnOjp3YXJuX3R5cGVjaGVja19mdW5jdGlvbl9xdWFsaWZpZXJzX2lnbm9yZWQsIGRpYWc6Ondhcm5fdHlwZWNoZWNrX3JlZmVyZW5jZV9xdWFsaWZpZXJzLCAtMSwKKyAgLyogRGlhZ0FycmF5MjcyICovIGRpYWc6Ondhcm5fYXV0b19pbXBsaWNpdF9hdG9taWNfcHJvcGVydHksIGRpYWc6Ondhcm5faW1wbGljaXRfYXRvbWljX3Byb3BlcnR5LCAtMSwKKyAgLyogRGlhZ0FycmF5MjczICovIGRpYWc6Ondhcm5faW1wY2FzdF9mbG9hdGluZ19wb2ludF90b19ib29sLCAtMSwKKyAgLyogRGlhZ0FycmF5Mjc0ICovIGRpYWc6OmV4dF9pbXBsaWNpdF9leGNlcHRpb25fc3BlY19taXNtYXRjaCwgLTEsCisgIC8qIERpYWdBcnJheTI3NSAqLyBkaWFnOjp3YXJuX2ZhbGx0aHJvdWdoX2F0dHJfdW5yZWFjaGFibGUsIGRpYWc6Ondhcm5fdW5hbm5vdGF0ZWRfZmFsbHRocm91Z2gsIC0xLAorICAvKiBEaWFnQXJyYXkyNzYgKi8gZGlhZzo6d2Fybl91bmFubm90YXRlZF9mYWxsdGhyb3VnaF9wZXJfZnVuY3Rpb24sIC0xLAorICAvKiBEaWFnQXJyYXkyNzcgKi8gZGlhZzo6ZXh0X2ltcGxpY2l0X2Z1bmN0aW9uX2RlY2wsIGRpYWc6OmV4dF9pbXBsaWNpdF9saWJfZnVuY3Rpb25fZGVjbCwgZGlhZzo6d2Fybl9idWlsdGluX3Vua25vd24sIGRpYWc6Ondhcm5faW1wbGljaXRfZnVuY3Rpb25fZGVjbCwgLTEsCisgIC8qIERpYWdBcnJheTI3OCAqLyBkaWFnOjpleHRfbWlzc2luZ190eXBlX3NwZWNpZmllciwgLTEsCisgIC8qIERpYWdBcnJheTI3OSAqLyBkaWFnOjp3YXJuX2ltcGxpY2l0bHlfcmV0YWluc19zZWxmLCAtMSwKKyAgLyogRGlhZ0FycmF5MjgwICovIGRpYWc6OmV4dF9pbnRlZ2VyX2xpdGVyYWxfdG9vX2xhcmdlX2Zvcl9zaWduZWQsIC0xLAorICAvKiBEaWFnQXJyYXkyODIgKi8gZGlhZzo6ZXh0X3BwX2ltcG9ydF9kaXJlY3RpdmUsIC0xLAorICAvKiBEaWFnQXJyYXkyODMgKi8gZGlhZzo6d2Fybl9pbmFjY2Vzc2libGVfYmFzZV9jbGFzcywgLTEsCisgIC8qIERpYWdBcnJheTI4NCAqLyBkaWFnOjpwcF9pbmNsdWRlX25leHRfYWJzb2x1dGVfcGF0aCwgLTEsCisgIC8qIERpYWdBcnJheTI4NSAqLyBkaWFnOjpwcF9pbmNsdWRlX25leHRfaW5fcHJpbWFyeSwgLTEsCisgIC8qIERpYWdBcnJheTI4NiAqLyBkaWFnOjp3YXJuX2RlZXBfZXhjZXB0aW9uX3NwZWNzX2RpZmZlciwgZGlhZzo6d2Fybl9pbmNvbXBhdGlibGVfZXhjZXB0aW9uX3NwZWNzLCAtMSwKKyAgLyogRGlhZ0FycmF5Mjg3ICovIGRpYWc6OmV4dF90eXBlY2hlY2tfY29udmVydF9pbmNvbXBhdGlibGVfZnVuY3Rpb25fcG9pbnRlciwgLTEsCisgIC8qIERpYWdBcnJheTI4OCAqLyBkaWFnOjp3YXJuX3JlZGVjbF9saWJyYXJ5X2J1aWx0aW4sIC0xLAorICAvKiBEaWFnQXJyYXkyODkgKi8gZGlhZzo6d2Fybl9jeHhfbXNfc3RydWN0LCBkaWFnOjp3YXJuX25wb3RfbXNfc3RydWN0LCAtMSwKKyAgLyogRGlhZ0FycmF5MjkwICovIGRpYWc6OmV4dF90eXBlY2hlY2tfY29udmVydF9pbmNvbXBhdGlibGVfcG9pbnRlciwgLTEsCisgIC8qIERpYWdBcnJheTI5MSAqLyBkaWFnOjpleHRfbmVzdGVkX3BvaW50ZXJfcXVhbGlmaWVyX21pc21hdGNoLCBkaWFnOjpleHRfdHlwZWNoZWNrX2NvbnZlcnRfZGlzY2FyZHNfcXVhbGlmaWVycywgLTEsCisgIC8qIERpYWdBcnJheTI5MiAqLyBkaWFnOjp3YXJuX3Byb3BlcnR5X3R5cGVzX2FyZV9pbmNvbXBhdGlibGUsIC0xLAorICAvKiBEaWFnQXJyYXkyOTMgKi8gZGlhZzo6d2Fybl9pbmNvbXBhdGlibGVfc3lzcm9vdCwgLTEsCisgIC8qIERpYWdBcnJheTI5NCAqLyBkaWFnOjp3YXJuX3VuZGVmX21ldGhvZF9pbXBsLCAtMSwKKyAgLyogRGlhZ0FycmF5Mjk2ICovIGRpYWc6Ondhcm5fbWlzc2luZ19zdWJtb2R1bGUsIGRpYWc6Ondhcm5fbW1hcF91bWJyZWxsYV9kaXJfbm90X2ZvdW5kLCBkaWFnOjp3YXJuX3VuY292ZXJlZF9tb2R1bGVfaGVhZGVyLCAtMSwKKyAgLyogRGlhZ0FycmF5Mjk3ICovIGRpYWc6Ondhcm5fcmVkZWNsYXJhdGlvbl93aXRob3V0X2F0dHJpYnV0ZV9wcmV2X2F0dHJpYnV0ZV9pZ25vcmVkLCBkaWFnOjp3YXJuX3JlZGVjbGFyYXRpb25fd2l0aG91dF9pbXBvcnRfYXR0cmlidXRlLCAtMSwKKyAgLyogRGlhZ0FycmF5Mjk4ICovIGRpYWc6Ondhcm5fZGVzdHJ1Y3Rvcl9tYXJrZWRfbm90X292ZXJyaWRlX292ZXJyaWRpbmcsIC0xLAorICAvKiBEaWFnQXJyYXkyOTkgKi8gZGlhZzo6d2Fybl9mdW5jdGlvbl9tYXJrZWRfbm90X292ZXJyaWRlX292ZXJyaWRpbmcsIC0xLAorICAvKiBEaWFnQXJyYXkzMDAgKi8gZGlhZzo6ZXh0X2luY3JlbWVudF9ib29sLCAtMSwKKyAgLyogRGlhZ0FycmF5MzAxICovIGRpYWc6Ondhcm5faW5maW5pdGVfcmVjdXJzaXZlX2Z1bmN0aW9uLCAtMSwKKyAgLyogRGlhZ0FycmF5MzAzICovIGRpYWc6Ondhcm5faW5pdGlhbGl6ZXJfb3ZlcnJpZGVzLCBkaWFnOjp3YXJuX3N1Ym9iamVjdF9pbml0aWFsaXplcl9vdmVycmlkZXMsIC0xLAorICAvKiBEaWFnQXJyYXkzMDQgKi8gZGlhZzo6ZXh0X291dF9vZl9saW5lX3F1YWxpZmllZF9pZF90eXBlX25hbWVzX2NvbnN0cnVjdG9yLCAtMSwKKyAgLyogRGlhZ0FycmF5MzA2ICovIGRpYWc6Ondhcm5fZmVfaW5saW5lX2FzbSwgLTEsCisgIC8qIERpYWdBcnJheTMwNyAqLyBkaWFnOjpleHRfb3BlcmF0b3JfbmV3X2RlbGV0ZV9kZWNsYXJlZF9pbmxpbmUsIC0xLAorICAvKiBEaWFnQXJyYXkzMDggKi8gZGlhZzo6d2Fybl9leHBsaWNpdF9pbnN0YW50aWF0aW9uX2FmdGVyX3NwZWNpYWxpemF0aW9uLCAtMSwKKyAgLyogRGlhZ0FycmF5MzA5ICovIGRpYWc6OmV4dF90eXBlY2hlY2tfY29udmVydF9pbnRfcG9pbnRlciwgZGlhZzo6ZXh0X3R5cGVjaGVja19jb252ZXJ0X3BvaW50ZXJfaW50LCAtMSwKKyAgLyogRGlhZ0FycmF5MzExICovIGRpYWc6Ondhcm5faW50X3RvX3BvaW50ZXJfY2FzdCwgLTEsCisgIC8qIERpYWdBcnJheTMxMiAqLyBkaWFnOjp3YXJuX2ludF90b192b2lkX3BvaW50ZXJfY2FzdCwgLTEsCisgIC8qIERpYWdBcnJheTMxMyAqLyBkaWFnOjp3YXJuX2ludGVnZXJfY29uc3RhbnRfb3ZlcmZsb3csIC0xLAorICAvKiBEaWFnQXJyYXkzMTQgKi8gZGlhZzo6d2Fybl9kcnZfb2JqZWN0X3NpemVfZGlzYWJsZWRfTzAsIGRpYWc6Ondhcm5fZHJ2X29wdGltaXphdGlvbl92YWx1ZSwgLTEsCisgIC8qIERpYWdBcnJheTMxNSAqLyBkaWFnOjpleHRfY29uc3RleHByX2Z1bmN0aW9uX25ldmVyX2NvbnN0YW50X2V4cHIsIC0xLAorICAvKiBEaWFnQXJyYXkzMTYgKi8gZGlhZzo6d2Fybl9pYm91dGxldF9vYmplY3RfdHlwZSwgZGlhZzo6d2Fybl9pYm91dGxldGNvbGxlY3Rpb25fcHJvcGVydHlfYXNzaWduLCAtMSwKKyAgLyogRGlhZ0FycmF5MzE3ICovIGRpYWc6Ondhcm5faW52YWxpZF9pbml0aWFsaXplcl9mcm9tX3N5c3RlbV9oZWFkZXIsIC0xLAorICAvKiBEaWFnQXJyYXkzMTggKi8gZGlhZzo6d2Fybl9pbnZhbGlkX2lvc19kZXBsb3ltZW50X3RhcmdldCwgLTEsCisgIC8qIERpYWdBcnJheTMxOSAqLyBkaWFnOjp3YXJuX2ZhbGxvZmZfbm9yZXR1cm5fZnVuY3Rpb24sIGRpYWc6Ondhcm5fbm9yZXR1cm5fZnVuY3Rpb25faGFzX3JldHVybl9leHByLCAtMSwKKyAgLyogRGlhZ0FycmF5MzIwICovIGRpYWc6OmV4dF9vZmZzZXRvZl9ub25fcG9kX3R5cGUsIGRpYWc6OmV4dF9vZmZzZXRvZl9ub25fc3RhbmRhcmRsYXlvdXRfdHlwZSwgLTEsCisgIC8qIERpYWdBcnJheTMyMSAqLyBkaWFnOjp3YXJuX2Rydl9wczRfc2RrX2RpciwgZGlhZzo6d2Fybl9kcnZfdW5hYmxlX3RvX2ZpbmRfZGlyZWN0b3J5X2V4cGVjdGVkLCAtMSwKKyAgLyogRGlhZ0FycmF5MzIyICovIGRpYWc6OmV4dF9wYXJ0aWFsX3NwZWNfbm90X21vcmVfc3BlY2lhbGl6ZWRfdGhhbl9wcmltYXJ5LCAtMSwKKyAgLyogRGlhZ0FycmF5MzI0ICovIGRpYWc6OmV4dF9lbXB0eV9jaGFyYWN0ZXIsIGRpYWc6OmV4dF91bnRlcm1pbmF0ZWRfY2hhcl9vcl9zdHJpbmcsIC0xLAorICAvKiBEaWFnQXJyYXkzMjUgKi8gZGlhZzo6d2Fybl9iYWRfY2hhcmFjdGVyX2VuY29kaW5nLCBkaWFnOjp3YXJuX2JhZF9zdHJpbmdfZW5jb2RpbmcsIC0xLAorICAvKiBEaWFnQXJyYXkzMjYgKi8gZGlhZzo6ZXh0X3BwX2JhZF9wYXN0ZV9tcywgLTEsCisgIC8qIERpYWdBcnJheTMyNyAqLyBkaWFnOjp3YXJuX2p1bXBfb3V0X29mX3NlaF9maW5hbGx5LCAtMSwKKyAgLyogRGlhZ0FycmF5MzI4ICovIGRpYWc6OmV4dF9rZXl3b3JkX2FzX2lkZW50LCAtMSwKKyAgLyogRGlhZ0FycmF5MzI5ICovIGRpYWc6Ondhcm5fcHBfbWFjcm9faGlkZXNfa2V5d29yZCwgLTEsCisgIC8qIERpYWdBcnJheTMzMCAqLyBkaWFnOjpleHRfcGFyYW1fcHJvbW90ZWRfbm90X2NvbXBhdGlibGVfd2l0aF9wcm90b3R5cGUsIC0xLAorICAvKiBEaWFnQXJyYXkzMzEgKi8gZGlhZzo6ZXh0X3Rva2VuX3VzZWQsIC0xLAorICAvKiBEaWFnQXJyYXkzMzIgKi8gZGlhZzo6d2Fybl9wYXJhbWV0ZXJfc2l6ZSwgZGlhZzo6d2Fybl9yZXR1cm5fdmFsdWVfc2l6ZSwgLTEsCisgIC8qIERpYWdBcnJheTMzNCAqLyBkaWFnOjp3YXJuX2ltcGNhc3RfbGl0ZXJhbF9mbG9hdF90b19pbnRlZ2VyLCAtMSwKKyAgLyogRGlhZ0FycmF5MzM1ICovIGRpYWc6Ondhcm5fZmxvYXRfb3ZlcmZsb3csIGRpYWc6Ondhcm5fZmxvYXRfdW5kZXJmbG93LCAtMSwKKyAgLyogRGlhZ0FycmF5MzM2ICovIGRpYWc6OmV4dF90ZW1wbGF0ZV9hcmdfbG9jYWxfdHlwZSwgLTEsCisgIC8qIERpYWdBcnJheTMzNyAqLyBkaWFnOjp3YXJuX2xvZ2ljYWxfbm90X29uX2xoc19vZl9jaGVjaywgLTEsCisgIC8qIERpYWdBcnJheTMzOCAqLyBkaWFnOjp3YXJuX2xvZ2ljYWxfYW5kX2luX2xvZ2ljYWxfb3IsIC0xLAorICAvKiBEaWFnQXJyYXkzMzkgKi8gZGlhZzo6ZXh0X2M5OV9sb25nbG9uZywgLTEsCisgIC8qIERpYWdBcnJheTM0MSAqLyBkaWFnOjpleHRfcHBfbWFjcm9fcmVkZWYsIC0xLAorICAvKiBEaWFnQXJyYXkzNDIgKi8gZGlhZzo6ZXh0X21haW5fdXNlZCwgZGlhZzo6ZXh0X25vcmV0dXJuX21haW4sIGRpYWc6OmV4dF92YXJpYWRpY19tYWluLCBkaWFnOjp3YXJuX21haW5fb25lX2FyZywgZGlhZzo6d2Fybl9tYWluX3JlZGVmaW5lZCwgZGlhZzo6d2Fybl9tYWluX3JldHVybnNfYm9vbF9saXRlcmFsLCBkaWFnOjp3YXJuX3N0YXRpY19tYWluLCAtMSwKKyAgLyogRGlhZ0FycmF5MzQzICovIGRpYWc6OmV4dF9tYWluX3JldHVybnNfbm9uaW50LCAtMSwKKyAgLyogRGlhZ0FycmF5MzQ0ICovIGRpYWc6Ondhcm5faGFzX3dhcm5pbmdfaW52YWxpZF9vcHRpb24sIC0xLAorICAvKiBEaWFnQXJyYXkzNDUgKi8gZGlhZzo6ZXh0X21hbnlfYnJhY2VzX2Fyb3VuZF9zY2FsYXJfaW5pdCwgLTEsCisgIC8qIERpYWdBcnJheTM0NiAqLyBkaWFnOjp3YXJuX21heF91bnNpZ25lZF96ZXJvLCAtMSwKKyAgLyogRGlhZ0FycmF5MzQ3ICovIGRpYWc6Ondhcm5fbWVtc2l6ZV9jb21wYXJpc29uLCAtMSwKKyAgLyogRGlhZ0FycmF5MzQ4ICovIGRpYWc6Ondhcm5fbm9uX2NvbnRyYXZhcmlhbnRfcGFyYW1fdHlwZXMsIGRpYWc6Ondhcm5fbm9uX2NvdmFyaWFudF9yZXRfdHlwZXMsIC0xLAorICAvKiBEaWFnQXJyYXkzNTAgKi8gZGlhZzo6ZXh0X2Fub255bW91c19yZWNvcmRfd2l0aF90eXBlLCBkaWFnOjpleHRfbXNfYW5vbnltb3VzX3JlY29yZCwgLTEsCisgIC8qIERpYWdBcnJheTM1MSAqLyBkaWFnOjpleHRfbXNfY2FzdF9mbl9vYmosIGRpYWc6OmV4dF9tc19pbXBjYXN0X2ZuX29iaiwgLTEsCisgIC8qIERpYWdBcnJheTM1MiAqLyBkaWFnOjpleHRfY2hhcml6ZV9taWNyb3NvZnQsIC0xLAorICAvKiBEaWFnQXJyYXkzNTMgKi8gZGlhZzo6ZXh0X2NvbW1lbnRfcGFzdGVfbWljcm9zb2Z0LCAtMSwKKyAgLyogRGlhZ0FycmF5MzU0ICovIGRpYWc6OmV4dF9kZWZhdWx0X2luaXRfY29uc3QsIC0xLAorICAvKiBEaWFnQXJyYXkzNTUgKi8gZGlhZzo6ZXh0X3BwX29wZXJhdG9yX3VzZWRfYXNfbWFjcm9fbmFtZSwgLTEsCisgIC8qIERpYWdBcnJheTM1NiAqLyBkaWFnOjpleHRfcGFyYW1fZGVmYXVsdF9hcmd1bWVudF9yZWRlZmluaXRpb24sIC0xLAorICAvKiBEaWFnQXJyYXkzNTcgKi8gZGlhZzo6ZXh0X2N0cmxfel9lb2ZfbWljcm9zb2Z0LCAtMSwKKyAgLyogRGlhZ0FycmF5MzU4ICovIGRpYWc6OmV4dF9tc19mb3J3YXJkX3JlZl9lbnVtLCAtMSwKKyAgLyogRGlhZ0FycmF5MzU5ICovIGRpYWc6OmV4dF9lbnVtZXJhdG9yX3Rvb19sYXJnZSwgLTEsCisgIC8qIERpYWdBcnJheTM2MCAqLyBkaWFnOjpleHRfZWxsaXBzaXNfZXhjZXB0aW9uX3NwZWMsIGRpYWc6OmV4dF9pbmNvbXBsZXRlX2luX2V4Y2VwdGlvbl9zcGVjLCBkaWFnOjpleHRfbWlzbWF0Y2hlZF9leGNlcHRpb25fc3BlYywgZGlhZzo6ZXh0X21pc21hdGNoZWRfZXhjZXB0aW9uX3NwZWNfZXhwbGljaXRfaW5zdGFudGlhdGlvbiwgZGlhZzo6ZXh0X21zX21pc3NpbmdfZXhjZXB0aW9uX3NwZWNpZmljYXRpb24sIGRpYWc6OmV4dF9vdmVycmlkZV9leGNlcHRpb25fc3BlYywgLTEsCisgIC8qIERpYWdBcnJheTM2MSAqLyBkaWFnOjp3YXJuX21pY3Jvc29mdF9kZXBlbmRlbnRfZXhpc3RzLCAtMSwKKyAgLyogRGlhZ0FycmF5MzYyICovIGRpYWc6OmV4dF9tc19leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsLCAtMSwKKyAgLyogRGlhZ0FycmF5MzYzICovIGRpYWc6Ondhcm5fbWVtYmVyX2V4dHJhX3F1YWxpZmljYXRpb24sIC0xLAorICAvKiBEaWFnQXJyYXkzNjQgKi8gZGlhZzo6ZXh0X2NfZW51bV9maXhlZF91bmRlcmx5aW5nX3R5cGUsIC0xLAorICAvKiBEaWFnQXJyYXkzNjUgKi8gZGlhZzo6ZXh0X2ZsZXhpYmxlX2FycmF5X2VtcHR5X2FnZ3JlZ2F0ZV9tcywgZGlhZzo6ZXh0X2ZsZXhpYmxlX2FycmF5X3VuaW9uX21zLCAtMSwKKyAgLyogRGlhZ0FycmF5MzY2ICovIGRpYWc6OmV4dF9nb3RvX2ludG9fcHJvdGVjdGVkX3Njb3BlLCAtMSwKKyAgLyogRGlhZ0FycmF5MzY3ICovIGRpYWc6OmV4dF9tc19hbWJpZ3VvdXNfZGlyZWN0X2Jhc2UsIC0xLAorICAvKiBEaWFnQXJyYXkzNjggKi8gZGlhZzo6ZXh0X3BwX2luY2x1ZGVfc2VhcmNoX21zLCAtMSwKKyAgLyogRGlhZ0FycmF5MzY5ICovIGRpYWc6OmV4dF9tdXRhYmxlX3JlZmVyZW5jZSwgLTEsCisgIC8qIERpYWdBcnJheTM3MCAqLyBkaWFnOjpleHRfcHVyZV9mdW5jdGlvbl9kZWZpbml0aW9uLCAtMSwKKyAgLyogRGlhZ0FycmF5MzcxICovIGRpYWc6OmV4dF9zdGF0aWNfbm9uX3N0YXRpYywgLTEsCisgIC8qIERpYWdBcnJheTM3MiAqLyBkaWFnOjpleHRfbXNfc2VhbGVkX2tleXdvcmQsIC0xLAorICAvKiBEaWFnQXJyYXkzNzMgKi8gZGlhZzo6ZXh0X2V4cGxpY2l0X2luc3RhbnRpYXRpb25fZHVwbGljYXRlLCBkaWFnOjpleHRfZm91bmRfdmlhX2RlcGVuZGVudF9iYXNlc19sb29rdXAsIGRpYWc6OmV4dF9tc19kZWxheWVkX3RlbXBsYXRlX2FyZ3VtZW50LCBkaWFnOjpleHRfbXNfZGVyZWZfdGVtcGxhdGVfYXJndW1lbnQsIGRpYWc6OmV4dF9tc190ZW1wbGF0ZV9zcGVjX3JlZGVjbF9vdXRfb2Zfc2NvcGUsIGRpYWc6OmV4dF9tc190ZW1wbGF0ZV90eXBlX2FyZ19taXNzaW5nX3R5cGVuYW1lLCBkaWFnOjpleHRfdW5kZWNsYXJlZF91bnF1YWxfaWRfd2l0aF9kZXBlbmRlbnRfYmFzZSwgLTEsCisgIC8qIERpYWdBcnJheTM3NCAqLyBkaWFnOjpleHRfdW5pb25fbWVtYmVyX29mX3JlZmVyZW5jZV90eXBlLCAtMSwKKyAgLyogRGlhZ0FycmF5Mzc1ICovIGRpYWc6OmV4dF9mcmllbmRfdGFnX3JlZGVjbF9vdXRzaWRlX25hbWVzcGFjZSwgLTEsCisgIC8qIERpYWdBcnJheTM3NiAqLyBkaWFnOjpleHRfbXNfdXNpbmdfZGVjbGFyYXRpb25faW5hY2Nlc3NpYmxlLCAtMSwKKyAgLyogRGlhZ0FycmF5Mzc3ICovIGRpYWc6OmV4dF9wc2V1ZG9fZHRvcl9vbl92b2lkLCAtMSwKKyAgLyogRGlhZ0FycmF5Mzc4ICovIGRpYWc6Ondhcm5fbWlzbWF0Y2hlZF9kZWxldGVfbmV3LCAtMSwKKyAgLyogRGlhZ0FycmF5Mzc5ICovIGRpYWc6Ondhcm5fY29uZmxpY3RpbmdfcGFyYW1fdHlwZXMsIC0xLAorICAvKiBEaWFnQXJyYXkzODAgKi8gZGlhZzo6d2Fybl9jb25mbGljdGluZ19yZXRfdHlwZXMsIC0xLAorICAvKiBEaWFnQXJyYXkzODEgKi8gZGlhZzo6d2Fybl9zdHJ1Y3RfY2xhc3NfcHJldmlvdXNfdGFnX21pc21hdGNoLCBkaWFnOjp3YXJuX3N0cnVjdF9jbGFzc190YWdfbWlzbWF0Y2gsIC0xLAorICAvKiBEaWFnQXJyYXkzODIgKi8gZGlhZzo6d2Fybl9taXNzaW5nX2JyYWNlcywgLTEsCisgIC8qIERpYWdBcnJheTM4MyAqLyBkaWFnOjpleHRfbm9fZGVjbGFyYXRvcnMsIGRpYWc6OmV4dF9zdGFuZGFsb25lX3NwZWNpZmllciwgZGlhZzo6ZXh0X3R5cGVkZWZfd2l0aG91dF9hX25hbWUsIGRpYWc6Ondhcm5fc3RhbmRhbG9uZV9zcGVjaWZpZXIsIC0xLAorICAvKiBEaWFnQXJyYXkzODQgKi8gZGlhZzo6ZXh0X21pc3NpbmdfZXhjZXB0aW9uX3NwZWNpZmljYXRpb24sIC0xLAorICAvKiBEaWFnQXJyYXkzODUgKi8gZGlhZzo6d2Fybl9taXNzaW5nX2ZpZWxkX2luaXRpYWxpemVycywgLTEsCisgIC8qIERpYWdBcnJheTM4OCAqLyBkaWFnOjp3YXJuX21pc3NpbmdfbWV0aG9kX3JldHVybl90eXBlLCAtMSwKKyAgLyogRGlhZ0FycmF5Mzg5ICovIGRpYWc6Ondhcm5fb3ZlcnJpZGluZ19tZXRob2RfbWlzc2luZ19ub2VzY2FwZSwgLTEsCisgIC8qIERpYWdBcnJheTM5MCAqLyBkaWFnOjp3YXJuX3N1Z2dlc3Rfbm9yZXR1cm5fYmxvY2ssIGRpYWc6Ondhcm5fc3VnZ2VzdF9ub3JldHVybl9mdW5jdGlvbiwgLTEsCisgIC8qIERpYWdBcnJheTM5MSAqLyBkaWFnOjp3YXJuX2Njb252X2tuciwgLTEsCisgIC8qIERpYWdBcnJheTM5MiAqLyBkaWFnOjp3YXJuX21pc3NpbmdfcHJvdG90eXBlLCAtMSwKKyAgLyogRGlhZ0FycmF5MzkzICovIGRpYWc6Ondhcm5fbWlzc2luZ19zZWxlY3Rvcl9uYW1lLCAtMSwKKyAgLyogRGlhZ0FycmF5Mzk0ICovIGRpYWc6Ondhcm5fbWlzc2luZ19zeXNyb290LCAtMSwKKyAgLyogRGlhZ0FycmF5Mzk1ICovIGRpYWc6Ondhcm5fbWlzc2luZ192YXJpYWJsZV9kZWNsYXJhdGlvbnMsIC0xLAorICAvKiBEaWFnQXJyYXkzOTYgKi8gZGlhZzo6cmVtYXJrX21vZHVsZV9idWlsZCwgZGlhZzo6cmVtYXJrX21vZHVsZV9idWlsZF9kb25lLCBkaWFnOjpyZW1hcmtfbW9kdWxlX2xvY2tfZmFpbHVyZSwgZGlhZzo6cmVtYXJrX21vZHVsZV9sb2NrX3RpbWVvdXQsIC0xLAorICAvKiBEaWFnQXJyYXkzOTcgKi8gZGlhZzo6d2Fybl9tb2R1bGVfY29uZmxpY3QsIGRpYWc6Ondhcm5fbW9kdWxlX3N5c3RlbV9iaXRfY29uZmxpY3QsIC0xLAorICAvKiBEaWFnQXJyYXkzOTggKi8gZGlhZzo6d2Fybl9tb2R1bGVfY29uZmlnX21pc21hdGNoLCAtMSwKKyAgLyogRGlhZ0FycmF5Mzk5ICovIGRpYWc6Ondhcm5fZHVwbGljYXRlX21vZHVsZV9maWxlX2V4dGVuc2lvbiwgLTEsCisgIC8qIERpYWdBcnJheTQwMCAqLyBkaWFnOjpleHRfbW9kdWxlX2ltcG9ydF9pbl9leHRlcm5fYywgLTEsCisgIC8qIERpYWdBcnJheTQwMSAqLyBkaWFnOjpleHRfZXF1aXZhbGVudF9pbnRlcm5hbF9saW5rYWdlX2RlY2xfaW5fbW9kdWxlcywgLTEsCisgIC8qIERpYWdBcnJheTQwMiAqLyBkaWFnOjpleHRfbW9kdWxlX2ltcG9ydF9ub3RfYXRfdG9wX2xldmVsX25vb3AsIC0xLAorICAvKiBEaWFnQXJyYXk0MDYgKi8gZGlhZzo6d2Fybl9kcnZfbXN2Y19ub3RfZm91bmQsIC0xLAorICAvKiBEaWFnQXJyYXk0MDcgKi8gZGlhZzo6ZXh0X211bHRpY2hhcl9jaGFyYWN0ZXJfbGl0ZXJhbCwgLTEsCisgIC8qIERpYWdBcnJheTQwOCAqLyBkaWFnOjp3YXJuX3ZiYXNlX21vdmVkX211bHRpcGxlX3RpbWVzLCAtMSwKKyAgLyogRGlhZ0FycmF5NDEwICovIGRpYWc6OmV4dF9hbm9ueW1vdXNfcmVjb3JkX3dpdGhfYW5vbnltb3VzX3R5cGUsIC0xLAorICAvKiBEaWFnQXJyYXk0MTIgKi8gZGlhZzo6d2Fybl9vcGVyYXRvcl9uZXdfcmV0dXJuc19udWxsLCAtMSwKKyAgLyogRGlhZ0FycmF5NDEzICovIGRpYWc6OmV4dF9ub19uZXdsaW5lX2VvZiwgZGlhZzo6d2Fybl9ub19uZXdsaW5lX2VvZiwgLTEsCisgIC8qIERpYWdBcnJheTQxNiAqLyBkaWFnOjp3YXJuX25vbl9saXRlcmFsX251bGxfcG9pbnRlciwgLTEsCisgIC8qIERpYWdBcnJheTQxNyAqLyBkaWFnOjp3YXJuX25vbl9tb2R1bGFyX2luY2x1ZGVfaW5fZnJhbWV3b3JrX21vZHVsZSwgLTEsCisgIC8qIERpYWdBcnJheTQxOCAqLyBkaWFnOjp3YXJuX25vbl9tb2R1bGFyX2luY2x1ZGVfaW5fbW9kdWxlLCAtMSwKKyAgLyogRGlhZ0FycmF5NDE5ICovIGRpYWc6Ondhcm5fY2Fubm90X3Bhc3Nfbm9uX3BvZF9hcmdfdG9fdmFyYXJnLCBkaWFnOjp3YXJuX25vbl9wb2RfdmFyYXJnX3dpdGhfZm9ybWF0X3N0cmluZywgZGlhZzo6d2Fybl9zZWNvbmRfcGFyYW1ldGVyX3RvX3ZhX2FyZ19ub3RfcG9kLCBkaWFnOjp3YXJuX3NlY29uZF9wYXJhbWV0ZXJfdG9fdmFfYXJnX293bmVyc2hpcF9xdWFsaWZpZWQsIC0xLAorICAvKiBEaWFnQXJyYXk0MjAgKi8gZGlhZzo6d2Fybl9ub25fdmlydHVhbF9kdG9yLCAtMSwKKyAgLyogRGlhZ0FycmF5NDIxICovIGRpYWc6Ondhcm5fbnVsbF9hcmcsIGRpYWc6Ondhcm5fbnVsbF9yZXQsIC0xLAorICAvKiBEaWFnQXJyYXk0MjMgKi8gZGlhZzo6cHBfbm9ucG9ydGFibGVfcGF0aCwgLTEsCisgIC8qIERpYWdBcnJheTQyNCAqLyBkaWFnOjpwcF9ub25wb3J0YWJsZV9zeXN0ZW1fcGF0aCwgLTEsCisgIC8qIERpYWdBcnJheTQyNSAqLyBkaWFnOjp3YXJuX25lb25fdmVjdG9yX2luaXRpYWxpemVyX25vbl9wb3J0YWJsZSwgLTEsCisgIC8qIERpYWdBcnJheTQyNiAqLyBkaWFnOjp3YXJuX25zY29uc3VtZWRfYXR0cmlidXRlX21pc21hdGNoLCAtMSwKKyAgLyogRGlhZ0FycmF5NDI3ICovIGRpYWc6Ondhcm5fbnNyZXR1cm5zX3JldGFpbmVkX2F0dHJpYnV0ZV9taXNtYXRjaCwgLTEsCisgIC8qIERpYWdBcnJheTQyOCAqLyBkaWFnOjp3YXJuX251bGxfaW5fYXJpdGhtZXRpY19vcGVyYXRpb24sIGRpYWc6Ondhcm5fbnVsbF9pbl9jb21wYXJpc29uX29wZXJhdGlvbiwgLTEsCisgIC8qIERpYWdBcnJheTQyOSAqLyBkaWFnOjpudWxsX2luX2NoYXJfb3Jfc3RyaW5nLCBkaWFnOjpudWxsX2luX2ZpbGUsIC0xLAorICAvKiBEaWFnQXJyYXk0MzAgKi8gZGlhZzo6d2Fybl9pbXBjYXN0X251bGxfcG9pbnRlcl90b19pbnRlZ2VyLCAtMSwKKyAgLyogRGlhZ0FycmF5NDMxICovIGRpYWc6Ondhcm5fYmluZGluZ19udWxsX3RvX3JlZmVyZW5jZSwgZGlhZzo6d2Fybl9pbmRpcmVjdGlvbl90aHJvdWdoX251bGwsIC0xLAorICAvKiBEaWFnQXJyYXk0MzIgKi8gZGlhZzo6d2Fybl9nbnVfbnVsbF9wdHJfYXJpdGgsIGRpYWc6Ondhcm5fcG9pbnRlcl9hcml0aF9udWxsX3B0ciwgLTEsCisgIC8qIERpYWdBcnJheTQzMyAqLyBkaWFnOjp3YXJuX2NvbmZsaWN0aW5nX251bGxhYmlsaXR5X2F0dHJfb3ZlcnJpZGluZ19wYXJhbV90eXBlcywgZGlhZzo6d2Fybl9jb25mbGljdGluZ19udWxsYWJpbGl0eV9hdHRyX292ZXJyaWRpbmdfcmV0X3R5cGVzLCBkaWFnOjp3YXJuX21pc21hdGNoZWRfbnVsbGFiaWxpdHlfYXR0ciwgZGlhZzo6d2Fybl9udWxsX3Jlc2V0dGFibGVfc2V0dGVyLCBkaWFnOjp3YXJuX251bGxhYmlsaXR5X2R1cGxpY2F0ZSwgLTEsCisgIC8qIERpYWdBcnJheTQzNCAqLyBkaWFnOjp3YXJuX251bGxhYmlsaXR5X21pc3NpbmcsIC0xLAorICAvKiBEaWFnQXJyYXk0MzUgKi8gZGlhZzo6d2Fybl9udWxsYWJpbGl0eV9taXNzaW5nX2FycmF5LCAtMSwKKyAgLyogRGlhZ0FycmF5NDM2ICovIGRpYWc6Ondhcm5fbnVsbGFiaWxpdHlfZGVjbHNwZWMsIC0xLAorICAvKiBEaWFnQXJyYXk0MzcgKi8gZGlhZzo6ZXh0X251bGxhYmlsaXR5LCAtMSwKKyAgLyogRGlhZ0FycmF5NDM4ICovIGRpYWc6Ondhcm5fbnVsbGFiaWxpdHlfaW5mZXJyZWRfb25fbmVzdGVkX3R5cGUsIC0xLAorICAvKiBEaWFnQXJyYXk0MzkgKi8gZGlhZzo6d2Fybl9udWxsYWJpbGl0eV9sb3N0LCAtMSwKKyAgLyogRGlhZ0FycmF5NDQwICovIGRpYWc6Ondhcm5fYXV0b3N5bnRoZXNpc19wcm9wZXJ0eV9pdmFyX21hdGNoLCAtMSwKKyAgLyogRGlhZ0FycmF5NDQxICovIGRpYWc6Ondhcm5fb2JqY19jaXJjdWxhcl9jb250YWluZXIsIC0xLAorICAvKiBEaWFnQXJyYXk0NDMgKi8gZGlhZzo6d2Fybl9vYmpjX2Rlc2lnbmF0ZWRfaW5pdF9taXNzaW5nX3N1cGVyX2NhbGwsIGRpYWc6Ondhcm5fb2JqY19kZXNpZ25hdGVkX2luaXRfbm9uX2Rlc2lnbmF0ZWRfaW5pdF9jYWxsLCBkaWFnOjp3YXJuX29iamNfZGVzaWduYXRlZF9pbml0X25vbl9zdXBlcl9kZXNpZ25hdGVkX2luaXRfY2FsbCwgZGlhZzo6d2Fybl9vYmpjX2ltcGxlbWVudGF0aW9uX21pc3NpbmdfZGVzaWduYXRlZF9pbml0X292ZXJyaWRlLCBkaWFnOjp3YXJuX29iamNfc2Vjb25kYXJ5X2luaXRfbWlzc2luZ19pbml0X2NhbGwsIGRpYWc6Ondhcm5fb2JqY19zZWNvbmRhcnlfaW5pdF9zdXBlcl9pbml0X2NhbGwsIC0xLAorICAvKiBEaWFnQXJyYXk0NDQgKi8gZGlhZzo6d2Fybl9zdXBlcmNsYXNzX3ZhcmlhYmxlX3NpemVkX3R5cGVfbm90X2F0X2VuZCwgZGlhZzo6d2Fybl92YXJpYWJsZV9zaXplZF9pdmFyX3Zpc2liaWxpdHksIC0xLAorICAvKiBEaWFnQXJyYXk0NDUgKi8gZGlhZzo6d2Fybl9mb3J3YXJkX2NsYXNzX3JlZGVmaW5pdGlvbiwgLTEsCisgIC8qIERpYWdBcnJheTQ0NiAqLyBkaWFnOjp3YXJuX2l2YXJzX2luX2ludGVyZmFjZSwgLTEsCisgIC8qIERpYWdBcnJheTQ0NyAqLyBkaWFnOjp3YXJuX29iamNfbGl0ZXJhbF9jb21wYXJpc29uLCAtMSwKKyAgLyogRGlhZ0FycmF5NDQ4ICovIGRpYWc6Ondhcm5faW1wY2FzdF9vYmplY3RpdmVfY19saXRlcmFsX3RvX2Jvb2wsIGRpYWc6Ondhcm5fb2JqY19jb2xsZWN0aW9uX2xpdGVyYWxfZWxlbWVudCwgLTEsCisgIC8qIERpYWdBcnJheTQ0OSAqLyBkaWFnOjp3YXJuX3BwX29iamNfbWFjcm9fcmVkZWZfaWdub3JlZCwgLTEsCisgIC8qIERpYWdBcnJheTQ1MCAqLyBkaWFnOjp3YXJuX21lc3NhZ2luZ191bnF1YWxpZmllZF9pZCwgLTEsCisgIC8qIERpYWdBcnJheTQ1MSAqLyBkaWFnOjp3YXJuX2NsYXNzX21ldGhvZF9ub3RfZm91bmQsIGRpYWc6Ondhcm5fY2xhc3NfbWV0aG9kX25vdF9mb3VuZF93aXRoX3R5cG8sIGRpYWc6Ondhcm5faW5zdF9tZXRob2Rfbm90X2ZvdW5kLCBkaWFnOjp3YXJuX2luc3RhbmNlX21ldGhvZF9ub3RfZm91bmRfd2l0aF90eXBvLCBkaWFnOjp3YXJuX2luc3RhbmNlX21ldGhvZF9vbl9jbGFzc19mb3VuZCwgZGlhZzo6d2Fybl9yb290X2luc3RfbWV0aG9kX25vdF9mb3VuZCwgLTEsCisgIC8qIERpYWdBcnJheTQ1MiAqLyBkaWFnOjp3YXJuX21pc3NpbmdfZXhwbGljaXRfc3ludGhlc2lzLCAtMSwKKyAgLyogRGlhZ0FycmF5NDUzICovIGRpYWc6Ondhcm5fb2JqY19taXNzaW5nX3N1cGVyX2NhbGwsIC0xLAorICAvKiBEaWFnQXJyYXk0NTQgKi8gZGlhZzo6d2Fybl9tdWx0aXBsZV9tZXRob2RfZGVjbCwgLTEsCisgIC8qIERpYWdBcnJheTQ1NSAqLyBkaWFnOjp3YXJuX29iamNfcHJvcGVydHlfcmV0YWluX29mX2Jsb2NrLCAtMSwKKyAgLyogRGlhZ0FycmF5NDU2ICovIGRpYWc6Ondhcm5fb2JqY19wb2ludGVyX2N4eF9jYXRjaF9mcmFnaWxlLCAtMSwKKyAgLyogRGlhZ0FycmF5NDU3ICovIGRpYWc6Ondhcm5faW1wbF9yZXF1aXJlZF9mb3JfY2xhc3NfcHJvcGVydHksIGRpYWc6Ondhcm5faW1wbF9yZXF1aXJlZF9pbl9jYXRlZ29yeV9mb3JfY2xhc3NfcHJvcGVydHksIGRpYWc6Ondhcm5fc2V0dGVyX2dldHRlcl9pbXBsX3JlcXVpcmVkLCBkaWFnOjp3YXJuX3NldHRlcl9nZXR0ZXJfaW1wbF9yZXF1aXJlZF9pbl9jYXRlZ29yeSwgLTEsCisgIC8qIERpYWdBcnJheTQ1OCAqLyBkaWFnOjp3YXJuX3Byb3BlcnR5X2ltcGxpY2l0bHlfbWlzbWF0Y2hlZCwgLTEsCisgIC8qIERpYWdBcnJheTQ1OSAqLyBkaWFnOjp3YXJuX2NvY29hX25hbWluZ19vd25lZF9ydWxlLCAtMSwKKyAgLyogRGlhZ0FycmF5NDYwICovIGRpYWc6Ondhcm5fb2JqY19wcm9wZXJ0eV9kZWZhdWx0X2Fzc2lnbl9vbl9vYmplY3QsIGRpYWc6Ondhcm5fb2JqY19wcm9wZXJ0eV9ub19hc3NpZ25tZW50X2F0dHJpYnV0ZSwgLTEsCisgIC8qIERpYWdBcnJheTQ2MSAqLyBkaWFnOjp3YXJuX2F1dG9zeW50aGVzaXNfcHJvcGVydHlfaW5fc3VwZXJjbGFzcywgZGlhZzo6d2Fybl9ub19hdXRvc3ludGhlc2lzX3Byb3BlcnR5LCBkaWFnOjp3YXJuX25vX2F1dG9zeW50aGVzaXNfc2hhcmVkX2l2YXJfcHJvcGVydHksIC0xLAorICAvKiBEaWFnQXJyYXk0NjIgKi8gZGlhZzo6d2Fybl9jYXRlZ29yeV9tZXRob2RfaW1wbF9tYXRjaCwgLTEsCisgIC8qIERpYWdBcnJheTQ2MyAqLyBkaWFnOjp3YXJuX2F1dG9fc3ludGhlc2l6aW5nX3Byb3RvY29sX3Byb3BlcnR5LCAtMSwKKyAgLyogRGlhZ0FycmF5NDY0ICovIGRpYWc6Ondhcm5fb2JqY19yZWR1bmRhbnRfcXVhbGlmaWVkX2NsYXNzX3R5cGUsIC0xLAorICAvKiBEaWFnQXJyYXk0NjUgKi8gZGlhZzo6d2Fybl9vYmpjX3JlYWRvbmx5X3Byb3BlcnR5X2hhc19zZXR0ZXIsIC0xLAorICAvKiBEaWFnQXJyYXk0NjcgKi8gZGlhZzo6d2Fybl9vYmpjX3JlZHVuZGFudF9saXRlcmFsX3VzZSwgLTEsCisgIC8qIERpYWdBcnJheTQ2OCAqLyBkaWFnOjp3YXJuX29iamNfcm9vdF9jbGFzc19taXNzaW5nLCAtMSwKKyAgLyogRGlhZ0FycmF5NDY5ICovIGRpYWc6Ondhcm5fb2JqY19zdHJpbmdfbGl0ZXJhbF9jb21wYXJpc29uLCAtMSwKKyAgLyogRGlhZ0FycmF5NDcwICovIGRpYWc6Ondhcm5fY29uY2F0ZW5hdGVkX25zYXJyYXlfbGl0ZXJhbCwgLTEsCisgIC8qIERpYWdBcnJheTQ3MSAqLyBkaWFnOjp3YXJuX29iamNfdW5zYWZlX3BlcmZvcm1fc2VsZWN0b3IsIC0xLAorICAvKiBEaWFnQXJyYXk0NzIgKi8gZGlhZzo6d2Fybl9vZHJfdGFnX3R5cGVfaW5jb25zaXN0ZW50LCAtMSwKKyAgLyogRGlhZ0FycmF5NDczICovIGRpYWc6Ondhcm5fb2xkX3N0eWxlX2Nhc3QsIC0xLAorICAvKiBEaWFnQXJyYXk0NzUgKi8gZGlhZzo6ZXh0X29wZW5jbF9leHRfdmVjdG9yX3R5cGVfcmdiYV9zZWxlY3RvciwgLTEsCisgIC8qIERpYWdBcnJheTQ3NiAqLyBkaWFnOjp3YXJuX29tcF9hbGlnbm1lbnRfbm90X3Bvd2VyX29mX3R3bywgZGlhZzo6d2Fybl9vbXBfbGluZWFyX3N0ZXBfemVybywgLTEsCisgIC8qIERpYWdBcnJheTQ3NyAqLyBkaWFnOjpleHRfb21wX2xvb3Bfbm90X2Nhbm9uaWNhbF9pbml0LCBkaWFnOjp3YXJuX29tcF9sb29wXzY0X2JpdF92YXIsIC0xLAorICAvKiBEaWFnQXJyYXk0NzggKi8gZGlhZzo6d2Fybl9kcnZfb21wX29mZmxvYWRfdGFyZ2V0X2R1cGxpY2F0ZSwgZGlhZzo6d2Fybl9kcnZfb21wX29mZmxvYWRfdGFyZ2V0X21pc3NpbmdiY3J1bnRpbWUsIGRpYWc6Ondhcm5fb21wX25vbl90cml2aWFsX3R5cGVfbWFwcGVkLCBkaWFnOjp3YXJuX29tcF9ub3RfaW5fdGFyZ2V0X2NvbnRleHQsIC0xLAorICAvKiBEaWFnQXJyYXk0NzkgKi8gZGlhZzo6d2Fybl9kcnZfZmluZV9ncmFpbmVkX2JpdGZpZWxkX2FjY2Vzc2VzX2lnbm9yZWQsIGRpYWc6Ondhcm5fZHJ2X3BzNF9mb3JjZV9waWMsIGRpYWc6Ondhcm5fZHJ2X3Vuc3VwcG9ydGVkX2FiaWNhbGxzLCBkaWFnOjp3YXJuX2Rydl91bnN1cHBvcnRlZF9sb25nY2FsbHMsIC0xLAorICAvKiBEaWFnQXJyYXk0ODAgKi8gZGlhZzo6ZXh0X291dF9vZl9saW5lX2RlY2xhcmF0aW9uLCAtMSwKKyAgLyogRGlhZ0FycmF5NDgxICovIGRpYWc6OmV4dF91c2Vfb3V0X29mX3Njb3BlX2RlY2xhcmF0aW9uLCAtMSwKKyAgLyogRGlhZ0FycmF5NDgyICovIGRpYWc6Ondhcm5fb3ZlcmFsaWduZWRfdHlwZSwgLTEsCisgIC8qIERpYWdBcnJheTQ4NCAqLyBkaWFnOjpleHRfc3RyaW5nX3Rvb19sb25nLCAtMSwKKyAgLyogRGlhZ0FycmF5NDg1ICovIGRpYWc6Ondhcm5fb3ZlcmxvYWRlZF9zaGlmdF9pbl9jb21wYXJpc29uLCAtMSwKKyAgLyogRGlhZ0FycmF5NDg2ICovIGRpYWc6Ondhcm5fb3ZlcmxvYWRlZF92aXJ0dWFsLCAtMSwKKyAgLyogRGlhZ0FycmF5NDg3ICovIGRpYWc6Ondhcm5fZmVfb3ZlcnJpZGVfbW9kdWxlLCAtMSwKKyAgLyogRGlhZ0FycmF5NDg4ICovIGRpYWc6Ondhcm5fY29uZmxpY3Rpbmdfb3ZlcnJpZGluZ19wYXJhbV9tb2RpZmllcnMsIGRpYWc6Ondhcm5fY29uZmxpY3Rpbmdfb3ZlcnJpZGluZ19wYXJhbV90eXBlcywgZGlhZzo6d2Fybl9jb25mbGljdGluZ19vdmVycmlkaW5nX3JldF90eXBlX21vZGlmaWVycywgZGlhZzo6d2Fybl9jb25mbGljdGluZ19vdmVycmlkaW5nX3JldF90eXBlcywgZGlhZzo6d2Fybl9jb25mbGljdGluZ19vdmVycmlkaW5nX3ZhcmlhZGljLCBkaWFnOjp3YXJuX25vbl9jb250cmF2YXJpYW50X292ZXJyaWRpbmdfcGFyYW1fdHlwZXMsIGRpYWc6Ondhcm5fbm9uX2NvdmFyaWFudF9vdmVycmlkaW5nX3JldF90eXBlcywgLTEsCisgIC8qIERpYWdBcnJheTQ4OSAqLyBkaWFnOjp3YXJuX2Rydl9vdmVycmlkaW5nX2ZsYWdfb3B0aW9uLCAtMSwKKyAgLyogRGlhZ0FycmF5NDkwICovIGRpYWc6Ondhcm5fdW5uZWNlc3NhcnlfcGFja2VkLCAtMSwKKyAgLyogRGlhZ0FycmF5NDkxICovIGRpYWc6Ondhcm5fcGFkZGVkX3N0cnVjdF9hbm9uX2ZpZWxkLCBkaWFnOjp3YXJuX3BhZGRlZF9zdHJ1Y3RfZmllbGQsIGRpYWc6Ondhcm5fcGFkZGVkX3N0cnVjdF9zaXplLCAtMSwKKyAgLyogRGlhZ0FycmF5NDkyICovIGRpYWc6Ondhcm5fY29uZGl0aW9uX2lzX2Fzc2lnbm1lbnQsIGRpYWc6Ondhcm5fcHJlY2VkZW5jZV9iaXR3aXNlX3JlbCwgZGlhZzo6d2Fybl9wcmVjZWRlbmNlX2NvbmRpdGlvbmFsLCAtMSwKKyAgLyogRGlhZ0FycmF5NDkzICovIGRpYWc6Ondhcm5fZXF1YWxpdHlfd2l0aF9leHRyYV9wYXJlbnMsIC0xLAorICAvKiBEaWFnQXJyYXk0OTUgKi8gZGlhZzo6cmVtYXJrX2ZlX2JhY2tlbmRfb3B0aW1pemF0aW9uX3JlbWFyaywgLTEsCisgIC8qIERpYWdBcnJheTQ5NiAqLyBkaWFnOjpyZW1hcmtfZmVfYmFja2VuZF9vcHRpbWl6YXRpb25fcmVtYXJrX2FuYWx5c2lzLCBkaWFnOjpyZW1hcmtfZmVfYmFja2VuZF9vcHRpbWl6YXRpb25fcmVtYXJrX2FuYWx5c2lzX2FsaWFzaW5nLCBkaWFnOjpyZW1hcmtfZmVfYmFja2VuZF9vcHRpbWl6YXRpb25fcmVtYXJrX2FuYWx5c2lzX2ZwY29tbXV0ZSwgLTEsCisgIC8qIERpYWdBcnJheTQ5NyAqLyBkaWFnOjp3YXJuX2ZlX2JhY2tlbmRfb3B0aW1pemF0aW9uX2ZhaWx1cmUsIC0xLAorICAvKiBEaWFnQXJyYXk0OTggKi8gZGlhZzo6cmVtYXJrX2ZlX2JhY2tlbmRfb3B0aW1pemF0aW9uX3JlbWFya19taXNzZWQsIC0xLAorICAvKiBEaWFnQXJyYXk0OTkgKi8gZGlhZzo6d2Fybl9tb2R1bGVfdXNlc19kYXRlX3RpbWUsIC0xLAorICAvKiBEaWFnQXJyYXk1MDAgKi8gZGlhZzo6ZXh0X2FnZ3JlZ2F0ZV9pbml0X25vdF9jb25zdGFudCwgZGlhZzo6ZXh0X2Fub255bW91c19yZWNvcmRfd2l0aF90eXBlLCBkaWFnOjpleHRfYW5vbnltb3VzX3N0cnVjdF91bmlvbl9xdWFsaWZpZWQsIGRpYWc6OmV4dF9hcnJheV9zaXplX2NvbnZlcnNpb24sIGRpYWc6OmV4dF9hdXRvX25ld19saXN0X2luaXQsIGRpYWc6OmV4dF9jOTlfYXJyYXlfdXNhZ2UsIGRpYWc6OmV4dF9jOTlfY29tcG91bmRfbGl0ZXJhbCwgZGlhZzo6ZXh0X2M5OV9mbGV4aWJsZV9hcnJheV9tZW1iZXIsIGRpYWc6OmV4dF9jOTlfdmFyaWFibGVfZGVjbF9pbl9mb3JfbG9vcCwgZGlhZzo6ZXh0X2Nhc3RfZm5fb2JqLCBkaWFnOjpleHRfY2xhbmdfZGlhZ25vc2VfaWYsIGRpYWc6OmV4dF9jbGFuZ19lbmFibGVfaWYsIGRpYWc6OmV4dF9jeHgxMV9lbnVtX2ZpeGVkX3VuZGVybHlpbmdfdHlwZSwgZGlhZzo6ZXh0X2N4eDE0X2F0dHIsIGRpYWc6OmV4dF9jeHgxN19hdHRyLCBkaWFnOjpleHRfZGVzaWduYXRlZF9pbml0LCBkaWFnOjpleHRfZWxsaXBzaXNfZXhjZXB0aW9uX3NwZWMsIGRpYWc6OmV4dF9lbXB0eV9mbm1hY3JvX2FyZywgZGlhZzo6ZXh0X2VudW1fdmFsdWVfbm90X2ludCwgZGlhZzo6ZXh0X2VudW1lcmF0b3JfbGlzdF9jb21tYV9jLCBkaWFnOjpleHRfZW51bWVyYXRvcl9saXN0X2NvbW1hX2N4eCwgZGlhZzo6ZXh0X2V4cGxpY2l0X2luc3RhbnRpYXRpb25fd2l0aG91dF9xdWFsaWZpZWRfaWQsIGRpYWc6OmV4dF9leHRlcm5fdGVtcGxhdGUsIGRpYWc6OmV4dF9leHRyYV9zZW1pLCBkaWFnOjpleHRfZm9yd2FyZF9yZWZfZW51bSwgZGlhZzo6ZXh0X2ZyZWVzdGFuZGluZ19jb21wbGV4LCBkaWFnOjpleHRfZ251X2FycmF5X3JhbmdlLCBkaWFnOjpleHRfZ251X3B0cl9mdW5jX2FyaXRoLCBkaWFnOjpleHRfZ251X3N1YnNjcmlwdF92b2lkX3R5cGUsIGRpYWc6OmV4dF9nbnVfdm9pZF9wdHIsIGRpYWc6OmV4dF9oZXhfY29uc3RhbnRfaW52YWxpZCwgZGlhZzo6ZXh0X2hleF9saXRlcmFsX2ludmFsaWQsIGRpYWc6OmV4dF9pZGVudF9saXN0X2luX3BhcmFtLCBkaWFnOjpleHRfaW50ZWdlcl9jb21wbGVtZW50X2NvbXBsZXgsIGRpYWc6OmV4dF9pbnRlZ2VyX2luY3JlbWVudF9jb21wbGV4LCBkaWFnOjpleHRfaW50ZXJuYWxfaW5fZXh0ZXJuX2lubGluZV9xdWlldCwgZGlhZzo6ZXh0X2ludmFsaWRfc2lnbl9zcGVjLCBkaWFnOjpleHRfbGluZV9jb21tZW50LCBkaWFnOjpleHRfbWFpbl91c2VkLCBkaWFnOjpleHRfbXVsdGlfbGluZV9saW5lX2NvbW1lbnQsIGRpYWc6OmV4dF9uYW1lZF92YXJpYWRpY19tYWNybywgZGlhZzo6ZXh0X25vX25ld2xpbmVfZW9mLCBkaWFnOjpleHRfbm9uc3RhbmRhcmRfZXNjYXBlLCBkaWFnOjpleHRfbnNfZW51bV9hdHRyaWJ1dGUsIGRpYWc6OmV4dF9wYXJhbV9ub3RfZGVjbGFyZWQsIGRpYWc6OmV4dF9wb2ludGVyX3RvX2NvbnN0X3JlZl9tZW1iZXJfb25fcnZhbHVlLCBkaWFnOjpleHRfcHBfYmFkX3ZhYXJnc191c2UsIGRpYWc6OmV4dF9wcF9jb21tYV9leHByLCBkaWFnOjpleHRfcHBfaWRlbnRfZGlyZWN0aXZlLCBkaWFnOjpleHRfcHBfbGluZV90b29fYmlnLCBkaWFnOjpleHRfcHBfd2FybmluZ19kaXJlY3RpdmUsIGRpYWc6OmV4dF9yZXR1cm5faGFzX3ZvaWRfZXhwciwgZGlhZzo6ZXh0X3J2YWx1ZV90b19yZWZlcmVuY2VfYWNjZXNzX2N0b3IsIGRpYWc6OmV4dF9ydmFsdWVfdG9fcmVmZXJlbmNlX3RlbXBfY29weV9ub192aWFibGUsIGRpYWc6OmV4dF9zaXplb2ZfYWxpZ25vZl9mdW5jdGlvbl90eXBlLCBkaWFnOjpleHRfc2l6ZW9mX2FsaWdub2Zfdm9pZF90eXBlLCBkaWFnOjpleHRfc3Vic2NyaXB0X25vbl9sdmFsdWUsIGRpYWc6OmV4dF90aHJlYWRfYmVmb3JlLCBkaWFnOjpleHRfdHlwZWNoZWNrX2FkZHJvZl92b2lkLCBkaWFnOjpleHRfdHlwZWNoZWNrX2Nhc3Rfbm9uc2NhbGFyLCBkaWFnOjpleHRfdHlwZWNoZWNrX2NvbXBhcmlzb25fb2ZfZnB0cl90b192b2lkLCBkaWFnOjpleHRfdHlwZWNoZWNrX2NvbmRfb25lX3ZvaWQsIGRpYWc6OmV4dF90eXBlY2hlY2tfY29udmVydF9wb2ludGVyX3ZvaWRfZnVuYywgZGlhZzo6ZXh0X3R5cGVjaGVja19vcmRlcmVkX2NvbXBhcmlzb25fb2ZfcG9pbnRlcl9hbmRfemVybywgZGlhZzo6ZXh0X3ZhcmlhZGljX21hY3JvLCBkaWFnOjp3YXJuX2RlZmluZWRfaW5fZnVuY3Rpb25fdHlwZV9tYWNybywgZGlhZzo6d2Fybl9pbGxlZ2FsX2NvbnN0YW50X2FycmF5X3NpemUsIGRpYWc6Ondhcm5fa2Vybl9pc19tZXRob2QsIC0xLAorICAvKiBEaWFnQXJyYXk1MDEgKi8gZGlhZzo6d2Fybl9wcmFnbWFfZXh0ZW5zaW9uX2lzX2NvcmUsIC0xLAorICAvKiBEaWFnQXJyYXk1MDIgKi8gZGlhZzo6d2Fybl9wZXNzaW1pemluZ19tb3ZlX29uX2luaXRpYWxpemF0aW9uLCBkaWFnOjp3YXJuX3Blc3NpbWl6aW5nX21vdmVfb25fcmV0dXJuLCAtMSwKKyAgLyogRGlhZ0FycmF5NTAzICovIGRpYWc6OmV4dF9nbnVfcHRyX2Z1bmNfYXJpdGgsIGRpYWc6OmV4dF9nbnVfc3Vic2NyaXB0X3ZvaWRfdHlwZSwgZGlhZzo6ZXh0X2dudV92b2lkX3B0ciwgZGlhZzo6ZXh0X3NpemVvZl9hbGlnbm9mX2Z1bmN0aW9uX3R5cGUsIGRpYWc6OmV4dF9zaXplb2ZfYWxpZ25vZl92b2lkX3R5cGUsIGRpYWc6Ondhcm5fc3ViX3B0cl96ZXJvX3NpemVfdHlwZXMsIC0xLAorICAvKiBEaWFnQXJyYXk1MDQgKi8gZGlhZzo6d2Fybl9jYXN0X25vbm51bGxfdG9fYm9vbCwgZGlhZzo6d2Fybl9pbXBjYXN0X3BvaW50ZXJfdG9fYm9vbCwgLTEsCisgIC8qIERpYWdBcnJheTUwNSAqLyBkaWFnOjpleHRfdHlwZWNoZWNrX2NvbnZlcnRfaW5jb21wYXRpYmxlX3BvaW50ZXJfc2lnbiwgLTEsCisgIC8qIERpYWdBcnJheTUwNyAqLyBkaWFnOjpleHRfdHlwZWNoZWNrX2NvbmRfaW5jb21wYXRpYmxlX3BvaW50ZXJzLCAtMSwKKyAgLyogRGlhZ0FycmF5NTA4ICovIGRpYWc6Ondhcm5fc2lkZV9lZmZlY3RzX3R5cGVpZCwgLTEsCisgIC8qIERpYWdBcnJheTUwOSAqLyBkaWFnOjp3YXJuX3ByYWdtYV9hdHRyaWJ1dGVfdW51c2VkLCAtMSwKKyAgLyogRGlhZ0FycmF5NTEwICovIGRpYWc6OnBwX3ByYWdtYV9vbmNlX2luX21haW5fZmlsZSwgLTEsCisgIC8qIERpYWdBcnJheTUxMSAqLyBkaWFnOjp3YXJuX3ByYWdtYV9wYWNrX21vZGlmaWVkX2FmdGVyX2luY2x1ZGUsIGRpYWc6Ondhcm5fcHJhZ21hX3BhY2tfbm9fcG9wX2VvZiwgLTEsCisgIC8qIERpYWdBcnJheTUxMiAqLyBkaWFnOjp3YXJuX3ByYWdtYV9wYWNrX25vbl9kZWZhdWx0X2F0X2luY2x1ZGUsIC0xLAorICAvKiBEaWFnQXJyYXk1MTMgKi8gZGlhZzo6cHBfcHJhZ21hX3N5c2hlYWRlcl9pbl9tYWluX2ZpbGUsIC0xLAorICAvKiBEaWFnQXJyYXk1MTQgKi8gZGlhZzo6d2Fybl9yZWRlZmluZV9leHRuYW1lX25vdF9hcHBsaWVkLCAtMSwKKyAgLyogRGlhZ0FycmF5NTE1ICovIGRpYWc6OmV4dF9wcmVkZWZfb3V0c2lkZV9mdW5jdGlvbiwgLTEsCisgIC8qIERpYWdBcnJheTUxNiAqLyBkaWFnOjp3YXJuX3ByaXZhdGVfZXh0ZXJuLCAtMSwKKyAgLyogRGlhZ0FycmF5NTE3ICovIGRpYWc6Ondhcm5fdXNlX29mX3ByaXZhdGVfaGVhZGVyX291dHNpZGVfbW9kdWxlLCAtMSwKKyAgLyogRGlhZ0FycmF5NTE4ICovIGRpYWc6Ondhcm5fbW1hcF9taXNtYXRjaGVkX3ByaXZhdGVfbW9kdWxlX25hbWUsIGRpYWc6Ondhcm5fbW1hcF9taXNtYXRjaGVkX3ByaXZhdGVfc3VibW9kdWxlLCBkaWFnOjp3YXJuX21tYXBfcmVkdW5kYW50X2V4cG9ydF9hcywgZGlhZzo6d2Fybl9ub19wcml2X3N1Ym1vZHVsZV91c2VfdG9wbGV2ZWwsIC0xLAorICAvKiBEaWFnQXJyYXk1MTkgKi8gZGlhZzo6d2Fybl9wcm9maWxlX2RhdGFfbWlzc2luZywgLTEsCisgIC8qIERpYWdBcnJheTUyMCAqLyBkaWFnOjp3YXJuX3Byb2ZpbGVfZGF0YV9vdXRfb2ZfZGF0ZSwgLTEsCisgIC8qIERpYWdBcnJheTUyMSAqLyBkaWFnOjp3YXJuX3Byb2ZpbGVfZGF0YV91bnByb2ZpbGVkLCAtMSwKKyAgLyogRGlhZ0FycmF5NTIyICovIGRpYWc6Ondhcm5fcHJvcGVydHlfYWNjZXNzX3N1Z2dlc3QsIC0xLAorICAvKiBEaWFnQXJyYXk1MjMgKi8gZGlhZzo6d2Fybl9wcm9wZXJ0eV9hdHRyX21pc21hdGNoLCBkaWFnOjp3YXJuX3Byb3BlcnR5X2F0dHJpYnV0ZSwgZGlhZzo6d2Fybl9wcm9wZXJ0eV9yZWRlY2xfZ2V0dGVyX21pc21hdGNoLCBkaWFnOjp3YXJuX3JlYWRvbmx5X3Byb3BlcnR5LCAtMSwKKyAgLyogRGlhZ0FycmF5NTI0ICovIGRpYWc6Ondhcm5fdW5pbXBsZW1lbnRlZF9wcm90b2NvbF9tZXRob2QsIC0xLAorICAvKiBEaWFnQXJyYXk1MjUgKi8gZGlhZzo6d2Fybl9wcm90b2NvbF9wcm9wZXJ0eV9taXNtYXRjaCwgLTEsCisgIC8qIERpYWdBcnJheTUyNiAqLyBkaWFnOjplcnJfZnVuY19yZXR1cm5pbmdfcXVhbGlmaWVkX3ZvaWQsIC0xLAorICAvKiBEaWFnQXJyYXk1MjcgKi8gZGlhZzo6d2Fybl9mb3JfcmFuZ2VfY29uc3RfcmVmZXJlbmNlX2NvcHksIGRpYWc6Ondhcm5fZm9yX3JhbmdlX2NvcHksIGRpYWc6Ondhcm5fZm9yX3JhbmdlX3ZhcmlhYmxlX2Fsd2F5c19jb3B5LCAtMSwKKyAgLyogRGlhZ0FycmF5NTI4ICovIGRpYWc6Ondhcm5fYXV0b19yZWFkb25seV9pYm91dGxldF9wcm9wZXJ0eSwgLTEsCisgIC8qIERpYWdBcnJheTUyOSAqLyBkaWFnOjp3YXJuX2JhZF9yZWNlaXZlcl90eXBlLCAtMSwKKyAgLyogRGlhZ0FycmF5NTMwICovIGRpYWc6Ondhcm5fcmVjZWl2ZXJfZm9yd2FyZF9jbGFzcywgZGlhZzo6d2Fybl9yZWNlaXZlcl9mb3J3YXJkX2luc3RhbmNlLCAtMSwKKyAgLyogRGlhZ0FycmF5NTMxICovIGRpYWc6OmV4dF9tZW1iZXJfcmVkZWNsYXJlZCwgLTEsCisgIC8qIERpYWdBcnJheTUzMyAqLyBkaWFnOjp3YXJuX3JlZHVuZGFudF9tb3ZlX29uX3JldHVybiwgLTEsCisgIC8qIERpYWdBcnJheTUzNCAqLyBkaWFnOjp3YXJuX3JlZHVuZGFudF9wYXJlbnNfYXJvdW5kX2RlY2xhcmF0b3IsIC0xLAorICAvKiBEaWFnQXJyYXk1MzUgKi8gZGlhZzo6ZXh0X3JlZ2lzdGVyX3N0b3JhZ2VfY2xhc3MsIC0xLAorICAvKiBEaWFnQXJyYXk1MzYgKi8gZGlhZzo6d2Fybl9yZWludGVycHJldF9kaWZmZXJlbnRfZnJvbV9zdGF0aWMsIC0xLAorICAvKiBEaWFnQXJyYXk1MzcgKi8gZGlhZzo6cmVtYXJrX2ZlX2JhY2tlbmRfcGx1Z2luLCAtMSwKKyAgLyogRGlhZ0FycmF5NTM4ICovIGRpYWc6Ondhcm5faW5pdGlhbGl6ZXJfb3V0X29mX29yZGVyLCAtMSwKKyAgLyogRGlhZ0FycmF5NTM5ICovIGRpYWc6Ondhcm5fb2JqY19yZXF1aXJlc19zdXBlcl9wcm90b2NvbCwgLTEsCisgIC8qIERpYWdBcnJheTU0MCAqLyBkaWFnOjp3YXJuX3BwX21hY3JvX2lzX3Jlc2VydmVkX2lkLCAtMSwKKyAgLyogRGlhZ0FycmF5NTQxICovIGRpYWc6OmV4dF9tc19yZXNlcnZlZF91c2VyX2RlZmluZWRfbGl0ZXJhbCwgZGlhZzo6ZXh0X3Jlc2VydmVkX3VzZXJfZGVmaW5lZF9saXRlcmFsLCAtMSwKKyAgLyogRGlhZ0FycmF5NTQyICovIGRpYWc6OmV4dF9yZXRhaW5lZF9sYW5ndWFnZV9saW5rYWdlLCAtMSwKKyAgLyogRGlhZ0FycmF5NTQzICovIGRpYWc6Ondhcm5fcmV0X2FkZHJfbGFiZWwsIGRpYWc6Ondhcm5fcmV0X2xvY2FsX3RlbXBfYWRkcl9yZWYsIGRpYWc6Ondhcm5fcmV0X3N0YWNrX2FkZHJfcmVmLCAtMSwKKyAgLyogRGlhZ0FycmF5NTQ0ICovIGRpYWc6OmV4dF9yZXR1cm5faGFzX2V4cHIsIGRpYWc6OmV4dF9yZXR1cm5fbWlzc2luZ19leHByLCBkaWFnOjp3YXJuX2ZhbGxvZmZfbm9udm9pZF9jb3JvdXRpbmUsIGRpYWc6Ondhcm5fZmFsbG9mZl9ub252b2lkX2Z1bmN0aW9uLCBkaWFnOjp3YXJuX2ZhbGxvZmZfbm9udm9pZF9sYW1iZGEsIGRpYWc6Ondhcm5fbWF5YmVfZmFsbG9mZl9ub252b2lkX2Nvcm91dGluZSwgZGlhZzo6d2Fybl9tYXliZV9mYWxsb2ZmX25vbnZvaWRfZnVuY3Rpb24sIGRpYWc6Ondhcm5fbWF5YmVfZmFsbG9mZl9ub252b2lkX2xhbWJkYSwgZGlhZzo6d2Fybl9yZXR1cm5fbWlzc2luZ19leHByLCAtMSwKKyAgLyogRGlhZ0FycmF5NTQ1ICovIGRpYWc6Ondhcm5fcmV0dXJuX3ZhbHVlX3VkdCwgZGlhZzo6d2Fybl9yZXR1cm5fdmFsdWVfdWR0X2luY29tcGxldGUsIC0xLAorICAvKiBEaWFnQXJyYXk1NDYgKi8gZGlhZzo6d2Fybl9kcnZfZW5hYmxpbmdfcnR0aV93aXRoX2V4Y2VwdGlvbnMsIC0xLAorICAvKiBEaWFnQXJyYXk1NDcgKi8gZGlhZzo6cmVtYXJrX3Nhbml0aXplX2FkZHJlc3NfaW5zZXJ0X2V4dHJhX3BhZGRpbmdfYWNjZXB0ZWQsIGRpYWc6OnJlbWFya19zYW5pdGl6ZV9hZGRyZXNzX2luc2VydF9leHRyYV9wYWRkaW5nX3JlamVjdGVkLCAtMSwKKyAgLyogRGlhZ0FycmF5NTQ4ICovIGRpYWc6Ondhcm5fYXR0cmlidXRlX3NlY3Rpb25fb25fcmVkZWNsYXJhdGlvbiwgZGlhZzo6d2Fybl9taXNtYXRjaGVkX3NlY3Rpb24sIC0xLAorICAvKiBEaWFnQXJyYXk1NDkgKi8gZGlhZzo6d2Fybl91bmltcGxlbWVudGVkX3NlbGVjdG9yLCAtMSwKKyAgLyogRGlhZ0FycmF5NTUwICovIGRpYWc6Ondhcm5fbXVsdGlwbGVfc2VsZWN0b3JzLCAtMSwKKyAgLyogRGlhZ0FycmF5NTUxICovIGRpYWc6Ondhcm5fc2VsZl9hc3NpZ25tZW50LCAtMSwKKyAgLyogRGlhZ0FycmF5NTUyICovIGRpYWc6Ondhcm5faWRlbnRpdHlfZmllbGRfYXNzaWduLCAtMSwKKyAgLyogRGlhZ0FycmF5NTUzICovIGRpYWc6Ondhcm5fc2VsZl9tb3ZlLCAtMSwKKyAgLyogRGlhZ0FycmF5NTU0ICovIGRpYWc6Ondhcm5fc2VtaWNvbG9uX2JlZm9yZV9tZXRob2RfYm9keSwgLTEsCisgIC8qIERpYWdBcnJheTU1NSAqLyBkaWFnOjp3YXJuX21pc3Npbmdfc2VudGluZWwsIGRpYWc6Ondhcm5fbm90X2Vub3VnaF9hcmd1bWVudCwgLTEsCisgIC8qIERpYWdBcnJheTU1NyAqLyBkaWFnOjp3YXJuX2ZlX3NlcmlhbGl6ZWRfZGlhZ19mYWlsdXJlLCBkaWFnOjp3YXJuX2ZlX3NlcmlhbGl6ZWRfZGlhZ19tZXJnZV9mYWlsdXJlLCAtMSwKKyAgLyogRGlhZ0FycmF5NTU4ICovIGRpYWc6Ondhcm5fZGVjbF9zaGFkb3csIC0xLAorICAvKiBEaWFnQXJyYXk1NjAgKi8gZGlhZzo6d2Fybl9zaGFkb3dfZmllbGQsIC0xLAorICAvKiBEaWFnQXJyYXk1NjEgKi8gZGlhZzo6d2Fybl9jdG9yX3Bhcm1fc2hhZG93c19maWVsZCwgLTEsCisgIC8qIERpYWdBcnJheTU2MiAqLyBkaWFnOjp3YXJuX21vZGlmeWluZ19zaGFkb3dpbmdfZGVjbCwgLTEsCisgIC8qIERpYWdBcnJheTU2MyAqLyBkaWFnOjp3YXJuX2l2YXJfdXNlX2hpZGRlbiwgLTEsCisgIC8qIERpYWdBcnJheTU2NCAqLyBkaWFnOjp3YXJuX2RlY2xfc2hhZG93X3VuY2FwdHVyZWRfbG9jYWwsIC0xLAorICAvKiBEaWFnQXJyYXk1NjUgKi8gZGlhZzo6d2Fybl9zaGlmdF9uZWdhdGl2ZSwgLTEsCisgIC8qIERpYWdBcnJheTU2NiAqLyBkaWFnOjp3YXJuX3NoaWZ0X2d0X3R5cGV3aWR0aCwgLTEsCisgIC8qIERpYWdBcnJheTU2NyAqLyBkaWFnOjp3YXJuX3NoaWZ0X2xoc19uZWdhdGl2ZSwgLTEsCisgIC8qIERpYWdBcnJheTU2OCAqLyBkaWFnOjp3YXJuX2FkZGl0aW9uX2luX2JpdHNoaWZ0LCAtMSwKKyAgLyogRGlhZ0FycmF5NTY5ICovIGRpYWc6Ondhcm5fc2hpZnRfcmVzdWx0X2d0X3R5cGV3aWR0aCwgLTEsCisgIC8qIERpYWdBcnJheTU3MCAqLyBkaWFnOjp3YXJuX3NoaWZ0X3Jlc3VsdF9zZXRzX3NpZ25fYml0LCAtMSwKKyAgLyogRGlhZ0FycmF5NTcxICovIGRpYWc6Ondhcm5faW1wY2FzdF9pbnRlZ2VyXzY0XzMyLCAtMSwKKyAgLyogRGlhZ0FycmF5NTcyICovIGRpYWc6Ondhcm5fbWl4ZWRfc2lnbl9jb21wYXJpc29uLCAtMSwKKyAgLyogRGlhZ0FycmF5NTczICovIGRpYWc6Ondhcm5faW1wY2FzdF9pbnRlZ2VyX3NpZ24sIGRpYWc6Ondhcm5faW1wY2FzdF9pbnRlZ2VyX3NpZ25fY29uZGl0aW9uYWwsIC0xLAorICAvKiBEaWFnQXJyYXk1NzUgKi8gZGlhZzo6d2Fybl9ub191bmRlcmx5aW5nX3R5cGVfc3BlY2lmaWVkX2Zvcl9lbnVtX2JpdGZpZWxkLCAtMSwKKyAgLyogRGlhZ0FycmF5NTc2ICovIGRpYWc6Ondhcm5fc2l6ZW9mX2FycmF5X3BhcmFtLCAtMSwKKyAgLyogRGlhZ0FycmF5NTc3ICovIGRpYWc6Ondhcm5fc2l6ZW9mX2FycmF5X2RlY2F5LCAtMSwKKyAgLyogRGlhZ0FycmF5NTc4ICovIGRpYWc6Ondhcm5fc2l6ZW9mX3BvaW50ZXJfZXhwcl9tZW1hY2Nlc3MsIGRpYWc6Ondhcm5fc2l6ZW9mX3BvaW50ZXJfdHlwZV9tZW1hY2Nlc3MsIC0xLAorICAvKiBEaWFnQXJyYXk1NzkgKi8gZGlhZzo6d2Fybl9zbGFzaF91X2ZpbGVuYW1lLCAtMSwKKyAgLyogRGlhZ0FycmF5NTgwICovIGRpYWc6Ondhcm5fc29tZXRpbWVzX3VuaW5pdF92YXIsIC0xLAorICAvKiBEaWFnQXJyYXk1ODEgKi8gZGlhZzo6d2Fybl9vbXBfbmVzdGluZ19zaW1kLCBkaWFnOjp3YXJuX3ByYWdtYV9vbXBfaWdub3JlZCwgLTEsCisgIC8qIERpYWdBcnJheTU4MiAqLyBkaWFnOjp3YXJuX3NhbXBsZXJfaW5pdGlhbGl6ZXJfaW52YWxpZF9iaXRzLCAtMSwKKyAgLyogRGlhZ0FycmF5NTg0ICovIGRpYWc6OmV4dF9pbl9jbGFzc19pbml0aWFsaXplcl9mbG9hdF90eXBlX2N4eDExLCAtMSwKKyAgLyogRGlhZ0FycmF5NTg1ICovIGRpYWc6OmV4dF9pbnRlcm5hbF9pbl9leHRlcm5faW5saW5lLCBkaWFnOjpleHRfaW50ZXJuYWxfaW5fZXh0ZXJuX2lubGluZV9xdWlldCwgLTEsCisgIC8qIERpYWdBcnJheTU4NiAqLyBkaWFnOjp3YXJuX3N0YXRpY19pbmxpbmVfZXhwbGljaXRfaW5zdF9pZ25vcmVkLCAtMSwKKyAgLyogRGlhZ0FycmF5NTg3ICovIGRpYWc6Ondhcm5fc3RhdGljX2xvY2FsX2luX2V4dGVybl9pbmxpbmUsIC0xLAorICAvKiBEaWFnQXJyYXk1ODggKi8gZGlhZzo6d2Fybl9zdGF0aWNfc2VsZl9yZWZlcmVuY2VfaW5faW5pdCwgLTEsCisgIC8qIERpYWdBcnJheTYwMCAqLyBkaWFnOjp3YXJuX3N0cmljdF9wcm90b3R5cGVzLCAtMSwKKyAgLyogRGlhZ0FycmF5NjAxICovIGRpYWc6Ondhcm5fc3RyaWN0X211bHRpcGxlX21ldGhvZF9kZWNsLCAtMSwKKyAgLyogRGlhZ0FycmF5NjAyICovIGRpYWc6Ondhcm5fc3RyaW5nY29tcGFyZSwgLTEsCisgIC8qIERpYWdBcnJheTYwMyAqLyBkaWFnOjp3YXJuX2ltcGNhc3Rfc3RyaW5nX2xpdGVyYWxfdG9fYm9vbCwgLTEsCisgIC8qIERpYWdBcnJheTYwNCAqLyBkaWFnOjp3YXJuX3N0cmluZ19wbHVzX2NoYXIsIC0xLAorICAvKiBEaWFnQXJyYXk2MDUgKi8gZGlhZzo6d2Fybl9zdHJpbmdfcGx1c19pbnQsIC0xLAorICAvKiBEaWFnQXJyYXk2MDYgKi8gZGlhZzo6d2Fybl9zdHJsY3B5Y2F0X3dyb25nX3NpemUsIC0xLAorICAvKiBEaWFnQXJyYXk2MDcgKi8gZGlhZzo6d2Fybl9zdHJuY2F0X2xhcmdlX3NpemUsIGRpYWc6Ondhcm5fc3RybmNhdF9zcmNfc2l6ZSwgZGlhZzo6d2Fybl9zdHJuY2F0X3dyb25nX3NpemUsIC0xLAorICAvKiBEaWFnQXJyYXk2MDggKi8gZGlhZzo6ZXh0X3R5cGVjaGVja19iYXNlX3N1cGVyLCAtMSwKKyAgLyogRGlhZ0FycmF5NjA5ICovIGRpYWc6Ondhcm5fY2FzZV92YWx1ZV9vdmVyZmxvdywgZGlhZzo6d2Fybl9taXNzaW5nX2Nhc2UsIGRpYWc6Ondhcm5fbm90X2luX2VudW0sIC0xLAorICAvKiBEaWFnQXJyYXk2MTAgKi8gZGlhZzo6d2Fybl9ib29sX3N3aXRjaF9jb25kaXRpb24sIC0xLAorICAvKiBEaWFnQXJyYXk2MTIgKi8gZGlhZzo6d2Fybl9kZWZfbWlzc2luZ19jYXNlLCAtMSwKKyAgLyogRGlhZ0FycmF5NjEzICovIGRpYWc6Ondhcm5fc3luY19mZXRjaF9hbmRfbmFuZF9zZW1hbnRpY3NfY2hhbmdlLCAtMSwKKyAgLyogRGlhZ0FycmF5NjE1ICovIGRpYWc6Ondhcm5fY29tcGFyaXNvbl9hbHdheXMsIGRpYWc6Ondhcm5fY29tcGFyaXNvbl9iaXR3aXNlX2Fsd2F5cywgLTEsCisgIC8qIERpYWdBcnJheTYxNiAqLyBkaWFnOjp3YXJuX3RhdXRvbG9naWNhbF9ib29sX2NvbXBhcmUsIC0xLAorICAvKiBEaWFnQXJyYXk2MTggKi8gZGlhZzo6d2Fybl9vdXRfb2ZfcmFuZ2VfY29tcGFyZSwgLTEsCisgIC8qIERpYWdBcnJheTYxOSAqLyBkaWFnOjp3YXJuX3RhdXRvbG9naWNhbF9vdmVybGFwX2NvbXBhcmlzb24sIC0xLAorICAvKiBEaWFnQXJyYXk2MjAgKi8gZGlhZzo6d2Fybl9ub25udWxsX2V4cHJfY29tcGFyZSwgZGlhZzo6d2Fybl9udWxsX3BvaW50ZXJfY29tcGFyZSwgLTEsCisgIC8qIERpYWdBcnJheTYyMSAqLyBkaWFnOjp3YXJuX3RhdXRvbG9naWNhbF9jb25zdGFudF9jb21wYXJlLCAtMSwKKyAgLyogRGlhZ0FycmF5NjIyICovIGRpYWc6Ondhcm5fYWRkcmVzc19vZl9yZWZlcmVuY2VfbnVsbF9jb21wYXJlLCBkaWFnOjp3YXJuX3RoaXNfbnVsbF9jb21wYXJlLCAtMSwKKyAgLyogRGlhZ0FycmF5NjIzICovIGRpYWc6Ondhcm5fdW5zaWduZWRfZW51bV9hbHdheXNfdHJ1ZV9jb21wYXJpc29uLCAtMSwKKyAgLyogRGlhZ0FycmF5NjI0ICovIGRpYWc6Ondhcm5fdW5zaWduZWRfYWx3YXlzX3RydWVfY29tcGFyaXNvbiwgLTEsCisgIC8qIERpYWdBcnJheTYyNSAqLyBkaWFnOjpleHRfdHlwZWNoZWNrX2RlY2xfaW5jb21wbGV0ZV90eXBlLCAtMSwKKyAgLyogRGlhZ0FycmF5NjI3ICovIGRpYWc6Ondhcm5fYWNxdWlyZWRfYmVmb3JlLCBkaWFnOjp3YXJuX2FjcXVpcmVkX2JlZm9yZV9hZnRlcl9jeWNsZSwgZGlhZzo6d2Fybl9jYW5ub3RfcmVzb2x2ZV9sb2NrLCBkaWFnOjp3YXJuX2RvdWJsZV9sb2NrLCBkaWFnOjp3YXJuX2V4cGVjdGluZ19sb2NrX2hlbGRfb25fbG9vcCwgZGlhZzo6d2Fybl9leHBlY3RpbmdfbG9ja2VkLCBkaWFnOjp3YXJuX2Z1bl9leGNsdWRlc19tdXRleCwgZGlhZzo6d2Fybl9mdW5fcmVxdWlyZXNfbG9jaywgZGlhZzo6d2Fybl9sb2NrX2V4Y2x1c2l2ZV9hbmRfc2hhcmVkLCBkaWFnOjp3YXJuX2xvY2tfc29tZV9wcmVkZWNlc3NvcnMsIGRpYWc6Ondhcm5fbm9fdW5sb2NrLCBkaWFnOjp3YXJuX3VubG9ja19idXRfbm9fbG9jaywgZGlhZzo6d2Fybl91bmxvY2tfa2luZF9taXNtYXRjaCwgZGlhZzo6d2Fybl92YXJfZGVyZWZfcmVxdWlyZXNfYW55X2xvY2ssIGRpYWc6Ondhcm5fdmFyX2RlcmVmX3JlcXVpcmVzX2xvY2ssIGRpYWc6Ondhcm5fdmFyaWFibGVfcmVxdWlyZXNfYW55X2xvY2ssIGRpYWc6Ondhcm5fdmFyaWFibGVfcmVxdWlyZXNfbG9jaywgLTEsCisgIC8qIERpYWdBcnJheTYyOCAqLyBkaWFnOjp3YXJuX2ludmFsaWRfY2FwYWJpbGl0eV9uYW1lLCBkaWFnOjp3YXJuX3RocmVhZF9hdHRyaWJ1dGVfYXJndW1lbnRfbm90X2xvY2thYmxlLCBkaWFnOjp3YXJuX3RocmVhZF9hdHRyaWJ1dGVfZGVjbF9ub3RfbG9ja2FibGUsIGRpYWc6Ondhcm5fdGhyZWFkX2F0dHJpYnV0ZV9kZWNsX25vdF9wb2ludGVyLCBkaWFnOjp3YXJuX3RocmVhZF9hdHRyaWJ1dGVfaWdub3JlZCwgLTEsCisgIC8qIERpYWdBcnJheTYyOSAqLyBkaWFnOjp3YXJuX3RocmVhZF9zYWZldHlfYmV0YSwgLTEsCisgIC8qIERpYWdBcnJheTYzMCAqLyBkaWFnOjp3YXJuX2FjcXVpcmVfcmVxdWlyZXNfbmVnYXRpdmVfY2FwLCAtMSwKKyAgLyogRGlhZ0FycmF5NjMxICovIGRpYWc6Ondhcm5fZnVuX3JlcXVpcmVzX2xvY2tfcHJlY2lzZSwgZGlhZzo6d2Fybl92YXJfZGVyZWZfcmVxdWlyZXNfbG9ja19wcmVjaXNlLCBkaWFnOjp3YXJuX3ZhcmlhYmxlX3JlcXVpcmVzX2xvY2tfcHJlY2lzZSwgLTEsCisgIC8qIERpYWdBcnJheTYzMiAqLyBkaWFnOjp3YXJuX2d1YXJkZWRfcGFzc19ieV9yZWZlcmVuY2UsIGRpYWc6Ondhcm5fcHRfZ3VhcmRlZF9wYXNzX2J5X3JlZmVyZW5jZSwgLTEsCisgIC8qIERpYWdBcnJheTYzMyAqLyBkaWFnOjp3YXJuX3RocmVhZF9zYWZldHlfdmVyYm9zZSwgLTEsCisgIC8qIERpYWdBcnJheTYzNCAqLyBkaWFnOjp0cmlncmFwaF9jb252ZXJ0ZWQsIGRpYWc6OnRyaWdyYXBoX2VuZHNfYmxvY2tfY29tbWVudCwgZGlhZzo6dHJpZ3JhcGhfaWdub3JlZCwgZGlhZzo6dHJpZ3JhcGhfaWdub3JlZF9ibG9ja19jb21tZW50LCAtMSwKKyAgLyogRGlhZ0FycmF5NjM2ICovIGRpYWc6Ondhcm5fdHlwZV9zYWZldHlfbnVsbF9wb2ludGVyX3JlcXVpcmVkLCBkaWFnOjp3YXJuX3R5cGVfc2FmZXR5X3R5cGVfbWlzbWF0Y2gsIGRpYWc6Ondhcm5fdHlwZV90YWdfZm9yX2RhdGF0eXBlX3dyb25nX2tpbmQsIC0xLAorICAvKiBEaWFnQXJyYXk2MzcgKi8gZGlhZzo6ZXh0X3JlZGVmaW5pdGlvbl9vZl90eXBlZGVmLCAtMSwKKyAgLyogRGlhZ0FycmF5NjM4ICovIGRpYWc6OmV4dF90eXBlbmFtZV9taXNzaW5nLCAtMSwKKyAgLyogRGlhZ0FycmF5NjM5ICovIGRpYWc6Ondhcm5fZmVfdW5hYmxlX3RvX29wZW5fc3RhdHNfZmlsZSwgLTEsCisgIC8qIERpYWdBcnJheTY0MCAqLyBkaWFnOjp3YXJuX3VuYXZhaWxhYmxlX2Z3ZGNsYXNzX21lc3NhZ2UsIC0xLAorICAvKiBEaWFnQXJyYXk2NDEgKi8gZGlhZzo6d2Fybl91bmRlY2xhcmVkX3NlbGVjdG9yLCBkaWFnOjp3YXJuX3VuZGVjbGFyZWRfc2VsZWN0b3Jfd2l0aF90eXBvLCAtMSwKKyAgLyogRGlhZ0FycmF5NjQyICovIGRpYWc6Ondhcm5fcHBfdW5kZWZfaWRlbnRpZmllciwgLTEsCisgIC8qIERpYWdBcnJheTY0MyAqLyBkaWFnOjp3YXJuX2FkZHJlc3Nfb2ZfcmVmZXJlbmNlX2Jvb2xfY29udmVyc2lvbiwgZGlhZzo6d2Fybl90aGlzX2Jvb2xfY29udmVyc2lvbiwgLTEsCisgIC8qIERpYWdBcnJheTY0NCAqLyBkaWFnOjp3YXJuX2Z1bmNfdGVtcGxhdGVfbWlzc2luZywgLTEsCisgIC8qIERpYWdBcnJheTY0NSAqLyBkaWFnOjp3YXJuX3VuZGVmaW5lZF9pbmxpbmUsIC0xLAorICAvKiBEaWFnQXJyYXk2NDYgKi8gZGlhZzo6d2Fybl91bmRlZmluZWRfaW50ZXJuYWwsIC0xLAorICAvKiBEaWFnQXJyYXk2NDcgKi8gZGlhZzo6ZXh0X3VuZGVmaW5lZF9pbnRlcm5hbF90eXBlLCAtMSwKKyAgLyogRGlhZ0FycmF5NjQ4ICovIGRpYWc6Ondhcm5fcG9pbnRlcl9pbmRpcmVjdGlvbl9mcm9tX2luY29tcGF0aWJsZV90eXBlLCBkaWFnOjp3YXJuX3VuZGVmaW5lZF9yZWludGVycHJldF9jYXN0LCAtMSwKKyAgLyogRGlhZ0FycmF5NjQ5ICovIGRpYWc6Ondhcm5fdmFyX3RlbXBsYXRlX21pc3NpbmcsIC0xLAorICAvKiBEaWFnQXJyYXk2NTAgKi8gZGlhZzo6d2Fybl9zaWRlX2VmZmVjdHNfdW5ldmFsdWF0ZWRfY29udGV4dCwgLTEsCisgIC8qIERpYWdBcnJheTY1MSAqLyBkaWFnOjp3YXJuX3VuZ3VhcmRlZF9hdmFpbGFiaWxpdHksIC0xLAorICAvKiBEaWFnQXJyYXk2NTIgKi8gZGlhZzo6d2Fybl91bmd1YXJkZWRfYXZhaWxhYmlsaXR5X25ldywgLTEsCisgIC8qIERpYWdBcnJheTY1MyAqLyBkaWFnOjp3YXJuX3Vjbl9lc2NhcGVfaW5jb21wbGV0ZSwgZGlhZzo6d2Fybl91Y25fZXNjYXBlX25vX2RpZ2l0cywgZGlhZzo6d2Fybl91Y25fZXNjYXBlX3N1cnJvZ2F0ZSwgZGlhZzo6d2Fybl91Y25fbm90X3ZhbGlkX2luX2M4OSwgZGlhZzo6d2Fybl91Y25fbm90X3ZhbGlkX2luX2M4OV9saXRlcmFsLCAtMSwKKyAgLyogRGlhZ0FycmF5NjU0ICovIGRpYWc6Ondhcm5fdXRmOF9zeW1ib2xfaG9tb2dseXBoLCAtMSwKKyAgLyogRGlhZ0FycmF5NjU1ICovIGRpYWc6OmV4dF91bmljb2RlX3doaXRlc3BhY2UsIC0xLAorICAvKiBEaWFnQXJyYXk2NTYgKi8gZGlhZzo6d2Fybl9iYXNlX2NsYXNzX2lzX3VuaW5pdCwgZGlhZzo6d2Fybl9maWVsZF9pc191bmluaXQsIGRpYWc6Ondhcm5fcmVmZXJlbmNlX2ZpZWxkX2lzX3VuaW5pdCwgZGlhZzo6d2Fybl91bmluaXRfYnlyZWZfYmxvY2t2YXJfY2FwdHVyZWRfYnlfYmxvY2ssIGRpYWc6Ondhcm5fdW5pbml0X3NlbGZfcmVmZXJlbmNlX2luX2luaXQsIGRpYWc6Ondhcm5fdW5pbml0X3NlbGZfcmVmZXJlbmNlX2luX3JlZmVyZW5jZV9pbml0LCBkaWFnOjp3YXJuX3VuaW5pdF92YXIsIC0xLAorICAvKiBEaWFnQXJyYXk2NTcgKi8gZGlhZzo6d2Fybl9kcnZfdW5rbm93bl9hcmd1bWVudF9jbGFuZ19jbCwgZGlhZzo6d2Fybl9kcnZfdW5rbm93bl9hcmd1bWVudF9jbGFuZ19jbF93aXRoX3N1Z2dlc3Rpb24sIC0xLAorICAvKiBEaWFnQXJyYXk2NTggKi8gZGlhZzo6d2Fybl91bmtub3duX2F0dHJpYnV0ZV9pZ25vcmVkLCAtMSwKKyAgLyogRGlhZ0FycmF5NjU5ICovIGRpYWc6OmV4dF91bmtub3duX2VzY2FwZSwgLTEsCisgIC8qIERpYWdBcnJheTY2MCAqLyBkaWFnOjpleHRfb25fb2ZmX3N3aXRjaF9zeW50YXgsIGRpYWc6OmV4dF9wcmFnbWFfc3ludGF4X2VvZCwgZGlhZzo6ZXh0X3N0ZGNfcHJhZ21hX2lnbm9yZWQsIGRpYWc6Ondhcm5fcHJhZ21hX2RpYWdub3N0aWNfY2Fubm90X3BvcCwgZGlhZzo6d2Fybl9wcmFnbWFfZGlhZ25vc3RpY19pbnZhbGlkLCBkaWFnOjp3YXJuX3ByYWdtYV9kaWFnbm9zdGljX2ludmFsaWRfb3B0aW9uLCBkaWFnOjp3YXJuX3ByYWdtYV9kaWFnbm9zdGljX2ludmFsaWRfdG9rZW4sIGRpYWc6Ondhcm5fcHJhZ21hX2lnbm9yZWQsIGRpYWc6Ondhcm5fcHJhZ21hX2luY2x1ZGVfYWxpYXNfZXhwZWN0ZWQsIGRpYWc6Ondhcm5fcHJhZ21hX2luY2x1ZGVfYWxpYXNfZXhwZWN0ZWRfZmlsZW5hbWUsIGRpYWc6Ondhcm5fcHJhZ21hX2luY2x1ZGVfYWxpYXNfbWlzbWF0Y2hfYW5nbGUsIGRpYWc6Ondhcm5fcHJhZ21hX2luY2x1ZGVfYWxpYXNfbWlzbWF0Y2hfcXVvdGUsIGRpYWc6Ondhcm5fcHJhZ21hX3dhcm5pbmdfZXhwZWN0ZWQsIGRpYWc6Ondhcm5fcHJhZ21hX3dhcm5pbmdfZXhwZWN0ZWRfbnVtYmVyLCBkaWFnOjp3YXJuX3ByYWdtYV93YXJuaW5nX3B1c2hfbGV2ZWwsIGRpYWc6Ondhcm5fcHJhZ21hX3dhcm5pbmdfc3BlY19pbnZhbGlkLCBkaWFnOjp3YXJuX3N0ZGNfZmVudl9hY2Nlc3Nfbm90X3N1cHBvcnRlZCwgLTEsCisgIC8qIERpYWdBcnJheTY2MSAqLyBkaWFnOjp3YXJuX3Vua25vd25fc2FuaXRpemVyX2lnbm9yZWQsIC0xLAorICAvKiBEaWFnQXJyYXk2NjIgKi8gZGlhZzo6d2Fybl9wcmFnbWFfZGlhZ25vc3RpY191bmtub3duX3dhcm5pbmcsIGRpYWc6Ondhcm5fdW5rbm93bl9kaWFnX29wdGlvbiwgZGlhZzo6d2Fybl91bmtub3duX3dhcm5pbmdfc3BlY2lmaWVyLCAtMSwKKyAgLyogRGlhZ0FycmF5NjYzICovIGRpYWc6OmV4dF90ZW1wbGF0ZV9hcmdfdW5uYW1lZF90eXBlLCAtMSwKKyAgLyogRGlhZ0FycmF5NjY0ICovIGRpYWc6Ondhcm5fdW5uZWVkZWRfaW50ZXJuYWxfZGVjbCwgZGlhZzo6d2Fybl91bm5lZWRlZF9zdGF0aWNfaW50ZXJuYWxfZGVjbCwgLTEsCisgIC8qIERpYWdBcnJheTY2NSAqLyBkaWFnOjp3YXJuX3VubmVlZGVkX21lbWJlcl9mdW5jdGlvbiwgLTEsCisgIC8qIERpYWdBcnJheTY2NiAqLyBkaWFnOjp3YXJuX3VucmVhY2hhYmxlLCAtMSwKKyAgLyogRGlhZ0FycmF5NjY4ICovIGRpYWc6Ondhcm5fdW5yZWFjaGFibGVfYnJlYWssIC0xLAorICAvKiBEaWFnQXJyYXk2NjkgKi8gZGlhZzo6d2Fybl91bnJlYWNoYWJsZV9sb29wX2luY3JlbWVudCwgLTEsCisgIC8qIERpYWdBcnJheTY3MCAqLyBkaWFnOjp3YXJuX3VucmVhY2hhYmxlX3JldHVybiwgLTEsCisgIC8qIERpYWdBcnJheTY3MSAqLyBkaWFnOjp3YXJuX3Vuc2VxdWVuY2VkX21vZF9tb2QsIGRpYWc6Ondhcm5fdW5zZXF1ZW5jZWRfbW9kX3VzZSwgLTEsCisgIC8qIERpYWdBcnJheTY3MiAqLyBkaWFnOjp3YXJuX3RhcmdldF91bnN1cHBvcnRlZF9hYnMyMDA4LCBkaWFnOjp3YXJuX3RhcmdldF91bnN1cHBvcnRlZF9hYnNsZWdhY3ksIC0xLAorICAvKiBEaWFnQXJyYXk2NzMgKi8gZGlhZzo6d2Fybl9hdF9hdmFpbGFibGVfdW5jaGVja2VkX3VzZSwgLTEsCisgIC8qIERpYWdBcnJheTY3NCAqLyBkaWFnOjp3YXJuX3RhcmdldF91bnN1cHBvcnRlZF9jb21wYWN0X2JyYW5jaGVzLCAtMSwKKyAgLyogRGlhZ0FycmF5Njc1ICovIGRpYWc6Ondhcm5fYXR0cmlidXRlX2RsbF9pbnN0YW50aWF0ZWRfYmFzZV9jbGFzcywgLTEsCisgIC8qIERpYWdBcnJheTY3NiAqLyBkaWFnOjp3YXJuX3RlbXBsYXRlX3F1YWxpZmllZF9mcmllbmRfaWdub3JlZCwgZGlhZzo6d2Fybl90ZW1wbGF0ZV9xdWFsaWZpZWRfZnJpZW5kX3Vuc3VwcG9ydGVkLCAtMSwKKyAgLyogRGlhZ0FycmF5Njc3ICovIGRpYWc6Ondhcm5fZHJ2X3Vuc3VwcG9ydGVkX2dwb3B0LCAtMSwKKyAgLyogRGlhZ0FycmF5Njc4ICovIGRpYWc6Ondhcm5fdGFyZ2V0X3Vuc3VwcG9ydGVkX25hbjIwMDgsIGRpYWc6Ondhcm5fdGFyZ2V0X3Vuc3VwcG9ydGVkX25hbmxlZ2FjeSwgLTEsCisgIC8qIERpYWdBcnJheTY3OSAqLyBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9wcm90ZWN0ZWRfdmlzaWJpbGl0eSwgLTEsCisgIC8qIERpYWdBcnJheTY4MCAqLyBkaWFnOjpleHRfcGFydGlhbF9zcGVjc19ub3RfZGVkdWNpYmxlLCAtMSwKKyAgLyogRGlhZ0FycmF5NjgzICovIGRpYWc6Ondhcm5fZHJ2X2RpYWdub3N0aWNzX2hvdG5lc3NfcmVxdWlyZXNfcGdvLCBkaWFnOjp3YXJuX2Rydl9lbXB0eV9qb2luZWRfYXJndW1lbnQsIGRpYWc6Ondhcm5fZHJ2X2lucHV0X2ZpbGVfdW51c2VkLCBkaWFnOjp3YXJuX2Rydl9pbnB1dF9maWxlX3VudXNlZF9ieV9jcHAsIGRpYWc6Ondhcm5fZHJ2X3ByZXByb2Nlc3NlZF9pbnB1dF9maWxlX3VudXNlZCwgZGlhZzo6d2Fybl9kcnZfdW51c2VkX2FyZ3VtZW50LCBkaWFnOjp3YXJuX2lnbm9yZWRfY2xhbmdfb3B0aW9uLCAtMSwKKyAgLyogRGlhZ0FycmF5Njg0ICovIGRpYWc6Ondhcm5fdW51c2VkX2NvbXBhcmlzb24sIC0xLAorICAvKiBEaWFnQXJyYXk2ODUgKi8gZGlhZzo6d2Fybl91bnVzZWRfY29uc3RfdmFyaWFibGUsIC0xLAorICAvKiBEaWFnQXJyYXk2ODYgKi8gZGlhZzo6d2Fybl91bnVzZWRfZXhjZXB0aW9uX3BhcmFtLCAtMSwKKyAgLyogRGlhZ0FycmF5Njg3ICovIGRpYWc6Ondhcm5fdW51c2VkX2Z1bmN0aW9uLCAtMSwKKyAgLyogRGlhZ0FycmF5Njg4ICovIGRpYWc6Ondhcm5fdW51c2VkX3Byb3BlcnR5X2V4cHIsIC0xLAorICAvKiBEaWFnQXJyYXk2ODkgKi8gZGlhZzo6d2Fybl91bnVzZWRfbGFiZWwsIC0xLAorICAvKiBEaWFnQXJyYXk2OTAgKi8gZGlhZzo6d2Fybl91bnVzZWRfbGFtYmRhX2NhcHR1cmUsIC0xLAorICAvKiBEaWFnQXJyYXk2OTEgKi8gZGlhZzo6d2Fybl91bnVzZWRfbG9jYWxfdHlwZWRlZiwgLTEsCisgIC8qIERpYWdBcnJheTY5MyAqLyBkaWFnOjpwcF9tYWNyb19ub3RfdXNlZCwgLTEsCisgIC8qIERpYWdBcnJheTY5NCAqLyBkaWFnOjp3YXJuX3VudXNlZF9tZW1iZXJfZnVuY3Rpb24sIC0xLAorICAvKiBEaWFnQXJyYXk2OTUgKi8gZGlhZzo6d2Fybl91bnVzZWRfcGFyYW1ldGVyLCAtMSwKKyAgLyogRGlhZ0FycmF5Njk2ICovIGRpYWc6Ondhcm5fdW51c2VkX3ByaXZhdGVfZmllbGQsIC0xLAorICAvKiBEaWFnQXJyYXk2OTcgKi8gZGlhZzo6d2Fybl91bnVzZWRfcHJvcGVydHlfYmFja2luZ19pdmFyLCAtMSwKKyAgLyogRGlhZ0FycmF5Njk4ICovIGRpYWc6Ondhcm5fdW51c2VkX3Jlc3VsdCwgLTEsCisgIC8qIERpYWdBcnJheTY5OSAqLyBkaWFnOjp3YXJuX3VudXNlZF90ZW1wbGF0ZSwgLTEsCisgIC8qIERpYWdBcnJheTcwMCAqLyBkaWFnOjp3YXJuX3VudXNlZF9jYWxsLCBkaWFnOjp3YXJuX3VudXNlZF9jb250YWluZXJfc3Vic2NyaXB0X2V4cHIsIGRpYWc6Ondhcm5fdW51c2VkX2V4cHIsIGRpYWc6Ondhcm5fdW51c2VkX3ZvaWRwdHIsIC0xLAorICAvKiBEaWFnQXJyYXk3MDEgKi8gZGlhZzo6d2Fybl91bnVzZWRfdmFyaWFibGUsIC0xLAorICAvKiBEaWFnQXJyYXk3MDIgKi8gZGlhZzo6d2Fybl91bnVzZWRfdm9sYXRpbGUsIC0xLAorICAvKiBEaWFnQXJyYXk3MDMgKi8gZGlhZzo6d2Fybl91c2VkX2J1dF9tYXJrZWRfdW51c2VkLCAtMSwKKyAgLyogRGlhZ0FycmF5NzA0ICovIGRpYWc6Ondhcm5fdXNlcl9saXRlcmFsX3Jlc2VydmVkLCAtMSwKKyAgLyogRGlhZ0FycmF5NzA1ICovIGRpYWc6Ondhcm5fZGlhZ25vc2VfaWZfc3VjY2VlZGVkLCAtMSwKKyAgLyogRGlhZ0FycmF5NzA2ICovIGRpYWc6Ondhcm5fc2Vjb25kX2FyZ19vZl92YV9zdGFydF9ub3RfbGFzdF9uYW1lZF9wYXJhbSwgZGlhZzo6d2Fybl9zZWNvbmRfcGFyYW1ldGVyX3RvX3ZhX2FyZ19uZXZlcl9jb21wYXRpYmxlLCBkaWFnOjp3YXJuX3ZhX3N0YXJ0X3R5cGVfaXNfdW5kZWZpbmVkLCAtMSwKKyAgLyogRGlhZ0FycmF5NzA3ICovIGRpYWc6OmV4dF9uYW1lZF92YXJpYWRpY19tYWNybywgZGlhZzo6ZXh0X3BwX2JhZF92YW9wdF91c2UsIGRpYWc6OmV4dF92YXJpYWRpY19tYWNybywgLTEsCisgIC8qIERpYWdBcnJheTcwOCAqLyBkaWFnOjp3YXJuX3R5cGVjaGVja192ZWN0b3JfZWxlbWVudF9zaXplc19ub3RfZXF1YWwsIC0xLAorICAvKiBEaWFnQXJyYXk3MDkgKi8gZGlhZzo6d2Fybl9pbmNvbXBhdGlibGVfdmVjdG9ycywgLTEsCisgIC8qIERpYWdBcnJheTcxMSAqLyBkaWFnOjp3YXJuX2VtcHR5X3BhcmVuc19hcmVfZnVuY3Rpb25fZGVjbCwgZGlhZzo6d2Fybl9wYXJlbnNfZGlzYW1iaWd1YXRlZF9hc19mdW5jdGlvbl9kZWNsYXJhdGlvbiwgZGlhZzo6d2Fybl9wYXJlbnNfZGlzYW1iaWd1YXRlZF9hc192YXJpYWJsZV9kZWNsYXJhdGlvbiwgLTEsCisgIC8qIERpYWdBcnJheTcxMiAqLyBkaWFnOjp3YXJuX2RlY2xfaW5fcGFyYW1fbGlzdCwgZGlhZzo6d2Fybl9yZWRlZmluaXRpb25faW5fcGFyYW1fbGlzdCwgLTEsCisgIC8qIERpYWdBcnJheTcxMyAqLyBkaWFnOjp3YXJuX3ZsYV91c2VkLCAtMSwKKyAgLyogRGlhZ0FycmF5NzE0ICovIGRpYWc6OmV4dF92bGEsIC0xLAorICAvKiBEaWFnQXJyYXk3MTUgKi8gZGlhZzo6ZXh0X3R5cGVjaGVja19pbmRpcmVjdGlvbl90aHJvdWdoX3ZvaWRfcG9pbnRlciwgLTEsCisgIC8qIERpYWdBcnJheTcxNyAqLyBkaWFnOjp3YXJuX3dlYWtfdGVtcGxhdGVfdnRhYmxlLCAtMSwKKyAgLyogRGlhZ0FycmF5NzE4ICovIGRpYWc6Ondhcm5fd2Vha192dGFibGUsIC0xLAorICAvKiBEaWFnQXJyYXk3MTkgKi8gZGlhZzo6ZXh0X2RlcHJlY2F0ZWRfc3RyaW5nX2xpdGVyYWxfY29udmVyc2lvbiwgLTEsCisgIC8qIERpYWdBcnJheTcyMSAqLyBkaWFnOjp3YXJuX3plcm9fYXNfbnVsbF9wb2ludGVyX2NvbnN0YW50LCAtMSwKKyAgLyogRGlhZ0FycmF5NzIyICovIGRpYWc6OmV4dF90eXBlY2hlY2tfemVyb19hcnJheV9zaXplLCAtMSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IERpYWdTdWJHcm91cHNbXSA9IHsKKyAgLyogRW1wdHkgKi8gLTEsCisgIC8qIERpYWdTdWJHcm91cDAgKi8gMjA3LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNCAqLyAxNywgMjA3LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwMTEgKi8gNTA0LCA2MDIsIDYyMCwgLTEsCisgIC8qIERpYWdTdWJHcm91cDE3ICovIDQwMywgNDkyLCA2MDksIDYxMCwgLTEsCisgIC8qIERpYWdTdWJHcm91cDI1ICovIDMyLCAzMSwgMjgsIC0xLAorICAvKiBEaWFnU3ViR3JvdXAzMCAqLyAyNywgLTEsCisgIC8qIERpYWdTdWJHcm91cDM1ICovIDM3LCAzNiwgLTEsCisgIC8qIERpYWdTdWJHcm91cDQyICovIDI3MiwgMTQyLCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNDUgKi8gNjU4LCAyNjUsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA1NCAqLyA4MiwgMTAyLCAyNDAsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA1NSAqLyAxMDUsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA2MiAqLyA1MDQsIDY0MywgLTEsCisgIC8qIERpYWdTdWJHcm91cDYzICovIDYyLCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNzAgKi8gNzMsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA3MSAqLyA3NywgLTEsCisgIC8qIERpYWdTdWJHcm91cDcyICovIDgxLCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNzMgKi8gODEsIDc2LCA3NCwgMTAxLCA5OSwgOTcsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA3NSAqLyA3MywgMTAzLCAxMDAsIDk4LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNzcgKi8gNzgsIDc5LCA4MCwgLTEsCisgIC8qIERpYWdTdWJHcm91cDgzICovIDk5LCA5NywgLTEsCisgIC8qIERpYWdTdWJHcm91cDg0ICovIDgzLCAxMDAsIDk4LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwODUgKi8gODIsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA4NiAqLyAxNjIsIDE1OCwgODcsIDk3LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwODggKi8gODYsIDk4LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwOTAgKi8gODUsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA5MSAqLyA4NiwgLTEsCisgIC8qIERpYWdTdWJHcm91cDkyICovIDg3LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwOTMgKi8gODksIC0xLAorICAvKiBEaWFnU3ViR3JvdXA5NSAqLyA5NCwgLTEsCisgIC8qIERpYWdTdWJHcm91cDk4ICovIDk3LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwMTAwICovIDk5LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwMTAzICovIDEwMSwgMTAyLCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwMTA0ICovIDEwNywgMTA5LCAxMDEsIDk5LCA5NywgLTEsCisgIC8qIERpYWdTdWJHcm91cDEwOCAqLyAxMDQsIDEwNSwgMTA2LCAxMDMsIDEwMCwgOTgsIC0xLAorICAvKiBEaWFnU3ViR3JvdXAxMjAgKi8gNDE5LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwMTIzICovIDEyMiwgLTEsCisgIC8qIERpYWdTdWJHcm91cDEyOSAqLyA1NywgLTEsCisgIC8qIERpYWdTdWJHcm91cDEzMyAqLyA2MiwgMTI5LCAxOTcsIDU4LCAyMTQsIDU3MSwgMzA5LCAzMzQsIDQxNiwgNDMwLCA0NDgsIDU3MywgNjAzLCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwMTM0ICovIDQzMCwgLTEsCisgIC8qIERpYWdTdWJHcm91cDEzNSAqLyAxMzYsIC0xLAorICAvKiBEaWFnU3ViR3JvdXAxMzggKi8gMiwgLTEsCisgIC8qIERpYWdTdWJHcm91cDE1MyAqLyAxNTQsIDE1NSwgMTU2LCAxNTgsIDE2MiwgMTYzLCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwMTYwICovIDE2MSwgLTEsCisgIC8qIERpYWdTdWJHcm91cDE2MyAqLyA3NCwgLTEsCisgIC8qIERpYWdTdWJHcm91cDE2OSAqLyAxNzAsIC0xLAorICAvKiBEaWFnU3ViR3JvdXAxNzQgKi8gMTc2LCAxNzUsIC0xLAorICAvKiBEaWFnU3ViR3JvdXAxNzcgKi8gMTc4LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwMTg3ICovIDE1NiwgLTEsCisgIC8qIERpYWdTdWJHcm91cDE4OCAqLyA0MjAsIC0xLAorICAvKiBEaWFnU3ViR3JvdXAxOTQgKi8gMjEwLCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwMTk1ICovIDE5NiwgLTEsCisgIC8qIERpYWdTdWJHcm91cDIwNyAqLyAzODUsIDI3MCwgMzAzLCA1NTQsIDM4OCwgNTcyLCA2OTUsIDQzMiwgLTEsCisgIC8qIERpYWdTdWJHcm91cDIwOSAqLyAxMDYsIDc4LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwMjE0ICovIDIxNiwgMjE3LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwMjE5ICovIDIyMCwgMjI3LCA0MjEsIDIyNSwgMjI2LCAyMjEsIC0xLAorICAvKiBEaWFnU3ViR3JvdXAyMjggKi8gMjIzLCAyMjUsIDIyNiwgLTEsCisgIC8qIERpYWdTdWJHcm91cDIzNSAqLyAyMzYsIDIzNywgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgNzE0LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCA1MzEsIDI1NCwgMjU1LCAyNTYsIDI1NywgMjU4LCAyNTksIDcyMiwgMjYwLCAyNjEsIC0xLAorICAvKiBEaWFnU3ViR3JvdXAyNjkgKi8gMjY3LCAyNjgsIC0xLAorICAvKiBEaWFnU3ViR3JvdXAyNzEgKi8gMjc3LCAyNzgsIC0xLAorICAvKiBEaWFnU3ViR3JvdXAyNzUgKi8gMjc2LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwMjkwICovIDI5MSwgMjg3LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwMjk1ICovIDI5NiwgNDE4LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwMzAwICovIDE1OCwgLTEsCisgIC8qIERpYWdTdWJHcm91cDMxMCAqLyAzMDksIC0xLAorICAvKiBEaWFnU3ViR3JvdXAzMTEgKi8gMzEyLCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwMzE0ICovIDI2NiwgLTEsCisgIC8qIERpYWdTdWJHcm91cDMzNiAqLyAxMDcsIC0xLAorICAvKiBEaWFnU3ViR3JvdXAzMzkgKi8gODAsIC0xLAorICAvKiBEaWFnU3ViR3JvdXAzNDAgKi8gMjE4LCA1MjcsIC0xLAorICAvKiBEaWFnU3ViR3JvdXAzNDkgKi8gMzUyLCAzNjgsIDM1NSwgMzY0LCAzNzIsIDM3NSwgMzYwLCAzNzYsIDM2OSwgMzcwLCAzNzQsIDM2MiwgMzU5LCAzNTYsIDM3MywgMzcxLCAzNTgsIDM2NiwgMzY1LCAzNjMsIDM1MSwgMzU0LCAzNzcsIDM1MCwgMzUzLCAzNTcsIDI5NywgLTEsCisgIC8qIERpYWdTdWJHcm91cDQwMyAqLyAxMTgsIDEyMiwgMTUyLCAyMTgsIDIxOSwgMjcxLCAzMDEsIDM4MSwgMzgyLCA0MDQsIDQwNywgNTM4LCA1NDQsIDU1MSwgNTUzLCA1NzYsIDU3NywgNjA1LCA2MzQsIDY1NiwgNjYwLCA2ODEsIDcxNiwgNDUzLCA0NDMsIDQ0NCwgNDg2LCA1MTYsIDExNSwgMjA1LCA3MDUsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA0MDQgKi8gNTAyLCA1MzMsIDU1MywgLTEsCisgIC8qIERpYWdTdWJHcm91cDQwNSAqLyAzNjgsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA0MDkgKi8gODEsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA0MTQgKi8gODcsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA0MTUgKi8gNTcyLCAxMzMsIDMzNSwgLTEsCisgIC8qIERpYWdTdWJHcm91cDQxOCAqLyA0MTcsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA0MzQgKi8gNDM1LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNDQyICovIDQ2NiwgLTEsCisgIC8qIERpYWdTdWJHcm91cDQ0NyAqLyA0NjksIC0xLAorICAvKiBEaWFnU3ViR3JvdXA0NjYgKi8gNDY3LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNDkyICovIDMzOCwgMzM3LCA2MCwgNTY4LCA0ODUsIDQ5MywgMTQzLCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNDk0ICovIDY1MSwgLTEsCisgIC8qIERpYWdTdWJHcm91cDUwMCAqLyAxMTAsIDc4LCA4MCwgODIsIDIxMywgMjI0LCAyMjksIDIzNywgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ2LCAyNDcsIDI0OCwgMjQ5LCAyNTAsIDI1MSwgMjUyLCAyNTMsIDI1NCwgMjU1LCAyNTgsIDI2MCwgMjYxLCAzMjksIDMzOSwgMzUyLCAzNTMsIDM1NSwgMzU3LCAzNTksIDM2NCwgMzY1LCAzNzEsIDQ4NCwgNzE0LCA3MjIsIDY0NywgNTQyLCAxMjUsIDQxMCwgMTQ5LCAxNzksIDMzMSwgMjgyLCAxODksIDE5MiwgNDM3LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNTExICovIDUxMiwgLTEsCisgIC8qIERpYWdTdWJHcm91cDUxNCAqLyA2NjAsIDI2OSwgNTA5LCA1MTEsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA1MzUgKi8gMTYyLCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNTQxICovIDc2LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNTQ0ICovIDU0NSwgLTEsCisgIC8qIERpYWdTdWJHcm91cDU0OSAqLyA1NTAsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA1NTEgKi8gNTUyLCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNTU2ICovIDY3MSwgLTEsCisgIC8qIERpYWdTdWJHcm91cDU1OCAqLyA1NjIsIDU2MywgLTEsCisgIC8qIERpYWdTdWJHcm91cDU1OSAqLyA1NTgsIDU2MSwgNTY0LCA1NjAsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA1NjEgKi8gNTYyLCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNTg0ICovIDI1NiwgLTEsCisgIC8qIERpYWdTdWJHcm91cDYxNSAqLyA2MTYsIDYyMCwgNjE5LCA2MjIsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA2MTYgKi8gNjE4LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNjE3ICovIDYyMSwgNjI0LCA2MjMsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA2MjYgKi8gNjI4LCA2MjcsIDYzMSwgNjMyLCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNjUwICovIDUwOCwgLTEsCisgIC8qIERpYWdTdWJHcm91cDY1MSAqLyA2NTIsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA2NTYgKi8gNTgwLCA1ODgsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA2NjMgKi8gMTA5LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNjY2ICovIDY2OSwgLTEsCisgIC8qIERpYWdTdWJHcm91cDY2NyAqLyA2NjYsIDY2OCwgNjcwLCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNjgxICovIDY4MiwgNjg3LCA2ODksIDY5NiwgNjkwLCA2OTEsIDcwMCwgNzAxLCA2OTcsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA2ODcgKi8gNjY0LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNjkyICovIDY5MSwgLTEsCisgIC8qIERpYWdTdWJHcm91cDY5NCAqLyA2NjUsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA2OTkgKi8gNjY0LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNzAwICovIDY4NCwgNjk4LCA2NTAsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA3MDEgKi8gNjg1LCAtMSwKKyAgLyogRGlhZ1N1Ykdyb3VwNzEwICovIDcwOSwgLTEsCisgIC8qIERpYWdTdWJHcm91cDcxOSAqLyAxNjMsIC0xLAorICAvKiBEaWFnU3ViR3JvdXA3MjAgKi8gNzE5LCAtMSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIERpYWdHcm91cE5hbWVzW10gPSB7CisgICAgIlwwMDBcMDIwI3ByYWdtYS1tZXNzYWdlc1x0I3dhcm5pbmdzXDAyMENGU3RyaW5nLWxpdGVyYWxcMDAzQ0w0XDAzMkluZGVwIgorICAgICJlbmRlbnRDbGFzcy1hdHRyaWJ1dGVcMDIyTlNPYmplY3QtYXR0cmlidXRlXDAwM2FiaVwwMTZhYnNvbHV0ZS12YWx1ZVwwMjQiCisgICAgImFic3RyYWN0LWZpbmFsLWNsYXNzXDAyM2Fic3RyYWN0LXZiYXNlLWluaXRcMDA3YWRkcmVzc1wwMzJhZGRyZXNzLW9mLWFyIgorICAgICJyYXktdGVtcG9yYXJ5XDAzMGFkZHJlc3Mtb2YtcGFja2VkLW1lbWJlclwwMjRhZGRyZXNzLW9mLXRlbXBvcmFyeVwwMjBhZyIKKyAgICAiZ3JlZ2F0ZS1yZXR1cm5cMDM2YWxpZ25lZC1hbGxvY2F0aW9uLXVuYXZhaWxhYmxlXDAwM2FsbFwwMzFhbGxvY2Etd2l0aC0iCisgICAgImFsaWduLWFsaWdub2ZcMDIwYW1iaWd1b3VzLWRlbGV0ZVwwMjJhbWJpZ3VvdXMtZWxsaXBzaXNcMDE3YW1iaWd1b3VzLW1hIgorICAgICJjcm9cMDMxYW1iaWd1b3VzLW1lbWJlci10ZW1wbGF0ZVwwMzRhbmFseXplci1pbmNvbXBhdGlibGUtcGx1Z2luXDAyNWFubyIKKyAgICAibnltb3VzLXBhY2stcGFyZW5zXDAwM2FyYyVhcmMtYnJpZGdlLWNhc3RzLWRpc2FsbG93ZWQtaW4tbm9uYXJjXDAzNmFyYy0iCisgICAgIm1heWJlLXJlcGVhdGVkLXVzZS1vZi13ZWFrXDAyNWFyYy1ub24tcG9kLW1lbWFjY2Vzc1wwMzFhcmMtcGVyZm9ybVNlbGVjIgorICAgICJ0b3ItbGVha3NcMDMwYXJjLXJlcGVhdGVkLXVzZS1vZi13ZWFrXDAyMWFyYy1yZXRhaW4tY3ljbGVzXDAzMmFyYy11bnNhZiIKKyAgICAiZS1yZXRhaW5lZC1hc3NpZ25cMDE0YXJyYXktYm91bmRzXDAzN2FycmF5LWJvdW5kcy1wb2ludGVyLWFyaXRobWV0aWNcMDAzIgorICAgICJhc21cMDI1YXNtLWlnbm9yZWQtcXVhbGlmaWVyXDAyMmFzbS1vcGVyYW5kLXdpZHRoc1wwMTNhc3NpZ24tZW51bVwwMDZhcyIKKyAgICAic3VtZVwwMTNhdC1wcm90b2NvbFwwMjZhdG9taWMtbWVtb3J5LW9yZGVyaW5nXDAyMWF0b21pYy1wcm9wZXJ0aWVzKmF0b20iCisgICAgImljLXByb3BlcnR5LXdpdGgtdXNlci1kZWZpbmVkLWFjY2Vzc29yXDAzNWF0dHJpYnV0ZS1wYWNrZWQtZm9yLWJpdGZpZWxkIgorICAgICJcbmF0dHJpYnV0ZXNcMDMzYXV0by1kaXNhYmxlLXZwdHItc2FuaXRpemVyXDAxM2F1dG8taW1wb3J0XDAyMmF1dG8tc3RvciIKKyAgICAiYWdlLWNsYXNzXDAxM2F1dG8tdmFyLWlkXDAxNGF2YWlsYWJpbGl0eVwwMTZiYWNrZW5kLXBsdWdpblwwMzBiYWNrc2xhc2giCisgICAgIi1uZXdsaW5lLWVzY2FwZVwwMjFiYWQtZnVuY3Rpb24tY2FzdFwwMTZiaW5hcnktbGl0ZXJhbFwwMjZiaW5kLXRvLXRlbXBvIgorICAgICJyYXJ5LWNvcHlcMDI0YmluZGluZy1pbi1jb25kaXRpb25cMDM0Yml0ZmllbGQtY29uc3RhbnQtY29udmVyc2lvblwwMzBiaSIKKyAgICAidGZpZWxkLWVudW0tY29udmVyc2lvblwwMTZiaXRmaWVsZC13aWR0aFwwMjZiaXR3aXNlLW9wLXBhcmVudGhlc2VzXDAzM2IiCisgICAgImxvY2stY2FwdHVyZS1hdXRvcmVsZWFzaW5nXDAxN2Jvb2wtY29udmVyc2lvblwwMjBib29sLWNvbnZlcnNpb25zXDAyMmJyIgorICAgICJhY2VkLXNjYWxhci1pbml0XDAxM2JyaWRnZS1jYXN0XDAyN2J1aWx0aW4tbWFjcm8tcmVkZWZpbmVkXDAyN2J1aWx0aW4tbSIKKyAgICAiZW1jcHktY2hrLXNpemVcMDI3YnVpbHRpbi1yZXF1aXJlcy1oZWFkZXJcbmMrKy1jb21wYXRcMDE0YysrMHgtY29tcGF0XDAyMCIKKyAgICAiYysrMHgtZXh0ZW5zaW9uc1wwMTdjKysweC1uYXJyb3dpbmdcMDE0YysrMTEtY29tcGF0KGMrKzExLWNvbXBhdC1kZXByZWMiCisgICAgImF0ZWQtd3JpdGFibGUtc3RyaW5nc1wwMjVjKysxMS1jb21wYXQtcGVkYW50aWMqYysrMTEtY29tcGF0LXJlc2VydmVkLXVzIgorICAgICJlci1kZWZpbmVkLWxpdGVyYWxcMDIwYysrMTEtZXh0ZW5zaW9uc1wwMjBjKysxMS1leHRyYS1zZW1pXDAyNmMrKzExLWlubCIKKyAgICAiaW5lLW5hbWVzcGFjZVwwMTdjKysxMS1sb25nLWxvbmdcMDE3YysrMTEtbmFycm93aW5nXDAyNGMrKzE0LWJpbmFyeS1saXQiCisgICAgImVyYWxcMDE0YysrMTQtY29tcGF0XDAyNWMrKzE0LWNvbXBhdC1wZWRhbnRpY1wwMjBjKysxNC1leHRlbnNpb25zXDAxNGMrIgorICAgICIrMTctY29tcGF0XDAyNWMrKzE3LWNvbXBhdC1tYW5nbGluZ1wwMjVjKysxNy1jb21wYXQtcGVkYW50aWNcMDIwYysrMTctZSIKKyAgICAieHRlbnNpb25zXDAyMGMrKzF5LWV4dGVuc2lvbnNcMDE0YysrMXotY29tcGF0XDAyNWMrKzF6LWNvbXBhdC1tYW5nbGluZ1wwMjAiCisgICAgImMrKzF6LWV4dGVuc2lvbnNcMDE0YysrMmEtY29tcGF0XDAyNWMrKzJhLWNvbXBhdC1wZWRhbnRpY1wwMjBjKysyYS1leHRlIgorICAgICJuc2lvbnNcMDM2YysrOTgtYysrMTEtYysrMTQtYysrMTctY29tcGF0J2MrKzk4LWMrKzExLWMrKzE0LWMrKzE3LWNvbXBhdCIKKyAgICAiLXBlZGFudGljXDAzMGMrKzk4LWMrKzExLWMrKzE0LWNvbXBhdCFjKys5OC1jKysxMS1jKysxNC1jb21wYXQtcGVkYW50aWMiCisgICAgIlwwMjJjKys5OC1jKysxMS1jb21wYXQhYysrOTgtYysrMTEtY29tcGF0LWJpbmFyeS1saXRlcmFsXDAzM2MrKzk4LWMrKzExIgorICAgICItY29tcGF0LXBlZGFudGljXDAxNGMrKzk4LWNvbXBhdCNjKys5OC1jb21wYXQtYmluZC10by10ZW1wb3JhcnktY29weVwwMjciCisgICAgImMrKzk4LWNvbXBhdC1leHRyYS1zZW1pJWMrKzk4LWNvbXBhdC1sb2NhbC10eXBlLXRlbXBsYXRlLWFyZ3NcMDI1YysrOTgtIgorICAgICJjb21wYXQtcGVkYW50aWMnYysrOTgtY29tcGF0LXVubmFtZWQtdHlwZS10ZW1wbGF0ZS1hcmdzXDAxNmMxMS1leHRlbnNpbyIKKyAgICAibnNcbmM5OS1jb21wYXRcMDE2Yzk5LWV4dGVuc2lvbnNcbmNhc3QtYWxpZ25cMDI3Y2FzdC1jYWxsaW5nLWNvbnZlbnRpb24iCisgICAgIlwwMjBjYXN0LW9mLXNlbC10eXBlXHRjYXN0LXF1YWxcbmNoYXItYWxpZ25cMDE3Y2hhci1zdWJzY3JpcHRzXDAxNGNsYW5nIgorICAgICItY2wtcGNoXDAxNWNsYXNzLXZhcmFyZ3NcMDA1Y29tbWFcMDA3Y29tbWVudFwwMTBjb21tZW50c1wwMzZjb21wYXJlLWRpcyIKKyAgICAidGluY3QtcG9pbnRlci10eXBlc1wwMjZjb21wbGV4LWNvbXBvbmVudC1pbml0XDAzMWNvbmRpdGlvbmFsLXR5cGUtbWlzbWEiCisgICAgInRjaFwwMzFjb25kaXRpb25hbC11bmluaXRpYWxpemVkXDAxNWNvbmZpZy1tYWNyb3NcMDIzY29uc3RhbnQtY29udmVyc2lvIgorICAgICJuXDAzMGNvbnN0YW50LWxvZ2ljYWwtb3BlcmFuZFwwMjNjb25zdGV4cHItbm90LWNvbnN0XDAxMGNvbnN1bWVkXG5jb252ZSIKKyAgICAicnNpb25cMDE3Y29udmVyc2lvbi1udWxsXHRjb3JvdXRpbmUlY29yb3V0aW5lLW1pc3NpbmctdW5oYW5kbGVkLWV4Y2VwdGkiCisgICAgIm9uXDAyNmNvdmVyZWQtc3dpdGNoLWRlZmF1bHRcMDAzY3BwXDAzMGNzdHJpbmctZm9ybWF0LWRpcmVjdGl2ZVwwMjFjdG9yIgorICAgICItZHRvci1wcml2YWN5XDAxM2N1ZGEtY29tcGF0XDAzMGN1c3RvbS1hdG9taWMtcHJvcGVydGllc1wwMTVkYW5nbGluZy1lbCIKKyAgICAic2VcMDE2ZGFuZ2xpbmctZmllbGRcMDMxZGFuZ2xpbmctaW5pdGlhbGl6ZXItbGlzdFx0ZGF0ZS10aW1lXDAyM2RlYWxsb2MiCisgICAgIi1pbi1jYXRlZ29yeVwwMzVkZWJ1Zy1jb21wcmVzc2lvbi11bmF2YWlsYWJsZVwwMzNkZWNsYXJhdGlvbi1hZnRlci1zdGF0IgorICAgICJlbWVudFwwMjZkZWxlZ2F0aW5nLWN0b3ItY3ljbGVzXDAyMWRlbGV0ZS1pbmNvbXBsZXRlXDAyN2RlbGV0ZS1ub24tdmlydCIKKyAgICAidWFsLWR0b3JcbmRlcHJlY2F0ZWRcMDI1ZGVwcmVjYXRlZC1hdHRyaWJ1dGVzXDAyN2RlcHJlY2F0ZWQtZGVjbGFyYXRpb24iCisgICAgInMhZGVwcmVjYXRlZC1keW5hbWljLWV4Y2VwdGlvbi1zcGVjXDAzMmRlcHJlY2F0ZWQtaW1wbGVtZW50YXRpb25zXDAzMWRlIgorICAgICJwcmVjYXRlZC1pbmNyZW1lbnQtYm9vbFwwMzFkZXByZWNhdGVkLW9iamMtaXNhLXVzYWdlJWRlcHJlY2F0ZWQtb2JqYy1wbyIKKyAgICAiaW50ZXItaW50cm9zcGVjdGlvbjVkZXByZWNhdGVkLW9iamMtcG9pbnRlci1pbnRyb3NwZWN0aW9uLXBlcmZvcm1TZWxlY3QiCisgICAgIm9yXDAyM2RlcHJlY2F0ZWQtcmVnaXN0ZXJcMDMzZGVwcmVjYXRlZC13cml0YWJsZS1zdHJpbmdzXDAyMmRpcmVjdC1pdmFyIgorICAgICItYWNjZXNzXDAzMGRpc2FibGVkLW1hY3JvLWV4cGFuc2lvblwwMjVkaXNhYmxlZC1vcHRpbWl6YXRpb25cMDE0ZGlzY2FyZCIKKyAgICAiLXF1YWxcMDM0ZGlzdHJpYnV0ZWQtb2JqZWN0LW1vZGlmaWVyc1wwMTNkaXYtYnktemVyb1wwMjBkaXZpc2lvbi1ieS16ZXIiCisgICAgIm9cMDM2ZGxsLWF0dHJpYnV0ZS1vbi1yZWRlY2xhcmF0aW9uJWRsbGV4cG9ydC1leHBsaWNpdC1pbnN0YW50aWF0aW9uLWRlIgorICAgICJjbFwwMzJkbGxpbXBvcnQtc3RhdGljLWZpZWxkLWRlZlwwMTVkb2N1bWVudGF0aW9uXDAzNWRvY3VtZW50YXRpb24tZGVwciIKKyAgICAiZWNhdGVkLXN5bmNcMDIyZG9jdW1lbnRhdGlvbi1odG1sXDAyNmRvY3VtZW50YXRpb24tcGVkYW50aWNcMDM1ZG9jdW1lbnQiCisgICAgImF0aW9uLXVua25vd24tY29tbWFuZFwwMzZkb2xsYXItaW4taWRlbnRpZmllci1leHRlbnNpb25cMDIwZG91YmxlLXByb21vIgorICAgICJ0aW9uXDAzMGR1cGxpY2F0ZS1kZWNsLXNwZWNpZmllclwwMTZkdXBsaWNhdGUtZW51bVwwMjRkdXBsaWNhdGUtbWV0aG9kLSIKKyAgICAiYXJnXDAyNmR1cGxpY2F0ZS1tZXRob2QtbWF0Y2hcMDIyZHVwbGljYXRlLXByb3RvY29sXDAyN2R5bmFtaWMtY2xhc3MtbWUiCisgICAgIm1hY2Nlc3NcMDI2ZHluYW1pYy1leGNlcHRpb24tc3BlY1wwMDZlZmZjKytcMDIyZW1iZWRkZWQtZGlyZWN0aXZlXG5lbXB0IgorICAgICJ5LWJvZHlcMDIzZW1wdHktZGVjb21wb3NpdGlvblwwMjZlbXB0eS10cmFuc2xhdGlvbi11bml0XDAxM2VuY29kZS10eXBlXDAxNCIKKyAgICAiZW5kaWYtbGFiZWxzXDAxNGVudW0tY29tcGFyZVwwMjNlbnVtLWNvbXBhcmUtc3dpdGNoXDAxN2VudW0tY29udmVyc2lvblwwMTYiCisgICAgImVudW0tdG9vLWxhcmdlXG5leGNlcHRpb25zXDAyNWV4aXQtdGltZS1kZXN0cnVjdG9yc1wwMjRleHBhbnNpb24tdG8tZGVmIgorICAgICJpbmVkXDAyMWV4cGVyaW1lbnRhbC1pc2VsXDAzMGV4cGxpY2l0LWluaXRpYWxpemUtY2FsbFwwMjdleHBsaWNpdC1vd25lciIKKyAgICAic2hpcC10eXBlXDAxN2V4dGVybi1jLWNvbXBhdFwwMjJleHRlcm4taW5pdGlhbGl6ZXJcMDA1ZXh0cmFcMDIzZXh0cmEtcXUiCisgICAgImFsaWZpY2F0aW9uXG5leHRyYS1zZW1pXDAxNGV4dHJhLXRva2Vuc1wwMTBmYWxsYmFja1x0ZmxhZy1lbnVtXDAzMWZsZXhpIgorICAgICJibGUtYXJyYXktZXh0ZW5zaW9uc1wwMjBmbG9hdC1jb252ZXJzaW9uXDAxM2Zsb2F0LWVxdWFsXDAzMWZsb2F0LW92ZXJmbCIKKyAgICAib3ctY29udmVyc2lvblwwMjVmbG9hdC16ZXJvLWNvbnZlcnNpb25cMDIxZm9yLWxvb3AtYW5hbHlzaXNcMDA2Zm9ybWF0XDAyMSIKKyAgICAiZm9ybWF0LWV4dHJhLWFyZ3NcMDMwZm9ybWF0LWludmFsaWQtc3BlY2lmaWVyXDAxNmZvcm1hdC1ub24taXNvXDAyMWZvcm0iCisgICAgImF0LW5vbmxpdGVyYWxcMDE3Zm9ybWF0LXBlZGFudGljXDAxN2Zvcm1hdC1zZWN1cml0eVxuZm9ybWF0LXkya1wwMjJmb3JtIgorICAgICJhdC16ZXJvLWxlbmd0aFwwMTBmb3JtYXQ9MlwwMjNmb3VyLWNoYXItY29uc3RhbnRzXDAyMmZyYW1lLWxhcmdlci10aGFuPSIKKyAgICAiXDAzNmZ1bmN0aW9uLWRlZi1pbi1vYmpjLWNvbnRhaW5lclwwMTVmdXR1cmUtY29tcGF0XG5nY2MtY29tcGF0XDAyM2dsb2IiCisgICAgImFsLWNvbnN0cnVjdG9yc1wwMDNnbnVcMDI2Z251LWFsaWdub2YtZXhwcmVzc2lvblwwMjRnbnUtYW5vbnltb3VzLXN0cnVjIgorICAgICJ0XDAzM2dudS1hcnJheS1tZW1iZXItcGFyZW4taW5pdFwwMTVnbnUtYXV0by10eXBlXDAyMmdudS1iaW5hcnktbGl0ZXJhbCIKKyAgICAiXDAxNmdudS1jYXNlLXJhbmdlXDAyM2dudS1jb21wbGV4LWludGVnZXIgZ251LWNvbXBvdW5kLWxpdGVyYWwtaW5pdGlhbGkiCisgICAgInplclwwMzdnbnUtY29uZGl0aW9uYWwtb21pdHRlZC1vcGVyYW5kXDAxNmdudS1kZXNpZ25hdG9yXDAyNWdudS1lbXB0eS1pIgorICAgICJuaXRpYWxpemVyXDAyMGdudS1lbXB0eS1zdHJ1Y3RcMDM2Z251LWZsZXhpYmxlLWFycmF5LWluaXRpYWxpemVyXDAzN2dudSIKKyAgICAiLWZsZXhpYmxlLWFycmF5LXVuaW9uLW1lbWJlclwwMjRnbnUtZm9sZGluZy1jb25zdGFudFwwMjZnbnUtaW1hZ2luYXJ5LWMiCisgICAgIm9uc3RhbnRcMDIwZ251LWluY2x1ZGUtbmV4dFwwMjJnbnUtbGFiZWwtYXMtdmFsdWVcMDIzZ251LXJlZGVjbGFyZWQtZW51IgorICAgICJtXDAzMGdudS1zdGF0ZW1lbnQtZXhwcmVzc2lvblwwMjVnbnUtc3RhdGljLWZsb2F0LWluaXQkZ251LXN0cmluZy1saXRlciIKKyAgICAiYWwtb3BlcmF0b3ItdGVtcGxhdGVcMDE2Z251LXVuaW9uLWNhc3RcImdudS12YXJpYWJsZS1zaXplZC10eXBlLW5vdC1hdC0iCisgICAgImVuZFwwMjdnbnUtemVyby1saW5lLWRpcmVjdGl2ZSFnbnUtemVyby12YXJpYWRpYy1tYWNyby1hcmd1bWVudHNcMDE0aGVhIgorICAgICJkZXItZ3VhcmRcMDE2aGVhZGVyLWh5Z2llbmVcMDI1aWRpb21hdGljLXBhcmVudGhlc2VzXDAyMmlnbm9yZWQtYXR0cmlidSIKKyAgICAidGVzXDAzNWlnbm9yZWQtb3B0aW1pemF0aW9uLWFyZ3VtZW50XDAzMGlnbm9yZWQtcHJhZ21hLWludHJpbnNpY1wwMjdpZ24iCisgICAgIm9yZWQtcHJhZ21hLW9wdGltaXplXDAxN2lnbm9yZWQtcHJhZ21hc1wwMjJpZ25vcmVkLXF1YWxpZmllcnNcMDEwaW1wbGljIgorICAgICJpdFwwMzJpbXBsaWNpdC1hdG9taWMtcHJvcGVydGllcyppbXBsaWNpdC1jb252ZXJzaW9uLWZsb2F0aW5nLXBvaW50LXRvLSIKKyAgICAiYm9vbCBpbXBsaWNpdC1leGNlcHRpb24tc3BlYy1taXNtYXRjaFwwMjRpbXBsaWNpdC1mYWxsdGhyb3VnaCFpbXBsaWNpdC0iCisgICAgImZhbGx0aHJvdWdoLXBlci1mdW5jdGlvblwwMzVpbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvblwwMTRpbXBsaWNpdC1pIgorICAgICJudFwwMjRpbXBsaWNpdC1yZXRhaW4tc2VsZlwwMzNpbXBsaWNpdGx5LXVuc2lnbmVkLWxpdGVyYWxcMDA2aW1wb3J0JmltcCIKKyAgICAib3J0LXByZXByb2Nlc3Nvci1kaXJlY3RpdmUtcGVkYW50aWNcMDIxaW5hY2Nlc3NpYmxlLWJhc2VcMDMyaW5jbHVkZS1uZXgiCisgICAgInQtYWJzb2x1dGUtcGF0aFwwMzNpbmNsdWRlLW5leHQtb3V0c2lkZS1oZWFkZXJcMDMzaW5jb21wYXRpYmxlLWV4Y2VwdGlvIgorICAgICJuLXNwZWMjaW5jb21wYXRpYmxlLWZ1bmN0aW9uLXBvaW50ZXItdHlwZXNcImluY29tcGF0aWJsZS1saWJyYXJ5LXJlZGVjbCIKKyAgICAiYXJhdGlvblwwMjZpbmNvbXBhdGlibGUtbXMtc3RydWN0XDAzMmluY29tcGF0aWJsZS1wb2ludGVyLXR5cGVzLmluY29tcGEiCisgICAgInRpYmxlLXBvaW50ZXItdHlwZXMtZGlzY2FyZHMtcXVhbGlmaWVyc1wwMzJpbmNvbXBhdGlibGUtcHJvcGVydHktdHlwZVwwMjQiCisgICAgImluY29tcGF0aWJsZS1zeXNyb290XDAzMWluY29tcGxldGUtaW1wbGVtZW50YXRpb25cMDIxaW5jb21wbGV0ZS1tb2R1bGVcMDIzIgorICAgICJpbmNvbXBsZXRlLXVtYnJlbGxhXDAyNmluY29uc2lzdGVudC1kbGxpbXBvcnQoaW5jb25zaXN0ZW50LW1pc3NpbmctZGVzdCIKKyAgICAicnVjdG9yLW92ZXJyaWRlXDAzNWluY29uc2lzdGVudC1taXNzaW5nLW92ZXJyaWRlXDAxNmluY3JlbWVudC1ib29sXDAyMmkiCisgICAgIm5maW5pdGUtcmVjdXJzaW9uXHRpbml0LXNlbGZcMDI1aW5pdGlhbGl6ZXItb3ZlcnJpZGVzXDAyM2luamVjdGVkLWNsYXNzIgorICAgICItbmFtZVwwMDZpbmxpbmVcbmlubGluZS1hc21cMDIxaW5saW5lLW5ldy1kZWxldGVcImluc3RhbnRpYXRpb24tYWZ0ZXItcyIKKyAgICAicGVjaWFsaXphdGlvblwwMTZpbnQtY29udmVyc2lvblwwMTdpbnQtY29udmVyc2lvbnNcMDIzaW50LXRvLXBvaW50ZXItY2EiCisgICAgInN0XDAzMGludC10by12b2lkLXBvaW50ZXItY2FzdFwwMjBpbnRlZ2VyLW92ZXJmbG93XDAzNWludmFsaWQtY29tbWFuZC1sIgorICAgICJpbmUtYXJndW1lbnRcMDIxaW52YWxpZC1jb25zdGV4cHJcMDIwaW52YWxpZC1pYm91dGxldCZpbnZhbGlkLWluaXRpYWxpeiIKKyAgICAiZXItZnJvbS1zeXN0ZW0taGVhZGVyXDAzNWludmFsaWQtaW9zLWRlcGxveW1lbnQtdGFyZ2V0XDAyMGludmFsaWQtbm9yZXQiCisgICAgInVyblwwMjBpbnZhbGlkLW9mZnNldG9mIGludmFsaWQtb3Itbm9uZXhpc3RlbnQtZGlyZWN0b3J5XDAzNmludmFsaWQtcGFyIgorICAgICJ0aWFsLXNwZWNpYWxpemF0aW9uXDAxM2ludmFsaWQtcGNoXDAyMGludmFsaWQtcHAtdG9rZW5cMDI3aW52YWxpZC1zb3VyYyIKKyAgICAiZS1lbmNvZGluZ1wwMjNpbnZhbGlkLXRva2VuLXBhc3RlXDAyMGp1bXAtc2VoLWZpbmFsbHlcMDE2a2V5d29yZC1jb21wYXQiCisgICAgIlwwMTVrZXl3b3JkLW1hY3JvXDAyNmtuci1wcm9tb3RlZC1wYXJhbWV0ZXJcMDMwbGFuZ3VhZ2UtZXh0ZW5zaW9uLXRva2VuIgorICAgICJcMDIzbGFyZ2UtYnktdmFsdWUtY29weVwwMDZsaWJsdG9cMDIybGl0ZXJhbC1jb252ZXJzaW9uXDAxNWxpdGVyYWwtcmFuZyIKKyAgICAiZVwwMzBsb2NhbC10eXBlLXRlbXBsYXRlLWFyZ3NcMDI3bG9naWNhbC1ub3QtcGFyZW50aGVzZXNcMDI2bG9naWNhbC1vcC0iCisgICAgInBhcmVudGhlc2VzXHRsb25nLWxvbmdcMDE1bG9vcC1hbmFseXNpc1wwMTdtYWNyby1yZWRlZmluZWRcMDA0bWFpblwwMjBtIgorICAgICJhaW4tcmV0dXJuLXR5cGVcMDI3bWFsZm9ybWVkLXdhcm5pbmctY2hlY2tcMDM2bWFueS1icmFjZXMtYXJvdW5kLXNjYWxhciIKKyAgICAiLWluaXRcMDIxbWF4LXVuc2lnbmVkLXplcm9cMDIybWVtc2l6ZS1jb21wYXJpc29uXDAyMW1ldGhvZC1zaWduYXR1cmVzXHQiCisgICAgIm1pY3Jvc29mdFwwMjJtaWNyb3NvZnQtYW5vbi10YWdcMDE2bWljcm9zb2Z0LWNhc3RcMDIxbWljcm9zb2Z0LWNoYXJpemVcMDI3IgorICAgICJtaWNyb3NvZnQtY29tbWVudC1wYXN0ZVwwMjRtaWNyb3NvZnQtY29uc3QtaW5pdFwwMjNtaWNyb3NvZnQtY3BwLW1hY3JvXCIiCisgICAgIm1pY3Jvc29mdC1kZWZhdWx0LWFyZy1yZWRlZmluaXRpb25cMDI1bWljcm9zb2Z0LWVuZC1vZi1maWxlIG1pY3Jvc29mdC1lIgorICAgICJudW0tZm9yd2FyZC1yZWZlcmVuY2VcMDI0bWljcm9zb2Z0LWVudW0tdmFsdWVcMDMwbWljcm9zb2Z0LWV4Y2VwdGlvbi1zcCIKKyAgICAiZWNcMDIwbWljcm9zb2Z0LWV4aXN0cyNtaWNyb3NvZnQtZXhwbGljaXQtY29uc3RydWN0b3ItY2FsbFwwMzVtaWNyb3NvZnQiCisgICAgIi1leHRyYS1xdWFsaWZpY2F0aW9uXDAyNG1pY3Jvc29mdC1maXhlZC1lbnVtXDAzMG1pY3Jvc29mdC1mbGV4aWJsZS1hcnJhIgorICAgICJ5XDAxNm1pY3Jvc29mdC1nb3RvXDAzM21pY3Jvc29mdC1pbmFjY2Vzc2libGUtYmFzZVwwMjFtaWNyb3NvZnQtaW5jbHVkZSIKKyAgICAiXDAzM21pY3Jvc29mdC1tdXRhYmxlLXJlZmVyZW5jZVwwMzFtaWNyb3NvZnQtcHVyZS1kZWZpbml0aW9uXDAzMm1pY3Jvc28iCisgICAgImZ0LXJlZGVjbGFyZS1zdGF0aWNcMDIwbWljcm9zb2Z0LXNlYWxlZFwwMjJtaWNyb3NvZnQtdGVtcGxhdGUgbWljcm9zb2Z0IgorICAgICItdW5pb24tbWVtYmVyLXJlZmVyZW5jZVwwMzRtaWNyb3NvZnQtdW5xdWFsaWZpZWQtZnJpZW5kXDAyNG1pY3Jvc29mdC11cyIKKyAgICAiaW5nLWRlY2xcMDMybWljcm9zb2Z0LXZvaWQtcHNldWRvLWR0b3JcMDI1bWlzbWF0Y2hlZC1uZXctZGVsZXRlXDAzMm1pc20iCisgICAgImF0Y2hlZC1wYXJhbWV0ZXItdHlwZXNcMDI3bWlzbWF0Y2hlZC1yZXR1cm4tdHlwZXNcMDE3bWlzbWF0Y2hlZC10YWdzXDAxNiIKKyAgICAibWlzc2luZy1icmFjZXNcMDI0bWlzc2luZy1kZWNsYXJhdGlvbnNcMDI2bWlzc2luZy1leGNlcHRpb24tc3BlY1wwMzJtaXMiCisgICAgInNpbmctZmllbGQtaW5pdGlhbGl6ZXJzXDAzMG1pc3NpbmctZm9ybWF0LWF0dHJpYnV0ZVwwMjRtaXNzaW5nLWluY2x1ZGUtIgorICAgICJkaXJzXDAzMm1pc3NpbmctbWV0aG9kLXJldHVybi10eXBlXDAyMG1pc3Npbmctbm9lc2NhcGVcMDIwbWlzc2luZy1ub3JldCIKKyAgICAidXJuXDAzMG1pc3NpbmctcHJvdG90eXBlLWZvci1jY1wwMjJtaXNzaW5nLXByb3RvdHlwZXNcMDI1bWlzc2luZy1zZWxlY3QiCisgICAgIm9yLW5hbWVcMDE3bWlzc2luZy1zeXNyb290XDAzNW1pc3NpbmctdmFyaWFibGUtZGVjbGFyYXRpb25zXDAxNG1vZHVsZS1iIgorICAgICJ1aWxkXDAxN21vZHVsZS1jb25mbGljdFwwMzNtb2R1bGUtZmlsZS1jb25maWctbWlzbWF0Y2hcMDI1bW9kdWxlLWZpbGUtZSIKKyAgICAieHRlbnNpb25cMDMxbW9kdWxlLWltcG9ydC1pbi1leHRlcm4tY1wibW9kdWxlcy1hbWJpZ3VvdXMtaW50ZXJuYWwtbGlua2EiCisgICAgImdlXDAzN21vZHVsZXMtaW1wb3J0LW5lc3RlZC1yZWR1bmRhbnRcMDA0bW9zdFwwMDRtb3ZlXDAxNG1zdmMtaW5jbHVkZVwwMTYiCisgICAgIm1zdmMtbm90LWZvdW5kXHRtdWx0aWNoYXJcMDIzbXVsdGlwbGUtbW92ZS12YmFzZVx0bmFycm93aW5nXDAyMW5lc3RlZC1hIgorICAgICJub24tdHlwZXNcMDE2bmVzdGVkLWV4dGVybnNcMDIwbmV3LXJldHVybnMtbnVsbFwwMTNuZXdsaW5lLWVvZlwwMTVub2V4YyIKKyAgICAiZXB0LXR5cGVcMDA3bm9uLWdjY1wwMzNub24tbGl0ZXJhbC1udWxsLWNvbnZlcnNpb24nbm9uLW1vZHVsYXItaW5jbHVkZS0iCisgICAgImluLWZyYW1ld29yay1tb2R1bGVcMDM1bm9uLW1vZHVsYXItaW5jbHVkZS1pbi1tb2R1bGVcMDE3bm9uLXBvZC12YXJhcmdzIgorICAgICJcMDIwbm9uLXZpcnR1YWwtZHRvclwwMDdub25udWxsXDAyNW5vbnBvcnRhYmxlLWNmc3RyaW5nc1wwMzBub25wb3J0YWJsZSIKKyAgICAiLWluY2x1ZGUtcGF0aFwwMzdub25wb3J0YWJsZS1zeXN0ZW0taW5jbHVkZS1wYXRoIW5vbnBvcnRhYmxlLXZlY3Rvci1pbmkiCisgICAgInRpYWxpemF0aW9uXDAyM25zY29uc3VtZWQtbWlzbWF0Y2hcMDIybnNyZXR1cm5zLW1pc21hdGNoXDAxN251bGwtYXJpdGhtIgorICAgICJldGljXDAxNm51bGwtY2hhcmFjdGVyXDAxN251bGwtY29udmVyc2lvblwwMjBudWxsLWRlcmVmZXJlbmNlXDAyN251bGwtcCIKKyAgICAib2ludGVyLWFyaXRobWV0aWNcMDEzbnVsbGFiaWxpdHlcMDMwbnVsbGFiaWxpdHktY29tcGxldGVuZXNzXCJudWxsYWJpbGkiCisgICAgInR5LWNvbXBsZXRlbmVzcy1vbi1hcnJheXNcMDI0bnVsbGFiaWxpdHktZGVjbHNwZWNcMDI1bnVsbGFiaWxpdHktZXh0ZW5zIgorICAgICJpb24jbnVsbGFiaWxpdHktaW5mZXJyZWQtb24tbmVzdGVkLXR5cGVcMDM2bnVsbGFibGUtdG8tbm9ubnVsbC1jb252ZXJzaSIKKyAgICAib24rb2JqYy1hdXRvc3ludGhlc2lzLXByb3BlcnR5LWl2YXItbmFtZS1tYXRjaFwwMjdvYmpjLWNpcmN1bGFyLWNvbnRhaW4iCisgICAgImVyXDAxNm9iamMtY29jb2EtYXBpXDAzNG9iamMtZGVzaWduYXRlZC1pbml0aWFsaXplcnNcMDIzb2JqYy1mbGV4aWJsZS1hIgorICAgICJycmF5XDAzN29iamMtZm9yd2FyZC1jbGFzcy1yZWRlZmluaXRpb25cMDI0b2JqYy1pbnRlcmZhY2UtaXZhcnNcMDI0b2JqYyIKKyAgICAiLWxpdGVyYWwtY29tcGFyZVwwMjdvYmpjLWxpdGVyYWwtY29udmVyc2lvblwwMjdvYmpjLW1hY3JvLXJlZGVmaW5pdGlvblwwMjEiCisgICAgIm9iamMtbWVzc2FnaW5nLWlkXDAyMm9iamMtbWV0aG9kLWFjY2Vzc1wwMzdvYmpjLW1pc3NpbmctcHJvcGVydHktc3ludGhlIgorICAgICJzaXNcMDMwb2JqYy1taXNzaW5nLXN1cGVyLWNhbGxzXDAzMm9iamMtbXVsdGlwbGUtbWV0aG9kLW5hbWVzXCJvYmpjLW5vbiIKKyAgICAiY29weS1yZXRhaW4tYmxvY2stcHJvcGVydHlcMDMyb2JqYy1ub251bmlmaWVkLWV4Y2VwdGlvbnNcMDM0b2JqYy1wcm9wZXIiCisgICAgInR5LWltcGxlbWVudGF0aW9uXDAzN29iamMtcHJvcGVydHktaW1wbGljaXQtbWlzbWF0Y2gqb2JqYy1wcm9wZXJ0eS1tYXRjIgorICAgICJoZXMtY29jb2Etb3duZXJzaGlwLXJ1bGVcMDMyb2JqYy1wcm9wZXJ0eS1uby1hdHRyaWJ1dGVcMDI3b2JqYy1wcm9wZXJ0eSIKKyAgICAiLXN5bnRoZXNpcyNvYmpjLXByb3RvY29sLW1ldGhvZC1pbXBsZW1lbnRhdGlvbiBvYmpjLXByb3RvY29sLXByb3BlcnR5LXMiCisgICAgInludGhlc2lzXDAzMG9iamMtcHJvdG9jb2wtcXVhbGlmaWVyc1wib2JqYy1yZWFkb25seS13aXRoLXNldHRlci1wcm9wZXJ0IgorICAgICJ5XDAyNm9iamMtcmVkdW5kYW50LWFwaS11c2VcMDMyb2JqYy1yZWR1bmRhbnQtbGl0ZXJhbC11c2VcMDE3b2JqYy1yb290LSIKKyAgICAiY2xhc3NcMDIzb2JqYy1zdHJpbmctY29tcGFyZVwwMzFvYmpjLXN0cmluZy1jb25jYXRlbmF0aW9uXDAzNG9iamMtdW5zYWYiCisgICAgImUtcGVyZm9ybS1zZWxlY3RvclwwMDNvZHJcMDE2b2xkLXN0eWxlLWNhc3RcMDI0b2xkLXN0eWxlLWRlZmluaXRpb25cMDI3IgorICAgICJvcGVuY2wtdW5zdXBwb3J0ZWQtcmdiYVwwMTZvcGVubXAtY2xhdXNlc1wwMjBvcGVubXAtbG9vcC1mb3JtXDAxNW9wZW5tcCIKKyAgICAiLXRhcmdldFwwMTZvcHRpb24taWdub3JlZFwwMjdvdXQtb2YtbGluZS1kZWNsYXJhdGlvblwwMjVvdXQtb2Ytc2NvcGUtZnUiCisgICAgIm5jdGlvblwwMTRvdmVyLWFsaWduZWRcMDEwb3ZlcmZsb3dcMDIyb3Zlcmxlbmd0aC1zdHJpbmdzXDAzN292ZXJsb2FkZWQtIgorICAgICJzaGlmdC1vcC1wYXJlbnRoZXNlc1wwMjJvdmVybG9hZGVkLXZpcnR1YWxcMDE3b3ZlcnJpZGUtbW9kdWxlXDAzMm92ZXJyaSIKKyAgICAiZGluZy1tZXRob2QtbWlzbWF0Y2hcMDIzb3ZlcnJpZGluZy10LW9wdGlvblwwMDZwYWNrZWRcMDA2cGFkZGVkXDAxM3BhcmUiCisgICAgIm50aGVzZXNcMDI0cGFyZW50aGVzZXMtZXF1YWxpdHlcMDI0cGFydGlhbC1hdmFpbGFiaWxpdHlcMDA0cGFzc1wwMTVwYXNzIgorICAgICItYW5hbHlzaXNcMDEzcGFzcy1mYWlsZWRcMDEzcGFzcy1taXNzZWRcMDE1cGNoLWRhdGUtdGltZVwwMTBwZWRhbnRpY1wwMjYiCisgICAgInBlZGFudGljLWNvcmUtZmVhdHVyZXNcMDIwcGVzc2ltaXppbmctbW92ZVwwMTVwb2ludGVyLWFyaXRoXDAyN3BvaW50ZXItIgorICAgICJib29sLWNvbnZlcnNpb25cMDE0cG9pbnRlci1zaWduXDAyM3BvaW50ZXItdG8taW50LWNhc3RcMDI1cG9pbnRlci10eXBlLSIKKyAgICAibWlzbWF0Y2ggcG90ZW50aWFsbHktZXZhbHVhdGVkLWV4cHJlc3Npb25cMDI2cHJhZ21hLWNsYW5nLWF0dHJpYnV0ZVwwMzIiCisgICAgInByYWdtYS1vbmNlLW91dHNpZGUtaGVhZGVyXDAxM3ByYWdtYS1wYWNrXDAzNnByYWdtYS1wYWNrLXN1c3BpY2lvdXMtaW5jIgorICAgICJsdWRlI3ByYWdtYS1zeXN0ZW0taGVhZGVyLW91dHNpZGUtaGVhZGVyXDAwN3ByYWdtYXMmcHJlZGVmaW5lZC1pZGVudGlmaSIKKyAgICAiZXItb3V0c2lkZS1mdW5jdGlvblwwMTZwcml2YXRlLWV4dGVyblwwMTZwcml2YXRlLWhlYWRlclwwMTZwcml2YXRlLW1vZHUiCisgICAgImxlXDAyNXByb2ZpbGUtaW5zdHItbWlzc2luZ1wwMzFwcm9maWxlLWluc3RyLW91dC1vZi1kYXRlXDAzMHByb2ZpbGUtaW5zIgorICAgICJ0ci11bnByb2ZpbGVkXDAzMnByb3BlcnR5LWFjY2Vzcy1kb3Qtc3ludGF4XDAzM3Byb3BlcnR5LWF0dHJpYnV0ZS1taXNtYSIKKyAgICAidGNoXDAxMHByb3RvY29sJXByb3RvY29sLXByb3BlcnR5LXN5bnRoZXNpcy1hbWJpZ3VpdHlcMDMycXVhbGlmaWVkLXZvaWQiCisgICAgIi1yZXR1cm4tdHlwZVwwMjNyYW5nZS1sb29wLWFuYWx5c2lzXDAzMnJlYWRvbmx5LWlib3V0bGV0LXByb3BlcnR5XDAxNXJlIgorICAgICJjZWl2ZXItZXhwclwwMjZyZWNlaXZlci1mb3J3YXJkLWNsYXNzXDAyN3JlZGVjbGFyZWQtY2xhc3MtbWVtYmVyXDAxN3JlZCIKKyAgICAidW5kYW50LWRlY2xzXDAxNnJlZHVuZGFudC1tb3ZlXDAyMHJlZHVuZGFudC1wYXJlbnNcMDEwcmVnaXN0ZXJcMDI2cmVpbnQiCisgICAgImVycHJldC1iYXNlLWNsYXNzXDAyNXJlbWFyay1iYWNrZW5kLXBsdWdpblwwMDdyZW9yZGVyXDAzMHJlcXVpcmVzLXN1cGVyIgorICAgICItYXR0cmlidXRlXDAyMXJlc2VydmVkLWlkLW1hY3JvXDAzNXJlc2VydmVkLXVzZXItZGVmaW5lZC1saXRlcmFsXDAzMXJldCIKKyAgICAiYWluZWQtbGFuZ3VhZ2UtbGlua2FnZVwwMjRyZXR1cm4tc3RhY2stYWRkcmVzc1wwMTNyZXR1cm4tdHlwZVwwMjVyZXR1cm4iCisgICAgIi10eXBlLWMtbGlua2FnZVwwMjNydHRpLWZvci1leGNlcHRpb25zXDAyMHNhbml0aXplLWFkZHJlc3NcMDA3c2VjdGlvblwwMTAiCisgICAgInNlbGVjdG9yXDAyNnNlbGVjdG9yLXR5cGUtbWlzbWF0Y2hcMDEzc2VsZi1hc3NpZ25cMDIxc2VsZi1hc3NpZ24tZmllbGRcdCIKKyAgICAic2VsZi1tb3ZlXDAzNHNlbWljb2xvbi1iZWZvcmUtbWV0aG9kLWJvZHlcMDEwc2VudGluZWxcMDE2c2VxdWVuY2UtcG9pbnQiCisgICAgIlwwMjZzZXJpYWxpemVkLWRpYWdub3N0aWNzXDAwNnNoYWRvd1xuc2hhZG93LWFsbFwwMTRzaGFkb3ctZmllbGRcMDMzc2hhIgorICAgICJkb3ctZmllbGQtaW4tY29uc3RydWN0b3Ikc2hhZG93LWZpZWxkLWluLWNvbnN0cnVjdG9yLW1vZGlmaWVkXDAxM3NoYWRvdyIKKyAgICAiLWl2YXJcMDI3c2hhZG93LXVuY2FwdHVyZWQtbG9jYWxcMDI0c2hpZnQtY291bnQtbmVnYXRpdmVcMDI0c2hpZnQtY291bnQiCisgICAgIi1vdmVyZmxvd1wwMjRzaGlmdC1uZWdhdGl2ZS12YWx1ZVwwMjRzaGlmdC1vcC1wYXJlbnRoZXNlc1wwMTZzaGlmdC1vdmVyIgorICAgICJmbG93XDAyM3NoaWZ0LXNpZ24tb3ZlcmZsb3dcMDIwc2hvcnRlbi02NC10by0zMlwwMTRzaWduLWNvbXBhcmVcMDE3c2lnbiIKKyAgICAiLWNvbnZlcnNpb25cbnNpZ24tcHJvbW9cMDI0c2lnbmVkLWVudW0tYml0ZmllbGRcMDI1c2l6ZW9mLWFycmF5LWFyZ3VtZW4iCisgICAgInRcMDIyc2l6ZW9mLWFycmF5LWRlY2F5XDAzMHNpemVvZi1wb2ludGVyLW1lbWFjY2Vzc1wwMjBzbGFzaC11LWZpbGVuYW1lIgorICAgICJcMDI3c29tZXRpbWVzLXVuaW5pdGlhbGl6ZWRcMDIyc291cmNlLXVzZXMtb3Blbm1wXDAxM3NwaXItY29tcGF0XDAxN3N0YSIKKyAgICAiY2stcHJvdGVjdG9yXDAyMXN0YXRpYy1mbG9hdC1pbml0XDAyMHN0YXRpYy1pbi1pbmxpbmUkc3RhdGljLWlubGluZS1leHAiCisgICAgImxpY2l0LWluc3RhbnRpYXRpb25cMDI2c3RhdGljLWxvY2FsLWluLWlubGluZVwwMjBzdGF0aWMtc2VsZi1pbml0XDAxN3N0IgorICAgICJyaWN0LWFsaWFzaW5nXDAyMXN0cmljdC1hbGlhc2luZz0wXDAyMXN0cmljdC1hbGlhc2luZz0xXDAyMXN0cmljdC1hbGlhcyIKKyAgICAiaW5nPTJcMDE3c3RyaWN0LW92ZXJmbG93XDAyMXN0cmljdC1vdmVyZmxvdz0wXDAyMXN0cmljdC1vdmVyZmxvdz0xXDAyMXMiCisgICAgInRyaWN0LW92ZXJmbG93PTJcMDIxc3RyaWN0LW92ZXJmbG93PTNcMDIxc3RyaWN0LW92ZXJmbG93PTRcMDIxc3RyaWN0LW92IgorICAgICJlcmZsb3c9NVwwMjFzdHJpY3QtcHJvdG90eXBlc1wwMjVzdHJpY3Qtc2VsZWN0b3ItbWF0Y2hcMDE2c3RyaW5nLWNvbXBhciIKKyAgICAiZVwwMjFzdHJpbmctY29udmVyc2lvblwwMjBzdHJpbmctcGx1cy1jaGFyXDAxN3N0cmluZy1wbHVzLWludFwwMjRzdHJsY3AiCisgICAgInktc3RybGNhdC1zaXplXDAxNHN0cm5jYXQtc2l6ZVwwMzNzdXBlci1jbGFzcy1tZXRob2QtbWlzbWF0Y2hcMDA2c3dpdGNoIgorICAgICJcMDEzc3dpdGNoLWJvb2xcMDE2c3dpdGNoLWRlZmF1bHRcMDEzc3dpdGNoLWVudW0lc3luYy1mZXRjaC1hbmQtbmFuZC1zZSIKKyAgICAibWFudGljcy1jaGFuZ2VkXDAwNXN5bnRoXDAyNHRhdXRvbG9naWNhbC1jb21wYXJlXDAzNXRhdXRvbG9naWNhbC1jb25zdGEiCisgICAgIm50LWNvbXBhcmUmdGF1dG9sb2dpY2FsLWNvbnN0YW50LWluLXJhbmdlLWNvbXBhcmUqdGF1dG9sb2dpY2FsLWNvbnN0YW50IgorICAgICItb3V0LW9mLXJhbmdlLWNvbXBhcmVcMDM0dGF1dG9sb2dpY2FsLW92ZXJsYXAtY29tcGFyZVwwMzR0YXV0b2xvZ2ljYWwtcCIKKyAgICAib2ludGVyLWNvbXBhcmVcMDM3dGF1dG9sb2dpY2FsLXR5cGUtbGltaXQtY29tcGFyZVwwMzZ0YXV0b2xvZ2ljYWwtdW5kZWYiCisgICAgImluZWQtY29tcGFyZSd0YXV0b2xvZ2ljYWwtdW5zaWduZWQtZW51bS16ZXJvLWNvbXBhcmVcInRhdXRvbG9naWNhbC11bnNpIgorICAgICJnbmVkLXplcm8tY29tcGFyZSR0ZW50YXRpdmUtZGVmaW5pdGlvbi1pbmNvbXBsZXRlLXR5cGVcMDE1dGhyZWFkLXNhZmV0eSIKKyAgICAiXDAyNnRocmVhZC1zYWZldHktYW5hbHlzaXNcMDMwdGhyZWFkLXNhZmV0eS1hdHRyaWJ1dGVzXDAyMnRocmVhZC1zYWZldHkiCisgICAgIi1iZXRhXDAyNnRocmVhZC1zYWZldHktbmVnYXRpdmVcMDI1dGhyZWFkLXNhZmV0eS1wcmVjaXNlXDAyN3RocmVhZC1zYWZlIgorICAgICJ0eS1yZWZlcmVuY2VcMDI1dGhyZWFkLXNhZmV0eS12ZXJib3NlXHR0cmlncmFwaHNcMDEzdHlwZS1saW1pdHNcMDEzdHlwZSIKKyAgICAiLXNhZmV0eVwwMjR0eXBlZGVmLXJlZGVmaW5pdGlvblwwMjB0eXBlbmFtZS1taXNzaW5nXDAzMXVuYWJsZS10by1vcGVuLXMiCisgICAgInRhdHMtZmlsZVwwMzB1bmF2YWlsYWJsZS1kZWNsYXJhdGlvbnNcMDIzdW5kZWNsYXJlZC1zZWxlY3RvclwwMDV1bmRlZlwwMzEiCisgICAgInVuZGVmaW5lZC1ib29sLWNvbnZlcnNpb25cMDI3dW5kZWZpbmVkLWZ1bmMtdGVtcGxhdGVcMDIwdW5kZWZpbmVkLWlubGluIgorICAgICJlXDAyMnVuZGVmaW5lZC1pbnRlcm5hbFwwMjd1bmRlZmluZWQtaW50ZXJuYWwtdHlwZVwwMzJ1bmRlZmluZWQtcmVpbnRlciIKKyAgICAicHJldC1jYXN0XDAyNnVuZGVmaW5lZC12YXItdGVtcGxhdGVcMDI2dW5ldmFsdWF0ZWQtZXhwcmVzc2lvblwwMjZ1bmd1YXIiCisgICAgImRlZC1hdmFpbGFiaWxpdHlcMDMydW5ndWFyZGVkLWF2YWlsYWJpbGl0eS1uZXdcMDA3dW5pY29kZVwwMjF1bmljb2RlLWhvIgorICAgICJtb2dseXBoXDAyMnVuaWNvZGUtd2hpdGVzcGFjZVwwMTV1bmluaXRpYWxpemVkXDAyMHVua25vd24tYXJndW1lbnRcMDIydSIKKyAgICAibmtub3duLWF0dHJpYnV0ZXNcMDI3dW5rbm93bi1lc2NhcGUtc2VxdWVuY2VcMDE3dW5rbm93bi1wcmFnbWFzXDAyMnVua24iCisgICAgIm93bi1zYW5pdGl6ZXJzXDAyNnVua25vd24td2FybmluZy1vcHRpb25cMDMydW5uYW1lZC10eXBlLXRlbXBsYXRlLWFyZ3NcMDM1IgorICAgICJ1bm5lZWRlZC1pbnRlcm5hbC1kZWNsYXJhdGlvblwwMzB1bm5lZWRlZC1tZW1iZXItZnVuY3Rpb25cMDIwdW5yZWFjaGFibCIKKyAgICAiZS1jb2RlXDAzM3VucmVhY2hhYmxlLWNvZGUtYWdncmVzc2l2ZVwwMjZ1bnJlYWNoYWJsZS1jb2RlLWJyZWFrXDAzN3VucmUiCisgICAgImFjaGFibGUtY29kZS1sb29wLWluY3JlbWVudFwwMjd1bnJlYWNoYWJsZS1jb2RlLXJldHVyblwwMTN1bnNlcXVlbmNlZFwwMTciCisgICAgInVuc3VwcG9ydGVkLWFic1wwMzZ1bnN1cHBvcnRlZC1hdmFpbGFiaWxpdHktZ3VhcmRcMDE2dW5zdXBwb3J0ZWQtY2IjdW5zIgorICAgICJ1cHBvcnRlZC1kbGwtYmFzZS1jbGFzcy10ZW1wbGF0ZVwwMjJ1bnN1cHBvcnRlZC1mcmllbmRcMDIxdW5zdXBwb3J0ZWQtZyIKKyAgICAicG9wdFwwMTd1bnN1cHBvcnRlZC1uYW5cMDI2dW5zdXBwb3J0ZWQtdmlzaWJpbGl0eVwwMzd1bnVzYWJsZS1wYXJ0aWFsLXMiCisgICAgInBlY2lhbGl6YXRpb25cMDA2dW51c2VkXDAxN3VudXNlZC1hcmd1bWVudFwwMzR1bnVzZWQtY29tbWFuZC1saW5lLWFyZ3VtIgorICAgICJlbnRcMDIxdW51c2VkLWNvbXBhcmlzb25cMDI1dW51c2VkLWNvbnN0LXZhcmlhYmxlXDAzMnVudXNlZC1leGNlcHRpb24tcCIKKyAgICAiYXJhbWV0ZXJcMDE3dW51c2VkLWZ1bmN0aW9uXDAzMnVudXNlZC1nZXR0ZXItcmV0dXJuLXZhbHVlXDAxNHVudXNlZC1sYWIiCisgICAgImVsXDAyNXVudXNlZC1sYW1iZGEtY2FwdHVyZVwwMjR1bnVzZWQtbG9jYWwtdHlwZWRlZlwwMjV1bnVzZWQtbG9jYWwtdHlwIgorICAgICJlZGVmc1wwMTV1bnVzZWQtbWFjcm9zXDAyNnVudXNlZC1tZW1iZXItZnVuY3Rpb25cMDIwdW51c2VkLXBhcmFtZXRlclwwMjQiCisgICAgInVudXNlZC1wcml2YXRlLWZpZWxkXDAyNHVudXNlZC1wcm9wZXJ0eS1pdmFyXDAxNXVudXNlZC1yZXN1bHRcMDE3dW51c2VkIgorICAgICItdGVtcGxhdGVcMDE0dW51c2VkLXZhbHVlXDAxN3VudXNlZC12YXJpYWJsZVwwMjZ1bnVzZWQtdm9sYXRpbGUtbHZhbHVlXDAyNiIKKyAgICAidXNlZC1idXQtbWFya2VkLXVudXNlZFwwMjV1c2VyLWRlZmluZWQtbGl0ZXJhbHNcMDI1dXNlci1kZWZpbmVkLXdhcm5pbmciCisgICAgInNcMDA3dmFyYXJnc1wwMTd2YXJpYWRpYy1tYWNyb3NcMDE1dmVjLWVsZW0tc2l6ZVwwMjF2ZWN0b3ItY29udmVyc2lvblwwMjIiCisgICAgInZlY3Rvci1jb252ZXJzaW9uc1wwMTR2ZXhpbmctcGFyc2VcbnZpc2liaWxpdHlcMDAzdmxhXDAxNXZsYS1leHRlbnNpb25cMDI0IgorICAgICJ2b2lkLXB0ci1kZXJlZmVyZW5jZVwwMjV2b2xhdGlsZS1yZWdpc3Rlci12YXJcMDI1d2Vhay10ZW1wbGF0ZS12dGFibGVzXDAxNCIKKyAgICAid2Vhay12dGFibGVzXDAyMHdyaXRhYmxlLXN0cmluZ3NcMDE1d3JpdGUtc3RyaW5nc1wwMzV6ZXJvLWFzLW51bGwtcG9pbnQiCisgICAgImVyLWNvbnN0YW50XDAyMXplcm8tbGVuZ3RoLWFycmF5In07CisKKyNlbmRpZiAvLyBHRVRfRElBR19BUlJBWVMKKworCisjaWZkZWYgR0VUX0RJQUdfVEFCTEUKKyAgeyAvKiAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwMCAqLyAxIH0sCisgIHsgLyogI3ByYWdtYS1tZXNzYWdlcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLyogRGlhZ0FycmF5MSAqLyAxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiAjd2FybmluZ3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCwgLyogRGlhZ0FycmF5MiAqLyAzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBDRlN0cmluZy1saXRlcmFsICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwgLyogRGlhZ0FycmF5MyAqLyA1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBDTDQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDQgKi8gMyB9LAorICB7IC8qIEluZGVwZW5kZW50Q2xhc3MtYXR0cmlidXRlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ5LCAvKiBEaWFnQXJyYXk1ICovIDcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIE5TT2JqZWN0LWF0dHJpYnV0ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc2LCAvKiBEaWFnQXJyYXk2ICovIDEwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBhYmkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NSwgLyogRW1wdHkgKi8gICAgIDAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGFic29sdXRlLXZhbHVlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5LCAvKiBEaWFnQXJyYXk4ICovIDEyLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBhYnN0cmFjdC1maW5hbC1jbGFzcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTQsIC8qIERpYWdBcnJheTkgKi8gMTcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGFic3RyYWN0LXZiYXNlLWluaXQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNSwgLyogRGlhZ0FycmF5MTAgKi8gMTksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGFkZHJlc3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1NSwgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDExICovIDYgfSwKKyAgeyAvKiBhZGRyZXNzLW9mLWFycmF5LXRlbXBvcmFyeSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjMsIC8qIERpYWdBcnJheTEyICovIDIxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBhZGRyZXNzLW9mLXBhY2tlZC1tZW1iZXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTAsIC8qIERpYWdBcnJheTEzICovIDIzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBhZGRyZXNzLW9mLXRlbXBvcmFyeSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMTUsIC8qIERpYWdBcnJheTE0ICovIDI1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBhZ2dyZWdhdGUtcmV0dXJuICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzYsIC8qIEVtcHR5ICovICAgICAwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBhbGlnbmVkLWFsbG9jYXRpb24tdW5hdmFpbGFibGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAyNTMsIC8qIERpYWdBcnJheTE2ICovIDI3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBhbGwgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODQsIC8qIEVtcHR5ICovICAgICAwLCAvKiBEaWFnU3ViR3JvdXAxNyAqLyAxMCB9LAorICB7IC8qIGFsbG9jYS13aXRoLWFsaWduLWFsaWdub2YgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OCwgLyogRGlhZ0FycmF5MTggKi8gMjksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGFtYmlndW91cy1kZWxldGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxNCwgLyogRGlhZ0FycmF5MTkgKi8gMzEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGFtYmlndW91cy1lbGxpcHNpcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzMSwgLyogRGlhZ0FycmF5MjAgKi8gMzMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGFtYmlndW91cy1tYWNybyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1MCwgLyogRGlhZ0FycmF5MjEgKi8gMzUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGFtYmlndW91cy1tZW1iZXItdGVtcGxhdGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2NiwgLyogRGlhZ0FycmF5MjIgKi8gMzcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGFuYWx5emVyLWluY29tcGF0aWJsZS1wbHVnaW4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgIDM5MiwgLyogRGlhZ0FycmF5MjMgKi8gMzksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGFub255bW91cy1wYWNrLXBhcmVucyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyMSwgLyogRGlhZ0FycmF5MjQgKi8gNDEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGFyYyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MywgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDI1ICovIDE1IH0sCisgIHsgLyogYXJjLWJyaWRnZS1jYXN0cy1kaXNhbGxvd2VkLWluLW5vbmFyYyAqLyAgICAgICAgICAgICAgICAgNDQ3LCAvKiBEaWFnQXJyYXkyNiAqLyA0MywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYXJjLW1heWJlLXJlcGVhdGVkLXVzZS1vZi13ZWFrICovICAgICAgICAgICAgICAgICAgICAgICAgNDg1LCAvKiBEaWFnQXJyYXkyNyAqLyA0NSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYXJjLW5vbi1wb2QtbWVtYWNjZXNzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE2LCAvKiBEaWFnQXJyYXkyOCAqLyA0NywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYXJjLXBlcmZvcm1TZWxlY3Rvci1sZWFrcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM4LCAvKiBEaWFnQXJyYXkyOSAqLyA0OSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYXJjLXJlcGVhdGVkLXVzZS1vZi13ZWFrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTY0LCAvKiBEaWFnQXJyYXkzMCAqLyA1MSwgLyogRGlhZ1N1Ykdyb3VwMzAgKi8gMTkgfSwKKyAgeyAvKiBhcmMtcmV0YWluLWN5Y2xlcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODksIC8qIERpYWdBcnJheTMxICovIDUzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBhcmMtdW5zYWZlLXJldGFpbmVkLWFzc2lnbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MDcsIC8qIERpYWdBcnJheTMyICovIDU1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBhcnJheS1ib3VuZHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MzQsIC8qIERpYWdBcnJheTMzICovIDU5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBhcnJheS1ib3VuZHMtcG9pbnRlci1hcml0aG1ldGljICovICAgICAgICAgICAgICAgICAgICAgICA2NDcsIC8qIERpYWdBcnJheTM0ICovIDY0LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBhc20gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NzksIC8qIEVtcHR5ICovICAgICAwLCAvKiBEaWFnU3ViR3JvdXAzNSAqLyAyMSB9LAorICB7IC8qIGFzbS1pZ25vcmVkLXF1YWxpZmllciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY4MywgLyogRGlhZ0FycmF5MzYgKi8gNjcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGFzbS1vcGVyYW5kLXdpZHRocyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwNSwgLyogRGlhZ0FycmF5MzcgKi8gNzAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGFzc2lnbi1lbnVtICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNCwgLyogRGlhZ0FycmF5MzggKi8gNzIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGFzc3VtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDczNiwgLyogRGlhZ0FycmF5MzkgKi8gNzQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGF0LXByb3RvY29sICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc0MywgLyogRGlhZ0FycmF5NDAgKi8gNzYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGF0b21pYy1tZW1vcnktb3JkZXJpbmcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc1NSwgLyogRGlhZ0FycmF5NDEgKi8gNzgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGF0b21pYy1wcm9wZXJ0aWVzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc3OCwgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDQyICovIDI0IH0sCisgIHsgLyogYXRvbWljLXByb3BlcnR5LXdpdGgtdXNlci1kZWZpbmVkLWFjY2Vzc29yICovICAgICAgICAgICAgNzk2LCAvKiBEaWFnQXJyYXk0MyAqLyA4MCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYXR0cmlidXRlLXBhY2tlZC1mb3ItYml0ZmllbGQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgODM5LCAvKiBEaWFnQXJyYXk0NCAqLyA4MiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYXR0cmlidXRlcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODY5LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwNDUgKi8gMjcgfSwKKyAgeyAvKiBhdXRvLWRpc2FibGUtdnB0ci1zYW5pdGl6ZXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICA4ODAsIC8qIERpYWdBcnJheTQ2ICovIDg0LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBhdXRvLWltcG9ydCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDgsIC8qIERpYWdBcnJheTQ3ICovIDg2LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBhdXRvLXN0b3JhZ2UtY2xhc3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MjAsIC8qIERpYWdBcnJheTQ4ICovIDg4LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBhdXRvLXZhci1pZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MzksIC8qIERpYWdBcnJheTQ5ICovIDkwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBhdmFpbGFiaWxpdHkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NTEsIC8qIERpYWdBcnJheTUwICovIDkyLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBiYWNrZW5kLXBsdWdpbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjQsIC8qIERpYWdBcnJheTUxICovIDEwMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYmFja3NsYXNoLW5ld2xpbmUtZXNjYXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTc5LCAvKiBEaWFnQXJyYXk1MiAqLyAxMDIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGJhZC1mdW5jdGlvbi1jYXN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDQsIC8qIERpYWdBcnJheTUzICovIDEwNCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYmluYXJ5LWxpdGVyYWwgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyMiwgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDU0ICovIDMwIH0sCisgIHsgLyogYmluZC10by10ZW1wb3JhcnktY29weSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAzNywgLyogRGlhZ0FycmF5NTUgKi8gMTA2LCAvKiBEaWFnU3ViR3JvdXA1NSAqLyAzNCB9LAorICB7IC8qIGJpbmRpbmctaW4tY29uZGl0aW9uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNjAsIC8qIERpYWdBcnJheTU2ICovIDEwOSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYml0ZmllbGQtY29uc3RhbnQtY29udmVyc2lvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgMTA4MSwgLyogRGlhZ0FycmF5NTcgKi8gMTExLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBiaXRmaWVsZC1lbnVtLWNvbnZlcnNpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTEwLCAvKiBEaWFnQXJyYXk1OCAqLyAxMTMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGJpdGZpZWxkLXdpZHRoICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMzUsIC8qIERpYWdBcnJheTU5ICovIDExNywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYml0d2lzZS1vcC1wYXJlbnRoZXNlcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE1MCwgLyogRGlhZ0FycmF5NjAgKi8gMTIwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBibG9jay1jYXB0dXJlLWF1dG9yZWxlYXNpbmcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAxMTczLCAvKiBEaWFnQXJyYXk2MSAqLyAxMjIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGJvb2wtY29udmVyc2lvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDEsIC8qIERpYWdBcnJheTYyICovIDEyNCwgLyogRGlhZ1N1Ykdyb3VwNjIgKi8gMzYgfSwKKyAgeyAvKiBib29sLWNvbnZlcnNpb25zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjE3LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwNjMgKi8gMzkgfSwKKyAgeyAvKiBicmFjZWQtc2NhbGFyLWluaXQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjM0LCAvKiBEaWFnQXJyYXk2NCAqLyAxMjYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGJyaWRnZS1jYXN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNTMsIC8qIERpYWdBcnJheTY1ICovIDEyOCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYnVpbHRpbi1tYWNyby1yZWRlZmluZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI2NSwgLyogRGlhZ0FycmF5NjYgKi8gMTMxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBidWlsdGluLW1lbWNweS1jaGstc2l6ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjg5LCAvKiBEaWFnQXJyYXk2NyAqLyAxMzQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGJ1aWx0aW4tcmVxdWlyZXMtaGVhZGVyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMTMsIC8qIERpYWdBcnJheTY4ICovIDEzNiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYysrLWNvbXBhdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMzNywgLyogRGlhZ0FycmF5NjkgKi8gMTM4LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjKysweC1jb21wYXQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzQ4LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwNzAgKi8gNDEgfSwKKyAgeyAvKiBjKysweC1leHRlbnNpb25zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzYxLCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwNzEgKi8gNDMgfSwKKyAgeyAvKiBjKysweC1uYXJyb3dpbmcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzc4LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwNzIgKi8gNDUgfSwKKyAgeyAvKiBjKysxMS1jb21wYXQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzk0LCAvKiBEaWFnQXJyYXk3MyAqLyAxNDAsIC8qIERpYWdTdWJHcm91cDczICovIDQ3IH0sCisgIHsgLyogYysrMTEtY29tcGF0LWRlcHJlY2F0ZWQtd3JpdGFibGUtc3RyaW5ncyAqLyAgICAgICAgICAgICAgMTQwNywgLyogRGlhZ0FycmF5NzQgKi8gMTUxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjKysxMS1jb21wYXQtcGVkYW50aWMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ4LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwNzUgKi8gNTQgfSwKKyAgeyAvKiBjKysxMS1jb21wYXQtcmVzZXJ2ZWQtdXNlci1kZWZpbmVkLWxpdGVyYWwgKi8gICAgICAgICAgICAxNDcwLCAvKiBEaWFnQXJyYXk3NiAqLyAxNTMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGMrKzExLWV4dGVuc2lvbnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MTMsIC8qIERpYWdBcnJheTc3ICovIDE1NSwgLyogRGlhZ1N1Ykdyb3VwNzcgKi8gNTkgfSwKKyAgeyAvKiBjKysxMS1leHRyYS1zZW1pICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTMwLCAvKiBEaWFnQXJyYXk3OCAqLyAxODEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGMrKzExLWlubGluZS1uYW1lc3BhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1NDcsIC8qIERpYWdBcnJheTc5ICovIDE4MywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYysrMTEtbG9uZy1sb25nICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU3MCwgLyogRGlhZ0FycmF5ODAgKi8gMTg1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjKysxMS1uYXJyb3dpbmcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTg2LCAvKiBEaWFnQXJyYXk4MSAqLyAxODcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGMrKzE0LWJpbmFyeS1saXRlcmFsICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDIsIC8qIERpYWdBcnJheTgyICovIDE5NSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYysrMTQtY29tcGF0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYyMywgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDgzICovIDYzIH0sCisgIHsgLyogYysrMTQtY29tcGF0LXBlZGFudGljICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYzNiwgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDg0ICovIDY2IH0sCisgIHsgLyogYysrMTQtZXh0ZW5zaW9ucyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY1OCwgLyogRGlhZ0FycmF5ODUgKi8gMTk3LCAvKiBEaWFnU3ViR3JvdXA4NSAqLyA3MCB9LAorICB7IC8qIGMrKzE3LWNvbXBhdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2NzUsIC8qIEVtcHR5ICovICAgICAwLCAvKiBEaWFnU3ViR3JvdXA4NiAqLyA3MiB9LAorICB7IC8qIGMrKzE3LWNvbXBhdC1tYW5nbGluZyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2ODgsIC8qIERpYWdBcnJheTg3ICovIDIwNiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYysrMTctY29tcGF0LXBlZGFudGljICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcxMCwgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDg4ICovIDc3IH0sCisgIHsgLyogYysrMTctZXh0ZW5zaW9ucyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTczMiwgLyogRGlhZ0FycmF5ODkgKi8gMjA4LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjKysxeS1leHRlbnNpb25zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzQ5LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwOTAgKi8gODAgfSwKKyAgeyAvKiBjKysxei1jb21wYXQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzY2LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwOTEgKi8gODIgfSwKKyAgeyAvKiBjKysxei1jb21wYXQtbWFuZ2xpbmcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzc5LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwOTIgKi8gODQgfSwKKyAgeyAvKiBjKysxei1leHRlbnNpb25zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODAxLCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwOTMgKi8gODYgfSwKKyAgeyAvKiBjKysyYS1jb21wYXQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODE4LCAvKiBEaWFnQXJyYXk5NCAqLyAyMjcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGMrKzJhLWNvbXBhdC1wZWRhbnRpYyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MzEsIC8qIEVtcHR5ICovICAgICAwLCAvKiBEaWFnU3ViR3JvdXA5NSAqLyA4OCB9LAorICB7IC8qIGMrKzJhLWV4dGVuc2lvbnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4NTMsIC8qIERpYWdBcnJheTk2ICovIDIzMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYysrOTgtYysrMTEtYysrMTQtYysrMTctY29tcGF0ICovICAgICAgICAgICAgICAgICAgICAgICAgMTg3MCwgLyogRGlhZ0FycmF5OTcgKi8gMjM0LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjKys5OC1jKysxMS1jKysxNC1jKysxNy1jb21wYXQtcGVkYW50aWMgKi8gICAgICAgICAgICAgICAxOTAxLCAvKiBEaWFnQXJyYXk5OCAqLyAyMzgsIC8qIERpYWdTdWJHcm91cDk4ICovIDkwIH0sCisgIHsgLyogYysrOTgtYysrMTEtYysrMTQtY29tcGF0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk0MSwgLyogRGlhZ0FycmF5OTkgKi8gMjQwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjKys5OC1jKysxMS1jKysxNC1jb21wYXQtcGVkYW50aWMgKi8gICAgICAgICAgICAgICAgICAgICAxOTY2LCAvKiBEaWFnQXJyYXkxMDAgKi8gMjU3LCAvKiBEaWFnU3ViR3JvdXAxMDAgKi8gOTIgfSwKKyAgeyAvKiBjKys5OC1jKysxMS1jb21wYXQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAwLCAvKiBEaWFnQXJyYXkxMDEgKi8gMjYwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjKys5OC1jKysxMS1jb21wYXQtYmluYXJ5LWxpdGVyYWwgKi8gICAgICAgICAgICAgICAgICAgICAyMDE5LCAvKiBEaWFnQXJyYXkxMDIgKi8gMjcwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjKys5OC1jKysxMS1jb21wYXQtcGVkYW50aWMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAyMDUzLCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwMTAzICovIDk0IH0sCisgIHsgLyogYysrOTgtY29tcGF0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA4MSwgLyogRGlhZ0FycmF5MTA0ICovIDI3MiwgLyogRGlhZ1N1Ykdyb3VwMTA0ICovIDk3IH0sCisgIHsgLyogYysrOTgtY29tcGF0LWJpbmQtdG8tdGVtcG9yYXJ5LWNvcHkgKi8gICAgICAgICAgICAgICAgICAgMjA5NCwgLyogRGlhZ0FycmF5MTA1ICovIDMzMiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYysrOTgtY29tcGF0LWV4dHJhLXNlbWkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEzMCwgLyogRGlhZ0FycmF5MTA2ICovIDMzNCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYysrOTgtY29tcGF0LWxvY2FsLXR5cGUtdGVtcGxhdGUtYXJncyAqLyAgICAgICAgICAgICAgICAgMjE1NCwgLyogRGlhZ0FycmF5MTA3ICovIDMzNiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogYysrOTgtY29tcGF0LXBlZGFudGljICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjE5MiwgLyogRGlhZ0FycmF5MTA4ICovIDMzOCwgLyogRGlhZ1N1Ykdyb3VwMTA4ICovIDEwMyB9LAorICB7IC8qIGMrKzk4LWNvbXBhdC11bm5hbWVkLXR5cGUtdGVtcGxhdGUtYXJncyAqLyAgICAgICAgICAgICAgIDIyMTQsIC8qIERpYWdBcnJheTEwOSAqLyAzNDgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGMxMS1leHRlbnNpb25zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyNTQsIC8qIERpYWdBcnJheTExMCAqLyAzNTAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGM5OS1jb21wYXQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyNjksIC8qIERpYWdBcnJheTExMSAqLyAzNTcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGM5OS1leHRlbnNpb25zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyODAsIC8qIERpYWdBcnJheTExMiAqLyAzNjEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGNhc3QtYWxpZ24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyOTUsIC8qIERpYWdBcnJheTExMyAqLyAzNzIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGNhc3QtY2FsbGluZy1jb252ZW50aW9uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzMDYsIC8qIERpYWdBcnJheTExNCAqLyAzNzQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGNhc3Qtb2Ytc2VsLXR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzMzAsIC8qIERpYWdBcnJheTExNSAqLyAzNzYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGNhc3QtcXVhbCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzNDcsIC8qIERpYWdBcnJheTExNiAqLyAzNzgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGNoYXItYWxpZ24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzNTcsIC8qIEVtcHR5ICovICAgICAwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjaGFyLXN1YnNjcmlwdHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzY4LCAvKiBEaWFnQXJyYXkxMTggKi8gMzgxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjbGFuZy1jbC1wY2ggKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzg0LCAvKiBEaWFnQXJyYXkxMTkgKi8gMzg0LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjbGFzcy12YXJhcmdzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzk3LCAvKiBEaWFnQXJyYXkxMjAgKi8gMzg5LCAvKiBEaWFnU3ViR3JvdXAxMjAgKi8gMTEwIH0sCisgIHsgLyogY29tbWEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQxMSwgLyogRGlhZ0FycmF5MTIxICovIDM5MSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogY29tbWVudCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQxNywgLyogRGlhZ0FycmF5MTIyICovIDM5MywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogY29tbWVudHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQyNSwgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDEyMyAqLyAxMTIgfSwKKyAgeyAvKiBjb21wYXJlLWRpc3RpbmN0LXBvaW50ZXItdHlwZXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAyNDM0LCAvKiBEaWFnQXJyYXkxMjQgKi8gMzk4LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjb21wbGV4LWNvbXBvbmVudC1pbml0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDY1LCAvKiBEaWFnQXJyYXkxMjUgKi8gNDAwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjb25kaXRpb25hbC10eXBlLW1pc21hdGNoICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDg4LCAvKiBEaWFnQXJyYXkxMjYgKi8gNDAyLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjb25kaXRpb25hbC11bmluaXRpYWxpemVkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTE0LCAvKiBEaWFnQXJyYXkxMjcgKi8gNDA0LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjb25maWctbWFjcm9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTQwLCAvKiBEaWFnQXJyYXkxMjggKi8gNDA2LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjb25zdGFudC1jb252ZXJzaW9uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTU0LCAvKiBEaWFnQXJyYXkxMjkgKi8gNDA4LCAvKiBEaWFnU3ViR3JvdXAxMjkgKi8gMTE0IH0sCisgIHsgLyogY29uc3RhbnQtbG9naWNhbC1vcGVyYW5kICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU3NCwgLyogRGlhZ0FycmF5MTMwICovIDQxMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogY29uc3RleHByLW5vdC1jb25zdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU5OSwgLyogRGlhZ0FycmF5MTMxICovIDQxMiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogY29uc3VtZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYxOSwgLyogRGlhZ0FycmF5MTMyICovIDQxNCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogY29udmVyc2lvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYyOCwgLyogRGlhZ0FycmF5MTMzICovIDQyMywgLyogRGlhZ1N1Ykdyb3VwMTMzICovIDExNiB9LAorICB7IC8qIGNvbnZlcnNpb24tbnVsbCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2MzksIC8qIEVtcHR5ICovICAgICAwLCAvKiBEaWFnU3ViR3JvdXAxMzQgKi8gMTMwIH0sCisgIHsgLyogY29yb3V0aW5lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjY1NSwgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDEzNSAqLyAxMzIgfSwKKyAgeyAvKiBjb3JvdXRpbmUtbWlzc2luZy11bmhhbmRsZWQtZXhjZXB0aW9uICovICAgICAgICAgICAgICAgICAyNjY1LCAvKiBEaWFnQXJyYXkxMzYgKi8gNDMxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjb3ZlcmVkLXN3aXRjaC1kZWZhdWx0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzAzLCAvKiBEaWFnQXJyYXkxMzcgKi8gNDMzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjcHAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzI2LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwMTM4ICovIDEzNCB9LAorICB7IC8qIGNzdHJpbmctZm9ybWF0LWRpcmVjdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3MzAsIC8qIERpYWdBcnJheTEzOSAqLyA0MzUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGN0b3ItZHRvci1wcml2YWN5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3NTUsIC8qIEVtcHR5ICovICAgICAwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjdWRhLWNvbXBhdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzczLCAvKiBEaWFnQXJyYXkxNDEgKi8gNDM3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBjdXN0b20tYXRvbWljLXByb3BlcnRpZXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzg1LCAvKiBEaWFnQXJyYXkxNDIgKi8gNDQzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBkYW5nbGluZy1lbHNlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODEwLCAvKiBEaWFnQXJyYXkxNDMgKi8gNDQ1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBkYW5nbGluZy1maWVsZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODI0LCAvKiBEaWFnQXJyYXkxNDQgKi8gNDQ3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBkYW5nbGluZy1pbml0aWFsaXplci1saXN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODM5LCAvKiBEaWFnQXJyYXkxNDUgKi8gNDUxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBkYXRlLXRpbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODY1LCAvKiBEaWFnQXJyYXkxNDYgKi8gNDUzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBkZWFsbG9jLWluLWNhdGVnb3J5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODc1LCAvKiBEaWFnQXJyYXkxNDcgKi8gNDU1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBkZWJ1Zy1jb21wcmVzc2lvbi11bmF2YWlsYWJsZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAyODk1LCAvKiBEaWFnQXJyYXkxNDggKi8gNDU3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAyOTI1LCAvKiBEaWFnQXJyYXkxNDkgKi8gNDU5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBkZWxlZ2F0aW5nLWN0b3ItY3ljbGVzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTUzLCAvKiBEaWFnQXJyYXkxNTAgKi8gNDYxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBkZWxldGUtaW5jb21wbGV0ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTc2LCAvKiBEaWFnQXJyYXkxNTEgKi8gNDYzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBkZWxldGUtbm9uLXZpcnR1YWwtZHRvciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTk0LCAvKiBEaWFnQXJyYXkxNTIgKi8gNDY2LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBkZXByZWNhdGVkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDE4LCAvKiBEaWFnQXJyYXkxNTMgKi8gNDY5LCAvKiBEaWFnU3ViR3JvdXAxNTMgKi8gMTM2IH0sCisgIHsgLyogZGVwcmVjYXRlZC1hdHRyaWJ1dGVzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAyOSwgLyogRGlhZ0FycmF5MTU0ICovIDQ3OCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA1MSwgLyogRGlhZ0FycmF5MTU1ICovIDQ4MCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZGVwcmVjYXRlZC1keW5hbWljLWV4Y2VwdGlvbi1zcGVjICovICAgICAgICAgICAgICAgICAgICAgMzA3NSwgLyogRGlhZ0FycmF5MTU2ICovIDQ4NywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZGVwcmVjYXRlZC1pbXBsZW1lbnRhdGlvbnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEwOSwgLyogRGlhZ0FycmF5MTU3ICovIDQ4OSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZGVwcmVjYXRlZC1pbmNyZW1lbnQtYm9vbCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEzNiwgLyogRGlhZ0FycmF5MTU4ICovIDQ5MiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZGVwcmVjYXRlZC1vYmpjLWlzYS11c2FnZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE2MiwgLyogRGlhZ0FycmF5MTU5ICovIDQ5NCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZGVwcmVjYXRlZC1vYmpjLXBvaW50ZXItaW50cm9zcGVjdGlvbiAqLyAgICAgICAgICAgICAgICAgMzE4OCwgLyogRGlhZ0FycmF5MTYwICovIDQ5NywgLyogRGlhZ1N1Ykdyb3VwMTYwICovIDE0MyB9LAorICB7IC8qIGRlcHJlY2F0ZWQtb2JqYy1wb2ludGVyLWludHJvc3BlY3Rpb24tcGVyZm9ybVNlbGVjdG9yICovIDMyMjYsIC8qIERpYWdBcnJheTE2MSAqLyA0OTksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGRlcHJlY2F0ZWQtcmVnaXN0ZXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyODAsIC8qIERpYWdBcnJheTE2MiAqLyA1MDEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGRlcHJlY2F0ZWQtd3JpdGFibGUtc3RyaW5ncyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzMDAsIC8qIEVtcHR5ICovICAgICAwLCAvKiBEaWFnU3ViR3JvdXAxNjMgKi8gMTQ1IH0sCisgIHsgLyogZGlyZWN0LWl2YXItYWNjZXNzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMyOCwgLyogRGlhZ0FycmF5MTY0ICovIDUwMywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZGlzYWJsZWQtbWFjcm8tZXhwYW5zaW9uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzM0NywgLyogRGlhZ0FycmF5MTY1ICovIDUwNSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZGlzYWJsZWQtb3B0aW1pemF0aW9uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzM3MiwgLyogRW1wdHkgKi8gICAgIDAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGRpc2NhcmQtcXVhbCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzOTQsIC8qIEVtcHR5ICovICAgICAwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBkaXN0cmlidXRlZC1vYmplY3QtbW9kaWZpZXJzICovICAgICAgICAgICAgICAgICAgICAgICAgICAzNDA3LCAvKiBEaWFnQXJyYXkxNjggKi8gNTA3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBkaXYtYnktemVybyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNDM2LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwMTY5ICovIDE0NyB9LAorICB7IC8qIGRpdmlzaW9uLWJ5LXplcm8gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0NDgsIC8qIERpYWdBcnJheTE3MCAqLyA1MTAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGRsbC1hdHRyaWJ1dGUtb24tcmVkZWNsYXJhdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgIDM0NjUsIC8qIERpYWdBcnJheTE3MSAqLyA1MTIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGRsbGV4cG9ydC1leHBsaWNpdC1pbnN0YW50aWF0aW9uLWRlY2wgKi8gICAgICAgICAgICAgICAgIDM0OTYsIC8qIERpYWdBcnJheTE3MiAqLyA1MTQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGRsbGltcG9ydC1zdGF0aWMtZmllbGQtZGVmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1MzQsIC8qIERpYWdBcnJheTE3MyAqLyA1MTYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGRvY3VtZW50YXRpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1NjEsIC8qIERpYWdBcnJheTE3NCAqLyA1MTgsIC8qIERpYWdTdWJHcm91cDE3NCAqLyAxNDkgfSwKKyAgeyAvKiBkb2N1bWVudGF0aW9uLWRlcHJlY2F0ZWQtc3luYyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAzNTc1LCAvKiBEaWFnQXJyYXkxNzUgKi8gNTM3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBkb2N1bWVudGF0aW9uLWh0bWwgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNjA1LCAvKiBEaWFnQXJyYXkxNzYgKi8gNTM5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBkb2N1bWVudGF0aW9uLXBlZGFudGljICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNjI0LCAvKiBEaWFnQXJyYXkxNzcgKi8gNTQ0LCAvKiBEaWFnU3ViR3JvdXAxNzcgKi8gMTUyIH0sCisgIHsgLyogZG9jdW1lbnRhdGlvbi11bmtub3duLWNvbW1hbmQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgMzY0NywgLyogRGlhZ0FycmF5MTc4ICovIDU0NiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZG9sbGFyLWluLWlkZW50aWZpZXItZXh0ZW5zaW9uICovICAgICAgICAgICAgICAgICAgICAgICAgMzY3NywgLyogRGlhZ0FycmF5MTc5ICovIDU0OSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZG91YmxlLXByb21vdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcwOCwgLyogRGlhZ0FycmF5MTgwICovIDU1MSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZHVwbGljYXRlLWRlY2wtc3BlY2lmaWVyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcyNSwgLyogRGlhZ0FycmF5MTgxICovIDU1MywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZHVwbGljYXRlLWVudW0gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzc1MCwgLyogRGlhZ0FycmF5MTgyICovIDU1NiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZHVwbGljYXRlLW1ldGhvZC1hcmcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzc2NSwgLyogRGlhZ0FycmF5MTgzICovIDU1OCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZHVwbGljYXRlLW1ldGhvZC1tYXRjaCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzc4NiwgLyogRGlhZ0FycmF5MTg0ICovIDU2MCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZHVwbGljYXRlLXByb3RvY29sICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgwOSwgLyogRGlhZ0FycmF5MTg1ICovIDU2MiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZHluYW1pYy1jbGFzcy1tZW1hY2Nlc3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgyOCwgLyogRGlhZ0FycmF5MTg2ICovIDU2NCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZHluYW1pYy1leGNlcHRpb24tc3BlYyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzg1MiwgLyogRGlhZ0FycmF5MTg3ICovIDU2NiwgLyogRGlhZ1N1Ykdyb3VwMTg3ICovIDE1NCB9LAorICB7IC8qIGVmZmMrKyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4NzUsIC8qIEVtcHR5ICovICAgICAwLCAvKiBEaWFnU3ViR3JvdXAxODggKi8gMTU2IH0sCisgIHsgLyogZW1iZWRkZWQtZGlyZWN0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzg4MiwgLyogRGlhZ0FycmF5MTg5ICovIDU2OCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZW1wdHktYm9keSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzkwMSwgLyogRGlhZ0FycmF5MTkwICovIDU3MCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZW1wdHktZGVjb21wb3NpdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzkxMiwgLyogRGlhZ0FycmF5MTkxICovIDU3NiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZW1wdHktdHJhbnNsYXRpb24tdW5pdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzkzMiwgLyogRGlhZ0FycmF5MTkyICovIDU3OCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZW5jb2RlLXR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzk1NSwgLyogRGlhZ0FycmF5MTkzICovIDU4MCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZW5kaWYtbGFiZWxzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzk2NywgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDE5NCAqLyAxNTggfSwKKyAgeyAvKiBlbnVtLWNvbXBhcmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOTgwLCAvKiBEaWFnQXJyYXkxOTUgKi8gNTgyLCAvKiBEaWFnU3ViR3JvdXAxOTUgKi8gMTYwIH0sCisgIHsgLyogZW51bS1jb21wYXJlLXN3aXRjaCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzk5MywgLyogRGlhZ0FycmF5MTk2ICovIDU4NCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZW51bS1jb252ZXJzaW9uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAxMywgLyogRGlhZ0FycmF5MTk3ICovIDU4NiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZW51bS10b28tbGFyZ2UgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAyOSwgLyogRGlhZ0FycmF5MTk4ICovIDU4OCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZXhjZXB0aW9ucyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA0NCwgLyogRGlhZ0FycmF5MTk5ICovIDU5MSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZXhpdC10aW1lLWRlc3RydWN0b3JzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA1NSwgLyogRGlhZ0FycmF5MjAwICovIDU5NSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZXhwYW5zaW9uLXRvLWRlZmluZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA3NywgLyogRGlhZ0FycmF5MjAxICovIDU5NywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZXhwZXJpbWVudGFsLWlzZWwgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5OCwgLyogRGlhZ0FycmF5MjAyICovIDYwMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZXhwbGljaXQtaW5pdGlhbGl6ZS1jYWxsICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDExNiwgLyogRGlhZ0FycmF5MjAzICovIDYwMywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZXhwbGljaXQtb3duZXJzaGlwLXR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDE0MSwgLyogRGlhZ0FycmF5MjA0ICovIDYwNiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZXh0ZXJuLWMtY29tcGF0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDE2NSwgLyogRGlhZ0FycmF5MjA1ICovIDYwOCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZXh0ZXJuLWluaXRpYWxpemVyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDE4MSwgLyogRGlhZ0FycmF5MjA2ICovIDYxMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZXh0cmEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDIwMCwgLyogRGlhZ0FycmF5MjA3ICovIDYxMiwgLyogRGlhZ1N1Ykdyb3VwMjA3ICovIDE2MiB9LAorICB7IC8qIGV4dHJhLXF1YWxpZmljYXRpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyMDYsIC8qIERpYWdBcnJheTIwOCAqLyA2MTQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGV4dHJhLXNlbWkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyMjYsIC8qIERpYWdBcnJheTIwOSAqLyA2MTYsIC8qIERpYWdTdWJHcm91cDIwOSAqLyAxNzEgfSwKKyAgeyAvKiBleHRyYS10b2tlbnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MjM3LCAvKiBEaWFnQXJyYXkyMTAgKi8gNjE5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBmYWxsYmFjayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MjUwLCAvKiBEaWFnQXJyYXkyMTEgKi8gNjIyLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBmbGFnLWVudW0gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MjU5LCAvKiBEaWFnQXJyYXkyMTIgKi8gNjI0LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBmbGV4aWJsZS1hcnJheS1leHRlbnNpb25zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MjY5LCAvKiBEaWFnQXJyYXkyMTMgKi8gNjI2LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBmbG9hdC1jb252ZXJzaW9uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mjk1LCAvKiBEaWFnQXJyYXkyMTQgKi8gNjI5LCAvKiBEaWFnU3ViR3JvdXAyMTQgKi8gMTc0IH0sCisgIHsgLyogZmxvYXQtZXF1YWwgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMxMiwgLyogRGlhZ0FycmF5MjE1ICovIDYzMSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZmxvYXQtb3ZlcmZsb3ctY29udmVyc2lvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMyNCwgLyogRGlhZ0FycmF5MjE2ICovIDYzMywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZmxvYXQtemVyby1jb252ZXJzaW9uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM1MCwgLyogRGlhZ0FycmF5MjE3ICovIDYzNSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZm9yLWxvb3AtYW5hbHlzaXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM3MiwgLyogRGlhZ0FycmF5MjE4ICovIDYzNywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogZm9ybWF0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM5MCwgLyogRGlhZ0FycmF5MjE5ICovIDY0MCwgLyogRGlhZ1N1Ykdyb3VwMjE5ICovIDE3NyB9LAorICB7IC8qIGZvcm1hdC1leHRyYS1hcmdzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTcsIC8qIERpYWdBcnJheTIyMCAqLyA2NjYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGZvcm1hdC1pbnZhbGlkLXNwZWNpZmllciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTUsIC8qIERpYWdBcnJheTIyMSAqLyA2NjgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGZvcm1hdC1ub24taXNvICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0NDAsIC8qIERpYWdBcnJheTIyMiAqLyA2NzAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGZvcm1hdC1ub25saXRlcmFsICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0NTUsIC8qIERpYWdBcnJheTIyMyAqLyA2NzQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGZvcm1hdC1wZWRhbnRpYyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0NzMsIC8qIERpYWdBcnJheTIyNCAqLyA2NzYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGZvcm1hdC1zZWN1cml0eSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0ODksIC8qIERpYWdBcnJheTIyNSAqLyA2NzgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGZvcm1hdC15MmsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1MDUsIC8qIEVtcHR5ICovICAgICAwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBmb3JtYXQtemVyby1sZW5ndGggKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NTE2LCAvKiBEaWFnQXJyYXkyMjcgKi8gNjgwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBmb3JtYXQ9MiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NTM1LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwMjI4ICovIDE4NCB9LAorICB7IC8qIGZvdXItY2hhci1jb25zdGFudHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1NDQsIC8qIERpYWdBcnJheTIyOSAqLyA2ODIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGZyYW1lLWxhcmdlci10aGFuPSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1NjQsIC8qIERpYWdBcnJheTIzMCAqLyA2ODQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGZ1bmN0aW9uLWRlZi1pbi1vYmpjLWNvbnRhaW5lciAqLyAgICAgICAgICAgICAgICAgICAgICAgIDQ1ODMsIC8qIERpYWdBcnJheTIzMSAqLyA2ODcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGZ1dHVyZS1jb21wYXQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2MTQsIC8qIEVtcHR5ICovICAgICAwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBnY2MtY29tcGF0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NjI4LCAvKiBEaWFnQXJyYXkyMzMgKi8gNjg5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBnbG9iYWwtY29uc3RydWN0b3JzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NjM5LCAvKiBEaWFnQXJyYXkyMzQgKi8gNjk4LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBnbnUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NjU5LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwMjM1ICovIDE4OCB9LAorICB7IC8qIGdudS1hbGlnbm9mLWV4cHJlc3Npb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2NjMsIC8qIERpYWdBcnJheTIzNiAqLyA3MDEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1hbm9ueW1vdXMtc3RydWN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2ODYsIC8qIERpYWdBcnJheTIzNyAqLyA3MDMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1hcnJheS1tZW1iZXItcGFyZW4taW5pdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3MDcsIC8qIERpYWdBcnJheTIzOCAqLyA3MDUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1hdXRvLXR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3MzUsIC8qIERpYWdBcnJheTIzOSAqLyA3MDcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1iaW5hcnktbGl0ZXJhbCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3NDksIC8qIERpYWdBcnJheTI0MCAqLyA3MDksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1jYXNlLXJhbmdlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3NjgsIC8qIERpYWdBcnJheTI0MSAqLyA3MTEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1jb21wbGV4LWludGVnZXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3ODMsIC8qIERpYWdBcnJheTI0MiAqLyA3MTMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1jb21wb3VuZC1saXRlcmFsLWluaXRpYWxpemVyICovICAgICAgICAgICAgICAgICAgICAgIDQ4MDMsIC8qIERpYWdBcnJheTI0MyAqLyA3MTUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1jb25kaXRpb25hbC1vbWl0dGVkLW9wZXJhbmQgKi8gICAgICAgICAgICAgICAgICAgICAgIDQ4MzYsIC8qIERpYWdBcnJheTI0NCAqLyA3MTcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1kZXNpZ25hdG9yICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4NjgsIC8qIERpYWdBcnJheTI0NSAqLyA3MTksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1lbXB0eS1pbml0aWFsaXplciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4ODMsIC8qIERpYWdBcnJheTI0NiAqLyA3MjMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1lbXB0eS1zdHJ1Y3QgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ5MDUsIC8qIERpYWdBcnJheTI0NyAqLyA3MjUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1mbGV4aWJsZS1hcnJheS1pbml0aWFsaXplciAqLyAgICAgICAgICAgICAgICAgICAgICAgIDQ5MjIsIC8qIERpYWdBcnJheTI0OCAqLyA3MjksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1mbGV4aWJsZS1hcnJheS11bmlvbi1tZW1iZXIgKi8gICAgICAgICAgICAgICAgICAgICAgIDQ5NTMsIC8qIERpYWdBcnJheTI0OSAqLyA3MzEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1mb2xkaW5nLWNvbnN0YW50ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ5ODUsIC8qIERpYWdBcnJheTI1MCAqLyA3MzMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1pbWFnaW5hcnktY29uc3RhbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMDYsIC8qIERpYWdBcnJheTI1MSAqLyA3MzcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1pbmNsdWRlLW5leHQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMjksIC8qIERpYWdBcnJheTI1MiAqLyA3MzksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1sYWJlbC1hcy12YWx1ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwNDYsIC8qIERpYWdBcnJheTI1MyAqLyA3NDEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1yZWRlY2xhcmVkLWVudW0gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwNjUsIC8qIERpYWdBcnJheTI1NCAqLyA3NDQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1zdGF0ZW1lbnQtZXhwcmVzc2lvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwODUsIC8qIERpYWdBcnJheTI1NSAqLyA3NDYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1zdGF0aWMtZmxvYXQtaW5pdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMTAsIC8qIERpYWdBcnJheTI1NiAqLyA3NDgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS1zdHJpbmctbGl0ZXJhbC1vcGVyYXRvci10ZW1wbGF0ZSAqLyAgICAgICAgICAgICAgICAgIDUxMzIsIC8qIERpYWdBcnJheTI1NyAqLyA3NTAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS11bmlvbi1jYXN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNjksIC8qIERpYWdBcnJheTI1OCAqLyA3NTIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS12YXJpYWJsZS1zaXplZC10eXBlLW5vdC1hdC1lbmQgKi8gICAgICAgICAgICAgICAgICAgIDUxODQsIC8qIERpYWdBcnJheTI1OSAqLyA3NTQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS16ZXJvLWxpbmUtZGlyZWN0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyMTksIC8qIERpYWdBcnJheTI2MCAqLyA3NTYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGdudS16ZXJvLXZhcmlhZGljLW1hY3JvLWFyZ3VtZW50cyAqLyAgICAgICAgICAgICAgICAgICAgIDUyNDMsIC8qIERpYWdBcnJheTI2MSAqLyA3NTgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGhlYWRlci1ndWFyZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyNzcsIC8qIERpYWdBcnJheTI2MiAqLyA3NjEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGhlYWRlci1oeWdpZW5lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyOTAsIC8qIERpYWdBcnJheTI2MyAqLyA3NjMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGlkaW9tYXRpYy1wYXJlbnRoZXNlcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzMDUsIC8qIERpYWdBcnJheTI2NCAqLyA3NjUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGlnbm9yZWQtYXR0cmlidXRlcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzMjcsIC8qIERpYWdBcnJheTI2NSAqLyA3NjcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGlnbm9yZWQtb3B0aW1pemF0aW9uLWFyZ3VtZW50ICovICAgICAgICAgICAgICAgICAgICAgICAgIDUzNDYsIC8qIERpYWdBcnJheTI2NiAqLyA4MjQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGlnbm9yZWQtcHJhZ21hLWludHJpbnNpYyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNzYsIC8qIERpYWdBcnJheTI2NyAqLyA4MjcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGlnbm9yZWQtcHJhZ21hLW9wdGltaXplICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0MDEsIC8qIERpYWdBcnJheTI2OCAqLyA4MjksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGlnbm9yZWQtcHJhZ21hcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0MjUsIC8qIERpYWdBcnJheTI2OSAqLyA4MzEsIC8qIERpYWdTdWJHcm91cDI2OSAqLyAyMTcgfSwKKyAgeyAvKiBpZ25vcmVkLXF1YWxpZmllcnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDQxLCAvKiBEaWFnQXJyYXkyNzAgKi8gODc0LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBpbXBsaWNpdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDYwLCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwMjcxICovIDIyMCB9LAorICB7IC8qIGltcGxpY2l0LWF0b21pYy1wcm9wZXJ0aWVzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0NjksIC8qIERpYWdBcnJheTI3MiAqLyA4ODAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGltcGxpY2l0LWNvbnZlcnNpb24tZmxvYXRpbmctcG9pbnQtdG8tYm9vbCAqLyAgICAgICAgICAgIDU0OTYsIC8qIERpYWdBcnJheTI3MyAqLyA4ODMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGltcGxpY2l0LWV4Y2VwdGlvbi1zcGVjLW1pc21hdGNoICovICAgICAgICAgICAgICAgICAgICAgIDU1MzksIC8qIERpYWdBcnJheTI3NCAqLyA4ODUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGltcGxpY2l0LWZhbGx0aHJvdWdoICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1NzIsIC8qIERpYWdBcnJheTI3NSAqLyA4ODcsIC8qIERpYWdTdWJHcm91cDI3NSAqLyAyMjMgfSwKKyAgeyAvKiBpbXBsaWNpdC1mYWxsdGhyb3VnaC1wZXItZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICA1NTkzLCAvKiBEaWFnQXJyYXkyNzYgKi8gODkwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBpbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICA1NjI3LCAvKiBEaWFnQXJyYXkyNzcgKi8gODkyLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBpbXBsaWNpdC1pbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjU3LCAvKiBEaWFnQXJyYXkyNzggKi8gODk3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBpbXBsaWNpdC1yZXRhaW4tc2VsZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjcwLCAvKiBEaWFnQXJyYXkyNzkgKi8gODk5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBpbXBsaWNpdGx5LXVuc2lnbmVkLWxpdGVyYWwgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICA1NjkxLCAvKiBEaWFnQXJyYXkyODAgKi8gOTAxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBpbXBvcnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzE5LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW1wb3J0LXByZXByb2Nlc3Nvci1kaXJlY3RpdmUtcGVkYW50aWMgKi8gICAgICAgICAgICAgICAgNTcyNiwgLyogRGlhZ0FycmF5MjgyICovIDkwMywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW5hY2Nlc3NpYmxlLWJhc2UgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc2NSwgLyogRGlhZ0FycmF5MjgzICovIDkwNSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW5jbHVkZS1uZXh0LWFic29sdXRlLXBhdGggKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc4MywgLyogRGlhZ0FycmF5Mjg0ICovIDkwNywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW5jbHVkZS1uZXh0LW91dHNpZGUtaGVhZGVyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgxMCwgLyogRGlhZ0FycmF5Mjg1ICovIDkwOSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW5jb21wYXRpYmxlLWV4Y2VwdGlvbi1zcGVjICovICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgzOCwgLyogRGlhZ0FycmF5Mjg2ICovIDkxMSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW5jb21wYXRpYmxlLWZ1bmN0aW9uLXBvaW50ZXItdHlwZXMgKi8gICAgICAgICAgICAgICAgICAgNTg2NiwgLyogRGlhZ0FycmF5Mjg3ICovIDkxNCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW5jb21wYXRpYmxlLWxpYnJhcnktcmVkZWNsYXJhdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgNTkwMiwgLyogRGlhZ0FycmF5Mjg4ICovIDkxNiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW5jb21wYXRpYmxlLW1zLXN0cnVjdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTkzNywgLyogRGlhZ0FycmF5Mjg5ICovIDkxOCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW5jb21wYXRpYmxlLXBvaW50ZXItdHlwZXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTk2MCwgLyogRGlhZ0FycmF5MjkwICovIDkyMSwgLyogRGlhZ1N1Ykdyb3VwMjkwICovIDIyNSB9LAorICB7IC8qIGluY29tcGF0aWJsZS1wb2ludGVyLXR5cGVzLWRpc2NhcmRzLXF1YWxpZmllcnMgKi8gICAgICAgIDU5ODcsIC8qIERpYWdBcnJheTI5MSAqLyA5MjMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGluY29tcGF0aWJsZS1wcm9wZXJ0eS10eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwMzQsIC8qIERpYWdBcnJheTI5MiAqLyA5MjYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGluY29tcGF0aWJsZS1zeXNyb290ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwNjEsIC8qIERpYWdBcnJheTI5MyAqLyA5MjgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGluY29tcGxldGUtaW1wbGVtZW50YXRpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwODIsIC8qIERpYWdBcnJheTI5NCAqLyA5MzAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGluY29tcGxldGUtbW9kdWxlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYxMDgsIC8qIEVtcHR5ICovICAgICAwLCAvKiBEaWFnU3ViR3JvdXAyOTUgKi8gMjI4IH0sCisgIHsgLyogaW5jb21wbGV0ZS11bWJyZWxsYSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjEyNiwgLyogRGlhZ0FycmF5Mjk2ICovIDkzMiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW5jb25zaXN0ZW50LWRsbGltcG9ydCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjE0NiwgLyogRGlhZ0FycmF5Mjk3ICovIDkzNiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW5jb25zaXN0ZW50LW1pc3NpbmctZGVzdHJ1Y3Rvci1vdmVycmlkZSAqLyAgICAgICAgICAgICAgNjE2OSwgLyogRGlhZ0FycmF5Mjk4ICovIDkzOSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW5jb25zaXN0ZW50LW1pc3Npbmctb3ZlcnJpZGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgNjIxMCwgLyogRGlhZ0FycmF5Mjk5ICovIDk0MSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW5jcmVtZW50LWJvb2wgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjI0MCwgLyogRGlhZ0FycmF5MzAwICovIDk0MywgLyogRGlhZ1N1Ykdyb3VwMzAwICovIDIzMSB9LAorICB7IC8qIGluZmluaXRlLXJlY3Vyc2lvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYyNTUsIC8qIERpYWdBcnJheTMwMSAqLyA5NDUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGluaXQtc2VsZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYyNzQsIC8qIEVtcHR5ICovICAgICAwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBpbml0aWFsaXplci1vdmVycmlkZXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2Mjg0LCAvKiBEaWFnQXJyYXkzMDMgKi8gOTQ3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBpbmplY3RlZC1jbGFzcy1uYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MzA2LCAvKiBEaWFnQXJyYXkzMDQgKi8gOTUwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBpbmxpbmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MzI2LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW5saW5lLWFzbSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjMzMywgLyogRGlhZ0FycmF5MzA2ICovIDk1MiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW5saW5lLW5ldy1kZWxldGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjM0NCwgLyogRGlhZ0FycmF5MzA3ICovIDk1NCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW5zdGFudGlhdGlvbi1hZnRlci1zcGVjaWFsaXphdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgNjM2MiwgLyogRGlhZ0FycmF5MzA4ICovIDk1NiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW50LWNvbnZlcnNpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjM5NywgLyogRGlhZ0FycmF5MzA5ICovIDk1OCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW50LWNvbnZlcnNpb25zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQxMiwgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDMxMCAqLyAyMzMgfSwKKyAgeyAvKiBpbnQtdG8tcG9pbnRlci1jYXN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NDI4LCAvKiBEaWFnQXJyYXkzMTEgKi8gOTYxLCAvKiBEaWFnU3ViR3JvdXAzMTEgKi8gMjM1IH0sCisgIHsgLyogaW50LXRvLXZvaWQtcG9pbnRlci1jYXN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQ0OCwgLyogRGlhZ0FycmF5MzEyICovIDk2MywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW50ZWdlci1vdmVyZmxvdyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQ3MywgLyogRGlhZ0FycmF5MzEzICovIDk2NSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogaW52YWxpZC1jb21tYW5kLWxpbmUtYXJndW1lbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgNjQ5MCwgLyogRGlhZ0FycmF5MzE0ICovIDk2NywgLyogRGlhZ1N1Ykdyb3VwMzE0ICovIDIzNyB9LAorICB7IC8qIGludmFsaWQtY29uc3RleHByICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1MjAsIC8qIERpYWdBcnJheTMxNSAqLyA5NzAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGludmFsaWQtaWJvdXRsZXQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1MzgsIC8qIERpYWdBcnJheTMxNiAqLyA5NzIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGludmFsaWQtaW5pdGlhbGl6ZXItZnJvbS1zeXN0ZW0taGVhZGVyICovICAgICAgICAgICAgICAgIDY1NTUsIC8qIERpYWdBcnJheTMxNyAqLyA5NzUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGludmFsaWQtaW9zLWRlcGxveW1lbnQtdGFyZ2V0ICovICAgICAgICAgICAgICAgICAgICAgICAgIDY1OTQsIC8qIERpYWdBcnJheTMxOCAqLyA5NzcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGludmFsaWQtbm9yZXR1cm4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY2MjQsIC8qIERpYWdBcnJheTMxOSAqLyA5NzksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGludmFsaWQtb2Zmc2V0b2YgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY2NDEsIC8qIERpYWdBcnJheTMyMCAqLyA5ODIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGludmFsaWQtb3Itbm9uZXhpc3RlbnQtZGlyZWN0b3J5ICovICAgICAgICAgICAgICAgICAgICAgIDY2NTgsIC8qIERpYWdBcnJheTMyMSAqLyA5ODUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGludmFsaWQtcGFydGlhbC1zcGVjaWFsaXphdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgIDY2OTEsIC8qIERpYWdBcnJheTMyMiAqLyA5ODgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGludmFsaWQtcGNoICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY3MjIsIC8qIEVtcHR5ICovICAgICAwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBpbnZhbGlkLXBwLXRva2VuICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NzM0LCAvKiBEaWFnQXJyYXkzMjQgKi8gOTkwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBpbnZhbGlkLXNvdXJjZS1lbmNvZGluZyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NzUxLCAvKiBEaWFnQXJyYXkzMjUgKi8gOTkzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBpbnZhbGlkLXRva2VuLXBhc3RlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2Nzc1LCAvKiBEaWFnQXJyYXkzMjYgKi8gOTk2LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBqdW1wLXNlaC1maW5hbGx5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2Nzk1LCAvKiBEaWFnQXJyYXkzMjcgKi8gOTk4LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBrZXl3b3JkLWNvbXBhdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ODEyLCAvKiBEaWFnQXJyYXkzMjggKi8gMTAwMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyoga2V5d29yZC1tYWNybyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjgyNywgLyogRGlhZ0FycmF5MzI5ICovIDEwMDIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGtuci1wcm9tb3RlZC1wYXJhbWV0ZXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY4NDEsIC8qIERpYWdBcnJheTMzMCAqLyAxMDA0LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBsYW5ndWFnZS1leHRlbnNpb24tdG9rZW4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ODY0LCAvKiBEaWFnQXJyYXkzMzEgKi8gMTAwNiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbGFyZ2UtYnktdmFsdWUtY29weSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjg4OSwgLyogRGlhZ0FycmF5MzMyICovIDEwMDgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGxpYmx0byAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY5MDksIC8qIEVtcHR5ICovICAgICAwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBsaXRlcmFsLWNvbnZlcnNpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2OTE2LCAvKiBEaWFnQXJyYXkzMzQgKi8gMTAxMSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbGl0ZXJhbC1yYW5nZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjkzNSwgLyogRGlhZ0FycmF5MzM1ICovIDEwMTMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGxvY2FsLXR5cGUtdGVtcGxhdGUtYXJncyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY5NDksIC8qIERpYWdBcnJheTMzNiAqLyAxMDE2LCAvKiBEaWFnU3ViR3JvdXAzMzYgKi8gMjM5IH0sCisgIHsgLyogbG9naWNhbC1ub3QtcGFyZW50aGVzZXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjk3NCwgLyogRGlhZ0FycmF5MzM3ICovIDEwMTgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIGxvZ2ljYWwtb3AtcGFyZW50aGVzZXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY5OTgsIC8qIERpYWdBcnJheTMzOCAqLyAxMDIwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBsb25nLWxvbmcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDIxLCAvKiBEaWFnQXJyYXkzMzkgKi8gMTAyMiwgLyogRGlhZ1N1Ykdyb3VwMzM5ICovIDI0MSB9LAorICB7IC8qIGxvb3AtYW5hbHlzaXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwMzEsIC8qIEVtcHR5ICovICAgICAwLCAvKiBEaWFnU3ViR3JvdXAzNDAgKi8gMjQzIH0sCisgIHsgLyogbWFjcm8tcmVkZWZpbmVkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzA0NSwgLyogRGlhZ0FycmF5MzQxICovIDEwMjQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1haW4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwNjEsIC8qIERpYWdBcnJheTM0MiAqLyAxMDI2LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtYWluLXJldHVybi10eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDY2LCAvKiBEaWFnQXJyYXkzNDMgKi8gMTAzNCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbWFsZm9ybWVkLXdhcm5pbmctY2hlY2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzA4MywgLyogRGlhZ0FycmF5MzQ0ICovIDEwMzYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1hbnktYnJhY2VzLWFyb3VuZC1zY2FsYXItaW5pdCAqLyAgICAgICAgICAgICAgICAgICAgICAgIDcxMDcsIC8qIERpYWdBcnJheTM0NSAqLyAxMDM4LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtYXgtdW5zaWduZWQtemVybyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTM4LCAvKiBEaWFnQXJyYXkzNDYgKi8gMTA0MCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbWVtc2l6ZS1jb21wYXJpc29uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE1NiwgLyogRGlhZ0FycmF5MzQ3ICovIDEwNDIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1ldGhvZC1zaWduYXR1cmVzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxNzUsIC8qIERpYWdBcnJheTM0OCAqLyAxMDQ0LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtaWNyb3NvZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTkzLCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwMzQ5ICovIDI0NiB9LAorICB7IC8qIG1pY3Jvc29mdC1hbm9uLXRhZyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMDMsIC8qIERpYWdBcnJheTM1MCAqLyAxMDQ3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtaWNyb3NvZnQtY2FzdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjIyLCAvKiBEaWFnQXJyYXkzNTEgKi8gMTA1MCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbWljcm9zb2Z0LWNoYXJpemUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIzNywgLyogRGlhZ0FycmF5MzUyICovIDEwNTMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1pY3Jvc29mdC1jb21tZW50LXBhc3RlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNTUsIC8qIERpYWdBcnJheTM1MyAqLyAxMDU1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtaWNyb3NvZnQtY29uc3QtaW5pdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3Mjc5LCAvKiBEaWFnQXJyYXkzNTQgKi8gMTA1NywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbWljcm9zb2Z0LWNwcC1tYWNybyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzMwMCwgLyogRGlhZ0FycmF5MzU1ICovIDEwNTksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1pY3Jvc29mdC1kZWZhdWx0LWFyZy1yZWRlZmluaXRpb24gKi8gICAgICAgICAgICAgICAgICAgIDczMjAsIC8qIERpYWdBcnJheTM1NiAqLyAxMDYxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtaWNyb3NvZnQtZW5kLW9mLWZpbGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzU1LCAvKiBEaWFnQXJyYXkzNTcgKi8gMTA2MywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbWljcm9zb2Z0LWVudW0tZm9yd2FyZC1yZWZlcmVuY2UgKi8gICAgICAgICAgICAgICAgICAgICAgNzM3NywgLyogRGlhZ0FycmF5MzU4ICovIDEwNjUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1pY3Jvc29mdC1lbnVtLXZhbHVlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc0MTAsIC8qIERpYWdBcnJheTM1OSAqLyAxMDY3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtaWNyb3NvZnQtZXhjZXB0aW9uLXNwZWMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NDMxLCAvKiBEaWFnQXJyYXkzNjAgKi8gMTA2OSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbWljcm9zb2Z0LWV4aXN0cyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzQ1NiwgLyogRGlhZ0FycmF5MzYxICovIDEwNzYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1pY3Jvc29mdC1leHBsaWNpdC1jb25zdHJ1Y3Rvci1jYWxsICovICAgICAgICAgICAgICAgICAgIDc0NzMsIC8qIERpYWdBcnJheTM2MiAqLyAxMDc4LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtaWNyb3NvZnQtZXh0cmEtcXVhbGlmaWNhdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICA3NTA5LCAvKiBEaWFnQXJyYXkzNjMgKi8gMTA4MCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbWljcm9zb2Z0LWZpeGVkLWVudW0gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzUzOSwgLyogRGlhZ0FycmF5MzY0ICovIDEwODIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1pY3Jvc29mdC1mbGV4aWJsZS1hcnJheSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc1NjAsIC8qIERpYWdBcnJheTM2NSAqLyAxMDg0LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtaWNyb3NvZnQtZ290byAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NTg1LCAvKiBEaWFnQXJyYXkzNjYgKi8gMTA4NywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbWljcm9zb2Z0LWluYWNjZXNzaWJsZS1iYXNlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgNzYwMCwgLyogRGlhZ0FycmF5MzY3ICovIDEwODksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1pY3Jvc29mdC1pbmNsdWRlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc2MjgsIC8qIERpYWdBcnJheTM2OCAqLyAxMDkxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtaWNyb3NvZnQtbXV0YWJsZS1yZWZlcmVuY2UgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICA3NjQ2LCAvKiBEaWFnQXJyYXkzNjkgKi8gMTA5MywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbWljcm9zb2Z0LXB1cmUtZGVmaW5pdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzY3NCwgLyogRGlhZ0FycmF5MzcwICovIDEwOTUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1pY3Jvc29mdC1yZWRlY2xhcmUtc3RhdGljICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc3MDAsIC8qIERpYWdBcnJheTM3MSAqLyAxMDk3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtaWNyb3NvZnQtc2VhbGVkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NzI3LCAvKiBEaWFnQXJyYXkzNzIgKi8gMTA5OSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbWljcm9zb2Z0LXRlbXBsYXRlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzc0NCwgLyogRGlhZ0FycmF5MzczICovIDExMDEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1pY3Jvc29mdC11bmlvbi1tZW1iZXItcmVmZXJlbmNlICovICAgICAgICAgICAgICAgICAgICAgIDc3NjMsIC8qIERpYWdBcnJheTM3NCAqLyAxMTA5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtaWNyb3NvZnQtdW5xdWFsaWZpZWQtZnJpZW5kICovICAgICAgICAgICAgICAgICAgICAgICAgICA3Nzk2LCAvKiBEaWFnQXJyYXkzNzUgKi8gMTExMSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbWljcm9zb2Z0LXVzaW5nLWRlY2wgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzgyNSwgLyogRGlhZ0FycmF5Mzc2ICovIDExMTMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1pY3Jvc29mdC12b2lkLXBzZXVkby1kdG9yICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc4NDYsIC8qIERpYWdBcnJheTM3NyAqLyAxMTE1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtaXNtYXRjaGVkLW5ldy1kZWxldGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3ODczLCAvKiBEaWFnQXJyYXkzNzggKi8gMTExNywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbWlzbWF0Y2hlZC1wYXJhbWV0ZXItdHlwZXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgNzg5NSwgLyogRGlhZ0FycmF5Mzc5ICovIDExMTksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1pc21hdGNoZWQtcmV0dXJuLXR5cGVzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc5MjIsIC8qIERpYWdBcnJheTM4MCAqLyAxMTIxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtaXNtYXRjaGVkLXRhZ3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OTQ2LCAvKiBEaWFnQXJyYXkzODEgKi8gMTEyMywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbWlzc2luZy1icmFjZXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzk2MiwgLyogRGlhZ0FycmF5MzgyICovIDExMjYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1pc3NpbmctZGVjbGFyYXRpb25zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc5NzcsIC8qIERpYWdBcnJheTM4MyAqLyAxMTI4LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtaXNzaW5nLWV4Y2VwdGlvbi1zcGVjICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OTk4LCAvKiBEaWFnQXJyYXkzODQgKi8gMTEzMywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgODAyMSwgLyogRGlhZ0FycmF5Mzg1ICovIDExMzUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1pc3NpbmctZm9ybWF0LWF0dHJpYnV0ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwNDgsIC8qIEVtcHR5ICovICAgICAwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtaXNzaW5nLWluY2x1ZGUtZGlycyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDczLCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbWlzc2luZy1tZXRob2QtcmV0dXJuLXR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgODA5NCwgLyogRGlhZ0FycmF5Mzg4ICovIDExMzcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1pc3Npbmctbm9lc2NhcGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgxMjEsIC8qIERpYWdBcnJheTM4OSAqLyAxMTM5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtaXNzaW5nLW5vcmV0dXJuICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MTM4LCAvKiBEaWFnQXJyYXkzOTAgKi8gMTE0MSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbWlzc2luZy1wcm90b3R5cGUtZm9yLWNjICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODE1NSwgLyogRGlhZ0FycmF5MzkxICovIDExNDQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1pc3NpbmctcHJvdG90eXBlcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgxODAsIC8qIERpYWdBcnJheTM5MiAqLyAxMTQ2LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtaXNzaW5nLXNlbGVjdG9yLW5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MTk5LCAvKiBEaWFnQXJyYXkzOTMgKi8gMTE0OCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbWlzc2luZy1zeXNyb290ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODIyMSwgLyogRGlhZ0FycmF5Mzk0ICovIDExNTAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1pc3NpbmctdmFyaWFibGUtZGVjbGFyYXRpb25zICovICAgICAgICAgICAgICAgICAgICAgICAgIDgyMzcsIC8qIERpYWdBcnJheTM5NSAqLyAxMTUyLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtb2R1bGUtYnVpbGQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MjY3LCAvKiBEaWFnQXJyYXkzOTYgKi8gMTE1NCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbW9kdWxlLWNvbmZsaWN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODI4MCwgLyogRGlhZ0FycmF5Mzk3ICovIDExNTksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1vZHVsZS1maWxlLWNvbmZpZy1taXNtYXRjaCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIDgyOTYsIC8qIERpYWdBcnJheTM5OCAqLyAxMTYyLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtb2R1bGUtZmlsZS1leHRlbnNpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MzI0LCAvKiBEaWFnQXJyYXkzOTkgKi8gMTE2NCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbW9kdWxlLWltcG9ydC1pbi1leHRlcm4tYyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODM0NiwgLyogRGlhZ0FycmF5NDAwICovIDExNjYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG1vZHVsZXMtYW1iaWd1b3VzLWludGVybmFsLWxpbmthZ2UgKi8gICAgICAgICAgICAgICAgICAgIDgzNzIsIC8qIERpYWdBcnJheTQwMSAqLyAxMTY4LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtb2R1bGVzLWltcG9ydC1uZXN0ZWQtcmVkdW5kYW50ICovICAgICAgICAgICAgICAgICAgICAgICA4NDA3LCAvKiBEaWFnQXJyYXk0MDIgKi8gMTE3MCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbW9zdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODQzOSwgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDQwMyAqLyAyNzQgfSwKKyAgeyAvKiBtb3ZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NDQ0LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwNDA0ICovIDMwNiB9LAorICB7IC8qIG1zdmMtaW5jbHVkZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg0NDksIC8qIEVtcHR5ICovICAgICAwLCAvKiBEaWFnU3ViR3JvdXA0MDUgKi8gMzEwIH0sCisgIHsgLyogbXN2Yy1ub3QtZm91bmQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODQ2MiwgLyogRGlhZ0FycmF5NDA2ICovIDExNzIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG11bHRpY2hhciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg0NzcsIC8qIERpYWdBcnJheTQwNyAqLyAxMTc0LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBtdWx0aXBsZS1tb3ZlLXZiYXNlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NDg3LCAvKiBEaWFnQXJyYXk0MDggKi8gMTE3NiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbmFycm93aW5nICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODUwNywgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDQwOSAqLyAzMTIgfSwKKyAgeyAvKiBuZXN0ZWQtYW5vbi10eXBlcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NTE3LCAvKiBEaWFnQXJyYXk0MTAgKi8gMTE3OCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbmVzdGVkLWV4dGVybnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODUzNSwgLyogRW1wdHkgKi8gICAgIDAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG5ldy1yZXR1cm5zLW51bGwgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg1NTAsIC8qIERpYWdBcnJheTQxMiAqLyAxMTgwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBuZXdsaW5lLWVvZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NTY3LCAvKiBEaWFnQXJyYXk0MTMgKi8gMTE4MiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbm9leGNlcHQtdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODU3OSwgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDQxNCAqLyAzMTQgfSwKKyAgeyAvKiBub24tZ2NjICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NTkzLCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwNDE1ICovIDMxNiB9LAorICB7IC8qIG5vbi1saXRlcmFsLW51bGwtY29udmVyc2lvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIDg2MDEsIC8qIERpYWdBcnJheTQxNiAqLyAxMTg1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBub24tbW9kdWxhci1pbmNsdWRlLWluLWZyYW1ld29yay1tb2R1bGUgKi8gICAgICAgICAgICAgICA4NjI5LCAvKiBEaWFnQXJyYXk0MTcgKi8gMTE4NywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbm9uLW1vZHVsYXItaW5jbHVkZS1pbi1tb2R1bGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgODY2OSwgLyogRGlhZ0FycmF5NDE4ICovIDExODksIC8qIERpYWdTdWJHcm91cDQxOCAqLyAzMjAgfSwKKyAgeyAvKiBub24tcG9kLXZhcmFyZ3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4Njk5LCAvKiBEaWFnQXJyYXk0MTkgKi8gMTE5MSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbm9uLXZpcnR1YWwtZHRvciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODcxNSwgLyogRGlhZ0FycmF5NDIwICovIDExOTYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG5vbm51bGwgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3MzIsIC8qIERpYWdBcnJheTQyMSAqLyAxMTk4LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBub25wb3J0YWJsZS1jZnN0cmluZ3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzQwLCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbm9ucG9ydGFibGUtaW5jbHVkZS1wYXRoICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc2MiwgLyogRGlhZ0FycmF5NDIzICovIDEyMDEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG5vbnBvcnRhYmxlLXN5c3RlbS1pbmNsdWRlLXBhdGggKi8gICAgICAgICAgICAgICAgICAgICAgIDg3ODcsIC8qIERpYWdBcnJheTQyNCAqLyAxMjAzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBub25wb3J0YWJsZS12ZWN0b3ItaW5pdGlhbGl6YXRpb24gKi8gICAgICAgICAgICAgICAgICAgICA4ODE5LCAvKiBEaWFnQXJyYXk0MjUgKi8gMTIwNSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbnNjb25zdW1lZC1taXNtYXRjaCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODg1MywgLyogRGlhZ0FycmF5NDI2ICovIDEyMDcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG5zcmV0dXJucy1taXNtYXRjaCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4NzMsIC8qIERpYWdBcnJheTQyNyAqLyAxMjA5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBudWxsLWFyaXRobWV0aWMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ODkyLCAvKiBEaWFnQXJyYXk0MjggKi8gMTIxMSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbnVsbC1jaGFyYWN0ZXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODkwOCwgLyogRGlhZ0FycmF5NDI5ICovIDEyMTQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG51bGwtY29udmVyc2lvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg5MjMsIC8qIERpYWdBcnJheTQzMCAqLyAxMjE3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBudWxsLWRlcmVmZXJlbmNlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OTM5LCAvKiBEaWFnQXJyYXk0MzEgKi8gMTIxOSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbnVsbC1wb2ludGVyLWFyaXRobWV0aWMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODk1NiwgLyogRGlhZ0FycmF5NDMyICovIDEyMjIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG51bGxhYmlsaXR5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg5ODAsIC8qIERpYWdBcnJheTQzMyAqLyAxMjI1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBudWxsYWJpbGl0eS1jb21wbGV0ZW5lc3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OTkyLCAvKiBEaWFnQXJyYXk0MzQgKi8gMTIzMSwgLyogRGlhZ1N1Ykdyb3VwNDM0ICovIDMyMiB9LAorICB7IC8qIG51bGxhYmlsaXR5LWNvbXBsZXRlbmVzcy1vbi1hcnJheXMgKi8gICAgICAgICAgICAgICAgICAgIDkwMTcsIC8qIERpYWdBcnJheTQzNSAqLyAxMjMzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBudWxsYWJpbGl0eS1kZWNsc3BlYyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDUyLCAvKiBEaWFnQXJyYXk0MzYgKi8gMTIzNSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogbnVsbGFiaWxpdHktZXh0ZW5zaW9uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTA3MywgLyogRGlhZ0FycmF5NDM3ICovIDEyMzcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG51bGxhYmlsaXR5LWluZmVycmVkLW9uLW5lc3RlZC10eXBlICovICAgICAgICAgICAgICAgICAgIDkwOTUsIC8qIERpYWdBcnJheTQzOCAqLyAxMjM5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBudWxsYWJsZS10by1ub25udWxsLWNvbnZlcnNpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICA5MTMxLCAvKiBEaWFnQXJyYXk0MzkgKi8gMTI0MSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogb2JqYy1hdXRvc3ludGhlc2lzLXByb3BlcnR5LWl2YXItbmFtZS1tYXRjaCAqLyAgICAgICAgICAgOTE2MiwgLyogRGlhZ0FycmF5NDQwICovIDEyNDMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG9iamMtY2lyY3VsYXItY29udGFpbmVyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkyMDYsIC8qIERpYWdBcnJheTQ0MSAqLyAxMjQ1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBvYmpjLWNvY29hLWFwaSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MjMwLCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwNDQyICovIDMyNCB9LAorICB7IC8qIG9iamMtZGVzaWduYXRlZC1pbml0aWFsaXplcnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIDkyNDUsIC8qIERpYWdBcnJheTQ0MyAqLyAxMjQ3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBvYmpjLWZsZXhpYmxlLWFycmF5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5Mjc0LCAvKiBEaWFnQXJyYXk0NDQgKi8gMTI1NCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogb2JqYy1mb3J3YXJkLWNsYXNzLXJlZGVmaW5pdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgOTI5NCwgLyogRGlhZ0FycmF5NDQ1ICovIDEyNTcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG9iamMtaW50ZXJmYWNlLWl2YXJzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkzMjYsIC8qIERpYWdBcnJheTQ0NiAqLyAxMjU5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBvYmpjLWxpdGVyYWwtY29tcGFyZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MzQ3LCAvKiBEaWFnQXJyYXk0NDcgKi8gMTI2MSwgLyogRGlhZ1N1Ykdyb3VwNDQ3ICovIDMyNiB9LAorICB7IC8qIG9iamMtbGl0ZXJhbC1jb252ZXJzaW9uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkzNjgsIC8qIERpYWdBcnJheTQ0OCAqLyAxMjYzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBvYmpjLW1hY3JvLXJlZGVmaW5pdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MzkyLCAvKiBEaWFnQXJyYXk0NDkgKi8gMTI2NiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogb2JqYy1tZXNzYWdpbmctaWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTQxNiwgLyogRGlhZ0FycmF5NDUwICovIDEyNjgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG9iamMtbWV0aG9kLWFjY2VzcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk0MzQsIC8qIERpYWdBcnJheTQ1MSAqLyAxMjcwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBvYmpjLW1pc3NpbmctcHJvcGVydHktc3ludGhlc2lzICovICAgICAgICAgICAgICAgICAgICAgICA5NDUzLCAvKiBEaWFnQXJyYXk0NTIgKi8gMTI3NywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogb2JqYy1taXNzaW5nLXN1cGVyLWNhbGxzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTQ4NSwgLyogRGlhZ0FycmF5NDUzICovIDEyNzksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG9iamMtbXVsdGlwbGUtbWV0aG9kLW5hbWVzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk1MTAsIC8qIERpYWdBcnJheTQ1NCAqLyAxMjgxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBvYmpjLW5vbmNvcHktcmV0YWluLWJsb2NrLXByb3BlcnR5ICovICAgICAgICAgICAgICAgICAgICA5NTM3LCAvKiBEaWFnQXJyYXk0NTUgKi8gMTI4MywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogb2JqYy1ub251bmlmaWVkLWV4Y2VwdGlvbnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgOTU3MiwgLyogRGlhZ0FycmF5NDU2ICovIDEyODUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG9iamMtcHJvcGVydHktaW1wbGVtZW50YXRpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgIDk1OTksIC8qIERpYWdBcnJheTQ1NyAqLyAxMjg3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBvYmpjLXByb3BlcnR5LWltcGxpY2l0LW1pc21hdGNoICovICAgICAgICAgICAgICAgICAgICAgICA5NjI4LCAvKiBEaWFnQXJyYXk0NTggKi8gMTI5MiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogb2JqYy1wcm9wZXJ0eS1tYXRjaGVzLWNvY29hLW93bmVyc2hpcC1ydWxlICovICAgICAgICAgICAgOTY2MCwgLyogRGlhZ0FycmF5NDU5ICovIDEyOTQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG9iamMtcHJvcGVydHktbm8tYXR0cmlidXRlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk3MDMsIC8qIERpYWdBcnJheTQ2MCAqLyAxMjk2LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBvYmpjLXByb3BlcnR5LXN5bnRoZXNpcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NzMwLCAvKiBEaWFnQXJyYXk0NjEgKi8gMTI5OSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogb2JqYy1wcm90b2NvbC1tZXRob2QtaW1wbGVtZW50YXRpb24gKi8gICAgICAgICAgICAgICAgICAgOTc1NCwgLyogRGlhZ0FycmF5NDYyICovIDEzMDMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG9iamMtcHJvdG9jb2wtcHJvcGVydHktc3ludGhlc2lzICovICAgICAgICAgICAgICAgICAgICAgIDk3OTAsIC8qIERpYWdBcnJheTQ2MyAqLyAxMzA1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBvYmpjLXByb3RvY29sLXF1YWxpZmllcnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5ODIzLCAvKiBEaWFnQXJyYXk0NjQgKi8gMTMwNywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogb2JqYy1yZWFkb25seS13aXRoLXNldHRlci1wcm9wZXJ0eSAqLyAgICAgICAgICAgICAgICAgICAgOTg0OCwgLyogRGlhZ0FycmF5NDY1ICovIDEzMDksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG9iamMtcmVkdW5kYW50LWFwaS11c2UgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk4ODMsIC8qIEVtcHR5ICovICAgICAwLCAvKiBEaWFnU3ViR3JvdXA0NjYgKi8gMzI4IH0sCisgIHsgLyogb2JqYy1yZWR1bmRhbnQtbGl0ZXJhbC11c2UgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgOTkwNiwgLyogRGlhZ0FycmF5NDY3ICovIDEzMTEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG9iamMtcm9vdC1jbGFzcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5MzMsIC8qIERpYWdBcnJheTQ2OCAqLyAxMzEzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBvYmpjLXN0cmluZy1jb21wYXJlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5OTQ5LCAvKiBEaWFnQXJyYXk0NjkgKi8gMTMxNSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogb2JqYy1zdHJpbmctY29uY2F0ZW5hdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTk2OSwgLyogRGlhZ0FycmF5NDcwICovIDEzMTcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG9iamMtdW5zYWZlLXBlcmZvcm0tc2VsZWN0b3IgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIDk5OTUsIC8qIERpYWdBcnJheTQ3MSAqLyAxMzE5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBvZHIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAyNCwgLyogRGlhZ0FycmF5NDcyICovIDEzMjEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG9sZC1zdHlsZS1jYXN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDI4LCAvKiBEaWFnQXJyYXk0NzMgKi8gMTMyMywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogb2xkLXN0eWxlLWRlZmluaXRpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwNDMsIC8qIEVtcHR5ICovICAgICAwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBvcGVuY2wtdW5zdXBwb3J0ZWQtcmdiYSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDA2NCwgLyogRGlhZ0FycmF5NDc1ICovIDEzMjUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG9wZW5tcC1jbGF1c2VzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDg4LCAvKiBEaWFnQXJyYXk0NzYgKi8gMTMyNywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogb3Blbm1wLWxvb3AtZm9ybSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxMDMsIC8qIERpYWdBcnJheTQ3NyAqLyAxMzMwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBvcGVubXAtdGFyZ2V0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDEyMCwgLyogRGlhZ0FycmF5NDc4ICovIDEzMzMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG9wdGlvbi1pZ25vcmVkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTM0LCAvKiBEaWFnQXJyYXk0NzkgKi8gMTMzOCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogb3V0LW9mLWxpbmUtZGVjbGFyYXRpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxNDksIC8qIERpYWdBcnJheTQ4MCAqLyAxMzQzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBvdXQtb2Ytc2NvcGUtZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDE3MywgLyogRGlhZ0FycmF5NDgxICovIDEzNDUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG92ZXItYWxpZ25lZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTk1LCAvKiBEaWFnQXJyYXk0ODIgKi8gMTM0NywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogb3ZlcmZsb3cgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyMDgsIC8qIEVtcHR5ICovICAgICAwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBvdmVybGVuZ3RoLXN0cmluZ3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDIxNywgLyogRGlhZ0FycmF5NDg0ICovIDEzNDksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG92ZXJsb2FkZWQtc2hpZnQtb3AtcGFyZW50aGVzZXMgKi8gICAgICAgICAgICAgICAgICAgICAgIDEwMjM2LCAvKiBEaWFnQXJyYXk0ODUgKi8gMTM1MSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogb3ZlcmxvYWRlZC12aXJ0dWFsICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNjgsIC8qIERpYWdBcnJheTQ4NiAqLyAxMzUzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBvdmVycmlkZS1tb2R1bGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI4NywgLyogRGlhZ0FycmF5NDg3ICovIDEzNTUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIG92ZXJyaWRpbmctbWV0aG9kLW1pc21hdGNoICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMzAzLCAvKiBEaWFnQXJyYXk0ODggKi8gMTM1NywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogb3ZlcnJpZGluZy10LW9wdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAzMzAsIC8qIERpYWdBcnJheTQ4OSAqLyAxMzY1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBwYWNrZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDM1MCwgLyogRGlhZ0FycmF5NDkwICovIDEzNjcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHBhZGRlZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMzU3LCAvKiBEaWFnQXJyYXk0OTEgKi8gMTM2OSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogcGFyZW50aGVzZXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAzNjQsIC8qIERpYWdBcnJheTQ5MiAqLyAxMzczLCAvKiBEaWFnU3ViR3JvdXA0OTIgKi8gMzMwIH0sCisgIHsgLyogcGFyZW50aGVzZXMtZXF1YWxpdHkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAzNzYsIC8qIERpYWdBcnJheTQ5MyAqLyAxMzc3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBwYXJ0aWFsLWF2YWlsYWJpbGl0eSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDM5NywgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDQ5NCAqLyAzMzggfSwKKyAgeyAvKiBwYXNzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQxOCwgLyogRGlhZ0FycmF5NDk1ICovIDEzNzksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHBhc3MtYW5hbHlzaXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDIzLCAvKiBEaWFnQXJyYXk0OTYgKi8gMTM4MSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogcGFzcy1mYWlsZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0MzcsIC8qIERpYWdBcnJheTQ5NyAqLyAxMzg1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBwYXNzLW1pc3NlZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ0OSwgLyogRGlhZ0FycmF5NDk4ICovIDEzODcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHBjaC1kYXRlLXRpbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDYxLCAvKiBEaWFnQXJyYXk0OTkgKi8gMTM4OSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogcGVkYW50aWMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0NzUsIC8qIERpYWdBcnJheTUwMCAqLyAxMzkxLCAvKiBEaWFnU3ViR3JvdXA1MDAgKi8gMzQwIH0sCisgIHsgLyogcGVkYW50aWMtY29yZS1mZWF0dXJlcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0ODQsIC8qIERpYWdBcnJheTUwMSAqLyAxNDYwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBwZXNzaW1pemluZy1tb3ZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDUwNywgLyogRGlhZ0FycmF5NTAyICovIDE0NjIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHBvaW50ZXItYXJpdGggKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNTI0LCAvKiBEaWFnQXJyYXk1MDMgKi8gMTQ2NSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogcG9pbnRlci1ib29sLWNvbnZlcnNpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA1MzgsIC8qIERpYWdBcnJheTUwNCAqLyAxNDcyLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBwb2ludGVyLXNpZ24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDU2MiwgLyogRGlhZ0FycmF5NTA1ICovIDE0NzUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHBvaW50ZXItdG8taW50LWNhc3QgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNTc1LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogcG9pbnRlci10eXBlLW1pc21hdGNoICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA1OTUsIC8qIERpYWdBcnJheTUwNyAqLyAxNDc3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBwb3RlbnRpYWxseS1ldmFsdWF0ZWQtZXhwcmVzc2lvbiAqLyAgICAgICAgICAgICAgICAgICAgICAxMDYxNywgLyogRGlhZ0FycmF5NTA4ICovIDE0NzksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHByYWdtYS1jbGFuZy1hdHRyaWJ1dGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNjUwLCAvKiBEaWFnQXJyYXk1MDkgKi8gMTQ4MSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogcHJhZ21hLW9uY2Utb3V0c2lkZS1oZWFkZXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA2NzMsIC8qIERpYWdBcnJheTUxMCAqLyAxNDgzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBwcmFnbWEtcGFjayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDcwMCwgLyogRGlhZ0FycmF5NTExICovIDE0ODUsIC8qIERpYWdTdWJHcm91cDUxMSAqLyAzOTIgfSwKKyAgeyAvKiBwcmFnbWEtcGFjay1zdXNwaWNpb3VzLWluY2x1ZGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAxMDcxMiwgLyogRGlhZ0FycmF5NTEyICovIDE0ODgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHByYWdtYS1zeXN0ZW0taGVhZGVyLW91dHNpZGUtaGVhZGVyICovICAgICAgICAgICAgICAgICAgIDEwNzQzLCAvKiBEaWFnQXJyYXk1MTMgKi8gMTQ5MCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogcHJhZ21hcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA3NzksIC8qIERpYWdBcnJheTUxNCAqLyAxNDkyLCAvKiBEaWFnU3ViR3JvdXA1MTQgKi8gMzk0IH0sCisgIHsgLyogcHJlZGVmaW5lZC1pZGVudGlmaWVyLW91dHNpZGUtZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgMTA3ODcsIC8qIERpYWdBcnJheTUxNSAqLyAxNDk0LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBwcml2YXRlLWV4dGVybiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDgyNiwgLyogRGlhZ0FycmF5NTE2ICovIDE0OTYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHByaXZhdGUtaGVhZGVyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwODQxLCAvKiBEaWFnQXJyYXk1MTcgKi8gMTQ5OCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogcHJpdmF0ZS1tb2R1bGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA4NTYsIC8qIERpYWdBcnJheTUxOCAqLyAxNTAwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBwcm9maWxlLWluc3RyLW1pc3NpbmcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDg3MSwgLyogRGlhZ0FycmF5NTE5ICovIDE1MDUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHByb2ZpbGUtaW5zdHItb3V0LW9mLWRhdGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwODkzLCAvKiBEaWFnQXJyYXk1MjAgKi8gMTUwNywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogcHJvZmlsZS1pbnN0ci11bnByb2ZpbGVkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA5MTksIC8qIERpYWdBcnJheTUyMSAqLyAxNTA5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBwcm9wZXJ0eS1hY2Nlc3MtZG90LXN5bnRheCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDk0NCwgLyogRGlhZ0FycmF5NTIyICovIDE1MTEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHByb3BlcnR5LWF0dHJpYnV0ZS1taXNtYXRjaCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwOTcxLCAvKiBEaWFnQXJyYXk1MjMgKi8gMTUxMywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogcHJvdG9jb2wgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA5OTksIC8qIERpYWdBcnJheTUyNCAqLyAxNTE4LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBwcm90b2NvbC1wcm9wZXJ0eS1zeW50aGVzaXMtYW1iaWd1aXR5ICovICAgICAgICAgICAgICAgICAxMTAwOCwgLyogRGlhZ0FycmF5NTI1ICovIDE1MjAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHF1YWxpZmllZC12b2lkLXJldHVybi10eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDQ2LCAvKiBEaWFnQXJyYXk1MjYgKi8gMTUyMiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogcmFuZ2UtbG9vcC1hbmFseXNpcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwNzMsIC8qIERpYWdBcnJheTUyNyAqLyAxNTI0LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiByZWFkb25seS1pYm91dGxldC1wcm9wZXJ0eSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTA5MywgLyogRGlhZ0FycmF5NTI4ICovIDE1MjgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHJlY2VpdmVyLWV4cHIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMTIwLCAvKiBEaWFnQXJyYXk1MjkgKi8gMTUzMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogcmVjZWl2ZXItZm9yd2FyZC1jbGFzcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTExMzQsIC8qIERpYWdBcnJheTUzMCAqLyAxNTMyLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiByZWRlY2xhcmVkLWNsYXNzLW1lbWJlciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTE1NywgLyogRGlhZ0FycmF5NTMxICovIDE1MzUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHJlZHVuZGFudC1kZWNscyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMTgxLCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogcmVkdW5kYW50LW1vdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTExOTcsIC8qIERpYWdBcnJheTUzMyAqLyAxNTM3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiByZWR1bmRhbnQtcGFyZW5zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTIxMiwgLyogRGlhZ0FycmF5NTM0ICovIDE1MzksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHJlZ2lzdGVyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMjI5LCAvKiBEaWFnQXJyYXk1MzUgKi8gMTU0MSwgLyogRGlhZ1N1Ykdyb3VwNTM1ICovIDM5OSB9LAorICB7IC8qIHJlaW50ZXJwcmV0LWJhc2UtY2xhc3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMjM4LCAvKiBEaWFnQXJyYXk1MzYgKi8gMTU0MywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogcmVtYXJrLWJhY2tlbmQtcGx1Z2luICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEyNjEsIC8qIERpYWdBcnJheTUzNyAqLyAxNTQ1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiByZW9yZGVyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTI4MywgLyogRGlhZ0FycmF5NTM4ICovIDE1NDcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHJlcXVpcmVzLXN1cGVyLWF0dHJpYnV0ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMjkxLCAvKiBEaWFnQXJyYXk1MzkgKi8gMTU0OSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogcmVzZXJ2ZWQtaWQtbWFjcm8gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEzMTYsIC8qIERpYWdBcnJheTU0MCAqLyAxNTUxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiByZXNlcnZlZC11c2VyLWRlZmluZWQtbGl0ZXJhbCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAxMTMzNCwgLyogRGlhZ0FycmF5NTQxICovIDE1NTMsIC8qIERpYWdTdWJHcm91cDU0MSAqLyA0MDEgfSwKKyAgeyAvKiByZXRhaW5lZC1sYW5ndWFnZS1saW5rYWdlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTM2NCwgLyogRGlhZ0FycmF5NTQyICovIDE1NTYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHJldHVybi1zdGFjay1hZGRyZXNzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMzkwLCAvKiBEaWFnQXJyYXk1NDMgKi8gMTU1OCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogcmV0dXJuLXR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE0MTEsIC8qIERpYWdBcnJheTU0NCAqLyAxNTYyLCAvKiBEaWFnU3ViR3JvdXA1NDQgKi8gNDAzIH0sCisgIHsgLyogcmV0dXJuLXR5cGUtYy1saW5rYWdlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE0MjMsIC8qIERpYWdBcnJheTU0NSAqLyAxNTcyLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBydHRpLWZvci1leGNlcHRpb25zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTQ0NSwgLyogRGlhZ0FycmF5NTQ2ICovIDE1NzUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHNhbml0aXplLWFkZHJlc3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNDY1LCAvKiBEaWFnQXJyYXk1NDcgKi8gMTU3NywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc2VjdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE0ODIsIC8qIERpYWdBcnJheTU0OCAqLyAxNTgwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzZWxlY3RvciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTQ5MCwgLyogRGlhZ0FycmF5NTQ5ICovIDE1ODMsIC8qIERpYWdTdWJHcm91cDU0OSAqLyA0MDUgfSwKKyAgeyAvKiBzZWxlY3Rvci10eXBlLW1pc21hdGNoICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTQ5OSwgLyogRGlhZ0FycmF5NTUwICovIDE1ODUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHNlbGYtYXNzaWduICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNTIyLCAvKiBEaWFnQXJyYXk1NTEgKi8gMTU4NywgLyogRGlhZ1N1Ykdyb3VwNTUxICovIDQwNyB9LAorICB7IC8qIHNlbGYtYXNzaWduLWZpZWxkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNTM0LCAvKiBEaWFnQXJyYXk1NTIgKi8gMTU4OSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc2VsZi1tb3ZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE1NTIsIC8qIERpYWdBcnJheTU1MyAqLyAxNTkxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzZW1pY29sb24tYmVmb3JlLW1ldGhvZC1ib2R5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAxMTU2MiwgLyogRGlhZ0FycmF5NTU0ICovIDE1OTMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHNlbnRpbmVsICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNTkxLCAvKiBEaWFnQXJyYXk1NTUgKi8gMTU5NSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc2VxdWVuY2UtcG9pbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE2MDAsIC8qIEVtcHR5ICovICAgICAwLCAvKiBEaWFnU3ViR3JvdXA1NTYgKi8gNDA5IH0sCisgIHsgLyogc2VyaWFsaXplZC1kaWFnbm9zdGljcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE2MTUsIC8qIERpYWdBcnJheTU1NyAqLyAxNTk4LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzaGFkb3cgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTYzOCwgLyogRGlhZ0FycmF5NTU4ICovIDE2MDEsIC8qIERpYWdTdWJHcm91cDU1OCAqLyA0MTEgfSwKKyAgeyAvKiBzaGFkb3ctYWxsICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTY0NSwgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDU1OSAqLyA0MTQgfSwKKyAgeyAvKiBzaGFkb3ctZmllbGQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTY1NiwgLyogRGlhZ0FycmF5NTYwICovIDE2MDMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHNoYWRvdy1maWVsZC1pbi1jb25zdHJ1Y3RvciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNjY5LCAvKiBEaWFnQXJyYXk1NjEgKi8gMTYwNSwgLyogRGlhZ1N1Ykdyb3VwNTYxICovIDQxOSB9LAorICB7IC8qIHNoYWRvdy1maWVsZC1pbi1jb25zdHJ1Y3Rvci1tb2RpZmllZCAqLyAgICAgICAgICAgICAgICAgIDExNjk3LCAvKiBEaWFnQXJyYXk1NjIgKi8gMTYwNywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc2hhZG93LWl2YXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE3MzQsIC8qIERpYWdBcnJheTU2MyAqLyAxNjA5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzaGFkb3ctdW5jYXB0dXJlZC1sb2NhbCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTc0NiwgLyogRGlhZ0FycmF5NTY0ICovIDE2MTEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHNoaWZ0LWNvdW50LW5lZ2F0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNzcwLCAvKiBEaWFnQXJyYXk1NjUgKi8gMTYxMywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc2hpZnQtY291bnQtb3ZlcmZsb3cgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE3OTEsIC8qIERpYWdBcnJheTU2NiAqLyAxNjE1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzaGlmdC1uZWdhdGl2ZS12YWx1ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTgxMiwgLyogRGlhZ0FycmF5NTY3ICovIDE2MTcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHNoaWZ0LW9wLXBhcmVudGhlc2VzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExODMzLCAvKiBEaWFnQXJyYXk1NjggKi8gMTYxOSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc2hpZnQtb3ZlcmZsb3cgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE4NTQsIC8qIERpYWdBcnJheTU2OSAqLyAxNjIxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzaGlmdC1zaWduLW92ZXJmbG93ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTg2OSwgLyogRGlhZ0FycmF5NTcwICovIDE2MjMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHNob3J0ZW4tNjQtdG8tMzIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExODg5LCAvKiBEaWFnQXJyYXk1NzEgKi8gMTYyNSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc2lnbi1jb21wYXJlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE5MDYsIC8qIERpYWdBcnJheTU3MiAqLyAxNjI3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzaWduLWNvbnZlcnNpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTkxOSwgLyogRGlhZ0FycmF5NTczICovIDE2MjksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHNpZ24tcHJvbW8gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOTM1LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc2lnbmVkLWVudW0tYml0ZmllbGQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE5NDYsIC8qIERpYWdBcnJheTU3NSAqLyAxNjMyLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzaXplb2YtYXJyYXktYXJndW1lbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTk2NywgLyogRGlhZ0FycmF5NTc2ICovIDE2MzQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHNpemVvZi1hcnJheS1kZWNheSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOTg5LCAvKiBEaWFnQXJyYXk1NzcgKi8gMTYzNiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc2l6ZW9mLXBvaW50ZXItbWVtYWNjZXNzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDgsIC8qIERpYWdBcnJheTU3OCAqLyAxNjM4LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzbGFzaC11LWZpbGVuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAzMywgLyogRGlhZ0FycmF5NTc5ICovIDE2NDEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHNvbWV0aW1lcy11bmluaXRpYWxpemVkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDUwLCAvKiBEaWFnQXJyYXk1ODAgKi8gMTY0MywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc291cmNlLXVzZXMtb3Blbm1wICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwNzQsIC8qIERpYWdBcnJheTU4MSAqLyAxNjQ1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzcGlyLWNvbXBhdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjA5MywgLyogRGlhZ0FycmF5NTgyICovIDE2NDgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHN0YWNrLXByb3RlY3RvciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTA1LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc3RhdGljLWZsb2F0LWluaXQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMjEsIC8qIERpYWdBcnJheTU4NCAqLyAxNjUwLCAvKiBEaWFnU3ViR3JvdXA1ODQgKi8gNDIxIH0sCisgIHsgLyogc3RhdGljLWluLWlubGluZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMzksIC8qIERpYWdBcnJheTU4NSAqLyAxNjUyLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzdGF0aWMtaW5saW5lLWV4cGxpY2l0LWluc3RhbnRpYXRpb24gKi8gICAgICAgICAgICAgICAgICAxMjE1NiwgLyogRGlhZ0FycmF5NTg2ICovIDE2NTUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHN0YXRpYy1sb2NhbC1pbi1pbmxpbmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTkzLCAvKiBEaWFnQXJyYXk1ODcgKi8gMTY1NywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc3RhdGljLXNlbGYtaW5pdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIyMTYsIC8qIERpYWdBcnJheTU4OCAqLyAxNjU5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzdHJpY3QtYWxpYXNpbmcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjIzMywgLyogRW1wdHkgKi8gICAgIDAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHN0cmljdC1hbGlhc2luZz0wICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMjQ5LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc3RyaWN0LWFsaWFzaW5nPTEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIyNjcsIC8qIEVtcHR5ICovICAgICAwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzdHJpY3QtYWxpYXNpbmc9MiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjI4NSwgLyogRW1wdHkgKi8gICAgIDAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHN0cmljdC1vdmVyZmxvdyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMzAzLCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc3RyaWN0LW92ZXJmbG93PTAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIzMTksIC8qIEVtcHR5ICovICAgICAwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzdHJpY3Qtb3ZlcmZsb3c9MSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjMzNywgLyogRW1wdHkgKi8gICAgIDAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHN0cmljdC1vdmVyZmxvdz0yICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMzU1LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc3RyaWN0LW92ZXJmbG93PTMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIzNzMsIC8qIEVtcHR5ICovICAgICAwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzdHJpY3Qtb3ZlcmZsb3c9NCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjM5MSwgLyogRW1wdHkgKi8gICAgIDAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHN0cmljdC1vdmVyZmxvdz01ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNDA5LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc3RyaWN0LXByb3RvdHlwZXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI0MjcsIC8qIERpYWdBcnJheTYwMCAqLyAxNjYxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzdHJpY3Qtc2VsZWN0b3ItbWF0Y2ggKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjQ0NSwgLyogRGlhZ0FycmF5NjAxICovIDE2NjMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHN0cmluZy1jb21wYXJlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNDY3LCAvKiBEaWFnQXJyYXk2MDIgKi8gMTY2NSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc3RyaW5nLWNvbnZlcnNpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI0ODIsIC8qIERpYWdBcnJheTYwMyAqLyAxNjY3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzdHJpbmctcGx1cy1jaGFyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjUwMCwgLyogRGlhZ0FycmF5NjA0ICovIDE2NjksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHN0cmluZy1wbHVzLWludCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNTE3LCAvKiBEaWFnQXJyYXk2MDUgKi8gMTY3MSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc3RybGNweS1zdHJsY2F0LXNpemUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI1MzMsIC8qIERpYWdBcnJheTYwNiAqLyAxNjczLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzdHJuY2F0LXNpemUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjU1NCwgLyogRGlhZ0FycmF5NjA3ICovIDE2NzUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHN1cGVyLWNsYXNzLW1ldGhvZC1taXNtYXRjaCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNTY3LCAvKiBEaWFnQXJyYXk2MDggKi8gMTY3OSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc3dpdGNoICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI1OTUsIC8qIERpYWdBcnJheTYwOSAqLyAxNjgxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzd2l0Y2gtYm9vbCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjYwMiwgLyogRGlhZ0FycmF5NjEwICovIDE2ODUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHN3aXRjaC1kZWZhdWx0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNjE0LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogc3dpdGNoLWVudW0gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI2MjksIC8qIERpYWdBcnJheTYxMiAqLyAxNjg3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiBzeW5jLWZldGNoLWFuZC1uYW5kLXNlbWFudGljcy1jaGFuZ2VkICovICAgICAgICAgICAgICAgICAxMjY0MSwgLyogRGlhZ0FycmF5NjEzICovIDE2ODksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHN5bnRoICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNjc5LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdGF1dG9sb2dpY2FsLWNvbXBhcmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI2ODUsIC8qIERpYWdBcnJheTYxNSAqLyAxNjkxLCAvKiBEaWFnU3ViR3JvdXA2MTUgKi8gNDIzIH0sCisgIHsgLyogdGF1dG9sb2dpY2FsLWNvbnN0YW50LWNvbXBhcmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgMTI3MDYsIC8qIERpYWdBcnJheTYxNiAqLyAxNjk0LCAvKiBEaWFnU3ViR3JvdXA2MTYgKi8gNDI4IH0sCisgIHsgLyogdGF1dG9sb2dpY2FsLWNvbnN0YW50LWluLXJhbmdlLWNvbXBhcmUgKi8gICAgICAgICAgICAgICAgMTI3MzYsIC8qIEVtcHR5ICovICAgICAwLCAvKiBEaWFnU3ViR3JvdXA2MTcgKi8gNDMwIH0sCisgIHsgLyogdGF1dG9sb2dpY2FsLWNvbnN0YW50LW91dC1vZi1yYW5nZS1jb21wYXJlICovICAgICAgICAgICAgMTI3NzUsIC8qIERpYWdBcnJheTYxOCAqLyAxNjk2LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB0YXV0b2xvZ2ljYWwtb3ZlcmxhcC1jb21wYXJlICovICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgxOCwgLyogRGlhZ0FycmF5NjE5ICovIDE2OTgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHRhdXRvbG9naWNhbC1wb2ludGVyLWNvbXBhcmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIDEyODQ3LCAvKiBEaWFnQXJyYXk2MjAgKi8gMTcwMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdGF1dG9sb2dpY2FsLXR5cGUtbGltaXQtY29tcGFyZSAqLyAgICAgICAgICAgICAgICAgICAgICAgMTI4NzYsIC8qIERpYWdBcnJheTYyMSAqLyAxNzAzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB0YXV0b2xvZ2ljYWwtdW5kZWZpbmVkLWNvbXBhcmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAxMjkwOCwgLyogRGlhZ0FycmF5NjIyICovIDE3MDUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHRhdXRvbG9naWNhbC11bnNpZ25lZC1lbnVtLXplcm8tY29tcGFyZSAqLyAgICAgICAgICAgICAgIDEyOTM5LCAvKiBEaWFnQXJyYXk2MjMgKi8gMTcwOCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdGF1dG9sb2dpY2FsLXVuc2lnbmVkLXplcm8tY29tcGFyZSAqLyAgICAgICAgICAgICAgICAgICAgMTI5NzksIC8qIERpYWdBcnJheTYyNCAqLyAxNzEwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB0ZW50YXRpdmUtZGVmaW5pdGlvbi1pbmNvbXBsZXRlLXR5cGUgKi8gICAgICAgICAgICAgICAgICAxMzAxNCwgLyogRGlhZ0FycmF5NjI1ICovIDE3MTIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHRocmVhZC1zYWZldHkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMDUxLCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwNjI2ICovIDQzNCB9LAorICB7IC8qIHRocmVhZC1zYWZldHktYW5hbHlzaXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMDY1LCAvKiBEaWFnQXJyYXk2MjcgKi8gMTcxNCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdGhyZWFkLXNhZmV0eS1hdHRyaWJ1dGVzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMwODgsIC8qIERpYWdBcnJheTYyOCAqLyAxNzMyLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB0aHJlYWQtc2FmZXR5LWJldGEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzExMywgLyogRGlhZ0FycmF5NjI5ICovIDE3MzgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHRocmVhZC1zYWZldHktbmVnYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMTMyLCAvKiBEaWFnQXJyYXk2MzAgKi8gMTc0MCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdGhyZWFkLXNhZmV0eS1wcmVjaXNlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMxNTUsIC8qIERpYWdBcnJheTYzMSAqLyAxNzQyLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB0aHJlYWQtc2FmZXR5LXJlZmVyZW5jZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzE3NywgLyogRGlhZ0FycmF5NjMyICovIDE3NDYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHRocmVhZC1zYWZldHktdmVyYm9zZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMjAxLCAvKiBEaWFnQXJyYXk2MzMgKi8gMTc0OSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdHJpZ3JhcGhzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMyMjMsIC8qIERpYWdBcnJheTYzNCAqLyAxNzUxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB0eXBlLWxpbWl0cyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzIzMywgLyogRW1wdHkgKi8gICAgIDAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHR5cGUtc2FmZXR5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMjQ1LCAvKiBEaWFnQXJyYXk2MzYgKi8gMTc1NiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdHlwZWRlZi1yZWRlZmluaXRpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMyNTcsIC8qIERpYWdBcnJheTYzNyAqLyAxNzYwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB0eXBlbmFtZS1taXNzaW5nICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzI3OCwgLyogRGlhZ0FycmF5NjM4ICovIDE3NjIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVuYWJsZS10by1vcGVuLXN0YXRzLWZpbGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMjk1LCAvKiBEaWFnQXJyYXk2MzkgKi8gMTc2NCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdW5hdmFpbGFibGUtZGVjbGFyYXRpb25zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMzMjEsIC8qIERpYWdBcnJheTY0MCAqLyAxNzY2LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1bmRlY2xhcmVkLXNlbGVjdG9yICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzM0NiwgLyogRGlhZ0FycmF5NjQxICovIDE3NjgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVuZGVmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMzY2LCAvKiBEaWFnQXJyYXk2NDIgKi8gMTc3MSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdW5kZWZpbmVkLWJvb2wtY29udmVyc2lvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMzNzIsIC8qIERpYWdBcnJheTY0MyAqLyAxNzczLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1bmRlZmluZWQtZnVuYy10ZW1wbGF0ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzM5OCwgLyogRGlhZ0FycmF5NjQ0ICovIDE3NzYsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVuZGVmaW5lZC1pbmxpbmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNDIyLCAvKiBEaWFnQXJyYXk2NDUgKi8gMTc3OCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdW5kZWZpbmVkLWludGVybmFsICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM0MzksIC8qIERpYWdBcnJheTY0NiAqLyAxNzgwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1bmRlZmluZWQtaW50ZXJuYWwtdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzQ1OCwgLyogRGlhZ0FycmF5NjQ3ICovIDE3ODIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVuZGVmaW5lZC1yZWludGVycHJldC1jYXN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNDgyLCAvKiBEaWFnQXJyYXk2NDggKi8gMTc4NCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdW5kZWZpbmVkLXZhci10ZW1wbGF0ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM1MDksIC8qIERpYWdBcnJheTY0OSAqLyAxNzg3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1bmV2YWx1YXRlZC1leHByZXNzaW9uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzUzMiwgLyogRGlhZ0FycmF5NjUwICovIDE3ODksIC8qIERpYWdTdWJHcm91cDY1MCAqLyA0MzkgfSwKKyAgeyAvKiB1bmd1YXJkZWQtYXZhaWxhYmlsaXR5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzU1NSwgLyogRGlhZ0FycmF5NjUxICovIDE3OTEsIC8qIERpYWdTdWJHcm91cDY1MSAqLyA0NDEgfSwKKyAgeyAvKiB1bmd1YXJkZWQtYXZhaWxhYmlsaXR5LW5ldyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzU3OCwgLyogRGlhZ0FycmF5NjUyICovIDE3OTMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVuaWNvZGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNjA1LCAvKiBEaWFnQXJyYXk2NTMgKi8gMTc5NSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdW5pY29kZS1ob21vZ2x5cGggKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM2MTMsIC8qIERpYWdBcnJheTY1NCAqLyAxODAxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1bmljb2RlLXdoaXRlc3BhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzYzMSwgLyogRGlhZ0FycmF5NjU1ICovIDE4MDMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVuaW5pdGlhbGl6ZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNjUwLCAvKiBEaWFnQXJyYXk2NTYgKi8gMTgwNSwgLyogRGlhZ1N1Ykdyb3VwNjU2ICovIDQ0MyB9LAorICB7IC8qIHVua25vd24tYXJndW1lbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNjY0LCAvKiBEaWFnQXJyYXk2NTcgKi8gMTgxMywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdW5rbm93bi1hdHRyaWJ1dGVzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM2ODEsIC8qIERpYWdBcnJheTY1OCAqLyAxODE2LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1bmtub3duLWVzY2FwZS1zZXF1ZW5jZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzcwMCwgLyogRGlhZ0FycmF5NjU5ICovIDE4MTgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVua25vd24tcHJhZ21hcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNzI0LCAvKiBEaWFnQXJyYXk2NjAgKi8gMTgyMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdW5rbm93bi1zYW5pdGl6ZXJzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM3NDAsIC8qIERpYWdBcnJheTY2MSAqLyAxODM4LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1bmtub3duLXdhcm5pbmctb3B0aW9uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzc1OSwgLyogRGlhZ0FycmF5NjYyICovIDE4NDAsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVubmFtZWQtdHlwZS10ZW1wbGF0ZS1hcmdzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNzgyLCAvKiBEaWFnQXJyYXk2NjMgKi8gMTg0NCwgLyogRGlhZ1N1Ykdyb3VwNjYzICovIDQ0NiB9LAorICB7IC8qIHVubmVlZGVkLWludGVybmFsLWRlY2xhcmF0aW9uICovICAgICAgICAgICAgICAgICAgICAgICAgIDEzODA5LCAvKiBEaWFnQXJyYXk2NjQgKi8gMTg0NiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdW5uZWVkZWQtbWVtYmVyLWZ1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM4MzksIC8qIERpYWdBcnJheTY2NSAqLyAxODQ5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1bnJlYWNoYWJsZS1jb2RlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzg2NCwgLyogRGlhZ0FycmF5NjY2ICovIDE4NTEsIC8qIERpYWdTdWJHcm91cDY2NiAqLyA0NDggfSwKKyAgeyAvKiB1bnJlYWNoYWJsZS1jb2RlLWFnZ3Jlc3NpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAxMzg4MSwgLyogRW1wdHkgKi8gICAgIDAsIC8qIERpYWdTdWJHcm91cDY2NyAqLyA0NTAgfSwKKyAgeyAvKiB1bnJlYWNoYWJsZS1jb2RlLWJyZWFrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzkwOSwgLyogRGlhZ0FycmF5NjY4ICovIDE4NTMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVucmVhY2hhYmxlLWNvZGUtbG9vcC1pbmNyZW1lbnQgKi8gICAgICAgICAgICAgICAgICAgICAgIDEzOTMyLCAvKiBEaWFnQXJyYXk2NjkgKi8gMTg1NSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdW5yZWFjaGFibGUtY29kZS1yZXR1cm4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM5NjQsIC8qIERpYWdBcnJheTY3MCAqLyAxODU3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1bnNlcXVlbmNlZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzk4OCwgLyogRGlhZ0FycmF5NjcxICovIDE4NTksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVuc3VwcG9ydGVkLWFicyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0MDAwLCAvKiBEaWFnQXJyYXk2NzIgKi8gMTg2MiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdW5zdXBwb3J0ZWQtYXZhaWxhYmlsaXR5LWd1YXJkICovICAgICAgICAgICAgICAgICAgICAgICAgMTQwMTYsIC8qIERpYWdBcnJheTY3MyAqLyAxODY1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1bnN1cHBvcnRlZC1jYiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDA0NywgLyogRGlhZ0FycmF5Njc0ICovIDE4NjcsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVuc3VwcG9ydGVkLWRsbC1iYXNlLWNsYXNzLXRlbXBsYXRlICovICAgICAgICAgICAgICAgICAgIDE0MDYyLCAvKiBEaWFnQXJyYXk2NzUgKi8gMTg2OSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdW5zdXBwb3J0ZWQtZnJpZW5kICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQwOTgsIC8qIERpYWdBcnJheTY3NiAqLyAxODcxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1bnN1cHBvcnRlZC1ncG9wdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDExNywgLyogRGlhZ0FycmF5Njc3ICovIDE4NzQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVuc3VwcG9ydGVkLW5hbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0MTM1LCAvKiBEaWFnQXJyYXk2NzggKi8gMTg3NiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdW5zdXBwb3J0ZWQtdmlzaWJpbGl0eSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQxNTEsIC8qIERpYWdBcnJheTY3OSAqLyAxODc5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1bnVzYWJsZS1wYXJ0aWFsLXNwZWNpYWxpemF0aW9uICovICAgICAgICAgICAgICAgICAgICAgICAxNDE3NCwgLyogRGlhZ0FycmF5NjgwICovIDE4ODEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVudXNlZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0MjA2LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwNjgxICovIDQ1NCB9LAorICB7IC8qIHVudXNlZC1hcmd1bWVudCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0MjEzLCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdW51c2VkLWNvbW1hbmQtbGluZS1hcmd1bWVudCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgMTQyMjksIC8qIERpYWdBcnJheTY4MyAqLyAxODgzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1bnVzZWQtY29tcGFyaXNvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDI1OCwgLyogRGlhZ0FycmF5Njg0ICovIDE4OTEsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVudXNlZC1jb25zdC12YXJpYWJsZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0Mjc2LCAvKiBEaWFnQXJyYXk2ODUgKi8gMTg5MywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdW51c2VkLWV4Y2VwdGlvbi1wYXJhbWV0ZXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQyOTgsIC8qIERpYWdBcnJheTY4NiAqLyAxODk1LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1bnVzZWQtZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDMyNSwgLyogRGlhZ0FycmF5Njg3ICovIDE4OTcsIC8qIERpYWdTdWJHcm91cDY4NyAqLyA0NjQgfSwKKyAgeyAvKiB1bnVzZWQtZ2V0dGVyLXJldHVybi12YWx1ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDM0MSwgLyogRGlhZ0FycmF5Njg4ICovIDE4OTksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVudXNlZC1sYWJlbCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0MzY4LCAvKiBEaWFnQXJyYXk2ODkgKi8gMTkwMSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdW51c2VkLWxhbWJkYS1jYXB0dXJlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQzODEsIC8qIERpYWdBcnJheTY5MCAqLyAxOTAzLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1bnVzZWQtbG9jYWwtdHlwZWRlZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQwMywgLyogRGlhZ0FycmF5NjkxICovIDE5MDUsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVudXNlZC1sb2NhbC10eXBlZGVmcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDI0LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwNjkyICovIDQ2NiB9LAorICB7IC8qIHVudXNlZC1tYWNyb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDQ2LCAvKiBEaWFnQXJyYXk2OTMgKi8gMTkwNywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdW51c2VkLW1lbWJlci1mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0NjAsIC8qIERpYWdBcnJheTY5NCAqLyAxOTA5LCAvKiBEaWFnU3ViR3JvdXA2OTQgKi8gNDY4IH0sCisgIHsgLyogdW51c2VkLXBhcmFtZXRlciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0ODMsIC8qIERpYWdBcnJheTY5NSAqLyAxOTExLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1bnVzZWQtcHJpdmF0ZS1maWVsZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDUwMCwgLyogRGlhZ0FycmF5Njk2ICovIDE5MTMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVudXNlZC1wcm9wZXJ0eS1pdmFyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NTIxLCAvKiBEaWFnQXJyYXk2OTcgKi8gMTkxNSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdW51c2VkLXJlc3VsdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ1NDIsIC8qIERpYWdBcnJheTY5OCAqLyAxOTE3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1bnVzZWQtdGVtcGxhdGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDU1NiwgLyogRGlhZ0FycmF5Njk5ICovIDE5MTksIC8qIERpYWdTdWJHcm91cDY5OSAqLyA0NzAgfSwKKyAgeyAvKiB1bnVzZWQtdmFsdWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDU3MiwgLyogRGlhZ0FycmF5NzAwICovIDE5MjEsIC8qIERpYWdTdWJHcm91cDcwMCAqLyA0NzIgfSwKKyAgeyAvKiB1bnVzZWQtdmFyaWFibGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDU4NSwgLyogRGlhZ0FycmF5NzAxICovIDE5MjYsIC8qIERpYWdTdWJHcm91cDcwMSAqLyA0NzYgfSwKKyAgeyAvKiB1bnVzZWQtdm9sYXRpbGUtbHZhbHVlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDYwMSwgLyogRGlhZ0FycmF5NzAyICovIDE5MjgsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHVzZWQtYnV0LW1hcmtlZC11bnVzZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NjI0LCAvKiBEaWFnQXJyYXk3MDMgKi8gMTkzMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdXNlci1kZWZpbmVkLWxpdGVyYWxzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ2NDcsIC8qIERpYWdBcnJheTcwNCAqLyAxOTMyLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB1c2VyLWRlZmluZWQtd2FybmluZ3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDY2OSwgLyogRGlhZ0FycmF5NzA1ICovIDE5MzQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHZhcmFyZ3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NjkxLCAvKiBEaWFnQXJyYXk3MDYgKi8gMTkzNiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdmFyaWFkaWMtbWFjcm9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ2OTksIC8qIERpYWdBcnJheTcwNyAqLyAxOTQwLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB2ZWMtZWxlbS1zaXplICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDcxNSwgLyogRGlhZ0FycmF5NzA4ICovIDE5NDQsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHZlY3Rvci1jb252ZXJzaW9uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NzI5LCAvKiBEaWFnQXJyYXk3MDkgKi8gMTk0NiwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdmVjdG9yLWNvbnZlcnNpb25zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ3NDcsIC8qIEVtcHR5ICovICAgICAwLCAvKiBEaWFnU3ViR3JvdXA3MTAgKi8gNDc4IH0sCisgIHsgLyogdmV4aW5nLXBhcnNlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ3NjYsIC8qIERpYWdBcnJheTcxMSAqLyAxOTQ4LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB2aXNpYmlsaXR5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDc3OSwgLyogRGlhZ0FycmF5NzEyICovIDE5NTIsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHZsYSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NzkwLCAvKiBEaWFnQXJyYXk3MTMgKi8gMTk1NSwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogdmxhLWV4dGVuc2lvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ3OTQsIC8qIERpYWdBcnJheTcxNCAqLyAxOTU3LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB2b2lkLXB0ci1kZXJlZmVyZW5jZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDgwOCwgLyogRGlhZ0FycmF5NzE1ICovIDE5NTksIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHZvbGF0aWxlLXJlZ2lzdGVyLXZhciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0ODI5LCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogd2Vhay10ZW1wbGF0ZS12dGFibGVzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ4NTEsIC8qIERpYWdBcnJheTcxNyAqLyAxOTYxLCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyAgeyAvKiB3ZWFrLXZ0YWJsZXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDg3MywgLyogRGlhZ0FycmF5NzE4ICovIDE5NjMsIC8qIEVtcHR5ICovICAgICAgICAgMCB9LAorICB7IC8qIHdyaXRhYmxlLXN0cmluZ3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0ODg2LCAvKiBEaWFnQXJyYXk3MTkgKi8gMTk2NSwgLyogRGlhZ1N1Ykdyb3VwNzE5ICovIDQ4MCB9LAorICB7IC8qIHdyaXRlLXN0cmluZ3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0OTAzLCAvKiBFbXB0eSAqLyAgICAgMCwgLyogRGlhZ1N1Ykdyb3VwNzIwICovIDQ4MiB9LAorICB7IC8qIHplcm8tYXMtbnVsbC1wb2ludGVyLWNvbnN0YW50ICovICAgICAgICAgICAgICAgICAgICAgICAgIDE0OTE3LCAvKiBEaWFnQXJyYXk3MjEgKi8gMTk2NywgLyogRW1wdHkgKi8gICAgICAgICAwIH0sCisgIHsgLyogemVyby1sZW5ndGgtYXJyYXkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ5NDcsIC8qIERpYWdBcnJheTcyMiAqLyAxOTY5LCAvKiBFbXB0eSAqLyAgICAgICAgIDAgfSwKKyNlbmRpZiAvLyBHRVRfRElBR19UQUJMRQorCisKKyNpZmRlZiBHRVRfQ0FURUdPUllfVEFCTEUKK0NBVEVHT1JZKCIiLCBEaWFnQ2F0X05vbmUpCitDQVRFR09SWSgiTGV4aWNhbCBvciBQcmVwcm9jZXNzb3IgSXNzdWUiLCBEaWFnQ2F0X0xleGljYWxfb3JfUHJlcHJvY2Vzc29yX0lzc3VlKQorQ0FURUdPUlkoIlNlbWFudGljIElzc3VlIiwgRGlhZ0NhdF9TZW1hbnRpY19Jc3N1ZSkKK0NBVEVHT1JZKCJMYW1iZGEgSXNzdWUiLCBEaWFnQ2F0X0xhbWJkYV9Jc3N1ZSkKK0NBVEVHT1JZKCJQYXJzZSBJc3N1ZSIsIERpYWdDYXRfUGFyc2VfSXNzdWUpCitDQVRFR09SWSgiQVJDIFNlbWFudGljIElzc3VlIiwgRGlhZ0NhdF9BUkNfU2VtYW50aWNfSXNzdWUpCitDQVRFR09SWSgiQVJDIGFuZCBAcHJvcGVydGllcyIsIERpYWdDYXRfQVJDX2FuZF9fcHJvcGVydGllcykKK0NBVEVHT1JZKCJBUkMgQ2FzdGluZyBSdWxlcyIsIERpYWdDYXRfQVJDX0Nhc3RpbmdfUnVsZXMpCitDQVRFR09SWSgiQVJDIFBhcnNlIElzc3VlIiwgRGlhZ0NhdF9BUkNfUGFyc2VfSXNzdWUpCitDQVRFR09SWSgiQVJDIFdlYWsgUmVmZXJlbmNlcyIsIERpYWdDYXRfQVJDX1dlYWtfUmVmZXJlbmNlcykKK0NBVEVHT1JZKCJBUkMgUmVzdHJpY3Rpb25zIiwgRGlhZ0NhdF9BUkNfUmVzdHJpY3Rpb25zKQorQ0FURUdPUlkoIk9wZW5NUCBJc3N1ZSIsIERpYWdDYXRfT3Blbk1QX0lzc3VlKQorQ0FURUdPUlkoIklubGluZSBBc3NlbWJseSBJc3N1ZSIsIERpYWdDYXRfSW5saW5lX0Fzc2VtYmx5X0lzc3VlKQorQ0FURUdPUlkoIk1vZHVsZXMgSXNzdWUiLCBEaWFnQ2F0X01vZHVsZXNfSXNzdWUpCitDQVRFR09SWSgiQ29yb3V0aW5lcyBJc3N1ZSIsIERpYWdDYXRfQ29yb3V0aW5lc19Jc3N1ZSkKK0NBVEVHT1JZKCJBU1QgRGVzZXJpYWxpemF0aW9uIElzc3VlIiwgRGlhZ0NhdF9BU1RfRGVzZXJpYWxpemF0aW9uX0lzc3VlKQorQ0FURUdPUlkoIkJhY2tlbmQgSXNzdWUiLCBEaWFnQ2F0X0JhY2tlbmRfSXNzdWUpCitDQVRFR09SWSgiUmVsYXRlZCBSZXN1bHQgVHlwZSBJc3N1ZSIsIERpYWdDYXRfUmVsYXRlZF9SZXN1bHRfVHlwZV9Jc3N1ZSkKK0NBVEVHT1JZKCJBU1QgU2VyaWFsaXphdGlvbiBJc3N1ZSIsIERpYWdDYXRfQVNUX1NlcmlhbGl6YXRpb25fSXNzdWUpCitDQVRFR09SWSgiTnVsbGFiaWxpdHkgSXNzdWUiLCBEaWFnQ2F0X051bGxhYmlsaXR5X0lzc3VlKQorQ0FURUdPUlkoIkdlbmVyaWNzIElzc3VlIiwgRGlhZ0NhdF9HZW5lcmljc19Jc3N1ZSkKK0NBVEVHT1JZKCJVc2VyLURlZmluZWQgSXNzdWUiLCBEaWFnQ2F0X1VzZXJfRGVmaW5lZF9Jc3N1ZSkKK0NBVEVHT1JZKCJSZWZhY3RvcmluZyBJbnZvY2F0aW9uIElzc3VlIiwgRGlhZ0NhdF9SZWZhY3RvcmluZ19JbnZvY2F0aW9uX0lzc3VlKQorQ0FURUdPUlkoIlZUYWJsZSBBQkkgSXNzdWUiLCBEaWFnQ2F0X1ZUYWJsZV9BQklfSXNzdWUpCitDQVRFR09SWSgiVmFsdWUgQ29udmVyc2lvbiBJc3N1ZSIsIERpYWdDYXRfVmFsdWVfQ29udmVyc2lvbl9Jc3N1ZSkKK0NBVEVHT1JZKCJEb2N1bWVudGF0aW9uIElzc3VlIiwgRGlhZ0NhdF9Eb2N1bWVudGF0aW9uX0lzc3VlKQorQ0FURUdPUlkoIkFSQyBSZXRhaW4gQ3ljbGUiLCBEaWFnQ2F0X0FSQ19SZXRhaW5fQ3ljbGUpCitDQVRFR09SWSgiRGVwcmVjYXRpb25zIiwgRGlhZ0NhdF9EZXByZWNhdGlvbnMpCitDQVRFR09SWSgiRm9ybWF0IFN0cmluZyBJc3N1ZSIsIERpYWdDYXRfRm9ybWF0X1N0cmluZ19Jc3N1ZSkKK0NBVEVHT1JZKCJDb2NvYSBBUEkgSXNzdWUiLCBEaWFnQ2F0X0NvY29hX0FQSV9Jc3N1ZSkKK0NBVEVHT1JZKCIjcHJhZ21hIG1lc3NhZ2UgRGlyZWN0aXZlIiwgRGlhZ0NhdF9fcHJhZ21hX21lc3NhZ2VfRGlyZWN0aXZlKQorQ0FURUdPUlkoIkluc3RydW1lbnRhdGlvbiBJc3N1ZSIsIERpYWdDYXRfSW5zdHJ1bWVudGF0aW9uX0lzc3VlKQorQ0FURUdPUlkoIlVudXNlZCBFbnRpdHkgSXNzdWUiLCBEaWFnQ2F0X1VudXNlZF9FbnRpdHlfSXNzdWUpCisjZW5kaWYgLy8gR0VUX0NBVEVHT1JZX1RBQkxFCisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNJRHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNJRHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGVhODViCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0lEcy5oCkBAIC0wLDAgKzEsMzQyIEBACisvLz09PS0tLSBEaWFnbm9zdGljSURzLmggLSBEaWFnbm9zdGljIElEcyBIYW5kbGluZyAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgRGlhZ25vc3RpYyBJRHMtcmVsYXRlZCBpbnRlcmZhY2VzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfRElBR05PU1RJQ0lEU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfRElBR05PU1RJQ0lEU19ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworICBjbGFzcyBEaWFnbm9zdGljc0VuZ2luZTsKKyAgY2xhc3MgU291cmNlTG9jYXRpb247CisKKyAgLy8gSW1wb3J0IHRoZSBkaWFnbm9zdGljIGVudW1zIHRoZW1zZWx2ZXMuCisgIG5hbWVzcGFjZSBkaWFnIHsKKyAgICAvLyBTaXplIG9mIGVhY2ggb2YgdGhlIGRpYWdub3N0aWMgY2F0ZWdvcmllcy4KKyAgICBlbnVtIHsKKyAgICAgIERJQUdfU0laRV9DT01NT04gICAgICAgID0gIDMwMCwKKyAgICAgIERJQUdfU0laRV9EUklWRVIgICAgICAgID0gIDIwMCwKKyAgICAgIERJQUdfU0laRV9GUk9OVEVORCAgICAgID0gIDEwMCwKKyAgICAgIERJQUdfU0laRV9TRVJJQUxJWkFUSU9OID0gIDEyMCwKKyAgICAgIERJQUdfU0laRV9MRVggICAgICAgICAgID0gIDQwMCwKKyAgICAgIERJQUdfU0laRV9QQVJTRSAgICAgICAgID0gIDUwMCwKKyAgICAgIERJQUdfU0laRV9BU1QgICAgICAgICAgID0gIDE1MCwKKyAgICAgIERJQUdfU0laRV9DT01NRU5UICAgICAgID0gIDEwMCwKKyAgICAgIERJQUdfU0laRV9DUk9TU1RVICAgICAgID0gIDEwMCwKKyAgICAgIERJQUdfU0laRV9TRU1BICAgICAgICAgID0gMzUwMCwKKyAgICAgIERJQUdfU0laRV9BTkFMWVNJUyAgICAgID0gIDEwMCwKKyAgICAgIERJQUdfU0laRV9SRUZBQ1RPUklORyAgID0gMTAwMCwKKyAgICB9OworICAgIC8vIFN0YXJ0IHBvc2l0aW9uIGZvciBkaWFnbm9zdGljcy4KKyAgICBlbnVtIHsKKyAgICAgIERJQUdfU1RBUlRfQ09NTU9OICAgICAgICA9ICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgRElBR19TVEFSVF9EUklWRVIgICAgICAgID0gRElBR19TVEFSVF9DT01NT04gICAgICAgICsgRElBR19TSVpFX0NPTU1PTiwKKyAgICAgIERJQUdfU1RBUlRfRlJPTlRFTkQgICAgICA9IERJQUdfU1RBUlRfRFJJVkVSICAgICAgICArIERJQUdfU0laRV9EUklWRVIsCisgICAgICBESUFHX1NUQVJUX1NFUklBTElaQVRJT04gPSBESUFHX1NUQVJUX0ZST05URU5EICAgICAgKyBESUFHX1NJWkVfRlJPTlRFTkQsCisgICAgICBESUFHX1NUQVJUX0xFWCAgICAgICAgICAgPSBESUFHX1NUQVJUX1NFUklBTElaQVRJT04gKyBESUFHX1NJWkVfU0VSSUFMSVpBVElPTiwKKyAgICAgIERJQUdfU1RBUlRfUEFSU0UgICAgICAgICA9IERJQUdfU1RBUlRfTEVYICAgICAgICAgICArIERJQUdfU0laRV9MRVgsCisgICAgICBESUFHX1NUQVJUX0FTVCAgICAgICAgICAgPSBESUFHX1NUQVJUX1BBUlNFICAgICAgICAgKyBESUFHX1NJWkVfUEFSU0UsCisgICAgICBESUFHX1NUQVJUX0NPTU1FTlQgICAgICAgPSBESUFHX1NUQVJUX0FTVCAgICAgICAgICAgKyBESUFHX1NJWkVfQVNULAorICAgICAgRElBR19TVEFSVF9DUk9TU1RVICAgICAgID0gRElBR19TVEFSVF9DT01NRU5UICAgICAgICsgRElBR19TSVpFX0NST1NTVFUsCisgICAgICBESUFHX1NUQVJUX1NFTUEgICAgICAgICAgPSBESUFHX1NUQVJUX0NST1NTVFUgICAgICAgKyBESUFHX1NJWkVfQ09NTUVOVCwKKyAgICAgIERJQUdfU1RBUlRfQU5BTFlTSVMgICAgICA9IERJQUdfU1RBUlRfU0VNQSAgICAgICAgICArIERJQUdfU0laRV9TRU1BLAorICAgICAgRElBR19TVEFSVF9SRUZBQ1RPUklORyAgID0gRElBR19TVEFSVF9BTkFMWVNJUyAgICAgICsgRElBR19TSVpFX0FOQUxZU0lTLAorICAgICAgRElBR19VUFBFUl9MSU1JVCAgICAgICAgID0gRElBR19TVEFSVF9SRUZBQ1RPUklORyAgICsgRElBR19TSVpFX1JFRkFDVE9SSU5HCisgICAgfTsKKworICAgIGNsYXNzIEN1c3RvbURpYWdJbmZvOworCisgICAgLy8vIFxicmllZiBBbGwgb2YgdGhlIGRpYWdub3N0aWNzIHRoYXQgY2FuIGJlIGVtaXR0ZWQgYnkgdGhlIGZyb250ZW5kLgorICAgIHR5cGVkZWYgdW5zaWduZWQga2luZDsKKworICAgIC8vIEdldCB0eXBlZGVmcyBmb3IgY29tbW9uIGRpYWdub3N0aWNzLgorICAgIGVudW0geworI2RlZmluZSBESUFHKEVOVU0sRkxBR1MsREVGQVVMVF9NQVBQSU5HLERFU0MsR1JPVVAsXAorICAgICAgICAgICAgIFNGSU5BRSxDQVRFR09SWSxOT1dFUlJPUixTSE9XSU5TWVNIRUFERVIpIEVOVU0sCisjZGVmaW5lIENPTU1PTlNUQVJUCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0NvbW1vbktpbmRzLmluYyIKKyAgICAgIE5VTV9CVUlMVElOX0NPTU1PTl9ESUFHTk9TVElDUworI3VuZGVmIERJQUcKKyAgICB9OworCisgICAgLy8vIEVudW0gdmFsdWVzIHRoYXQgYWxsb3cgdGhlIGNsaWVudCB0byBtYXAgTk9URXMsIFdBUk5JTkdzLCBhbmQgRVhURU5TSU9OcworICAgIC8vLyB0byBlaXRoZXIgSWdub3JlIChub3RoaW5nKSwgUmVtYXJrIChlbWl0IGEgcmVtYXJrKSwgV2FybmluZworICAgIC8vLyAoZW1pdCBhIHdhcm5pbmcpIG9yIEVycm9yIChlbWl0IGFzIGFuIGVycm9yKS4gIEl0IGFsbG93cyBjbGllbnRzIHRvCisgICAgLy8vIG1hcCBFUlJPUnMgdG8gRXJyb3Igb3IgRmF0YWwgKHN0b3AgZW1pdHRpbmcgZGlhZ25vc3RpY3MgYWZ0ZXIgdGhpcyBvbmUpLgorICAgIGVudW0gY2xhc3MgU2V2ZXJpdHkgeworICAgICAgLy8gTk9URTogMCBtZWFucyAidW5jb21wdXRlZCIuCisgICAgICBJZ25vcmVkID0gMSwgLy8vPCBEbyBub3QgcHJlc2VudCB0aGlzIGRpYWdub3N0aWMsIGlnbm9yZSBpdC4KKyAgICAgIFJlbWFyayA9IDIsICAvLy88IFByZXNlbnQgdGhpcyBkaWFnbm9zdGljIGFzIGEgcmVtYXJrLgorICAgICAgV2FybmluZyA9IDMsIC8vLzwgUHJlc2VudCB0aGlzIGRpYWdub3N0aWMgYXMgYSB3YXJuaW5nLgorICAgICAgRXJyb3IgPSA0LCAgIC8vLzwgUHJlc2VudCB0aGlzIGRpYWdub3N0aWMgYXMgYW4gZXJyb3IuCisgICAgICBGYXRhbCA9IDUgICAgLy8vPCBQcmVzZW50IHRoaXMgZGlhZ25vc3RpYyBhcyBhIGZhdGFsIGVycm9yLgorICAgIH07CisKKyAgICAvLy8gRmxhdm9ycyBvZiBkaWFnbm9zdGljcyB3ZSBjYW4gZW1pdC4gVXNlZCB0byBmaWx0ZXIgZm9yIGEgcGFydGljdWxhcgorICAgIC8vLyBraW5kIG9mIGRpYWdub3N0aWMgKGZvciBpbnN0YW5jZSwgZm9yIC1XLy1SIGZsYWdzKS4KKyAgICBlbnVtIGNsYXNzIEZsYXZvciB7CisgICAgICBXYXJuaW5nT3JFcnJvciwgLy8vPCBBIGRpYWdub3N0aWMgdGhhdCBpbmRpY2F0ZXMgYSBwcm9ibGVtIG9yIHBvdGVudGlhbAorICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcHJvYmxlbS4gQ2FuIGJlIG1hZGUgZmF0YWwgYnkgLVdlcnJvci4KKyAgICAgIFJlbWFyayAgICAgICAgICAvLy88IEEgZGlhZ25vc3RpYyB0aGF0IGluZGljYXRlcyBub3JtYWwgcHJvZ3Jlc3MgdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY29tcGlsYXRpb24uCisgICAgfTsKKyAgfQorCitjbGFzcyBEaWFnbm9zdGljTWFwcGluZyB7CisgIHVuc2lnbmVkIFNldmVyaXR5IDogMzsKKyAgdW5zaWduZWQgSXNVc2VyIDogMTsKKyAgdW5zaWduZWQgSXNQcmFnbWEgOiAxOworICB1bnNpZ25lZCBIYXNOb1dhcm5pbmdBc0Vycm9yIDogMTsKKyAgdW5zaWduZWQgSGFzTm9FcnJvckFzRmF0YWwgOiAxOworICB1bnNpZ25lZCBXYXNVcGdyYWRlZEZyb21XYXJuaW5nIDogMTsKKworcHVibGljOgorICBzdGF0aWMgRGlhZ25vc3RpY01hcHBpbmcgTWFrZShkaWFnOjpTZXZlcml0eSBTZXZlcml0eSwgYm9vbCBJc1VzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNQcmFnbWEpIHsKKyAgICBEaWFnbm9zdGljTWFwcGluZyBSZXN1bHQ7CisgICAgUmVzdWx0LlNldmVyaXR5ID0gKHVuc2lnbmVkKVNldmVyaXR5OworICAgIFJlc3VsdC5Jc1VzZXIgPSBJc1VzZXI7CisgICAgUmVzdWx0LklzUHJhZ21hID0gSXNQcmFnbWE7CisgICAgUmVzdWx0Lkhhc05vV2FybmluZ0FzRXJyb3IgPSAwOworICAgIFJlc3VsdC5IYXNOb0Vycm9yQXNGYXRhbCA9IDA7CisgICAgUmVzdWx0Lldhc1VwZ3JhZGVkRnJvbVdhcm5pbmcgPSAwOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICBkaWFnOjpTZXZlcml0eSBnZXRTZXZlcml0eSgpIGNvbnN0IHsgcmV0dXJuIChkaWFnOjpTZXZlcml0eSlTZXZlcml0eTsgfQorICB2b2lkIHNldFNldmVyaXR5KGRpYWc6OlNldmVyaXR5IFZhbHVlKSB7IFNldmVyaXR5ID0gKHVuc2lnbmVkKVZhbHVlOyB9CisKKyAgYm9vbCBpc1VzZXIoKSBjb25zdCB7IHJldHVybiBJc1VzZXI7IH0KKyAgYm9vbCBpc1ByYWdtYSgpIGNvbnN0IHsgcmV0dXJuIElzUHJhZ21hOyB9CisKKyAgYm9vbCBpc0Vycm9yT3JGYXRhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U2V2ZXJpdHkoKSA9PSBkaWFnOjpTZXZlcml0eTo6RXJyb3IgfHwKKyAgICAgICAgICAgZ2V0U2V2ZXJpdHkoKSA9PSBkaWFnOjpTZXZlcml0eTo6RmF0YWw7CisgIH0KKworICBib29sIGhhc05vV2FybmluZ0FzRXJyb3IoKSBjb25zdCB7IHJldHVybiBIYXNOb1dhcm5pbmdBc0Vycm9yOyB9CisgIHZvaWQgc2V0Tm9XYXJuaW5nQXNFcnJvcihib29sIFZhbHVlKSB7IEhhc05vV2FybmluZ0FzRXJyb3IgPSBWYWx1ZTsgfQorCisgIGJvb2wgaGFzTm9FcnJvckFzRmF0YWwoKSBjb25zdCB7IHJldHVybiBIYXNOb0Vycm9yQXNGYXRhbDsgfQorICB2b2lkIHNldE5vRXJyb3JBc0ZhdGFsKGJvb2wgVmFsdWUpIHsgSGFzTm9FcnJvckFzRmF0YWwgPSBWYWx1ZTsgfQorCisgIC8vLyBXaGV0aGVyIHRoaXMgbWFwcGluZyBhdHRlbXB0ZWQgdG8gbWFwIHRoZSBkaWFnbm9zdGljIHRvIGEgd2FybmluZywgYnV0CisgIC8vLyB3YXMgb3ZlcnJ1bGVkIGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgd2FzIGFscmVhZHkgbWFwcGVkIHRvIGFuIGVycm9yIG9yCisgIC8vLyBmYXRhbCBlcnJvci4KKyAgYm9vbCB3YXNVcGdyYWRlZEZyb21XYXJuaW5nKCkgY29uc3QgeyByZXR1cm4gV2FzVXBncmFkZWRGcm9tV2FybmluZzsgfQorICB2b2lkIHNldFVwZ3JhZGVkRnJvbVdhcm5pbmcoYm9vbCBWYWx1ZSkgeyBXYXNVcGdyYWRlZEZyb21XYXJuaW5nID0gVmFsdWU7IH0KKworICAvLy8gU2VyaWFsaXplIHRoaXMgbWFwcGluZyBhcyBhIHJhdyBpbnRlZ2VyLgorICB1bnNpZ25lZCBzZXJpYWxpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIChJc1VzZXIgPDwgNykgfCAoSXNQcmFnbWEgPDwgNikgfCAoSGFzTm9XYXJuaW5nQXNFcnJvciA8PCA1KSB8CisgICAgICAgICAgIChIYXNOb0Vycm9yQXNGYXRhbCA8PCA0KSB8IChXYXNVcGdyYWRlZEZyb21XYXJuaW5nIDw8IDMpIHwgU2V2ZXJpdHk7CisgIH0KKyAgLy8vIERlc2VyaWFsaXplIGEgbWFwcGluZy4KKyAgc3RhdGljIERpYWdub3N0aWNNYXBwaW5nIGRlc2VyaWFsaXplKHVuc2lnbmVkIEJpdHMpIHsKKyAgICBEaWFnbm9zdGljTWFwcGluZyBSZXN1bHQ7CisgICAgUmVzdWx0LklzVXNlciA9IChCaXRzID4+IDcpICYgMTsKKyAgICBSZXN1bHQuSXNQcmFnbWEgPSAoQml0cyA+PiA2KSAmIDE7CisgICAgUmVzdWx0Lkhhc05vV2FybmluZ0FzRXJyb3IgPSAoQml0cyA+PiA1KSAmIDE7CisgICAgUmVzdWx0Lkhhc05vRXJyb3JBc0ZhdGFsID0gKEJpdHMgPj4gNCkgJiAxOworICAgIFJlc3VsdC5XYXNVcGdyYWRlZEZyb21XYXJuaW5nID0gKEJpdHMgPj4gMykgJiAxOworICAgIFJlc3VsdC5TZXZlcml0eSA9IEJpdHMgJiAweDc7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorfTsKKworLy8vIFxicmllZiBVc2VkIGZvciBoYW5kbGluZyBhbmQgcXVlcnlpbmcgZGlhZ25vc3RpYyBJRHMuCisvLy8KKy8vLyBDYW4gYmUgdXNlZCBhbmQgc2hhcmVkIGJ5IG11bHRpcGxlIERpYWdub3N0aWNzIGZvciBtdWx0aXBsZSB0cmFuc2xhdGlvbiB1bml0cy4KK2NsYXNzIERpYWdub3N0aWNJRHMgOiBwdWJsaWMgUmVmQ291bnRlZEJhc2U8RGlhZ25vc3RpY0lEcz4geworcHVibGljOgorICAvLy8gXGJyaWVmIFRoZSBsZXZlbCBvZiB0aGUgZGlhZ25vc3RpYywgYWZ0ZXIgaXQgaGFzIGJlZW4gdGhyb3VnaCBtYXBwaW5nLgorICBlbnVtIExldmVsIHsKKyAgICBJZ25vcmVkLCBOb3RlLCBSZW1hcmssIFdhcm5pbmcsIEVycm9yLCBGYXRhbAorICB9OworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIEluZm9ybWF0aW9uIGZvciB1bmlxdWluZyBhbmQgbG9va2luZyB1cCBjdXN0b20gZGlhZ3MuCisgIGRpYWc6OkN1c3RvbURpYWdJbmZvICpDdXN0b21EaWFnSW5mbzsKKworcHVibGljOgorICBEaWFnbm9zdGljSURzKCk7CisgIH5EaWFnbm9zdGljSURzKCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYW4gSUQgZm9yIGEgZGlhZ25vc3RpYyB3aXRoIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZyBhbmQKKyAgLy8vIGxldmVsLgorICAvLy8KKyAgLy8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHJlcXVlc3QgZm9yIHRoaXMgZGlhZ25vc3RpYywgaXQgaXMgcmVnaXN0ZXJlZCBhbmQKKyAgLy8vIGNyZWF0ZWQsIG90aGVyd2lzZSB0aGUgZXhpc3RpbmcgSUQgaXMgcmV0dXJuZWQuCisKKyAgLy8gRklYTUU6IFJlcGxhY2UgdGhpcyBmdW5jdGlvbiB3aXRoIGEgY3JlYXRlLW9ubHkgZmFjaWx0eSBsaWtlCisgIC8vIGNyZWF0ZUN1c3RvbURpYWdJREZyb21Gb3JtYXRTdHJpbmcoKSB0byBlbmZvcmNlIHNhZmUgdXNhZ2UuIEF0IHRoZSB0aW1lIG9mCisgIC8vIHdyaXRpbmcsIG5lYXJseSBhbGwgY2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uIHdlcmUgaW52YWxpZC4KKyAgdW5zaWduZWQgZ2V0Q3VzdG9tRGlhZ0lEKExldmVsIEwsIFN0cmluZ1JlZiBGb3JtYXRTdHJpbmcpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBEaWFnbm9zdGljIGNsYXNzaWZpY2F0aW9uIGFuZCByZXBvcnRpbmcgaW50ZXJmYWNlcy4KKyAgLy8KKworICAvLy8gXGJyaWVmIEdpdmVuIGEgZGlhZ25vc3RpYyBJRCwgcmV0dXJuIGEgZGVzY3JpcHRpb24gb2YgdGhlIGlzc3VlLgorICBTdHJpbmdSZWYgZ2V0RGVzY3JpcHRpb24odW5zaWduZWQgRGlhZ0lEKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSB1bm1hcHBlZCBkaWFnbm9zdGljIGxldmVsb2YgdGhlIHNwZWNpZmllZAorICAvLy8gZGlhZ25vc3RpYyBJRCBpcyBhIFdhcm5pbmcgb3IgRXh0ZW5zaW9uLgorICAvLy8KKyAgLy8vIFRoaXMgb25seSB3b3JrcyBvbiBidWlsdGluIGRpYWdub3N0aWNzLCBub3QgY3VzdG9tIG9uZXMsIGFuZCBpcyBub3QKKyAgLy8vIGxlZ2FsIHRvIGNhbGwgb24gTk9URXMuCisgIHN0YXRpYyBib29sIGlzQnVpbHRpbldhcm5pbmdPckV4dGVuc2lvbih1bnNpZ25lZCBEaWFnSUQpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBkaWFnbm9zdGljIGlzIG1hcHBlZCB0byBlcnJvcnMgYnkKKyAgLy8vIGRlZmF1bHQuCisgIHN0YXRpYyBib29sIGlzRGVmYXVsdE1hcHBpbmdBc0Vycm9yKHVuc2lnbmVkIERpYWdJRCk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gYnVpbHQtaW4gZGlhZ25vc3RpYyBJRCBpcyBhIE5vdGUuCisgIHN0YXRpYyBib29sIGlzQnVpbHRpbk5vdGUodW5zaWduZWQgRGlhZ0lEKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBidWlsdC1pbiBkaWFnbm9zdGljIElEIGlzIGZvciBhbgorICAvLy8gZXh0ZW5zaW9uIG9mIHNvbWUgc29ydC4KKyAgc3RhdGljIGJvb2wgaXNCdWlsdGluRXh0ZW5zaW9uRGlhZyh1bnNpZ25lZCBEaWFnSUQpIHsKKyAgICBib29sIGlnbm9yZWQ7CisgICAgcmV0dXJuIGlzQnVpbHRpbkV4dGVuc2lvbkRpYWcoRGlhZ0lELCBpZ25vcmVkKTsKKyAgfQorICAKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gYnVpbHQtaW4gZGlhZ25vc3RpYyBJRCBpcyBmb3IgYW4KKyAgLy8vIGV4dGVuc2lvbiBvZiBzb21lIHNvcnQsIGFuZCB3aGV0aGVyIGl0IGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgLy8vCisgIC8vLyBUaGlzIGFsc28gcmV0dXJucyBFbmFibGVkQnlEZWZhdWx0LCB3aGljaCBpcyBzZXQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUKKyAgLy8vIGRpYWdub3N0aWMgaXMgaWdub3JlZCBieSBkZWZhdWx0IChpbiB3aGljaCBjYXNlIC1wZWRhbnRpYyBlbmFibGVzIGl0KSBvcgorICAvLy8gdHJlYXRlZCBhcyBhIHdhcm5pbmcvZXJyb3IgYnkgZGVmYXVsdC4KKyAgLy8vCisgIHN0YXRpYyBib29sIGlzQnVpbHRpbkV4dGVuc2lvbkRpYWcodW5zaWduZWQgRGlhZ0lELCBib29sICZFbmFibGVkQnlEZWZhdWx0KTsKKyAgCisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGxvd2VzdC1sZXZlbCB3YXJuaW5nIG9wdGlvbiB0aGF0IGVuYWJsZXMgdGhlIHNwZWNpZmllZAorICAvLy8gZGlhZ25vc3RpYy4KKyAgLy8vCisgIC8vLyBJZiB0aGVyZSBpcyBubyAtV2ZvbyBmbGFnIHRoYXQgY29udHJvbHMgdGhlIGRpYWdub3N0aWMsIHRoaXMgcmV0dXJucyBudWxsLgorICBzdGF0aWMgU3RyaW5nUmVmIGdldFdhcm5pbmdPcHRpb25Gb3JEaWFnKHVuc2lnbmVkIERpYWdJRCk7CisgIAorICAvLy8gXGJyaWVmIFJldHVybiB0aGUgY2F0ZWdvcnkgbnVtYmVyIHRoYXQgYSBzcGVjaWZpZWQgXHAgRGlhZ0lEIGJlbG9uZ3MgdG8sCisgIC8vLyBvciAwIGlmIG5vIGNhdGVnb3J5LgorICBzdGF0aWMgdW5zaWduZWQgZ2V0Q2F0ZWdvcnlOdW1iZXJGb3JEaWFnKHVuc2lnbmVkIERpYWdJRCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBkaWFnbm9zdGljIGNhdGVnb3JpZXMuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXROdW1iZXJPZkNhdGVnb3JpZXMoKTsKKworICAvLy8gXGJyaWVmIEdpdmVuIGEgY2F0ZWdvcnkgSUQsIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2F0ZWdvcnkuCisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0Q2F0ZWdvcnlOYW1lRnJvbUlEKHVuc2lnbmVkIENhdGVnb3J5SUQpOworICAKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBhIGdpdmVuIGRpYWdub3N0aWMgZmFsbHMgaW50byBhbiBBUkMgZGlhZ25vc3RpYworICAvLy8gY2F0ZWdvcnkuCisgIHN0YXRpYyBib29sIGlzQVJDRGlhZ25vc3RpYyh1bnNpZ25lZCBEaWFnSUQpOworCisgIC8vLyBcYnJpZWYgRW51bWVyYXRpb24gZGVzY3JpYmluZyBob3cgdGhlIGVtaXNzaW9uIG9mIGEgZGlhZ25vc3RpYyBzaG91bGQKKyAgLy8vIGJlIHRyZWF0ZWQgd2hlbiBpdCBvY2N1cnMgZHVyaW5nIEMrKyB0ZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24uCisgIGVudW0gU0ZJTkFFUmVzcG9uc2UgeworICAgIC8vLyBcYnJpZWYgVGhlIGRpYWdub3N0aWMgc2hvdWxkIG5vdCBiZSByZXBvcnRlZCwgYnV0IGl0IHNob3VsZCBjYXVzZQorICAgIC8vLyB0ZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24gdG8gZmFpbC4KKyAgICAvLy8KKyAgICAvLy8gVGhlIHZhc3QgbWFqb3JpdHkgb2YgZXJyb3JzIHRoYXQgb2NjdXIgZHVyaW5nIHRlbXBsYXRlIGFyZ3VtZW50IAorICAgIC8vLyBkZWR1Y3Rpb24gZmFsbCBpbnRvIHRoaXMgY2F0ZWdvcnkuCisgICAgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsCisgICAgCisgICAgLy8vIFxicmllZiBUaGUgZGlhZ25vc3RpYyBzaG91bGQgYmUgc3VwcHJlc3NlZCBlbnRpcmVseS4KKyAgICAvLy8KKyAgICAvLy8gV2FybmluZ3MgZ2VuZXJhbGx5IGZhbGwgaW50byB0aGlzIGNhdGVnb3J5LgorICAgIFNGSU5BRV9TdXBwcmVzcywKKyAgICAKKyAgICAvLy8gXGJyaWVmIFRoZSBkaWFnbm9zdGljIHNob3VsZCBiZSByZXBvcnRlZC4KKyAgICAvLy8KKyAgICAvLy8gVGhlIGRpYWdub3N0aWMgc2hvdWxkIGJlIHJlcG9ydGVkLiBWYXJpb3VzIGZhdGFsIGVycm9ycyAoZS5nLiwgCisgICAgLy8vIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gZGVwdGggZXhjZWVkZWQpIGZhbGwgaW50byB0aGlzIGNhdGVnb3J5LgorICAgIFNGSU5BRV9SZXBvcnQsCisgICAgCisgICAgLy8vIFxicmllZiBUaGUgZGlhZ25vc3RpYyBpcyBhbiBhY2Nlc3MtY29udHJvbCBkaWFnbm9zdGljLCB3aGljaCB3aWxsIGJlCisgICAgLy8vIHN1YnN0aXR1dGlvbiBmYWlsdXJlcyBpbiBzb21lIGNvbnRleHRzIGFuZCByZXBvcnRlZCBpbiBvdGhlcnMuCisgICAgU0ZJTkFFX0FjY2Vzc0NvbnRyb2wKKyAgfTsKKyAgCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBidWlsdC1pbiBkaWFnbm9zdGljIElEIGlzCisgIC8vLyBmb3IgYW4gZXJyb3IgdGhhdCBpcyBzdXBwcmVzc2VkIGlmIGl0IG9jY3VycyBkdXJpbmcgQysrIHRlbXBsYXRlCisgIC8vLyBhcmd1bWVudCBkZWR1Y3Rpb24uCisgIC8vLworICAvLy8gV2hlbiBhbiBlcnJvciBpcyBzdXBwcmVzc2VkIGR1ZSB0byBTRklOQUUsIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudAorICAvLy8gZGVkdWN0aW9uIGZhaWxzIGJ1dCBubyBkaWFnbm9zdGljIGlzIGVtaXR0ZWQuIENlcnRhaW4gY2xhc3NlcyBvZgorICAvLy8gZXJyb3JzLCBzdWNoIGFzIHRob3NlIGVycm9ycyB0aGF0IGludm9sdmUgQysrIGFjY2VzcyBjb250cm9sLAorICAvLy8gYXJlIG5vdCBTRklOQUUgZXJyb3JzLgorICBzdGF0aWMgU0ZJTkFFUmVzcG9uc2UgZ2V0RGlhZ25vc3RpY1NGSU5BRVJlc3BvbnNlKHVuc2lnbmVkIERpYWdJRCk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHN0cmluZyBvZiBhbGwgZGlhZ25vc3RpYyBmbGFncy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBBIGxpc3Qgb2YgYWxsIGRpYWdub3N0aWNzIGZsYWdzIGFzIHRoZXkgd291bGQgYmUgd3JpdHRlbiBpbiBhCisgIC8vLyBjb21tYW5kIGxpbmUgaW52b2NhdGlvbiBpbmNsdWRpbmcgdGhlaXIgYG5vLWAgdmFyaWFudHMuIEZvciBleGFtcGxlOgorICAvLy8gYHsiLVdlbXB0eS1ib2R5IiwgIi1Xbm8tZW1wdHktYm9keSIsIC4uLn1gCisgIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0RGlhZ25vc3RpY0ZsYWdzKCk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHNldCBvZiBhbGwgZGlhZ25vc3RpYyBJRHMgaW4gdGhlIGdyb3VwIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgIC8vLworICAvLy8gXHBhcmFtW291dF0gRGlhZ3MgLSBPbiByZXR1cm4sIHRoZSBkaWFnbm9zdGljcyBpbiB0aGUgZ3JvdXAuCisgIC8vLyBccmV0dXJucyBcYyB0cnVlIGlmIHRoZSBnaXZlbiBncm91cCBpcyB1bmtub3duLCBcYyBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgZ2V0RGlhZ25vc3RpY3NJbkdyb3VwKGRpYWc6OkZsYXZvciBGbGF2b3IsIFN0cmluZ1JlZiBHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGRpYWc6OmtpbmQ+ICZEaWFncykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHNldCBvZiBhbGwgZGlhZ25vc3RpYyBJRHMuCisgIHN0YXRpYyB2b2lkIGdldEFsbERpYWdub3N0aWNzKGRpYWc6OkZsYXZvciBGbGF2b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGRpYWc6OmtpbmQ+ICZEaWFncyk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGRpYWdub3N0aWMgb3B0aW9uIHdpdGggdGhlIGNsb3Nlc3QgZWRpdCBkaXN0YW5jZSB0byB0aGUKKyAgLy8vIGdpdmVuIGdyb3VwIG5hbWUuCisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0TmVhcmVzdE9wdGlvbihkaWFnOjpGbGF2b3IgRmxhdm9yLCBTdHJpbmdSZWYgR3JvdXApOworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIENsYXNzaWZ5IHRoZSBzcGVjaWZpZWQgZGlhZ25vc3RpYyBJRCBpbnRvIGEgTGV2ZWwsIGNvbnN1bWFibGUgYnkKKyAgLy8vIHRoZSBEaWFnbm9zdGljQ2xpZW50LgorICAvLy8gCisgIC8vLyBUaGUgY2xhc3NpZmljYXRpb24gaXMgYmFzZWQgb24gdGhlIHdheSB0aGUgY2xpZW50IGNvbmZpZ3VyZWQgdGhlCisgIC8vLyBEaWFnbm9zdGljc0VuZ2luZSBvYmplY3QuCisgIC8vLworICAvLy8gXHBhcmFtIExvYyBUaGUgc291cmNlIGxvY2F0aW9uIGZvciB3aGljaCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBmaW5kaW5nIG91dAorICAvLy8gdGhlIGRpYWdub3N0aWMgc3RhdGUuIENhbiBiZSBudWxsIGluIG9yZGVyIHRvIHF1ZXJ5IHRoZSBsYXRlc3Qgc3RhdGUuCisgIERpYWdub3N0aWNJRHM6OkxldmVsCisgIGdldERpYWdub3N0aWNMZXZlbCh1bnNpZ25lZCBEaWFnSUQsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNzRW5naW5lICZEaWFnKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIGRpYWc6OlNldmVyaXR5CisgIGdldERpYWdub3N0aWNTZXZlcml0eSh1bnNpZ25lZCBEaWFnSUQsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNzRW5naW5lICZEaWFnKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIC8vLyBcYnJpZWYgVXNlZCB0byByZXBvcnQgYSBkaWFnbm9zdGljIHRoYXQgaXMgZmluYWxseSBmdWxseSBmb3JtZWQuCisgIC8vLworICAvLy8gXHJldHVybnMgXGMgdHJ1ZSBpZiB0aGUgZGlhZ25vc3RpYyB3YXMgZW1pdHRlZCwgXGMgZmFsc2UgaWYgaXQgd2FzCisgIC8vLyBzdXBwcmVzc2VkLgorICBib29sIFByb2Nlc3NEaWFnKERpYWdub3N0aWNzRW5naW5lICZEaWFnKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFVzZWQgdG8gZW1pdCBhIGRpYWdub3N0aWMgdGhhdCBpcyBmaW5hbGx5IGZ1bGx5IGZvcm1lZCwKKyAgLy8vIGlnbm9yaW5nIHN1cHByZXNzaW9uLgorICB2b2lkIEVtaXREaWFnKERpYWdub3N0aWNzRW5naW5lICZEaWFnLCBMZXZlbCBEaWFnTGV2ZWwpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgZGlhZ25vc3RpYyBtYXkgbGVhdmUgdGhlIEFTVCBpbiBhIHN0YXRlIHdoZXJlIHNvbWUKKyAgLy8vIGludmFyaWFudHMgY2FuIGJyZWFrLgorICBib29sIGlzVW5yZWNvdmVyYWJsZSh1bnNpZ25lZCBEaWFnSUQpIGNvbnN0OworCisgIGZyaWVuZCBjbGFzcyBEaWFnbm9zdGljc0VuZ2luZTsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljSW5kZXhOYW1lLmluYyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNJbmRleE5hbWUuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MDA3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljSW5kZXhOYW1lLmluYwpAQCAtMCwwICsxLDQ2ODAgQEAKK0RJQUdfTkFNRV9JTkRFWChiYWNrc2xhc2hfbmV3bGluZV9zcGFjZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfNjRfYml0X2J1aWx0aW5fMzJfYml0X3RndCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfX1ByYWdtYV9tYWxmb3JtZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2FiaV90YWdfb25fcmVkZWNsYXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYWJzdHJhY3RfdHlwZV9pbl9kZWNsKQorRElBR19OQU1FX0lOREVYKGVycl9hY2Nlc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX2FjY2Vzc19iYXNlX2N0b3IpCitESUFHX05BTUVfSU5ERVgoZXJyX2FjY2Vzc19jdG9yKQorRElBR19OQU1FX0lOREVYKGVycl9hY2Nlc3NfZGVjbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYWNjZXNzX2R0b3IpCitESUFHX05BTUVfSU5ERVgoZXJyX2FjY2Vzc19kdG9yX2Jhc2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2FjY2Vzc19kdG9yX2V4Y2VwdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYWNjZXNzX2R0b3JfZmllbGQpCitESUFHX05BTUVfSU5ERVgoZXJyX2FjY2Vzc19kdG9yX2l2YXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2FjY2Vzc19kdG9yX3RlbXApCitESUFHX05BTUVfSU5ERVgoZXJyX2FjY2Vzc19kdG9yX3ZhcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYWNjZXNzX2R0b3JfdmJhc2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2FjY2Vzc19maWVsZF9jdG9yKQorRElBR19OQU1FX0lOREVYKGVycl9hY2Nlc3NfZnJpZW5kX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9hY2Nlc3NfbGFtYmRhX2NhcHR1cmUpCitESUFHX05BTUVfSU5ERVgoZXJyX2FjY2Vzc19zcGVjaWZpZXJfaW50ZXJmYWNlKQorRElBR19OQU1FX0lOREVYKGVycl9hZGRyX292bF9hbWJpZ3VvdXMpCitESUFHX05BTUVfSU5ERVgoZXJyX2FkZHJfb3ZsX25vX3F1YWxpZmllcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYWRkcl9vdmxfbm9fdmlhYmxlKQorRElBR19OQU1FX0lOREVYKGVycl9hZGRyX292bF9ub3RfZnVuY19wdHJyZWYpCitESUFHX05BTUVfSU5ERVgoZXJyX2FkZHJlc3Nfb2ZfZnVuY3Rpb25fd2l0aF9wYXNzX29iamVjdF9zaXplX3BhcmFtcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYWRkcmVzc19vZl9sYWJlbF9vdXRzaWRlX2ZuKQorRElBR19OQU1FX0lOREVYKGVycl9hZGRyZXNzX3NwYWNlX3F1YWxpZmllZF9kZWxldGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2FkZHJlc3Nfc3BhY2VfcXVhbGlmaWVkX25ldykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYWRkcm9mX2Z1bmN0aW9uX2Rpc2FibGVkX2J5X2VuYWJsZV9pZl9hdHRyKQorRElBR19OQU1FX0lOREVYKGVycl9hbGlhc19hZnRlcl90ZW50YXRpdmUpCitESUFHX05BTUVfSU5ERVgoZXJyX2FsaWFzX2RlY2xhcmF0aW9uX25vdF9pZGVudGlmaWVyKQorRElBR19OQU1FX0lOREVYKGVycl9hbGlhc19kZWNsYXJhdGlvbl9wYWNrX2V4cGFuc2lvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYWxpYXNfZGVjbGFyYXRpb25fc3BlY2lhbGl6YXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2FsaWFzX2lzX2RlZmluaXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2FsaWFzX25vdF9zdXBwb3J0ZWRfb25fZGFyd2luKQorRElBR19OQU1FX0lOREVYKGVycl9hbGlhc19ub3Rfc3VwcG9ydGVkX29uX252cHR4KQorRElBR19OQU1FX0lOREVYKGVycl9hbGlhc190ZW1wbGF0ZV9leHBhbnNpb25faW50b19maXhlZF9saXN0KQorRElBR19OQU1FX0lOREVYKGVycl9hbGlhc190ZW1wbGF0ZV9leHRyYV9oZWFkZXJzKQorRElBR19OQU1FX0lOREVYKGVycl9hbGlhc190b191bmRlZmluZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2FsaWduX3ZhbHVlX2F0dHJpYnV0ZV9hcmd1bWVudF9ub3RfaW50KQorRElBR19OQU1FX0lOREVYKGVycl9hbGlnbmFzX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2FsaWduYXNfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX2FsaWduYXNfbWlzc2luZ19vbl9kZWZpbml0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9hbGlnbmFzX3VuZGVyYWxpZ25lZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYWxpZ25lZF9hdHRyaWJ1dGVfYXJndW1lbnRfbm90X2ludCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYWxpZ25tZW50X2RlcGVuZGVudF90eXBlZGVmX25hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX2FsaWdubWVudF9ub3RfcG93ZXJfb2ZfdHdvKQorRElBR19OQU1FX0lOREVYKGVycl9hbGlnbm1lbnRfdG9vX2JpZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYWxpZ25tZW50X3Rvb19zbWFsbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYWxpZ25vZl9tZW1iZXJfb2ZfaW5jb21wbGV0ZV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9hbGxvY2F0aW9uX29mX2Fic3RyYWN0X3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2FsdGl2ZWNfZW1wdHlfaW5pdGlhbGl6ZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2FtYmlndW91c19iYXNlX3RvX2Rlcml2ZWRfY2FzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYW1iaWd1b3VzX2RlbGV0ZV9vcGVyYW5kKQorRElBR19OQU1FX0lOREVYKGVycl9hbWJpZ3VvdXNfZGVyaXZlZF90b19iYXNlX2NvbnYpCitESUFHX05BTUVfSU5ERVgoZXJyX2FtYmlndW91c19pbmhlcml0ZWRfY29uc3RydWN0b3IpCitESUFHX05BTUVfSU5ERVgoZXJyX2FtYmlndW91c19tZW1iZXJfbXVsdGlwbGVfc3Vib2JqZWN0X3R5cGVzKQorRElBR19OQU1FX0lOREVYKGVycl9hbWJpZ3VvdXNfbWVtYmVyX211bHRpcGxlX3N1Ym9iamVjdHMpCitESUFHX05BTUVfSU5ERVgoZXJyX2FtYmlndW91c19tZW1wdHJfY29udikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYW1iaWd1b3VzX3JlZmVyZW5jZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYW1iaWd1b3VzX3N1aXRhYmxlX2RlbGV0ZV9tZW1iZXJfZnVuY3Rpb25fZm91bmQpCitESUFHX05BTUVfSU5ERVgoZXJyX2FtYmlndW91c190YWdfaGlkaW5nKQorRElBR19OQU1FX0lOREVYKGVycl9hbmFseXplcl9jb25maWdfbXVsdGlwbGVfdmFsdWVzKQorRElBR19OQU1FX0lOREVYKGVycl9hbmFseXplcl9jb25maWdfbm9fdmFsdWUpCitESUFHX05BTUVfSU5ERVgoZXJyX2Fub25fYml0ZmllbGRfaGFzX25lZ2F0aXZlX3dpZHRoKQorRElBR19OQU1FX0lOREVYKGVycl9hbm9uX2JpdGZpZWxkX3F1YWxpZmllcnMpCitESUFHX05BTUVfSU5ERVgoZXJyX2Fub25fYml0ZmllbGRfd2lkdGhfZXhjZWVkc190eXBlX3dpZHRoKQorRElBR19OQU1FX0lOREVYKGVycl9hbm9uX3R5cGVfZGVmaW5pdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYW5vbnltb3VzX3Byb3BlcnR5KQorRElBR19OQU1FX0lOREVYKGVycl9hbm9ueW1vdXNfcmVjb3JkX2JhZF9tZW1iZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2Fub255bW91c19yZWNvcmRfbWVtYmVyX3JlZGVjbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYW5vbnltb3VzX3JlY29yZF9ub25wdWJsaWNfbWVtYmVyKQorRElBR19OQU1FX0lOREVYKGVycl9hbm9ueW1vdXNfcmVjb3JkX3dpdGhfZnVuY3Rpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2Fub255bW91c19yZWNvcmRfd2l0aF9zdGF0aWMpCitESUFHX05BTUVfSU5ERVgoZXJyX2Fub255bW91c19yZWNvcmRfd2l0aF90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9hbm9ueW1vdXNfc3RydWN0X25vdF9tZW1iZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2Fub255bW91c191bmlvbl9ub3Rfc3RhdGljKQorRElBR19OQU1FX0lOREVYKGVycl9hbm9ueW1vdXNfdW5pb25fd2l0aF9zdG9yYWdlX3NwZWMpCitESUFHX05BTUVfSU5ERVgoZXJyX2FueXg4Nl9pbnRlcnJ1cHRfYXR0cmlidXRlKQorRElBR19OQU1FX0lOREVYKGVycl9hbnl4ODZfaW50ZXJydXB0X2NhbGxlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJjX2FycmF5X3BhcmFtX25vX293bmVyc2hpcCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJjX2Fzc2lnbl9wcm9wZXJ0eV9vd25lcnNoaXApCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY19hdG9taWNfb3duZXJzaGlwKQorRElBR19OQU1FX0lOREVYKGVycl9hcmNfYXV0b3JlbGVhc2luZ19jYXB0dXJlKQorRElBR19OQU1FX0lOREVYKGVycl9hcmNfYXV0b3JlbGVhc2luZ192YXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY19icmlkZ2VfY2FzdF9pbmNvbXBhdGlibGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY19icmlkZ2VfY2FzdF93cm9uZ19raW5kKQorRElBR19OQU1FX0lOREVYKGVycl9hcmNfYnJpZGdlX3JldGFpbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJjX2Nhc3RfcmVxdWlyZXNfYnJpZGdlKQorRElBR19OQU1FX0lOREVYKGVycl9hcmNfY29sbGVjdGlvbl9mb3J3YXJkKQorRElBR19OQU1FX0lOREVYKGVycl9hcmNfY29udmVzaW9uX29mX3dlYWtfdW5hdmFpbGFibGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY19nYWluZWRfbWV0aG9kX2NvbnZlbnRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY19pbGxlZ2FsX2V4cGxpY2l0X21lc3NhZ2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY19pbGxlZ2FsX21ldGhvZF9kZWYpCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY19pbGxlZ2FsX3NlbGVjdG9yKQorRElBR19OQU1FX0lOREVYKGVycl9hcmNfaW5jb25zaXN0ZW50X3Byb3BlcnR5X293bmVyc2hpcCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJjX2luZGlyZWN0X25vX293bmVyc2hpcCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJjX2luaXRfbWV0aG9kX3VucmVsYXRlZF9yZXN1bHRfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJjX2xvc3RfbWV0aG9kX2NvbnZlbnRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY19tYXlfbm90X3Jlc3BvbmQpCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY19tZXRob2Rfbm90X2ZvdW5kKQorRElBR19OQU1FX0lOREVYKGVycl9hcmNfbWlzbWF0Y2hlZF9jYXN0KQorRElBR19OQU1FX0lOREVYKGVycl9hcmNfbXVsdGlwbGVfbWV0aG9kX2RlY2wpCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY19uZXdfYXJyYXlfd2l0aG91dF9vd25lcnNoaXApCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY19ub2xpZmV0aW1lX2JlaGF2aW9yKQorRElBR19OQU1FX0lOREVYKGVycl9hcmNfbm9ubG9jYWxfd3JpdGViYWNrKQorRElBR19OQU1FX0lOREVYKGVycl9hcmNfb2JqY19vYmplY3RfaW5fdGFnKQorRElBR19OQU1FX0lOREVYKGVycl9hcmNfb2JqY19wcm9wZXJ0eV9kZWZhdWx0X2Fzc2lnbl9vbl9vYmplY3QpCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY19wZXJmb3JtX3NlbGVjdG9yX3JldGFpbnMpCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY19wc2V1ZG9fZHRvcl9pbmNvbnN0YW50X3F1YWxzKQorRElBR19OQU1FX0lOREVYKGVycl9hcmNfcmVjZWl2ZXJfZm9yd2FyZF9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJjX3JlY2VpdmVyX2ZvcndhcmRfaW5zdGFuY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY19zdHJvbmdfcHJvcGVydHlfb3duZXJzaGlwKQorRElBR19OQU1FX0lOREVYKGVycl9hcmNfdGhyZWFkX293bmVyc2hpcCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJjX3R5cGVjaGVja19jb252ZXJ0X2luY29tcGF0aWJsZV9wb2ludGVyKQorRElBR19OQU1FX0lOREVYKGVycl9hcmNfdW5zdXBwb3J0ZWRfb25fcnVudGltZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJjX3Vuc3VwcG9ydGVkX29uX3Rvb2xjaGFpbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJjX3Vuc3VwcG9ydGVkX3dlYWtfY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY191bnVzZWRfaW5pdF9tZXNzYWdlKQorRElBR19OQU1FX0lOREVYKGVycl9hcmNfd2Vha19kaXNhYmxlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJjX3dlYWtfaXZhcl9hY2Nlc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY193ZWFrX25vX3J1bnRpbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY193ZWFrX3VuYXZhaWxhYmxlX2Fzc2lnbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJjX3dlYWtfdW5hdmFpbGFibGVfcHJvcGVydHkpCitESUFHX05BTUVfSU5ERVgoZXJyX2FyY2hfdW5zdXBwb3J0ZWRfaXNhKQorRElBR19OQU1FX0lOREVYKGVycl9hcmNtdF9uc2ludm9jYXRpb25fb3duZXJzaGlwKQorRElBR19OQU1FX0lOREVYKGVycl9hcmdfd2l0aF9hZGRyZXNzX3NwYWNlKQorRElBR19OQU1FX0lOREVYKGVycl9hcmd1bWVudF9pbnZhbGlkX3JhbmdlKQorRElBR19OQU1FX0lOREVYKGVycl9hcmd1bWVudF9ub3RfbXVsdGlwbGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2FyZ3VtZW50X3JlcXVpcmVkX2FmdGVyX2F0dHJpYnV0ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJpdGhtZXRpY19ub25mcmFnaWxlX2ludGVyZmFjZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJtX2ludmFsaWRfc3BlY2lhbHJlZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJyYXlfZGVzaWduYXRvcl9lbXB0eV9yYW5nZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJyYXlfZGVzaWduYXRvcl9uZWdhdGl2ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJyYXlfZGVzaWduYXRvcl9ub25fYXJyYXkpCitESUFHX05BTUVfSU5ERVgoZXJyX2FycmF5X2Rlc2lnbmF0b3JfdG9vX2xhcmdlKQorRElBR19OQU1FX0lOREVYKGVycl9hcnJheV9pbml0X2RpZmZlcmVudF90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9hcnJheV9pbml0X2luY29tcGF0X3dpZGVfc3RyaW5nX2ludG9fd2NoYXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2FycmF5X2luaXRfbmFycm93X3N0cmluZ19pbnRvX3djaGFyKQorRElBR19OQU1FX0lOREVYKGVycl9hcnJheV9pbml0X25vbl9jb25zdGFudF9hcnJheSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJyYXlfaW5pdF9ub3RfaW5pdF9saXN0KQorRElBR19OQU1FX0lOREVYKGVycl9hcnJheV9pbml0X3dpZGVfc3RyaW5nX2ludG9fY2hhcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJyYXlfbmV3X25lZWRzX3NpemUpCitESUFHX05BTUVfSU5ERVgoZXJyX2FycmF5X29mX2Fic3RyYWN0X3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2FycmF5X3NlY3Rpb25fZG9lc19ub3Rfc3BlY2lmeV9jb250aWd1b3VzX3N0b3JhZ2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2FycmF5X3NpemVfYW1iaWd1b3VzX2NvbnZlcnNpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2FycmF5X3NpemVfZXhwbGljaXRfY29udmVyc2lvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJyYXlfc2l6ZV9pbmNvbXBsZXRlX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2FycmF5X3NpemVfbm9uX2ludCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJyYXlfc2l6ZV9ub3RfaW50ZWdyYWwpCitESUFHX05BTUVfSU5ERVgoZXJyX2FycmF5X3N0YXJfaW5fZnVuY3Rpb25fZGVmaW5pdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJyYXlfc3Rhcl9vdXRzaWRlX3Byb3RvdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJyYXlfc3RhdGljX25vdF9vdXRlcm1vc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX2FycmF5X3N0YXRpY19vdXRzaWRlX3Byb3RvdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXJyYXlfdG9vX2xhcmdlKQorRElBR19OQU1FX0lOREVYKGVycl9hc19xdWFsaWZpZWRfYXV0b19kZWNsKQorRElBR19OQU1FX0lOREVYKGVycl9hc21fYmFkX3JlZ2lzdGVyX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2FzbV9lbXB0eSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXNtX2VtcHR5X3N5bWJvbGljX29wZXJhbmRfbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXNtX2dvdG9fbm90X3N1cHBvcnRlZF95ZXQpCitESUFHX05BTUVfSU5ERVgoZXJyX2FzbV9pbW1lZGlhdGVfZXhwZWN0ZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2FzbV9pbmNvbXBsZXRlX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2FzbV9pbnB1dF9kdXBsaWNhdGVfbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX2FzbV9pbnZhbGlkX2VzY2FwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXNtX2ludmFsaWRfZ2xvYmFsX3Zhcl9yZWcpCitESUFHX05BTUVfSU5ERVgoZXJyX2FzbV9pbnZhbGlkX2lucHV0X2NvbnN0cmFpbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX2FzbV9pbnZhbGlkX2lucHV0X3NpemUpCitESUFHX05BTUVfSU5ERVgoZXJyX2FzbV9pbnZhbGlkX2x2YWx1ZV9pbl9pbnB1dCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXNtX2ludmFsaWRfbHZhbHVlX2luX291dHB1dCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXNtX2ludmFsaWRfb3BlcmFuZF9udW1iZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2FzbV9pbnZhbGlkX291dHB1dF9jb25zdHJhaW50KQorRElBR19OQU1FX0lOREVYKGVycl9hc21faW52YWxpZF9vdXRwdXRfc2l6ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXNtX2ludmFsaWRfdHlwZV9pbl9pbnB1dCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXNtX25ha2VkX3Bhcm1fcmVmKQorRElBR19OQU1FX0lOREVYKGVycl9hc21fbmFrZWRfdGhpc19yZWYpCitESUFHX05BTUVfSU5ERVgoZXJyX2FzbV9ub25fYWRkcl92YWx1ZV9pbl9tZW1vcnlfY29uc3RyYWludCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXNtX29wZXJhbmRfd2lkZV9zdHJpbmdfbGl0ZXJhbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXNtX3JlZ2lzdGVyX3NpemVfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX2FzbV90eWluZ19pbmNvbXBhdGlibGVfdHlwZXMpCitESUFHX05BTUVfSU5ERVgoZXJyX2FzbV91bmV4cGVjdGVkX2NvbnN0cmFpbnRfYWx0ZXJuYXRpdmVzKQorRElBR19OQU1FX0lOREVYKGVycl9hc21fdW5rbm93bl9yZWdpc3Rlcl9uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9hc21fdW5rbm93bl9zeW1ib2xpY19vcGVyYW5kX25hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX2FzbV91bnRlcm1pbmF0ZWRfc3ltYm9saWNfb3BlcmFuZF9uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9hc3NvY19jb21wYXRpYmxlX3R5cGVzKQorRElBR19OQU1FX0lOREVYKGVycl9hc3NvY190eXBlX2luY29tcGxldGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2Fzc29jX3R5cGVfbm9ub2JqZWN0KQorRElBR19OQU1FX0lOREVYKGVycl9hc3NvY190eXBlX3ZhcmlhYmx5X21vZGlmaWVkKQorRElBR19OQU1FX0lOREVYKGVycl9hdF9kZWZzX2N4eCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXRfaW5fY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0ZGVmX25vbmZyYWdpbGVfaW50ZXJmYWNlKQorRElBR19OQU1FX0lOREVYKGVycl9hdGltcG9ydCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXRvbWljX2J1aWx0aW5fbXVzdF9iZV9wb2ludGVyKQorRElBR19OQU1FX0lOREVYKGVycl9hdG9taWNfYnVpbHRpbl9tdXN0X2JlX3BvaW50ZXJfaW50Zmx0cHRyKQorRElBR19OQU1FX0lOREVYKGVycl9hdG9taWNfYnVpbHRpbl9tdXN0X2JlX3BvaW50ZXJfaW50cHRyKQorRElBR19OQU1FX0lOREVYKGVycl9hdG9taWNfYnVpbHRpbl9wb2ludGVyX3NpemUpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0b21pY19leGNsdXNpdmVfYnVpbHRpbl9wb2ludGVyX3NpemUpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0b21pY19sb2FkX3N0b3JlX3VzZXNfbGliKQorRElBR19OQU1FX0lOREVYKGVycl9hdG9taWNfb3BfYml0d2lzZV9uZWVkc19hdG9taWNfaW50KQorRElBR19OQU1FX0lOREVYKGVycl9hdG9taWNfb3BfaGFzX2ludmFsaWRfc3luY2hfc2NvcGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0b21pY19vcF9uZWVkc19hdG9taWMpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0b21pY19vcF9uZWVkc19hdG9taWNfaW50X29yX3B0cikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXRvbWljX29wX25lZWRzX25vbl9jb25zdF9hdG9taWMpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0b21pY19vcF9uZWVkc19ub25fY29uc3RfcG9pbnRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXRvbWljX29wX25lZWRzX3RyaXZpYWxfY29weSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXRvbWljX3Byb3BlcnR5X25vbnRyaXZpYWxfYXNzaWduX29wKQorRElBR19OQU1FX0lOREVYKGVycl9hdG9taWNfc3BlY2lmaWVyX2JhZF90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyX2NvbmRfbmV2ZXJfY29uc3RhbnRfZXhwcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cl9vYmpjX293bmVyc2hpcF9yZWR1bmRhbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJfdGxzbW9kZWxfYXJnKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfYWRkcmVzc19mdW5jdGlvbl90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfYWRkcmVzc19tdWx0aXBsZV9xdWFsaWZpZXJzKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfYWRkcmVzc19zcGFjZV9uZWdhdGl2ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX2FkZHJlc3Nfc3BhY2VfdG9vX2hpZ2gpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9hbGlnbmVkX3Rvb19ncmVhdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX2FyZ3VtZW50X2ludmFsaWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9hcmd1bWVudF9pc196ZXJvKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfYXJndW1lbnRfbl90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfYXJndW1lbnRfb3V0X29mX2JvdW5kcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX2FyZ3VtZW50X291dF9vZl9yYW5nZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX2FyZ3VtZW50X291dG9mX3JhbmdlKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfYXJndW1lbnRfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX2FyZ3VtZW50X3ZlY190eXBlX2hpbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9iYWRfbmVvbl92ZWN0b3Jfc2l6ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX2NsZWFudXBfYXJnX25vdF9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX2NsZWFudXBfZnVuY19hcmdfaW5jb21wYXRpYmxlX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9jbGVhbnVwX2Z1bmNfbXVzdF90YWtlX29uZV9hcmcpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9kbGxfYW1iaWd1b3VzX2RlZmF1bHRfY3RvcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX2RsbF9kZWxldGVkKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfZGxsX2xhbWJkYSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX2RsbF9tZW1iZXJfb2ZfZGxsX2NsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfZGxsX25vdF9leHRlcm4pCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9kbGxfcmVkZWNsYXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX2RsbF90aHJlYWRfbG9jYWwpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9kbGxpbXBvcnRfZGF0YV9kZWZpbml0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfZGxsaW1wb3J0X2Z1bmN0aW9uX2RlZmluaXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9kbGxpbXBvcnRfc3RhdGljX2ZpZWxkX2RlZmluaXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9pbnRlZ2Vyc19vbmx5KQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfaW52YWxpZF9pbXBsaWNpdF90aGlzX2FyZ3VtZW50KQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfaW52YWxpZF9zaXplKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfaW52YWxpZF92ZWN0b3JfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX211bHRpcGxlX29iamNfZ2MpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9ub19tZW1iZXJfcG9pbnRlcnMpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9ub3RfaW1wb3J0X2F0dHIpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9ub3RfbW9kdWxlX2F0dHIpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9ub3Rfc3VwcG9ydGVkX2luX2xhbmcpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9ub3Rfc3VwcG9ydGVkX29uX2FyY2gpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9ub3RfdHlwZV9hdHRyKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfb25seV9vbmNlX3Blcl9wYXJhbWV0ZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9vdmVybG9hZGFibGVfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9vdmVybG9hZGFibGVfbXVsdGlwbGVfdW5tYXJrZWRfb3ZlcmxvYWRzKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfb3ZlcmxvYWRhYmxlX25vX3Byb3RvdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX3BvaW50ZXJzX29ubHkpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV9yZWdwYXJtX2ludmFsaWRfbnVtYmVyKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfcmVncGFybV93cm9uZ19wbGF0Zm9ybSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX3JlcXVpcmVzX2FyZ3VtZW50cykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX3JlcXVpcmVzX29wZW5jbF92ZXJzaW9uKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfcmVxdWlyZXNfcG9zaXRpdmVfaW50ZWdlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX3NlY3Rpb25faW52YWxpZF9mb3JfdGFyZ2V0KQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfc2VsZWN0YW55X25vbl9leHRlcm5fZGF0YSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX3NlbnRpbmVsX2xlc3NfdGhhbl96ZXJvKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfc2VudGluZWxfbm90X3plcm9fb3Jfb25lKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfc2l6ZV90b29fbGFyZ2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV90b29fZmV3X2FyZ3VtZW50cykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX3Rvb19tYW55X2FyZ3VtZW50cykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX3Vuc3VwcG9ydGVkKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfdXVpZF9tYWxmb3JtZWRfZ3VpZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX3ZlY3JldHVybl9vbmx5X3BvZF9yZWNvcmQpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV92ZWNyZXR1cm5fb25seV92ZWN0b3JfbWVtYmVyKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfd2Vha19zdGF0aWMpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV93ZWFrcmVmX25vdF9nbG9iYWxfY29udGV4dCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX3dlYWtyZWZfbm90X3N0YXRpYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX3dlYWtyZWZfd2l0aG91dF9hbGlhcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZV93cm9uZ19udW1iZXJfYXJndW1lbnRzKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVfemVyb19zaXplKQorRElBR19OQU1FX0lOREVYKGVycl9hdHRyaWJ1dGVzX2FyZV9ub3RfY29tcGF0aWJsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXR0cmlidXRlc19taXNwbGFjZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2F0dHJpYnV0ZXNfbm90X2FsbG93ZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2F1dG9fYml0ZmllbGQpCitESUFHX05BTUVfSU5ERVgoZXJyX2F1dG9fZGlmZmVyZW50X2RlZHVjdGlvbnMpCitESUFHX05BTUVfSU5ERVgoZXJyX2F1dG9fZm5fZGVkdWN0aW9uX2ZhaWx1cmUpCitESUFHX05BTUVfSU5ERVgoZXJyX2F1dG9fZm5fZGlmZmVyZW50X2RlZHVjdGlvbnMpCitESUFHX05BTUVfSU5ERVgoZXJyX2F1dG9fZm5fbm9fcmV0dXJuX2J1dF9ub3RfYXV0bykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXV0b19mbl9yZXR1cm5faW5pdF9saXN0KQorRElBR19OQU1FX0lOREVYKGVycl9hdXRvX2ZuX3JldHVybl92b2lkX2J1dF9ub3RfYXV0bykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXV0b19mbl91c2VkX2JlZm9yZV9kZWZpbmVkKQorRElBR19OQU1FX0lOREVYKGVycl9hdXRvX2ZuX3ZpcnR1YWwpCitESUFHX05BTUVfSU5ERVgoZXJyX2F1dG9faW5jb25zaXN0ZW50X2RlZHVjdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXV0b19pbml0X2xpc3RfZnJvbV9jKQorRElBR19OQU1FX0lOREVYKGVycl9hdXRvX21pc3NpbmdfdHJhaWxpbmdfcmV0dXJuKQorRElBR19OQU1FX0lOREVYKGVycl9hdXRvX25ld19jdG9yX211bHRpcGxlX2V4cHJlc3Npb25zKQorRElBR19OQU1FX0lOREVYKGVycl9hdXRvX25ld19kZWR1Y3Rpb25fZmFpbHVyZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXV0b19uZXdfcmVxdWlyZXNfY3Rvcl9hcmcpCitESUFHX05BTUVfSU5ERVgoZXJyX2F1dG9fbm9uX2RlZHVjZWRfbm90X2Fsb25lKQorRElBR19OQU1FX0lOREVYKGVycl9hdXRvX25vdF9hbGxvd2VkKQorRElBR19OQU1FX0lOREVYKGVycl9hdXRvX25vdF9hbGxvd2VkX3Zhcl9pbnN0KQorRElBR19OQU1FX0lOREVYKGVycl9hdXRvX3Zhcl9kZWR1Y3Rpb25fZmFpbHVyZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXV0b192YXJfZGVkdWN0aW9uX2ZhaWx1cmVfZnJvbV9pbml0X2xpc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX2F1dG9fdmFyX2luaXRfbXVsdGlwbGVfZXhwcmVzc2lvbnMpCitESUFHX05BTUVfSU5ERVgoZXJyX2F1dG9fdmFyX2luaXRfbm9fZXhwcmVzc2lvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXV0b192YXJfaW5pdF9wYXJlbl9icmFjZXMpCitESUFHX05BTUVfSU5ERVgoZXJyX2F1dG9fdmFyX3JlcXVpcmVzX2luaXQpCitESUFHX05BTUVfSU5ERVgoZXJyX2F1dG9fdmFyaWFibGVfY2Fubm90X2FwcGVhcl9pbl9vd25faW5pdGlhbGl6ZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2F2YWlsX3F1ZXJ5X2V4cGVjdGVkX3BsYXRmb3JtX25hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX2F2YWlsX3F1ZXJ5X3VucmVjb2duaXplZF9wbGF0Zm9ybV9uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9hdmFpbGFiaWxpdHlfZXhwZWN0ZWRfY2hhbmdlKQorRElBR19OQU1FX0lOREVYKGVycl9hdmFpbGFiaWxpdHlfZXhwZWN0ZWRfcGxhdGZvcm0pCitESUFHX05BTUVfSU5ERVgoZXJyX2F2YWlsYWJpbGl0eV9xdWVyeV9yZXBlYXRlZF9wbGF0Zm9ybSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXZhaWxhYmlsaXR5X3F1ZXJ5X3JlcGVhdGVkX3N0YXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2F2YWlsYWJpbGl0eV9xdWVyeV93aWxkY2FyZF9yZXF1aXJlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXZhaWxhYmlsaXR5X3JlZHVuZGFudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYXZhaWxhYmlsaXR5X3Vua25vd25fY2hhbmdlKQorRElBR19OQU1FX0lOREVYKGVycl9hd2FpdF9zdXNwZW5kX2ludmFsaWRfcmV0dXJuX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2JhZF9jYXRlZ29yeV9wcm9wZXJ0eV9kZWNsKQorRElBR19OQU1FX0lOREVYKGVycl9iYWRfY2hhcmFjdGVyX2VuY29kaW5nKQorRElBR19OQU1FX0lOREVYKGVycl9iYWRfY29uc3RfY2FzdF9kZXN0KQorRElBR19OQU1FX0lOREVYKGVycl9iYWRfY3N0eWxlX2Nhc3Rfb3ZlcmxvYWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2JhZF9jeHhfY2FzdF9iaXRmaWVsZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYmFkX2N4eF9jYXN0X2dlbmVyaWMpCitESUFHX05BTUVfSU5ERVgoZXJyX2JhZF9jeHhfY2FzdF9tZW1iZXJfcG9pbnRlcl9zaXplKQorRElBR19OQU1FX0lOREVYKGVycl9iYWRfY3h4X2Nhc3RfcXVhbGlmaWVyc19hd2F5KQorRElBR19OQU1FX0lOREVYKGVycl9iYWRfY3h4X2Nhc3RfcnZhbHVlKQorRElBR19OQU1FX0lOREVYKGVycl9iYWRfY3h4X2Nhc3Rfc2NhbGFyX3RvX3ZlY3Rvcl9kaWZmZXJlbnRfc2l6ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYmFkX2N4eF9jYXN0X3VucmVsYXRlZF9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYmFkX2N4eF9jYXN0X3ZlY3Rvcl90b19zY2FsYXJfZGlmZmVyZW50X3NpemUpCitESUFHX05BTUVfSU5ERVgoZXJyX2JhZF9jeHhfY2FzdF92ZWN0b3JfdG9fdmVjdG9yX2RpZmZlcmVudF9zaXplKQorRElBR19OQU1FX0lOREVYKGVycl9iYWRfZHluYW1pY19jYXN0X2luY29tcGxldGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2JhZF9keW5hbWljX2Nhc3Rfbm90X2NsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl9iYWRfZHluYW1pY19jYXN0X25vdF9wb2x5bW9ycGhpYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYmFkX2R5bmFtaWNfY2FzdF9ub3RfcHRyKQorRElBR19OQU1FX0lOREVYKGVycl9iYWRfZHluYW1pY19jYXN0X25vdF9yZWZfb3JfcHRyKQorRElBR19OQU1FX0lOREVYKGVycl9iYWRfa2VybmVsX3BhcmFtX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2JhZF9sdmFsdWVfdG9fcnZhbHVlX2Nhc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX2JhZF9tZW1wdHJfbGhzKQorRElBR19OQU1FX0lOREVYKGVycl9iYWRfbWVtcHRyX3JocykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYmFkX211bHRpdmVyc2lvbl9vcHRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2JhZF9uZXdfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYmFkX3BhcmFtZXRlcl9uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9iYWRfcHJvcGVydHlfY29udGV4dCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYmFkX3Byb3BlcnR5X2RlY2wpCitESUFHX05BTUVfSU5ERVgoZXJyX2JhZF9yZWNlaXZlcl90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9iYWRfcmVpbnRlcnByZXRfY2FzdF9vdmVybG9hZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYmFkX3JlaW50ZXJwcmV0X2Nhc3RfcmVmZXJlbmNlKQorRElBR19OQU1FX0lOREVYKGVycl9iYWRfcmVpbnRlcnByZXRfY2FzdF9zbWFsbF9pbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX2JhZF9ydmFsdWVfdG9fcnZhbHVlX2Nhc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX2JhZF9zdGF0aWNfY2FzdF9tZW1iZXJfcG9pbnRlcl9ub25tcCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYmFkX3N0YXRpY19jYXN0X292ZXJsb2FkKQorRElBR19OQU1FX0lOREVYKGVycl9iYWRfc3RhdGljX2Nhc3RfcG9pbnRlcl9ub25wb2ludGVyKQorRElBR19OQU1FX0lOREVYKGVycl9iYWRfc3RyaW5nX2VuY29kaW5nKQorRElBR19OQU1FX0lOREVYKGVycl9iYWRfdmFyaWFibGVfbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYmFzZV9jbGFzc19oYXNfZmxleGlibGVfYXJyYXlfbWVtYmVyKQorRElBR19OQU1FX0lOREVYKGVycl9iYXNlX2NsYXVzZV9vbl91bmlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYmFzZV9pbml0X2RpcmVjdF9hbmRfdmlydHVhbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYmFzZV9pbml0X2RvZXNfbm90X25hbWVfY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX2Jhc2VfbXVzdF9iZV9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYmFzZV9zcGVjaWZpZXJfYXR0cmlidXRlKQorRElBR19OQU1FX0lOREVYKGVycl9iaW5kaW5nX2Nhbm5vdF9hcHBlYXJfaW5fb3duX2luaXRpYWxpemVyKQorRElBR19OQU1FX0lOREVYKGVycl9iaXRmaWVsZF9oYXNfbmVnYXRpdmVfd2lkdGgpCitESUFHX05BTUVfSU5ERVgoZXJyX2JpdGZpZWxkX2hhc196ZXJvX3dpZHRoKQorRElBR19OQU1FX0lOREVYKGVycl9iaXRmaWVsZF93aWR0aF9leGNlZWRzX3R5cGVfd2lkdGgpCitESUFHX05BTUVfSU5ERVgoZXJyX2Jsb2NrX2RlY2xfcmVmX25vdF9tb2RpZmlhYmxlX2x2YWx1ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYmxvY2tfZXh0ZXJuX2NhbnRfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYmxvY2tfb25fbm9ubG9jYWwpCitESUFHX05BTUVfSU5ERVgoZXJyX2Jsb2NrX29uX3ZtKQorRElBR19OQU1FX0lOREVYKGVycl9ibG9ja19yZXR1cm5fbWlzc2luZ19leHByKQorRElBR19OQU1FX0lOREVYKGVycl9ibG9ja19yZXR1cm5pbmdfYXJyYXlfZnVuY3Rpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2Jsb2Nrc19kaXNhYmxlKQorRElBR19OQU1FX0lOREVYKGVycl9ib29sX3JlZGVjbGFyYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2JvdW5kX21lbWJlcl9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYm94X2xpdGVyYWxfY29sbGVjdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYnJhY2tldF9kZXB0aF9leGNlZWRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYnJhY2tldHNfZ29fYWZ0ZXJfdW5xdWFsaWZpZWRfaWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2JyZWFrX25vdF9pbl9sb29wX29yX3N3aXRjaCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYnVpbHRpbl9hbm5vdGF0aW9uX2ZpcnN0X2FyZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfYnVpbHRpbl9hbm5vdGF0aW9uX3NlY29uZF9hcmcpCitESUFHX05BTUVfSU5ERVgoZXJyX2J1aWx0aW5fZGVmaW5pdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfYnVpbHRpbl9mbl91c2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2J1aWx0aW5fZnVuY19jYXN0X21vcmVfdGhhbl9vbmVfYXJnKQorRElBR19OQU1FX0lOREVYKGVycl9idWlsdGluX2xvbmdqbXBfaW52YWxpZF92YWwpCitESUFHX05BTUVfSU5ERVgoZXJyX2J1aWx0aW5fbG9uZ2ptcF91bnN1cHBvcnRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYnVpbHRpbl9uZWVkc19mZWF0dXJlKQorRElBR19OQU1FX0lOREVYKGVycl9idWlsdGluX29wZXJhdG9yX25ld19kZWxldGVfbm90X3VzdWFsKQorRElBR19OQU1FX0lOREVYKGVycl9idWlsdGluX3JlcXVpcmVzX2xhbmd1YWdlKQorRElBR19OQU1FX0lOREVYKGVycl9idWlsdGluX3NldGptcF91bnN1cHBvcnRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfYnVpbHRpbl94NjRfYWFyY2g2NF9vbmx5KQorRElBR19OQU1FX0lOREVYKGVycl9jMTFfbm9yZXR1cm5fbWlzcGxhY2VkKQorRElBR19OQU1FX0lOREVYKGVycl9jOTlfYXJyYXlfdXNhZ2VfY3h4KQorRElBR19OQU1FX0lOREVYKGVycl9jYWxsX2Z1bmN0aW9uX2luY29tcGxldGVfcmV0dXJuKQorRElBR19OQU1FX0lOREVYKGVycl9jYWxsX2luY29tcGxldGVfYXJndW1lbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX2NhbGxfaW5jb21wbGV0ZV9yZXR1cm4pCitESUFHX05BTUVfSU5ERVgoZXJyX2Nhbm5vdF9maW5kX3N1aXRhYmxlX2FjY2Vzc29yKQorRElBR19OQU1FX0lOREVYKGVycl9jYW5ub3RfZm9ybV9wb2ludGVyX3RvX21lbWJlcl9vZl9yZWZlcmVuY2VfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY2Fubm90X29wZW5fZmlsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY2Fubm90X3Bhc3Nfbm9uX3RyaXZpYWxfY19zdHJ1Y3RfdG9fdmFyYXJnKQorRElBR19OQU1FX0lOREVYKGVycl9jYW5ub3RfcGFzc19vYmpjX2ludGVyZmFjZV90b192YXJhcmcpCitESUFHX05BTUVfSU5ERVgoZXJyX2Nhbm5vdF9wYXNzX29iamNfaW50ZXJmYWNlX3RvX3ZhcmFyZ19mb3JtYXQpCitESUFHX05BTUVfSU5ERVgoZXJyX2Nhbm5vdF9wYXNzX3RvX3ZhcmFyZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfY2Fubm90X3Bhc3NfdG9fdmFyYXJnX2Zvcm1hdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY2FwdHVyZV9ibG9ja192YXJpYWJsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY2FwdHVyZV9kZWZhdWx0X25vbl9sb2NhbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY2FwdHVyZV9kb2VzX25vdF9uYW1lX3ZhcmlhYmxlKQorRElBR19OQU1FX0lOREVYKGVycl9jYXB0dXJlX21vcmVfdGhhbl9vbmNlKQorRElBR19OQU1FX0lOREVYKGVycl9jYXB0dXJlX25vbl9hdXRvbWF0aWNfdmFyaWFibGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2NhcHR1cmVfb2ZfYWJzdHJhY3RfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY2FwdHVyZV9vZl9pbmNvbXBsZXRlX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2NhcnJpZXNfZGVwZW5kZW5jeV9taXNzaW5nX29uX2ZpcnN0X2RlY2wpCitESUFHX05BTUVfSU5ERVgoZXJyX2NhcnJpZXNfZGVwZW5kZW5jeV9wYXJhbV9ub3RfZnVuY3Rpb25fZGVjbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY2FzZV9ub3RfaW5fc3dpdGNoKQorRElBR19OQU1FX0lOREVYKGVycl9jYXN0X3BvaW50ZXJfZnJvbV9ub25fcG9pbnRlcl9pbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX2Nhc3RfcG9pbnRlcl90b19ub25fcG9pbnRlcl9pbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX2Nhc3Rfc2VsZWN0b3JfZXhwcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfY2F0Y2hfaW5jb21wbGV0ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY2F0Y2hfaW5jb21wbGV0ZV9wdHIpCitESUFHX05BTUVfSU5ERVgoZXJyX2NhdGNoX2luY29tcGxldGVfcmVmKQorRElBR19OQU1FX0lOREVYKGVycl9jYXRjaF9wYXJhbV9ub3Rfb2JqY190eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9jYXRjaF9ydmFsdWVfcmVmKQorRElBR19OQU1FX0lOREVYKGVycl9jYXRjaF92YXJpYWJseV9tb2RpZmllZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY2F0ZWdvcnlfZm9yd2FyZF9pbnRlcmZhY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2NhdGVnb3J5X3Byb3BlcnR5KQorRElBR19OQU1FX0lOREVYKGVycl9jY29udl9jaGFuZ2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2Njb252X2tucikKK0RJQUdfTkFNRV9JTkRFWChlcnJfY2NvbnZfdmFyYXJncykKK0RJQUdfTkFNRV9JTkRFWChlcnJfY2ZzdHJpbmdfbGl0ZXJhbF9ub3Rfc3RyaW5nX2NvbnN0YW50KQorRElBR19OQU1FX0lOREVYKGVycl9jaGFyYWN0ZXJfdG9vX2xhcmdlKQorRElBR19OQU1FX0lOREVYKGVycl9jaXJjdWxhcl9pbmhlcml0YW5jZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY2xhc3NfZXh0ZW5zaW9uX2FmdGVyX2ltcGwpCitESUFHX05BTUVfSU5ERVgoZXJyX2NsYXNzX21hcmtlZF9maW5hbF91c2VkX2FzX2Jhc2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2NsYXNzX29uX3RlbXBsYXRlX3RlbXBsYXRlX3BhcmFtKQorRElBR19OQU1FX0lOREVYKGVycl9jbGFzc19wcm9wZXJ0eV9mb3VuZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY2xhc3NfcmVkZWNsYXJlZF93aXRoX2RpZmZlcmVudF9hY2Nlc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvY29hX25hbWluZ19vd25lZF9ydWxlKQorRElBR19OQU1FX0lOREVYKGVycl9jb2xsZWN0aW9uX2V4cHJfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29tcGxleF9tb2RlX3ZlY3Rvcl90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9jb21wb3VuZF9xdWFsaWZpZWRfZnVuY3Rpb25fdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uY2VwdF9kZWNsX2ludmFsaWRfc3BlY2lmaWVycykKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uY2VwdF9kZWNsc19tYXlfb25seV9hcHBlYXJfaW5fbmFtZXNwYWNlX3Njb3BlKQorRElBR19OQU1FX0lOREVYKGVycl9jb25jZXB0X3NwZWNpYWxpemVkKQorRElBR19OQU1FX0lOREVYKGVycl9jb25jZXB0X3NwZWNpZmllZF9zcGVjaWFsaXphdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uY2VwdF93cm9uZ19kZWNsX2tpbmQpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvbmRfdm9pZHB0cl9hcmMpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvbmRpdGlvbmFsX2FtYmlndW91cykKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uZGl0aW9uYWxfYW1iaWd1b3VzX292bCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uZGl0aW9uYWxfdmVjdG9yX2VsZW1lbnRfc2l6ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uZGl0aW9uYWxfdmVjdG9yX3NpemUpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvbmRpdGlvbmFsX3ZvaWRfbm9udm9pZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uZmlnX3NjYWxhcl9yZXR1cm4pCitESUFHX05BTUVfSU5ERVgoZXJyX2NvbmZsaWN0X21hcmtlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uZmxpY3RpbmdfYWxpYXNpbmdfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uZmxpY3RpbmdfaXZhcl9iaXR3aWR0aCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uZmxpY3RpbmdfaXZhcl9uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9jb25mbGljdGluZ19pdmFyX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvbmZsaWN0aW5nX292ZXJyaWRpbmdfY2NfYXR0cmlidXRlcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uZmxpY3Rpbmdfc3VwZXJfY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvbmZsaWN0aW5nX3R5cGVzKQorRElBR19OQU1FX0lOREVYKGVycl9jb25zdGFudF9pbnRlZ2VyX2FyZ190eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9jb25zdGV4cHJfYm9keV9pbnZhbGlkX3N0bXQpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvbnN0ZXhwcl9ib2R5X25vX3JldHVybikKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uc3RleHByX2N0b3JfbWlzc2luZ19pbml0KQorRElBR19OQU1FX0lOREVYKGVycl9jb25zdGV4cHJfZHRvcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uc3RleHByX2Z1bmN0aW9uX3RyeV9ibG9jaykKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uc3RleHByX2xvY2FsX3Zhcl9ub19pbml0KQorRElBR19OQU1FX0lOREVYKGVycl9jb25zdGV4cHJfbG9jYWxfdmFyX25vbl9saXRlcmFsX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvbnN0ZXhwcl9sb2NhbF92YXJfc3RhdGljKQorRElBR19OQU1FX0lOREVYKGVycl9jb25zdGV4cHJfbWFpbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uc3RleHByX25vX2RlY2xhcmF0b3JzKQorRElBR19OQU1FX0lOREVYKGVycl9jb25zdGV4cHJfbm9uX2xpdGVyYWxfcGFyYW0pCitESUFHX05BTUVfSU5ERVgoZXJyX2NvbnN0ZXhwcl9ub25fbGl0ZXJhbF9yZXR1cm4pCitESUFHX05BTUVfSU5ERVgoZXJyX2NvbnN0ZXhwcl9yZWRlY2xfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvbnN0ZXhwcl9yZXR1cm5fbWlzc2luZ19leHByKQorRElBR19OQU1FX0lOREVYKGVycl9jb25zdGV4cHJfc3RhdGljX21lbV92YXJfcmVxdWlyZXNfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uc3RleHByX3RhZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uc3RleHByX3VuaW9uX2N0b3Jfbm9faW5pdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uc3RleHByX3Zhcl9ub25fbGl0ZXJhbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uc3RleHByX3Zhcl9yZXF1aXJlc19jb25zdF9pbml0KQorRElBR19OQU1FX0lOREVYKGVycl9jb25zdGV4cHJfdmlydHVhbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uc3RleHByX3ZpcnR1YWxfYmFzZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uc3RleHByX3ZsYSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29uc3RydWN0b3JfYmFkX25hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvbnN0cnVjdG9yX2J5dmFsdWVfYXJnKQorRElBR19OQU1FX0lOREVYKGVycl9jb25zdHJ1Y3Rvcl9jYW5ub3RfYmUpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvbnN0cnVjdG9yX3JlZGVjbGFyZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvbnN0cnVjdG9yX3JldHVybl90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9jb250aW51YXRpb25fY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvbnRpbnVlX25vdF9pbl9sb29wKQorRElBR19OQU1FX0lOREVYKGVycl9jb252X2Z1bmN0aW9uX25vdF9tZW1iZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvbnZfZnVuY3Rpb25fcmVkZWNsYXJlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29udl9mdW5jdGlvbl9yZXR1cm5fdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29udl9mdW5jdGlvbl90b19hcnJheSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29udl9mdW5jdGlvbl90b19mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29udl9mdW5jdGlvbl92YXJpYWRpYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29udl9mdW5jdGlvbl93aXRoX2NvbXBsZXhfZGVjbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29udl9mdW5jdGlvbl93aXRoX3BhcmFtcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29udmVydHZlY3Rvcl9pbmNvbXBhdGlibGVfdmVjdG9yKQorRElBR19OQU1FX0lOREVYKGVycl9jb252ZXJ0dmVjdG9yX25vbl92ZWN0b3IpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvbnZlcnR2ZWN0b3Jfbm9uX3ZlY3Rvcl90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9jb3B5X2NhcHR1cmVfd2l0aF9jb3B5X2RlZmF1bHQpCitESUFHX05BTUVfSU5ERVgoZXJyX2Nvcm91dGluZV9oYW5kbGVfbWlzc2luZ19tZW1iZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2Nvcm91dGluZV9pbnZhbGlkX2Z1bmNfY29udGV4dCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29yb3V0aW5lX29iamNfbWV0aG9kKQorRElBR19OQU1FX0lOREVYKGVycl9jb3JvdXRpbmVfb3V0c2lkZV9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29yb3V0aW5lX3Byb21pc2VfZ2V0X3JldHVybl9vYmplY3Rfb25fYWxsb2NhdGlvbl9mYWlsdXJlKQorRElBR19OQU1FX0lOREVYKGVycl9jb3JvdXRpbmVfcHJvbWlzZV9pbmNvbXBhdGlibGVfcmV0dXJuX2Z1bmN0aW9ucykKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29yb3V0aW5lX3Byb21pc2VfbmV3X3JlcXVpcmVzX25vdGhyb3cpCitESUFHX05BTUVfSU5ERVgoZXJyX2Nvcm91dGluZV9wcm9taXNlX3JlcXVpcmVzX3JldHVybl9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfY29yb3V0aW5lX3Byb21pc2VfdHlwZV9pbmNvbXBsZXRlKQorRElBR19OQU1FX0lOREVYKGVycl9jb3JvdXRpbmVfcHJvbWlzZV91bmhhbmRsZWRfZXhjZXB0aW9uX3JlcXVpcmVkKQorRElBR19OQU1FX0lOREVYKGVycl9jb3JvdXRpbmVfdHlwZV9taXNzaW5nX3NwZWNpYWxpemF0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9jb3JvdXRpbmVfdW5ldmFsdWF0ZWRfY29udGV4dCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY292YXJpYW50X3JldHVybl9hbWJpZ3VvdXNfZGVyaXZlZF90b19iYXNlX2NvbnYpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvdmFyaWFudF9yZXR1cm5faW5hY2Nlc3NpYmxlX2Jhc2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvdmFyaWFudF9yZXR1cm5faW5jb21wbGV0ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY292YXJpYW50X3JldHVybl9ub3RfZGVyaXZlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY292YXJpYW50X3JldHVybl90eXBlX2NsYXNzX3R5cGVfbW9yZV9xdWFsaWZpZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2NvdmFyaWFudF9yZXR1cm5fdHlwZV9kaWZmZXJlbnRfcXVhbGlmaWNhdGlvbnMpCitESUFHX05BTUVfSU5ERVgoZXJyX2NwdV91bnN1cHBvcnRlZF9pc2EpCitESUFHX05BTUVfSU5ERVgoZXJyX2N0b3JfZHRvcl9yZXR1cm5zX3ZvaWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2N0b3JfaW5pdF9taXNzaW5nX2NvbW1hKQorRElBR19OQU1FX0lOREVYKGVycl9jdWRhX2RldmljZV9leGNlcHRpb25zKQorRElBR19OQU1FX0lOREVYKGVycl9jdWRhX2V4dGVybl9zaGFyZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2N1ZGFfaG9zdF9zaGFyZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2N1ZGFfbm9uZ2xvYmFsX2NvbnN0YW50KQorRElBR19OQU1FX0lOREVYKGVycl9jdWRhX292bF90YXJnZXQpCitESUFHX05BTUVfSU5ERVgoZXJyX2N1ZGFfdW5hdHRyaWJ1dGVkX2NvbnN0ZXhwcl9jYW5ub3Rfb3ZlcmxvYWRfZGV2aWNlKQorRElBR19OQU1FX0lOREVYKGVycl9jdWRhX3ZsYSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY3VycmVudF9tb2R1bGVfbmFtZV9taXNtYXRjaCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfY3h4MTFfYXR0cmlidXRlX2ZvcmJpZHNfYXJndW1lbnRzKQorRElBR19OQU1FX0lOREVYKGVycl9jeHgxMV9hdHRyaWJ1dGVfZm9yYmlkc19lbGxpcHNpcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfY3h4MTFfYXR0cmlidXRlX3JlcGVhdGVkKQorRElBR19OQU1FX0lOREVYKGVycl9jeWNsaWNfYWxpYXMpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlYWxsb2NfYmFkX3Jlc3VsdF90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9kZWNpbWFsX3Vuc3VwcG9ydGVkKQorRElBR19OQU1FX0lOREVYKGVycl9kZWNsX2F0dHJpYnV0ZV9pbnZhbGlkX29uX3N0bXQpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlY2xfbmVnYXRpdmVfYXJyYXlfc2l6ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVjbGFyYXRpb25fZG9lc19ub3RfZGVjbGFyZV9wYXJhbSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVjbGFyYXRvcl9uZWVkX2lkZW50KQorRElBR19OQU1FX0lOREVYKGVycl9kZWNsc3BlY19hZnRlcl92aXJ0c3BlYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVjbHNwZWNfdGhyZWFkX29uX3RocmVhZF92YXJpYWJsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVjbHR5cGVfYXV0b19jYW5ub3RfYmVfY29tYmluZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlY2x0eXBlX2F1dG9fY29tcG91bmRfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVjbHR5cGVfYXV0b19mdW5jdGlvbl9kZWNsYXJhdG9yX25vdF9kZWNsYXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVjbHR5cGVfYXV0b19pbml0aWFsaXplcl9saXN0KQorRElBR19OQU1FX0lOREVYKGVycl9kZWNsdHlwZV9hdXRvX2ludmFsaWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlY2x0eXBlX2luX2RlY2xhcmF0b3IpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlY29tcF9kZWNsX2FtYmlndW91c19iYXNlKQorRElBR19OQU1FX0lOREVYKGVycl9kZWNvbXBfZGVjbF9hbm9uX3VuaW9uX21lbWJlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVjb21wX2RlY2xfY29udGV4dCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVjb21wX2RlY2xfbXVsdGlwbGVfYmFzZXNfd2l0aF9tZW1iZXJzKQorRElBR19OQU1FX0lOREVYKGVycl9kZWNvbXBfZGVjbF9ub25fcHVibGljX2Jhc2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlY29tcF9kZWNsX25vbl9wdWJsaWNfbWVtYmVyKQorRElBR19OQU1FX0lOREVYKGVycl9kZWNvbXBfZGVjbF9ub3RfYWxvbmUpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlY29tcF9kZWNsX3BhcmVucykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVjb21wX2RlY2xfcmVxdWlyZXNfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVjb21wX2RlY2xfc3BlYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVjb21wX2RlY2xfc3RkX3R1cGxlX2VsZW1lbnRfbm90X3NwZWNpYWxpemVkKQorRElBR19OQU1FX0lOREVYKGVycl9kZWNvbXBfZGVjbF9zdGRfdHVwbGVfc2l6ZV9ub3RfY29uc3RhbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlY29tcF9kZWNsX3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKGVycl9kZWNvbXBfZGVjbF90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9kZWNvbXBfZGVjbF91bmJpbmRhYmxlX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlY29tcF9kZWNsX3dyb25nX251bWJlcl9iaW5kaW5ncykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVjcmVtZW50X2Jvb2wpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlZHVjZWRfY2xhc3NfdGVtcGxhdGVfY29tcG91bmRfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVkdWNlZF9jbGFzc190ZW1wbGF0ZV9jdG9yX2FtYmlndW91cykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVkdWNlZF9jbGFzc190ZW1wbGF0ZV9jdG9yX25vX3ZpYWJsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVkdWNlZF9jbGFzc190ZW1wbGF0ZV9kZWxldGVkKQorRElBR19OQU1FX0lOREVYKGVycl9kZWR1Y2VkX2NsYXNzX3RlbXBsYXRlX2V4cGxpY2l0KQorRElBR19OQU1FX0lOREVYKGVycl9kZWR1Y2VkX2NsYXNzX3RlbXBsYXRlX2luY29tcGxldGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlZHVjZWRfbm9uX2NsYXNzX3RlbXBsYXRlX3NwZWNpYWxpemF0aW9uX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlZHVjZWRfbm9uX3R5cGVfdGVtcGxhdGVfYXJnX3R5cGVfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlZHVjZWRfcmV0dXJuX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlZHVjdGlvbl9ndWlkZV9iYWRfdHJhaWxpbmdfcmV0dXJuX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlZHVjdGlvbl9ndWlkZV9kZWZpbmVzX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9kZWR1Y3Rpb25fZ3VpZGVfZXhwbGljaXRfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlZHVjdGlvbl9ndWlkZV9pbnZhbGlkX3NwZWNpZmllcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVkdWN0aW9uX2d1aWRlX25hbWVfbm90X2NsYXNzX3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKGVycl9kZWR1Y3Rpb25fZ3VpZGVfbm9fdHJhaWxpbmdfcmV0dXJuX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlZHVjdGlvbl9ndWlkZV9zcGVjaWFsaXplZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVkdWN0aW9uX2d1aWRlX3RlbXBsYXRlX25vdF9kZWR1Y2libGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlZHVjdGlvbl9ndWlkZV93aXRoX2NvbXBsZXhfZGVjbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVkdWN0aW9uX2d1aWRlX3dyb25nX3Njb3BlKQorRElBR19OQU1FX0lOREVYKGVycl9kZWVwX2V4Y2VwdGlvbl9zcGVjc19kaWZmZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlZmF1bHRfYXJnX2luX3BhcnRpYWxfc3BlYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVmYXVsdF9hcmdfbWFrZXNfY3Rvcl9zcGVjaWFsKQorRElBR19OQU1FX0lOREVYKGVycl9kZWZhdWx0X2FyZ191bnBhcnNlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVmYXVsdF9kZWxldGVfaW5fbXVsdGlwbGVfZGVjbGFyYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2RlZmF1bHRfaW5pdF9jb25zdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVmYXVsdF9ub3RfaW5fc3dpdGNoKQorRElBR19OQU1FX0lOREVYKGVycl9kZWZhdWx0X3NwZWNpYWxfbWVtYmVycykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVmYXVsdF90ZW1wbGF0ZV90ZW1wbGF0ZV9wYXJhbWV0ZXJfbm90X3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKGVycl9kZWZhdWx0ZWRfY29weV9hc3NpZ25fbm90X3JlZikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVmYXVsdGVkX3NwZWNpYWxfbWVtYmVyX2NvcHlfY29uc3RfcGFyYW0pCitESUFHX05BTUVfSU5ERVgoZXJyX2RlZmF1bHRlZF9zcGVjaWFsX21lbWJlcl9tb3ZlX2NvbnN0X3BhcmFtKQorRElBR19OQU1FX0lOREVYKGVycl9kZWZhdWx0ZWRfc3BlY2lhbF9tZW1iZXJfcGFyYW1zKQorRElBR19OQU1FX0lOREVYKGVycl9kZWZhdWx0ZWRfc3BlY2lhbF9tZW1iZXJfcXVhbHMpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlZmF1bHRlZF9zcGVjaWFsX21lbWJlcl9yZXR1cm5fdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVmYXVsdGVkX3NwZWNpYWxfbWVtYmVyX3ZhcmlhZGljKQorRElBR19OQU1FX0lOREVYKGVycl9kZWZhdWx0ZWRfc3BlY2lhbF9tZW1iZXJfdm9sYXRpbGVfcGFyYW0pCitESUFHX05BTUVfSU5ERVgoZXJyX2RlZmluZWRfbWFjcm9fbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVmaW5pdGlvbl9vZl9leHBsaWNpdGx5X2RlZmF1bHRlZF9tZW1iZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlZmluaXRpb25fb2ZfaW1wbGljaXRseV9kZWNsYXJlZF9tZW1iZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlbGVnYXRpbmdfY3RvcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVsZWdhdGluZ19pbml0aWFsaXplcl9hbG9uZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVsZXRlX2V4cGxpY2l0X2NvbnZlcnNpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2RlbGV0ZV9pbmNvbXBsZXRlX2NsYXNzX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlbGV0ZV9vcGVyYW5kKQorRElBR19OQU1FX0lOREVYKGVycl9kZWxldGVkX2RlY2xfbm90X2ZpcnN0KQorRElBR19OQU1FX0lOREVYKGVycl9kZWxldGVkX2Z1bmN0aW9uX3VzZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVsZXRlZF9pbmhlcml0ZWRfY3Rvcl91c2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlbGV0ZWRfbWFpbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVsZXRlZF9ub25fZnVuY3Rpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2RlbGV0ZWRfb3ZlcnJpZGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlcGVuZGVudF9kZWR1Y2VkX3RzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVwZW5kZW50X25lc3RlZF9uYW1lX3NwZWMpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlcGVuZGVudF9ub25fdHlwZV9hcmdfaW5fcGFydGlhbF9zcGVjKQorRElBR19OQU1FX0lOREVYKGVycl9kZXBlbmRlbnRfdGFnX2RlY2wpCitESUFHX05BTUVfSU5ERVgoZXJyX2RlcGVuZGVudF90eXBlZF9ub25fdHlwZV9hcmdfaW5fcGFydGlhbF9zcGVjKQorRElBR19OQU1FX0lOREVYKGVycl9kZXJlZmVyZW5jZV9pbmNvbXBsZXRlX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rlc2lnbmF0b3JfZm9yX3NjYWxhcl9pbml0KQorRElBR19OQU1FX0lOREVYKGVycl9kZXNpZ25hdG9yX2ludG9fZmxleGlibGVfYXJyYXlfbWVtYmVyKQorRElBR19OQU1FX0lOREVYKGVycl9kZXN0cm95aW5nX29wZXJhdG9yX2RlbGV0ZV9ub3RfdXN1YWwpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rlc3RydWN0b3JfY2Fubm90X2JlKQorRElBR19OQU1FX0lOREVYKGVycl9kZXN0cnVjdG9yX2NsYXNzX25hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rlc3RydWN0b3JfZXhwcl90eXBlX21pc21hdGNoKQorRElBR19OQU1FX0lOREVYKGVycl9kZXN0cnVjdG9yX25hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rlc3RydWN0b3Jfbm90X21lbWJlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGVzdHJ1Y3Rvcl9yZWRlY2xhcmVkKQorRElBR19OQU1FX0lOREVYKGVycl9kZXN0cnVjdG9yX3JldHVybl90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9kZXN0cnVjdG9yX3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKGVycl9kZXN0cnVjdG9yX3RlbXBsYXRlX2lkKQorRElBR19OQU1FX0lOREVYKGVycl9kZXN0cnVjdG9yX3RpbGRlX2lkZW50aWZpZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rlc3RydWN0b3JfdGlsZGVfc2NvcGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rlc3RydWN0b3JfdHlwZWRlZl9uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9kZXN0cnVjdG9yX3ZhcmlhZGljKQorRElBR19OQU1FX0lOREVYKGVycl9kZXN0cnVjdG9yX3dpdGhfcGFyYW1zKQorRElBR19OQU1FX0lOREVYKGVycl9kZXZpY2Vfc3RhdGljX2xvY2FsX3ZhcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGlhZ25vc2VfaWZfaW52YWxpZF9kaWFnbm9zdGljX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2RpYWdub3NlX2lmX3N1Y2NlZWRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGlmZmVyZW50X2FzbV9sYWJlbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGlmZmVyZW50X2xhbmd1YWdlX2xpbmthZ2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2RpZmZlcmVudF9wYXNzX29iamVjdF9zaXplX3BhcmFtcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZGlmZmVyZW50X3JldHVybl90eXBlX2Zvcl9vdmVycmlkaW5nX3ZpcnR1YWxfZnVuY3Rpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2RpZ2l0X3NlcGFyYXRvcl9ub3RfYmV0d2Vlbl9kaWdpdHMpCitESUFHX05BTUVfSU5ERVgoZXJyX2RpbWVuc2lvbl9leHByX25vdF9jb25zdGFudF9pbnRlZ2VyKQorRElBR19OQU1FX0lOREVYKGVycl9kaXN0YW50X2V4Y2VwdGlvbl9zcGVjKQorRElBR19OQU1FX0lOREVYKGVycl9kb3duY2FzdF9mcm9tX2luYWNjZXNzaWJsZV9iYXNlKQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfSV9kYXNoX25vdF9zdXBwb3J0ZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9Yb3Blbm1wX3RhcmdldF9taXNzaW5nX3RyaXBsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2FyZ3VtZW50X25vdF9hbGxvd2VkX3dpdGgpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9hcmd1bWVudF9vbmx5X2FsbG93ZWRfd2l0aCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2JpdGNvZGVfdW5zdXBwb3J0ZWRfb25fdG9vbGNoYWluKQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfY2Fubm90X3JlYWRfY29uZmlnX2ZpbGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9jY19wcmludF9vcHRpb25zX2ZhaWx1cmUpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9jbGFuZ191bnN1cHBvcnRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2NsYW5nX3Vuc3VwcG9ydGVkX29wdF9jeHhfZGFyd2luX2kzODYpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9jbGFuZ191bnN1cHBvcnRlZF9vcHRfZmFsdGl2ZWMpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9jb21tYW5kX2ZhaWxlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2NvbW1hbmRfZmFpbHVyZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2NvbW1hbmRfc2lnbmFsbGVkKQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfY29tcGlsYXRpb25kYXRhYmFzZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2NvbmZpZ19maWxlX25vdF9leGlzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2NvbmZpZ19maWxlX25vdF9mb3VuZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2NvbmZsaWN0aW5nX2RlcGxveW1lbnRfdGFyZ2V0cykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2N1ZGFfYmFkX2dwdV9hcmNoKQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfY3VkYV9udnB0eF9ob3N0KQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfY3VkYV92ZXJzaW9uX3Vuc3VwcG9ydGVkKQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfZGVmc3ltX2ludmFsaWRfZm9ybWF0KQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfZGVmc3ltX2ludmFsaWRfc3ltdmFsKQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfZHVwbGljYXRlX2NvbmZpZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2VtaXRfbGx2bV9saW5rKQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfZXhwZWN0aW5nX2ZvcGVubXBfd2l0aF9mb3Blbm1wX3RhcmdldHMpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9mb3JjZV9jcmFzaCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2ludmFsaWRfWGFyY2hfYXJndW1lbnRfaXNkcml2ZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9pbnZhbGlkX1hhcmNoX2FyZ3VtZW50X3dpdGhfYXJncykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2ludmFsaWRfWG9wZW5tcF90YXJnZXRfd2l0aF9hcmdzKQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfaW52YWxpZF9hcmNoX25hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9pbnZhbGlkX2FyZ3VtZW50X3RvX2ZkZWJ1Z19wcmVmaXhfbWFwKQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfaW52YWxpZF9kYXJ3aW5fdmVyc2lvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2ludmFsaWRfZ2NjX291dHB1dF90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfaW52YWxpZF9odnhfbGVuZ3RoKQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfaW52YWxpZF9pbnRfdmFsdWUpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9pbnZhbGlkX2xpYmN4eF9kZXBsb3ltZW50KQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfaW52YWxpZF9saW5rZXJfbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2ludmFsaWRfbWZsb2F0X2FiaSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2ludmFsaWRfbXRwKQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfaW52YWxpZF9vbXBfdGFyZ2V0KQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfaW52YWxpZF9vdXRwdXRfd2l0aF9tdWx0aXBsZV9hcmNocykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2ludmFsaWRfcGdvX2luc3RydW1lbnRvcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2ludmFsaWRfcmVtYXBfZmlsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2ludmFsaWRfcnRsaWJfbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2ludmFsaWRfc3RkbGliX25hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9pbnZhbGlkX3RocmVhZF9tb2RlbF9mb3JfdGFyZ2V0KQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfaW52YWxpZF92YWx1ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X2ludmFsaWRfdmVyc2lvbl9udW1iZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9sdG9fd2l0aG91dF9sbGQpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9tYWxmb3JtZWRfc2FuaXRpemVyX2JsYWNrbGlzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X21nX3JlcXVpcmVzX21fb3JfbW0pCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9taXNzaW5nX2FyZ19tdHApCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9taXNzaW5nX2FyZ3VtZW50KQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfbW9kdWxlc192YWxpZGF0ZV9vbmNlX3JlcXVpcmVzX3RpbWVzdGFtcCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X25lc3RlZF9jb25maWdfZmlsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X25vX2FzdF9zdXBwb3J0KQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfbm9fY3VkYV9pbnN0YWxsYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9ub19jdWRhX2xpYmRldmljZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X25vX2lucHV0X2ZpbGVzKQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfbm9fbGlua2VyX2xsdm1fc3VwcG9ydCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X25vX21vZHVsZV9zdXBwb3J0KQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfbm9fbmVvbl9tb2RpZmllcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X25vX3N1Y2hfZmlsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X29tcF9ob3N0X2lyX2ZpbGVfbm90X2ZvdW5kKQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfb21wX2hvc3RfdGFyZ2V0X25vdF9zdXBwb3J0ZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9vcHRpbWl6YXRpb25fcmVtYXJrX3BhdHRlcm4pCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9vdXRfZmlsZV9hcmd1bWVudF93aXRoX211bHRpcGxlX3NvdXJjZXMpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl9vdXRwdXRfYXJndW1lbnRfd2l0aF9tdWx0aXBsZV9maWxlcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X3ByZWFtYmxlX2Zvcm1hdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X3JvcGlfaW5jb21wYXRpYmxlX3dpdGhfY3h4KQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfcm9waV9yd3BpX2luY29tcGF0aWJsZV93aXRoX3BpYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X3VuYWJsZV90b19yZW1vdmVfZmlsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X3Vua25vd25fYXJndW1lbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl91bmtub3duX2FyZ3VtZW50X3dpdGhfc3VnZ2VzdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X3Vua25vd25faW5kaXJlY3RfanVtcF9vcHQpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl91bmtub3duX2xhbmd1YWdlKQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfdW5rbm93bl9vYmpjX3J1bnRpbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl91bmtub3duX3N0ZGluX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl91bmtub3duX3N0ZGluX3R5cGVfY2xhbmdfY2wpCitESUFHX05BTUVfSU5ERVgoZXJyX2Rydl91bnN1cHBvcnRlZF9pbmRpcmVjdF9qdW1wX29wdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X3Vuc3VwcG9ydGVkX2xpbmtlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X3Vuc3VwcG9ydGVkX29wdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X3Vuc3VwcG9ydGVkX29wdF9mb3JfdGFyZ2V0KQorRElBR19OQU1FX0lOREVYKGVycl9kcnZfdW5zdXBwb3J0ZWRfb3B0X3dpdGhfc3VnZ2VzdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X3Vuc3VwcG9ydGVkX29wdGlvbl9hcmd1bWVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X3Vuc3VwcG9ydGVkX3J0bGliX2Zvcl9wbGF0Zm9ybSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHJ2X3VzZV9vZl9aX29wdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHRvcl9leHByX3dpdGhvdXRfY2FsbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHVwX2ltcGxlbWVudGF0aW9uX2NhdGVnb3J5KQorRElBR19OQU1FX0lOREVYKGVycl9kdXBfaW1wbGVtZW50YXRpb25fY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX2R1cF92aXJ0dWFsKQorRElBR19OQU1FX0lOREVYKGVycl9kdXBsaWNhdGVfYmFzZV9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHVwbGljYXRlX2Nhc2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2R1cGxpY2F0ZV9jYXNlX2RpZmZlcmluZ19leHByKQorRElBR19OQU1FX0lOREVYKGVycl9kdXBsaWNhdGVfY2xhc3NfZGVmKQorRElBR19OQU1FX0lOREVYKGVycl9kdXBsaWNhdGVfZGVmYXVsdF9hc3NvYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHVwbGljYXRlX2l2YXJfZGVjbGFyYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2R1cGxpY2F0ZV9pdmFyX3VzZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHVwbGljYXRlX21hbmdsZWRfbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHVwbGljYXRlX21lbWJlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHVwbGljYXRlX21ldGhvZF9kZWNsKQorRElBR19OQU1FX0lOREVYKGVycl9kdXBsaWNhdGVfcHJvcGVydHkpCitESUFHX05BTUVfSU5ERVgoZXJyX2R1cGxpY2F0ZV92aXJ0X3NwZWNpZmllcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHluYW1pY19hbmRfbm9leGNlcHRfc3BlY2lmaWNhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZHluYW1pY19wcm9wZXJ0eV9pdmFyX2RlY2wpCitESUFHX05BTUVfSU5ERVgoZXJyX2R5bmFtaWNfdmFyX2luaXQpCitESUFHX05BTUVfSU5ERVgoZXJyX2Vhcmx5X2NhdGNoX2FsbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZWxsaXBzaXNfZmlyc3RfcGFyYW0pCitESUFHX05BTUVfSU5ERVgoZXJyX2VsbGlwc2lzX2luX2RlY2xhcmF0b3Jfbm90X3BhcmFtZXRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZW1iZWRkZWRfZGlyZWN0aXZlKQorRElBR19OQU1FX0lOREVYKGVycl9lbXB0eV9lbnVtKQorRElBR19OQU1FX0lOREVYKGVycl9lbXB0eV9zY2FsYXJfaW5pdGlhbGl6ZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2VudW1fY2xhc3NfcmVmZXJlbmNlKQorRElBR19OQU1FX0lOREVYKGVycl9lbnVtX2ludmFsaWRfdW5kZXJseWluZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZW51bV9tb2RlX3ZlY3Rvcl90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9lbnVtX3JlZGVjbGFyZV9maXhlZF9taXNtYXRjaCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZW51bV9yZWRlY2xhcmVfc2NvcGVkX21pc21hdGNoKQorRElBR19OQU1FX0lOREVYKGVycl9lbnVtX3JlZGVjbGFyZV90eXBlX21pc21hdGNoKQorRElBR19OQU1FX0lOREVYKGVycl9lbnVtX3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKGVycl9lbnVtZXJhdG9yX2RvZXNfbm90X2V4aXN0KQorRElBR19OQU1FX0lOREVYKGVycl9lbnVtZXJhdG9yX2xpc3RfbWlzc2luZ19jb21tYSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZW51bWVyYXRvcl90b29fbGFyZ2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2VudW1lcmF0b3JfdW5uYW1lZF9ub19kZWYpCitESUFHX05BTUVfSU5ERVgoZXJyX2VudW1lcmF0b3Jfd3JhcHBlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXNjYXBlX3Rvb19sYXJnZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXZlbnRfdF9hZGRyX3NwYWNlX3F1YWwpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4Y2VwdF9zcGVjX3VucGFyc2VkKQorRElBR19OQU1FX0lOREVYKGVycl9leGNlcHRpb25fc3BlY19jeWNsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhjZXB0aW9uX3NwZWNfaW5fdHlwZWRlZikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhjZXB0aW9uX3NwZWNfbm90X3BhcnNlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhjZXB0aW9uc19kaXNhYmxlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhjZXNzX2luaXRpYWxpemVycykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhjZXNzX2luaXRpYWxpemVyc19pbl9jaGFyX2FycmF5X2luaXRpYWxpemVyKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfYWZ0ZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGVjdGVkX2NhcHR1cmUpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGVjdGVkX2Nhc2VfYmVmb3JlX2V4cHJlc3Npb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGVjdGVkX2NhdGNoKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9jbGFzc19uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9jbGFzc19uYW1lX25vdF90ZW1wbGF0ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfY2xhc3Nfb3JfbmFtZXNwYWNlKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9jb2xvbl9hZnRlcl9zZXR0ZXJfbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfY29sb25jb2xvbl9hZnRlcl9zdXBlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfY29tbWFfZ3JlYXRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfY29tbWFfb3JfcnNxdWFyZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfZWl0aGVyKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9lbmRfZGVjbGFyZV90YXJnZXQpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGVjdGVkX2VuZF9vZl9lbnVtZXJhdG9yKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9lcXVhbF9kZXNpZ25hdG9yKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9leHByZXNzaW9uKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9leHRlcm5hbF9kZWNsYXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfZmllbGRfZGVzaWduYXRvcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfZm5fYm9keSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfZm9sZF9vcGVyYXRvcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfaWRfYnVpbGRpbmdfbW9kdWxlKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9pbml0X2luX2NvbmRpdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfaW5pdF9pbl9jb25kaXRpb25fbHBhcmVuKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9rZXJuZWxfdm9pZF9yZXR1cm5fdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfbGFtYmRhX2JvZHkpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGVjdGVkX2xicmFjZV9hZnRlcl9iYXNlX3NwZWNpZmllcnMpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGVjdGVkX2xicmFjZV9pbl9jb21wb3VuZF9saXRlcmFsKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9sZXNzX2FmdGVyKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9scGFyZW5fYWZ0ZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGVjdGVkX2xwYXJlbl9hZnRlcl90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9tZW1iZXJfbmFtZV9vcl9zZW1pKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9tZW1iZXJfbmFtZV9vcl9zZW1pX29iamN4eF9rZXl3b3JkKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9tZW1iZXJfb3JfYmFzZV9uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9tZXRob2RfYm9keSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfbWludXNfb3JfcGx1cykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfbmFtZXNwYWNlX25hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGVjdGVkX29iamNfY29udGFpbmVyKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9wYXJhbWV0ZXJfcGFjaykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfcGFyZW50aGVzZXNfYXJvdW5kX3R5cGVuYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9wcm9wZXJ0eV9uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9wdW5jKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9xdWFsaWZpZWRfYWZ0ZXJfdHlwZW5hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGVjdGVkX3JwYXJlbl9hZnRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfc2VsZWN0b3JfZm9yX21ldGhvZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfc2VtaV9hZnRlcl9hdHRyaWJ1dGVfbGlzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfc2VtaV9hZnRlcl9leHByKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9zZW1pX2FmdGVyX21ldGhvZF9wcm90bykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfc2VtaV9hZnRlcl9uYW1lc3BhY2VfbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfc2VtaV9hZnRlcl9zdGF0aWNfYXNzZXJ0KQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9zZW1pX2FmdGVyX3N0bXQpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGVjdGVkX3NlbWlfZGVjbF9saXN0KQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9zZW1pX2RlY2xhcmF0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF9zZW1pX2ZvcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfc3Rhcl90aGlzX2NhcHR1cmUpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGVjdGVkX3N0YXRlbWVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfc3RyaW5nX2xpdGVyYWwpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGVjdGVkX3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKGVycl9leHBlY3RlZF90ZW1wbGF0ZV9wYXJhbWV0ZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGVjdGVkX3Rva2VuX2luc3RlYWRfb2Zfb2JqY3h4X2tleXdvcmQpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGVjdGVkX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGVjdGVkX3R5cGVfbmFtZV9hZnRlcl90eXBlbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwZWN0ZWRfdW5xdWFsaWZpZWRfaWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGVjdGVkX3ZlcnNpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGVjdGVkX3doaWxlKQorRElBR19OQU1FX0lOREVYKGVycl9leHBsaWNpdF9pbnN0YW50aWF0aW9uX2FtYmlndW91cykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwbGljaXRfaW5zdGFudGlhdGlvbl9jb25zdGV4cHIpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGxpY2l0X2luc3RhbnRpYXRpb25fZGF0YV9tZW1iZXJfbm90X2luc3RhbnRpYXRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwbGljaXRfaW5zdGFudGlhdGlvbl9kZWNsYXJhdGlvbl9hZnRlcl9kZWZpbml0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9leHBsaWNpdF9pbnN0YW50aWF0aW9uX2R1cGxpY2F0ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwbGljaXRfaW5zdGFudGlhdGlvbl9lbnVtKQorRElBR19OQU1FX0lOREVYKGVycl9leHBsaWNpdF9pbnN0YW50aWF0aW9uX2luX2NsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl9leHBsaWNpdF9pbnN0YW50aWF0aW9uX2lubGluZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwbGljaXRfaW5zdGFudGlhdGlvbl9tZW1iZXJfZnVuY3Rpb25fbm90X2luc3RhbnRpYXRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwbGljaXRfaW5zdGFudGlhdGlvbl9tdXN0X2JlX2dsb2JhbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwbGljaXRfaW5zdGFudGlhdGlvbl9ub250ZW1wbGF0ZV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9leHBsaWNpdF9pbnN0YW50aWF0aW9uX25vdF9rbm93bikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwbGljaXRfaW5zdGFudGlhdGlvbl9vZl90eXBlZGVmKQorRElBR19OQU1FX0lOREVYKGVycl9leHBsaWNpdF9pbnN0YW50aWF0aW9uX291dF9vZl9zY29wZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwbGljaXRfaW5zdGFudGlhdGlvbl9yZXF1aXJlc19uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9leHBsaWNpdF9pbnN0YW50aWF0aW9uX3N0b3JhZ2VfY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGxpY2l0X2luc3RhbnRpYXRpb25fdW5kZWZpbmVkX2Z1bmNfdGVtcGxhdGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGxpY2l0X2luc3RhbnRpYXRpb25fdW5kZWZpbmVkX21lbWJlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwbGljaXRfaW5zdGFudGlhdGlvbl91bmRlZmluZWRfdmFyX3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKGVycl9leHBsaWNpdF9pbnN0YW50aWF0aW9uX3VucXVhbGlmaWVkX3dyb25nX25hbWVzcGFjZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwbGljaXRfaW5zdGFudGlhdGlvbl93aXRoX2RlZmluaXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGxpY2l0X2luc3RhbnRpYXRpb25fd2l0aG91dF90ZW1wbGF0ZV9pZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwbGljaXRfbm9uX2N0b3Jfb3JfY29udl9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwbGljaXRfbm9uX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9leHBsaWNpdF9vdXRfb2ZfY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cGxpY2l0X3NwZWNfbm9uX3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKGVycl9leHBsaWNpdF9zcGVjaWFsaXphdGlvbl9pbmNvbnNpc3RlbnRfc3RvcmFnZV9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwb25lbnRfaGFzX25vX2RpZ2l0cykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwb3J0X2VtcHR5KQorRElBR19OQU1FX0lOREVYKGVycl9leHBvcnRfbm90X2luX21vZHVsZV9pbnRlcmZhY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cG9ydF93aXRoaW5fZXhwb3J0KQorRElBR19OQU1FX0lOREVYKGVycl9leHByX25vdF9jY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4cHJfbm90X2ljZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXhwcl9ub3Rfc3RyaW5nX2xpdGVyYWwpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4dF92ZWN0b3JfY29tcG9uZW50X2V4Y2VlZHNfbGVuZ3RoKQorRElBR19OQU1FX0lOREVYKGVycl9leHRfdmVjdG9yX2NvbXBvbmVudF9uYW1lX2lsbGVnYWwpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4dGVybl9jX2dsb2JhbF9jb25mbGljdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXh0ZXJuX25vbl9leHRlcm4pCitESUFHX05BTUVfSU5ERVgoZXJyX2V4dGVybmFsX3NvdXJjZV9zeW1ib2xfZHVwbGljYXRlX2NsYXVzZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXh0ZXJuYWxfc291cmNlX3N5bWJvbF9leHBlY3RlZF9rZXl3b3JkKQorRElBR19OQU1FX0lOREVYKGVycl9leHRyYW5lb3VzX2Nsb3NpbmdfYnJhY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2V4dHJhbmVvdXNfcnBhcmVuX2luX2NvbmRpdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZXh0cmFuZW91c190b2tlbl9iZWZvcmVfc2VtaSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmFsbG9mZl9ub252b2lkX2Jsb2NrKQorRElBR19OQU1FX0lOREVYKGVycl9mYWxsdGhyb3VnaF9hdHRyX2ludmFsaWRfcGxhY2VtZW50KQorRElBR19OQU1FX0lOREVYKGVycl9mYWxsdGhyb3VnaF9hdHRyX291dHNpZGVfc3dpdGNoKQorRElBR19OQU1FX0lOREVYKGVycl9mYWxsdGhyb3VnaF9hdHRyX3dyb25nX3RhcmdldCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmVfYWN0aW9uX25vdF9hdmFpbGFibGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZlX2FzdF9maWxlX21vZGlmaWVkKQorRElBR19OQU1FX0lOREVYKGVycl9mZV9iYWNrZW5kX2ZyYW1lX2xhcmdlcl90aGFuKQorRElBR19OQU1FX0lOREVYKGVycl9mZV9iYWNrZW5kX3BsdWdpbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmVfYmFja2VuZF91bnN1cHBvcnRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmVfY2Fubm90X2xpbmtfbW9kdWxlKQorRElBR19OQU1FX0lOREVYKGVycl9mZV9kZXBlbmRlbmN5X2ZpbGVfcmVxdWlyZXNfTVQpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZlX2Vycm9yX2JhY2tlbmQpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZlX2Vycm9yX29wZW5pbmcpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZlX2Vycm9yX3JlYWRpbmcpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZlX2Vycm9yX3JlYWRpbmdfc3RkaW4pCitESUFHX05BTUVfSU5ERVgoZXJyX2ZlX2V4cGVjdGVkX2NsYW5nX2NvbW1hbmQpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZlX2V4cGVjdGVkX2NvbXBpbGVyX2pvYikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmVfaW5saW5lX2FzbSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmVfaW52YWxpZF9hbGlnbm1lbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZlX2ludmFsaWRfY29kZV9jb21wbGV0ZV9maWxlKQorRElBR19OQU1FX0lOREVYKGVycl9mZV9pbnZhbGlkX3BsdWdpbl9uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9mZV9pbnZhbGlkX3djaGFyX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZlX21vZHVsZV9maWxlX21vZGlmaWVkKQorRElBR19OQU1FX0lOREVYKGVycl9mZV9ub19wY2hfaW5fZGlyKQorRElBR19OQU1FX0lOREVYKGVycl9mZV9ub3RfYV9wY2hfZmlsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmVfcGNoX2ZpbGVfbW9kaWZpZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZlX3BjaF9maWxlX292ZXJyaWRkZW4pCitESUFHX05BTUVfSU5ERVgoZXJyX2ZlX3BjaF9tYWxmb3JtZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZlX3BjaF9tYWxmb3JtZWRfYmxvY2spCitESUFHX05BTUVfSU5ERVgoZXJyX2ZlX3B0aF9maWxlX2hhc19ub19zb3VyY2VfaGVhZGVyKQorRElBR19OQU1FX0lOREVYKGVycl9mZV9yZW1hcF9taXNzaW5nX2Zyb21fZmlsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmVfcmVtYXBfbWlzc2luZ190b19maWxlKQorRElBR19OQU1FX0lOREVYKGVycl9mZV9zdGRvdXRfYmluYXJ5KQorRElBR19OQU1FX0lOREVYKGVycl9mZV91bmFibGVfdG9fY3JlYXRlX3RhcmdldCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmVfdW5hYmxlX3RvX2ludGVyZmFjZV93aXRoX3RhcmdldCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmVfdW5hYmxlX3RvX2xvYWRfcGNoKQorRElBR19OQU1FX0lOREVYKGVycl9mZV91bmFibGVfdG9fbG9hZF9wbHVnaW4pCitESUFHX05BTUVfSU5ERVgoZXJyX2ZlX3VuYWJsZV90b19vcGVuX291dHB1dCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmVfdW5hYmxlX3RvX3JlYWRfcGNoX2ZpbGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZlYXR1cmVfY2hlY2tfbWFsZm9ybWVkKQorRElBR19OQU1FX0lOREVYKGVycl9maWVsZF9kZWNsYXJlZF9hc19mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmllbGRfZGVzaWduYXRvcl9ub25fYWdncikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmllbGRfZGVzaWduYXRvcl9ub25maWVsZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmllbGRfZGVzaWduYXRvcl91bmtub3duKQorRElBR19OQU1FX0lOREVYKGVycl9maWVsZF9kZXNpZ25hdG9yX3Vua25vd25fc3VnZ2VzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmllbGRfaW5jb21wbGV0ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmllbGRfaW5zdGFudGlhdGVzX3RvX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9maWVsZF93aXRoX2FkZHJlc3Nfc3BhY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZpbGVfbW9kaWZpZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZpbHRlcl9leHByZXNzaW9uX2ludGVncmFsKQorRElBR19OQU1FX0lOREVYKGVycl9maW5hbF9mdW5jdGlvbl9vdmVycmlkZGVuKQorRElBR19OQU1FX0lOREVYKGVycl9maXJzdF9hcmd1bWVudF90b19jd3NjX2Jsb2NrX2NhbGwpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZpcnN0X2FyZ3VtZW50X3RvX2N3c2NfYnVpbHRpbl9jYWxsKQorRElBR19OQU1FX0lOREVYKGVycl9maXJzdF9hcmd1bWVudF90b19jd3NjX25vdF9jYWxsKQorRElBR19OQU1FX0lOREVYKGVycl9maXJzdF9hcmd1bWVudF90b19jd3NjX3BkdG9yX2NhbGwpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZpcnN0X2FyZ3VtZW50X3RvX3ZhX2FyZ19ub3Rfb2ZfdHlwZV92YV9saXN0KQorRElBR19OQU1FX0lOREVYKGVycl9mbGV4aWJsZV9hcnJheV9hcmNfcmV0YWluYWJsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmxleGlibGVfYXJyYXlfZW1wdHlfYWdncmVnYXRlKQorRElBR19OQU1FX0lOREVYKGVycl9mbGV4aWJsZV9hcnJheV9oYXNfbm9udHJpdmlhbF9kdG9yKQorRElBR19OQU1FX0lOREVYKGVycl9mbGV4aWJsZV9hcnJheV9pbml0KQorRElBR19OQU1FX0lOREVYKGVycl9mbGV4aWJsZV9hcnJheV9pbml0X25lZWRzX2JyYWNlcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmxleGlibGVfYXJyYXlfbm90X2F0X2VuZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZmxleGlibGVfYXJyYXlfdW5pb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2ZsZXhpYmxlX2FycmF5X3ZpcnR1YWxfYmFzZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZm5tYXBfcGFyc2luZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZm9sZF9leHByZXNzaW9uX2JhZF9vcGVyYW5kKQorRElBR19OQU1FX0lOREVYKGVycl9mb2xkX2V4cHJlc3Npb25fZW1wdHkpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZvbGRfZXhwcmVzc2lvbl9wYWNrc19ib3RoX3NpZGVzKQorRElBR19OQU1FX0lOREVYKGVycl9mb2xkX29wZXJhdG9yX21pc21hdGNoKQorRElBR19OQU1FX0lOREVYKGVycl9mb3JfY29fYXdhaXRfbm90X3JhbmdlX2ZvcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZm9yX3JhbmdlX2RlY2xfbXVzdF9iZV92YXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2Zvcl9yYW5nZV9kZWR1Y3Rpb25fZmFpbHVyZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZm9yX3JhbmdlX2RlcmVmZXJlbmNlKQorRElBR19OQU1FX0lOREVYKGVycl9mb3JfcmFuZ2VfZXhwZWN0ZWRfZGVjbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZm9yX3JhbmdlX2lkZW50aWZpZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2Zvcl9yYW5nZV9pbmNvbXBsZXRlX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2Zvcl9yYW5nZV9pbnZhbGlkKQorRElBR19OQU1FX0lOREVYKGVycl9mb3JfcmFuZ2VfaXRlcl9kZWR1Y3Rpb25fZmFpbHVyZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZm9yX3JhbmdlX21lbWJlcl9iZWdpbl9lbmRfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX2Zvcl9yYW5nZV9zdG9yYWdlX2NsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl9mb3JtYXRfYXR0cmlidXRlX2ltcGxpY2l0X3RoaXNfZm9ybWF0X3N0cmluZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZm9ybWF0X2F0dHJpYnV0ZV9ub3QpCitESUFHX05BTUVfSU5ERVgoZXJyX2Zvcm1hdF9hdHRyaWJ1dGVfcmVxdWlyZXNfdmFyaWFkaWMpCitESUFHX05BTUVfSU5ERVgoZXJyX2Zvcm1hdF9hdHRyaWJ1dGVfcmVzdWx0X25vdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZm9ybWF0X3N0cmZ0aW1lX3RoaXJkX3BhcmFtZXRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZm9yd2FyZF9yZWZfZW51bSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZm9yd2FyZF9zdXBlcmNsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl9mcmllbmRfZGVjbF9kZWZpbmVzX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZyaWVuZF9kZWNsX2RvZXNfbm90X21hdGNoKQorRElBR19OQU1FX0lOREVYKGVycl9mcmllbmRfZGVjbF9zcGVjKQorRElBR19OQU1FX0lOREVYKGVycl9mcmllbmRfZGVjbF93aXRoX2RlZl9hcmdfbXVzdF9iZV9kZWYpCitESUFHX05BTUVfSU5ERVgoZXJyX2ZyaWVuZF9kZWNsX3dpdGhfZGVmX2FyZ19yZWRlY2xhcmVkKQorRElBR19OQU1FX0lOREVYKGVycl9mcmllbmRfZGVmX2luX2xvY2FsX2NsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl9mcmllbmRfZXhwbGljaXRfaW5zdGFudGlhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZnJpZW5kX2ludmFsaWRfaW5fY29udGV4dCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZnJpZW5kX2lzX21lbWJlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZnJpZW5kX25vdF9maXJzdF9pbl9kZWNsYXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfZnVuY19kZWZfaW5jb21wbGV0ZV9yZXN1bHQpCitESUFHX05BTUVfSU5ERVgoZXJyX2Z1bmNfZGVmX25vX3BhcmFtcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZnVuY19yZXR1cm5pbmdfYXJyYXlfZnVuY3Rpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2Z1bmNfcmV0dXJuaW5nX3F1YWxpZmllZF92b2lkKQorRElBR19OQU1FX0lOREVYKGVycl9mdW5jdGlvbl9hdHRyaWJ1dGVfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX2Z1bmN0aW9uX2NvbmNlcHRfYm9vbF9yZXQpCitESUFHX05BTUVfSU5ERVgoZXJyX2Z1bmN0aW9uX2NvbmNlcHRfZXhjZXB0aW9uX3NwZWMpCitESUFHX05BTUVfSU5ERVgoZXJyX2Z1bmN0aW9uX2NvbmNlcHRfbm90X2RlZmluZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2Z1bmN0aW9uX2NvbmNlcHRfd2l0aF9wYXJhbXMpCitESUFHX05BTUVfSU5ERVgoZXJyX2Z1bmN0aW9uX2RlY2xhcmVkX3R5cGVkZWYpCitESUFHX05BTUVfSU5ERVgoZXJyX2Z1bmN0aW9uX2RlZmluaXRpb25fbm90X2FsbG93ZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2Z1bmN0aW9uX2lzX25vdF9yZWNvcmQpCitESUFHX05BTUVfSU5ERVgoZXJyX2Z1bmN0aW9uX21hcmtlZF9vdmVycmlkZV9ub3Rfb3ZlcnJpZGluZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZnVuY3Rpb25fbmVlZHNfZmVhdHVyZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZnVuY3Rpb25fcGFyYW1ldGVyX3BhY2tfd2l0aG91dF9wYXJhbWV0ZXJfcGFja3MpCitESUFHX05BTUVfSU5ERVgoZXJyX2Z1bmN0aW9uX3RlbXBsYXRlX3BhcnRpYWxfc3BlYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZnVuY3Rpb25fdGVtcGxhdGVfc3BlY19hbWJpZ3VvdXMpCitESUFHX05BTUVfSU5ERVgoZXJyX2Z1bmN0aW9uX3RlbXBsYXRlX3NwZWNfbm9fbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX2djX3dlYWtfcHJvcGVydHlfc3Ryb25nX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2dlbmVyaWNfc2VsX211bHRpX21hdGNoKQorRElBR19OQU1FX0lOREVYKGVycl9nZW5lcmljX3NlbF9ub19tYXRjaCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZ2V0dGVyX25vdF9mb3VuZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfZ2xvYmFsX2NhbGxfbm90X2NvbmZpZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfZ251X2lubGluZV9hc21fZGlzYWJsZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2dvdG9faW50b19wcm90ZWN0ZWRfc2NvcGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2dvdG9fbXNfYXNtX2xhYmVsKQorRElBR19OQU1FX0lOREVYKGVycl9oYWxmX2NvbnN0X3JlcXVpcmVzX2ZwMTYpCitESUFHX05BTUVfSU5ERVgoZXJyX2hleF9jb25zdGFudF9yZXF1aXJlcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfaGV4X2VzY2FwZV9ub19kaWdpdHMpCitESUFHX05BTUVfSU5ERVgoZXJyX2lib3V0bGV0Y29sbGVjdGlvbl9idWlsdGludHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaWJvdXRsZXRjb2xsZWN0aW9uX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2ljZV9hbWJpZ3VvdXNfY29udmVyc2lvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfaWNlX2V4cGxpY2l0X2NvbnZlcnNpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2ljZV9pbmNvbXBsZXRlX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2ljZV9ub3RfaW50ZWdyYWwpCitESUFHX05BTUVfSU5ERVgoZXJyX2ljZV90b29fbGFyZ2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2lkX2FmdGVyX3RlbXBsYXRlX2luX25lc3RlZF9uYW1lX3NwZWMpCitESUFHX05BTUVfSU5ERVgoZXJyX2lkZW50X2luX2R0b3Jfbm90X2FfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaWRlbnRfbGlzdF9pbl9mbl9kZWNsYXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfaWZ1bmNfcmVzb2x2ZXJfcGFyYW1zKQorRElBR19OQU1FX0lOREVYKGVycl9pZnVuY19yZXNvbHZlcl9yZXR1cm4pCitESUFHX05BTUVfSU5ERVgoZXJyX2lsbGVnYWxfY29udGFpbmVyX3N1YnNjcmlwdGluZ19vcCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaWxsZWdhbF9kZWNsX2FycmF5X2luY29tcGxldGVfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaWxsZWdhbF9kZWNsX2FycmF5X29mX2F1dG8pCitESUFHX05BTUVfSU5ERVgoZXJyX2lsbGVnYWxfZGVjbF9hcnJheV9vZl9mdW5jdGlvbnMpCitESUFHX05BTUVfSU5ERVgoZXJyX2lsbGVnYWxfZGVjbF9hcnJheV9vZl9yZWZlcmVuY2VzKQorRElBR19OQU1FX0lOREVYKGVycl9pbGxlZ2FsX2RlY2xfbWVtcG9pbnRlcl9pbl9ub25jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfaWxsZWdhbF9kZWNsX21lbXBvaW50ZXJfdG9fcmVmZXJlbmNlKQorRElBR19OQU1FX0lOREVYKGVycl9pbGxlZ2FsX2RlY2xfbWVtcG9pbnRlcl90b192b2lkKQorRElBR19OQU1FX0lOREVYKGVycl9pbGxlZ2FsX2RlY2xfcG9pbnRlcl90b19yZWZlcmVuY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2lsbGVnYWxfZGVjbF9yZWZlcmVuY2VfdG9fcmVmZXJlbmNlKQorRElBR19OQU1FX0lOREVYKGVycl9pbGxlZ2FsX2luaXRpYWxpemVyKQorRElBR19OQU1FX0lOREVYKGVycl9pbGxlZ2FsX2luaXRpYWxpemVyX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2lsbGVnYWxfbWVzc2FnZV9leHByX2luY29tcGxldGVfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaWxsZWdhbF9xdWFsaWZpZXJzX29uX2NhdGNoX3Bhcm0pCitESUFHX05BTUVfSU5ERVgoZXJyX2lsbGVnYWxfc3VwZXJfY2FzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaWxsZWdhbF91bmlvbl9vcl9hbm9uX3N0cnVjdF9tZW1iZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2ltYWdpbmFyeV9ub3Rfc3VwcG9ydGVkKQorRElBR19OQU1FX0lOREVYKGVycl9pbXBjYXN0X2NvbXBsZXhfc2NhbGFyKQorRElBR19OQU1FX0lOREVYKGVycl9pbXBsaWNpdF9jb3JvdXRpbmVfc3RkX25vdGhyb3dfdHlwZV9ub3RfZm91bmQpCitESUFHX05BTUVfSU5ERVgoZXJyX2ltcGxpY2l0X2VtcHR5X2luaXRpYWxpemVyKQorRElBR19OQU1FX0lOREVYKGVycl9pbXBsaWNpdF9pbnN0YW50aWF0ZV9tZW1iZXJfdW5kZWZpbmVkKQorRElBR19OQU1FX0lOREVYKGVycl9pbXBsaWVkX2Nvcm91dGluZV90eXBlX25vdF9mb3VuZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW1wbGllZF9zdGRfY29yb3V0aW5lX3RyYWl0c19wcm9taXNlX3R5cGVfbm90X2NsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl9pbXBsaWVkX3N0ZF9jb3JvdXRpbmVfdHJhaXRzX3Byb21pc2VfdHlwZV9ub3RfZm91bmQpCitESUFHX05BTUVfSU5ERVgoZXJyX2ltcGxpZWRfc3RkX2luaXRpYWxpemVyX2xpc3Rfbm90X2ZvdW5kKQorRElBR19OQU1FX0lOREVYKGVycl9pbXBvcnRlZF9tb2R1bGVfbW9kbWFwX2NoYW5nZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2ltcG9ydGVkX21vZHVsZV9ub3RfZm91bmQpCitESUFHX05BTUVfSU5ERVgoZXJyX2ltcG9ydGVkX21vZHVsZV9yZWxvY2F0ZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2luX2NsYXNzX2luaXRpYWxpemVyX2JhZF90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9pbl9jbGFzc19pbml0aWFsaXplcl9jeWNsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW5fY2xhc3NfaW5pdGlhbGl6ZXJfbGl0ZXJhbF90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9pbl9jbGFzc19pbml0aWFsaXplcl9ub25fY29uc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX2luX2NsYXNzX2luaXRpYWxpemVyX25vbl9jb25zdGFudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW5fY2xhc3NfaW5pdGlhbGl6ZXJfbm90X3lldF9wYXJzZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2luX2NsYXNzX2luaXRpYWxpemVyX3ZvbGF0aWxlKQorRElBR19OQU1FX0lOREVYKGVycl9pbmNvbXBhdGlibGVfZXhjZXB0aW9uX3NwZWNzKQorRElBR19OQU1FX0lOREVYKGVycl9pbmNvbXBsZXRlX2FycmF5X21lbWJlcl9pbml0KQorRElBR19OQU1FX0lOREVYKGVycl9pbmNvbXBsZXRlX2Jhc2VfY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX2luY29tcGxldGVfaW5fZXhjZXB0aW9uX3NwZWMpCitESUFHX05BTUVfSU5ERVgoZXJyX2luY29tcGxldGVfbWVtYmVyX2FjY2VzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW5jb21wbGV0ZV9uZXN0ZWRfbmFtZV9zcGVjKQorRElBR19OQU1FX0lOREVYKGVycl9pbmNvbXBsZXRlX29iamVjdF9jYWxsKQorRElBR19OQU1FX0lOREVYKGVycl9pbmNvbXBsZXRlX3JlY2VpdmVyX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2luY29tcGxldGVfc3ludGhlc2l6ZWRfcHJvcGVydHkpCitESUFHX05BTUVfSU5ERVgoZXJyX2luY29tcGxldGVfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW5jb21wbGV0ZV90eXBlX29iamNfYXRfZW5jb2RlKQorRElBR19OQU1FX0lOREVYKGVycl9pbmNvbXBsZXRlX3R5cGVfdXNlZF9pbl90eXBlX3RyYWl0X2V4cHIpCitESUFHX05BTUVfSU5ERVgoZXJyX2luY29tcGxldGVfdHlwZWlkKQorRElBR19OQU1FX0lOREVYKGVycl9pbmNvbnNpc3RlbnRfaXZhcl9jb3VudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW5jb3JyZWN0X2RlZmF1bHRlZF9jb25zdGV4cHIpCitESUFHX05BTUVfSU5ERVgoZXJyX2luY29ycmVjdF9kZWZhdWx0ZWRfZXhjZXB0aW9uX3NwZWMpCitESUFHX05BTUVfSU5ERVgoZXJyX2luY29ycmVjdF9udW1iZXJfb2ZfdmVjdG9yX2luaXRpYWxpemVycykKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW5jcmVtZW50X2RlY3JlbWVudF9lbnVtKQorRElBR19OQU1FX0lOREVYKGVycl9pbmRpcmVjdF9nb3RvX2luX3Byb3RlY3RlZF9zY29wZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW5kaXJlY3RfZ290b193aXRob3V0X2FkZHJsYWJlbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW5pdF9jYXB0dXJlX2RlZHVjdGlvbl9mYWlsdXJlKQorRElBR19OQU1FX0lOREVYKGVycl9pbml0X2NhcHR1cmVfZGVkdWN0aW9uX2ZhaWx1cmVfZnJvbV9pbml0X2xpc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX2luaXRfY2FwdHVyZV9tdWx0aXBsZV9leHByZXNzaW9ucykKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW5pdF9jYXB0dXJlX25vX2V4cHJlc3Npb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2luaXRfY2FwdHVyZV9wYXJlbl9icmFjZXMpCitESUFHX05BTUVfSU5ERVgoZXJyX2luaXRfY29udmVyc2lvbl9mYWlsZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX2luaXRfZWxlbWVudF9ub3RfY29uc3RhbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX2luaXRfZm9yX2Z1bmN0aW9uX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2luaXRfaW5jb21wbGV0ZV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9pbml0X2xpc3RfYmFkX2Rlc3RfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW5pdF9saXN0X2Jpbl9vcCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW5pdF9tZXRob2RfYmFkX3JldHVybl90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9pbml0X25vbl9hZ2dyX2luaXRfbGlzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW5pdF9vYmpjX2NsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl9pbml0X3ByaW9yaXR5X29iamVjdF9hdHRyKQorRElBR19OQU1FX0lOREVYKGVycl9pbml0X3JlZmVyZW5jZV9tZW1iZXJfdW5pbml0aWFsaXplZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW5pdGlhbGl6ZXJfc3RyaW5nX2Zvcl9jaGFyX2FycmF5X3Rvb19sb25nKQorRElBR19OQU1FX0lOREVYKGVycl9pbmxpbmVfZGVjbF9mb2xsb3dzX2RlZikKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW5saW5lX2RlY2xhcmF0aW9uX2Jsb2NrX3Njb3BlKQorRElBR19OQU1FX0lOREVYKGVycl9pbmxpbmVfbWFpbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW5saW5lX21zX2FzbV9wYXJzaW5nKQorRElBR19OQU1FX0lOREVYKGVycl9pbmxpbmVfbmFtZXNwYWNlX2FsaWFzKQorRElBR19OQU1FX0lOREVYKGVycl9pbmxpbmVfbmFtZXNwYWNlX21pc21hdGNoKQorRElBR19OQU1FX0lOREVYKGVycl9pbmxpbmVfbmVzdGVkX25hbWVzcGFjZV9kZWZpbml0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9pbmxpbmVfbm9uX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9pbnRfdG9fYmxvY2tfcG9pbnRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW50ZWdlcl9saXRlcmFsX3Rvb19sYXJnZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW50ZWdlcl9zZXF1ZW5jZV9pbnRlZ3JhbF9lbGVtZW50X3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludGVnZXJfc2VxdWVuY2VfbmVnYXRpdmVfbGVuZ3RoKQorRElBR19OQU1FX0lOREVYKGVycl9pbnRlcm5hbF9saW5rYWdlX3JlZGVjbGFyYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2ludHJvZHVjaW5nX3NwZWNpYWxfZnJpZW5kKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX2FzbV9jYXN0X2x2YWx1ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF9hc21fdmFsdWVfZm9yX2NvbnN0cmFpbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfYXN0eXBlX29mX2RpZmZlcmVudF9zaXplKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX2F0dHJpYnV0ZV9vbl92aXJ0dWFsX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX2Jhc2VfaW5faW50ZXJmYWNlKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX2NoYXJfcmF3X2RlbGltKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX2NoYXJhY3Rlcl90b19jaGFyaWZ5KQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX2NoYXJhY3Rlcl91ZGwpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfY29sbGVjdGlvbl9lbGVtZW50KQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX2NvbXBsZXhfc3BlYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF9jb25zdGV4cHIpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfY29uc3RleHByX21lbWJlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF9jb25zdGV4cHJfdmFyX2RlY2wpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfY29udmVyc2lvbl9iZXR3ZWVuX2V4dF92ZWN0b3JzKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX2NvbnZlcnNpb25fYmV0d2Vlbl92ZWN0b3JfYW5kX2ludGVnZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfY29udmVyc2lvbl9iZXR3ZWVuX3ZlY3Rvcl9hbmRfc2NhbGFyKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX2NvbnZlcnNpb25fYmV0d2Vlbl92ZWN0b3JzKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX2NwdV9pcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF9jcHVfc3VwcG9ydHMpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfZGVjbF9zcGVjX2NvbWJpbmF0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX2RlY2xfc3BlY2lmaWVyX2luX25vbnR5cGVfcGFybSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF9kZWNsYXJhdG9yX2dsb2JhbF9zY29wZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF9kZWNsYXJhdG9yX2luX2Jsb2NrKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX2RlY2xhcmF0b3JfaW5fZnVuY3Rpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfZGVjbGFyYXRvcl9zY29wZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF9kaWdpdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF9mb3JtX3BvaW50ZXJfbWVtYmVyX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX2luY29tcGxldGVfdHlwZV91c2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfbWVtYmVyX2luX2ludGVyZmFjZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF9tZW1iZXJfdXNlX2luX3N0YXRpY19tZXRob2QpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfbmVvbl90eXBlX2NvZGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfbm9uX3N0YXRpY19tZW1iZXJfdXNlKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX25zbnVtYmVyX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfbnVtZXJpY191ZGwpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfb3BlcmF0b3Jfb25fdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF9wY3MpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfcGl4ZWxfZGVjbF9zcGVjX2NvbWJpbmF0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX3Byb3BlcnR5X25hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfcHJvdG9jb2xfcXVhbGlmaWVycykKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF9wdGhfZmlsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF9xdWFsaWZpZWRfY29uc3RydWN0b3IpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfcXVhbGlmaWVkX2Rlc3RydWN0b3IpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfcXVhbGlmaWVkX2Z1bmN0aW9uX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfcmVjZWl2ZXJfY2xhc3NfbWVzc2FnZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF9yZWNlaXZlcl90b19tZXNzYWdlX3N1cGVyKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX3JlZmVyZW5jZV9xdWFsaWZpZXJfYXBwbGljYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfc2lnbl9zcGVjKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX3N0b3JhZ2VfY2xhc3NfaW5fZnVuY19kZWNsKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX3N0cmluZ191ZGwpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfc3VmZml4X2NvbnN0YW50KQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX3N1cGVyX3Njb3BlKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX3RoaXNfdXNlKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX3RocmVhZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF90b2tlbl9hZnRlcl9kZWNsYXJhdG9yX3N1Z2dlc3RfZXF1YWwpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfdG9rZW5fYWZ0ZXJfdG9wbGV2ZWxfZGVjbGFyYXRvcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF90eXBlX2Zvcl9wcm9ncmFtX3Njb3BlX3ZhcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF91c2Vfb2ZfYXJyYXlfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF91c2Vfb2ZfZnVuY3Rpb25fdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF91dGY4KQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX3Zhcl90ZW1wbGF0ZV9zcGVjX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfdmVjdG9yX2Jvb2xfZGVjbF9zcGVjKQorRElBR19OQU1FX0lOREVYKGVycl9pbnZhbGlkX3ZlY3Rvcl9kZWNsX3NwZWNfY29tYmluYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfdmVjdG9yX2RvdWJsZV9kZWNsX3NwZWMpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfdmVjdG9yX2Zsb2F0X2RlY2xfc3BlYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF92ZWN0b3JfbG9uZ19kZWNsX3NwZWMpCitESUFHX05BTUVfSU5ERVgoZXJyX2ludmFsaWRfdmVjdG9yX2xvbmdfZG91YmxlX2RlY2xfc3BlYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF92ZWN0b3JfbG9uZ19sb25nX2RlY2xfc3BlYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF92ZnNfb3ZlcmxheSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaW52YWxpZF93aWR0aF9zcGVjKQorRElBR19OQU1FX0lOREVYKGVycl9pdmFyX2FjY2Vzc191c2luZ19wcm9wZXJ0eV9zeW50YXhfc3VnZ2VzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaXZhcl9pbl9zdXBlcmNsYXNzX3VzZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaXZhcl9yZWZlcmVuY2VfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfaXZhcl91c2VfaW5fY2xhc3NfbWV0aG9kKQorRElBR19OQU1FX0lOREVYKGVycl9rZXJuX2NhbGxfbm90X2dsb2JhbF9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfa2Vybl9pc19ub25zdGF0aWNfbWV0aG9kKQorRElBR19OQU1FX0lOREVYKGVycl9rZXJuX3R5cGVfbm90X3ZvaWRfcmV0dXJuKQorRElBR19OQU1FX0lOREVYKGVycl9rZXJuZWxfYXJnX2FkZHJlc3Nfc3BhY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2xfc3F1YXJlX2xfc3F1YXJlX25vdF9hdHRyaWJ1dGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2xhYmVsX2VuZF9vZl9jb21wb3VuZF9zdGF0ZW1lbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX2xhbWJkYV9jYXB0dXJlX2Fub255bW91c192YXIpCitESUFHX05BTUVfSU5ERVgoZXJyX2xhbWJkYV9jYXB0dXJlX2RlZmF1bHRfYXJnKQorRElBR19OQU1FX0lOREVYKGVycl9sYW1iZGFfY2FwdHVyZV9mbGV4YXJyYXlfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbGFtYmRhX2RlY2xfcmVmX25vdF9tb2RpZmlhYmxlX2x2YWx1ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbGFtYmRhX2RlY2xfc3BlY2lmaWVyX3JlcGVhdGVkKQorRElBR19OQU1FX0lOREVYKGVycl9sYW1iZGFfaW1wY2FwKQorRElBR19OQU1FX0lOREVYKGVycl9sYW1iZGFfaW5fY29uc3RhbnRfZXhwcmVzc2lvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbGFtYmRhX2luY29tcGxldGVfcmVzdWx0KQorRElBR19OQU1FX0lOREVYKGVycl9sYW1iZGFfbWlzc2luZ19wYXJlbnMpCitESUFHX05BTUVfSU5ERVgoZXJyX2xhbWJkYV9yZXR1cm5faW5pdF9saXN0KQorRElBR19OQU1FX0lOREVYKGVycl9sYW1iZGFfdW5ldmFsdWF0ZWRfb3BlcmFuZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbGFuZ3VhZ2VfbGlua2FnZV9zcGVjX25vdF9hc2NpaSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbGFuZ3VhZ2VfbGlua2FnZV9zcGVjX3Vua25vd24pCitESUFHX05BTUVfSU5ERVgoZXJyX2xhdGVfYXNtX2xhYmVsX25hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX2xleGluZ19zdHJpbmcpCitESUFHX05BTUVfSU5ERVgoZXJyX2xpc3RfaW5pdF9pbl9wYXJlbnMpCitESUFHX05BTUVfSU5ERVgoZXJyX2xpdGVyYWxfb3BlcmF0b3JfYmFkX3BhcmFtX2NvdW50KQorRElBR19OQU1FX0lOREVYKGVycl9saXRlcmFsX29wZXJhdG9yX2RlZmF1bHRfYXJndW1lbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX2xpdGVyYWxfb3BlcmF0b3JfZXh0ZXJuX2MpCitESUFHX05BTUVfSU5ERVgoZXJyX2xpdGVyYWxfb3BlcmF0b3JfaWRfb3V0c2lkZV9uYW1lc3BhY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX2xpdGVyYWxfb3BlcmF0b3JfaW52YWxpZF9wYXJhbSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbGl0ZXJhbF9vcGVyYXRvcl9vdXRzaWRlX25hbWVzcGFjZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbGl0ZXJhbF9vcGVyYXRvcl9wYXJhbSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbGl0ZXJhbF9vcGVyYXRvcl9zdHJpbmdfbm90X2VtcHR5KQorRElBR19OQU1FX0lOREVYKGVycl9saXRlcmFsX29wZXJhdG9yX3N0cmluZ19wcmVmaXgpCitESUFHX05BTUVfSU5ERVgoZXJyX2xpdGVyYWxfb3BlcmF0b3JfdGVtcGxhdGUpCitESUFHX05BTUVfSU5ERVgoZXJyX2xpdGVyYWxfb3BlcmF0b3JfdGVtcGxhdGVfd2l0aF9wYXJhbXMpCitESUFHX05BTUVfSU5ERVgoZXJyX2xvY2FsX2NhbnRfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbHZhbHVlX3JlZmVyZW5jZV9iaW5kX3RvX2luaXRsaXN0KQorRElBR19OQU1FX0lOREVYKGVycl9sdmFsdWVfcmVmZXJlbmNlX2JpbmRfdG9fdGVtcG9yYXJ5KQorRElBR19OQU1FX0lOREVYKGVycl9sdmFsdWVfcmVmZXJlbmNlX2JpbmRfdG9fdW5yZWxhdGVkKQorRElBR19OQU1FX0lOREVYKGVycl9sdmFsdWVfdG9fcnZhbHVlX3JlZikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWFjaGluZV9tb2RlKQorRElBR19OQU1FX0lOREVYKGVycl9tYWluX2FyZ193cm9uZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWFpbl9nbG9iYWxfdmFyaWFibGUpCitESUFHX05BTUVfSU5ERVgoZXJyX21haW5fcmV0dXJuc19ub25pbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX21haW5fc3VycGx1c19hcmdzKQorRElBR19OQU1FX0lOREVYKGVycl9tYWlubGlrZV90ZW1wbGF0ZV9kZWNsKQorRElBR19OQU1FX0lOREVYKGVycl9tYWxmb3JtZWRfc3RkX2Nvcm91dGluZV9oYW5kbGUpCitESUFHX05BTUVfSU5ERVgoZXJyX21hbGZvcm1lZF9zdGRfY29yb3V0aW5lX3RyYWl0cykKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWFsZm9ybWVkX3N0ZF9pbml0aWFsaXplcl9saXN0KQorRElBR19OQU1FX0lOREVYKGVycl9tYWxmb3JtZWRfc3RkX25vdGhyb3cpCitESUFHX05BTUVfSU5ERVgoZXJyX21heWJlX2ZhbGxvZmZfbm9udm9pZF9ibG9jaykKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWVtX2luaXRfbm90X21lbWJlcl9vcl9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWVtX2luaXRfbm90X21lbWJlcl9vcl9jbGFzc19zdWdnZXN0KQorRElBR19OQU1FX0lOREVYKGVycl9tZW1iZXJfY2FsbF93aXRob3V0X29iamVjdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWVtYmVyX2RlY2xfZG9lc19ub3RfbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX21lbWJlcl9kZWNsX2RvZXNfbm90X21hdGNoX3N1Z2dlc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX21lbWJlcl9kZWZfZG9lc19ub3RfbWF0Y2hfcmV0X3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX21lbWJlcl9kZWZfdW5kZWZpbmVkX3JlY29yZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWVtYmVyX2V4dHJhX3F1YWxpZmljYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX21lbWJlcl9mdW5jdGlvbl9jYWxsX2JhZF9jdnIpCitESUFHX05BTUVfSU5ERVgoZXJyX21lbWJlcl9mdW5jdGlvbl9jYWxsX2JhZF9yZWYpCitESUFHX05BTUVfSU5ERVgoZXJyX21lbWJlcl9mdW5jdGlvbl9jYWxsX2JhZF90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9tZW1iZXJfZnVuY3Rpb25faW5pdGlhbGl6YXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX21lbWJlcl9uYW1lX29mX2NsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl9tZW1iZXJfbm90X3lldF9pbnN0YW50aWF0ZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX21lbWJlcl9xdWFsaWZpY2F0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9tZW1iZXJfcmVkZWNsYXJlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWVtYmVyX3JlZGVjbGFyZWRfaW5faW5zdGFudGlhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWVtYmVyX3JlZmVyZW5jZV9uZWVkc19jYWxsKQorRElBR19OQU1FX0lOREVYKGVycl9tZW1wb2ludGVyX2luX25vbmNsYXNzX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX21lbXB0cl9jb252X3ZpYV92aXJ0dWFsKQorRElBR19OQU1FX0lOREVYKGVycl9tZXRob2Rfbm90X2ZvdW5kX3dpdGhfdHlwbykKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWlzbWF0Y2hlZF9leGNlcHRpb25fc3BlYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWlzbWF0Y2hlZF9leGNlcHRpb25fc3BlY19leHBsaWNpdF9pbnN0YW50aWF0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9taXNtYXRjaGVkX21zX2luaGVyaXRhbmNlKQorRElBR19OQU1FX0lOREVYKGVycl9taXNtYXRjaGVkX293bmluZ19tb2R1bGUpCitESUFHX05BTUVfSU5ERVgoZXJyX21pc21hdGNoZWRfdXVpZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWlzbWF0Y2hlZF92aXNpYmlsaXR5KQorRElBR19OQU1FX0lOREVYKGVycl9taXNwbGFjZWRfZWxsaXBzaXNfaW5fZGVjbGFyYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX21pc3BsYWNlZF9pdmFyKQorRElBR19OQU1FX0lOREVYKGVycl9taXNzaW5nX2FjdHVhbF9waXBlX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX21pc3NpbmdfYXRzaWduX3ByZWZpeCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWlzc2luZ19iZWZvcmVfbW9kdWxlX2VuZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWlzc2luZ19jYXRjaF9maW5hbGx5KQorRElBR19OQU1FX0lOREVYKGVycl9taXNzaW5nX2NvbW1hX2JlZm9yZV9lbGxpcHNpcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWlzc2luZ19kZWZhdWx0X2N0b3IpCitESUFHX05BTUVfSU5ERVgoZXJyX21pc3NpbmdfZGVwZW5kZW50X3RlbXBsYXRlX2tleXdvcmQpCitESUFHX05BTUVfSU5ERVgoZXJyX21pc3NpbmdfZW5kX29mX2RlZmluaXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX21pc3NpbmdfZXhjZXB0aW9uX3NwZWNpZmljYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX21pc3NpbmdfbWV0aG9kX2NvbnRleHQpCitESUFHX05BTUVfSU5ERVgoZXJyX21pc3NpbmdfbW9kdWxlKQorRElBR19OQU1FX0lOREVYKGVycl9taXNzaW5nX21vZHVsZV9uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9taXNzaW5nX29wZW5fc3F1YXJlX21lc3NhZ2Vfc2VuZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWlzc2luZ19wYXJhbSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWlzc2luZ19wcm9wZXJ0eV9jb250ZXh0KQorRElBR19OQU1FX0lOREVYKGVycl9taXNzaW5nX3Byb3BlcnR5X2ludGVyZmFjZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWlzc2luZ19wcm9wZXJ0eV9pdmFyX2RlY2wpCitESUFHX05BTUVfSU5ERVgoZXJyX21pc3NpbmdfdHlwZV9zcGVjaWZpZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX21pc3NpbmdfdmZzX292ZXJsYXlfZmlsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbWlzc2luZ193aGl0ZXNwYWNlX2RpZ3JhcGgpCitESUFHX05BTUVfSU5ERVgoZXJyX21peGluZ19jeHhfdHJ5X3NlaF90cnkpCitESUFHX05BTUVfSU5ERVgoZXJyX21tYXBfY29uZmlnX21hY3JvX3N1Ym1vZHVsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW1hcF9jb25mbGljdGluZ19leHBvcnRfYXMpCitESUFHX05BTUVfSU5ERVgoZXJyX21tYXBfZHVwbGljYXRlX2hlYWRlcl9hdHRyaWJ1dGUpCitESUFHX05BTUVfSU5ERVgoZXJyX21tYXBfZXhwZWN0ZWRfYXR0cmlidXRlKQorRElBR19OQU1FX0lOREVYKGVycl9tbWFwX2V4cGVjdGVkX2NvbmZpZ19tYWNybykKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW1hcF9leHBlY3RlZF9jb25mbGljdHNfY29tbWEpCitESUFHX05BTUVfSU5ERVgoZXJyX21tYXBfZXhwZWN0ZWRfY29uZmxpY3RzX21lc3NhZ2UpCitESUFHX05BTUVfSU5ERVgoZXJyX21tYXBfZXhwZWN0ZWRfZXhwb3J0X3dpbGRjYXJkKQorRElBR19OQU1FX0lOREVYKGVycl9tbWFwX2V4cGVjdGVkX2ZlYXR1cmUpCitESUFHX05BTUVfSU5ERVgoZXJyX21tYXBfZXhwZWN0ZWRfaGVhZGVyKQorRElBR19OQU1FX0lOREVYKGVycl9tbWFwX2V4cGVjdGVkX2hlYWRlcl9hdHRyaWJ1dGUpCitESUFHX05BTUVfSU5ERVgoZXJyX21tYXBfZXhwZWN0ZWRfaW5mZXJyZWRfbWVtYmVyKQorRElBR19OQU1FX0lOREVYKGVycl9tbWFwX2V4cGVjdGVkX2xicmFjZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW1hcF9leHBlY3RlZF9sYnJhY2Vfd2lsZGNhcmQpCitESUFHX05BTUVfSU5ERVgoZXJyX21tYXBfZXhwZWN0ZWRfbGlicmFyeV9uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9tbWFwX2V4cGVjdGVkX21lbWJlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW1hcF9leHBlY3RlZF9tbWFwX2ZpbGUpCitESUFHX05BTUVfSU5ERVgoZXJyX21tYXBfZXhwZWN0ZWRfbW9kdWxlKQorRElBR19OQU1FX0lOREVYKGVycl9tbWFwX2V4cGVjdGVkX21vZHVsZV9uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9tbWFwX2V4cGVjdGVkX3JicmFjZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW1hcF9leHBlY3RlZF9yc3F1YXJlKQorRElBR19OQU1FX0lOREVYKGVycl9tbWFwX2V4cGxpY2l0X2luZmVycmVkX2ZyYW1ld29yaykKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW1hcF9leHBsaWNpdF90b3BfbGV2ZWwpCitESUFHX05BTUVfSU5ERVgoZXJyX21tYXBfaW5mZXJyZWRfZnJhbWV3b3JrX3N1Ym1vZHVsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW1hcF9pbmZlcnJlZF9ub191bWJyZWxsYSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW1hcF9pbmZlcnJlZF9yZWRlZikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW1hcF9pbnZhbGlkX2hlYWRlcl9hdHRyaWJ1dGVfdmFsdWUpCitESUFHX05BTUVfSU5ERVgoZXJyX21tYXBfbWlzc2luZ19leGNsdWRlX25hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX21tYXBfbWlzc2luZ19tb2R1bGVfcXVhbGlmaWVkKQorRElBR19OQU1FX0lOREVYKGVycl9tbWFwX21pc3NpbmdfbW9kdWxlX3VucXVhbGlmaWVkKQorRElBR19OQU1FX0lOREVYKGVycl9tbWFwX21vZHVsZV9pZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW1hcF9tb2R1bGVfcmVkZWZpbml0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9tbWFwX25lc3RlZF9zdWJtb2R1bGVfaWQpCitESUFHX05BTUVfSU5ERVgoZXJyX21tYXBfc3VibW9kdWxlX2V4cG9ydF9hcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW1hcF90b3BfbGV2ZWxfaW5mZXJyZWRfc3VibW9kdWxlKQorRElBR19OQU1FX0lOREVYKGVycl9tbWFwX3VtYnJlbGxhX2NsYXNoKQorRElBR19OQU1FX0lOREVYKGVycl9tbWFwX3Vua25vd25fdG9rZW4pCitESUFHX05BTUVfSU5ERVgoZXJyX21tYXBfdXNlX2RlY2xfc3VibW9kdWxlKQorRElBR19OQU1FX0lOREVYKGVycl9tb2RlX25vdF9wcmltaXRpdmUpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZGVfd3JvbmdfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW9kdWxlX2J1aWxkX2Rpc2FibGVkKQorRElBR19OQU1FX0lOREVYKGVycl9tb2R1bGVfYnVpbGRfcmVxdWlyZXNfZm1vZHVsZXMpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV9idWlsZF9zaGFkb3dlZF9zdWJtb2R1bGUpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV9jYW5ub3RfY3JlYXRlX2luY2x1ZGVzKQorRElBR19OQU1FX0lOREVYKGVycl9tb2R1bGVfY3ljbGUpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV9kZWNsX2luX21vZHVsZV9tYXBfbW9kdWxlKQorRElBR19OQU1FX0lOREVYKGVycl9tb2R1bGVfZGVjbGFyYXRpb25fbWlzc2luZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW9kdWxlX2RpZmZlcmVudF9tb2RtYXApCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV9leHBlY3RlZF9pZGVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW9kdWxlX2V4cGVjdGVkX3NlbWkpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV9maWxlX2NvbmZsaWN0KQorRElBR19OQU1FX0lOREVYKGVycl9tb2R1bGVfZmlsZV9pbnZhbGlkKQorRElBR19OQU1FX0lOREVYKGVycl9tb2R1bGVfZmlsZV9ub3RfZm91bmQpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV9maWxlX25vdF9tb2R1bGUpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV9maWxlX291dF9vZl9kYXRlKQorRElBR19OQU1FX0lOREVYKGVycl9tb2R1bGVfZm9ybWF0X3VuaGFuZGxlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW9kdWxlX2hlYWRlcl9taXNzaW5nKQorRElBR19OQU1FX0lOREVYKGVycl9tb2R1bGVfaW1wbGVtZW50YXRpb25fcGFydGl0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9tb2R1bGVfaW1wb3J0X2luX2ltcGxlbWVudGF0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9tb2R1bGVfaW1wb3J0X25vdF9hdF90b3BfbGV2ZWxfZmF0YWwpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV9pbnRlcmZhY2VfaW1wbGVtZW50YXRpb25fbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV9pbnRlcmZhY2VfcmVxdWlyZXNfbW9kdWxlc190cykKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW9kdWxlX21hcF9ub3RfZm91bmQpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV9ub19zaXplX210aW1lX2Zvcl9oZWFkZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV9ub3RfYnVpbHQpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV9ub3RfZGVmaW5lZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW9kdWxlX25vdF9mb3VuZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW9kdWxlX29kcl92aW9sYXRpb25fZGVmaW5pdGlvbl9kYXRhKQorRElBR19OQU1FX0lOREVYKGVycl9tb2R1bGVfb2RyX3Zpb2xhdGlvbl9kaWZmZXJlbnRfZGVmaW5pdGlvbnMpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV9vZHJfdmlvbGF0aW9uX2RpZmZlcmVudF9pbnN0YW50aWF0aW9ucykKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW9kdWxlX29kcl92aW9sYXRpb25fZnVuY3Rpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV9vZHJfdmlvbGF0aW9uX21pc21hdGNoX2RlY2wpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV9vZHJfdmlvbGF0aW9uX21pc21hdGNoX2RlY2xfZGlmZikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW9kdWxlX29kcl92aW9sYXRpb25fbWlzbWF0Y2hfZGVjbF91bmtub3duKQorRElBR19OQU1FX0lOREVYKGVycl9tb2R1bGVfb2RyX3Zpb2xhdGlvbl9taXNzaW5nX2RlY2wpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV9vZHJfdmlvbGF0aW9uX3RlbXBsYXRlX3BhcmFtZXRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW9kdWxlX3ByZWJ1aWx0KQorRElBR19OQU1FX0lOREVYKGVycl9tb2R1bGVfcHJpdmF0ZV9sb2NhbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW9kdWxlX3ByaXZhdGVfbG9jYWxfY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV9wcml2YXRlX3NwZWNpYWxpemF0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9tb2R1bGVfcmVkZWNsYXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW9kdWxlX3JlZGVmaW5pdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW9kdWxlX3NlbGZfaW1wb3J0KQorRElBR19OQU1FX0lOREVYKGVycl9tb2R1bGVfc2hhZG93ZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZV91bmF2YWlsYWJsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbW9kdWxlX3VuaW1wb3J0ZWRfdXNlKQorRElBR19OQU1FX0lOREVYKGVycl9tb2R1bGVfdW5pbXBvcnRlZF91c2VfaGVhZGVyKQorRElBR19OQU1FX0lOREVYKGVycl9tb2R1bGVfdW5pbXBvcnRlZF91c2VfbXVsdGlwbGUpCitESUFHX05BTUVfSU5ERVgoZXJyX21vZHVsZXNfZW1iZWRfZmlsZV9ub3RfZm91bmQpCitESUFHX05BTUVfSU5ERVgoZXJyX21zX19fbGVhdmVfbm90X2luX19fdHJ5KQorRElBR19OQU1FX0lOREVYKGVycl9tc19hdHRyaWJ1dGVzX25vdF9lbmFibGVkKQorRElBR19OQU1FX0lOREVYKGVycl9tc19kZWNsc3BlY190eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9tc19wcm9wZXJ0eV9kdXBsaWNhdGVfYWNjZXNzb3IpCitESUFHX05BTUVfSU5ERVgoZXJyX21zX3Byb3BlcnR5X2V4cGVjdGVkX2FjY2Vzc29yX25hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX21zX3Byb3BlcnR5X2V4cGVjdGVkX2NvbW1hX29yX3JwYXJlbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbXNfcHJvcGVydHlfZXhwZWN0ZWRfZXF1YWwpCitESUFHX05BTUVfSU5ERVgoZXJyX21zX3Byb3BlcnR5X2hhc19zZXRfYWNjZXNzb3IpCitESUFHX05BTUVfSU5ERVgoZXJyX21zX3Byb3BlcnR5X2luaXRpYWxpemVyKQorRElBR19OQU1FX0lOREVYKGVycl9tc19wcm9wZXJ0eV9taXNzaW5nX2FjY2Vzc29yX2tpbmQpCitESUFHX05BTUVfSU5ERVgoZXJyX21zX3Byb3BlcnR5X25vX2dldHRlcl9vcl9wdXR0ZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX21zX3Byb3BlcnR5X3Vua25vd25fYWNjZXNzb3IpCitESUFHX05BTUVfSU5ERVgoZXJyX21zX3ZhX3N0YXJ0X3VzZWRfaW5fc3lzdl9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbXNhc21fdW5hYmxlX3RvX2NyZWF0ZV90YXJnZXQpCitESUFHX05BTUVfSU5ERVgoZXJyX21zYXNtX3Vuc3VwcG9ydGVkX2FyY2gpCitESUFHX05BTUVfSU5ERVgoZXJyX21zdmNfYW5ub3RhdGlvbl93aWRlX3N0cikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbXRfbWVzc2FnZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbXVsdGljaGFyX3V0Zl9jaGFyYWN0ZXJfbGl0ZXJhbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbXVsdGlwbGVfYmFzZV9pbml0aWFsaXphdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbXVsdGlwbGVfZGVmX2luZGV4KQorRElBR19OQU1FX0lOREVYKGVycl9tdWx0aXBsZV9kZWZhdWx0X2xhYmVsc19kZWZpbmVkKQorRElBR19OQU1FX0lOREVYKGVycl9tdWx0aXBsZV9maW5hbF9vdmVycmlkZXJzKQorRElBR19OQU1FX0lOREVYKGVycl9tdWx0aXBsZV9tZW1faW5pdGlhbGl6YXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX211bHRpcGxlX21lbV91bmlvbl9pbml0aWFsaXphdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbXVsdGlwbGVfdGVtcGxhdGVfZGVjbGFyYXRvcnMpCitESUFHX05BTUVfSU5ERVgoZXJyX211bHRpdmVyc2lvbl9hZnRlcl91c2VkKQorRElBR19OQU1FX0lOREVYKGVycl9tdWx0aXZlcnNpb25fZGlmZikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbXVsdGl2ZXJzaW9uX2RvZXNudF9zdXBwb3J0KQorRElBR19OQU1FX0lOREVYKGVycl9tdWx0aXZlcnNpb25fZHVwbGljYXRlKQorRElBR19OQU1FX0lOREVYKGVycl9tdWx0aXZlcnNpb25fbm9fb3RoZXJfYXR0cnMpCitESUFHX05BTUVfSU5ERVgoZXJyX211bHRpdmVyc2lvbl9ub3Byb3RvKQorRElBR19OQU1FX0lOREVYKGVycl9tdWx0aXZlcnNpb25fbm90X2FsbG93ZWRfb25fbWFpbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbXVsdGl2ZXJzaW9uX25vdF9zdXBwb3J0ZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX211dGFibGVfY29uc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX211dGFibGVfZnVuY3Rpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX211dGFibGVfbm9ubWVtYmVyKQorRElBR19OQU1FX0lOREVYKGVycl9tdXRhYmxlX3JlZmVyZW5jZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbmFtZXNwYWNlX25vbm5hbWVzcGFjZV9zY29wZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbmVlZF9oZWFkZXJfYmVmb3JlX21zX3V1aWRvZikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbmVlZF9oZWFkZXJfYmVmb3JlX3R5cGVpZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbmVzdGVkX25hbWVfbWVtYmVyX3JlZl9sb29rdXBfYW1iaWd1b3VzKQorRElBR19OQU1FX0lOREVYKGVycl9uZXN0ZWRfbmFtZV9zcGVjX2lzX25vdF9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfbmVzdGVkX25hbWVfc3BlY19ub25fdGFnKQorRElBR19OQU1FX0lOREVYKGVycl9uZXN0ZWRfbm9uX3N0YXRpY19tZW1iZXJfdXNlKQorRElBR19OQU1FX0lOREVYKGVycl9uZXN0ZWRfcmVkZWZpbml0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9uZXdfYWJpX3RhZ19vbl9yZWRlY2xhcmF0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9uZXdfYXJyYXlfaW5pdF9hcmdzKQorRElBR19OQU1FX0lOREVYKGVycl9uZXdfYXJyYXlfbm9uY29uc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX25ld19hcnJheV9vZl9hdXRvKQorRElBR19OQU1FX0lOREVYKGVycl9uZXdfaW5jb21wbGV0ZV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9ub19hY2Nlc3Nvcl9mb3JfcHJvcGVydHkpCitESUFHX05BTUVfSU5ERVgoZXJyX25vX2Jhc2VfY2xhc3NlcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm9fZHluYW1pY19jYXN0X3dpdGhfZm5vX3J0dGkpCitESUFHX05BTUVfSU5ERVgoZXJyX25vX2V4dGVybmFsX2Fzc2VtYmxlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm9fbWF0Y2hpbmdfbG9jYWxfZnJpZW5kKQorRElBR19OQU1FX0lOREVYKGVycl9ub19tYXRjaGluZ19sb2NhbF9mcmllbmRfc3VnZ2VzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm9fbWF0Y2hpbmdfcGFyYW0pCitESUFHX05BTUVfSU5ERVgoZXJyX25vX21lbWJlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm9fbWVtYmVyX292ZXJsb2FkZWRfYXJyb3cpCitESUFHX05BTUVfSU5ERVgoZXJyX25vX21lbWJlcl9zdWdnZXN0KQorRElBR19OQU1FX0lOREVYKGVycl9ub19tZW1iZXJfdGVtcGxhdGUpCitESUFHX05BTUVfSU5ERVgoZXJyX25vX21lbWJlcl90ZW1wbGF0ZV9zdWdnZXN0KQorRElBR19OQU1FX0lOREVYKGVycl9ub19uc2NvbnN0YW50X3N0cmluZ19jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm9fc3VibW9kdWxlKQorRElBR19OQU1FX0lOREVYKGVycl9ub19zdWJtb2R1bGVfc3VnZ2VzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm9fc3Vib2JqZWN0X3Byb3BlcnR5X3NldHRpbmcpCitESUFHX05BTUVfSU5ERVgoZXJyX25vX3N1aXRhYmxlX2RlbGV0ZV9tZW1iZXJfZnVuY3Rpb25fZm91bmQpCitESUFHX05BTUVfSU5ERVgoZXJyX25vX3N1cGVyX2NsYXNzX21lc3NhZ2UpCitESUFHX05BTUVfSU5ERVgoZXJyX25vX3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKGVycl9ub190ZW1wbGF0ZV9zdWdnZXN0KQorRElBR19OQU1FX0lOREVYKGVycl9ub190eXBlaWRfd2l0aF9mbm9fcnR0aSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm9leGNlcHRfbmVlZHNfY29uc3RhbnRfZXhwcmVzc2lvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm9nZXR0ZXJfcHJvcGVydHlfY29tcG91bmRfYXNzaWdubWVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm9nZXR0ZXJfcHJvcGVydHlfaW5jZGVjKQorRElBR19OQU1FX0lOREVYKGVycl9ub25fYXNjaWkpCitESUFHX05BTUVfSU5ERVgoZXJyX25vbl9hc21fc3RtdF9pbl9uYWtlZF9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm9uX2RlbGV0ZWRfb3ZlcnJpZGUpCitESUFHX05BTUVfSU5ERVgoZXJyX25vbl9leHRlcm5fZXh0ZXJuKQorRElBR19OQU1FX0lOREVYKGVycl9ub25fbG9jYWxfdmFyaWFibGVfZGVjbF9pbl9mb3IpCitESUFHX05BTUVfSU5ERVgoZXJyX25vbl9zdGF0aWNfc3RhdGljKQorRElBR19OQU1FX0lOREVYKGVycl9ub25fdGVtcGxhdGVfaW5fbWVtYmVyX3RlbXBsYXRlX2lkX3N1Z2dlc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX25vbl90ZW1wbGF0ZV9pbl90ZW1wbGF0ZV9pZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm9uX3RlbXBsYXRlX2luX3RlbXBsYXRlX2lkX3N1Z2dlc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX25vbl90aHJlYWRfdGhyZWFkKQorRElBR19OQU1FX0lOREVYKGVycl9ub25fdHlwZV90ZW1wbGF0ZV9hcmdfYWRkcl9sYWJlbF9kaWZmKQorRElBR19OQU1FX0lOREVYKGVycl9ub25fdHlwZV90ZW1wbGF0ZV9hcmdfc3Vib2JqZWN0KQorRElBR19OQU1FX0lOREVYKGVycl9ub25fdHlwZV90ZW1wbGF0ZV9pbl9uZXN0ZWRfbmFtZV9zcGVjaWZpZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX25vbl90eXBlX3RlbXBsYXRlX3Bhcm1fdHlwZV9kZWR1Y3Rpb25fZmFpbHVyZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm9uX3ZhcmlhYmxlX2RlY2xfaW5fZm9yKQorRElBR19OQU1FX0lOREVYKGVycl9ub25fdmlydHVhbF9wdXJlKQorRElBR19OQU1FX0lOREVYKGVycl9ub25mdW5jdGlvbl9ibG9ja190eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9ub25zdGF0aWNfbWVtYmVyX291dF9vZl9saW5lKQorRElBR19OQU1FX0lOREVYKGVycl9ub250ZW1wb3JhbF9idWlsdGluX211c3RfYmVfcG9pbnRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm9udGVtcG9yYWxfYnVpbHRpbl9tdXN0X2JlX3BvaW50ZXJfaW50Zmx0cHRyX29yX3ZlY3RvcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm9yZXR1cm5fYmxvY2tfaGFzX3JldHVybl9leHByKQorRElBR19OQU1FX0lOREVYKGVycl9ub3JldHVybl9sYW1iZGFfaGFzX3JldHVybl9leHByKQorRElBR19OQU1FX0lOREVYKGVycl9ub3JldHVybl9taXNzaW5nX29uX2ZpcnN0X2RlY2wpCitESUFHX05BTUVfSU5ERVgoZXJyX25vcmV0dXJuX25vbl9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm9zZXR0ZXJfcHJvcGVydHlfYXNzaWdubWVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm9zZXR0ZXJfcHJvcGVydHlfaW5jZGVjKQorRElBR19OQU1FX0lOREVYKGVycl9ub3RfY2xhc3NfdGVtcGxhdGVfc3BlY2lhbGl6YXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX25vdF9kaXJlY3RfYmFzZV9vcl92aXJ0dWFsKQorRElBR19OQU1FX0lOREVYKGVycl9ub3RfZm91bmRfYnlfdHdvX3BoYXNlX2xvb2t1cCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm90X2ludGVncmFsX3R5cGVfYW5vbl9iaXRmaWVsZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbm90X2ludGVncmFsX3R5cGVfYml0ZmllbGQpCitESUFHX05BTUVfSU5ERVgoZXJyX25vdF90YWdfaW5fc2NvcGUpCitESUFHX05BTUVfSU5ERVgoZXJyX25zX2F0dHJpYnV0ZV93cm9uZ19wYXJhbWV0ZXJfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbnNjb25zdW1lZF9hdHRyaWJ1dGVfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX25zbnVtYmVyX25vbmxpdGVyYWxfdW5hcnkpCitESUFHX05BTUVfSU5ERVgoZXJyX25zb2JqZWN0X2F0dHJpYnV0ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbnNyZXR1cm5zX3JldGFpbmVkX2F0dHJpYnV0ZV9taXNtYXRjaCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfbnVsbGFiaWxpdHlfY29uZmxpY3RpbmcpCitESUFHX05BTUVfSU5ERVgoZXJyX251bGxhYmlsaXR5X2NzX211bHRpbGV2ZWwpCitESUFHX05BTUVfSU5ERVgoZXJyX251bGxhYmlsaXR5X25vbnBvaW50ZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfYXJyYXlfb2ZfaW50ZXJmYWNlcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY19hdHRyX25vdF9pZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY19hdHRyX3Byb3RvY29sX3JlcXVpcmVzX2RlZmluaXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfYXR0cl90eXBlZGVmX25vdF9pZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY19hdHRyX3R5cGVkZWZfbm90X3ZvaWRfcG9pbnRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY19icmlkZ2VkX3JlbGF0ZWRfaW52YWxpZF9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY19icmlkZ2VkX3JlbGF0ZWRfaW52YWxpZF9jbGFzc19uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX2JyaWRnZWRfcmVsYXRlZF9rbm93bl9tZXRob2QpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfY2ZfYnJpZGdlZF9ub3RfaW50ZXJmYWNlKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX2NvbmNhdF9zdHJpbmcpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfZGVjbHNfbWF5X29ubHlfYXBwZWFyX2luX2dsb2JhbF9zY29wZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY19kaXJlY3RpdmVfb25seV9pbl9wcm90b2NvbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY19leGNlcHRpb25zX2Rpc2FibGVkKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX2V4cGVjdGVkX2VxdWFsX2Zvcl9nZXR0ZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfZXhwZWN0ZWRfZXF1YWxfZm9yX3NldHRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY19leHBlY3RlZF9wcm9wZXJ0eV9hdHRyKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX2V4cGVjdGVkX3NlbGVjdG9yX2Zvcl9nZXR0ZXJfc2V0dGVyKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX2V4cGVjdGVkX3R5cGVfcGFyYW1ldGVyKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX2lsbGVnYWxfYm94ZWRfZXhwcmVzc2lvbl90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX2lsbGVnYWxfaW50ZXJmYWNlX3F1YWwpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfaWxsZWdhbF92aXNpYmlsaXR5X3NwZWMpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfaW5jb21wbGV0ZV9ib3hlZF9leHByZXNzaW9uX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfaW5kZXhfaW5jb21wbGV0ZV9jbGFzc190eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX2luZGV4aW5nX21ldGhvZF9yZXN1bHRfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY19raW5kb2Zfbm9ub2JqZWN0KQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX2tpbmRvZl93cm9uZ19wb3NpdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY19saXRlcmFsX21ldGhvZF9zaWcpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfbWV0aG9kX3Vuc3VwcG9ydGVkX3BhcmFtX3JldF90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX21pc3NpbmdfZW5kKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX211bHRpcGxlX3N1YnNjcmlwdF90eXBlX2NvbnZlcnNpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfbm9uX3RyaXZpYWxseV9jb3B5YWJsZV9ib3hlZF9leHByZXNzaW9uX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfbnNfYnJpZGdlZF9pbnZhbGlkX2Nmb2JqZWN0KQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX29iamVjdF9hc3NpZ25tZW50KQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX29iamVjdF9jYXRjaCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY19wYXJhbWV0ZXJpemVkX2NhdGVnb3J5X25vbmNsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX3BhcmFtZXRlcml6ZWRfZm9yd2FyZF9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY19wYXJhbWV0ZXJpemVkX2ZvcndhcmRfY2xhc3NfZmlyc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfcGFyYW1ldGVyaXplZF9pbXBsZW1lbnRhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY19wb3N0Zml4X2F0dHJpYnV0ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY19wb3N0Zml4X2F0dHJpYnV0ZV9oaW50KQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX3ByZWNpc2VfbGlmZXRpbWVfYmFkX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfcHJvcGVydGllc19yZXF1aXJlX29iamMyKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX3Byb3BlcnR5X2F0dHJfbXV0dWFsbHlfZXhjbHVzaXZlKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX3Byb3BlcnR5X2JpdGZpZWxkKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX3Byb3BlcnR5X3JlcXVpcmVzX2ZpZWxkX25hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfcHJvcGVydHlfcmVxdWlyZXNfb2JqZWN0KQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX3Jvb3RfY2xhc3Nfc3ViY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfcnVudGltZV92aXNpYmxlX2NhdGVnb3J5KQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX3J1bnRpbWVfdmlzaWJsZV9zdWJjbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY19zdWJzY3JpcHRfYmFzZV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX3N1YnNjcmlwdF9kaWNfb2JqZWN0X3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfc3Vic2NyaXB0X2luZGV4X3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfc3Vic2NyaXB0X2tleV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX3N1YnNjcmlwdF9tZXRob2Rfbm90X2ZvdW5kKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX3N1YnNjcmlwdF9vYmplY3RfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY19zdWJzY3JpcHRfcG9pbnRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY19zdWJzY3JpcHRfdHlwZV9jb252ZXJzaW9uKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX3N5bmNocm9uaXplZF9leHBlY3RzX29iamVjdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY190aHJvd19leHBlY3RzX29iamVjdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY190eXBlX2FyZ19kb2VzX25vdF9tYXRjaF9ib3VuZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY190eXBlX2FyZ19leHBsaWNpdF9udWxsYWJpbGl0eSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY190eXBlX2FyZ19taXNzaW5nKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX3R5cGVfYXJnX21pc3Npbmdfc3RhcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY190eXBlX2FyZ19ub3RfaWRfY29tcGF0aWJsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY190eXBlX2FyZ19xdWFsaWZpZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfdHlwZV9hcmdzX2FmdGVyX3Byb3RvY29scykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY190eXBlX2FyZ3NfYW5kX3Byb3RvY29scykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY190eXBlX2FyZ3Nfbm9uX2NsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX3R5cGVfYXJnc19ub25fcGFyYW1ldGVyaXplZF9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY190eXBlX2FyZ3Nfc3BlY2lhbGl6ZWRfY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfdHlwZV9hcmdzX3dyb25nX2FyaXR5KQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX3R5cGVfcGFyYW1fYXJpdHlfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfdHlwZV9wYXJhbV9ib3VuZF9jb25mbGljdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY190eXBlX3BhcmFtX2JvdW5kX2V4cGxpY2l0X251bGxhYmlsaXR5KQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX3R5cGVfcGFyYW1fYm91bmRfbWlzc2luZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY190eXBlX3BhcmFtX2JvdW5kX21pc3NpbmdfcG9pbnRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY190eXBlX3BhcmFtX2JvdW5kX25vbm9iamVjdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY190eXBlX3BhcmFtX2JvdW5kX3F1YWxpZmllZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY190eXBlX3BhcmFtX3JlZGVjbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY190eXBlX3BhcmFtX3ZhcmlhbmNlX2NvbmZsaWN0KQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX3VuZXhwZWN0ZWRfYXRlbmQpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfdW5leHBlY3RlZF9hdHRyKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjX3Vua25vd25fYXQpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfdmFyX2RlY2xfaW5jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY192YXJpYWJsZV9zaXplZF90eXBlX25vdF9hdF9lbmQpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNfd2Vha191bnN1cHBvcnRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqY193ZWFrX3dpdGhfZ2MpCitESUFHX05BTUVfSU5ERVgoZXJyX29iamNicmlkZ2VfcmVsYXRlZF9leHBlY3RlZF9yZWxhdGVkX2NsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl9vYmpjYnJpZGdlX3JlbGF0ZWRfc2VsZWN0b3JfbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2JqZWN0X2Nhbm5vdF9iZV9wYXNzZWRfcmV0dXJuZWRfYnlfdmFsdWUpCitESUFHX05BTUVfSU5ERVgoZXJyX29kcl9kaWZmZXJlbnRfbnVtX3RlbXBsYXRlX3BhcmFtZXRlcnMpCitESUFHX05BTUVfSU5ERVgoZXJyX29kcl9kaWZmZXJlbnRfdGVtcGxhdGVfcGFyYW1ldGVyX2tpbmQpCitESUFHX05BTUVfSU5ERVgoZXJyX29kcl9maWVsZF90eXBlX2luY29uc2lzdGVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2RyX2Z1bmN0aW9uX3R5cGVfaW5jb25zaXN0ZW50KQorRElBR19OQU1FX0lOREVYKGVycl9vZHJfaXZhcl90eXBlX2luY29uc2lzdGVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2RyX25vbl90eXBlX3BhcmFtZXRlcl90eXBlX2luY29uc2lzdGVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2RyX29iamNfbWV0aG9kX251bV9wYXJhbXNfaW5jb25zaXN0ZW50KQorRElBR19OQU1FX0lOREVYKGVycl9vZHJfb2JqY19tZXRob2RfcGFyYW1fdHlwZV9pbmNvbnNpc3RlbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX29kcl9vYmpjX21ldGhvZF9yZXN1bHRfdHlwZV9pbmNvbnNpc3RlbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX29kcl9vYmpjX21ldGhvZF92YXJpYWRpY19pbmNvbnNpc3RlbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX29kcl9vYmpjX3Byb3BlcnR5X2ltcGxfa2luZF9pbmNvbnNpc3RlbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX29kcl9vYmpjX3Byb3BlcnR5X3R5cGVfaW5jb25zaXN0ZW50KQorRElBR19OQU1FX0lOREVYKGVycl9vZHJfb2JqY19zdXBlcmNsYXNzX2luY29uc2lzdGVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2RyX29iamNfc3ludGhlc2l6ZV9pdmFyX2luY29uc2lzdGVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2RyX3BhcmFtZXRlcl9wYWNrX25vbl9wYWNrKQorRElBR19OQU1FX0lOREVYKGVycl9vZHJfdGFnX3R5cGVfaW5jb25zaXN0ZW50KQorRElBR19OQU1FX0lOREVYKGVycl9vZHJfdmFyaWFibGVfbXVsdGlwbGVfZGVmKQorRElBR19OQU1FX0lOREVYKGVycl9vZHJfdmFyaWFibGVfdHlwZV9pbmNvbnNpc3RlbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX29mZnNldG9mX2FycmF5X3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29mZnNldG9mX2JpdGZpZWxkKQorRElBR19OQU1FX0lOREVYKGVycl9vZmZzZXRvZl9maWVsZF9vZl92aXJ0dWFsX2Jhc2UpCitESUFHX05BTUVfSU5ERVgoZXJyX29mZnNldG9mX2luY29tcGxldGVfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb2Zmc2V0b2ZfcmVjb3JkX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9hbGlnbmVkX2V4cGVjdGVkX2FycmF5X29yX3B0cikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2FsaWduZWRfdHdpY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9hbWJpZ3VvdXNfY29udmVyc2lvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2FyZ3VtZW50X3R5cGVfaXNkZXZpY2VwdHIpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9hcnJheV9zZWN0aW9uX3VzZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2F0X2xlYXN0X29uZV9tb3Rpb25fY2xhdXNlX3JlcXVpcmVkKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfYXRvbWljX2NhcHR1cmVfbm90X2NvbXBvdW5kX3N0YXRlbWVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2F0b21pY19jYXB0dXJlX25vdF9leHByZXNzaW9uX3N0YXRlbWVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2F0b21pY19ub3RfZXhwcmVzc2lvbl9zdGF0ZW1lbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9hdG9taWNfcmVhZF9ub3RfZXhwcmVzc2lvbl9zdGF0ZW1lbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9hdG9taWNfc2V2ZXJhbF9jbGF1c2VzKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfYXRvbWljX3VwZGF0ZV9ub3RfZXhwcmVzc2lvbl9zdGF0ZW1lbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9hdG9taWNfd3JpdGVfbm90X2V4cHJlc3Npb25fc3RhdGVtZW50KQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfYml0X2ZpZWxkc19mb3JiaWRkZW5faW5fY2xhdXNlKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfY2xhdXNlX2Zsb2F0aW5nX3R5cGVfYXJnKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfY2xhdXNlX25vdF9hcml0aG1ldGljX3R5cGVfYXJnKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfY29uc3RfcmVkdWN0aW9uX2xpc3RfaXRlbSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2NvbnN0X3ZhcmlhYmxlKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfY3JpdGljYWxfd2l0aF9oaW50KQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfZGVjbF9pbl9kZWNsYXJlX3NpbWQpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9kZWNsYXJlX3JlZHVjdGlvbl9yZWRlZmluaXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9kZWNsYXJlX3NpbWRfaW5icmFuY2hfbm90aW5icmFuY2gpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9kZWNsYXJlX3RhcmdldF9tdWx0aXBsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2RlY2xhcmVfdGFyZ2V0X3RvX2FuZF9saW5rKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfZGVjbGFyZV90YXJnZXRfdW5leHBlY3RlZF9jbGF1c2UpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9kZXBlbmRfY2xhdXNlX3RocmVhZF9zaW1kKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfZGVwZW5kX3NpbmtfZXhwZWN0ZWRfbG9vcF9pdGVyYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9kZXBlbmRfc2lua19leHBlY3RlZF9wbHVzX21pbnVzKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfZGVwZW5kX3Npbmtfc291cmNlX25vdF9hbGxvd2VkKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfZGVwZW5kX3NpbmtfdW5leHBlY3RlZF9leHByKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfZW5jbG9zZWRfZGVjbGFyZV90YXJnZXQpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9leHBlY3RlZF9hY2Nlc3NfdG9fZGF0YV9maWVsZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2V4cGVjdGVkX2FkZHJlc3NhYmxlX2x2YWx1ZV9vcl9hcnJheV9pdGVtKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfZXhwZWN0ZWRfYmFzZV92YXJfbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2V4cGVjdGVkX2lkZW50aWZpZXJfZm9yX2NyaXRpY2FsKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfZXhwZWN0ZWRfaW50X3BhcmFtKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfZXhwZWN0ZWRfbmFtZWRfdmFyX21lbWJlcl9vcl9hcnJheV9leHByZXNzaW9uKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfZXhwZWN0ZWRfcHVuYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2V4cGVjdGVkX3JlZHVjdGlvbl9pZGVudGlmaWVyKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfZXhwZWN0ZWRfdW5pZm9ybV9wYXJhbSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2V4cGVjdGVkX3Zhcl9hcmcpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9leHBlY3RlZF92YXJfYXJnX3N1Z2dlc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9leHBlY3RlZF92YXJfbmFtZV9tZW1iZXJfZXhwcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2V4cGVjdGVkX3Zhcl9uYW1lX21lbWJlcl9leHByX29yX2FycmF5X2l0ZW0pCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9leHBsaWNpdF9jb252ZXJzaW9uKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfZmlyc3Rwcml2YXRlX2luY29tcGxldGVfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2Z1bmN0aW9uX2V4cGVjdGVkKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfZnVuY3Rpb25faW5fbGlua19jbGF1c2UpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9nbG9iYWxfdmFyX2FyZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2dyYWluc2l6ZV9udW1fdGFza3NfbXV0dWFsbHlfZXhjbHVzaXZlKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfaGludF9jbGF1c2Vfbm9fbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2ltbWVkaWF0ZV9kaXJlY3RpdmUpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9pbl9yZWR1Y3Rpb25fbm90X3Rhc2tfcmVkdWN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfaW5jb21wbGV0ZV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfaW52YWxpZF9tYXBfdHlwZV9mb3JfZGlyZWN0aXZlKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfaW52YWxpZF90YXJnZXRfZGVjbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2xhc3Rwcml2YXRlX2luY29tcGxldGVfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2xpbmVhcl9kaXN0cmlidXRlX3Zhcl9ub25fbG9vcF9pdGVyYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9saW5lYXJfZXhwZWN0ZWRfaW50X29yX3B0cikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2xpbmVhcl9pbmNvbXBsZXRlX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9saW5lYXJfb3JkZXJlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2xvY2FsX3Zhcl9pbl90aHJlYWRwcml2YXRlX2luaXQpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9sb29wX2Nhbm5vdF91c2Vfc3RtdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2xvb3BfZGlmZl9jeHgpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9sb29wX2luY3Jfbm90X2NvbXBhdGlibGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9sb29wX25vdF9jYW5vbmljYWxfY29uZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX2xvb3Bfbm90X2Nhbm9uaWNhbF9pbmNyKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfbG9vcF9ub3RfY2Fub25pY2FsX2luaXQpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9sb29wX3Zhcl9kc2EpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9sb29wX3ZhcmlhYmxlX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9tYXBfc2hhcmVkX3N0b3JhZ2UpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9tYXBfdHlwZV9taXNzaW5nKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfbW9yZV9vbmVfY2xhdXNlKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfbXVsdGlwbGVfYXJyYXlfaXRlbXNfaW5fbWFwX2NsYXVzZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX25lZ2F0aXZlX2V4cHJlc3Npb25faW5fY2xhdXNlKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfbm9fY2xhdXNlX2Zvcl9kaXJlY3RpdmUpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9ub19kc2FfZm9yX3ZhcmlhYmxlKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfbm9fbW9yZV9pZl9jbGF1c2UpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9ub3RfZm9yKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfbm90X2ludGVncmFsKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfbm90X3Jlc29sdmVkX3JlZHVjdGlvbl9pZGVudGlmaWVyKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfb25jZV9yZWZlcmVuY2VkKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfb25jZV9yZWZlcmVuY2VkX2luX3RhcmdldF91cGRhdGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9vcmRlcmVkX2RpcmVjdGl2ZV93aXRoX3BhcmFtKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfb3JkZXJlZF9kaXJlY3RpdmVfd2l0aG91dF9wYXJhbSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX29yZGVyZWRfc2ltZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX29yaWdpbmFsX3N0b3JhZ2VfaXNfc2hhcmVkX2FuZF9kb2VzX25vdF9jb250YWluKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfb3JwaGFuZWRfZGV2aWNlX2RpcmVjdGl2ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX29ycGhhbmVkX3NlY3Rpb25fZGlyZWN0aXZlKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfcGFyYWxsZWxfcmVkdWN0aW9uX2luX3Rhc2tfZmlyc3Rwcml2YXRlKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbm90X2NvbXBvdW5kX3N0bXQpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9wYXJhbGxlbF9zZWN0aW9uc19zdWJzdG10X25vdF9zZWN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfcGFyYW1fb3JfdGhpc19pbl9jbGF1c2UpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9wYXJlbnRfY2FuY2VsX3JlZ2lvbl9ub3dhaXQpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9wYXJlbnRfY2FuY2VsX3JlZ2lvbl9vcmRlcmVkKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfcG9pbnRlcl9tYXBwZWRfYWxvbmdfd2l0aF9kZXJpdmVkX3NlY3Rpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9wcml2YXRlX2luY29tcGxldGVfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX3Byb2hpYml0ZWRfcmVnaW9uKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfcHJvaGliaXRlZF9yZWdpb25fYXRvbWljKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfcHJvaGliaXRlZF9yZWdpb25fY3JpdGljYWxfc2FtZV9uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfcHJvaGliaXRlZF9yZWdpb25fc2ltZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX3JlZHVjdGlvbl9pZF9ub3RfY29tcGF0aWJsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX3JlZHVjdGlvbl9pZGVudGlmaWVyX21pc21hdGNoKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfcmVkdWN0aW9uX2luX3Rhc2spCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9yZWR1Y3Rpb25faW5jb21wbGV0ZV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfcmVkdWN0aW9uX25vbl9hZGRyZXNzYWJsZV9leHByZXNzaW9uKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfcmVkdWN0aW9uX3JlZl90eXBlX2FyZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX3JlZHVjdGlvbl92bGFfdW5zdXBwb3J0ZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9yZWR1Y3Rpb25fd2l0aF9ub2dyb3VwKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfcmVkdWN0aW9uX3dyb25nX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9yZWZfdHlwZV9hcmcpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9yZWdpb25fbm90X2ZpbGVfY29udGV4dCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX3JlcXVpcmVkX2FjY2VzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX3NhbWVfcG9pbnRlcl9kZXJlZmVyZW5jZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9zY2hlZHVsZV9ub25tb25vdG9uaWNfb3JkZXJlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX3NjaGVkdWxlX25vbm1vbm90b25pY19zdGF0aWMpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9zZWN0aW9uX2Z1bmN0aW9uX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9zZWN0aW9uX2luY29tcGxldGVfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX3NlY3Rpb25fbGVuZ3RoX25lZ2F0aXZlKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfc2VjdGlvbl9sZW5ndGhfdW5kZWZpbmVkKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfc2VjdGlvbl9ub3Rfc3Vic2V0X29mX2FycmF5KQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfc2VjdGlvbnNfbm90X2NvbXBvdW5kX3N0bXQpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF9zZWN0aW9uc19zdWJzdG10X25vdF9zZWN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfc2ltZF9yZWdpb25fY2Fubm90X3VzZV9zdG10KQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfc2luZ2xlX2NvcHlwcml2YXRlX3dpdGhfbm93YWl0KQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfc2luZ2xlX2RlY2xfaW5fZGVjbGFyZV9zaW1kKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfdGFyZ2V0X2NvbnRhaW5zX25vdF9vbmx5X3RlYW1zKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfdGhyZWFkcHJpdmF0ZV9pbl9jbGF1c2UpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF90aHJlYWRwcml2YXRlX2luX3RhcmdldCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX3RocmVhZHByaXZhdGVfaW5jb21wbGV0ZV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfdHlwZWNoZWNrX3NlY3Rpb25fbm90X2ludGVnZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF90eXBlY2hlY2tfc2VjdGlvbl92YWx1ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX3VuZXhwZWN0ZWRfY2xhdXNlKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfdW5leHBlY3RlZF9jbGF1c2VfdmFsdWUpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF91bmV4cGVjdGVkX2RpcmVjdGl2ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX3VuZXhwZWN0ZWRfc2NoZWR1bGVfbW9kaWZpZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF91bmlvbl90eXBlX25vdF9hbGxvd2VkKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfdW5rbm93bl9kaXJlY3RpdmUpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF91bmtub3duX21hcF90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfdW5rbm93bl9tYXBfdHlwZV9tb2RpZmllcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX3Vua25vd25fcmVkdWN0aW9uX2lkZW50aWZpZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF91bm5hbWVkX2lmX2NsYXVzZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX3VzZWRldmljZXB0cl9ub3RfYV9wb2ludGVyKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfdmFyX3Njb3BlKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfdmFyX3RocmVhZF9sb2NhbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX3Zhcl91c2VkKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfdmFyaWFibGVfaW5fZ2l2ZW5fY2xhdXNlX2FuZF9kc2EpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF92YXJpYWJseV9tb2RpZmllZF90eXBlX25vdF9zdXBwb3J0ZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF93cm9uZ19jYW5jZWxfcmVnaW9uKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfd3JvbmdfZHNhKQorRElBR19OQU1FX0lOREVYKGVycl9vbXBfd3JvbmdfaWZfZGlyZWN0aXZlX25hbWVfbW9kaWZpZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF93cm9uZ19saW5lYXJfbW9kaWZpZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF93cm9uZ19saW5lYXJfbW9kaWZpZXJfbm9uX3JlZmVyZW5jZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX3dyb25nX29yZGVyZWRfbG9vcF9jb3VudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb21wX3dyb25nX3NpbWRsZW5fc2FmZWxlbl92YWx1ZXMpCitESUFHX05BTUVfSU5ERVgoZXJyX29tcF93cm9uZ192YXJfaW5fZGVjbGFyZV9yZWR1Y3Rpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX29ubHlfYW5ub3RhdGVfYWZ0ZXJfYWNjZXNzX3NwZWMpCitESUFHX05BTUVfSU5ERVgoZXJyX29ubHlfY29uc3RydWN0b3JzX3Rha2VfYmFzZV9pbml0cykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb25seV9lbnVtc19oYXZlX3VuZGVybHlpbmdfdHlwZXMpCitESUFHX05BTUVfSU5ERVgoZXJyX29wZW5jbF9hZGRyc3BhY2Vfc2NvcGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29wZW5jbF9hdG9taWNfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX2JpdGZpZWxkcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX2Jsb2NrX3JlZl9ibG9jaykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX2Jsb2NrX3N0b3JhZ2VfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX2J1aWx0aW5fZXhwZWN0ZWRfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX2J1aWx0aW5fcGlwZV9hcmdfbnVtKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVuY2xfYnVpbHRpbl9waXBlX2ZpcnN0X2FyZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX2J1aWx0aW5fcGlwZV9pbnZhbGlkX2FjY2Vzc19tb2RpZmllcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX2J1aWx0aW5fcGlwZV9pbnZhbGlkX2FyZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX2J1aWx0aW5fdG9fYWRkcl9hcmdfbnVtKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVuY2xfYnVpbHRpbl90b19hZGRyX2ludmFsaWRfYXJnKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVuY2xfY2FzdF9ub25femVyb190b19ldmVudF90KQorRElBR19OQU1FX0lOREVYKGVycl9vcGVuY2xfY2FzdF90b19oYWxmKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVuY2xfY29uc3RhbnRfbm9faW5pdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX2VucXVldWVfa2VybmVsX2Jsb2Nrc19ub19hcmdzKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVuY2xfZW5xdWV1ZV9rZXJuZWxfYmxvY2tzX25vbl9sb2NhbF92b2lkX2FyZ3MpCitESUFHX05BTUVfSU5ERVgoZXJyX29wZW5jbF9lbnF1ZXVlX2tlcm5lbF9pbmNvcnJlY3RfYXJncykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX2VucXVldWVfa2VybmVsX2ludmFsaWRfbG9jYWxfc2l6ZV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVuY2xfZW5xdWV1ZV9rZXJuZWxfbG9jYWxfc2l6ZV9hcmdzKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVuY2xfZXh0X3ZlY3Rvcl9jb21wb25lbnRfaW52YWxpZF9sZW5ndGgpCitESUFHX05BTUVfSU5ERVgoZXJyX29wZW5jbF9leHRlcm5fYmxvY2tfZGVjbGFyYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX29wZW5jbF9mdW5jdGlvbl9wb2ludGVyKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVuY2xfZnVuY3Rpb25fdmFyaWFibGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29wZW5jbF9nbG9iYWxfaW52YWxpZF9hZGRyX3NwYWNlKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVuY2xfaGFsZl9kZWNsYXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX2hhbGZfbG9hZF9zdG9yZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX2hhbGZfcGFyYW0pCitESUFHX05BTUVfSU5ERVgoZXJyX29wZW5jbF9pbXBsaWNpdF92ZWN0b3JfY29udmVyc2lvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX2ludmFsaWRfYWNjZXNzX3F1YWxpZmllcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX2ludmFsaWRfYmxvY2tfZGVjbGFyYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX29wZW5jbF9pbnZhbGlkX3JlYWRfd3JpdGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29wZW5jbF9pbnZhbGlkX3JldHVybikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX2ludmFsaWRfdHlwZV9hcnJheSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX2tlcm5lbF9hdHRyKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVuY2xfbG9naWNhbF9leGNsdXNpdmVfb3IpCitESUFHX05BTUVfSU5ERVgoZXJyX29wZW5jbF9tdWx0aXBsZV9hY2Nlc3NfcXVhbGlmaWVycykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX25vX21haW4pCitESUFHX05BTUVfSU5ERVgoZXJyX29wZW5jbF9ub25jb25zdF9nbG9iYWxfc2FtcGxlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX3BvaW50ZXJfdG9fdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX3B0cnB0cl9rZXJuZWxfcGFyYW0pCitESUFHX05BTUVfSU5ERVgoZXJyX29wZW5jbF9yZXF1aXJlc19leHRlbnNpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX29wZW5jbF9yZXR1cm5fdmFsdWVfd2l0aF9hZGRyZXNzX3NwYWNlKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVuY2xfc2NhbGFyX3R5cGVfcmFua19ncmVhdGVyX3RoYW5fdmVjdG9yX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29wZW5jbF9zaXplb2ZfYWxpZ25vZl90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVuY2xfdGFraW5nX2FkZHJlc3NfY2FwdHVyZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX3Rha2luZ19mdW5jdGlvbl9hZGRyZXNzX3BhcnNlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX3Rlcm5hcnlfd2l0aF9ibG9jaykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX3R5cGVfY2FuX29ubHlfYmVfdXNlZF9hc19mdW5jdGlvbl9wYXJhbWV0ZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX29wZW5jbF90eXBlX3N0cnVjdF9vcl91bmlvbl9maWVsZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX3Vua25vd25fdHlwZV9zcGVjaWZpZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX29wZW5jbF91bnJvbGxfaGludF9vbl9ub25fbG9vcCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlbmNsX3ZhcmlhZGljX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVuY2xfdmxhKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVubXBfZGVmYXVsdF9zaW1kX2FsaWduX2V4cHIpCitESUFHX05BTUVfSU5ERVgoZXJyX29wZXJhdG9yX2Fycm93X2NpcmN1bGFyKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVyYXRvcl9hcnJvd19kZXB0aF9leGNlZWRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlcmF0b3JfZGVsZXRlX2RlcGVuZGVudF9wYXJhbV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVyYXRvcl9kZWxldGVfcGFyYW1fdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlcmF0b3JfbmV3X2RlZmF1bHRfYXJnKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVyYXRvcl9uZXdfZGVsZXRlX2RlY2xhcmVkX2luX25hbWVzcGFjZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlcmF0b3JfbmV3X2RlbGV0ZV9kZWNsYXJlZF9zdGF0aWMpCitESUFHX05BTUVfSU5ERVgoZXJyX29wZXJhdG9yX25ld19kZWxldGVfZGVwZW5kZW50X3Jlc3VsdF90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVyYXRvcl9uZXdfZGVsZXRlX2ludmFsaWRfcmVzdWx0X3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX29wZXJhdG9yX25ld19kZWxldGVfdGVtcGxhdGVfdG9vX2Zld19wYXJhbWV0ZXJzKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVyYXRvcl9uZXdfZGVsZXRlX3Rvb19mZXdfcGFyYW1ldGVycykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlcmF0b3JfbmV3X2RlcGVuZGVudF9wYXJhbV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVyYXRvcl9uZXdfcGFyYW1fdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlcmF0b3Jfb3ZlcmxvYWRfZGVmYXVsdF9hcmcpCitESUFHX05BTUVfSU5ERVgoZXJyX29wZXJhdG9yX292ZXJsb2FkX211c3RfYmUpCitESUFHX05BTUVfSU5ERVgoZXJyX29wZXJhdG9yX292ZXJsb2FkX211c3RfYmVfbWVtYmVyKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVyYXRvcl9vdmVybG9hZF9uZWVkc19jbGFzc19vcl9lbnVtKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVyYXRvcl9vdmVybG9hZF9wb3N0X2luY2RlY19tdXN0X2JlX2ludCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3BlcmF0b3Jfb3ZlcmxvYWRfc3RhdGljKQorRElBR19OQU1FX0lOREVYKGVycl9vcGVyYXRvcl9vdmVybG9hZF92YXJpYWRpYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3B0X25vdF92YWxpZF93aXRoX29wdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3B0X25vdF92YWxpZF93aXRob3V0X29wdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3NfbG9nX2FyZ3VtZW50X3Rvb19iaWcpCitESUFHX05BTUVfSU5ERVgoZXJyX29zX2xvZ19mb3JtYXRfbm90X3N0cmluZ19jb25zdGFudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3V0X29mX2xpbmVfY29uc3RydWN0b3JfdGVtcGxhdGVfaWQpCitESUFHX05BTUVfSU5ERVgoZXJyX291dF9vZl9saW5lX2RlZmF1bHRfZGVsZXRlcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3V0X29mX2xpbmVfcXVhbGlmaWVkX2lkX3R5cGVfbmFtZXNfY29uc3RydWN0b3IpCitESUFHX05BTUVfSU5ERVgoZXJyX292ZXJmbG93X2J1aWx0aW5fbXVzdF9iZV9pbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX292ZXJmbG93X2J1aWx0aW5fbXVzdF9iZV9wdHJfaW50KQorRElBR19OQU1FX0lOREVYKGVycl9vdmVycmlkZV9jb250cm9sX2ludGVyZmFjZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3ZlcnJpZGVfZXhjZXB0aW9uX3NwZWMpCitESUFHX05BTUVfSU5ERVgoZXJyX292bF9hbWJpZ3VvdXNfY2FsbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3ZsX2FtYmlndW91c19jb252ZXJzaW9uX2luX2Nhc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX292bF9hbWJpZ3VvdXNfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3ZsX2FtYmlndW91c19tZW1iZXJfY2FsbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3ZsX2FtYmlndW91c19vYmplY3RfY2FsbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3ZsX2FtYmlndW91c19vcGVyX2JpbmFyeSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3ZsX2FtYmlndW91c19vcGVyX3VuYXJ5KQorRElBR19OQU1FX0lOREVYKGVycl9vdmxfZGVsZXRlZF9jYWxsKQorRElBR19OQU1FX0lOREVYKGVycl9vdmxfZGVsZXRlZF9jb252ZXJzaW9uX2luX2Nhc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX292bF9kZWxldGVkX2luaXQpCitESUFHX05BTUVfSU5ERVgoZXJyX292bF9kZWxldGVkX21lbWJlcl9jYWxsKQorRElBR19OQU1FX0lOREVYKGVycl9vdmxfZGVsZXRlZF9vYmplY3RfY2FsbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3ZsX2RlbGV0ZWRfb3BlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3ZsX2RlbGV0ZWRfc3BlY2lhbF9pbml0KQorRElBR19OQU1FX0lOREVYKGVycl9vdmxfZGVsZXRlZF9zcGVjaWFsX29wZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX292bF9kaWZmX3JldHVybl90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9vdmxfbm9fY29udmVyc2lvbl9pbl9jYXN0KQorRElBR19OQU1FX0lOREVYKGVycl9vdmxfbm9fb3BlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3ZsX25vX3ZpYWJsZV9jb252ZXJzaW9uX2luX2Nhc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX292bF9ub192aWFibGVfZnVuY3Rpb25faW5fY2FsbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3ZsX25vX3ZpYWJsZV9mdW5jdGlvbl9pbl9pbml0KQorRElBR19OQU1FX0lOREVYKGVycl9vdmxfbm9fdmlhYmxlX2xpdGVyYWxfb3BlcmF0b3IpCitESUFHX05BTUVfSU5ERVgoZXJyX292bF9ub192aWFibGVfbWVtYmVyX2Z1bmN0aW9uX2luX2NhbGwpCitESUFHX05BTUVfSU5ERVgoZXJyX292bF9ub192aWFibGVfb2JqZWN0X2NhbGwpCitESUFHX05BTUVfSU5ERVgoZXJyX292bF9ub192aWFibGVfb3BlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3ZsX25vX3ZpYWJsZV9zdWJzY3JpcHQpCitESUFHX05BTUVfSU5ERVgoZXJyX292bF9zdGF0aWNfbm9uc3RhdGljX21lbWJlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3ZsX3VucmVzb2x2YWJsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfb3duZXJzaGlwX3JldHVybnNfaW5kZXhfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX293bmVyc2hpcF90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9wYWNrX2V4cGFuc2lvbl9sZW5ndGhfY29uZmxpY3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3BhY2tfZXhwYW5zaW9uX2xlbmd0aF9jb25mbGljdF9tdWx0aWxldmVsKQorRElBR19OQU1FX0lOREVYKGVycl9wYWNrX2V4cGFuc2lvbl9tZW1iZXJfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcGFja19leHBhbnNpb25fd2l0aG91dF9wYXJhbWV0ZXJfcGFja3MpCitESUFHX05BTUVfSU5ERVgoZXJyX3BhcmFtX2RlZmF1bHRfYXJndW1lbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX3BhcmFtX2RlZmF1bHRfYXJndW1lbnRfbWVtYmVyX3RlbXBsYXRlX3JlZGVjbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcGFyYW1fZGVmYXVsdF9hcmd1bWVudF9taXNzaW5nKQorRElBR19OQU1FX0lOREVYKGVycl9wYXJhbV9kZWZhdWx0X2FyZ3VtZW50X21pc3NpbmdfbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcGFyYW1fZGVmYXVsdF9hcmd1bWVudF9ub25mdW5jKQorRElBR19OQU1FX0lOREVYKGVycl9wYXJhbV9kZWZhdWx0X2FyZ3VtZW50X29uX3BhcmFtZXRlcl9wYWNrKQorRElBR19OQU1FX0lOREVYKGVycl9wYXJhbV9kZWZhdWx0X2FyZ3VtZW50X3JlZGVmaW5pdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfcGFyYW1fZGVmYXVsdF9hcmd1bWVudF9yZWZlcmVuY2VzX2xvY2FsKQorRElBR19OQU1FX0lOREVYKGVycl9wYXJhbV9kZWZhdWx0X2FyZ3VtZW50X3JlZmVyZW5jZXNfcGFyYW0pCitESUFHX05BTUVfSU5ERVgoZXJyX3BhcmFtX2RlZmF1bHRfYXJndW1lbnRfcmVmZXJlbmNlc190aGlzKQorRElBR19OQU1FX0lOREVYKGVycl9wYXJhbV9kZWZhdWx0X2FyZ3VtZW50X3RlbXBsYXRlX3JlZGVjbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcGFyYW1fcmVkZWZpbml0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9wYXJhbV93aXRoX3ZvaWRfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcGFyYW1ldGVyX25hbWVfb21pdHRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcGFyYW1ldGVyc19yZXR2YWxfY2Fubm90X2hhdmVfZnAxNl90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9wYXJlbl9zaXplb2ZfcGFyYW1ldGVyX3BhY2spCitESUFHX05BTUVfSU5ERVgoZXJyX3BhcmVuc19wb2ludGVyX21lbWJlcl9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfcGFydGlhbF9zcGVjX2FyZ3NfbWF0Y2hfcHJpbWFyeV90ZW1wbGF0ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcGFydGlhbF9zcGVjX2Z1bGx5X3NwZWNpYWxpemVkKQorRElBR19OQU1FX0lOREVYKGVycl9wYXJ0aWFsX3NwZWNfb3JkZXJpbmdfYW1iaWd1b3VzKQorRElBR19OQU1FX0lOREVYKGVycl9wYXJ0aWFsX3NwZWNfcmVkZWNsYXJlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcGFydGlhbF9zcGVjaWFsaXphdGlvbl9mcmllbmQpCitESUFHX05BTUVfSU5ERVgoZXJyX3Bhc2NhbF9zdHJpbmdfdG9vX2xvbmcpCitESUFHX05BTUVfSU5ERVgoZXJyX3Bhc3RlX2F0X2VuZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcGFzdGVfYXRfc3RhcnQpCitESUFHX05BTUVfSU5ERVgoZXJyX3BjaF9kaWFnb3B0X21pc21hdGNoKQorRElBR19OQU1FX0lOREVYKGVycl9wY2hfZGlmZmVyZW50X2JyYW5jaCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcGNoX2xhbmdvcHRfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX3BjaF9sYW5nb3B0X3ZhbHVlX21pc21hdGNoKQorRElBR19OQU1FX0lOREVYKGVycl9wY2hfbWFjcm9fZGVmX2NvbmZsaWN0KQorRElBR19OQU1FX0lOREVYKGVycl9wY2hfbWFjcm9fZGVmX3VuZGVmKQorRElBR19OQU1FX0lOREVYKGVycl9wY2hfbW9kdWxlY2FjaGVfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX3BjaF9wcF9kZXRhaWxlZF9yZWNvcmQpCitESUFHX05BTUVfSU5ERVgoZXJyX3BjaF90YXJnZXRvcHRfZmVhdHVyZV9taXNtYXRjaCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcGNoX3RhcmdldG9wdF9taXNtYXRjaCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcGNoX3VuZGVmKQorRElBR19OQU1FX0lOREVYKGVycl9wY2hfdmVyc2lvbl90b29fbmV3KQorRElBR19OQU1FX0lOREVYKGVycl9wY2hfdmVyc2lvbl90b29fb2xkKQorRElBR19OQU1FX0lOREVYKGVycl9wY2hfd2l0aF9jb21waWxlcl9lcnJvcnMpCitESUFHX05BTUVfSU5ERVgoZXJyX3BsYWNlaG9sZGVyX2luX3NvdXJjZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcGxhY2VtZW50X25ld19ub25fcGxhY2VtZW50X2RlbGV0ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcG9pbnRlcl90b19tZW1iZXJfY2FsbF9kcm9wc19xdWFscykKK0RJQUdfTkFNRV9JTkRFWChlcnJfcG9pbnRlcl90b19tZW1iZXJfb3Blcl92YWx1ZV9jbGFzc2lmeSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcG9pbnRlcl90b19tZW1iZXJfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfYXJjX2NmX2NvZGVfYXVkaXRlZF9zeW50YXgpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2Fzc3VtZV9ub25udWxsX3N5bnRheCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfYmFkX3Bhc3RlKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9jb2xvbl93aXRob3V0X3F1ZXN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9kaXJlY3RpdmVfcmVxdWlyZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2RpdmlzaW9uX2J5X3plcm8pCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2RvdWJsZV9iZWdpbl9vZl9hcmNfY2ZfY29kZV9hdWRpdGVkKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9kb3VibGVfYmVnaW5fb2ZfYXNzdW1lX25vbm51bGwpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2R1cGxpY2F0ZV9uYW1lX2luX2FyZ19saXN0KQorRElBR19OQU1FX0lOREVYKGVycl9wcF9lbXB0eV9maWxlbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfZW5kaWZfd2l0aG91dF9pZikKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfZW9mX2luX2FyY19jZl9jb2RlX2F1ZGl0ZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2VvZl9pbl9hc3N1bWVfbm9ubnVsbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfZXJyb3Jfb3BlbmluZ19maWxlKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9leHBlY3RlZF9hZnRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfZXhwZWN0ZWRfY29tbWFfaW5fYXJnX2xpc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2V4cGVjdGVkX2VvbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfZXhwZWN0ZWRfaWRlbnRfaW5fYXJnX2xpc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2V4cGVjdGVkX21vZHVsZV9uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9leHBlY3RlZF9ycGFyZW4pCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2V4cGVjdGVkX3ZhbHVlX2luX2V4cHIpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2V4cGVjdHNfZmlsZW5hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2V4cHJfYmFkX3Rva2VuX2Jpbm9wKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9leHByX2JhZF90b2tlbl9scGFyZW4pCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2V4cHJfYmFkX3Rva2VuX3N0YXJ0X2V4cHIpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2ZpbGVfbm90X2ZvdW5kKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9maWxlX25vdF9mb3VuZF9ub3RfZmF0YWwpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2hhc2hfZXJyb3IpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2lkZW50aWZpZXJfYXJnX25vdF9pZGVudGlmaWVyKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9pbGxlZ2FsX2Zsb2F0aW5nX2xpdGVyYWwpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2ltcG9ydF9kaXJlY3RpdmVfbXMpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2luY2x1ZGVfaW5fYXJjX2NmX2NvZGVfYXVkaXRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfaW5jbHVkZV9pbl9hc3N1bWVfbm9ubnVsbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfaW5jbHVkZV90b29fZGVlcCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfaW52YWxpZF9kaXJlY3RpdmUpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2ludmFsaWRfcG9pc29uKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9pbnZhbGlkX3Rva19pbl9hcmdfbGlzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfaW52YWxpZF91ZGwpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2xpbmVfZGlnaXRfc2VxdWVuY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2xpbmVfaW52YWxpZF9maWxlbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfbGluZV9yZXF1aXJlc19pbnRlZ2VyKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9saW5lbWFya2VyX2ludmFsaWRfZmlsZW5hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX2xpbmVtYXJrZXJfaW52YWxpZF9mbGFnKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9saW5lbWFya2VyX2ludmFsaWRfcG9wKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9saW5lbWFya2VyX3JlcXVpcmVzX2ludGVnZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX21hY3JvX25vdF9pZGVudGlmaWVyKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9tYWxmb3JtZWRfaWRlbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX21pc3NpbmdfbHBhcmVuX2luX3Zhb3B0X3VzZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfbWlzc2luZ19tYWNyb19uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9taXNzaW5nX3JwYXJlbl9pbl9tYWNyb19kZWYpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX21vZHVsZV9iZWdpbl9ub19tb2R1bGVfbWFwKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9tb2R1bGVfYmVnaW5fbm9fc3VibW9kdWxlKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9tb2R1bGVfYmVnaW5fd2l0aG91dF9tb2R1bGVfZW5kKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9tb2R1bGVfYmVnaW5fd3JvbmdfbW9kdWxlKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9tb2R1bGVfYnVpbGRfbWlzc2luZ19lbmQpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX21vZHVsZV9idWlsZF9wdGgpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX21vZHVsZV9lbmRfd2l0aG91dF9tb2R1bGVfYmVnaW4pCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX25lc3RlZF9wYXJlbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfb3BlbmNsX3ZhcmlhZGljX21hY3JvcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfb3BlcmF0b3JfdXNlZF9hc19tYWNyb19uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl9wcF9yZW1haW5kZXJfYnlfemVybykKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfc3RyaW5naXplX25vdF9wYXJhbWV0ZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX3BwX3VubWF0Y2hlZF9lbmRfb2ZfYXJjX2NmX2NvZGVfYXVkaXRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfdW5tYXRjaGVkX2VuZF9vZl9hc3N1bWVfbm9ubnVsbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBfdW50ZXJtaW5hdGVkX2NvbmRpdGlvbmFsKQorRElBR19OQU1FX0lOREVYKGVycl9wcF91c2VkX3BvaXNvbmVkX2lkKQorRElBR19OQU1FX0lOREVYKGVycl9wcF92YW9wdF9uZXN0ZWRfdXNlKQorRElBR19OQU1FX0lOREVYKGVycl9wcF92aXNpYmlsaXR5X25vbl9tYWNybykKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHBjX2J1aWx0aW5fb25seV9vbl9wd3I3KQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfYXR0cmlidXRlX2R1cGxpY2F0ZV9zdWJqZWN0KQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfYXR0cmlidXRlX2V4cGVjdGVkX2F0dHJpYnV0ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHJhZ21hX2F0dHJpYnV0ZV9leHBlY3RlZF9hdHRyaWJ1dGVfbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHJhZ21hX2F0dHJpYnV0ZV9leHBlY3RlZF9hdHRyaWJ1dGVfc3ludGF4KQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfYXR0cmlidXRlX2V4cGVjdGVkX3B1c2hfcG9wKQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfYXR0cmlidXRlX2V4cGVjdGVkX3N1YmplY3RfaWRlbnRpZmllcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHJhZ21hX2F0dHJpYnV0ZV9leHBlY3RlZF9zdWJqZWN0X3N1Yl9pZGVudGlmaWVyKQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfYXR0cmlidXRlX2V4dHJhX3Rva2Vuc19hZnRlcl9hdHRyaWJ1dGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3ByYWdtYV9hdHRyaWJ1dGVfaW52YWxpZF9hcmd1bWVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHJhZ21hX2F0dHJpYnV0ZV9pbnZhbGlkX21hdGNoZXJzKQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfYXR0cmlidXRlX2ludmFsaWRfc3ViamVjdF9zZXRfc3BlY2lmaWVyKQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfYXR0cmlidXRlX21hdGNoZXJfbmVnYXRlZF9zdWJydWxlX2NvbnRyYWRpY3RzX3N1YnJ1bGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3ByYWdtYV9hdHRyaWJ1dGVfbWF0Y2hlcl9zdWJydWxlX2NvbnRyYWRpY3RzX3J1bGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3ByYWdtYV9hdHRyaWJ1dGVfbXVsdGlwbGVfYXR0cmlidXRlcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHJhZ21hX2F0dHJpYnV0ZV9ub19wb3BfZW9mKQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfYXR0cmlidXRlX3N0YWNrX21pc21hdGNoKQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfYXR0cmlidXRlX3Vua25vd25fc3ViamVjdF9ydWxlKQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfYXR0cmlidXRlX3Vua25vd25fc3ViamVjdF9zdWJfcnVsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHJhZ21hX2F0dHJpYnV0ZV91bnN1cHBvcnRlZF9hdHRyaWJ1dGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3ByYWdtYV9jYW5ub3RfZW5kX2ZvcmNlX2N1ZGFfaG9zdF9kZXZpY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX3ByYWdtYV9jbGFuZ19zZWN0aW9uX2V4cGVjdGVkX2VxdWFsKQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfY29tbWVudF9tYWxmb3JtZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX3ByYWdtYV9jb21tZW50X3Vua25vd25fa2luZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHJhZ21hX2RldGVjdF9taXNtYXRjaF9tYWxmb3JtZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX3ByYWdtYV9leHBlY3RlZF9jbGFuZ19zZWN0aW9uX25hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX3ByYWdtYV9mcF9jb250cmFjdF9zY29wZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHJhZ21hX2ZwX2ludmFsaWRfYXJndW1lbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX3ByYWdtYV9mcF9pbnZhbGlkX29wdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHJhZ21hX2ZwX3Njb3BlKQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfaW52YWxpZF9rZXl3b3JkKQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfbG9vcF9jb21wYXRpYmlsaXR5KQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfbG9vcF9pbnZhbGlkX2FyZ3VtZW50X3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3ByYWdtYV9sb29wX2ludmFsaWRfYXJndW1lbnRfdmFsdWUpCitESUFHX05BTUVfSU5ERVgoZXJyX3ByYWdtYV9sb29wX2ludmFsaWRfb3B0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfbG9vcF9taXNzaW5nX2FyZ3VtZW50KQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfbG9vcF9wcmVjZWRlc19ub25sb29wKQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfbWVzc2FnZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHJhZ21hX21lc3NhZ2VfbWFsZm9ybWVkKQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfbWlzc2luZ19hcmd1bWVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHJhZ21hX29wdGltaXplX2V4dHJhX2FyZ3VtZW50KQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfb3B0aW1pemVfaW52YWxpZF9hcmd1bWVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHJhZ21hX29wdGlvbnNfYWxpZ25fbWFjNjhrX3RhcmdldF91bnN1cHBvcnRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHJhZ21hX3BvaW50ZXJzX3RvX21lbWJlcnNfdW5rbm93bl9raW5kKQorRElBR19OQU1FX0lOREVYKGVycl9wcmFnbWFfcG9wX3Zpc2liaWxpdHlfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX3ByYWdtYV9wdXNoX3BvcF9tYWNyb19tYWxmb3JtZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX3ByYWdtYV9wdXNoX3Zpc2liaWxpdHlfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX3ByaXZhdGVfaXZhcl9hY2Nlc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX3Byb3BlcnR5X2FjY2Vzc29yX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3Byb3BlcnR5X2ZvdW5kX3N1Z2dlc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3Byb3BlcnR5X2Z1bmN0aW9uX2luX29iamNfY29udGFpbmVyKQorRElBR19OQU1FX0lOREVYKGVycl9wcm9wZXJ0eV9pbXBsZW1lbnRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHJvcGVydHlfaXNfdmFyaWFibHlfbW9kaWZpZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX3Byb3BlcnR5X2l2YXJfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHJvcGVydHlfbWV0aG9kX3VuYXZhaWxhYmxlKQorRElBR19OQU1FX0lOREVYKGVycl9wcm9wZXJ0eV9ub3RfYXNfZm9yd2FyZF9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHJvcGVydHlfbm90X2ZvdW5kKQorRElBR19OQU1FX0lOREVYKGVycl9wcm9wZXJ0eV9ub3RfZm91bmRfZm9yd2FyZF9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHJvcGVydHlfbm90X2ZvdW5kX3N1Z2dlc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3Byb3BlcnR5X3NldHRlcl9hbWJpZ3VvdXNfdXNlKQorRElBR19OQU1FX0lOREVYKGVycl9wcm9wZXJ0eV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9wcm90ZWN0ZWRfaXZhcl9hY2Nlc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX3Byb3RvY29sX2hhc19jaXJjdWxhcl9kZXBlbmRlbmN5KQorRElBR19OQU1FX0lOREVYKGVycl9wcm90b2NvbF9wcm9wZXJ0eV9taXNtYXRjaCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHNldWRvX2R0b3JfYmFzZV9ub3Rfc2NhbGFyKQorRElBR19OQU1FX0lOREVYKGVycl9wc2V1ZG9fZHRvcl9jYWxsX3dpdGhfYXJncykKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHNldWRvX2R0b3JfZGVzdHJ1Y3Rvcl9ub25fdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHNldWRvX2R0b3JfdHlwZV9taXNtYXRjaCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcHVyZV9mcmllbmQpCitESUFHX05BTUVfSU5ERVgoZXJyX3F1YWxpZmllZF9jYXRjaF9kZWNsYXJhdG9yKQorRElBR19OQU1FX0lOREVYKGVycl9xdWFsaWZpZWRfZnJpZW5kX2RlZikKK0RJQUdfTkFNRV9JTkRFWChlcnJfcXVhbGlmaWVkX2ZyaWVuZF9ub3RfZm91bmQpCitESUFHX05BTUVfSU5ERVgoZXJyX3F1YWxpZmllZF9tZW1iZXJfbm9uY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX3F1YWxpZmllZF9tZW1iZXJfb2ZfdW5yZWxhdGVkKQorRElBR19OQU1FX0lOREVYKGVycl9xdWFsaWZpZWRfb2JqY19hY2Nlc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX3F1YWxpZmllZF9vYmpjX2NhdGNoX3Bhcm0pCitESUFHX05BTUVfSU5ERVgoZXJyX3F1YWxpZmllZF9wYXJhbV9kZWNsYXJhdG9yKQorRElBR19OQU1FX0lOREVYKGVycl9xdWFsaWZpZWRfdHlwZWRlZl9kZWNsYXJhdG9yKQorRElBR19OQU1FX0lOREVYKGVycl9yYW5nZV9vbl9hcnJheV9wYXJhbWV0ZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX3Jhd19kZWxpbV90b29fbG9uZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfcmVhZG9ubHlfbWVzc2FnZV9hc3NpZ25tZW50KQorRElBR19OQU1FX0lOREVYKGVycl9yZWFsaW1hZ19pbnZhbGlkX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3JlY29yZF93aXRoX3BvaW50ZXJzX2tlcm5lbF9wYXJhbSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcmVjdXJzaXZlX2RlZmF1bHRfYXJndW1lbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX3JlY3Vyc2l2ZV9zdXBlcmNsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl9yZWRlY2xhcmF0aW9uX2RpZmZlcmVudF90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9yZWRlZmluaXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX3JlZGVmaW5pdGlvbl9kaWZmZXJlbnRfa2luZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcmVkZWZpbml0aW9uX2RpZmZlcmVudF9uYW1lc3BhY2VfYWxpYXMpCitESUFHX05BTUVfSU5ERVgoZXJyX3JlZGVmaW5pdGlvbl9kaWZmZXJlbnRfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcmVkZWZpbml0aW9uX2RpZmZlcmVudF90eXBlZGVmKQorRElBR19OQU1FX0lOREVYKGVycl9yZWRlZmluaXRpb25fZXh0ZXJuX2lubGluZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcmVkZWZpbml0aW9uX29mX2VudW1lcmF0b3IpCitESUFHX05BTUVfSU5ERVgoZXJyX3JlZGVmaW5pdGlvbl9vZl9sYWJlbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcmVkZWZpbml0aW9uX3ZhcmlhYmx5X21vZGlmaWVkX3R5cGVkZWYpCitESUFHX05BTUVfSU5ERVgoZXJyX3JlZl9hcnJheV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9yZWZfYmFkX3RhcmdldCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcmVmX2JhZF90YXJnZXRfZ2xvYmFsX2luaXRpYWxpemVyKQorRElBR19OQU1FX0lOREVYKGVycl9yZWZfZmxleGFycmF5X3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3JlZl9pbml0X2FtYmlndW91cykKK0RJQUdfTkFNRV9JTkRFWChlcnJfcmVmX25vbl92YWx1ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcmVmX3F1YWxpZmllcl9jb25zdHJ1Y3RvcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfcmVmX3F1YWxpZmllcl9kZXN0cnVjdG9yKQorRElBR19OQU1FX0lOREVYKGVycl9yZWZfcXVhbGlmaWVyX292ZXJsb2FkKQorRElBR19OQU1FX0lOREVYKGVycl9yZWZfdm1fdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcmVmYWN0b3JfY29kZV9vdXRzaWRlX29mX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9yZWZhY3Rvcl9leHRyYWN0X3Byb2hpYml0ZWRfZXhwcmVzc2lvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfcmVmYWN0b3JfZXh0cmFjdF9zaW1wbGVfZXhwcmVzc2lvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfcmVmYWN0b3Jfbm9fc2VsZWN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl9yZWZhY3Rvcl9zZWxlY3Rpb25faW52YWxpZF9hc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3JlZmFjdG9yX3NlbGVjdGlvbl9ub19zeW1ib2wpCitESUFHX05BTUVfSU5ERVgoZXJyX3JlZmVyZW5jZV9iaW5kX2Ryb3BzX3F1YWxzKQorRElBR19OQU1FX0lOREVYKGVycl9yZWZlcmVuY2VfYmluZF9mYWlsZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX3JlZmVyZW5jZV9iaW5kX2luaXRfbGlzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcmVmZXJlbmNlX2JpbmRfdG9fYml0ZmllbGQpCitESUFHX05BTUVfSU5ERVgoZXJyX3JlZmVyZW5jZV9iaW5kX3RvX3ZlY3Rvcl9lbGVtZW50KQorRElBR19OQU1FX0lOREVYKGVycl9yZWZlcmVuY2VfY2FwdHVyZV93aXRoX3JlZmVyZW5jZV9kZWZhdWx0KQorRElBR19OQU1FX0lOREVYKGVycl9yZWZlcmVuY2VfaGFzX211bHRpcGxlX2luaXRzKQorRElBR19OQU1FX0lOREVYKGVycl9yZWZlcmVuY2VfcGlwZV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9yZWZlcmVuY2VfdG9fbG9jYWxfaW5fZW5jbG9zaW5nX2NvbnRleHQpCitESUFHX05BTUVfSU5ERVgoZXJyX3JlZmVyZW5jZV90b192b2lkKQorRElBR19OQU1FX0lOREVYKGVycl9yZWZlcmVuY2VfdmFyX3JlcXVpcmVzX2luaXQpCitESUFHX05BTUVfSU5ERVgoZXJyX3JlZmVyZW5jZV93aXRob3V0X2luaXQpCitESUFHX05BTUVfSU5ERVgoZXJyX3JlZ3Bhcm1fbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX3JlbG9jYXRhYmxlX3dpdGhvdXRfaXN5c3Jvb3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3JlcGVhdF9hdHRyaWJ1dGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3JlcXVpcmVfY29uc3RhbnRfaW5pdF9mYWlsZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX3Jlc3RyaWN0ZWRfc3VwZXJjbGFzc19taXNtYXRjaCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcmV0X2xvY2FsX2Jsb2NrKQorRElBR19OQU1FX0lOREVYKGVycl9yZXRocm93X3VzZWRfb3V0c2lkZV9jYXRjaCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcmV0dXJuX2Jsb2NrX2hhc19leHByKQorRElBR19OQU1FX0lOREVYKGVycl9yZXR1cm5faW5fY2FwdHVyZWRfc3RtdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfcmV0dXJuX2luX2NvbnN0cnVjdG9yX2hhbmRsZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX3JldHVybl9pbl9jb3JvdXRpbmUpCitESUFHX05BTUVfSU5ERVgoZXJyX3JldHVybl9pbml0X2xpc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3JpZ2h0X2FuZ2xlX2JyYWNrZXRfZXF1YWxfbmVlZHNfc3BhY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX3Jvb3RfY2xhc3NfY2Fubm90X3VzZV9zdXBlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfcnJlZl9pbl9leGNlcHRpb25fc3BlYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfc2FtcGxlcl9hcmd1bWVudF9yZXF1aXJlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfc2FtcGxlcl9pbml0aWFsaXplcl9ub3RfaW50ZWdlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfc2NvcGVkX2VudW1fbWlzc2luZ19pZGVudGlmaWVyKQorRElBR19OQU1FX0lOREVYKGVycl9zZWNvbmRfYXJndW1lbnRfdG9fY3dzY19ub3RfcG9pbnRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfc2Vjb25kX3BhcmFtZXRlcl90b192YV9hcmdfYWJzdHJhY3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3NlY29uZF9wYXJhbWV0ZXJfdG9fdmFfYXJnX2luY29tcGxldGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3NlY3Rpb25fY29uZmxpY3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3NlaF9fX2V4Y2VwdF9ibG9jaykKK0RJQUdfTkFNRV9JTkRFWChlcnJfc2VoX19fZXhjZXB0X2ZpbHRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfc2VoX19fZmluYWxseV9ibG9jaykKK0RJQUdfTkFNRV9JTkRFWChlcnJfc2VoX2V4cGVjdGVkX2hhbmRsZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX3NlaF9pbl9hX2Nvcm91dGluZV93aXRoX2N4eF9leGNlcHRpb25zKQorRElBR19OQU1FX0lOREVYKGVycl9zZWhfdHJ5X291dHNpZGVfZnVuY3Rpb25zKQorRElBR19OQU1FX0lOREVYKGVycl9zZWhfdHJ5X3Vuc3VwcG9ydGVkKQorRElBR19OQU1FX0lOREVYKGVycl9zZWxlY3RlZF9leHBsaWNpdF9jb25zdHJ1Y3RvcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfc2VsZWN0b3JfZWxlbWVudF9jb25zdF90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9zZWxlY3Rvcl9lbGVtZW50X25vdF9sdmFsdWUpCitESUFHX05BTUVfSU5ERVgoZXJyX3NlbGVjdG9yX2VsZW1lbnRfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfc2V0dGVyX3R5cGVfdm9pZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfc2hhcmVkX3Zhcl9pbml0KQorRElBR19OQU1FX0lOREVYKGVycl9zaGlmdF9yaHNfb25seV92ZWN0b3IpCitESUFHX05BTUVfSU5ERVgoZXJyX3NodWZmbGV2ZWN0b3JfYXJndW1lbnRfdG9vX2xhcmdlKQorRElBR19OQU1FX0lOREVYKGVycl9zaHVmZmxldmVjdG9yX25vbmNvbnN0YW50X2FyZ3VtZW50KQorRElBR19OQU1FX0lOREVYKGVycl9zaW5nbGVfZGVjbF9hc3NpZ25faW5fZm9yX3JhbmdlKQorRElBR19OQU1FX0lOREVYKGVycl9zaXplb2ZfYWxpZ25vZl9mdW5jdGlvbl90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9zaXplb2ZfYWxpZ25vZl9pbmNvbXBsZXRlX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3NpemVvZl9hbGlnbm9mX3R5cGVvZl9iaXRmaWVsZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfc2l6ZW9mX25vbmZyYWdpbGVfaW50ZXJmYWNlKQorRElBR19OQU1FX0lOREVYKGVycl9zaXplb2ZfcGFja19ub19wYWNrX25hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX3NpemVvZl9wYWNrX25vX3BhY2tfbmFtZV9zdWdnZXN0KQorRElBR19OQU1FX0lOREVYKGVycl9zaXplb2ZfcGFyYW1ldGVyX3BhY2spCitESUFHX05BTUVfSU5ERVgoZXJyX3NwZWNfbWVtYmVyX25vdF9pbnN0YW50aWF0ZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX3NwZWNpYWxpemF0aW9uX2FmdGVyX2luc3RhbnRpYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX3NwZWNpYWxpemF0aW9uX25vdF9wcmltYXJ5X3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKGVycl9zcGVjaWFsaXplX21lbWJlcl9vZl90ZW1wbGF0ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfc3RhbmRhbG9uZV9jbGFzc19uZXN0ZWRfbmFtZV9zcGVjaWZpZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX3N0YXRpY19hc3NlcnRfZXhwcmVzc2lvbl9pc19ub3RfY29uc3RhbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX3N0YXRpY19hc3NlcnRfZmFpbGVkKQorRElBR19OQU1FX0lOREVYKGVycl9zdGF0aWNfYXNzZXJ0X3JlcXVpcmVtZW50X2ZhaWxlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfc3RhdGljX2Jsb2NrX2Z1bmMpCitESUFHX05BTUVfSU5ERVgoZXJyX3N0YXRpY19kYXRhX21lbWJlcl9ub3RfYWxsb3dlZF9pbl9hbm9uX3N0cnVjdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfc3RhdGljX2RhdGFfbWVtYmVyX25vdF9hbGxvd2VkX2luX2xvY2FsX2NsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl9zdGF0aWNfZGF0YV9tZW1iZXJfcmVpbml0aWFsaXphdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfc3RhdGljX2Rvd25jYXN0X3ZpYV92aXJ0dWFsKQorRElBR19OQU1FX0lOREVYKGVycl9zdGF0aWNfZnVuY3Rpb25fc2NvcGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3N0YXRpY19pbGxlZ2FsX2luX25ldykKK0RJQUdfTkFNRV9JTkRFWChlcnJfc3RhdGljX2tlcm5lbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfc3RhdGljX21haW4pCitESUFHX05BTUVfSU5ERVgoZXJyX3N0YXRpY19ub25fc3RhdGljKQorRElBR19OQU1FX0lOREVYKGVycl9zdGF0aWNfbm90X2JpdGZpZWxkKQorRElBR19OQU1FX0lOREVYKGVycl9zdGF0aWNfb3V0X29mX2xpbmUpCitESUFHX05BTUVfSU5ERVgoZXJyX3N0YXRpY19vdmVycmlkZXNfdmlydHVhbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfc3RhdGljYWxseV9hbGxvY2F0ZWRfb2JqZWN0KQorRElBR19OQU1FX0lOREVYKGVycl9zdGRfdHlwZV90cmFpdF9ub3RfY2xhc3NfdGVtcGxhdGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3N0bXRfYXR0cmlidXRlX2ludmFsaWRfb25fZGVjbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfc3RtdGV4cHJfZmlsZV9zY29wZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfc3RvcmFnZV9jbGFzc19mb3Jfc3RhdGljX21lbWJlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfc3RvcmFnZV9zcGVjX29uX2NhdGNoX3Bhcm0pCitESUFHX05BTUVfSU5ERVgoZXJyX3N0b3JhZ2VjbGFzc19pbnZhbGlkX2Zvcl9tZW1iZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX3N0cmluZ19jb25jYXRfbWl4ZWRfc3VmZml4KQorRElBR19OQU1FX0lOREVYKGVycl9zdHJvbmdfcHJvcGVydHkpCitESUFHX05BTUVfSU5ERVgoZXJyX3N1YnNjcmlwdF9mdW5jdGlvbl90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9zdWJzY3JpcHRfaW5jb21wbGV0ZV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9zdWJzY3JpcHRfbm9uZnJhZ2lsZV9pbnRlcmZhY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX3N1cGVyX2luX2xhbWJkYV91bnN1cHBvcnRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfc3VwZXJfaW5fdXNpbmdfZGVjbGFyYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX3N3aWZ0X2FiaV9wYXJhbWV0ZXJfd3JvbmdfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfc3dpZnRfZXJyb3JfcmVzdWx0X25vdF9hZnRlcl9zd2lmdF9jb250ZXh0KQorRElBR19OQU1FX0lOREVYKGVycl9zd2lmdF9pbmRpcmVjdF9yZXN1bHRfbm90X2ZpcnN0KQorRElBR19OQU1FX0lOREVYKGVycl9zd2lmdF9wYXJhbV9hdHRyX25vdF9zd2lmdGNhbGwpCitESUFHX05BTUVfSU5ERVgoZXJyX3N3aXRjaF9leHBsaWNpdF9jb252ZXJzaW9uKQorRElBR19OQU1FX0lOREVYKGVycl9zd2l0Y2hfaW5jb21wbGV0ZV9jbGFzc190eXBlKQorRElBR19OQU1FX0lOREVYKGVycl9zd2l0Y2hfaW50b19wcm90ZWN0ZWRfc2NvcGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3N3aXRjaF9tdWx0aXBsZV9jb252ZXJzaW9ucykKK0RJQUdfTkFNRV9JTkRFWChlcnJfc3ludGhlc2l6ZV9jYXRlZ29yeV9kZWNsKQorRElBR19OQU1FX0lOREVYKGVycl9zeW50aGVzaXplX29uX2NsYXNzX3Byb3BlcnR5KQorRElBR19OQU1FX0lOREVYKGVycl9zeW50aGVzaXplX3ZhcmlhYmxlX3NpemVkX2l2YXIpCitESUFHX05BTUVfSU5ERVgoZXJyX3N5bnRoZXNpemVkX3Byb3BlcnR5X25hbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX3N5bnRoZXNpemluZ19hcmNfd2Vha19wcm9wZXJ0eV9kaXNhYmxlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfc3ludGhlc2l6aW5nX2FyY193ZWFrX3Byb3BlcnR5X25vX3J1bnRpbWUpCitESUFHX05BTUVfSU5ERVgoZXJyX3N5c3RlbXpfaW52YWxpZF90YWJvcnRfY29kZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGFnX2RlZmluaXRpb25fb2ZfdHlwZWRlZikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGFnX2luZGV4X291dF9vZl9yYW5nZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGFnX3JlZmVyZW5jZV9jb25mbGljdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGFnX3JlZmVyZW5jZV9ub25fdGFnKQorRElBR19OQU1FX0lOREVYKGVycl90YWdsZXNzX2ZyaWVuZF90eXBlX3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKGVycl90YXJnZXRfcmVxdWlyZWRfaW5fcmVkZWNsKQorRElBR19OQU1FX0lOREVYKGVycl90YXJnZXRfdW5rbm93bl9hYmkpCitESUFHX05BTUVfSU5ERVgoZXJyX3RhcmdldF91bmtub3duX2NwdSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGFyZ2V0X3Vua25vd25fZnBtYXRoKQorRElBR19OQU1FX0lOREVYKGVycl90YXJnZXRfdW5rbm93bl90cmlwbGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3RhcmdldF91bnN1cHBvcnRlZF9hYmkpCitESUFHX05BTUVfSU5ERVgoZXJyX3RhcmdldF91bnN1cHBvcnRlZF9hYmlfZm9yX3RyaXBsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGFyZ2V0X3Vuc3VwcG9ydGVkX2FyY2gpCitESUFHX05BTUVfSU5ERVgoZXJyX3RhcmdldF91bnN1cHBvcnRlZF9jcHVfZm9yX21pY3JvbWlwcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGFyZ2V0X3Vuc3VwcG9ydGVkX2V4ZWN1dGVfb25seSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGFyZ2V0X3Vuc3VwcG9ydGVkX2ZwbWF0aCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGFyZ2V0X3Vuc3VwcG9ydGVkX3VuYWxpZ25lZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcF9jb3B5X2FtYmlndW91cykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcF9jb3B5X2RlbGV0ZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBfY29weV9pbmNvbXBsZXRlKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wX2NvcHlfbm9fdmlhYmxlKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9hcmdfYWRkcmVzc19vZl9ub25fcG9pbnRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfYXJnX2RlZHVjZWRfaW5jb21wbGV0ZV9wYWNrKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9hcmdfZmllbGQpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX2FyZ19saXN0X2RpZmZlcmVudF9hcml0eSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfYXJnX21lbWJlcl9wdHJfYmFzZV9kZXJpdmVkX25vdF9zdXBwb3J0ZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX2FyZ19tZXRob2QpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX2FyZ19tdXN0X2JlX2V4cHIpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX2FyZ19tdXN0X2JlX3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9hcmdfbXVzdF9iZV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9hcmdfbXVzdF9iZV90eXBlX3N1Z2dlc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX2FyZ19ub19yZWZfYmluZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfYXJnX25vbnR5cGVfYW1iaWcpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX2FyZ19ub3RfYWRkcmVzc19jb25zdGFudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfYXJnX25vdF9hZGRyZXNzX29mKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9hcmdfbm90X2NvbnZlcnRpYmxlKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9hcmdfbm90X2RlY2xfcmVmKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9hcmdfbm90X2ljZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfYXJnX25vdF9pbnRlZ3JhbF9vcl9lbnVtZXJhbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfYXJnX25vdF9vYmplY3Rfb3JfZnVuYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfYXJnX25vdF9wb2ludGVyX3RvX21lbWJlcl9mb3JtKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9hcmdfbm90X3ZhbGlkX3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9hcmdfb2JqZWN0X25vX2xpbmthZ2UpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX2FyZ19vdmVybG9hZF90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9hcmdfcmVmX2JpbmRfaWdub3Jlc19xdWFscykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfYXJnX3JlZmVyZW5jZV92YXIpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX2FyZ190ZW1wbGF0ZV9wYXJhbXNfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX2FyZ190aHJlYWRfbG9jYWwpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX2FyZ191bnR5cGVkX251bGxfY29uc3RhbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX2FyZ193cm9uZ3R5cGVfbnVsbF9jb25zdGFudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfZGVjbF9yZWYpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX2RlZm5fZXhwbGljaXRfaW5zdGFudGlhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfZGlmZmVyZW50X2Fzc29jaWF0ZWRfY29uc3RyYWludHMpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX2lkX25vdF9hX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX2luc2lkZV9sb2NhbF9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfaW5zdGFudGlhdGVfdW5kZWZpbmVkKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9pbnN0YW50aWF0ZV93aXRoaW5fZGVmaW5pdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfa3dfbWlzc2luZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfa3dfcmVmZXJzX3RvX2NsYXNzX3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9rd19yZWZlcnNfdG9fbm9uX3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9saW5rYWdlKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9tZW1iZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX21lbWJlcl9ub3BhcmFtcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfbWlzc2luZ19hcmdzKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9ub250eXBlX3Bhcm1fYmFkX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX25vbnR5cGVfcGFybV9kaWZmZXJlbnRfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfb3V0c2lkZV9uYW1lc3BhY2Vfb3JfY2xhc3Nfc2NvcGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX3BhcmFtX2RlZmF1bHRfYXJnX21pc3NpbmcpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX3BhcmFtX2RlZmF1bHRfYXJnX3JlZGVmaW5pdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfcGFyYW1fZGlmZmVyZW50X2tpbmQpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX3BhcmFtX2xpc3RfZGlmZmVyZW50X2FyaXR5KQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9wYXJhbV9saXN0X21hdGNoZXNfbm9udGVtcGxhdGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX3BhcmFtX3BhY2tfZGVmYXVsdF9hcmcpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX3BhcmFtX3BhY2tfbXVzdF9iZV9sYXN0X3RlbXBsYXRlX3BhcmFtZXRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfcGFyYW1fc2hhZG93KQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9wYXJhbWV0ZXJfZGVmYXVsdF9mcmllbmRfdGVtcGxhdGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX3BhcmFtZXRlcl9kZWZhdWx0X3RlbXBsYXRlX21lbWJlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfcGFyYW1ldGVyX3BhY2tfbm9uX3BhY2spCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX3F1YWxpZmllZF9kZWNsYXJhdG9yX25vX21hdGNoKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9yZWN1cnNpb25fZGVwdGhfZXhjZWVkZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX3NwZWNfZGVjbF9mcmllbmQpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX3NwZWNfZGVjbF9mdW5jdGlvbl9zY29wZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfc3BlY19kZWZhdWx0X2FyZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfc3BlY19leHRyYV9oZWFkZXJzKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9zcGVjX2ZyaWVuZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfc3BlY19uZWVkc19oZWFkZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX3NwZWNfbmVlZHNfdGVtcGxhdGVfcGFyYW1ldGVycykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfc3BlY19yZWRlY2xfZ2xvYmFsX3Njb3BlKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZV9zcGVjX3JlZGVjbF9vdXRfb2Zfc2NvcGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX3NwZWNfc3ludGF4X25vbl90ZW1wbGF0ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfc3BlY191bmtub3duX2tpbmQpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlX3RhZ19ub3BhcmFtcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfdGVtcGxhdGVfcGFybV9ub19wYXJtcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfdHlwZWRlZikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfdW5uYW1lZF9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVtcGxhdGVfdmFyaWFibGVfbm9wYXJhbXMpCitESUFHX05BTUVfSU5ERVgoZXJyX3RlbXBsYXRlZF9pbnZhbGlkX2RlY2xhcmF0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl90ZW1wbGF0ZWRfdXNpbmdfZGlyZWN0aXZlX2RlY2xhcmF0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl90ZW50YXRpdmVfZGVmX2luY29tcGxldGVfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGVzdF9tb2R1bGVfZmlsZV9leHRlbnNpb25fZm9ybWF0KQorRElBR19OQU1FX0lOREVYKGVycl90ZXN0X21vZHVsZV9maWxlX2V4dGVuc2lvbl92ZXJzaW9uKQorRElBR19OQU1FX0lOREVYKGVycl90aGlzX2NhcHR1cmUpCitESUFHX05BTUVfSU5ERVgoZXJyX3RoaXNfY2FwdHVyZWRfYnlfcmVmZXJlbmNlKQorRElBR19OQU1FX0lOREVYKGVycl90aGlzX3N0YXRpY19tZW1iZXJfZnVuYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGhyZWFkX2R5bmFtaWNfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdGhyZWFkX25vbl9nbG9iYWwpCitESUFHX05BTUVfSU5ERVgoZXJyX3RocmVhZF9ub25fdGhyZWFkKQorRElBR19OQU1FX0lOREVYKGVycl90aHJlYWRfbm9udHJpdmlhbF9kdG9yKQorRElBR19OQU1FX0lOREVYKGVycl90aHJlYWRfdGhyZWFkX2RpZmZlcmVudF9raW5kKQorRElBR19OQU1FX0lOREVYKGVycl90aHJlYWRfdW5zdXBwb3J0ZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX3Rocm93X2Fic3RyYWN0X3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3Rocm93X2luY29tcGxldGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3Rocm93X2luY29tcGxldGVfcHRyKQorRElBR19OQU1FX0lOREVYKGVycl90bHNfdmFyX2FsaWduZWRfb3Zlcl9tYXhpbXVtKQorRElBR19OQU1FX0lOREVYKGVycl90b29fZmV3X2FyZ3NfaW5fbWFjcm9faW52b2MpCitESUFHX05BTUVfSU5ERVgoZXJyX3Rvb19tYW55X2FyZ3NfaW5fbWFjcm9faW52b2MpCitESUFHX05BTUVfSU5ERVgoZXJyX3Rvb21hbnlfZWxlbWVudF9kZWNscykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHJhaWxpbmdfcmV0dXJuX2luX3BhcmVucykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHJhaWxpbmdfcmV0dXJuX3dpdGhvdXRfYXV0bykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHdvX3JpZ2h0X2FuZ2xlX2JyYWNrZXRzX25lZWRfc3BhY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVfZGVmaW5lZF9pbl9hbGlhc190ZW1wbGF0ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZV9kZWZpbmVkX2luX2NvbmRpdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZV9kZWZpbmVkX2luX2VudW0pCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVfZGVmaW5lZF9pbl9mb3JfcmFuZ2UpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVfZGVmaW5lZF9pbl9wYXJhbV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlX2RlZmluZWRfaW5fcmVzdWx0X3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVfZGVmaW5lZF9pbl90eXBlX3NwZWNpZmllcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZV9taXNtYXRjaF9jb250aW51YXRpb25fY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVfcGFja19lbGVtZW50X291dF9vZl9ib3VuZHMpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVfc2FmZXR5X3Vua25vd25fZmxhZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZV90YWdfZm9yX2RhdGF0eXBlX25vdF9pY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVfdGFnX2Zvcl9kYXRhdHlwZV90b29fbGFyZ2UpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVfdHJhaXRfYXJpdHkpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVfdW5zdXBwb3J0ZWQpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19hZGRyZXNzX29mKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfYWRkcm9mX2R0b3IpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19hZGRyb2ZfdGVtcG9yYXJ5KQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfYW1iaWd1b3VzX2NvbmRpdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2FyY19hc3NpZ25fc2VsZikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2FyY19hc3NpZ25fc2VsZl9jbGFzc19tZXRob2QpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19hcml0aG1ldGljX2luY29tcGxldGVfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2Fycl9hc3NpZ25fZW51bWVyYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19hcnJheV9ub3RfbW9kaWZpYWJsZV9sdmFsdWUpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19hc3NpZ25fY29uc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19ib29sX2NvbmRpdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2NhbGxfaW52YWxpZF9vcmRlcmVkX2NvbXBhcmUpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19jYWxsX2ludmFsaWRfdW5hcnlfZnApCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19jYWxsX25vdF9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2NhbGxfdG9vX2Zld19hcmdzKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfY2FsbF90b29fZmV3X2FyZ3NfYXRfbGVhc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19jYWxsX3Rvb19mZXdfYXJnc19hdF9sZWFzdF9vbmUpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19jYWxsX3Rvb19mZXdfYXJnc19hdF9sZWFzdF9zdWdnZXN0KQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfY2FsbF90b29fZmV3X2FyZ3Nfb25lKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfY2FsbF90b29fZmV3X2FyZ3Nfc3VnZ2VzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2NhbGxfdG9vX21hbnlfYXJncykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2NhbGxfdG9vX21hbnlfYXJnc19hdF9tb3N0KQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfY2FsbF90b29fbWFueV9hcmdzX2F0X21vc3Rfb25lKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfY2FsbF90b29fbWFueV9hcmdzX2F0X21vc3Rfc3VnZ2VzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2NhbGxfdG9vX21hbnlfYXJnc19vbmUpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19jYWxsX3Rvb19tYW55X2FyZ3Nfc3VnZ2VzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2Nhc3RfdG9faW5jb21wbGV0ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2Nhc3RfdG9fdW5pb25fbm9fdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2Nob29zZV9leHByX3JlcXVpcmVzX2NvbnN0YW50KQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfY29tcGFyaXNvbl9vZl9kaXN0aW5jdF9ibG9ja3MpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19jb21wYXJpc29uX29mX2Rpc3RpbmN0X3BvaW50ZXJzKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfY29tcGFyaXNvbl9vZl9mcHRyX3RvX3ZvaWQpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19jb21wYXJpc29uX29mX3BvaW50ZXJfaW50ZWdlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2NvbmRfZXhwZWN0X2ludF9mbG9hdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2NvbmRfZXhwZWN0X25vbmZsb2F0KQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfY29uZF9leHBlY3Rfc2NhbGFyKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfY29uZF9pbmNvbXBhdGlibGVfb3BlcmFuZHMpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19jb25kX2luY29tcGF0aWJsZV9vcGVyYW5kc19udWxsKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfY29udmVydF9pbmNvbXBhdGlibGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19jb252ZXJ0X2luY29tcGF0aWJsZV9ibG9ja19wb2ludGVyKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfY29udmVydGVkX2NvbnN0YW50X2V4cHJlc3Npb24pCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19jb252ZXJ0ZWRfY29uc3RhbnRfZXhwcmVzc2lvbl9kaXNhbGxvd2VkKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfY29udmVydGVkX2NvbnN0YW50X2V4cHJlc3Npb25faW5kaXJlY3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19kZWNsX2luY29tcGxldGVfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2RlbGV0ZWRfZnVuY3Rpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19kdXBsaWNhdGVfdmVjdG9yX2NvbXBvbmVudHNfbm90X21sdmFsdWUpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19leHBlY3RfaW50KQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfZXhwZWN0X3NjYWxhcl9vcGVyYW5kKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfZXhwcmVzc2lvbl9ub3RfbW9kaWZpYWJsZV9sdmFsdWUpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19maWVsZF92YXJpYWJsZV9zaXplKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfaWxsZWdhbF9pbmNyZW1lbnRfZGVjcmVtZW50KQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfaW5jb21wYXRpYmxlX2FkZHJlc3Nfc3BhY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19pbmNvbXBhdGlibGVfb3duZXJzaGlwKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfaW5jb21wbGV0ZV9hcnJheV9uZWVkc19pbml0aWFsaXplcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2luY29tcGxldGVfdGFnKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfaW5jb21wbGV0ZV90eXBlX25vdF9tb2RpZmlhYmxlX2x2YWx1ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2luZGlyZWN0aW9uX3JlcXVpcmVzX3BvaW50ZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19pbnZhbGlkX2x2YWx1ZV9hZGRyb2YpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19pbnZhbGlkX2x2YWx1ZV9hZGRyb2ZfYWRkcm9mX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfaW52YWxpZF9vcGVyYW5kcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2ludmFsaWRfcmVzdHJpY3RfaW52YWxpZF9wb2ludGVlKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfaW52YWxpZF9yZXN0cmljdF9ub3RfcG9pbnRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX2ludmFsaWRfcmVzdHJpY3Rfbm90X3BvaW50ZXJfbm9hcmcpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19pdmFyX3ZhcmlhYmxlX3NpemUpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19sb2dpY2FsX3ZlY3Rvcl9leHByX2dudV9jcHBfcmVzdHJpY3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19sdmFsdWVfY2FzdHNfbm90X3N1cHBvcnRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX21lbWJlcl9yZWZlcmVuY2VfYXJyb3cpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19tZW1iZXJfcmVmZXJlbmNlX2l2YXIpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19tZW1iZXJfcmVmZXJlbmNlX2l2YXJfc3VnZ2VzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX21lbWJlcl9yZWZlcmVuY2Vfc3RydWN0X3VuaW9uKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfbWVtYmVyX3JlZmVyZW5jZV9zdWdnZXN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfbWVtYmVyX3JlZmVyZW5jZV90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfbWVtYmVyX3JlZmVyZW5jZV91bmtub3duKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfbWlzc2luZ19yZXR1cm5fdHlwZV9pbmNvbXBhdGlibGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19uZWdhdGl2ZV9hcnJheV9zaXplKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfbm9uX29iamVjdF9ub3RfbW9kaWZpYWJsZV9sdmFsdWUpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19ub252aWFibGVfY29uZGl0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfbm9udmlhYmxlX2NvbmRpdGlvbl9pbmNvbXBsZXRlKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfb3Bfb25fbm9ub3ZlcmxhcHBpbmdfYWRkcmVzc19zcGFjZV9wb2ludGVycykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX29yZGVyZWRfY29tcGFyaXNvbl9vZl9wb2ludGVyX2FuZF96ZXJvKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfcG9pbnRlcl9hcml0aF9mdW5jdGlvbl90eXBlKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfcG9pbnRlcl9hcml0aF92b2lkX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19zY2xhc3NfZnNjb3BlKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfc2NsYXNzX2Z1bmMpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19zdGF0ZW1lbnRfcmVxdWlyZXNfaW50ZWdlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX3N0YXRlbWVudF9yZXF1aXJlc19zY2FsYXIpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19zdWJfcHRyX2NvbXBhdGlibGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19zdWJzY3JpcHRfbm90X2ludGVnZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja19zdWJzY3JpcHRfdmFsdWUpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVjaGVja191bmFyeV9leHByKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfdmVjdG9yX2xlbmd0aHNfbm90X2VxdWFsKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfdmVjdG9yX25vdF9jb252ZXJ0YWJsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWNoZWNrX3ZlY3Rvcl9ub3RfY29udmVydGFibGVfaW1wbGljdF90cnVuY2F0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfdmVjdG9yX25vdF9jb252ZXJ0YWJsZV9ub25fc2NhbGFyKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlY2hlY2tfemVyb19hcnJheV9zaXplKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlZGVmX2NoYW5nZXNfbGlua2FnZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZWRlZl9ub3RfYml0ZmllbGQpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVkZWZfbm90X2lkZW50aWZpZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVuYW1lX2lkZW50aWZpZXJzX29ubHkpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVuYW1lX2ludmFsaWRfY29uc3RleHByKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlbmFtZV9pbnZhbGlkX2Z1bmN0aW9uc3BlYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZW5hbWVfaW52YWxpZF9zdG9yYWdlY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVuYW1lX21pc3NpbmcpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVuYW1lX21pc3NpbmdfdGVtcGxhdGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVuYW1lX25lc3RlZF9ub3RfZm91bmQpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVuYW1lX25lc3RlZF9ub3RfZm91bmRfZW5hYmxlX2lmKQorRElBR19OQU1FX0lOREVYKGVycl90eXBlbmFtZV9uZXN0ZWRfbm90X2ZvdW5kX3JlcXVpcmVtZW50KQorRElBR19OQU1FX0lOREVYKGVycl90eXBlbmFtZV9uZXN0ZWRfbm90X3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVuYW1lX3JlZmVyc190b19ub25fdHlwZV90ZW1wbGF0ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdHlwZW5hbWVfcmVmZXJzX3RvX3VzaW5nX3ZhbHVlX2RlY2wpCitESUFHX05BTUVfSU5ERVgoZXJyX3R5cGVuYW1lX3JlcXVpcmVzX3NwZWNxdWFsKQorRElBR19OQU1FX0lOREVYKGVycl91Y25fY29udHJvbF9jaGFyYWN0ZXIpCitESUFHX05BTUVfSU5ERVgoZXJyX3Vjbl9lc2NhcGVfYmFzaWNfc2NzKQorRElBR19OQU1FX0lOREVYKGVycl91Y25fZXNjYXBlX2luY29tcGxldGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3Vjbl9lc2NhcGVfaW52YWxpZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5hYmxlX3RvX21ha2VfdGVtcCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5hYmxlX3RvX3JlbmFtZV90ZW1wKQorRElBR19OQU1FX0lOREVYKGVycl91bmF2YWlsYWJsZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5hdmFpbGFibGVfaW5fYXJjKQorRElBR19OQU1FX0lOREVYKGVycl91bmF2YWlsYWJsZV9tZXNzYWdlKQorRElBR19OQU1FX0lOREVYKGVycl91bmNhc3RlZF9jYWxsX29mX3Vua25vd25fYW55KQorRElBR19OQU1FX0lOREVYKGVycl91bmNhc3RlZF9zZW5kX3RvX3Vua25vd25fYW55X21ldGhvZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5jYXN0ZWRfdXNlX29mX3Vua25vd25fYW55KQorRElBR19OQU1FX0lOREVYKGVycl91bmRlY2xhcmVkX2JveGluZ19tZXRob2QpCitESUFHX05BTUVfSU5ERVgoZXJyX3VuZGVjbGFyZWRfbGFiZWxfdXNlKQorRElBR19OQU1FX0lOREVYKGVycl91bmRlY2xhcmVkX29iamNfbGl0ZXJhbF9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5kZWNsYXJlZF9wcm90b2NvbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5kZWNsYXJlZF9wcm90b2NvbF9zdWdnZXN0KQorRElBR19OQU1FX0lOREVYKGVycl91bmRlY2xhcmVkX3VzZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5kZWNsYXJlZF91c2Vfb2ZfbW9kdWxlKQorRElBR19OQU1FX0lOREVYKGVycl91bmRlY2xhcmVkX3VzZV9zdWdnZXN0KQorRElBR19OQU1FX0lOREVYKGVycl91bmRlY2xhcmVkX3Zhcl91c2UpCitESUFHX05BTUVfSU5ERVgoZXJyX3VuZGVjbGFyZWRfdmFyX3VzZV9zdWdnZXN0KQorRElBR19OQU1FX0lOREVYKGVycl91bmRlZl9pbnRlcmZhY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX3VuZGVmX2ludGVyZmFjZV9zdWdnZXN0KQorRElBR19OQU1FX0lOREVYKGVycl91bmRlZl9zdXBlcmNsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl91bmRlZl9zdXBlcmNsYXNzX3N1Z2dlc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3VuZGVmaW5lZF9pbmxpbmVfdmFyKQorRElBR19OQU1FX0lOREVYKGVycl91bmRlZmluZWRfaW50ZXJuYWxfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5kZXJseWluZ190eXBlX29mX2luY29tcGxldGVfZW51bSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5leHBhbmRlZF9wYXJhbWV0ZXJfcGFjaykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5leHBlY3RlZF9hdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5leHBlY3RlZF9jb2xvbl9pbl9uZXN0ZWRfbmFtZV9zcGVjKQorRElBR19OQU1FX0lOREVYKGVycl91bmV4cGVjdGVkX2ZyaWVuZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5leHBlY3RlZF9pbnRlcmZhY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX3VuZXhwZWN0ZWRfbW9kdWxlX2RlY2wpCitESUFHX05BTUVfSU5ERVgoZXJyX3VuZXhwZWN0ZWRfbmFtZXNwYWNlKQorRElBR19OQU1FX0lOREVYKGVycl91bmV4cGVjdGVkX25hbWVzcGFjZV9hdHRyaWJ1dGVzX2FsaWFzKQorRElBR19OQU1FX0lOREVYKGVycl91bmV4cGVjdGVkX25lc3RlZF9uYW1lc3BhY2VfYXR0cmlidXRlKQorRElBR19OQU1FX0lOREVYKGVycl91bmV4cGVjdGVkX3Byb3RvY29sX3F1YWxpZmllcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5leHBlY3RlZF9zY29wZV9vbl9iYXNlX2RlY2x0eXBlKQorRElBR19OQU1FX0lOREVYKGVycl91bmV4cGVjdGVkX3NlbWkpCitESUFHX05BTUVfSU5ERVgoZXJyX3VuZXhwZWN0ZWRfdG9rZW5faW5fbmVzdGVkX25hbWVfc3BlYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5leHBlY3RlZF90eXBlZGVmKQorRElBR19OQU1FX0lOREVYKGVycl91bmV4cGVjdGVkX3R5cGVkZWZfaWRlbnQpCitESUFHX05BTUVfSU5ERVgoZXJyX3VuZXhwZWN0ZWRfdW5xdWFsaWZpZWRfaWQpCitESUFHX05BTUVfSU5ERVgoZXJyX3VuaW5pdGlhbGl6ZWRfbWVtYmVyX2Zvcl9hc3NpZ24pCitESUFHX05BTUVfSU5ERVgoZXJyX3VuaW5pdGlhbGl6ZWRfbWVtYmVyX2luX2N0b3IpCitESUFHX05BTUVfSU5ERVgoZXJyX3VuaW9uX2FzX2Jhc2VfY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX3VuaW9uX21lbWJlcl9vZl9yZWZlcmVuY2VfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5rbm93bl9hbmFseXplcl9jaGVja2VyKQorRElBR19OQU1FX0lOREVYKGVycl91bmtub3duX2FueV9hZGRyb2YpCitESUFHX05BTUVfSU5ERVgoZXJyX3Vua25vd25fYW55X2FkZHJvZl9jYWxsKQorRElBR19OQU1FX0lOREVYKGVycl91bmtub3duX2FueV9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5rbm93bl9hbnlfdmFyX2Z1bmN0aW9uX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3Vua25vd25fbmVzdGVkX3R5cGVuYW1lX3N1Z2dlc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3Vua25vd25fcmVjZWl2ZXJfc3VnZ2VzdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5rbm93bl90ZW1wbGF0ZV9uYW1lKQorRElBR19OQU1FX0lOREVYKGVycl91bmtub3duX3R5cGVfb3JfY2xhc3NfbmFtZV9zdWdnZXN0KQorRElBR19OQU1FX0lOREVYKGVycl91bmtub3duX3R5cGVuYW1lKQorRElBR19OQU1FX0lOREVYKGVycl91bmtub3duX3R5cGVuYW1lX3N1Z2dlc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3VucXVhbGlmaWVkX3BvaW50ZXJfbWVtYmVyX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl91bnNwZWNpZmllZF9zaXplX3dpdGhfc3RhdGljKQorRElBR19OQU1FX0lOREVYKGVycl91bnNwZWNpZmllZF92bGFfc2l6ZV93aXRoX3N0YXRpYykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5zdXBwb3J0ZWRfYXN0X25vZGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3Vuc3VwcG9ydGVkX2JvbSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5zdXBwb3J0ZWRfc3RyaW5nX2NvbmNhdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5zdXBwb3J0ZWRfdW5rbm93bl9hbnlfY2FsbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5zdXBwb3J0ZWRfdW5rbm93bl9hbnlfZGVjbCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW5zdXBwb3J0ZWRfdW5rbm93bl9hbnlfZXhwcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdW50ZXJtX21hY3JvX2ludm9jKQorRElBR19OQU1FX0lOREVYKGVycl91bnRlcm1pbmF0ZWRfX19wcmFnbWEpCitESUFHX05BTUVfSU5ERVgoZXJyX3VudGVybWluYXRlZF9ibG9ja19jb21tZW50KQorRElBR19OQU1FX0lOREVYKGVycl91bnRlcm1pbmF0ZWRfcmF3X3N0cmluZykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdXBjYXN0X3RvX2luYWNjZXNzaWJsZV9iYXNlKQorRElBR19OQU1FX0lOREVYKGVycl91c2VfY29udGludWF0aW9uX2NsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl91c2VfY29udGludWF0aW9uX2NsYXNzX3JlZGVjbGFyYXRpb25fcmVhZHdyaXRlKQorRElBR19OQU1FX0lOREVYKGVycl91c2Vfb2ZfZGVmYXVsdF9hcmd1bWVudF90b19mdW5jdGlvbl9kZWNsYXJlZF9sYXRlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdXNlX29mX3RhZ19uYW1lX3dpdGhvdXRfdGFnKQorRElBR19OQU1FX0lOREVYKGVycl91c2Vfd2l0aF93cm9uZ190YWcpCitESUFHX05BTUVfSU5ERVgoZXJyX3VzaW5nX2F0dHJpYnV0ZV9uc19jb25mbGljdCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdXNpbmdfZGVjbF9jYW5fbm90X3JlZmVyX3RvX2NsYXNzX21lbWJlcikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdXNpbmdfZGVjbF9jYW5fbm90X3JlZmVyX3RvX25hbWVzcGFjZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdXNpbmdfZGVjbF9jYW5fbm90X3JlZmVyX3RvX3Njb3BlZF9lbnVtKQorRElBR19OQU1FX0lOREVYKGVycl91c2luZ19kZWNsX2NvbmZsaWN0KQorRElBR19OQU1FX0lOREVYKGVycl91c2luZ19kZWNsX2NvbmZsaWN0X3JldmVyc2UpCitESUFHX05BTUVfSU5ERVgoZXJyX3VzaW5nX2RlY2xfY29uc3RydWN0b3IpCitESUFHX05BTUVfSU5ERVgoZXJyX3VzaW5nX2RlY2xfY29uc3RydWN0b3Jfbm90X2luX2RpcmVjdF9iYXNlKQorRElBR19OQU1FX0lOREVYKGVycl91c2luZ19kZWNsX2Rlc3RydWN0b3IpCitESUFHX05BTUVfSU5ERVgoZXJyX3VzaW5nX2RlY2xfZnJpZW5kKQorRElBR19OQU1FX0lOREVYKGVycl91c2luZ19kZWNsX25lc3RlZF9uYW1lX3NwZWNpZmllcl9pc19jdXJyZW50X2NsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl91c2luZ19kZWNsX25lc3RlZF9uYW1lX3NwZWNpZmllcl9pc19ub3RfYmFzZV9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdXNpbmdfZGVjbF9uZXN0ZWRfbmFtZV9zcGVjaWZpZXJfaXNfbm90X2NsYXNzKQorRElBR19OQU1FX0lOREVYKGVycl91c2luZ19kZWNsX3JlZGVjbGFyYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX3VzaW5nX2RlY2xfcmVkZWNsYXJhdGlvbl9leHBhbnNpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX3VzaW5nX2RlY2xfdGVtcGxhdGVfaWQpCitESUFHX05BTUVfSU5ERVgoZXJyX3VzaW5nX2RlcGVuZGVudF92YWx1ZV9pc190eXBlKQorRElBR19OQU1FX0lOREVYKGVycl91c2luZ19kaXJlY3RpdmVfbWVtYmVyX3N1Z2dlc3QpCitESUFHX05BTUVfSU5ERVgoZXJyX3VzaW5nX2RpcmVjdGl2ZV9zdWdnZXN0KQorRElBR19OQU1FX0lOREVYKGVycl91c2luZ19uYW1lc3BhY2VfaW5fY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXJyX3VzaW5nX3BhY2tfZXhwYW5zaW9uX2VtcHR5KQorRElBR19OQU1FX0lOREVYKGVycl91c2luZ19yZXF1aXJlc19xdWFsbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdXNpbmdfdHlwZW5hbWVfbm9uX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3V1aWRvZl93aXRoX211bHRpcGxlX2d1aWRzKQorRElBR19OQU1FX0lOREVYKGVycl91dWlkb2Zfd2l0aG91dF9ndWlkKQorRElBR19OQU1FX0lOREVYKGVycl92YV9hcmdfaW5fZGV2aWNlKQorRElBR19OQU1FX0lOREVYKGVycl92YV9zdGFydF9jYXB0dXJlZF9zdG10KQorRElBR19OQU1FX0lOREVYKGVycl92YV9zdGFydF9maXhlZF9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdmFfc3RhcnRfb3V0c2lkZV9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdmFfc3RhcnRfdXNlZF9pbl93cm9uZ19hYmlfZnVuY3Rpb24pCitESUFHX05BTUVfSU5ERVgoZXJyX3ZhbHVlX2luaXRfZm9yX2FycmF5X3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3Zhb3B0X3Bhc3RlX2F0X2VuZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdmFvcHRfcGFzdGVfYXRfc3RhcnQpCitESUFHX05BTUVfSU5ERVgoZXJyX3Zhcl9jb25jZXB0X25vdF9pbml0aWFsaXplZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdmFyX3BhcnRpYWxfc3BlY19yZWRlY2xhcmVkKQorRElBR19OQU1FX0lOREVYKGVycl92YXJfc3BlY19ub190ZW1wbGF0ZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdmFyX3NwZWNfbm9fdGVtcGxhdGVfYnV0X21ldGhvZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdmFyaWFibGVfY29uY2VwdF9ib29sX2RlY2wpCitESUFHX05BTUVfSU5ERVgoZXJyX3ZhcmlhYmxlX2luc3RhbnRpYXRlc190b19mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdmFyaWFibGVfb2JqZWN0X25vX2luaXQpCitESUFHX05BTUVfSU5ERVgoZXJyX3ZhcmlhYmx5X21vZGlmaWVkX25ld190eXBlKQorRElBR19OQU1FX0lOREVYKGVycl92YXJpYWJseV9tb2RpZmllZF9ub250eXBlX3RlbXBsYXRlX3BhcmFtKQorRElBR19OQU1FX0lOREVYKGVycl92YXJpYWJseV9tb2RpZmllZF90ZW1wbGF0ZV9hcmcpCitESUFHX05BTUVfSU5ERVgoZXJyX3ZhcmlhYmx5X21vZGlmaWVkX3R5cGVpZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdmFyaWFkaWNfZGV2aWNlX2ZuKQorRElBR19OQU1FX0lOREVYKGVycl92ZWNfYnVpbHRpbl9pbmNvbXBhdGlibGVfdmVjdG9yKQorRElBR19OQU1FX0lOREVYKGVycl92ZWNfYnVpbHRpbl9ub25fdmVjdG9yKQorRElBR19OQU1FX0lOREVYKGVycl92ZWNzdGVwX25vbl9zY2FsYXJfdmVjdG9yX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3ZlY3Rvcl9pbmNvcnJlY3RfbnVtX2luaXRpYWxpemVycykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdmVyaWZ5X2luY29uc2lzdGVudF9kaWFncykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdmVyaWZ5X2ludmFsaWRfY29udGVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdmVyaWZ5X2ludmFsaWRfbm9fZGlhZ3MpCitESUFHX05BTUVfSU5ERVgoZXJyX3ZlcmlmeV9pbnZhbGlkX3JhbmdlKQorRElBR19OQU1FX0lOREVYKGVycl92ZXJpZnlfbWlzc2luZ19lbmQpCitESUFHX05BTUVfSU5ERVgoZXJyX3ZlcmlmeV9taXNzaW5nX2ZpbGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3ZlcmlmeV9taXNzaW5nX2xpbmUpCitESUFHX05BTUVfSU5ERVgoZXJyX3ZlcmlmeV9taXNzaW5nX3JlZ2V4KQorRElBR19OQU1FX0lOREVYKGVycl92ZXJpZnlfbWlzc2luZ19zdGFydCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdmVyaWZ5X25vX2RpcmVjdGl2ZXMpCitESUFHX05BTUVfSU5ERVgoZXJyX3ZmdGFibGVfYW1iaWd1b3VzX2NvbXBvbmVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdmlydHVhbF9pbl91bmlvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJfdmlydHVhbF9tZW1iZXJfZnVuY3Rpb25fdGVtcGxhdGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3ZpcnR1YWxfbm9uX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKGVycl92aXJ0dWFsX291dF9vZl9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChlcnJfdmxhX2RlY2xfaGFzX2V4dGVybl9saW5rYWdlKQorRElBR19OQU1FX0lOREVYKGVycl92bGFfZGVjbF9oYXNfc3RhdGljX3N0b3JhZ2UpCitESUFHX05BTUVfSU5ERVgoZXJyX3ZsYV9kZWNsX2luX2ZpbGVfc2NvcGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3ZsYV9pbl9zZmluYWUpCitESUFHX05BTUVfSU5ERVgoZXJyX3ZsYV91bnN1cHBvcnRlZCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdm1fZGVjbF9oYXNfZXh0ZXJuX2xpbmthZ2UpCitESUFHX05BTUVfSU5ERVgoZXJyX3ZtX2RlY2xfaW5fZmlsZV9zY29wZSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfdm1fZnVuY19kZWNsKQorRElBR19OQU1FX0lOREVYKGVycl92b2lkX29ubHlfcGFyYW0pCitESUFHX05BTUVfSU5ERVgoZXJyX3ZvaWRfcGFyYW1fcXVhbGlmaWVkKQorRElBR19OQU1FX0lOREVYKGVycl92c3hfYnVpbHRpbl9ub25jb25zdGFudF9hcmd1bWVudCkKK0RJQUdfTkFNRV9JTkRFWChlcnJfd2Vha19wcm9wZXJ0eSkKK0RJQUdfTkFNRV9JTkRFWChlcnJfd3Jvbmdfc2FtcGxlcl9hZGRyZXNzc3BhY2UpCitESUFHX05BTUVfSU5ERVgoZXJyX3g4Nl9idWlsdGluX2ludmFsaWRfcm91bmRpbmcpCitESUFHX05BTUVfSU5ERVgoZXJyX3g4Nl9idWlsdGluX2ludmFsaWRfc2NhbGUpCitESUFHX05BTUVfSU5ERVgoZXJyX3plcm9fdmVyc2lvbikKK0RJQUdfTkFNRV9JTkRFWChlcnJvcl9pbm91dHB1dF9jb25mbGljdF93aXRoX2Nsb2JiZXIpCitESUFHX05BTUVfSU5ERVgoZXNjYXBlZF9uZXdsaW5lX2Jsb2NrX2NvbW1lbnRfZW5kKQorRElBR19OQU1FX0lOREVYKGV4dF9hYnN0cmFjdF9wYWNrX2RlY2xhcmF0b3JfcGFyZW5zKQorRElBR19OQU1FX0lOREVYKGV4dF9hZ2dyZWdhdGVfaW5pdF9ub3RfY29uc3RhbnQpCitESUFHX05BTUVfSU5ERVgoZXh0X2FsaWFzX2RlY2xhcmF0aW9uKQorRElBR19OQU1FX0lOREVYKGV4dF9hbGlnbm9mX2V4cHIpCitESUFHX05BTUVfSU5ERVgoZXh0X2Fub255bW91c19yZWNvcmRfd2l0aF9hbm9ueW1vdXNfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfYW5vbnltb3VzX3JlY29yZF93aXRoX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXh0X2Fub255bW91c19zdHJ1Y3RfdW5pb25fcXVhbGlmaWVkKQorRElBR19OQU1FX0lOREVYKGV4dF9hbm9ueW1vdXNfdW5pb24pCitESUFHX05BTUVfSU5ERVgoZXh0X2FycmF5X2luaXRfY29weSkKK0RJQUdfTkFNRV9JTkRFWChleHRfYXJyYXlfaW5pdF9wYXJlbnMpCitESUFHX05BTUVfSU5ERVgoZXh0X2FycmF5X3NpemVfY29udmVyc2lvbikKK0RJQUdfTkFNRV9JTkRFWChleHRfYXV0b19uZXdfbGlzdF9pbml0KQorRElBR19OQU1FX0lOREVYKGV4dF9hdXRvX3N0b3JhZ2VfY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXh0X2F1dG9fdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfYXV0b190eXBlX3NwZWNpZmllcikKK0RJQUdfTkFNRV9JTkRFWChleHRfYmluYXJ5X2xpdGVyYWwpCitESUFHX05BTUVfSU5ERVgoZXh0X2JpbmFyeV9saXRlcmFsX2N4eDE0KQorRElBR19OQU1FX0lOREVYKGV4dF9iaXRmaWVsZF9tZW1iZXJfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWChleHRfYzExX2FsaWdubWVudCkKK0RJQUdfTkFNRV9JTkRFWChleHRfYzExX2Fub255bW91c19zdHJ1Y3QpCitESUFHX05BTUVfSU5ERVgoZXh0X2MxMV9nZW5lcmljX3NlbGVjdGlvbikKK0RJQUdfTkFNRV9JTkRFWChleHRfYzExX25vcmV0dXJuKQorRElBR19OQU1FX0lOREVYKGV4dF9jMTFfc3RhdGljX2Fzc2VydCkKK0RJQUdfTkFNRV9JTkRFWChleHRfYzk5X2FycmF5X3VzYWdlKQorRElBR19OQU1FX0lOREVYKGV4dF9jOTlfY29tcG91bmRfbGl0ZXJhbCkKK0RJQUdfTkFNRV9JTkRFWChleHRfYzk5X2ZsZXhpYmxlX2FycmF5X21lbWJlcikKK0RJQUdfTkFNRV9JTkRFWChleHRfYzk5X2xvbmdsb25nKQorRElBR19OQU1FX0lOREVYKGV4dF9jOTlfdmFyaWFibGVfZGVjbF9pbl9mb3JfbG9vcCkKK0RJQUdfTkFNRV9JTkRFWChleHRfYzk5X3doaXRlc3BhY2VfcmVxdWlyZWRfYWZ0ZXJfbWFjcm9fbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfY19lbnVtX2ZpeGVkX3VuZGVybHlpbmdfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfY2Fubm90X3VzZV90cml2aWFsX2FiaSkKK0RJQUdfTkFNRV9JTkRFWChleHRfY2FzdF9mbl9vYmopCitESUFHX05BTUVfSU5ERVgoZXh0X2NjZV9uYXJyb3dpbmcpCitESUFHX05BTUVfSU5ERVgoZXh0X2NoYXJpemVfbWljcm9zb2Z0KQorRElBR19OQU1FX0lOREVYKGV4dF9jbGFuZ19kaWFnbm9zZV9pZikKK0RJQUdfTkFNRV9JTkRFWChleHRfY2xhbmdfZW5hYmxlX2lmKQorRElBR19OQU1FX0lOREVYKGV4dF9jb21tZW50X3Bhc3RlX21pY3Jvc29mdCkKK0RJQUdfTkFNRV9JTkRFWChleHRfY29tcGxleF9jb21wb25lbnRfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWChleHRfY29uc3RleHByX2JvZHlfaW52YWxpZF9zdG10KQorRElBR19OQU1FX0lOREVYKGV4dF9jb25zdGV4cHJfYm9keV9tdWx0aXBsZV9yZXR1cm4pCitESUFHX05BTUVfSU5ERVgoZXh0X2NvbnN0ZXhwcl9mdW5jdGlvbl9uZXZlcl9jb25zdGFudF9leHByKQorRElBR19OQU1FX0lOREVYKGV4dF9jb25zdGV4cHJfaWYpCitESUFHX05BTUVfSU5ERVgoZXh0X2NvbnN0ZXhwcl9sb2NhbF92YXIpCitESUFHX05BTUVfSU5ERVgoZXh0X2NvbnN0ZXhwcl9vbl9sYW1iZGFfY3h4MTcpCitESUFHX05BTUVfSU5ERVgoZXh0X2NvbnN0ZXhwcl90eXBlX2RlZmluaXRpb24pCitESUFHX05BTUVfSU5ERVgoZXh0X2N0cmxfel9lb2ZfbWljcm9zb2Z0KQorRElBR19OQU1FX0lOREVYKGV4dF9jeHgxMV9lbnVtX2ZpeGVkX3VuZGVybHlpbmdfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfY3h4MTFfbG9uZ2xvbmcpCitESUFHX05BTUVfSU5ERVgoZXh0X2N4eDE0X2F0dHIpCitESUFHX05BTUVfSU5ERVgoZXh0X2N4eDE3X2F0dHIpCitESUFHX05BTUVfSU5ERVgoZXh0X2RlY2x0eXBlX2F1dG9fdHlwZV9zcGVjaWZpZXIpCitESUFHX05BTUVfSU5ERVgoZXh0X2RlY29tcF9kZWNsKQorRElBR19OQU1FX0lOREVYKGV4dF9kZWNvbXBfZGVjbF9jb25kKQorRElBR19OQU1FX0lOREVYKGV4dF9kZWNvbXBfZGVjbF9lbXB0eSkKK0RJQUdfTkFNRV9JTkRFWChleHRfZGVmYXVsdF9pbml0X2NvbnN0KQorRElBR19OQU1FX0lOREVYKGV4dF9kZWZhdWx0ZWRfZGVsZXRlZF9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChleHRfZGVsZXRlX3ZvaWRfcHRyX29wZXJhbmQpCitESUFHX05BTUVfSU5ERVgoZXh0X2RlcHJlY2F0ZWRfc3RyaW5nX2xpdGVyYWxfY29udmVyc2lvbikKK0RJQUdfTkFNRV9JTkRFWChleHRfZGVzaWduYXRlZF9pbml0KQorRElBR19OQU1FX0lOREVYKGV4dF9kb2xsYXJfaW5faWRlbnRpZmllcikKK0RJQUdfTkFNRV9JTkRFWChleHRfZHVwbGljYXRlX2RlY2xzcGVjKQorRElBR19OQU1FX0lOREVYKGV4dF9keW5hbWljX2V4Y2VwdGlvbl9zcGVjKQorRElBR19OQU1FX0lOREVYKGV4dF9lbGxpcHNpc19leGNlcHRpb25fc3BlYykKK0RJQUdfTkFNRV9JTkRFWChleHRfZW1iZWRkZWRfZGlyZWN0aXZlKQorRElBR19OQU1FX0lOREVYKGV4dF9lbXB0eV9jaGFyYWN0ZXIpCitESUFHX05BTUVfSU5ERVgoZXh0X2VtcHR5X2ZubWFjcm9fYXJnKQorRElBR19OQU1FX0lOREVYKGV4dF9lbXB0eV9zdHJ1Y3RfdW5pb24pCitESUFHX05BTUVfSU5ERVgoZXh0X2VtcHR5X3RyYW5zbGF0aW9uX3VuaXQpCitESUFHX05BTUVfSU5ERVgoZXh0X2VudW1fZnJpZW5kKQorRElBR19OQU1FX0lOREVYKGV4dF9lbnVtX3Rvb19sYXJnZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfZW51bV92YWx1ZV9ub3RfaW50KQorRElBR19OQU1FX0lOREVYKGV4dF9lbnVtZXJhdG9yX2luY3JlbWVudF90b29fbGFyZ2UpCitESUFHX05BTUVfSU5ERVgoZXh0X2VudW1lcmF0b3JfbGlzdF9jb21tYV9jKQorRElBR19OQU1FX0lOREVYKGV4dF9lbnVtZXJhdG9yX2xpc3RfY29tbWFfY3h4KQorRElBR19OQU1FX0lOREVYKGV4dF9lbnVtZXJhdG9yX3Rvb19sYXJnZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfZXF1YWxzX3RoaXNfbGFtYmRhX2NhcHR1cmVfY3h4MmEpCitESUFHX05BTUVfSU5ERVgoZXh0X2VxdWl2YWxlbnRfaW50ZXJuYWxfbGlua2FnZV9kZWNsX2luX21vZHVsZXMpCitESUFHX05BTUVfSU5ERVgoZXh0X2V4Y2Vzc19pbml0aWFsaXplcnMpCitESUFHX05BTUVfSU5ERVgoZXh0X2V4Y2Vzc19pbml0aWFsaXplcnNfaW5fY2hhcl9hcnJheV9pbml0aWFsaXplcikKK0RJQUdfTkFNRV9JTkRFWChleHRfZXhwZWN0ZWRfc2VtaV9kZWNsX2xpc3QpCitESUFHX05BTUVfSU5ERVgoZXh0X2V4cGxpY2l0X2NvbnZlcnNpb25fZnVuY3Rpb25zKQorRElBR19OQU1FX0lOREVYKGV4dF9leHBsaWNpdF9pbnN0YW50aWF0aW9uX2R1cGxpY2F0ZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfZXhwbGljaXRfaW5zdGFudGlhdGlvbl93aXRob3V0X3F1YWxpZmllZF9pZCkKK0RJQUdfTkFNRV9JTkRFWChleHRfZXhwbGljaXRfc3BlY2lhbGl6YXRpb25fc3RvcmFnZV9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChleHRfZXhwcl9ub3RfaWNlKQorRElBR19OQU1FX0lOREVYKGV4dF9leHRlcm5fdGVtcGxhdGUpCitESUFHX05BTUVfSU5ERVgoZXh0X2V4dHJhX3NlbWkpCitESUFHX05BTUVfSU5ERVgoZXh0X2V4dHJhX3NlbWlfY3h4MTEpCitESUFHX05BTUVfSU5ERVgoZXh0X2ZsZXhpYmxlX2FycmF5X2VtcHR5X2FnZ3JlZ2F0ZV9nbnUpCitESUFHX05BTUVfSU5ERVgoZXh0X2ZsZXhpYmxlX2FycmF5X2VtcHR5X2FnZ3JlZ2F0ZV9tcykKK0RJQUdfTkFNRV9JTkRFWChleHRfZmxleGlibGVfYXJyYXlfaW5fYXJyYXkpCitESUFHX05BTUVfSU5ERVgoZXh0X2ZsZXhpYmxlX2FycmF5X2luX3N0cnVjdCkKK0RJQUdfTkFNRV9JTkRFWChleHRfZmxleGlibGVfYXJyYXlfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWChleHRfZmxleGlibGVfYXJyYXlfdW5pb25fZ251KQorRElBR19OQU1FX0lOREVYKGV4dF9mbGV4aWJsZV9hcnJheV91bmlvbl9tcykKK0RJQUdfTkFNRV9JTkRFWChleHRfZm9sZF9leHByZXNzaW9uKQorRElBR19OQU1FX0lOREVYKGV4dF9mb3JfcmFuZ2UpCitESUFHX05BTUVfSU5ERVgoZXh0X2Zvcl9yYW5nZV9iZWdpbl9lbmRfdHlwZXNfZGlmZmVyKQorRElBR19OQU1FX0lOREVYKGV4dF9mb3J3YXJkX3JlZl9lbnVtKQorRElBR19OQU1FX0lOREVYKGV4dF9mb3J3YXJkX3JlZl9lbnVtX2RlZikKK0RJQUdfTkFNRV9JTkRFWChleHRfZm91bmRfdmlhX2RlcGVuZGVudF9iYXNlc19sb29rdXApCitESUFHX05BTUVfSU5ERVgoZXh0X2ZvdXJfY2hhcl9jaGFyYWN0ZXJfbGl0ZXJhbCkKK0RJQUdfTkFNRV9JTkRFWChleHRfZnJlZXN0YW5kaW5nX2NvbXBsZXgpCitESUFHX05BTUVfSU5ERVgoZXh0X2ZyaWVuZF90YWdfcmVkZWNsX291dHNpZGVfbmFtZXNwYWNlKQorRElBR19OQU1FX0lOREVYKGV4dF9nZW5lcmFsaXplZF9pbml0aWFsaXplcl9saXN0cykKK0RJQUdfTkFNRV9JTkRFWChleHRfZ251X2FkZHJlc3Nfb2ZfbGFiZWwpCitESUFHX05BTUVfSU5ERVgoZXh0X2dudV9hbm9ueW1vdXNfc3RydWN0KQorRElBR19OQU1FX0lOREVYKGV4dF9nbnVfYXJyYXlfcmFuZ2UpCitESUFHX05BTUVfSU5ERVgoZXh0X2dudV9jYXNlX3JhbmdlKQorRElBR19OQU1FX0lOREVYKGV4dF9nbnVfY29uZGl0aW9uYWxfZXhwcikKK0RJQUdfTkFNRV9JTkRFWChleHRfZ251X2VtcHR5X2luaXRpYWxpemVyKQorRElBR19OQU1FX0lOREVYKGV4dF9nbnVfaW5kaXJlY3RfZ290bykKK0RJQUdfTkFNRV9JTkRFWChleHRfZ251X21pc3NpbmdfZXF1YWxfZGVzaWduYXRvcikKK0RJQUdfTkFNRV9JTkRFWChleHRfZ251X29sZF9zdHlsZV9maWVsZF9kZXNpZ25hdG9yKQorRElBR19OQU1FX0lOREVYKGV4dF9nbnVfcHRyX2Z1bmNfYXJpdGgpCitESUFHX05BTUVfSU5ERVgoZXh0X2dudV9zdGF0ZW1lbnRfZXhwcikKK0RJQUdfTkFNRV9JTkRFWChleHRfZ251X3N1YnNjcmlwdF92b2lkX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXh0X2dudV92b2lkX3B0cikKK0RJQUdfTkFNRV9JTkRFWChleHRfZ290b19pbnRvX3Byb3RlY3RlZF9zY29wZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfaGV4X2NvbnN0YW50X2ludmFsaWQpCitESUFHX05BTUVfSU5ERVgoZXh0X2hleF9saXRlcmFsX2ludmFsaWQpCitESUFHX05BTUVfSU5ERVgoZXh0X2lkZW50X2xpc3RfaW5fcGFyYW0pCitESUFHX05BTUVfSU5ERVgoZXh0X2ltYWdpbmFyeV9jb25zdGFudCkKK0RJQUdfTkFNRV9JTkRFWChleHRfaW1wbGljaXRfZXhjZXB0aW9uX3NwZWNfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgoZXh0X2ltcGxpY2l0X2Z1bmN0aW9uX2RlY2wpCitESUFHX05BTUVfSU5ERVgoZXh0X2ltcGxpY2l0X2xpYl9mdW5jdGlvbl9kZWNsKQorRElBR19OQU1FX0lOREVYKGV4dF9pbl9jbGFzc19pbml0aWFsaXplcl9mbG9hdF90eXBlKQorRElBR19OQU1FX0lOREVYKGV4dF9pbl9jbGFzc19pbml0aWFsaXplcl9mbG9hdF90eXBlX2N4eDExKQorRElBR19OQU1FX0lOREVYKGV4dF9pbl9jbGFzc19pbml0aWFsaXplcl9ub25fY29uc3RhbnQpCitESUFHX05BTUVfSU5ERVgoZXh0X2luY29tcGxldGVfaW5fZXhjZXB0aW9uX3NwZWMpCitESUFHX05BTUVfSU5ERVgoZXh0X2luY3JlbWVudF9ib29sKQorRElBR19OQU1FX0lOREVYKGV4dF9pbml0X2NhcHR1cmUpCitESUFHX05BTUVfSU5ERVgoZXh0X2luaXRfbGlzdF9jb25zdGFudF9uYXJyb3dpbmcpCitESUFHX05BTUVfSU5ERVgoZXh0X2luaXRfbGlzdF90eXBlX25hcnJvd2luZykKK0RJQUdfTkFNRV9JTkRFWChleHRfaW5pdF9saXN0X3ZhcmlhYmxlX25hcnJvd2luZykKK0RJQUdfTkFNRV9JTkRFWChleHRfaW5pdF9zdGF0ZW1lbnQpCitESUFHX05BTUVfSU5ERVgoZXh0X2luaXRpYWxpemVyX3N0cmluZ19mb3JfY2hhcl9hcnJheV90b29fbG9uZykKK0RJQUdfTkFNRV9JTkRFWChleHRfaW5saW5lX25hbWVzcGFjZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfaW5saW5lX3ZhcmlhYmxlKQorRElBR19OQU1FX0lOREVYKGV4dF9pbnRlZ2VyX2NvbXBsZW1lbnRfY29tcGxleCkKK0RJQUdfTkFNRV9JTkRFWChleHRfaW50ZWdlcl9jb21wbGV4KQorRElBR19OQU1FX0lOREVYKGV4dF9pbnRlZ2VyX2luY3JlbWVudF9jb21wbGV4KQorRElBR19OQU1FX0lOREVYKGV4dF9pbnRlZ2VyX2xpdGVyYWxfdG9vX2xhcmdlX2Zvcl9zaWduZWQpCitESUFHX05BTUVfSU5ERVgoZXh0X2ludGVybmFsX2luX2V4dGVybl9pbmxpbmUpCitESUFHX05BTUVfSU5ERVgoZXh0X2ludGVybmFsX2luX2V4dGVybl9pbmxpbmVfcXVpZXQpCitESUFHX05BTUVfSU5ERVgoZXh0X2ludmFsaWRfc2lnbl9zcGVjKQorRElBR19OQU1FX0lOREVYKGV4dF9rZXl3b3JkX2FzX2lkZW50KQorRElBR19OQU1FX0lOREVYKGV4dF9saW5lX2NvbW1lbnQpCitESUFHX05BTUVfSU5ERVgoZXh0X21haW5fcmV0dXJuc19ub25pbnQpCitESUFHX05BTUVfSU5ERVgoZXh0X21haW5fdXNlZCkKK0RJQUdfTkFNRV9JTkRFWChleHRfbWFueV9icmFjZXNfYXJvdW5kX3NjYWxhcl9pbml0KQorRElBR19OQU1FX0lOREVYKGV4dF9tZW1iZXJfcmVkZWNsYXJlZCkKK0RJQUdfTkFNRV9JTkRFWChleHRfbWlzbWF0Y2hlZF9leGNlcHRpb25fc3BlYykKK0RJQUdfTkFNRV9JTkRFWChleHRfbWlzbWF0Y2hlZF9leGNlcHRpb25fc3BlY19leHBsaWNpdF9pbnN0YW50aWF0aW9uKQorRElBR19OQU1FX0lOREVYKGV4dF9taXNzaW5nX2RlY2xzcGVjKQorRElBR19OQU1FX0lOREVYKGV4dF9taXNzaW5nX2V4Y2VwdGlvbl9zcGVjaWZpY2F0aW9uKQorRElBR19OQU1FX0lOREVYKGV4dF9taXNzaW5nX3R5cGVfc3BlY2lmaWVyKQorRElBR19OQU1FX0lOREVYKGV4dF9taXNzaW5nX3ZhcmFyZ3NfYXJnKQorRElBR19OQU1FX0lOREVYKGV4dF9taXNzaW5nX3doaXRlc3BhY2VfYWZ0ZXJfbWFjcm9fbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfbWl4ZWRfZGVjbHNfY29kZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfbW9kdWxlX2ltcG9ydF9pbl9leHRlcm5fYykKK0RJQUdfTkFNRV9JTkRFWChleHRfbW9kdWxlX2ltcG9ydF9ub3RfYXRfdG9wX2xldmVsX25vb3ApCitESUFHX05BTUVfSU5ERVgoZXh0X21zX2FtYmlndW91c19kaXJlY3RfYmFzZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfbXNfYW5vbnltb3VzX3JlY29yZCkKK0RJQUdfTkFNRV9JTkRFWChleHRfbXNfY2FzdF9mbl9vYmopCitESUFHX05BTUVfSU5ERVgoZXh0X21zX2RlbGF5ZWRfdGVtcGxhdGVfYXJndW1lbnQpCitESUFHX05BTUVfSU5ERVgoZXh0X21zX2RlcmVmX3RlbXBsYXRlX2FyZ3VtZW50KQorRElBR19OQU1FX0lOREVYKGV4dF9tc19leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsKQorRElBR19OQU1FX0lOREVYKGV4dF9tc19mb3J3YXJkX3JlZl9lbnVtKQorRElBR19OQU1FX0lOREVYKGV4dF9tc19pbXBjYXN0X2ZuX29iaikKK0RJQUdfTkFNRV9JTkRFWChleHRfbXNfbWlzc2luZ19leGNlcHRpb25fc3BlY2lmaWNhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChleHRfbXNfcmVzZXJ2ZWRfdXNlcl9kZWZpbmVkX2xpdGVyYWwpCitESUFHX05BTUVfSU5ERVgoZXh0X21zX3NlYWxlZF9rZXl3b3JkKQorRElBR19OQU1FX0lOREVYKGV4dF9tc190ZW1wbGF0ZV9zcGVjX3JlZGVjbF9vdXRfb2Zfc2NvcGUpCitESUFHX05BTUVfSU5ERVgoZXh0X21zX3RlbXBsYXRlX3R5cGVfYXJnX21pc3NpbmdfdHlwZW5hbWUpCitESUFHX05BTUVfSU5ERVgoZXh0X21zX3VzaW5nX2RlY2xhcmF0aW9uX2luYWNjZXNzaWJsZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfbXVsdGlfbGluZV9saW5lX2NvbW1lbnQpCitESUFHX05BTUVfSU5ERVgoZXh0X211bHRpX3VzaW5nX2RlY2xhcmF0aW9uKQorRElBR19OQU1FX0lOREVYKGV4dF9tdWx0aWNoYXJfY2hhcmFjdGVyX2xpdGVyYWwpCitESUFHX05BTUVfSU5ERVgoZXh0X211dGFibGVfcmVmZXJlbmNlKQorRElBR19OQU1FX0lOREVYKGV4dF9uYW1lZF92YXJpYWRpY19tYWNybykKK0RJQUdfTkFNRV9JTkRFWChleHRfbmVzdGVkX25hbWVfbWVtYmVyX3JlZl9sb29rdXBfYW1iaWd1b3VzKQorRElBR19OQU1FX0lOREVYKGV4dF9uZXN0ZWRfbmFtZV9zcGVjX2lzX2VudW0pCitESUFHX05BTUVfSU5ERVgoZXh0X25lc3RlZF9uYW1lc3BhY2VfZGVmaW5pdGlvbikKK0RJQUdfTkFNRV9JTkRFWChleHRfbmVzdGVkX3BvaW50ZXJfcXVhbGlmaWVyX21pc21hdGNoKQorRElBR19OQU1FX0lOREVYKGV4dF9uZXdfcGFyZW5fYXJyYXlfbm9uY29uc3QpCitESUFHX05BTUVfSU5ERVgoZXh0X25vX2RlY2xhcmF0b3JzKQorRElBR19OQU1FX0lOREVYKGV4dF9ub19uYW1lZF9tZW1iZXJzX2luX3N0cnVjdF91bmlvbikKK0RJQUdfTkFNRV9JTkRFWChleHRfbm9fbmV3bGluZV9lb2YpCitESUFHX05BTUVfSU5ERVgoZXh0X25vbmNsYXNzX3R5cGVfZnJpZW5kKQorRElBR19OQU1FX0lOREVYKGV4dF9ub25zdGFuZGFyZF9lc2NhcGUpCitESUFHX05BTUVfSU5ERVgoZXh0X25vbnN0YXRpY19tZW1iZXJfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWChleHRfbm9yZXR1cm5fbWFpbikKK0RJQUdfTkFNRV9JTkRFWChleHRfbnNfZW51bV9hdHRyaWJ1dGUpCitESUFHX05BTUVfSU5ERVgoZXh0X251bGxhYmlsaXR5KQorRElBR19OQU1FX0lOREVYKGV4dF9vZmZzZXRvZl9ub25fcG9kX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXh0X29mZnNldG9mX25vbl9zdGFuZGFyZGxheW91dF90eXBlKQorRElBR19OQU1FX0lOREVYKGV4dF9vbGRfaW1wbGljaXRseV91bnNpZ25lZF9sb25nX2N4eCkKK0RJQUdfTkFNRV9JTkRFWChleHRfb21wX2xvb3Bfbm90X2Nhbm9uaWNhbF9pbml0KQorRElBR19OQU1FX0lOREVYKGV4dF9vbl9vZmZfc3dpdGNoX3N5bnRheCkKK0RJQUdfTkFNRV9JTkRFWChleHRfb3BlbmNsX2V4dF92ZWN0b3JfdHlwZV9yZ2JhX3NlbGVjdG9yKQorRElBR19OQU1FX0lOREVYKGV4dF9vcGVyYXRvcl9uZXdfZGVsZXRlX2RlY2xhcmVkX2lubGluZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfb3V0X29mX2xpbmVfZGVjbGFyYXRpb24pCitESUFHX05BTUVfSU5ERVgoZXh0X291dF9vZl9saW5lX3F1YWxpZmllZF9pZF90eXBlX25hbWVzX2NvbnN0cnVjdG9yKQorRElBR19OQU1FX0lOREVYKGV4dF9vdmVycmlkZV9jb250cm9sX2tleXdvcmQpCitESUFHX05BTUVfSU5ERVgoZXh0X292ZXJyaWRlX2V4Y2VwdGlvbl9zcGVjKQorRElBR19OQU1FX0lOREVYKGV4dF9wYXJhbV9kZWZhdWx0X2FyZ3VtZW50X3JlZGVmaW5pdGlvbikKK0RJQUdfTkFNRV9JTkRFWChleHRfcGFyYW1fbm90X2RlY2xhcmVkKQorRElBR19OQU1FX0lOREVYKGV4dF9wYXJhbV9wcm9tb3RlZF9ub3RfY29tcGF0aWJsZV93aXRoX3Byb3RvdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfcGFydGlhbF9zcGVjX25vdF9tb3JlX3NwZWNpYWxpemVkX3RoYW5fcHJpbWFyeSkKK0RJQUdfTkFNRV9JTkRFWChleHRfcGFydGlhbF9zcGVjc19ub3RfZGVkdWNpYmxlKQorRElBR19OQU1FX0lOREVYKGV4dF9wYXN0ZV9jb21tYSkKK0RJQUdfTkFNRV9JTkRFWChleHRfcGxhaW5fY29tcGxleCkKK0RJQUdfTkFNRV9JTkRFWChleHRfcG9pbnRlcl90b19jb25zdF9yZWZfbWVtYmVyX29uX3J2YWx1ZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfcHBfYmFkX3Bhc3RlX21zKQorRElBR19OQU1FX0lOREVYKGV4dF9wcF9iYWRfdmFhcmdzX3VzZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfcHBfYmFkX3Zhb3B0X3VzZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfcHBfY29tbWFfZXhwcikKK0RJQUdfTkFNRV9JTkRFWChleHRfcHBfZXh0cmFfdG9rZW5zX2F0X2VvbCkKK0RJQUdfTkFNRV9JTkRFWChleHRfcHBfaWRlbnRfZGlyZWN0aXZlKQorRElBR19OQU1FX0lOREVYKGV4dF9wcF9pbXBvcnRfZGlyZWN0aXZlKQorRElBR19OQU1FX0lOREVYKGV4dF9wcF9pbmNsdWRlX25leHRfZGlyZWN0aXZlKQorRElBR19OQU1FX0lOREVYKGV4dF9wcF9pbmNsdWRlX3NlYXJjaF9tcykKK0RJQUdfTkFNRV9JTkRFWChleHRfcHBfbGluZV90b29fYmlnKQorRElBR19OQU1FX0lOREVYKGV4dF9wcF9saW5lX3plcm8pCitESUFHX05BTUVfSU5ERVgoZXh0X3BwX21hY3JvX3JlZGVmKQorRElBR19OQU1FX0lOREVYKGV4dF9wcF9vcGVyYXRvcl91c2VkX2FzX21hY3JvX25hbWUpCitESUFHX05BTUVfSU5ERVgoZXh0X3BwX3JlZGVmX2J1aWx0aW5fbWFjcm8pCitESUFHX05BTUVfSU5ERVgoZXh0X3BwX3VuZGVmX2J1aWx0aW5fbWFjcm8pCitESUFHX05BTUVfSU5ERVgoZXh0X3BwX3dhcm5pbmdfZGlyZWN0aXZlKQorRElBR19OQU1FX0lOREVYKGV4dF9wcmFnbWFfc3ludGF4X2VvZCkKK0RJQUdfTkFNRV9JTkRFWChleHRfcHJlZGVmX291dHNpZGVfZnVuY3Rpb24pCitESUFHX05BTUVfSU5ERVgoZXh0X3BzZXVkb19kdG9yX29uX3ZvaWQpCitESUFHX05BTUVfSU5ERVgoZXh0X3B1cmVfZnVuY3Rpb25fZGVmaW5pdGlvbikKK0RJQUdfTkFNRV9JTkRFWChleHRfcmVkZWZpbml0aW9uX29mX3R5cGVkZWYpCitESUFHX05BTUVfSU5ERVgoZXh0X3JlZl9xdWFsaWZpZXIpCitESUFHX05BTUVfSU5ERVgoZXh0X3JlZ2lzdGVyX3N0b3JhZ2VfY2xhc3MpCitESUFHX05BTUVfSU5ERVgoZXh0X3Jlc2VydmVkX3VzZXJfZGVmaW5lZF9saXRlcmFsKQorRElBR19OQU1FX0lOREVYKGV4dF9yZXRhaW5lZF9sYW5ndWFnZV9saW5rYWdlKQorRElBR19OQU1FX0lOREVYKGV4dF9yZXR1cm5faGFzX2V4cHIpCitESUFHX05BTUVfSU5ERVgoZXh0X3JldHVybl9oYXNfdm9pZF9leHByKQorRElBR19OQU1FX0lOREVYKGV4dF9yZXR1cm5fbWlzc2luZ19leHByKQorRElBR19OQU1FX0lOREVYKGV4dF9ydmFsdWVfcmVmZXJlbmNlKQorRElBR19OQU1FX0lOREVYKGV4dF9ydmFsdWVfdG9fcmVmZXJlbmNlX2FjY2Vzc19jdG9yKQorRElBR19OQU1FX0lOREVYKGV4dF9ydmFsdWVfdG9fcmVmZXJlbmNlX3RlbXBfY29weV9ub192aWFibGUpCitESUFHX05BTUVfSU5ERVgoZXh0X3Njb3BlZF9lbnVtKQorRElBR19OQU1FX0lOREVYKGV4dF9zaXplb2ZfYWxpZ25vZl9mdW5jdGlvbl90eXBlKQorRElBR19OQU1FX0lOREVYKGV4dF9zaXplb2ZfYWxpZ25vZl92b2lkX3R5cGUpCitESUFHX05BTUVfSU5ERVgoZXh0X3N0YW5kYWxvbmVfc3BlY2lmaWVyKQorRElBR19OQU1FX0lOREVYKGV4dF9zdGFyX3RoaXNfbGFtYmRhX2NhcHR1cmVfY3h4MTcpCitESUFHX05BTUVfSU5ERVgoZXh0X3N0YXRpY19hc3NlcnRfbm9fbWVzc2FnZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfc3RhdGljX2RhdGFfbWVtYmVyX2luX3VuaW9uKQorRElBR19OQU1FX0lOREVYKGV4dF9zdGF0aWNfbm9uX3N0YXRpYykKK0RJQUdfTkFNRV9JTkRFWChleHRfc3RkY19wcmFnbWFfaWdub3JlZCkKK0RJQUdfTkFNRV9JTkRFWChleHRfc3RyaW5nX2xpdGVyYWxfb3BlcmF0b3JfdGVtcGxhdGUpCitESUFHX05BTUVfSU5ERVgoZXh0X3N0cmluZ190b29fbG9uZykKK0RJQUdfTkFNRV9JTkRFWChleHRfc3Vic2NyaXB0X25vbl9sdmFsdWUpCitESUFHX05BTUVfSU5ERVgoZXh0X3RlbXBsYXRlX2FyZ19leHRyYV9wYXJlbnMpCitESUFHX05BTUVfSU5ERVgoZXh0X3RlbXBsYXRlX2FyZ19sb2NhbF90eXBlKQorRElBR19OQU1FX0lOREVYKGV4dF90ZW1wbGF0ZV9hcmdfb2JqZWN0X2ludGVybmFsKQorRElBR19OQU1FX0lOREVYKGV4dF90ZW1wbGF0ZV9hcmdfdW5uYW1lZF90eXBlKQorRElBR19OQU1FX0lOREVYKGV4dF90ZW1wbGF0ZV9vdXRzaWRlX29mX3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKGV4dF90ZW1wbGF0ZV9wYXJhbWV0ZXJfZGVmYXVsdF9pbl9mdW5jdGlvbl90ZW1wbGF0ZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfdGVtcGxhdGVfdGVtcGxhdGVfcGFyYW1fdHlwZW5hbWUpCitESUFHX05BTUVfSU5ERVgoZXh0X3RocmVhZF9iZWZvcmUpCitESUFHX05BTUVfSU5ERVgoZXh0X3Rva2VuX3VzZWQpCitESUFHX05BTUVfSU5ERVgoZXh0X3R5cGVjaGVja19hZGRyb2ZfdGVtcG9yYXJ5KQorRElBR19OQU1FX0lOREVYKGV4dF90eXBlY2hlY2tfYWRkcm9mX3ZvaWQpCitESUFHX05BTUVfSU5ERVgoZXh0X3R5cGVjaGVja19iYXNlX3N1cGVyKQorRElBR19OQU1FX0lOREVYKGV4dF90eXBlY2hlY2tfY2FzdF9ub25zY2FsYXIpCitESUFHX05BTUVfSU5ERVgoZXh0X3R5cGVjaGVja19jYXN0X3RvX3VuaW9uKQorRElBR19OQU1FX0lOREVYKGV4dF90eXBlY2hlY2tfY29tcGFyaXNvbl9vZl9kaXN0aW5jdF9wb2ludGVycykKK0RJQUdfTkFNRV9JTkRFWChleHRfdHlwZWNoZWNrX2NvbXBhcmlzb25fb2ZfZnB0cl90b192b2lkKQorRElBR19OQU1FX0lOREVYKGV4dF90eXBlY2hlY2tfY29tcGFyaXNvbl9vZl9wb2ludGVyX2ludGVnZXIpCitESUFHX05BTUVfSU5ERVgoZXh0X3R5cGVjaGVja19jb25kX2luY29tcGF0aWJsZV9vcGVyYW5kcykKK0RJQUdfTkFNRV9JTkRFWChleHRfdHlwZWNoZWNrX2NvbmRfaW5jb21wYXRpYmxlX3BvaW50ZXJzKQorRElBR19OQU1FX0lOREVYKGV4dF90eXBlY2hlY2tfY29uZF9vbmVfdm9pZCkKK0RJQUdfTkFNRV9JTkRFWChleHRfdHlwZWNoZWNrX2NvbmRfcG9pbnRlcl9pbnRlZ2VyX21pc21hdGNoKQorRElBR19OQU1FX0lOREVYKGV4dF90eXBlY2hlY2tfY29udmVydF9kaXNjYXJkc19xdWFsaWZpZXJzKQorRElBR19OQU1FX0lOREVYKGV4dF90eXBlY2hlY2tfY29udmVydF9pbmNvbXBhdGlibGVfZnVuY3Rpb25fcG9pbnRlcikKK0RJQUdfTkFNRV9JTkRFWChleHRfdHlwZWNoZWNrX2NvbnZlcnRfaW5jb21wYXRpYmxlX3BvaW50ZXIpCitESUFHX05BTUVfSU5ERVgoZXh0X3R5cGVjaGVja19jb252ZXJ0X2luY29tcGF0aWJsZV9wb2ludGVyX3NpZ24pCitESUFHX05BTUVfSU5ERVgoZXh0X3R5cGVjaGVja19jb252ZXJ0X2ludF9wb2ludGVyKQorRElBR19OQU1FX0lOREVYKGV4dF90eXBlY2hlY2tfY29udmVydF9wb2ludGVyX2ludCkKK0RJQUdfTkFNRV9JTkRFWChleHRfdHlwZWNoZWNrX2NvbnZlcnRfcG9pbnRlcl92b2lkX2Z1bmMpCitESUFHX05BTUVfSU5ERVgoZXh0X3R5cGVjaGVja19kZWNsX2luY29tcGxldGVfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfdHlwZWNoZWNrX2luZGlyZWN0aW9uX3Rocm91Z2hfdm9pZF9wb2ludGVyKQorRElBR19OQU1FX0lOREVYKGV4dF90eXBlY2hlY2tfb3JkZXJlZF9jb21wYXJpc29uX29mX2Z1bmN0aW9uX3BvaW50ZXJzKQorRElBR19OQU1FX0lOREVYKGV4dF90eXBlY2hlY2tfb3JkZXJlZF9jb21wYXJpc29uX29mX3BvaW50ZXJfYW5kX3plcm8pCitESUFHX05BTUVfSU5ERVgoZXh0X3R5cGVjaGVja19vcmRlcmVkX2NvbXBhcmlzb25fb2ZfcG9pbnRlcl9pbnRlZ2VyKQorRElBR19OQU1FX0lOREVYKGV4dF90eXBlY2hlY2tfemVyb19hcnJheV9zaXplKQorRElBR19OQU1FX0lOREVYKGV4dF90eXBlZGVmX3dpdGhvdXRfYV9uYW1lKQorRElBR19OQU1FX0lOREVYKGV4dF90eXBlbmFtZV9taXNzaW5nKQorRElBR19OQU1FX0lOREVYKGV4dF90eXBlbmFtZV9vdXRzaWRlX29mX3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKGV4dF91bmRlY2xhcmVkX3VucXVhbF9pZF93aXRoX2RlcGVuZGVudF9iYXNlKQorRElBR19OQU1FX0lOREVYKGV4dF91bmRlZmluZWRfaW50ZXJuYWxfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfdW5lbGFib3JhdGVkX2ZyaWVuZF90eXBlKQorRElBR19OQU1FX0lOREVYKGV4dF91bmljb2RlX3doaXRlc3BhY2UpCitESUFHX05BTUVfSU5ERVgoZXh0X3VuaW9uX21lbWJlcl9vZl9yZWZlcmVuY2VfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChleHRfdW5rbm93bl9lc2NhcGUpCitESUFHX05BTUVfSU5ERVgoZXh0X3VudGVybWluYXRlZF9jaGFyX29yX3N0cmluZykKK0RJQUdfTkFNRV9JTkRFWChleHRfdXNlX291dF9vZl9zY29wZV9kZWNsYXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChleHRfdXNpbmdfYXR0cmlidXRlX25zKQorRElBR19OQU1FX0lOREVYKGV4dF91c2luZ19kZWNsYXJhdGlvbl9wYWNrKQorRElBR19OQU1FX0lOREVYKGV4dF91c2luZ191bmRlZmluZWRfc3RkKQorRElBR19OQU1FX0lOREVYKGV4dF92YXJpYWJsZV9zaXplZF90eXBlX2luX3N0cnVjdCkKK0RJQUdfTkFNRV9JTkRFWChleHRfdmFyaWFibGVfdGVtcGxhdGUpCitESUFHX05BTUVfSU5ERVgoZXh0X3ZhcmlhZGljX21hY3JvKQorRElBR19OQU1FX0lOREVYKGV4dF92YXJpYWRpY19tYWluKQorRElBR19OQU1FX0lOREVYKGV4dF92YXJpYWRpY190ZW1wbGF0ZXMpCitESUFHX05BTUVfSU5ERVgoZXh0X3ZsYSkKK0RJQUdfTkFNRV9JTkRFWChleHRfdmxhX2ZvbGRlZF90b19jb25zdGFudCkKK0RJQUdfTkFNRV9JTkRFWChleHRfd2Fybl9nbnVfZmluYWwpCitESUFHX05BTUVfSU5ERVgoZmF0YWxfdG9vX21hbnlfZXJyb3JzKQorRElBR19OQU1FX0lOREVYKG5vdGVfYWNjZXNzX2NvbnN0cmFpbmVkX2J5X3BhdGgpCitESUFHX05BTUVfSU5ERVgobm90ZV9hY2Nlc3NfbmF0dXJhbCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FjY2Vzc19wcm90ZWN0ZWRfcmVzdHJpY3RlZF9jdG9yZHRvcikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FjY2Vzc19wcm90ZWN0ZWRfcmVzdHJpY3RlZF9ub29iamVjdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FjY2Vzc19wcm90ZWN0ZWRfcmVzdHJpY3RlZF9vYmplY3QpCitESUFHX05BTUVfSU5ERVgobm90ZV9hZGRfZGVwcmVjYXRpb25fYXR0cikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FkZF9zeW50aGVzaXplX2RpcmVjdGl2ZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FkZGl0aW9uYWxfcGFyZW5zX2Zvcl92YXJpYWJsZV9kZWNsYXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FkZHJvZl9vdmxfY2FuZGlkYXRlX2Rpc2FibGVkX2J5X2VuYWJsZV9pZl9hdHRyKQorRElBR19OQU1FX0lOREVYKG5vdGVfYWxpZ25hc19vbl9kZWNsYXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FsbG9jYXRlZF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfYWxzb19mb3VuZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FtYmlnX21lbWJlcl9yZWZfb2JqZWN0X3R5cGUpCitESUFHX05BTUVfSU5ERVgobm90ZV9hbWJpZ19tZW1iZXJfcmVmX3Njb3BlKQorRElBR19OQU1FX0lOREVYKG5vdGVfYW1iaWd1b3VzX2NhbmRpZGF0ZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FtYmlndW91c19pbmhlcml0ZWRfY29uc3RydWN0b3JfdXNpbmcpCitESUFHX05BTUVfSU5ERVgobm90ZV9hbWJpZ3VvdXNfbWVtYmVyX2ZvdW5kKQorRElBR19OQU1FX0lOREVYKG5vdGVfYW1iaWd1b3VzX3R5cGVfY29udmVyc2lvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FyY19icmlkZ2UpCitESUFHX05BTUVfSU5ERVgobm90ZV9hcmNfYnJpZGdlX3JldGFpbmVkKQorRElBR19OQU1FX0lOREVYKG5vdGVfYXJjX2JyaWRnZV90cmFuc2ZlcikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FyY19jc3R5bGVfYnJpZGdlKQorRElBR19OQU1FX0lOREVYKG5vdGVfYXJjX2NzdHlsZV9icmlkZ2VfcmV0YWluZWQpCitESUFHX05BTUVfSU5ERVgobm90ZV9hcmNfY3N0eWxlX2JyaWRnZV90cmFuc2ZlcikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FyY19maWVsZF93aXRoX293bmVyc2hpcCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FyY19mb3JiaWRkZW5fdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FyY19nYWluZWRfbWV0aG9kX2NvbnZlbnRpb24pCitESUFHX05BTUVfSU5ERVgobm90ZV9hcmNfaW5pdF9yZXR1cm5zX3VucmVsYXRlZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FyY19sb3N0X21ldGhvZF9jb252ZW50aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfYXJjX3JldGFpbl9jeWNsZV9vd25lcikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FyY193ZWFrX2Fsc29fYWNjZXNzZWRfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FyY193ZWFrX2Rpc2FibGVkKQorRElBR19OQU1FX0lOREVYKG5vdGVfYXJjX3dlYWtfbm9fcnVudGltZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2FycmF5X2luZGV4X291dF9vZl9ib3VuZHMpCitESUFHX05BTUVfSU5ERVgobm90ZV9hcnJheV9zaXplX2NvbnZlcnNpb24pCitESUFHX05BTUVfSU5ERVgobm90ZV9hc21faW5wdXRfZHVwbGljYXRlX2ZpcnN0KQorRElBR19OQU1FX0lOREVYKG5vdGVfYXNtX21pc3NpbmdfY29uc3RyYWludF9tb2RpZmllcikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2Fzc2lnbl9saHNfaW5jb21wbGV0ZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2F0b21pY19wcm9wZXJ0eV9maXh1cF9zdWdnZXN0KQorRElBR19OQU1FX0lOREVYKG5vdGVfYXR0cmlidXRlKQorRElBR19OQU1FX0lOREVYKG5vdGVfYXR0cmlidXRlX292ZXJsb2FkYWJsZV9wcmV2X292ZXJsb2FkKQorRElBR19OQU1FX0lOREVYKG5vdGVfYXV0b19yZWFkb25seV9pYm91dGxldF9maXh1cF9zdWdnZXN0KQorRElBR19OQU1FX0lOREVYKG5vdGVfYXZhaWxhYmlsaXR5X3NwZWNpZmllZF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfYXdhaXRfcmVhZHlfbm9fYm9vbF9jb252ZXJzaW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfYmFkX21lbWFjY2Vzc19zaWxlbmNlKQorRElBR19OQU1FX0lOREVYKG5vdGVfYmFzZV9jbGFzc19zcGVjaWZpZWRfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2JpdGZpZWxkX2RlY2wpCitESUFHX05BTUVfSU5ERVgobm90ZV9ibG9ja192YXJfZml4aXRfYWRkX2luaXRpYWxpemF0aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfYnJhY2tldF9kZXB0aCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NhbGxlZF9ieSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NhbGxlZV9kZWNsKQorRElBR19OQU1FX0lOREVYKG5vdGVfY2FsbGVlX3N0YXRpY19hcnJheSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NhcnJpZXNfZGVwZW5kZW5jeV9taXNzaW5nX2ZpcnN0X2RlY2wpCitESUFHX05BTUVfSU5ERVgobm90ZV9jYXN0X3RvX3ZvaWQpCitESUFHX05BTUVfSU5ERVgobm90ZV9jaGFuZ2VfYml0ZmllbGRfc2lnbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NoYW5nZV9jYWxsaW5nX2NvbnZfZml4aXQpCitESUFHX05BTUVfSU5ERVgobm90ZV9jbGFzc19kZWNsYXJlZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvY29hX25hbWluZ19kZWNsYXJlX2ZhbWlseSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbGxhcHNlX2xvb3BfY291bnQpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb21wYXRfYXNzb2MpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25kaXRpb25fYXNzaWduX3NpbGVuY2UpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25kaXRpb25fYXNzaWduX3RvX2NvbXBhcmlzb24pCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25kaXRpb25fb3JfYXNzaWduX3RvX2NvbXBhcmlzb24pCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25mbGljdGluZ19hdHRyaWJ1dGUpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25mbGljdGluZ190cnlfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9hY2Nlc3NfaW5hY3RpdmVfdW5pb25fbWVtYmVyKQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX2FjY2Vzc19udWxsKQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX2FjY2Vzc19wYXN0X2VuZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9hY2Nlc3Nfc3RhdGljX3RlbXBvcmFyeSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9hY2Nlc3NfdW5pbml0KQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX2FjY2Vzc191bnNpemVkX2FycmF5KQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX2FjY2Vzc192b2xhdGlsZV9vYmopCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfYWNjZXNzX3ZvbGF0aWxlX3R5cGUpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfYXJyYXlfaW5kZXgpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfYmFhX2luc3VmZmljaWVudF9hbGlnbm1lbnQpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfYmFhX3ZhbHVlX2luc3VmZmljaWVudF9hbGlnbm1lbnQpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfYm9keV9wcmV2aW91c19yZXR1cm4pCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfY2FsbF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX2NhbGxfbGltaXRfZXhjZWVkZWQpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfY2FsbHNfc3VwcHJlc3NlZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9jb21wYXJlX3ZpcnR1YWxfbWVtX3B0cikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9jb25kaXRpb25hbF9uZXZlcl9jb25zdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9jdG9yX21pc3NpbmdfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9kZXB0aF9saW1pdF9leGNlZWRlZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9mbG9hdF9hcml0aG1ldGljKQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX2luaGVyaXRlZF9jdG9yX2NhbGxfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9pbnZhbGlkX2Nhc3QpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfaW52YWxpZF9kb3duY2FzdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9pbnZhbGlkX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX2ludmFsaWRfaW5oY3RvcikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9sYXJnZV9zaGlmdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9saWZldGltZV9lbmRlZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9sc2hpZnRfZGlzY2FyZHMpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfbHNoaWZ0X29mX25lZ2F0aXZlKQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX2x0b3JfbXV0YWJsZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9sdG9yX25vbl9jb25zdF9pbnQpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfbHRvcl9ub25fY29uc3RleHByKQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX21vZGlmeV9jb25zdF90eXBlKQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX21vZGlmeV9nbG9iYWwpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfbmVnYXRpdmVfc2hpZnQpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfbm9fcmV0dXJuKQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX25vbl9nbG9iYWwpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfbm9ubGl0ZXJhbCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9udWxsX3N1Ym9iamVjdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9vdmVyZmxvdykKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9wYXN0X2VuZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9wYXN0X2VuZF9zdWJvYmplY3QpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfcG9pbnRlcl9jb21wYXJpc29uX2Jhc2VfY2xhc3NlcykKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9wb2ludGVyX2NvbXBhcmlzb25fYmFzZV9maWVsZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9wb2ludGVyX2NvbXBhcmlzb25fZGlmZmVyaW5nX2FjY2VzcykKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl9wb2ludGVyX3N1YnRyYWN0aW9uX25vdF9zYW1lX2FycmF5KQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX3BvaW50ZXJfc3VidHJhY3Rpb25femVyb19zaXplKQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX3N0ZXBfbGltaXRfZXhjZWVkZWQpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfc3RtdF9leHByX3Vuc3VwcG9ydGVkKQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX3RlbXBvcmFyeV9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX3RoaXMpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfdHlwZWlkX3BvbHltb3JwaGljKQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX3VuaW5pdGlhbGl6ZWQpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfdW5zaXplZF9hcnJheV9pbmRleGVkKQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX3Vuc3VwcG9ydGVkX3Vuc2l6ZWRfYXJyYXkpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfdXNlX3VuaW5pdF9yZWZlcmVuY2UpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfdmFyX2luaXRfbm9uX2NvbnN0YW50KQorRElBR19OQU1FX0lOREVYKG5vdGVfY29uc3RleHByX3ZpcnR1YWxfYmFzZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl92aXJ0dWFsX2Jhc2VfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnN0ZXhwcl92aXJ0dWFsX2NhbGwpCitESUFHX05BTUVfSU5ERVgobm90ZV9jb25zdGV4cHJfdm9pZF9jb21wYXJpc29uKQorRElBR19OQU1FX0lOREVYKG5vdGVfY29udl9mdW5jdGlvbl9kZWNsYXJlZF9hdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2NvbnZlcnRfaW5saW5lX3RvX3N0YXRpYykKK0RJQUdfTkFNRV9JTkRFWChub3RlX2Nvcm91dGluZV9wcm9taXNlX2NhbGxfaW1wbGljaXRseV9yZXF1aXJlZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2Nvcm91dGluZV9wcm9taXNlX2ltcGxpY2l0X2F3YWl0X3RyYW5zZm9ybV9yZXF1aXJlZF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfY29yb3V0aW5lX3Byb21pc2Vfc3VzcGVuZF9pbXBsaWNpdGx5X3JlcXVpcmVkKQorRElBR19OQU1FX0lOREVYKG5vdGVfY292YXJpYW50X3RodW5rKQorRElBR19OQU1FX0lOREVYKG5vdGVfY3VkYV9jb25mbGljdGluZ19kZXZpY2VfZnVuY3Rpb25fZGVjbGFyZWRfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2N1ZGFfb3ZsX2NhbmRpZGF0ZV90YXJnZXRfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgobm90ZV9kZWNsX2hpZGluZ190YWdfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2RlY2xfdW5ndWFyZGVkX2F2YWlsYWJpbGl0eV9zaWxlbmNlKQorRElBR19OQU1FX0lOREVYKG5vdGVfZGVjbGFyYXRpb25fbm90X2FfcHJvdG90eXBlKQorRElBR19OQU1FX0lOREVYKG5vdGVfZGVjbGFyZV9wYXJhbWV0ZXJfYXV0b3JlbGVhc2luZykKK0RJQUdfTkFNRV9JTkRFWChub3RlX2RlY2xhcmVfcGFyYW1ldGVyX3N0cm9uZykKK0RJQUdfTkFNRV9JTkRFWChub3RlX2RlY2xhcmVkX2F0KQorRElBR19OQU1FX0lOREVYKG5vdGVfZGVjbGFyZWRfY29yb3V0aW5lX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9kZWNsYXJlZF9ub25udWxsKQorRElBR19OQU1FX0lOREVYKG5vdGVfZGVjbGFyZWRfcmVxdWlyZWRfY29uc3RhbnRfaW5pdF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfZGVkdWNlZF90ZW1wbGF0ZV9hcmdfc3Vic3RpdHV0aW9uX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9kZWZhdWx0X2FyZ19pbnN0YW50aWF0aW9uX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9kZWZhdWx0X2FyZ3VtZW50X2RlY2xhcmVkX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9kZWZhdWx0X2Z1bmN0aW9uX2FyZ19pbnN0YW50aWF0aW9uX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9kZWZpbmVkX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9kZWxldGVfY29udmVyc2lvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2RlbGV0ZV9ub25fdmlydHVhbCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2RlbGV0ZWRfYXNzaWduX2ZpZWxkKQorRElBR19OQU1FX0lOREVYKG5vdGVfZGVsZXRlZF9jb3B5X2N0b3JfcnZhbHVlX3JlZmVyZW5jZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2RlbGV0ZWRfY29weV91c2VyX2RlY2xhcmVkX21vdmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9kZWxldGVkX2RlZmF1bHRfY3Rvcl9hbGxfY29uc3QpCitESUFHX05BTUVfSU5ERVgobm90ZV9kZWxldGVkX2RlZmF1bHRfY3Rvcl91bmluaXRfZmllbGQpCitESUFHX05BTUVfSU5ERVgobm90ZV9kZWxldGVkX2R0b3Jfbm9fb3BlcmF0b3JfZGVsZXRlKQorRElBR19OQU1FX0lOREVYKG5vdGVfZGVsZXRlZF9zcGVjaWFsX21lbWJlcl9jbGFzc19zdWJvYmplY3QpCitESUFHX05BTUVfSU5ERVgobm90ZV9kZXBlbmRlbnRfbm9uX3R5cGVfZGVmYXVsdF9hcmdfaW5fcGFydGlhbF9zcGVjKQorRElBR19OQU1FX0lOREVYKG5vdGVfZGVwZW5kZW50X3Zhcl91c2UpCitESUFHX05BTUVfSU5ERVgobm90ZV9kZXN0cnVjdG9yX3R5cGVfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2RvY19ibG9ja19jb21tYW5kX3ByZXZpb3VzKQorRElBR19OQU1FX0lOREVYKG5vdGVfZG9jX2Jsb2NrX2NvbW1hbmRfcHJldmlvdXNfYWxpYXMpCitESUFHX05BTUVfSU5ERVgobm90ZV9kb2NfaHRtbF9lbmRfdGFnKQorRElBR19OQU1FX0lOREVYKG5vdGVfZG9jX2h0bWxfdGFnX3N0YXJ0ZWRfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2RvY19wYXJhbV9uYW1lX3N1Z2dlc3Rpb24pCitESUFHX05BTUVfSU5ERVgobm90ZV9kb2NfcGFyYW1fcHJldmlvdXMpCitESUFHX05BTUVfSU5ERVgobm90ZV9kb2NfdHBhcmFtX25hbWVfc3VnZ2VzdGlvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2RvY190cGFyYW1fcHJldmlvdXMpCitESUFHX05BTUVfSU5ERVgobm90ZV9kcnZfYWRkcmVzc19zYW5pdGl6ZXJfZGVidWdfcnVudGltZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2Rydl9jb21tYW5kX2ZhaWxlZF9kaWFnX21zZykKK0RJQUdfTkFNRV9JTkRFWChub3RlX2Rydl9jb25maWdfZmlsZV9zZWFyY2hlZF9pbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2Rydl90X29wdGlvbl9pc19nbG9iYWwpCitESUFHX05BTUVfSU5ERVgobm90ZV9kcnZfdXNlX3N0YW5kYXJkKQorRElBR19OQU1FX0lOREVYKG5vdGVfZHJ2X3ZlcmlmeV9wcmVmaXhfc3BlbGxpbmcpCitESUFHX05BTUVfSU5ERVgobm90ZV9kdWVfdG9fZGxsZXhwb3J0ZWRfY2xhc3MpCitESUFHX05BTUVfSU5ERVgobm90ZV9kdXBsaWNhdGVfY2FzZV9wcmV2KQorRElBR19OQU1FX0lOREVYKG5vdGVfZHVwbGljYXRlX2VsZW1lbnQpCitESUFHX05BTUVfSU5ERVgobm90ZV9lbXB0eV9ib2R5X29uX3NlcGFyYXRlX2xpbmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9lbXB0eV9wYXJlbnNfZGVmYXVsdF9jdG9yKQorRElBR19OQU1FX0lOREVYKG5vdGVfZW1wdHlfcGFyZW5zX2Z1bmN0aW9uX2NhbGwpCitESUFHX05BTUVfSU5ERVgobm90ZV9lbXB0eV9wYXJlbnNfemVyb19pbml0aWFsaXplKQorRElBR19OQU1FX0lOREVYKG5vdGVfZW50ZXJzX2Jsb2NrX2NhcHR1cmVzX2N4eF9vYmopCitESUFHX05BTUVfSU5ERVgobm90ZV9lbnRlcnNfYmxvY2tfY2FwdHVyZXNfbm9uX3RyaXZpYWxfY19zdHJ1Y3QpCitESUFHX05BTUVfSU5ERVgobm90ZV9lbnRlcnNfYmxvY2tfY2FwdHVyZXNfc3Ryb25nKQorRElBR19OQU1FX0lOREVYKG5vdGVfZW50ZXJzX2Jsb2NrX2NhcHR1cmVzX3dlYWspCitESUFHX05BTUVfSU5ERVgobm90ZV9lbnRpdHlfZGVjbGFyZWRfYXQpCitESUFHX05BTUVfSU5ERVgobm90ZV9lbnVtX3NwZWNpYWxpemVkX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9lcXVhbGl0eV9jb21wYXJpc29uX3NpbGVuY2UpCitESUFHX05BTUVfSU5ERVgobm90ZV9lcXVhbGl0eV9jb21wYXJpc29uX3RvX2Fzc2lnbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2VxdWl2YWxlbnRfaW50ZXJuYWxfbGlua2FnZV9kZWNsKQorRElBR19OQU1FX0lOREVYKG5vdGVfZXZhbHVhdGVfY29tcGFyaXNvbl9maXJzdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2V4Y2VwdGlvbl9zcGVjX2RlcHJlY2F0ZWQpCitESUFHX05BTUVfSU5ERVgobm90ZV9leGl0c19fX2Jsb2NrKQorRElBR19OQU1FX0lOREVYKG5vdGVfZXhpdHNfYmxvY2tfY2FwdHVyZXNfY3h4X29iaikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2V4aXRzX2Jsb2NrX2NhcHR1cmVzX25vbl90cml2aWFsX2Nfc3RydWN0KQorRElBR19OQU1FX0lOREVYKG5vdGVfZXhpdHNfYmxvY2tfY2FwdHVyZXNfc3Ryb25nKQorRElBR19OQU1FX0lOREVYKG5vdGVfZXhpdHNfYmxvY2tfY2FwdHVyZXNfd2VhaykKK0RJQUdfTkFNRV9JTkRFWChub3RlX2V4aXRzX2NsZWFudXApCitESUFHX05BTUVfSU5ERVgobm90ZV9leGl0c19jeHhfY2F0Y2gpCitESUFHX05BTUVfSU5ERVgobm90ZV9leGl0c19jeHhfdHJ5KQorRElBR19OQU1FX0lOREVYKG5vdGVfZXhpdHNfZHRvcikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2V4aXRzX29iamNfYXV0b3JlbGVhc2Vwb29sKQorRElBR19OQU1FX0lOREVYKG5vdGVfZXhpdHNfb2JqY19jYXRjaCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2V4aXRzX29iamNfZmluYWxseSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2V4aXRzX29iamNfc3Ryb25nKQorRElBR19OQU1FX0lOREVYKG5vdGVfZXhpdHNfb2JqY19zeW5jaHJvbml6ZWQpCitESUFHX05BTUVfSU5ERVgobm90ZV9leGl0c19vYmpjX3RyeSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2V4aXRzX29iamNfd2VhaykKK0RJQUdfTkFNRV9JTkRFWChub3RlX2V4aXRzX3NlaF9leGNlcHQpCitESUFHX05BTUVfSU5ERVgobm90ZV9leGl0c19zZWhfZmluYWxseSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2V4aXRzX3NlaF90cnkpCitESUFHX05BTUVfSU5ERVgobm90ZV9leGl0c190ZW1wb3JhcnlfZHRvcikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2V4cGxpY2l0X2N0b3JfZGVkdWN0aW9uX2d1aWRlX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9leHBsaWNpdF9pbnN0YW50aWF0aW9uX2NhbmRpZGF0ZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2V4cGxpY2l0X2luc3RhbnRpYXRpb25fZGVmaW5pdGlvbl9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfZXhwbGljaXRfaW5zdGFudGlhdGlvbl9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfZXhwbGljaXRfc3BlY2lhbGl6YXRpb25fZGVjbGFyZWRfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2V4cGxpY2l0X3RlbXBsYXRlX2FyZ19zdWJzdGl0dXRpb25faGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2V4cGxpY2l0X3RlbXBsYXRlX3NwZWNfZG9lc19ub3RfbmVlZF9oZWFkZXIpCitESUFHX05BTUVfSU5ERVgobm90ZV9leHByX2RpdmlkZV9ieV96ZXJvKQorRElBR19OQU1FX0lOREVYKG5vdGVfZXh0ZXJuX2NfYmVnaW5zX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9leHRlcm5fY19nbG9iYWxfY29uZmxpY3QpCitESUFHX05BTUVfSU5ERVgobm90ZV9leHRyYV9jb21tYV9tZXNzYWdlX2FyZykKK0RJQUdfTkFNRV9JTkRFWChub3RlX2ZhbGx0aHJvdWdoX2luc2VydF9zZW1pX2ZpeGl0KQorRElBR19OQU1FX0lOREVYKG5vdGVfZmVfYmFja2VuZF9mcmFtZV9sYXJnZXJfdGhhbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2ZlX2JhY2tlbmRfaW52YWxpZF9sb2MpCitESUFHX05BTUVfSU5ERVgobm90ZV9mZV9iYWNrZW5kX3BsdWdpbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2ZlX2lubGluZV9hc20pCitESUFHX05BTUVfSU5ERVgobm90ZV9mZV9pbmxpbmVfYXNtX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9maWVsZF9kZXNpZ25hdG9yX2ZvdW5kKQorRElBR19OQU1FX0lOREVYKG5vdGVfZmluYWxfb3ZlcnJpZGVyKQorRElBR19OQU1FX0lOREVYKG5vdGVfZmlyc3RfbW9kdWxlX2RpZmZlcmVuY2UpCitESUFHX05BTUVfSU5ERVgobm90ZV9maXhpdF9hcHBsaWVkKQorRElBR19OQU1FX0lOREVYKG5vdGVfZml4aXRfZmFpbGVkKQorRElBR19OQU1FX0lOREVYKG5vdGVfZml4aXRfaW5fbWFjcm8pCitESUFHX05BTUVfSU5ERVgobm90ZV9maXhpdF91bmZpeGVkX2Vycm9yKQorRElBR19OQU1FX0lOREVYKG5vdGVfZmxleGlibGVfYXJyYXlfbWVtYmVyKQorRElBR19OQU1FX0lOREVYKG5vdGVfZm9yX3JhbmdlX2JlZ2luX2VuZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2Zvcl9yYW5nZV9pbnZhbGlkX2l0ZXJhdG9yKQorRElBR19OQU1FX0lOREVYKG5vdGVfZm9yY2VfZW1wdHlfc2VsZWN0b3JfbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2Zvcm1hdF9maXhfc3BlY2lmaWVyKQorRElBR19OQU1FX0lOREVYKG5vdGVfZm9ybWF0X3NlY3VyaXR5X2ZpeGl0KQorRElBR19OQU1FX0lOREVYKG5vdGVfZm9ybWF0X3N0cmluZ19kZWZpbmVkKQorRElBR19OQU1FX0lOREVYKG5vdGVfZm9yd2FyZF9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChub3RlX2ZvcndhcmRfZGVjbGFyYXRpb24pCitESUFHX05BTUVfSU5ERVgobm90ZV9mb3J3YXJkX3RlbXBsYXRlX2RlY2wpCitESUFHX05BTUVfSU5ERVgobm90ZV9mb3VuZF9tdXRleF9uZWFyX21hdGNoKQorRElBR19OQU1FX0lOREVYKG5vdGVfZnJvbV9kaWFnbm9zZV9pZikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2Z1bmN0aW9uX3N0eWxlX2Nhc3RfYWRkX3BhcmVudGhlc2VzKQorRElBR19OQU1FX0lOREVYKG5vdGVfZnVuY3Rpb25fc3VnZ2VzdGlvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2Z1bmN0aW9uX3RlbXBsYXRlX2RlZHVjdGlvbl9pbnN0YW50aWF0aW9uX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9mdW5jdGlvbl90ZW1wbGF0ZV9zcGVjX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9mdW5jdGlvbl90ZW1wbGF0ZV9zcGVjX21hdGNoZWQpCitESUFHX05BTUVfSU5ERVgobm90ZV9mdW5jdGlvbl90b19mdW5jdGlvbl9jYWxsKQorRElBR19OQU1FX0lOREVYKG5vdGVfZnVuY3Rpb25fd2FybmluZ19zaWxlbmNlKQorRElBR19OQU1FX0lOREVYKG5vdGVfZ2V0dGVyX3VuYXZhaWxhYmxlKQorRElBR19OQU1FX0lOREVYKG5vdGVfZ290b19tc19hc21fbGFiZWwpCitESUFHX05BTUVfSU5ERVgobm90ZV9ndWFyZGVkX2J5X2RlY2xhcmVkX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9oZWFkZXJfZ3VhcmQpCitESUFHX05BTUVfSU5ERVgobm90ZV9oaWRkZW5fb3ZlcmxvYWRlZF92aXJ0dWFsX2RlY2xhcmVkX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9oaWRkZW5fdGFnKQorRElBR19OQU1FX0lOREVYKG5vdGVfaGlkaW5nX29iamVjdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2ljZV9jb252ZXJzaW9uX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9pbGxlZ2FsX2ZpZWxkX2RlY2xhcmVkX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9pbXBsZW1lbnRhdGlvbl9kZWNsYXJlZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2ltcGxlbWVudGVkX2J5X2NsYXNzKQorRElBR19OQU1FX0lOREVYKG5vdGVfaW1wbGljaXRfZGVsZXRlX3RoaXNfaW5fZGVzdHJ1Y3Rvcl9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfaW1wbGljaXRfbWVtYmVyX3RhcmdldF9pbmZlcl9jb2xsaXNpb24pCitESUFHX05BTUVfSU5ERVgobm90ZV9pbXBsaWNpdF9wYXJhbV9kZWNsKQorRElBR19OQU1FX0lOREVYKG5vdGVfaW1wbGljaXRfdG9wX2xldmVsX21vZHVsZV9pbXBvcnRfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2ltcGxpY2l0bHlfZGVsZXRlZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2ltcG9ydGVkX2J5X3BjaF9tb2R1bGVfbm90X2ZvdW5kKQorRElBR19OQU1FX0lOREVYKG5vdGVfaW5fYmluZGluZ19kZWNsX2luaXQpCitESUFHX05BTUVfSU5ERVgobm90ZV9pbl9jbGFzc19pbml0aWFsaXplcl9mbG9hdF90eXBlX2N4eDExKQorRElBR19OQU1FX0lOREVYKG5vdGVfaW5fY2xhc3NfaW5pdGlhbGl6ZXJfbm90X3lldF9wYXJzZWQpCitESUFHX05BTUVfSU5ERVgobm90ZV9pbl9kZWNsYXJhdGlvbl9vZl9pbXBsaWNpdF9zcGVjaWFsX21lbWJlcikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2luX2Zvcl9yYW5nZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2luX29taXR0ZWRfYWdncmVnYXRlX2luaXRpYWxpemVyKQorRElBR19OQU1FX0lOREVYKG5vdGVfaW5fcmVmZXJlbmNlX3RlbXBvcmFyeV9saXN0X2luaXRpYWxpemVyKQorRElBR19OQU1FX0lOREVYKG5vdGVfaW5jbHVkZV9oZWFkZXJfb3JfZGVjbGFyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2luY29tcGF0aWJsZV9hbmFseXplcl9wbHVnaW5fYXBpKQorRElBR19OQU1FX0lOREVYKG5vdGVfaW5jb21wbGV0ZV9jbGFzc19hbmRfcXVhbGlmaWVkX2lkKQorRElBR19OQU1FX0lOREVYKG5vdGVfaW5kaXJlY3RfZ290b190YXJnZXQpCitESUFHX05BTUVfSU5ERVgobm90ZV9pbmRpcmVjdGlvbl90aHJvdWdoX251bGwpCitESUFHX05BTUVfSU5ERVgobm90ZV9pbmVxdWFsaXR5X2NvbXBhcmlzb25fdG9fb3JfYXNzaWduKQorRElBR19OQU1FX0lOREVYKG5vdGVfaW5pdF9saXN0X2F0X2JlZ2lubmluZ19vZl9tYWNyb19hcmd1bWVudCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2luaXRfbGlzdF9uYXJyb3dpbmdfc2lsZW5jZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2luc2VydF9icmVha19maXhpdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2luc2VydF9mYWxsdGhyb3VnaF9maXhpdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2luc3RfZGVjbGFyYXRpb25faGludCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2luc3RhbnRpYXRpb25fY29udGV4dHNfc3VwcHJlc3NlZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2luc3RhbnRpYXRpb25fcmVxdWlyZWRfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2ludmFsaWRfc3ViZXhwcl9pbl9jb25zdF9leHByKQorRElBR19OQU1FX0lOREVYKG5vdGVfaXRfZGVsZWdhdGVzX3RvKQorRElBR19OQU1FX0lOREVYKG5vdGVfaXZhcl9kZWNsKQorRElBR19OQU1FX0lOREVYKG5vdGVfbGFtYmRhX2RlY2wpCitESUFHX05BTUVfSU5ERVgobm90ZV9sYW1iZGFfdG9fYmxvY2tfY29udikKK0RJQUdfTkFNRV9JTkRFWChub3RlX2xvY2FsX2RlY2xfY2xvc2VfbWF0Y2gpCitESUFHX05BTUVfSU5ERVgobm90ZV9sb2NhbF9kZWNsX2Nsb3NlX3BhcmFtX21hdGNoKQorRElBR19OQU1FX0lOREVYKG5vdGVfbG9ja19leGNsdXNpdmVfYW5kX3NoYXJlZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX2xvY2tlZF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfbG9naWNhbF9pbnN0ZWFkX29mX2JpdHdpc2VfY2hhbmdlX29wZXJhdG9yKQorRElBR19OQU1FX0lOREVYKG5vdGVfbG9naWNhbF9pbnN0ZWFkX29mX2JpdHdpc2VfcmVtb3ZlX2NvbnN0YW50KQorRElBR19OQU1FX0lOREVYKG5vdGVfbG9naWNhbF9ub3RfZml4KQorRElBR19OQU1FX0lOREVYKG5vdGVfbG9naWNhbF9ub3Rfc2lsZW5jZV93aXRoX3BhcmVucykKK0RJQUdfTkFNRV9JTkRFWChub3RlX2xvb3BfaXRlcmF0aW9uX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9tYWNyb19oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfbWFpbl9jaGFuZ2VfcmV0dXJuX3R5cGUpCitESUFHX05BTUVfSU5ERVgobm90ZV9tYWluX3JlbW92ZV9ub3JldHVybikKK0RJQUdfTkFNRV9JTkRFWChub3RlX21hdGNoaW5nKQorRElBR19OQU1FX0lOREVYKG5vdGVfbWVhbnRfdG9fdXNlX3R5cGVuYW1lKQorRElBR19OQU1FX0lOREVYKG5vdGVfbWVtYmVyX2RlY2xhcmVkX2F0KQorRElBR19OQU1FX0lOREVYKG5vdGVfbWVtYmVyX2RlY2xhcmVkX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9tZW1iZXJfZGVmX2Nsb3NlX2NvbnN0X21hdGNoKQorRElBR19OQU1FX0lOREVYKG5vdGVfbWVtYmVyX2RlZl9jbG9zZV9tYXRjaCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX21lbWJlcl9kZWZfY2xvc2VfcGFyYW1fbWF0Y2gpCitESUFHX05BTUVfSU5ERVgobm90ZV9tZW1iZXJfZmlyc3RfZGVjbGFyZWRfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX21lbWJlcl9yZWZlcmVuY2VfYXJyb3dfZnJvbV9vcGVyYXRvcl9hcnJvdykKK0RJQUdfTkFNRV9JTkRFWChub3RlX21lbWJlcl9zeW50aGVzaXplZF9hdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX21lbXNpemVfY29tcGFyaXNvbl9jYXN0X3NpbGVuY2UpCitESUFHX05BTUVfSU5ERVgobm90ZV9tZW1zaXplX2NvbXBhcmlzb25fcGFyZW4pCitESUFHX05BTUVfSU5ERVgobm90ZV9tZXRob2RfZGVjbGFyZWRfYXQpCitESUFHX05BTUVfSU5ERVgobm90ZV9tZXRob2RfcmV0dXJuX3R5cGVfY2hhbmdlKQorRElBR19OQU1FX0lOREVYKG5vdGVfbWV0aG9kX3NlbnRfZm9yd2FyZF9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChub3RlX21pc3BsYWNlZF9lbGxpcHNpc192YXJhcmdfYWRkX2NvbW1hKQorRElBR19OQU1FX0lOREVYKG5vdGVfbWlzcGxhY2VkX2VsbGlwc2lzX3ZhcmFyZ19hZGRfZWxsaXBzaXMpCitESUFHX05BTUVfSU5ERVgobm90ZV9taXNwbGFjZWRfZWxsaXBzaXNfdmFyYXJnX2V4aXN0aW5nX2VsbGlwc2lzKQorRElBR19OQU1FX0lOREVYKG5vdGVfbWlzc2luZ19lbmRfb2ZfZGVmaW5pdGlvbl9iZWZvcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9taXNzaW5nX3NlbGVjdG9yX25hbWUpCitESUFHX05BTUVfSU5ERVgobm90ZV9tbWFwX2xicmFjZV9tYXRjaCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX21tYXBfbHNxdWFyZV9tYXRjaCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX21tYXBfcHJldl9kZWZpbml0aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfbW1hcF9yZW5hbWVfdG9wX2xldmVsX3ByaXZhdGVfbW9kdWxlKQorRElBR19OQU1FX0lOREVYKG5vdGVfbW9kdWxlX2NhY2hlX3BhdGgpCitESUFHX05BTUVfSU5ERVgobm90ZV9tb2R1bGVfZGVmX3VuZGVmX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9tb2R1bGVfZmlsZV9pbXBvcnRlZF9ieSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX21vZHVsZV9pbXBvcnRfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX21vZHVsZV9pbXBvcnRfbm90X2F0X3RvcF9sZXZlbCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX21vZHVsZV9vZHJfdmlvbGF0aW9uX2RlZmluaXRpb25fZGF0YSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX21vZHVsZV9vZHJfdmlvbGF0aW9uX2RpZmZlcmVudF9kZWZpbml0aW9ucykKK0RJQUdfTkFNRV9JTkRFWChub3RlX21vZHVsZV9vZHJfdmlvbGF0aW9uX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfbW9kdWxlX29kcl92aW9sYXRpb25fbWlzbWF0Y2hfZGVjbCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX21vZHVsZV9vZHJfdmlvbGF0aW9uX21pc21hdGNoX2RlY2xfZGlmZikKK0RJQUdfTkFNRV9JTkRFWChub3RlX21vZHVsZV9vZHJfdmlvbGF0aW9uX21pc21hdGNoX2RlY2xfdW5rbm93bikKK0RJQUdfTkFNRV9JTkRFWChub3RlX21vZHVsZV9vZHJfdmlvbGF0aW9uX25vX3Bvc3NpYmxlX2RlY2xzKQorRElBR19OQU1FX0lOREVYKG5vdGVfbW9kdWxlX29kcl92aW9sYXRpb25fcG9zc2libGVfZGVjbCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX21vZHVsZV9vZHJfdmlvbGF0aW9uX3RlbXBsYXRlX3BhcmFtZXRlcikKK0RJQUdfTkFNRV9JTkRFWChub3RlX210X21lc3NhZ2UpCitESUFHX05BTUVfSU5ERVgobm90ZV9tdWx0aXZlcnNpb25pbmdfY2F1c2VkX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9uYW1lc3BhY2VfZGVmaW5lZF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfbmVvbl92ZWN0b3JfaW5pdGlhbGl6ZXJfbm9uX3BvcnRhYmxlKQorRElBR19OQU1FX0lOREVYKG5vdGVfbmVvbl92ZWN0b3JfaW5pdGlhbGl6ZXJfbm9uX3BvcnRhYmxlX3EpCitESUFHX05BTUVfSU5ERVgobm90ZV9uZXh0X2ZpZWxkX2RlY2xhcmF0aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfbmV4dF9pdmFyX2RlY2xhcmF0aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfbm9uX2RlZHVjaWJsZV9wYXJhbWV0ZXIpCitESUFHX05BTUVfSU5ERVgobm90ZV9ub25faW5zdGFudGlhdGVkX21lbWJlcl9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfbm9uX2xpdGVyYWxfYmFzZV9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWChub3RlX25vbl9saXRlcmFsX2ZpZWxkKQorRElBR19OQU1FX0lOREVYKG5vdGVfbm9uX2xpdGVyYWxfaW5jb21wbGV0ZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX25vbl9saXRlcmFsX25vX2NvbnN0ZXhwcl9jdG9ycykKK0RJQUdfTkFNRV9JTkRFWChub3RlX25vbl9saXRlcmFsX25vbnRyaXZpYWxfZHRvcikKK0RJQUdfTkFNRV9JTkRFWChub3RlX25vbl9saXRlcmFsX3VzZXJfcHJvdmlkZWRfZHRvcikKK0RJQUdfTkFNRV9JTkRFWChub3RlX25vbl9saXRlcmFsX3ZpcnR1YWxfYmFzZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX25vbl90ZW1wbGF0ZV9pbl90ZW1wbGF0ZV9pZF9mb3VuZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX25vbl91c3VhbF9mdW5jdGlvbl9kZWNsYXJlZF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfbm9udGVtcGxhdGVfZGVjbF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfbm9udHJpdmlhbF9kZWZhdWx0X2FyZykKK0RJQUdfTkFNRV9JTkRFWChub3RlX25vbnRyaXZpYWxfaGFzX3ZpcnR1YWwpCitESUFHX05BTUVfSU5ERVgobm90ZV9ub250cml2aWFsX2luX2NsYXNzX2luaXQpCitESUFHX05BTUVfSU5ERVgobm90ZV9ub250cml2aWFsX25vX2NvcHkpCitESUFHX05BTUVfSU5ERVgobm90ZV9ub250cml2aWFsX25vX2RlZl9jdG9yKQorRElBR19OQU1FX0lOREVYKG5vdGVfbm9udHJpdmlhbF9vYmpjX293bmVyc2hpcCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX25vbnRyaXZpYWxfcGFyYW1fdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX25vbnRyaXZpYWxfc3Vib2JqZWN0KQorRElBR19OQU1FX0lOREVYKG5vdGVfbm9udHJpdmlhbF91c2VyX3Byb3ZpZGVkKQorRElBR19OQU1FX0lOREVYKG5vdGVfbm9udHJpdmlhbF92YXJpYWRpYykKK0RJQUdfTkFNRV9JTkRFWChub3RlX25vbnRyaXZpYWxfdmlydHVhbF9kdG9yKQorRElBR19OQU1FX0lOREVYKG5vdGVfbm9yZXR1cm5fbWlzc2luZ19maXJzdF9kZWNsKQorRElBR19OQU1FX0lOREVYKG5vdGVfbm90X2ZvdW5kX2J5X3R3b19waGFzZV9sb29rdXApCitESUFHX05BTUVfSU5ERVgobm90ZV9udWxsYWJpbGl0eV9maXhfaXQpCitESUFHX05BTUVfSU5ERVgobm90ZV9udWxsYWJpbGl0eV9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfbnVsbGFiaWxpdHlfdHlwZV9zcGVjaWZpZXIpCitESUFHX05BTUVfSU5ERVgobm90ZV9vYmpjX2NpcmN1bGFyX2NvbnRhaW5lcl9kZWNsYXJlZF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfb2JqY19jb250YWluZXJfc3RhcnQpCitESUFHX05BTUVfSU5ERVgobm90ZV9vYmpjX2Rlc2lnbmF0ZWRfaW5pdF9tYXJrZWRfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX29iamNfbGl0ZXJhbF9jb21wYXJpc29uX2lzZXF1YWwpCitESUFHX05BTUVfSU5ERVgobm90ZV9vYmpjX2xpdGVyYWxfbWV0aG9kX3BhcmFtKQorRElBR19OQU1FX0lOREVYKG5vdGVfb2JqY19saXRlcmFsX21ldGhvZF9yZXR1cm4pCitESUFHX05BTUVfSU5ERVgobm90ZV9vYmpjX25lZWRzX3N1cGVyY2xhc3MpCitESUFHX05BTUVfSU5ERVgobm90ZV9vYmpjX3R5cGVfcGFyYW1faGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX29iamNfdW5zYWZlX3BlcmZvcm1fc2VsZWN0b3JfbWV0aG9kX2RlY2xhcmVkX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9vZHJfYmFzZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX29kcl9iaXRfZmllbGQpCitESUFHX05BTUVfSU5ERVgobm90ZV9vZHJfZGVmaW5lZF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfb2RyX2VudW1lcmF0b3IpCitESUFHX05BTUVfSU5ERVgobm90ZV9vZHJfZmllbGQpCitESUFHX05BTUVfSU5ERVgobm90ZV9vZHJfZmllbGRfbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX29kcl9taXNzaW5nX2Jhc2UpCitESUFHX05BTUVfSU5ERVgobm90ZV9vZHJfbWlzc2luZ19lbnVtZXJhdG9yKQorRElBR19OQU1FX0lOREVYKG5vdGVfb2RyX21pc3NpbmdfZmllbGQpCitESUFHX05BTUVfSU5ERVgobm90ZV9vZHJfbm90X2JpdF9maWVsZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX29kcl9udW1iZXJfb2ZfYmFzZXMpCitESUFHX05BTUVfSU5ERVgobm90ZV9vZHJfb2JqY19tZXRob2RfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX29kcl9vYmpjX21pc3Npbmdfc3VwZXJjbGFzcykKK0RJQUdfTkFNRV9JTkRFWChub3RlX29kcl9vYmpjX3Byb3BlcnR5X2ltcGxfa2luZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX29kcl9vYmpjX3N1cGVyY2xhc3MpCitESUFHX05BTUVfSU5ERVgobm90ZV9vZHJfb2JqY19zeW50aGVzaXplX2l2YXJfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX29kcl9wYXJhbWV0ZXJfcGFja19ub25fcGFjaykKK0RJQUdfTkFNRV9JTkRFWChub3RlX29kcl90YWdfa2luZF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfb2RyX3RlbXBsYXRlX3BhcmFtZXRlcl9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfb2RyX3RlbXBsYXRlX3BhcmFtZXRlcl9saXN0KQorRElBR19OQU1FX0lOREVYKG5vdGVfb2RyX3ZhbHVlX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9vZHJfdmlydHVhbF9iYXNlKQorRElBR19OQU1FX0lOREVYKG5vdGVfb21wX2F0b21pY19jYXB0dXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfb21wX2F0b21pY19wcmV2aW91c19jbGF1c2UpCitESUFHX05BTUVfSU5ERVgobm90ZV9vbXBfYXRvbWljX3JlYWRfd3JpdGUpCitESUFHX05BTUVfSU5ERVgobm90ZV9vbXBfYXRvbWljX3VwZGF0ZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX29tcF9jb2xsYXBzZV9vcmRlcmVkX2V4cHIpCitESUFHX05BTUVfSU5ERVgobm90ZV9vbXBfY29udmVyc2lvbl9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfb21wX2NyaXRpY2FsX2hpbnRfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX29tcF9jcml0aWNhbF9ub19oaW50KQorRElBR19OQU1FX0lOREVYKG5vdGVfb21wX2V4cGxpY2l0X2RzYSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX29tcF9pbXBsaWNpdF9kc2EpCitESUFHX05BTUVfSU5ERVgobm90ZV9vbXBfbG9vcF9jb25kX3JlcXVyZXNfY29tcGF0aWJsZV9pbmNyKQorRElBR19OQU1FX0lOREVYKG5vdGVfb21wX25lc3RlZF9zdGF0ZW1lbnRfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX29tcF9uZXN0ZWRfdGVhbXNfY29uc3RydWN0X2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9vbXBfbm93YWl0X2NsYXVzZV9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfb21wX29yZGVyZWRfcGFyYW0pCitESUFHX05BTUVfSU5ERVgobm90ZV9vbXBfcHJlZGV0ZXJtaW5lZF9kc2EpCitESUFHX05BTUVfSU5ERVgobm90ZV9vbXBfcHJldmlvdXNfY3JpdGljYWxfcmVnaW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfb21wX3ByZXZpb3VzX2dyYWluc2l6ZV9udW1fdGFza3MpCitESUFHX05BTUVfSU5ERVgobm90ZV9vbXBfcHJldmlvdXNfbmFtZWRfaWZfY2xhdXNlKQorRElBR19OQU1FX0lOREVYKG5vdGVfb21wX3ByZXZpb3VzX3JlZHVjdGlvbl9pZGVudGlmaWVyKQorRElBR19OQU1FX0lOREVYKG5vdGVfb21wX3JlZmVyZW5jZWQpCitESUFHX05BTUVfSU5ERVgobm90ZV9vbXBfdGFza19wcmVkZXRlcm1pbmVkX2ZpcnN0cHJpdmF0ZV9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3BlbmNsX3R5cGVkZWZfYWNjZXNzX3F1YWxpZmllcikKK0RJQUdfTkFNRV9JTkRFWChub3RlX29wZXJhdG9yX2Fycm93X2RlcHRoKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3BlcmF0b3JfYXJyb3dfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX29wZXJhdG9yX2Fycm93c19zdXBwcmVzc2VkKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZlcnJpZGRlbl9tYXJrZWRfbm9lc2NhcGUpCitESUFHX05BTUVfSU5ERVgobm90ZV9vdmVycmlkZGVuX21ldGhvZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX292ZXJyaWRkZW5fdmlydHVhbF9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX292bF9idWlsdGluX2JpbmFyeV9jYW5kaWRhdGUpCitESUFHX05BTUVfSU5ERVgobm90ZV9vdmxfYnVpbHRpbl91bmFyeV9jYW5kaWRhdGUpCitESUFHX05BTUVfSU5ERVgobm90ZV9vdmxfY2FuZGlkYXRlKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZsX2NhbmRpZGF0ZV9hcml0eSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX292bF9jYW5kaWRhdGVfYXJpdHlfb25lKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZsX2NhbmRpZGF0ZV9iYWRfYWRkcnNwYWNlKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZsX2NhbmRpZGF0ZV9iYWRfYXJjX2NvbnYpCitESUFHX05BTUVfSU5ERVgobm90ZV9vdmxfY2FuZGlkYXRlX2JhZF9iYXNlX3RvX2Rlcml2ZWRfY29udikKK0RJQUdfTkFNRV9JTkRFWChub3RlX292bF9jYW5kaWRhdGVfYmFkX2NvbnYpCitESUFHX05BTUVfSU5ERVgobm90ZV9vdmxfY2FuZGlkYXRlX2JhZF9jb252X2luY29tcGxldGUpCitESUFHX05BTUVfSU5ERVgobm90ZV9vdmxfY2FuZGlkYXRlX2JhZF9jdnIpCitESUFHX05BTUVfSU5ERVgobm90ZV9vdmxfY2FuZGlkYXRlX2JhZF9jdnJfdGhpcykKK0RJQUdfTkFNRV9JTkRFWChub3RlX292bF9jYW5kaWRhdGVfYmFkX2RlZHVjdGlvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX292bF9jYW5kaWRhdGVfYmFkX2djKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZsX2NhbmRpZGF0ZV9iYWRfbGlzdF9hcmd1bWVudCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX292bF9jYW5kaWRhdGVfYmFkX2x2YWx1ZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX292bF9jYW5kaWRhdGVfYmFkX292ZXJsb2FkKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZsX2NhbmRpZGF0ZV9iYWRfb3duZXJzaGlwKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZsX2NhbmRpZGF0ZV9iYWRfdGFyZ2V0KQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZsX2NhbmRpZGF0ZV9iYWRfdW5hbGlnbmVkKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZsX2NhbmRpZGF0ZV9kZWR1Y2VkX21pc21hdGNoKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZsX2NhbmRpZGF0ZV9kZWxldGVkKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZsX2NhbmRpZGF0ZV9kaXNhYmxlZF9ieV9lbmFibGVfaWYpCitESUFHX05BTUVfSU5ERVgobm90ZV9vdmxfY2FuZGlkYXRlX2Rpc2FibGVkX2J5X2V4dGVuc2lvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX292bF9jYW5kaWRhdGVfZGlzYWJsZWRfYnlfZnVuY3Rpb25fY29uZF9hdHRyKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZsX2NhbmRpZGF0ZV9kaXNhYmxlZF9ieV9yZXF1aXJlbWVudCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX292bF9jYW5kaWRhdGVfZXhwbGljaXRfYXJnX21pc21hdGNoX25hbWVkKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZsX2NhbmRpZGF0ZV9leHBsaWNpdF9hcmdfbWlzbWF0Y2hfdW5uYW1lZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX292bF9jYW5kaWRhdGVfaGFzX3Bhc3Nfb2JqZWN0X3NpemVfcGFyYW1zKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZsX2NhbmRpZGF0ZV9pbGxlZ2FsX2NvbnN0cnVjdG9yKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZsX2NhbmRpZGF0ZV9pbmNvbXBsZXRlX2RlZHVjdGlvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX292bF9jYW5kaWRhdGVfaW5jb25zaXN0ZW50X2RlZHVjdGlvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX292bF9jYW5kaWRhdGVfaW5jb25zaXN0ZW50X2RlZHVjdGlvbl90eXBlcykKK0RJQUdfTkFNRV9JTkRFWChub3RlX292bF9jYW5kaWRhdGVfaW5oZXJpdGVkX2NvbnN0cnVjdG9yKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZsX2NhbmRpZGF0ZV9pbmhlcml0ZWRfY29uc3RydWN0b3Jfc2xpY2UpCitESUFHX05BTUVfSU5ERVgobm90ZV9vdmxfY2FuZGlkYXRlX2luc3RhbnRpYXRpb25fZGVwdGgpCitESUFHX05BTUVfSU5ERVgobm90ZV9vdmxfY2FuZGlkYXRlX25vbl9kZWR1Y2VkX21pc21hdGNoKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZsX2NhbmRpZGF0ZV9ub25fZGVkdWNlZF9taXNtYXRjaF9xdWFsaWZpZWQpCitESUFHX05BTUVfSU5ERVgobm90ZV9vdmxfY2FuZGlkYXRlX3N1YnN0aXR1dGlvbl9mYWlsdXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3ZsX2NhbmRpZGF0ZV91bmRlcnF1YWxpZmllZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX292bF9zdXJyb2dhdGVfY2FuZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX292bF90b29fbWFueV9jYW5kaWRhdGVzKQorRElBR19OQU1FX0lOREVYKG5vdGVfb3duZXJzaGlwX3JldHVybnNfaW5kZXhfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgobm90ZV9wYXJhbWV0ZXJfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3BhcmFtZXRlcl9uYW1lZF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfcGFyYW1ldGVyX3BhY2tfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3BhcmFtZXRlcl90eXBlKQorRElBR19OQU1FX0lOREVYKG5vdGVfcGFydGlhbF9zcGVjX21hdGNoKQorRElBR19OQU1FX0lOREVYKG5vdGVfcGFydGlhbF9zcGVjX25vdF9tb3JlX3NwZWNpYWxpemVkX3RoYW5fcHJpbWFyeSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3BhcnRpYWxfc3BlY2lhbGl6YXRpb25fZGVjbGFyZWRfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3BjaF9yZWJ1aWxkX3JlcXVpcmVkKQorRElBR19OQU1FX0lOREVYKG5vdGVfcGNoX3JlcXVpcmVkX2J5KQorRElBR19OQU1FX0lOREVYKG5vdGVfcGVyZm9ybXNfZm9yYmlkZGVuX2FyY19jb252ZXJzaW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfcG9zc2liaWxpdHkpCitESUFHX05BTUVfSU5ERVgobm90ZV9wb3NzaWJsZV90YXJnZXRfb2ZfY2FsbCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3BwX2FtYmlndW91c19tYWNyb19jaG9zZW4pCitESUFHX05BTUVfSU5ERVgobm90ZV9wcF9hbWJpZ3VvdXNfbWFjcm9fb3RoZXIpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcF9tb2R1bGVfYmVnaW5faGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3ByYWdtYV9hdHRyaWJ1dGVfYXBwbGllZF9kZWNsX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcmFnbWFfYXR0cmlidXRlX3JlZ2lvbl9lbmRzX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcmFnbWFfYXR0cmlidXRlX3VzZV9hdHRyaWJ1dGVfa3cpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcmFnbWFfZW50ZXJlZF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfcHJhZ21hX3BhY2tfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3ByYWdtYV9wYWNrX3BvcF9pbnN0ZWFkX3Jlc2V0KQorRElBR19OQU1FX0lOREVYKG5vdGVfcHJlY2VkZW5jZV9iaXR3aXNlX2ZpcnN0KQorRElBR19OQU1FX0lOREVYKG5vdGVfcHJlY2VkZW5jZV9jb25kaXRpb25hbF9maXJzdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3ByZWNlZGVuY2Vfc2lsZW5jZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3ByZXZfbW9kdWxlX2RlY2xhcmF0aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfcHJldl9tb2R1bGVfZGVmaW5pdGlvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX3ByZXZfbW9kdWxlX2RlZmluaXRpb25fZnJvbV9hc3RfZmlsZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3ByZXZfcGFydGlhbF9zcGVjX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcmV2aW91c19hY2Nlc3NfZGVjbGFyYXRpb24pCitESUFHX05BTUVfSU5ERVgobm90ZV9wcmV2aW91c19hdHRyaWJ1dGUpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcmV2aW91c19idWlsdGluX2RlY2xhcmF0aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfcHJldmlvdXNfZGVjbCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3ByZXZpb3VzX2RlY2xhcmF0aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfcHJldmlvdXNfZGVmYXVsdF9hc3NvYykKK0RJQUdfTkFNRV9JTkRFWChub3RlX3ByZXZpb3VzX2RlZmluaXRpb24pCitESUFHX05BTUVfSU5ERVgobm90ZV9wcmV2aW91c19leGNlcHRpb25faGFuZGxlcikKK0RJQUdfTkFNRV9JTkRFWChub3RlX3ByZXZpb3VzX2V4cGxpY2l0X2luc3RhbnRpYXRpb24pCitESUFHX05BTUVfSU5ERVgobm90ZV9wcmV2aW91c19pbXBsaWNpdF9kZWNsYXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX3ByZXZpb3VzX2luaXRpYWxpemVyKQorRElBR19OQU1FX0lOREVYKG5vdGVfcHJldmlvdXNfbXNfaW5oZXJpdGFuY2UpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcmV2aW91c19uYW1lc3BhY2VfYWxpYXMpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcmV2aW91c190ZW1wbGF0ZV9zcGVjaWFsaXphdGlvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX3ByZXZpb3VzX3VzZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3ByZXZpb3VzX3V1aWQpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcmludGZfY19zdHIpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcmlvcl90ZW1wbGF0ZV9hcmdfc3Vic3RpdHV0aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfcHJpdmF0ZV9leHRlcm4pCitESUFHX05BTUVfSU5ERVgobm90ZV9wcml2YXRlX3RvcF9sZXZlbF9kZWZpbmVkKQorRElBR19OQU1FX0lOREVYKG5vdGVfcHJvcGVydHlfYXR0cmlidXRlKQorRElBR19OQU1FX0lOREVYKG5vdGVfcHJvcGVydHlfZGVjbGFyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3Byb3BlcnR5X3N5bnRoZXNpemUpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcm90ZWN0ZWRfYnlfX19ibG9jaykKK0RJQUdfTkFNRV9JTkRFWChub3RlX3Byb3RlY3RlZF9ieV9jbGVhbnVwKQorRElBR19OQU1FX0lOREVYKG5vdGVfcHJvdGVjdGVkX2J5X2NvbnN0ZXhwcl9pZikKK0RJQUdfTkFNRV9JTkRFWChub3RlX3Byb3RlY3RlZF9ieV9jeHhfY2F0Y2gpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcm90ZWN0ZWRfYnlfY3h4X3RyeSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3Byb3RlY3RlZF9ieV9pZl9hdmFpbGFibGUpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcm90ZWN0ZWRfYnlfbm9uX3RyaXZpYWxfY19zdHJ1Y3RfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3Byb3RlY3RlZF9ieV9vYmpjX2F1dG9yZWxlYXNlcG9vbCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3Byb3RlY3RlZF9ieV9vYmpjX2NhdGNoKQorRElBR19OQU1FX0lOREVYKG5vdGVfcHJvdGVjdGVkX2J5X29iamNfZmFzdF9lbnVtZXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX3Byb3RlY3RlZF9ieV9vYmpjX2ZpbmFsbHkpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcm90ZWN0ZWRfYnlfb2JqY19zdHJvbmdfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3Byb3RlY3RlZF9ieV9vYmpjX3N5bmNocm9uaXplZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3Byb3RlY3RlZF9ieV9vYmpjX3RyeSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3Byb3RlY3RlZF9ieV9vYmpjX3dlYWtfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3Byb3RlY3RlZF9ieV9zZWhfZXhjZXB0KQorRElBR19OQU1FX0lOREVYKG5vdGVfcHJvdGVjdGVkX2J5X3NlaF9maW5hbGx5KQorRElBR19OQU1FX0lOREVYKG5vdGVfcHJvdGVjdGVkX2J5X3NlaF90cnkpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcm90ZWN0ZWRfYnlfdmFyaWFibGVfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3Byb3RlY3RlZF9ieV92YXJpYWJsZV9ub25fcG9kKQorRElBR19OQU1FX0lOREVYKG5vdGVfcHJvdGVjdGVkX2J5X3ZhcmlhYmxlX25vbnRyaXZfZGVzdHJ1Y3RvcikKK0RJQUdfTkFNRV9JTkRFWChub3RlX3Byb3RlY3RlZF9ieV92bGEpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcm90ZWN0ZWRfYnlfdmxhX3R5cGVfYWxpYXMpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcm90ZWN0ZWRfYnlfdmxhX3R5cGVkZWYpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcm90b2NvbF9kZWNsKQorRElBR19OQU1FX0lOREVYKG5vdGVfcHJvdG9jb2xfZGVjbF91bmRlZmluZWQpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcm90b2NvbF9tZXRob2QpCitESUFHX05BTUVfSU5ERVgobm90ZV9wcm90b2NvbF9wcm9wZXJ0eV9kZWNsYXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfcHVyZV9xdWFsaWZpZWRfY2FsbF9rZXh0KQorRElBR19OQU1FX0lOREVYKG5vdGVfcHVyZV92aXJ0dWFsX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfcmFpaV9ndWFyZF9hZGRfbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3JlY2VpdmVyX2NsYXNzX2RlY2xhcmVkKQorRElBR19OQU1FX0lOREVYKG5vdGVfcmVjZWl2ZXJfZXhwcl9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfcmVjZWl2ZXJfaXNfaWQpCitESUFHX05BTUVfSU5ERVgobm90ZV9yZWRlZmluaXRpb25faW5jbHVkZV9zYW1lX2ZpbGUpCitESUFHX05BTUVfSU5ERVgobm90ZV9yZWRlZmluaXRpb25fbW9kdWxlc19zYW1lX2ZpbGUpCitESUFHX05BTUVfSU5ERVgobm90ZV9yZWZfb3JfcHRyX21lbWJlcl9kZWNsYXJlZF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfcmVmX3N1Ym9iamVjdF9vZl9tZW1iZXJfZGVjbGFyZWRfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3JlZl92YXJfbG9jYWxfYmluZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3JlZmNvbnN0X21lbWJlcl9ub3RfaW5pdGlhbGl6ZWQpCitESUFHX05BTUVfSU5ERVgobm90ZV9yZWZlcmVuY2VfaXNfcmV0dXJuX3ZhbHVlKQorRElBR19OQU1FX0lOREVYKG5vdGVfcmVmZXJlbmNlZF9jbGFzc190ZW1wbGF0ZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3JlaW50ZXJwcmV0X3VwZG93bmNhc3RfdXNlX3N0YXRpYykKK0RJQUdfTkFNRV9JTkRFWChub3RlX3JlbGF0ZWRfcmVzdWx0X3R5cGVfZXhwbGljaXQpCitESUFHX05BTUVfSU5ERVgobm90ZV9yZWxhdGVkX3Jlc3VsdF90eXBlX2ZhbWlseSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3JlbGF0ZWRfcmVzdWx0X3R5cGVfaW5mZXJyZWQpCitESUFHX05BTUVfSU5ERVgobm90ZV9yZWxhdGVkX3Jlc3VsdF90eXBlX292ZXJyaWRkZW4pCitESUFHX05BTUVfSU5ERVgobm90ZV9yZW1vdmVfYWJzKQorRElBR19OQU1FX0lOREVYKG5vdGVfcmVtb3ZlX21heF9jYWxsKQorRElBR19OQU1FX0lOREVYKG5vdGVfcmVtb3ZlX21vdmUpCitESUFHX05BTUVfSU5ERVgobm90ZV9yZW1vdmVfcGFyZW5zX2Zvcl92YXJpYWJsZV9kZWNsYXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX3JlcGxhY2VfYWJzX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfc2Vjb25kX21vZHVsZV9kaWZmZXJlbmNlKQorRElBR19OQU1FX0lOREVYKG5vdGVfc2VudGluZWxfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3NoYWRvd19maWVsZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3NpbGVuY2VfdW5saWduZWRfYWxsb2NhdGlvbl91bmF2YWlsYWJsZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3NwZWNpYWxpemVkX2RlY2wpCitESUFHX05BTUVfSU5ERVgobm90ZV9zcGVjaWFsaXplZF9lbnRpdHkpCitESUFHX05BTUVfSU5ERVgobm90ZV9zdHJpbmdfcGx1c19zY2FsYXJfc2lsZW5jZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3N0cmxjcHljYXRfd3Jvbmdfc2l6ZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3N0cm5jYXRfd3Jvbmdfc2l6ZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3N0cnVjdF9jbGFzc19zdWdnZXN0aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfc3VnZ2VzdF9kaXNhYmxpbmdfYWxsX2NoZWNrZXJzKQorRElBR19OQU1FX0lOREVYKG5vdGVfc3VnZ2VzdF9wYXJlbnNfZm9yX21hY3JvKQorRElBR19OQU1FX0lOREVYKG5vdGVfc3VwcHJlc3NlZF9jbGFzc19kZWNsYXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfc3Vycm91bmRpbmdfbmFtZXNwYWNlX2VuZHNfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3N1cnJvdW5kaW5nX25hbWVzcGFjZV9zdGFydHNfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3N3aXRjaF9jb252ZXJzaW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfdGVtcGxhdGVfYXJnX2ludGVybmFsX29iamVjdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3RlbXBsYXRlX2FyZ19yZWZlcnNfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3RlbXBsYXRlX2FyZ19yZWZlcnNfaGVyZV9mdW5jKQorRElBR19OQU1FX0lOREVYKG5vdGVfdGVtcGxhdGVfY2xhc3NfZXhwbGljaXRfc3BlY2lhbGl6YXRpb25fd2FzX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV90ZW1wbGF0ZV9jbGFzc19pbnN0YW50aWF0aW9uX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV90ZW1wbGF0ZV9jbGFzc19pbnN0YW50aWF0aW9uX3dhc19oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfdGVtcGxhdGVfZGVjbF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfdGVtcGxhdGVfZGVjbGFyZWRfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3RlbXBsYXRlX2RlZmF1bHRfYXJnX2NoZWNraW5nKQorRElBR19OQU1FX0lOREVYKG5vdGVfdGVtcGxhdGVfZW51bV9kZWZfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3RlbXBsYXRlX2V4Y2VwdGlvbl9zcGVjX2luc3RhbnRpYXRpb25faGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3RlbXBsYXRlX21lbWJlcl9jbGFzc19oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfdGVtcGxhdGVfbWVtYmVyX2Z1bmN0aW9uX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV90ZW1wbGF0ZV9ub250eXBlX3Bhcm1fZGlmZmVyZW50X3R5cGUpCitESUFHX05BTUVfSU5ERVgobm90ZV90ZW1wbGF0ZV9ub250eXBlX3Bhcm1fcHJldl9kZWNsYXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX3RlbXBsYXRlX25zZG1pX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV90ZW1wbGF0ZV9wYXJhbV9kaWZmZXJlbnRfa2luZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3RlbXBsYXRlX3BhcmFtX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV90ZW1wbGF0ZV9wYXJhbV9saXN0X2RpZmZlcmVudF9hcml0eSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3RlbXBsYXRlX3BhcmFtX3ByZXZfZGVmYXVsdF9hcmcpCitESUFHX05BTUVfSU5ERVgobm90ZV90ZW1wbGF0ZV9wYXJhbWV0ZXJfcGFja19oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfdGVtcGxhdGVfcGFyYW1ldGVyX3BhY2tfbm9uX3BhY2spCitESUFHX05BTUVfSU5ERVgobm90ZV90ZW1wbGF0ZV9wcmV2X2RlY2xhcmF0aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfdGVtcGxhdGVfcmVjdXJzaW9uX2RlcHRoKQorRElBR19OQU1FX0lOREVYKG5vdGVfdGVtcGxhdGVfc3RhdGljX2RhdGFfbWVtYmVyX2RlZl9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfdGVtcGxhdGVfdHlwZV9hbGlhc19pbnN0YW50aWF0aW9uX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV90ZW1wbGF0ZV91bm5hbWVkX3R5cGVfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3RlbXBsYXRlX3ZhcmlhYmxlX2RlZl9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfdGhyZWFkX3dhcm5pbmdfaW5fZnVuKQorRElBR19OQU1FX0lOREVYKG5vdGVfdGhyb3dfaW5fZHRvcikKK0RJQUdfTkFNRV9JTkRFWChub3RlX3Rocm93X2luX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfdHJhbnNwYXJlbnRfdW5pb25fZmlyc3RfZmllbGRfc2l6ZV9hbGlnbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX3R5cGVfYmVpbmdfZGVmaW5lZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3R5cGVfaW5jb21wbGV0ZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3R5cGVjaGVja19hc3NpZ25fY29uc3QpCitESUFHX05BTUVfSU5ERVgobm90ZV90eXBlY2hlY2tfbWVtYmVyX3JlZmVyZW5jZV9zdWdnZXN0aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfdHlwZWRlZl9jaGFuZ2VzX2xpbmthZ2UpCitESUFHX05BTUVfSU5ERVgobm90ZV90eXBlbmFtZV9yZWZlcnNfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3Vjbl9mb3VyX25vdF9laWdodCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3VuZ3VhcmRlZF9hdmFpbGFibGVfc2lsZW5jZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3VuaW1wbGVtZW50ZWRfY29uc3RleHByX2xhbWJkYV9mZWF0dXJlX2FzdCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3VuaW5pdF9maXhpdF9yZW1vdmVfY29uZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3VuaW5pdF9pbl90aGlzX2NvbnN0cnVjdG9yKQorRElBR19OQU1FX0lOREVYKG5vdGVfdW5pbml0X3JlZmVyZW5jZV9tZW1iZXIpCitESUFHX05BTUVfSU5ERVgobm90ZV91bmluaXRfdmFyX3VzZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3VucmVhY2hhYmxlX3NpbGVuY2UpCitESUFHX05BTUVfSU5ERVgobm90ZV91c2VfZGFzaGRhc2gpCitESUFHX05BTUVfSU5ERVgobm90ZV91c2VfaWZkZWZfZ3VhcmRzKQorRElBR19OQU1FX0lOREVYKG5vdGVfdXNlX25vbl9yZWZlcmVuY2VfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3VzZV9yZWZlcmVuY2VfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3VzZV90aHJlYWRfbG9jYWwpCitESUFHX05BTUVfSU5ERVgobm90ZV91c2VfdHlwZV9vcl9ub25fcmVmZXJlbmNlKQorRElBR19OQU1FX0lOREVYKG5vdGVfdXNlZF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfdXNlZF9pbl9pbml0aWFsaXphdGlvbl9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfdXNlcl9kZWNsYXJlZF9jdG9yKQorRElBR19OQU1FX0lOREVYKG5vdGVfdXNpbmcpCitESUFHX05BTUVfSU5ERVgobm90ZV91c2luZ19kZWNsKQorRElBR19OQU1FX0lOREVYKG5vdGVfdXNpbmdfZGVjbF9jbGFzc19tZW1iZXJfd29ya2Fyb3VuZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3VzaW5nX2RlY2xfY29uZmxpY3QpCitESUFHX05BTUVfSU5ERVgobm90ZV91c2luZ19kZWNsX3RhcmdldCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3VzaW5nX3ZhbHVlX2RlY2xfbWlzc2luZ190eXBlbmFtZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3ZhbGlkX29wdGlvbnMpCitESUFHX05BTUVfSU5ERVgobm90ZV92YWx1ZV9pbml0aWFsaXphdGlvbl9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfdmFyX2RlY2xhcmVkX2hlcmUpCitESUFHX05BTUVfSU5ERVgobm90ZV92YXJfZXhwbGljaXRseV9jYXB0dXJlZF9oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfdmFyX2ZpeGl0X2FkZF9pbml0aWFsaXphdGlvbikKK0RJQUdfTkFNRV9JTkRFWChub3RlX3Zhcl9wcmV2X3BhcnRpYWxfc3BlY19oZXJlKQorRElBR19OQU1FX0lOREVYKG5vdGVfdmJhc2VfbW92ZWRfaGVyZSkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3ZsYV91bnN1cHBvcnRlZCkKK0RJQUdfTkFNRV9JTkRFWChub3RlX3doaWNoX2RlbGVnYXRlc190bykKK0RJQUdfTkFNRV9JTkRFWChub3RlX3doaWxlX2luX2ltcGxlbWVudGF0aW9uKQorRElBR19OQU1FX0lOREVYKG5vdGVfd2lkZW5fYml0ZmllbGQpCitESUFHX05BTUVfSU5ERVgobm90ZV93aXRoaW5fZmllbGRfb2ZfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWChudWxsX2luX2NoYXJfb3Jfc3RyaW5nKQorRElBR19OQU1FX0lOREVYKG51bGxfaW5fZmlsZSkKK0RJQUdfTkFNRV9JTkRFWChvdmVycmlkZV9rZXl3b3JkX2hpZGVzX3ZpcnR1YWxfbWVtYmVyX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKG92ZXJyaWRlX2tleXdvcmRfb25seV9hbGxvd2VkX29uX3ZpcnR1YWxfbWVtYmVyX2Z1bmN0aW9ucykKK0RJQUdfTkFNRV9JTkRFWChwcF9kaXNhYmxlZF9tYWNyb19leHBhbnNpb24pCitESUFHX05BTUVfSU5ERVgocHBfZXJyX2VsaWZfYWZ0ZXJfZWxzZSkKK0RJQUdfTkFNRV9JTkRFWChwcF9lcnJfZWxpZl93aXRob3V0X2lmKQorRElBR19OQU1FX0lOREVYKHBwX2Vycl9lbHNlX2FmdGVyX2Vsc2UpCitESUFHX05BTUVfSU5ERVgocHBfZXJyX2Vsc2Vfd2l0aG91dF9pZikKK0RJQUdfTkFNRV9JTkRFWChwcF9oYXNoX3dhcm5pbmcpCitESUFHX05BTUVfSU5ERVgocHBfaW5jbHVkZV9tYWNyb3Nfb3V0X29mX3ByZWRlZmluZXMpCitESUFHX05BTUVfSU5ERVgocHBfaW5jbHVkZV9uZXh0X2Fic29sdXRlX3BhdGgpCitESUFHX05BTUVfSU5ERVgocHBfaW5jbHVkZV9uZXh0X2luX3ByaW1hcnkpCitESUFHX05BTUVfSU5ERVgocHBfaW52YWxpZF9zdHJpbmdfbGl0ZXJhbCkKK0RJQUdfTkFNRV9JTkRFWChwcF9tYWNyb19ub3RfdXNlZCkKK0RJQUdfTkFNRV9JTkRFWChwcF9ub25wb3J0YWJsZV9wYXRoKQorRElBR19OQU1FX0lOREVYKHBwX25vbnBvcnRhYmxlX3N5c3RlbV9wYXRoKQorRElBR19OQU1FX0lOREVYKHBwX291dF9vZl9kYXRlX2RlcGVuZGVuY3kpCitESUFHX05BTUVfSU5ERVgocHBfcG9pc29uaW5nX2V4aXN0aW5nX21hY3JvKQorRElBR19OQU1FX0lOREVYKHBwX3ByYWdtYV9vbmNlX2luX21haW5fZmlsZSkKK0RJQUdfTkFNRV9JTkRFWChwcF9wcmFnbWFfc3lzaGVhZGVyX2luX21haW5fZmlsZSkKK0RJQUdfTkFNRV9JTkRFWChyZW1hcmtfZmVfYmFja2VuZF9vcHRpbWl6YXRpb25fcmVtYXJrKQorRElBR19OQU1FX0lOREVYKHJlbWFya19mZV9iYWNrZW5kX29wdGltaXphdGlvbl9yZW1hcmtfYW5hbHlzaXMpCitESUFHX05BTUVfSU5ERVgocmVtYXJrX2ZlX2JhY2tlbmRfb3B0aW1pemF0aW9uX3JlbWFya19hbmFseXNpc19hbGlhc2luZykKK0RJQUdfTkFNRV9JTkRFWChyZW1hcmtfZmVfYmFja2VuZF9vcHRpbWl6YXRpb25fcmVtYXJrX2FuYWx5c2lzX2ZwY29tbXV0ZSkKK0RJQUdfTkFNRV9JTkRFWChyZW1hcmtfZmVfYmFja2VuZF9vcHRpbWl6YXRpb25fcmVtYXJrX21pc3NlZCkKK0RJQUdfTkFNRV9JTkRFWChyZW1hcmtfZmVfYmFja2VuZF9wbHVnaW4pCitESUFHX05BTUVfSU5ERVgocmVtYXJrX21vZHVsZV9idWlsZCkKK0RJQUdfTkFNRV9JTkRFWChyZW1hcmtfbW9kdWxlX2J1aWxkX2RvbmUpCitESUFHX05BTUVfSU5ERVgocmVtYXJrX21vZHVsZV9sb2NrX2ZhaWx1cmUpCitESUFHX05BTUVfSU5ERVgocmVtYXJrX21vZHVsZV9sb2NrX3RpbWVvdXQpCitESUFHX05BTUVfSU5ERVgocmVtYXJrX3Nhbml0aXplX2FkZHJlc3NfaW5zZXJ0X2V4dHJhX3BhZGRpbmdfYWNjZXB0ZWQpCitESUFHX05BTUVfSU5ERVgocmVtYXJrX3Nhbml0aXplX2FkZHJlc3NfaW5zZXJ0X2V4dHJhX3BhZGRpbmdfcmVqZWN0ZWQpCitESUFHX05BTUVfSU5ERVgodHJpZ3JhcGhfY29udmVydGVkKQorRElBR19OQU1FX0lOREVYKHRyaWdyYXBoX2VuZHNfYmxvY2tfY29tbWVudCkKK0RJQUdfTkFNRV9JTkRFWCh0cmlncmFwaF9pZ25vcmVkKQorRElBR19OQU1FX0lOREVYKHRyaWdyYXBoX2lnbm9yZWRfYmxvY2tfY29tbWVudCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX080X2lzX08zKQorRElBR19OQU1FX0lOREVYKHdhcm5fYWJzX3Rvb19zbWFsbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Fic3RyYWN0X2ZpbmFsX2NsYXNzKQorRElBR19OQU1FX0lOREVYKHdhcm5fYWJzdHJhY3RfdmJhc2VfaW5pdF9pZ25vcmVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fYWNjZXNzX2RlY2xfZGVwcmVjYXRlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2FjY2Vzc29yX3Byb3BlcnR5X3R5cGVfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgod2Fybl9hY3F1aXJlX3JlcXVpcmVzX25lZ2F0aXZlX2NhcCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2FjcXVpcmVkX2JlZm9yZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2FjcXVpcmVkX2JlZm9yZV9hZnRlcl9jeWNsZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2FkZGl0aW9uX2luX2JpdHNoaWZ0KQorRElBR19OQU1FX0lOREVYKHdhcm5fYWRkcmVzc19vZl9yZWZlcmVuY2VfYm9vbF9jb252ZXJzaW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fYWRkcmVzc19vZl9yZWZlcmVuY2VfbnVsbF9jb21wYXJlKQorRElBR19OQU1FX0lOREVYKHdhcm5fYWxpYXNfdG9fd2Vha19hbGlhcykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2FsaWFzX3dpdGhfc2VjdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2FsaWduZWRfYWxsb2NhdGlvbl91bmF2YWlsYWJsZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2FsbG9jYV9hbGlnbl9hbGlnbm9mKQorRElBR19OQU1FX0lOREVYKHdhcm5fYW1iaWd1b3VzX3N1aXRhYmxlX2RlbGV0ZV9mdW5jdGlvbl9mb3VuZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Fub25fYml0ZmllbGRfd2lkdGhfZXhjZWVkc190eXBlX3dpZHRoKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXJjX2JyaWRnZV9jYXN0X25vbmFyYykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2FyY19saWZldGltZV9yZXN1bHRfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2FyY19saXRlcmFsX2Fzc2lnbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2FyY19vYmplY3RfbWVtYWNjZXNzKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXJjX3BlcmZvcm1fc2VsZWN0b3JfbGVha3MpCitESUFHX05BTUVfSU5ERVgod2Fybl9hcmNfcG9zc2libGVfcmVwZWF0ZWRfdXNlX29mX3dlYWspCitESUFHX05BTUVfSU5ERVgod2Fybl9hcmNfcmVwZWF0ZWRfdXNlX29mX3dlYWspCitESUFHX05BTUVfSU5ERVgod2Fybl9hcmNfcmV0YWluX2N5Y2xlKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXJjX3JldGFpbmVkX2Fzc2lnbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2FyY19yZXRhaW5lZF9wcm9wZXJ0eV9hc3NpZ24pCitESUFHX05BTUVfSU5ERVgod2Fybl9hcmNfc3Ryb25nX3BvaW50ZXJfb2JqY19wb2ludGVyKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXJjbXRfbnNhbGxvY19yZWFsbG9jKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXJtX2ludGVycnVwdF9jYWxsaW5nX2NvbnZlbnRpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9hcnJheV9pbmRleF9leGNlZWRzX2JvdW5kcykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2FycmF5X2luZGV4X3ByZWNlZGVzX2JvdW5kcykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2FzbV9sYWJlbF9vbl9hdXRvX2RlY2wpCitESUFHX05BTUVfSU5ERVgod2Fybl9hc21fbWlzbWF0Y2hlZF9zaXplX21vZGlmaWVyKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXNtX3F1YWxpZmllcl9pZ25vcmVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXNzdW1lX3NpZGVfZWZmZWN0cykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2F0X2F2YWlsYWJsZV91bmNoZWNrZWRfdXNlKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXRsX3V1aWRfZGVwcmVjYXRlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2F0b21pY19vcF9oYXNfaW52YWxpZF9tZW1vcnlfb3JkZXIpCitESUFHX05BTUVfSU5ERVgod2Fybl9hdG9taWNfcHJvcGVydHlfcnVsZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2F0cHJvdG9jb2xfcHJvdG9jb2wpCitESUFHX05BTUVfSU5ERVgod2Fybl9hdHRyX2FiaV90YWdfbmFtZXNwYWNlKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXR0cl9vbl91bmNvbnN1bWFibGVfY2xhc3MpCitESUFHX05BTUVfSU5ERVgod2Fybl9hdHRyaWJ1dGVfYWZ0ZXJfZGVmaW5pdGlvbl9pZ25vcmVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXR0cmlidXRlX2FyZ3VtZW50X25fbmVnYXRpdmUpCitESUFHX05BTUVfSU5ERVgod2Fybl9hdHRyaWJ1dGVfZGxsX2luc3RhbnRpYXRlZF9iYXNlX2NsYXNzKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXR0cmlidXRlX2RsbF9yZWRlY2xhcmF0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXR0cmlidXRlX2RsbGV4cG9ydF9leHBsaWNpdF9pbnN0YW50aWF0aW9uX2RlY2wpCitESUFHX05BTUVfSU5ERVgod2Fybl9hdHRyaWJ1dGVfZGxsaW1wb3J0X3N0YXRpY19maWVsZF9kZWZpbml0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXR0cmlidXRlX2lib3V0bGV0KQorRElBR19OQU1FX0lOREVYKHdhcm5fYXR0cmlidXRlX2lnbm9yZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9hdHRyaWJ1dGVfaWdub3JlZF9mb3JfZmllbGRfb2ZfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2F0dHJpYnV0ZV9pZ25vcmVkX29uX2lubGluZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2F0dHJpYnV0ZV9pbnZhbGlkX29uX2RlZmluaXRpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9hdHRyaWJ1dGVfbm9fZGVjbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2F0dHJpYnV0ZV9ub25udWxsX25vX3BvaW50ZXJzKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXR0cmlidXRlX25vbm51bGxfcGFybV9ub19hcmdzKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXR0cmlidXRlX25vdF9vbl9kZWNsKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXR0cmlidXRlX29uX2Z1bmN0aW9uX2RlZmluaXRpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9hdHRyaWJ1dGVfcGFja2VkX2Zvcl9iaXRmaWVsZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2F0dHJpYnV0ZV9wb2ludGVyX29yX3JlZmVyZW5jZV9vbmx5KQorRElBR19OQU1FX0lOREVYKHdhcm5fYXR0cmlidXRlX3BvaW50ZXJzX29ubHkpCitESUFHX05BTUVfSU5ERVgod2Fybl9hdHRyaWJ1dGVfcHJlY2VkZV9kZWZpbml0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXR0cmlidXRlX3Byb3RlY3RlZF92aXNpYmlsaXR5KQorRElBR19OQU1FX0lOREVYKHdhcm5fYXR0cmlidXRlX3JldHVybl9wb2ludGVyc19vbmx5KQorRElBR19OQU1FX0lOREVYKHdhcm5fYXR0cmlidXRlX3JldHVybl9wb2ludGVyc19yZWZzX29ubHkpCitESUFHX05BTUVfSU5ERVgod2Fybl9hdHRyaWJ1dGVfc2VjdGlvbl9vbl9yZWRlY2xhcmF0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXR0cmlidXRlX3NlbnRpbmVsX25hbWVkX2FyZ3VtZW50cykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2F0dHJpYnV0ZV9zZW50aW5lbF9ub3RfdmFyaWFkaWMpCitESUFHX05BTUVfSU5ERVgod2Fybl9hdHRyaWJ1dGVfdHlwZV9ub3Rfc3VwcG9ydGVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXR0cmlidXRlX3Vua25vd25fdmlzaWJpbGl0eSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2F0dHJpYnV0ZV92b2lkX2Z1bmN0aW9uX21ldGhvZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2F0dHJpYnV0ZV93ZWFrX29uX2ZpZWxkKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXR0cmlidXRlX3dlYWtfb25fbG9jYWwpCitESUFHX05BTUVfSU5ERVgod2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCitESUFHX05BTUVfSU5ERVgod2Fybl9hdXRvX2ltcGxpY2l0X2F0b21pY19wcm9wZXJ0eSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2F1dG9fbW9kdWxlX2ltcG9ydCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2F1dG9fcmVhZG9ubHlfaWJvdXRsZXRfcHJvcGVydHkpCitESUFHX05BTUVfSU5ERVgod2Fybl9hdXRvX3N0b3JhZ2VfY2xhc3MpCitESUFHX05BTUVfSU5ERVgod2Fybl9hdXRvX3N5bnRoZXNpemluZ19wcm90b2NvbF9wcm9wZXJ0eSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2F1dG9fdmFyX2lzX2lkKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXV0b3N5bnRoZXNpc19wcm9wZXJ0eV9pbl9zdXBlcmNsYXNzKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXV0b3N5bnRoZXNpc19wcm9wZXJ0eV9pdmFyX21hdGNoKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXZhaWxhYmlsaXR5X2FuZF91bmF2YWlsYWJsZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2F2YWlsYWJpbGl0eV91bmtub3duX3BsYXRmb3JtKQorRElBR19OQU1FX0lOREVYKHdhcm5fYXZhaWxhYmlsaXR5X3ZlcnNpb25fb3JkZXJpbmcpCitESUFHX05BTUVfSU5ERVgod2Fybl9iYWRfY2hhcmFjdGVyX2VuY29kaW5nKQorRElBR19OQU1FX0lOREVYKHdhcm5fYmFkX2Z1bmN0aW9uX2Nhc3QpCitESUFHX05BTUVfSU5ERVgod2Fybl9iYWRfcmVjZWl2ZXJfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2JhZF9zdHJpbmdfZW5jb2RpbmcpCitESUFHX05BTUVfSU5ERVgod2Fybl9iYXNlX2NsYXNzX2lzX3VuaW5pdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2JpbmRfcmVmX21lbWJlcl90b19wYXJhbWV0ZXIpCitESUFHX05BTUVfSU5ERVgod2Fybl9iaW5kX3JlZl9tZW1iZXJfdG9fdGVtcG9yYXJ5KQorRElBR19OQU1FX0lOREVYKHdhcm5fYmluZGluZ19udWxsX3RvX3JlZmVyZW5jZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2JpdGZpZWxkX3Rvb19zbWFsbF9mb3JfZW51bSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2JpdGZpZWxkX3dpZHRoX2V4Y2VlZHNfdHlwZV93aWR0aCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2JpdHdpc2Vfb3BfaW5fYml0d2lzZV9vcCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Jsb2NrX2NhcHR1cmVfYXV0b3JlbGVhc2luZykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Jsb2NrX2xpdGVyYWxfYXR0cmlidXRlc19vbl9vbWl0dGVkX3JldHVybl90eXBlKQorRElBR19OQU1FX0lOREVYKHdhcm5fYmxvY2tfbGl0ZXJhbF9xdWFsaWZpZXJzX29uX29taXR0ZWRfcmV0dXJuX3R5cGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9ib29sX3N3aXRjaF9jb25kaXRpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9icmFjZXNfYXJvdW5kX3NjYWxhcl9pbml0KQorRElBR19OQU1FX0lOREVYKHdhcm5fYnJlYWtfYmluZHNfdG9fc3dpdGNoKQorRElBR19OQU1FX0lOREVYKHdhcm5fYnVpbHRpbl91bmtub3duKQorRElBR19OQU1FX0lOREVYKHdhcm5fYzk5X2NvbXBhdF91bmljb2RlX2lkKQorRElBR19OQU1FX0lOREVYKHdhcm5fYzk5X2NvbXBhdF91bmljb2RlX2xpdGVyYWwpCitESUFHX05BTUVfSU5ERVgod2Fybl9jX2tleHQpCitESUFHX05BTUVfSU5ERVgod2Fybl9jYWxsX3RvX3B1cmVfdmlydHVhbF9tZW1iZXJfZnVuY3Rpb25fZnJvbV9jdG9yX2R0b3IpCitESUFHX05BTUVfSU5ERVgod2Fybl9jYWxsX3dyb25nX251bWJlcl9vZl9hcmd1bWVudHMpCitESUFHX05BTUVfSU5ERVgod2Fybl9jYW5ub3RfcGFzc19ub25fcG9kX2FyZ190b192YXJhcmcpCitESUFHX05BTUVfSU5ERVgod2Fybl9jYW5ub3RfcmVzb2x2ZV9sb2NrKQorRElBR19OQU1FX0lOREVYKHdhcm5fY2FzZV9lbXB0eV9yYW5nZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Nhc2VfdmFsdWVfb3ZlcmZsb3cpCitESUFHX05BTUVfSU5ERVgod2Fybl9jYXN0X2FsaWduKQorRElBR19OQU1FX0lOREVYKHdhcm5fY2FzdF9jYWxsaW5nX2NvbnYpCitESUFHX05BTUVfSU5ERVgod2Fybl9jYXN0X25vbm51bGxfdG9fYm9vbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Nhc3RfcG9pbnRlcl9mcm9tX3NlbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Nhc3RfcXVhbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Nhc3RfcXVhbDIpCitESUFHX05BTUVfSU5ERVgod2Fybl9jYXRlZ29yeV9tZXRob2RfaW1wbF9tYXRjaCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Njb252X2lnbm9yZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9jY29udl9rbnIpCitESUFHX05BTUVfSU5ERVgod2Fybl9jY29udl9zdHJ1Y3RvcnMpCitESUFHX05BTUVfSU5ERVgod2Fybl9jY29udl92YXJhcmdzKQorRElBR19OQU1FX0lOREVYKHdhcm5fY2R0b3JfZnVuY3Rpb25fdHJ5X2hhbmRsZXJfbWVtX2V4cHIpCitESUFHX05BTUVfSU5ERVgod2Fybl9jZnN0cmluZ190cnVuY2F0ZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9jaGFyX2NvbnN0YW50X3Rvb19sYXJnZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2NsYXNzX21ldGhvZF9ub3RfZm91bmQpCitESUFHX05BTUVfSU5ERVgod2Fybl9jbGFzc19tZXRob2Rfbm90X2ZvdW5kX3dpdGhfdHlwbykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2NsZWFudXBfZXh0KQorRElBR19OQU1FX0lOREVYKHdhcm5fY29jb2FfbmFtaW5nX293bmVkX3J1bGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9jb2xsZWN0aW9uX2V4cHJfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2NvbW1hX29wZXJhdG9yKQorRElBR19OQU1FX0lOREVYKHdhcm5fY29tcGFyaXNvbl9hbHdheXMpCitESUFHX05BTUVfSU5ERVgod2Fybl9jb21wYXJpc29uX2JpdHdpc2VfYWx3YXlzKQorRElBR19OQU1FX0lOREVYKHdhcm5fY29tcGFyaXNvbl9vZl9taXhlZF9lbnVtX3R5cGVzKQorRElBR19OQU1FX0lOREVYKHdhcm5fY29tcGFyaXNvbl9vZl9taXhlZF9lbnVtX3R5cGVzX3N3aXRjaCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2NvbmNhdGVuYXRlZF9uc2FycmF5X2xpdGVyYWwpCitESUFHX05BTUVfSU5ERVgod2Fybl9jb25kaXRpb25faXNfYXNzaWdubWVudCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2NvbmRpdGlvbl9pc19pZGlvbWF0aWNfYXNzaWdubWVudCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2NvbmZsaWN0aW5nX251bGxhYmlsaXR5X2F0dHJfb3ZlcnJpZGluZ19wYXJhbV90eXBlcykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2NvbmZsaWN0aW5nX251bGxhYmlsaXR5X2F0dHJfb3ZlcnJpZGluZ19yZXRfdHlwZXMpCitESUFHX05BTUVfSU5ERVgod2Fybl9jb25mbGljdGluZ19vdmVycmlkaW5nX3BhcmFtX21vZGlmaWVycykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2NvbmZsaWN0aW5nX292ZXJyaWRpbmdfcGFyYW1fdHlwZXMpCitESUFHX05BTUVfSU5ERVgod2Fybl9jb25mbGljdGluZ19vdmVycmlkaW5nX3JldF90eXBlX21vZGlmaWVycykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2NvbmZsaWN0aW5nX292ZXJyaWRpbmdfcmV0X3R5cGVzKQorRElBR19OQU1FX0lOREVYKHdhcm5fY29uZmxpY3Rpbmdfb3ZlcnJpZGluZ192YXJpYWRpYykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2NvbmZsaWN0aW5nX3BhcmFtX21vZGlmaWVycykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2NvbmZsaWN0aW5nX3BhcmFtX3R5cGVzKQorRElBR19OQU1FX0lOREVYKHdhcm5fY29uZmxpY3RpbmdfcmV0X3R5cGVfbW9kaWZpZXJzKQorRElBR19OQU1FX0lOREVYKHdhcm5fY29uZmxpY3RpbmdfcmV0X3R5cGVzKQorRElBR19OQU1FX0lOREVYKHdhcm5fY29uZmxpY3RpbmdfdmFyaWFkaWMpCitESUFHX05BTUVfSU5ERVgod2Fybl9jb252X3RvX2Jhc2Vfbm90X3VzZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9jb252X3RvX3NlbGZfbm90X3VzZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9jb252X3RvX3ZvaWRfbm90X3VzZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9jb3JvdXRpbmVfcHJvbWlzZV91bmhhbmRsZWRfZXhjZXB0aW9uX3JlcXVpcmVkX3dpdGhfZXhjZXB0aW9ucykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2NvcnJlY3RfY29tbWVudF9jb21tYW5kX25hbWUpCitESUFHX05BTUVfSU5ERVgod2Fybl9jc3R5bGVfcGFyYW0pCitESUFHX05BTUVfSU5ERVgod2Fybl9jdG9yX3Bhcm1fc2hhZG93c19maWVsZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N1ZGFfYXR0cl9sYW1iZGFfcG9zaXRpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHgxMV9jb21wYXRfYmluYXJ5X2xpdGVyYWwpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHgxMV9jb21wYXRfY29uc3RleHByX2JvZHlfaW52YWxpZF9zdG10KQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4MTFfY29tcGF0X2NvbnN0ZXhwcl9ib2R5X211bHRpcGxlX3JldHVybikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDExX2NvbXBhdF9jb25zdGV4cHJfYm9keV9ub19yZXR1cm4pCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHgxMV9jb21wYXRfY29uc3RleHByX2xvY2FsX3ZhcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDExX2NvbXBhdF9jb25zdGV4cHJfdHlwZV9kZWZpbml0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4MTFfY29tcGF0X2RlY2x0eXBlX2F1dG9fdHlwZV9zcGVjaWZpZXIpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHgxMV9jb21wYXRfZGlnaXRfc2VwYXJhdG9yKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4MTFfY29tcGF0X2luaXRfY2FwdHVyZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDExX2NvbXBhdF9yZXNlcnZlZF91c2VyX2RlZmluZWRfbGl0ZXJhbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDExX2NvbXBhdF91c2VyX2RlZmluZWRfbGl0ZXJhbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDExX2NvbXBhdF92YXJpYWJsZV90ZW1wbGF0ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDExX2dudV9hdHRyaWJ1dGVfb25fdHlwZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDExX2tleXdvcmQpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHgxMV9yaWdodF9zaGlmdF9pbl90ZW1wbGF0ZV9hcmcpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHgxNF9jb21wYXRfY29uc3RleHByX2lmKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4MTRfY29tcGF0X2NvbnN0ZXhwcl9ub3RfY29uc3QpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHgxNF9jb21wYXRfY29uc3RleHByX29uX2xhbWJkYSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDE0X2NvbXBhdF9kZWNvbXBfZGVjbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDE0X2NvbXBhdF9mb2xkX2V4cHJlc3Npb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHgxNF9jb21wYXRfaW5pdF9zdGF0ZW1lbnQpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHgxNF9jb21wYXRfaW5saW5lX3ZhcmlhYmxlKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4MTRfY29tcGF0X25lc3RlZF9uYW1lc3BhY2VfZGVmaW5pdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDE0X2NvbXBhdF9uc19lbnVtX2F0dHJpYnV0ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDE0X2NvbXBhdF9zdGFyX3RoaXNfbGFtYmRhX2NhcHR1cmUpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHgxNF9jb21wYXRfc3RhdGljX2Fzc2VydF9ub19tZXNzYWdlKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4MTRfY29tcGF0X3RlbXBsYXRlX25vbnR5cGVfcGFybV9hdXRvX3R5cGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHgxNF9jb21wYXRfdGVtcGxhdGVfdGVtcGxhdGVfcGFyYW1fdHlwZW5hbWUpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHgxNF9jb21wYXRfdThfY2hhcmFjdGVyX2xpdGVyYWwpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHgxNF9jb21wYXRfdXNpbmdfYXR0cmlidXRlX25zKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4MTdfY29tcGF0X2JpdGZpZWxkX21lbWJlcl9pbml0KQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4MTdfY29tcGF0X2VxdWFsc190aGlzX2xhbWJkYV9jYXB0dXJlKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4MTdfY29tcGF0X2V4Y2VwdGlvbl9zcGVjX2luX3NpZ25hdHVyZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDE3X2NvbXBhdF9tdWx0aV91c2luZ19kZWNsYXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDE3X2NvbXBhdF9wb2ludGVyX3RvX2NvbnN0X3JlZl9tZW1iZXJfb25fcnZhbHVlKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4MTdfY29tcGF0X3NwYWNlc2hpcCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDE3X2NvbXBhdF91c2luZ19kZWNsYXJhdGlvbl9wYWNrKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4MTdfaGV4X2xpdGVyYWwpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHgyYV9jb21wYXRfc3BhY2VzaGlwKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4MmFfa2V5d29yZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF9hbGlhc19kZWNsYXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF9hbGlnbmFzKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X2FsaWdub2YpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfYXJyYXlfc2l6ZV9jb252ZXJzaW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X2F0dHJpYnV0ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF9hdXRvX3R5cGVfc3BlY2lmaWVyKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X2Nhc3RfZm5fb2JqKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X2NvbnN0ZXhwcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF9jdG9yX2xpc3RfaW5pdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF9kZWNsdHlwZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF9kZWZhdWx0ZWRfZGVsZXRlZF9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF9kZWxlZ2F0aW5nX2N0b3IpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfZW1wdHlfZm5tYWNyb19hcmcpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfZW1wdHlfc2NhbGFyX2luaXRpYWxpemVyKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X2VudW1fZml4ZWRfdW5kZXJseWluZ190eXBlKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X2VudW1fZnJpZW5kKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X2VudW1fbmVzdGVkX25hbWVfc3BlYykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF9lbnVtZXJhdG9yX2xpc3RfY29tbWEpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfZXhwbGljaXRfY29udmVyc2lvbl9mdW5jdGlvbnMpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfZXh0ZXJuX3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X2Zvcl9yYW5nZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF9mcmllbmRfaXNfbWVtYmVyKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X2dlbmVyYWxpemVkX2luaXRpYWxpemVyX2xpc3RzKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X2dvdG9faW50b19wcm90ZWN0ZWRfc2NvcGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfaW5kaXJlY3RfZ290b19pbl9wcm90ZWN0ZWRfc2NvcGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfaW5pdGlhbGl6ZXJfbGlzdF9pbml0KQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X2lubGluZV9uYW1lc3BhY2UpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfbGFtYmRhKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X2xlc3NfY29sb25fY29sb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfbGl0ZXJhbF9vcGVyYXRvcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF9saXRlcmFsX3Vjbl9jb250cm9sX2NoYXJhY3RlcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF9saXRlcmFsX3Vjbl9lc2NhcGVfYmFzaWNfc2NzKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X2xvbmdsb25nKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X25vX25ld2xpbmVfZW9mKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X25vZXhjZXB0X2RlY2wpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfbm9leGNlcHRfZXhwcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF9ub25fc3RhdGljX21lbWJlcl91c2UpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfbm9uY2xhc3NfdHlwZV9mcmllbmQpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfbm9uc3RhdGljX21lbWJlcl9pbml0KQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X25vbnRyaXZpYWxfdW5pb25fb3JfYW5vbl9zdHJ1Y3RfbWVtYmVyKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X251bGxwdHIpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfb3ZlcnJpZGVfY29udHJvbF9rZXl3b3JkKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X3Bhc3Nfbm9uX3BvZF9hcmdfdG9fdmFyYXJnKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X3BwX2xpbmVfdG9vX2JpZykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF9yYXdfc3RyaW5nX2xpdGVyYWwpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfcmVmX3F1YWxpZmllcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF9yZWZlcmVuY2VfbGlzdF9pbml0KQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X3J2YWx1ZV9yZWZlcmVuY2UpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfc2NvcGVkX2VudW0pCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfc2ZpbmFlX2FjY2Vzc19jb250cm9sKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X3N0YXRpY19hc3NlcnQpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfc3RhdGljX2RhdGFfbWVtYmVyX2luX3VuaW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X3N3aXRjaF9pbnRvX3Byb3RlY3RlZF9zY29wZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF90ZW1wX2NvcHkpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfdGVtcGxhdGVfYXJnX2V4dHJhX3BhcmVucykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF90ZW1wbGF0ZV9hcmdfbG9jYWxfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF90ZW1wbGF0ZV9hcmdfbnVsbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF90ZW1wbGF0ZV9hcmdfb2JqZWN0X2ludGVybmFsKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X3RlbXBsYXRlX2FyZ191bm5hbWVkX3R5cGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfdGVtcGxhdGVfb3V0c2lkZV9vZl90ZW1wbGF0ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF90ZW1wbGF0ZV9wYXJhbWV0ZXJfZGVmYXVsdF9pbl9mdW5jdGlvbl90ZW1wbGF0ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF90b3BfbGV2ZWxfc2VtaSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF90cmFpbGluZ19yZXR1cm5fdHlwZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF90d29fcmlnaHRfYW5nbGVfYnJhY2tldHMpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfdHlwZW5hbWVfb3V0c2lkZV9vZl90ZW1wbGF0ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF91bmVsYWJvcmF0ZWRfZnJpZW5kX3R5cGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfdW5pY29kZV9pZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2N4eDk4X2NvbXBhdF91bmljb2RlX2xpdGVyYWwpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfdW5pY29kZV90eXBlKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4OThfY29tcGF0X3VzaW5nX2RlY2xfY29uc3RydWN0b3IpCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfdmFyaWFkaWNfbWFjcm8pCitESUFHX05BTUVfSU5ERVgod2Fybl9jeHg5OF9jb21wYXRfdmFyaWFkaWNfdGVtcGxhdGVzKQorRElBR19OQU1FX0lOREVYKHdhcm5fY3h4X21zX3N0cnVjdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RhbmdsaW5nX2Vsc2UpCitESUFHX05BTUVfSU5ERVgod2Fybl9kYW5nbGluZ19zdGRfaW5pdGlhbGl6ZXJfbGlzdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RlYWxsb2NfaW5fY2F0ZWdvcnkpCitESUFHX05BTUVfSU5ERVgod2Fybl9kZWJ1Z19jb21wcmVzc2lvbl91bmF2YWlsYWJsZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RlY2xfaW5fcGFyYW1fbGlzdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RlY2xfc2hhZG93KQorRElBR19OQU1FX0lOREVYKHdhcm5fZGVjbF9zaGFkb3dfdW5jYXB0dXJlZF9sb2NhbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RlY2xzcGVjX2F0dHJpYnV0ZV9pZ25vcmVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fZGVlcF9leGNlcHRpb25fc3BlY3NfZGlmZmVyKQorRElBR19OQU1FX0lOREVYKHdhcm5fZGVmX21pc3NpbmdfY2FzZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RlZmF1bHRfYXRvbWljX2N1c3RvbV9nZXR0ZXJfc2V0dGVyKQorRElBR19OQU1FX0lOREVYKHdhcm5fZGVmaW5lZF9pbl9mdW5jdGlvbl90eXBlX21hY3JvKQorRElBR19OQU1FX0lOREVYKHdhcm5fZGVmaW5lZF9pbl9vYmplY3RfdHlwZV9tYWNybykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RlbGVnYXRpbmdfY3Rvcl9jeWNsZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RlbGV0ZV9hYnN0cmFjdF9ub25fdmlydHVhbF9kdG9yKQorRElBR19OQU1FX0lOREVYKHdhcm5fZGVsZXRlX2FycmF5X3R5cGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9kZWxldGVfaW5jb21wbGV0ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RlbGV0ZV9ub25fdmlydHVhbF9kdG9yKQorRElBR19OQU1FX0lOREVYKHdhcm5fZGVwcmVjYXRlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RlcHJlY2F0ZWRfYW5vbnltb3VzX25hbWVzcGFjZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RlcHJlY2F0ZWRfY29weV9vcGVyYXRpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9kZXByZWNhdGVkX2RlZikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RlcHJlY2F0ZWRfZndkY2xhc3NfbWVzc2FnZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RlcHJlY2F0ZWRfbWVzc2FnZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RlcHJlY2F0ZWRfcmVkdW5kYW50X2NvbnN0ZXhwcl9zdGF0aWNfZGVmKQorRElBR19OQU1FX0lOREVYKHdhcm5fZGVwcmVjYXRlZF9yZWdpc3RlcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RlcHJlY2F0ZWRfc3RyaW5nX2xpdGVyYWxfY29udmVyc2lvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Rlc3RydWN0b3JfbWFya2VkX25vdF9vdmVycmlkZV9vdmVycmlkaW5nKQorRElBR19OQU1FX0lOREVYKHdhcm5fZGlhZ25vc2VfaWZfc3VjY2VlZGVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fZGlyZWN0X2luaXRpYWxpemVfY2FsbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RpcmVjdF9pdmFyX2FjY2VzcykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RpcmVjdF9zdXBlcl9pbml0aWFsaXplX2NhbGwpCitESUFHX05BTUVfSU5ERVgod2Fybl9kbGxpbXBvcnRfZHJvcHBlZF9mcm9tX2lubGluZV9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RvY19hcGlfY29udGFpbmVyX2RlY2xfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgod2Fybl9kb2NfYmxvY2tfY29tbWFuZF9kdXBsaWNhdGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9kb2NfYmxvY2tfY29tbWFuZF9lbXB0eV9wYXJhZ3JhcGgpCitESUFHX05BTUVfSU5ERVgod2Fybl9kb2NfY29udGFpbmVyX2RlY2xfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgod2Fybl9kb2NfZGVwcmVjYXRlZF9ub3Rfc3luYykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RvY19mdW5jdGlvbl9tZXRob2RfZGVjbF9taXNtYXRjaCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RvY19odG1sX2VuZF9mb3JiaWRkZW4pCitESUFHX05BTUVfSU5ERVgod2Fybl9kb2NfaHRtbF9lbmRfdW5iYWxhbmNlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RvY19odG1sX21pc3NpbmdfZW5kX3RhZykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RvY19odG1sX3N0YXJ0X2VuZF9taXNtYXRjaCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RvY19odG1sX3N0YXJ0X3RhZ19leHBlY3RlZF9pZGVudF9vcl9ncmVhdGVyKQorRElBR19OQU1FX0lOREVYKHdhcm5fZG9jX2h0bWxfc3RhcnRfdGFnX2V4cGVjdGVkX3F1b3RlZF9zdHJpbmcpCitESUFHX05BTUVfSU5ERVgod2Fybl9kb2NfcGFyYW1fZHVwbGljYXRlKQorRElBR19OQU1FX0lOREVYKHdhcm5fZG9jX3BhcmFtX2ludmFsaWRfZGlyZWN0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fZG9jX3BhcmFtX25vdF9hdHRhY2hlZF90b19hX2Z1bmN0aW9uX2RlY2wpCitESUFHX05BTUVfSU5ERVgod2Fybl9kb2NfcGFyYW1fbm90X2ZvdW5kKQorRElBR19OQU1FX0lOREVYKHdhcm5fZG9jX3BhcmFtX3NwYWNlc19pbl9kaXJlY3Rpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9kb2NfcmV0dXJuc19hdHRhY2hlZF90b19hX3ZvaWRfZnVuY3Rpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9kb2NfcmV0dXJuc19ub3RfYXR0YWNoZWRfdG9fYV9mdW5jdGlvbl9kZWNsKQorRElBR19OQU1FX0lOREVYKHdhcm5fZG9jX3RwYXJhbV9kdXBsaWNhdGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9kb2NfdHBhcmFtX25vdF9hdHRhY2hlZF90b19hX3RlbXBsYXRlX2RlY2wpCitESUFHX05BTUVfSU5ERVgod2Fybl9kb2NfdHBhcmFtX25vdF9mb3VuZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2RvdWJsZV9jb25zdF9yZXF1aXJlc19mcDY0KQorRElBR19OQU1FX0lOREVYKHdhcm5fZG91YmxlX2xvY2spCitESUFHX05BTUVfSU5ERVgod2Fybl9kcnZfYXNzdW1pbmdfbWZsb2F0X2FiaV9pcykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Rydl9jbGFuZ191bnN1cHBvcnRlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Rydl9kZXByZWNhdGVkX2FyZykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Rydl9kaWFnbm9zdGljc19ob3RuZXNzX3JlcXVpcmVzX3BnbykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Rydl9kaXNhYmxpbmdfdnB0cl9ub19ydHRpX2RlZmF1bHQpCitESUFHX05BTUVfSU5ERVgod2Fybl9kcnZfZW1wdHlfam9pbmVkX2FyZ3VtZW50KQorRElBR19OQU1FX0lOREVYKHdhcm5fZHJ2X2VuYWJsaW5nX3J0dGlfd2l0aF9leGNlcHRpb25zKQorRElBR19OQU1FX0lOREVYKHdhcm5fZHJ2X2V4cGVyaW1lbnRhbF9pc2VsX2luY29tcGxldGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9kcnZfZXhwZXJpbWVudGFsX2lzZWxfaW5jb21wbGV0ZV9vcHQpCitESUFHX05BTUVfSU5ERVgod2Fybl9kcnZfZmluZV9ncmFpbmVkX2JpdGZpZWxkX2FjY2Vzc2VzX2lnbm9yZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9kcnZfaW5wdXRfZmlsZV91bnVzZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9kcnZfaW5wdXRfZmlsZV91bnVzZWRfYnlfY3BwKQorRElBR19OQU1FX0lOREVYKHdhcm5fZHJ2X2ludm9raW5nX2ZhbGxiYWNrKQorRElBR19OQU1FX0lOREVYKHdhcm5fZHJ2X21zdmNfbm90X2ZvdW5kKQorRElBR19OQU1FX0lOREVYKHdhcm5fZHJ2X29iamVjdF9zaXplX2Rpc2FibGVkX08wKQorRElBR19OQU1FX0lOREVYKHdhcm5fZHJ2X29tcF9vZmZsb2FkX3RhcmdldF9kdXBsaWNhdGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9kcnZfb21wX29mZmxvYWRfdGFyZ2V0X21pc3NpbmdiY3J1bnRpbWUpCitESUFHX05BTUVfSU5ERVgod2Fybl9kcnZfb3B0aW1pemF0aW9uX3ZhbHVlKQorRElBR19OQU1FX0lOREVYKHdhcm5fZHJ2X292ZXJyaWRpbmdfZmxhZ19vcHRpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9kcnZfcGNoX25vdF9maXJzdF9pbmNsdWRlKQorRElBR19OQU1FX0lOREVYKHdhcm5fZHJ2X3ByZXByb2Nlc3NlZF9pbnB1dF9maWxlX3VudXNlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Rydl9wczRfZm9yY2VfcGljKQorRElBR19OQU1FX0lOREVYKHdhcm5fZHJ2X3BzNF9zZGtfZGlyKQorRElBR19OQU1FX0lOREVYKHdhcm5fZHJ2X3RyZWF0aW5nX2lucHV0X2FzX2N4eCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Rydl91bmFibGVfdG9fZmluZF9kaXJlY3RvcnlfZXhwZWN0ZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9kcnZfdW5rbm93bl9hcmd1bWVudF9jbGFuZ19jbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Rydl91bmtub3duX2FyZ3VtZW50X2NsYW5nX2NsX3dpdGhfc3VnZ2VzdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Rydl91bnN1cHBvcnRlZF9hYmljYWxscykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Rydl91bnN1cHBvcnRlZF9ncG9wdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Rydl91bnN1cHBvcnRlZF9sb25nY2FsbHMpCitESUFHX05BTUVfSU5ERVgod2Fybl9kcnZfdW5zdXBwb3J0ZWRfb3B0X2Zvcl90YXJnZXQpCitESUFHX05BTUVfSU5ERVgod2Fybl9kcnZfdW51c2VkX2FyZ3VtZW50KQorRElBR19OQU1FX0lOREVYKHdhcm5fZHJ2X3ljX211bHRpcGxlX2lucHV0c19jbGFuZ19jbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Rydl95Y3l1X2RpZmZlcmVudF9hcmdfY2xhbmdfY2wpCitESUFHX05BTUVfSU5ERVgod2Fybl9kcnZfeWN5dV9ub19hcmdfY2xhbmdfY2wpCitESUFHX05BTUVfSU5ERVgod2Fybl9kcnZfeWN5dV9ub19maV9hcmdfY2xhbmdfY2wpCitESUFHX05BTUVfSU5ERVgod2Fybl9kdXBfY2F0ZWdvcnlfZGVmKQorRElBR19OQU1FX0lOREVYKHdhcm5fZHVwbGljYXRlX2F0dHJpYnV0ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2R1cGxpY2F0ZV9hdHRyaWJ1dGVfZXhhY3QpCitESUFHX05BTUVfSU5ERVgod2Fybl9kdXBsaWNhdGVfZGVjbHNwZWMpCitESUFHX05BTUVfSU5ERVgod2Fybl9kdXBsaWNhdGVfZW51bV92YWx1ZXMpCitESUFHX05BTUVfSU5ERVgod2Fybl9kdXBsaWNhdGVfbWV0aG9kX2RlY2wpCitESUFHX05BTUVfSU5ERVgod2Fybl9kdXBsaWNhdGVfbW9kdWxlX2ZpbGVfZXh0ZW5zaW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fZHVwbGljYXRlX3Byb3RvY29sX2RlZikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2R5bl9jbGFzc19tZW1hY2Nlc3MpCitESUFHX05BTUVfSU5ERVgod2Fybl9lbXB0eV9mb3JfYm9keSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2VtcHR5X2Zvcm1hdF9zdHJpbmcpCitESUFHX05BTUVfSU5ERVgod2Fybl9lbXB0eV9pZl9ib2R5KQorRElBR19OQU1FX0lOREVYKHdhcm5fZW1wdHlfcGFyZW5zX2FyZV9mdW5jdGlvbl9kZWNsKQorRElBR19OQU1FX0lOREVYKHdhcm5fZW1wdHlfcmFuZ2VfYmFzZWRfZm9yX2JvZHkpCitESUFHX05BTUVfSU5ERVgod2Fybl9lbXB0eV9zd2l0Y2hfYm9keSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2VtcHR5X3doaWxlX2JvZHkpCitESUFHX05BTUVfSU5ERVgod2Fybl9lbnVtX3ZhbHVlX292ZXJmbG93KQorRElBR19OQU1FX0lOREVYKHdhcm5fZXF1YWxpdHlfd2l0aF9leHRyYV9wYXJlbnMpCitESUFHX05BTUVfSU5ERVgod2Fybl9leGNlcHRpb25fY2F1Z2h0X2J5X2VhcmxpZXJfaGFuZGxlcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2V4Y2VwdGlvbl9zcGVjX2RlcHJlY2F0ZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9leGl0X3RpbWVfZGVzdHJ1Y3RvcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2V4cGVjdGVkX2NvbnNpc3RlbnRfdmVyc2lvbl9zZXBhcmF0b3IpCitESUFHX05BTUVfSU5ERVgod2Fybl9leHBlY3RlZF9xdWFsaWZpZWRfYWZ0ZXJfdHlwZW5hbWUpCitESUFHX05BTUVfSU5ERVgod2Fybl9leHBlY3RpbmdfbG9ja19oZWxkX29uX2xvb3ApCitESUFHX05BTUVfSU5ERVgod2Fybl9leHBlY3RpbmdfbG9ja2VkKQorRElBR19OQU1FX0lOREVYKHdhcm5fZXhwbGljaXRfaW5zdGFudGlhdGlvbl9hZnRlcl9zcGVjaWFsaXphdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2V4cGxpY2l0X2luc3RhbnRpYXRpb25faW5saW5lXzB4KQorRElBR19OQU1FX0lOREVYKHdhcm5fZXhwbGljaXRfaW5zdGFudGlhdGlvbl9tdXN0X2JlX2dsb2JhbF8weCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2V4cGxpY2l0X2luc3RhbnRpYXRpb25fb3V0X29mX3Njb3BlXzB4KQorRElBR19OQU1FX0lOREVYKHdhcm5fZXhwbGljaXRfaW5zdGFudGlhdGlvbl91bnF1YWxpZmllZF93cm9uZ19uYW1lc3BhY2VfMHgpCitESUFHX05BTUVfSU5ERVgod2Fybl9leHRlcm5faW5pdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2V4dHJhX3NlbWlfYWZ0ZXJfbWVtX2ZuX2RlZikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2V4dHJhbmVvdXNfY2hhcl9jb25zdGFudCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ZhbGxvZmZfbm9udm9pZF9jb3JvdXRpbmUpCitESUFHX05BTUVfSU5ERVgod2Fybl9mYWxsb2ZmX25vbnZvaWRfZnVuY3Rpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9mYWxsb2ZmX25vbnZvaWRfbGFtYmRhKQorRElBR19OQU1FX0lOREVYKHdhcm5fZmFsbG9mZl9ub3JldHVybl9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ZhbGx0aHJvdWdoX2F0dHJfdW5yZWFjaGFibGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9mZV9iYWNrZW5kX2ZyYW1lX2xhcmdlcl90aGFuKQorRElBR19OQU1FX0lOREVYKHdhcm5fZmVfYmFja2VuZF9vcHRpbWl6YXRpb25fZmFpbHVyZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ZlX2JhY2tlbmRfcGx1Z2luKQorRElBR19OQU1FX0lOREVYKHdhcm5fZmVfY2NfbG9nX2RpYWdub3N0aWNzX2ZhaWx1cmUpCitESUFHX05BTUVfSU5ERVgod2Fybl9mZV9jY19wcmludF9oZWFkZXJfZmFpbHVyZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ZlX2ZyYW1lX2xhcmdlcl90aGFuKQorRElBR19OQU1FX0lOREVYKHdhcm5fZmVfaW5saW5lX2FzbSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ZlX21hY3JvX2NvbnRhaW5zX2VtYmVkZGVkX25ld2xpbmUpCitESUFHX05BTUVfSU5ERVgod2Fybl9mZV9vdmVycmlkZV9tb2R1bGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9mZV9zZXJpYWxpemVkX2RpYWdfZmFpbHVyZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ZlX3NlcmlhbGl6ZWRfZGlhZ19tZXJnZV9mYWlsdXJlKQorRElBR19OQU1FX0lOREVYKHdhcm5fZmVfdW5hYmxlX3RvX29wZW5fc3RhdHNfZmlsZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ZpZWxkX2lzX3VuaW5pdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ZpbGVfYXNtX3ZvbGF0aWxlKQorRElBR19OQU1FX0lOREVYKHdhcm5fZml4aXRfbm9fY2hhbmdlcykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ZsYWdfZW51bV9jb25zdGFudF9vdXRfb2ZfcmFuZ2UpCitESUFHX05BTUVfSU5ERVgod2Fybl9mbG9hdF9vdmVyZmxvdykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Zsb2F0X3VuZGVyZmxvdykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Zsb2F0aW5ncG9pbnRfZXEpCitESUFHX05BTUVfSU5ERVgod2Fybl9mb3JfcmFuZ2VfYmVnaW5fZW5kX3R5cGVzX2RpZmZlcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Zvcl9yYW5nZV9jb25zdF9yZWZlcmVuY2VfY29weSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Zvcl9yYW5nZV9jb3B5KQorRElBR19OQU1FX0lOREVYKHdhcm5fZm9yX3JhbmdlX3ZhcmlhYmxlX2Fsd2F5c19jb3B5KQorRElBR19OQU1FX0lOREVYKHdhcm5fZm9ybWF0X1Bfbm9fcHJlY2lzaW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fZm9ybWF0X2FyZ3VtZW50X25lZWRzX2Nhc3QpCitESUFHX05BTUVfSU5ERVgod2Fybl9mb3JtYXRfY29udmVyc2lvbl9hcmd1bWVudF90eXBlX21pc21hdGNoKQorRElBR19OQU1FX0lOREVYKHdhcm5fZm9ybWF0X2NvbnZlcnNpb25fYXJndW1lbnRfdHlwZV9taXNtYXRjaF9wZWRhbnRpYykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Zvcm1hdF9pbnZhbGlkX2Fubm90YXRpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9mb3JtYXRfaW52YWxpZF9jb252ZXJzaW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fZm9ybWF0X2ludmFsaWRfcG9zaXRpb25hbF9zcGVjaWZpZXIpCitESUFHX05BTUVfSU5ERVgod2Fybl9mb3JtYXRfbWl4X3Bvc2l0aW9uYWxfbm9ucG9zaXRpb25hbF9hcmdzKQorRElBR19OQU1FX0lOREVYKHdhcm5fZm9ybWF0X25vbl9zdGFuZGFyZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Zvcm1hdF9ub25fc3RhbmRhcmRfY29udmVyc2lvbl9zcGVjKQorRElBR19OQU1FX0lOREVYKHdhcm5fZm9ybWF0X25vbl9zdGFuZGFyZF9wb3NpdGlvbmFsX2FyZykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Zvcm1hdF9ub25saXRlcmFsKQorRElBR19OQU1FX0lOREVYKHdhcm5fZm9ybWF0X25vbmxpdGVyYWxfbm9hcmdzKQorRElBR19OQU1FX0lOREVYKHdhcm5fZm9ybWF0X25vbnNlbnNpY2FsX2xlbmd0aCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Zvcm1hdF9zdHJpbmdfaXNfd2lkZV9saXRlcmFsKQorRElBR19OQU1FX0lOREVYKHdhcm5fZm9ybWF0X3plcm9fcG9zaXRpb25hbF9zcGVjaWZpZXIpCitESUFHX05BTUVfSU5ERVgod2Fybl9mb3J3YXJkX2NsYXNzX3JlZGVmaW5pdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Z1bl9leGNsdWRlc19tdXRleCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Z1bl9yZXF1aXJlc19sb2NrKQorRElBR19OQU1FX0lOREVYKHdhcm5fZnVuX3JlcXVpcmVzX2xvY2tfcHJlY2lzZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Z1bmNfdGVtcGxhdGVfbWlzc2luZykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Z1bmN0aW9uX2RlZl9pbl9vYmpjX2NvbnRhaW5lcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2Z1bmN0aW9uX21hcmtlZF9ub3Rfb3ZlcnJpZGVfb3ZlcnJpZGluZykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2djX2F0dHJpYnV0ZV93ZWFrX29uX2xvY2FsKQorRElBR19OQU1FX0lOREVYKHdhcm5fZ2NjX2F0dHJpYnV0ZV9sb2NhdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2dsb2JhbF9jb25zdHJ1Y3RvcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2dsb2JhbF9kZXN0cnVjdG9yKQorRElBR19OQU1FX0lOREVYKHdhcm5fZ251X2lubGluZV9hdHRyaWJ1dGVfcmVxdWlyZXNfaW5saW5lKQorRElBR19OQU1FX0lOREVYKHdhcm5fZ251X251bGxfcHRyX2FyaXRoKQorRElBR19OQU1FX0lOREVYKHdhcm5fZ3VhcmRlZF9wYXNzX2J5X3JlZmVyZW5jZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2hhc193YXJuaW5nX2ludmFsaWRfb3B0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5faGVhZGVyX2d1YXJkKQorRElBR19OQU1FX0lOREVYKHdhcm5faWJvdXRsZXRfb2JqZWN0X3R5cGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9pYm91dGxldGNvbGxlY3Rpb25fcHJvcGVydHlfYXNzaWduKQorRElBR19OQU1FX0lOREVYKHdhcm5faWRlbnRpdHlfZmllbGRfYXNzaWduKQorRElBR19OQU1FX0lOREVYKHdhcm5faWdub3JlZF9jbGFuZ19vcHRpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9pZ25vcmVkX2djY19vcHRpbWl6YXRpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9pZ25vcmVkX21zX2luaGVyaXRhbmNlKQorRElBR19OQU1FX0lOREVYKHdhcm5faWdub3JpbmdfZnRhYnN0b3BfdmFsdWUpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbGxlZ2FsX2NvbnN0YW50X2FycmF5X3NpemUpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbXBjYXN0X2JpdGZpZWxkX3ByZWNpc2lvbl9jb25zdGFudCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ltcGNhc3RfYm9vbF90b19udWxsX3BvaW50ZXIpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbXBjYXN0X2NvbXBsZXhfc2NhbGFyKQorRElBR19OQU1FX0lOREVYKHdhcm5faW1wY2FzdF9kaWZmZXJlbnRfZW51bV90eXBlcykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ltcGNhc3RfZG91YmxlX3Byb21vdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ltcGNhc3RfZmxvYXRfaW50ZWdlcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ltcGNhc3RfZmxvYXRfcHJlY2lzaW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5faW1wY2FzdF9mbG9hdF9yZXN1bHRfcHJlY2lzaW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5faW1wY2FzdF9mbG9hdF90b19pbnRlZ2VyKQorRElBR19OQU1FX0lOREVYKHdhcm5faW1wY2FzdF9mbG9hdF90b19pbnRlZ2VyX3plcm8pCitESUFHX05BTUVfSU5ERVgod2Fybl9pbXBjYXN0X2Zsb2F0aW5nX3BvaW50X3RvX2Jvb2wpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbXBjYXN0X2ludGVnZXJfNjRfMzIpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbXBjYXN0X2ludGVnZXJfcHJlY2lzaW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5faW1wY2FzdF9pbnRlZ2VyX3ByZWNpc2lvbl9jb25zdGFudCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ltcGNhc3RfaW50ZWdlcl9zaWduKQorRElBR19OQU1FX0lOREVYKHdhcm5faW1wY2FzdF9pbnRlZ2VyX3NpZ25fY29uZGl0aW9uYWwpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbXBjYXN0X2xpdGVyYWxfZmxvYXRfdG9faW50ZWdlcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ltcGNhc3RfbnVsbF9wb2ludGVyX3RvX2ludGVnZXIpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbXBjYXN0X29iamVjdGl2ZV9jX2xpdGVyYWxfdG9fYm9vbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ltcGNhc3RfcG9pbnRlcl90b19ib29sKQorRElBR19OQU1FX0lOREVYKHdhcm5faW1wY2FzdF9zdHJpbmdfbGl0ZXJhbF90b19ib29sKQorRElBR19OQU1FX0lOREVYKHdhcm5faW1wY2FzdF92ZWN0b3Jfc2NhbGFyKQorRElBR19OQU1FX0lOREVYKHdhcm5faW1wbF9yZXF1aXJlZF9mb3JfY2xhc3NfcHJvcGVydHkpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbXBsX3JlcXVpcmVkX2luX2NhdGVnb3J5X2Zvcl9jbGFzc19wcm9wZXJ0eSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ltcGxlbWVudHNfbnNjb3B5aW5nKQorRElBR19OQU1FX0lOREVYKHdhcm5faW1wbGljaXRfYXRvbWljX3Byb3BlcnR5KQorRElBR19OQU1FX0lOREVYKHdhcm5faW1wbGljaXRfZGVjbF9yZXF1aXJlc19zeXNoZWFkZXIpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbXBsaWNpdF9mdW5jdGlvbl9kZWNsKQorRElBR19OQU1FX0lOREVYKHdhcm5faW1wbGljaXRseV9yZXRhaW5zX3NlbGYpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbmFjY2Vzc2libGVfYmFzZV9jbGFzcykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2luY29tcGF0aWJsZV9hbmFseXplcl9wbHVnaW5fYXBpKQorRElBR19OQU1FX0lOREVYKHdhcm5faW5jb21wYXRpYmxlX2V4Y2VwdGlvbl9zcGVjcykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2luY29tcGF0aWJsZV9xdWFsaWZpZWRfaWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbmNvbXBhdGlibGVfc3lzcm9vdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2luY29tcGF0aWJsZV92ZWN0b3JzKQorRElBR19OQU1FX0lOREVYKHdhcm5faW5jb21wbGV0ZV9lbmNvZGVkX3R5cGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbmNyZW1lbnRfYm9vbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2luZGVwZW5kZW50Y2xhc3NfYXR0cmlidXRlKQorRElBR19OQU1FX0lOREVYKHdhcm5faW5kaXJlY3Rpb25fdGhyb3VnaF9udWxsKQorRElBR19OQU1FX0lOREVYKHdhcm5faW5maW5pdGVfcmVjdXJzaXZlX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5faW5pdF9saXN0X2NvbnN0YW50X25hcnJvd2luZykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2luaXRfbGlzdF90eXBlX25hcnJvd2luZykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2luaXRfbGlzdF92YXJpYWJsZV9uYXJyb3dpbmcpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbml0X3B0cl9tZW1iZXJfdG9fcGFyYW1ldGVyX2FkZHIpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbml0aWFsaXplcl9vdXRfb2Zfb3JkZXIpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbml0aWFsaXplcl9vdmVycmlkZXMpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbmxpbmVfbmFtZXNwYWNlX3Jlb3BlbmVkX25vbmlubGluZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2luc3RfbWV0aG9kX25vdF9mb3VuZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2luc3RhbmNlX21ldGhvZF9ub3RfZm91bmRfd2l0aF90eXBvKQorRElBR19OQU1FX0lOREVYKHdhcm5faW5zdGFuY2VfbWV0aG9kX29uX2NsYXNzX2ZvdW5kKQorRElBR19OQU1FX0lOREVYKHdhcm5faW50X3RvX3BvaW50ZXJfY2FzdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ludF90b192b2lkX3BvaW50ZXJfY2FzdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ludGVnZXJfY29uc3RhbnRfb3ZlcmZsb3cpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbnRlcm5hbF9saW5rYWdlX2xvY2FsX3N0b3JhZ2UpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbnZhbGlkX2FzbV9jYXN0X2x2YWx1ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2ludmFsaWRfY2FwYWJpbGl0eV9uYW1lKQorRElBR19OQU1FX0lOREVYKHdhcm5faW52YWxpZF9pbml0aWFsaXplcl9mcm9tX3N5c3RlbV9oZWFkZXIpCitESUFHX05BTUVfSU5ERVgod2Fybl9pbnZhbGlkX2lvc19kZXBsb3ltZW50X3RhcmdldCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2l2YXJfdXNlX2hpZGRlbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2l2YXJzX2luX2ludGVyZmFjZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2p1bXBfb3V0X29mX3NlaF9maW5hbGx5KQorRElBR19OQU1FX0lOREVYKHdhcm5fa2Vybl9pc19pbmxpbmUpCitESUFHX05BTUVfSU5ERVgod2Fybl9rZXJuX2lzX21ldGhvZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2xvY2tfZXhjbHVzaXZlX2FuZF9zaGFyZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9sb2NrX3NvbWVfcHJlZGVjZXNzb3JzKQorRElBR19OQU1FX0lOREVYKHdhcm5fbG9naWNhbF9hbmRfaW5fbG9naWNhbF9vcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX2xvZ2ljYWxfaW5zdGVhZF9vZl9iaXR3aXNlKQorRElBR19OQU1FX0lOREVYKHdhcm5fbG9naWNhbF9ub3Rfb25fbGhzX29mX2NoZWNrKQorRElBR19OQU1FX0lOREVYKHdhcm5fbG9vcF9jdHJsX2JpbmRzX3RvX2lubmVyKQorRElBR19OQU1FX0lOREVYKHdhcm5fbG9vcF9zdGF0ZV9taXNtYXRjaCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21haW5fb25lX2FyZykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21haW5fcmVkZWZpbmVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fbWFpbl9yZXR1cm5zX2Jvb2xfbGl0ZXJhbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21heF91bnNpZ25lZF96ZXJvKQorRElBR19OQU1FX0lOREVYKHdhcm5fbWF5YmVfZmFsbG9mZl9ub252b2lkX2Nvcm91dGluZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21heWJlX2ZhbGxvZmZfbm9udm9pZF9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21heWJlX2ZhbGxvZmZfbm9udm9pZF9sYW1iZGEpCitESUFHX05BTUVfSU5ERVgod2Fybl9tYXliZV91bmluaXRfdmFyKQorRElBR19OQU1FX0lOREVYKHdhcm5fbWF5bm90X3Jlc3BvbmQpCitESUFHX05BTUVfSU5ERVgod2Fybl9tZW1iZXJfZXh0cmFfcXVhbGlmaWNhdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21lbWNweV9jaGtfb3ZlcmZsb3cpCitESUFHX05BTUVfSU5ERVgod2Fybl9tZW1zaXplX2NvbXBhcmlzb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9tZXNzYWdpbmdfdW5xdWFsaWZpZWRfaWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9tZXRob2RfcGFyYW1fZGVjbGFyYXRpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9tZXRob2RfcGFyYW1fcmVkZWZpbml0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fbWljcm9zb2Z0X2RlcGVuZGVudF9leGlzdHMpCitESUFHX05BTUVfSU5ERVgod2Fybl9taWNyb3NvZnRfcXVhbGlmaWVyc19pZ25vcmVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fbWlwc19pbnRlcnJ1cHRfYXR0cmlidXRlKQorRElBR19OQU1FX0lOREVYKHdhcm5fbWlzbWF0Y2hlZF9hdmFpbGFiaWxpdHkpCitESUFHX05BTUVfSU5ERVgod2Fybl9taXNtYXRjaGVkX2F2YWlsYWJpbGl0eV9vdmVycmlkZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21pc21hdGNoZWRfYXZhaWxhYmlsaXR5X292ZXJyaWRlX3VuYXZhaWwpCitESUFHX05BTUVfSU5ERVgod2Fybl9taXNtYXRjaGVkX2RlbGV0ZV9uZXcpCitESUFHX05BTUVfSU5ERVgod2Fybl9taXNtYXRjaGVkX251bGxhYmlsaXR5X2F0dHIpCitESUFHX05BTUVfSU5ERVgod2Fybl9taXNtYXRjaGVkX3NlY3Rpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9taXNwbGFjZWRfZWxsaXBzaXNfdmFyYXJnKQorRElBR19OQU1FX0lOREVYKHdhcm5fbWlzc2luZ19icmFjZXMpCitESUFHX05BTUVfSU5ERVgod2Fybl9taXNzaW5nX2Nhc2UpCitESUFHX05BTUVfSU5ERVgod2Fybl9taXNzaW5nX2Nhc2VfZm9yX2NvbmRpdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21pc3NpbmdfZGVwZW5kZW50X3RlbXBsYXRlX2tleXdvcmQpCitESUFHX05BTUVfSU5ERVgod2Fybl9taXNzaW5nX2V4cGxpY2l0X3N5bnRoZXNpcykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21pc3NpbmdfZmllbGRfaW5pdGlhbGl6ZXJzKQorRElBR19OQU1FX0lOREVYKHdhcm5fbWlzc2luZ19mb3JtYXRfc3RyaW5nKQorRElBR19OQU1FX0lOREVYKHdhcm5fbWlzc2luZ19tZXRob2RfcmV0dXJuX3R5cGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9taXNzaW5nX3Byb3RvdHlwZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21pc3Npbmdfc2VsZWN0b3JfbmFtZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21pc3Npbmdfc2VudGluZWwpCitESUFHX05BTUVfSU5ERVgod2Fybl9taXNzaW5nX3N1Ym1vZHVsZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21pc3Npbmdfc3lzcm9vdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21pc3NpbmdfdmFyaWFibGVfZGVjbGFyYXRpb25zKQorRElBR19OQU1FX0lOREVYKHdhcm5fbWlzc2luZ193aGl0ZXNwYWNlX2FmdGVyX21hY3JvX25hbWUpCitESUFHX05BTUVfSU5ERVgod2Fybl9taXhlZF9zaWduX2NvbXBhcmlzb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9tbWFwX21pc21hdGNoZWRfcHJpdmF0ZV9tb2R1bGVfbmFtZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21tYXBfbWlzbWF0Y2hlZF9wcml2YXRlX3N1Ym1vZHVsZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21tYXBfcmVkdW5kYW50X2V4cG9ydF9hcykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21tYXBfdW1icmVsbGFfZGlyX25vdF9mb3VuZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21tYXBfdW5rbm93bl9hdHRyaWJ1dGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9tb2RpZnlpbmdfc2hhZG93aW5nX2RlY2wpCitESUFHX05BTUVfSU5ERVgod2Fybl9tb2R1bGVfY29uZmlnX21hY3JvX3VuZGVmKQorRElBR19OQU1FX0lOREVYKHdhcm5fbW9kdWxlX2NvbmZpZ19taXNtYXRjaCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21vZHVsZV9jb25mbGljdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX21vZHVsZV9zeXN0ZW1fYml0X2NvbmZsaWN0KQorRElBR19OQU1FX0lOREVYKHdhcm5fbW9kdWxlX3VzZXNfZGF0ZV90aW1lKQorRElBR19OQU1FX0lOREVYKHdhcm5fbXRfbWVzc2FnZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX211bHRpcGxlX21ldGhvZF9kZWNsKQorRElBR19OQU1FX0lOREVYKHdhcm5fbXVsdGlwbGVfc2VsZWN0b3JzKQorRElBR19OQU1FX0lOREVYKHdhcm5fbmFtZXNwYWNlX21lbWJlcl9leHRyYV9xdWFsaWZpY2F0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fbmVvbl92ZWN0b3JfaW5pdGlhbGl6ZXJfbm9uX3BvcnRhYmxlKQorRElBR19OQU1FX0lOREVYKHdhcm5fbmVzdGVkX2Jsb2NrX2NvbW1lbnQpCitESUFHX05BTUVfSU5ERVgod2Fybl9ub19hdXRvc3ludGhlc2lzX3Byb3BlcnR5KQorRElBR19OQU1FX0lOREVYKHdhcm5fbm9fYXV0b3N5bnRoZXNpc19zaGFyZWRfaXZhcl9wcm9wZXJ0eSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX25vX2NvbnN0cnVjdG9yX2Zvcl9yZWZjb25zdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX25vX25ld2xpbmVfZW9mKQorRElBR19OQU1FX0lOREVYKHdhcm5fbm9fcHJpdl9zdWJtb2R1bGVfdXNlX3RvcGxldmVsKQorRElBR19OQU1FX0lOREVYKHdhcm5fbm9fdW5kZXJseWluZ190eXBlX3NwZWNpZmllZF9mb3JfZW51bV9iaXRmaWVsZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX25vX3VubG9jaykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX25vY2ZfY2hlY2tfYXR0cmlidXRlX2lnbm9yZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9ub25fY29udHJhdmFyaWFudF9vdmVycmlkaW5nX3BhcmFtX3R5cGVzKQorRElBR19OQU1FX0lOREVYKHdhcm5fbm9uX2NvbnRyYXZhcmlhbnRfcGFyYW1fdHlwZXMpCitESUFHX05BTUVfSU5ERVgod2Fybl9ub25fY292YXJpYW50X292ZXJyaWRpbmdfcmV0X3R5cGVzKQorRElBR19OQU1FX0lOREVYKHdhcm5fbm9uX2NvdmFyaWFudF9yZXRfdHlwZXMpCitESUFHX05BTUVfSU5ERVgod2Fybl9ub25fbGl0ZXJhbF9udWxsX3BvaW50ZXIpCitESUFHX05BTUVfSU5ERVgod2Fybl9ub25fbW9kdWxhcl9pbmNsdWRlX2luX2ZyYW1ld29ya19tb2R1bGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9ub25fbW9kdWxhcl9pbmNsdWRlX2luX21vZHVsZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX25vbl9wb2RfdmFyYXJnX3dpdGhfZm9ybWF0X3N0cmluZykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX25vbl92aXJ0dWFsX2R0b3IpCitESUFHX05BTUVfSU5ERVgod2Fybl9ub25udWxsX2V4cHJfY29tcGFyZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX25vcmV0dXJuX2Z1bmN0aW9uX2hhc19yZXR1cm5fZXhwcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX25vdF9hX2RveHlnZW5fdHJhaWxpbmdfbWVtYmVyX2NvbW1lbnQpCitESUFHX05BTUVfSU5ERVgod2Fybl9ub3RfY29tcG91bmRfYXNzaWduKQorRElBR19OQU1FX0lOREVYKHdhcm5fbm90X2Vub3VnaF9hcmd1bWVudCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX25vdF9pbl9lbnVtKQorRElBR19OQU1FX0lOREVYKHdhcm5fbm90X2luX2VudW1fYXNzaWdubWVudCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX25wb3RfbXNfc3RydWN0KQorRElBR19OQU1FX0lOREVYKHdhcm5fbnNfYXR0cmlidXRlX3dyb25nX3BhcmFtZXRlcl90eXBlKQorRElBR19OQU1FX0lOREVYKHdhcm5fbnNfYXR0cmlidXRlX3dyb25nX3JldHVybl90eXBlKQorRElBR19OQU1FX0lOREVYKHdhcm5fbnNjb25zdW1lZF9hdHRyaWJ1dGVfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgod2Fybl9uc29iamVjdF9hdHRyaWJ1dGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9uc3JldHVybnNfcmV0YWluZWRfYXR0cmlidXRlX21pc21hdGNoKQorRElBR19OQU1FX0lOREVYKHdhcm5fbnVsbF9hcmcpCitESUFHX05BTUVfSU5ERVgod2Fybl9udWxsX2luX2FyaXRobWV0aWNfb3BlcmF0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fbnVsbF9pbl9jb21wYXJpc29uX29wZXJhdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX251bGxfcG9pbnRlcl9jb21wYXJlKQorRElBR19OQU1FX0lOREVYKHdhcm5fbnVsbF9yZXNldHRhYmxlX3NldHRlcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX251bGxfcmV0KQorRElBR19OQU1FX0lOREVYKHdhcm5fbnVsbGFiaWxpdHlfZGVjbHNwZWMpCitESUFHX05BTUVfSU5ERVgod2Fybl9udWxsYWJpbGl0eV9kdXBsaWNhdGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9udWxsYWJpbGl0eV9pbmZlcnJlZF9vbl9uZXN0ZWRfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX251bGxhYmlsaXR5X2xvc3QpCitESUFHX05BTUVfSU5ERVgod2Fybl9udWxsYWJpbGl0eV9taXNzaW5nKQorRElBR19OQU1FX0lOREVYKHdhcm5fbnVsbGFiaWxpdHlfbWlzc2luZ19hcnJheSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX29iamNfY2RpcmVjdGl2ZV9mb3JtYXRfc3RyaW5nKQorRElBR19OQU1FX0lOREVYKHdhcm5fb2JqY19jaXJjdWxhcl9jb250YWluZXIpCitESUFHX05BTUVfSU5ERVgod2Fybl9vYmpjX2NvbGxlY3Rpb25fbGl0ZXJhbF9lbGVtZW50KQorRElBR19OQU1FX0lOREVYKHdhcm5fb2JqY19kZXNpZ25hdGVkX2luaXRfbWlzc2luZ19zdXBlcl9jYWxsKQorRElBR19OQU1FX0lOREVYKHdhcm5fb2JqY19kZXNpZ25hdGVkX2luaXRfbm9uX2Rlc2lnbmF0ZWRfaW5pdF9jYWxsKQorRElBR19OQU1FX0lOREVYKHdhcm5fb2JqY19kZXNpZ25hdGVkX2luaXRfbm9uX3N1cGVyX2Rlc2lnbmF0ZWRfaW5pdF9jYWxsKQorRElBR19OQU1FX0lOREVYKHdhcm5fb2JqY19pbXBsZW1lbnRhdGlvbl9taXNzaW5nX2Rlc2lnbmF0ZWRfaW5pdF9vdmVycmlkZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX29iamNfaW52YWxpZF9icmlkZ2UpCitESUFHX05BTUVfSU5ERVgod2Fybl9vYmpjX2ludmFsaWRfYnJpZGdlX3RvX2NmKQorRElBR19OQU1FX0lOREVYKHdhcm5fb2JqY19pc2FfYXNzaWduKQorRElBR19OQU1FX0lOREVYKHdhcm5fb2JqY19pc2FfdXNlKQorRElBR19OQU1FX0lOREVYKHdhcm5fb2JqY19saXRlcmFsX2NvbXBhcmlzb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9vYmpjX21pc3Npbmdfc3VwZXJfY2FsbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX29iamNfcG9pbnRlcl9jeHhfY2F0Y2hfZnJhZ2lsZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX29iamNfcG9pbnRlcl9tYXNraW5nKQorRElBR19OQU1FX0lOREVYKHdhcm5fb2JqY19wb2ludGVyX21hc2tpbmdfcGVyZm9ybVNlbGVjdG9yKQorRElBR19OQU1FX0lOREVYKHdhcm5fb2JqY19wcmVjaXNlX2xpZmV0aW1lX21lYW5pbmdsZXNzKQorRElBR19OQU1FX0lOREVYKHdhcm5fb2JqY19wcm9wZXJ0eV9jb3B5X21pc3Npbmdfb25fYmxvY2spCitESUFHX05BTUVfSU5ERVgod2Fybl9vYmpjX3Byb3BlcnR5X2RlZmF1bHRfYXNzaWduX29uX29iamVjdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX29iamNfcHJvcGVydHlfbm9fYXNzaWdubWVudF9hdHRyaWJ1dGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9vYmpjX3Byb3BlcnR5X3JldGFpbl9vZl9ibG9jaykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX29iamNfcHJvdG9jb2xfcXVhbGlmaWVyX21pc3NpbmdfaWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9vYmpjX3JlYWRvbmx5X3Byb3BlcnR5X2hhc19zZXR0ZXIpCitESUFHX05BTUVfSU5ERVgod2Fybl9vYmpjX3JlZHVuZGFudF9saXRlcmFsX3VzZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX29iamNfcmVkdW5kYW50X3F1YWxpZmllZF9jbGFzc190eXBlKQorRElBR19OQU1FX0lOREVYKHdhcm5fb2JqY19yZXF1aXJlc19zdXBlcl9wcm90b2NvbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX29iamNfcm9vdF9jbGFzc19taXNzaW5nKQorRElBR19OQU1FX0lOREVYKHdhcm5fb2JqY19zZWNvbmRhcnlfaW5pdF9taXNzaW5nX2luaXRfY2FsbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX29iamNfc2Vjb25kYXJ5X2luaXRfc3VwZXJfaW5pdF9jYWxsKQorRElBR19OQU1FX0lOREVYKHdhcm5fb2JqY19zdHJpbmdfbGl0ZXJhbF9jb21wYXJpc29uKQorRElBR19OQU1FX0lOREVYKHdhcm5fb2JqY191bnNhZmVfcGVyZm9ybV9zZWxlY3RvcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX29kcl90YWdfdHlwZV9pbmNvbnNpc3RlbnQpCitESUFHX05BTUVfSU5ERVgod2Fybl9vbGRfaW1wbGljaXRseV91bnNpZ25lZF9sb25nKQorRElBR19OQU1FX0lOREVYKHdhcm5fb2xkX2ltcGxpY2l0bHlfdW5zaWduZWRfbG9uZ19jeHgpCitESUFHX05BTUVfSU5ERVgod2Fybl9vbGRfc3R5bGVfY2FzdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX29tcF9hbGlnbm1lbnRfbm90X3Bvd2VyX29mX3R3bykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX29tcF9leHRyYV90b2tlbnNfYXRfZW9sKQorRElBR19OQU1FX0lOREVYKHdhcm5fb21wX2xpbmVhcl9zdGVwX3plcm8pCitESUFHX05BTUVfSU5ERVgod2Fybl9vbXBfbG9vcF82NF9iaXRfdmFyKQorRElBR19OQU1FX0lOREVYKHdhcm5fb21wX25lc3Rpbmdfc2ltZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX29tcF9ub25fdHJpdmlhbF90eXBlX21hcHBlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX29tcF9ub3RfaW5fdGFyZ2V0X2NvbnRleHQpCitESUFHX05BTUVfSU5ERVgod2Fybl9vbXBfc2VjdGlvbl9pc19jaGFyKQorRElBR19OQU1FX0lOREVYKHdhcm5fb25fc3VwZXJjbGFzc191c2UpCitESUFHX05BTUVfSU5ERVgod2Fybl9vcGVuY2xfYXR0cl9kZXByZWNhdGVkX2lnbm9yZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9vcGVyYXRvcl9uZXdfcmV0dXJuc19udWxsKQorRElBR19OQU1FX0lOREVYKHdhcm5fb3B0aW9uX2ludmFsaWRfb2NsX3ZlcnNpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9vc19sb2dfZm9ybWF0X25hcmcpCitESUFHX05BTUVfSU5ERVgod2Fybl9vdXRfb2ZfcmFuZ2VfY29tcGFyZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX292ZXJhbGlnbmVkX3R5cGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9vdmVybG9hZGVkX3NoaWZ0X2luX2NvbXBhcmlzb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9vdmVybG9hZGVkX3ZpcnR1YWwpCitESUFHX05BTUVfSU5ERVgod2Fybl9vdmVycmlkaW5nX21ldGhvZF9taXNzaW5nX25vZXNjYXBlKQorRElBR19OQU1FX0lOREVYKHdhcm5fcGFkZGVkX3N0cnVjdF9hbm9uX2ZpZWxkKQorRElBR19OQU1FX0lOREVYKHdhcm5fcGFkZGVkX3N0cnVjdF9maWVsZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3BhZGRlZF9zdHJ1Y3Rfc2l6ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3BhcmFtX3JldHVybl90eXBlc3RhdGVfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgod2Fybl9wYXJhbV90eXBlc3RhdGVfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgod2Fybl9wYXJhbWV0ZXJfc2l6ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3BhcmVuc19kaXNhbWJpZ3VhdGVkX2FzX2Z1bmN0aW9uX2RlY2xhcmF0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fcGFyZW5zX2Rpc2FtYmlndWF0ZWRfYXNfdmFyaWFibGVfZGVjbGFyYXRpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9wYXNzX2NsYXNzX2FyZ190b192YXJhcmcpCitESUFHX05BTUVfSU5ERVgod2Fybl9wZXNzaW1pemluZ19tb3ZlX29uX2luaXRpYWxpemF0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fcGVzc2ltaXppbmdfbW92ZV9vbl9yZXR1cm4pCitESUFHX05BTUVfSU5ERVgod2Fybl9wb2ludGVyX2FicykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3BvaW50ZXJfYXJpdGhfbnVsbF9wdHIpCitESUFHX05BTUVfSU5ERVgod2Fybl9wb2ludGVyX2luZGlyZWN0aW9uX2Zyb21faW5jb21wYXRpYmxlX3R5cGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcF9hbWJpZ3VvdXNfbWFjcm8pCitESUFHX05BTUVfSU5ERVgod2Fybl9wcF9jb252ZXJ0X3RvX3Bvc2l0aXZlKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHBfZGF0ZV90aW1lKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHBfZXhwcl9vdmVyZmxvdykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3BwX2xpbmVfZGVjaW1hbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3BwX21hY3JvX2hpZGVzX2tleXdvcmQpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcF9tYWNyb19pc19yZXNlcnZlZF9pZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3BwX29iamNfbWFjcm9fcmVkZWZfaWdub3JlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3BwX3VuZGVmX2lkZW50aWZpZXIpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfYWxpZ25fZXhwZWN0ZWRfZXF1YWwpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfYWxpZ25faW52YWxpZF9vcHRpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfYXR0cmlidXRlX3VudXNlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV9iZWdpbl9lbmRfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfY29tbWVudF9pZ25vcmVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX2RlYnVnX21pc3NpbmdfYXJndW1lbnQpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfZGVidWdfdW5leHBlY3RlZF9jb21tYW5kKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX2RpYWdub3N0aWNfY2Fubm90X3BvcCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV9kaWFnbm9zdGljX2ludmFsaWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfZGlhZ25vc3RpY19pbnZhbGlkX29wdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV9kaWFnbm9zdGljX2ludmFsaWRfdG9rZW4pCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfZGlhZ25vc3RpY191bmtub3duX3dhcm5pbmcpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfZXhwZWN0ZWRfYWN0aW9uX29yX3JfcGFyZW4pCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfZXhwZWN0ZWRfY29sb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfZXhwZWN0ZWRfY29sb25fcl9wYXJlbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV9leHBlY3RlZF9jb21tYSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV9leHBlY3RlZF9pZGVudGlmaWVyKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX2V4cGVjdGVkX2luaXRfc2VnKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX2V4cGVjdGVkX2ludGVnZXIpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfZXhwZWN0ZWRfbHBhcmVuKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX2V4cGVjdGVkX25vbl93aWRlX3N0cmluZykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV9leHBlY3RlZF9wcmVkaWNhdGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfZXhwZWN0ZWRfcHVuYykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV9leHBlY3RlZF9ycGFyZW4pCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfZXhwZWN0ZWRfc2VjdGlvbl9sYWJlbF9vcl9uYW1lKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX2V4cGVjdGVkX3NlY3Rpb25fbmFtZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV9leHBlY3RlZF9zZWN0aW9uX3B1c2hfcG9wX29yX25hbWUpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfZXhwZWN0ZWRfc3RyaW5nKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX2V4dGVuc2lvbl9pc19jb3JlKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX2V4dHJhX3Rva2Vuc19hdF9lb2wpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfZm9yY2VfY3VkYV9ob3N0X2RldmljZV9iYWRfYXJnKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX2lnbm9yZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfaW5jbHVkZV9hbGlhc19leHBlY3RlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV9pbmNsdWRlX2FsaWFzX2V4cGVjdGVkX2ZpbGVuYW1lKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX2luY2x1ZGVfYWxpYXNfbWlzbWF0Y2hfYW5nbGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfaW5jbHVkZV9hbGlhc19taXNtYXRjaF9xdW90ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV9pbml0X3NlZ191bnN1cHBvcnRlZF90YXJnZXQpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfaW50cmluc2ljX2J1aWx0aW4pCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfaW52YWxpZF9hY3Rpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfaW52YWxpZF9hcmd1bWVudCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV9pbnZhbGlkX3NwZWNpZmljX2FjdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV9tZXNzYWdlKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX21pc3NpbmdfYXJndW1lbnQpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfbXNfc3RydWN0KQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX29tcF9pZ25vcmVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX29wdGltaXplKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX29wdGlvbnNfYWxpZ25fcmVzZXRfZmFpbGVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX29wdGlvbnNfZXhwZWN0ZWRfYWxpZ24pCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfcGFja19pbnZhbGlkX2FsaWdubWVudCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV9wYWNrX21hbGZvcm1lZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV9wYWNrX21vZGlmaWVkX2FmdGVyX2luY2x1ZGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfcGFja19ub19wb3BfZW9mKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX3BhY2tfbm9uX2RlZmF1bHRfYXRfaW5jbHVkZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV9wYWNrX3BvcF9pZGVudGlmZXJfYW5kX2FsaWdubWVudCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV9wYWNrX3Nob3cpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfcG9wX2ZhaWxlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV9wb3BfbWFjcm9fbm9fcHVzaCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV91bmtub3duX2V4dGVuc2lvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV91bnJvbGxfY3VkYV92YWx1ZV9pbl9wYXJlbnMpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmFnbWFfdW5zdXBwb3J0ZWRfYWN0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX3Vuc3VwcG9ydGVkX2V4dGVuc2lvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV91bnVzZWRfZXhwZWN0ZWRfdmFyKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX3VudXNlZF9leHBlY3RlZF92YXJfYXJnKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX3VudXNlZF91bmRlY2xhcmVkX3ZhcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV93YXJuaW5nX2V4cGVjdGVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX3dhcm5pbmdfZXhwZWN0ZWRfbnVtYmVyKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJhZ21hX3dhcm5pbmdfcHVzaF9sZXZlbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByYWdtYV93YXJuaW5nX3NwZWNfaW52YWxpZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByZWNlZGVuY2VfYml0d2lzZV9yZWwpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmVjZWRlbmNlX2NvbmRpdGlvbmFsKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJpbnRmX09iakNmbGFnc193aXRob3V0X09iakNDb252ZXJzaW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJpbnRmX2FzdGVyaXNrX21pc3NpbmdfYXJnKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJpbnRmX2FzdGVyaXNrX3dyb25nX3R5cGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmludGZfZGF0YV9hcmdfbm90X3VzZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmludGZfZW1wdHlfb2JqY19mbGFnKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJpbnRmX2Zvcm1hdF9zdHJpbmdfY29udGFpbnNfbnVsbF9jaGFyKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJpbnRmX2Zvcm1hdF9zdHJpbmdfbm90X251bGxfdGVybWluYXRlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByaW50Zl9pZ25vcmVkX2ZsYWcpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmludGZfaW5jb21wbGV0ZV9zcGVjaWZpZXIpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcmludGZfaW5zdWZmaWNpZW50X2RhdGFfYXJncykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByaW50Zl9pbnZhbGlkX29iamNfZmxhZykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByaW50Zl9ub25zZW5zaWNhbF9mbGFnKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJpbnRmX25vbnNlbnNpY2FsX29wdGlvbmFsX2Ftb3VudCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByaW50Zl9wb3NpdGlvbmFsX2FyZ19leGNlZWRzX2RhdGFfYXJncykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ByaXZhdGVfZXh0ZXJuKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJvZmlsZV9kYXRhX21pc3NpbmcpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcm9maWxlX2RhdGFfb3V0X29mX2RhdGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcm9maWxlX2RhdGFfdW5wcm9maWxlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3Byb3BlcnR5X2FjY2Vzc19zdWdnZXN0KQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJvcGVydHlfYXR0cl9taXNtYXRjaCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3Byb3BlcnR5X2F0dHJpYnV0ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3Byb3BlcnR5X2dldHRlcl9vd25pbmdfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcm9wZXJ0eV9pbXBsaWNpdGx5X21pc21hdGNoZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcm9wZXJ0eV9tZXRob2RfZGVwcmVjYXRlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3Byb3BlcnR5X3JlZGVjbF9nZXR0ZXJfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgod2Fybl9wcm9wZXJ0eV90eXBlc19hcmVfaW5jb21wYXRpYmxlKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHJvdG9jb2xfcHJvcGVydHlfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgod2Fybl9wdF9ndWFyZGVkX3Bhc3NfYnlfcmVmZXJlbmNlKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHRyX2FyaXRoX2V4Y2VlZHNfYm91bmRzKQorRElBR19OQU1FX0lOREVYKHdhcm5fcHRyX2FyaXRoX3ByZWNlZGVzX2JvdW5kcykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3B0cl9pbmRlcGVuZGVudGNsYXNzX2F0dHJpYnV0ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3F1YWxfcmV0dXJuX3R5cGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9yZWFkb25seV9wcm9wZXJ0eSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3JlY2VpdmVyX2ZvcndhcmRfY2xhc3MpCitESUFHX05BTUVfSU5ERVgod2Fybl9yZWNlaXZlcl9mb3J3YXJkX2luc3RhbmNlKQorRElBR19OQU1FX0lOREVYKHdhcm5fcmVkZWNsX2xpYnJhcnlfYnVpbHRpbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3JlZGVjbGFyYXRpb25fd2l0aG91dF9hdHRyaWJ1dGVfcHJldl9hdHRyaWJ1dGVfaWdub3JlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3JlZGVjbGFyYXRpb25fd2l0aG91dF9pbXBvcnRfYXR0cmlidXRlKQorRElBR19OQU1FX0lOREVYKHdhcm5fcmVkZWZpbmVfZXh0bmFtZV9ub3RfYXBwbGllZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3JlZGVmaW5pdGlvbl9pbl9wYXJhbV9saXN0KQorRElBR19OQU1FX0lOREVYKHdhcm5fcmVkdW5kYW50X2xvb3BfaXRlcmF0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fcmVkdW5kYW50X21vdmVfb25fcmV0dXJuKQorRElBR19OQU1FX0lOREVYKHdhcm5fcmVkdW5kYW50X3BhcmVuc19hcm91bmRfZGVjbGFyYXRvcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3JlZmVyZW5jZV9maWVsZF9pc191bmluaXQpCitESUFHX05BTUVfSU5ERVgod2Fybl9yZWdpc3Rlcl9vYmpjX2NhdGNoX3Bhcm0pCitESUFHX05BTUVfSU5ERVgod2Fybl9yZWludGVycHJldF9kaWZmZXJlbnRfZnJvbV9zdGF0aWMpCitESUFHX05BTUVfSU5ERVgod2Fybl9yZWxhdGVkX3Jlc3VsdF90eXBlX2NvbXBhdGliaWxpdHlfY2xhc3MpCitESUFHX05BTUVfSU5ERVgod2Fybl9yZWxhdGVkX3Jlc3VsdF90eXBlX2NvbXBhdGliaWxpdHlfcHJvdG9jb2wpCitESUFHX05BTUVfSU5ERVgod2Fybl9yZW1haW5kZXJfZGl2aXNpb25fYnlfemVybykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3JldF9hZGRyX2xhYmVsKQorRElBR19OQU1FX0lOREVYKHdhcm5fcmV0X2xvY2FsX3RlbXBfYWRkcl9yZWYpCitESUFHX05BTUVfSU5ERVgod2Fybl9yZXRfc3RhY2tfYWRkcl9yZWYpCitESUFHX05BTUVfSU5ERVgod2Fybl9yZXR1cm5fbWlzc2luZ19leHByKQorRElBR19OQU1FX0lOREVYKHdhcm5fcmV0dXJuX3R5cGVzdGF0ZV9mb3JfdW5jb25zdW1hYmxlX3R5cGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9yZXR1cm5fdHlwZXN0YXRlX21pc21hdGNoKQorRElBR19OQU1FX0lOREVYKHdhcm5fcmV0dXJuX3ZhbHVlX3NpemUpCitESUFHX05BTUVfSU5ERVgod2Fybl9yZXR1cm5fdmFsdWVfdWR0KQorRElBR19OQU1FX0lOREVYKHdhcm5fcmV0dXJuX3ZhbHVlX3VkdF9pbmNvbXBsZXRlKQorRElBR19OQU1FX0lOREVYKHdhcm5fcm9vdF9pbnN0X21ldGhvZF9ub3RfZm91bmQpCitESUFHX05BTUVfSU5ERVgod2Fybl9zYW1wbGVyX2luaXRpYWxpemVyX2ludmFsaWRfYml0cykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3NjYW5mX25vbnplcm9fd2lkdGgpCitESUFHX05BTUVfSU5ERVgod2Fybl9zY2FuZl9zY2FubGlzdF9pbmNvbXBsZXRlKQorRElBR19OQU1FX0lOREVYKHdhcm5fc2Vjb25kX2FyZ19vZl92YV9zdGFydF9ub3RfbGFzdF9uYW1lZF9wYXJhbSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3NlY29uZF9wYXJhbWV0ZXJfdG9fdmFfYXJnX25ldmVyX2NvbXBhdGlibGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9zZWNvbmRfcGFyYW1ldGVyX3RvX3ZhX2FyZ19ub3RfcG9kKQorRElBR19OQU1FX0lOREVYKHdhcm5fc2Vjb25kX3BhcmFtZXRlcl90b192YV9hcmdfb3duZXJzaGlwX3F1YWxpZmllZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3NlbGZfYXNzaWdubWVudCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3NlbGZfbW92ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3NlbWljb2xvbl9iZWZvcmVfbWV0aG9kX2JvZHkpCitESUFHX05BTUVfSU5ERVgod2Fybl9zZXR0ZXJfZ2V0dGVyX2ltcGxfcmVxdWlyZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9zZXR0ZXJfZ2V0dGVyX2ltcGxfcmVxdWlyZWRfaW5fY2F0ZWdvcnkpCitESUFHX05BTUVfSU5ERVgod2Fybl9zaGFkb3dfZmllbGQpCitESUFHX05BTUVfSU5ERVgod2Fybl9zaGlmdF9ndF90eXBld2lkdGgpCitESUFHX05BTUVfSU5ERVgod2Fybl9zaGlmdF9saHNfbmVnYXRpdmUpCitESUFHX05BTUVfSU5ERVgod2Fybl9zaGlmdF9uZWdhdGl2ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3NoaWZ0X3Jlc3VsdF9ndF90eXBld2lkdGgpCitESUFHX05BTUVfSU5ERVgod2Fybl9zaGlmdF9yZXN1bHRfc2V0c19zaWduX2JpdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3NpZGVfZWZmZWN0c190eXBlaWQpCitESUFHX05BTUVfSU5ERVgod2Fybl9zaWRlX2VmZmVjdHNfdW5ldmFsdWF0ZWRfY29udGV4dCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3NpZ25lZF9iaXRmaWVsZF9lbnVtX2NvbnZlcnNpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9zaXplb2ZfYXJyYXlfZGVjYXkpCitESUFHX05BTUVfSU5ERVgod2Fybl9zaXplb2ZfYXJyYXlfcGFyYW0pCitESUFHX05BTUVfSU5ERVgod2Fybl9zaXplb2ZfcG9pbnRlcl9leHByX21lbWFjY2VzcykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3NpemVvZl9wb2ludGVyX2V4cHJfbWVtYWNjZXNzX25vdGUpCitESUFHX05BTUVfSU5ERVgod2Fybl9zaXplb2ZfcG9pbnRlcl90eXBlX21lbWFjY2VzcykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3NsYXNoX3VfZmlsZW5hbWUpCitESUFHX05BTUVfSU5ERVgod2Fybl9zb21ldGltZXNfdW5pbml0X3ZhcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3N0YW5kYWxvbmVfc3BlY2lmaWVyKQorRElBR19OQU1FX0lOREVYKHdhcm5fc3RhdGljX2FycmF5X3Rvb19zbWFsbCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3N0YXRpY19pbmxpbmVfZXhwbGljaXRfaW5zdF9pZ25vcmVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fc3RhdGljX2xvY2FsX2luX2V4dGVybl9pbmxpbmUpCitESUFHX05BTUVfSU5ERVgod2Fybl9zdGF0aWNfbWFpbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3N0YXRpY19zZWxmX3JlZmVyZW5jZV9pbl9pbml0KQorRElBR19OQU1FX0lOREVYKHdhcm5fc3RkY19mZW52X2FjY2Vzc19ub3Rfc3VwcG9ydGVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fc3RyaWN0X211bHRpcGxlX21ldGhvZF9kZWNsKQorRElBR19OQU1FX0lOREVYKHdhcm5fc3RyaWN0X3Byb3RvdHlwZXMpCitESUFHX05BTUVfSU5ERVgod2Fybl9zdHJpbmdfcGx1c19jaGFyKQorRElBR19OQU1FX0lOREVYKHdhcm5fc3RyaW5nX3BsdXNfaW50KQorRElBR19OQU1FX0lOREVYKHdhcm5fc3RyaW5nY29tcGFyZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3N0cmxjcHljYXRfd3Jvbmdfc2l6ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3N0cm5jYXRfbGFyZ2Vfc2l6ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3N0cm5jYXRfc3JjX3NpemUpCitESUFHX05BTUVfSU5ERVgod2Fybl9zdHJuY2F0X3dyb25nX3NpemUpCitESUFHX05BTUVfSU5ERVgod2Fybl9zdHJ1Y3RfY2xhc3NfcHJldmlvdXNfdGFnX21pc21hdGNoKQorRElBR19OQU1FX0lOREVYKHdhcm5fc3RydWN0X2NsYXNzX3RhZ19taXNtYXRjaCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3N1Yl9wdHJfemVyb19zaXplX3R5cGVzKQorRElBR19OQU1FX0lOREVYKHdhcm5fc3Vib2JqZWN0X2luaXRpYWxpemVyX292ZXJyaWRlcykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3N1YnNjcmlwdF9pc19jaGFyKQorRElBR19OQU1FX0lOREVYKHdhcm5fc3VnZ2VzdF9ub3JldHVybl9ibG9jaykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3N1Z2dlc3Rfbm9yZXR1cm5fZnVuY3Rpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl9zdXBlcmNsYXNzX3ZhcmlhYmxlX3NpemVkX3R5cGVfbm90X2F0X2VuZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3N5bmNfZmV0Y2hfYW5kX25hbmRfc2VtYW50aWNzX2NoYW5nZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3Rha2luZ19hZGRyZXNzX29mX3BhY2tlZF9tZW1iZXIpCitESUFHX05BTUVfSU5ERVgod2Fybl90YXJnZXRfdW5zdXBwb3J0ZWRfYWJzMjAwOCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3RhcmdldF91bnN1cHBvcnRlZF9hYnNsZWdhY3kpCitESUFHX05BTUVfSU5ERVgod2Fybl90YXJnZXRfdW5zdXBwb3J0ZWRfY29tcGFjdF9icmFuY2hlcykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3RhcmdldF91bnN1cHBvcnRlZF9uYW4yMDA4KQorRElBR19OQU1FX0lOREVYKHdhcm5fdGFyZ2V0X3Vuc3VwcG9ydGVkX25hbmxlZ2FjeSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3RhdXRvbG9naWNhbF9ib29sX2NvbXBhcmUpCitESUFHX05BTUVfSU5ERVgod2Fybl90YXV0b2xvZ2ljYWxfY29uc3RhbnRfY29tcGFyZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3RhdXRvbG9naWNhbF9vdmVybGFwX2NvbXBhcmlzb24pCitESUFHX05BTUVfSU5ERVgod2Fybl90ZW1wbGF0ZV9hcmdfbmVnYXRpdmUpCitESUFHX05BTUVfSU5ERVgod2Fybl90ZW1wbGF0ZV9hcmdfdG9vX2xhcmdlKQorRElBR19OQU1FX0lOREVYKHdhcm5fdGVtcGxhdGVfZXhwb3J0X3Vuc3VwcG9ydGVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fdGVtcGxhdGVfcXVhbGlmaWVkX2ZyaWVuZF9pZ25vcmVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fdGVtcGxhdGVfcXVhbGlmaWVkX2ZyaWVuZF91bnN1cHBvcnRlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3RlbXBsYXRlX3NwZWNfZXh0cmFfaGVhZGVycykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3RlbXBvcmFyeV9hcnJheV90b19wb2ludGVyX2RlY2F5KQorRElBR19OQU1FX0lOREVYKHdhcm5fdGVudGF0aXZlX2luY29tcGxldGVfYXJyYXkpCitESUFHX05BTUVfSU5ERVgod2Fybl90aGlzX2Jvb2xfY29udmVyc2lvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3RoaXNfbnVsbF9jb21wYXJlKQorRElBR19OQU1FX0lOREVYKHdhcm5fdGhyZWFkX2F0dHJpYnV0ZV9hcmd1bWVudF9ub3RfbG9ja2FibGUpCitESUFHX05BTUVfSU5ERVgod2Fybl90aHJlYWRfYXR0cmlidXRlX2RlY2xfbm90X2xvY2thYmxlKQorRElBR19OQU1FX0lOREVYKHdhcm5fdGhyZWFkX2F0dHJpYnV0ZV9kZWNsX25vdF9wb2ludGVyKQorRElBR19OQU1FX0lOREVYKHdhcm5fdGhyZWFkX2F0dHJpYnV0ZV9pZ25vcmVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fdGhyZWFkX3NhZmV0eV9iZXRhKQorRElBR19OQU1FX0lOREVYKHdhcm5fdGhyZWFkX3NhZmV0eV92ZXJib3NlKQorRElBR19OQU1FX0lOREVYKHdhcm5fdGhyb3dfaW5fbm9leGNlcHRfZnVuYykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3RyYW5zcGFyZW50X3VuaW9uX2F0dHJpYnV0ZV9maWVsZF9zaXplX2FsaWduKQorRElBR19OQU1FX0lOREVYKHdhcm5fdHJhbnNwYXJlbnRfdW5pb25fYXR0cmlidXRlX2Zsb2F0aW5nKQorRElBR19OQU1FX0lOREVYKHdhcm5fdHJhbnNwYXJlbnRfdW5pb25fYXR0cmlidXRlX25vdF9kZWZpbml0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fdHJhbnNwYXJlbnRfdW5pb25fYXR0cmlidXRlX3plcm9fZmllbGRzKQorRElBR19OQU1FX0lOREVYKHdhcm5fdHlwZV9hdHRyaWJ1dGVfd3JvbmdfdHlwZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3R5cGVfc2FmZXR5X251bGxfcG9pbnRlcl9yZXF1aXJlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3R5cGVfc2FmZXR5X3R5cGVfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgod2Fybl90eXBlX3RhZ19mb3JfZGF0YXR5cGVfd3Jvbmdfa2luZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3R5cGVjaGVja19mdW5jdGlvbl9xdWFsaWZpZXJzX2lnbm9yZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl90eXBlY2hlY2tfZnVuY3Rpb25fcXVhbGlmaWVyc191bnNwZWNpZmllZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3R5cGVjaGVja19yZWZlcmVuY2VfcXVhbGlmaWVycykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3R5cGVjaGVja192ZWN0b3JfZWxlbWVudF9zaXplc19ub3RfZXF1YWwpCitESUFHX05BTUVfSU5ERVgod2Fybl90eXBlY2hlY2tfemVyb19zdGF0aWNfYXJyYXlfc2l6ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3Vjbl9lc2NhcGVfaW5jb21wbGV0ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3Vjbl9lc2NhcGVfbm9fZGlnaXRzKQorRElBR19OQU1FX0lOREVYKHdhcm5fdWNuX2VzY2FwZV9zdXJyb2dhdGUpCitESUFHX05BTUVfSU5ERVgod2Fybl91Y25fbm90X3ZhbGlkX2luX2M4OSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3Vjbl9ub3RfdmFsaWRfaW5fYzg5X2xpdGVyYWwpCitESUFHX05BTUVfSU5ERVgod2Fybl91bmFubm90YXRlZF9mYWxsdGhyb3VnaCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VuYW5ub3RhdGVkX2ZhbGx0aHJvdWdoX3Blcl9mdW5jdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VuYXZhaWxhYmxlX2RlZikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VuYXZhaWxhYmxlX2Z3ZGNsYXNzX21lc3NhZ2UpCitESUFHX05BTUVfSU5ERVgod2Fybl91bmNvdmVyZWRfbW9kdWxlX2hlYWRlcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VuZGVjbGFyZWRfc2VsZWN0b3IpCitESUFHX05BTUVfSU5ERVgod2Fybl91bmRlY2xhcmVkX3NlbGVjdG9yX3dpdGhfdHlwbykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VuZGVmX2ludGVyZmFjZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VuZGVmX2ludGVyZmFjZV9zdWdnZXN0KQorRElBR19OQU1FX0lOREVYKHdhcm5fdW5kZWZfbWV0aG9kX2ltcGwpCitESUFHX05BTUVfSU5ERVgod2Fybl91bmRlZl9wcm90b2NvbHJlZikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VuZGVmaW5lZF9pbmxpbmUpCitESUFHX05BTUVfSU5ERVgod2Fybl91bmRlZmluZWRfaW50ZXJuYWwpCitESUFHX05BTUVfSU5ERVgod2Fybl91bmRlZmluZWRfcmVpbnRlcnByZXRfY2FzdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VuZ3VhcmRlZF9hdmFpbGFiaWxpdHkpCitESUFHX05BTUVfSU5ERVgod2Fybl91bmd1YXJkZWRfYXZhaWxhYmlsaXR5X25ldykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VuaGFuZGxlZF9tc19hdHRyaWJ1dGVfaWdub3JlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VuaW1wbGVtZW50ZWRfcHJvdG9jb2xfbWV0aG9kKQorRElBR19OQU1FX0lOREVYKHdhcm5fdW5pbXBsZW1lbnRlZF9zZWxlY3RvcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VuaW5pdF9ieXJlZl9ibG9ja3Zhcl9jYXB0dXJlZF9ieV9ibG9jaykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VuaW5pdF9zZWxmX3JlZmVyZW5jZV9pbl9pbml0KQorRElBR19OQU1FX0lOREVYKHdhcm5fdW5pbml0X3NlbGZfcmVmZXJlbmNlX2luX3JlZmVyZW5jZV9pbml0KQorRElBR19OQU1FX0lOREVYKHdhcm5fdW5pbml0X3ZhcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3Vua25vd25fYXR0cmlidXRlX2lnbm9yZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl91bmtub3duX2NvbW1lbnRfY29tbWFuZF9uYW1lKQorRElBR19OQU1FX0lOREVYKHdhcm5fdW5rbm93bl9kaWFnX29wdGlvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3Vua25vd25fc2FuaXRpemVyX2lnbm9yZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl91bmtub3duX3dhcm5pbmdfc3BlY2lmaWVyKQorRElBR19OQU1FX0lOREVYKHdhcm5fdW5sb2NrX2J1dF9ub19sb2NrKQorRElBR19OQU1FX0lOREVYKHdhcm5fdW5sb2NrX2tpbmRfbWlzbWF0Y2gpCitESUFHX05BTUVfSU5ERVgod2Fybl91bm5lY2Vzc2FyeV9wYWNrZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl91bm5lZWRlZF9pbnRlcm5hbF9kZWNsKQorRElBR19OQU1FX0lOREVYKHdhcm5fdW5uZWVkZWRfbWVtYmVyX2Z1bmN0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fdW5uZWVkZWRfc3RhdGljX2ludGVybmFsX2RlY2wpCitESUFHX05BTUVfSU5ERVgod2Fybl91bnJlYWNoYWJsZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VucmVhY2hhYmxlX2JyZWFrKQorRElBR19OQU1FX0lOREVYKHdhcm5fdW5yZWFjaGFibGVfZGVmYXVsdCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VucmVhY2hhYmxlX2xvb3BfaW5jcmVtZW50KQorRElBR19OQU1FX0lOREVYKHdhcm5fdW5yZWFjaGFibGVfcmV0dXJuKQorRElBR19OQU1FX0lOREVYKHdhcm5fdW5zZXF1ZW5jZWRfbW9kX21vZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3Vuc2VxdWVuY2VkX21vZF91c2UpCitESUFHX05BTUVfSU5ERVgod2Fybl91bnNpZ25lZF9hYnMpCitESUFHX05BTUVfSU5ERVgod2Fybl91bnNpZ25lZF9hbHdheXNfdHJ1ZV9jb21wYXJpc29uKQorRElBR19OQU1FX0lOREVYKHdhcm5fdW5zaWduZWRfYml0ZmllbGRfYXNzaWduZWRfc2lnbmVkX2VudW0pCitESUFHX05BTUVfSU5ERVgod2Fybl91bnNpZ25lZF9lbnVtX2Fsd2F5c190cnVlX2NvbXBhcmlzb24pCitESUFHX05BTUVfSU5ERVgod2Fybl91bnN1cHBvcnRlZF90YXJnZXRfYXR0cmlidXRlKQorRElBR19OQU1FX0lOREVYKHdhcm5fdW51c2VkX2NhbGwpCitESUFHX05BTUVfSU5ERVgod2Fybl91bnVzZWRfY29tcGFyaXNvbikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VudXNlZF9jb25zdF92YXJpYWJsZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VudXNlZF9jb250YWluZXJfc3Vic2NyaXB0X2V4cHIpCitESUFHX05BTUVfSU5ERVgod2Fybl91bnVzZWRfZXhjZXB0aW9uX3BhcmFtKQorRElBR19OQU1FX0lOREVYKHdhcm5fdW51c2VkX2V4cHIpCitESUFHX05BTUVfSU5ERVgod2Fybl91bnVzZWRfZnVuY3Rpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl91bnVzZWRfbGFiZWwpCitESUFHX05BTUVfSU5ERVgod2Fybl91bnVzZWRfbGFtYmRhX2NhcHR1cmUpCitESUFHX05BTUVfSU5ERVgod2Fybl91bnVzZWRfbG9jYWxfdHlwZWRlZikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VudXNlZF9tZW1iZXJfZnVuY3Rpb24pCitESUFHX05BTUVfSU5ERVgod2Fybl91bnVzZWRfcGFyYW1ldGVyKQorRElBR19OQU1FX0lOREVYKHdhcm5fdW51c2VkX3ByaXZhdGVfZmllbGQpCitESUFHX05BTUVfSU5ERVgod2Fybl91bnVzZWRfcHJvcGVydHlfYmFja2luZ19pdmFyKQorRElBR19OQU1FX0lOREVYKHdhcm5fdW51c2VkX3Byb3BlcnR5X2V4cHIpCitESUFHX05BTUVfSU5ERVgod2Fybl91bnVzZWRfcmVzdWx0KQorRElBR19OQU1FX0lOREVYKHdhcm5fdW51c2VkX3RlbXBsYXRlKQorRElBR19OQU1FX0lOREVYKHdhcm5fdW51c2VkX3ZhcmlhYmxlKQorRElBR19OQU1FX0lOREVYKHdhcm5fdW51c2VkX3ZvaWRwdHIpCitESUFHX05BTUVfSU5ERVgod2Fybl91bnVzZWRfdm9sYXRpbGUpCitESUFHX05BTUVfSU5ERVgod2Fybl91c2VfaW5faW52YWxpZF9zdGF0ZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VzZV9vZl9wcml2YXRlX2hlYWRlcl9vdXRzaWRlX21vZHVsZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3VzZV9vZl90ZW1wX2luX2ludmFsaWRfc3RhdGUpCitESUFHX05BTUVfSU5ERVgod2Fybl91c2VkX2J1dF9tYXJrZWRfdW51c2VkKQorRElBR19OQU1FX0lOREVYKHdhcm5fdXNlcl9saXRlcmFsX3Jlc2VydmVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fdXNpbmdfZGlyZWN0aXZlX2luX2hlYWRlcikKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3V0Zjhfc3ltYm9sX2hvbW9nbHlwaCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ZhX3N0YXJ0X3R5cGVfaXNfdW5kZWZpbmVkKQorRElBR19OQU1FX0lOREVYKHdhcm5fdmFyX2RlcmVmX3JlcXVpcmVzX2FueV9sb2NrKQorRElBR19OQU1FX0lOREVYKHdhcm5fdmFyX2RlcmVmX3JlcXVpcmVzX2xvY2spCitESUFHX05BTUVfSU5ERVgod2Fybl92YXJfZGVyZWZfcmVxdWlyZXNfbG9ja19wcmVjaXNlKQorRElBR19OQU1FX0lOREVYKHdhcm5fdmFyX3RlbXBsYXRlX21pc3NpbmcpCitESUFHX05BTUVfSU5ERVgod2Fybl92YXJpYWJsZV9yZXF1aXJlc19hbnlfbG9jaykKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ZhcmlhYmxlX3JlcXVpcmVzX2xvY2spCitESUFHX05BTUVfSU5ERVgod2Fybl92YXJpYWJsZV9yZXF1aXJlc19sb2NrX3ByZWNpc2UpCitESUFHX05BTUVfSU5ERVgod2Fybl92YXJpYWJsZV9zaXplZF9pdmFyX3Zpc2liaWxpdHkpCitESUFHX05BTUVfSU5ERVgod2Fybl92YXJpYWJsZXNfbm90X2luX2xvb3BfYm9keSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ZiYXNlX21vdmVkX211bHRpcGxlX3RpbWVzKQorRElBR19OQU1FX0lOREVYKHdhcm5fdmVjdG9yX2xvbmdfZGVjbF9zcGVjX2NvbWJpbmF0aW9uKQorRElBR19OQU1FX0lOREVYKHdhcm5fdmVjdG9yX21vZGVfZGVwcmVjYXRlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3ZlcmJhdGltX2Jsb2NrX2VuZF93aXRob3V0X3N0YXJ0KQorRElBR19OQU1FX0lOREVYKHdhcm5fdmxhX3VzZWQpCitESUFHX05BTUVfSU5ERVgod2Fybl93ZWFrX2lkZW50aWZpZXJfdW5kZWNsYXJlZCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3dlYWtfaW1wb3J0KQorRElBR19OQU1FX0lOREVYKHdhcm5fd2Vha190ZW1wbGF0ZV92dGFibGUpCitESUFHX05BTUVfSU5ERVgod2Fybl93ZWFrX3Z0YWJsZSkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3dyb25nX2Fic29sdXRlX3ZhbHVlX3R5cGUpCitESUFHX05BTUVfSU5ERVgod2Fybl96ZXJvX2FzX251bGxfcG9pbnRlcl9jb25zdGFudCkKK0RJQUdfTkFNRV9JTkRFWCh3YXJuX3plcm9fc2l6ZV9zdHJ1Y3RfdW5pb25fY29tcGF0KQorRElBR19OQU1FX0lOREVYKHdhcm5femVyb19zaXplX3N0cnVjdF91bmlvbl9pbl9leHRlcm5fYykKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNMZXhLaW5kcy5pbmMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljTGV4S2luZHMuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YmE4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljTGV4S2luZHMuaW5jCkBAIC0wLDAgKzEsMzIwIEBACisjaWZkZWYgTEVYU1RBUlQKK19fTEVYU1RBUlQgPSBESUFHX1NUQVJUX0xFWCwKKyN1bmRlZiBMRVhTVEFSVAorI2VuZGlmCisKK0RJQUcoYmFja3NsYXNoX25ld2xpbmVfc3BhY2UsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImJhY2tzbGFzaCBhbmQgbmV3bGluZSBzZXBhcmF0ZWQgYnkgc3BhY2UiLCA1MiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKGVycl9fUHJhZ21hX21hbGZvcm1lZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJfUHJhZ21hIHRha2VzIGEgcGFyZW50aGVzaXplZCBzdHJpbmcgbGl0ZXJhbCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX2JhZF9jaGFyYWN0ZXJfZW5jb2RpbmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaWxsZWdhbCBjaGFyYWN0ZXIgZW5jb2RpbmcgaW4gY2hhcmFjdGVyIGxpdGVyYWwiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9iYWRfc3RyaW5nX2VuY29kaW5nLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImlsbGVnYWwgY2hhcmFjdGVyIGVuY29kaW5nIGluIHN0cmluZyBsaXRlcmFsIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfY2hhcmFjdGVyX3Rvb19sYXJnZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjaGFyYWN0ZXIgdG9vIGxhcmdlIGZvciBlbmNsb3NpbmcgY2hhcmFjdGVyIGxpdGVyYWwgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX2NvbmZsaWN0X21hcmtlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2ZXJzaW9uIGNvbnRyb2wgY29uZmxpY3QgbWFya2VyIGluIGZpbGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9kZWZpbmVkX21hY3JvX25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ2RlZmluZWQnIGNhbm5vdCBiZSB1c2VkIGFzIGEgbWFjcm8gbmFtZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX2RpZ2l0X3NlcGFyYXRvcl9ub3RfYmV0d2Vlbl9kaWdpdHMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGlnaXQgc2VwYXJhdG9yIGNhbm5vdCBhcHBlYXIgYXQgJXNlbGVjdHtzdGFydHxlbmR9MCBvZiBkaWdpdCBzZXF1ZW5jZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX2VtYmVkZGVkX2RpcmVjdGl2ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJlbWJlZGRpbmcgYSAjJTAgZGlyZWN0aXZlIHdpdGhpbiBtYWNybyBhcmd1bWVudHMgaXMgbm90IHN1cHBvcnRlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX2VzY2FwZV90b29fbGFyZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtoZXh8b2N0YWx9MCBlc2NhcGUgc2VxdWVuY2Ugb3V0IG9mIHJhbmdlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfZXhwZWN0ZWRfaWRfYnVpbGRpbmdfbW9kdWxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGEgbW9kdWxlIG5hbWUgaW4gJ19fYnVpbGRpbmdfbW9kdWxlJyBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfZXhwb25lbnRfaGFzX25vX2RpZ2l0cywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBvbmVudCBoYXMgbm8gZGlnaXRzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfZmVhdHVyZV9jaGVja19tYWxmb3JtZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYnVpbHRpbiBmZWF0dXJlIGNoZWNrIG1hY3JvIHJlcXVpcmVzIGEgcGFyZW50aGVzaXplZCBpZGVudGlmaWVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfaGV4X2NvbnN0YW50X3JlcXVpcmVzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImhleGFkZWNpbWFsIGZsb2F0aW5nICVzZWxlY3R7Y29uc3RhbnR8bGl0ZXJhbH0wIHJlcXVpcmVzICVzZWxlY3R7YW4gZXhwb25lbnR8YSBzaWduaWZpY2FuZH0xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfaGV4X2VzY2FwZV9ub19kaWdpdHMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiXFwlMCB1c2VkIHdpdGggbm8gZm9sbG93aW5nIGhleCBkaWdpdHMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9pbnZhbGlkX2NoYXJfcmF3X2RlbGltLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgY2hhcmFjdGVyICclMCcgY2hhcmFjdGVyIGluIHJhdyBzdHJpbmcgZGVsaW1pdGVyOyB1c2UgUFJFRklYKCApUFJFRklYIHRvIGRlbGltaXQgcmF3IHN0cmluZyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX2ludmFsaWRfY2hhcmFjdGVyX3RvX2NoYXJpZnksIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBhcmd1bWVudCB0byBjb252ZXJ0IHRvIGNoYXJhY3RlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX2ludmFsaWRfZGlnaXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBkaWdpdCAnJTAnIGluICVzZWxlY3R7ZGVjaW1hbHxvY3RhbHxiaW5hcnl9MSBjb25zdGFudCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX2ludmFsaWRfcHRoX2ZpbGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBvciBjb3JydXB0IFBUSCBmaWxlICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9pbnZhbGlkX3N1ZmZpeF9jb25zdGFudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIHN1ZmZpeCAnJTAnIG9uICVzZWxlY3R7aW50ZWdlcnxmbG9hdGluZ30xIGNvbnN0YW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfaW52YWxpZF91dGY4LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInNvdXJjZSBmaWxlIGlzIG5vdCB2YWxpZCBVVEYtOCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX2xleGluZ19zdHJpbmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZmFpbHVyZSB3aGVuIGxleGluZyBhIHN0cmluZyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfY29uZmlnX21hY3JvX3N1Ym1vZHVsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb25maWd1cmF0aW9uIG1hY3JvcyBhcmUgb25seSBhbGxvd2VkIGluIHRvcC1sZXZlbCBtb2R1bGVzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfbW1hcF9jb25mbGljdGluZ19leHBvcnRfYXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29uZmxpY3RpbmcgcmUtZXhwb3J0IG9mIG1vZHVsZSAnJTAnIGFzICclMScgb3IgJyUyJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfZHVwbGljYXRlX2hlYWRlcl9hdHRyaWJ1dGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaGVhZGVyIGF0dHJpYnV0ZSAnJTAnIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfZXhwZWN0ZWRfYXR0cmlidXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGFuIGF0dHJpYnV0ZSBuYW1lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfbW1hcF9leHBlY3RlZF9jb25maWdfbWFjcm8sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgY29uZmlndXJhdGlvbiBtYWNybyBuYW1lIGFmdGVyICcsJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfZXhwZWN0ZWRfY29uZmxpY3RzX2NvbW1hLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkICcsJyBhZnRlciBjb25mbGljdGluZyBtb2R1bGUgbmFtZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfZXhwZWN0ZWRfY29uZmxpY3RzX21lc3NhZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgYSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGNvbmZsaWN0IHdpdGggJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfZXhwZWN0ZWRfZXhwb3J0X3dpbGRjYXJkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm9ubHkgJyonIGNhbiBiZSBleHBvcnRlZCBmcm9tIGFuIGluZmVycmVkIHN1Ym1vZHVsZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfZXhwZWN0ZWRfZmVhdHVyZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBhIGZlYXR1cmUgbmFtZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfZXhwZWN0ZWRfaGVhZGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGEgaGVhZGVyIG5hbWUgYWZ0ZXIgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfZXhwZWN0ZWRfaGVhZGVyX2F0dHJpYnV0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBhIGhlYWRlciBhdHRyaWJ1dGUgbmFtZSAoJ3NpemUnIG9yICdtdGltZScpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfbW1hcF9leHBlY3RlZF9pbmZlcnJlZF9tZW1iZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgJXNlbGVjdHttb2R1bGUgZXhjbHVzaW9uIHdpdGggJ2V4Y2x1ZGUnfCdleHBvcnQgKid9MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfZXhwZWN0ZWRfbGJyYWNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkICd7JyB0byBzdGFydCBtb2R1bGUgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfZXhwZWN0ZWRfbGJyYWNlX3dpbGRjYXJkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkICd7JyB0byBzdGFydCBpbmZlcnJlZCBzdWJtb2R1bGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9tbWFwX2V4cGVjdGVkX2xpYnJhcnlfbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAlc2VsZWN0e2xpYnJhcnl8ZnJhbWV3b3JrfTAgbmFtZSBhcyBhIHN0cmluZyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfZXhwZWN0ZWRfbWVtYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIHVtYnJlbGxhLCBoZWFkZXIsIHN1Ym1vZHVsZSwgb3IgbW9kdWxlIGV4cG9ydCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfZXhwZWN0ZWRfbW1hcF9maWxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGEgbW9kdWxlIG1hcCBmaWxlIG5hbWUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9tbWFwX2V4cGVjdGVkX21vZHVsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBtb2R1bGUgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9tbWFwX2V4cGVjdGVkX21vZHVsZV9uYW1lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIG1vZHVsZSBuYW1lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfbW1hcF9leHBlY3RlZF9yYnJhY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgJ30nIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfbW1hcF9leHBlY3RlZF9yc3F1YXJlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkICddJyB0byBjbG9zZSBhdHRyaWJ1dGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9tbWFwX2V4cGxpY2l0X2luZmVycmVkX2ZyYW1ld29yaywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbmZlcnJlZCBmcmFtZXdvcmsgbW9kdWxlcyBjYW5ub3QgYmUgJ2V4cGxpY2l0JyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfZXhwbGljaXRfdG9wX2xldmVsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidleHBsaWNpdCcgaXMgbm90IHBlcm1pdHRlZCBvbiB0b3AtbGV2ZWwgbW9kdWxlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfaW5mZXJyZWRfZnJhbWV3b3JrX3N1Ym1vZHVsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbmZlcnJlZCBzdWJtb2R1bGUgY2Fubm90IGJlIGEgZnJhbWV3b3JrIHN1Ym1vZHVsZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfaW5mZXJyZWRfbm9fdW1icmVsbGEsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5mZXJyZWQgc3VibW9kdWxlcyByZXF1aXJlIGEgbW9kdWxlIHdpdGggYW4gdW1icmVsbGEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9tbWFwX2luZmVycmVkX3JlZGVmLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZGVmaW5pdGlvbiBvZiBpbmZlcnJlZCBzdWJtb2R1bGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9tbWFwX2ludmFsaWRfaGVhZGVyX2F0dHJpYnV0ZV92YWx1ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBpbnRlZ2VyIGxpdGVyYWwgYXMgdmFsdWUgZm9yIGhlYWRlciBhdHRyaWJ1dGUgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfbWlzc2luZ19leGNsdWRlX25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgZXhjbHVkZWQgbW9kdWxlIG5hbWUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9tbWFwX21pc3NpbmdfbW9kdWxlX3F1YWxpZmllZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyBtb2R1bGUgbmFtZWQgJyUwJyBpbiAnJTEnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfbW1hcF9taXNzaW5nX21vZHVsZV91bnF1YWxpZmllZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyBtb2R1bGUgbmFtZWQgJyUwJyB2aXNpYmxlIGZyb20gJyUxJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfbW9kdWxlX2lkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGEgbW9kdWxlIG5hbWUgb3IgJyonIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfbW1hcF9tb2R1bGVfcmVkZWZpbml0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZGVmaW5pdGlvbiBvZiBtb2R1bGUgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfbmVzdGVkX3N1Ym1vZHVsZV9pZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJxdWFsaWZpZWQgbW9kdWxlIG5hbWUgY2FuIG9ubHkgYmUgdXNlZCB0byBkZWZpbmUgbW9kdWxlcyBhdCB0aGUgdG9wIGxldmVsIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfbW1hcF9zdWJtb2R1bGVfZXhwb3J0X2FzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm9ubHkgdG9wLWxldmVsIG1vZHVsZXMgY2FuIGJlIHJlLWV4cG9ydGVkIGFzIHB1YmxpYyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfdG9wX2xldmVsX2luZmVycmVkX3N1Ym1vZHVsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJvbmx5IHN1Ym1vZHVsZXMgYW5kIGZyYW1ld29yayBtb2R1bGVzIG1heSBiZSBpbmZlcnJlZCB3aXRoIHdpbGRjYXJkIHN5bnRheCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX21tYXBfdW1icmVsbGFfY2xhc2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW1icmVsbGEgZm9yIG1vZHVsZSAnJTAnIGFscmVhZHkgY292ZXJzIHRoaXMgZGlyZWN0b3J5IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfbW1hcF91bmtub3duX3Rva2VuLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInNraXBwaW5nIHN0cmF5IHRva2VuIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfbW1hcF91c2VfZGVjbF9zdWJtb2R1bGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidXNlIGRlY2xhcmF0aW9ucyBhcmUgb25seSBhbGxvd2VkIGluIHRvcC1sZXZlbCBtb2R1bGVzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfbXVsdGljaGFyX3V0Zl9jaGFyYWN0ZXJfbGl0ZXJhbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJVbmljb2RlIGNoYXJhY3RlciBsaXRlcmFscyBtYXkgbm90IGNvbnRhaW4gbXVsdGlwbGUgY2hhcmFjdGVycyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX25vbl9hc2NpaSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tQVNDSUkgY2hhcmFjdGVycyBhcmUgbm90IGFsbG93ZWQgb3V0c2lkZSBvZiBsaXRlcmFscyBhbmQgaWRlbnRpZmllcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wYXNjYWxfc3RyaW5nX3Rvb19sb25nLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIlBhc2NhbCBzdHJpbmcgaXMgdG9vIGxvbmciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wYXN0ZV9hdF9lbmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJyMjJyBjYW5ub3QgYXBwZWFyIGF0IGVuZCBvZiBtYWNybyBleHBhbnNpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wYXN0ZV9hdF9zdGFydCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInIyMnIGNhbm5vdCBhcHBlYXIgYXQgc3RhcnQgb2YgbWFjcm8gZXhwYW5zaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcGxhY2Vob2xkZXJfaW5fc291cmNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImVkaXRvciBwbGFjZWhvbGRlciBpbiBzb3VyY2UgZmlsZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX2FyY19jZl9jb2RlX2F1ZGl0ZWRfc3ludGF4LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkICdiZWdpbicgb3IgJ2VuZCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF9hc3N1bWVfbm9ubnVsbF9zeW50YXgsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgJ2JlZ2luJyBvciAnZW5kJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTkpCitESUFHKGVycl9wcF9iYWRfcGFzdGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicGFzdGluZyBmb3JtZWQgJyUwJywgYW4gaW52YWxpZCBwcmVwcm9jZXNzaW5nIHRva2VuIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfY29sb25fd2l0aG91dF9xdWVzdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInOicgd2l0aG91dCBwcmVjZWRpbmcgJz8nIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfZGlyZWN0aXZlX3JlcXVpcmVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBwcmVwcm9jZXNzaW5nIGRpcmVjdGl2ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX2RpdmlzaW9uX2J5X3plcm8sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGl2aXNpb24gYnkgemVybyBpbiBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX2RvdWJsZV9iZWdpbl9vZl9hcmNfY2ZfY29kZV9hdWRpdGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFscmVhZHkgaW5zaWRlICcjcHJhZ21hIGNsYW5nIGFyY19jZl9jb2RlX2F1ZGl0ZWQnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfZG91YmxlX2JlZ2luX29mX2Fzc3VtZV9ub25udWxsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFscmVhZHkgaW5zaWRlICcjcHJhZ21hIGNsYW5nIGFzc3VtZV9ub25udWxsJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTkpCitESUFHKGVycl9wcF9kdXBsaWNhdGVfbmFtZV9pbl9hcmdfbGlzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkdXBsaWNhdGUgbWFjcm8gcGFyYW1ldGVyIG5hbWUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF9lbXB0eV9maWxlbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJlbXB0eSBmaWxlbmFtZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX2VuZGlmX3dpdGhvdXRfaWYsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiI2VuZGlmIHdpdGhvdXQgI2lmIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfZW9mX2luX2FyY19jZl9jb2RlX2F1ZGl0ZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJyNwcmFnbWEgY2xhbmcgYXJjX2NmX2NvZGVfYXVkaXRlZCcgd2FzIG5vdCBlbmRlZCB3aXRoaW4gdGhpcyBmaWxlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfZW9mX2luX2Fzc3VtZV9ub25udWxsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIicjcHJhZ21hIGNsYW5nIGFzc3VtZV9ub25udWxsJyB3YXMgbm90IGVuZGVkIHdpdGhpbiB0aGlzIGZpbGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE5KQorRElBRyhlcnJfcHBfZXJyb3Jfb3BlbmluZ19maWxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImVycm9yIG9wZW5pbmcgZmlsZSAnJTAnOiAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX2V4cGVjdGVkX2FmdGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1pc3NpbmcgJTEgYWZ0ZXIgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF9leHBlY3RlZF9jb21tYV9pbl9hcmdfbGlzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBjb21tYSBpbiBtYWNybyBwYXJhbWV0ZXIgbGlzdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX2V4cGVjdGVkX2VvbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBlbmQgb2YgbGluZSBpbiBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX2V4cGVjdGVkX2lkZW50X2luX2FyZ19saXN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGlkZW50aWZpZXIgaW4gbWFjcm8gcGFyYW1ldGVyIGxpc3QiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF9leHBlY3RlZF9tb2R1bGVfbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAlc2VsZWN0e2lkZW50aWZpZXIgYWZ0ZXIgJy4nIGluIHx9MG1vZHVsZSBuYW1lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfZXhwZWN0ZWRfcnBhcmVuLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkICcpJyBpbiBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX2V4cGVjdGVkX3ZhbHVlX2luX2V4cHIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgdmFsdWUgaW4gZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX2V4cGVjdHNfZmlsZW5hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgXCJGSUxFTkFNRVwiIG9yIDxGSUxFTkFNRT4iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF9leHByX2JhZF90b2tlbl9iaW5vcCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0b2tlbiBpcyBub3QgYSB2YWxpZCBiaW5hcnkgb3BlcmF0b3IgaW4gYSBwcmVwcm9jZXNzb3Igc3ViZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX2V4cHJfYmFkX3Rva2VuX2xwYXJlbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmdW5jdGlvbi1saWtlIG1hY3JvICUwIGlzIG5vdCBkZWZpbmVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfZXhwcl9iYWRfdG9rZW5fc3RhcnRfZXhwciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIHRva2VuIGF0IHN0YXJ0IG9mIGEgcHJlcHJvY2Vzc29yIGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF9maWxlX25vdF9mb3VuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICInJTAnIGZpbGUgbm90IGZvdW5kIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfZmlsZV9ub3RfZm91bmRfbm90X2ZhdGFsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiclMCcgZmlsZSBub3QgZm91bmQgd2l0aCA8YW5nbGVkPiBpbmNsdWRlOyB1c2UgXCJxdW90ZXNcIiBpbnN0ZWFkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfaGFzaF9lcnJvciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMjEpCitESUFHKGVycl9wcF9pZGVudGlmaWVyX2FyZ19ub3RfaWRlbnRpZmllciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgY29udmVydCAlMCB0b2tlbiB0byBhbiBpZGVudGlmaWVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfaWxsZWdhbF9mbG9hdGluZ19saXRlcmFsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZsb2F0aW5nIHBvaW50IGxpdGVyYWwgaW4gcHJlcHJvY2Vzc29yIGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF9pbXBvcnRfZGlyZWN0aXZlX21zLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiNpbXBvcnQgb2YgdHlwZSBsaWJyYXJ5IGlzIGFuIHVuc3VwcG9ydGVkIE1pY3Jvc29mdCBmZWF0dXJlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfaW5jbHVkZV9pbl9hcmNfY2ZfY29kZV9hdWRpdGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCAjaW5jbHVkZSBmaWxlcyBpbnNpZGUgJyNwcmFnbWEgY2xhbmcgYXJjX2NmX2NvZGVfYXVkaXRlZCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF9pbmNsdWRlX2luX2Fzc3VtZV9ub25udWxsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCAjaW5jbHVkZSBmaWxlcyBpbnNpZGUgJyNwcmFnbWEgY2xhbmcgYXNzdW1lX25vbm51bGwnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxOSkKK0RJQUcoZXJyX3BwX2luY2x1ZGVfdG9vX2RlZXAsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiI2luY2x1ZGUgbmVzdGVkIHRvbyBkZWVwbHkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF9pbnZhbGlkX2RpcmVjdGl2ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIHByZXByb2Nlc3NpbmcgZGlyZWN0aXZlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfaW52YWxpZF9wb2lzb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2FuIG9ubHkgcG9pc29uIGlkZW50aWZpZXIgdG9rZW5zIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfaW52YWxpZF90b2tfaW5fYXJnX2xpc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCB0b2tlbiBpbiBtYWNybyBwYXJhbWV0ZXIgbGlzdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX2ludmFsaWRfdWRsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7Y2hhcmFjdGVyfGludGVnZXJ9MCBsaXRlcmFsIHdpdGggdXNlci1kZWZpbmVkIHN1ZmZpeCBjYW5ub3QgYmUgdXNlZCBpbiBwcmVwcm9jZXNzb3IgY29uc3RhbnQgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX2xpbmVfZGlnaXRfc2VxdWVuY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHsjbGluZXxHTlUgbGluZSBtYXJrZXJ9MCBkaXJlY3RpdmUgcmVxdWlyZXMgYSBzaW1wbGUgZGlnaXQgc2VxdWVuY2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF9saW5lX2ludmFsaWRfZmlsZW5hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBmaWxlbmFtZSBmb3IgI2xpbmUgZGlyZWN0aXZlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfbGluZV9yZXF1aXJlc19pbnRlZ2VyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiNsaW5lIGRpcmVjdGl2ZSByZXF1aXJlcyBhIHBvc2l0aXZlIGludGVnZXIgYXJndW1lbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF9saW5lbWFya2VyX2ludmFsaWRfZmlsZW5hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBmaWxlbmFtZSBmb3IgbGluZSBtYXJrZXIgZGlyZWN0aXZlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfbGluZW1hcmtlcl9pbnZhbGlkX2ZsYWcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBmbGFnIGxpbmUgbWFya2VyIGRpcmVjdGl2ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX2xpbmVtYXJrZXJfaW52YWxpZF9wb3AsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBsaW5lIG1hcmtlciBmbGFnICcyJzogY2Fubm90IHBvcCBlbXB0eSBpbmNsdWRlIHN0YWNrIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfbGluZW1hcmtlcl9yZXF1aXJlc19pbnRlZ2VyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImxpbmUgbWFya2VyIGRpcmVjdGl2ZSByZXF1aXJlcyBhIHBvc2l0aXZlIGludGVnZXIgYXJndW1lbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF9tYWNyb19ub3RfaWRlbnRpZmllciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtYWNybyBuYW1lIG11c3QgYmUgYW4gaWRlbnRpZmllciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX21hbGZvcm1lZF9pZGVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkICNpZGVudCBkaXJlY3RpdmUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF9taXNzaW5nX2xwYXJlbl9pbl92YW9wdF91c2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWlzc2luZyAnKCcgZm9sbG93aW5nIF9fVkFfT1BUX18iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF9taXNzaW5nX21hY3JvX25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWFjcm8gbmFtZSBtaXNzaW5nIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfbWlzc2luZ19ycGFyZW5faW5fbWFjcm9fZGVmLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1pc3NpbmcgJyknIGluIG1hY3JvIHBhcmFtZXRlciBsaXN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfbW9kdWxlX2JlZ2luX25vX21vZHVsZV9tYXAsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gbW9kdWxlIG1hcCBhdmFpbGFibGUgZm9yIG1vZHVsZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX21vZHVsZV9iZWdpbl9ub19zdWJtb2R1bGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic3VibW9kdWxlICUwLiUxIG5vdCBkZWNsYXJlZCBpbiBtb2R1bGUgbWFwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfbW9kdWxlX2JlZ2luX3dpdGhvdXRfbW9kdWxlX2VuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyBtYXRjaGluZyAnI3ByYWdtYSBjbGFuZyBtb2R1bGUgZW5kJyBmb3IgdGhpcyAnI3ByYWdtYSBjbGFuZyBtb2R1bGUgYmVnaW4nIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfbW9kdWxlX2JlZ2luX3dyb25nX21vZHVsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtdXN0IHNwZWNpZnkgJy1mbW9kdWxlLW5hbWU9JTAnIHRvIGVudGVyICVzZWxlY3R7fHN1Ym1vZHVsZSBvZiB9MXRoaXMgbW9kdWxlJXNlbGVjdHsgKGN1cnJlbnQgbW9kdWxlIGlzICUzKXx9MiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX21vZHVsZV9idWlsZF9taXNzaW5nX2VuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyBtYXRjaGluZyAnI3ByYWdtYSBjbGFuZyBtb2R1bGUgZW5kYnVpbGQnIGZvciB0aGlzICcjcHJhZ21hIGNsYW5nIG1vZHVsZSBidWlsZCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF9tb2R1bGVfYnVpbGRfcHRoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIicjcHJhZ21hIGNsYW5nIG1vZHVsZSBidWlsZCcgbm90IHN1cHBvcnRlZCBpbiBwcmV0b2tlbml6ZWQgaGVhZGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfbW9kdWxlX2VuZF93aXRob3V0X21vZHVsZV9iZWdpbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyBtYXRjaGluZyAnI3ByYWdtYSBjbGFuZyBtb2R1bGUgYmVnaW4nIGZvciB0aGlzICcjcHJhZ21hIGNsYW5nIG1vZHVsZSBlbmQnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfbmVzdGVkX3BhcmVuLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5lc3RlZCBwYXJlbnRoZXNlcyBub3QgcGVybWl0dGVkIGluICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfb3BlbmNsX3ZhcmlhZGljX21hY3JvcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2YXJpYWRpYyBtYWNyb3Mgbm90IHN1cHBvcnRlZCBpbiBPcGVuQ0wiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF9vcGVyYXRvcl91c2VkX2FzX21hY3JvX25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiQysrIG9wZXJhdG9yICUwIChha2EgJTEpIHVzZWQgYXMgYSBtYWNybyBuYW1lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfcmVtYWluZGVyX2J5X3plcm8sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVtYWluZGVyIGJ5IHplcm8gaW4gcHJlcHJvY2Vzc29yIGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF9zdHJpbmdpemVfbm90X3BhcmFtZXRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInJXNlbGVjdHsjfCNAfTAnIGlzIG5vdCBmb2xsb3dlZCBieSBhIG1hY3JvIHBhcmFtZXRlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX3VubWF0Y2hlZF9lbmRfb2ZfYXJjX2NmX2NvZGVfYXVkaXRlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub3QgY3VycmVudGx5IGluc2lkZSAnI3ByYWdtYSBjbGFuZyBhcmNfY2ZfY29kZV9hdWRpdGVkJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3BwX3VubWF0Y2hlZF9lbmRfb2ZfYXNzdW1lX25vbm51bGwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm90IGN1cnJlbnRseSBpbnNpZGUgJyNwcmFnbWEgY2xhbmcgYXNzdW1lX25vbm51bGwnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxOSkKK0RJQUcoZXJyX3BwX3VudGVybWluYXRlZF9jb25kaXRpb25hbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bnRlcm1pbmF0ZWQgY29uZGl0aW9uYWwgZGlyZWN0aXZlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHBfdXNlZF9wb2lzb25lZF9pZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhdHRlbXB0IHRvIHVzZSBhIHBvaXNvbmVkIGlkZW50aWZpZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF92YW9wdF9uZXN0ZWRfdXNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIl9fVkFfT1BUX18gY2Fubm90IGJlIG5lc3RlZCB3aXRoaW4gaXRzIG93biByZXBsYWNlbWVudCB0b2tlbnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl9wcF92aXNpYmlsaXR5X25vbl9tYWNybywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyBtYWNybyBuYW1lZCAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3ByYWdtYV9tZXNzYWdlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHJhZ21hX21lc3NhZ2VfbWFsZm9ybWVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInByYWdtYSAlc2VsZWN0e21lc3NhZ2V8d2FybmluZ3xlcnJvcn0wIHJlcXVpcmVzIHBhcmVudGhlc2l6ZWQgc3RyaW5nIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfcHJhZ21hX3B1c2hfcG9wX21hY3JvX21hbGZvcm1lZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwcmFnbWEgJTAgcmVxdWlyZXMgYSBwYXJlbnRoZXNpemVkIHN0cmluZyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3Jhd19kZWxpbV90b29fbG9uZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyYXcgc3RyaW5nIGRlbGltaXRlciBsb25nZXIgdGhhbiAxNiBjaGFyYWN0ZXJzOyB1c2UgUFJFRklYKCApUFJFRklYIHRvIGRlbGltaXQgcmF3IHN0cmluZyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3N0cmluZ19jb25jYXRfbWl4ZWRfc3VmZml4LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRpZmZlcmluZyB1c2VyLWRlZmluZWQgc3VmZml4ZXMgKCclMCcgYW5kICclMScpIGluIHN0cmluZyBsaXRlcmFsIGNvbmNhdGVuYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl90b29fZmV3X2FyZ3NfaW5fbWFjcm9faW52b2MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidG9vIGZldyBhcmd1bWVudHMgcHJvdmlkZWQgdG8gZnVuY3Rpb24tbGlrZSBtYWNybyBpbnZvY2F0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfdG9vX21hbnlfYXJnc19pbl9tYWNyb19pbnZvYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0b28gbWFueSBhcmd1bWVudHMgcHJvdmlkZWQgdG8gZnVuY3Rpb24tbGlrZSBtYWNybyBpbnZvY2F0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfdWNuX2NvbnRyb2xfY2hhcmFjdGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuaXZlcnNhbCBjaGFyYWN0ZXIgbmFtZSByZWZlcnMgdG8gYSBjb250cm9sIGNoYXJhY3RlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3Vjbl9lc2NhcGVfYmFzaWNfc2NzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNoYXJhY3RlciAnJTAnIGNhbm5vdCBiZSBzcGVjaWZpZWQgYnkgYSB1bml2ZXJzYWwgY2hhcmFjdGVyIG5hbWUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl91Y25fZXNjYXBlX2luY29tcGxldGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5jb21wbGV0ZSB1bml2ZXJzYWwgY2hhcmFjdGVyIG5hbWUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl91Y25fZXNjYXBlX2ludmFsaWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCB1bml2ZXJzYWwgY2hhcmFjdGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfdW5kZWNsYXJlZF91c2Vfb2ZfbW9kdWxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1vZHVsZSAlMCBkb2VzIG5vdCBkZXBlbmQgb24gYSBtb2R1bGUgZXhwb3J0aW5nICclMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl91bnN1cHBvcnRlZF9zdHJpbmdfY29uY2F0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuc3VwcG9ydGVkIG5vbi1zdGFuZGFyZCBjb25jYXRlbmF0aW9uIG9mIHN0cmluZyBsaXRlcmFscyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3VudGVybV9tYWNyb19pbnZvYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bnRlcm1pbmF0ZWQgZnVuY3Rpb24tbGlrZSBtYWNybyBpbnZvY2F0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfdW50ZXJtaW5hdGVkX19fcHJhZ21hLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1pc3NpbmcgdGVybWluYXRpbmcgJyknIGNoYXJhY3RlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3VudGVybWluYXRlZF9ibG9ja19jb21tZW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVudGVybWluYXRlZCAvKiBjb21tZW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxKQorRElBRyhlcnJfdW50ZXJtaW5hdGVkX3Jhd19zdHJpbmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmF3IHN0cmluZyBtaXNzaW5nIHRlcm1pbmF0aW5nIGRlbGltaXRlciApJTBcIiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXJyX3Zhb3B0X3Bhc3RlX2F0X2VuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInIyMnIGNhbm5vdCBhcHBlYXIgYXQgZW5kIG9mIF9fVkFfT1BUX18gYXJndW1lbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKGVycl92YW9wdF9wYXN0ZV9hdF9zdGFydCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInIyMnIGNhbm5vdCBhcHBlYXIgYXQgc3RhcnQgb2YgX19WQV9PUFRfXyBhcmd1bWVudCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMSkKK0RJQUcoZXNjYXBlZF9uZXdsaW5lX2Jsb2NrX2NvbW1lbnRfZW5kLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJlc2NhcGVkIG5ld2xpbmUgYmV0d2VlbiAqLyBjaGFyYWN0ZXJzIGF0IGJsb2NrIGNvbW1lbnQgZW5kIiwgMTIyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X2JpbmFyeV9saXRlcmFsLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImJpbmFyeSBpbnRlZ2VyIGxpdGVyYWxzIGFyZSBhIEdOVSBleHRlbnNpb24iLCAyNDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhleHRfYmluYXJ5X2xpdGVyYWxfY3h4MTQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiYmluYXJ5IGludGVnZXIgbGl0ZXJhbHMgYXJlIGEgQysrMTQgZXh0ZW5zaW9uIiwgODIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhleHRfYzk5X3doaXRlc3BhY2VfcmVxdWlyZWRfYWZ0ZXJfbWFjcm9fbmFtZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJJU08gQzk5IHJlcXVpcmVzIHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIG1hY3JvIG5hbWUiLCAxMTIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhleHRfY2hhcml6ZV9taWNyb3NvZnQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiY2hhcml6aW5nIG9wZXJhdG9yICNAIGlzIGEgTWljcm9zb2Z0IGV4dGVuc2lvbiIsIDM1MiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKGV4dF9jb21tZW50X3Bhc3RlX21pY3Jvc29mdCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJwYXN0aW5nIHR3byAnLycgdG9rZW5zIGludG8gYSAnLy8nIGNvbW1lbnQgaXMgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uIiwgMzUzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X2N0cmxfel9lb2ZfbWljcm9zb2Z0LCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInRyZWF0aW5nIEN0cmwtWiBhcyBlbmQtb2YtZmlsZSBpcyBhIE1pY3Jvc29mdCBleHRlbnNpb24iLCAzNTcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhleHRfZG9sbGFyX2luX2lkZW50aWZpZXIsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJyQnIGluIGlkZW50aWZpZXIiLCAxNzksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhleHRfZW1iZWRkZWRfZGlyZWN0aXZlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImVtYmVkZGluZyBhIGRpcmVjdGl2ZSB3aXRoaW4gbWFjcm8gYXJndW1lbnRzIGhhcyB1bmRlZmluZWQgYmVoYXZpb3IiLCAxODksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhleHRfZW1wdHlfY2hhcmFjdGVyLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImVtcHR5IGNoYXJhY3RlciBjb25zdGFudCIsIDMyNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKGV4dF9lbXB0eV9mbm1hY3JvX2FyZywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJlbXB0eSBtYWNybyBhcmd1bWVudHMgYXJlIGEgQzk5IGZlYXR1cmUiLCAxMTIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhleHRfZm91cl9jaGFyX2NoYXJhY3Rlcl9saXRlcmFsLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm11bHRpLWNoYXJhY3RlciBjaGFyYWN0ZXIgY29uc3RhbnQiLCAyMjksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhleHRfaGV4X2NvbnN0YW50X2ludmFsaWQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiaGV4YWRlY2ltYWwgZmxvYXRpbmcgY29uc3RhbnRzIGFyZSBhIEM5OSBmZWF0dXJlIiwgMTEyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X2hleF9saXRlcmFsX2ludmFsaWQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiaGV4YWRlY2ltYWwgZmxvYXRpbmcgbGl0ZXJhbHMgYXJlIGEgQysrMTcgZmVhdHVyZSIsIDg5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X2xpbmVfY29tbWVudCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIvLyBjb21tZW50cyBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyBsYW5ndWFnZSIsIDEyMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKGV4dF9taXNzaW5nX3ZhcmFyZ3NfYXJnLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgYXJndW1lbnQgZm9yICcuLi4nIHBhcmFtZXRlciBvZiB2YXJpYWRpYyBtYWNybyIsIDI2MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKGV4dF9taXNzaW5nX3doaXRlc3BhY2VfYWZ0ZXJfbWFjcm9fbmFtZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ3aGl0ZXNwYWNlIHJlcXVpcmVkIGFmdGVyIG1hY3JvIG5hbWUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X21zX3Jlc2VydmVkX3VzZXJfZGVmaW5lZF9saXRlcmFsLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImludmFsaWQgc3VmZml4IG9uIGxpdGVyYWw7IEMrKzExIHJlcXVpcmVzIGEgc3BhY2UgYmV0d2VlbiBsaXRlcmFsIGFuZCBpZGVudGlmaWVyIiwgNTQxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X211bHRpX2xpbmVfbGluZV9jb21tZW50LCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm11bHRpLWxpbmUgLy8gY29tbWVudCIsIDEyMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKGV4dF9tdWx0aWNoYXJfY2hhcmFjdGVyX2xpdGVyYWwsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibXVsdGktY2hhcmFjdGVyIGNoYXJhY3RlciBjb25zdGFudCIsIDQwNywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKGV4dF9uYW1lZF92YXJpYWRpY19tYWNybywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJuYW1lZCB2YXJpYWRpYyBtYWNyb3MgYXJlIGEgR05VIGV4dGVuc2lvbiIsIDcwNywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKGV4dF9ub19uZXdsaW5lX2VvZiwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJubyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlIiwgNDEzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X25vbnN0YW5kYXJkX2VzY2FwZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ1c2Ugb2Ygbm9uLXN0YW5kYXJkIGVzY2FwZSBjaGFyYWN0ZXIgJ1xcJTAnIiwgNTAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X29uX29mZl9zd2l0Y2hfc3ludGF4LCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImV4cGVjdGVkICdPTicgb3IgJ09GRicgb3IgJ0RFRkFVTFQnIGluIHByYWdtYSIsIDY2MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKGV4dF9wYXN0ZV9jb21tYSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ0b2tlbiBwYXN0aW5nIG9mICcsJyBhbmQgX19WQV9BUkdTX18gaXMgYSBHTlUgZXh0ZW5zaW9uIiwgMjYxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X3BwX2JhZF9wYXN0ZV9tcywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicGFzdGluZyBmb3JtZWQgJyUwJywgYW4gaW52YWxpZCBwcmVwcm9jZXNzaW5nIHRva2VuIiwgMzI2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X3BwX2JhZF92YWFyZ3NfdXNlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIl9fVkFfQVJHU19fIGNhbiBvbmx5IGFwcGVhciBpbiB0aGUgZXhwYW5zaW9uIG9mIGEgQzk5IHZhcmlhZGljIG1hY3JvIiwgNTAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X3BwX2JhZF92YW9wdF91c2UsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiX19WQV9PUFRfXyBjYW4gb25seSBhcHBlYXIgaW4gdGhlIGV4cGFuc2lvbiBvZiBhIHZhcmlhZGljIG1hY3JvIiwgNzA3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X3BwX2NvbW1hX2V4cHIsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiY29tbWEgb3BlcmF0b3IgaW4gb3BlcmFuZCBvZiAjaWYiLCA1MDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhleHRfcHBfZXh0cmFfdG9rZW5zX2F0X2VvbCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleHRyYSB0b2tlbnMgYXQgZW5kIG9mICMlMCBkaXJlY3RpdmUiLCAyMTAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhleHRfcHBfaWRlbnRfZGlyZWN0aXZlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiNpZGVudCBpcyBhIGxhbmd1YWdlIGV4dGVuc2lvbiIsIDUwMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKGV4dF9wcF9pbXBvcnRfZGlyZWN0aXZlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiNpbXBvcnQgaXMgYSBsYW5ndWFnZSBleHRlbnNpb24iLCAyODIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhleHRfcHBfaW5jbHVkZV9uZXh0X2RpcmVjdGl2ZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIjaW5jbHVkZV9uZXh0IGlzIGEgbGFuZ3VhZ2UgZXh0ZW5zaW9uIiwgMjUyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X3BwX2luY2x1ZGVfc2VhcmNoX21zLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiNpbmNsdWRlIHJlc29sdmVkIHVzaW5nIG5vbi1wb3J0YWJsZSBNaWNyb3NvZnQgc2VhcmNoIHJ1bGVzIGFzOiAlMCIsIDM2OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKGV4dF9wcF9saW5lX3Rvb19iaWcsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiQyByZXF1aXJlcyAjbGluZSBudW1iZXIgdG8gYmUgbGVzcyB0aGFuICUwLCBhbGxvd2VkIGFzIGV4dGVuc2lvbiIsIDUwMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKGV4dF9wcF9saW5lX3plcm8sIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiI2xpbmUgZGlyZWN0aXZlIHdpdGggemVybyBhcmd1bWVudCBpcyBhIEdOVSBleHRlbnNpb24iLCAyNjAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhleHRfcHBfbWFjcm9fcmVkZWYsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgbWFjcm8gcmVkZWZpbmVkIiwgMzQxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X3BwX29wZXJhdG9yX3VzZWRfYXNfbWFjcm9fbmFtZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJDKysgb3BlcmF0b3IgJTAgKGFrYSAlMSkgdXNlZCBhcyBhIG1hY3JvIG5hbWUiLCAzNTUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhleHRfcHBfcmVkZWZfYnVpbHRpbl9tYWNybywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJyZWRlZmluaW5nIGJ1aWx0aW4gbWFjcm8iLCA2NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKGV4dF9wcF91bmRlZl9idWlsdGluX21hY3JvLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVuZGVmaW5pbmcgYnVpbHRpbiBtYWNybyIsIDY2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X3BwX3dhcm5pbmdfZGlyZWN0aXZlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiN3YXJuaW5nIGlzIGEgbGFuZ3VhZ2UgZXh0ZW5zaW9uIiwgNTAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X3ByYWdtYV9zeW50YXhfZW9kLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImV4cGVjdGVkIGVuZCBvZiBkaXJlY3RpdmUgaW4gcHJhZ21hIiwgNjYwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X3Jlc2VydmVkX3VzZXJfZGVmaW5lZF9saXRlcmFsLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIHN1ZmZpeCBvbiBsaXRlcmFsOyBDKysxMSByZXF1aXJlcyBhIHNwYWNlIGJldHdlZW4gbGl0ZXJhbCBhbmQgaWRlbnRpZmllciIsIDU0MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKGV4dF9zdHJpbmdfdG9vX2xvbmcsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAic3RyaW5nIGxpdGVyYWwgb2YgbGVuZ3RoICUwIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggJTEgdGhhdCAlc2VsZWN0e0M5MHxJU08gQzk5fEMrK30yIGNvbXBpbGVycyBhcmUgcmVxdWlyZWQgdG8gc3VwcG9ydCIsIDQ4NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKGV4dF90b2tlbl91c2VkLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImV4dGVuc2lvbiB1c2VkIiwgMzMxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X3VuaWNvZGVfd2hpdGVzcGFjZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ0cmVhdGluZyBVbmljb2RlIGNoYXJhY3RlciBhcyB3aGl0ZXNwYWNlIiwgNjU1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcoZXh0X3Vua25vd25fZXNjYXBlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVua25vd24gZXNjYXBlIHNlcXVlbmNlICdcXCUwJyIsIDY1OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKGV4dF91bnRlcm1pbmF0ZWRfY2hhcl9vcl9zdHJpbmcsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibWlzc2luZyB0ZXJtaW5hdGluZyAlc2VsZWN0eyd8J1wiJ30wIGNoYXJhY3RlciIsIDMyNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKGV4dF92YXJpYWRpY19tYWNybywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ2YXJpYWRpYyBtYWNyb3MgYXJlIGEgQzk5IGZlYXR1cmUiLCA3MDcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhub3RlX2hlYWRlcl9ndWFyZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiUwIGlzIGRlZmluZWQgaGVyZTsgZGlkIHlvdSBtZWFuICUxPyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhub3RlX2ltcGxpY2l0X3RvcF9sZXZlbF9tb2R1bGVfaW1wb3J0X2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJzdWJtb2R1bGUgb2YgdG9wLWxldmVsIG1vZHVsZSAnJTAnIGltcGxpY2l0bHkgaW1wb3J0ZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhub3RlX2luaXRfbGlzdF9hdF9iZWdpbm5pbmdfb2ZfbWFjcm9fYXJndW1lbnQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjYW5ub3QgdXNlIGluaXRpYWxpemVyIGxpc3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhIG1hY3JvIGFyZ3VtZW50IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKG5vdGVfbWFjcm9faGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm1hY3JvICUwIGRlZmluZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhub3RlX21tYXBfbGJyYWNlX21hdGNoLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidG8gbWF0Y2ggdGhpcyAneyciLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcobm90ZV9tbWFwX2xzcXVhcmVfbWF0Y2gsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ0byBtYXRjaCB0aGlzICddJyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhub3RlX21tYXBfcHJldl9kZWZpbml0aW9uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJldmlvdXNseSBkZWZpbmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcobm90ZV9tbWFwX3JlbmFtZV90b3BfbGV2ZWxfcHJpdmF0ZV9tb2R1bGUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJyZW5hbWUgJyUwJyB0byBlbnN1cmUgaXQgY2FuIGJlIGZvdW5kIGJ5IG5hbWUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcobm90ZV9wcF9hbWJpZ3VvdXNfbWFjcm9fY2hvc2VuLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZXhwYW5kaW5nIHRoaXMgZGVmaW5pdGlvbiBvZiAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhub3RlX3BwX2FtYmlndW91c19tYWNyb19vdGhlciwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm90aGVyIGRlZmluaXRpb24gb2YgJTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcobm90ZV9wcF9tb2R1bGVfYmVnaW5faGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImVudGVyaW5nIG1vZHVsZSAnJTAnIGR1ZSB0byB0aGlzIHByYWdtYSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhub3RlX3N1Z2dlc3RfcGFyZW5zX2Zvcl9tYWNybywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInBhcmVudGhlc2VzIGFyZSByZXF1aXJlZCBhcm91bmQgbWFjcm8gYXJndW1lbnQgY29udGFpbmluZyBicmFjZWQgaW5pdGlhbGl6ZXIgbGlzdCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhub3RlX3Vjbl9mb3VyX25vdF9laWdodCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRpZCB5b3UgbWVhbiB0byB1c2UgJ1xcdSc/IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKG51bGxfaW5fY2hhcl9vcl9zdHJpbmcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm51bGwgY2hhcmFjdGVyKHMpIHByZXNlcnZlZCBpbiAlc2VsZWN0e2NoYXJ8c3RyaW5nfTAgbGl0ZXJhbCIsIDQyOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKG51bGxfaW5fZmlsZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibnVsbCBjaGFyYWN0ZXIgaWdub3JlZCIsIDQyOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHBwX2Rpc2FibGVkX21hY3JvX2V4cGFuc2lvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZGlzYWJsZWQgZXhwYW5zaW9uIG9mIHJlY3Vyc2l2ZSBtYWNybyIsIDE2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHBwX2Vycl9lbGlmX2FmdGVyX2Vsc2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiI2VsaWYgYWZ0ZXIgI2Vsc2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKHBwX2Vycl9lbGlmX3dpdGhvdXRfaWYsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiI2VsaWYgd2l0aG91dCAjaWYiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKHBwX2Vycl9lbHNlX2FmdGVyX2Vsc2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiI2Vsc2UgYWZ0ZXIgI2Vsc2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKHBwX2Vycl9lbHNlX3dpdGhvdXRfaWYsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiI2Vsc2Ugd2l0aG91dCAjaWYiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKHBwX2hhc2hfd2FybmluZywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAiLCAyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCB0cnVlLCAyMSkKK0RJQUcocHBfaW5jbHVkZV9tYWNyb3Nfb3V0X29mX3ByZWRlZmluZXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhlICNfX2luY2x1ZGVfbWFjcm9zIGRpcmVjdGl2ZSBpcyBvbmx5IGZvciBpbnRlcm5hbCB1c2UgYnkgLWltYWNyb3MiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEpCitESUFHKHBwX2luY2x1ZGVfbmV4dF9hYnNvbHV0ZV9wYXRoLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIjaW5jbHVkZV9uZXh0IHdpdGggYWJzb2x1dGUgcGF0aCIsIDI4NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHBwX2luY2x1ZGVfbmV4dF9pbl9wcmltYXJ5LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIjaW5jbHVkZV9uZXh0IGluIHByaW1hcnkgc291cmNlIGZpbGUiLCAyODUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhwcF9pbnZhbGlkX3N0cmluZ19saXRlcmFsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpbnZhbGlkIHN0cmluZyBsaXRlcmFsLCBpZ25vcmluZyBmaW5hbCAnXFwnIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHBwX21hY3JvX25vdF91c2VkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJtYWNybyBpcyBub3QgdXNlZCIsIDY5MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHBwX25vbnBvcnRhYmxlX3BhdGgsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm5vbi1wb3J0YWJsZSBwYXRoIHRvIGZpbGUgJyUwJzsgc3BlY2lmaWVkIHBhdGggZGlmZmVycyBpbiBjYXNlIGZyb20gZmlsZSBuYW1lIG9uIGRpc2siLCA0MjMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyhwcF9ub25wb3J0YWJsZV9zeXN0ZW1fcGF0aCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAibm9uLXBvcnRhYmxlIHBhdGggdG8gZmlsZSAnJTAnOyBzcGVjaWZpZWQgcGF0aCBkaWZmZXJzIGluIGNhc2UgZnJvbSBmaWxlIG5hbWUgb24gZGlzayIsIDQyNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHBwX291dF9vZl9kYXRlX2RlcGVuZGVuY3ksIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImN1cnJlbnQgZmlsZSBpcyBvbGRlciB0aGFuIGRlcGVuZGVuY3kgJTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcocHBfcG9pc29uaW5nX2V4aXN0aW5nX21hY3JvLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJwb2lzb25pbmcgZXhpc3RpbmcgbWFjcm8iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcocHBfcHJhZ21hX29uY2VfaW5fbWFpbl9maWxlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIjcHJhZ21hIG9uY2UgaW4gbWFpbiBmaWxlIiwgNTEwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcocHBfcHJhZ21hX3N5c2hlYWRlcl9pbl9tYWluX2ZpbGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiNwcmFnbWEgc3lzdGVtX2hlYWRlciBpZ25vcmVkIGluIG1haW4gZmlsZSIsIDUxMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHRyaWdyYXBoX2NvbnZlcnRlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidHJpZ3JhcGggY29udmVydGVkIHRvICclMCcgY2hhcmFjdGVyIiwgNjM0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcodHJpZ3JhcGhfZW5kc19ibG9ja19jb21tZW50LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ0cmlncmFwaCBlbmRzIGJsb2NrIGNvbW1lbnQiLCA2MzQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh0cmlncmFwaF9pZ25vcmVkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ0cmlncmFwaCBpZ25vcmVkIiwgNjM0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcodHJpZ3JhcGhfaWdub3JlZF9ibG9ja19jb21tZW50LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpZ25vcmVkIHRyaWdyYXBoIHdvdWxkIGVuZCBibG9jayBjb21tZW50IiwgNjM0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9hdXRvX21vZHVsZV9pbXBvcnQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInRyZWF0aW5nICMlc2VsZWN0e2luY2x1ZGV8aW1wb3J0fGluY2x1ZGVfbmV4dHxfX2luY2x1ZGVfbWFjcm9zfTAgYXMgYW4gaW1wb3J0IG9mIG1vZHVsZSAnJTEnIiwgNDcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX2JhZF9jaGFyYWN0ZXJfZW5jb2RpbmcsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaWxsZWdhbCBjaGFyYWN0ZXIgZW5jb2RpbmcgaW4gY2hhcmFjdGVyIGxpdGVyYWwiLCAzMjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX2JhZF9zdHJpbmdfZW5jb2RpbmcsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaWxsZWdhbCBjaGFyYWN0ZXIgZW5jb2RpbmcgaW4gc3RyaW5nIGxpdGVyYWwiLCAzMjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX2M5OV9jb21wYXRfdW5pY29kZV9pZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJXNlbGVjdHt1c2luZyB0aGlzIGNoYXJhY3RlciBpbiBhbiBpZGVudGlmaWVyfHN0YXJ0aW5nIGFuIGlkZW50aWZpZXIgd2l0aCB0aGlzIGNoYXJhY3Rlcn0wIGlzIGluY29tcGF0aWJsZSB3aXRoIEM5OSIsIDExMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fYzk5X2NvbXBhdF91bmljb2RlX2xpdGVyYWwsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVuaWNvZGUgbGl0ZXJhbHMgYXJlIGluY29tcGF0aWJsZSB3aXRoIEM5OSIsIDExMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fY2hhcl9jb25zdGFudF90b29fbGFyZ2UsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNoYXJhY3RlciBjb25zdGFudCB0b28gbG9uZyBmb3IgaXRzIHR5cGUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9jeHgxMV9jb21wYXRfYmluYXJ5X2xpdGVyYWwsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImJpbmFyeSBpbnRlZ2VyIGxpdGVyYWxzIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBDKysgc3RhbmRhcmRzIGJlZm9yZSBDKysxNCIsIDEwMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fY3h4MTFfY29tcGF0X2RpZ2l0X3NlcGFyYXRvciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZGlnaXQgc2VwYXJhdG9ycyBhcmUgaW5jb21wYXRpYmxlIHdpdGggQysrIHN0YW5kYXJkcyBiZWZvcmUgQysrMTQiLCAxMDEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX2N4eDExX2NvbXBhdF9yZXNlcnZlZF91c2VyX2RlZmluZWRfbGl0ZXJhbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiaWRlbnRpZmllciBhZnRlciBsaXRlcmFsIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHJlc2VydmVkIHVzZXItZGVmaW5lZCBsaXRlcmFsIHN1ZmZpeCBpbiBDKysxMSIsIDc2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9jeHgxMV9jb21wYXRfdXNlcl9kZWZpbmVkX2xpdGVyYWwsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImlkZW50aWZpZXIgYWZ0ZXIgbGl0ZXJhbCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSB1c2VyLWRlZmluZWQgbGl0ZXJhbCBzdWZmaXggaW4gQysrMTEiLCA3MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fY3h4MTFfa2V5d29yZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJyUwJyBpcyBhIGtleXdvcmQgaW4gQysrMTEiLCA3MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fY3h4MTRfY29tcGF0X3U4X2NoYXJhY3Rlcl9saXRlcmFsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ1bmljb2RlIGxpdGVyYWxzIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBDKysgc3RhbmRhcmRzIGJlZm9yZSBDKysxNyIsIDk5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9jeHgxN19jb21wYXRfc3BhY2VzaGlwLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICInPD0+JyBvcGVyYXRvciBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKysgc3RhbmRhcmRzIGJlZm9yZSBDKysyYSIsIDk3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9jeHgxN19oZXhfbGl0ZXJhbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiaGV4YWRlY2ltYWwgZmxvYXRpbmcgbGl0ZXJhbHMgYXJlIGluY29tcGF0aWJsZSB3aXRoIEMrKyBzdGFuZGFyZHMgYmVmb3JlIEMrKzE3IiwgMTAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9jeHgyYV9jb21wYXRfc3BhY2VzaGlwLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICInPD0+JyBpcyBhIHNpbmdsZSB0b2tlbiBpbiBDKysyYTsgYWRkIGEgc3BhY2UgdG8gYXZvaWQgYSBjaGFuZ2UgaW4gYmVoYXZpb3IiLCA5NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fY3h4MmFfa2V5d29yZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJyUwJyBpcyBhIGtleXdvcmQgaW4gQysrMmEiLCA5NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X2VtcHR5X2ZubWFjcm9fYXJnLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJlbXB0eSBtYWNybyBhcmd1bWVudHMgYXJlIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfbGVzc19jb2xvbl9jb2xvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJzw6OicgaXMgdHJlYXRlZCBhcyBkaWdyYXBoICc8OicgKGFrYSAnWycpIGZvbGxvd2VkIGJ5ICc6JyBpbiBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X2xpdGVyYWxfdWNuX2NvbnRyb2xfY2hhcmFjdGVyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ1bml2ZXJzYWwgY2hhcmFjdGVyIG5hbWUgcmVmZXJyaW5nIHRvIGEgY29udHJvbCBjaGFyYWN0ZXIgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF9saXRlcmFsX3Vjbl9lc2NhcGVfYmFzaWNfc2NzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJzcGVjaWZ5aW5nIGNoYXJhY3RlciAnJTAnIHdpdGggYSB1bml2ZXJzYWwgY2hhcmFjdGVyIG5hbWUgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF9ub19uZXdsaW5lX2VvZiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiQysrOTggcmVxdWlyZXMgbmV3bGluZSBhdCBlbmQgb2YgZmlsZSIsIDEwOCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X3BwX2xpbmVfdG9vX2JpZywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiI2xpbmUgbnVtYmVyIGdyZWF0ZXIgdGhhbiAzMjc2NyBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwOCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X3Jhd19zdHJpbmdfbGl0ZXJhbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAicmF3IHN0cmluZyBsaXRlcmFscyBhcmUgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF91bmljb2RlX2lkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ1c2luZyB0aGlzIGNoYXJhY3RlciBpbiBhbiBpZGVudGlmaWVyIGlzIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfdW5pY29kZV9saXRlcmFsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ1bmljb2RlIGxpdGVyYWxzIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X3ZhcmlhZGljX21hY3JvLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ2YXJpYWRpYyBtYWNyb3MgYXJlIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9kZWZpbmVkX2luX2Z1bmN0aW9uX3R5cGVfbWFjcm8sIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAibWFjcm8gZXhwYW5zaW9uIHByb2R1Y2luZyAnZGVmaW5lZCcgaGFzIHVuZGVmaW5lZCBiZWhhdmlvciIsIDIwMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fZGVmaW5lZF9pbl9vYmplY3RfdHlwZV9tYWNybywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibWFjcm8gZXhwYW5zaW9uIHByb2R1Y2luZyAnZGVmaW5lZCcgaGFzIHVuZGVmaW5lZCBiZWhhdmlvciIsIDIwMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fZXh0cmFuZW91c19jaGFyX2NvbnN0YW50LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleHRyYW5lb3VzIGNoYXJhY3RlcnMgaW4gY2hhcmFjdGVyIGNvbnN0YW50IGlnbm9yZWQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9oYXNfd2FybmluZ19pbnZhbGlkX29wdGlvbiwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJfX2hhc193YXJuaW5nIGV4cGVjdGVkIG9wdGlvbiBuYW1lIChlLmcuIFwiLVd1bmRlZlwiKSIsIDM0NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5faGVhZGVyX2d1YXJkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMCBpcyB1c2VkIGFzIGEgaGVhZGVyIGd1YXJkIGhlcmUsIGZvbGxvd2VkIGJ5ICNkZWZpbmUgb2YgYSBkaWZmZXJlbnQgbWFjcm8iLCAyNjIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX21pc3Npbmdfd2hpdGVzcGFjZV9hZnRlcl9tYWNyb19uYW1lLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ3aGl0ZXNwYWNlIHJlY29tbWVuZGVkIGFmdGVyIG1hY3JvIG5hbWUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9tbWFwX21pc21hdGNoZWRfcHJpdmF0ZV9tb2R1bGVfbmFtZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZXhwZWN0ZWQgY2Fub25pY2FsIG5hbWUgZm9yIHByaXZhdGUgbW9kdWxlICclMCciLCA1MTgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX21tYXBfbWlzbWF0Y2hlZF9wcml2YXRlX3N1Ym1vZHVsZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicHJpdmF0ZSBzdWJtb2R1bGUgJyUwJyBpbiBwcml2YXRlIG1vZHVsZSBtYXAsIGV4cGVjdGVkIHRvcC1sZXZlbCBtb2R1bGUiLCA1MTgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX21tYXBfcmVkdW5kYW50X2V4cG9ydF9hcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibW9kdWxlICclMCcgYWxyZWFkeSByZS1leHBvcnRlZCBhcyAnJTEnIiwgNTE4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9tbWFwX3VtYnJlbGxhX2Rpcl9ub3RfZm91bmQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVtYnJlbGxhIGRpcmVjdG9yeSAnJTAnIG5vdCBmb3VuZCIsIDI5NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fbW1hcF91bmtub3duX2F0dHJpYnV0ZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidW5rbm93biBhdHRyaWJ1dGUgJyUwJyIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fbW9kdWxlX2NvbmZsaWN0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJtb2R1bGUgJyUwJyBjb25mbGljdHMgd2l0aCBhbHJlYWR5LWltcG9ydGVkIG1vZHVsZSAnJTEnOiAlMiIsIDM5NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fbmVzdGVkX2Jsb2NrX2NvbW1lbnQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIicvKicgd2l0aGluIGJsb2NrIGNvbW1lbnQiLCAxMjIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX25vX25ld2xpbmVfZW9mLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJubyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlIiwgNDEzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9ub25fbW9kdWxhcl9pbmNsdWRlX2luX2ZyYW1ld29ya19tb2R1bGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImluY2x1ZGUgb2Ygbm9uLW1vZHVsYXIgaGVhZGVyIGluc2lkZSBmcmFtZXdvcmsgbW9kdWxlICclMCc6ICclMSciLCA0MTcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX25vbl9tb2R1bGFyX2luY2x1ZGVfaW5fbW9kdWxlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJpbmNsdWRlIG9mIG5vbi1tb2R1bGFyIGhlYWRlciBpbnNpZGUgbW9kdWxlICclMCc6ICclMSciLCA0MTgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX3BwX2FtYmlndW91c19tYWNybywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYW1iaWd1b3VzIGV4cGFuc2lvbiBvZiBtYWNybyAlMCIsIDIxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9wcF9jb252ZXJ0X3RvX3Bvc2l0aXZlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlc2VsZWN0e2xlZnR8cmlnaHR9MCBzaWRlIG9mIG9wZXJhdG9yIGNvbnZlcnRlZCBmcm9tIG5lZ2F0aXZlIHZhbHVlIHRvIHVuc2lnbmVkOiAlMSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX3BwX2RhdGVfdGltZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZXhwYW5zaW9uIG9mIGRhdGUgb3IgdGltZSBtYWNybyBpcyBub3QgcmVwcm9kdWNpYmxlIiwgMTQ2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCB0cnVlLCAxKQorRElBRyh3YXJuX3BwX2V4cHJfb3ZlcmZsb3csIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImludGVnZXIgb3ZlcmZsb3cgaW4gcHJlcHJvY2Vzc29yIGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9wcF9saW5lX2RlY2ltYWwsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiVzZWxlY3R7I2xpbmV8R05VIGxpbmUgbWFya2VyfTAgZGlyZWN0aXZlIGludGVycHJldHMgbnVtYmVyIGFzIGRlY2ltYWwsIG5vdCBvY3RhbCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX3BwX21hY3JvX2hpZGVzX2tleXdvcmQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAia2V5d29yZCBpcyBoaWRkZW4gYnkgbWFjcm8gZGVmaW5pdGlvbiIsIDMyOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fcHBfbWFjcm9faXNfcmVzZXJ2ZWRfaWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm1hY3JvIG5hbWUgaXMgYSByZXNlcnZlZCBpZGVudGlmaWVyIiwgNTQwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9wcF9vYmpjX21hY3JvX3JlZGVmX2lnbm9yZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImlnbm9yaW5nIHJlZGVmaW5pdGlvbiBvZiBPYmplY3RpdmUtQyBxdWFsaWZpZXIgbWFjcm8iLCA0NDksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX3BwX3VuZGVmX2lkZW50aWZpZXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiUwIGlzIG5vdCBkZWZpbmVkLCBldmFsdWF0ZXMgdG8gMCIsIDY0MiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fcHJhZ21hX2RlYnVnX21pc3NpbmdfYXJndW1lbnQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm1pc3NpbmcgYXJndW1lbnQgdG8gZGVidWcgY29tbWFuZCAnJTAnIiwgMjY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9wcmFnbWFfZGVidWdfdW5leHBlY3RlZF9jb21tYW5kLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1bmV4cGVjdGVkIGRlYnVnIGNvbW1hbmQgJyUwJyIsIDI2OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fcHJhZ21hX2RpYWdub3N0aWNfY2Fubm90X3BvcCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJwcmFnbWEgZGlhZ25vc3RpYyBwb3AgY291bGQgbm90IHBvcCwgbm8gbWF0Y2hpbmcgcHVzaCIsIDY2MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fcHJhZ21hX2RpYWdub3N0aWNfaW52YWxpZCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJwcmFnbWEgZGlhZ25vc3RpYyBleHBlY3RlZCAnZXJyb3InLCAnd2FybmluZycsICdpZ25vcmVkJywgJ2ZhdGFsJywgJ3B1c2gnLCBvciAncG9wJyIsIDY2MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fcHJhZ21hX2RpYWdub3N0aWNfaW52YWxpZF9vcHRpb24sIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicHJhZ21hIGRpYWdub3N0aWMgZXhwZWN0ZWQgb3B0aW9uIG5hbWUgKGUuZy4gXCItV3VuZGVmXCIpIiwgNjYwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9wcmFnbWFfZGlhZ25vc3RpY19pbnZhbGlkX3Rva2VuLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVuZXhwZWN0ZWQgdG9rZW4gaW4gcHJhZ21hIGRpYWdub3N0aWMiLCA2NjAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX3ByYWdtYV9kaWFnbm9zdGljX3Vua25vd25fd2FybmluZywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1bmtub3duIHdhcm5pbmcgZ3JvdXAgJyUwJywgaWdub3JlZCIsIDY2MiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fcHJhZ21hX2lnbm9yZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVua25vd24gcHJhZ21hIGlnbm9yZWQiLCA2NjAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX3ByYWdtYV9pbmNsdWRlX2FsaWFzX2V4cGVjdGVkLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInByYWdtYSBpbmNsdWRlX2FsaWFzIGV4cGVjdGVkICclMCciLCA2NjAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX3ByYWdtYV9pbmNsdWRlX2FsaWFzX2V4cGVjdGVkX2ZpbGVuYW1lLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInByYWdtYSBpbmNsdWRlX2FsaWFzIGV4cGVjdGVkIGluY2x1ZGUgZmlsZW5hbWUiLCA2NjAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX3ByYWdtYV9pbmNsdWRlX2FsaWFzX21pc21hdGNoX2FuZ2xlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImFuZ2xlLWJyYWNrZXRlZCBpbmNsdWRlIDwlMD4gY2Fubm90IGJlIGFsaWFzZWQgdG8gZG91YmxlLXF1b3RlZCBpbmNsdWRlIFwiJTFcIiIsIDY2MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fcHJhZ21hX2luY2x1ZGVfYWxpYXNfbWlzbWF0Y2hfcXVvdGUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZG91YmxlLXF1b3RlZCBpbmNsdWRlIFwiJTBcIiBjYW5ub3QgYmUgYWxpYXNlZCB0byBhbmdsZS1icmFja2V0ZWQgaW5jbHVkZSA8JTE+IiwgNjYwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9wcmFnbWFfbWVzc2FnZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAiLCAxLCBTRklOQUVfU3VwcHJlc3MsIHRydWUsIGZhbHNlLCAzMCkKK0RJQUcod2Fybl9wcmFnbWFfcG9wX21hY3JvX25vX3B1c2gsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInByYWdtYSBwb3BfbWFjcm8gY291bGQgbm90IHBvcCAnJTAnLCBubyBtYXRjaGluZyBwdXNoX21hY3JvIiwgMjY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9wcmFnbWFfd2FybmluZ19leHBlY3RlZCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIjcHJhZ21hIHdhcm5pbmcgZXhwZWN0ZWQgJyUwJyIsIDY2MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fcHJhZ21hX3dhcm5pbmdfZXhwZWN0ZWRfbnVtYmVyLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiNwcmFnbWEgd2FybmluZyBleHBlY3RlZCBhIHdhcm5pbmcgbnVtYmVyIiwgNjYwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl9wcmFnbWFfd2FybmluZ19wdXNoX2xldmVsLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiNwcmFnbWEgd2FybmluZyhwdXNoLCBsZXZlbCkgcmVxdWlyZXMgYSBsZXZlbCBiZXR3ZWVuIDAgYW5kIDQiLCA2NjAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX3ByYWdtYV93YXJuaW5nX3NwZWNfaW52YWxpZCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIjcHJhZ21hIHdhcm5pbmcgZXhwZWN0ZWQgJ3B1c2gnLCAncG9wJywgJ2RlZmF1bHQnLCAnZGlzYWJsZScsICdlcnJvcicsICdvbmNlJywgJ3N1cHByZXNzJywgMSwgMiwgMywgb3IgNCIsIDY2MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fdWNuX2VzY2FwZV9pbmNvbXBsZXRlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpbmNvbXBsZXRlIHVuaXZlcnNhbCBjaGFyYWN0ZXIgbmFtZTsgdHJlYXRpbmcgYXMgJ1xcJyBmb2xsb3dlZCBieSBpZGVudGlmaWVyIiwgNjUzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl91Y25fZXNjYXBlX25vX2RpZ2l0cywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiXFwlMCB1c2VkIHdpdGggbm8gZm9sbG93aW5nIGhleCBkaWdpdHM7IHRyZWF0aW5nIGFzICdcXCcgZm9sbG93ZWQgYnkgaWRlbnRpZmllciIsIDY1MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEpCitESUFHKHdhcm5fdWNuX2VzY2FwZV9zdXJyb2dhdGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVuaXZlcnNhbCBjaGFyYWN0ZXIgbmFtZSByZWZlcnMgdG8gYSBzdXJyb2dhdGUgY2hhcmFjdGVyIiwgNjUzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl91Y25fbm90X3ZhbGlkX2luX2M4OSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidW5pdmVyc2FsIGNoYXJhY3RlciBuYW1lcyBhcmUgb25seSB2YWxpZCBpbiBDOTkgb3IgQysrOyB0cmVhdGluZyBhcyAnXFwnIGZvbGxvd2VkIGJ5IGlkZW50aWZpZXIiLCA2NTMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX3Vjbl9ub3RfdmFsaWRfaW5fYzg5X2xpdGVyYWwsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidW5pdmVyc2FsIGNoYXJhY3RlciBuYW1lcyBhcmUgb25seSB2YWxpZCBpbiBDOTkgb3IgQysrIiwgNjUzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl91bmNvdmVyZWRfbW9kdWxlX2hlYWRlciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidW1icmVsbGEgaGVhZGVyIGZvciBtb2R1bGUgJyUwJyBkb2VzIG5vdCBpbmNsdWRlIGhlYWRlciAnJTEnIiwgMjk2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKK0RJQUcod2Fybl91c2Vfb2ZfcHJpdmF0ZV9oZWFkZXJfb3V0c2lkZV9tb2R1bGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1c2Ugb2YgcHJpdmF0ZSBoZWFkZXIgZnJvbSBvdXRzaWRlIGl0cyBtb2R1bGU6ICclMCciLCA1MTcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxKQorRElBRyh3YXJuX3V0Zjhfc3ltYm9sX2hvbW9nbHlwaCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidHJlYXRpbmcgVW5pY29kZSBjaGFyYWN0ZXIgPFUrJTA+IGFzIGlkZW50aWZpZXIgY2hhcmFjdGVyIHJhdGhlciB0aGFuIGFzICclMScgc3ltYm9sIiwgNjU0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMSkKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNPcHRpb25zLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNPcHRpb25zLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDY3YjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY09wdGlvbnMuZGVmCkBAIC0wLDAgKzEsMTAyIEBACisvLz09PS0tLSBEaWFnT3B0aW9ucy5kZWYgLSBEaWFnbm9zdGljIG9wdGlvbiBkYXRhYmFzZSAtLS0tLS0tLS0tLS0tIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBkaWFnbm9zdGljIG9wdGlvbnMuIFVzZXJzIG9mIHRoaXMgZmlsZQorLy8gbXVzdCBkZWZpbmUgdGhlIERJQUdPUFQgbWFjcm8gdG8gbWFrZSB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbi4KKy8vIE9wdGlvbmFsbHksIHRoZSB1c2VyIG1heSBhbHNvIGRlZmluZSBFTlVNX0RJQUdPUFQgKGZvciBvcHRpb25zCisvLyB0aGF0IGhhdmUgZW51bWVyYXRpb24gdHlwZSBhbmQgVkFMVUVfRElBR09QVCAoZm9yIG9wdGlvbnMgdGhhdAorLy8gZGVzY3JpYmUgYSB2YWx1ZSByYXRoZXIgdGhhbiBhIGZsYWcpLiBUaGUgU0VNQU5USUNfKiB2YXJpYW50cyBvZiB0aGVzZSBtYWNyb3MKKy8vIGluZGljYXRlIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIHByb2Nlc3Npbmcgb2YgdGhlIHByb2dyYW0sIHJhdGhlciB0aGFuCisvLyBzaW1wbHkgdGhlIG91dHB1dC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBESUFHT1BUCisjICBlcnJvciBEZWZpbmUgdGhlIERJQUdPUFQgbWFjcm8gdG8gaGFuZGxlIGxhbmd1YWdlIG9wdGlvbnMKKyNlbmRpZgorCisjaWZuZGVmIFZBTFVFX0RJQUdPUFQKKyMgIGRlZmluZSBWQUxVRV9ESUFHT1BUKE5hbWUsIEJpdHMsIERlZmF1bHQpIFwKK0RJQUdPUFQoTmFtZSwgQml0cywgRGVmYXVsdCkKKyNlbmRpZgorCisjaWZuZGVmIEVOVU1fRElBR09QVAorIyAgZGVmaW5lIEVOVU1fRElBR09QVChOYW1lLCBUeXBlLCBCaXRzLCBEZWZhdWx0KSBcCitESUFHT1BUKE5hbWUsIEJpdHMsIERlZmF1bHQpCisjZW5kaWYKKworI2lmbmRlZiBTRU1BTlRJQ19ESUFHT1BUCisjICBkZWZpbmUgU0VNQU5USUNfRElBR09QVChOYW1lLCBCaXRzLCBEZWZhdWx0KSBESUFHT1BUKE5hbWUsIEJpdHMsIERlZmF1bHQpCisjZW5kaWYKKworI2lmbmRlZiBTRU1BTlRJQ19WQUxVRV9ESUFHT1BUCisjICBkZWZpbmUgU0VNQU5USUNfVkFMVUVfRElBR09QVChOYW1lLCBCaXRzLCBEZWZhdWx0KSBcCisgICAgIFZBTFVFX0RJQUdPUFQoTmFtZSwgQml0cywgRGVmYXVsdCkKKyNlbmRpZgorCisjaWZuZGVmIFNFTUFOVElDX0VOVU1fRElBR09QVAorIyAgZGVmaW5lIFNFTUFOVElDX0VOVU1fRElBR09QVChOYW1lLCBUeXBlLCBCaXRzLCBEZWZhdWx0KSBcCisgICAgIEVOVU1fRElBR09QVChOYW1lLCBUeXBlLCBCaXRzLCBEZWZhdWx0KQorI2VuZGlmCisKK1NFTUFOVElDX0RJQUdPUFQoSWdub3JlV2FybmluZ3MsIDEsIDApICAgLy8vIC13CitESUFHT1BUKE5vUmV3cml0ZU1hY3JvcywgMSwgMCkgIC8vLyAtV25vLXJld3JpdGUtbWFjcm9zCitESUFHT1BUKFBlZGFudGljLCAxLCAwKSAgICAgICAgIC8vLyAtcGVkYW50aWMKK0RJQUdPUFQoUGVkYW50aWNFcnJvcnMsIDEsIDApICAgLy8vIC1wZWRhbnRpYy1lcnJvcnMKK0RJQUdPUFQoU2hvd0NvbHVtbiwgMSwgMSkgICAgICAgLy8vIFNob3cgY29sdW1uIG51bWJlciBvbiBkaWFnbm9zdGljcy4KK0RJQUdPUFQoU2hvd0xvY2F0aW9uLCAxLCAxKSAgICAgLy8vIFNob3cgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorRElBR09QVChBYnNvbHV0ZVBhdGgsIDEsIDApICAgICAvLy8gVXNlIGFic29sdXRlIHBhdGhzLgorRElBR09QVChTaG93Q2FyZXRzLCAxLCAxKSAgICAgICAvLy8gU2hvdyBjYXJldHMgaW4gZGlhZ25vc3RpY3MuCitESUFHT1BUKFNob3dGaXhpdHMsIDEsIDEpICAgICAgIC8vLyBTaG93IGZpeGl0IGluZm9ybWF0aW9uLgorRElBR09QVChTaG93U291cmNlUmFuZ2VzLCAxLCAwKSAvLy8gU2hvdyBzb3VyY2UgcmFuZ2VzIGluIG51bWVyaWMgZm9ybS4KK0RJQUdPUFQoU2hvd1BhcnNlYWJsZUZpeGl0cywgMSwgMCkgLy8vIFNob3cgbWFjaGluZSBwYXJzZWFibGUgZml4LWl0cy4KK0RJQUdPUFQoU2hvd1ByZXN1bWVkTG9jLCAxLCAwKSAgLy8vIFNob3cgcHJlc3VtZWQgbG9jYXRpb24gZm9yIGRpYWdub3N0aWNzLgorRElBR09QVChTaG93T3B0aW9uTmFtZXMsIDEsIDApICAvLy8gU2hvdyB0aGUgb3B0aW9uIG5hbWUgZm9yIG1hcHBhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBkaWFnbm9zdGljcy4KK0RJQUdPUFQoU2hvd05vdGVJbmNsdWRlU3RhY2ssIDEsIDApIC8vLyBTaG93IGluY2x1ZGUgc3RhY2tzIGZvciBub3Rlcy4KK1ZBTFVFX0RJQUdPUFQoU2hvd0NhdGVnb3JpZXMsIDIsIDApIC8vLyBTaG93IGNhdGVnb3JpZXM6IDAgLT4gbm9uZSwgMSAtPiBOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gMiAtPiBGdWxsIE5hbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0VOVU1fRElBR09QVChGb3JtYXQsIFRleHREaWFnbm9zdGljRm9ybWF0LCAyLCBDbGFuZykgLy8vIEZvcm1hdCBmb3IgZGlhZ25vc3RpY3M6IAorICAKK0RJQUdPUFQoU2hvd0NvbG9ycywgMSwgMCkgICAgICAgLy8vIFNob3cgZGlhZ25vc3RpY3Mgd2l0aCBBTlNJIGNvbG9yIHNlcXVlbmNlcy4KK0VOVU1fRElBR09QVChTaG93T3ZlcmxvYWRzLCBPdmVybG9hZHNTaG93biwgMSwKKyAgICAgICAgICAgICBPdmxfQWxsKSAgICAvLy8gT3ZlcmxvYWQgY2FuZGlkYXRlcyB0byBzaG93LgorRElBR09QVChWZXJpZnlEaWFnbm9zdGljcywgMSwgMCkgLy8vIENoZWNrIHRoYXQgZGlhZ25vc3RpY3MgbWF0Y2ggdGhlIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gZGlhZ25vc3RpY3MsIGluZGljYXRlZCBieSBtYXJrZXJzIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vIGlucHV0IHNvdXJjZSBmaWxlLgorRU5VTV9ESUFHT1BUKFZlcmlmeUlnbm9yZVVuZXhwZWN0ZWQsIERpYWdub3N0aWNMZXZlbE1hc2ssIDQsCisgICAgICAgICAgICAgRGlhZ25vc3RpY0xldmVsTWFzazo6Tm9uZSkgLy8vIElnbm9yZSB1bmV4cGVjdGVkIGRpYWdub3N0aWNzIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vIHRoZSBzcGVjaWZpZWQgbGV2ZWxzIHdoZW4gdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gLXZlcmlmeS4KK0RJQUdPUFQoRWxpZGVUeXBlLCAxLCAwKSAgICAgICAgIC8vLyBFbGlkZSBpZGVudGljYWwgdHlwZXMgaW4gdGVtcGxhdGUgZGlmZmluZworRElBR09QVChTaG93VGVtcGxhdGVUcmVlLCAxLCAwKSAgLy8vIFByaW50IGEgdGVtcGxhdGUgdHJlZSB3aGVuIGRpZmZpbmcKK0RJQUdPUFQoQ0xGYWxsYmFja01vZGUsIDEsIDApICAgIC8vLyBGb3JtYXQgZm9yIGNsYW5nLWNsIGZhbGxiYWNrIG1vZGUKKworVkFMVUVfRElBR09QVChFcnJvckxpbWl0LCAzMiwgMCkgICAgICAgICAgIC8vLyBMaW1pdCAjIGVycm9ycyBlbWl0dGVkLgorLy8vIExpbWl0IGRlcHRoIG9mIG1hY3JvIGV4cGFuc2lvbiBiYWNrdHJhY2UuCitWQUxVRV9ESUFHT1BUKE1hY3JvQmFja3RyYWNlTGltaXQsIDMyLCBEZWZhdWx0TWFjcm9CYWNrdHJhY2VMaW1pdCkKKy8vLyBMaW1pdCBkZXB0aCBvZiBpbnN0YW50aWF0aW9uIGJhY2t0cmFjZS4KK1ZBTFVFX0RJQUdPUFQoVGVtcGxhdGVCYWNrdHJhY2VMaW1pdCwgMzIsIERlZmF1bHRUZW1wbGF0ZUJhY2t0cmFjZUxpbWl0KQorLy8vIExpbWl0IGRlcHRoIG9mIGNvbnN0ZXhwciBiYWNrdHJhY2UuCitWQUxVRV9ESUFHT1BUKENvbnN0ZXhwckJhY2t0cmFjZUxpbWl0LCAzMiwgRGVmYXVsdENvbnN0ZXhwckJhY2t0cmFjZUxpbWl0KQorLy8vIExpbWl0IG51bWJlciBvZiB0aW1lcyB0byBwZXJmb3JtIHNwZWxsIGNoZWNraW5nLgorVkFMVUVfRElBR09QVChTcGVsbENoZWNraW5nTGltaXQsIDMyLCBEZWZhdWx0U3BlbGxDaGVja2luZ0xpbWl0KQorLy8vIExpbWl0IG51bWJlciBvZiBsaW5lcyBzaG93biBpbiBhIHNuaXBwZXQuCitWQUxVRV9ESUFHT1BUKFNuaXBwZXRMaW5lTGltaXQsIDMyLCBEZWZhdWx0U25pcHBldExpbmVMaW1pdCkKKworVkFMVUVfRElBR09QVChUYWJTdG9wLCAzMiwgRGVmYXVsdFRhYlN0b3ApIC8vLyBUaGUgZGlzdGFuY2UgYmV0d2VlbiB0YWIgc3RvcHMuCisvLy8gQ29sdW1uIGxpbWl0IGZvciBmb3JtYXR0aW5nIG1lc3NhZ2UgZGlhZ25vc3RpY3MsIG9yIDAgaWYgdW51c2VkLgorVkFMVUVfRElBR09QVChNZXNzYWdlTGVuZ3RoLCAzMiwgMCkKKworI3VuZGVmIERJQUdPUFQKKyN1bmRlZiBFTlVNX0RJQUdPUFQKKyN1bmRlZiBWQUxVRV9ESUFHT1BUCisjdW5kZWYgU0VNQU5USUNfRElBR09QVAorI3VuZGVmIFNFTUFOVElDX0VOVU1fRElBR09QVAorI3VuZGVmIFNFTUFOVElDX1ZBTFVFX0RJQUdPUFQKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNPcHRpb25zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljT3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNGQwYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljT3B0aW9ucy5oCkBAIC0wLDAgKzEsMTI5IEBACisvLz09PS0gRGlhZ25vc3RpY09wdGlvbnMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfRElBR05PU1RJQ09QVElPTlNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX0RJQUdOT1NUSUNPUFRJT05TX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworCisvLy8gXGJyaWVmIFNwZWNpZmllcyB3aGljaCBvdmVybG9hZCBjYW5kaWRhdGVzIHRvIGRpc3BsYXkgd2hlbiBvdmVybG9hZAorLy8vIHJlc29sdXRpb24gZmFpbHMuCitlbnVtIE92ZXJsb2Fkc1Nob3duIDogdW5zaWduZWQgeworICAvLy8gU2hvdyBhbGwgb3ZlcmxvYWRzLgorICBPdmxfQWxsLAorCisgIC8vLyBTaG93IGp1c3QgdGhlICJiZXN0IiBvdmVybG9hZCBjYW5kaWRhdGVzLgorICBPdmxfQmVzdAorfTsKKworLy8vIFxicmllZiBBIGJpdG1hc2sgcmVwcmVzZW50aW5nIHRoZSBkaWFnbm9zdGljIGxldmVscyB1c2VkIGJ5CisvLy8gVmVyaWZ5RGlhZ25vc3RpY0NvbnN1bWVyLgorZW51bSBjbGFzcyBEaWFnbm9zdGljTGV2ZWxNYXNrIDogdW5zaWduZWQgeworICBOb25lICAgID0gMCwKKyAgTm90ZSAgICA9IDEgPDwgMCwKKyAgUmVtYXJrICA9IDEgPDwgMSwKKyAgV2FybmluZyA9IDEgPDwgMiwKKyAgRXJyb3IgICA9IDEgPDwgMywKKyAgQWxsICAgICA9IE5vdGUgfCBSZW1hcmsgfCBXYXJuaW5nIHwgRXJyb3IKK307CisKK2lubGluZSBEaWFnbm9zdGljTGV2ZWxNYXNrIG9wZXJhdG9yfihEaWFnbm9zdGljTGV2ZWxNYXNrIE0pIHsKKyAgdXNpbmcgVVQgPSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxEaWFnbm9zdGljTGV2ZWxNYXNrPjo6dHlwZTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PERpYWdub3N0aWNMZXZlbE1hc2s+KH5zdGF0aWNfY2FzdDxVVD4oTSkpOworfQorCitpbmxpbmUgRGlhZ25vc3RpY0xldmVsTWFzayBvcGVyYXRvcnwoRGlhZ25vc3RpY0xldmVsTWFzayBMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY0xldmVsTWFzayBSSFMpIHsKKyAgdXNpbmcgVVQgPSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxEaWFnbm9zdGljTGV2ZWxNYXNrPjo6dHlwZTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PERpYWdub3N0aWNMZXZlbE1hc2s+KAorICAgIHN0YXRpY19jYXN0PFVUPihMSFMpIHwgc3RhdGljX2Nhc3Q8VVQ+KFJIUykpOworfQorCitpbmxpbmUgRGlhZ25vc3RpY0xldmVsTWFzayBvcGVyYXRvciYoRGlhZ25vc3RpY0xldmVsTWFzayBMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY0xldmVsTWFzayBSSFMpIHsKKyAgdXNpbmcgVVQgPSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxEaWFnbm9zdGljTGV2ZWxNYXNrPjo6dHlwZTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PERpYWdub3N0aWNMZXZlbE1hc2s+KAorICAgIHN0YXRpY19jYXN0PFVUPihMSFMpICYgc3RhdGljX2Nhc3Q8VVQ+KFJIUykpOworfQorCityYXdfb3N0cmVhbSYgb3BlcmF0b3I8PChyYXdfb3N0cmVhbSYgT3V0LCBEaWFnbm9zdGljTGV2ZWxNYXNrIE0pOworCisvLy8gXGJyaWVmIE9wdGlvbnMgZm9yIGNvbnRyb2xsaW5nIHRoZSBjb21waWxlciBkaWFnbm9zdGljcyBlbmdpbmUuCitjbGFzcyBEaWFnbm9zdGljT3B0aW9ucyA6IHB1YmxpYyBSZWZDb3VudGVkQmFzZTxEaWFnbm9zdGljT3B0aW9ucz57CitwdWJsaWM6CisgIGVudW0gVGV4dERpYWdub3N0aWNGb3JtYXQgeyBDbGFuZywgTVNWQywgVmkgfTsKKworICAvLyBEZWZhdWx0IHZhbHVlcy4KKyAgZW51bSB7CisgICAgRGVmYXVsdFRhYlN0b3AgPSA4LAorICAgIE1heFRhYlN0b3AgPSAxMDAsCisgICAgRGVmYXVsdE1hY3JvQmFja3RyYWNlTGltaXQgPSA2LAorICAgIERlZmF1bHRUZW1wbGF0ZUJhY2t0cmFjZUxpbWl0ID0gMTAsCisgICAgRGVmYXVsdENvbnN0ZXhwckJhY2t0cmFjZUxpbWl0ID0gMTAsCisgICAgRGVmYXVsdFNwZWxsQ2hlY2tpbmdMaW1pdCA9IDUwLAorICAgIERlZmF1bHRTbmlwcGV0TGluZUxpbWl0ID0gMSwKKyAgfTsKKworICAvLyBEZWZpbmUgc2ltcGxlIGRpYWdub3N0aWMgb3B0aW9ucyAod2l0aCBubyBhY2Nlc3NvcnMpLgorI2RlZmluZSBESUFHT1BUKE5hbWUsIEJpdHMsIERlZmF1bHQpIHVuc2lnbmVkIE5hbWUgOiBCaXRzOworI2RlZmluZSBFTlVNX0RJQUdPUFQoTmFtZSwgVHlwZSwgQml0cywgRGVmYXVsdCkKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljT3B0aW9ucy5kZWYiCisKK3Byb3RlY3RlZDoKKyAgLy8gRGVmaW5lIGRpYWdub3N0aWMgb3B0aW9ucyBvZiBlbnVtZXJhdGlvbiB0eXBlLiBUaGVzZSBhcmUgcHJpdmF0ZSwgYW5kIHdpbGwKKyAgLy8gaGF2ZSBhY2Nlc3NvcnMgKGJlbG93KS4KKyNkZWZpbmUgRElBR09QVChOYW1lLCBCaXRzLCBEZWZhdWx0KQorI2RlZmluZSBFTlVNX0RJQUdPUFQoTmFtZSwgVHlwZSwgQml0cywgRGVmYXVsdCkgdW5zaWduZWQgTmFtZSA6IEJpdHM7CisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpY09wdGlvbnMuZGVmIgorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgVGhlIGZpbGUgdG8gbG9nIGRpYWdub3N0aWMgb3V0cHV0IHRvLgorICBzdGQ6OnN0cmluZyBEaWFnbm9zdGljTG9nRmlsZTsKKyAgCisgIC8vLyBcYnJpZWYgVGhlIGZpbGUgdG8gc2VyaWFsaXplIGRpYWdub3N0aWNzIHRvIChub24tYXBwZW5kaW5nKS4KKyAgc3RkOjpzdHJpbmcgRGlhZ25vc3RpY1NlcmlhbGl6YXRpb25GaWxlOworCisgIC8vLyBUaGUgbGlzdCBvZiAtVy4uLiBvcHRpb25zIHVzZWQgdG8gYWx0ZXIgdGhlIGRpYWdub3N0aWMgbWFwcGluZ3MsIHdpdGggdGhlCisgIC8vLyBwcmVmaXhlcyByZW1vdmVkLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gV2FybmluZ3M7CisKKyAgLy8vIFRoZSBsaXN0IG9mIC1SLi4uIG9wdGlvbnMgdXNlZCB0byBhbHRlciB0aGUgZGlhZ25vc3RpYyBtYXBwaW5ncywgd2l0aCB0aGUKKyAgLy8vIHByZWZpeGVzIHJlbW92ZWQuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBSZW1hcmtzOworCisgIC8vLyBUaGUgcHJlZml4ZXMgZm9yIGNvbW1lbnQgZGlyZWN0aXZlcyBzb3VnaHQgYnkgLXZlcmlmeSAoImV4cGVjdGVkIiBieQorICAvLy8gZGVmYXVsdCkuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBWZXJpZnlQcmVmaXhlczsKKworcHVibGljOgorICAvLyBEZWZpbmUgYWNjZXNzb3JzL211dGF0b3JzIGZvciBkaWFnbm9zdGljIG9wdGlvbnMgb2YgZW51bWVyYXRpb24gdHlwZS4KKyNkZWZpbmUgRElBR09QVChOYW1lLCBCaXRzLCBEZWZhdWx0KQorI2RlZmluZSBFTlVNX0RJQUdPUFQoTmFtZSwgVHlwZSwgQml0cywgRGVmYXVsdCkgXAorICBUeXBlIGdldCMjTmFtZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGU+KE5hbWUpOyB9IFwKKyAgdm9pZCBzZXQjI05hbWUoVHlwZSBWYWx1ZSkgeyBOYW1lID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KFZhbHVlKTsgfQorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWNPcHRpb25zLmRlZiIKKworICBEaWFnbm9zdGljT3B0aW9ucygpIHsKKyNkZWZpbmUgRElBR09QVChOYW1lLCBCaXRzLCBEZWZhdWx0KSBOYW1lID0gRGVmYXVsdDsKKyNkZWZpbmUgRU5VTV9ESUFHT1BUKE5hbWUsIFR5cGUsIEJpdHMsIERlZmF1bHQpIHNldCMjTmFtZShEZWZhdWx0KTsKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljT3B0aW9ucy5kZWYiCisgIH0KK307CisKK3VzaW5nIFRleHREaWFnbm9zdGljRm9ybWF0ID0gRGlhZ25vc3RpY09wdGlvbnM6OlRleHREaWFnbm9zdGljRm9ybWF0OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19CQVNJQ19ESUFHTk9TVElDT1BUSU9OU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljUGFyc2VLaW5kcy5pbmMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljUGFyc2VLaW5kcy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhNThlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNQYXJzZUtpbmRzLmluYwpAQCAtMCwwICsxLDQ2MyBAQAorI2lmZGVmIFBBUlNFU1RBUlQKK19fUEFSU0VTVEFSVCA9IERJQUdfU1RBUlRfUEFSU0UsCisjdW5kZWYgUEFSU0VTVEFSVAorI2VuZGlmCisKK0RJQUcoZXJyX2FjY2Vzc19zcGVjaWZpZXJfaW50ZXJmYWNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludGVyZmFjZSB0eXBlcyBjYW5ub3Qgc3BlY2lmeSAnJXNlbGVjdHtwcml2YXRlfHByb3RlY3RlZH0wJyBhY2Nlc3MiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9hZGRyZXNzX29mX2xhYmVsX291dHNpZGVfZm4sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidXNlIG9mIGFkZHJlc3Mtb2YtbGFiZWwgZXh0ZW5zaW9uIG91dHNpZGUgb2YgYSBmdW5jdGlvbiBib2R5IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfYWxpYXNfZGVjbGFyYXRpb25fbm90X2lkZW50aWZpZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibmFtZSBkZWZpbmVkIGluIGFsaWFzIGRlY2xhcmF0aW9uIG11c3QgYmUgYW4gaWRlbnRpZmllciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2FsaWFzX2RlY2xhcmF0aW9uX3BhY2tfZXhwYW5zaW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFsaWFzIGRlY2xhcmF0aW9uIGNhbm5vdCBiZSBhIHBhY2sgZXhwYW5zaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfYWxpYXNfZGVjbGFyYXRpb25fc3BlY2lhbGl6YXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtwYXJ0aWFsIHNwZWNpYWxpemF0aW9ufGV4cGxpY2l0IHNwZWNpYWxpemF0aW9ufGV4cGxpY2l0IGluc3RhbnRpYXRpb259MCBvZiBhbGlhcyB0ZW1wbGF0ZXMgaXMgbm90IHBlcm1pdHRlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2Fub25fdHlwZV9kZWZpbml0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlY2xhcmF0aW9uIG9mIGFub255bW91cyAlMCBtdXN0IGJlIGEgZGVmaW5pdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2FyY19icmlkZ2VfcmV0YWluLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVua25vd24gY2FzdCBhbm5vdGF0aW9uIF9fYnJpZGdlX3JldGFpbjsgZGlkIHlvdSBtZWFuIF9fYnJpZGdlX3JldGFpbmVkPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgOCkKK0RJQUcoZXJyX2FyZ3VtZW50X3JlcXVpcmVkX2FmdGVyX2F0dHJpYnV0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhcmd1bWVudCByZXF1aXJlZCBhZnRlciBhdHRyaWJ1dGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9hc21fZW1wdHksIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiX19hc20gdXNlZCB3aXRoIG5vIGFzc2VtYmx5IGluc3RydWN0aW9ucyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTIpCitESUFHKGVycl9hc21fZ290b19ub3Rfc3VwcG9ydGVkX3lldCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInYXNtIGdvdG8nIGNvbnN0cnVjdHMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMikKK0RJQUcoZXJyX2FzbV9vcGVyYW5kX3dpZGVfc3RyaW5nX2xpdGVyYWwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHVzZSAlc2VsZWN0e3VuaWNvZGV8d2lkZX0wIHN0cmluZyBsaXRlcmFsIGluICdhc20nIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfYXRfZGVmc19jeHgsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiQGRlZnMgaXMgbm90IHN1cHBvcnRlZCBpbiBPYmplY3RpdmUtQysrIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfYXRfaW5fY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5leHBlY3RlZCAnQCcgaW4gbWVtYmVyIHNwZWNpZmljYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9hdGltcG9ydCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1c2Ugb2YgJ0BpbXBvcnQnIHdoZW4gbW9kdWxlcyBhcmUgZGlzYWJsZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9hdHRyaWJ1dGVfbm90X2ltcG9ydF9hdHRyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGF0dHJpYnV0ZSBjYW5ub3QgYmUgYXBwbGllZCB0byBhIG1vZHVsZSBpbXBvcnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEzKQorRElBRyhlcnJfYXR0cmlidXRlX25vdF9tb2R1bGVfYXR0ciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBhdHRyaWJ1dGUgY2Fubm90IGJlIGFwcGxpZWQgdG8gYSBtb2R1bGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEzKQorRElBRyhlcnJfYXR0cmlidXRlX3JlcXVpcmVzX2FyZ3VtZW50cywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwYXJlbnRoZXNlcyBtdXN0IGJlIG9taXR0ZWQgaWYgJTAgYXR0cmlidXRlJ3MgYXJndW1lbnQgbGlzdCBpcyBlbXB0eSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2F0dHJpYnV0ZXNfbWlzcGxhY2VkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1pc3BsYWNlZCBhdHRyaWJ1dGVzOyBleHBlY3RlZCBhdHRyaWJ1dGVzIGhlcmUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9hdHRyaWJ1dGVzX25vdF9hbGxvd2VkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFuIGF0dHJpYnV0ZSBsaXN0IGNhbm5vdCBhcHBlYXIgaGVyZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2F2YWlsX3F1ZXJ5X2V4cGVjdGVkX3BsYXRmb3JtX25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgYSBwbGF0Zm9ybSBuYW1lIGhlcmUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9hdmFpbF9xdWVyeV91bnJlY29nbml6ZWRfcGxhdGZvcm1fbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bnJlY29nbml6ZWQgcGxhdGZvcm0gbmFtZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2F2YWlsYWJpbGl0eV9leHBlY3RlZF9jaGFuZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgJ2ludHJvZHVjZWQnLCAnZGVwcmVjYXRlZCcsIG9yICdvYnNvbGV0ZWQnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfYXZhaWxhYmlsaXR5X2V4cGVjdGVkX3BsYXRmb3JtLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGEgcGxhdGZvcm0gbmFtZSwgZS5nLiwgJ21hY29zJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2F2YWlsYWJpbGl0eV9xdWVyeV9yZXBlYXRlZF9wbGF0Zm9ybSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2ZXJzaW9uIGZvciAnJTAnIGFscmVhZHkgc3BlY2lmaWVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfYXZhaWxhYmlsaXR5X3F1ZXJ5X3JlcGVhdGVkX3N0YXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJyonIHF1ZXJ5IGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfYXZhaWxhYmlsaXR5X3F1ZXJ5X3dpbGRjYXJkX3JlcXVpcmVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm11c3QgaGFuZGxlIHBvdGVudGlhbCBmdXR1cmUgcGxhdGZvcm1zIHdpdGggJyonIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfYXZhaWxhYmlsaXR5X3JlZHVuZGFudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZWR1bmRhbnQgJTAgYXZhaWxhYmlsaXR5IGNoYW5nZTsgb25seSB0aGUgbGFzdCBzcGVjaWZpZWQgY2hhbmdlIHdpbGwgYmUgdXNlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2F2YWlsYWJpbGl0eV91bmtub3duX2NoYW5nZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBpcyBub3QgYW4gYXZhaWxhYmlsaXR5IHN0YWdlOyB1c2UgJ2ludHJvZHVjZWQnLCAnZGVwcmVjYXRlZCcsIG9yICdvYnNvbGV0ZWQnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfYm9vbF9yZWRlY2xhcmF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZGVjbGFyYXRpb24gb2YgQysrIGJ1aWx0LWluIHR5cGUgJ2Jvb2wnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfYnJhY2tldF9kZXB0aF9leGNlZWRlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJicmFja2V0IG5lc3RpbmcgbGV2ZWwgZXhjZWVkZWQgbWF4aW11bSBvZiAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2JyYWNrZXRzX2dvX2FmdGVyX3VucXVhbGlmaWVkX2lkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImJyYWNrZXRzIGFyZSBub3QgYWxsb3dlZCBoZXJlOyB0byBkZWNsYXJlIGFuIGFycmF5LCBwbGFjZSB0aGUgYnJhY2tldHMgYWZ0ZXIgdGhlICVzZWxlY3R7aWRlbnRpZmllcnxuYW1lfTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9jMTFfbm9yZXR1cm5fbWlzcGxhY2VkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidfTm9yZXR1cm4nIGtleXdvcmQgbXVzdCBwcmVjZWRlIGZ1bmN0aW9uIGRlY2xhcmF0b3IiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9jbGFzc19vbl90ZW1wbGF0ZV90ZW1wbGF0ZV9wYXJhbSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgcmVxdWlyZXMgJ2NsYXNzJyBhZnRlciB0aGUgcGFyYW1ldGVyIGxpc3QiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9jb25zdHJ1Y3Rvcl9iYWRfbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtaXNzaW5nIHJldHVybiB0eXBlIGZvciBmdW5jdGlvbiAlMDsgZGlkIHlvdSBtZWFuIHRoZSBjb25zdHJ1Y3RvciBuYW1lICUxPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2N0b3JfaW5pdF9taXNzaW5nX2NvbW1hLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1pc3NpbmcgJywnIGJldHdlZW4gYmFzZSBvciBtZW1iZXIgaW5pdGlhbGl6ZXJzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfY3h4MTFfYXR0cmlidXRlX2ZvcmJpZHNfYXJndW1lbnRzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImF0dHJpYnV0ZSAlMCBjYW5ub3QgaGF2ZSBhbiBhcmd1bWVudCBsaXN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfY3h4MTFfYXR0cmlidXRlX2ZvcmJpZHNfZWxsaXBzaXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXR0cmlidXRlICUwIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGF0dHJpYnV0ZSBwYWNrIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfY3h4MTFfYXR0cmlidXRlX3JlcGVhdGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImF0dHJpYnV0ZSAlMCBjYW5ub3QgYXBwZWFyIG11bHRpcGxlIHRpbWVzIGluIGFuIGF0dHJpYnV0ZSBzcGVjaWZpZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9kZWNsYXJhdGlvbl9kb2VzX25vdF9kZWNsYXJlX3BhcmFtLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlY2xhcmF0aW9uIGRvZXMgbm90IGRlY2xhcmUgYSBwYXJhbWV0ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9kZWNsc3BlY19hZnRlcl92aXJ0c3BlYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInJTAnIHF1YWxpZmllciBtYXkgbm90IGFwcGVhciBhZnRlciB0aGUgdmlydHVhbCBzcGVjaWZpZXIgJyUxJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2RlZmF1bHRfYXJnX3VucGFyc2VkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuZXhwZWN0ZWQgZW5kIG9mIGRlZmF1bHQgYXJndW1lbnQgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2RlZmF1bHRfZGVsZXRlX2luX211bHRpcGxlX2RlY2xhcmF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIic9ICVzZWxlY3R7ZGVmYXVsdHxkZWxldGV9MCcgaXMgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGFuZCBtdXN0IG9jY3VyIGluIGEgc3RhbmRhbG9uZSBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2RlZmF1bHRfdGVtcGxhdGVfdGVtcGxhdGVfcGFyYW1ldGVyX25vdF90ZW1wbGF0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50IGZvciBhIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlciBtdXN0IGJlIGEgY2xhc3MgdGVtcGxhdGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9kZXN0cnVjdG9yX3RlbXBsYXRlX2lkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlc3RydWN0b3IgbmFtZSAlMCBkb2VzIG5vdCByZWZlciB0byBhIHRlbXBsYXRlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZGVzdHJ1Y3Rvcl90aWxkZV9pZGVudGlmaWVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGEgY2xhc3MgbmFtZSBhZnRlciAnficgdG8gbmFtZSBhIGRlc3RydWN0b3IiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9kZXN0cnVjdG9yX3RpbGRlX3Njb3BlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIid+JyBpbiBkZXN0cnVjdG9yIG5hbWUgc2hvdWxkIGJlIGFmdGVyIG5lc3RlZCBuYW1lIHNwZWNpZmllciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2R1cF92aXJ0dWFsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImR1cGxpY2F0ZSAndmlydHVhbCcgaW4gYmFzZSBzcGVjaWZpZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9kdXBsaWNhdGVfZGVmYXVsdF9hc3NvYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkdXBsaWNhdGUgZGVmYXVsdCBnZW5lcmljIGFzc29jaWF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZHVwbGljYXRlX3ZpcnRfc3BlY2lmaWVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNsYXNzIG1lbWJlciBhbHJlYWR5IG1hcmtlZCAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZHluYW1pY19hbmRfbm9leGNlcHRfc3BlY2lmaWNhdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgaGF2ZSBib3RoIHRocm93KCkgYW5kIG5vZXhjZXB0KCkgY2xhdXNlIG9uIHRoZSBzYW1lIGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZW1wdHlfZW51bSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1c2Ugb2YgZW1wdHkgZW51bSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2VudW1lcmF0b3JfbGlzdF9taXNzaW5nX2NvbW1hLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1pc3NpbmcgJywnIGJldHdlZW4gZW51bWVyYXRvcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9lbnVtZXJhdG9yX3VubmFtZWRfbm9fZGVmLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVubmFtZWQgZW51bWVyYXRpb24gbXVzdCBiZSBhIGRlZmluaXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leGNlcHRfc3BlY191bnBhcnNlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmV4cGVjdGVkIGVuZCBvZiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX2NhcHR1cmUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgdmFyaWFibGUgbmFtZSBvciAndGhpcycgaW4gbGFtYmRhIGNhcHR1cmUgbGlzdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX2Nhc2VfYmVmb3JlX2V4cHJlc3Npb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgJ2Nhc2UnIGtleXdvcmQgYmVmb3JlIGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9jYXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBjYXRjaCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX2NsYXNzX25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgY2xhc3MgbmFtZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX2NsYXNzX25hbWVfbm90X3RlbXBsYXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIid0eXBlbmFtZScgaXMgcmVkdW5kYW50OyBiYXNlIGNsYXNzZXMgYXJlIGltcGxpY2l0bHkgdHlwZXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9jb2xvbmNvbG9uX2FmdGVyX3N1cGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkICc6OicgYWZ0ZXIgJ19fc3VwZXInIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfY29tbWFfZ3JlYXRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnLCcgb3IgJz4nIGluIHRlbXBsYXRlLXBhcmFtZXRlci1saXN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfY29tbWFfb3JfcnNxdWFyZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnLCcgb3IgJ10nIGluIGxhbWJkYSBjYXB0dXJlIGxpc3QiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9lbmRfZGVjbGFyZV90YXJnZXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgJyNwcmFnbWEgb21wIGVuZCBkZWNsYXJlIHRhcmdldCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9lbmRfb2ZfZW51bWVyYXRvciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnPSBjb25zdGFudC1leHByZXNzaW9uJyBvciBlbmQgb2YgZW51bWVyYXRvciBkZWZpbml0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfZXF1YWxfZGVzaWduYXRvciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnPScgb3IgYW5vdGhlciBkZXNpZ25hdG9yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfZXhwcmVzc2lvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfZXh0ZXJuYWxfZGVjbGFyYXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgZXh0ZXJuYWwgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9maWVsZF9kZXNpZ25hdG9yLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGEgZmllbGQgZGVzaWduYXRvciwgc3VjaCBhcyAnLmZpZWxkID0gNCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9mbl9ib2R5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGZ1bmN0aW9uIGJvZHkgYWZ0ZXIgZnVuY3Rpb24gZGVjbGFyYXRvciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX2ZvbGRfb3BlcmF0b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgYSBmb2xkYWJsZSBiaW5hcnkgb3BlcmF0b3IgaW4gZm9sZCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfaW5pdF9pbl9jb25kaXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFyaWFibGUgZGVjbGFyYXRpb24gaW4gY29uZGl0aW9uIG11c3QgaGF2ZSBhbiBpbml0aWFsaXplciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX2luaXRfaW5fY29uZGl0aW9uX2xwYXJlbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2YXJpYWJsZSBkZWNsYXJhdGlvbiBpbiBjb25kaXRpb24gY2Fubm90IGhhdmUgYSBwYXJlbnRoZXNpemVkIGluaXRpYWxpemVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfbGFtYmRhX2JvZHksIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgYm9keSBvZiBsYW1iZGEgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX2xicmFjZV9hZnRlcl9iYXNlX3NwZWNpZmllcnMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgJ3snIGFmdGVyIGJhc2UgY2xhc3MgbGlzdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX2xicmFjZV9pbl9jb21wb3VuZF9saXRlcmFsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkICd7JyBpbiBjb21wb3VuZCBsaXRlcmFsIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfbGVzc19hZnRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnPCcgYWZ0ZXIgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX2xwYXJlbl9hZnRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnKCcgYWZ0ZXIgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX2xwYXJlbl9hZnRlcl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkICcoJyBmb3IgZnVuY3Rpb24tc3R5bGUgY2FzdCBvciB0eXBlIGNvbnN0cnVjdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX21lbWJlcl9uYW1lX29yX3NlbWksIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgbWVtYmVyIG5hbWUgb3IgJzsnIGFmdGVyIGRlY2xhcmF0aW9uIHNwZWNpZmllcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9tZW1iZXJfbmFtZV9vcl9zZW1pX29iamN4eF9rZXl3b3JkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIG1lbWJlciBuYW1lIG9yICc7JyBhZnRlciBkZWNsYXJhdGlvbiBzcGVjaWZpZXJzOyAlMCBpcyBhIGtleXdvcmQgaW4gT2JqZWN0aXZlLUMrKyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX21lbWJlcl9vcl9iYXNlX25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgY2xhc3MgbWVtYmVyIG9yIGJhc2UgY2xhc3MgbmFtZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX21ldGhvZF9ib2R5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIG1ldGhvZCBib2R5IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfbWludXNfb3JfcGx1cywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtZXRob2QgdHlwZSBzcGVjaWZpZXIgbXVzdCBzdGFydCB3aXRoICctJyBvciAnKyciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9vYmpjX2NvbnRhaW5lciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInQGVuZCcgbXVzdCBhcHBlYXIgaW4gYW4gT2JqZWN0aXZlLUMgY29udGV4dCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX3BhcmFtZXRlcl9wYWNrLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyIHBhY2siLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9wYXJlbnRoZXNlc19hcm91bmRfdHlwZW5hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgcGFyZW50aGVzZXMgYXJvdW5kIHR5cGUgbmFtZSBpbiAlMCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfcHJvcGVydHlfbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBwcm9wZXJ0eSBuYW1lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfcHVuYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnKScgb3IgJywnIGFmdGVyICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9xdWFsaWZpZWRfYWZ0ZXJfdHlwZW5hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgYSBxdWFsaWZpZWQgbmFtZSBhZnRlciAndHlwZW5hbWUnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfcnBhcmVuX2FmdGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkICcpJyBhZnRlciAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfc2VsZWN0b3JfZm9yX21ldGhvZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBzZWxlY3RvciBmb3IgT2JqZWN0aXZlLUMgbWV0aG9kIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfc2VtaV9hZnRlcl9hdHRyaWJ1dGVfbGlzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnOycgYWZ0ZXIgYXR0cmlidXRlIGxpc3QiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9zZW1pX2FmdGVyX2V4cHIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgJzsnIGFmdGVyIGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9zZW1pX2FmdGVyX21ldGhvZF9wcm90bywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnOycgYWZ0ZXIgbWV0aG9kIHByb3RvdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX3NlbWlfYWZ0ZXJfbmFtZXNwYWNlX25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgJzsnIGFmdGVyIG5hbWVzcGFjZSBuYW1lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfc2VtaV9hZnRlcl9zdGF0aWNfYXNzZXJ0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkICc7JyBhZnRlciBzdGF0aWNfYXNzZXJ0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfc2VtaV9hZnRlcl9zdG10LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkICc7JyBhZnRlciAlMCBzdGF0ZW1lbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9zZW1pX2RlY2xfbGlzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnOycgYXQgZW5kIG9mIGRlY2xhcmF0aW9uIGxpc3QiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9zZW1pX2RlY2xhcmF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkICc7JyBhdCBlbmQgb2YgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9zZW1pX2ZvciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnOycgaW4gJ2Zvcicgc3RhdGVtZW50IHNwZWNpZmllciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX3N0YXJfdGhpc19jYXB0dXJlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkICd0aGlzJyBmb2xsb3dpbmcgJyonIGluIGxhbWJkYSBjYXB0dXJlIGxpc3QiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF9zdGF0ZW1lbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgc3RhdGVtZW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfdGVtcGxhdGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgdGVtcGxhdGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF90ZW1wbGF0ZV9wYXJhbWV0ZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgdGVtcGxhdGUgcGFyYW1ldGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfdG9rZW5faW5zdGVhZF9vZl9vYmpjeHhfa2V5d29yZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAlMDsgJTEgaXMgYSBrZXl3b3JkIGluIE9iamVjdGl2ZS1DKysiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGEgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX3R5cGVfbmFtZV9hZnRlcl90eXBlbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBhbiBpZGVudGlmaWVyIG9yIHRlbXBsYXRlLWlkIGFmdGVyICc6OiciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBlY3RlZF91bnF1YWxpZmllZF9pZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAlc2VsZWN0e2lkZW50aWZpZXJ8dW5xdWFsaWZpZWQtaWR9MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4cGVjdGVkX3ZlcnNpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgYSB2ZXJzaW9uIG9mIHRoZSBmb3JtICdtYWpvclsubWlub3JbLnN1Ym1pbm9yXV0nIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwZWN0ZWRfd2hpbGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgJ3doaWxlJyBpbiBkby93aGlsZSBsb29wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwbGljaXRfaW5zdGFudGlhdGlvbl9lbnVtLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImVudW1lcmF0aW9ucyBjYW5ub3QgYmUgZXhwbGljaXRseSBpbnN0YW50aWF0ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9leHBsaWNpdF9pbnN0YW50aWF0aW9uX3dpdGhfZGVmaW5pdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBsaWNpdCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGNhbm5vdCBoYXZlIGEgZGVmaW5pdGlvbjsgaWYgdGhpcyBkZWZpbml0aW9uIGlzIG1lYW50IHRvIGJlIGFuIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uLCBhZGQgJzw+JyBhZnRlciB0aGUgJ3RlbXBsYXRlJyBrZXl3b3JkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwbGljaXRfc3BlY19ub25fdGVtcGxhdGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwbGljaXQgJXNlbGVjdHtzcGVjaWFsaXphdGlvbnxpbnN0YW50aWF0aW9ufTAgb2Ygbm9uLXRlbXBsYXRlICUxICUyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXhwb3J0X2VtcHR5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cG9ydCBkZWNsYXJhdGlvbiBjYW5ub3QgYmUgZW1wdHkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEzKQorRElBRyhlcnJfZXh0ZXJuYWxfc291cmNlX3N5bWJvbF9kdXBsaWNhdGVfY2xhdXNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImR1cGxpY2F0ZSAlMCBjbGF1c2UgaW4gYW4gJ2V4dGVybmFsX3NvdXJjZV9zeW1ib2wnIGF0dHJpYnV0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4dGVybmFsX3NvdXJjZV9zeW1ib2xfZXhwZWN0ZWRfa2V5d29yZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnbGFuZ3VhZ2UnLCAnZGVmaW5lZF9pbicsIG9yICdnZW5lcmF0ZWRfZGVjbGFyYXRpb24nIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXh0cmFuZW91c19jbG9zaW5nX2JyYWNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4dHJhbmVvdXMgY2xvc2luZyBicmFjZSAoJ30nKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2V4dHJhbmVvdXNfcnBhcmVuX2luX2NvbmRpdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHRyYW5lb3VzICcpJyBhZnRlciBjb25kaXRpb24sIGV4cGVjdGVkIGEgc3RhdGVtZW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZXh0cmFuZW91c190b2tlbl9iZWZvcmVfc2VtaSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHRyYW5lb3VzICclMCcgYmVmb3JlICc7JyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2ZvbGRfb3BlcmF0b3JfbWlzbWF0Y2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib3BlcmF0b3JzIGluIGZvbGQgZXhwcmVzc2lvbiBtdXN0IGJlIHRoZSBzYW1lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZm9yX2NvX2F3YWl0X25vdF9yYW5nZV9mb3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ2NvX2F3YWl0JyBtb2RpZmllciBjYW4gb25seSBiZSBhcHBsaWVkIHRvIHJhbmdlLWJhc2VkIGZvciBsb29wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNCkKK0RJQUcoZXJyX2Zvcl9yYW5nZV9leHBlY3RlZF9kZWNsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZvciByYW5nZSBkZWNsYXJhdGlvbiBtdXN0IGRlY2xhcmUgYSB2YXJpYWJsZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2Zvcl9yYW5nZV9pZGVudGlmaWVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJhbmdlLWJhc2VkIGZvciBsb29wIHJlcXVpcmVzIHR5cGUgZm9yIGxvb3AgdmFyaWFibGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9mcmllbmRfZGVjbF9kZWZpbmVzX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGRlZmluZSBhIHR5cGUgaW4gYSBmcmllbmQgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9mcmllbmRfZXhwbGljaXRfaW5zdGFudGlhdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmcmllbmQgY2Fubm90IGJlIGRlY2xhcmVkIGluIGFuIGV4cGxpY2l0IGluc3RhbnRpYXRpb247IGlmIHRoaXMgZGVjbGFyYXRpb24gaXMgbWVhbnQgdG8gYmUgYSBmcmllbmQgZGVjbGFyYXRpb24sIHJlbW92ZSB0aGUgJ3RlbXBsYXRlJyBrZXl3b3JkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZnJpZW5kX2ludmFsaWRfaW5fY29udGV4dCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInZnJpZW5kJyB1c2VkIG91dHNpZGUgb2YgY2xhc3MiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9mdW5jX2RlZl9ub19wYXJhbXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZnVuY3Rpb24gZGVmaW5pdGlvbiBkb2VzIG5vdCBkZWNsYXJlIHBhcmFtZXRlcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9mdW5jdGlvbl9kZWNsYXJlZF90eXBlZGVmLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZ1bmN0aW9uIGRlZmluaXRpb24gZGVjbGFyZWQgJ3R5cGVkZWYnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfZnVuY3Rpb25fZGVmaW5pdGlvbl9ub3RfYWxsb3dlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmdW5jdGlvbiBkZWZpbml0aW9uIGlzIG5vdCBhbGxvd2VkIGhlcmUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9mdW5jdGlvbl9pc19ub3RfcmVjb3JkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuZXhwZWN0ZWQgJTAgaW4gZnVuY3Rpb24gY2FsbDsgcGVyaGFwcyByZW1vdmUgdGhlICUwPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2dudV9pbmxpbmVfYXNtX2Rpc2FibGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIkdOVS1zdHlsZSBpbmxpbmUgYXNzZW1ibHkgaXMgZGlzYWJsZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEyKQorRElBRyhlcnJfaWRfYWZ0ZXJfdGVtcGxhdGVfaW5fbmVzdGVkX25hbWVfc3BlYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCB0ZW1wbGF0ZSBuYW1lIGFmdGVyICd0ZW1wbGF0ZScga2V5d29yZCBpbiBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9pbGxlZ2FsX2RlY2xfcmVmZXJlbmNlX3RvX3JlZmVyZW5jZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBkZWNsYXJlZCBhcyBhIHJlZmVyZW5jZSB0byBhIHJlZmVyZW5jZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2lsbGVnYWxfc3VwZXJfY2FzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgY2FzdCAnc3VwZXInIChpdCBpc24ndCBhbiBleHByZXNzaW9uKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2luY29tcGxldGVfYXJyYXlfbWVtYmVyX2luaXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJyYXkgYm91bmQgY2Fubm90IGJlIGRlZHVjZWQgZnJvbSBhbiBpbi1jbGFzcyBpbml0aWFsaXplciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2luaXRfbGlzdF9iaW5fb3AsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5pdGlhbGl6ZXIgbGlzdCBjYW5ub3QgYmUgdXNlZCBvbiB0aGUgJXNlbGVjdHtsZWZ0fHJpZ2h0fTAgaGFuZCBzaWRlIG9mIG9wZXJhdG9yICclMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9pbmxpbmVfbXNfYXNtX3BhcnNpbmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEyKQorRElBRyhlcnJfaW5saW5lX25hbWVzcGFjZV9hbGlhcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJuYW1lc3BhY2UgYWxpYXMgY2Fubm90IGJlIGlubGluZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2lubGluZV9uZXN0ZWRfbmFtZXNwYWNlX2RlZmluaXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibmVzdGVkIG5hbWVzcGFjZSBkZWZpbml0aW9uIGNhbm5vdCBiZSAnaW5saW5lJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2ludmFsaWRfb3BlcmF0b3Jfb25fdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgdXNlICVzZWxlY3R7ZG90fGFycm93fTAgb3BlcmF0b3Igb24gYSB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfaW52YWxpZF9yZWZlcmVuY2VfcXVhbGlmaWVyX2FwcGxpY2F0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiclMCcgcXVhbGlmaWVyIG1heSBub3QgYmUgYXBwbGllZCB0byBhIHJlZmVyZW5jZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2ludmFsaWRfdG9rZW5fYWZ0ZXJfZGVjbGFyYXRvcl9zdWdnZXN0X2VxdWFsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgJTAgYXQgZW5kIG9mIGRlY2xhcmF0aW9uOyBkaWQgeW91IG1lYW4gJz0nPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2ludmFsaWRfdG9rZW5fYWZ0ZXJfdG9wbGV2ZWxfZGVjbGFyYXRvciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnOycgYWZ0ZXIgdG9wIGxldmVsIGRlY2xhcmF0b3IiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9sX3NxdWFyZV9sX3NxdWFyZV9ub3RfYXR0cmlidXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIkMrKzExIG9ubHkgYWxsb3dzIGNvbnNlY3V0aXZlIGxlZnQgc3F1YXJlIGJyYWNrZXRzIHdoZW4gaW50cm9kdWNpbmcgYW4gYXR0cmlidXRlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfbGFiZWxfZW5kX29mX2NvbXBvdW5kX3N0YXRlbWVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJsYWJlbCBhdCBlbmQgb2YgY29tcG91bmQgc3RhdGVtZW50OiBleHBlY3RlZCBzdGF0ZW1lbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9sYW1iZGFfZGVjbF9zcGVjaWZpZXJfcmVwZWF0ZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHsnbXV0YWJsZSd8J2NvbnN0ZXhwcid9MCBjYW5ub3QgYXBwZWFyIG11bHRpcGxlIHRpbWVzIGluIGEgbGFtYmRhIGRlY2xhcmF0b3IiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9sYW1iZGFfbWlzc2luZ19wYXJlbnMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibGFtYmRhIHJlcXVpcmVzICcoKScgYmVmb3JlICVzZWxlY3R7J211dGFibGUnfHJldHVybiB0eXBlfGF0dHJpYnV0ZSBzcGVjaWZpZXJ8J2NvbnN0ZXhwcid9MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX2xpdGVyYWxfb3BlcmF0b3Jfc3RyaW5nX25vdF9lbXB0eSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJzdHJpbmcgbGl0ZXJhbCBhZnRlciAnb3BlcmF0b3InIG11c3QgYmUgJ1wiXCInIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfbGl0ZXJhbF9vcGVyYXRvcl9zdHJpbmdfcHJlZml4LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN0cmluZyBsaXRlcmFsIGFmdGVyICdvcGVyYXRvcicgY2Fubm90IGhhdmUgYW4gZW5jb2RpbmcgcHJlZml4IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfbWlzcGxhY2VkX2VsbGlwc2lzX2luX2RlY2xhcmF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIicuLi4nIG11c3QgJXNlbGVjdHtpbW1lZGlhdGVseSBwcmVjZWRlIGRlY2xhcmVkIGlkZW50aWZpZXJ8YmUgaW5uZXJtb3N0IGNvbXBvbmVudCBvZiBhbm9ueW1vdXMgcGFjayBkZWNsYXJhdGlvbn0wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfbWlzc2luZ19iZWZvcmVfbW9kdWxlX2VuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAlMCBhdCBlbmQgb2YgbW9kdWxlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMykKK0RJQUcoZXJyX21pc3NpbmdfY2F0Y2hfZmluYWxseSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJAdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgQGNhdGNoIGFuZCBAZmluYWxseSBjbGF1c2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9taXNzaW5nX2NvbW1hX2JlZm9yZV9lbGxpcHNpcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJDIHJlcXVpcmVzIGEgY29tbWEgcHJpb3IgdG8gdGhlIGVsbGlwc2lzIGluIGEgdmFyaWFkaWMgZnVuY3Rpb24gdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX21pc3NpbmdfZGVwZW5kZW50X3RlbXBsYXRlX2tleXdvcmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidXNlICd0ZW1wbGF0ZScga2V5d29yZCB0byB0cmVhdCAnJTAnIGFzIGEgZGVwZW5kZW50IHRlbXBsYXRlIG5hbWUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9taXNzaW5nX2VuZF9vZl9kZWZpbml0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1pc3NpbmcgJ30nIGF0IGVuZCBvZiBkZWZpbml0aW9uIG9mICVxMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX21pc3NpbmdfcGFyYW0sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgcGFyYW1ldGVyIGRlY2xhcmF0b3IiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9taXNzaW5nX3doaXRlc3BhY2VfZGlncmFwaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmb3VuZCAnPDo6JyBhZnRlciBhICVzZWxlY3R7dGVtcGxhdGUgbmFtZXxjb25zdF9jYXN0fGR5bmFtaWNfY2FzdHxyZWludGVycHJldF9jYXN0fHN0YXRpY19jYXN0fTAgd2hpY2ggZm9ybXMgdGhlIGRpZ3JhcGggJzw6JyAoYWthICdbJykgYW5kIGEgJzonLCBkaWQgeW91IG1lYW4gJzwgOjonPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX21vZHVsZV9leHBlY3RlZF9pZGVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBhIG1vZHVsZSBuYW1lIGFmdGVyICclc2VsZWN0e21vZHVsZXxpbXBvcnR9MCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEzKQorRElBRyhlcnJfbW9kdWxlX2V4cGVjdGVkX3NlbWksIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgJzsnIGFmdGVyIG1vZHVsZSBuYW1lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMykKK0RJQUcoZXJyX21vZHVsZV9pbXBsZW1lbnRhdGlvbl9wYXJ0aXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibW9kdWxlIHBhcnRpdGlvbiBtdXN0IGJlIGRlY2xhcmVkICdleHBvcnQnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMykKK0RJQUcoZXJyX21zX2F0dHJpYnV0ZXNfbm90X2VuYWJsZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ19fZGVjbHNwZWMnIGF0dHJpYnV0ZXMgYXJlIG5vdCBlbmFibGVkOyB1c2UgJy1mZGVjbHNwZWMnIG9yICctZm1zLWV4dGVuc2lvbnMnIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBfX2RlY2xzcGVjIGF0dHJpYnV0ZXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9tc19kZWNsc3BlY190eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIl9fZGVjbHNwZWMgYXR0cmlidXRlcyBtdXN0IGJlIGFuIGlkZW50aWZpZXIgb3Igc3RyaW5nIGxpdGVyYWwiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9tc19wcm9wZXJ0eV9kdXBsaWNhdGVfYWNjZXNzb3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicHJvcGVydHkgZGVjbGFyYXRpb24gc3BlY2lmaWVzICclMCcgYWNjZXNzb3IgdHdpY2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9tc19wcm9wZXJ0eV9leHBlY3RlZF9hY2Nlc3Nvcl9uYW1lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIG5hbWUgb2YgYWNjZXNzb3IgbWV0aG9kIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfbXNfcHJvcGVydHlfZXhwZWN0ZWRfY29tbWFfb3JfcnBhcmVuLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkICcsJyBvciAnKScgYXQgZW5kIG9mIHByb3BlcnR5IGFjY2Vzc29yIGxpc3QiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9tc19wcm9wZXJ0eV9leHBlY3RlZF9lcXVhbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnPScgYWZ0ZXIgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX21zX3Byb3BlcnR5X2hhc19zZXRfYWNjZXNzb3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicHV0dGVyIGZvciBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCBhcyAncHV0Jywgbm90ICdzZXQnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfbXNfcHJvcGVydHlfaW5pdGlhbGl6ZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicHJvcGVydHkgZGVjbGFyYXRpb24gY2Fubm90IGhhdmUgYW4gaW4tY2xhc3MgaW5pdGlhbGl6ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9tc19wcm9wZXJ0eV9taXNzaW5nX2FjY2Vzc29yX2tpbmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWlzc2luZyAnZ2V0PScgb3IgJ3B1dD0nIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfbXNfcHJvcGVydHlfbm9fZ2V0dGVyX29yX3B1dHRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwcm9wZXJ0eSBkb2VzIG5vdCBzcGVjaWZ5IGEgZ2V0dGVyIG9yIGEgcHV0dGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfbXNfcHJvcGVydHlfdW5rbm93bl9hY2Nlc3NvciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnZ2V0JyBvciAncHV0JyBpbiBwcm9wZXJ0eSBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX21zYXNtX3VuYWJsZV90b19jcmVhdGVfdGFyZ2V0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIk1TLXN0eWxlIGlubGluZSBhc3NlbWJseSBpcyBub3QgYXZhaWxhYmxlOiAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTIpCitESUFHKGVycl9tc2FzbV91bnN1cHBvcnRlZF9hcmNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIlVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSAnJTAnIGZvciBNUy1zdHlsZSBpbmxpbmUgYXNzZW1ibHkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEyKQorRElBRyhlcnJfbXVsdGlwbGVfdGVtcGxhdGVfZGVjbGFyYXRvcnMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHt8YSB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnxhbiBleHBsaWNpdCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnxhbiBleHBsaWNpdCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9ufTAgY2FuIG9ubHkgJXNlbGVjdHt8ZGVjbGFyZXxkZWNsYXJlfGluc3RhbnRpYXRlfTAgYSBzaW5nbGUgZW50aXR5IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfbmFtZXNwYWNlX25vbm5hbWVzcGFjZV9zY29wZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJuYW1lc3BhY2VzIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gZ2xvYmFsIG9yIG5hbWVzcGFjZSBzY29wZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX25vX21hdGNoaW5nX3BhcmFtLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInBhcmFtZXRlciBuYW1lZCAlMCBpcyBtaXNzaW5nIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfbnNudW1iZXJfbm9ubGl0ZXJhbF91bmFyeSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJAJTAgbXVzdCBiZSBmb2xsb3dlZCBieSBhIG51bWJlciB0byBmb3JtIGFuIE5TTnVtYmVyIG9iamVjdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX29iamNfY29uY2F0X3N0cmluZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmV4cGVjdGVkIHRva2VuIGFmdGVyIE9iamVjdGl2ZS1DIHN0cmluZyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX29iamNfZGlyZWN0aXZlX29ubHlfaW5fcHJvdG9jb2wsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGlyZWN0aXZlIG1heSBvbmx5IGJlIHNwZWNpZmllZCBpbiBwcm90b2NvbHMgb25seSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX29iamNfZXhwZWN0ZWRfZXF1YWxfZm9yX2dldHRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnPScgZm9yIE9iamVjdGl2ZS1DIGdldHRlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX29iamNfZXhwZWN0ZWRfZXF1YWxfZm9yX3NldHRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnPScgZm9yIE9iamVjdGl2ZS1DIHNldHRlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX29iamNfZXhwZWN0ZWRfcHJvcGVydHlfYXR0ciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmtub3duIHByb3BlcnR5IGF0dHJpYnV0ZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX29iamNfZXhwZWN0ZWRfc2VsZWN0b3JfZm9yX2dldHRlcl9zZXR0ZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgc2VsZWN0b3IgZm9yIE9iamVjdGl2ZS1DICVzZWxlY3R7c2V0dGVyfGdldHRlcn0wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfb2JqY19leHBlY3RlZF90eXBlX3BhcmFtZXRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCB0eXBlIHBhcmFtZXRlciBuYW1lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyMCkKK0RJQUcoZXJyX29iamNfaWxsZWdhbF9pbnRlcmZhY2VfcXVhbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbGxlZ2FsIGludGVyZmFjZSBxdWFsaWZpZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9vYmpjX2lsbGVnYWxfdmlzaWJpbGl0eV9zcGVjLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImlsbGVnYWwgdmlzaWJpbGl0eSBzcGVjaWZpY2F0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfb2JqY19taXNzaW5nX2VuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtaXNzaW5nICdAZW5kJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX29iamNfcGFyYW1ldGVyaXplZF9pbXBsZW1lbnRhdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJAaW1wbGVtZW50YXRpb24gY2Fubm90IGhhdmUgdHlwZSBwYXJhbWV0ZXJzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyMCkKK0RJQUcoZXJyX29iamNfcG9zdGZpeF9hdHRyaWJ1dGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicG9zdGZpeCBhdHRyaWJ1dGVzIGFyZSBub3QgYWxsb3dlZCBvbiBPYmplY3RpdmUtQyBkaXJlY3RpdmVzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfb2JqY19wb3N0Zml4X2F0dHJpYnV0ZV9oaW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInBvc3RmaXggYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQgb24gT2JqZWN0aXZlLUMgZGlyZWN0aXZlcywgcGxhY2UgdGhlbSBpbiBmcm9udCBvZiAnJXNlbGVjdHtAaW50ZXJmYWNlfEBwcm90b2NvbH0wJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX29iamNfcHJvcGVydGllc19yZXF1aXJlX29iamMyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInByb3BlcnRpZXMgYXJlIGFuIE9iamVjdGl2ZS1DIDIgZmVhdHVyZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX29iamNfcHJvcGVydHlfYml0ZmllbGQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicHJvcGVydHkgbmFtZSBjYW5ub3QgYmUgYSBiaXQtZmllbGQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9vYmpjX3Byb3BlcnR5X3JlcXVpcmVzX2ZpZWxkX25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicHJvcGVydHkgcmVxdWlyZXMgZmllbGRzIHRvIGJlIG5hbWVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfb2JqY190eXBlX2FyZ3NfYWZ0ZXJfcHJvdG9jb2xzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInByb3RvY29sIHF1YWxpZmllcnMgbXVzdCBwcmVjZWRlIHR5cGUgYXJndW1lbnRzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyMCkKK0RJQUcoZXJyX29iamNfdW5leHBlY3RlZF9hdGVuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInQGVuZCcgYXBwZWFycyB3aGVyZSBjbG9zaW5nIGJyYWNlICd9JyBpcyBleHBlY3RlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX29iamNfdW5leHBlY3RlZF9hdHRyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInByZWZpeCBhdHRyaWJ1dGUgbXVzdCBiZSBmb2xsb3dlZCBieSBhbiBpbnRlcmZhY2Ugb3IgcHJvdG9jb2wiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9vYmpjX3Vua25vd25fYXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgYW4gT2JqZWN0aXZlLUMgZGlyZWN0aXZlIGFmdGVyICdAJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX29iamNicmlkZ2VfcmVsYXRlZF9leHBlY3RlZF9yZWxhdGVkX2NsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGEgcmVsYXRlZCBPYmplY3RpdmVDIGNsYXNzIG5hbWUsIGUuZy4sICdOU0NvbG9yJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX29iamNicmlkZ2VfcmVsYXRlZF9zZWxlY3Rvcl9uYW1lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGEgY2xhc3MgbWV0aG9kIHNlbGVjdG9yIHdpdGggc2luZ2xlIGFyZ3VtZW50LCBlLmcuLCAnY29sb3JXaXRoQ0dDb2xvcjonIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfb21wX2RlY2xfaW5fZGVjbGFyZV9zaW1kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzIGV4cGVjdGVkIGFmdGVyICdkZWNsYXJlIHNpbWQnIGRpcmVjdGl2ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX29tcF9kZWNsYXJlX3NpbWRfaW5icmFuY2hfbm90aW5icmFuY2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5leHBlY3RlZCAnJTAnIGNsYXVzZSwgJyUxJyBpcyBzcGVjaWZpZWQgYWxyZWFkeSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX29tcF9kZWNsYXJlX3RhcmdldF91bmV4cGVjdGVkX2NsYXVzZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmV4cGVjdGVkICclMCcgY2xhdXNlLCBvbmx5ICd0bycgb3IgJ2xpbmsnIGNsYXVzZXMgZXhwZWN0ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9vbXBfZXhwZWN0ZWRfaWRlbnRpZmllcl9mb3JfY3JpdGljYWwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgaWRlbnRpZmllciBzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSAnb21wIGNyaXRpY2FsJyBkaXJlY3RpdmUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9vbXBfZXhwZWN0ZWRfcHVuYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAnLCcgb3IgJyknIGluICclMCcgJXNlbGVjdHtjbGF1c2V8ZGlyZWN0aXZlfTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9vbXBfZXhwZWN0ZWRfcmVkdWN0aW9uX2lkZW50aWZpZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgaWRlbnRpZmllciBvciBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcGVyYXRvcnM6ICcrJywgJy0nLCAnKicsICcmJywgJ3wnLCAnXicsICcmJicsIG9yICd8fCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9vbXBfaW1tZWRpYXRlX2RpcmVjdGl2ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInI3ByYWdtYSBvbXAgJTAnICVzZWxlY3R7fHdpdGggJyUyJyBjbGF1c2UgfTFjYW5ub3QgYmUgYW4gaW1tZWRpYXRlIHN1YnN0YXRlbWVudCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX29tcF9tYXBfdHlwZV9taXNzaW5nLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1pc3NpbmcgbWFwIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9vbXBfdW5leHBlY3RlZF9jbGF1c2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5leHBlY3RlZCBPcGVuTVAgY2xhdXNlICclMCcgaW4gZGlyZWN0aXZlICcjcHJhZ21hIG9tcCAlMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9vbXBfdW5leHBlY3RlZF9kaXJlY3RpdmUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5leHBlY3RlZCBPcGVuTVAgZGlyZWN0aXZlICVzZWxlY3R7fCcjcHJhZ21hIG9tcCAlMSd9MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX29tcF91bmtub3duX2RpcmVjdGl2ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBhbiBPcGVuTVAgZGlyZWN0aXZlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfb21wX3Vua25vd25fbWFwX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5jb3JyZWN0IG1hcCB0eXBlLCBleHBlY3RlZCBvbmUgb2YgJ3RvJywgJ2Zyb20nLCAndG9mcm9tJywgJ2FsbG9jJywgJ3JlbGVhc2UnLCBvciAnZGVsZXRlJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX29tcF91bmtub3duX21hcF90eXBlX21vZGlmaWVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluY29ycmVjdCBtYXAgdHlwZSBtb2RpZmllciwgZXhwZWN0ZWQgJ2Fsd2F5cyciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9vcGVuY2xfbG9naWNhbF9leGNsdXNpdmVfb3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiXl4gaXMgYSByZXNlcnZlZCBvcGVyYXRvciBpbiBPcGVuQ0wiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9vcGVuY2xfdGFraW5nX2Z1bmN0aW9uX2FkZHJlc3NfcGFyc2VyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRha2luZyBhZGRyZXNzIG9mIGZ1bmN0aW9uIGlzIG5vdCBhbGxvd2VkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfb3BlbmNsX3Vucm9sbF9oaW50X29uX25vbl9sb29wLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIk9wZW5DTCBvbmx5IHN1cHBvcnRzICdvcGVuY2xfdW5yb2xsX2hpbnQnIGF0dHJpYnV0ZSBvbiBmb3IsIHdoaWxlLCBhbmQgZG8gc3RhdGVtZW50cyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX291dF9vZl9saW5lX2NvbnN0cnVjdG9yX3RlbXBsYXRlX2lkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm91dC1vZi1saW5lIGNvbnN0cnVjdG9yIGZvciAlMCBjYW5ub3QgaGF2ZSB0ZW1wbGF0ZSBhcmd1bWVudHMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9vdmVycmlkZV9jb250cm9sX2ludGVyZmFjZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInJTAnIGtleXdvcmQgbm90IHBlcm1pdHRlZCB3aXRoIGludGVyZmFjZSB0eXBlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3BhcmVuX3NpemVvZl9wYXJhbWV0ZXJfcGFjaywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtaXNzaW5nIHBhcmVudGhlc2VzIGFyb3VuZCB0aGUgc2l6ZSBvZiBwYXJhbWV0ZXIgcGFjayAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3ByYWdtYV9hdHRyaWJ1dGVfZHVwbGljYXRlX3N1YmplY3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZHVwbGljYXRlIGF0dHJpYnV0ZSBzdWJqZWN0IG1hdGNoZXIgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3ByYWdtYV9hdHRyaWJ1dGVfZXhwZWN0ZWRfYXR0cmlidXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGFuIGF0dHJpYnV0ZSBhZnRlciAnKCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9wcmFnbWFfYXR0cmlidXRlX2V4cGVjdGVkX2F0dHJpYnV0ZV9uYW1lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGlkZW50aWZpZXIgdGhhdCByZXByZXNlbnRzIGFuIGF0dHJpYnV0ZSBuYW1lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfcHJhZ21hX2F0dHJpYnV0ZV9leHBlY3RlZF9hdHRyaWJ1dGVfc3ludGF4LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGFuIGF0dHJpYnV0ZSB0aGF0IGlzIHNwZWNpZmllZCB1c2luZyB0aGUgR05VLCBDKysxMSBvciAnX19kZWNsc3BlYycgc3ludGF4IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfcHJhZ21hX2F0dHJpYnV0ZV9leHBlY3RlZF9wdXNoX3BvcCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAncHVzaCcgb3IgJ3BvcCcgYWZ0ZXIgJyNwcmFnbWEgY2xhbmcgYXR0cmlidXRlJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3ByYWdtYV9hdHRyaWJ1dGVfZXhwZWN0ZWRfc3ViamVjdF9pZGVudGlmaWVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGFuIGlkZW50aWZpZXIgdGhhdCBjb3JyZXNwb25kcyB0byBhbiBhdHRyaWJ1dGUgc3ViamVjdCBydWxlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfcHJhZ21hX2F0dHJpYnV0ZV9leHBlY3RlZF9zdWJqZWN0X3N1Yl9pZGVudGlmaWVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGFuIGlkZW50aWZpZXIgdGhhdCBjb3JyZXNwb25kcyB0byBhbiBhdHRyaWJ1dGUgc3ViamVjdCBtYXRjaGVyIHN1Yi1ydWxlOyAnJTAnIG1hdGNoZXIgJXNlbGVjdHtkb2VzIG5vdCBzdXBwb3J0IHN1Yi1ydWxlc3xzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHN1Yi1ydWxlczogJTJ8fTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9wcmFnbWFfYXR0cmlidXRlX2V4dHJhX3Rva2Vuc19hZnRlcl9hdHRyaWJ1dGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXh0cmEgdG9rZW5zIGFmdGVyIGF0dHJpYnV0ZSBpbiBhICcjcHJhZ21hIGNsYW5nIGF0dHJpYnV0ZSBwdXNoJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3ByYWdtYV9hdHRyaWJ1dGVfaW52YWxpZF9hcmd1bWVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmV4cGVjdGVkIGFyZ3VtZW50ICclMCcgdG8gJyNwcmFnbWEgY2xhbmcgYXR0cmlidXRlJzsgZXhwZWN0ZWQgJ3B1c2gnIG9yICdwb3AnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfcHJhZ21hX2F0dHJpYnV0ZV9pbnZhbGlkX3N1YmplY3Rfc2V0X3NwZWNpZmllciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBhdHRyaWJ1dGUgc3ViamVjdCBzZXQgc3BlY2lmaWVyICdhcHBseV90byciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9wcmFnbWFfYXR0cmlidXRlX211bHRpcGxlX2F0dHJpYnV0ZXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgc3BlY2lmaWVkIGluICcjcHJhZ21hIGNsYW5nIGF0dHJpYnV0ZSBwdXNoJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3ByYWdtYV9hdHRyaWJ1dGVfdW5rbm93bl9zdWJqZWN0X3J1bGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5rbm93biBhdHRyaWJ1dGUgc3ViamVjdCBydWxlICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9wcmFnbWFfYXR0cmlidXRlX3Vua25vd25fc3ViamVjdF9zdWJfcnVsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2ludmFsaWQgdXNlIG9mfHVua25vd259MiBhdHRyaWJ1dGUgc3ViamVjdCBtYXRjaGVyIHN1Yi1ydWxlICclMCc7ICclMScgbWF0Y2hlciAlc2VsZWN0e2RvZXMgbm90IHN1cHBvcnQgc3ViLXJ1bGVzfHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgc3ViLXJ1bGVzOiAlM30yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfcHJhZ21hX2F0dHJpYnV0ZV91bnN1cHBvcnRlZF9hdHRyaWJ1dGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXR0cmlidXRlICUwIGlzIG5vdCBzdXBwb3J0ZWQgYnkgJyNwcmFnbWEgY2xhbmcgYXR0cmlidXRlJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3ByYWdtYV9jYW5ub3RfZW5kX2ZvcmNlX2N1ZGFfaG9zdF9kZXZpY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZm9yY2VfY3VkYV9ob3N0X2RldmljZSBlbmQgcHJhZ21hIHdpdGhvdXQgbWF0Y2hpbmcgZm9yY2VfY3VkYV9ob3N0X2RldmljZSBiZWdpbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3ByYWdtYV9jbGFuZ19zZWN0aW9uX2V4cGVjdGVkX2VxdWFsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkICc9JyBmb2xsb3dpbmcgJyNwcmFnbWEgY2xhbmcgc2VjdGlvbiAlc2VsZWN0e2ludmFsaWR8YnNzfGRhdGF8cm9kYXRhfHRleHR9MCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9wcmFnbWFfY29tbWVudF9tYWxmb3JtZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicHJhZ21hIGNvbW1lbnQgcmVxdWlyZXMgcGFyZW50aGVzaXplZCBpZGVudGlmaWVyIGFuZCBvcHRpb25hbCBzdHJpbmciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9wcmFnbWFfY29tbWVudF91bmtub3duX2tpbmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5rbm93biBraW5kIG9mIHByYWdtYSBjb21tZW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfcHJhZ21hX2RldGVjdF9taXNtYXRjaF9tYWxmb3JtZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicHJhZ21hIGRldGVjdF9taXNtYXRjaCBpcyBtYWxmb3JtZWQ7IGl0IHJlcXVpcmVzIHR3byBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nIGxpdGVyYWxzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfcHJhZ21hX2V4cGVjdGVkX2NsYW5nX3NlY3Rpb25fbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBvbmUgb2YgW2Jzc3xkYXRhfHJvZGF0YXx0ZXh0XSBzZWN0aW9uIGtpbmQgaW4gJyNwcmFnbWEgJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfcHJhZ21hX2ZwX2NvbnRyYWN0X3Njb3BlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIicjcHJhZ21hIGZwX2NvbnRyYWN0JyBjYW4gb25seSBhcHBlYXIgYXQgZmlsZSBzY29wZSBvciBhdCB0aGUgc3RhcnQgb2YgYSBjb21wb3VuZCBzdGF0ZW1lbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9wcmFnbWFfZnBfaW52YWxpZF9hcmd1bWVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmV4cGVjdGVkIGFyZ3VtZW50ICclMCcgdG8gJyNwcmFnbWEgY2xhbmcgZnAgJTEnOyBleHBlY3RlZCAnb24nLCAnZmFzdCcgb3IgJ29mZiciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9wcmFnbWFfZnBfaW52YWxpZF9vcHRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtpbnZhbGlkfG1pc3Npbmd9MCBvcHRpb24lc2VsZWN0eyAlMXx9MDsgZXhwZWN0ZWQgY29udHJhY3QiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9wcmFnbWFfZnBfc2NvcGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJyNwcmFnbWEgY2xhbmcgZnAnIGNhbiBvbmx5IGFwcGVhciBhdCBmaWxlIHNjb3BlIG9yIGF0IHRoZSBzdGFydCBvZiBhIGNvbXBvdW5kIHN0YXRlbWVudCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3ByYWdtYV9pbnZhbGlkX2tleXdvcmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBhcmd1bWVudDsgZXhwZWN0ZWQgJ2VuYWJsZSclc2VsZWN0e3wsICdmdWxsJ30wJXNlbGVjdHt8LCAnYXNzdW1lX3NhZmV0eSd9MSBvciAnZGlzYWJsZSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9wcmFnbWFfbG9vcF9pbnZhbGlkX29wdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2ludmFsaWR8bWlzc2luZ30wIG9wdGlvbiVzZWxlY3R7ICUxfH0wOyBleHBlY3RlZCB2ZWN0b3JpemUsIHZlY3Rvcml6ZV93aWR0aCwgaW50ZXJsZWF2ZSwgaW50ZXJsZWF2ZV9jb3VudCwgdW5yb2xsLCB1bnJvbGxfY291bnQsIG9yIGRpc3RyaWJ1dGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9wcmFnbWFfbG9vcF9taXNzaW5nX2FyZ3VtZW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1pc3NpbmcgYXJndW1lbnQ7IGV4cGVjdGVkICVzZWxlY3R7YW4gaW50ZWdlciB2YWx1ZXwnZW5hYmxlJyVzZWxlY3R7fCwgJ2Z1bGwnfTElc2VsZWN0e3wsICdhc3N1bWVfc2FmZXR5J30yIG9yICdkaXNhYmxlJ30wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfcHJhZ21hX21pc3NpbmdfYXJndW1lbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWlzc2luZyBhcmd1bWVudCB0byAnI3ByYWdtYSAlMCclc2VsZWN0e3w7IGV4cGVjdGVkICUyfTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9wcmFnbWFfb3B0aW1pemVfZXh0cmFfYXJndW1lbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5leHBlY3RlZCBleHRyYSBhcmd1bWVudCAnJTAnIHRvICcjcHJhZ21hIGNsYW5nIG9wdGltaXplJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3ByYWdtYV9vcHRpbWl6ZV9pbnZhbGlkX2FyZ3VtZW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuZXhwZWN0ZWQgYXJndW1lbnQgJyUwJyB0byAnI3ByYWdtYSBjbGFuZyBvcHRpbWl6ZSc7IGV4cGVjdGVkICdvbicgb3IgJ29mZiciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9wcmFnbWFfcG9pbnRlcnNfdG9fbWVtYmVyc191bmtub3duX2tpbmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5leHBlY3RlZCAlMCwgZXhwZWN0ZWQgdG8gc2VlIG9uZSBvZiAlc2VsZWN0e3wnYmVzdF9jYXNlJywgJ2Z1bGxfZ2VuZXJhbGl0eScsIH0xJ3NpbmdsZV9pbmhlcml0YW5jZScsICdtdWx0aXBsZV9pbmhlcml0YW5jZScsIG9yICd2aXJ0dWFsX2luaGVyaXRhbmNlJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3JpZ2h0X2FuZ2xlX2JyYWNrZXRfZXF1YWxfbmVlZHNfc3BhY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYSBzcGFjZSBpcyByZXF1aXJlZCBiZXR3ZWVuIGEgcmlnaHQgYW5nbGUgYnJhY2tldCBhbmQgYW4gZXF1YWxzIHNpZ24gKHVzZSAnPiA9JykiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl9zY29wZWRfZW51bV9taXNzaW5nX2lkZW50aWZpZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic2NvcGVkIGVudW1lcmF0aW9uIHJlcXVpcmVzIGEgbmFtZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3NpbmdsZV9kZWNsX2Fzc2lnbl9pbl9mb3JfcmFuZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmFuZ2UtYmFzZWQgJ2Zvcicgc3RhdGVtZW50IHVzZXMgJzonLCBub3QgJz0nIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfc2l6ZW9mX3BhcmFtZXRlcl9wYWNrLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIHBhcmVudGhlc2l6ZWQgcGFyYW1ldGVyIHBhY2sgbmFtZSBpbiAnc2l6ZW9mLi4uJyBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfc3RtdGV4cHJfZmlsZV9zY29wZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJzdGF0ZW1lbnQgZXhwcmVzc2lvbiBub3QgYWxsb3dlZCBhdCBmaWxlIHNjb3BlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfc3VwZXJfaW5fdXNpbmdfZGVjbGFyYXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ19fc3VwZXInIGNhbm5vdCBiZSB1c2VkIHdpdGggYSB1c2luZyBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3N5bnRoZXNpemVkX3Byb3BlcnR5X25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgYSBwcm9wZXJ0eSBuYW1lIGluIEBzeW50aGVzaXplIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfdGVtcGxhdGVfZGVmbl9leHBsaWNpdF9pbnN0YW50aWF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7ZnVuY3Rpb258Y2xhc3N8dmFyaWFibGV9MCBjYW5ub3QgYmUgZGVmaW5lZCBpbiBhbiBleHBsaWNpdCBpbnN0YW50aWF0aW9uOyBpZiB0aGlzIGRlY2xhcmF0aW9uIGlzIG1lYW50IHRvIGJlIGEgJXNlbGVjdHtmdW5jdGlvbnxjbGFzc3x2YXJpYWJsZX0wIGRlZmluaXRpb24sIHJlbW92ZSB0aGUgJ3RlbXBsYXRlJyBrZXl3b3JkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfdGVtcGxhdGVfc3BlY19zeW50YXhfbm9uX3RlbXBsYXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImlkZW50aWZpZXIgZm9sbG93ZWQgYnkgJzwnIGluZGljYXRlcyBhIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGJ1dCAlMCAlc2VsZWN0e2RvZXMgbm90IHJlZmVyIHRvIGEgdGVtcGxhdGV8cmVmZXJzIHRvIGEgZnVuY3Rpb24gdGVtcGxhdGV8PHVudXNlZD58cmVmZXJzIHRvIGEgdmFyaWFibGUgdGVtcGxhdGV8PHVudXNlZD59MSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3RlbXBsYXRlZF9pbnZhbGlkX2RlY2xhcmF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImEgc3RhdGljX2Fzc2VydCBkZWNsYXJhdGlvbiBjYW5ub3QgYmUgYSB0ZW1wbGF0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3RlbXBsYXRlZF91c2luZ19kaXJlY3RpdmVfZGVjbGFyYXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHRlbXBsYXRlIGEgdXNpbmcgJXNlbGVjdHtkaXJlY3RpdmV8ZGVjbGFyYXRpb259MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3RoaXNfY2FwdHVyZWRfYnlfcmVmZXJlbmNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIid0aGlzJyBjYW5ub3QgYmUgY2FwdHVyZWQgYnkgcmVmZXJlbmNlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfdHdvX3JpZ2h0X2FuZ2xlX2JyYWNrZXRzX25lZWRfc3BhY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYSBzcGFjZSBpcyByZXF1aXJlZCBiZXR3ZWVuIGNvbnNlY3V0aXZlIHJpZ2h0IGFuZ2xlIGJyYWNrZXRzICh1c2UgJz4gPicpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfdHlwZV9zYWZldHlfdW5rbm93bl9mbGFnLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgY29tcGFyaXNvbiBmbGFnICUwOyB1c2UgJ2xheW91dF9jb21wYXRpYmxlJyBvciAnbXVzdF9iZV9udWxsJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3R5cGVfdHJhaXRfYXJpdHksIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSB0cmFpdCByZXF1aXJlcyAlMCVzZWxlY3R7fCBvciBtb3JlfTEgYXJndW1lbnQlc2VsZWN0e3xzfTI7IGhhdmUgJTMgYXJndW1lbnQlczMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl90eXBlbmFtZV9pZGVudGlmaWVyc19vbmx5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInR5cGVuYW1lIGlzIGFsbG93ZWQgZm9yIGlkZW50aWZpZXJzIG9ubHkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl90eXBlbmFtZV9pbnZhbGlkX2NvbnN0ZXhwciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlIG5hbWUgZG9lcyBub3QgYWxsb3cgY29uc3RleHByIHNwZWNpZmllciB0byBiZSBzcGVjaWZpZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl90eXBlbmFtZV9pbnZhbGlkX2Z1bmN0aW9uc3BlYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlIG5hbWUgZG9lcyBub3QgYWxsb3cgZnVuY3Rpb24gc3BlY2lmaWVyIHRvIGJlIHNwZWNpZmllZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3R5cGVuYW1lX2ludmFsaWRfc3RvcmFnZWNsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInR5cGUgbmFtZSBkb2VzIG5vdCBhbGxvdyBzdG9yYWdlIGNsYXNzIHRvIGJlIHNwZWNpZmllZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3R5cGVuYW1lX3JlZmVyc190b19ub25fdHlwZV90ZW1wbGF0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlbmFtZSBzcGVjaWZpZXIgcmVmZXJzIHRvIGEgbm9uLXR5cGUgdGVtcGxhdGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl90eXBlbmFtZV9yZXF1aXJlc19zcGVjcXVhbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlIG5hbWUgcmVxdWlyZXMgYSBzcGVjaWZpZXIgb3IgcXVhbGlmaWVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfdW5leHBlY3RlZF9hdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmV4cGVjdGVkICdAJyBpbiBwcm9ncmFtIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfdW5leHBlY3RlZF9jb2xvbl9pbl9uZXN0ZWRfbmFtZV9zcGVjLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuZXhwZWN0ZWQgJzonIGluIG5lc3RlZCBuYW1lIHNwZWNpZmllcjsgZGlkIHlvdSBtZWFuICc6Oic/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfdW5leHBlY3RlZF9tb2R1bGVfZGVjbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtb2R1bGUgZGVjbGFyYXRpb24gY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSB0b3AgbGV2ZWwiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEzKQorRElBRyhlcnJfdW5leHBlY3RlZF9uYW1lc3BhY2VfYXR0cmlidXRlc19hbGlhcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhdHRyaWJ1dGVzIGNhbm5vdCBiZSBzcGVjaWZpZWQgb24gbmFtZXNwYWNlIGFsaWFzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfdW5leHBlY3RlZF9uZXN0ZWRfbmFtZXNwYWNlX2F0dHJpYnV0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhdHRyaWJ1dGVzIGNhbm5vdCBiZSBzcGVjaWZpZWQgb24gYSBuZXN0ZWQgbmFtZXNwYWNlIGRlZmluaXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl91bmV4cGVjdGVkX3Byb3RvY29sX3F1YWxpZmllciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJAaW1wbGVtZW50YXRpb24gZGVjbGFyYXRpb24gY2Fubm90IGJlIHByb3RvY29sIHF1YWxpZmllZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3VuZXhwZWN0ZWRfc2NvcGVfb25fYmFzZV9kZWNsdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmV4cGVjdGVkIG5hbWVzcGFjZSBzY29wZSBwcmlvciB0byBkZWNsdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3VuZXhwZWN0ZWRfc2VtaSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmV4cGVjdGVkICc7JyBiZWZvcmUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl91bmV4cGVjdGVkX3Rva2VuX2luX25lc3RlZF9uYW1lX3NwZWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJyUwJyBjYW5ub3QgYmUgYSBwYXJ0IG9mIG5lc3RlZCBuYW1lIHNwZWNpZmllcjsgZGlkIHlvdSBtZWFuICc6Jz8iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl91bmV4cGVjdGVkX3R5cGVkZWZfaWRlbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5leHBlY3RlZCB0eXBlIG5hbWUgJTA6IGV4cGVjdGVkIGlkZW50aWZpZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl91bmV4cGVjdGVkX3VucXVhbGlmaWVkX2lkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInR5cGUtaWQgY2Fubm90IGhhdmUgYSBuYW1lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfdW5rbm93bl90ZW1wbGF0ZV9uYW1lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVua25vd24gdGVtcGxhdGUgbmFtZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3Vuc3BlY2lmaWVkX3NpemVfd2l0aF9zdGF0aWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ3N0YXRpYycgbWF5IG5vdCBiZSB1c2VkIHdpdGhvdXQgYW4gYXJyYXkgc2l6ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNCkKK0RJQUcoZXJyX3Vuc3BlY2lmaWVkX3ZsYV9zaXplX3dpdGhfc3RhdGljLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidzdGF0aWMnIG1heSBub3QgYmUgdXNlZCB3aXRoIGFuIHVuc3BlY2lmaWVkIHZhcmlhYmxlIGxlbmd0aCBhcnJheSBzaXplIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfdXNpbmdfYXR0cmlidXRlX25zX2NvbmZsaWN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImF0dHJpYnV0ZSB3aXRoIHNjb3BlIHNwZWNpZmllciBjYW5ub3QgZm9sbG93IGRlZmF1bHQgc2NvcGUgc3BlY2lmaWVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA0KQorRElBRyhlcnJfdXNpbmdfbmFtZXNwYWNlX2luX2NsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIid1c2luZyBuYW1lc3BhY2UnIGlzIG5vdCBhbGxvd2VkIGluIGNsYXNzZXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGVycl96ZXJvX3ZlcnNpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmVyc2lvbiBudW1iZXIgbXVzdCBoYXZlIG5vbi16ZXJvIG1ham9yLCBtaW5vciwgb3Igc3ViLW1pbm9yIHZlcnNpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDQpCitESUFHKGV4dF9hYnN0cmFjdF9wYWNrX2RlY2xhcmF0b3JfcGFyZW5zLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIklTTyBDKysxMSByZXF1aXJlcyBhIHBhcmVudGhlc2l6ZWQgcGFjayBkZWNsYXJhdGlvbiB0byBoYXZlIGEgbmFtZSIsIDI0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X2FsaWFzX2RlY2xhcmF0aW9uLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImFsaWFzIGRlY2xhcmF0aW9ucyBhcmUgYSBDKysxMSBleHRlbnNpb24iLCA3NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9hbGlnbm9mX2V4cHIsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgYXBwbGllZCB0byBhbiBleHByZXNzaW9uIGlzIGEgR05VIGV4dGVuc2lvbiIsIDIzNiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9hdXRvX3N0b3JhZ2VfY2xhc3MsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJ2F1dG8nIHN0b3JhZ2UgY2xhc3Mgc3BlY2lmaWVyIGlzIG5vdCBwZXJtaXR0ZWQgaW4gQysrMTEsIGFuZCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgaW4gZnV0dXJlIHJlbGVhc2VzIiwgNDgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfYXV0b190eXBlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIidfX2F1dG9fdHlwZScgaXMgYSBHTlUgZXh0ZW5zaW9uIiwgMjM5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X2JpdGZpZWxkX21lbWJlcl9pbml0LCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImRlZmF1bHQgbWVtYmVyIGluaXRpYWxpemVyIGZvciBiaXQtZmllbGQgaXMgYSBDKysyYSBleHRlbnNpb24iLCA5NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9jMTFfYWxpZ25tZW50LCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiUwIGlzIGEgQzExLXNwZWNpZmljIGZlYXR1cmUiLCAxMTAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfYzExX2dlbmVyaWNfc2VsZWN0aW9uLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImdlbmVyaWMgc2VsZWN0aW9ucyBhcmUgYSBDMTEtc3BlY2lmaWMgZmVhdHVyZSIsIDExMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9jMTFfbm9yZXR1cm4sIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiX05vcmV0dXJuIGZ1bmN0aW9ucyBhcmUgYSBDMTEtc3BlY2lmaWMgZmVhdHVyZSIsIDExMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9jMTFfc3RhdGljX2Fzc2VydCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJfU3RhdGljX2Fzc2VydCBpcyBhIEMxMS1zcGVjaWZpYyBmZWF0dXJlIiwgMTEwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X2M5OV9jb21wb3VuZF9saXRlcmFsLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImNvbXBvdW5kIGxpdGVyYWxzIGFyZSBhIEM5OS1zcGVjaWZpYyBmZWF0dXJlIiwgMTEyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X2M5OV92YXJpYWJsZV9kZWNsX2luX2Zvcl9sb29wLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInZhcmlhYmxlIGRlY2xhcmF0aW9uIGluIGZvciBsb29wIGlzIGEgQzk5LXNwZWNpZmljIGZlYXR1cmUiLCAxMTIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfY19lbnVtX2ZpeGVkX3VuZGVybHlpbmdfdHlwZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJlbnVtZXJhdGlvbiB0eXBlcyB3aXRoIGEgZml4ZWQgdW5kZXJseWluZyB0eXBlIGFyZSBhIE1pY3Jvc29mdCBleHRlbnNpb24iLCAzNjQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfY29uc3RleHByX2lmLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNvbnN0ZXhwciBpZiBpcyBhIEMrKzE3IGV4dGVuc2lvbiIsIDg5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X2NvbnN0ZXhwcl9vbl9sYW1iZGFfY3h4MTcsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJ2NvbnN0ZXhwcicgb24gbGFtYmRhIGV4cHJlc3Npb25zIGlzIGEgQysrMTcgZXh0ZW5zaW9uIiwgODksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfY3h4MTFfZW51bV9maXhlZF91bmRlcmx5aW5nX3R5cGUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZW51bWVyYXRpb24gdHlwZXMgd2l0aCBhIGZpeGVkIHVuZGVybHlpbmcgdHlwZSBhcmUgYSBDKysxMSBleHRlbnNpb24iLCA3NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9kZWNsdHlwZV9hdXRvX3R5cGVfc3BlY2lmaWVyLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIidkZWNsdHlwZShhdXRvKScgdHlwZSBzcGVjaWZpZXIgaXMgYSBDKysxNCBleHRlbnNpb24iLCA4NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9kZWNvbXBfZGVjbF9lbXB0eSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJJU08gQysrMTcgZG9lcyBub3QgYWxsb3cgYSBkZWNvbXBvc2l0aW9uIGdyb3VwIHRvIGJlIGVtcHR5IiwgMTkxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X2RlZmF1bHRlZF9kZWxldGVkX2Z1bmN0aW9uLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiVzZWxlY3R7ZGVmYXVsdGVkfGRlbGV0ZWR9MCBmdW5jdGlvbiBkZWZpbml0aW9ucyBhcmUgYSBDKysxMSBleHRlbnNpb24iLCA3NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9lbGxpcHNpc19leGNlcHRpb25fc3BlYywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBvZiAnLi4uJyBpcyBhIE1pY3Jvc29mdCBleHRlbnNpb24iLCAzNjAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfZW1wdHlfdHJhbnNsYXRpb25fdW5pdCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJJU08gQyByZXF1aXJlcyBhIHRyYW5zbGF0aW9uIHVuaXQgdG8gY29udGFpbiBhdCBsZWFzdCBvbmUgZGVjbGFyYXRpb24iLCAxOTIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfZW51bWVyYXRvcl9saXN0X2NvbW1hX2MsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiY29tbWFzIGF0IHRoZSBlbmQgb2YgZW51bWVyYXRvciBsaXN0cyBhcmUgYSBDOTktc3BlY2lmaWMgZmVhdHVyZSIsIDExMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9lbnVtZXJhdG9yX2xpc3RfY29tbWFfY3h4LCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImNvbW1hcyBhdCB0aGUgZW5kIG9mIGVudW1lcmF0b3IgbGlzdHMgYXJlIGEgQysrMTEgZXh0ZW5zaW9uIiwgNzcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfZXhwZWN0ZWRfc2VtaV9kZWNsX2xpc3QsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZXhwZWN0ZWQgJzsnIGF0IGVuZCBvZiBkZWNsYXJhdGlvbiBsaXN0IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9leHRlcm5fdGVtcGxhdGUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZXh0ZXJuIHRlbXBsYXRlcyBhcmUgYSBDKysxMSBleHRlbnNpb24iLCA3NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9leHRyYV9zZW1pLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImV4dHJhICc7JyAlc2VsZWN0e291dHNpZGUgb2YgYSBmdW5jdGlvbnxpbnNpZGUgYSAlMXxpbnNpZGUgaW5zdGFuY2UgdmFyaWFibGUgbGlzdHxhZnRlciBtZW1iZXIgZnVuY3Rpb24gZGVmaW5pdGlvbn0wIiwgMjA5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X2V4dHJhX3NlbWlfY3h4MTEsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZXh0cmEgJzsnIG91dHNpZGUgb2YgYSBmdW5jdGlvbiBpcyBhIEMrKzExIGV4dGVuc2lvbiIsIDc4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X2ZvbGRfZXhwcmVzc2lvbiwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJwYWNrIGZvbGQgZXhwcmVzc2lvbiBpcyBhIEMrKzE3IGV4dGVuc2lvbiIsIDg5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X2Zvcl9yYW5nZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJyYW5nZS1iYXNlZCBmb3IgbG9vcCBpcyBhIEMrKzExIGV4dGVuc2lvbiIsIDc3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X2dlbmVyYWxpemVkX2luaXRpYWxpemVyX2xpc3RzLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImdlbmVyYWxpemVkIGluaXRpYWxpemVyIGxpc3RzIGFyZSBhIEMrKzExIGV4dGVuc2lvbiIsIDc3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X2dudV9hZGRyZXNzX29mX2xhYmVsLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVzZSBvZiBHTlUgYWRkcmVzcy1vZi1sYWJlbCBleHRlbnNpb24iLCAyNTMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfZ251X2FycmF5X3JhbmdlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVzZSBvZiBHTlUgYXJyYXkgcmFuZ2UgZXh0ZW5zaW9uIiwgMjQ1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X2dudV9jYXNlX3JhbmdlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVzZSBvZiBHTlUgY2FzZSByYW5nZSBleHRlbnNpb24iLCAyNDEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfZ251X2NvbmRpdGlvbmFsX2V4cHIsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidXNlIG9mIEdOVSA/OiBjb25kaXRpb25hbCBleHByZXNzaW9uIGV4dGVuc2lvbiwgb21pdHRpbmcgbWlkZGxlIG9wZXJhbmQiLCAyNDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfZ251X2VtcHR5X2luaXRpYWxpemVyLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVzZSBvZiBHTlUgZW1wdHkgaW5pdGlhbGl6ZXIgZXh0ZW5zaW9uIiwgMjQ2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X2dudV9pbmRpcmVjdF9nb3RvLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVzZSBvZiBHTlUgaW5kaXJlY3QtZ290byBleHRlbnNpb24iLCAyNTMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfZ251X21pc3NpbmdfZXF1YWxfZGVzaWduYXRvciwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1c2Ugb2YgR05VICdtaXNzaW5nID0nIGV4dGVuc2lvbiBpbiBkZXNpZ25hdG9yIiwgMjQ1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X2dudV9vbGRfc3R5bGVfZmllbGRfZGVzaWduYXRvciwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1c2Ugb2YgR05VIG9sZC1zdHlsZSBmaWVsZCBkZXNpZ25hdG9yIGV4dGVuc2lvbiIsIDI0NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9nbnVfc3RhdGVtZW50X2V4cHIsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidXNlIG9mIEdOVSBzdGF0ZW1lbnQgZXhwcmVzc2lvbiBleHRlbnNpb24iLCAyNTUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfaWRlbnRfbGlzdF9pbl9wYXJhbSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ0eXBlLWxlc3MgcGFyYW1ldGVyIG5hbWVzIGluIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIiwgNTAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X2luaXRfc3RhdGVtZW50LCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiclc2VsZWN0e2lmfHN3aXRjaH0wJyBpbml0aWFsaXphdGlvbiBzdGF0ZW1lbnRzIGFyZSBhIEMrKzE3IGV4dGVuc2lvbiIsIDg5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X2lubGluZV9uYW1lc3BhY2UsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW5saW5lIG5hbWVzcGFjZXMgYXJlIGEgQysrMTEgZmVhdHVyZSIsIDc5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X2tleXdvcmRfYXNfaWRlbnQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAia2V5d29yZCAnJTAnIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgYXMgYW4gaWRlbnRpZmllciAlc2VsZWN0e2hlcmV8Zm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHRyYW5zbGF0aW9uIHVuaXR9MSIsIDMyOCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9tc19zZWFsZWRfa2V5d29yZCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICInc2VhbGVkJyBrZXl3b3JkIGlzIGEgTWljcm9zb2Z0IGV4dGVuc2lvbiIsIDM3MiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9tdWx0aV91c2luZ19kZWNsYXJhdGlvbiwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1c2Ugb2YgbXVsdGlwbGUgZGVjbGFyYXRvcnMgaW4gYSBzaW5nbGUgdXNpbmcgZGVjbGFyYXRpb24gaXMgYSBDKysxNyBleHRlbnNpb24iLCA4OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9uZXN0ZWRfbmFtZXNwYWNlX2RlZmluaXRpb24sIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibmVzdGVkIG5hbWVzcGFjZSBkZWZpbml0aW9uIGlzIGEgQysrMTcgZXh0ZW5zaW9uOyBkZWZpbmUgZWFjaCBuYW1lc3BhY2Ugc2VwYXJhdGVseSIsIDg5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X25vbnN0YXRpY19tZW1iZXJfaW5pdCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpbi1jbGFzcyBpbml0aWFsaXphdGlvbiBvZiBub24tc3RhdGljIGRhdGEgbWVtYmVyIGlzIGEgQysrMTEgZXh0ZW5zaW9uIiwgNzcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfbnNfZW51bV9hdHRyaWJ1dGUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiYXR0cmlidXRlcyBvbiAlc2VsZWN0e2EgbmFtZXNwYWNlfGFuIGVudW1lcmF0b3J9MCBkZWNsYXJhdGlvbiBhcmUgYSBDKysxNyBleHRlbnNpb24iLCA4OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9udWxsYWJpbGl0eSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ0eXBlIG51bGxhYmlsaXR5IHNwZWNpZmllciAlMCBpcyBhIENsYW5nIGV4dGVuc2lvbiIsIDQzNywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9vdmVycmlkZV9jb250cm9sX2tleXdvcmQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJyUwJyBrZXl3b3JkIGlzIGEgQysrMTEgZXh0ZW5zaW9uIiwgNzcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfcmVmX3F1YWxpZmllciwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJyZWZlcmVuY2UgcXVhbGlmaWVycyBvbiBmdW5jdGlvbnMgYXJlIGEgQysrMTEgZXh0ZW5zaW9uIiwgNzcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfcnZhbHVlX3JlZmVyZW5jZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJydmFsdWUgcmVmZXJlbmNlcyBhcmUgYSBDKysxMSBleHRlbnNpb24iLCA3NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF9zY29wZWRfZW51bSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJzY29wZWQgZW51bWVyYXRpb25zIGFyZSBhIEMrKzExIGV4dGVuc2lvbiIsIDc3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcoZXh0X3N0ZGNfcHJhZ21hX2lnbm9yZWQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidW5rbm93biBwcmFnbWEgaW4gU1REQyBuYW1lc3BhY2UiLCA2NjAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfdGVtcGxhdGVfdGVtcGxhdGVfcGFyYW1fdHlwZW5hbWUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyIHVzaW5nICd0eXBlbmFtZScgaXMgYSBDKysxNyBleHRlbnNpb24iLCA4OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKGV4dF90aHJlYWRfYmVmb3JlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIidfX3RocmVhZCcgYmVmb3JlICclMCciLCA1MDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfdXNpbmdfYXR0cmlidXRlX25zLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImRlZmF1bHQgc2NvcGUgc3BlY2lmaWVyIGZvciBhdHRyaWJ1dGVzIGlzIGEgQysrMTcgZXh0ZW5zaW9uIiwgODksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhleHRfdXNpbmdfZGVjbGFyYXRpb25fcGFjaywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJwYWNrIGV4cGFuc2lvbiBvZiB1c2luZyBkZWNsYXJhdGlvbiBpcyBhIEMrKzE3IGV4dGVuc2lvbiIsIDg5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcobm90ZV9icmFja2V0X2RlcHRoLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidXNlIC1mYnJhY2tldC1kZXB0aD1OIHRvIGluY3JlYXNlIG1heGltdW0gbmVzdGluZyBsZXZlbCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhub3RlX2V4dHJhX2NvbW1hX21lc3NhZ2VfYXJnLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY29tbWEgc2VwYXJhdGluZyBPYmplY3RpdmUtQyBtZXNzYWdpbmcgYXJndW1lbnRzIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKG5vdGVfZm9yY2VfZW1wdHlfc2VsZWN0b3JfbmFtZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm9yIGluc2VydCB3aGl0ZXNwYWNlIGJlZm9yZSAnOicgdG8gdXNlICUwIGFzIHBhcmFtZXRlciBuYW1lIGFuZCBoYXZlIGFuIGVtcHR5IGVudHJ5IGluIHRoZSBzZWxlY3RvciIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhub3RlX21lYW50X3RvX3VzZV90eXBlbmFtZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRpZCB5b3UgbWVhbiB0byB1c2UgJ3R5cGVuYW1lJz8iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjApCitESUFHKG5vdGVfbWlzcGxhY2VkX2VsbGlwc2lzX3ZhcmFyZ19hZGRfY29tbWEsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbnNlcnQgJywnIGJlZm9yZSAnLi4uJyB0byBzaWxlbmNlIHRoaXMgd2FybmluZyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhub3RlX21pc3BsYWNlZF9lbGxpcHNpc192YXJhcmdfYWRkX2VsbGlwc2lzLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicGxhY2UgJy4uLicgJXNlbGVjdHtpbW1lZGlhdGVseSBiZWZvcmUgZGVjbGFyZWQgaWRlbnRpZmllcnxoZXJlfTAgdG8gZGVjbGFyZSBhIGZ1bmN0aW9uIHBhcmFtZXRlciBwYWNrIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKG5vdGVfbWlzcGxhY2VkX2VsbGlwc2lzX3ZhcmFyZ19leGlzdGluZ19lbGxpcHNpcywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInByZWNlZGluZyAnLi4uJyBkZWNsYXJlcyBhIGZ1bmN0aW9uIHBhcmFtZXRlciBwYWNrIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKG5vdGVfbWlzc2luZ19lbmRfb2ZfZGVmaW5pdGlvbl9iZWZvcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJzdGlsbCB3aXRoaW4gZGVmaW5pdGlvbiBvZiAlcTAgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhub3RlX21pc3Npbmdfc2VsZWN0b3JfbmFtZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImludHJvZHVjZSBhIHBhcmFtZXRlciBuYW1lIHRvIG1ha2UgJTAgcGFydCBvZiB0aGUgc2VsZWN0b3IiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcobm90ZV9vYmpjX2NvbnRhaW5lcl9zdGFydCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiVzZWxlY3R7Y2xhc3N8cHJvdG9jb2x8Y2F0ZWdvcnl8Y2xhc3MgZXh0ZW5zaW9ufGltcGxlbWVudGF0aW9ufGNhdGVnb3J5IGltcGxlbWVudGF0aW9ufTAgc3RhcnRlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKG5vdGVfcHJhZ21hX2F0dHJpYnV0ZV91c2VfYXR0cmlidXRlX2t3LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidXNlIHRoZSBHTlUgJ19fYXR0cmlidXRlX18nIHN5bnRheCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyhub3RlX3ByZXZpb3VzX2RlZmF1bHRfYXNzb2MsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwcmV2aW91cyBkZWZhdWx0IGdlbmVyaWMgYXNzb2NpYXRpb24gaXMgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX2FyY19icmlkZ2VfY2FzdF9ub25hcmMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiclMCcgY2FzdHMgaGF2ZSBubyBlZmZlY3Qgd2hlbiBub3QgdXNpbmcgQVJDIiwgMjYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA4KQorRElBRyh3YXJuX2FzbV9xdWFsaWZpZXJfaWdub3JlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaWdub3JlZCAlMCBxdWFsaWZpZXIgb24gYXNtIiwgMzYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxMikKK0RJQUcod2Fybl9hdHRyaWJ1dGVfbm9fZGVjbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYXR0cmlidXRlICUwIGlnbm9yZWQsIGJlY2F1c2UgaXQgaXMgbm90IGF0dGFjaGVkIHRvIGEgZGVjbGFyYXRpb24iLCAyNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX2F0dHJpYnV0ZV9vbl9mdW5jdGlvbl9kZWZpbml0aW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJHQ0MgZG9lcyBub3QgYWxsb3cgJTAgYXR0cmlidXRlIGluIHRoaXMgcG9zaXRpb24gb24gYSBmdW5jdGlvbiBkZWZpbml0aW9uIiwgMjMzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9hdmFpbGFiaWxpdHlfYW5kX3VuYXZhaWxhYmxlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIndW5hdmFpbGFibGUnIGF2YWlsYWJpbGl0eSBvdmVycmlkZXMgYWxsIG90aGVyIGF2YWlsYWJpbGl0eSBpbmZvcm1hdGlvbiIsIDUwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9jc3R5bGVfcGFyYW0sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVzZSBvZiBDLXN0eWxlIHBhcmFtZXRlcnMgaW4gT2JqZWN0aXZlLUMgbWV0aG9kIGRlY2xhcmF0aW9ucyBpcyBkZXByZWNhdGVkIiwgMTU1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjcpCitESUFHKHdhcm5fY3VkYV9hdHRyX2xhbWJkYV9wb3NpdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibnZjYyBkb2VzIG5vdCBhbGxvdyAnX18lMF9fJyB0byBhcHBlYXIgYWZ0ZXIgJygpJyBpbiBsYW1iZGFzIiwgMTQxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9jeHgxMV9jb21wYXRfZGVjbHR5cGVfYXV0b190eXBlX3NwZWNpZmllciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJ2RlY2x0eXBlKGF1dG8pJyB0eXBlIHNwZWNpZmllciBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKysgc3RhbmRhcmRzIGJlZm9yZSBDKysxNCIsIDEwMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fY3h4MTFfcmlnaHRfc2hpZnRfaW5fdGVtcGxhdGVfYXJnLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1c2Ugb2YgcmlnaHQtc2hpZnQgb3BlcmF0b3IgKCc+PicpIGluIHRlbXBsYXRlIGFyZ3VtZW50IHdpbGwgcmVxdWlyZSBwYXJlbnRoZXNlcyBpbiBDKysxMSIsIDczLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9jeHgxNF9jb21wYXRfY29uc3RleHByX2lmLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJjb25zdGV4cHIgaWYgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrIHN0YW5kYXJkcyBiZWZvcmUgQysrMTciLCA5OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fY3h4MTRfY29tcGF0X2NvbnN0ZXhwcl9vbl9sYW1iZGEsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImNvbnN0ZXhwciBvbiBsYW1iZGEgZXhwcmVzc2lvbnMgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrIHN0YW5kYXJkcyBiZWZvcmUgQysrMTciLCA5OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fY3h4MTRfY29tcGF0X2ZvbGRfZXhwcmVzc2lvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAicGFjayBmb2xkIGV4cHJlc3Npb24gaXMgaW5jb21wYXRpYmxlIHdpdGggQysrIHN0YW5kYXJkcyBiZWZvcmUgQysrMTciLCA5OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fY3h4MTRfY29tcGF0X2luaXRfc3RhdGVtZW50LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlc2VsZWN0e2lmfHN3aXRjaH0wIGluaXRpYWxpemF0aW9uIHN0YXRlbWVudHMgYXJlIGluY29tcGF0aWJsZSB3aXRoIEMrKyBzdGFuZGFyZHMgYmVmb3JlIEMrKzE3IiwgOTksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX2N4eDE0X2NvbXBhdF9uZXN0ZWRfbmFtZXNwYWNlX2RlZmluaXRpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm5lc3RlZCBuYW1lc3BhY2UgZGVmaW5pdGlvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKysgc3RhbmRhcmRzIGJlZm9yZSBDKysxNyIsIDk5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9jeHgxNF9jb21wYXRfbnNfZW51bV9hdHRyaWJ1dGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImF0dHJpYnV0ZXMgb24gJXNlbGVjdHthIG5hbWVzcGFjZXxhbiBlbnVtZXJhdG9yfTAgZGVjbGFyYXRpb24gYXJlIGluY29tcGF0aWJsZSB3aXRoIEMrKyBzdGFuZGFyZHMgYmVmb3JlIEMrKzE3IiwgMTAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9jeHgxNF9jb21wYXRfdGVtcGxhdGVfdGVtcGxhdGVfcGFyYW1fdHlwZW5hbWUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlciB1c2luZyAndHlwZW5hbWUnIGlzIGluY29tcGF0aWJsZSB3aXRoIEMrKyBzdGFuZGFyZHMgYmVmb3JlIEMrKzE3IiwgOTksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX2N4eDE0X2NvbXBhdF91c2luZ19hdHRyaWJ1dGVfbnMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImRlZmF1bHQgc2NvcGUgc3BlY2lmaWVyIGZvciBhdHRyaWJ1dGVzIGlzIGluY29tcGF0aWJsZSB3aXRoIEMrKyBzdGFuZGFyZHMgYmVmb3JlIEMrKzE3IiwgOTksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX2N4eDE3X2NvbXBhdF9iaXRmaWVsZF9tZW1iZXJfaW5pdCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZGVmYXVsdCBtZW1iZXIgaW5pdGlhbGl6ZXIgZm9yIGJpdC1maWVsZCBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKysgc3RhbmRhcmRzIGJlZm9yZSBDKysyYSIsIDk3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9jeHgxN19jb21wYXRfbXVsdGlfdXNpbmdfZGVjbGFyYXRpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVzZSBvZiBtdWx0aXBsZSBkZWNsYXJhdG9ycyBpbiBhIHNpbmdsZSB1c2luZyBkZWNsYXJhdGlvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKysgc3RhbmRhcmRzIGJlZm9yZSBDKysxNyIsIDk5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9jeHgxN19jb21wYXRfdXNpbmdfZGVjbGFyYXRpb25fcGFjaywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAicGFjayBleHBhbnNpb24gdXNpbmcgZGVjbGFyYXRpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggQysrIHN0YW5kYXJkcyBiZWZvcmUgQysrMTciLCA5OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X2FsaWFzX2RlY2xhcmF0aW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJhbGlhcyBkZWNsYXJhdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfYWxpZ25hcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJ2FsaWduYXMnIGlzIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfYWxpZ25vZiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiYWxpZ25vZiBleHByZXNzaW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF9hdHRyaWJ1dGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIkMrKzExIGF0dHJpYnV0ZSBzeW50YXggaXMgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF9kZWNsdHlwZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJ2RlY2x0eXBlJyB0eXBlIHNwZWNpZmllciBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X2RlZmF1bHRlZF9kZWxldGVkX2Z1bmN0aW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlc2VsZWN0e2RlZmF1bHRlZHxkZWxldGVkfTAgZnVuY3Rpb24gZGVmaW5pdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfZW51bV9maXhlZF91bmRlcmx5aW5nX3R5cGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImVudW1lcmF0aW9uIHR5cGVzIHdpdGggYSBmaXhlZCB1bmRlcmx5aW5nIHR5cGUgYXJlIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfZW51bWVyYXRvcl9saXN0X2NvbW1hLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJjb21tYXMgYXQgdGhlIGVuZCBvZiBlbnVtZXJhdG9yIGxpc3RzIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwOCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X2V4dGVybl90ZW1wbGF0ZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZXh0ZXJuIHRlbXBsYXRlcyBhcmUgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF9mb3JfcmFuZ2UsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInJhbmdlLWJhc2VkIGZvciBsb29wIGlzIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfZ2VuZXJhbGl6ZWRfaW5pdGlhbGl6ZXJfbGlzdHMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImdlbmVyYWxpemVkIGluaXRpYWxpemVyIGxpc3RzIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X2lubGluZV9uYW1lc3BhY2UsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImlubGluZSBuYW1lc3BhY2VzIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X2xhbWJkYSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAibGFtYmRhIGV4cHJlc3Npb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X2xpdGVyYWxfb3BlcmF0b3IsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImxpdGVyYWwgb3BlcmF0b3JzIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X25vZXhjZXB0X2RlY2wsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm5vZXhjZXB0IHNwZWNpZmljYXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X25vZXhjZXB0X2V4cHIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm5vZXhjZXB0IGV4cHJlc3Npb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X25vbnN0YXRpY19tZW1iZXJfaW5pdCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiaW4tY2xhc3MgaW5pdGlhbGl6YXRpb24gb2Ygbm9uLXN0YXRpYyBkYXRhIG1lbWJlcnMgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF9udWxscHRyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICInbnVsbHB0cicgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF9vdmVycmlkZV9jb250cm9sX2tleXdvcmQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiclMCcga2V5d29yZCBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X3JlZl9xdWFsaWZpZXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInJlZmVyZW5jZSBxdWFsaWZpZXJzIG9uIGZ1bmN0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF9ydmFsdWVfcmVmZXJlbmNlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJydmFsdWUgcmVmZXJlbmNlcyBhcmUgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF9zY29wZWRfZW51bSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAic2NvcGVkIGVudW1lcmF0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF9zdGF0aWNfYXNzZXJ0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJzdGF0aWNfYXNzZXJ0IGRlY2xhcmF0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF90b3BfbGV2ZWxfc2VtaSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZXh0cmEgJzsnIG91dHNpZGUgb2YgYSBmdW5jdGlvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X3RyYWlsaW5nX3JldHVybl90eXBlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ0cmFpbGluZyByZXR1cm4gdHlwZXMgYXJlIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfdHdvX3JpZ2h0X2FuZ2xlX2JyYWNrZXRzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJjb25zZWN1dGl2ZSByaWdodCBhbmdsZSBicmFja2V0cyBhcmUgaW5jb21wYXRpYmxlIHdpdGggQysrOTggKHVzZSAnPiA+JykiLCAxMDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX2RhbmdsaW5nX2Vsc2UsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImFkZCBleHBsaWNpdCBicmFjZXMgdG8gYXZvaWQgZGFuZ2xpbmcgZWxzZSIsIDE0MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fZXhwZWN0ZWRfY29uc2lzdGVudF92ZXJzaW9uX3NlcGFyYXRvciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidXNlIHNhbWUgdmVyc2lvbiBudW1iZXIgc2VwYXJhdG9ycyAnXycgb3IgJy4nOyBhcyBpbiAnbWFqb3JbLm1pbm9yWy5zdWJtaW5vcl1dJyIsIDUwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9leHBlY3RlZF9xdWFsaWZpZWRfYWZ0ZXJfdHlwZW5hbWUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZXhwZWN0ZWQgYSBxdWFsaWZpZWQgbmFtZSBhZnRlciAndHlwZW5hbWUnIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fZXh0cmFfc2VtaV9hZnRlcl9tZW1fZm5fZGVmLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJleHRyYSAnOycgYWZ0ZXIgbWVtYmVyIGZ1bmN0aW9uIGRlZmluaXRpb24iLCAyMDksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX2ZpbGVfYXNtX3ZvbGF0aWxlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJtZWFuaW5nbGVzcyAndm9sYXRpbGUnIG9uIGFzbSBvdXRzaWRlIGZ1bmN0aW9uIiwgMzYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxMikKK0RJQUcod2Fybl9nY2NfYXR0cmlidXRlX2xvY2F0aW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJHQ0MgZG9lcyBub3QgYWxsb3cgYW4gYXR0cmlidXRlIGluIHRoaXMgcG9zaXRpb24gb24gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiIsIDIzMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fbWljcm9zb2Z0X2RlcGVuZGVudF9leGlzdHMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImRlcGVuZGVudCAlc2VsZWN0e19faWZfbm90X2V4aXN0c3xfX2lmX2V4aXN0c30wIGRlY2xhcmF0aW9ucyBhcmUgaWdub3JlZCIsIDM2MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fbWljcm9zb2Z0X3F1YWxpZmllcnNfaWdub3JlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicXVhbGlmaWVycyBhZnRlciBjb21tYSBpbiBkZWNsYXJhdG9yIGxpc3QgYXJlIGlnbm9yZWQiLCAyNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX21pc3BsYWNlZF9lbGxpcHNpc192YXJhcmcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIicuLi4nIGluIHRoaXMgbG9jYXRpb24gY3JlYXRlcyBhIEMtc3R5bGUgdmFyYXJncyBmdW5jdGlvbiVzZWxlY3R7LCBub3QgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgcGFja3x9MCIsIDIwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9taXNzaW5nX2RlcGVuZGVudF90ZW1wbGF0ZV9rZXl3b3JkLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVzZSAndGVtcGxhdGUnIGtleXdvcmQgdG8gdHJlYXQgJyUwJyBhcyBhIGRlcGVuZGVudCB0ZW1wbGF0ZSBuYW1lIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fbWlzc2luZ19zZWxlY3Rvcl9uYW1lLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMCB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSBwcmV2aW91cyBwYXJhbWV0ZXIgcmF0aGVyIHRoYW4gYXMgcGFydCBvZiB0aGUgc2VsZWN0b3IiLCAzOTMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX29iamNfcHJvdG9jb2xfcXVhbGlmaWVyX21pc3NpbmdfaWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInByb3RvY29sIGhhcyBubyBvYmplY3QgdHlwZSBzcGVjaWZpZWQ7IGRlZmF1bHRzIHRvIHF1YWxpZmllZCAnaWQnIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fb21wX2V4dHJhX3Rva2Vuc19hdF9lb2wsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImV4dHJhIHRva2VucyBhdCB0aGUgZW5kIG9mICcjcHJhZ21hIG9tcCAlMCcgYXJlIGlnbm9yZWQiLCAyMTAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX3ByYWdtYV9hbGlnbl9leHBlY3RlZF9lcXVhbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZXhwZWN0ZWQgJz0nIGZvbGxvd2luZyAnI3ByYWdtYSAlc2VsZWN0e2FsaWdufG9wdGlvbnMgYWxpZ259MCcgLSBpZ25vcmVkIiwgMjY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9wcmFnbWFfYWxpZ25faW52YWxpZF9vcHRpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImludmFsaWQgYWxpZ25tZW50IG9wdGlvbiBpbiAnI3ByYWdtYSAlc2VsZWN0e2FsaWdufG9wdGlvbnMgYWxpZ259MCcgLSBpZ25vcmVkIiwgMjY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9wcmFnbWFfYmVnaW5fZW5kX21pc21hdGNoLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJPcGVuQ0wgZXh0ZW5zaW9uIGVuZCBkaXJlY3RpdmUgbWlzbWF0Y2hlcyBiZWdpbiBkaXJlY3RpdmUgLSBpZ25vcmluZyIsIDI2OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fcHJhZ21hX2NvbW1lbnRfaWdub3JlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJyNwcmFnbWEgY29tbWVudCAlMCcgaWdub3JlZCIsIDI2OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fcHJhZ21hX2V4cGVjdGVkX2FjdGlvbl9vcl9yX3BhcmVuLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleHBlY3RlZCBhY3Rpb24gb3IgJyknIGluICcjcHJhZ21hICUwJyAtIGlnbm9yZWQiLCAyNjksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX3ByYWdtYV9leHBlY3RlZF9jb2xvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibWlzc2luZyAnOicgYWZ0ZXIgJTAgLSBpZ25vcmluZyIsIDI2OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fcHJhZ21hX2V4cGVjdGVkX2NvbG9uX3JfcGFyZW4sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm1pc3NpbmcgJzonIG9yICcpJyBhZnRlciAlMCAtIGlnbm9yaW5nIiwgMjY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9wcmFnbWFfZXhwZWN0ZWRfY29tbWEsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImV4cGVjdGVkICcsJyBpbiAnI3ByYWdtYSAlMCciLCAyNjksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX3ByYWdtYV9leHBlY3RlZF9pZGVudGlmaWVyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleHBlY3RlZCBpZGVudGlmaWVyIGluICcjcHJhZ21hICUwJyAtIGlnbm9yZWQiLCAyNjksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX3ByYWdtYV9leHBlY3RlZF9pbml0X3NlZywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZXhwZWN0ZWQgJ2NvbXBpbGVyJywgJ2xpYicsICd1c2VyJywgb3IgYSBzdHJpbmcgbGl0ZXJhbCBmb3IgdGhlIHNlY3Rpb24gbmFtZSBpbiAnI3ByYWdtYSAlMCcgLSBpZ25vcmVkIiwgMjY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9wcmFnbWFfZXhwZWN0ZWRfaW50ZWdlciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZXhwZWN0ZWQgaW50ZWdlciBiZXR3ZWVuICUwIGFuZCAlMSBpbmNsdXNpdmUgaW4gJyNwcmFnbWEgJTInIC0gaWdub3JlZCIsIDI2OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fcHJhZ21hX2V4cGVjdGVkX2xwYXJlbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibWlzc2luZyAnKCcgYWZ0ZXIgJyNwcmFnbWEgJTAnIC0gaWdub3JpbmciLCAyNjksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX3ByYWdtYV9leHBlY3RlZF9ub25fd2lkZV9zdHJpbmcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImV4cGVjdGVkIG5vbi13aWRlIHN0cmluZyBsaXRlcmFsIGluICcjcHJhZ21hICUwJyIsIDI2OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fcHJhZ21hX2V4cGVjdGVkX3ByZWRpY2F0ZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZXhwZWN0ZWQgJXNlbGVjdHsnZW5hYmxlJywgJ2Rpc2FibGUnLCAnYmVnaW4nIG9yICdlbmQnfCdkaXNhYmxlJ30wIC0gaWdub3JpbmciLCAyNjksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX3ByYWdtYV9leHBlY3RlZF9wdW5jLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleHBlY3RlZCAnKScgb3IgJywnIGluICcjcHJhZ21hICUwJyIsIDI2OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fcHJhZ21hX2V4cGVjdGVkX3JwYXJlbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibWlzc2luZyAnKScgYWZ0ZXIgJyNwcmFnbWEgJTAnIC0gaWdub3JpbmciLCAyNjksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX3ByYWdtYV9leHBlY3RlZF9zZWN0aW9uX2xhYmVsX29yX25hbWUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImV4cGVjdGVkIGEgc3RhY2sgbGFiZWwgb3IgYSBzdHJpbmcgbGl0ZXJhbCBmb3IgdGhlIHNlY3Rpb24gbmFtZSBpbiAnI3ByYWdtYSAlMCcgLSBpZ25vcmVkIiwgMjY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9wcmFnbWFfZXhwZWN0ZWRfc2VjdGlvbl9uYW1lLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleHBlY3RlZCBhIHN0cmluZyBsaXRlcmFsIGZvciB0aGUgc2VjdGlvbiBuYW1lIGluICcjcHJhZ21hICUwJyAtIGlnbm9yZWQiLCAyNjksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX3ByYWdtYV9leHBlY3RlZF9zZWN0aW9uX3B1c2hfcG9wX29yX25hbWUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImV4cGVjdGVkIHB1c2gsIHBvcCBvciBhIHN0cmluZyBsaXRlcmFsIGZvciB0aGUgc2VjdGlvbiBuYW1lIGluICcjcHJhZ21hICUwJyAtIGlnbm9yZWQiLCAyNjksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX3ByYWdtYV9leHBlY3RlZF9zdHJpbmcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImV4cGVjdGVkIHN0cmluZyBsaXRlcmFsIGluICcjcHJhZ21hICUwJyAtIGlnbm9yaW5nIiwgMjY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9wcmFnbWFfZXh0ZW5zaW9uX2lzX2NvcmUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIk9wZW5DTCBleHRlbnNpb24gJTAgaXMgY29yZSBmZWF0dXJlIG9yIHN1cHBvcnRlZCBvcHRpb25hbCBjb3JlIGZlYXR1cmUgLSBpZ25vcmluZyIsIDUwMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fcHJhZ21hX2V4dHJhX3Rva2Vuc19hdF9lb2wsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImV4dHJhIHRva2VucyBhdCBlbmQgb2YgJyNwcmFnbWEgJTAnIC0gaWdub3JlZCIsIDI2OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fcHJhZ21hX2ZvcmNlX2N1ZGFfaG9zdF9kZXZpY2VfYmFkX2FyZywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW5jb3JyZWN0IHVzZSBvZiAjcHJhZ21hIGNsYW5nIGZvcmNlX2N1ZGFfaG9zdF9kZXZpY2UgYmVnaW58ZW5kIiwgMjY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9wcmFnbWFfaW5pdF9zZWdfdW5zdXBwb3J0ZWRfdGFyZ2V0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICInI3ByYWdtYSBpbml0X3NlZycgaXMgb25seSBzdXBwb3J0ZWQgd2hlbiB0YXJnZXRpbmcgYSBNaWNyb3NvZnQgZW52aXJvbm1lbnQiLCAyNjksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX3ByYWdtYV9pbnRyaW5zaWNfYnVpbHRpbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgaXMgbm90IGEgcmVjb2duaXplZCBidWlsdGluJXNlbGVjdHt8OyBjb25zaWRlciBpbmNsdWRpbmcgPGludHJpbi5oPiB0byBhY2Nlc3Mgbm9uLWJ1aWx0aW4gaW50cmluc2ljc30xIiwgMjY3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9wcmFnbWFfaW52YWxpZF9hY3Rpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVua25vd24gYWN0aW9uIGZvciAnI3ByYWdtYSAlMCcgLSBpZ25vcmVkIiwgMjY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9wcmFnbWFfaW52YWxpZF9hcmd1bWVudCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidW5leHBlY3RlZCBhcmd1bWVudCAnJTAnIHRvICcjcHJhZ21hICUxJyVzZWxlY3R7fDsgZXhwZWN0ZWQgJTN9MiIsIDI2OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fcHJhZ21hX2ludmFsaWRfc3BlY2lmaWNfYWN0aW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1bmtub3duIGFjdGlvbiAnJTEnIGZvciAnI3ByYWdtYSAlMCcgLSBpZ25vcmVkIiwgMjY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9wcmFnbWFfbWlzc2luZ19hcmd1bWVudCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibWlzc2luZyBhcmd1bWVudCB0byAnI3ByYWdtYSAlMCclc2VsZWN0e3w7IGV4cGVjdGVkICUyfTEiLCAyNjksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX3ByYWdtYV9tc19zdHJ1Y3QsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImluY29ycmVjdCB1c2Ugb2YgJyNwcmFnbWEgbXNfc3RydWN0IG9ufG9mZicgLSBpZ25vcmVkIiwgMjY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9wcmFnbWFfb21wX2lnbm9yZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVuZXhwZWN0ZWQgJyNwcmFnbWEgb21wIC4uLicgaW4gcHJvZ3JhbSIsIDU4MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fcHJhZ21hX29wdGltaXplLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICInI3ByYWdtYSBvcHRpbWl6ZScgaXMgbm90IHN1cHBvcnRlZCIsIDI2OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fcHJhZ21hX29wdGlvbnNfZXhwZWN0ZWRfYWxpZ24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImV4cGVjdGVkICdhbGlnbicgZm9sbG93aW5nICcjcHJhZ21hIG9wdGlvbnMnIC0gaWdub3JlZCIsIDI2OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fcHJhZ21hX3BhY2tfbWFsZm9ybWVkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleHBlY3RlZCBpbnRlZ2VyIG9yIGlkZW50aWZpZXIgaW4gJyNwcmFnbWEgcGFjaycgLSBpZ25vcmVkIiwgMjY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9wcmFnbWFfdW5rbm93bl9leHRlbnNpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVua25vd24gT3BlbkNMIGV4dGVuc2lvbiAlMCAtIGlnbm9yaW5nIiwgMjY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9wcmFnbWFfdW5yb2xsX2N1ZGFfdmFsdWVfaW5fcGFyZW5zLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJhcmd1bWVudCB0byAnI3ByYWdtYSB1bnJvbGwnIHNob3VsZCBub3QgYmUgaW4gcGFyZW50aGVzZXMgaW4gQ1VEQSBDL0MrKyIsIDE0MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fcHJhZ21hX3Vuc3VwcG9ydGVkX2FjdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAia25vd24gYnV0IHVuc3VwcG9ydGVkIGFjdGlvbiAnJTEnIGZvciAnI3ByYWdtYSAlMCcgLSBpZ25vcmVkIiwgMjY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9wcmFnbWFfdW5zdXBwb3J0ZWRfZXh0ZW5zaW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1bnN1cHBvcnRlZCBPcGVuQ0wgZXh0ZW5zaW9uICUwIC0gaWdub3JpbmciLCAyNjksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX3ByYWdtYV91bnVzZWRfZXhwZWN0ZWRfdmFyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleHBlY3RlZCAnI3ByYWdtYSB1bnVzZWQnIGFyZ3VtZW50IHRvIGJlIGEgdmFyaWFibGUgbmFtZSIsIDI2OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDQpCitESUFHKHdhcm5fc2VtaWNvbG9uX2JlZm9yZV9tZXRob2RfYm9keSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAic2VtaWNvbG9uIGJlZm9yZSBtZXRob2QgYm9keSBpcyBpZ25vcmVkIiwgNTU0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKK0RJQUcod2Fybl9zdGF0aWNfaW5saW5lX2V4cGxpY2l0X2luc3RfaWdub3JlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaWdub3JpbmcgJyVzZWxlY3R7c3RhdGljfGlubGluZX0wJyBrZXl3b3JkIG9uIGV4cGxpY2l0IHRlbXBsYXRlIGluc3RhbnRpYXRpb24iLCA1ODYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA0KQorRElBRyh3YXJuX3N0ZGNfZmVudl9hY2Nlc3Nfbm90X3N1cHBvcnRlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicHJhZ21hIFNUREMgRkVOVl9BQ0NFU1MgT04gaXMgbm90IHN1cHBvcnRlZCwgaWdub3JpbmcgcHJhZ21hIiwgNjYwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNCkKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNSZWZhY3RvcmluZ0tpbmRzLmluYyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNSZWZhY3RvcmluZ0tpbmRzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGNmN2FmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY1JlZmFjdG9yaW5nS2luZHMuaW5jCkBAIC0wLDAgKzEsMTEgQEAKKyNpZmRlZiBSRUZBQ1RPUklOR1NUQVJUCitfX1JFRkFDVE9SSU5HU1RBUlQgPSBESUFHX1NUQVJUX1JFRkFDVE9SSU5HLAorI3VuZGVmIFJFRkFDVE9SSU5HU1RBUlQKKyNlbmRpZgorCitESUFHKGVycl9yZWZhY3Rvcl9jb2RlX291dHNpZGVfb2ZfZnVuY3Rpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhlIHNlbGVjdGVkIGNvZGUgaXMgbm90IGEgcGFydCBvZiBhIGZ1bmN0aW9uJ3MgLyBtZXRob2QncyBib2R5IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyMikKK0RJQUcoZXJyX3JlZmFjdG9yX2V4dHJhY3RfcHJvaGliaXRlZF9leHByZXNzaW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRoZSBzZWxlY3RlZCBleHByZXNzaW9uIGNhbid0IGJlIGV4dHJhY3RlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMjIpCitESUFHKGVycl9yZWZhY3Rvcl9leHRyYWN0X3NpbXBsZV9leHByZXNzaW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRoZSBzZWxlY3RlZCBleHByZXNzaW9uIGlzIHRvbyBzaW1wbGUgdG8gZXh0cmFjdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMjIpCitESUFHKGVycl9yZWZhY3Rvcl9ub19zZWxlY3Rpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVmYWN0b3JpbmcgYWN0aW9uIGNhbid0IGJlIGluaXRpYXRlZCB3aXRob3V0IGEgc2VsZWN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyMikKK0RJQUcoZXJyX3JlZmFjdG9yX3NlbGVjdGlvbl9pbnZhbGlkX2FzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aGUgcHJvdmlkZWQgc2VsZWN0aW9uIGRvZXMgbm90IG92ZXJsYXAgd2l0aCB0aGUgQVNUIG5vZGVzIG9mIGludGVyZXN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyMikKK0RJQUcoZXJyX3JlZmFjdG9yX3NlbGVjdGlvbl9ub19zeW1ib2wsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhlcmUgaXMgbm8gc3ltYm9sIGF0IHRoZSBnaXZlbiBsb2NhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMjIpCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljU2VtYUtpbmRzLmluYyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNTZW1hS2luZHMuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMWZjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljU2VtYUtpbmRzLmluYwpAQCAtMCwwICsxLDMzNTkgQEAKKyNpZmRlZiBTRU1BU1RBUlQKK19fU0VNQVNUQVJUID0gRElBR19TVEFSVF9TRU1BLAorI3VuZGVmIFNFTUFTVEFSVAorI2VuZGlmCisKK0RJQUcoZXJyXzY0X2JpdF9idWlsdGluXzMyX2JpdF90Z3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhpcyBidWlsdGluIGlzIG9ubHkgYXZhaWxhYmxlIG9uIDY0LWJpdCB0YXJnZXRzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYWJpX3RhZ19vbl9yZWRlY2xhcmF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBhZGQgJ2FiaV90YWcnIGF0dHJpYnV0ZSBpbiBhIHJlZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hYnN0cmFjdF90eXBlX2luX2RlY2wsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtyZXR1cm58cGFyYW1ldGVyfHZhcmlhYmxlfGZpZWxkfGluc3RhbmNlIHZhcmlhYmxlfHN5bnRoZXNpemVkIGluc3RhbmNlIHZhcmlhYmxlfTAgdHlwZSAlMSBpcyBhbiBhYnN0cmFjdCBjbGFzcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FjY2VzcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMSBpcyBhICVzZWxlY3R7cHJpdmF0ZXxwcm90ZWN0ZWR9MCBtZW1iZXIgb2YgJTMiLCAwLCBTRklOQUVfQWNjZXNzQ29udHJvbCwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hY2Nlc3NfYmFzZV9jdG9yLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7YmFzZSBjbGFzc3xpbmhlcml0ZWQgdmlydHVhbCBiYXNlIGNsYXNzfTAgJTEgaGFzICVzZWxlY3R7cHJpdmF0ZXxwcm90ZWN0ZWR9MyAlc2VsZWN0e2RlZmF1bHQgfGNvcHkgfG1vdmUgfCpFUlJPUiogfCpFUlJPUiogfCpFUlJPUip8fTJjb25zdHJ1Y3RvciIsIDAsIFNGSU5BRV9BY2Nlc3NDb250cm9sLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FjY2Vzc19jdG9yLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbGxpbmcgYSAlc2VsZWN0e3ByaXZhdGV8cHJvdGVjdGVkfTAgY29uc3RydWN0b3Igb2YgY2xhc3MgJTIiLCAwLCBTRklOQUVfQWNjZXNzQ29udHJvbCwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hY2Nlc3NfZGVjbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJJU08gQysrMTEgZG9lcyBub3QgYWxsb3cgYWNjZXNzIGRlY2xhcmF0aW9uczsgdXNlIHVzaW5nIGRlY2xhcmF0aW9ucyBpbnN0ZWFkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYWNjZXNzX2R0b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2FsbGluZyBhICVzZWxlY3R7cHJpdmF0ZXxwcm90ZWN0ZWR9MSBkZXN0cnVjdG9yIG9mIGNsYXNzICUwIiwgMCwgU0ZJTkFFX0FjY2Vzc0NvbnRyb2wsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYWNjZXNzX2R0b3JfYmFzZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJiYXNlIGNsYXNzICUwIGhhcyAlc2VsZWN0e3ByaXZhdGV8cHJvdGVjdGVkfTEgZGVzdHJ1Y3RvciIsIDAsIFNGSU5BRV9BY2Nlc3NDb250cm9sLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FjY2Vzc19kdG9yX2V4Y2VwdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleGNlcHRpb24gb2JqZWN0IG9mIHR5cGUgJTAgaGFzICVzZWxlY3R7cHJpdmF0ZXxwcm90ZWN0ZWR9MSBkZXN0cnVjdG9yIiwgMCwgU0ZJTkFFX0FjY2Vzc0NvbnRyb2wsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYWNjZXNzX2R0b3JfZmllbGQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZmllbGQgb2YgdHlwZSAlMSBoYXMgJXNlbGVjdHtwcml2YXRlfHByb3RlY3RlZH0yIGRlc3RydWN0b3IiLCAwLCBTRklOQUVfQWNjZXNzQ29udHJvbCwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hY2Nlc3NfZHRvcl9pdmFyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluc3RhbmNlIHZhcmlhYmxlIG9mIHR5cGUgJTAgaGFzICVzZWxlY3R7cHJpdmF0ZXxwcm90ZWN0ZWR9MSBkZXN0cnVjdG9yIiwgMCwgU0ZJTkFFX0FjY2Vzc0NvbnRyb2wsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYWNjZXNzX2R0b3JfdGVtcCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0ZW1wb3Jhcnkgb2YgdHlwZSAlMCBoYXMgJXNlbGVjdHtwcml2YXRlfHByb3RlY3RlZH0xIGRlc3RydWN0b3IiLCAwLCBTRklOQUVfQWNjZXNzQ29udHJvbCwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hY2Nlc3NfZHRvcl92YXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFyaWFibGUgb2YgdHlwZSAlMSBoYXMgJXNlbGVjdHtwcml2YXRlfHByb3RlY3RlZH0yIGRlc3RydWN0b3IiLCAwLCBTRklOQUVfQWNjZXNzQ29udHJvbCwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hY2Nlc3NfZHRvcl92YmFzZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbmhlcml0ZWQgdmlydHVhbCBiYXNlIGNsYXNzICUxIGhhcyAlc2VsZWN0e3ByaXZhdGV8cHJvdGVjdGVkfTIgZGVzdHJ1Y3RvciIsIDAsIFNGSU5BRV9BY2Nlc3NDb250cm9sLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FjY2Vzc19maWVsZF9jdG9yLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZpZWxkIG9mIHR5cGUgJTAgaGFzICVzZWxlY3R7cHJpdmF0ZXxwcm90ZWN0ZWR9MiAlc2VsZWN0e2RlZmF1bHQgfGNvcHkgfG1vdmUgfCpFUlJPUiogfCpFUlJPUiogfCpFUlJPUiogfH0xY29uc3RydWN0b3IiLCAwLCBTRklOQUVfQWNjZXNzQ29udHJvbCwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hY2Nlc3NfZnJpZW5kX2Z1bmN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZyaWVuZCBmdW5jdGlvbiAlMSBpcyBhICVzZWxlY3R7cHJpdmF0ZXxwcm90ZWN0ZWR9MCBtZW1iZXIgb2YgJTMiLCAwLCBTRklOQUVfQWNjZXNzQ29udHJvbCwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hY2Nlc3NfbGFtYmRhX2NhcHR1cmUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2FwdHVyZSBvZiB2YXJpYWJsZSAnJTAnIGFzIHR5cGUgJTEgY2FsbHMgJXNlbGVjdHtwcml2YXRlfHByb3RlY3RlZH0zICVzZWxlY3R7ZGVmYXVsdCB8Y29weSB8bW92ZSB8KkVSUk9SKiB8KkVSUk9SKiB8KkVSUk9SKiB8fTJjb25zdHJ1Y3RvciIsIDAsIFNGSU5BRV9BY2Nlc3NDb250cm9sLCBmYWxzZSwgdHJ1ZSwgMykKK0RJQUcoZXJyX2FkZHJfb3ZsX2FtYmlndW91cywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhZGRyZXNzIG9mIG92ZXJsb2FkZWQgZnVuY3Rpb24gJTAgaXMgYW1iaWd1b3VzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYWRkcl9vdmxfbm9fcXVhbGlmaWVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBmb3JtIG1lbWJlciBwb2ludGVyIG9mIHR5cGUgJTAgd2l0aG91dCAnJicgYW5kIGNsYXNzIG5hbWUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hZGRyX292bF9ub192aWFibGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYWRkcmVzcyBvZiBvdmVybG9hZGVkIGZ1bmN0aW9uICUwIGRvZXMgbm90IG1hdGNoIHJlcXVpcmVkIHR5cGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hZGRyX292bF9ub3RfZnVuY19wdHJyZWYsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYWRkcmVzcyBvZiBvdmVybG9hZGVkIGZ1bmN0aW9uICUwIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdHlwZSAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FkZHJlc3Nfb2ZfZnVuY3Rpb25fd2l0aF9wYXNzX29iamVjdF9zaXplX3BhcmFtcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgdGFrZSBhZGRyZXNzIG9mIGZ1bmN0aW9uICUwIGJlY2F1c2UgcGFyYW1ldGVyICUxIGhhcyBwYXNzX29iamVjdF9zaXplIGF0dHJpYnV0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FkZHJlc3Nfc3BhY2VfcXVhbGlmaWVkX2RlbGV0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInZGVsZXRlJyBjYW5ub3QgZGVsZXRlIG9iamVjdHMgb2YgdHlwZSAlMCBpbiBhZGRyZXNzIHNwYWNlICclMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hZGRyZXNzX3NwYWNlX3F1YWxpZmllZF9uZXcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ25ldycgY2Fubm90IGFsbG9jYXRlIG9iamVjdHMgb2YgdHlwZSAlMCBpbiBhZGRyZXNzIHNwYWNlICclMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hZGRyb2ZfZnVuY3Rpb25fZGlzYWJsZWRfYnlfZW5hYmxlX2lmX2F0dHIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHRha2UgYWRkcmVzcyBvZiBmdW5jdGlvbiAlMCBiZWNhdXNlIGl0IGhhcyBvbmUgb3IgbW9yZSBub24tdGF1dG9sb2dpY2FsIGVuYWJsZV9pZiBjb25kaXRpb25zIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYWxpYXNfYWZ0ZXJfdGVudGF0aXZlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFsaWFzIGRlZmluaXRpb24gb2YgJTAgYWZ0ZXIgdGVudGF0aXZlIGRlZmluaXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hbGlhc19pc19kZWZpbml0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZmluaXRpb24gJTAgY2Fubm90IGFsc28gYmUgYW4gJXNlbGVjdHthbGlhc3xpZnVuY30xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYWxpYXNfbm90X3N1cHBvcnRlZF9vbl9kYXJ3aW4sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYWxpYXNlcyBhcmUgbm90IHN1cHBvcnRlZCBvbiBkYXJ3aW4iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hbGlhc19ub3Rfc3VwcG9ydGVkX29uX252cHR4LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIkNVREEgZG9lcyBub3Qgc3VwcG9ydCBhbGlhc2VzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYWxpYXNfdGVtcGxhdGVfZXhwYW5zaW9uX2ludG9fZml4ZWRfbGlzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwYWNrIGV4cGFuc2lvbiB1c2VkIGFzIGFyZ3VtZW50IGZvciBub24tcGFjayBwYXJhbWV0ZXIgb2YgYWxpYXMgdGVtcGxhdGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hbGlhc190ZW1wbGF0ZV9leHRyYV9oZWFkZXJzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4dHJhbmVvdXMgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3QgaW4gYWxpYXMgdGVtcGxhdGUgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hbGlhc190b191bmRlZmluZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHthbGlhc3xpZnVuY30wIG11c3QgcG9pbnQgdG8gYSBkZWZpbmVkICVzZWxlY3R7dmFyaWFibGUgb3IgfH0xZnVuY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hbGlnbl92YWx1ZV9hdHRyaWJ1dGVfYXJndW1lbnRfbm90X2ludCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInYWxpZ25fdmFsdWUnIGF0dHJpYnV0ZSByZXF1aXJlcyBpbnRlZ2VyIGNvbnN0YW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYWxpZ25hc19hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGF0dHJpYnV0ZSBjYW5ub3QgYmUgYXBwbGllZCB0byBhICVzZWxlY3R7ZnVuY3Rpb24gcGFyYW1ldGVyfHZhcmlhYmxlIHdpdGggJ3JlZ2lzdGVyJyBzdG9yYWdlIGNsYXNzfCdjYXRjaCcgdmFyaWFibGV8Yml0LWZpZWxkfTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hbGlnbmFzX21pc21hdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZGVjbGFyYXRpb24gaGFzIGRpZmZlcmVudCBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgKCUxIHZzICUwKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FsaWduYXNfbWlzc2luZ19vbl9kZWZpbml0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIG11c3QgYmUgc3BlY2lmaWVkIG9uIGRlZmluaXRpb24gaWYgaXQgaXMgc3BlY2lmaWVkIG9uIGFueSBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FsaWduYXNfdW5kZXJhbGlnbmVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlcXVlc3RlZCBhbGlnbm1lbnQgaXMgbGVzcyB0aGFuIG1pbmltdW0gYWxpZ25tZW50IG9mICUxIGZvciB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYWxpZ25lZF9hdHRyaWJ1dGVfYXJndW1lbnRfbm90X2ludCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInYWxpZ25lZCcgYXR0cmlidXRlIHJlcXVpcmVzIGludGVnZXIgY29uc3RhbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hbGlnbm1lbnRfZGVwZW5kZW50X3R5cGVkZWZfbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZXF1ZXN0ZWQgYWxpZ25tZW50IGlzIGRlcGVuZGVudCBidXQgZGVjbGFyYXRpb24gaXMgbm90IGRlcGVuZGVudCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FsaWdubWVudF9ub3RfcG93ZXJfb2ZfdHdvLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlcXVlc3RlZCBhbGlnbm1lbnQgaXMgbm90IGEgcG93ZXIgb2YgMiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FsaWdubWVudF90b29fYmlnLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlcXVlc3RlZCBhbGlnbm1lbnQgbXVzdCBiZSAlMCBvciBzbWFsbGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYWxpZ25tZW50X3Rvb19zbWFsbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZXF1ZXN0ZWQgYWxpZ25tZW50IG11c3QgYmUgJTAgb3IgZ3JlYXRlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FsaWdub2ZfbWVtYmVyX29mX2luY29tcGxldGVfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIGFwcGxpY2F0aW9uIG9mICdhbGlnbm9mJyB0byBhIGZpZWxkIG9mIGEgY2xhc3Mgc3RpbGwgYmVpbmcgZGVmaW5lZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FsbG9jYXRpb25fb2ZfYWJzdHJhY3RfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhbGxvY2F0aW5nIGFuIG9iamVjdCBvZiBhYnN0cmFjdCBjbGFzcyB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYWx0aXZlY19lbXB0eV9pbml0aWFsaXplciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBpbml0aWFsaXplciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FtYmlndW91c19iYXNlX3RvX2Rlcml2ZWRfY2FzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhbWJpZ3VvdXMgY2FzdCBmcm9tIGJhc2UgJTAgdG8gZGVyaXZlZCAlMTolMiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FtYmlndW91c19kZWxldGVfb3BlcmFuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhbWJpZ3VvdXMgY29udmVyc2lvbiBvZiBkZWxldGUgZXhwcmVzc2lvbiBvZiB0eXBlICUwIHRvIGEgcG9pbnRlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FtYmlndW91c19kZXJpdmVkX3RvX2Jhc2VfY29udiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhbWJpZ3VvdXMgY29udmVyc2lvbiBmcm9tIGRlcml2ZWQgY2xhc3MgJTAgdG8gYmFzZSBjbGFzcyAlMTolMiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FtYmlndW91c19pbmhlcml0ZWRfY29uc3RydWN0b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29uc3RydWN0b3Igb2YgJTAgaW5oZXJpdGVkIGZyb20gbXVsdGlwbGUgYmFzZSBjbGFzcyBzdWJvYmplY3RzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYW1iaWd1b3VzX21lbWJlcl9tdWx0aXBsZV9zdWJvYmplY3RfdHlwZXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWVtYmVyICUwIGZvdW5kIGluIG11bHRpcGxlIGJhc2UgY2xhc3NlcyBvZiBkaWZmZXJlbnQgdHlwZXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hbWJpZ3VvdXNfbWVtYmVyX211bHRpcGxlX3N1Ym9iamVjdHMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm9uLXN0YXRpYyBtZW1iZXIgJTAgZm91bmQgaW4gbXVsdGlwbGUgYmFzZS1jbGFzcyBzdWJvYmplY3RzIG9mIHR5cGUgJTE6JTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hbWJpZ3VvdXNfbWVtcHRyX2NvbnYsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYW1iaWd1b3VzIGNvbnZlcnNpb24gZnJvbSBwb2ludGVyIHRvIG1lbWJlciBvZiAlc2VsZWN0e2Jhc2V8ZGVyaXZlZH0wIGNsYXNzICUxIHRvIHBvaW50ZXIgdG8gbWVtYmVyIG9mICVzZWxlY3R7ZGVyaXZlZHxiYXNlfTAgY2xhc3MgJTI6JTMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hbWJpZ3VvdXNfcmVmZXJlbmNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZmVyZW5jZSB0byAlMCBpcyBhbWJpZ3VvdXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hbWJpZ3VvdXNfc3VpdGFibGVfZGVsZXRlX21lbWJlcl9mdW5jdGlvbl9mb3VuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtdWx0aXBsZSBzdWl0YWJsZSAlMCBmdW5jdGlvbnMgaW4gJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hbWJpZ3VvdXNfdGFnX2hpZGluZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhIHR5cGUgbmFtZWQgJTAgaXMgaGlkZGVuIGJ5IGEgZGVjbGFyYXRpb24gaW4gYSBkaWZmZXJlbnQgbmFtZXNwYWNlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYW5vbl9iaXRmaWVsZF9oYXNfbmVnYXRpdmVfd2lkdGgsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYW5vbnltb3VzIGJpdC1maWVsZCBoYXMgbmVnYXRpdmUgd2lkdGggKCUwKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Fub25fYml0ZmllbGRfcXVhbGlmaWVycywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhbm9ueW1vdXMgYml0LWZpZWxkIGNhbm5vdCBoYXZlIHF1YWxpZmllcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hbm9uX2JpdGZpZWxkX3dpZHRoX2V4Y2VlZHNfdHlwZV93aWR0aCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ3aWR0aCBvZiBhbm9ueW1vdXMgYml0LWZpZWxkICglMCBiaXRzKSBleGNlZWRzICVzZWxlY3R7d2lkdGh8c2l6ZX0xIG9mIGl0cyB0eXBlICglMiBiaXQlczIpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYW5vbnltb3VzX3Byb3BlcnR5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFub255bW91cyBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYW5vbnltb3VzX3JlY29yZF9iYWRfbWVtYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFub255bW91cyAlc2VsZWN0e3N0cnVjdHx1bmlvbn0wIGNhbiBvbmx5IGNvbnRhaW4gbm9uLXN0YXRpYyBkYXRhIG1lbWJlcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hbm9ueW1vdXNfcmVjb3JkX21lbWJlcl9yZWRlY2wsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWVtYmVyIG9mIGFub255bW91cyAlc2VsZWN0e3N0cnVjdHx1bmlvbn0wIHJlZGVjbGFyZXMgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hbm9ueW1vdXNfcmVjb3JkX25vbnB1YmxpY19tZW1iZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYW5vbnltb3VzICVzZWxlY3R7c3RydWN0fHVuaW9ufTAgY2Fubm90IGNvbnRhaW4gYSAlc2VsZWN0e3ByaXZhdGV8cHJvdGVjdGVkfTEgZGF0YSBtZW1iZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hbm9ueW1vdXNfcmVjb3JkX3dpdGhfZnVuY3Rpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZnVuY3Rpb25zIGNhbm5vdCBiZSBkZWNsYXJlZCBpbiBhbiBhbm9ueW1vdXMgJXNlbGVjdHtzdHJ1Y3R8dW5pb259MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Fub255bW91c19yZWNvcmRfd2l0aF9zdGF0aWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic3RhdGljIG1lbWJlcnMgY2Fubm90IGJlIGRlY2xhcmVkIGluIGFuIGFub255bW91cyAlc2VsZWN0e3N0cnVjdHx1bmlvbn0wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYW5vbnltb3VzX3JlY29yZF93aXRoX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZXMgY2Fubm90IGJlIGRlY2xhcmVkIGluIGFuIGFub255bW91cyAlc2VsZWN0e3N0cnVjdHx1bmlvbn0wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYW5vbnltb3VzX3N0cnVjdF9ub3RfbWVtYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFub255bW91cyAlc2VsZWN0e3N0cnVjdHN8c3RydWN0cyBhbmQgY2xhc3Nlc30wIG11c3QgYmUgJXNlbGVjdHtzdHJ1Y3Qgb3IgdW5pb258Y2xhc3N9MCBtZW1iZXJzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYW5vbnltb3VzX3VuaW9uX25vdF9zdGF0aWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYW5vbnltb3VzIHVuaW9ucyBhdCBuYW1lc3BhY2Ugb3IgZ2xvYmFsIHNjb3BlIG11c3QgYmUgZGVjbGFyZWQgJ3N0YXRpYyciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hbm9ueW1vdXNfdW5pb25fd2l0aF9zdG9yYWdlX3NwZWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYW5vbnltb3VzIHVuaW9uIGF0IGNsYXNzIHNjb3BlIG11c3Qgbm90IGhhdmUgYSBzdG9yYWdlIHNwZWNpZmllciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FueXg4Nl9pbnRlcnJ1cHRfYXR0cmlidXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7eDg2fHg4Ni02NH0wICdpbnRlcnJ1cHQnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zIHRoYXQgaGF2ZSAlc2VsZWN0e2EgJ3ZvaWQnIHJldHVybiB0eXBlfG9ubHkgYSBwb2ludGVyIHBhcmFtZXRlciBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGFuIGludGVnZXIgcGFyYW1ldGVyfGEgcG9pbnRlciBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyfGEgJTIgdHlwZSBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlcn0xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYW55eDg2X2ludGVycnVwdF9jYWxsZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXJjX2FycmF5X3BhcmFtX25vX293bmVyc2hpcCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtdXN0IGV4cGxpY2l0bHkgZGVzY3JpYmUgaW50ZW5kZWQgb3duZXJzaGlwIG9mIGFuIG9iamVjdCBhcnJheSBwYXJhbWV0ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDUpCitESUFHKGVycl9hcmNfYXNzaWduX3Byb3BlcnR5X293bmVyc2hpcCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleGlzdGluZyBpbnN0YW5jZSB2YXJpYWJsZSAlMSBmb3IgcHJvcGVydHkgJTAgd2l0aCAlc2VsZWN0e3Vuc2FmZV91bnJldGFpbmVkfGFzc2lnbn0yIGF0dHJpYnV0ZSBtdXN0IGJlIF9fdW5zYWZlX3VucmV0YWluZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDYpCitESUFHKGVycl9hcmNfYXRvbWljX293bmVyc2hpcCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgcGVyZm9ybSBhdG9taWMgb3BlcmF0aW9uIG9uIGEgcG9pbnRlciB0byB0eXBlICUwOiB0eXBlIGhhcyBub24tdHJpdmlhbCBvd25lcnNoaXAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDUpCitESUFHKGVycl9hcmNfYXV0b3JlbGVhc2luZ19jYXB0dXJlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBjYXB0dXJlIF9fYXV0b3JlbGVhc2luZyB2YXJpYWJsZSBpbiBhICVzZWxlY3R7YmxvY2t8bGFtYmRhIGJ5IGNvcHl9MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNSkKK0RJQUcoZXJyX2FyY19hdXRvcmVsZWFzaW5nX3ZhciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e19fYmxvY2sgdmFyaWFibGVzfGdsb2JhbCB2YXJpYWJsZXN8ZmllbGRzfGluc3RhbmNlIHZhcmlhYmxlc30wIGNhbm5vdCBoYXZlIF9fYXV0b3JlbGVhc2luZyBvd25lcnNoaXAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDUpCitESUFHKGVycl9hcmNfYnJpZGdlX2Nhc3RfaW5jb21wYXRpYmxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluY29tcGF0aWJsZSB0eXBlcyBjYXN0aW5nICUwIHRvICUxIHdpdGggYSAlc2VsZWN0e19fYnJpZGdlfF9fYnJpZGdlX3RyYW5zZmVyfF9fYnJpZGdlX3JldGFpbmVkfTIgY2FzdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNykKK0RJQUcoZXJyX2FyY19icmlkZ2VfY2FzdF93cm9uZ19raW5kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhc3Qgb2YgJXNlbGVjdHtPYmplY3RpdmUtQ3xibG9ja3xDfTAgcG9pbnRlciB0eXBlICUxIHRvICVzZWxlY3R7T2JqZWN0aXZlLUN8YmxvY2t8Q30yIHBvaW50ZXIgdHlwZSAlMyBjYW5ub3QgdXNlICVzZWxlY3R7X19icmlkZ2V8X19icmlkZ2VfdHJhbnNmZXJ8X19icmlkZ2VfcmV0YWluZWR9NCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNykKK0RJQUcoZXJyX2FyY19jYXN0X3JlcXVpcmVzX2JyaWRnZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2Nhc3R8aW1wbGljaXQgY29udmVyc2lvbn0wIG9mICVzZWxlY3R7T2JqZWN0aXZlLUN8YmxvY2t8Q30xIHBvaW50ZXIgdHlwZSAlMiB0byAlc2VsZWN0e09iamVjdGl2ZS1DfGJsb2NrfEN9MyBwb2ludGVyIHR5cGUgJTQgcmVxdWlyZXMgYSBicmlkZ2VkIGNhc3QiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDcpCitESUFHKGVycl9hcmNfY29sbGVjdGlvbl9mb3J3YXJkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbGxlY3Rpb24gZXhwcmVzc2lvbiB0eXBlICUwIGlzIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNSkKK0RJQUcoZXJyX2FyY19jb252ZXNpb25fb2Zfd2Vha191bmF2YWlsYWJsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2ltcGxpY2l0IGNvbnZlcnNpb258Y2FzdH0wIG9mIHdlYWstdW5hdmFpbGFibGUgb2JqZWN0IG9mIHR5cGUgJTEgdG8gYSBfX3dlYWsgb2JqZWN0IG9mIHR5cGUgJTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDkpCitESUFHKGVycl9hcmNfZ2FpbmVkX21ldGhvZF9jb252ZW50aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1ldGhvZCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBtYXRjaCBpdHMgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDUpCitESUFHKGVycl9hcmNfaWxsZWdhbF9leHBsaWNpdF9tZXNzYWdlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIkFSQyBmb3JiaWRzIGV4cGxpY2l0IG1lc3NhZ2Ugc2VuZCBvZiAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTApCitESUFHKGVycl9hcmNfaWxsZWdhbF9tZXRob2RfZGVmLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIkFSQyBmb3JiaWRzICVzZWxlY3R7aW1wbGVtZW50YXRpb258c3ludGhlc2lzfTAgb2YgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEwKQorRElBRyhlcnJfYXJjX2lsbGVnYWxfc2VsZWN0b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiQVJDIGZvcmJpZHMgdXNlIG9mICUwIGluIGEgQHNlbGVjdG9yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMCkKK0RJQUcoZXJyX2FyY19pbmNvbnNpc3RlbnRfcHJvcGVydHlfb3duZXJzaGlwLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7fHVuc2FmZV91bnJldGFpbmVkfHN0cm9uZ3x3ZWFrfTEgcHJvcGVydHkgJTAgbWF5IG5vdCBhbHNvIGJlIGRlY2xhcmVkICVzZWxlY3R7fF9fdW5zYWZlX3VucmV0YWluZWR8X19zdHJvbmd8X193ZWFrfF9fYXV0b3JlbGVhc2luZ30yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA2KQorRElBRyhlcnJfYXJjX2luZGlyZWN0X25vX293bmVyc2hpcCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e3BvaW50ZXJ8cmVmZXJlbmNlfTEgdG8gbm9uLWNvbnN0IHR5cGUgJTAgd2l0aCBubyBleHBsaWNpdCBvd25lcnNoaXAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDUpCitESUFHKGVycl9hcmNfaW5pdF9tZXRob2RfdW5yZWxhdGVkX3Jlc3VsdF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluaXQgbWV0aG9kcyBtdXN0IHJldHVybiBhIHR5cGUgcmVsYXRlZCB0byB0aGUgcmVjZWl2ZXIgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNSkKK0RJQUcoZXJyX2FyY19sb3N0X21ldGhvZF9jb252ZW50aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1ldGhvZCB3YXMgZGVjbGFyZWQgYXMgJXNlbGVjdHthbiAnYWxsb2MnfGEgJ2NvcHknfGFuICdpbml0J3xhICduZXcnfTAgbWV0aG9kLCBidXQgaXRzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgbWF0Y2ggYmVjYXVzZSAlc2VsZWN0e2l0cyByZXN1bHQgdHlwZSBpcyBub3QgYW4gb2JqZWN0IHBvaW50ZXJ8aXRzIHJlc3VsdCB0eXBlIGlzIHVucmVsYXRlZCB0byBpdHMgcmVjZWl2ZXIgdHlwZX0xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA1KQorRElBRyhlcnJfYXJjX21heV9ub3RfcmVzcG9uZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyB2aXNpYmxlIEBpbnRlcmZhY2UgZm9yICUwIGRlY2xhcmVzIHRoZSBzZWxlY3RvciAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNSkKK0RJQUcoZXJyX2FyY19tZXRob2Rfbm90X2ZvdW5kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIGtub3duICVzZWxlY3R7aW5zdGFuY2V8Y2xhc3N9MSBtZXRob2QgZm9yIHNlbGVjdG9yICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA1KQorRElBRyhlcnJfYXJjX21pc21hdGNoZWRfY2FzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2ltcGxpY2l0IGNvbnZlcnNpb258Y2FzdH0wIG9mICVzZWxlY3R7JTJ8YSBub24tT2JqZWN0aXZlLUMgcG9pbnRlciB0eXBlICUyfGEgYmxvY2sgcG9pbnRlcnxhbiBPYmplY3RpdmUtQyBwb2ludGVyfGFuIGluZGlyZWN0IHBvaW50ZXIgdG8gYW4gT2JqZWN0aXZlLUMgcG9pbnRlcn0xIHRvICUzIGlzIGRpc2FsbG93ZWQgd2l0aCBBUkMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEwKQorRElBRyhlcnJfYXJjX211bHRpcGxlX21ldGhvZF9kZWNsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm11bHRpcGxlIG1ldGhvZHMgbmFtZWQgJTAgZm91bmQgd2l0aCBtaXNtYXRjaGVkIHJlc3VsdCwgcGFyYW1ldGVyIHR5cGUgb3IgYXR0cmlidXRlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNSkKK0RJQUcoZXJyX2FyY19uZXdfYXJyYXlfd2l0aG91dF9vd25lcnNoaXAsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ25ldycgY2Fubm90IGFsbG9jYXRlIGFuIGFycmF5IG9mICUwIHdpdGggbm8gZXhwbGljaXQgb3duZXJzaGlwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA1KQorRElBRyhlcnJfYXJjX25vbGlmZXRpbWVfYmVoYXZpb3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwbGljaXQgb3duZXJzaGlwIHF1YWxpZmllciBvbiBjYXN0IHJlc3VsdCBoYXMgbm8gZWZmZWN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMCkKK0RJQUcoZXJyX2FyY19ub25sb2NhbF93cml0ZWJhY2ssIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicGFzc2luZyBhZGRyZXNzIG9mICVzZWxlY3R7bm9uLWxvY2FsfG5vbi1zY2FsYXJ9MCBvYmplY3QgdG8gX19hdXRvcmVsZWFzaW5nIHBhcmFtZXRlciBmb3Igd3JpdGUtYmFjayIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNSkKK0RJQUcoZXJyX2FyY19vYmpjX29iamVjdF9pbl90YWcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiQVJDIGZvcmJpZHMgJXNlbGVjdHtPYmplY3RpdmUtQyBvYmplY3RzfGJsb2Nrc30wIGluICVzZWxlY3R7c3RydWN0fGludGVyZmFjZXx1bmlvbnw8PEVSUk9SPj58ZW51bX0xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMCkKK0RJQUcoZXJyX2FyY19vYmpjX3Byb3BlcnR5X2RlZmF1bHRfYXNzaWduX29uX29iamVjdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJBUkMgZm9yYmlkcyBzeW50aGVzaXppbmcgYSBwcm9wZXJ0eSBvZiBhbiBPYmplY3RpdmUtQyBvYmplY3Qgd2l0aCB1bnNwZWNpZmllZCBvd25lcnNoaXAgb3Igc3RvcmFnZSBhdHRyaWJ1dGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEwKQorRElBRyhlcnJfYXJjX3BlcmZvcm1fc2VsZWN0b3JfcmV0YWlucywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwZXJmb3JtU2VsZWN0b3IgbmFtZXMgYSBzZWxlY3RvciB3aGljaCByZXRhaW5zIHRoZSBvYmplY3QiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hcmNfcHNldWRvX2R0b3JfaW5jb25zdGFudF9xdWFscywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwc2V1ZG8tZGVzdHJ1Y3RvciBkZXN0cm95cyBvYmplY3Qgb2YgdHlwZSAlMCB3aXRoIGluY29uc2lzdGVudGx5LXF1YWxpZmllZCB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA1KQorRElBRyhlcnJfYXJjX3JlY2VpdmVyX2ZvcndhcmRfY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVjZWl2ZXIgJTAgZm9yIGNsYXNzIG1lc3NhZ2UgaXMgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA1KQorRElBRyhlcnJfYXJjX3JlY2VpdmVyX2ZvcndhcmRfaW5zdGFuY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVjZWl2ZXIgdHlwZSAlMCBmb3IgaW5zdGFuY2UgbWVzc2FnZSBpcyBhIGZvcndhcmQgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDUpCitESUFHKGVycl9hcmNfc3Ryb25nX3Byb3BlcnR5X293bmVyc2hpcCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleGlzdGluZyBpbnN0YW5jZSB2YXJpYWJsZSAlMSBmb3Igc3Ryb25nIHByb3BlcnR5ICUwIG1heSBub3QgYmUgJXNlbGVjdHt8X191bnNhZmVfdW5yZXRhaW5lZHx8X193ZWFrfTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDYpCitESUFHKGVycl9hcmNfdGhyZWFkX293bmVyc2hpcCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aHJlYWQtbG9jYWwgdmFyaWFibGUgaGFzIG5vbi10cml2aWFsIG93bmVyc2hpcDogdHlwZSBpcyAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNSkKK0RJQUcoZXJyX2FyY190eXBlY2hlY2tfY29udmVydF9pbmNvbXBhdGlibGVfcG9pbnRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlcyBwYXNzaW5nIHJldGFpbmFibGUgcGFyYW1ldGVyIG9mIHR5cGUgJTB0byBhIENGIGZ1bmN0aW9uIGV4cGVjdGluZyAlMSB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXJjX3Vuc3VwcG9ydGVkX3dlYWtfY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2xhc3MgaXMgaW5jb21wYXRpYmxlIHdpdGggX193ZWFrIHJlZmVyZW5jZXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDkpCitESUFHKGVycl9hcmNfdW51c2VkX2luaXRfbWVzc2FnZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aGUgcmVzdWx0IG9mIGEgZGVsZWdhdGUgaW5pdCBjYWxsIG11c3QgYmUgaW1tZWRpYXRlbHkgcmV0dXJuZWQgb3IgYXNzaWduZWQgdG8gJ3NlbGYnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMCkKK0RJQUcoZXJyX2FyY193ZWFrX2Rpc2FibGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBjcmVhdGUgX193ZWFrIHJlZmVyZW5jZSBpbiBmaWxlIHVzaW5nIG1hbnVhbCByZWZlcmVuY2UgY291bnRpbmciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDkpCitESUFHKGVycl9hcmNfd2Vha19pdmFyX2FjY2VzcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZXJlZmVyZW5jaW5nIGEgX193ZWFrIHBvaW50ZXIgaXMgbm90IGFsbG93ZWQgZHVlIHRvIHBvc3NpYmxlIG51bGwgdmFsdWUgY2F1c2VkIGJ5IHJhY2UgY29uZGl0aW9uLCBhc3NpZ24gaXQgdG8gc3Ryb25nIHZhcmlhYmxlIGZpcnN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXJjX3dlYWtfbm9fcnVudGltZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgY3JlYXRlIF9fd2VhayByZWZlcmVuY2UgYmVjYXVzZSB0aGUgY3VycmVudCBkZXBsb3ltZW50IHRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgOSkKK0RJQUcoZXJyX2FyY193ZWFrX3VuYXZhaWxhYmxlX2Fzc2lnbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhc3NpZ25tZW50IG9mIGEgd2Vhay11bmF2YWlsYWJsZSBvYmplY3QgdG8gYSBfX3dlYWsgb2JqZWN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA5KQorRElBRyhlcnJfYXJjX3dlYWtfdW5hdmFpbGFibGVfcHJvcGVydHksIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic3ludGhlc2l6aW5nIF9fd2VhayBpbnN0YW5jZSB2YXJpYWJsZSBvZiB0eXBlICUwLCB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgOSkKK0RJQUcoZXJyX2FyZ193aXRoX2FkZHJlc3Nfc3BhY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicGFyYW1ldGVyIG1heSBub3QgYmUgcXVhbGlmaWVkIHdpdGggYW4gYWRkcmVzcyBzcGFjZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FyZ3VtZW50X2ludmFsaWRfcmFuZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAlMCB0byAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FyZ3VtZW50X25vdF9tdWx0aXBsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhcmd1bWVudCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FyaXRobWV0aWNfbm9uZnJhZ2lsZV9pbnRlcmZhY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJpdGhtZXRpYyBvbiBwb2ludGVyIHRvIGludGVyZmFjZSAlMCwgd2hpY2ggaXMgbm90IGEgY29uc3RhbnQgc2l6ZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUgYW5kIHBsYXRmb3JtIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXJtX2ludmFsaWRfc3BlY2lhbHJlZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIHNwZWNpYWwgcmVnaXN0ZXIgZm9yIGJ1aWx0aW4iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hcnJheV9kZXNpZ25hdG9yX2VtcHR5X3JhbmdlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFycmF5IGRlc2lnbmF0b3IgcmFuZ2UgWyUwLCAlMV0gaXMgZW1wdHkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hcnJheV9kZXNpZ25hdG9yX25lZ2F0aXZlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFycmF5IGRlc2lnbmF0b3IgdmFsdWUgJyUwJyBpcyBuZWdhdGl2ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FycmF5X2Rlc2lnbmF0b3Jfbm9uX2FycmF5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFycmF5IGRlc2lnbmF0b3IgY2Fubm90IGluaXRpYWxpemUgbm9uLWFycmF5IHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hcnJheV9kZXNpZ25hdG9yX3Rvb19sYXJnZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhcnJheSBkZXNpZ25hdG9yIGluZGV4ICglMCkgZXhjZWVkcyBhcnJheSBib3VuZHMgKCUxKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FycmF5X2luaXRfZGlmZmVyZW50X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGluaXRpYWxpemUgYXJyYXkgJWRpZmZ7b2YgdHlwZSAkIHdpdGggYXJyYXkgb2YgdHlwZSAkfHdpdGggZGlmZmVyZW50IHR5cGUgb2YgYXJyYXl9MCwxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXJyYXlfaW5pdF9pbmNvbXBhdF93aWRlX3N0cmluZ19pbnRvX3djaGFyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluaXRpYWxpemluZyB3aWRlIGNoYXIgYXJyYXkgd2l0aCBpbmNvbXBhdGlibGUgd2lkZSBzdHJpbmcgbGl0ZXJhbCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FycmF5X2luaXRfbmFycm93X3N0cmluZ19pbnRvX3djaGFyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluaXRpYWxpemluZyB3aWRlIGNoYXIgYXJyYXkgd2l0aCBub24td2lkZSBzdHJpbmcgbGl0ZXJhbCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FycmF5X2luaXRfbm9uX2NvbnN0YW50X2FycmF5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBpbml0aWFsaXplIGFycmF5ICVkaWZme29mIHR5cGUgJCB3aXRoIG5vbi1jb25zdGFudCBhcnJheSBvZiB0eXBlICR8d2l0aCBkaWZmZXJlbnQgdHlwZSBvZiBhcnJheX0wLDEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hcnJheV9pbml0X25vdF9pbml0X2xpc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJyYXkgaW5pdGlhbGl6ZXIgbXVzdCBiZSBhbiBpbml0aWFsaXplciBsaXN0JXNlbGVjdHt8IG9yIHN0cmluZyBsaXRlcmFsfCBvciB3aWRlIHN0cmluZyBsaXRlcmFsfTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hcnJheV9pbml0X3dpZGVfc3RyaW5nX2ludG9fY2hhciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbml0aWFsaXppbmcgY2hhciBhcnJheSB3aXRoIHdpZGUgc3RyaW5nIGxpdGVyYWwiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hcnJheV9uZXdfbmVlZHNfc2l6ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhcnJheSBzaXplIG11c3QgYmUgc3BlY2lmaWVkIGluIG5ldyBleHByZXNzaW9ucyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FycmF5X29mX2Fic3RyYWN0X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJyYXkgb2YgYWJzdHJhY3QgY2xhc3MgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FycmF5X3NlY3Rpb25fZG9lc19ub3Rfc3BlY2lmeV9jb250aWd1b3VzX3N0b3JhZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJyYXkgc2VjdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IGNvbnRpZ3VvdXMgc3RvcmFnZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9hcnJheV9zaXplX2FtYmlndW91c19jb252ZXJzaW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFtYmlndW91cyBjb252ZXJzaW9uIG9mIGFycmF5IHNpemUgZXhwcmVzc2lvbiBvZiB0eXBlICUwIHRvIGFuIGludGVncmFsIG9yIGVudW1lcmF0aW9uIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hcnJheV9zaXplX2V4cGxpY2l0X2NvbnZlcnNpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJyYXkgc2l6ZSBleHByZXNzaW9uIG9mIHR5cGUgJTAgcmVxdWlyZXMgZXhwbGljaXQgY29udmVyc2lvbiB0byB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXJyYXlfc2l6ZV9pbmNvbXBsZXRlX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJyYXkgc2l6ZSBleHByZXNzaW9uIGhhcyBpbmNvbXBsZXRlIGNsYXNzIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hcnJheV9zaXplX25vbl9pbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic2l6ZSBvZiBhcnJheSBoYXMgbm9uLWludGVnZXIgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FycmF5X3NpemVfbm90X2ludGVncmFsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFycmF5IHNpemUgZXhwcmVzc2lvbiBtdXN0IGhhdmUgaW50ZWdyYWwgb3IgJXNlbGVjdHt8dW5zY29wZWQgfTBlbnVtZXJhdGlvbiB0eXBlLCBub3QgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hcnJheV9zdGFyX2luX2Z1bmN0aW9uX2RlZmluaXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFyaWFibGUgbGVuZ3RoIGFycmF5IG11c3QgYmUgYm91bmQgaW4gZnVuY3Rpb24gZGVmaW5pdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FycmF5X3N0YXJfb3V0c2lkZV9wcm90b3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic3RhciBtb2RpZmllciB1c2VkIG91dHNpZGUgb2YgZnVuY3Rpb24gcHJvdG90eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXJyYXlfc3RhdGljX25vdF9vdXRlcm1vc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgdXNlZCBpbiBub24tb3V0ZXJtb3N0IGFycmF5IHR5cGUgZGVyaXZhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FycmF5X3N0YXRpY19vdXRzaWRlX3Byb3RvdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCB1c2VkIGluIGFycmF5IGRlY2xhcmF0b3Igb3V0c2lkZSBvZiBmdW5jdGlvbiBwcm90b3R5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hcnJheV90b29fbGFyZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJyYXkgaXMgdG9vIGxhcmdlICglMCBlbGVtZW50cykiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hc19xdWFsaWZpZWRfYXV0b19kZWNsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImF1dG9tYXRpYyB2YXJpYWJsZSBxdWFsaWZpZWQgd2l0aCBhbiVzZWxlY3R7fCBpbnZhbGlkfTAgYWRkcmVzcyBzcGFjZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2FzbV9iYWRfcmVnaXN0ZXJfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJiYWQgdHlwZSBmb3IgbmFtZWQgcmVnaXN0ZXIgdmFyaWFibGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEyKQorRElBRyhlcnJfYXNtX2ltbWVkaWF0ZV9leHBlY3RlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb25zdHJhaW50ICclMCcgZXhwZWN0cyBhbiBpbnRlZ2VyIGNvbnN0YW50IGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEyKQorRElBRyhlcnJfYXNtX2luY29tcGxldGVfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhc20gb3BlcmFuZCBoYXMgaW5jb21wbGV0ZSB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMikKK0RJQUcoZXJyX2FzbV9pbnB1dF9kdXBsaWNhdGVfbWF0Y2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibW9yZSB0aGFuIG9uZSBpbnB1dCBjb25zdHJhaW50IG1hdGNoZXMgdGhlIHNhbWUgb3V0cHV0ICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEyKQorRElBRyhlcnJfYXNtX2ludmFsaWRfZ2xvYmFsX3Zhcl9yZWcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVnaXN0ZXIgJyUwJyB1bnN1aXRhYmxlIGZvciBnbG9iYWwgcmVnaXN0ZXIgdmFyaWFibGVzIG9uIHRoaXMgdGFyZ2V0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMikKK0RJQUcoZXJyX2FzbV9pbnZhbGlkX2lucHV0X2NvbnN0cmFpbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBpbnB1dCBjb25zdHJhaW50ICclMCcgaW4gYXNtIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMikKK0RJQUcoZXJyX2FzbV9pbnZhbGlkX2lucHV0X3NpemUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBpbnB1dCBzaXplIGZvciBjb25zdHJhaW50ICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEyKQorRElBRyhlcnJfYXNtX2ludmFsaWRfbHZhbHVlX2luX2lucHV0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgbHZhbHVlIGluIGFzbSBpbnB1dCBmb3IgY29uc3RyYWludCAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMikKK0RJQUcoZXJyX2FzbV9pbnZhbGlkX2x2YWx1ZV9pbl9vdXRwdXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBsdmFsdWUgaW4gYXNtIG91dHB1dCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTIpCitESUFHKGVycl9hc21faW52YWxpZF9vdXRwdXRfY29uc3RyYWludCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIG91dHB1dCBjb25zdHJhaW50ICclMCcgaW4gYXNtIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMikKK0RJQUcoZXJyX2FzbV9pbnZhbGlkX291dHB1dF9zaXplLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgb3V0cHV0IHNpemUgZm9yIGNvbnN0cmFpbnQgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTIpCitESUFHKGVycl9hc21faW52YWxpZF90eXBlX2luX2lucHV0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgdHlwZSAlMCBpbiBhc20gaW5wdXQgZm9yIGNvbnN0cmFpbnQgJyUxJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTIpCitESUFHKGVycl9hc21fbmFrZWRfcGFybV9yZWYsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicGFyYW1ldGVyIHJlZmVyZW5jZXMgbm90IGFsbG93ZWQgaW4gbmFrZWQgZnVuY3Rpb25zIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXNtX25ha2VkX3RoaXNfcmVmLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIid0aGlzJyBwb2ludGVyIHJlZmVyZW5jZXMgbm90IGFsbG93ZWQgaW4gbmFrZWQgZnVuY3Rpb25zIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXNtX25vbl9hZGRyX3ZhbHVlX2luX21lbW9yeV9jb25zdHJhaW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZmVyZW5jZSB0byBhICVzZWxlY3R7Yml0LWZpZWxkfHZlY3RvciBlbGVtZW50fGdsb2JhbCByZWdpc3RlciB2YXJpYWJsZX0wIGluIGFzbSAlc2VsZWN0e2lucHV0fG91dHB1dH0xIHdpdGggYSBtZW1vcnkgY29uc3RyYWludCAnJTInIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMikKK0RJQUcoZXJyX2FzbV9yZWdpc3Rlcl9zaXplX21pc21hdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInNpemUgb2YgcmVnaXN0ZXIgJyUwJyBkb2VzIG5vdCBtYXRjaCB2YXJpYWJsZSBzaXplIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMikKK0RJQUcoZXJyX2FzbV90eWluZ19pbmNvbXBhdGlibGVfdHlwZXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5zdXBwb3J0ZWQgaW5saW5lIGFzbTogaW5wdXQgd2l0aCB0eXBlICVkaWZmeyQgbWF0Y2hpbmcgb3V0cHV0IHdpdGggdHlwZSAkfH0wLDEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEyKQorRElBRyhlcnJfYXNtX3VuZXhwZWN0ZWRfY29uc3RyYWludF9hbHRlcm5hdGl2ZXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXNtIGNvbnN0cmFpbnQgaGFzIGFuIHVuZXhwZWN0ZWQgbnVtYmVyIG9mIGFsdGVybmF0aXZlczogJTAgdnMgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEyKQorRElBRyhlcnJfYXNtX3Vua25vd25fcmVnaXN0ZXJfbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmtub3duIHJlZ2lzdGVyIG5hbWUgJyUwJyBpbiBhc20iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEyKQorRElBRyhlcnJfYXNzb2NfY29tcGF0aWJsZV90eXBlcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlICUwIGluIGdlbmVyaWMgYXNzb2NpYXRpb24gY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzbHkgc3BlY2lmaWVkIHR5cGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hc3NvY190eXBlX2luY29tcGxldGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSAlMCBpbiBnZW5lcmljIGFzc29jaWF0aW9uIGluY29tcGxldGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hc3NvY190eXBlX25vbm9iamVjdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlICUwIGluIGdlbmVyaWMgYXNzb2NpYXRpb24gbm90IGFuIG9iamVjdCB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXNzb2NfdHlwZV92YXJpYWJseV9tb2RpZmllZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlICUwIGluIGdlbmVyaWMgYXNzb2NpYXRpb24gaXMgYSB2YXJpYWJseSBtb2RpZmllZCB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXRkZWZfbm9uZnJhZ2lsZV9pbnRlcmZhY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidXNlIG9mIEBkZWZzIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBhcmNoaXRlY3R1cmUgYW5kIHBsYXRmb3JtIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXRvbWljX2J1aWx0aW5fbXVzdF9iZV9wb2ludGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFkZHJlc3MgYXJndW1lbnQgdG8gYXRvbWljIGJ1aWx0aW4gbXVzdCBiZSBhIHBvaW50ZXIgKCUwIGludmFsaWQpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXRvbWljX2J1aWx0aW5fbXVzdF9iZV9wb2ludGVyX2ludGZsdHB0ciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhZGRyZXNzIGFyZ3VtZW50IHRvIGF0b21pYyBidWlsdGluIG11c3QgYmUgYSBwb2ludGVyIHRvIGludGVnZXIsIGZsb2F0aW5nLXBvaW50IG9yIHBvaW50ZXIgKCUwIGludmFsaWQpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXRvbWljX2J1aWx0aW5fbXVzdF9iZV9wb2ludGVyX2ludHB0ciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhZGRyZXNzIGFyZ3VtZW50IHRvIGF0b21pYyBidWlsdGluIG11c3QgYmUgYSBwb2ludGVyIHRvIGludGVnZXIgb3IgcG9pbnRlciAoJTAgaW52YWxpZCkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdG9taWNfYnVpbHRpbl9wb2ludGVyX3NpemUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYWRkcmVzcyBhcmd1bWVudCB0byBhdG9taWMgYnVpbHRpbiBtdXN0IGJlIGEgcG9pbnRlciB0byAxLDIsNCw4IG9yIDE2IGJ5dGUgdHlwZSAoJTAgaW52YWxpZCkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdG9taWNfZXhjbHVzaXZlX2J1aWx0aW5fcG9pbnRlcl9zaXplLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFkZHJlc3MgYXJndW1lbnQgdG8gbG9hZCBvciBzdG9yZSBleGNsdXNpdmUgYnVpbHRpbiBtdXN0IGJlIGEgcG9pbnRlciB0byAxLDIsNCBvciA4IGJ5dGUgdHlwZSAoJTAgaW52YWxpZCkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdG9taWNfbG9hZF9zdG9yZV91c2VzX2xpYiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhdG9taWMgJXNlbGVjdHtsb2FkfHN0b3JlfTAgcmVxdWlyZXMgcnVudGltZSBzdXBwb3J0IHRoYXQgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyB0YXJnZXQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdG9taWNfb3BfYml0d2lzZV9uZWVkc19hdG9taWNfaW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFkZHJlc3MgYXJndW1lbnQgdG8gYml0d2lzZSBhdG9taWMgb3BlcmF0aW9uIG11c3QgYmUgYSBwb2ludGVyIHRvICVzZWxlY3R7fGF0b21pYyB9MGludGVnZXIgKCUxIGludmFsaWQpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXRvbWljX29wX2hhc19pbnZhbGlkX3N5bmNoX3Njb3BlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN5bmNocm9uaXphdGlvbiBzY29wZSBhcmd1bWVudCB0byBhdG9taWMgb3BlcmF0aW9uIGlzIGludmFsaWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdG9taWNfb3BfbmVlZHNfYXRvbWljLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFkZHJlc3MgYXJndW1lbnQgdG8gYXRvbWljIG9wZXJhdGlvbiBtdXN0IGJlIGEgcG9pbnRlciB0byBfQXRvbWljIHR5cGUgKCUwIGludmFsaWQpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXRvbWljX29wX25lZWRzX2F0b21pY19pbnRfb3JfcHRyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFkZHJlc3MgYXJndW1lbnQgdG8gYXRvbWljIG9wZXJhdGlvbiBtdXN0IGJlIGEgcG9pbnRlciB0byAlc2VsZWN0e3xhdG9taWMgfTBpbnRlZ2VyIG9yIHBvaW50ZXIgKCUxIGludmFsaWQpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXRvbWljX29wX25lZWRzX25vbl9jb25zdF9hdG9taWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYWRkcmVzcyBhcmd1bWVudCB0byBhdG9taWMgb3BlcmF0aW9uIG11c3QgYmUgYSBwb2ludGVyIHRvIG5vbi0lc2VsZWN0e2NvbnN0fGNvbnN0YW50fTAgX0F0b21pYyB0eXBlICglMSBpbnZhbGlkKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0b21pY19vcF9uZWVkc19ub25fY29uc3RfcG9pbnRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhZGRyZXNzIGFyZ3VtZW50IHRvIGF0b21pYyBvcGVyYXRpb24gbXVzdCBiZSBhIHBvaW50ZXIgdG8gbm9uLWNvbnN0IHR5cGUgKCUwIGludmFsaWQpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXRvbWljX29wX25lZWRzX3RyaXZpYWxfY29weSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhZGRyZXNzIGFyZ3VtZW50IHRvIGF0b21pYyBvcGVyYXRpb24gbXVzdCBiZSBhIHBvaW50ZXIgdG8gYSB0cml2aWFsbHktY29weWFibGUgdHlwZSAoJTAgaW52YWxpZCkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdG9taWNfcHJvcGVydHlfbm9udHJpdmlhbF9hc3NpZ25fb3AsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXRvbWljIHByb3BlcnR5IG9mIHJlZmVyZW5jZSB0eXBlICUwIGNhbm5vdCBoYXZlIG5vbi10cml2aWFsIGFzc2lnbm1lbnQgb3BlcmF0b3IiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdG9taWNfc3BlY2lmaWVyX2JhZF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIl9BdG9taWMgY2Fubm90IGJlIGFwcGxpZWQgdG8gJXNlbGVjdHtpbmNvbXBsZXRlIHxhcnJheSB8ZnVuY3Rpb24gfHJlZmVyZW5jZSB8YXRvbWljIHxxdWFsaWZpZWQgfH0wdHlwZSAlMSAlc2VsZWN0e3x8fHx8fHdoaWNoIGlzIG5vdCB0cml2aWFsbHkgY29weWFibGV9MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJfY29uZF9uZXZlcl9jb25zdGFudF9leHByLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGF0dHJpYnV0ZSBleHByZXNzaW9uIG5ldmVyIHByb2R1Y2VzIGEgY29uc3RhbnQgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJfb2JqY19vd25lcnNoaXBfcmVkdW5kYW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRoZSB0eXBlICUwIGlzIGFscmVhZHkgZXhwbGljaXRseSBvd25lcnNoaXAtcXVhbGlmaWVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cl90bHNtb2RlbF9hcmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGxzX21vZGVsIG11c3QgYmUgXCJnbG9iYWwtZHluYW1pY1wiLCBcImxvY2FsLWR5bmFtaWNcIiwgXCJpbml0aWFsLWV4ZWNcIiBvciBcImxvY2FsLWV4ZWNcIiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9hZGRyZXNzX2Z1bmN0aW9uX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZnVuY3Rpb24gdHlwZSBtYXkgbm90IGJlIHF1YWxpZmllZCB3aXRoIGFuIGFkZHJlc3Mgc3BhY2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdHRyaWJ1dGVfYWRkcmVzc19tdWx0aXBsZV9xdWFsaWZpZXJzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm11bHRpcGxlIGFkZHJlc3Mgc3BhY2VzIHNwZWNpZmllZCBmb3IgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9hZGRyZXNzX3NwYWNlX25lZ2F0aXZlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFkZHJlc3Mgc3BhY2UgaXMgbmVnYXRpdmUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdHRyaWJ1dGVfYWRkcmVzc19zcGFjZV90b29faGlnaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhZGRyZXNzIHNwYWNlIGlzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCAoJTApIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX2FsaWduZWRfdG9vX2dyZWF0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlcXVlc3RlZCBhbGlnbm1lbnQgbXVzdCBiZSAlMCBieXRlcyBvciBzbWFsbGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX2FyZ3VtZW50X2ludmFsaWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgYXR0cmlidXRlIGFyZ3VtZW50IGlzIGludmFsaWQ6ICVzZWxlY3R7bWF4IG11c3QgYmUgMCBzaW5jZSBtaW4gaXMgMHxtaW4gbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIG1heH0xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX2FyZ3VtZW50X2lzX3plcm8sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgYXR0cmlidXRlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdHRyaWJ1dGVfYXJndW1lbnRfbl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGF0dHJpYnV0ZSByZXF1aXJlcyBwYXJhbWV0ZXIgJTEgdG8gYmUgJXNlbGVjdHtpbnQgb3IgYm9vbHxhbiBpbnRlZ2VyIGNvbnN0YW50fGEgc3RyaW5nfGFuIGlkZW50aWZpZXJ9MiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9hcmd1bWVudF9vdXRfb2ZfYm91bmRzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGF0dHJpYnV0ZSBwYXJhbWV0ZXIgJTEgaXMgb3V0IG9mIGJvdW5kcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9hcmd1bWVudF9vdXRfb2ZfcmFuZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgYXR0cmlidXRlIHBhcmFtZXRlciAlMSBpcyBvdXQgb2YgYm91bmRzOiAlcGx1cmFsezA6bm8gcGFyYW1ldGVycyB0byBpbmRleCBpbnRvfDE6Y2FuIG9ubHkgYmUgMSwgc2luY2UgdGhlcmUgaXMgb25lIHBhcmFtZXRlcnw6bXVzdCBiZSBiZXR3ZWVuIDEgYW5kICUyfTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdHRyaWJ1dGVfYXJndW1lbnRfb3V0b2ZfcmFuZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgYXR0cmlidXRlIHJlcXVpcmVzIGludGVnZXIgY29uc3RhbnQgYmV0d2VlbiAlMSBhbmQgJTIgaW5jbHVzaXZlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX2FyZ3VtZW50X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgYXR0cmlidXRlIHJlcXVpcmVzICVzZWxlY3R7aW50IG9yIGJvb2x8YW4gaW50ZWdlciBjb25zdGFudHxhIHN0cmluZ3xhbiBpZGVudGlmaWVyfTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdHRyaWJ1dGVfYXJndW1lbnRfdmVjX3R5cGVfaGludCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIGF0dHJpYnV0ZSBhcmd1bWVudCAlMCAtIGV4cGVjdGluZyBhIHZlY3RvciBvciB2ZWN0b3JpemFibGUgc2NhbGFyIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdHRyaWJ1dGVfYmFkX25lb25fdmVjdG9yX3NpemUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiTmVvbiB2ZWN0b3Igc2l6ZSBtdXN0IGJlIDY0IG9yIDEyOCBiaXRzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX2NsZWFudXBfYXJnX25vdF9mdW5jdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInY2xlYW51cCcgYXJndW1lbnQgJXNlbGVjdHt8JTEgfCUxIH0waXMgbm90IGEgJXNlbGVjdHt8fHNpbmdsZSB9MGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX2NsZWFudXBfZnVuY19hcmdfaW5jb21wYXRpYmxlX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ2NsZWFudXAnIGZ1bmN0aW9uICUwIHBhcmFtZXRlciBoYXMgJWRpZmZ7dHlwZSAkIHdoaWNoIGlzIGluY29tcGF0aWJsZSB3aXRoIHR5cGUgJHxpbmNvbXBhdGlibGUgdHlwZX0xLDIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdHRyaWJ1dGVfY2xlYW51cF9mdW5jX211c3RfdGFrZV9vbmVfYXJnLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidjbGVhbnVwJyBmdW5jdGlvbiAlMCBtdXN0IHRha2UgMSBwYXJhbWV0ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdHRyaWJ1dGVfZGxsX2FtYmlndW91c19kZWZhdWx0X2N0b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ19fZGVjbHNwZWMoZGxsZXhwb3J0KScgY2Fubm90IGJlIGFwcGxpZWQgdG8gbW9yZSB0aGFuIG9uZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGluICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX2RsbF9kZWxldGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImF0dHJpYnV0ZSAlcTAgY2Fubm90IGJlIGFwcGxpZWQgdG8gYSBkZWxldGVkIGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX2RsbF9sYW1iZGEsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibGFtYmRhIGNhbm5vdCBiZSBkZWNsYXJlZCAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9kbGxfbWVtYmVyX29mX2RsbF9jbGFzcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhdHRyaWJ1dGUgJXEwIGNhbm5vdCBiZSBhcHBsaWVkIHRvIG1lbWJlciBvZiAlcTEgY2xhc3MiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdHRyaWJ1dGVfZGxsX25vdF9leHRlcm4sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXEwIG11c3QgaGF2ZSBleHRlcm5hbCBsaW5rYWdlIHdoZW4gZGVjbGFyZWQgJXExIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX2RsbF9yZWRlY2xhcmF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZGVjbGFyYXRpb24gb2YgJXEwIGNhbm5vdCBhZGQgJXExIGF0dHJpYnV0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9kbGxfdGhyZWFkX2xvY2FsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVxMCBjYW5ub3QgYmUgdGhyZWFkIGxvY2FsIHdoZW4gZGVjbGFyZWQgJXExIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX2RsbGltcG9ydF9kYXRhX2RlZmluaXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVmaW5pdGlvbiBvZiBkbGxpbXBvcnQgZGF0YSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9kbGxpbXBvcnRfZnVuY3Rpb25fZGVmaW5pdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkbGxpbXBvcnQgY2Fubm90IGJlIGFwcGxpZWQgdG8gbm9uLWlubGluZSBmdW5jdGlvbiBkZWZpbml0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX2RsbGltcG9ydF9zdGF0aWNfZmllbGRfZGVmaW5pdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWZpbml0aW9uIG9mIGRsbGltcG9ydCBzdGF0aWMgZmllbGQgbm90IGFsbG93ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdHRyaWJ1dGVfaW50ZWdlcnNfb25seSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBhdHRyaWJ1dGUgYXJndW1lbnQgbWF5IG9ubHkgcmVmZXIgdG8gYSBmdW5jdGlvbiBwYXJhbWV0ZXIgb2YgaW50ZWdlciB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX2ludmFsaWRfaW1wbGljaXRfdGhpc19hcmd1bWVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBhdHRyaWJ1dGUgaXMgaW52YWxpZCBmb3IgdGhlIGltcGxpY2l0IHRoaXMgYXJndW1lbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdHRyaWJ1dGVfaW52YWxpZF9zaXplLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInZlY3RvciBzaXplIG5vdCBhbiBpbnRlZ3JhbCBtdWx0aXBsZSBvZiBjb21wb25lbnQgc2l6ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9pbnZhbGlkX3ZlY3Rvcl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgdmVjdG9yIGVsZW1lbnQgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9tdWx0aXBsZV9vYmpjX2djLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm11bHRpcGxlIGdhcmJhZ2UgY29sbGVjdGlvbiBhdHRyaWJ1dGVzIHNwZWNpZmllZCBmb3IgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9ub19tZW1iZXJfcG9pbnRlcnMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgYXR0cmlidXRlIGNhbm5vdCBiZSB1c2VkIHdpdGggcG9pbnRlcnMgdG8gbWVtYmVycyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9ub3Rfc3VwcG9ydGVkX2luX2xhbmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgYXR0cmlidXRlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gJXNlbGVjdHtDfEMrK3xPYmplY3RpdmUtQ30xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX25vdF9zdXBwb3J0ZWRfb25fYXJjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZCBvbiAnJTEnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX29ubHlfb25jZV9wZXJfcGFyYW1ldGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGF0dHJpYnV0ZSBjYW4gb25seSBiZSBhcHBsaWVkIG9uY2UgcGVyIHBhcmFtZXRlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9vdmVybG9hZGFibGVfbWlzbWF0Y2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVkZWNsYXJhdGlvbiBvZiAlMCBtdXN0ICVzZWxlY3R7bm90IHx9MWhhdmUgdGhlICdvdmVybG9hZGFibGUnIGF0dHJpYnV0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9vdmVybG9hZGFibGVfbXVsdGlwbGVfdW5tYXJrZWRfb3ZlcmxvYWRzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImF0IG1vc3Qgb25lIG92ZXJsb2FkIGZvciBhIGdpdmVuIG5hbWUgbWF5IGxhY2sgdGhlICdvdmVybG9hZGFibGUnIGF0dHJpYnV0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9vdmVybG9hZGFibGVfbm9fcHJvdG90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidvdmVybG9hZGFibGUnIGZ1bmN0aW9uICUwIG11c3QgaGF2ZSBhIHByb3RvdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9wb2ludGVyc19vbmx5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8lc2VsZWN0e3wgY29uc3RhbnR9MSBwb2ludGVyIGFyZ3VtZW50cyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9yZWdwYXJtX2ludmFsaWRfbnVtYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidyZWdwYXJtJyBwYXJhbWV0ZXIgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICUwIGluY2x1c2l2ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9yZWdwYXJtX3dyb25nX3BsYXRmb3JtLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidyZWdwYXJtJyBpcyBub3QgdmFsaWQgb24gdGhpcyBwbGF0Zm9ybSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9yZXF1aXJlc19vcGVuY2xfdmVyc2lvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBhdHRyaWJ1dGUgcmVxdWlyZXMgT3BlbkNMIHZlcnNpb24gJTElc2VsZWN0e3wgb3IgYWJvdmV9MiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9yZXF1aXJlc19wb3NpdGl2ZV9pbnRlZ2VyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGF0dHJpYnV0ZSByZXF1aXJlcyBhIHBvc2l0aXZlIGludGVncmFsIGNvbXBpbGUgdGltZSBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX3NlY3Rpb25faW52YWxpZF9mb3JfdGFyZ2V0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFyZ3VtZW50IHRvICdzZWN0aW9uJyBhdHRyaWJ1dGUgaXMgbm90IHZhbGlkIGZvciB0aGlzIHRhcmdldDogJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdHRyaWJ1dGVfc2VsZWN0YW55X25vbl9leHRlcm5fZGF0YSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInc2VsZWN0YW55JyBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGRhdGEgaXRlbXMgd2l0aCBleHRlcm5hbCBsaW5rYWdlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX3NlbnRpbmVsX2xlc3NfdGhhbl96ZXJvLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidzZW50aW5lbCcgcGFyYW1ldGVyIDEgbGVzcyB0aGFuIHplcm8iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdHRyaWJ1dGVfc2VudGluZWxfbm90X3plcm9fb3Jfb25lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidzZW50aW5lbCcgcGFyYW1ldGVyIDIgbm90IDAgb3IgMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV9zaXplX3Rvb19sYXJnZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2ZWN0b3Igc2l6ZSB0b28gbGFyZ2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdHRyaWJ1dGVfdG9vX2Zld19hcmd1bWVudHMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgYXR0cmlidXRlIHRha2VzIGF0IGxlYXN0ICUxIGFyZ3VtZW50JXMxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX3Rvb19tYW55X2FyZ3VtZW50cywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBhdHRyaWJ1dGUgdGFrZXMgbm8gbW9yZSB0aGFuICUxIGFyZ3VtZW50JXMxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX3Vuc3VwcG9ydGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHRhcmdldCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV91dWlkX21hbGZvcm1lZF9ndWlkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInV1aWQgYXR0cmlidXRlIGNvbnRhaW5zIGEgbWFsZm9ybWVkIEdVSUQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdHRyaWJ1dGVfdmVjcmV0dXJuX29ubHlfcG9kX3JlY29yZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aGUgdmVjcmV0dXJuIGF0dHJpYnV0ZSBjYW4gb25seSBiZSB1c2VkIG9uIGEgUE9EIChwbGFpbiBvbGQgZGF0YSkgY2xhc3Mgb3Igc3RydWN0dXJlIChpLmUuIG5vIHZpcnR1YWwgZnVuY3Rpb25zKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV92ZWNyZXR1cm5fb25seV92ZWN0b3JfbWVtYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRoZSB2ZWNyZXR1cm4gYXR0cmlidXRlIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBjbGFzcyBvciBzdHJ1Y3R1cmUgd2l0aCBvbmUgbWVtYmVyLCB3aGljaCBtdXN0IGJlIGEgdmVjdG9yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX3dlYWtfc3RhdGljLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIndlYWsgZGVjbGFyYXRpb24gY2Fubm90IGhhdmUgaW50ZXJuYWwgbGlua2FnZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV93ZWFrcmVmX25vdF9nbG9iYWxfY29udGV4dCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ3ZWFrcmVmIGRlY2xhcmF0aW9uIG9mICUwIG11c3QgYmUgaW4gYSBnbG9iYWwgY29udGV4dCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV93ZWFrcmVmX25vdF9zdGF0aWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAid2Vha3JlZiBkZWNsYXJhdGlvbiBtdXN0IGhhdmUgaW50ZXJuYWwgbGlua2FnZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV93ZWFrcmVmX3dpdGhvdXRfYWxpYXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAid2Vha3JlZiBkZWNsYXJhdGlvbiBvZiAlMCBtdXN0IGFsc28gaGF2ZSBhbiBhbGlhcyBhdHRyaWJ1dGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gJXNlbGVjdHtmdW5jdGlvbnN8dW5pb25zfHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zfGZ1bmN0aW9ucyBhbmQgbWV0aG9kc3xmdW5jdGlvbnMsIG1ldGhvZHMgYW5kIGJsb2Nrc3xmdW5jdGlvbnMsIG1ldGhvZHMsIGFuZCBwYXJhbWV0ZXJzfHZhcmlhYmxlc3x2YXJpYWJsZXMgYW5kIGZpZWxkc3x2YXJpYWJsZXMsIGRhdGEgbWVtYmVycyBhbmQgdGFnIHR5cGVzfHR5cGVzIGFuZCBuYW1lc3BhY2VzfHZhcmlhYmxlcywgZnVuY3Rpb25zIGFuZCBjbGFzc2VzfGtlcm5lbCBmdW5jdGlvbnN8bm9uLUsmUi1zdHlsZSBmdW5jdGlvbnN8dmFyaWFibGVzLCBmdW5jdGlvbnMsIG1ldGhvZHMsIHR5cGVzLCBlbnVtZXJhdGlvbnMsIGVudW1lcmF0b3JzLCBsYWJlbHMsIGFuZCBub24tc3RhdGljIGRhdGEgbWVtYmVyc30xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F0dHJpYnV0ZV93cm9uZ19udW1iZXJfYXJndW1lbnRzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGF0dHJpYnV0ZSAlcGx1cmFsezA6dGFrZXMgbm8gYXJndW1lbnRzfDE6dGFrZXMgb25lIGFyZ3VtZW50fDpyZXF1aXJlcyBleGFjdGx5ICUxIGFyZ3VtZW50c30xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlX3plcm9fc2l6ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ6ZXJvIHZlY3RvciBzaXplIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXR0cmlidXRlc19hcmVfbm90X2NvbXBhdGlibGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgYW5kICUxIGF0dHJpYnV0ZXMgYXJlIG5vdCBjb21wYXRpYmxlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXV0b19iaXRmaWVsZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgcGFzcyBiaXQtZmllbGQgYXMgX19hdXRvX3R5cGUgaW5pdGlhbGl6ZXIgaW4gQyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F1dG9fZGlmZmVyZW50X2RlZHVjdGlvbnMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHsnYXV0byd8J2RlY2x0eXBlKGF1dG8pJ3wnX19hdXRvX3R5cGUnfHRlbXBsYXRlIGFyZ3VtZW50c30wIGRlZHVjZWQgYXMgJTEgaW4gZGVjbGFyYXRpb24gb2YgJTIgYW5kIGRlZHVjZWQgYXMgJTMgaW4gZGVjbGFyYXRpb24gb2YgJTQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdXRvX2ZuX2RlZHVjdGlvbl9mYWlsdXJlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBkZWR1Y2UgcmV0dXJuIHR5cGUgJTAgZnJvbSByZXR1cm5lZCB2YWx1ZSBvZiB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXV0b19mbl9kaWZmZXJlbnRfZGVkdWN0aW9ucywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInJXNlbGVjdHthdXRvfGRlY2x0eXBlKGF1dG8pfTAnIGluIHJldHVybiB0eXBlIGRlZHVjZWQgYXMgJTEgaGVyZSBidXQgZGVkdWNlZCBhcyAlMiBpbiBlYXJsaWVyIHJldHVybiBzdGF0ZW1lbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdXRvX2ZuX25vX3JldHVybl9idXRfbm90X2F1dG8sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGRlZHVjZSByZXR1cm4gdHlwZSAlMCBmb3IgZnVuY3Rpb24gd2l0aCBubyByZXR1cm4gc3RhdGVtZW50cyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F1dG9fZm5fcmV0dXJuX2luaXRfbGlzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZGVkdWNlIHJldHVybiB0eXBlIGZyb20gaW5pdGlhbGl6ZXIgbGlzdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F1dG9fZm5fcmV0dXJuX3ZvaWRfYnV0X25vdF9hdXRvLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBkZWR1Y2UgcmV0dXJuIHR5cGUgJTAgZnJvbSBvbWl0dGVkIHJldHVybiBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXV0b19mbl91c2VkX2JlZm9yZV9kZWZpbmVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZ1bmN0aW9uICUwIHdpdGggZGVkdWNlZCByZXR1cm4gdHlwZSBjYW5ub3QgYmUgdXNlZCBiZWZvcmUgaXQgaXMgZGVmaW5lZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F1dG9fZm5fdmlydHVhbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmdW5jdGlvbiB3aXRoIGRlZHVjZWQgcmV0dXJuIHR5cGUgY2Fubm90IGJlIHZpcnR1YWwiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdXRvX2luY29uc2lzdGVudF9kZWR1Y3Rpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVkdWNlZCBjb25mbGljdGluZyB0eXBlcyAlZGlmZnsoJCB2cyAkKSB8fTAsMWZvciBpbml0aWFsaXplciBsaXN0IGVsZW1lbnQgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F1dG9faW5pdF9saXN0X2Zyb21fYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgdXNlIF9fYXV0b190eXBlIHdpdGggaW5pdGlhbGl6ZXIgbGlzdCBpbiBDIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXV0b19taXNzaW5nX3RyYWlsaW5nX3JldHVybiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInYXV0bycgcmV0dXJuIHdpdGhvdXQgdHJhaWxpbmcgcmV0dXJuIHR5cGU7IGRlZHVjZWQgcmV0dXJuIHR5cGVzIGFyZSBhIEMrKzE0IGV4dGVuc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F1dG9fbmV3X2N0b3JfbXVsdGlwbGVfZXhwcmVzc2lvbnMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibmV3IGV4cHJlc3Npb24gZm9yIHR5cGUgJTAgY29udGFpbnMgbXVsdGlwbGUgY29uc3RydWN0b3IgYXJndW1lbnRzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXV0b19uZXdfZGVkdWN0aW9uX2ZhaWx1cmUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibmV3IGV4cHJlc3Npb24gZm9yIHR5cGUgJTAgaGFzIGluY29tcGF0aWJsZSBjb25zdHJ1Y3RvciBhcmd1bWVudCBvZiB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXV0b19uZXdfcmVxdWlyZXNfY3Rvcl9hcmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibmV3IGV4cHJlc3Npb24gZm9yIHR5cGUgJTAgcmVxdWlyZXMgYSBjb25zdHJ1Y3RvciBhcmd1bWVudCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F1dG9fbm9uX2RlZHVjZWRfbm90X2Fsb25lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7ZnVuY3Rpb24gd2l0aCBkZWR1Y2VkIHJldHVybiB0eXBlfGRlY2xhcmF0aW9uIHdpdGggdHJhaWxpbmcgcmV0dXJuIHR5cGV9MCBtdXN0IGJlIHRoZSBvbmx5IGRlY2xhcmF0aW9uIGluIGl0cyBncm91cCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F1dG9fbm90X2FsbG93ZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHsnYXV0byd8J2RlY2x0eXBlKGF1dG8pJ3wnX19hdXRvX3R5cGUnfHVzZSBvZiAlc2VsZWN0e2NsYXNzIHRlbXBsYXRlfGZ1bmN0aW9uIHRlbXBsYXRlfHZhcmlhYmxlIHRlbXBsYXRlfGFsaWFzIHRlbXBsYXRlfHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlcnx0ZW1wbGF0ZX0yICUzIHJlcXVpcmVzIHRlbXBsYXRlIGFyZ3VtZW50czsgYXJndW1lbnQgZGVkdWN0aW9ufTAgbm90IGFsbG93ZWQgJXNlbGVjdHtpbiBmdW5jdGlvbiBwcm90b3R5cGV8aW4gbm9uLXN0YXRpYyBzdHJ1Y3QgbWVtYmVyfGluIHN0cnVjdCBtZW1iZXJ8aW4gbm9uLXN0YXRpYyB1bmlvbiBtZW1iZXJ8aW4gdW5pb24gbWVtYmVyfGluIG5vbi1zdGF0aWMgY2xhc3MgbWVtYmVyfGluIGludGVyZmFjZSBtZW1iZXJ8aW4gZXhjZXB0aW9uIGRlY2xhcmF0aW9ufGluIHRlbXBsYXRlIHBhcmFtZXRlciB1bnRpbCBDKysxN3xpbiBibG9jayBsaXRlcmFsfGluIHRlbXBsYXRlIGFyZ3VtZW50fGluIHR5cGVkZWZ8aW4gdHlwZSBhbGlhc3xpbiBmdW5jdGlvbiByZXR1cm4gdHlwZXxpbiBjb252ZXJzaW9uIGZ1bmN0aW9uIHR5cGV8aGVyZXxpbiBsYW1iZGEgcGFyYW1ldGVyfGluIHR5cGUgYWxsb2NhdGVkIGJ5ICduZXcnfGluIEsmUi1zdHlsZSBmdW5jdGlvbiBwYXJhbWV0ZXJ8aW4gdGVtcGxhdGUgcGFyYW1ldGVyfGluIGZyaWVuZCBkZWNsYXJhdGlvbn0xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXV0b19ub3RfYWxsb3dlZF92YXJfaW5zdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInYXV0bycgdmFyaWFibGUgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBpcyBub3QgYWxsb3dlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F1dG9fdmFyX2RlZHVjdGlvbl9mYWlsdXJlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInZhcmlhYmxlICUwIHdpdGggdHlwZSAlMSBoYXMgaW5jb21wYXRpYmxlIGluaXRpYWxpemVyIG9mIHR5cGUgJTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdXRvX3Zhcl9kZWR1Y3Rpb25fZmFpbHVyZV9mcm9tX2luaXRfbGlzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZGVkdWNlIGFjdHVhbCB0eXBlIGZvciB2YXJpYWJsZSAlMCB3aXRoIHR5cGUgJTEgZnJvbSBpbml0aWFsaXplciBsaXN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXV0b192YXJfaW5pdF9tdWx0aXBsZV9leHByZXNzaW9ucywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbml0aWFsaXplciBmb3IgdmFyaWFibGUgJTAgd2l0aCB0eXBlICUxIGNvbnRhaW5zIG11bHRpcGxlIGV4cHJlc3Npb25zIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXV0b192YXJfaW5pdF9ub19leHByZXNzaW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluaXRpYWxpemVyIGZvciB2YXJpYWJsZSAlMCB3aXRoIHR5cGUgJTEgaXMgZW1wdHkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9hdXRvX3Zhcl9pbml0X3BhcmVuX2JyYWNlcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZGVkdWNlIHR5cGUgZm9yIHZhcmlhYmxlICUxIHdpdGggdHlwZSAlMiBmcm9tICVzZWxlY3R7cGFyZW50aGVzaXplZHxuZXN0ZWR9MCBpbml0aWFsaXplciBsaXN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXV0b192YXJfcmVxdWlyZXNfaW5pdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWNsYXJhdGlvbiBvZiB2YXJpYWJsZSAlMCB3aXRoIGRlZHVjZWQgdHlwZSAlMSByZXF1aXJlcyBhbiBpbml0aWFsaXplciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2F1dG9fdmFyaWFibGVfY2Fubm90X2FwcGVhcl9pbl9vd25faW5pdGlhbGl6ZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFyaWFibGUgJTAgZGVjbGFyZWQgd2l0aCBkZWR1Y2VkIHR5cGUgJTEgY2Fubm90IGFwcGVhciBpbiBpdHMgb3duIGluaXRpYWxpemVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYXdhaXRfc3VzcGVuZF9pbnZhbGlkX3JldHVybl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJldHVybiB0eXBlIG9mICdhd2FpdF9zdXNwZW5kJyBpcyByZXF1aXJlZCB0byBiZSAndm9pZCcgb3IgJ2Jvb2wnIChoYXZlICUwKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTQpCitESUFHKGVycl9iYWRfY2F0ZWdvcnlfcHJvcGVydHlfZGVjbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwcm9wZXJ0eSBpbXBsZW1lbnRhdGlvbiBtdXN0IGhhdmUgaXRzIGRlY2xhcmF0aW9uIGluIHRoZSBjYXRlZ29yeSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2JhZF9jb25zdF9jYXN0X2Rlc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtjb25zdF9jYXN0fHx8fEMtc3R5bGUgY2FzdHxmdW5jdGlvbmFsLXN0eWxlIGNhc3R9MCB0byAlMiwgd2hpY2ggaXMgbm90IGEgcmVmZXJlbmNlLCBwb2ludGVyLXRvLW9iamVjdCwgb3IgcG9pbnRlci10by1kYXRhLW1lbWJlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2JhZF9jc3R5bGVfY2FzdF9vdmVybG9hZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhZGRyZXNzIG9mIG92ZXJsb2FkZWQgZnVuY3Rpb24gJTAgY2Fubm90IGJlIGNhc3QgdG8gdHlwZSAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2JhZF9jeHhfY2FzdF9iaXRmaWVsZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2NvbnN0X2Nhc3R8c3RhdGljX2Nhc3R8cmVpbnRlcnByZXRfY2FzdHxkeW5hbWljX2Nhc3R8Qy1zdHlsZSBjYXN0fGZ1bmN0aW9uYWwtc3R5bGUgY2FzdH0wIGZyb20gYml0LWZpZWxkIGx2YWx1ZSB0byByZWZlcmVuY2UgdHlwZSAlMiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2JhZF9jeHhfY2FzdF9nZW5lcmljLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7Y29uc3RfY2FzdHxzdGF0aWNfY2FzdHxyZWludGVycHJldF9jYXN0fGR5bmFtaWNfY2FzdHxDLXN0eWxlIGNhc3R8ZnVuY3Rpb25hbC1zdHlsZSBjYXN0fTAgZnJvbSAlMSB0byAlMiBpcyBub3QgYWxsb3dlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2JhZF9jeHhfY2FzdF9tZW1iZXJfcG9pbnRlcl9zaXplLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCAlc2VsZWN0e3x8cmVpbnRlcnByZXRfY2FzdHx8Qy1zdHlsZSBjYXN0fH0wIGZyb20gbWVtYmVyIHBvaW50ZXIgdHlwZSAlMSB0byBtZW1iZXIgcG9pbnRlciB0eXBlICUyIG9mIGRpZmZlcmVudCBzaXplIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYmFkX2N4eF9jYXN0X3F1YWxpZmllcnNfYXdheSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2NvbnN0X2Nhc3R8c3RhdGljX2Nhc3R8cmVpbnRlcnByZXRfY2FzdHxkeW5hbWljX2Nhc3R8Qy1zdHlsZSBjYXN0fGZ1bmN0aW9uYWwtc3R5bGUgY2FzdH0wIGZyb20gJTEgdG8gJTIgY2FzdHMgYXdheSBxdWFsaWZpZXJzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYmFkX2N4eF9jYXN0X3J2YWx1ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2NvbnN0X2Nhc3R8c3RhdGljX2Nhc3R8cmVpbnRlcnByZXRfY2FzdHxkeW5hbWljX2Nhc3R8Qy1zdHlsZSBjYXN0fGZ1bmN0aW9uYWwtc3R5bGUgY2FzdH0wIGZyb20gcnZhbHVlIHRvIHJlZmVyZW5jZSB0eXBlICUyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYmFkX2N4eF9jYXN0X3NjYWxhcl90b192ZWN0b3JfZGlmZmVyZW50X3NpemUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHt8fHJlaW50ZXJwcmV0X2Nhc3R8fEMtc3R5bGUgY2FzdHx9MCBmcm9tIHNjYWxhciAlMSB0byB2ZWN0b3IgJTIgb2YgZGlmZmVyZW50IHNpemUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9iYWRfY3h4X2Nhc3RfdW5yZWxhdGVkX2NsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7Y29uc3RfY2FzdHxzdGF0aWNfY2FzdHxyZWludGVycHJldF9jYXN0fGR5bmFtaWNfY2FzdHxDLXN0eWxlIGNhc3R8ZnVuY3Rpb25hbC1zdHlsZSBjYXN0fTAgZnJvbSAlMSB0byAlMiwgd2hpY2ggYXJlIG5vdCByZWxhdGVkIGJ5IGluaGVyaXRhbmNlLCBpcyBub3QgYWxsb3dlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2JhZF9jeHhfY2FzdF92ZWN0b3JfdG9fc2NhbGFyX2RpZmZlcmVudF9zaXplLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7fHxyZWludGVycHJldF9jYXN0fHxDLXN0eWxlIGNhc3R8fTAgZnJvbSB2ZWN0b3IgJTEgdG8gc2NhbGFyICUyIG9mIGRpZmZlcmVudCBzaXplIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYmFkX2N4eF9jYXN0X3ZlY3Rvcl90b192ZWN0b3JfZGlmZmVyZW50X3NpemUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHt8fHJlaW50ZXJwcmV0X2Nhc3R8fEMtc3R5bGUgY2FzdHx9MCBmcm9tIHZlY3RvciAlMSB0byB2ZWN0b3IgJTIgb2YgZGlmZmVyZW50IHNpemUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9iYWRfZHluYW1pY19jYXN0X2luY29tcGxldGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgaXMgYW4gaW5jb21wbGV0ZSB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYmFkX2R5bmFtaWNfY2FzdF9ub3RfY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgaXMgbm90IGEgY2xhc3MiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9iYWRfZHluYW1pY19jYXN0X25vdF9wb2x5bW9ycGhpYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBpcyBub3QgcG9seW1vcnBoaWMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9iYWRfZHluYW1pY19jYXN0X25vdF9wdHIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgaXMgbm90IGEgcG9pbnRlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2JhZF9keW5hbWljX2Nhc3Rfbm90X3JlZl9vcl9wdHIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgaXMgbm90IGEgcmVmZXJlbmNlIG9yIHBvaW50ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9iYWRfa2VybmVsX3BhcmFtX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgY2Fubm90IGJlIHVzZWQgYXMgdGhlIHR5cGUgb2YgYSBrZXJuZWwgcGFyYW1ldGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYmFkX2x2YWx1ZV90b19ydmFsdWVfY2FzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgY2FzdCBmcm9tIGx2YWx1ZSBvZiB0eXBlICUxIHRvIHJ2YWx1ZSByZWZlcmVuY2UgdHlwZSAlMjsgdHlwZXMgYXJlIG5vdCBjb21wYXRpYmxlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYmFkX21lbXB0cl9saHMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibGVmdCBoYW5kIG9wZXJhbmQgdG8gJTAgbXVzdCBiZSBhICVzZWxlY3R7fHBvaW50ZXIgdG8gfTFjbGFzcyBjb21wYXRpYmxlIHdpdGggdGhlIHJpZ2h0IGhhbmQgb3BlcmFuZCwgYnV0IGlzICUyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYmFkX21lbXB0cl9yaHMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmlnaHQgaGFuZCBvcGVyYW5kIHRvICUwIGhhcyBub24tcG9pbnRlci10by1tZW1iZXIgdHlwZSAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2JhZF9tdWx0aXZlcnNpb25fb3B0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZ1bmN0aW9uIG11bHRpdmVyc2lvbmluZyBkb2Vzbid0IHN1cHBvcnQgJXNlbGVjdHtmZWF0dXJlfGFyY2hpdGVjdHVyZX0wICclMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9iYWRfbmV3X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGFsbG9jYXRlICVzZWxlY3R7ZnVuY3Rpb258cmVmZXJlbmNlfTEgdHlwZSAlMCB3aXRoIG5ldyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2JhZF9wYXJhbWV0ZXJfbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBjYW5ub3QgYmUgdGhlIG5hbWUgb2YgYSBwYXJhbWV0ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9iYWRfcHJvcGVydHlfY29udGV4dCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwcm9wZXJ0eSBpbXBsZW1lbnRhdGlvbiBtdXN0IGJlIGluIGEgY2xhc3Mgb3IgY2F0ZWdvcnkgaW1wbGVtZW50YXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9iYWRfcHJvcGVydHlfZGVjbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwcm9wZXJ0eSBpbXBsZW1lbnRhdGlvbiBtdXN0IGhhdmUgaXRzIGRlY2xhcmF0aW9uIGluIGludGVyZmFjZSAlMCBvciBvbmUgb2YgaXRzIGV4dGVuc2lvbnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9iYWRfcmVjZWl2ZXJfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJiYWQgcmVjZWl2ZXIgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2JhZF9yZWludGVycHJldF9jYXN0X292ZXJsb2FkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlaW50ZXJwcmV0X2Nhc3QgY2Fubm90IHJlc29sdmUgb3ZlcmxvYWRlZCBmdW5jdGlvbiAlMCB0byB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYmFkX3JlaW50ZXJwcmV0X2Nhc3RfcmVmZXJlbmNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlaW50ZXJwcmV0X2Nhc3Qgb2YgYSAlMCB0byAlMSBuZWVkcyBpdHMgYWRkcmVzcywgd2hpY2ggaXMgbm90IGFsbG93ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9iYWRfcmVpbnRlcnByZXRfY2FzdF9zbWFsbF9pbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2FzdCBmcm9tIHBvaW50ZXIgdG8gc21hbGxlciB0eXBlICUyIGxvc2VzIGluZm9ybWF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYmFkX3J2YWx1ZV90b19ydmFsdWVfY2FzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgY2FzdCBmcm9tIHJ2YWx1ZSBvZiB0eXBlICUxIHRvIHJ2YWx1ZSByZWZlcmVuY2UgdHlwZSAlMjsgdHlwZXMgYXJlIG5vdCBjb21wYXRpYmxlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYmFkX3N0YXRpY19jYXN0X21lbWJlcl9wb2ludGVyX25vbm1wLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBjYXN0IGZyb20gdHlwZSAlMSB0byBtZW1iZXIgcG9pbnRlciB0eXBlICUyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYmFkX3N0YXRpY19jYXN0X292ZXJsb2FkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFkZHJlc3Mgb2Ygb3ZlcmxvYWRlZCBmdW5jdGlvbiAlMCBjYW5ub3QgYmUgc3RhdGljX2Nhc3QgdG8gdHlwZSAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2JhZF9zdGF0aWNfY2FzdF9wb2ludGVyX25vbnBvaW50ZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGNhc3QgZnJvbSB0eXBlICUxIHRvIHBvaW50ZXIgdHlwZSAlMiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2JhZF92YXJpYWJsZV9uYW1lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGNhbm5vdCBiZSB0aGUgbmFtZSBvZiBhIHZhcmlhYmxlIG9yIGRhdGEgbWVtYmVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYmFzZV9jbGFzc19oYXNfZmxleGlibGVfYXJyYXlfbWVtYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImJhc2UgY2xhc3MgJTAgaGFzIGEgZmxleGlibGUgYXJyYXkgbWVtYmVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYmFzZV9jbGF1c2Vfb25fdW5pb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5pb25zIGNhbm5vdCBoYXZlIGJhc2UgY2xhc3NlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Jhc2VfaW5pdF9kaXJlY3RfYW5kX3ZpcnR1YWwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYmFzZSBjbGFzcyBpbml0aWFsaXplciAlMCBuYW1lcyBib3RoIGEgZGlyZWN0IGJhc2UgY2xhc3MgYW5kIGFuIGluaGVyaXRlZCB2aXJ0dWFsIGJhc2UgY2xhc3MiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9iYXNlX2luaXRfZG9lc19ub3RfbmFtZV9jbGFzcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb25zdHJ1Y3RvciBpbml0aWFsaXplciAlMCBkb2VzIG5vdCBuYW1lIGEgY2xhc3MiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9iYXNlX211c3RfYmVfY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYmFzZSBzcGVjaWZpZXIgbXVzdCBuYW1lIGEgY2xhc3MiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9iYXNlX3NwZWNpZmllcl9hdHRyaWJ1dGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgYXR0cmlidXRlIGNhbm5vdCBiZSBhcHBsaWVkIHRvIGEgYmFzZSBzcGVjaWZpZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9iaW5kaW5nX2Nhbm5vdF9hcHBlYXJfaW5fb3duX2luaXRpYWxpemVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImJpbmRpbmcgJTAgY2Fubm90IGFwcGVhciBpbiB0aGUgaW5pdGlhbGl6ZXIgb2YgaXRzIG93biBkZWNvbXBvc2l0aW9uIGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYml0ZmllbGRfaGFzX25lZ2F0aXZlX3dpZHRoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImJpdC1maWVsZCAlMCBoYXMgbmVnYXRpdmUgd2lkdGggKCUxKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2JpdGZpZWxkX2hhc196ZXJvX3dpZHRoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5hbWVkIGJpdC1maWVsZCAlMCBoYXMgemVybyB3aWR0aCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2JpdGZpZWxkX3dpZHRoX2V4Y2VlZHNfdHlwZV93aWR0aCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ3aWR0aCBvZiBiaXQtZmllbGQgJTAgKCUxIGJpdHMpIGV4Y2VlZHMgJXNlbGVjdHt3aWR0aHxzaXplfTIgb2YgaXRzIHR5cGUgKCUzIGJpdCVzMykiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ibG9ja19kZWNsX3JlZl9ub3RfbW9kaWZpYWJsZV9sdmFsdWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFyaWFibGUgaXMgbm90IGFzc2lnbmFibGUgKG1pc3NpbmcgX19ibG9jayB0eXBlIHNwZWNpZmllcikiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ibG9ja19leHRlcm5fY2FudF9pbml0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidleHRlcm4nIHZhcmlhYmxlIGNhbm5vdCBoYXZlIGFuIGluaXRpYWxpemVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYmxvY2tfb25fbm9ubG9jYWwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiX19ibG9jayBhdHRyaWJ1dGUgbm90IGFsbG93ZWQsIG9ubHkgYWxsb3dlZCBvbiBsb2NhbCB2YXJpYWJsZXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ibG9ja19vbl92bSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJfX2Jsb2NrIGF0dHJpYnV0ZSBub3QgYWxsb3dlZCBvbiBkZWNsYXJhdGlvbiB3aXRoIGEgdmFyaWFibHkgbW9kaWZpZWQgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Jsb2NrX3JldHVybl9taXNzaW5nX2V4cHIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm9uLXZvaWQgYmxvY2sgc2hvdWxkIHJldHVybiBhIHZhbHVlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYmxvY2tfcmV0dXJuaW5nX2FycmF5X2Z1bmN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImJsb2NrIGNhbm5vdCByZXR1cm4gJXNlbGVjdHthcnJheXxmdW5jdGlvbn0wIHR5cGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ibG9ja3NfZGlzYWJsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJibG9ja3Mgc3VwcG9ydCBkaXNhYmxlZCAtIGNvbXBpbGUgd2l0aCAtZmJsb2NrcyBvciAlc2VsZWN0e3BpY2sgYSBkZXBsb3ltZW50IHRhcmdldCB0aGF0IHN1cHBvcnRzIHRoZW18Zm9yIE9wZW5DTCAyLjAgb3IgYWJvdmV9MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2JvdW5kX21lbWJlcl9mdW5jdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZWZlcmVuY2UgdG8gbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQlc2VsZWN0e3w7IGRpZCB5b3UgbWVhbiB0byBjYWxsIGl0IHdpdGggbm8gYXJndW1lbnRzP30wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYm94X2xpdGVyYWxfY29sbGVjdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e3N0cmluZ3xjaGFyYWN0ZXJ8Ym9vbGVhbnxudW1lcmljfTAgbGl0ZXJhbCBtdXN0IGJlIHByZWZpeGVkIGJ5ICdAJyBpbiBhIGNvbGxlY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9icmVha19ub3RfaW5fbG9vcF9vcl9zd2l0Y2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ2JyZWFrJyBzdGF0ZW1lbnQgbm90IGluIGxvb3Agb3Igc3dpdGNoIHN0YXRlbWVudCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2J1aWx0aW5fYW5ub3RhdGlvbl9maXJzdF9hcmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZmlyc3QgYXJndW1lbnQgdG8gX19idWlsdGluX2Fubm90YXRpb24gbXVzdCBiZSBhbiBpbnRlZ2VyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYnVpbHRpbl9hbm5vdGF0aW9uX3NlY29uZF9hcmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic2Vjb25kIGFyZ3VtZW50IHRvIF9fYnVpbHRpbl9hbm5vdGF0aW9uIG11c3QgYmUgYSBub24td2lkZSBzdHJpbmcgY29uc3RhbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9idWlsdGluX2RlZmluaXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVmaW5pdGlvbiBvZiBidWlsdGluIGZ1bmN0aW9uICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYnVpbHRpbl9mbl91c2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYnVpbHRpbiBmdW5jdGlvbnMgbXVzdCBiZSBkaXJlY3RseSBjYWxsZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9idWlsdGluX2Z1bmNfY2FzdF9tb3JlX3RoYW5fb25lX2FyZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmdW5jdGlvbi1zdHlsZSBjYXN0IHRvIGEgYnVpbHRpbiB0eXBlIGNhbiBvbmx5IHRha2Ugb25lIGFyZ3VtZW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYnVpbHRpbl9sb25nam1wX2ludmFsaWRfdmFsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFyZ3VtZW50IHRvIF9fYnVpbHRpbl9sb25nam1wIG11c3QgYmUgYSBjb25zdGFudCAxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYnVpbHRpbl9sb25nam1wX3Vuc3VwcG9ydGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIl9fYnVpbHRpbl9sb25nam1wIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoZSBjdXJyZW50IHRhcmdldCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2J1aWx0aW5fbmVlZHNfZmVhdHVyZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBuZWVkcyB0YXJnZXQgZmVhdHVyZSAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2J1aWx0aW5fb3BlcmF0b3JfbmV3X2RlbGV0ZV9ub3RfdXN1YWwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2FsbCB0byAnJXNlbGVjdHtfX2J1aWx0aW5fb3BlcmF0b3JfbmV3fF9fYnVpbHRpbl9vcGVyYXRvcl9kZWxldGV9MCcgc2VsZWN0cyBub24tdXN1YWwgJXNlbGVjdHthbGxvY2F0aW9ufGRlYWxsb2NhdGlvbn0wIGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYnVpbHRpbl9yZXF1aXJlc19sYW5ndWFnZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInJTAnIGlzIG9ubHkgYXZhaWxhYmxlIGluICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYnVpbHRpbl9zZXRqbXBfdW5zdXBwb3J0ZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiX19idWlsdGluX3NldGptcCBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgY3VycmVudCB0YXJnZXQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9idWlsdGluX3g2NF9hYXJjaDY0X29ubHksIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhpcyBidWlsdGluIGlzIG9ubHkgYXZhaWxhYmxlIG9uIHg4Ni02NCBhbmQgYWFyY2g2NCB0YXJnZXRzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfYzk5X2FycmF5X3VzYWdlX2N4eCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e3F1YWxpZmllciBpbiB8c3RhdGljIHx9MGFycmF5IHNpemUgJXNlbGVjdHt8fCdbKl0gJ30waXMgYSBDOTkgZmVhdHVyZSwgbm90IHBlcm1pdHRlZCBpbiBDKysiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jYWxsX2Z1bmN0aW9uX2luY29tcGxldGVfcmV0dXJuLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbGxpbmcgJTAgd2l0aCBpbmNvbXBsZXRlIHJldHVybiB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY2FsbF9pbmNvbXBsZXRlX2FyZ3VtZW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFyZ3VtZW50IHR5cGUgJTAgaXMgaW5jb21wbGV0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NhbGxfaW5jb21wbGV0ZV9yZXR1cm4sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2FsbGluZyBmdW5jdGlvbiB3aXRoIGluY29tcGxldGUgcmV0dXJuIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jYW5ub3RfZmluZF9zdWl0YWJsZV9hY2Nlc3NvciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZmluZCBzdWl0YWJsZSAlc2VsZWN0e2dldHRlcnxzZXR0ZXJ9MCBmb3IgcHJvcGVydHkgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jYW5ub3RfZm9ybV9wb2ludGVyX3RvX21lbWJlcl9vZl9yZWZlcmVuY2VfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZm9ybSBhIHBvaW50ZXItdG8tbWVtYmVyIHRvIG1lbWJlciAlMCBvZiByZWZlcmVuY2UgdHlwZSAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Nhbm5vdF9wYXNzX25vbl90cml2aWFsX2Nfc3RydWN0X3RvX3ZhcmFyZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgcGFzcyBub24tdHJpdmlhbCBDIG9iamVjdCBvZiB0eXBlICUwIGJ5IHZhbHVlIHRvIHZhcmlhZGljICVzZWxlY3R7ZnVuY3Rpb258YmxvY2t8bWV0aG9kfGNvbnN0cnVjdG9yfTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jYW5ub3RfcGFzc19vYmpjX2ludGVyZmFjZV90b192YXJhcmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHBhc3Mgb2JqZWN0IHdpdGggaW50ZXJmYWNlIHR5cGUgJTAgYnkgdmFsdWUgdGhyb3VnaCB2YXJpYWRpYyAlc2VsZWN0e2Z1bmN0aW9ufGJsb2NrfG1ldGhvZHxjb25zdHJ1Y3Rvcn0xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY2Fubm90X3Bhc3Nfb2JqY19pbnRlcmZhY2VfdG9fdmFyYXJnX2Zvcm1hdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgcGFzcyBvYmplY3Qgd2l0aCBpbnRlcmZhY2UgdHlwZSAlMSBieSB2YWx1ZSB0byB2YXJpYWRpYyAlc2VsZWN0e2Z1bmN0aW9ufGJsb2NrfG1ldGhvZHxjb25zdHJ1Y3Rvcn0yOyBleHBlY3RlZCB0eXBlIGZyb20gZm9ybWF0IHN0cmluZyB3YXMgJTMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jYW5ub3RfcGFzc190b192YXJhcmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHBhc3MgJXNlbGVjdHtleHByZXNzaW9uIG9mIHR5cGUgJTF8aW5pdGlhbGl6ZXIgbGlzdH0wIHRvIHZhcmlhZGljICVzZWxlY3R7ZnVuY3Rpb258YmxvY2t8bWV0aG9kfGNvbnN0cnVjdG9yfTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jYW5ub3RfcGFzc190b192YXJhcmdfZm9ybWF0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBwYXNzICVzZWxlY3R7ZXhwcmVzc2lvbiBvZiB0eXBlICUxfGluaXRpYWxpemVyIGxpc3R9MCB0byB2YXJpYWRpYyAlc2VsZWN0e2Z1bmN0aW9ufGJsb2NrfG1ldGhvZHxjb25zdHJ1Y3Rvcn0yOyBleHBlY3RlZCB0eXBlIGZyb20gZm9ybWF0IHN0cmluZyB3YXMgJTMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jYXB0dXJlX2Jsb2NrX3ZhcmlhYmxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIl9fYmxvY2sgdmFyaWFibGUgJTAgY2Fubm90IGJlIGNhcHR1cmVkIGluIGEgJXNlbGVjdHtsYW1iZGEgZXhwcmVzc2lvbnxjYXB0dXJlZCBzdGF0ZW1lbnR9MSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NhcHR1cmVfZGVmYXVsdF9ub25fbG9jYWwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm9uLWxvY2FsIGxhbWJkYSBleHByZXNzaW9uIGNhbm5vdCBoYXZlIGEgY2FwdHVyZS1kZWZhdWx0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY2FwdHVyZV9kb2VzX25vdF9uYW1lX3ZhcmlhYmxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGluIGNhcHR1cmUgbGlzdCBkb2VzIG5vdCBuYW1lIGEgdmFyaWFibGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDMpCitESUFHKGVycl9jYXB0dXJlX21vcmVfdGhhbl9vbmNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGNhbiBhcHBlYXIgb25seSBvbmNlIGluIGEgY2FwdHVyZSBsaXN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAzKQorRElBRyhlcnJfY2FwdHVyZV9ub25fYXV0b21hdGljX3ZhcmlhYmxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGNhbm5vdCBiZSBjYXB0dXJlZCBiZWNhdXNlIGl0IGRvZXMgbm90IGhhdmUgYXV0b21hdGljIHN0b3JhZ2UgZHVyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDMpCitESUFHKGVycl9jYXB0dXJlX29mX2Fic3RyYWN0X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYnktY29weSBjYXB0dXJlIG9mIHZhbHVlIG9mIGFic3RyYWN0IHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jYXB0dXJlX29mX2luY29tcGxldGVfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJieS1jb3B5IGNhcHR1cmUgb2YgdmFyaWFibGUgJTAgd2l0aCBpbmNvbXBsZXRlIHR5cGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jYXJyaWVzX2RlcGVuZGVuY3lfbWlzc2luZ19vbl9maXJzdF9kZWNsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7ZnVuY3Rpb258cGFyYW1ldGVyfTAgZGVjbGFyZWQgJ1tbY2Fycmllc19kZXBlbmRlbmN5XV0nIGFmdGVyIGl0cyBmaXJzdCBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NhcnJpZXNfZGVwZW5kZW5jeV9wYXJhbV9ub3RfZnVuY3Rpb25fZGVjbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInW1tjYXJyaWVzX2RlcGVuZGVuY3ldXScgYXR0cmlidXRlIG9ubHkgYWxsb3dlZCBvbiBwYXJhbWV0ZXIgaW4gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBvciBsYW1iZGEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jYXNlX25vdF9pbl9zd2l0Y2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ2Nhc2UnIHN0YXRlbWVudCBub3QgaW4gc3dpdGNoIHN0YXRlbWVudCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Nhc3RfcG9pbnRlcl9mcm9tX25vbl9wb2ludGVyX2ludCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJvcGVyYW5kIG9mIHR5cGUgJTAgY2Fubm90IGJlIGNhc3QgdG8gYSBwb2ludGVyIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jYXN0X3BvaW50ZXJfdG9fbm9uX3BvaW50ZXJfaW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInBvaW50ZXIgY2Fubm90IGJlIGNhc3QgdG8gdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Nhc3Rfc2VsZWN0b3JfZXhwciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgdHlwZSBjYXN0IEBzZWxlY3RvciBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY2F0Y2hfaW5jb21wbGV0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgY2F0Y2ggaW5jb21wbGV0ZSB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY2F0Y2hfaW5jb21wbGV0ZV9wdHIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGNhdGNoIHBvaW50ZXIgdG8gaW5jb21wbGV0ZSB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY2F0Y2hfaW5jb21wbGV0ZV9yZWYsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGNhdGNoIHJlZmVyZW5jZSB0byBpbmNvbXBsZXRlIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jYXRjaF9wYXJhbV9ub3Rfb2JqY190eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIkBjYXRjaCBwYXJhbWV0ZXIgaXMgbm90IGEgcG9pbnRlciB0byBhbiBpbnRlcmZhY2UgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NhdGNoX3J2YWx1ZV9yZWYsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGNhdGNoIGV4Y2VwdGlvbnMgYnkgcnZhbHVlIHJlZmVyZW5jZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NhdGNoX3ZhcmlhYmx5X21vZGlmaWVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBjYXRjaCB2YXJpYWJseSBtb2RpZmllZCB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY2F0ZWdvcnlfZm9yd2FyZF9pbnRlcmZhY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGRlZmluZSAlc2VsZWN0e2NhdGVnb3J5fGNsYXNzIGV4dGVuc2lvbn0wIGZvciB1bmRlZmluZWQgY2xhc3MgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jYXRlZ29yeV9wcm9wZXJ0eSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwcm9wZXJ0eSBkZWNsYXJlZCBpbiBjYXRlZ29yeSAlMCBjYW5ub3QgYmUgaW1wbGVtZW50ZWQgaW4gY2xhc3MgaW1wbGVtZW50YXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jY29udl9jaGFuZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZnVuY3Rpb24gZGVjbGFyZWQgJyUwJyBoZXJlIHdhcyBwcmV2aW91c2x5IGRlY2xhcmVkICVzZWxlY3R7JyUyJ3x3aXRob3V0IGNhbGxpbmcgY29udmVudGlvbn0xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY2NvbnZfa25yLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZ1bmN0aW9uIHdpdGggbm8gcHJvdG90eXBlIGNhbm5vdCB1c2UgdGhlICUwIGNhbGxpbmcgY29udmVudGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Njb252X3ZhcmFyZ3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFyaWFkaWMgZnVuY3Rpb24gY2Fubm90IHVzZSAlMCBjYWxsaW5nIGNvbnZlbnRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jZnN0cmluZ19saXRlcmFsX25vdF9zdHJpbmdfY29uc3RhbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiQ0ZTdHJpbmcgbGl0ZXJhbCBpcyBub3QgYSBzdHJpbmcgY29uc3RhbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jaXJjdWxhcl9pbmhlcml0YW5jZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjaXJjdWxhciBpbmhlcml0YW5jZSBiZXR3ZWVuICUwIGFuZCAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NsYXNzX2V4dGVuc2lvbl9hZnRlcl9pbXBsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBkZWNsYXJlIGNsYXNzIGV4dGVuc2lvbiBmb3IgJTAgYWZ0ZXIgY2xhc3MgaW1wbGVtZW50YXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jbGFzc19tYXJrZWRfZmluYWxfdXNlZF9hc19iYXNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImJhc2UgJTAgaXMgbWFya2VkICclc2VsZWN0e2ZpbmFsfHNlYWxlZH0xJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NsYXNzX3Byb3BlcnR5X2ZvdW5kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInByb3BlcnR5ICUwIGlzIGEgY2xhc3MgcHJvcGVydHk7IGRpZCB5b3UgbWVhbiB0byBhY2Nlc3MgaXQgd2l0aCBjbGFzcyAnJTEnPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NsYXNzX3JlZGVjbGFyZWRfd2l0aF9kaWZmZXJlbnRfYWNjZXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIHJlZGVjbGFyZWQgd2l0aCAnJTEnIGFjY2VzcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvY29hX25hbWluZ19vd25lZF9ydWxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInByb3BlcnR5IGZvbGxvd3MgQ29jb2EgbmFtaW5nIGNvbnZlbnRpb24gZm9yIHJldHVybmluZyAnb3duZWQnIG9iamVjdHMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb2xsZWN0aW9uX2V4cHJfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aGUgdHlwZSAlMCBpcyBub3QgYSBwb2ludGVyIHRvIGEgZmFzdC1lbnVtZXJhYmxlIG9iamVjdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbXBsZXhfbW9kZV92ZWN0b3JfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlIG9mIG1hY2hpbmUgbW9kZSBkb2VzIG5vdCBzdXBwb3J0IGJhc2UgdmVjdG9yIHR5cGVzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29tcG91bmRfcXVhbGlmaWVkX2Z1bmN0aW9uX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtibG9jayBwb2ludGVyfHBvaW50ZXJ8cmVmZXJlbmNlfTAgdG8gZnVuY3Rpb24gdHlwZSAlc2VsZWN0eyUyIHx9MWNhbm5vdCBoYXZlICclMycgcXVhbGlmaWVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29uY2VwdF9kZWNsX2ludmFsaWRfc3BlY2lmaWVycywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e3ZhcmlhYmxlfGZ1bmN0aW9ufTAgY29uY2VwdCBjYW5ub3QgYmUgZGVjbGFyZWQgJyVzZWxlY3R7dGhyZWFkX2xvY2FsfGlubGluZXxmcmllbmR8Y29uc3RleHByfTEnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29uY2VwdF9kZWNsc19tYXlfb25seV9hcHBlYXJfaW5fbmFtZXNwYWNlX3Njb3BlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbmNlcHQgZGVjbGFyYXRpb25zIG1heSBvbmx5IGFwcGVhciBpbiBuYW1lc3BhY2Ugc2NvcGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25jZXB0X3NwZWNpYWxpemVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7ZnVuY3Rpb258dmFyaWFibGV9MCBjb25jZXB0IGNhbm5vdCBiZSAlc2VsZWN0e2V4cGxpY2l0bHkgaW5zdGFudGlhdGVkfGV4cGxpY2l0bHkgc3BlY2lhbGl6ZWR8cGFydGlhbGx5IHNwZWNpYWxpemVkfTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25jZXB0X3NwZWNpZmllZF9zcGVjaWFsaXphdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInY29uY2VwdCcgY2Fubm90IGJlIGFwcGxpZWQgb24gYW4gJXNlbGVjdHtleHBsaWNpdCBpbnN0YW50aWF0aW9ufGV4cGxpY2l0IHNwZWNpYWxpemF0aW9ufHBhcnRpYWwgc3BlY2lhbGl6YXRpb259MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbmNlcHRfd3JvbmdfZGVjbF9raW5kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidjb25jZXB0JyBjYW4gb25seSBhcHBlYXIgb24gdGhlIGRlZmluaXRpb24gb2YgYSBmdW5jdGlvbiB0ZW1wbGF0ZSBvciB2YXJpYWJsZSB0ZW1wbGF0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbmRfdm9pZHB0cl9hcmMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib3BlcmFuZHMgdG8gY29uZGl0aW9uYWwgb2YgdHlwZXMlZGlmZnsgJCBhbmQgJHx9MCwxIGFyZSBpbmNvbXBhdGlibGUgaW4gQVJDIG1vZGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25kaXRpb25hbF9hbWJpZ3VvdXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBhbWJpZ3VvdXM7ICVkaWZmeyQgY2FuIGJlIGNvbnZlcnRlZCB0byAkIGFuZCB2aWNlIHZlcnNhfHR5cGVzIGNhbiBiZSBjb252ZXJ0IHRvIGVhY2ggb3RoZXJ9MCwxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29uZGl0aW9uYWxfYW1iaWd1b3VzX292bCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGFtYmlndW91czsgJWRpZmZ7JCBhbmQgJHx0eXBlc30wLDEgY2FuIGJlIGNvbnZlcnRlZCB0byBzZXZlcmFsIGNvbW1vbiB0eXBlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbmRpdGlvbmFsX3ZlY3Rvcl9lbGVtZW50X3NpemUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmVjdG9yIGNvbmRpdGlvbiB0eXBlICUwIGFuZCByZXN1bHQgdHlwZSAlMSBkbyBub3QgaGF2ZSBlbGVtZW50cyBvZiB0aGUgc2FtZSBzaXplIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29uZGl0aW9uYWxfdmVjdG9yX3NpemUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmVjdG9yIGNvbmRpdGlvbiB0eXBlICUwIGFuZCByZXN1bHQgdHlwZSAlMSBkbyBub3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25kaXRpb25hbF92b2lkX25vbnZvaWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtsZWZ0fHJpZ2h0fTEgb3BlcmFuZCB0byA/IGlzIHZvaWQsIGJ1dCAlc2VsZWN0e3JpZ2h0fGxlZnR9MSBvcGVyYW5kIGlzIG9mIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25maWdfc2NhbGFyX3JldHVybiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJDVURBIHNwZWNpYWwgZnVuY3Rpb24gJ2N1ZGFDb25maWd1cmVDYWxsJyBtdXN0IGhhdmUgc2NhbGFyIHJldHVybiB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29uZmxpY3RpbmdfYWxpYXNpbmdfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb25mbGljdGluZyB0eXBlcyBmb3IgYWxpYXMgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25mbGljdGluZ19pdmFyX2JpdHdpZHRoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluc3RhbmNlIHZhcmlhYmxlICUwIGhhcyBjb25mbGljdGluZyBiaXQtZmllbGQgd2lkdGgiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25mbGljdGluZ19pdmFyX25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29uZmxpY3RpbmcgaW5zdGFuY2UgdmFyaWFibGUgbmFtZXM6ICUwIHZzICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29uZmxpY3RpbmdfaXZhcl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluc3RhbmNlIHZhcmlhYmxlICUwIGhhcyBjb25mbGljdGluZyB0eXBlJWRpZmZ7OiAkIHZzICR8fTEsMiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbmZsaWN0aW5nX292ZXJyaWRpbmdfY2NfYXR0cmlidXRlcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2aXJ0dWFsIGZ1bmN0aW9uICUwIGhhcyBkaWZmZXJlbnQgY2FsbGluZyBjb252ZW50aW9uIGF0dHJpYnV0ZXMgJWRpZmZ7KCQpIHRoYW4gdGhlIGZ1bmN0aW9uIGl0IG92ZXJyaWRlcyAod2hpY2ggaGFzIGNhbGxpbmcgY29udmVudGlvbiAkKXx0aGFuIHRoZSBmdW5jdGlvbiBpdCBvdmVycmlkZXN9MSwyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29uZmxpY3Rpbmdfc3VwZXJfY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29uZmxpY3Rpbmcgc3VwZXIgY2xhc3MgbmFtZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbmZsaWN0aW5nX3R5cGVzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbmZsaWN0aW5nIHR5cGVzIGZvciAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbnN0YW50X2ludGVnZXJfYXJnX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJndW1lbnQgdG8gJTAgbXVzdCBiZSBhIGNvbnN0YW50IGludGVnZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25zdGV4cHJfYm9keV9pbnZhbGlkX3N0bXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic3RhdGVtZW50IG5vdCBhbGxvd2VkIGluIGNvbnN0ZXhwciAlc2VsZWN0e2Z1bmN0aW9ufGNvbnN0cnVjdG9yfTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25zdGV4cHJfYm9keV9ub19yZXR1cm4sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gcmV0dXJuIHN0YXRlbWVudCBpbiBjb25zdGV4cHIgZnVuY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25zdGV4cHJfY3Rvcl9taXNzaW5nX2luaXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29uc3RleHByIGNvbnN0cnVjdG9yIG11c3QgaW5pdGlhbGl6ZSBhbGwgbWVtYmVycyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbnN0ZXhwcl9kdG9yLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlc3RydWN0b3IgY2Fubm90IGJlIG1hcmtlZCBjb25zdGV4cHIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25zdGV4cHJfZnVuY3Rpb25fdHJ5X2Jsb2NrLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZ1bmN0aW9uIHRyeSBibG9jayBub3QgYWxsb3dlZCBpbiBjb25zdGV4cHIgJXNlbGVjdHtmdW5jdGlvbnxjb25zdHJ1Y3Rvcn0wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29uc3RleHByX2xvY2FsX3Zhcl9ub19pbml0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInZhcmlhYmxlcyBkZWZpbmVkIGluIGEgY29uc3RleHByICVzZWxlY3R7ZnVuY3Rpb258Y29uc3RydWN0b3J9MCBtdXN0IGJlIGluaXRpYWxpemVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29uc3RleHByX2xvY2FsX3Zhcl9ub25fbGl0ZXJhbF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInZhcmlhYmxlIG9mIG5vbi1saXRlcmFsIHR5cGUgJTEgY2Fubm90IGJlIGRlZmluZWQgaW4gYSBjb25zdGV4cHIgJXNlbGVjdHtmdW5jdGlvbnxjb25zdHJ1Y3Rvcn0wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29uc3RleHByX2xvY2FsX3Zhcl9zdGF0aWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtzdGF0aWN8dGhyZWFkX2xvY2FsfTEgdmFyaWFibGUgbm90IHBlcm1pdHRlZCBpbiBhIGNvbnN0ZXhwciAlc2VsZWN0e2Z1bmN0aW9ufGNvbnN0cnVjdG9yfTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25zdGV4cHJfbWFpbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInbWFpbicgaXMgbm90IGFsbG93ZWQgdG8gYmUgZGVjbGFyZWQgY29uc3RleHByIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29uc3RleHByX25vX2RlY2xhcmF0b3JzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbnN0ZXhwciBjYW4gb25seSBiZSB1c2VkIGluIHZhcmlhYmxlIGFuZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25zdGV4cHJfbm9uX2xpdGVyYWxfcGFyYW0sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29uc3RleHByICVzZWxlY3R7ZnVuY3Rpb258Y29uc3RydWN0b3J9MSdzICVvcmRpbmFsMCBwYXJhbWV0ZXIgdHlwZSAlMiBpcyBub3QgYSBsaXRlcmFsIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25zdGV4cHJfbm9uX2xpdGVyYWxfcmV0dXJuLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbnN0ZXhwciBmdW5jdGlvbidzIHJldHVybiB0eXBlICUwIGlzIG5vdCBhIGxpdGVyYWwgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbnN0ZXhwcl9yZWRlY2xfbWlzbWF0Y2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtub24tY29uc3RleHByIGRlY2xhcmF0aW9uIG9mICUwIGZvbGxvd3MgY29uc3RleHByIGRlY2xhcmF0aW9ufGNvbnN0ZXhwciBkZWNsYXJhdGlvbiBvZiAlMCBmb2xsb3dzIG5vbi1jb25zdGV4cHIgZGVjbGFyYXRpb259MSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbnN0ZXhwcl9yZXR1cm5fbWlzc2luZ19leHByLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vbi12b2lkIGNvbnN0ZXhwciBmdW5jdGlvbiAlMCBzaG91bGQgcmV0dXJuIGEgdmFsdWUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25zdGV4cHJfc3RhdGljX21lbV92YXJfcmVxdWlyZXNfaW5pdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWNsYXJhdGlvbiBvZiBjb25zdGV4cHIgc3RhdGljIGRhdGEgbWVtYmVyICUwIHJlcXVpcmVzIGFuIGluaXRpYWxpemVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29uc3RleHByX3RhZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2NsYXNzfHN0cnVjdHxpbnRlcmZhY2V8dW5pb258ZW51bX0wIGNhbm5vdCBiZSBtYXJrZWQgY29uc3RleHByIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29uc3RleHByX3VuaW9uX2N0b3Jfbm9faW5pdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb25zdGV4cHIgdW5pb24gY29uc3RydWN0b3IgZG9lcyBub3QgaW5pdGlhbGl6ZSBhbnkgbWVtYmVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29uc3RleHByX3Zhcl9ub25fbGl0ZXJhbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb25zdGV4cHIgdmFyaWFibGUgY2Fubm90IGhhdmUgbm9uLWxpdGVyYWwgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbnN0ZXhwcl92YXJfcmVxdWlyZXNfY29uc3RfaW5pdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb25zdGV4cHIgdmFyaWFibGUgJTAgbXVzdCBiZSBpbml0aWFsaXplZCBieSBhIGNvbnN0YW50IGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25zdGV4cHJfdmlydHVhbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2aXJ0dWFsIGZ1bmN0aW9uIGNhbm5vdCBiZSBjb25zdGV4cHIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25zdGV4cHJfdmlydHVhbF9iYXNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbnN0ZXhwciAlc2VsZWN0e21lbWJlciBmdW5jdGlvbnxjb25zdHJ1Y3Rvcn0wIG5vdCBhbGxvd2VkIGluICVzZWxlY3R7c3RydWN0fGludGVyZmFjZXxjbGFzc30xIHdpdGggdmlydHVhbCBiYXNlICVwbHVyYWx7MTpjbGFzc3w6Y2xhc3Nlc30yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29uc3RleHByX3ZsYSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2YXJpYWJseS1tb2RpZmllZCB0eXBlICUwIGNhbm5vdCBiZSB1c2VkIGluIGEgY29uc3RleHByICVzZWxlY3R7ZnVuY3Rpb258Y29uc3RydWN0b3J9MSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbnN0cnVjdG9yX2J5dmFsdWVfYXJnLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvcHkgY29uc3RydWN0b3IgbXVzdCBwYXNzIGl0cyBmaXJzdCBhcmd1bWVudCBieSByZWZlcmVuY2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25zdHJ1Y3Rvcl9jYW5ub3RfYmUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29uc3RydWN0b3IgY2Fubm90IGJlIGRlY2xhcmVkICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb25zdHJ1Y3Rvcl9yZWRlY2xhcmVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbnN0cnVjdG9yIGNhbm5vdCBiZSByZWRlY2xhcmVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29uc3RydWN0b3JfcmV0dXJuX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29uc3RydWN0b3IgY2Fubm90IGhhdmUgYSByZXR1cm4gdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbnRpbnVhdGlvbl9jbGFzcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjbGFzcyBleHRlbnNpb24gaGFzIG5vIHByaW1hcnkgY2xhc3MiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb250aW51ZV9ub3RfaW5fbG9vcCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInY29udGludWUnIHN0YXRlbWVudCBub3QgaW4gbG9vcCBzdGF0ZW1lbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb252X2Z1bmN0aW9uX25vdF9tZW1iZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29udmVyc2lvbiBmdW5jdGlvbiBtdXN0IGJlIGEgbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb252X2Z1bmN0aW9uX3JlZGVjbGFyZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29udmVyc2lvbiBmdW5jdGlvbiBjYW5ub3QgYmUgcmVkZWNsYXJlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbnZfZnVuY3Rpb25fcmV0dXJuX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29udmVyc2lvbiBmdW5jdGlvbiBjYW5ub3QgaGF2ZSBhIHJldHVybiB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29udl9mdW5jdGlvbl90b19hcnJheSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb252ZXJzaW9uIGZ1bmN0aW9uIGNhbm5vdCBjb252ZXJ0IHRvIGFuIGFycmF5IHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb252X2Z1bmN0aW9uX3RvX2Z1bmN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbnZlcnNpb24gZnVuY3Rpb24gY2Fubm90IGNvbnZlcnQgdG8gYSBmdW5jdGlvbiB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY29udl9mdW5jdGlvbl92YXJpYWRpYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb252ZXJzaW9uIGZ1bmN0aW9uIGNhbm5vdCBiZSB2YXJpYWRpYyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbnZfZnVuY3Rpb25fd2l0aF9jb21wbGV4X2RlY2wsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHNwZWNpZnkgYW55IHBhcnQgb2YgYSByZXR1cm4gdHlwZSBpbiB0aGUgZGVjbGFyYXRpb24gb2YgYSBjb252ZXJzaW9uIGZ1bmN0aW9uJXNlbGVjdHs7IHB1dCB0aGUgY29tcGxldGUgdHlwZSBhZnRlciAnb3BlcmF0b3InfDsgdXNlIGEgdHlwZWRlZiB0byBkZWNsYXJlIGEgY29udmVyc2lvbiB0byAlMXw7IHVzZSBhbiBhbGlhcyB0ZW1wbGF0ZSB0byBkZWNsYXJlIGEgY29udmVyc2lvbiB0byAlMXx9MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbnZfZnVuY3Rpb25fd2l0aF9wYXJhbXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29udmVyc2lvbiBmdW5jdGlvbiBjYW5ub3QgaGF2ZSBhbnkgcGFyYW1ldGVycyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbnZlcnR2ZWN0b3JfaW5jb21wYXRpYmxlX3ZlY3RvciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmaXJzdCB0d28gYXJndW1lbnRzIHRvIF9fYnVpbHRpbl9jb252ZXJ0dmVjdG9yIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb252ZXJ0dmVjdG9yX25vbl92ZWN0b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZmlyc3QgYXJndW1lbnQgdG8gX19idWlsdGluX2NvbnZlcnR2ZWN0b3IgbXVzdCBiZSBhIHZlY3RvciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvbnZlcnR2ZWN0b3Jfbm9uX3ZlY3Rvcl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInNlY29uZCBhcmd1bWVudCB0byBfX2J1aWx0aW5fY29udmVydHZlY3RvciBtdXN0IGJlIGEgdmVjdG9yIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb3B5X2NhcHR1cmVfd2l0aF9jb3B5X2RlZmF1bHQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJyYnIG11c3QgcHJlY2VkZSBhIGNhcHR1cmUgd2hlbiB0aGUgY2FwdHVyZSBkZWZhdWx0IGlzICc9JyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMykKK0RJQUcoZXJyX2Nvcm91dGluZV9oYW5kbGVfbWlzc2luZ19tZW1iZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic3RkOjpleHBlcmltZW50YWw6OmNvcm91dGluZV9oYW5kbGUgbWlzc2luZyBhIG1lbWJlciBuYW1lZCAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNCkKK0RJQUcoZXJyX2Nvcm91dGluZV9pbnZhbGlkX2Z1bmNfY29udGV4dCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInJTEnIGNhbm5vdCBiZSB1c2VkIGluICVzZWxlY3R7YSBjb25zdHJ1Y3RvcnxhIGRlc3RydWN0b3J8YSBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3J8YSBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3J8dGhlICdtYWluJyBmdW5jdGlvbnxhIGNvbnN0ZXhwciBmdW5jdGlvbnxhIGZ1bmN0aW9uIHdpdGggYSBkZWR1Y2VkIHJldHVybiB0eXBlfGEgdmFyYXJncyBmdW5jdGlvbn0wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNCkKK0RJQUcoZXJyX2Nvcm91dGluZV9vYmpjX21ldGhvZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJPYmplY3RpdmUtQyBtZXRob2RzIGFzIGNvcm91dGluZXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNCkKK0RJQUcoZXJyX2Nvcm91dGluZV9vdXRzaWRlX2Z1bmN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiclMCcgY2Fubm90IGJlIHVzZWQgb3V0c2lkZSBhIGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNCkKK0RJQUcoZXJyX2Nvcm91dGluZV9wcm9taXNlX2dldF9yZXR1cm5fb2JqZWN0X29uX2FsbG9jYXRpb25fZmFpbHVyZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMDogJ2dldF9yZXR1cm5fb2JqZWN0X29uX2FsbG9jYXRpb25fZmFpbHVyZSgpJyBtdXN0IGJlIGEgc3RhdGljIG1lbWJlciBmdW5jdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTQpCitESUFHKGVycl9jb3JvdXRpbmVfcHJvbWlzZV9pbmNvbXBhdGlibGVfcmV0dXJuX2Z1bmN0aW9ucywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aGUgY29yb3V0aW5lIHByb21pc2UgdHlwZSAlMCBkZWNsYXJlcyBib3RoICdyZXR1cm5fdmFsdWUnIGFuZCAncmV0dXJuX3ZvaWQnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNCkKK0RJQUcoZXJyX2Nvcm91dGluZV9wcm9taXNlX25ld19yZXF1aXJlc19ub3Rocm93LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSBub24tdGhyb3dpbmcgbm9leGNlcHQgc3BlY2lmaWNhdGlvbiB3aGVuIHRoZSBwcm9taXNlIHR5cGUgZGVjbGFyZXMgJ2dldF9yZXR1cm5fb2JqZWN0X29uX2FsbG9jYXRpb25fZmFpbHVyZSgpJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTQpCitESUFHKGVycl9jb3JvdXRpbmVfcHJvbWlzZV9yZXF1aXJlc19yZXR1cm5fZnVuY3Rpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhlIGNvcm91dGluZSBwcm9taXNlIHR5cGUgJTAgbXVzdCBkZWNsYXJlIGVpdGhlciAncmV0dXJuX3ZhbHVlJyBvciAncmV0dXJuX3ZvaWQnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNCkKK0RJQUcoZXJyX2Nvcm91dGluZV9wcm9taXNlX3R5cGVfaW5jb21wbGV0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBhIGNvcm91dGluZTogJTAgaXMgYW4gaW5jb21wbGV0ZSB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNCkKK0RJQUcoZXJyX2Nvcm91dGluZV9wcm9taXNlX3VuaGFuZGxlZF9leGNlcHRpb25fcmVxdWlyZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgaXMgcmVxdWlyZWQgdG8gZGVjbGFyZSB0aGUgbWVtYmVyICd1bmhhbmRsZWRfZXhjZXB0aW9uKCknIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNCkKK0RJQUcoZXJyX2Nvcm91dGluZV90eXBlX21pc3Npbmdfc3BlY2lhbGl6YXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgYSBjb3JvdXRpbmU6IG1pc3NpbmcgZGVmaW5pdGlvbiBvZiBzcGVjaWFsaXphdGlvbiAlcTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE0KQorRElBRyhlcnJfY29yb3V0aW5lX3VuZXZhbHVhdGVkX2NvbnRleHQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJyUwJyBjYW5ub3QgYmUgdXNlZCBpbiBhbiB1bmV2YWx1YXRlZCBjb250ZXh0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNCkKK0RJQUcoZXJyX2NvdmFyaWFudF9yZXR1cm5fYW1iaWd1b3VzX2Rlcml2ZWRfdG9fYmFzZV9jb252LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJldHVybiB0eXBlIG9mIHZpcnR1YWwgZnVuY3Rpb24gJTMgaXMgbm90IGNvdmFyaWFudCB3aXRoIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gaXQgb3ZlcnJpZGVzIChhbWJpZ3VvdXMgY29udmVyc2lvbiBmcm9tIGRlcml2ZWQgY2xhc3MgJTAgdG8gYmFzZSBjbGFzcyAlMTolMikiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb3ZhcmlhbnRfcmV0dXJuX2luYWNjZXNzaWJsZV9iYXNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgY292YXJpYW50IHJldHVybiBmb3IgdmlydHVhbCBmdW5jdGlvbjogJTEgaXMgYSAlc2VsZWN0e3ByaXZhdGV8cHJvdGVjdGVkfTIgYmFzZSBjbGFzcyBvZiAlMCIsIDAsIFNGSU5BRV9BY2Nlc3NDb250cm9sLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvdmFyaWFudF9yZXR1cm5faW5jb21wbGV0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZXR1cm4gdHlwZSBvZiB2aXJ0dWFsIGZ1bmN0aW9uICUwIGlzIG5vdCBjb3ZhcmlhbnQgd2l0aCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGl0IG92ZXJyaWRlcyAoJTEgaXMgaW5jb21wbGV0ZSkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jb3ZhcmlhbnRfcmV0dXJuX25vdF9kZXJpdmVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJldHVybiB0eXBlIG9mIHZpcnR1YWwgZnVuY3Rpb24gJTAgaXMgbm90IGNvdmFyaWFudCB3aXRoIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gaXQgb3ZlcnJpZGVzICglMSBpcyBub3QgZGVyaXZlZCBmcm9tICUyKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvdmFyaWFudF9yZXR1cm5fdHlwZV9jbGFzc190eXBlX21vcmVfcXVhbGlmaWVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJldHVybiB0eXBlIG9mIHZpcnR1YWwgZnVuY3Rpb24gJTAgaXMgbm90IGNvdmFyaWFudCB3aXRoIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gaXQgb3ZlcnJpZGVzIChjbGFzcyB0eXBlICUxIGlzIG1vcmUgcXVhbGlmaWVkIHRoYW4gY2xhc3MgdHlwZSAlMiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2NvdmFyaWFudF9yZXR1cm5fdHlwZV9kaWZmZXJlbnRfcXVhbGlmaWNhdGlvbnMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmV0dXJuIHR5cGUgb2YgdmlydHVhbCBmdW5jdGlvbiAlMCBpcyBub3QgY292YXJpYW50IHdpdGggdGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbiBpdCBvdmVycmlkZXMgKCUxIGhhcyBkaWZmZXJlbnQgcXVhbGlmaWVycyB0aGFuICUyKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2N0b3JfZHRvcl9yZXR1cm5zX3ZvaWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtjb25zdHJ1Y3RvcnxkZXN0cnVjdG9yfTEgJTAgbXVzdCBub3QgcmV0dXJuIHZvaWQgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2N1ZGFfZGV2aWNlX2V4Y2VwdGlvbnMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHVzZSAnJTAnIGluICVzZWxlY3R7X19kZXZpY2VfX3xfX2dsb2JhbF9ffF9faG9zdF9ffF9faG9zdF9fIF9fZGV2aWNlX199MSBmdW5jdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2N1ZGFfZXh0ZXJuX3NoYXJlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJfX3NoYXJlZF9fIHZhcmlhYmxlICUwIGNhbm5vdCBiZSAnZXh0ZXJuJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2N1ZGFfaG9zdF9zaGFyZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiX19zaGFyZWRfXyBsb2NhbCB2YXJpYWJsZXMgbm90IGFsbG93ZWQgaW4gJXNlbGVjdHtfX2RldmljZV9ffF9fZ2xvYmFsX198X19ob3N0X198X19ob3N0X18gX19kZXZpY2VfX30wIGZ1bmN0aW9ucyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2N1ZGFfbm9uZ2xvYmFsX2NvbnN0YW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIl9fY29uc3RhbnRfXyB2YXJpYWJsZXMgbXVzdCBiZSBnbG9iYWwiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jdWRhX292bF90YXJnZXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtfX2RldmljZV9ffF9fZ2xvYmFsX198X19ob3N0X198X19ob3N0X18gX19kZXZpY2VfX30wIGZ1bmN0aW9uICUxIGNhbm5vdCBvdmVybG9hZCAlc2VsZWN0e19fZGV2aWNlX198X19nbG9iYWxfX3xfX2hvc3RfX3xfX2hvc3RfXyBfX2RldmljZV9ffTIgZnVuY3Rpb24gJTMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9jdWRhX3VuYXR0cmlidXRlZF9jb25zdGV4cHJfY2Fubm90X292ZXJsb2FkX2RldmljZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb25zdGV4cHIgZnVuY3Rpb24gJTAgd2l0aG91dCBfX2hvc3RfXyBvciBfX2RldmljZV9fIGF0dHJpYnV0ZXMgY2Fubm90IG92ZXJsb2FkIF9fZGV2aWNlX18gZnVuY3Rpb24gd2l0aCBzYW1lIHNpZ25hdHVyZS4gIEFkZCBhIF9faG9zdF9fIGF0dHJpYnV0ZSwgb3IgYnVpbGQgd2l0aCAtZm5vLWN1ZGEtaG9zdC1kZXZpY2UtY29uc3RleHByLiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2N1ZGFfdmxhLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCB1c2UgdmFyaWFibGUtbGVuZ3RoIGFycmF5cyBpbiAlc2VsZWN0e19fZGV2aWNlX198X19nbG9iYWxfX3xfX2hvc3RfX3xfX2hvc3RfXyBfX2RldmljZV9ffTAgZnVuY3Rpb25zIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfY3VycmVudF9tb2R1bGVfbmFtZV9taXNtYXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtb2R1bGUgbmFtZSAnJTAnIHNwZWNpZmllZCBvbiBjb21tYW5kIGxpbmUgZG9lcyBub3QgbWF0Y2ggbmFtZSBvZiBtb2R1bGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEzKQorRElBRyhlcnJfY3ljbGljX2FsaWFzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7YWxpYXN8aWZ1bmN9MCBkZWZpbml0aW9uIGlzIHBhcnQgb2YgYSBjeWNsZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlYWxsb2NfYmFkX3Jlc3VsdF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlYWxsb2MgcmV0dXJuIHR5cGUgbXVzdCBiZSBjb3JyZWN0bHkgc3BlY2lmaWVkIGFzICd2b2lkJyB1bmRlciBBUkMsIGluc3RlYWQgb2YgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWNpbWFsX3Vuc3VwcG9ydGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIkdOVSBkZWNpbWFsIHR5cGUgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWNsX2F0dHJpYnV0ZV9pbnZhbGlkX29uX3N0bXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgYXR0cmlidXRlIGNhbm5vdCBiZSBhcHBsaWVkIHRvIGEgc3RhdGVtZW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVjbF9uZWdhdGl2ZV9hcnJheV9zaXplLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiclMCcgZGVjbGFyZWQgYXMgYW4gYXJyYXkgd2l0aCBhIG5lZ2F0aXZlIHNpemUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWNsYXJhdG9yX25lZWRfaWRlbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVjbGFyYXRvciByZXF1aXJlcyBhbiBpZGVudGlmaWVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVjbHNwZWNfdGhyZWFkX29uX3RocmVhZF92YXJpYWJsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInX19kZWNsc3BlYyh0aHJlYWQpJyBhcHBsaWVkIHRvIHZhcmlhYmxlIHRoYXQgYWxyZWFkeSBoYXMgYSB0aHJlYWQtbG9jYWwgc3RvcmFnZSBzcGVjaWZpZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWNsdHlwZV9hdXRvX2Nhbm5vdF9iZV9jb21iaW5lZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInZGVjbHR5cGUoYXV0byknIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIG90aGVyIHR5cGUgc3BlY2lmaWVycyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlY2x0eXBlX2F1dG9fY29tcG91bmRfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZm9ybSAlc2VsZWN0e3BvaW50ZXIgdG98cmVmZXJlbmNlIHRvfGFycmF5IG9mfTAgJ2RlY2x0eXBlKGF1dG8pJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlY2x0eXBlX2F1dG9fZnVuY3Rpb25fZGVjbGFyYXRvcl9ub3RfZGVjbGFyYXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ2RlY2x0eXBlKGF1dG8pJyBjYW4gb25seSBiZSB1c2VkIGFzIGEgcmV0dXJuIHR5cGUgaW4gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlY2x0eXBlX2F1dG9faW5pdGlhbGl6ZXJfbGlzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZGVkdWNlICdkZWNsdHlwZShhdXRvKScgZnJvbSBpbml0aWFsaXplciBsaXN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVjbHR5cGVfYXV0b19pbnZhbGlkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidkZWNsdHlwZShhdXRvKScgbm90IGFsbG93ZWQgaGVyZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlY2x0eXBlX2luX2RlY2xhcmF0b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ2RlY2x0eXBlJyBjYW5ub3QgYmUgdXNlZCB0byBuYW1lIGEgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWNvbXBfZGVjbF9hbWJpZ3VvdXNfYmFzZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZGVjb21wb3NlIG1lbWJlcnMgb2YgYW1iaWd1b3VzIGJhc2UgY2xhc3MgJTEgb2YgJTA6JTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWNvbXBfZGVjbF9hbm9uX3VuaW9uX21lbWJlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZGVjb21wb3NlIGNsYXNzIHR5cGUgJTAgYmVjYXVzZSBpdCBoYXMgYW4gYW5vbnltb3VzICVzZWxlY3R7c3RydWN0fHVuaW9ufTEgbWVtYmVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVjb21wX2RlY2xfY29udGV4dCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWNvbXBvc2l0aW9uIGRlY2xhcmF0aW9uIG5vdCBwZXJtaXR0ZWQgaW4gdGhpcyBjb250ZXh0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVjb21wX2RlY2xfbXVsdGlwbGVfYmFzZXNfd2l0aF9tZW1iZXJzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBkZWNvbXBvc2UgY2xhc3MgdHlwZSAlMTogJXNlbGVjdHtpdHMgYmFzZSBjbGFzc2VzICUyIGFuZHxib3RoIGl0IGFuZCBpdHMgYmFzZSBjbGFzc30wICUzIGhhdmUgbm9uLXN0YXRpYyBkYXRhIG1lbWJlcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWNvbXBfZGVjbF9ub25fcHVibGljX2Jhc2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGRlY29tcG9zZSBtZW1iZXJzIG9mIG5vbi1wdWJsaWMgYmFzZSBjbGFzcyAlMSBvZiAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlY29tcF9kZWNsX25vbl9wdWJsaWNfbWVtYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBkZWNvbXBvc2Ugbm9uLXB1YmxpYyBtZW1iZXIgJTAgb2YgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWNvbXBfZGVjbF9ub3RfYWxvbmUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVjb21wb3NpdGlvbiBkZWNsYXJhdGlvbiBtdXN0IGJlIHRoZSBvbmx5IGRlY2xhcmF0aW9uIGluIGl0cyBncm91cCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlY29tcF9kZWNsX3BhcmVucywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWNvbXBvc2l0aW9uIGRlY2xhcmF0aW9uIGNhbm5vdCBiZSBkZWNsYXJlZCB3aXRoIHBhcmVudGhlc2VzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVjb21wX2RlY2xfcmVxdWlyZXNfaW5pdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWNvbXBvc2l0aW9uIGRlY2xhcmF0aW9uICUwIHJlcXVpcmVzIGFuIGluaXRpYWxpemVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVjb21wX2RlY2xfc3BlYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWNvbXBvc2l0aW9uIGRlY2xhcmF0aW9uIGNhbm5vdCBiZSBkZWNsYXJlZCAlcGx1cmFsezE6JyUxJ3w6d2l0aCAnJTEnIHNwZWNpZmllcnN9MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlY29tcF9kZWNsX3N0ZF90dXBsZV9lbGVtZW50X25vdF9zcGVjaWFsaXplZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZGVjb21wb3NlIHRoaXMgdHlwZTsgJ3N0ZDo6dHVwbGVfZWxlbWVudDwlMD46OnR5cGUnIGRvZXMgbm90IG5hbWUgYSB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVjb21wX2RlY2xfc3RkX3R1cGxlX3NpemVfbm90X2NvbnN0YW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBkZWNvbXBvc2UgdGhpcyB0eXBlOyAnc3RkOjp0dXBsZV9zaXplPCUwPjo6dmFsdWUnIGlzIG5vdCBhIHZhbGlkIGludGVncmFsIGNvbnN0YW50IGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWNvbXBfZGVjbF90ZW1wbGF0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWNvbXBvc2l0aW9uIGRlY2xhcmF0aW9uIHRlbXBsYXRlIG5vdCBzdXBwb3J0ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWNvbXBfZGVjbF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlY29tcG9zaXRpb24gZGVjbGFyYXRpb24gY2Fubm90IGJlIGRlY2xhcmVkIHdpdGggdHlwZSAlMDsgZGVjbGFyZWQgdHlwZSBtdXN0IGJlICdhdXRvJyBvciByZWZlcmVuY2UgdG8gJ2F1dG8nIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVjb21wX2RlY2xfdW5iaW5kYWJsZV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBkZWNvbXBvc2UgJXNlbGVjdHt1bmlvbnxub24tY2xhc3MsIG5vbi1hcnJheX0xIHR5cGUgJTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWNvbXBfZGVjbF93cm9uZ19udW1iZXJfYmluZGluZ3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSAlMCBkZWNvbXBvc2VzIGludG8gJTIgZWxlbWVudHMsIGJ1dCAlc2VsZWN0e29ubHkgfH0zJTEgbmFtZXMgd2VyZSBwcm92aWRlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlY3JlbWVudF9ib29sLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBkZWNyZW1lbnQgZXhwcmVzc2lvbiBvZiB0eXBlIGJvb2wiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWR1Y2VkX2NsYXNzX3RlbXBsYXRlX2NvbXBvdW5kX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90ICVzZWxlY3R7Zm9ybSBwb2ludGVyIHRvfGZvcm0gcmVmZXJlbmNlIHRvfGZvcm0gYXJyYXkgb2Z8Zm9ybSBmdW5jdGlvbiByZXR1cm5pbmd8dXNlIHBhcmVudGhlc2VzIHdoZW4gZGVjbGFyaW5nIHZhcmlhYmxlIHdpdGh9MCBkZWR1Y2VkIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWR1Y2VkX2NsYXNzX3RlbXBsYXRlX2N0b3JfYW1iaWd1b3VzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFtYmlndW91cyBkZWR1Y3Rpb24gZm9yIHRlbXBsYXRlIGFyZ3VtZW50cyBvZiAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlZHVjZWRfY2xhc3NfdGVtcGxhdGVfY3Rvcl9ub192aWFibGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gdmlhYmxlIGNvbnN0cnVjdG9yIG9yIGRlZHVjdGlvbiBndWlkZSBmb3IgZGVkdWN0aW9uIG9mIHRlbXBsYXRlIGFyZ3VtZW50cyBvZiAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlZHVjZWRfY2xhc3NfdGVtcGxhdGVfZGVsZXRlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjbGFzcyB0ZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24gZm9yICUwIHNlbGVjdGVkIGEgZGVsZXRlZCBjb25zdHJ1Y3RvciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlZHVjZWRfY2xhc3NfdGVtcGxhdGVfZXhwbGljaXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2xhc3MgdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uIGZvciAlMCBzZWxlY3RlZCBhbiBleHBsaWNpdCAlc2VsZWN0e2NvbnN0cnVjdG9yfGRlZHVjdGlvbiBndWlkZX0xIGZvciBjb3B5LWxpc3QtaW5pdGlhbGl6YXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWR1Y2VkX2NsYXNzX3RlbXBsYXRlX2luY29tcGxldGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGVtcGxhdGUgJTAgaGFzIG5vIGRlZmluaXRpb24gYW5kIG5vICVzZWxlY3R7fHZpYWJsZSB9MWRlZHVjdGlvbiBndWlkZXMgZm9yIGRlZHVjdGlvbiBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWR1Y2VkX25vbl9jbGFzc190ZW1wbGF0ZV9zcGVjaWFsaXphdGlvbl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7PGVycm9yPnxmdW5jdGlvbiB0ZW1wbGF0ZXx2YXJpYWJsZSB0ZW1wbGF0ZXxhbGlhcyB0ZW1wbGF0ZXx0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJ8dGVtcGxhdGV9MCAlMSByZXF1aXJlcyB0ZW1wbGF0ZSBhcmd1bWVudHM7IGFyZ3VtZW50IGRlZHVjdGlvbiBvbmx5IGFsbG93ZWQgZm9yIGNsYXNzIHRlbXBsYXRlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlZHVjZWRfbm9uX3R5cGVfdGVtcGxhdGVfYXJnX3R5cGVfbWlzbWF0Y2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVkdWNlZCBub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgdGVtcGxhdGUgcGFyYW1ldGVyJWRpZmZ7ICgkIHZzICQpfH0wLDEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWR1Y2VkX3JldHVybl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZHVjZWQgcmV0dXJuIHR5cGVzIGFyZSBhIEMrKzE0IGV4dGVuc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlZHVjdGlvbl9ndWlkZV9iYWRfdHJhaWxpbmdfcmV0dXJuX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVkdWNlZCB0eXBlICUxIG9mIGRlZHVjdGlvbiBndWlkZSBpcyBub3QgJXNlbGVjdHt8d3JpdHRlbiBhcyB9MmEgc3BlY2lhbGl6YXRpb24gb2YgdGVtcGxhdGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWR1Y3Rpb25fZ3VpZGVfZGVmaW5lc19mdW5jdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWR1Y3Rpb24gZ3VpZGUgY2Fubm90IGhhdmUgYSBmdW5jdGlvbiBkZWZpbml0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVkdWN0aW9uX2d1aWRlX2V4cGxpY2l0X21pc21hdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZHVjdGlvbiBndWlkZSBpcyAlc2VsZWN0e25vdCB8fTBkZWNsYXJlZCAnZXhwbGljaXQnIGJ1dCBwcmV2aW91cyBkZWNsYXJhdGlvbiB3YXMlc2VsZWN0eyBub3R8fTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWR1Y3Rpb25fZ3VpZGVfaW52YWxpZF9zcGVjaWZpZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVkdWN0aW9uIGd1aWRlIGNhbm5vdCBiZSBkZWNsYXJlZCAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVkdWN0aW9uX2d1aWRlX25hbWVfbm90X2NsYXNzX3RlbXBsYXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBzcGVjaWZ5IGRlZHVjdGlvbiBndWlkZSBmb3IgJXNlbGVjdHs8ZXJyb3I+fGZ1bmN0aW9uIHRlbXBsYXRlfHZhcmlhYmxlIHRlbXBsYXRlfGFsaWFzIHRlbXBsYXRlfHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlcnxkZXBlbmRlbnQgdGVtcGxhdGUgbmFtZX0wICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVkdWN0aW9uX2d1aWRlX25vX3RyYWlsaW5nX3JldHVybl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZHVjdGlvbiBndWlkZSBkZWNsYXJhdGlvbiB3aXRob3V0IHRyYWlsaW5nIHJldHVybiB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVkdWN0aW9uX2d1aWRlX3NwZWNpYWxpemVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZHVjdGlvbiBndWlkZSBjYW5ub3QgYmUgJXNlbGVjdHtleHBsaWNpdGx5IGluc3RhbnRpYXRlZHxleHBsaWNpdGx5IHNwZWNpYWxpemVkfTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWR1Y3Rpb25fZ3VpZGVfdGVtcGxhdGVfbm90X2RlZHVjaWJsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWR1Y3Rpb24gZ3VpZGUgdGVtcGxhdGUgY29udGFpbnMgJXNlbGVjdHthIHRlbXBsYXRlIHBhcmFtZXRlcnx0ZW1wbGF0ZSBwYXJhbWV0ZXJzfTAgdGhhdCBjYW5ub3QgYmUgZGVkdWNlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlZHVjdGlvbl9ndWlkZV93aXRoX2NvbXBsZXhfZGVjbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3Qgc3BlY2lmeSBhbnkgcGFydCBvZiBhIHJldHVybiB0eXBlIGluIHRoZSBkZWNsYXJhdGlvbiBvZiBhIGRlZHVjdGlvbiBndWlkZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlZHVjdGlvbl9ndWlkZV93cm9uZ19zY29wZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWR1Y3Rpb24gZ3VpZGUgbXVzdCBiZSBkZWNsYXJlZCBpbiB0aGUgc2FtZSBzY29wZSBhcyB0ZW1wbGF0ZSAlcTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWVwX2V4Y2VwdGlvbl9zcGVjc19kaWZmZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIG9mICVzZWxlY3R7cmV0dXJufGFyZ3VtZW50fTAgdHlwZXMgZGlmZmVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVmYXVsdF9hcmdfaW5fcGFydGlhbF9zcGVjLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnQgaW4gYSBjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVmYXVsdF9hcmdfbWFrZXNfY3Rvcl9zcGVjaWFsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFkZGl0aW9uIG9mIGRlZmF1bHQgYXJndW1lbnQgb24gcmVkZWNsYXJhdGlvbiBtYWtlcyB0aGlzIGNvbnN0cnVjdG9yIGEgJXNlbGVjdHtkZWZhdWx0fGNvcHl8bW92ZX0wIGNvbnN0cnVjdG9yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVmYXVsdF9pbml0X2NvbnN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZmF1bHQgaW5pdGlhbGl6YXRpb24gb2YgYW4gb2JqZWN0IG9mIGNvbnN0IHR5cGUgJTAlc2VsZWN0e3wgd2l0aG91dCBhIHVzZXItcHJvdmlkZWQgZGVmYXVsdCBjb25zdHJ1Y3Rvcn0xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVmYXVsdF9ub3RfaW5fc3dpdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidkZWZhdWx0JyBzdGF0ZW1lbnQgbm90IGluIHN3aXRjaCBzdGF0ZW1lbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWZhdWx0ZWRfY29weV9hc3NpZ25fbm90X3JlZiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aGUgcGFyYW1ldGVyIGZvciBhbiBleHBsaWNpdGx5LWRlZmF1bHRlZCBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IgbXVzdCBiZSBhbiBsdmFsdWUgcmVmZXJlbmNlIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWZhdWx0ZWRfc3BlY2lhbF9tZW1iZXJfY29weV9jb25zdF9wYXJhbSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aGUgcGFyYW1ldGVyIGZvciB0aGlzIGV4cGxpY2l0bHktZGVmYXVsdGVkIGNvcHkgJXNlbGVjdHtjb25zdHJ1Y3Rvcnxhc3NpZ25tZW50IG9wZXJhdG9yfTAgaXMgY29uc3QsIGJ1dCBhIG1lbWJlciBvciBiYXNlIHJlcXVpcmVzIGl0IHRvIGJlIG5vbi1jb25zdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlZmF1bHRlZF9zcGVjaWFsX21lbWJlcl9tb3ZlX2NvbnN0X3BhcmFtLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRoZSBwYXJhbWV0ZXIgZm9yIGFuIGV4cGxpY2l0bHktZGVmYXVsdGVkIG1vdmUgJXNlbGVjdHtjb25zdHJ1Y3Rvcnxhc3NpZ25tZW50IG9wZXJhdG9yfTAgbWF5IG5vdCBiZSBjb25zdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlZmF1bHRlZF9zcGVjaWFsX21lbWJlcl9wYXJhbXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYW4gZXhwbGljaXRseS1kZWZhdWx0ZWQgJXNlbGVjdHt8Y29weSB8bW92ZSB9MGNvbnN0cnVjdG9yIGNhbm5vdCBoYXZlIGRlZmF1bHQgYXJndW1lbnRzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVmYXVsdGVkX3NwZWNpYWxfbWVtYmVyX3F1YWxzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFuIGV4cGxpY2l0bHktZGVmYXVsdGVkICVzZWxlY3R7Y29weXxtb3ZlfTAgYXNzaWdubWVudCBvcGVyYXRvciBtYXkgbm90IGhhdmUgJ2NvbnN0JyVzZWxlY3R7LCAnY29uc3RleHByJ3x9MSBvciAndm9sYXRpbGUnIHF1YWxpZmllcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWZhdWx0ZWRfc3BlY2lhbF9tZW1iZXJfcmV0dXJuX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwbGljaXRseS1kZWZhdWx0ZWQgJXNlbGVjdHtjb3B5fG1vdmV9MCBhc3NpZ25tZW50IG9wZXJhdG9yIG11c3QgcmV0dXJuICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVmYXVsdGVkX3NwZWNpYWxfbWVtYmVyX3ZhcmlhZGljLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFuIGV4cGxpY2l0bHktZGVmYXVsdGVkICVzZWxlY3R7fGNvcHkgfG1vdmUgfTBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgdmFyaWFkaWMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWZhdWx0ZWRfc3BlY2lhbF9tZW1iZXJfdm9sYXRpbGVfcGFyYW0sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhlIHBhcmFtZXRlciBmb3IgYW4gZXhwbGljaXRseS1kZWZhdWx0ZWQgJXNlbGVjdHs8PEVSUk9SPj58Y29weSBjb25zdHJ1Y3Rvcnxtb3ZlIGNvbnN0cnVjdG9yfGNvcHkgYXNzaWdubWVudCBvcGVyYXRvcnxtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3J8PDxFUlJPUj4+fTAgbWF5IG5vdCBiZSB2b2xhdGlsZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlZmluaXRpb25fb2ZfZXhwbGljaXRseV9kZWZhdWx0ZWRfbWVtYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZmluaXRpb24gb2YgZXhwbGljaXRseSBkZWZhdWx0ZWQgJXNlbGVjdHtkZWZhdWx0IGNvbnN0cnVjdG9yfGNvcHkgY29uc3RydWN0b3J8bW92ZSBjb25zdHJ1Y3Rvcnxjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3J8bW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yfGRlc3RydWN0b3J8ZnVuY3Rpb259MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlZmluaXRpb25fb2ZfaW1wbGljaXRseV9kZWNsYXJlZF9tZW1iZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVmaW5pdGlvbiBvZiBpbXBsaWNpdGx5IGRlY2xhcmVkICVzZWxlY3R7ZGVmYXVsdCBjb25zdHJ1Y3Rvcnxjb3B5IGNvbnN0cnVjdG9yfG1vdmUgY29uc3RydWN0b3J8Y29weSBhc3NpZ25tZW50IG9wZXJhdG9yfG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcnxkZXN0cnVjdG9yfGZ1bmN0aW9ufTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWxlZ2F0aW5nX2N0b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVsZWdhdGluZyBjb25zdHJ1Y3RvcnMgYXJlIHBlcm1pdHRlZCBvbmx5IGluIEMrKzExIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVsZWdhdGluZ19pbml0aWFsaXplcl9hbG9uZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhbiBpbml0aWFsaXplciBmb3IgYSBkZWxlZ2F0aW5nIGNvbnN0cnVjdG9yIG11c3QgYXBwZWFyIGFsb25lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVsZXRlX2V4cGxpY2l0X2NvbnZlcnNpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29udmVydGluZyBkZWxldGUgZXhwcmVzc2lvbiBmcm9tIHR5cGUgJTAgdG8gdHlwZSAlMSBpbnZva2VzIGFuIGV4cGxpY2l0IGNvbnZlcnNpb24gZnVuY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWxldGVfaW5jb21wbGV0ZV9jbGFzc190eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlbGV0aW5nIGluY29tcGxldGUgY2xhc3MgdHlwZSAlMDsgbm8gY29udmVyc2lvbnMgdG8gcG9pbnRlciB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVsZXRlX29wZXJhbmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGRlbGV0ZSBleHByZXNzaW9uIG9mIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWxldGVkX2RlY2xfbm90X2ZpcnN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlbGV0ZWQgZGVmaW5pdGlvbiBtdXN0IGJlIGZpcnN0IGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVsZXRlZF9mdW5jdGlvbl91c2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXR0ZW1wdCB0byB1c2UgYSBkZWxldGVkIGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVsZXRlZF9pbmhlcml0ZWRfY3Rvcl91c2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29uc3RydWN0b3IgaW5oZXJpdGVkIGJ5ICUwIGZyb20gYmFzZSBjbGFzcyAlMSBpcyBpbXBsaWNpdGx5IGRlbGV0ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWxldGVkX21haW4sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ21haW4nIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGRlbGV0ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZWxldGVkX292ZXJyaWRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlbGV0ZWQgZnVuY3Rpb24gJTAgY2Fubm90IG92ZXJyaWRlIGEgbm9uLWRlbGV0ZWQgZnVuY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZXBlbmRlbnRfZGVkdWNlZF90c3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZW5hbWUgc3BlY2lmaWVyIHJlZmVycyB0byAlc2VsZWN0e2NsYXNzIHRlbXBsYXRlfGZ1bmN0aW9uIHRlbXBsYXRlfHZhcmlhYmxlIHRlbXBsYXRlfGFsaWFzIHRlbXBsYXRlfHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlcnx0ZW1wbGF0ZX0wIG1lbWJlciBpbiAlMTsgYXJndW1lbnQgZGVkdWN0aW9uIG5vdCBhbGxvd2VkIGhlcmUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZXBlbmRlbnRfbmVzdGVkX25hbWVfc3BlYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJuZXN0ZWQgbmFtZSBzcGVjaWZpZXIgZm9yIGEgZGVjbGFyYXRpb24gY2Fubm90IGRlcGVuZCBvbiBhIHRlbXBsYXRlIHBhcmFtZXRlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlcGVuZGVudF9ub25fdHlwZV9hcmdfaW5fcGFydGlhbF9zcGVjLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInR5cGUgb2Ygc3BlY2lhbGl6ZWQgbm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnQgZGVwZW5kcyBvbiBhIHRlbXBsYXRlIHBhcmFtZXRlciBvZiB0aGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlcGVuZGVudF90YWdfZGVjbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2RlY2xhcmF0aW9ufGRlZmluaXRpb259MCBvZiAlc2VsZWN0e3N0cnVjdHxpbnRlcmZhY2V8dW5pb258Y2xhc3N8ZW51bX0xIGluIGEgZGVwZW5kZW50IHNjb3BlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVwZW5kZW50X3R5cGVkX25vbl90eXBlX2FyZ19pbl9wYXJ0aWFsX3NwZWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnQgc3BlY2lhbGl6ZXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgd2l0aCBkZXBlbmRlbnQgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RlcmVmZXJlbmNlX2luY29tcGxldGVfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZXJlZmVyZW5jZSBvZiBwb2ludGVyIHRvIGluY29tcGxldGUgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Rlc2lnbmF0b3JfZm9yX3NjYWxhcl9pbml0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlc2lnbmF0b3IgaW4gaW5pdGlhbGl6ZXIgZm9yIHNjYWxhciB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVzaWduYXRvcl9pbnRvX2ZsZXhpYmxlX2FycmF5X21lbWJlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZXNpZ25hdG9yIGludG8gZmxleGlibGUgYXJyYXkgbWVtYmVyIHN1Ym9iamVjdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Rlc3Ryb3lpbmdfb3BlcmF0b3JfZGVsZXRlX25vdF91c3VhbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZXN0cm95aW5nIG9wZXJhdG9yIGRlbGV0ZSBjYW4gaGF2ZSBvbmx5IGFuIG9wdGlvbmFsIHNpemUgYW5kIG9wdGlvbmFsIGFsaWdubWVudCBwYXJhbWV0ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZXN0cnVjdG9yX2Nhbm5vdF9iZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZXN0cnVjdG9yIGNhbm5vdCBiZSBkZWNsYXJlZCAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVzdHJ1Y3Rvcl9jbGFzc19uYW1lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIHRoZSBjbGFzcyBuYW1lIGFmdGVyICd+JyB0byBuYW1lIGEgZGVzdHJ1Y3RvciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Rlc3RydWN0b3JfZXhwcl90eXBlX21pc21hdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlc3RydWN0b3IgdHlwZSAlMCBpbiBvYmplY3QgZGVzdHJ1Y3Rpb24gZXhwcmVzc2lvbiBkb2VzIG5vdCBtYXRjaCB0aGUgdHlwZSAlMSBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlc3Ryb3llZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Rlc3RydWN0b3JfbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCB0aGUgY2xhc3MgbmFtZSBhZnRlciAnficgdG8gbmFtZSB0aGUgZW5jbG9zaW5nIGNsYXNzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVzdHJ1Y3Rvcl9ub3RfbWVtYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlc3RydWN0b3IgbXVzdCBiZSBhIG5vbi1zdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGVzdHJ1Y3Rvcl9yZWRlY2xhcmVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlc3RydWN0b3IgY2Fubm90IGJlIHJlZGVjbGFyZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZXN0cnVjdG9yX3JldHVybl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlc3RydWN0b3IgY2Fubm90IGhhdmUgYSByZXR1cm4gdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Rlc3RydWN0b3JfdGVtcGxhdGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVzdHJ1Y3RvciBjYW5ub3QgYmUgZGVjbGFyZWQgYXMgYSB0ZW1wbGF0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Rlc3RydWN0b3JfdHlwZWRlZl9uYW1lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlc3RydWN0b3IgY2Fubm90IGJlIGRlY2xhcmVkIHVzaW5nIGEgJXNlbGVjdHt0eXBlZGVmfHR5cGUgYWxpYXN9MSAlMCBvZiB0aGUgY2xhc3MgbmFtZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Rlc3RydWN0b3JfdmFyaWFkaWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVzdHJ1Y3RvciBjYW5ub3QgYmUgdmFyaWFkaWMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZXN0cnVjdG9yX3dpdGhfcGFyYW1zLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlc3RydWN0b3IgY2Fubm90IGhhdmUgYW55IHBhcmFtZXRlcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kZXZpY2Vfc3RhdGljX2xvY2FsX3ZhciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ3aXRoaW4gYSAlc2VsZWN0e19fZGV2aWNlX198X19nbG9iYWxfX3xfX2hvc3RfX3xfX2hvc3RfXyBfX2RldmljZV9ffTAgZnVuY3Rpb24sIG9ubHkgX19zaGFyZWRfXyB2YXJpYWJsZXMgbWF5IGJlIG1hcmtlZCAnc3RhdGljJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RpYWdub3NlX2lmX2ludmFsaWRfZGlhZ25vc3RpY190eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgZGlhZ25vc3RpYyB0eXBlIGZvciAnZGlhZ25vc2VfaWYnOyB1c2UgXCJlcnJvclwiIG9yIFwid2FybmluZ1wiIGluc3RlYWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kaWFnbm9zZV9pZl9zdWNjZWVkZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kaWZmZXJlbnRfYXNtX2xhYmVsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbmZsaWN0aW5nIGFzbSBsYWJlbCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2RpZmZlcmVudF9sYW5ndWFnZV9saW5rYWdlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlY2xhcmF0aW9uIG9mICUwIGhhcyBhIGRpZmZlcmVudCBsYW5ndWFnZSBsaW5rYWdlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGlmZmVyZW50X3Bhc3Nfb2JqZWN0X3NpemVfcGFyYW1zLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbmZsaWN0aW5nIHBhc3Nfb2JqZWN0X3NpemUgYXR0cmlidXRlcyBvbiBwYXJhbWV0ZXJzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZGlmZmVyZW50X3JldHVybl90eXBlX2Zvcl9vdmVycmlkaW5nX3ZpcnR1YWxfZnVuY3Rpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmlydHVhbCBmdW5jdGlvbiAlMCBoYXMgYSBkaWZmZXJlbnQgcmV0dXJuIHR5cGUgJWRpZmZ7KCQpIHRoYW4gdGhlIGZ1bmN0aW9uIGl0IG92ZXJyaWRlcyAod2hpY2ggaGFzIHJldHVybiB0eXBlICQpfHRoYW4gdGhlIGZ1bmN0aW9uIGl0IG92ZXJyaWRlc30xLDIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kaW1lbnNpb25fZXhwcl9ub3RfY29uc3RhbnRfaW50ZWdlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkaW1lbnNpb24gZXhwcmVzc2lvbiBkb2VzIG5vdCBldmFsdWF0ZSB0byBhIGNvbnN0YW50IHVuc2lnbmVkIGludCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Rpc3RhbnRfZXhjZXB0aW9uX3NwZWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIGFyZSBub3QgYWxsb3dlZCBiZXlvbmQgYSBzaW5nbGUgbGV2ZWwgb2YgaW5kaXJlY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kb3duY2FzdF9mcm9tX2luYWNjZXNzaWJsZV9iYXNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBjYXN0ICVzZWxlY3R7cHJpdmF0ZXxwcm90ZWN0ZWR9MiBiYXNlIGNsYXNzICUxIHRvICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZHRvcl9leHByX3dpdGhvdXRfY2FsbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZWZlcmVuY2UgdG8gJXNlbGVjdHtkZXN0cnVjdG9yfHBzZXVkby1kZXN0cnVjdG9yfTAgbXVzdCBiZSBjYWxsZWQlc2VsZWN0e3w7IGRpZCB5b3UgbWVhbiB0byBjYWxsIGl0IHdpdGggbm8gYXJndW1lbnRzP30xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZHVwX2ltcGxlbWVudGF0aW9uX2NhdGVnb3J5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlaW1wbGVtZW50YXRpb24gb2YgY2F0ZWdvcnkgJTEgZm9yIGNsYXNzICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZHVwX2ltcGxlbWVudGF0aW9uX2NsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlaW1wbGVtZW50YXRpb24gb2YgY2xhc3MgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kdXBsaWNhdGVfYmFzZV9jbGFzcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJiYXNlIGNsYXNzICUwIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSBhcyBhIGRpcmVjdCBiYXNlIGNsYXNzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZHVwbGljYXRlX2Nhc2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZHVwbGljYXRlIGNhc2UgdmFsdWUgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2R1cGxpY2F0ZV9jYXNlX2RpZmZlcmluZ19leHByLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImR1cGxpY2F0ZSBjYXNlIHZhbHVlOiAnJTAnIGFuZCAnJTEnIGJvdGggZXF1YWwgJyUyJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2R1cGxpY2F0ZV9jbGFzc19kZWYsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZHVwbGljYXRlIGludGVyZmFjZSBkZWZpbml0aW9uIGZvciBjbGFzcyAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2R1cGxpY2F0ZV9pdmFyX2RlY2xhcmF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluc3RhbmNlIHZhcmlhYmxlIGlzIGFscmVhZHkgZGVjbGFyZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9kdXBsaWNhdGVfaXZhcl91c2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic3ludGhlc2l6ZWQgcHJvcGVydGllcyAlMCBhbmQgJTEgYm90aCBjbGFpbSBpbnN0YW5jZSB2YXJpYWJsZSAlMiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2R1cGxpY2F0ZV9tYW5nbGVkX25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVmaW5pdGlvbiB3aXRoIHNhbWUgbWFuZ2xlZCBuYW1lIGFzIGFub3RoZXIgZGVmaW5pdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2R1cGxpY2F0ZV9tZW1iZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZHVwbGljYXRlIG1lbWJlciAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2R1cGxpY2F0ZV9tZXRob2RfZGVjbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkdXBsaWNhdGUgZGVjbGFyYXRpb24gb2YgbWV0aG9kICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZHVwbGljYXRlX3Byb3BlcnR5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInByb3BlcnR5IGhhcyBhIHByZXZpb3VzIGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZHluYW1pY19wcm9wZXJ0eV9pdmFyX2RlY2wsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZHluYW1pYyBwcm9wZXJ0eSBjYW5ub3QgaGF2ZSBpbnN0YW5jZSB2YXJpYWJsZSBzcGVjaWZpY2F0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZHluYW1pY192YXJfaW5pdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkeW5hbWljIGluaXRpYWxpemF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIF9fZGV2aWNlX18sIF9fY29uc3RhbnRfXywgYW5kIF9fc2hhcmVkX18gdmFyaWFibGVzLiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Vhcmx5X2NhdGNoX2FsbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYXRjaC1hbGwgaGFuZGxlciBtdXN0IGNvbWUgbGFzdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2VsbGlwc2lzX2ZpcnN0X3BhcmFtLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIklTTyBDIHJlcXVpcmVzIGEgbmFtZWQgcGFyYW1ldGVyIGJlZm9yZSAnLi4uJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2VsbGlwc2lzX2luX2RlY2xhcmF0b3Jfbm90X3BhcmFtZXRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJvbmx5IGZ1bmN0aW9uIGFuZCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGNhbiBiZSBwYXJhbWV0ZXIgcGFja3MiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9lbXB0eV9zY2FsYXJfaW5pdGlhbGl6ZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic2NhbGFyIGluaXRpYWxpemVyIGNhbm5vdCBiZSBlbXB0eSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2VudW1fY2xhc3NfcmVmZXJlbmNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZmVyZW5jZSB0byAlc2VsZWN0e3xzY29wZWQgfTBlbnVtZXJhdGlvbiBtdXN0IHVzZSAnZW51bScgbm90ICdlbnVtIGNsYXNzJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2VudW1faW52YWxpZF91bmRlcmx5aW5nLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vbi1pbnRlZ3JhbCB0eXBlICUwIGlzIGFuIGludmFsaWQgdW5kZXJseWluZyB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZW51bV9tb2RlX3ZlY3Rvcl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1vZGUgJTAgaXMgbm90IHN1cHBvcnRlZCBmb3IgZW51bWVyYXRpb24gdHlwZXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9lbnVtX3JlZGVjbGFyZV9maXhlZF9taXNtYXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJlbnVtZXJhdGlvbiBwcmV2aW91c2x5IGRlY2xhcmVkIHdpdGggJXNlbGVjdHtub258fTBmaXhlZCB1bmRlcmx5aW5nIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9lbnVtX3JlZGVjbGFyZV9zY29wZWRfbWlzbWF0Y2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZW51bWVyYXRpb24gcHJldmlvdXNseSBkZWNsYXJlZCBhcyAlc2VsZWN0e3VufH0wc2NvcGVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZW51bV9yZWRlY2xhcmVfdHlwZV9taXNtYXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJlbnVtZXJhdGlvbiByZWRlY2xhcmVkIHdpdGggZGlmZmVyZW50IHVuZGVybHlpbmcgdHlwZSAlMCAod2FzICUxKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2VudW1lcmF0b3JfZG9lc19ub3RfZXhpc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZW51bWVyYXRvciAlMCBkb2VzIG5vdCBleGlzdCBpbiBpbnN0YW50aWF0aW9uIG9mICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZW51bWVyYXRvcl90b29fbGFyZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZW51bWVyYXRvciB2YWx1ZSBpcyBub3QgcmVwcmVzZW50YWJsZSBpbiB0aGUgdW5kZXJseWluZyB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZW51bWVyYXRvcl93cmFwcGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImVudW1lcmF0b3IgdmFsdWUgJTAgaXMgbm90IHJlcHJlc2VudGFibGUgaW4gdGhlIHVuZGVybHlpbmcgdHlwZSAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2V2ZW50X3RfYWRkcl9zcGFjZV9xdWFsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRoZSBldmVudF90IHR5cGUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIF9fcHJpdmF0ZSBhZGRyZXNzIHNwYWNlIHF1YWxpZmllciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2V4Y2VwdGlvbl9zcGVjX2N5Y2xlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIG9mICUwIHVzZXMgaXRzZWxmIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZXhjZXB0aW9uX3NwZWNfaW5fdHlwZWRlZiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIGluICVzZWxlY3R7dHlwZWRlZnN8dHlwZSBhbGlhc2VzfTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9leGNlcHRpb25fc3BlY19ub3RfcGFyc2VkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGlzIG5vdCBhdmFpbGFibGUgdW50aWwgZW5kIG9mIGNsYXNzIGRlZmluaXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9leGNlcHRpb25zX2Rpc2FibGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCB1c2UgJyUwJyB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9leGNlc3NfaW5pdGlhbGl6ZXJzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4Y2VzcyBlbGVtZW50cyBpbiAlc2VsZWN0e2FycmF5fHZlY3RvcnxzY2FsYXJ8dW5pb258c3RydWN0fTAgaW5pdGlhbGl6ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9leGNlc3NfaW5pdGlhbGl6ZXJzX2luX2NoYXJfYXJyYXlfaW5pdGlhbGl6ZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhjZXNzIGVsZW1lbnRzIGluIGNoYXIgYXJyYXkgaW5pdGlhbGl6ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9leHBlY3RlZF9jbGFzc19vcl9uYW1lc3BhY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgaXMgbm90IGEgY2xhc3Mlc2VsZWN0eyBvciBuYW1lc3BhY2V8LCBuYW1lc3BhY2UsIG9yIGVudW1lcmF0aW9ufTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9leHBlY3RlZF9rZXJuZWxfdm9pZF9yZXR1cm5fdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJrZXJuZWwgbXVzdCBoYXZlIHZvaWQgcmV0dXJuIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9leHBsaWNpdF9pbnN0YW50aWF0aW9uX2FtYmlndW91cywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwYXJ0aWFsIG9yZGVyaW5nIGZvciBleHBsaWNpdCBpbnN0YW50aWF0aW9uIG9mICUwIGlzIGFtYmlndW91cyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2V4cGxpY2l0X2luc3RhbnRpYXRpb25fY29uc3RleHByLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGxpY2l0IGluc3RhbnRpYXRpb24gY2Fubm90IGJlICdjb25zdGV4cHInIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZXhwbGljaXRfaW5zdGFudGlhdGlvbl9kYXRhX21lbWJlcl9ub3RfaW5zdGFudGlhdGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGxpY2l0IGluc3RhbnRpYXRpb24gcmVmZXJzIHRvIHN0YXRpYyBkYXRhIG1lbWJlciAlcTAgdGhhdCBpcyBub3QgYW4gaW5zdGFudGlhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2V4cGxpY2l0X2luc3RhbnRpYXRpb25fZGVjbGFyYXRpb25fYWZ0ZXJfZGVmaW5pdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBsaWNpdCBpbnN0YW50aWF0aW9uIGRlY2xhcmF0aW9uICh3aXRoICdleHRlcm4nKSBmb2xsb3dzIGV4cGxpY2l0IGluc3RhbnRpYXRpb24gZGVmaW5pdGlvbiAod2l0aG91dCAnZXh0ZXJuJykiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9leHBsaWNpdF9pbnN0YW50aWF0aW9uX2R1cGxpY2F0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkdXBsaWNhdGUgZXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2V4cGxpY2l0X2luc3RhbnRpYXRpb25faW5fY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiAlMCBpbiBjbGFzcyBzY29wZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2V4cGxpY2l0X2luc3RhbnRpYXRpb25faW5saW5lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGxpY2l0IGluc3RhbnRpYXRpb24gY2Fubm90IGJlICdpbmxpbmUnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZXhwbGljaXRfaW5zdGFudGlhdGlvbl9tZW1iZXJfZnVuY3Rpb25fbm90X2luc3RhbnRpYXRlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBsaWNpdCBpbnN0YW50aWF0aW9uIHJlZmVycyB0byBtZW1iZXIgZnVuY3Rpb24gJXEwIHRoYXQgaXMgbm90IGFuIGluc3RhbnRpYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9leHBsaWNpdF9pbnN0YW50aWF0aW9uX211c3RfYmVfZ2xvYmFsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGxpY2l0IGluc3RhbnRpYXRpb24gb2YgJTAgbXVzdCBvY2N1ciBhdCBnbG9iYWwgc2NvcGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9leHBsaWNpdF9pbnN0YW50aWF0aW9uX25vbnRlbXBsYXRlX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiBub24tdGVtcGxhdGVkIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9leHBsaWNpdF9pbnN0YW50aWF0aW9uX25vdF9rbm93biwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBsaWNpdCBpbnN0YW50aWF0aW9uIG9mICUwIGRvZXMgbm90IHJlZmVyIHRvIGEgZnVuY3Rpb24gdGVtcGxhdGUsIHZhcmlhYmxlIHRlbXBsYXRlLCBtZW1iZXIgZnVuY3Rpb24sIG1lbWJlciBjbGFzcywgb3Igc3RhdGljIGRhdGEgbWVtYmVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZXhwbGljaXRfaW5zdGFudGlhdGlvbl9vZl90eXBlZGVmLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGxpY2l0IGluc3RhbnRpYXRpb24gb2YgdHlwZWRlZiAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2V4cGxpY2l0X2luc3RhbnRpYXRpb25fb3V0X29mX3Njb3BlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGxpY2l0IGluc3RhbnRpYXRpb24gb2YgJTAgbm90IGluIGEgbmFtZXNwYWNlIGVuY2xvc2luZyAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2V4cGxpY2l0X2luc3RhbnRpYXRpb25fcmVxdWlyZXNfbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBsaWNpdCBpbnN0YW50aWF0aW9uIGRlY2xhcmF0aW9uIHJlcXVpcmVzIGEgbmFtZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2V4cGxpY2l0X2luc3RhbnRpYXRpb25fc3RvcmFnZV9jbGFzcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBsaWNpdCBpbnN0YW50aWF0aW9uIGNhbm5vdCBoYXZlIGEgc3RvcmFnZSBjbGFzcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2V4cGxpY2l0X2luc3RhbnRpYXRpb25fdW5kZWZpbmVkX2Z1bmNfdGVtcGxhdGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiB1bmRlZmluZWQgZnVuY3Rpb24gdGVtcGxhdGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9leHBsaWNpdF9pbnN0YW50aWF0aW9uX3VuZGVmaW5lZF9tZW1iZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiB1bmRlZmluZWQgJXNlbGVjdHttZW1iZXIgY2xhc3N8bWVtYmVyIGZ1bmN0aW9ufHN0YXRpYyBkYXRhIG1lbWJlcn0wICUxIG9mIGNsYXNzIHRlbXBsYXRlICUyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZXhwbGljaXRfaW5zdGFudGlhdGlvbl91bmRlZmluZWRfdmFyX3RlbXBsYXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGxpY2l0IGluc3RhbnRpYXRpb24gb2YgdW5kZWZpbmVkIHZhcmlhYmxlIHRlbXBsYXRlICVxMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2V4cGxpY2l0X2luc3RhbnRpYXRpb25fdW5xdWFsaWZpZWRfd3JvbmdfbmFtZXNwYWNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGxpY2l0IGluc3RhbnRpYXRpb24gb2YgJXEwIG11c3Qgb2NjdXIgaW4gbmFtZXNwYWNlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZXhwbGljaXRfaW5zdGFudGlhdGlvbl93aXRob3V0X3RlbXBsYXRlX2lkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGxpY2l0IGluc3RhbnRpYXRpb24gb2YgJXEwIG11c3Qgc3BlY2lmeSBhIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9leHBsaWNpdF9ub25fY3Rvcl9vcl9jb252X2Z1bmN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidleHBsaWNpdCcgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBhIGNvbnN0cnVjdG9yIG9yIGNvbnZlcnNpb24gZnVuY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9leHBsaWNpdF9ub25fZnVuY3Rpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ2V4cGxpY2l0JyBjYW4gb25seSBhcHBlYXIgb24gbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZXhwbGljaXRfb3V0X29mX2NsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidleHBsaWNpdCcgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGluc2lkZSB0aGUgY2xhc3MgZGVmaW5pdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2V4cGxpY2l0X3NwZWNpYWxpemF0aW9uX2luY29uc2lzdGVudF9zdG9yYWdlX2NsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGhhcyBleHRyYW5lb3VzLCBpbmNvbnNpc3RlbnQgc3RvcmFnZSBjbGFzcyAnJXNlbGVjdHtub25lfGV4dGVybnxzdGF0aWN8X19wcml2YXRlX2V4dGVybl9ffGF1dG98cmVnaXN0ZXJ9MCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9leHBvcnRfbm90X2luX21vZHVsZV9pbnRlcmZhY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwb3J0IGRlY2xhcmF0aW9uIGNhbiBvbmx5IGJlIHVzZWQgd2l0aGluIGEgbW9kdWxlIGludGVyZmFjZSB1bml0IGFmdGVyIHRoZSBtb2R1bGUgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEzKQorRElBRyhlcnJfZXhwb3J0X3dpdGhpbl9leHBvcnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwb3J0IGRlY2xhcmF0aW9uIGFwcGVhcnMgd2l0aGluIGFub3RoZXIgZXhwb3J0IGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMykKK0RJQUcoZXJyX2V4cHJfbm90X2NjZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2Nhc2UgdmFsdWV8ZW51bWVyYXRvciB2YWx1ZXxub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudHxhcnJheSBzaXplfGNvbnN0ZXhwciBpZiBjb25kaXRpb259MCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZXhwcl9ub3RfaWNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cHJlc3Npb24gaXMgbm90IGFuICVzZWxlY3R7aW50ZWdlcnxpbnRlZ3JhbH0wIGNvbnN0YW50IGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9leHByX25vdF9zdHJpbmdfbGl0ZXJhbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHByZXNzaW9uIGlzIG5vdCBhIHN0cmluZyBsaXRlcmFsIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZXh0X3ZlY3Rvcl9jb21wb25lbnRfZXhjZWVkc19sZW5ndGgsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmVjdG9yIGNvbXBvbmVudCBhY2Nlc3MgZXhjZWVkcyB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZXh0X3ZlY3Rvcl9jb21wb25lbnRfbmFtZV9pbGxlZ2FsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImlsbGVnYWwgdmVjdG9yIGNvbXBvbmVudCBuYW1lICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9leHRlcm5fY19nbG9iYWxfY29uZmxpY3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVjbGFyYXRpb24gb2YgJTEgJXNlbGVjdHt3aXRoIEMgbGFuZ3VhZ2UgbGlua2FnZXxpbiBnbG9iYWwgc2NvcGV9MCBjb25mbGljdHMgd2l0aCBkZWNsYXJhdGlvbiAlc2VsZWN0e2luIGdsb2JhbCBzY29wZXx3aXRoIEMgbGFuZ3VhZ2UgbGlua2FnZX0wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZXh0ZXJuX25vbl9leHRlcm4sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXh0ZXJuIGRlY2xhcmF0aW9uIG9mICUwIGZvbGxvd3Mgbm9uLWV4dGVybiBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZhbGxvZmZfbm9udm9pZF9ibG9jaywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb250cm9sIHJlYWNoZXMgZW5kIG9mIG5vbi12b2lkIGJsb2NrIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZmFsbHRocm91Z2hfYXR0cl9pbnZhbGlkX3BsYWNlbWVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmYWxsdGhyb3VnaCBhbm5vdGF0aW9uIGRvZXMgbm90IGRpcmVjdGx5IHByZWNlZGUgc3dpdGNoIGxhYmVsIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZmFsbHRocm91Z2hfYXR0cl9vdXRzaWRlX3N3aXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmYWxsdGhyb3VnaCBhbm5vdGF0aW9uIGlzIG91dHNpZGUgc3dpdGNoIHN0YXRlbWVudCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZhbGx0aHJvdWdoX2F0dHJfd3JvbmdfdGFyZ2V0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGF0dHJpYnV0ZSBpcyBvbmx5IGFsbG93ZWQgb24gZW1wdHkgc3RhdGVtZW50cyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZpZWxkX2RlY2xhcmVkX2FzX2Z1bmN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZpZWxkICUwIGRlY2xhcmVkIGFzIGEgZnVuY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9maWVsZF9kZXNpZ25hdG9yX25vbl9hZ2dyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZpZWxkIGRlc2lnbmF0b3IgY2Fubm90IGluaXRpYWxpemUgYSAlc2VsZWN0e25vbi1zdHJ1Y3QsIG5vbi11bmlvbnxub24tY2xhc3N9MCB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZmllbGRfZGVzaWduYXRvcl9ub25maWVsZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmaWVsZCBkZXNpZ25hdG9yICUwIGRvZXMgbm90IHJlZmVyIHRvIGEgbm9uLXN0YXRpYyBkYXRhIG1lbWJlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZpZWxkX2Rlc2lnbmF0b3JfdW5rbm93biwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmaWVsZCBkZXNpZ25hdG9yICUwIGRvZXMgbm90IHJlZmVyIHRvIGFueSBmaWVsZCBpbiB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZmllbGRfZGVzaWduYXRvcl91bmtub3duX3N1Z2dlc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZmllbGQgZGVzaWduYXRvciAlMCBkb2VzIG5vdCByZWZlciB0byBhbnkgZmllbGQgaW4gdHlwZSAlMTsgZGlkIHlvdSBtZWFuICUyPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZpZWxkX2luY29tcGxldGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZmllbGQgaGFzIGluY29tcGxldGUgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZpZWxkX2luc3RhbnRpYXRlc190b19mdW5jdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkYXRhIG1lbWJlciBpbnN0YW50aWF0ZWQgd2l0aCBmdW5jdGlvbiB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZmllbGRfd2l0aF9hZGRyZXNzX3NwYWNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZpZWxkIG1heSBub3QgYmUgcXVhbGlmaWVkIHdpdGggYW4gYWRkcmVzcyBzcGFjZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZpbHRlcl9leHByZXNzaW9uX2ludGVncmFsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZpbHRlciBleHByZXNzaW9uIHR5cGUgc2hvdWxkIGJlIGFuIGludGVncmFsIHZhbHVlIG5vdCAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZpbmFsX2Z1bmN0aW9uX292ZXJyaWRkZW4sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVjbGFyYXRpb24gb2YgJTAgb3ZlcnJpZGVzIGEgJyVzZWxlY3R7ZmluYWx8c2VhbGVkfTEnIGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZmlyc3RfYXJndW1lbnRfdG9fY3dzY19ibG9ja19jYWxsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZpcnN0IGFyZ3VtZW50IHRvIF9fYnVpbHRpbl9jYWxsX3dpdGhfc3RhdGljX2NoYWluIG11c3Qgbm90IGJlIGEgYmxvY2sgY2FsbCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZpcnN0X2FyZ3VtZW50X3RvX2N3c2NfYnVpbHRpbl9jYWxsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZpcnN0IGFyZ3VtZW50IHRvIF9fYnVpbHRpbl9jYWxsX3dpdGhfc3RhdGljX2NoYWluIG11c3Qgbm90IGJlIGEgYnVpbHRpbiBjYWxsIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZmlyc3RfYXJndW1lbnRfdG9fY3dzY19ub3RfY2FsbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmaXJzdCBhcmd1bWVudCB0byBfX2J1aWx0aW5fY2FsbF93aXRoX3N0YXRpY19jaGFpbiBtdXN0IGJlIGEgbm9uLW1lbWJlciBjYWxsIGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9maXJzdF9hcmd1bWVudF90b19jd3NjX3BkdG9yX2NhbGwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZmlyc3QgYXJndW1lbnQgdG8gX19idWlsdGluX2NhbGxfd2l0aF9zdGF0aWNfY2hhaW4gbXVzdCBub3QgYmUgYSBwc2V1ZG8tZGVzdHJ1Y3RvciBjYWxsIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZmlyc3RfYXJndW1lbnRfdG9fdmFfYXJnX25vdF9vZl90eXBlX3ZhX2xpc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZmlyc3QgYXJndW1lbnQgdG8gJ3ZhX2FyZycgaXMgb2YgdHlwZSAlMCBhbmQgbm90ICd2YV9saXN0JyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZsZXhpYmxlX2FycmF5X2FyY19yZXRhaW5hYmxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIkFSQyBmb3JiaWRzIGZsZXhpYmxlIGFycmF5IG1lbWJlcnMgd2l0aCByZXRhaW5hYmxlIG9iamVjdCB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZmxleGlibGVfYXJyYXlfZW1wdHlfYWdncmVnYXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZsZXhpYmxlIGFycmF5IG1lbWJlciAlMCBub3QgYWxsb3dlZCBpbiBvdGhlcndpc2UgZW1wdHkgJXNlbGVjdHtzdHJ1Y3R8aW50ZXJmYWNlfHVuaW9ufGNsYXNzfGVudW19MSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZsZXhpYmxlX2FycmF5X2hhc19ub250cml2aWFsX2R0b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZmxleGlibGUgYXJyYXkgbWVtYmVyICUwIG9mIHR5cGUgJTEgd2l0aCBub24tdHJpdmlhbCBkZXN0cnVjdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZsZXhpYmxlX2FycmF5X2luaXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5pdGlhbGl6YXRpb24gb2YgZmxleGlibGUgYXJyYXkgbWVtYmVyIGlzIG5vdCBhbGxvd2VkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZmxleGlibGVfYXJyYXlfaW5pdF9uZWVkc19icmFjZXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZmxleGlibGUgYXJyYXkgcmVxdWlyZXMgYnJhY2UtZW5jbG9zZWQgaW5pdGlhbGl6ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mbGV4aWJsZV9hcnJheV9ub3RfYXRfZW5kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZsZXhpYmxlIGFycmF5IG1lbWJlciAlMCB3aXRoIHR5cGUgJTEgaXMgbm90IGF0IHRoZSBlbmQgb2YgJXNlbGVjdHtzdHJ1Y3R8aW50ZXJmYWNlfHVuaW9ufGNsYXNzfGVudW19MiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZsZXhpYmxlX2FycmF5X3VuaW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZsZXhpYmxlIGFycmF5IG1lbWJlciAlMCBpbiBhIHVuaW9uIGlzIG5vdCBhbGxvd2VkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZmxleGlibGVfYXJyYXlfdmlydHVhbF9iYXNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZsZXhpYmxlIGFycmF5IG1lbWJlciAlMCBub3QgYWxsb3dlZCBpbiAlc2VsZWN0e3N0cnVjdHxpbnRlcmZhY2V8dW5pb258Y2xhc3N8ZW51bX0xIHdoaWNoIGhhcyBhIHZpcnR1YWwgYmFzZSBjbGFzcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZvbGRfZXhwcmVzc2lvbl9iYWRfb3BlcmFuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHByZXNzaW9uIG5vdCBwZXJtaXR0ZWQgYXMgb3BlcmFuZCBvZiBmb2xkIGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mb2xkX2V4cHJlc3Npb25fZW1wdHksIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5hcnkgZm9sZCBleHByZXNzaW9uIGhhcyBlbXB0eSBleHBhbnNpb24gZm9yIG9wZXJhdG9yICclMCcgd2l0aCBubyBmYWxsYmFjayB2YWx1ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZvbGRfZXhwcmVzc2lvbl9wYWNrc19ib3RoX3NpZGVzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImJpbmFyeSBmb2xkIGV4cHJlc3Npb24gaGFzIHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2tzIGluIGJvdGggb3BlcmFuZHMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mb3JfcmFuZ2VfZGVjbF9tdXN0X2JlX3ZhciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmb3IgcmFuZ2UgZGVjbGFyYXRpb24gbXVzdCBkZWNsYXJlIGEgdmFyaWFibGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mb3JfcmFuZ2VfZGVkdWN0aW9uX2ZhaWx1cmUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHVzZSB0eXBlICUwIGFzIGEgcmFuZ2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mb3JfcmFuZ2VfZGVyZWZlcmVuY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCByYW5nZSBleHByZXNzaW9uIG9mIHR5cGUgJTA7IGRpZCB5b3UgbWVhbiB0byBkZXJlZmVyZW5jZSBpdCB3aXRoICcqJz8iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mb3JfcmFuZ2VfaW5jb21wbGV0ZV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCB1c2UgaW5jb21wbGV0ZSB0eXBlICUwIGFzIGEgcmFuZ2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mb3JfcmFuZ2VfaW52YWxpZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIHJhbmdlIGV4cHJlc3Npb24gb2YgdHlwZSAlMDsgbm8gdmlhYmxlICclc2VsZWN0e2JlZ2lufGVuZH0xJyBmdW5jdGlvbiBhdmFpbGFibGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mb3JfcmFuZ2VfaXRlcl9kZWR1Y3Rpb25fZmFpbHVyZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgdXNlIHR5cGUgJTAgYXMgYW4gaXRlcmF0b3IiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mb3JfcmFuZ2VfbWVtYmVyX2JlZ2luX2VuZF9taXNtYXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyYW5nZSB0eXBlICUwIGhhcyAnJXNlbGVjdHtiZWdpbnxlbmR9MScgbWVtYmVyIGJ1dCBubyAnJXNlbGVjdHtlbmR8YmVnaW59MScgbWVtYmVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZm9yX3JhbmdlX3N0b3JhZ2VfY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibG9vcCB2YXJpYWJsZSAlMCBtYXkgbm90IGJlIGRlY2xhcmVkICVzZWxlY3R7J2V4dGVybid8J3N0YXRpYyd8J19fcHJpdmF0ZV9leHRlcm5fXyd8J2F1dG8nfCdyZWdpc3Rlcid8J2NvbnN0ZXhwcid9MSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Zvcm1hdF9hdHRyaWJ1dGVfaW1wbGljaXRfdGhpc19mb3JtYXRfc3RyaW5nLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZvcm1hdCBhdHRyaWJ1dGUgY2Fubm90IHNwZWNpZnkgdGhlIGltcGxpY2l0IHRoaXMgYXJndW1lbnQgYXMgdGhlIGZvcm1hdCBzdHJpbmciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mb3JtYXRfYXR0cmlidXRlX25vdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmb3JtYXQgYXJndW1lbnQgbm90ICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZm9ybWF0X2F0dHJpYnV0ZV9yZXF1aXJlc192YXJpYWRpYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmb3JtYXQgYXR0cmlidXRlIHJlcXVpcmVzIHZhcmlhZGljIGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZm9ybWF0X2F0dHJpYnV0ZV9yZXN1bHRfbm90LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2Zvcm1hdF9zdHJmdGltZV90aGlyZF9wYXJhbWV0ZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic3RyZnRpbWUgZm9ybWF0IGF0dHJpYnV0ZSByZXF1aXJlcyAzcmQgcGFyYW1ldGVyIHRvIGJlIDAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mb3J3YXJkX3JlZl9lbnVtLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIklTTyBDKysgZm9yYmlkcyBmb3J3YXJkIHJlZmVyZW5jZXMgdG8gJ2VudW0nIHR5cGVzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZm9yd2FyZF9zdXBlcmNsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImF0dGVtcHRpbmcgdG8gdXNlIHRoZSBmb3J3YXJkIGNsYXNzICUwIGFzIHN1cGVyY2xhc3Mgb2YgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mcmllbmRfZGVjbF9kb2VzX25vdF9tYXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmcmllbmQgZGVjbGFyYXRpb24gb2YgJTAgZG9lcyBub3QgbWF0Y2ggYW55IGRlY2xhcmF0aW9uIGluICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZnJpZW5kX2RlY2xfc3BlYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInJTAnIGlzIGludmFsaWQgaW4gZnJpZW5kIGRlY2xhcmF0aW9ucyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZyaWVuZF9kZWNsX3dpdGhfZGVmX2FyZ19tdXN0X2JlX2RlZiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmcmllbmQgZGVjbGFyYXRpb24gc3BlY2lmeWluZyBhIGRlZmF1bHQgYXJndW1lbnQgbXVzdCBiZSBhIGRlZmluaXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mcmllbmRfZGVjbF93aXRoX2RlZl9hcmdfcmVkZWNsYXJlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmcmllbmQgZGVjbGFyYXRpb24gc3BlY2lmeWluZyBhIGRlZmF1bHQgYXJndW1lbnQgbXVzdCBiZSB0aGUgb25seSBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZyaWVuZF9kZWZfaW5fbG9jYWxfY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZnJpZW5kIGZ1bmN0aW9uIGNhbm5vdCBiZSBkZWZpbmVkIGluIGEgbG9jYWwgY2xhc3MiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mcmllbmRfaXNfbWVtYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZyaWVuZHMgY2Fubm90IGJlIG1lbWJlcnMgb2YgdGhlIGRlY2xhcmluZyBjbGFzcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ZyaWVuZF9ub3RfZmlyc3RfaW5fZGVjbGFyYXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ2ZyaWVuZCcgbXVzdCBhcHBlYXIgZmlyc3QgaW4gYSBub24tZnVuY3Rpb24gZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mdW5jX2RlZl9pbmNvbXBsZXRlX3Jlc3VsdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbmNvbXBsZXRlIHJlc3VsdCB0eXBlICUwIGluIGZ1bmN0aW9uIGRlZmluaXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mdW5jX3JldHVybmluZ19hcnJheV9mdW5jdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmdW5jdGlvbiBjYW5ub3QgcmV0dXJuICVzZWxlY3R7YXJyYXl8ZnVuY3Rpb259MCB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZnVuY19yZXR1cm5pbmdfcXVhbGlmaWVkX3ZvaWQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZnVuY3Rpb24gY2Fubm90IHJldHVybiBxdWFsaWZpZWQgdm9pZCB0eXBlICUwIiwgNTI2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXJyX2Z1bmN0aW9uX2F0dHJpYnV0ZV9taXNtYXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmdW5jdGlvbiBkZWNsYXJlZCB3aXRoICUwIGF0dHJpYnV0ZSB3YXMgcHJldmlvdXNseSBkZWNsYXJlZCB3aXRob3V0IHRoZSAlMCBhdHRyaWJ1dGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mdW5jdGlvbl9jb25jZXB0X2Jvb2xfcmV0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlY2xhcmVkIHJldHVybiB0eXBlIG9mIGZ1bmN0aW9uIGNvbmNlcHQgbXVzdCBiZSAnYm9vbCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mdW5jdGlvbl9jb25jZXB0X2V4Y2VwdGlvbl9zcGVjLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZ1bmN0aW9uIGNvbmNlcHQgY2Fubm90IGhhdmUgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mdW5jdGlvbl9jb25jZXB0X25vdF9kZWZpbmVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZ1bmN0aW9uIGNvbmNlcHQgZGVjbGFyYXRpb24gbXVzdCBiZSBhIGRlZmluaXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mdW5jdGlvbl9jb25jZXB0X3dpdGhfcGFyYW1zLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZ1bmN0aW9uIGNvbmNlcHQgY2Fubm90IGhhdmUgYW55IHBhcmFtZXRlcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mdW5jdGlvbl9tYXJrZWRfb3ZlcnJpZGVfbm90X292ZXJyaWRpbmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgbWFya2VkICdvdmVycmlkZScgYnV0IGRvZXMgbm90IG92ZXJyaWRlIGFueSBtZW1iZXIgZnVuY3Rpb25zIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZnVuY3Rpb25fbmVlZHNfZmVhdHVyZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhbHdheXNfaW5saW5lIGZ1bmN0aW9uICUxIHJlcXVpcmVzIHRhcmdldCBmZWF0dXJlICclMicsIGJ1dCB3b3VsZCBiZSBpbmxpbmVkIGludG8gZnVuY3Rpb24gJTAgdGhhdCBpcyBjb21waWxlZCB3aXRob3V0IHN1cHBvcnQgZm9yICclMiciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mdW5jdGlvbl9wYXJhbWV0ZXJfcGFja193aXRob3V0X3BhcmFtZXRlcl9wYWNrcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlICUwIG9mIGZ1bmN0aW9uIHBhcmFtZXRlciBwYWNrIGRvZXMgbm90IGNvbnRhaW4gYW55IHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2tzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZnVuY3Rpb25fdGVtcGxhdGVfcGFydGlhbF9zcGVjLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZ1bmN0aW9uIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaXMgbm90IGFsbG93ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9mdW5jdGlvbl90ZW1wbGF0ZV9zcGVjX2FtYmlndW91cywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiAlMCBhbWJpZ3VvdXNseSByZWZlcnMgdG8gbW9yZSB0aGFuIG9uZSBmdW5jdGlvbiB0ZW1wbGF0ZTsgZXhwbGljaXRseSBzcGVjaWZ5JXNlbGVjdHt8IGFkZGl0aW9uYWx9MSB0ZW1wbGF0ZSBhcmd1bWVudHMgdG8gaWRlbnRpZnkgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIHRlbXBsYXRlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZnVuY3Rpb25fdGVtcGxhdGVfc3BlY19ub19tYXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyBmdW5jdGlvbiB0ZW1wbGF0ZSBtYXRjaGVzIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfZ2Nfd2Vha19wcm9wZXJ0eV9zdHJvbmdfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ3ZWFrIGF0dHJpYnV0ZSBkZWNsYXJlZCBvbiBhIF9fc3Ryb25nIHR5cGUgcHJvcGVydHkgaW4gR0MgbW9kZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2dlbmVyaWNfc2VsX211bHRpX21hdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbnRyb2xsaW5nIGV4cHJlc3Npb24gdHlwZSAlMCBjb21wYXRpYmxlIHdpdGggJTEgZ2VuZXJpYyBhc3NvY2lhdGlvbiB0eXBlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2dlbmVyaWNfc2VsX25vX21hdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbnRyb2xsaW5nIGV4cHJlc3Npb24gdHlwZSAlMCBub3QgY29tcGF0aWJsZSB3aXRoIGFueSBnZW5lcmljIGFzc29jaWF0aW9uIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9nZXR0ZXJfbm90X2ZvdW5kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIGdldHRlciBtZXRob2QgZm9yIHJlYWQgZnJvbSBwcm9wZXJ0eSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2dsb2JhbF9jYWxsX25vdF9jb25maWcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2FsbCB0byBnbG9iYWwgZnVuY3Rpb24gJTAgbm90IGNvbmZpZ3VyZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9nb3RvX2ludG9fcHJvdGVjdGVkX3Njb3BlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBqdW1wIGZyb20gdGhpcyBnb3RvIHN0YXRlbWVudCB0byBpdHMgbGFiZWwiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9nb3RvX21zX2FzbV9sYWJlbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QganVtcCBmcm9tIHRoaXMgZ290byBzdGF0ZW1lbnQgdG8gbGFiZWwgJTAgaW5zaWRlIGFuIGlubGluZSBhc3NlbWJseSBibG9jayIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2hhbGZfY29uc3RfcmVxdWlyZXNfZnAxNiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJoYWxmIHByZWNpc2lvbiBjb25zdGFudCByZXF1aXJlcyBjbF9raHJfZnAxNiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2lib3V0bGV0Y29sbGVjdGlvbl9idWlsdGludHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlIGFyZ3VtZW50IG9mIGlib3V0bGV0Y29sbGVjdGlvbiBhdHRyaWJ1dGUgY2Fubm90IGJlIGEgYnVpbHRpbiB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaWJvdXRsZXRjb2xsZWN0aW9uX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCB0eXBlICUwIGFzIGFyZ3VtZW50IG9mIGlib3V0bGV0Y29sbGVjdGlvbiBhdHRyaWJ1dGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pY2VfYW1iaWd1b3VzX2NvbnZlcnNpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYW1iaWd1b3VzIGNvbnZlcnNpb24gZnJvbSB0eXBlICUwIHRvIGFuIGludGVncmFsIG9yIHVuc2NvcGVkIGVudW1lcmF0aW9uIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pY2VfZXhwbGljaXRfY29udmVyc2lvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnRlZ3JhbCBjb25zdGFudCBleHByZXNzaW9uIHJlcXVpcmVzIGV4cGxpY2l0IGNvbnZlcnNpb24gZnJvbSAlMCB0byAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ljZV9pbmNvbXBsZXRlX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW50ZWdyYWwgY29uc3RhbnQgZXhwcmVzc2lvbiBoYXMgaW5jb21wbGV0ZSBjbGFzcyB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaWNlX25vdF9pbnRlZ3JhbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnRlZ3JhbCBjb25zdGFudCBleHByZXNzaW9uIG11c3QgaGF2ZSBpbnRlZ3JhbCBvciB1bnNjb3BlZCBlbnVtZXJhdGlvbiB0eXBlLCBub3QgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pY2VfdG9vX2xhcmdlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludGVnZXIgY29uc3RhbnQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdmFsdWUgJTAgdGhhdCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gYSAlMS1iaXQgJXNlbGVjdHtzaWduZWR8dW5zaWduZWR9MiBpbnRlZ2VyIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pZGVudF9pbl9kdG9yX25vdF9hX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaWRlbnRpZmllciAlMCBpbiBvYmplY3QgZGVzdHJ1Y3Rpb24gZXhwcmVzc2lvbiBkb2VzIG5vdCBuYW1lIGEgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2lkZW50X2xpc3RfaW5fZm5fZGVjbGFyYXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYSBwYXJhbWV0ZXIgbGlzdCB3aXRob3V0IHR5cGVzIGlzIG9ubHkgYWxsb3dlZCBpbiBhIGZ1bmN0aW9uIGRlZmluaXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pZnVuY19yZXNvbHZlcl9wYXJhbXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaWZ1bmMgcmVzb2x2ZXIgZnVuY3Rpb24gbXVzdCBoYXZlIG5vIHBhcmFtZXRlcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pZnVuY19yZXNvbHZlcl9yZXR1cm4sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaWZ1bmMgcmVzb2x2ZXIgZnVuY3Rpb24gbXVzdCByZXR1cm4gYSBwb2ludGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaWxsZWdhbF9jb250YWluZXJfc3Vic2NyaXB0aW5nX29wLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImlsbGVnYWwgb3BlcmF0aW9uIG9uIE9iamVjdGl2ZS1DIGNvbnRhaW5lciBzdWJzY3JpcHRpbmciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbGxlZ2FsX2RlY2xfYXJyYXlfaW5jb21wbGV0ZV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFycmF5IGhhcyBpbmNvbXBsZXRlIGVsZW1lbnQgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2lsbGVnYWxfZGVjbF9hcnJheV9vZl9hdXRvLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiclMCcgZGVjbGFyZWQgYXMgYXJyYXkgb2YgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbGxlZ2FsX2RlY2xfYXJyYXlfb2ZfZnVuY3Rpb25zLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiclMCcgZGVjbGFyZWQgYXMgYXJyYXkgb2YgZnVuY3Rpb25zIG9mIHR5cGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbGxlZ2FsX2RlY2xfYXJyYXlfb2ZfcmVmZXJlbmNlcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInJTAnIGRlY2xhcmVkIGFzIGFycmF5IG9mIHJlZmVyZW5jZXMgb2YgdHlwZSAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2lsbGVnYWxfZGVjbF9tZW1wb2ludGVyX2luX25vbmNsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiclMCcgZG9lcyBub3QgcG9pbnQgaW50byBhIGNsYXNzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaWxsZWdhbF9kZWNsX21lbXBvaW50ZXJfdG9fcmVmZXJlbmNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiclMCcgZGVjbGFyZWQgYXMgYSBtZW1iZXIgcG9pbnRlciB0byBhIHJlZmVyZW5jZSBvZiB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaWxsZWdhbF9kZWNsX21lbXBvaW50ZXJfdG9fdm9pZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInJTAnIGRlY2xhcmVkIGFzIGEgbWVtYmVyIHBvaW50ZXIgdG8gdm9pZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2lsbGVnYWxfZGVjbF9wb2ludGVyX3RvX3JlZmVyZW5jZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInJTAnIGRlY2xhcmVkIGFzIGEgcG9pbnRlciB0byBhIHJlZmVyZW5jZSBvZiB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaWxsZWdhbF9pbml0aWFsaXplciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbGxlZ2FsIGluaXRpYWxpemVyIChvbmx5IHZhcmlhYmxlcyBjYW4gYmUgaW5pdGlhbGl6ZWQpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaWxsZWdhbF9pbml0aWFsaXplcl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImlsbGVnYWwgaW5pdGlhbGl6ZXIgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2lsbGVnYWxfbWVzc2FnZV9leHByX2luY29tcGxldGVfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJPYmplY3RpdmUtQyBtZXNzYWdlIGhhcyBpbmNvbXBsZXRlIHJlc3VsdCB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaWxsZWdhbF9xdWFsaWZpZXJzX29uX2NhdGNoX3Bhcm0sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaWxsZWdhbCBxdWFsaWZpZXJzIG9uIEBjYXRjaCBwYXJhbWV0ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbGxlZ2FsX3VuaW9uX29yX2Fub25fc3RydWN0X21lbWJlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2Fub255bW91cyBzdHJ1Y3R8dW5pb259MCBtZW1iZXIgJTEgaGFzIGEgbm9uLXRyaXZpYWwgJXNlbGVjdHtjb25zdHJ1Y3Rvcnxjb3B5IGNvbnN0cnVjdG9yfG1vdmUgY29uc3RydWN0b3J8Y29weSBhc3NpZ25tZW50IG9wZXJhdG9yfG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcnxkZXN0cnVjdG9yfTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbWFnaW5hcnlfbm90X3N1cHBvcnRlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbWFnaW5hcnkgdHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbXBjYXN0X2NvbXBsZXhfc2NhbGFyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSAlMCB0byAlMSBpcyBub3QgcGVybWl0dGVkIGluIEMrKyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ltcGxpY2l0X2Nvcm91dGluZV9zdGRfbm90aHJvd190eXBlX25vdF9mb3VuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJzdGQ6Om5vdGhyb3cgd2FzIG5vdCBmb3VuZDsgaW5jbHVkZSA8bmV3PiBiZWZvcmUgZGVmaW5pbmcgYSBjb3JvdXRpbmUgd2hpY2ggdXNlcyBnZXRfcmV0dXJuX29iamVjdF9vbl9hbGxvY2F0aW9uX2ZhaWx1cmUoKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTQpCitESUFHKGVycl9pbXBsaWNpdF9lbXB0eV9pbml0aWFsaXplciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbml0aWFsaXplciBmb3IgYWdncmVnYXRlIHdpdGggbm8gZWxlbWVudHMgcmVxdWlyZXMgZXhwbGljaXQgYnJhY2VzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW1wbGljaXRfaW5zdGFudGlhdGVfbWVtYmVyX3VuZGVmaW5lZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbXBsaWNpdCBpbnN0YW50aWF0aW9uIG9mIHVuZGVmaW5lZCBtZW1iZXIgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbXBsaWVkX2Nvcm91dGluZV90eXBlX25vdF9mb3VuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCB0eXBlIHdhcyBub3QgZm91bmQ7IGluY2x1ZGUgPGV4cGVyaW1lbnRhbC9jb3JvdXRpbmU+IGJlZm9yZSBkZWZpbmluZyBhIGNvcm91dGluZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTQpCitESUFHKGVycl9pbXBsaWVkX3N0ZF9jb3JvdXRpbmVfdHJhaXRzX3Byb21pc2VfdHlwZV9ub3RfY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgYSBjb3JvdXRpbmU6ICUwIGlzIG5vdCBhIGNsYXNzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNCkKK0RJQUcoZXJyX2ltcGxpZWRfc3RkX2Nvcm91dGluZV90cmFpdHNfcHJvbWlzZV90eXBlX25vdF9mb3VuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBhIGNvcm91dGluZTogJXEwIGhhcyBubyBtZW1iZXIgbmFtZWQgJ3Byb21pc2VfdHlwZSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE0KQorRElBRyhlcnJfaW1wbGllZF9zdGRfaW5pdGlhbGl6ZXJfbGlzdF9ub3RfZm91bmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGRlZHVjZSB0eXBlIG9mIGluaXRpYWxpemVyIGxpc3QgYmVjYXVzZSBzdGQ6OmluaXRpYWxpemVyX2xpc3Qgd2FzIG5vdCBmb3VuZDsgaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbl9jbGFzc19pbml0aWFsaXplcl9iYWRfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJzdGF0aWMgZGF0YSBtZW1iZXIgb2YgdHlwZSAlMCBtdXN0IGJlIGluaXRpYWxpemVkIG91dCBvZiBsaW5lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW5fY2xhc3NfaW5pdGlhbGl6ZXJfY3ljbGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVmYXVsdCBtZW1iZXIgaW5pdGlhbGl6ZXIgZm9yICUwIHVzZXMgaXRzZWxmIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW5fY2xhc3NfaW5pdGlhbGl6ZXJfbGl0ZXJhbF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluLWNsYXNzIGluaXRpYWxpemVyIGZvciBzdGF0aWMgZGF0YSBtZW1iZXIgb2YgdHlwZSAlMCByZXF1aXJlcyAnY29uc3RleHByJyBzcGVjaWZpZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbl9jbGFzc19pbml0aWFsaXplcl9ub25fY29uc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm9uLWNvbnN0IHN0YXRpYyBkYXRhIG1lbWJlciBtdXN0IGJlIGluaXRpYWxpemVkIG91dCBvZiBsaW5lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW5fY2xhc3NfaW5pdGlhbGl6ZXJfbm9uX2NvbnN0YW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluLWNsYXNzIGluaXRpYWxpemVyIGZvciBzdGF0aWMgZGF0YSBtZW1iZXIgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2luX2NsYXNzX2luaXRpYWxpemVyX25vdF95ZXRfcGFyc2VkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZmF1bHQgbWVtYmVyIGluaXRpYWxpemVyIGZvciAlMSBuZWVkZWQgd2l0aGluIGRlZmluaXRpb24gb2YgZW5jbG9zaW5nIGNsYXNzICUwIG91dHNpZGUgb2YgbWVtYmVyIGZ1bmN0aW9ucyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2luX2NsYXNzX2luaXRpYWxpemVyX3ZvbGF0aWxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN0YXRpYyBjb25zdCB2b2xhdGlsZSBkYXRhIG1lbWJlciBtdXN0IGJlIGluaXRpYWxpemVkIG91dCBvZiBsaW5lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW5jb21wYXRpYmxlX2V4Y2VwdGlvbl9zcGVjcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0YXJnZXQgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gaXMgbm90IHN1cGVyc2V0IG9mIHNvdXJjZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2luY29tcGxldGVfYmFzZV9jbGFzcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJiYXNlIGNsYXNzIGhhcyBpbmNvbXBsZXRlIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbmNvbXBsZXRlX2luX2V4Y2VwdGlvbl9zcGVjLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7fHBvaW50ZXIgdG8gfHJlZmVyZW5jZSB0byB9MGluY29tcGxldGUgdHlwZSAlMSBpcyBub3QgYWxsb3dlZCBpbiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2luY29tcGxldGVfbWVtYmVyX2FjY2VzcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtZW1iZXIgYWNjZXNzIGludG8gaW5jb21wbGV0ZSB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW5jb21wbGV0ZV9uZXN0ZWRfbmFtZV9zcGVjLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluY29tcGxldGUgdHlwZSAlMCBuYW1lZCBpbiBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbmNvbXBsZXRlX29iamVjdF9jYWxsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluY29tcGxldGUgdHlwZSBpbiBjYWxsIHRvIG9iamVjdCBvZiB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW5jb21wbGV0ZV9yZWNlaXZlcl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluY29tcGxldGUgcmVjZWl2ZXIgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2luY29tcGxldGVfc3ludGhlc2l6ZWRfcHJvcGVydHksIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHN5bnRoZXNpemUgcHJvcGVydHkgJTAgd2l0aCBpbmNvbXBsZXRlIHR5cGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbmNvbXBsZXRlX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5jb21wbGV0ZSB0eXBlICUwIHdoZXJlIGEgY29tcGxldGUgdHlwZSBpcyByZXF1aXJlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2luY29tcGxldGVfdHlwZV9vYmpjX2F0X2VuY29kZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInQGVuY29kZScgb2YgaW5jb21wbGV0ZSB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW5jb21wbGV0ZV90eXBlX3VzZWRfaW5fdHlwZV90cmFpdF9leHByLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluY29tcGxldGUgdHlwZSAlMCB1c2VkIGluIHR5cGUgdHJhaXQgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2luY29tcGxldGVfdHlwZWlkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIid0eXBlaWQnIG9mIGluY29tcGxldGUgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2luY29uc2lzdGVudF9pdmFyX2NvdW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluY29uc2lzdGVudCBudW1iZXIgb2YgaW5zdGFuY2UgdmFyaWFibGVzIHNwZWNpZmllZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2luY29ycmVjdF9kZWZhdWx0ZWRfY29uc3RleHByLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZmF1bHRlZCBkZWZpbml0aW9uIG9mICVzZWxlY3R7ZGVmYXVsdCBjb25zdHJ1Y3Rvcnxjb3B5IGNvbnN0cnVjdG9yfG1vdmUgY29uc3RydWN0b3J8Y29weSBhc3NpZ25tZW50IG9wZXJhdG9yfG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcn0wIGlzIG5vdCBjb25zdGV4cHIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbmNvcnJlY3RfZGVmYXVsdGVkX2V4Y2VwdGlvbl9zcGVjLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIG9mIGV4cGxpY2l0bHkgZGVmYXVsdGVkICVzZWxlY3R7ZGVmYXVsdCBjb25zdHJ1Y3Rvcnxjb3B5IGNvbnN0cnVjdG9yfG1vdmUgY29uc3RydWN0b3J8Y29weSBhc3NpZ25tZW50IG9wZXJhdG9yfG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcnxkZXN0cnVjdG9yfTAgZG9lcyBub3QgbWF0Y2ggdGhlIGNhbGN1bGF0ZWQgb25lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW5jb3JyZWN0X251bWJlcl9vZl92ZWN0b3JfaW5pdGlhbGl6ZXJzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm51bWJlciBvZiBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBvbmUgb3IgbWF0Y2ggdGhlIHNpemUgb2YgdGhlIHZlY3RvciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2luY3JlbWVudF9kZWNyZW1lbnRfZW51bSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgJXNlbGVjdHtkZWNyZW1lbnR8aW5jcmVtZW50fTAgZXhwcmVzc2lvbiBvZiBlbnVtIHR5cGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbmRpcmVjdF9nb3RvX2luX3Byb3RlY3RlZF9zY29wZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QganVtcCBmcm9tIHRoaXMgaW5kaXJlY3QgZ290byBzdGF0ZW1lbnQgdG8gb25lIG9mIGl0cyBwb3NzaWJsZSB0YXJnZXRzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW5kaXJlY3RfZ290b193aXRob3V0X2FkZHJsYWJlbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbmRpcmVjdCBnb3RvIGluIGZ1bmN0aW9uIHdpdGggbm8gYWRkcmVzcy1vZi1sYWJlbCBleHByZXNzaW9ucyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2luaXRfY2FwdHVyZV9kZWR1Y3Rpb25fZmFpbHVyZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZGVkdWNlIHR5cGUgZm9yIGxhbWJkYSBjYXB0dXJlICUwIGZyb20gaW5pdGlhbGl6ZXIgb2YgdHlwZSAlMiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMykKK0RJQUcoZXJyX2luaXRfY2FwdHVyZV9kZWR1Y3Rpb25fZmFpbHVyZV9mcm9tX2luaXRfbGlzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZGVkdWNlIHR5cGUgZm9yIGxhbWJkYSBjYXB0dXJlICUwIGZyb20gaW5pdGlhbGl6ZXIgbGlzdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMykKK0RJQUcoZXJyX2luaXRfY2FwdHVyZV9tdWx0aXBsZV9leHByZXNzaW9ucywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbml0aWFsaXplciBmb3IgbGFtYmRhIGNhcHR1cmUgJTAgY29udGFpbnMgbXVsdGlwbGUgZXhwcmVzc2lvbnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDMpCitESUFHKGVycl9pbml0X2NhcHR1cmVfbm9fZXhwcmVzc2lvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbml0aWFsaXplciBtaXNzaW5nIGZvciBsYW1iZGEgY2FwdHVyZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMykKK0RJQUcoZXJyX2luaXRfY2FwdHVyZV9wYXJlbl9icmFjZXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGRlZHVjZSB0eXBlIGZvciBsYW1iZGEgY2FwdHVyZSAlMSBmcm9tICVzZWxlY3R7cGFyZW50aGVzaXplZHxuZXN0ZWR9MCBpbml0aWFsaXplciBsaXN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAzKQorRElBRyhlcnJfaW5pdF9jb252ZXJzaW9uX2ZhaWxlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgaW5pdGlhbGl6ZSAlc2VsZWN0e2EgdmFyaWFibGV8YSBwYXJhbWV0ZXJ8cmV0dXJuIG9iamVjdHxhbiBleGNlcHRpb24gb2JqZWN0fGEgbWVtYmVyIHN1Ym9iamVjdHxhbiBhcnJheSBlbGVtZW50fGEgbmV3IHZhbHVlfGEgdmFsdWV8YSBiYXNlIGNsYXNzfGEgY29uc3RydWN0b3IgZGVsZWdhdGlvbnxhIHZlY3RvciBlbGVtZW50fGEgYmxvY2sgZWxlbWVudHxhIGJsb2NrIGVsZW1lbnR8YSBjb21wbGV4IGVsZW1lbnR8YSBsYW1iZGEgY2FwdHVyZXxhIGNvbXBvdW5kIGxpdGVyYWwgaW5pdGlhbGl6ZXJ8YSByZWxhdGVkIHJlc3VsdHxhIHBhcmFtZXRlciBvZiBDRiBhdWRpdGVkIGZ1bmN0aW9ufTAgJWRpZmZ7b2YgdHlwZSAkIHdpdGggYW4gJXNlbGVjdHtydmFsdWV8bHZhbHVlfTIgb2YgdHlwZSAkfHdpdGggYW4gJXNlbGVjdHtydmFsdWV8bHZhbHVlfTIgb2YgaW5jb21wYXRpYmxlIHR5cGV9MSwzJXNlbGVjdHt8OiBkaWZmZXJlbnQgY2xhc3NlcyVkaWZmeyAoJCB2cyAkKXx9NSw2fDogZGlmZmVyZW50IG51bWJlciBvZiBwYXJhbWV0ZXJzICglNSB2cyAlNil8OiB0eXBlIG1pc21hdGNoIGF0ICVvcmRpbmFsNSBwYXJhbWV0ZXIlZGlmZnsgKCQgdnMgJCl8fTYsN3w6IGRpZmZlcmVudCByZXR1cm4gdHlwZSVkaWZmeyAoJCB2cyAkKXx9NSw2fDogZGlmZmVyZW50IHF1YWxpZmllcnMgKCVzZWxlY3R7bm9uZXxjb25zdHxyZXN0cmljdHxjb25zdCBhbmQgcmVzdHJpY3R8dm9sYXRpbGV8Y29uc3QgYW5kIHZvbGF0aWxlfHZvbGF0aWxlIGFuZCByZXN0cmljdHxjb25zdCwgdm9sYXRpbGUsIGFuZCByZXN0cmljdH01IHZzICVzZWxlY3R7bm9uZXxjb25zdHxyZXN0cmljdHxjb25zdCBhbmQgcmVzdHJpY3R8dm9sYXRpbGV8Y29uc3QgYW5kIHZvbGF0aWxlfHZvbGF0aWxlIGFuZCByZXN0cmljdHxjb25zdCwgdm9sYXRpbGUsIGFuZCByZXN0cmljdH02KXw6IGRpZmZlcmVudCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnN9NCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2luaXRfZWxlbWVudF9ub3RfY29uc3RhbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5pdGlhbGl6ZXIgZWxlbWVudCBpcyBub3QgYSBjb21waWxlLXRpbWUgY29uc3RhbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbml0X2Zvcl9mdW5jdGlvbl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBjcmVhdGUgb2JqZWN0IG9mIGZ1bmN0aW9uIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbml0X2luY29tcGxldGVfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbml0aWFsaXphdGlvbiBvZiBpbmNvbXBsZXRlIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbml0X2xpc3RfYmFkX2Rlc3RfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e3xub24tYWdncmVnYXRlIH0wdHlwZSAlMSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhbiBpbml0aWFsaXplciBsaXN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW5pdF9tZXRob2RfYmFkX3JldHVybl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluaXQgbWV0aG9kcyBtdXN0IHJldHVybiBhbiBvYmplY3QgcG9pbnRlciB0eXBlLCBub3QgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbml0X25vbl9hZ2dyX2luaXRfbGlzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbml0aWFsaXphdGlvbiBvZiBub24tYWdncmVnYXRlIHR5cGUgJTAgd2l0aCBhbiBpbml0aWFsaXplciBsaXN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW5pdF9vYmpjX2NsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBpbml0aWFsaXplIE9iamVjdGl2ZS1DIGNsYXNzIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbml0X3ByaW9yaXR5X29iamVjdF9hdHRyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbiBvbmx5IHVzZSAnaW5pdF9wcmlvcml0eScgYXR0cmlidXRlIG9uIGZpbGUtc2NvcGUgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBvZiBjbGFzcyB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW5pdF9yZWZlcmVuY2VfbWVtYmVyX3VuaW5pdGlhbGl6ZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVmZXJlbmNlIG1lbWJlciBvZiB0eXBlICUwIHVuaW5pdGlhbGl6ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbml0aWFsaXplcl9zdHJpbmdfZm9yX2NoYXJfYXJyYXlfdG9vX2xvbmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5pdGlhbGl6ZXItc3RyaW5nIGZvciBjaGFyIGFycmF5IGlzIHRvbyBsb25nIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW5saW5lX2RlY2xfZm9sbG93c19kZWYsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5saW5lIGRlY2xhcmF0aW9uIG9mICUwIGZvbGxvd3Mgbm9uLWlubGluZSBkZWZpbml0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW5saW5lX2RlY2xhcmF0aW9uX2Jsb2NrX3Njb3BlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImlubGluZSBkZWNsYXJhdGlvbiBvZiAlMCBub3QgYWxsb3dlZCBpbiBibG9jayBzY29wZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2lubGluZV9tYWluLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidtYWluJyBpcyBub3QgYWxsb3dlZCB0byBiZSBkZWNsYXJlZCBpbmxpbmUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbmxpbmVfbmFtZXNwYWNlX21pc21hdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vbi1pbmxpbmUgbmFtZXNwYWNlIGNhbm5vdCBiZSByZW9wZW5lZCBhcyBpbmxpbmUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbmxpbmVfbm9uX2Z1bmN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidpbmxpbmUnIGNhbiBvbmx5IGFwcGVhciBvbiBmdW5jdGlvbnMlc2VsZWN0e3wgYW5kIG5vbi1sb2NhbCB2YXJpYWJsZXN9MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ludF90b19ibG9ja19wb2ludGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgYmxvY2sgcG9pbnRlciBjb252ZXJzaW9uICVzZWxlY3R7JWRpZmZ7YXNzaWduaW5nIHRvICQgZnJvbSAkfGFzc2lnbmluZyB0byBkaWZmZXJlbnQgdHlwZXN9MCwxfCVkaWZme3Bhc3NpbmcgJCB0byBwYXJhbWV0ZXIgb2YgdHlwZSAkfHBhc3NpbmcgdG8gcGFyYW1ldGVyIG9mIGRpZmZlcmVudCB0eXBlfTAsMXwlZGlmZntyZXR1cm5pbmcgJCBmcm9tIGEgZnVuY3Rpb24gd2l0aCByZXN1bHQgdHlwZSAkfHJldHVybmluZyBmcm9tIGZ1bmN0aW9uIHdpdGggZGlmZmVyZW50IHJldHVybiB0eXBlfTAsMXwlZGlmZntjb252ZXJ0aW5nICQgdG8gdHlwZSAkfGNvbnZlcnRpbmcgYmV0d2VlbiB0eXBlc30wLDF8JWRpZmZ7aW5pdGlhbGl6aW5nICQgd2l0aCBhbiBleHByZXNzaW9uIG9mIHR5cGUgJHxpbml0aWFsaXppbmcgd2l0aCBleHByZXNzaW9uIG9mIGRpZmZlcmVudCB0eXBlfTAsMXwlZGlmZntzZW5kaW5nICQgdG8gcGFyYW1ldGVyIG9mIHR5cGUgJHxzZW5kaW5nIHRvIHBhcmFtZXRlciBvZiBkaWZmZXJlbnQgdHlwZX0wLDF8JWRpZmZ7Y2FzdGluZyAkIHRvIHR5cGUgJHxjYXN0aW5nIGJldHdlZW4gdHlwZXN9MCwxfTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnRlZ2VyX3NlcXVlbmNlX2ludGVncmFsX2VsZW1lbnRfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnRlZ2VyIHNlcXVlbmNlcyBtdXN0IGhhdmUgaW50ZWdyYWwgZWxlbWVudCB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW50ZWdlcl9zZXF1ZW5jZV9uZWdhdGl2ZV9sZW5ndGgsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW50ZWdlciBzZXF1ZW5jZXMgbXVzdCBoYXZlIG5vbi1uZWdhdGl2ZSBzZXF1ZW5jZSBsZW5ndGgiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnRlcm5hbF9saW5rYWdlX3JlZGVjbGFyYXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ2ludGVybmFsX2xpbmthZ2UnIGF0dHJpYnV0ZSBkb2VzIG5vdCBhcHBlYXIgb24gdGhlIGZpcnN0IGRlY2xhcmF0aW9uIG9mICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW50cm9kdWNpbmdfc3BlY2lhbF9mcmllbmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXBsdXJhbHtbMCwyXTptdXN0IHVzZSBhIHF1YWxpZmllZCBuYW1lIHdoZW4gZGVjbGFyaW5nfDM6Y2Fubm90IGRlY2xhcmV9MCBhICVzZWxlY3R7Y29uc3RydWN0b3J8ZGVzdHJ1Y3Rvcnxjb252ZXJzaW9uIG9wZXJhdG9yfGRlZHVjdGlvbiBndWlkZX0wIGFzIGEgZnJpZW5kIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9hc21fY2FzdF9sdmFsdWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCB1c2Ugb2YgYSBjYXN0IGluIGEgaW5saW5lIGFzbSBjb250ZXh0IHJlcXVpcmluZyBhbiBsLXZhbHVlOiByZW1vdmUgdGhlIGNhc3Qgb3IgYnVpbGQgd2l0aCAtZmhlaW5vdXMtZ251LWV4dGVuc2lvbnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEyKQorRElBRyhlcnJfaW52YWxpZF9hc21fdmFsdWVfZm9yX2NvbnN0cmFpbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFsdWUgJyUwJyBvdXQgb2YgcmFuZ2UgZm9yIGNvbnN0cmFpbnQgJyUxJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTIpCitESUFHKGVycl9pbnZhbGlkX2FzdHlwZV9vZl9kaWZmZXJlbnRfc2l6ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIHJlaW50ZXJwcmV0YXRpb246IHNpemVzIG9mICUwIGFuZCAlMSBtdXN0IG1hdGNoIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9hdHRyaWJ1dGVfb25fdmlydHVhbF9mdW5jdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBhdHRyaWJ1dGUgY2Fubm90IGJlIGFwcGxpZWQgdG8gdmlydHVhbCBmdW5jdGlvbnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnZhbGlkX2Jhc2VfaW5faW50ZXJmYWNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludGVyZmFjZSB0eXBlIGNhbm5vdCBpbmhlcml0IGZyb20gJXNlbGVjdHtzdHJ1Y3R8bm9uLXB1YmxpYyBpbnRlcmZhY2V8Y2xhc3N9MCAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ludmFsaWRfY29sbGVjdGlvbl9lbGVtZW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbGxlY3Rpb24gZWxlbWVudCBvZiB0eXBlICUwIGlzIG5vdCBhbiBPYmplY3RpdmUtQyBvYmplY3QiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnZhbGlkX2NvbXBsZXhfc3BlYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInX0NvbXBsZXggJTAnIGlzIGludmFsaWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnZhbGlkX2NvbnN0ZXhwciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2Z1bmN0aW9uIHBhcmFtZXRlcnx0eXBlZGVmfG5vbi1zdGF0aWMgZGF0YSBtZW1iZXJ9MCBjYW5ub3QgYmUgY29uc3RleHByIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9jb25zdGV4cHJfbWVtYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vbi1zdGF0aWMgZGF0YSBtZW1iZXIgY2Fubm90IGJlIGNvbnN0ZXhwciVzZWxlY3R7OyBkaWQgeW91IGludGVuZCB0byBtYWtlIGl0ICVzZWxlY3R7Y29uc3R8c3RhdGljfTA/fH0xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9jb25zdGV4cHJfdmFyX2RlY2wsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29uc3RleHByIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG11c3QgYmUgYSBkZWZpbml0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9jb252ZXJzaW9uX2JldHdlZW5fZXh0X3ZlY3RvcnMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBjb252ZXJzaW9uIGJldHdlZW4gZXh0LXZlY3RvciB0eXBlICUwIGFuZCAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ludmFsaWRfY29udmVyc2lvbl9iZXR3ZWVuX3ZlY3Rvcl9hbmRfaW50ZWdlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIGNvbnZlcnNpb24gYmV0d2VlbiB2ZWN0b3IgdHlwZSAlMCBhbmQgaW50ZWdlciB0eXBlICUxIG9mIGRpZmZlcmVudCBzaXplIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9jb252ZXJzaW9uX2JldHdlZW5fdmVjdG9yX2FuZF9zY2FsYXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBjb252ZXJzaW9uIGJldHdlZW4gdmVjdG9yIHR5cGUgJTAgYW5kIHNjYWxhciB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9jb252ZXJzaW9uX2JldHdlZW5fdmVjdG9ycywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIGNvbnZlcnNpb24gYmV0d2VlbiB2ZWN0b3IgdHlwZSVkaWZmeyAkIGFuZCAkfH0wLDEgb2YgZGlmZmVyZW50IHNpemUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnZhbGlkX2NwdV9pcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIGNwdSBuYW1lIGZvciBidWlsdGluIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9jcHVfc3VwcG9ydHMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBjcHUgZmVhdHVyZSBzdHJpbmcgZm9yIGJ1aWx0aW4iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnZhbGlkX2RlY2xfc3BlY19jb21iaW5hdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgY29tYmluZSB3aXRoIHByZXZpb3VzICclMCcgZGVjbGFyYXRpb24gc3BlY2lmaWVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9kZWNsX3NwZWNpZmllcl9pbl9ub250eXBlX3Bhcm0sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBkZWNsYXJhdGlvbiBzcGVjaWZpZXIgaW4gdGVtcGxhdGUgbm9uLXR5cGUgcGFyYW1ldGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9kZWNsYXJhdG9yX2dsb2JhbF9zY29wZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWZpbml0aW9uIG9yIHJlZGVjbGFyYXRpb24gb2YgJTAgY2Fubm90IG5hbWUgdGhlIGdsb2JhbCBzY29wZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ludmFsaWRfZGVjbGFyYXRvcl9pbl9ibG9jaywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWZpbml0aW9uIG9yIHJlZGVjbGFyYXRpb24gb2YgJTAgbm90IGFsbG93ZWQgaW5zaWRlIGEgYmxvY2siLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnZhbGlkX2RlY2xhcmF0b3JfaW5fZnVuY3Rpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVmaW5pdGlvbiBvciByZWRlY2xhcmF0aW9uIG9mICUwIG5vdCBhbGxvd2VkIGluc2lkZSBhIGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9kZWNsYXJhdG9yX3Njb3BlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBkZWZpbmUgb3IgcmVkZWNsYXJlICUwIGhlcmUgYmVjYXVzZSBuYW1lc3BhY2UgJTEgZG9lcyBub3QgZW5jbG9zZSBuYW1lc3BhY2UgJTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnZhbGlkX2Zvcm1fcG9pbnRlcl9tZW1iZXJfZnVuY3Rpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGNyZWF0ZSBhIG5vbi1jb25zdGFudCBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ludmFsaWRfaW5jb21wbGV0ZV90eXBlX3VzZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIHVzZSBvZiBpbmNvbXBsZXRlIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnZhbGlkX21lbWJlcl9pbl9pbnRlcmZhY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtkYXRhIG1lbWJlciB8bm9uLXB1YmxpYyBtZW1iZXIgZnVuY3Rpb24gfHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gfHVzZXItZGVjbGFyZWQgY29uc3RydWN0b3J8dXNlci1kZWNsYXJlZCBkZXN0cnVjdG9yfG9wZXJhdG9yIHxuZXN0ZWQgY2xhc3MgfTAlMSBpcyBub3QgcGVybWl0dGVkIHdpdGhpbiBhbiBpbnRlcmZhY2UgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ludmFsaWRfbWVtYmVyX3VzZV9pbl9zdGF0aWNfbWV0aG9kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgdXNlIG9mIG1lbWJlciAlMCBpbiBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9uZW9uX3R5cGVfY29kZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbmNvbXBhdGlibGUgY29uc3RhbnQgZm9yIHRoaXMgX19idWlsdGluX25lb24gZnVuY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnZhbGlkX25vbl9zdGF0aWNfbWVtYmVyX3VzZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIHVzZSBvZiBub24tc3RhdGljIGRhdGEgbWVtYmVyICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9uc251bWJlcl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGlzIG5vdCBhIHZhbGlkIGxpdGVyYWwgdHlwZSBmb3IgTlNOdW1iZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnZhbGlkX3BjcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIFBDUyB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9waXhlbF9kZWNsX3NwZWNfY29tYmluYXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ19fcGl4ZWwnIG11c3QgYmUgcHJlY2VkZWQgYnkgJ19fdmVjdG9yJy4gICclMCcgZGVjbGFyYXRpb24gc3BlY2lmaWVyIG5vdCBhbGxvd2VkIGhlcmUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnZhbGlkX3Byb3BlcnR5X25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgaXMgbm90IGEgdmFsaWQgcHJvcGVydHkgbmFtZSAoYWNjZXNzaW5nIGFuIG9iamVjdCBvZiB0eXBlICUxKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ludmFsaWRfcHJvdG9jb2xfcXVhbGlmaWVycywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIHByb3RvY29sIHF1YWxpZmllcnMgb24gbm9uLU9iakMgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ludmFsaWRfcXVhbGlmaWVkX2NvbnN0cnVjdG9yLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiclMCcgcXVhbGlmaWVyIGlzIG5vdCBhbGxvd2VkIG9uIGEgY29uc3RydWN0b3IiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnZhbGlkX3F1YWxpZmllZF9kZXN0cnVjdG9yLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiclMCcgcXVhbGlmaWVyIGlzIG5vdCBhbGxvd2VkIG9uIGEgZGVzdHJ1Y3RvciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ludmFsaWRfcXVhbGlmaWVkX2Z1bmN0aW9uX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtub24tbWVtYmVyIGZ1bmN0aW9ufHN0YXRpYyBtZW1iZXIgZnVuY3Rpb258ZGVkdWN0aW9uIGd1aWRlfTAgJXNlbGVjdHtvZiB0eXBlICUyIHx9MWNhbm5vdCBoYXZlICclMycgcXVhbGlmaWVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9yZWNlaXZlcl9jbGFzc19tZXNzYWdlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlY2VpdmVyIHR5cGUgJTAgaXMgbm90IGFuIE9iamVjdGl2ZS1DIGNsYXNzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9yZWNlaXZlcl90b19tZXNzYWdlX3N1cGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidzdXBlcicgaXMgb25seSB2YWxpZCBpbiBhIG1ldGhvZCBib2R5IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9zaWduX3NwZWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJyUwJyBjYW5ub3QgYmUgc2lnbmVkIG9yIHVuc2lnbmVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF9zdXBlcl9zY29wZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIHVzZSBvZiAnX19zdXBlcicsIHRoaXMga2V5d29yZCBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBjbGFzcyBvciBtZW1iZXIgZnVuY3Rpb24gc2NvcGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnZhbGlkX3RoaXNfdXNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgdXNlIG9mICd0aGlzJyBvdXRzaWRlIG9mIGEgbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnZhbGlkX3RocmVhZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInJTAnIGlzIG9ubHkgYWxsb3dlZCBvbiB2YXJpYWJsZSBkZWNsYXJhdGlvbnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnZhbGlkX3R5cGVfZm9yX3Byb2dyYW1fc2NvcGVfdmFyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRoZSAlMCB0eXBlIGNhbm5vdCBiZSB1c2VkIHRvIGRlY2xhcmUgYSBwcm9ncmFtIHNjb3BlIHZhcmlhYmxlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNykKK0RJQUcoZXJyX2ludmFsaWRfdXNlX29mX2FycmF5X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYW4gYXJyYXkgdHlwZSBpcyBub3QgYWxsb3dlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF91c2Vfb2ZfZnVuY3Rpb25fdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhIGZ1bmN0aW9uIHR5cGUgaXMgbm90IGFsbG93ZWQgaGVyZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ludmFsaWRfdmFyX3RlbXBsYXRlX3NwZWNfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlICUyIG9mICVzZWxlY3R7ZXhwbGljaXQgaW5zdGFudGlhdGlvbnxleHBsaWNpdCBzcGVjaWFsaXphdGlvbnxwYXJ0aWFsIHNwZWNpYWxpemF0aW9ufHJlZGVjbGFyYXRpb259MCBvZiAlMSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB0eXBlICUzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF92ZWN0b3JfYm9vbF9kZWNsX3NwZWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHVzZSAnJTAnIHdpdGggJ19fdmVjdG9yIGJvb2wnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF92ZWN0b3JfZGVjbF9zcGVjX2NvbWJpbmF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBjb21iaW5lIHdpdGggcHJldmlvdXMgJyUwJyBkZWNsYXJhdGlvbiBzcGVjaWZpZXIuICdfX3ZlY3RvcicgbXVzdCBiZSBmaXJzdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ludmFsaWRfdmVjdG9yX2RvdWJsZV9kZWNsX3NwZWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidXNlIG9mICdkb3VibGUnIHdpdGggJ19fdmVjdG9yJyByZXF1aXJlcyBWU1ggc3VwcG9ydCB0byBiZSBlbmFibGVkIChhdmFpbGFibGUgb24gUE9XRVI3IG9yIGxhdGVyKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2ludmFsaWRfdmVjdG9yX2Zsb2F0X2RlY2xfc3BlYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgdXNlICdmbG9hdCcgd2l0aCAnX192ZWN0b3InIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF92ZWN0b3JfbG9uZ19kZWNsX3NwZWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHVzZSAnbG9uZycgd2l0aCAnX192ZWN0b3InIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF92ZWN0b3JfbG9uZ19kb3VibGVfZGVjbF9zcGVjLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCB1c2UgJ2xvbmcgZG91YmxlJyB3aXRoICdfX3ZlY3RvciciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pbnZhbGlkX3ZlY3Rvcl9sb25nX2xvbmdfZGVjbF9zcGVjLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVzZSBvZiAnbG9uZyBsb25nJyB3aXRoICdfX3ZlY3RvciBib29sJyByZXF1aXJlcyBWU1ggc3VwcG9ydCAoYXZhaWxhYmxlIG9uIFBPV0VSNyBvciBsYXRlcikgb3IgZXh0ZW5kZWQgQWx0aXZlYyBzdXBwb3J0IChhdmFpbGFibGUgb24gUE9XRVI4IG9yIGxhdGVyKSB0byBiZSBlbmFibGVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaW52YWxpZF93aWR0aF9zcGVjLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiclc2VsZWN0e3xzaG9ydHxsb25nfGxvbmcgbG9uZ30wICUxJyBpcyBpbnZhbGlkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfaXZhcl9hY2Nlc3NfdXNpbmdfcHJvcGVydHlfc3ludGF4X3N1Z2dlc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicHJvcGVydHkgJTAgbm90IGZvdW5kIG9uIG9iamVjdCBvZiB0eXBlICUxOyBkaWQgeW91IG1lYW4gdG8gYWNjZXNzIGluc3RhbmNlIHZhcmlhYmxlICUyPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2l2YXJfaW5fc3VwZXJjbGFzc191c2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicHJvcGVydHkgJTAgYXR0ZW1wdGluZyB0byB1c2UgaW5zdGFuY2UgdmFyaWFibGUgJTEgZGVjbGFyZWQgaW4gc3VwZXIgY2xhc3MgJTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pdmFyX3JlZmVyZW5jZV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluc3RhbmNlIHZhcmlhYmxlcyBjYW5ub3QgYmUgb2YgcmVmZXJlbmNlIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9pdmFyX3VzZV9pbl9jbGFzc19tZXRob2QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5zdGFuY2UgdmFyaWFibGUgJTAgYWNjZXNzZWQgaW4gY2xhc3MgbWV0aG9kIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfa2Vybl9jYWxsX25vdF9nbG9iYWxfZnVuY3Rpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAia2VybmVsIGNhbGwgdG8gbm9uLWdsb2JhbCBmdW5jdGlvbiAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2tlcm5faXNfbm9uc3RhdGljX21ldGhvZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJrZXJuZWwgZnVuY3Rpb24gJTAgbXVzdCBiZSBhIGZyZWUgZnVuY3Rpb24gb3Igc3RhdGljIG1lbWJlciBmdW5jdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2tlcm5fdHlwZV9ub3Rfdm9pZF9yZXR1cm4sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAia2VybmVsIGZ1bmN0aW9uIHR5cGUgJTAgbXVzdCBoYXZlIHZvaWQgcmV0dXJuIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9rZXJuZWxfYXJnX2FkZHJlc3Nfc3BhY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicG9pbnRlciBhcmd1bWVudHMgdG8ga2VybmVsIGZ1bmN0aW9ucyBtdXN0IHJlc2lkZSBpbiAnX19nbG9iYWwnLCAnX19jb25zdGFudCcgb3IgJ19fbG9jYWwnIGFkZHJlc3Mgc3BhY2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9sYW1iZGFfY2FwdHVyZV9hbm9ueW1vdXNfdmFyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVubmFtZWQgdmFyaWFibGUgY2Fubm90IGJlIGltcGxpY2l0bHkgY2FwdHVyZWQgaW4gYSBsYW1iZGEgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMykKK0RJQUcoZXJyX2xhbWJkYV9jYXB0dXJlX2RlZmF1bHRfYXJnLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImxhbWJkYSBleHByZXNzaW9uIGluIGRlZmF1bHQgYXJndW1lbnQgY2Fubm90IGNhcHR1cmUgYW55IGVudGl0eSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMykKK0RJQUcoZXJyX2xhbWJkYV9jYXB0dXJlX2ZsZXhhcnJheV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInZhcmlhYmxlICUwIHdpdGggZmxleGlibGUgYXJyYXkgbWVtYmVyIGNhbm5vdCBiZSBjYXB0dXJlZCBpbiBhIGxhbWJkYSBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAzKQorRElBRyhlcnJfbGFtYmRhX2RlY2xfcmVmX25vdF9tb2RpZmlhYmxlX2x2YWx1ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgYXNzaWduIHRvIGEgdmFyaWFibGUgY2FwdHVyZWQgYnkgY29weSBpbiBhIG5vbi1tdXRhYmxlIGxhbWJkYSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2xhbWJkYV9pbXBjYXAsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFyaWFibGUgJTAgY2Fubm90IGJlIGltcGxpY2l0bHkgY2FwdHVyZWQgaW4gYSBsYW1iZGEgd2l0aCBubyBjYXB0dXJlLWRlZmF1bHQgc3BlY2lmaWVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAzKQorRElBRyhlcnJfbGFtYmRhX2luX2NvbnN0YW50X2V4cHJlc3Npb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYSBsYW1iZGEgZXhwcmVzc2lvbiBtYXkgbm90IGFwcGVhciBpbnNpZGUgb2YgYSBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAzKQorRElBRyhlcnJfbGFtYmRhX2luY29tcGxldGVfcmVzdWx0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluY29tcGxldGUgcmVzdWx0IHR5cGUgJTAgaW4gbGFtYmRhIGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDMpCitESUFHKGVycl9sYW1iZGFfcmV0dXJuX2luaXRfbGlzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZGVkdWNlIGxhbWJkYSByZXR1cm4gdHlwZSBmcm9tIGluaXRpYWxpemVyIGxpc3QiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDMpCitESUFHKGVycl9sYW1iZGFfdW5ldmFsdWF0ZWRfb3BlcmFuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJsYW1iZGEgZXhwcmVzc2lvbiBpbiBhbiB1bmV2YWx1YXRlZCBvcGVyYW5kIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAzKQorRElBRyhlcnJfbGFuZ3VhZ2VfbGlua2FnZV9zcGVjX25vdF9hc2NpaSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJzdHJpbmcgbGl0ZXJhbCBpbiBsYW5ndWFnZSBsaW5rYWdlIHNwZWNpZmllciBjYW5ub3QgaGF2ZSBhbiBlbmNvZGluZy1wcmVmaXgiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9sYW5ndWFnZV9saW5rYWdlX3NwZWNfdW5rbm93biwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmtub3duIGxpbmthZ2UgbGFuZ3VhZ2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9sYXRlX2FzbV9sYWJlbF9uYW1lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBhcHBseSBhc20gbGFiZWwgdG8gJXNlbGVjdHt2YXJpYWJsZXxmdW5jdGlvbn0wIGFmdGVyIGl0cyBmaXJzdCB1c2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9saXN0X2luaXRfaW5fcGFyZW5zLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBpbml0aWFsaXplICVzZWxlY3R7bm9uLWNsYXNzfHJlZmVyZW5jZX0wIHR5cGUgJTEgd2l0aCBhIHBhcmVudGhlc2l6ZWQgaW5pdGlhbGl6ZXIgbGlzdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2xpdGVyYWxfb3BlcmF0b3JfYmFkX3BhcmFtX2NvdW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vbi10ZW1wbGF0ZSBsaXRlcmFsIG9wZXJhdG9yIG11c3QgaGF2ZSBvbmUgb3IgdHdvIHBhcmFtZXRlcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9saXRlcmFsX29wZXJhdG9yX2RlZmF1bHRfYXJndW1lbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibGl0ZXJhbCBvcGVyYXRvciBjYW5ub3QgaGF2ZSBhIGRlZmF1bHQgYXJndW1lbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9saXRlcmFsX29wZXJhdG9yX2V4dGVybl9jLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImxpdGVyYWwgb3BlcmF0b3IgbXVzdCBoYXZlIEMrKyBsaW5rYWdlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbGl0ZXJhbF9vcGVyYXRvcl9pZF9vdXRzaWRlX25hbWVzcGFjZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tbmFtZXNwYWNlIHNjb3BlICclMCcgY2Fubm90IGhhdmUgYSBsaXRlcmFsIG9wZXJhdG9yIG1lbWJlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2xpdGVyYWxfb3BlcmF0b3JfaW52YWxpZF9wYXJhbSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwYXJhbWV0ZXIgb2YgbGl0ZXJhbCBvcGVyYXRvciBtdXN0IGhhdmUgdHlwZSAndW5zaWduZWQgbG9uZyBsb25nJywgJ2xvbmcgZG91YmxlJywgJ2NoYXInLCAnd2NoYXJfdCcsICdjaGFyMTZfdCcsICdjaGFyMzJfdCcsIG9yICdjb25zdCBjaGFyIConIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbGl0ZXJhbF9vcGVyYXRvcl9vdXRzaWRlX25hbWVzcGFjZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJsaXRlcmFsIG9wZXJhdG9yICUwIG11c3QgYmUgaW4gYSBuYW1lc3BhY2Ugb3IgZ2xvYmFsIHNjb3BlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbGl0ZXJhbF9vcGVyYXRvcl9wYXJhbSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIGxpdGVyYWwgb3BlcmF0b3IgcGFyYW1ldGVyIHR5cGUgJTAsIGRpZCB5b3UgbWVhbiAlMT8iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9saXRlcmFsX29wZXJhdG9yX3RlbXBsYXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRlbXBsYXRlIHBhcmFtZXRlciBsaXN0IGZvciBsaXRlcmFsIG9wZXJhdG9yIG11c3QgYmUgZWl0aGVyICdjaGFyLi4uJyBvciAndHlwZW5hbWUgVCwgVC4uLiciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9saXRlcmFsX29wZXJhdG9yX3RlbXBsYXRlX3dpdGhfcGFyYW1zLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImxpdGVyYWwgb3BlcmF0b3IgdGVtcGxhdGUgY2Fubm90IGhhdmUgYW55IHBhcmFtZXRlcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9sb2NhbF9jYW50X2luaXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ19fbG9jYWwnIHZhcmlhYmxlIGNhbm5vdCBoYXZlIGFuIGluaXRpYWxpemVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbHZhbHVlX3JlZmVyZW5jZV9iaW5kX3RvX2luaXRsaXN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7bm9uLWNvbnN0fHZvbGF0aWxlfTAgbHZhbHVlIHJlZmVyZW5jZSB0byB0eXBlICUxIGNhbm5vdCBiaW5kIHRvIGFuIGluaXRpYWxpemVyIGxpc3QgdGVtcG9yYXJ5IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbHZhbHVlX3JlZmVyZW5jZV9iaW5kX3RvX3RlbXBvcmFyeSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e25vbi1jb25zdHx2b2xhdGlsZX0wIGx2YWx1ZSByZWZlcmVuY2UgJWRpZmZ7dG8gdHlwZSAkIGNhbm5vdCBiaW5kIHRvIGEgdGVtcG9yYXJ5IG9mIHR5cGUgJHxjYW5ub3QgYmluZCB0byBpbmNvbXBhdGlibGUgdGVtcG9yYXJ5fTEsMiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX2x2YWx1ZV9yZWZlcmVuY2VfYmluZF90b191bnJlbGF0ZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtub24tY29uc3R8dm9sYXRpbGV9MCBsdmFsdWUgcmVmZXJlbmNlICVkaWZme3RvIHR5cGUgJCBjYW5ub3QgYmluZCB0byBhIHZhbHVlIG9mIHVucmVsYXRlZCB0eXBlICR8Y2Fubm90IGJpbmQgdG8gYSB2YWx1ZSBvZiB1bnJlbGF0ZWQgdHlwZX0xLDIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9sdmFsdWVfdG9fcnZhbHVlX3JlZiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJydmFsdWUgcmVmZXJlbmNlICVkaWZme3RvIHR5cGUgJCBjYW5ub3QgYmluZCB0byBsdmFsdWUgb2YgdHlwZSAkfGNhbm5vdCBiaW5kIHRvIGluY29tcGF0aWJsZSBsdmFsdWV9MCwxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbWFjaGluZV9tb2RlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7dW5rbm93bnx1bnN1cHBvcnRlZH0wIG1hY2hpbmUgbW9kZSAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX21haW5fYXJnX3dyb25nLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7Zmlyc3R8c2Vjb25kfHRoaXJkfGZvdXJ0aH0wIHBhcmFtZXRlciBvZiAnbWFpbicgKCVzZWxlY3R7YXJndW1lbnQgY291bnR8YXJndW1lbnQgYXJyYXl8ZW52aXJvbm1lbnR8cGxhdGZvcm0tc3BlY2lmaWMgZGF0YX0wKSBtdXN0IGJlIG9mIHR5cGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tYWluX2dsb2JhbF92YXJpYWJsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtYWluIGNhbm5vdCBiZSBkZWNsYXJlZCBhcyBnbG9iYWwgdmFyaWFibGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tYWluX3JldHVybnNfbm9uaW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidtYWluJyBtdXN0IHJldHVybiAnaW50JyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX21haW5fc3VycGx1c19hcmdzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRvbyBtYW55IHBhcmFtZXRlcnMgKCUwKSBmb3IgJ21haW4nOiBtdXN0IGJlIDAsIDIsIG9yIDMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tYWlubGlrZV90ZW1wbGF0ZV9kZWNsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGNhbm5vdCBiZSBhIHRlbXBsYXRlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbWFsZm9ybWVkX3N0ZF9jb3JvdXRpbmVfaGFuZGxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN0ZDo6ZXhwZXJpbWVudGFsOjpjb3JvdXRpbmVfaGFuZGxlIG11c3QgYmUgYSBjbGFzcyB0ZW1wbGF0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTQpCitESUFHKGVycl9tYWxmb3JtZWRfc3RkX2Nvcm91dGluZV90cmFpdHMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ3N0ZDo6ZXhwZXJpbWVudGFsOjpjb3JvdXRpbmVfdHJhaXRzJyBtdXN0IGJlIGEgY2xhc3MgdGVtcGxhdGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE0KQorRElBRyhlcnJfbWFsZm9ybWVkX3N0ZF9pbml0aWFsaXplcl9saXN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN0ZDo6aW5pdGlhbGl6ZXJfbGlzdCBtdXN0IGJlIGEgY2xhc3MgdGVtcGxhdGUgd2l0aCBhIHNpbmdsZSB0eXBlIHBhcmFtZXRlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX21hbGZvcm1lZF9zdGRfbm90aHJvdywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJzdGQ6Om5vdGhyb3cgbXVzdCBiZSBhIHZhbGlkIHZhcmlhYmxlIGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNCkKK0RJQUcoZXJyX21heWJlX2ZhbGxvZmZfbm9udm9pZF9ibG9jaywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb250cm9sIG1heSByZWFjaCBlbmQgb2Ygbm9uLXZvaWQgYmxvY2siLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tZW1faW5pdF9ub3RfbWVtYmVyX29yX2NsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1lbWJlciBpbml0aWFsaXplciAlMCBkb2VzIG5vdCBuYW1lIGEgbm9uLXN0YXRpYyBkYXRhIG1lbWJlciBvciBiYXNlIGNsYXNzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbWVtX2luaXRfbm90X21lbWJlcl9vcl9jbGFzc19zdWdnZXN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluaXRpYWxpemVyICUwIGRvZXMgbm90IG5hbWUgYSBub24tc3RhdGljIGRhdGEgbWVtYmVyIG9yIGJhc2UgY2xhc3M7IGRpZCB5b3UgbWVhbiB0aGUgJXNlbGVjdHtiYXNlIGNsYXNzfG1lbWJlcn0xICUyPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX21lbWJlcl9jYWxsX3dpdGhvdXRfb2JqZWN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbGwgdG8gbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gd2l0aG91dCBhbiBvYmplY3QgYXJndW1lbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tZW1iZXJfZGVjbF9kb2VzX25vdF9tYXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJvdXQtb2YtbGluZSAlc2VsZWN0e2RlY2xhcmF0aW9ufGRlZmluaXRpb259MiBvZiAlMCBkb2VzIG5vdCBtYXRjaCBhbnkgZGVjbGFyYXRpb24gaW4gJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tZW1iZXJfZGVjbF9kb2VzX25vdF9tYXRjaF9zdWdnZXN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm91dC1vZi1saW5lICVzZWxlY3R7ZGVjbGFyYXRpb258ZGVmaW5pdGlvbn0yIG9mICUwIGRvZXMgbm90IG1hdGNoIGFueSBkZWNsYXJhdGlvbiBpbiAlMTsgZGlkIHlvdSBtZWFuICUzPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX21lbWJlcl9kZWZfZG9lc19ub3RfbWF0Y2hfcmV0X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmV0dXJuIHR5cGUgb2Ygb3V0LW9mLWxpbmUgZGVmaW5pdGlvbiBvZiAlcTAgZGlmZmVycyBmcm9tIHRoYXQgaW4gdGhlIGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbWVtYmVyX2RlZl91bmRlZmluZWRfcmVjb3JkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm91dC1vZi1saW5lIGRlZmluaXRpb24gb2YgJTAgZnJvbSBjbGFzcyAlMSB3aXRob3V0IGRlZmluaXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tZW1iZXJfZXh0cmFfcXVhbGlmaWNhdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHRyYSBxdWFsaWZpY2F0aW9uIG9uIG1lbWJlciAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX21lbWJlcl9mdW5jdGlvbl9jYWxsX2JhZF9jdnIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ3RoaXMnIGFyZ3VtZW50IHRvIG1lbWJlciBmdW5jdGlvbiAlMCBoYXMgdHlwZSAlMSwgYnV0IGZ1bmN0aW9uIGlzIG5vdCBtYXJrZWQgJXNlbGVjdHtjb25zdHxyZXN0cmljdHxjb25zdCBvciByZXN0cmljdHx2b2xhdGlsZXxjb25zdCBvciB2b2xhdGlsZXx2b2xhdGlsZSBvciByZXN0cmljdHxjb25zdCwgdm9sYXRpbGUsIG9yIHJlc3RyaWN0fTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tZW1iZXJfZnVuY3Rpb25fY2FsbF9iYWRfcmVmLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIid0aGlzJyBhcmd1bWVudCB0byBtZW1iZXIgZnVuY3Rpb24gJTAgaXMgYW4gJXNlbGVjdHtsdmFsdWV8cnZhbHVlfTEsIGJ1dCBmdW5jdGlvbiBoYXMgJXNlbGVjdHtub24tY29uc3QgbHZhbHVlfHJ2YWx1ZX0yIHJlZi1xdWFsaWZpZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tZW1iZXJfZnVuY3Rpb25fY2FsbF9iYWRfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgaW5pdGlhbGl6ZSBvYmplY3QgcGFyYW1ldGVyIG9mIHR5cGUgJTAgd2l0aCBhbiBleHByZXNzaW9uIG9mIHR5cGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tZW1iZXJfZnVuY3Rpb25faW5pdGlhbGl6YXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5pdGlhbGl6ZXIgb24gZnVuY3Rpb24gZG9lcyBub3QgbG9vayBsaWtlIGEgcHVyZS1zcGVjaWZpZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tZW1iZXJfbmFtZV9vZl9jbGFzcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtZW1iZXIgJTAgaGFzIHRoZSBzYW1lIG5hbWUgYXMgaXRzIGNsYXNzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbWVtYmVyX25vdF95ZXRfaW5zdGFudGlhdGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIG1lbWJlciAlMCBpbiAlMTsgaXQgaGFzIG5vdCB5ZXQgYmVlbiBpbnN0YW50aWF0ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tZW1iZXJfcXVhbGlmaWNhdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tZnJpZW5kIGNsYXNzIG1lbWJlciAlMCBjYW5ub3QgaGF2ZSBhIHF1YWxpZmllZCBuYW1lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbWVtYmVyX3JlZGVjbGFyZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2xhc3MgbWVtYmVyIGNhbm5vdCBiZSByZWRlY2xhcmVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbWVtYmVyX3JlZGVjbGFyZWRfaW5faW5zdGFudGlhdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtdWx0aXBsZSBvdmVybG9hZHMgb2YgJTAgaW5zdGFudGlhdGUgdG8gdGhlIHNhbWUgc2lnbmF0dXJlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbWVtYmVyX3JlZmVyZW5jZV9uZWVkc19jYWxsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImJhc2Ugb2YgbWVtYmVyIHJlZmVyZW5jZSBpcyBhIGZ1bmN0aW9uOyBwZXJoYXBzIHlvdSBtZWFudCB0byBjYWxsIGl0JXNlbGVjdHt8IHdpdGggbm8gYXJndW1lbnRzfTA/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbWVtcG9pbnRlcl9pbl9ub25jbGFzc190eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1lbWJlciBwb2ludGVyIHJlZmVycyBpbnRvIG5vbi1jbGFzcyB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbWVtcHRyX2NvbnZfdmlhX3ZpcnR1YWwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29udmVyc2lvbiBmcm9tIHBvaW50ZXIgdG8gbWVtYmVyIG9mIGNsYXNzICUwIHRvIHBvaW50ZXIgdG8gbWVtYmVyIG9mIGNsYXNzICUxIHZpYSB2aXJ0dWFsIGJhc2UgJTIgaXMgbm90IGFsbG93ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tZXRob2Rfbm90X2ZvdW5kX3dpdGhfdHlwbywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2luc3RhbmNlfGNsYXNzfTEgbWV0aG9kICUwIG5vdCBmb3VuZCA7IGRpZCB5b3UgbWVhbiAlMj8iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9taXNtYXRjaGVkX2V4Y2VwdGlvbl9zcGVjLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGluIGRlY2xhcmF0aW9uIGRvZXMgbm90IG1hdGNoIHByZXZpb3VzIGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbWlzbWF0Y2hlZF9leGNlcHRpb25fc3BlY19leHBsaWNpdF9pbnN0YW50aWF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGluIGV4cGxpY2l0IGluc3RhbnRpYXRpb24gZG9lcyBub3QgbWF0Y2ggaW5zdGFudGlhdGVkIG9uZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX21pc21hdGNoZWRfbXNfaW5oZXJpdGFuY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5oZXJpdGFuY2UgbW9kZWwgZG9lcyBub3QgbWF0Y2ggJXNlbGVjdHtkZWZpbml0aW9ufHByZXZpb3VzIGRlY2xhcmF0aW9ufTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9taXNtYXRjaGVkX293bmluZ19tb2R1bGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVjbGFyYXRpb24gb2YgJTAgaW4gJXNlbGVjdHt0aGUgZ2xvYmFsIG1vZHVsZXxtb2R1bGUgJTJ9MSBmb2xsb3dzIGRlY2xhcmF0aW9uIGluICVzZWxlY3R7dGhlIGdsb2JhbCBtb2R1bGV8bW9kdWxlICU0fTMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9taXNtYXRjaGVkX3V1aWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidXVpZCBkb2VzIG5vdCBtYXRjaCBwcmV2aW91cyBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX21pc21hdGNoZWRfdmlzaWJpbGl0eSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2aXNpYmlsaXR5IGRvZXMgbm90IG1hdGNoIHByZXZpb3VzIGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbWlzcGxhY2VkX2l2YXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5zdGFuY2UgdmFyaWFibGVzIG1heSBub3QgYmUgcGxhY2VkIGluICVzZWxlY3R7Y2F0ZWdvcmllc3xjbGFzcyBleHRlbnNpb259MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX21pc3NpbmdfYWN0dWFsX3BpcGVfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtaXNzaW5nIGFjdHVhbCB0eXBlIHNwZWNpZmllciBmb3IgcGlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX21pc3NpbmdfYXRzaWduX3ByZWZpeCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJzdHJpbmcgbGl0ZXJhbCBtdXN0IGJlIHByZWZpeGVkIGJ5ICdAJyAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9taXNzaW5nX2RlZmF1bHRfY3RvciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2NvbnN0cnVjdG9yIGZvciAlMSBtdXN0IGV4cGxpY2l0bHkgaW5pdGlhbGl6ZSB0aGV8aW1wbGljaXQgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgJTEgbXVzdCBleHBsaWNpdGx5IGluaXRpYWxpemUgdGhlfGNhbm5vdCB1c2UgY29uc3RydWN0b3IgaW5oZXJpdGVkIGZyb20gYmFzZSBjbGFzcyAlNDt9MCAlc2VsZWN0e2Jhc2UgY2xhc3N8bWVtYmVyfTIgJTMgJXNlbGVjdHt3aGljaHx3aGljaHxvZiAlMX0wIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbWlzc2luZ19leGNlcHRpb25fc3BlY2lmaWNhdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBpcyBtaXNzaW5nIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uICclMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9taXNzaW5nX21ldGhvZF9jb250ZXh0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1pc3NpbmcgY29udGV4dCBmb3IgbWV0aG9kIGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbWlzc2luZ19vcGVuX3NxdWFyZV9tZXNzYWdlX3NlbmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWlzc2luZyAnWycgYXQgc3RhcnQgb2YgbWVzc2FnZSBzZW5kIGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9taXNzaW5nX3Byb3BlcnR5X2NvbnRleHQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWlzc2luZyBjb250ZXh0IGZvciBwcm9wZXJ0eSBpbXBsZW1lbnRhdGlvbiBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX21pc3NpbmdfcHJvcGVydHlfaW50ZXJmYWNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInByb3BlcnR5IGltcGxlbWVudGF0aW9uIGluIGEgY2F0ZWdvcnkgd2l0aCBubyBjYXRlZ29yeSBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX21pc3NpbmdfcHJvcGVydHlfaXZhcl9kZWNsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN5bnRoZXNpemVkIHByb3BlcnR5ICUwIG11c3QgZWl0aGVyIGJlIG5hbWVkIHRoZSBzYW1lIGFzIGEgY29tcGF0aWJsZSBpbnN0YW5jZSB2YXJpYWJsZSBvciBtdXN0IGV4cGxpY2l0bHkgbmFtZSBhbiBpbnN0YW5jZSB2YXJpYWJsZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX21pc3NpbmdfdHlwZV9zcGVjaWZpZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiQysrIHJlcXVpcmVzIGEgdHlwZSBzcGVjaWZpZXIgZm9yIGFsbCBkZWNsYXJhdGlvbnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9taXhpbmdfY3h4X3RyeV9zZWhfdHJ5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCB1c2UgQysrICd0cnknIGluIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIFNFSCAnX190cnknIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbW9kZV9ub3RfcHJpbWl0aXZlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1vZGUgYXR0cmlidXRlIG9ubHkgc3VwcG9ydGVkIGZvciBpbnRlZ2VyIGFuZCBmbG9hdGluZy1wb2ludCB0eXBlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX21vZGVfd3JvbmdfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlIG9mIG1hY2hpbmUgbW9kZSBkb2VzIG5vdCBtYXRjaCB0eXBlIG9mIGJhc2UgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX21vZHVsZV9kZWNsX2luX21vZHVsZV9tYXBfbW9kdWxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidtb2R1bGUnIGRlY2xhcmF0aW9uIGZvdW5kIHdoaWxlIGJ1aWxkaW5nIG1vZHVsZSBmcm9tIG1vZHVsZSBtYXAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEzKQorRElBRyhlcnJfbW9kdWxlX2RlY2xhcmF0aW9uX21pc3NpbmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWlzc2luZyAnZXhwb3J0IG1vZHVsZScgZGVjbGFyYXRpb24gaW4gbW9kdWxlIGludGVyZmFjZSB1bml0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMykKK0RJQUcoZXJyX21vZHVsZV9pbXBvcnRfaW5faW1wbGVtZW50YXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiQGltcG9ydCBvZiBtb2R1bGUgJyUwJyBpbiBpbXBsZW1lbnRhdGlvbiBvZiAnJTEnOyB1c2UgI2ltcG9ydCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTMpCitESUFHKGVycl9tb2R1bGVfaW1wb3J0X25vdF9hdF90b3BfbGV2ZWxfZmF0YWwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW1wb3J0IG9mIG1vZHVsZSAnJTAnIGFwcGVhcnMgd2l0aGluICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMykKK0RJQUcoZXJyX21vZHVsZV9pbnRlcmZhY2VfaW1wbGVtZW50YXRpb25fbWlzbWF0Y2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWlzc2luZyAnZXhwb3J0JyBzcGVjaWZpZXIgaW4gbW9kdWxlIGRlY2xhcmF0aW9uIHdoaWxlIGJ1aWxkaW5nIG1vZHVsZSBpbnRlcmZhY2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEzKQorRElBRyhlcnJfbW9kdWxlX25vdF9kZWZpbmVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZmluaXRpb24gb2YgbW9kdWxlICclMCcgaXMgbm90IGF2YWlsYWJsZTsgdXNlIC1mbW9kdWxlLWZpbGU9IHRvIHNwZWNpZnkgcGF0aCB0byBwcmVjb21waWxlZCBtb2R1bGUgaW50ZXJmYWNlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMykKK0RJQUcoZXJyX21vZHVsZV9wcml2YXRlX2xvY2FsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7bG9jYWwgdmFyaWFibGV8cGFyYW1ldGVyfHR5cGVkZWZ9MCAlMSBjYW5ub3QgYmUgZGVjbGFyZWQgX19tb2R1bGVfcHJpdmF0ZV9fIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMykKK0RJQUcoZXJyX21vZHVsZV9wcml2YXRlX2xvY2FsX2NsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImxvY2FsICVzZWxlY3R7c3RydWN0fGludGVyZmFjZXx1bmlvbnxjbGFzc3xlbnVtfTAgY2Fubm90IGJlIGRlY2xhcmVkIF9fbW9kdWxlX3ByaXZhdGVfXyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTMpCitESUFHKGVycl9tb2R1bGVfcHJpdmF0ZV9zcGVjaWFsaXphdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e3RlbXBsYXRlfHBhcnRpYWx8bWVtYmVyfTAgc3BlY2lhbGl6YXRpb24gY2Fubm90IGJlIGRlY2xhcmVkIF9fbW9kdWxlX3ByaXZhdGVfXyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTMpCitESUFHKGVycl9tb2R1bGVfcmVkZWNsYXJhdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0cmFuc2xhdGlvbiB1bml0IGNvbnRhaW5zIG11bHRpcGxlIG1vZHVsZSBkZWNsYXJhdGlvbnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEzKQorRElBRyhlcnJfbW9kdWxlX3JlZGVmaW5pdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZWRlZmluaXRpb24gb2YgbW9kdWxlICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEzKQorRElBRyhlcnJfbW9kdWxlX3NlbGZfaW1wb3J0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImltcG9ydCBvZiBtb2R1bGUgJyUwJyBhcHBlYXJzIHdpdGhpbiBzYW1lIHRvcC1sZXZlbCBtb2R1bGUgJyUxJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTMpCitESUFHKGVycl9tb2R1bGVfdW5pbXBvcnRlZF91c2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtkZWNsYXJhdGlvbnxkZWZpbml0aW9ufGRlZmF1bHQgYXJndW1lbnR8ZXhwbGljaXQgc3BlY2lhbGl6YXRpb258cGFydGlhbCBzcGVjaWFsaXphdGlvbn0wIG9mICUxIG11c3QgYmUgaW1wb3J0ZWQgZnJvbSBtb2R1bGUgJyUyJyBiZWZvcmUgaXQgaXMgcmVxdWlyZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDEzKQorRElBRyhlcnJfbW9kdWxlX3VuaW1wb3J0ZWRfdXNlX2hlYWRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtaXNzaW5nICcjaW5jbHVkZSAlMyc7ICVzZWxlY3R7ZGVjbGFyYXRpb258ZGVmaW5pdGlvbnxkZWZhdWx0IGFyZ3VtZW50fGV4cGxpY2l0IHNwZWNpYWxpemF0aW9ufHBhcnRpYWwgc3BlY2lhbGl6YXRpb259MCBvZiAlMSBtdXN0IGJlIGltcG9ydGVkIGZyb20gbW9kdWxlICclMicgYmVmb3JlIGl0IGlzIHJlcXVpcmVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMykKK0RJQUcoZXJyX21vZHVsZV91bmltcG9ydGVkX3VzZV9tdWx0aXBsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2RlY2xhcmF0aW9ufGRlZmluaXRpb258ZGVmYXVsdCBhcmd1bWVudHxleHBsaWNpdCBzcGVjaWFsaXphdGlvbnxwYXJ0aWFsIHNwZWNpYWxpemF0aW9ufTAgb2YgJTEgbXVzdCBiZSBpbXBvcnRlZCBmcm9tIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1vZHVsZXMgYmVmb3JlIGl0IGlzIHJlcXVpcmVkOiUyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMykKK0RJQUcoZXJyX21zX19fbGVhdmVfbm90X2luX19fdHJ5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidfX2xlYXZlJyBzdGF0ZW1lbnQgbm90IGluIF9fdHJ5IGJsb2NrIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbXNfdmFfc3RhcnRfdXNlZF9pbl9zeXN2X2Z1bmN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidfX2J1aWx0aW5fbXNfdmFfc3RhcnQnIHVzZWQgaW4gU3lzdGVtIFYgQUJJIGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbXN2Y19hbm5vdGF0aW9uX3dpZGVfc3RyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFyZ3VtZW50cyB0byBfX2Fubm90YXRpb24gbXVzdCBiZSB3aWRlIHN0cmluZyBjb25zdGFudHMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tdWx0aXBsZV9iYXNlX2luaXRpYWxpemF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm11bHRpcGxlIGluaXRpYWxpemF0aW9ucyBnaXZlbiBmb3IgYmFzZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX211bHRpcGxlX2RlZmF1bHRfbGFiZWxzX2RlZmluZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibXVsdGlwbGUgZGVmYXVsdCBsYWJlbHMgaW4gb25lIHN3aXRjaCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX211bHRpcGxlX2ZpbmFsX292ZXJyaWRlcnMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmlydHVhbCBmdW5jdGlvbiAlcTAgaGFzIG1vcmUgdGhhbiBvbmUgZmluYWwgb3ZlcnJpZGVyIGluICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbXVsdGlwbGVfbWVtX2luaXRpYWxpemF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm11bHRpcGxlIGluaXRpYWxpemF0aW9ucyBnaXZlbiBmb3Igbm9uLXN0YXRpYyBtZW1iZXIgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tdWx0aXBsZV9tZW1fdW5pb25faW5pdGlhbGl6YXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5pdGlhbGl6aW5nIG11bHRpcGxlIG1lbWJlcnMgb2YgdW5pb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tdWx0aXZlcnNpb25fYWZ0ZXJfdXNlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmdW5jdGlvbiBkZWNsYXJhdGlvbiBjYW5ub3QgYmVjb21lIGEgbXVsdGl2ZXJzaW9uZWQgZnVuY3Rpb24gYWZ0ZXIgZmlyc3QgdXNhZ2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9tdWx0aXZlcnNpb25fZGlmZiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtdWx0aXZlcnNpb25lZCBmdW5jdGlvbiBkZWNsYXJhdGlvbiBoYXMgYSBkaWZmZXJlbnQgJXNlbGVjdHtjYWxsaW5nIGNvbnZlbnRpb258cmV0dXJuIHR5cGV8Y29uc3RleHByIHNwZWNpZmljYXRpb258aW5saW5lIHNwZWNpZmljYXRpb258c3RvcmFnZSBjbGFzc3xsaW5rYWdlfTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9tdWx0aXZlcnNpb25fZG9lc250X3N1cHBvcnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibXVsdGl2ZXJzaW9uZWQgZnVuY3Rpb25zIGRvIG5vdCB5ZXQgc3VwcG9ydCAlc2VsZWN0e2Z1bmN0aW9uIHRlbXBsYXRlc3x2aXJ0dWFsIGZ1bmN0aW9uc3xkZWR1Y2VkIHJldHVybiB0eXBlc3xjb25zdHJ1Y3RvcnN8ZGVzdHJ1Y3RvcnN8ZGVsZXRlZCBmdW5jdGlvbnN8ZGVmYXVsdGVkIGZ1bmN0aW9uc30wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfbXVsdGl2ZXJzaW9uX2R1cGxpY2F0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtdWx0aXZlcnNpb25lZCBmdW5jdGlvbiByZWRlY2xhcmF0aW9ucyByZXF1aXJlIGlkZW50aWNhbCB0YXJnZXQgYXR0cmlidXRlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMCkKK0RJQUcoZXJyX211bHRpdmVyc2lvbl9ub19vdGhlcl9hdHRycywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhdHRyaWJ1dGUgJ3RhcmdldCcgbXVsdGl2ZXJzaW9uaW5nIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIG90aGVyIGF0dHJpYnV0ZXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9tdWx0aXZlcnNpb25fbm9wcm90bywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtdWx0aXZlcnNpb25lZCBmdW5jdGlvbiBtdXN0IGhhdmUgYSBwcm90b3R5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9tdWx0aXZlcnNpb25fbm90X2FsbG93ZWRfb25fbWFpbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInbWFpbicgY2Fubm90IGJlIGEgbXVsdGl2ZXJzaW9uZWQgZnVuY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9tdWx0aXZlcnNpb25fbm90X3N1cHBvcnRlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmdW5jdGlvbiBtdWx0aXZlcnNpb25pbmcgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgY3VycmVudCB0YXJnZXQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl9tdXRhYmxlX2NvbnN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidtdXRhYmxlJyBhbmQgJ2NvbnN0JyBjYW5ub3QgYmUgbWl4ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tdXRhYmxlX2Z1bmN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidtdXRhYmxlJyBjYW5ub3QgYmUgYXBwbGllZCB0byBmdW5jdGlvbnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9tdXRhYmxlX25vbm1lbWJlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInbXV0YWJsZScgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBtZW1iZXIgdmFyaWFibGVzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbXV0YWJsZV9yZWZlcmVuY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ211dGFibGUnIGNhbm5vdCBiZSBhcHBsaWVkIHRvIHJlZmVyZW5jZXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9uZWVkX2hlYWRlcl9iZWZvcmVfbXNfdXVpZG9mLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInlvdSBuZWVkIHRvIGluY2x1ZGUgPGd1aWRkZWYuaD4gYmVmb3JlIHVzaW5nIHRoZSAnX191dWlkb2YnIG9wZXJhdG9yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbmVlZF9oZWFkZXJfYmVmb3JlX3R5cGVpZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ5b3UgbmVlZCB0byBpbmNsdWRlIDx0eXBlaW5mbz4gYmVmb3JlIHVzaW5nIHRoZSAndHlwZWlkJyBvcGVyYXRvciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25lc3RlZF9uYW1lX21lbWJlcl9yZWZfbG9va3VwX2FtYmlndW91cywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJsb29rdXAgb2YgJTAgaW4gbWVtYmVyIGFjY2VzcyBleHByZXNzaW9uIGlzIGFtYmlndW91cyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25lc3RlZF9uYW1lX3NwZWNfaXNfbm90X2NsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGNhbm5vdCBhcHBlYXIgYmVmb3JlICc6OicgYmVjYXVzZSBpdCBpcyBub3QgYSBjbGFzcyVzZWxlY3R7IG9yIG5hbWVzcGFjZXwsIG5hbWVzcGFjZSwgb3IgZW51bWVyYXRpb259MTsgZGlkIHlvdSBtZWFuICc6Jz8iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9uZXN0ZWRfbmFtZV9zcGVjX25vbl90YWcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSAlMCBjYW5ub3QgYmUgdXNlZCBwcmlvciB0byAnOjonIGJlY2F1c2UgaXQgaGFzIG5vIG1lbWJlcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9uZXN0ZWRfbm9uX3N0YXRpY19tZW1iZXJfdXNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7Y2FsbCB0byBub24tc3RhdGljIG1lbWJlciBmdW5jdGlvbnx1c2Ugb2Ygbm9uLXN0YXRpYyBkYXRhIG1lbWJlcn0wICUyIG9mICUxIGZyb20gbmVzdGVkIHR5cGUgJTMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9uZXN0ZWRfcmVkZWZpbml0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5lc3RlZCByZWRlZmluaXRpb24gb2YgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9uZXdfYWJpX3RhZ19vbl9yZWRlY2xhcmF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidhYmlfdGFnJyAlMCBtaXNzaW5nIGluIG9yaWdpbmFsIGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbmV3X2FycmF5X2luaXRfYXJncywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhcnJheSAnbmV3JyBjYW5ub3QgaGF2ZSBpbml0aWFsaXphdGlvbiBhcmd1bWVudHMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9uZXdfYXJyYXlfbm9uY29uc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib25seSB0aGUgZmlyc3QgZGltZW5zaW9uIG9mIGFuIGFsbG9jYXRlZCBhcnJheSBtYXkgaGF2ZSBkeW5hbWljIHNpemUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9uZXdfYXJyYXlfb2ZfYXV0bywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgYWxsb2NhdGUgYXJyYXkgb2YgJ2F1dG8nIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbmV3X2luY29tcGxldGVfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhbGxvY2F0aW9uIG9mIGluY29tcGxldGUgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vX2FjY2Vzc29yX2Zvcl9wcm9wZXJ0eSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyAlc2VsZWN0e2dldHRlcnxzZXR0ZXJ9MCBkZWZpbmVkIGZvciBwcm9wZXJ0eSAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vX2Jhc2VfY2xhc3NlcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIHVzZSBvZiAnX19zdXBlcicsICUwIGhhcyBubyBiYXNlIGNsYXNzZXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub19keW5hbWljX2Nhc3Rfd2l0aF9mbm9fcnR0aSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgdXNlIGR5bmFtaWNfY2FzdCB3aXRoIC1mbm8tcnR0aSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vX21hdGNoaW5nX2xvY2FsX2ZyaWVuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyBtYXRjaGluZyBmdW5jdGlvbiBmb3VuZCBpbiBsb2NhbCBzY29wZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vX21hdGNoaW5nX2xvY2FsX2ZyaWVuZF9zdWdnZXN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIG1hdGNoaW5nIGZ1bmN0aW9uICUwIGZvdW5kIGluIGxvY2FsIHNjb3BlOyBkaWQgeW91IG1lYW4gJTM/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbm9fbWVtYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIG1lbWJlciBuYW1lZCAlMCBpbiAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vX21lbWJlcl9vdmVybG9hZGVkX2Fycm93LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIG1lbWJlciBuYW1lZCAlMCBpbiAlMTsgZGlkIHlvdSBtZWFuIHRvIHVzZSAnLT4nIGluc3RlYWQgb2YgJy4nPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vX21lbWJlcl9zdWdnZXN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIG1lbWJlciBuYW1lZCAlMCBpbiAlMTsgZGlkIHlvdSBtZWFuICVzZWxlY3R7fHNpbXBseSB9MiUzPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vX21lbWJlcl90ZW1wbGF0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyB0ZW1wbGF0ZSBuYW1lZCAlMCBpbiAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vX21lbWJlcl90ZW1wbGF0ZV9zdWdnZXN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIHRlbXBsYXRlIG5hbWVkICUwIGluICUxOyBkaWQgeW91IG1lYW4gJXNlbGVjdHt8c2ltcGx5IH0yJTM/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbm9fbnNjb25zdGFudF9zdHJpbmdfY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGZpbmQgaW50ZXJmYWNlIGRlY2xhcmF0aW9uIGZvciAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vX3N1Ym9iamVjdF9wcm9wZXJ0eV9zZXR0aW5nLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cHJlc3Npb24gaXMgbm90IGFzc2lnbmFibGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub19zdWl0YWJsZV9kZWxldGVfbWVtYmVyX2Z1bmN0aW9uX2ZvdW5kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIHN1aXRhYmxlIG1lbWJlciAlMCBpbiAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vX3N1cGVyX2NsYXNzX21lc3NhZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gQGludGVyZmFjZSBkZWNsYXJhdGlvbiBmb3VuZCBpbiBjbGFzcyBtZXNzYWdpbmcgb2YgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub190ZW1wbGF0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyB0ZW1wbGF0ZSBuYW1lZCAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vX3RlbXBsYXRlX3N1Z2dlc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gdGVtcGxhdGUgbmFtZWQgJTA7IGRpZCB5b3UgbWVhbiAlMT8iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub190eXBlaWRfd2l0aF9mbm9fcnR0aSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgdXNlIHR5cGVpZCB3aXRoIC1mbm8tcnR0aSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vZXhjZXB0X25lZWRzX2NvbnN0YW50X2V4cHJlc3Npb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJndW1lbnQgdG8gbm9leGNlcHQgc3BlY2lmaWVyIG11c3QgYmUgYSBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbm9nZXR0ZXJfcHJvcGVydHlfY29tcG91bmRfYXNzaWdubWVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhIGdldHRlciBtZXRob2QgaXMgbmVlZGVkIHRvIHBlcmZvcm0gYSBjb21wb3VuZCBhc3NpZ25tZW50IG9uIGEgcHJvcGVydHkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub2dldHRlcl9wcm9wZXJ0eV9pbmNkZWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gZ2V0dGVyIG1ldGhvZCAlMSBmb3IgJXNlbGVjdHtpbmNyZW1lbnR8ZGVjcmVtZW50fTAgb2YgcHJvcGVydHkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub25fYXNtX3N0bXRfaW5fbmFrZWRfZnVuY3Rpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm9uLUFTTSBzdGF0ZW1lbnQgaW4gbmFrZWQgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vbl9kZWxldGVkX292ZXJyaWRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vbi1kZWxldGVkIGZ1bmN0aW9uICUwIGNhbm5vdCBvdmVycmlkZSBhIGRlbGV0ZWQgZnVuY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub25fZXh0ZXJuX2V4dGVybiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tZXh0ZXJuIGRlY2xhcmF0aW9uIG9mICUwIGZvbGxvd3MgZXh0ZXJuIGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbm9uX2xvY2FsX3ZhcmlhYmxlX2RlY2xfaW5fZm9yLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlY2xhcmF0aW9uIG9mIG5vbi1sb2NhbCB2YXJpYWJsZSBpbiAnZm9yJyBsb29wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbm9uX3N0YXRpY19zdGF0aWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm9uLXN0YXRpYyBkZWNsYXJhdGlvbiBvZiAlMCBmb2xsb3dzIHN0YXRpYyBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vbl90ZW1wbGF0ZV9pbl9tZW1iZXJfdGVtcGxhdGVfaWRfc3VnZ2VzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtZW1iZXIgJTAgb2YgJTEgaXMgbm90IGEgdGVtcGxhdGU7IGRpZCB5b3UgbWVhbiAlc2VsZWN0e3xzaW1wbHkgfTIlMz8iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub25fdGVtcGxhdGVfaW5fdGVtcGxhdGVfaWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgZG9lcyBub3QgbmFtZSBhIHRlbXBsYXRlIGJ1dCBpcyBmb2xsb3dlZCBieSB0ZW1wbGF0ZSBhcmd1bWVudHMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub25fdGVtcGxhdGVfaW5fdGVtcGxhdGVfaWRfc3VnZ2VzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBkb2VzIG5vdCBuYW1lIGEgdGVtcGxhdGUgYnV0IGlzIGZvbGxvd2VkIGJ5IHRlbXBsYXRlIGFyZ3VtZW50czsgZGlkIHlvdSBtZWFuICUxPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vbl90aHJlYWRfdGhyZWFkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vbi10aHJlYWQtbG9jYWwgZGVjbGFyYXRpb24gb2YgJTAgZm9sbG93cyB0aHJlYWQtbG9jYWwgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub25fdHlwZV90ZW1wbGF0ZV9hcmdfYWRkcl9sYWJlbF9kaWZmLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRlbXBsYXRlIGFyZ3VtZW50IC8gbGFiZWwgYWRkcmVzcyBkaWZmZXJlbmNlIC8gd2hhdCBkaWQgeW91IGV4cGVjdD8iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub25fdHlwZV90ZW1wbGF0ZV9hcmdfc3Vib2JqZWN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50IHJlZmVycyB0byBzdWJvYmplY3QgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vbl90eXBlX3RlbXBsYXRlX2luX25lc3RlZF9uYW1lX3NwZWNpZmllciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJxdWFsaWZpZWQgbmFtZSByZWZlcnMgaW50byBhIHNwZWNpYWxpemF0aW9uIG9mICVzZWxlY3R7ZnVuY3Rpb258dmFyaWFibGV9MCB0ZW1wbGF0ZSAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vbl90eXBlX3RlbXBsYXRlX3Bhcm1fdHlwZV9kZWR1Y3Rpb25fZmFpbHVyZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgJTAgd2l0aCB0eXBlICUxIGhhcyBpbmNvbXBhdGlibGUgaW5pdGlhbGl6ZXIgb2YgdHlwZSAlMiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vbl92YXJpYWJsZV9kZWNsX2luX2ZvciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tdmFyaWFibGUgZGVjbGFyYXRpb24gaW4gJ2ZvcicgbG9vcCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vbl92aXJ0dWFsX3B1cmUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgaXMgbm90IHZpcnR1YWwgYW5kIGNhbm5vdCBiZSBkZWNsYXJlZCBwdXJlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbm9uZnVuY3Rpb25fYmxvY2tfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJibG9jayBwb2ludGVyIHRvIG5vbi1mdW5jdGlvbiB0eXBlIGlzIGludmFsaWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub25zdGF0aWNfbWVtYmVyX291dF9vZl9saW5lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vbi1zdGF0aWMgZGF0YSBtZW1iZXIgZGVmaW5lZCBvdXQtb2YtbGluZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vbnRlbXBvcmFsX2J1aWx0aW5fbXVzdF9iZV9wb2ludGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFkZHJlc3MgYXJndW1lbnQgdG8gbm9udGVtcG9yYWwgYnVpbHRpbiBtdXN0IGJlIGEgcG9pbnRlciAoJTAgaW52YWxpZCkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub250ZW1wb3JhbF9idWlsdGluX211c3RfYmVfcG9pbnRlcl9pbnRmbHRwdHJfb3JfdmVjdG9yLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFkZHJlc3MgYXJndW1lbnQgdG8gbm9udGVtcG9yYWwgYnVpbHRpbiBtdXN0IGJlIGEgcG9pbnRlciB0byBpbnRlZ2VyLCBmbG9hdCwgcG9pbnRlciwgb3IgYSB2ZWN0b3Igb2Ygc3VjaCB0eXBlcyAoJTAgaW52YWxpZCkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub3JldHVybl9ibG9ja19oYXNfcmV0dXJuX2V4cHIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYmxvY2sgZGVjbGFyZWQgJ25vcmV0dXJuJyBzaG91bGQgbm90IHJldHVybiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vcmV0dXJuX2xhbWJkYV9oYXNfcmV0dXJuX2V4cHIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibGFtYmRhIGRlY2xhcmVkICdub3JldHVybicgc2hvdWxkIG5vdCByZXR1cm4iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDMpCitESUFHKGVycl9ub3JldHVybl9taXNzaW5nX29uX2ZpcnN0X2RlY2wsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZnVuY3Rpb24gZGVjbGFyZWQgJ1tbbm9yZXR1cm5dXScgYWZ0ZXIgaXRzIGZpcnN0IGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbm9yZXR1cm5fbm9uX2Z1bmN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidfTm9yZXR1cm4nIGNhbiBvbmx5IGFwcGVhciBvbiBmdW5jdGlvbnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub3NldHRlcl9wcm9wZXJ0eV9hc3NpZ25tZW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7YXNzaWdubWVudCB0byByZWFkb25seSBwcm9wZXJ0eXxubyBzZXR0ZXIgbWV0aG9kICUxIGZvciBhc3NpZ25tZW50IHRvIHByb3BlcnR5fTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub3NldHRlcl9wcm9wZXJ0eV9pbmNkZWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHslc2VsZWN0e2luY3JlbWVudHxkZWNyZW1lbnR9MSBvZiByZWFkb25seSBwcm9wZXJ0eXxubyBzZXR0ZXIgbWV0aG9kICUyIGZvciAlc2VsZWN0e2luY3JlbWVudHxkZWNyZW1lbnR9MSBvZiBwcm9wZXJ0eX0wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbm90X2NsYXNzX3RlbXBsYXRlX3NwZWNpYWxpemF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBzcGVjaWFsaXplIGEgJXNlbGVjdHtkZXBlbmRlbnQgdGVtcGxhdGV8dGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyfTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub3RfZGlyZWN0X2Jhc2Vfb3JfdmlydHVhbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlICUwIGlzIG5vdCBhIGRpcmVjdCBvciB2aXJ0dWFsIGJhc2Ugb2YgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub3RfZm91bmRfYnlfdHdvX3BoYXNlX2xvb2t1cCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYWxsIHRvIGZ1bmN0aW9uICUwIHRoYXQgaXMgbmVpdGhlciB2aXNpYmxlIGluIHRoZSB0ZW1wbGF0ZSBkZWZpbml0aW9uIG5vciBmb3VuZCBieSBhcmd1bWVudC1kZXBlbmRlbnQgbG9va3VwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbm90X2ludGVncmFsX3R5cGVfYW5vbl9iaXRmaWVsZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhbm9ueW1vdXMgYml0LWZpZWxkIGhhcyBub24taW50ZWdyYWwgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25vdF9pbnRlZ3JhbF90eXBlX2JpdGZpZWxkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImJpdC1maWVsZCAlMCBoYXMgbm9uLWludGVncmFsIHR5cGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9ub3RfdGFnX2luX3Njb3BlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vICVzZWxlY3R7c3RydWN0fGludGVyZmFjZXx1bmlvbnxjbGFzc3xlbnVtfTAgbmFtZWQgJTEgaW4gJTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9uc19hdHRyaWJ1dGVfd3JvbmdfcGFyYW1ldGVyX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byAlc2VsZWN0e09iamVjdGl2ZS1DIG9iamVjdHxwb2ludGVyfHBvaW50ZXItdG8tQ0YtcG9pbnRlcn0xIHBhcmFtZXRlcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9uc2NvbnN1bWVkX2F0dHJpYnV0ZV9taXNtYXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJvdmVycmlkaW5nIG1ldGhvZCBoYXMgbWlzbWF0Y2hlZCBuc19jb25zdW1lZCBhdHRyaWJ1dGUgb24gaXRzIHBhcmFtZXRlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX25zb2JqZWN0X2F0dHJpYnV0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInTlNPYmplY3QnIGF0dHJpYnV0ZSBpcyBmb3IgcG9pbnRlciB0eXBlcyBvbmx5IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfbnNyZXR1cm5zX3JldGFpbmVkX2F0dHJpYnV0ZV9taXNtYXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJvdmVycmlkaW5nIG1ldGhvZCBoYXMgbWlzbWF0Y2hlZCBuc19yZXR1cm5zXyVzZWxlY3R7bm90X3JldGFpbmVkfHJldGFpbmVkfTAgYXR0cmlidXRlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX251bGxhYmlsaXR5X2NzX211bHRpbGV2ZWwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibnVsbGFiaWxpdHkga2V5d29yZCAlMCBjYW5ub3QgYmUgYXBwbGllZCB0byBtdWx0aS1sZXZlbCBwb2ludGVyIHR5cGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE5KQorRElBRyhlcnJfbnVsbGFiaWxpdHlfbm9ucG9pbnRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJudWxsYWJpbGl0eSBzcGVjaWZpZXIgJTAgY2Fubm90IGJlIGFwcGxpZWQgdG8gbm9uLXBvaW50ZXIgdHlwZSAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTkpCitESUFHKGVycl9vYmpjX2FycmF5X29mX2ludGVyZmFjZXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJyYXkgb2YgaW50ZXJmYWNlICUwIGlzIGludmFsaWQgKHByb2JhYmx5IHNob3VsZCBiZSBhbiBhcnJheSBvZiBwb2ludGVycykiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vYmpjX2F0dHJfbm90X2lkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInBhcmFtZXRlciBvZiAlMCBhdHRyaWJ1dGUgbXVzdCBiZSBhIHNpbmdsZSBuYW1lIG9mIGFuIE9iamVjdGl2ZS1DICVzZWxlY3R7Y2xhc3N8cHJvdG9jb2x9MSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29iamNfYXR0cl9wcm90b2NvbF9yZXF1aXJlc19kZWZpbml0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImF0dHJpYnV0ZSAlMCBjYW4gb25seSBiZSBhcHBsaWVkIHRvIEBwcm90b2NvbCBkZWZpbml0aW9ucywgbm90IGZvcndhcmQgZGVjbGFyYXRpb25zIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb2JqY19hdHRyX3R5cGVkZWZfbm90X2lkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInBhcmFtZXRlciBvZiAlMCBhdHRyaWJ1dGUgbXVzdCBiZSAnaWQnIHdoZW4gdXNlZCBvbiBhIHR5cGVkZWYiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vYmpjX2F0dHJfdHlwZWRlZl9ub3Rfdm9pZF9wb2ludGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidvYmpjX2JyaWRnZShpZCknIGlzIG9ubHkgYWxsb3dlZCBvbiBzdHJ1Y3RzIGFuZCB0eXBlZGVmcyBvZiB2b2lkIHBvaW50ZXJzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb2JqY19icmlkZ2VkX3JlbGF0ZWRfaW52YWxpZF9jbGFzcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb3VsZCBub3QgZmluZCBPYmplY3RpdmUtQyBjbGFzcyAlMCB0byBjb252ZXJ0ICUxIHRvICUyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb2JqY19icmlkZ2VkX3JlbGF0ZWRfaW52YWxpZF9jbGFzc19uYW1lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIG11c3QgYmUgbmFtZSBvZiBhbiBPYmplY3RpdmUtQyBjbGFzcyB0byBiZSBhYmxlIHRvIGNvbnZlcnQgJTEgdG8gJTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vYmpjX2JyaWRnZWRfcmVsYXRlZF9rbm93bl9tZXRob2QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgbXVzdCBiZSBleHBsaWNpdGx5IGNvbnZlcnRlZCB0byAlMTsgdXNlICVzZWxlY3R7JW9iamNjbGFzczJ8JW9iamNpbnN0YW5jZTJ9MyBtZXRob2QgZm9yIHRoaXMgY29udmVyc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29iamNfY2ZfYnJpZGdlZF9ub3RfaW50ZXJmYWNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIkNGIG9iamVjdCBvZiB0eXBlICUwIGlzIGJyaWRnZWQgdG8gJTEsIHdoaWNoIGlzIG5vdCBhbiBPYmplY3RpdmUtQyBjbGFzcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29iamNfZGVjbHNfbWF5X29ubHlfYXBwZWFyX2luX2dsb2JhbF9zY29wZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJPYmplY3RpdmUtQyBkZWNsYXJhdGlvbnMgbWF5IG9ubHkgYXBwZWFyIGluIGdsb2JhbCBzY29wZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29iamNfZXhjZXB0aW9uc19kaXNhYmxlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgdXNlICclMCcgd2l0aCBPYmplY3RpdmUtQyBleGNlcHRpb25zIGRpc2FibGVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb2JqY19pbGxlZ2FsX2JveGVkX2V4cHJlc3Npb25fdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbGxlZ2FsIHR5cGUgJTAgdXNlZCBpbiBhIGJveGVkIGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vYmpjX2luY29tcGxldGVfYm94ZWRfZXhwcmVzc2lvbl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluY29tcGxldGUgdHlwZSAlMCB1c2VkIGluIGEgYm94ZWQgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29iamNfaW5kZXhfaW5jb21wbGV0ZV9jbGFzc190eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIk9iamVjdGl2ZS1DIGluZGV4IGV4cHJlc3Npb24gaGFzIGluY29tcGxldGUgY2xhc3MgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29iamNfaW5kZXhpbmdfbWV0aG9kX3Jlc3VsdF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1ldGhvZCBmb3IgYWNjZXNzaW5nICVzZWxlY3R7ZGljdGlvbmFyeXxhcnJheX0xIGVsZW1lbnQgbXVzdCBoYXZlIE9iamVjdGl2ZS1DIG9iamVjdCByZXR1cm4gdHlwZSBpbnN0ZWFkIG9mICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb2JqY19raW5kb2Zfbm9ub2JqZWN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidfX2tpbmRvZicgc3BlY2lmaWVyIGNhbm5vdCBiZSBhcHBsaWVkIHRvIG5vbi1vYmplY3QgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29iamNfa2luZG9mX3dyb25nX3Bvc2l0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidfX2tpbmRvZicgdHlwZSBzcGVjaWZpZXIgbXVzdCBwcmVjZWRlIHRoZSBkZWNsYXJhdG9yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb2JqY19saXRlcmFsX21ldGhvZF9zaWcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibGl0ZXJhbCBjb25zdHJ1Y3Rpb24gbWV0aG9kICUwIGhhcyBpbmNvbXBhdGlibGUgc2lnbmF0dXJlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb2JqY19tZXRob2RfdW5zdXBwb3J0ZWRfcGFyYW1fcmV0X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgJXNlbGVjdHtwYXJhbWV0ZXJ8cmV0dXJufTEgdHlwZSBpcyB1bnN1cHBvcnRlZDsgc3VwcG9ydCBmb3IgdmVjdG9yIHR5cGVzIGZvciB0aGlzIHRhcmdldCBpcyBpbnRyb2R1Y2VkIGluICUyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb2JqY19tdWx0aXBsZV9zdWJzY3JpcHRfdHlwZV9jb252ZXJzaW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluZGV4aW5nIGV4cHJlc3Npb24gaXMgaW52YWxpZCBiZWNhdXNlIHN1YnNjcmlwdCB0eXBlICUwIGhhcyBtdWx0aXBsZSB0eXBlIGNvbnZlcnNpb24gZnVuY3Rpb25zIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb2JqY19ub25fdHJpdmlhbGx5X2NvcHlhYmxlX2JveGVkX2V4cHJlc3Npb25fdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tdHJpdmlhbGx5IGNvcHlhYmxlIHR5cGUgJTAgY2Fubm90IGJlIHVzZWQgaW4gYSBib3hlZCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb2JqY19uc19icmlkZ2VkX2ludmFsaWRfY2ZvYmplY3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiT2JqZWN0aXZlQyBvYmplY3Qgb2YgdHlwZSAlMCBpcyBicmlkZ2VkIHRvICUxLCB3aGljaCBpcyBub3QgdmFsaWQgQ0Ygb2JqZWN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb2JqY19vYmplY3RfYXNzaWdubWVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgYXNzaWduIHRvIGNsYXNzIG9iamVjdCAoJTAgaW52YWxpZCkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vYmpjX29iamVjdF9jYXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgY2F0Y2ggYW4gT2JqZWN0aXZlLUMgb2JqZWN0IGJ5IHZhbHVlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb2JqY19wYXJhbWV0ZXJpemVkX2NhdGVnb3J5X25vbmNsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7ZXh0ZW5zaW9ufGNhdGVnb3J5fTAgb2Ygbm9uLXBhcmFtZXRlcml6ZWQgY2xhc3MgJTEgY2Fubm90IGhhdmUgdHlwZSBwYXJhbWV0ZXJzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyMCkKK0RJQUcoZXJyX29iamNfcGFyYW1ldGVyaXplZF9mb3J3YXJkX2NsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZvcndhcmQgZGVjbGFyYXRpb24gb2Ygbm9uLXBhcmFtZXRlcml6ZWQgY2xhc3MgJTAgY2Fubm90IGhhdmUgdHlwZSBwYXJhbWV0ZXJzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyMCkKK0RJQUcoZXJyX29iamNfcGFyYW1ldGVyaXplZF9mb3J3YXJkX2NsYXNzX2ZpcnN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNsYXNzICUwIHByZXZpb3VzbHkgZGVjbGFyZWQgd2l0aCB0eXBlIHBhcmFtZXRlcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIwKQorRElBRyhlcnJfb2JqY19wcmVjaXNlX2xpZmV0aW1lX2JhZF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm9iamNfcHJlY2lzZV9saWZldGltZSBvbmx5IGFwcGxpZXMgdG8gcmV0YWluYWJsZSB0eXBlczsgdHlwZSBoZXJlIGlzICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb2JqY19wcm9wZXJ0eV9hdHRyX211dHVhbGx5X2V4Y2x1c2l2ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwcm9wZXJ0eSBhdHRyaWJ1dGVzICclMCcgYW5kICclMScgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29iamNfcHJvcGVydHlfcmVxdWlyZXNfb2JqZWN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInByb3BlcnR5IHdpdGggJyUwJyBhdHRyaWJ1dGUgbXVzdCBiZSBvZiBvYmplY3QgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29iamNfcm9vdF9jbGFzc19zdWJjbGFzcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJvYmpjX3Jvb3RfY2xhc3MgYXR0cmlidXRlIG1heSBvbmx5IGJlIHNwZWNpZmllZCBvbiBhIHJvb3QgY2xhc3MgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vYmpjX3J1bnRpbWVfdmlzaWJsZV9jYXRlZ29yeSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgaW1wbGVtZW50IGEgY2F0ZWdvcnkgZm9yIGNsYXNzICUwIHRoYXQgaXMgb25seSB2aXNpYmxlIHZpYSB0aGUgT2JqZWN0aXZlLUMgcnVudGltZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29iamNfcnVudGltZV92aXNpYmxlX3N1YmNsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBpbXBsZW1lbnQgc3ViY2xhc3MgJTAgb2YgYSBzdXBlcmNsYXNzICUxIHRoYXQgaXMgb25seSB2aXNpYmxlIHZpYSB0aGUgT2JqZWN0aXZlLUMgcnVudGltZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29iamNfc3Vic2NyaXB0X2Jhc2VfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2RpY3Rpb25hcnl8YXJyYXl9MSBzdWJzY3JpcHQgYmFzZSB0eXBlICUwIGlzIG5vdCBhbiBPYmplY3RpdmUtQyBvYmplY3QiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vYmpjX3N1YnNjcmlwdF9kaWNfb2JqZWN0X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWV0aG9kIG9iamVjdCBwYXJhbWV0ZXIgdHlwZSAlMCBpcyBub3Qgb2JqZWN0IHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vYmpjX3N1YnNjcmlwdF9pbmRleF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1ldGhvZCBpbmRleCBwYXJhbWV0ZXIgdHlwZSAlMCBpcyBub3QgaW50ZWdyYWwgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29iamNfc3Vic2NyaXB0X2tleV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1ldGhvZCBrZXkgcGFyYW1ldGVyIHR5cGUgJTAgaXMgbm90IG9iamVjdCB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb2JqY19zdWJzY3JpcHRfbWV0aG9kX25vdF9mb3VuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBtZXRob2QgdG8gJXNlbGVjdHtyZWFkfHdyaXRlfTEgJXNlbGVjdHtkaWN0aW9uYXJ5fGFycmF5fTIgZWxlbWVudCBub3QgZm91bmQgb24gb2JqZWN0IG9mIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vYmpjX3N1YnNjcmlwdF9vYmplY3RfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgYXNzaWduIHRvIHRoaXMgJXNlbGVjdHtkaWN0aW9uYXJ5fGFycmF5fTEgYmVjYXVzZSBhc3NpZ25pbmcgbWV0aG9kJ3MgMm5kIHBhcmFtZXRlciBvZiB0eXBlICUwIGlzIG5vdCBhbiBPYmplY3RpdmUtQyBwb2ludGVyIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vYmpjX3N1YnNjcmlwdF9wb2ludGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluZGV4aW5nIGV4cHJlc3Npb24gaXMgaW52YWxpZCBiZWNhdXNlIHN1YnNjcmlwdCB0eXBlICUwIGlzIG5vdCBhbiBPYmplY3RpdmUtQyBwb2ludGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb2JqY19zdWJzY3JpcHRfdHlwZV9jb252ZXJzaW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluZGV4aW5nIGV4cHJlc3Npb24gaXMgaW52YWxpZCBiZWNhdXNlIHN1YnNjcmlwdCB0eXBlICUwIGlzIG5vdCBhbiBpbnRlZ3JhbCBvciBPYmplY3RpdmUtQyBwb2ludGVyIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vYmpjX3N5bmNocm9uaXplZF9leHBlY3RzX29iamVjdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJAc3luY2hyb25pemVkIHJlcXVpcmVzIGFuIE9iamVjdGl2ZS1DIG9iamVjdCB0eXBlICglMCBpbnZhbGlkKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29iamNfdGhyb3dfZXhwZWN0c19vYmplY3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiQHRocm93IHJlcXVpcmVzIGFuIE9iamVjdGl2ZS1DIG9iamVjdCB0eXBlICglMCBpbnZhbGlkKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29iamNfdHlwZV9hcmdfZG9lc19ub3RfbWF0Y2hfYm91bmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSBhcmd1bWVudCAlMCBkb2VzIG5vdCBzYXRpc2Z5IHRoZSBib3VuZCAoJTEpIG9mIHR5cGUgcGFyYW1ldGVyICUyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfb2JqY190eXBlX2FyZ19leHBsaWNpdF9udWxsYWJpbGl0eSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlIGFyZ3VtZW50ICUwIGNhbm5vdCBleHBsaWNpdGx5IHNwZWNpZnkgbnVsbGFiaWxpdHkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE5KQorRElBRyhlcnJfb2JqY190eXBlX2FyZ19taXNzaW5nLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIHR5cGUgb3IgcHJvdG9jb2wgbmFtZWQgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIwKQorRElBRyhlcnJfb2JqY190eXBlX2FyZ19taXNzaW5nX3N0YXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSBhcmd1bWVudCAlMCBtdXN0IGJlIGEgcG9pbnRlciAocmVxdWlyZXMgYSAnKicpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyMCkKK0RJQUcoZXJyX29iamNfdHlwZV9hcmdfbm90X2lkX2NvbXBhdGlibGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSBhcmd1bWVudCAlMCBpcyBuZWl0aGVyIGFuIE9iamVjdGl2ZS1DIG9iamVjdCBub3IgYSBibG9jayB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhlcnJfb2JqY190eXBlX2FyZ19xdWFsaWZpZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSBhcmd1bWVudCAlMCBjYW5ub3QgYmUgcXVhbGlmaWVkIHdpdGggJyUxJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMjApCitESUFHKGVycl9vYmpjX3R5cGVfYXJnc19hbmRfcHJvdG9jb2xzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFuZ2xlIGJyYWNrZXRzIGNvbnRhaW4gYm90aCBhICVzZWxlY3R7dHlwZXxwcm90b2NvbH0wICglMSkgYW5kIGEgJXNlbGVjdHtwcm90b2NvbHx0eXBlfTAgKCUyKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMjApCitESUFHKGVycl9vYmpjX3R5cGVfYXJnc19ub25fY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSBhcmd1bWVudHMgY2Fubm90IGJlIGFwcGxpZWQgdG8gbm9uLWNsYXNzIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIwKQorRElBRyhlcnJfb2JqY190eXBlX2FyZ3Nfbm9uX3BhcmFtZXRlcml6ZWRfY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSBhcmd1bWVudHMgY2Fubm90IGJlIGFwcGxpZWQgdG8gbm9uLXBhcmFtZXRlcml6ZWQgY2xhc3MgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIwKQorRElBRyhlcnJfb2JqY190eXBlX2FyZ3Nfc3BlY2lhbGl6ZWRfY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSBhcmd1bWVudHMgY2Fubm90IGJlIGFwcGxpZWQgdG8gYWxyZWFkeS1zcGVjaWFsaXplZCBjbGFzcyB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyMCkKK0RJQUcoZXJyX29iamNfdHlwZV9hcmdzX3dyb25nX2FyaXR5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRvbyAlc2VsZWN0e21hbnl8ZmV3fTAgdHlwZSBhcmd1bWVudHMgZm9yIGNsYXNzICUxIChoYXZlICUyLCBleHBlY3RlZCAlMykiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIwKQorRElBRyhlcnJfb2JqY190eXBlX3BhcmFtX2FyaXR5X21pc21hdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7Zm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnxjbGFzcyBkZWZpbml0aW9ufGNhdGVnb3J5fGV4dGVuc2lvbn0wIGhhcyB0b28gJXNlbGVjdHtmZXd8bWFueX0xIHR5cGUgcGFyYW1ldGVycyAoZXhwZWN0ZWQgJTIsIGhhdmUgJTMpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyMCkKK0RJQUcoZXJyX29iamNfdHlwZV9wYXJhbV9ib3VuZF9jb25mbGljdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlIGJvdW5kICUwIGZvciB0eXBlIHBhcmFtZXRlciAlMSBjb25mbGljdHMgd2l0aCAlc2VsZWN0e2ltcGxpY2l0fHByZXZpb3VzfTIgYm91bmQgJTMlc2VsZWN0e2ZvciB0eXBlIHBhcmFtZXRlciAlNXx9NCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMjApCitESUFHKGVycl9vYmpjX3R5cGVfcGFyYW1fYm91bmRfZXhwbGljaXRfbnVsbGFiaWxpdHksIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSBwYXJhbWV0ZXIgJTAgYm91bmQgJTEgY2Fubm90IGV4cGxpY2l0bHkgc3BlY2lmeSBudWxsYWJpbGl0eSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTkpCitESUFHKGVycl9vYmpjX3R5cGVfcGFyYW1fYm91bmRfbWlzc2luZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtaXNzaW5nIHR5cGUgYm91bmQgJTAgZm9yIHR5cGUgcGFyYW1ldGVyICUxIGluICVzZWxlY3R7QGludGVyZmFjZXxAY2xhc3N9MiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMjApCitESUFHKGVycl9vYmpjX3R5cGVfcGFyYW1fYm91bmRfbWlzc2luZ19wb2ludGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1pc3NpbmcgJyonIGluIHR5cGUgYm91bmQgJTAgZm9yIHR5cGUgcGFyYW1ldGVyICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyMCkKK0RJQUcoZXJyX29iamNfdHlwZV9wYXJhbV9ib3VuZF9ub25vYmplY3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSBib3VuZCAlMCBmb3IgdHlwZSBwYXJhbWV0ZXIgJTEgaXMgbm90IGFuIE9iamVjdGl2ZS1DIHBvaW50ZXIgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMjApCitESUFHKGVycl9vYmpjX3R5cGVfcGFyYW1fYm91bmRfcXVhbGlmaWVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInR5cGUgYm91bmQgJTEgZm9yIHR5cGUgcGFyYW1ldGVyICUwIGNhbm5vdCBiZSBxdWFsaWZpZWQgd2l0aCAnJTInIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyMCkKK0RJQUcoZXJyX29iamNfdHlwZV9wYXJhbV9yZWRlY2wsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVkZWNsYXJhdGlvbiBvZiB0eXBlIHBhcmFtZXRlciAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMjApCitESUFHKGVycl9vYmpjX3R5cGVfcGFyYW1fdmFyaWFuY2VfY29uZmxpY3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtpbnxjb3xjb250cmF9MHZhcmlhbnQgdHlwZSBwYXJhbWV0ZXIgJTEgY29uZmxpY3RzIHdpdGggcHJldmlvdXMgJXNlbGVjdHtpbnxjb3xjb250cmF9MnZhcmlhbnQgdHlwZSBwYXJhbWV0ZXIgJTMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIwKQorRElBRyhlcnJfb2JqY192YXJfZGVjbF9pbmNsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBkZWNsYXJlIHZhcmlhYmxlIGluc2lkZSBAaW50ZXJmYWNlIG9yIEBwcm90b2NvbCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29iamNfdmFyaWFibGVfc2l6ZWRfdHlwZV9ub3RfYXRfZW5kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZpZWxkICUwIHdpdGggdmFyaWFibGUgc2l6ZWQgdHlwZSAlMSBpcyBub3QgYXQgdGhlIGVuZCBvZiBjbGFzcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29iamVjdF9jYW5ub3RfYmVfcGFzc2VkX3JldHVybmVkX2J5X3ZhbHVlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludGVyZmFjZSB0eXBlICUxIGNhbm5vdCBiZSAlc2VsZWN0e3JldHVybmVkfHBhc3NlZH0wIGJ5IHZhbHVlOyBkaWQgeW91IGZvcmdldCAqIGluICUxPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29mZnNldG9mX2FycmF5X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib2Zmc2V0b2YgcmVxdWlyZXMgYXJyYXkgdHlwZSwgJTAgaW52YWxpZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29mZnNldG9mX2JpdGZpZWxkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBjb21wdXRlIG9mZnNldCBvZiBiaXQtZmllbGQgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vZmZzZXRvZl9maWVsZF9vZl92aXJ0dWFsX2Jhc2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBhcHBsaWNhdGlvbiBvZiAnb2Zmc2V0b2YnIHRvIGEgZmllbGQgb2YgYSB2aXJ0dWFsIGJhc2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vZmZzZXRvZl9pbmNvbXBsZXRlX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib2Zmc2V0b2Ygb2YgaW5jb21wbGV0ZSB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb2Zmc2V0b2ZfcmVjb3JkX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib2Zmc2V0b2YgcmVxdWlyZXMgc3RydWN0LCB1bmlvbiwgb3IgY2xhc3MgdHlwZSwgJTAgaW52YWxpZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29tcF9hbGlnbmVkX2V4cGVjdGVkX2FycmF5X29yX3B0ciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhcmd1bWVudCBvZiBhbGlnbmVkIGNsYXVzZSBzaG91bGQgYmUgYXJyYXklc2VsZWN0eyBvciBwb2ludGVyfCwgcG9pbnRlciwgcmVmZXJlbmNlIHRvIGFycmF5IG9yIHJlZmVyZW5jZSB0byBwb2ludGVyfTEsIG5vdCAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfYWxpZ25lZF90d2ljZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2EgdmFyaWFibGV8YSBwYXJhbWV0ZXJ8J3RoaXMnfTAgY2Fubm90IGFwcGVhciBpbiBtb3JlIHRoYW4gb25lIGFsaWduZWQgY2xhdXNlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9hbWJpZ3VvdXNfY29udmVyc2lvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhbWJpZ3VvdXMgY29udmVyc2lvbiBmcm9tIHR5cGUgJTAgdG8gYW4gaW50ZWdyYWwgb3IgdW5zY29wZWQgZW51bWVyYXRpb24gdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfYXJndW1lbnRfdHlwZV9pc2RldmljZXB0ciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBwb2ludGVyLCBhcnJheSwgcmVmZXJlbmNlIHRvIHBvaW50ZXIsIG9yIHJlZmVyZW5jZSB0byBhcnJheSBpbiAnaXNfZGV2aWNlX3B0ciBjbGF1c2UnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9hcnJheV9zZWN0aW9uX3VzZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJPcGVuTVAgYXJyYXkgc2VjdGlvbiBpcyBub3QgYWxsb3dlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9hdF9sZWFzdF9vbmVfbW90aW9uX2NsYXVzZV9yZXF1aXJlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBhdCBsZWFzdCBvbmUgJ3RvJyBjbGF1c2Ugb3IgJ2Zyb20nIGNsYXVzZSBzcGVjaWZpZWQgdG8gJyNwcmFnbWEgb21wIHRhcmdldCB1cGRhdGUnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9hdG9taWNfY2FwdHVyZV9ub3RfY29tcG91bmRfc3RhdGVtZW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRoZSBzdGF0ZW1lbnQgZm9yICdhdG9taWMgY2FwdHVyZScgbXVzdCBiZSBhIGNvbXBvdW5kIHN0YXRlbWVudCBvZiBmb3JtICd7diA9IHg7IHggYmlub3A9IGV4cHI7fScsICd7eCBiaW5vcD0gZXhwcjsgdiA9IHg7fScsICd7diA9IHg7IHggPSB4IGJpbm9wIGV4cHI7fScsICd7diA9IHg7IHggPSBleHByIGJpbm9wIHg7fScsICd7eCA9IHggYmlub3AgZXhwcjsgdiA9IHg7fScsICd7eCA9IGV4cHIgYmlub3AgeDsgdiA9IHg7fScgb3IgJ3t2ID0geDsgeCA9IGV4cHI7fScsICd7diA9IHg7IHgrKzt9JywgJ3t2ID0geDsgKyt4O30nLCAneysreDsgdiA9IHg7fScsICd7eCsrOyB2ID0geDt9JywgJ3t2ID0geDsgeC0tO30nLCAne3YgPSB4OyAtLXg7fScsICd7LS14OyB2ID0geDt9JywgJ3t4LS07IHYgPSB4O30nIHdoZXJlIHggaXMgYW4gbC12YWx1ZSBleHByZXNzaW9uIHdpdGggc2NhbGFyIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX2F0b21pY19jYXB0dXJlX25vdF9leHByZXNzaW9uX3N0YXRlbWVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aGUgc3RhdGVtZW50IGZvciAnYXRvbWljIGNhcHR1cmUnIG11c3QgYmUgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQgb2YgZm9ybSAndiA9ICsreDsnLCAndiA9IC0teDsnLCAndiA9IHgrKzsnLCAndiA9IHgtLTsnLCAndiA9IHggYmlub3A9IGV4cHI7JywgJ3YgPSB4ID0geCBiaW5vcCBleHByJyBvciAndiA9IHggPSBleHByIGJpbm9wIHgnLCB3aGVyZSB4IGFuZCB2IGFyZSBib3RoIGwtdmFsdWUgZXhwcmVzc2lvbnMgd2l0aCBzY2FsYXIgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfYXRvbWljX25vdF9leHByZXNzaW9uX3N0YXRlbWVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aGUgc3RhdGVtZW50IGZvciAnYXRvbWljJyBtdXN0IGJlIGFuIGV4cHJlc3Npb24gc3RhdGVtZW50IG9mIGZvcm0gJysreDsnLCAnLS14OycsICd4Kys7JywgJ3gtLTsnLCAneCBiaW5vcD0gZXhwcjsnLCAneCA9IHggYmlub3AgZXhwcicgb3IgJ3ggPSBleHByIGJpbm9wIHgnLCB3aGVyZSB4IGlzIGFuIGwtdmFsdWUgZXhwcmVzc2lvbiB3aXRoIHNjYWxhciB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9hdG9taWNfcmVhZF9ub3RfZXhwcmVzc2lvbl9zdGF0ZW1lbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhlIHN0YXRlbWVudCBmb3IgJ2F0b21pYyByZWFkJyBtdXN0IGJlIGFuIGV4cHJlc3Npb24gc3RhdGVtZW50IG9mIGZvcm0gJ3YgPSB4OycsIHdoZXJlIHYgYW5kIHggYXJlIGJvdGggbHZhbHVlIGV4cHJlc3Npb25zIHdpdGggc2NhbGFyIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX2F0b21pY19zZXZlcmFsX2NsYXVzZXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBhdG9taWMnIGNhbm5vdCBjb250YWluIG1vcmUgdGhhbiBvbmUgJ3JlYWQnLCAnd3JpdGUnLCAndXBkYXRlJyBvciAnY2FwdHVyZScgY2xhdXNlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9hdG9taWNfdXBkYXRlX25vdF9leHByZXNzaW9uX3N0YXRlbWVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aGUgc3RhdGVtZW50IGZvciAnYXRvbWljIHVwZGF0ZScgbXVzdCBiZSBhbiBleHByZXNzaW9uIHN0YXRlbWVudCBvZiBmb3JtICcrK3g7JywgJy0teDsnLCAneCsrOycsICd4LS07JywgJ3ggYmlub3A9IGV4cHI7JywgJ3ggPSB4IGJpbm9wIGV4cHInIG9yICd4ID0gZXhwciBiaW5vcCB4Jywgd2hlcmUgeCBpcyBhbiBsLXZhbHVlIGV4cHJlc3Npb24gd2l0aCBzY2FsYXIgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfYXRvbWljX3dyaXRlX25vdF9leHByZXNzaW9uX3N0YXRlbWVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aGUgc3RhdGVtZW50IGZvciAnYXRvbWljIHdyaXRlJyBtdXN0IGJlIGFuIGV4cHJlc3Npb24gc3RhdGVtZW50IG9mIGZvcm0gJ3ggPSBleHByOycsIHdoZXJlIHggaXMgYSBsdmFsdWUgZXhwcmVzc2lvbiB3aXRoIHNjYWxhciB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9iaXRfZmllbGRzX2ZvcmJpZGRlbl9pbl9jbGF1c2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYml0IGZpZWxkcyBjYW5ub3QgYmUgdXNlZCB0byBzcGVjaWZ5IHN0b3JhZ2UgaW4gYSAnJTAnIGNsYXVzZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfY2xhdXNlX2Zsb2F0aW5nX3R5cGVfYXJnLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFyZ3VtZW50cyBvZiBPcGVuTVAgY2xhdXNlICclMCcgd2l0aCBiaXR3aXNlIG9wZXJhdG9ycyBjYW5ub3QgYmUgb2YgZmxvYXRpbmcgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfY2xhdXNlX25vdF9hcml0aG1ldGljX3R5cGVfYXJnLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFyZ3VtZW50cyBvZiBPcGVuTVAgY2xhdXNlICclMCcgZm9yICdtaW4nIG9yICdtYXgnIG11c3QgYmUgb2YgJXNlbGVjdHtzY2FsYXJ8YXJpdGhtZXRpY30xIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX2NvbnN0X3JlZHVjdGlvbl9saXN0X2l0ZW0sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29uc3QtcXVhbGlmaWVkIGxpc3QgaXRlbSBjYW5ub3QgYmUgcmVkdWN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9jb25zdF92YXJpYWJsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb25zdC1xdWFsaWZpZWQgdmFyaWFibGUgY2Fubm90IGJlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9jcml0aWNhbF93aXRoX2hpbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29uc3RydWN0cyB3aXRoIHRoZSBzYW1lIG5hbWUgbXVzdCBoYXZlIGEgJ2hpbnQnIGNsYXVzZSB3aXRoIHRoZSBzYW1lIHZhbHVlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9kZWNsYXJlX3JlZHVjdGlvbl9yZWRlZmluaXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVkZWZpbml0aW9uIG9mIHVzZXItZGVmaW5lZCByZWR1Y3Rpb24gZm9yIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX2RlY2xhcmVfdGFyZ2V0X211bHRpcGxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGFwcGVhcnMgbXVsdGlwbGUgdGltZXMgaW4gY2xhdXNlcyBvbiB0aGUgc2FtZSBkZWNsYXJlIHRhcmdldCBkaXJlY3RpdmUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX2RlY2xhcmVfdGFyZ2V0X3RvX2FuZF9saW5rLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIG11c3Qgbm90IGFwcGVhciBpbiBib3RoIGNsYXVzZXMgJ3RvJyBhbmQgJ2xpbmsnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9kZXBlbmRfY2xhdXNlX3RocmVhZF9zaW1kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidkZXBlbmQnIGNsYXVzZXMgY2Fubm90IGJlIG1peGVkIHdpdGggJyUwJyBjbGF1c2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX2RlcGVuZF9zaW5rX2V4cGVjdGVkX2xvb3BfaXRlcmF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkJXNlbGVjdHt8ICUxfTAgbG9vcCBpdGVyYXRpb24gdmFyaWFibGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX2RlcGVuZF9zaW5rX2V4cGVjdGVkX3BsdXNfbWludXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgJysnIG9yICctJyBvcGVyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX2RlcGVuZF9zaW5rX3NvdXJjZV9ub3RfYWxsb3dlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInZGVwZW5kKCVzZWxlY3R7c291cmNlfHNpbms6dmVjfTApJyBjbGF1c2Ulc2VsZWN0e3xzfTAgY2Fubm90IGJlIG1peGVkIHdpdGggJ2RlcGVuZCglc2VsZWN0e3Npbms6dmVjfHNvdXJjZX0wKScgY2xhdXNlJXNlbGVjdHtzfH0wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9kZXBlbmRfc2lua191bmV4cGVjdGVkX2V4cHIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5leHBlY3RlZCBleHByZXNzaW9uOiBudW1iZXIgb2YgZXhwcmVzc2lvbnMgaXMgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBhc3NvY2lhdGVkIGxvb3BzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9lbmNsb3NlZF9kZWNsYXJlX3RhcmdldCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWNsYXJlIHRhcmdldCByZWdpb24gbWF5IG5vdCBiZSBlbmNsb3NlZCB3aXRoaW4gYW5vdGhlciBkZWNsYXJlIHRhcmdldCByZWdpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX2V4cGVjdGVkX2FjY2Vzc190b19kYXRhX2ZpZWxkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGFjY2VzcyB0byBkYXRhIGZpZWxkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9leHBlY3RlZF9hZGRyZXNzYWJsZV9sdmFsdWVfb3JfYXJyYXlfaXRlbSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBhZGRyZXNzYWJsZSBsdmFsdWUgZXhwcmVzc2lvbiwgYXJyYXkgZWxlbWVudCBvciBhcnJheSBzZWN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9leHBlY3RlZF9iYXNlX3Zhcl9uYW1lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIHZhcmlhYmxlIG5hbWUgYXMgYSBiYXNlIG9mIHRoZSBhcnJheSAlc2VsZWN0e3N1YnNjcmlwdHxzZWN0aW9ufTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX2V4cGVjdGVkX2ludF9wYXJhbSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBhIHJlZmVyZW5jZSB0byBhbiBpbnRlZ2VyLXR5cGVkIHBhcmFtZXRlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfZXhwZWN0ZWRfbmFtZWRfdmFyX21lbWJlcl9vcl9hcnJheV9leHByZXNzaW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGV4cHJlc3Npb24gY29udGFpbmluZyBvbmx5IG1lbWJlciBhY2Nlc3NlcyBhbmQvb3IgYXJyYXkgc2VjdGlvbnMgYmFzZWQgb24gbmFtZWQgdmFyaWFibGVzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9leHBlY3RlZF91bmlmb3JtX3BhcmFtLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGEgcmVmZXJlbmNlIHRvIGEgcGFyYW1ldGVyIHNwZWNpZmllZCBpbiBhICd1bmlmb3JtJyBjbGF1c2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX2V4cGVjdGVkX3Zhcl9hcmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgaXMgbm90IGEgZ2xvYmFsIHZhcmlhYmxlLCBzdGF0aWMgbG9jYWwgdmFyaWFibGUgb3Igc3RhdGljIGRhdGEgbWVtYmVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9leHBlY3RlZF92YXJfYXJnX3N1Z2dlc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgaXMgbm90IGEgZ2xvYmFsIHZhcmlhYmxlLCBzdGF0aWMgbG9jYWwgdmFyaWFibGUgb3Igc3RhdGljIGRhdGEgbWVtYmVyOyBkaWQgeW91IG1lYW4gJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX2V4cGVjdGVkX3Zhcl9uYW1lX21lbWJlcl9leHByLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIHZhcmlhYmxlIG5hbWUlc2VsZWN0e3wgb3IgZGF0YSBtZW1iZXIgb2YgY3VycmVudCBjbGFzc30wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9leHBlY3RlZF92YXJfbmFtZV9tZW1iZXJfZXhwcl9vcl9hcnJheV9pdGVtLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIHZhcmlhYmxlIG5hbWUlc2VsZWN0e3wsIGRhdGEgbWVtYmVyIG9mIGN1cnJlbnQgY2xhc3N9MCwgYXJyYXkgZWxlbWVudCBvciBhcnJheSBzZWN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9leHBsaWNpdF9jb252ZXJzaW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cHJlc3Npb24gcmVxdWlyZXMgZXhwbGljaXQgY29udmVyc2lvbiBmcm9tICUwIHRvICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9maXJzdHByaXZhdGVfaW5jb21wbGV0ZV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImEgZmlyc3Rwcml2YXRlIHZhcmlhYmxlIHdpdGggaW5jb21wbGV0ZSB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9mdW5jdGlvbl9leHBlY3RlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInI3ByYWdtYSBvbXAgZGVjbGFyZSBzaW1kJyBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGZ1bmN0aW9ucyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfZnVuY3Rpb25faW5fbGlua19jbGF1c2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZnVuY3Rpb24gbmFtZSBpcyBub3QgYWxsb3dlZCBpbiAnbGluaycgY2xhdXNlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9nbG9iYWxfdmFyX2FyZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhcmd1bWVudHMgb2YgJyNwcmFnbWEgb21wICUwJyBtdXN0IGhhdmUgJXNlbGVjdHtnbG9iYWwgc3RvcmFnZXxzdGF0aWMgc3RvcmFnZSBkdXJhdGlvbn0xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9ncmFpbnNpemVfbnVtX3Rhc2tzX211dHVhbGx5X2V4Y2x1c2l2ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInJTAnIGFuZCAnJTEnIGNsYXVzZSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIGFuZCBtYXkgbm90IGFwcGVhciBvbiB0aGUgc2FtZSBkaXJlY3RpdmUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX2hpbnRfY2xhdXNlX25vX25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhlIG5hbWUgb2YgdGhlIGNvbnN0cnVjdCBtdXN0IGJlIHNwZWNpZmllZCBpbiBwcmVzZW5jZSBvZiAnaGludCcgY2xhdXNlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9pbl9yZWR1Y3Rpb25fbm90X3Rhc2tfcmVkdWN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluX3JlZHVjdGlvbiB2YXJpYWJsZSBtdXN0IGFwcGVhciBpbiBhIHRhc2tfcmVkdWN0aW9uIGNsYXVzZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfaW5jb21wbGV0ZV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cHJlc3Npb24gaGFzIGluY29tcGxldGUgY2xhc3MgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfaW52YWxpZF9tYXBfdHlwZV9mb3JfZGlyZWN0aXZlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7bWFwIHR5cGUgJyUxJyBpcyBub3QgYWxsb3dlZHxtYXAgdHlwZSBtdXN0IGJlIHNwZWNpZmllZH0wIGZvciAnI3ByYWdtYSBvbXAgJTInIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9pbnZhbGlkX3RhcmdldF9kZWNsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIHVzZWQgaW4gZGVjbGFyZSB0YXJnZXQgZGlyZWN0aXZlIGlzIG5vdCBhIHZhcmlhYmxlIG9yIGEgZnVuY3Rpb24gbmFtZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfbGFzdHByaXZhdGVfaW5jb21wbGV0ZV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImEgbGFzdHByaXZhdGUgdmFyaWFibGUgd2l0aCBpbmNvbXBsZXRlIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX2xpbmVhcl9kaXN0cmlidXRlX3Zhcl9ub25fbG9vcF9pdGVyYXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib25seSBsb29wIGl0ZXJhdGlvbiB2YXJpYWJsZXMgYXJlIGFsbG93ZWQgaW4gJ2xpbmVhcicgY2xhdXNlIGluIGRpc3RyaWJ1dGUgZGlyZWN0aXZlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfbGluZWFyX2V4cGVjdGVkX2ludF9vcl9wdHIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJndW1lbnQgb2YgYSBsaW5lYXIgY2xhdXNlIHNob3VsZCBiZSBvZiBpbnRlZ3JhbCBvciBwb2ludGVyIHR5cGUsIG5vdCAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfbGluZWFyX2luY29tcGxldGVfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhIGxpbmVhciB2YXJpYWJsZSB3aXRoIGluY29tcGxldGUgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfbGluZWFyX29yZGVyZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ2xpbmVhcicgY2xhdXNlIGNhbm5vdCBiZSBzcGVjaWZpZWQgYWxvbmcgd2l0aCAnb3JkZXJlZCcgY2xhdXNlIHdpdGggYSBwYXJhbWV0ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX2xvY2FsX3Zhcl9pbl90aHJlYWRwcml2YXRlX2luaXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFyaWFibGUgd2l0aCBsb2NhbCBzdG9yYWdlIGluIGluaXRpYWwgdmFsdWUgb2YgdGhyZWFkcHJpdmF0ZSB2YXJpYWJsZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfbG9vcF9jYW5ub3RfdXNlX3N0bXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJyUwJyBzdGF0ZW1lbnQgY2Fubm90IGJlIHVzZWQgaW4gT3Blbk1QIGZvciBsb29wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9sb29wX2RpZmZfY3h4LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvdWxkIG5vdCBjYWxjdWxhdGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgY2FsbGluZyAnb3BlcmF0b3ItJyB3aXRoIHVwcGVyIGFuZCBsb3dlciBsb29wIGJvdW5kcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfbG9vcF9pbmNyX25vdF9jb21wYXRpYmxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluY3JlbWVudCBleHByZXNzaW9uIG11c3QgY2F1c2UgJTAgdG8gJXNlbGVjdHtkZWNyZWFzZXxpbmNyZWFzZX0xIG9uIGVhY2ggaXRlcmF0aW9uIG9mIE9wZW5NUCBmb3IgbG9vcCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfbG9vcF9ub3RfY2Fub25pY2FsX2NvbmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29uZGl0aW9uIG9mIE9wZW5NUCBmb3IgbG9vcCBtdXN0IGJlIGEgcmVsYXRpb25hbCBjb21wYXJpc29uICgnPCcsICc8PScsICc+Jywgb3IgJz49Jykgb2YgbG9vcCB2YXJpYWJsZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfbG9vcF9ub3RfY2Fub25pY2FsX2luY3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5jcmVtZW50IGNsYXVzZSBvZiBPcGVuTVAgZm9yIGxvb3AgbXVzdCBwZXJmb3JtIHNpbXBsZSBhZGRpdGlvbiBvciBzdWJ0cmFjdGlvbiBvbiBsb29wIHZhcmlhYmxlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9sb29wX25vdF9jYW5vbmljYWxfaW5pdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbml0aWFsaXphdGlvbiBjbGF1c2Ugb2YgT3Blbk1QIGZvciBsb29wIGlzIG5vdCBpbiBjYW5vbmljYWwgZm9ybSAoJ3ZhciA9IGluaXQnIG9yICdUIHZhciA9IGluaXQnKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfbG9vcF92YXJfZHNhLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImxvb3AgaXRlcmF0aW9uIHZhcmlhYmxlIGluIHRoZSBhc3NvY2lhdGVkIGxvb3Agb2YgJ29tcCAlMScgZGlyZWN0aXZlIG1heSBub3QgYmUgJTAsIHByZWRldGVybWluZWQgYXMgJTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX2xvb3BfdmFyaWFibGVfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2YXJpYWJsZSBtdXN0IGJlIG9mIGludGVnZXIgb3IgJXNlbGVjdHtwb2ludGVyfHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3J9MCB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9tYXBfc2hhcmVkX3N0b3JhZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFyaWFibGUgYWxyZWFkeSBtYXJrZWQgYXMgbWFwcGVkIGluIGN1cnJlbnQgY29uc3RydWN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9tdWx0aXBsZV9hcnJheV9pdGVtc19pbl9tYXBfY2xhdXNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm11bHRpcGxlIGFycmF5IGVsZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZSB2YXJpYWJsZSBhcmUgbm90IGFsbG93ZWQgaW4gbWFwIGNsYXVzZXMgb2YgdGhlIHNhbWUgY29uc3RydWN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9uZWdhdGl2ZV9leHByZXNzaW9uX2luX2NsYXVzZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhcmd1bWVudCB0byAnJTAnIGNsYXVzZSBtdXN0IGJlIGEgJXNlbGVjdHtub24tbmVnYXRpdmV8c3RyaWN0bHkgcG9zaXRpdmV9MSBpbnRlZ2VyIHZhbHVlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9ub19jbGF1c2VfZm9yX2RpcmVjdGl2ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCBhdCBsZWFzdCBvbmUgJTAgY2xhdXNlIGZvciAnI3ByYWdtYSBvbXAgJTEnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9ub19kc2FfZm9yX3ZhcmlhYmxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInZhcmlhYmxlICUwIG11c3QgaGF2ZSBleHBsaWNpdGx5IHNwZWNpZmllZCBkYXRhIHNoYXJpbmcgYXR0cmlidXRlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfbm9fbW9yZV9pZl9jbGF1c2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gbW9yZSAnaWYnIGNsYXVzZSBpcyBhbGxvd2VkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9ub3RfZm9yLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7c3RhdGVtZW50IGFmdGVyICcjcHJhZ21hIG9tcCAlMScgbXVzdCBiZSBhIGZvciBsb29wfGV4cGVjdGVkICUyIGZvciBsb29wcyBhZnRlciAnI3ByYWdtYSBvbXAgJTEnJXNlbGVjdHt8LCBidXQgZm91bmQgb25seSAlNH0zfTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX25vdF9pbnRlZ3JhbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHByZXNzaW9uIG11c3QgaGF2ZSBpbnRlZ3JhbCBvciB1bnNjb3BlZCBlbnVtZXJhdGlvbiB0eXBlLCBub3QgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX25vdF9yZXNvbHZlZF9yZWR1Y3Rpb25faWRlbnRpZmllciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmFibGUgdG8gcmVzb2x2ZSBkZWNsYXJlIHJlZHVjdGlvbiBjb25zdHJ1Y3QgZm9yIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX29uY2VfcmVmZXJlbmNlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2YXJpYWJsZSBjYW4gYXBwZWFyIG9ubHkgb25jZSBpbiBPcGVuTVAgJyUwJyBjbGF1c2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX29uY2VfcmVmZXJlbmNlZF9pbl90YXJnZXRfdXBkYXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInZhcmlhYmxlIGNhbiBhcHBlYXIgb25seSBvbmNlIGluIE9wZW5NUCAndGFyZ2V0IHVwZGF0ZScgY29uc3RydWN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9vcmRlcmVkX2RpcmVjdGl2ZV93aXRoX3BhcmFtLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidvcmRlcmVkJyBkaXJlY3RpdmUgJXNlbGVjdHt3aXRob3V0IGFueSBjbGF1c2VzfHdpdGggJ3RocmVhZHMnIGNsYXVzZX0wIGNhbm5vdCBiZSBjbG9zZWx5IG5lc3RlZCBpbnNpZGUgb3JkZXJlZCByZWdpb24gd2l0aCBzcGVjaWZpZWQgcGFyYW1ldGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9vcmRlcmVkX2RpcmVjdGl2ZV93aXRob3V0X3BhcmFtLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidvcmRlcmVkJyBkaXJlY3RpdmUgd2l0aCAnZGVwZW5kJyBjbGF1c2UgY2Fubm90IGJlIGNsb3NlbHkgbmVzdGVkIGluc2lkZSBvcmRlcmVkIHJlZ2lvbiB3aXRob3V0IHNwZWNpZmllZCBwYXJhbWV0ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX29yZGVyZWRfc2ltZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInb3JkZXJlZCcgY2xhdXNlIHdpdGggYSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBzcGVjaWZpZWQgaW4gJyNwcmFnbWEgb21wICUwJyBkaXJlY3RpdmUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX29yaWdpbmFsX3N0b3JhZ2VfaXNfc2hhcmVkX2FuZF9kb2VzX25vdF9jb250YWluLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm9yaWdpbmFsIHN0b3JhZ2Ugb2YgZXhwcmVzc2lvbiBpbiBkYXRhIGVudmlyb25tZW50IGlzIHNoYXJlZCBidXQgZGF0YSBlbnZpcm9ubWVudCBkbyBub3QgZnVsbHkgY29udGFpbiBtYXBwZWQgZXhwcmVzc2lvbiBzdG9yYWdlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9vcnBoYW5lZF9kZXZpY2VfZGlyZWN0aXZlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm9ycGhhbmVkICdvbXAgJTAnIGRpcmVjdGl2ZXMgYXJlIHByb2hpYml0ZWQ7IHBlcmhhcHMgeW91IGZvcmdldCB0byBlbmNsb3NlIHRoZSBkaXJlY3RpdmUgaW50byBhICVzZWxlY3R7fHx8dGFyZ2V0IHx0ZWFtcyB9MXJlZ2lvbj8iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX29ycGhhbmVkX3NlY3Rpb25fZGlyZWN0aXZlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7b3JwaGFuZWQgJ29tcCBzZWN0aW9uJyBkaXJlY3RpdmVzIGFyZSBwcm9oaWJpdGVkLCBpdHwnb21wIHNlY3Rpb24nIGRpcmVjdGl2ZX0wIG11c3QgYmUgY2xvc2VseSBuZXN0ZWQgdG8gYSBzZWN0aW9ucyByZWdpb24lc2VsZWN0e3wsIG5vdCBhICUxIHJlZ2lvbn0wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9wYXJhbGxlbF9yZWR1Y3Rpb25faW5fdGFza19maXJzdHByaXZhdGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJndW1lbnQgb2YgYSByZWR1Y3Rpb24gY2xhdXNlIG9mIGEgJTAgY29uc3RydWN0IG11c3Qgbm90IGFwcGVhciBpbiBhIGZpcnN0cHJpdmF0ZSBjbGF1c2Ugb24gYSB0YXNrIGNvbnN0cnVjdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbm90X2NvbXBvdW5kX3N0bXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhlIHN0YXRlbWVudCBmb3IgJyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zJyBtdXN0IGJlIGEgY29tcG91bmQgc3RhdGVtZW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9wYXJhbGxlbF9zZWN0aW9uc19zdWJzdG10X25vdF9zZWN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN0YXRlbWVudCBpbiAnb21wIHBhcmFsbGVsIHNlY3Rpb25zJyBkaXJlY3RpdmUgbXVzdCBiZSBlbmNsb3NlZCBpbnRvIGEgc2VjdGlvbiByZWdpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3BhcmFtX29yX3RoaXNfaW5fY2xhdXNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIHJlZmVyZW5jZSB0byBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgb2YgZnVuY3Rpb24gJTAlc2VsZWN0e3wgb3IgJ3RoaXMnfTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3BhcmVudF9jYW5jZWxfcmVnaW9uX25vd2FpdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwYXJlbnQgcmVnaW9uIGZvciAnb21wICVzZWxlY3R7Y2FuY2VsbGF0aW9uIHBvaW50fGNhbmNlbH0wJyBjb25zdHJ1Y3QgY2Fubm90IGJlIG5vd2FpdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfcGFyZW50X2NhbmNlbF9yZWdpb25fb3JkZXJlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwYXJlbnQgcmVnaW9uIGZvciAnb21wICVzZWxlY3R7Y2FuY2VsbGF0aW9uIHBvaW50fGNhbmNlbH0wJyBjb25zdHJ1Y3QgY2Fubm90IGJlIG9yZGVyZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3BvaW50ZXJfbWFwcGVkX2Fsb25nX3dpdGhfZGVyaXZlZF9zZWN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInBvaW50ZXIgY2Fubm90IGJlIG1hcHBlZCBhbG9uZyB3aXRoIGEgc2VjdGlvbiBkZXJpdmVkIGZyb20gaXRzZWxmIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9wcml2YXRlX2luY29tcGxldGVfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhIHByaXZhdGUgdmFyaWFibGUgd2l0aCBpbmNvbXBsZXRlIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3Byb2hpYml0ZWRfcmVnaW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZ2lvbiBjYW5ub3QgYmUlc2VsZWN0e3wgY2xvc2VseX0wIG5lc3RlZCBpbnNpZGUgJyUxJyByZWdpb24lc2VsZWN0e3w7IHBlcmhhcHMgeW91IGZvcmdldCB0byBlbmNsb3NlICdvbXAgJTMnIGRpcmVjdGl2ZSBpbnRvIGEgcGFyYWxsZWwgcmVnaW9uP3w7IHBlcmhhcHMgeW91IGZvcmdldCB0byBlbmNsb3NlICdvbXAgJTMnIGRpcmVjdGl2ZSBpbnRvIGEgZm9yIG9yIGEgcGFyYWxsZWwgZm9yIHJlZ2lvbiB3aXRoICdvcmRlcmVkJyBjbGF1c2U/fDsgcGVyaGFwcyB5b3UgZm9yZ2V0IHRvIGVuY2xvc2UgJ29tcCAlMycgZGlyZWN0aXZlIGludG8gYSB0YXJnZXQgcmVnaW9uP3w7IHBlcmhhcHMgeW91IGZvcmdldCB0byBlbmNsb3NlICdvbXAgJTMnIGRpcmVjdGl2ZSBpbnRvIGEgdGVhbXMgcmVnaW9uP30yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9wcm9oaWJpdGVkX3JlZ2lvbl9hdG9taWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiT3Blbk1QIGNvbnN0cnVjdHMgbWF5IG5vdCBiZSBuZXN0ZWQgaW5zaWRlIGFuIGF0b21pYyByZWdpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3Byb2hpYml0ZWRfcmVnaW9uX2NyaXRpY2FsX3NhbWVfbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgbmVzdCAnY3JpdGljYWwnIHJlZ2lvbnMgaGF2aW5nIHRoZSBzYW1lIG5hbWUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3Byb2hpYml0ZWRfcmVnaW9uX3NpbWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiT3Blbk1QIGNvbnN0cnVjdHMgbWF5IG5vdCBiZSBuZXN0ZWQgaW5zaWRlIGEgc2ltZCByZWdpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3JlZHVjdGlvbl9pZF9ub3RfY29tcGF0aWJsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJsaXN0IGl0ZW0gb2YgdHlwZSAlMCBpcyBub3QgdmFsaWQgZm9yIHNwZWNpZmllZCByZWR1Y3Rpb24gb3BlcmF0aW9uOiB1bmFibGUgdG8gcHJvdmlkZSBkZWZhdWx0IGluaXRpYWxpemF0aW9uIHZhbHVlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9yZWR1Y3Rpb25faWRlbnRpZmllcl9taXNtYXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbl9yZWR1Y3Rpb24gdmFyaWFibGUgbXVzdCBoYXZlIHRoZSBzYW1lIHJlZHVjdGlvbiBvcGVyYXRpb24gYXMgaW4gYSB0YXNrX3JlZHVjdGlvbiBjbGF1c2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3JlZHVjdGlvbl9pbl90YXNrLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZHVjdGlvbiB2YXJpYWJsZXMgbWF5IG5vdCBiZSBhY2Nlc3NlZCBpbiBhbiBleHBsaWNpdCB0YXNrIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9yZWR1Y3Rpb25faW5jb21wbGV0ZV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImEgcmVkdWN0aW9uIGxpc3QgaXRlbSB3aXRoIGluY29tcGxldGUgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfcmVkdWN0aW9uX25vbl9hZGRyZXNzYWJsZV9leHByZXNzaW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGFkZHJlc3NhYmxlIHJlZHVjdGlvbiBpdGVtIGZvciB0aGUgdGFzay1iYXNlZCBkaXJlY3RpdmVzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9yZWR1Y3Rpb25fcmVmX3R5cGVfYXJnLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFyZ3VtZW50IG9mIE9wZW5NUCBjbGF1c2UgJyUwJyBtdXN0IHJlZmVyZW5jZSB0aGUgc2FtZSBvYmplY3QgaW4gYWxsIHRocmVhZHMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3JlZHVjdGlvbl92bGFfdW5zdXBwb3J0ZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGdlbmVyYXRlIGNvZGUgZm9yIHJlZHVjdGlvbiBvbiAlc2VsZWN0e3xhcnJheSBzZWN0aW9uLCB3aGljaCByZXF1aXJlcyBhIH0wdmFyaWFibGUgbGVuZ3RoIGFycmF5IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9yZWR1Y3Rpb25fd2l0aF9ub2dyb3VwLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidyZWR1Y3Rpb24nIGNsYXVzZSBjYW5ub3QgYmUgdXNlZCB3aXRoICdub2dyb3VwJyBjbGF1c2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3JlZHVjdGlvbl93cm9uZ190eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZHVjdGlvbiB0eXBlIGNhbm5vdCBiZSAlc2VsZWN0e3F1YWxpZmllZCB3aXRoICdjb25zdCcsICd2b2xhdGlsZScgb3IgJ3Jlc3RyaWN0J3xhIGZ1bmN0aW9ufGEgcmVmZXJlbmNlfGFuIGFycmF5fTAgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfcmVmX3R5cGVfYXJnLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFyZ3VtZW50cyBvZiAnI3ByYWdtYSBvbXAgJTAnIGNhbm5vdCBiZSBvZiByZWZlcmVuY2UgdHlwZSAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfcmVnaW9uX25vdF9maWxlX2NvbnRleHQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGlyZWN0aXZlIG11c3QgYmUgYXQgZmlsZSBvciBuYW1lc3BhY2Ugc2NvcGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3JlcXVpcmVkX2FjY2VzcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCB2YXJpYWJsZSBtdXN0IGJlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9zYW1lX3BvaW50ZXJfZGVyZWZlcmVuY2VkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInNhbWUgcG9pbnRlciBkZXJlZmVyZW5jZWQgaW4gbXVsdGlwbGUgZGlmZmVyZW50IHdheXMgaW4gbWFwIGNsYXVzZSBleHByZXNzaW9ucyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfc2NoZWR1bGVfbm9ubW9ub3RvbmljX29yZGVyZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ3NjaGVkdWxlJyBjbGF1c2Ugd2l0aCAnbm9ubW9ub3RvbmljJyBtb2RpZmllciBjYW5ub3QgYmUgc3BlY2lmaWVkIGlmIGFuICdvcmRlcmVkJyBjbGF1c2UgaXMgc3BlY2lmaWVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9zY2hlZHVsZV9ub25tb25vdG9uaWNfc3RhdGljLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidub25tb25vdG9uaWMnIG1vZGlmaWVyIGNhbiBvbmx5IGJlIHNwZWNpZmllZCB3aXRoICdkeW5hbWljJyBvciAnZ3VpZGVkJyBzY2hlZHVsZSBraW5kIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9zZWN0aW9uX2Z1bmN0aW9uX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic2VjdGlvbiBvZiBwb2ludGVyIHRvIGZ1bmN0aW9uIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3NlY3Rpb25faW5jb21wbGV0ZV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInNlY3Rpb24gb2YgcG9pbnRlciB0byBpbmNvbXBsZXRlIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3NlY3Rpb25fbGVuZ3RoX25lZ2F0aXZlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInNlY3Rpb24gbGVuZ3RoIGlzIGV2YWx1YXRlZCB0byBhIG5lZ2F0aXZlIHZhbHVlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9zZWN0aW9uX2xlbmd0aF91bmRlZmluZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic2VjdGlvbiBsZW5ndGggaXMgdW5zcGVjaWZpZWQgYW5kIGNhbm5vdCBiZSBpbmZlcnJlZCBiZWNhdXNlIHN1YnNjcmlwdGVkIHZhbHVlIGlzICVzZWxlY3R7bm90IGFuIGFycmF5fGFuIGFycmF5IG9mIHVua25vd24gYm91bmR9MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfc2VjdGlvbl9ub3Rfc3Vic2V0X29mX2FycmF5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFycmF5IHNlY3Rpb24gbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgYXJyYXkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3NlY3Rpb25zX25vdF9jb21wb3VuZF9zdG10LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRoZSBzdGF0ZW1lbnQgZm9yICcjcHJhZ21hIG9tcCBzZWN0aW9ucycgbXVzdCBiZSBhIGNvbXBvdW5kIHN0YXRlbWVudCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfc2VjdGlvbnNfc3Vic3RtdF9ub3Rfc2VjdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJzdGF0ZW1lbnQgaW4gJ29tcCBzZWN0aW9ucycgZGlyZWN0aXZlIG11c3QgYmUgZW5jbG9zZWQgaW50byBhIHNlY3Rpb24gcmVnaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9zaW1kX3JlZ2lvbl9jYW5ub3RfdXNlX3N0bXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJyUwJyBzdGF0ZW1lbnQgY2Fubm90IGJlIHVzZWQgaW4gT3Blbk1QIHNpbWQgcmVnaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9zaW5nbGVfY29weXByaXZhdGVfd2l0aF9ub3dhaXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhlICdjb3B5cHJpdmF0ZScgY2xhdXNlIG11c3Qgbm90IGJlIHVzZWQgd2l0aCB0aGUgJ25vd2FpdCcgY2xhdXNlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF9zaW5nbGVfZGVjbF9pbl9kZWNsYXJlX3NpbWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic2luZ2xlIGRlY2xhcmF0aW9uIGlzIGV4cGVjdGVkIGFmdGVyICdkZWNsYXJlIHNpbWQnIGRpcmVjdGl2ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfdGFyZ2V0X2NvbnRhaW5zX25vdF9vbmx5X3RlYW1zLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRhcmdldCBjb25zdHJ1Y3Qgd2l0aCBuZXN0ZWQgdGVhbXMgcmVnaW9uIGNvbnRhaW5zIHN0YXRlbWVudHMgb3V0c2lkZSBvZiB0aGUgdGVhbXMgY29uc3RydWN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF90aHJlYWRwcml2YXRlX2luX2NsYXVzZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aHJlYWRwcml2YXRlIHZhcmlhYmxlcyBhcmUgbm90IGFsbG93ZWQgaW4gJyUwJyBjbGF1c2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3RocmVhZHByaXZhdGVfaW5fdGFyZ2V0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRocmVhZHByaXZhdGUgdmFyaWFibGVzIGNhbm5vdCBiZSB1c2VkIGluIHRhcmdldCBjb25zdHJ1Y3RzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF90aHJlYWRwcml2YXRlX2luY29tcGxldGVfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aHJlYWRwcml2YXRlIHZhcmlhYmxlIHdpdGggaW5jb21wbGV0ZSB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF90eXBlY2hlY2tfc2VjdGlvbl9ub3RfaW50ZWdlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhcnJheSBzZWN0aW9uICVzZWxlY3R7bG93ZXIgYm91bmR8bGVuZ3RofTAgaXMgbm90IGFuIGludGVnZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3R5cGVjaGVja19zZWN0aW9uX3ZhbHVlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN1YnNjcmlwdGVkIHZhbHVlIGlzIG5vdCBhbiBhcnJheSBvciBwb2ludGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF91bmV4cGVjdGVkX2NsYXVzZV92YWx1ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAlMCBpbiBPcGVuTVAgY2xhdXNlICclMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3VuZXhwZWN0ZWRfc2NoZWR1bGVfbW9kaWZpZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibW9kaWZpZXIgJyUwJyBjYW5ub3QgYmUgdXNlZCBhbG9uZyB3aXRoIG1vZGlmaWVyICclMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3VuaW9uX3R5cGVfbm90X2FsbG93ZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWFwcGluZyBvZiB1bmlvbiBtZW1iZXJzIGlzIG5vdCBhbGxvd2VkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF91bmtub3duX3JlZHVjdGlvbl9pZGVudGlmaWVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluY29ycmVjdCByZWR1Y3Rpb24gaWRlbnRpZmllciwgZXhwZWN0ZWQgb25lIG9mICcrJywgJy0nLCAnKicsICcmJywgJ3wnLCAnXicsICcmJicsICd8fCcsICdtaW4nIG9yICdtYXgnIG9yIGRlY2xhcmUgcmVkdWN0aW9uIGZvciB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF91bm5hbWVkX2lmX2NsYXVzZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHBlY3RlZCAlc2VsZWN0e3xvbmUgb2Z9MCAlMSBkaXJlY3RpdmUgbmFtZSBtb2RpZmllciVzZWxlY3R7fHN9MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfdXNlZGV2aWNlcHRyX25vdF9hX3BvaW50ZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgcG9pbnRlciBvciByZWZlcmVuY2UgdG8gcG9pbnRlciBpbiAndXNlX2RldmljZV9wdHInIGNsYXVzZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfdmFyX3Njb3BlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIicjcHJhZ21hIG9tcCAlMCcgbXVzdCBhcHBlYXIgaW4gdGhlIHNjb3BlIG9mIHRoZSAlcTEgdmFyaWFibGUgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3Zhcl90aHJlYWRfbG9jYWwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFyaWFibGUgJTAgY2Fubm90IGJlIHRocmVhZHByaXZhdGUgYmVjYXVzZSBpdCBpcyAlc2VsZWN0e3RocmVhZC1sb2NhbHxhIGdsb2JhbCBuYW1lZCByZWdpc3RlciB2YXJpYWJsZX0xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF92YXJfdXNlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInI3ByYWdtYSBvbXAgJTAnIG11c3QgcHJlY2VkZSBhbGwgcmVmZXJlbmNlcyB0byB2YXJpYWJsZSAlcTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3ZhcmlhYmxlX2luX2dpdmVuX2NsYXVzZV9hbmRfZHNhLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIHZhcmlhYmxlIGNhbm5vdCBiZSBpbiBhICUxIGNsYXVzZSBpbiAnI3ByYWdtYSBvbXAgJTInIGRpcmVjdGl2ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfdmFyaWFibHlfbW9kaWZpZWRfdHlwZV9ub3Rfc3VwcG9ydGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFyZ3VtZW50cyBvZiBPcGVuTVAgY2xhdXNlICclMCcgaW4gJyNwcmFnbWEgb21wICUyJyBkaXJlY3RpdmUgY2Fubm90IGJlIG9mIHZhcmlhYmx5LW1vZGlmaWVkIHR5cGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3dyb25nX2NhbmNlbF9yZWdpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib25lIG9mICdmb3InLCAncGFyYWxsZWwnLCAnc2VjdGlvbnMnIG9yICd0YXNrZ3JvdXAnIGlzIGV4cGVjdGVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF93cm9uZ19kc2EsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgdmFyaWFibGUgY2Fubm90IGJlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF93cm9uZ19pZl9kaXJlY3RpdmVfbmFtZV9tb2RpZmllciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkaXJlY3RpdmUgbmFtZSBtb2RpZmllciAnJTAnIGlzIG5vdCBhbGxvd2VkIGZvciAnI3ByYWdtYSBvbXAgJTEnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF93cm9uZ19saW5lYXJfbW9kaWZpZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwZWN0ZWQgJXNlbGVjdHsndmFsJyBtb2RpZmllcnxvbmUgb2YgJ3JlZicsIHZhbCcgb3IgJ3V2YWwnIG1vZGlmaWVyc30wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF93cm9uZ19saW5lYXJfbW9kaWZpZXJfbm9uX3JlZmVyZW5jZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2YXJpYWJsZSBvZiBub24tcmVmZXJlbmNlIHR5cGUgJTAgY2FuIGJlIHVzZWQgb25seSB3aXRoICd2YWwnIG1vZGlmaWVyLCBidXQgdXNlZCB3aXRoICclMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDExKQorRElBRyhlcnJfb21wX3dyb25nX29yZGVyZWRfbG9vcF9jb3VudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aGUgcGFyYW1ldGVyIG9mIHRoZSAnb3JkZXJlZCcgY2xhdXNlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwYXJhbWV0ZXIgb2YgdGhlICdjb2xsYXBzZScgY2xhdXNlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29tcF93cm9uZ19zaW1kbGVuX3NhZmVsZW5fdmFsdWVzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRoZSB2YWx1ZSBvZiAnc2ltZGxlbicgcGFyYW1ldGVyIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSB2YWx1ZSBvZiB0aGUgJ3NhZmVsZW4nIHBhcmFtZXRlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTEpCitESUFHKGVycl9vbXBfd3JvbmdfdmFyX2luX2RlY2xhcmVfcmVkdWN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm9ubHkgJXNlbGVjdHsnb21wX3ByaXYnIG9yICdvbXBfb3JpZyd8J29tcF9pbicgb3IgJ29tcF9vdXQnfTAgdmFyaWFibGVzIGFyZSBhbGxvd2VkIGluICVzZWxlY3R7aW5pdGlhbGl6ZXJ8Y29tYmluZXJ9MCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMSkKK0RJQUcoZXJyX29ubHlfYW5ub3RhdGVfYWZ0ZXJfYWNjZXNzX3NwZWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYWNjZXNzIHNwZWNpZmllciBjYW4gb25seSBoYXZlIGFubm90YXRpb24gYXR0cmlidXRlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29ubHlfY29uc3RydWN0b3JzX3Rha2VfYmFzZV9pbml0cywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJvbmx5IGNvbnN0cnVjdG9ycyB0YWtlIGJhc2UgaW5pdGlhbGl6ZXJzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb25seV9lbnVtc19oYXZlX3VuZGVybHlpbmdfdHlwZXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib25seSBlbnVtZXJhdGlvbiB0eXBlcyBoYXZlIHVuZGVybHlpbmcgdHlwZXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVuY2xfYWRkcnNwYWNlX3Njb3BlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInZhcmlhYmxlcyBpbiB0aGUgJTAgYWRkcmVzcyBzcGFjZSBjYW4gb25seSBiZSBkZWNsYXJlZCBpbiB0aGUgb3V0ZXJtb3N0IHNjb3BlIG9mIGEga2VybmVsIGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX2F0b21pY19pbml0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImF0b21pYyB2YXJpYWJsZSBjYW4gYmUgJXNlbGVjdHthc3NpZ25lZHxpbml0aWFsaXplZH0wIHRvIGEgdmFyaWFibGUgb25seSBpbiBnbG9iYWwgYWRkcmVzcyBzcGFjZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZW5jbF9iaXRmaWVsZHMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYml0LWZpZWxkcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBPcGVuQ0wiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVuY2xfYmxvY2tfcmVmX2Jsb2NrLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCByZWZlciB0byBhIGJsb2NrIGluc2lkZSBibG9jayIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZW5jbF9ibG9ja19zdG9yYWdlX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhlIF9fYmxvY2sgc3RvcmFnZSB0eXBlIGlzIG5vdCBwZXJtaXR0ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVuY2xfYnVpbHRpbl9leHBlY3RlZF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImlsbGVnYWwgY2FsbCB0byAlMCwgZXhwZWN0ZWQgJTEgYXJndW1lbnQgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZW5jbF9idWlsdGluX3BpcGVfYXJnX251bSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZnVuY3Rpb246ICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX2J1aWx0aW5fcGlwZV9maXJzdF9hcmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZmlyc3QgYXJndW1lbnQgdG8gJTAgbXVzdCBiZSBhIHBpcGUgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZW5jbF9idWlsdGluX3BpcGVfaW52YWxpZF9hY2Nlc3NfbW9kaWZpZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBwaXBlIGFjY2VzcyBtb2RpZmllciAoZXhwZWN0aW5nICUwKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZW5jbF9idWlsdGluX3BpcGVfaW52YWxpZF9hcmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBhcmd1bWVudCB0eXBlIHRvIGZ1bmN0aW9uICUwIChleHBlY3RpbmcgJTEgaGF2aW5nICUyKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZW5jbF9idWlsdGluX3RvX2FkZHJfYXJnX251bSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZnVuY3Rpb246ICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX2J1aWx0aW5fdG9fYWRkcl9pbnZhbGlkX2FyZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIGFyZ3VtZW50ICUwIHRvIGZ1bmN0aW9uOiAlMSwgZXhwZWN0aW5nIGEgZ2VuZXJpYyBwb2ludGVyIGFyZ3VtZW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX2Nhc3Rfbm9uX3plcm9fdG9fZXZlbnRfdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgY2FzdCBub24temVybyB2YWx1ZSAnJTAnIHRvICdldmVudF90JyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZW5jbF9jYXN0X3RvX2hhbGYsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2FzdGluZyB0byB0eXBlICUwIGlzIG5vdCBhbGxvd2VkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX2NvbnN0YW50X25vX2luaXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFyaWFibGUgaW4gY29uc3RhbnQgYWRkcmVzcyBzcGFjZSBtdXN0IGJlIGluaXRpYWxpemVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX2VucXVldWVfa2VybmVsX2Jsb2Nrc19ub19hcmdzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImJsb2NrcyB3aXRoIHBhcmFtZXRlcnMgYXJlIG5vdCBhY2NlcHRlZCBpbiB0aGlzIHByb3RvdHlwZSBvZiBlbnF1ZXVlX2tlcm5lbCBjYWxsIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX2VucXVldWVfa2VybmVsX2Jsb2Nrc19ub25fbG9jYWxfdm9pZF9hcmdzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImJsb2NrcyB1c2VkIGluIGVucXVldWVfa2VybmVsIGNhbGwgYXJlIGV4cGVjdGVkIHRvIGhhdmUgcGFyYW1ldGVycyBvZiB0eXBlICdsb2NhbCB2b2lkKiciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVuY2xfZW5xdWV1ZV9rZXJuZWxfaW5jb3JyZWN0X2FyZ3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaWxsZWdhbCBjYWxsIHRvIGVucXVldWVfa2VybmVsLCBpbmNvcnJlY3QgYXJndW1lbnQgdHlwZXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVuY2xfZW5xdWV1ZV9rZXJuZWxfaW52YWxpZF9sb2NhbF9zaXplX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaWxsZWdhbCBjYWxsIHRvIGVucXVldWVfa2VybmVsLCBwYXJhbWV0ZXIgbmVlZHMgdG8gYmUgc3BlY2lmaWVkIGFzIGludGVnZXIgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZW5jbF9lbnF1ZXVlX2tlcm5lbF9sb2NhbF9zaXplX2FyZ3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWlzbWF0Y2ggaW4gbnVtYmVyIG9mIGJsb2NrIHBhcmFtZXRlcnMgYW5kIGxvY2FsIHNpemUgYXJndW1lbnRzIHBhc3NlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZW5jbF9leHRfdmVjdG9yX2NvbXBvbmVudF9pbnZhbGlkX2xlbmd0aCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2ZWN0b3IgY29tcG9uZW50IGFjY2VzcyBoYXMgaW52YWxpZCBsZW5ndGggJTAuICBTdXBwb3J0ZWQ6IDEsMiwzLDQsOCwxNi4iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVuY2xfZXh0ZXJuX2Jsb2NrX2RlY2xhcmF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgYmxvY2sgdmFyaWFibGUgZGVjbGFyYXRpb24gLSB1c2luZyAnZXh0ZXJuJyBzdG9yYWdlIGNsYXNzIGlzIGRpc2FsbG93ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVuY2xfZnVuY3Rpb25fcG9pbnRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwb2ludGVycyB0byBmdW5jdGlvbnMgYXJlIG5vdCBhbGxvd2VkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX2Z1bmN0aW9uX3ZhcmlhYmxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7bm9uLWtlcm5lbCBmdW5jdGlvbnxmdW5jdGlvbiBzY29wZX0wIHZhcmlhYmxlIGNhbm5vdCBiZSBkZWNsYXJlZCBpbiAlMSBhZGRyZXNzIHNwYWNlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX2dsb2JhbF9pbnZhbGlkX2FkZHJfc3BhY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtwcm9ncmFtIHNjb3BlfHN0YXRpYyBsb2NhbHxleHRlcm59MCB2YXJpYWJsZSBtdXN0IHJlc2lkZSBpbiAlMSBhZGRyZXNzIHNwYWNlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX2hhbGZfZGVjbGFyYXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVjbGFyaW5nIHZhcmlhYmxlIG9mIHR5cGUgJTAgaXMgbm90IGFsbG93ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVuY2xfaGFsZl9sb2FkX3N0b3JlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7bG9hZGluZyBkaXJlY3RseSBmcm9tfGFzc2lnbmluZyBkaXJlY3RseSB0b30wIHBvaW50ZXIgdG8gdHlwZSAlMSByZXF1aXJlcyBjbF9raHJfZnAxNi4gVXNlIHZlY3RvciBkYXRhICVzZWxlY3R7bG9hZHxzdG9yZX0wIGJ1aWx0aW4gZnVuY3Rpb25zIGluc3RlYWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVuY2xfaGFsZl9wYXJhbSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWNsYXJpbmcgZnVuY3Rpb24gcGFyYW1ldGVyIG9mIHR5cGUgJTAgaXMgbm90IGFsbG93ZWQ7IGRpZCB5b3UgZm9yZ2V0ICogPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZW5jbF9pbXBsaWNpdF92ZWN0b3JfY29udmVyc2lvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbXBsaWNpdCBjb252ZXJzaW9ucyBiZXR3ZWVuIHZlY3RvciB0eXBlcyAoJTAgYW5kICUxKSBhcmUgbm90IHBlcm1pdHRlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZW5jbF9pbnZhbGlkX2FjY2Vzc19xdWFsaWZpZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYWNjZXNzIHF1YWxpZmllciBjYW4gb25seSBiZSB1c2VkIGZvciBwaXBlIGFuZCBpbWFnZSB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX2ludmFsaWRfYmxvY2tfZGVjbGFyYXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBibG9jayB2YXJpYWJsZSBkZWNsYXJhdGlvbiAtIG11c3QgYmUgJXNlbGVjdHtjb25zdCBxdWFsaWZpZWR8aW5pdGlhbGl6ZWR9MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZW5jbF9pbnZhbGlkX3JlYWRfd3JpdGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYWNjZXNzIHF1YWxpZmllciAlMCBjYW4gbm90IGJlIHVzZWQgZm9yICUxICVzZWxlY3R7fHByaW9yIHRvIE9wZW5DTCB2ZXJzaW9uIDIuMH0yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX2ludmFsaWRfcmV0dXJuLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlY2xhcmluZyBmdW5jdGlvbiByZXR1cm4gdmFsdWUgb2YgdHlwZSAlMCBpcyBub3QgYWxsb3dlZCAlc2VsZWN0ezsgZGlkIHlvdSBmb3JnZXQgKiA/fH0xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX2ludmFsaWRfdHlwZV9hcnJheSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhcnJheSBvZiAlMCB0eXBlIGlzIGludmFsaWQgaW4gT3BlbkNMIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX2tlcm5lbF9hdHRyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImF0dHJpYnV0ZSAlMCBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGEga2VybmVsIGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX211bHRpcGxlX2FjY2Vzc19xdWFsaWZpZXJzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm11bHRpcGxlIGFjY2VzcyBxdWFsaWZpZXJzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX25vX21haW4sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtmdW5jdGlvbnxrZXJuZWx9MCBjYW5ub3QgYmUgY2FsbGVkICdtYWluJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZW5jbF9ub25jb25zdF9nbG9iYWxfc2FtcGxlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJnbG9iYWwgc2FtcGxlciByZXF1aXJlcyBhIGNvbnN0IG9yIGNvbnN0YW50IGFkZHJlc3Mgc3BhY2UgcXVhbGlmaWVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX3BvaW50ZXJfdG9fdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwb2ludGVyIHRvIHR5cGUgJTAgaXMgaW52YWxpZCBpbiBPcGVuQ0wiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVuY2xfcHRycHRyX2tlcm5lbF9wYXJhbSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJrZXJuZWwgcGFyYW1ldGVyIGNhbm5vdCBiZSBkZWNsYXJlZCBhcyBhIHBvaW50ZXIgdG8gYSBwb2ludGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX3JlcXVpcmVzX2V4dGVuc2lvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1c2Ugb2YgJXNlbGVjdHt0eXBlfGRlY2xhcmF0aW9ufTAgJTEgcmVxdWlyZXMgJTIgZXh0ZW5zaW9uIHRvIGJlIGVuYWJsZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVuY2xfcmV0dXJuX3ZhbHVlX3dpdGhfYWRkcmVzc19zcGFjZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZXR1cm4gdmFsdWUgY2Fubm90IGJlIHF1YWxpZmllZCB3aXRoIGFkZHJlc3Mgc3BhY2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVuY2xfc2NhbGFyX3R5cGVfcmFua19ncmVhdGVyX3RoYW5fdmVjdG9yX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic2NhbGFyIG9wZXJhbmQgdHlwZSBoYXMgZ3JlYXRlciByYW5rIHRoYW4gdGhlIHR5cGUgb2YgdGhlIHZlY3RvciBlbGVtZW50LiAoJTAgYW5kICUxKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZW5jbF9zaXplb2ZfYWxpZ25vZl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgYXBwbGljYXRpb24gb2YgJyVzZWxlY3R7c2l6ZW9mfGFsaWdub2Z8dmVjX3N0ZXB8X19idWlsdGluX29tcF9yZXF1aXJlZF9zaW1kX2FsaWdufTAnIHRvIGEgdm9pZCB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX3Rha2luZ19hZGRyZXNzX2NhcHR1cmUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGFraW5nIGFkZHJlc3Mgb2YgYSBjYXB0dXJlIGlzIG5vdCBhbGxvd2VkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX3Rlcm5hcnlfd2l0aF9ibG9jaywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJibG9jayB0eXBlIGNhbm5vdCBiZSB1c2VkIGFzIGV4cHJlc3Npb24gaW4gdGVybmFyeSBleHByZXNzaW9uIGluIE9wZW5DTCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZW5jbF90eXBlX2Nhbl9vbmx5X2JlX3VzZWRfYXNfZnVuY3Rpb25fcGFyYW1ldGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInR5cGUgJTAgY2FuIG9ubHkgYmUgdXNlZCBhcyBhIGZ1bmN0aW9uIHBhcmFtZXRlciBpbiBPcGVuQ0wiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVuY2xfdHlwZV9zdHJ1Y3Rfb3JfdW5pb25fZmllbGQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhlICUwIHR5cGUgY2Fubm90IGJlIHVzZWQgdG8gZGVjbGFyZSBhIHN0cnVjdHVyZSBvciB1bmlvbiBmaWVsZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZW5jbF91bmtub3duX3R5cGVfc3BlY2lmaWVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIk9wZW5DTCB2ZXJzaW9uICUwIGRvZXMgbm90IHN1cHBvcnQgdGhlICclMScgJXNlbGVjdHt0eXBlIHF1YWxpZmllcnxzdG9yYWdlIGNsYXNzIHNwZWNpZmllcn0yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlbmNsX3ZhcmlhZGljX2Z1bmN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgcHJvdG90eXBlLCB2YXJpYWRpYyBhcmd1bWVudHMgYXJlIG5vdCBhbGxvd2VkIGluIE9wZW5DTCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZW5jbF92bGEsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFyaWFibGUgbGVuZ3RoIGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCBpbiBPcGVuQ0wiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVubXBfZGVmYXVsdF9zaW1kX2FsaWduX2V4cHIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBhcHBsaWNhdGlvbiBvZiAnX19idWlsdGluX29tcF9yZXF1aXJlZF9zaW1kX2FsaWduJyB0byBhbiBleHByZXNzaW9uLCBvbmx5IHR5cGUgaXMgYWxsb3dlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZXJhdG9yX2Fycm93X2NpcmN1bGFyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNpcmN1bGFyIHBvaW50ZXIgZGVsZWdhdGlvbiBkZXRlY3RlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZXJhdG9yX2Fycm93X2RlcHRoX2V4Y2VlZGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVzZSBvZiAnb3BlcmF0b3ItPicgb24gdHlwZSAlMCB3b3VsZCBpbnZva2UgYSBzZXF1ZW5jZSBvZiBtb3JlIHRoYW4gJTEgJ29wZXJhdG9yLT4nIGNhbGxzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlcmF0b3JfZGVsZXRlX2RlcGVuZGVudF9wYXJhbV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGNhbm5vdCB0YWtlIGEgZGVwZW5kZW50IHR5cGUgYXMgZmlyc3QgcGFyYW1ldGVyOyB1c2UgJTEgaW5zdGVhZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZXJhdG9yX2RlbGV0ZV9wYXJhbV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZpcnN0IHBhcmFtZXRlciBvZiAlMCBtdXN0IGhhdmUgdHlwZSAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZXJhdG9yX25ld19kZWZhdWx0X2FyZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwYXJhbWV0ZXIgb2YgJTAgY2Fubm90IGhhdmUgYSBkZWZhdWx0IGFyZ3VtZW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlcmF0b3JfbmV3X2RlbGV0ZV9kZWNsYXJlZF9pbl9uYW1lc3BhY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgY2Fubm90IGJlIGRlY2xhcmVkIGluc2lkZSBhIG5hbWVzcGFjZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZXJhdG9yX25ld19kZWxldGVfZGVjbGFyZWRfc3RhdGljLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGNhbm5vdCBiZSBkZWNsYXJlZCBzdGF0aWMgaW4gZ2xvYmFsIHNjb3BlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlcmF0b3JfbmV3X2RlbGV0ZV9kZXBlbmRlbnRfcmVzdWx0X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgY2Fubm90IGhhdmUgYSBkZXBlbmRlbnQgcmV0dXJuIHR5cGU7IHVzZSAlMSBpbnN0ZWFkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlcmF0b3JfbmV3X2RlbGV0ZV9pbnZhbGlkX3Jlc3VsdF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIG11c3QgcmV0dXJuIHR5cGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVyYXRvcl9uZXdfZGVsZXRlX3RlbXBsYXRlX3Rvb19mZXdfcGFyYW1ldGVycywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCB0ZW1wbGF0ZSBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIHBhcmFtZXRlcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVyYXRvcl9uZXdfZGVsZXRlX3Rvb19mZXdfcGFyYW1ldGVycywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZXJhdG9yX25ld19kZXBlbmRlbnRfcGFyYW1fdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBjYW5ub3QgdGFrZSBhIGRlcGVuZGVudCB0eXBlIGFzIGZpcnN0IHBhcmFtZXRlcjsgdXNlIHNpemVfdCAoJTEpIGluc3RlYWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVyYXRvcl9uZXdfcGFyYW1fdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCB0YWtlcyB0eXBlIHNpemVfdCAoJTEpIGFzIGZpcnN0IHBhcmFtZXRlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZXJhdG9yX292ZXJsb2FkX2RlZmF1bHRfYXJnLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInBhcmFtZXRlciBvZiBvdmVybG9hZGVkICUwIGNhbm5vdCBoYXZlIGEgZGVmYXVsdCBhcmd1bWVudCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZXJhdG9yX292ZXJsb2FkX211c3RfYmUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib3ZlcmxvYWRlZCAlMCBtdXN0IGJlIGEgJXNlbGVjdHt1bmFyeXxiaW5hcnl8dW5hcnkgb3IgYmluYXJ5fTIgb3BlcmF0b3IgKGhhcyAlMSBwYXJhbWV0ZXIlczEpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlcmF0b3Jfb3ZlcmxvYWRfbXVzdF9iZV9tZW1iZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib3ZlcmxvYWRlZCAlMCBtdXN0IGJlIGEgbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVyYXRvcl9vdmVybG9hZF9uZWVkc19jbGFzc19vcl9lbnVtLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm92ZXJsb2FkZWQgJTAgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb2YgY2xhc3Mgb3IgZW51bWVyYXRpb24gdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29wZXJhdG9yX292ZXJsb2FkX3Bvc3RfaW5jZGVjX211c3RfYmVfaW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInBhcmFtZXRlciBvZiBvdmVybG9hZGVkIHBvc3QtJXNlbGVjdHtpbmNyZW1lbnR8ZGVjcmVtZW50fTEgb3BlcmF0b3IgbXVzdCBoYXZlIHR5cGUgJ2ludCcgKG5vdCAlMCkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vcGVyYXRvcl9vdmVybG9hZF9zdGF0aWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib3ZlcmxvYWRlZCAlMCBjYW5ub3QgYmUgYSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3BlcmF0b3Jfb3ZlcmxvYWRfdmFyaWFkaWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib3ZlcmxvYWRlZCAlMCBjYW5ub3QgYmUgdmFyaWFkaWMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vc19sb2dfYXJndW1lbnRfdG9vX2JpZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJvc19sb2coKSBhcmd1bWVudCAlMCBpcyB0b28gYmlnICglMSBieXRlcywgbWF4ICUyKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX29zX2xvZ19mb3JtYXRfbm90X3N0cmluZ19jb25zdGFudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJvc19sb2coKSBmb3JtYXQgYXJndW1lbnQgaXMgbm90IGEgc3RyaW5nIGNvbnN0YW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3V0X29mX2xpbmVfZGVmYXVsdF9kZWxldGVzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZmF1bHRpbmcgdGhpcyAlc2VsZWN0e2RlZmF1bHQgY29uc3RydWN0b3J8Y29weSBjb25zdHJ1Y3Rvcnxtb3ZlIGNvbnN0cnVjdG9yfGNvcHkgYXNzaWdubWVudCBvcGVyYXRvcnxtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3J8ZGVzdHJ1Y3Rvcn0wIHdvdWxkIGRlbGV0ZSBpdCBhZnRlciBpdHMgZmlyc3QgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vdXRfb2ZfbGluZV9xdWFsaWZpZWRfaWRfdHlwZV9uYW1lc19jb25zdHJ1Y3RvciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJxdWFsaWZpZWQgcmVmZXJlbmNlIHRvICUwIGlzIGEgY29uc3RydWN0b3IgbmFtZSByYXRoZXIgdGhhbiBhICVzZWxlY3R7dGVtcGxhdGUgbmFtZXx0eXBlfTEgaW4gdGhpcyBjb250ZXh0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3ZlcmZsb3dfYnVpbHRpbl9tdXN0X2JlX2ludCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJvcGVyYW5kIGFyZ3VtZW50IHRvIG92ZXJmbG93IGJ1aWx0aW4gbXVzdCBiZSBhbiBpbnRlZ2VyICglMCBpbnZhbGlkKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX292ZXJmbG93X2J1aWx0aW5fbXVzdF9iZV9wdHJfaW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlc3VsdCBhcmd1bWVudCB0byBvdmVyZmxvdyBidWlsdGluIG11c3QgYmUgYSBwb2ludGVyIHRvIGEgbm9uLWNvbnN0IGludGVnZXIgKCUwIGludmFsaWQpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3ZlcnJpZGVfZXhjZXB0aW9uX3NwZWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gb2Ygb3ZlcnJpZGluZyBmdW5jdGlvbiBpcyBtb3JlIGxheCB0aGFuIGJhc2UgdmVyc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX292bF9hbWJpZ3VvdXNfY2FsbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYWxsIHRvICUwIGlzIGFtYmlndW91cyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX292bF9hbWJpZ3VvdXNfY29udmVyc2lvbl9pbl9jYXN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFtYmlndW91cyBjb252ZXJzaW9uIGZvciAlc2VsZWN0e3xzdGF0aWNfY2FzdHxyZWludGVycHJldF9jYXN0fGR5bmFtaWNfY2FzdHxDLXN0eWxlIGNhc3R8ZnVuY3Rpb25hbC1zdHlsZSBjYXN0fTAgZnJvbSAlMSB0byAlMiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX292bF9hbWJpZ3VvdXNfaW5pdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYWxsIHRvIGNvbnN0cnVjdG9yIG9mICUwIGlzIGFtYmlndW91cyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX292bF9hbWJpZ3VvdXNfbWVtYmVyX2NhbGwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2FsbCB0byBtZW1iZXIgZnVuY3Rpb24gJTAgaXMgYW1iaWd1b3VzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3ZsX2FtYmlndW91c19vYmplY3RfY2FsbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYWxsIHRvIG9iamVjdCBvZiB0eXBlICUwIGlzIGFtYmlndW91cyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX292bF9hbWJpZ3VvdXNfb3Blcl9iaW5hcnksIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidXNlIG9mIG92ZXJsb2FkZWQgb3BlcmF0b3IgJyUwJyBpcyBhbWJpZ3VvdXMgKHdpdGggb3BlcmFuZCB0eXBlcyAlMSBhbmQgJTIpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3ZsX2FtYmlndW91c19vcGVyX3VuYXJ5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVzZSBvZiBvdmVybG9hZGVkIG9wZXJhdG9yICclMCcgaXMgYW1iaWd1b3VzIChvcGVyYW5kIHR5cGUgJTEpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3ZsX2RlbGV0ZWRfY2FsbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYWxsIHRvICVzZWxlY3R7dW5hdmFpbGFibGV8ZGVsZXRlZH0wIGZ1bmN0aW9uICUxJTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vdmxfZGVsZXRlZF9jb252ZXJzaW9uX2luX2Nhc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHt8c3RhdGljX2Nhc3R8cmVpbnRlcnByZXRfY2FzdHxkeW5hbWljX2Nhc3R8Qy1zdHlsZSBjYXN0fGZ1bmN0aW9uYWwtc3R5bGUgY2FzdH0wIGZyb20gJTEgdG8gJTIgdXNlcyBkZWxldGVkIGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3ZsX2RlbGV0ZWRfaW5pdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYWxsIHRvICVzZWxlY3R7dW5hdmFpbGFibGV8ZGVsZXRlZH0wIGNvbnN0cnVjdG9yIG9mICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3ZsX2RlbGV0ZWRfbWVtYmVyX2NhbGwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2FsbCB0byAlc2VsZWN0e3VuYXZhaWxhYmxlfGRlbGV0ZWR9MCBtZW1iZXIgZnVuY3Rpb24gJTElMiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX292bF9kZWxldGVkX29iamVjdF9jYWxsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbGwgdG8gJXNlbGVjdHt1bmF2YWlsYWJsZXxkZWxldGVkfTAgZnVuY3Rpb24gY2FsbCBvcGVyYXRvciBpbiB0eXBlICUxJTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vdmxfZGVsZXRlZF9vcGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm92ZXJsb2FkIHJlc29sdXRpb24gc2VsZWN0ZWQgJXNlbGVjdHt1bmF2YWlsYWJsZXxkZWxldGVkfTAgb3BlcmF0b3IgJyUxJyUyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3ZsX2RlbGV0ZWRfc3BlY2lhbF9pbml0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbGwgdG8gaW1wbGljaXRseS1kZWxldGVkICVzZWxlY3R7ZGVmYXVsdCBjb25zdHJ1Y3Rvcnxjb3B5IGNvbnN0cnVjdG9yfG1vdmUgY29uc3RydWN0b3J8Y29weSBhc3NpZ25tZW50IG9wZXJhdG9yfG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcnxkZXN0cnVjdG9yfGZ1bmN0aW9ufTAgb2YgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vdmxfZGVsZXRlZF9zcGVjaWFsX29wZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib2JqZWN0IG9mIHR5cGUgJTAgY2Fubm90IGJlICVzZWxlY3R7Y29uc3RydWN0ZWR8Y29waWVkfG1vdmVkfGFzc2lnbmVkfGFzc2lnbmVkfGRlc3Ryb3llZH0xIGJlY2F1c2UgaXRzICVzZWxlY3R7ZGVmYXVsdCBjb25zdHJ1Y3Rvcnxjb3B5IGNvbnN0cnVjdG9yfG1vdmUgY29uc3RydWN0b3J8Y29weSBhc3NpZ25tZW50IG9wZXJhdG9yfG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcnxkZXN0cnVjdG9yfTEgaXMgaW1wbGljaXRseSBkZWxldGVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3ZsX2RpZmZfcmV0dXJuX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZnVuY3Rpb25zIHRoYXQgZGlmZmVyIG9ubHkgaW4gdGhlaXIgcmV0dXJuIHR5cGUgY2Fubm90IGJlIG92ZXJsb2FkZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vdmxfbm9fY29udmVyc2lvbl9pbl9jYXN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBjb252ZXJ0ICUxIHRvICUyIHdpdGhvdXQgYSBjb252ZXJzaW9uIG9wZXJhdG9yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3ZsX25vX29wZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSAlMCBkb2VzIG5vdCBwcm92aWRlIGEgJXNlbGVjdHtzdWJzY3JpcHR8Y2FsbH0xIG9wZXJhdG9yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3ZsX25vX3ZpYWJsZV9jb252ZXJzaW9uX2luX2Nhc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gbWF0Y2hpbmcgY29udmVyc2lvbiBmb3IgJXNlbGVjdHt8c3RhdGljX2Nhc3R8cmVpbnRlcnByZXRfY2FzdHxkeW5hbWljX2Nhc3R8Qy1zdHlsZSBjYXN0fGZ1bmN0aW9uYWwtc3R5bGUgY2FzdH0wIGZyb20gJTEgdG8gJTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vdmxfbm9fdmlhYmxlX2Z1bmN0aW9uX2luX2NhbGwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gbWF0Y2hpbmcgZnVuY3Rpb24gZm9yIGNhbGwgdG8gJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vdmxfbm9fdmlhYmxlX2Z1bmN0aW9uX2luX2luaXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gbWF0Y2hpbmcgY29uc3RydWN0b3IgZm9yIGluaXRpYWxpemF0aW9uIG9mICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3ZsX25vX3ZpYWJsZV9saXRlcmFsX29wZXJhdG9yLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIG1hdGNoaW5nIGxpdGVyYWwgb3BlcmF0b3IgZm9yIGNhbGwgdG8gJTAlc2VsZWN0e3wgd2l0aCBhcmd1bWVudCBvZiB0eXBlICUyfCB3aXRoIGFyZ3VtZW50cyBvZiB0eXBlcyAlMiBhbmQgJTN9MSVzZWxlY3R7fCBvciAnY29uc3QgY2hhciAqJ300JXNlbGVjdHt8LCBhbmQgbm8gbWF0Y2hpbmcgbGl0ZXJhbCBvcGVyYXRvciB0ZW1wbGF0ZX01IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3ZsX25vX3ZpYWJsZV9tZW1iZXJfZnVuY3Rpb25faW5fY2FsbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyBtYXRjaGluZyBtZW1iZXIgZnVuY3Rpb24gZm9yIGNhbGwgdG8gJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vdmxfbm9fdmlhYmxlX29iamVjdF9jYWxsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIG1hdGNoaW5nIGZ1bmN0aW9uIGZvciBjYWxsIHRvIG9iamVjdCBvZiB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3ZsX25vX3ZpYWJsZV9vcGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIHZpYWJsZSBvdmVybG9hZGVkICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vdmxfbm9fdmlhYmxlX3N1YnNjcmlwdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyB2aWFibGUgb3ZlcmxvYWRlZCBvcGVyYXRvcltdIGZvciB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3ZsX3N0YXRpY19ub25zdGF0aWNfbWVtYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN0YXRpYyBhbmQgbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVyIHR5cGVzIGNhbm5vdCBiZSBvdmVybG9hZGVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3ZsX3VucmVzb2x2YWJsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZWZlcmVuY2UgdG8gb3ZlcmxvYWRlZCBmdW5jdGlvbiBjb3VsZCBub3QgYmUgcmVzb2x2ZWQ7IGRpZCB5b3UgbWVhbiB0byBjYWxsIGl0JXNlbGVjdHt8IHdpdGggbm8gYXJndW1lbnRzfTA/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfb3duZXJzaGlwX3JldHVybnNfaW5kZXhfbWlzbWF0Y2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ293bmVyc2hpcF9yZXR1cm5zJyBhdHRyaWJ1dGUgaW5kZXggZG9lcyBub3QgbWF0Y2g7IGhlcmUgaXQgaXMgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9vd25lcnNoaXBfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvICVzZWxlY3R7cG9pbnRlcnxpbnRlZ2VyfTEgYXJndW1lbnRzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcGFja19leHBhbnNpb25fbGVuZ3RoX2NvbmZsaWN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInBhY2sgZXhwYW5zaW9uIGNvbnRhaW5zIHBhcmFtZXRlciBwYWNrcyAlMCBhbmQgJTEgdGhhdCBoYXZlIGRpZmZlcmVudCBsZW5ndGhzICglMiB2cy4gJTMpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcGFja19leHBhbnNpb25fbGVuZ3RoX2NvbmZsaWN0X211bHRpbGV2ZWwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicGFjayBleHBhbnNpb24gY29udGFpbnMgcGFyYW1ldGVyIHBhY2sgJTAgdGhhdCBoYXMgYSBkaWZmZXJlbnQgbGVuZ3RoICglMSB2cy4gJTIpIGZyb20gb3V0ZXIgcGFyYW1ldGVyIHBhY2tzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcGFja19leHBhbnNpb25fbWVtYmVyX2luaXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicGFjayBleHBhbnNpb24gZm9yIGluaXRpYWxpemF0aW9uIG9mIG1lbWJlciAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3BhY2tfZXhwYW5zaW9uX3dpdGhvdXRfcGFyYW1ldGVyX3BhY2tzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInBhY2sgZXhwYW5zaW9uIGRvZXMgbm90IGNvbnRhaW4gYW55IHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2tzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcGFyYW1fZGVmYXVsdF9hcmd1bWVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJDIGRvZXMgbm90IHN1cHBvcnQgZGVmYXVsdCBhcmd1bWVudHMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wYXJhbV9kZWZhdWx0X2FyZ3VtZW50X21lbWJlcl90ZW1wbGF0ZV9yZWRlY2wsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVmYXVsdCBhcmd1bWVudHMgY2Fubm90IGJlIGFkZGVkIHRvIGFuIG91dC1vZi1saW5lIGRlZmluaXRpb24gb2YgYSBtZW1iZXIgb2YgYSAlc2VsZWN0e2NsYXNzIHRlbXBsYXRlfGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb258bmVzdGVkIGNsYXNzIGluIGEgdGVtcGxhdGV9MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3BhcmFtX2RlZmF1bHRfYXJndW1lbnRfbWlzc2luZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtaXNzaW5nIGRlZmF1bHQgYXJndW1lbnQgb24gcGFyYW1ldGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcGFyYW1fZGVmYXVsdF9hcmd1bWVudF9taXNzaW5nX25hbWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWlzc2luZyBkZWZhdWx0IGFyZ3VtZW50IG9uIHBhcmFtZXRlciAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3BhcmFtX2RlZmF1bHRfYXJndW1lbnRfbm9uZnVuYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWZhdWx0IGFyZ3VtZW50cyBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIHBhcmFtZXRlcnMgaW4gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3BhcmFtX2RlZmF1bHRfYXJndW1lbnRfb25fcGFyYW1ldGVyX3BhY2ssIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicGFyYW1ldGVyIHBhY2sgY2Fubm90IGhhdmUgYSBkZWZhdWx0IGFyZ3VtZW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcGFyYW1fZGVmYXVsdF9hcmd1bWVudF9yZWRlZmluaXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVkZWZpbml0aW9uIG9mIGRlZmF1bHQgYXJndW1lbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wYXJhbV9kZWZhdWx0X2FyZ3VtZW50X3JlZmVyZW5jZXNfbG9jYWwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVmYXVsdCBhcmd1bWVudCByZWZlcmVuY2VzIGxvY2FsIHZhcmlhYmxlICUwIG9mIGVuY2xvc2luZyBmdW5jdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3BhcmFtX2RlZmF1bHRfYXJndW1lbnRfcmVmZXJlbmNlc19wYXJhbSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWZhdWx0IGFyZ3VtZW50IHJlZmVyZW5jZXMgcGFyYW1ldGVyICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcGFyYW1fZGVmYXVsdF9hcmd1bWVudF9yZWZlcmVuY2VzX3RoaXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVmYXVsdCBhcmd1bWVudCByZWZlcmVuY2VzICd0aGlzJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3BhcmFtX2RlZmF1bHRfYXJndW1lbnRfdGVtcGxhdGVfcmVkZWNsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZmF1bHQgYXJndW1lbnRzIGNhbm5vdCBiZSBhZGRlZCB0byBhIGZ1bmN0aW9uIHRlbXBsYXRlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkZWNsYXJlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3BhcmFtX3dpdGhfdm9pZF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFyZ3VtZW50IG1heSBub3QgaGF2ZSAndm9pZCcgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3BhcmFtZXRlcl9uYW1lX29taXR0ZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicGFyYW1ldGVyIG5hbWUgb21pdHRlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3BhcmFtZXRlcnNfcmV0dmFsX2Nhbm5vdF9oYXZlX2ZwMTZfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e3BhcmFtZXRlcnN8ZnVuY3Rpb24gcmV0dXJuIHZhbHVlfTAgY2Fubm90IGhhdmUgX19mcDE2IHR5cGU7IGRpZCB5b3UgZm9yZ2V0ICogPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3BhcmVuc19wb2ludGVyX21lbWJlcl9mdW5jdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgcGFyZW50aGVzaXplIHRoZSBuYW1lIG9mIGEgbWV0aG9kIHdoZW4gZm9ybWluZyBhIG1lbWJlciBwb2ludGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcGFydGlhbF9zcGVjX2FyZ3NfbWF0Y2hfcHJpbWFyeV90ZW1wbGF0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2NsYXNzfHZhcmlhYmxlfTAgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBzcGVjaWFsaXplIGFueSB0ZW1wbGF0ZSBhcmd1bWVudDsgdG8gJXNlbGVjdHtkZWNsYXJlfGRlZmluZX0xIHRoZSBwcmltYXJ5IHRlbXBsYXRlLCByZW1vdmUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wYXJ0aWFsX3NwZWNfZnVsbHlfc3BlY2lhbGl6ZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicGFydGlhbCBzcGVjaWFsaXphdGlvbiBvZiAlMCBkb2VzIG5vdCB1c2UgYW55IG9mIGl0cyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcGFydGlhbF9zcGVjX29yZGVyaW5nX2FtYmlndW91cywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhbWJpZ3VvdXMgcGFydGlhbCBzcGVjaWFsaXphdGlvbnMgb2YgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wYXJ0aWFsX3NwZWNfcmVkZWNsYXJlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uICUwIGNhbm5vdCBiZSByZWRlY2xhcmVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcGFydGlhbF9zcGVjaWFsaXphdGlvbl9mcmllbmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicGFydGlhbCBzcGVjaWFsaXphdGlvbiBjYW5ub3QgYmUgZGVjbGFyZWQgYXMgYSBmcmllbmQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wbGFjZW1lbnRfbmV3X25vbl9wbGFjZW1lbnRfZGVsZXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiduZXcnIGV4cHJlc3Npb24gd2l0aCBwbGFjZW1lbnQgYXJndW1lbnRzIHJlZmVycyB0byBub24tcGxhY2VtZW50ICdvcGVyYXRvciBkZWxldGUnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcG9pbnRlcl90b19tZW1iZXJfY2FsbF9kcm9wc19xdWFscywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYWxsIHRvIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIG9mIHR5cGUgJTAgZHJvcHMgJyUxJyBxdWFsaWZpZXIlczIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wb2ludGVyX3RvX21lbWJlcl9vcGVyX3ZhbHVlX2NsYXNzaWZ5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInBvaW50ZXItdG8tbWVtYmVyIGZ1bmN0aW9uIHR5cGUgJTAgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGFuICVzZWxlY3R7cnZhbHVlfGx2YWx1ZX0xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcG9pbnRlcl90b19tZW1iZXJfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIHVzZSBvZiBwb2ludGVyIHRvIG1lbWJlciB0eXBlIGFmdGVyICVzZWxlY3R7Lip8LT4qfTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wcGNfYnVpbHRpbl9vbmx5X29uX3B3cjcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhpcyBidWlsdGluIGlzIG9ubHkgdmFsaWQgb24gUE9XRVI3IG9yIGxhdGVyIENQVXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wcmFnbWFfYXR0cmlidXRlX2ludmFsaWRfbWF0Y2hlcnMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXR0cmlidXRlICUwIGNhbid0IGJlIGFwcGxpZWQgdG8gJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wcmFnbWFfYXR0cmlidXRlX21hdGNoZXJfbmVnYXRlZF9zdWJydWxlX2NvbnRyYWRpY3RzX3N1YnJ1bGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibmVnYXRlZCBhdHRyaWJ1dGUgc3ViamVjdCBtYXRjaGVyIHN1Yi1ydWxlICclMCcgY29udHJhZGljdHMgc3ViLXJ1bGUgJyUxJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3ByYWdtYV9hdHRyaWJ1dGVfbWF0Y2hlcl9zdWJydWxlX2NvbnRyYWRpY3RzX3J1bGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVkdW5kYW50IGF0dHJpYnV0ZSBzdWJqZWN0IG1hdGNoZXIgc3ViLXJ1bGUgJyUwJzsgJyUxJyBhbHJlYWR5IG1hdGNoZXMgdGhvc2UgZGVjbGFyYXRpb25zIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcHJhZ21hX2F0dHJpYnV0ZV9ub19wb3BfZW9mLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVudGVybWluYXRlZCAnI3ByYWdtYSBjbGFuZyBhdHRyaWJ1dGUgcHVzaCcgYXQgZW5kIG9mIGZpbGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wcmFnbWFfYXR0cmlidXRlX3N0YWNrX21pc21hdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIicjcHJhZ21hIGNsYW5nIGF0dHJpYnV0ZSBwb3AnIHdpdGggbm8gbWF0Y2hpbmcgJyNwcmFnbWEgY2xhbmcgYXR0cmlidXRlIHB1c2gnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcHJhZ21hX2xvb3BfY29tcGF0aWJpbGl0eSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2luY29tcGF0aWJsZXxkdXBsaWNhdGV9MCBkaXJlY3RpdmVzICclMScgYW5kICclMiciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wcmFnbWFfbG9vcF9pbnZhbGlkX2FyZ3VtZW50X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBhcmd1bWVudCBvZiB0eXBlICUwOyBleHBlY3RlZCBhbiBpbnRlZ2VyIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wcmFnbWFfbG9vcF9pbnZhbGlkX2FyZ3VtZW50X3ZhbHVlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7aW52YWxpZCB2YWx1ZSAnJTAnOyBtdXN0IGJlIHBvc2l0aXZlfHZhbHVlICclMCcgaXMgdG9vIGxhcmdlfTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wcmFnbWFfbG9vcF9wcmVjZWRlc19ub25sb29wLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cGVjdGVkIGEgZm9yLCB3aGlsZSwgb3IgZG8td2hpbGUgbG9vcCB0byBmb2xsb3cgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3ByYWdtYV9vcHRpb25zX2FsaWduX21hYzY4a190YXJnZXRfdW5zdXBwb3J0ZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWFjNjhrIGFsaWdubWVudCBwcmFnbWEgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHRhcmdldCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3ByYWdtYV9wb3BfdmlzaWJpbGl0eV9taXNtYXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIjcHJhZ21hIHZpc2liaWxpdHkgcG9wIHdpdGggbm8gbWF0Y2hpbmcgI3ByYWdtYSB2aXNpYmlsaXR5IHB1c2giLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wcmFnbWFfcHVzaF92aXNpYmlsaXR5X21pc21hdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiNwcmFnbWEgdmlzaWJpbGl0eSBwdXNoIHdpdGggbm8gbWF0Y2hpbmcgI3ByYWdtYSB2aXNpYmlsaXR5IHBvcCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3ByaXZhdGVfaXZhcl9hY2Nlc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5zdGFuY2UgdmFyaWFibGUgJTAgaXMgcHJpdmF0ZSIsIDAsIFNGSU5BRV9BY2Nlc3NDb250cm9sLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3Byb3BlcnR5X2FjY2Vzc29yX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSBvZiBwcm9wZXJ0eSAlMCAoJTEpIGRvZXMgbm90IG1hdGNoIHR5cGUgb2YgYWNjZXNzb3IgJTIgKCUzKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3Byb3BlcnR5X2ZvdW5kX3N1Z2dlc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicHJvcGVydHkgJTAgZm91bmQgb24gb2JqZWN0IG9mIHR5cGUgJTE7IGRpZCB5b3UgbWVhbiB0byBhY2Nlc3MgaXQgd2l0aCB0aGUgXCIuXCIgb3BlcmF0b3I/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcHJvcGVydHlfZnVuY3Rpb25faW5fb2JqY19jb250YWluZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidXNlIG9mIE9iamVjdGl2ZS1DIHByb3BlcnR5IGluIGZ1bmN0aW9uIG5lc3RlZCBpbiBPYmplY3RpdmUtQyBjb250YWluZXIgbm90IHN1cHBvcnRlZCwgbW92ZSBmdW5jdGlvbiBvdXRzaWRlIGl0cyBjb250YWluZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wcm9wZXJ0eV9pbXBsZW1lbnRlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwcm9wZXJ0eSAlMCBpcyBhbHJlYWR5IGltcGxlbWVudGVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcHJvcGVydHlfaXNfdmFyaWFibHlfbW9kaWZpZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicHJvcGVydHkgJTAgaGFzIGEgdmFyaWFibHkgbW9kaWZpZWQgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3Byb3BlcnR5X2l2YXJfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlIG9mIHByb3BlcnR5ICUwICglMSkgZG9lcyBub3QgbWF0Y2ggdHlwZSBvZiBpbnN0YW5jZSB2YXJpYWJsZSAlMiAoJTMpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcHJvcGVydHlfbWV0aG9kX3VuYXZhaWxhYmxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInByb3BlcnR5IGFjY2VzcyBpcyB1c2luZyAlMCBtZXRob2Qgd2hpY2ggaXMgdW5hdmFpbGFibGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wcm9wZXJ0eV9ub3RfYXNfZm9yd2FyZF9jbGFzcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwcm9wZXJ0eSAlMCByZWZlcnMgdG8gYW4gaW5jb21wbGV0ZSBPYmplY3RpdmUtQyBjbGFzcyAlMSAod2l0aCBubyBAaW50ZXJmYWNlIGF2YWlsYWJsZSkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wcm9wZXJ0eV9ub3RfZm91bmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicHJvcGVydHkgJTAgbm90IGZvdW5kIG9uIG9iamVjdCBvZiB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcHJvcGVydHlfbm90X2ZvdW5kX2ZvcndhcmRfY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicHJvcGVydHkgJTAgY2Fubm90IGJlIGZvdW5kIGluIGZvcndhcmQgY2xhc3Mgb2JqZWN0ICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcHJvcGVydHlfbm90X2ZvdW5kX3N1Z2dlc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicHJvcGVydHkgJTAgbm90IGZvdW5kIG9uIG9iamVjdCBvZiB0eXBlICUxOyBkaWQgeW91IG1lYW4gJTI/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcHJvcGVydHlfc2V0dGVyX2FtYmlndW91c191c2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic3ludGhlc2l6ZWQgcHJvcGVydGllcyAlMCBhbmQgJTEgYm90aCBjbGFpbSBzZXR0ZXIgJTIgLSB1c2Ugb2YgdGhpcyBzZXR0ZXIgd2lsbCBjYXVzZSB1bmV4cGVjdGVkIGJlaGF2aW9yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcHJvcGVydHlfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwcm9wZXJ0eSBjYW5ub3QgaGF2ZSBhcnJheSBvciBmdW5jdGlvbiB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcHJvdGVjdGVkX2l2YXJfYWNjZXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluc3RhbmNlIHZhcmlhYmxlICUwIGlzIHByb3RlY3RlZCIsIDAsIFNGSU5BRV9BY2Nlc3NDb250cm9sLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3Byb3RvY29sX2hhc19jaXJjdWxhcl9kZXBlbmRlbmN5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInByb3RvY29sIGhhcyBjaXJjdWxhciBkZXBlbmRlbmN5IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcHJvdG9jb2xfcHJvcGVydHlfbWlzbWF0Y2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicHJvcGVydHkgJXNlbGVjdHtvZiB0eXBlICUxfHdpdGggYXR0cmlidXRlICclMSd8d2l0aG91dCBhdHRyaWJ1dGUgJyUxJ3x3aXRoIGdldHRlciAlMXx3aXRoIHNldHRlciAlMX0wIHdhcyBzZWxlY3RlZCBmb3Igc3ludGhlc2lzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcHNldWRvX2R0b3JfYmFzZV9ub3Rfc2NhbGFyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm9iamVjdCBleHByZXNzaW9uIG9mIG5vbi1zY2FsYXIgdHlwZSAlMCBjYW5ub3QgYmUgdXNlZCBpbiBhIHBzZXVkby1kZXN0cnVjdG9yIGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wc2V1ZG9fZHRvcl9jYWxsX3dpdGhfYXJncywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYWxsIHRvIHBzZXVkby1kZXN0cnVjdG9yIGNhbm5vdCBoYXZlIGFueSBhcmd1bWVudHMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wc2V1ZG9fZHRvcl9kZXN0cnVjdG9yX25vbl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGRvZXMgbm90IHJlZmVyIHRvIGEgdHlwZSBuYW1lIGluIHBzZXVkby1kZXN0cnVjdG9yIGV4cHJlc3Npb247IGV4cGVjdGVkIHRoZSBuYW1lIG9mIHR5cGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9wc2V1ZG9fZHRvcl90eXBlX21pc21hdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRoZSB0eXBlIG9mIG9iamVjdCBleHByZXNzaW9uICVkaWZmeygkKSBkb2VzIG5vdCBtYXRjaCB0aGUgdHlwZSBiZWluZyBkZXN0cm95ZWQgKCQpfGRvZXMgbm90IG1hdGNoIHRoZSB0eXBlIGJlaW5nIGRlc3Ryb3llZH0wLDEgaW4gcHNldWRvLWRlc3RydWN0b3IgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3B1cmVfZnJpZW5kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZyaWVuZCBkZWNsYXJhdGlvbiBjYW5ub3QgaGF2ZSBhIHB1cmUtc3BlY2lmaWVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcXVhbGlmaWVkX2NhdGNoX2RlY2xhcmF0b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhjZXB0aW9uIGRlY2xhcmF0b3IgY2Fubm90IGJlIHF1YWxpZmllZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3F1YWxpZmllZF9mcmllbmRfZGVmLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZyaWVuZCBmdW5jdGlvbiBkZWZpbml0aW9uIGNhbm5vdCBiZSBxdWFsaWZpZWQgd2l0aCAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcXVhbGlmaWVkX2ZyaWVuZF9ub3RfZm91bmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gZnVuY3Rpb24gbmFtZWQgJTAgd2l0aCB0eXBlICUxIHdhcyBmb3VuZCBpbiB0aGUgc3BlY2lmaWVkIHNjb3BlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcXVhbGlmaWVkX21lbWJlcl9ub25jbGFzcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJxdWFsaWZpZWQgbWVtYmVyIGFjY2VzcyByZWZlcnMgdG8gYSBtZW1iZXIgaW4gJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9xdWFsaWZpZWRfbWVtYmVyX29mX3VucmVsYXRlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlcTAgaXMgbm90IGEgbWVtYmVyIG9mIGNsYXNzICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcXVhbGlmaWVkX29iamNfYWNjZXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7cHJvcGVydHl8aW5zdGFuY2UgdmFyaWFibGV9MCBhY2Nlc3MgY2Fubm90IGJlIHF1YWxpZmllZCB3aXRoICclMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9xdWFsaWZpZWRfb2JqY19jYXRjaF9wYXJtLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIkBjYXRjaCBwYXJhbWV0ZXIgZGVjbGFyYXRvciBjYW5ub3QgYmUgcXVhbGlmaWVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcXVhbGlmaWVkX3BhcmFtX2RlY2xhcmF0b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicGFyYW1ldGVyIGRlY2xhcmF0b3IgY2Fubm90IGJlIHF1YWxpZmllZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3F1YWxpZmllZF90eXBlZGVmX2RlY2xhcmF0b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZWRlZiBkZWNsYXJhdG9yIGNhbm5vdCBiZSBxdWFsaWZpZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9yYW5nZV9vbl9hcnJheV9wYXJhbWV0ZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGJ1aWxkIHJhbmdlIGV4cHJlc3Npb24gd2l0aCBhcnJheSBmdW5jdGlvbiBwYXJhbWV0ZXIgJTAgc2luY2UgcGFyYW1ldGVyIHdpdGggYXJyYXkgdHlwZSAlMSBpcyB0cmVhdGVkIGFzIHBvaW50ZXIgdHlwZSAlMiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JlYWRvbmx5X21lc3NhZ2VfYXNzaWdubWVudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhc3NpZ25pbmcgdG8gJ3JlYWRvbmx5JyByZXR1cm4gcmVzdWx0IG9mIGFuIE9iamVjdGl2ZS1DIG1lc3NhZ2Ugbm90IGFsbG93ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9yZWFsaW1hZ19pbnZhbGlkX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCB0eXBlICUwIHRvICUxIG9wZXJhdG9yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcmVjb3JkX3dpdGhfcG9pbnRlcnNfa2VybmVsX3BhcmFtLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7c3RydWN0fHVuaW9ufTAga2VybmVsIHBhcmFtZXRlcnMgbWF5IG5vdCBjb250YWluIHBvaW50ZXJzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcmVjdXJzaXZlX2RlZmF1bHRfYXJndW1lbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVjdXJzaXZlIGV2YWx1YXRpb24gb2YgZGVmYXVsdCBhcmd1bWVudCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JlY3Vyc2l2ZV9zdXBlcmNsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRyeWluZyB0byByZWN1cnNpdmVseSB1c2UgJTAgYXMgc3VwZXJjbGFzcyBvZiAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JlZGVjbGFyYXRpb25fZGlmZmVyZW50X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVkZWNsYXJhdGlvbiBvZiAlMCB3aXRoIGEgZGlmZmVyZW50IHR5cGUlZGlmZns6ICQgdnMgJHx9MSwyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcmVkZWZpbml0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZGVmaW5pdGlvbiBvZiAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JlZGVmaW5pdGlvbl9kaWZmZXJlbnRfa2luZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZWRlZmluaXRpb24gb2YgJTAgYXMgZGlmZmVyZW50IGtpbmQgb2Ygc3ltYm9sIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcmVkZWZpbml0aW9uX2RpZmZlcmVudF9uYW1lc3BhY2VfYWxpYXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVkZWZpbml0aW9uIG9mICUwIGFzIGFuIGFsaWFzIGZvciBhIGRpZmZlcmVudCBuYW1lc3BhY2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9yZWRlZmluaXRpb25fZGlmZmVyZW50X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVkZWZpbml0aW9uIG9mICUwIHdpdGggYSBkaWZmZXJlbnQgdHlwZSVkaWZmezogJCB2cyAkfH0xLDIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9yZWRlZmluaXRpb25fZGlmZmVyZW50X3R5cGVkZWYsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHt0eXBlZGVmfHR5cGUgYWxpYXN8dHlwZSBhbGlhcyB0ZW1wbGF0ZX0wIHJlZGVmaW5pdGlvbiB3aXRoIGRpZmZlcmVudCB0eXBlcyVkaWZmeyAoJCB2cyAkKXx9MSwyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcmVkZWZpbml0aW9uX2V4dGVybl9pbmxpbmUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVkZWZpbml0aW9uIG9mIGEgJ2V4dGVybiBpbmxpbmUnIGZ1bmN0aW9uICUwIGlzIG5vdCBzdXBwb3J0ZWQgaW4gJXNlbGVjdHtDOTkgbW9kZXxDKyt9MSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JlZGVmaW5pdGlvbl9vZl9lbnVtZXJhdG9yLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZGVmaW5pdGlvbiBvZiBlbnVtZXJhdG9yICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcmVkZWZpbml0aW9uX29mX2xhYmVsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZGVmaW5pdGlvbiBvZiBsYWJlbCAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JlZGVmaW5pdGlvbl92YXJpYWJseV9tb2RpZmllZF90eXBlZGVmLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZGVmaW5pdGlvbiBvZiAlc2VsZWN0e3R5cGVkZWZ8dHlwZSBhbGlhc30wIGZvciB2YXJpYWJseS1tb2RpZmllZCB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcmVmX2FycmF5X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHJlZmVyIHRvIGRlY2xhcmF0aW9uIHdpdGggYW4gYXJyYXkgdHlwZSBpbnNpZGUgYmxvY2siLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9yZWZfYmFkX3RhcmdldCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZWZlcmVuY2UgdG8gJXNlbGVjdHtfX2RldmljZV9ffF9fZ2xvYmFsX198X19ob3N0X198X19ob3N0X18gX19kZXZpY2VfX30wIGZ1bmN0aW9uICUxIGluICVzZWxlY3R7X19kZXZpY2VfX3xfX2dsb2JhbF9ffF9faG9zdF9ffF9faG9zdF9fIF9fZGV2aWNlX199MiBmdW5jdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JlZl9iYWRfdGFyZ2V0X2dsb2JhbF9pbml0aWFsaXplciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZWZlcmVuY2UgdG8gJXNlbGVjdHtfX2RldmljZV9ffF9fZ2xvYmFsX198X19ob3N0X198X19ob3N0X18gX19kZXZpY2VfX30wIGZ1bmN0aW9uICUxIGluIGdsb2JhbCBpbml0aWFsaXplciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JlZl9mbGV4YXJyYXlfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgcmVmZXIgdG8gZGVjbGFyYXRpb24gb2Ygc3RydWN0dXJlIHZhcmlhYmxlIHdpdGggZmxleGlibGUgYXJyYXkgbWVtYmVyIGluc2lkZSBibG9jayIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JlZl9pbml0X2FtYmlndW91cywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZWZlcmVuY2UgaW5pdGlhbGl6YXRpb24gb2YgdHlwZSAlMCB3aXRoIGluaXRpYWxpemVyIG9mIHR5cGUgJTEgaXMgYW1iaWd1b3VzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcmVmX25vbl92YWx1ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBkb2VzIG5vdCByZWZlciB0byBhIHZhbHVlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcmVmX3F1YWxpZmllcl9jb25zdHJ1Y3RvciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZWYtcXVhbGlmaWVyICclc2VsZWN0eyYmfCZ9MCcgaXMgbm90IGFsbG93ZWQgb24gYSBjb25zdHJ1Y3RvciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JlZl9xdWFsaWZpZXJfZGVzdHJ1Y3RvciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZWYtcXVhbGlmaWVyICclc2VsZWN0eyYmfCZ9MCcgaXMgbm90IGFsbG93ZWQgb24gYSBkZXN0cnVjdG9yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcmVmX3F1YWxpZmllcl9vdmVybG9hZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3Qgb3ZlcmxvYWQgYSBtZW1iZXIgZnVuY3Rpb24gJXNlbGVjdHt3aXRob3V0IGEgcmVmLXF1YWxpZmllcnx3aXRoIHJlZi1xdWFsaWZpZXIgJyYnfHdpdGggcmVmLXF1YWxpZmllciAnJiYnfTAgd2l0aCBhIG1lbWJlciBmdW5jdGlvbiAlc2VsZWN0e3dpdGhvdXQgYSByZWYtcXVhbGlmaWVyfHdpdGggcmVmLXF1YWxpZmllciAnJid8d2l0aCByZWYtcXVhbGlmaWVyICcmJid9MSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JlZl92bV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCByZWZlciB0byBkZWNsYXJhdGlvbiB3aXRoIGEgdmFyaWFibHkgbW9kaWZpZWQgdHlwZSBpbnNpZGUgYmxvY2siLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9yZWZlcmVuY2VfYmluZF9kcm9wc19xdWFscywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJiaW5kaW5nIHZhbHVlICVkaWZme29mIHR5cGUgJCB0byByZWZlcmVuY2UgdG8gdHlwZSAkfHRvIHJlZmVyZW5jZX0wLDEgZHJvcHMgJXNlbGVjdHs8PEVSUk9SPj58J2NvbnN0J3wncmVzdHJpY3QnfCdjb25zdCcgYW5kICdyZXN0cmljdCd8J3ZvbGF0aWxlJ3wnY29uc3QnIGFuZCAndm9sYXRpbGUnfCdyZXN0cmljdCcgYW5kICd2b2xhdGlsZSd8J2NvbnN0JywgJ3Jlc3RyaWN0JywgYW5kICd2b2xhdGlsZSd9MiBxdWFsaWZpZXIlcGx1cmFsezE6fDI6fDQ6fDpzfTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9yZWZlcmVuY2VfYmluZF9mYWlsZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVmZXJlbmNlICVkaWZme3RvIHR5cGUgJCBjb3VsZCBub3QgYmluZCB0byBhbiAlc2VsZWN0e3J2YWx1ZXxsdmFsdWV9MSBvZiB0eXBlICR8Y291bGQgbm90IGJpbmQgdG8gJXNlbGVjdHtydmFsdWV8bHZhbHVlfTEgb2YgaW5jb21wYXRpYmxlIHR5cGV9MCwyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcmVmZXJlbmNlX2JpbmRfaW5pdF9saXN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZmVyZW5jZSB0byB0eXBlICUwIGNhbm5vdCBiaW5kIHRvIGFuIGluaXRpYWxpemVyIGxpc3QiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9yZWZlcmVuY2VfYmluZF90b19iaXRmaWVsZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e25vbi1jb25zdHx2b2xhdGlsZX0wIHJlZmVyZW5jZSBjYW5ub3QgYmluZCB0byBiaXQtZmllbGQlc2VsZWN0e3wgJTF9MiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JlZmVyZW5jZV9iaW5kX3RvX3ZlY3Rvcl9lbGVtZW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7bm9uLWNvbnN0fHZvbGF0aWxlfTAgcmVmZXJlbmNlIGNhbm5vdCBiaW5kIHRvIHZlY3RvciBlbGVtZW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcmVmZXJlbmNlX2NhcHR1cmVfd2l0aF9yZWZlcmVuY2VfZGVmYXVsdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInJicgY2Fubm90IHByZWNlZGUgYSBjYXB0dXJlIHdoZW4gdGhlIGNhcHR1cmUgZGVmYXVsdCBpcyAnJiciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDMpCitESUFHKGVycl9yZWZlcmVuY2VfaGFzX211bHRpcGxlX2luaXRzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZmVyZW5jZSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBtdWx0aXBsZSB2YWx1ZXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9yZWZlcmVuY2VfcGlwZV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInBpcGVzIHBhY2tldCB0eXBlcyBjYW5ub3QgYmUgb2YgcmVmZXJlbmNlIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9yZWZlcmVuY2VfdG9fbG9jYWxfaW5fZW5jbG9zaW5nX2NvbnRleHQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVmZXJlbmNlIHRvIGxvY2FsICVzZWxlY3R7dmFyaWFibGV8YmluZGluZ30xICUwIGRlY2xhcmVkIGluIGVuY2xvc2luZyAlc2VsZWN0eyUzfGJsb2NrIGxpdGVyYWx8bGFtYmRhIGV4cHJlc3Npb258Y29udGV4dH0yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcmVmZXJlbmNlX3RvX3ZvaWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGZvcm0gYSByZWZlcmVuY2UgdG8gJ3ZvaWQnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcmVmZXJlbmNlX3Zhcl9yZXF1aXJlc19pbml0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlY2xhcmF0aW9uIG9mIHJlZmVyZW5jZSB2YXJpYWJsZSAlMCByZXF1aXJlcyBhbiBpbml0aWFsaXplciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JlZmVyZW5jZV93aXRob3V0X2luaXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVmZXJlbmNlIHRvIHR5cGUgJTAgcmVxdWlyZXMgYW4gaW5pdGlhbGl6ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9yZWdwYXJtX21pc21hdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZ1bmN0aW9uIGRlY2xhcmVkIHdpdGggcmVncGFybSglMCkgYXR0cmlidXRlIHdhcyBwcmV2aW91c2x5IGRlY2xhcmVkICVwbHVyYWx7MDp3aXRob3V0IHRoZSByZWdwYXJtfDp3aXRoIHRoZSByZWdwYXJtKCUxKX0xIGF0dHJpYnV0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JlcGVhdF9hdHRyaWJ1dGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgYXR0cmlidXRlIGNhbm5vdCBiZSByZXBlYXRlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JlcXVpcmVfY29uc3RhbnRfaW5pdF9mYWlsZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFyaWFibGUgZG9lcyBub3QgaGF2ZSBhIGNvbnN0YW50IGluaXRpYWxpemVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcmVzdHJpY3RlZF9zdXBlcmNsYXNzX21pc21hdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBzdWJjbGFzcyBhIGNsYXNzIHRoYXQgd2FzIGRlY2xhcmVkIHdpdGggdGhlICdvYmpjX3N1YmNsYXNzaW5nX3Jlc3RyaWN0ZWQnIGF0dHJpYnV0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JldF9sb2NhbF9ibG9jaywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZXR1cm5pbmcgYmxvY2sgdGhhdCBsaXZlcyBvbiB0aGUgbG9jYWwgc3RhY2siLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9yZXRocm93X3VzZWRfb3V0c2lkZV9jYXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJAdGhyb3cgKHJldGhyb3cpIHVzZWQgb3V0c2lkZSBvZiBhIEBjYXRjaCBibG9jayIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JldHVybl9ibG9ja19oYXNfZXhwciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2b2lkIGJsb2NrIHNob3VsZCBub3QgcmV0dXJuIGEgdmFsdWUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9yZXR1cm5faW5fY2FwdHVyZWRfc3RtdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgcmV0dXJuIGZyb20gJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9yZXR1cm5faW5fY29uc3RydWN0b3JfaGFuZGxlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZXR1cm4gaW4gdGhlIGNhdGNoIG9mIGEgZnVuY3Rpb24gdHJ5IGJsb2NrIG9mIGEgY29uc3RydWN0b3IgaXMgaWxsZWdhbCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JldHVybl9pbl9jb3JvdXRpbmUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmV0dXJuIHN0YXRlbWVudCBub3QgYWxsb3dlZCBpbiBjb3JvdXRpbmU7IGRpZCB5b3UgbWVhbiAnY29fcmV0dXJuJz8iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE0KQorRElBRyhlcnJfcmV0dXJuX2luaXRfbGlzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e3ZvaWQgZnVuY3Rpb258dm9pZCBtZXRob2R8Y29uc3RydWN0b3J8ZGVzdHJ1Y3Rvcn0xICUwIG11c3Qgbm90IHJldHVybiBhIHZhbHVlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfcm9vdF9jbGFzc19jYW5ub3RfdXNlX3N1cGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGNhbm5vdCB1c2UgJ3N1cGVyJyBiZWNhdXNlIGl0IGlzIGEgcm9vdCBjbGFzcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3JyZWZfaW5fZXhjZXB0aW9uX3NwZWMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicnZhbHVlIHJlZmVyZW5jZSB0eXBlICUwIGlzIG5vdCBhbGxvd2VkIGluIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc2FtcGxlcl9hcmd1bWVudF9yZXF1aXJlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJzYW1wbGVyX3QgdmFyaWFibGUgcmVxdWlyZWQgLSBnb3QgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zYW1wbGVyX2luaXRpYWxpemVyX25vdF9pbnRlZ2VyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInNhbXBsZXJfdCBpbml0aWFsaXphdGlvbiByZXF1aXJlcyAzMi1iaXQgaW50ZWdlciwgbm90ICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc2Vjb25kX2FyZ3VtZW50X3RvX2N3c2Nfbm90X3BvaW50ZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic2Vjb25kIGFyZ3VtZW50IHRvIF9fYnVpbHRpbl9jYWxsX3dpdGhfc3RhdGljX2NoYWluIG11c3QgYmUgb2YgcG9pbnRlciB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc2Vjb25kX3BhcmFtZXRlcl90b192YV9hcmdfYWJzdHJhY3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic2Vjb25kIGFyZ3VtZW50IHRvICd2YV9hcmcnIGlzIG9mIGFic3RyYWN0IHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zZWNvbmRfcGFyYW1ldGVyX3RvX3ZhX2FyZ19pbmNvbXBsZXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInNlY29uZCBhcmd1bWVudCB0byAndmFfYXJnJyBpcyBvZiBpbmNvbXBsZXRlIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zZWN0aW9uX2NvbmZsaWN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGNhdXNlcyBhIHNlY3Rpb24gdHlwZSBjb25mbGljdCB3aXRoICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc2VoX2luX2FfY29yb3V0aW5lX3dpdGhfY3h4X2V4Y2VwdGlvbnMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHVzZSBTRUggJ19fdHJ5JyBpbiBhIGNvcm91dGluZSB3aGVuIEMrKyBleGNlcHRpb25zIGFyZSBlbmFibGVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNCkKK0RJQUcoZXJyX3NlaF90cnlfb3V0c2lkZV9mdW5jdGlvbnMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHVzZSBTRUggJ19fdHJ5JyBpbiBibG9ja3MsIGNhcHR1cmVkIHJlZ2lvbnMsIG9yIE9iai1DIG1ldGhvZCBkZWNscyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3NlaF90cnlfdW5zdXBwb3J0ZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiU0VIICdfX3RyeScgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHRhcmdldCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3NlbGVjdGVkX2V4cGxpY2l0X2NvbnN0cnVjdG9yLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNob3NlbiBjb25zdHJ1Y3RvciBpcyBleHBsaWNpdCBpbiBjb3B5LWluaXRpYWxpemF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc2VsZWN0b3JfZWxlbWVudF9jb25zdF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInNlbGVjdG9yIGVsZW1lbnQgb2YgdHlwZSAlMCBjYW5ub3QgYmUgYSBjb25zdGFudCBsLXZhbHVlIGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zZWxlY3Rvcl9lbGVtZW50X25vdF9sdmFsdWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic2VsZWN0b3IgZWxlbWVudCBpcyBub3QgYSB2YWxpZCBsdmFsdWUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zZWxlY3Rvcl9lbGVtZW50X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic2VsZWN0b3IgZWxlbWVudCB0eXBlICUwIGlzIG5vdCBhIHZhbGlkIG9iamVjdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3NldHRlcl90eXBlX3ZvaWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSBvZiBzZXR0ZXIgbXVzdCBiZSB2b2lkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc2hhcmVkX3Zhcl9pbml0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluaXRpYWxpemF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIF9fc2hhcmVkX18gdmFyaWFibGVzLiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3NoaWZ0X3Joc19vbmx5X3ZlY3RvciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJyZXF1ZXN0ZWQgc2hpZnQgaXMgYSB2ZWN0b3Igb2YgdHlwZSAlMCBidXQgdGhlIGZpcnN0IG9wZXJhbmQgaXMgbm90IGEgdmVjdG9yICglMSkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zaHVmZmxldmVjdG9yX2FyZ3VtZW50X3Rvb19sYXJnZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbmRleCBmb3IgX19idWlsdGluX3NodWZmbGV2ZWN0b3IgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIHRvdGFsIG51bWJlciBvZiB2ZWN0b3IgZWxlbWVudHMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zaHVmZmxldmVjdG9yX25vbmNvbnN0YW50X2FyZ3VtZW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluZGV4IGZvciBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvciBtdXN0IGJlIGEgY29uc3RhbnQgaW50ZWdlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3NpemVvZl9hbGlnbm9mX2Z1bmN0aW9uX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBhcHBsaWNhdGlvbiBvZiAnJXNlbGVjdHtzaXplb2Z8YWxpZ25vZnx2ZWNfc3RlcHxfX2J1aWx0aW5fb21wX3JlcXVpcmVkX3NpbWRfYWxpZ259MCcgdG8gYSBmdW5jdGlvbiB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc2l6ZW9mX2FsaWdub2ZfaW5jb21wbGV0ZV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgYXBwbGljYXRpb24gb2YgJyVzZWxlY3R7c2l6ZW9mfGFsaWdub2Z8dmVjX3N0ZXB8X19idWlsdGluX29tcF9yZXF1aXJlZF9zaW1kX2FsaWdufTAnIHRvIGFuIGluY29tcGxldGUgdHlwZSAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3NpemVvZl9hbGlnbm9mX3R5cGVvZl9iaXRmaWVsZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIGFwcGxpY2F0aW9uIG9mICclc2VsZWN0e3NpemVvZnxhbGlnbm9mfHR5cGVvZn0wJyB0byBiaXQtZmllbGQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zaXplb2Zfbm9uZnJhZ2lsZV9pbnRlcmZhY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXBwbGljYXRpb24gb2YgJyVzZWxlY3R7YWxpZ25vZnxzaXplb2Z9MScgdG8gaW50ZXJmYWNlICUwIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBhcmNoaXRlY3R1cmUgYW5kIHBsYXRmb3JtIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc2l6ZW9mX3BhY2tfbm9fcGFja19uYW1lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGRvZXMgbm90IHJlZmVyIHRvIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyIHBhY2siLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zaXplb2ZfcGFja19ub19wYWNrX25hbWVfc3VnZ2VzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBkb2VzIG5vdCByZWZlciB0byB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlciBwYWNrOyBkaWQgeW91IG1lYW4gJTE/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc3BlY19tZW1iZXJfbm90X2luc3RhbnRpYXRlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJzcGVjaWFsaXphdGlvbiBvZiBtZW1iZXIgJXEwIGRvZXMgbm90IHNwZWNpYWxpemUgYW4gaW5zdGFudGlhdGVkIG1lbWJlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3NwZWNpYWxpemF0aW9uX2FmdGVyX2luc3RhbnRpYXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwbGljaXQgc3BlY2lhbGl6YXRpb24gb2YgJTAgYWZ0ZXIgaW5zdGFudGlhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3NwZWNpYWxpemF0aW9uX25vdF9wcmltYXJ5X3RlbXBsYXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCByZWZlcmVuY2UgbWVtYmVyIG9mIHByaW1hcnkgdGVtcGxhdGUgYmVjYXVzZSBkZWR1Y2VkIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uICUwIGlzICVzZWxlY3R7aW5zdGFudGlhdGVkIGZyb20gYSBwYXJ0aWFsfGFuIGV4cGxpY2l0fTEgc3BlY2lhbGl6YXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zcGVjaWFsaXplX21lbWJlcl9vZl90ZW1wbGF0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3Qgc3BlY2lhbGl6ZSAlc2VsZWN0e3wod2l0aCAndGVtcGxhdGU8PicpIH0wYSBtZW1iZXIgb2YgYW4gdW5zcGVjaWFsaXplZCB0ZW1wbGF0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N0YW5kYWxvbmVfY2xhc3NfbmVzdGVkX25hbWVfc3BlY2lmaWVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZvcndhcmQgZGVjbGFyYXRpb24gb2YgJXNlbGVjdHtjbGFzc3xzdHJ1Y3R8aW50ZXJmYWNlfHVuaW9ufGVudW19MCBjYW5ub3QgaGF2ZSBhIG5lc3RlZCBuYW1lIHNwZWNpZmllciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N0YXRpY19hc3NlcnRfZXhwcmVzc2lvbl9pc19ub3RfY29uc3RhbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic3RhdGljX2Fzc2VydCBleHByZXNzaW9uIGlzIG5vdCBhbiBpbnRlZ3JhbCBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc3RhdGljX2Fzc2VydF9mYWlsZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic3RhdGljX2Fzc2VydCBmYWlsZWQlc2VsZWN0eyAlMXx9MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N0YXRpY19hc3NlcnRfcmVxdWlyZW1lbnRfZmFpbGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN0YXRpY19hc3NlcnQgZmFpbGVkIGR1ZSB0byByZXF1aXJlbWVudCAnJTAnJXNlbGVjdHsgJTJ8fTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zdGF0aWNfYmxvY2tfZnVuYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmdW5jdGlvbiBkZWNsYXJlZCBpbiBibG9jayBzY29wZSBjYW5ub3QgaGF2ZSAnc3RhdGljJyBzdG9yYWdlIGNsYXNzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc3RhdGljX2RhdGFfbWVtYmVyX25vdF9hbGxvd2VkX2luX2Fub25fc3RydWN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN0YXRpYyBkYXRhIG1lbWJlciAlMCBub3QgYWxsb3dlZCBpbiBhbm9ueW1vdXMgc3RydWN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc3RhdGljX2RhdGFfbWVtYmVyX25vdF9hbGxvd2VkX2luX2xvY2FsX2NsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN0YXRpYyBkYXRhIG1lbWJlciAlMCBub3QgYWxsb3dlZCBpbiBsb2NhbCBjbGFzcyAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N0YXRpY19kYXRhX21lbWJlcl9yZWluaXRpYWxpemF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN0YXRpYyBkYXRhIG1lbWJlciAlMCBhbHJlYWR5IGhhcyBhbiBpbml0aWFsaXplciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N0YXRpY19kb3duY2FzdF92aWFfdmlydHVhbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgY2FzdCAlMCB0byAlMSB2aWEgdmlydHVhbCBiYXNlICUyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc3RhdGljX2Z1bmN0aW9uX3Njb3BlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInZhcmlhYmxlcyBpbiBmdW5jdGlvbiBzY29wZSBjYW5ub3QgYmUgZGVjbGFyZWQgc3RhdGljIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc3RhdGljX2lsbGVnYWxfaW5fbmV3LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRoZSAnc3RhdGljJyBtb2RpZmllciBmb3IgdGhlIGFycmF5IHNpemUgaXMgbm90IGxlZ2FsIGluIG5ldyBleHByZXNzaW9ucyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N0YXRpY19rZXJuZWwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAia2VybmVsIGZ1bmN0aW9ucyBjYW5ub3QgYmUgZGVjbGFyZWQgc3RhdGljIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc3RhdGljX21haW4sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ21haW4nIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGRlY2xhcmVkIHN0YXRpYyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N0YXRpY19ub25fc3RhdGljLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN0YXRpYyBkZWNsYXJhdGlvbiBvZiAlMCBmb2xsb3dzIG5vbi1zdGF0aWMgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zdGF0aWNfbm90X2JpdGZpZWxkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN0YXRpYyBtZW1iZXIgJTAgY2Fubm90IGJlIGEgYml0LWZpZWxkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc3RhdGljX291dF9vZl9saW5lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidzdGF0aWMnIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBpbnNpZGUgdGhlIGNsYXNzIGRlZmluaXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zdGF0aWNfb3ZlcnJpZGVzX3ZpcnR1YWwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ3N0YXRpYycgbWVtYmVyIGZ1bmN0aW9uICUwIG92ZXJyaWRlcyBhIHZpcnR1YWwgZnVuY3Rpb24gaW4gYSBiYXNlIGNsYXNzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc3RhdGljYWxseV9hbGxvY2F0ZWRfb2JqZWN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludGVyZmFjZSB0eXBlIGNhbm5vdCBiZSBzdGF0aWNhbGx5IGFsbG9jYXRlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N0ZF90eXBlX3RyYWl0X25vdF9jbGFzc190ZW1wbGF0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bnN1cHBvcnRlZCBzdGFuZGFyZCBsaWJyYXJ5IGltcGxlbWVudGF0aW9uOiAnc3RkOjolMCcgaXMgbm90IGEgY2xhc3MgdGVtcGxhdGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zdG10X2F0dHJpYnV0ZV9pbnZhbGlkX29uX2RlY2wsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgYXR0cmlidXRlIGNhbm5vdCBiZSBhcHBsaWVkIHRvIGEgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zdG9yYWdlX2NsYXNzX2Zvcl9zdGF0aWNfbWVtYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN0YXRpYyBkYXRhIG1lbWJlciBkZWZpbml0aW9uIGNhbm5vdCBzcGVjaWZ5IGEgc3RvcmFnZSBjbGFzcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N0b3JhZ2Vfc3BlY19vbl9jYXRjaF9wYXJtLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIkBjYXRjaCBwYXJhbWV0ZXIgY2Fubm90IGhhdmUgc3RvcmFnZSBzcGVjaWZpZXIgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N0b3JhZ2VjbGFzc19pbnZhbGlkX2Zvcl9tZW1iZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic3RvcmFnZSBjbGFzcyBzcGVjaWZpZWQgZm9yIGEgbWVtYmVyIGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc3Ryb25nX3Byb3BlcnR5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4aXN0aW5nIGluc3RhbmNlIHZhcmlhYmxlICUxIGZvciBzdHJvbmcgcHJvcGVydHkgJTAgbWF5IG5vdCBiZSBfX3dlYWsiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zdWJzY3JpcHRfZnVuY3Rpb25fdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJzdWJzY3JpcHQgb2YgcG9pbnRlciB0byBmdW5jdGlvbiB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc3Vic2NyaXB0X2luY29tcGxldGVfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJzdWJzY3JpcHQgb2YgcG9pbnRlciB0byBpbmNvbXBsZXRlIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zdWJzY3JpcHRfbm9uZnJhZ2lsZV9pbnRlcmZhY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic3Vic2NyaXB0IHJlcXVpcmVzIHNpemUgb2YgaW50ZXJmYWNlICUwLCB3aGljaCBpcyBub3QgY29uc3RhbnQgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlIGFuZCBwbGF0Zm9ybSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N1cGVyX2luX2xhbWJkYV91bnN1cHBvcnRlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1c2Ugb2YgJ19fc3VwZXInIGluc2lkZSBhIGxhbWJkYSBpcyB1bnN1cHBvcnRlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N3aWZ0X2FiaV9wYXJhbWV0ZXJfd3JvbmdfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInJTAnIHBhcmFtZXRlciBtdXN0IGhhdmUgcG9pbnRlciVzZWxlY3R7fCB0byB1bnF1YWxpZmllZCBwb2ludGVyfTEgdHlwZTsgdHlwZSBoZXJlIGlzICUyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc3dpZnRfZXJyb3JfcmVzdWx0X25vdF9hZnRlcl9zd2lmdF9jb250ZXh0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIidzd2lmdF9lcnJvcl9yZXN1bHQnIHBhcmFtZXRlciBtdXN0IGZvbGxvdyAnc3dpZnRfY29udGV4dCcgcGFyYW1ldGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc3dpZnRfaW5kaXJlY3RfcmVzdWx0X25vdF9maXJzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInc3dpZnRfaW5kaXJlY3RfcmVzdWx0JyBwYXJhbWV0ZXJzIG11c3QgYmUgZmlyc3QgcGFyYW1ldGVycyBvZiBmdW5jdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N3aWZ0X3BhcmFtX2F0dHJfbm90X3N3aWZ0Y2FsbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICInJTAnIHBhcmFtZXRlciBjYW4gb25seSBiZSB1c2VkIHdpdGggc3dpZnRjYWxsIGNhbGxpbmcgY29udmVudGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N3aXRjaF9leHBsaWNpdF9jb252ZXJzaW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN3aXRjaCBjb25kaXRpb24gdHlwZSAlMCByZXF1aXJlcyBleHBsaWNpdCBjb252ZXJzaW9uIHRvICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc3dpdGNoX2luY29tcGxldGVfY2xhc3NfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJzd2l0Y2ggY29uZGl0aW9uIGhhcyBpbmNvbXBsZXRlIGNsYXNzIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl9zd2l0Y2hfaW50b19wcm90ZWN0ZWRfc2NvcGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGp1bXAgZnJvbSBzd2l0Y2ggc3RhdGVtZW50IHRvIHRoaXMgY2FzZSBsYWJlbCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N3aXRjaF9tdWx0aXBsZV9jb252ZXJzaW9ucywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtdWx0aXBsZSBjb252ZXJzaW9ucyBmcm9tIHN3aXRjaCBjb25kaXRpb24gdHlwZSAlMCB0byBhbiBpbnRlZ3JhbCBvciBlbnVtZXJhdGlvbiB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfc3ludGhlc2l6ZV9jYXRlZ29yeV9kZWNsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIkBzeW50aGVzaXplIG5vdCBhbGxvd2VkIGluIGEgY2F0ZWdvcnkncyBpbXBsZW1lbnRhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N5bnRoZXNpemVfb25fY2xhc3NfcHJvcGVydHksIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiQHN5bnRoZXNpemUgbm90IGFsbG93ZWQgb24gYSBjbGFzcyBwcm9wZXJ0eSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N5bnRoZXNpemVfdmFyaWFibGVfc2l6ZWRfaXZhciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJzeW50aGVzaXplZCBwcm9wZXJ0eSB3aXRoIHZhcmlhYmxlIHNpemUgdHlwZSAlMCByZXF1aXJlcyBhbiBleGlzdGluZyBpbnN0YW5jZSB2YXJpYWJsZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3N5bnRoZXNpemluZ19hcmNfd2Vha19wcm9wZXJ0eV9kaXNhYmxlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3Qgc3ludGhlc2l6ZSB3ZWFrIHByb3BlcnR5IGluIGZpbGUgdXNpbmcgbWFudWFsIHJlZmVyZW5jZSBjb3VudGluZyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgOSkKK0RJQUcoZXJyX3N5bnRoZXNpemluZ19hcmNfd2Vha19wcm9wZXJ0eV9ub19ydW50aW1lLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBzeW50aGVzaXplIHdlYWsgcHJvcGVydHkgYmVjYXVzZSB0aGUgY3VycmVudCBkZXBsb3ltZW50IHRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgOSkKK0RJQUcoZXJyX3N5c3RlbXpfaW52YWxpZF90YWJvcnRfY29kZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbnZhbGlkIHRyYW5zYWN0aW9uIGFib3J0IGNvZGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90YWdfZGVmaW5pdGlvbl9vZl90eXBlZGVmLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZmluaXRpb24gb2YgdHlwZSAlMCBjb25mbGljdHMgd2l0aCAlc2VsZWN0e3R5cGVkZWZ8dHlwZSBhbGlhc30xIG9mIHRoZSBzYW1lIG5hbWUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90YWdfaW5kZXhfb3V0X29mX3JhbmdlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7dHlwZSB0YWd8YXJndW1lbnR9MCBpbmRleCAlMSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBhcmd1bWVudHMgc3BlY2lmaWVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGFnX3JlZmVyZW5jZV9jb25mbGljdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbXBsaWNpdCBkZWNsYXJhdGlvbiBpbnRyb2R1Y2VkIGJ5IGVsYWJvcmF0ZWQgdHlwZSBjb25mbGljdHMgd2l0aCBhICVzZWxlY3R7bm9uLXN0cnVjdCB0eXBlfG5vbi1jbGFzcyB0eXBlfG5vbi11bmlvbiB0eXBlfG5vbi1lbnVtIHR5cGV8dHlwZWRlZnx0eXBlIGFsaWFzfHRlbXBsYXRlfHR5cGUgYWxpYXMgdGVtcGxhdGV8dGVtcGxhdGUgdGVtcGxhdGUgYXJndW1lbnR9MCBvZiB0aGUgc2FtZSBuYW1lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGFnX3JlZmVyZW5jZV9ub25fdGFnLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7bm9uLXN0cnVjdCB0eXBlfG5vbi1jbGFzcyB0eXBlfG5vbi11bmlvbiB0eXBlfG5vbi1lbnVtIHR5cGV8dHlwZWRlZnx0eXBlIGFsaWFzfHRlbXBsYXRlfHR5cGUgYWxpYXMgdGVtcGxhdGV8dGVtcGxhdGUgdGVtcGxhdGUgYXJndW1lbnR9MSAlMCBjYW5ub3QgYmUgcmVmZXJlbmNlZCB3aXRoIGEgJXNlbGVjdHtzdHJ1Y3R8aW50ZXJmYWNlfHVuaW9ufGNsYXNzfGVudW19MiBzcGVjaWZpZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90YWdsZXNzX2ZyaWVuZF90eXBlX3RlbXBsYXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZyaWVuZCB0eXBlIHRlbXBsYXRlcyBtdXN0IHVzZSBhbiBlbGFib3JhdGVkIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90YXJnZXRfcmVxdWlyZWRfaW5fcmVkZWNsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzIG1pc3NpbmcgJ3RhcmdldCcgYXR0cmlidXRlIGluIGEgbXVsdGl2ZXJzaW9uZWQgZnVuY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDApCitESUFHKGVycl90ZW1wX2NvcHlfYW1iaWd1b3VzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFtYmlndW91cyBjb25zdHJ1Y3RvciBjYWxsIHdoZW4gJXNlbGVjdHtjb3B5aW5nIHZhcmlhYmxlfGNvcHlpbmcgcGFyYW1ldGVyfHJldHVybmluZyBvYmplY3R8dGhyb3dpbmcgb2JqZWN0fGNvcHlpbmcgbWVtYmVyIHN1Ym9iamVjdHxjb3B5aW5nIGFycmF5IGVsZW1lbnR8YWxsb2NhdGluZyBvYmplY3R8Y29weWluZyB0ZW1wb3Jhcnl8aW5pdGlhbGl6aW5nIGJhc2Ugc3Vib2JqZWN0fGluaXRpYWxpemluZyB2ZWN0b3IgZWxlbWVudHxjYXB0dXJpbmcgdmFsdWV9MCBvZiB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcF9jb3B5X2RlbGV0ZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtjb3B5aW5nIHZhcmlhYmxlfGNvcHlpbmcgcGFyYW1ldGVyfHJldHVybmluZyBvYmplY3R8dGhyb3dpbmcgb2JqZWN0fGNvcHlpbmcgbWVtYmVyIHN1Ym9iamVjdHxjb3B5aW5nIGFycmF5IGVsZW1lbnR8YWxsb2NhdGluZyBvYmplY3R8Y29weWluZyB0ZW1wb3Jhcnl8aW5pdGlhbGl6aW5nIGJhc2Ugc3Vib2JqZWN0fGluaXRpYWxpemluZyB2ZWN0b3IgZWxlbWVudHxjYXB0dXJpbmcgdmFsdWV9MCBvZiB0eXBlICUxIGludm9rZXMgZGVsZXRlZCBjb25zdHJ1Y3RvciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBfY29weV9pbmNvbXBsZXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvcHlpbmcgYSB0ZW1wb3Jhcnkgb2JqZWN0IG9mIGluY29tcGxldGUgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBfY29weV9ub192aWFibGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gdmlhYmxlIGNvbnN0cnVjdG9yICVzZWxlY3R7Y29weWluZyB2YXJpYWJsZXxjb3B5aW5nIHBhcmFtZXRlcnxyZXR1cm5pbmcgb2JqZWN0fHRocm93aW5nIG9iamVjdHxjb3B5aW5nIG1lbWJlciBzdWJvYmplY3R8Y29weWluZyBhcnJheSBlbGVtZW50fGFsbG9jYXRpbmcgb2JqZWN0fGNvcHlpbmcgdGVtcG9yYXJ5fGluaXRpYWxpemluZyBiYXNlIHN1Ym9iamVjdHxpbml0aWFsaXppbmcgdmVjdG9yIGVsZW1lbnR8Y2FwdHVyaW5nIHZhbHVlfTAgb2YgdHlwZSAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX2FyZ19hZGRyZXNzX29mX25vbl9wb2ludGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFkZHJlc3MgdGFrZW4gaW4gbm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnQgZm9yIHRlbXBsYXRlIHBhcmFtZXRlciBvZiByZWZlcmVuY2UgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX2FyZ19kZWR1Y2VkX2luY29tcGxldGVfcGFjaywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZWR1Y2VkIGluY29tcGxldGUgcGFjayAlMCBmb3IgdGVtcGxhdGUgcGFyYW1ldGVyICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfYXJnX2ZpZWxkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50IHJlZmVycyB0byBub24tc3RhdGljIGRhdGEgbWVtYmVyICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfYXJnX2xpc3RfZGlmZmVyZW50X2FyaXR5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7dG9vIGZld3x0b28gbWFueX0wIHRlbXBsYXRlIGFyZ3VtZW50cyBmb3IgJXNlbGVjdHtjbGFzcyB0ZW1wbGF0ZXxmdW5jdGlvbiB0ZW1wbGF0ZXx2YXJpYWJsZSB0ZW1wbGF0ZXxhbGlhcyB0ZW1wbGF0ZXx0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJ8dGVtcGxhdGV9MSAlMiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX2FyZ19tZW1iZXJfcHRyX2Jhc2VfZGVyaXZlZF9ub3Rfc3VwcG9ydGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInNvcnJ5LCBub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCBvZiBwb2ludGVyLXRvLW1lbWJlciB0eXBlICUxIHRoYXQgcmVmZXJzIHRvIG1lbWJlciAlcTAgb2YgYSBkaWZmZXJlbnQgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCB5ZXQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9hcmdfbWV0aG9kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50IHJlZmVycyB0byBub24tc3RhdGljIG1lbWJlciBmdW5jdGlvbiAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX2FyZ19tdXN0X2JlX2V4cHIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGVtcGxhdGUgYXJndW1lbnQgZm9yIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlciBtdXN0IGJlIGFuIGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9hcmdfbXVzdF9iZV90ZW1wbGF0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0ZW1wbGF0ZSBhcmd1bWVudCBmb3IgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyIG11c3QgYmUgYSBjbGFzcyB0ZW1wbGF0ZSVzZWxlY3R7fCBvciB0eXBlIGFsaWFzIHRlbXBsYXRlfTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9hcmdfbXVzdF9iZV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRlbXBsYXRlIGFyZ3VtZW50IGZvciB0ZW1wbGF0ZSB0eXBlIHBhcmFtZXRlciBtdXN0IGJlIGEgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX2FyZ19tdXN0X2JlX3R5cGVfc3VnZ2VzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0ZW1wbGF0ZSBhcmd1bWVudCBmb3IgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXIgbXVzdCBiZSBhIHR5cGU7IGRpZCB5b3UgZm9yZ2V0ICd0eXBlbmFtZSc/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfYXJnX25vX3JlZl9iaW5kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlciBvZiByZWZlcmVuY2UgdHlwZSAlZGlmZnskIGNhbm5vdCBiaW5kIHRvIHRlbXBsYXRlIGFyZ3VtZW50IG9mIHR5cGUgJHxjYW5ub3QgYmluZCB0byB0ZW1wbGF0ZSBvZiBpbmNvbXBhdGlibGUgYXJndW1lbnQgdHlwZX0wLDEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9hcmdfbm9udHlwZV9hbWJpZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0ZW1wbGF0ZSBhcmd1bWVudCBmb3Igbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVyIGlzIHRyZWF0ZWQgYXMgZnVuY3Rpb24gdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX2FyZ19ub3RfYWRkcmVzc19jb25zdGFudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCBvZiB0eXBlICUwIGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9hcmdfbm90X2FkZHJlc3Nfb2YsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnQgZm9yIHRlbXBsYXRlIHBhcmFtZXRlciBvZiBwb2ludGVyIHR5cGUgJTAgbXVzdCBoYXZlIGl0cyBhZGRyZXNzIHRha2VuIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfYXJnX25vdF9jb252ZXJ0aWJsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCBvZiB0eXBlICUwIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYSB2YWx1ZSBvZiB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfYXJnX25vdF9kZWNsX3JlZiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCBkb2VzIG5vdCByZWZlciB0byBhbnkgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9hcmdfbm90X2ljZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCBvZiB0eXBlICUwIGlzIG5vdCBhbiBpbnRlZ3JhbCBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfYXJnX25vdF9pbnRlZ3JhbF9vcl9lbnVtZXJhbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCBvZiB0eXBlICUwIG11c3QgaGF2ZSBhbiBpbnRlZ3JhbCBvciBlbnVtZXJhdGlvbiB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfYXJnX25vdF9vYmplY3Rfb3JfZnVuYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCBkb2VzIG5vdCByZWZlciB0byBhbiBvYmplY3Qgb3IgZnVuY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9hcmdfbm90X3BvaW50ZXJfdG9fbWVtYmVyX2Zvcm0sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnQgaXMgbm90IGEgcG9pbnRlciB0byBtZW1iZXIgY29uc3RhbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9hcmdfbm90X3ZhbGlkX3RlbXBsYXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRlbXBsYXRlIGFyZ3VtZW50IGRvZXMgbm90IHJlZmVyIHRvIGEgY2xhc3Mgb3IgYWxpYXMgdGVtcGxhdGUsIG9yIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX2FyZ19vYmplY3Rfbm9fbGlua2FnZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCByZWZlcnMgdG8gJXNlbGVjdHtmdW5jdGlvbnxvYmplY3R9MCAlMSB0aGF0IGRvZXMgbm90IGhhdmUgbGlua2FnZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX2FyZ19vdmVybG9hZF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRlbXBsYXRlIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIGFuIHVucmVzb2x2ZWQgb3ZlcmxvYWRlZCBmdW5jdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX2FyZ19yZWZfYmluZF9pZ25vcmVzX3F1YWxzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZmVyZW5jZSBiaW5kaW5nIG9mIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlciAlZGlmZntvZiB0eXBlICQgdG8gdGVtcGxhdGUgYXJndW1lbnQgb2YgdHlwZSAkfHRvIHRlbXBsYXRlIGFyZ3VtZW50fTAsMSBpZ25vcmVzIHF1YWxpZmllcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9hcmdfcmVmZXJlbmNlX3ZhciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCBvZiByZWZlcmVuY2UgdHlwZSAlMCBpcyBub3QgYW4gb2JqZWN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfYXJnX3RlbXBsYXRlX3BhcmFtc19taXNtYXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0ZW1wbGF0ZSB0ZW1wbGF0ZSBhcmd1bWVudCBoYXMgZGlmZmVyZW50IHRlbXBsYXRlIHBhcmFtZXRlcnMgdGhhbiBpdHMgY29ycmVzcG9uZGluZyB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9hcmdfdGhyZWFkX2xvY2FsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50IHJlZmVycyB0byB0aHJlYWQtbG9jYWwgb2JqZWN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfYXJnX3VudHlwZWRfbnVsbF9jb25zdGFudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJudWxsIG5vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50IG11c3QgYmUgY2FzdCB0byB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX2FyZ193cm9uZ3R5cGVfbnVsbF9jb25zdGFudCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJudWxsIG5vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50IG9mIHR5cGUgJTAgZG9lcyBub3QgbWF0Y2ggdGVtcGxhdGUgcGFyYW1ldGVyIG9mIHR5cGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9kZWNsX3JlZiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgcmVmZXIgdG8gJXNlbGVjdHtjbGFzc3x2YXJpYWJsZX0wIHRlbXBsYXRlICUxIHdpdGhvdXQgYSB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfZGlmZmVyZW50X2Fzc29jaWF0ZWRfY29uc3RyYWludHMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXNzb2NpYXRlZCBjb25zdHJhaW50cyBkaWZmZXIgaW4gdGVtcGxhdGUgcmVkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX2lkX25vdF9hX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGVtcGxhdGUgbmFtZSByZWZlcnMgdG8gbm9uLXR5cGUgdGVtcGxhdGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9pbnNpZGVfbG9jYWxfY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGVtcGxhdGVzIGNhbm5vdCBiZSBkZWNsYXJlZCBpbnNpZGUgb2YgYSBsb2NhbCBjbGFzcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX2luc3RhbnRpYXRlX3VuZGVmaW5lZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2ltcGxpY2l0fGV4cGxpY2l0fTAgaW5zdGFudGlhdGlvbiBvZiB1bmRlZmluZWQgdGVtcGxhdGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9pbnN0YW50aWF0ZV93aXRoaW5fZGVmaW5pdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2ltcGxpY2l0fGV4cGxpY2l0fTAgaW5zdGFudGlhdGlvbiBvZiB0ZW1wbGF0ZSAlMSB3aXRoaW4gaXRzIG93biBkZWZpbml0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfa3dfbWlzc2luZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtaXNzaW5nICd0ZW1wbGF0ZScga2V5d29yZCBwcmlvciB0byBkZXBlbmRlbnQgdGVtcGxhdGUgbmFtZSAnJTAlMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9rd19yZWZlcnNfdG9fY2xhc3NfdGVtcGxhdGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJyUwJTEnIGluc3RhbnRpYXRlZCB0byBhIGNsYXNzIHRlbXBsYXRlLCBub3QgYSBmdW5jdGlvbiB0ZW1wbGF0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX2t3X3JlZmVyc190b19ub25fdGVtcGxhdGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgZm9sbG93aW5nIHRoZSAndGVtcGxhdGUnIGtleXdvcmQgZG9lcyBub3QgcmVmZXIgdG8gYSB0ZW1wbGF0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX2xpbmthZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGVtcGxhdGVzIG11c3QgaGF2ZSBDKysgbGlua2FnZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX21lbWJlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtZW1iZXIgJTAgZGVjbGFyZWQgYXMgYSB0ZW1wbGF0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX21lbWJlcl9ub3BhcmFtcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHRyYW5lb3VzICd0ZW1wbGF0ZTw+JyBpbiBkZWNsYXJhdGlvbiBvZiBtZW1iZXIgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9taXNzaW5nX2FyZ3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidXNlIG9mICVzZWxlY3R7Y2xhc3MgdGVtcGxhdGV8ZnVuY3Rpb24gdGVtcGxhdGV8dmFyaWFibGUgdGVtcGxhdGV8YWxpYXMgdGVtcGxhdGV8dGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyfHRlbXBsYXRlfTAgJTEgcmVxdWlyZXMgdGVtcGxhdGUgYXJndW1lbnRzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfbm9udHlwZV9wYXJtX2JhZF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImEgbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVyIGNhbm5vdCBoYXZlIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9ub250eXBlX3Bhcm1fZGlmZmVyZW50X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGVtcGxhdGUgbm9uLXR5cGUgcGFyYW1ldGVyIGhhcyBhIGRpZmZlcmVudCB0eXBlICUwIGluIHRlbXBsYXRlICVzZWxlY3R7fHRlbXBsYXRlIHBhcmFtZXRlciB9MXJlZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9vdXRzaWRlX25hbWVzcGFjZV9vcl9jbGFzc19zY29wZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0ZW1wbGF0ZXMgY2FuIG9ubHkgYmUgZGVjbGFyZWQgaW4gbmFtZXNwYWNlIG9yIGNsYXNzIHNjb3BlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfcGFyYW1fZGVmYXVsdF9hcmdfbWlzc2luZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0ZW1wbGF0ZSBwYXJhbWV0ZXIgbWlzc2luZyBhIGRlZmF1bHQgYXJndW1lbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9wYXJhbV9kZWZhdWx0X2FyZ19yZWRlZmluaXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGVtcGxhdGUgcGFyYW1ldGVyIHJlZGVmaW5lcyBkZWZhdWx0IGFyZ3VtZW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfcGFyYW1fZGlmZmVyZW50X2tpbmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGVtcGxhdGUgcGFyYW1ldGVyIGhhcyBhIGRpZmZlcmVudCBraW5kIGluIHRlbXBsYXRlICVzZWxlY3R7fHRlbXBsYXRlIHBhcmFtZXRlciB9MHJlZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9wYXJhbV9saXN0X2RpZmZlcmVudF9hcml0eSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e3RvbyBmZXd8dG9vIG1hbnl9MCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGluIHRlbXBsYXRlICVzZWxlY3R7fHRlbXBsYXRlIHBhcmFtZXRlciB9MXJlZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9wYXJhbV9saXN0X21hdGNoZXNfbm9udGVtcGxhdGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGVtcGxhdGUgcGFyYW1ldGVyIGxpc3QgbWF0Y2hpbmcgdGhlIG5vbi10ZW1wbGF0ZWQgbmVzdGVkIHR5cGUgJTAgc2hvdWxkIGJlIGVtcHR5ICgndGVtcGxhdGU8PicpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfcGFyYW1fcGFja19kZWZhdWx0X2FyZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0ZW1wbGF0ZSBwYXJhbWV0ZXIgcGFjayBjYW5ub3QgaGF2ZSBhIGRlZmF1bHQgYXJndW1lbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9wYXJhbV9wYWNrX211c3RfYmVfbGFzdF90ZW1wbGF0ZV9wYXJhbWV0ZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGVtcGxhdGUgcGFyYW1ldGVyIHBhY2sgbXVzdCBiZSB0aGUgbGFzdCB0ZW1wbGF0ZSBwYXJhbWV0ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9wYXJhbV9zaGFkb3csIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVjbGFyYXRpb24gb2YgJTAgc2hhZG93cyB0ZW1wbGF0ZSBwYXJhbWV0ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9wYXJhbWV0ZXJfZGVmYXVsdF9mcmllbmRfdGVtcGxhdGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudCBub3QgcGVybWl0dGVkIG9uIGEgZnJpZW5kIHRlbXBsYXRlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfcGFyYW1ldGVyX2RlZmF1bHRfdGVtcGxhdGVfbWVtYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBhZGQgYSBkZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50IHRvIHRoZSBkZWZpbml0aW9uIG9mIGEgbWVtYmVyIG9mIGEgY2xhc3MgdGVtcGxhdGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9wYXJhbWV0ZXJfcGFja19ub25fcGFjaywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e3RlbXBsYXRlIHR5cGV8bm9uLXR5cGUgdGVtcGxhdGV8dGVtcGxhdGUgdGVtcGxhdGV9MCBwYXJhbWV0ZXIlc2VsZWN0e3wgcGFja30xIGNvbmZsaWN0cyB3aXRoIHByZXZpb3VzICVzZWxlY3R7dGVtcGxhdGUgdHlwZXxub24tdHlwZSB0ZW1wbGF0ZXx0ZW1wbGF0ZSB0ZW1wbGF0ZX0wIHBhcmFtZXRlciVzZWxlY3R7IHBhY2t8fTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9xdWFsaWZpZWRfZGVjbGFyYXRvcl9ub19tYXRjaCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJuZXN0ZWQgbmFtZSBzcGVjaWZpZXIgJyUwJyBmb3IgZGVjbGFyYXRpb24gZG9lcyBub3QgcmVmZXIgaW50byBhIGNsYXNzLCBjbGFzcyB0ZW1wbGF0ZSBvciBjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfcmVjdXJzaW9uX2RlcHRoX2V4Y2VlZGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInJlY3Vyc2l2ZSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGV4Y2VlZGVkIG1heGltdW0gZGVwdGggb2YgJTAiLCAwLCBTRklOQUVfUmVwb3J0LCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX3NwZWNfZGVjbF9mcmllbmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGRlY2xhcmUgYW4gZXhwbGljaXQgc3BlY2lhbGl6YXRpb24gaW4gYSBmcmllbmQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9zcGVjX2RlY2xfZnVuY3Rpb25fc2NvcGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhwbGljaXQgc3BlY2lhbGl6YXRpb24gb2YgJTAgaW4gZnVuY3Rpb24gc2NvcGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9zcGVjX2RlZmF1bHRfYXJnLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZmF1bHQgYXJndW1lbnQgbm90IHBlcm1pdHRlZCBvbiBhbiBleHBsaWNpdCAlc2VsZWN0e2luc3RhbnRpYXRpb258c3BlY2lhbGl6YXRpb259MCBvZiBmdW5jdGlvbiAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX3NwZWNfZXh0cmFfaGVhZGVycywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHRyYW5lb3VzIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0IGluIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG9yIG91dC1vZi1saW5lIHRlbXBsYXRlIGRlZmluaXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9zcGVjX2ZyaWVuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkZWNsYXJhdGlvbiBjYW5ub3QgYmUgYSBmcmllbmQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9zcGVjX25lZWRzX2hlYWRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiByZXF1aXJlcyAndGVtcGxhdGU8PiciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9zcGVjX25lZWRzX3RlbXBsYXRlX3BhcmFtZXRlcnMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gb3IgZGVmaW5pdGlvbiByZXF1aXJlcyBhIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5lc3RlZCB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfc3BlY19yZWRlY2xfZ2xvYmFsX3Njb3BlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7Y2xhc3MgdGVtcGxhdGV8Y2xhc3MgdGVtcGxhdGUgcGFydGlhbHx2YXJpYWJsZSB0ZW1wbGF0ZXx2YXJpYWJsZSB0ZW1wbGF0ZSBwYXJ0aWFsfGZ1bmN0aW9uIHRlbXBsYXRlfG1lbWJlciBmdW5jdGlvbnxzdGF0aWMgZGF0YSBtZW1iZXJ8bWVtYmVyIGNsYXNzfG1lbWJlciBlbnVtZXJhdGlvbn0wIHNwZWNpYWxpemF0aW9uIG9mICUxIG11c3Qgb2NjdXIgYXQgZ2xvYmFsIHNjb3BlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGVtcGxhdGVfc3BlY19yZWRlY2xfb3V0X29mX3Njb3BlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7Y2xhc3MgdGVtcGxhdGV8Y2xhc3MgdGVtcGxhdGUgcGFydGlhbHx2YXJpYWJsZSB0ZW1wbGF0ZXx2YXJpYWJsZSB0ZW1wbGF0ZSBwYXJ0aWFsfGZ1bmN0aW9uIHRlbXBsYXRlfG1lbWJlciBmdW5jdGlvbnxzdGF0aWMgZGF0YSBtZW1iZXJ8bWVtYmVyIGNsYXNzfG1lbWJlciBlbnVtZXJhdGlvbn0wIHNwZWNpYWxpemF0aW9uIG9mICUxIG5vdCBpbiAlc2VsZWN0e2EgbmFtZXNwYWNlIGVuY2xvc2luZyAlMnxjbGFzcyAlMiBvciBhbiBlbmNsb3NpbmcgbmFtZXNwYWNlfTMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV9zcGVjX3Vua25vd25fa2luZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW4gb25seSBwcm92aWRlIGFuIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBhIGNsYXNzIHRlbXBsYXRlLCBmdW5jdGlvbiB0ZW1wbGF0ZSwgdmFyaWFibGUgdGVtcGxhdGUsIG9yIGEgbWVtYmVyIGZ1bmN0aW9uLCBzdGF0aWMgZGF0YSBtZW1iZXIsICVzZWxlY3R7b3IgbWVtYmVyIGNsYXNzfG1lbWJlciBjbGFzcywgb3IgbWVtYmVyIGVudW1lcmF0aW9ufTAgb2YgYSBjbGFzcyB0ZW1wbGF0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX3RhZ19ub3BhcmFtcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHRyYW5lb3VzICd0ZW1wbGF0ZTw+JyBpbiBkZWNsYXJhdGlvbiBvZiAlMCAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX3RlbXBsYXRlX3Bhcm1fbm9fcGFybXMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyIG11c3QgaGF2ZSBpdHMgb3duIHRlbXBsYXRlIHBhcmFtZXRlcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV90eXBlZGVmLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImEgdHlwZWRlZiBjYW5ub3QgYmUgYSB0ZW1wbGF0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbXBsYXRlX3VubmFtZWRfY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGRlY2xhcmUgYSBjbGFzcyB0ZW1wbGF0ZSB3aXRoIG5vIG5hbWUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90ZW1wbGF0ZV92YXJpYWJsZV9ub3BhcmFtcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJleHRyYW5lb3VzICd0ZW1wbGF0ZTw+JyBpbiBkZWNsYXJhdGlvbiBvZiB2YXJpYWJsZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RlbnRhdGl2ZV9kZWZfaW5jb21wbGV0ZV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRlbnRhdGl2ZSBkZWZpbml0aW9uIGhhcyB0eXBlICUwIHRoYXQgaXMgbmV2ZXIgY29tcGxldGVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGhpc19jYXB0dXJlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIid0aGlzJyBjYW5ub3QgYmUgJXNlbGVjdHtpbXBsaWNpdGx5IHx9MGNhcHR1cmVkIGluIHRoaXMgY29udGV4dCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMykKK0RJQUcoZXJyX3RoaXNfc3RhdGljX21lbWJlcl9mdW5jLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIid0aGlzJyBjYW5ub3QgYmUlc2VsZWN0e3wgaW1wbGljaXRseX0wIHVzZWQgaW4gYSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGhyZWFkX2R5bmFtaWNfaW5pdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbml0aWFsaXplciBmb3IgdGhyZWFkLWxvY2FsIHZhcmlhYmxlIG11c3QgYmUgYSBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGhyZWFkX25vbl9nbG9iYWwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJyUwJyB2YXJpYWJsZXMgbXVzdCBoYXZlIGdsb2JhbCBzdG9yYWdlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGhyZWFkX25vbl90aHJlYWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhyZWFkLWxvY2FsIGRlY2xhcmF0aW9uIG9mICUwIGZvbGxvd3Mgbm9uLXRocmVhZC1sb2NhbCBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RocmVhZF9ub250cml2aWFsX2R0b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSBvZiB0aHJlYWQtbG9jYWwgdmFyaWFibGUgaGFzIG5vbi10cml2aWFsIGRlc3RydWN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGhyZWFkX3RocmVhZF9kaWZmZXJlbnRfa2luZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aHJlYWQtbG9jYWwgZGVjbGFyYXRpb24gb2YgJTAgd2l0aCAlc2VsZWN0e3N0YXRpY3xkeW5hbWljfTEgaW5pdGlhbGl6YXRpb24gZm9sbG93cyBkZWNsYXJhdGlvbiB3aXRoICVzZWxlY3R7ZHluYW1pY3xzdGF0aWN9MSBpbml0aWFsaXphdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3RocmVhZF91bnN1cHBvcnRlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0aHJlYWQtbG9jYWwgc3RvcmFnZSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgY3VycmVudCB0YXJnZXQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90aHJvd19hYnN0cmFjdF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCB0aHJvdyBhbiBvYmplY3Qgb2YgYWJzdHJhY3QgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3Rocm93X2luY29tcGxldGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHRocm93IG9iamVjdCBvZiBpbmNvbXBsZXRlIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90aHJvd19pbmNvbXBsZXRlX3B0ciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgdGhyb3cgcG9pbnRlciB0byBvYmplY3Qgb2YgaW5jb21wbGV0ZSB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdGxzX3Zhcl9hbGlnbmVkX292ZXJfbWF4aW11bSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhbGlnbm1lbnQgKCUwKSBvZiB0aHJlYWQtbG9jYWwgdmFyaWFibGUgJTEgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBhbGlnbm1lbnQgKCUyKSBmb3IgYSB0aHJlYWQtbG9jYWwgdmFyaWFibGUgb24gdGhpcyB0YXJnZXQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90b29tYW55X2VsZW1lbnRfZGVjbHMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib25seSBvbmUgZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBhbGxvd2VkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHJhaWxpbmdfcmV0dXJuX2luX3BhcmVucywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0cmFpbGluZyByZXR1cm4gdHlwZSBtYXkgbm90IGJlIG5lc3RlZCB3aXRoaW4gcGFyZW50aGVzZXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90cmFpbGluZ19yZXR1cm5fd2l0aG91dF9hdXRvLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZ1bmN0aW9uIHdpdGggdHJhaWxpbmcgcmV0dXJuIHR5cGUgbXVzdCBzcGVjaWZ5IHJldHVybiB0eXBlICdhdXRvJywgbm90ICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZV9kZWZpbmVkX2luX2FsaWFzX3RlbXBsYXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGNhbm5vdCBiZSBkZWZpbmVkIGluIGEgdHlwZSBhbGlhcyB0ZW1wbGF0ZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVfZGVmaW5lZF9pbl9jb25kaXRpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgY2Fubm90IGJlIGRlZmluZWQgaW4gYSBjb25kaXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlX2RlZmluZWRfaW5fZW51bSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBjYW5ub3QgYmUgZGVmaW5lZCBpbiBhbiBlbnVtZXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVfZGVmaW5lZF9pbl9mb3JfcmFuZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZXMgbWF5IG5vdCBiZSBkZWZpbmVkIGluIGEgZm9yIHJhbmdlIGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZV9kZWZpbmVkX2luX3BhcmFtX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgY2Fubm90IGJlIGRlZmluZWQgaW4gYSBwYXJhbWV0ZXIgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVfZGVmaW5lZF9pbl9yZXN1bHRfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBjYW5ub3QgYmUgZGVmaW5lZCBpbiB0aGUgcmVzdWx0IHR5cGUgb2YgYSBmdW5jdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVfZGVmaW5lZF9pbl90eXBlX3NwZWNpZmllciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBjYW5ub3QgYmUgZGVmaW5lZCBpbiBhIHR5cGUgc3BlY2lmaWVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZV9taXNtYXRjaF9jb250aW51YXRpb25fY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSBvZiBwcm9wZXJ0eSAlMCBpbiBjbGFzcyBleHRlbnNpb24gZG9lcyBub3QgbWF0Y2ggcHJvcGVydHkgdHlwZSBpbiBwcmltYXJ5IGNsYXNzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZV9wYWNrX2VsZW1lbnRfb3V0X29mX2JvdW5kcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhIHBhcmFtZXRlciBwYWNrIG1heSBub3QgYmUgYWNjZXNzZWQgYXQgYW4gb3V0IG9mIGJvdW5kcyBpbmRleCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVfdGFnX2Zvcl9kYXRhdHlwZV9ub3RfaWNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIid0eXBlX3RhZ19mb3JfZGF0YXR5cGUnIGF0dHJpYnV0ZSByZXF1aXJlcyB0aGUgaW5pdGlhbGl6ZXIgdG8gYmUgYW4gJXNlbGVjdHtpbnRlZ2VyfGludGVncmFsfTAgY29uc3RhbnQgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVfdGFnX2Zvcl9kYXRhdHlwZV90b29fbGFyZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ3R5cGVfdGFnX2Zvcl9kYXRhdHlwZScgYXR0cmlidXRlIHJlcXVpcmVzIHRoZSBpbml0aWFsaXplciB0byBiZSBhbiAlc2VsZWN0e2ludGVnZXJ8aW50ZWdyYWx9MCBjb25zdGFudCBleHByZXNzaW9uIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IGEgNjQgYml0IGludGVnZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlX3Vuc3VwcG9ydGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyB0YXJnZXQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfYWRkcmVzc19vZiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhZGRyZXNzIG9mICVzZWxlY3R7Yml0LWZpZWxkfHZlY3RvciBlbGVtZW50fHByb3BlcnR5IGV4cHJlc3Npb258cmVnaXN0ZXIgdmFyaWFibGV9MCByZXF1ZXN0ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfYWRkcm9mX2R0b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGFraW5nIHRoZSBhZGRyZXNzIG9mIGEgZGVzdHJ1Y3RvciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19hZGRyb2ZfdGVtcG9yYXJ5LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRha2luZyB0aGUgYWRkcmVzcyBvZiBhIHRlbXBvcmFyeSBvYmplY3Qgb2YgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19hbWJpZ3VvdXNfY29uZGl0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbnZlcnNpb24gJWRpZmZ7ZnJvbSAkIHRvICR8YmV0d2VlbiB0eXBlc30wLDEgaXMgYW1iaWd1b3VzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX2FyY19hc3NpZ25fc2VsZiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgYXNzaWduIHRvICdzZWxmJyBvdXRzaWRlIG9mIGEgbWV0aG9kIGluIHRoZSBpbml0IGZhbWlseSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNSkKK0RJQUcoZXJyX3R5cGVjaGVja19hcmNfYXNzaWduX3NlbGZfY2xhc3NfbWV0aG9kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBhc3NpZ24gdG8gJ3NlbGYnIGluIGEgY2xhc3MgbWV0aG9kIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCA1KQorRElBRyhlcnJfdHlwZWNoZWNrX2FyaXRobWV0aWNfaW5jb21wbGV0ZV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFyaXRobWV0aWMgb24gYSBwb2ludGVyIHRvIGFuIGluY29tcGxldGUgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19hcnJfYXNzaWduX2VudW1lcmF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZhc3QgZW51bWVyYXRpb24gdmFyaWFibGVzIGNhbm5vdCBiZSBtb2RpZmllZCBpbiBBUkMgYnkgZGVmYXVsdDsgZGVjbGFyZSB0aGUgdmFyaWFibGUgX19zdHJvbmcgdG8gYWxsb3cgdGhpcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgNSkKK0RJQUcoZXJyX3R5cGVjaGVja19hcnJheV9ub3RfbW9kaWZpYWJsZV9sdmFsdWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJyYXkgdHlwZSAlMCBpcyBub3QgYXNzaWduYWJsZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19hc3NpZ25fY29uc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtjYW5ub3QgYXNzaWduIHRvIHJldHVybiB2YWx1ZSBiZWNhdXNlIGZ1bmN0aW9uICUxIHJldHVybnMgYSBjb25zdCB2YWx1ZXxjYW5ub3QgYXNzaWduIHRvIHZhcmlhYmxlICUxIHdpdGggY29uc3QtcXVhbGlmaWVkIHR5cGUgJTJ8Y2Fubm90IGFzc2lnbiB0byAlc2VsZWN0e25vbi18fTFzdGF0aWMgZGF0YSBtZW1iZXIgJTIgd2l0aCBjb25zdC1xdWFsaWZpZWQgdHlwZSAlM3xjYW5ub3QgYXNzaWduIHRvIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXIgd2l0aGluIGNvbnN0IG1lbWJlciBmdW5jdGlvbiAlMXxjYW5ub3QgYXNzaWduIHRvICVzZWxlY3R7dmFyaWFibGUgJTJ8bm9uLXN0YXRpYyBkYXRhIG1lbWJlciAlMnxsdmFsdWV9MSB3aXRoICVzZWxlY3R7fG5lc3RlZCB9M2NvbnN0LXF1YWxpZmllZCBkYXRhIG1lbWJlciAlNHxyZWFkLW9ubHkgdmFyaWFibGUgaXMgbm90IGFzc2lnbmFibGV9MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19ib29sX2NvbmRpdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2YWx1ZSBvZiB0eXBlICUwIGlzIG5vdCBjb250ZXh0dWFsbHkgY29udmVydGlibGUgdG8gJ2Jvb2wnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX2NhbGxfaW52YWxpZF9vcmRlcmVkX2NvbXBhcmUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib3JkZXJlZCBjb21wYXJlIHJlcXVpcmVzIHR3byBhcmdzIG9mIGZsb2F0aW5nIHBvaW50IHR5cGUlZGlmZnsgKCQgYW5kICQpfH0wLDEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfY2FsbF9pbnZhbGlkX3VuYXJ5X2ZwLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZsb2F0aW5nIHBvaW50IGNsYXNzaWZpY2F0aW9uIHJlcXVpcmVzIGFyZ3VtZW50IG9mIGZsb2F0aW5nIHBvaW50IHR5cGUgKHBhc3NlZCBpbiAlMCkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfY2FsbF9ub3RfZnVuY3Rpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2FsbGVkIG9iamVjdCB0eXBlICUwIGlzIG5vdCBhIGZ1bmN0aW9uIG9yIGZ1bmN0aW9uIHBvaW50ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfY2FsbF90b29fZmV3X2FyZ3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidG9vIGZldyAlc2VsZWN0e3x8fGV4ZWN1dGlvbiBjb25maWd1cmF0aW9uIH0wYXJndW1lbnRzIHRvICVzZWxlY3R7ZnVuY3Rpb258YmxvY2t8bWV0aG9kfGtlcm5lbCBmdW5jdGlvbn0wIGNhbGwsIGV4cGVjdGVkICUxLCBoYXZlICUyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX2NhbGxfdG9vX2Zld19hcmdzX2F0X2xlYXN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRvbyBmZXcgJXNlbGVjdHt8fHxleGVjdXRpb24gY29uZmlndXJhdGlvbiB9MGFyZ3VtZW50cyB0byAlc2VsZWN0e2Z1bmN0aW9ufGJsb2NrfG1ldGhvZHxrZXJuZWwgZnVuY3Rpb259MCBjYWxsLCBleHBlY3RlZCBhdCBsZWFzdCAlMSwgaGF2ZSAlMiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19jYWxsX3Rvb19mZXdfYXJnc19hdF9sZWFzdF9vbmUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidG9vIGZldyAlc2VsZWN0e3x8fGV4ZWN1dGlvbiBjb25maWd1cmF0aW9uIH0wYXJndW1lbnRzIHRvICVzZWxlY3R7ZnVuY3Rpb258YmxvY2t8bWV0aG9kfGtlcm5lbCBmdW5jdGlvbn0wIGNhbGwsIGF0IGxlYXN0IGFyZ3VtZW50ICUxIG11c3QgYmUgc3BlY2lmaWVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX2NhbGxfdG9vX2Zld19hcmdzX2F0X2xlYXN0X3N1Z2dlc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidG9vIGZldyAlc2VsZWN0e3x8fGV4ZWN1dGlvbiBjb25maWd1cmF0aW9uIH0wYXJndW1lbnRzIHRvICVzZWxlY3R7ZnVuY3Rpb258YmxvY2t8bWV0aG9kfGtlcm5lbCBmdW5jdGlvbn0wIGNhbGwsIGV4cGVjdGVkIGF0IGxlYXN0ICUxLCBoYXZlICUyOyBkaWQgeW91IG1lYW4gJTM/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX2NhbGxfdG9vX2Zld19hcmdzX29uZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0b28gZmV3ICVzZWxlY3R7fHx8ZXhlY3V0aW9uIGNvbmZpZ3VyYXRpb24gfTBhcmd1bWVudHMgdG8gJXNlbGVjdHtmdW5jdGlvbnxibG9ja3xtZXRob2R8a2VybmVsIGZ1bmN0aW9ufTAgY2FsbCwgc2luZ2xlIGFyZ3VtZW50ICUxIHdhcyBub3Qgc3BlY2lmaWVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX2NhbGxfdG9vX2Zld19hcmdzX3N1Z2dlc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidG9vIGZldyAlc2VsZWN0e3x8fGV4ZWN1dGlvbiBjb25maWd1cmF0aW9uIH0wYXJndW1lbnRzIHRvICVzZWxlY3R7ZnVuY3Rpb258YmxvY2t8bWV0aG9kfGtlcm5lbCBmdW5jdGlvbn0wIGNhbGwsIGV4cGVjdGVkICUxLCBoYXZlICUyOyBkaWQgeW91IG1lYW4gJTM/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX2NhbGxfdG9vX21hbnlfYXJncywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0b28gbWFueSAlc2VsZWN0e3x8fGV4ZWN1dGlvbiBjb25maWd1cmF0aW9uIH0wYXJndW1lbnRzIHRvICVzZWxlY3R7ZnVuY3Rpb258YmxvY2t8bWV0aG9kfGtlcm5lbCBmdW5jdGlvbn0wIGNhbGwsIGV4cGVjdGVkICUxLCBoYXZlICUyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX2NhbGxfdG9vX21hbnlfYXJnc19hdF9tb3N0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRvbyBtYW55ICVzZWxlY3R7fHx8ZXhlY3V0aW9uIGNvbmZpZ3VyYXRpb24gfTBhcmd1bWVudHMgdG8gJXNlbGVjdHtmdW5jdGlvbnxibG9ja3xtZXRob2R8a2VybmVsIGZ1bmN0aW9ufTAgY2FsbCwgZXhwZWN0ZWQgYXQgbW9zdCAlMSwgaGF2ZSAlMiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19jYWxsX3Rvb19tYW55X2FyZ3NfYXRfbW9zdF9vbmUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidG9vIG1hbnkgJXNlbGVjdHt8fHxleGVjdXRpb24gY29uZmlndXJhdGlvbiB9MGFyZ3VtZW50cyB0byAlc2VsZWN0e2Z1bmN0aW9ufGJsb2NrfG1ldGhvZHxrZXJuZWwgZnVuY3Rpb259MCBjYWxsLCBleHBlY3RlZCBhdCBtb3N0IHNpbmdsZSBhcmd1bWVudCAlMSwgaGF2ZSAlMiBhcmd1bWVudHMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfY2FsbF90b29fbWFueV9hcmdzX2F0X21vc3Rfc3VnZ2VzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0b28gbWFueSAlc2VsZWN0e3x8fGV4ZWN1dGlvbiBjb25maWd1cmF0aW9uIH0wYXJndW1lbnRzIHRvICVzZWxlY3R7ZnVuY3Rpb258YmxvY2t8bWV0aG9kfGtlcm5lbCBmdW5jdGlvbn0wIGNhbGwsIGV4cGVjdGVkIGF0IG1vc3QgJTEsIGhhdmUgJTI7IGRpZCB5b3UgbWVhbiAlMz8iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfY2FsbF90b29fbWFueV9hcmdzX29uZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0b28gbWFueSAlc2VsZWN0e3x8fGV4ZWN1dGlvbiBjb25maWd1cmF0aW9uIH0wYXJndW1lbnRzIHRvICVzZWxlY3R7ZnVuY3Rpb258YmxvY2t8bWV0aG9kfGtlcm5lbCBmdW5jdGlvbn0wIGNhbGwsIGV4cGVjdGVkIHNpbmdsZSBhcmd1bWVudCAlMSwgaGF2ZSAlMiBhcmd1bWVudHMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfY2FsbF90b29fbWFueV9hcmdzX3N1Z2dlc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidG9vIG1hbnkgJXNlbGVjdHt8fHxleGVjdXRpb24gY29uZmlndXJhdGlvbiB9MGFyZ3VtZW50cyB0byAlc2VsZWN0e2Z1bmN0aW9ufGJsb2NrfG1ldGhvZHxrZXJuZWwgZnVuY3Rpb259MCBjYWxsLCBleHBlY3RlZCAlMSwgaGF2ZSAlMjsgZGlkIHlvdSBtZWFuICUzPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19jYXN0X3RvX2luY29tcGxldGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2FzdCB0byBpbmNvbXBsZXRlIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfY2FzdF90b191bmlvbl9ub190eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhc3QgdG8gdW5pb24gdHlwZSBmcm9tIHR5cGUgJTAgbm90IHByZXNlbnQgaW4gdW5pb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfY2hvb3NlX2V4cHJfcmVxdWlyZXNfY29uc3RhbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ19fYnVpbHRpbl9jaG9vc2VfZXhwcicgcmVxdWlyZXMgYSBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX2NvbXBhcmlzb25fb2ZfZGlzdGluY3RfYmxvY2tzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbXBhcmlzb24gb2YgZGlzdGluY3QgYmxvY2sgdHlwZXMlZGlmZnsgKCQgYW5kICQpfH0wLDEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfY29tcGFyaXNvbl9vZl9kaXN0aW5jdF9wb2ludGVycywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb21wYXJpc29uIG9mIGRpc3RpbmN0IHBvaW50ZXIgdHlwZXMlZGlmZnsgKCQgYW5kICQpfH0wLDEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfY29tcGFyaXNvbl9vZl9mcHRyX3RvX3ZvaWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXF1YWxpdHkgY29tcGFyaXNvbiBiZXR3ZWVuIGZ1bmN0aW9uIHBvaW50ZXIgYW5kIHZvaWQgcG9pbnRlciAoJTAgYW5kICUxKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19jb21wYXJpc29uX29mX3BvaW50ZXJfaW50ZWdlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb21wYXJpc29uIGJldHdlZW4gcG9pbnRlciBhbmQgaW50ZWdlciAoJTAgYW5kICUxKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19jb25kX2V4cGVjdF9pbnRfZmxvYXQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidXNlZCB0eXBlICUwIHdoZXJlIGludGVnZXIgb3IgZmxvYXRpbmcgcG9pbnQgdHlwZSBpcyByZXF1aXJlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19jb25kX2V4cGVjdF9ub25mbG9hdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1c2VkIHR5cGUgJTAgd2hlcmUgZmxvYXRpbmcgcG9pbnQgdHlwZSBpcyBub3QgYWxsb3dlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19jb25kX2V4cGVjdF9zY2FsYXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidXNlZCB0eXBlICUwIHdoZXJlIGFyaXRobWV0aWMgb3IgcG9pbnRlciB0eXBlIGlzIHJlcXVpcmVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX2NvbmRfaW5jb21wYXRpYmxlX29wZXJhbmRzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluY29tcGF0aWJsZSBvcGVyYW5kIHR5cGVzJWRpZmZ7ICgkIGFuZCAkKXx9MCwxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX2NvbmRfaW5jb21wYXRpYmxlX29wZXJhbmRzX251bGwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm9uLXBvaW50ZXIgb3BlcmFuZCB0eXBlICUwIGluY29tcGF0aWJsZSB3aXRoICVzZWxlY3R7TlVMTHxudWxscHRyfTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfY29udmVydF9pbmNvbXBhdGlibGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHslZGlmZnthc3NpZ25pbmcgdG8gJCBmcm9tIGluY29tcGF0aWJsZSB0eXBlICR8YXNzaWduaW5nIHRvIHR5cGUgZnJvbSBpbmNvbXBhdGlibGUgdHlwZX0wLDF8JWRpZmZ7cGFzc2luZyAkIHRvIHBhcmFtZXRlciBvZiBpbmNvbXBhdGlibGUgdHlwZSAkfHBhc3NpbmcgdHlwZSB0byBwYXJhbWV0ZXIgb2YgaW5jb21wYXRpYmxlIHR5cGV9MCwxfCVkaWZme3JldHVybmluZyAkIGZyb20gYSBmdW5jdGlvbiB3aXRoIGluY29tcGF0aWJsZSByZXN1bHQgdHlwZSAkfHJldHVybmluZyB0eXBlIGZyb20gYSBmdW5jdGlvbiB3aXRoIGluY29tcGF0aWJsZSByZXN1bHQgdHlwZX0wLDF8JWRpZmZ7Y29udmVydGluZyAkIHRvIGluY29tcGF0aWJsZSB0eXBlICR8Y29udmVydGluZyB0eXBlIHRvIGluY29tcGF0aWJsZSB0eXBlfTAsMXwlZGlmZntpbml0aWFsaXppbmcgJCB3aXRoIGFuIGV4cHJlc3Npb24gb2YgaW5jb21wYXRpYmxlIHR5cGUgJHxpbml0aWFsaXppbmcgdHlwZSB3aXRoIGFuIGV4cHJlc3Npb24gb2YgaW5jb21wYXRpYmxlIHR5cGV9MCwxfCVkaWZme3NlbmRpbmcgJCB0byBwYXJhbWV0ZXIgb2YgaW5jb21wYXRpYmxlIHR5cGUgJHxzZW5kaW5nIHR5cGUgdG8gcGFyYW1ldGVyIG9mIGluY29tcGF0aWJsZSB0eXBlfTAsMXwlZGlmZntjYXN0aW5nICQgdG8gaW5jb21wYXRpYmxlIHR5cGUgJHxjYXN0aW5nIHR5cGUgdG8gaW5jb21wYXRpYmxlIHR5cGV9MCwxfTIlc2VsZWN0e3w7IGRlcmVmZXJlbmNlIHdpdGggKnw7IHRha2UgdGhlIGFkZHJlc3Mgd2l0aCAmfDsgcmVtb3ZlICp8OyByZW1vdmUgJn0zJXNlbGVjdHt8OiBkaWZmZXJlbnQgY2xhc3NlcyVkaWZmeyAoJCB2cyAkKXx9NSw2fDogZGlmZmVyZW50IG51bWJlciBvZiBwYXJhbWV0ZXJzICglNSB2cyAlNil8OiB0eXBlIG1pc21hdGNoIGF0ICVvcmRpbmFsNSBwYXJhbWV0ZXIlZGlmZnsgKCQgdnMgJCl8fTYsN3w6IGRpZmZlcmVudCByZXR1cm4gdHlwZSVkaWZmeyAoJCB2cyAkKXx9NSw2fDogZGlmZmVyZW50IHF1YWxpZmllcnMgKCVzZWxlY3R7bm9uZXxjb25zdHxyZXN0cmljdHxjb25zdCBhbmQgcmVzdHJpY3R8dm9sYXRpbGV8Y29uc3QgYW5kIHZvbGF0aWxlfHZvbGF0aWxlIGFuZCByZXN0cmljdHxjb25zdCwgdm9sYXRpbGUsIGFuZCByZXN0cmljdH01IHZzICVzZWxlY3R7bm9uZXxjb25zdHxyZXN0cmljdHxjb25zdCBhbmQgcmVzdHJpY3R8dm9sYXRpbGV8Y29uc3QgYW5kIHZvbGF0aWxlfHZvbGF0aWxlIGFuZCByZXN0cmljdHxjb25zdCwgdm9sYXRpbGUsIGFuZCByZXN0cmljdH02KXw6IGRpZmZlcmVudCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnN9NCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19jb252ZXJ0X2luY29tcGF0aWJsZV9ibG9ja19wb2ludGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluY29tcGF0aWJsZSBibG9jayBwb2ludGVyIHR5cGVzICVzZWxlY3R7JWRpZmZ7YXNzaWduaW5nIHRvICQgZnJvbSAkfGFzc2lnbmluZyB0byBkaWZmZXJlbnQgdHlwZXN9MCwxfCVkaWZme3Bhc3NpbmcgJCB0byBwYXJhbWV0ZXIgb2YgdHlwZSAkfHBhc3NpbmcgdG8gcGFyYW1ldGVyIG9mIGRpZmZlcmVudCB0eXBlfTAsMXwlZGlmZntyZXR1cm5pbmcgJCBmcm9tIGEgZnVuY3Rpb24gd2l0aCByZXN1bHQgdHlwZSAkfHJldHVybmluZyBmcm9tIGZ1bmN0aW9uIHdpdGggZGlmZmVyZW50IHJldHVybiB0eXBlfTAsMXwlZGlmZntjb252ZXJ0aW5nICQgdG8gdHlwZSAkfGNvbnZlcnRpbmcgYmV0d2VlbiB0eXBlc30wLDF8JWRpZmZ7aW5pdGlhbGl6aW5nICQgd2l0aCBhbiBleHByZXNzaW9uIG9mIHR5cGUgJHxpbml0aWFsaXppbmcgd2l0aCBleHByZXNzaW9uIG9mIGRpZmZlcmVudCB0eXBlfTAsMXwlZGlmZntzZW5kaW5nICQgdG8gcGFyYW1ldGVyIG9mIHR5cGUgJHxzZW5kaW5nIHRvIHBhcmFtZXRlciBvZiBkaWZmZXJlbnQgdHlwZX0wLDF8JWRpZmZ7Y2FzdGluZyAkIHRvIHR5cGUgJHxjYXN0aW5nIGJldHdlZW4gdHlwZXN9MCwxfTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfY29udmVydGVkX2NvbnN0YW50X2V4cHJlc3Npb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFsdWUgb2YgdHlwZSAlMCBpcyBub3QgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19jb252ZXJ0ZWRfY29uc3RhbnRfZXhwcmVzc2lvbl9kaXNhbGxvd2VkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbnZlcnNpb24gZnJvbSAlMCB0byAlMSBpcyBub3QgYWxsb3dlZCBpbiBhIGNvbnZlcnRlZCBjb25zdGFudCBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX2NvbnZlcnRlZF9jb25zdGFudF9leHByZXNzaW9uX2luZGlyZWN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbnZlcnNpb24gZnJvbSAlMCB0byAlMSBpbiBjb252ZXJ0ZWQgY29uc3RhbnQgZXhwcmVzc2lvbiB3b3VsZCBiaW5kIHJlZmVyZW5jZSB0byBhIHRlbXBvcmFyeSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19kZWNsX2luY29tcGxldGVfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2YXJpYWJsZSBoYXMgaW5jb21wbGV0ZSB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX2RlbGV0ZWRfZnVuY3Rpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29udmVyc2lvbiBmdW5jdGlvbiAlZGlmZntmcm9tICQgdG8gJHxiZXR3ZWVuIHR5cGVzfTAsMSBpbnZva2VzIGEgZGVsZXRlZCBmdW5jdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19kdXBsaWNhdGVfdmVjdG9yX2NvbXBvbmVudHNfbm90X21sdmFsdWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmVjdG9yIGlzIG5vdCBhc3NpZ25hYmxlIChjb250YWlucyBkdXBsaWNhdGUgY29tcG9uZW50cykiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfZXhwZWN0X2ludCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1c2VkIHR5cGUgJTAgd2hlcmUgaW50ZWdlciBpcyByZXF1aXJlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19leHBlY3Rfc2NhbGFyX29wZXJhbmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib3BlcmFuZCBvZiB0eXBlICUwIHdoZXJlIGFyaXRobWV0aWMgb3IgcG9pbnRlciB0eXBlIGlzIHJlcXVpcmVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX2V4cHJlc3Npb25fbm90X21vZGlmaWFibGVfbHZhbHVlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4cHJlc3Npb24gaXMgbm90IGFzc2lnbmFibGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfZmllbGRfdmFyaWFibGVfc2l6ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmaWVsZHMgbXVzdCBoYXZlIGEgY29uc3RhbnQgc2l6ZTogJ3ZhcmlhYmxlIGxlbmd0aCBhcnJheSBpbiBzdHJ1Y3R1cmUnIGV4dGVuc2lvbiB3aWxsIG5ldmVyIGJlIHN1cHBvcnRlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19pbGxlZ2FsX2luY3JlbWVudF9kZWNyZW1lbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90ICVzZWxlY3R7ZGVjcmVtZW50fGluY3JlbWVudH0xIHZhbHVlIG9mIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfaW5jb21wYXRpYmxlX2FkZHJlc3Nfc3BhY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHslZGlmZnthc3NpZ25pbmcgJCB0byAkfGFzc2lnbmluZyB0byBkaWZmZXJlbnQgdHlwZXN9MSwwfCVkaWZme3Bhc3NpbmcgJCB0byBwYXJhbWV0ZXIgb2YgdHlwZSAkfHBhc3NpbmcgdG8gcGFyYW1ldGVyIG9mIGRpZmZlcmVudCB0eXBlfTAsMXwlZGlmZntyZXR1cm5pbmcgJCBmcm9tIGEgZnVuY3Rpb24gd2l0aCByZXN1bHQgdHlwZSAkfHJldHVybmluZyBmcm9tIGZ1bmN0aW9uIHdpdGggZGlmZmVyZW50IHJldHVybiB0eXBlfTAsMXwlZGlmZntjb252ZXJ0aW5nICQgdG8gdHlwZSAkfGNvbnZlcnRpbmcgYmV0d2VlbiB0eXBlc30wLDF8JWRpZmZ7aW5pdGlhbGl6aW5nICQgd2l0aCBhbiBleHByZXNzaW9uIG9mIHR5cGUgJHxpbml0aWFsaXppbmcgd2l0aCBleHByZXNzaW9uIG9mIGRpZmZlcmVudCB0eXBlfTAsMXwlZGlmZntzZW5kaW5nICQgdG8gcGFyYW1ldGVyIG9mIHR5cGUgJHxzZW5kaW5nIHRvIHBhcmFtZXRlciBvZiBkaWZmZXJlbnQgdHlwZX0wLDF8JWRpZmZ7Y2FzdGluZyAkIHRvIHR5cGUgJHxjYXN0aW5nIGJldHdlZW4gdHlwZXN9MCwxfTIgY2hhbmdlcyBhZGRyZXNzIHNwYWNlIG9mIHBvaW50ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfaW5jb21wYXRpYmxlX293bmVyc2hpcCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0eyVkaWZme2Fzc2lnbmluZyAkIHRvICR8YXNzaWduaW5nIHRvIGRpZmZlcmVudCB0eXBlc30xLDB8JWRpZmZ7cGFzc2luZyAkIHRvIHBhcmFtZXRlciBvZiB0eXBlICR8cGFzc2luZyB0byBwYXJhbWV0ZXIgb2YgZGlmZmVyZW50IHR5cGV9MCwxfCVkaWZme3JldHVybmluZyAkIGZyb20gYSBmdW5jdGlvbiB3aXRoIHJlc3VsdCB0eXBlICR8cmV0dXJuaW5nIGZyb20gZnVuY3Rpb24gd2l0aCBkaWZmZXJlbnQgcmV0dXJuIHR5cGV9MCwxfCVkaWZme2NvbnZlcnRpbmcgJCB0byB0eXBlICR8Y29udmVydGluZyBiZXR3ZWVuIHR5cGVzfTAsMXwlZGlmZntpbml0aWFsaXppbmcgJCB3aXRoIGFuIGV4cHJlc3Npb24gb2YgdHlwZSAkfGluaXRpYWxpemluZyB3aXRoIGV4cHJlc3Npb24gb2YgZGlmZmVyZW50IHR5cGV9MCwxfCVkaWZme3NlbmRpbmcgJCB0byBwYXJhbWV0ZXIgb2YgdHlwZSAkfHNlbmRpbmcgdG8gcGFyYW1ldGVyIG9mIGRpZmZlcmVudCB0eXBlfTAsMXwlZGlmZntjYXN0aW5nICQgdG8gdHlwZSAkfGNhc3RpbmcgYmV0d2VlbiB0eXBlc30wLDF9MiBjaGFuZ2VzIHJldGFpbi9yZWxlYXNlIHByb3BlcnRpZXMgb2YgcG9pbnRlciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19pbmNvbXBsZXRlX2FycmF5X25lZWRzX2luaXRpYWxpemVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZmluaXRpb24gb2YgdmFyaWFibGUgd2l0aCBhcnJheSB0eXBlIG5lZWRzIGFuIGV4cGxpY2l0IHNpemUgb3IgYW4gaW5pdGlhbGl6ZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfaW5jb21wbGV0ZV90YWcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5jb21wbGV0ZSBkZWZpbml0aW9uIG9mIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfaW5jb21wbGV0ZV90eXBlX25vdF9tb2RpZmlhYmxlX2x2YWx1ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbmNvbXBsZXRlIHR5cGUgJTAgaXMgbm90IGFzc2lnbmFibGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfaW5kaXJlY3Rpb25fcmVxdWlyZXNfcG9pbnRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbmRpcmVjdGlvbiByZXF1aXJlcyBwb2ludGVyIG9wZXJhbmQgKCUwIGludmFsaWQpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX2ludmFsaWRfbHZhbHVlX2FkZHJvZiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgdGFrZSB0aGUgYWRkcmVzcyBvZiBhbiBydmFsdWUgb2YgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19pbnZhbGlkX2x2YWx1ZV9hZGRyb2ZfYWRkcm9mX2Z1bmN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImV4dHJhICcmJyB0YWtpbmcgYWRkcmVzcyBvZiBvdmVybG9hZGVkIGZ1bmN0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX2ludmFsaWRfb3BlcmFuZHMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW52YWxpZCBvcGVyYW5kcyB0byBiaW5hcnkgZXhwcmVzc2lvbiAoJTAgYW5kICUxKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19pbnZhbGlkX3Jlc3RyaWN0X2ludmFsaWRfcG9pbnRlZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJwb2ludGVyIHRvIGZ1bmN0aW9uIHR5cGUgJTAgbWF5IG5vdCBiZSAncmVzdHJpY3QnIHF1YWxpZmllZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19pbnZhbGlkX3Jlc3RyaWN0X25vdF9wb2ludGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlc3RyaWN0IHJlcXVpcmVzIGEgcG9pbnRlciBvciByZWZlcmVuY2UgKCUwIGlzIGludmFsaWQpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX2ludmFsaWRfcmVzdHJpY3Rfbm90X3BvaW50ZXJfbm9hcmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicmVzdHJpY3QgcmVxdWlyZXMgYSBwb2ludGVyIG9yIHJlZmVyZW5jZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19pdmFyX3ZhcmlhYmxlX3NpemUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW5zdGFuY2UgdmFyaWFibGVzIG11c3QgaGF2ZSBhIGNvbnN0YW50IHNpemUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfbG9naWNhbF92ZWN0b3JfZXhwcl9nbnVfY3BwX3Jlc3RyaWN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImxvZ2ljYWwgZXhwcmVzc2lvbiB3aXRoIHZlY3RvciAlc2VsZWN0e3R5cGUgJTEgYW5kIG5vbi12ZWN0b3IgdHlwZSAlMnx0eXBlcyAlMSBhbmQgJTJ9MCBpcyBvbmx5IHN1cHBvcnRlZCBpbiBDKysiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfbHZhbHVlX2Nhc3RzX25vdF9zdXBwb3J0ZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXNzaWdubWVudCB0byBjYXN0IGlzIGlsbGVnYWwsIGx2YWx1ZSBjYXN0cyBhcmUgbm90IHN1cHBvcnRlZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19tZW1iZXJfcmVmZXJlbmNlX2Fycm93LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1lbWJlciByZWZlcmVuY2UgdHlwZSAlMCBpcyBub3QgYSBwb2ludGVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX21lbWJlcl9yZWZlcmVuY2VfaXZhciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBkb2VzIG5vdCBoYXZlIGEgbWVtYmVyIG5hbWVkICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX21lbWJlcl9yZWZlcmVuY2VfaXZhcl9zdWdnZXN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGRvZXMgbm90IGhhdmUgYSBtZW1iZXIgbmFtZWQgJTE7IGRpZCB5b3UgbWVhbiAlMj8iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfbWVtYmVyX3JlZmVyZW5jZV9zdHJ1Y3RfdW5pb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWVtYmVyIHJlZmVyZW5jZSBiYXNlIHR5cGUgJTAgaXMgbm90IGEgc3RydWN0dXJlIG9yIHVuaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX21lbWJlcl9yZWZlcmVuY2Vfc3VnZ2VzdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtZW1iZXIgcmVmZXJlbmNlIHR5cGUgJTAgaXMgJXNlbGVjdHthfG5vdCBhfTEgcG9pbnRlcjsgZGlkIHlvdSBtZWFuIHRvIHVzZSAnJXNlbGVjdHstPnwufTEnPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19tZW1iZXJfcmVmZXJlbmNlX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHJlZmVyIHRvIHR5cGUgbWVtYmVyICUwIGluICUxIHdpdGggJyVzZWxlY3R7LnwtPn0yJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19tZW1iZXJfcmVmZXJlbmNlX3Vua25vd24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IHJlZmVyIHRvIG1lbWJlciAlMCBpbiAlMSB3aXRoICclc2VsZWN0ey58LT59MiciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfbWlzc2luZ19yZXR1cm5fdHlwZV9pbmNvbXBhdGlibGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJWRpZmZ7cmV0dXJuIHR5cGUgJCBtdXN0IG1hdGNoIHByZXZpb3VzIHJldHVybiB0eXBlICR8cmV0dXJuIHR5cGUgbXVzdCBtYXRjaCBwcmV2aW91cyByZXR1cm4gdHlwZX0wLDEgd2hlbiAlc2VsZWN0e2Jsb2NrIGxpdGVyYWx8bGFtYmRhIGV4cHJlc3Npb259MiBoYXMgdW5zcGVjaWZpZWQgZXhwbGljaXQgcmV0dXJuIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfbmVnYXRpdmVfYXJyYXlfc2l6ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJhcnJheSBzaXplIGlzIG5lZ2F0aXZlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX25vbl9vYmplY3Rfbm90X21vZGlmaWFibGVfbHZhbHVlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vbi1vYmplY3QgdHlwZSAlMCBpcyBub3QgYXNzaWduYWJsZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19ub252aWFibGVfY29uZGl0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIHZpYWJsZSBjb252ZXJzaW9uJXNlbGVjdHslZGlmZnsgZnJvbSAkIHRvICR8fTEsMnwlZGlmZnsgZnJvbSByZXR1cm5lZCB2YWx1ZSBvZiB0eXBlICQgdG8gZnVuY3Rpb24gcmV0dXJuIHR5cGUgJHx9MSwyfTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfbm9udmlhYmxlX2NvbmRpdGlvbl9pbmNvbXBsZXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIHZpYWJsZSBjb252ZXJzaW9uJWRpZmZ7IGZyb20gJCB0byBpbmNvbXBsZXRlIHR5cGUgJHx9MCwxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX29wX29uX25vbm92ZXJsYXBwaW5nX2FkZHJlc3Nfc3BhY2VfcG9pbnRlcnMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtjb21wYXJpc29uIGJldHdlZW4gJWRpZmZ7ICgkIGFuZCAkKXx9MCwxfGFyaXRobWV0aWMgb3BlcmF0aW9uIHdpdGggb3BlcmFuZHMgb2YgdHlwZSAlZGlmZnsgKCQgYW5kICQpfH0wLDF8Y29uZGl0aW9uYWwgb3BlcmF0b3Igd2l0aCB0aGUgc2Vjb25kIGFuZCB0aGlyZCBvcGVyYW5kcyBvZiB0eXBlICVkaWZmeyAoJCBhbmQgJCl8fTAsMX0yIHdoaWNoIGFyZSBwb2ludGVycyB0byBub24tb3ZlcmxhcHBpbmcgYWRkcmVzcyBzcGFjZXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfb3JkZXJlZF9jb21wYXJpc29uX29mX3BvaW50ZXJfYW5kX3plcm8sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAib3JkZXJlZCBjb21wYXJpc29uIGJldHdlZW4gcG9pbnRlciBhbmQgemVybyAoJTAgYW5kICUxKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19wb2ludGVyX2FyaXRoX2Z1bmN0aW9uX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJpdGhtZXRpYyBvbiVzZWxlY3R7IGF8fTAgcG9pbnRlciVzZWxlY3R7fHN9MCB0byVzZWxlY3R7IHRoZXx9MiBmdW5jdGlvbiB0eXBlJXNlbGVjdHt8c30yICUxJXNlbGVjdHt8IGFuZCAlM30yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX3BvaW50ZXJfYXJpdGhfdm9pZF90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFyaXRobWV0aWMgb24lc2VsZWN0eyBhfH0wIHBvaW50ZXIlc2VsZWN0e3xzfTAgdG8gdm9pZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19zY2xhc3NfZnNjb3BlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImlsbGVnYWwgc3RvcmFnZSBjbGFzcyBvbiBmaWxlLXNjb3BlZCB2YXJpYWJsZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19zY2xhc3NfZnVuYywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbGxlZ2FsIHN0b3JhZ2UgY2xhc3Mgb24gZnVuY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfc3RhdGVtZW50X3JlcXVpcmVzX2ludGVnZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAic3RhdGVtZW50IHJlcXVpcmVzIGV4cHJlc3Npb24gb2YgaW50ZWdlciB0eXBlICglMCBpbnZhbGlkKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19zdGF0ZW1lbnRfcmVxdWlyZXNfc2NhbGFyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInN0YXRlbWVudCByZXF1aXJlcyBleHByZXNzaW9uIG9mIHNjYWxhciB0eXBlICglMCBpbnZhbGlkKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19zdWJfcHRyX2NvbXBhdGlibGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJWRpZmZ7JCBhbmQgJCBhcmUgbm90IHBvaW50ZXJzIHRvIGNvbXBhdGlibGUgdHlwZXN8cG9pbnRlcnMgdG8gaW5jb21wYXRpYmxlIHR5cGVzfTAsMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja19zdWJzY3JpcHRfbm90X2ludGVnZXIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJyYXkgc3Vic2NyaXB0IGlzIG5vdCBhbiBpbnRlZ2VyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX3N1YnNjcmlwdF92YWx1ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJzdWJzY3JpcHRlZCB2YWx1ZSBpcyBub3QgYW4gYXJyYXksIHBvaW50ZXIsIG9yIHZlY3RvciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVjaGVja191bmFyeV9leHByLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgYXJndW1lbnQgdHlwZSAlMCB0byB1bmFyeSBleHByZXNzaW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX3ZlY3Rvcl9sZW5ndGhzX25vdF9lcXVhbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2ZWN0b3Igb3BlcmFuZHMgZG8gbm90IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzICglMCBhbmQgJTEpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX3ZlY3Rvcl9ub3RfY29udmVydGFibGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGNvbnZlcnQgYmV0d2VlbiB2ZWN0b3IgdmFsdWVzIG9mIGRpZmZlcmVudCBzaXplICglMCBhbmQgJTEpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX3ZlY3Rvcl9ub3RfY29udmVydGFibGVfaW1wbGljdF90cnVuY2F0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBjb252ZXJ0IGJldHdlZW4gJXNlbGVjdHtzY2FsYXJ8dmVjdG9yfTAgdHlwZSAlMSBhbmQgdmVjdG9yIHR5cGUgJTIgYXMgaW1wbGljaXQgY29udmVyc2lvbiB3b3VsZCBjYXVzZSB0cnVuY2F0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWNoZWNrX3ZlY3Rvcl9ub3RfY29udmVydGFibGVfbm9uX3NjYWxhciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgY29udmVydCBiZXR3ZWVuIHZlY3RvciBhbmQgbm9uLXNjYWxhciB2YWx1ZXMgKCUwIGFuZCAlMSkiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlY2hlY2tfemVyb19hcnJheV9zaXplLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInplcm8tbGVuZ3RoIGFycmF5cyBhcmUgbm90IHBlcm1pdHRlZCBpbiBDKysiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlZGVmX2NoYW5nZXNfbGlua2FnZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bnN1cHBvcnRlZDogdHlwZWRlZiBjaGFuZ2VzIGxpbmthZ2Ugb2YgYW5vbnltb3VzIHR5cGUsIGJ1dCBsaW5rYWdlIHdhcyBhbHJlYWR5IGNvbXB1dGVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWRlZl9ub3RfYml0ZmllbGQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZWRlZiBtZW1iZXIgJTAgY2Fubm90IGJlIGEgYml0LWZpZWxkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZWRlZl9ub3RfaWRlbnRpZmllciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlZGVmIG5hbWUgbXVzdCBiZSBhbiBpZGVudGlmaWVyIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdHlwZW5hbWVfbWlzc2luZywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJtaXNzaW5nICd0eXBlbmFtZScgcHJpb3IgdG8gZGVwZW5kZW50IHR5cGUgbmFtZSAnJTAlMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlbmFtZV9taXNzaW5nX3RlbXBsYXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1pc3NpbmcgJ3R5cGVuYW1lJyBwcmlvciB0byBkZXBlbmRlbnQgdHlwZSB0ZW1wbGF0ZSBuYW1lICclMCUxJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVuYW1lX25lc3RlZF9ub3RfZm91bmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gdHlwZSBuYW1lZCAlMCBpbiAlMSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3R5cGVuYW1lX25lc3RlZF9ub3RfZm91bmRfZW5hYmxlX2lmLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIHR5cGUgbmFtZWQgJ3R5cGUnIGluICUwOyAnZW5hYmxlX2lmJyBjYW5ub3QgYmUgdXNlZCB0byBkaXNhYmxlIHRoaXMgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlbmFtZV9uZXN0ZWRfbm90X2ZvdW5kX3JlcXVpcmVtZW50LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZhaWxlZCByZXF1aXJlbWVudCAnJTAnOyAnZW5hYmxlX2lmJyBjYW5ub3QgYmUgdXNlZCB0byBkaXNhYmxlIHRoaXMgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlbmFtZV9uZXN0ZWRfbm90X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZW5hbWUgc3BlY2lmaWVyIHJlZmVycyB0byBub24tdHlwZSBtZW1iZXIgJTAgaW4gJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl90eXBlbmFtZV9yZWZlcnNfdG9fdXNpbmdfdmFsdWVfZGVjbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ0eXBlbmFtZSBzcGVjaWZpZXIgcmVmZXJzIHRvIGEgZGVwZW5kZW50IHVzaW5nIGRlY2xhcmF0aW9uIGZvciBhIHZhbHVlICUwIGluICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdW5hdmFpbGFibGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgaXMgdW5hdmFpbGFibGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91bmF2YWlsYWJsZV9pbl9hcmMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgaXMgdW5hdmFpbGFibGUgaW4gQVJDIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxMCkKK0RJQUcoZXJyX3VuYXZhaWxhYmxlX21lc3NhZ2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgaXMgdW5hdmFpbGFibGU6ICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdW5jYXN0ZWRfY2FsbF9vZl91bmtub3duX2FueSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlMCBoYXMgdW5rbm93biByZXR1cm4gdHlwZTsgY2FzdCB0aGUgY2FsbCB0byBpdHMgZGVjbGFyZWQgcmV0dXJuIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91bmNhc3RlZF9zZW5kX3RvX3Vua25vd25fYW55X21ldGhvZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyBrbm93biBtZXRob2QgJXNlbGVjdHslb2JqY2luc3RhbmNlMXwlb2JqY2NsYXNzMX0wOyBjYXN0IHRoZSBtZXNzYWdlIHNlbmQgdG8gdGhlIG1ldGhvZCdzIHJldHVybiB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdW5jYXN0ZWRfdXNlX29mX3Vua25vd25fYW55LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGhhcyB1bmtub3duIHR5cGU7IGNhc3QgaXQgdG8gaXRzIGRlY2xhcmVkIHR5cGUgdG8gdXNlIGl0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdW5kZWNsYXJlZF9ib3hpbmdfbWV0aG9kLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlY2xhcmF0aW9uIG9mICUwIGlzIG1pc3NpbmcgaW4gJTEgY2xhc3MiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91bmRlY2xhcmVkX2xhYmVsX3VzZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1c2Ugb2YgdW5kZWNsYXJlZCBsYWJlbCAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3VuZGVjbGFyZWRfb2JqY19saXRlcmFsX2NsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZmluaXRpb24gb2YgY2xhc3MgJTAgbXVzdCBiZSBhdmFpbGFibGUgdG8gdXNlIE9iamVjdGl2ZS1DICVzZWxlY3R7YXJyYXkgbGl0ZXJhbHN8ZGljdGlvbmFyeSBsaXRlcmFsc3xudW1lcmljIGxpdGVyYWxzfGJveGVkIGV4cHJlc3Npb25zfHN0cmluZyBsaXRlcmFsc30xIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdW5kZWNsYXJlZF9wcm90b2NvbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZmluZCBwcm90b2NvbCBkZWNsYXJhdGlvbiBmb3IgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91bmRlY2xhcmVkX3Byb3RvY29sX3N1Z2dlc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGZpbmQgcHJvdG9jb2wgZGVjbGFyYXRpb24gZm9yICUwOyBkaWQgeW91IG1lYW4gJTE/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdW5kZWNsYXJlZF91c2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidXNlIG9mIHVuZGVjbGFyZWQgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91bmRlY2xhcmVkX3VzZV9zdWdnZXN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVzZSBvZiB1bmRlY2xhcmVkICUwOyBkaWQgeW91IG1lYW4gJTE/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdW5kZWNsYXJlZF92YXJfdXNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVzZSBvZiB1bmRlY2xhcmVkIGlkZW50aWZpZXIgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91bmRlY2xhcmVkX3Zhcl91c2Vfc3VnZ2VzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICUwOyBkaWQgeW91IG1lYW4gJTE/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdW5kZWZfaW50ZXJmYWNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBmaW5kIGludGVyZmFjZSBkZWNsYXJhdGlvbiBmb3IgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91bmRlZl9pbnRlcmZhY2Vfc3VnZ2VzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZmluZCBpbnRlcmZhY2UgZGVjbGFyYXRpb24gZm9yICUwOyBkaWQgeW91IG1lYW4gJTE/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdW5kZWZfc3VwZXJjbGFzcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgZmluZCBpbnRlcmZhY2UgZGVjbGFyYXRpb24gZm9yICUwLCBzdXBlcmNsYXNzIG9mICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdW5kZWZfc3VwZXJjbGFzc19zdWdnZXN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBmaW5kIGludGVyZmFjZSBkZWNsYXJhdGlvbiBmb3IgJTAsIHN1cGVyY2xhc3Mgb2YgJTE7IGRpZCB5b3UgbWVhbiAlMj8iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91bmRlZmluZWRfaW5saW5lX3ZhciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbmxpbmUgdmFyaWFibGUgJXEwIGlzIG5vdCBkZWZpbmVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdW5kZWZpbmVkX2ludGVybmFsX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtmdW5jdGlvbnx2YXJpYWJsZX0wICVxMSBpcyB1c2VkIGJ1dCBub3QgZGVmaW5lZCBpbiB0aGlzIHRyYW5zbGF0aW9uIHVuaXQsIGFuZCBjYW5ub3QgYmUgZGVmaW5lZCBpbiBhbnkgb3RoZXIgdHJhbnNsYXRpb24gdW5pdCBiZWNhdXNlIGl0cyB0eXBlIGRvZXMgbm90IGhhdmUgbGlua2FnZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3VuZGVybHlpbmdfdHlwZV9vZl9pbmNvbXBsZXRlX2VudW0sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGRldGVybWluZSB1bmRlcmx5aW5nIHR5cGUgb2YgaW5jb21wbGV0ZSBlbnVtZXJhdGlvbiB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdW5leHBhbmRlZF9wYXJhbWV0ZXJfcGFjaywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2V4cHJlc3Npb258YmFzZSB0eXBlfGRlY2xhcmF0aW9uIHR5cGV8ZGF0YSBtZW1iZXIgdHlwZXxiaXQtZmllbGQgc2l6ZXxzdGF0aWMgYXNzZXJ0aW9ufGZpeGVkIHVuZGVybHlpbmcgdHlwZXxlbnVtZXJhdG9yIHZhbHVlfHVzaW5nIGRlY2xhcmF0aW9ufGZyaWVuZCBkZWNsYXJhdGlvbnxxdWFsaWZpZXJ8aW5pdGlhbGl6ZXJ8ZGVmYXVsdCBhcmd1bWVudHxub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdHlwZXxleGNlcHRpb24gdHlwZXxwYXJ0aWFsIHNwZWNpYWxpemF0aW9ufF9faWZfZXhpc3RzIG5hbWV8X19pZl9ub3RfZXhpc3RzIG5hbWV8bGFtYmRhfGJsb2NrfTAgY29udGFpbnMlcGx1cmFsezA6IGFufDp9MSB1bmV4cGFuZGVkIHBhcmFtZXRlciBwYWNrJXBsdXJhbHswOnwxOiAlMnwyOnMgJTIgYW5kICUzfDpzICUyLCAlMywgLi4ufTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91bmV4cGVjdGVkX2ZyaWVuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmcmllbmRzIGNhbiBvbmx5IGJlIGNsYXNzZXMgb3IgZnVuY3Rpb25zIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdW5leHBlY3RlZF9pbnRlcmZhY2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5leHBlY3RlZCBpbnRlcmZhY2UgbmFtZSAlMDogZXhwZWN0ZWQgZXhwcmVzc2lvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3VuZXhwZWN0ZWRfbmFtZXNwYWNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuZXhwZWN0ZWQgbmFtZXNwYWNlIG5hbWUgJTA6IGV4cGVjdGVkIGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91bmV4cGVjdGVkX3R5cGVkZWYsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5leHBlY3RlZCB0eXBlIG5hbWUgJTA6IGV4cGVjdGVkIGV4cHJlc3Npb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91bmluaXRpYWxpemVkX21lbWJlcl9mb3JfYXNzaWduLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBkZWZpbmUgdGhlIGltcGxpY2l0IGNvcHkgYXNzaWdubWVudCBvcGVyYXRvciBmb3IgJTAsIGJlY2F1c2Ugbm9uLXN0YXRpYyAlc2VsZWN0e3JlZmVyZW5jZXxjb25zdH0xIG1lbWJlciAlMiBjYW5ub3QgdXNlIGNvcHkgYXNzaWdubWVudCBvcGVyYXRvciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3VuaW5pdGlhbGl6ZWRfbWVtYmVyX2luX2N0b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtjb25zdHJ1Y3RvciBmb3IgJTF8aW1wbGljaXQgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgJTF8Y2Fubm90IHVzZSBjb25zdHJ1Y3RvciBpbmhlcml0ZWQgZnJvbSAlMTp9MCBtdXN0IGV4cGxpY2l0bHkgaW5pdGlhbGl6ZSB0aGUgJXNlbGVjdHtyZWZlcmVuY2V8Y29uc3R9MiBtZW1iZXIgJTMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91bmlvbl9hc19iYXNlX2NsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuaW9ucyBjYW5ub3QgYmUgYmFzZSBjbGFzc2VzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdW5pb25fbWVtYmVyX29mX3JlZmVyZW5jZV90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuaW9uIG1lbWJlciAlMCBoYXMgcmVmZXJlbmNlIHR5cGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91bmtub3duX2FueV9hZGRyb2YsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGhlIGFkZHJlc3Mgb2YgYSBkZWNsYXJhdGlvbiB3aXRoIHVua25vd24gdHlwZSBjYW4gb25seSBiZSBjYXN0IHRvIGEgcG9pbnRlciB0eXBlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdW5rbm93bl9hbnlfYWRkcm9mX2NhbGwsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYWRkcmVzcy1vZiBvcGVyYXRvciBjYW5ub3QgYmUgYXBwbGllZCB0byBhIGNhbGwgdG8gYSBmdW5jdGlvbiB3aXRoIHVua25vd24gcmV0dXJuIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91bmtub3duX2FueV9mdW5jdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJmdW5jdGlvbiAlMCB3aXRoIHVua25vd24gdHlwZSBtdXN0IGJlIGdpdmVuIGEgZnVuY3Rpb24gdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3Vua25vd25fYW55X3Zhcl9mdW5jdGlvbl90eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInZhcmlhYmxlICUwIHdpdGggdW5rbm93biB0eXBlIGNhbm5vdCBiZSBnaXZlbiBhIGZ1bmN0aW9uIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91bmtub3duX25lc3RlZF90eXBlbmFtZV9zdWdnZXN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vIHR5cGUgbmFtZWQgJTAgaW4gJTE7IGRpZCB5b3UgbWVhbiAlc2VsZWN0e3xzaW1wbHkgfTIlMz8iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91bmtub3duX3JlY2VpdmVyX3N1Z2dlc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5rbm93biByZWNlaXZlciAlMDsgZGlkIHlvdSBtZWFuICUxPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3Vua25vd25fdHlwZV9vcl9jbGFzc19uYW1lX3N1Z2dlc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5rbm93biAlc2VsZWN0e3R5cGV8Y2xhc3N9MSBuYW1lICUwOyBkaWQgeW91IG1lYW4gJTI/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdW5rbm93bl90eXBlbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmtub3duIHR5cGUgbmFtZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3Vua25vd25fdHlwZW5hbWVfc3VnZ2VzdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1bmtub3duIHR5cGUgbmFtZSAlMDsgZGlkIHlvdSBtZWFuICUxPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3VucXVhbGlmaWVkX3BvaW50ZXJfbWVtYmVyX2Z1bmN0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm11c3QgZXhwbGljaXRseSBxdWFsaWZ5IG5hbWUgb2YgbWVtYmVyIGZ1bmN0aW9uIHdoZW4gdGFraW5nIGl0cyBhZGRyZXNzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdW5zdXBwb3J0ZWRfdW5rbm93bl9hbnlfY2FsbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYWxsIHRvIHVuc3VwcG9ydGVkIGV4cHJlc3Npb24gd2l0aCB1bmtub3duIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91bnN1cHBvcnRlZF91bmtub3duX2FueV9kZWNsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGhhcyB1bmtub3duIHR5cGUsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMga2luZCBvZiBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3Vuc3VwcG9ydGVkX3Vua25vd25fYW55X2V4cHIsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5zdXBwb3J0ZWQgZXhwcmVzc2lvbiB3aXRoIHVua25vd24gdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3VwY2FzdF90b19pbmFjY2Vzc2libGVfYmFzZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgY2FzdCAlMCB0byBpdHMgJXNlbGVjdHtwcml2YXRlfHByb3RlY3RlZH0yIGJhc2UgY2xhc3MgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91c2VfY29udGludWF0aW9uX2NsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImlsbGVnYWwgcmVkZWNsYXJhdGlvbiBvZiBwcm9wZXJ0eSBpbiBjbGFzcyBleHRlbnNpb24gJTAgKGF0dHJpYnV0ZSBtdXN0IGJlICdyZWFkd3JpdGUnLCB3aGlsZSBpdHMgcHJpbWFyeSBtdXN0IGJlICdyZWFkb25seScpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdXNlX2NvbnRpbnVhdGlvbl9jbGFzc19yZWRlY2xhcmF0aW9uX3JlYWR3cml0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJpbGxlZ2FsIHJlZGVjbGFyYXRpb24gb2YgJ3JlYWR3cml0ZScgcHJvcGVydHkgaW4gY2xhc3MgZXh0ZW5zaW9uICUwIChwZXJoYXBzIHlvdSBpbnRlbmRlZCB0aGlzIHRvIGJlIGEgJ3JlYWR3cml0ZScgcmVkZWNsYXJhdGlvbiBvZiBhICdyZWFkb25seScgcHVibGljIHByb3BlcnR5PykiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91c2Vfb2ZfZGVmYXVsdF9hcmd1bWVudF90b19mdW5jdGlvbl9kZWNsYXJlZF9sYXRlciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1c2Ugb2YgZGVmYXVsdCBhcmd1bWVudCB0byBmdW5jdGlvbiAlMCB0aGF0IGlzIGRlY2xhcmVkIGxhdGVyIGluIGNsYXNzICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdXNlX29mX3RhZ19uYW1lX3dpdGhvdXRfdGFnLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm11c3QgdXNlICclMScgdGFnIHRvIHJlZmVyIHRvIHR5cGUgJTAlc2VsZWN0e3wgaW4gdGhpcyBzY29wZX0yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdXNlX3dpdGhfd3JvbmdfdGFnLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVzZSBvZiAlMCB3aXRoIHRhZyB0eXBlIHRoYXQgZG9lcyBub3QgbWF0Y2ggcHJldmlvdXMgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91c2luZ19kZWNsX2Nhbl9ub3RfcmVmZXJfdG9fY2xhc3NfbWVtYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVzaW5nIGRlY2xhcmF0aW9uIGNhbm5vdCByZWZlciB0byBjbGFzcyBtZW1iZXIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91c2luZ19kZWNsX2Nhbl9ub3RfcmVmZXJfdG9fbmFtZXNwYWNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVzaW5nIGRlY2xhcmF0aW9uIGNhbm5vdCByZWZlciB0byBhIG5hbWVzcGFjZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3VzaW5nX2RlY2xfY2FuX25vdF9yZWZlcl90b19zY29wZWRfZW51bSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1c2luZyBkZWNsYXJhdGlvbiBjYW5ub3QgcmVmZXIgdG8gYSBzY29wZWQgZW51bWVyYXRvciIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3VzaW5nX2RlY2xfY29uZmxpY3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidGFyZ2V0IG9mIHVzaW5nIGRlY2xhcmF0aW9uIGNvbmZsaWN0cyB3aXRoIGRlY2xhcmF0aW9uIGFscmVhZHkgaW4gc2NvcGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91c2luZ19kZWNsX2NvbmZsaWN0X3JldmVyc2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZGVjbGFyYXRpb24gY29uZmxpY3RzIHdpdGggdGFyZ2V0IG9mIHVzaW5nIGRlY2xhcmF0aW9uIGFscmVhZHkgaW4gc2NvcGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91c2luZ19kZWNsX2NvbnN0cnVjdG9yLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVzaW5nIGRlY2xhcmF0aW9uIGNhbm5vdCByZWZlciB0byBhIGNvbnN0cnVjdG9yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdXNpbmdfZGVjbF9jb25zdHJ1Y3Rvcl9ub3RfaW5fZGlyZWN0X2Jhc2UsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJTAgaXMgbm90IGEgZGlyZWN0IGJhc2Ugb2YgJTEsIGNhbm5vdCBpbmhlcml0IGNvbnN0cnVjdG9ycyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3VzaW5nX2RlY2xfZGVzdHJ1Y3RvciwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1c2luZyBkZWNsYXJhdGlvbiBjYW5ub3QgcmVmZXIgdG8gYSBkZXN0cnVjdG9yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdXNpbmdfZGVjbF9mcmllbmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY2Fubm90IGJlZnJpZW5kIHRhcmdldCBvZiB1c2luZyBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3VzaW5nX2RlY2xfbmVzdGVkX25hbWVfc3BlY2lmaWVyX2lzX2N1cnJlbnRfY2xhc3MsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidXNpbmcgZGVjbGFyYXRpb24gcmVmZXJzIHRvIGl0cyBvd24gY2xhc3MiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91c2luZ19kZWNsX25lc3RlZF9uYW1lX3NwZWNpZmllcl9pc19ub3RfYmFzZV9jbGFzcywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1c2luZyBkZWNsYXJhdGlvbiByZWZlcnMgaW50byAnJTAnLCB3aGljaCBpcyBub3QgYSBiYXNlIGNsYXNzIG9mICUxIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdXNpbmdfZGVjbF9uZXN0ZWRfbmFtZV9zcGVjaWZpZXJfaXNfbm90X2NsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVzaW5nIGRlY2xhcmF0aW9uIGluIGNsYXNzIHJlZmVycyBpbnRvICclMCcsIHdoaWNoIGlzIG5vdCBhIGNsYXNzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdXNpbmdfZGVjbF9yZWRlY2xhcmF0aW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZGVjbGFyYXRpb24gb2YgdXNpbmcgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91c2luZ19kZWNsX3JlZGVjbGFyYXRpb25fZXhwYW5zaW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVzaW5nIGRlY2xhcmF0aW9uIHBhY2sgZXhwYW5zaW9uIGF0IGJsb2NrIHNjb3BlIHByb2R1Y2VzIG11bHRpcGxlIHZhbHVlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3VzaW5nX2RlY2xfdGVtcGxhdGVfaWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidXNpbmcgZGVjbGFyYXRpb24gY2Fubm90IHJlZmVyIHRvIGEgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91c2luZ19kZXBlbmRlbnRfdmFsdWVfaXNfdHlwZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJkZXBlbmRlbnQgdXNpbmcgZGVjbGFyYXRpb24gcmVzb2x2ZWQgdG8gdHlwZSB3aXRob3V0ICd0eXBlbmFtZSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91c2luZ19kaXJlY3RpdmVfbWVtYmVyX3N1Z2dlc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gbmFtZXNwYWNlIG5hbWVkICUwIGluICUxOyBkaWQgeW91IG1lYW4gJXNlbGVjdHt8c2ltcGx5IH0yJTM/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdXNpbmdfZGlyZWN0aXZlX3N1Z2dlc3QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gbmFtZXNwYWNlIG5hbWVkICUwOyBkaWQgeW91IG1lYW4gJTE/IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdXNpbmdfcGFja19leHBhbnNpb25fZW1wdHksIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHt8bWVtYmVyfTAgdXNpbmcgZGVjbGFyYXRpb24gJTEgaW5zdGFudGlhdGVzIHRvIGFuIGVtcHR5IHBhY2siLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl91c2luZ19yZXF1aXJlc19xdWFsbmFtZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1c2luZyBkZWNsYXJhdGlvbiByZXF1aXJlcyBhIHF1YWxpZmllZCBuYW1lIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdXNpbmdfdHlwZW5hbWVfbm9uX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ3R5cGVuYW1lJyBrZXl3b3JkIHVzZWQgb24gYSBub24tdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3V1aWRvZl93aXRoX211bHRpcGxlX2d1aWRzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBjYWxsIG9wZXJhdG9yIF9fdXVpZG9mIG9uIGEgdHlwZSB3aXRoIG11bHRpcGxlIEdVSURzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdXVpZG9mX3dpdGhvdXRfZ3VpZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgY2FsbCBvcGVyYXRvciBfX3V1aWRvZiBvbiBhIHR5cGUgd2l0aCBubyBHVUlEIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdmFfYXJnX2luX2RldmljZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJDVURBIGRldmljZSBjb2RlIGRvZXMgbm90IHN1cHBvcnQgdmFfYXJnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdmFfc3RhcnRfY2FwdHVyZWRfc3RtdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIndmFfc3RhcnQnIGNhbm5vdCBiZSB1c2VkIGluIGEgY2FwdHVyZWQgc3RhdGVtZW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdmFfc3RhcnRfZml4ZWRfZnVuY3Rpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ3ZhX3N0YXJ0JyB1c2VkIGluIGZ1bmN0aW9uIHdpdGggZml4ZWQgYXJncyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3ZhX3N0YXJ0X291dHNpZGVfZnVuY3Rpb24sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ3ZhX3N0YXJ0JyBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIGEgZnVuY3Rpb24iLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl92YV9zdGFydF91c2VkX2luX3dyb25nX2FiaV9mdW5jdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIndmFfc3RhcnQnIHVzZWQgaW4gJXNlbGVjdHtTeXN0ZW0gVnxXaW42NH0wIEFCSSBmdW5jdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3ZhbHVlX2luaXRfZm9yX2FycmF5X3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJyYXkgdHlwZXMgY2Fubm90IGJlIHZhbHVlLWluaXRpYWxpemVkIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdmFyX2NvbmNlcHRfbm90X2luaXRpYWxpemVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInZhcmlhYmxlIGNvbmNlcHQgZGVjbGFyYXRpb24gbXVzdCBiZSBpbml0aWFsaXplZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3Zhcl9wYXJ0aWFsX3NwZWNfcmVkZWNsYXJlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2YXJpYWJsZSB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uICUwIGNhbm5vdCBiZSByZWRlZmluZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl92YXJfc3BlY19ub190ZW1wbGF0ZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJubyB2YXJpYWJsZSB0ZW1wbGF0ZSBtYXRjaGVzJXNlbGVjdHt8IHBhcnRpYWx9MCBzcGVjaWFsaXphdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3Zhcl9zcGVjX25vX3RlbXBsYXRlX2J1dF9tZXRob2QsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm8gdmFyaWFibGUgdGVtcGxhdGUgbWF0Y2hlcyBzcGVjaWFsaXphdGlvbjsgZGlkIHlvdSBtZWFuIHRvIHVzZSAlMCBhcyBmdW5jdGlvbiB0ZW1wbGF0ZSBpbnN0ZWFkPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3ZhcmlhYmxlX2NvbmNlcHRfYm9vbF9kZWNsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlY2xhcmVkIHR5cGUgb2YgdmFyaWFibGUgY29uY2VwdCBtdXN0IGJlICdib29sJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3ZhcmlhYmxlX2luc3RhbnRpYXRlc190b19mdW5jdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e3ZhcmlhYmxlfHN0YXRpYyBkYXRhIG1lbWJlcn0wIGluc3RhbnRpYXRlZCB3aXRoIGZ1bmN0aW9uIHR5cGUgJTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl92YXJpYWJsZV9vYmplY3Rfbm9faW5pdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2YXJpYWJsZS1zaXplZCBvYmplY3QgbWF5IG5vdCBiZSBpbml0aWFsaXplZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3ZhcmlhYmx5X21vZGlmaWVkX25ld190eXBlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiduZXcnIGNhbm5vdCBhbGxvY2F0ZSBvYmplY3Qgb2YgdmFyaWFibHkgbW9kaWZpZWQgdHlwZSAlMCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3ZhcmlhYmx5X21vZGlmaWVkX25vbnR5cGVfdGVtcGxhdGVfcGFyYW0sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVyIG9mIHZhcmlhYmx5IG1vZGlmaWVkIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl92YXJpYWJseV9tb2RpZmllZF90ZW1wbGF0ZV9hcmcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFyaWFibHkgbW9kaWZpZWQgdHlwZSAlMCBjYW5ub3QgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGFyZ3VtZW50IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdmFyaWFibHlfbW9kaWZpZWRfdHlwZWlkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIid0eXBlaWQnIG9mIHZhcmlhYmx5IG1vZGlmaWVkIHR5cGUgJTAiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl92YXJpYWRpY19kZXZpY2VfZm4sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiQ1VEQSBkZXZpY2UgY29kZSBkb2VzIG5vdCBzdXBwb3J0IHZhcmlhZGljIGZ1bmN0aW9ucyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3ZlY19idWlsdGluX2luY29tcGF0aWJsZV92ZWN0b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZmlyc3QgdHdvIGFyZ3VtZW50cyB0byAlMCBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3ZlY19idWlsdGluX25vbl92ZWN0b3IsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZmlyc3QgdHdvIGFyZ3VtZW50cyB0byAlMCBtdXN0IGJlIHZlY3RvcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl92ZWNzdGVwX25vbl9zY2FsYXJfdmVjdG9yX3R5cGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ3ZlY19zdGVwJyByZXF1aXJlcyBidWlsdC1pbiBzY2FsYXIgb3IgdmVjdG9yIHR5cGUsICUwIGludmFsaWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl92ZWN0b3JfaW5jb3JyZWN0X251bV9pbml0aWFsaXplcnMsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHt0b28gbWFueXx0b28gZmV3fTAgZWxlbWVudHMgaW4gdmVjdG9yIGluaXRpYWxpemF0aW9uIChleHBlY3RlZCAlMSBlbGVtZW50cywgaGF2ZSAlMikiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl92aXJ0dWFsX2luX3VuaW9uLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInVuaW9ucyBjYW5ub3QgaGF2ZSB2aXJ0dWFsIGZ1bmN0aW9ucyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3ZpcnR1YWxfbWVtYmVyX2Z1bmN0aW9uX3RlbXBsYXRlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIid2aXJ0dWFsJyBjYW5ub3QgYmUgc3BlY2lmaWVkIG9uIG1lbWJlciBmdW5jdGlvbiB0ZW1wbGF0ZXMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl92aXJ0dWFsX25vbl9mdW5jdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIndmlydHVhbCcgY2FuIG9ubHkgYXBwZWFyIG9uIG5vbi1zdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3ZpcnR1YWxfb3V0X29mX2NsYXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIid2aXJ0dWFsJyBjYW4gb25seSBiZSBzcGVjaWZpZWQgaW5zaWRlIHRoZSBjbGFzcyBkZWZpbml0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdmxhX2RlY2xfaGFzX2V4dGVybl9saW5rYWdlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInZhcmlhYmxlIGxlbmd0aCBhcnJheSBkZWNsYXJhdGlvbiBjYW5ub3QgaGF2ZSAnZXh0ZXJuJyBsaW5rYWdlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdmxhX2RlY2xfaGFzX3N0YXRpY19zdG9yYWdlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInZhcmlhYmxlIGxlbmd0aCBhcnJheSBkZWNsYXJhdGlvbiBjYW5ub3QgaGF2ZSAnc3RhdGljJyBzdG9yYWdlIGR1cmF0aW9uIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdmxhX2RlY2xfaW5fZmlsZV9zY29wZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2YXJpYWJsZSBsZW5ndGggYXJyYXkgZGVjbGFyYXRpb24gbm90IGFsbG93ZWQgYXQgZmlsZSBzY29wZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3ZsYV9pbl9zZmluYWUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFyaWFibGUgbGVuZ3RoIGFycmF5IGNhbm5vdCBiZSBmb3JtZWQgZHVyaW5nIHRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3ZsYV91bnN1cHBvcnRlZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2YXJpYWJsZSBsZW5ndGggYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciB0aGUgY3VycmVudCB0YXJnZXQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl92bV9kZWNsX2hhc19leHRlcm5fbGlua2FnZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ2YXJpYWJseSBtb2RpZmllZCB0eXBlIGRlY2xhcmF0aW9uIGNhbm5vdCBoYXZlICdleHRlcm4nIGxpbmthZ2UiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl92bV9kZWNsX2luX2ZpbGVfc2NvcGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmFyaWFibHkgbW9kaWZpZWQgdHlwZSBkZWNsYXJhdGlvbiBub3QgYWxsb3dlZCBhdCBmaWxlIHNjb3BlIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdm1fZnVuY19kZWNsLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImZ1bmN0aW9uIGRlY2xhcmF0aW9uIGNhbm5vdCBoYXZlIHZhcmlhYmx5IG1vZGlmaWVkIHR5cGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl92b2lkX29ubHlfcGFyYW0sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJ3ZvaWQnIG11c3QgYmUgdGhlIGZpcnN0IGFuZCBvbmx5IHBhcmFtZXRlciBpZiBzcGVjaWZpZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl92b2lkX3BhcmFtX3F1YWxpZmllZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIndm9pZCcgYXMgcGFyYW1ldGVyIG11c3Qgbm90IGhhdmUgdHlwZSBxdWFsaWZpZXJzIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAyKQorRElBRyhlcnJfdnN4X2J1aWx0aW5fbm9uY29uc3RhbnRfYXJndW1lbnQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYXJndW1lbnQgJTAgdG8gJTEgbXVzdCBiZSBhIDItYml0IHVuc2lnbmVkIGxpdGVyYWwgKGkuZS4gMCwgMSwgMiBvciAzKSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3dlYWtfcHJvcGVydHksIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZXhpc3RpbmcgaW5zdGFuY2UgdmFyaWFibGUgJTEgZm9yIF9fd2VhayBwcm9wZXJ0eSAlMCBtdXN0IGJlIF9fd2VhayIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyX3dyb25nX3NhbXBsZXJfYWRkcmVzc3NwYWNlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInNhbXBsZXIgdHlwZSBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoZSBfX2xvY2FsIGFuZCBfX2dsb2JhbCBhZGRyZXNzIHNwYWNlIHF1YWxpZmllcnMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl94ODZfYnVpbHRpbl9pbnZhbGlkX3JvdW5kaW5nLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImludmFsaWQgcm91bmRpbmcgYXJndW1lbnQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKGVycl94ODZfYnVpbHRpbl9pbnZhbGlkX3NjYWxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInNjYWxlIGFyZ3VtZW50IG11c3QgYmUgMSwgMiwgNCwgb3IgOCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcoZXJyb3JfaW5vdXRwdXRfY29uZmxpY3Rfd2l0aF9jbG9iYmVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImFzbS1zcGVjaWZpZXIgZm9yIGlucHV0IG9yIG91dHB1dCB2YXJpYWJsZSBjb25mbGljdHMgd2l0aCBhc20gY2xvYmJlciBsaXN0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAwKQorRElBRyhleHRfYWdncmVnYXRlX2luaXRfbm90X2NvbnN0YW50LCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImluaXRpYWxpemVyIGZvciBhZ2dyZWdhdGUgaXMgbm90IGEgY29tcGlsZS10aW1lIGNvbnN0YW50IiwgMTEyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2Fub255bW91c19yZWNvcmRfd2l0aF9hbm9ueW1vdXNfdHlwZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJhbm9ueW1vdXMgdHlwZXMgZGVjbGFyZWQgaW4gYW4gYW5vbnltb3VzICVzZWxlY3R7c3RydWN0fHVuaW9ufTAgYXJlIGFuIGV4dGVuc2lvbiIsIDQxMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9hbm9ueW1vdXNfcmVjb3JkX3dpdGhfdHlwZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ0eXBlcyBkZWNsYXJlZCBpbiBhbiBhbm9ueW1vdXMgJXNlbGVjdHtzdHJ1Y3R8dW5pb259MCBhcmUgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uIiwgMzUwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2Fub255bW91c19zdHJ1Y3RfdW5pb25fcXVhbGlmaWVkLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImFub255bW91cyAlc2VsZWN0e3N0cnVjdHx1bmlvbn0wIGNhbm5vdCBiZSAnJTEnIiwgNTAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2Fub255bW91c191bmlvbiwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJhbm9ueW1vdXMgdW5pb25zIGFyZSBhIEMxMSBleHRlbnNpb24iLCAxMTAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfYXJyYXlfaW5pdF9jb3B5LCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImluaXRpYWxpemF0aW9uIG9mIGFuIGFycmF5ICVkaWZme29mIHR5cGUgJCBmcm9tIGEgY29tcG91bmQgbGl0ZXJhbCBvZiB0eXBlICR8ZnJvbSBhIGNvbXBvdW5kIGxpdGVyYWx9MCwxIGlzIGEgR05VIGV4dGVuc2lvbiIsIDI0MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9hcnJheV9pbml0X3BhcmVucywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAicGFyZW50aGVzaXplZCBpbml0aWFsaXphdGlvbiBvZiBhIG1lbWJlciBhcnJheSBpcyBhIEdOVSBleHRlbnNpb24iLCAyMzgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfYXJyYXlfc2l6ZV9jb252ZXJzaW9uLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSBhcnJheSBzaXplIGV4cHJlc3Npb24gb2YgdHlwZSAlMCB0byAlc2VsZWN0e2ludGVncmFsfGVudW1lcmF0aW9ufTEgdHlwZSAlMiBpcyBhIEMrKzExIGV4dGVuc2lvbiIsIDc3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2F1dG9fbmV3X2xpc3RfaW5pdCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJJU08gQysrIHN0YW5kYXJkcyBiZWZvcmUgQysrMTcgZG8gbm90IGFsbG93IG5ldyBleHByZXNzaW9uIGZvciB0eXBlICUwIHRvIHVzZSBsaXN0LWluaXRpYWxpemF0aW9uIiwgODksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfYXV0b190eXBlX3NwZWNpZmllciwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICInYXV0bycgdHlwZSBzcGVjaWZpZXIgaXMgYSBDKysxMSBleHRlbnNpb24iLCA3NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9jMTFfYW5vbnltb3VzX3N0cnVjdCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJhbm9ueW1vdXMgc3RydWN0cyBhcmUgYSBDMTEgZXh0ZW5zaW9uIiwgMTEwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2M5OV9hcnJheV91c2FnZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlc2VsZWN0e3F1YWxpZmllciBpbiB8c3RhdGljIHx9MGFycmF5IHNpemUgJXNlbGVjdHt8fCdbKl0gJ30waXMgYSBDOTkgZmVhdHVyZSIsIDExMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9jOTlfZmxleGlibGVfYXJyYXlfbWVtYmVyLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImZsZXhpYmxlIGFycmF5IG1lbWJlcnMgYXJlIGEgQzk5IGZlYXR1cmUiLCAxMTIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfY2Fubm90X3VzZV90cml2aWFsX2FiaSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIndHJpdmlhbF9hYmknIGNhbm5vdCBiZSBhcHBsaWVkIHRvICUwIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2Nhc3RfZm5fb2JqLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImNhc3QgYmV0d2VlbiBwb2ludGVyLXRvLWZ1bmN0aW9uIGFuZCBwb2ludGVyLXRvLW9iamVjdCBpcyBhbiBleHRlbnNpb24iLCA1MDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfY2NlX25hcnJvd2luZywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtjYXNlIHZhbHVlfGVudW1lcmF0b3IgdmFsdWV8bm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnR8YXJyYXkgc2l6ZXxjb25zdGV4cHIgaWYgY29uZGl0aW9ufTAgJXNlbGVjdHtjYW5ub3QgYmUgbmFycm93ZWQgZnJvbSB0eXBlICUyIHRvICUzfGV2YWx1YXRlcyB0byAlMiwgd2hpY2ggY2Fubm90IGJlIG5hcnJvd2VkIHRvIHR5cGUgJTN9MSIsIDgxLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfY29tcGxleF9jb21wb25lbnRfaW5pdCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJjb21wbGV4IGluaXRpYWxpemF0aW9uIHNwZWNpZnlpbmcgcmVhbCBhbmQgaW1hZ2luYXJ5IGNvbXBvbmVudHMgaXMgYW4gZXh0ZW5zaW9uIiwgMTI1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2NvbnN0ZXhwcl9ib2R5X2ludmFsaWRfc3RtdCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1c2Ugb2YgdGhpcyBzdGF0ZW1lbnQgaW4gYSBjb25zdGV4cHIgJXNlbGVjdHtmdW5jdGlvbnxjb25zdHJ1Y3Rvcn0wIGlzIGEgQysrMTQgZXh0ZW5zaW9uIiwgODUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfY29uc3RleHByX2JvZHlfbXVsdGlwbGVfcmV0dXJuLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm11bHRpcGxlIHJldHVybiBzdGF0ZW1lbnRzIGluIGNvbnN0ZXhwciBmdW5jdGlvbiBpcyBhIEMrKzE0IGV4dGVuc2lvbiIsIDg1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2NvbnN0ZXhwcl9mdW5jdGlvbl9uZXZlcl9jb25zdGFudF9leHByLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjb25zdGV4cHIgJXNlbGVjdHtmdW5jdGlvbnxjb25zdHJ1Y3Rvcn0wIG5ldmVyIHByb2R1Y2VzIGEgY29uc3RhbnQgZXhwcmVzc2lvbiIsIDMxNSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9jb25zdGV4cHJfbG9jYWxfdmFyLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInZhcmlhYmxlIGRlY2xhcmF0aW9uIGluIGEgY29uc3RleHByICVzZWxlY3R7ZnVuY3Rpb258Y29uc3RydWN0b3J9MCBpcyBhIEMrKzE0IGV4dGVuc2lvbiIsIDg1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2NvbnN0ZXhwcl90eXBlX2RlZmluaXRpb24sIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidHlwZSBkZWZpbml0aW9uIGluIGEgY29uc3RleHByICVzZWxlY3R7ZnVuY3Rpb258Y29uc3RydWN0b3J9MCBpcyBhIEMrKzE0IGV4dGVuc2lvbiIsIDg1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2N4eDE0X2F0dHIsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidXNlIG9mIHRoZSAlMCBhdHRyaWJ1dGUgaXMgYSBDKysxNCBleHRlbnNpb24iLCA4NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9jeHgxN19hdHRyLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVzZSBvZiB0aGUgJTAgYXR0cmlidXRlIGlzIGEgQysrMTcgZXh0ZW5zaW9uIiwgODksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfZGVjb21wX2RlY2wsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZGVjb21wb3NpdGlvbiBkZWNsYXJhdGlvbnMgYXJlIGEgQysrMTcgZXh0ZW5zaW9uIiwgODksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfZGVjb21wX2RlY2xfY29uZCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJJU08gQysrMTcgZG9lcyBub3QgcGVybWl0IHN0cnVjdHVyZWQgYmluZGluZyBkZWNsYXJhdGlvbiBpbiBhIGNvbmRpdGlvbiIsIDU2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2RlZmF1bHRfaW5pdF9jb25zdCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJkZWZhdWx0IGluaXRpYWxpemF0aW9uIG9mIGFuIG9iamVjdCBvZiBjb25zdCB0eXBlICUwJXNlbGVjdHt8IHdpdGhvdXQgYSB1c2VyLXByb3ZpZGVkIGRlZmF1bHQgY29uc3RydWN0b3J9MSBpcyBhIE1pY3Jvc29mdCBleHRlbnNpb24iLCAzNTQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfZGVsZXRlX3ZvaWRfcHRyX29wZXJhbmQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY2Fubm90IGRlbGV0ZSBleHByZXNzaW9uIHdpdGggcG9pbnRlci10by0ndm9pZCcgdHlwZSAlMCIsIDE1MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9kZXByZWNhdGVkX3N0cmluZ19saXRlcmFsX2NvbnZlcnNpb24sIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiSVNPIEMrKzExIGRvZXMgbm90IGFsbG93IGNvbnZlcnNpb24gZnJvbSBzdHJpbmcgbGl0ZXJhbCB0byAlMCIsIDcxOSwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2Rlc2lnbmF0ZWRfaW5pdCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJkZXNpZ25hdGVkIGluaXRpYWxpemVycyBhcmUgYSBDOTkgZmVhdHVyZSIsIDExMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9kdXBsaWNhdGVfZGVjbHNwZWMsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZHVwbGljYXRlICclMCcgZGVjbGFyYXRpb24gc3BlY2lmaWVyIiwgMTgxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2R5bmFtaWNfZXhjZXB0aW9uX3NwZWMsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIklTTyBDKysxNyBkb2VzIG5vdCBhbGxvdyBkeW5hbWljIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyIsIDE4NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9lbXB0eV9zdHJ1Y3RfdW5pb24sIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZW1wdHkgJXNlbGVjdHtzdHJ1Y3R8dW5pb259MCBpcyBhIEdOVSBleHRlbnNpb24iLCAyNDcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfZW51bV9mcmllbmQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYmVmcmllbmRpbmcgZW51bWVyYXRpb24gdHlwZSAlMCBpcyBhIEMrKzExIGV4dGVuc2lvbiIsIDc3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2VudW1fdG9vX2xhcmdlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImVudW1lcmF0aW9uIHZhbHVlcyBleGNlZWQgcmFuZ2Ugb2YgbGFyZ2VzdCBpbnRlZ2VyIiwgMTk4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2VudW1fdmFsdWVfbm90X2ludCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJJU08gQyByZXN0cmljdHMgZW51bWVyYXRvciB2YWx1ZXMgdG8gcmFuZ2Ugb2YgJ2ludCcgKCUwIGlzIHRvbyAlc2VsZWN0e3NtYWxsfGxhcmdlfTEpIiwgNTAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2VudW1lcmF0b3JfaW5jcmVtZW50X3Rvb19sYXJnZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpbmNyZW1lbnRlZCBlbnVtZXJhdG9yIHZhbHVlICUwIGlzIG5vdCByZXByZXNlbnRhYmxlIGluIHRoZSBsYXJnZXN0IGludGVnZXIgdHlwZSIsIDE5OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9lbnVtZXJhdG9yX3Rvb19sYXJnZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJlbnVtZXJhdG9yIHZhbHVlIGlzIG5vdCByZXByZXNlbnRhYmxlIGluIHRoZSB1bmRlcmx5aW5nIHR5cGUgJTAiLCAzNTksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfZXF1YWxzX3RoaXNfbGFtYmRhX2NhcHR1cmVfY3h4MmEsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZXhwbGljaXQgY2FwdHVyZSBvZiAndGhpcycgd2l0aCBhIGNhcHR1cmUgZGVmYXVsdCBvZiAnPScgaXMgYSBDKysyYSBleHRlbnNpb24iLCA5NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDMpCitESUFHKGV4dF9lcXVpdmFsZW50X2ludGVybmFsX2xpbmthZ2VfZGVjbF9pbl9tb2R1bGVzLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImFtYmlndW91cyB1c2Ugb2YgaW50ZXJuYWwgbGlua2FnZSBkZWNsYXJhdGlvbiAlMCBkZWZpbmVkIGluIG11bHRpcGxlIG1vZHVsZXMiLCA0MDEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxMykKK0RJQUcoZXh0X2V4Y2Vzc19pbml0aWFsaXplcnMsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZXhjZXNzIGVsZW1lbnRzIGluICVzZWxlY3R7YXJyYXl8dmVjdG9yfHNjYWxhcnx1bmlvbnxzdHJ1Y3R9MCBpbml0aWFsaXplciIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfZXhjZXNzX2luaXRpYWxpemVyc19pbl9jaGFyX2FycmF5X2luaXRpYWxpemVyLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImV4Y2VzcyBlbGVtZW50cyBpbiBjaGFyIGFycmF5IGluaXRpYWxpemVyIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9leHBsaWNpdF9jb252ZXJzaW9uX2Z1bmN0aW9ucywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleHBsaWNpdCBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhcmUgYSBDKysxMSBleHRlbnNpb24iLCA3NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9leHBsaWNpdF9pbnN0YW50aWF0aW9uX2R1cGxpY2F0ZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJkdXBsaWNhdGUgZXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiAlMCBpZ25vcmVkIGFzIGEgTWljcm9zb2Z0IGV4dGVuc2lvbiIsIDM3MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9leHBsaWNpdF9pbnN0YW50aWF0aW9uX3dpdGhvdXRfcXVhbGlmaWVkX2lkLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInF1YWxpZmllciBpbiBleHBsaWNpdCBpbnN0YW50aWF0aW9uIG9mICVxMCByZXF1aXJlcyBhIHRlbXBsYXRlLWlkIChhIHR5cGVkZWYgaXMgbm90IHBlcm1pdHRlZCkiLCA1MDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfZXhwbGljaXRfc3BlY2lhbGl6YXRpb25fc3RvcmFnZV9jbGFzcywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleHBsaWNpdCBzcGVjaWFsaXphdGlvbiBjYW5ub3QgaGF2ZSBhIHN0b3JhZ2UgY2xhc3MiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2V4cHJfbm90X2ljZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJleHByZXNzaW9uIGlzIG5vdCBhbiAlc2VsZWN0e2ludGVnZXJ8aW50ZWdyYWx9MCBjb25zdGFudCBleHByZXNzaW9uOyBmb2xkaW5nIGl0IHRvIGEgY29uc3RhbnQgaXMgYSBHTlUgZXh0ZW5zaW9uIiwgMjUwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2ZsZXhpYmxlX2FycmF5X2VtcHR5X2FnZ3JlZ2F0ZV9nbnUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZmxleGlibGUgYXJyYXkgbWVtYmVyICUwIGluIG90aGVyd2lzZSBlbXB0eSAlc2VsZWN0e3N0cnVjdHxpbnRlcmZhY2V8dW5pb258Y2xhc3N8ZW51bX0xIGlzIGEgR05VIGV4dGVuc2lvbiIsIDI0NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9mbGV4aWJsZV9hcnJheV9lbXB0eV9hZ2dyZWdhdGVfbXMsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZmxleGlibGUgYXJyYXkgbWVtYmVyICUwIGluIG90aGVyd2lzZSBlbXB0eSAlc2VsZWN0e3N0cnVjdHxpbnRlcmZhY2V8dW5pb258Y2xhc3N8ZW51bX0xIGlzIGEgTWljcm9zb2Z0IGV4dGVuc2lvbiIsIDM2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9mbGV4aWJsZV9hcnJheV9pbl9hcnJheSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlMCBtYXkgbm90IGJlIHVzZWQgYXMgYW4gYXJyYXkgZWxlbWVudCBkdWUgdG8gZmxleGlibGUgYXJyYXkgbWVtYmVyIiwgMjEzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2ZsZXhpYmxlX2FycmF5X2luX3N0cnVjdCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlMCBtYXkgbm90IGJlIG5lc3RlZCBpbiBhIHN0cnVjdCBkdWUgdG8gZmxleGlibGUgYXJyYXkgbWVtYmVyIiwgMjEzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2ZsZXhpYmxlX2FycmF5X2luaXQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZmxleGlibGUgYXJyYXkgaW5pdGlhbGl6YXRpb24gaXMgYSBHTlUgZXh0ZW5zaW9uIiwgMjQ4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2ZsZXhpYmxlX2FycmF5X3VuaW9uX2dudSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJmbGV4aWJsZSBhcnJheSBtZW1iZXIgJTAgaW4gYSB1bmlvbiBpcyBhIEdOVSBleHRlbnNpb24iLCAyNDksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfZmxleGlibGVfYXJyYXlfdW5pb25fbXMsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZmxleGlibGUgYXJyYXkgbWVtYmVyICUwIGluIGEgdW5pb24gaXMgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uIiwgMzY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2Zvcl9yYW5nZV9iZWdpbl9lbmRfdHlwZXNfZGlmZmVyLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIidiZWdpbicgYW5kICdlbmQnIHJldHVybmluZyBkaWZmZXJlbnQgdHlwZXMgKCUwIGFuZCAlMSkgaXMgYSBDKysxNyBleHRlbnNpb24iLCA4OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9mb3J3YXJkX3JlZl9lbnVtLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIklTTyBDIGZvcmJpZHMgZm9yd2FyZCByZWZlcmVuY2VzIHRvICdlbnVtJyB0eXBlcyIsIDUwMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9mb3J3YXJkX3JlZl9lbnVtX2RlZiwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJyZWRlY2xhcmF0aW9uIG9mIGFscmVhZHktZGVmaW5lZCBlbnVtICUwIGlzIGEgR05VIGV4dGVuc2lvbiIsIDI1NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9mb3VuZF92aWFfZGVwZW5kZW50X2Jhc2VzX2xvb2t1cCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1c2Ugb2YgaWRlbnRpZmllciAlMCBmb3VuZCB2aWEgdW5xdWFsaWZpZWQgbG9va3VwIGludG8gZGVwZW5kZW50IGJhc2VzIG9mIGNsYXNzIHRlbXBsYXRlcyBpcyBhIE1pY3Jvc29mdCBleHRlbnNpb24iLCAzNzMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfZnJlZXN0YW5kaW5nX2NvbXBsZXgsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiY29tcGxleCBudW1iZXJzIGFyZSBhbiBleHRlbnNpb24gaW4gYSBmcmVlc3RhbmRpbmcgQzk5IGltcGxlbWVudGF0aW9uIiwgNTAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2ZyaWVuZF90YWdfcmVkZWNsX291dHNpZGVfbmFtZXNwYWNlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVucXVhbGlmaWVkIGZyaWVuZCBkZWNsYXJhdGlvbiByZWZlcnJpbmcgdG8gdHlwZSBvdXRzaWRlIG9mIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UgaXMgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uOyBhZGQgYSBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIiLCAzNzUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfZ251X2Fub255bW91c19zdHJ1Y3QsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiYW5vbnltb3VzIHN0cnVjdHMgYXJlIGEgR05VIGV4dGVuc2lvbiIsIDIzNywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9nbnVfcHRyX2Z1bmNfYXJpdGgsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiYXJpdGhtZXRpYyBvbiVzZWxlY3R7IGF8fTAgcG9pbnRlciVzZWxlY3R7fHN9MCB0byVzZWxlY3R7IHRoZXx9MiBmdW5jdGlvbiB0eXBlJXNlbGVjdHt8c30yICUxJXNlbGVjdHt8IGFuZCAlM30yIGlzIGEgR05VIGV4dGVuc2lvbiIsIDUwMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9nbnVfc3Vic2NyaXB0X3ZvaWRfdHlwZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJzdWJzY3JpcHQgb2YgYSBwb2ludGVyIHRvIHZvaWQgaXMgYSBHTlUgZXh0ZW5zaW9uIiwgNTAzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2dudV92b2lkX3B0ciwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJhcml0aG1ldGljIG9uJXNlbGVjdHsgYXx9MCBwb2ludGVyJXNlbGVjdHt8c30wIHRvIHZvaWQgaXMgYSBHTlUgZXh0ZW5zaW9uIiwgNTAzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2dvdG9faW50b19wcm90ZWN0ZWRfc2NvcGUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAianVtcCBmcm9tIHRoaXMgZ290byBzdGF0ZW1lbnQgdG8gaXRzIGxhYmVsIGlzIGEgTWljcm9zb2Z0IGV4dGVuc2lvbiIsIDM2NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9pbWFnaW5hcnlfY29uc3RhbnQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiaW1hZ2luYXJ5IGNvbnN0YW50cyBhcmUgYSBHTlUgZXh0ZW5zaW9uIiwgMjUxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2ltcGxpY2l0X2V4Y2VwdGlvbl9zcGVjX21pc21hdGNoLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImZ1bmN0aW9uIHByZXZpb3VzbHkgZGVjbGFyZWQgd2l0aCBhbiAlc2VsZWN0e2V4cGxpY2l0fGltcGxpY2l0fTAgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gcmVkZWNsYXJlZCB3aXRoIGFuICVzZWxlY3R7aW1wbGljaXR8ZXhwbGljaXR9MCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiIsIDI3NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9pbXBsaWNpdF9mdW5jdGlvbl9kZWNsLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImltcGxpY2l0IGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9uICUwIGlzIGludmFsaWQgaW4gJXNlbGVjdHtDOTl8T3BlbkNMfTEiLCAyNzcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfaW1wbGljaXRfbGliX2Z1bmN0aW9uX2RlY2wsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW1wbGljaXRseSBkZWNsYXJpbmcgbGlicmFyeSBmdW5jdGlvbiAnJTAnIHdpdGggdHlwZSAlMSIsIDI3NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9pbl9jbGFzc19pbml0aWFsaXplcl9mbG9hdF90eXBlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImluLWNsYXNzIGluaXRpYWxpemVyIGZvciBzdGF0aWMgZGF0YSBtZW1iZXIgb2YgdHlwZSAlMCBpcyBhIEdOVSBleHRlbnNpb24iLCAyNTYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfaW5fY2xhc3NfaW5pdGlhbGl6ZXJfZmxvYXRfdHlwZV9jeHgxMSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiaW4tY2xhc3MgaW5pdGlhbGl6ZXIgZm9yIHN0YXRpYyBkYXRhIG1lbWJlciBvZiB0eXBlICUwIHJlcXVpcmVzICdjb25zdGV4cHInIHNwZWNpZmllciIsIDU4NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9pbl9jbGFzc19pbml0aWFsaXplcl9ub25fY29uc3RhbnQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiaW4tY2xhc3MgaW5pdGlhbGl6ZXIgZm9yIHN0YXRpYyBkYXRhIG1lbWJlciBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uOyBmb2xkaW5nIGl0IHRvIGEgY29uc3RhbnQgaXMgYSBHTlUgZXh0ZW5zaW9uIiwgMjUwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2luY29tcGxldGVfaW5fZXhjZXB0aW9uX3NwZWMsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJXNlbGVjdHt8cG9pbnRlciB0byB8cmVmZXJlbmNlIHRvIH0waW5jb21wbGV0ZSB0eXBlICUxIGlzIG5vdCBhbGxvd2VkIGluIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIiwgMzYwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2luY3JlbWVudF9ib29sLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJJU08gQysrMTcgZG9lcyBub3QgYWxsb3cgaW5jcmVtZW50aW5nIGV4cHJlc3Npb24gb2YgdHlwZSBib29sIiwgMzAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2luaXRfY2FwdHVyZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpbml0aWFsaXplZCBsYW1iZGEgY2FwdHVyZXMgYXJlIGEgQysrMTQgZXh0ZW5zaW9uIiwgODUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAzKQorRElBRyhleHRfaW5pdF9saXN0X2NvbnN0YW50X25hcnJvd2luZywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiY29uc3RhbnQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gJTAgd2hpY2ggY2Fubm90IGJlIG5hcnJvd2VkIHRvIHR5cGUgJTEiLCA4MSwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2luaXRfbGlzdF90eXBlX25hcnJvd2luZywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidHlwZSAlMCBjYW5ub3QgYmUgbmFycm93ZWQgdG8gJTEgaW4gaW5pdGlhbGl6ZXIgbGlzdCIsIDgxLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfaW5pdF9saXN0X3ZhcmlhYmxlX25hcnJvd2luZywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibm9uLWNvbnN0YW50LWV4cHJlc3Npb24gY2Fubm90IGJlIG5hcnJvd2VkIGZyb20gdHlwZSAlMCB0byAlMSBpbiBpbml0aWFsaXplciBsaXN0IiwgODEsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9pbml0aWFsaXplcl9zdHJpbmdfZm9yX2NoYXJfYXJyYXlfdG9vX2xvbmcsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW5pdGlhbGl6ZXItc3RyaW5nIGZvciBjaGFyIGFycmF5IGlzIHRvbyBsb25nIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9pbmxpbmVfdmFyaWFibGUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW5saW5lIHZhcmlhYmxlcyBhcmUgYSBDKysxNyBleHRlbnNpb24iLCA4OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9pbnRlZ2VyX2NvbXBsZW1lbnRfY29tcGxleCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJJU08gQyBkb2VzIG5vdCBzdXBwb3J0ICd+JyBmb3IgY29tcGxleCBjb25qdWdhdGlvbiBvZiAlMCIsIDUwMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9pbnRlZ2VyX2NvbXBsZXgsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiY29tcGxleCBpbnRlZ2VyIHR5cGVzIGFyZSBhIEdOVSBleHRlbnNpb24iLCAyNDIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfaW50ZWdlcl9pbmNyZW1lbnRfY29tcGxleCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJJU08gQyBkb2VzIG5vdCBzdXBwb3J0ICcrKycvJy0tJyBvbiBjb21wbGV4IGludGVnZXIgdHlwZSAlMCIsIDUwMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9pbnRlcm5hbF9pbl9leHRlcm5faW5saW5lLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInN0YXRpYyAlc2VsZWN0e2Z1bmN0aW9ufHZhcmlhYmxlfTAgJTEgaXMgdXNlZCBpbiBhbiBpbmxpbmUgZnVuY3Rpb24gd2l0aCBleHRlcm5hbCBsaW5rYWdlIiwgNTg1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X2ludGVybmFsX2luX2V4dGVybl9pbmxpbmVfcXVpZXQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAic3RhdGljICVzZWxlY3R7ZnVuY3Rpb258dmFyaWFibGV9MCAlMSBpcyB1c2VkIGluIGFuIGlubGluZSBmdW5jdGlvbiB3aXRoIGV4dGVybmFsIGxpbmthZ2UiLCA1ODUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfaW52YWxpZF9zaWduX3NwZWMsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJyUwJyBjYW5ub3QgYmUgc2lnbmVkIG9yIHVuc2lnbmVkIiwgNTAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X21haW5fcmV0dXJuc19ub25pbnQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicmV0dXJuIHR5cGUgb2YgJ21haW4nIGlzIG5vdCAnaW50JyIsIDM0MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9tYWluX3VzZWQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiSVNPIEMrKyBkb2VzIG5vdCBhbGxvdyAnbWFpbicgdG8gYmUgdXNlZCBieSBhIHByb2dyYW0iLCAzNDIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfbWFueV9icmFjZXNfYXJvdW5kX3NjYWxhcl9pbml0LCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInRvbyBtYW55IGJyYWNlcyBhcm91bmQgc2NhbGFyIGluaXRpYWxpemVyIiwgMzQ1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X21lbWJlcl9yZWRlY2xhcmVkLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNsYXNzIG1lbWJlciBjYW5ub3QgYmUgcmVkZWNsYXJlZCIsIDUzMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9taXNtYXRjaGVkX2V4Y2VwdGlvbl9zcGVjLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGluIGRlY2xhcmF0aW9uIGRvZXMgbm90IG1hdGNoIHByZXZpb3VzIGRlY2xhcmF0aW9uIiwgMzYwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X21pc21hdGNoZWRfZXhjZXB0aW9uX3NwZWNfZXhwbGljaXRfaW5zdGFudGlhdGlvbiwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBpbiBleHBsaWNpdCBpbnN0YW50aWF0aW9uIGRvZXMgbm90IG1hdGNoIGluc3RhbnRpYXRlZCBvbmUiLCAzNjAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfbWlzc2luZ19kZWNsc3BlYywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJkZWNsYXJhdGlvbiBzcGVjaWZpZXIgbWlzc2luZywgZGVmYXVsdGluZyB0byAnaW50JyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfbWlzc2luZ19leGNlcHRpb25fc3BlY2lmaWNhdGlvbiwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMCBpcyBtaXNzaW5nIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uICclMSciLCAzODQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfbWlzc2luZ190eXBlX3NwZWNpZmllciwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ0eXBlIHNwZWNpZmllciBtaXNzaW5nLCBkZWZhdWx0cyB0byAnaW50JyIsIDI3OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9taXhlZF9kZWNsc19jb2RlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIklTTyBDOTAgZm9yYmlkcyBtaXhpbmcgZGVjbGFyYXRpb25zIGFuZCBjb2RlIiwgMTQ5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X21vZHVsZV9pbXBvcnRfaW5fZXh0ZXJuX2MsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImltcG9ydCBvZiBDKysgbW9kdWxlICclMCcgYXBwZWFycyB3aXRoaW4gZXh0ZXJuIFwiQ1wiIGxhbmd1YWdlIGxpbmthZ2Ugc3BlY2lmaWNhdGlvbiIsIDQwMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEzKQorRElBRyhleHRfbW9kdWxlX2ltcG9ydF9ub3RfYXRfdG9wX2xldmVsX25vb3AsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInJlZHVuZGFudCAjaW5jbHVkZSBvZiBtb2R1bGUgJyUwJyBhcHBlYXJzIHdpdGhpbiAlMSIsIDQwMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEzKQorRElBRyhleHRfbXNfYW1iaWd1b3VzX2RpcmVjdF9iYXNlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImFjY2Vzc2luZyBpbmFjY2Vzc2libGUgZGlyZWN0IGJhc2UgJTAgb2YgJTEgaXMgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uIiwgMzY3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X21zX2Fub255bW91c19yZWNvcmQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYW5vbnltb3VzICVzZWxlY3R7c3RydWN0c3x1bmlvbnN9MCBhcmUgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uIiwgMzUwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X21zX2Nhc3RfZm5fb2JqLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInN0YXRpY19jYXN0IGJldHdlZW4gcG9pbnRlci10by1mdW5jdGlvbiBhbmQgcG9pbnRlci10by1vYmplY3QgaXMgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uIiwgMzUxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X21zX2RlbGF5ZWRfdGVtcGxhdGVfYXJndW1lbnQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidXNpbmcgdGhlIHVuZGVjbGFyZWQgdHlwZSAlMCBhcyBhIGRlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnQgaXMgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uIiwgMzczLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X21zX2RlcmVmX3RlbXBsYXRlX2FyZ3VtZW50LCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm5vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50IGNvbnRhaW5pbmcgYSBkZXJlZmVyZW5jZSBvcGVyYXRpb24gaXMgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uIiwgMzczLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X21zX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGwsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbHMgYXJlIGEgTWljcm9zb2Z0IGV4dGVuc2lvbiIsIDM2MiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9tc19mb3J3YXJkX3JlZl9lbnVtLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImZvcndhcmQgcmVmZXJlbmNlcyB0byAnZW51bScgdHlwZXMgYXJlIGEgTWljcm9zb2Z0IGV4dGVuc2lvbiIsIDM1OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9tc19pbXBjYXN0X2ZuX29iaiwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpbXBsaWNpdCBjb252ZXJzaW9uIGJldHdlZW4gcG9pbnRlci10by1mdW5jdGlvbiBhbmQgcG9pbnRlci10by1vYmplY3QgaXMgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uIiwgMzUxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X21zX21pc3NpbmdfZXhjZXB0aW9uX3NwZWNpZmljYXRpb24sIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgaXMgbWlzc2luZyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiAnJTEnIiwgMzYwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X21zX3RlbXBsYXRlX3NwZWNfcmVkZWNsX291dF9vZl9zY29wZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlc2VsZWN0e2NsYXNzIHRlbXBsYXRlfGNsYXNzIHRlbXBsYXRlIHBhcnRpYWx8dmFyaWFibGUgdGVtcGxhdGV8dmFyaWFibGUgdGVtcGxhdGUgcGFydGlhbHxmdW5jdGlvbiB0ZW1wbGF0ZXxtZW1iZXIgZnVuY3Rpb258c3RhdGljIGRhdGEgbWVtYmVyfG1lbWJlciBjbGFzc3xtZW1iZXIgZW51bWVyYXRpb259MCBzcGVjaWFsaXphdGlvbiBvZiAlMSBub3QgaW4gJXNlbGVjdHthIG5hbWVzcGFjZSBlbmNsb3NpbmcgJTJ8Y2xhc3MgJTIgb3IgYW4gZW5jbG9zaW5nIG5hbWVzcGFjZX0zIGlzIGEgTWljcm9zb2Z0IGV4dGVuc2lvbiIsIDM3MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9tc190ZW1wbGF0ZV90eXBlX2FyZ19taXNzaW5nX3R5cGVuYW1lLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInRlbXBsYXRlIGFyZ3VtZW50IGZvciB0ZW1wbGF0ZSB0eXBlIHBhcmFtZXRlciBtdXN0IGJlIGEgdHlwZTsgb21pdHRlZCAndHlwZW5hbWUnIGlzIGEgTWljcm9zb2Z0IGV4dGVuc2lvbiIsIDM3MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9tc191c2luZ19kZWNsYXJhdGlvbl9pbmFjY2Vzc2libGUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidXNpbmcgZGVjbGFyYXRpb24gcmVmZXJyaW5nIHRvIGluYWNjZXNzaWJsZSBtZW1iZXIgJyUwJyAod2hpY2ggcmVmZXJzIHRvIGFjY2Vzc2libGUgbWVtYmVyICclMScpIGlzIGEgTWljcm9zb2Z0IGNvbXBhdGliaWxpdHkgZXh0ZW5zaW9uIiwgMzc2LCBTRklOQUVfQWNjZXNzQ29udHJvbCwgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfbXV0YWJsZV9yZWZlcmVuY2UsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJ211dGFibGUnIG9uIGEgcmVmZXJlbmNlIHR5cGUgaXMgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uIiwgMzY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X25lc3RlZF9uYW1lX21lbWJlcl9yZWZfbG9va3VwX2FtYmlndW91cywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJsb29rdXAgb2YgJTAgaW4gbWVtYmVyIGFjY2VzcyBleHByZXNzaW9uIGlzIGFtYmlndW91czsgdXNpbmcgbWVtYmVyIG9mICUxIiwgMjIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfbmVzdGVkX25hbWVfc3BlY19pc19lbnVtLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVzZSBvZiBlbnVtZXJhdGlvbiBpbiBhIG5lc3RlZCBuYW1lIHNwZWNpZmllciBpcyBhIEMrKzExIGV4dGVuc2lvbiIsIDc3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X25lc3RlZF9wb2ludGVyX3F1YWxpZmllcl9taXNtYXRjaCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlc2VsZWN0eyVkaWZme2Fzc2lnbmluZyB0byAkIGZyb20gJHxhc3NpZ25pbmcgdG8gZGlmZmVyZW50IHR5cGVzfTAsMXwlZGlmZntwYXNzaW5nICQgdG8gcGFyYW1ldGVyIG9mIHR5cGUgJHxwYXNzaW5nIHRvIHBhcmFtZXRlciBvZiBkaWZmZXJlbnQgdHlwZX0wLDF8JWRpZmZ7cmV0dXJuaW5nICQgZnJvbSBhIGZ1bmN0aW9uIHdpdGggcmVzdWx0IHR5cGUgJHxyZXR1cm5pbmcgZnJvbSBmdW5jdGlvbiB3aXRoIGRpZmZlcmVudCByZXR1cm4gdHlwZX0wLDF8JWRpZmZ7Y29udmVydGluZyAkIHRvIHR5cGUgJHxjb252ZXJ0aW5nIGJldHdlZW4gdHlwZXN9MCwxfCVkaWZme2luaXRpYWxpemluZyAkIHdpdGggYW4gZXhwcmVzc2lvbiBvZiB0eXBlICR8aW5pdGlhbGl6aW5nIHdpdGggZXhwcmVzc2lvbiBvZiBkaWZmZXJlbnQgdHlwZX0wLDF8JWRpZmZ7c2VuZGluZyAkIHRvIHBhcmFtZXRlciBvZiB0eXBlICR8c2VuZGluZyB0byBwYXJhbWV0ZXIgb2YgZGlmZmVyZW50IHR5cGV9MCwxfCVkaWZme2Nhc3RpbmcgJCB0byB0eXBlICR8Y2FzdGluZyBiZXR3ZWVuIHR5cGVzfTAsMX0yIGRpc2NhcmRzIHF1YWxpZmllcnMgaW4gbmVzdGVkIHBvaW50ZXIgdHlwZXMiLCAyOTEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfbmV3X3BhcmVuX2FycmF5X25vbmNvbnN0LCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIndoZW4gdHlwZSBpcyBpbiBwYXJlbnRoZXNlcywgYXJyYXkgY2Fubm90IGhhdmUgZHluYW1pYyBzaXplIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9ub19kZWNsYXJhdG9ycywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJkZWNsYXJhdGlvbiBkb2VzIG5vdCBkZWNsYXJlIGFueXRoaW5nIiwgMzgzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X25vX25hbWVkX21lbWJlcnNfaW5fc3RydWN0X3VuaW9uLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiVzZWxlY3R7c3RydWN0fHVuaW9ufTAgd2l0aG91dCBuYW1lZCBtZW1iZXJzIGlzIGEgR05VIGV4dGVuc2lvbiIsIDI0NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9ub25jbGFzc190eXBlX2ZyaWVuZCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJub24tY2xhc3MgZnJpZW5kIHR5cGUgJTAgaXMgYSBDKysxMSBleHRlbnNpb24iLCA3NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9ub3JldHVybl9tYWluLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIidtYWluJyBpcyBub3QgYWxsb3dlZCB0byBiZSBkZWNsYXJlZCBfTm9yZXR1cm4iLCAzNDIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfb2Zmc2V0b2Zfbm9uX3BvZF90eXBlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm9mZnNldCBvZiBvbiBub24tUE9EIHR5cGUgJTAiLCAzMjAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfb2Zmc2V0b2Zfbm9uX3N0YW5kYXJkbGF5b3V0X3R5cGUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAib2Zmc2V0IG9mIG9uIG5vbi1zdGFuZGFyZC1sYXlvdXQgdHlwZSAlMCIsIDMyMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9vbXBfbG9vcF9ub3RfY2Fub25pY2FsX2luaXQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW5pdGlhbGl6YXRpb24gY2xhdXNlIG9mIE9wZW5NUCBmb3IgbG9vcCBpcyBub3QgaW4gY2Fub25pY2FsIGZvcm0gKCd2YXIgPSBpbml0JyBvciAnVCB2YXIgPSBpbml0JykiLCA0NzcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxMSkKK0RJQUcoZXh0X29wZW5jbF9leHRfdmVjdG9yX3R5cGVfcmdiYV9zZWxlY3RvciwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ2ZWN0b3IgY29tcG9uZW50IG5hbWUgJyUwJyBpcyBhbiBPcGVuQ0wgdmVyc2lvbiAyLjIgZmVhdHVyZSIsIDQ3NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9vcGVyYXRvcl9uZXdfZGVsZXRlX2RlY2xhcmVkX2lubGluZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJyZXBsYWNlbWVudCBmdW5jdGlvbiAlMCBjYW5ub3QgYmUgZGVjbGFyZWQgJ2lubGluZSciLCAzMDcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfb3V0X29mX2xpbmVfZGVjbGFyYXRpb24sIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm91dC1vZi1saW5lIGRlY2xhcmF0aW9uIG9mIGEgbWVtYmVyIG11c3QgYmUgYSBkZWZpbml0aW9uIiwgNDgwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X291dF9vZl9saW5lX3F1YWxpZmllZF9pZF90eXBlX25hbWVzX2NvbnN0cnVjdG9yLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIklTTyBDKysgc3BlY2lmaWVzIHRoYXQgcXVhbGlmaWVkIHJlZmVyZW5jZSB0byAlMCBpcyBhIGNvbnN0cnVjdG9yIG5hbWUgcmF0aGVyIHRoYW4gYSAlc2VsZWN0e3RlbXBsYXRlIG5hbWV8dHlwZX0xIGluIHRoaXMgY29udGV4dCwgZGVzcGl0ZSBwcmVjZWRpbmcgJXNlbGVjdHsndHlwZW5hbWUnfCd0ZW1wbGF0ZSd9MiBrZXl3b3JkIiwgMzA0LCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfb3ZlcnJpZGVfZXhjZXB0aW9uX3NwZWMsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gb2Ygb3ZlcnJpZGluZyBmdW5jdGlvbiBpcyBtb3JlIGxheCB0aGFuIGJhc2UgdmVyc2lvbiIsIDM2MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9wYXJhbV9kZWZhdWx0X2FyZ3VtZW50X3JlZGVmaW5pdGlvbiwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJyZWRlZmluaXRpb24gb2YgZGVmYXVsdCBhcmd1bWVudCIsIDM1NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9wYXJhbV9ub3RfZGVjbGFyZWQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAicGFyYW1ldGVyICUwIHdhcyBub3QgZGVjbGFyZWQsIGRlZmF1bHRpbmcgdG8gdHlwZSAnaW50JyIsIDUwMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9wYXJhbV9wcm9tb3RlZF9ub3RfY29tcGF0aWJsZV93aXRoX3Byb3RvdHlwZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlZGlmZntwcm9tb3RlZCB0eXBlICQgb2YgSyZSIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBwYXJhbWV0ZXIgdHlwZSAkfHByb21vdGVkIHR5cGUgb2YgSyZSIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHBhcmFtZXRlciB0eXBlfTAsMSBkZWNsYXJlZCBpbiBhIHByZXZpb3VzIHByb3RvdHlwZSIsIDMzMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9wYXJ0aWFsX3NwZWNfbm90X21vcmVfc3BlY2lhbGl6ZWRfdGhhbl9wcmltYXJ5LCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2NsYXNzfHZhcmlhYmxlfTAgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBpcyBub3QgbW9yZSBzcGVjaWFsaXplZCB0aGFuIHRoZSBwcmltYXJ5IHRlbXBsYXRlIiwgMzIyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X3BhcnRpYWxfc3BlY3Nfbm90X2RlZHVjaWJsZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtjbGFzc3x2YXJpYWJsZX0wIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gY29udGFpbnMgJXNlbGVjdHthIHRlbXBsYXRlIHBhcmFtZXRlcnx0ZW1wbGF0ZSBwYXJhbWV0ZXJzfTEgdGhhdCBjYW5ub3QgYmUgZGVkdWNlZDsgdGhpcyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIHdpbGwgbmV2ZXIgYmUgdXNlZCIsIDY4MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9wbGFpbl9jb21wbGV4LCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInBsYWluICdfQ29tcGxleCcgcmVxdWlyZXMgYSB0eXBlIHNwZWNpZmllcjsgYXNzdW1pbmcgJ19Db21wbGV4IGRvdWJsZSciLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X3BvaW50ZXJfdG9fY29uc3RfcmVmX21lbWJlcl9vbl9ydmFsdWUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiaW52b2tpbmcgYSBwb2ludGVyIHRvIGEgJ2NvbnN0ICYnIG1lbWJlciBmdW5jdGlvbiBvbiBhbiBydmFsdWUgaXMgYSBDKysyYSBleHRlbnNpb24iLCA5NiwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X3ByZWRlZl9vdXRzaWRlX2Z1bmN0aW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJwcmVkZWZpbmVkIGlkZW50aWZpZXIgaXMgb25seSB2YWxpZCBpbnNpZGUgZnVuY3Rpb24iLCA1MTUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfcHNldWRvX2R0b3Jfb25fdm9pZCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJwc2V1ZG8tZGVzdHJ1Y3RvcnMgb24gdHlwZSB2b2lkIGFyZSBhIE1pY3Jvc29mdCBleHRlbnNpb24iLCAzNzcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfcHVyZV9mdW5jdGlvbl9kZWZpbml0aW9uLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImZ1bmN0aW9uIGRlZmluaXRpb24gd2l0aCBwdXJlLXNwZWNpZmllciBpcyBhIE1pY3Jvc29mdCBleHRlbnNpb24iLCAzNzAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfcmVkZWZpbml0aW9uX29mX3R5cGVkZWYsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicmVkZWZpbml0aW9uIG9mIHR5cGVkZWYgJTAgaXMgYSBDMTEgZmVhdHVyZSIsIDYzNywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9yZWdpc3Rlcl9zdG9yYWdlX2NsYXNzLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJJU08gQysrMTcgZG9lcyBub3QgYWxsb3cgJ3JlZ2lzdGVyJyBzdG9yYWdlIGNsYXNzIHNwZWNpZmllciIsIDUzNSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9yZXRhaW5lZF9sYW5ndWFnZV9saW5rYWdlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImZyaWVuZCBmdW5jdGlvbiAlMCByZXRhaW5pbmcgcHJldmlvdXMgbGFuZ3VhZ2UgbGlua2FnZSBpcyBhbiBleHRlbnNpb24iLCA1NDIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfcmV0dXJuX2hhc19leHByLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e3ZvaWQgZnVuY3Rpb258dm9pZCBtZXRob2R8Y29uc3RydWN0b3J8ZGVzdHJ1Y3Rvcn0xICUwIHNob3VsZCBub3QgcmV0dXJuIGEgdmFsdWUiLCA1NDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfcmV0dXJuX2hhc192b2lkX2V4cHIsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidm9pZCAlc2VsZWN0e2Z1bmN0aW9ufG1ldGhvZHxibG9ja30xICUwIHNob3VsZCBub3QgcmV0dXJuIHZvaWQgZXhwcmVzc2lvbiIsIDUwMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9yZXR1cm5fbWlzc2luZ19leHByLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tdm9pZCAlc2VsZWN0e2Z1bmN0aW9ufG1ldGhvZH0xICUwIHNob3VsZCByZXR1cm4gYSB2YWx1ZSIsIDU0NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9ydmFsdWVfdG9fcmVmZXJlbmNlX2FjY2Vzc19jdG9yLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIkMrKzk4IHJlcXVpcmVzIGFuIGFjY2Vzc2libGUgY29weSBjb25zdHJ1Y3RvciBmb3IgY2xhc3MgJTIgd2hlbiBiaW5kaW5nIGEgcmVmZXJlbmNlIHRvIGEgdGVtcG9yYXJ5OyB3YXMgJXNlbGVjdHtwcml2YXRlfHByb3RlY3RlZH0wIiwgNTUsIFNGSU5BRV9BY2Nlc3NDb250cm9sLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9ydmFsdWVfdG9fcmVmZXJlbmNlX3RlbXBfY29weV9ub192aWFibGUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAibm8gdmlhYmxlIGNvbnN0cnVjdG9yICVzZWxlY3R7Y29weWluZyB2YXJpYWJsZXxjb3B5aW5nIHBhcmFtZXRlcnxyZXR1cm5pbmcgb2JqZWN0fHRocm93aW5nIG9iamVjdHxjb3B5aW5nIG1lbWJlciBzdWJvYmplY3R8Y29weWluZyBhcnJheSBlbGVtZW50fGFsbG9jYXRpbmcgb2JqZWN0fGNvcHlpbmcgdGVtcG9yYXJ5fGluaXRpYWxpemluZyBiYXNlIHN1Ym9iamVjdHxpbml0aWFsaXppbmcgdmVjdG9yIGVsZW1lbnR8Y2FwdHVyaW5nIHZhbHVlfTAgb2YgdHlwZSAlMTsgQysrOTggcmVxdWlyZXMgYSBjb3B5IGNvbnN0cnVjdG9yIHdoZW4gYmluZGluZyBhIHJlZmVyZW5jZSB0byBhIHRlbXBvcmFyeSIsIDU1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X3NpemVvZl9hbGlnbm9mX2Z1bmN0aW9uX3R5cGUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiaW52YWxpZCBhcHBsaWNhdGlvbiBvZiAnJXNlbGVjdHtzaXplb2Z8YWxpZ25vZnx2ZWNfc3RlcH0wJyB0byBhIGZ1bmN0aW9uIHR5cGUiLCA1MDMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfc2l6ZW9mX2FsaWdub2Zfdm9pZF90eXBlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImludmFsaWQgYXBwbGljYXRpb24gb2YgJyVzZWxlY3R7c2l6ZW9mfGFsaWdub2Z8dmVjX3N0ZXB9MCcgdG8gYSB2b2lkIHR5cGUiLCA1MDMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfc3RhbmRhbG9uZV9zcGVjaWZpZXIsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJyUwJyBpcyBub3QgcGVybWl0dGVkIG9uIGEgZGVjbGFyYXRpb24gb2YgYSB0eXBlIiwgMzgzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X3N0YXJfdGhpc19sYW1iZGFfY2FwdHVyZV9jeHgxNywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJjYXB0dXJlIG9mICcqdGhpcycgYnkgY29weSBpcyBhIEMrKzE3IGV4dGVuc2lvbiIsIDg5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMykKK0RJQUcoZXh0X3N0YXRpY19hc3NlcnRfbm9fbWVzc2FnZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJzdGF0aWNfYXNzZXJ0IHdpdGggbm8gbWVzc2FnZSBpcyBhIEMrKzE3IGV4dGVuc2lvbiIsIDg5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X3N0YXRpY19kYXRhX21lbWJlcl9pbl91bmlvbiwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJzdGF0aWMgZGF0YSBtZW1iZXIgJTAgaW4gdW5pb24gaXMgYSBDKysxMSBleHRlbnNpb24iLCA3NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF9zdGF0aWNfbm9uX3N0YXRpYywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJyZWRlY2xhcmluZyBub24tc3RhdGljICUwIGFzIHN0YXRpYyBpcyBhIE1pY3Jvc29mdCBleHRlbnNpb24iLCAzNzEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfc3RyaW5nX2xpdGVyYWxfb3BlcmF0b3JfdGVtcGxhdGUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAic3RyaW5nIGxpdGVyYWwgb3BlcmF0b3IgdGVtcGxhdGVzIGFyZSBhIEdOVSBleHRlbnNpb24iLCAyNTcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfc3Vic2NyaXB0X25vbl9sdmFsdWUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiSVNPIEM5MCBkb2VzIG5vdCBhbGxvdyBzdWJzY3JpcHRpbmcgbm9uLWx2YWx1ZSBhcnJheSIsIDUwMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF90ZW1wbGF0ZV9hcmdfZXh0cmFfcGFyZW5zLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImFkZHJlc3Mgbm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnQgY2Fubm90IGJlIHN1cnJvdW5kZWQgYnkgcGFyZW50aGVzZXMiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X3RlbXBsYXRlX2FyZ19sb2NhbF90eXBlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInRlbXBsYXRlIGFyZ3VtZW50IHVzZXMgbG9jYWwgdHlwZSAlMCIsIDMzNiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF90ZW1wbGF0ZV9hcmdfb2JqZWN0X2ludGVybmFsLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm5vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50IHJlZmVycmluZyB0byAlc2VsZWN0e2Z1bmN0aW9ufG9iamVjdH0wICUxIHdpdGggaW50ZXJuYWwgbGlua2FnZSBpcyBhIEMrKzExIGV4dGVuc2lvbiIsIDc3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X3RlbXBsYXRlX2FyZ191bm5hbWVkX3R5cGUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidGVtcGxhdGUgYXJndW1lbnQgdXNlcyB1bm5hbWVkIHR5cGUiLCA2NjMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdGVtcGxhdGVfb3V0c2lkZV9vZl90ZW1wbGF0ZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIndGVtcGxhdGUnIGtleXdvcmQgb3V0c2lkZSBvZiBhIHRlbXBsYXRlIiwgNzcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdGVtcGxhdGVfcGFyYW1ldGVyX2RlZmF1bHRfaW5fZnVuY3Rpb25fdGVtcGxhdGUsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMgZm9yIGEgZnVuY3Rpb24gdGVtcGxhdGUgYXJlIGEgQysrMTEgZXh0ZW5zaW9uIiwgNzcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdHlwZWNoZWNrX2FkZHJvZl90ZW1wb3JhcnksIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInRha2luZyB0aGUgYWRkcmVzcyBvZiBhIHRlbXBvcmFyeSBvYmplY3Qgb2YgdHlwZSAlMCIsIDE0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X3R5cGVjaGVja19hZGRyb2Zfdm9pZCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJJU08gQyBmb3JiaWRzIHRha2luZyB0aGUgYWRkcmVzcyBvZiBhbiBleHByZXNzaW9uIG9mIHR5cGUgJ3ZvaWQnIiwgNTAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X3R5cGVjaGVja19iYXNlX3N1cGVyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJtZXRob2QgcGFyYW1ldGVyIHR5cGUgJWRpZmZ7JCBkb2VzIG5vdCBtYXRjaCBzdXBlciBjbGFzcyBtZXRob2QgcGFyYW1ldGVyIHR5cGUgJHxkb2VzIG5vdCBtYXRjaCBzdXBlciBjbGFzcyBtZXRob2QgcGFyYW1ldGVyIHR5cGV9MCwxIiwgNjA4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X3R5cGVjaGVja19jYXN0X25vbnNjYWxhciwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJDOTkgZm9yYmlkcyBjYXN0aW5nIG5vbnNjYWxhciB0eXBlICUwIHRvIHRoZSBzYW1lIHR5cGUiLCA1MDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdHlwZWNoZWNrX2Nhc3RfdG9fdW5pb24sIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiY2FzdCB0byB1bmlvbiB0eXBlIGlzIGEgR05VIGV4dGVuc2lvbiIsIDI1OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF90eXBlY2hlY2tfY29tcGFyaXNvbl9vZl9kaXN0aW5jdF9wb2ludGVycywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJjb21wYXJpc29uIG9mIGRpc3RpbmN0IHBvaW50ZXIgdHlwZXMlZGlmZnsgKCQgYW5kICQpfH0wLDEiLCAxMjQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdHlwZWNoZWNrX2NvbXBhcmlzb25fb2ZfZnB0cl90b192b2lkLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImVxdWFsaXR5IGNvbXBhcmlzb24gYmV0d2VlbiBmdW5jdGlvbiBwb2ludGVyIGFuZCB2b2lkIHBvaW50ZXIgKCUwIGFuZCAlMSkiLCA1MDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdHlwZWNoZWNrX2NvbXBhcmlzb25fb2ZfcG9pbnRlcl9pbnRlZ2VyLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNvbXBhcmlzb24gYmV0d2VlbiBwb2ludGVyIGFuZCBpbnRlZ2VyICglMCBhbmQgJTEpIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF90eXBlY2hlY2tfY29uZF9pbmNvbXBhdGlibGVfb3BlcmFuZHMsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW5jb21wYXRpYmxlIG9wZXJhbmQgdHlwZXMgKCUwIGFuZCAlMSkiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X3R5cGVjaGVja19jb25kX2luY29tcGF0aWJsZV9wb2ludGVycywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJwb2ludGVyIHR5cGUgbWlzbWF0Y2glZGlmZnsgKCQgYW5kICQpfH0wLDEiLCA1MDcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdHlwZWNoZWNrX2NvbmRfb25lX3ZvaWQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiQzk5IGZvcmJpZHMgY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMgd2l0aCBvbmx5IG9uZSB2b2lkIHNpZGUiLCA1MDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdHlwZWNoZWNrX2NvbmRfcG9pbnRlcl9pbnRlZ2VyX21pc21hdGNoLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInBvaW50ZXIvaW50ZWdlciB0eXBlIG1pc21hdGNoIGluIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24lZGlmZnsgKCQgYW5kICQpfH0wLDEiLCAxMjYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdHlwZWNoZWNrX2NvbnZlcnRfZGlzY2FyZHNfcXVhbGlmaWVycywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlc2VsZWN0eyVkaWZme2Fzc2lnbmluZyB0byAkIGZyb20gJHxhc3NpZ25pbmcgdG8gZGlmZmVyZW50IHR5cGVzfTAsMXwlZGlmZntwYXNzaW5nICQgdG8gcGFyYW1ldGVyIG9mIHR5cGUgJHxwYXNzaW5nIHRvIHBhcmFtZXRlciBvZiBkaWZmZXJlbnQgdHlwZX0wLDF8JWRpZmZ7cmV0dXJuaW5nICQgZnJvbSBhIGZ1bmN0aW9uIHdpdGggcmVzdWx0IHR5cGUgJHxyZXR1cm5pbmcgZnJvbSBmdW5jdGlvbiB3aXRoIGRpZmZlcmVudCByZXR1cm4gdHlwZX0wLDF8JWRpZmZ7Y29udmVydGluZyAkIHRvIHR5cGUgJHxjb252ZXJ0aW5nIGJldHdlZW4gdHlwZXN9MCwxfCVkaWZme2luaXRpYWxpemluZyAkIHdpdGggYW4gZXhwcmVzc2lvbiBvZiB0eXBlICR8aW5pdGlhbGl6aW5nIHdpdGggZXhwcmVzc2lvbiBvZiBkaWZmZXJlbnQgdHlwZX0wLDF8JWRpZmZ7c2VuZGluZyAkIHRvIHBhcmFtZXRlciBvZiB0eXBlICR8c2VuZGluZyB0byBwYXJhbWV0ZXIgb2YgZGlmZmVyZW50IHR5cGV9MCwxfCVkaWZme2Nhc3RpbmcgJCB0byB0eXBlICR8Y2FzdGluZyBiZXR3ZWVuIHR5cGVzfTAsMX0yIGRpc2NhcmRzIHF1YWxpZmllcnMiLCAyOTEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdHlwZWNoZWNrX2NvbnZlcnRfaW5jb21wYXRpYmxlX2Z1bmN0aW9uX3BvaW50ZXIsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW5jb21wYXRpYmxlIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZXMgJXNlbGVjdHslZGlmZnthc3NpZ25pbmcgdG8gJCBmcm9tICR8YXNzaWduaW5nIHRvIGRpZmZlcmVudCB0eXBlc30wLDF8JWRpZmZ7cGFzc2luZyAkIHRvIHBhcmFtZXRlciBvZiB0eXBlICR8cGFzc2luZyB0byBwYXJhbWV0ZXIgb2YgZGlmZmVyZW50IHR5cGV9MCwxfCVkaWZme3JldHVybmluZyAkIGZyb20gYSBmdW5jdGlvbiB3aXRoIHJlc3VsdCB0eXBlICR8cmV0dXJuaW5nIGZyb20gZnVuY3Rpb24gd2l0aCBkaWZmZXJlbnQgcmV0dXJuIHR5cGV9MCwxfCVkaWZme2NvbnZlcnRpbmcgJCB0byB0eXBlICR8Y29udmVydGluZyBiZXR3ZWVuIHR5cGVzfTAsMXwlZGlmZntpbml0aWFsaXppbmcgJCB3aXRoIGFuIGV4cHJlc3Npb24gb2YgdHlwZSAkfGluaXRpYWxpemluZyB3aXRoIGV4cHJlc3Npb24gb2YgZGlmZmVyZW50IHR5cGV9MCwxfCVkaWZme3NlbmRpbmcgJCB0byBwYXJhbWV0ZXIgb2YgdHlwZSAkfHNlbmRpbmcgdG8gcGFyYW1ldGVyIG9mIGRpZmZlcmVudCB0eXBlfTAsMXwlZGlmZntjYXN0aW5nICQgdG8gdHlwZSAkfGNhc3RpbmcgYmV0d2VlbiB0eXBlc30wLDF9MiVzZWxlY3R7fDsgZGVyZWZlcmVuY2Ugd2l0aCAqfDsgdGFrZSB0aGUgYWRkcmVzcyB3aXRoICZ8OyByZW1vdmUgKnw7IHJlbW92ZSAmfTMiLCAyODcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdHlwZWNoZWNrX2NvbnZlcnRfaW5jb21wYXRpYmxlX3BvaW50ZXIsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW5jb21wYXRpYmxlIHBvaW50ZXIgdHlwZXMgJXNlbGVjdHslZGlmZnthc3NpZ25pbmcgdG8gJCBmcm9tICR8YXNzaWduaW5nIHRvIGRpZmZlcmVudCB0eXBlc30wLDF8JWRpZmZ7cGFzc2luZyAkIHRvIHBhcmFtZXRlciBvZiB0eXBlICR8cGFzc2luZyB0byBwYXJhbWV0ZXIgb2YgZGlmZmVyZW50IHR5cGV9MCwxfCVkaWZme3JldHVybmluZyAkIGZyb20gYSBmdW5jdGlvbiB3aXRoIHJlc3VsdCB0eXBlICR8cmV0dXJuaW5nIGZyb20gZnVuY3Rpb24gd2l0aCBkaWZmZXJlbnQgcmV0dXJuIHR5cGV9MCwxfCVkaWZme2NvbnZlcnRpbmcgJCB0byB0eXBlICR8Y29udmVydGluZyBiZXR3ZWVuIHR5cGVzfTAsMXwlZGlmZntpbml0aWFsaXppbmcgJCB3aXRoIGFuIGV4cHJlc3Npb24gb2YgdHlwZSAkfGluaXRpYWxpemluZyB3aXRoIGV4cHJlc3Npb24gb2YgZGlmZmVyZW50IHR5cGV9MCwxfCVkaWZme3NlbmRpbmcgJCB0byBwYXJhbWV0ZXIgb2YgdHlwZSAkfHNlbmRpbmcgdG8gcGFyYW1ldGVyIG9mIGRpZmZlcmVudCB0eXBlfTAsMXwlZGlmZntjYXN0aW5nICQgdG8gdHlwZSAkfGNhc3RpbmcgYmV0d2VlbiB0eXBlc30wLDF9MiVzZWxlY3R7fDsgZGVyZWZlcmVuY2Ugd2l0aCAqfDsgdGFrZSB0aGUgYWRkcmVzcyB3aXRoICZ8OyByZW1vdmUgKnw7IHJlbW92ZSAmfTMiLCAyOTAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdHlwZWNoZWNrX2NvbnZlcnRfaW5jb21wYXRpYmxlX3BvaW50ZXJfc2lnbiwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlc2VsZWN0eyVkaWZme2Fzc2lnbmluZyB0byAkIGZyb20gJHxhc3NpZ25pbmcgdG8gZGlmZmVyZW50IHR5cGVzfTAsMXwlZGlmZntwYXNzaW5nICQgdG8gcGFyYW1ldGVyIG9mIHR5cGUgJHxwYXNzaW5nIHRvIHBhcmFtZXRlciBvZiBkaWZmZXJlbnQgdHlwZX0wLDF8JWRpZmZ7cmV0dXJuaW5nICQgZnJvbSBhIGZ1bmN0aW9uIHdpdGggcmVzdWx0IHR5cGUgJHxyZXR1cm5pbmcgZnJvbSBmdW5jdGlvbiB3aXRoIGRpZmZlcmVudCByZXR1cm4gdHlwZX0wLDF8JWRpZmZ7Y29udmVydGluZyAkIHRvIHR5cGUgJHxjb252ZXJ0aW5nIGJldHdlZW4gdHlwZXN9MCwxfCVkaWZme2luaXRpYWxpemluZyAkIHdpdGggYW4gZXhwcmVzc2lvbiBvZiB0eXBlICR8aW5pdGlhbGl6aW5nIHdpdGggZXhwcmVzc2lvbiBvZiBkaWZmZXJlbnQgdHlwZX0wLDF8JWRpZmZ7c2VuZGluZyAkIHRvIHBhcmFtZXRlciBvZiB0eXBlICR8c2VuZGluZyB0byBwYXJhbWV0ZXIgb2YgZGlmZmVyZW50IHR5cGV9MCwxfCVkaWZme2Nhc3RpbmcgJCB0byB0eXBlICR8Y2FzdGluZyBiZXR3ZWVuIHR5cGVzfTAsMX0yIGNvbnZlcnRzIGJldHdlZW4gcG9pbnRlcnMgdG8gaW50ZWdlciB0eXBlcyB3aXRoIGRpZmZlcmVudCBzaWduIiwgNTA1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X3R5cGVjaGVja19jb252ZXJ0X2ludF9wb2ludGVyLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImluY29tcGF0aWJsZSBpbnRlZ2VyIHRvIHBvaW50ZXIgY29udmVyc2lvbiAlc2VsZWN0eyVkaWZme2Fzc2lnbmluZyB0byAkIGZyb20gJHxhc3NpZ25pbmcgdG8gZGlmZmVyZW50IHR5cGVzfTAsMXwlZGlmZntwYXNzaW5nICQgdG8gcGFyYW1ldGVyIG9mIHR5cGUgJHxwYXNzaW5nIHRvIHBhcmFtZXRlciBvZiBkaWZmZXJlbnQgdHlwZX0wLDF8JWRpZmZ7cmV0dXJuaW5nICQgZnJvbSBhIGZ1bmN0aW9uIHdpdGggcmVzdWx0IHR5cGUgJHxyZXR1cm5pbmcgZnJvbSBmdW5jdGlvbiB3aXRoIGRpZmZlcmVudCByZXR1cm4gdHlwZX0wLDF8JWRpZmZ7Y29udmVydGluZyAkIHRvIHR5cGUgJHxjb252ZXJ0aW5nIGJldHdlZW4gdHlwZXN9MCwxfCVkaWZme2luaXRpYWxpemluZyAkIHdpdGggYW4gZXhwcmVzc2lvbiBvZiB0eXBlICR8aW5pdGlhbGl6aW5nIHdpdGggZXhwcmVzc2lvbiBvZiBkaWZmZXJlbnQgdHlwZX0wLDF8JWRpZmZ7c2VuZGluZyAkIHRvIHBhcmFtZXRlciBvZiB0eXBlICR8c2VuZGluZyB0byBwYXJhbWV0ZXIgb2YgZGlmZmVyZW50IHR5cGV9MCwxfCVkaWZme2Nhc3RpbmcgJCB0byB0eXBlICR8Y2FzdGluZyBiZXR3ZWVuIHR5cGVzfTAsMX0yJXNlbGVjdHt8OyBkZXJlZmVyZW5jZSB3aXRoICp8OyB0YWtlIHRoZSBhZGRyZXNzIHdpdGggJnw7IHJlbW92ZSAqfDsgcmVtb3ZlICZ9MyIsIDMwOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI0KQorRElBRyhleHRfdHlwZWNoZWNrX2NvbnZlcnRfcG9pbnRlcl9pbnQsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW5jb21wYXRpYmxlIHBvaW50ZXIgdG8gaW50ZWdlciBjb252ZXJzaW9uICVzZWxlY3R7JWRpZmZ7YXNzaWduaW5nIHRvICQgZnJvbSAkfGFzc2lnbmluZyB0byBkaWZmZXJlbnQgdHlwZXN9MCwxfCVkaWZme3Bhc3NpbmcgJCB0byBwYXJhbWV0ZXIgb2YgdHlwZSAkfHBhc3NpbmcgdG8gcGFyYW1ldGVyIG9mIGRpZmZlcmVudCB0eXBlfTAsMXwlZGlmZntyZXR1cm5pbmcgJCBmcm9tIGEgZnVuY3Rpb24gd2l0aCByZXN1bHQgdHlwZSAkfHJldHVybmluZyBmcm9tIGZ1bmN0aW9uIHdpdGggZGlmZmVyZW50IHJldHVybiB0eXBlfTAsMXwlZGlmZntjb252ZXJ0aW5nICQgdG8gdHlwZSAkfGNvbnZlcnRpbmcgYmV0d2VlbiB0eXBlc30wLDF8JWRpZmZ7aW5pdGlhbGl6aW5nICQgd2l0aCBhbiBleHByZXNzaW9uIG9mIHR5cGUgJHxpbml0aWFsaXppbmcgd2l0aCBleHByZXNzaW9uIG9mIGRpZmZlcmVudCB0eXBlfTAsMXwlZGlmZntzZW5kaW5nICQgdG8gcGFyYW1ldGVyIG9mIHR5cGUgJHxzZW5kaW5nIHRvIHBhcmFtZXRlciBvZiBkaWZmZXJlbnQgdHlwZX0wLDF8JWRpZmZ7Y2FzdGluZyAkIHRvIHR5cGUgJHxjYXN0aW5nIGJldHdlZW4gdHlwZXN9MCwxfTIlc2VsZWN0e3w7IGRlcmVmZXJlbmNlIHdpdGggKnw7IHRha2UgdGhlIGFkZHJlc3Mgd2l0aCAmfDsgcmVtb3ZlICp8OyByZW1vdmUgJn0zIiwgMzA5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjQpCitESUFHKGV4dF90eXBlY2hlY2tfY29udmVydF9wb2ludGVyX3ZvaWRfZnVuYywgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlc2VsZWN0eyVkaWZme2Fzc2lnbmluZyB0byAkIGZyb20gJHxhc3NpZ25pbmcgdG8gZGlmZmVyZW50IHR5cGVzfTAsMXwlZGlmZntwYXNzaW5nICQgdG8gcGFyYW1ldGVyIG9mIHR5cGUgJHxwYXNzaW5nIHRvIHBhcmFtZXRlciBvZiBkaWZmZXJlbnQgdHlwZX0wLDF8JWRpZmZ7cmV0dXJuaW5nICQgZnJvbSBhIGZ1bmN0aW9uIHdpdGggcmVzdWx0IHR5cGUgJHxyZXR1cm5pbmcgZnJvbSBmdW5jdGlvbiB3aXRoIGRpZmZlcmVudCByZXR1cm4gdHlwZX0wLDF8JWRpZmZ7Y29udmVydGluZyAkIHRvIHR5cGUgJHxjb252ZXJ0aW5nIGJldHdlZW4gdHlwZXN9MCwxfCVkaWZme2luaXRpYWxpemluZyAkIHdpdGggYW4gZXhwcmVzc2lvbiBvZiB0eXBlICR8aW5pdGlhbGl6aW5nIHdpdGggZXhwcmVzc2lvbiBvZiBkaWZmZXJlbnQgdHlwZX0wLDF8JWRpZmZ7c2VuZGluZyAkIHRvIHBhcmFtZXRlciBvZiB0eXBlICR8c2VuZGluZyB0byBwYXJhbWV0ZXIgb2YgZGlmZmVyZW50IHR5cGV9MCwxfCVkaWZme2Nhc3RpbmcgJCB0byB0eXBlICR8Y2FzdGluZyBiZXR3ZWVuIHR5cGVzfTAsMX0yIGNvbnZlcnRzIGJldHdlZW4gdm9pZCBwb2ludGVyIGFuZCBmdW5jdGlvbiBwb2ludGVyIiwgNTAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X3R5cGVjaGVja19kZWNsX2luY29tcGxldGVfdHlwZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ0ZW50YXRpdmUgZGVmaW5pdGlvbiBvZiB2YXJpYWJsZSB3aXRoIGludGVybmFsIGxpbmthZ2UgaGFzIGluY29tcGxldGUgbm9uLWFycmF5IHR5cGUgJTAiLCA2MjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdHlwZWNoZWNrX2luZGlyZWN0aW9uX3Rocm91Z2hfdm9pZF9wb2ludGVyLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIklTTyBDKysgZG9lcyBub3QgYWxsb3cgaW5kaXJlY3Rpb24gb24gb3BlcmFuZCBvZiB0eXBlICUwIiwgNzE1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X3R5cGVjaGVja19vcmRlcmVkX2NvbXBhcmlzb25fb2ZfZnVuY3Rpb25fcG9pbnRlcnMsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAib3JkZXJlZCBjb21wYXJpc29uIG9mIGZ1bmN0aW9uIHBvaW50ZXJzICglMCBhbmQgJTEpIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF90eXBlY2hlY2tfb3JkZXJlZF9jb21wYXJpc29uX29mX3BvaW50ZXJfYW5kX3plcm8sIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAib3JkZXJlZCBjb21wYXJpc29uIGJldHdlZW4gcG9pbnRlciBhbmQgemVybyAoJTAgYW5kICUxKSBpcyBhbiBleHRlbnNpb24iLCA1MDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdHlwZWNoZWNrX29yZGVyZWRfY29tcGFyaXNvbl9vZl9wb2ludGVyX2ludGVnZXIsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAib3JkZXJlZCBjb21wYXJpc29uIGJldHdlZW4gcG9pbnRlciBhbmQgaW50ZWdlciAoJTAgYW5kICUxKSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdHlwZWNoZWNrX3plcm9fYXJyYXlfc2l6ZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ6ZXJvIHNpemUgYXJyYXlzIGFyZSBhbiBleHRlbnNpb24iLCA3MjIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdHlwZWRlZl93aXRob3V0X2FfbmFtZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ0eXBlZGVmIHJlcXVpcmVzIGEgbmFtZSIsIDM4MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF90eXBlbmFtZV9taXNzaW5nLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm1pc3NpbmcgJ3R5cGVuYW1lJyBwcmlvciB0byBkZXBlbmRlbnQgdHlwZSBuYW1lICclMCUxJyIsIDYzOCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF90eXBlbmFtZV9vdXRzaWRlX29mX3RlbXBsYXRlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIid0eXBlbmFtZScgb2NjdXJzIG91dHNpZGUgb2YgYSB0ZW1wbGF0ZSIsIDc3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcoZXh0X3VuZGVjbGFyZWRfdW5xdWFsX2lkX3dpdGhfZGVwZW5kZW50X2Jhc2UsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidXNlIG9mIHVuZGVjbGFyZWQgaWRlbnRpZmllciAlMDsgdW5xdWFsaWZpZWQgbG9va3VwIGludG8gZGVwZW5kZW50IGJhc2VzIG9mIGNsYXNzIHRlbXBsYXRlICUxIGlzIGEgTWljcm9zb2Z0IGV4dGVuc2lvbiIsIDM3MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF91bmRlZmluZWRfaW50ZXJuYWxfdHlwZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJJU08gQysrIHJlcXVpcmVzIGEgZGVmaW5pdGlvbiBpbiB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgZm9yICVzZWxlY3R7ZnVuY3Rpb258dmFyaWFibGV9MCAlcTEgYmVjYXVzZSBpdHMgdHlwZSBkb2VzIG5vdCBoYXZlIGxpbmthZ2UiLCA2NDcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdW5lbGFib3JhdGVkX2ZyaWVuZF90eXBlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVuZWxhYm9yYXRlZCBmcmllbmQgZGVjbGFyYXRpb24gaXMgYSBDKysxMSBleHRlbnNpb247IHNwZWNpZnkgJyVzZWxlY3R7c3RydWN0fGludGVyZmFjZXx1bmlvbnxjbGFzc3xlbnVtfTAnIHRvIGJlZnJpZW5kICUxIiwgNzcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdW5pb25fbWVtYmVyX29mX3JlZmVyZW5jZV90eXBlLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVuaW9uIG1lbWJlciAlMCBoYXMgcmVmZXJlbmNlIHR5cGUgJTEsIHdoaWNoIGlzIGEgTWljcm9zb2Z0IGV4dGVuc2lvbiIsIDM3NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF91c2Vfb3V0X29mX3Njb3BlX2RlY2xhcmF0aW9uLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVzZSBvZiBvdXQtb2Ytc2NvcGUgZGVjbGFyYXRpb24gb2YgJTAlc2VsZWN0e3wgd2hvc2UgdHlwZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoYXQgb2YgYW4gaW1wbGljaXQgZGVjbGFyYXRpb259MSIsIDQ4MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF91c2luZ191bmRlZmluZWRfc3RkLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVzaW5nIGRpcmVjdGl2ZSByZWZlcnMgdG8gaW1wbGljaXRseS1kZWZpbmVkIG5hbWVzcGFjZSAnc3RkJyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdmFyaWFibGVfc2l6ZWRfdHlwZV9pbl9zdHJ1Y3QsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZmllbGQgJTAgd2l0aCB2YXJpYWJsZSBzaXplZCB0eXBlICUxIG5vdCBhdCB0aGUgZW5kIG9mIGEgc3RydWN0IG9yIGNsYXNzIGlzIGEgR05VIGV4dGVuc2lvbiIsIDI1OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF92YXJpYWJsZV90ZW1wbGF0ZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ2YXJpYWJsZSB0ZW1wbGF0ZXMgYXJlIGEgQysrMTQgZXh0ZW5zaW9uIiwgODUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdmFyaWFkaWNfbWFpbiwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICInbWFpbicgaXMgbm90IGFsbG93ZWQgdG8gYmUgZGVjbGFyZWQgdmFyaWFkaWMiLCAzNDIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdmxhLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInZhcmlhYmxlIGxlbmd0aCBhcnJheXMgYXJlIGEgQzk5IGZlYXR1cmUiLCA3MTQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhleHRfdmxhX2ZvbGRlZF90b19jb25zdGFudCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ2YXJpYWJsZSBsZW5ndGggYXJyYXkgZm9sZGVkIHRvIGNvbnN0YW50IGFycmF5IGFzIGFuIGV4dGVuc2lvbiIsIDI1MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKGV4dF93YXJuX2dudV9maW5hbCwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJfX2ZpbmFsIGlzIGEgR05VIGV4dGVuc2lvbiwgY29uc2lkZXIgdXNpbmcgQysrMTEgZmluYWwiLCAyMzMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX2FjY2Vzc19jb25zdHJhaW5lZF9ieV9wYXRoLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY29uc3RyYWluZWQgYnkgJXNlbGVjdHt8aW1wbGljaXRseSB9MSVzZWxlY3R7cHJpdmF0ZXxwcm90ZWN0ZWR9MCBpbmhlcml0YW5jZSBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfYWNjZXNzX25hdHVyYWwsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e3xpbXBsaWNpdGx5IH0xZGVjbGFyZWQgJXNlbGVjdHtwcml2YXRlfHByb3RlY3RlZH0wIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9hY2Nlc3NfcHJvdGVjdGVkX3Jlc3RyaWN0ZWRfY3RvcmR0b3IsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwcm90ZWN0ZWQgJXNlbGVjdHtjb25zdHJ1Y3RvcnxkZXN0cnVjdG9yfTAgY2FuIG9ubHkgYmUgdXNlZCB0byAlc2VsZWN0e2NvbnN0cnVjdHxkZXN0cm95fTAgYSBiYXNlIGNsYXNzIHN1Ym9iamVjdCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2FjY2Vzc19wcm90ZWN0ZWRfcmVzdHJpY3RlZF9ub29iamVjdCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm11c3QgbmFtZSBtZW1iZXIgdXNpbmcgdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgY29udGV4dCAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2FjY2Vzc19wcm90ZWN0ZWRfcmVzdHJpY3RlZF9vYmplY3QsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjYW4gb25seSBhY2Nlc3MgdGhpcyBtZW1iZXIgb24gYW4gb2JqZWN0IG9mIHR5cGUgJTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9hZGRfc3ludGhlc2l6ZV9kaXJlY3RpdmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJhZGQgYSAnQHN5bnRoZXNpemUnIGRpcmVjdGl2ZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2FkZGl0aW9uYWxfcGFyZW5zX2Zvcl92YXJpYWJsZV9kZWNsYXJhdGlvbiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImFkZCBhIHBhaXIgb2YgcGFyZW50aGVzZXMgdG8gZGVjbGFyZSBhIHZhcmlhYmxlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfYWRkcm9mX292bF9jYW5kaWRhdGVfZGlzYWJsZWRfYnlfZW5hYmxlX2lmX2F0dHIsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjYW5kaWRhdGUgZnVuY3Rpb24gbWFkZSBpbmVsaWdpYmxlIGJ5IGVuYWJsZV9pZiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2FsaWduYXNfb25fZGVjbGFyYXRpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJkZWNsYXJlZCB3aXRoICUwIGF0dHJpYnV0ZSBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfYWxsb2NhdGVkX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJhbGxvY2F0ZWQgd2l0aCAnbmV3JXNlbGVjdHtbXXx9MCcgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2FtYmlnX21lbWJlcl9yZWZfb2JqZWN0X3R5cGUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJsb29rdXAgaW4gdGhlIG9iamVjdCB0eXBlICUwIHJlZmVycyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfYW1iaWdfbWVtYmVyX3JlZl9zY29wZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImxvb2t1cCBmcm9tIHRoZSBjdXJyZW50IHNjb3BlIHJlZmVycyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfYW1iaWd1b3VzX2NhbmRpZGF0ZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSBmb3VuZCBieSBuYW1lIGxvb2t1cCBpcyAlcTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9hbWJpZ3VvdXNfaW5oZXJpdGVkX2NvbnN0cnVjdG9yX3VzaW5nLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW5oZXJpdGVkIGZyb20gYmFzZSBjbGFzcyAlMCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfYW1iaWd1b3VzX21lbWJlcl9mb3VuZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm1lbWJlciBmb3VuZCBieSBhbWJpZ3VvdXMgbmFtZSBsb29rdXAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9hbWJpZ3VvdXNfdHlwZV9jb252ZXJzaW9uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYmVjYXVzZSBvZiBhbWJpZ3VpdHkgaW4gY29udmVyc2lvbiAlZGlmZntvZiAkIHRvICR8YmV0d2VlbiB0eXBlc30wLDEiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9hcmNfYnJpZGdlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidXNlIF9fYnJpZGdlIHRvIGNvbnZlcnQgZGlyZWN0bHkgKG5vIGNoYW5nZSBpbiBvd25lcnNoaXApIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDcpCitESUFHKG5vdGVfYXJjX2JyaWRnZV9yZXRhaW5lZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInVzZSAlc2VsZWN0e19fYnJpZGdlX3JldGFpbmVkfENGQnJpZGdpbmdSZXRhaW4gY2FsbH0xIHRvIG1ha2UgYW4gQVJDIG9iamVjdCBhdmFpbGFibGUgYXMgYSArMSAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA3KQorRElBRyhub3RlX2FyY19icmlkZ2VfdHJhbnNmZXIsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ1c2UgJXNlbGVjdHtfX2JyaWRnZV90cmFuc2ZlcnxDRkJyaWRnaW5nUmVsZWFzZSBjYWxsfTEgdG8gdHJhbnNmZXIgb3duZXJzaGlwIG9mIGEgKzEgJTAgaW50byBBUkMiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNykKK0RJQUcobm90ZV9hcmNfY3N0eWxlX2JyaWRnZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInVzZSBfX2JyaWRnZSB3aXRoIEMtc3R5bGUgY2FzdCB0byBjb252ZXJ0IGRpcmVjdGx5IChubyBjaGFuZ2UgaW4gb3duZXJzaGlwKSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA3KQorRElBRyhub3RlX2FyY19jc3R5bGVfYnJpZGdlX3JldGFpbmVkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidXNlIF9fYnJpZGdlX3JldGFpbmVkIHdpdGggQy1zdHlsZSBjYXN0IHRvIG1ha2UgYW4gQVJDIG9iamVjdCBhdmFpbGFibGUgYXMgYSArMSAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA3KQorRElBRyhub3RlX2FyY19jc3R5bGVfYnJpZGdlX3RyYW5zZmVyLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidXNlIF9fYnJpZGdlX3RyYW5zZmVyIHdpdGggQy1zdHlsZSBjYXN0IHRvIHRyYW5zZmVyIG93bmVyc2hpcCBvZiBhICsxICUwIGludG8gQVJDIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDcpCitESUFHKG5vdGVfYXJjX2ZpZWxkX3dpdGhfb3duZXJzaGlwLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZmllbGQgaGFzIG5vbi10cml2aWFsIG93bmVyc2hpcCBxdWFsaWZpY2F0aW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEwKQorRElBRyhub3RlX2FyY19mb3JiaWRkZW5fdHlwZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRlY2xhcmF0aW9uIHVzZXMgdHlwZSB0aGF0IGlzIGlsbC1mb3JtZWQgaW4gQVJDIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEwKQorRElBRyhub3RlX2FyY19nYWluZWRfbWV0aG9kX2NvbnZlbnRpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJkZWNsYXJhdGlvbiBpbiBpbnRlcmZhY2UgaXMgbm90IGluIHRoZSAnJXNlbGVjdHthbGxvY3xjb3B5fGluaXR8bmV3fTAnIGZhbWlseSBiZWNhdXNlICVzZWxlY3R7aXRzIHJlc3VsdCB0eXBlIGlzIG5vdCBhbiBvYmplY3QgcG9pbnRlcnxpdHMgcmVzdWx0IHR5cGUgaXMgdW5yZWxhdGVkIHRvIGl0cyByZWNlaXZlciB0eXBlfTEiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNSkKK0RJQUcobm90ZV9hcmNfaW5pdF9yZXR1cm5zX3VucmVsYXRlZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImluaXQgbWV0aG9kIG11c3QgcmV0dXJuIGEgdHlwZSByZWxhdGVkIHRvIGl0cyByZWNlaXZlciB0eXBlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEwKQorRElBRyhub3RlX2FyY19sb3N0X21ldGhvZF9jb252ZW50aW9uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZGVjbGFyYXRpb24gaW4gaW50ZXJmYWNlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDUpCitESUFHKG5vdGVfYXJjX3JldGFpbl9jeWNsZV9vd25lciwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImJsb2NrIHdpbGwgYmUgcmV0YWluZWQgYnkgJXNlbGVjdHt0aGUgY2FwdHVyZWQgb2JqZWN0fGFuIG9iamVjdCBzdHJvbmdseSByZXRhaW5lZCBieSB0aGUgY2FwdHVyZWQgb2JqZWN0fTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjYpCitESUFHKG5vdGVfYXJjX3dlYWtfYWxzb19hY2Nlc3NlZF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYWxzbyBhY2Nlc3NlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfYXJjX3dlYWtfZGlzYWJsZWQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJkZWNsYXJhdGlvbiB1c2VzIF9fd2VhaywgYnV0IEFSQyBpcyBkaXNhYmxlZCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxMCkKK0RJQUcobm90ZV9hcmNfd2Vha19ub19ydW50aW1lLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZGVjbGFyYXRpb24gdXNlcyBfX3dlYWssIHdoaWNoIHRoZSBjdXJyZW50IGRlcGxveW1lbnQgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTApCitESUFHKG5vdGVfYXJyYXlfaW5kZXhfb3V0X29mX2JvdW5kcywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImFycmF5ICUwIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9hcnJheV9zaXplX2NvbnZlcnNpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjb252ZXJzaW9uIHRvICVzZWxlY3R7aW50ZWdyYWx8ZW51bWVyYXRpb259MCB0eXBlICUxIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9hc21faW5wdXRfZHVwbGljYXRlX2ZpcnN0LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY29uc3RyYWludCAnJTAnIGlzIGFscmVhZHkgcHJlc2VudCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEyKQorRElBRyhub3RlX2FzbV9taXNzaW5nX2NvbnN0cmFpbnRfbW9kaWZpZXIsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ1c2UgY29uc3RyYWludCBtb2RpZmllciBcIiUwXCIiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTIpCitESUFHKG5vdGVfYXNzaWduX2xoc19pbmNvbXBsZXRlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidHlwZSAlMCBpcyBpbmNvbXBsZXRlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfYXRvbWljX3Byb3BlcnR5X2ZpeHVwX3N1Z2dlc3QsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJzZXR0ZXIgYW5kIGdldHRlciBtdXN0IGJvdGggYmUgc3ludGhlc2l6ZWQsIG9yIGJvdGggYmUgdXNlciBkZWZpbmVkLG9yIHRoZSBwcm9wZXJ0eSBtdXN0IGJlIG5vbmF0b21pYyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2F0dHJpYnV0ZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImF0dHJpYnV0ZSBpcyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfYXR0cmlidXRlX292ZXJsb2FkYWJsZV9wcmV2X292ZXJsb2FkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJldmlvdXMgJXNlbGVjdHt1bm1hcmtlZCB8fTBvdmVybG9hZCBvZiBmdW5jdGlvbiBpcyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfYXV0b19yZWFkb25seV9pYm91dGxldF9maXh1cF9zdWdnZXN0LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJvcGVydHkgc2hvdWxkIGJlIGNoYW5nZWQgdG8gYmUgcmVhZHdyaXRlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfYXZhaWxhYmlsaXR5X3NwZWNpZmllZF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJTAgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgJXNlbGVjdHt1bmF2YWlsYWJsZXxkZWxldGVkfGRlcHJlY2F0ZWR8cGFydGlhbH0xIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9hd2FpdF9yZWFkeV9ub19ib29sX2NvbnZlcnNpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJyZXR1cm4gdHlwZSBvZiAnYXdhaXRfcmVhZHknIGlzIHJlcXVpcmVkIHRvIGJlIGNvbnRleHR1YWxseSBjb252ZXJ0aWJsZSB0byAnYm9vbCciLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTQpCitESUFHKG5vdGVfYmFkX21lbWFjY2Vzc19zaWxlbmNlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZXhwbGljaXRseSBjYXN0IHRoZSBwb2ludGVyIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfYmFzZV9jbGFzc19zcGVjaWZpZWRfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImJhc2UgY2xhc3MgJTAgc3BlY2lmaWVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9iaXRmaWVsZF9kZWNsLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYml0LWZpZWxkIGlzIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9ibG9ja192YXJfZml4aXRfYWRkX2luaXRpYWxpemF0aW9uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZGlkIHlvdSBtZWFuIHRvIHVzZSBfX2Jsb2NrICUwPyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2NhbGxlZF9ieSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbGxlZCBieSAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2NhbGxlZV9kZWNsLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJTAgZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2NhbGxlZV9zdGF0aWNfYXJyYXksIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjYWxsZWUgZGVjbGFyZXMgYXJyYXkgcGFyYW1ldGVyIGFzIHN0YXRpYyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfY2Fycmllc19kZXBlbmRlbmN5X21pc3NpbmdfZmlyc3RfZGVjbCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRlY2xhcmF0aW9uIG1pc3NpbmcgJ1tbY2Fycmllc19kZXBlbmRlbmN5XV0nIGF0dHJpYnV0ZSBpcyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfY2FzdF90b192b2lkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FzdCBleHByZXNzaW9uIHRvIHZvaWQgdG8gc2lsZW5jZSB3YXJuaW5nIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfY2hhbmdlX2JpdGZpZWxkX3NpZ24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjb25zaWRlciBtYWtpbmcgdGhlIGJpdGZpZWxkIHR5cGUgJXNlbGVjdHt1bnNpZ25lZHxzaWduZWR9MCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2NoYW5nZV9jYWxsaW5nX2NvbnZfZml4aXQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjb25zaWRlciBkZWZpbmluZyAlMCB3aXRoIHRoZSAnJTEnIGNhbGxpbmcgY29udmVudGlvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2NsYXNzX2RlY2xhcmVkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2xhc3MgaXMgZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2NvY29hX25hbWluZ19kZWNsYXJlX2ZhbWlseSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImV4cGxpY2l0bHkgZGVjbGFyZSBnZXR0ZXIgJW9iamNpbnN0YW5jZTAgd2l0aCAnJTEnIHRvIHJldHVybiBhbiAndW5vd25lZCcgb2JqZWN0IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfY29sbGFwc2VfbG9vcF9jb3VudCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInBhcmFtZXRlciBvZiB0aGUgJ2NvbGxhcHNlJyBjbGF1c2UiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTEpCitESUFHKG5vdGVfY29tcGF0X2Fzc29jLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY29tcGF0aWJsZSB0eXBlICUwIHNwZWNpZmllZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfY29uZGl0aW9uX2Fzc2lnbl9zaWxlbmNlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicGxhY2UgcGFyZW50aGVzZXMgYXJvdW5kIHRoZSBhc3NpZ25tZW50IHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfY29uZGl0aW9uX2Fzc2lnbl90b19jb21wYXJpc29uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidXNlICc9PScgdG8gdHVybiB0aGlzIGFzc2lnbm1lbnQgaW50byBhbiBlcXVhbGl0eSBjb21wYXJpc29uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfY29uZGl0aW9uX29yX2Fzc2lnbl90b19jb21wYXJpc29uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidXNlICchPScgdG8gdHVybiB0aGlzIGNvbXBvdW5kIGFzc2lnbm1lbnQgaW50byBhbiBpbmVxdWFsaXR5IGNvbXBhcmlzb24iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9jb25mbGljdGluZ19hdHRyaWJ1dGUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjb25mbGljdGluZyBhdHRyaWJ1dGUgaXMgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2NvbmZsaWN0aW5nX3RyeV9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY29uZmxpY3RpbmcgJTAgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2NvbnN0ZXhwcl9ib2R5X3ByZXZpb3VzX3JldHVybiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInByZXZpb3VzIHJldHVybiBzdGF0ZW1lbnQgaXMgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2NvbnN0ZXhwcl9jdG9yX21pc3NpbmdfaW5pdCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm1lbWJlciBub3QgaW5pdGlhbGl6ZWQgYnkgY29uc3RydWN0b3IiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9jb25zdGV4cHJfdmlydHVhbF9iYXNlX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ2aXJ0dWFsIGJhc2UgY2xhc3MgZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2NvbnZfZnVuY3Rpb25fZGVjbGFyZWRfYXQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ0eXBlIGNvbnZlcnNpb24gZnVuY3Rpb24gZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2NvbnZlcnRfaW5saW5lX3RvX3N0YXRpYywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInVzZSAnc3RhdGljJyB0byBnaXZlIGlubGluZSBmdW5jdGlvbiAlMCBpbnRlcm5hbCBsaW5rYWdlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfY29yb3V0aW5lX3Byb21pc2VfY2FsbF9pbXBsaWNpdGx5X3JlcXVpcmVkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FsbCB0byAlMCBpbXBsaWNpdGx5IHJlcXVpcmVkIGJ5IGNvcm91dGluZSBmdW5jdGlvbiBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDE0KQorRElBRyhub3RlX2Nvcm91dGluZV9wcm9taXNlX2ltcGxpY2l0X2F3YWl0X3RyYW5zZm9ybV9yZXF1aXJlZF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FsbCB0byAnYXdhaXRfdHJhbnNmb3JtJyBpbXBsaWNpdGx5IHJlcXVpcmVkIGJ5ICdjb19hd2FpdCcgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxNCkKK0RJQUcobm90ZV9jb3JvdXRpbmVfcHJvbWlzZV9zdXNwZW5kX2ltcGxpY2l0bHlfcmVxdWlyZWQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjYWxsIHRvICclc2VsZWN0e2luaXRpYWxfc3VzcGVuZHxmaW5hbF9zdXNwZW5kfTAnIGltcGxpY2l0bHkgcmVxdWlyZWQgYnkgdGhlICVzZWxlY3R7aW5pdGlhbCBzdXNwZW5kIHBvaW50fGZpbmFsIHN1c3BlbmQgcG9pbnR9MCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxNCkKK0RJQUcobm90ZV9jdWRhX2NvbmZsaWN0aW5nX2RldmljZV9mdW5jdGlvbl9kZWNsYXJlZF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY29uZmxpY3RpbmcgX19kZXZpY2VfXyBmdW5jdGlvbiBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfY3VkYV9vdmxfY2FuZGlkYXRlX3RhcmdldF9taXNtYXRjaCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSB0ZW1wbGF0ZSBpZ25vcmVkOiB0YXJnZXQgYXR0cmlidXRlcyBkbyBub3QgbWF0Y2giLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9kZWNsX3VuZ3VhcmRlZF9hdmFpbGFiaWxpdHlfc2lsZW5jZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImFubm90YXRlICVzZWxlY3R7JTF8YW5vbnltb3VzICUxfTAgd2l0aCBhbiBhdmFpbGFiaWxpdHkgYXR0cmlidXRlIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZGVjbGFyYXRpb25fbm90X2FfcHJvdG90eXBlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidGhpcyBkZWNsYXJhdGlvbiBpcyBub3QgYSBwcm90b3R5cGU7IGFkZCAndm9pZCcgdG8gbWFrZSBpdCBhIHByb3RvdHlwZSBmb3IgYSB6ZXJvLXBhcmFtZXRlciBmdW5jdGlvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2RlY2xhcmVfcGFyYW1ldGVyX2F1dG9yZWxlYXNpbmcsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJkZWNsYXJlIHRoZSBwYXJhbWV0ZXIgX19hdXRvcmVsZWFzaW5nIGV4cGxpY2l0bHkgdG8gc3VwcHJlc3MgdGhpcyB3YXJuaW5nIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDUpCitESUFHKG5vdGVfZGVjbGFyZV9wYXJhbWV0ZXJfc3Ryb25nLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZGVjbGFyZSB0aGUgcGFyYW1ldGVyIF9fc3Ryb25nIG9yIGNhcHR1cmUgYSBfX2Jsb2NrIF9fc3Ryb25nIHZhcmlhYmxlIHRvIGtlZXAgdmFsdWVzIGFsaXZlIGFjcm9zcyBhdXRvcmVsZWFzZSBwb29scyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA1KQorRElBRyhub3RlX2RlY2xhcmVkX2Nvcm91dGluZV9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZnVuY3Rpb24gaXMgYSBjb3JvdXRpbmUgZHVlIHRvIHVzZSBvZiAnJTAnIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTQpCitESUFHKG5vdGVfZGVjbGFyZWRfbm9ubnVsbCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRlY2xhcmVkICVzZWxlY3R7J3JldHVybnNfbm9ubnVsbCd8J25vbm51bGwnfTAgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2RlY2xhcmVkX3JlcXVpcmVkX2NvbnN0YW50X2luaXRfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInJlcXVpcmVkIGJ5ICdyZXF1aXJlX2NvbnN0YW50X2luaXRpYWxpemF0aW9uJyBhdHRyaWJ1dGUgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2RlZHVjZWRfdGVtcGxhdGVfYXJnX3N1YnN0aXR1dGlvbl9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZHVyaW5nIHRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbiBmb3IgJXNlbGVjdHtjbGFzc3x2YXJpYWJsZX0wIHRlbXBsYXRlICVzZWxlY3R7cGFydGlhbCBzcGVjaWFsaXphdGlvbiB8fTElMiAlMyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2RlZmF1bHRfYXJnX2luc3RhbnRpYXRpb25faGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImluIGluc3RhbnRpYXRpb24gb2YgZGVmYXVsdCBhcmd1bWVudCBmb3IgJyUwJyByZXF1aXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZGVmYXVsdF9hcmd1bWVudF9kZWNsYXJlZF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZGVmYXVsdCBhcmd1bWVudCBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZGVmYXVsdF9mdW5jdGlvbl9hcmdfaW5zdGFudGlhdGlvbl9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW4gaW5zdGFudGlhdGlvbiBvZiBkZWZhdWx0IGZ1bmN0aW9uIGFyZ3VtZW50IGV4cHJlc3Npb24gZm9yICclMCcgcmVxdWlyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2RlZmluZWRfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiUwIGRlZmluZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2RlbGV0ZV9jb252ZXJzaW9uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY29udmVyc2lvbiB0byBwb2ludGVyIHR5cGUgJTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9kZWxldGVfbm9uX3ZpcnR1YWwsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJxdWFsaWZ5IGNhbGwgdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmciLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9kZWxldGVkX2Fzc2lnbl9maWVsZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiVzZWxlY3R7Y29weXxtb3ZlfTAgYXNzaWdubWVudCBvcGVyYXRvciBvZiAlMSBpcyBpbXBsaWNpdGx5IGRlbGV0ZWQgYmVjYXVzZSBmaWVsZCAlMiBpcyBvZiAlc2VsZWN0e3JlZmVyZW5jZXxjb25zdC1xdWFsaWZpZWR9NCB0eXBlICUzIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZGVsZXRlZF9jb3B5X2N0b3JfcnZhbHVlX3JlZmVyZW5jZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNvcHkgY29uc3RydWN0b3Igb2YgJTAgaXMgaW1wbGljaXRseSBkZWxldGVkIGJlY2F1c2UgZmllbGQgJTEgaXMgb2YgcnZhbHVlIHJlZmVyZW5jZSB0eXBlICUyIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZGVsZXRlZF9jb3B5X3VzZXJfZGVjbGFyZWRfbW92ZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNvcHkgJXNlbGVjdHtjb25zdHJ1Y3Rvcnxhc3NpZ25tZW50IG9wZXJhdG9yfTAgaXMgaW1wbGljaXRseSBkZWxldGVkIGJlY2F1c2UgJTEgaGFzIGEgdXNlci1kZWNsYXJlZCBtb3ZlICVzZWxlY3R7Y29uc3RydWN0b3J8YXNzaWdubWVudCBvcGVyYXRvcn0yIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZGVsZXRlZF9kZWZhdWx0X2N0b3JfYWxsX2NvbnN0LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJXNlbGVjdHtkZWZhdWx0IGNvbnN0cnVjdG9yIG9mfGNvbnN0cnVjdG9yIGluaGVyaXRlZCBieX0wICUxIGlzIGltcGxpY2l0bHkgZGVsZXRlZCBiZWNhdXNlIGFsbCAlc2VsZWN0e2RhdGEgbWVtYmVyc3xkYXRhIG1lbWJlcnMgb2YgYW4gYW5vbnltb3VzIHVuaW9uIG1lbWJlcn0yIGFyZSBjb25zdC1xdWFsaWZpZWQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9kZWxldGVkX2RlZmF1bHRfY3Rvcl91bmluaXRfZmllbGQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e2RlZmF1bHQgY29uc3RydWN0b3Igb2Z8Y29uc3RydWN0b3IgaW5oZXJpdGVkIGJ5fTAgJTEgaXMgaW1wbGljaXRseSBkZWxldGVkIGJlY2F1c2UgZmllbGQgJTIgb2YgJXNlbGVjdHtyZWZlcmVuY2V8Y29uc3QtcXVhbGlmaWVkfTQgdHlwZSAlMyB3b3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9kZWxldGVkX2R0b3Jfbm9fb3BlcmF0b3JfZGVsZXRlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidmlydHVhbCBkZXN0cnVjdG9yIHJlcXVpcmVzIGFuIHVuYW1iaWd1b3VzLCBhY2Nlc3NpYmxlICdvcGVyYXRvciBkZWxldGUnIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZGVsZXRlZF9zcGVjaWFsX21lbWJlcl9jbGFzc19zdWJvYmplY3QsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e2RlZmF1bHQgY29uc3RydWN0b3Igb2Z8Y29weSBjb25zdHJ1Y3RvciBvZnxtb3ZlIGNvbnN0cnVjdG9yIG9mfGNvcHkgYXNzaWdubWVudCBvcGVyYXRvciBvZnxtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3Igb2Z8ZGVzdHJ1Y3RvciBvZnxjb25zdHJ1Y3RvciBpbmhlcml0ZWQgYnl9MCAlMSBpcyBpbXBsaWNpdGx5IGRlbGV0ZWQgYmVjYXVzZSAlc2VsZWN0e2Jhc2UgY2xhc3MgJTN8JXNlbGVjdHt8fHx8dmFyaWFudCB9NGZpZWxkICUzfTIgaGFzICVzZWxlY3R7bm98YSBkZWxldGVkfG11bHRpcGxlfGFuIGluYWNjZXNzaWJsZXxhIG5vbi10cml2aWFsfTQgJXNlbGVjdHslc2VsZWN0e2RlZmF1bHQgY29uc3RydWN0b3J8Y29weSBjb25zdHJ1Y3Rvcnxtb3ZlIGNvbnN0cnVjdG9yfGNvcHkgYXNzaWdubWVudCBvcGVyYXRvcnxtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3J8ZGVzdHJ1Y3Rvcnwlc2VsZWN0e2RlZmF1bHR8Y29ycmVzcG9uZGluZ3xkZWZhdWx0fGRlZmF1bHR8ZGVmYXVsdH00IGNvbnN0cnVjdG9yfTB8ZGVzdHJ1Y3Rvcn01JXNlbGVjdHt8fHN8fH00IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZGVwZW5kZW50X25vbl90eXBlX2RlZmF1bHRfYXJnX2luX3BhcnRpYWxfc3BlYywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInRlbXBsYXRlIHBhcmFtZXRlciBpcyB1c2VkIGluIGRlZmF1bHQgYXJndW1lbnQgZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2RlcGVuZGVudF92YXJfdXNlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAibXVzdCBxdWFsaWZ5IGlkZW50aWZpZXIgdG8gZmluZCB0aGlzIGRlY2xhcmF0aW9uIGluIGRlcGVuZGVudCBiYXNlIGNsYXNzIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZGVzdHJ1Y3Rvcl90eXBlX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ0eXBlICUwIGlzIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9kdWVfdG9fZGxsZXhwb3J0ZWRfY2xhc3MsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJkdWUgdG8gJTAgYmVpbmcgZGxsZXhwb3J0ZWQlc2VsZWN0e3w7IHRyeSBjb21waWxpbmcgaW4gQysrMTEgbW9kZX0xIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZHVwbGljYXRlX2VsZW1lbnQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJlbGVtZW50ICUwIGFsc28gaGFzIHZhbHVlICUxIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZW1wdHlfYm9keV9vbl9zZXBhcmF0ZV9saW5lLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHV0IHRoZSBzZW1pY29sb24gb24gYSBzZXBhcmF0ZSBsaW5lIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZW1wdHlfcGFyZW5zX2RlZmF1bHRfY3RvciwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInJlbW92ZSBwYXJlbnRoZXNlcyB0byBkZWNsYXJlIGEgdmFyaWFibGUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9lbXB0eV9wYXJlbnNfZnVuY3Rpb25fY2FsbCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNoYW5nZSB0aGlzICcsJyB0byBhICc7JyB0byBjYWxsICUwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZW1wdHlfcGFyZW5zX3plcm9faW5pdGlhbGl6ZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInJlcGxhY2UgcGFyZW50aGVzZXMgd2l0aCBhbiBpbml0aWFsaXplciB0byBkZWNsYXJlIGEgdmFyaWFibGUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9lbnRlcnNfYmxvY2tfY2FwdHVyZXNfY3h4X29iaiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImp1bXAgZW50ZXJzIGxpZmV0aW1lIG9mIGJsb2NrIHdoaWNoIGNhcHR1cmVzIGEgZGVzdHJ1Y3RpYmxlIEMrKyBvYmplY3QiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9lbnRlcnNfYmxvY2tfY2FwdHVyZXNfbm9uX3RyaXZpYWxfY19zdHJ1Y3QsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGVudGVycyBsaWZldGltZSBvZiBibG9jayB3aGljaCBjYXB0dXJlcyBhIEMgc3RydWN0IHRoYXQgaXMgbm9uLXRyaXZpYWwgdG8gZGVzdHJveSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2VudGVyc19ibG9ja19jYXB0dXJlc19zdHJvbmcsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGVudGVycyBsaWZldGltZSBvZiBibG9jayB3aGljaCBzdHJvbmdseSBjYXB0dXJlcyBhIHZhcmlhYmxlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZW50ZXJzX2Jsb2NrX2NhcHR1cmVzX3dlYWssIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGVudGVycyBsaWZldGltZSBvZiBibG9jayB3aGljaCB3ZWFrbHkgY2FwdHVyZXMgYSB2YXJpYWJsZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2VudGl0eV9kZWNsYXJlZF9hdCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiUwIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9lbnVtX3NwZWNpYWxpemVkX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJlbnVtICUwIHdhcyBleHBsaWNpdGx5IHNwZWNpYWxpemVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9lcXVhbGl0eV9jb21wYXJpc29uX3NpbGVuY2UsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJyZW1vdmUgZXh0cmFuZW91cyBwYXJlbnRoZXNlcyBhcm91bmQgdGhlIGNvbXBhcmlzb24gdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmciLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9lcXVhbGl0eV9jb21wYXJpc29uX3RvX2Fzc2lnbiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInVzZSAnPScgdG8gdHVybiB0aGlzIGVxdWFsaXR5IGNvbXBhcmlzb24gaW50byBhbiBhc3NpZ25tZW50IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZXF1aXZhbGVudF9pbnRlcm5hbF9saW5rYWdlX2RlY2wsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJkZWNsYXJlZCBoZXJlJXNlbGVjdHsgaW4gbW9kdWxlICclMSd8fTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTMpCitESUFHKG5vdGVfZXZhbHVhdGVfY29tcGFyaXNvbl9maXJzdCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInBsYWNlIHBhcmVudGhlc2VzIGFyb3VuZCBjb21wYXJpc29uIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUgaXQgZmlyc3QiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9leGNlcHRpb25fc3BlY19kZXByZWNhdGVkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidXNlICclMCcgaW5zdGVhZCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2V4aXRzX19fYmxvY2ssIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGV4aXRzIHNjb3BlIG9mIF9fYmxvY2sgdmFyaWFibGUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9leGl0c19ibG9ja19jYXB0dXJlc19jeHhfb2JqLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAianVtcCBleGl0cyBsaWZldGltZSBvZiBibG9jayB3aGljaCBjYXB0dXJlcyBhIGRlc3RydWN0aWJsZSBDKysgb2JqZWN0IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZXhpdHNfYmxvY2tfY2FwdHVyZXNfbm9uX3RyaXZpYWxfY19zdHJ1Y3QsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGV4aXRzIGxpZmV0aW1lIG9mIGJsb2NrIHdoaWNoIGNhcHR1cmVzIGEgQyBzdHJ1Y3QgdGhhdCBpcyBub24tdHJpdmlhbCB0byBkZXN0cm95IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZXhpdHNfYmxvY2tfY2FwdHVyZXNfc3Ryb25nLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAianVtcCBleGl0cyBsaWZldGltZSBvZiBibG9jayB3aGljaCBzdHJvbmdseSBjYXB0dXJlcyBhIHZhcmlhYmxlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZXhpdHNfYmxvY2tfY2FwdHVyZXNfd2VhaywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImp1bXAgZXhpdHMgbGlmZXRpbWUgb2YgYmxvY2sgd2hpY2ggd2Vha2x5IGNhcHR1cmVzIGEgdmFyaWFibGUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9leGl0c19jbGVhbnVwLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAianVtcCBleGl0cyBzY29wZSBvZiB2YXJpYWJsZSB3aXRoIF9fYXR0cmlidXRlX18oKGNsZWFudXApKSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2V4aXRzX2N4eF9jYXRjaCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImp1bXAgZXhpdHMgY2F0Y2ggYmxvY2siLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9leGl0c19jeHhfdHJ5LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAianVtcCBleGl0cyB0cnkgYmxvY2siLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9leGl0c19kdG9yLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAianVtcCBleGl0cyBzY29wZSBvZiB2YXJpYWJsZSB3aXRoIG5vbi10cml2aWFsIGRlc3RydWN0b3IiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9leGl0c19vYmpjX2F1dG9yZWxlYXNlcG9vbCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImp1bXAgZXhpdHMgYXV0b3JlbGVhc2Vwb29sIGJsb2NrIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZXhpdHNfb2JqY19jYXRjaCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImp1bXAgZXhpdHMgQGNhdGNoIGJsb2NrIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZXhpdHNfb2JqY19maW5hbGx5LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAianVtcCBleGl0cyBAZmluYWxseSBibG9jayIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2V4aXRzX29iamNfc3Ryb25nLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAianVtcCBleGl0cyBzY29wZSBvZiBfX3N0cm9uZyB2YXJpYWJsZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2V4aXRzX29iamNfc3luY2hyb25pemVkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAianVtcCBleGl0cyBAc3luY2hyb25pemVkIGJsb2NrIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZXhpdHNfb2JqY190cnksIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGV4aXRzIEB0cnkgYmxvY2siLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9leGl0c19vYmpjX3dlYWssIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGV4aXRzIHNjb3BlIG9mIF9fd2VhayB2YXJpYWJsZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2V4aXRzX3NlaF9leGNlcHQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGV4aXRzIF9fZXhjZXB0IGJsb2NrIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZXhpdHNfc2VoX2ZpbmFsbHksIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGV4aXRzIF9fZmluYWxseSBibG9jayIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2V4aXRzX3NlaF90cnksIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGV4aXRzIF9fdHJ5IGJsb2NrIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZXhpdHNfdGVtcG9yYXJ5X2R0b3IsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGV4aXRzIHNjb3BlIG9mIGxpZmV0aW1lLWV4dGVuZGVkIHRlbXBvcmFyeSB3aXRoIG5vbi10cml2aWFsIGRlc3RydWN0b3IiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9leHBsaWNpdF9jdG9yX2RlZHVjdGlvbl9ndWlkZV9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZXhwbGljaXQgJXNlbGVjdHtjb25zdHJ1Y3RvcnxkZWR1Y3Rpb24gZ3VpZGV9MCBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZXhwbGljaXRfaW5zdGFudGlhdGlvbl9jYW5kaWRhdGUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJleHBsaWNpdCBpbnN0YW50aWF0aW9uIGNhbmRpZGF0ZSBmdW5jdGlvbiAlcTAgdGVtcGxhdGUgaGVyZSAlMSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2V4cGxpY2l0X2luc3RhbnRpYXRpb25fZGVmaW5pdGlvbl9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZXhwbGljaXQgaW5zdGFudGlhdGlvbiBkZWZpbml0aW9uIGlzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9leHBsaWNpdF9pbnN0YW50aWF0aW9uX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJleHBsaWNpdCBpbnN0YW50aWF0aW9uIHJlZmVycyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZXhwbGljaXRfc3BlY2lhbGl6YXRpb25fZGVjbGFyZWRfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9leHBsaWNpdF90ZW1wbGF0ZV9hcmdfc3Vic3RpdHV0aW9uX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ3aGlsZSBzdWJzdGl0dXRpbmcgZXhwbGljaXRseS1zcGVjaWZpZWQgdGVtcGxhdGUgYXJndW1lbnRzIGludG8gZnVuY3Rpb24gdGVtcGxhdGUgJTAgJTEiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9leHBsaWNpdF90ZW1wbGF0ZV9zcGVjX2RvZXNfbm90X25lZWRfaGVhZGVyLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJ3RlbXBsYXRlPD4nIGhlYWRlciBub3QgcmVxdWlyZWQgZm9yIGV4cGxpY2l0bHktc3BlY2lhbGl6ZWQgY2xhc3MgJTAgZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2V4dGVybl9jX2JlZ2luc19oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZXh0ZXJuIFwiQ1wiIGxhbmd1YWdlIGxpbmthZ2Ugc3BlY2lmaWNhdGlvbiBiZWdpbnMgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2V4dGVybl9jX2dsb2JhbF9jb25mbGljdCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRlY2xhcmVkICVzZWxlY3R7aW4gZ2xvYmFsIHNjb3BlfHdpdGggQyBsYW5ndWFnZSBsaW5rYWdlfTAgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2ZhbGx0aHJvdWdoX2luc2VydF9zZW1pX2ZpeGl0LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZGlkIHlvdSBmb3JnZXQgJzsnPyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2ZpZWxkX2Rlc2lnbmF0b3JfZm91bmQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJmaWVsZCBkZXNpZ25hdG9yIHJlZmVycyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZmluYWxfb3ZlcnJpZGVyLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZmluYWwgb3ZlcnJpZGVyIG9mICVxMCBpbiAlMSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2ZsZXhpYmxlX2FycmF5X21lbWJlciwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImluaXRpYWxpemVkIGZsZXhpYmxlIGFycmF5IG1lbWJlciAlMCBpcyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZm9yX3JhbmdlX2JlZ2luX2VuZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInNlbGVjdGVkICclc2VsZWN0e2JlZ2lufGVuZH0wJyAlc2VsZWN0e2Z1bmN0aW9ufHRlbXBsYXRlIH0xJTIgd2l0aCBpdGVyYXRvciB0eXBlICUzIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZm9yX3JhbmdlX2ludmFsaWRfaXRlcmF0b3IsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbiBpbXBsaWNpdCBjYWxsIHRvICdvcGVyYXRvciVzZWxlY3R7IT18KnwrK30wJyBmb3IgaXRlcmF0b3Igb2YgdHlwZSAlMSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2Zvcm1hdF9maXhfc3BlY2lmaWVyLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZGlkIHlvdSBtZWFuIHRvIHVzZSAnJTAnPyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2Zvcm1hdF9zZWN1cml0eV9maXhpdCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInRyZWF0IHRoZSBzdHJpbmcgYXMgYW4gYXJndW1lbnQgdG8gYXZvaWQgdGhpcyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2Zvcm1hdF9zdHJpbmdfZGVmaW5lZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImZvcm1hdCBzdHJpbmcgaXMgZGVmaW5lZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZm9yd2FyZF9jbGFzcywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImZvcndhcmQgZGVjbGFyYXRpb24gb2YgY2xhc3MgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2ZvcndhcmRfdGVtcGxhdGVfZGVjbCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImZvcndhcmQgZGVjbGFyYXRpb24gb2YgdGVtcGxhdGUgZW50aXR5IGlzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9mb3VuZF9tdXRleF9uZWFyX21hdGNoLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZm91bmQgbmVhciBtYXRjaCAnJTAnIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZnJvbV9kaWFnbm9zZV9pZiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImZyb20gJ2RpYWdub3NlX2lmJyBhdHRyaWJ1dGUgb24gJTA6IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZnVuY3Rpb25fc3R5bGVfY2FzdF9hZGRfcGFyZW50aGVzZXMsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJhZGQgZW5jbG9zaW5nIHBhcmVudGhlc2VzIHRvIHBlcmZvcm0gYSBmdW5jdGlvbi1zdHlsZSBjYXN0IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZnVuY3Rpb25fc3VnZ2VzdGlvbiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRpZCB5b3UgbWVhbiAlMD8iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9mdW5jdGlvbl90ZW1wbGF0ZV9kZWR1Y3Rpb25faW5zdGFudGlhdGlvbl9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAid2hpbGUgc3Vic3RpdHV0aW5nIGRlZHVjZWQgdGVtcGxhdGUgYXJndW1lbnRzIGludG8gZnVuY3Rpb24gdGVtcGxhdGUgJTAgJTEiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9mdW5jdGlvbl90ZW1wbGF0ZV9zcGVjX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbiBpbnN0YW50aWF0aW9uIG9mIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uICVxMCByZXF1ZXN0ZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2Z1bmN0aW9uX3RlbXBsYXRlX3NwZWNfbWF0Y2hlZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImZ1bmN0aW9uIHRlbXBsYXRlICVxMCBtYXRjaGVzIHNwZWNpYWxpemF0aW9uICUxIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZnVuY3Rpb25fdG9fZnVuY3Rpb25fY2FsbCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInN1ZmZpeCB3aXRoIHBhcmVudGhlc2VzIHRvIHR1cm4gdGhpcyBpbnRvIGEgZnVuY3Rpb24gY2FsbCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2Z1bmN0aW9uX3dhcm5pbmdfc2lsZW5jZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInByZWZpeCB3aXRoIHRoZSBhZGRyZXNzLW9mIG9wZXJhdG9yIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZ2V0dGVyX3VuYXZhaWxhYmxlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAib3IgYmVjYXVzZSBzZXR0ZXIgaXMgZGVjbGFyZWQgaGVyZSwgYnV0IG5vIGdldHRlciBtZXRob2QgJTAgaXMgZm91bmQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9nb3RvX21zX2FzbV9sYWJlbCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImlubGluZSBhc3NlbWJseSBsYWJlbCAlMCBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfZ3VhcmRlZF9ieV9kZWNsYXJlZF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiR3VhcmRlZF9ieSBkZWNsYXJlZCBoZXJlLiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2hpZGRlbl9vdmVybG9hZGVkX3ZpcnR1YWxfZGVjbGFyZWRfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImhpZGRlbiBvdmVybG9hZGVkIHZpcnR1YWwgZnVuY3Rpb24gJXEwIGRlY2xhcmVkIGhlcmUlc2VsZWN0e3w6IGRpZmZlcmVudCBjbGFzc2VzJWRpZmZ7ICgkIHZzICQpfH0yLDN8OiBkaWZmZXJlbnQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCUyIHZzICUzKXw6IHR5cGUgbWlzbWF0Y2ggYXQgJW9yZGluYWwyIHBhcmFtZXRlciVkaWZmeyAoJCB2cyAkKXx9Myw0fDogZGlmZmVyZW50IHJldHVybiB0eXBlJWRpZmZ7ICgkIHZzICQpfH0yLDN8OiBkaWZmZXJlbnQgcXVhbGlmaWVycyAoJXNlbGVjdHtub25lfGNvbnN0fHJlc3RyaWN0fGNvbnN0IGFuZCByZXN0cmljdHx2b2xhdGlsZXxjb25zdCBhbmQgdm9sYXRpbGV8dm9sYXRpbGUgYW5kIHJlc3RyaWN0fGNvbnN0LCB2b2xhdGlsZSwgYW5kIHJlc3RyaWN0fTIgdnMgJXNlbGVjdHtub25lfGNvbnN0fHJlc3RyaWN0fGNvbnN0IGFuZCByZXN0cmljdHx2b2xhdGlsZXxjb25zdCBhbmQgdm9sYXRpbGV8dm9sYXRpbGUgYW5kIHJlc3RyaWN0fGNvbnN0LCB2b2xhdGlsZSwgYW5kIHJlc3RyaWN0fTMpfDogZGlmZmVyZW50IGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uc30xIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfaGlkZGVuX3RhZywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInR5cGUgZGVjbGFyYXRpb24gaGlkZGVuIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfaGlkaW5nX29iamVjdCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRlY2xhcmF0aW9uIGhpZGVzIHR5cGUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9pY2VfY29udmVyc2lvbl9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY29udmVyc2lvbiB0byAlc2VsZWN0e2ludGVncmFsfGVudW1lcmF0aW9ufTAgdHlwZSAlMSBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfaWxsZWdhbF9maWVsZF9kZWNsYXJlZF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZmllbGQgb2YgaWxsZWdhbCAlc2VsZWN0e3R5cGV8cG9pbnRlciB0eXBlfTAgJTEgZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2ltcGxlbWVudGF0aW9uX2RlY2xhcmVkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2xhc3MgaW1wbGVtZW50YXRpb24gaXMgZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2ltcGxlbWVudGVkX2J5X2NsYXNzLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAid2hlbiBpbXBsZW1lbnRlZCBieSBjbGFzcyAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA5KQorRElBRyhub3RlX2ltcGxpY2l0X2RlbGV0ZV90aGlzX2luX2Rlc3RydWN0b3JfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIndoaWxlIGNoZWNraW5nIGltcGxpY2l0ICdkZWxldGUgdGhpcycgZm9yIHZpcnR1YWwgZGVzdHJ1Y3RvciIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2ltcGxpY2l0X21lbWJlcl90YXJnZXRfaW5mZXJfY29sbGlzaW9uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW1wbGljaXQgJXNlbGVjdHtkZWZhdWx0IGNvbnN0cnVjdG9yfGNvcHkgY29uc3RydWN0b3J8bW92ZSBjb25zdHJ1Y3Rvcnxjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3J8bW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yfGRlc3RydWN0b3J9MCBpbmZlcnJlZCB0YXJnZXQgY29sbGlzaW9uOiBjYWxsIHRvIGJvdGggJXNlbGVjdHtfX2RldmljZV9ffF9fZ2xvYmFsX198X19ob3N0X198X19ob3N0X18gX19kZXZpY2VfX30xIGFuZCAlc2VsZWN0e19fZGV2aWNlX198X19nbG9iYWxfX3xfX2hvc3RfX3xfX2hvc3RfXyBfX2RldmljZV9ffTIgbWVtYmVycyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2ltcGxpY2l0X3BhcmFtX2RlY2wsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlMCBpcyBhbiBpbXBsaWNpdCBwYXJhbWV0ZXIiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9pbXBsaWNpdGx5X2RlbGV0ZWQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJleHBsaWNpdGx5IGRlZmF1bHRlZCBmdW5jdGlvbiB3YXMgaW1wbGljaXRseSBkZWxldGVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9pbl9iaW5kaW5nX2RlY2xfaW5pdCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImluIGltcGxpY2l0IGluaXRpYWxpemF0aW9uIG9mIGJpbmRpbmcgZGVjbGFyYXRpb24gJTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9pbl9jbGFzc19pbml0aWFsaXplcl9mbG9hdF90eXBlX2N4eDExLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYWRkICdjb25zdGV4cHInIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfaW5fY2xhc3NfaW5pdGlhbGl6ZXJfbm90X3lldF9wYXJzZWQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJkZWZhdWx0IG1lbWJlciBpbml0aWFsaXplciBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfaW5fZGVjbGFyYXRpb25fb2ZfaW1wbGljaXRfc3BlY2lhbF9tZW1iZXIsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ3aGlsZSBkZWNsYXJpbmcgdGhlIGltcGxpY2l0ICVzZWxlY3R7ZGVmYXVsdCBjb25zdHJ1Y3Rvcnxjb3B5IGNvbnN0cnVjdG9yfG1vdmUgY29uc3RydWN0b3J8Y29weSBhc3NpZ25tZW50IG9wZXJhdG9yfG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcnxkZXN0cnVjdG9yfTEgZm9yICUwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfaW5fZm9yX3JhbmdlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAid2hlbiBsb29raW5nIHVwICclc2VsZWN0e2JlZ2lufGVuZH0wJyBmdW5jdGlvbiBmb3IgcmFuZ2UgZXhwcmVzc2lvbiBvZiB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfaW5fb21pdHRlZF9hZ2dyZWdhdGVfaW5pdGlhbGl6ZXIsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbiBpbXBsaWNpdCBpbml0aWFsaXphdGlvbiBvZiAlc2VsZWN0e2FycmF5IGVsZW1lbnQgJTEgd2l0aCBvbWl0dGVkIGluaXRpYWxpemVyfGZpZWxkICUxIHdpdGggb21pdHRlZCBpbml0aWFsaXplcnx0cmFpbGluZyBhcnJheSBlbGVtZW50cyBpbiBydW50aW1lLXNpemVkIGFycmF5IG5ld30wIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfaW5fcmVmZXJlbmNlX3RlbXBvcmFyeV9saXN0X2luaXRpYWxpemVyLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW4gaW5pdGlhbGl6YXRpb24gb2YgdGVtcG9yYXJ5IG9mIHR5cGUgJTAgY3JlYXRlZCB0byBsaXN0LWluaXRpYWxpemUgdGhpcyByZWZlcmVuY2UiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9pbmNsdWRlX2hlYWRlcl9vcl9kZWNsYXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW5jbHVkZSB0aGUgaGVhZGVyIDwlMD4gb3IgZXhwbGljaXRseSBwcm92aWRlIGEgZGVjbGFyYXRpb24gZm9yICclMSciLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9pbmNvbXBsZXRlX2NsYXNzX2FuZF9xdWFsaWZpZWRfaWQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjb25mb3JtYW5jZSBvZiBmb3J3YXJkIGNsYXNzICUwIHRvIHByb3RvY29sICUxIGNhbiBub3QgYmUgY29uZmlybWVkIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfaW5kaXJlY3RfZ290b190YXJnZXQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwb3NzaWJsZSB0YXJnZXQgb2YgaW5kaXJlY3QgZ290byBzdGF0ZW1lbnQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9pbmRpcmVjdGlvbl90aHJvdWdoX251bGwsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjb25zaWRlciB1c2luZyBfX2J1aWx0aW5fdHJhcCgpIG9yIHF1YWxpZnlpbmcgcG9pbnRlciB3aXRoICd2b2xhdGlsZSciLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9pbmVxdWFsaXR5X2NvbXBhcmlzb25fdG9fb3JfYXNzaWduLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidXNlICd8PScgdG8gdHVybiB0aGlzIGluZXF1YWxpdHkgY29tcGFyaXNvbiBpbnRvIGFuIG9yLWFzc2lnbm1lbnQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9pbml0X2xpc3RfbmFycm93aW5nX3NpbGVuY2UsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbnNlcnQgYW4gZXhwbGljaXQgY2FzdCB0byBzaWxlbmNlIHRoaXMgaXNzdWUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9pbnNlcnRfYnJlYWtfZml4aXQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbnNlcnQgJ2JyZWFrOycgdG8gYXZvaWQgZmFsbC10aHJvdWdoIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfaW5zZXJ0X2ZhbGx0aHJvdWdoX2ZpeGl0LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW5zZXJ0ICclMDsnIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfaW5zdF9kZWNsYXJhdGlvbl9oaW50LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYWRkIGFuIGV4cGxpY2l0IGluc3RhbnRpYXRpb24gZGVjbGFyYXRpb24gdG8gc3VwcHJlc3MgdGhpcyB3YXJuaW5nIGlmICVxMCBpcyBleHBsaWNpdGx5IGluc3RhbnRpYXRlZCBpbiBhbm90aGVyIHRyYW5zbGF0aW9uIHVuaXQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9pbnN0YW50aWF0aW9uX2NvbnRleHRzX3N1cHByZXNzZWQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIoc2tpcHBpbmcgJTAgY29udGV4dCVzMCBpbiBiYWNrdHJhY2U7IHVzZSAtZnRlbXBsYXRlLWJhY2t0cmFjZS1saW1pdD0wIHRvIHNlZSBhbGwpIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfaW5zdGFudGlhdGlvbl9yZXF1aXJlZF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJXNlbGVjdHtpbXBsaWNpdHxleHBsaWNpdH0wIGluc3RhbnRpYXRpb24gZmlyc3QgcmVxdWlyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2l0X2RlbGVnYXRlc190bywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIml0IGRlbGVnYXRlcyB0byIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2l2YXJfZGVjbCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImluc3RhbmNlIHZhcmlhYmxlIGlzIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9sYW1iZGFfZGVjbCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImxhbWJkYSBleHByZXNzaW9uIGJlZ2lucyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDMpCitESUFHKG5vdGVfbGFtYmRhX3RvX2Jsb2NrX2NvbnYsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbXBsaWNpdCBjYXB0dXJlIG9mIGxhbWJkYSBvYmplY3QgZHVlIHRvIGNvbnZlcnNpb24gdG8gYmxvY2sgcG9pbnRlciBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDMpCitESUFHKG5vdGVfbG9jYWxfZGVjbF9jbG9zZV9tYXRjaCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImxvY2FsIGRlY2xhcmF0aW9uIG5lYXJseSBtYXRjaGVzIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbG9jYWxfZGVjbF9jbG9zZV9wYXJhbV9tYXRjaCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInR5cGUgb2YgJW9yZGluYWwwIHBhcmFtZXRlciBvZiBsb2NhbCBkZWNsYXJhdGlvbiBkb2VzIG5vdCBtYXRjaCBkZWZpbml0aW9uJWRpZmZ7ICgkIHZzICQpfH0xLDIiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9sb2NrX2V4Y2x1c2l2ZV9hbmRfc2hhcmVkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidGhlIG90aGVyIGFjcXVpc2l0aW9uIG9mICUwICclMScgaXMgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2xvY2tlZF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJTAgYWNxdWlyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX2xvZ2ljYWxfaW5zdGVhZF9vZl9iaXR3aXNlX2NoYW5nZV9vcGVyYXRvciwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInVzZSAnJTAnIGZvciBhIGJpdHdpc2Ugb3BlcmF0aW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbG9naWNhbF9pbnN0ZWFkX29mX2JpdHdpc2VfcmVtb3ZlX2NvbnN0YW50LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicmVtb3ZlIGNvbnN0YW50IHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbG9naWNhbF9ub3RfZml4LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYWRkIHBhcmVudGhlc2VzIGFmdGVyIHRoZSAnIScgdG8gZXZhbHVhdGUgdGhlICVzZWxlY3R7Y29tcGFyaXNvbnxiaXR3aXNlIG9wZXJhdG9yfTAgZmlyc3QiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9sb2dpY2FsX25vdF9zaWxlbmNlX3dpdGhfcGFyZW5zLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYWRkIHBhcmVudGhlc2VzIGFyb3VuZCBsZWZ0IGhhbmQgc2lkZSBleHByZXNzaW9uIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbG9vcF9pdGVyYXRpb25faGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiVzZWxlY3R7ZGVjcmVtZW50ZWR8aW5jcmVtZW50ZWR9MCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbWFpbl9jaGFuZ2VfcmV0dXJuX3R5cGUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjaGFuZ2UgcmV0dXJuIHR5cGUgdG8gJ2ludCciLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9tYWluX3JlbW92ZV9ub3JldHVybiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInJlbW92ZSAnX05vcmV0dXJuJyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX21lbWJlcl9kZWNsYXJlZF9hdCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm1lbWJlciBpcyBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbWVtYmVyX2RlY2xhcmVkX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJtZW1iZXIgJTAgZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX21lbWJlcl9kZWZfY2xvc2VfY29uc3RfbWF0Y2gsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJtZW1iZXIgZGVjbGFyYXRpb24gZG9lcyBub3QgbWF0Y2ggYmVjYXVzZSBpdCAlc2VsZWN0e2lzfGlzIG5vdH0wIGNvbnN0IHF1YWxpZmllZCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX21lbWJlcl9kZWZfY2xvc2VfbWF0Y2gsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJtZW1iZXIgZGVjbGFyYXRpb24gbmVhcmx5IG1hdGNoZXMiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9tZW1iZXJfZGVmX2Nsb3NlX3BhcmFtX21hdGNoLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidHlwZSBvZiAlb3JkaW5hbDAgcGFyYW1ldGVyIG9mIG1lbWJlciBkZWNsYXJhdGlvbiBkb2VzIG5vdCBtYXRjaCBkZWZpbml0aW9uJWRpZmZ7ICgkIHZzICQpfH0xLDIiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9tZW1iZXJfZmlyc3RfZGVjbGFyZWRfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm1lbWJlciAlMCBmaXJzdCBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbWVtYmVyX3JlZmVyZW5jZV9hcnJvd19mcm9tX29wZXJhdG9yX2Fycm93LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJy0+JyBhcHBsaWVkIHRvIHJldHVybiB2YWx1ZSBvZiB0aGUgb3BlcmF0b3ItPigpIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9tZW1iZXJfc3ludGhlc2l6ZWRfYXQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbiBpbXBsaWNpdCAlc2VsZWN0e2RlZmF1bHQgY29uc3RydWN0b3J8Y29weSBjb25zdHJ1Y3Rvcnxtb3ZlIGNvbnN0cnVjdG9yfGNvcHkgYXNzaWdubWVudCBvcGVyYXRvcnxtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3J8ZGVzdHJ1Y3Rvcn0wIGZvciAlMSBmaXJzdCByZXF1aXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbWVtc2l6ZV9jb21wYXJpc29uX2Nhc3Rfc2lsZW5jZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImV4cGxpY2l0bHkgY2FzdCB0aGUgYXJndW1lbnQgdG8gc2l6ZV90IHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbWVtc2l6ZV9jb21wYXJpc29uX3BhcmVuLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZGlkIHlvdSBtZWFuIHRvIGNvbXBhcmUgdGhlIHJlc3VsdCBvZiAlMCBpbnN0ZWFkPyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX21ldGhvZF9kZWNsYXJlZF9hdCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm1ldGhvZCAlMCBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbWV0aG9kX3JldHVybl90eXBlX2NoYW5nZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNvbXBpbGVyIGhhcyBpbXBsaWNpdGx5IGNoYW5nZWQgbWV0aG9kICUwIHJldHVybiB0eXBlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbWV0aG9kX3NlbnRfZm9yd2FyZF9jbGFzcywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm1ldGhvZCAlMCBpcyB1c2VkIGZvciB0aGUgZm9yd2FyZCBjbGFzcyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX21vZHVsZV9pbXBvcnRfbm90X2F0X3RvcF9sZXZlbCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiUwIGJlZ2lucyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEzKQorRElBRyhub3RlX211bHRpdmVyc2lvbmluZ19jYXVzZWRfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImZ1bmN0aW9uIG11bHRpdmVyc2lvbmluZyBjYXVzZWQgYnkgdGhpcyBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyhub3RlX25hbWVzcGFjZV9kZWZpbmVkX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJuYW1lc3BhY2UgJTAgZGVmaW5lZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbmVvbl92ZWN0b3JfaW5pdGlhbGl6ZXJfbm9uX3BvcnRhYmxlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY29uc2lkZXIgdXNpbmcgdmxkMV8lMCUxKCkgdG8gaW5pdGlhbGl6ZSBhIHZlY3RvciBmcm9tIG1lbW9yeSwgb3IgdmNyZWF0ZV8lMCUxKCkgdG8gaW5pdGlhbGl6ZSBmcm9tIGFuIGludGVnZXIgY29uc3RhbnQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9uZW9uX3ZlY3Rvcl9pbml0aWFsaXplcl9ub25fcG9ydGFibGVfcSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNvbnNpZGVyIHVzaW5nIHZsZDFxXyUwJTEoKSB0byBpbml0aWFsaXplIGEgdmVjdG9yIGZyb20gbWVtb3J5LCBvciB2Y29tYmluZV8lMCUxKHZjcmVhdGVfJTAlMSgpLCB2Y3JlYXRlXyUwJTEoKSkgdG8gaW5pdGlhbGl6ZSBmcm9tIGludGVnZXIgY29uc3RhbnRzIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbmV4dF9maWVsZF9kZWNsYXJhdGlvbiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm5leHQgZmllbGQgZGVjbGFyYXRpb24gaXMgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX25leHRfaXZhcl9kZWNsYXJhdGlvbiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm5leHQgJXNlbGVjdHtpbnN0YW5jZSB2YXJpYWJsZSBkZWNsYXJhdGlvbnxzeW50aGVzaXplZCBpbnN0YW5jZSB2YXJpYWJsZX0wIGlzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9ub25fZGVkdWNpYmxlX3BhcmFtZXRlciwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm5vbi1kZWR1Y2libGUgdGVtcGxhdGUgcGFyYW1ldGVyICUwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbm9uX2luc3RhbnRpYXRlZF9tZW1iZXJfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm5vdC15ZXQtaW5zdGFudGlhdGVkIG1lbWJlciBpcyBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbm9uX2xpdGVyYWxfYmFzZV9jbGFzcywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiUwIGlzIG5vdCBsaXRlcmFsIGJlY2F1c2UgaXQgaGFzIGJhc2UgY2xhc3MgJTEgb2Ygbm9uLWxpdGVyYWwgdHlwZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX25vbl9saXRlcmFsX2ZpZWxkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJTAgaXMgbm90IGxpdGVyYWwgYmVjYXVzZSBpdCBoYXMgZGF0YSBtZW1iZXIgJTEgb2YgJXNlbGVjdHtub24tbGl0ZXJhbHx2b2xhdGlsZX0zIHR5cGUgJTIiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9ub25fbGl0ZXJhbF9pbmNvbXBsZXRlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW5jb21wbGV0ZSB0eXBlICUwIGlzIG5vdCBhIGxpdGVyYWwgdHlwZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX25vbl9saXRlcmFsX25vX2NvbnN0ZXhwcl9jdG9ycywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiUwIGlzIG5vdCBsaXRlcmFsIGJlY2F1c2UgaXQgaXMgbm90IGFuIGFnZ3JlZ2F0ZSBhbmQgaGFzIG5vIGNvbnN0ZXhwciBjb25zdHJ1Y3RvcnMgb3RoZXIgdGhhbiBjb3B5IG9yIG1vdmUgY29uc3RydWN0b3JzIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbm9uX2xpdGVyYWxfbm9udHJpdmlhbF9kdG9yLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJTAgaXMgbm90IGxpdGVyYWwgYmVjYXVzZSBpdCBoYXMgYSBub24tdHJpdmlhbCBkZXN0cnVjdG9yIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbm9uX2xpdGVyYWxfdXNlcl9wcm92aWRlZF9kdG9yLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJTAgaXMgbm90IGxpdGVyYWwgYmVjYXVzZSBpdCBoYXMgYSB1c2VyLXByb3ZpZGVkIGRlc3RydWN0b3IiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9ub25fbGl0ZXJhbF92aXJ0dWFsX2Jhc2UsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e3N0cnVjdHxpbnRlcmZhY2V8Y2xhc3N9MCB3aXRoIHZpcnR1YWwgYmFzZSAlcGx1cmFsezE6Y2xhc3N8OmNsYXNzZXN9MSBpcyBub3QgYSBsaXRlcmFsIHR5cGUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9ub25fdGVtcGxhdGVfaW5fdGVtcGxhdGVfaWRfZm91bmQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJub24tdGVtcGxhdGUgZGVjbGFyYXRpb24gZm91bmQgYnkgbmFtZSBsb29rdXAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9ub25fdXN1YWxfZnVuY3Rpb25fZGVjbGFyZWRfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm5vbi11c3VhbCAlMCBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbm9udGVtcGxhdGVfZGVjbF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAibm9uLXRlbXBsYXRlZCBkZWNsYXJhdGlvbiBpcyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbm9udHJpdmlhbF9kZWZhdWx0X2FyZywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImJlY2F1c2UgaXQgaGFzIGEgZGVmYXVsdCBhcmd1bWVudCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX25vbnRyaXZpYWxfaGFzX3ZpcnR1YWwsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJiZWNhdXNlIHR5cGUgJTAgaGFzIGEgdmlydHVhbCAlc2VsZWN0e21lbWJlciBmdW5jdGlvbnxiYXNlIGNsYXNzfTEiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9ub250cml2aWFsX2luX2NsYXNzX2luaXQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJiZWNhdXNlIGZpZWxkICUwIGhhcyBhbiBpbml0aWFsaXplciIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX25vbnRyaXZpYWxfbm9fY29weSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImJlY2F1c2Ugbm8gJXNlbGVjdHs8PEVSUk9SPj58Y29uc3RydWN0b3J8Y29uc3RydWN0b3J8YXNzaWdubWVudCBvcGVyYXRvcnxhc3NpZ25tZW50IG9wZXJhdG9yfDw8RVJST1I+Pn0yIGNhbiBiZSB1c2VkIHRvICVzZWxlY3R7PDxFUlJPUj4+fGNvcHl8bW92ZXxjb3B5fG1vdmV8PDxFUlJPUj4+fTIgJXNlbGVjdHtiYXNlIGNsYXNzfGZpZWxkfGFuIG9iamVjdH0wIG9mIHR5cGUgJTMiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9ub250cml2aWFsX25vX2RlZl9jdG9yLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYmVjYXVzZSAlc2VsZWN0e2Jhc2UgY2xhc3Mgb2YgfGZpZWxkIG9mIHx9MHR5cGUgJTEgaGFzIG5vIGRlZmF1bHQgY29uc3RydWN0b3IiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9ub250cml2aWFsX29iamNfb3duZXJzaGlwLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYmVjYXVzZSB0eXBlICUwIGhhcyBhIG1lbWJlciB3aXRoICVzZWxlY3R7bm98bm98X19zdHJvbmd8X193ZWFrfF9fYXV0b3JlbGVhc2luZ30xIG93bmVyc2hpcCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX25vbnRyaXZpYWxfcGFyYW1fdHlwZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImJlY2F1c2UgaXRzIHBhcmFtZXRlciBpcyAlZGlmZntvZiB0eXBlICQsIG5vdCAkfG9mIHRoZSB3cm9uZyB0eXBlfTIsMyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX25vbnRyaXZpYWxfc3Vib2JqZWN0LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYmVjYXVzZSB0aGUgZnVuY3Rpb24gc2VsZWN0ZWQgdG8gJXNlbGVjdHtjb25zdHJ1Y3R8Y29weXxtb3ZlfGNvcHl8bW92ZXxkZXN0cm95fTIgJXNlbGVjdHtiYXNlIGNsYXNzfGZpZWxkfTAgb2YgdHlwZSAlMSBpcyBub3QgdHJpdmlhbCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX25vbnRyaXZpYWxfdXNlcl9wcm92aWRlZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImJlY2F1c2UgJXNlbGVjdHtiYXNlIGNsYXNzIG9mIHxmaWVsZCBvZiB8fTB0eXBlICUxIGhhcyBhIHVzZXItcHJvdmlkZWQgJXNlbGVjdHtkZWZhdWx0IGNvbnN0cnVjdG9yfGNvcHkgY29uc3RydWN0b3J8bW92ZSBjb25zdHJ1Y3Rvcnxjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3J8bW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yfGRlc3RydWN0b3J9MiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX25vbnRyaXZpYWxfdmFyaWFkaWMsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJiZWNhdXNlIGl0IGlzIGEgdmFyaWFkaWMgZnVuY3Rpb24iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9ub250cml2aWFsX3ZpcnR1YWxfZHRvciwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRlc3RydWN0b3IgZm9yICUwIGlzIG5vdCB0cml2aWFsIGJlY2F1c2UgaXQgaXMgdmlydHVhbCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX25vcmV0dXJuX21pc3NpbmdfZmlyc3RfZGVjbCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRlY2xhcmF0aW9uIG1pc3NpbmcgJ1tbbm9yZXR1cm5dXScgYXR0cmlidXRlIGlzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9ub3RfZm91bmRfYnlfdHdvX3BoYXNlX2xvb2t1cCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiUwIHNob3VsZCBiZSBkZWNsYXJlZCBwcmlvciB0byB0aGUgY2FsbCBzaXRlJXNlbGVjdHt8IG9yIGluICUyfCBvciBpbiBhbiBhc3NvY2lhdGVkIG5hbWVzcGFjZSBvZiBvbmUgb2YgaXRzIGFyZ3VtZW50c30xIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfbnVsbGFiaWxpdHlfZml4X2l0LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW5zZXJ0ICclc2VsZWN0e19Ob25udWxsfF9OdWxsYWJsZXxfTnVsbF91bnNwZWNpZmllZH0wJyBpZiB0aGUgJXNlbGVjdHtwb2ludGVyfGJsb2NrIHBvaW50ZXJ8bWVtYmVyIHBvaW50ZXJ8YXJyYXkgcGFyYW1ldGVyfTEgJXNlbGVjdHtzaG91bGQgbmV2ZXIgYmUgbnVsbHxtYXkgYmUgbnVsbHxzaG91bGQgbm90IGRlY2xhcmUgbnVsbGFiaWxpdHl9MCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxOSkKK0RJQUcobm90ZV9udWxsYWJpbGl0eV9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJTAgc3BlY2lmaWVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTkpCitESUFHKG5vdGVfbnVsbGFiaWxpdHlfdHlwZV9zcGVjaWZpZXIsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ1c2UgbnVsbGFiaWxpdHkgdHlwZSBzcGVjaWZpZXIgJTAgdG8gYWZmZWN0IHRoZSBpbm5lcm1vc3QgcG9pbnRlciB0eXBlIG9mICUxIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDE5KQorRElBRyhub3RlX29iamNfY2lyY3VsYXJfY29udGFpbmVyX2RlY2xhcmVkX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlMCBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb2JqY19kZXNpZ25hdGVkX2luaXRfbWFya2VkX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJtZXRob2QgbWFya2VkIGFzIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgb2YgdGhlIGNsYXNzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vYmpjX2xpdGVyYWxfY29tcGFyaXNvbl9pc2VxdWFsLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidXNlICdpc0VxdWFsOicgaW5zdGVhZCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX29iamNfbGl0ZXJhbF9tZXRob2RfcGFyYW0sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e2ZpcnN0fHNlY29uZHx0aGlyZH0wIHBhcmFtZXRlciBoYXMgdW5leHBlY3RlZCB0eXBlICUxIChzaG91bGQgYmUgJTIpIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb2JqY19saXRlcmFsX21ldGhvZF9yZXR1cm4sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJtZXRob2QgcmV0dXJucyB1bmV4cGVjdGVkIHR5cGUgJTAgKHNob3VsZCBiZSBhbiBvYmplY3QgdHlwZSkiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vYmpjX25lZWRzX3N1cGVyY2xhc3MsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJhZGQgYSBzdXBlciBjbGFzcyB0byBmaXggdGhpcyBwcm9ibGVtIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb2JqY190eXBlX3BhcmFtX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ0eXBlIHBhcmFtZXRlciAlMCBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIwKQorRElBRyhub3RlX29iamNfdW5zYWZlX3BlcmZvcm1fc2VsZWN0b3JfbWV0aG9kX2RlY2xhcmVkX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJtZXRob2QgJTAgdGhhdCByZXR1cm5zICUxIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vbXBfYXRvbWljX2NhcHR1cmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e2V4cGVjdGVkIGFzc2lnbm1lbnQgZXhwcmVzc2lvbnxleHBlY3RlZCBjb21wb3VuZCBzdGF0ZW1lbnR8ZXhwZWN0ZWQgZXhhY3RseSB0d28gZXhwcmVzc2lvbiBzdGF0ZW1lbnRzfGV4cGVjdGVkIGluIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgZmlyc3QgZXhwcmVzc2lvbn0wIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDExKQorRElBRyhub3RlX29tcF9hdG9taWNfcHJldmlvdXNfY2xhdXNlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJyUwJyBjbGF1c2UgdXNlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDExKQorRElBRyhub3RlX29tcF9hdG9taWNfcmVhZF93cml0ZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiVzZWxlY3R7ZXhwZWN0ZWQgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnR8ZXhwZWN0ZWQgYnVpbHQtaW4gYXNzaWdubWVudCBvcGVyYXRvcnxleHBlY3RlZCBleHByZXNzaW9uIG9mIHNjYWxhciB0eXBlfGV4cGVjdGVkIGx2YWx1ZSBleHByZXNzaW9ufTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTEpCitESUFHKG5vdGVfb21wX2F0b21pY191cGRhdGUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e2V4cGVjdGVkIGFuIGV4cHJlc3Npb24gc3RhdGVtZW50fGV4cGVjdGVkIGJ1aWx0LWluIGJpbmFyeSBvciB1bmFyeSBvcGVyYXRvcnxleHBlY3RlZCB1bmFyeSBkZWNyZW1lbnQvaW5jcmVtZW50IG9wZXJhdGlvbnxleHBlY3RlZCBleHByZXNzaW9uIG9mIHNjYWxhciB0eXBlfGV4cGVjdGVkIGFzc2lnbm1lbnQgZXhwcmVzc2lvbnxleHBlY3RlZCBidWlsdC1pbiBiaW5hcnkgb3BlcmF0b3J8ZXhwZWN0ZWQgb25lIG9mICcrJywgJyonLCAnLScsICcvJywgJyYnLCAnXicsICclfCcsICc8PCcsIG9yICc+PicgYnVpbHQtaW4gb3BlcmF0aW9uc3xleHBlY3RlZCBpbiByaWdodCBoYW5kIHNpZGUgb2YgZXhwcmVzc2lvbn0wIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDExKQorRElBRyhub3RlX29tcF9jb2xsYXBzZV9vcmRlcmVkX2V4cHIsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJhcyBzcGVjaWZpZWQgaW4gJXNlbGVjdHsnY29sbGFwc2UnfCdvcmRlcmVkJ3wnY29sbGFwc2UnIGFuZCAnb3JkZXJlZCd9MCBjbGF1c2Ulc2VsZWN0e3x8c30wIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDExKQorRElBRyhub3RlX29tcF9jb252ZXJzaW9uX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjb252ZXJzaW9uIHRvICVzZWxlY3R7aW50ZWdyYWx8ZW51bWVyYXRpb259MCB0eXBlICUxIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTEpCitESUFHKG5vdGVfb21wX2NyaXRpY2FsX2hpbnRfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiVzZWxlY3R7fHByZXZpb3VzIH0wJ2hpbnQnIGNsYXVzZSB3aXRoIHZhbHVlICclMSciLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTEpCitESUFHKG5vdGVfb21wX2NyaXRpY2FsX25vX2hpbnQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e3xwcmV2aW91cyB9MGRpcmVjdGl2ZSB3aXRoIG5vICdoaW50JyBjbGF1c2Ugc3BlY2lmaWVkIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDExKQorRElBRyhub3RlX29tcF9leHBsaWNpdF9kc2EsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJkZWZpbmVkIGFzICUwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDExKQorRElBRyhub3RlX29tcF9pbXBsaWNpdF9kc2EsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbXBsaWNpdGx5IGRldGVybWluZWQgYXMgJTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTEpCitESUFHKG5vdGVfb21wX2xvb3BfY29uZF9yZXF1cmVzX2NvbXBhdGlibGVfaW5jciwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImxvb3Agc3RlcCBpcyBleHBlY3RlZCB0byBiZSAlc2VsZWN0e25lZ2F0aXZlfHBvc2l0aXZlfTAgZHVlIHRvIHRoaXMgY29uZGl0aW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDExKQorRElBRyhub3RlX29tcF9uZXN0ZWRfc3RhdGVtZW50X2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e3N0YXRlbWVudHxkaXJlY3RpdmV9MCBvdXRzaWRlIHRlYW1zIGNvbnN0cnVjdCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDExKQorRElBRyhub3RlX29tcF9uZXN0ZWRfdGVhbXNfY29uc3RydWN0X2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJuZXN0ZWQgdGVhbXMgY29uc3RydWN0IGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTEpCitESUFHKG5vdGVfb21wX25vd2FpdF9jbGF1c2VfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIidub3dhaXQnIGNsYXVzZSBpcyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDExKQorRElBRyhub3RlX29tcF9vcmRlcmVkX3BhcmFtLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJ29yZGVyZWQnIGNsYXVzZSB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXIiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTEpCitESUFHKG5vdGVfb21wX3ByZWRldGVybWluZWRfZHNhLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJXNlbGVjdHtzdGF0aWMgZGF0YSBtZW1iZXIgaXMgcHJlZGV0ZXJtaW5lZCBhcyBzaGFyZWR8dmFyaWFibGUgd2l0aCBzdGF0aWMgc3RvcmFnZSBkdXJhdGlvbiBpcyBwcmVkZXRlcm1pbmVkIGFzIHNoYXJlZHxsb29wIGl0ZXJhdGlvbiB2YXJpYWJsZSBpcyBwcmVkZXRlcm1pbmVkIGFzIHByaXZhdGV8bG9vcCBpdGVyYXRpb24gdmFyaWFibGUgaXMgcHJlZGV0ZXJtaW5lZCBhcyBsaW5lYXJ8bG9vcCBpdGVyYXRpb24gdmFyaWFibGUgaXMgcHJlZGV0ZXJtaW5lZCBhcyBsYXN0cHJpdmF0ZXxjb25zdGFudCB2YXJpYWJsZSBpcyBwcmVkZXRlcm1pbmVkIGFzIHNoYXJlZHxnbG9iYWwgdmFyaWFibGUgaXMgcHJlZGV0ZXJtaW5lZCBhcyBzaGFyZWR8bm9uLXNoYXJlZCB2YXJpYWJsZSBpbiBhIHRhc2sgY29uc3RydWN0IGlzIHByZWRldGVybWluZWQgYXMgZmlyc3Rwcml2YXRlfHZhcmlhYmxlIHdpdGggYXV0b21hdGljIHN0b3JhZ2UgZHVyYXRpb24gaXMgcHJlZGV0ZXJtaW5lZCBhcyBwcml2YXRlfTAlc2VsZWN0e3w7IHBlcmhhcHMgeW91IGZvcmdldCB0byBlbmNsb3NlICdvbXAgJTInIGRpcmVjdGl2ZSBpbnRvIGEgcGFyYWxsZWwgb3IgYW5vdGhlciB0YXNrIHJlZ2lvbj99MSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxMSkKK0RJQUcobm90ZV9vbXBfcHJldmlvdXNfY3JpdGljYWxfcmVnaW9uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJldmlvdXMgJ2NyaXRpY2FsJyByZWdpb24gc3RhcnRzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTEpCitESUFHKG5vdGVfb21wX3ByZXZpb3VzX2dyYWluc2l6ZV9udW1fdGFza3MsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICInJTAnIGNsYXVzZSBpcyBzcGVjaWZpZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxMSkKK0RJQUcobm90ZV9vbXBfcHJldmlvdXNfbmFtZWRfaWZfY2xhdXNlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJldmlvdXMgY2xhdXNlIHdpdGggZGlyZWN0aXZlIG5hbWUgbW9kaWZpZXIgc3BlY2lmaWVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTEpCitESUFHKG5vdGVfb21wX3ByZXZpb3VzX3JlZHVjdGlvbl9pZGVudGlmaWVyLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJldmlvdXNseSBtYXJrZWQgYXMgdGFza19yZWR1Y3Rpb24gd2l0aCBkaWZmZXJlbnQgcmVkdWN0aW9uIG9wZXJhdGlvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxMSkKK0RJQUcobm90ZV9vbXBfcmVmZXJlbmNlZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInByZXZpb3VzbHkgcmVmZXJlbmNlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDExKQorRElBRyhub3RlX29tcF90YXNrX3ByZWRldGVybWluZWRfZmlyc3Rwcml2YXRlX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwcmVkZXRlcm1pbmVkIGFzIGEgZmlyc3Rwcml2YXRlIGluIGEgdGFzayBjb25zdHJ1Y3QgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxMSkKK0RJQUcobm90ZV9vcGVuY2xfdHlwZWRlZl9hY2Nlc3NfcXVhbGlmaWVyLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJldmlvdXNseSBkZWNsYXJlZCAnJTAnIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vcGVyYXRvcl9hcnJvd19kZXB0aCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInVzZSAtZm9wZXJhdG9yLWFycm93LWRlcHRoPU4gdG8gaW5jcmVhc2UgJ29wZXJhdG9yLT4nIGxpbWl0IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3BlcmF0b3JfYXJyb3dfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIidvcGVyYXRvci0+JyBkZWNsYXJlZCBoZXJlIHByb2R1Y2VzIGFuIG9iamVjdCBvZiB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3BlcmF0b3JfYXJyb3dzX3N1cHByZXNzZWQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIoc2tpcHBpbmcgJTAgJ29wZXJhdG9yLT4nJXMwIGluIGJhY2t0cmFjZSkiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vdmVycmlkZGVuX21hcmtlZF9ub2VzY2FwZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInBhcmFtZXRlciBvZiBvdmVycmlkZGVuIG1ldGhvZCBpcyBhbm5vdGF0ZWQgd2l0aCBfX2F0dHJpYnV0ZV9fKChub2VzY2FwZSkpIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3ZlcnJpZGRlbl9tZXRob2QsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJvdmVycmlkZGVuIG1ldGhvZCBpcyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3ZlcnJpZGRlbl92aXJ0dWFsX2Z1bmN0aW9uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAib3ZlcnJpZGRlbiB2aXJ0dWFsIGZ1bmN0aW9uIGlzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vdmxfYnVpbHRpbl9iaW5hcnlfY2FuZGlkYXRlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYnVpbHQtaW4gY2FuZGlkYXRlICUwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3ZsX2J1aWx0aW5fdW5hcnlfY2FuZGlkYXRlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYnVpbHQtaW4gY2FuZGlkYXRlICUwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3ZsX2NhbmRpZGF0ZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSAlc2VsZWN0e2Z1bmN0aW9ufGZ1bmN0aW9ufGNvbnN0cnVjdG9yfGZ1bmN0aW9uIHxmdW5jdGlvbiB8Y29uc3RydWN0b3IgfGlzIHRoZSBpbXBsaWNpdCBkZWZhdWx0IGNvbnN0cnVjdG9yfGlzIHRoZSBpbXBsaWNpdCBjb3B5IGNvbnN0cnVjdG9yfGlzIHRoZSBpbXBsaWNpdCBtb3ZlIGNvbnN0cnVjdG9yfGlzIHRoZSBpbXBsaWNpdCBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3J8aXMgdGhlIGltcGxpY2l0IG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcnxpbmhlcml0ZWQgY29uc3RydWN0b3J8aW5oZXJpdGVkIGNvbnN0cnVjdG9yIH0wJTIlc2VsZWN0e3wgaGFzIGRpZmZlcmVudCBjbGFzcyVkaWZmeyAoZXhwZWN0ZWQgJCBidXQgaGFzICQpfH00LDV8IGhhcyBkaWZmZXJlbnQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKGV4cGVjdGVkICU0IGJ1dCBoYXMgJTUpfCBoYXMgdHlwZSBtaXNtYXRjaCBhdCAlb3JkaW5hbDQgcGFyYW1ldGVyJWRpZmZ7IChleHBlY3RlZCAkIGJ1dCBoYXMgJCl8fTUsNnwgaGFzIGRpZmZlcmVudCByZXR1cm4gdHlwZSVkaWZmeyAoJCBleHBlY3RlZCBidXQgaGFzICQpfH00LDV8IGhhcyBkaWZmZXJlbnQgcXVhbGlmaWVycyAoZXhwZWN0ZWQgJXNlbGVjdHtub25lfGNvbnN0fHJlc3RyaWN0fGNvbnN0IGFuZCByZXN0cmljdHx2b2xhdGlsZXxjb25zdCBhbmQgdm9sYXRpbGV8dm9sYXRpbGUgYW5kIHJlc3RyaWN0fGNvbnN0LCB2b2xhdGlsZSwgYW5kIHJlc3RyaWN0fTQgYnV0IGZvdW5kICVzZWxlY3R7bm9uZXxjb25zdHxyZXN0cmljdHxjb25zdCBhbmQgcmVzdHJpY3R8dm9sYXRpbGV8Y29uc3QgYW5kIHZvbGF0aWxlfHZvbGF0aWxlIGFuZCByZXN0cmljdHxjb25zdCwgdm9sYXRpbGUsIGFuZCByZXN0cmljdH01KXwgaGFzIGRpZmZlcmVudCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbn0zIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3ZsX2NhbmRpZGF0ZV9hcml0eSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSAlc2VsZWN0e2Z1bmN0aW9ufGZ1bmN0aW9ufGNvbnN0cnVjdG9yfGZ1bmN0aW9ufGZ1bmN0aW9ufGNvbnN0cnVjdG9yfGNvbnN0cnVjdG9yICh0aGUgaW1wbGljaXQgZGVmYXVsdCBjb25zdHJ1Y3Rvcil8Y29uc3RydWN0b3IgKHRoZSBpbXBsaWNpdCBjb3B5IGNvbnN0cnVjdG9yKXxjb25zdHJ1Y3RvciAodGhlIGltcGxpY2l0IG1vdmUgY29uc3RydWN0b3IpfGZ1bmN0aW9uICh0aGUgaW1wbGljaXQgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yKXxmdW5jdGlvbiAodGhlIGltcGxpY2l0IG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcil8aW5oZXJpdGVkIGNvbnN0cnVjdG9yfGluaGVyaXRlZCBjb25zdHJ1Y3Rvcn0wICVzZWxlY3R7fHRlbXBsYXRlIH0xbm90IHZpYWJsZTogcmVxdWlyZXMlc2VsZWN0eyBhdCBsZWFzdHwgYXQgbW9zdHx9MiAlMyBhcmd1bWVudCVzMywgYnV0ICU0ICVwbHVyYWx7MTp3YXN8OndlcmV9NCBwcm92aWRlZCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX292bF9jYW5kaWRhdGVfYXJpdHlfb25lLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FuZGlkYXRlICVzZWxlY3R7ZnVuY3Rpb258ZnVuY3Rpb258Y29uc3RydWN0b3J8ZnVuY3Rpb258ZnVuY3Rpb258Y29uc3RydWN0b3J8Y29uc3RydWN0b3IgKHRoZSBpbXBsaWNpdCBkZWZhdWx0IGNvbnN0cnVjdG9yKXxjb25zdHJ1Y3RvciAodGhlIGltcGxpY2l0IGNvcHkgY29uc3RydWN0b3IpfGNvbnN0cnVjdG9yICh0aGUgaW1wbGljaXQgbW92ZSBjb25zdHJ1Y3Rvcil8ZnVuY3Rpb24gKHRoZSBpbXBsaWNpdCBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IpfGZ1bmN0aW9uICh0aGUgaW1wbGljaXQgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yKXxpbmhlcml0ZWQgY29uc3RydWN0b3J8aW5oZXJpdGVkIGNvbnN0cnVjdG9yfTAgJXNlbGVjdHt8dGVtcGxhdGUgfTFub3QgdmlhYmxlOiAlc2VsZWN0e3JlcXVpcmVzIGF0IGxlYXN0fGFsbG93cyBhdCBtb3N0IHNpbmdsZXxyZXF1aXJlcyBzaW5nbGV9MiBhcmd1bWVudCAlMywgYnV0ICVwbHVyYWx7MDpub3w6JTR9NCBhcmd1bWVudHMgd2VyZSBwcm92aWRlZCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX292bF9jYW5kaWRhdGVfYmFkX2FkZHJzcGFjZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSAlc2VsZWN0e2Z1bmN0aW9ufGZ1bmN0aW9ufGNvbnN0cnVjdG9yfGZ1bmN0aW9uIHxmdW5jdGlvbiB8Y29uc3RydWN0b3IgfGNvbnN0cnVjdG9yICh0aGUgaW1wbGljaXQgZGVmYXVsdCBjb25zdHJ1Y3Rvcil8Y29uc3RydWN0b3IgKHRoZSBpbXBsaWNpdCBjb3B5IGNvbnN0cnVjdG9yKXxjb25zdHJ1Y3RvciAodGhlIGltcGxpY2l0IG1vdmUgY29uc3RydWN0b3IpfGZ1bmN0aW9uICh0aGUgaW1wbGljaXQgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yKXxmdW5jdGlvbiAodGhlIGltcGxpY2l0IG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcil8aW5oZXJpdGVkIGNvbnN0cnVjdG9yfGluaGVyaXRlZCBjb25zdHJ1Y3RvciB9MCUxIG5vdCB2aWFibGU6ICVzZWxlY3R7JW9yZGluYWw2fCd0aGlzJ301IGFyZ3VtZW50ICglMikgaXMgaW4gYWRkcmVzcyBzcGFjZSAlMywgYnV0IHBhcmFtZXRlciBtdXN0IGJlIGluIGFkZHJlc3Mgc3BhY2UgJTQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vdmxfY2FuZGlkYXRlX2JhZF9hcmNfY29udiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSAlc2VsZWN0e2Z1bmN0aW9ufGZ1bmN0aW9ufGNvbnN0cnVjdG9yfGZ1bmN0aW9uIHxmdW5jdGlvbiB8Y29uc3RydWN0b3IgfGNvbnN0cnVjdG9yICh0aGUgaW1wbGljaXQgZGVmYXVsdCBjb25zdHJ1Y3Rvcil8Y29uc3RydWN0b3IgKHRoZSBpbXBsaWNpdCBjb3B5IGNvbnN0cnVjdG9yKXxjb25zdHJ1Y3RvciAodGhlIGltcGxpY2l0IG1vdmUgY29uc3RydWN0b3IpfGZ1bmN0aW9uICh0aGUgaW1wbGljaXQgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yKXxmdW5jdGlvbiAodGhlIGltcGxpY2l0IG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcil8aW5oZXJpdGVkIGNvbnN0cnVjdG9yfGluaGVyaXRlZCBjb25zdHJ1Y3RvciB9MCUxIG5vdCB2aWFibGU6IGNhbm5vdCBpbXBsaWNpdGx5IGNvbnZlcnQgYXJndW1lbnQgJWRpZmZ7b2YgdHlwZSAkIHRvICR8dHlwZSB0byBwYXJhbWV0ZXIgdHlwZX0yLDMgZm9yICVzZWxlY3R7JW9yZGluYWw1IGFyZ3VtZW50fG9iamVjdCBhcmd1bWVudH00IHVuZGVyIEFSQyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX292bF9jYW5kaWRhdGVfYmFkX2Jhc2VfdG9fZGVyaXZlZF9jb252LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FuZGlkYXRlICVzZWxlY3R7ZnVuY3Rpb258ZnVuY3Rpb258Y29uc3RydWN0b3J8ZnVuY3Rpb24gfGZ1bmN0aW9uIHxjb25zdHJ1Y3RvciB8Y29uc3RydWN0b3IgKHRoZSBpbXBsaWNpdCBkZWZhdWx0IGNvbnN0cnVjdG9yKXxjb25zdHJ1Y3RvciAodGhlIGltcGxpY2l0IGNvcHkgY29uc3RydWN0b3IpfGNvbnN0cnVjdG9yICh0aGUgaW1wbGljaXQgbW92ZSBjb25zdHJ1Y3Rvcil8ZnVuY3Rpb24gKHRoZSBpbXBsaWNpdCBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IpfGZ1bmN0aW9uICh0aGUgaW1wbGljaXQgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yKXxpbmhlcml0ZWQgY29uc3RydWN0b3J8aW5oZXJpdGVkIGNvbnN0cnVjdG9yIH0wJTEgbm90IHZpYWJsZTogY2Fubm90ICVzZWxlY3R7Y29udmVydCBmcm9tfGNvbnZlcnQgZnJvbXxiaW5kfTIgJXNlbGVjdHtiYXNlIGNsYXNzIHBvaW50ZXJ8c3VwZXJjbGFzc3xiYXNlIGNsYXNzIG9iamVjdCBvZiB0eXBlfTIgJTMgdG8gJXNlbGVjdHtkZXJpdmVkIGNsYXNzIHBvaW50ZXJ8c3ViY2xhc3N8ZGVyaXZlZCBjbGFzcyByZWZlcmVuY2V9MiAlNCBmb3IgJW9yZGluYWw1IGFyZ3VtZW50IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3ZsX2NhbmRpZGF0ZV9iYWRfY29udiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSAlc2VsZWN0e2Z1bmN0aW9ufGZ1bmN0aW9ufGNvbnN0cnVjdG9yfGZ1bmN0aW9uIHxmdW5jdGlvbiB8Y29uc3RydWN0b3IgfGNvbnN0cnVjdG9yICh0aGUgaW1wbGljaXQgZGVmYXVsdCBjb25zdHJ1Y3Rvcil8Y29uc3RydWN0b3IgKHRoZSBpbXBsaWNpdCBjb3B5IGNvbnN0cnVjdG9yKXxjb25zdHJ1Y3RvciAodGhlIGltcGxpY2l0IG1vdmUgY29uc3RydWN0b3IpfGZ1bmN0aW9uICh0aGUgaW1wbGljaXQgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yKXxmdW5jdGlvbiAodGhlIGltcGxpY2l0IG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcil8aW5oZXJpdGVkIGNvbnN0cnVjdG9yfGluaGVyaXRlZCBjb25zdHJ1Y3RvciB9MCUxIG5vdCB2aWFibGU6IG5vIGtub3duIGNvbnZlcnNpb24gJWRpZmZ7ZnJvbSAkIHRvICR8ZnJvbSBhcmd1bWVudCB0eXBlIHRvIHBhcmFtZXRlciB0eXBlfTIsMyBmb3IgJXNlbGVjdHslb3JkaW5hbDUgYXJndW1lbnR8b2JqZWN0IGFyZ3VtZW50fTQlc2VsZWN0e3w7IGRlcmVmZXJlbmNlIHRoZSBhcmd1bWVudCB3aXRoICp8OyB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBhcmd1bWVudCB3aXRoICZ8OyByZW1vdmUgKnw7IHJlbW92ZSAmfTYiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vdmxfY2FuZGlkYXRlX2JhZF9jb252X2luY29tcGxldGUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjYW5kaWRhdGUgJXNlbGVjdHtmdW5jdGlvbnxmdW5jdGlvbnxjb25zdHJ1Y3RvcnxmdW5jdGlvbiB8ZnVuY3Rpb24gfGNvbnN0cnVjdG9yIHxjb25zdHJ1Y3RvciAodGhlIGltcGxpY2l0IGRlZmF1bHQgY29uc3RydWN0b3IpfGNvbnN0cnVjdG9yICh0aGUgaW1wbGljaXQgY29weSBjb25zdHJ1Y3Rvcil8Y29uc3RydWN0b3IgKHRoZSBpbXBsaWNpdCBtb3ZlIGNvbnN0cnVjdG9yKXxmdW5jdGlvbiAodGhlIGltcGxpY2l0IGNvcHkgYXNzaWdubWVudCBvcGVyYXRvcil8ZnVuY3Rpb24gKHRoZSBpbXBsaWNpdCBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IpfGluaGVyaXRlZCBjb25zdHJ1Y3Rvcnxpbmhlcml0ZWQgY29uc3RydWN0b3IgfTAlMSBub3QgdmlhYmxlOiBjYW5ub3QgY29udmVydCBhcmd1bWVudCBvZiBpbmNvbXBsZXRlIHR5cGUgJWRpZmZ7JCB0byAkfHRvIHBhcmFtZXRlciB0eXBlfTIsMyBmb3IgJXNlbGVjdHslb3JkaW5hbDUgYXJndW1lbnR8b2JqZWN0IGFyZ3VtZW50fTQlc2VsZWN0e3w7IGRlcmVmZXJlbmNlIHRoZSBhcmd1bWVudCB3aXRoICp8OyB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBhcmd1bWVudCB3aXRoICZ8OyByZW1vdmUgKnw7IHJlbW92ZSAmfTYiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vdmxfY2FuZGlkYXRlX2JhZF9jdnIsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjYW5kaWRhdGUgJXNlbGVjdHtmdW5jdGlvbnxmdW5jdGlvbnxjb25zdHJ1Y3RvcnxmdW5jdGlvbiB8ZnVuY3Rpb24gfGNvbnN0cnVjdG9yIHxjb25zdHJ1Y3RvciAodGhlIGltcGxpY2l0IGRlZmF1bHQgY29uc3RydWN0b3IpfGNvbnN0cnVjdG9yICh0aGUgaW1wbGljaXQgY29weSBjb25zdHJ1Y3Rvcil8Y29uc3RydWN0b3IgKHRoZSBpbXBsaWNpdCBtb3ZlIGNvbnN0cnVjdG9yKXxmdW5jdGlvbiAodGhlIGltcGxpY2l0IGNvcHkgYXNzaWdubWVudCBvcGVyYXRvcil8ZnVuY3Rpb24gKHRoZSBpbXBsaWNpdCBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IpfGluaGVyaXRlZCBjb25zdHJ1Y3Rvcnxpbmhlcml0ZWQgY29uc3RydWN0b3IgfTAlMSBub3QgdmlhYmxlOiAlb3JkaW5hbDQgYXJndW1lbnQgKCUyKSB3b3VsZCBsb3NlICVzZWxlY3R7Y29uc3R8cmVzdHJpY3R8Y29uc3QgYW5kIHJlc3RyaWN0fHZvbGF0aWxlfGNvbnN0IGFuZCB2b2xhdGlsZXx2b2xhdGlsZSBhbmQgcmVzdHJpY3R8Y29uc3QsIHZvbGF0aWxlLCBhbmQgcmVzdHJpY3R9MyBxdWFsaWZpZXIlc2VsZWN0e3x8c3x8c3xzfHN9MyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX292bF9jYW5kaWRhdGVfYmFkX2N2cl90aGlzLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FuZGlkYXRlICVzZWxlY3R7fGZ1bmN0aW9ufHx8ZnVuY3Rpb258fHx8fGZ1bmN0aW9uICh0aGUgaW1wbGljaXQgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yKXxmdW5jdGlvbiAodGhlIGltcGxpY2l0IG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcil8fH0wIG5vdCB2aWFibGU6ICd0aGlzJyBhcmd1bWVudCBoYXMgdHlwZSAlMiwgYnV0IG1ldGhvZCBpcyBub3QgbWFya2VkICVzZWxlY3R7Y29uc3R8cmVzdHJpY3R8Y29uc3Qgb3IgcmVzdHJpY3R8dm9sYXRpbGV8Y29uc3Qgb3Igdm9sYXRpbGV8dm9sYXRpbGUgb3IgcmVzdHJpY3R8Y29uc3QsIHZvbGF0aWxlLCBvciByZXN0cmljdH0zIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3ZsX2NhbmRpZGF0ZV9iYWRfZGVkdWN0aW9uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWQ6IGZhaWxlZCB0ZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vdmxfY2FuZGlkYXRlX2JhZF9nYywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSAlc2VsZWN0e2Z1bmN0aW9ufGZ1bmN0aW9ufGNvbnN0cnVjdG9yfGZ1bmN0aW9uIHxmdW5jdGlvbiB8Y29uc3RydWN0b3IgfGNvbnN0cnVjdG9yICh0aGUgaW1wbGljaXQgZGVmYXVsdCBjb25zdHJ1Y3Rvcil8Y29uc3RydWN0b3IgKHRoZSBpbXBsaWNpdCBjb3B5IGNvbnN0cnVjdG9yKXxjb25zdHJ1Y3RvciAodGhlIGltcGxpY2l0IG1vdmUgY29uc3RydWN0b3IpfGZ1bmN0aW9uICh0aGUgaW1wbGljaXQgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yKXxmdW5jdGlvbiAodGhlIGltcGxpY2l0IG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcil8aW5oZXJpdGVkIGNvbnN0cnVjdG9yfGluaGVyaXRlZCBjb25zdHJ1Y3RvciB9MCUxIG5vdCB2aWFibGU6ICVzZWxlY3R7JW9yZGluYWw2fCd0aGlzJ301IGFyZ3VtZW50ICglMikgaGFzICVzZWxlY3R7bm98X193ZWFrfF9fc3Ryb25nfTMgb3duZXJzaGlwLCBidXQgcGFyYW1ldGVyIGhhcyAlc2VsZWN0e25vfF9fd2Vha3xfX3N0cm9uZ300IG93bmVyc2hpcCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX292bF9jYW5kaWRhdGVfYmFkX2xpc3RfYXJndW1lbnQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjYW5kaWRhdGUgJXNlbGVjdHtmdW5jdGlvbnxmdW5jdGlvbnxjb25zdHJ1Y3RvcnxmdW5jdGlvbiB8ZnVuY3Rpb24gfGNvbnN0cnVjdG9yIHxjb25zdHJ1Y3RvciAodGhlIGltcGxpY2l0IGRlZmF1bHQgY29uc3RydWN0b3IpfGNvbnN0cnVjdG9yICh0aGUgaW1wbGljaXQgY29weSBjb25zdHJ1Y3Rvcil8Y29uc3RydWN0b3IgKHRoZSBpbXBsaWNpdCBtb3ZlIGNvbnN0cnVjdG9yKXxmdW5jdGlvbiAodGhlIGltcGxpY2l0IGNvcHkgYXNzaWdubWVudCBvcGVyYXRvcil8ZnVuY3Rpb24gKHRoZSBpbXBsaWNpdCBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IpfGluaGVyaXRlZCBjb25zdHJ1Y3Rvcnxpbmhlcml0ZWQgY29uc3RydWN0b3IgfTAlMSBub3QgdmlhYmxlOiBjYW5ub3QgY29udmVydCBpbml0aWFsaXplciBsaXN0IGFyZ3VtZW50IHRvICUzIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3ZsX2NhbmRpZGF0ZV9iYWRfbHZhbHVlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FuZGlkYXRlICVzZWxlY3R7ZnVuY3Rpb258ZnVuY3Rpb258Y29uc3RydWN0b3J8ZnVuY3Rpb24gfGZ1bmN0aW9uIHxjb25zdHJ1Y3RvciB8Y29uc3RydWN0b3IgKHRoZSBpbXBsaWNpdCBkZWZhdWx0IGNvbnN0cnVjdG9yKXxjb25zdHJ1Y3RvciAodGhlIGltcGxpY2l0IGNvcHkgY29uc3RydWN0b3IpfGNvbnN0cnVjdG9yICh0aGUgaW1wbGljaXQgbW92ZSBjb25zdHJ1Y3Rvcil8ZnVuY3Rpb24gKHRoZSBpbXBsaWNpdCBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IpfGZ1bmN0aW9uICh0aGUgaW1wbGljaXQgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yKXxpbmhlcml0ZWQgY29uc3RydWN0b3J8aW5oZXJpdGVkIGNvbnN0cnVjdG9yIH0wJTEgbm90IHZpYWJsZTogZXhwZWN0cyBhbiBsLXZhbHVlIGZvciAlc2VsZWN0eyVvcmRpbmFsMyBhcmd1bWVudHxvYmplY3QgYXJndW1lbnR9MiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX292bF9jYW5kaWRhdGVfYmFkX292ZXJsb2FkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FuZGlkYXRlICVzZWxlY3R7ZnVuY3Rpb258ZnVuY3Rpb258Y29uc3RydWN0b3J8ZnVuY3Rpb24gfGZ1bmN0aW9uIHxjb25zdHJ1Y3RvciB8Y29uc3RydWN0b3IgKHRoZSBpbXBsaWNpdCBkZWZhdWx0IGNvbnN0cnVjdG9yKXxjb25zdHJ1Y3RvciAodGhlIGltcGxpY2l0IGNvcHkgY29uc3RydWN0b3IpfGNvbnN0cnVjdG9yICh0aGUgaW1wbGljaXQgbW92ZSBjb25zdHJ1Y3Rvcil8ZnVuY3Rpb24gKHRoZSBpbXBsaWNpdCBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IpfGZ1bmN0aW9uICh0aGUgaW1wbGljaXQgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yKXxpbmhlcml0ZWQgY29uc3RydWN0b3J8aW5oZXJpdGVkIGNvbnN0cnVjdG9yIH0wJTEgbm90IHZpYWJsZTogbm8gb3ZlcmxvYWQgb2YgJTMgbWF0Y2hpbmcgJTIgZm9yICVvcmRpbmFsNCBhcmd1bWVudCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX292bF9jYW5kaWRhdGVfYmFkX293bmVyc2hpcCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSAlc2VsZWN0e2Z1bmN0aW9ufGZ1bmN0aW9ufGNvbnN0cnVjdG9yfGZ1bmN0aW9uIHxmdW5jdGlvbiB8Y29uc3RydWN0b3IgfGNvbnN0cnVjdG9yICh0aGUgaW1wbGljaXQgZGVmYXVsdCBjb25zdHJ1Y3Rvcil8Y29uc3RydWN0b3IgKHRoZSBpbXBsaWNpdCBjb3B5IGNvbnN0cnVjdG9yKXxjb25zdHJ1Y3RvciAodGhlIGltcGxpY2l0IG1vdmUgY29uc3RydWN0b3IpfGZ1bmN0aW9uICh0aGUgaW1wbGljaXQgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yKXxmdW5jdGlvbiAodGhlIGltcGxpY2l0IG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcil8aW5oZXJpdGVkIGNvbnN0cnVjdG9yfGluaGVyaXRlZCBjb25zdHJ1Y3RvciB9MCUxIG5vdCB2aWFibGU6ICVzZWxlY3R7JW9yZGluYWw2fCd0aGlzJ301IGFyZ3VtZW50ICglMikgaGFzICVzZWxlY3R7bm98X191bnNhZmVfdW5yZXRhaW5lZHxfX3N0cm9uZ3xfX3dlYWt8X19hdXRvcmVsZWFzaW5nfTMgb3duZXJzaGlwLCBidXQgcGFyYW1ldGVyIGhhcyAlc2VsZWN0e25vfF9fdW5zYWZlX3VucmV0YWluZWR8X19zdHJvbmd8X193ZWFrfF9fYXV0b3JlbGVhc2luZ300IG93bmVyc2hpcCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX292bF9jYW5kaWRhdGVfYmFkX3RhcmdldCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSAlc2VsZWN0e2Z1bmN0aW9ufGZ1bmN0aW9ufGNvbnN0cnVjdG9yfGZ1bmN0aW9ufGZ1bmN0aW9ufGNvbnN0cnVjdG9yfGNvbnN0cnVjdG9yICh0aGUgaW1wbGljaXQgZGVmYXVsdCBjb25zdHJ1Y3Rvcil8Y29uc3RydWN0b3IgKHRoZSBpbXBsaWNpdCBjb3B5IGNvbnN0cnVjdG9yKXxjb25zdHJ1Y3RvciAodGhlIGltcGxpY2l0IG1vdmUgY29uc3RydWN0b3IpfGZ1bmN0aW9uICh0aGUgaW1wbGljaXQgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yKXxmdW5jdGlvbiAodGhlIGltcGxpY2l0IG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcil8aW5oZXJpdGVkIGNvbnN0cnVjdG9yfGluaGVyaXRlZCBjb25zdHJ1Y3Rvcn0wIG5vdCB2aWFibGU6IGNhbGwgdG8gJXNlbGVjdHtfX2RldmljZV9ffF9fZ2xvYmFsX198X19ob3N0X198X19ob3N0X18gX19kZXZpY2VfX3xpbnZhbGlkfTEgZnVuY3Rpb24gZnJvbSAlc2VsZWN0e19fZGV2aWNlX198X19nbG9iYWxfX3xfX2hvc3RfX3xfX2hvc3RfXyBfX2RldmljZV9ffGludmFsaWR9MiBmdW5jdGlvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX292bF9jYW5kaWRhdGVfYmFkX3VuYWxpZ25lZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSAlc2VsZWN0e2Z1bmN0aW9ufGZ1bmN0aW9ufGNvbnN0cnVjdG9yfGZ1bmN0aW9uIHxmdW5jdGlvbiB8Y29uc3RydWN0b3IgfGNvbnN0cnVjdG9yICh0aGUgaW1wbGljaXQgZGVmYXVsdCBjb25zdHJ1Y3Rvcil8Y29uc3RydWN0b3IgKHRoZSBpbXBsaWNpdCBjb3B5IGNvbnN0cnVjdG9yKXxjb25zdHJ1Y3RvciAodGhlIGltcGxpY2l0IG1vdmUgY29uc3RydWN0b3IpfGZ1bmN0aW9uICh0aGUgaW1wbGljaXQgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yKXxmdW5jdGlvbiAodGhlIGltcGxpY2l0IG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcil8aW5oZXJpdGVkIGNvbnN0cnVjdG9yfGluaGVyaXRlZCBjb25zdHJ1Y3RvciB9MCUxIG5vdCB2aWFibGU6ICVvcmRpbmFsNCBhcmd1bWVudCAoJTIpIHdvdWxkIGxvc2UgX191bmFsaWduZWQgcXVhbGlmaWVyIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3ZsX2NhbmRpZGF0ZV9kZWR1Y2VkX21pc21hdGNoLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWQ6IGRlZHVjZWQgdHlwZSAlZGlmZnskIG9mICVzZWxlY3R7fGVsZW1lbnQgb2YgfTQlb3JkaW5hbDAgcGFyYW1ldGVyIGRvZXMgbm90IG1hdGNoIGFkanVzdGVkIHR5cGUgJCBvZiAlc2VsZWN0e3xlbGVtZW50IG9mIH00YXJndW1lbnR8b2YgJXNlbGVjdHt8ZWxlbWVudCBvZiB9NCVvcmRpbmFsMCBwYXJhbWV0ZXIgZG9lcyBub3QgbWF0Y2ggYWRqdXN0ZWQgdHlwZSBvZiAlc2VsZWN0e3xlbGVtZW50IG9mIH00YXJndW1lbnR9MSwyJTMiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vdmxfY2FuZGlkYXRlX2RlbGV0ZWQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjYW5kaWRhdGUgJXNlbGVjdHtmdW5jdGlvbnxmdW5jdGlvbnxjb25zdHJ1Y3RvcnxmdW5jdGlvbiB8ZnVuY3Rpb24gfGNvbnN0cnVjdG9yIHxjb25zdHJ1Y3RvciAodGhlIGltcGxpY2l0IGRlZmF1bHQgY29uc3RydWN0b3IpfGNvbnN0cnVjdG9yICh0aGUgaW1wbGljaXQgY29weSBjb25zdHJ1Y3Rvcil8Y29uc3RydWN0b3IgKHRoZSBpbXBsaWNpdCBtb3ZlIGNvbnN0cnVjdG9yKXxmdW5jdGlvbiAodGhlIGltcGxpY2l0IGNvcHkgYXNzaWdubWVudCBvcGVyYXRvcil8ZnVuY3Rpb24gKHRoZSBpbXBsaWNpdCBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IpfGluaGVyaXRlZCBjb25zdHJ1Y3Rvcnxpbmhlcml0ZWQgY29uc3RydWN0b3IgfTAlMSBoYXMgYmVlbiAlc2VsZWN0e2V4cGxpY2l0bHkgbWFkZSB1bmF2YWlsYWJsZXxleHBsaWNpdGx5IGRlbGV0ZWR8aW1wbGljaXRseSBkZWxldGVkfTIiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vdmxfY2FuZGlkYXRlX2Rpc2FibGVkX2J5X2VuYWJsZV9pZiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSB0ZW1wbGF0ZSBpZ25vcmVkOiBkaXNhYmxlZCBieSAlMCUxIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3ZsX2NhbmRpZGF0ZV9kaXNhYmxlZF9ieV9leHRlbnNpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjYW5kaWRhdGUgZGlzYWJsZWQgZHVlIHRvIE9wZW5DTCBleHRlbnNpb24iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vdmxfY2FuZGlkYXRlX2Rpc2FibGVkX2J5X2Z1bmN0aW9uX2NvbmRfYXR0ciwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSBkaXNhYmxlZDogJTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vdmxfY2FuZGlkYXRlX2Rpc2FibGVkX2J5X3JlcXVpcmVtZW50LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWQ6IHJlcXVpcmVtZW50ICclMCcgd2FzIG5vdCBzYXRpc2ZpZWQlMSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX292bF9jYW5kaWRhdGVfZXhwbGljaXRfYXJnX21pc21hdGNoX25hbWVkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWQ6IGludmFsaWQgZXhwbGljaXRseS1zcGVjaWZpZWQgYXJndW1lbnQgZm9yIHRlbXBsYXRlIHBhcmFtZXRlciAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX292bF9jYW5kaWRhdGVfZXhwbGljaXRfYXJnX21pc21hdGNoX3VubmFtZWQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjYW5kaWRhdGUgdGVtcGxhdGUgaWdub3JlZDogaW52YWxpZCBleHBsaWNpdGx5LXNwZWNpZmllZCBhcmd1bWVudCBmb3IgJW9yZGluYWwwIHRlbXBsYXRlIHBhcmFtZXRlciIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX292bF9jYW5kaWRhdGVfaGFzX3Bhc3Nfb2JqZWN0X3NpemVfcGFyYW1zLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FuZGlkYXRlIGFkZHJlc3MgY2Fubm90IGJlIHRha2VuIGJlY2F1c2UgcGFyYW1ldGVyICUwIGhhcyBwYXNzX29iamVjdF9zaXplIGF0dHJpYnV0ZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX292bF9jYW5kaWRhdGVfaWxsZWdhbF9jb25zdHJ1Y3RvciwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSAlc2VsZWN0e2NvbnN0cnVjdG9yfHRlbXBsYXRlfTAgaWdub3JlZDogaW5zdGFudGlhdGlvbiAlc2VsZWN0e3Rha2VzfHdvdWxkIHRha2V9MCBpdHMgb3duIGNsYXNzIHR5cGUgYnkgdmFsdWUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vdmxfY2FuZGlkYXRlX2luY29tcGxldGVfZGVkdWN0aW9uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWQ6IGNvdWxkbid0IGluZmVyIHRlbXBsYXRlIGFyZ3VtZW50ICUwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3ZsX2NhbmRpZGF0ZV9pbmNvbnNpc3RlbnRfZGVkdWN0aW9uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWQ6IGRlZHVjZWQgY29uZmxpY3RpbmcgJXNlbGVjdHt0eXBlc3x2YWx1ZXN8dGVtcGxhdGVzfTAgZm9yIHBhcmFtZXRlciAlMSVkaWZmeyAoJCB2cy4gJCl8fTIsMyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX292bF9jYW5kaWRhdGVfaW5jb25zaXN0ZW50X2RlZHVjdGlvbl90eXBlcywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSB0ZW1wbGF0ZSBpZ25vcmVkOiBkZWR1Y2VkIHZhbHVlcyAlZGlmZntvZiBjb25mbGljdGluZyB0eXBlcyBmb3IgcGFyYW1ldGVyICUwICglMSBvZiB0eXBlICQgdnMuICUzIG9mIHR5cGUgJCl8JTEgYW5kICUzIG9mIGNvbmZsaWN0aW5nIHR5cGVzIGZvciBwYXJhbWV0ZXIgJTB9Miw0IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3ZsX2NhbmRpZGF0ZV9pbmhlcml0ZWRfY29uc3RydWN0b3IsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjb25zdHJ1Y3RvciBmcm9tIGJhc2UgY2xhc3MgJTAgaW5oZXJpdGVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vdmxfY2FuZGlkYXRlX2luaGVyaXRlZF9jb25zdHJ1Y3Rvcl9zbGljZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSAlc2VsZWN0e2NvbnN0cnVjdG9yfHRlbXBsYXRlfTAgaWdub3JlZDogaW5oZXJpdGVkIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSB1c2VkIHRvICVzZWxlY3R7Y29weXxtb3ZlfTEgb2JqZWN0IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3ZsX2NhbmRpZGF0ZV9pbnN0YW50aWF0aW9uX2RlcHRoLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWQ6IHN1YnN0aXR1dGlvbiBleGNlZWRlZCBtYXhpbXVtIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gZGVwdGgiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vdmxfY2FuZGlkYXRlX25vbl9kZWR1Y2VkX21pc21hdGNoLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWQ6IGNvdWxkIG5vdCBtYXRjaCAlZGlmZnskIGFnYWluc3QgJHx0eXBlc30wLDEiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vdmxfY2FuZGlkYXRlX25vbl9kZWR1Y2VkX21pc21hdGNoX3F1YWxpZmllZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSB0ZW1wbGF0ZSBpZ25vcmVkOiBjb3VsZCBub3QgbWF0Y2ggJXEwIGFnYWluc3QgJXExIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3ZsX2NhbmRpZGF0ZV9zdWJzdGl0dXRpb25fZmFpbHVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNhbmRpZGF0ZSB0ZW1wbGF0ZSBpZ25vcmVkOiBzdWJzdGl0dXRpb24gZmFpbHVyZSUwJTEiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vdmxfY2FuZGlkYXRlX3VuZGVycXVhbGlmaWVkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWQ6IGNhbm5vdCBkZWR1Y2UgYSB0eXBlIGZvciAlMCB0aGF0IHdvdWxkIG1ha2UgJTIgZXF1YWwgJTEiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9vdmxfc3Vycm9nYXRlX2NhbmQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjb252ZXJzaW9uIGNhbmRpZGF0ZSBvZiB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3ZsX3Rvb19tYW55X2NhbmRpZGF0ZXMsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJyZW1haW5pbmcgJTAgY2FuZGlkYXRlJXMwIG9taXR0ZWQ7IHBhc3MgLWZzaG93LW92ZXJsb2Fkcz1hbGwgdG8gc2hvdyB0aGVtIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfb3duZXJzaGlwX3JldHVybnNfaW5kZXhfbWlzbWF0Y2gsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJkZWNsYXJlZCB3aXRoIGluZGV4ICUwIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wYXJhbWV0ZXJfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInBhc3NpbmcgYXJndW1lbnQgdG8gcGFyYW1ldGVyIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wYXJhbWV0ZXJfbmFtZWRfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInBhc3NpbmcgYXJndW1lbnQgdG8gcGFyYW1ldGVyICUwIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wYXJhbWV0ZXJfcGFja19oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicGFyYW1ldGVyIHBhY2sgJTAgZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3BhcmFtZXRlcl90eXBlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicGFyYW1ldGVyIG9mIHR5cGUgJTAgaXMgZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3BhcnRpYWxfc3BlY19tYXRjaCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInBhcnRpYWwgc3BlY2lhbGl6YXRpb24gbWF0Y2hlcyAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3BhcnRpYWxfc3BlY19ub3RfbW9yZV9zcGVjaWFsaXplZF90aGFuX3ByaW1hcnksIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3BhcnRpYWxfc3BlY2lhbGl6YXRpb25fZGVjbGFyZWRfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wZXJmb3Jtc19mb3JiaWRkZW5fYXJjX2NvbnZlcnNpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbmxpbmUgZnVuY3Rpb24gcGVyZm9ybXMgYSBjb252ZXJzaW9uIHdoaWNoIGlzIGZvcmJpZGRlbiBpbiBBUkMiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTApCitESUFHKG5vdGVfcG9zc2libGVfdGFyZ2V0X29mX2NhbGwsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwb3NzaWJsZSB0YXJnZXQgZm9yIGNhbGwiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcmFnbWFfYXR0cmlidXRlX2FwcGxpZWRfZGVjbF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAid2hlbiBhcHBsaWVkIHRvIHRoaXMgZGVjbGFyYXRpb24iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcmFnbWFfYXR0cmlidXRlX3JlZ2lvbl9lbmRzX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICInI3ByYWdtYSBjbGFuZyBhdHRyaWJ1dGUgcHVzaCcgcmVnaW9ucyBlbmRzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcmFnbWFfcGFja19oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJldmlvdXMgJyNwcmFnbWEgcGFjaycgZGlyZWN0aXZlIHRoYXQgbW9kaWZpZXMgYWxpZ25tZW50IGlzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcmFnbWFfcGFja19wb3BfaW5zdGVhZF9yZXNldCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRpZCB5b3UgaW50ZW5kIHRvIHVzZSAnI3ByYWdtYSBwYWNrIChwb3ApJyBpbnN0ZWFkIG9mICcjcHJhZ21hIHBhY2soKSc/IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJlY2VkZW5jZV9iaXR3aXNlX2ZpcnN0LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicGxhY2UgcGFyZW50aGVzZXMgYXJvdW5kIHRoZSAlMCBleHByZXNzaW9uIHRvIGV2YWx1YXRlIGl0IGZpcnN0IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJlY2VkZW5jZV9jb25kaXRpb25hbF9maXJzdCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInBsYWNlIHBhcmVudGhlc2VzIGFyb3VuZCB0aGUgJz86JyBleHByZXNzaW9uIHRvIGV2YWx1YXRlIGl0IGZpcnN0IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJlY2VkZW5jZV9zaWxlbmNlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicGxhY2UgcGFyZW50aGVzZXMgYXJvdW5kIHRoZSAnJTAnIGV4cHJlc3Npb24gdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmciLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcmV2X21vZHVsZV9kZWNsYXJhdGlvbiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInByZXZpb3VzIG1vZHVsZSBkZWNsYXJhdGlvbiBpcyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEzKQorRElBRyhub3RlX3ByZXZfbW9kdWxlX2RlZmluaXRpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwcmV2aW91c2x5IGRlZmluZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxMykKK0RJQUcobm90ZV9wcmV2X21vZHVsZV9kZWZpbml0aW9uX2Zyb21fYXN0X2ZpbGUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJtb2R1bGUgbG9hZGVkIGZyb20gJyUwJyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxMykKK0RJQUcobm90ZV9wcmV2X3BhcnRpYWxfc3BlY19oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJldmlvdXMgZGVjbGFyYXRpb24gb2YgY2xhc3MgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiAlMCBpcyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJldmlvdXNfYWNjZXNzX2RlY2xhcmF0aW9uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJldmlvdXNseSBkZWNsYXJlZCAnJTEnIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcmV2aW91c19hdHRyaWJ1dGUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwcmV2aW91cyBhdHRyaWJ1dGUgaXMgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3ByZXZpb3VzX2J1aWx0aW5fZGVjbGFyYXRpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlMCBpcyBhIGJ1aWx0aW4gd2l0aCB0eXBlICUxIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJldmlvdXNfZGVjbCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiUwIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcmV2aW91c19leGNlcHRpb25faGFuZGxlciwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImZvciB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJldmlvdXNfZXhwbGljaXRfaW5zdGFudGlhdGlvbiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInByZXZpb3VzIGV4cGxpY2l0IGluc3RhbnRpYXRpb24gaXMgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3ByZXZpb3VzX2luaXRpYWxpemVyLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJldmlvdXMgaW5pdGlhbGl6YXRpb24gJXNlbGVjdHt8d2l0aCBzaWRlIGVmZmVjdHMgfTBpcyBoZXJlJXNlbGVjdHt8IChzaWRlIGVmZmVjdHMgbWF5IG5vdCBvY2N1ciBhdCBydW4gdGltZSl9MCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3ByZXZpb3VzX21zX2luaGVyaXRhbmNlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJldmlvdXMgaW5oZXJpdGFuY2UgbW9kZWwgc3BlY2lmaWVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcmV2aW91c19uYW1lc3BhY2VfYWxpYXMsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwcmV2aW91c2x5IGRlZmluZWQgYXMgYW4gYWxpYXMgZm9yICUwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJldmlvdXNfdGVtcGxhdGVfc3BlY2lhbGl6YXRpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwcmV2aW91cyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBpcyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJldmlvdXNfdXVpZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInByZXZpb3VzIHV1aWQgc3BlY2lmaWVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcmludGZfY19zdHIsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJkaWQgeW91IG1lYW4gdG8gY2FsbCB0aGUgJTAgbWV0aG9kPyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3ByaW9yX3RlbXBsYXRlX2FyZ19zdWJzdGl0dXRpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ3aGlsZSBzdWJzdGl0dXRpbmcgcHJpb3IgdGVtcGxhdGUgYXJndW1lbnRzIGludG8gJXNlbGVjdHtub24tdHlwZXx0ZW1wbGF0ZX0wIHRlbXBsYXRlIHBhcmFtZXRlciUxICUyIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJpdmF0ZV9leHRlcm4sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ1c2UgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eShcImhpZGRlblwiKSkpIGF0dHJpYnV0ZSBpbnN0ZWFkIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJvcGVydHlfYXR0cmlidXRlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJvcGVydHkgJTAgaXMgZGVjbGFyZWQgJXNlbGVjdHtkZXByZWNhdGVkfHVuYXZhaWxhYmxlfHBhcnRpYWx9MSBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJvcGVydHlfZGVjbGFyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInByb3BlcnR5IGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcm9wZXJ0eV9zeW50aGVzaXplLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJvcGVydHkgc3ludGhlc2l6ZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3Byb3RlY3RlZF9ieV9fX2Jsb2NrLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAianVtcCBieXBhc3NlcyBzZXR1cCBvZiBfX2Jsb2NrIHZhcmlhYmxlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJvdGVjdGVkX2J5X2NsZWFudXAsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGJ5cGFzc2VzIGluaXRpYWxpemF0aW9uIG9mIHZhcmlhYmxlIHdpdGggX19hdHRyaWJ1dGVfXygoY2xlYW51cCkpIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJvdGVjdGVkX2J5X2NvbnN0ZXhwcl9pZiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImp1bXAgZW50ZXJzIGNvbnRyb2xsZWQgc3RhdGVtZW50IG9mIGNvbnN0ZXhwciBpZiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3Byb3RlY3RlZF9ieV9jeHhfY2F0Y2gsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGJ5cGFzc2VzIGluaXRpYWxpemF0aW9uIG9mIGNhdGNoIGJsb2NrIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJvdGVjdGVkX2J5X2N4eF90cnksIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGJ5cGFzc2VzIGluaXRpYWxpemF0aW9uIG9mIHRyeSBibG9jayIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3Byb3RlY3RlZF9ieV9pZl9hdmFpbGFibGUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGVudGVycyBjb250cm9sbGVkIHN0YXRlbWVudCBvZiBpZiBhdmFpbGFibGUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcm90ZWN0ZWRfYnlfbm9uX3RyaXZpYWxfY19zdHJ1Y3RfaW5pdCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImp1bXAgYnlwYXNzZXMgaW5pdGlhbGl6YXRpb24gb2YgdmFyaWFibGUgb2Ygbm9uLXRyaXZpYWwgQyBzdHJ1Y3QgdHlwZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3Byb3RlY3RlZF9ieV9vYmpjX2F1dG9yZWxlYXNlcG9vbCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImp1bXAgYnlwYXNzZXMgYXV0byByZWxlYXNlIHB1c2ggb2YgQGF1dG9yZWxlYXNlcG9vbCBibG9jayIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3Byb3RlY3RlZF9ieV9vYmpjX2NhdGNoLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAianVtcCBieXBhc3NlcyBpbml0aWFsaXphdGlvbiBvZiBAY2F0Y2ggYmxvY2siLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcm90ZWN0ZWRfYnlfb2JqY19mYXN0X2VudW1lcmF0aW9uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAianVtcCBlbnRlcnMgT2JqZWN0aXZlLUMgZmFzdCBlbnVtZXJhdGlvbiBsb29wIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJvdGVjdGVkX2J5X29iamNfZmluYWxseSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImp1bXAgYnlwYXNzZXMgaW5pdGlhbGl6YXRpb24gb2YgQGZpbmFsbHkgYmxvY2siLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcm90ZWN0ZWRfYnlfb2JqY19zdHJvbmdfaW5pdCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImp1bXAgYnlwYXNzZXMgaW5pdGlhbGl6YXRpb24gb2YgX19zdHJvbmcgdmFyaWFibGUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcm90ZWN0ZWRfYnlfb2JqY19zeW5jaHJvbml6ZWQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGJ5cGFzc2VzIGluaXRpYWxpemF0aW9uIG9mIEBzeW5jaHJvbml6ZWQgYmxvY2siLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcm90ZWN0ZWRfYnlfb2JqY190cnksIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGJ5cGFzc2VzIGluaXRpYWxpemF0aW9uIG9mIEB0cnkgYmxvY2siLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcm90ZWN0ZWRfYnlfb2JqY193ZWFrX2luaXQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGJ5cGFzc2VzIGluaXRpYWxpemF0aW9uIG9mIF9fd2VhayB2YXJpYWJsZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3Byb3RlY3RlZF9ieV9zZWhfZXhjZXB0LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAianVtcCBieXBhc3NlcyBpbml0aWFsaXphdGlvbiBvZiBfX2V4Y2VwdCBibG9jayIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3Byb3RlY3RlZF9ieV9zZWhfZmluYWxseSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImp1bXAgYnlwYXNzZXMgaW5pdGlhbGl6YXRpb24gb2YgX19maW5hbGx5IGJsb2NrIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJvdGVjdGVkX2J5X3NlaF90cnksIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGJ5cGFzc2VzIGluaXRpYWxpemF0aW9uIG9mIF9fdHJ5IGJsb2NrIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJvdGVjdGVkX2J5X3ZhcmlhYmxlX2luaXQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGJ5cGFzc2VzIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJvdGVjdGVkX2J5X3ZhcmlhYmxlX25vbl9wb2QsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGJ5cGFzc2VzIGluaXRpYWxpemF0aW9uIG9mIG5vbi1QT0QgdmFyaWFibGUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcm90ZWN0ZWRfYnlfdmFyaWFibGVfbm9udHJpdl9kZXN0cnVjdG9yLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAianVtcCBieXBhc3NlcyB2YXJpYWJsZSB3aXRoIGEgbm9uLXRyaXZpYWwgZGVzdHJ1Y3RvciIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3Byb3RlY3RlZF9ieV92bGEsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGJ5cGFzc2VzIGluaXRpYWxpemF0aW9uIG9mIHZhcmlhYmxlIGxlbmd0aCBhcnJheSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3Byb3RlY3RlZF9ieV92bGFfdHlwZV9hbGlhcywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImp1bXAgYnlwYXNzZXMgaW5pdGlhbGl6YXRpb24gb2YgVkxBIHR5cGUgYWxpYXMiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcm90ZWN0ZWRfYnlfdmxhX3R5cGVkZWYsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJqdW1wIGJ5cGFzc2VzIGluaXRpYWxpemF0aW9uIG9mIFZMQSB0eXBlZGVmIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJvdG9jb2xfZGVjbCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInByb3RvY29sIGlzIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcm90b2NvbF9kZWNsX3VuZGVmaW5lZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInByb3RvY29sICUwIGhhcyBubyBkZWZpbml0aW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcHJvdG9jb2xfbWV0aG9kLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicHJvdG9jb2wgbWV0aG9kIGlzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wcm90b2NvbF9wcm9wZXJ0eV9kZWNsYXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaXQgY291bGQgYWxzbyBiZSBwcm9wZXJ0eSAlc2VsZWN0e29mIHR5cGUgJTF8d2l0aG91dCBhdHRyaWJ1dGUgJyUxJ3x3aXRoIGF0dHJpYnV0ZSAnJTEnfHdpdGggZ2V0dGVyICUxfHdpdGggc2V0dGVyICUxfTAgZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3B1cmVfcXVhbGlmaWVkX2NhbGxfa2V4dCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInF1YWxpZmllZCBjYWxsIHRvICUwOjolMSBpcyB0cmVhdGVkIGFzIGEgdmlydHVhbCBjYWxsIHRvICUxIGR1ZSB0byAtZmFwcGxlLWtleHQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9wdXJlX3ZpcnR1YWxfZnVuY3Rpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ1bmltcGxlbWVudGVkIHB1cmUgdmlydHVhbCBtZXRob2QgJTAgaW4gJTEiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9yYWlpX2d1YXJkX2FkZF9uYW1lLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYWRkIGEgdmFyaWFibGUgbmFtZSB0byBkZWNsYXJlIGEgJTAgaW5pdGlhbGl6ZWQgd2l0aCAlMSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3JlY2VpdmVyX2NsYXNzX2RlY2xhcmVkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicmVjZWl2ZXIgaXMgaW5zdGFuY2Ugb2YgY2xhc3MgZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3JlY2VpdmVyX2V4cHJfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInJlY2VpdmVyIGV4cHJlc3Npb24gaXMgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3JlY2VpdmVyX2lzX2lkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicmVjZWl2ZXIgaXMgdHJlYXRlZCB3aXRoICdpZCcgdHlwZSBmb3IgcHVycG9zZSBvZiBtZXRob2QgbG9va3VwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcmVkZWZpbml0aW9uX2luY2x1ZGVfc2FtZV9maWxlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJyUwJyBpbmNsdWRlZCBtdWx0aXBsZSB0aW1lcywgYWRkaXRpb25hbCBpbmNsdWRlIHNpdGUgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxMykKK0RJQUcobm90ZV9yZWRlZmluaXRpb25fbW9kdWxlc19zYW1lX2ZpbGUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICInJTAnIGluY2x1ZGVkIG11bHRpcGxlIHRpbWVzLCBhZGRpdGlvbmFsIGluY2x1ZGUgc2l0ZSBpbiBoZWFkZXIgZnJvbSBtb2R1bGUgJyUxJyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxMykKK0RJQUcobm90ZV9yZWZfb3JfcHRyX21lbWJlcl9kZWNsYXJlZF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJXNlbGVjdHtyZWZlcmVuY2V8cG9pbnRlcn0wIG1lbWJlciBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcmVmX3N1Ym9iamVjdF9vZl9tZW1iZXJfZGVjbGFyZWRfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm1lbWJlciB3aXRoIHJlZmVyZW5jZSBzdWJvYmplY3QgZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3JlZl92YXJfbG9jYWxfYmluZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImJpbmRpbmcgcmVmZXJlbmNlIHZhcmlhYmxlICUwIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9yZWZjb25zdF9tZW1iZXJfbm90X2luaXRpYWxpemVkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJXNlbGVjdHtjb25zdHxyZWZlcmVuY2V9MCBtZW1iZXIgJTEgd2lsbCBuZXZlciBiZSBpbml0aWFsaXplZCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3JlZmVyZW5jZV9pc19yZXR1cm5fdmFsdWUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlMCByZXR1cm5zIGEgcmVmZXJlbmNlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcmVmZXJlbmNlZF9jbGFzc190ZW1wbGF0ZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNsYXNzIHRlbXBsYXRlIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9yZWludGVycHJldF91cGRvd25jYXN0X3VzZV9zdGF0aWMsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ1c2UgJ3N0YXRpY19jYXN0JyB0byBhZGp1c3QgdGhlIHBvaW50ZXIgY29ycmVjdGx5IHdoaWxlICVzZWxlY3R7dXBjYXN0aW5nfGRvd25jYXN0aW5nfTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9yZWxhdGVkX3Jlc3VsdF90eXBlX2V4cGxpY2l0LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJXNlbGVjdHtvdmVycmlkZGVufGN1cnJlbnR9MCBtZXRob2QgaXMgZXhwbGljaXRseSBkZWNsYXJlZCAnaW5zdGFuY2V0eXBlJyVzZWxlY3R7fCBhbmQgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGFuIGluc3RhbmNlIG9mIGl0cyBjbGFzcyB0eXBlfTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTcpCitESUFHKG5vdGVfcmVsYXRlZF9yZXN1bHRfdHlwZV9mYW1pbHksIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e292ZXJyaWRkZW58Y3VycmVudH0wIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSAnJXNlbGVjdHt8YWxsb2N8Y29weXxpbml0fG11dGFibGVDb3B5fG5ld3xhdXRvcmVsZWFzZXxkZWFsbG9jfGZpbmFsaXplfHJlbGVhc2V8cmV0YWlufHJldGFpbkNvdW50fHNlbGZ9MScgbWV0aG9kIGZhbWlseSVzZWxlY3R7fCBhbmQgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGFuIGluc3RhbmNlIG9mIGl0cyBjbGFzcyB0eXBlfTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTcpCitESUFHKG5vdGVfcmVsYXRlZF9yZXN1bHRfdHlwZV9pbmZlcnJlZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiVzZWxlY3R7Y2xhc3N8aW5zdGFuY2V9MCBtZXRob2QgJTEgaXMgYXNzdW1lZCB0byByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgaXRzIHJlY2VpdmVyIHR5cGUgKCUyKSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxNykKK0RJQUcobm90ZV9yZWxhdGVkX3Jlc3VsdF90eXBlX292ZXJyaWRkZW4sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJvdmVycmlkZGVuIG1ldGhvZCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIGl0cyBjbGFzcyB0eXBlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDE3KQorRElBRyhub3RlX3JlbW92ZV9hYnMsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJyZW1vdmUgdGhlIGNhbGwgdG8gJyUwJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcmVtb3ZlX21heF9jYWxsLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicmVtb3ZlIGNhbGwgdG8gbWF4IGZ1bmN0aW9uIGFuZCB1bnNpZ25lZCB6ZXJvIGFyZ3VtZW50IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcmVtb3ZlX21vdmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJyZW1vdmUgc3RkOjptb3ZlIGNhbGwgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3JlbW92ZV9wYXJlbnNfZm9yX3ZhcmlhYmxlX2RlY2xhcmF0aW9uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAicmVtb3ZlIHBhcmVudGhlc2VzIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfcmVwbGFjZV9hYnNfZnVuY3Rpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ1c2UgZnVuY3Rpb24gJyUwJyBpbnN0ZWFkIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfc2VudGluZWxfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiVzZWxlY3R7ZnVuY3Rpb258bWV0aG9kfGJsb2NrfTAgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgc2VudGluZWwgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3NoYWRvd19maWVsZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcobm90ZV9zaWxlbmNlX3VubGlnbmVkX2FsbG9jYXRpb25fdW5hdmFpbGFibGUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpZiB5b3Ugc3VwcGx5IHlvdXIgb3duIGFsaWduZWQgYWxsb2NhdGlvbiBmdW5jdGlvbnMsIHVzZSAtV25vLWFsaWduZWQtYWxsb2NhdGlvbi11bmF2YWlsYWJsZSB0byBzaWxlbmNlIHRoaXMgZGlhZ25vc3RpYyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3NwZWNpYWxpemVkX2RlY2wsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJhdHRlbXB0IHRvIHNwZWNpYWxpemUgZGVjbGFyYXRpb24gaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3NwZWNpYWxpemVkX2VudGl0eSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImV4cGxpY2l0bHkgc3BlY2lhbGl6ZWQgZGVjbGFyYXRpb24gaXMgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3N0cmluZ19wbHVzX3NjYWxhcl9zaWxlbmNlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidXNlIGFycmF5IGluZGV4aW5nIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfc3RybGNweWNhdF93cm9uZ19zaXplLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2hhbmdlIHNpemUgYXJndW1lbnQgdG8gYmUgdGhlIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfc3RybmNhdF93cm9uZ19zaXplLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiY2hhbmdlIHRoZSBhcmd1bWVudCB0byBiZSB0aGUgZnJlZSBzcGFjZSBpbiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIG1pbnVzIHRoZSB0ZXJtaW5hdGluZyBudWxsIGJ5dGUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9zdHJ1Y3RfY2xhc3Nfc3VnZ2VzdGlvbiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRpZCB5b3UgbWVhbiAlc2VsZWN0e3N0cnVjdHxpbnRlcmZhY2V8Y2xhc3N9MCBoZXJlPyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3N1cHByZXNzZWRfY2xhc3NfZGVjbGFyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNsYXNzIHdpdGggc3BlY2lmaWVkIG9iamNfcmVxdWlyZXNfcHJvcGVydHlfZGVmaW5pdGlvbnMgYXR0cmlidXRlIGlzIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9zdXJyb3VuZGluZ19uYW1lc3BhY2VfZW5kc19oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAic3Vycm91bmRpbmcgbmFtZXNwYWNlIHdpdGggdmlzaWJpbGl0eSBhdHRyaWJ1dGUgZW5kcyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfc3Vycm91bmRpbmdfbmFtZXNwYWNlX3N0YXJ0c19oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAic3Vycm91bmRpbmcgbmFtZXNwYWNlIHdpdGggdmlzaWJpbGl0eSBhdHRyaWJ1dGUgc3RhcnRzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV9zd2l0Y2hfY29udmVyc2lvbiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNvbnZlcnNpb24gdG8gJXNlbGVjdHtpbnRlZ3JhbHxlbnVtZXJhdGlvbn0wIHR5cGUgJTEiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV90ZW1wbGF0ZV9hcmdfaW50ZXJuYWxfb2JqZWN0LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAibm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnQgcmVmZXJzIHRvICVzZWxlY3R7ZnVuY3Rpb258b2JqZWN0fTAgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3RlbXBsYXRlX2FyZ19yZWZlcnNfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm5vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50IHJlZmVycyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdGVtcGxhdGVfYXJnX3JlZmVyc19oZXJlX2Z1bmMsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ0ZW1wbGF0ZSBhcmd1bWVudCByZWZlcnMgdG8gZnVuY3Rpb24gdGVtcGxhdGUgJTAsIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV90ZW1wbGF0ZV9jbGFzc19leHBsaWNpdF9zcGVjaWFsaXphdGlvbl93YXNfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImNsYXNzIHRlbXBsYXRlICUwIHdhcyBleHBsaWNpdGx5IHNwZWNpYWxpemVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV90ZW1wbGF0ZV9jbGFzc19pbnN0YW50aWF0aW9uX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbiBpbnN0YW50aWF0aW9uIG9mIHRlbXBsYXRlIGNsYXNzICVxMCByZXF1ZXN0ZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3RlbXBsYXRlX2NsYXNzX2luc3RhbnRpYXRpb25fd2FzX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjbGFzcyB0ZW1wbGF0ZSAlMCB3YXMgaW5zdGFudGlhdGVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV90ZW1wbGF0ZV9kZWNsX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ0ZW1wbGF0ZSBpcyBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdGVtcGxhdGVfZGVjbGFyZWRfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiVzZWxlY3R7ZnVuY3Rpb24gdGVtcGxhdGV8Y2xhc3MgdGVtcGxhdGV8dmFyaWFibGUgdGVtcGxhdGV8dHlwZSBhbGlhcyB0ZW1wbGF0ZXx0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJ9MCAlMSBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdGVtcGxhdGVfZGVmYXVsdF9hcmdfY2hlY2tpbmcsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ3aGlsZSBjaGVja2luZyBhIGRlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnQgdXNlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdGVtcGxhdGVfZW51bV9kZWZfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImluIGluc3RhbnRpYXRpb24gb2YgZW51bWVyYXRpb24gJXEwIHJlcXVlc3RlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdGVtcGxhdGVfZXhjZXB0aW9uX3NwZWNfaW5zdGFudGlhdGlvbl9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW4gaW5zdGFudGlhdGlvbiBvZiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBmb3IgJTAgcmVxdWVzdGVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV90ZW1wbGF0ZV9tZW1iZXJfY2xhc3NfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImluIGluc3RhbnRpYXRpb24gb2YgbWVtYmVyIGNsYXNzICVxMCByZXF1ZXN0ZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3RlbXBsYXRlX21lbWJlcl9mdW5jdGlvbl9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW4gaW5zdGFudGlhdGlvbiBvZiBtZW1iZXIgZnVuY3Rpb24gJXEwIHJlcXVlc3RlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdGVtcGxhdGVfbm9udHlwZV9wYXJtX2RpZmZlcmVudF90eXBlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidGVtcGxhdGUgbm9uLXR5cGUgcGFyYW1ldGVyIGhhcyBhIGRpZmZlcmVudCB0eXBlICUwIGluIHRlbXBsYXRlIGFyZ3VtZW50IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdGVtcGxhdGVfbm9udHlwZV9wYXJtX3ByZXZfZGVjbGFyYXRpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwcmV2aW91cyBub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgd2l0aCB0eXBlICUwIGlzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV90ZW1wbGF0ZV9uc2RtaV9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW4gaW5zdGFudGlhdGlvbiBvZiBkZWZhdWx0IG1lbWJlciBpbml0aWFsaXplciAlcTAgcmVxdWVzdGVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV90ZW1wbGF0ZV9wYXJhbV9kaWZmZXJlbnRfa2luZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInRlbXBsYXRlIHBhcmFtZXRlciBoYXMgYSBkaWZmZXJlbnQga2luZCBpbiB0ZW1wbGF0ZSBhcmd1bWVudCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3RlbXBsYXRlX3BhcmFtX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ0ZW1wbGF0ZSBwYXJhbWV0ZXIgaXMgZGVjbGFyZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3RlbXBsYXRlX3BhcmFtX2xpc3RfZGlmZmVyZW50X2FyaXR5LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJXNlbGVjdHt0b28gZmV3fHRvbyBtYW55fTAgdGVtcGxhdGUgcGFyYW1ldGVycyBpbiB0ZW1wbGF0ZSB0ZW1wbGF0ZSBhcmd1bWVudCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3RlbXBsYXRlX3BhcmFtX3ByZXZfZGVmYXVsdF9hcmcsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwcmV2aW91cyBkZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50IGRlZmluZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3RlbXBsYXRlX3BhcmFtZXRlcl9wYWNrX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwcmV2aW91cyAlc2VsZWN0e3RlbXBsYXRlIHR5cGV8bm9uLXR5cGUgdGVtcGxhdGV8dGVtcGxhdGUgdGVtcGxhdGV9MCBwYXJhbWV0ZXIlc2VsZWN0e3wgcGFja30xIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV90ZW1wbGF0ZV9wYXJhbWV0ZXJfcGFja19ub25fcGFjaywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiVzZWxlY3R7dGVtcGxhdGUgdHlwZXxub24tdHlwZSB0ZW1wbGF0ZXx0ZW1wbGF0ZSB0ZW1wbGF0ZX0wIHBhcmFtZXRlciVzZWxlY3R7fCBwYWNrfTEgZG9lcyBub3QgbWF0Y2ggJXNlbGVjdHt0ZW1wbGF0ZSB0eXBlfG5vbi10eXBlIHRlbXBsYXRlfHRlbXBsYXRlIHRlbXBsYXRlfTAgcGFyYW1ldGVyJXNlbGVjdHsgcGFja3x9MSBpbiB0ZW1wbGF0ZSBhcmd1bWVudCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3RlbXBsYXRlX3ByZXZfZGVjbGFyYXRpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwcmV2aW91cyB0ZW1wbGF0ZSAlc2VsZWN0e2RlY2xhcmF0aW9ufHRlbXBsYXRlIHBhcmFtZXRlcn0wIGlzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV90ZW1wbGF0ZV9yZWN1cnNpb25fZGVwdGgsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ1c2UgLWZ0ZW1wbGF0ZS1kZXB0aD1OIHRvIGluY3JlYXNlIHJlY3Vyc2l2ZSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGRlcHRoIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdGVtcGxhdGVfc3RhdGljX2RhdGFfbWVtYmVyX2RlZl9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW4gaW5zdGFudGlhdGlvbiBvZiBzdGF0aWMgZGF0YSBtZW1iZXIgJXEwIHJlcXVlc3RlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdGVtcGxhdGVfdHlwZV9hbGlhc19pbnN0YW50aWF0aW9uX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbiBpbnN0YW50aWF0aW9uIG9mIHRlbXBsYXRlIHR5cGUgYWxpYXMgJTAgcmVxdWVzdGVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV90ZW1wbGF0ZV91bm5hbWVkX3R5cGVfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInVubmFtZWQgdHlwZSB1c2VkIGluIHRlbXBsYXRlIGFyZ3VtZW50IHdhcyBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdGVtcGxhdGVfdmFyaWFibGVfZGVmX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbiBpbnN0YW50aWF0aW9uIG9mIHZhcmlhYmxlIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uICVxMCByZXF1ZXN0ZWQgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3RocmVhZF93YXJuaW5nX2luX2Z1biwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIlRocmVhZCB3YXJuaW5nIGluIGZ1bmN0aW9uICUwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdGhyb3dfaW5fZHRvciwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiVzZWxlY3R7ZGVzdHJ1Y3RvcnxkZWFsbG9jYXRvcn0wIGhhcyBhICVzZWxlY3R7bm9uLXRocm93aW5nfGltcGxpY2l0IG5vbi10aHJvd2luZ30xIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdGhyb3dfaW5fZnVuY3Rpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJmdW5jdGlvbiBkZWNsYXJlZCBub24tdGhyb3dpbmcgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3RyYW5zcGFyZW50X3VuaW9uX2ZpcnN0X2ZpZWxkX3NpemVfYWxpZ24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e2FsaWdubWVudHxzaXplfTAgb2YgZmlyc3QgZmllbGQgaXMgJTEgYml0cyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3R5cGVfaW5jb21wbGV0ZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIiUwIGlzIGluY29tcGxldGUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV90eXBlY2hlY2tfYXNzaWduX2NvbnN0LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJXNlbGVjdHtmdW5jdGlvbiAlMSB3aGljaCByZXR1cm5zIGNvbnN0LXF1YWxpZmllZCB0eXBlICUyIGRlY2xhcmVkIGhlcmV8dmFyaWFibGUgJTEgZGVjbGFyZWQgY29uc3QgaGVyZXwlc2VsZWN0e25vbi18fTFzdGF0aWMgZGF0YSBtZW1iZXIgJTIgZGVjbGFyZWQgY29uc3QgaGVyZXxtZW1iZXIgZnVuY3Rpb24gJXExIGlzIGRlY2xhcmVkIGNvbnN0IGhlcmV8JXNlbGVjdHt8bmVzdGVkIH0xZGF0YSBtZW1iZXIgJTIgZGVjbGFyZWQgY29uc3QgaGVyZX0wIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdHlwZWNoZWNrX21lbWJlcl9yZWZlcmVuY2Vfc3VnZ2VzdGlvbiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRpZCB5b3UgbWVhbiB0byB1c2UgJy4nIGluc3RlYWQ/IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdHlwZWRlZl9jaGFuZ2VzX2xpbmthZ2UsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ1c2UgYSB0YWcgbmFtZSBoZXJlIHRvIGVzdGFibGlzaCBsaW5rYWdlIHByaW9yIHRvIGRlZmluaXRpb24iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV90eXBlbmFtZV9yZWZlcnNfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInJlZmVyZW5jZWQgbWVtYmVyICUwIGlzIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV91bmd1YXJkZWRfYXZhaWxhYmxlX3NpbGVuY2UsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJlbmNsb3NlICUwIGluICVzZWxlY3R7YW4gQGF2YWlsYWJsZXxhIF9fYnVpbHRpbl9hdmFpbGFibGV9MSBjaGVjayB0byBzaWxlbmNlIHRoaXMgd2FybmluZyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3VuaW5pdF9maXhpdF9yZW1vdmVfY29uZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInJlbW92ZSB0aGUgJXNlbGVjdHsnJTEnIGlmIGl0cyBjb25kaXRpb258Y29uZGl0aW9uIGlmIGl0fTAgaXMgYWx3YXlzICVzZWxlY3R7ZmFsc2V8dHJ1ZX0yIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdW5pbml0X2luX3RoaXNfY29uc3RydWN0b3IsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJkdXJpbmcgZmllbGQgaW5pdGlhbGl6YXRpb24gaW4gJXNlbGVjdHt0aGlzfHRoZSBpbXBsaWNpdCBkZWZhdWx0fTAgY29uc3RydWN0b3IiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV91bmluaXRfcmVmZXJlbmNlX21lbWJlciwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInVuaW5pdGlhbGl6ZWQgcmVmZXJlbmNlIG1lbWJlciBpcyBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdW5pbml0X3Zhcl91c2UsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e3VuaW5pdGlhbGl6ZWQgdXNlIG9jY3Vyc3x2YXJpYWJsZSBpcyBjYXB0dXJlZCBieSBibG9ja30wIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV91bnJlYWNoYWJsZV9zaWxlbmNlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAic2lsZW5jZSBieSBhZGRpbmcgcGFyZW50aGVzZXMgdG8gbWFyayBjb2RlIGFzIGV4cGxpY2l0bHkgZGVhZCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3VzZV9pZmRlZl9ndWFyZHMsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ1bmd1YXJkZWQgaGVhZGVyOyBjb25zaWRlciB1c2luZyAjaWZkZWYgZ3VhcmRzIG9yICNwcmFnbWEgb25jZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3VzZV9ub25fcmVmZXJlbmNlX3R5cGUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ1c2Ugbm9uLXJlZmVyZW5jZSB0eXBlICUwIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdXNlX3JlZmVyZW5jZV90eXBlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidXNlIHJlZmVyZW5jZSB0eXBlICUwIHRvIHByZXZlbnQgY29weWluZyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3VzZV90aHJlYWRfbG9jYWwsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ1c2UgJ3RocmVhZF9sb2NhbCcgdG8gYWxsb3cgdGhpcyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3VzZV90eXBlX29yX25vbl9yZWZlcmVuY2UsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ1c2Ugbm9uLXJlZmVyZW5jZSB0eXBlICUwIHRvIGtlZXAgdGhlIGNvcHkgb3IgdHlwZSAlMSB0byBwcmV2ZW50IGNvcHlpbmciLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV91c2VkX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ1c2VkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV91c2VkX2luX2luaXRpYWxpemF0aW9uX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ1c2VkIGluIGluaXRpYWxpemF0aW9uIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV91c2VyX2RlY2xhcmVkX2N0b3IsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbXBsaWNpdCBkZWZhdWx0IGNvbnN0cnVjdG9yIHN1cHByZXNzZWQgYnkgdXNlci1kZWNsYXJlZCBjb25zdHJ1Y3RvciIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3VzaW5nX2RlY2wsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICIlc2VsZWN0e3xwcmV2aW91cyB9MHVzaW5nIGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdXNpbmdfZGVjbF9jbGFzc19tZW1iZXJfd29ya2Fyb3VuZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInVzZSAlc2VsZWN0e2FuIGFsaWFzIGRlY2xhcmF0aW9ufGEgdHlwZWRlZiBkZWNsYXJhdGlvbnxhIHJlZmVyZW5jZXxhIGNvbnN0IHZhcmlhYmxlfGEgY29uc3RleHByIHZhcmlhYmxlfTAgaW5zdGVhZCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3VzaW5nX2RlY2xfY29uZmxpY3QsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjb25mbGljdGluZyBkZWNsYXJhdGlvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3VzaW5nX2RlY2xfdGFyZ2V0LCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAidGFyZ2V0IG9mIHVzaW5nIGRlY2xhcmF0aW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdXNpbmdfdmFsdWVfZGVjbF9taXNzaW5nX3R5cGVuYW1lLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYWRkICd0eXBlbmFtZScgdG8gdHJlYXQgdGhpcyB1c2luZyBkZWNsYXJhdGlvbiBhcyBhIHR5cGUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV92YWx1ZV9pbml0aWFsaXphdGlvbl9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW4gdmFsdWUtaW5pdGlhbGl6YXRpb24gb2YgdHlwZSAlMCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdmFyX2RlY2xhcmVkX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJ2YXJpYWJsZSAlMCBpcyBkZWNsYXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdmFyX2V4cGxpY2l0bHlfY2FwdHVyZWRfaGVyZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInZhcmlhYmxlICUwIGlzJXNlbGVjdHt8IGV4cGxpY2l0bHl9MSBjYXB0dXJlZCBoZXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDMpCitESUFHKG5vdGVfdmFyX2ZpeGl0X2FkZF9pbml0aWFsaXphdGlvbiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImluaXRpYWxpemUgdGhlIHZhcmlhYmxlICUwIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKG5vdGVfdmFyX3ByZXZfcGFydGlhbF9zcGVjX2hlcmUsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwcmV2aW91cyBkZWNsYXJhdGlvbiBvZiB2YXJpYWJsZSB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGlzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV92YmFzZV9tb3ZlZF9oZXJlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJXNlbGVjdHslMSBpcyBhIHZpcnR1YWwgYmFzZSBjbGFzcyBvZiBiYXNlIGNsYXNzICUyIGRlY2xhcmVkIGhlcmV8dmlydHVhbCBiYXNlIGNsYXNzICUxIGRlY2xhcmVkIGhlcmV9MCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3ZsYV91bnN1cHBvcnRlZCwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgInZhcmlhYmxlIGxlbmd0aCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHRoZSBjdXJyZW50IHRhcmdldCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3doaWNoX2RlbGVnYXRlc190bywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIndoaWNoIGRlbGVnYXRlcyB0byIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3doaWxlX2luX2ltcGxlbWVudGF0aW9uLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZGV0ZWN0ZWQgd2hpbGUgZGVmYXVsdCBzeW50aGVzaXppbmcgcHJvcGVydGllcyBpbiBjbGFzcyBpbXBsZW1lbnRhdGlvbiIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyhub3RlX3dpZGVuX2JpdGZpZWxkLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAid2lkZW4gdGhpcyBmaWVsZCB0byAlMCBiaXRzIHRvIHN0b3JlIGFsbCB2YWx1ZXMgb2YgJTEiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcobm90ZV93aXRoaW5fZmllbGRfb2ZfdHlwZSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIndpdGhpbiBmaWVsZCBvZiB0eXBlICUwIGRlY2xhcmVkIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcob3ZlcnJpZGVfa2V5d29yZF9oaWRlc192aXJ0dWFsX21lbWJlcl9mdW5jdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJub24tdmlydHVhbCBtZW1iZXIgZnVuY3Rpb24gbWFya2VkICclMCcgaGlkZXMgdmlydHVhbCBtZW1iZXIgJXNlbGVjdHtmdW5jdGlvbnxmdW5jdGlvbnN9MSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcob3ZlcnJpZGVfa2V5d29yZF9vbmx5X2FsbG93ZWRfb25fdmlydHVhbF9tZW1iZXJfZnVuY3Rpb25zLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm9ubHkgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zIGNhbiBiZSBtYXJrZWQgJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcod2Fybl9hYnNfdG9vX3NtYWxsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAlMCBnaXZlbiBhbiBhcmd1bWVudCBvZiB0eXBlICUxIGJ1dCBoYXMgcGFyYW1ldGVyIG9mIHR5cGUgJTIgd2hpY2ggbWF5IGNhdXNlIHRydW5jYXRpb24gb2YgdmFsdWUiLCA4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hYnN0cmFjdF9maW5hbF9jbGFzcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYWJzdHJhY3QgY2xhc3MgaXMgbWFya2VkICclc2VsZWN0e2ZpbmFsfHNlYWxlZH0wJyIsIDksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2Fic3RyYWN0X3ZiYXNlX2luaXRfaWdub3JlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiaW5pdGlhbGl6ZXIgZm9yIHZpcnR1YWwgYmFzZSBjbGFzcyAlMCBvZiBhYnN0cmFjdCBjbGFzcyAlMSB3aWxsIG5ldmVyIGJlIHVzZWQiLCAxMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYWNjZXNzX2RlY2xfZGVwcmVjYXRlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYWNjZXNzIGRlY2xhcmF0aW9ucyBhcmUgZGVwcmVjYXRlZDsgdXNlIHVzaW5nIGRlY2xhcmF0aW9ucyBpbnN0ZWFkIiwgMTUzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjcpCitESUFHKHdhcm5fYWNjZXNzb3JfcHJvcGVydHlfdHlwZV9taXNtYXRjaCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidHlwZSBvZiBwcm9wZXJ0eSAlMCBkb2VzIG5vdCBtYXRjaCB0eXBlIG9mIGFjY2Vzc29yICUxIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYWNxdWlyZV9yZXF1aXJlc19uZWdhdGl2ZV9jYXAsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImFjcXVpcmluZyAlMCAnJTEnIHJlcXVpcmVzIG5lZ2F0aXZlIGNhcGFiaWxpdHkgJyUyJyIsIDYzMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYWNxdWlyZWRfYmVmb3JlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlMCAnJTEnIG11c3QgYmUgYWNxdWlyZWQgYmVmb3JlICclMiciLCA2MjcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2FjcXVpcmVkX2JlZm9yZV9hZnRlcl9jeWNsZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiQ3ljbGUgaW4gYWNxdWlyZWRfYmVmb3JlL2FmdGVyIGRlcGVuZGVuY2llcywgc3RhcnRpbmcgd2l0aCAnJTAnIiwgNjI3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hZGRpdGlvbl9pbl9iaXRzaGlmdCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAib3BlcmF0b3IgJyUwJyBoYXMgbG93ZXIgcHJlY2VkZW5jZSB0aGFuICclMSc7ICclMScgd2lsbCBiZSBldmFsdWF0ZWQgZmlyc3QiLCA1NjgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2FkZHJlc3Nfb2ZfcmVmZXJlbmNlX2Jvb2xfY29udmVyc2lvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicmVmZXJlbmNlIGNhbm5vdCBiZSBib3VuZCB0byBkZXJlZmVyZW5jZWQgbnVsbCBwb2ludGVyIGluIHdlbGwtZGVmaW5lZCBDKysgY29kZTsgcG9pbnRlciBtYXkgYmUgYXNzdW1lZCB0byBhbHdheXMgY29udmVydCB0byB0cnVlIiwgNjQzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjQpCitESUFHKHdhcm5fYWRkcmVzc19vZl9yZWZlcmVuY2VfbnVsbF9jb21wYXJlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJyZWZlcmVuY2UgY2Fubm90IGJlIGJvdW5kIHRvIGRlcmVmZXJlbmNlZCBudWxsIHBvaW50ZXIgaW4gd2VsbC1kZWZpbmVkIEMrKyBjb2RlOyBjb21wYXJpc29uIG1heSBiZSBhc3N1bWVkIHRvIGFsd2F5cyBldmFsdWF0ZSB0byAlc2VsZWN0e3RydWV8ZmFsc2V9MCIsIDYyMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYWxpYXNfdG9fd2Vha19hbGlhcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJXNlbGVjdHthbGlhc3xpZnVuY30yIHdpbGwgYWx3YXlzIHJlc29sdmUgdG8gJTAgZXZlbiBpZiB3ZWFrIGRlZmluaXRpb24gb2YgJTEgaXMgb3ZlcnJpZGRlbiIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYWxpYXNfd2l0aF9zZWN0aW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlc2VsZWN0e2FsaWFzfGlmdW5jfTEgd2lsbCBub3QgYmUgaW4gc2VjdGlvbiAnJTAnIGJ1dCBpbiB0aGUgc2FtZSBzZWN0aW9uIGFzIHRoZSAlc2VsZWN0e2FsaWFzZWV8cmVzb2x2ZXJ9MiIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYWxpZ25lZF9hbGxvY2F0aW9uX3VuYXZhaWxhYmxlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiYWxpZ25lZCAlc2VsZWN0e2FsbG9jYXRpb258ZGVhbGxvY2F0aW9ufTAgZnVuY3Rpb24gb2YgdHlwZSAnJTEnIGlzIG9ubHkgYXZhaWxhYmxlIG9uICUyICUzIG9yIG5ld2VyIiwgMTYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2FsbG9jYV9hbGlnbl9hbGlnbm9mLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJzZWNvbmQgYXJndW1lbnQgdG8gX19idWlsdGluX2FsbG9jYV93aXRoX2FsaWduIGlzIHN1cHBvc2VkIHRvIGJlIGluIGJpdHMiLCAxOCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYW1iaWd1b3VzX3N1aXRhYmxlX2RlbGV0ZV9mdW5jdGlvbl9mb3VuZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibXVsdGlwbGUgc3VpdGFibGUgJTAgZnVuY3Rpb25zIGZvciAlMTsgbm8gJ29wZXJhdG9yIGRlbGV0ZScgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIGlmIGluaXRpYWxpemF0aW9uIHRocm93cyBhbiBleGNlcHRpb24iLCAxOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYW5vbl9iaXRmaWVsZF93aWR0aF9leGNlZWRzX3R5cGVfd2lkdGgsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIndpZHRoIG9mIGFub255bW91cyBiaXQtZmllbGQgKCUwIGJpdHMpIGV4Y2VlZHMgd2lkdGggb2YgaXRzIHR5cGU7IHZhbHVlIHdpbGwgYmUgdHJ1bmNhdGVkIHRvICUxIGJpdCVzMSIsIDU5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hcmNfbGlmZXRpbWVfcmVzdWx0X3R5cGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIkFSQyAlc2VsZWN0e3VudXNlZHxfX3Vuc2FmZV91bnJldGFpbmVkfF9fc3Ryb25nfF9fd2Vha3xfX2F1dG9yZWxlYXNpbmd9MCBsaWZldGltZSBxdWFsaWZpZXIgb24gcmV0dXJuIHR5cGUgaXMgaWdub3JlZCIsIDI3MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDUpCitESUFHKHdhcm5fYXJjX2xpdGVyYWxfYXNzaWduLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJhc3NpZ25pbmcgJXNlbGVjdHthcnJheSBsaXRlcmFsfGRpY3Rpb25hcnkgbGl0ZXJhbHxudW1lcmljIGxpdGVyYWx8Ym94ZWQgZXhwcmVzc2lvbnw8c2hvdWxkIG5vdCBoYXBwZW4+fGJsb2NrIGxpdGVyYWx9MCB0byBhIHdlYWsgJXNlbGVjdHtwcm9wZXJ0eXx2YXJpYWJsZX0xOyBvYmplY3Qgd2lsbCBiZSByZWxlYXNlZCBhZnRlciBhc3NpZ25tZW50IiwgMzIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA1KQorRElBRyh3YXJuX2FyY19vYmplY3RfbWVtYWNjZXNzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlc2VsZWN0e2Rlc3RpbmF0aW9uIGZvcnxzb3VyY2Ugb2Z9MCB0aGlzICUxIGNhbGwgaXMgYSBwb2ludGVyIHRvIG93bmVyc2hpcC1xdWFsaWZpZWQgdHlwZSAlMiIsIDI4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNSkKK0RJQUcod2Fybl9hcmNfcGVyZm9ybV9zZWxlY3Rvcl9sZWFrcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicGVyZm9ybVNlbGVjdG9yIG1heSBjYXVzZSBhIGxlYWsgYmVjYXVzZSBpdHMgc2VsZWN0b3IgaXMgdW5rbm93biIsIDI5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hcmNfcG9zc2libGVfcmVwZWF0ZWRfdXNlX29mX3dlYWssIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIndlYWsgJXNlbGVjdHt2YXJpYWJsZXxwcm9wZXJ0eXxpbXBsaWNpdCBwcm9wZXJ0eXxpbnN0YW5jZSB2YXJpYWJsZX0wICUxIG1heSBiZSBhY2Nlc3NlZCBtdWx0aXBsZSB0aW1lcyBpbiB0aGlzICVzZWxlY3R7ZnVuY3Rpb258bWV0aG9kfGJsb2NrfGxhbWJkYX0yIGFuZCBtYXkgYmUgdW5wcmVkaWN0YWJseSBzZXQgdG8gbmlsOyBhc3NpZ24gdG8gYSBzdHJvbmcgdmFyaWFibGUgdG8ga2VlcCB0aGUgb2JqZWN0IGFsaXZlIiwgMjcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2FyY19yZXBlYXRlZF91c2Vfb2Zfd2VhaywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAid2VhayAlc2VsZWN0e3ZhcmlhYmxlfHByb3BlcnR5fGltcGxpY2l0IHByb3BlcnR5fGluc3RhbmNlIHZhcmlhYmxlfTAgJTEgaXMgYWNjZXNzZWQgbXVsdGlwbGUgdGltZXMgaW4gdGhpcyAlc2VsZWN0e2Z1bmN0aW9ufG1ldGhvZHxibG9ja3xsYW1iZGF9MiBidXQgbWF5IGJlIHVucHJlZGljdGFibHkgc2V0IHRvIG5pbDsgYXNzaWduIHRvIGEgc3Ryb25nIHZhcmlhYmxlIHRvIGtlZXAgdGhlIG9iamVjdCBhbGl2ZSIsIDMwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hcmNfcmV0YWluX2N5Y2xlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJjYXB0dXJpbmcgJTAgc3Ryb25nbHkgaW4gdGhpcyBibG9jayBpcyBsaWtlbHkgdG8gbGVhZCB0byBhIHJldGFpbiBjeWNsZSIsIDMxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjYpCitESUFHKHdhcm5fYXJjX3JldGFpbmVkX2Fzc2lnbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYXNzaWduaW5nIHJldGFpbmVkIG9iamVjdCB0byAlc2VsZWN0e3dlYWt8dW5zYWZlX3VucmV0YWluZWR9MCAlc2VsZWN0e3Byb3BlcnR5fHZhcmlhYmxlfTE7IG9iamVjdCB3aWxsIGJlIHJlbGVhc2VkIGFmdGVyIGFzc2lnbm1lbnQiLCAzMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDUpCitESUFHKHdhcm5fYXJjX3JldGFpbmVkX3Byb3BlcnR5X2Fzc2lnbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYXNzaWduaW5nIHJldGFpbmVkIG9iamVjdCB0byB1bnNhZmUgcHJvcGVydHk7IG9iamVjdCB3aWxsIGJlIHJlbGVhc2VkIGFmdGVyIGFzc2lnbm1lbnQiLCAzMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDUpCitESUFHKHdhcm5fYXJjX3N0cm9uZ19wb2ludGVyX29iamNfcG9pbnRlciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAibWV0aG9kIHBhcmFtZXRlciBvZiB0eXBlICUwIHdpdGggbm8gZXhwbGljaXQgb3duZXJzaGlwIiwgMjA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTApCitESUFHKHdhcm5fYXJtX2ludGVycnVwdF9jYWxsaW5nX2NvbnZlbnRpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNhbGwgdG8gZnVuY3Rpb24gd2l0aG91dCBpbnRlcnJ1cHQgYXR0cmlidXRlIGNvdWxkIGNsb2JiZXIgaW50ZXJydXB0ZWUncyBWRlAgcmVnaXN0ZXJzIiwgMjA3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hcnJheV9pbmRleF9leGNlZWRzX2JvdW5kcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYXJyYXkgaW5kZXggJTAgaXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBhcnJheSAod2hpY2ggY29udGFpbnMgJTEgZWxlbWVudCVzMikiLCAzMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYXJyYXlfaW5kZXhfcHJlY2VkZXNfYm91bmRzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJhcnJheSBpbmRleCAlMCBpcyBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkiLCAzMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYXNtX2xhYmVsX29uX2F1dG9fZGVjbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaWdub3JlZCBhc20gbGFiZWwgJyUwJyBvbiBhdXRvbWF0aWMgdmFyaWFibGUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTIpCitESUFHKHdhcm5fYXNtX21pc21hdGNoZWRfc2l6ZV9tb2RpZmllciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidmFsdWUgc2l6ZSBkb2VzIG5vdCBtYXRjaCByZWdpc3RlciBzaXplIHNwZWNpZmllZCBieSB0aGUgY29uc3RyYWludCBhbmQgbW9kaWZpZXIiLCAzNywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEyKQorRElBRyh3YXJuX2Fzc3VtZV9zaWRlX2VmZmVjdHMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInRoZSBhcmd1bWVudCB0byAlMCBoYXMgc2lkZSBlZmZlY3RzIHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQiLCAzOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYXRfYXZhaWxhYmxlX3VuY2hlY2tlZF91c2UsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiVzZWxlY3R7QGF2YWlsYWJsZXxfX2J1aWx0aW5fYXZhaWxhYmxlfTAgZG9lcyBub3QgZ3VhcmQgYXZhaWxhYmlsaXR5IGhlcmU7IHVzZSBpZiAoJXNlbGVjdHtAYXZhaWxhYmxlfF9fYnVpbHRpbl9hdmFpbGFibGV9MCkgaW5zdGVhZCIsIDY3MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYXRsX3V1aWRfZGVwcmVjYXRlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAic3BlY2lmeWluZyAndXVpZCcgYXMgYW4gQVRMIGF0dHJpYnV0ZSBpcyBkZXByZWNhdGVkOyB1c2UgX19kZWNsc3BlYyBpbnN0ZWFkIiwgMTU1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjcpCitESUFHKHdhcm5fYXRvbWljX29wX2hhc19pbnZhbGlkX21lbW9yeV9vcmRlciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibWVtb3J5IG9yZGVyIGFyZ3VtZW50IHRvIGF0b21pYyBvcGVyYXRpb24gaXMgaW52YWxpZCIsIDQxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdG9taWNfcHJvcGVydHlfcnVsZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAid3JpdGFibGUgYXRvbWljIHByb3BlcnR5ICUwIGNhbm5vdCBwYWlyIGEgc3ludGhlc2l6ZWQgJXNlbGVjdHtnZXR0ZXJ8c2V0dGVyfTEgd2l0aCBhIHVzZXIgZGVmaW5lZCAlc2VsZWN0e2dldHRlcnxzZXR0ZXJ9MiIsIDQzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdHByb3RvY29sX3Byb3RvY29sLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJAcHJvdG9jb2wgaXMgdXNpbmcgYSBmb3J3YXJkIHByb3RvY29sIGRlY2xhcmF0aW9uIG9mICUwIiwgNDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2F0dHJfYWJpX3RhZ19uYW1lc3BhY2UsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIidhYmlfdGFnJyBhdHRyaWJ1dGUgb24gJXNlbGVjdHtub24taW5saW5lfGFub255bW91c30wIG5hbWVzcGFjZSBpZ25vcmVkIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdHRyX29uX3VuY29uc3VtYWJsZV9jbGFzcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiY29uc3VtZWQgYW5hbHlzaXMgYXR0cmlidXRlIGlzIGF0dGFjaGVkIHRvIG1lbWJlciBvZiBjbGFzcyAnJTAnIHdoaWNoIGlzbid0IG1hcmtlZCBhcyBjb25zdW1hYmxlIiwgMTMyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdHRyaWJ1dGVfYWZ0ZXJfZGVmaW5pdGlvbl9pZ25vcmVkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJhdHRyaWJ1dGUgJTAgYWZ0ZXIgZGVmaW5pdGlvbiBpcyBpZ25vcmVkIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdHRyaWJ1dGVfYXJndW1lbnRfbl9uZWdhdGl2ZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgYXR0cmlidXRlIHBhcmFtZXRlciAlMSBpcyBuZWdhdGl2ZSBhbmQgd2lsbCBiZSBpZ25vcmVkIiwgMTQxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdHRyaWJ1dGVfZGxsX2luc3RhbnRpYXRlZF9iYXNlX2NsYXNzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJwcm9wYWdhdGluZyBkbGwgYXR0cmlidXRlIHRvICVzZWxlY3R7YWxyZWFkeSBpbnN0YW50aWF0ZWR8ZXhwbGljaXRseSBzcGVjaWFsaXplZH0wIGJhc2UgY2xhc3MgdGVtcGxhdGUgd2l0aG91dCBkbGwgYXR0cmlidXRlIGlzIG5vdCBzdXBwb3J0ZWQiLCA2NzUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2F0dHJpYnV0ZV9kbGxfcmVkZWNsYXJhdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicmVkZWNsYXJhdGlvbiBvZiAlcTAgc2hvdWxkIG5vdCBhZGQgJXExIGF0dHJpYnV0ZSIsIDE3MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYXR0cmlidXRlX2RsbGV4cG9ydF9leHBsaWNpdF9pbnN0YW50aWF0aW9uX2RlY2wsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImV4cGxpY2l0IGluc3RhbnRpYXRpb24gZGVjbGFyYXRpb24gc2hvdWxkIG5vdCBiZSAnZGxsZXhwb3J0JyIsIDE3MiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYXR0cmlidXRlX2RsbGltcG9ydF9zdGF0aWNfZmllbGRfZGVmaW5pdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZGVmaW5pdGlvbiBvZiBkbGxpbXBvcnQgc3RhdGljIGZpZWxkIiwgMTczLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdHRyaWJ1dGVfaWJvdXRsZXQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiUwIGF0dHJpYnV0ZSBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGluc3RhbmNlIHZhcmlhYmxlcyBvciBwcm9wZXJ0aWVzIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdHRyaWJ1dGVfaWdub3JlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgYXR0cmlidXRlIGlnbm9yZWQiLCAyNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2F0dHJpYnV0ZV9pZ25vcmVkX2Zvcl9maWVsZF9vZl90eXBlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMCBhdHRyaWJ1dGUgaWdub3JlZCBmb3IgZmllbGQgb2YgdHlwZSAlMSIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYXR0cmlidXRlX2lnbm9yZWRfb25faW5saW5lLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMCBhdHRyaWJ1dGUgaWdub3JlZCBvbiBpbmxpbmUgZnVuY3Rpb24iLCAyNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2F0dHJpYnV0ZV9pbnZhbGlkX29uX2RlZmluaXRpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiclMCcgYXR0cmlidXRlIGNhbm5vdCBiZSBzcGVjaWZpZWQgb24gYSBkZWZpbml0aW9uIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdHRyaWJ1dGVfbm9ubnVsbF9ub19wb2ludGVycywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJ25vbm51bGwnIGF0dHJpYnV0ZSBhcHBsaWVkIHRvIGZ1bmN0aW9uIHdpdGggbm8gcG9pbnRlciBhcmd1bWVudHMiLCAyNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2F0dHJpYnV0ZV9ub25udWxsX3Bhcm1fbm9fYXJncywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJ25vbm51bGwnIGF0dHJpYnV0ZSB3aGVuIHVzZWQgb24gcGFyYW1ldGVycyB0YWtlcyBubyBhcmd1bWVudHMiLCAyNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2F0dHJpYnV0ZV9ub3Rfb25fZGVjbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgYXR0cmlidXRlIGlnbm9yZWQgd2hlbiBwYXJzaW5nIHR5cGUiLCAyNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2F0dHJpYnV0ZV9wYWNrZWRfZm9yX2JpdGZpZWxkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIncGFja2VkJyBhdHRyaWJ1dGUgd2FzIGlnbm9yZWQgb24gYml0LWZpZWxkcyB3aXRoIHNpbmdsZS1ieXRlIGFsaWdubWVudCBpbiBvbGRlciB2ZXJzaW9ucyBvZiBHQ0MgYW5kIENsYW5nIiwgNDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2F0dHJpYnV0ZV9wb2ludGVyX29yX3JlZmVyZW5jZV9vbmx5LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMCBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGEgcG9pbnRlciBvciByZWZlcmVuY2UgKCUxIGlzIGludmFsaWQpIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdHRyaWJ1dGVfcG9pbnRlcnNfb25seSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byVzZWxlY3R7fCBjb25zdGFudH0xIHBvaW50ZXIgYXJndW1lbnRzIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdHRyaWJ1dGVfcHJlY2VkZV9kZWZpbml0aW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJhdHRyaWJ1dGUgZGVjbGFyYXRpb24gbXVzdCBwcmVjZWRlIGRlZmluaXRpb24iLCAyNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2F0dHJpYnV0ZV9wcm90ZWN0ZWRfdmlzaWJpbGl0eSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgJ3Byb3RlY3RlZCcgdmlzaWJpbGl0eTsgdXNpbmcgJ2RlZmF1bHQnIiwgNjc5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdHRyaWJ1dGVfcmV0dXJuX3BvaW50ZXJzX29ubHksIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiUwIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gcmV0dXJuIHZhbHVlcyB0aGF0IGFyZSBwb2ludGVycyIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYXR0cmlidXRlX3JldHVybl9wb2ludGVyc19yZWZzX29ubHksIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiUwIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gcmV0dXJuIHZhbHVlcyB0aGF0IGFyZSBwb2ludGVycyBvciByZWZlcmVuY2VzIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdHRyaWJ1dGVfc2VjdGlvbl9vbl9yZWRlY2xhcmF0aW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJzZWN0aW9uIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgb24gcmVkZWNsYXJlZCB2YXJpYWJsZSIsIDU0OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYXR0cmlidXRlX3NlbnRpbmVsX25hbWVkX2FyZ3VtZW50cywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJ3NlbnRpbmVsJyBhdHRyaWJ1dGUgcmVxdWlyZXMgbmFtZWQgYXJndW1lbnRzIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdHRyaWJ1dGVfc2VudGluZWxfbm90X3ZhcmlhZGljLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICInc2VudGluZWwnIGF0dHJpYnV0ZSBvbmx5IHN1cHBvcnRlZCBmb3IgdmFyaWFkaWMgJXNlbGVjdHtmdW5jdGlvbnN8YmxvY2tzfTAiLCAyNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2F0dHJpYnV0ZV90eXBlX25vdF9zdXBwb3J0ZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiUwIGF0dHJpYnV0ZSBhcmd1bWVudCBub3Qgc3VwcG9ydGVkOiAlMSIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYXR0cmlidXRlX3Vua25vd25fdmlzaWJpbGl0eSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidW5rbm93biB2aXNpYmlsaXR5ICUwIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdHRyaWJ1dGVfdm9pZF9mdW5jdGlvbl9tZXRob2QsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImF0dHJpYnV0ZSAlMCBjYW5ub3QgYmUgYXBwbGllZCB0byAlc2VsZWN0e2Z1bmN0aW9uc3xPYmplY3RpdmUtQyBtZXRob2R9MSB3aXRob3V0IHJldHVybiB2YWx1ZSIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYXR0cmlidXRlX3dlYWtfb25fZmllbGQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIl9fd2VhayBhdHRyaWJ1dGUgY2Fubm90IGJlIHNwZWNpZmllZCBvbiBhIGZpZWxkIGRlY2xhcmF0aW9uIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdHRyaWJ1dGVfd2Vha19vbl9sb2NhbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiX193ZWFrIGF0dHJpYnV0ZSBjYW5ub3QgYmUgc3BlY2lmaWVkIG9uIGFuIGF1dG9tYXRpYyB2YXJpYWJsZSB3aGVuIEFSQyBpcyBub3QgZW5hYmxlZCIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byAlc2VsZWN0e2Z1bmN0aW9uc3x1bmlvbnN8dmFyaWFibGVzIGFuZCBmdW5jdGlvbnN8ZnVuY3Rpb25zIGFuZCBtZXRob2RzfGZ1bmN0aW9ucywgbWV0aG9kcyBhbmQgYmxvY2tzfGZ1bmN0aW9ucywgbWV0aG9kcywgYW5kIHBhcmFtZXRlcnN8dmFyaWFibGVzfHZhcmlhYmxlcyBhbmQgZmllbGRzfHZhcmlhYmxlcywgZGF0YSBtZW1iZXJzIGFuZCB0YWcgdHlwZXN8dHlwZXMgYW5kIG5hbWVzcGFjZXN8dmFyaWFibGVzLCBmdW5jdGlvbnMgYW5kIGNsYXNzZXN8a2VybmVsIGZ1bmN0aW9uc3xub24tSyZSLXN0eWxlIGZ1bmN0aW9uc3x2YXJpYWJsZXMsIGZ1bmN0aW9ucywgbWV0aG9kcywgdHlwZXMsIGVudW1lcmF0aW9ucywgZW51bWVyYXRvcnMsIGxhYmVscywgYW5kIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXJzfTEiLCAyNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMCBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvICUxIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdXRvX2ltcGxpY2l0X2F0b21pY19wcm9wZXJ0eSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAicHJvcGVydHkgaXMgYXNzdW1lZCBhdG9taWMgd2hlbiBhdXRvLXN5bnRoZXNpemluZyB0aGUgcHJvcGVydHkiLCAyNzIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2F1dG9fcmVhZG9ubHlfaWJvdXRsZXRfcHJvcGVydHksIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInJlYWRvbmx5IElCT3V0bGV0IHByb3BlcnR5ICUwIHdoZW4gYXV0by1zeW50aGVzaXplZCBtYXkgbm90IHdvcmsgY29ycmVjdGx5IHdpdGggJ25pYicgbG9hZGVyIiwgNTI4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdXRvX3N0b3JhZ2VfY2xhc3MsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIidhdXRvJyBzdG9yYWdlIGNsYXNzIHNwZWNpZmllciBpcyByZWR1bmRhbnQgYW5kIGluY29tcGF0aWJsZSB3aXRoIEMrKzExIiwgNzMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2F1dG9fc3ludGhlc2l6aW5nX3Byb3RvY29sX3Byb3BlcnR5LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJhdXRvIHByb3BlcnR5IHN5bnRoZXNpcyB3aWxsIG5vdCBzeW50aGVzaXplIHByb3BlcnR5ICUwIGRlY2xhcmVkIGluIHByb3RvY29sICUxIiwgNDYzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdXRvX3Zhcl9pc19pZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJ2F1dG8nIGRlZHVjZWQgYXMgJ2lkJyBpbiBkZWNsYXJhdGlvbiBvZiAlMCIsIDQ5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9hdXRvc3ludGhlc2lzX3Byb3BlcnR5X2luX3N1cGVyY2xhc3MsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImF1dG8gcHJvcGVydHkgc3ludGhlc2lzIHdpbGwgbm90IHN5bnRoZXNpemUgcHJvcGVydHkgJTA7IGl0IHdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgaXRzIHN1cGVyY2xhc3MsIHVzZSBAZHluYW1pYyB0byBhY2tub3dsZWRnZSBpbnRlbnRpb24iLCA0NjEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2F1dG9zeW50aGVzaXNfcHJvcGVydHlfaXZhcl9tYXRjaCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYXV0b3N5bnRoZXNpemVkIHByb3BlcnR5ICUwIHdpbGwgdXNlICVzZWxlY3R7fHN5bnRoZXNpemVkfTEgaW5zdGFuY2UgdmFyaWFibGUgJTIsIG5vdCBleGlzdGluZyBpbnN0YW5jZSB2YXJpYWJsZSAlMyIsIDQ0MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYXZhaWxhYmlsaXR5X3Vua25vd25fcGxhdGZvcm0sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVua25vd24gcGxhdGZvcm0gJTAgaW4gYXZhaWxhYmlsaXR5IG1hY3JvIiwgNTAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2F2YWlsYWJpbGl0eV92ZXJzaW9uX29yZGVyaW5nLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJmZWF0dXJlIGNhbm5vdCBiZSAlc2VsZWN0e2ludHJvZHVjZWR8ZGVwcmVjYXRlZHxvYnNvbGV0ZWR9MCBpbiAlMSB2ZXJzaW9uICUyIGJlZm9yZSBpdCB3YXMgJXNlbGVjdHtpbnRyb2R1Y2VkfGRlcHJlY2F0ZWR8b2Jzb2xldGVkfTMgaW4gdmVyc2lvbiAlNDsgYXR0cmlidXRlIGlnbm9yZWQiLCA1MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYmFkX2Z1bmN0aW9uX2Nhc3QsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImNhc3QgZnJvbSBmdW5jdGlvbiBjYWxsIG9mIHR5cGUgJTAgdG8gbm9uLW1hdGNoaW5nIHR5cGUgJTEiLCA1MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYmFkX3JlY2VpdmVyX3R5cGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInJlY2VpdmVyIHR5cGUgJTAgaXMgbm90ICdpZCcgb3IgaW50ZXJmYWNlIHBvaW50ZXIsIGNvbnNpZGVyIGNhc3RpbmcgaXQgdG8gJ2lkJyIsIDUyOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYmFzZV9jbGFzc19pc191bmluaXQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImJhc2UgY2xhc3MgJTAgaXMgdW5pbml0aWFsaXplZCB3aGVuIHVzZWQgaGVyZSB0byBhY2Nlc3MgJXExIiwgNjU2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9iaW5kX3JlZl9tZW1iZXJfdG9fcGFyYW1ldGVyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJiaW5kaW5nIHJlZmVyZW5jZSBtZW1iZXIgJTAgdG8gc3RhY2sgYWxsb2NhdGVkIHBhcmFtZXRlciAlMSIsIDE0NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fYmluZF9yZWZfbWVtYmVyX3RvX3RlbXBvcmFyeSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYmluZGluZyByZWZlcmVuY2UgJXNlbGVjdHt8c3Vib2JqZWN0IG9mIH0xbWVtYmVyICUwIHRvIGEgdGVtcG9yYXJ5IHZhbHVlIiwgMTQ0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9iaW5kaW5nX251bGxfdG9fcmVmZXJlbmNlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJiaW5kaW5nIGRlcmVmZXJlbmNlZCBudWxsIHBvaW50ZXIgdG8gcmVmZXJlbmNlIGhhcyB1bmRlZmluZWQgYmVoYXZpb3IiLCA0MzEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2JpdGZpZWxkX3Rvb19zbWFsbF9mb3JfZW51bSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiYml0LWZpZWxkICUwIGlzIG5vdCB3aWRlIGVub3VnaCB0byBzdG9yZSBhbGwgZW51bWVyYXRvcnMgb2YgJTEiLCA1OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI0KQorRElBRyh3YXJuX2JpdGZpZWxkX3dpZHRoX2V4Y2VlZHNfdHlwZV93aWR0aCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAid2lkdGggb2YgYml0LWZpZWxkICUwICglMSBiaXRzKSBleGNlZWRzIHRoZSB3aWR0aCBvZiBpdHMgdHlwZTsgdmFsdWUgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gJTIgYml0JXMyIiwgNTksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2JpdHdpc2Vfb3BfaW5fYml0d2lzZV9vcCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJyUwJyB3aXRoaW4gJyUxJyIsIDYwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9ibG9ja19jYXB0dXJlX2F1dG9yZWxlYXNpbmcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImJsb2NrIGNhcHR1cmVzIGFuIGF1dG9yZWxlYXNpbmcgb3V0LXBhcmFtZXRlciwgd2hpY2ggbWF5IHJlc3VsdCBpbiB1c2UtYWZ0ZXItZnJlZSBidWdzIiwgNjEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCA1KQorRElBRyh3YXJuX2Jsb2NrX2xpdGVyYWxfYXR0cmlidXRlc19vbl9vbWl0dGVkX3JldHVybl90eXBlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJhdHRyaWJ1dGUgJTAgaWdub3JlZCwgYmVjYXVzZSBpdCBjYW5ub3QgYmUgYXBwbGllZCB0byBvbWl0dGVkIHJldHVybiB0eXBlIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9ibG9ja19saXRlcmFsX3F1YWxpZmllcnNfb25fb21pdHRlZF9yZXR1cm5fdHlwZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJyUwJyBxdWFsaWZpZXIgb24gb21pdHRlZCByZXR1cm4gdHlwZSAlMSBoYXMgbm8gZWZmZWN0IiwgMjcwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMCkKK0RJQUcod2Fybl9ib29sX3N3aXRjaF9jb25kaXRpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInN3aXRjaCBjb25kaXRpb24gaGFzIGJvb2xlYW4gdmFsdWUiLCA2MTAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2JyYWNlc19hcm91bmRfc2NhbGFyX2luaXQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImJyYWNlcyBhcm91bmQgc2NhbGFyIGluaXRpYWxpemVyIiwgNjQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2JyZWFrX2JpbmRzX3RvX3N3aXRjaCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJ2JyZWFrJyBpcyBib3VuZCB0byBsb29wLCBHQ0MgYmluZHMgaXQgdG8gc3dpdGNoIiwgMjMzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9idWlsdGluX3Vua25vd24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJ1c2Ugb2YgdW5rbm93biBidWlsdGluICUwIiwgMjc3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jYWxsX3RvX3B1cmVfdmlydHVhbF9tZW1iZXJfZnVuY3Rpb25fZnJvbV9jdG9yX2R0b3IsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNhbGwgdG8gcHVyZSB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbiAlMCBoYXMgdW5kZWZpbmVkIGJlaGF2aW9yOyBvdmVycmlkZXMgb2YgJTAgaW4gc3ViY2xhc3NlcyBhcmUgbm90IGF2YWlsYWJsZSBpbiB0aGUgJXNlbGVjdHtjb25zdHJ1Y3RvcnxkZXN0cnVjdG9yfTEgb2YgJTIiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jYWxsX3dyb25nX251bWJlcl9vZl9hcmd1bWVudHMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInRvbyAlc2VsZWN0e2Zld3xtYW55fTAgYXJndW1lbnRzIGluIGNhbGwgdG8gJTEiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jYW5ub3RfcGFzc19ub25fcG9kX2FyZ190b192YXJhcmcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJjYW5ub3QgcGFzcyBvYmplY3Qgb2YgJXNlbGVjdHtub24tUE9EfG5vbi10cml2aWFsfTAgdHlwZSAlMSB0aHJvdWdoIHZhcmlhZGljICVzZWxlY3R7ZnVuY3Rpb258YmxvY2t8bWV0aG9kfGNvbnN0cnVjdG9yfTI7IGNhbGwgd2lsbCBhYm9ydCBhdCBydW50aW1lIiwgNDE5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jYW5ub3RfcmVzb2x2ZV9sb2NrLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJjYW5ub3QgcmVzb2x2ZSBsb2NrIGV4cHJlc3Npb24iLCA2MjcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2Nhc2VfZW1wdHlfcmFuZ2UsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImVtcHR5IGNhc2UgcmFuZ2Ugc3BlY2lmaWVkIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY2FzZV92YWx1ZV9vdmVyZmxvdywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAib3ZlcmZsb3cgY29udmVydGluZyBjYXNlIHZhbHVlIHRvIHN3aXRjaCBjb25kaXRpb24gdHlwZSAoJTAgdG8gJTEpIiwgNjA5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jYXN0X2FsaWduLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJjYXN0IGZyb20gJTAgdG8gJTEgaW5jcmVhc2VzIHJlcXVpcmVkIGFsaWdubWVudCBmcm9tICUyIHRvICUzIiwgMTEzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jYXN0X2NhbGxpbmdfY29udiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY2FzdCBiZXR3ZWVuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb25zICclMCcgYW5kICclMSc7IGNhbGxzIHRocm91Z2ggdGhpcyBwb2ludGVyIG1heSBhYm9ydCBhdCBydW50aW1lIiwgMTE0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jYXN0X25vbm51bGxfdG9fYm9vbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibm9ubnVsbCAlc2VsZWN0e2Z1bmN0aW9uIGNhbGx8cGFyYW1ldGVyfTAgJyUxJyB3aWxsIGV2YWx1YXRlIHRvICd0cnVlJyBvbiBmaXJzdCBlbmNvdW50ZXIiLCA1MDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNCkKK0RJQUcod2Fybl9jYXN0X3BvaW50ZXJfZnJvbV9zZWwsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNhc3Qgb2YgdHlwZSAlMCB0byAlMSBpcyBkZXByZWNhdGVkOyB1c2Ugc2VsX2dldE5hbWUgaW5zdGVhZCIsIDExNSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY2FzdF9xdWFsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJjYXN0IGZyb20gJTAgdG8gJTEgZHJvcHMgJXNlbGVjdHtjb25zdCBhbmQgdm9sYXRpbGUgcXVhbGlmaWVyc3xjb25zdCBxdWFsaWZpZXJ8dm9sYXRpbGUgcXVhbGlmaWVyfTIiLCAxMTYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2Nhc3RfcXVhbDIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImNhc3QgZnJvbSAlMCB0byAlMSBtdXN0IGhhdmUgYWxsIGludGVybWVkaWF0ZSBwb2ludGVycyBjb25zdCBxdWFsaWZpZWQgdG8gYmUgc2FmZSIsIDExNiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY2F0ZWdvcnlfbWV0aG9kX2ltcGxfbWF0Y2gsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNhdGVnb3J5IGlzIGltcGxlbWVudGluZyBhIG1ldGhvZCB3aGljaCB3aWxsIGFsc28gYmUgaW1wbGVtZW50ZWQgYnkgaXRzIHByaW1hcnkgY2xhc3MiLCA0NjIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2Njb252X2lnbm9yZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNhbGxpbmcgY29udmVudGlvbiAlMCBpZ25vcmVkIGZvciB0aGlzIHRhcmdldCIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY2NvbnZfa25yLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJmdW5jdGlvbiB3aXRoIG5vIHByb3RvdHlwZSBjYW5ub3QgdXNlIHRoZSAlMCBjYWxsaW5nIGNvbnZlbnRpb24iLCAzOTEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2Njb252X3N0cnVjdG9ycywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgY2FsbGluZyBjb252ZW50aW9uIGlnbm9yZWQgb24gY29uc3RydWN0b3IvZGVzdHJ1Y3RvciIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY2NvbnZfdmFyYXJncywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgY2FsbGluZyBjb252ZW50aW9uIGlnbm9yZWQgb24gdmFyaWFkaWMgZnVuY3Rpb24iLCAyNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2NkdG9yX2Z1bmN0aW9uX3RyeV9oYW5kbGVyX21lbV9leHByLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJjYW5ub3QgcmVmZXIgdG8gYSBub24tc3RhdGljIG1lbWJlciBmcm9tIHRoZSBoYW5kbGVyIG9mIGEgJXNlbGVjdHtjb25zdHJ1Y3RvcnxkZXN0cnVjdG9yfTAgZnVuY3Rpb24gdHJ5IGJsb2NrIiwgMTk5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jZnN0cmluZ190cnVuY2F0ZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImlucHV0IGNvbnZlcnNpb24gc3RvcHBlZCBkdWUgdG8gYW4gaW5wdXQgYnl0ZSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byB0aGUgaW5wdXQgY29kZXNldCBVVEYtOCIsIDMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2NsYXNzX21ldGhvZF9ub3RfZm91bmQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNsYXNzIG1ldGhvZCAlb2JqY2NsYXNzMCBub3QgZm91bmQgKHJldHVybiB0eXBlIGRlZmF1bHRzIHRvICdpZCcpIiwgNDUxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jbGFzc19tZXRob2Rfbm90X2ZvdW5kX3dpdGhfdHlwbywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY2xhc3MgbWV0aG9kICVvYmpjY2xhc3MwIG5vdCBmb3VuZCAocmV0dXJuIHR5cGUgZGVmYXVsdHMgdG8gJ2lkJyk7IGRpZCB5b3UgbWVhbiAlb2JqY2NsYXNzMj8iLCA0NTEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2NsZWFudXBfZXh0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJHQ0MgZG9lcyBub3QgYWxsb3cgdGhlICdjbGVhbnVwJyBhdHRyaWJ1dGUgYXJndW1lbnQgdG8gYmUgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHNpbXBsZSBpZGVudGlmaWVyIiwgMjMzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jb2NvYV9uYW1pbmdfb3duZWRfcnVsZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicHJvcGVydHkgZm9sbG93cyBDb2NvYSBuYW1pbmcgY29udmVudGlvbiBmb3IgcmV0dXJuaW5nICdvd25lZCcgb2JqZWN0cyIsIDQ1OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY29sbGVjdGlvbl9leHByX3R5cGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNvbGxlY3Rpb24gZXhwcmVzc2lvbiB0eXBlICUwIG1heSBub3QgcmVzcG9uZCB0byAlMSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2NvbW1hX29wZXJhdG9yLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJwb3NzaWJsZSBtaXN1c2Ugb2YgY29tbWEgb3BlcmF0b3IgaGVyZSIsIDEyMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY29tcGFyaXNvbl9hbHdheXMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiVzZWxlY3R7c2VsZi18YXJyYXkgfTBjb21wYXJpc29uIGFsd2F5cyBldmFsdWF0ZXMgdG8gJXNlbGVjdHthIGNvbnN0YW50fCUyfTEiLCA2MTUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2NvbXBhcmlzb25fYml0d2lzZV9hbHdheXMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImJpdHdpc2UgY29tcGFyaXNvbiBhbHdheXMgZXZhbHVhdGVzIHRvICVzZWxlY3R7ZmFsc2V8dHJ1ZX0wIiwgNjE1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jb21wYXJpc29uX29mX21peGVkX2VudW1fdHlwZXMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNvbXBhcmlzb24gb2YgdHdvIHZhbHVlcyB3aXRoIGRpZmZlcmVudCBlbnVtZXJhdGlvbiB0eXBlcyVkaWZmeyAoJCBhbmQgJCl8fTAsMSIsIDE5NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY29tcGFyaXNvbl9vZl9taXhlZF9lbnVtX3R5cGVzX3N3aXRjaCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY29tcGFyaXNvbiBvZiB0d28gdmFsdWVzIHdpdGggZGlmZmVyZW50IGVudW1lcmF0aW9uIHR5cGVzIGluIHN3aXRjaCBzdGF0ZW1lbnQlZGlmZnsgKCQgYW5kICQpfH0wLDEiLCAxOTYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2NvbmNhdGVuYXRlZF9uc2FycmF5X2xpdGVyYWwsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNvbmNhdGVuYXRlZCBOU1N0cmluZyBsaXRlcmFsIGZvciBhbiBOU0FycmF5IGV4cHJlc3Npb24gLSBwb3NzaWJseSBtaXNzaW5nIGEgY29tbWEiLCA0NzAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2NvbmRpdGlvbl9pc19hc3NpZ25tZW50LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1c2luZyB0aGUgcmVzdWx0IG9mIGFuIGFzc2lnbm1lbnQgYXMgYSBjb25kaXRpb24gd2l0aG91dCBwYXJlbnRoZXNlcyIsIDQ5MiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY29uZGl0aW9uX2lzX2lkaW9tYXRpY19hc3NpZ25tZW50LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ1c2luZyB0aGUgcmVzdWx0IG9mIGFuIGFzc2lnbm1lbnQgYXMgYSBjb25kaXRpb24gd2l0aG91dCBwYXJlbnRoZXNlcyIsIDI2NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY29uZmxpY3Rpbmdfb3ZlcnJpZGluZ19wYXJhbV9tb2RpZmllcnMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImNvbmZsaWN0aW5nIGRpc3RyaWJ1dGVkIG9iamVjdCBtb2RpZmllcnMgb24gcGFyYW1ldGVyIHR5cGUgaW4gZGVjbGFyYXRpb24gb2YgJTAiLCA0ODgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2NvbmZsaWN0aW5nX292ZXJyaWRpbmdfcGFyYW1fdHlwZXMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImNvbmZsaWN0aW5nIHBhcmFtZXRlciB0eXBlcyBpbiBkZWNsYXJhdGlvbiBvZiAlMCVkaWZmezogJCB2cyAkfH0xLDIiLCA0ODgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2NvbmZsaWN0aW5nX292ZXJyaWRpbmdfcmV0X3R5cGVfbW9kaWZpZXJzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJjb25mbGljdGluZyBkaXN0cmlidXRlZCBvYmplY3QgbW9kaWZpZXJzIG9uIHJldHVybiB0eXBlIGluIGRlY2xhcmF0aW9uIG9mICUwIiwgNDg4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jb25mbGljdGluZ19vdmVycmlkaW5nX3JldF90eXBlcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiY29uZmxpY3RpbmcgcmV0dXJuIHR5cGUgaW4gZGVjbGFyYXRpb24gb2YgJTAlZGlmZns6ICQgdnMgJHx9MSwyIiwgNDg4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jb25mbGljdGluZ19vdmVycmlkaW5nX3ZhcmlhZGljLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJjb25mbGljdGluZyB2YXJpYWRpYyBkZWNsYXJhdGlvbiBvZiBtZXRob2QgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbiIsIDQ4OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY29uZmxpY3RpbmdfcGFyYW1fbW9kaWZpZXJzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJjb25mbGljdGluZyBkaXN0cmlidXRlZCBvYmplY3QgbW9kaWZpZXJzIG9uIHBhcmFtZXRlciB0eXBlIGluIGltcGxlbWVudGF0aW9uIG9mICUwIiwgMTY4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jb25mbGljdGluZ19wYXJhbV90eXBlcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY29uZmxpY3RpbmcgcGFyYW1ldGVyIHR5cGVzIGluIGltcGxlbWVudGF0aW9uIG9mICUwJWRpZmZ7OiAkIHZzICR8fTEsMiIsIDM3OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY29uZmxpY3RpbmdfcmV0X3R5cGVfbW9kaWZpZXJzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJjb25mbGljdGluZyBkaXN0cmlidXRlZCBvYmplY3QgbW9kaWZpZXJzIG9uIHJldHVybiB0eXBlIGluIGltcGxlbWVudGF0aW9uIG9mICUwIiwgMTY4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jb25mbGljdGluZ19yZXRfdHlwZXMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNvbmZsaWN0aW5nIHJldHVybiB0eXBlIGluIGltcGxlbWVudGF0aW9uIG9mICUwJWRpZmZ7OiAkIHZzICR8fTEsMiIsIDM4MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY29uZmxpY3RpbmdfdmFyaWFkaWMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNvbmZsaWN0aW5nIHZhcmlhZGljIGRlY2xhcmF0aW9uIG9mIG1ldGhvZCBhbmQgaXRzIGltcGxlbWVudGF0aW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY29udl90b19iYXNlX25vdF91c2VkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJjb252ZXJzaW9uIGZ1bmN0aW9uIGNvbnZlcnRpbmcgJTAgdG8gaXRzIGJhc2UgY2xhc3MgJTEgd2lsbCBuZXZlciBiZSB1c2VkIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY29udl90b19zZWxmX25vdF91c2VkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJjb252ZXJzaW9uIGZ1bmN0aW9uIGNvbnZlcnRpbmcgJTAgdG8gaXRzZWxmIHdpbGwgbmV2ZXIgYmUgdXNlZCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2NvbnZfdG9fdm9pZF9ub3RfdXNlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY29udmVyc2lvbiBmdW5jdGlvbiBjb252ZXJ0aW5nICUwIHRvICUxIHdpbGwgbmV2ZXIgYmUgdXNlZCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2Nvcm91dGluZV9wcm9taXNlX3VuaGFuZGxlZF9leGNlcHRpb25fcmVxdWlyZWRfd2l0aF9leGNlcHRpb25zLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMCBpcyByZXF1aXJlZCB0byBkZWNsYXJlIHRoZSBtZW1iZXIgJ3VuaGFuZGxlZF9leGNlcHRpb24oKScgd2hlbiBleGNlcHRpb25zIGFyZSBlbmFibGVkIiwgMTM2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTQpCitESUFHKHdhcm5fY3Rvcl9wYXJtX3NoYWRvd3NfZmllbGQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImNvbnN0cnVjdG9yIHBhcmFtZXRlciAlMCBzaGFkb3dzIHRoZSBmaWVsZCAlMSBvZiAlMiIsIDU2MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4MTFfY29tcGF0X2NvbnN0ZXhwcl9ib2R5X2ludmFsaWRfc3RtdCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidXNlIG9mIHRoaXMgc3RhdGVtZW50IGluIGEgY29uc3RleHByICVzZWxlY3R7ZnVuY3Rpb258Y29uc3RydWN0b3J9MCBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKysgc3RhbmRhcmRzIGJlZm9yZSBDKysxNCIsIDEwMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4MTFfY29tcGF0X2NvbnN0ZXhwcl9ib2R5X211bHRpcGxlX3JldHVybiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAibXVsdGlwbGUgcmV0dXJuIHN0YXRlbWVudHMgaW4gY29uc3RleHByIGZ1bmN0aW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIEMrKyBzdGFuZGFyZHMgYmVmb3JlIEMrKzE0IiwgMTAxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jeHgxMV9jb21wYXRfY29uc3RleHByX2JvZHlfbm9fcmV0dXJuLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJjb25zdGV4cHIgZnVuY3Rpb24gd2l0aCBubyByZXR1cm4gc3RhdGVtZW50cyBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKysgc3RhbmRhcmRzIGJlZm9yZSBDKysxNCIsIDEwMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4MTFfY29tcGF0X2NvbnN0ZXhwcl9sb2NhbF92YXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInZhcmlhYmxlIGRlY2xhcmF0aW9uIGluIGEgY29uc3RleHByICVzZWxlY3R7ZnVuY3Rpb258Y29uc3RydWN0b3J9MCBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKysgc3RhbmRhcmRzIGJlZm9yZSBDKysxNCIsIDEwMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4MTFfY29tcGF0X2NvbnN0ZXhwcl90eXBlX2RlZmluaXRpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInR5cGUgZGVmaW5pdGlvbiBpbiBhIGNvbnN0ZXhwciAlc2VsZWN0e2Z1bmN0aW9ufGNvbnN0cnVjdG9yfTAgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrIHN0YW5kYXJkcyBiZWZvcmUgQysrMTQiLCAxMDEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2N4eDExX2NvbXBhdF9pbml0X2NhcHR1cmUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImluaXRpYWxpemVkIGxhbWJkYSBjYXB0dXJlcyBhcmUgaW5jb21wYXRpYmxlIHdpdGggQysrIHN0YW5kYXJkcyBiZWZvcmUgQysrMTQiLCAxMDEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAzKQorRElBRyh3YXJuX2N4eDExX2NvbXBhdF92YXJpYWJsZV90ZW1wbGF0ZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidmFyaWFibGUgdGVtcGxhdGVzIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBDKysgc3RhbmRhcmRzIGJlZm9yZSBDKysxNCIsIDEwMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4MTFfZ251X2F0dHJpYnV0ZV9vbl90eXBlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJhdHRyaWJ1dGUgJTAgaWdub3JlZCwgYmVjYXVzZSBpdCBjYW5ub3QgYmUgYXBwbGllZCB0byBhIHR5cGUiLCAyNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2N4eDE0X2NvbXBhdF9jb25zdGV4cHJfbm90X2NvbnN0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICInY29uc3RleHByJyBub24tc3RhdGljIG1lbWJlciBmdW5jdGlvbiB3aWxsIG5vdCBiZSBpbXBsaWNpdGx5ICdjb25zdCcgaW4gQysrMTQ7IGFkZCAnY29uc3QnIHRvIGF2b2lkIGEgY2hhbmdlIGluIGJlaGF2aW9yIiwgMTMxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jeHgxNF9jb21wYXRfZGVjb21wX2RlY2wsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImRlY29tcG9zaXRpb24gZGVjbGFyYXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBDKysgc3RhbmRhcmRzIGJlZm9yZSBDKysxNyIsIDk5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jeHgxNF9jb21wYXRfaW5saW5lX3ZhcmlhYmxlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJpbmxpbmUgdmFyaWFibGVzIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBDKysgc3RhbmRhcmRzIGJlZm9yZSBDKysxNyIsIDk5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jeHgxNF9jb21wYXRfc3Rhcl90aGlzX2xhbWJkYV9jYXB0dXJlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJieSB2YWx1ZSBjYXB0dXJlIG9mICcqdGhpcycgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrIHN0YW5kYXJkcyBiZWZvcmUgQysrMTciLCA5OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDMpCitESUFHKHdhcm5fY3h4MTRfY29tcGF0X3N0YXRpY19hc3NlcnRfbm9fbWVzc2FnZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAic3RhdGljX2Fzc2VydCB3aXRoIG5vIG1lc3NhZ2UgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrIHN0YW5kYXJkcyBiZWZvcmUgQysrMTciLCA5OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4MTRfY29tcGF0X3RlbXBsYXRlX25vbnR5cGVfcGFybV9hdXRvX3R5cGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlcnMgZGVjbGFyZWQgd2l0aCAlMCBhcmUgaW5jb21wYXRpYmxlIHdpdGggQysrIHN0YW5kYXJkcyBiZWZvcmUgQysrMTciLCA5OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4MTdfY29tcGF0X2VxdWFsc190aGlzX2xhbWJkYV9jYXB0dXJlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJleHBsaWNpdCBjYXB0dXJlIG9mICd0aGlzJyB3aXRoIGEgY2FwdHVyZSBkZWZhdWx0IG9mICc9JyBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKysgc3RhbmRhcmRzIGJlZm9yZSBDKysyYSIsIDk3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMykKK0RJQUcod2Fybl9jeHgxN19jb21wYXRfZXhjZXB0aW9uX3NwZWNfaW5fc2lnbmF0dXJlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJtYW5nbGVkIG5hbWUgb2YgJTAgd2lsbCBjaGFuZ2UgaW4gQysrMTcgZHVlIHRvIG5vbi10aHJvd2luZyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBpbiBmdW5jdGlvbiBzaWduYXR1cmUiLCA4NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4MTdfY29tcGF0X3BvaW50ZXJfdG9fY29uc3RfcmVmX21lbWJlcl9vbl9ydmFsdWUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImludm9raW5nIGEgcG9pbnRlciB0byBhICdjb25zdCAmJyBtZW1iZXIgZnVuY3Rpb24gb24gYW4gcnZhbHVlIGlzIGluY29tcGF0aWJsZSB3aXRoIEMrKyBzdGFuZGFyZHMgYmVmb3JlIEMrKzJhIiwgOTgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF9hcnJheV9zaXplX2NvbnZlcnNpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSBhcnJheSBzaXplIGV4cHJlc3Npb24gb2YgdHlwZSAlMCB0byAlc2VsZWN0e2ludGVncmFsfGVudW1lcmF0aW9ufTEgdHlwZSAlMiBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwOCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X2F1dG9fdHlwZV9zcGVjaWZpZXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIidhdXRvJyB0eXBlIHNwZWNpZmllciBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X2Nhc3RfZm5fb2JqLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJjYXN0IGJldHdlZW4gcG9pbnRlci10by1mdW5jdGlvbiBhbmQgcG9pbnRlci10by1vYmplY3QgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF9jb25zdGV4cHIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIidjb25zdGV4cHInIHNwZWNpZmllciBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X2N0b3JfbGlzdF9pbml0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJjb25zdHJ1Y3RvciBjYWxsIGZyb20gaW5pdGlhbGl6ZXIgbGlzdCBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X2RlbGVnYXRpbmdfY3RvciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZGVsZWdhdGluZyBjb25zdHJ1Y3RvcnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfZW1wdHlfc2NhbGFyX2luaXRpYWxpemVyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJzY2FsYXIgaW5pdGlhbGl6ZWQgZnJvbSBlbXB0eSBpbml0aWFsaXplciBsaXN0IGlzIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfZW51bV9mcmllbmQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImJlZnJpZW5kaW5nIGVudW1lcmF0aW9uIHR5cGUgJTAgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF9lbnVtX25lc3RlZF9uYW1lX3NwZWMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImVudW1lcmF0aW9uIHR5cGUgaW4gbmVzdGVkIG5hbWUgc3BlY2lmaWVyIGlzIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfZXhwbGljaXRfY29udmVyc2lvbl9mdW5jdGlvbnMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImV4cGxpY2l0IGNvbnZlcnNpb24gZnVuY3Rpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X2ZyaWVuZF9pc19tZW1iZXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImZyaWVuZCBkZWNsYXJhdGlvbiBuYW1pbmcgYSBtZW1iZXIgb2YgdGhlIGRlY2xhcmluZyBjbGFzcyBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X2dvdG9faW50b19wcm90ZWN0ZWRfc2NvcGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImp1bXAgZnJvbSB0aGlzIGdvdG8gc3RhdGVtZW50IHRvIGl0cyBsYWJlbCBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X2luZGlyZWN0X2dvdG9faW5fcHJvdGVjdGVkX3Njb3BlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJqdW1wIGZyb20gdGhpcyBpbmRpcmVjdCBnb3RvIHN0YXRlbWVudCB0byBvbmUgb2YgaXRzIHBvc3NpYmxlIHRhcmdldHMgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF9pbml0aWFsaXplcl9saXN0X2luaXQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImluaXRpYWxpemF0aW9uIG9mIGluaXRpYWxpemVyX2xpc3Qgb2JqZWN0IGlzIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfbm9uX3N0YXRpY19tZW1iZXJfdXNlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ1c2Ugb2Ygbm9uLXN0YXRpYyBkYXRhIG1lbWJlciAlMCBpbiBhbiB1bmV2YWx1YXRlZCBjb250ZXh0IGlzIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfbm9uY2xhc3NfdHlwZV9mcmllbmQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm5vbi1jbGFzcyBmcmllbmQgdHlwZSAlMCBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X25vbnRyaXZpYWxfdW5pb25fb3JfYW5vbl9zdHJ1Y3RfbWVtYmVyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlc2VsZWN0e2Fub255bW91cyBzdHJ1Y3R8dW5pb259MCBtZW1iZXIgJTEgd2l0aCBhIG5vbi10cml2aWFsICVzZWxlY3R7Y29uc3RydWN0b3J8Y29weSBjb25zdHJ1Y3Rvcnxtb3ZlIGNvbnN0cnVjdG9yfGNvcHkgYXNzaWdubWVudCBvcGVyYXRvcnxtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3J8ZGVzdHJ1Y3Rvcn0yIGlzIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfcGFzc19ub25fcG9kX2FyZ190b192YXJhcmcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInBhc3Npbmcgb2JqZWN0IG9mIHRyaXZpYWwgYnV0IG5vbi1QT0QgdHlwZSAlMCB0aHJvdWdoIHZhcmlhZGljICVzZWxlY3R7ZnVuY3Rpb258YmxvY2t8bWV0aG9kfGNvbnN0cnVjdG9yfTEgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF9yZWZlcmVuY2VfbGlzdF9pbml0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJyZWZlcmVuY2UgaW5pdGlhbGl6ZWQgZnJvbSBpbml0aWFsaXplciBsaXN0IGlzIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfc2ZpbmFlX2FjY2Vzc19jb250cm9sLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJzdWJzdGl0dXRpb24gZmFpbHVyZSBkdWUgdG8gYWNjZXNzIGNvbnRyb2wgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDQsIFNGSU5BRV9SZXBvcnQsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfc3RhdGljX2RhdGFfbWVtYmVyX2luX3VuaW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJzdGF0aWMgZGF0YSBtZW1iZXIgJTAgaW4gdW5pb24gaXMgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF9zd2l0Y2hfaW50b19wcm90ZWN0ZWRfc2NvcGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImp1bXAgZnJvbSBzd2l0Y2ggc3RhdGVtZW50IHRvIHRoaXMgY2FzZSBsYWJlbCBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X3RlbXBfY29weSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJXNlbGVjdHtjb3B5aW5nIHZhcmlhYmxlfGNvcHlpbmcgcGFyYW1ldGVyfHJldHVybmluZyBvYmplY3R8dGhyb3dpbmcgb2JqZWN0fGNvcHlpbmcgbWVtYmVyIHN1Ym9iamVjdHxjb3B5aW5nIGFycmF5IGVsZW1lbnR8YWxsb2NhdGluZyBvYmplY3R8Y29weWluZyB0ZW1wb3Jhcnl8aW5pdGlhbGl6aW5nIGJhc2Ugc3Vib2JqZWN0fGluaXRpYWxpemluZyB2ZWN0b3IgZWxlbWVudH0xIG9mIHR5cGUgJTIgd2hlbiBiaW5kaW5nIGEgcmVmZXJlbmNlIHRvIGEgdGVtcG9yYXJ5IHdvdWxkICVzZWxlY3R7aW52b2tlIGFuIGluYWNjZXNzaWJsZSBjb25zdHJ1Y3RvcnxmaW5kIG5vIHZpYWJsZSBjb25zdHJ1Y3RvcnxmaW5kIGFtYmlndW91cyBjb25zdHJ1Y3RvcnN8aW52b2tlIGEgZGVsZXRlZCBjb25zdHJ1Y3Rvcn0wIGluIEMrKzk4IiwgMTA1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfdGVtcGxhdGVfYXJnX2V4dHJhX3BhcmVucywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAicmVkdW5kYW50IHBhcmVudGhlc2VzIHN1cnJvdW5kaW5nIGFkZHJlc3Mgbm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnQgYXJlIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfdGVtcGxhdGVfYXJnX2xvY2FsX3R5cGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImxvY2FsIHR5cGUgJTAgYXMgdGVtcGxhdGUgYXJndW1lbnQgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiLCAxMDcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2N4eDk4X2NvbXBhdF90ZW1wbGF0ZV9hcmdfbnVsbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidXNlIG9mIG51bGwgcG9pbnRlciBhcyBub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X3RlbXBsYXRlX2FyZ19vYmplY3RfaW50ZXJuYWwsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm5vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50IHJlZmVycmluZyB0byAlc2VsZWN0e2Z1bmN0aW9ufG9iamVjdH0wICUxIHdpdGggaW50ZXJuYWwgbGlua2FnZSBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X3RlbXBsYXRlX2FyZ191bm5hbWVkX3R5cGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVubmFtZWQgdHlwZSBhcyB0ZW1wbGF0ZSBhcmd1bWVudCBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X3RlbXBsYXRlX291dHNpZGVfb2ZfdGVtcGxhdGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVzZSBvZiAndGVtcGxhdGUnIGtleXdvcmQgb3V0c2lkZSBvZiBhIHRlbXBsYXRlIGlzIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4IiwgMTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9jeHg5OF9jb21wYXRfdGVtcGxhdGVfcGFyYW1ldGVyX2RlZmF1bHRfaW5fZnVuY3Rpb25fdGVtcGxhdGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImRlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnRzIGZvciBhIGZ1bmN0aW9uIHRlbXBsYXRlIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X3R5cGVuYW1lX291dHNpZGVfb2ZfdGVtcGxhdGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVzZSBvZiAndHlwZW5hbWUnIG91dHNpZGUgb2YgYSB0ZW1wbGF0ZSBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X3VuZWxhYm9yYXRlZF9mcmllbmRfdHlwZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiYmVmcmllbmRpbmcgJTEgd2l0aG91dCAnJXNlbGVjdHtzdHJ1Y3R8aW50ZXJmYWNlfHVuaW9ufGNsYXNzfGVudW19MCcga2V5d29yZCBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X3VuaWNvZGVfdHlwZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJyUwJyB0eXBlIHNwZWNpZmllciBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4OThfY29tcGF0X3VzaW5nX2RlY2xfY29uc3RydWN0b3IsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImluaGVyaXRpbmcgY29uc3RydWN0b3JzIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCIsIDEwNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fY3h4X21zX3N0cnVjdCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1zX3N0cnVjdCBtYXkgbm90IHByb2R1Y2UgTWljcm9zb2Z0LWNvbXBhdGlibGUgbGF5b3V0cyBmb3IgY2xhc3NlcyB3aXRoIGJhc2UgY2xhc3NlcyBvciB2aXJ0dWFsIGZ1bmN0aW9ucyIsIDI4OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZGFuZ2xpbmdfc3RkX2luaXRpYWxpemVyX2xpc3QsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImFycmF5IGJhY2tpbmcgdGhlIGluaXRpYWxpemVyIGxpc3Qgd2lsbCBiZSBkZXN0cm95ZWQgYXQgdGhlIGVuZCBvZiAlc2VsZWN0e3RoZSBmdWxsLWV4cHJlc3Npb258dGhlIGNvbnN0cnVjdG9yfTAiLCAxNDUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2RlYWxsb2NfaW5fY2F0ZWdvcnksIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIi1kZWFsbG9jIGlzIGJlaW5nIG92ZXJyaWRkZW4gaW4gYSBjYXRlZ29yeSIsIDE0NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZGVjbF9pbl9wYXJhbV9saXN0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJkZWNsYXJhdGlvbiBvZiAlMCB3aWxsIG5vdCBiZSB2aXNpYmxlIG91dHNpZGUgb2YgdGhpcyBmdW5jdGlvbiIsIDcxMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZGVjbF9zaGFkb3csIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImRlY2xhcmF0aW9uIHNoYWRvd3MgYSAlc2VsZWN0e2xvY2FsIHZhcmlhYmxlfHZhcmlhYmxlIGluICUyfHN0YXRpYyBkYXRhIG1lbWJlciBvZiAlMnxmaWVsZCBvZiAlMnx0eXBlZGVmIGluICUyfHR5cGUgYWxpYXMgaW4gJTJ9MSIsIDU1OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZGVjbF9zaGFkb3dfdW5jYXB0dXJlZF9sb2NhbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZGVjbGFyYXRpb24gc2hhZG93cyBhICVzZWxlY3R7bG9jYWwgdmFyaWFibGV8dmFyaWFibGUgaW4gJTJ8c3RhdGljIGRhdGEgbWVtYmVyIG9mICUyfGZpZWxkIG9mICUyfHR5cGVkZWYgaW4gJTJ8dHlwZSBhbGlhcyBpbiAlMn0xIiwgNTY0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9kZWNsc3BlY19hdHRyaWJ1dGVfaWdub3JlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYXR0cmlidXRlICUwIGlzIGlnbm9yZWQsIHBsYWNlIGl0IGFmdGVyIFwiJXNlbGVjdHtjbGFzc3xzdHJ1Y3R8aW50ZXJmYWNlfHVuaW9ufGVudW19MVwiIHRvIGFwcGx5IGF0dHJpYnV0ZSB0byB0eXBlIGRlY2xhcmF0aW9uIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9kZWVwX2V4Y2VwdGlvbl9zcGVjc19kaWZmZXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBvZiAlc2VsZWN0e3JldHVybnxhcmd1bWVudH0wIHR5cGVzIGRpZmZlciIsIDI4NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZGVmX21pc3NpbmdfY2FzZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJXBsdXJhbHsxOmVudW1lcmF0aW9uIHZhbHVlICUxIG5vdCBleHBsaWNpdGx5IGhhbmRsZWQgaW4gc3dpdGNofDI6ZW51bWVyYXRpb24gdmFsdWVzICUxIGFuZCAlMiBub3QgZXhwbGljaXRseSBoYW5kbGVkIGluIHN3aXRjaHwzOmVudW1lcmF0aW9uIHZhbHVlcyAlMSwgJTIsIGFuZCAlMyBub3QgZXhwbGljaXRseSBoYW5kbGVkIGluIHN3aXRjaHw6JTAgZW51bWVyYXRpb24gdmFsdWVzIG5vdCBleHBsaWNpdGx5IGhhbmRsZWQgaW4gc3dpdGNoOiAlMSwgJTIsICUzLi4ufTAiLCA2MTIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2RlZmF1bHRfYXRvbWljX2N1c3RvbV9nZXR0ZXJfc2V0dGVyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJhdG9taWMgYnkgZGVmYXVsdCBwcm9wZXJ0eSAlMCBoYXMgYSB1c2VyIGRlZmluZWQgJXNlbGVjdHtnZXR0ZXJ8c2V0dGVyfTEgKHByb3BlcnR5IHNob3VsZCBiZSBtYXJrZWQgJ2F0b21pYycgaWYgdGhpcyBpcyBpbnRlbmRlZCkiLCAxNDIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2RlbGVnYXRpbmdfY3Rvcl9jeWNsZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNvbnN0cnVjdG9yIGZvciAlMCBjcmVhdGVzIGEgZGVsZWdhdGlvbiBjeWNsZSIsIDE1MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZGVsZXRlX2Fic3RyYWN0X25vbl92aXJ0dWFsX2R0b3IsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiVzZWxlY3R7ZGVsZXRlfGRlc3RydWN0b3J9MCBjYWxsZWQgb24gJTEgdGhhdCBpcyBhYnN0cmFjdCBidXQgaGFzIG5vbi12aXJ0dWFsIGRlc3RydWN0b3IiLCAxNTIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIHRydWUsIDIpCitESUFHKHdhcm5fZGVsZXRlX2FycmF5X3R5cGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIidkZWxldGUnIGFwcGxpZWQgdG8gYSBwb2ludGVyLXRvLWFycmF5IHR5cGUgJTAgdHJlYXRlZCBhcyAnZGVsZXRlW10nIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZGVsZXRlX2luY29tcGxldGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImRlbGV0aW5nIHBvaW50ZXIgdG8gaW5jb21wbGV0ZSB0eXBlICUwIG1heSBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3IiLCAxNTEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2RlbGV0ZV9ub25fdmlydHVhbF9kdG9yLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlc2VsZWN0e2RlbGV0ZXxkZXN0cnVjdG9yfTAgY2FsbGVkIG9uIG5vbi1maW5hbCAlMSB0aGF0IGhhcyB2aXJ0dWFsIGZ1bmN0aW9ucyBidXQgbm9uLXZpcnR1YWwgZGVzdHJ1Y3RvciIsIDE1MiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgdHJ1ZSwgMikKK0RJQUcod2Fybl9kZXByZWNhdGVkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMCBpcyBkZXByZWNhdGVkIiwgMTU1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjcpCitESUFHKHdhcm5fZGVwcmVjYXRlZF9hbm9ueW1vdXNfbmFtZXNwYWNlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICInZGVwcmVjYXRlZCcgYXR0cmlidXRlIG9uIGFub255bW91cyBuYW1lc3BhY2UgaWdub3JlZCIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZGVwcmVjYXRlZF9jb3B5X29wZXJhdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZGVmaW5pdGlvbiBvZiBpbXBsaWNpdCBjb3B5ICVzZWxlY3R7Y29uc3RydWN0b3J8YXNzaWdubWVudCBvcGVyYXRvcn0xIGZvciAlMCBpcyBkZXByZWNhdGVkIGJlY2F1c2UgaXQgaGFzIGEgdXNlci1kZWNsYXJlZCAlc2VsZWN0e2NvcHkgJXNlbGVjdHthc3NpZ25tZW50IG9wZXJhdG9yfGNvbnN0cnVjdG9yfTF8ZGVzdHJ1Y3Rvcn0yIiwgMTUzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjcpCitESUFHKHdhcm5fZGVwcmVjYXRlZF9kZWYsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImltcGxlbWVudGluZyBkZXByZWNhdGVkICVzZWxlY3R7bWV0aG9kfGNsYXNzfGNhdGVnb3J5fTAiLCAxNTcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2RlcHJlY2F0ZWRfZndkY2xhc3NfbWVzc2FnZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgbWF5IGJlIGRlcHJlY2F0ZWQgYmVjYXVzZSB0aGUgcmVjZWl2ZXIgdHlwZSBpcyB1bmtub3duIiwgMTU1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjcpCitESUFHKHdhcm5fZGVwcmVjYXRlZF9tZXNzYWdlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMCBpcyBkZXByZWNhdGVkOiAlMSIsIDE1NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI3KQorRElBRyh3YXJuX2RlcHJlY2F0ZWRfcmVkdW5kYW50X2NvbnN0ZXhwcl9zdGF0aWNfZGVmLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJvdXQtb2YtbGluZSBkZWZpbml0aW9uIG9mIGNvbnN0ZXhwciBzdGF0aWMgZGF0YSBtZW1iZXIgaXMgcmVkdW5kYW50IGluIEMrKzE3IGFuZCBpcyBkZXByZWNhdGVkIiwgMTUzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjcpCitESUFHKHdhcm5fZGVwcmVjYXRlZF9yZWdpc3RlciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJ3JlZ2lzdGVyJyBzdG9yYWdlIGNsYXNzIHNwZWNpZmllciBpcyBkZXByZWNhdGVkIGFuZCBpbmNvbXBhdGlibGUgd2l0aCBDKysxNyIsIDE2MiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI3KQorRElBRyh3YXJuX2RlcHJlY2F0ZWRfc3RyaW5nX2xpdGVyYWxfY29udmVyc2lvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY29udmVyc2lvbiBmcm9tIHN0cmluZyBsaXRlcmFsIHRvICUwIGlzIGRlcHJlY2F0ZWQiLCA3NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI3KQorRElBRyh3YXJuX2Rlc3RydWN0b3JfbWFya2VkX25vdF9vdmVycmlkZV9vdmVycmlkaW5nLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlMCBvdmVycmlkZXMgYSBkZXN0cnVjdG9yIGJ1dCBpcyBub3QgbWFya2VkICdvdmVycmlkZSciLCAyOTgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2RpYWdub3NlX2lmX3N1Y2NlZWRlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAiLCA3MDUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIHRydWUsIDIpCitESUFHKHdhcm5fZGlyZWN0X2luaXRpYWxpemVfY2FsbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZXhwbGljaXQgY2FsbCB0byAraW5pdGlhbGl6ZSByZXN1bHRzIGluIGR1cGxpY2F0ZSBjYWxsIHRvICtpbml0aWFsaXplIiwgMjAzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9kaXJlY3RfaXZhcl9hY2Nlc3MsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImluc3RhbmNlIHZhcmlhYmxlICUwIGlzIGJlaW5nIGRpcmVjdGx5IGFjY2Vzc2VkIiwgMTY0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9kaXJlY3Rfc3VwZXJfaW5pdGlhbGl6ZV9jYWxsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleHBsaWNpdCBjYWxsIHRvIFtzdXBlciBpbml0aWFsaXplXSBzaG91bGQgb25seSBiZSBpbiBpbXBsZW1lbnRhdGlvbiBvZiAraW5pdGlhbGl6ZSIsIDIwMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZGxsaW1wb3J0X2Ryb3BwZWRfZnJvbV9pbmxpbmVfZnVuY3Rpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiVxMCByZWRlY2xhcmVkIGlubGluZTsgJTEgYXR0cmlidXRlIGlnbm9yZWQiLCAyNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2RvdWJsZV9jb25zdF9yZXF1aXJlc19mcDY0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJkb3VibGUgcHJlY2lzaW9uIGNvbnN0YW50IHJlcXVpcmVzIGNsX2tocl9mcDY0LCBjYXN0aW5nIHRvIHNpbmdsZSBwcmVjaXNpb24iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9kb3VibGVfbG9jaywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiYWNxdWlyaW5nICUwICclMScgdGhhdCBpcyBhbHJlYWR5IGhlbGQiLCA2MjcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2R1cF9jYXRlZ29yeV9kZWYsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImR1cGxpY2F0ZSBkZWZpbml0aW9uIG9mIGNhdGVnb3J5ICUxIG9uIGludGVyZmFjZSAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2R1cGxpY2F0ZV9hdHRyaWJ1dGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImF0dHJpYnV0ZSAlMCBpcyBhbHJlYWR5IGFwcGxpZWQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycyIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZHVwbGljYXRlX2F0dHJpYnV0ZV9leGFjdCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYXR0cmlidXRlICUwIGlzIGFscmVhZHkgYXBwbGllZCIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZHVwbGljYXRlX2RlY2xzcGVjLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJkdXBsaWNhdGUgJyUwJyBkZWNsYXJhdGlvbiBzcGVjaWZpZXIiLCAxODEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2R1cGxpY2F0ZV9lbnVtX3ZhbHVlcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZWxlbWVudCAlMCBoYXMgYmVlbiBpbXBsaWNpdGx5IGFzc2lnbmVkICUxIHdoaWNoIGFub3RoZXIgZWxlbWVudCBoYXMgYmVlbiBhc3NpZ25lZCIsIDE4MiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZHVwbGljYXRlX21ldGhvZF9kZWNsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJtdWx0aXBsZSBkZWNsYXJhdGlvbnMgb2YgbWV0aG9kICUwIGZvdW5kIGFuZCBpZ25vcmVkIiwgMTg0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9kdXBsaWNhdGVfcHJvdG9jb2xfZGVmLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJkdXBsaWNhdGUgcHJvdG9jb2wgZGVmaW5pdGlvbiBvZiAlMCBpcyBpZ25vcmVkIiwgMTg1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9keW5fY2xhc3NfbWVtYWNjZXNzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlc2VsZWN0e2Rlc3RpbmF0aW9uIGZvcnxzb3VyY2Ugb2Z8Zmlyc3Qgb3BlcmFuZCBvZnxzZWNvbmQgb3BlcmFuZCBvZn0wIHRoaXMgJTEgY2FsbCBpcyBhIHBvaW50ZXIgdG8gJXNlbGVjdHt8Y2xhc3MgY29udGFpbmluZyBhIH0yZHluYW1pYyBjbGFzcyAlMzsgdnRhYmxlIHBvaW50ZXIgd2lsbCBiZSAlc2VsZWN0e292ZXJ3cml0dGVufGNvcGllZHxtb3ZlZHxjb21wYXJlZH00IiwgMTg2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9lbXB0eV9mb3JfYm9keSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZm9yIGxvb3AgaGFzIGVtcHR5IGJvZHkiLCAxOTAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2VtcHR5X2Zvcm1hdF9zdHJpbmcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImZvcm1hdCBzdHJpbmcgaXMgZW1wdHkiLCAyMjcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyOCkKK0RJQUcod2Fybl9lbXB0eV9pZl9ib2R5LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpZiBzdGF0ZW1lbnQgaGFzIGVtcHR5IGJvZHkiLCAxOTAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2VtcHR5X3BhcmVuc19hcmVfZnVuY3Rpb25fZGVjbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZW1wdHkgcGFyZW50aGVzZXMgaW50ZXJwcmV0ZWQgYXMgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiIsIDcxMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZW1wdHlfcmFuZ2VfYmFzZWRfZm9yX2JvZHksIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInJhbmdlLWJhc2VkIGZvciBsb29wIGhhcyBlbXB0eSBib2R5IiwgMTkwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9lbXB0eV9zd2l0Y2hfYm9keSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAic3dpdGNoIHN0YXRlbWVudCBoYXMgZW1wdHkgYm9keSIsIDE5MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZW1wdHlfd2hpbGVfYm9keSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAid2hpbGUgbG9vcCBoYXMgZW1wdHkgYm9keSIsIDE5MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZW51bV92YWx1ZV9vdmVyZmxvdywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAib3ZlcmZsb3cgaW4gZW51bWVyYXRpb24gdmFsdWUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9lcXVhbGl0eV93aXRoX2V4dHJhX3BhcmVucywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZXF1YWxpdHkgY29tcGFyaXNvbiB3aXRoIGV4dHJhbmVvdXMgcGFyZW50aGVzZXMiLCA0OTMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2V4Y2VwdGlvbl9jYXVnaHRfYnlfZWFybGllcl9oYW5kbGVyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleGNlcHRpb24gb2YgdHlwZSAlMCB3aWxsIGJlIGNhdWdodCBieSBlYXJsaWVyIGhhbmRsZXIiLCAxOTksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2V4Y2VwdGlvbl9zcGVjX2RlcHJlY2F0ZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImR5bmFtaWMgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIGFyZSBkZXByZWNhdGVkIiwgMTU2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjcpCitESUFHKHdhcm5fZXhpdF90aW1lX2Rlc3RydWN0b3IsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImRlY2xhcmF0aW9uIHJlcXVpcmVzIGFuIGV4aXQtdGltZSBkZXN0cnVjdG9yIiwgMjAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9leHBlY3RpbmdfbG9ja19oZWxkX29uX2xvb3AsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImV4cGVjdGluZyAlMCAnJTEnIHRvIGJlIGhlbGQgYXQgc3RhcnQgb2YgZWFjaCBsb29wIiwgNjI3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9leHBlY3RpbmdfbG9ja2VkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJleHBlY3RpbmcgJTAgJyUxJyB0byBiZSBoZWxkIGF0IHRoZSBlbmQgb2YgZnVuY3Rpb24iLCA2MjcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2V4cGxpY2l0X2luc3RhbnRpYXRpb25fYWZ0ZXJfc3BlY2lhbGl6YXRpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImV4cGxpY2l0IGluc3RhbnRpYXRpb24gb2YgJTAgdGhhdCBvY2N1cnMgYWZ0ZXIgYW4gZXhwbGljaXQgc3BlY2lhbGl6YXRpb24gaGFzIG5vIGVmZmVjdCIsIDMwOCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZXhwbGljaXRfaW5zdGFudGlhdGlvbl9pbmxpbmVfMHgsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImV4cGxpY2l0IGluc3RhbnRpYXRpb24gY2Fubm90IGJlICdpbmxpbmUnIiwgNzMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2V4cGxpY2l0X2luc3RhbnRpYXRpb25fbXVzdF9iZV9nbG9iYWxfMHgsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImV4cGxpY2l0IGluc3RhbnRpYXRpb24gb2YgJTAgbXVzdCBvY2N1ciBhdCBnbG9iYWwgc2NvcGUiLCA3MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZXhwbGljaXRfaW5zdGFudGlhdGlvbl9vdXRfb2Zfc2NvcGVfMHgsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImV4cGxpY2l0IGluc3RhbnRpYXRpb24gb2YgJTAgbm90IGluIGEgbmFtZXNwYWNlIGVuY2xvc2luZyAlMSIsIDczLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9leHBsaWNpdF9pbnN0YW50aWF0aW9uX3VucXVhbGlmaWVkX3dyb25nX25hbWVzcGFjZV8weCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiAlcTAgbXVzdCBvY2N1ciBpbiBuYW1lc3BhY2UgJTEiLCA3MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZXh0ZXJuX2luaXQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIidleHRlcm4nIHZhcmlhYmxlIGhhcyBhbiBpbml0aWFsaXplciIsIDIwNiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZmFsbG9mZl9ub252b2lkX2Nvcm91dGluZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY29udHJvbCByZWFjaGVzIGVuZCBvZiBjb3JvdXRpbmU7IHdoaWNoIGlzIHVuZGVmaW5lZCBiZWhhdmlvciBiZWNhdXNlIHRoZSBwcm9taXNlIHR5cGUgJTAgZG9lcyBub3QgZGVjbGFyZSAncmV0dXJuX3ZvaWQoKSciLCA1NDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2ZhbGxvZmZfbm9udm9pZF9mdW5jdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY29udHJvbCByZWFjaGVzIGVuZCBvZiBub24tdm9pZCBmdW5jdGlvbiIsIDU0NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZmFsbG9mZl9ub252b2lkX2xhbWJkYSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY29udHJvbCByZWFjaGVzIGVuZCBvZiBub24tdm9pZCBsYW1iZGEiLCA1NDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAzKQorRElBRyh3YXJuX2ZhbGxvZmZfbm9yZXR1cm5fZnVuY3Rpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImZ1bmN0aW9uIGRlY2xhcmVkICdub3JldHVybicgc2hvdWxkIG5vdCByZXR1cm4iLCAzMTksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2ZhbGx0aHJvdWdoX2F0dHJfdW5yZWFjaGFibGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImZhbGx0aHJvdWdoIGFubm90YXRpb24gaW4gdW5yZWFjaGFibGUgY29kZSIsIDI3NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZmllbGRfaXNfdW5pbml0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJmaWVsZCAlMCBpcyB1bmluaXRpYWxpemVkIHdoZW4gdXNlZCBoZXJlIiwgNjU2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9mbGFnX2VudW1fY29uc3RhbnRfb3V0X29mX3JhbmdlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJlbnVtZXJhdGlvbiB2YWx1ZSAlMCBpcyBvdXQgb2YgcmFuZ2Ugb2YgZmxhZ3MgaW4gZW51bWVyYXRpb24gdHlwZSAlMSIsIDIxMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZmxvYXRfb3ZlcmZsb3csIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm1hZ25pdHVkZSBvZiBmbG9hdGluZy1wb2ludCBjb25zdGFudCB0b28gbGFyZ2UgZm9yIHR5cGUgJTA7IG1heGltdW0gaXMgJTEiLCAzMzUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2Zsb2F0X3VuZGVyZmxvdywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibWFnbml0dWRlIG9mIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50IHRvbyBzbWFsbCBmb3IgdHlwZSAlMDsgbWluaW11bSBpcyAlMSIsIDMzNSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZmxvYXRpbmdwb2ludF9lcSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiY29tcGFyaW5nIGZsb2F0aW5nIHBvaW50IHdpdGggPT0gb3IgIT0gaXMgdW5zYWZlIiwgMjE1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9mb3JfcmFuZ2VfYmVnaW5fZW5kX3R5cGVzX2RpZmZlciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJ2JlZ2luJyBhbmQgJ2VuZCcgcmV0dXJuaW5nIGRpZmZlcmVudCB0eXBlcyAoJTAgYW5kICUxKSBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKysgc3RhbmRhcmRzIGJlZm9yZSBDKysxNyIsIDk5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9mb3JfcmFuZ2VfY29uc3RfcmVmZXJlbmNlX2NvcHksIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImxvb3AgdmFyaWFibGUgJTAgJWRpZmZ7aGFzIHR5cGUgJCBidXQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0eXBlICR8IGlzIGluaXRpYWxpemVkIHdpdGggYSB2YWx1ZSBvZiBhIGRpZmZlcmVudCB0eXBlfTEsMiByZXN1bHRpbmcgaW4gYSBjb3B5IiwgNTI3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9mb3JfcmFuZ2VfY29weSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAibG9vcCB2YXJpYWJsZSAlMCBvZiB0eXBlICUxIGNyZWF0ZXMgYSBjb3B5IGZyb20gdHlwZSAlMiIsIDUyNywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZm9yX3JhbmdlX3ZhcmlhYmxlX2Fsd2F5c19jb3B5LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJsb29wIHZhcmlhYmxlICUwIGlzIGFsd2F5cyBhIGNvcHkgYmVjYXVzZSB0aGUgcmFuZ2Ugb2YgdHlwZSAlMSBkb2VzIG5vdCByZXR1cm4gYSByZWZlcmVuY2UiLCA1MjcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2Zvcm1hdF9QX25vX3ByZWNpc2lvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidXNpbmcgJyUlUCcgZm9ybWF0IHNwZWNpZmllciB3aXRob3V0IHByZWNpc2lvbiIsIDIxOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI4KQorRElBRyh3YXJuX2Zvcm1hdF9hcmd1bWVudF9uZWVkc19jYXN0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlc2VsZWN0e3ZhbHVlcyBvZiB0eXBlfGVudW0gdmFsdWVzIHdpdGggdW5kZXJseWluZyB0eXBlfTIgJyUwJyBzaG91bGQgbm90IGJlIHVzZWQgYXMgZm9ybWF0IGFyZ3VtZW50czsgYWRkIGFuIGV4cGxpY2l0IGNhc3QgdG8gJTEgaW5zdGVhZCIsIDIxOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI4KQorRElBRyh3YXJuX2Zvcm1hdF9jb252ZXJzaW9uX2FyZ3VtZW50X3R5cGVfbWlzbWF0Y2gsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImZvcm1hdCBzcGVjaWZpZXMgdHlwZSAlMCBidXQgdGhlIGFyZ3VtZW50IGhhcyAlc2VsZWN0e3R5cGV8dW5kZXJseWluZyB0eXBlfTIgJTEiLCAyMTksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyOCkKK0RJQUcod2Fybl9mb3JtYXRfY29udmVyc2lvbl9hcmd1bWVudF90eXBlX21pc21hdGNoX3BlZGFudGljLCBDTEFTU19FWFRFTlNJT04sICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImZvcm1hdCBzcGVjaWZpZXMgdHlwZSAlMCBidXQgdGhlIGFyZ3VtZW50IGhhcyAlc2VsZWN0e3R5cGV8dW5kZXJseWluZyB0eXBlfTIgJTEiLCAyMjQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2Zvcm1hdF9pbnZhbGlkX2Fubm90YXRpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVzaW5nICclMCcgZm9ybWF0IHNwZWNpZmllciBhbm5vdGF0aW9uIG91dHNpZGUgb2Ygb3NfbG9nKCkvb3NfdHJhY2UoKSIsIDIxOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI4KQorRElBRyh3YXJuX2Zvcm1hdF9pbnZhbGlkX2NvbnZlcnNpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImludmFsaWQgY29udmVyc2lvbiBzcGVjaWZpZXIgJyUwJyIsIDIyMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI4KQorRElBRyh3YXJuX2Zvcm1hdF9pbnZhbGlkX3Bvc2l0aW9uYWxfc3BlY2lmaWVyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpbnZhbGlkIHBvc2l0aW9uIHNwZWNpZmllZCBmb3IgJXNlbGVjdHtmaWVsZCB3aWR0aHxmaWVsZCBwcmVjaXNpb259MCIsIDIxOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI4KQorRElBRyh3YXJuX2Zvcm1hdF9taXhfcG9zaXRpb25hbF9ub25wb3NpdGlvbmFsX2FyZ3MsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNhbm5vdCBtaXggcG9zaXRpb25hbCBhbmQgbm9uLXBvc2l0aW9uYWwgYXJndW1lbnRzIGluIGZvcm1hdCBzdHJpbmciLCAyMTksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyOCkKK0RJQUcod2Fybl9mb3JtYXRfbm9uX3N0YW5kYXJkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICInJTAnICVzZWxlY3R7bGVuZ3RoIG1vZGlmaWVyfGNvbnZlcnNpb24gc3BlY2lmaWVyfTEgaXMgbm90IHN1cHBvcnRlZCBieSBJU08gQyIsIDIyMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZm9ybWF0X25vbl9zdGFuZGFyZF9jb252ZXJzaW9uX3NwZWMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVzaW5nIGxlbmd0aCBtb2RpZmllciAnJTAnIHdpdGggY29udmVyc2lvbiBzcGVjaWZpZXIgJyUxJyBpcyBub3Qgc3VwcG9ydGVkIGJ5IElTTyBDIiwgMjIyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9mb3JtYXRfbm9uX3N0YW5kYXJkX3Bvc2l0aW9uYWxfYXJnLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJwb3NpdGlvbmFsIGFyZ3VtZW50cyBhcmUgbm90IHN1cHBvcnRlZCBieSBJU08gQyIsIDIyMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZm9ybWF0X25vbmxpdGVyYWwsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImZvcm1hdCBzdHJpbmcgaXMgbm90IGEgc3RyaW5nIGxpdGVyYWwiLCAyMjMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2Zvcm1hdF9ub25saXRlcmFsX25vYXJncywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZm9ybWF0IHN0cmluZyBpcyBub3QgYSBzdHJpbmcgbGl0ZXJhbCAocG90ZW50aWFsbHkgaW5zZWN1cmUpIiwgMjI1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjgpCitESUFHKHdhcm5fZm9ybWF0X25vbnNlbnNpY2FsX2xlbmd0aCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibGVuZ3RoIG1vZGlmaWVyICclMCcgcmVzdWx0cyBpbiB1bmRlZmluZWQgYmVoYXZpb3Igb3Igbm8gZWZmZWN0IHdpdGggJyUxJyBjb252ZXJzaW9uIHNwZWNpZmllciIsIDIxOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI4KQorRElBRyh3YXJuX2Zvcm1hdF9zdHJpbmdfaXNfd2lkZV9saXRlcmFsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJmb3JtYXQgc3RyaW5nIHNob3VsZCBub3QgYmUgYSB3aWRlIHN0cmluZyIsIDIxOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI4KQorRElBRyh3YXJuX2Zvcm1hdF96ZXJvX3Bvc2l0aW9uYWxfc3BlY2lmaWVyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJwb3NpdGlvbiBhcmd1bWVudHMgaW4gZm9ybWF0IHN0cmluZ3Mgc3RhcnQgY291bnRpbmcgYXQgMSAobm90IDApIiwgMjE5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjgpCitESUFHKHdhcm5fZm9yd2FyZF9jbGFzc19yZWRlZmluaXRpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInJlZGVmaW5pdGlvbiBvZiBmb3J3YXJkIGNsYXNzICUwIG9mIGEgdHlwZWRlZiBuYW1lIG9mIGFuIG9iamVjdCB0eXBlIGlzIGlnbm9yZWQiLCA0NDUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2Z1bl9leGNsdWRlc19tdXRleCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiY2Fubm90IGNhbGwgZnVuY3Rpb24gJyUxJyB3aGlsZSAlMCAnJTInIGlzIGhlbGQiLCA2MjcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2Z1bl9yZXF1aXJlc19sb2NrLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJjYWxsaW5nIGZ1bmN0aW9uICUxIHJlcXVpcmVzIGhvbGRpbmcgJTAgJXNlbGVjdHsnJTInfCclMicgZXhjbHVzaXZlbHl9MyIsIDYyNywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZnVuX3JlcXVpcmVzX2xvY2tfcHJlY2lzZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiY2FsbGluZyBmdW5jdGlvbiAlMSByZXF1aXJlcyBob2xkaW5nICUwICVzZWxlY3R7JyUyJ3wnJTInIGV4Y2x1c2l2ZWx5fTMiLCA2MzEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2Z1bmNfdGVtcGxhdGVfbWlzc2luZywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiaW5zdGFudGlhdGlvbiBvZiBmdW5jdGlvbiAlcTAgcmVxdWlyZWQgaGVyZSwgYnV0IG5vIGRlZmluaXRpb24gaXMgYXZhaWxhYmxlIiwgNjQ0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9mdW5jdGlvbl9kZWZfaW5fb2JqY19jb250YWluZXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImZ1bmN0aW9uIGRlZmluaXRpb24gaW5zaWRlIGFuIE9iamVjdGl2ZS1DIGNvbnRhaW5lciBpcyBkZXByZWNhdGVkIiwgMjMxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9mdW5jdGlvbl9tYXJrZWRfbm90X292ZXJyaWRlX292ZXJyaWRpbmcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiUwIG92ZXJyaWRlcyBhIG1lbWJlciBmdW5jdGlvbiBidXQgaXMgbm90IG1hcmtlZCAnb3ZlcnJpZGUnIiwgMjk5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9nY19hdHRyaWJ1dGVfd2Vha19vbl9sb2NhbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiT2JqZWN0aXZlLUMgR0MgZG9lcyBub3QgYWxsb3cgd2VhayB2YXJpYWJsZXMgb24gdGhlIHN0YWNrIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9nbG9iYWxfY29uc3RydWN0b3IsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImRlY2xhcmF0aW9uIHJlcXVpcmVzIGEgZ2xvYmFsIGNvbnN0cnVjdG9yIiwgMjM0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9nbG9iYWxfZGVzdHJ1Y3RvciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZGVjbGFyYXRpb24gcmVxdWlyZXMgYSBnbG9iYWwgZGVzdHJ1Y3RvciIsIDIzNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fZ251X2lubGluZV9hdHRyaWJ1dGVfcmVxdWlyZXNfaW5saW5lLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICInZ251X2lubGluZScgYXR0cmlidXRlIHJlcXVpcmVzIGZ1bmN0aW9uIHRvIGJlIG1hcmtlZCAnaW5saW5lJywgYXR0cmlidXRlIGlnbm9yZWQiLCAyNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2dudV9udWxsX3B0cl9hcml0aCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiYXJpdGhtZXRpYyBvbiBhIG51bGwgcG9pbnRlciB0cmVhdGVkIGFzIGEgY2FzdCBmcm9tIGludGVnZXIgdG8gcG9pbnRlciBpcyBhIEdOVSBleHRlbnNpb24iLCA0MzIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2d1YXJkZWRfcGFzc19ieV9yZWZlcmVuY2UsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInBhc3NpbmcgdmFyaWFibGUgJTEgYnkgcmVmZXJlbmNlIHJlcXVpcmVzIGhvbGRpbmcgJTAgJXNlbGVjdHsnJTInfCclMicgZXhjbHVzaXZlbHl9MyIsIDYzMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5faWJvdXRsZXRfb2JqZWN0X3R5cGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiVzZWxlY3R7aW5zdGFuY2UgdmFyaWFibGV8cHJvcGVydHl9MiB3aXRoICUwIGF0dHJpYnV0ZSBtdXN0IGJlIGFuIG9iamVjdCB0eXBlIChpbnZhbGlkICUxKSIsIDMxNiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5faWJvdXRsZXRjb2xsZWN0aW9uX3Byb3BlcnR5X2Fzc2lnbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiSUJPdXRsZXRDb2xsZWN0aW9uIHByb3BlcnRpZXMgc2hvdWxkIGJlIGNvcHkvc3Ryb25nIGFuZCBub3QgYXNzaWduIiwgMzE2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9pZGVudGl0eV9maWVsZF9hc3NpZ24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImFzc2lnbmluZyAlc2VsZWN0e2ZpZWxkfGluc3RhbmNlIHZhcmlhYmxlfTAgdG8gaXRzZWxmIiwgNTUyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9pZ25vcmVkX21zX2luaGVyaXRhbmNlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpbmhlcml0YW5jZSBtb2RlbCBpZ25vcmVkIG9uICVzZWxlY3R7cHJpbWFyeSB0ZW1wbGF0ZXxwYXJ0aWFsIHNwZWNpYWxpemF0aW9ufTAiLCAyNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2lsbGVnYWxfY29uc3RhbnRfYXJyYXlfc2l6ZSwgQ0xBU1NfRVhURU5TSU9OLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJzaXplIG9mIHN0YXRpYyBhcnJheSBtdXN0IGJlIGFuIGludGVnZXIgY29uc3RhbnQgZXhwcmVzc2lvbiIsIDUwMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5faW1wY2FzdF9iaXRmaWVsZF9wcmVjaXNpb25fY29uc3RhbnQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImltcGxpY2l0IHRydW5jYXRpb24gZnJvbSAlMiB0byBiaXQtZmllbGQgY2hhbmdlcyB2YWx1ZSBmcm9tICUwIHRvICUxIiwgNTcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNCkKK0RJQUcod2Fybl9pbXBjYXN0X2Jvb2xfdG9fbnVsbF9wb2ludGVyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpbml0aWFsaXphdGlvbiBvZiBwb2ludGVyIG9mIHR5cGUgJTAgdG8gbnVsbCBmcm9tIGEgY29uc3RhbnQgYm9vbGVhbiBleHByZXNzaW9uIiwgNjIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNCkKK0RJQUcod2Fybl9pbXBjYXN0X2NvbXBsZXhfc2NhbGFyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJpbXBsaWNpdCBjb252ZXJzaW9uIGRpc2NhcmRzIGltYWdpbmFyeSBjb21wb25lbnQ6ICUwIHRvICUxIiwgMTMzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjQpCitESUFHKHdhcm5faW1wY2FzdF9kaWZmZXJlbnRfZW51bV90eXBlcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW1wbGljaXQgY29udmVyc2lvbiBmcm9tIGVudW1lcmF0aW9uIHR5cGUgJTAgdG8gZGlmZmVyZW50IGVudW1lcmF0aW9uIHR5cGUgJTEiLCAxOTcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNCkKK0RJQUcod2Fybl9pbXBjYXN0X2RvdWJsZV9wcm9tb3Rpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImltcGxpY2l0IGNvbnZlcnNpb24gaW5jcmVhc2VzIGZsb2F0aW5nLXBvaW50IHByZWNpc2lvbjogJTAgdG8gJTEiLCAxODAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2ltcGNhc3RfZmxvYXRfaW50ZWdlciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiaW1wbGljaXQgY29udmVyc2lvbiB0dXJucyBmbG9hdGluZy1wb2ludCBudW1iZXIgaW50byBpbnRlZ2VyOiAlMCB0byAlMSIsIDIxNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI0KQorRElBRyh3YXJuX2ltcGNhc3RfZmxvYXRfcHJlY2lzaW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJpbXBsaWNpdCBjb252ZXJzaW9uIGxvc2VzIGZsb2F0aW5nLXBvaW50IHByZWNpc2lvbjogJTAgdG8gJTEiLCAxMzMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNCkKK0RJQUcod2Fybl9pbXBjYXN0X2Zsb2F0X3Jlc3VsdF9wcmVjaXNpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImltcGxpY2l0IGNvbnZlcnNpb24gd2hlbiBhc3NpZ25pbmcgY29tcHV0YXRpb24gcmVzdWx0IGxvc2VzIGZsb2F0aW5nLXBvaW50IHByZWNpc2lvbjogJTAgdG8gJTEiLCAxMzMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNCkKK0RJQUcod2Fybl9pbXBjYXN0X2Zsb2F0X3RvX2ludGVnZXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImltcGxpY2l0IGNvbnZlcnNpb24gb2Ygb3V0IG9mIHJhbmdlIHZhbHVlIGZyb20gJTAgdG8gJTEgY2hhbmdlcyB2YWx1ZSBmcm9tICUyIHRvICUzIiwgMjE2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjQpCitESUFHKHdhcm5faW1wY2FzdF9mbG9hdF90b19pbnRlZ2VyX3plcm8sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSAlMCB0byAlMSBjaGFuZ2VzIG5vbi16ZXJvIHZhbHVlIGZyb20gJTIgdG8gJTMiLCAyMTcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNCkKK0RJQUcod2Fybl9pbXBjYXN0X2Zsb2F0aW5nX3BvaW50X3RvX2Jvb2wsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImltcGxpY2l0IGNvbnZlcnNpb24gdHVybnMgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGludG8gYm9vbDogJTAgdG8gJTEiLCAyNzMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2ltcGNhc3RfaW50ZWdlcl82NF8zMiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiaW1wbGljaXQgY29udmVyc2lvbiBsb3NlcyBpbnRlZ2VyIHByZWNpc2lvbjogJTAgdG8gJTEiLCA1NzEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNCkKK0RJQUcod2Fybl9pbXBjYXN0X2ludGVnZXJfcHJlY2lzaW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJpbXBsaWNpdCBjb252ZXJzaW9uIGxvc2VzIGludGVnZXIgcHJlY2lzaW9uOiAlMCB0byAlMSIsIDEzMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI0KQorRElBRyh3YXJuX2ltcGNhc3RfaW50ZWdlcl9wcmVjaXNpb25fY29uc3RhbnQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSAlMiB0byAlMyBjaGFuZ2VzIHZhbHVlIGZyb20gJTAgdG8gJTEiLCAxMjksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNCkKK0RJQUcod2Fybl9pbXBjYXN0X2ludGVnZXJfc2lnbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiaW1wbGljaXQgY29udmVyc2lvbiBjaGFuZ2VzIHNpZ25lZG5lc3M6ICUwIHRvICUxIiwgNTczLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjQpCitESUFHKHdhcm5faW1wY2FzdF9pbnRlZ2VyX3NpZ25fY29uZGl0aW9uYWwsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm9wZXJhbmQgb2YgPyBjaGFuZ2VzIHNpZ25lZG5lc3M6ICUwIHRvICUxIiwgNTczLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjQpCitESUFHKHdhcm5faW1wY2FzdF9saXRlcmFsX2Zsb2F0X3RvX2ludGVnZXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSAlMCB0byAlMSBjaGFuZ2VzIHZhbHVlIGZyb20gJTIgdG8gJTMiLCAzMzQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNCkKK0RJQUcod2Fybl9pbXBjYXN0X251bGxfcG9pbnRlcl90b19pbnRlZ2VyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpbXBsaWNpdCBjb252ZXJzaW9uIG9mICVzZWxlY3R7TlVMTHxudWxscHRyfTAgY29uc3RhbnQgdG8gJTEiLCA0MzAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNCkKK0RJQUcod2Fybl9pbXBjYXN0X29iamVjdGl2ZV9jX2xpdGVyYWxfdG9fYm9vbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW1wbGljaXQgYm9vbGVhbiBjb252ZXJzaW9uIG9mIE9iamVjdGl2ZS1DIG9iamVjdCBsaXRlcmFsIGFsd2F5cyBldmFsdWF0ZXMgdG8gdHJ1ZSIsIDQ0OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI0KQorRElBRyh3YXJuX2ltcGNhc3RfcG9pbnRlcl90b19ib29sLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJhZGRyZXNzIG9mJXNlbGVjdHt8IGZ1bmN0aW9ufCBhcnJheX0wICclMScgd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gJ3RydWUnIiwgNTA0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjQpCitESUFHKHdhcm5faW1wY2FzdF9zdHJpbmdfbGl0ZXJhbF90b19ib29sLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJpbXBsaWNpdCBjb252ZXJzaW9uIHR1cm5zIHN0cmluZyBsaXRlcmFsIGludG8gYm9vbDogJTAgdG8gJTEiLCA2MDMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNCkKK0RJQUcod2Fybl9pbXBjYXN0X3ZlY3Rvcl9zY2FsYXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImltcGxpY2l0IGNvbnZlcnNpb24gdHVybnMgdmVjdG9yIHRvIHNjYWxhcjogJTAgdG8gJTEiLCAxMzMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNCkKK0RJQUcod2Fybl9pbXBsX3JlcXVpcmVkX2Zvcl9jbGFzc19wcm9wZXJ0eSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY2xhc3MgcHJvcGVydHkgJTAgcmVxdWlyZXMgbWV0aG9kICUxIHRvIGJlIGRlZmluZWQgLSB1c2UgQGR5bmFtaWMgb3IgcHJvdmlkZSBhIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzIGNsYXNzIGltcGxlbWVudGF0aW9uIiwgNDU3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9pbXBsX3JlcXVpcmVkX2luX2NhdGVnb3J5X2Zvcl9jbGFzc19wcm9wZXJ0eSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY2xhc3MgcHJvcGVydHkgJTAgcmVxdWlyZXMgbWV0aG9kICUxIHRvIGJlIGRlZmluZWQgLSB1c2UgQGR5bmFtaWMgb3IgcHJvdmlkZSBhIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzIGNhdGVnb3J5IiwgNDU3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9pbXBsZW1lbnRzX25zY29weWluZywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZGVmYXVsdCBhc3NpZ24gYXR0cmlidXRlIG9uIHByb3BlcnR5ICUwIHdoaWNoIGltcGxlbWVudHMgTlNDb3B5aW5nIHByb3RvY29sIGlzIG5vdCBhcHByb3ByaWF0ZSB3aXRoIC1mb2JqYy1nY1stb25seV0iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9pbXBsaWNpdF9hdG9taWNfcHJvcGVydHksIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInByb3BlcnR5IGlzIGFzc3VtZWQgYXRvbWljIGJ5IGRlZmF1bHQiLCAyNzIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2ltcGxpY2l0X2RlY2xfcmVxdWlyZXNfc3lzaGVhZGVyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJkZWNsYXJhdGlvbiBvZiBidWlsdC1pbiBmdW5jdGlvbiAnJTEnIHJlcXVpcmVzIGluY2x1c2lvbiBvZiB0aGUgaGVhZGVyIDwlMD4iLCA2OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5faW1wbGljaXRfZnVuY3Rpb25fZGVjbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiaW1wbGljaXQgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb24gJTAiLCAyNzcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2ltcGxpY2l0bHlfcmV0YWluc19zZWxmLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJibG9jayBpbXBsaWNpdGx5IHJldGFpbnMgJ3NlbGYnOyBleHBsaWNpdGx5IG1lbnRpb24gJ3NlbGYnIHRvIGluZGljYXRlIHRoaXMgaXMgaW50ZW5kZWQgYmVoYXZpb3IiLCAyNzksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2luYWNjZXNzaWJsZV9iYXNlX2NsYXNzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJkaXJlY3QgYmFzZSAlMCBpcyBpbmFjY2Vzc2libGUgZHVlIHRvIGFtYmlndWl0eTolMSIsIDI4MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5faW5jb21wYXRpYmxlX2V4Y2VwdGlvbl9zcGVjcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidGFyZ2V0IGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGlzIG5vdCBzdXBlcnNldCBvZiBzb3VyY2UiLCAyODYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2luY29tcGF0aWJsZV9xdWFsaWZpZWRfaWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiVzZWxlY3R7JWRpZmZ7YXNzaWduaW5nIHRvICQgZnJvbSBpbmNvbXBhdGlibGUgdHlwZSAkfGFzc2lnbmluZyB0byB0eXBlIGZyb20gaW5jb21wYXRpYmxlIHR5cGV9MCwxfCVkaWZme3Bhc3NpbmcgJCB0byBwYXJhbWV0ZXIgb2YgaW5jb21wYXRpYmxlIHR5cGUgJHxwYXNzaW5nIHR5cGUgdG8gcGFyYW1ldGVyIG9mIGluY29tcGF0aWJsZSB0eXBlfTAsMXwlZGlmZntyZXR1cm5pbmcgJCBmcm9tIGEgZnVuY3Rpb24gd2l0aCBpbmNvbXBhdGlibGUgcmVzdWx0IHR5cGUgJHxyZXR1cm5pbmcgdHlwZSBmcm9tIGEgZnVuY3Rpb24gd2l0aCBpbmNvbXBhdGlibGUgcmVzdWx0IHR5cGV9MCwxfCVkaWZme2NvbnZlcnRpbmcgJCB0byBpbmNvbXBhdGlibGUgdHlwZSAkfGNvbnZlcnRpbmcgdHlwZSB0byBpbmNvbXBhdGlibGUgdHlwZX0wLDF8JWRpZmZ7aW5pdGlhbGl6aW5nICQgd2l0aCBhbiBleHByZXNzaW9uIG9mIGluY29tcGF0aWJsZSB0eXBlICR8aW5pdGlhbGl6aW5nIHR5cGUgd2l0aCBhbiBleHByZXNzaW9uIG9mIGluY29tcGF0aWJsZSB0eXBlfTAsMXwlZGlmZntzZW5kaW5nICQgdG8gcGFyYW1ldGVyIG9mIGluY29tcGF0aWJsZSB0eXBlICR8c2VuZGluZyB0eXBlIHRvIHBhcmFtZXRlciBvZiBpbmNvbXBhdGlibGUgdHlwZX0wLDF8JWRpZmZ7Y2FzdGluZyAkIHRvIGluY29tcGF0aWJsZSB0eXBlICR8Y2FzdGluZyB0eXBlIHRvIGluY29tcGF0aWJsZSB0eXBlfTAsMX0yIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5faW5jb21wYXRpYmxlX3ZlY3RvcnMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImluY29tcGF0aWJsZSB2ZWN0b3IgdHlwZXMgJXNlbGVjdHslZGlmZnthc3NpZ25pbmcgdG8gJCBmcm9tICR8YXNzaWduaW5nIHRvIGRpZmZlcmVudCB0eXBlc30wLDF8JWRpZmZ7cGFzc2luZyAkIHRvIHBhcmFtZXRlciBvZiB0eXBlICR8cGFzc2luZyB0byBwYXJhbWV0ZXIgb2YgZGlmZmVyZW50IHR5cGV9MCwxfCVkaWZme3JldHVybmluZyAkIGZyb20gYSBmdW5jdGlvbiB3aXRoIHJlc3VsdCB0eXBlICR8cmV0dXJuaW5nIGZyb20gZnVuY3Rpb24gd2l0aCBkaWZmZXJlbnQgcmV0dXJuIHR5cGV9MCwxfCVkaWZme2NvbnZlcnRpbmcgJCB0byB0eXBlICR8Y29udmVydGluZyBiZXR3ZWVuIHR5cGVzfTAsMXwlZGlmZntpbml0aWFsaXppbmcgJCB3aXRoIGFuIGV4cHJlc3Npb24gb2YgdHlwZSAkfGluaXRpYWxpemluZyB3aXRoIGV4cHJlc3Npb24gb2YgZGlmZmVyZW50IHR5cGV9MCwxfCVkaWZme3NlbmRpbmcgJCB0byBwYXJhbWV0ZXIgb2YgdHlwZSAkfHNlbmRpbmcgdG8gcGFyYW1ldGVyIG9mIGRpZmZlcmVudCB0eXBlfTAsMXwlZGlmZntjYXN0aW5nICQgdG8gdHlwZSAkfGNhc3RpbmcgYmV0d2VlbiB0eXBlc30wLDF9MiIsIDcwOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5faW5jb21wbGV0ZV9lbmNvZGVkX3R5cGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImVuY29kaW5nIG9mICUwIHR5cGUgaXMgaW5jb21wbGV0ZSBiZWNhdXNlICUxIGNvbXBvbmVudCBoYXMgdW5rbm93biBlbmNvZGluZyIsIDE5MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5faW5jcmVtZW50X2Jvb2wsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImluY3JlbWVudGluZyBleHByZXNzaW9uIG9mIHR5cGUgYm9vbCBpcyBkZXByZWNhdGVkIGFuZCBpbmNvbXBhdGlibGUgd2l0aCBDKysxNyIsIDE1OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI3KQorRElBRyh3YXJuX2luZGVwZW5kZW50Y2xhc3NfYXR0cmlidXRlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICInb2JqY19pbmRlcGVuZGVudF9jbGFzcycgYXR0cmlidXRlIG1heSBiZSBwdXQgb24gYSB0eXBlZGVmIG9ubHk7IGF0dHJpYnV0ZSBpcyBpZ25vcmVkIiwgNSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5faW5kaXJlY3Rpb25fdGhyb3VnaF9udWxsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpbmRpcmVjdGlvbiBvZiBub24tdm9sYXRpbGUgbnVsbCBwb2ludGVyIHdpbGwgYmUgZGVsZXRlZCwgbm90IHRyYXAiLCA0MzEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2luZmluaXRlX3JlY3Vyc2l2ZV9mdW5jdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiYWxsIHBhdGhzIHRocm91Z2ggdGhpcyBmdW5jdGlvbiB3aWxsIGNhbGwgaXRzZWxmIiwgMzAxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9pbml0X2xpc3RfY29uc3RhbnRfbmFycm93aW5nLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJjb25zdGFudCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byAlMCB3aGljaCBjYW5ub3QgYmUgbmFycm93ZWQgdG8gdHlwZSAlMSBpbiBDKysxMSIsIDgxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9pbml0X2xpc3RfdHlwZV9uYXJyb3dpbmcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInR5cGUgJTAgY2Fubm90IGJlIG5hcnJvd2VkIHRvICUxIGluIGluaXRpYWxpemVyIGxpc3QgaW4gQysrMTEiLCA4MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5faW5pdF9saXN0X3ZhcmlhYmxlX25hcnJvd2luZywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAibm9uLWNvbnN0YW50LWV4cHJlc3Npb24gY2Fubm90IGJlIG5hcnJvd2VkIGZyb20gdHlwZSAlMCB0byAlMSBpbiBpbml0aWFsaXplciBsaXN0IGluIEMrKzExIiwgODEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2luaXRfcHRyX21lbWJlcl90b19wYXJhbWV0ZXJfYWRkciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW5pdGlhbGl6aW5nIHBvaW50ZXIgbWVtYmVyICUwIHdpdGggdGhlIHN0YWNrIGFkZHJlc3Mgb2YgcGFyYW1ldGVyICUxIiwgMTQ0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9pbml0aWFsaXplcl9vdXRfb2Zfb3JkZXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiVzZWxlY3R7ZmllbGR8YmFzZSBjbGFzc30wICUxIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgJXNlbGVjdHtmaWVsZHxiYXNlfTIgJTMiLCA1MzgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2luaXRpYWxpemVyX292ZXJyaWRlcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW5pdGlhbGl6ZXIgb3ZlcnJpZGVzIHByaW9yIGluaXRpYWxpemF0aW9uIG9mIHRoaXMgc3Vib2JqZWN0IiwgMzAzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9pbmxpbmVfbmFtZXNwYWNlX3Jlb3BlbmVkX25vbmlubGluZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW5saW5lIG5hbWVzcGFjZSByZW9wZW5lZCBhcyBhIG5vbi1pbmxpbmUgbmFtZXNwYWNlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5faW5zdF9tZXRob2Rfbm90X2ZvdW5kLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpbnN0YW5jZSBtZXRob2QgJW9iamNpbnN0YW5jZTAgbm90IGZvdW5kIChyZXR1cm4gdHlwZSBkZWZhdWx0cyB0byAnaWQnKSIsIDQ1MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5faW5zdGFuY2VfbWV0aG9kX25vdF9mb3VuZF93aXRoX3R5cG8sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImluc3RhbmNlIG1ldGhvZCAlb2JqY2luc3RhbmNlMCBub3QgZm91bmQgKHJldHVybiB0eXBlIGRlZmF1bHRzIHRvICdpZCcpOyBkaWQgeW91IG1lYW4gJW9iamNpbnN0YW5jZTI/IiwgNDUxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9pbnN0YW5jZV9tZXRob2Rfb25fY2xhc3NfZm91bmQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImluc3RhbmNlIG1ldGhvZCAlMCBmb3VuZCBpbnN0ZWFkIG9mIGNsYXNzIG1ldGhvZCAlMSIsIDQ1MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5faW50X3RvX3BvaW50ZXJfY2FzdCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY2FzdCB0byAlMSBmcm9tIHNtYWxsZXIgaW50ZWdlciB0eXBlICUwIiwgMzExLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9pbnRfdG9fdm9pZF9wb2ludGVyX2Nhc3QsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNhc3QgdG8gJTEgZnJvbSBzbWFsbGVyIGludGVnZXIgdHlwZSAlMCIsIDMxMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5faW50ZXJuYWxfbGlua2FnZV9sb2NhbF9zdG9yYWdlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICInaW50ZXJuYWxfbGlua2FnZScgYXR0cmlidXRlIG9uIGEgbm9uLXN0YXRpYyBsb2NhbCB2YXJpYWJsZSBpcyBpZ25vcmVkIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9pbnZhbGlkX2FzbV9jYXN0X2x2YWx1ZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW52YWxpZCB1c2Ugb2YgYSBjYXN0IGluIGFuIGlubGluZSBhc20gY29udGV4dCByZXF1aXJpbmcgYW4gbC12YWx1ZTogYWNjZXB0ZWQgZHVlIHRvIC1maGVpbm91cy1nbnUtZXh0ZW5zaW9ucywgYnV0IGNsYW5nIG1heSByZW1vdmUgc3VwcG9ydCBmb3IgdGhpcyBpbiB0aGUgZnV0dXJlIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDEyKQorRElBRyh3YXJuX2ludmFsaWRfY2FwYWJpbGl0eV9uYW1lLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJpbnZhbGlkIGNhcGFiaWxpdHkgbmFtZSAnJTAnOyBjYXBhYmlsaXR5IG5hbWUgbXVzdCBiZSAnbXV0ZXgnIG9yICdyb2xlJyIsIDYyOCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5faW52YWxpZF9pbml0aWFsaXplcl9mcm9tX3N5c3RlbV9oZWFkZXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImludmFsaWQgY29uc3RydWN0b3IgZm9ybSBjbGFzcyBpbiBzeXN0ZW0gaGVhZGVyLCBzaG91bGQgbm90IGJlIGV4cGxpY2l0IiwgMzE3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9pdmFyX3VzZV9oaWRkZW4sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImxvY2FsIGRlY2xhcmF0aW9uIG9mICUwIGhpZGVzIGluc3RhbmNlIHZhcmlhYmxlIiwgNTYzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9pdmFyc19pbl9pbnRlcmZhY2UsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImRlY2xhcmF0aW9uIG9mIGluc3RhbmNlIHZhcmlhYmxlcyBpbiB0aGUgaW50ZXJmYWNlIGlzIGRlcHJlY2F0ZWQiLCA0NDYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2p1bXBfb3V0X29mX3NlaF9maW5hbGx5LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJqdW1wIG91dCBvZiBfX2ZpbmFsbHkgYmxvY2sgaGFzIHVuZGVmaW5lZCBiZWhhdmlvciIsIDMyNywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fa2Vybl9pc19pbmxpbmUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImlnbm9yZWQgJ2lubGluZScgYXR0cmlidXRlIG9uIGtlcm5lbCBmdW5jdGlvbiAlMCIsIDE0MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fa2Vybl9pc19tZXRob2QsIENMQVNTX0VYVEVOU0lPTiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAia2VybmVsIGZ1bmN0aW9uICUwIGlzIGEgbWVtYmVyIGZ1bmN0aW9uOyB0aGlzIG1heSBub3QgYmUgYWNjZXB0ZWQgYnkgbnZjYyIsIDE0MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbG9ja19leGNsdXNpdmVfYW5kX3NoYXJlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJTAgJyUxJyBpcyBhY3F1aXJlZCBleGNsdXNpdmVseSBhbmQgc2hhcmVkIGluIHRoZSBzYW1lIHNjb3BlIiwgNjI3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9sb2NrX3NvbWVfcHJlZGVjZXNzb3JzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlMCAnJTEnIGlzIG5vdCBoZWxkIG9uIGV2ZXJ5IHBhdGggdGhyb3VnaCBoZXJlIiwgNjI3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9sb2dpY2FsX2FuZF9pbl9sb2dpY2FsX29yLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICInJiYnIHdpdGhpbiAnfHwnIiwgMzM4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9sb2dpY2FsX2luc3RlYWRfb2ZfYml0d2lzZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidXNlIG9mIGxvZ2ljYWwgJyUwJyB3aXRoIGNvbnN0YW50IG9wZXJhbmQiLCAxMzAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2xvZ2ljYWxfbm90X29uX2xoc19vZl9jaGVjaywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibG9naWNhbCBub3QgaXMgb25seSBhcHBsaWVkIHRvIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGlzICVzZWxlY3R7Y29tcGFyaXNvbnxiaXR3aXNlIG9wZXJhdG9yfTAiLCAzMzcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2xvb3BfY3RybF9iaW5kc190b19pbm5lciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJyUwJyBpcyBib3VuZCB0byBjdXJyZW50IGxvb3AsIEdDQyBiaW5kcyBpdCB0byB0aGUgZW5jbG9zaW5nIGxvb3AiLCAyMzMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX2xvb3Bfc3RhdGVfbWlzbWF0Y2gsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInN0YXRlIG9mIHZhcmlhYmxlICclMCcgbXVzdCBtYXRjaCBhdCB0aGUgZW50cnkgYW5kIGV4aXQgb2YgbG9vcCIsIDEzMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbWFpbl9vbmVfYXJnLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJvbmx5IG9uZSBwYXJhbWV0ZXIgb24gJ21haW4nIGRlY2xhcmF0aW9uIiwgMzQyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9tYWluX3JlZGVmaW5lZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidmFyaWFibGUgbmFtZWQgJ21haW4nIHdpdGggZXh0ZXJuYWwgbGlua2FnZSBoYXMgdW5kZWZpbmVkIGJlaGF2aW9yIiwgMzQyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9tYWluX3JldHVybnNfYm9vbF9saXRlcmFsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJib29sIGxpdGVyYWwgcmV0dXJuZWQgZnJvbSAnbWFpbiciLCAzNDIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX21heF91bnNpZ25lZF96ZXJvLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ0YWtpbmcgdGhlIG1heCBvZiAlc2VsZWN0e2EgdmFsdWUgYW5kIHVuc2lnbmVkIHplcm98dW5zaWduZWQgemVybyBhbmQgYSB2YWx1ZX0wIGlzIGFsd2F5cyBlcXVhbCB0byB0aGUgb3RoZXIgdmFsdWUiLCAzNDYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX21heWJlX2ZhbGxvZmZfbm9udm9pZF9jb3JvdXRpbmUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNvbnRyb2wgbWF5IHJlYWNoIGVuZCBvZiBjb3JvdXRpbmU7IHdoaWNoIGlzIHVuZGVmaW5lZCBiZWhhdmlvciBiZWNhdXNlIHRoZSBwcm9taXNlIHR5cGUgJTAgZG9lcyBub3QgZGVjbGFyZSAncmV0dXJuX3ZvaWQoKSciLCA1NDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX21heWJlX2ZhbGxvZmZfbm9udm9pZF9mdW5jdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY29udHJvbCBtYXkgcmVhY2ggZW5kIG9mIG5vbi12b2lkIGZ1bmN0aW9uIiwgNTQ0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9tYXliZV9mYWxsb2ZmX25vbnZvaWRfbGFtYmRhLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJjb250cm9sIG1heSByZWFjaCBlbmQgb2Ygbm9uLXZvaWQgbGFtYmRhIiwgNTQ0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMykKK0RJQUcod2Fybl9tYXliZV91bmluaXRfdmFyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ2YXJpYWJsZSAlMCBtYXkgYmUgdW5pbml0aWFsaXplZCB3aGVuICVzZWxlY3R7dXNlZCBoZXJlfGNhcHR1cmVkIGJ5IGJsb2NrfTEiLCAxMjcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX21heW5vdF9yZXNwb25kLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMCBtYXkgbm90IHJlc3BvbmQgdG8gJTEiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9tZW1iZXJfZXh0cmFfcXVhbGlmaWNhdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZXh0cmEgcXVhbGlmaWNhdGlvbiBvbiBtZW1iZXIgJTAiLCAzNjMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX21lbWNweV9jaGtfb3ZlcmZsb3csIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiUwIHdpbGwgYWx3YXlzIG92ZXJmbG93IGRlc3RpbmF0aW9uIGJ1ZmZlciIsIDY3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9tZW1zaXplX2NvbXBhcmlzb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInNpemUgYXJndW1lbnQgaW4gJTAgY2FsbCBpcyBhIGNvbXBhcmlzb24iLCAzNDcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX21lc3NhZ2luZ191bnF1YWxpZmllZF9pZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAibWVzc2FnaW5nIHVucXVhbGlmaWVkIGlkIiwgNDUwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9taXBzX2ludGVycnVwdF9hdHRyaWJ1dGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIk1JUFMgJ2ludGVycnVwdCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnMgdGhhdCBoYXZlICVzZWxlY3R7bm8gcGFyYW1ldGVyc3xhICd2b2lkJyByZXR1cm4gdHlwZX0wIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9taXNtYXRjaGVkX2F2YWlsYWJpbGl0eSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYXZhaWxhYmlsaXR5IGRvZXMgbm90IG1hdGNoIHByZXZpb3VzIGRlY2xhcmF0aW9uIiwgNTAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX21pc21hdGNoZWRfYXZhaWxhYmlsaXR5X292ZXJyaWRlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlc2VsZWN0e3xvdmVycmlkaW5nIH00bWV0aG9kICVzZWxlY3R7aW50cm9kdWNlZCBhZnRlcnxkZXByZWNhdGVkIGJlZm9yZXxvYnNvbGV0ZWQgYmVmb3JlfTAgJXNlbGVjdHt0aGUgcHJvdG9jb2wgbWV0aG9kIGl0IGltcGxlbWVudHN8b3ZlcnJpZGRlbiBtZXRob2R9NCBvbiAlMSAoJTIgdnMuICUzKSIsIDUwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9taXNtYXRjaGVkX2F2YWlsYWJpbGl0eV9vdmVycmlkZV91bmF2YWlsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlc2VsZWN0e3xvdmVycmlkaW5nIH0xbWV0aG9kIGNhbm5vdCBiZSB1bmF2YWlsYWJsZSBvbiAlMCB3aGVuICVzZWxlY3R7dGhlIHByb3RvY29sIG1ldGhvZCBpdCBpbXBsZW1lbnRzfGl0cyBvdmVycmlkZGVuIG1ldGhvZH0xIGlzIGF2YWlsYWJsZSIsIDUwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9taXNtYXRjaGVkX2RlbGV0ZV9uZXcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIidkZWxldGUlc2VsZWN0e3xbXX0wJyBhcHBsaWVkIHRvIGEgcG9pbnRlciB0aGF0IHdhcyBhbGxvY2F0ZWQgd2l0aCAnbmV3JXNlbGVjdHtbXXx9MCc7IGRpZCB5b3UgbWVhbiAnZGVsZXRlJXNlbGVjdHtbXXx9MCc/IiwgMzc4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9taXNtYXRjaGVkX251bGxhYmlsaXR5X2F0dHIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm51bGxhYmlsaXR5IHNwZWNpZmllciAlMCBjb25mbGljdHMgd2l0aCBleGlzdGluZyBzcGVjaWZpZXIgJTEiLCA0MzMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxOSkKK0RJQUcod2Fybl9taXNtYXRjaGVkX3NlY3Rpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInNlY3Rpb24gZG9lcyBub3QgbWF0Y2ggcHJldmlvdXMgZGVjbGFyYXRpb24iLCA1NDgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX21pc3NpbmdfYnJhY2VzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJzdWdnZXN0IGJyYWNlcyBhcm91bmQgaW5pdGlhbGl6YXRpb24gb2Ygc3Vib2JqZWN0IiwgMzgyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9taXNzaW5nX2Nhc2UsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiVwbHVyYWx7MTplbnVtZXJhdGlvbiB2YWx1ZSAlMSBub3QgaGFuZGxlZCBpbiBzd2l0Y2h8MjplbnVtZXJhdGlvbiB2YWx1ZXMgJTEgYW5kICUyIG5vdCBoYW5kbGVkIGluIHN3aXRjaHwzOmVudW1lcmF0aW9uIHZhbHVlcyAlMSwgJTIsIGFuZCAlMyBub3QgaGFuZGxlZCBpbiBzd2l0Y2h8OiUwIGVudW1lcmF0aW9uIHZhbHVlcyBub3QgaGFuZGxlZCBpbiBzd2l0Y2g6ICUxLCAlMiwgJTMuLi59MCIsIDYwOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbWlzc2luZ19jYXNlX2Zvcl9jb25kaXRpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm5vIGNhc2UgbWF0Y2hpbmcgY29uc3RhbnQgc3dpdGNoIGNvbmRpdGlvbiAnJTAnIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbWlzc2luZ19leHBsaWNpdF9zeW50aGVzaXMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImF1dG8gcHJvcGVydHkgc3ludGhlc2lzIGlzIHN5bnRoZXNpemluZyBwcm9wZXJ0eSBub3QgZXhwbGljaXRseSBzeW50aGVzaXplZCIsIDQ1MiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbWlzc2luZ19maWVsZF9pbml0aWFsaXplcnMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm1pc3NpbmcgZmllbGQgJTAgaW5pdGlhbGl6ZXIiLCAzODUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX21pc3NpbmdfZm9ybWF0X3N0cmluZywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZm9ybWF0IHN0cmluZyBtaXNzaW5nIiwgMjE5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjgpCitESUFHKHdhcm5fbWlzc2luZ19tZXRob2RfcmV0dXJuX3R5cGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm1ldGhvZCBoYXMgbm8gcmV0dXJuIHR5cGUgc3BlY2lmaWVkOyBkZWZhdWx0cyB0byAnaWQnIiwgMzg4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9taXNzaW5nX3Byb3RvdHlwZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAibm8gcHJldmlvdXMgcHJvdG90eXBlIGZvciBmdW5jdGlvbiAlMCIsIDM5MiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbWlzc2luZ19zZW50aW5lbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibWlzc2luZyBzZW50aW5lbCBpbiAlc2VsZWN0e2Z1bmN0aW9uIGNhbGx8bWV0aG9kIGRpc3BhdGNofGJsb2NrIGNhbGx9MCIsIDU1NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbWlzc2luZ192YXJpYWJsZV9kZWNsYXJhdGlvbnMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm5vIHByZXZpb3VzIGV4dGVybiBkZWNsYXJhdGlvbiBmb3Igbm9uLXN0YXRpYyB2YXJpYWJsZSAlMCIsIDM5NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbWl4ZWRfc2lnbl9jb21wYXJpc29uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJjb21wYXJpc29uIG9mIGludGVnZXJzIG9mIGRpZmZlcmVudCBzaWduczogJTAgYW5kICUxIiwgNTcyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9tb2RpZnlpbmdfc2hhZG93aW5nX2RlY2wsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm1vZGlmeWluZyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgJTAgdGhhdCBzaGFkb3dzIGEgZmllbGQgb2YgJTEiLCA1NjIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX211bHRpcGxlX21ldGhvZF9kZWNsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJtdWx0aXBsZSBtZXRob2RzIG5hbWVkICUwIGZvdW5kIiwgNDU0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9tdWx0aXBsZV9zZWxlY3RvcnMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInNldmVyYWwgbWV0aG9kcyB3aXRoIHNlbGVjdG9yICUwIG9mIG1pc21hdGNoZWQgdHlwZXMgYXJlIGZvdW5kIGZvciB0aGUgQHNlbGVjdG9yIGV4cHJlc3Npb24iLCA1NTAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX25hbWVzcGFjZV9tZW1iZXJfZXh0cmFfcXVhbGlmaWNhdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZXh0cmEgcXVhbGlmaWNhdGlvbiBvbiBtZW1iZXIgJTAiLCAyMDgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX25lb25fdmVjdG9yX2luaXRpYWxpemVyX25vbl9wb3J0YWJsZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidmVjdG9yIGluaXRpYWxpemVycyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBORU9OIGludHJpbnNpY3MgaW4gYmlnIGVuZGlhbiBtb2RlIiwgNDI1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9ub19hdXRvc3ludGhlc2lzX3Byb3BlcnR5LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJhdXRvIHByb3BlcnR5IHN5bnRoZXNpcyB3aWxsIG5vdCBzeW50aGVzaXplIHByb3BlcnR5ICUwIGJlY2F1c2UgaXQgaXMgJ3JlYWR3cml0ZScgYnV0IGl0IHdpbGwgYmUgc3ludGhlc2l6ZWQgJ3JlYWRvbmx5JyB2aWEgYW5vdGhlciBwcm9wZXJ0eSIsIDQ2MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbm9fYXV0b3N5bnRoZXNpc19zaGFyZWRfaXZhcl9wcm9wZXJ0eSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYXV0byBwcm9wZXJ0eSBzeW50aGVzaXMgd2lsbCBub3Qgc3ludGhlc2l6ZSBwcm9wZXJ0eSAlMCBiZWNhdXNlIGl0IGNhbm5vdCBzaGFyZSBhbiBpdmFyIHdpdGggYW5vdGhlciBzeW50aGVzaXplZCBwcm9wZXJ0eSIsIDQ2MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbm9fY29uc3RydWN0b3JfZm9yX3JlZmNvbnN0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlc2VsZWN0e3N0cnVjdHxpbnRlcmZhY2V8dW5pb258Y2xhc3N8ZW51bX0wICUxIGRvZXMgbm90IGRlY2xhcmUgYW55IGNvbnN0cnVjdG9yIHRvIGluaXRpYWxpemUgaXRzIG5vbi1tb2RpZmlhYmxlIG1lbWJlcnMiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9ub191bmRlcmx5aW5nX3R5cGVfc3BlY2lmaWVkX2Zvcl9lbnVtX2JpdGZpZWxkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJlbnVtcyBpbiB0aGUgTWljcm9zb2Z0IEFCSSBhcmUgc2lnbmVkIGludGVnZXJzIGJ5IGRlZmF1bHQ7IGNvbnNpZGVyIGdpdmluZyB0aGUgZW51bSAlMCBhbiB1bnNpZ25lZCB1bmRlcmx5aW5nIHR5cGUgdG8gbWFrZSB0aGlzIGNvZGUgcG9ydGFibGUiLCA1NzUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX25vX3VubG9jaywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJTAgJyUxJyBpcyBzdGlsbCBoZWxkIGF0IHRoZSBlbmQgb2YgZnVuY3Rpb24iLCA2MjcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX25vY2ZfY2hlY2tfYXR0cmlidXRlX2lnbm9yZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIidub2NmX2NoZWNrJyBhdHRyaWJ1dGUgaWdub3JlZDsgdXNlIC1mY2YtcHJvdGVjdGlvbiB0byBlbmFibGUgdGhlIGF0dHJpYnV0ZSIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbm9uX2NvbnRyYXZhcmlhbnRfb3ZlcnJpZGluZ19wYXJhbV90eXBlcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiY29uZmxpY3RpbmcgcGFyYW1ldGVyIHR5cGVzIGluIGRlY2xhcmF0aW9uIG9mICUwOiAlMSB2cyAlMiIsIDQ4OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbm9uX2NvbnRyYXZhcmlhbnRfcGFyYW1fdHlwZXMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImNvbmZsaWN0aW5nIHBhcmFtZXRlciB0eXBlcyBpbiBpbXBsZW1lbnRhdGlvbiBvZiAlMDogJTEgdnMgJTIiLCAzNDgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX25vbl9jb3ZhcmlhbnRfb3ZlcnJpZGluZ19yZXRfdHlwZXMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImNvbmZsaWN0aW5nIHJldHVybiB0eXBlIGluIGRlY2xhcmF0aW9uIG9mICUwOiAlMSB2cyAlMiIsIDQ4OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbm9uX2NvdmFyaWFudF9yZXRfdHlwZXMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImNvbmZsaWN0aW5nIHJldHVybiB0eXBlIGluIGltcGxlbWVudGF0aW9uIG9mICUwOiAlMSB2cyAlMiIsIDM0OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbm9uX2xpdGVyYWxfbnVsbF9wb2ludGVyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleHByZXNzaW9uIHdoaWNoIGV2YWx1YXRlcyB0byB6ZXJvIHRyZWF0ZWQgYXMgYSBudWxsIHBvaW50ZXIgY29uc3RhbnQgb2YgdHlwZSAlMCIsIDQxNiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI0KQorRElBRyh3YXJuX25vbl9wb2RfdmFyYXJnX3dpdGhfZm9ybWF0X3N0cmluZywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBwYXNzICVzZWxlY3R7bm9uLVBPRHxub24tdHJpdmlhbH0wIG9iamVjdCBvZiB0eXBlICUxIHRvIHZhcmlhZGljICVzZWxlY3R7ZnVuY3Rpb258YmxvY2t8bWV0aG9kfGNvbnN0cnVjdG9yfTI7IGV4cGVjdGVkIHR5cGUgZnJvbSBmb3JtYXQgc3RyaW5nIHdhcyAlMyIsIDQxOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbm9uX3ZpcnR1YWxfZHRvciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJTAgaGFzIHZpcnR1YWwgZnVuY3Rpb25zIGJ1dCBub24tdmlydHVhbCBkZXN0cnVjdG9yIiwgNDIwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9ub25udWxsX2V4cHJfY29tcGFyZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY29tcGFyaXNvbiBvZiBub25udWxsICVzZWxlY3R7ZnVuY3Rpb24gY2FsbHxwYXJhbWV0ZXJ9MCAnJTEnICVzZWxlY3R7bm90IHx9MmVxdWFsIHRvIGEgbnVsbCBwb2ludGVyIGlzICclc2VsZWN0e3RydWV8ZmFsc2V9Micgb24gZmlyc3QgZW5jb3VudGVyIiwgNjIwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9ub3JldHVybl9mdW5jdGlvbl9oYXNfcmV0dXJuX2V4cHIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImZ1bmN0aW9uICUwIGRlY2xhcmVkICdub3JldHVybicgc2hvdWxkIG5vdCByZXR1cm4iLCAzMTksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX25vdF9hX2RveHlnZW5fdHJhaWxpbmdfbWVtYmVyX2NvbW1lbnQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm5vdCBhIERveHlnZW4gdHJhaWxpbmcgY29tbWVudCIsIDE3NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI1KQorRElBRyh3YXJuX25vdF9jb21wb3VuZF9hc3NpZ24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVzZSBvZiB1bmFyeSBvcGVyYXRvciB0aGF0IG1heSBiZSBpbnRlbmRlZCBhcyBjb21wb3VuZCBhc3NpZ25tZW50ICglMD0pIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbm90X2Vub3VnaF9hcmd1bWVudCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibm90IGVub3VnaCB2YXJpYWJsZSBhcmd1bWVudHMgaW4gJTAgZGVjbGFyYXRpb24gdG8gZml0IGEgc2VudGluZWwiLCA1NTUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX25vdF9pbl9lbnVtLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJjYXNlIHZhbHVlIG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUgJTAiLCA2MDksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX25vdF9pbl9lbnVtX2Fzc2lnbm1lbnQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImludGVnZXIgY29uc3RhbnQgbm90IGluIHJhbmdlIG9mIGVudW1lcmF0ZWQgdHlwZSAlMCIsIDM4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9ucG90X21zX3N0cnVjdCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm1zX3N0cnVjdCBtYXkgbm90IHByb2R1Y2UgTWljcm9zb2Z0LWNvbXBhdGlibGUgbGF5b3V0cyB3aXRoIGZ1bmRhbWVudGFsIGRhdGEgdHlwZXMgd2l0aCBzaXplcyB0aGF0IGFyZW4ndCBhIHBvd2VyIG9mIHR3byIsIDI4OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbnNfYXR0cmlidXRlX3dyb25nX3BhcmFtZXRlcl90eXBlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMCBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvICVzZWxlY3R7T2JqZWN0aXZlLUMgb2JqZWN0fHBvaW50ZXJ8cG9pbnRlci10by1DRi1wb2ludGVyfTEgcGFyYW1ldGVycyIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbnNfYXR0cmlidXRlX3dyb25nX3JldHVybl90eXBlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMCBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvICVzZWxlY3R7ZnVuY3Rpb25zfG1ldGhvZHN8cHJvcGVydGllc30xIHRoYXQgcmV0dXJuICVzZWxlY3R7YW4gT2JqZWN0aXZlLUMgb2JqZWN0fGEgcG9pbnRlcnxhIG5vbi1yZXRhaW5hYmxlIHBvaW50ZXJ9MiIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbnNjb25zdW1lZF9hdHRyaWJ1dGVfbWlzbWF0Y2gsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm92ZXJyaWRpbmcgbWV0aG9kIGhhcyBtaXNtYXRjaGVkIG5zX2NvbnN1bWVkIGF0dHJpYnV0ZSBvbiBpdHMgcGFyYW1ldGVyIiwgNDI2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9uc29iamVjdF9hdHRyaWJ1dGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIidOU09iamVjdCcgYXR0cmlidXRlIG1heSBiZSBwdXQgb24gYSB0eXBlZGVmIG9ubHk7IGF0dHJpYnV0ZSBpcyBpZ25vcmVkIiwgNiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbnNyZXR1cm5zX3JldGFpbmVkX2F0dHJpYnV0ZV9taXNtYXRjaCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAib3ZlcnJpZGluZyBtZXRob2QgaGFzIG1pc21hdGNoZWQgbnNfcmV0dXJuc18lc2VsZWN0e25vdF9yZXRhaW5lZHxyZXRhaW5lZH0wIGF0dHJpYnV0ZXMiLCA0MjcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX251bGxfYXJnLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJudWxsIHBhc3NlZCB0byBhIGNhbGxlZSB0aGF0IHJlcXVpcmVzIGEgbm9uLW51bGwgYXJndW1lbnQiLCA0MjEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyOCkKK0RJQUcod2Fybl9udWxsX2luX2FyaXRobWV0aWNfb3BlcmF0aW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1c2Ugb2YgTlVMTCBpbiBhcml0aG1ldGljIG9wZXJhdGlvbiIsIDQyOCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fbnVsbF9pbl9jb21wYXJpc29uX29wZXJhdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY29tcGFyaXNvbiBiZXR3ZWVuIE5VTEwgYW5kIG5vbi1wb2ludGVyICVzZWxlY3R7KCUxIGFuZCBOVUxMKXwoTlVMTCBhbmQgJTEpfTAiLCA0MjgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX251bGxfcG9pbnRlcl9jb21wYXJlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJjb21wYXJpc29uIG9mICVzZWxlY3R7YWRkcmVzcyBvZnxmdW5jdGlvbnxhcnJheX0wICclMScgJXNlbGVjdHtub3QgfH0yZXF1YWwgdG8gYSBudWxsIHBvaW50ZXIgaXMgYWx3YXlzICVzZWxlY3R7dHJ1ZXxmYWxzZX0yIiwgNjIwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9udWxsX3Jlc2V0dGFibGVfc2V0dGVyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJzeW50aGVzaXplZCBzZXR0ZXIgJTAgZm9yIG51bGxfcmVzZXR0YWJsZSBwcm9wZXJ0eSAlMSBkb2VzIG5vdCBoYW5kbGUgbmlsIiwgNDMzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTkpCitESUFHKHdhcm5fbnVsbF9yZXQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm51bGwgcmV0dXJuZWQgZnJvbSAlc2VsZWN0e2Z1bmN0aW9ufG1ldGhvZH0wIHRoYXQgcmVxdWlyZXMgYSBub24tbnVsbCByZXR1cm4gdmFsdWUiLCA0MjEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyOCkKK0RJQUcod2Fybl9udWxsYWJpbGl0eV9kZWNsc3BlYywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm51bGxhYmlsaXR5IHNwZWNpZmllciAlMCBjYW5ub3QgYmUgYXBwbGllZCB0byBub24tcG9pbnRlciB0eXBlICUxOyBkaWQgeW91IG1lYW4gdG8gYXBwbHkgdGhlIHNwZWNpZmllciB0byB0aGUgJXNlbGVjdHtwb2ludGVyfGJsb2NrIHBvaW50ZXJ8bWVtYmVyIHBvaW50ZXJ8ZnVuY3Rpb24gcG9pbnRlcnxtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcn0yPyIsIDQzNiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDE5KQorRElBRyh3YXJuX251bGxhYmlsaXR5X2luZmVycmVkX29uX25lc3RlZF90eXBlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpbmZlcnJpbmcgJ19Ob25udWxsJyBmb3IgcG9pbnRlciB0eXBlIHdpdGhpbiAlc2VsZWN0e2FycmF5fHJlZmVyZW5jZX0wIGlzIGRlcHJlY2F0ZWQiLCA0MzgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxOSkKK0RJQUcod2Fybl9udWxsYWJpbGl0eV9sb3N0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJpbXBsaWNpdCBjb252ZXJzaW9uIGZyb20gbnVsbGFibGUgcG9pbnRlciAlMCB0byBub24tbnVsbGFibGUgcG9pbnRlciB0eXBlICUxIiwgNDM5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTkpCitESUFHKHdhcm5fbnVsbGFiaWxpdHlfbWlzc2luZywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJXNlbGVjdHtwb2ludGVyfGJsb2NrIHBvaW50ZXJ8bWVtYmVyIHBvaW50ZXJ9MCBpcyBtaXNzaW5nIGEgbnVsbGFiaWxpdHkgdHlwZSBzcGVjaWZpZXIgKF9Ob25udWxsLCBfTnVsbGFibGUsIG9yIF9OdWxsX3Vuc3BlY2lmaWVkKSIsIDQzNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDE5KQorRElBRyh3YXJuX251bGxhYmlsaXR5X21pc3NpbmdfYXJyYXksIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImFycmF5IHBhcmFtZXRlciBpcyBtaXNzaW5nIGEgbnVsbGFiaWxpdHkgdHlwZSBzcGVjaWZpZXIgKF9Ob25udWxsLCBfTnVsbGFibGUsIG9yIF9OdWxsX3Vuc3BlY2lmaWVkKSIsIDQzNSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDE5KQorRElBRyh3YXJuX29iamNfY2RpcmVjdGl2ZV9mb3JtYXRfc3RyaW5nLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ1c2luZyAlMCBkaXJlY3RpdmUgaW4gJXNlbGVjdHtOU1N0cmluZ3xDRlN0cmluZ30xIHdoaWNoIGlzIGJlaW5nIHBhc3NlZCBhcyBhIGZvcm1hdHRpbmcgYXJndW1lbnQgdG8gdGhlIGZvcm1hdHRpbmcgJXNlbGVjdHttZXRob2R8Q0ZmdW5jdGlvbn0yIiwgMTM5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9vYmpjX2NpcmN1bGFyX2NvbnRhaW5lciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYWRkaW5nICUwIHRvICUxIG1pZ2h0IGNhdXNlIGNpcmN1bGFyIGRlcGVuZGVuY3kgaW4gY29udGFpbmVyIiwgNDQxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9vYmpjX2NvbGxlY3Rpb25fbGl0ZXJhbF9lbGVtZW50LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJvYmplY3Qgb2YgdHlwZSAlMCBpcyBub3QgY29tcGF0aWJsZSB3aXRoICVzZWxlY3R7YXJyYXkgZWxlbWVudCB0eXBlfGRpY3Rpb25hcnkga2V5IHR5cGV8ZGljdGlvbmFyeSB2YWx1ZSB0eXBlfTEgJTIiLCA0NDgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNCkKK0RJQUcod2Fybl9vYmpjX2Rlc2lnbmF0ZWRfaW5pdF9taXNzaW5nX3N1cGVyX2NhbGwsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgbWlzc2luZyBhICdzdXBlcicgY2FsbCB0byBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgb2YgdGhlIHN1cGVyIGNsYXNzIiwgNDQzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9vYmpjX2Rlc2lnbmF0ZWRfaW5pdF9ub25fZGVzaWduYXRlZF9pbml0X2NhbGwsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgaW52b2tlZCBhIG5vbi1kZXNpZ25hdGVkIGluaXRpYWxpemVyIiwgNDQzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9vYmpjX2Rlc2lnbmF0ZWRfaW5pdF9ub25fc3VwZXJfZGVzaWduYXRlZF9pbml0X2NhbGwsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgc2hvdWxkIG9ubHkgaW52b2tlIGEgZGVzaWduYXRlZCBpbml0aWFsaXplciBvbiAnc3VwZXInIiwgNDQzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9vYmpjX2ltcGxlbWVudGF0aW9uX21pc3NpbmdfZGVzaWduYXRlZF9pbml0X292ZXJyaWRlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJtZXRob2Qgb3ZlcnJpZGUgZm9yIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9mIHRoZSBzdXBlcmNsYXNzICVvYmpjaW5zdGFuY2UwIG5vdCBmb3VuZCIsIDQ0MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fb2JqY19pbnZhbGlkX2JyaWRnZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgYnJpZGdlcyB0byAlMSwgbm90ICUyIiwgNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX29iamNfaW52YWxpZF9icmlkZ2VfdG9fY2YsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiUwIGNhbm5vdCBicmlkZ2UgdG8gJTEiLCA2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fb2JqY19pc2FfYXNzaWduLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJhc3NpZ25tZW50IHRvIE9iamVjdGl2ZS1DJ3MgaXNhIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2Ygb2JqZWN0X3NldENsYXNzKCkiLCAxNTksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX29iamNfaXNhX3VzZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZGlyZWN0IGFjY2VzcyB0byBPYmplY3RpdmUtQydzIGlzYSBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIG9iamVjdF9nZXRDbGFzcygpIiwgMTU5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9vYmpjX2xpdGVyYWxfY29tcGFyaXNvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZGlyZWN0IGNvbXBhcmlzb24gb2YgJXNlbGVjdHthbiBhcnJheSBsaXRlcmFsfGEgZGljdGlvbmFyeSBsaXRlcmFsfGEgbnVtZXJpYyBsaXRlcmFsfGEgYm94ZWQgZXhwcmVzc2lvbnx9MCBoYXMgdW5kZWZpbmVkIGJlaGF2aW9yIiwgNDQ3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9vYmpjX21pc3Npbmdfc3VwZXJfY2FsbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibWV0aG9kIHBvc3NpYmx5IG1pc3NpbmcgYSBbc3VwZXIgJTBdIGNhbGwiLCA0NTMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX29iamNfcG9pbnRlcl9jeHhfY2F0Y2hfZnJhZ2lsZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY2Fubm90IGNhdGNoIGFuIGV4Y2VwdGlvbiB0aHJvd24gd2l0aCBAdGhyb3cgaW4gQysrIGluIHRoZSBub24tdW5pZmllZCBleGNlcHRpb24gbW9kZWwiLCA0NTYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX29iamNfcG9pbnRlcl9tYXNraW5nLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJiaXRtYXNraW5nIGZvciBpbnRyb3NwZWN0aW9uIG9mIE9iamVjdGl2ZS1DIG9iamVjdCBwb2ludGVycyBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCIsIDE2MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fb2JqY19wb2ludGVyX21hc2tpbmdfcGVyZm9ybVNlbGVjdG9yLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJiaXRtYXNraW5nIGZvciBpbnRyb3NwZWN0aW9uIG9mIE9iamVjdGl2ZS1DIG9iamVjdCBwb2ludGVycyBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCIsIDE2MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fb2JqY19wcmVjaXNlX2xpZmV0aW1lX21lYW5pbmdsZXNzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm9iamNfcHJlY2lzZV9saWZldGltZSBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgJXNlbGVjdHtfX3Vuc2FmZV91bnJldGFpbmVkfF9fYXV0b3JlbGVhc2luZ30wIG9iamVjdHMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKHdhcm5fb2JqY19wcm9wZXJ0eV9jb3B5X21pc3Npbmdfb25fYmxvY2ssIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIidjb3B5JyBhdHRyaWJ1dGUgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIHRoZSBibG9jayBwcm9wZXJ0eSB3aGVuIC1mb2JqYy1nYy1vbmx5IGlzIHNwZWNpZmllZCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX29iamNfcHJvcGVydHlfZGVmYXVsdF9hc3NpZ25fb25fb2JqZWN0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJkZWZhdWx0IHByb3BlcnR5IGF0dHJpYnV0ZSAnYXNzaWduJyBub3QgYXBwcm9wcmlhdGUgZm9yIG5vbi1HQyBvYmplY3QiLCA0NjAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX29iamNfcHJvcGVydHlfbm9fYXNzaWdubWVudF9hdHRyaWJ1dGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm5vICdhc3NpZ24nLCAncmV0YWluJywgb3IgJ2NvcHknIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgLSAnYXNzaWduJyBpcyBhc3N1bWVkIiwgNDYwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9vYmpjX3Byb3BlcnR5X3JldGFpbl9vZl9ibG9jaywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicmV0YWluJ2VkIGJsb2NrIHByb3BlcnR5IGRvZXMgbm90IGNvcHkgdGhlIGJsb2NrIC0gdXNlIGNvcHkgYXR0cmlidXRlIGluc3RlYWQiLCA0NTUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX29iamNfcmVhZG9ubHlfcHJvcGVydHlfaGFzX3NldHRlciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAic2V0dGVyIGNhbm5vdCBiZSBzcGVjaWZpZWQgZm9yIGEgcmVhZG9ubHkgcHJvcGVydHkiLCA0NjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX29iamNfcmVkdW5kYW50X2xpdGVyYWxfdXNlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1c2luZyAlMCB3aXRoIGEgbGl0ZXJhbCBpcyByZWR1bmRhbnQiLCA0NjcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyOSkKK0RJQUcod2Fybl9vYmpjX3JlZHVuZGFudF9xdWFsaWZpZWRfY2xhc3NfdHlwZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicGFyYW1ldGVyaXplZCBjbGFzcyAlMCBhbHJlYWR5IGNvbmZvcm1zIHRvIHRoZSBwcm90b2NvbHMgbGlzdGVkOyBkaWQgeW91IGZvcmdldCBhICcqJz8iLCA0NjQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX29iamNfcmVxdWlyZXNfc3VwZXJfcHJvdG9jb2wsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiUwIGF0dHJpYnV0ZSBjYW5ub3QgYmUgYXBwbGllZCB0byAlc2VsZWN0e21ldGhvZHMgaW4gcHJvdG9jb2xzfGRlYWxsb2N9MSIsIDUzOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fb2JqY19yb290X2NsYXNzX21pc3NpbmcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNsYXNzICUwIGRlZmluZWQgd2l0aG91dCBzcGVjaWZ5aW5nIGEgYmFzZSBjbGFzcyIsIDQ2OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fb2JqY19zZWNvbmRhcnlfaW5pdF9taXNzaW5nX2luaXRfY2FsbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY29udmVuaWVuY2UgaW5pdGlhbGl6ZXIgbWlzc2luZyBhICdzZWxmJyBjYWxsIHRvIGFub3RoZXIgaW5pdGlhbGl6ZXIiLCA0NDMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX29iamNfc2Vjb25kYXJ5X2luaXRfc3VwZXJfaW5pdF9jYWxsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJjb252ZW5pZW5jZSBpbml0aWFsaXplciBzaG91bGQgbm90IGludm9rZSBhbiBpbml0aWFsaXplciBvbiAnc3VwZXInIiwgNDQzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9vYmpjX3N0cmluZ19saXRlcmFsX2NvbXBhcmlzb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImRpcmVjdCBjb21wYXJpc29uIG9mIGEgc3RyaW5nIGxpdGVyYWwgaGFzIHVuZGVmaW5lZCBiZWhhdmlvciIsIDQ2OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fb2JqY191bnNhZmVfcGVyZm9ybV9zZWxlY3RvciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgaXMgaW5jb21wYXRpYmxlIHdpdGggc2VsZWN0b3JzIHRoYXQgcmV0dXJuIGEgJXNlbGVjdHtzdHJ1Y3R8dW5pb258dmVjdG9yfTEgdHlwZSIsIDQ3MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fb2xkX3N0eWxlX2Nhc3QsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVzZSBvZiBvbGQtc3R5bGUgY2FzdCIsIDQ3MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fb21wX2FsaWdubWVudF9ub3RfcG93ZXJfb2ZfdHdvLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJhbGlnbmVkIGNsYXVzZSB3aWxsIGJlIGlnbm9yZWQgYmVjYXVzZSB0aGUgcmVxdWVzdGVkIGFsaWdubWVudCBpcyBub3QgYSBwb3dlciBvZiAyIiwgNDc2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTEpCitESUFHKHdhcm5fb21wX2xpbmVhcl9zdGVwX3plcm8sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInplcm8gbGluZWFyIHN0ZXAgKCUwICVzZWxlY3R7fGFuZCBvdGhlciB2YXJpYWJsZXMgaW4gY2xhdXNlIH0xc2hvdWxkIHByb2JhYmx5IGJlIGNvbnN0KSIsIDQ3NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDExKQorRElBRyh3YXJuX29tcF9sb29wXzY0X2JpdF92YXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIk9wZW5NUCBsb29wIGl0ZXJhdGlvbiB2YXJpYWJsZSBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gNjQgYml0cyBzaXplIGFuZCB3aWxsIGJlIG5hcnJvd2VkIiwgNDc3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTEpCitESUFHKHdhcm5fb21wX25lc3Rpbmdfc2ltZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiT3Blbk1QIG9ubHkgYWxsb3dzIGFuIG9yZGVyZWQgY29uc3RydWN0IHdpdGggdGhlIHNpbWQgY2xhdXNlIG5lc3RlZCBpbiBhIHNpbWQgY29uc3RydWN0IiwgNTgxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTEpCitESUFHKHdhcm5fb21wX25vbl90cml2aWFsX3R5cGVfbWFwcGVkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJOb24tdHJpdmlhbCB0eXBlICUwIGlzIG1hcHBlZCwgb25seSB0cml2aWFsIHR5cGVzIGFyZSBndWFyYW50ZWVkIHRvIGJlIG1hcHBlZCBjb3JyZWN0bHkiLCA0NzgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxMSkKK0RJQUcod2Fybl9vbXBfbm90X2luX3RhcmdldF9jb250ZXh0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJkZWNsYXJhdGlvbiBpcyBub3QgZGVjbGFyZWQgaW4gYW55IGRlY2xhcmUgdGFyZ2V0IHJlZ2lvbiIsIDQ3OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDExKQorRElBRyh3YXJuX29tcF9zZWN0aW9uX2lzX2NoYXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImFycmF5IHNlY3Rpb24gJXNlbGVjdHtsb3dlciBib3VuZHxsZW5ndGh9MCBpcyBvZiB0eXBlICdjaGFyJyIsIDExOCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDExKQorRElBRyh3YXJuX29uX3N1cGVyY2xhc3NfdXNlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJjbGFzcyBpbXBsZW1lbnRhdGlvbiBtYXkgbm90IGhhdmUgc3VwZXIgY2xhc3MiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9vcGVuY2xfYXR0cl9kZXByZWNhdGVkX2lnbm9yZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiUwIGF0dHJpYnV0ZSBpcyBkZXByZWNhdGVkIGFuZCBpZ25vcmVkIGluIE9wZW5DTCB2ZXJzaW9uICUxIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9vcGVyYXRvcl9uZXdfcmV0dXJuc19udWxsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMCBzaG91bGQgbm90IHJldHVybiBhIG51bGwgcG9pbnRlciB1bmxlc3MgaXQgaXMgZGVjbGFyZWQgJ3Rocm93KCknJXNlbGVjdHt8IG9yICdub2V4Y2VwdCd9MSIsIDQxMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fb3NfbG9nX2Zvcm1hdF9uYXJnLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm9zX2xvZygpICclJW4nIGZvcm1hdCBzcGVjaWZpZXIgaXMgbm90IGFsbG93ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDIpCitESUFHKHdhcm5fb3V0X29mX3JhbmdlX2NvbXBhcmUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInJlc3VsdCBvZiBjb21wYXJpc29uIG9mICVzZWxlY3R7Y29uc3RhbnQgJTB8dHJ1ZXxmYWxzZX0xIHdpdGggJXNlbGVjdHtleHByZXNzaW9uIG9mIHR5cGUgJTJ8Ym9vbGVhbiBleHByZXNzaW9ufTMgaXMgYWx3YXlzICU0IiwgNjE4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9vdmVyYWxpZ25lZF90eXBlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ0eXBlICUwIHJlcXVpcmVzICUxIGJ5dGVzIG9mIGFsaWdubWVudCBhbmQgdGhlIGRlZmF1bHQgYWxsb2NhdG9yIG9ubHkgZ3VhcmFudGVlcyAlMiBieXRlcyIsIDQ4MiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fb3ZlcmxvYWRlZF9zaGlmdF9pbl9jb21wYXJpc29uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJvdmVybG9hZGVkIG9wZXJhdG9yICVzZWxlY3R7Pj58PDx9MCBoYXMgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBjb21wYXJpc29uIG9wZXJhdG9yIiwgNDg1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9vdmVybG9hZGVkX3ZpcnR1YWwsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiVxMCBoaWRlcyBvdmVybG9hZGVkIHZpcnR1YWwgJXNlbGVjdHtmdW5jdGlvbnxmdW5jdGlvbnN9MSIsIDQ4NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fb3ZlcnJpZGluZ19tZXRob2RfbWlzc2luZ19ub2VzY2FwZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicGFyYW1ldGVyIG9mIG92ZXJyaWRpbmcgbWV0aG9kIHNob3VsZCBiZSBhbm5vdGF0ZWQgd2l0aCBfX2F0dHJpYnV0ZV9fKChub2VzY2FwZSkpIiwgMzg5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9wYWRkZWRfc3RydWN0X2Fub25fZmllbGQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInBhZGRpbmcgJXNlbGVjdHtzdHJ1Y3R8aW50ZXJmYWNlfGNsYXNzfTAgJTEgd2l0aCAlMiAlc2VsZWN0e2J5dGV8Yml0fTMlczIgdG8gYWxpZ24gYW5vbnltb3VzIGJpdC1maWVsZCIsIDQ5MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcGFkZGVkX3N0cnVjdF9maWVsZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAicGFkZGluZyAlc2VsZWN0e3N0cnVjdHxpbnRlcmZhY2V8Y2xhc3N9MCAlMSB3aXRoICUyICVzZWxlY3R7Ynl0ZXxiaXR9MyVzMiB0byBhbGlnbiAlNCIsIDQ5MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcGFkZGVkX3N0cnVjdF9zaXplLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJwYWRkaW5nIHNpemUgb2YgJTAgd2l0aCAlMSAlc2VsZWN0e2J5dGV8Yml0fTIlczEgdG8gYWxpZ25tZW50IGJvdW5kYXJ5IiwgNDkxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9wYXJhbV9yZXR1cm5fdHlwZXN0YXRlX21pc21hdGNoLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJwYXJhbWV0ZXIgJyUwJyBub3QgaW4gZXhwZWN0ZWQgc3RhdGUgd2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJuczogZXhwZWN0ZWQgJyUxJywgb2JzZXJ2ZWQgJyUyJyIsIDEzMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcGFyYW1fdHlwZXN0YXRlX21pc21hdGNoLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJhcmd1bWVudCBub3QgaW4gZXhwZWN0ZWQgc3RhdGU7IGV4cGVjdGVkICclMCcsIG9ic2VydmVkICclMSciLCAxMzIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3BhcmFtZXRlcl9zaXplLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMCBpcyBhIGxhcmdlICglMSBieXRlcykgcGFzcy1ieS12YWx1ZSBhcmd1bWVudDsgcGFzcyBpdCBieSByZWZlcmVuY2UgaW5zdGVhZCA/IiwgMzMyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9wYXJlbnNfZGlzYW1iaWd1YXRlZF9hc19mdW5jdGlvbl9kZWNsYXJhdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicGFyZW50aGVzZXMgd2VyZSBkaXNhbWJpZ3VhdGVkIGFzIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24iLCA3MTEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3BhcmVuc19kaXNhbWJpZ3VhdGVkX2FzX3ZhcmlhYmxlX2RlY2xhcmF0aW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJwYXJlbnRoZXNlcyB3ZXJlIGRpc2FtYmlndWF0ZWQgYXMgcmVkdW5kYW50IHBhcmVudGhlc2VzIGFyb3VuZCBkZWNsYXJhdGlvbiBvZiB2YXJpYWJsZSBuYW1lZCAlMCIsIDcxMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcGFzc19jbGFzc19hcmdfdG9fdmFyYXJnLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJwYXNzaW5nIG9iamVjdCBvZiBjbGFzcyB0eXBlICUwIHRocm91Z2ggdmFyaWFkaWMgJXNlbGVjdHtmdW5jdGlvbnxibG9ja3xtZXRob2R8Y29uc3RydWN0b3J9MSVzZWxlY3R7fDsgZGlkIHlvdSBtZWFuIHRvIGNhbGwgJyUzJz99MiIsIDEyMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcGVzc2ltaXppbmdfbW92ZV9vbl9pbml0aWFsaXphdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAibW92aW5nIGEgdGVtcG9yYXJ5IG9iamVjdCBwcmV2ZW50cyBjb3B5IGVsaXNpb24iLCA1MDIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3Blc3NpbWl6aW5nX21vdmVfb25fcmV0dXJuLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJtb3ZpbmcgYSBsb2NhbCBvYmplY3QgaW4gYSByZXR1cm4gc3RhdGVtZW50IHByZXZlbnRzIGNvcHkgZWxpc2lvbiIsIDUwMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcG9pbnRlcl9hYnMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInRha2luZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgJXNlbGVjdHtwb2ludGVyfGZ1bmN0aW9ufGFycmF5fTAgdHlwZSAlMSBpcyBzdXNwaWNpb3VzIiwgOCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcG9pbnRlcl9hcml0aF9udWxsX3B0ciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAicGVyZm9ybWluZyBwb2ludGVyIGFyaXRobWV0aWMgb24gYSBudWxsIHBvaW50ZXIgaGFzIHVuZGVmaW5lZCBiZWhhdmlvciVzZWxlY3R7fCBpZiB0aGUgb2Zmc2V0IGlzIG5vbnplcm99MCIsIDQzMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcG9pbnRlcl9pbmRpcmVjdGlvbl9mcm9tX2luY29tcGF0aWJsZV90eXBlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJkZXJlZmVyZW5jZSBvZiB0eXBlICUxIHRoYXQgd2FzIHJlaW50ZXJwcmV0X2Nhc3QgZnJvbSB0eXBlICUwIGhhcyB1bmRlZmluZWQgYmVoYXZpb3IiLCA2NDgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3ByYWdtYV9hdHRyaWJ1dGVfdW51c2VkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1bnVzZWQgYXR0cmlidXRlICUwIGluICcjcHJhZ21hIGNsYW5nIGF0dHJpYnV0ZSBwdXNoJyByZWdpb24iLCA1MDksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3ByYWdtYV9vcHRpb25zX2FsaWduX3Jlc2V0X2ZhaWxlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiI3ByYWdtYSBvcHRpb25zIGFsaWduPXJlc2V0IGZhaWxlZDogJTAiLCAyNjksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3ByYWdtYV9wYWNrX2ludmFsaWRfYWxpZ25tZW50LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleHBlY3RlZCAjcHJhZ21hIHBhY2sgcGFyYW1ldGVyIHRvIGJlICcxJywgJzInLCAnNCcsICc4Jywgb3IgJzE2JyIsIDI2OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcHJhZ21hX3BhY2tfbW9kaWZpZWRfYWZ0ZXJfaW5jbHVkZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidGhlIGN1cnJlbnQgI3ByYWdtYSBwYWNrIGFsaWdtZW50IHZhbHVlIGlzIG1vZGlmaWVkIGluIHRoZSBpbmNsdWRlZCBmaWxlIiwgNTExLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9wcmFnbWFfcGFja19ub19wb3BfZW9mLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ1bnRlcm1pbmF0ZWQgJyNwcmFnbWEgcGFjayAocHVzaCwgLi4uKScgYXQgZW5kIG9mIGZpbGUiLCA1MTEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3ByYWdtYV9wYWNrX25vbl9kZWZhdWx0X2F0X2luY2x1ZGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm5vbi1kZWZhdWx0ICNwcmFnbWEgcGFjayB2YWx1ZSBjaGFuZ2VzIHRoZSBhbGlnbm1lbnQgb2Ygc3RydWN0IG9yIHVuaW9uIG1lbWJlcnMgaW4gdGhlIGluY2x1ZGVkIGZpbGUiLCA1MTIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3ByYWdtYV9wYWNrX3BvcF9pZGVudGlmZXJfYW5kX2FsaWdubWVudCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAic3BlY2lmeWluZyBib3RoIGEgbmFtZSBhbmQgYWxpZ25tZW50IHRvICdwb3AnIGlzIHVuZGVmaW5lZCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3ByYWdtYV9wYWNrX3Nob3csIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInZhbHVlIG9mICNwcmFnbWEgcGFjayhzaG93KSA9PSAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3ByYWdtYV9wb3BfZmFpbGVkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIjcHJhZ21hICUwKHBvcCwgLi4uKSBmYWlsZWQ6ICUxIiwgMjY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9wcmFnbWFfdW51c2VkX2V4cGVjdGVkX3Zhcl9hcmcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm9ubHkgdmFyaWFibGVzIGNhbiBiZSBhcmd1bWVudHMgdG8gJyNwcmFnbWEgdW51c2VkJyIsIDI2OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcHJhZ21hX3VudXNlZF91bmRlY2xhcmVkX3ZhciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidW5kZWNsYXJlZCB2YXJpYWJsZSAlMCB1c2VkIGFzIGFuIGFyZ3VtZW50IGZvciAnI3ByYWdtYSB1bnVzZWQnIiwgMjY5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9wcmVjZWRlbmNlX2JpdHdpc2VfcmVsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlMCBoYXMgbG93ZXIgcHJlY2VkZW5jZSB0aGFuICUxOyAlMSB3aWxsIGJlIGV2YWx1YXRlZCBmaXJzdCIsIDQ5MiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcHJlY2VkZW5jZV9jb25kaXRpb25hbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAib3BlcmF0b3IgJz86JyBoYXMgbG93ZXIgcHJlY2VkZW5jZSB0aGFuICclMCc7ICclMCcgd2lsbCBiZSBldmFsdWF0ZWQgZmlyc3QiLCA0OTIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3ByaW50Zl9PYmpDZmxhZ3Nfd2l0aG91dF9PYmpDQ29udmVyc2lvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAib2JqZWN0IGZvcm1hdCBmbGFncyBjYW5ub3QgYmUgdXNlZCB3aXRoICclMCcgY29udmVyc2lvbiBzcGVjaWZpZXIiLCAyMTksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyOCkKK0RJQUcod2Fybl9wcmludGZfYXN0ZXJpc2tfbWlzc2luZ19hcmcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiclc2VsZWN0eyp8Lip9MCcgc3BlY2lmaWVkIGZpZWxkICVzZWxlY3R7d2lkdGh8cHJlY2lzaW9ufTAgaXMgbWlzc2luZyBhIG1hdGNoaW5nICdpbnQnIGFyZ3VtZW50IiwgMjE5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjgpCitESUFHKHdhcm5fcHJpbnRmX2FzdGVyaXNrX3dyb25nX3R5cGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImZpZWxkICVzZWxlY3R7d2lkdGh8cHJlY2lzaW9ufTAgc2hvdWxkIGhhdmUgdHlwZSAlMSwgYnV0IGFyZ3VtZW50IGhhcyB0eXBlICUyIiwgMjE5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjgpCitESUFHKHdhcm5fcHJpbnRmX2RhdGFfYXJnX25vdF91c2VkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJkYXRhIGFyZ3VtZW50IG5vdCB1c2VkIGJ5IGZvcm1hdCBzdHJpbmciLCAyMjAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyOCkKK0RJQUcod2Fybl9wcmludGZfZW1wdHlfb2JqY19mbGFnLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJtaXNzaW5nIG9iamVjdCBmb3JtYXQgZmxhZyIsIDIxOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI4KQorRElBRyh3YXJuX3ByaW50Zl9mb3JtYXRfc3RyaW5nX2NvbnRhaW5zX251bGxfY2hhciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZm9ybWF0IHN0cmluZyBjb250YWlucyAnXFwwJyB3aXRoaW4gdGhlIHN0cmluZyBib2R5IiwgMjE5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjgpCitESUFHKHdhcm5fcHJpbnRmX2Zvcm1hdF9zdHJpbmdfbm90X251bGxfdGVybWluYXRlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZm9ybWF0IHN0cmluZyBpcyBub3QgbnVsbC10ZXJtaW5hdGVkIiwgMjE5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjgpCitESUFHKHdhcm5fcHJpbnRmX2lnbm9yZWRfZmxhZywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZmxhZyAnJTAnIGlzIGlnbm9yZWQgd2hlbiBmbGFnICclMScgaXMgcHJlc2VudCIsIDIxOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI4KQorRElBRyh3YXJuX3ByaW50Zl9pbmNvbXBsZXRlX3NwZWNpZmllciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW5jb21wbGV0ZSBmb3JtYXQgc3BlY2lmaWVyIiwgMjE5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjgpCitESUFHKHdhcm5fcHJpbnRmX2luc3VmZmljaWVudF9kYXRhX2FyZ3MsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm1vcmUgJyUlJyBjb252ZXJzaW9ucyB0aGFuIGRhdGEgYXJndW1lbnRzIiwgMjE5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjgpCitESUFHKHdhcm5fcHJpbnRmX2ludmFsaWRfb2JqY19mbGFnLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICInJTAnIGlzIG5vdCBhIHZhbGlkIG9iamVjdCBmb3JtYXQgZmxhZyIsIDIxOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI4KQorRElBRyh3YXJuX3ByaW50Zl9ub25zZW5zaWNhbF9mbGFnLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJmbGFnICclMCcgcmVzdWx0cyBpbiB1bmRlZmluZWQgYmVoYXZpb3Igd2l0aCAnJTEnIGNvbnZlcnNpb24gc3BlY2lmaWVyIiwgMjE5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjgpCitESUFHKHdhcm5fcHJpbnRmX25vbnNlbnNpY2FsX29wdGlvbmFsX2Ftb3VudCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJXNlbGVjdHtmaWVsZCB3aWR0aHxwcmVjaXNpb259MCB1c2VkIHdpdGggJyUxJyBjb252ZXJzaW9uIHNwZWNpZmllciwgcmVzdWx0aW5nIGluIHVuZGVmaW5lZCBiZWhhdmlvciIsIDIxOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI4KQorRElBRyh3YXJuX3ByaW50Zl9wb3NpdGlvbmFsX2FyZ19leGNlZWRzX2RhdGFfYXJncywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZGF0YSBhcmd1bWVudCBwb3NpdGlvbiAnJTAnIGV4Y2VlZHMgdGhlIG51bWJlciBvZiBkYXRhIGFyZ3VtZW50cyAoJTEpIiwgMjE5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjgpCitESUFHKHdhcm5fcHJpdmF0ZV9leHRlcm4sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInVzZSBvZiBfX3ByaXZhdGVfZXh0ZXJuX18gb24gYSBkZWNsYXJhdGlvbiBtYXkgbm90IHByb2R1Y2UgZXh0ZXJuYWwgc3ltYm9sIHByaXZhdGUgdG8gdGhlIGxpbmthZ2UgdW5pdCBhbmQgaXMgZGVwcmVjYXRlZCIsIDUxNiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcHJvZmlsZV9kYXRhX21pc3NpbmcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInByb2ZpbGUgZGF0YSBtYXkgYmUgaW5jb21wbGV0ZTogb2YgJTAgZnVuY3Rpb24lczAsICUxICVwbHVyYWx7MTpoYXN8OmhhdmV9MSBubyBkYXRhIiwgNTE5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMzEpCitESUFHKHdhcm5fcHJvZmlsZV9kYXRhX291dF9vZl9kYXRlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJwcm9maWxlIGRhdGEgbWF5IGJlIG91dCBvZiBkYXRlOiBvZiAlMCBmdW5jdGlvbiVzMCwgJTEgJXBsdXJhbHsxOmhhc3w6aGF2ZX0xIG1pc21hdGNoZWQgZGF0YSB0aGF0IHdpbGwgYmUgaWdub3JlZCIsIDUyMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDMxKQorRElBRyh3YXJuX3Byb2ZpbGVfZGF0YV91bnByb2ZpbGVkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJubyBwcm9maWxlIGRhdGEgYXZhaWxhYmxlIGZvciBmaWxlIFwiJTBcIiIsIDUyMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDMxKQorRElBRyh3YXJuX3Byb3BlcnR5X2FjY2Vzc19zdWdnZXN0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJwcm9wZXJ0eSAlMCBub3QgZm91bmQgb24gb2JqZWN0IG9mIHR5cGUgJTE7IGRpZCB5b3UgbWVhbiB0byBhY2Nlc3MgcHJvcGVydHkgJTI/IiwgNTIyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9wcm9wZXJ0eV9hdHRyX21pc21hdGNoLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJwcm9wZXJ0eSBhdHRyaWJ1dGUgaW4gY2xhc3MgZXh0ZW5zaW9uIGRvZXMgbm90IG1hdGNoIHRoZSBwcmltYXJ5IGNsYXNzIiwgNTIzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9wcm9wZXJ0eV9hdHRyaWJ1dGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiclMScgYXR0cmlidXRlIG9uIHByb3BlcnR5ICUwIGRvZXMgbm90IG1hdGNoIHRoZSBwcm9wZXJ0eSBpbmhlcml0ZWQgZnJvbSAlMiIsIDUyMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcHJvcGVydHlfZ2V0dGVyX293bmluZ19taXNtYXRjaCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicHJvcGVydHkgZGVjbGFyZWQgYXMgcmV0dXJuaW5nIG5vbi1yZXRhaW5lZCBvYmplY3RzOyBnZXR0ZXIgcmV0dXJuaW5nIHJldGFpbmVkIG9iamVjdHMiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9wcm9wZXJ0eV9pbXBsaWNpdGx5X21pc21hdGNoZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInByaW1hcnkgcHJvcGVydHkgZGVjbGFyYXRpb24gaXMgaW1wbGljaXRseSBzdHJvbmcgd2hpbGUgcmVkZWNsYXJhdGlvbiBpbiBjbGFzcyBleHRlbnNpb24gaXMgd2VhayIsIDQ1OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcHJvcGVydHlfbWV0aG9kX2RlcHJlY2F0ZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInByb3BlcnR5IGFjY2VzcyBpcyB1c2luZyAlMCBtZXRob2Qgd2hpY2ggaXMgZGVwcmVjYXRlZCIsIDE1NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI3KQorRElBRyh3YXJuX3Byb3BlcnR5X3JlZGVjbF9nZXR0ZXJfbWlzbWF0Y2gsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImdldHRlciBuYW1lIG1pc21hdGNoIGJldHdlZW4gcHJvcGVydHkgcmVkZWNsYXJhdGlvbiAoJTEpIGFuZCBpdHMgb3JpZ2luYWwgZGVjbGFyYXRpb24gKCUwKSIsIDUyMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcHJvcGVydHlfdHlwZXNfYXJlX2luY29tcGF0aWJsZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicHJvcGVydHkgdHlwZSAlMCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0eXBlICUxIGluaGVyaXRlZCBmcm9tICUyIiwgMjkyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9wcm90b2NvbF9wcm9wZXJ0eV9taXNtYXRjaCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicHJvcGVydHkgJXNlbGVjdHtvZiB0eXBlICUxfHdpdGggYXR0cmlidXRlICclMSd8d2l0aG91dCBhdHRyaWJ1dGUgJyUxJ3x3aXRoIGdldHRlciAlMXx3aXRoIHNldHRlciAlMX0wIHdhcyBzZWxlY3RlZCBmb3Igc3ludGhlc2lzIiwgNTI1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9wdF9ndWFyZGVkX3Bhc3NfYnlfcmVmZXJlbmNlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJwYXNzaW5nIHRoZSB2YWx1ZSB0aGF0ICUxIHBvaW50cyB0byBieSByZWZlcmVuY2UgcmVxdWlyZXMgaG9sZGluZyAlMCAlc2VsZWN0eyclMid8JyUyJyBleGNsdXNpdmVseX0zIiwgNjMyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9wdHJfYXJpdGhfZXhjZWVkc19ib3VuZHMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInRoZSBwb2ludGVyIGluY3JlbWVudGVkIGJ5ICUwIHJlZmVycyBwYXN0IHRoZSBlbmQgb2YgdGhlIGFycmF5ICh0aGF0IGNvbnRhaW5zICUxIGVsZW1lbnQlczIpIiwgMzQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3B0cl9hcml0aF9wcmVjZWRlc19ib3VuZHMsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInRoZSBwb2ludGVyIGRlY3JlbWVudGVkIGJ5ICUwIHJlZmVycyBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkiLCAzNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcHRyX2luZGVwZW5kZW50Y2xhc3NfYXR0cmlidXRlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICInb2JqY19pbmRlcGVuZGVudF9jbGFzcycgYXR0cmlidXRlIG1heSBiZSBwdXQgb24gT2JqZWN0aXZlLUMgb2JqZWN0IHBvaW50ZXIgdHlwZSBvbmx5OyBhdHRyaWJ1dGUgaXMgaWdub3JlZCIsIDUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3F1YWxfcmV0dXJuX3R5cGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiclMCcgdHlwZSBxdWFsaWZpZXIlczEgb24gcmV0dXJuIHR5cGUgJXBsdXJhbHsxOmhhc3w6aGF2ZX0xIG5vIGVmZmVjdCIsIDI3MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcmVhZG9ubHlfcHJvcGVydHksIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImF0dHJpYnV0ZSAncmVhZG9ubHknIG9mIHByb3BlcnR5ICUwIHJlc3RyaWN0cyBhdHRyaWJ1dGUgJ3JlYWR3cml0ZScgb2YgcHJvcGVydHkgaW5oZXJpdGVkIGZyb20gJTEiLCA1MjMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3JlY2VpdmVyX2ZvcndhcmRfY2xhc3MsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInJlY2VpdmVyICUwIGlzIGEgZm9yd2FyZCBjbGFzcyBhbmQgY29ycmVzcG9uZGluZyBAaW50ZXJmYWNlIG1heSBub3QgZXhpc3QiLCA1MzAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3JlY2VpdmVyX2ZvcndhcmRfaW5zdGFuY2UsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInJlY2VpdmVyIHR5cGUgJTAgZm9yIGluc3RhbmNlIG1lc3NhZ2UgaXMgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIiwgNTMwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgNSkKK0RJQUcod2Fybl9yZWRlY2xfbGlicmFyeV9idWlsdGluLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpbmNvbXBhdGlibGUgcmVkZWNsYXJhdGlvbiBvZiBsaWJyYXJ5IGZ1bmN0aW9uICUwIiwgMjg4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9yZWRlY2xhcmF0aW9uX3dpdGhvdXRfYXR0cmlidXRlX3ByZXZfYXR0cmlidXRlX2lnbm9yZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiVxMCByZWRlY2xhcmVkIHdpdGhvdXQgJTEgYXR0cmlidXRlOiBwcmV2aW91cyAlMSBpZ25vcmVkIiwgMjk3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9yZWRlY2xhcmF0aW9uX3dpdGhvdXRfaW1wb3J0X2F0dHJpYnV0ZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJXEwIHJlZGVjbGFyZWQgd2l0aG91dCAnZGxsaW1wb3J0JyBhdHRyaWJ1dGU6ICdkbGxleHBvcnQnIGF0dHJpYnV0ZSBhZGRlZCIsIDI5NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcmVkZWZpbmVfZXh0bmFtZV9ub3RfYXBwbGllZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiI3ByYWdtYSByZWRlZmluZV9leHRuYW1lIGlzIGFwcGxpY2FibGUgdG8gZXh0ZXJuYWwgQyBkZWNsYXJhdGlvbnMgb25seTsgbm90IGFwcGxpZWQgdG8gJXNlbGVjdHtmdW5jdGlvbnx2YXJpYWJsZX0wICUxIiwgNTE0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9yZWRlZmluaXRpb25faW5fcGFyYW1fbGlzdCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicmVkZWZpbml0aW9uIG9mICUwIHdpbGwgbm90IGJlIHZpc2libGUgb3V0c2lkZSBvZiB0aGlzIGZ1bmN0aW9uIiwgNzEyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9yZWR1bmRhbnRfbG9vcF9pdGVyYXRpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInZhcmlhYmxlICUwIGlzICVzZWxlY3R7ZGVjcmVtZW50ZWR8aW5jcmVtZW50ZWR9MSBib3RoIGluIHRoZSBsb29wIGhlYWRlciBhbmQgaW4gdGhlIGxvb3AgYm9keSIsIDIxOCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcmVkdW5kYW50X21vdmVfb25fcmV0dXJuLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJyZWR1bmRhbnQgbW92ZSBpbiByZXR1cm4gc3RhdGVtZW50IiwgNTMzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9yZWR1bmRhbnRfcGFyZW5zX2Fyb3VuZF9kZWNsYXJhdG9yLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJyZWR1bmRhbnQgcGFyZW50aGVzZXMgc3Vycm91bmRpbmcgZGVjbGFyYXRvciIsIDUzNCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcmVmZXJlbmNlX2ZpZWxkX2lzX3VuaW5pdCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicmVmZXJlbmNlICUwIGlzIG5vdCB5ZXQgYm91bmQgdG8gYSB2YWx1ZSB3aGVuIHVzZWQgaGVyZSIsIDY1NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcmVnaXN0ZXJfb2JqY19jYXRjaF9wYXJtLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIncmVnaXN0ZXInIHN0b3JhZ2Ugc3BlY2lmaWVyIG9uIEBjYXRjaCBwYXJhbWV0ZXIgd2lsbCBiZSBpZ25vcmVkIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcmVpbnRlcnByZXRfZGlmZmVyZW50X2Zyb21fc3RhdGljLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIncmVpbnRlcnByZXRfY2FzdCcgJXNlbGVjdHtmcm9tfHRvfTMgY2xhc3MgJTAgJXNlbGVjdHt0b3xmcm9tfTMgaXRzICVzZWxlY3R7dmlydHVhbCBiYXNlfGJhc2UgYXQgbm9uLXplcm8gb2Zmc2V0fTIgJTEgYmVoYXZlcyBkaWZmZXJlbnRseSBmcm9tICdzdGF0aWNfY2FzdCciLCA1MzYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3JlbGF0ZWRfcmVzdWx0X3R5cGVfY29tcGF0aWJpbGl0eV9jbGFzcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibWV0aG9kIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhbiBpbnN0YW5jZSBvZiBpdHMgY2xhc3MgdHlwZSAlZGlmZnskLCBidXQgaXMgZGVjbGFyZWQgdG8gcmV0dXJuICR8LCBidXQgaXMgZGVjbGFyZWQgdG8gcmV0dXJuIGRpZmZlcmVudCB0eXBlfTAsMSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxNykKK0RJQUcod2Fybl9yZWxhdGVkX3Jlc3VsdF90eXBlX2NvbXBhdGliaWxpdHlfcHJvdG9jb2wsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInByb3RvY29sIG1ldGhvZCBpcyBleHBlY3RlZCB0byByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIGltcGxlbWVudGluZyBjbGFzcywgYnV0IGlzIGRlY2xhcmVkIHRvIHJldHVybiAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxNykKK0RJQUcod2Fybl9yZW1haW5kZXJfZGl2aXNpb25fYnlfemVybywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJXNlbGVjdHtyZW1haW5kZXJ8ZGl2aXNpb259MCBieSB6ZXJvIGlzIHVuZGVmaW5lZCIsIDE3MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcmV0X2FkZHJfbGFiZWwsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInJldHVybmluZyBhZGRyZXNzIG9mIGxhYmVsLCB3aGljaCBpcyBsb2NhbCIsIDU0MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcmV0X2xvY2FsX3RlbXBfYWRkcl9yZWYsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInJldHVybmluZyAlc2VsZWN0e2FkZHJlc3Mgb2Z8cmVmZXJlbmNlIHRvfTAgbG9jYWwgdGVtcG9yYXJ5IG9iamVjdCIsIDU0MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcmV0X3N0YWNrX2FkZHJfcmVmLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlc2VsZWN0e2FkZHJlc3Mgb2Z8cmVmZXJlbmNlIHRvfTAgc3RhY2sgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBsb2NhbCB2YXJpYWJsZSAlMSByZXR1cm5lZCIsIDU0MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcmV0dXJuX21pc3NpbmdfZXhwciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIm5vbi12b2lkICVzZWxlY3R7ZnVuY3Rpb258bWV0aG9kfTEgJTAgc2hvdWxkIHJldHVybiBhIHZhbHVlIiwgNTQ0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9yZXR1cm5fdHlwZXN0YXRlX2Zvcl91bmNvbnN1bWFibGVfdHlwZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAicmV0dXJuIHN0YXRlIHNldCBmb3IgYW4gdW5jb25zdW1hYmxlIHR5cGUgJyUwJyIsIDEzMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcmV0dXJuX3R5cGVzdGF0ZV9taXNtYXRjaCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAicmV0dXJuIHZhbHVlIG5vdCBpbiBleHBlY3RlZCBzdGF0ZTsgZXhwZWN0ZWQgJyUwJywgb2JzZXJ2ZWQgJyUxJyIsIDEzMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcmV0dXJuX3ZhbHVlX3NpemUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInJldHVybiB2YWx1ZSBvZiAlMCBpcyBhIGxhcmdlICglMSBieXRlcykgcGFzcy1ieS12YWx1ZSBvYmplY3Q7IHBhc3MgaXQgYnkgcmVmZXJlbmNlIGluc3RlYWQgPyIsIDMzMiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fcmV0dXJuX3ZhbHVlX3VkdCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgaGFzIEMtbGlua2FnZSBzcGVjaWZpZWQsIGJ1dCByZXR1cm5zIHVzZXItZGVmaW5lZCB0eXBlICUxIHdoaWNoIGlzIGluY29tcGF0aWJsZSB3aXRoIEMiLCA1NDUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3JldHVybl92YWx1ZV91ZHRfaW5jb21wbGV0ZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgaGFzIEMtbGlua2FnZSBzcGVjaWZpZWQsIGJ1dCByZXR1cm5zIGluY29tcGxldGUgdHlwZSAlMSB3aGljaCBjb3VsZCBiZSBpbmNvbXBhdGlibGUgd2l0aCBDIiwgNTQ1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9yb290X2luc3RfbWV0aG9kX25vdF9mb3VuZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiaW5zdGFuY2UgbWV0aG9kICUwIGlzIGJlaW5nIHVzZWQgb24gJ0NsYXNzJyB3aGljaCBpcyBub3QgaW4gdGhlIHJvb3QgY2xhc3MiLCA0NTEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3NhbXBsZXJfaW5pdGlhbGl6ZXJfaW52YWxpZF9iaXRzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJzYW1wbGVyIGluaXRpYWxpemVyIGhhcyBpbnZhbGlkICUwIGJpdHMiLCA1ODIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3NjYW5mX25vbnplcm9fd2lkdGgsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInplcm8gZmllbGQgd2lkdGggaW4gc2NhbmYgZm9ybWF0IHN0cmluZyBpcyB1bnVzZWQiLCAyMTksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyOCkKK0RJQUcod2Fybl9zY2FuZl9zY2FubGlzdF9pbmNvbXBsZXRlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJubyBjbG9zaW5nICddJyBmb3IgJyUlWycgaW4gc2NhbmYgZm9ybWF0IHN0cmluZyIsIDIxOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI4KQorRElBRyh3YXJuX3NlY29uZF9hcmdfb2ZfdmFfc3RhcnRfbm90X2xhc3RfbmFtZWRfcGFyYW0sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInNlY29uZCBhcmd1bWVudCB0byAndmFfc3RhcnQnIGlzIG5vdCB0aGUgbGFzdCBuYW1lZCBwYXJhbWV0ZXIiLCA3MDYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3NlY29uZF9wYXJhbWV0ZXJfdG9fdmFfYXJnX25ldmVyX2NvbXBhdGlibGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInNlY29uZCBhcmd1bWVudCB0byAndmFfYXJnJyBpcyBvZiBwcm9tb3RhYmxlIHR5cGUgJTA7IHRoaXMgdmFfYXJnIGhhcyB1bmRlZmluZWQgYmVoYXZpb3IgYmVjYXVzZSBhcmd1bWVudHMgd2lsbCBiZSBwcm9tb3RlZCB0byAlMSIsIDcwNiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fc2Vjb25kX3BhcmFtZXRlcl90b192YV9hcmdfbm90X3BvZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgInNlY29uZCBhcmd1bWVudCB0byAndmFfYXJnJyBpcyBvZiBub24tUE9EIHR5cGUgJTAiLCA0MTksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3NlY29uZF9wYXJhbWV0ZXJfdG9fdmFfYXJnX293bmVyc2hpcF9xdWFsaWZpZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICJzZWNvbmQgYXJndW1lbnQgdG8gJ3ZhX2FyZycgaXMgb2YgQVJDIG93bmVyc2hpcC1xdWFsaWZpZWQgdHlwZSAlMCIsIDQxOSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fc2VsZl9hc3NpZ25tZW50LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJleHBsaWNpdGx5IGFzc2lnbmluZyB2YWx1ZSBvZiB2YXJpYWJsZSBvZiB0eXBlICUwIHRvIGl0c2VsZiIsIDU1MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fc2VsZl9tb3ZlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJleHBsaWNpdGx5IG1vdmluZyB2YXJpYWJsZSBvZiB0eXBlICUwIHRvIGl0c2VsZiIsIDU1MywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fc2V0dGVyX2dldHRlcl9pbXBsX3JlcXVpcmVkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJwcm9wZXJ0eSAlMCByZXF1aXJlcyBtZXRob2QgJTEgdG8gYmUgZGVmaW5lZCAtIHVzZSBAc3ludGhlc2l6ZSwgQGR5bmFtaWMgb3IgcHJvdmlkZSBhIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzIGNsYXNzIGltcGxlbWVudGF0aW9uIiwgNDU3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9zZXR0ZXJfZ2V0dGVyX2ltcGxfcmVxdWlyZWRfaW5fY2F0ZWdvcnksIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInByb3BlcnR5ICUwIHJlcXVpcmVzIG1ldGhvZCAlMSB0byBiZSBkZWZpbmVkIC0gdXNlIEBkeW5hbWljIG9yIHByb3ZpZGUgYSBtZXRob2QgaW1wbGVtZW50YXRpb24gaW4gdGhpcyBjYXRlZ29yeSIsIDQ1NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fc2hhZG93X2ZpZWxkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJub24tc3RhdGljIGRhdGEgbWVtYmVyICUwIG9mICUxIHNoYWRvd3MgbWVtYmVyIGluaGVyaXRlZCBmcm9tIHR5cGUgJTIiLCA1NjAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAwKQorRElBRyh3YXJuX3NoaWZ0X2d0X3R5cGV3aWR0aCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAic2hpZnQgY291bnQgPj0gd2lkdGggb2YgdHlwZSIsIDU2NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fc2hpZnRfbGhzX25lZ2F0aXZlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJzaGlmdGluZyBhIG5lZ2F0aXZlIHNpZ25lZCB2YWx1ZSBpcyB1bmRlZmluZWQiLCA1NjcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3NoaWZ0X25lZ2F0aXZlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJzaGlmdCBjb3VudCBpcyBuZWdhdGl2ZSIsIDU2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fc2hpZnRfcmVzdWx0X2d0X3R5cGV3aWR0aCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAic2lnbmVkIHNoaWZ0IHJlc3VsdCAoJTApIHJlcXVpcmVzICUxIGJpdHMgdG8gcmVwcmVzZW50LCBidXQgJTIgb25seSBoYXMgJTMgYml0cyIsIDU2OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fc2hpZnRfcmVzdWx0X3NldHNfc2lnbl9iaXQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInNpZ25lZCBzaGlmdCByZXN1bHQgKCUwKSBzZXRzIHRoZSBzaWduIGJpdCBvZiB0aGUgc2hpZnQgZXhwcmVzc2lvbidzIHR5cGUgKCUxKSBhbmQgYmVjb21lcyBuZWdhdGl2ZSIsIDU3MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fc2lkZV9lZmZlY3RzX3R5cGVpZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZXhwcmVzc2lvbiB3aXRoIHNpZGUgZWZmZWN0cyB3aWxsIGJlIGV2YWx1YXRlZCBkZXNwaXRlIGJlaW5nIHVzZWQgYXMgYW4gb3BlcmFuZCB0byAndHlwZWlkJyIsIDUwOCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDMyKQorRElBRyh3YXJuX3NpZGVfZWZmZWN0c191bmV2YWx1YXRlZF9jb250ZXh0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleHByZXNzaW9uIHdpdGggc2lkZSBlZmZlY3RzIGhhcyBubyBlZmZlY3QgaW4gYW4gdW5ldmFsdWF0ZWQgY29udGV4dCIsIDY1MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDMyKQorRElBRyh3YXJuX3NpZ25lZF9iaXRmaWVsZF9lbnVtX2NvbnZlcnNpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInNpZ25lZCBiaXQtZmllbGQgJTAgbmVlZHMgYW4gZXh0cmEgYml0IHRvIHJlcHJlc2VudCB0aGUgbGFyZ2VzdCBwb3NpdGl2ZSBlbnVtZXJhdG9ycyBvZiAlMSIsIDU4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjQpCitESUFHKHdhcm5fc2l6ZW9mX2FycmF5X2RlY2F5LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJzaXplb2Ygb24gcG9pbnRlciBvcGVyYXRpb24gd2lsbCByZXR1cm4gc2l6ZSBvZiAlMCBpbnN0ZWFkIG9mICUxIiwgNTc3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9zaXplb2ZfYXJyYXlfcGFyYW0sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInNpemVvZiBvbiBhcnJheSBmdW5jdGlvbiBwYXJhbWV0ZXIgd2lsbCByZXR1cm4gc2l6ZSBvZiAlMCBpbnN0ZWFkIG9mICUxIiwgNTc2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9zaXplb2ZfcG9pbnRlcl9leHByX21lbWFjY2VzcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJyUwJyBjYWxsIG9wZXJhdGVzIG9uIG9iamVjdHMgb2YgdHlwZSAlMSB3aGlsZSB0aGUgc2l6ZSBpcyBiYXNlZCBvbiBhIGRpZmZlcmVudCB0eXBlICUyIiwgNTc4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9zaXplb2ZfcG9pbnRlcl9leHByX21lbWFjY2Vzc19ub3RlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZGlkIHlvdSBtZWFuIHRvICVzZWxlY3R7ZGVyZWZlcmVuY2UgdGhlIGFyZ3VtZW50IHRvICdzaXplb2YnIChhbmQgbXVsdGlwbHkgaXQgYnkgdGhlIG51bWJlciBvZiBlbGVtZW50cyl8cmVtb3ZlIHRoZSBhZGRyZXNzb2YgaW4gdGhlIGFyZ3VtZW50IHRvICdzaXplb2YnIChhbmQgbXVsdGlwbHkgaXQgYnkgdGhlIG51bWJlciBvZiBlbGVtZW50cyl8cHJvdmlkZSBhbiBleHBsaWNpdCBsZW5ndGh9MD8iLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9zaXplb2ZfcG9pbnRlcl90eXBlX21lbWFjY2VzcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYXJndW1lbnQgdG8gJ3NpemVvZicgaW4gJTAgY2FsbCBpcyB0aGUgc2FtZSBwb2ludGVyIHR5cGUgJTEgYXMgdGhlICVzZWxlY3R7ZGVzdGluYXRpb258c291cmNlfTI7IGV4cGVjdGVkICUzIG9yIGFuIGV4cGxpY2l0IGxlbmd0aCIsIDU3OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fc29tZXRpbWVzX3VuaW5pdF92YXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInZhcmlhYmxlICUwIGlzICVzZWxlY3R7dXNlZHxjYXB0dXJlZH0xIHVuaW5pdGlhbGl6ZWQgd2hlbmV2ZXIgJXNlbGVjdHsnJTMnIGNvbmRpdGlvbiBpcyAlc2VsZWN0e3RydWV8ZmFsc2V9NHwnJTMnIGxvb3AgJXNlbGVjdHtpcyBlbnRlcmVkfGV4aXRzIGJlY2F1c2UgaXRzIGNvbmRpdGlvbiBpcyBmYWxzZX00fCclMycgbG9vcCAlc2VsZWN0e2NvbmRpdGlvbiBpcyB0cnVlfGV4aXRzIGJlY2F1c2UgaXRzIGNvbmRpdGlvbiBpcyBmYWxzZX00fHN3aXRjaCAlMyBpcyB0YWtlbnxpdHMgZGVjbGFyYXRpb24gaXMgcmVhY2hlZHwlMyBpcyBjYWxsZWR9MiIsIDU4MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fc3RhbmRhbG9uZV9zcGVjaWZpZXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiclMCcgaWdub3JlZCBvbiB0aGlzIGRlY2xhcmF0aW9uIiwgMzgzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9zdGF0aWNfYXJyYXlfdG9vX3NtYWxsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJhcnJheSBhcmd1bWVudCBpcyB0b28gc21hbGw7IGNvbnRhaW5zICUwIGVsZW1lbnRzLCBjYWxsZWUgcmVxdWlyZXMgYXQgbGVhc3QgJTEiLCAzMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fc3RhdGljX2xvY2FsX2luX2V4dGVybl9pbmxpbmUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm5vbi1jb25zdGFudCBzdGF0aWMgbG9jYWwgdmFyaWFibGUgaW4gaW5saW5lIGZ1bmN0aW9uIG1heSBiZSBkaWZmZXJlbnQgaW4gZGlmZmVyZW50IGZpbGVzIiwgNTg3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9zdGF0aWNfbWFpbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJ21haW4nIHNob3VsZCBub3QgYmUgZGVjbGFyZWQgc3RhdGljIiwgMzQyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9zdGF0aWNfc2VsZl9yZWZlcmVuY2VfaW5faW5pdCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAic3RhdGljIHZhcmlhYmxlICUwIGlzIHN1c3BpY2lvdXNseSB1c2VkIHdpdGhpbiBpdHMgb3duIGluaXRpYWxpemF0aW9uIiwgNTg4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9zdHJpY3RfbXVsdGlwbGVfbWV0aG9kX2RlY2wsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm11bHRpcGxlIG1ldGhvZHMgbmFtZWQgJTAgZm91bmQiLCA2MDEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3N0cmljdF9wcm90b3R5cGVzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ0aGlzICVzZWxlY3R7ZnVuY3Rpb24gZGVjbGFyYXRpb24gaXMgbm90fGJsb2NrIGRlY2xhcmF0aW9uIGlzIG5vdHxvbGQtc3R5bGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBub3QgcHJlY2VkZWQgYnl9MCBhIHByb3RvdHlwZSIsIDYwMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fc3RyaW5nX3BsdXNfY2hhciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYWRkaW5nICUwIHRvIGEgc3RyaW5nIHBvaW50ZXIgZG9lcyBub3QgYXBwZW5kIHRvIHRoZSBzdHJpbmciLCA2MDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3N0cmluZ19wbHVzX2ludCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYWRkaW5nICUwIHRvIGEgc3RyaW5nIGRvZXMgbm90IGFwcGVuZCB0byB0aGUgc3RyaW5nIiwgNjA1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9zdHJpbmdjb21wYXJlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJyZXN1bHQgb2YgY29tcGFyaXNvbiBhZ2FpbnN0ICVzZWxlY3R7YSBzdHJpbmcgbGl0ZXJhbHxAZW5jb2RlfTAgaXMgdW5zcGVjaWZpZWQgKHVzZSBzdHJuY21wIGluc3RlYWQpIiwgNjAyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9zdHJsY3B5Y2F0X3dyb25nX3NpemUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInNpemUgYXJndW1lbnQgaW4gJTAgY2FsbCBhcHBlYXJzIHRvIGJlIHNpemUgb2YgdGhlIHNvdXJjZTsgZXhwZWN0ZWQgdGhlIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIiwgNjA2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9zdHJuY2F0X2xhcmdlX3NpemUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInRoZSB2YWx1ZSBvZiB0aGUgc2l6ZSBhcmd1bWVudCBpbiAnc3RybmNhdCcgaXMgdG9vIGxhcmdlLCBtaWdodCBsZWFkIHRvIGEgYnVmZmVyIG92ZXJmbG93IiwgNjA3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9zdHJuY2F0X3NyY19zaXplLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJzaXplIGFyZ3VtZW50IGluICdzdHJuY2F0JyBjYWxsIGFwcGVhcnMgdG8gYmUgc2l6ZSBvZiB0aGUgc291cmNlIiwgNjA3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9zdHJuY2F0X3dyb25nX3NpemUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInRoZSB2YWx1ZSBvZiB0aGUgc2l6ZSBhcmd1bWVudCB0byAnc3RybmNhdCcgaXMgd3JvbmciLCA2MDcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3N0cnVjdF9jbGFzc19wcmV2aW91c190YWdfbWlzbWF0Y2gsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiUyIGRlZmluZWQgYXMgJXNlbGVjdHthIHN0cnVjdHxhbiBpbnRlcmZhY2V8YSBjbGFzc30wJXNlbGVjdHt8IHRlbXBsYXRlfTEgaGVyZSBidXQgcHJldmlvdXNseSBkZWNsYXJlZCBhcyAlc2VsZWN0e2Egc3RydWN0fGFuIGludGVyZmFjZXxhIGNsYXNzfTMlc2VsZWN0e3wgdGVtcGxhdGV9MSIsIDM4MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fc3RydWN0X2NsYXNzX3RhZ19taXNtYXRjaCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJXNlbGVjdHtzdHJ1Y3R8aW50ZXJmYWNlfGNsYXNzfTAlc2VsZWN0e3wgdGVtcGxhdGV9MSAlMiB3YXMgcHJldmlvdXNseSBkZWNsYXJlZCBhcyBhICVzZWxlY3R7c3RydWN0fGludGVyZmFjZXxjbGFzc30zJXNlbGVjdHt8IHRlbXBsYXRlfTEiLCAzODEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3N1Yl9wdHJfemVyb19zaXplX3R5cGVzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJzdWJ0cmFjdGlvbiBvZiBwb2ludGVycyB0byB0eXBlICUwIG9mIHplcm8gc2l6ZSBoYXMgdW5kZWZpbmVkIGJlaGF2aW9yIiwgNTAzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl9zdWJvYmplY3RfaW5pdGlhbGl6ZXJfb3ZlcnJpZGVzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJzdWJvYmplY3QgaW5pdGlhbGl6YXRpb24gb3ZlcnJpZGVzIGluaXRpYWxpemF0aW9uIG9mIG90aGVyIGZpZWxkcyB3aXRoaW4gaXRzIGVuY2xvc2luZyBzdWJvYmplY3QiLCAzMDMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3N1YnNjcmlwdF9pc19jaGFyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJhcnJheSBzdWJzY3JpcHQgaXMgb2YgdHlwZSAnY2hhciciLCAxMTgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3N1Z2dlc3Rfbm9yZXR1cm5fYmxvY2ssIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImJsb2NrIGNvdWxkIGJlIGRlY2xhcmVkIHdpdGggYXR0cmlidXRlICdub3JldHVybiciLCAzOTAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3N1Z2dlc3Rfbm9yZXR1cm5fZnVuY3Rpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiVzZWxlY3R7ZnVuY3Rpb258bWV0aG9kfTAgJTEgY291bGQgYmUgZGVjbGFyZWQgd2l0aCBhdHRyaWJ1dGUgJ25vcmV0dXJuJyIsIDM5MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fc3VwZXJjbGFzc192YXJpYWJsZV9zaXplZF90eXBlX25vdF9hdF9lbmQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImZpZWxkICUwIGNhbiBvdmVyd3JpdGUgaW5zdGFuY2UgdmFyaWFibGUgJTEgd2l0aCB2YXJpYWJsZSBzaXplZCB0eXBlICUyIGluIHN1cGVyY2xhc3MgJTMiLCA0NDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3N5bmNfZmV0Y2hfYW5kX25hbmRfc2VtYW50aWNzX2NoYW5nZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidGhlIHNlbWFudGljcyBvZiB0aGlzIGludHJpbnNpYyBjaGFuZ2VkIHdpdGggR0NDIHZlcnNpb24gNC40IC0gdGhlIG5ld2VyIHNlbWFudGljcyBhcmUgcHJvdmlkZWQgaGVyZSIsIDYxMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdGFraW5nX2FkZHJlc3Nfb2ZfcGFja2VkX21lbWJlciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidGFraW5nIGFkZHJlc3Mgb2YgcGFja2VkIG1lbWJlciAlMCBvZiBjbGFzcyBvciBzdHJ1Y3R1cmUgJXExIG1heSByZXN1bHQgaW4gYW4gdW5hbGlnbmVkIHBvaW50ZXIgdmFsdWUiLCAxMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdGF1dG9sb2dpY2FsX2Jvb2xfY29tcGFyZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicmVzdWx0IG9mIGNvbXBhcmlzb24gb2YgJXNlbGVjdHtjb25zdGFudCAlMHx0cnVlfGZhbHNlfTEgd2l0aCAlc2VsZWN0e2V4cHJlc3Npb24gb2YgdHlwZSAlMnxib29sZWFuIGV4cHJlc3Npb259MyBpcyBhbHdheXMgJTQiLCA2MTYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3RhdXRvbG9naWNhbF9jb25zdGFudF9jb21wYXJlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJyZXN1bHQgb2YgY29tcGFyaXNvbiAlc2VsZWN0eyUzfCUxfTAgJTIgJXNlbGVjdHslMXwlM30wIGlzIGFsd2F5cyAlNCIsIDYyMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdGF1dG9sb2dpY2FsX292ZXJsYXBfY29tcGFyaXNvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAib3ZlcmxhcHBpbmcgY29tcGFyaXNvbnMgYWx3YXlzIGV2YWx1YXRlIHRvICVzZWxlY3R7ZmFsc2V8dHJ1ZX0wIiwgNjE5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl90ZW1wbGF0ZV9hcmdfbmVnYXRpdmUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm5vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50IHdpdGggdmFsdWUgJyUwJyBjb252ZXJ0ZWQgdG8gJyUxJyBmb3IgdW5zaWduZWQgdGVtcGxhdGUgcGFyYW1ldGVyIG9mIHR5cGUgJTIiLCAxMzMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNCkKK0RJQUcod2Fybl90ZW1wbGF0ZV9hcmdfdG9vX2xhcmdlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCB2YWx1ZSAnJTAnIHRydW5jYXRlZCB0byAnJTEnIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YgdHlwZSAlMiIsIDEzMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDI0KQorRElBRyh3YXJuX3RlbXBsYXRlX2V4cG9ydF91bnN1cHBvcnRlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZXhwb3J0ZWQgdGVtcGxhdGVzIGFyZSB1bnN1cHBvcnRlZCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3RlbXBsYXRlX3F1YWxpZmllZF9mcmllbmRfaWdub3JlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZGVwZW5kZW50IG5lc3RlZCBuYW1lIHNwZWNpZmllciAnJTAnIGZvciBmcmllbmQgdGVtcGxhdGUgZGVjbGFyYXRpb24gaXMgbm90IHN1cHBvcnRlZDsgaWdub3JpbmcgdGhpcyBmcmllbmQgZGVjbGFyYXRpb24iLCA2NzYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3RlbXBsYXRlX3F1YWxpZmllZF9mcmllbmRfdW5zdXBwb3J0ZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImRlcGVuZGVudCBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIgJyUwJyBmb3IgZnJpZW5kIGNsYXNzIGRlY2xhcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQ7IHR1cm5pbmcgb2ZmIGFjY2VzcyBjb250cm9sIGZvciAlMSIsIDY3NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdGVtcGxhdGVfc3BlY19leHRyYV9oZWFkZXJzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleHRyYW5lb3VzIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0IGluIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdGVtcG9yYXJ5X2FycmF5X3RvX3BvaW50ZXJfZGVjYXksIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInBvaW50ZXIgaXMgaW5pdGlhbGl6ZWQgYnkgYSB0ZW1wb3JhcnkgYXJyYXksIHdoaWNoIHdpbGwgYmUgZGVzdHJveWVkIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bGwtZXhwcmVzc2lvbiIsIDEyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl90ZW50YXRpdmVfaW5jb21wbGV0ZV9hcnJheSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidGVudGF0aXZlIGFycmF5IGRlZmluaXRpb24gYXNzdW1lZCB0byBoYXZlIG9uZSBlbGVtZW50IiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdGhpc19ib29sX2NvbnZlcnNpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIid0aGlzJyBwb2ludGVyIGNhbm5vdCBiZSBudWxsIGluIHdlbGwtZGVmaW5lZCBDKysgY29kZTsgcG9pbnRlciBtYXkgYmUgYXNzdW1lZCB0byBhbHdheXMgY29udmVydCB0byB0cnVlIiwgNjQzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjQpCitESUFHKHdhcm5fdGhpc19udWxsX2NvbXBhcmUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIid0aGlzJyBwb2ludGVyIGNhbm5vdCBiZSBudWxsIGluIHdlbGwtZGVmaW5lZCBDKysgY29kZTsgY29tcGFyaXNvbiBtYXkgYmUgYXNzdW1lZCB0byBhbHdheXMgZXZhbHVhdGUgdG8gJXNlbGVjdHt0cnVlfGZhbHNlfTAiLCA2MjIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3RocmVhZF9hdHRyaWJ1dGVfYXJndW1lbnRfbm90X2xvY2thYmxlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlMCBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHdob3NlIHR5cGUgaXMgYW5ub3RhdGVkIHdpdGggJ2NhcGFiaWxpdHknIGF0dHJpYnV0ZTsgdHlwZSBoZXJlIGlzICUxIiwgNjI4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl90aHJlYWRfYXR0cmlidXRlX2RlY2xfbm90X2xvY2thYmxlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlMCBhdHRyaWJ1dGUgY2FuIG9ubHkgYmUgYXBwbGllZCBpbiBhIGNvbnRleHQgYW5ub3RhdGVkIHdpdGggJ2NhcGFiaWxpdHkoXCJtdXRleFwiKScgYXR0cmlidXRlIiwgNjI4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl90aHJlYWRfYXR0cmlidXRlX2RlY2xfbm90X3BvaW50ZXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiUwIG9ubHkgYXBwbGllcyB0byBwb2ludGVyIHR5cGVzOyB0eXBlIGhlcmUgaXMgJTEiLCA2MjgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3RocmVhZF9hdHRyaWJ1dGVfaWdub3JlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiaWdub3JpbmcgJTAgYXR0cmlidXRlIGJlY2F1c2UgaXRzIGFyZ3VtZW50IGlzIGludmFsaWQiLCA2MjgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3RocmVhZF9zYWZldHlfYmV0YSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiVGhyZWFkIHNhZmV0eSBiZXRhIHdhcm5pbmcuIiwgNjI5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl90aHJlYWRfc2FmZXR5X3ZlcmJvc2UsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIlRocmVhZCBzYWZldHkgdmVyYm9zZSB3YXJuaW5nLiIsIDYzMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdGhyb3dfaW5fbm9leGNlcHRfZnVuYywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgaGFzIGEgbm9uLXRocm93aW5nIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGJ1dCBjYW4gc3RpbGwgdGhyb3ciLCAxOTksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3RyYW5zcGFyZW50X3VuaW9uX2F0dHJpYnV0ZV9maWVsZF9zaXplX2FsaWduLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICIlc2VsZWN0e2FsaWdubWVudHxzaXplfTAgb2YgZmllbGQgJTEgKCUyIGJpdHMpIGRvZXMgbm90IG1hdGNoIHRoZSAlc2VsZWN0e2FsaWdubWVudHxzaXplfTAgb2YgdGhlIGZpcnN0IGZpZWxkIGluIHRyYW5zcGFyZW50IHVuaW9uOyB0cmFuc3BhcmVudF91bmlvbiBhdHRyaWJ1dGUgaWdub3JlZCIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdHJhbnNwYXJlbnRfdW5pb25fYXR0cmlidXRlX2Zsb2F0aW5nLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJmaXJzdCBmaWVsZCBvZiBhIHRyYW5zcGFyZW50IHVuaW9uIGNhbm5vdCBoYXZlICVzZWxlY3R7ZmxvYXRpbmcgcG9pbnR8dmVjdG9yfTAgdHlwZSAlMTsgdHJhbnNwYXJlbnRfdW5pb24gYXR0cmlidXRlIGlnbm9yZWQiLCAyNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3RyYW5zcGFyZW50X3VuaW9uX2F0dHJpYnV0ZV9ub3RfZGVmaW5pdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidHJhbnNwYXJlbnRfdW5pb24gYXR0cmlidXRlIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYSB1bmlvbiBkZWZpbml0aW9uOyBhdHRyaWJ1dGUgaWdub3JlZCIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdHJhbnNwYXJlbnRfdW5pb25fYXR0cmlidXRlX3plcm9fZmllbGRzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ0cmFuc3BhcmVudCB1bmlvbiBkZWZpbml0aW9uIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZmllbGQ7IHRyYW5zcGFyZW50X3VuaW9uIGF0dHJpYnV0ZSBpZ25vcmVkIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl90eXBlX2F0dHJpYnV0ZV93cm9uZ190eXBlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICInJTAnIG9ubHkgYXBwbGllcyB0byAlc2VsZWN0e2Z1bmN0aW9ufHBvaW50ZXJ8T2JqZWN0aXZlLUMgb2JqZWN0IG9yIGJsb2NrIHBvaW50ZXJ9MSB0eXBlczsgdHlwZSBoZXJlIGlzICUyIiwgMjY1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl90eXBlX3NhZmV0eV9udWxsX3BvaW50ZXJfcmVxdWlyZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInNwZWNpZmllZCAlMCB0eXBlIHRhZyByZXF1aXJlcyBhIG51bGwgcG9pbnRlciIsIDYzNiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdHlwZV9zYWZldHlfdHlwZV9taXNtYXRjaCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYXJndW1lbnQgdHlwZSAlMCBkb2Vzbid0IG1hdGNoIHNwZWNpZmllZCAlMSB0eXBlIHRhZyAlc2VsZWN0e3RoYXQgcmVxdWlyZXMgJTN8fTIiLCA2MzYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3R5cGVfdGFnX2Zvcl9kYXRhdHlwZV93cm9uZ19raW5kLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ0aGlzIHR5cGUgdGFnIHdhcyBub3QgZGVzaWduZWQgdG8gYmUgdXNlZCB3aXRoIHRoaXMgZnVuY3Rpb24iLCA2MzYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3R5cGVjaGVja19mdW5jdGlvbl9xdWFsaWZpZXJzX2lnbm9yZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiclMCcgcXVhbGlmaWVyIG9uIGZ1bmN0aW9uIHR5cGUgJTEgaGFzIG5vIGVmZmVjdCIsIDI3MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdHlwZWNoZWNrX2Z1bmN0aW9uX3F1YWxpZmllcnNfdW5zcGVjaWZpZWQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiclMCcgcXVhbGlmaWVyIG9uIGZ1bmN0aW9uIHR5cGUgJTEgaGFzIHVuc3BlY2lmaWVkIGJlaGF2aW9yIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdHlwZWNoZWNrX3JlZmVyZW5jZV9xdWFsaWZpZXJzLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICInJTAnIHF1YWxpZmllciBvbiByZWZlcmVuY2UgdHlwZSAlMSBoYXMgbm8gZWZmZWN0IiwgMjcwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl90eXBlY2hlY2tfdmVjdG9yX2VsZW1lbnRfc2l6ZXNfbm90X2VxdWFsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidmVjdG9yIG9wZXJhbmRzIGRvIG5vdCBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzIHNpemVzICglMCBhbmQgJTEpIiwgNzA4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl90eXBlY2hlY2tfemVyb19zdGF0aWNfYXJyYXlfc2l6ZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJ3N0YXRpYycgaGFzIG5vIGVmZmVjdCBvbiB6ZXJvLWxlbmd0aCBhcnJheXMiLCAzMywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdW5hbm5vdGF0ZWRfZmFsbHRocm91Z2gsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVuYW5ub3RhdGVkIGZhbGwtdGhyb3VnaCBiZXR3ZWVuIHN3aXRjaCBsYWJlbHMiLCAyNzUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3VuYW5ub3RhdGVkX2ZhbGx0aHJvdWdoX3Blcl9mdW5jdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidW5hbm5vdGF0ZWQgZmFsbC10aHJvdWdoIGJldHdlZW4gc3dpdGNoIGxhYmVscyBpbiBwYXJ0bHktYW5ub3RhdGVkIGZ1bmN0aW9uIiwgMjc2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91bmF2YWlsYWJsZV9kZWYsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImltcGxlbWVudGluZyB1bmF2YWlsYWJsZSBtZXRob2QiLCAxNTcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3VuYXZhaWxhYmxlX2Z3ZGNsYXNzX21lc3NhZ2UsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiUwIG1heSBiZSB1bmF2YWlsYWJsZSBiZWNhdXNlIHRoZSByZWNlaXZlciB0eXBlIGlzIHVua25vd24iLCA2NDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3VuZGVjbGFyZWRfc2VsZWN0b3IsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVuZGVjbGFyZWQgc2VsZWN0b3IgJTAiLCA2NDEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3VuZGVjbGFyZWRfc2VsZWN0b3Jfd2l0aF90eXBvLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ1bmRlY2xhcmVkIHNlbGVjdG9yICUwOyBkaWQgeW91IG1lYW4gJTE/IiwgNjQxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91bmRlZl9pbnRlcmZhY2UsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImNhbm5vdCBmaW5kIGludGVyZmFjZSBkZWNsYXJhdGlvbiBmb3IgJTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91bmRlZl9pbnRlcmZhY2Vfc3VnZ2VzdCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY2Fubm90IGZpbmQgaW50ZXJmYWNlIGRlY2xhcmF0aW9uIGZvciAlMDsgZGlkIHlvdSBtZWFuICUxPyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3VuZGVmX21ldGhvZF9pbXBsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJtZXRob2QgZGVmaW5pdGlvbiBmb3IgJTAgbm90IGZvdW5kIiwgMjk0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91bmRlZl9wcm90b2NvbHJlZiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiY2Fubm90IGZpbmQgcHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IgJTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91bmRlZmluZWRfaW5saW5lLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpbmxpbmUgZnVuY3Rpb24gJXEwIGlzIG5vdCBkZWZpbmVkIiwgNjQ1LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91bmRlZmluZWRfaW50ZXJuYWwsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiVzZWxlY3R7ZnVuY3Rpb258dmFyaWFibGV9MCAlcTEgaGFzIGludGVybmFsIGxpbmthZ2UgYnV0IGlzIG5vdCBkZWZpbmVkIiwgNjQ2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91bmRlZmluZWRfcmVpbnRlcnByZXRfY2FzdCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAicmVpbnRlcnByZXRfY2FzdCBmcm9tICUwIHRvICUxIGhhcyB1bmRlZmluZWQgYmVoYXZpb3IiLCA2NDgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3VuZ3VhcmRlZF9hdmFpbGFiaWxpdHksIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiUwIGlzIG9ubHkgYXZhaWxhYmxlIG9uICUxICUyIG9yIG5ld2VyIiwgNjUxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91bmd1YXJkZWRfYXZhaWxhYmlsaXR5X25ldywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJTAgaXMgb25seSBhdmFpbGFibGUgb24gJTEgJTIgb3IgbmV3ZXIiLCA2NTIsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3VuaGFuZGxlZF9tc19hdHRyaWJ1dGVfaWdub3JlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiX19kZWNsc3BlYyBhdHRyaWJ1dGUgJTAgaXMgbm90IHN1cHBvcnRlZCIsIDI2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdW5pbXBsZW1lbnRlZF9wcm90b2NvbF9tZXRob2QsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIm1ldGhvZCAlMCBpbiBwcm90b2NvbCAlMSBub3QgaW1wbGVtZW50ZWQiLCA1MjQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3VuaW1wbGVtZW50ZWRfc2VsZWN0b3IsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIm5vIG1ldGhvZCB3aXRoIHNlbGVjdG9yICUwIGlzIGltcGxlbWVudGVkIGluIHRoaXMgdHJhbnNsYXRpb24gdW5pdCIsIDU0OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdW5pbml0X2J5cmVmX2Jsb2NrdmFyX2NhcHR1cmVkX2J5X2Jsb2NrLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJibG9jayBwb2ludGVyIHZhcmlhYmxlICUwIGlzIHVuaW5pdGlhbGl6ZWQgd2hlbiBjYXB0dXJlZCBieSBibG9jayIsIDY1NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdW5pbml0X3NlbGZfcmVmZXJlbmNlX2luX2luaXQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInZhcmlhYmxlICUwIGlzIHVuaW5pdGlhbGl6ZWQgd2hlbiB1c2VkIHdpdGhpbiBpdHMgb3duIGluaXRpYWxpemF0aW9uIiwgNjU2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91bmluaXRfc2VsZl9yZWZlcmVuY2VfaW5fcmVmZXJlbmNlX2luaXQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgInJlZmVyZW5jZSAlMCBpcyBub3QgeWV0IGJvdW5kIHRvIGEgdmFsdWUgd2hlbiB1c2VkIHdpdGhpbiBpdHMgb3duIGluaXRpYWxpemF0aW9uIiwgNjU2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91bmluaXRfdmFyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ2YXJpYWJsZSAlMCBpcyB1bmluaXRpYWxpemVkIHdoZW4gJXNlbGVjdHt1c2VkIGhlcmV8Y2FwdHVyZWQgYnkgYmxvY2t9MSIsIDY1NiwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdW5rbm93bl9hdHRyaWJ1dGVfaWdub3JlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidW5rbm93biBhdHRyaWJ1dGUgJTAgaWdub3JlZCIsIDY1OCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdW5rbm93bl9zYW5pdGl6ZXJfaWdub3JlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidW5rbm93biBzYW5pdGl6ZXIgJyUwJyBpZ25vcmVkIiwgNjYxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91bmxvY2tfYnV0X25vX2xvY2ssIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInJlbGVhc2luZyAlMCAnJTEnIHRoYXQgd2FzIG5vdCBoZWxkIiwgNjI3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91bmxvY2tfa2luZF9taXNtYXRjaCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAicmVsZWFzaW5nICUwICclMScgdXNpbmcgJXNlbGVjdHtzaGFyZWR8ZXhjbHVzaXZlfTIgYWNjZXNzLCBleHBlY3RlZCAlc2VsZWN0e3NoYXJlZHxleGNsdXNpdmV9MyBhY2Nlc3MiLCA2MjcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3VubmVjZXNzYXJ5X3BhY2tlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAicGFja2VkIGF0dHJpYnV0ZSBpcyB1bm5lY2Vzc2FyeSBmb3IgJTAiLCA0OTAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3VubmVlZGVkX2ludGVybmFsX2RlY2wsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiVzZWxlY3R7ZnVuY3Rpb258dmFyaWFibGV9MCAlMSBpcyBub3QgbmVlZGVkIGFuZCB3aWxsIG5vdCBiZSBlbWl0dGVkIiwgNjY0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMzIpCitESUFHKHdhcm5fdW5uZWVkZWRfbWVtYmVyX2Z1bmN0aW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJtZW1iZXIgZnVuY3Rpb24gJTAgaXMgbm90IG5lZWRlZCBhbmQgd2lsbCBub3QgYmUgZW1pdHRlZCIsIDY2NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdW5uZWVkZWRfc3RhdGljX2ludGVybmFsX2RlY2wsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIidzdGF0aWMnIGZ1bmN0aW9uICUwIGRlY2xhcmVkIGluIGhlYWRlciBmaWxlIHNob3VsZCBiZSBkZWNsYXJlZCAnc3RhdGljIGlubGluZSciLCA2NjQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAzMikKK0RJQUcod2Fybl91bnJlYWNoYWJsZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiY29kZSB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkIiwgNjY2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91bnJlYWNoYWJsZV9icmVhaywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJ2JyZWFrJyB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkIiwgNjY4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91bnJlYWNoYWJsZV9kZWZhdWx0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJkZWZhdWx0IGxhYmVsIGluIHN3aXRjaCB3aGljaCBjb3ZlcnMgYWxsIGVudW1lcmF0aW9uIHZhbHVlcyIsIDEzNywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdW5yZWFjaGFibGVfbG9vcF9pbmNyZW1lbnQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgImxvb3Agd2lsbCBydW4gYXQgbW9zdCBvbmNlIChsb29wIGluY3JlbWVudCBuZXZlciBleGVjdXRlZCkiLCA2NjksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3VucmVhY2hhYmxlX3JldHVybiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJ3JldHVybicgd2lsbCBuZXZlciBiZSBleGVjdXRlZCIsIDY3MCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdW5zZXF1ZW5jZWRfbW9kX21vZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAibXVsdGlwbGUgdW5zZXF1ZW5jZWQgbW9kaWZpY2F0aW9ucyB0byAlMCIsIDY3MSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdW5zZXF1ZW5jZWRfbW9kX3VzZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidW5zZXF1ZW5jZWQgbW9kaWZpY2F0aW9uIGFuZCBhY2Nlc3MgdG8gJTAiLCA2NzEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3Vuc2lnbmVkX2FicywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidGFraW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB1bnNpZ25lZCB0eXBlICUwIGhhcyBubyBlZmZlY3QiLCA4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91bnNpZ25lZF9hbHdheXNfdHJ1ZV9jb21wYXJpc29uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJyZXN1bHQgb2YgY29tcGFyaXNvbiBvZiAlc2VsZWN0eyUzfHVuc2lnbmVkIGV4cHJlc3Npb259MCAlMiAlc2VsZWN0e3Vuc2lnbmVkIGV4cHJlc3Npb258JTN9MCBpcyBhbHdheXMgJTQiLCA2MjQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3Vuc2lnbmVkX2JpdGZpZWxkX2Fzc2lnbmVkX3NpZ25lZF9lbnVtLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJhc3NpZ25pbmcgdmFsdWUgb2Ygc2lnbmVkIGVudW0gdHlwZSAlMSB0byB1bnNpZ25lZCBiaXQtZmllbGQgJTA7IG5lZ2F0aXZlIGVudW1lcmF0b3JzIG9mIGVudW0gJTEgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gcG9zaXRpdmUgdmFsdWVzIiwgNTgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNCkKK0RJQUcod2Fybl91bnNpZ25lZF9lbnVtX2Fsd2F5c190cnVlX2NvbXBhcmlzb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInJlc3VsdCBvZiBjb21wYXJpc29uIG9mICVzZWxlY3R7JTN8dW5zaWduZWQgZW51bSBleHByZXNzaW9ufTAgJTIgJXNlbGVjdHt1bnNpZ25lZCBlbnVtIGV4cHJlc3Npb258JTN9MCBpcyBhbHdheXMgJTQiLCA2MjMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3Vuc3VwcG9ydGVkX3RhcmdldF9hdHRyaWJ1dGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiVzZWxlY3R7dW5zdXBwb3J0ZWR8ZHVwbGljYXRlfTAlc2VsZWN0e3wgYXJjaGl0ZWN0dXJlfTEgJyUyJyBpbiB0aGUgJ3RhcmdldCcgYXR0cmlidXRlIHN0cmluZzsgJ3RhcmdldCcgYXR0cmlidXRlIGlnbm9yZWQiLCAyNjUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3VudXNlZF9jYWxsLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpZ25vcmluZyByZXR1cm4gdmFsdWUgb2YgZnVuY3Rpb24gZGVjbGFyZWQgd2l0aCAlMCBhdHRyaWJ1dGUiLCA3MDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAzMikKK0RJQUcod2Fybl91bnVzZWRfY29tcGFyaXNvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJXNlbGVjdHtlcXVhbGl0eXxpbmVxdWFsaXR5fHJlbGF0aW9uYWx8dGhyZWUtd2F5fTAgY29tcGFyaXNvbiByZXN1bHQgdW51c2VkIiwgNjg0LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMzIpCitESUFHKHdhcm5fdW51c2VkX2NvbnN0X3ZhcmlhYmxlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ1bnVzZWQgdmFyaWFibGUgJTAiLCA2ODUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAzMikKK0RJQUcod2Fybl91bnVzZWRfY29udGFpbmVyX3N1YnNjcmlwdF9leHByLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJjb250YWluZXIgYWNjZXNzIHJlc3VsdCB1bnVzZWQgLSBjb250YWluZXIgYWNjZXNzIHNob3VsZCBub3QgYmUgdXNlZCBmb3Igc2lkZSBlZmZlY3RzIiwgNzAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMzIpCitESUFHKHdhcm5fdW51c2VkX2V4Y2VwdGlvbl9wYXJhbSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidW51c2VkIGV4Y2VwdGlvbiBwYXJhbWV0ZXIgJTAiLCA2ODYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3VudXNlZF9leHByLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleHByZXNzaW9uIHJlc3VsdCB1bnVzZWQiLCA3MDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAzMikKK0RJQUcod2Fybl91bnVzZWRfZnVuY3Rpb24sIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVudXNlZCBmdW5jdGlvbiAlMCIsIDY4NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDMyKQorRElBRyh3YXJuX3VudXNlZF9sYWJlbCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidW51c2VkIGxhYmVsICUwIiwgNjg5LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMzIpCitESUFHKHdhcm5fdW51c2VkX2xhbWJkYV9jYXB0dXJlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJsYW1iZGEgY2FwdHVyZSAlMCBpcyBub3QgJXNlbGVjdHt1c2VkfHJlcXVpcmVkIHRvIGJlIGNhcHR1cmVkIGZvciB0aGlzIHVzZX0xIiwgNjkwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMzIpCitESUFHKHdhcm5fdW51c2VkX2xvY2FsX3R5cGVkZWYsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVudXNlZCAlc2VsZWN0e3R5cGVkZWZ8dHlwZSBhbGlhc30wICUxIiwgNjkxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMzIpCitESUFHKHdhcm5fdW51c2VkX21lbWJlcl9mdW5jdGlvbiwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidW51c2VkIG1lbWJlciBmdW5jdGlvbiAlMCIsIDY5NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdW51c2VkX3BhcmFtZXRlciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidW51c2VkIHBhcmFtZXRlciAlMCIsIDY5NSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdW51c2VkX3ByaXZhdGVfZmllbGQsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInByaXZhdGUgZmllbGQgJTAgaXMgbm90IHVzZWQiLCA2OTYsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAzMikKK0RJQUcod2Fybl91bnVzZWRfcHJvcGVydHlfYmFja2luZ19pdmFyLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJpdmFyICUwIHdoaWNoIGJhY2tzIHRoZSBwcm9wZXJ0eSBpcyBub3QgcmVmZXJlbmNlZCBpbiB0aGlzIHByb3BlcnR5J3MgYWNjZXNzb3IiLCA2OTcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAzMikKK0RJQUcod2Fybl91bnVzZWRfcHJvcGVydHlfZXhwciwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicHJvcGVydHkgYWNjZXNzIHJlc3VsdCB1bnVzZWQgLSBnZXR0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCBmb3Igc2lkZSBlZmZlY3RzIiwgNjg4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91bnVzZWRfcmVzdWx0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJpZ25vcmluZyByZXR1cm4gdmFsdWUgb2YgZnVuY3Rpb24gZGVjbGFyZWQgd2l0aCAlMCBhdHRyaWJ1dGUiLCA2OTgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAzMikKK0RJQUcod2Fybl91bnVzZWRfdGVtcGxhdGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVudXNlZCAlc2VsZWN0e2Z1bmN0aW9ufHZhcmlhYmxlfTAgdGVtcGxhdGUgJTEiLCA2OTksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3VudXNlZF92YXJpYWJsZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidW51c2VkIHZhcmlhYmxlICUwIiwgNzAxLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMzIpCitESUFHKHdhcm5fdW51c2VkX3ZvaWRwdHIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImV4cHJlc3Npb24gcmVzdWx0IHVudXNlZDsgc2hvdWxkIHRoaXMgY2FzdCBiZSB0byAndm9pZCc/IiwgNzAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMzIpCitESUFHKHdhcm5fdW51c2VkX3ZvbGF0aWxlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJleHByZXNzaW9uIHJlc3VsdCB1bnVzZWQ7IGFzc2lnbiBpbnRvIGEgdmFyaWFibGUgdG8gZm9yY2UgYSB2b2xhdGlsZSBsb2FkIiwgNzAyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91c2VfaW5faW52YWxpZF9zdGF0ZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiaW52YWxpZCBpbnZvY2F0aW9uIG9mIG1ldGhvZCAnJTAnIG9uIG9iamVjdCAnJTEnIHdoaWxlIGl0IGlzIGluIHRoZSAnJTInIHN0YXRlIiwgMTMyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91c2Vfb2ZfdGVtcF9pbl9pbnZhbGlkX3N0YXRlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJpbnZhbGlkIGludm9jYXRpb24gb2YgbWV0aG9kICclMCcgb24gYSB0ZW1wb3Jhcnkgb2JqZWN0IHdoaWxlIGl0IGlzIGluIHRoZSAnJTEnIHN0YXRlIiwgMTMyLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl91c2VkX2J1dF9tYXJrZWRfdW51c2VkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlMCB3YXMgbWFya2VkIHVudXNlZCBidXQgd2FzIHVzZWQiLCA3MDMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3VzZXJfbGl0ZXJhbF9yZXNlcnZlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidXNlci1kZWZpbmVkIGxpdGVyYWwgc3VmZml4ZXMgbm90IHN0YXJ0aW5nIHdpdGggJ18nIGFyZSByZXNlcnZlZCVzZWxlY3R7OyBubyBsaXRlcmFsIHdpbGwgaW52b2tlIHRoaXMgb3BlcmF0b3J8fTAiLCA3MDQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3VzaW5nX2RpcmVjdGl2ZV9pbl9oZWFkZXIsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInVzaW5nIG5hbWVzcGFjZSBkaXJlY3RpdmUgaW4gZ2xvYmFsIGNvbnRleHQgaW4gaGVhZGVyIiwgMjYzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl92YV9zdGFydF90eXBlX2lzX3VuZGVmaW5lZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAicGFzc2luZyAlc2VsZWN0e2FuIG9iamVjdCB0aGF0IHVuZGVyZ29lcyBkZWZhdWx0IGFyZ3VtZW50IHByb21vdGlvbnxhbiBvYmplY3Qgb2YgcmVmZXJlbmNlIHR5cGV8YSBwYXJhbWV0ZXIgZGVjbGFyZWQgd2l0aCB0aGUgJ3JlZ2lzdGVyJyBrZXl3b3JkfTAgdG8gJ3ZhX3N0YXJ0JyBoYXMgdW5kZWZpbmVkIGJlaGF2aW9yIiwgNzA2LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl92YXJfZGVyZWZfcmVxdWlyZXNfYW55X2xvY2ssIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiVzZWxlY3R7cmVhZGluZ3x3cml0aW5nfTEgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJTAgcmVxdWlyZXMgaG9sZGluZyAlc2VsZWN0e2FueSBtdXRleHxhbnkgbXV0ZXggZXhjbHVzaXZlbHl9MSIsIDYyNywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdmFyX2RlcmVmX3JlcXVpcmVzX2xvY2ssIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiVzZWxlY3R7cmVhZGluZ3x3cml0aW5nfTMgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJTEgcmVxdWlyZXMgaG9sZGluZyAlMCAlc2VsZWN0eyclMid8JyUyJyBleGNsdXNpdmVseX0zIiwgNjI3LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl92YXJfZGVyZWZfcmVxdWlyZXNfbG9ja19wcmVjaXNlLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlc2VsZWN0e3JlYWRpbmd8d3JpdGluZ30zIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICUxIHJlcXVpcmVzIGhvbGRpbmcgJTAgJXNlbGVjdHsnJTInfCclMicgZXhjbHVzaXZlbHl9MyIsIDYzMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdmFyX3RlbXBsYXRlX21pc3NpbmcsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgImluc3RhbnRpYXRpb24gb2YgdmFyaWFibGUgJXEwIHJlcXVpcmVkIGhlcmUsIGJ1dCBubyBkZWZpbml0aW9uIGlzIGF2YWlsYWJsZSIsIDY0OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdmFyaWFibGVfcmVxdWlyZXNfYW55X2xvY2ssIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiVzZWxlY3R7cmVhZGluZ3x3cml0aW5nfTEgdmFyaWFibGUgJTAgcmVxdWlyZXMgaG9sZGluZyAlc2VsZWN0e2FueSBtdXRleHxhbnkgbXV0ZXggZXhjbHVzaXZlbHl9MSIsIDYyNywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdmFyaWFibGVfcmVxdWlyZXNfbG9jaywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJXNlbGVjdHtyZWFkaW5nfHdyaXRpbmd9MyB2YXJpYWJsZSAlMSByZXF1aXJlcyBob2xkaW5nICUwICVzZWxlY3R7JyUyJ3wnJTInIGV4Y2x1c2l2ZWx5fTMiLCA2MjcsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3ZhcmlhYmxlX3JlcXVpcmVzX2xvY2tfcHJlY2lzZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiJXNlbGVjdHtyZWFkaW5nfHdyaXRpbmd9MyB2YXJpYWJsZSAlMSByZXF1aXJlcyBob2xkaW5nICUwICVzZWxlY3R7JyUyJ3wnJTInIGV4Y2x1c2l2ZWx5fTMiLCA2MzEsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3ZhcmlhYmxlX3NpemVkX2l2YXJfdmlzaWJpbGl0eSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZmllbGQgJTAgd2l0aCB2YXJpYWJsZSBzaXplZCB0eXBlICUxIGlzIG5vdCB2aXNpYmxlIHRvIHN1YmNsYXNzZXMgYW5kIGNhbiBjb25mbGljdCB3aXRoIHRoZWlyIGluc3RhbmNlIHZhcmlhYmxlcyIsIDQ0NCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdmFyaWFibGVzX25vdF9pbl9sb29wX2JvZHksIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgInZhcmlhYmxlJXNlbGVjdHtzfCAlMXxzICUxIGFuZCAlMnxzICUxLCAlMiwgYW5kICUzfHMgJTEsICUyLCAlMywgYW5kICU0fTAgdXNlZCBpbiBsb29wIGNvbmRpdGlvbiBub3QgbW9kaWZpZWQgaW4gbG9vcCBib2R5IiwgMjE4LCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl92YmFzZV9tb3ZlZF9tdWx0aXBsZV90aW1lcywgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiZGVmYXVsdGVkIG1vdmUgYXNzaWdubWVudCBvcGVyYXRvciBvZiAlMCB3aWxsIG1vdmUgYXNzaWduIHZpcnR1YWwgYmFzZSBjbGFzcyAlMSBtdWx0aXBsZSB0aW1lcyIsIDQwOCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fdmVjdG9yX2xvbmdfZGVjbF9zcGVjX2NvbWJpbmF0aW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJVc2Ugb2YgJ2xvbmcnIHdpdGggJ19fdmVjdG9yJyBpcyBkZXByZWNhdGVkIiwgMTUzLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMjcpCitESUFHKHdhcm5fdmVjdG9yX21vZGVfZGVwcmVjYXRlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAic3BlY2lmeWluZyB2ZWN0b3IgdHlwZXMgd2l0aCB0aGUgJ21vZGUnIGF0dHJpYnV0ZSBpcyBkZXByZWNhdGVkOyB1c2UgdGhlICd2ZWN0b3Jfc2l6ZScgYXR0cmlidXRlIGluc3RlYWQiLCAxNTQsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyNykKK0RJQUcod2Fybl92bGFfdXNlZCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAidmFyaWFibGUgbGVuZ3RoIGFycmF5IHVzZWQiLCA3MTMsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3dlYWtfaWRlbnRpZmllcl91bmRlY2xhcmVkLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJ3ZWFrIGlkZW50aWZpZXIgJTAgbmV2ZXIgZGVjbGFyZWQiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl93ZWFrX2ltcG9ydCwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiYW4gYWxyZWFkeS1kZWNsYXJlZCB2YXJpYWJsZSBpcyBtYWRlIGEgd2Vha19pbXBvcnQgZGVjbGFyYXRpb24gJTAiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMikKK0RJQUcod2Fybl93ZWFrX3RlbXBsYXRlX3Z0YWJsZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpJZ25vcmVkLCAiZXhwbGljaXQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiAlMCB3aWxsIGVtaXQgYSB2dGFibGUgaW4gZXZlcnkgdHJhbnNsYXRpb24gdW5pdCIsIDcxNywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fd2Vha192dGFibGUsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6SWdub3JlZCwgIiUwIGhhcyBubyBvdXQtb2YtbGluZSB2aXJ0dWFsIG1ldGhvZCBkZWZpbml0aW9uczsgaXRzIHZ0YWJsZSB3aWxsIGJlIGVtaXR0ZWQgaW4gZXZlcnkgdHJhbnNsYXRpb24gdW5pdCIsIDcxOCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDIpCitESUFHKHdhcm5fd3JvbmdfYWJzb2x1dGVfdmFsdWVfdHlwZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAidXNpbmcgJXNlbGVjdHtpbnRlZ2VyfGZsb2F0aW5nIHBvaW50fGNvbXBsZXh9MSBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAlMCB3aGVuIGFyZ3VtZW50IGlzIG9mICVzZWxlY3R7aW50ZWdlcnxmbG9hdGluZyBwb2ludHxjb21wbGV4fTIgdHlwZSIsIDgsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3plcm9fYXNfbnVsbF9wb2ludGVyX2NvbnN0YW50LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICJ6ZXJvIGFzIG51bGwgcG9pbnRlciBjb25zdGFudCIsIDcyMSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDE5KQorRElBRyh3YXJuX3plcm9fc2l6ZV9zdHJ1Y3RfdW5pb25fY29tcGF0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oklnbm9yZWQsICIlc2VsZWN0e3xlbXB0eSB9MCVzZWxlY3R7c3RydWN0fHVuaW9ufTEgaGFzIHNpemUgMCBpbiBDLCAlc2VsZWN0e3NpemUgMXxub24temVybyBzaXplfTIgaW4gQysrIiwgNjksIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQorRElBRyh3YXJuX3plcm9fc2l6ZV9zdHJ1Y3RfdW5pb25faW5fZXh0ZXJuX2MsIENMQVNTX1dBUk5JTkcsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6V2FybmluZywgIiVzZWxlY3R7fGVtcHR5IH0wJXNlbGVjdHtzdHJ1Y3R8dW5pb259MSBoYXMgc2l6ZSAwIGluIEMsICVzZWxlY3R7c2l6ZSAxfG5vbi16ZXJvIHNpemV9MiBpbiBDKysiLCAyMDUsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAyKQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY1NlcmlhbGl6YXRpb25LaW5kcy5pbmMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljU2VyaWFsaXphdGlvbktpbmRzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2Y4OTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY1NlcmlhbGl6YXRpb25LaW5kcy5pbmMKQEAgLTAsMCArMSw2NSBAQAorI2lmZGVmIFNFUklBTElaQVRJT05TVEFSVAorX19TRVJJQUxJWkFUSU9OU1RBUlQgPSBESUFHX1NUQVJUX1NFUklBTElaQVRJT04sCisjdW5kZWYgU0VSSUFMSVpBVElPTlNUQVJUCisjZW5kaWYKKworRElBRyhlcnJfZmVfYXN0X2ZpbGVfbW9kaWZpZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZmlsZSAnJTAnIGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBBU1QgZmlsZSAnJTEnIHdhcyBidWlsdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTUpCitESUFHKGVycl9mZV9tb2R1bGVfZmlsZV9tb2RpZmllZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJmaWxlICclMCcgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIG1vZHVsZSBmaWxlICclMScgd2FzIGJ1aWx0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNSkKK0RJQUcoZXJyX2ZlX25vdF9hX3BjaF9maWxlLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImlucHV0IGlzIG5vdCBhIFBDSCBmaWxlOiAnJTAnIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNSkKK0RJQUcoZXJyX2ZlX3BjaF9maWxlX21vZGlmaWVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImZpbGUgJyUwJyBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGUgcHJlY29tcGlsZWQgaGVhZGVyICclMScgd2FzIGJ1aWx0IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNSkKK0RJQUcoZXJyX2ZlX3BjaF9maWxlX292ZXJyaWRkZW4sIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiZmlsZSAnJTAnIGZyb20gdGhlIHByZWNvbXBpbGVkIGhlYWRlciBoYXMgYmVlbiBvdmVycmlkZGVuIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNSkKK0RJQUcoZXJyX2ZlX3BjaF9tYWxmb3JtZWQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAibWFsZm9ybWVkIG9yIGNvcnJ1cHRlZCBBU1QgZmlsZTogJyUwJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTUpCitESUFHKGVycl9mZV9wY2hfbWFsZm9ybWVkX2Jsb2NrLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm1hbGZvcm1lZCBibG9jayByZWNvcmQgaW4gUENIIGZpbGU6ICclMCciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE1KQorRElBRyhlcnJfZmVfdW5hYmxlX3RvX3JlYWRfcGNoX2ZpbGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAidW5hYmxlIHRvIHJlYWQgUENIIGZpbGUgJTA6ICclMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE1KQorRElBRyhlcnJfaW1wb3J0ZWRfbW9kdWxlX21vZG1hcF9jaGFuZ2VkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm1vZHVsZSAnJTAnIGltcG9ydGVkIGJ5IEFTVCBmaWxlICclMScgZm91bmQgaW4gYSBkaWZmZXJlbnQgbW9kdWxlIG1hcCBmaWxlICglMikgdGhhbiB3aGVuIHRoZSBpbXBvcnRpbmcgQVNUIGZpbGUgd2FzIGJ1aWx0ICglMykiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE1KQorRElBRyhlcnJfaW1wb3J0ZWRfbW9kdWxlX25vdF9mb3VuZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJtb2R1bGUgJyUwJyBpbiBBU1QgZmlsZSAnJTEnIChpbXBvcnRlZCBieSBBU1QgZmlsZSAnJTInKSBpcyBub3QgZGVmaW5lZCBpbiBhbnkgbG9hZGVkIG1vZHVsZSBtYXAgZmlsZTsgbWF5YmUgeW91IG5lZWQgdG8gbG9hZCAnJTMnPyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTUpCitESUFHKGVycl9pbXBvcnRlZF9tb2R1bGVfcmVsb2NhdGVkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgIm1vZHVsZSAnJTAnIHdhcyBidWlsdCBpbiBkaXJlY3RvcnkgJyUxJyBidXQgbm93IHJlc2lkZXMgaW4gZGlyZWN0b3J5ICclMiciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE1KQorRElBRyhlcnJfbW9kdWxlX2RpZmZlcmVudF9tb2RtYXAsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibW9kdWxlICclMCcgJXNlbGVjdHt1c2VzfGRvZXMgbm90IHVzZX0xIGFkZGl0aW9uYWwgbW9kdWxlIG1hcCAnJTInJXNlbGVjdHt8IG5vdH0xIHVzZWQgd2hlbiB0aGUgbW9kdWxlIHdhcyBidWlsdCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTUpCitESUFHKGVycl9tb2R1bGVfZmlsZV9jb25mbGljdCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJtb2R1bGUgJyUwJyBpcyBkZWZpbmVkIGluIGJvdGggJyUxJyBhbmQgJyUyJyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTUpCitESUFHKGVycl9tb2R1bGVfZmlsZV9pbnZhbGlkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImZpbGUgJyUxJyBpcyBub3QgYSB2YWxpZCBwcmVjb21waWxlZCAlc2VsZWN0e1BDSHxtb2R1bGV8QVNUfTAgZmlsZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTUpCitESUFHKGVycl9tb2R1bGVfZmlsZV9ub3RfZm91bmQsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJXNlbGVjdHtQQ0h8bW9kdWxlfEFTVH0wIGZpbGUgJyUxJyBub3QgZm91bmQlc2VsZWN0e3w6ICUzfTIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE1KQorRElBRyhlcnJfbW9kdWxlX2ZpbGVfbm90X21vZHVsZSwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJBU1QgZmlsZSAnJTAnIHdhcyBub3QgYnVpbHQgYXMgYSBtb2R1bGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE1KQorRElBRyhlcnJfbW9kdWxlX2ZpbGVfb3V0X29mX2RhdGUsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiJXNlbGVjdHtQQ0h8bW9kdWxlfEFTVH0wIGZpbGUgJyUxJyBpcyBvdXQgb2YgZGF0ZSBhbmQgbmVlZHMgdG8gYmUgcmVidWlsdCVzZWxlY3R7fDogJTN9MiIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTUpCitESUFHKGVycl9tb2R1bGVfbm9fc2l6ZV9tdGltZV9mb3JfaGVhZGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImNhbm5vdCBlbWl0IG1vZHVsZSAlMDogJXNlbGVjdHtzaXplfG10aW1lfTEgbXVzdCBiZSBleHBsaWNpdGx5IHNwZWNpZmllZCBmb3IgbWlzc2luZyBoZWFkZXIgZmlsZSBcIiUyXCIiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE4KQorRElBRyhlcnJfbW9kdWxlX29kcl92aW9sYXRpb25fZGVmaW5pdGlvbl9kYXRhLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVxMCBoYXMgZGlmZmVyZW50IGRlZmluaXRpb25zIGluIGRpZmZlcmVudCBtb2R1bGVzOyBmaXJzdCBkaWZmZXJlbmNlIGlzICVzZWxlY3R7ZGVmaW5pdGlvbiBpbiBtb2R1bGUgJyUyJ3xkZWZpbmVkIGhlcmV9MSBmb3VuZCAlc2VsZWN0eyU0IGJhc2UgJXBsdXJhbHsxOmNsYXNzfDpjbGFzc2VzfTR8JTQgdmlydHVhbCBiYXNlICVwbHVyYWx7MTpjbGFzc3w6Y2xhc3Nlc300fCVvcmRpbmFsNCBiYXNlIGNsYXNzIHdpdGggdHlwZSAlNXwlb3JkaW5hbDQgJXNlbGVjdHtub24tdmlydHVhbHx2aXJ0dWFsfTUgYmFzZSBjbGFzcyAlNnwlb3JkaW5hbDQgYmFzZSBjbGFzcyAlNSB3aXRoICVzZWxlY3R7cHVibGljfHByb3RlY3RlZHxwcml2YXRlfG5vfTYgYWNjZXNzIHNwZWNpZmllcn0zIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNSkKK0RJQUcoZXJyX21vZHVsZV9vZHJfdmlvbGF0aW9uX2RpZmZlcmVudF9kZWZpbml0aW9ucywgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlcTAgaGFzIGRpZmZlcmVudCBkZWZpbml0aW9ucyBpbiBkaWZmZXJlbnQgbW9kdWxlczsgJXNlbGVjdHtkZWZpbml0aW9uIGluIG1vZHVsZSAnJTInIGlzIGhlcmV8ZGVmaW5lZCBoZXJlfTEiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE1KQorRElBRyhlcnJfbW9kdWxlX29kcl92aW9sYXRpb25fZGlmZmVyZW50X2luc3RhbnRpYXRpb25zLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImluc3RhbnRpYXRpb24gb2YgJXEwIGlzIGRpZmZlcmVudCBpbiBkaWZmZXJlbnQgbW9kdWxlcyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTUpCitESUFHKGVycl9tb2R1bGVfb2RyX3Zpb2xhdGlvbl9mdW5jdGlvbiwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlcTAgaGFzIGRpZmZlcmVudCBkZWZpbml0aW9ucyBpbiBkaWZmZXJlbnQgbW9kdWxlczsgJXNlbGVjdHtkZWZpbml0aW9uIGluIG1vZHVsZSAnJTInfGRlZmluZWQgaGVyZX0xIGZpcnN0IGRpZmZlcmVuY2UgaXMgJXNlbGVjdHtyZXR1cm4gdHlwZSBpcyAlNHwlb3JkaW5hbDQgcGFyYW1ldGVyIHdpdGggbmFtZSAlNXwlb3JkaW5hbDQgcGFyYW1ldGVyIHdpdGggdHlwZSAlNSVzZWxlY3R7fCBkZWNheWVkIGZyb20gJTd9Nnwlb3JkaW5hbDQgcGFyYW1ldGVyIHdpdGglc2VsZWN0e291dHx9NSBhIGRlZmF1bHQgYXJndW1lbnR8JW9yZGluYWw0IHBhcmFtZXRlciB3aXRoIGEgZGVmYXVsdCBhcmd1bWVudHxmdW5jdGlvbiBib2R5fTMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE1KQorRElBRyhlcnJfbW9kdWxlX29kcl92aW9sYXRpb25fbWlzbWF0Y2hfZGVjbCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlcTAgaGFzIGRpZmZlcmVudCBkZWZpbml0aW9ucyBpbiBkaWZmZXJlbnQgbW9kdWxlczsgZmlyc3QgZGlmZmVyZW5jZSBpcyAlc2VsZWN0e2RlZmluaXRpb24gaW4gbW9kdWxlICclMid8ZGVmaW5lZCBoZXJlfTEgZm91bmQgJXNlbGVjdHtlbmQgb2YgY2xhc3N8cHVibGljIGFjY2VzcyBzcGVjaWZpZXJ8cHJpdmF0ZSBhY2Nlc3Mgc3BlY2lmaWVyfHByb3RlY3RlZCBhY2Nlc3Mgc3BlY2lmaWVyfHN0YXRpYyBhc3NlcnR8ZmllbGR8bWV0aG9kfHR5cGUgYWxpYXN8dHlwZWRlZnxkYXRhIG1lbWJlcnxmcmllbmQgZGVjbGFyYXRpb259MyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTUpCitESUFHKGVycl9tb2R1bGVfb2RyX3Zpb2xhdGlvbl9taXNtYXRjaF9kZWNsX2RpZmYsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXEwIGhhcyBkaWZmZXJlbnQgZGVmaW5pdGlvbnMgaW4gZGlmZmVyZW50IG1vZHVsZXM7IGZpcnN0IGRpZmZlcmVuY2UgaXMgJXNlbGVjdHtkZWZpbml0aW9uIGluIG1vZHVsZSAnJTInfGRlZmluZWQgaGVyZX0xIGZvdW5kICVzZWxlY3R7c3RhdGljIGFzc2VydCB3aXRoIGNvbmRpdGlvbnxzdGF0aWMgYXNzZXJ0IHdpdGggbWVzc2FnZXxzdGF0aWMgYXNzZXJ0IHdpdGggJXNlbGVjdHt8bm8gfTRtZXNzYWdlfGZpZWxkICU0fGZpZWxkICU0IHdpdGggdHlwZSAlNXwlc2VsZWN0e25vbi18fTViaXRmaWVsZCAlNHxiaXRmaWVsZCAlNCB3aXRoIG9uZSB3aWR0aCBleHByZXNzaW9ufCVzZWxlY3R7bm9uLXx9NW11dGFibGUgZmllbGQgJTR8ZmllbGQgJTQgd2l0aCAlc2VsZWN0e25vfGFufTUgaW5pdGFsaXplcnxmaWVsZCAlNCB3aXRoIGFuIGluaXRpYWxpemVyfCVzZWxlY3R7bWV0aG9kICU1fGNvbnN0cnVjdG9yfGRlc3RydWN0b3J9NHwlc2VsZWN0e21ldGhvZCAlNXxjb25zdHJ1Y3RvcnxkZXN0cnVjdG9yfTQgaXMgJXNlbGVjdHtub3QgZGVsZXRlZHxkZWxldGVkfTZ8JXNlbGVjdHttZXRob2QgJTV8Y29uc3RydWN0b3J8ZGVzdHJ1Y3Rvcn00IGlzICVzZWxlY3R7fHB1cmUgfTYlc2VsZWN0e25vdCB2aXJ0dWFsfHZpcnR1YWx9N3wlc2VsZWN0e21ldGhvZCAlNXxjb25zdHJ1Y3RvcnxkZXN0cnVjdG9yfTQgaXMgJXNlbGVjdHtub3Qgc3RhdGljfHN0YXRpY302fCVzZWxlY3R7bWV0aG9kICU1fGNvbnN0cnVjdG9yfGRlc3RydWN0b3J9NCBpcyAlc2VsZWN0e25vdCB2b2xhdGlsZXx2b2xhdGlsZX02fCVzZWxlY3R7bWV0aG9kICU1fGNvbnN0cnVjdG9yfGRlc3RydWN0b3J9NCBpcyAlc2VsZWN0e25vdCBjb25zdHxjb25zdH02fCVzZWxlY3R7bWV0aG9kICU1fGNvbnN0cnVjdG9yfGRlc3RydWN0b3J9NCBpcyAlc2VsZWN0e25vdCBpbmxpbmV8aW5saW5lfTZ8JXNlbGVjdHttZXRob2QgJTV8Y29uc3RydWN0b3J8ZGVzdHJ1Y3Rvcn00IHRoYXQgaGFzICU2IHBhcmFtZXRlciVzNnwlc2VsZWN0e21ldGhvZCAlNXxjb25zdHJ1Y3RvcnxkZXN0cnVjdG9yfTQgd2l0aCAlb3JkaW5hbDYgcGFyYW1ldGVyIG9mIHR5cGUgJTclc2VsZWN0e3wgZGVjYXllZCBmcm9tICU5fTh8JXNlbGVjdHttZXRob2QgJTV8Y29uc3RydWN0b3J8ZGVzdHJ1Y3Rvcn00IHdpdGggJW9yZGluYWw2IHBhcmFtZXRlciBuYW1lZCAlN3wlc2VsZWN0e21ldGhvZCAlNXxjb25zdHJ1Y3RvcnxkZXN0cnVjdG9yfTQgd2l0aCAlb3JkaW5hbDYgcGFyYW1ldGVyIHdpdGglc2VsZWN0e291dHx9NyBhIGRlZmF1bHQgYXJndW1lbnR8JXNlbGVjdHttZXRob2QgJTV8Y29uc3RydWN0b3J8ZGVzdHJ1Y3Rvcn00IHdpdGggJW9yZGluYWw2IHBhcmFtZXRlciB3aXRoIGEgZGVmYXVsdCBhcmd1bWVudHwlc2VsZWN0e3R5cGVkZWZ8dHlwZSBhbGlhc300IG5hbWUgJTV8JXNlbGVjdHt0eXBlZGVmfHR5cGUgYWxpYXN9NCAlNSB3aXRoIHVuZGVybHlpbmcgdHlwZSAlNnxkYXRhIG1lbWJlciB3aXRoIG5hbWUgJTR8ZGF0YSBtZW1iZXIgJTQgd2l0aCB0eXBlICU1fGRhdGEgbWVtYmVyICU0IHdpdGglc2VsZWN0e291dHx9NSBhbiBpbml0aWFsaXplcnxkYXRhIG1lbWJlciAlNCB3aXRoIGFuIGluaXRpYWxpemVyfGRhdGEgbWVtYmVyICU0ICVzZWxlY3R7aXMgY29uc3RleHByfGlzIG5vdCBjb25zdGV4cHJ9NXxmcmllbmQgJXNlbGVjdHtjbGFzc3xmdW5jdGlvbn00fGZyaWVuZCAlNHxmcmllbmQgZnVuY3Rpb24gJTR8fTMiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE1KQorRElBRyhlcnJfbW9kdWxlX29kcl92aW9sYXRpb25fbWlzbWF0Y2hfZGVjbF91bmtub3duLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVxMCAlc2VsZWN0e3dpdGggZGVmaW5pdGlvbiBpbiBtb2R1bGUgJyUyJ3xkZWZpbmVkIGhlcmV9MSBoYXMgZGlmZmVyZW50IGRlZmluaXRpb25zIGluIGRpZmZlcmVudCBtb2R1bGVzOyBmaXJzdCBkaWZmZXJlbmNlIGlzIHRoaXMgJXNlbGVjdHt8fHx8c3RhdGljIGFzc2VydHxmaWVsZHxtZXRob2R8dHlwZSBhbGlhc3x0eXBlZGVmfGRhdGEgbWVtYmVyfGZyaWVuZCBkZWNsYXJhdGlvbnx1bmV4cGVjdGVkIGRlY2x9MyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTUpCitESUFHKGVycl9tb2R1bGVfb2RyX3Zpb2xhdGlvbl9taXNzaW5nX2RlY2wsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXEwIGZyb20gbW9kdWxlICclMScgaXMgbm90IHByZXNlbnQgaW4gZGVmaW5pdGlvbiBvZiAlcTIlc2VsZWN0eyBpbiBtb2R1bGUgJyU0J3wgcHJvdmlkZWQgZWFybGllcn0zIiwgMCwgU0ZJTkFFX1JlcG9ydCwgZmFsc2UsIHRydWUsIDE1KQorRElBRyhlcnJfbW9kdWxlX29kcl92aW9sYXRpb25fdGVtcGxhdGVfcGFyYW1ldGVyLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVxMCBoYXMgZGlmZmVyZW50IGRlZmluaXRpb25zIGluIGRpZmZlcmVudCBtb2R1bGVzOyBmaXJzdCBkaWZmZXJlbmNlIGlzICVzZWxlY3R7ZGVmaW5pdGlvbiBpbiBtb2R1bGUgJyUyJ3xkZWZpbmVkIGhlcmV9MSBmb3VuZCAlc2VsZWN0e3VubmFtZWQgdGVtcGxhdGUgcGFyYW1ldGVyfHRlbXBsYXRlIHBhcmFtZXRlciAlNHx0ZW1wbGF0ZSBwYXJhbWV0ZXIgd2l0aCAlc2VsZWN0e25vIHx9NGRlZmF1bHQgYXJndW1lbnR8dGVtcGxhdGUgcGFyYW1ldGVyIHdpdGggZGVmYXVsdCBhcmd1bWVudH0zIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNSkKK0RJQUcoZXJyX3BjaF9kaWFnb3B0X21pc21hdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGlzIGN1cnJlbnRseSBlbmFibGVkLCBidXQgd2FzIG5vdCBpbiB0aGUgUENIIGZpbGUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE1KQorRElBRyhlcnJfcGNoX2RpZmZlcmVudF9icmFuY2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiUENIIGZpbGUgYnVpbHQgZnJvbSBhIGRpZmZlcmVudCBicmFuY2ggKCUwKSB0aGFuIHRoZSBjb21waWxlciAoJTEpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNSkKK0RJQUcoZXJyX3BjaF9sYW5nb3B0X21pc21hdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIHdhcyAlc2VsZWN0e2Rpc2FibGVkfGVuYWJsZWR9MSBpbiBQQ0ggZmlsZSBidXQgaXMgY3VycmVudGx5ICVzZWxlY3R7ZGlzYWJsZWR8ZW5hYmxlZH0yIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNSkKK0RJQUcoZXJyX3BjaF9sYW5nb3B0X3ZhbHVlX21pc21hdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiUwIGRpZmZlcnMgaW4gUENIIGZpbGUgdnMuIGN1cnJlbnQgZmlsZSIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTUpCitESUFHKGVycl9wY2hfbWFjcm9fZGVmX2NvbmZsaWN0LCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgImRlZmluaXRpb24gb2YgbWFjcm8gJyUwJyBkaWZmZXJzIGJldHdlZW4gdGhlIHByZWNvbXBpbGVkIGhlYWRlciAoJyUxJykgYW5kIHRoZSBjb21tYW5kIGxpbmUgKCclMicpIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNSkKK0RJQUcoZXJyX3BjaF9tYWNyb19kZWZfdW5kZWYsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAibWFjcm8gJyUwJyB3YXMgJXNlbGVjdHtkZWZpbmVkfHVuZGVmJ2R9MSBpbiB0aGUgcHJlY29tcGlsZWQgaGVhZGVyIGJ1dCAlc2VsZWN0e3VuZGVmJ2R8ZGVmaW5lZH0xIG9uIHRoZSBjb21tYW5kIGxpbmUiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE1KQorRElBRyhlcnJfcGNoX21vZHVsZWNhY2hlX21pc21hdGNoLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIlBDSCB3YXMgY29tcGlsZWQgd2l0aCBtb2R1bGUgY2FjaGUgcGF0aCAnJTAnLCBidXQgdGhlIHBhdGggaXMgY3VycmVudGx5ICclMSciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE1KQorRElBRyhlcnJfcGNoX3BwX2RldGFpbGVkX3JlY29yZCwgQ0xBU1NfRVJST1IsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RXJyb3IsICIlc2VsZWN0e2NvbW1hbmQgbGluZSBjb250YWluc3xwcmVjb21waWxlZCBoZWFkZXIgd2FzIGJ1aWx0IHdpdGh9MCAnLWRldGFpbGVkLXByZXByb2Nlc3NpbmctcmVjb3JkJyBidXQgJXNlbGVjdHtwcmVjb21waWxlZCBoZWFkZXIgd2FzIG5vdCBidWlsdCB3aXRoIGl0fGl0IGlzIG5vdCBwcmVzZW50IG9uIHRoZSBjb21tYW5kIGxpbmV9MCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTUpCitESUFHKGVycl9wY2hfdGFyZ2V0b3B0X2ZlYXR1cmVfbWlzbWF0Y2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiJXNlbGVjdHtBU1QgZmlsZXxjdXJyZW50IHRyYW5zbGF0aW9uIHVuaXR9MCB3YXMgY29tcGlsZWQgd2l0aCB0aGUgdGFyZ2V0IGZlYXR1cmUnJTEnIGJ1dCB0aGUgJXNlbGVjdHtjdXJyZW50IHRyYW5zbGF0aW9uIHVuaXQgaXN8QVNUIGZpbGUgd2FzfTAgbm90IiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNSkKK0RJQUcoZXJyX3BjaF90YXJnZXRvcHRfbWlzbWF0Y2gsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiUENIIGZpbGUgd2FzIGNvbXBpbGVkIGZvciB0aGUgJTAgJyUxJyBidXQgdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdCBpcyBiZWluZyBjb21waWxlZCBmb3IgdGFyZ2V0ICclMiciLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE1KQorRElBRyhlcnJfcGNoX3VuZGVmLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIiVzZWxlY3R7Y29tbWFuZCBsaW5lIGNvbnRhaW5zfHByZWNvbXBpbGVkIGhlYWRlciB3YXMgYnVpbHQgd2l0aH0wICctdW5kZWYnIGJ1dCAlc2VsZWN0e3ByZWNvbXBpbGVkIGhlYWRlciB3YXMgbm90IGJ1aWx0IHdpdGggaXR8aXQgaXMgbm90IHByZXNlbnQgb24gdGhlIGNvbW1hbmQgbGluZX0wIiwgMCwgU0ZJTkFFX1N1YnN0aXR1dGlvbkZhaWx1cmUsIGZhbHNlLCB0cnVlLCAxNSkKK0RJQUcoZXJyX3BjaF92ZXJzaW9uX3Rvb19uZXcsIENMQVNTX0VSUk9SLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkVycm9yLCAiUENIIGZpbGUgdXNlcyBhIG5ld2VyIFBDSCBmb3JtYXQgdGhhdCBjYW5ub3QgYmUgcmVhZCIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTUpCitESUFHKGVycl9wY2hfdmVyc2lvbl90b29fb2xkLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIlBDSCBmaWxlIHVzZXMgYW4gb2xkZXIgUENIIGZvcm1hdCB0aGF0IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiLCAwLCBTRklOQUVfU3Vic3RpdHV0aW9uRmFpbHVyZSwgZmFsc2UsIHRydWUsIDE1KQorRElBRyhlcnJfcGNoX3dpdGhfY29tcGlsZXJfZXJyb3JzLCBDTEFTU19FUlJPUiwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpFcnJvciwgIlBDSCBmaWxlIGNvbnRhaW5zIGNvbXBpbGVyIGVycm9ycyIsIDAsIFNGSU5BRV9TdWJzdGl0dXRpb25GYWlsdXJlLCBmYWxzZSwgdHJ1ZSwgMTUpCitESUFHKG5vdGVfZmlyc3RfbW9kdWxlX2RpZmZlcmVuY2UsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJpbiBmaXJzdCBkZWZpbml0aW9uLCBwb3NzaWJsZSBkaWZmZXJlbmNlIGlzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTUpCitESUFHKG5vdGVfaW1wb3J0ZWRfYnlfcGNoX21vZHVsZV9ub3RfZm91bmQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJjb25zaWRlciBhZGRpbmcgJyUwJyB0byB0aGUgaGVhZGVyIHNlYXJjaCBwYXRoIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDE1KQorRElBRyhub3RlX21vZHVsZV9jYWNoZV9wYXRoLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYWZ0ZXIgbW9kaWZ5aW5nIHN5c3RlbSBoZWFkZXJzLCBwbGVhc2UgZGVsZXRlIHRoZSBtb2R1bGUgY2FjaGUgYXQgJyUwJyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxNSkKK0RJQUcobm90ZV9tb2R1bGVfZmlsZV9pbXBvcnRlZF9ieSwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImltcG9ydGVkIGJ5ICVzZWxlY3R7fG1vZHVsZSAnJTInIGluIH0xJyUwJyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxNSkKK0RJQUcobm90ZV9tb2R1bGVfb2RyX3Zpb2xhdGlvbl9kZWZpbml0aW9uX2RhdGEsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJidXQgaW4gJyUwJyBmb3VuZCAlc2VsZWN0eyUyIGJhc2UgJXBsdXJhbHsxOmNsYXNzfDpjbGFzc2VzfTJ8JTIgdmlydHVhbCBiYXNlICVwbHVyYWx7MTpjbGFzc3w6Y2xhc3Nlc30yfCVvcmRpbmFsMiBiYXNlIGNsYXNzIHdpdGggZGlmZmVyZW50IHR5cGUgJTN8JW9yZGluYWwyICVzZWxlY3R7bm9uLXZpcnR1YWx8dmlydHVhbH0zIGJhc2UgY2xhc3MgJTR8JW9yZGluYWwyIGJhc2UgY2xhc3MgJTMgd2l0aCAlc2VsZWN0e3B1YmxpY3xwcm90ZWN0ZWR8cHJpdmF0ZXxub300IGFjY2VzcyBzcGVjaWZpZXJ9MSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxNSkKK0RJQUcobm90ZV9tb2R1bGVfb2RyX3Zpb2xhdGlvbl9kaWZmZXJlbnRfZGVmaW5pdGlvbnMsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJkZWZpbml0aW9uIGluIG1vZHVsZSAnJTAnIGlzIGhlcmUiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTUpCitESUFHKG5vdGVfbW9kdWxlX29kcl92aW9sYXRpb25fZnVuY3Rpb24sIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJidXQgaW4gJyUwJyBmb3VuZCAlc2VsZWN0e2RpZmZlcmVudCByZXR1cm4gdHlwZSAlMnwlb3JkaW5hbDIgcGFyYW1ldGVyIHdpdGggbmFtZSAlM3wlb3JkaW5hbDIgcGFyYW1ldGVyIHdpdGggdHlwZSAlMyVzZWxlY3R7fCBkZWNheWVkIGZyb20gJTV9NHwlb3JkaW5hbDIgcGFyYW1ldGVyIHdpdGglc2VsZWN0e291dHx9MyBhIGRlZmF1bHQgYXJndW1lbnR8JW9yZGluYWwyIHBhcmFtZXRlciB3aXRoIGEgZGlmZmVyZW50IGRlZmF1bHQgYXJndW1lbnR8YSBkaWZmZXJlbnQgYm9keX0xIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDE1KQorRElBRyhub3RlX21vZHVsZV9vZHJfdmlvbGF0aW9uX21pc21hdGNoX2RlY2wsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJidXQgaW4gJyUwJyBmb3VuZCAlc2VsZWN0e2VuZCBvZiBjbGFzc3xwdWJsaWMgYWNjZXNzIHNwZWNpZmllcnxwcml2YXRlIGFjY2VzcyBzcGVjaWZpZXJ8cHJvdGVjdGVkIGFjY2VzcyBzcGVjaWZpZXJ8c3RhdGljIGFzc2VydHxmaWVsZHxtZXRob2R8dHlwZSBhbGlhc3x0eXBlZGVmfGRhdGEgbWVtYmVyfGZyaWVuZCBkZWNsYXJhdGlvbn0xIiwgMCwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDE1KQorRElBRyhub3RlX21vZHVsZV9vZHJfdmlvbGF0aW9uX21pc21hdGNoX2RlY2xfZGlmZiwgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImJ1dCBpbiAnJTAnIGZvdW5kICVzZWxlY3R7c3RhdGljIGFzc2VydCB3aXRoIGRpZmZlcmVudCBjb25kaXRpb258c3RhdGljIGFzc2VydCB3aXRoIGRpZmZlcmVudCBtZXNzYWdlfHN0YXRpYyBhc3NlcnQgd2l0aCAlc2VsZWN0e3xubyB9Mm1lc3NhZ2V8ZmllbGQgJTJ8ZmllbGQgJTIgd2l0aCB0eXBlICUzfCVzZWxlY3R7bm9uLXx9M2JpdGZpZWxkICUyfGJpdGZpZWxkICUyIHdpdGggZGlmZmVyZW50IHdpZHRoIGV4cHJlc3Npb258JXNlbGVjdHtub24tfH0zbXV0YWJsZSBmaWVsZCAlMnxmaWVsZCAlMiB3aXRoICVzZWxlY3R7bm98YW59MyBpbml0aWFsaXplcnxmaWVsZCAlMiB3aXRoIGEgZGlmZmVyZW50IGluaXRpYWxpemVyfCVzZWxlY3R7bWV0aG9kICUzfGNvbnN0cnVjdG9yfGRlc3RydWN0b3J9Mnwlc2VsZWN0e21ldGhvZCAlM3xjb25zdHJ1Y3RvcnxkZXN0cnVjdG9yfTIgaXMgJXNlbGVjdHtub3QgZGVsZXRlZHxkZWxldGVkfTR8JXNlbGVjdHttZXRob2QgJTN8Y29uc3RydWN0b3J8ZGVzdHJ1Y3Rvcn0yIGlzICVzZWxlY3R7fHB1cmUgfTQlc2VsZWN0e25vdCB2aXJ0dWFsfHZpcnR1YWx9NXwlc2VsZWN0e21ldGhvZCAlM3xjb25zdHJ1Y3RvcnxkZXN0cnVjdG9yfTIgaXMgJXNlbGVjdHtub3Qgc3RhdGljfHN0YXRpY300fCVzZWxlY3R7bWV0aG9kICUzfGNvbnN0cnVjdG9yfGRlc3RydWN0b3J9MiBpcyAlc2VsZWN0e25vdCB2b2xhdGlsZXx2b2xhdGlsZX00fCVzZWxlY3R7bWV0aG9kICUzfGNvbnN0cnVjdG9yfGRlc3RydWN0b3J9MiBpcyAlc2VsZWN0e25vdCBjb25zdHxjb25zdH00fCVzZWxlY3R7bWV0aG9kICUzfGNvbnN0cnVjdG9yfGRlc3RydWN0b3J9MiBpcyAlc2VsZWN0e25vdCBpbmxpbmV8aW5saW5lfTR8JXNlbGVjdHttZXRob2QgJTN8Y29uc3RydWN0b3J8ZGVzdHJ1Y3Rvcn0yIHRoYXQgaGFzICU0IHBhcmFtZXRlciVzNHwlc2VsZWN0e21ldGhvZCAlM3xjb25zdHJ1Y3RvcnxkZXN0cnVjdG9yfTIgd2l0aCAlb3JkaW5hbDQgcGFyYW1ldGVyIG9mIHR5cGUgJTUlc2VsZWN0e3wgZGVjYXllZCBmcm9tICU3fTZ8JXNlbGVjdHttZXRob2QgJTN8Y29uc3RydWN0b3J8ZGVzdHJ1Y3Rvcn0yIHdpdGggJW9yZGluYWw0IHBhcmFtZXRlciBuYW1lZCAlNXwlc2VsZWN0e21ldGhvZCAlM3xjb25zdHJ1Y3RvcnxkZXN0cnVjdG9yfTIgd2l0aCAlb3JkaW5hbDQgcGFyYW1ldGVyIHdpdGglc2VsZWN0e291dHx9NSBhIGRlZmF1bHQgYXJndW1lbnR8JXNlbGVjdHttZXRob2QgJTN8Y29uc3RydWN0b3J8ZGVzdHJ1Y3Rvcn0yIHdpdGggJW9yZGluYWw0IHBhcmFtZXRlciB3aXRoIGEgZGlmZmVyZW50IGRlZmF1bHQgYXJndW1lbnR8JXNlbGVjdHt0eXBlZGVmfHR5cGUgYWxpYXN9MiBuYW1lICUzfCVzZWxlY3R7dHlwZWRlZnx0eXBlIGFsaWFzfTIgJTMgd2l0aCBkaWZmZXJlbnQgdW5kZXJseWluZyB0eXBlICU0fGRhdGEgbWVtYmVyIHdpdGggbmFtZSAlMnxkYXRhIG1lbWJlciAlMiB3aXRoIGRpZmZlcmVudCB0eXBlICUzfGRhdGEgbWVtYmVyICUyIHdpdGglc2VsZWN0e291dHx9MyBhbiBpbml0aWFsaXplcnxkYXRhIG1lbWJlciAlMiB3aXRoIGEgZGlmZmVyZW50IGluaXRpYWxpemVyfGRhdGEgbWVtYmVyICUyICVzZWxlY3R7aXMgY29uc3RleHByfGlzIG5vdCBjb25zdGV4cHJ9M3xmcmllbmQgJXNlbGVjdHtjbGFzc3xmdW5jdGlvbn0yfGZyaWVuZCAlMnxmcmllbmQgZnVuY3Rpb24gJTJ8fTEiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTUpCitESUFHKG5vdGVfbW9kdWxlX29kcl92aW9sYXRpb25fbWlzbWF0Y2hfZGVjbF91bmtub3duLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYnV0IGluICclMCcgZm91bmQgJXNlbGVjdHt8fHx8ZGlmZmVyZW50IHN0YXRpYyBhc3NlcnR8ZGlmZmVyZW50IGZpZWxkfGRpZmZlcmVudCBtZXRob2R8ZGlmZmVyZW50IHR5cGUgYWxpYXN8ZGlmZmVyZW50IHR5cGVkZWZ8ZGlmZmVyZW50IGRhdGEgbWVtYmVyfGRpZmZlcmVudCBmcmllbmQgZGVjbGFyYXRpb258YW5vdGhlciB1bmV4cGVjdGVkIGRlY2x9MSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxNSkKK0RJQUcobm90ZV9tb2R1bGVfb2RyX3Zpb2xhdGlvbl9ub19wb3NzaWJsZV9kZWNscywgQ0xBU1NfTk9URSwgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpGYXRhbCwgImRlZmluaXRpb24gaGFzIG5vIG1lbWJlciAlMCIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxNSkKK0RJQUcobm90ZV9tb2R1bGVfb2RyX3Zpb2xhdGlvbl9wb3NzaWJsZV9kZWNsLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiZGVjbGFyYXRpb24gb2YgJTAgZG9lcyBub3QgbWF0Y2giLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTUpCitESUFHKG5vdGVfbW9kdWxlX29kcl92aW9sYXRpb25fdGVtcGxhdGVfcGFyYW1ldGVyLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiYnV0IGluICclMCcgZm91bmQgJXNlbGVjdHt1bm5hbWVkIHRlbXBsYXRlIHBhcmFtZXRlciAlMnx0ZW1wbGF0ZSBwYXJhbWV0ZXIgJTJ8dGVtcGxhdGUgcGFyYW1ldGVyIHdpdGggJXNlbGVjdHtubyB8fTJkZWZhdWx0IGFyZ3VtZW50fHRlbXBsYXRlIHBhcmFtZXRlciB3aXRoIGRpZmZlcmVudCBkZWZhdWx0IGFyZ3VtZW50fTEiLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTUpCitESUFHKG5vdGVfcGNoX3JlYnVpbGRfcmVxdWlyZWQsIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICJwbGVhc2UgcmVidWlsZCBwcmVjb21waWxlZCBoZWFkZXIgJyUwJyIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxNSkKK0RJQUcobm90ZV9wY2hfcmVxdWlyZWRfYnksIENMQVNTX05PVEUsICh1bnNpZ25lZClkaWFnOjpTZXZlcml0eTo6RmF0YWwsICInJTAnIHJlcXVpcmVkIGJ5ICclMSciLCAwLCBTRklOQUVfU3VwcHJlc3MsIGZhbHNlLCBmYWxzZSwgMTUpCitESUFHKG5vdGVfc2Vjb25kX21vZHVsZV9kaWZmZXJlbmNlLCBDTEFTU19OT1RFLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6OkZhdGFsLCAiaW4gc2Vjb25kIGRlZmluaXRpb24sIHBvc3NpYmxlIGRpZmZlcmVuY2UgaXMgaGVyZSIsIDAsIFNGSU5BRV9TdXBwcmVzcywgZmFsc2UsIGZhbHNlLCAxNSkKK0RJQUcod2Fybl9kdXBsaWNhdGVfbW9kdWxlX2ZpbGVfZXh0ZW5zaW9uLCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJkdXBsaWNhdGUgbW9kdWxlIGZpbGUgZXh0ZW5zaW9uIGJsb2NrIG5hbWUgJyUwJyIsIDM5OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDE1KQorRElBRyh3YXJuX21vZHVsZV9zeXN0ZW1fYml0X2NvbmZsaWN0LCBDTEFTU19XQVJOSU5HLCAodW5zaWduZWQpZGlhZzo6U2V2ZXJpdHk6Oldhcm5pbmcsICJtb2R1bGUgZmlsZSAnJTAnIHdhcyB2YWxpZGF0ZWQgYXMgYSBzeXN0ZW0gbW9kdWxlIGFuZCBpcyBub3cgYmVpbmcgaW1wb3J0ZWQgYXMgYSBub24tc3lzdGVtIG1vZHVsZTsgYW55IGRpZmZlcmVuY2UgaW4gZGlhZ25vc3RpYyBvcHRpb25zIHdpbGwgYmUgaWdub3JlZCIsIDM5NywgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDE1KQorRElBRyh3YXJuX21vZHVsZV91c2VzX2RhdGVfdGltZSwgQ0xBU1NfV0FSTklORywgKHVuc2lnbmVkKWRpYWc6OlNldmVyaXR5OjpXYXJuaW5nLCAiJXNlbGVjdHtwcmVjb21waWxlZCBoZWFkZXJ8bW9kdWxlfTAgdXNlcyBfX0RBVEVfXyBvciBfX1RJTUVfXyIsIDQ5OSwgU0ZJTkFFX1N1cHByZXNzLCBmYWxzZSwgZmFsc2UsIDE4KQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRXhjZXB0aW9uU3BlY2lmaWNhdGlvblR5cGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0V4Y2VwdGlvblNwZWNpZmljYXRpb25UeXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMyYjViYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0V4Y2VwdGlvblNwZWNpZmljYXRpb25UeXBlLmgKQEAgLTAsMCArMSw2MCBAQAorLy89PT0tLS0gRXhjZXB0aW9uU3BlY2lmaWNhdGlvblR5cGUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgdGhlIEV4Y2VwdGlvblNwZWNpZmljYXRpb25UeXBlIGVudW1lcmF0aW9uIGFuZCB2YXJpb3VzCisvLy8gdXRpbGl0eSBmdW5jdGlvbnMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfRVhDRVBUSU9OU1BFQ0lGSUNBVElPTlRZUEVfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX0VYQ0VQVElPTlNQRUNJRklDQVRJT05UWVBFX0gKKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBUaGUgdmFyaW91cyB0eXBlcyBvZiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgdGhhdCBleGlzdCBpbiBDKysxMS4KK2VudW0gRXhjZXB0aW9uU3BlY2lmaWNhdGlvblR5cGUgeworICBFU1RfTm9uZSwgICAgICAgICAgICAgLy8vPCBubyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbgorICBFU1RfRHluYW1pY05vbmUsICAgICAgLy8vPCB0aHJvdygpCisgIEVTVF9EeW5hbWljLCAgICAgICAgICAvLy88IHRocm93KFQxLCBUMikKKyAgRVNUX01TQW55LCAgICAgICAgICAgIC8vLzwgTWljcm9zb2Z0IHRocm93KC4uLikgZXh0ZW5zaW9uCisgIEVTVF9CYXNpY05vZXhjZXB0LCAgICAvLy88IG5vZXhjZXB0CisgIEVTVF9Db21wdXRlZE5vZXhjZXB0LCAvLy88IG5vZXhjZXB0KGV4cHJlc3Npb24pCisgIEVTVF9VbmV2YWx1YXRlZCwgICAgICAvLy88IG5vdCBldmFsdWF0ZWQgeWV0LCBmb3Igc3BlY2lhbCBtZW1iZXIgZnVuY3Rpb24KKyAgRVNUX1VuaW5zdGFudGlhdGVkLCAgIC8vLzwgbm90IGluc3RhbnRpYXRlZCB5ZXQKKyAgRVNUX1VucGFyc2VkICAgICAgICAgIC8vLzwgbm90IHBhcnNlZCB5ZXQKK307CisKK2lubGluZSBib29sIGlzRHluYW1pY0V4Y2VwdGlvblNwZWMoRXhjZXB0aW9uU3BlY2lmaWNhdGlvblR5cGUgRVNwZWNUeXBlKSB7CisgIHJldHVybiBFU3BlY1R5cGUgPj0gRVNUX0R5bmFtaWNOb25lICYmIEVTcGVjVHlwZSA8PSBFU1RfTVNBbnk7Cit9CisKK2lubGluZSBib29sIGlzTm9leGNlcHRFeGNlcHRpb25TcGVjKEV4Y2VwdGlvblNwZWNpZmljYXRpb25UeXBlIEVTcGVjVHlwZSkgeworICByZXR1cm4gRVNwZWNUeXBlID09IEVTVF9CYXNpY05vZXhjZXB0IHx8IEVTcGVjVHlwZSA9PSBFU1RfQ29tcHV0ZWROb2V4Y2VwdDsKK30KKworaW5saW5lIGJvb2wgaXNVbnJlc29sdmVkRXhjZXB0aW9uU3BlYyhFeGNlcHRpb25TcGVjaWZpY2F0aW9uVHlwZSBFU3BlY1R5cGUpIHsKKyAgcmV0dXJuIEVTcGVjVHlwZSA9PSBFU1RfVW5ldmFsdWF0ZWQgfHwgRVNwZWNUeXBlID09IEVTVF9Vbmluc3RhbnRpYXRlZDsKK30KKworLy8vIFxicmllZiBQb3NzaWJsZSByZXN1bHRzIGZyb20gZXZhbHVhdGlvbiBvZiBhIG5vZXhjZXB0IGV4cHJlc3Npb24uCitlbnVtIENhblRocm93UmVzdWx0IHsKKyAgQ1RfQ2Fubm90LAorICBDVF9EZXBlbmRlbnQsCisgIENUX0NhbgorfTsKKworaW5saW5lIENhblRocm93UmVzdWx0IG1lcmdlQ2FuVGhyb3coQ2FuVGhyb3dSZXN1bHQgQ1QxLCBDYW5UaHJvd1Jlc3VsdCBDVDIpIHsKKyAgLy8gQ2FuVGhyb3dSZXN1bHQgY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgdGhlIG1heGltdW0gaXMgdGhlIGNvcnJlY3QKKyAgLy8gbWVyZ2UgcmVzdWx0LgorICByZXR1cm4gQ1QxID4gQ1QyID8gQ1QxIDogQ1QyOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQkFTSUNfRVhDRVBUSU9OU1BFQ0lGSUNBVElPTlRZUEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRXhwcmVzc2lvblRyYWl0cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRXhwcmVzc2lvblRyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNjNhMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9FeHByZXNzaW9uVHJhaXRzLmgKQEAgLTAsMCArMSwyNiBAQAorLy89PT0tIEV4cHJlc3Npb25UcmFpdHMuaCAtIEMrKyBFeHByZXNzaW9uIFRyYWl0cyBTdXBwb3J0IEVudW1zIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgZW51bWVyYXRpb25zIGZvciBleHByZXNzaW9uIHRyYWl0cyBpbnRyaW5zaWNzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfRVhQUkVTU0lPTlRSQUlUU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfRVhQUkVTU0lPTlRSQUlUU19ICisKK25hbWVzcGFjZSBjbGFuZyB7CisKKyAgZW51bSBFeHByZXNzaW9uVHJhaXQgeworICAgIEVUX0lzTFZhbHVlRXhwciwKKyAgICBFVF9Jc1JWYWx1ZUV4cHIKKyAgfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9GaWxlTWFuYWdlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRmlsZU1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODE3ZGQyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvRmlsZU1hbmFnZXIuaApAQCAtMCwwICsxLDI4OSBAQAorLy89PT0tLS0gRmlsZU1hbmFnZXIuaCAtIEZpbGUgU3lzdGVtIFByb2JpbmcgYW5kIENhY2hpbmcgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgdGhlIGNsYW5nOjpGaWxlTWFuYWdlciBpbnRlcmZhY2UgYW5kIGFzc29jaWF0ZWQgdHlwZXMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19GSUxFTUFOQUdFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfRklMRU1BTkFHRVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRmlsZVN5c3RlbU9wdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9WaXJ0dWFsRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yT3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgPGN0aW1lPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1lbW9yeUJ1ZmZlcjsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgRmlsZVN5c3RlbVN0YXRDYWNoZTsKKworLy8vIFxicmllZiBDYWNoZWQgaW5mb3JtYXRpb24gYWJvdXQgb25lIGRpcmVjdG9yeSAoZWl0aGVyIG9uIGRpc2sgb3IgaW4KKy8vLyB0aGUgdmlydHVhbCBmaWxlIHN5c3RlbSkuCitjbGFzcyBEaXJlY3RvcnlFbnRyeSB7CisgIGZyaWVuZCBjbGFzcyBGaWxlTWFuYWdlcjsKKworICBTdHJpbmdSZWYgTmFtZTsgLy8gTmFtZSBvZiB0aGUgZGlyZWN0b3J5LgorCitwdWJsaWM6CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorfTsKKworLy8vIFxicmllZiBDYWNoZWQgaW5mb3JtYXRpb24gYWJvdXQgb25lIGZpbGUgKGVpdGhlciBvbiBkaXNrCisvLy8gb3IgaW4gdGhlIHZpcnR1YWwgZmlsZSBzeXN0ZW0pLgorLy8vCisvLy8gSWYgdGhlICdGaWxlJyBtZW1iZXIgaXMgdmFsaWQsIHRoZW4gdGhpcyBGaWxlRW50cnkgaGFzIGFuIG9wZW4gZmlsZQorLy8vIGRlc2NyaXB0b3IgZm9yIHRoZSBmaWxlLgorY2xhc3MgRmlsZUVudHJ5IHsKKyAgZnJpZW5kIGNsYXNzIEZpbGVNYW5hZ2VyOworCisgIFN0cmluZ1JlZiBOYW1lOyAgICAgICAgICAgICAvLyBOYW1lIG9mIHRoZSBmaWxlLgorICBzdGQ6OnN0cmluZyBSZWFsUGF0aE5hbWU7ICAgLy8gUmVhbCBwYXRoIHRvIHRoZSBmaWxlOyBjb3VsZCBiZSBlbXB0eS4KKyAgb2ZmX3QgU2l6ZTsgICAgICAgICAgICAgICAgIC8vIEZpbGUgc2l6ZSBpbiBieXRlcy4KKyAgdGltZV90IE1vZFRpbWU7ICAgICAgICAgICAgIC8vIE1vZGlmaWNhdGlvbiB0aW1lIG9mIGZpbGUuCisgIGNvbnN0IERpcmVjdG9yeUVudHJ5ICpEaXI7ICAvLyBEaXJlY3RvcnkgZmlsZSBsaXZlcyBpbi4KKyAgdW5zaWduZWQgVUlEOyAgICAgICAgICAgICAgIC8vIEEgdW5pcXVlIChzbWFsbCkgSUQgZm9yIHRoZSBmaWxlLgorICBsbHZtOjpzeXM6OmZzOjpVbmlxdWVJRCBVbmlxdWVJRDsKKyAgYm9vbCBJc05hbWVkUGlwZTsKKyAgYm9vbCBJblBDSDsKKyAgYm9vbCBJc1ZhbGlkOyAgICAgICAgICAgICAgIC8vIElzIHRoaXMgXGMgRmlsZUVudHJ5IGluaXRpYWxpemVkIGFuZCB2YWxpZD8KKworICAvLy8gXGJyaWVmIFRoZSBvcGVuIGZpbGUsIGlmIGl0IGlzIG93bmVkIGJ5IHRoZSBccCBGaWxlRW50cnkuCisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPHZmczo6RmlsZT4gRmlsZTsKKworcHVibGljOgorICBGaWxlRW50cnkoKQorICAgICAgOiBVbmlxdWVJRCgwLCAwKSwgSXNOYW1lZFBpcGUoZmFsc2UpLCBJblBDSChmYWxzZSksIElzVmFsaWQoZmFsc2UpCisgIHt9CisKKyAgRmlsZUVudHJ5KGNvbnN0IEZpbGVFbnRyeSAmKSA9IGRlbGV0ZTsKKyAgRmlsZUVudHJ5ICZvcGVyYXRvcj0oY29uc3QgRmlsZUVudHJ5ICYpID0gZGVsZXRlOworCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorICBTdHJpbmdSZWYgdHJ5R2V0UmVhbFBhdGhOYW1lKCkgY29uc3QgeyByZXR1cm4gUmVhbFBhdGhOYW1lOyB9CisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIElzVmFsaWQ7IH0KKyAgb2ZmX3QgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKyAgdW5zaWduZWQgZ2V0VUlEKCkgY29uc3QgeyByZXR1cm4gVUlEOyB9CisgIGNvbnN0IGxsdm06OnN5czo6ZnM6OlVuaXF1ZUlEICZnZXRVbmlxdWVJRCgpIGNvbnN0IHsgcmV0dXJuIFVuaXF1ZUlEOyB9CisgIGJvb2wgaXNJblBDSCgpIGNvbnN0IHsgcmV0dXJuIEluUENIOyB9CisgIHRpbWVfdCBnZXRNb2RpZmljYXRpb25UaW1lKCkgY29uc3QgeyByZXR1cm4gTW9kVGltZTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBkaXJlY3RvcnkgdGhlIGZpbGUgbGl2ZXMgaW4uCisgIGNvbnN0IERpcmVjdG9yeUVudHJ5ICpnZXREaXIoKSBjb25zdCB7IHJldHVybiBEaXI7IH0KKworICBib29sIG9wZXJhdG9yPChjb25zdCBGaWxlRW50cnkgJlJIUykgY29uc3QgeyByZXR1cm4gVW5pcXVlSUQgPCBSSFMuVW5pcXVlSUQ7IH0KKworICAvLy8gXGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIGZpbGUgaXMgYSBuYW1lZCBwaXBlIChhbmQgdGh1cyBjYW4ndCBiZSBvcGVuZWQgYnkKKyAgLy8vIHRoZSBuYXRpdmUgRmlsZU1hbmFnZXIgbWV0aG9kcykuCisgIGJvb2wgaXNOYW1lZFBpcGUoKSBjb25zdCB7IHJldHVybiBJc05hbWVkUGlwZTsgfQorCisgIHZvaWQgY2xvc2VGaWxlKCkgY29uc3QgeworICAgIEZpbGUucmVzZXQoKTsgLy8gcmVseSBvbiBkZXN0cnVjdG9yIHRvIGNsb3NlIEZpbGUKKyAgfQorfTsKKworc3RydWN0IEZpbGVEYXRhOworCisvLy8gXGJyaWVmIEltcGxlbWVudHMgc3VwcG9ydCBmb3IgZmlsZSBzeXN0ZW0gbG9va3VwLCBmaWxlIHN5c3RlbSBjYWNoaW5nLAorLy8vIGFuZCBkaXJlY3Rvcnkgc2VhcmNoIG1hbmFnZW1lbnQuCisvLy8KKy8vLyBUaGlzIGFsc28gaGFuZGxlcyBtb3JlIGFkdmFuY2VkIHByb3BlcnRpZXMsIHN1Y2ggYXMgdW5pcXVpbmcgZmlsZXMgYmFzZWQKKy8vLyBvbiAiaW5vZGUiLCBzbyB0aGF0IGEgZmlsZSB3aXRoIHR3byBuYW1lcyAoZS5nLiBzeW1saW5rZWQpIHdpbGwgYmUgdHJlYXRlZAorLy8vIGFzIGEgc2luZ2xlIGZpbGUuCisvLy8KK2NsYXNzIEZpbGVNYW5hZ2VyIDogcHVibGljIFJlZkNvdW50ZWRCYXNlPEZpbGVNYW5hZ2VyPiB7CisgIEludHJ1c2l2ZVJlZkNudFB0cjx2ZnM6OkZpbGVTeXN0ZW0+IEZTOworICBGaWxlU3lzdGVtT3B0aW9ucyBGaWxlU3lzdGVtT3B0czsKKworICAvLy8gXGJyaWVmIENhY2hlIGZvciBleGlzdGluZyByZWFsIGRpcmVjdG9yaWVzLgorICBzdGQ6Om1hcDxsbHZtOjpzeXM6OmZzOjpVbmlxdWVJRCwgRGlyZWN0b3J5RW50cnk+IFVuaXF1ZVJlYWxEaXJzOworCisgIC8vLyBcYnJpZWYgQ2FjaGUgZm9yIGV4aXN0aW5nIHJlYWwgZmlsZXMuCisgIHN0ZDo6bWFwPGxsdm06OnN5czo6ZnM6OlVuaXF1ZUlELCBGaWxlRW50cnk+IFVuaXF1ZVJlYWxGaWxlczsKKworICAvLy8gXGJyaWVmIFRoZSB2aXJ0dWFsIGRpcmVjdG9yaWVzIHRoYXQgd2UgaGF2ZSBhbGxvY2F0ZWQuCisgIC8vLworICAvLy8gRm9yIGVhY2ggdmlydHVhbCBmaWxlIChlLmcuIGZvby9iYXIvYmF6LmNwcCksIHdlIGFkZCBhbGwgb2YgaXRzIHBhcmVudAorICAvLy8gZGlyZWN0b3JpZXMgKGZvby8gYW5kIGZvby9iYXIvKSBoZXJlLgorICBTbWFsbFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGlyZWN0b3J5RW50cnk+LCA0PiBWaXJ0dWFsRGlyZWN0b3J5RW50cmllczsKKyAgLy8vIFxicmllZiBUaGUgdmlydHVhbCBmaWxlcyB0aGF0IHdlIGhhdmUgYWxsb2NhdGVkLgorICBTbWFsbFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RmlsZUVudHJ5PiwgND4gVmlydHVhbEZpbGVFbnRyaWVzOworCisgIC8vLyBcYnJpZWYgQSBjYWNoZSB0aGF0IG1hcHMgcGF0aHMgdG8gZGlyZWN0b3J5IGVudHJpZXMgKGVpdGhlciByZWFsIG9yCisgIC8vLyB2aXJ0dWFsKSB3ZSBoYXZlIGxvb2tlZCB1cAorICAvLy8KKyAgLy8vIFRoZSBhY3R1YWwgRW50cmllcyBmb3IgcmVhbCBkaXJlY3Rvcmllcy9maWxlcyBhcmUKKyAgLy8vIG93bmVkIGJ5IFVuaXF1ZVJlYWxEaXJzL1VuaXF1ZVJlYWxGaWxlcyBhYm92ZSwgd2hpbGUgdGhlIEVudHJpZXMKKyAgLy8vIGZvciB2aXJ0dWFsIGRpcmVjdG9yaWVzL2ZpbGVzIGFyZSBvd25lZCBieQorICAvLy8gVmlydHVhbERpcmVjdG9yeUVudHJpZXMvVmlydHVhbEZpbGVFbnRyaWVzIGFib3ZlLgorICAvLy8KKyAgbGx2bTo6U3RyaW5nTWFwPERpcmVjdG9yeUVudHJ5KiwgbGx2bTo6QnVtcFB0ckFsbG9jYXRvcj4gU2VlbkRpckVudHJpZXM7CisKKyAgLy8vIFxicmllZiBBIGNhY2hlIHRoYXQgbWFwcyBwYXRocyB0byBmaWxlIGVudHJpZXMgKGVpdGhlciByZWFsIG9yCisgIC8vLyB2aXJ0dWFsKSB3ZSBoYXZlIGxvb2tlZCB1cC4KKyAgLy8vCisgIC8vLyBcc2VlIFNlZW5EaXJFbnRyaWVzCisgIGxsdm06OlN0cmluZ01hcDxGaWxlRW50cnkqLCBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yPiBTZWVuRmlsZUVudHJpZXM7CisKKyAgLy8vIFxicmllZiBUaGUgY2Fub25pY2FsIG5hbWVzIG9mIGRpcmVjdG9yaWVzLgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBEaXJlY3RvcnlFbnRyeSAqLCBsbHZtOjpTdHJpbmdSZWY+IENhbm9uaWNhbERpck5hbWVzOworCisgIC8vLyBcYnJpZWYgU3RvcmFnZSBmb3IgY2Fub25pY2FsIG5hbWVzIHRoYXQgd2UgaGF2ZSBjb21wdXRlZC4KKyAgbGx2bTo6QnVtcFB0ckFsbG9jYXRvciBDYW5vbmljYWxOYW1lU3RvcmFnZTsKKworICAvLy8gXGJyaWVmIEVhY2ggRmlsZUVudHJ5IHdlIGNyZWF0ZSBpcyBhc3NpZ25lZCBhIHVuaXF1ZSBJRCAjLgorICAvLy8KKyAgdW5zaWduZWQgTmV4dEZpbGVVSUQ7CisKKyAgLy8gU3RhdGlzdGljcy4KKyAgdW5zaWduZWQgTnVtRGlyTG9va3VwcywgTnVtRmlsZUxvb2t1cHM7CisgIHVuc2lnbmVkIE51bURpckNhY2hlTWlzc2VzLCBOdW1GaWxlQ2FjaGVNaXNzZXM7CisKKyAgLy8gQ2FjaGluZy4KKyAgc3RkOjp1bmlxdWVfcHRyPEZpbGVTeXN0ZW1TdGF0Q2FjaGU+IFN0YXRDYWNoZTsKKworICBib29sIGdldFN0YXRWYWx1ZShTdHJpbmdSZWYgUGF0aCwgRmlsZURhdGEgJkRhdGEsIGJvb2wgaXNGaWxlLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dmZzOjpGaWxlPiAqRik7CisKKyAgLy8vIEFkZCBhbGwgYW5jZXN0b3JzIG9mIHRoZSBnaXZlbiBwYXRoIChwb2ludGluZyB0byBlaXRoZXIgYSBmaWxlCisgIC8vLyBvciBhIGRpcmVjdG9yeSkgYXMgdmlydHVhbCBkaXJlY3Rvcmllcy4KKyAgdm9pZCBhZGRBbmNlc3RvcnNBc1ZpcnR1YWxEaXJzKFN0cmluZ1JlZiBQYXRoKTsKKworcHVibGljOgorICBGaWxlTWFuYWdlcihjb25zdCBGaWxlU3lzdGVtT3B0aW9ucyAmRmlsZVN5c3RlbU9wdHMsCisgICAgICAgICAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjx2ZnM6OkZpbGVTeXN0ZW0+IEZTID0gbnVsbHB0cik7CisgIH5GaWxlTWFuYWdlcigpOworCisgIC8vLyBcYnJpZWYgSW5zdGFsbHMgdGhlIHByb3ZpZGVkIEZpbGVTeXN0ZW1TdGF0Q2FjaGUgb2JqZWN0IHdpdGhpbgorICAvLy8gdGhlIEZpbGVNYW5hZ2VyLgorICAvLy8KKyAgLy8vIE93bmVyc2hpcCBvZiB0aGlzIG9iamVjdCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgRmlsZU1hbmFnZXIuCisgIC8vLworICAvLy8gXHBhcmFtIHN0YXRDYWNoZSB0aGUgbmV3IHN0YXQgY2FjaGUgdG8gaW5zdGFsbC4gT3duZXJzaGlwIG9mIHRoaXMKKyAgLy8vIG9iamVjdCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgRmlsZU1hbmFnZXIuCisgIC8vLworICAvLy8gXHBhcmFtIEF0QmVnaW5uaW5nIHdoZXRoZXIgdGhpcyBuZXcgc3RhdCBjYWNoZSBtdXN0IGJlIGluc3RhbGxlZCBhdCB0aGUKKyAgLy8vIGJlZ2lubmluZyBvZiB0aGUgY2hhaW4gb2Ygc3RhdCBjYWNoZXMuIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBhZGRlZCB0bworICAvLy8gdGhlIGVuZCBvZiB0aGUgY2hhaW4uCisgIHZvaWQgYWRkU3RhdENhY2hlKHN0ZDo6dW5pcXVlX3B0cjxGaWxlU3lzdGVtU3RhdENhY2hlPiBzdGF0Q2FjaGUsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgQXRCZWdpbm5pbmcgPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgRmlsZVN5c3RlbVN0YXRDYWNoZSBvYmplY3QgZnJvbSB0aGUgbWFuYWdlci4KKyAgdm9pZCByZW1vdmVTdGF0Q2FjaGUoRmlsZVN5c3RlbVN0YXRDYWNoZSAqc3RhdENhY2hlKTsKKworICAvLy8gXGJyaWVmIFJlbW92ZXMgYWxsIEZpbGVTeXN0ZW1TdGF0Q2FjaGUgb2JqZWN0cyBmcm9tIHRoZSBtYW5hZ2VyLgorICB2b2lkIGNsZWFyU3RhdENhY2hlcygpOworCisgIC8vLyBcYnJpZWYgTG9va3VwLCBjYWNoZSwgYW5kIHZlcmlmeSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSAocmVhbCBvcgorICAvLy8gdmlydHVhbCkuCisgIC8vLworICAvLy8gVGhpcyByZXR1cm5zIE5VTEwgaWYgdGhlIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBDYWNoZUZhaWx1cmUgSWYgdHJ1ZSBhbmQgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHdlJ2xsIGNhY2hlCisgIC8vLyB0aGUgZmFpbHVyZSB0byBmaW5kIHRoaXMgZmlsZS4KKyAgY29uc3QgRGlyZWN0b3J5RW50cnkgKmdldERpcmVjdG9yeShTdHJpbmdSZWYgRGlyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENhY2hlRmFpbHVyZSA9IHRydWUpOworCisgIC8vLyBcYnJpZWYgTG9va3VwLCBjYWNoZSwgYW5kIHZlcmlmeSB0aGUgc3BlY2lmaWVkIGZpbGUgKHJlYWwgb3IKKyAgLy8vIHZpcnR1YWwpLgorICAvLy8KKyAgLy8vIFRoaXMgcmV0dXJucyBOVUxMIGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QuCisgIC8vLworICAvLy8gXHBhcmFtIE9wZW5GaWxlIGlmIHRydWUgYW5kIHRoZSBmaWxlIGV4aXN0cywgaXQgd2lsbCBiZSBvcGVuZWQuCisgIC8vLworICAvLy8gXHBhcmFtIENhY2hlRmFpbHVyZSBJZiB0cnVlIGFuZCB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgd2UnbGwgY2FjaGUKKyAgLy8vIHRoZSBmYWlsdXJlIHRvIGZpbmQgdGhpcyBmaWxlLgorICBjb25zdCBGaWxlRW50cnkgKmdldEZpbGUoU3RyaW5nUmVmIEZpbGVuYW1lLCBib29sIE9wZW5GaWxlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENhY2hlRmFpbHVyZSA9IHRydWUpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgY3VycmVudCBmaWxlIHN5c3RlbSBvcHRpb25zCisgIEZpbGVTeXN0ZW1PcHRpb25zICZnZXRGaWxlU3lzdGVtT3B0cygpIHsgcmV0dXJuIEZpbGVTeXN0ZW1PcHRzOyB9CisgIGNvbnN0IEZpbGVTeXN0ZW1PcHRpb25zICZnZXRGaWxlU3lzdGVtT3B0cygpIGNvbnN0IHsgcmV0dXJuIEZpbGVTeXN0ZW1PcHRzOyB9CisKKyAgSW50cnVzaXZlUmVmQ250UHRyPHZmczo6RmlsZVN5c3RlbT4gZ2V0VmlydHVhbEZpbGVTeXN0ZW0oKSBjb25zdCB7CisgICAgcmV0dXJuIEZTOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBhIGZpbGUgZW50cnkgZm9yIGEgInZpcnR1YWwiIGZpbGUgdGhhdCBhY3RzIGFzCisgIC8vLyBpZiB0aGVyZSB3ZXJlIGEgZmlsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIG9uIGRpc2suCisgIC8vLworICAvLy8gVGhlIGZpbGUgaXRzZWxmIGlzIG5vdCBhY2Nlc3NlZC4KKyAgY29uc3QgRmlsZUVudHJ5ICpnZXRWaXJ0dWFsRmlsZShTdHJpbmdSZWYgRmlsZW5hbWUsIG9mZl90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV90IE1vZGlmaWNhdGlvblRpbWUpOworCisgIC8vLyBcYnJpZWYgT3BlbiB0aGUgc3BlY2lmaWVkIGZpbGUgYXMgYSBNZW1vcnlCdWZmZXIsIHJldHVybmluZyBhIG5ldworICAvLy8gTWVtb3J5QnVmZmVyIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSByZXR1cm5pbmcgbnVsbC4KKyAgbGx2bTo6RXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TWVtb3J5QnVmZmVyPj4KKyAgZ2V0QnVmZmVyRm9yRmlsZShjb25zdCBGaWxlRW50cnkgKkVudHJ5LCBib29sIGlzVm9sYXRpbGUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZENsb3NlT3BlbkZpbGUgPSB0cnVlKTsKKyAgbGx2bTo6RXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TWVtb3J5QnVmZmVyPj4KKyAgZ2V0QnVmZmVyRm9yRmlsZShTdHJpbmdSZWYgRmlsZW5hbWUpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSAnc3RhdCcgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBccCBQYXRoLgorICAvLy8KKyAgLy8vIElmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLCBpdCB3aWxsIGJlIHJlc29sdmVkIGFnYWluc3QgdGhlIFdvcmtpbmdEaXIgb2YgdGhlCisgIC8vLyBGaWxlTWFuYWdlcidzIEZpbGVTeXN0ZW1PcHRpb25zLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGZhbHNlIG9uIHN1Y2Nlc3MsIHRydWUgb24gZXJyb3IuCisgIGJvb2wgZ2V0Tm9uY2FjaGVkU3RhdFZhbHVlKFN0cmluZ1JlZiBQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZnM6OlN0YXR1cyAmUmVzdWx0KTsKKworICAvLy8gXGJyaWVmIFJlbW92ZSB0aGUgcmVhbCBmaWxlIFxwIEVudHJ5IGZyb20gdGhlIGNhY2hlLgorICB2b2lkIGludmFsaWRhdGVDYWNoZShjb25zdCBGaWxlRW50cnkgKkVudHJ5KTsKKworICAvLy8gXGJyaWVmIElmIHBhdGggaXMgbm90IGFic29sdXRlIGFuZCBGaWxlU3lzdGVtT3B0aW9ucyBzZXQgdGhlIHdvcmtpbmcKKyAgLy8vIGRpcmVjdG9yeSwgdGhlIHBhdGggaXMgbW9kaWZpZWQgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIGdpdmVuCisgIC8vLyB3b3JraW5nIGRpcmVjdG9yeS4KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgXGMgcGF0aCBjaGFuZ2VkLgorICBib29sIEZpeHVwUmVsYXRpdmVQYXRoKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmcGF0aCkgY29uc3Q7CisKKyAgLy8vIE1ha2VzIFxjIFBhdGggYWJzb2x1dGUgdGFraW5nIGludG8gYWNjb3VudCBGaWxlU3lzdGVtT3B0aW9ucyBhbmQgdGhlCisgIC8vLyB3b3JraW5nIGRpcmVjdG9yeSBvcHRpb24uCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIFxjIFBhdGggY2hhbmdlZCB0byBhYnNvbHV0ZS4KKyAgYm9vbCBtYWtlQWJzb2x1dGVQYXRoKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUGF0aCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBQcm9kdWNlIGFuIGFycmF5IG1hcHBpbmcgZnJvbSB0aGUgdW5pcXVlIElEcyBhc3NpZ25lZCB0byBlYWNoCisgIC8vLyBmaWxlIHRvIHRoZSBjb3JyZXNwb25kaW5nIEZpbGVFbnRyeSBwb2ludGVyLgorICB2b2lkIEdldFVuaXF1ZUlETWFwcGluZygKKyAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IEZpbGVFbnRyeSAqPiAmVUlEVG9GaWxlcykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBNb2RpZmllcyB0aGUgc2l6ZSBhbmQgbW9kaWZpY2F0aW9uIHRpbWUgb2YgYSBwcmV2aW91c2x5IGNyZWF0ZWQKKyAgLy8vIEZpbGVFbnRyeS4gVXNlIHdpdGggY2F1dGlvbi4KKyAgc3RhdGljIHZvaWQgbW9kaWZ5RmlsZUVudHJ5KEZpbGVFbnRyeSAqRmlsZSwgb2ZmX3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBNb2RpZmljYXRpb25UaW1lKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBjYW5vbmljYWwgbmFtZSBmb3IgYSBnaXZlbiBkaXJlY3RvcnkuCisgIC8vLworICAvLy8gVGhpcyBpcyBhIHZlcnkgZXhwZW5zaXZlIG9wZXJhdGlvbiwgZGVzcGl0ZSBpdHMgcmVzdWx0cyBiZWluZyBjYWNoZWQsCisgIC8vLyBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBwaHlzaWNhbCBsYXlvdXQgb2YgdGhlIGZpbGUgc3lzdGVtIGlzCisgIC8vLyByZXF1aXJlZCwgd2hpY2ggaXMgKGFsbW9zdCkgbmV2ZXIuCisgIFN0cmluZ1JlZiBnZXRDYW5vbmljYWxOYW1lKGNvbnN0IERpcmVjdG9yeUVudHJ5ICpEaXIpOworCisgIHZvaWQgUHJpbnRTdGF0cygpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0JBU0lDX0ZJTEVNQU5BR0VSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0ZpbGVTeXN0ZW1PcHRpb25zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9GaWxlU3lzdGVtT3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZjEzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9GaWxlU3lzdGVtT3B0aW9ucy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vPT09LS0tIEZpbGVTeXN0ZW1PcHRpb25zLmggLSBGaWxlIFN5c3RlbSBPcHRpb25zIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHRoZSBjbGFuZzo6RmlsZVN5c3RlbU9wdGlvbnMgaW50ZXJmYWNlLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfRklMRVNZU1RFTU9QVElPTlNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX0ZJTEVTWVNURU1PUFRJT05TX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBLZWVwcyB0cmFjayBvZiBvcHRpb25zIHRoYXQgYWZmZWN0IGhvdyBmaWxlIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZC4KK2NsYXNzIEZpbGVTeXN0ZW1PcHRpb25zIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBJZiBzZXQsIHBhdGhzIGFyZSByZXNvbHZlZCBhcyBpZiB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2FzCisgIC8vLyBzZXQgdG8gdGhlIHZhbHVlIG9mIFdvcmtpbmdEaXIuCisgIHN0ZDo6c3RyaW5nIFdvcmtpbmdEaXI7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9GaWxlU3lzdGVtU3RhdENhY2hlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9GaWxlU3lzdGVtU3RhdENhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JkMjI2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0ZpbGVTeXN0ZW1TdGF0Q2FjaGUuaApAQCAtMCwwICsxLDE0NCBAQAorLy89PT0tIEZpbGVTeXN0ZW1TdGF0Q2FjaGUuaCAtIENhY2hpbmcgZm9yICdzdGF0JyBjYWxscyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgRmlsZVN5c3RlbVN0YXRDYWNoZSBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX0ZJTEVTWVNURU1TVEFUQ0FDSEVfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX0ZJTEVTWVNURU1TVEFUQ0FDSEVfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3RpbWU+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgY2xhbmcgeworCituYW1lc3BhY2UgdmZzIHsKKworY2xhc3MgRmlsZTsKK2NsYXNzIEZpbGVTeXN0ZW07CisKK30gLy8gbmFtZXNwYWNlIHZmcworCisvLyBGSVhNRTogc2hvdWxkIHByb2JhYmx5IHJlcGxhY2UgdGhpcyB3aXRoIHZmczo6U3RhdHVzCitzdHJ1Y3QgRmlsZURhdGEgeworICBzdGQ6OnN0cmluZyBOYW1lOworICB1aW50NjRfdCBTaXplID0gMDsKKyAgdGltZV90IE1vZFRpbWUgPSAwOworICBsbHZtOjpzeXM6OmZzOjpVbmlxdWVJRCBVbmlxdWVJRDsKKyAgYm9vbCBJc0RpcmVjdG9yeSA9IGZhbHNlOworICBib29sIElzTmFtZWRQaXBlID0gZmFsc2U7CisgIGJvb2wgSW5QQ0ggPSBmYWxzZTsKKworICAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgd2hlbiBmaWxlcyBzdXBwb3J0IG11bHRpcGxlIG5hbWVzCisgIGJvb2wgSXNWRlNNYXBwZWQgPSBmYWxzZTsKKworICBGaWxlRGF0YSgpID0gZGVmYXVsdDsKK307CisKKy8vLyBcYnJpZWYgQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBpbnRyb2R1Y2luZyBhIEZpbGVNYW5hZ2VyIGNhY2hlIGZvciAnc3RhdCcKKy8vLyBzeXN0ZW0gY2FsbHMsIHdoaWNoIGlzIHVzZWQgYnkgcHJlY29tcGlsZWQgYW5kIHByZXRva2VuaXplZCBoZWFkZXJzIHRvCisvLy8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KK2NsYXNzIEZpbGVTeXN0ZW1TdGF0Q2FjaGUgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjp1bmlxdWVfcHRyPEZpbGVTeXN0ZW1TdGF0Q2FjaGU+IE5leHRTdGF0Q2FjaGU7CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+RmlsZVN5c3RlbVN0YXRDYWNoZSgpID0gZGVmYXVsdDsKKyAgCisgIGVudW0gTG9va3VwUmVzdWx0IHsKKyAgICAvLy8gV2Uga25vdyB0aGUgZmlsZSBleGlzdHMgYW5kIGl0cyBjYWNoZWQgc3RhdCBkYXRhLgorICAgIENhY2hlRXhpc3RzLAorCisgICAgLy8vIFdlIGtub3cgdGhhdCB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LgorICAgIENhY2hlTWlzc2luZworICB9OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSAnc3RhdCcgaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgcGF0aCwgdXNpbmcgdGhlIGNhY2hlCisgIC8vLyB0byBhY2NlbGVyYXRlIGl0IGlmIHBvc3NpYmxlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFxjIHRydWUgaWYgdGhlIHBhdGggZG9lcyBub3QgZXhpc3Qgb3IgXGMgZmFsc2UgaWYgaXQgZXhpc3RzLgorICAvLy8KKyAgLy8vIElmIGlzRmlsZSBpcyB0cnVlLCB0aGVuIHRoaXMgbG9va3VwIHNob3VsZCBvbmx5IHJldHVybiBzdWNjZXNzIGZvciBmaWxlcworICAvLy8gKG5vdCBkaXJlY3RvcmllcykuICBJZiBpdCBpcyBmYWxzZSB0aGlzIGxvb2t1cCBzaG91bGQgb25seSByZXR1cm4KKyAgLy8vIHN1Y2Nlc3MgZm9yIGRpcmVjdG9yaWVzIChub3QgZmlsZXMpLiAgT24gYSBzdWNjZXNzZnVsIGZpbGUgbG9va3VwLCB0aGUKKyAgLy8vIGltcGxlbWVudGF0aW9uIGNhbiBvcHRpb25hbGx5IGZpbGwgaW4gXHAgRiB3aXRoIGEgdmFsaWQgXHAgRmlsZSBvYmplY3QgYW5kCisgIC8vLyB0aGUgY2xpZW50IGd1YXJhbnRlZXMgdGhhdCBpdCB3aWxsIGNsb3NlIGl0LgorICBzdGF0aWMgYm9vbCBnZXQoU3RyaW5nUmVmIFBhdGgsIEZpbGVEYXRhICZEYXRhLCBib29sIGlzRmlsZSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx2ZnM6OkZpbGU+ICpGLCBGaWxlU3lzdGVtU3RhdENhY2hlICpDYWNoZSwKKyAgICAgICAgICAgICAgICAgIHZmczo6RmlsZVN5c3RlbSAmRlMpOworCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbmV4dCBzdGF0IGNhbGwgY2FjaGUgaW4gdGhlIGNoYWluIG9mIHN0YXQgY2FjaGVzLgorICAvLy8gVGFrZXMgb3duZXJzaGlwIG9mIHRoZSBnaXZlbiBzdGF0IGNhY2hlLgorICB2b2lkIHNldE5leHRTdGF0Q2FjaGUoc3RkOjp1bmlxdWVfcHRyPEZpbGVTeXN0ZW1TdGF0Q2FjaGU+IENhY2hlKSB7CisgICAgTmV4dFN0YXRDYWNoZSA9IHN0ZDo6bW92ZShDYWNoZSk7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG5leHQgc3RhdCBjYWxsIGNhY2hlIGluIHRoZSBjaGFpbi4KKyAgRmlsZVN5c3RlbVN0YXRDYWNoZSAqZ2V0TmV4dFN0YXRDYWNoZSgpIHsgcmV0dXJuIE5leHRTdGF0Q2FjaGUuZ2V0KCk7IH0KKyAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG5leHQgc3RhdCBjYWxsIGNhY2hlIGluIHRoZSBjaGFpbiwgdHJhbnNmZXJyaW5nCisgIC8vLyBvd25lcnNoaXAgb2YgdGhpcyBjYWNoZSAoYW5kLCB0cmFuc2l0aXZlbHksIGFsbCBvZiB0aGUgcmVtYWluaW5nIGNhY2hlcykKKyAgLy8vIHRvIHRoZSBjYWxsZXIuCisgIHN0ZDo6dW5pcXVlX3B0cjxGaWxlU3lzdGVtU3RhdENhY2hlPiB0YWtlTmV4dFN0YXRDYWNoZSgpIHsKKyAgICByZXR1cm4gc3RkOjptb3ZlKE5leHRTdGF0Q2FjaGUpOworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8gRklYTUU6IFRoZSBwb2ludGVyIGhlcmUgaXMgYSBub24tb3duaW5nL29wdGlvbmFsIHJlZmVyZW5jZSB0byB0aGUKKyAgLy8gdW5pcXVlX3B0ci4gT3B0aW9uYWw8dW5pcXVlX3B0cjx2ZnM6OkZpbGU+Jj4gbWlnaHQgYmUgbmljZXIsIGJ1dAorICAvLyBPcHRpb25hbCBuZWVkcyBzb21lIHdvcmsgdG8gc3VwcG9ydCByZWZlcmVuY2VzIHNvIHRoaXMgaXNuJ3QgcG9zc2libGUgeWV0LgorICB2aXJ0dWFsIExvb2t1cFJlc3VsdCBnZXRTdGF0KFN0cmluZ1JlZiBQYXRoLCBGaWxlRGF0YSAmRGF0YSwgYm9vbCBpc0ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHZmczo6RmlsZT4gKkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmZzOjpGaWxlU3lzdGVtICZGUykgPSAwOworCisgIExvb2t1cFJlc3VsdCBzdGF0Q2hhaW5lZChTdHJpbmdSZWYgUGF0aCwgRmlsZURhdGEgJkRhdGEsIGJvb2wgaXNGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHZmczo6RmlsZT4gKkYsIHZmczo6RmlsZVN5c3RlbSAmRlMpIHsKKyAgICBpZiAoRmlsZVN5c3RlbVN0YXRDYWNoZSAqTmV4dCA9IGdldE5leHRTdGF0Q2FjaGUoKSkKKyAgICAgIHJldHVybiBOZXh0LT5nZXRTdGF0KFBhdGgsIERhdGEsIGlzRmlsZSwgRiwgRlMpOworCisgICAgLy8gSWYgd2UgaGl0IHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2Ygc3RhdCBjYWNoZXMgdG8gdHJ5LCBqdXN0IGNvbXB1dGUgYW5kCisgICAgLy8gcmV0dXJuIGl0IHdpdGhvdXQgYSBjYWNoZS4KKyAgICByZXR1cm4gZ2V0KFBhdGgsIERhdGEsIGlzRmlsZSwgRiwgbnVsbHB0ciwgRlMpID8gQ2FjaGVNaXNzaW5nIDogQ2FjaGVFeGlzdHM7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQSBzdGF0ICJjYWNoZSIgdGhhdCBjYW4gYmUgdXNlZCBieSBGaWxlTWFuYWdlciB0byBrZWVwCisvLy8gdHJhY2sgb2YgdGhlIHJlc3VsdHMgb2Ygc3RhdCgpIGNhbGxzIHRoYXQgb2NjdXIgdGhyb3VnaG91dCB0aGUKKy8vLyBleGVjdXRpb24gb2YgdGhlIGZyb250IGVuZC4KK2NsYXNzIE1lbW9yaXplU3RhdENhbGxzIDogcHVibGljIEZpbGVTeXN0ZW1TdGF0Q2FjaGUgeworcHVibGljOgorICAvLy8gXGJyaWVmIFRoZSBzZXQgb2Ygc3RhdCgpIGNhbGxzIHRoYXQgaGF2ZSBiZWVuIHNlZW4uCisgIGxsdm06OlN0cmluZ01hcDxGaWxlRGF0YSwgbGx2bTo6QnVtcFB0ckFsbG9jYXRvcj4gU3RhdENhbGxzOworCisgIHVzaW5nIGl0ZXJhdG9yID0KKyAgICAgIGxsdm06OlN0cmluZ01hcDxGaWxlRGF0YSwgbGx2bTo6QnVtcFB0ckFsbG9jYXRvcj46OmNvbnN0X2l0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gU3RhdENhbGxzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gU3RhdENhbGxzLmVuZCgpOyB9CisKKyAgTG9va3VwUmVzdWx0IGdldFN0YXQoU3RyaW5nUmVmIFBhdGgsIEZpbGVEYXRhICZEYXRhLCBib29sIGlzRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHZmczo6RmlsZT4gKkYsCisgICAgICAgICAgICAgICAgICAgICAgIHZmczo6RmlsZVN5c3RlbSAmRlMpIG92ZXJyaWRlOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQkFTSUNfRklMRVNZU1RFTVNUQVRDQUNIRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL0lkZW50aWZpZXJUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlM2MxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaApAQCAtMCwwICsxLDkyMSBAQAorLy89PT0tIElkZW50aWZpZXJUYWJsZS5oIC0gSGFzaCB0YWJsZSBmb3IgaWRlbnRpZmllciBsb29rdXAgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgY2xhbmc6OklkZW50aWZpZXJJbmZvLCBjbGFuZzo6SWRlbnRpZmllclRhYmxlLCBhbmQKKy8vLyBjbGFuZzo6U2VsZWN0b3IgaW50ZXJmYWNlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfSURFTlRJRklFUlRBQkxFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19CQVNJQ19JREVOVElGSUVSVEFCTEVfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Rva2VuS2luZHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgSWRlbnRpZmllckluZm87CitjbGFzcyBMYW5nT3B0aW9uczsKK2NsYXNzIE11bHRpS2V5d29yZFNlbGVjdG9yOworY2xhc3MgU291cmNlTG9jYXRpb247CisKKy8vLyBcYnJpZWYgQSBzaW1wbGUgcGFpciBvZiBpZGVudGlmaWVyIGluZm8gYW5kIGxvY2F0aW9uLgordXNpbmcgSWRlbnRpZmllckxvY1BhaXIgPSBzdGQ6OnBhaXI8SWRlbnRpZmllckluZm8gKiwgU291cmNlTG9jYXRpb24+OworCisvLy8gT25lIG9mIHRoZXNlIHJlY29yZHMgaXMga2VwdCBmb3IgZWFjaCBpZGVudGlmaWVyIHRoYXQKKy8vLyBpcyBsZXhlZC4gIFRoaXMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciB0aGUgdG9rZW4gd2FzIFwjZGVmaW5lJ2QsCisvLy8gaXMgYSBsYW5ndWFnZSBrZXl3b3JkLCBvciBpZiBpdCBpcyBhIGZyb250LWVuZCB0b2tlbiBvZiBzb21lIHNvcnQgKGUuZy4gYQorLy8vIHZhcmlhYmxlIG9yIGZ1bmN0aW9uIG5hbWUpLiAgVGhlIHByZXByb2Nlc3NvciBrZWVwcyB0aGlzIGluZm9ybWF0aW9uIGluIGEKKy8vLyBzZXQsIGFuZCBhbGwgdG9rOjppZGVudGlmaWVyIHRva2VucyBoYXZlIGEgcG9pbnRlciB0byBvbmUgb2YgdGhlc2UuCitjbGFzcyBJZGVudGlmaWVySW5mbyB7CisgIGZyaWVuZCBjbGFzcyBJZGVudGlmaWVyVGFibGU7CisKKyAgdW5zaWduZWQgVG9rZW5JRCAgICAgICAgICAgIDogOTsgLy8gRnJvbnQtZW5kIHRva2VuIElEIG9yIHRvazo6aWRlbnRpZmllci4KKyAgLy8gT2JqZWN0aXZlLUMga2V5d29yZCAoJ3Byb3RvY29sJyBpbiAnQHByb3RvY29sJykgb3IgYnVpbHRpbiAoX19idWlsdGluX2luZikuCisgIC8vIEZpcnN0IE5VTV9PQkpDX0tFWVdPUkRTIHZhbHVlcyBhcmUgZm9yIE9iamVjdGl2ZS1DLCB0aGUgcmVtYWluaW5nIHZhbHVlcworICAvLyBhcmUgZm9yIGJ1aWx0aW5zLgorICB1bnNpZ25lZCBPYmpDT3JCdWlsdGluSUQgICAgOjEzOworICBib29sIEhhc01hY3JvICAgICAgICAgICAgICAgOiAxOyAvLyBUcnVlIGlmIHRoZXJlIGlzIGEgI2RlZmluZSBmb3IgdGhpcy4KKyAgYm9vbCBIYWRNYWNybyAgICAgICAgICAgICAgIDogMTsgLy8gVHJ1ZSBpZiB0aGVyZSB3YXMgYSAjZGVmaW5lIGZvciB0aGlzLgorICBib29sIElzRXh0ZW5zaW9uICAgICAgICAgICAgOiAxOyAvLyBUcnVlIGlmIGlkZW50aWZpZXIgaXMgYSBsYW5nIGV4dGVuc2lvbi4KKyAgYm9vbCBJc0Z1dHVyZUNvbXBhdEtleXdvcmQgIDogMTsgLy8gVHJ1ZSBpZiBpZGVudGlmaWVyIGlzIGEga2V5d29yZCBpbiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld2VyIFN0YW5kYXJkIG9yIHByb3Bvc2VkIFN0YW5kYXJkLgorICBib29sIElzUG9pc29uZWQgICAgICAgICAgICAgOiAxOyAvLyBUcnVlIGlmIGlkZW50aWZpZXIgaXMgcG9pc29uZWQuCisgIGJvb2wgSXNDUFBPcGVyYXRvcktleXdvcmQgICA6IDE7IC8vIFRydWUgaWYgaWRlbnQgaXMgYSBDKysgb3BlcmF0b3Iga2V5d29yZC4KKyAgYm9vbCBOZWVkc0hhbmRsZUlkZW50aWZpZXIgIDogMTsgLy8gU2VlICJSZWNvbXB1dGVOZWVkc0hhbmRsZUlkZW50aWZpZXIiLgorICBib29sIElzRnJvbUFTVCAgICAgICAgICAgICAgOiAxOyAvLyBUcnVlIGlmIGlkZW50aWZpZXIgd2FzIGxvYWRlZCAoYXQgbGVhc3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcnRpYWxseSkgZnJvbSBhbiBBU1QgZmlsZS4KKyAgYm9vbCBDaGFuZ2VkQWZ0ZXJMb2FkICAgICAgIDogMTsgLy8gVHJ1ZSBpZiBpZGVudGlmaWVyIGhhcyBjaGFuZ2VkIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmluaXRpb24gbG9hZGVkIGZyb20gYW4gQVNUIGZpbGUuCisgIGJvb2wgRkVDaGFuZ2VkQWZ0ZXJMb2FkICAgICA6IDE7IC8vIFRydWUgaWYgaWRlbnRpZmllcidzIGZyb250ZW5kIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhcyBjaGFuZ2VkIGZyb20gdGhlIGRlZmluaXRpb24gbG9hZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gYW4gQVNUIGZpbGUuCisgIGJvb2wgUmV2ZXJ0ZWRUb2tlbklEICAgICAgICA6IDE7IC8vIFRydWUgaWYgcmV2ZXJ0VG9rZW5JRFRvSWRlbnRpZmllciB3YXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGVkLgorICBib29sIE91dE9mRGF0ZSAgICAgICAgICAgICAgOiAxOyAvLyBUcnVlIGlmIHRoZXJlIG1heSBiZSBhZGRpdGlvbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZWQgZXh0ZXJuYWxseS4KKyAgYm9vbCBJc01vZHVsZXNJbXBvcnQgICAgICAgIDogMTsgLy8gVHJ1ZSBpZiB0aGlzIGlzIHRoZSAnaW1wb3J0JyBjb250ZXh0dWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtleXdvcmQuCisgIC8vIDI5IGJpdCBsZWZ0IGluIDY0LWJpdCB3b3JkLgorCisgIC8vIE1hbmFnZWQgYnkgdGhlIGxhbmd1YWdlIGZyb250LWVuZC4KKyAgdm9pZCAqRkVUb2tlbkluZm8gPSBudWxscHRyOworCisgIGxsdm06OlN0cmluZ01hcEVudHJ5PElkZW50aWZpZXJJbmZvICo+ICpFbnRyeSA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgSWRlbnRpZmllckluZm8oKTsKKyAgSWRlbnRpZmllckluZm8oY29uc3QgSWRlbnRpZmllckluZm8gJikgPSBkZWxldGU7CisgIElkZW50aWZpZXJJbmZvICZvcGVyYXRvcj0oY29uc3QgSWRlbnRpZmllckluZm8gJikgPSBkZWxldGU7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgc3BlY2lmaWVkIHN0cmluZy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIHN0cmluZyBsaXRlcmFscyBvbmx5OiBJSS0+aXNTdHIoImZvbyIpLgorICB0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgU3RyTGVuPgorICBib29sIGlzU3RyKGNvbnN0IGNoYXIgKCZTdHIpW1N0ckxlbl0pIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TGVuZ3RoKCkgPT0gU3RyTGVuLTEgJiYKKyAgICAgICAgICAgbWVtY21wKGdldE5hbWVTdGFydCgpLCBTdHIsIFN0ckxlbi0xKSA9PSAwOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGJlZ2lubmluZyBvZiB0aGUgYWN0dWFsIG51bGwtdGVybWluYXRlZCBzdHJpbmcgZm9yIHRoaXMKKyAgLy8vIGlkZW50aWZpZXIuCisgIGNvbnN0IGNoYXIgKmdldE5hbWVTdGFydCgpIGNvbnN0IHsKKyAgICBpZiAoRW50cnkpIHJldHVybiBFbnRyeS0+Z2V0S2V5RGF0YSgpOworICAgIC8vIEZJWE1FOiBUaGlzIGlzIGdyb3NzLiBJdCB3b3VsZCBiZSBiZXN0IG5vdCB0byBlbWJlZCBzcGVjaWZpYyBkZXRhaWxzCisgICAgLy8gb2YgdGhlIFBUSCBmaWxlIGZvcm1hdCBoZXJlLgorICAgIC8vIFRoZSAndGhpcycgcG9pbnRlciByZWFsbHkgcG9pbnRzIHRvIGEKKyAgICAvLyBzdGQ6OnBhaXI8SWRlbnRpZmllckluZm8sIGNvbnN0IGNoYXIqPiwgd2hlcmUgaW50ZXJuYWwgcG9pbnRlcgorICAgIC8vIHBvaW50cyB0byB0aGUgZXh0ZXJuYWwgc3RyaW5nIGRhdGEuCisgICAgdXNpbmcgYWN0dWFsdHlwZSA9IHN0ZDo6cGFpcjxJZGVudGlmaWVySW5mbywgY29uc3QgY2hhciAqPjsKKworICAgIHJldHVybiAoKGNvbnN0IGFjdHVhbHR5cGUqKSB0aGlzKS0+c2Vjb25kOworICB9CisKKyAgLy8vIFxicmllZiBFZmZpY2llbnRseSByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGlzIGlkZW50aWZpZXIgaW5mby4KKyAgdW5zaWduZWQgZ2V0TGVuZ3RoKCkgY29uc3QgeworICAgIGlmIChFbnRyeSkgcmV0dXJuIEVudHJ5LT5nZXRLZXlMZW5ndGgoKTsKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBncm9zcy4gSXQgd291bGQgYmUgYmVzdCBub3QgdG8gZW1iZWQgc3BlY2lmaWMgZGV0YWlscworICAgIC8vIG9mIHRoZSBQVEggZmlsZSBmb3JtYXQgaGVyZS4KKyAgICAvLyBUaGUgJ3RoaXMnIHBvaW50ZXIgcmVhbGx5IHBvaW50cyB0byBhCisgICAgLy8gc3RkOjpwYWlyPElkZW50aWZpZXJJbmZvLCBjb25zdCBjaGFyKj4sIHdoZXJlIGludGVybmFsIHBvaW50ZXIKKyAgICAvLyBwb2ludHMgdG8gdGhlIGV4dGVybmFsIHN0cmluZyBkYXRhLgorICAgIHVzaW5nIGFjdHVhbHR5cGUgPSBzdGQ6OnBhaXI8SWRlbnRpZmllckluZm8sIGNvbnN0IGNoYXIgKj47CisKKyAgICBjb25zdCBjaGFyKiBwID0gKChjb25zdCBhY3R1YWx0eXBlKikgdGhpcyktPnNlY29uZCAtIDI7CisgICAgcmV0dXJuICgoKHVuc2lnbmVkKSBwWzBdKSB8ICgoKHVuc2lnbmVkKSBwWzFdKSA8PCA4KSkgLSAxOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGFjdHVhbCBpZGVudGlmaWVyIHN0cmluZy4KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIFN0cmluZ1JlZihnZXROYW1lU3RhcnQoKSwgZ2V0TGVuZ3RoKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlkZW50aWZpZXIgaXMgXCNkZWZpbmVkIHRvIHNvbWUgb3RoZXIgdmFsdWUuCisgIC8vLyBcbm90ZSBUaGUgY3VycmVudCBkZWZpbml0aW9uIG1heSBiZSBpbiBhIG1vZHVsZSBhbmQgbm90IGN1cnJlbnRseSB2aXNpYmxlLgorICBib29sIGhhc01hY3JvRGVmaW5pdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gSGFzTWFjcm87CisgIH0KKyAgdm9pZCBzZXRIYXNNYWNyb0RlZmluaXRpb24oYm9vbCBWYWwpIHsKKyAgICBpZiAoSGFzTWFjcm8gPT0gVmFsKSByZXR1cm47CisKKyAgICBIYXNNYWNybyA9IFZhbDsKKyAgICBpZiAoVmFsKSB7CisgICAgICBOZWVkc0hhbmRsZUlkZW50aWZpZXIgPSB0cnVlOworICAgICAgSGFkTWFjcm8gPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBSZWNvbXB1dGVOZWVkc0hhbmRsZUlkZW50aWZpZXIoKTsKKyAgICB9CisgIH0KKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpZGVudGlmaWVyIHdhcyBcI2RlZmluZWQgdG8gc29tZSB2YWx1ZSBhdCBhbnkKKyAgLy8vIG1vbWVudC4gSW4gdGhpcyBjYXNlIHRoZXJlIHNob3VsZCBiZSBhbiBlbnRyeSBmb3IgdGhlIGlkZW50aWZpZXIgaW4gdGhlCisgIC8vLyBtYWNybyBoaXN0b3J5IHRhYmxlIGluIFByZXByb2Nlc3Nvci4KKyAgYm9vbCBoYWRNYWNyb0RlZmluaXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIEhhZE1hY3JvOworICB9CisKKyAgLy8vIElmIHRoaXMgaXMgYSBzb3VyY2UtbGFuZ3VhZ2UgdG9rZW4gKGUuZy4gJ2ZvcicpLCB0aGlzIEFQSQorICAvLy8gY2FuIGJlIHVzZWQgdG8gY2F1c2UgdGhlIGxleGVyIHRvIG1hcCBpZGVudGlmaWVycyB0byBzb3VyY2UtbGFuZ3VhZ2UKKyAgLy8vIHRva2Vucy4KKyAgdG9rOjpUb2tlbktpbmQgZ2V0VG9rZW5JRCgpIGNvbnN0IHsgcmV0dXJuICh0b2s6OlRva2VuS2luZClUb2tlbklEOyB9CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHJldmVydFRva2VuSURUb0lkZW50aWZpZXIoKSB3YXMgY2FsbGVkLgorICBib29sIGhhc1JldmVydGVkVG9rZW5JRFRvSWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIFJldmVydGVkVG9rZW5JRDsgfQorCisgIC8vLyBcYnJpZWYgUmV2ZXJ0IFRva2VuSUQgdG8gdG9rOjppZGVudGlmaWVyOyB1c2VkIGZvciBHTlUgbGlic3RkYysrIDQuMgorICAvLy8gY29tcGF0aWJpbGl0eS4KKyAgLy8vCisgIC8vLyBUb2tlbklEIGlzIG5vcm1hbGx5IHJlYWQtb25seSBidXQgdGhlcmUgYXJlIDIgaW5zdGFuY2VzIHdoZXJlIHdlIHJldmVydCBpdAorICAvLy8gdG8gdG9rOjppZGVudGlmaWVyIGZvciBsaWJzdGRjKysgNC4yLiBLZWVwIHRyYWNrIG9mIHdoZW4gdGhpcyBoYXBwZW5zCisgIC8vLyB1c2luZyB0aGlzIG1ldGhvZCBzbyB3ZSBjYW4gaW5mb3JtIHNlcmlhbGl6YXRpb24gYWJvdXQgaXQuCisgIHZvaWQgcmV2ZXJ0VG9rZW5JRFRvSWRlbnRpZmllcigpIHsKKyAgICBhc3NlcnQoVG9rZW5JRCAhPSB0b2s6OmlkZW50aWZpZXIgJiYgIkFscmVhZHkgYXQgdG9rOjppZGVudGlmaWVyIik7CisgICAgVG9rZW5JRCA9IHRvazo6aWRlbnRpZmllcjsKKyAgICBSZXZlcnRlZFRva2VuSUQgPSB0cnVlOworICB9CisgIHZvaWQgcmV2ZXJ0SWRlbnRpZmllclRvVG9rZW5JRCh0b2s6OlRva2VuS2luZCBUSykgeworICAgIGFzc2VydChUb2tlbklEID09IHRvazo6aWRlbnRpZmllciAmJiAiU2hvdWxkIGJlIGF0IHRvazo6aWRlbnRpZmllciIpOworICAgIFRva2VuSUQgPSBUSzsKKyAgICBSZXZlcnRlZFRva2VuSUQgPSBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBwcmVwcm9jZXNzb3Iga2V5d29yZCBJRCBmb3IgdGhpcyBpZGVudGlmaWVyLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlLCAiZGVmaW5lIiB3aWxsIHJldHVybiB0b2s6OnBwX2RlZmluZS4KKyAgdG9rOjpQUEtleXdvcmRLaW5kIGdldFBQS2V5d29yZElEKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIE9iamVjdGl2ZS1DIGtleXdvcmQgSUQgZm9yIHRoZSB0aGlzIGlkZW50aWZpZXIuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsICdjbGFzcycgd2lsbCByZXR1cm4gdG9rOjpvYmpjX2NsYXNzIGlmIE9iakMgaXMgZW5hYmxlZC4KKyAgdG9rOjpPYmpDS2V5d29yZEtpbmQgZ2V0T2JqQ0tleXdvcmRJRCgpIGNvbnN0IHsKKyAgICBpZiAoT2JqQ09yQnVpbHRpbklEIDwgdG9rOjpOVU1fT0JKQ19LRVlXT1JEUykKKyAgICAgIHJldHVybiB0b2s6Ok9iakNLZXl3b3JkS2luZChPYmpDT3JCdWlsdGluSUQpOworICAgIGVsc2UKKyAgICAgIHJldHVybiB0b2s6Om9iamNfbm90X2tleXdvcmQ7CisgIH0KKyAgdm9pZCBzZXRPYmpDS2V5d29yZElEKHRvazo6T2JqQ0tleXdvcmRLaW5kIElEKSB7IE9iakNPckJ1aWx0aW5JRCA9IElEOyB9CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHNldE5vdEJ1aWx0aW4oKSB3YXMgY2FsbGVkLgorICBib29sIGhhc1JldmVydGVkQnVpbHRpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gT2JqQ09yQnVpbHRpbklEID09IHRvazo6TlVNX09CSkNfS0VZV09SRFM7CisgIH0KKworICAvLy8gXGJyaWVmIFJldmVydCB0aGUgaWRlbnRpZmllciB0byBhIG5vbi1idWlsdGluIGlkZW50aWZpZXIuIFdlIGRvIHRoaXMgaWYKKyAgLy8vIHRoZSBuYW1lIG9mIGEga25vd24gYnVpbHRpbiBsaWJyYXJ5IGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGVjbGFyZSB0aGF0CisgIC8vLyBmdW5jdGlvbiwgYnV0IGFuIHVuZXhwZWN0ZWQgdHlwZSBpcyBzcGVjaWZpZWQuCisgIHZvaWQgcmV2ZXJ0QnVpbHRpbigpIHsKKyAgICBzZXRCdWlsdGluSUQoMCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGlzIGEgYnVpbHRpbiBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyAwIGlzIG5vdC1idWlsdC1pbi4gMSsgYXJlIHNwZWNpZmljIGJ1aWx0aW4gZnVuY3Rpb25zLgorICB1bnNpZ25lZCBnZXRCdWlsdGluSUQoKSBjb25zdCB7CisgICAgaWYgKE9iakNPckJ1aWx0aW5JRCA+PSB0b2s6Ok5VTV9PQkpDX0tFWVdPUkRTKQorICAgICAgcmV0dXJuIE9iakNPckJ1aWx0aW5JRCAtIHRvazo6TlVNX09CSkNfS0VZV09SRFM7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgdm9pZCBzZXRCdWlsdGluSUQodW5zaWduZWQgSUQpIHsKKyAgICBPYmpDT3JCdWlsdGluSUQgPSBJRCArIHRvazo6TlVNX09CSkNfS0VZV09SRFM7CisgICAgYXNzZXJ0KE9iakNPckJ1aWx0aW5JRCAtIHVuc2lnbmVkKHRvazo6TlVNX09CSkNfS0VZV09SRFMpID09IElECisgICAgICAgICAgICYmICJJRCB0b28gbGFyZ2UgZm9yIGZpZWxkISIpOworICB9CisKKyAgdW5zaWduZWQgZ2V0T2JqQ09yQnVpbHRpbklEKCkgY29uc3QgeyByZXR1cm4gT2JqQ09yQnVpbHRpbklEOyB9CisgIHZvaWQgc2V0T2JqQ09yQnVpbHRpbklEKHVuc2lnbmVkIElEKSB7IE9iakNPckJ1aWx0aW5JRCA9IElEOyB9CisKKyAgLy8vIGdldC9zZXRFeHRlbnNpb24gLSBJbml0aWFsaXplIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgb3Igbm90IHRoaXMKKyAgLy8vIGxhbmd1YWdlIHRva2VuIGlzIGFuIGV4dGVuc2lvbi4gIFRoaXMgY29udHJvbHMgZXh0ZW5zaW9uIHdhcm5pbmdzLCBhbmQgaXMKKyAgLy8vIG9ubHkgdmFsaWQgaWYgYSBjdXN0b20gdG9rZW4gSUQgaXMgc2V0LgorICBib29sIGlzRXh0ZW5zaW9uVG9rZW4oKSBjb25zdCB7IHJldHVybiBJc0V4dGVuc2lvbjsgfQorICB2b2lkIHNldElzRXh0ZW5zaW9uVG9rZW4oYm9vbCBWYWwpIHsKKyAgICBJc0V4dGVuc2lvbiA9IFZhbDsKKyAgICBpZiAoVmFsKQorICAgICAgTmVlZHNIYW5kbGVJZGVudGlmaWVyID0gdHJ1ZTsKKyAgICBlbHNlCisgICAgICBSZWNvbXB1dGVOZWVkc0hhbmRsZUlkZW50aWZpZXIoKTsKKyAgfQorCisgIC8vLyBpcy9zZXRJc0Z1dHVyZUNvbXBhdEtleXdvcmQgLSBJbml0aWFsaXplIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgb3Igbm90CisgIC8vLyB0aGlzIGxhbmd1YWdlIHRva2VuIGlzIGEga2V5d29yZCBpbiBhIG5ld2VyIG9yIHByb3Bvc2VkIFN0YW5kYXJkLiBUaGlzCisgIC8vLyBjb250cm9scyBjb21wYXRpYmlsaXR5IHdhcm5pbmdzLCBhbmQgaXMgb25seSB0cnVlIHdoZW4gbm90IHBhcnNpbmcgdGhlCisgIC8vLyBjb3JyZXNwb25kaW5nIFN0YW5kYXJkLiBPbmNlIGEgY29tcGF0aWJpbGl0eSBwcm9ibGVtIGhhcyBiZWVuIGRpYWdub3NlZAorICAvLy8gd2l0aCB0aGlzIGtleXdvcmQsIHRoZSBmbGFnIHdpbGwgYmUgY2xlYXJlZC4KKyAgYm9vbCBpc0Z1dHVyZUNvbXBhdEtleXdvcmQoKSBjb25zdCB7IHJldHVybiBJc0Z1dHVyZUNvbXBhdEtleXdvcmQ7IH0KKyAgdm9pZCBzZXRJc0Z1dHVyZUNvbXBhdEtleXdvcmQoYm9vbCBWYWwpIHsKKyAgICBJc0Z1dHVyZUNvbXBhdEtleXdvcmQgPSBWYWw7CisgICAgaWYgKFZhbCkKKyAgICAgIE5lZWRzSGFuZGxlSWRlbnRpZmllciA9IHRydWU7CisgICAgZWxzZQorICAgICAgUmVjb21wdXRlTmVlZHNIYW5kbGVJZGVudGlmaWVyKCk7CisgIH0KKworICAvLy8gc2V0SXNQb2lzb25lZCAtIE1hcmsgdGhpcyBpZGVudGlmaWVyIGFzIHBvaXNvbmVkLiAgQWZ0ZXIgcG9pc29uaW5nLCB0aGUKKyAgLy8vIFByZXByb2Nlc3NvciB3aWxsIGVtaXQgYW4gZXJyb3IgZXZlcnkgdGltZSB0aGlzIHRva2VuIGlzIHVzZWQuCisgIHZvaWQgc2V0SXNQb2lzb25lZChib29sIFZhbHVlID0gdHJ1ZSkgeworICAgIElzUG9pc29uZWQgPSBWYWx1ZTsKKyAgICBpZiAoVmFsdWUpCisgICAgICBOZWVkc0hhbmRsZUlkZW50aWZpZXIgPSB0cnVlOworICAgIGVsc2UKKyAgICAgIFJlY29tcHV0ZU5lZWRzSGFuZGxlSWRlbnRpZmllcigpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHRva2VuIGhhcyBiZWVuIHBvaXNvbmVkLgorICBib29sIGlzUG9pc29uZWQoKSBjb25zdCB7IHJldHVybiBJc1BvaXNvbmVkOyB9CisKKyAgLy8vIGlzQ1BsdXNQbHVzT3BlcmF0b3JLZXl3b3JkL3NldElzQ1BsdXNQbHVzT3BlcmF0b3JLZXl3b3JkIGNvbnRyb2xzIHdoZXRoZXIKKyAgLy8vIHRoaXMgaWRlbnRpZmllciBpcyBhIEMrKyBhbHRlcm5hdGUgcmVwcmVzZW50YXRpb24gb2YgYW4gb3BlcmF0b3IuCisgIHZvaWQgc2V0SXNDUGx1c1BsdXNPcGVyYXRvcktleXdvcmQoYm9vbCBWYWwgPSB0cnVlKSB7CisgICAgSXNDUFBPcGVyYXRvcktleXdvcmQgPSBWYWw7CisgIH0KKyAgYm9vbCBpc0NQbHVzUGx1c09wZXJhdG9yS2V5d29yZCgpIGNvbnN0IHsgcmV0dXJuIElzQ1BQT3BlcmF0b3JLZXl3b3JkOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEga2V5d29yZCBpbiB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlLgorICBib29sIGlzS2V5d29yZChjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIEMrKyBrZXl3b3JkIGluIHRoZSBzcGVjaWZpZWQKKyAgLy8vIGxhbmd1YWdlLgorICBib29sIGlzQ1BsdXNQbHVzS2V5d29yZChjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIGNvbnN0OworCisgIC8vLyBnZXRGRVRva2VuSW5mby9zZXRGRVRva2VuSW5mbyAtIFRoZSBsYW5ndWFnZSBmcm9udC1lbmQgaXMgYWxsb3dlZCB0bworICAvLy8gYXNzb2NpYXRlIGFyYml0cmFyeSBtZXRhZGF0YSB3aXRoIHRoaXMgdG9rZW4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIFQgKmdldEZFVG9rZW5JbmZvKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KEZFVG9rZW5JbmZvKTsgfQorICB2b2lkIHNldEZFVG9rZW5JbmZvKHZvaWQgKlQpIHsgRkVUb2tlbkluZm8gPSBUOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgUHJlcHJvY2Vzc29yOjpIYW5kbGVJZGVudGlmaWVyIG11c3QgYmUgY2FsbGVkCisgIC8vLyBvbiBhIHRva2VuIG9mIHRoaXMgaWRlbnRpZmllci4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIHJldHVybnMgZmFsc2UsIHdlIGtub3cgdGhhdCBIYW5kbGVJZGVudGlmaWVyIHdpbGwgbm90IGFmZmVjdAorICAvLy8gdGhlIHRva2VuLgorICBib29sIGlzSGFuZGxlSWRlbnRpZmllckNhc2UoKSBjb25zdCB7IHJldHVybiBOZWVkc0hhbmRsZUlkZW50aWZpZXI7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBpZGVudGlmaWVyIGluIGl0cyBjdXJyZW50IHN0YXRlIHdhcyBsb2FkZWQKKyAgLy8vIGZyb20gYW4gQVNUIGZpbGUuCisgIGJvb2wgaXNGcm9tQVNUKCkgY29uc3QgeyByZXR1cm4gSXNGcm9tQVNUOyB9CisKKyAgdm9pZCBzZXRJc0Zyb21BU1QoKSB7IElzRnJvbUFTVCA9IHRydWU7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgaWRlbnRpZmllciBoYXMgY2hhbmdlZCBzaW5jZSBpdCB3YXMgbG9hZGVkCisgIC8vLyBmcm9tIGFuIEFTVCBmaWxlLgorICBib29sIGhhc0NoYW5nZWRTaW5jZURlc2VyaWFsaXphdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2hhbmdlZEFmdGVyTG9hZDsKKyAgfQorICAKKyAgLy8vIFxicmllZiBOb3RlIHRoYXQgdGhpcyBpZGVudGlmaWVyIGhhcyBjaGFuZ2VkIHNpbmNlIGl0IHdhcyBsb2FkZWQgZnJvbQorICAvLy8gYW4gQVNUIGZpbGUuCisgIHZvaWQgc2V0Q2hhbmdlZFNpbmNlRGVzZXJpYWxpemF0aW9uKCkgeworICAgIENoYW5nZWRBZnRlckxvYWQgPSB0cnVlOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZnJvbnRlbmQgdG9rZW4gaW5mb3JtYXRpb24gZm9yIHRoaXMKKyAgLy8vIGlkZW50aWZpZXIgaGFzIGNoYW5nZWQgc2luY2UgaXQgd2FzIGxvYWRlZCBmcm9tIGFuIEFTVCBmaWxlLgorICBib29sIGhhc0ZFVG9rZW5JbmZvQ2hhbmdlZFNpbmNlRGVzZXJpYWxpemF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBGRUNoYW5nZWRBZnRlckxvYWQ7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgTm90ZSB0aGF0IHRoZSBmcm9udGVuZCB0b2tlbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBpZGVudGlmaWVyIGhhcworICAvLy8gY2hhbmdlZCBzaW5jZSBpdCB3YXMgbG9hZGVkIGZyb20gYW4gQVNUIGZpbGUuCisgIHZvaWQgc2V0RkVUb2tlbkluZm9DaGFuZ2VkU2luY2VEZXNlcmlhbGl6YXRpb24oKSB7CisgICAgRkVDaGFuZ2VkQWZ0ZXJMb2FkID0gdHJ1ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGluZm9ybWF0aW9uIGZvciB0aGlzIGlkZW50aWZpZXIgaXMgb3V0IG9mCisgIC8vLyBkYXRlIHdpdGggcmVzcGVjdCB0byB0aGUgZXh0ZXJuYWwgc291cmNlLgorICBib29sIGlzT3V0T2ZEYXRlKCkgY29uc3QgeyByZXR1cm4gT3V0T2ZEYXRlOyB9CisgIAorICAvLy8gXGJyaWVmIFNldCB3aGV0aGVyIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBpZGVudGlmaWVyIGlzIG91dCBvZgorICAvLy8gZGF0ZSB3aXRoIHJlc3BlY3QgdG8gdGhlIGV4dGVybmFsIHNvdXJjZS4KKyAgdm9pZCBzZXRPdXRPZkRhdGUoYm9vbCBPT0QpIHsKKyAgICBPdXRPZkRhdGUgPSBPT0Q7CisgICAgaWYgKE9PRCkKKyAgICAgIE5lZWRzSGFuZGxlSWRlbnRpZmllciA9IHRydWU7CisgICAgZWxzZQorICAgICAgUmVjb21wdXRlTmVlZHNIYW5kbGVJZGVudGlmaWVyKCk7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyB0aGUgY29udGV4dHVhbCBrZXl3b3JkIFxjIGltcG9ydC4KKyAgYm9vbCBpc01vZHVsZXNJbXBvcnQoKSBjb25zdCB7IHJldHVybiBJc01vZHVsZXNJbXBvcnQ7IH0KKyAgCisgIC8vLyBcYnJpZWYgU2V0IHdoZXRoZXIgdGhpcyBpZGVudGlmaWVyIGlzIHRoZSBjb250ZXh0dWFsIGtleXdvcmQgXGMgaW1wb3J0LgorICB2b2lkIHNldE1vZHVsZXNJbXBvcnQoYm9vbCBJKSB7CisgICAgSXNNb2R1bGVzSW1wb3J0ID0gSTsKKyAgICBpZiAoSSkKKyAgICAgIE5lZWRzSGFuZGxlSWRlbnRpZmllciA9IHRydWU7CisgICAgZWxzZQorICAgICAgUmVjb21wdXRlTmVlZHNIYW5kbGVJZGVudGlmaWVyKCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpZGVudGlmaWVyIGlzIGFuIGVkaXRvciBwbGFjZWhvbGRlci4KKyAgLy8vCisgIC8vLyBFZGl0b3IgcGxhY2Vob2xkZXJzIGFyZSBwcm9kdWNlZCBieSB0aGUgY29kZS1jb21wbGV0aW9uIGVuZ2luZSBhbmQgYXJlCisgIC8vLyByZXByZXNlbnRlZCBhcyBjaGFyYWN0ZXJzIGJldHdlZW4gJzwjJyBhbmQgJyM+JyBpbiB0aGUgc291cmNlIGNvZGUuIEFuCisgIC8vLyBleGFtcGxlIG9mIGF1dG8tY29tcGxldGVkIGNhbGwgd2l0aCBhIHBsYWNlaG9sZGVyIHBhcmFtZXRlciBpcyBzaG93bgorICAvLy8gYmVsb3c6CisgIC8vLyBcY29kZQorICAvLy8gICBmdW5jdGlvbig8I2ludCB4Iz4pOworICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBpc0VkaXRvclBsYWNlaG9sZGVyKCkgY29uc3QgeworICAgIHJldHVybiBnZXROYW1lKCkuc3RhcnRzd2l0aCgiPCMiKSAmJiBnZXROYW1lKCkuZW5kc3dpdGgoIiM+Iik7CisgIH0KKworICAvLy8gXGJyaWVmIFByb3ZpZGUgbGVzcyB0aGFuIG9wZXJhdG9yIGZvciBsZXhpY29ncmFwaGljYWwgc29ydGluZy4KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgSWRlbnRpZmllckluZm8gJlJIUykgY29uc3QgeworICAgIHJldHVybiBnZXROYW1lKCkgPCBSSFMuZ2V0TmFtZSgpOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBUaGUgUHJlcHJvY2Vzc29yOjpIYW5kbGVJZGVudGlmaWVyIGRvZXMgc2V2ZXJhbCBzcGVjaWFsIChidXQgcmFyZSkKKyAgLy8vIHRoaW5ncyB0byBpZGVudGlmaWVycyBvZiB2YXJpb3VzIHNvcnRzLiAgRm9yIGV4YW1wbGUsIGl0IGNoYW5nZXMgdGhlCisgIC8vLyBcYyBmb3Iga2V5d29yZCB0b2tlbiBmcm9tIHRvazo6aWRlbnRpZmllciB0byB0b2s6OmZvci4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBpcyB2ZXJ5IHRpZWQgdG8gdGhlIGRlZmluaXRpb24gb2YgSGFuZGxlSWRlbnRpZmllci4gIEFueQorICAvLy8gY2hhbmdlIHRvIGl0IHNob3VsZCBiZSByZWZsZWN0ZWQgaGVyZS4KKyAgdm9pZCBSZWNvbXB1dGVOZWVkc0hhbmRsZUlkZW50aWZpZXIoKSB7CisgICAgTmVlZHNIYW5kbGVJZGVudGlmaWVyID0gaXNQb2lzb25lZCgpIHx8IGhhc01hY3JvRGVmaW5pdGlvbigpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHRlbnNpb25Ub2tlbigpIHx8IGlzRnV0dXJlQ29tcGF0S2V5d29yZCgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPdXRPZkRhdGUoKSB8fCBpc01vZHVsZXNJbXBvcnQoKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBBbiBSQUlJIG9iamVjdCBmb3IgW3VuXXBvaXNvbmluZyBhbiBpZGVudGlmaWVyIHdpdGhpbiBhIHNjb3BlLgorLy8vCisvLy8gXHAgSUkgaXMgYWxsb3dlZCB0byBiZSBudWxsLCBpbiB3aGljaCBjYXNlIG9iamVjdHMgb2YgdGhpcyB0eXBlIGhhdmUKKy8vLyBubyBlZmZlY3QuCitjbGFzcyBQb2lzb25JZGVudGlmaWVyUkFJSU9iamVjdCB7CisgIElkZW50aWZpZXJJbmZvICpjb25zdCBJSTsKKyAgY29uc3QgYm9vbCBPbGRWYWx1ZTsKKworcHVibGljOgorICBQb2lzb25JZGVudGlmaWVyUkFJSU9iamVjdChJZGVudGlmaWVySW5mbyAqSUksIGJvb2wgTmV3VmFsdWUpCisgICAgOiBJSShJSSksIE9sZFZhbHVlKElJID8gSUktPmlzUG9pc29uZWQoKSA6IGZhbHNlKSB7CisgICAgaWYoSUkpCisgICAgICBJSS0+c2V0SXNQb2lzb25lZChOZXdWYWx1ZSk7CisgIH0KKworICB+UG9pc29uSWRlbnRpZmllclJBSUlPYmplY3QoKSB7CisgICAgaWYoSUkpCisgICAgICBJSS0+c2V0SXNQb2lzb25lZChPbGRWYWx1ZSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQW4gaXRlcmF0b3IgdGhhdCB3YWxrcyBvdmVyIGFsbCBvZiB0aGUga25vd24gaWRlbnRpZmllcnMKKy8vLyBpbiB0aGUgbG9va3VwIHRhYmxlLgorLy8vCisvLy8gU2luY2UgdGhpcyBpdGVyYXRvciB1c2VzIGFuIGFic3RyYWN0IGludGVyZmFjZSB2aWEgdmlydHVhbAorLy8vIGZ1bmN0aW9ucywgaXQgdXNlcyBhbiBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlIHJhdGhlciB0aGFuIHRoZQorLy8vIG1vcmUgc3RhbmRhcmQgQysrIFNUTCBpdGVyYXRvciBpbnRlcmZhY2UuIEluIHRoaXMgT08tc3R5bGUKKy8vLyBpdGVyYXRpb24sIHRoZSBzaW5nbGUgZnVuY3Rpb24gXGMgTmV4dCgpIHByb3ZpZGVzIGRlcmVmZXJlbmNlLAorLy8vIGFkdmFuY2UsIGFuZCBlbmQtb2Ytc2VxdWVuY2UgY2hlY2tpbmcgaW4gYSBzaW5nbGUKKy8vLyBvcGVyYXRpb24uIFN1YmNsYXNzZXMgb2YgdGhpcyBpdGVyYXRvciB0eXBlIHdpbGwgcHJvdmlkZSB0aGUKKy8vLyBhY3R1YWwgZnVuY3Rpb25hbGl0eS4KK2NsYXNzIElkZW50aWZpZXJJdGVyYXRvciB7Citwcm90ZWN0ZWQ6CisgIElkZW50aWZpZXJJdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgCitwdWJsaWM6CisgIElkZW50aWZpZXJJdGVyYXRvcihjb25zdCBJZGVudGlmaWVySXRlcmF0b3IgJikgPSBkZWxldGU7CisgIElkZW50aWZpZXJJdGVyYXRvciAmb3BlcmF0b3I9KGNvbnN0IElkZW50aWZpZXJJdGVyYXRvciAmKSA9IGRlbGV0ZTsKKworICB2aXJ0dWFsIH5JZGVudGlmaWVySXRlcmF0b3IoKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuZXh0IHN0cmluZyBpbiB0aGUgaWRlbnRpZmllciB0YWJsZSBhbmQKKyAgLy8vIGFkdmFuY2VzIHRoZSBpdGVyYXRvciBmb3IgdGhlIGZvbGxvd2luZyBzdHJpbmcuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIG5leHQgc3RyaW5nIGluIHRoZSBpZGVudGlmaWVyIHRhYmxlLiBJZiB0aGVyZSBpcworICAvLy8gbm8gc3VjaCBzdHJpbmcsIHJldHVybnMgYW4gZW1wdHkgXGMgU3RyaW5nUmVmLgorICB2aXJ0dWFsIFN0cmluZ1JlZiBOZXh0KCkgPSAwOworfTsKKworLy8vIFxicmllZiBQcm92aWRlcyBsb29rdXBzIHRvLCBhbmQgaXRlcmF0aW9uIG92ZXIsIElkZW50aWZlckluZm8gb2JqZWN0cy4KK2NsYXNzIElkZW50aWZpZXJJbmZvTG9va3VwIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+SWRlbnRpZmllckluZm9Mb29rdXAoKTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgSWRlbnRpZmllckluZm8gZm9yIHRoZSBzcGVjaWZpZWQgbmFtZWQgaWRlbnRpZmllci4KKyAgLy8vCisgIC8vLyBVbmxpa2UgdGhlIHZlcnNpb24gaW4gSWRlbnRpZmllclRhYmxlLCB0aGlzIHJldHVybnMgYSBwb2ludGVyIGluc3RlYWQKKyAgLy8vIG9mIGEgcmVmZXJlbmNlLiAgSWYgdGhlIHBvaW50ZXIgaXMgbnVsbCB0aGVuIHRoZSBJZGVudGlmaWVySW5mbyBjYW5ub3QKKyAgLy8vIGJlIGZvdW5kLgorICB2aXJ0dWFsIElkZW50aWZpZXJJbmZvKiBnZXQoU3RyaW5nUmVmIE5hbWUpID0gMDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIGFuIGl0ZXJhdG9yIGludG8gdGhlIHNldCBvZiBhbGwgaWRlbnRpZmllcnMKKyAgLy8vIGtub3duIHRvIHRoaXMgaWRlbnRpZmllciBsb29rdXAgc291cmNlLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBwcm92aWRlcyBhY2Nlc3MgdG8gYWxsIG9mIHRoZSBpZGVudGlmaWVycyBrbm93biB0bworICAvLy8gdGhlIGlkZW50aWZpZXIgbG9va3VwLCBhbGxvd2luZyBhY2Nlc3MgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZQorICAvLy8gaWRlbnRpZmllcnMgd2l0aG91dCBpbnRyb2R1Y2luZyB0aGUgb3ZlcmhlYWQgb2YgY29uc3RydWN0aW5nCisgIC8vLyBJZGVudGlmaWVySW5mbyBvYmplY3RzIGZvciBlYWNoLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIEEgbmV3IGl0ZXJhdG9yIGludG8gdGhlIHNldCBvZiBrbm93biBpZGVudGlmaWVycy4gVGhlCisgIC8vLyBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoaXMgaXRlcmF0b3IuCisgIHZpcnR1YWwgSWRlbnRpZmllckl0ZXJhdG9yICpnZXRJZGVudGlmaWVycygpOworfTsKKworLy8vIFxicmllZiBJbXBsZW1lbnRzIGFuIGVmZmljaWVudCBtYXBwaW5nIGZyb20gc3RyaW5ncyB0byBJZGVudGlmaWVySW5mbyBub2Rlcy4KKy8vLworLy8vIFRoaXMgaGFzIG5vIG90aGVyIHB1cnBvc2UsIGJ1dCB0aGlzIGlzIGFuIGV4dHJlbWVseSBwZXJmb3JtYW5jZS1jcml0aWNhbAorLy8vIHBpZWNlIG9mIHRoZSBjb2RlLCBhcyBlYWNoIG9jY3VycmVuY2Ugb2YgZXZlcnkgaWRlbnRpZmllciBnb2VzIHRocm91Z2gKKy8vLyBoZXJlIHdoZW4gbGV4ZWQuCitjbGFzcyBJZGVudGlmaWVyVGFibGUgeworICAvLyBTaGFyayBzaG93cyB0aGF0IHVzaW5nIE1hbGxvY0FsbG9jYXRvciBpcyAqbXVjaCogc2xvd2VyIHRoYW4gdXNpbmcgdGhpcworICAvLyBCdW1wUHRyQWxsb2NhdG9yIQorICB1c2luZyBIYXNoVGFibGVUeSA9IGxsdm06OlN0cmluZ01hcDxJZGVudGlmaWVySW5mbyAqLCBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yPjsKKyAgSGFzaFRhYmxlVHkgSGFzaFRhYmxlOworCisgIElkZW50aWZpZXJJbmZvTG9va3VwKiBFeHRlcm5hbExvb2t1cDsKKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZSB0aGUgaWRlbnRpZmllciB0YWJsZSwgcG9wdWxhdGluZyBpdCB3aXRoIGluZm8gYWJvdXQgdGhlCisgIC8vLyBsYW5ndWFnZSBrZXl3b3JkcyBmb3IgdGhlIGxhbmd1YWdlIHNwZWNpZmllZCBieSBccCBMYW5nT3B0cy4KKyAgSWRlbnRpZmllclRhYmxlKGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKKyAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvTG9va3VwKiBleHRlcm5hbExvb2t1cCA9IG51bGxwdHIpOworCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBleHRlcm5hbCBpZGVudGlmaWVyIGxvb2t1cCBtZWNoYW5pc20uCisgIHZvaWQgc2V0RXh0ZXJuYWxJZGVudGlmaWVyTG9va3VwKElkZW50aWZpZXJJbmZvTG9va3VwICpJSUxvb2t1cCkgeworICAgIEV4dGVybmFsTG9va3VwID0gSUlMb29rdXA7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBleHRlcm5hbCBpZGVudGlmaWVyIGxvb2t1cCBvYmplY3QsIGlmIGFueS4KKyAgSWRlbnRpZmllckluZm9Mb29rdXAgKmdldEV4dGVybmFsSWRlbnRpZmllckxvb2t1cCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRXh0ZXJuYWxMb29rdXA7CisgIH0KKyAgCisgIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3ImIGdldEFsbG9jYXRvcigpIHsKKyAgICByZXR1cm4gSGFzaFRhYmxlLmdldEFsbG9jYXRvcigpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGlkZW50aWZpZXIgdG9rZW4gaW5mbyBmb3IgdGhlIHNwZWNpZmllZCBuYW1lZAorICAvLy8gaWRlbnRpZmllci4KKyAgSWRlbnRpZmllckluZm8gJmdldChTdHJpbmdSZWYgTmFtZSkgeworICAgIGF1dG8gJkVudHJ5ID0gKkhhc2hUYWJsZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoTmFtZSwgbnVsbHB0cikpLmZpcnN0OworCisgICAgSWRlbnRpZmllckluZm8gKiZJSSA9IEVudHJ5LnNlY29uZDsKKyAgICBpZiAoSUkpIHJldHVybiAqSUk7CisKKyAgICAvLyBObyBlbnRyeTsgaWYgd2UgaGF2ZSBhbiBleHRlcm5hbCBsb29rdXAsIGxvb2sgdGhlcmUgZmlyc3QuCisgICAgaWYgKEV4dGVybmFsTG9va3VwKSB7CisgICAgICBJSSA9IEV4dGVybmFsTG9va3VwLT5nZXQoTmFtZSk7CisgICAgICBpZiAoSUkpCisgICAgICAgIHJldHVybiAqSUk7CisgICAgfQorCisgICAgLy8gTG9va3VwcyBmYWlsZWQsIG1ha2UgYSBuZXcgSWRlbnRpZmllckluZm8uCisgICAgdm9pZCAqTWVtID0gZ2V0QWxsb2NhdG9yKCkuQWxsb2NhdGU8SWRlbnRpZmllckluZm8+KCk7CisgICAgSUkgPSBuZXcgKE1lbSkgSWRlbnRpZmllckluZm8oKTsKKworICAgIC8vIE1ha2Ugc3VyZSBnZXROYW1lKCkga25vd3MgaG93IHRvIGZpbmQgdGhlIElkZW50aWZpZXJJbmZvCisgICAgLy8gY29udGVudHMuCisgICAgSUktPkVudHJ5ID0gJkVudHJ5OworCisgICAgcmV0dXJuICpJSTsKKyAgfQorCisgIElkZW50aWZpZXJJbmZvICZnZXQoU3RyaW5nUmVmIE5hbWUsIHRvazo6VG9rZW5LaW5kIFRva2VuQ29kZSkgeworICAgIElkZW50aWZpZXJJbmZvICZJSSA9IGdldChOYW1lKTsKKyAgICBJSS5Ub2tlbklEID0gVG9rZW5Db2RlOworICAgIGFzc2VydChJSS5Ub2tlbklEID09ICh1bnNpZ25lZCkgVG9rZW5Db2RlICYmICJUb2tlbkNvZGUgdG9vIGxhcmdlIik7CisgICAgcmV0dXJuIElJOworICB9CisKKyAgLy8vIFxicmllZiBHZXRzIGFuIElkZW50aWZpZXJJbmZvIGZvciB0aGUgZ2l2ZW4gbmFtZSB3aXRob3V0IGNvbnN1bHRpbmcKKyAgLy8vICAgICAgICBleHRlcm5hbCBzb3VyY2VzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGdldCgpIG1lYW50IGZvciBleHRlcm5hbCBzb3VyY2VzIHRoYXQgd2FudCB0bworICAvLy8gaW50cm9kdWNlIG9yIG1vZGlmeSBhbiBpZGVudGlmaWVyLiBJZiB0aGV5IGNhbGxlZCBnZXQoKSwgdGhleSB3b3VsZAorICAvLy8gbGlrZWx5IGVuZCB1cCBpbiBhIHJlY3Vyc2lvbi4KKyAgSWRlbnRpZmllckluZm8gJmdldE93bihTdHJpbmdSZWYgTmFtZSkgeworICAgIGF1dG8gJkVudHJ5ID0gKkhhc2hUYWJsZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoTmFtZSwgbnVsbHB0cikpLmZpcnN0OworCisgICAgSWRlbnRpZmllckluZm8gKiZJSSA9IEVudHJ5LnNlY29uZDsKKyAgICBpZiAoSUkpCisgICAgICByZXR1cm4gKklJOworCisgICAgLy8gTG9va3VwcyBmYWlsZWQsIG1ha2UgYSBuZXcgSWRlbnRpZmllckluZm8uCisgICAgdm9pZCAqTWVtID0gZ2V0QWxsb2NhdG9yKCkuQWxsb2NhdGU8SWRlbnRpZmllckluZm8+KCk7CisgICAgSUkgPSBuZXcgKE1lbSkgSWRlbnRpZmllckluZm8oKTsKKworICAgIC8vIE1ha2Ugc3VyZSBnZXROYW1lKCkga25vd3MgaG93IHRvIGZpbmQgdGhlIElkZW50aWZpZXJJbmZvCisgICAgLy8gY29udGVudHMuCisgICAgSUktPkVudHJ5ID0gJkVudHJ5OworCisgICAgLy8gSWYgdGhpcyBpcyB0aGUgJ2ltcG9ydCcgY29udGV4dHVhbCBrZXl3b3JkLCBtYXJrIGl0IGFzIHN1Y2guCisgICAgaWYgKE5hbWUuZXF1YWxzKCJpbXBvcnQiKSkKKyAgICAgIElJLT5zZXRNb2R1bGVzSW1wb3J0KHRydWUpOworCisgICAgcmV0dXJuICpJSTsKKyAgfQorCisgIHVzaW5nIGl0ZXJhdG9yID0gSGFzaFRhYmxlVHk6OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IEhhc2hUYWJsZVR5Ojpjb25zdF9pdGVyYXRvcjsKKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEhhc2hUYWJsZS5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0ICAgeyByZXR1cm4gSGFzaFRhYmxlLmVuZCgpOyB9CisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCAgeyByZXR1cm4gSGFzaFRhYmxlLnNpemUoKTsgfQorCisgIC8vLyBcYnJpZWYgUHJpbnQgc29tZSBzdGF0aXN0aWNzIHRvIHN0ZGVyciB0aGF0IGluZGljYXRlIGhvdyB3ZWxsIHRoZQorICAvLy8gaGFzaGluZyBpcyBkb2luZy4KKyAgdm9pZCBQcmludFN0YXRzKCkgY29uc3Q7CisKKyAgdm9pZCBBZGRLZXl3b3Jkcyhjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpOworfTsKKworLy8vIFxicmllZiBBIGZhbWlseSBvZiBPYmplY3RpdmUtQyBtZXRob2RzLiAKKy8vLworLy8vIFRoZXNlIGZhbWlsaWVzIGhhdmUgbm8gaW5oZXJlbnQgbWVhbmluZyBpbiB0aGUgbGFuZ3VhZ2UsIGJ1dCBhcmUKKy8vLyBub25ldGhlbGVzcyBjZW50cmFsIGVub3VnaCBpbiB0aGUgZXhpc3RpbmcgaW1wbGVtZW50YXRpb25zIHRvCisvLy8gbWVyaXQgZGlyZWN0IEFTVCBzdXBwb3J0LiAgV2hpbGUsIGluIHRoZW9yeSwgYXJiaXRyYXJ5IG1ldGhvZHMgY2FuCisvLy8gYmUgY29uc2lkZXJlZCB0byBmb3JtIGZhbWlsaWVzLCB3ZSBmb2N1cyBoZXJlIG9uIHRoZSBtZXRob2RzCisvLy8gaW52b2x2aW5nIGFsbG9jYXRpb24gYW5kIHJldGFpbi1jb3VudCBtYW5hZ2VtZW50LCBhcyB0aGVzZSBhcmUgdGhlCisvLy8gbW9zdCAiY29yZSIgYW5kIHRoZSBtb3N0IGxpa2VseSB0byBiZSB1c2VmdWwgdG8gZGl2ZXJzZSBjbGllbnRzCisvLy8gd2l0aG91dCBleHRyYSBpbmZvcm1hdGlvbi4KKy8vLworLy8vIEJvdGggc2VsZWN0b3JzIGFuZCBhY3R1YWwgbWV0aG9kIGRlY2xhcmF0aW9ucyBtYXkgYmUgY2xhc3NpZmllZAorLy8vIGludG8gZmFtaWxpZXMuICBNZXRob2QgZmFtaWxpZXMgbWF5IGltcG9zZSBhZGRpdGlvbmFsIHJlc3RyaWN0aW9ucworLy8vIGJleW9uZCB0aGVpciBzZWxlY3RvciBuYW1lOyBmb3IgZXhhbXBsZSwgYSBtZXRob2QgY2FsbGVkICdfaW5pdCcKKy8vLyB0aGF0IHJldHVybnMgdm9pZCBpcyBub3QgY29uc2lkZXJlZCB0byBiZSBpbiB0aGUgJ2luaXQnIGZhbWlseQorLy8vIChidXQgd291bGQgYmUgaWYgaXQgcmV0dXJuZWQgJ2lkJykuICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvCisvLy8gZXhwbGljaXRseSBjaGFuZ2Ugb3IgcmVtb3ZlIGEgbWV0aG9kJ3MgZmFtaWx5LiAgVGhlcmVmb3JlIHRoZQorLy8vIG1ldGhvZCdzIGZhbWlseSBzaG91bGQgYmUgY29uc2lkZXJlZCB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aC4KK2VudW0gT2JqQ01ldGhvZEZhbWlseSB7CisgIC8vLyBcYnJpZWYgTm8gcGFydGljdWxhciBtZXRob2QgZmFtaWx5LgorICBPTUZfTm9uZSwKKworICAvLyBTZWxlY3RvcnMgaW4gdGhlc2UgZmFtaWxpZXMgbWF5IGhhdmUgYXJiaXRyYXJ5IGFyaXR5LCBtYXkgYmUKKyAgLy8gd3JpdHRlbiB3aXRoIGFyYml0cmFyeSBsZWFkaW5nIHVuZGVyc2NvcmVzLCBhbmQgbWF5IGhhdmUKKyAgLy8gYWRkaXRpb25hbCBDYW1lbENhc2UgIndvcmRzIiBpbiB0aGVpciBmaXJzdCBzZWxlY3RvciBjaHVuaworICAvLyBmb2xsb3dpbmcgdGhlIGZhbWlseSBuYW1lLgorICBPTUZfYWxsb2MsCisgIE9NRl9jb3B5LAorICBPTUZfaW5pdCwKKyAgT01GX211dGFibGVDb3B5LAorICBPTUZfbmV3LAorCisgIC8vIFRoZXNlIGZhbWlsaWVzIGFyZSBzaW5nbGV0b25zIGNvbnNpc3Rpbmcgb25seSBvZiB0aGUgbnVsbGFyeQorICAvLyBzZWxlY3RvciB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICBPTUZfYXV0b3JlbGVhc2UsCisgIE9NRl9kZWFsbG9jLAorICBPTUZfZmluYWxpemUsCisgIE9NRl9yZWxlYXNlLAorICBPTUZfcmV0YWluLAorICBPTUZfcmV0YWluQ291bnQsCisgIE9NRl9zZWxmLAorICBPTUZfaW5pdGlhbGl6ZSwKKworICAvLyBwZXJmb3JtU2VsZWN0b3IgZmFtaWxpZXMKKyAgT01GX3BlcmZvcm1TZWxlY3RvcgorfTsKKworLy8vIEVub3VnaCBiaXRzIHRvIHN0b3JlIGFueSBlbnVtZXJhdG9yIGluIE9iakNNZXRob2RGYW1pbHkgb3IKKy8vLyBJbnZhbGlkT2JqQ01ldGhvZEZhbWlseS4KK2VudW0geyBPYmpDTWV0aG9kRmFtaWx5Qml0V2lkdGggPSA0IH07CisKKy8vLyBcYnJpZWYgQW4gaW52YWxpZCB2YWx1ZSBvZiBPYmpDTWV0aG9kRmFtaWx5LgorZW51bSB7IEludmFsaWRPYmpDTWV0aG9kRmFtaWx5ID0gKDEgPDwgT2JqQ01ldGhvZEZhbWlseUJpdFdpZHRoKSAtIDEgfTsKKworLy8vIFxicmllZiBBIGZhbWlseSBvZiBPYmplY3RpdmUtQyBtZXRob2RzLgorLy8vCisvLy8gVGhlc2UgYXJlIGZhbWlseSBvZiBtZXRob2RzIHdob3NlIHJlc3VsdCB0eXBlIGlzIGluaXRpYWxseSAnaWQnLCBidXQKKy8vLyBidXQgYXJlIGNhbmRpZGF0ZSBmb3IgdGhlIHJlc3VsdCB0eXBlIHRvIGJlIGNoYW5nZWQgdG8gJ2luc3RhbmNldHlwZScuCitlbnVtIE9iakNJbnN0YW5jZVR5cGVGYW1pbHkgeworICBPSVRfTm9uZSwKKyAgT0lUX0FycmF5LAorICBPSVRfRGljdGlvbmFyeSwKKyAgT0lUX1NpbmdsZXRvbiwKKyAgT0lUX0luaXQsCisgIE9JVF9SZXR1cm5zU2VsZgorfTsKKworZW51bSBPYmpDU3RyaW5nRm9ybWF0RmFtaWx5IHsKKyAgU0ZGX05vbmUsCisgIFNGRl9OU1N0cmluZywKKyAgU0ZGX0NGU3RyaW5nCit9OworCisvLy8gXGJyaWVmIFNtYXJ0IHBvaW50ZXIgY2xhc3MgdGhhdCBlZmZpY2llbnRseSByZXByZXNlbnRzIE9iamVjdGl2ZS1DIG1ldGhvZAorLy8vIG5hbWVzLgorLy8vCisvLy8gVGhpcyBjbGFzcyB3aWxsIGVpdGhlciBwb2ludCB0byBhbiBJZGVudGlmaWVySW5mbyBvciBhCisvLy8gTXVsdGlLZXl3b3JkU2VsZWN0b3IgKHdoaWNoIGlzIHByaXZhdGUpLiBUaGlzIGVuYWJsZXMgdXMgdG8gb3B0aW1pemUKKy8vLyBzZWxlY3RvcnMgdGhhdCB0YWtlIG5vIGFyZ3VtZW50cyBhbmQgc2VsZWN0b3JzIHRoYXQgdGFrZSAxIGFyZ3VtZW50LCB3aGljaAorLy8vIGFjY291bnRzIGZvciA3OCUgb2YgYWxsIHNlbGVjdG9ycyBpbiBDb2NvYS5oLgorY2xhc3MgU2VsZWN0b3IgeworICBmcmllbmQgY2xhc3MgRGlhZ25vc3RpYzsKKworICBlbnVtIElkZW50aWZpZXJJbmZvRmxhZyB7CisgICAgLy8gRW1wdHkgc2VsZWN0b3IgPSAwLgorICAgIFplcm9BcmcgID0gMHgxLAorICAgIE9uZUFyZyAgID0gMHgyLAorICAgIE11bHRpQXJnID0gMHgzLAorICAgIEFyZ0ZsYWdzID0gWmVyb0FyZ3xPbmVBcmcKKyAgfTsKKworICAvLyBhIHBvaW50ZXIgdG8gdGhlIE11bHRpS2V5d29yZFNlbGVjdG9yIG9yIElkZW50aWZpZXJJbmZvLgorICB1aW50cHRyX3QgSW5mb1B0ciA9IDA7CisKKyAgU2VsZWN0b3IoSWRlbnRpZmllckluZm8gKklJLCB1bnNpZ25lZCBuQXJncykgeworICAgIEluZm9QdHIgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oSUkpOworICAgIGFzc2VydCgoSW5mb1B0ciAmIEFyZ0ZsYWdzKSA9PSAwICYmIkluc3VmZmljaWVudGx5IGFsaWduZWQgSWRlbnRpZmllckluZm8iKTsKKyAgICBhc3NlcnQobkFyZ3MgPCAyICYmICJuQXJncyBub3QgZXF1YWwgdG8gMC8xIik7CisgICAgSW5mb1B0ciB8PSBuQXJncysxOworICB9CisKKyAgU2VsZWN0b3IoTXVsdGlLZXl3b3JkU2VsZWN0b3IgKlNJKSB7CisgICAgSW5mb1B0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihTSSk7CisgICAgYXNzZXJ0KChJbmZvUHRyICYgQXJnRmxhZ3MpID09IDAgJiYiSW5zdWZmaWNpZW50bHkgYWxpZ25lZCBJZGVudGlmaWVySW5mbyIpOworICAgIEluZm9QdHIgfD0gTXVsdGlBcmc7CisgIH0KKworICBJZGVudGlmaWVySW5mbyAqZ2V0QXNJZGVudGlmaWVySW5mbygpIGNvbnN0IHsKKyAgICBpZiAoZ2V0SWRlbnRpZmllckluZm9GbGFnKCkgPCBNdWx0aUFyZykKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PElkZW50aWZpZXJJbmZvICo+KEluZm9QdHIgJiB+QXJnRmxhZ3MpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgTXVsdGlLZXl3b3JkU2VsZWN0b3IgKmdldE11bHRpS2V5d29yZFNlbGVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PE11bHRpS2V5d29yZFNlbGVjdG9yICo+KEluZm9QdHIgJiB+QXJnRmxhZ3MpOworICB9CisgIAorICB1bnNpZ25lZCBnZXRJZGVudGlmaWVySW5mb0ZsYWcoKSBjb25zdCB7CisgICAgcmV0dXJuIEluZm9QdHIgJiBBcmdGbGFnczsKKyAgfQorCisgIHN0YXRpYyBPYmpDTWV0aG9kRmFtaWx5IGdldE1ldGhvZEZhbWlseUltcGwoU2VsZWN0b3Igc2VsKTsKKyAgCisgIHN0YXRpYyBPYmpDU3RyaW5nRm9ybWF0RmFtaWx5IGdldFN0cmluZ0Zvcm1hdEZhbWlseUltcGwoU2VsZWN0b3Igc2VsKTsKKworcHVibGljOgorICBmcmllbmQgY2xhc3MgU2VsZWN0b3JUYWJsZTsgLy8gb25seSB0aGUgU2VsZWN0b3JUYWJsZSBjYW4gY3JlYXRlIHRoZXNlCisgIGZyaWVuZCBjbGFzcyBEZWNsYXJhdGlvbk5hbWU7IC8vIGFuZCB0aGUgQVNUJ3MgRGVjbGFyYXRpb25OYW1lLgorCisgIC8vLyBUaGUgZGVmYXVsdCBjdG9yIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBjcmVhdGluZyBkYXRhIHN0cnVjdHVyZXMgdGhhdAorICAvLy8gIHdpbGwgY29udGFpbiBzZWxlY3RvcnMuCisgIFNlbGVjdG9yKCkgPSBkZWZhdWx0OworICBTZWxlY3Rvcih1aW50cHRyX3QgVikgOiBJbmZvUHRyKFYpIHt9CisKKyAgLy8vIG9wZXJhdG9yPT0vIT0gLSBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3JzIGFyZSBpZGVudGljYWwuCisgIGJvb2wgb3BlcmF0b3I9PShTZWxlY3RvciBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5mb1B0ciA9PSBSSFMuSW5mb1B0cjsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oU2VsZWN0b3IgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEluZm9QdHIgIT0gUkhTLkluZm9QdHI7CisgIH0KKworICB2b2lkICpnZXRBc09wYXF1ZVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oSW5mb1B0cik7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgdGhlIGVtcHR5IHNlbGVjdG9yLgorICBib29sIGlzTnVsbCgpIGNvbnN0IHsgcmV0dXJuIEluZm9QdHIgPT0gMDsgfQorCisgIC8vIFByZWRpY2F0ZXMgdG8gaWRlbnRpZnkgdGhlIHNlbGVjdG9yIHR5cGUuCisgIGJvb2wgaXNLZXl3b3JkU2VsZWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldElkZW50aWZpZXJJbmZvRmxhZygpICE9IFplcm9Bcmc7CisgIH0KKworICBib29sIGlzVW5hcnlTZWxlY3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SWRlbnRpZmllckluZm9GbGFnKCkgPT0gWmVyb0FyZzsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUFyZ3MoKSBjb25zdDsKKyAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGlkZW50aWZpZXIgYXQgYSBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgc2VsZWN0b3IuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoZSBpZGVudGlmaWVyIHBvaW50ZXIgcmV0dXJuZWQgbWF5IGJlIE5VTEwuIENsaWVudHMgdGhhdCBvbmx5CisgIC8vLyBjYXJlIGFib3V0IHRoZSB0ZXh0IG9mIHRoZSBpZGVudGlmaWVyIHN0cmluZywgYW5kIG5vdCB0aGUgc3BlY2lmaWMsIAorICAvLy8gdW5pcXVlZCBpZGVudGlmaWVyIHBvaW50ZXIsIHNob3VsZCB1c2UgXGMgZ2V0TmFtZUZvclNsb3QoKSwgd2hpY2ggcmV0dXJucworICAvLy8gYW4gZW1wdHkgc3RyaW5nIHdoZW4gdGhlIGlkZW50aWZpZXIgcG9pbnRlciB3b3VsZCBiZSBOVUxMLgorICAvLy8KKyAgLy8vIFxwYXJhbSBhcmdJbmRleCBUaGUgaW5kZXggZm9yIHdoaWNoIHdlIHdhbnQgdG8gcmV0cmlldmUgdGhlIGlkZW50aWZpZXIuCisgIC8vLyBUaGlzIGluZGV4IHNoYWxsIGJlIGxlc3MgdGhhbiBcYyBnZXROdW1BcmdzKCkgdW5sZXNzIHRoaXMgaXMgYSBrZXl3b3JkCisgIC8vLyBzZWxlY3RvciwgaW4gd2hpY2ggY2FzZSAwIGlzIHRoZSBvbmx5IHBlcm1pc3NpYmxlIHZhbHVlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSB1bmlxdWVkIGlkZW50aWZpZXIgZm9yIHRoaXMgc2xvdCwgb3IgTlVMTCBpZiB0aGlzIHNsb3QgaGFzCisgIC8vLyBubyBjb3JyZXNwb25kaW5nIGlkZW50aWZpZXIuCisgIElkZW50aWZpZXJJbmZvICpnZXRJZGVudGlmaWVySW5mb0ZvclNsb3QodW5zaWduZWQgYXJnSW5kZXgpIGNvbnN0OworICAKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmFtZSBhdCBhIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBzZWxlY3Rvci4KKyAgLy8vCisgIC8vLyBccGFyYW0gYXJnSW5kZXggVGhlIGluZGV4IGZvciB3aGljaCB3ZSB3YW50IHRvIHJldHJpZXZlIHRoZSBuYW1lLgorICAvLy8gVGhpcyBpbmRleCBzaGFsbCBiZSBsZXNzIHRoYW4gXGMgZ2V0TnVtQXJncygpIHVubGVzcyB0aGlzIGlzIGEga2V5d29yZAorICAvLy8gc2VsZWN0b3IsIGluIHdoaWNoIGNhc2UgMCBpcyB0aGUgb25seSBwZXJtaXNzaWJsZSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgbmFtZSBmb3IgdGhpcyBzbG90LCB3aGljaCBtYXkgYmUgdGhlIGVtcHR5IHN0cmluZyBpZiBubworICAvLy8gbmFtZSB3YXMgc3VwcGxpZWQuCisgIFN0cmluZ1JlZiBnZXROYW1lRm9yU2xvdCh1bnNpZ25lZCBhcmdJbmRleCkgY29uc3Q7CisgIAorICAvLy8gXGJyaWVmIERlcml2ZSB0aGUgZnVsbCBzZWxlY3RvciBuYW1lIChlLmcuICJmb286YmFyOiIpIGFuZCByZXR1cm4KKyAgLy8vIGl0IGFzIGFuIHN0ZDo6c3RyaW5nLgorICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUHJpbnRzIHRoZSBmdWxsIHNlbGVjdG9yIG5hbWUgKGUuZy4gImZvbzpiYXI6IikuCisgIHZvaWQgcHJpbnQobGx2bTo6cmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERlcml2ZSB0aGUgY29udmVudGlvbmFsIGZhbWlseSBvZiB0aGlzIG1ldGhvZC4KKyAgT2JqQ01ldGhvZEZhbWlseSBnZXRNZXRob2RGYW1pbHkoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE1ldGhvZEZhbWlseUltcGwoKnRoaXMpOworICB9CisgIAorICBPYmpDU3RyaW5nRm9ybWF0RmFtaWx5IGdldFN0cmluZ0Zvcm1hdEZhbWlseSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3RyaW5nRm9ybWF0RmFtaWx5SW1wbCgqdGhpcyk7CisgIH0KKyAgCisgIHN0YXRpYyBTZWxlY3RvciBnZXRFbXB0eU1hcmtlcigpIHsKKyAgICByZXR1cm4gU2VsZWN0b3IodWludHB0cl90KC0xKSk7CisgIH0KKworICBzdGF0aWMgU2VsZWN0b3IgZ2V0VG9tYnN0b25lTWFya2VyKCkgeworICAgIHJldHVybiBTZWxlY3Rvcih1aW50cHRyX3QoLTIpKTsKKyAgfQorICAKKyAgc3RhdGljIE9iakNJbnN0YW5jZVR5cGVGYW1pbHkgZ2V0SW5zdFR5cGVNZXRob2RGYW1pbHkoU2VsZWN0b3Igc2VsKTsKK307CisKKy8vLyBcYnJpZWYgVGhpcyB0YWJsZSBhbGxvd3MgdXMgdG8gZnVsbHkgaGlkZSBob3cgd2UgaW1wbGVtZW50CisvLy8gbXVsdGkta2V5d29yZCBjYWNoaW5nLgorY2xhc3MgU2VsZWN0b3JUYWJsZSB7CisgIC8vIEFjdHVhbGx5IGEgU2VsZWN0b3JUYWJsZUltcGwKKyAgdm9pZCAqSW1wbDsKKworcHVibGljOgorICBTZWxlY3RvclRhYmxlKCk7CisgIFNlbGVjdG9yVGFibGUoY29uc3QgU2VsZWN0b3JUYWJsZSAmKSA9IGRlbGV0ZTsKKyAgU2VsZWN0b3JUYWJsZSAmb3BlcmF0b3I9KGNvbnN0IFNlbGVjdG9yVGFibGUgJikgPSBkZWxldGU7CisgIH5TZWxlY3RvclRhYmxlKCk7CisKKyAgLy8vIFxicmllZiBDYW4gY3JlYXRlIGFueSBzb3J0IG9mIHNlbGVjdG9yLgorICAvLy8KKyAgLy8vIFxwIE51bUFyZ3MgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhIG5vIGFyZ3VtZW50IHNlbGVjdG9yICJmb28iLCBhCisgIC8vLyBzaW5nbGUgYXJndW1lbnQgc2VsZWN0b3IgImZvbzoiIG9yIG11bHRpLWFyZ3VtZW50ICJmb286YmFyOiIuCisgIFNlbGVjdG9yIGdldFNlbGVjdG9yKHVuc2lnbmVkIE51bUFyZ3MsIElkZW50aWZpZXJJbmZvICoqSUlWKTsKKworICBTZWxlY3RvciBnZXRVbmFyeVNlbGVjdG9yKElkZW50aWZpZXJJbmZvICpJRCkgeworICAgIHJldHVybiBTZWxlY3RvcihJRCwgMSk7CisgIH0KKworICBTZWxlY3RvciBnZXROdWxsYXJ5U2VsZWN0b3IoSWRlbnRpZmllckluZm8gKklEKSB7CisgICAgcmV0dXJuIFNlbGVjdG9yKElELCAwKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IGFsbG9jYXRlZCBmb3IgbWFuYWdpbmcgc2VsZWN0b3JzLgorICBzaXplX3QgZ2V0VG90YWxNZW1vcnkoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZGVmYXVsdCBzZXR0ZXIgbmFtZSBmb3IgdGhlIGdpdmVuIGlkZW50aWZpZXIuCisgIC8vLworICAvLy8gVGhpcyBpcyAic2V0IiArIFxwIE5hbWUgd2hlcmUgdGhlIGluaXRpYWwgY2hhcmFjdGVyIG9mIFxwIE5hbWUKKyAgLy8vIGhhcyBiZWVuIGNhcGl0YWxpemVkLgorICBzdGF0aWMgU21hbGxTdHJpbmc8NjQ+IGNvbnN0cnVjdFNldHRlck5hbWUoU3RyaW5nUmVmIE5hbWUpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBkZWZhdWx0IHNldHRlciBzZWxlY3RvciBmb3IgdGhlIGdpdmVuIGlkZW50aWZpZXIuCisgIC8vLworICAvLy8gVGhpcyBpcyAic2V0IiArIFxwIE5hbWUgd2hlcmUgdGhlIGluaXRpYWwgY2hhcmFjdGVyIG9mIFxwIE5hbWUKKyAgLy8vIGhhcyBiZWVuIGNhcGl0YWxpemVkLgorICBzdGF0aWMgU2VsZWN0b3IgY29uc3RydWN0U2V0dGVyU2VsZWN0b3IoSWRlbnRpZmllclRhYmxlICZJZGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvclRhYmxlICZTZWxUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElkZW50aWZpZXJJbmZvICpOYW1lKTsKK307CisKKy8vLyBEZWNsYXJhdGlvbk5hbWVFeHRyYSAtIENvbW1vbiBiYXNlIG9mIHRoZSBNdWx0aUtleXdvcmRTZWxlY3RvciwKKy8vLyBDWFhTcGVjaWFsTmFtZSwgYW5kIENYWE9wZXJhdG9ySWROYW1lIGNsYXNzZXMsIGFsbCBvZiB3aGljaCBhcmUKKy8vLyBwcml2YXRlIGNsYXNzZXMgdGhhdCBkZXNjcmliZSBkaWZmZXJlbnQga2luZHMgb2YgbmFtZXMuCitjbGFzcyBEZWNsYXJhdGlvbk5hbWVFeHRyYSB7CitwdWJsaWM6CisgIC8vLyBFeHRyYUtpbmQgLSBUaGUga2luZCBvZiAiZXh0cmEiIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUKKyAgLy8vIERlY2xhcmF0aW9uTmFtZS4gU2VlIEBjIEV4dHJhS2luZE9yTnVtQXJncyBmb3IgYW4gZXhwbGFuYXRpb24gb2YKKyAgLy8vIGhvdyB0aGVzZSBlbnVtZXJhdG9yIHZhbHVlcyBhcmUgdXNlZC4KKyAgZW51bSBFeHRyYUtpbmQgeworICAgIENYWENvbnN0cnVjdG9yID0gMCwKKyAgICBDWFhEZXN0cnVjdG9yLAorICAgIENYWENvbnZlcnNpb25GdW5jdGlvbiwKKyNkZWZpbmUgT1ZFUkxPQURFRF9PUEVSQVRPUihOYW1lLFNwZWxsaW5nLFRva2VuLFVuYXJ5LEJpbmFyeSxNZW1iZXJPbmx5KSBcCisgICAgQ1hYT3BlcmF0b3IjI05hbWUsCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3BlcmF0b3JLaW5kcy5kZWYiCisgICAgQ1hYRGVkdWN0aW9uR3VpZGUsCisgICAgQ1hYTGl0ZXJhbE9wZXJhdG9yLAorICAgIENYWFVzaW5nRGlyZWN0aXZlLAorICAgIE5VTV9FWFRSQV9LSU5EUworICB9OworCisgIC8vLyBFeHRyYUtpbmRPck51bUFyZ3MgLSBFaXRoZXIgdGhlIGtpbmQgb2YgQysrIHNwZWNpYWwgbmFtZSBvcgorICAvLy8gb3BlcmF0b3ItaWQgKGlmIHRoZSB2YWx1ZSBpcyBvbmUgb2YgdGhlIENYWCogZW51bWVyYXRvcnMgb2YKKyAgLy8vIEV4dHJhS2luZCksIGluIHdoaWNoIGNhc2UgdGhlIERlY2xhcmF0aW9uTmFtZUV4dHJhIGlzIGFsc28gYQorICAvLy8gQ1hYU3BlY2lhbE5hbWUsIChmb3IgQ1hYQ29uc3RydWN0b3IsIENYWERlc3RydWN0b3IsIG9yCisgIC8vLyBDWFhDb252ZXJzaW9uRnVuY3Rpb24pIENYWE9wZXJhdG9ySWROYW1lLCBvciBDWFhMaXRlcmFsT3BlcmF0b3JOYW1lLAorICAvLy8gaXQgbWF5IGJlIGFsc28gbmFtZSBjb21tb24gdG8gQysrIHVzaW5nLWRpcmVjdGl2ZXMgKENYWFVzaW5nRGlyZWN0aXZlKSwKKyAgLy8vIG90aGVyd2lzZSBpdCBpcyBOVU1fRVhUUkFfS0lORFMrTnVtQXJncywgd2hlcmUgTnVtQXJncyBpcyB0aGUgbnVtYmVyIG9mCisgIC8vLyBhcmd1bWVudHMgaW4gdGhlIE9iamVjdGl2ZS1DIHNlbGVjdG9yLCBpbiB3aGljaCBjYXNlIHRoZQorICAvLy8gRGVjbGFyYXRpb25OYW1lRXh0cmEgaXMgYWxzbyBhIE11bHRpS2V5d29yZFNlbGVjdG9yLgorICB1bnNpZ25lZCBFeHRyYUtpbmRPck51bUFyZ3M7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2xhbmcKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gRGVmaW5lIERlbnNlTWFwSW5mbyBzbyB0aGF0IFNlbGVjdG9ycyBjYW4gYmUgdXNlZCBhcyBrZXlzIGluIERlbnNlTWFwIGFuZAorLy8vIERlbnNlU2V0cy4KK3RlbXBsYXRlIDw+CitzdHJ1Y3QgRGVuc2VNYXBJbmZvPGNsYW5nOjpTZWxlY3Rvcj4geworICBzdGF0aWMgY2xhbmc6OlNlbGVjdG9yIGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBjbGFuZzo6U2VsZWN0b3I6OmdldEVtcHR5TWFya2VyKCk7CisgIH0KKworICBzdGF0aWMgY2xhbmc6OlNlbGVjdG9yIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gY2xhbmc6OlNlbGVjdG9yOjpnZXRUb21ic3RvbmVNYXJrZXIoKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY2xhbmc6OlNlbGVjdG9yIFMpOworCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY2xhbmc6OlNlbGVjdG9yIExIUywgY2xhbmc6OlNlbGVjdG9yIFJIUykgeworICAgIHJldHVybiBMSFMgPT0gUkhTOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGlzUG9kTGlrZTxjbGFuZzo6U2VsZWN0b3I+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgUG9pbnRlckxpa2VUeXBlVHJhaXRzPGNsYW5nOjpTZWxlY3Rvcj4geworICBzdGF0aWMgY29uc3Qgdm9pZCAqZ2V0QXNWb2lkUG9pbnRlcihjbGFuZzo6U2VsZWN0b3IgUCkgeworICAgIHJldHVybiBQLmdldEFzT3BhcXVlUHRyKCk7CisgIH0KKworICBzdGF0aWMgY2xhbmc6OlNlbGVjdG9yIGdldEZyb21Wb2lkUG9pbnRlcihjb25zdCB2b2lkICpQKSB7CisgICAgcmV0dXJuIGNsYW5nOjpTZWxlY3RvcihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oUCkpOworICB9CisKKyAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSAwIH07ICAKK307CisKKy8vIFByb3ZpZGUgUG9pbnRlckxpa2VUeXBlVHJhaXRzIGZvciBJZGVudGlmaWVySW5mbyBwb2ludGVycywgd2hpY2gKKy8vIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSA4LWJ5dGUgYWxpZ25lZC4KK3RlbXBsYXRlPD4KK3N0cnVjdCBQb2ludGVyTGlrZVR5cGVUcmFpdHM8Y2xhbmc6OklkZW50aWZpZXJJbmZvKj4geworICBzdGF0aWMgdm9pZCAqZ2V0QXNWb2lkUG9pbnRlcihjbGFuZzo6SWRlbnRpZmllckluZm8qIFApIHsKKyAgICByZXR1cm4gUDsKKyAgfQorCisgIHN0YXRpYyBjbGFuZzo6SWRlbnRpZmllckluZm8gKmdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNsYW5nOjpJZGVudGlmaWVySW5mbyo+KFApOworICB9CisKKyAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSAxIH07Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgUG9pbnRlckxpa2VUeXBlVHJhaXRzPGNvbnN0IGNsYW5nOjpJZGVudGlmaWVySW5mbyo+IHsKKyAgc3RhdGljIGNvbnN0IHZvaWQgKmdldEFzVm9pZFBvaW50ZXIoY29uc3QgY2xhbmc6OklkZW50aWZpZXJJbmZvKiBQKSB7CisgICAgcmV0dXJuIFA7CisgIH0KKworICBzdGF0aWMgY29uc3QgY2xhbmc6OklkZW50aWZpZXJJbmZvICpnZXRGcm9tVm9pZFBvaW50ZXIoY29uc3Qgdm9pZCAqUCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBjbGFuZzo6SWRlbnRpZmllckluZm8qPihQKTsKKyAgfQorCisgIGVudW0geyBOdW1Mb3dCaXRzQXZhaWxhYmxlID0gMSB9OworfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DTEFOR19CQVNJQ19JREVOVElGSUVSVEFCTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvTExWTS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvTExWTS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MDI4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9MTFZNLmgKQEAgLTAsMCArMSw4NyBAQAorLy89PT0tLS0gTExWTS5oIC0gSW1wb3J0IHZhcmlvdXMgY29tbW9uIExMVk0gZGF0YXR5cGVzIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRm9yd2FyZC1kZWNsYXJlcyBhbmQgaW1wb3J0cyB2YXJpb3VzIGNvbW1vbiBMTFZNIGRhdGF0eXBlcyB0aGF0CisvLy8gY2xhbmcgd2FudHMgdG8gdXNlIHVucXVhbGlmaWVkLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfTExWTV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfTExWTV9ICisKKy8vIERvIG5vdCBwcm9saWZlcmF0ZSAjaW5jbHVkZXMgaGVyZSwgcmVxdWlyZSBjbGllbnRzIHRvICNpbmNsdWRlIHRoZWlyCisvLyBkZXBlbmRlbmNpZXMuCisvLyBDYXN0aW5nLmggaGFzIGNvbXBsZXggdGVtcGxhdGVzIHRoYXQgY2Fubm90IGJlIGVhc2lseSBmb3J3YXJkIGRlY2xhcmVkLgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisvLyBOb25lLmggaW5jbHVkZXMgYW4gZW51bWVyYXRvciB0aGF0IGlzIGRlc2lyZWQgJiBjYW5ub3QgYmUgZm9yd2FyZCBkZWNsYXJlZAorLy8gd2l0aG91dCBhIGRlZmluaXRpb24gb2YgTm9uZVR5cGUuCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIC8vIEFEVCdzLgorICBjbGFzcyBTdHJpbmdSZWY7CisgIGNsYXNzIFR3aW5lOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgTXV0YWJsZUFycmF5UmVmOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBPd25pbmdBcnJheVJlZjsKKyAgdGVtcGxhdGU8dW5zaWduZWQgSW50ZXJuYWxMZW4+IGNsYXNzIFNtYWxsU3RyaW5nOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB1bnNpZ25lZCBOPiBjbGFzcyBTbWFsbFZlY3RvcjsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgU21hbGxWZWN0b3JJbXBsOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBPcHRpb25hbDsKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIEV4cGVjdGVkOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBTYXZlQW5kUmVzdG9yZTsKKworICAvLyBSZWZlcmVuY2UgY291bnRpbmcuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBJbnRydXNpdmVSZWZDbnRQdHI7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgSW50cnVzaXZlUmVmQ250UHRySW5mbzsKKyAgdGVtcGxhdGUgPGNsYXNzIERlcml2ZWQ+IGNsYXNzIFJlZkNvdW50ZWRCYXNlOworCisgIGNsYXNzIHJhd19vc3RyZWFtOworICBjbGFzcyByYXdfcHdyaXRlX3N0cmVhbTsKKyAgLy8gVE9ETzogRGVuc2VNYXAsIC4uLgorfQorCisKK25hbWVzcGFjZSBjbGFuZyB7CisgIC8vIENhc3Rpbmcgb3BlcmF0b3JzLgorICB1c2luZyBsbHZtOjppc2E7CisgIHVzaW5nIGxsdm06OmNhc3Q7CisgIHVzaW5nIGxsdm06OmR5bl9jYXN0OworICB1c2luZyBsbHZtOjpkeW5fY2FzdF9vcl9udWxsOworICB1c2luZyBsbHZtOjpjYXN0X29yX251bGw7CisgIAorICAvLyBBRFQncy4KKyAgdXNpbmcgbGx2bTo6Tm9uZTsKKyAgdXNpbmcgbGx2bTo6T3B0aW9uYWw7CisgIHVzaW5nIGxsdm06OlN0cmluZ1JlZjsKKyAgdXNpbmcgbGx2bTo6VHdpbmU7CisgIHVzaW5nIGxsdm06OkFycmF5UmVmOworICB1c2luZyBsbHZtOjpNdXRhYmxlQXJyYXlSZWY7CisgIHVzaW5nIGxsdm06Ok93bmluZ0FycmF5UmVmOworICB1c2luZyBsbHZtOjpTbWFsbFN0cmluZzsKKyAgdXNpbmcgbGx2bTo6U21hbGxWZWN0b3I7CisgIHVzaW5nIGxsdm06OlNtYWxsVmVjdG9ySW1wbDsKKyAgdXNpbmcgbGx2bTo6U2F2ZUFuZFJlc3RvcmU7CisKKyAgLy8gRXJyb3IgaGFuZGxpbmcuCisgIHVzaW5nIGxsdm06OkV4cGVjdGVkOworCisgIC8vIFJlZmVyZW5jZSBjb3VudGluZy4KKyAgdXNpbmcgbGx2bTo6SW50cnVzaXZlUmVmQ250UHRyOworICB1c2luZyBsbHZtOjpJbnRydXNpdmVSZWZDbnRQdHJJbmZvOworICB1c2luZyBsbHZtOjpSZWZDb3VudGVkQmFzZTsKKworICB1c2luZyBsbHZtOjpyYXdfb3N0cmVhbTsKKyAgdXNpbmcgbGx2bTo6cmF3X3B3cml0ZV9zdHJlYW07Cit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcuCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvTGFtYmRhLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9MYW1iZGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzE5ZjFkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvTGFtYmRhLmgKQEAgLTAsMCArMSw0NCBAQAorLy89PT0tLS0gTGFtYmRhLmggLSBUeXBlcyBmb3IgQysrIExhbWJkYXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgc2V2ZXJhbCB0eXBlcyB1c2VkIHRvIGRlc2NyaWJlIEMrKyBsYW1iZGEgZXhwcmVzc2lvbnMKKy8vLyB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiB0aGUgcGFyc2VyIGFuZCBBU1QuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX0xBTUJEQV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfTEFNQkRBX0gKKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBUaGUgZGVmYXVsdCwgaWYgYW55LCBjYXB0dXJlIG1ldGhvZCBmb3IgYSBsYW1iZGEgZXhwcmVzc2lvbi4KK2VudW0gTGFtYmRhQ2FwdHVyZURlZmF1bHQgeworICBMQ0RfTm9uZSwKKyAgTENEX0J5Q29weSwKKyAgTENEX0J5UmVmCit9OworCisvLy8gXGJyaWVmIFRoZSBkaWZmZXJlbnQgY2FwdHVyZSBmb3JtcyBpbiBhIGxhbWJkYSBpbnRyb2R1Y2VyCisvLy8KKy8vLyBDKysxMSBhbGxvd3MgY2FwdHVyZSBvZiBcYyB0aGlzLCBvciBvZiBsb2NhbCB2YXJpYWJsZXMgYnkgY29weSBvcgorLy8vIGJ5IHJlZmVyZW5jZS4gIEMrKzF5IGFsc28gYWxsb3dzICJpbml0LWNhcHR1cmUiLCB3aGVyZSB0aGUgaW5pdGlhbGl6ZXIKKy8vLyBpcyBhbiBleHByZXNzaW9uLgorZW51bSBMYW1iZGFDYXB0dXJlS2luZCB7CisgIExDS19UaGlzLCAgIC8vLzwgQ2FwdHVyaW5nIHRoZSBcYyAqdGhpcyBvYmplY3QgYnkgcmVmZXJlbmNlCisgIExDS19TdGFyVGhpcywgLy8vIDwgQ2FwdHVyaW5nIHRoZSBcYyAqdGhpcyBvYmplY3QgYnkgY29weQorICBMQ0tfQnlDb3B5LCAvLy88IENhcHR1cmluZyBieSBjb3B5IChhLmsuYS4sIGJ5IHZhbHVlKQorICBMQ0tfQnlSZWYsICAvLy88IENhcHR1cmluZyBieSByZWZlcmVuY2UKKyAgTENLX1ZMQVR5cGUgLy8vPCBDYXB0dXJpbmcgdmFyaWFibGUtbGVuZ3RoIGFycmF5IHR5cGUKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19CQVNJQ19MQU1CREFfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDJiYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9MYW5nT3B0aW9ucy5kZWYKQEAgLTAsMCArMSwzMDAgQEAKKy8vPT09LS0tIExhbmdPcHRpb25zLmRlZiAtIExhbmd1YWdlIG9wdGlvbiBkYXRhYmFzZSAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGxhbmd1YWdlIG9wdGlvbnMuIFVzZXJzIG9mIHRoaXMgZmlsZSBtdXN0CisvLyBkZWZpbmUgdGhlIExBTkdPUFQgbWFjcm8gdG8gbWFrZSB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbi4KKy8vCisvLyBPcHRpb25hbGx5LCB0aGUgdXNlciBtYXkgYWxzbyBkZWZpbmU6CisvLworLy8gQkVOSUdOX0xBTkdPUFQ6IGZvciBvcHRpb25zIHRoYXQgZG9uJ3QgYWZmZWN0IHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIEFTVCBpbgorLy8gICAgIGFueSB3YXkgKHRoYXQgaXMsIHRoZSB2YWx1ZSBjYW4gYmUgZGlmZmVyZW50IGJldHdlZW4gYW4gaW1wbGljaXQgbW9kdWxlCisvLyAgICAgYW5kIHRoZSB1c2VyIG9mIHRoYXQgbW9kdWxlKS4KKy8vCisvLyBDT01QQVRJQkxFX0xBTkdPUFQ6IGZvciBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIEFTVCBpbgorLy8gICAgIGEgd2F5IHRoYXQgZG9lc24ndCBwcmV2ZW50IGludGVyb3BlcmFiaWxpdHkgKHRoYXQgaXMsIHRoZSB2YWx1ZSBjYW4gYmUKKy8vICAgICBkaWZmZXJlbnQgYmV0d2VlbiBhbiBleHBsaWNpdCBtb2R1bGUgYW5kIHRoZSB1c2VyIG9mIHRoYXQgbW9kdWxlKS4KKy8vCisvLyBFTlVNX0xBTkdPUFQ6IGZvciBvcHRpb25zIHRoYXQgaGF2ZSBlbnVtZXJhdGlvbiwgcmF0aGVyIHRoYW4gdW5zaWduZWQsIHR5cGUuCisvLworLy8gVkFMVUVfTEFOR09QVDogZm9yIG9wdGlvbnMgdGhhdCBkZXNjcmliZSBhIHZhbHVlIHJhdGhlciB0aGFuIGEgZmxhZy4KKy8vCisvLyBCRU5JR05fRU5VTV9MQU5HT1BULCBDT01QQVRJQkxFX0VOVU1fTEFOR09QVCwKKy8vIEJFTklHTl9WQUxVRV9MQU5HT1BULCBDT01QQVRJQkxFX1ZBTFVFX0xBTkdPUFQ6IGNvbWJpbmF0aW9ucyBvZiB0aGUgYWJvdmUuCisvLworLy8gRklYTUU6IENsaWVudHMgc2hvdWxkIGJlIGFibGUgdG8gbW9yZSBlYXNpbHkgc2VsZWN0IHdoZXRoZXIgdGhleSB3YW50CisvLyBkaWZmZXJlbnQgbGV2ZWxzIG9mIGNvbXBhdGliaWxpdHkgdmVyc3VzIGhvdyB0byBoYW5kbGUgZGlmZmVyZW50IGtpbmRzCisvLyBvZiBvcHRpb24uCisvLworLy8gVGhlIERlc2NyaXB0aW9uIGZpZWxkIHNob3VsZCBiZSBhIG5vdW4gcGhyYXNlLCBmb3IgaW5zdGFuY2UgImZyb2JiaW5nIGFsbAorLy8gd2lkZ2V0cyIgb3IgIkMncyBpbXBsaWNpdCBibGludHogZmVhdHVyZSIuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExBTkdPUFQKKyMgIGVycm9yIERlZmluZSB0aGUgTEFOR09QVCBtYWNybyB0byBoYW5kbGUgbGFuZ3VhZ2Ugb3B0aW9ucworI2VuZGlmCisKKyNpZm5kZWYgQ09NUEFUSUJMRV9MQU5HT1BUCisjICBkZWZpbmUgQ09NUEFUSUJMRV9MQU5HT1BUKE5hbWUsIEJpdHMsIERlZmF1bHQsIERlc2NyaXB0aW9uKSBcCisgICAgIExBTkdPUFQoTmFtZSwgQml0cywgRGVmYXVsdCwgRGVzY3JpcHRpb24pCisjZW5kaWYKKworI2lmbmRlZiBCRU5JR05fTEFOR09QVAorIyAgZGVmaW5lIEJFTklHTl9MQU5HT1BUKE5hbWUsIEJpdHMsIERlZmF1bHQsIERlc2NyaXB0aW9uKSBcCisgICAgIENPTVBBVElCTEVfTEFOR09QVChOYW1lLCBCaXRzLCBEZWZhdWx0LCBEZXNjcmlwdGlvbikKKyNlbmRpZgorCisjaWZuZGVmIEVOVU1fTEFOR09QVAorIyAgZGVmaW5lIEVOVU1fTEFOR09QVChOYW1lLCBUeXBlLCBCaXRzLCBEZWZhdWx0LCBEZXNjcmlwdGlvbikgXAorICAgICBMQU5HT1BUKE5hbWUsIEJpdHMsIERlZmF1bHQsIERlc2NyaXB0aW9uKQorI2VuZGlmCisKKyNpZm5kZWYgQ09NUEFUSUJMRV9FTlVNX0xBTkdPUFQKKyMgIGRlZmluZSBDT01QQVRJQkxFX0VOVU1fTEFOR09QVChOYW1lLCBUeXBlLCBCaXRzLCBEZWZhdWx0LCBEZXNjcmlwdGlvbikgXAorICAgICBFTlVNX0xBTkdPUFQoTmFtZSwgVHlwZSwgQml0cywgRGVmYXVsdCwgRGVzY3JpcHRpb24pCisjZW5kaWYKKworI2lmbmRlZiBCRU5JR05fRU5VTV9MQU5HT1BUCisjICBkZWZpbmUgQkVOSUdOX0VOVU1fTEFOR09QVChOYW1lLCBUeXBlLCBCaXRzLCBEZWZhdWx0LCBEZXNjcmlwdGlvbikgXAorICAgICBDT01QQVRJQkxFX0VOVU1fTEFOR09QVChOYW1lLCBUeXBlLCBCaXRzLCBEZWZhdWx0LCBEZXNjcmlwdGlvbikKKyNlbmRpZgorCisjaWZuZGVmIFZBTFVFX0xBTkdPUFQKKyMgIGRlZmluZSBWQUxVRV9MQU5HT1BUKE5hbWUsIEJpdHMsIERlZmF1bHQsIERlc2NyaXB0aW9uKSBcCisgICAgIExBTkdPUFQoTmFtZSwgQml0cywgRGVmYXVsdCwgRGVzY3JpcHRpb24pCisjZW5kaWYKKworI2lmbmRlZiBDT01QQVRJQkxFX1ZBTFVFX0xBTkdPUFQKKyMgIGRlZmluZSBDT01QQVRJQkxFX1ZBTFVFX0xBTkdPUFQoTmFtZSwgQml0cywgRGVmYXVsdCwgRGVzY3JpcHRpb24pIFwKKyAgICAgVkFMVUVfTEFOR09QVChOYW1lLCBCaXRzLCBEZWZhdWx0LCBEZXNjcmlwdGlvbikKKyNlbmRpZgorCisjaWZuZGVmIEJFTklHTl9WQUxVRV9MQU5HT1BUCisjICBkZWZpbmUgQkVOSUdOX1ZBTFVFX0xBTkdPUFQoTmFtZSwgQml0cywgRGVmYXVsdCwgRGVzY3JpcHRpb24pIFwKKyAgICAgQ09NUEFUSUJMRV9WQUxVRV9MQU5HT1BUKE5hbWUsIEJpdHMsIERlZmF1bHQsIERlc2NyaXB0aW9uKQorI2VuZGlmCisKKy8vIEZJWE1FOiBBIGxvdCBvZiB0aGUgQkVOSUdOXyBvcHRpb25zIHNob3VsZCBiZSBDT01QQVRJQkxFXyBpbnN0ZWFkLgorTEFOR09QVChDOTkgICAgICAgICAgICAgICAsIDEsIDAsICJDOTkiKQorTEFOR09QVChDMTEgICAgICAgICAgICAgICAsIDEsIDAsICJDMTEiKQorTEFOR09QVChDMTcgICAgICAgICAgICAgICAsIDEsIDAsICJDMTciKQorTEFOR09QVChNU1ZDQ29tcGF0ICAgICAgICAsIDEsIDAsICJNaWNyb3NvZnQgVmlzdWFsIEMrKyBmdWxsIGNvbXBhdGliaWxpdHkgbW9kZSIpCitMQU5HT1BUKE1pY3Jvc29mdEV4dCAgICAgICwgMSwgMCwgIk1pY3Jvc29mdCBDKysgZXh0ZW5zaW9ucyIpCitMQU5HT1BUKEFzbUJsb2NrcyAgICAgICAgICwgMSwgMCwgIk1pY3Jvc29mdCBpbmxpbmUgYXNtIGJsb2NrcyIpCitMQU5HT1BUKEJvcmxhbmQgICAgICAgICAgICwgMSwgMCwgIkJvcmxhbmQgZXh0ZW5zaW9ucyIpCitMQU5HT1BUKENQbHVzUGx1cyAgICAgICAgICwgMSwgMCwgIkMrKyIpCitMQU5HT1BUKENQbHVzUGx1czExICAgICAgICwgMSwgMCwgIkMrKzExIikKK0xBTkdPUFQoQ1BsdXNQbHVzMTQgICAgICAgLCAxLCAwLCAiQysrMTQiKQorTEFOR09QVChDUGx1c1BsdXMxNyAgICAgICAsIDEsIDAsICJDKysxNyIpCitMQU5HT1BUKENQbHVzUGx1czJhICAgICAgICwgMSwgMCwgIkMrKzJhIikKK0xBTkdPUFQoT2JqQzEgICAgICAgICAgICAgLCAxLCAwLCAiT2JqZWN0aXZlLUMgMSIpCitMQU5HT1BUKE9iakMyICAgICAgICAgICAgICwgMSwgMCwgIk9iamVjdGl2ZS1DIDIiKQorQkVOSUdOX0xBTkdPUFQoT2JqQ0RlZmF1bHRTeW50aFByb3BlcnRpZXMgLCAxLCAwLAorICAgICAgICAgICAgICAgIk9iamVjdGl2ZS1DIGF1dG8tc3ludGhlc2l6ZWQgcHJvcGVydGllcyIpCitCRU5JR05fTEFOR09QVChFbmNvZGVFeHRlbmRlZEJsb2NrU2lnICwgMSwgMCwKKyAgICAgICAgICAgICAgICJFbmNvZGluZyBleHRlbmRlZCBibG9jayB0eXBlIHNpZ25hdHVyZSIpCitCRU5JR05fTEFOR09QVChPYmpDSW5mZXJSZWxhdGVkUmVzdWx0VHlwZSAsIDEsIDEsCisgICAgICAgICAgICAgICAiT2JqZWN0aXZlLUMgcmVsYXRlZCByZXN1bHQgdHlwZSBpbmZlcmVuY2UiKQorTEFOR09QVChBcHBFeHQgLCAxLCAwLCAiT2JqZWN0aXZlLUMgQXBwIEV4dGVuc2lvbiIpCitMQU5HT1BUKFRyaWdyYXBocyAgICAgICAgICwgMSwgMCwidHJpZ3JhcGhzIikKK0xBTkdPUFQoTGluZUNvbW1lbnQgICAgICAgLCAxLCAwLCAiJy8vJyBjb21tZW50cyIpCitMQU5HT1BUKEJvb2wgICAgICAgICAgICAgICwgMSwgMCwgImJvb2wsIHRydWUsIGFuZCBmYWxzZSBrZXl3b3JkcyIpCitMQU5HT1BUKEhhbGYgICAgICAgICAgICAgICwgMSwgMCwgImhhbGYga2V5d29yZCIpCitMQU5HT1BUKFdDaGFyICAgICAgICAgICAgICwgMSwgQ1BsdXNQbHVzLCAid2NoYXJfdCBrZXl3b3JkIikKK0xBTkdPUFQoRGVjbFNwZWNLZXl3b3JkICAgLCAxLCAwLCAiX19kZWNsc3BlYyBrZXl3b3JkIikKK0JFTklHTl9MQU5HT1BUKERvbGxhcklkZW50cyAgICwgMSwgMSwgIickJyBpbiBpZGVudGlmaWVycyIpCitCRU5JR05fTEFOR09QVChBc21QcmVwcm9jZXNzb3IsIDEsIDAsICJwcmVwcm9jZXNzb3IgaW4gYXNtIG1vZGUiKQorTEFOR09QVChHTlVNb2RlICAgICAgICAgICAsIDEsIDEsICJHTlUgZXh0ZW5zaW9ucyIpCitMQU5HT1BUKEdOVUtleXdvcmRzICAgICAgICwgMSwgMSwgIkdOVSBrZXl3b3JkcyIpCitCRU5JR05fTEFOR09QVChJbXBsaWNpdEludCwgMSwgIUM5OSAmJiAhQ1BsdXNQbHVzLCAiQzg5IGltcGxpY2l0ICdpbnQnIikKK0xBTkdPUFQoRGlncmFwaHMgICAgICAgICAgLCAxLCAwLCAiZGlncmFwaHMiKQorQkVOSUdOX0xBTkdPUFQoSGV4RmxvYXRzICAsIDEsIEM5OSwgIkM5OSBoZXhhZGVjaW1hbCBmbG9hdCBjb25zdGFudHMiKQorTEFOR09QVChDWFhPcGVyYXRvck5hbWVzICAsIDEsIDAsICJDKysgb3BlcmF0b3IgbmFtZSBrZXl3b3JkcyIpCitMQU5HT1BUKEFwcGxlS2V4dCAgICAgICAgICwgMSwgMCwgIkFwcGxlIGtleHQgc3VwcG9ydCIpCitCRU5JR05fTEFOR09QVChQYXNjYWxTdHJpbmdzLCAxLCAwLCAiUGFzY2FsIHN0cmluZyBzdXBwb3J0IikKK0xBTkdPUFQoV3JpdGFibGVTdHJpbmdzICAgLCAxLCAwLCAid3JpdGFibGUgc3RyaW5nIHN1cHBvcnQiKQorTEFOR09QVChDb25zdFN0cmluZ3MgICAgICAsIDEsIDAsICJjb25zdC1xdWFsaWZpZWQgc3RyaW5nIHN1cHBvcnQiKQorTEFOR09QVChMYXhWZWN0b3JDb252ZXJzaW9ucyAsIDEsIDEsICJsYXggdmVjdG9yIGNvbnZlcnNpb25zIikKK0xBTkdPUFQoQWx0aVZlYyAgICAgICAgICAgLCAxLCAwLCAiQWx0aVZlYy1zdHlsZSB2ZWN0b3IgaW5pdGlhbGl6ZXJzIikKK0xBTkdPUFQoWlZlY3RvciAgICAgICAgICAgLCAxLCAwLCAiU3lzdGVtIHogdmVjdG9yIGV4dGVuc2lvbnMiKQorTEFOR09QVChFeGNlcHRpb25zICAgICAgICAsIDEsIDAsICJleGNlcHRpb24gaGFuZGxpbmciKQorTEFOR09QVChPYmpDRXhjZXB0aW9ucyAgICAsIDEsIDAsICJPYmplY3RpdmUtQyBleGNlcHRpb25zIikKK0xBTkdPUFQoQ1hYRXhjZXB0aW9ucyAgICAgLCAxLCAwLCAiQysrIGV4Y2VwdGlvbnMiKQorTEFOR09QVChEV0FSRkV4Y2VwdGlvbnMgICAsIDEsIDAsICJkd2FyZiBleGNlcHRpb24gaGFuZGxpbmciKQorTEFOR09QVChTakxqRXhjZXB0aW9ucyAgICAsIDEsIDAsICJzZXRqbXAtbG9uZ2p1bXAgZXhjZXB0aW9uIGhhbmRsaW5nIikKK0xBTkdPUFQoU0VIRXhjZXB0aW9ucyAgICAgLCAxLCAwLCAiU0VIIC54ZGF0YSBleGNlcHRpb24gaGFuZGxpbmciKQorTEFOR09QVChFeHRlcm5DTm9VbndpbmQgICAsIDEsIDAsICJBc3N1bWUgZXh0ZXJuIEMgZnVuY3Rpb25zIGRvbid0IHVud2luZCIpCitMQU5HT1BUKFRyYWRpdGlvbmFsQ1BQICAgICwgMSwgMCwgInRyYWRpdGlvbmFsIENQUCBlbXVsYXRpb24iKQorTEFOR09QVChSVFRJICAgICAgICAgICAgICAsIDEsIDEsICJydW4tdGltZSB0eXBlIGluZm9ybWF0aW9uIikKK0xBTkdPUFQoUlRUSURhdGEgICAgICAgICAgLCAxLCAxLCAiZW1pdCBydW4tdGltZSB0eXBlIGluZm9ybWF0aW9uIGRhdGEiKQorTEFOR09QVChNU0JpdGZpZWxkcyAgICAgICAsIDEsIDAsICJNaWNyb3NvZnQtY29tcGF0aWJsZSBzdHJ1Y3R1cmUgbGF5b3V0IikKK0xBTkdPUFQoRnJlZXN0YW5kaW5nLCAxLCAwLCAiZnJlZXN0YW5kaW5nIGltcGxlbWVudGF0aW9uIikKK0xBTkdPUFQoTm9CdWlsdGluICAgICAgICAgLCAxLCAwLCAiZGlzYWJsZSBidWlsdGluIGZ1bmN0aW9ucyIpCitMQU5HT1BUKE5vTWF0aEJ1aWx0aW4gICAgICwgMSwgMCwgImRpc2FibGUgbWF0aCBidWlsdGluIGZ1bmN0aW9ucyIpCitMQU5HT1BUKEdOVUFzbSAgICAgICAgICAgICwgMSwgMSwgIkdOVS1zdHlsZSBpbmxpbmUgYXNzZW1ibHkiKQorTEFOR09QVChDb3JvdXRpbmVzVFMgICAgICAsIDEsIDAsICJDKysgY29yb3V0aW5lcyBUUyIpCitMQU5HT1BUKFJlbGF4ZWRUZW1wbGF0ZVRlbXBsYXRlQXJncywgMSwgMCwgIkMrKzE3IHJlbGF4ZWQgbWF0Y2hpbmcgb2YgdGVtcGxhdGUgdGVtcGxhdGUgYXJndW1lbnRzIikKKworTEFOR09QVChEb3VibGVTcXVhcmVCcmFja2V0QXR0cmlidXRlcywgMSwgMCwgIidbW11dJyBhdHRyaWJ1dGVzIGV4dGVuc2lvbiBmb3IgYWxsIGxhbmd1YWdlIHN0YW5kYXJkIG1vZGVzIikKKworQkVOSUdOX0xBTkdPUFQoVGhyZWFkc2FmZVN0YXRpY3MgLCAxLCAxLCAidGhyZWFkLXNhZmUgc3RhdGljIGluaXRpYWxpemVycyIpCitMQU5HT1BUKFBPU0lYVGhyZWFkcyAgICAgICwgMSwgMCwgIlBPU0lYIHRocmVhZCBzdXBwb3J0IikKK0xBTkdPUFQoQmxvY2tzICAgICAgICAgICAgLCAxLCAwLCAiYmxvY2tzIGV4dGVuc2lvbiB0byBDIikKK0JFTklHTl9MQU5HT1BUKEVtaXRBbGxEZWNscyAgICAgICwgMSwgMCwgImVtaXR0aW5nIGFsbCBkZWNsYXJhdGlvbnMiKQorTEFOR09QVChNYXRoRXJybm8gICAgICAgICAsIDEsIDEsICJlcnJubyBpbiBtYXRoIGZ1bmN0aW9ucyIpCitCRU5JR05fTEFOR09QVChIZWlub3VzRXh0ZW5zaW9ucyAsIDEsIDAsICJleHRlbnNpb25zIHRoYXQgd2UgcmVhbGx5IGRvbid0IGxpa2UgYW5kIG1heSBiZSByaXBwZWQgb3V0IGF0IGFueSB0aW1lIikKK0xBTkdPUFQoTW9kdWxlcyAgICAgICAgICAgLCAxLCAwLCAibW9kdWxlcyBleHRlbnNpb24gdG8gQyIpCitDT01QQVRJQkxFX0xBTkdPUFQoTW9kdWxlc1RTICAsIDEsIDAsICJDKysgTW9kdWxlcyBUUyIpCitCRU5JR05fRU5VTV9MQU5HT1BUKENvbXBpbGluZ01vZHVsZSwgQ29tcGlsaW5nTW9kdWxlS2luZCwgMiwgQ01LX05vbmUsCisgICAgICAgICAgICAgICAgICAgICJjb21waWxpbmcgYSBtb2R1bGUgaW50ZXJmYWNlIikKK0JFTklHTl9MQU5HT1BUKENvbXBpbGluZ1BDSCwgMSwgMCwgImJ1aWxkaW5nIGEgcGNoIikKK0NPTVBBVElCTEVfTEFOR09QVChNb2R1bGVzRGVjbFVzZSAgICAsIDEsIDAsICJyZXF1aXJlIGRlY2xhcmF0aW9uIG9mIG1vZHVsZSB1c2VzIikKK0JFTklHTl9MQU5HT1BUKE1vZHVsZXNTZWFyY2hBbGwgICwgMSwgMSwgInNlYXJjaGluZyBldmVuIG5vbi1pbXBvcnRlZCBtb2R1bGVzIHRvIGZpbmQgdW5yZXNvbHZlZCByZWZlcmVuY2VzIikKK0NPTVBBVElCTEVfTEFOR09QVChNb2R1bGVzU3RyaWN0RGVjbFVzZSwgMSwgMCwgInJlcXVpcmluZyBkZWNsYXJhdGlvbiBvZiBtb2R1bGUgdXNlcyBhbmQgYWxsIGhlYWRlcnMgdG8gYmUgaW4gbW9kdWxlcyIpCitCRU5JR05fTEFOR09QVChNb2R1bGVzRXJyb3JSZWNvdmVyeSwgMSwgMSwgImF1dG9tYXRpY2FsbHkgaW1wb3J0aW5nIG1vZHVsZXMgYXMgbmVlZGVkIHdoZW4gcGVyZm9ybWluZyBlcnJvciByZWNvdmVyeSIpCitCRU5JR05fTEFOR09QVChJbXBsaWNpdE1vZHVsZXMsIDEsIDEsICJidWlsZGluZyBtb2R1bGVzIHRoYXQgYXJlIG5vdCBzcGVjaWZpZWQgdmlhIC1mbW9kdWxlLWZpbGUiKQorQ09NUEFUSUJMRV9MQU5HT1BUKE1vZHVsZXNMb2NhbFZpc2liaWxpdHksIDEsIDAsICJsb2NhbCBzdWJtb2R1bGUgdmlzaWJpbGl0eSIpCitDT01QQVRJQkxFX0xBTkdPUFQoT3B0aW1pemUgICAgICAgICAgLCAxLCAwLCAiX19PUFRJTUlaRV9fIHByZWRlZmluZWQgbWFjcm8iKQorQ09NUEFUSUJMRV9MQU5HT1BUKE9wdGltaXplU2l6ZSAgICAgICwgMSwgMCwgIl9fT1BUSU1JWkVfU0laRV9fIHByZWRlZmluZWQgbWFjcm8iKQorQ09NUEFUSUJMRV9MQU5HT1BUKFN0YXRpYyAgICAgICAgICAgICwgMSwgMCwgIl9fU1RBVElDX18gcHJlZGVmaW5lZCBtYWNybyAoYXMgb3Bwb3NlZCB0byBfX0RZTkFNSUNfXykiKQorVkFMVUVfTEFOR09QVChQYWNrU3RydWN0ICAsIDMyLCAwLAorICAgICAgICAgICAgICAiZGVmYXVsdCBzdHJ1Y3QgcGFja2luZyBtYXhpbXVtIGFsaWdubWVudCIpCitWQUxVRV9MQU5HT1BUKE1heFR5cGVBbGlnbiAgLCAzMiwgMCwKKyAgICAgICAgICAgICAgImRlZmF1bHQgbWF4aW11bSBhbGlnbm1lbnQgZm9yIHR5cGVzIikKK1ZBTFVFX0xBTkdPUFQoQWxpZ25Eb3VibGUgICAgICAgICAgICAsIDEsIDAsICJDb250cm9scyBpZiBkb3VibGVzIHNob3VsZCBiZSBhbGlnbmVkIHRvIDggYnl0ZXMgKHg4NiBvbmx5KSIpCitDT01QQVRJQkxFX1ZBTFVFX0xBTkdPUFQoUElDTGV2ZWwgICAgLCAyLCAwLCAiX19QSUNfXyBsZXZlbCIpCitDT01QQVRJQkxFX1ZBTFVFX0xBTkdPUFQoUElFICAgICAgICAgLCAxLCAwLCAiaXMgcGllIikKK0NPTVBBVElCTEVfTEFOR09QVChHTlVJbmxpbmUgICAgICAgICAsIDEsIDAsICJHTlUgaW5saW5lIHNlbWFudGljcyIpCitDT01QQVRJQkxFX0xBTkdPUFQoTm9JbmxpbmVEZWZpbmUgICAgLCAxLCAwLCAiX19OT19JTkxJTkVfXyBwcmVkZWZpbmVkIG1hY3JvIikKK0NPTVBBVElCTEVfTEFOR09QVChEZXByZWNhdGVkICAgICAgICAsIDEsIDAsICJfX0RFUFJFQ0FURUQgcHJlZGVmaW5lZCBtYWNybyIpCitDT01QQVRJQkxFX0xBTkdPUFQoRmFzdE1hdGggICAgICAgICAgLCAxLCAwLCAiZmFzdCBGUCBtYXRoIG9wdGltaXphdGlvbnMsIGFuZCBfX0ZBU1RfTUFUSF9fIHByZWRlZmluZWQgbWFjcm8iKQorQ09NUEFUSUJMRV9MQU5HT1BUKEZpbml0ZU1hdGhPbmx5ICAgICwgMSwgMCwgIl9fRklOSVRFX01BVEhfT05MWV9fIHByZWRlZmluZWQgbWFjcm8iKQorQ09NUEFUSUJMRV9MQU5HT1BUKFVuc2FmZUZQTWF0aCAgICAgICwgMSwgMCwgIlVuc2FmZSBGbG9hdGluZyBQb2ludCBNYXRoIikKKworQkVOSUdOX0xBTkdPUFQoT2JqQ0dDQml0bWFwUHJpbnQgLCAxLCAwLCAicHJpbnRpbmcgb2YgR0MncyBiaXRtYXAgbGF5b3V0IGZvciBfX3dlYWsvX19zdHJvbmcgaXZhcnMiKQorCitCRU5JR05fTEFOR09QVChBY2Nlc3NDb250cm9sICAgICAsIDEsIDEsICJDKysgYWNjZXNzIGNvbnRyb2wiKQorTEFOR09QVChDaGFySXNTaWduZWQgICAgICAsIDEsIDEsICJzaWduZWQgY2hhciIpCitMQU5HT1BUKFdDaGFyU2l6ZSAgICAgICAgICwgNCwgMCwgIndpZHRoIG9mIHdjaGFyX3QiKQorTEFOR09QVChXQ2hhcklzU2lnbmVkICAgICAgICAsIDEsIDAsICJzaWduZWQgb3IgdW5zaWduZWQgd2NoYXJfdCIpCitFTlVNX0xBTkdPUFQoTVNQb2ludGVyVG9NZW1iZXJSZXByZXNlbnRhdGlvbk1ldGhvZCwgUHJhZ21hTVNQb2ludGVyc1RvTWVtYmVyc0tpbmQsIDIsIFBQVE1LX0Jlc3RDYXNlLCAibWVtYmVyLXBvaW50ZXIgcmVwcmVzZW50YXRpb24gbWV0aG9kIikKK0VOVU1fTEFOR09QVChEZWZhdWx0Q2FsbGluZ0NvbnYsIERlZmF1bHRDYWxsaW5nQ29udmVudGlvbiwgMywgRENDX05vbmUsICJkZWZhdWx0IGNhbGxpbmcgY29udmVudGlvbiIpCisKK0xBTkdPUFQoU2hvcnRFbnVtcyAgICAgICAgLCAxLCAwLCAic2hvcnQgZW51bSB0eXBlcyIpCisKK0xBTkdPUFQoT3BlbkNMICAgICAgICAgICAgLCAxLCAwLCAiT3BlbkNMIikKK0xBTkdPUFQoT3BlbkNMVmVyc2lvbiAgICAgLCAzMiwgMCwgIk9wZW5DTCB2ZXJzaW9uIikKK0xBTkdPUFQoTmF0aXZlSGFsZlR5cGUgICAgLCAxLCAwLCAiTmF0aXZlIGhhbGYgdHlwZSBzdXBwb3J0IikKK0xBTkdPUFQoTmF0aXZlSGFsZkFyZ3NBbmRSZXR1cm5zLCAxLCAwLCAiTmF0aXZlIGhhbGYgYXJncyBhbmQgcmV0dXJucyIpCitMQU5HT1BUKEhhbGZBcmdzQW5kUmV0dXJucywgMSwgMCwgImhhbGYgYXJncyBhbmQgcmV0dXJucyIpCitMQU5HT1BUKENVREEgICAgICAgICAgICAgICwgMSwgMCwgIkNVREEiKQorTEFOR09QVChPcGVuTVAgICAgICAgICAgICAsIDMyLCAwLCAiT3Blbk1QIHN1cHBvcnQgYW5kIHZlcnNpb24gb2YgT3Blbk1QICgzMSwgNDAgb3IgNDUpIikKK0xBTkdPUFQoT3Blbk1QU2ltZCAgICAgICAgLCAxLCAwLCAiVXNlIFNJTUQgb25seSBPcGVuTVAgc3VwcG9ydC4iKQorTEFOR09QVChPcGVuTVBVc2VUTFMgICAgICAsIDEsIDAsICJVc2UgVExTIGZvciB0aHJlYWRwcml2YXRlcyBvciBydW50aW1lIGNhbGxzIikKK0xBTkdPUFQoT3Blbk1QSXNEZXZpY2UgICAgLCAxLCAwLCAiR2VuZXJhdGUgY29kZSBvbmx5IGZvciBPcGVuTVAgdGFyZ2V0IGRldmljZSIpCitMQU5HT1BUKE9wZW5NUENVREFNb2RlICAgICwgMSwgMCwgIkdlbmVyYXRlIGNvZGUgZm9yIE9wZW5NUCBwcmFnbWFzIGluIFNJTVQvU1BNRCBtb2RlIikKK0xBTkdPUFQoUmVuZGVyU2NyaXB0ICAgICAgLCAxLCAwLCAiUmVuZGVyU2NyaXB0IikKKworTEFOR09QVChDVURBSXNEZXZpY2UgICAgICAsIDEsIDAsICJjb21waWxpbmcgZm9yIENVREEgZGV2aWNlIikKK0xBTkdPUFQoQ1VEQUFsbG93VmFyaWFkaWNGdW5jdGlvbnMsIDEsIDAsICJhbGxvd2luZyB2YXJpYWRpYyBmdW5jdGlvbnMgaW4gQ1VEQSBkZXZpY2UgY29kZSIpCitMQU5HT1BUKENVREFIb3N0RGV2aWNlQ29uc3RleHByLCAxLCAxLCAidHJlYXRpbmcgdW5hdHRyaWJ1dGVkIGNvbnN0ZXhwciBmdW5jdGlvbnMgYXMgX19ob3N0X18gX19kZXZpY2VfXyIpCitMQU5HT1BUKENVREFEZXZpY2VGbHVzaERlbm9ybWFsc1RvWmVybywgMSwgMCwgImZsdXNoaW5nIGRlbm9ybWFscyB0byB6ZXJvIikKK0xBTkdPUFQoQ1VEQURldmljZUFwcHJveFRyYW5zY2VuZGVudGFscywgMSwgMCwgInVzaW5nIGFwcHJveGltYXRlIHRyYW5zY2VuZGVudGFsIGZ1bmN0aW9ucyIpCitMQU5HT1BUKENVREFSZWxvY2F0YWJsZURldmljZUNvZGUsIDEsIDAsICJnZW5lcmF0ZSByZWxvY2F0YWJsZSBkZXZpY2UgY29kZSIpCisKK0xBTkdPUFQoU2l6ZWREZWFsbG9jYXRpb24gLCAxLCAwLCAic2l6ZWQgZGVhbGxvY2F0aW9uIikKK0xBTkdPUFQoQWxpZ25lZEFsbG9jYXRpb24gLCAxLCAwLCAiYWxpZ25lZCBhbGxvY2F0aW9uIikKK0xBTkdPUFQoQWxpZ25lZEFsbG9jYXRpb25VbmF2YWlsYWJsZSwgMSwgMCwgImFsaWduZWQgYWxsb2NhdGlvbiBmdW5jdGlvbnMgYXJlIHVuYXZhaWxhYmxlIikKK0xBTkdPUFQoTmV3QWxpZ25PdmVycmlkZSAgLCAzMiwgMCwgIm1heGltdW0gYWxpZ25tZW50IGd1YXJhbnRlZWQgYnkgJzo6b3BlcmF0b3IgbmV3KHNpemVfdCknIikKK0xBTkdPUFQoQ29uY2VwdHNUUyAsIDEsIDAsICJlbmFibGUgQysrIEV4dGVuc2lvbnMgZm9yIENvbmNlcHRzIikKK0JFTklHTl9MQU5HT1BUKE1vZHVsZXNDb2RlZ2VuICwgMSwgMCwgIk1vZHVsZXMgY29kZSBnZW5lcmF0aW9uIikKK0JFTklHTl9MQU5HT1BUKE1vZHVsZXNEZWJ1Z0luZm8gLCAxLCAwLCAiTW9kdWxlcyBkZWJ1ZyBpbmZvIikKK0JFTklHTl9MQU5HT1BUKEVsaWRlQ29uc3RydWN0b3JzICwgMSwgMSwgIkMrKyBjb3B5IGNvbnN0cnVjdG9yIGVsaXNpb24iKQorQkVOSUdOX0xBTkdPUFQoRHVtcFJlY29yZExheW91dHMgLCAxLCAwLCAiZHVtcGluZyB0aGUgbGF5b3V0IG9mIElSZ2VuJ2QgcmVjb3JkcyIpCitCRU5JR05fTEFOR09QVChEdW1wUmVjb3JkTGF5b3V0c1NpbXBsZSAsIDEsIDAsICJkdW1waW5nIHRoZSBsYXlvdXQgb2YgSVJnZW4nZCByZWNvcmRzIGluIGEgc2ltcGxlIGZvcm0iKQorQkVOSUdOX0xBTkdPUFQoRHVtcFZUYWJsZUxheW91dHMgLCAxLCAwLCAiZHVtcGluZyB0aGUgbGF5b3V0cyBvZiBlbWl0dGVkIHZ0YWJsZXMiKQorTEFOR09QVChOb0NvbnN0YW50Q0ZTdHJpbmdzICwgMSwgMCwgIm5vIGNvbnN0YW50IENvcmVGb3VuZGF0aW9uIHN0cmluZ3MiKQorQkVOSUdOX0xBTkdPUFQoSW5saW5lVmlzaWJpbGl0eUhpZGRlbiAsIDEsIDAsICJoaWRkZW4gZGVmYXVsdCB2aXNpYmlsaXR5IGZvciBpbmxpbmUgQysrIG1ldGhvZHMiKQorQkVOSUdOX0xBTkdPUFQoUGFyc2VVbmtub3duQW55dHlwZSwgMSwgMCwgIl9fdW5rbm93bl9hbnl0eXBlIikKK0JFTklHTl9MQU5HT1BUKERlYnVnZ2VyU3VwcG9ydCAsIDEsIDAsICJkZWJ1Z2dlciBzdXBwb3J0IikKK0JFTklHTl9MQU5HT1BUKERlYnVnZ2VyQ2FzdFJlc3VsdFRvSWQsIDEsIDAsICJmb3IgJ3BvJyBpbiB0aGUgZGVidWdnZXIsIGNhc3QgdGhlIHJlc3VsdCB0byBpZCBpZiBpdCBpcyBvZiB1bmtub3duIHR5cGUiKQorQkVOSUdOX0xBTkdPUFQoRGVidWdnZXJPYmpDTGl0ZXJhbCAsIDEsIDAsICJkZWJ1Z2dlciBPYmplY3RpdmUtQyBsaXRlcmFscyBhbmQgc3Vic2NyaXB0aW5nIHN1cHBvcnQiKQorCitCRU5JR05fTEFOR09QVChTcGVsbENoZWNraW5nICwgMSwgMSwgInNwZWxsLWNoZWNraW5nIikKK0xBTkdPUFQoU2luZ2xlUHJlY2lzaW9uQ29uc3RhbnRzICwgMSwgMCwgInRyZWF0aW5nIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzIGFzIHNpbmdsZSBwcmVjaXNpb24gY29uc3RhbnRzIikKK0xBTkdPUFQoRmFzdFJlbGF4ZWRNYXRoICwgMSwgMCwgIk9wZW5DTCBmYXN0IHJlbGF4ZWQgbWF0aCIpCisvLy8gXGJyaWVmIEZQX0NPTlRSQUNUIG1vZGUgKG9uL29mZi9mYXN0KS4KK0VOVU1fTEFOR09QVChEZWZhdWx0RlBDb250cmFjdE1vZGUsIEZQQ29udHJhY3RNb2RlS2luZCwgMiwgRlBDX09mZiwgIkZQIGNvbnRyYWN0aW9uIHR5cGUiKQorTEFOR09QVChOb0JpdEZpZWxkVHlwZUFsaWduICwgMSwgMCwgImJpdC1maWVsZCB0eXBlIGFsaWdubWVudCIpCitMQU5HT1BUKEhleGFnb25RZHNwNkNvbXBhdCAsIDEsIDAsICJoZXhhZ29uLXFkc3A2IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkiKQorTEFOR09QVChPYmpDQXV0b1JlZkNvdW50ICwgMSwgMCwgIk9iamVjdGl2ZS1DIGF1dG9tYXRlZCByZWZlcmVuY2UgY291bnRpbmciKQorTEFOR09QVChPYmpDV2Vha1J1bnRpbWUgICAgICwgMSwgMCwgIl9fd2VhayBzdXBwb3J0IGluIHRoZSBBUkMgcnVudGltZSIpCitMQU5HT1BUKE9iakNXZWFrICAgICAgICAgICAgLCAxLCAwLCAiT2JqZWN0aXZlLUMgX193ZWFrIGluIEFSQyBhbmQgTVJDIGZpbGVzIikKK0xBTkdPUFQoT2JqQ1N1YnNjcmlwdGluZ0xlZ2FjeVJ1bnRpbWUgICAgICAgICAsIDEsIDAsICJTdWJzY3JpcHRpbmcgc3VwcG9ydCBpbiBsZWdhY3kgT2JqZWN0aXZlQyBydW50aW1lIikKK0xBTkdPUFQoQ0ZQcm90ZWN0aW9uQnJhbmNoICwgMSwgMCwgIkNvbnRyb2wtRmxvdyBCcmFuY2ggUHJvdGVjdGlvbiBlbmFibGVkIikKK0xBTkdPUFQoRmFrZUFkZHJlc3NTcGFjZU1hcCAsIDEsIDAsICJPcGVuQ0wgZmFrZSBhZGRyZXNzIHNwYWNlIG1hcCIpCitFTlVNX0xBTkdPUFQoQWRkcmVzc1NwYWNlTWFwTWFuZ2xpbmcgLCBBZGRyU3BhY2VNYXBNYW5nbGluZywgMiwgQVNNTV9UYXJnZXQsICJPcGVuQ0wgYWRkcmVzcyBzcGFjZSBtYXAgbWFuZ2xpbmcgbW9kZSIpCitMQU5HT1BUKEluY2x1ZGVEZWZhdWx0SGVhZGVyLCAxLCAwLCAiSW5jbHVkZSBkZWZhdWx0IGhlYWRlciBmaWxlIGZvciBPcGVuQ0wiKQorQkVOSUdOX0xBTkdPUFQoRGVsYXllZFRlbXBsYXRlUGFyc2luZyAsIDEsIDAsICJkZWxheWVkIHRlbXBsYXRlIHBhcnNpbmciKQorTEFOR09QVChCbG9ja3NSdW50aW1lT3B0aW9uYWwgLCAxLCAwLCAib3B0aW9uYWwgYmxvY2tzIHJ1bnRpbWUiKQorCitFTlVNX0xBTkdPUFQoR0MsIEdDTW9kZSwgMiwgTm9uR0MsICJPYmplY3RpdmUtQyBHYXJiYWdlIENvbGxlY3Rpb24gbW9kZSIpCitFTlVNX0xBTkdPUFQoVmFsdWVWaXNpYmlsaXR5TW9kZSwgVmlzaWJpbGl0eSwgMywgRGVmYXVsdFZpc2liaWxpdHksCisgICAgICAgICAgICAgInZhbHVlIHN5bWJvbCB2aXNpYmlsaXR5IikKK0VOVU1fTEFOR09QVChUeXBlVmlzaWJpbGl0eU1vZGUsIFZpc2liaWxpdHksIDMsIERlZmF1bHRWaXNpYmlsaXR5LAorICAgICAgICAgICAgICJ0eXBlIHN5bWJvbCB2aXNpYmlsaXR5IikKK0VOVU1fTEFOR09QVChTdGFja1Byb3RlY3RvciwgU3RhY2tQcm90ZWN0b3JNb2RlLCAyLCBTU1BPZmYsCisgICAgICAgICAgICAgInN0YWNrIHByb3RlY3RvciBtb2RlIikKK0VOVU1fTEFOR09QVChTaWduZWRPdmVyZmxvd0JlaGF2aW9yLCBTaWduZWRPdmVyZmxvd0JlaGF2aW9yVHksIDIsIFNPQl9VbmRlZmluZWQsCisgICAgICAgICAgICAgInNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93IGhhbmRsaW5nIikKKworQkVOSUdOX0xBTkdPUFQoQXJyb3dEZXB0aCwgMzIsIDI1NiwKKyAgICAgICAgICAgICAgICJtYXhpbXVtIG51bWJlciBvZiBvcGVyYXRvci0+cyB0byBmb2xsb3ciKQorQkVOSUdOX0xBTkdPUFQoSW5zdGFudGlhdGlvbkRlcHRoLCAzMiwgMTAyNCwKKyAgICAgICAgICAgICAgICJtYXhpbXVtIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gZGVwdGgiKQorQkVOSUdOX0xBTkdPUFQoQ29uc3RleHByQ2FsbERlcHRoLCAzMiwgNTEyLAorICAgICAgICAgICAgICAgIm1heGltdW0gY29uc3RleHByIGNhbGwgZGVwdGgiKQorQkVOSUdOX0xBTkdPUFQoQ29uc3RleHByU3RlcExpbWl0LCAzMiwgMTA0ODU3NiwKKyAgICAgICAgICAgICAgICJtYXhpbXVtIGNvbnN0ZXhwciBldmFsdWF0aW9uIHN0ZXBzIikKK0JFTklHTl9MQU5HT1BUKEJyYWNrZXREZXB0aCwgMzIsIDI1NiwKKyAgICAgICAgICAgICAgICJtYXhpbXVtIGJyYWNrZXQgbmVzdGluZyBkZXB0aCIpCitCRU5JR05fTEFOR09QVChOdW1MYXJnZUJ5VmFsdWVDb3B5LCAzMiwgMCwKKyAgICAgICAgImlmIG5vbi16ZXJvLCB3YXJuIGFib3V0IHBhcmFtZXRlciBvciByZXR1cm4gV2FybiBpZiBwYXJhbWV0ZXIvcmV0dXJuIHZhbHVlIGlzIGxhcmdlciBpbiBieXRlcyB0aGFuIHRoaXMgc2V0dGluZy4gMCBpcyBubyBjaGVjay4iKQorVkFMVUVfTEFOR09QVChNU0NvbXBhdGliaWxpdHlWZXJzaW9uLCAzMiwgMCwgIk1pY3Jvc29mdCBWaXN1YWwgQy9DKysgVmVyc2lvbiIpCitWQUxVRV9MQU5HT1BUKFZ0b3JEaXNwTW9kZSwgMiwgMSwgIkhvdyBtYW55IHZ0b3JkaXNwcyB0byBpbnNlcnQiKQorCitMQU5HT1BUKEFwcGxlUHJhZ21hUGFjaywgMSwgMCwgIkFwcGxlIGdjYy1jb21wYXRpYmxlICNwcmFnbWEgcGFjayBoYW5kbGluZyIpCisKK0xBTkdPUFQoUmV0YWluQ29tbWVudHNGcm9tU3lzdGVtSGVhZGVycywgMSwgMCwgInJldGFpbiBkb2N1bWVudGF0aW9uIGNvbW1lbnRzIGZyb20gc3lzdGVtIGhlYWRlcnMgaW4gdGhlIEFTVCIpCisKK0xBTkdPUFQoU2FuaXRpemVBZGRyZXNzRmllbGRQYWRkaW5nLCAyLCAwLCAiY29udHJvbHMgaG93IGFnZ3Jlc3NpdmUgaXMgQVNhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkIHBhZGRpbmcgKDA6IG5vbmUsIDE6bGVhc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZ2dyZXNzaXZlLCAyOiBtb3JlIGFnZ3Jlc3NpdmUpIikKKworTEFOR09QVChYUmF5SW5zdHJ1bWVudCwgMSwgMCwgImNvbnRyb2xzIHdoZXRoZXIgdG8gZG8gWFJheSBpbnN0cnVtZW50YXRpb24iKQorTEFOR09QVChYUmF5QWx3YXlzRW1pdEN1c3RvbUV2ZW50cywgMSwgMCwKKyAgICAgICAgImNvbnRyb2xzIHdoZXRoZXIgdG8gYWx3YXlzIGVtaXQgaW50cmluc2ljIGNhbGxzIHRvICIKKyAgICAgICAgIl9feHJheV9jdXN0b21ldmVudCguLi4pIGJ1aWx0aW4uIikKKworQkVOSUdOX0xBTkdPUFQoQWxsb3dFZGl0b3JQbGFjZWhvbGRlcnMsIDEsIDAsCisgICAgICAgICAgICAgICAiYWxsb3cgZWRpdG9yIHBsYWNlaG9sZGVycyBpbiBzb3VyY2UiKQorCitFTlVNX0xBTkdPUFQoQ2xhbmdBQklDb21wYXQsIENsYW5nQUJJLCA0LCBDbGFuZ0FCSTo6TGF0ZXN0LAorICAgICAgICAgICAgICJ2ZXJzaW9uIG9mIENsYW5nIHRoYXQgd2Ugc2hvdWxkIGF0dGVtcHQgdG8gYmUgQUJJLWNvbXBhdGlibGUgIgorICAgICAgICAgICAgICJ3aXRoIikKKworI3VuZGVmIExBTkdPUFQKKyN1bmRlZiBDT01QQVRJQkxFX0xBTkdPUFQKKyN1bmRlZiBCRU5JR05fTEFOR09QVAorI3VuZGVmIEVOVU1fTEFOR09QVAorI3VuZGVmIENPTVBBVElCTEVfRU5VTV9MQU5HT1BUCisjdW5kZWYgQkVOSUdOX0VOVU1fTEFOR09QVAorI3VuZGVmIFZBTFVFX0xBTkdPUFQKKyN1bmRlZiBDT01QQVRJQkxFX1ZBTFVFX0xBTkdPUFQKKyN1bmRlZiBCRU5JR05fVkFMVUVfTEFOR09QVAorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9MYW5nT3B0aW9ucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDhjY2M2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuaApAQCAtMCwwICsxLDI5OCBAQAorLy89PT0tIExhbmdPcHRpb25zLmggLSBDIExhbmd1YWdlIEZhbWlseSBMYW5ndWFnZSBPcHRpb25zIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgY2xhbmc6OkxhbmdPcHRpb25zIGludGVyZmFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfTEFOR09QVElPTlNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX0xBTkdPUFRJT05TX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0NvbW1lbnRPcHRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09iakNSdW50aW1lLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU2FuaXRpemVycy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Zpc2liaWxpdHkuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworCisvLy8gQml0ZmllbGRzIG9mIExhbmdPcHRpb25zLCBzcGxpdCBvdXQgZnJvbSBMYW5nT3B0aW9ucyBpbiBvcmRlciB0byBlbnN1cmUgdGhhdAorLy8vIHRoaXMgbGFyZ2UgY29sbGVjdGlvbiBvZiBiaXRmaWVsZHMgaXMgYSB0cml2aWFsIGNsYXNzIHR5cGUuCitjbGFzcyBMYW5nT3B0aW9uc0Jhc2UgeworcHVibGljOgorICAvLyBEZWZpbmUgc2ltcGxlIGxhbmd1YWdlIG9wdGlvbnMgKHdpdGggbm8gYWNjZXNzb3JzKS4KKyNkZWZpbmUgTEFOR09QVChOYW1lLCBCaXRzLCBEZWZhdWx0LCBEZXNjcmlwdGlvbikgdW5zaWduZWQgTmFtZSA6IEJpdHM7CisjZGVmaW5lIEVOVU1fTEFOR09QVChOYW1lLCBUeXBlLCBCaXRzLCBEZWZhdWx0LCBEZXNjcmlwdGlvbikKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MYW5nT3B0aW9ucy5kZWYiCisKK3Byb3RlY3RlZDoKKyAgLy8gRGVmaW5lIGxhbmd1YWdlIG9wdGlvbnMgb2YgZW51bWVyYXRpb24gdHlwZS4gVGhlc2UgYXJlIHByaXZhdGUsIGFuZCB3aWxsCisgIC8vIGhhdmUgYWNjZXNzb3JzIChiZWxvdykuCisjZGVmaW5lIExBTkdPUFQoTmFtZSwgQml0cywgRGVmYXVsdCwgRGVzY3JpcHRpb24pCisjZGVmaW5lIEVOVU1fTEFOR09QVChOYW1lLCBUeXBlLCBCaXRzLCBEZWZhdWx0LCBEZXNjcmlwdGlvbikgXAorICB1bnNpZ25lZCBOYW1lIDogQml0czsKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MYW5nT3B0aW9ucy5kZWYiCit9OworCisvLy8gXGJyaWVmIEtlZXBzIHRyYWNrIG9mIHRoZSB2YXJpb3VzIG9wdGlvbnMgdGhhdCBjYW4gYmUKKy8vLyBlbmFibGVkLCB3aGljaCBjb250cm9scyB0aGUgZGlhbGVjdCBvZiBDIG9yIEMrKyB0aGF0IGlzIGFjY2VwdGVkLgorY2xhc3MgTGFuZ09wdGlvbnMgOiBwdWJsaWMgTGFuZ09wdGlvbnNCYXNlIHsKK3B1YmxpYzoKKyAgdXNpbmcgVmlzaWJpbGl0eSA9IGNsYW5nOjpWaXNpYmlsaXR5OworICAKKyAgZW51bSBHQ01vZGUgeyBOb25HQywgR0NPbmx5LCBIeWJyaWRHQyB9OworICBlbnVtIFN0YWNrUHJvdGVjdG9yTW9kZSB7IFNTUE9mZiwgU1NQT24sIFNTUFN0cm9uZywgU1NQUmVxIH07CisgIAorICBlbnVtIFNpZ25lZE92ZXJmbG93QmVoYXZpb3JUeSB7CisgICAgLy8gRGVmYXVsdCBDIHN0YW5kYXJkIGJlaGF2aW9yLgorICAgIFNPQl9VbmRlZmluZWQsCisKKyAgICAvLyAtZndyYXB2CisgICAgU09CX0RlZmluZWQsCisKKyAgICAvLyAtZnRyYXB2CisgICAgU09CX1RyYXBwaW5nCisgIH07CisKKyAgLy8gRklYTUU6IFVuaWZ5IHdpdGggVFVLaW5kLgorICBlbnVtIENvbXBpbGluZ01vZHVsZUtpbmQgeworICAgIC8vLyBOb3QgY29tcGlsaW5nIGEgbW9kdWxlIGludGVyZmFjZSBhdCBhbGwuCisgICAgQ01LX05vbmUsCisKKyAgICAvLy8gQ29tcGlsaW5nIGEgbW9kdWxlIGZyb20gYSBtb2R1bGUgbWFwLgorICAgIENNS19Nb2R1bGVNYXAsCisKKyAgICAvLy8gQ29tcGlsaW5nIGEgQysrIG1vZHVsZXMgVFMgbW9kdWxlIGludGVyZmFjZSB1bml0LgorICAgIENNS19Nb2R1bGVJbnRlcmZhY2UKKyAgfTsKKworICBlbnVtIFByYWdtYU1TUG9pbnRlcnNUb01lbWJlcnNLaW5kIHsKKyAgICBQUFRNS19CZXN0Q2FzZSwKKyAgICBQUFRNS19GdWxsR2VuZXJhbGl0eVNpbmdsZUluaGVyaXRhbmNlLAorICAgIFBQVE1LX0Z1bGxHZW5lcmFsaXR5TXVsdGlwbGVJbmhlcml0YW5jZSwKKyAgICBQUFRNS19GdWxsR2VuZXJhbGl0eVZpcnR1YWxJbmhlcml0YW5jZQorICB9OworCisgIGVudW0gRGVmYXVsdENhbGxpbmdDb252ZW50aW9uIHsKKyAgICBEQ0NfTm9uZSwKKyAgICBEQ0NfQ0RlY2wsCisgICAgRENDX0Zhc3RDYWxsLAorICAgIERDQ19TdGRDYWxsLAorICAgIERDQ19WZWN0b3JDYWxsLAorICAgIERDQ19SZWdDYWxsCisgIH07CisKKyAgZW51bSBBZGRyU3BhY2VNYXBNYW5nbGluZyB7IEFTTU1fVGFyZ2V0LCBBU01NX09uLCBBU01NX09mZiB9OworCisgIGVudW0gTVNWQ01ham9yVmVyc2lvbiB7CisgICAgTVNWQzIwMTAgPSAxNiwKKyAgICBNU1ZDMjAxMiA9IDE3LAorICAgIE1TVkMyMDEzID0gMTgsCisgICAgTVNWQzIwMTUgPSAxOQorICB9OworCisgIC8vLyBDbGFuZyB2ZXJzaW9ucyB3aXRoIGRpZmZlcmVudCBwbGF0Zm9ybSBBQkkgY29uZm9ybWFuY2UuCisgIGVudW0gY2xhc3MgQ2xhbmdBQkkgeworICAgIC8vLyBBdHRlbXB0IHRvIGJlIEFCSS1jb21wYXRpYmxlIHdpdGggY29kZSBnZW5lcmF0ZWQgYnkgQ2xhbmcgMy44LngKKyAgICAvLy8gKFNWTiByMjU3NjI2KS4gVGhpcyBjYXVzZXMgPDEgeCBsb25nIGxvbmc+IHRvIGJlIHBhc3NlZCBpbiBhbgorICAgIC8vLyBpbnRlZ2VyIHJlZ2lzdGVyIGluc3RlYWQgb2YgYW4gU1NFIHJlZ2lzdGVyIG9uIHg2NF82NC4KKyAgICBWZXIzXzgsCisKKyAgICAvLy8gQXR0ZW1wdCB0byBiZSBBQkktY29tcGF0aWJsZSB3aXRoIGNvZGUgZ2VuZXJhdGVkIGJ5IENsYW5nIDQuMC54CisgICAgLy8vIChTVk4gcjI5MTgxNCkuIFRoaXMgY2F1c2VzIG1vdmUgb3BlcmF0aW9ucyB0byBiZSBpZ25vcmVkIHdoZW4KKyAgICAvLy8gZGV0ZXJtaW5pbmcgd2hldGhlciBhIGNsYXNzIHR5cGUgY2FuIGJlIHBhc3NlZCBvciByZXR1cm5lZCBkaXJlY3RseS4KKyAgICBWZXI0LAorCisgICAgLy8vIENvbmZvcm0gdG8gdGhlIHVuZGVybHlpbmcgcGxhdGZvcm0ncyBDIGFuZCBDKysgQUJJcyBhcyBjbG9zZWx5CisgICAgLy8vIGFzIHdlIGNhbi4KKyAgICBMYXRlc3QKKyAgfTsKKworICBlbnVtIEZQQ29udHJhY3RNb2RlS2luZCB7CisgICAgLy8gRm9ybSBmdXNlZCBGUCBvcHMgb25seSB3aGVyZSByZXN1bHQgd2lsbCBub3QgYmUgYWZmZWN0ZWQuCisgICAgRlBDX09mZiwKKworICAgIC8vIEZvcm0gZnVzZWQgRlAgb3BzIGFjY29yZGluZyB0byBGUF9DT05UUkFDVCBydWxlcy4KKyAgICBGUENfT24sCisKKyAgICAvLyBBZ2dyZXNzaXZlbHkgZnVzZSBGUCBvcHMgKEUuZy4gRk1BKS4KKyAgICBGUENfRmFzdAorICB9OworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgU2V0IG9mIGVuYWJsZWQgc2FuaXRpemVycy4KKyAgU2FuaXRpemVyU2V0IFNhbml0aXplOworCisgIC8vLyBcYnJpZWYgUGF0aHMgdG8gYmxhY2tsaXN0IGZpbGVzIHNwZWNpZnlpbmcgd2hpY2ggb2JqZWN0cworICAvLy8gKGZpbGVzLCBmdW5jdGlvbnMsIHZhcmlhYmxlcykgc2hvdWxkIG5vdCBiZSBpbnN0cnVtZW50ZWQuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBTYW5pdGl6ZXJCbGFja2xpc3RGaWxlczsKKworICAvLy8gXGJyaWVmIFBhdGhzIHRvIHRoZSBYUmF5ICJhbHdheXMgaW5zdHJ1bWVudCIgZmlsZXMgc3BlY2lmeWluZyB3aGljaAorICAvLy8gb2JqZWN0cyAoZmlsZXMsIGZ1bmN0aW9ucywgdmFyaWFibGVzKSBzaG91bGQgYmUgaW1idWVkIHdpdGggdGhlIFhSYXkKKyAgLy8vICJhbHdheXMgaW5zdHJ1bWVudCIgYXR0cmlidXRlLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gWFJheUFsd2F5c0luc3RydW1lbnRGaWxlczsKKworICAvLy8gXGJyaWVmIFBhdGhzIHRvIHRoZSBYUmF5ICJuZXZlciBpbnN0cnVtZW50IiBmaWxlcyBzcGVjaWZ5aW5nIHdoaWNoCisgIC8vLyBvYmplY3RzIChmaWxlcywgZnVuY3Rpb25zLCB2YXJpYWJsZXMpIHNob3VsZCBiZSBpbWJ1ZWQgd2l0aCB0aGUgWFJheQorICAvLy8gIm5ldmVyIGluc3RydW1lbnQiIGF0dHJpYnV0ZS4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFhSYXlOZXZlckluc3RydW1lbnRGaWxlczsKKworICBjbGFuZzo6T2JqQ1J1bnRpbWUgT2JqQ1J1bnRpbWU7CisKKyAgc3RkOjpzdHJpbmcgT2JqQ0NvbnN0YW50U3RyaW5nQ2xhc3M7CisgIAorICAvLy8gXGJyaWVmIFRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIC1mdHJhcHYgaXMKKyAgLy8vIHNwZWNpZmllZC4KKyAgLy8vCisgIC8vLyBJZiBub25lIGlzIHNwZWNpZmllZCwgYWJvcnQgKEdDQy1jb21wYXRpYmxlIGJlaGF2aW91cikuCisgIHN0ZDo6c3RyaW5nIE92ZXJmbG93SGFuZGxlcjsKKworICAvLy8gVGhlIG1vZHVsZSBjdXJyZW50bHkgYmVpbmcgY29tcGlsZWQgYXMgc3BlZmljaWVkIGJ5IC1mbW9kdWxlLW5hbWUuCisgIHN0ZDo6c3RyaW5nIE1vZHVsZU5hbWU7CisKKyAgLy8vIFxicmllZiBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBtb2R1bGUsIG9mIHdoaWNoIHRoZSBtYWluIHNvdXJjZSBmaWxlCisgIC8vLyBpcyBhIHBhcnQuIElmIENvbXBpbGluZ01vZHVsZSBpcyBzZXQsIHdlIGFyZSBjb21waWxpbmcgdGhlIGludGVyZmFjZQorICAvLy8gb2YgdGhpcyBtb2R1bGUsIG90aGVyd2lzZSB3ZSBhcmUgY29tcGlsaW5nIGFuIGltcGxlbWVudGF0aW9uIGZpbGUgb2YKKyAgLy8vIGl0LiBUaGlzIHN0YXJ0cyBhcyBNb2R1bGVOYW1lIGluIGNhc2UgLWZtb2R1bGUtbmFtZSBpcyBwcm92aWRlZCBhbmQKKyAgLy8vIGNoYW5nZXMgZHVyaW5nIGNvbXBpbGF0aW9uIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgbW9kdWxlLgorICBzdGQ6OnN0cmluZyBDdXJyZW50TW9kdWxlOworCisgIC8vLyBcYnJpZWYgVGhlIG5hbWVzIG9mIGFueSBmZWF0dXJlcyB0byBlbmFibGUgaW4gbW9kdWxlICdyZXF1aXJlcycgZGVjbHMKKyAgLy8vIGluIGFkZGl0aW9uIHRvIHRoZSBoYXJkLWNvZGVkIGxpc3QgaW4gTW9kdWxlLmNwcCBhbmQgdGhlIHRhcmdldCBmZWF0dXJlcy4KKyAgLy8vCisgIC8vLyBUaGlzIGxpc3QgaXMgc29ydGVkLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTW9kdWxlRmVhdHVyZXM7CisKKyAgLy8vIFxicmllZiBPcHRpb25zIGZvciBwYXJzaW5nIGNvbW1lbnRzLgorICBDb21tZW50T3B0aW9ucyBDb21tZW50T3B0czsKKworICAvLy8gXGJyaWVmIEEgbGlzdCBvZiBhbGwgLWZuby1idWlsdGluLSogZnVuY3Rpb24gbmFtZXMgKGUuZy4sIG1lbXNldCkuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBOb0J1aWx0aW5GdW5jczsKKworICAvLy8gXGJyaWVmIFRyaXBsZXMgb2YgdGhlIE9wZW5NUCB0YXJnZXRzIHRoYXQgdGhlIGhvc3QgY29kZSBjb2RlZ2VuIHNob3VsZAorICAvLy8gdGFrZSBpbnRvIGFjY291bnQgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgYWNjdXJhdGUgb2ZmbG9hZGluZyBkZXNjcmlwdG9ycy4KKyAgc3RkOjp2ZWN0b3I8bGx2bTo6VHJpcGxlPiBPTVBUYXJnZXRUcmlwbGVzOworCisgIC8vLyBcYnJpZWYgTmFtZSBvZiB0aGUgSVIgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIE9wZW5NUCB0YXJnZXQKKyAgLy8vIGhvc3QgY29kZSBnZW5lcmF0aW9uLgorICBzdGQ6OnN0cmluZyBPTVBIb3N0SVJGaWxlOworCisgIC8vLyBcYnJpZWYgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZyb250LWVuZCBpcyBleHBsaWNpdGx5IHRvbGQgdGhhdCB0aGUKKyAgLy8vIGlucHV0IGlzIGEgaGVhZGVyIGZpbGUgKGkuZS4gLXggYy1oZWFkZXIpLgorICBib29sIElzSGVhZGVyRmlsZSA9IGZhbHNlOworCisgIExhbmdPcHRpb25zKCk7CisKKyAgLy8gRGVmaW5lIGFjY2Vzc29ycy9tdXRhdG9ycyBmb3IgbGFuZ3VhZ2Ugb3B0aW9ucyBvZiBlbnVtZXJhdGlvbiB0eXBlLgorI2RlZmluZSBMQU5HT1BUKE5hbWUsIEJpdHMsIERlZmF1bHQsIERlc2NyaXB0aW9uKSAKKyNkZWZpbmUgRU5VTV9MQU5HT1BUKE5hbWUsIFR5cGUsIEJpdHMsIERlZmF1bHQsIERlc2NyaXB0aW9uKSBcCisgIFR5cGUgZ2V0IyNOYW1lKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZT4oTmFtZSk7IH0gXAorICB2b2lkIHNldCMjTmFtZShUeXBlIFZhbHVlKSB7IE5hbWUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oVmFsdWUpOyB9ICAKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MYW5nT3B0aW9ucy5kZWYiCisKKyAgLy8vIEFyZSB3ZSBjb21waWxpbmcgYSBtb2R1bGUgaW50ZXJmYWNlICguY3BwbSBvciBtb2R1bGUgbWFwKT8KKyAgYm9vbCBpc0NvbXBpbGluZ01vZHVsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Q29tcGlsaW5nTW9kdWxlKCkgIT0gQ01LX05vbmU7CisgIH0KKworICAvLy8gRG8gd2UgbmVlZCB0byB0cmFjayB0aGUgb3duaW5nIG1vZHVsZSBmb3IgYSBsb2NhbCBkZWNsYXJhdGlvbj8KKyAgYm9vbCB0cmFja0xvY2FsT3duaW5nTW9kdWxlKCkgY29uc3QgeworICAgIHJldHVybiBpc0NvbXBpbGluZ01vZHVsZSgpIHx8IE1vZHVsZXNMb2NhbFZpc2liaWxpdHkgfHwgTW9kdWxlc1RTOworICB9CisKKyAgYm9vbCBpc1NpZ25lZE92ZXJmbG93RGVmaW5lZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U2lnbmVkT3ZlcmZsb3dCZWhhdmlvcigpID09IFNPQl9EZWZpbmVkOworICB9CisgIAorICBib29sIGlzU3Vic2NyaXB0UG9pbnRlckFyaXRobWV0aWMoKSBjb25zdCB7CisgICAgcmV0dXJuIE9iakNSdW50aW1lLmlzU3Vic2NyaXB0UG9pbnRlckFyaXRobWV0aWMoKSAmJgorICAgICAgICAgICAhT2JqQ1N1YnNjcmlwdGluZ0xlZ2FjeVJ1bnRpbWU7CisgIH0KKworICBib29sIGlzQ29tcGF0aWJsZVdpdGhNU1ZDKE1TVkNNYWpvclZlcnNpb24gTWFqb3JWZXJzaW9uKSBjb25zdCB7CisgICAgcmV0dXJuIE1TQ29tcGF0aWJpbGl0eVZlcnNpb24gPj0gTWFqb3JWZXJzaW9uICogMTAwMDAwMDBVOworICB9CisKKyAgLy8vIFxicmllZiBSZXNldCBhbGwgb2YgdGhlIG9wdGlvbnMgdGhhdCBhcmUgbm90IGNvbnNpZGVyZWQgd2hlbiBidWlsZGluZyBhCisgIC8vLyBtb2R1bGUuCisgIHZvaWQgcmVzZXROb25Nb2R1bGFyT3B0aW9ucygpOworCisgIC8vLyBcYnJpZWYgSXMgdGhpcyBhIGxpYmMvbGlibSBmdW5jdGlvbiB0aGF0IGlzIG5vIGxvbmdlciByZWNvZ25pemVkIGFzIGEKKyAgLy8vIGJ1aWx0aW4gYmVjYXVzZSBhIC1mbm8tYnVpbHRpbi0qIG9wdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQ/CisgIGJvb2wgaXNOb0J1aWx0aW5GdW5jKFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgYW55IE9iakMgdHlwZXMgbWF5IGhhdmUgbm9uLXRyaXZpYWwgbGlmZXRpbWUgcXVhbGlmaWVycy4KKyAgYm9vbCBhbGxvd3NOb25Ucml2aWFsT2JqQ0xpZmV0aW1lUXVhbGlmaWVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gT2JqQ0F1dG9SZWZDb3VudCB8fCBPYmpDV2VhazsKKyAgfQorCisgIGJvb2wgYXNzdW1lRnVuY3Rpb25zQXJlQ29udmVyZ2VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKENVREEgJiYgQ1VEQUlzRGV2aWNlKSB8fCBPcGVuQ0w7CisgIH0KK307CisKKy8vLyBcYnJpZWYgRmxvYXRpbmcgcG9pbnQgY29udHJvbCBvcHRpb25zCitjbGFzcyBGUE9wdGlvbnMgeworcHVibGljOgorICBGUE9wdGlvbnMoKSA6IGZwX2NvbnRyYWN0KExhbmdPcHRpb25zOjpGUENfT2ZmKSB7fQorCisgIC8vIFVzZWQgZm9yIHNlcmlhbGl6aW5nLgorICBleHBsaWNpdCBGUE9wdGlvbnModW5zaWduZWQgSSkKKyAgICAgIDogZnBfY29udHJhY3Qoc3RhdGljX2Nhc3Q8TGFuZ09wdGlvbnM6OkZQQ29udHJhY3RNb2RlS2luZD4oSSkpIHt9CisKKyAgZXhwbGljaXQgRlBPcHRpb25zKGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykKKyAgICAgIDogZnBfY29udHJhY3QoTGFuZ09wdHMuZ2V0RGVmYXVsdEZQQ29udHJhY3RNb2RlKCkpIHt9CisKKyAgYm9vbCBhbGxvd0ZQQ29udHJhY3RXaXRoaW5TdGF0ZW1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGZwX2NvbnRyYWN0ID09IExhbmdPcHRpb25zOjpGUENfT247CisgIH0KKworICBib29sIGFsbG93RlBDb250cmFjdEFjcm9zc1N0YXRlbWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZnBfY29udHJhY3QgPT0gTGFuZ09wdGlvbnM6OkZQQ19GYXN0OworICB9CisKKyAgdm9pZCBzZXRBbGxvd0ZQQ29udHJhY3RXaXRoaW5TdGF0ZW1lbnQoKSB7CisgICAgZnBfY29udHJhY3QgPSBMYW5nT3B0aW9uczo6RlBDX09uOworICB9CisKKyAgdm9pZCBzZXRBbGxvd0ZQQ29udHJhY3RBY3Jvc3NTdGF0ZW1lbnQoKSB7CisgICAgZnBfY29udHJhY3QgPSBMYW5nT3B0aW9uczo6RlBDX0Zhc3Q7CisgIH0KKworICB2b2lkIHNldERpc2FsbG93RlBDb250cmFjdCgpIHsgZnBfY29udHJhY3QgPSBMYW5nT3B0aW9uczo6RlBDX09mZjsgfQorCisgIC8vLyBVc2VkIHRvIHNlcmlhbGl6ZSB0aGlzLgorICB1bnNpZ25lZCBnZXRJbnQoKSBjb25zdCB7IHJldHVybiBmcF9jb250cmFjdDsgfQorCitwcml2YXRlOgorICAvLy8gQWRqdXN0IEJpbmFyeU9wZXJhdG9yOjpGUEZlYXR1cmVzIHRvIG1hdGNoIHRoZSBiaXQtZmllbGQgc2l6ZSBvZiB0aGlzLgorICB1bnNpZ25lZCBmcF9jb250cmFjdCA6IDI7Cit9OworCisvLy8gXGJyaWVmIERlc2NyaWJlcyB0aGUga2luZCBvZiB0cmFuc2xhdGlvbiB1bml0IGJlaW5nIHByb2Nlc3NlZC4KK2VudW0gVHJhbnNsYXRpb25Vbml0S2luZCB7CisgIC8vLyBcYnJpZWYgVGhlIHRyYW5zbGF0aW9uIHVuaXQgaXMgYSBjb21wbGV0ZSB0cmFuc2xhdGlvbiB1bml0LgorICBUVV9Db21wbGV0ZSwKKworICAvLy8gXGJyaWVmIFRoZSB0cmFuc2xhdGlvbiB1bml0IGlzIGEgcHJlZml4IHRvIGEgdHJhbnNsYXRpb24gdW5pdCwgYW5kIGlzCisgIC8vLyBub3QgY29tcGxldGUuCisgIFRVX1ByZWZpeCwKKworICAvLy8gXGJyaWVmIFRoZSB0cmFuc2xhdGlvbiB1bml0IGlzIGEgbW9kdWxlLgorICBUVV9Nb2R1bGUKK307CisgIAorfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQkFTSUNfTEFOR09QVElPTlNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvTGlua2FnZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvTGlua2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZjFkMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9MaW5rYWdlLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8vPT09LSBMaW5rYWdlLmggLSBMaW5rYWdlIGVudW1lcmF0aW9uIGFuZCB1dGlsaXRpZXMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgdGhlIExpbmthZ2UgZW51bWVyYXRpb24gYW5kIHZhcmlvdXMgdXRpbGl0eSBmdW5jdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX0xJTktBR0VfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX0xJTktBR0VfSAorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIGRpZmZlcmVudCBraW5kcyBvZiBsaW5rYWdlIAorLy8vIChDKysgW2Jhc2ljLmxpbmtdLCBDOTkgNi4yLjIpIHRoYXQgYW4gZW50aXR5IG1heSBoYXZlLgorZW51bSBMaW5rYWdlIDogdW5zaWduZWQgY2hhciB7CisgIC8vLyBcYnJpZWYgTm8gbGlua2FnZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgZW50aXR5IGlzIHVuaXF1ZSBhbmQKKyAgLy8vIGNhbiBvbmx5IGJlIHJlZmVycmVkIHRvIGZyb20gd2l0aGluIGl0cyBzY29wZS4KKyAgTm9MaW5rYWdlID0gMCwKKworICAvLy8gXGJyaWVmIEludGVybmFsIGxpbmthZ2UsIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBlbnRpdHkgY2FuCisgIC8vLyBiZSByZWZlcnJlZCB0byBmcm9tIHdpdGhpbiB0aGUgdHJhbnNsYXRpb24gdW5pdCAoYnV0IG5vdCBvdGhlcgorICAvLy8gdHJhbnNsYXRpb24gdW5pdHMpLgorICBJbnRlcm5hbExpbmthZ2UsCisKKyAgLy8vIFxicmllZiBFeHRlcm5hbCBsaW5rYWdlIHdpdGhpbiBhIHVuaXF1ZSBuYW1lc3BhY2UuIAorICAvLy8KKyAgLy8vIEZyb20gdGhlIGxhbmd1YWdlIHBlcnNwZWN0aXZlLCB0aGVzZSBlbnRpdGllcyBoYXZlIGV4dGVybmFsCisgIC8vLyBsaW5rYWdlLiBIb3dldmVyLCBzaW5jZSB0aGV5IHJlc2lkZSBpbiBhbiBhbm9ueW1vdXMgbmFtZXNwYWNlLAorICAvLy8gdGhlaXIgbmFtZXMgYXJlIHVuaXF1ZSB0byB0aGlzIHRyYW5zbGF0aW9uIHVuaXQsIHdoaWNoIGlzCisgIC8vLyBlcXVpdmFsZW50IHRvIGhhdmluZyBpbnRlcm5hbCBsaW5rYWdlIGZyb20gdGhlIGNvZGUtZ2VuZXJhdGlvbgorICAvLy8gcG9pbnQgb2Ygdmlldy4KKyAgVW5pcXVlRXh0ZXJuYWxMaW5rYWdlLAorCisgIC8vLyBcYnJpZWYgTm8gbGlua2FnZSBhY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkLCBidXQgaXMgdmlzaWJsZSBmcm9tIG90aGVyCisgIC8vLyB0cmFuc2xhdGlvbiB1bml0cyBiZWNhdXNlIG9mIHR5cGVzIGRlZmluZWQgaW4gYSBpbmxpbmUgZnVuY3Rpb24uCisgIFZpc2libGVOb0xpbmthZ2UsCisKKyAgLy8vIFxicmllZiBJbnRlcm5hbCBsaW5rYWdlIGFjY29yZGluZyB0byB0aGUgTW9kdWxlcyBUUywgYnV0IGNhbiBiZSByZWZlcnJlZAorICAvLy8gdG8gZnJvbSBvdGhlciB0cmFuc2xhdGlvbiB1bml0cyBpbmRpcmVjdGx5IHRocm91Z2ggaW5saW5lIGZ1bmN0aW9ucyBhbmQKKyAgLy8vIHRlbXBsYXRlcyBpbiB0aGUgbW9kdWxlIGludGVyZmFjZS4KKyAgTW9kdWxlSW50ZXJuYWxMaW5rYWdlLAorCisgIC8vLyBcYnJpZWYgTW9kdWxlIGxpbmthZ2UsIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBlbnRpdHkgY2FuIGJlIHJlZmVycmVkCisgIC8vLyB0byBmcm9tIG90aGVyIHRyYW5zbGF0aW9uIHVuaXRzIHdpdGhpbiB0aGUgc2FtZSBtb2R1bGUsIGFuZCBpbmRpcmVjdGx5CisgIC8vLyBmcm9tIGFyYml0cmFyeSBvdGhlciB0cmFuc2xhdGlvbiB1bml0cyB0aHJvdWdoIGlubGluZSBmdW5jdGlvbnMgYW5kCisgIC8vLyB0ZW1wbGF0ZXMgaW4gdGhlIG1vZHVsZSBpbnRlcmZhY2UuCisgIE1vZHVsZUxpbmthZ2UsCisKKyAgLy8vIFxicmllZiBFeHRlcm5hbCBsaW5rYWdlLCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50aXR5IGNhbgorICAvLy8gYmUgcmVmZXJyZWQgdG8gZnJvbSBvdGhlciB0cmFuc2xhdGlvbiB1bml0cy4KKyAgRXh0ZXJuYWxMaW5rYWdlCit9OworCisvLy8gXGJyaWVmIERlc2NyaWJlcyB0aGUgZGlmZmVyZW50IGtpbmRzIG9mIGxhbmd1YWdlIGxpbmthZ2UKKy8vLyAoQysrIFtkY2wubGlua10pIHRoYXQgYW4gZW50aXR5IG1heSBoYXZlLgorZW51bSBMYW5ndWFnZUxpbmthZ2UgeworICBDTGFuZ3VhZ2VMaW5rYWdlLAorICBDWFhMYW5ndWFnZUxpbmthZ2UsCisgIE5vTGFuZ3VhZ2VMaW5rYWdlCit9OworCisvLy8gXGJyaWVmIEEgbW9yZSBzcGVjaWZpYyBraW5kIG9mIGxpbmthZ2UgdGhhbiBlbnVtIExpbmthZ2UuCisvLy8KKy8vLyBUaGlzIGlzIHJlbGV2YW50IHRvIENvZGVHZW4gYW5kIEFTVCBmaWxlIHJlYWRpbmcuCitlbnVtIEdWQUxpbmthZ2UgeworICBHVkFfSW50ZXJuYWwsCisgIEdWQV9BdmFpbGFibGVFeHRlcm5hbGx5LAorICBHVkFfRGlzY2FyZGFibGVPRFIsCisgIEdWQV9TdHJvbmdFeHRlcm5hbCwKKyAgR1ZBX1N0cm9uZ09EUgorfTsKKworaW5saW5lIGJvb2wgaXNEaXNjYXJkYWJsZUdWQUxpbmthZ2UoR1ZBTGlua2FnZSBMKSB7CisgIHJldHVybiBMIDw9IEdWQV9EaXNjYXJkYWJsZU9EUjsKK30KKworaW5saW5lIGJvb2wgaXNFeHRlcm5hbGx5VmlzaWJsZShMaW5rYWdlIEwpIHsKKyAgcmV0dXJuIEwgPj0gVmlzaWJsZU5vTGlua2FnZTsKK30KKworaW5saW5lIExpbmthZ2UgZ2V0Rm9ybWFsTGlua2FnZShMaW5rYWdlIEwpIHsKKyAgc3dpdGNoIChMKSB7CisgIGNhc2UgVW5pcXVlRXh0ZXJuYWxMaW5rYWdlOgorICAgIHJldHVybiBFeHRlcm5hbExpbmthZ2U7CisgIGNhc2UgVmlzaWJsZU5vTGlua2FnZToKKyAgICByZXR1cm4gTm9MaW5rYWdlOworICBjYXNlIE1vZHVsZUludGVybmFsTGlua2FnZToKKyAgICByZXR1cm4gSW50ZXJuYWxMaW5rYWdlOworICBkZWZhdWx0OgorICAgIHJldHVybiBMOworICB9Cit9CisKK2lubGluZSBib29sIGlzRXh0ZXJuYWxGb3JtYWxMaW5rYWdlKExpbmthZ2UgTCkgeworICByZXR1cm4gZ2V0Rm9ybWFsTGlua2FnZShMKSA9PSBFeHRlcm5hbExpbmthZ2U7Cit9CisKKy8vLyBcYnJpZWYgQ29tcHV0ZSB0aGUgbWluaW11bSBsaW5rYWdlIGdpdmVuIHR3byBsaW5rYWdlcy4KKy8vLworLy8vIFRoZSBsaW5rYWdlIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIHBhaXIgZm9ybWVkIGJ5IHRoZSBmb3JtYWwgbGlua2FnZSBhbmQKKy8vLyBhIGJvb2xlYW4gZm9yIGV4dGVybmFsIHZpc2liaWxpdHkuIFRoaXMgaXMganVzdCB3aGF0IGdldEZvcm1hbExpbmthZ2UgYW5kCisvLy8gaXNFeHRlcm5hbGx5VmlzaWJsZSByZXR1cm4uIFdlIHdhbnQgdGhlIG1pbmltdW0gb2YgYm90aCBjb21wb25lbnRzLiBUaGUKKy8vLyBMaW5rYWdlIGVudW0gaXMgZGVmaW5lZCBpbiBhbiBvcmRlciB0aGF0IG1ha2VzIHRoaXMgc2ltcGxlLCB3ZSBqdXN0IG5lZWQKKy8vLyBzcGVjaWFsIGNhc2VzIGZvciB3aGVuIFZpc2libGVOb0xpbmthZ2Ugd291bGQgbG9zZSB0aGUgdmlzaWJsZSBiaXQgYW5kCisvLy8gYmVjb21lIE5vTGlua2FnZS4KK2lubGluZSBMaW5rYWdlIG1pbkxpbmthZ2UoTGlua2FnZSBMMSwgTGlua2FnZSBMMikgeworICBpZiAoTDIgPT0gVmlzaWJsZU5vTGlua2FnZSkKKyAgICBzdGQ6OnN3YXAoTDEsIEwyKTsKKyAgaWYgKEwxID09IFZpc2libGVOb0xpbmthZ2UpIHsKKyAgICBpZiAoTDIgPT0gSW50ZXJuYWxMaW5rYWdlKQorICAgICAgcmV0dXJuIE5vTGlua2FnZTsKKyAgICBpZiAoTDIgPT0gVW5pcXVlRXh0ZXJuYWxMaW5rYWdlKQorICAgICAgcmV0dXJuIE5vTGlua2FnZTsKKyAgfQorICByZXR1cm4gTDEgPCBMMiA/IEwxIDogTDI7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0JBU0lDX0xJTktBR0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvTWFjcm9CdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9NYWNyb0J1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTllYWEyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvTWFjcm9CdWlsZGVyLmgKQEAgLTAsMCArMSw0OCBAQAorLy89PT0tLS0gTWFjcm9CdWlsZGVyLmggLSBDUFAgTWFjcm8gYnVpbGRpbmcgdXRpbGl0eSAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgdGhlIGNsYW5nOjpNYWNyb0J1aWxkZXIgdXRpbGl0eSBjbGFzcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX01BQ1JPQlVJTERFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfTUFDUk9CVUlMREVSX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBNYWNyb0J1aWxkZXIgeworICByYXdfb3N0cmVhbSAmT3V0OworcHVibGljOgorICBNYWNyb0J1aWxkZXIocmF3X29zdHJlYW0gJk91dHB1dCkgOiBPdXQoT3V0cHV0KSB7fQorCisgIC8vLyBBcHBlbmQgYSBcI2RlZmluZSBsaW5lIGZvciBtYWNybyBvZiB0aGUgZm9ybSAiXCNkZWZpbmUgTmFtZSBWYWx1ZVxuIi4KKyAgdm9pZCBkZWZpbmVNYWNybyhjb25zdCBUd2luZSAmTmFtZSwgY29uc3QgVHdpbmUgJlZhbHVlID0gIjEiKSB7CisgICAgT3V0IDw8ICIjZGVmaW5lICIgPDwgTmFtZSA8PCAnICcgPDwgVmFsdWUgPDwgJ1xuJzsKKyAgfQorCisgIC8vLyBBcHBlbmQgYSBcI3VuZGVmIGxpbmUgZm9yIE5hbWUuICBOYW1lIHNob3VsZCBiZSBvZiB0aGUgZm9ybSBYWFgKKyAgLy8vIGFuZCB3ZSBlbWl0ICJcI3VuZGVmIFhYWCIuCisgIHZvaWQgdW5kZWZpbmVNYWNybyhjb25zdCBUd2luZSAmTmFtZSkgeworICAgIE91dCA8PCAiI3VuZGVmICIgPDwgTmFtZSA8PCAnXG4nOworICB9CisKKyAgLy8vIERpcmVjdGx5IGFwcGVuZCBTdHIgYW5kIGEgbmV3bGluZSB0byB0aGUgdW5kZXJseWluZyBidWZmZXIuCisgIHZvaWQgYXBwZW5kKGNvbnN0IFR3aW5lICZTdHIpIHsKKyAgICBPdXQgPDwgU3RyIDw8ICdcbic7CisgIH0KK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9NZW1vcnlCdWZmZXJDYWNoZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvTWVtb3J5QnVmZmVyQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzljM2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvTWVtb3J5QnVmZmVyQ2FjaGUuaApAQCAtMCwwICsxLDgwIEBACisvLz09PS0gTWVtb3J5QnVmZmVyQ2FjaGUuaCAtIENhY2hlIGZvciBsb2FkZWQgbWVtb3J5IGJ1ZmZlcnMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfTUVNT1JZQlVGRkVSQ0FDSEVfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX01FTU9SWUJVRkZFUkNBQ0hFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTWVtb3J5QnVmZmVyOworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIE1hbmFnZSBtZW1vcnkgYnVmZmVycyBhY3Jvc3MgbXVsdGlwbGUgdXNlcnMuCisvLy8KKy8vLyBFbnN1cmVzIHRoYXQgbXVsdGlwbGUgdXNlcnMgaGF2ZSBhIGNvbnNpc3RlbnQgdmlldyBvZiBlYWNoIGJ1ZmZlci4gIFRoaXMgaXMKKy8vLyB1c2VkIGJ5IFxhIENvbXBpbGVySW5zdGFuY2Ugd2hlbiBidWlsZGluZyBQQ01zIHRvIGVuc3VyZSB0aGF0IGVhY2ggXGEKKy8vLyBNb2R1bGVNYW5hZ2VyIHNlZXMgdGhlIHNhbWUgZmlsZXMuCisvLy8KKy8vLyBcYSBmaW5hbGl6ZUN1cnJlbnRCdWZmZXJzKCkgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgdXNlci4KKy8vLyBUaGlzIGxvY2tzIGluIHRoZSBjdXJyZW50IGJ1ZmZlcnMsIGVuc3VyaW5nIHRoYXQgbm8gYnVmZmVyIHRoYXQgaGFzIGFscmVhZHkKKy8vLyBiZWVuIGFjY2Vzc2VkIGNhbiBiZSBwdXJnZWQsIHByZXZlbnRpbmcgdXNlLWFmdGVyLWZyZWVzLgorY2xhc3MgTWVtb3J5QnVmZmVyQ2FjaGUgOiBwdWJsaWMgbGx2bTo6UmVmQ291bnRlZEJhc2U8TWVtb3J5QnVmZmVyQ2FjaGU+IHsKKyAgc3RydWN0IEJ1ZmZlckVudHJ5IHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBCdWZmZXI7CisKKyAgICAvLy8gVHJhY2sgdGhlIHRpbWVsaW5lIG9mIHdoZW4gdGhpcyB3YXMgYWRkZWQgdG8gdGhlIGNhY2hlLgorICAgIHVuc2lnbmVkIEluZGV4OworICB9OworCisgIC8vLyBDYWNoZSBvZiBidWZmZXJzLgorICBsbHZtOjpTdHJpbmdNYXA8QnVmZmVyRW50cnk+IEJ1ZmZlcnM7CisKKyAgLy8vIE1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBpbmRleC4KKyAgdW5zaWduZWQgTmV4dEluZGV4ID0gMDsKKworICAvLy8gQnVtcGVkIHRvIHByZXZlbnQgIm9sZGVyIiBidWZmZXJzIGZyb20gYmVpbmcgcmVtb3ZlZC4KKyAgdW5zaWduZWQgRmlyc3RSZW1vdmFibGVJbmRleCA9IDA7CisKK3B1YmxpYzoKKyAgLy8vIFN0b3JlIHRoZSBCdWZmZXIgdW5kZXIgdGhlIEZpbGVuYW1lLgorICAvLy8KKyAgLy8vIFxwcmUgVGhlcmUgaXMgbm90IGFscmVhZHkgYnVmZmVyIGlzIG5vdCBhbHJlYWR5IGluIHRoZSBjYWNoZS4KKyAgLy8vIFxyZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBhcyBhIGNvbnZlbmllbmNlLgorICBsbHZtOjpNZW1vcnlCdWZmZXIgJmFkZEJ1ZmZlcihsbHZtOjpTdHJpbmdSZWYgRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+IEJ1ZmZlcik7CisKKyAgLy8vIFRyeSB0byByZW1vdmUgYSBidWZmZXIgZnJvbSB0aGUgY2FjaGUuCisgIC8vLworICAvLy8gXHJldHVybiBmYWxzZSBvbiBzdWNjZXNzLCBpZmYgXGMgIWlzQnVmZmVyRmluYWwoKS4KKyAgYm9vbCB0cnlUb1JlbW92ZUJ1ZmZlcihsbHZtOjpTdHJpbmdSZWYgRmlsZW5hbWUpOworCisgIC8vLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBidWZmZXIgaWYgaXQgZXhpc3RzOyBlbHNlIG51bGxwdHIuCisgIGxsdm06Ok1lbW9yeUJ1ZmZlciAqbG9va3VwQnVmZmVyKGxsdm06OlN0cmluZ1JlZiBGaWxlbmFtZSk7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgdGhlIGJ1ZmZlciBpcyBmaW5hbC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIHRydWUgaWZmIFxhIGZpbmFsaXplQ3VycmVudEJ1ZmZlcnMoKSBoYXMgYmVlbiBjYWxsZWQgc2luY2UgdGhlCisgIC8vLyBidWZmZXIgd2FzIGFkZGVkLiAgVGhpcyBwcmV2ZW50cyBidWZmZXJzIGZyb20gYmVpbmcgcmVtb3ZlZC4KKyAgYm9vbCBpc0J1ZmZlckZpbmFsKGxsdm06OlN0cmluZ1JlZiBGaWxlbmFtZSk7CisKKyAgLy8vIEZpbmFsaXplIHRoZSBjdXJyZW50IGJ1ZmZlcnMgaW4gdGhlIGNhY2hlLgorICAvLy8KKyAgLy8vIFNob3VsZCBiZSBjYWxsZWQgd2hlbiBjcmVhdGluZyBhIG5ldyB1c2VyIHRvIGVuc3VyZSBwcmV2aW91cyB1c2VzIGFyZW4ndAorICAvLy8gaW52YWxpZGF0ZWQuCisgIHZvaWQgZmluYWxpemVDdXJyZW50QnVmZmVycygpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0JBU0lDX01FTU9SWUJVRkZFUkNBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL01vZHVsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvTW9kdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcyNWZjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL01vZHVsZS5oCkBAIC0wLDAgKzEsNjQ0IEBACisvLz09PS0gTW9kdWxlLmggLSBEZXNjcmliZSBhIG1vZHVsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHRoZSBjbGFuZzo6TW9kdWxlIGNsYXNzLCB3aGljaCBkZXNjcmliZXMgYSBtb2R1bGUgaW4gdGhlCisvLy8gc291cmNlIGNvZGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX01PRFVMRV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfTU9EVUxFX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0ZpbGVNYW5hZ2VyLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3RpbWU+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBjbGFuZyB7CisgIAorY2xhc3MgTGFuZ09wdGlvbnM7CitjbGFzcyBUYXJnZXRJbmZvOworCisvLy8gXGJyaWVmIERlc2NyaWJlcyB0aGUgbmFtZSBvZiBhIG1vZHVsZS4KK3VzaW5nIE1vZHVsZUlkID0gU21hbGxWZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBTb3VyY2VMb2NhdGlvbj4sIDI+OworCisvLy8gVGhlIHNpZ25hdHVyZSBvZiBhIG1vZHVsZSwgd2hpY2ggaXMgYSBoYXNoIG9mIHRoZSBBU1QgY29udGVudC4KK3N0cnVjdCBBU1RGaWxlU2lnbmF0dXJlIDogc3RkOjphcnJheTx1aW50MzJfdCwgNT4geworICBBU1RGaWxlU2lnbmF0dXJlKHN0ZDo6YXJyYXk8dWludDMyX3QsIDU+IFMgPSB7ezB9fSkKKyAgICAgIDogc3RkOjphcnJheTx1aW50MzJfdCwgNT4oc3RkOjptb3ZlKFMpKSB7fQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgcmV0dXJuICp0aGlzICE9IHN0ZDo6YXJyYXk8dWludDMyX3QsIDU+KHt7MH19KTsKKyAgfQorfTsKKworLy8vIFxicmllZiBEZXNjcmliZXMgYSBtb2R1bGUgb3Igc3VibW9kdWxlLgorY2xhc3MgTW9kdWxlIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBUaGUgbmFtZSBvZiB0aGlzIG1vZHVsZS4KKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSBtb2R1bGUgZGVmaW5pdGlvbi4KKyAgU291cmNlTG9jYXRpb24gRGVmaW5pdGlvbkxvYzsKKworICBlbnVtIE1vZHVsZUtpbmQgeworICAgIC8vLyBcYnJpZWYgVGhpcyBpcyBhIG1vZHVsZSB0aGF0IHdhcyBkZWZpbmVkIGJ5IGEgbW9kdWxlIG1hcCBhbmQgYnVpbHQgb3V0CisgICAgLy8vIG9mIGhlYWRlciBmaWxlcy4KKyAgICBNb2R1bGVNYXBNb2R1bGUsCisKKyAgICAvLy8gXGJyaWVmIFRoaXMgaXMgYSBDKysgTW9kdWxlcyBUUyBtb2R1bGUgaW50ZXJmYWNlIHVuaXQuCisgICAgTW9kdWxlSW50ZXJmYWNlVW5pdCwKKworICAgIC8vLyBcYnJpZWYgVGhpcyBpcyBhIGZyYWdtZW50IG9mIHRoZSBnbG9iYWwgbW9kdWxlIHdpdGhpbiBzb21lIEMrKyBNb2R1bGVzCisgICAgLy8vIFRTIG1vZHVsZS4KKyAgICBHbG9iYWxNb2R1bGVGcmFnbWVudCwKKyAgfTsKKworICAvLy8gXGJyaWVmIFRoZSBraW5kIG9mIHRoaXMgbW9kdWxlLgorICBNb2R1bGVLaW5kIEtpbmQgPSBNb2R1bGVNYXBNb2R1bGU7CisKKyAgLy8vIFxicmllZiBUaGUgcGFyZW50IG9mIHRoaXMgbW9kdWxlLiBUaGlzIHdpbGwgYmUgTlVMTCBmb3IgdGhlIHRvcC1sZXZlbAorICAvLy8gbW9kdWxlLgorICBNb2R1bGUgKlBhcmVudDsKKworICAvLy8gXGJyaWVmIFRoZSBidWlsZCBkaXJlY3Rvcnkgb2YgdGhpcyBtb2R1bGUuIFRoaXMgaXMgdGhlIGRpcmVjdG9yeSBpbgorICAvLy8gd2hpY2ggdGhlIG1vZHVsZSBpcyBub3Rpb25hbGx5IGJ1aWx0LCBhbmQgcmVsYXRpdmUgdG8gd2hpY2ggaXRzIGhlYWRlcnMKKyAgLy8vIGFyZSBmb3VuZC4KKyAgY29uc3QgRGlyZWN0b3J5RW50cnkgKkRpcmVjdG9yeSA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBUaGUgcHJlc3VtZWQgZmlsZSBuYW1lIGZvciB0aGUgbW9kdWxlIG1hcCBkZWZpbmluZyB0aGlzIG1vZHVsZS4KKyAgLy8vIE9ubHkgbm9uLWVtcHR5IHdoZW4gYnVpbGRpbmcgZnJvbSBwcmVwcm9jZXNzZWQgc291cmNlLgorICBzdGQ6OnN0cmluZyBQcmVzdW1lZE1vZHVsZU1hcEZpbGU7CisKKyAgLy8vIFxicmllZiBUaGUgdW1icmVsbGEgaGVhZGVyIG9yIGRpcmVjdG9yeS4KKyAgbGx2bTo6UG9pbnRlclVuaW9uPGNvbnN0IERpcmVjdG9yeUVudHJ5ICosIGNvbnN0IEZpbGVFbnRyeSAqPiBVbWJyZWxsYTsKKworICAvLy8gXGJyaWVmIFRoZSBtb2R1bGUgc2lnbmF0dXJlLgorICBBU1RGaWxlU2lnbmF0dXJlIFNpZ25hdHVyZTsKKworICAvLy8gXGJyaWVmIFRoZSBuYW1lIG9mIHRoZSB1bWJyZWxsYSBlbnRyeSwgYXMgd3JpdHRlbiBpbiB0aGUgbW9kdWxlIG1hcC4KKyAgc3RkOjpzdHJpbmcgVW1icmVsbGFBc1dyaXR0ZW47CisKKyAgLy8vIFxicmllZiBUaGUgbW9kdWxlIHRocm91Z2ggd2hpY2ggZW50aXRpZXMgZGVmaW5lZCBpbiB0aGlzIG1vZHVsZSB3aWxsCisgIC8vLyBldmVudHVhbGx5IGJlIGV4cG9zZWQsIGZvciB1c2UgaW4gInByaXZhdGUiIG1vZHVsZXMuCisgIHN0ZDo6c3RyaW5nIEV4cG9ydEFzTW9kdWxlOworICAKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgVGhlIHN1Ym1vZHVsZXMgb2YgdGhpcyBtb2R1bGUsIGluZGV4ZWQgYnkgbmFtZS4KKyAgc3RkOjp2ZWN0b3I8TW9kdWxlICo+IFN1Yk1vZHVsZXM7CisgIAorICAvLy8gXGJyaWVmIEEgbWFwcGluZyBmcm9tIHRoZSBzdWJtb2R1bGUgbmFtZSB0byB0aGUgaW5kZXggaW50byB0aGUgCisgIC8vLyBcYyBTdWJNb2R1bGVzIHZlY3RvciBhdCB3aGljaCB0aGF0IHN1Ym1vZHVsZSByZXNpZGVzLgorICBsbHZtOjpTdHJpbmdNYXA8dW5zaWduZWQ+IFN1Yk1vZHVsZUluZGV4OworCisgIC8vLyBcYnJpZWYgVGhlIEFTVCBmaWxlIGlmIHRoaXMgaXMgYSB0b3AtbGV2ZWwgbW9kdWxlIHdoaWNoIGhhcyBhCisgIC8vLyBjb3JyZXNwb25kaW5nIHNlcmlhbGl6ZWQgQVNUIGZpbGUsIG9yIG51bGwgb3RoZXJ3aXNlLgorICBjb25zdCBGaWxlRW50cnkgKkFTVEZpbGUgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIHRvcC1sZXZlbCBoZWFkZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1vZHVsZS4KKyAgbGx2bTo6U21hbGxTZXRWZWN0b3I8Y29uc3QgRmlsZUVudHJ5ICosIDI+IFRvcEhlYWRlcnM7CisKKyAgLy8vIFxicmllZiB0b3AtbGV2ZWwgaGVhZGVyIGZpbGVuYW1lcyB0aGF0IGFyZW4ndCByZXNvbHZlZCB0byBGaWxlRW50cmllcyB5ZXQuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBUb3BIZWFkZXJOYW1lczsKKworICAvLy8gXGJyaWVmIENhY2hlIG9mIG1vZHVsZXMgdmlzaWJsZSB0byBsb29rdXAgaW4gdGhpcyBtb2R1bGUuCisgIG11dGFibGUgbGx2bTo6RGVuc2VTZXQ8Y29uc3QgTW9kdWxlKj4gVmlzaWJsZU1vZHVsZXNDYWNoZTsKKworICAvLy8gVGhlIElEIHVzZWQgd2hlbiByZWZlcmVuY2luZyB0aGlzIG1vZHVsZSB3aXRoaW4gYSBWaXNpYmxlTW9kdWxlU2V0LgorICB1bnNpZ25lZCBWaXNpYmlsaXR5SUQ7CisKK3B1YmxpYzoKKyAgZW51bSBIZWFkZXJLaW5kIHsKKyAgICBIS19Ob3JtYWwsCisgICAgSEtfVGV4dHVhbCwKKyAgICBIS19Qcml2YXRlLAorICAgIEhLX1ByaXZhdGVUZXh0dWFsLAorICAgIEhLX0V4Y2x1ZGVkCisgIH07CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtSGVhZGVyS2luZHMgPSBIS19FeGNsdWRlZCArIDE7CisKKyAgLy8vIFxicmllZiBJbmZvcm1hdGlvbiBhYm91dCBhIGhlYWRlciBkaXJlY3RpdmUgYXMgZm91bmQgaW4gdGhlIG1vZHVsZSBtYXAKKyAgLy8vIGZpbGUuCisgIHN0cnVjdCBIZWFkZXIgeworICAgIHN0ZDo6c3RyaW5nIE5hbWVBc1dyaXR0ZW47CisgICAgY29uc3QgRmlsZUVudHJ5ICpFbnRyeTsKKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSB7IHJldHVybiBFbnRyeTsgfQorICB9OworCisgIC8vLyBcYnJpZWYgSW5mb3JtYXRpb24gYWJvdXQgYSBkaXJlY3RvcnkgbmFtZSBhcyBmb3VuZCBpbiB0aGUgbW9kdWxlIG1hcAorICAvLy8gZmlsZS4KKyAgc3RydWN0IERpcmVjdG9yeU5hbWUgeworICAgIHN0ZDo6c3RyaW5nIE5hbWVBc1dyaXR0ZW47CisgICAgY29uc3QgRGlyZWN0b3J5RW50cnkgKkVudHJ5OworCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIHsgcmV0dXJuIEVudHJ5OyB9CisgIH07CisKKyAgLy8vIFxicmllZiBUaGUgaGVhZGVycyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgbW9kdWxlLgorICBTbWFsbFZlY3RvcjxIZWFkZXIsIDI+IEhlYWRlcnNbNV07CisKKyAgLy8vIFxicmllZiBTdG9yZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBoZWFkZXIgZGlyZWN0aXZlIHRoYXQgd2FzIGZvdW5kIGluIHRoZQorICAvLy8gbW9kdWxlIG1hcCBmaWxlIGJ1dCBoYXMgbm90IGJlZW4gcmVzb2x2ZWQgdG8gYSBmaWxlLgorICBzdHJ1Y3QgVW5yZXNvbHZlZEhlYWRlckRpcmVjdGl2ZSB7CisgICAgSGVhZGVyS2luZCBLaW5kID0gSEtfTm9ybWFsOworICAgIFNvdXJjZUxvY2F0aW9uIEZpbGVOYW1lTG9jOworICAgIHN0ZDo6c3RyaW5nIEZpbGVOYW1lOworICAgIGJvb2wgSXNVbWJyZWxsYSA9IGZhbHNlOworICAgIGJvb2wgSGFzQnVpbHRpbkhlYWRlciA9IGZhbHNlOworICAgIE9wdGlvbmFsPG9mZl90PiBTaXplOworICAgIE9wdGlvbmFsPHRpbWVfdD4gTW9kVGltZTsKKyAgfTsKKworICAvLy8gSGVhZGVycyB0aGF0IGFyZSBtZW50aW9uZWQgaW4gdGhlIG1vZHVsZSBtYXAgZmlsZSBidXQgdGhhdCB3ZSBoYXZlIG5vdAorICAvLy8geWV0IGF0dGVtcHRlZCB0byByZXNvbHZlIHRvIGEgZmlsZSBvbiB0aGUgZmlsZSBzeXN0ZW0uCisgIFNtYWxsVmVjdG9yPFVucmVzb2x2ZWRIZWFkZXJEaXJlY3RpdmUsIDE+IFVucmVzb2x2ZWRIZWFkZXJzOworCisgIC8vLyBcYnJpZWYgSGVhZGVycyB0aGF0IGFyZSBtZW50aW9uZWQgaW4gdGhlIG1vZHVsZSBtYXAgZmlsZSBidXQgY291bGQgbm90IGJlCisgIC8vLyBmb3VuZCBvbiB0aGUgZmlsZSBzeXN0ZW0uCisgIFNtYWxsVmVjdG9yPFVucmVzb2x2ZWRIZWFkZXJEaXJlY3RpdmUsIDE+IE1pc3NpbmdIZWFkZXJzOworCisgIC8vLyBcYnJpZWYgQW4gaW5kaXZpZHVhbCByZXF1aXJlbWVudDogYSBmZWF0dXJlIG5hbWUgYW5kIGEgZmxhZyBpbmRpY2F0aW5nCisgIC8vLyB0aGUgcmVxdWlyZWQgc3RhdGUgb2YgdGhhdCBmZWF0dXJlLgorICB1c2luZyBSZXF1aXJlbWVudCA9IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgYm9vbD47CisKKyAgLy8vIFxicmllZiBUaGUgc2V0IG9mIGxhbmd1YWdlIGZlYXR1cmVzIHJlcXVpcmVkIHRvIHVzZSB0aGlzIG1vZHVsZS4KKyAgLy8vCisgIC8vLyBJZiBhbnkgb2YgdGhlc2UgcmVxdWlyZW1lbnRzIGFyZSBub3QgYXZhaWxhYmxlLCB0aGUgXGMgSXNBdmFpbGFibGUgYml0CisgIC8vLyB3aWxsIGJlIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgdGhpcyAoc3ViKW1vZHVsZSBpcyBub3QgYXZhaWxhYmxlLgorICBTbWFsbFZlY3RvcjxSZXF1aXJlbWVudCwgMj4gUmVxdWlyZW1lbnRzOworCisgIC8vLyBcYnJpZWYgQSBtb2R1bGUgd2l0aCB0aGUgc2FtZSBuYW1lIHRoYXQgc2hhZG93cyB0aGlzIG1vZHVsZS4KKyAgTW9kdWxlICpTaGFkb3dpbmdNb2R1bGUgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIG1vZHVsZSBpcyBtaXNzaW5nIGEgZmVhdHVyZSBmcm9tIFxjIFJlcXVpcmVtZW50cy4KKyAgdW5zaWduZWQgSXNNaXNzaW5nUmVxdWlyZW1lbnQgOiAxOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB3ZSB0cmllZCBhbmQgZmFpbGVkIHRvIGxvYWQgYSBtb2R1bGUgZmlsZSBmb3IgdGhpcyBtb2R1bGUuCisgIHVuc2lnbmVkIEhhc0luY29tcGF0aWJsZU1vZHVsZUZpbGUgOiAxOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIG1vZHVsZSBpcyBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgbW9kdWxlIGlzIG1pc3NpbmcgaGVhZGVycyBvciBkb2VzIG5vdCBtZWV0IGFsbCByZXF1aXJlbWVudHMgdGhlbgorICAvLy8gdGhpcyBiaXQgd2lsbCBiZSAwLgorICB1bnNpZ25lZCBJc0F2YWlsYWJsZSA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgbW9kdWxlIHdhcyBsb2FkZWQgZnJvbSBhIG1vZHVsZSBmaWxlLgorICB1bnNpZ25lZCBJc0Zyb21Nb2R1bGVGaWxlIDogMTsKKyAgCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGlzIGEgZnJhbWV3b3JrIG1vZHVsZS4KKyAgdW5zaWduZWQgSXNGcmFtZXdvcmsgOiAxOworICAKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgaXMgYW4gZXhwbGljaXQgc3VibW9kdWxlLgorICB1bnNpZ25lZCBJc0V4cGxpY2l0IDogMTsKKyAgCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGlzIGEgInN5c3RlbSIgbW9kdWxlICh3aGljaCBhc3N1bWVzIHRoYXQgYWxsCisgIC8vLyBoZWFkZXJzIGluIGl0IGFyZSBzeXN0ZW0gaGVhZGVycykuCisgIHVuc2lnbmVkIElzU3lzdGVtIDogMTsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBpcyBhbiAnZXh0ZXJuICJDIicgbW9kdWxlICh3aGljaCBpbXBsaWNpdGx5IHB1dHMgYWxsCisgIC8vLyBoZWFkZXJzIGluIGl0IHdpdGhpbiBhbiAnZXh0ZXJuICJDIicgYmxvY2ssIGFuZCBhbGxvd3MgdGhlIG1vZHVsZSB0byBiZQorICAvLy8gaW1wb3J0ZWQgd2l0aGluIHN1Y2ggYSBibG9jaykuCisgIHVuc2lnbmVkIElzRXh0ZXJuQyA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgaXMgYW4gaW5mZXJyZWQgc3VibW9kdWxlIChtb2R1bGUgKiB7IC4uLiB9KS4KKyAgdW5zaWduZWQgSXNJbmZlcnJlZCA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHdlIHNob3VsZCBpbmZlciBzdWJtb2R1bGVzIGZvciB0aGlzIG1vZHVsZSBiYXNlZCBvbiAKKyAgLy8vIHRoZSBoZWFkZXJzLgorICAvLy8KKyAgLy8vIFN1Ym1vZHVsZXMgY2FuIG9ubHkgYmUgaW5mZXJyZWQgZm9yIG1vZHVsZXMgd2l0aCBhbiB1bWJyZWxsYSBoZWFkZXIuCisgIHVuc2lnbmVkIEluZmVyU3VibW9kdWxlcyA6IDE7CisgIAorICAvLy8gXGJyaWVmIFdoZXRoZXIsIHdoZW4gaW5mZXJyaW5nIHN1Ym1vZHVsZXMsIHRoZSBpbmZlcnJlZCBzdWJtb2R1bGVzCisgIC8vLyBzaG91bGQgYmUgZXhwbGljaXQuCisgIHVuc2lnbmVkIEluZmVyRXhwbGljaXRTdWJtb2R1bGVzIDogMTsKKyAgCisgIC8vLyBcYnJpZWYgV2hldGhlciwgd2hlbiBpbmZlcnJpbmcgc3VibW9kdWxlcywgdGhlIGluZmVyciBzdWJtb2R1bGVzIHNob3VsZAorICAvLy8gZXhwb3J0IGFsbCBtb2R1bGVzIHRoZXkgaW1wb3J0IChlLmcuLCB0aGUgZXF1aXZhbGVudCBvZiAiZXhwb3J0ICoiKS4KKyAgdW5zaWduZWQgSW5mZXJFeHBvcnRXaWxkY2FyZCA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoZSBzZXQgb2YgY29uZmlndXJhdGlvbiBtYWNyb3MgaXMgZXhoYXVzdGl2ZS4KKyAgLy8vCisgIC8vLyBXaGVuIHRoZSBzZXQgb2YgY29uZmlndXJhdGlvbiBtYWNyb3MgaXMgZXhoYXVzdGl2ZSwgbWVhbmluZworICAvLy8gdGhhdCBubyBpZGVudGlmaWVyIG5vdCBpbiB0aGlzIGxpc3Qgc2hvdWxkIGFmZmVjdCBob3cgdGhlIG1vZHVsZSBpcworICAvLy8gYnVpbHQuCisgIHVuc2lnbmVkIENvbmZpZ01hY3Jvc0V4aGF1c3RpdmUgOiAxOworCisgIC8vLyBcYnJpZWYgV2hldGhlciBmaWxlcyBpbiB0aGlzIG1vZHVsZSBjYW4gb25seSBpbmNsdWRlIG5vbi1tb2R1bGFyIGhlYWRlcnMKKyAgLy8vIGFuZCBoZWFkZXJzIGZyb20gdXNlZCBtb2R1bGVzLgorICB1bnNpZ25lZCBOb1VuZGVjbGFyZWRJbmNsdWRlcyA6IDE7CisKKyAgLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHZhcmlvdXMgbmFtZXMgd2l0aGluIGEKKyAgLy8vIHBhcnRpY3VsYXIgbW9kdWxlLgorICBlbnVtIE5hbWVWaXNpYmlsaXR5S2luZCB7CisgICAgLy8vIFxicmllZiBBbGwgb2YgdGhlIG5hbWVzIGluIHRoaXMgbW9kdWxlIGFyZSBoaWRkZW4uCisgICAgSGlkZGVuLAorICAgIC8vLyBcYnJpZWYgQWxsIG9mIHRoZSBuYW1lcyBpbiB0aGlzIG1vZHVsZSBhcmUgdmlzaWJsZS4KKyAgICBBbGxWaXNpYmxlCisgIH07CisKKyAgLy8vIFxicmllZiBUaGUgdmlzaWJpbGl0eSBvZiBuYW1lcyB3aXRoaW4gdGhpcyBwYXJ0aWN1bGFyIG1vZHVsZS4KKyAgTmFtZVZpc2liaWxpdHlLaW5kIE5hbWVWaXNpYmlsaXR5OworCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSBpbmZlcnJlZCBzdWJtb2R1bGUuCisgIFNvdXJjZUxvY2F0aW9uIEluZmVycmVkU3VibW9kdWxlTG9jOworCisgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiBtb2R1bGVzIGltcG9ydGVkIGJ5IHRoaXMgbW9kdWxlLCBhbmQgb24gd2hpY2ggdGhpcworICAvLy8gbW9kdWxlIGRlcGVuZHMuCisgIGxsdm06OlNtYWxsU2V0VmVjdG9yPE1vZHVsZSAqLCAyPiBJbXBvcnRzOworICAKKyAgLy8vIFxicmllZiBEZXNjcmliZXMgYW4gZXhwb3J0ZWQgbW9kdWxlLgorICAvLy8KKyAgLy8vIFRoZSBwb2ludGVyIGlzIHRoZSBtb2R1bGUgYmVpbmcgcmUtZXhwb3J0ZWQsIHdoaWxlIHRoZSBiaXQgd2lsbCBiZSB0cnVlCisgIC8vLyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYSB3aWxkY2FyZCBleHBvcnQuCisgIHVzaW5nIEV4cG9ydERlY2wgPSBsbHZtOjpQb2ludGVySW50UGFpcjxNb2R1bGUgKiwgMSwgYm9vbD47CisgIAorICAvLy8gXGJyaWVmIFRoZSBzZXQgb2YgZXhwb3J0IGRlY2xhcmF0aW9ucy4KKyAgU21hbGxWZWN0b3I8RXhwb3J0RGVjbCwgMj4gRXhwb3J0czsKKyAgCisgIC8vLyBcYnJpZWYgRGVzY3JpYmVzIGFuIGV4cG9ydGVkIG1vZHVsZSB0aGF0IGhhcyBub3QgeWV0IGJlZW4gcmVzb2x2ZWQKKyAgLy8vIChwZXJoYXBzIGJlY2F1c2UgdGhlIG1vZHVsZSBpdCByZWZlcnMgdG8gaGFzIG5vdCB5ZXQgYmVlbiBsb2FkZWQpLgorICBzdHJ1Y3QgVW5yZXNvbHZlZEV4cG9ydERlY2wgeworICAgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSAnZXhwb3J0JyBrZXl3b3JkIGluIHRoZSBtb2R1bGUgbWFwIGZpbGUuCisgICAgU291cmNlTG9jYXRpb24gRXhwb3J0TG9jOworICAgIAorICAgIC8vLyBcYnJpZWYgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4KKyAgICBNb2R1bGVJZCBJZDsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBleHBvcnQgZGVjbGFyYXRpb24gZW5kcyBpbiBhIHdpbGRjYXJkLCBpbmRpY2F0aW5nCisgICAgLy8vIHRoYXQgYWxsIG9mIGl0cyBzdWJtb2R1bGVzIHNob3VsZCBiZSBleHBvcnRlZCAocmF0aGVyIHRoYW4gdGhlIG5hbWVkCisgICAgLy8vIG1vZHVsZSBpdHNlbGYpLgorICAgIGJvb2wgV2lsZGNhcmQ7CisgIH07CisgIAorICAvLy8gXGJyaWVmIFRoZSBzZXQgb2YgZXhwb3J0IGRlY2xhcmF0aW9ucyB0aGF0IGhhdmUgeWV0IHRvIGJlIHJlc29sdmVkLgorICBTbWFsbFZlY3RvcjxVbnJlc29sdmVkRXhwb3J0RGVjbCwgMj4gVW5yZXNvbHZlZEV4cG9ydHM7CisKKyAgLy8vIFxicmllZiBUaGUgZGlyZWN0bHkgdXNlZCBtb2R1bGVzLgorICBTbWFsbFZlY3RvcjxNb2R1bGUgKiwgMj4gRGlyZWN0VXNlczsKKworICAvLy8gXGJyaWVmIFRoZSBzZXQgb2YgdXNlIGRlY2xhcmF0aW9ucyB0aGF0IGhhdmUgeWV0IHRvIGJlIHJlc29sdmVkLgorICBTbWFsbFZlY3RvcjxNb2R1bGVJZCwgMj4gVW5yZXNvbHZlZERpcmVjdFVzZXM7CisKKyAgLy8vIFxicmllZiBBIGxpYnJhcnkgb3IgZnJhbWV3b3JrIHRvIGxpbmsgYWdhaW5zdCB3aGVuIGFuIGVudGl0eSBmcm9tIHRoaXMKKyAgLy8vIG1vZHVsZSBpcyB1c2VkLgorICBzdHJ1Y3QgTGlua0xpYnJhcnkgeworICAgIExpbmtMaWJyYXJ5KCkgPSBkZWZhdWx0OworICAgIExpbmtMaWJyYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nICZMaWJyYXJ5LCBib29sIElzRnJhbWV3b3JrKQorICAgICAgICA6IExpYnJhcnkoTGlicmFyeSksIElzRnJhbWV3b3JrKElzRnJhbWV3b3JrKSB7fQorICAgIAorICAgIC8vLyBcYnJpZWYgVGhlIGxpYnJhcnkgdG8gbGluayBhZ2FpbnN0LgorICAgIC8vLworICAgIC8vLyBUaGlzIHdpbGwgdHlwaWNhbGx5IGJlIGEgbGlicmFyeSBvciBmcmFtZXdvcmsgbmFtZSwgYnV0IGNhbiBhbHNvCisgICAgLy8vIGJlIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIGxpYnJhcnkgb3IgZnJhbWV3b3JrLgorICAgIHN0ZDo6c3RyaW5nIExpYnJhcnk7CisKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBpcyBhIGZyYW1ld29yayByYXRoZXIgdGhhbiBhIGxpYnJhcnkuCisgICAgYm9vbCBJc0ZyYW1ld29yayA9IGZhbHNlOworICB9OworCisgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiBsaWJyYXJpZXMgb3IgZnJhbWV3b3JrcyB0byBsaW5rIGFnYWluc3Qgd2hlbgorICAvLy8gYW4gZW50aXR5IGZyb20gdGhpcyBtb2R1bGUgaXMgdXNlZC4KKyAgbGx2bTo6U21hbGxWZWN0b3I8TGlua0xpYnJhcnksIDI+IExpbmtMaWJyYXJpZXM7CisKKyAgLy8vIFxicmllZiBUaGUgc2V0IG9mICJjb25maWd1cmF0aW9uIG1hY3JvcyIsIHdoaWNoIGFyZSBtYWNyb3MgdGhhdAorICAvLy8gKGludGVudGlvbmFsbHkpIGNoYW5nZSBob3cgdGhpcyBtb2R1bGUgaXMgYnVpbHQuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBDb25maWdNYWNyb3M7CisKKyAgLy8vIFxicmllZiBBbiB1bnJlc29sdmVkIGNvbmZsaWN0IHdpdGggYW5vdGhlciBtb2R1bGUuCisgIHN0cnVjdCBVbnJlc29sdmVkQ29uZmxpY3QgeworICAgIC8vLyBcYnJpZWYgVGhlICh1bnJlc29sdmVkKSBtb2R1bGUgaWQuCisgICAgTW9kdWxlSWQgSWQ7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBtZXNzYWdlIHByb3ZpZGVkIHRvIHRoZSB1c2VyIHdoZW4gdGhlcmUgaXMgYSBjb25mbGljdC4KKyAgICBzdGQ6OnN0cmluZyBNZXNzYWdlOworICB9OworCisgIC8vLyBcYnJpZWYgVGhlIGxpc3Qgb2YgY29uZmxpY3RzIGZvciB3aGljaCB0aGUgbW9kdWxlLWlkIGhhcyBub3QgeWV0IGJlZW4KKyAgLy8vIHJlc29sdmVkLgorICBzdGQ6OnZlY3RvcjxVbnJlc29sdmVkQ29uZmxpY3Q+IFVucmVzb2x2ZWRDb25mbGljdHM7CisKKyAgLy8vIFxicmllZiBBIGNvbmZsaWN0IGJldHdlZW4gdHdvIG1vZHVsZXMuCisgIHN0cnVjdCBDb25mbGljdCB7CisgICAgLy8vIFxicmllZiBUaGUgbW9kdWxlIHRoYXQgdGhpcyBtb2R1bGUgY29uZmxpY3RzIHdpdGguCisgICAgTW9kdWxlICpPdGhlcjsKKworICAgIC8vLyBcYnJpZWYgVGhlIG1lc3NhZ2UgcHJvdmlkZWQgdG8gdGhlIHVzZXIgd2hlbiB0aGVyZSBpcyBhIGNvbmZsaWN0LgorICAgIHN0ZDo6c3RyaW5nIE1lc3NhZ2U7CisgIH07CisKKyAgLy8vIFxicmllZiBUaGUgbGlzdCBvZiBjb25mbGljdHMuCisgIHN0ZDo6dmVjdG9yPENvbmZsaWN0PiBDb25mbGljdHM7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBuZXcgbW9kdWxlIG9yIHN1Ym1vZHVsZS4KKyAgTW9kdWxlKFN0cmluZ1JlZiBOYW1lLCBTb3VyY2VMb2NhdGlvbiBEZWZpbml0aW9uTG9jLCBNb2R1bGUgKlBhcmVudCwKKyAgICAgICAgIGJvb2wgSXNGcmFtZXdvcmssIGJvb2wgSXNFeHBsaWNpdCwgdW5zaWduZWQgVmlzaWJpbGl0eUlEKTsKKyAgCisgIH5Nb2R1bGUoKTsKKyAgCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBtb2R1bGUgaXMgYXZhaWxhYmxlIGZvciB1c2Ugd2l0aGluIHRoZQorICAvLy8gY3VycmVudCB0cmFuc2xhdGlvbiB1bml0LgorICBib29sIGlzQXZhaWxhYmxlKCkgY29uc3QgeyByZXR1cm4gSXNBdmFpbGFibGU7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgbW9kdWxlIGlzIGF2YWlsYWJsZSBmb3IgdXNlIHdpdGhpbiB0aGUKKyAgLy8vIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdC4KKyAgLy8vCisgIC8vLyBccGFyYW0gTGFuZ09wdHMgVGhlIGxhbmd1YWdlIG9wdGlvbnMgdXNlZCBmb3IgdGhlIGN1cnJlbnQKKyAgLy8vIHRyYW5zbGF0aW9uIHVuaXQuCisgIC8vLworICAvLy8gXHBhcmFtIFRhcmdldCBUaGUgdGFyZ2V0IG9wdGlvbnMgdXNlZCBmb3IgdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdC4KKyAgLy8vCisgIC8vLyBccGFyYW0gUmVxIElmIHRoaXMgbW9kdWxlIGlzIHVuYXZhaWxhYmxlIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIHJlcXVpcmVtZW50LAorICAvLy8gdGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBzZXQgdG8gb25lIG9mIHRoZSByZXF1aXJlbWVudHMgdGhhdCBpcyBub3QgbWV0IGZvcgorICAvLy8gdXNlIG9mIHRoaXMgbW9kdWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNaXNzaW5nSGVhZGVyIElmIHRoaXMgbW9kdWxlIGlzIHVuYXZhaWxhYmxlIGJlY2F1c2Ugb2YgYSBtaXNzaW5nCisgIC8vLyBoZWFkZXIsIHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IHRvIG9uZSBvZiB0aGUgbWlzc2luZyBoZWFkZXJzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTaGFkb3dpbmdNb2R1bGUgSWYgdGhpcyBtb2R1bGUgaXMgdW5hdmFpbGFibGUgYmVjYXVzZSBpdCBpcworICAvLy8gc2hhZG93ZWQsIHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IHRvIHRoZSBzaGFkb3dpbmcgbW9kdWxlLgorICBib29sIGlzQXZhaWxhYmxlKGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywgCisgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5mbyAmVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgIFJlcXVpcmVtZW50ICZSZXEsCisgICAgICAgICAgICAgICAgICAgVW5yZXNvbHZlZEhlYWRlckRpcmVjdGl2ZSAmTWlzc2luZ0hlYWRlciwKKyAgICAgICAgICAgICAgICAgICBNb2R1bGUgKiZTaGFkb3dpbmdNb2R1bGUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBtb2R1bGUgaXMgYSBzdWJtb2R1bGUuCisgIGJvb2wgaXNTdWJNb2R1bGUoKSBjb25zdCB7IHJldHVybiBQYXJlbnQgIT0gbnVsbHB0cjsgfQorICAKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIG1vZHVsZSBpcyBhIHN1Ym1vZHVsZSBvZiB0aGUgZ2l2ZW4gb3RoZXIKKyAgLy8vIG1vZHVsZS4KKyAgYm9vbCBpc1N1Yk1vZHVsZU9mKGNvbnN0IE1vZHVsZSAqT3RoZXIpIGNvbnN0OworICAKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIG1vZHVsZSBpcyBhIHBhcnQgb2YgYSBmcmFtZXdvcmssCisgIC8vLyBlaXRoZXIgYmVjYXVzZSBpdCBpcyBhIGZyYW1ld29yayBtb2R1bGUgb3IgYmVjYXVzZSBpdCBpcyBhIHN1Ym1vZHVsZQorICAvLy8gb2YgYSBmcmFtZXdvcmsgbW9kdWxlLgorICBib29sIGlzUGFydE9mRnJhbWV3b3JrKCkgY29uc3QgeworICAgIGZvciAoY29uc3QgTW9kdWxlICpNb2QgPSB0aGlzOyBNb2Q7IE1vZCA9IE1vZC0+UGFyZW50KSAKKyAgICAgIGlmIChNb2QtPklzRnJhbWV3b3JrKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgbW9kdWxlIGlzIGEgc3ViZnJhbWV3b3JrIG9mIGFub3RoZXIKKyAgLy8vIGZyYW1ld29yay4KKyAgYm9vbCBpc1N1YkZyYW1ld29yaygpIGNvbnN0IHsKKyAgICByZXR1cm4gSXNGcmFtZXdvcmsgJiYgUGFyZW50ICYmIFBhcmVudC0+aXNQYXJ0T2ZGcmFtZXdvcmsoKTsKKyAgfQorCisgIC8vLyBTZXQgdGhlIHBhcmVudCBvZiB0aGlzIG1vZHVsZS4gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGlmIHRoZSBwYXJlbnQKKyAgLy8vIGNvdWxkIG5vdCBiZSBzZXQgZHVyaW5nIG1vZHVsZSBjcmVhdGlvbi4KKyAgdm9pZCBzZXRQYXJlbnQoTW9kdWxlICpNKSB7CisgICAgYXNzZXJ0KCFQYXJlbnQpOworICAgIFBhcmVudCA9IE07CisgICAgUGFyZW50LT5TdWJNb2R1bGVJbmRleFtOYW1lXSA9IFBhcmVudC0+U3ViTW9kdWxlcy5zaXplKCk7CisgICAgUGFyZW50LT5TdWJNb2R1bGVzLnB1c2hfYmFjayh0aGlzKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIG1vZHVsZSwgaW5jbHVkaW5nIHRoZSBwYXRoIGZyb20KKyAgLy8vIGl0cyB0b3AtbGV2ZWwgbW9kdWxlLgorICAvLy8gXHBhcmFtIEFsbG93U3RyaW5nTGl0ZXJhbHMgSWYgXGMgdHJ1ZSwgY29tcG9uZW50cyB0aGF0IG1pZ2h0IG5vdCBiZQorICAvLy8gICAgICAgIGxleGljYWxseSB2YWxpZCBhcyBpZGVudGlmaWVycyB3aWxsIGJlIGVtaXR0ZWQgYXMgc3RyaW5nIGxpdGVyYWxzLgorICBzdGQ6OnN0cmluZyBnZXRGdWxsTW9kdWxlTmFtZShib29sIEFsbG93U3RyaW5nTGl0ZXJhbHMgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBtb2R1bGUgaXMgZXF1YWwgdG8gam9pbmluZworICAvLy8gXHAgbmFtZVBhcnRzIHdpdGggIi4icy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gZ2V0RnVsbE1vZHVsZU5hbWUoKS4KKyAgYm9vbCBmdWxsTW9kdWxlTmFtZUlzKEFycmF5UmVmPFN0cmluZ1JlZj4gbmFtZVBhcnRzKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0b3AtbGV2ZWwgbW9kdWxlIGZvciB0aGlzIChzdWIpbW9kdWxlLCB3aGljaCBtYXkKKyAgLy8vIGJlIHRoaXMgbW9kdWxlLgorICBNb2R1bGUgKmdldFRvcExldmVsTW9kdWxlKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PE1vZHVsZSAqPigKKyAgICAgICAgICAgICBjb25zdF9jYXN0PGNvbnN0IE1vZHVsZSAqPih0aGlzKS0+Z2V0VG9wTGV2ZWxNb2R1bGUoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0b3AtbGV2ZWwgbW9kdWxlIGZvciB0aGlzIChzdWIpbW9kdWxlLCB3aGljaCBtYXkKKyAgLy8vIGJlIHRoaXMgbW9kdWxlLgorICBjb25zdCBNb2R1bGUgKmdldFRvcExldmVsTW9kdWxlKCkgY29uc3Q7CisgIAorICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSB0b3AtbGV2ZWwgbW9kdWxlLgorICBTdHJpbmdSZWYgZ2V0VG9wTGV2ZWxNb2R1bGVOYW1lKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUb3BMZXZlbE1vZHVsZSgpLT5OYW1lOworICB9CisKKyAgLy8vIFxicmllZiBUaGUgc2VyaWFsaXplZCBBU1QgZmlsZSBmb3IgdGhpcyBtb2R1bGUsIGlmIG9uZSB3YXMgY3JlYXRlZC4KKyAgY29uc3QgRmlsZUVudHJ5ICpnZXRBU1RGaWxlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUb3BMZXZlbE1vZHVsZSgpLT5BU1RGaWxlOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIHNlcmlhbGl6ZWQgQVNUIGZpbGUgZm9yIHRoZSB0b3AtbGV2ZWwgbW9kdWxlIG9mIHRoaXMgbW9kdWxlLgorICB2b2lkIHNldEFTVEZpbGUoY29uc3QgRmlsZUVudHJ5ICpGaWxlKSB7CisgICAgYXNzZXJ0KChGaWxlID09IG51bGxwdHIgfHwgZ2V0QVNURmlsZSgpID09IG51bGxwdHIgfHwKKyAgICAgICAgICAgIGdldEFTVEZpbGUoKSA9PSBGaWxlKSAmJiAiZmlsZSBwYXRoIGNoYW5nZWQiKTsKKyAgICBnZXRUb3BMZXZlbE1vZHVsZSgpLT5BU1RGaWxlID0gRmlsZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGRpcmVjdG9yeSBmb3Igd2hpY2ggdGhpcyBtb2R1bGUgc2VydmVzIGFzIHRoZQorICAvLy8gdW1icmVsbGEuCisgIERpcmVjdG9yeU5hbWUgZ2V0VW1icmVsbGFEaXIoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBoZWFkZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIHVtYnJlbGxhIGhlYWRlciBmb3IgdGhpcworICAvLy8gbW9kdWxlLgorICBIZWFkZXIgZ2V0VW1icmVsbGFIZWFkZXIoKSBjb25zdCB7CisgICAgaWYgKGF1dG8gKkUgPSBVbWJyZWxsYS5keW5fY2FzdDxjb25zdCBGaWxlRW50cnkgKj4oKSkKKyAgICAgIHJldHVybiBIZWFkZXJ7VW1icmVsbGFBc1dyaXR0ZW4sIEV9OworICAgIHJldHVybiBIZWFkZXJ7fTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBtb2R1bGUgaGFzIGFuIHVtYnJlbGxhIGRpcmVjdG9yeSB0aGF0IGlzCisgIC8vLyBub3QgYmFzZWQgb24gYW4gdW1icmVsbGEgaGVhZGVyLgorICBib29sIGhhc1VtYnJlbGxhRGlyKCkgY29uc3QgeworICAgIHJldHVybiBVbWJyZWxsYSAmJiBVbWJyZWxsYS5pczxjb25zdCBEaXJlY3RvcnlFbnRyeSAqPigpOworICB9CisKKyAgLy8vIFxicmllZiBBZGQgYSB0b3AtbGV2ZWwgaGVhZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1vZHVsZS4KKyAgdm9pZCBhZGRUb3BIZWFkZXIoY29uc3QgRmlsZUVudHJ5ICpGaWxlKSB7CisgICAgYXNzZXJ0KEZpbGUpOworICAgIFRvcEhlYWRlcnMuaW5zZXJ0KEZpbGUpOworICB9CisKKyAgLy8vIFxicmllZiBBZGQgYSB0b3AtbGV2ZWwgaGVhZGVyIGZpbGVuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1vZHVsZS4KKyAgdm9pZCBhZGRUb3BIZWFkZXJGaWxlbmFtZShTdHJpbmdSZWYgRmlsZW5hbWUpIHsKKyAgICBUb3BIZWFkZXJOYW1lcy5wdXNoX2JhY2soRmlsZW5hbWUpOworICB9CisKKyAgLy8vIFxicmllZiBUaGUgdG9wLWxldmVsIGhlYWRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbW9kdWxlLgorICBBcnJheVJlZjxjb25zdCBGaWxlRW50cnkgKj4gZ2V0VG9wSGVhZGVycyhGaWxlTWFuYWdlciAmRmlsZU1ncik7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIG1vZHVsZSBoYXMgZGVjbGFyZWQgaXRzIGludGVudGlvbiB0bworICAvLy8gZGlyZWN0bHkgdXNlIGFub3RoZXIgbW9kdWxlLgorICBib29sIGRpcmVjdGx5VXNlcyhjb25zdCBNb2R1bGUgKlJlcXVlc3RlZCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBBZGQgdGhlIGdpdmVuIGZlYXR1cmUgcmVxdWlyZW1lbnQgdG8gdGhlIGxpc3Qgb2YgZmVhdHVyZXMKKyAgLy8vIHJlcXVpcmVkIGJ5IHRoaXMgbW9kdWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBGZWF0dXJlIFRoZSBmZWF0dXJlIHRoYXQgaXMgcmVxdWlyZWQgYnkgdGhpcyBtb2R1bGUgKGFuZAorICAvLy8gaXRzIHN1Ym1vZHVsZXMpLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSZXF1aXJlZFN0YXRlIFRoZSByZXF1aXJlZCBzdGF0ZSBvZiB0aGlzIGZlYXR1cmU6IFxjIHRydWUKKyAgLy8vIGlmIGl0IG11c3QgYmUgcHJlc2VudCwgXGMgZmFsc2UgaWYgaXQgbXVzdCBiZSBhYnNlbnQuCisgIC8vLworICAvLy8gXHBhcmFtIExhbmdPcHRzIFRoZSBzZXQgb2YgbGFuZ3VhZ2Ugb3B0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB0bworICAvLy8gZXZhbHVhdGUgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGlzIGZlYXR1cmUuCisgIC8vLworICAvLy8gXHBhcmFtIFRhcmdldCBUaGUgdGFyZ2V0IG9wdGlvbnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZXZhbHVhdGUgdGhlCisgIC8vLyBhdmFpbGFiaWxpdHkgb2YgdGhpcyBmZWF0dXJlLgorICB2b2lkIGFkZFJlcXVpcmVtZW50KFN0cmluZ1JlZiBGZWF0dXJlLCBib29sIFJlcXVpcmVkU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluZm8gJlRhcmdldCk7CisKKyAgLy8vIFxicmllZiBNYXJrIHRoaXMgbW9kdWxlIGFuZCBhbGwgb2YgaXRzIHN1Ym1vZHVsZXMgYXMgdW5hdmFpbGFibGUuCisgIHZvaWQgbWFya1VuYXZhaWxhYmxlKGJvb2wgTWlzc2luZ1JlcXVpcmVtZW50ID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgRmluZCB0aGUgc3VibW9kdWxlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIHN1Ym1vZHVsZSBpZiBmb3VuZCwgb3IgTlVMTCBvdGhlcndpc2UuCisgIE1vZHVsZSAqZmluZFN1Ym1vZHVsZShTdHJpbmdSZWYgTmFtZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc3BlY2lmaWVkIG1vZHVsZSB3b3VsZCBiZSB2aXNpYmxlIHRvCisgIC8vLyBhIGxvb2t1cCBhdCB0aGUgZW5kIG9mIHRoaXMgbW9kdWxlLgorICAvLy8KKyAgLy8vIEZJWE1FOiBUaGlzIG1heSByZXR1cm4gaW5jb3JyZWN0IHJlc3VsdHMgZm9yIChzdWJtb2R1bGVzIG9mKSB0aGUKKyAgLy8vIG1vZHVsZSBjdXJyZW50bHkgYmVpbmcgYnVpbHQsIGlmIGl0J3MgcXVlcmllZCBiZWZvcmUgd2Ugc2VlIGFsbAorICAvLy8gb2YgaXRzIGltcG9ydHMuCisgIGJvb2wgaXNNb2R1bGVWaXNpYmxlKGNvbnN0IE1vZHVsZSAqTSkgY29uc3QgeworICAgIGlmIChWaXNpYmxlTW9kdWxlc0NhY2hlLmVtcHR5KCkpCisgICAgICBidWlsZFZpc2libGVNb2R1bGVzQ2FjaGUoKTsKKyAgICByZXR1cm4gVmlzaWJsZU1vZHVsZXNDYWNoZS5jb3VudChNKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFZpc2liaWxpdHlJRCgpIGNvbnN0IHsgcmV0dXJuIFZpc2liaWxpdHlJRDsgfQorCisgIHVzaW5nIHN1Ym1vZHVsZV9pdGVyYXRvciA9IHN0ZDo6dmVjdG9yPE1vZHVsZSAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIHN1Ym1vZHVsZV9jb25zdF9pdGVyYXRvciA9IHN0ZDo6dmVjdG9yPE1vZHVsZSAqPjo6Y29uc3RfaXRlcmF0b3I7CisgIAorICBzdWJtb2R1bGVfaXRlcmF0b3Igc3VibW9kdWxlX2JlZ2luKCkgeyByZXR1cm4gU3ViTW9kdWxlcy5iZWdpbigpOyB9CisgIHN1Ym1vZHVsZV9jb25zdF9pdGVyYXRvciBzdWJtb2R1bGVfYmVnaW4oKSBjb25zdCB7cmV0dXJuIFN1Yk1vZHVsZXMuYmVnaW4oKTt9CisgIHN1Ym1vZHVsZV9pdGVyYXRvciBzdWJtb2R1bGVfZW5kKCkgICB7IHJldHVybiBTdWJNb2R1bGVzLmVuZCgpOyB9CisgIHN1Ym1vZHVsZV9jb25zdF9pdGVyYXRvciBzdWJtb2R1bGVfZW5kKCkgY29uc3QgeyByZXR1cm4gU3ViTW9kdWxlcy5lbmQoKTsgfQorCisgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHN1Ym1vZHVsZV9pdGVyYXRvcj4gc3VibW9kdWxlcygpIHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZV9yYW5nZShzdWJtb2R1bGVfYmVnaW4oKSwgc3VibW9kdWxlX2VuZCgpKTsKKyAgfQorICBsbHZtOjppdGVyYXRvcl9yYW5nZTxzdWJtb2R1bGVfY29uc3RfaXRlcmF0b3I+IHN1Ym1vZHVsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VfcmFuZ2Uoc3VibW9kdWxlX2JlZ2luKCksIHN1Ym1vZHVsZV9lbmQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIEFwcGVuZHMgdGhpcyBtb2R1bGUncyBsaXN0IG9mIGV4cG9ydGVkIG1vZHVsZXMgdG8gXHAgRXhwb3J0ZWQuCisgIC8vLworICAvLy8gVGhpcyBwcm92aWRlcyBhIHN1YnNldCBvZiBpbW1lZGlhdGVseSBpbXBvcnRlZCBtb2R1bGVzICh0aGUgb25lcyB0aGF0IGFyZQorICAvLy8gZGlyZWN0bHkgZXhwb3J0ZWQpLCBub3QgdGhlIGNvbXBsZXRlIHNldCBvZiBleHBvcnRlZCBtb2R1bGVzLgorICB2b2lkIGdldEV4cG9ydGVkTW9kdWxlcyhTbWFsbFZlY3RvckltcGw8TW9kdWxlICo+ICZFeHBvcnRlZCkgY29uc3Q7CisKKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRNb2R1bGVJbnB1dEJ1ZmZlck5hbWUoKSB7CisgICAgcmV0dXJuICI8bW9kdWxlLWluY2x1ZGVzPiI7CisgIH0KKworICAvLy8gXGJyaWVmIFByaW50IHRoZSBtb2R1bGUgbWFwIGZvciB0aGlzIG1vZHVsZSB0byB0aGUgZ2l2ZW4gc3RyZWFtLiAKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIEluZGVudCA9IDApIGNvbnN0OworICAKKyAgLy8vIFxicmllZiBEdW1wIHRoZSBjb250ZW50cyBvZiB0aGlzIG1vZHVsZSB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIHZvaWQgYnVpbGRWaXNpYmxlTW9kdWxlc0NhY2hlKCkgY29uc3Q7Cit9OworCisvLy8gXGJyaWVmIEEgc2V0IG9mIHZpc2libGUgbW9kdWxlcy4KK2NsYXNzIFZpc2libGVNb2R1bGVTZXQgeworcHVibGljOgorICBWaXNpYmxlTW9kdWxlU2V0KCkgPSBkZWZhdWx0OworICBWaXNpYmxlTW9kdWxlU2V0KFZpc2libGVNb2R1bGVTZXQgJiZPKQorICAgICAgOiBJbXBvcnRMb2NzKHN0ZDo6bW92ZShPLkltcG9ydExvY3MpKSwgR2VuZXJhdGlvbihPLkdlbmVyYXRpb24gPyAxIDogMCkgeworICAgIE8uSW1wb3J0TG9jcy5jbGVhcigpOworICAgICsrTy5HZW5lcmF0aW9uOworICB9CisKKyAgLy8vIE1vdmUgZnJvbSBhbm90aGVyIHZpc2libGUgbW9kdWxlcyBzZXQuIEd1YXJhbnRlZWQgdG8gbGVhdmUgdGhlIHNvdXJjZQorICAvLy8gZW1wdHkgYW5kIGJ1bXAgdGhlIGdlbmVyYXRpb24gb24gYm90aC4KKyAgVmlzaWJsZU1vZHVsZVNldCAmb3BlcmF0b3I9KFZpc2libGVNb2R1bGVTZXQgJiZPKSB7CisgICAgSW1wb3J0TG9jcyA9IHN0ZDo6bW92ZShPLkltcG9ydExvY3MpOworICAgIE8uSW1wb3J0TG9jcy5jbGVhcigpOworICAgICsrTy5HZW5lcmF0aW9uOworICAgICsrR2VuZXJhdGlvbjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgY3VycmVudCB2aXNpYmlsaXR5IGdlbmVyYXRpb24uIEluY3JlbWVudGVkIGVhY2ggdGltZSB0aGUKKyAgLy8vIHNldCBvZiB2aXNpYmxlIG1vZHVsZXMgY2hhbmdlcyBpbiBhbnkgd2F5LgorICB1bnNpZ25lZCBnZXRHZW5lcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gR2VuZXJhdGlvbjsgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgYSBtb2R1bGUgaXMgdmlzaWJsZS4KKyAgYm9vbCBpc1Zpc2libGUoY29uc3QgTW9kdWxlICpNKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEltcG9ydExvYyhNKS5pc1ZhbGlkKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbG9jYXRpb24gYXQgd2hpY2ggdGhlIGltcG9ydCBvZiBhIG1vZHVsZSB3YXMgdHJpZ2dlcmVkLgorICBTb3VyY2VMb2NhdGlvbiBnZXRJbXBvcnRMb2MoY29uc3QgTW9kdWxlICpNKSBjb25zdCB7CisgICAgcmV0dXJuIE0tPmdldFZpc2liaWxpdHlJRCgpIDwgSW1wb3J0TG9jcy5zaXplKCkKKyAgICAgICAgICAgICAgID8gSW1wb3J0TG9jc1tNLT5nZXRWaXNpYmlsaXR5SUQoKV0KKyAgICAgICAgICAgICAgIDogU291cmNlTG9jYXRpb24oKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQSBjYWxsYmFjayB0byBjYWxsIHdoZW4gYSBtb2R1bGUgaXMgbWFkZSB2aXNpYmxlIChkaXJlY3RseSBvcgorICAvLy8gaW5kaXJlY3RseSkgYnkgYSBjYWxsIHRvIFxyZWYgc2V0VmlzaWJsZS4KKyAgdXNpbmcgVmlzaWJsZUNhbGxiYWNrID0gbGx2bTo6ZnVuY3Rpb25fcmVmPHZvaWQoTW9kdWxlICpNKT47CisKKyAgLy8vIFxicmllZiBBIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiBhIG1vZHVsZSBjb25mbGljdCBpcyBmb3VuZC4gXHAgUGF0aAorICAvLy8gY29uc2lzdHMgb2YgYSBzZXF1ZW5jZSBvZiBtb2R1bGVzIGZyb20gdGhlIGNvbmZsaWN0aW5nIG1vZHVsZSB0byB0aGUgb25lCisgIC8vLyBtYWRlIHZpc2libGUsIHdoZXJlIGVhY2ggd2FzIGV4cG9ydGVkIGJ5IHRoZSBuZXh0LgorICB1c2luZyBDb25mbGljdENhbGxiYWNrID0KKyAgICAgIGxsdm06OmZ1bmN0aW9uX3JlZjx2b2lkKEFycmF5UmVmPE1vZHVsZSAqPiBQYXRoLCBNb2R1bGUgKkNvbmZsaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNZXNzYWdlKT47CisKKyAgLy8vIFxicmllZiBNYWtlIGEgc3BlY2lmaWMgbW9kdWxlIHZpc2libGUuCisgIHZvaWQgc2V0VmlzaWJsZShNb2R1bGUgKk0sIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgIFZpc2libGVDYWxsYmFjayBWaXMgPSBbXShNb2R1bGUgKikge30sCisgICAgICAgICAgICAgICAgICBDb25mbGljdENhbGxiYWNrIENiID0gW10oQXJyYXlSZWY8TW9kdWxlICo+LCBNb2R1bGUgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYpIHt9KTsKKworcHJpdmF0ZToKKyAgLy8vIEltcG9ydCBsb2NhdGlvbnMgZm9yIGVhY2ggdmlzaWJsZSBtb2R1bGUuIEluZGV4ZWQgYnkgdGhlIG1vZHVsZSdzCisgIC8vLyBWaXNpYmlsaXR5SUQuCisgIHN0ZDo6dmVjdG9yPFNvdXJjZUxvY2F0aW9uPiBJbXBvcnRMb2NzOworCisgIC8vLyBWaXNpYmlsaXR5IGdlbmVyYXRpb24sIGJ1bXBlZCBldmVyeSB0aW1lIHRoZSB2aXNpYmlsaXR5IHN0YXRlIGNoYW5nZXMuCisgIHVuc2lnbmVkIEdlbmVyYXRpb24gPSAwOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQkFTSUNfTU9EVUxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL09iakNSdW50aW1lLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9PYmpDUnVudGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MTgwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9PYmpDUnVudGltZS5oCkBAIC0wLDAgKzEsMzY1IEBACisvLz09PS0gT2JqQ1J1bnRpbWUuaCAtIE9iamVjdGl2ZS1DIFJ1bnRpbWUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHR5cGVzIHVzZWZ1bCBmb3IgZGVzY3JpYmluZyBhbiBPYmplY3RpdmUtQyBydW50aW1lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19PQkpDUlVOVElNRV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfT0JKQ1JVTlRJTUVfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1ZlcnNpb25UdXBsZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgY2xhbmcgeworCisvLy8gXGJyaWVmIFRoZSBiYXNpYyBhYnN0cmFjdGlvbiBmb3IgdGhlIHRhcmdldCBPYmplY3RpdmUtQyBydW50aW1lLgorY2xhc3MgT2JqQ1J1bnRpbWUgeworcHVibGljOgorICAvLy8gXGJyaWVmIFRoZSBiYXNpYyBPYmplY3RpdmUtQyBydW50aW1lcyB0aGF0IHdlIGtub3cgYWJvdXQuCisgIGVudW0gS2luZCB7CisgICAgLy8vICdtYWNvc3gnIGlzIHRoZSBBcHBsZS1wcm92aWRlZCBOZVhULWRlcml2ZWQgcnVudGltZSBvbiBNYWMgT1MKKyAgICAvLy8gWCBwbGF0Zm9ybXMgdGhhdCB1c2UgdGhlIG5vbi1mcmFnaWxlIEFCSTsgdGhlIHZlcnNpb24gaXMgYQorICAgIC8vLyByZWxlYXNlIG9mIHRoYXQgT1MuCisgICAgTWFjT1NYLAorCisgICAgLy8vICdtYWNvc3gtZnJhZ2lsZScgaXMgdGhlIEFwcGxlLXByb3ZpZGVkIE5lWFQtZGVyaXZlZCBydW50aW1lIG9uCisgICAgLy8vIE1hYyBPUyBYIHBsYXRmb3JtcyB0aGF0IHVzZSB0aGUgZnJhZ2lsZSBBQkk7IHRoZSB2ZXJzaW9uIGlzIGEKKyAgICAvLy8gcmVsZWFzZSBvZiB0aGF0IE9TLgorICAgIEZyYWdpbGVNYWNPU1gsCisKKyAgICAvLy8gJ2lvcycgaXMgdGhlIEFwcGxlLXByb3ZpZGVkIE5lWFQtZGVyaXZlZCBydW50aW1lIG9uIGlPUyBvciB0aGUgaU9TCisgICAgLy8vIHNpbXVsYXRvcjsgIGl0IGlzIGFsd2F5cyBub24tZnJhZ2lsZS4gIFRoZSB2ZXJzaW9uIGlzIGEgcmVsZWFzZQorICAgIC8vLyB2ZXJzaW9uIG9mIGlPUy4KKyAgICBpT1MsCisKKyAgICAvLy8gJ3dhdGNob3MnIGlzIGEgdmFyaWFudCBvZiBpT1MgZm9yIEFwcGxlJ3Mgd2F0Y2hPUy4gVGhlIHZlcnNpb24KKyAgICAvLy8gaXMgYSByZWxlYXNlIHZlcnNpb24gb2Ygd2F0Y2hPUy4KKyAgICBXYXRjaE9TLAorCisgICAgLy8vICdnY2MnIGlzIHRoZSBPYmplY3RpdmUtQyBydW50aW1lIHNoaXBwZWQgd2l0aCBHQ0MsIGltcGxlbWVudGluZyBhCisgICAgLy8vIGZyYWdpbGUgT2JqZWN0aXZlLUMgQUJJCisgICAgR0NDLAorCisgICAgLy8vICdnbnVzdGVwJyBpcyB0aGUgbW9kZXJuIG5vbi1mcmFnaWxlIEdOVXN0ZXAgcnVudGltZS4KKyAgICBHTlVzdGVwLAorCisgICAgLy8vICdvYmpmdycgaXMgdGhlIE9iamVjdGl2ZS1DIHJ1bnRpbWUgaW5jbHVkZWQgaW4gT2JqRlcKKyAgICBPYmpGVworICB9OworCitwcml2YXRlOgorICBLaW5kIFRoZUtpbmQgPSBNYWNPU1g7CisgIFZlcnNpb25UdXBsZSBWZXJzaW9uOworCitwdWJsaWM6CisgIC8vLyBBIGJvZ3VzIGluaXRpYWxpemF0aW9uIG9mIHRoZSBydW50aW1lLgorICBPYmpDUnVudGltZSgpID0gZGVmYXVsdDsKKyAgT2JqQ1J1bnRpbWUoS2luZCBraW5kLCBjb25zdCBWZXJzaW9uVHVwbGUgJnZlcnNpb24pCisgICAgICA6IFRoZUtpbmQoa2luZCksIFZlcnNpb24odmVyc2lvbikge30KKworICB2b2lkIHNldChLaW5kIGtpbmQsIFZlcnNpb25UdXBsZSB2ZXJzaW9uKSB7CisgICAgVGhlS2luZCA9IGtpbmQ7CisgICAgVmVyc2lvbiA9IHZlcnNpb247CisgIH0KKworICBLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBUaGVLaW5kOyB9CisgIGNvbnN0IFZlcnNpb25UdXBsZSAmZ2V0VmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIFZlcnNpb247IH0KKworICAvLy8gXGJyaWVmIERvZXMgdGhpcyBydW50aW1lIGZvbGxvdyB0aGUgc2V0IG9mIGltcGxpZWQgYmVoYXZpb3JzIGZvciBhCisgIC8vLyAibm9uLWZyYWdpbGUiIEFCST8KKyAgYm9vbCBpc05vbkZyYWdpbGUoKSBjb25zdCB7CisgICAgc3dpdGNoIChnZXRLaW5kKCkpIHsKKyAgICBjYXNlIEZyYWdpbGVNYWNPU1g6IHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEdDQzogcmV0dXJuIGZhbHNlOworICAgIGNhc2UgTWFjT1NYOiByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIEdOVXN0ZXA6IHJldHVybiB0cnVlOworICAgIGNhc2UgT2JqRlc6IHJldHVybiB0cnVlOworICAgIGNhc2UgaU9TOiByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIFdhdGNoT1M6IHJldHVybiB0cnVlOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJiYWQga2luZCIpOworICB9CisKKyAgLy8vIFRoZSBpbnZlcnNlIG9mIGlzTm9uRnJhZ2lsZSgpOiAgZG9lcyB0aGlzIHJ1bnRpbWUgZm9sbG93IHRoZSBzZXQgb2YKKyAgLy8vIGltcGxpZWQgYmVoYXZpb3JzIGZvciBhICJmcmFnaWxlIiBBQkk/CisgIGJvb2wgaXNGcmFnaWxlKCkgY29uc3QgeyByZXR1cm4gIWlzTm9uRnJhZ2lsZSgpOyB9CisKKyAgLy8vIFRoZSBkZWZhdWx0IGRpc3BhdGNoIG1lY2hhbmlzbSB0byB1c2UgZm9yIHRoZSBzcGVjaWZpZWQgYXJjaGl0ZWN0dXJlCisgIGJvb2wgaXNMZWdhY3lEaXNwYXRjaERlZmF1bHRGb3JBcmNoKGxsdm06OlRyaXBsZTo6QXJjaFR5cGUgQXJjaCkgeworICAgIC8vIFRoZSBHTlVzdGVwIHJ1bnRpbWUgdXNlcyBhIG5ld2VyIGRpc3BhdGNoIG1ldGhvZCBieSBkZWZhdWx0IGZyb20KKyAgICAvLyB2ZXJzaW9uIDEuNiBvbndhcmRzCisgICAgaWYgKGdldEtpbmQoKSA9PSBHTlVzdGVwICYmIGdldFZlcnNpb24oKSA+PSBWZXJzaW9uVHVwbGUoMSwgNikpIHsKKyAgICAgIGlmIChBcmNoID09IGxsdm06OlRyaXBsZTo6YXJtIHx8CisgICAgICAgICAgQXJjaCA9PSBsbHZtOjpUcmlwbGU6Ong4NiB8fAorICAgICAgICAgIEFyY2ggPT0gbGx2bTo6VHJpcGxlOjp4ODZfNjQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZWxzZSBpZiAoKGdldEtpbmQoKSA9PSAgTWFjT1NYKSAmJiBpc05vbkZyYWdpbGUoKSAmJgorICAgICAgICAgICAgIChnZXRWZXJzaW9uKCkgPj0gVmVyc2lvblR1cGxlKDEwLCAwKSkgJiYKKyAgICAgICAgICAgICAoZ2V0VmVyc2lvbigpIDwgVmVyc2lvblR1cGxlKDEwLCA2KSkpCisgICAgICAgIHJldHVybiBBcmNoICE9IGxsdm06OlRyaXBsZTo6eDg2XzY0OworICAgIC8vIEV4Y2VwdCBmb3IgZGVwbG95bWVudCB0YXJnZXQgb2YgMTAuNSBvciBsZXNzLAorICAgIC8vIE1hYyBydW50aW1lcyB1c2UgbGVnYWN5IGRpc3BhdGNoIGV2ZXJ5d2hlcmUgbm93LgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFxicmllZiBJcyB0aGlzIHJ1bnRpbWUgYmFzaWNhbGx5IG9mIHRoZSBHTlUgZmFtaWx5IG9mIHJ1bnRpbWVzPworICBib29sIGlzR05VRmFtaWx5KCkgY29uc3QgeworICAgIHN3aXRjaCAoZ2V0S2luZCgpKSB7CisgICAgY2FzZSBGcmFnaWxlTWFjT1NYOgorICAgIGNhc2UgTWFjT1NYOgorICAgIGNhc2UgaU9TOgorICAgIGNhc2UgV2F0Y2hPUzoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEdDQzoKKyAgICBjYXNlIEdOVXN0ZXA6CisgICAgY2FzZSBPYmpGVzoKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJiYWQga2luZCIpOworICB9CisKKyAgLy8vIFxicmllZiBJcyB0aGlzIHJ1bnRpbWUgYmFzaWNhbGx5IG9mIHRoZSBOZVhUIGZhbWlseSBvZiBydW50aW1lcz8KKyAgYm9vbCBpc05lWFRGYW1pbHkoKSBjb25zdCB7CisgICAgLy8gRm9yIG5vdywgdGhpcyBpcyBqdXN0IHRoZSBpbnZlcnNlIG9mIGlzR05VRmFtaWx5KCksIGJ1dCB0aGF0J3MKKyAgICAvLyBub3QgaW5oZXJlbnRseSB0cnVlLgorICAgIHJldHVybiAhaXNHTlVGYW1pbHkoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRG9lcyB0aGlzIHJ1bnRpbWUgYWxsb3cgQVJDIGF0IGFsbD8KKyAgYm9vbCBhbGxvd3NBUkMoKSBjb25zdCB7CisgICAgc3dpdGNoIChnZXRLaW5kKCkpIHsKKyAgICBjYXNlIEZyYWdpbGVNYWNPU1g6CisgICAgICAvLyBObyBzdHViIGxpYnJhcnkgZm9yIHRoZSBmcmFnaWxlIHJ1bnRpbWUuCisgICAgICByZXR1cm4gZ2V0VmVyc2lvbigpID49IFZlcnNpb25UdXBsZSgxMCwgNyk7CisgICAgY2FzZSBNYWNPU1g6IHJldHVybiB0cnVlOworICAgIGNhc2UgaU9TOiByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIFdhdGNoT1M6IHJldHVybiB0cnVlOworICAgIGNhc2UgR0NDOiByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBHTlVzdGVwOiByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIE9iakZXOiByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiYmFkIGtpbmQiKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRG9lcyB0aGlzIHJ1bnRpbWUgbmF0aXZlbHkgcHJvdmlkZSB0aGUgQVJDIGVudHJ5cG9pbnRzPyAKKyAgLy8vCisgIC8vLyBBUkMgY2Fubm90IGJlIGRpcmVjdGx5IHN1cHBvcnRlZCBvbiBhIHBsYXRmb3JtIHRoYXQgZG9lcyBub3QgcHJvdmlkZQorICAvLy8gdGhlc2UgZW50cnlwb2ludHMsIGFsdGhvdWdoIGl0IG1heSBiZSBzdXBwb3J0YWJsZSB2aWEgYSBzdHViCisgIC8vLyBsaWJyYXJ5LgorICBib29sIGhhc05hdGl2ZUFSQygpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKGdldEtpbmQoKSkgeworICAgIGNhc2UgRnJhZ2lsZU1hY09TWDogcmV0dXJuIGdldFZlcnNpb24oKSA+PSBWZXJzaW9uVHVwbGUoMTAsIDcpOworICAgIGNhc2UgTWFjT1NYOiByZXR1cm4gZ2V0VmVyc2lvbigpID49IFZlcnNpb25UdXBsZSgxMCwgNyk7CisgICAgY2FzZSBpT1M6IHJldHVybiBnZXRWZXJzaW9uKCkgPj0gVmVyc2lvblR1cGxlKDUpOworICAgIGNhc2UgV2F0Y2hPUzogcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIEdDQzogcmV0dXJuIGZhbHNlOworICAgIGNhc2UgR05Vc3RlcDogcmV0dXJuIGdldFZlcnNpb24oKSA+PSBWZXJzaW9uVHVwbGUoMSwgNik7CisgICAgY2FzZSBPYmpGVzogcmV0dXJuIHRydWU7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoImJhZCBraW5kIik7CisgIH0KKworICAvLy8gXGJyaWVmIERvZXMgdGhpcyBydW50aW1lIHN1cHBvcnRzIG9wdGltaXplZCBzZXR0ZXIgZW50cnlwb2ludHM/CisgIGJvb2wgaGFzT3B0aW1pemVkU2V0dGVyKCkgY29uc3QgeworICAgIHN3aXRjaCAoZ2V0S2luZCgpKSB7CisgICAgICBjYXNlIE1hY09TWDoKKyAgICAgICAgcmV0dXJuIGdldFZlcnNpb24oKSA+PSBWZXJzaW9uVHVwbGUoMTAsIDgpOworICAgICAgY2FzZSBpT1M6CisgICAgICAgIHJldHVybiAoZ2V0VmVyc2lvbigpID49IFZlcnNpb25UdXBsZSg2KSk7CisgICAgICBjYXNlIFdhdGNoT1M6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY2FzZSBHTlVzdGVwOgorICAgICAgICByZXR1cm4gZ2V0VmVyc2lvbigpID49IFZlcnNpb25UdXBsZSgxLCA3KTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLy8gRG9lcyB0aGlzIHJ1bnRpbWUgYWxsb3cgdGhlIHVzZSBvZiBfX3dlYWs/CisgIGJvb2wgYWxsb3dzV2VhaygpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzTmF0aXZlV2VhaygpOworICB9CisKKyAgLy8vIFxicmllZiBEb2VzIHRoaXMgcnVudGltZSBuYXRpdmVseSBwcm92aWRlIEFSQy1jb21wbGlhbnQgJ3dlYWsnCisgIC8vLyBlbnRyeXBvaW50cz8KKyAgYm9vbCBoYXNOYXRpdmVXZWFrKCkgY29uc3QgeworICAgIC8vIFJpZ2h0IG5vdywgdGhpcyBpcyBhbHdheXMgZXF1aXZhbGVudCB0byB3aGV0aGVyIHRoZSBydW50aW1lCisgICAgLy8gbmF0aXZlbHkgc3VwcG9ydHMgQVJDIGRlY2lzaW9uLgorICAgIHJldHVybiBoYXNOYXRpdmVBUkMoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRG9lcyB0aGlzIHJ1bnRpbWUgZGlyZWN0bHkgc3VwcG9ydCB0aGUgc3Vic2NyaXB0aW5nIG1ldGhvZHM/CisgIC8vLworICAvLy8gVGhpcyBpcyByZWFsbHkgYSBwcm9wZXJ0eSBvZiB0aGUgbGlicmFyeSwgbm90IHRoZSBydW50aW1lLgorICBib29sIGhhc1N1YnNjcmlwdGluZygpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKGdldEtpbmQoKSkgeworICAgIGNhc2UgRnJhZ2lsZU1hY09TWDogcmV0dXJuIGZhbHNlOworICAgIGNhc2UgTWFjT1NYOiByZXR1cm4gZ2V0VmVyc2lvbigpID49IFZlcnNpb25UdXBsZSgxMCwgMTEpOworICAgIGNhc2UgaU9TOiByZXR1cm4gZ2V0VmVyc2lvbigpID49IFZlcnNpb25UdXBsZSg5KTsKKyAgICBjYXNlIFdhdGNoT1M6IHJldHVybiB0cnVlOworCisgICAgLy8gVGhpcyBpcyByZWFsbHkgYSBsaWUsIGJlY2F1c2Ugc29tZSBpbXBsZW1lbnRhdGlvbnMgYW5kIHZlcnNpb25zCisgICAgLy8gb2YgdGhlIHJ1bnRpbWUgZG8gbm90IHN1cHBvcnQgQVJDLiAgUHJvYmFibHkgLWZnbnUtcnVudGltZQorICAgIC8vIHNob3VsZCBpbXBseSBhICJtYXhpbWFsIiBydW50aW1lIG9yIHNvbWV0aGluZz8KKyAgICBjYXNlIEdDQzogcmV0dXJuIHRydWU7CisgICAgY2FzZSBHTlVzdGVwOiByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIE9iakZXOiByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiYmFkIGtpbmQiKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRG9lcyB0aGlzIHJ1bnRpbWUgYWxsb3cgc2l6ZW9mIG9yIGFsaWdub2Ygb24gb2JqZWN0IHR5cGVzPworICBib29sIGFsbG93c1NpemVvZkFsaWdub2YoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRnJhZ2lsZSgpOworICB9CisKKyAgLy8vIFxicmllZiBEb2VzIHRoaXMgcnVudGltZSBhbGxvdyBwb2ludGVyIGFyaXRobWV0aWMgb24gb2JqZWN0cz8KKyAgLy8vCisgIC8vLyBUaGlzIGNvdmVycyArLCAtLCArKywgLS0sIGFuZCAoaWYgaXNTdWJzY3JpcHRQb2ludGVyQXJpdGhtZXRpYygpCisgIC8vLyB5aWVsZHMgdHJ1ZSkgW10uCisgIGJvb2wgYWxsb3dzUG9pbnRlckFyaXRobWV0aWMoKSBjb25zdCB7CisgICAgc3dpdGNoIChnZXRLaW5kKCkpIHsKKyAgICBjYXNlIEZyYWdpbGVNYWNPU1g6CisgICAgY2FzZSBHQ0M6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIE1hY09TWDoKKyAgICBjYXNlIGlPUzoKKyAgICBjYXNlIFdhdGNoT1M6CisgICAgY2FzZSBHTlVzdGVwOgorICAgIGNhc2UgT2JqRlc6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoImJhZCBraW5kIik7CisgIH0KKworICAvLy8gXGJyaWVmIElzIHN1YnNjcmlwdGluZyBwb2ludGVyIGFyaXRobWV0aWM/CisgIGJvb2wgaXNTdWJzY3JpcHRQb2ludGVyQXJpdGhtZXRpYygpIGNvbnN0IHsKKyAgICByZXR1cm4gYWxsb3dzUG9pbnRlckFyaXRobWV0aWMoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRG9lcyB0aGlzIHJ1bnRpbWUgcHJvdmlkZSBhbiBvYmpjX3Rlcm1pbmF0ZSBmdW5jdGlvbj8KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgaW4gaGFuZGxlcnMgZm9yIGV4Y2VwdGlvbnMgZHVyaW5nIHRoZSB1bndpbmQgcHJvY2VzczsKKyAgLy8vIHdpdGhvdXQgaXQsIGFib3J0KCkgbXVzdCBiZSB1c2VkIGluIHB1cmUgT2JqQyBmaWxlcy4KKyAgYm9vbCBoYXNUZXJtaW5hdGUoKSBjb25zdCB7CisgICAgc3dpdGNoIChnZXRLaW5kKCkpIHsKKyAgICBjYXNlIEZyYWdpbGVNYWNPU1g6IHJldHVybiBnZXRWZXJzaW9uKCkgPj0gVmVyc2lvblR1cGxlKDEwLCA4KTsKKyAgICBjYXNlIE1hY09TWDogcmV0dXJuIGdldFZlcnNpb24oKSA+PSBWZXJzaW9uVHVwbGUoMTAsIDgpOworICAgIGNhc2UgaU9TOiByZXR1cm4gZ2V0VmVyc2lvbigpID49IFZlcnNpb25UdXBsZSg1KTsKKyAgICBjYXNlIFdhdGNoT1M6IHJldHVybiB0cnVlOworICAgIGNhc2UgR0NDOiByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBHTlVzdGVwOiByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBPYmpGVzogcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJiYWQga2luZCIpOworICB9CisKKyAgLy8vIFxicmllZiBEb2VzIHRoaXMgcnVudGltZSBzdXBwb3J0IHdlYWtseSBpbXBvcnRpbmcgY2xhc3Nlcz8KKyAgYm9vbCBoYXNXZWFrQ2xhc3NJbXBvcnQoKSBjb25zdCB7CisgICAgc3dpdGNoIChnZXRLaW5kKCkpIHsKKyAgICBjYXNlIE1hY09TWDogcmV0dXJuIHRydWU7CisgICAgY2FzZSBpT1M6IHJldHVybiB0cnVlOworICAgIGNhc2UgV2F0Y2hPUzogcmV0dXJuIHRydWU7CisgICAgY2FzZSBGcmFnaWxlTWFjT1NYOiByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBHQ0M6IHJldHVybiB0cnVlOworICAgIGNhc2UgR05Vc3RlcDogcmV0dXJuIHRydWU7CisgICAgY2FzZSBPYmpGVzogcmV0dXJuIHRydWU7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoImJhZCBraW5kIik7CisgIH0KKworICAvLy8gXGJyaWVmIERvZXMgdGhpcyBydW50aW1lIHVzZSB6ZXJvLWNvc3QgZXhjZXB0aW9ucz8KKyAgYm9vbCBoYXNVbndpbmRFeGNlcHRpb25zKCkgY29uc3QgeworICAgIHN3aXRjaCAoZ2V0S2luZCgpKSB7CisgICAgY2FzZSBNYWNPU1g6IHJldHVybiB0cnVlOworICAgIGNhc2UgaU9TOiByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIFdhdGNoT1M6IHJldHVybiB0cnVlOworICAgIGNhc2UgRnJhZ2lsZU1hY09TWDogcmV0dXJuIGZhbHNlOworICAgIGNhc2UgR0NDOiByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIEdOVXN0ZXA6IHJldHVybiB0cnVlOworICAgIGNhc2UgT2JqRlc6IHJldHVybiB0cnVlOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJiYWQga2luZCIpOworICB9CisKKyAgYm9vbCBoYXNBdG9taWNDb3B5SGVscGVyKCkgY29uc3QgeworICAgIHN3aXRjaCAoZ2V0S2luZCgpKSB7CisgICAgY2FzZSBGcmFnaWxlTWFjT1NYOgorICAgIGNhc2UgTWFjT1NYOgorICAgIGNhc2UgaU9TOgorICAgIGNhc2UgV2F0Y2hPUzoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgR05Vc3RlcDoKKyAgICAgIHJldHVybiBnZXRWZXJzaW9uKCkgPj0gVmVyc2lvblR1cGxlKDEsIDcpOworICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLy8gSXMgb2JqY191bnNhZmVDbGFpbUF1dG9yZWxlYXNlZFJldHVyblZhbHVlIGF2YWlsYWJsZT8KKyAgYm9vbCBoYXNBUkNVbnNhZmVDbGFpbUF1dG9yZWxlYXNlZFJldHVyblZhbHVlKCkgY29uc3QgeworICAgIHN3aXRjaCAoZ2V0S2luZCgpKSB7CisgICAgY2FzZSBNYWNPU1g6CisgICAgY2FzZSBGcmFnaWxlTWFjT1NYOgorICAgICAgcmV0dXJuIGdldFZlcnNpb24oKSA+PSBWZXJzaW9uVHVwbGUoMTAsIDExKTsKKyAgICBjYXNlIGlPUzoKKyAgICAgIHJldHVybiBnZXRWZXJzaW9uKCkgPj0gVmVyc2lvblR1cGxlKDkpOworICAgIGNhc2UgV2F0Y2hPUzoKKyAgICAgIHJldHVybiBnZXRWZXJzaW9uKCkgPj0gVmVyc2lvblR1cGxlKDIpOworICAgIGNhc2UgR05Vc3RlcDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vLyBBcmUgdGhlIGVtcHR5IGNvbGxlY3Rpb24gc3ltYm9scyBhdmFpbGFibGU/CisgIGJvb2wgaGFzRW1wdHlDb2xsZWN0aW9ucygpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKGdldEtpbmQoKSkgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBNYWNPU1g6CisgICAgICByZXR1cm4gZ2V0VmVyc2lvbigpID49IFZlcnNpb25UdXBsZSgxMCwgMTEpOworICAgIGNhc2UgaU9TOgorICAgICAgcmV0dXJuIGdldFZlcnNpb24oKSA+PSBWZXJzaW9uVHVwbGUoOSk7CisgICAgY2FzZSBXYXRjaE9TOgorICAgICAgcmV0dXJuIGdldFZlcnNpb24oKSA+PSBWZXJzaW9uVHVwbGUoMik7CisgICAgfQorICB9CisKKyAgLy8vIFxicmllZiBUcnkgdG8gcGFyc2UgYW4gT2JqZWN0aXZlLUMgcnVudGltZSBzcGVjaWZpY2F0aW9uIGZyb20gdGhlIGdpdmVuCisgIC8vLyBzdHJpbmcuCisgIC8vLworICAvLy8gXHJldHVybiB0cnVlIG9uIGVycm9yLgorICBib29sIHRyeVBhcnNlKFN0cmluZ1JlZiBpbnB1dCk7CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdDsKKworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE9iakNSdW50aW1lICZsZWZ0LCBjb25zdCBPYmpDUnVudGltZSAmcmlnaHQpIHsKKyAgICByZXR1cm4gbGVmdC5nZXRLaW5kKCkgPT0gcmlnaHQuZ2V0S2luZCgpICYmCisgICAgICAgICAgIGxlZnQuZ2V0VmVyc2lvbigpID09IHJpZ2h0LmdldFZlcnNpb24oKTsKKyAgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgT2JqQ1J1bnRpbWUgJmxlZnQsIGNvbnN0IE9iakNSdW50aW1lICZyaWdodCkgeworICAgIHJldHVybiAhKGxlZnQgPT0gcmlnaHQpOworICB9Cit9OworCityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmb3V0LCBjb25zdCBPYmpDUnVudGltZSAmdmFsdWUpOworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19CQVNJQ19PQkpDUlVOVElNRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9PcGVuQ0xFeHRlbnNpb25zLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL09wZW5DTEV4dGVuc2lvbnMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzY2IxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9PcGVuQ0xFeHRlbnNpb25zLmRlZgpAQCAtMCwwICsxLDkzIEBACisvLz09PS0tLSBPcGVuQ0xFeHRlbnNpb25zLmRlZiAtIE9wZW5DTCBleHRlbnNpb24gbGlzdCAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBPcGVuQ0wgZXh0ZW5zaW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBNYWNybyBPUEVOQ0xFWFQgb3IgT1BFTkNMRVhUX0lOVEVSTkFMIGNhbiBiZSBkZWZpbmVkIHRvIGVudW1lcmF0ZSB0aGUKKy8vIE9wZW5DTCBleHRlbnNpb25zIGxpc3RlZCBpbiB0aGlzIGZpbGUuCisvLworLy8gSWYgdGhlIGV4dGVuc2lvbnMgYXJlIHRvIGJlIGVudW1lcmF0ZWQgd2l0aG91dCB0aGUgc3VwcG9ydGVkIE9wZW5DTCB2ZXJzaW9uLAorLy8gZGVmaW5lIE9QRU5DTEVYVChleHQpIHdoZXJlIGV4dCBpcyB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uLgorLy8KKy8vIElmIHRoZSBleHRlbnNpb25zIGFyZSB0byBiZSBlbnVtZXJhdGVkIHdpdGggc3VwcG9ydGVkIE9wZW5DTCB2ZXJzaW9uLAorLy8gZGVmaW5lIE9QRU5DTEVYVF9JTlRFUk5BTChleHQsIGF2YWlsLCBjb3JlKSB3aGVyZQorLy8gICBleHQgLSBuYW1lIG9mIHRoZSBleHRlbnNpb24gb3Igb3B0aW9uYWwgY29yZSBmZWF0dXJlLgorLy8gICBhdmFpbCAtIG1pbmltdW0gT3BlbkNMIHZlcnNpb24gc3VwcG9ydGluZyBpdC4KKy8vICAgY29yZSAtIG1pbmltdW0gT3BlbkNMIHZlcnNpb24gd2hlbiB0aGUgZXh0ZW5zaW9uIGJlY29tZXMgb3B0aW9uYWwgY29yZQorLy8gICAgICAgICAgZmVhdHVyZSBvciBjb3JlIGZlYXR1cmUuIH4wVSBpbmRpY2F0ZXMgbm90IGEgY29yZSBmZWF0dXJlIG9yIGFuCisvLyAgICAgICAgICBvcHRpb25hbCBjb3JlIGZlYXR1cmUuCisKKyNpZm5kZWYgT1BFTkNMRVhUX0lOVEVSTkFMCisjaWZuZGVmIE9QRU5DTEVYVAorI3ByYWdtYSBlcnJvciAibWFjcm8gT1BFTkNMRVhUIG9yIE9QRU5DTEVYVF9JTlRFUk5BTCBpcyByZXF1aXJlZCIKKyNlbHNlCisjZGVmaW5lIE9QRU5DTEVYVF9JTlRFUk5BTChleHQsIC4uLikgT1BFTkNMRVhUKGV4dCkKKyNlbmRpZiAvLyBPUEVOQ0xFWFQKKyNlbmRpZiAvLyBPUEVOQ0xFWFRfSU5URVJOQUwKKworLy8gT3BlbkNMIDEuMC4KK09QRU5DTEVYVF9JTlRFUk5BTChjbF9raHJfM2RfaW1hZ2Vfd3JpdGVzLCAxMDAsIDIwMCkKKy8vIGZwcm91bmRpbmcgbW9kZSBpcyBzcGVjaWFsIHNpbmNlIGl0IGlzIG5vdCBtZW50aW9uZWQgYmV5b25kIDEuMAorT1BFTkNMRVhUX0lOVEVSTkFMKGNsX2tocl9zZWxlY3RfZnByb3VuZGluZ19tb2RlLCAxMDAsIDExMCkKK09QRU5DTEVYVF9JTlRFUk5BTChjbF9raHJfYnl0ZV9hZGRyZXNzYWJsZV9zdG9yZSwgMTAwLCAxMTApCitPUEVOQ0xFWFRfSU5URVJOQUwoY2xfa2hyX2ZwMTYsIDEwMCwgfjBVKQorT1BFTkNMRVhUX0lOVEVSTkFMKGNsX2tocl9mcDY0LCAxMDAsIDEyMCkKK09QRU5DTEVYVF9JTlRFUk5BTChjbF9raHJfZ2xvYmFsX2ludDMyX2Jhc2VfYXRvbWljcywgMTAwLCAxMTApCitPUEVOQ0xFWFRfSU5URVJOQUwoY2xfa2hyX2dsb2JhbF9pbnQzMl9leHRlbmRlZF9hdG9taWNzLCAxMDAsIDExMCkKK09QRU5DTEVYVF9JTlRFUk5BTChjbF9raHJfbG9jYWxfaW50MzJfYmFzZV9hdG9taWNzLCAxMDAsIDExMCkKK09QRU5DTEVYVF9JTlRFUk5BTChjbF9raHJfbG9jYWxfaW50MzJfZXh0ZW5kZWRfYXRvbWljcywgMTAwLCAxMTApCitPUEVOQ0xFWFRfSU5URVJOQUwoY2xfa2hyX2ludDY0X2Jhc2VfYXRvbWljcywgMTAwLCB+MFUpCitPUEVOQ0xFWFRfSU5URVJOQUwoY2xfa2hyX2ludDY0X2V4dGVuZGVkX2F0b21pY3MsIDEwMCwgfjBVKQorT1BFTkNMRVhUX0lOVEVSTkFMKGNsX2tocl9nbF9zaGFyaW5nLCAxMDAsIH4wVSkKK09QRU5DTEVYVF9JTlRFUk5BTChjbF9raHJfaWNkLCAxMDAsIH4wVSkKKworLy8gT3BlbkNMIDEuMS4KK09QRU5DTEVYVF9JTlRFUk5BTChjbF9raHJfZ2xfZXZlbnQsIDExMCwgfjBVKQorT1BFTkNMRVhUX0lOVEVSTkFMKGNsX2tocl9kM2QxMF9zaGFyaW5nLCAxMTAsIH4wVSkKKworLy8gRU1CRURERURfUFJPRklMRQorT1BFTkNMRVhUX0lOVEVSTkFMKGNsZXNfa2hyX2ludDY0LCAxMTAsIH4wVSkKKworLy8gT3BlbkNMIDEuMi4KK09QRU5DTEVYVF9JTlRFUk5BTChjbF9raHJfY29udGV4dF9hYm9ydCwgMTIwLCB+MFUpCitPUEVOQ0xFWFRfSU5URVJOQUwoY2xfa2hyX2QzZDExX3NoYXJpbmcsIDEyMCwgfjBVKQorT1BFTkNMRVhUX0lOVEVSTkFMKGNsX2tocl9kZXB0aF9pbWFnZXMsIDEyMCwgfjBVKQorT1BFTkNMRVhUX0lOVEVSTkFMKGNsX2tocl9keDlfbWVkaWFfc2hhcmluZywgMTIwLCB+MFUpCitPUEVOQ0xFWFRfSU5URVJOQUwoY2xfa2hyX2ltYWdlMmRfZnJvbV9idWZmZXIsIDEyMCwgfjBVKQorT1BFTkNMRVhUX0lOVEVSTkFMKGNsX2tocl9pbml0aWFsaXplX21lbW9yeSwgMTIwLCB+MFUpCitPUEVOQ0xFWFRfSU5URVJOQUwoY2xfa2hyX2dsX2RlcHRoX2ltYWdlcywgMTIwLCB+MFUpCitPUEVOQ0xFWFRfSU5URVJOQUwoY2xfa2hyX2dsX21zYWFfc2hhcmluZywgMTIwLCB+MFUpCitPUEVOQ0xFWFRfSU5URVJOQUwoY2xfa2hyX3NwaXIsIDEyMCwgfjBVKQorCisvLyBPcGVuQ0wgMi4wLgorT1BFTkNMRVhUX0lOVEVSTkFMKGNsX2tocl9lZ2xfZXZlbnQsIDIwMCwgfjBVKQorT1BFTkNMRVhUX0lOVEVSTkFMKGNsX2tocl9lZ2xfaW1hZ2UsIDIwMCwgfjBVKQorT1BFTkNMRVhUX0lOVEVSTkFMKGNsX2tocl9taXBtYXBfaW1hZ2UsIDIwMCwgfjBVKQorT1BFTkNMRVhUX0lOVEVSTkFMKGNsX2tocl9zcmdiX2ltYWdlX3dyaXRlcywgMjAwLCB+MFUpCitPUEVOQ0xFWFRfSU5URVJOQUwoY2xfa2hyX3N1Ymdyb3VwcywgMjAwLCB+MFUpCitPUEVOQ0xFWFRfSU5URVJOQUwoY2xfa2hyX3Rlcm1pbmF0ZV9jb250ZXh0LCAyMDAsIH4wVSkKKworLy8gQ2xhbmcgRXh0ZW5zaW9ucy4KK09QRU5DTEVYVF9JTlRFUk5BTChjbF9jbGFuZ19zdG9yYWdlX2NsYXNzX3NwZWNpZmllcnMsIDEwMCwgfjBVKQorCisvLyBBTUQgT3BlbkNMIGV4dGVuc2lvbnMKK09QRU5DTEVYVF9JTlRFUk5BTChjbF9hbWRfbWVkaWFfb3BzLCAxMDAsIH4wVSkKK09QRU5DTEVYVF9JTlRFUk5BTChjbF9hbWRfbWVkaWFfb3BzMiwgMTAwLCB+MFUpCisKKy8vIEludGVsIE9wZW5DTCBleHRlbnNpb25zCitPUEVOQ0xFWFRfSU5URVJOQUwoY2xfaW50ZWxfc3ViZ3JvdXBzLCAxMjAsIH4wVSkKK09QRU5DTEVYVF9JTlRFUk5BTChjbF9pbnRlbF9zdWJncm91cHNfc2hvcnQsIDEyMCwgfjBVKQorCisjdW5kZWYgT1BFTkNMRVhUX0lOVEVSTkFMCisKKyNpZmRlZiBPUEVOQ0xFWFQKKyN1bmRlZiBPUEVOQ0xFWFQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvT3BlbkNMSW1hZ2VUeXBlcy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9PcGVuQ0xJbWFnZVR5cGVzLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWZlZDk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvT3BlbkNMSW1hZ2VUeXBlcy5kZWYKQEAgLTAsMCArMSw4OCBAQAorLy89PT0tLSBPcGVuQ0xJbWFnZVR5cGVzLmRlZiAtIE1ldGFkYXRhIGFib3V0IEJ1aWx0aW5UeXBlcyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBUaGlzIGZpbGUgZXh0ZW5kcyBidWlsdGluIHR5cGVzIGRhdGFiYXNlIHdpdGggT3BlbkNMIGltYWdlIHNpbmdsZXRvbiB0eXBlcy4KKy8vICBDdXN0b20gY29kZSBzaG91bGQgZGVmaW5lIG9uZSBvZiB0aG9zZSB0aHJlZSBtYWNyb3M6CisvLyAgICBHRU5FUklDX0lNQUdFX1RZUEUoVHlwZSwgSWQpIC0gYSBnZW5lcmljIGltYWdlIHdpdGggaXRzIElkIHdpdGhvdXQgYW4KKy8vICAgICAgYWNjZXNzIHR5cGUKKy8vICAgIElNQUdFX1RZUEUoVHlwZSwgSWQsIFNpbmdsZXRvbklkLCBBY2Nlc3NUeXBlLCBDR1N1ZmZpeCkgLSBhbiBpbWFnZSB0eXBlCisvLyAgICAgIHdpdGggZ2l2ZW4gSUQsIHNpbmdsZXRvbiBJRCBhY2Nlc3MgdHlwZSBhbmQgYSBjb2RlZ2VuIHN1ZmZpeAorLy8gICAgR0VORVJJQ19JTUFHRV9UWVBFX0VYVChUeXBlLCBJZCwgRXh0KSAtIGEgZ2VuZXJpYyBpbWFnZSB3aXRoIGl0cyBJZCBhbmQKKy8vICAgICAgcmVxdWlyZWQgZXh0ZW5zaW9uIHdpdGhvdXQgYW4gYWNjZXNzIHR5cGUKKworI2lmZGVmIEdFTkVSSUNfSU1BR0VfVFlQRQorCisjZGVmaW5lIElNQUdFX1JFQURfVFlQRShUeXBlLCBJZCwgRXh0KSBHRU5FUklDX0lNQUdFX1RZUEUoVHlwZSwgSWQpCisjZGVmaW5lIElNQUdFX1dSSVRFX1RZUEUoVHlwZSwgSWQsIEV4dCkKKyNkZWZpbmUgSU1BR0VfUkVBRF9XUklURV9UWVBFKFR5cGUsIElkLCBFeHQpCisKKyNlbGlmIGRlZmluZWQoR0VORVJJQ19JTUFHRV9UWVBFX0VYVCkKKyNkZWZpbmUgSU1BR0VfUkVBRF9UWVBFKFR5cGUsIElkLCBFeHQpIEdFTkVSSUNfSU1BR0VfVFlQRV9FWFQoVHlwZSwgSWQjI1JPVHksIEV4dCkKKyNkZWZpbmUgSU1BR0VfV1JJVEVfVFlQRShUeXBlLCBJZCwgRXh0KSBHRU5FUklDX0lNQUdFX1RZUEVfRVhUKFR5cGUsIElkIyNXT1R5LCBFeHQpCisjZGVmaW5lIElNQUdFX1JFQURfV1JJVEVfVFlQRShUeXBlLCBJZCwgRXh0KSBHRU5FUklDX0lNQUdFX1RZUEVfRVhUKFR5cGUsIElkIyNSV1R5LCBFeHQpCisKKyNlbHNlCisjaWZuZGVmIElNQUdFX1JFQURfVFlQRQorI2RlZmluZSBJTUFHRV9SRUFEX1RZUEUoVHlwZSwgSWQsIEV4dCkgXAorICAgICAgICAgIElNQUdFX1RZUEUoVHlwZSwgSWQjI1JPLCBJZCMjUk9UeSwgIHJlYWRfb25seSwgcm8pCisjZW5kaWYKKyNpZm5kZWYgSU1BR0VfV1JJVEVfVFlQRQorI2RlZmluZSBJTUFHRV9XUklURV9UWVBFKFR5cGUsIElkLCBFeHQpIFwKKyAgICAgICAgICBJTUFHRV9UWVBFKFR5cGUsIElkIyNXTywgSWQjI1dPVHksIHdyaXRlX29ubHksIHdvKQorI2VuZGlmCisjaWZuZGVmIElNQUdFX1JFQURfV1JJVEVfVFlQRQorI2RlZmluZSBJTUFHRV9SRUFEX1dSSVRFX1RZUEUoVHlwZSwgSWQsIEV4dCkgXAorICAgICAgICAgIElNQUdFX1RZUEUoVHlwZSwgSWQjI1JXLCBJZCMjUldUeSwgcmVhZF93cml0ZSwgcncpCisjZW5kaWYKKworI2VuZGlmCisKK0lNQUdFX1JFQURfVFlQRShpbWFnZTFkLCBPQ0xJbWFnZTFkLCAiIikKK0lNQUdFX1JFQURfVFlQRShpbWFnZTFkX2FycmF5LCBPQ0xJbWFnZTFkQXJyYXksICIiKQorSU1BR0VfUkVBRF9UWVBFKGltYWdlMWRfYnVmZmVyLCBPQ0xJbWFnZTFkQnVmZmVyLCAiIikKK0lNQUdFX1JFQURfVFlQRShpbWFnZTJkLCBPQ0xJbWFnZTJkLCAiIikKK0lNQUdFX1JFQURfVFlQRShpbWFnZTJkX2FycmF5LCBPQ0xJbWFnZTJkQXJyYXksICIiKQorSU1BR0VfUkVBRF9UWVBFKGltYWdlMmRfZGVwdGgsIE9DTEltYWdlMmREZXB0aCwgIiIpCitJTUFHRV9SRUFEX1RZUEUoaW1hZ2UyZF9hcnJheV9kZXB0aCwgT0NMSW1hZ2UyZEFycmF5RGVwdGgsICIiKQorSU1BR0VfUkVBRF9UWVBFKGltYWdlMmRfbXNhYSwgT0NMSW1hZ2UyZE1TQUEsICJjbF9raHJfZ2xfbXNhYV9zaGFyaW5nIikKK0lNQUdFX1JFQURfVFlQRShpbWFnZTJkX2FycmF5X21zYWEsIE9DTEltYWdlMmRBcnJheU1TQUEsICJjbF9raHJfZ2xfbXNhYV9zaGFyaW5nIikKK0lNQUdFX1JFQURfVFlQRShpbWFnZTJkX21zYWFfZGVwdGgsIE9DTEltYWdlMmRNU0FBRGVwdGgsICJjbF9raHJfZ2xfbXNhYV9zaGFyaW5nIikKK0lNQUdFX1JFQURfVFlQRShpbWFnZTJkX2FycmF5X21zYWFfZGVwdGgsIE9DTEltYWdlMmRBcnJheU1TQUFEZXB0aCwgImNsX2tocl9nbF9tc2FhX3NoYXJpbmciKQorSU1BR0VfUkVBRF9UWVBFKGltYWdlM2QsIE9DTEltYWdlM2QsICIiKQorCitJTUFHRV9XUklURV9UWVBFKGltYWdlMWQsIE9DTEltYWdlMWQsICIiKQorSU1BR0VfV1JJVEVfVFlQRShpbWFnZTFkX2FycmF5LCBPQ0xJbWFnZTFkQXJyYXksICIiKQorSU1BR0VfV1JJVEVfVFlQRShpbWFnZTFkX2J1ZmZlciwgT0NMSW1hZ2UxZEJ1ZmZlciwgIiIpCitJTUFHRV9XUklURV9UWVBFKGltYWdlMmQsIE9DTEltYWdlMmQsICIiKQorSU1BR0VfV1JJVEVfVFlQRShpbWFnZTJkX2FycmF5LCBPQ0xJbWFnZTJkQXJyYXksICIiKQorSU1BR0VfV1JJVEVfVFlQRShpbWFnZTJkX2RlcHRoLCBPQ0xJbWFnZTJkRGVwdGgsICIiKQorSU1BR0VfV1JJVEVfVFlQRShpbWFnZTJkX2FycmF5X2RlcHRoLCBPQ0xJbWFnZTJkQXJyYXlEZXB0aCwgIiIpCitJTUFHRV9XUklURV9UWVBFKGltYWdlMmRfbXNhYSwgT0NMSW1hZ2UyZE1TQUEsICJjbF9raHJfZ2xfbXNhYV9zaGFyaW5nIikKK0lNQUdFX1dSSVRFX1RZUEUoaW1hZ2UyZF9hcnJheV9tc2FhLCBPQ0xJbWFnZTJkQXJyYXlNU0FBLCAiY2xfa2hyX2dsX21zYWFfc2hhcmluZyIpCitJTUFHRV9XUklURV9UWVBFKGltYWdlMmRfbXNhYV9kZXB0aCwgT0NMSW1hZ2UyZE1TQUFEZXB0aCwgImNsX2tocl9nbF9tc2FhX3NoYXJpbmciKQorSU1BR0VfV1JJVEVfVFlQRShpbWFnZTJkX2FycmF5X21zYWFfZGVwdGgsIE9DTEltYWdlMmRBcnJheU1TQUFEZXB0aCwgImNsX2tocl9nbF9tc2FhX3NoYXJpbmciKQorSU1BR0VfV1JJVEVfVFlQRShpbWFnZTNkLCBPQ0xJbWFnZTNkLCAiY2xfa2hyXzNkX2ltYWdlX3dyaXRlcyIpCisKK0lNQUdFX1JFQURfV1JJVEVfVFlQRShpbWFnZTFkLCBPQ0xJbWFnZTFkLCAiIikKK0lNQUdFX1JFQURfV1JJVEVfVFlQRShpbWFnZTFkX2FycmF5LCBPQ0xJbWFnZTFkQXJyYXksICIiKQorSU1BR0VfUkVBRF9XUklURV9UWVBFKGltYWdlMWRfYnVmZmVyLCBPQ0xJbWFnZTFkQnVmZmVyLCAiIikKK0lNQUdFX1JFQURfV1JJVEVfVFlQRShpbWFnZTJkLCBPQ0xJbWFnZTJkLCAiIikKK0lNQUdFX1JFQURfV1JJVEVfVFlQRShpbWFnZTJkX2FycmF5LCBPQ0xJbWFnZTJkQXJyYXksICIiKQorSU1BR0VfUkVBRF9XUklURV9UWVBFKGltYWdlMmRfZGVwdGgsIE9DTEltYWdlMmREZXB0aCwgIiIpCitJTUFHRV9SRUFEX1dSSVRFX1RZUEUoaW1hZ2UyZF9hcnJheV9kZXB0aCwgT0NMSW1hZ2UyZEFycmF5RGVwdGgsICIiKQorSU1BR0VfUkVBRF9XUklURV9UWVBFKGltYWdlMmRfbXNhYSwgT0NMSW1hZ2UyZE1TQUEsICJjbF9raHJfZ2xfbXNhYV9zaGFyaW5nIikKK0lNQUdFX1JFQURfV1JJVEVfVFlQRShpbWFnZTJkX2FycmF5X21zYWEsIE9DTEltYWdlMmRBcnJheU1TQUEsICJjbF9raHJfZ2xfbXNhYV9zaGFyaW5nIikKK0lNQUdFX1JFQURfV1JJVEVfVFlQRShpbWFnZTJkX21zYWFfZGVwdGgsIE9DTEltYWdlMmRNU0FBRGVwdGgsICJjbF9raHJfZ2xfbXNhYV9zaGFyaW5nIikKK0lNQUdFX1JFQURfV1JJVEVfVFlQRShpbWFnZTJkX2FycmF5X21zYWFfZGVwdGgsIE9DTEltYWdlMmRBcnJheU1TQUFEZXB0aCwgImNsX2tocl9nbF9tc2FhX3NoYXJpbmciKQorSU1BR0VfUkVBRF9XUklURV9UWVBFKGltYWdlM2QsIE9DTEltYWdlM2QsICIiKQorCisjdW5kZWYgSU1BR0VfVFlQRQorI3VuZGVmIEdFTkVSSUNfSU1BR0VfVFlQRQorI3VuZGVmIElNQUdFX1JFQURfVFlQRQorI3VuZGVmIElNQUdFX1dSSVRFX1RZUEUKKyN1bmRlZiBJTUFHRV9SRUFEX1dSSVRFX1RZUEUKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL09wZW5DTE9wdGlvbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL09wZW5DTE9wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzg1MGYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvT3BlbkNMT3B0aW9ucy5oCkBAIC0wLDAgKzEsMTM4IEBACisvLz09PS0tLSBPcGVuQ0xPcHRpb25zLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgY2xhbmc6Ok9wZW5DTE9wdGlvbnMgY2xhc3MuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19PUEVOQ0xPUFRJT05TX0gKKyNkZWZpbmUgTExWTV9DTEFOR19CQVNJQ19PUEVOQ0xPUFRJT05TX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCisvLy8gXGJyaWVmIE9wZW5DTCBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyBhbmQgb3B0aW9uYWwgY29yZSBmZWF0dXJlcworY2xhc3MgT3BlbkNMT3B0aW9ucyB7CisgIHN0cnVjdCBJbmZvIHsKKyAgICBib29sIFN1cHBvcnRlZDsgLy8gSXMgdGhpcyBvcHRpb24gc3VwcG9ydGVkCisgICAgYm9vbCBFbmFibGVkOyAgIC8vIElzIHRoaXMgb3B0aW9uIGVuYWJsZWQKKyAgICB1bnNpZ25lZCBBdmFpbDsgLy8gT3B0aW9uIHN0YXJ0cyB0byBiZSBhdmFpbGFibGUgaW4gdGhpcyBPcGVuQ0wgdmVyc2lvbgorICAgIHVuc2lnbmVkIENvcmU7ICAvLyBPcHRpb24gYmVjb21lcyAob3B0aW9uYWwpIGNvcmUgZmVhdHVyZSBpbiB0aGlzIE9wZW5DTAorICAgICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uCisgICAgSW5mbyhib29sIFMgPSBmYWxzZSwgYm9vbCBFID0gZmFsc2UsIHVuc2lnbmVkIEEgPSAxMDAsIHVuc2lnbmVkIEMgPSB+MFUpCisgICAgICA6U3VwcG9ydGVkKFMpLCBFbmFibGVkKEUpLCBBdmFpbChBKSwgQ29yZShDKXt9CisgIH07CisgIGxsdm06OlN0cmluZ01hcDxJbmZvPiBPcHRNYXA7CitwdWJsaWM6CisgIGJvb2wgaXNLbm93bihsbHZtOjpTdHJpbmdSZWYgRXh0KSBjb25zdCB7CisgICAgcmV0dXJuIE9wdE1hcC5maW5kKEV4dCkgIT0gT3B0TWFwLmVuZCgpOworICB9CisKKyAgYm9vbCBpc0VuYWJsZWQobGx2bTo6U3RyaW5nUmVmIEV4dCkgY29uc3QgeworICAgIHJldHVybiBPcHRNYXAuZmluZChFeHQpLT5zZWNvbmQuRW5hYmxlZDsKKyAgfQorCisgIC8vIElzIHN1cHBvcnRlZCBhcyBlaXRoZXIgYW4gZXh0ZW5zaW9uIG9yIGFuIChvcHRpb25hbCkgY29yZSBmZWF0dXJlIGZvcgorICAvLyBPcGVuQ0wgdmVyc2lvbiBccCBDTFZlci4KKyAgYm9vbCBpc1N1cHBvcnRlZChsbHZtOjpTdHJpbmdSZWYgRXh0LCB1bnNpZ25lZCBDTFZlcikgY29uc3QgeworICAgIGF1dG8gSSA9IE9wdE1hcC5maW5kKEV4dCktPmdldFZhbHVlKCk7CisgICAgcmV0dXJuIEkuU3VwcG9ydGVkICYmIEkuQXZhaWwgPD0gQ0xWZXI7CisgIH0KKworICAvLyBJcyBzdXBwb3J0ZWQgKG9wdGlvbmFsKSBPcGVuQ0wgY29yZSBmZWF0dXJlcyBmb3IgT3BlbkNMIHZlcnNpb24gXHAgQ0xWZXIuCisgIC8vIEZvciBzdXBwb3J0ZWQgZXh0ZW5zaW9uLCByZXR1cm4gZmFsc2UuCisgIGJvb2wgaXNTdXBwb3J0ZWRDb3JlKGxsdm06OlN0cmluZ1JlZiBFeHQsIHVuc2lnbmVkIENMVmVyKSBjb25zdCB7CisgICAgYXV0byBJID0gT3B0TWFwLmZpbmQoRXh0KS0+Z2V0VmFsdWUoKTsKKyAgICByZXR1cm4gSS5TdXBwb3J0ZWQgJiYgSS5BdmFpbCA8PSBDTFZlciAmJgorICAgICAgSS5Db3JlICE9IH4wVSAmJiBDTFZlciA+PSBJLkNvcmU7CisgIH0KKworICAvLyBJcyBzdXBwb3J0ZWQgT3BlbkNMIGV4dGVuc2lvbiBmb3IgT3BlbkNMIHZlcnNpb24gXHAgQ0xWZXIuCisgIC8vIEZvciBzdXBwb3J0ZWQgKG9wdGlvbmFsKSBjb3JlIGZlYXR1cmUsIHJldHVybiBmYWxzZS4KKyBib29sIGlzU3VwcG9ydGVkRXh0ZW5zaW9uKGxsdm06OlN0cmluZ1JlZiBFeHQsIHVuc2lnbmVkIENMVmVyKSBjb25zdCB7CisgICAgYXV0byBJID0gT3B0TWFwLmZpbmQoRXh0KS0+Z2V0VmFsdWUoKTsKKyAgICByZXR1cm4gSS5TdXBwb3J0ZWQgJiYgSS5BdmFpbCA8PSBDTFZlciAmJgorICAgICAgKEkuQ29yZSA9PSB+MFUgfHwgQ0xWZXIgPCBJLkNvcmUpOworICB9CisKKyAgdm9pZCBlbmFibGUobGx2bTo6U3RyaW5nUmVmIEV4dCwgYm9vbCBWID0gdHJ1ZSkgeworICAgIE9wdE1hcFtFeHRdLkVuYWJsZWQgPSBWOworICB9CisKKyAgLy8vIFxicmllZiBFbmFibGUgb3IgZGlzYWJsZSBzdXBwb3J0IGZvciBPcGVuQ0wgZXh0ZW5zaW9ucworICAvLy8gXHBhcmFtIEV4dCBuYW1lIG9mIHRoZSBleHRlbnNpb24gb3B0aW9uYWxseSBwcmVmaXhlZCB3aXRoCisgIC8vLyAgICAgICAgJysnIG9yICctJworICAvLy8gXHBhcmFtIFYgdXNlZCB3aGVuIFxwIEV4dCBpcyBub3QgcHJlZml4ZWQgYnkgJysnIG9yICctJworICB2b2lkIHN1cHBvcnQobGx2bTo6U3RyaW5nUmVmIEV4dCwgYm9vbCBWID0gdHJ1ZSkgeworICAgIGFzc2VydCghRXh0LmVtcHR5KCkgJiYgIkV4dGVuc2lvbiBpcyBlbXB0eS4iKTsKKworICAgIHN3aXRjaCAoRXh0WzBdKSB7CisgICAgY2FzZSAnKyc6CisgICAgICBWID0gdHJ1ZTsKKyAgICAgIEV4dCA9IEV4dC5kcm9wX2Zyb250KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlICctJzoKKyAgICAgIFYgPSBmYWxzZTsKKyAgICAgIEV4dCA9IEV4dC5kcm9wX2Zyb250KCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoRXh0LmVxdWFscygiYWxsIikpIHsKKyAgICAgIHN1cHBvcnRBbGwoVik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIE9wdE1hcFtFeHRdLlN1cHBvcnRlZCA9IFY7CisgIH0KKworICBPcGVuQ0xPcHRpb25zKCl7CisjZGVmaW5lIE9QRU5DTEVYVF9JTlRFUk5BTChFeHQsIEF2YWlsVmVyLCBDb3JlVmVyKSBcCisgICAgT3B0TWFwWyNFeHRdLkF2YWlsID0gQXZhaWxWZXI7IFwKKyAgICBPcHRNYXBbI0V4dF0uQ29yZSA9IENvcmVWZXI7CisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3BlbkNMRXh0ZW5zaW9ucy5kZWYiCisgIH0KKworICB2b2lkIGFkZFN1cHBvcnQoY29uc3QgT3BlbkNMT3B0aW9ucyAmT3B0cykgeworICAgIGZvciAoYXV0byAmSTpPcHRzLk9wdE1hcCkKKyAgICAgIGlmIChJLnNlY29uZC5TdXBwb3J0ZWQpCisgICAgICAgIE9wdE1hcFtJLmdldEtleSgpXS5TdXBwb3J0ZWQgPSB0cnVlOworICB9CisKKyAgdm9pZCBjb3B5KGNvbnN0IE9wZW5DTE9wdGlvbnMgJk9wdHMpIHsKKyAgICBPcHRNYXAgPSBPcHRzLk9wdE1hcDsKKyAgfQorCisgIC8vIFR1cm4gb24gb3Igb2ZmIHN1cHBvcnQgb2YgYWxsIG9wdGlvbnMuCisgIHZvaWQgc3VwcG9ydEFsbChib29sIE9uID0gdHJ1ZSkgeworICAgIGZvciAobGx2bTo6U3RyaW5nTWFwPEluZm8+OjppdGVyYXRvciBJID0gT3B0TWFwLmJlZ2luKCksCisgICAgICAgICBFID0gT3B0TWFwLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIEktPnNlY29uZC5TdXBwb3J0ZWQgPSBPbjsKKyAgfQorCisgIHZvaWQgZGlzYWJsZUFsbCgpIHsKKyAgICBmb3IgKGxsdm06OlN0cmluZ01hcDxJbmZvPjo6aXRlcmF0b3IgSSA9IE9wdE1hcC5iZWdpbigpLAorICAgICAgICAgRSA9IE9wdE1hcC5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBJLT5zZWNvbmQuRW5hYmxlZCA9IGZhbHNlOworICB9CisKKyAgdm9pZCBlbmFibGVTdXBwb3J0ZWRDb3JlKHVuc2lnbmVkIENMVmVyKSB7CisgICAgZm9yIChsbHZtOjpTdHJpbmdNYXA8SW5mbz46Oml0ZXJhdG9yIEkgPSBPcHRNYXAuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBPcHRNYXAuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgaWYgKGlzU3VwcG9ydGVkQ29yZShJLT5nZXRLZXkoKSwgQ0xWZXIpKQorICAgICAgICBJLT5zZWNvbmQuRW5hYmxlZCA9IHRydWU7CisgIH0KKworICBmcmllbmQgY2xhc3MgQVNUV3JpdGVyOworICBmcmllbmQgY2xhc3MgQVNUUmVhZGVyOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL09wZW5NUEtpbmRzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL09wZW5NUEtpbmRzLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTBiZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvT3Blbk1QS2luZHMuZGVmCkBAIC0wLDAgKzEsOTE0IEBACisvLz09PS0tLSBPcGVuTVBLaW5kcy5kZWYgLSBPcGVuTVAgZGlyZWN0aXZlcyBhbmQgY2xhdXNlcyBsaXN0IC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBPcGVuTVAgZGlyZWN0aXZlcyBhbmQKKy8vLyBjbGF1c2VzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIE9QRU5NUF9ESVJFQ1RJVkUKKyMgIGRlZmluZSBPUEVOTVBfRElSRUNUSVZFKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX0RJUkVDVElWRV9FWFQKKyNkZWZpbmUgT1BFTk1QX0RJUkVDVElWRV9FWFQoTmFtZSwgU3RyKQorI2VuZGlmCisjaWZuZGVmIE9QRU5NUF9DTEFVU0UKKyMgIGRlZmluZSBPUEVOTVBfQ0xBVVNFKE5hbWUsIENsYXNzKQorI2VuZGlmCisjaWZuZGVmIE9QRU5NUF9QQVJBTExFTF9DTEFVU0UKKyMgIGRlZmluZSBPUEVOTVBfUEFSQUxMRUxfQ0xBVVNFKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX1NJTURfQ0xBVVNFCisjICBkZWZpbmUgT1BFTk1QX1NJTURfQ0xBVVNFKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX0ZPUl9DTEFVU0UKKyMgIGRlZmluZSBPUEVOTVBfRk9SX0NMQVVTRShOYW1lKQorI2VuZGlmCisjaWZuZGVmIE9QRU5NUF9GT1JfU0lNRF9DTEFVU0UKKyMgIGRlZmluZSBPUEVOTVBfRk9SX1NJTURfQ0xBVVNFKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX1NFQ1RJT05TX0NMQVVTRQorIyAgZGVmaW5lIE9QRU5NUF9TRUNUSU9OU19DTEFVU0UoTmFtZSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOTVBfU0lOR0xFX0NMQVVTRQorIyAgZGVmaW5lIE9QRU5NUF9TSU5HTEVfQ0xBVVNFKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX1BBUkFMTEVMX0ZPUl9DTEFVU0UKKyMgIGRlZmluZSBPUEVOTVBfUEFSQUxMRUxfRk9SX0NMQVVTRShOYW1lKQorI2VuZGlmCisjaWZuZGVmIE9QRU5NUF9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UKKyMgIGRlZmluZSBPUEVOTVBfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX1BBUkFMTEVMX1NFQ1RJT05TX0NMQVVTRQorIyAgZGVmaW5lIE9QRU5NUF9QQVJBTExFTF9TRUNUSU9OU19DTEFVU0UoTmFtZSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOTVBfVEFTS19DTEFVU0UKKyMgIGRlZmluZSBPUEVOTVBfVEFTS19DTEFVU0UoTmFtZSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOTVBfQVRPTUlDX0NMQVVTRQorIyAgZGVmaW5lIE9QRU5NUF9BVE9NSUNfQ0xBVVNFKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX1RBUkdFVF9DTEFVU0UKKyMgIGRlZmluZSBPUEVOTVBfVEFSR0VUX0NMQVVTRShOYW1lKQorI2VuZGlmCisjaWZuZGVmIE9QRU5NUF9UQVJHRVRfREFUQV9DTEFVU0UKKyMgIGRlZmluZSBPUEVOTVBfVEFSR0VUX0RBVEFfQ0xBVVNFKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX1RBUkdFVF9FTlRFUl9EQVRBX0NMQVVTRQorI2RlZmluZSBPUEVOTVBfVEFSR0VUX0VOVEVSX0RBVEFfQ0xBVVNFKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX1RBUkdFVF9FWElUX0RBVEFfQ0xBVVNFCisjZGVmaW5lIE9QRU5NUF9UQVJHRVRfRVhJVF9EQVRBX0NMQVVTRShOYW1lKQorI2VuZGlmCisjaWZuZGVmIE9QRU5NUF9UQVJHRVRfUEFSQUxMRUxfQ0xBVVNFCisjICBkZWZpbmUgT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9DTEFVU0UoTmFtZSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9DTEFVU0UKKyMgIGRlZmluZSBPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9DTEFVU0UoTmFtZSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOTVBfVEFSR0VUX1VQREFURV9DTEFVU0UKKyMgIGRlZmluZSBPUEVOTVBfVEFSR0VUX1VQREFURV9DTEFVU0UoTmFtZSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOTVBfVEVBTVNfQ0xBVVNFCisjICBkZWZpbmUgT1BFTk1QX1RFQU1TX0NMQVVTRShOYW1lKQorI2VuZGlmCisjaWZuZGVmIE9QRU5NUF9DQU5DRUxfQ0xBVVNFCisjICBkZWZpbmUgT1BFTk1QX0NBTkNFTF9DTEFVU0UoTmFtZSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOTVBfT1JERVJFRF9DTEFVU0UKKyMgIGRlZmluZSBPUEVOTVBfT1JERVJFRF9DTEFVU0UoTmFtZSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOTVBfVEFTS0xPT1BfQ0xBVVNFCisjICBkZWZpbmUgT1BFTk1QX1RBU0tMT09QX0NMQVVTRShOYW1lKQorI2VuZGlmCisjaWZuZGVmIE9QRU5NUF9UQVNLTE9PUF9TSU1EX0NMQVVTRQorIyAgZGVmaW5lIE9QRU5NUF9UQVNLTE9PUF9TSU1EX0NMQVVTRShOYW1lKQorI2VuZGlmCisjaWZuZGVmIE9QRU5NUF9DUklUSUNBTF9DTEFVU0UKKyMgIGRlZmluZSBPUEVOTVBfQ1JJVElDQUxfQ0xBVVNFKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX0RJU1RSSUJVVEVfQ0xBVVNFCisjZGVmaW5lIE9QRU5NUF9ESVNUUklCVVRFX0NMQVVTRShOYW1lKQorI2VuZGlmCisjaWZuZGVmIE9QRU5NUF9ERUZBVUxUX0tJTkQKKyMgIGRlZmluZSBPUEVOTVBfREVGQVVMVF9LSU5EKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX1BST0NfQklORF9LSU5ECisjICBkZWZpbmUgT1BFTk1QX1BST0NfQklORF9LSU5EKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX1NDSEVEVUxFX0tJTkQKKyNkZWZpbmUgT1BFTk1QX1NDSEVEVUxFX0tJTkQoTmFtZSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOTVBfU0NIRURVTEVfTU9ESUZJRVIKKyNkZWZpbmUgT1BFTk1QX1NDSEVEVUxFX01PRElGSUVSKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX0RFUEVORF9LSU5ECisjZGVmaW5lIE9QRU5NUF9ERVBFTkRfS0lORChOYW1lKQorI2VuZGlmCisjaWZuZGVmIE9QRU5NUF9MSU5FQVJfS0lORAorI2RlZmluZSBPUEVOTVBfTElORUFSX0tJTkQoTmFtZSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOTVBfTUFQX0tJTkQKKyNkZWZpbmUgT1BFTk1QX01BUF9LSU5EKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX0RJU1RfU0NIRURVTEVfS0lORAorI2RlZmluZSBPUEVOTVBfRElTVF9TQ0hFRFVMRV9LSU5EKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX0RFRkFVTFRNQVBfS0lORAorI2RlZmluZSBPUEVOTVBfREVGQVVMVE1BUF9LSU5EKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX0RFRkFVTFRNQVBfTU9ESUZJRVIKKyNkZWZpbmUgT1BFTk1QX0RFRkFVTFRNQVBfTU9ESUZJRVIoTmFtZSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOTVBfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFCisjZGVmaW5lIE9QRU5NUF9ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UoTmFtZSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOTVBfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UKKyNkZWZpbmUgT1BFTk1QX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX0RJU1RSSUJVVEVfU0lNRF9DTEFVU0UKKyNkZWZpbmUgT1BFTk1QX0RJU1RSSUJVVEVfU0lNRF9DTEFVU0UoTmFtZSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRQorI2RlZmluZSBPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShOYW1lKQorI2VuZGlmCisjaWZuZGVmIE9QRU5NUF9UQVJHRVRfU0lNRF9DTEFVU0UKKyNkZWZpbmUgT1BFTk1QX1RBUkdFVF9TSU1EX0NMQVVTRShOYW1lKQorI2VuZGlmCisjaWZuZGVmIE9QRU5NUF9URUFNU19ESVNUUklCVVRFX0NMQVVTRQorI2RlZmluZSBPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9DTEFVU0UoTmFtZSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9TSU1EX0NMQVVTRQorI2RlZmluZSBPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9TSU1EX0NMQVVTRShOYW1lKQorI2VuZGlmCisjaWZuZGVmIE9QRU5NUF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRQorI2RlZmluZSBPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UoTmFtZSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFCisjZGVmaW5lIE9QRU5NUF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UoTmFtZSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOTVBfVEFSR0VUX1RFQU1TX0NMQVVTRQorI2RlZmluZSBPUEVOTVBfVEFSR0VUX1RFQU1TX0NMQVVTRShOYW1lKQorI2VuZGlmCisjaWZuZGVmIE9QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9DTEFVU0UKKyNkZWZpbmUgT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX0NMQVVTRShOYW1lKQorI2VuZGlmCisjaWZuZGVmIE9QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFCisjZGVmaW5lIE9QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRQorI2RlZmluZSBPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKE5hbWUpCisjZW5kaWYKKyNpZm5kZWYgT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1NJTURfQ0xBVVNFCisjZGVmaW5lIE9QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9TSU1EX0NMQVVTRShOYW1lKQorI2VuZGlmCisjaWZuZGVmIE9QRU5NUF9UQVNLR1JPVVBfQ0xBVVNFCisjZGVmaW5lIE9QRU5NUF9UQVNLR1JPVVBfQ0xBVVNFKE5hbWUpCisjZW5kaWYKKworLy8gT3Blbk1QIGRpcmVjdGl2ZXMuCitPUEVOTVBfRElSRUNUSVZFKHRocmVhZHByaXZhdGUpCitPUEVOTVBfRElSRUNUSVZFKHBhcmFsbGVsKQorT1BFTk1QX0RJUkVDVElWRSh0YXNrKQorT1BFTk1QX0RJUkVDVElWRShzaW1kKQorT1BFTk1QX0RJUkVDVElWRShmb3IpCitPUEVOTVBfRElSRUNUSVZFKHNlY3Rpb25zKQorT1BFTk1QX0RJUkVDVElWRShzZWN0aW9uKQorT1BFTk1QX0RJUkVDVElWRShzaW5nbGUpCitPUEVOTVBfRElSRUNUSVZFKG1hc3RlcikKK09QRU5NUF9ESVJFQ1RJVkUoY3JpdGljYWwpCitPUEVOTVBfRElSRUNUSVZFKHRhc2t5aWVsZCkKK09QRU5NUF9ESVJFQ1RJVkUoYmFycmllcikKK09QRU5NUF9ESVJFQ1RJVkUodGFza3dhaXQpCitPUEVOTVBfRElSRUNUSVZFKHRhc2tncm91cCkKK09QRU5NUF9ESVJFQ1RJVkUoZmx1c2gpCitPUEVOTVBfRElSRUNUSVZFKG9yZGVyZWQpCitPUEVOTVBfRElSRUNUSVZFKGF0b21pYykKK09QRU5NUF9ESVJFQ1RJVkUodGFyZ2V0KQorT1BFTk1QX0RJUkVDVElWRSh0ZWFtcykKK09QRU5NUF9ESVJFQ1RJVkUoY2FuY2VsKQorT1BFTk1QX0RJUkVDVElWRV9FWFQodGFyZ2V0X2RhdGEsICJ0YXJnZXQgZGF0YSIpCitPUEVOTVBfRElSRUNUSVZFX0VYVCh0YXJnZXRfZW50ZXJfZGF0YSwgInRhcmdldCBlbnRlciBkYXRhIikKK09QRU5NUF9ESVJFQ1RJVkVfRVhUKHRhcmdldF9leGl0X2RhdGEsICJ0YXJnZXQgZXhpdCBkYXRhIikKK09QRU5NUF9ESVJFQ1RJVkVfRVhUKHRhcmdldF9wYXJhbGxlbCwgInRhcmdldCBwYXJhbGxlbCIpCitPUEVOTVBfRElSRUNUSVZFX0VYVCh0YXJnZXRfcGFyYWxsZWxfZm9yLCAidGFyZ2V0IHBhcmFsbGVsIGZvciIpCitPUEVOTVBfRElSRUNUSVZFX0VYVCh0YXJnZXRfdXBkYXRlLCAidGFyZ2V0IHVwZGF0ZSIpCitPUEVOTVBfRElSRUNUSVZFX0VYVChwYXJhbGxlbF9mb3IsICJwYXJhbGxlbCBmb3IiKQorT1BFTk1QX0RJUkVDVElWRV9FWFQocGFyYWxsZWxfZm9yX3NpbWQsICJwYXJhbGxlbCBmb3Igc2ltZCIpCitPUEVOTVBfRElSRUNUSVZFX0VYVChwYXJhbGxlbF9zZWN0aW9ucywgInBhcmFsbGVsIHNlY3Rpb25zIikKK09QRU5NUF9ESVJFQ1RJVkVfRVhUKGZvcl9zaW1kLCAiZm9yIHNpbWQiKQorT1BFTk1QX0RJUkVDVElWRV9FWFQoY2FuY2VsbGF0aW9uX3BvaW50LCAiY2FuY2VsbGF0aW9uIHBvaW50IikKK09QRU5NUF9ESVJFQ1RJVkVfRVhUKGRlY2xhcmVfcmVkdWN0aW9uLCAiZGVjbGFyZSByZWR1Y3Rpb24iKQorT1BFTk1QX0RJUkVDVElWRV9FWFQoZGVjbGFyZV9zaW1kLCAiZGVjbGFyZSBzaW1kIikKK09QRU5NUF9ESVJFQ1RJVkUodGFza2xvb3ApCitPUEVOTVBfRElSRUNUSVZFX0VYVCh0YXNrbG9vcF9zaW1kLCAidGFza2xvb3Agc2ltZCIpCitPUEVOTVBfRElSRUNUSVZFKGRpc3RyaWJ1dGUpCitPUEVOTVBfRElSRUNUSVZFX0VYVChkZWNsYXJlX3RhcmdldCwgImRlY2xhcmUgdGFyZ2V0IikKK09QRU5NUF9ESVJFQ1RJVkVfRVhUKGVuZF9kZWNsYXJlX3RhcmdldCwgImVuZCBkZWNsYXJlIHRhcmdldCIpCitPUEVOTVBfRElSRUNUSVZFX0VYVChkaXN0cmlidXRlX3BhcmFsbGVsX2ZvciwgImRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yIikKK09QRU5NUF9ESVJFQ1RJVkVfRVhUKGRpc3RyaWJ1dGVfcGFyYWxsZWxfZm9yX3NpbWQsICJkaXN0cmlidXRlIHBhcmFsbGVsIGZvciBzaW1kIikKK09QRU5NUF9ESVJFQ1RJVkVfRVhUKGRpc3RyaWJ1dGVfc2ltZCwgImRpc3RyaWJ1dGUgc2ltZCIpCitPUEVOTVBfRElSRUNUSVZFX0VYVCh0YXJnZXRfcGFyYWxsZWxfZm9yX3NpbWQsICJ0YXJnZXQgcGFyYWxsZWwgZm9yIHNpbWQiKQorT1BFTk1QX0RJUkVDVElWRV9FWFQodGFyZ2V0X3NpbWQsICJ0YXJnZXQgc2ltZCIpCitPUEVOTVBfRElSRUNUSVZFX0VYVCh0ZWFtc19kaXN0cmlidXRlLCAidGVhbXMgZGlzdHJpYnV0ZSIpCitPUEVOTVBfRElSRUNUSVZFX0VYVCh0ZWFtc19kaXN0cmlidXRlX3NpbWQsICJ0ZWFtcyBkaXN0cmlidXRlIHNpbWQiKQorT1BFTk1QX0RJUkVDVElWRV9FWFQodGVhbXNfZGlzdHJpYnV0ZV9wYXJhbGxlbF9mb3Jfc2ltZCwgInRlYW1zIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yIHNpbWQiKQorT1BFTk1QX0RJUkVDVElWRV9FWFQodGVhbXNfZGlzdHJpYnV0ZV9wYXJhbGxlbF9mb3IsICJ0ZWFtcyBkaXN0cmlidXRlIHBhcmFsbGVsIGZvciIpCitPUEVOTVBfRElSRUNUSVZFX0VYVCh0YXJnZXRfdGVhbXMsICJ0YXJnZXQgdGVhbXMiKQorT1BFTk1QX0RJUkVDVElWRV9FWFQodGFyZ2V0X3RlYW1zX2Rpc3RyaWJ1dGUsICJ0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSIpCitPUEVOTVBfRElSRUNUSVZFX0VYVCh0YXJnZXRfdGVhbXNfZGlzdHJpYnV0ZV9wYXJhbGxlbF9mb3IsICJ0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3IiKQorT1BFTk1QX0RJUkVDVElWRV9FWFQodGFyZ2V0X3RlYW1zX2Rpc3RyaWJ1dGVfcGFyYWxsZWxfZm9yX3NpbWQsICJ0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3Igc2ltZCIpCitPUEVOTVBfRElSRUNUSVZFX0VYVCh0YXJnZXRfdGVhbXNfZGlzdHJpYnV0ZV9zaW1kLCAidGFyZ2V0IHRlYW1zIGRpc3RyaWJ1dGUgc2ltZCIpCisKKy8vIE9wZW5NUCBjbGF1c2VzLgorT1BFTk1QX0NMQVVTRShpZiwgT01QSWZDbGF1c2UpCitPUEVOTVBfQ0xBVVNFKGZpbmFsLCBPTVBGaW5hbENsYXVzZSkKK09QRU5NUF9DTEFVU0UobnVtX3RocmVhZHMsIE9NUE51bVRocmVhZHNDbGF1c2UpCitPUEVOTVBfQ0xBVVNFKHNhZmVsZW4sIE9NUFNhZmVsZW5DbGF1c2UpCitPUEVOTVBfQ0xBVVNFKHNpbWRsZW4sIE9NUFNpbWRsZW5DbGF1c2UpCitPUEVOTVBfQ0xBVVNFKGNvbGxhcHNlLCBPTVBDb2xsYXBzZUNsYXVzZSkKK09QRU5NUF9DTEFVU0UoZGVmYXVsdCwgT01QRGVmYXVsdENsYXVzZSkKK09QRU5NUF9DTEFVU0UocHJpdmF0ZSwgT01QUHJpdmF0ZUNsYXVzZSkKK09QRU5NUF9DTEFVU0UoZmlyc3Rwcml2YXRlLCBPTVBGaXJzdHByaXZhdGVDbGF1c2UpCitPUEVOTVBfQ0xBVVNFKGxhc3Rwcml2YXRlLCBPTVBMYXN0cHJpdmF0ZUNsYXVzZSkKK09QRU5NUF9DTEFVU0Uoc2hhcmVkLCAgT01QU2hhcmVkQ2xhdXNlKQorT1BFTk1QX0NMQVVTRShyZWR1Y3Rpb24sICBPTVBSZWR1Y3Rpb25DbGF1c2UpCitPUEVOTVBfQ0xBVVNFKGxpbmVhciwgIE9NUExpbmVhckNsYXVzZSkKK09QRU5NUF9DTEFVU0UoYWxpZ25lZCwgT01QQWxpZ25lZENsYXVzZSkKK09QRU5NUF9DTEFVU0UoY29weWluLCAgT01QQ29weWluQ2xhdXNlKQorT1BFTk1QX0NMQVVTRShjb3B5cHJpdmF0ZSwgIE9NUENvcHlwcml2YXRlQ2xhdXNlKQorT1BFTk1QX0NMQVVTRShwcm9jX2JpbmQsIE9NUFByb2NCaW5kQ2xhdXNlKQorT1BFTk1QX0NMQVVTRShzY2hlZHVsZSwgT01QU2NoZWR1bGVDbGF1c2UpCitPUEVOTVBfQ0xBVVNFKG9yZGVyZWQsIE9NUE9yZGVyZWRDbGF1c2UpCitPUEVOTVBfQ0xBVVNFKG5vd2FpdCwgT01QTm93YWl0Q2xhdXNlKQorT1BFTk1QX0NMQVVTRSh1bnRpZWQsIE9NUFVudGllZENsYXVzZSkKK09QRU5NUF9DTEFVU0UobWVyZ2VhYmxlLCBPTVBNZXJnZWFibGVDbGF1c2UpCitPUEVOTVBfQ0xBVVNFKGZsdXNoLCBPTVBGbHVzaENsYXVzZSkKK09QRU5NUF9DTEFVU0UocmVhZCwgT01QUmVhZENsYXVzZSkKK09QRU5NUF9DTEFVU0Uod3JpdGUsIE9NUFdyaXRlQ2xhdXNlKQorT1BFTk1QX0NMQVVTRSh1cGRhdGUsIE9NUFVwZGF0ZUNsYXVzZSkKK09QRU5NUF9DTEFVU0UoY2FwdHVyZSwgT01QQ2FwdHVyZUNsYXVzZSkKK09QRU5NUF9DTEFVU0Uoc2VxX2NzdCwgT01QU2VxQ3N0Q2xhdXNlKQorT1BFTk1QX0NMQVVTRShkZXBlbmQsIE9NUERlcGVuZENsYXVzZSkKK09QRU5NUF9DTEFVU0UoZGV2aWNlLCBPTVBEZXZpY2VDbGF1c2UpCitPUEVOTVBfQ0xBVVNFKHRocmVhZHMsIE9NUFRocmVhZHNDbGF1c2UpCitPUEVOTVBfQ0xBVVNFKHNpbWQsIE9NUFNJTURDbGF1c2UpCitPUEVOTVBfQ0xBVVNFKG1hcCwgT01QTWFwQ2xhdXNlKQorT1BFTk1QX0NMQVVTRShudW1fdGVhbXMsIE9NUE51bVRlYW1zQ2xhdXNlKQorT1BFTk1QX0NMQVVTRSh0aHJlYWRfbGltaXQsIE9NUFRocmVhZExpbWl0Q2xhdXNlKQorT1BFTk1QX0NMQVVTRShwcmlvcml0eSwgT01QUHJpb3JpdHlDbGF1c2UpCitPUEVOTVBfQ0xBVVNFKGdyYWluc2l6ZSwgT01QR3JhaW5zaXplQ2xhdXNlKQorT1BFTk1QX0NMQVVTRShub2dyb3VwLCBPTVBOb2dyb3VwQ2xhdXNlKQorT1BFTk1QX0NMQVVTRShudW1fdGFza3MsIE9NUE51bVRhc2tzQ2xhdXNlKQorT1BFTk1QX0NMQVVTRShoaW50LCBPTVBIaW50Q2xhdXNlKQorT1BFTk1QX0NMQVVTRShkaXN0X3NjaGVkdWxlLCBPTVBEaXN0U2NoZWR1bGVDbGF1c2UpCitPUEVOTVBfQ0xBVVNFKGRlZmF1bHRtYXAsIE9NUERlZmF1bHRtYXBDbGF1c2UpCitPUEVOTVBfQ0xBVVNFKHRvLCBPTVBUb0NsYXVzZSkKK09QRU5NUF9DTEFVU0UoZnJvbSwgT01QRnJvbUNsYXVzZSkKK09QRU5NUF9DTEFVU0UodXNlX2RldmljZV9wdHIsIE9NUFVzZURldmljZVB0ckNsYXVzZSkKK09QRU5NUF9DTEFVU0UoaXNfZGV2aWNlX3B0ciwgT01QSXNEZXZpY2VQdHJDbGF1c2UpCitPUEVOTVBfQ0xBVVNFKHRhc2tfcmVkdWN0aW9uLCAgT01QVGFza1JlZHVjdGlvbkNsYXVzZSkKK09QRU5NUF9DTEFVU0UoaW5fcmVkdWN0aW9uLCAgT01QSW5SZWR1Y3Rpb25DbGF1c2UpCisKKy8vIENsYXVzZXMgYWxsb3dlZCBmb3IgT3Blbk1QIGRpcmVjdGl2ZSAncGFyYWxsZWwnLgorT1BFTk1QX1BBUkFMTEVMX0NMQVVTRShpZikKK09QRU5NUF9QQVJBTExFTF9DTEFVU0UobnVtX3RocmVhZHMpCitPUEVOTVBfUEFSQUxMRUxfQ0xBVVNFKGRlZmF1bHQpCitPUEVOTVBfUEFSQUxMRUxfQ0xBVVNFKHByb2NfYmluZCkKK09QRU5NUF9QQVJBTExFTF9DTEFVU0UocHJpdmF0ZSkKK09QRU5NUF9QQVJBTExFTF9DTEFVU0UoZmlyc3Rwcml2YXRlKQorT1BFTk1QX1BBUkFMTEVMX0NMQVVTRShzaGFyZWQpCitPUEVOTVBfUEFSQUxMRUxfQ0xBVVNFKHJlZHVjdGlvbikKK09QRU5NUF9QQVJBTExFTF9DTEFVU0UoY29weWluKQorCisvLyBDbGF1c2VzIGFsbG93ZWQgZm9yIGRpcmVjdGl2ZSAnb21wIHNpbWQnLgorT1BFTk1QX1NJTURfQ0xBVVNFKHByaXZhdGUpCitPUEVOTVBfU0lNRF9DTEFVU0UobGFzdHByaXZhdGUpCitPUEVOTVBfU0lNRF9DTEFVU0UobGluZWFyKQorT1BFTk1QX1NJTURfQ0xBVVNFKGFsaWduZWQpCitPUEVOTVBfU0lNRF9DTEFVU0Uoc2FmZWxlbikKK09QRU5NUF9TSU1EX0NMQVVTRShzaW1kbGVuKQorT1BFTk1QX1NJTURfQ0xBVVNFKGNvbGxhcHNlKQorT1BFTk1QX1NJTURfQ0xBVVNFKHJlZHVjdGlvbikKKworLy8gQ2xhdXNlcyBhbGxvd2VkIGZvciBkaXJlY3RpdmUgJ29tcCBmb3InLgorT1BFTk1QX0ZPUl9DTEFVU0UocHJpdmF0ZSkKK09QRU5NUF9GT1JfQ0xBVVNFKGxhc3Rwcml2YXRlKQorT1BFTk1QX0ZPUl9DTEFVU0UoZmlyc3Rwcml2YXRlKQorT1BFTk1QX0ZPUl9DTEFVU0UocmVkdWN0aW9uKQorT1BFTk1QX0ZPUl9DTEFVU0UoY29sbGFwc2UpCitPUEVOTVBfRk9SX0NMQVVTRShzY2hlZHVsZSkKK09QRU5NUF9GT1JfQ0xBVVNFKG9yZGVyZWQpCitPUEVOTVBfRk9SX0NMQVVTRShub3dhaXQpCitPUEVOTVBfRk9SX0NMQVVTRShsaW5lYXIpCisKKy8vIENsYXVzZXMgYWxsb3dlZCBmb3IgZGlyZWN0aXZlICdvbXAgZm9yIHNpbWQnLgorT1BFTk1QX0ZPUl9TSU1EX0NMQVVTRShwcml2YXRlKQorT1BFTk1QX0ZPUl9TSU1EX0NMQVVTRShmaXJzdHByaXZhdGUpCitPUEVOTVBfRk9SX1NJTURfQ0xBVVNFKGxhc3Rwcml2YXRlKQorT1BFTk1QX0ZPUl9TSU1EX0NMQVVTRShyZWR1Y3Rpb24pCitPUEVOTVBfRk9SX1NJTURfQ0xBVVNFKHNjaGVkdWxlKQorT1BFTk1QX0ZPUl9TSU1EX0NMQVVTRShjb2xsYXBzZSkKK09QRU5NUF9GT1JfU0lNRF9DTEFVU0Uobm93YWl0KQorT1BFTk1QX0ZPUl9TSU1EX0NMQVVTRShzYWZlbGVuKQorT1BFTk1QX0ZPUl9TSU1EX0NMQVVTRShzaW1kbGVuKQorT1BFTk1QX0ZPUl9TSU1EX0NMQVVTRShsaW5lYXIpCitPUEVOTVBfRk9SX1NJTURfQ0xBVVNFKGFsaWduZWQpCitPUEVOTVBfRk9SX1NJTURfQ0xBVVNFKG9yZGVyZWQpCisKKy8vIENsYXVzZXMgYWxsb3dlZCBmb3IgT3Blbk1QIGRpcmVjdGl2ZSAnb21wIHNlY3Rpb25zJy4KK09QRU5NUF9TRUNUSU9OU19DTEFVU0UocHJpdmF0ZSkKK09QRU5NUF9TRUNUSU9OU19DTEFVU0UobGFzdHByaXZhdGUpCitPUEVOTVBfU0VDVElPTlNfQ0xBVVNFKGZpcnN0cHJpdmF0ZSkKK09QRU5NUF9TRUNUSU9OU19DTEFVU0UocmVkdWN0aW9uKQorT1BFTk1QX1NFQ1RJT05TX0NMQVVTRShub3dhaXQpCisKKy8vIENsYXVzZXMgYWxsb3dlZCBmb3IgZGlyZWN0aXZlICdvbXAgc2luZ2xlJy4KK09QRU5NUF9TSU5HTEVfQ0xBVVNFKHByaXZhdGUpCitPUEVOTVBfU0lOR0xFX0NMQVVTRShmaXJzdHByaXZhdGUpCitPUEVOTVBfU0lOR0xFX0NMQVVTRShjb3B5cHJpdmF0ZSkKK09QRU5NUF9TSU5HTEVfQ0xBVVNFKG5vd2FpdCkKKworLy8gQ2xhdXNlcyBhbGxvd2VkIGZvciBPcGVuTVAgZGlyZWN0aXZlICdjYW5jZWwnLgorT1BFTk1QX0NBTkNFTF9DTEFVU0UoaWYpCisKKy8vIFN0YXRpYyBhdHRyaWJ1dGVzIGZvciAnZGVmYXVsdCcgY2xhdXNlLgorT1BFTk1QX0RFRkFVTFRfS0lORChub25lKQorT1BFTk1QX0RFRkFVTFRfS0lORChzaGFyZWQpCisKKy8vIFN0YXRpYyBhdHRyaWJ1dGVzIGZvciAncHJvY19iaW5kJyBjbGF1c2UuCitPUEVOTVBfUFJPQ19CSU5EX0tJTkQobWFzdGVyKQorT1BFTk1QX1BST0NfQklORF9LSU5EKGNsb3NlKQorT1BFTk1QX1BST0NfQklORF9LSU5EKHNwcmVhZCkKKworLy8gU3RhdGljIGF0dHJpYnV0ZXMgZm9yICdzY2hlZHVsZScgY2xhdXNlLgorT1BFTk1QX1NDSEVEVUxFX0tJTkQoc3RhdGljKQorT1BFTk1QX1NDSEVEVUxFX0tJTkQoZHluYW1pYykKK09QRU5NUF9TQ0hFRFVMRV9LSU5EKGd1aWRlZCkKK09QRU5NUF9TQ0hFRFVMRV9LSU5EKGF1dG8pCitPUEVOTVBfU0NIRURVTEVfS0lORChydW50aW1lKQorCisvLyBNb2RpZmllcnMgZm9yICdzY2hlZHVsZScgY2xhdXNlLgorT1BFTk1QX1NDSEVEVUxFX01PRElGSUVSKG1vbm90b25pYykKK09QRU5NUF9TQ0hFRFVMRV9NT0RJRklFUihub25tb25vdG9uaWMpCitPUEVOTVBfU0NIRURVTEVfTU9ESUZJRVIoc2ltZCkKKworLy8gU3RhdGljIGF0dHJpYnV0ZXMgZm9yICdkZWZhdWx0bWFwJyBjbGF1c2UuCitPUEVOTVBfREVGQVVMVE1BUF9LSU5EKHNjYWxhcikKKworLy8gTW9kaWZpZXJzIGZvciAnZGVmYXVsdG1hcCcgY2xhdXNlLgorT1BFTk1QX0RFRkFVTFRNQVBfTU9ESUZJRVIodG9mcm9tKQorCisvLyBTdGF0aWMgYXR0cmlidXRlcyBmb3IgJ2RlcGVuZCcgY2xhdXNlLgorT1BFTk1QX0RFUEVORF9LSU5EKGluKQorT1BFTk1QX0RFUEVORF9LSU5EKG91dCkKK09QRU5NUF9ERVBFTkRfS0lORChpbm91dCkKK09QRU5NUF9ERVBFTkRfS0lORChzb3VyY2UpCitPUEVOTVBfREVQRU5EX0tJTkQoc2luaykKKworLy8gTW9kaWZpZXJzIGZvciAnbGluZWFyJyBjbGF1c2UuCitPUEVOTVBfTElORUFSX0tJTkQodmFsKQorT1BFTk1QX0xJTkVBUl9LSU5EKHJlZikKK09QRU5NUF9MSU5FQVJfS0lORCh1dmFsKQorCisvLyBDbGF1c2VzIGFsbG93ZWQgZm9yIE9wZW5NUCBkaXJlY3RpdmUgJ3BhcmFsbGVsIGZvcicuCitPUEVOTVBfUEFSQUxMRUxfRk9SX0NMQVVTRShpZikKK09QRU5NUF9QQVJBTExFTF9GT1JfQ0xBVVNFKG51bV90aHJlYWRzKQorT1BFTk1QX1BBUkFMTEVMX0ZPUl9DTEFVU0UoZGVmYXVsdCkKK09QRU5NUF9QQVJBTExFTF9GT1JfQ0xBVVNFKHByb2NfYmluZCkKK09QRU5NUF9QQVJBTExFTF9GT1JfQ0xBVVNFKHByaXZhdGUpCitPUEVOTVBfUEFSQUxMRUxfRk9SX0NMQVVTRShmaXJzdHByaXZhdGUpCitPUEVOTVBfUEFSQUxMRUxfRk9SX0NMQVVTRShzaGFyZWQpCitPUEVOTVBfUEFSQUxMRUxfRk9SX0NMQVVTRShyZWR1Y3Rpb24pCitPUEVOTVBfUEFSQUxMRUxfRk9SX0NMQVVTRShjb3B5aW4pCitPUEVOTVBfUEFSQUxMRUxfRk9SX0NMQVVTRShsYXN0cHJpdmF0ZSkKK09QRU5NUF9QQVJBTExFTF9GT1JfQ0xBVVNFKGNvbGxhcHNlKQorT1BFTk1QX1BBUkFMTEVMX0ZPUl9DTEFVU0Uoc2NoZWR1bGUpCitPUEVOTVBfUEFSQUxMRUxfRk9SX0NMQVVTRShvcmRlcmVkKQorT1BFTk1QX1BBUkFMTEVMX0ZPUl9DTEFVU0UobGluZWFyKQorCisvLyBDbGF1c2VzIGFsbG93ZWQgZm9yIE9wZW5NUCBkaXJlY3RpdmUgJ3BhcmFsbGVsIGZvciBzaW1kJy4KK09QRU5NUF9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UoaWYpCitPUEVOTVBfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKG51bV90aHJlYWRzKQorT1BFTk1QX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShkZWZhdWx0KQorT1BFTk1QX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShwcm9jX2JpbmQpCitPUEVOTVBfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKHByaXZhdGUpCitPUEVOTVBfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKGZpcnN0cHJpdmF0ZSkKK09QRU5NUF9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0Uoc2hhcmVkKQorT1BFTk1QX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShyZWR1Y3Rpb24pCitPUEVOTVBfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKGNvcHlpbikKK09QRU5NUF9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UobGFzdHByaXZhdGUpCitPUEVOTVBfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKGNvbGxhcHNlKQorT1BFTk1QX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShzY2hlZHVsZSkKK09QRU5NUF9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0Uoc2FmZWxlbikKK09QRU5NUF9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0Uoc2ltZGxlbikKK09QRU5NUF9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UobGluZWFyKQorT1BFTk1QX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShhbGlnbmVkKQorT1BFTk1QX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShvcmRlcmVkKQorCisvLyBDbGF1c2VzIGFsbG93ZWQgZm9yIE9wZW5NUCBkaXJlY3RpdmUgJ3BhcmFsbGVsIHNlY3Rpb25zJy4KK09QRU5NUF9QQVJBTExFTF9TRUNUSU9OU19DTEFVU0UoaWYpCitPUEVOTVBfUEFSQUxMRUxfU0VDVElPTlNfQ0xBVVNFKG51bV90aHJlYWRzKQorT1BFTk1QX1BBUkFMTEVMX1NFQ1RJT05TX0NMQVVTRShkZWZhdWx0KQorT1BFTk1QX1BBUkFMTEVMX1NFQ1RJT05TX0NMQVVTRShwcm9jX2JpbmQpCitPUEVOTVBfUEFSQUxMRUxfU0VDVElPTlNfQ0xBVVNFKHByaXZhdGUpCitPUEVOTVBfUEFSQUxMRUxfU0VDVElPTlNfQ0xBVVNFKGZpcnN0cHJpdmF0ZSkKK09QRU5NUF9QQVJBTExFTF9TRUNUSU9OU19DTEFVU0Uoc2hhcmVkKQorT1BFTk1QX1BBUkFMTEVMX1NFQ1RJT05TX0NMQVVTRShyZWR1Y3Rpb24pCitPUEVOTVBfUEFSQUxMRUxfU0VDVElPTlNfQ0xBVVNFKGNvcHlpbikKK09QRU5NUF9QQVJBTExFTF9TRUNUSU9OU19DTEFVU0UobGFzdHByaXZhdGUpCisKKy8vIENsYXVzZXMgYWxsb3dlZCBmb3IgT3Blbk1QIGRpcmVjdGl2ZSAndGFzaycuCitPUEVOTVBfVEFTS19DTEFVU0UoaWYpCitPUEVOTVBfVEFTS19DTEFVU0UoZmluYWwpCitPUEVOTVBfVEFTS19DTEFVU0UoZGVmYXVsdCkKK09QRU5NUF9UQVNLX0NMQVVTRShwcml2YXRlKQorT1BFTk1QX1RBU0tfQ0xBVVNFKGZpcnN0cHJpdmF0ZSkKK09QRU5NUF9UQVNLX0NMQVVTRShzaGFyZWQpCitPUEVOTVBfVEFTS19DTEFVU0UodW50aWVkKQorT1BFTk1QX1RBU0tfQ0xBVVNFKG1lcmdlYWJsZSkKK09QRU5NUF9UQVNLX0NMQVVTRShkZXBlbmQpCitPUEVOTVBfVEFTS19DTEFVU0UocHJpb3JpdHkpCitPUEVOTVBfVEFTS19DTEFVU0UoaW5fcmVkdWN0aW9uKQorCisvLyBDbGF1c2VzIGFsbG93ZWQgZm9yIE9wZW5NUCBkaXJlY3RpdmUgJ2F0b21pYycuCitPUEVOTVBfQVRPTUlDX0NMQVVTRShyZWFkKQorT1BFTk1QX0FUT01JQ19DTEFVU0Uod3JpdGUpCitPUEVOTVBfQVRPTUlDX0NMQVVTRSh1cGRhdGUpCitPUEVOTVBfQVRPTUlDX0NMQVVTRShjYXB0dXJlKQorT1BFTk1QX0FUT01JQ19DTEFVU0Uoc2VxX2NzdCkKKworLy8gQ2xhdXNlcyBhbGxvd2VkIGZvciBPcGVuTVAgZGlyZWN0aXZlICd0YXJnZXQnLgorT1BFTk1QX1RBUkdFVF9DTEFVU0UoaWYpCitPUEVOTVBfVEFSR0VUX0NMQVVTRShkZXZpY2UpCitPUEVOTVBfVEFSR0VUX0NMQVVTRShtYXApCitPUEVOTVBfVEFSR0VUX0NMQVVTRShwcml2YXRlKQorT1BFTk1QX1RBUkdFVF9DTEFVU0Uobm93YWl0KQorT1BFTk1QX1RBUkdFVF9DTEFVU0UoZGVwZW5kKQorT1BFTk1QX1RBUkdFVF9DTEFVU0UoZGVmYXVsdG1hcCkKK09QRU5NUF9UQVJHRVRfQ0xBVVNFKGZpcnN0cHJpdmF0ZSkKK09QRU5NUF9UQVJHRVRfQ0xBVVNFKGlzX2RldmljZV9wdHIpCitPUEVOTVBfVEFSR0VUX0NMQVVTRShyZWR1Y3Rpb24pCisKKy8vIENsYXVzZXMgYWxsb3dlZCBmb3IgT3Blbk1QIGRpcmVjdGl2ZSAndGFyZ2V0IGRhdGEnLgorT1BFTk1QX1RBUkdFVF9EQVRBX0NMQVVTRShpZikKK09QRU5NUF9UQVJHRVRfREFUQV9DTEFVU0UoZGV2aWNlKQorT1BFTk1QX1RBUkdFVF9EQVRBX0NMQVVTRShtYXApCitPUEVOTVBfVEFSR0VUX0RBVEFfQ0xBVVNFKHVzZV9kZXZpY2VfcHRyKQorCisvLyBDbGF1c2VzIGFsbG93ZWQgZm9yIE9wZW5NUCBkaXJlY3RpdmUgJ3RhcmdldCBlbnRlciBkYXRhJy4KK09QRU5NUF9UQVJHRVRfRU5URVJfREFUQV9DTEFVU0UoaWYpCitPUEVOTVBfVEFSR0VUX0VOVEVSX0RBVEFfQ0xBVVNFKGRldmljZSkKK09QRU5NUF9UQVJHRVRfRU5URVJfREFUQV9DTEFVU0UobWFwKQorT1BFTk1QX1RBUkdFVF9FTlRFUl9EQVRBX0NMQVVTRShub3dhaXQpCitPUEVOTVBfVEFSR0VUX0VOVEVSX0RBVEFfQ0xBVVNFKGRlcGVuZCkKKworLy8gQ2xhdXNlcyBhbGxvd2VkIGZvciBPcGVuTVAgZGlyZWN0aXZlICd0YXJnZXQgZXhpdCBkYXRhJy4KK09QRU5NUF9UQVJHRVRfRVhJVF9EQVRBX0NMQVVTRShpZikKK09QRU5NUF9UQVJHRVRfRVhJVF9EQVRBX0NMQVVTRShkZXZpY2UpCitPUEVOTVBfVEFSR0VUX0VYSVRfREFUQV9DTEFVU0UobWFwKQorT1BFTk1QX1RBUkdFVF9FWElUX0RBVEFfQ0xBVVNFKG5vd2FpdCkKK09QRU5NUF9UQVJHRVRfRVhJVF9EQVRBX0NMQVVTRShkZXBlbmQpCisKKy8vIENsYXVzZXMgYWxsb3dlZCBmb3IgT3Blbk1QIGRpcmVjdGl2ZSAndGFyZ2V0IHBhcmFsbGVsJy4KK09QRU5NUF9UQVJHRVRfUEFSQUxMRUxfQ0xBVVNFKGlmKQorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9DTEFVU0UoZGV2aWNlKQorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9DTEFVU0UobWFwKQorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9DTEFVU0UocHJpdmF0ZSkKK09QRU5NUF9UQVJHRVRfUEFSQUxMRUxfQ0xBVVNFKGZpcnN0cHJpdmF0ZSkKK09QRU5NUF9UQVJHRVRfUEFSQUxMRUxfQ0xBVVNFKG5vd2FpdCkKK09QRU5NUF9UQVJHRVRfUEFSQUxMRUxfQ0xBVVNFKGRlcGVuZCkKK09QRU5NUF9UQVJHRVRfUEFSQUxMRUxfQ0xBVVNFKGRlZmF1bHRtYXApCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0NMQVVTRShudW1fdGhyZWFkcykKK09QRU5NUF9UQVJHRVRfUEFSQUxMRUxfQ0xBVVNFKGRlZmF1bHQpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0NMQVVTRShwcm9jX2JpbmQpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0NMQVVTRShzaGFyZWQpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0NMQVVTRShyZWR1Y3Rpb24pCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0NMQVVTRShpc19kZXZpY2VfcHRyKQorCisvLyBDbGF1c2VzIGFsbG93ZWQgZm9yIE9wZW5NUCBkaXJlY3RpdmUgJ3RhcmdldCBwYXJhbGxlbCBmb3InLgorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9GT1JfQ0xBVVNFKGlmKQorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9GT1JfQ0xBVVNFKGRldmljZSkKK09QRU5NUF9UQVJHRVRfUEFSQUxMRUxfRk9SX0NMQVVTRShtYXApCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9DTEFVU0UocHJpdmF0ZSkKK09QRU5NUF9UQVJHRVRfUEFSQUxMRUxfRk9SX0NMQVVTRShmaXJzdHByaXZhdGUpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9DTEFVU0UobGFzdHByaXZhdGUpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9DTEFVU0Uobm93YWl0KQorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9GT1JfQ0xBVVNFKGRlcGVuZCkKK09QRU5NUF9UQVJHRVRfUEFSQUxMRUxfRk9SX0NMQVVTRShkZWZhdWx0bWFwKQorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9GT1JfQ0xBVVNFKG51bV90aHJlYWRzKQorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9GT1JfQ0xBVVNFKGRlZmF1bHQpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9DTEFVU0UocHJvY19iaW5kKQorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9GT1JfQ0xBVVNFKHNoYXJlZCkKK09QRU5NUF9UQVJHRVRfUEFSQUxMRUxfRk9SX0NMQVVTRShyZWR1Y3Rpb24pCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9DTEFVU0UoY29sbGFwc2UpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9DTEFVU0Uoc2NoZWR1bGUpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9DTEFVU0Uob3JkZXJlZCkKK09QRU5NUF9UQVJHRVRfUEFSQUxMRUxfRk9SX0NMQVVTRShsaW5lYXIpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9DTEFVU0UoaXNfZGV2aWNlX3B0cikKKworLy8gQ2xhdXNlcyBhbGxvd2VkIGZvciBPcGVuTVAgZGlyZWN0aXZlICd0YXJnZXQgdXBkYXRlJy4KK09QRU5NUF9UQVJHRVRfVVBEQVRFX0NMQVVTRShpZikKK09QRU5NUF9UQVJHRVRfVVBEQVRFX0NMQVVTRShkZXZpY2UpCitPUEVOTVBfVEFSR0VUX1VQREFURV9DTEFVU0UodG8pCitPUEVOTVBfVEFSR0VUX1VQREFURV9DTEFVU0UoZnJvbSkKK09QRU5NUF9UQVJHRVRfVVBEQVRFX0NMQVVTRShub3dhaXQpCitPUEVOTVBfVEFSR0VUX1VQREFURV9DTEFVU0UoZGVwZW5kKQorCisvLyBDbGF1c2VzIGFsbG93ZWQgZm9yIE9wZW5NUCBkaXJlY3RpdmUgJ3RlYW1zJy4KK09QRU5NUF9URUFNU19DTEFVU0UoZGVmYXVsdCkKK09QRU5NUF9URUFNU19DTEFVU0UocHJpdmF0ZSkKK09QRU5NUF9URUFNU19DTEFVU0UoZmlyc3Rwcml2YXRlKQorT1BFTk1QX1RFQU1TX0NMQVVTRShzaGFyZWQpCitPUEVOTVBfVEVBTVNfQ0xBVVNFKHJlZHVjdGlvbikKK09QRU5NUF9URUFNU19DTEFVU0UobnVtX3RlYW1zKQorT1BFTk1QX1RFQU1TX0NMQVVTRSh0aHJlYWRfbGltaXQpCisKKy8vIENsYXVzZXMgYWxsb3dlZCBmb3IgT3Blbk1QIGRpcmVjdGl2ZSAnb3JkZXJlZCcuCitPUEVOTVBfT1JERVJFRF9DTEFVU0UodGhyZWFkcykKK09QRU5NUF9PUkRFUkVEX0NMQVVTRShzaW1kKQorT1BFTk1QX09SREVSRURfQ0xBVVNFKGRlcGVuZCkKKworLy8gTWFwIHR5cGVzIGFuZCBtYXAgdHlwZSBtb2RpZmllciBmb3IgJ21hcCcgY2xhdXNlLgorT1BFTk1QX01BUF9LSU5EKGFsbG9jKQorT1BFTk1QX01BUF9LSU5EKHRvKQorT1BFTk1QX01BUF9LSU5EKGZyb20pCitPUEVOTVBfTUFQX0tJTkQodG9mcm9tKQorT1BFTk1QX01BUF9LSU5EKGRlbGV0ZSkKK09QRU5NUF9NQVBfS0lORChyZWxlYXNlKQorT1BFTk1QX01BUF9LSU5EKGFsd2F5cykKKworLy8gQ2xhdXNlcyBhbGxvd2VkIGZvciBPcGVuTVAgZGlyZWN0aXZlICd0YXNrbG9vcCcuCitPUEVOTVBfVEFTS0xPT1BfQ0xBVVNFKGlmKQorT1BFTk1QX1RBU0tMT09QX0NMQVVTRShzaGFyZWQpCitPUEVOTVBfVEFTS0xPT1BfQ0xBVVNFKHByaXZhdGUpCitPUEVOTVBfVEFTS0xPT1BfQ0xBVVNFKGZpcnN0cHJpdmF0ZSkKK09QRU5NUF9UQVNLTE9PUF9DTEFVU0UobGFzdHByaXZhdGUpCitPUEVOTVBfVEFTS0xPT1BfQ0xBVVNFKGRlZmF1bHQpCitPUEVOTVBfVEFTS0xPT1BfQ0xBVVNFKGNvbGxhcHNlKQorT1BFTk1QX1RBU0tMT09QX0NMQVVTRShmaW5hbCkKK09QRU5NUF9UQVNLTE9PUF9DTEFVU0UodW50aWVkKQorT1BFTk1QX1RBU0tMT09QX0NMQVVTRShtZXJnZWFibGUpCitPUEVOTVBfVEFTS0xPT1BfQ0xBVVNFKHByaW9yaXR5KQorT1BFTk1QX1RBU0tMT09QX0NMQVVTRShncmFpbnNpemUpCitPUEVOTVBfVEFTS0xPT1BfQ0xBVVNFKG5vZ3JvdXApCitPUEVOTVBfVEFTS0xPT1BfQ0xBVVNFKG51bV90YXNrcykKK09QRU5NUF9UQVNLTE9PUF9DTEFVU0UocmVkdWN0aW9uKQorT1BFTk1QX1RBU0tMT09QX0NMQVVTRShpbl9yZWR1Y3Rpb24pCisKKy8vIENsYXVzZXMgYWxsb3dlZCBmb3IgT3Blbk1QIGRpcmVjdGl2ZSAndGFza2xvb3Agc2ltZCcuCitPUEVOTVBfVEFTS0xPT1BfU0lNRF9DTEFVU0UoaWYpCitPUEVOTVBfVEFTS0xPT1BfU0lNRF9DTEFVU0Uoc2hhcmVkKQorT1BFTk1QX1RBU0tMT09QX1NJTURfQ0xBVVNFKHByaXZhdGUpCitPUEVOTVBfVEFTS0xPT1BfU0lNRF9DTEFVU0UoZmlyc3Rwcml2YXRlKQorT1BFTk1QX1RBU0tMT09QX1NJTURfQ0xBVVNFKGxhc3Rwcml2YXRlKQorT1BFTk1QX1RBU0tMT09QX1NJTURfQ0xBVVNFKGRlZmF1bHQpCitPUEVOTVBfVEFTS0xPT1BfU0lNRF9DTEFVU0UoY29sbGFwc2UpCitPUEVOTVBfVEFTS0xPT1BfU0lNRF9DTEFVU0UoZmluYWwpCitPUEVOTVBfVEFTS0xPT1BfU0lNRF9DTEFVU0UodW50aWVkKQorT1BFTk1QX1RBU0tMT09QX1NJTURfQ0xBVVNFKG1lcmdlYWJsZSkKK09QRU5NUF9UQVNLTE9PUF9TSU1EX0NMQVVTRShwcmlvcml0eSkKK09QRU5NUF9UQVNLTE9PUF9TSU1EX0NMQVVTRShsaW5lYXIpCitPUEVOTVBfVEFTS0xPT1BfU0lNRF9DTEFVU0UoYWxpZ25lZCkKK09QRU5NUF9UQVNLTE9PUF9TSU1EX0NMQVVTRShzYWZlbGVuKQorT1BFTk1QX1RBU0tMT09QX1NJTURfQ0xBVVNFKHNpbWRsZW4pCitPUEVOTVBfVEFTS0xPT1BfU0lNRF9DTEFVU0UoZ3JhaW5zaXplKQorT1BFTk1QX1RBU0tMT09QX1NJTURfQ0xBVVNFKG5vZ3JvdXApCitPUEVOTVBfVEFTS0xPT1BfU0lNRF9DTEFVU0UobnVtX3Rhc2tzKQorT1BFTk1QX1RBU0tMT09QX1NJTURfQ0xBVVNFKHJlZHVjdGlvbikKK09QRU5NUF9UQVNLTE9PUF9TSU1EX0NMQVVTRShpbl9yZWR1Y3Rpb24pCisKKy8vIENsYXVzZXMgYWxsb3dlZCBmb3IgT3Blbk1QIGRpcmVjdGl2ZSAnY3JpdGljYWwnLgorT1BFTk1QX0NSSVRJQ0FMX0NMQVVTRShoaW50KQorCisvLyBDbGF1c2VzIGFsbG93ZWQgZm9yIE9wZW5NUCBkaXJlY3RpdmUgJ2Rpc3RyaWJ1dGUnCitPUEVOTVBfRElTVFJJQlVURV9DTEFVU0UocHJpdmF0ZSkKK09QRU5NUF9ESVNUUklCVVRFX0NMQVVTRShmaXJzdHByaXZhdGUpCitPUEVOTVBfRElTVFJJQlVURV9DTEFVU0UobGFzdHByaXZhdGUpCitPUEVOTVBfRElTVFJJQlVURV9DTEFVU0UoY29sbGFwc2UpCitPUEVOTVBfRElTVFJJQlVURV9DTEFVU0UoZGlzdF9zY2hlZHVsZSkKKworLy8gU3RhdGljIGF0dHJpYnV0ZXMgZm9yICdkaXN0X3NjaGVkdWxlJyBjbGF1c2UuCitPUEVOTVBfRElTVF9TQ0hFRFVMRV9LSU5EKHN0YXRpYykKKworLy8gQ2xhdXNlcyBhbGxvd2VkIGZvciBPcGVuTVAgZGlyZWN0aXZlICdkaXN0cmlidXRlIHBhcmFsbGVsIGZvcicKK09QRU5NUF9ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UoZmlyc3Rwcml2YXRlKQorT1BFTk1QX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX0NMQVVTRShsYXN0cHJpdmF0ZSkKK09QRU5NUF9ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UoY29sbGFwc2UpCitPUEVOTVBfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFKGRpc3Rfc2NoZWR1bGUpCitPUEVOTVBfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFKGlmKQorT1BFTk1QX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX0NMQVVTRShudW1fdGhyZWFkcykKK09QRU5NUF9ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UoZGVmYXVsdCkKK09QRU5NUF9ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UocHJvY19iaW5kKQorT1BFTk1QX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX0NMQVVTRShwcml2YXRlKQorT1BFTk1QX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX0NMQVVTRShzaGFyZWQpCitPUEVOTVBfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFKHJlZHVjdGlvbikKK09QRU5NUF9ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UoY29weWluKQorT1BFTk1QX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX0NMQVVTRShzY2hlZHVsZSkKKworLy8gQ2xhdXNlcyBhbGxvd2VkIGZvciBPcGVuTVAgZGlyZWN0aXZlICdkaXN0cmlidXRlIHBhcmFsbGVsIGZvciBzaW1kJworT1BFTk1QX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKGZpcnN0cHJpdmF0ZSkKK09QRU5NUF9ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShsYXN0cHJpdmF0ZSkKK09QRU5NUF9ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShjb2xsYXBzZSkKK09QRU5NUF9ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShkaXN0X3NjaGVkdWxlKQorT1BFTk1QX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKGlmKQorT1BFTk1QX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKG51bV90aHJlYWRzKQorT1BFTk1QX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKGRlZmF1bHQpCitPUEVOTVBfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UocHJvY19iaW5kKQorT1BFTk1QX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKHByaXZhdGUpCitPUEVOTVBfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0Uoc2hhcmVkKQorT1BFTk1QX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKHJlZHVjdGlvbikKK09QRU5NUF9ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShjb3B5aW4pCitPUEVOTVBfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0Uoc2NoZWR1bGUpCitPUEVOTVBfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UobGluZWFyKQorT1BFTk1QX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKGFsaWduZWQpCitPUEVOTVBfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0Uoc2FmZWxlbikKK09QRU5NUF9ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShzaW1kbGVuKQorCisvLyBDbGF1c2VzIGFsbG93ZWQgZm9yIE9wZW5NUCBkaXJlY3RpdmUgJ2Rpc3RyaWJ1dGUgc2ltZCcKK09QRU5NUF9ESVNUUklCVVRFX1NJTURfQ0xBVVNFKHByaXZhdGUpCitPUEVOTVBfRElTVFJJQlVURV9TSU1EX0NMQVVTRShmaXJzdHByaXZhdGUpCitPUEVOTVBfRElTVFJJQlVURV9TSU1EX0NMQVVTRShsYXN0cHJpdmF0ZSkKK09QRU5NUF9ESVNUUklCVVRFX1NJTURfQ0xBVVNFKGNvbGxhcHNlKQorT1BFTk1QX0RJU1RSSUJVVEVfU0lNRF9DTEFVU0UoZGlzdF9zY2hlZHVsZSkKK09QRU5NUF9ESVNUUklCVVRFX1NJTURfQ0xBVVNFKGxpbmVhcikKK09QRU5NUF9ESVNUUklCVVRFX1NJTURfQ0xBVVNFKGFsaWduZWQpCitPUEVOTVBfRElTVFJJQlVURV9TSU1EX0NMQVVTRShzYWZlbGVuKQorT1BFTk1QX0RJU1RSSUJVVEVfU0lNRF9DTEFVU0Uoc2ltZGxlbikKK09QRU5NUF9ESVNUUklCVVRFX1NJTURfQ0xBVVNFKHJlZHVjdGlvbikKKworLy8gQ2xhdXNlcyBhbGxvd2VkIGZvciBPcGVuTVAgZGlyZWN0aXZlICd0YXJnZXQgcGFyYWxsZWwgZm9yIHNpbWQnLgorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UoaWYpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShkZXZpY2UpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShtYXApCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShwcml2YXRlKQorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UoZmlyc3Rwcml2YXRlKQorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UobGFzdHByaXZhdGUpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShub3dhaXQpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShkZXBlbmQpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShkZWZhdWx0bWFwKQorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UobnVtX3RocmVhZHMpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShkZWZhdWx0KQorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UocHJvY19iaW5kKQorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0Uoc2hhcmVkKQorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UocmVkdWN0aW9uKQorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UoY29sbGFwc2UpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShzY2hlZHVsZSkKK09QRU5NUF9UQVJHRVRfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKG9yZGVyZWQpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShsaW5lYXIpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShzYWZlbGVuKQorT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0Uoc2ltZGxlbikKK09QRU5NUF9UQVJHRVRfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKGFsaWduZWQpCitPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShpc19kZXZpY2VfcHRyKQorCisvLyBDbGF1c2VzIGFsbG93ZWQgZm9yIE9wZW5NUCBkaXJlY3RpdmUgJ3RhcmdldCBzaW1kJy4KK09QRU5NUF9UQVJHRVRfU0lNRF9DTEFVU0UoaWYpCitPUEVOTVBfVEFSR0VUX1NJTURfQ0xBVVNFKGRldmljZSkKK09QRU5NUF9UQVJHRVRfU0lNRF9DTEFVU0UobWFwKQorT1BFTk1QX1RBUkdFVF9TSU1EX0NMQVVTRShwcml2YXRlKQorT1BFTk1QX1RBUkdFVF9TSU1EX0NMQVVTRShub3dhaXQpCitPUEVOTVBfVEFSR0VUX1NJTURfQ0xBVVNFKGRlcGVuZCkKK09QRU5NUF9UQVJHRVRfU0lNRF9DTEFVU0UoZGVmYXVsdG1hcCkKK09QRU5NUF9UQVJHRVRfU0lNRF9DTEFVU0UoZmlyc3Rwcml2YXRlKQorT1BFTk1QX1RBUkdFVF9TSU1EX0NMQVVTRShpc19kZXZpY2VfcHRyKQorT1BFTk1QX1RBUkdFVF9TSU1EX0NMQVVTRShsYXN0cHJpdmF0ZSkKK09QRU5NUF9UQVJHRVRfU0lNRF9DTEFVU0UobGluZWFyKQorT1BFTk1QX1RBUkdFVF9TSU1EX0NMQVVTRShhbGlnbmVkKQorT1BFTk1QX1RBUkdFVF9TSU1EX0NMQVVTRShzYWZlbGVuKQorT1BFTk1QX1RBUkdFVF9TSU1EX0NMQVVTRShzaW1kbGVuKQorT1BFTk1QX1RBUkdFVF9TSU1EX0NMQVVTRShjb2xsYXBzZSkKK09QRU5NUF9UQVJHRVRfU0lNRF9DTEFVU0UocmVkdWN0aW9uKQorCisvLyBDbGF1c2VzIGFsbG93ZWQgZm9yIE9wZW5NUCBkaXJlY3RpdmUgJ3RlYW1zIGRpc3RyaWJ1dGUnLgorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfQ0xBVVNFKGRlZmF1bHQpCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9DTEFVU0UocHJpdmF0ZSkKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX0NMQVVTRShmaXJzdHByaXZhdGUpCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9DTEFVU0Uoc2hhcmVkKQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfQ0xBVVNFKHJlZHVjdGlvbikKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX0NMQVVTRShudW1fdGVhbXMpCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9DTEFVU0UodGhyZWFkX2xpbWl0KQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfQ0xBVVNFKGxhc3Rwcml2YXRlKQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfQ0xBVVNFKGNvbGxhcHNlKQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfQ0xBVVNFKGRpc3Rfc2NoZWR1bGUpCisKKy8vIENsYXVzZXMgYWxsb3dlZCBmb3IgT3Blbk1QIGRpcmVjdGl2ZSAndGVhbXMgZGlzdHJpYnV0ZSBzaW1kJworT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfU0lNRF9DTEFVU0UoZGVmYXVsdCkKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX1NJTURfQ0xBVVNFKHByaXZhdGUpCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9TSU1EX0NMQVVTRShmaXJzdHByaXZhdGUpCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9TSU1EX0NMQVVTRShzaGFyZWQpCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9TSU1EX0NMQVVTRShyZWR1Y3Rpb24pCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9TSU1EX0NMQVVTRShudW1fdGVhbXMpCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9TSU1EX0NMQVVTRSh0aHJlYWRfbGltaXQpCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9TSU1EX0NMQVVTRShsYXN0cHJpdmF0ZSkKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX1NJTURfQ0xBVVNFKGNvbGxhcHNlKQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfU0lNRF9DTEFVU0UoZGlzdF9zY2hlZHVsZSkKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX1NJTURfQ0xBVVNFKGxpbmVhcikKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX1NJTURfQ0xBVVNFKGFsaWduZWQpCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9TSU1EX0NMQVVTRShzYWZlbGVuKQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfU0lNRF9DTEFVU0Uoc2ltZGxlbikKKworLy8gQ2xhdXNlcyBhbGxvd2VkIGZvciBPcGVuTVAgZGlyZWN0aXZlICd0ZWFtcyBkaXN0cmlidXRlIHBhcmFsbGVsIGZvciBzaW1kJworT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKGZpcnN0cHJpdmF0ZSkKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShsYXN0cHJpdmF0ZSkKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShjb2xsYXBzZSkKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShkaXN0X3NjaGVkdWxlKQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKGlmKQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKG51bV90aHJlYWRzKQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKGRlZmF1bHQpCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UocHJvY19iaW5kKQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKHByaXZhdGUpCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0Uoc2hhcmVkKQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKHJlZHVjdGlvbikKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShzY2hlZHVsZSkKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShsaW5lYXIpCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UoYWxpZ25lZCkKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShzYWZlbGVuKQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKHNpbWRsZW4pCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UobnVtX3RlYW1zKQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKHRocmVhZF9saW1pdCkKKworLy8gQ2xhdXNlcyBhbGxvd2VkIGZvciBPcGVuTVAgZGlyZWN0aXZlICd0ZWFtcyBkaXN0cmlidXRlIHBhcmFsbGVsIGZvcicKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UoZmlyc3Rwcml2YXRlKQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX0NMQVVTRShsYXN0cHJpdmF0ZSkKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UoY29sbGFwc2UpCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFKGRpc3Rfc2NoZWR1bGUpCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFKGlmKQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX0NMQVVTRShudW1fdGhyZWFkcykKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UoZGVmYXVsdCkKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UocHJvY19iaW5kKQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX0NMQVVTRShwcml2YXRlKQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX0NMQVVTRShzaGFyZWQpCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFKHJlZHVjdGlvbikKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0Uoc2NoZWR1bGUpCitPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFKG51bV90ZWFtcykKK09QRU5NUF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UodGhyZWFkX2xpbWl0KQorT1BFTk1QX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX0NMQVVTRShjb3B5aW4pCisKKy8vIENsYXVzZXMgYWxsb3dlZCBmb3IgT3Blbk1QIGRpcmVjdGl2ZSAndGFyZ2V0IHRlYW1zJy4KK09QRU5NUF9UQVJHRVRfVEVBTVNfQ0xBVVNFKGlmKQorT1BFTk1QX1RBUkdFVF9URUFNU19DTEFVU0UoZGV2aWNlKQorT1BFTk1QX1RBUkdFVF9URUFNU19DTEFVU0UobWFwKQorT1BFTk1QX1RBUkdFVF9URUFNU19DTEFVU0UocHJpdmF0ZSkKK09QRU5NUF9UQVJHRVRfVEVBTVNfQ0xBVVNFKG5vd2FpdCkKK09QRU5NUF9UQVJHRVRfVEVBTVNfQ0xBVVNFKGRlcGVuZCkKK09QRU5NUF9UQVJHRVRfVEVBTVNfQ0xBVVNFKGRlZmF1bHRtYXApCitPUEVOTVBfVEFSR0VUX1RFQU1TX0NMQVVTRShmaXJzdHByaXZhdGUpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0NMQVVTRShpc19kZXZpY2VfcHRyKQorT1BFTk1QX1RBUkdFVF9URUFNU19DTEFVU0UoZGVmYXVsdCkKK09QRU5NUF9UQVJHRVRfVEVBTVNfQ0xBVVNFKHNoYXJlZCkKK09QRU5NUF9UQVJHRVRfVEVBTVNfQ0xBVVNFKHJlZHVjdGlvbikKK09QRU5NUF9UQVJHRVRfVEVBTVNfQ0xBVVNFKG51bV90ZWFtcykKK09QRU5NUF9UQVJHRVRfVEVBTVNfQ0xBVVNFKHRocmVhZF9saW1pdCkKKworLy8gQ2xhdXNlcyBhbGxvd2VkIGZvciBPcGVuTVAgZGlyZWN0aXZlICd0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZScuCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfQ0xBVVNFKGlmKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX0NMQVVTRShkZXZpY2UpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfQ0xBVVNFKG1hcCkKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9DTEFVU0UocHJpdmF0ZSkKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9DTEFVU0Uobm93YWl0KQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX0NMQVVTRShkZXBlbmQpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfQ0xBVVNFKGRlZmF1bHRtYXApCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfQ0xBVVNFKGZpcnN0cHJpdmF0ZSkKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9DTEFVU0UoaXNfZGV2aWNlX3B0cikKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9DTEFVU0UoZGVmYXVsdCkKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9DTEFVU0Uoc2hhcmVkKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX0NMQVVTRShyZWR1Y3Rpb24pCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfQ0xBVVNFKG51bV90ZWFtcykKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9DTEFVU0UodGhyZWFkX2xpbWl0KQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX0NMQVVTRShsYXN0cHJpdmF0ZSkKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9DTEFVU0UoY29sbGFwc2UpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfQ0xBVVNFKGRpc3Rfc2NoZWR1bGUpCisKKy8vIENsYXVzZXMgYWxsb3dlZCBmb3IgT3Blbk1QIGRpcmVjdGl2ZSAndGFyZ2V0IHRlYW1zIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yJy4KK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFKGlmKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UoZGV2aWNlKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UobWFwKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UocHJpdmF0ZSkKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFKG5vd2FpdCkKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFKGRlcGVuZCkKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFKGRlZmF1bHRtYXApCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX0NMQVVTRShmaXJzdHByaXZhdGUpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX0NMQVVTRShpc19kZXZpY2VfcHRyKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UoZGVmYXVsdCkKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFKHNoYXJlZCkKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFKHJlZHVjdGlvbikKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFKG51bV90ZWFtcykKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFKHRocmVhZF9saW1pdCkKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFKGxhc3Rwcml2YXRlKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UoY29sbGFwc2UpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX0NMQVVTRShkaXN0X3NjaGVkdWxlKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UobnVtX3RocmVhZHMpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX0NMQVVTRShwcm9jX2JpbmQpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX0NMQVVTRShzY2hlZHVsZSkKKworLy8gQ2xhdXNlcyBhbGxvd2VkIGZvciBPcGVuTVAgZGlyZWN0aXZlCisvLyAndGFyZ2V0IHRlYW1zIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yIHNpbWQnLgorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShpZikKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UoZGV2aWNlKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShtYXApCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKHByaXZhdGUpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKG5vd2FpdCkKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UoZGVwZW5kKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShkZWZhdWx0bWFwKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShmaXJzdHByaXZhdGUpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKGlzX2RldmljZV9wdHIpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKGRlZmF1bHQpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKHNoYXJlZCkKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UocmVkdWN0aW9uKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShudW1fdGVhbXMpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKHRocmVhZF9saW1pdCkKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UobGFzdHByaXZhdGUpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFKGNvbGxhcHNlKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShkaXN0X3NjaGVkdWxlKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShudW1fdGhyZWFkcykKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UocHJvY19iaW5kKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShzY2hlZHVsZSkKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UobGluZWFyKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShhbGlnbmVkKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShzYWZlbGVuKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRShzaW1kbGVuKQorCisvLyBDbGF1c2VzIGFsbG93ZWQgZm9yIE9wZW5NUCBkaXJlY3RpdmUgJ3RhcmdldCB0ZWFtcyBkaXN0cmlidXRlIHNpbWQnLgorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1NJTURfQ0xBVVNFKGlmKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1NJTURfQ0xBVVNFKGRldmljZSkKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9TSU1EX0NMQVVTRShtYXApCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfU0lNRF9DTEFVU0UocHJpdmF0ZSkKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9TSU1EX0NMQVVTRShub3dhaXQpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfU0lNRF9DTEFVU0UoZGVwZW5kKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1NJTURfQ0xBVVNFKGRlZmF1bHRtYXApCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfU0lNRF9DTEFVU0UoZmlyc3Rwcml2YXRlKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1NJTURfQ0xBVVNFKGxhc3Rwcml2YXRlKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1NJTURfQ0xBVVNFKGlzX2RldmljZV9wdHIpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfU0lNRF9DTEFVU0Uoc2hhcmVkKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1NJTURfQ0xBVVNFKHJlZHVjdGlvbikKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9TSU1EX0NMQVVTRShudW1fdGVhbXMpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfU0lNRF9DTEFVU0UodGhyZWFkX2xpbWl0KQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1NJTURfQ0xBVVNFKGNvbGxhcHNlKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1NJTURfQ0xBVVNFKGRpc3Rfc2NoZWR1bGUpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfU0lNRF9DTEFVU0UobGluZWFyKQorT1BFTk1QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1NJTURfQ0xBVVNFKGFsaWduZWQpCitPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfU0lNRF9DTEFVU0Uoc2FmZWxlbikKK09QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9TSU1EX0NMQVVTRShzaW1kbGVuKQorCisvLyBDbGF1c2VzIGFsbG93ZWQgZm9yIE9wZW5NUCBkaXJlY3RpdmUgJ3Rhc2tncm91cCcuCitPUEVOTVBfVEFTS0dST1VQX0NMQVVTRSh0YXNrX3JlZHVjdGlvbikKKworI3VuZGVmIE9QRU5NUF9UQVNLR1JPVVBfQ0xBVVNFCisjdW5kZWYgT1BFTk1QX1RBU0tMT09QX1NJTURfQ0xBVVNFCisjdW5kZWYgT1BFTk1QX1RBU0tMT09QX0NMQVVTRQorI3VuZGVmIE9QRU5NUF9MSU5FQVJfS0lORAorI3VuZGVmIE9QRU5NUF9ERVBFTkRfS0lORAorI3VuZGVmIE9QRU5NUF9TQ0hFRFVMRV9NT0RJRklFUgorI3VuZGVmIE9QRU5NUF9TQ0hFRFVMRV9LSU5ECisjdW5kZWYgT1BFTk1QX1BST0NfQklORF9LSU5ECisjdW5kZWYgT1BFTk1QX0RFRkFVTFRfS0lORAorI3VuZGVmIE9QRU5NUF9ESVJFQ1RJVkUKKyN1bmRlZiBPUEVOTVBfRElSRUNUSVZFX0VYVAorI3VuZGVmIE9QRU5NUF9DTEFVU0UKKyN1bmRlZiBPUEVOTVBfQ1JJVElDQUxfQ0xBVVNFCisjdW5kZWYgT1BFTk1QX09SREVSRURfQ0xBVVNFCisjdW5kZWYgT1BFTk1QX0NBTkNFTF9DTEFVU0UKKyN1bmRlZiBPUEVOTVBfU0lOR0xFX0NMQVVTRQorI3VuZGVmIE9QRU5NUF9TRUNUSU9OU19DTEFVU0UKKyN1bmRlZiBPUEVOTVBfUEFSQUxMRUxfQ0xBVVNFCisjdW5kZWYgT1BFTk1QX1BBUkFMTEVMX0ZPUl9DTEFVU0UKKyN1bmRlZiBPUEVOTVBfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFCisjdW5kZWYgT1BFTk1QX1BBUkFMTEVMX1NFQ1RJT05TX0NMQVVTRQorI3VuZGVmIE9QRU5NUF9UQVNLX0NMQVVTRQorI3VuZGVmIE9QRU5NUF9BVE9NSUNfQ0xBVVNFCisjdW5kZWYgT1BFTk1QX1RBUkdFVF9DTEFVU0UKKyN1bmRlZiBPUEVOTVBfVEFSR0VUX0RBVEFfQ0xBVVNFCisjdW5kZWYgT1BFTk1QX1RBUkdFVF9FTlRFUl9EQVRBX0NMQVVTRQorI3VuZGVmIE9QRU5NUF9UQVJHRVRfRVhJVF9EQVRBX0NMQVVTRQorI3VuZGVmIE9QRU5NUF9UQVJHRVRfUEFSQUxMRUxfQ0xBVVNFCisjdW5kZWYgT1BFTk1QX1RBUkdFVF9QQVJBTExFTF9GT1JfQ0xBVVNFCisjdW5kZWYgT1BFTk1QX1RFQU1TX0NMQVVTRQorI3VuZGVmIE9QRU5NUF9TSU1EX0NMQVVTRQorI3VuZGVmIE9QRU5NUF9GT1JfQ0xBVVNFCisjdW5kZWYgT1BFTk1QX0ZPUl9TSU1EX0NMQVVTRQorI3VuZGVmIE9QRU5NUF9NQVBfS0lORAorI3VuZGVmIE9QRU5NUF9ESVNUUklCVVRFX0NMQVVTRQorI3VuZGVmIE9QRU5NUF9ESVNUX1NDSEVEVUxFX0tJTkQKKyN1bmRlZiBPUEVOTVBfREVGQVVMVE1BUF9LSU5ECisjdW5kZWYgT1BFTk1QX0RFRkFVTFRNQVBfTU9ESUZJRVIKKyN1bmRlZiBPUEVOTVBfVEFSR0VUX1VQREFURV9DTEFVU0UKKyN1bmRlZiBPUEVOTVBfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfQ0xBVVNFCisjdW5kZWYgT1BFTk1QX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfQ0xBVVNFCisjdW5kZWYgT1BFTk1QX0RJU1RSSUJVVEVfU0lNRF9DTEFVU0UKKyN1bmRlZiBPUEVOTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRQorI3VuZGVmIE9QRU5NUF9UQVJHRVRfU0lNRF9DTEFVU0UKKyN1bmRlZiBPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9DTEFVU0UKKyN1bmRlZiBPUEVOTVBfVEVBTVNfRElTVFJJQlVURV9TSU1EX0NMQVVTRQorI3VuZGVmIE9QRU5NUF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9TSU1EX0NMQVVTRQorI3VuZGVmIE9QRU5NUF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9DTEFVU0UKKyN1bmRlZiBPUEVOTVBfVEFSR0VUX1RFQU1TX0NMQVVTRQorI3VuZGVmIE9QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9DTEFVU0UKKyN1bmRlZiBPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX0NMQVVTRQorI3VuZGVmIE9QRU5NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9DTEFVU0UKKyN1bmRlZiBPUEVOTVBfVEFSR0VUX1RFQU1TX0RJU1RSSUJVVEVfU0lNRF9DTEFVU0UKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL09wZW5NUEtpbmRzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9PcGVuTVBLaW5kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMDMzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9PcGVuTVBLaW5kcy5oCkBAIC0wLDAgKzEsMjQ1IEBACisvLz09PS0tLSBPcGVuTVBLaW5kcy5oIC0gT3Blbk1QIGVudW1zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyBzb21lIE9wZW5NUC1zcGVjaWZpYyBlbnVtcyBhbmQgZnVuY3Rpb25zLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfT1BFTk1QS0lORFNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX09QRU5NUEtJTkRTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCisvLy8gXGJyaWVmIE9wZW5NUCBkaXJlY3RpdmVzLgorZW51bSBPcGVuTVBEaXJlY3RpdmVLaW5kIHsKKyNkZWZpbmUgT1BFTk1QX0RJUkVDVElWRShOYW1lKSBcCisgIE9NUERfIyNOYW1lLAorI2RlZmluZSBPUEVOTVBfRElSRUNUSVZFX0VYVChOYW1lLCBTdHIpIFwKKyAgT01QRF8jI05hbWUsCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3Blbk1QS2luZHMuZGVmIgorICBPTVBEX3Vua25vd24KK307CisKKy8vLyBcYnJpZWYgT3Blbk1QIGNsYXVzZXMuCitlbnVtIE9wZW5NUENsYXVzZUtpbmQgeworI2RlZmluZSBPUEVOTVBfQ0xBVVNFKE5hbWUsIENsYXNzKSBcCisgIE9NUENfIyNOYW1lLAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZW5NUEtpbmRzLmRlZiIKKyAgT01QQ190aHJlYWRwcml2YXRlLAorICBPTVBDX3VuaWZvcm0sCisgIE9NUENfdW5rbm93bgorfTsKKworLy8vIFxicmllZiBPcGVuTVAgYXR0cmlidXRlcyBmb3IgJ2RlZmF1bHQnIGNsYXVzZS4KK2VudW0gT3Blbk1QRGVmYXVsdENsYXVzZUtpbmQgeworI2RlZmluZSBPUEVOTVBfREVGQVVMVF9LSU5EKE5hbWUpIFwKKyAgT01QQ19ERUZBVUxUXyMjTmFtZSwKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9PcGVuTVBLaW5kcy5kZWYiCisgIE9NUENfREVGQVVMVF91bmtub3duCit9OworCisvLy8gXGJyaWVmIE9wZW5NUCBhdHRyaWJ1dGVzIGZvciAncHJvY19iaW5kJyBjbGF1c2UuCitlbnVtIE9wZW5NUFByb2NCaW5kQ2xhdXNlS2luZCB7CisjZGVmaW5lIE9QRU5NUF9QUk9DX0JJTkRfS0lORChOYW1lKSBcCisgIE9NUENfUFJPQ19CSU5EXyMjTmFtZSwKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9PcGVuTVBLaW5kcy5kZWYiCisgIE9NUENfUFJPQ19CSU5EX3Vua25vd24KK307CisKKy8vLyBcYnJpZWYgT3Blbk1QIGF0dHJpYnV0ZXMgZm9yICdzY2hlZHVsZScgY2xhdXNlLgorZW51bSBPcGVuTVBTY2hlZHVsZUNsYXVzZUtpbmQgeworI2RlZmluZSBPUEVOTVBfU0NIRURVTEVfS0lORChOYW1lKSBcCisgIE9NUENfU0NIRURVTEVfIyNOYW1lLAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZW5NUEtpbmRzLmRlZiIKKyAgT01QQ19TQ0hFRFVMRV91bmtub3duCit9OworCisvLy8gXGJyaWVmIE9wZW5NUCBtb2RpZmllcnMgZm9yICdzY2hlZHVsZScgY2xhdXNlLgorZW51bSBPcGVuTVBTY2hlZHVsZUNsYXVzZU1vZGlmaWVyIHsKKyAgT01QQ19TQ0hFRFVMRV9NT0RJRklFUl91bmtub3duID0gT01QQ19TQ0hFRFVMRV91bmtub3duLAorI2RlZmluZSBPUEVOTVBfU0NIRURVTEVfTU9ESUZJRVIoTmFtZSkgXAorICBPTVBDX1NDSEVEVUxFX01PRElGSUVSXyMjTmFtZSwKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9PcGVuTVBLaW5kcy5kZWYiCisgIE9NUENfU0NIRURVTEVfTU9ESUZJRVJfbGFzdAorfTsKKworLy8vIFxicmllZiBPcGVuTVAgYXR0cmlidXRlcyBmb3IgJ2RlcGVuZCcgY2xhdXNlLgorZW51bSBPcGVuTVBEZXBlbmRDbGF1c2VLaW5kIHsKKyNkZWZpbmUgT1BFTk1QX0RFUEVORF9LSU5EKE5hbWUpIFwKKyAgT01QQ19ERVBFTkRfIyNOYW1lLAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZW5NUEtpbmRzLmRlZiIKKyAgT01QQ19ERVBFTkRfdW5rbm93bgorfTsKKworLy8vIFxicmllZiBPcGVuTVAgYXR0cmlidXRlcyBmb3IgJ2xpbmVhcicgY2xhdXNlLgorZW51bSBPcGVuTVBMaW5lYXJDbGF1c2VLaW5kIHsKKyNkZWZpbmUgT1BFTk1QX0xJTkVBUl9LSU5EKE5hbWUpIFwKKyAgT01QQ19MSU5FQVJfIyNOYW1lLAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZW5NUEtpbmRzLmRlZiIKKyAgT01QQ19MSU5FQVJfdW5rbm93bgorfTsKKworLy8vIFxicmllZiBPcGVuTVAgbWFwcGluZyBraW5kIGZvciAnbWFwJyBjbGF1c2UuCitlbnVtIE9wZW5NUE1hcENsYXVzZUtpbmQgeworI2RlZmluZSBPUEVOTVBfTUFQX0tJTkQoTmFtZSkgXAorICBPTVBDX01BUF8jI05hbWUsCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3Blbk1QS2luZHMuZGVmIgorICBPTVBDX01BUF91bmtub3duCit9OworCisvLy8gXGJyaWVmIE9wZW5NUCBhdHRyaWJ1dGVzIGZvciAnZGlzdF9zY2hlZHVsZScgY2xhdXNlLgorZW51bSBPcGVuTVBEaXN0U2NoZWR1bGVDbGF1c2VLaW5kIHsKKyNkZWZpbmUgT1BFTk1QX0RJU1RfU0NIRURVTEVfS0lORChOYW1lKSBPTVBDX0RJU1RfU0NIRURVTEVfIyNOYW1lLAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZW5NUEtpbmRzLmRlZiIKKyAgT01QQ19ESVNUX1NDSEVEVUxFX3Vua25vd24KK307CisKKy8vLyBcYnJpZWYgT3Blbk1QIGF0dHJpYnV0ZXMgZm9yICdkZWZhdWx0bWFwJyBjbGF1c2UuCitlbnVtIE9wZW5NUERlZmF1bHRtYXBDbGF1c2VLaW5kIHsKKyNkZWZpbmUgT1BFTk1QX0RFRkFVTFRNQVBfS0lORChOYW1lKSBcCisgIE9NUENfREVGQVVMVE1BUF8jI05hbWUsCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3Blbk1QS2luZHMuZGVmIgorICBPTVBDX0RFRkFVTFRNQVBfdW5rbm93bgorfTsKKworLy8vIFxicmllZiBPcGVuTVAgbW9kaWZpZXJzIGZvciAnZGVmYXVsdG1hcCcgY2xhdXNlLgorZW51bSBPcGVuTVBEZWZhdWx0bWFwQ2xhdXNlTW9kaWZpZXIgeworICBPTVBDX0RFRkFVTFRNQVBfTU9ESUZJRVJfdW5rbm93biA9IE9NUENfREVGQVVMVE1BUF91bmtub3duLAorI2RlZmluZSBPUEVOTVBfREVGQVVMVE1BUF9NT0RJRklFUihOYW1lKSBcCisgIE9NUENfREVGQVVMVE1BUF9NT0RJRklFUl8jI05hbWUsCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3Blbk1QS2luZHMuZGVmIgorICBPTVBDX0RFRkFVTFRNQVBfTU9ESUZJRVJfbGFzdAorfTsKKworLy8vIFNjaGVkdWxpbmcgZGF0YSBmb3IgbG9vcC1iYXNlZCBPcGVuTVAgZGlyZWN0aXZlcy4KK3N0cnVjdCBPcGVuTVBTY2hlZHVsZVR5IGZpbmFsIHsKKyAgT3Blbk1QU2NoZWR1bGVDbGF1c2VLaW5kIFNjaGVkdWxlID0gT01QQ19TQ0hFRFVMRV91bmtub3duOworICBPcGVuTVBTY2hlZHVsZUNsYXVzZU1vZGlmaWVyIE0xID0gT01QQ19TQ0hFRFVMRV9NT0RJRklFUl91bmtub3duOworICBPcGVuTVBTY2hlZHVsZUNsYXVzZU1vZGlmaWVyIE0yID0gT01QQ19TQ0hFRFVMRV9NT0RJRklFUl91bmtub3duOworfTsKKworT3Blbk1QRGlyZWN0aXZlS2luZCBnZXRPcGVuTVBEaXJlY3RpdmVLaW5kKGxsdm06OlN0cmluZ1JlZiBTdHIpOworY29uc3QgY2hhciAqZ2V0T3Blbk1QRGlyZWN0aXZlTmFtZShPcGVuTVBEaXJlY3RpdmVLaW5kIEtpbmQpOworCitPcGVuTVBDbGF1c2VLaW5kIGdldE9wZW5NUENsYXVzZUtpbmQobGx2bTo6U3RyaW5nUmVmIFN0cik7Citjb25zdCBjaGFyICpnZXRPcGVuTVBDbGF1c2VOYW1lKE9wZW5NUENsYXVzZUtpbmQgS2luZCk7CisKK3Vuc2lnbmVkIGdldE9wZW5NUFNpbXBsZUNsYXVzZVR5cGUoT3Blbk1QQ2xhdXNlS2luZCBLaW5kLCBsbHZtOjpTdHJpbmdSZWYgU3RyKTsKK2NvbnN0IGNoYXIgKmdldE9wZW5NUFNpbXBsZUNsYXVzZVR5cGVOYW1lKE9wZW5NUENsYXVzZUtpbmQgS2luZCwgdW5zaWduZWQgVHlwZSk7CisKK2Jvb2wgaXNBbGxvd2VkQ2xhdXNlRm9yRGlyZWN0aXZlKE9wZW5NUERpcmVjdGl2ZUtpbmQgREtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuTVBDbGF1c2VLaW5kIENLaW5kKTsKKworLy8vIFxicmllZiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBkaXJlY3RpdmUgaXMgYSBkaXJlY3RpdmUgd2l0aCBhbiBhc3NvY2lhdGVkCisvLy8gbG9vcCBjb25zdHJ1Y3QuCisvLy8gXHBhcmFtIERLaW5kIFNwZWNpZmllZCBkaXJlY3RpdmUuCisvLy8gXHJldHVybiB0cnVlIC0gdGhlIGRpcmVjdGl2ZSBpcyBhIGxvb3AtYXNzb2NpYXRlZCBkaXJlY3RpdmUgbGlrZSAnb21wIHNpbWQnCisvLy8gb3IgJ29tcCBmb3InIGRpcmVjdGl2ZSwgb3RoZXJ3aXNlIC0gZmFsc2UuCitib29sIGlzT3Blbk1QTG9vcERpcmVjdGl2ZShPcGVuTVBEaXJlY3RpdmVLaW5kIERLaW5kKTsKKworLy8vIFxicmllZiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBkaXJlY3RpdmUgaXMgYSB3b3Jrc2hhcmluZyBkaXJlY3RpdmUuCisvLy8gXHBhcmFtIERLaW5kIFNwZWNpZmllZCBkaXJlY3RpdmUuCisvLy8gXHJldHVybiB0cnVlIC0gdGhlIGRpcmVjdGl2ZSBpcyBhIHdvcmtzaGFyaW5nIGRpcmVjdGl2ZSBsaWtlICdvbXAgZm9yJywKKy8vLyBvdGhlcndpc2UgLSBmYWxzZS4KK2Jvb2wgaXNPcGVuTVBXb3Jrc2hhcmluZ0RpcmVjdGl2ZShPcGVuTVBEaXJlY3RpdmVLaW5kIERLaW5kKTsKKworLy8vIFxicmllZiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBkaXJlY3RpdmUgaXMgYSB0YXNrbG9vcCBkaXJlY3RpdmUuCisvLy8gXHBhcmFtIERLaW5kIFNwZWNpZmllZCBkaXJlY3RpdmUuCisvLy8gXHJldHVybiB0cnVlIC0gdGhlIGRpcmVjdGl2ZSBpcyBhIHdvcmtzaGFyaW5nIGRpcmVjdGl2ZSBsaWtlICdvbXAgdGFza2xvb3AnLAorLy8vIG90aGVyd2lzZSAtIGZhbHNlLgorYm9vbCBpc09wZW5NUFRhc2tMb29wRGlyZWN0aXZlKE9wZW5NUERpcmVjdGl2ZUtpbmQgREtpbmQpOworCisvLy8gXGJyaWVmIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIGRpcmVjdGl2ZSBpcyBhIHBhcmFsbGVsLWtpbmQgZGlyZWN0aXZlLgorLy8vIFxwYXJhbSBES2luZCBTcGVjaWZpZWQgZGlyZWN0aXZlLgorLy8vIFxyZXR1cm4gdHJ1ZSAtIHRoZSBkaXJlY3RpdmUgaXMgYSBwYXJhbGxlbC1saWtlIGRpcmVjdGl2ZSBsaWtlICdvbXAKKy8vLyBwYXJhbGxlbCcsIG90aGVyd2lzZSAtIGZhbHNlLgorYm9vbCBpc09wZW5NUFBhcmFsbGVsRGlyZWN0aXZlKE9wZW5NUERpcmVjdGl2ZUtpbmQgREtpbmQpOworCisvLy8gXGJyaWVmIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIGRpcmVjdGl2ZSBpcyBhIHRhcmdldCBjb2RlIG9mZmxvYWQgZGlyZWN0aXZlLgorLy8vIFxwYXJhbSBES2luZCBTcGVjaWZpZWQgZGlyZWN0aXZlLgorLy8vIFxyZXR1cm4gdHJ1ZSAtIHRoZSBkaXJlY3RpdmUgaXMgYSB0YXJnZXQgY29kZSBvZmZsb2FkIGRpcmVjdGl2ZSBsaWtlCisvLy8gJ29tcCB0YXJnZXQnLCAnb21wIHRhcmdldCBwYXJhbGxlbCcsICdvbXAgdGFyZ2V0IHh4eCcKKy8vLyBvdGhlcndpc2UgLSBmYWxzZS4KK2Jvb2wgaXNPcGVuTVBUYXJnZXRFeGVjdXRpb25EaXJlY3RpdmUoT3Blbk1QRGlyZWN0aXZlS2luZCBES2luZCk7CisKKy8vLyBcYnJpZWYgQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgZGlyZWN0aXZlIGlzIGEgdGFyZ2V0IGRhdGEgb2ZmbG9hZCBkaXJlY3RpdmUuCisvLy8gXHBhcmFtIERLaW5kIFNwZWNpZmllZCBkaXJlY3RpdmUuCisvLy8gXHJldHVybiB0cnVlIC0gdGhlIGRpcmVjdGl2ZSBpcyBhIHRhcmdldCBkYXRhIG9mZmxvYWQgZGlyZWN0aXZlIGxpa2UKKy8vLyAnb21wIHRhcmdldCBkYXRhJywgJ29tcCB0YXJnZXQgdXBkYXRlJywgJ29tcCB0YXJnZXQgZW50ZXIgZGF0YScsCisvLy8gJ29tcCB0YXJnZXQgZXhpdCBkYXRhJworLy8vIG90aGVyd2lzZSAtIGZhbHNlLgorYm9vbCBpc09wZW5NUFRhcmdldERhdGFNYW5hZ2VtZW50RGlyZWN0aXZlKE9wZW5NUERpcmVjdGl2ZUtpbmQgREtpbmQpOworCisvLy8gQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgY29tcG9zaXRlL2NvbWJpbmVkIGRpcmVjdGl2ZSBjb25zdGl0dXRlcyBhIHRlYW1zCisvLy8gZGlyZWN0aXZlIGluIHRoZSBvdXRlcm1vc3QgbmVzdC4gIEZvciBleGFtcGxlCisvLy8gJ29tcCB0ZWFtcyBkaXN0cmlidXRlJyBvciAnb21wIHRlYW1zIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yJy4KKy8vLyBccGFyYW0gREtpbmQgU3BlY2lmaWVkIGRpcmVjdGl2ZS4KKy8vLyBccmV0dXJuIHRydWUgLSB0aGUgZGlyZWN0aXZlIGhhcyB0ZWFtcyBvbiB0aGUgb3V0ZXJtb3N0IG5lc3QsIG90aGVyd2lzZSAtCisvLy8gZmFsc2UuCitib29sIGlzT3Blbk1QTmVzdGluZ1RlYW1zRGlyZWN0aXZlKE9wZW5NUERpcmVjdGl2ZUtpbmQgREtpbmQpOworCisvLy8gQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgZGlyZWN0aXZlIGlzIGEgdGVhbXMta2luZCBkaXJlY3RpdmUuICBGb3IgZXhhbXBsZSwKKy8vLyAnb21wIHRlYW1zIGRpc3RyaWJ1dGUnIG9yICdvbXAgdGFyZ2V0IHRlYW1zJy4KKy8vLyBccGFyYW0gREtpbmQgU3BlY2lmaWVkIGRpcmVjdGl2ZS4KKy8vLyBccmV0dXJuIHRydWUgLSB0aGUgZGlyZWN0aXZlIGlzIGEgdGVhbXMtbGlrZSBkaXJlY3RpdmUsIG90aGVyd2lzZSAtIGZhbHNlLgorYm9vbCBpc09wZW5NUFRlYW1zRGlyZWN0aXZlKE9wZW5NUERpcmVjdGl2ZUtpbmQgREtpbmQpOworCisvLy8gXGJyaWVmIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIGRpcmVjdGl2ZSBpcyBhIHNpbWQgZGlyZWN0aXZlLgorLy8vIFxwYXJhbSBES2luZCBTcGVjaWZpZWQgZGlyZWN0aXZlLgorLy8vIFxyZXR1cm4gdHJ1ZSAtIHRoZSBkaXJlY3RpdmUgaXMgYSBzaW1kIGRpcmVjdGl2ZSBsaWtlICdvbXAgc2ltZCcsCisvLy8gb3RoZXJ3aXNlIC0gZmFsc2UuCitib29sIGlzT3Blbk1QU2ltZERpcmVjdGl2ZShPcGVuTVBEaXJlY3RpdmVLaW5kIERLaW5kKTsKKworLy8vIFxicmllZiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBkaXJlY3RpdmUgaXMgYSBkaXN0cmlidXRlIGRpcmVjdGl2ZS4KKy8vLyBccGFyYW0gREtpbmQgU3BlY2lmaWVkIGRpcmVjdGl2ZS4KKy8vLyBccmV0dXJuIHRydWUgLSB0aGUgZGlyZWN0aXZlIGlzIGEgZGlzdHJpYnV0ZS1kaXJlY3RpdmUgbGlrZSAnb21wCisvLy8gZGlzdHJpYnV0ZScsCisvLy8gb3RoZXJ3aXNlIC0gZmFsc2UuCitib29sIGlzT3Blbk1QRGlzdHJpYnV0ZURpcmVjdGl2ZShPcGVuTVBEaXJlY3RpdmVLaW5kIERLaW5kKTsKKworLy8vIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIGNvbXBvc2l0ZS9jb21iaW5lZCBkaXJlY3RpdmUgY29uc3RpdHV0ZXMgYQorLy8vIGRpc3RyaWJ1dGUgZGlyZWN0aXZlIGluIHRoZSBvdXRlcm1vc3QgbmVzdC4gIEZvciBleGFtcGxlLAorLy8vICdvbXAgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3InIG9yICdvbXAgZGlzdHJpYnV0ZScuCisvLy8gXHBhcmFtIERLaW5kIFNwZWNpZmllZCBkaXJlY3RpdmUuCisvLy8gXHJldHVybiB0cnVlIC0gdGhlIGRpcmVjdGl2ZSBoYXMgZGlzdHJpYnV0ZSBvbiB0aGUgb3V0ZXJtb3N0IG5lc3QuCisvLy8gb3RoZXJ3aXNlIC0gZmFsc2UuCitib29sIGlzT3Blbk1QTmVzdGluZ0Rpc3RyaWJ1dGVEaXJlY3RpdmUoT3Blbk1QRGlyZWN0aXZlS2luZCBES2luZCk7CisKKy8vLyBcYnJpZWYgQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgY2xhdXNlIGlzIG9uZSBvZiBwcml2YXRlIGNsYXVzZXMgbGlrZQorLy8vICdwcml2YXRlJywgJ2ZpcnN0cHJpdmF0ZScsICdyZWR1Y3Rpb24nIGV0Yy4uCisvLy8gXHBhcmFtIEtpbmQgQ2xhdXNlIGtpbmQuCisvLy8gXHJldHVybiB0cnVlIC0gdGhlIGNsYXVzZSBpcyBhIHByaXZhdGUgY2xhdXNlLCBvdGhlcndpc2UgLSBmYWxzZS4KK2Jvb2wgaXNPcGVuTVBQcml2YXRlKE9wZW5NUENsYXVzZUtpbmQgS2luZCk7CisKKy8vLyBcYnJpZWYgQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgY2xhdXNlIGlzIG9uZSBvZiB0aHJlYWRwcml2YXRlIGNsYXVzZXMgbGlrZQorLy8vICd0aHJlYWRwcml2YXRlJywgJ2NvcHlpbicgb3IgJ2NvcHlwcml2YXRlJy4KKy8vLyBccGFyYW0gS2luZCBDbGF1c2Uga2luZC4KKy8vLyBccmV0dXJuIHRydWUgLSB0aGUgY2xhdXNlIGlzIGEgdGhyZWFkcHJpdmF0ZSBjbGF1c2UsIG90aGVyd2lzZSAtIGZhbHNlLgorYm9vbCBpc09wZW5NUFRocmVhZFByaXZhdGUoT3Blbk1QQ2xhdXNlS2luZCBLaW5kKTsKKworLy8vIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIGRpcmVjdGl2ZSBraW5kIGlzIG9uZSBvZiB0YXNraW5nIGRpcmVjdGl2ZXMgLSB0YXNrLAorLy8vIHRhc2tsb29wIG9yIHRha3Nsb29wIHNpbWQuCitib29sIGlzT3Blbk1QVGFza2luZ0RpcmVjdGl2ZShPcGVuTVBEaXJlY3RpdmVLaW5kIEtpbmQpOworCisvLy8gQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgZGlyZWN0aXZlIGtpbmQgaXMgb25lIG9mIHRoZSBjb21wb3NpdGUgb3IgY29tYmluZWQKKy8vLyBkaXJlY3RpdmVzIHRoYXQgbmVlZCBsb29wIGJvdW5kIHNoYXJpbmcgYWNyb3NzIGxvb3BzIG91dGxpbmVkIGluIG5lc3RlZAorLy8vIGZ1bmN0aW9ucworYm9vbCBpc09wZW5NUExvb3BCb3VuZFNoYXJpbmdEaXJlY3RpdmUoT3Blbk1QRGlyZWN0aXZlS2luZCBLaW5kKTsKKworLy8vIFJldHVybiB0aGUgY2FwdHVyZWQgcmVnaW9ucyBvZiBhbiBPcGVuTVAgZGlyZWN0aXZlLgordm9pZCBnZXRPcGVuTVBDYXB0dXJlUmVnaW9ucygKKyAgICBsbHZtOjpTbWFsbFZlY3RvckltcGw8T3Blbk1QRGlyZWN0aXZlS2luZD4gJkNhcHR1cmVSZWdpb25zLAorICAgIE9wZW5NUERpcmVjdGl2ZUtpbmQgREtpbmQpOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvT3BlcmF0b3JLaW5kcy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9PcGVyYXRvcktpbmRzLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODYyOTRiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvT3BlcmF0b3JLaW5kcy5kZWYKQEAgLTAsMCArMSwxMDggQEAKKy8vPT09LS0tIE9wZXJhdG9yS2luZHMuZGVmIC0gQysrIE92ZXJsb2FkZWQgT3BlcmF0b3IgRGF0YWJhc2UgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIE92ZXJsb2FkZWRPcGVyYXRvciBkYXRhYmFzZSwgd2hpY2ggaW5jbHVkZXMKKy8vIGFsbCBvZiB0aGUgb3ZlcmxvYWRhYmxlIEMrKyBvcGVyYXRvcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gQGZpbGUgT3BlcmF0b3JLaW5kcy5kZWYKKy8vLworLy8vIEluIHRoaXMgZmlsZSwgZWFjaCBvZiB0aGUgb3ZlcmxvYWRhYmxlIEMrKyBvcGVyYXRvcnMgaXMgZW51bWVyYXRlZAorLy8vIHdpdGggZWl0aGVyIHRoZSBPVkVSTE9BREVEX09QRVJBVE9SIG9yIE9WRVJMT0FERURfT1BFUkFUT1JfTVVMVEkKKy8vLyBtYWNybywgZWFjaCBvZiB3aGljaCBjYW4gYmUgc3BlY2lmaWVkIGJ5IHRoZSBjb2RlIGluY2x1ZGluZyB0aGlzCisvLy8gZmlsZS4gT1ZFUkxPQURFRF9PUEVSQVRPUiBpcyB1c2VkIGZvciBzaW5nbGUtdG9rZW4gb3BlcmF0b3JzCisvLy8gKGUuZy4sICIrIiksIGFuZCBoYXMgc2l4IGFyZ3VtZW50czoKKy8vLworLy8vIE5hbWU6IFRoZSBuYW1lIG9mIHRoZSB0b2tlbi4gT09fTmFtZSB3aWxsIGJlIHRoZSBuYW1lIG9mIHRoZQorLy8vIGNvcnJlc3BvbmRpbmcgZW51bWVyYXRvciBpbiBPdmVybG9hZGVkT3BlcmF0b3JLaW5kIGluCisvLy8gT3BlcmF0b3JLaW5kcy5oLgorLy8vCisvLy8gU3BlbGxpbmc6IEEgc3RyaW5nIHRoYXQgcHJvdmlkZXMgYSBjYW5vbmljYWwgc3BlbGxpbmcgZm9yIHRoZQorLy8vIG9wZXJhdG9yLCBlLmcuLCAib3BlcmF0b3IrIi4KKy8vLworLy8vIFRva2VuOiBUaGUgbmFtZSBvZiB0aGUgdG9rZW4gdGhhdCBzcGVjaWZpZXMgdGhlIG9wZXJhdG9yLCBlLmcuLAorLy8vICJwbHVzIiBmb3Igb3BlcmF0b3IrIG9yICJncmVhdGVyZ3JlYXRlcmVxdWFsIiBmb3IKKy8vLyAib3BlcmF0b3I+Pj0iLiBXaXRoIGEgImt3XyIgcHJlZml4LCB0aGUgdG9rZW4gbmFtZSBjYW4gYmUgdXNlZCBhcworLy8vIGFuIGVudW1lcmF0b3IgaW50byB0aGUgVG9rZW5LaW5kIGVudW1lcmF0aW9uLgorLy8vCisvLy8gVW5hcnk6IFRydWUgaWYgdGhlIG9wZXJhdG9yIGNhbiBiZSBkZWNsYXJlZCBhcyBhIHVuYXJ5IG9wZXJhdG9yLgorLy8vCisvLy8gQmluYXJ5OiBUcnVlIGlmIHRoZSBvcGVyYXRvciBjYW4gYmUgZGVjbGFyZWQgYXMgYSBiaW5hcnkKKy8vLyBvcGVyYXRvci4gTm90ZSB0aGF0IHNvbWUgb3BlcmF0b3JzIChlLmcuLCAib3BlcmF0b3IrIiBhbmQKKy8vLyAib3BlcmF0b3IqIikgY2FuIGJlIGJvdGggdW5hcnkgYW5kIGJpbmFyeS4KKy8vLworLy8vIE1lbWJlck9ubHk6IFRydWUgaWYgdGhpcyBvcGVyYXRvciBjYW4gb25seSBiZSBkZWNsYXJlZCBhcyBhCisvLy8gbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb24uIEZhbHNlIGlmIHRoZSBvcGVyYXRvciBjYW4gYmUgYm90aCBhCisvLy8gbm9uLW1lbWJlciBmdW5jdGlvbiBhbmQgYSBub24tc3RhdGljIG1lbWJlciBmdW5jdGlvbi4KKy8vLworLy8vIE9WRVJMT0FERURfT1BFUkFUT1JfTVVMVEkgaXMgdXNlZCB0byBlbnVtZXJhdGUgdGhlIG11bHRpLXRva2VuCisvLy8gb3ZlcmxvYWRlZCBvcGVyYXRvciBuYW1lcywgZS5nLiwgIm9wZXJhdG9yIGRlbGV0ZSBbXSIuIFRoZSBtYWNybworLy8vIGhhcyBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgb2YgT1ZFUkxPQURFRF9PUEVSQVRPUiBleGNlcHQgVG9rZW4sCisvLy8gd2hpY2ggaXMgb21pdHRlZC4KKworI2lmbmRlZiBPVkVSTE9BREVEX09QRVJBVE9SCisjICBkZWZpbmUgT1ZFUkxPQURFRF9PUEVSQVRPUihOYW1lLFNwZWxsaW5nLFRva2VuLFVuYXJ5LEJpbmFyeSxNZW1iZXJPbmx5KQorI2VuZGlmCisKKyNpZm5kZWYgT1ZFUkxPQURFRF9PUEVSQVRPUl9NVUxUSQorIyAgZGVmaW5lIE9WRVJMT0FERURfT1BFUkFUT1JfTVVMVEkoTmFtZSxTcGVsbGluZyxVbmFyeSxCaW5hcnksTWVtYmVyT25seSkgXAorICAgIE9WRVJMT0FERURfT1BFUkFUT1IoTmFtZSxTcGVsbGluZyx1bmtub3duLFVuYXJ5LEJpbmFyeSxNZW1iZXJPbmx5KQorI2VuZGlmCisKK09WRVJMT0FERURfT1BFUkFUT1JfTVVMVEkoTmV3ICAgICAgICAgICAgLCAibmV3IiAgICAgICAgICAgICAgICAgICAgICAsIHRydWUgLCB0cnVlICwgZmFsc2UpCitPVkVSTE9BREVEX09QRVJBVE9SX01VTFRJKERlbGV0ZSAgICAgICAgICwgImRlbGV0ZSIgICAgICAgICAgICAgICAgICAgLCB0cnVlICwgdHJ1ZSAsIGZhbHNlKQorT1ZFUkxPQURFRF9PUEVSQVRPUl9NVUxUSShBcnJheV9OZXcgICAgICAsICJuZXdbXSIgICAgICAgICAgICAgICAgICAgICwgdHJ1ZSAsIHRydWUgLCBmYWxzZSkKK09WRVJMT0FERURfT1BFUkFUT1JfTVVMVEkoQXJyYXlfRGVsZXRlICAgLCAiZGVsZXRlW10iICAgICAgICAgICAgICAgICAsIHRydWUgLCB0cnVlICwgZmFsc2UpCitPVkVSTE9BREVEX09QRVJBVE9SKFBsdXMgICAgICAgICAgICAgICAgICwgIisiICAgLCBwbHVzICAgICAgICAgICAgICAgLCB0cnVlICwgdHJ1ZSAsIGZhbHNlKQorT1ZFUkxPQURFRF9PUEVSQVRPUihNaW51cyAgICAgICAgICAgICAgICAsICItIiAgICwgbWludXMgICAgICAgICAgICAgICwgdHJ1ZSAsIHRydWUgLCBmYWxzZSkKK09WRVJMT0FERURfT1BFUkFUT1IoU3RhciAgICAgICAgICAgICAgICAgLCAiKiIgICAsIHN0YXIgICAgICAgICAgICAgICAsIHRydWUgLCB0cnVlICwgZmFsc2UpCitPVkVSTE9BREVEX09QRVJBVE9SKFNsYXNoICAgICAgICAgICAgICAgICwgIi8iICAgLCBzbGFzaCAgICAgICAgICAgICAgLCBmYWxzZSwgdHJ1ZSAsIGZhbHNlKQorT1ZFUkxPQURFRF9PUEVSQVRPUihQZXJjZW50ICAgICAgICAgICAgICAsICIlIiAgICwgcGVyY2VudCAgICAgICAgICAgICwgZmFsc2UsIHRydWUgLCBmYWxzZSkKK09WRVJMT0FERURfT1BFUkFUT1IoQ2FyZXQgICAgICAgICAgICAgICAgLCAiXiIgICAsIGNhcmV0ICAgICAgICAgICAgICAsIGZhbHNlLCB0cnVlICwgZmFsc2UpCitPVkVSTE9BREVEX09QRVJBVE9SKEFtcCAgICAgICAgICAgICAgICAgICwgIiYiICAgLCBhbXAgICAgICAgICAgICAgICAgLCB0cnVlICwgdHJ1ZSAsIGZhbHNlKQorT1ZFUkxPQURFRF9PUEVSQVRPUihQaXBlICAgICAgICAgICAgICAgICAsICJ8IiAgICwgcGlwZSAgICAgICAgICAgICAgICwgZmFsc2UsIHRydWUgLCBmYWxzZSkKK09WRVJMT0FERURfT1BFUkFUT1IoVGlsZGUgICAgICAgICAgICAgICAgLCAifiIgICAsIHRpbGRlICAgICAgICAgICAgICAsIHRydWUgLCBmYWxzZSwgZmFsc2UpCitPVkVSTE9BREVEX09QRVJBVE9SKEV4Y2xhaW0gICAgICAgICAgICAgICwgIiEiICAgLCBleGNsYWltICAgICAgICAgICAgLCB0cnVlICwgZmFsc2UsIGZhbHNlKQorT1ZFUkxPQURFRF9PUEVSQVRPUihFcXVhbCAgICAgICAgICAgICAgICAsICI9IiAgICwgZXF1YWwgICAgICAgICAgICAgICwgZmFsc2UsIHRydWUgLCB0cnVlKQorT1ZFUkxPQURFRF9PUEVSQVRPUihMZXNzICAgICAgICAgICAgICAgICAsICI8IiAgICwgbGVzcyAgICAgICAgICAgICAgICwgZmFsc2UsIHRydWUgLCBmYWxzZSkKK09WRVJMT0FERURfT1BFUkFUT1IoR3JlYXRlciAgICAgICAgICAgICAgLCAiPiIgICAsIGdyZWF0ZXIgICAgICAgICAgICAsIGZhbHNlLCB0cnVlICwgZmFsc2UpCitPVkVSTE9BREVEX09QRVJBVE9SKFBsdXNFcXVhbCAgICAgICAgICAgICwgIis9IiAgLCBwbHVzZXF1YWwgICAgICAgICAgLCBmYWxzZSwgdHJ1ZSAsIGZhbHNlKQorT1ZFUkxPQURFRF9PUEVSQVRPUihNaW51c0VxdWFsICAgICAgICAgICAsICItPSIgICwgbWludXNlcXVhbCAgICAgICAgICwgZmFsc2UsIHRydWUgLCBmYWxzZSkKK09WRVJMT0FERURfT1BFUkFUT1IoU3RhckVxdWFsICAgICAgICAgICAgLCAiKj0iICAsIHN0YXJlcXVhbCAgICAgICAgICAsIGZhbHNlLCB0cnVlICwgZmFsc2UpCitPVkVSTE9BREVEX09QRVJBVE9SKFNsYXNoRXF1YWwgICAgICAgICAgICwgIi89IiAgLCBzbGFzaGVxdWFsICAgICAgICAgLCBmYWxzZSwgdHJ1ZSAsIGZhbHNlKQorT1ZFUkxPQURFRF9PUEVSQVRPUihQZXJjZW50RXF1YWwgICAgICAgICAsICIlPSIgICwgcGVyY2VudGVxdWFsICAgICAgICwgZmFsc2UsIHRydWUgLCBmYWxzZSkKK09WRVJMT0FERURfT1BFUkFUT1IoQ2FyZXRFcXVhbCAgICAgICAgICAgLCAiXj0iICAsIGNhcmV0ZXF1YWwgICAgICAgICAsIGZhbHNlLCB0cnVlICwgZmFsc2UpCitPVkVSTE9BREVEX09QRVJBVE9SKEFtcEVxdWFsICAgICAgICAgICAgICwgIiY9IiAgLCBhbXBlcXVhbCAgICAgICAgICAgLCBmYWxzZSwgdHJ1ZSAsIGZhbHNlKQorT1ZFUkxPQURFRF9PUEVSQVRPUihQaXBlRXF1YWwgICAgICAgICAgICAsICJ8PSIgICwgcGlwZWVxdWFsICAgICAgICAgICwgZmFsc2UsIHRydWUgLCBmYWxzZSkKK09WRVJMT0FERURfT1BFUkFUT1IoTGVzc0xlc3MgICAgICAgICAgICAgLCAiPDwiICAsIGxlc3NsZXNzICAgICAgICAgICAsIGZhbHNlLCB0cnVlICwgZmFsc2UpCitPVkVSTE9BREVEX09QRVJBVE9SKEdyZWF0ZXJHcmVhdGVyICAgICAgICwgIj4+IiAgLCBncmVhdGVyZ3JlYXRlciAgICAgLCBmYWxzZSwgdHJ1ZSAsIGZhbHNlKQorT1ZFUkxPQURFRF9PUEVSQVRPUihMZXNzTGVzc0VxdWFsICAgICAgICAsICI8PD0iICwgbGVzc2xlc3NlcXVhbCAgICAgICwgZmFsc2UsIHRydWUgLCBmYWxzZSkKK09WRVJMT0FERURfT1BFUkFUT1IoR3JlYXRlckdyZWF0ZXJFcXVhbCAgLCAiPj49IiAsIGdyZWF0ZXJncmVhdGVyZXF1YWwsIGZhbHNlLCB0cnVlICwgZmFsc2UpCitPVkVSTE9BREVEX09QRVJBVE9SKEVxdWFsRXF1YWwgICAgICAgICAgICwgIj09IiAgLCBlcXVhbGVxdWFsICAgICAgICAgLCBmYWxzZSwgdHJ1ZSAsIGZhbHNlKQorT1ZFUkxPQURFRF9PUEVSQVRPUihFeGNsYWltRXF1YWwgICAgICAgICAsICIhPSIgICwgZXhjbGFpbWVxdWFsICAgICAgICwgZmFsc2UsIHRydWUgLCBmYWxzZSkKK09WRVJMT0FERURfT1BFUkFUT1IoTGVzc0VxdWFsICAgICAgICAgICAgLCAiPD0iICAsIGxlc3NlcXVhbCAgICAgICAgICAsIGZhbHNlLCB0cnVlICwgZmFsc2UpCitPVkVSTE9BREVEX09QRVJBVE9SKEdyZWF0ZXJFcXVhbCAgICAgICAgICwgIj49IiAgLCBncmVhdGVyZXF1YWwgICAgICAgLCBmYWxzZSwgdHJ1ZSAsIGZhbHNlKQorT1ZFUkxPQURFRF9PUEVSQVRPUihTcGFjZXNoaXAgICAgICAgICAgICAsICI8PT4iICwgc3BhY2VzaGlwICAgICAgICAgICwgZmFsc2UsIHRydWUgLCBmYWxzZSkKK09WRVJMT0FERURfT1BFUkFUT1IoQW1wQW1wICAgICAgICAgICAgICAgLCAiJiYiICAsIGFtcGFtcCAgICAgICAgICAgICAsIGZhbHNlLCB0cnVlICwgZmFsc2UpCitPVkVSTE9BREVEX09QRVJBVE9SKFBpcGVQaXBlICAgICAgICAgICAgICwgInx8IiAgLCBwaXBlcGlwZSAgICAgICAgICAgLCBmYWxzZSwgdHJ1ZSAsIGZhbHNlKQorT1ZFUkxPQURFRF9PUEVSQVRPUihQbHVzUGx1cyAgICAgICAgICAgICAsICIrKyIgICwgcGx1c3BsdXMgICAgICAgICAgICwgdHJ1ZSAsIHRydWUgLCBmYWxzZSkKK09WRVJMT0FERURfT1BFUkFUT1IoTWludXNNaW51cyAgICAgICAgICAgLCAiLS0iICAsIG1pbnVzbWludXMgICAgICAgICAsIHRydWUgLCB0cnVlICwgZmFsc2UpCitPVkVSTE9BREVEX09QRVJBVE9SKENvbW1hICAgICAgICAgICAgICAgICwgIiwiICAgLCBjb21tYSAgICAgICAgICAgICAgLCBmYWxzZSwgdHJ1ZSAsIGZhbHNlKQorT1ZFUkxPQURFRF9PUEVSQVRPUihBcnJvd1N0YXIgICAgICAgICAgICAsICItPioiICwgYXJyb3dzdGFyICAgICAgICAgICwgZmFsc2UsIHRydWUgLCBmYWxzZSkKK09WRVJMT0FERURfT1BFUkFUT1IoQXJyb3cgICAgICAgICAgICAgICAgLCAiLT4iICAsIGFycm93ICAgICAgICAgICAgICAsIHRydWUgLCBmYWxzZSwgdHJ1ZSkKK09WRVJMT0FERURfT1BFUkFUT1JfTVVMVEkoQ2FsbCAgICAgICAgICAgLCAiKCkiICAgICAgICAgICAgICAgICAgICAgICAsIHRydWUgLCB0cnVlICwgdHJ1ZSkKK09WRVJMT0FERURfT1BFUkFUT1JfTVVMVEkoU3Vic2NyaXB0ICAgICAgLCAiW10iICAgICAgICAgICAgICAgICAgICAgICAsIGZhbHNlLCB0cnVlICwgdHJ1ZSkKKy8vID86IGNhbiAqbm90KiBiZSBvdmVybG9hZGVkLCBidXQgd2UgbmVlZCB0aGUgb3ZlcmxvYWQKKy8vIHJlc29sdXRpb24gbWFjaGluZXJ5IGZvciBpdC4KK09WRVJMT0FERURfT1BFUkFUT1JfTVVMVEkoQ29uZGl0aW9uYWwgICAgLCAiPyIgICAgICAgICAgICAgICAgICAgICAgICAsIGZhbHNlLCB0cnVlICwgZmFsc2UpCitPVkVSTE9BREVEX09QRVJBVE9SKENvYXdhaXQgICAgICAgICAgICAgICwgImNvX2F3YWl0Iiwga3dfY29fYXdhaXQgICAgLCB0cnVlICwgZmFsc2UsIGZhbHNlKQorCisjdW5kZWYgT1ZFUkxPQURFRF9PUEVSQVRPUl9NVUxUSQorI3VuZGVmIE9WRVJMT0FERURfT1BFUkFUT1IKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL09wZXJhdG9yS2luZHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL09wZXJhdG9yS2luZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTIwYmFlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvT3BlcmF0b3JLaW5kcy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8vPT09LS0tIE9wZXJhdG9yS2luZHMuaCAtIEMrKyBPdmVybG9hZGVkIE9wZXJhdG9ycyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIGFuIGVudW1lcmF0aW9uIGZvciBDKysgb3ZlcmxvYWRlZCBvcGVyYXRvcnMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19PUEVSQVRPUktJTkRTX0gKKyNkZWZpbmUgTExWTV9DTEFOR19CQVNJQ19PUEVSQVRPUktJTkRTX0gKKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBFbnVtZXJhdGlvbiBzcGVjaWZ5aW5nIHRoZSBkaWZmZXJlbnQga2luZHMgb2YgQysrIG92ZXJsb2FkZWQKKy8vLyBvcGVyYXRvcnMuCitlbnVtIE92ZXJsb2FkZWRPcGVyYXRvcktpbmQgOiBpbnQgeworICBPT19Ob25lLCAgICAgICAgICAgICAgICAvLy88IE5vdCBhbiBvdmVybG9hZGVkIG9wZXJhdG9yCisjZGVmaW5lIE9WRVJMT0FERURfT1BFUkFUT1IoTmFtZSxTcGVsbGluZyxUb2tlbixVbmFyeSxCaW5hcnksTWVtYmVyT25seSkgXAorICBPT18jI05hbWUsCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3BlcmF0b3JLaW5kcy5kZWYiCisgIE5VTV9PVkVSTE9BREVEX09QRVJBVE9SUworfTsKKworLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc3BlbGxpbmcgb2YgdGhlIGdpdmVuIG92ZXJsb2FkZWQgb3BlcmF0b3IsIHdpdGhvdXQgCisvLy8gdGhlIHByZWNlZGluZyAib3BlcmF0b3IiIGtleXdvcmQuCitjb25zdCBjaGFyICpnZXRPcGVyYXRvclNwZWxsaW5nKE92ZXJsb2FkZWRPcGVyYXRvcktpbmQgT3BlcmF0b3IpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9PcGVyYXRvclByZWNlZGVuY2UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL09wZXJhdG9yUHJlY2VkZW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OTc4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9PcGVyYXRvclByZWNlZGVuY2UuaApAQCAtMCwwICsxLDUzIEBACisvLz09PS0tLSBPcGVyYXRvclByZWNlZGVuY2UuaCAtIE9wZXJhdG9yIHByZWNlZGVuY2UgbGV2ZWxzIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyBhbmQgY29tcHV0ZXMgcHJlY2VkZW5jZSBsZXZlbHMgZm9yIGJpbmFyeS90ZXJuYXJ5IG9wZXJhdG9ycy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX09QRVJBVE9SUFJFQ0VERU5DRV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfT1BFUkFUT1JQUkVDRURFTkNFX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Rva2VuS2luZHMuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFByZWNlZGVuY2VMZXZlbHMgLSBUaGVzZSBhcmUgcHJlY2VkZW5jZXMgZm9yIHRoZSBiaW5hcnkvdGVybmFyeQorLy8vIG9wZXJhdG9ycyBpbiB0aGUgQzk5IGdyYW1tYXIuICBUaGVzZSBoYXZlIGJlZW4gbmFtZWQgdG8gcmVsYXRlCisvLy8gd2l0aCB0aGUgQzk5IGdyYW1tYXIgcHJvZHVjdGlvbnMuICBMb3cgcHJlY2VkZW5jZXMgbnVtYmVycyBiaW5kCisvLy8gbW9yZSB3ZWFrbHkgdGhhbiBoaWdoIG51bWJlcnMuCituYW1lc3BhY2UgcHJlYyB7CisgIGVudW0gTGV2ZWwgeworICAgIFVua25vd24gICAgICAgICA9IDAsICAgIC8vIE5vdCBiaW5hcnkgb3BlcmF0b3IuCisgICAgQ29tbWEgICAgICAgICAgID0gMSwgICAgLy8gLAorICAgIEFzc2lnbm1lbnQgICAgICA9IDIsICAgIC8vID0sICo9LCAvPSwgJT0sICs9LCAtPSwgPDw9LCA+Pj0sICY9LCBePSwgfD0KKyAgICBDb25kaXRpb25hbCAgICAgPSAzLCAgICAvLyA/CisgICAgTG9naWNhbE9yICAgICAgID0gNCwgICAgLy8gfHwKKyAgICBMb2dpY2FsQW5kICAgICAgPSA1LCAgICAvLyAmJgorICAgIEluY2x1c2l2ZU9yICAgICA9IDYsICAgIC8vIHwKKyAgICBFeGNsdXNpdmVPciAgICAgPSA3LCAgICAvLyBeCisgICAgQW5kICAgICAgICAgICAgID0gOCwgICAgLy8gJgorICAgIEVxdWFsaXR5ICAgICAgICA9IDksICAgIC8vID09LCAhPQorICAgIFJlbGF0aW9uYWwgICAgICA9IDEwLCAgIC8vICA+PSwgPD0sID4sIDwKKyAgICBTcGFjZXNoaXAgICAgICAgPSAxMSwgICAvLyA8PT4KKyAgICBTaGlmdCAgICAgICAgICAgPSAxMiwgICAvLyA8PCwgPj4KKyAgICBBZGRpdGl2ZSAgICAgICAgPSAxMywgICAvLyAtLCArCisgICAgTXVsdGlwbGljYXRpdmUgID0gMTQsICAgLy8gKiwgLywgJQorICAgIFBvaW50ZXJUb01lbWJlciA9IDE1ICAgIC8vIC4qLCAtPioKKyAgfTsKK30KKworLy8vIFxicmllZiBSZXR1cm4gdGhlIHByZWNlZGVuY2Ugb2YgdGhlIHNwZWNpZmllZCBiaW5hcnkgb3BlcmF0b3IgdG9rZW4uCitwcmVjOjpMZXZlbCBnZXRCaW5PcFByZWNlZGVuY2UodG9rOjpUb2tlbktpbmQgS2luZCwgYm9vbCBHcmVhdGVyVGhhbklzT3BlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDUGx1c1BsdXMxMSk7CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmICAvLyBMTFZNX0NMQU5HX09QRVJBVE9SX1BSRUNFREVOQ0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvUGFydGlhbERpYWdub3N0aWMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1BhcnRpYWxEaWFnbm9zdGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmZWFlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1BhcnRpYWxEaWFnbm9zdGljLmgKQEAgLTAsMCArMSw0MjMgQEAKKy8vPT09LSBQYXJ0aWFsRGlhZ25vc3RpYy5oIC0gRGlhZ25vc3RpYyAiY2xvc3VyZXMiIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIEltcGxlbWVudHMgYSBwYXJ0aWFsIGRpYWdub3N0aWMgdGhhdCBjYW4gYmUgZW1pdHRlZCBhbnd5aGVyZQorLy8vIGluIGEgRGlhZ25vc3RpY0J1aWxkZXIgc3RyZWFtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19QQVJUSUFMRElBR05PU1RJQ19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfUEFSVElBTERJQUdOT1NUSUNfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBEZWNsQ29udGV4dDsKK2NsYXNzIElkZW50aWZpZXJJbmZvOworCitjbGFzcyBQYXJ0aWFsRGlhZ25vc3RpYyB7CitwdWJsaWM6CisgIGVudW0geworICAgICAgLy8gVGhlIE1heEFyZ3VtZW50cyBhbmQgTWF4Rml4SXRIaW50cyBtZW1iZXIgZW51bSB2YWx1ZXMgZnJvbQorICAgICAgLy8gRGlhZ25vc3RpY3NFbmdpbmUgYXJlIHByaXZhdGUgYnV0IERpYWdub3N0aWNzRW5naW5lIGRlY2xhcmVzCisgICAgICAvLyBQYXJ0aWFsRGlhZ25vc3RpYyBhIGZyaWVuZC4gIFRoZXNlIGVudW0gdmFsdWVzIGFyZSByZWRlY2xhcmVkCisgICAgICAvLyBoZXJlIHNvIHRoYXQgdGhlIG5lc3RlZCBTdG9yYWdlIGNsYXNzIGJlbG93IGNhbiBhY2Nlc3MgdGhlbS4KKyAgICAgIE1heEFyZ3VtZW50cyA9IERpYWdub3N0aWNzRW5naW5lOjpNYXhBcmd1bWVudHMKKyAgfTsKKworICBzdHJ1Y3QgU3RvcmFnZSB7CisgICAgZW51bSB7CisgICAgICAgIC8vLyBcYnJpZWYgVGhlIG1heGltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyB3ZSBjYW4gaG9sZC4gV2UKKyAgICAgICAgLy8vIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdXAgdG8gMTAgYXJndW1lbnRzICglMC0lOSkuCisgICAgICAgIC8vLworICAgICAgICAvLy8gQSBzaW5nbGUgZGlhZ25vc3RpYyB3aXRoIG1vcmUgdGhhbiB0aGF0IGFsbW9zdCBjZXJ0YWlubHkgaGFzIHRvCisgICAgICAgIC8vLyBiZSBzaW1wbGlmaWVkIGFueXdheS4KKyAgICAgICAgTWF4QXJndW1lbnRzID0gUGFydGlhbERpYWdub3N0aWM6Ok1heEFyZ3VtZW50cworICAgIH07CisKKyAgICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBBcmd1bWVudHMuCisgICAgdW5zaWduZWQgY2hhciBOdW1EaWFnQXJncyA9IDA7CisKKyAgICAvLy8gXGJyaWVmIFNwZWNpZmllcyBmb3IgZWFjaCBhcmd1bWVudCB3aGV0aGVyIGl0IGlzIGluIERpYWdBcmd1bWVudHNTdHIKKyAgICAvLy8gb3IgaW4gRGlhZ0FyZ3VtZW50cy4KKyAgICB1bnNpZ25lZCBjaGFyIERpYWdBcmd1bWVudHNLaW5kW01heEFyZ3VtZW50c107CisKKyAgICAvLy8gXGJyaWVmIFRoZSB2YWx1ZXMgZm9yIHRoZSB2YXJpb3VzIHN1YnN0aXR1dGlvbiBwb3NpdGlvbnMuCisgICAgLy8vCisgICAgLy8vIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBhcmd1bWVudCBpcyBub3QgYW4gc3RkOjpzdHJpbmcuIFRoZSBzcGVjaWZpYyB2YWx1ZQorICAgIC8vLyBpcyBtYW5nbGVkIGludG8gYW4gaW50cHRyX3QgYW5kIHRoZSBpbnRlcnByZXRhdGlvbiBkZXBlbmRzIG9uIGV4YWN0bHkKKyAgICAvLy8gd2hhdCBzb3J0IG9mIGFyZ3VtZW50IGtpbmQgaXQgaXMuCisgICAgaW50cHRyX3QgRGlhZ0FyZ3VtZW50c1ZhbFtNYXhBcmd1bWVudHNdOworCisgICAgLy8vIFxicmllZiBUaGUgdmFsdWVzIGZvciB0aGUgdmFyaW91cyBzdWJzdGl0dXRpb24gcG9zaXRpb25zIHRoYXQgaGF2ZQorICAgIC8vLyBzdHJpbmcgYXJndW1lbnRzLgorICAgIHN0ZDo6c3RyaW5nIERpYWdBcmd1bWVudHNTdHJbTWF4QXJndW1lbnRzXTsKKworICAgIC8vLyBcYnJpZWYgVGhlIGxpc3Qgb2YgcmFuZ2VzIGFkZGVkIHRvIHRoaXMgZGlhZ25vc3RpYy4KKyAgICBTbWFsbFZlY3RvcjxDaGFyU291cmNlUmFuZ2UsIDg+IERpYWdSYW5nZXM7CisKKyAgICAvLy8gXGJyaWVmIElmIHZhbGlkLCBwcm92aWRlcyBhIGhpbnQgd2l0aCBzb21lIGNvZGUgdG8gaW5zZXJ0LCByZW1vdmUsIG9yCisgICAgLy8vIG1vZGlmeSBhdCBhIHBhcnRpY3VsYXIgcG9zaXRpb24uCisgICAgU21hbGxWZWN0b3I8Rml4SXRIaW50LCA2PiAgRml4SXRIaW50czsKKworICAgIFN0b3JhZ2UoKSA9IGRlZmF1bHQ7CisgIH07CisKKyAgLy8vIFxicmllZiBBbiBhbGxvY2F0b3IgZm9yIFN0b3JhZ2Ugb2JqZWN0cywgd2hpY2ggdXNlcyBhIHNtYWxsIGNhY2hlIHRvCisgIC8vLyBvYmplY3RzLCB1c2VkIHRvIHJlZHVjZSBtYWxsb2MoKS9mcmVlKCkgdHJhZmZpYyBmb3IgcGFydGlhbCBkaWFnbm9zdGljcy4KKyAgY2xhc3MgU3RvcmFnZUFsbG9jYXRvciB7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE51bUNhY2hlZCA9IDE2OworICAgIFN0b3JhZ2UgQ2FjaGVkW051bUNhY2hlZF07CisgICAgU3RvcmFnZSAqRnJlZUxpc3RbTnVtQ2FjaGVkXTsKKyAgICB1bnNpZ25lZCBOdW1GcmVlTGlzdEVudHJpZXM7CisKKyAgcHVibGljOgorICAgIFN0b3JhZ2VBbGxvY2F0b3IoKTsKKyAgICB+U3RvcmFnZUFsbG9jYXRvcigpOworCisgICAgLy8vIFxicmllZiBBbGxvY2F0ZSBuZXcgc3RvcmFnZS4KKyAgICBTdG9yYWdlICpBbGxvY2F0ZSgpIHsKKyAgICAgIGlmIChOdW1GcmVlTGlzdEVudHJpZXMgPT0gMCkKKyAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlOworCisgICAgICBTdG9yYWdlICpSZXN1bHQgPSBGcmVlTGlzdFstLU51bUZyZWVMaXN0RW50cmllc107CisgICAgICBSZXN1bHQtPk51bURpYWdBcmdzID0gMDsKKyAgICAgIFJlc3VsdC0+RGlhZ1Jhbmdlcy5jbGVhcigpOworICAgICAgUmVzdWx0LT5GaXhJdEhpbnRzLmNsZWFyKCk7CisgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKworICAgIC8vLyBcYnJpZWYgRnJlZSB0aGUgZ2l2ZW4gc3RvcmFnZSBvYmplY3QuCisgICAgdm9pZCBEZWFsbG9jYXRlKFN0b3JhZ2UgKlMpIHsKKyAgICAgIGlmIChTID49IENhY2hlZCAmJiBTIDw9IENhY2hlZCArIE51bUNhY2hlZCkgeworICAgICAgICBGcmVlTGlzdFtOdW1GcmVlTGlzdEVudHJpZXMrK10gPSBTOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGRlbGV0ZSBTOworICAgIH0KKyAgfTsKKworcHJpdmF0ZToKKyAgLy8gTk9URTogU2VtYSBhc3N1bWVzIHRoYXQgUGFydGlhbERpYWdub3N0aWMgaXMgbG9jYXRpb24taW52YXJpYW50CisgIC8vIGluIHRoZSBzZW5zZSB0aGF0IGl0cyBiaXRzIGNhbiBiZSBzYWZlbHkgbWVtY3B5J2VkIGFuZCBkZXN0cnVjdGVkCisgIC8vIGluIHRoZSBuZXcgbG9jYXRpb24uCisKKyAgLy8vIFxicmllZiBUaGUgZGlhZ25vc3RpYyBJRC4KKyAgbXV0YWJsZSB1bnNpZ25lZCBEaWFnSUQgPSAwOworCisgIC8vLyBcYnJpZWYgU3RvcmFnZSBmb3IgYXJncyBhbmQgcmFuZ2VzLgorICBtdXRhYmxlIFN0b3JhZ2UgKkRpYWdTdG9yYWdlID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIEFsbG9jYXRvciB1c2VkIHRvIGFsbG9jYXRlIHN0b3JhZ2UgZm9yIHRoaXMgZGlhZ25vc3RpYy4KKyAgU3RvcmFnZUFsbG9jYXRvciAqQWxsb2NhdG9yID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHN0b3JhZ2UgZm9yIHRoaXMgcGFydGljdWxhciBkaWFnbm9zdGljLgorICBTdG9yYWdlICpnZXRTdG9yYWdlKCkgY29uc3QgeworICAgIGlmIChEaWFnU3RvcmFnZSkKKyAgICAgIHJldHVybiBEaWFnU3RvcmFnZTsKKworICAgIGlmIChBbGxvY2F0b3IpCisgICAgICBEaWFnU3RvcmFnZSA9IEFsbG9jYXRvci0+QWxsb2NhdGUoKTsKKyAgICBlbHNlIHsKKyAgICAgIGFzc2VydChBbGxvY2F0b3IgIT0gcmVpbnRlcnByZXRfY2FzdDxTdG9yYWdlQWxsb2NhdG9yICo+KH51aW50cHRyX3QoMCkpKTsKKyAgICAgIERpYWdTdG9yYWdlID0gbmV3IFN0b3JhZ2U7CisgICAgfQorICAgIHJldHVybiBEaWFnU3RvcmFnZTsKKyAgfQorCisgIHZvaWQgZnJlZVN0b3JhZ2UoKSB7CisgICAgaWYgKCFEaWFnU3RvcmFnZSkKKyAgICAgIHJldHVybjsKKworICAgIC8vIFRoZSBob3QgcGF0aCBmb3IgUGFydGlhbERpYWdub3N0aWMgaXMgd2hlbiB3ZSBqdXN0IHVzZWQgaXQgdG8gd3JhcCBhbiBJRAorICAgIC8vICh0eXBpY2FsbHkgc28gd2UgaGF2ZSB0aGUgZmxleGliaWxpdHkgb2YgcGFzc2luZyBhIG1vcmUgY29tcGxleAorICAgIC8vIGRpYWdub3N0aWMgaW50byB0aGUgY2FsbGVlLCBidXQgdGhhdCBkb2VzIG5vdCBjb21tb25seSBvY2N1cikuCisgICAgLy8KKyAgICAvLyBTcGxpdCB0aGlzIG91dCBpbnRvIGEgc2xvdyBmdW5jdGlvbiBmb3Igc2lsbHkgY29tcGlsZXJzICgqY291Z2gqKSB3aGljaAorICAgIC8vIGNhbid0IGRvIGRlY2VudCBwYXJ0aWFsIGlubGluaW5nLgorICAgIGZyZWVTdG9yYWdlU2xvdygpOworICB9CisKKyAgdm9pZCBmcmVlU3RvcmFnZVNsb3coKSB7CisgICAgaWYgKEFsbG9jYXRvcikKKyAgICAgIEFsbG9jYXRvci0+RGVhbGxvY2F0ZShEaWFnU3RvcmFnZSk7CisgICAgZWxzZSBpZiAoQWxsb2NhdG9yICE9IHJlaW50ZXJwcmV0X2Nhc3Q8U3RvcmFnZUFsbG9jYXRvciAqPih+dWludHB0cl90KDApKSkKKyAgICAgIGRlbGV0ZSBEaWFnU3RvcmFnZTsKKyAgICBEaWFnU3RvcmFnZSA9IG51bGxwdHI7CisgIH0KKworICB2b2lkIEFkZFNvdXJjZVJhbmdlKGNvbnN0IENoYXJTb3VyY2VSYW5nZSAmUikgY29uc3QgeworICAgIGlmICghRGlhZ1N0b3JhZ2UpCisgICAgICBEaWFnU3RvcmFnZSA9IGdldFN0b3JhZ2UoKTsKKworICAgIERpYWdTdG9yYWdlLT5EaWFnUmFuZ2VzLnB1c2hfYmFjayhSKTsKKyAgfQorCisgIHZvaWQgQWRkRml4SXRIaW50KGNvbnN0IEZpeEl0SGludCAmSGludCkgY29uc3QgeworICAgIGlmIChIaW50LmlzTnVsbCgpKQorICAgICAgcmV0dXJuOworCisgICAgaWYgKCFEaWFnU3RvcmFnZSkKKyAgICAgIERpYWdTdG9yYWdlID0gZ2V0U3RvcmFnZSgpOworCisgICAgRGlhZ1N0b3JhZ2UtPkZpeEl0SGludHMucHVzaF9iYWNrKEhpbnQpOworICB9CisKK3B1YmxpYzoKKyAgc3RydWN0IE51bGxEaWFnbm9zdGljIHt9OworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbnVsbCBwYXJ0aWFsIGRpYWdub3N0aWMsIHdoaWNoIGNhbm5vdCBjYXJyeSBhIHBheWxvYWQsCisgIC8vLyBhbmQgb25seSBleGlzdHMgdG8gYmUgc3dhcHBlZCB3aXRoIGEgcmVhbCBwYXJ0aWFsIGRpYWdub3N0aWMuCisgIFBhcnRpYWxEaWFnbm9zdGljKE51bGxEaWFnbm9zdGljKSB7fQorCisgIFBhcnRpYWxEaWFnbm9zdGljKHVuc2lnbmVkIERpYWdJRCwgU3RvcmFnZUFsbG9jYXRvciAmQWxsb2NhdG9yKQorICAgICAgOiBEaWFnSUQoRGlhZ0lEKSwgQWxsb2NhdG9yKCZBbGxvY2F0b3IpIHt9CisKKyAgUGFydGlhbERpYWdub3N0aWMoY29uc3QgUGFydGlhbERpYWdub3N0aWMgJk90aGVyKQorICAgICAgOiBEaWFnSUQoT3RoZXIuRGlhZ0lEKSwgQWxsb2NhdG9yKE90aGVyLkFsbG9jYXRvcikgeworICAgIGlmIChPdGhlci5EaWFnU3RvcmFnZSkgeworICAgICAgRGlhZ1N0b3JhZ2UgPSBnZXRTdG9yYWdlKCk7CisgICAgICAqRGlhZ1N0b3JhZ2UgPSAqT3RoZXIuRGlhZ1N0b3JhZ2U7CisgICAgfQorICB9CisKKyAgUGFydGlhbERpYWdub3N0aWMoUGFydGlhbERpYWdub3N0aWMgJiZPdGhlcikKKyAgICAgIDogRGlhZ0lEKE90aGVyLkRpYWdJRCksIERpYWdTdG9yYWdlKE90aGVyLkRpYWdTdG9yYWdlKSwKKyAgICAgICAgQWxsb2NhdG9yKE90aGVyLkFsbG9jYXRvcikgeworICAgIE90aGVyLkRpYWdTdG9yYWdlID0gbnVsbHB0cjsKKyAgfQorCisgIFBhcnRpYWxEaWFnbm9zdGljKGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZPdGhlciwgU3RvcmFnZSAqRGlhZ1N0b3JhZ2UpCisgICAgICA6IERpYWdJRChPdGhlci5EaWFnSUQpLCBEaWFnU3RvcmFnZShEaWFnU3RvcmFnZSksCisgICAgICAgIEFsbG9jYXRvcihyZWludGVycHJldF9jYXN0PFN0b3JhZ2VBbGxvY2F0b3IgKj4ofnVpbnRwdHJfdCgwKSkpIHsKKyAgICBpZiAoT3RoZXIuRGlhZ1N0b3JhZ2UpCisgICAgICAqdGhpcy0+RGlhZ1N0b3JhZ2UgPSAqT3RoZXIuRGlhZ1N0b3JhZ2U7CisgIH0KKworICBQYXJ0aWFsRGlhZ25vc3RpYyhjb25zdCBEaWFnbm9zdGljICZPdGhlciwgU3RvcmFnZUFsbG9jYXRvciAmQWxsb2NhdG9yKQorICAgICAgOiBEaWFnSUQoT3RoZXIuZ2V0SUQoKSksIEFsbG9jYXRvcigmQWxsb2NhdG9yKSB7CisgICAgLy8gQ29weSBhcmd1bWVudHMuCisgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IE90aGVyLmdldE51bUFyZ3MoKTsgSSAhPSBOOyArK0kpIHsKKyAgICAgIGlmIChPdGhlci5nZXRBcmdLaW5kKEkpID09IERpYWdub3N0aWNzRW5naW5lOjpha19zdGRfc3RyaW5nKQorICAgICAgICBBZGRTdHJpbmcoT3RoZXIuZ2V0QXJnU3RkU3RyKEkpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgQWRkVGFnZ2VkVmFsKE90aGVyLmdldFJhd0FyZyhJKSwgT3RoZXIuZ2V0QXJnS2luZChJKSk7CisgICAgfQorCisgICAgLy8gQ29weSBzb3VyY2UgcmFuZ2VzLgorICAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBPdGhlci5nZXROdW1SYW5nZXMoKTsgSSAhPSBOOyArK0kpCisgICAgICBBZGRTb3VyY2VSYW5nZShPdGhlci5nZXRSYW5nZShJKSk7CisKKyAgICAvLyBDb3B5IGZpeC1pdHMuCisgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IE90aGVyLmdldE51bUZpeEl0SGludHMoKTsgSSAhPSBOOyArK0kpCisgICAgICBBZGRGaXhJdEhpbnQoT3RoZXIuZ2V0Rml4SXRIaW50KEkpKTsKKyAgfQorCisgIFBhcnRpYWxEaWFnbm9zdGljICZvcGVyYXRvcj0oY29uc3QgUGFydGlhbERpYWdub3N0aWMgJk90aGVyKSB7CisgICAgRGlhZ0lEID0gT3RoZXIuRGlhZ0lEOworICAgIGlmIChPdGhlci5EaWFnU3RvcmFnZSkgeworICAgICAgaWYgKCFEaWFnU3RvcmFnZSkKKyAgICAgICAgRGlhZ1N0b3JhZ2UgPSBnZXRTdG9yYWdlKCk7CisKKyAgICAgICpEaWFnU3RvcmFnZSA9ICpPdGhlci5EaWFnU3RvcmFnZTsKKyAgICB9IGVsc2UgeworICAgICAgZnJlZVN0b3JhZ2UoKTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBQYXJ0aWFsRGlhZ25vc3RpYyAmb3BlcmF0b3I9KFBhcnRpYWxEaWFnbm9zdGljICYmT3RoZXIpIHsKKyAgICBmcmVlU3RvcmFnZSgpOworCisgICAgRGlhZ0lEID0gT3RoZXIuRGlhZ0lEOworICAgIERpYWdTdG9yYWdlID0gT3RoZXIuRGlhZ1N0b3JhZ2U7CisgICAgQWxsb2NhdG9yID0gT3RoZXIuQWxsb2NhdG9yOworCisgICAgT3RoZXIuRGlhZ1N0b3JhZ2UgPSBudWxscHRyOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIH5QYXJ0aWFsRGlhZ25vc3RpYygpIHsKKyAgICBmcmVlU3RvcmFnZSgpOworICB9CisKKyAgdm9pZCBzd2FwKFBhcnRpYWxEaWFnbm9zdGljICZQRCkgeworICAgIHN0ZDo6c3dhcChEaWFnSUQsIFBELkRpYWdJRCk7CisgICAgc3RkOjpzd2FwKERpYWdTdG9yYWdlLCBQRC5EaWFnU3RvcmFnZSk7CisgICAgc3RkOjpzd2FwKEFsbG9jYXRvciwgUEQuQWxsb2NhdG9yKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldERpYWdJRCgpIGNvbnN0IHsgcmV0dXJuIERpYWdJRDsgfQorCisgIHZvaWQgQWRkVGFnZ2VkVmFsKGludHB0cl90IFYsIERpYWdub3N0aWNzRW5naW5lOjpBcmd1bWVudEtpbmQgS2luZCkgY29uc3QgeworICAgIGlmICghRGlhZ1N0b3JhZ2UpCisgICAgICBEaWFnU3RvcmFnZSA9IGdldFN0b3JhZ2UoKTsKKworICAgIGFzc2VydChEaWFnU3RvcmFnZS0+TnVtRGlhZ0FyZ3MgPCBTdG9yYWdlOjpNYXhBcmd1bWVudHMgJiYKKyAgICAgICAgICAgIlRvbyBtYW55IGFyZ3VtZW50cyB0byBkaWFnbm9zdGljISIpOworICAgIERpYWdTdG9yYWdlLT5EaWFnQXJndW1lbnRzS2luZFtEaWFnU3RvcmFnZS0+TnVtRGlhZ0FyZ3NdID0gS2luZDsKKyAgICBEaWFnU3RvcmFnZS0+RGlhZ0FyZ3VtZW50c1ZhbFtEaWFnU3RvcmFnZS0+TnVtRGlhZ0FyZ3MrK10gPSBWOworICB9CisKKyAgdm9pZCBBZGRTdHJpbmcoU3RyaW5nUmVmIFYpIGNvbnN0IHsKKyAgICBpZiAoIURpYWdTdG9yYWdlKQorICAgICAgRGlhZ1N0b3JhZ2UgPSBnZXRTdG9yYWdlKCk7CisKKyAgICBhc3NlcnQoRGlhZ1N0b3JhZ2UtPk51bURpYWdBcmdzIDwgU3RvcmFnZTo6TWF4QXJndW1lbnRzICYmCisgICAgICAgICAgICJUb28gbWFueSBhcmd1bWVudHMgdG8gZGlhZ25vc3RpYyEiKTsKKyAgICBEaWFnU3RvcmFnZS0+RGlhZ0FyZ3VtZW50c0tpbmRbRGlhZ1N0b3JhZ2UtPk51bURpYWdBcmdzXQorICAgICAgPSBEaWFnbm9zdGljc0VuZ2luZTo6YWtfc3RkX3N0cmluZzsKKyAgICBEaWFnU3RvcmFnZS0+RGlhZ0FyZ3VtZW50c1N0cltEaWFnU3RvcmFnZS0+TnVtRGlhZ0FyZ3MrK10gPSBWOworICB9CisKKyAgdm9pZCBFbWl0KGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZEQikgY29uc3QgeworICAgIGlmICghRGlhZ1N0b3JhZ2UpCisgICAgICByZXR1cm47CisKKyAgICAvLyBBZGQgYWxsIGFyZ3VtZW50cy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGlhZ1N0b3JhZ2UtPk51bURpYWdBcmdzOyBpICE9IGU7ICsraSkgeworICAgICAgaWYgKChEaWFnbm9zdGljc0VuZ2luZTo6QXJndW1lbnRLaW5kKURpYWdTdG9yYWdlLT5EaWFnQXJndW1lbnRzS2luZFtpXQorICAgICAgICAgICAgPT0gRGlhZ25vc3RpY3NFbmdpbmU6OmFrX3N0ZF9zdHJpbmcpCisgICAgICAgIERCLkFkZFN0cmluZyhEaWFnU3RvcmFnZS0+RGlhZ0FyZ3VtZW50c1N0cltpXSk7CisgICAgICBlbHNlCisgICAgICAgIERCLkFkZFRhZ2dlZFZhbChEaWFnU3RvcmFnZS0+RGlhZ0FyZ3VtZW50c1ZhbFtpXSwKKyAgICAgICAgICAgIChEaWFnbm9zdGljc0VuZ2luZTo6QXJndW1lbnRLaW5kKURpYWdTdG9yYWdlLT5EaWFnQXJndW1lbnRzS2luZFtpXSk7CisgICAgfQorCisgICAgLy8gQWRkIGFsbCByYW5nZXMuCisgICAgZm9yIChjb25zdCBDaGFyU291cmNlUmFuZ2UgJlJhbmdlIDogRGlhZ1N0b3JhZ2UtPkRpYWdSYW5nZXMpCisgICAgICBEQi5BZGRTb3VyY2VSYW5nZShSYW5nZSk7CisKKyAgICAvLyBBZGQgYWxsIGZpeC1pdHMuCisgICAgZm9yIChjb25zdCBGaXhJdEhpbnQgJkZpeCA6IERpYWdTdG9yYWdlLT5GaXhJdEhpbnRzKQorICAgICAgREIuQWRkRml4SXRIaW50KEZpeCk7CisgIH0KKworICB2b2lkIEVtaXRUb1N0cmluZyhEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MsCisgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmQnVmKSBjb25zdCB7CisgICAgLy8gRklYTUU6IEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byByZW5kZXIgYSBkaWFnbm9zdGljIHRvIGEgc3RyaW5nIHdpdGhvdXQKKyAgICAvLyAgICAgICAgbWVzc2luZyB3aXRoIHRoZSBzdGF0ZSBvZiB0aGUgZGlhZ25vc3RpY3MgZW5naW5lLgorICAgIERpYWdub3N0aWNCdWlsZGVyIERCKERpYWdzLlJlcG9ydChnZXREaWFnSUQoKSkpOworICAgIEVtaXQoREIpOworICAgIERCLkZsdXNoQ291bnRzKCk7CisgICAgRGlhZ25vc3RpYygmRGlhZ3MpLkZvcm1hdERpYWdub3N0aWMoQnVmKTsKKyAgICBEQi5DbGVhcigpOworICAgIERpYWdzLkNsZWFyKCk7CisgIH0KKworICAvLy8gXGJyaWVmIENsZWFyIG91dCB0aGlzIHBhcnRpYWwgZGlhZ25vc3RpYywgZ2l2aW5nIGl0IGEgbmV3IGRpYWdub3N0aWMgSUQKKyAgLy8vIGFuZCByZW1vdmluZyBhbGwgb2YgaXRzIGFyZ3VtZW50cywgcmFuZ2VzLCBhbmQgZml4LWl0IGhpbnRzLgorICB2b2lkIFJlc2V0KHVuc2lnbmVkIERpYWdJRCA9IDApIHsKKyAgICB0aGlzLT5EaWFnSUQgPSBEaWFnSUQ7CisgICAgZnJlZVN0b3JhZ2UoKTsKKyAgfQorCisgIGJvb2wgaGFzU3RvcmFnZSgpIGNvbnN0IHsgcmV0dXJuIERpYWdTdG9yYWdlICE9IG51bGxwdHI7IH0KKworICAvLy8gUmV0cmlldmUgdGhlIHN0cmluZyBhcmd1bWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgIFN0cmluZ1JlZiBnZXRTdHJpbmdBcmcodW5zaWduZWQgSSkgeworICAgIGFzc2VydChEaWFnU3RvcmFnZSAmJiAiTm8gZGlhZ25vc3RpYyBzdG9yYWdlPyIpOworICAgIGFzc2VydChJIDwgRGlhZ1N0b3JhZ2UtPk51bURpYWdBcmdzICYmICJOb3QgZW5vdWdoIGRpYWdub3N0aWMgYXJncyIpOworICAgIGFzc2VydChEaWFnU3RvcmFnZS0+RGlhZ0FyZ3VtZW50c0tpbmRbSV0KKyAgICAgICAgICAgICA9PSBEaWFnbm9zdGljc0VuZ2luZTo6YWtfc3RkX3N0cmluZyAmJiAiTm90IGEgc3RyaW5nIGFyZyIpOworICAgIHJldHVybiBEaWFnU3RvcmFnZS0+RGlhZ0FyZ3VtZW50c1N0cltJXTsKKyAgfQorCisgIGZyaWVuZCBjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmb3BlcmF0b3I8PChjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmUEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJKSB7CisgICAgUEQuQWRkVGFnZ2VkVmFsKEksIERpYWdub3N0aWNzRW5naW5lOjpha191aW50KTsKKyAgICByZXR1cm4gUEQ7CisgIH0KKworICBmcmllbmQgY29uc3QgUGFydGlhbERpYWdub3N0aWMgJm9wZXJhdG9yPDwoY29uc3QgUGFydGlhbERpYWdub3N0aWMgJlBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEkpIHsKKyAgICBQRC5BZGRUYWdnZWRWYWwoSSwgRGlhZ25vc3RpY3NFbmdpbmU6OmFrX3NpbnQpOworICAgIHJldHVybiBQRDsKKyAgfQorCisgIGZyaWVuZCBpbmxpbmUgY29uc3QgUGFydGlhbERpYWdub3N0aWMgJm9wZXJhdG9yPDwoY29uc3QgUGFydGlhbERpYWdub3N0aWMgJlBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlMpIHsKKyAgICBQRC5BZGRUYWdnZWRWYWwocmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oUyksCisgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpha19jX3N0cmluZyk7CisgICAgcmV0dXJuIFBEOworICB9CisKKyAgZnJpZW5kIGlubGluZSBjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmb3BlcmF0b3I8PChjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmUEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFMpIHsKKworICAgIFBELkFkZFN0cmluZyhTKTsKKyAgICByZXR1cm4gUEQ7CisgIH0KKworICBmcmllbmQgaW5saW5lIGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZvcGVyYXRvcjw8KGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZQRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJZGVudGlmaWVySW5mbyAqSUkpIHsKKyAgICBQRC5BZGRUYWdnZWRWYWwocmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oSUkpLAorICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6YWtfaWRlbnRpZmllcmluZm8pOworICAgIHJldHVybiBQRDsKKyAgfQorCisgIC8vIEFkZHMgYSBEZWNsQ29udGV4dCB0byB0aGUgZGlhZ25vc3RpYy4gVGhlIGVuYWJsZV9pZiB0ZW1wbGF0ZSBtYWdpYyBpcyBoZXJlCisgIC8vIHNvIHRoYXQgd2Ugb25seSBtYXRjaCB0aG9zZSBhcmd1bWVudHMgdGhhdCBhcmUgKHN0YXRpY2FsbHkpIERlY2xDb250ZXh0czsKKyAgLy8gb3RoZXIgYXJndW1lbnRzIHRoYXQgZGVyaXZlIGZyb20gRGVjbENvbnRleHQgKGUuZy4sIFJlY29yZERlY2xzKSB3aWxsIG5vdAorICAvLyBtYXRjaC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgZnJpZW5kIGlubGluZQorICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8VCwgRGVjbENvbnRleHQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFydGlhbERpYWdub3N0aWMgJj46OnR5cGUKKyAgb3BlcmF0b3I8PChjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmUEQsIFQgKkRDKSB7CisgICAgUEQuQWRkVGFnZ2VkVmFsKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KERDKSwKKyAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OmFrX2RlY2xjb250ZXh0KTsKKyAgICByZXR1cm4gUEQ7CisgIH0KKworICBmcmllbmQgaW5saW5lIGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZvcGVyYXRvcjw8KGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZQRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSKSB7CisgICAgUEQuQWRkU291cmNlUmFuZ2UoQ2hhclNvdXJjZVJhbmdlOjpnZXRUb2tlblJhbmdlKFIpKTsKKyAgICByZXR1cm4gUEQ7CisgIH0KKworICBmcmllbmQgaW5saW5lIGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZvcGVyYXRvcjw8KGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZQRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDaGFyU291cmNlUmFuZ2UgJlIpIHsKKyAgICBQRC5BZGRTb3VyY2VSYW5nZShSKTsKKyAgICByZXR1cm4gUEQ7CisgIH0KKworICBmcmllbmQgY29uc3QgUGFydGlhbERpYWdub3N0aWMgJm9wZXJhdG9yPDwoY29uc3QgUGFydGlhbERpYWdub3N0aWMgJlBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRml4SXRIaW50ICZIaW50KSB7CisgICAgUEQuQWRkRml4SXRIaW50KEhpbnQpOworICAgIHJldHVybiBQRDsKKyAgfQorfTsKKworaW5saW5lIGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZvcGVyYXRvcjw8KGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZEQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmUEQpIHsKKyAgUEQuRW1pdChEQik7CisgIHJldHVybiBEQjsKK30KKworLy8vIFxicmllZiBBIHBhcnRpYWwgZGlhZ25vc3RpYyBhbG9uZyB3aXRoIHRoZSBzb3VyY2UgbG9jYXRpb24gd2hlcmUgdGhpcworLy8vIGRpYWdub3N0aWMgb2NjdXJzLgordXNpbmcgUGFydGlhbERpYWdub3N0aWNBdCA9IHN0ZDo6cGFpcjxTb3VyY2VMb2NhdGlvbiwgUGFydGlhbERpYWdub3N0aWM+OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19CQVNJQ19QQVJUSUFMRElBR05PU1RJQ19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9QbGlzdFN1cHBvcnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1BsaXN0U3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOTJiYmYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9QbGlzdFN1cHBvcnQuaApAQCAtMCwwICsxLDEyNyBAQAorLy89PT0tIFBsaXN0U3VwcG9ydC5oIC0gUGxpc3QgT3V0cHV0IFV0aWxpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX1BMSVNUU1VQUE9SVF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfUExJU1RTVVBQT1JUX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIG1hcmt1cCB7CisKK3VzaW5nIEZJRE1hcCA9IGxsdm06OkRlbnNlTWFwPEZpbGVJRCwgdW5zaWduZWQ+OworCitpbmxpbmUgdm9pZCBBZGRGSUQoRklETWFwICZGSURzLCBTbWFsbFZlY3RvckltcGw8RmlsZUlEPiAmViwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwgU291cmNlTG9jYXRpb24gTCkgeworICBGaWxlSUQgRklEID0gU00uZ2V0RmlsZUlEKFNNLmdldEV4cGFuc2lvbkxvYyhMKSk7CisgIEZJRE1hcDo6aXRlcmF0b3IgSSA9IEZJRHMuZmluZChGSUQpOworICBpZiAoSSAhPSBGSURzLmVuZCgpKQorICAgIHJldHVybjsKKyAgRklEc1tGSURdID0gVi5zaXplKCk7CisgIFYucHVzaF9iYWNrKEZJRCk7Cit9CisKK2lubGluZSB1bnNpZ25lZCBHZXRGSUQoY29uc3QgRklETWFwICZGSURzLCBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwKKyAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCkgeworICBGaWxlSUQgRklEID0gU00uZ2V0RmlsZUlEKFNNLmdldEV4cGFuc2lvbkxvYyhMKSk7CisgIEZJRE1hcDo6Y29uc3RfaXRlcmF0b3IgSSA9IEZJRHMuZmluZChGSUQpOworICBhc3NlcnQoSSAhPSBGSURzLmVuZCgpKTsKKyAgcmV0dXJuIEktPnNlY29uZDsKK30KKworaW5saW5lIHJhd19vc3RyZWFtICZJbmRlbnQocmF3X29zdHJlYW0gJm8sIGNvbnN0IHVuc2lnbmVkIGluZGVudCkgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaW5kZW50OyArK2kpCisgICAgbyA8PCAnICc7CisgIHJldHVybiBvOworfQorCitpbmxpbmUgcmF3X29zdHJlYW0gJkVtaXRQbGlzdEhlYWRlcihyYXdfb3N0cmVhbSAmbykgeworICBzdGF0aWMgY29uc3QgY2hhciAqUGxpc3RIZWFkZXIgPQorICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIgorICAgICAgIjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgXCItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU5cIiAiCisgICAgICAiXCJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkXCI+XG4iCisgICAgICAiPHBsaXN0IHZlcnNpb249XCIxLjBcIj5cbiI7CisgIHJldHVybiBvIDw8IFBsaXN0SGVhZGVyOworfQorCitpbmxpbmUgcmF3X29zdHJlYW0gJkVtaXRJbnRlZ2VyKHJhd19vc3RyZWFtICZvLCBpbnQ2NF90IHZhbHVlKSB7CisgIG8gPDwgIjxpbnRlZ2VyPiI7CisgIG8gPDwgdmFsdWU7CisgIG8gPDwgIjwvaW50ZWdlcj4iOworICByZXR1cm4gbzsKK30KKworaW5saW5lIHJhd19vc3RyZWFtICZFbWl0U3RyaW5nKHJhd19vc3RyZWFtICZvLCBTdHJpbmdSZWYgcykgeworICBvIDw8ICI8c3RyaW5nPiI7CisgIGZvciAoU3RyaW5nUmVmOjpjb25zdF9pdGVyYXRvciBJID0gcy5iZWdpbigpLCBFID0gcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBjaGFyIGMgPSAqSTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICBkZWZhdWx0OgorICAgICAgbyA8PCBjOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnJic6CisgICAgICBvIDw8ICImYW1wOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc8JzoKKyAgICAgIG8gPDwgIiZsdDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPic6CisgICAgICBvIDw8ICImZ3Q7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1wnJzoKKyAgICAgIG8gPDwgIiZhcG9zOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcIic6CisgICAgICBvIDw8ICImcXVvdDsiOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIG8gPDwgIjwvc3RyaW5nPiI7CisgIHJldHVybiBvOworfQorCitpbmxpbmUgdm9pZCBFbWl0TG9jYXRpb24ocmF3X29zdHJlYW0gJm8sIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEwsIGNvbnN0IEZJRE1hcCAmRk0sIHVuc2lnbmVkIGluZGVudCkgeworICBpZiAoTC5pc0ludmFsaWQoKSkgcmV0dXJuOworCisgIEZ1bGxTb3VyY2VMb2MgTG9jKFNNLmdldEV4cGFuc2lvbkxvYyhMKSwgY29uc3RfY2FzdDxTb3VyY2VNYW5hZ2VyICY+KFNNKSk7CisKKyAgSW5kZW50KG8sIGluZGVudCkgPDwgIjxkaWN0PlxuIjsKKyAgSW5kZW50KG8sIGluZGVudCkgPDwgIiA8a2V5PmxpbmU8L2tleT4iOworICBFbWl0SW50ZWdlcihvLCBMb2MuZ2V0RXhwYW5zaW9uTGluZU51bWJlcigpKSA8PCAnXG4nOworICBJbmRlbnQobywgaW5kZW50KSA8PCAiIDxrZXk+Y29sPC9rZXk+IjsKKyAgRW1pdEludGVnZXIobywgTG9jLmdldEV4cGFuc2lvbkNvbHVtbk51bWJlcigpKSA8PCAnXG4nOworICBJbmRlbnQobywgaW5kZW50KSA8PCAiIDxrZXk+ZmlsZTwva2V5PiI7CisgIEVtaXRJbnRlZ2VyKG8sIEdldEZJRChGTSwgU00sIExvYykpIDw8ICdcbic7CisgIEluZGVudChvLCBpbmRlbnQpIDw8ICI8L2RpY3Q+XG4iOworfQorCitpbmxpbmUgdm9pZCBFbWl0UmFuZ2UocmF3X29zdHJlYW0gJm8sIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLAorICAgICAgICAgICAgICAgICAgICAgIENoYXJTb3VyY2VSYW5nZSBSLCBjb25zdCBGSURNYXAgJkZNLCB1bnNpZ25lZCBpbmRlbnQpIHsKKyAgaWYgKFIuaXNJbnZhbGlkKCkpIHJldHVybjsKKworICBhc3NlcnQoUi5pc0NoYXJSYW5nZSgpICYmICJjYW5ub3QgaGFuZGxlIGEgdG9rZW4gcmFuZ2UiKTsKKyAgSW5kZW50KG8sIGluZGVudCkgPDwgIjxhcnJheT5cbiI7CisgIEVtaXRMb2NhdGlvbihvLCBTTSwgUi5nZXRCZWdpbigpLCBGTSwgaW5kZW50ICsgMSk7CisgIEVtaXRMb2NhdGlvbihvLCBTTSwgUi5nZXRFbmQoKSwgRk0sIGluZGVudCArIDEpOworICBJbmRlbnQobywgaW5kZW50KSA8PCAiPC9hcnJheT5cbiI7Cit9CisKK30gLy8gbmFtZXNwYWNlIG1hcmt1cAorfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQkFTSUNfUExJU1RTVVBQT1JUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ByYWdtYUtpbmRzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9QcmFnbWFLaW5kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNzNhOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9QcmFnbWFLaW5kcy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vPT09LS0tIFByYWdtYUtpbmRzLmggLSAjcHJhZ21hIGNvbW1lbnQoKSBraW5kcyAgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19QUkFHTUFfS0lORFNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX1BSQUdNQV9LSU5EU19ICisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2VudW0gUHJhZ21hTVNDb21tZW50S2luZCB7CisgIFBDS19Vbmtub3duLAorICBQQ0tfTGlua2VyLCAgIC8vICNwcmFnbWEgY29tbWVudChsaW5rZXIsIC4uLikKKyAgUENLX0xpYiwgICAgICAvLyAjcHJhZ21hIGNvbW1lbnQobGliLCAuLi4pCisgIFBDS19Db21waWxlciwgLy8gI3ByYWdtYSBjb21tZW50KGNvbXBpbGVyLCAuLi4pCisgIFBDS19FeGVTdHIsICAgLy8gI3ByYWdtYSBjb21tZW50KGV4ZXN0ciwgLi4uKQorICBQQ0tfVXNlciAgICAgIC8vICNwcmFnbWEgY29tbWVudCh1c2VyLCAuLi4pCit9OworCitlbnVtIFByYWdtYU1TU3RydWN0S2luZCB7CisgIFBNU1NUX09GRiwgLy8gI3ByYWdtcyBtc19zdHJ1Y3Qgb2ZmCisgIFBNU1NUX09OICAgLy8gI3ByYWdtcyBtc19zdHJ1Y3Qgb24KK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9QcmV0dHlTdGFja1RyYWNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9QcmV0dHlTdGFja1RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhZGFlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ByZXR0eVN0YWNrVHJhY2UuaApAQCAtMCwwICsxLDM4IEBACisvLz09PS0gY2xhbmcvQmFzaWMvUHJldHR5U3RhY2tUcmFjZS5oIC0gUHJldHR5IENyYXNoIEhhbmRsaW5nIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHRoZSBQcmV0dHlTdGFja1RyYWNlRW50cnkgY2xhc3MsIHdoaWNoIGlzIHVzZWQgdG8gbWFrZQorLy8vIGNyYXNoZXMgZ2l2ZSBtb3JlIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCB0aGUgcHJvZ3JhbSB3YXMgZG9pbmcKKy8vLyB3aGVuIGl0IGNyYXNoZWQuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19QUkVUVFlTVEFDS1RSQUNFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19CQVNJQ19QUkVUVFlTVEFDS1RSQUNFX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1ByZXR0eVN0YWNrVHJhY2UuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworICAvLy8gSWYgYSBjcmFzaCBoYXBwZW5zIHdoaWxlIG9uZSBvZiB0aGVzZSBvYmplY3RzIGFyZSBsaXZlLCB0aGUgbWVzc2FnZQorICAvLy8gaXMgcHJpbnRlZCBvdXQgYWxvbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBsb2NhdGlvbi4KKyAgY2xhc3MgUHJldHR5U3RhY2tUcmFjZUxvYyA6IHB1YmxpYyBsbHZtOjpQcmV0dHlTdGFja1RyYWNlRW50cnkgeworICAgIFNvdXJjZU1hbmFnZXIgJlNNOworICAgIFNvdXJjZUxvY2F0aW9uIExvYzsKKyAgICBjb25zdCBjaGFyICpNZXNzYWdlOworICBwdWJsaWM6CisgICAgUHJldHR5U3RhY2tUcmFjZUxvYyhTb3VyY2VNYW5hZ2VyICZzbSwgU291cmNlTG9jYXRpb24gTCwgY29uc3QgY2hhciAqTXNnKQorICAgICAgOiBTTShzbSksIExvYyhMKSwgTWVzc2FnZShNc2cpIHt9CisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworICB9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1Nhbml0aXplckJsYWNrbGlzdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvU2FuaXRpemVyQmxhY2tsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFlNWMzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1Nhbml0aXplckJsYWNrbGlzdC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vPT09LS0tIFNhbml0aXplckJsYWNrbGlzdC5oIC0gQmxhY2tsaXN0IGZvciBzYW5pdGl6ZXJzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVXNlci1wcm92aWRlZCBibGFja2xpc3QgdXNlZCB0byBkaXNhYmxlL2FsdGVyIGluc3RydW1lbnRhdGlvbiBkb25lIGluCisvLyBzYW5pdGl6ZXJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfU0FOSVRJWkVSQkxBQ0tMSVNUX0gKKyNkZWZpbmUgTExWTV9DTEFOR19CQVNJQ19TQU5JVElaRVJCTEFDS0xJU1RfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Nhbml0aXplclNwZWNpYWxDYXNlTGlzdC5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Nhbml0aXplcnMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIFNhbml0aXplckJsYWNrbGlzdCB7CisgIHN0ZDo6dW5pcXVlX3B0cjxTYW5pdGl6ZXJTcGVjaWFsQ2FzZUxpc3Q+IFNTQ0w7CisgIFNvdXJjZU1hbmFnZXIgJlNNOworCitwdWJsaWM6CisgIFNhbml0aXplckJsYWNrbGlzdChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJkJsYWNrbGlzdFBhdGhzLAorICAgICAgICAgICAgICAgICAgICAgU291cmNlTWFuYWdlciAmU00pOworICBib29sIGlzQmxhY2tsaXN0ZWRHbG9iYWwoU2FuaXRpemVyTWFzayBNYXNrLCBTdHJpbmdSZWYgR2xvYmFsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDYXRlZ29yeSA9IFN0cmluZ1JlZigpKSBjb25zdDsKKyAgYm9vbCBpc0JsYWNrbGlzdGVkVHlwZShTYW5pdGl6ZXJNYXNrIE1hc2ssIFN0cmluZ1JlZiBNYW5nbGVkVHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENhdGVnb3J5ID0gU3RyaW5nUmVmKCkpIGNvbnN0OworICBib29sIGlzQmxhY2tsaXN0ZWRGdW5jdGlvbihTYW5pdGl6ZXJNYXNrIE1hc2ssIFN0cmluZ1JlZiBGdW5jdGlvbk5hbWUpIGNvbnN0OworICBib29sIGlzQmxhY2tsaXN0ZWRGaWxlKFNhbml0aXplck1hc2sgTWFzaywgU3RyaW5nUmVmIEZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDYXRlZ29yeSA9IFN0cmluZ1JlZigpKSBjb25zdDsKKyAgYm9vbCBpc0JsYWNrbGlzdGVkTG9jYXRpb24oU2FuaXRpemVyTWFzayBNYXNrLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDYXRlZ29yeSA9IFN0cmluZ1JlZigpKSBjb25zdDsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9TYW5pdGl6ZXJTcGVjaWFsQ2FzZUxpc3QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1Nhbml0aXplclNwZWNpYWxDYXNlTGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjUyMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9TYW5pdGl6ZXJTcGVjaWFsQ2FzZUxpc3QuaApAQCAtMCwwICsxLDU0IEBACisvLz09PS0tLSBTYW5pdGl6ZXJTcGVjaWFsQ2FzZUxpc3QuaCAtIFNDTCBmb3Igc2FuaXRpemVycyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEFuIGV4dGVuc2lvbiBvZiBTcGVjaWFsQ2FzZUxpc3QgdG8gYWxsb3dpbmcgcXVlcnlpbmcgc2VjdGlvbnMgYnkKKy8vIFNhbml0aXplck1hc2suCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19TQU5JVElaRVJTUEVDSUFMQ0FTRUxJU1RfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX1NBTklUSVpFUlNQRUNJQUxDQVNFTElTVF9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU2FuaXRpemVycy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TcGVjaWFsQ2FzZUxpc3QuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIFNhbml0aXplclNwZWNpYWxDYXNlTGlzdCA6IHB1YmxpYyBsbHZtOjpTcGVjaWFsQ2FzZUxpc3QgeworcHVibGljOgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFNhbml0aXplclNwZWNpYWxDYXNlTGlzdD4KKyAgY3JlYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmUGF0aHMsIHN0ZDo6c3RyaW5nICZFcnJvcik7CisKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTYW5pdGl6ZXJTcGVjaWFsQ2FzZUxpc3Q+CisgIGNyZWF0ZU9yRGllKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmUGF0aHMpOworCisgIC8vIFF1ZXJ5IGJsYWNrbGlzdGVkIGVudHJpZXMgaWYgYW55IGJpdCBpbiBNYXNrIG1hdGNoZXMgdGhlIGVudHJ5J3Mgc2VjdGlvbi4KKyAgYm9vbCBpblNlY3Rpb24oU2FuaXRpemVyTWFzayBNYXNrLCBTdHJpbmdSZWYgUHJlZml4LCBTdHJpbmdSZWYgUXVlcnksCisgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDYXRlZ29yeSA9IFN0cmluZ1JlZigpKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAvLyBJbml0aWFsaXplIFNhbml0aXplclNlY3Rpb25zLgorICB2b2lkIGNyZWF0ZVNhbml0aXplclNlY3Rpb25zKCk7CisKKyAgc3RydWN0IFNhbml0aXplclNlY3Rpb24geworICAgIFNhbml0aXplclNlY3Rpb24oU2FuaXRpemVyTWFzayBTTSwgU2VjdGlvbkVudHJpZXMgJkUpCisgICAgICAgIDogTWFzayhTTSksIEVudHJpZXMoRSl7fTsKKworICAgIFNhbml0aXplck1hc2sgTWFzazsKKyAgICBTZWN0aW9uRW50cmllcyAmRW50cmllczsKKyAgfTsKKworICBzdGQ6OnZlY3RvcjxTYW5pdGl6ZXJTZWN0aW9uPiBTYW5pdGl6ZXJTZWN0aW9uczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1Nhbml0aXplcnMuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvU2FuaXRpemVycy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkNWNjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1Nhbml0aXplcnMuZGVmCkBAIC0wLDAgKzEsMTQ4IEBACisvLz09PS0tLSBTYW5pdGl6ZXJzLmRlZiAtIFJ1bnRpbWUgc2FuaXRpemVyIG9wdGlvbnMgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBvcHRpb25zIGZvciBzcGVjaWZ5aW5nIHdoaWNoIHJ1bnRpbWUgc2FuaXRpemVycyB0bworLy8gZW5hYmxlLiBVc2VycyBvZiB0aGlzIGZpbGUgbXVzdCBkZWZpbmUgdGhlIFNBTklUSVpFUiBtYWNybyB0byBtYWtlIHVzZSBvZgorLy8gdGhpcyBpbmZvcm1hdGlvbi4gVXNlcnMgb2YgdGhpcyBmaWxlIGNhbiBhbHNvIGRlZmluZSB0aGUgU0FOSVRJWkVSX0dST1VQCisvLyBtYWNybyB0byBnZXQgaW5mb3JtYXRpb24gb24gb3B0aW9ucyB3aGljaCByZWZlciB0byBzZXRzIG9mIHNhbml0aXplcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBTQU5JVElaRVIKKyNlcnJvciAiRGVmaW5lIFNBTklUSVpFUiBwcmlvciB0byBpbmNsdWRpbmcgdGhpcyBmaWxlISIKKyNlbmRpZgorCisvLyBTQU5JVElaRVIoTkFNRSwgSUQpCisKKy8vIFRoZSBmaXJzdCB2YWx1ZSBpcyB0aGUgbmFtZSBvZiB0aGUgc2FuaXRpemVyIGFzIGEgc3RyaW5nLiBUaGUgc2FuaXRpemVyIGNhbgorLy8gYmUgZW5hYmxlZCBieSBzcGVjaWZ5aW5nIC1mc2FuaXRpemU9TkFNRS4KKworLy8gVGhlIHNlY29uZCB2YWx1ZSBpcyBhbiBpZGVudGlmaWVyIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZQorLy8gc2FuaXRpemVyLgorCisKKy8vIFNBTklUSVpFUl9HUk9VUChOQU1FLCBJRCwgQUxJQVMpCisKKy8vIFRoZSBmaXJzdCB0d28gdmFsdWVzIGhhdmUgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBjb3JyZXNwb25kaW5nIFNBTklUSVpFUgorLy8gdmFsdWVzLiBUaGUgdGhpcmQgdmFsdWUgaXMgYW4gZXhwcmVzc2lvbiBPUmluZyB0b2dldGhlciB0aGUgSURzIG9mIGluZGl2aWR1YWwKKy8vIHNhbml0aXplcnMgaW4gdGhpcyBncm91cC4KKworI2lmbmRlZiBTQU5JVElaRVJfR1JPVVAKKyNkZWZpbmUgU0FOSVRJWkVSX0dST1VQKE5BTUUsIElELCBBTElBUykKKyNlbmRpZgorCisKKy8vIEFkZHJlc3NTYW5pdGl6ZXIKK1NBTklUSVpFUigiYWRkcmVzcyIsIEFkZHJlc3MpCisKKy8vIEtlcm5lbCBBZGRyZXNzU2FuaXRpemVyIChLQVNhbikKK1NBTklUSVpFUigia2VybmVsLWFkZHJlc3MiLCBLZXJuZWxBZGRyZXNzKQorCitTQU5JVElaRVIoImh3YWRkcmVzcyIsIEhXQWRkcmVzcykKKworLy8gTWVtb3J5U2FuaXRpemVyCitTQU5JVElaRVIoIm1lbW9yeSIsIE1lbW9yeSkKKworLy8gbGliRnV6emVyCitTQU5JVElaRVIoImZ1enplciIsIEZ1enplcikKKworLy8gbGliRnV6emVyLXJlcXVpcmVkIGluc3RydW1lbnRhdGlvbiwgbm8gbGlua2luZy4KK1NBTklUSVpFUigiZnV6emVyLW5vLWxpbmsiLCBGdXp6ZXJOb0xpbmspCisKKy8vIFRocmVhZFNhbml0aXplcgorU0FOSVRJWkVSKCJ0aHJlYWQiLCBUaHJlYWQpCisKKy8vIExlYWtTYW5pdGl6ZXIKK1NBTklUSVpFUigibGVhayIsIExlYWspCisKKy8vIFVuZGVmaW5lZEJlaGF2aW9yU2FuaXRpemVyCitTQU5JVElaRVIoImFsaWdubWVudCIsIEFsaWdubWVudCkKK1NBTklUSVpFUigiYXJyYXktYm91bmRzIiwgQXJyYXlCb3VuZHMpCitTQU5JVElaRVIoImJvb2wiLCBCb29sKQorU0FOSVRJWkVSKCJidWlsdGluIiwgQnVpbHRpbikKK1NBTklUSVpFUigiZW51bSIsIEVudW0pCitTQU5JVElaRVIoImZsb2F0LWNhc3Qtb3ZlcmZsb3ciLCBGbG9hdENhc3RPdmVyZmxvdykKK1NBTklUSVpFUigiZmxvYXQtZGl2aWRlLWJ5LXplcm8iLCBGbG9hdERpdmlkZUJ5WmVybykKK1NBTklUSVpFUigiZnVuY3Rpb24iLCBGdW5jdGlvbikKK1NBTklUSVpFUigiaW50ZWdlci1kaXZpZGUtYnktemVybyIsIEludGVnZXJEaXZpZGVCeVplcm8pCitTQU5JVElaRVIoIm5vbm51bGwtYXR0cmlidXRlIiwgTm9ubnVsbEF0dHJpYnV0ZSkKK1NBTklUSVpFUigibnVsbCIsIE51bGwpCitTQU5JVElaRVIoIm51bGxhYmlsaXR5LWFyZyIsIE51bGxhYmlsaXR5QXJnKQorU0FOSVRJWkVSKCJudWxsYWJpbGl0eS1hc3NpZ24iLCBOdWxsYWJpbGl0eUFzc2lnbikKK1NBTklUSVpFUigibnVsbGFiaWxpdHktcmV0dXJuIiwgTnVsbGFiaWxpdHlSZXR1cm4pCitTQU5JVElaRVJfR1JPVVAoIm51bGxhYmlsaXR5IiwgTnVsbGFiaWxpdHksCisgICAgICAgICAgICAgICAgTnVsbGFiaWxpdHlBcmcgfCBOdWxsYWJpbGl0eUFzc2lnbiB8IE51bGxhYmlsaXR5UmV0dXJuKQorU0FOSVRJWkVSKCJvYmplY3Qtc2l6ZSIsIE9iamVjdFNpemUpCitTQU5JVElaRVIoInBvaW50ZXItb3ZlcmZsb3ciLCBQb2ludGVyT3ZlcmZsb3cpCitTQU5JVElaRVIoInJldHVybiIsIFJldHVybikKK1NBTklUSVpFUigicmV0dXJucy1ub25udWxsLWF0dHJpYnV0ZSIsIFJldHVybnNOb25udWxsQXR0cmlidXRlKQorU0FOSVRJWkVSKCJzaGlmdC1iYXNlIiwgU2hpZnRCYXNlKQorU0FOSVRJWkVSKCJzaGlmdC1leHBvbmVudCIsIFNoaWZ0RXhwb25lbnQpCitTQU5JVElaRVJfR1JPVVAoInNoaWZ0IiwgU2hpZnQsIFNoaWZ0QmFzZSB8IFNoaWZ0RXhwb25lbnQpCitTQU5JVElaRVIoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwgU2lnbmVkSW50ZWdlck92ZXJmbG93KQorU0FOSVRJWkVSKCJ1bnJlYWNoYWJsZSIsIFVucmVhY2hhYmxlKQorU0FOSVRJWkVSKCJ2bGEtYm91bmQiLCBWTEFCb3VuZCkKK1NBTklUSVpFUigidnB0ciIsIFZwdHIpCisKKy8vIEludGVnZXJTYW5pdGl6ZXIKK1NBTklUSVpFUigidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsIFVuc2lnbmVkSW50ZWdlck92ZXJmbG93KQorCisvLyBEYXRhRmxvd1Nhbml0aXplcgorU0FOSVRJWkVSKCJkYXRhZmxvdyIsIERhdGFGbG93KQorCisvLyBDb250cm9sIEZsb3cgSW50ZWdyaXR5CitTQU5JVElaRVIoImNmaS1jYXN0LXN0cmljdCIsIENGSUNhc3RTdHJpY3QpCitTQU5JVElaRVIoImNmaS1kZXJpdmVkLWNhc3QiLCBDRklEZXJpdmVkQ2FzdCkKK1NBTklUSVpFUigiY2ZpLWljYWxsIiwgQ0ZJSUNhbGwpCitTQU5JVElaRVIoImNmaS11bnJlbGF0ZWQtY2FzdCIsIENGSVVucmVsYXRlZENhc3QpCitTQU5JVElaRVIoImNmaS1udmNhbGwiLCBDRklOVkNhbGwpCitTQU5JVElaRVIoImNmaS12Y2FsbCIsIENGSVZDYWxsKQorU0FOSVRJWkVSX0dST1VQKCJjZmkiLCBDRkksCisgICAgICAgICAgICAgICAgQ0ZJRGVyaXZlZENhc3QgfCBDRklJQ2FsbCB8IENGSVVucmVsYXRlZENhc3QgfCBDRklOVkNhbGwgfAorICAgICAgICAgICAgICAgIENGSVZDYWxsKQorCisvLyBTYWZlIFN0YWNrCitTQU5JVElaRVIoInNhZmUtc3RhY2siLCBTYWZlU3RhY2spCisKKy8vIC1mc2FuaXRpemU9dW5kZWZpbmVkIGluY2x1ZGVzIGFsbCB0aGUgc2FuaXRpemVycyB3aGljaCBoYXZlIGxvdyBvdmVyaGVhZCwgbm8KKy8vIEFCSSBvciBhZGRyZXNzIHNwYWNlIGxheW91dCBpbXBsaWNhdGlvbnMsIGFuZCBvbmx5IGNhdGNoIHVuZGVmaW5lZCBiZWhhdmlvci4KK1NBTklUSVpFUl9HUk9VUCgidW5kZWZpbmVkIiwgVW5kZWZpbmVkLAorICAgICAgICAgICAgICAgIEFsaWdubWVudCB8IEJvb2wgfCBCdWlsdGluIHwgQXJyYXlCb3VuZHMgfCBFbnVtIHwKKyAgICAgICAgICAgICAgICAgICAgRmxvYXRDYXN0T3ZlcmZsb3cgfCBGbG9hdERpdmlkZUJ5WmVybyB8CisgICAgICAgICAgICAgICAgICAgIEludGVnZXJEaXZpZGVCeVplcm8gfCBOb25udWxsQXR0cmlidXRlIHwgTnVsbCB8IE9iamVjdFNpemUgfAorICAgICAgICAgICAgICAgICAgICBQb2ludGVyT3ZlcmZsb3cgfCBSZXR1cm4gfCBSZXR1cm5zTm9ubnVsbEF0dHJpYnV0ZSB8IFNoaWZ0IHwKKyAgICAgICAgICAgICAgICAgICAgU2lnbmVkSW50ZWdlck92ZXJmbG93IHwgVW5yZWFjaGFibGUgfCBWTEFCb3VuZCB8IEZ1bmN0aW9uIHwKKyAgICAgICAgICAgICAgICAgICAgVnB0cikKKworLy8gLWZzYW5pdGl6ZT11bmRlZmluZWQtdHJhcCBpcyBhbiBhbGlhcyBmb3IgLWZzYW5pdGl6ZT11bmRlZmluZWQuCitTQU5JVElaRVJfR1JPVVAoInVuZGVmaW5lZC10cmFwIiwgVW5kZWZpbmVkVHJhcCwgVW5kZWZpbmVkKQorCitTQU5JVElaRVJfR1JPVVAoImludGVnZXIiLCBJbnRlZ2VyLAorICAgICAgICAgICAgICAgIFNpZ25lZEludGVnZXJPdmVyZmxvdyB8IFVuc2lnbmVkSW50ZWdlck92ZXJmbG93IHwgU2hpZnQgfAorICAgICAgICAgICAgICAgIEludGVnZXJEaXZpZGVCeVplcm8pCisKK1NBTklUSVpFUigibG9jYWwtYm91bmRzIiwgTG9jYWxCb3VuZHMpCitTQU5JVElaRVJfR1JPVVAoImJvdW5kcyIsIEJvdW5kcywgQXJyYXlCb3VuZHMgfCBMb2NhbEJvdW5kcykKKworLy8gRWZmaWNpZW5jeVNhbml0aXplcgorU0FOSVRJWkVSKCJlZmZpY2llbmN5LWNhY2hlLWZyYWciLCBFZmZpY2llbmN5Q2FjaGVGcmFnKQorU0FOSVRJWkVSKCJlZmZpY2llbmN5LXdvcmtpbmctc2V0IiwgRWZmaWNpZW5jeVdvcmtpbmdTZXQpCisvLyBNZXRhLWdyb3VwIG9ubHkgdXNlZCBpbnRlcm5hbGx5LgorU0FOSVRJWkVSX0dST1VQKCJlZmZpY2llbmN5LWFsbCIsIEVmZmljaWVuY3ksCisgICAgICAgICAgICAgICAgRWZmaWNpZW5jeUNhY2hlRnJhZyB8IEVmZmljaWVuY3lXb3JraW5nU2V0KQorCisvLyBTY3VkbyBoYXJkZW5lZCBhbGxvY2F0b3IKK1NBTklUSVpFUigic2N1ZG8iLCBTY3VkbykKKworLy8gTWFnaWMgZ3JvdXAsIGNvbnRhaW5pbmcgYWxsIHNhbml0aXplcnMuIEZvciBleGFtcGxlLCAiLWZuby1zYW5pdGl6ZT1hbGwiCisvLyBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIGFsbCB0aGUgc2FuaXRpemVycy4KK1NBTklUSVpFUl9HUk9VUCgiYWxsIiwgQWxsLCB+MFVMTCkKKworI3VuZGVmIFNBTklUSVpFUgorI3VuZGVmIFNBTklUSVpFUl9HUk9VUApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvU2FuaXRpemVycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvU2FuaXRpemVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZDIyYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9TYW5pdGl6ZXJzLmgKQEAgLTAsMCArMSw5MiBAQAorLy89PT0tIFNhbml0aXplcnMuaCAtIEMgTGFuZ3VhZ2UgRmFtaWx5IExhbmd1YWdlIE9wdGlvbnMgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgY2xhbmc6OlNhbml0aXplcktpbmQgZW51bS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfU0FOSVRJWkVSU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfU0FOSVRJWkVSU19ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK3VzaW5nIFNhbml0aXplck1hc2sgPSB1aW50NjRfdDsKKworbmFtZXNwYWNlIFNhbml0aXplcktpbmQgeworCisvLyBBc3NpZ24gb3JkaW5hbHMgdG8gcG9zc2libGUgdmFsdWVzIG9mIC1mc2FuaXRpemU9IGZsYWcsIHdoaWNoIHdlIHdpbGwgdXNlIGFzCisvLyBiaXQgcG9zaXRpb25zLgorZW51bSBTYW5pdGl6ZXJPcmRpbmFsIDogdWludDY0X3QgeworI2RlZmluZSBTQU5JVElaRVIoTkFNRSwgSUQpIFNPXyMjSUQsCisjZGVmaW5lIFNBTklUSVpFUl9HUk9VUChOQU1FLCBJRCwgQUxJQVMpIFNPXyMjSUQjI0dyb3VwLAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Nhbml0aXplcnMuZGVmIgorICBTT19Db3VudAorfTsKKworLy8gRGVmaW5lIHRoZSBzZXQgb2Ygc2FuaXRpemVyIGtpbmRzLCBhcyB3ZWxsIGFzIHRoZSBzZXQgb2Ygc2FuaXRpemVycyBlYWNoCisvLyBzYW5pdGl6ZXIgZ3JvdXAgZXhwYW5kcyBpbnRvLgorI2RlZmluZSBTQU5JVElaRVIoTkFNRSwgSUQpIFwKKyAgY29uc3QgU2FuaXRpemVyTWFzayBJRCA9IDFVTEwgPDwgU09fIyNJRDsKKyNkZWZpbmUgU0FOSVRJWkVSX0dST1VQKE5BTUUsIElELCBBTElBUykgXAorICBjb25zdCBTYW5pdGl6ZXJNYXNrIElEID0gQUxJQVM7IFwKKyAgY29uc3QgU2FuaXRpemVyTWFzayBJRCMjR3JvdXAgPSAxVUxMIDw8IFNPXyMjSUQjI0dyb3VwOworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Nhbml0aXplcnMuZGVmIgorCit9IC8vIG5hbWVzcGFjZSBTYW5pdGl6ZXJLaW5kCisKK3N0cnVjdCBTYW5pdGl6ZXJTZXQgeworICAvLy8gXGJyaWVmIENoZWNrIGlmIGEgY2VydGFpbiAoc2luZ2xlKSBzYW5pdGl6ZXIgaXMgZW5hYmxlZC4KKyAgYm9vbCBoYXMoU2FuaXRpemVyTWFzayBLKSBjb25zdCB7CisgICAgYXNzZXJ0KGxsdm06OmlzUG93ZXJPZjJfNjQoSykpOworICAgIHJldHVybiBNYXNrICYgSzsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2hlY2sgaWYgb25lIG9yIG1vcmUgc2FuaXRpemVycyBhcmUgZW5hYmxlZC4KKyAgYm9vbCBoYXNPbmVPZihTYW5pdGl6ZXJNYXNrIEspIGNvbnN0IHsgcmV0dXJuIE1hc2sgJiBLOyB9CisKKyAgLy8vIFxicmllZiBFbmFibGUgb3IgZGlzYWJsZSBhIGNlcnRhaW4gKHNpbmdsZSkgc2FuaXRpemVyLgorICB2b2lkIHNldChTYW5pdGl6ZXJNYXNrIEssIGJvb2wgVmFsdWUpIHsKKyAgICBhc3NlcnQobGx2bTo6aXNQb3dlck9mMl82NChLKSk7CisgICAgTWFzayA9IFZhbHVlID8gKE1hc2sgfCBLKSA6IChNYXNrICYgfkspOworICB9CisKKyAgLy8vIERpc2FibGUgdGhlIHNhbml0aXplcnMgc3BlY2lmaWVkIGluIFxwIEsuCisgIHZvaWQgY2xlYXIoU2FuaXRpemVyTWFzayBLID0gU2FuaXRpemVyS2luZDo6QWxsKSB7IE1hc2sgJj0gfks7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgc2FuaXRpemVyIGlzIGVuYWJsZWQuCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBNYXNrID09IDA7IH0KKworICAvLy8gXGJyaWVmIEJpdG1hc2sgb2YgZW5hYmxlZCBzYW5pdGl6ZXJzLgorICBTYW5pdGl6ZXJNYXNrIE1hc2sgPSAwOworfTsKKworLy8vIFBhcnNlIGEgc2luZ2xlIHZhbHVlIGZyb20gYSAtZnNhbml0aXplPSBvciAtZm5vLXNhbml0aXplPSB2YWx1ZSBsaXN0LgorLy8vIFJldHVybnMgYSBub24temVybyBTYW5pdGl6ZXJNYXNrLCBvciBcYyAwIGlmIFxwIFZhbHVlIGlzIG5vdCBrbm93bi4KK1Nhbml0aXplck1hc2sgcGFyc2VTYW5pdGl6ZXJWYWx1ZShTdHJpbmdSZWYgVmFsdWUsIGJvb2wgQWxsb3dHcm91cHMpOworCisvLy8gRm9yIGVhY2ggc2FuaXRpemVyIGdyb3VwIGJpdCBzZXQgaW4gXHAgS2luZHMsIHNldCB0aGUgYml0cyBmb3Igc2FuaXRpemVycworLy8vIHRoaXMgZ3JvdXAgZW5hYmxlcy4KK1Nhbml0aXplck1hc2sgZXhwYW5kU2FuaXRpemVyR3JvdXBzKFNhbml0aXplck1hc2sgS2luZHMpOworCisvLy8gUmV0dXJuIHRoZSBzYW5pdGl6ZXJzIHdoaWNoIGRvIG5vdCBhZmZlY3QgcHJlcHJvY2Vzc2luZy4KK2lubGluZSBTYW5pdGl6ZXJNYXNrIGdldFBQVHJhbnNwYXJlbnRTYW5pdGl6ZXJzKCkgeworICByZXR1cm4gU2FuaXRpemVyS2luZDo6Q0ZJIHwgU2FuaXRpemVyS2luZDo6SW50ZWdlciB8CisgICAgICAgICBTYW5pdGl6ZXJLaW5kOjpOdWxsYWJpbGl0eSB8IFNhbml0aXplcktpbmQ6OlVuZGVmaW5lZDsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQkFTSUNfU0FOSVRJWkVSU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODNmOTVlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaApAQCAtMCwwICsxLDQ4MCBAQAorLy89PT0tIFNvdXJjZUxvY2F0aW9uLmggLSBDb21wYWN0IGlkZW50aWZpZXIgZm9yIFNvdXJjZSBGaWxlcyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgY2xhbmc6OlNvdXJjZUxvY2F0aW9uIGNsYXNzIGFuZCBhc3NvY2lhdGVkIGZhY2lsaXRpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX1NPVVJDRUxPQ0FUSU9OX0gKKyNkZWZpbmUgTExWTV9DTEFOR19CQVNJQ19TT1VSQ0VMT0NBVElPTl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BvaW50ZXJMaWtlVHlwZVRyYWl0cy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IERlbnNlTWFwSW5mbzsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNQb2RMaWtlOworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIFNvdXJjZU1hbmFnZXI7CisKKy8vLyBcYnJpZWYgQW4gb3BhcXVlIGlkZW50aWZpZXIgdXNlZCBieSBTb3VyY2VNYW5hZ2VyIHdoaWNoIHJlZmVycyB0byBhCisvLy8gc291cmNlIGZpbGUgKE1lbW9yeUJ1ZmZlcikgYWxvbmcgd2l0aCBpdHMgXCNpbmNsdWRlIHBhdGggYW5kIFwjbGluZSBkYXRhLgorLy8vCitjbGFzcyBGaWxlSUQgeworICAvLy8gXGJyaWVmIEEgbW9zdGx5LW9wYXF1ZSBpZGVudGlmaWVyLCB3aGVyZSAwIGlzICJpbnZhbGlkIiwgPjAgaXMgCisgIC8vLyB0aGlzIG1vZHVsZSwgYW5kIDwtMSBpcyBzb21ldGhpbmcgbG9hZGVkIGZyb20gYW5vdGhlciBtb2R1bGUuCisgIGludCBJRCA9IDA7CisKK3B1YmxpYzoKKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gSUQgIT0gMDsgfQorICBib29sIGlzSW52YWxpZCgpIGNvbnN0IHsgcmV0dXJuIElEID09IDA7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgRmlsZUlEICZSSFMpIGNvbnN0IHsgcmV0dXJuIElEID09IFJIUy5JRDsgfQorICBib29sIG9wZXJhdG9yPChjb25zdCBGaWxlSUQgJlJIUykgY29uc3QgeyByZXR1cm4gSUQgPCBSSFMuSUQ7IH0KKyAgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEZpbGVJRCAmUkhTKSBjb25zdCB7IHJldHVybiBJRCA8PSBSSFMuSUQ7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZpbGVJRCAmUkhTKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IFJIUyk7IH0KKyAgYm9vbCBvcGVyYXRvcj4oY29uc3QgRmlsZUlEICZSSFMpIGNvbnN0IHsgcmV0dXJuIFJIUyA8ICp0aGlzOyB9CisgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBGaWxlSUQgJlJIUykgY29uc3QgeyByZXR1cm4gUkhTIDw9ICp0aGlzOyB9CisKKyAgc3RhdGljIEZpbGVJRCBnZXRTZW50aW5lbCgpIHsgcmV0dXJuIGdldCgtMSk7IH0KKyAgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KElEKTsgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQVNUV3JpdGVyOworICBmcmllbmQgY2xhc3MgQVNUUmVhZGVyOworICBmcmllbmQgY2xhc3MgU291cmNlTWFuYWdlcjsKKyAgCisgIHN0YXRpYyBGaWxlSUQgZ2V0KGludCBWKSB7CisgICAgRmlsZUlEIEY7CisgICAgRi5JRCA9IFY7CisgICAgcmV0dXJuIEY7CisgIH0KKworICBpbnQgZ2V0T3BhcXVlVmFsdWUoKSBjb25zdCB7IHJldHVybiBJRDsgfQorfTsKKworLy8vIFxicmllZiBFbmNvZGVzIGEgbG9jYXRpb24gaW4gdGhlIHNvdXJjZS4gVGhlIFNvdXJjZU1hbmFnZXIgY2FuIGRlY29kZSB0aGlzCisvLy8gdG8gZ2V0IGF0IHRoZSBmdWxsIGluY2x1ZGUgc3RhY2ssIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbi4KKy8vLworLy8vIFRlY2huaWNhbGx5LCBhIHNvdXJjZSBsb2NhdGlvbiBpcyBzaW1wbHkgYW4gb2Zmc2V0IGludG8gdGhlIG1hbmFnZXIncyB2aWV3CisvLy8gb2YgdGhlIGlucHV0IHNvdXJjZSwgd2hpY2ggaXMgYWxsIGlucHV0IGJ1ZmZlcnMgKGluY2x1ZGluZyBtYWNybworLy8vIGV4cGFuc2lvbnMpIGNvbmNhdGVuYXRlZCBpbiBhbiBlZmZlY3RpdmVseSBhcmJpdHJhcnkgb3JkZXIuIFRoZSBtYW5hZ2VyCisvLy8gYWN0dWFsbHkgbWFpbnRhaW5zIHR3byBibG9ja3Mgb2YgaW5wdXQgYnVmZmVycy4gT25lLCBzdGFydGluZyBhdCBvZmZzZXQKKy8vLyAwIGFuZCBncm93aW5nIHVwd2FyZHMsIGNvbnRhaW5zIGFsbCBidWZmZXJzIGZyb20gdGhpcyBtb2R1bGUuIFRoZSBvdGhlciwKKy8vLyBzdGFydGluZyBhdCB0aGUgaGlnaGVzdCBwb3NzaWJsZSBvZmZzZXQgYW5kIGdyb3dpbmcgZG93bndhcmRzLCBjb250YWlucworLy8vIGJ1ZmZlcnMgb2YgbG9hZGVkIG1vZHVsZXMuCisvLy8KKy8vLyBJbiBhZGRpdGlvbiwgb25lIGJpdCBvZiBTb3VyY2VMb2NhdGlvbiBpcyB1c2VkIGZvciBxdWljayBhY2Nlc3MgdG8gdGhlCisvLy8gaW5mb3JtYXRpb24gd2hldGhlciB0aGUgbG9jYXRpb24gaXMgaW4gYSBmaWxlIG9yIGEgbWFjcm8gZXhwYW5zaW9uLgorLy8vCisvLy8gSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhpcyB0eXBlIHJlbWFpbnMgc21hbGwuIEl0IGlzIGN1cnJlbnRseSAzMiBiaXRzIHdpZGUuCitjbGFzcyBTb3VyY2VMb2NhdGlvbiB7CisgIGZyaWVuZCBjbGFzcyBBU1RSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RXcml0ZXI7CisgIGZyaWVuZCBjbGFzcyBTb3VyY2VNYW5hZ2VyOworCisgIHVuc2lnbmVkIElEID0gMDsKKworICBlbnVtIDogdW5zaWduZWQgeworICAgIE1hY3JvSURCaXQgPSAxVSA8PCAzMQorICB9OworCitwdWJsaWM6CisgIGJvb2wgaXNGaWxlSUQoKSBjb25zdCAgeyByZXR1cm4gKElEICYgTWFjcm9JREJpdCkgPT0gMDsgfQorICBib29sIGlzTWFjcm9JRCgpIGNvbnN0IHsgcmV0dXJuIChJRCAmIE1hY3JvSURCaXQpICE9IDA7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSB2YWxpZCBTb3VyY2VMb2NhdGlvbiBvYmplY3QuCisgIC8vLworICAvLy8gSW52YWxpZCBTb3VyY2VMb2NhdGlvbnMgYXJlIG9mdGVuIHVzZWQgd2hlbiBldmVudHMgaGF2ZSBubyBjb3JyZXNwb25kaW5nCisgIC8vLyBsb2NhdGlvbiBpbiB0aGUgc291cmNlIChlLmcuIGEgZGlhZ25vc3RpYyBpcyByZXF1aXJlZCBmb3IgYSBjb21tYW5kIGxpbmUKKyAgLy8vIG9wdGlvbikuCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIElEICE9IDA7IH0KKyAgYm9vbCBpc0ludmFsaWQoKSBjb25zdCB7IHJldHVybiBJRCA9PSAwOyB9CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBvZmZzZXQgaW50byB0aGUgbWFuYWdlcidzIGdsb2JhbCBpbnB1dCB2aWV3LgorICB1bnNpZ25lZCBnZXRPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIElEICYgfk1hY3JvSURCaXQ7CisgIH0KKworICBzdGF0aWMgU291cmNlTG9jYXRpb24gZ2V0RmlsZUxvYyh1bnNpZ25lZCBJRCkgeworICAgIGFzc2VydCgoSUQgJiBNYWNyb0lEQml0KSA9PSAwICYmICJSYW4gb3V0IG9mIHNvdXJjZSBsb2NhdGlvbnMhIik7CisgICAgU291cmNlTG9jYXRpb24gTDsKKyAgICBMLklEID0gSUQ7CisgICAgcmV0dXJuIEw7CisgIH0KKworICBzdGF0aWMgU291cmNlTG9jYXRpb24gZ2V0TWFjcm9Mb2ModW5zaWduZWQgSUQpIHsKKyAgICBhc3NlcnQoKElEICYgTWFjcm9JREJpdCkgPT0gMCAmJiAiUmFuIG91dCBvZiBzb3VyY2UgbG9jYXRpb25zISIpOworICAgIFNvdXJjZUxvY2F0aW9uIEw7CisgICAgTC5JRCA9IE1hY3JvSURCaXQgfCBJRDsKKyAgICByZXR1cm4gTDsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgc291cmNlIGxvY2F0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBvZmZzZXQgZnJvbSB0aGlzCisgIC8vLyBTb3VyY2VMb2NhdGlvbi4KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jV2l0aE9mZnNldChpbnQgT2Zmc2V0KSBjb25zdCB7CisgICAgYXNzZXJ0KCgoZ2V0T2Zmc2V0KCkrT2Zmc2V0KSAmIE1hY3JvSURCaXQpID09IDAgJiYgIm9mZnNldCBvdmVyZmxvdyIpOworICAgIFNvdXJjZUxvY2F0aW9uIEw7CisgICAgTC5JRCA9IElEK09mZnNldDsKKyAgICByZXR1cm4gTDsKKyAgfQorCisgIC8vLyBcYnJpZWYgV2hlbiBhIFNvdXJjZUxvY2F0aW9uIGl0c2VsZiBjYW5ub3QgYmUgdXNlZCwgdGhpcyByZXR1cm5zCisgIC8vLyBhbiAob3BhcXVlKSAzMi1iaXQgaW50ZWdlciBlbmNvZGluZyBmb3IgaXQuCisgIC8vLworICAvLy8gVGhpcyBzaG91bGQgb25seSBiZSBwYXNzZWQgdG8gU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZywgaXQKKyAgLy8vIHNob3VsZCBub3QgYmUgaW5zcGVjdGVkIGRpcmVjdGx5LgorICB1bnNpZ25lZCBnZXRSYXdFbmNvZGluZygpIGNvbnN0IHsgcmV0dXJuIElEOyB9CisKKyAgLy8vIFxicmllZiBUdXJuIGEgcmF3IGVuY29kaW5nIG9mIGEgU291cmNlTG9jYXRpb24gb2JqZWN0IGludG8KKyAgLy8vIGEgcmVhbCBTb3VyY2VMb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBcc2VlIGdldFJhd0VuY29kaW5nLgorICBzdGF0aWMgU291cmNlTG9jYXRpb24gZ2V0RnJvbVJhd0VuY29kaW5nKHVuc2lnbmVkIEVuY29kaW5nKSB7CisgICAgU291cmNlTG9jYXRpb24gWDsKKyAgICBYLklEID0gRW5jb2Rpbmc7CisgICAgcmV0dXJuIFg7CisgIH0KKworICAvLy8gXGJyaWVmIFdoZW4gYSBTb3VyY2VMb2NhdGlvbiBpdHNlbGYgY2Fubm90IGJlIHVzZWQsIHRoaXMgcmV0dXJucworICAvLy8gYW4gKG9wYXF1ZSkgcG9pbnRlciBlbmNvZGluZyBmb3IgaXQuCisgIC8vLworICAvLy8gVGhpcyBzaG91bGQgb25seSBiZSBwYXNzZWQgdG8gU291cmNlTG9jYXRpb246OmdldEZyb21QdHJFbmNvZGluZywgaXQKKyAgLy8vIHNob3VsZCBub3QgYmUgaW5zcGVjdGVkIGRpcmVjdGx5LgorICB2b2lkKiBnZXRQdHJFbmNvZGluZygpIGNvbnN0IHsKKyAgICAvLyBEb3VibGUgY2FzdCB0byBhdm9pZCBhIHdhcm5pbmcgImNhc3QgdG8gcG9pbnRlciBmcm9tIGludGVnZXIgb2YgZGlmZmVyZW50CisgICAgLy8gc2l6ZSIuCisgICAgcmV0dXJuICh2b2lkKikodWludHB0cl90KWdldFJhd0VuY29kaW5nKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFR1cm4gYSBwb2ludGVyIGVuY29kaW5nIG9mIGEgU291cmNlTG9jYXRpb24gb2JqZWN0IGJhY2sKKyAgLy8vIGludG8gYSByZWFsIFNvdXJjZUxvY2F0aW9uLgorICBzdGF0aWMgU291cmNlTG9jYXRpb24gZ2V0RnJvbVB0ckVuY29kaW5nKGNvbnN0IHZvaWQgKkVuY29kaW5nKSB7CisgICAgcmV0dXJuIGdldEZyb21SYXdFbmNvZGluZygodW5zaWduZWQpKHVpbnRwdHJfdClFbmNvZGluZyk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc1BhaXJPZkZpbGVMb2NhdGlvbnMoU291cmNlTG9jYXRpb24gU3RhcnQsIFNvdXJjZUxvY2F0aW9uIEVuZCkgeworICAgIHJldHVybiBTdGFydC5pc1ZhbGlkKCkgJiYgU3RhcnQuaXNGaWxlSUQoKSAmJiBFbmQuaXNWYWxpZCgpICYmCisgICAgICAgICAgIEVuZC5pc0ZpbGVJRCgpOworICB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgcHJpbnRUb1N0cmluZyhjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSkgY29uc3Q7CisgIHZvaWQgZHVtcChjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSkgY29uc3Q7Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNvdXJjZUxvY2F0aW9uICZMSFMsIGNvbnN0IFNvdXJjZUxvY2F0aW9uICZSSFMpIHsKKyAgcmV0dXJuIExIUy5nZXRSYXdFbmNvZGluZygpID09IFJIUy5nZXRSYXdFbmNvZGluZygpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNvdXJjZUxvY2F0aW9uICZMSFMsIGNvbnN0IFNvdXJjZUxvY2F0aW9uICZSSFMpIHsKKyAgcmV0dXJuICEoTEhTID09IFJIUyk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBTb3VyY2VMb2NhdGlvbiAmTEhTLCBjb25zdCBTb3VyY2VMb2NhdGlvbiAmUkhTKSB7CisgIHJldHVybiBMSFMuZ2V0UmF3RW5jb2RpbmcoKSA8IFJIUy5nZXRSYXdFbmNvZGluZygpOworfQorCisvLy8gXGJyaWVmIEEgdHJpdmlhbCB0dXBsZSB1c2VkIHRvIHJlcHJlc2VudCBhIHNvdXJjZSByYW5nZS4KK2NsYXNzIFNvdXJjZVJhbmdlIHsKKyAgU291cmNlTG9jYXRpb24gQjsKKyAgU291cmNlTG9jYXRpb24gRTsKKworcHVibGljOgorICBTb3VyY2VSYW5nZSgpID0gZGVmYXVsdDsKKyAgU291cmNlUmFuZ2UoU291cmNlTG9jYXRpb24gbG9jKSA6IEIobG9jKSwgRShsb2MpIHt9CisgIFNvdXJjZVJhbmdlKFNvdXJjZUxvY2F0aW9uIGJlZ2luLCBTb3VyY2VMb2NhdGlvbiBlbmQpIDogQihiZWdpbiksIEUoZW5kKSB7fQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEJlZ2luKCkgY29uc3QgeyByZXR1cm4gQjsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRFbmQoKSBjb25zdCB7IHJldHVybiBFOyB9CisKKyAgdm9pZCBzZXRCZWdpbihTb3VyY2VMb2NhdGlvbiBiKSB7IEIgPSBiOyB9CisgIHZvaWQgc2V0RW5kKFNvdXJjZUxvY2F0aW9uIGUpIHsgRSA9IGU7IH0KKworICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBCLmlzVmFsaWQoKSAmJiBFLmlzVmFsaWQoKTsgfQorICBib29sIGlzSW52YWxpZCgpIGNvbnN0IHsgcmV0dXJuICFpc1ZhbGlkKCk7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgU291cmNlUmFuZ2UgJlgpIGNvbnN0IHsKKyAgICByZXR1cm4gQiA9PSBYLkIgJiYgRSA9PSBYLkU7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgU291cmNlUmFuZ2UgJlgpIGNvbnN0IHsKKyAgICByZXR1cm4gQiAhPSBYLkIgfHwgRSAhPSBYLkU7CisgIH0KK307CisgIAorLy8vIFxicmllZiBSZXByZXNlbnRzIGEgY2hhcmFjdGVyLWdyYW51bGFyIHNvdXJjZSByYW5nZS4KKy8vLworLy8vIFRoZSB1bmRlcmx5aW5nIFNvdXJjZVJhbmdlIGNhbiBlaXRoZXIgc3BlY2lmeSB0aGUgc3RhcnRpbmcvZW5kaW5nIGNoYXJhY3RlcgorLy8vIG9mIHRoZSByYW5nZSwgb3IgaXQgY2FuIHNwZWNpZnkgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSBhbmQgdGhlIHN0YXJ0IG9mIHRoZQorLy8vIGxhc3QgdG9rZW4gb2YgdGhlIHJhbmdlIChhICJ0b2tlbiByYW5nZSIpLiAgSW4gdGhlIHRva2VuIHJhbmdlIGNhc2UsIHRoZQorLy8vIHNpemUgb2YgdGhlIGxhc3QgdG9rZW4gbXVzdCBiZSBtZWFzdXJlZCB0byBkZXRlcm1pbmUgdGhlIGFjdHVhbCBlbmQgb2YgdGhlCisvLy8gcmFuZ2UuCitjbGFzcyBDaGFyU291cmNlUmFuZ2UgeyAKKyAgU291cmNlUmFuZ2UgUmFuZ2U7CisgIGJvb2wgSXNUb2tlblJhbmdlID0gZmFsc2U7CisKK3B1YmxpYzoKKyAgQ2hhclNvdXJjZVJhbmdlKCkgPSBkZWZhdWx0OworICBDaGFyU291cmNlUmFuZ2UoU291cmNlUmFuZ2UgUiwgYm9vbCBJVFIpIDogUmFuZ2UoUiksIElzVG9rZW5SYW5nZShJVFIpIHt9CisKKyAgc3RhdGljIENoYXJTb3VyY2VSYW5nZSBnZXRUb2tlblJhbmdlKFNvdXJjZVJhbmdlIFIpIHsKKyAgICByZXR1cm4gQ2hhclNvdXJjZVJhbmdlKFIsIHRydWUpOworICB9CisKKyAgc3RhdGljIENoYXJTb3VyY2VSYW5nZSBnZXRDaGFyUmFuZ2UoU291cmNlUmFuZ2UgUikgeworICAgIHJldHVybiBDaGFyU291cmNlUmFuZ2UoUiwgZmFsc2UpOworICB9CisgICAgCisgIHN0YXRpYyBDaGFyU291cmNlUmFuZ2UgZ2V0VG9rZW5SYW5nZShTb3VyY2VMb2NhdGlvbiBCLCBTb3VyY2VMb2NhdGlvbiBFKSB7CisgICAgcmV0dXJuIGdldFRva2VuUmFuZ2UoU291cmNlUmFuZ2UoQiwgRSkpOworICB9CisKKyAgc3RhdGljIENoYXJTb3VyY2VSYW5nZSBnZXRDaGFyUmFuZ2UoU291cmNlTG9jYXRpb24gQiwgU291cmNlTG9jYXRpb24gRSkgeworICAgIHJldHVybiBnZXRDaGFyUmFuZ2UoU291cmNlUmFuZ2UoQiwgRSkpOworICB9CisgIAorICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBlbmQgb2YgdGhpcyByYW5nZSBzcGVjaWZpZXMgdGhlIHN0YXJ0IG9mCisgIC8vLyB0aGUgbGFzdCB0b2tlbi4gIFJldHVybiBmYWxzZSBpZiB0aGUgZW5kIG9mIHRoaXMgcmFuZ2Ugc3BlY2lmaWVzIHRoZSBsYXN0CisgIC8vLyBjaGFyYWN0ZXIgaW4gdGhlIHJhbmdlLgorICBib29sIGlzVG9rZW5SYW5nZSgpIGNvbnN0IHsgcmV0dXJuIElzVG9rZW5SYW5nZTsgfQorICBib29sIGlzQ2hhclJhbmdlKCkgY29uc3QgeyByZXR1cm4gIUlzVG9rZW5SYW5nZTsgfQorICAKKyAgU291cmNlTG9jYXRpb24gZ2V0QmVnaW4oKSBjb25zdCB7IHJldHVybiBSYW5nZS5nZXRCZWdpbigpOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldEVuZCgpIGNvbnN0IHsgcmV0dXJuIFJhbmdlLmdldEVuZCgpOyB9CisgIFNvdXJjZVJhbmdlIGdldEFzUmFuZ2UoKSBjb25zdCB7IHJldHVybiBSYW5nZTsgfQorIAorICB2b2lkIHNldEJlZ2luKFNvdXJjZUxvY2F0aW9uIGIpIHsgUmFuZ2Uuc2V0QmVnaW4oYik7IH0KKyAgdm9pZCBzZXRFbmQoU291cmNlTG9jYXRpb24gZSkgeyBSYW5nZS5zZXRFbmQoZSk7IH0KKyAgCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIFJhbmdlLmlzVmFsaWQoKTsgfQorICBib29sIGlzSW52YWxpZCgpIGNvbnN0IHsgcmV0dXJuICFpc1ZhbGlkKCk7IH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhbiB1bnBhY2tlZCAicHJlc3VtZWQiIGxvY2F0aW9uIHdoaWNoIGNhbiBiZSBwcmVzZW50ZWQKKy8vLyB0byB0aGUgdXNlci4KKy8vLworLy8vIEEgJ3ByZXN1bWVkJyBsb2NhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYnkgXCNsaW5lIGFuZCBHTlUgbGluZSBtYXJrZXIKKy8vLyBkaXJlY3RpdmVzIGFuZCBpcyBhbHdheXMgdGhlIGV4cGFuc2lvbiBwb2ludCBvZiBhIG5vcm1hbCBsb2NhdGlvbi4KKy8vLworLy8vIFlvdSBjYW4gZ2V0IGEgUHJlc3VtZWRMb2MgZnJvbSBhIFNvdXJjZUxvY2F0aW9uIHdpdGggU291cmNlTWFuYWdlci4KK2NsYXNzIFByZXN1bWVkTG9jIHsKKyAgY29uc3QgY2hhciAqRmlsZW5hbWUgPSBudWxscHRyOworICB1bnNpZ25lZCBMaW5lLCBDb2w7CisgIFNvdXJjZUxvY2F0aW9uIEluY2x1ZGVMb2M7CisKK3B1YmxpYzoKKyAgUHJlc3VtZWRMb2MoKSA9IGRlZmF1bHQ7CisgIFByZXN1bWVkTG9jKGNvbnN0IGNoYXIgKkZOLCB1bnNpZ25lZCBMbiwgdW5zaWduZWQgQ28sIFNvdXJjZUxvY2F0aW9uIElMKQorICAgICAgOiBGaWxlbmFtZShGTiksIExpbmUoTG4pLCBDb2woQ28pLCBJbmNsdWRlTG9jKElMKSB7fQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBvYmplY3QgaXMgaW52YWxpZCBvciB1bmluaXRpYWxpemVkLgorICAvLy8KKyAgLy8vIFRoaXMgb2NjdXJzIHdoZW4gY3JlYXRlZCB3aXRoIGludmFsaWQgc291cmNlIGxvY2F0aW9ucyBvciB3aGVuIHdhbGtpbmcKKyAgLy8vIG9mZiB0aGUgdG9wIG9mIGEgXCNpbmNsdWRlIHN0YWNrLgorICBib29sIGlzSW52YWxpZCgpIGNvbnN0IHsgcmV0dXJuIEZpbGVuYW1lID09IG51bGxwdHI7IH0KKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gRmlsZW5hbWUgIT0gbnVsbHB0cjsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBwcmVzdW1lZCBmaWxlbmFtZSBvZiB0aGlzIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgY2FuIGJlIGFmZmVjdGVkIGJ5IFwjbGluZSBldGMuCisgIGNvbnN0IGNoYXIgKmdldEZpbGVuYW1lKCkgY29uc3QgeworICAgIGFzc2VydChpc1ZhbGlkKCkpOworICAgIHJldHVybiBGaWxlbmFtZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBwcmVzdW1lZCBsaW5lIG51bWJlciBvZiB0aGlzIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgY2FuIGJlIGFmZmVjdGVkIGJ5IFwjbGluZSBldGMuCisgIHVuc2lnbmVkIGdldExpbmUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzVmFsaWQoKSk7CisgICAgcmV0dXJuIExpbmU7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgcHJlc3VtZWQgY29sdW1uIG51bWJlciBvZiB0aGlzIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgY2Fubm90IGJlIGFmZmVjdGVkIGJ5IFwjbGluZSwgYnV0IGlzIHBhY2thZ2VkIGhlcmUgZm9yIGNvbnZlbmllbmNlLgorICB1bnNpZ25lZCBnZXRDb2x1bW4oKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzVmFsaWQoKSk7CisgICAgcmV0dXJuIENvbDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBwcmVzdW1lZCBpbmNsdWRlIGxvY2F0aW9uIG9mIHRoaXMgbG9jYXRpb24uCisgIC8vLworICAvLy8gVGhpcyBjYW4gYmUgYWZmZWN0ZWQgYnkgR05VIGxpbmVtYXJrZXIgZGlyZWN0aXZlcy4KKyAgU291cmNlTG9jYXRpb24gZ2V0SW5jbHVkZUxvYygpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNWYWxpZCgpKTsKKyAgICByZXR1cm4gSW5jbHVkZUxvYzsKKyAgfQorfTsKKworY2xhc3MgRmlsZUVudHJ5OworCisvLy8gXGJyaWVmIEEgU291cmNlTG9jYXRpb24gYW5kIGl0cyBhc3NvY2lhdGVkIFNvdXJjZU1hbmFnZXIuCisvLy8KKy8vLyBUaGlzIGlzIHVzZWZ1bCBmb3IgYXJndW1lbnQgcGFzc2luZyB0byBmdW5jdGlvbnMgdGhhdCBleHBlY3QgYm90aCBvYmplY3RzLgorY2xhc3MgRnVsbFNvdXJjZUxvYyA6IHB1YmxpYyBTb3VyY2VMb2NhdGlvbiB7CisgIGNvbnN0IFNvdXJjZU1hbmFnZXIgKlNyY01nciA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGEgRnVsbFNvdXJjZUxvYyB3aGVyZSBpc1ZhbGlkKCkgcmV0dXJucyBcYyBmYWxzZS4KKyAgRnVsbFNvdXJjZUxvYygpID0gZGVmYXVsdDsKKworICBleHBsaWNpdCBGdWxsU291cmNlTG9jKFNvdXJjZUxvY2F0aW9uIExvYywgY29uc3QgU291cmNlTWFuYWdlciAmU00pCisgICAgICA6IFNvdXJjZUxvY2F0aW9uKExvYyksIFNyY01ncigmU00pIHt9CisKKyAgYm9vbCBoYXNNYW5hZ2VyKCkgY29uc3QgeworICAgICAgYm9vbCBoYXNTcmNNZ3IgPSAgU3JjTWdyICE9IG51bGxwdHI7CisgICAgICBhc3NlcnQoaGFzU3JjTWdyID09IGlzVmFsaWQoKSAmJiAiRnVsbFNvdXJjZUxvYyBoYXMgbG9jYXRpb24gYnV0IG5vIG1hbmFnZXIiKTsKKyAgICAgIHJldHVybiBoYXNTcmNNZ3I7CisgIH0KKworICAvLy8gXHByZSBUaGlzIEZ1bGxTb3VyY2VMb2MgaGFzIGFuIGFzc29jaWF0ZWQgU291cmNlTWFuYWdlci4KKyAgY29uc3QgU291cmNlTWFuYWdlciAmZ2V0TWFuYWdlcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoU3JjTWdyICYmICJTb3VyY2VNYW5hZ2VyIGlzIE5VTEwuIik7CisgICAgcmV0dXJuICpTcmNNZ3I7CisgIH0KKworICBGaWxlSUQgZ2V0RmlsZUlEKCkgY29uc3Q7CisKKyAgRnVsbFNvdXJjZUxvYyBnZXRFeHBhbnNpb25Mb2MoKSBjb25zdDsKKyAgRnVsbFNvdXJjZUxvYyBnZXRTcGVsbGluZ0xvYygpIGNvbnN0OworICBGdWxsU291cmNlTG9jIGdldEZpbGVMb2MoKSBjb25zdDsKKyAgc3RkOjpwYWlyPEZ1bGxTb3VyY2VMb2MsIEZ1bGxTb3VyY2VMb2M+IGdldEltbWVkaWF0ZUV4cGFuc2lvblJhbmdlKCkgY29uc3Q7CisgIFByZXN1bWVkTG9jIGdldFByZXN1bWVkTG9jKGJvb2wgVXNlTGluZURpcmVjdGl2ZXMgPSB0cnVlKSBjb25zdDsKKyAgYm9vbCBpc01hY3JvQXJnRXhwYW5zaW9uKEZ1bGxTb3VyY2VMb2MgKlN0YXJ0TG9jID0gbnVsbHB0cikgY29uc3Q7CisgIEZ1bGxTb3VyY2VMb2MgZ2V0SW1tZWRpYXRlTWFjcm9DYWxsZXJMb2MoKSBjb25zdDsKKyAgc3RkOjpwYWlyPEZ1bGxTb3VyY2VMb2MsIFN0cmluZ1JlZj4gZ2V0TW9kdWxlSW1wb3J0TG9jKCkgY29uc3Q7CisgIHVuc2lnbmVkIGdldEZpbGVPZmZzZXQoKSBjb25zdDsKKworICB1bnNpZ25lZCBnZXRFeHBhbnNpb25MaW5lTnVtYmVyKGJvb2wgKkludmFsaWQgPSBudWxscHRyKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0RXhwYW5zaW9uQ29sdW1uTnVtYmVyKGJvb2wgKkludmFsaWQgPSBudWxscHRyKSBjb25zdDsKKworICB1bnNpZ25lZCBnZXRTcGVsbGluZ0xpbmVOdW1iZXIoYm9vbCAqSW52YWxpZCA9IG51bGxwdHIpIGNvbnN0OworICB1bnNpZ25lZCBnZXRTcGVsbGluZ0NvbHVtbk51bWJlcihib29sICpJbnZhbGlkID0gbnVsbHB0cikgY29uc3Q7CisKKyAgY29uc3QgY2hhciAqZ2V0Q2hhcmFjdGVyRGF0YShib29sICpJbnZhbGlkID0gbnVsbHB0cikgY29uc3Q7CisKKyAgdW5zaWduZWQgZ2V0TGluZU51bWJlcihib29sICpJbnZhbGlkID0gbnVsbHB0cikgY29uc3Q7CisgIHVuc2lnbmVkIGdldENvbHVtbk51bWJlcihib29sICpJbnZhbGlkID0gbnVsbHB0cikgY29uc3Q7CisKKyAgc3RkOjpwYWlyPEZ1bGxTb3VyY2VMb2MsIEZ1bGxTb3VyY2VMb2M+IGdldEV4cGFuc2lvblJhbmdlKCkgY29uc3Q7CisKKyAgY29uc3QgRmlsZUVudHJ5ICpnZXRGaWxlRW50cnkoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiBhIFN0cmluZ1JlZiB0byB0aGUgc291cmNlIGJ1ZmZlciBkYXRhIGZvciB0aGUKKyAgLy8vIHNwZWNpZmllZCBGaWxlSUQuCisgIFN0cmluZ1JlZiBnZXRCdWZmZXJEYXRhKGJvb2wgKkludmFsaWQgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERlY29tcG9zZSB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGludG8gYSByYXcgRmlsZUlEICsgT2Zmc2V0IHBhaXIuCisgIC8vLworICAvLy8gVGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIEZpbGVJRCwgdGhlIHNlY29uZCBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlCisgIC8vLyBzdGFydCBvZiB0aGUgYnVmZmVyIG9mIHRoZSBsb2NhdGlvbi4KKyAgc3RkOjpwYWlyPEZpbGVJRCwgdW5zaWduZWQ+IGdldERlY29tcG9zZWRMb2MoKSBjb25zdDsKKworICBib29sIGlzSW5TeXN0ZW1IZWFkZXIoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZXMgdGhlIG9yZGVyIG9mIDIgc291cmNlIGxvY2F0aW9ucyBpbiB0aGUgdHJhbnNsYXRpb24gdW5pdC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoaXMgc291cmNlIGxvY2F0aW9uIGNvbWVzIGJlZm9yZSAnTG9jJywgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGlzQmVmb3JlSW5UcmFuc2xhdGlvblVuaXRUaGFuKFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHRoZSBvcmRlciBvZiAyIHNvdXJjZSBsb2NhdGlvbnMgaW4gdGhlIHRyYW5zbGF0aW9uIHVuaXQuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGlzIHNvdXJjZSBsb2NhdGlvbiBjb21lcyBiZWZvcmUgJ0xvYycsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBpc0JlZm9yZUluVHJhbnNsYXRpb25Vbml0VGhhbihGdWxsU291cmNlTG9jIExvYykgY29uc3QgeworICAgIGFzc2VydChMb2MuaXNWYWxpZCgpKTsKKyAgICBhc3NlcnQoU3JjTWdyID09IExvYy5TcmNNZ3IgJiYgIkxvYyBjb21lcyBmcm9tIGFub3RoZXIgU291cmNlTWFuYWdlciEiKTsKKyAgICByZXR1cm4gaXNCZWZvcmVJblRyYW5zbGF0aW9uVW5pdFRoYW4oKFNvdXJjZUxvY2F0aW9uKUxvYyk7CisgIH0KKworICAvLy8gXGJyaWVmIENvbXBhcmlzb24gZnVuY3Rpb24gY2xhc3MsIHVzZWZ1bCBmb3Igc29ydGluZyBGdWxsU291cmNlTG9jcy4KKyAgc3RydWN0IEJlZm9yZVRoYW5Db21wYXJlIHsKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgRnVsbFNvdXJjZUxvYyYgbGhzLCBjb25zdCBGdWxsU291cmNlTG9jJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBsaHMuaXNCZWZvcmVJblRyYW5zbGF0aW9uVW5pdFRoYW4ocmhzKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFxicmllZiBQcmludHMgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBGdWxsU291cmNlTG9jIHRvIHN0ZGVyci4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nLgorICB2b2lkIGR1bXAoKSBjb25zdDsKKworICBmcmllbmQgYm9vbAorICBvcGVyYXRvcj09KGNvbnN0IEZ1bGxTb3VyY2VMb2MgJkxIUywgY29uc3QgRnVsbFNvdXJjZUxvYyAmUkhTKSB7CisgICAgcmV0dXJuIExIUy5nZXRSYXdFbmNvZGluZygpID09IFJIUy5nZXRSYXdFbmNvZGluZygpICYmCisgICAgICAgICAgTEhTLlNyY01nciA9PSBSSFMuU3JjTWdyOworICB9CisKKyAgZnJpZW5kIGJvb2wKKyAgb3BlcmF0b3IhPShjb25zdCBGdWxsU291cmNlTG9jICZMSFMsIGNvbnN0IEZ1bGxTb3VyY2VMb2MgJlJIUykgeworICAgIHJldHVybiAhKExIUyA9PSBSSFMpOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCituYW1lc3BhY2UgbGx2bSB7CisKKyAgLy8vIERlZmluZSBEZW5zZU1hcEluZm8gc28gdGhhdCBGaWxlSUQncyBjYW4gYmUgdXNlZCBhcyBrZXlzIGluIERlbnNlTWFwIGFuZAorICAvLy8gRGVuc2VTZXRzLgorICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgRGVuc2VNYXBJbmZvPGNsYW5nOjpGaWxlSUQ+IHsKKyAgICBzdGF0aWMgY2xhbmc6OkZpbGVJRCBnZXRFbXB0eUtleSgpIHsKKyAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhbmc6OkZpbGVJRCBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgICByZXR1cm4gY2xhbmc6OkZpbGVJRDo6Z2V0U2VudGluZWwoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNsYW5nOjpGaWxlSUQgUykgeworICAgICAgcmV0dXJuIFMuZ2V0SGFzaFZhbHVlKCk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNFcXVhbChjbGFuZzo6RmlsZUlEIExIUywgY2xhbmc6OkZpbGVJRCBSSFMpIHsKKyAgICAgIHJldHVybiBMSFMgPT0gUkhTOworICAgIH0KKyAgfTsKKyAgCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBpc1BvZExpa2U8Y2xhbmc6OlNvdXJjZUxvY2F0aW9uPiB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKyAgdGVtcGxhdGUgPD4KKyAgc3RydWN0IGlzUG9kTGlrZTxjbGFuZzo6RmlsZUlEPiB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICAvLyBUZWFjaCBTbWFsbFB0clNldCBob3cgdG8gaGFuZGxlIFNvdXJjZUxvY2F0aW9uLgorICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBQb2ludGVyTGlrZVR5cGVUcmFpdHM8Y2xhbmc6OlNvdXJjZUxvY2F0aW9uPiB7CisgICAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSAwIH07CisKKyAgICBzdGF0aWMgdm9pZCAqZ2V0QXNWb2lkUG9pbnRlcihjbGFuZzo6U291cmNlTG9jYXRpb24gTCkgeworICAgICAgcmV0dXJuIEwuZ2V0UHRyRW5jb2RpbmcoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhbmc6OlNvdXJjZUxvY2F0aW9uIGdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7CisgICAgICByZXR1cm4gY2xhbmc6OlNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoKHVuc2lnbmVkKSh1aW50cHRyX3QpUCk7CisgICAgfQorICB9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0JBU0lDX1NPVVJDRUxPQ0FUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1NvdXJjZU1hbmFnZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1NvdXJjZU1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzYwMWI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oCkBAIC0wLDAgKzEsMTc4MSBAQAorLy89PT0tIFNvdXJjZU1hbmFnZXIuaCAtIFRyYWNrIGFuZCBjYWNoZSBzb3VyY2UgZmlsZXMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgU291cmNlTWFuYWdlciBpbnRlcmZhY2UuCisvLy8KKy8vLyBUaGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IHR5cGVzIG9mIGxvY2F0aW9ucyBpbiBhICVmaWxlOiBhIHNwZWxsaW5nCisvLy8gbG9jYXRpb24sIGFuIGV4cGFuc2lvbiBsb2NhdGlvbiwgYW5kIGEgcHJlc3VtZWQgbG9jYXRpb24uCisvLy8KKy8vLyBHaXZlbiBhbiBleGFtcGxlIG9mOgorLy8vIFxjb2RlCisvLy8gI2RlZmluZSBtaW4oeCwgeSkgeCA8IHkgPyB4IDogeQorLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBhbmQgdGhlbiBsYXRlciBvbiBhIHVzZSBvZiBtaW46CisvLy8gXGNvZGUKKy8vLyAjbGluZSAxNworLy8vIHJldHVybiBtaW4oYSwgYik7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoZSBleHBhbnNpb24gbG9jYXRpb24gaXMgdGhlIGxpbmUgaW4gdGhlIHNvdXJjZSBjb2RlIHdoZXJlIHRoZSBtYWNybworLy8vIHdhcyBleHBhbmRlZCAodGhlIHJldHVybiBzdGF0ZW1lbnQpLCB0aGUgc3BlbGxpbmcgbG9jYXRpb24gaXMgdGhlCisvLy8gbG9jYXRpb24gaW4gdGhlIHNvdXJjZSB3aGVyZSB0aGUgbWFjcm8gd2FzIG9yaWdpbmFsbHkgZGVmaW5lZCwKKy8vLyBhbmQgdGhlIHByZXN1bWVkIGxvY2F0aW9uIGlzIHdoZXJlIHRoZSBsaW5lIGRpcmVjdGl2ZSBzdGF0ZXMgdGhhdAorLy8vIHRoZSBsaW5lIGlzIDE3LCBvciBhbnkgb3RoZXIgbGluZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfU09VUkNFTUFOQUdFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfU09VUkNFTUFOQUdFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9GaWxlTWFuYWdlci5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBU1RSZWFkZXI7CitjbGFzcyBBU1RXcml0ZXI7CitjbGFzcyBEaWFnbm9zdGljc0VuZ2luZTsKK2NsYXNzIExpbmVUYWJsZUluZm87CitjbGFzcyBTb3VyY2VNYW5hZ2VyOworCisvLy8gXGJyaWVmIFB1YmxpYyBlbnVtcyBhbmQgcHJpdmF0ZSBjbGFzc2VzIHRoYXQgYXJlIHBhcnQgb2YgdGhlCisvLy8gU291cmNlTWFuYWdlciBpbXBsZW1lbnRhdGlvbi4KK25hbWVzcGFjZSBTcmNNZ3IgeworCisgIC8vLyBcYnJpZWYgSW5kaWNhdGVzIHdoZXRoZXIgYSBmaWxlIG9yIGRpcmVjdG9yeSBob2xkcyBub3JtYWwgdXNlciBjb2RlLAorICAvLy8gc3lzdGVtIGNvZGUsIG9yIHN5c3RlbSBjb2RlIHdoaWNoIGlzIGltcGxpY2l0bHkgJ2V4dGVybiAiQyInIGluIEMrKyBtb2RlLgorICAvLy8KKyAgLy8vIEVudGlyZSBkaXJlY3RvcmllcyBjYW4gYmUgdGFnZ2VkIHdpdGggdGhpcyAodGhpcyBpcyBtYWludGFpbmVkIGJ5CisgIC8vLyBEaXJlY3RvcnlMb29rdXAgYW5kIGZyaWVuZHMpIGFzIGNhbiBzcGVjaWZpYyBGaWxlSW5mb3Mgd2hlbiBhIFwjcHJhZ21hCisgIC8vLyBzeXN0ZW1faGVhZGVyIGlzIHNlZW4gb3IgaW4gdmFyaW91cyBvdGhlciBjYXNlcy4KKyAgLy8vCisgIGVudW0gQ2hhcmFjdGVyaXN0aWNLaW5kIHsKKyAgICBDX1VzZXIsIENfU3lzdGVtLCBDX0V4dGVybkNTeXN0ZW0sIENfVXNlcl9Nb2R1bGVNYXAsIENfU3lzdGVtX01vZHVsZU1hcAorICB9OworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciBhIGZpbGUgLyBkaXJlY3RvcnkgY2hhcmFjdGVyaXN0aWMgaXMgZm9yIHN5c3RlbSBjb2RlLgorICBpbmxpbmUgYm9vbCBpc1N5c3RlbShDaGFyYWN0ZXJpc3RpY0tpbmQgQ0spIHsKKyAgICByZXR1cm4gQ0sgIT0gQ19Vc2VyICYmIENLICE9IENfVXNlcl9Nb2R1bGVNYXA7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYSBmaWxlIGNoYXJhY3RlcmlzdGljIGlzIGZvciBhIG1vZHVsZSBtYXAuCisgIGlubGluZSBib29sIGlzTW9kdWxlTWFwKENoYXJhY3RlcmlzdGljS2luZCBDSykgeworICAgIHJldHVybiBDSyA9PSBDX1VzZXJfTW9kdWxlTWFwIHx8IENLID09IENfU3lzdGVtX01vZHVsZU1hcDsKKyAgfQorCisgIC8vLyBcYnJpZWYgT25lIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0IGlzIGtlcHQgZm9yIGV2ZXJ5IGZpbGUgbG9hZGVkIG9yIHVzZWQuCisgIC8vLworICAvLy8gVGhpcyBvYmplY3Qgb3ducyB0aGUgTWVtb3J5QnVmZmVyIG9iamVjdC4KKyAgY2xhc3MgTExWTV9BTElHTkFTKDgpIENvbnRlbnRDYWNoZSB7CisgICAgZW51bSBDQ0ZsYWdzIHsKKyAgICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgYnVmZmVyIGlzIGludmFsaWQuCisgICAgICBJbnZhbGlkRmxhZyA9IDB4MDEsCisKKyAgICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgYnVmZmVyIHNob3VsZCBub3QgYmUgZnJlZWQgb24gZGVzdHJ1Y3Rpb24uCisgICAgICBEb05vdEZyZWVGbGFnID0gMHgwMgorICAgIH07CisKKyAgICAvLy8gXGJyaWVmIFRoZSBhY3R1YWwgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlcnMgZnJvbSB0aGUgaW5wdXQKKyAgICAvLy8gZmlsZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyBvd25lZCBieSB0aGUgQ29udGVudENhY2hlIG9iamVjdC4gIFRoZSBiaXRzIGluZGljYXRlCisgICAgLy8vIHdoZXRoZXIgdGhlIGJ1ZmZlciBpcyBpbnZhbGlkLgorICAgIG11dGFibGUgbGx2bTo6UG9pbnRlckludFBhaXI8bGx2bTo6TWVtb3J5QnVmZmVyICosIDI+IEJ1ZmZlcjsKKworICBwdWJsaWM6CisgICAgLy8vIFxicmllZiBSZWZlcmVuY2UgdG8gdGhlIGZpbGUgZW50cnkgcmVwcmVzZW50aW5nIHRoaXMgQ29udGVudENhY2hlLgorICAgIC8vLworICAgIC8vLyBUaGlzIHJlZmVyZW5jZSBkb2VzIG5vdCBvd24gdGhlIEZpbGVFbnRyeSBvYmplY3QuCisgICAgLy8vCisgICAgLy8vIEl0IGlzIHBvc3NpYmxlIGZvciB0aGlzIHRvIGJlIE5VTEwgaWYgdGhlIENvbnRlbnRDYWNoZSBlbmNhcHN1bGF0ZXMKKyAgICAvLy8gYW4gaW1hZ2luYXJ5IHRleHQgYnVmZmVyLgorICAgIGNvbnN0IEZpbGVFbnRyeSAqT3JpZ0VudHJ5OworCisgICAgLy8vIFxicmllZiBSZWZlcmVuY2VzIHRoZSBmaWxlIHdoaWNoIHRoZSBjb250ZW50cyB3ZXJlIGFjdHVhbGx5IGxvYWRlZCBmcm9tLgorICAgIC8vLworICAgIC8vLyBDYW4gYmUgZGlmZmVyZW50IGZyb20gJ0VudHJ5JyBpZiB3ZSBvdmVycmlkZGVuIHRoZSBjb250ZW50cyBvZiBvbmUgZmlsZQorICAgIC8vLyB3aXRoIHRoZSBjb250ZW50cyBvZiBhbm90aGVyIGZpbGUuCisgICAgY29uc3QgRmlsZUVudHJ5ICpDb250ZW50c0VudHJ5OworCisgICAgLy8vIFxicmllZiBBIGJ1bXAgcG9pbnRlciBhbGxvY2F0ZWQgYXJyYXkgb2Ygb2Zmc2V0cyBmb3IgZWFjaCBzb3VyY2UgbGluZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyBsYXppbHkgY29tcHV0ZWQuICBUaGlzIGlzIG93bmVkIGJ5IHRoZSBTb3VyY2VNYW5hZ2VyCisgICAgLy8vIEJ1bXBQb2ludGVyQWxsb2NhdG9yIG9iamVjdC4KKyAgICB1bnNpZ25lZCAqU291cmNlTGluZUNhY2hlID0gbnVsbHB0cjsKKworICAgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGlzIENvbnRlbnRDYWNoZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyBvbmx5IHZhbGlkIGlmIFNvdXJjZUxpbmVDYWNoZSBpcyBub24tbnVsbC4KKyAgICB1bnNpZ25lZCBOdW1MaW5lcyA9IDA7CisKKyAgICAvLy8gXGJyaWVmIEluZGljYXRlcyB3aGV0aGVyIHRoZSBidWZmZXIgaXRzZWxmIHdhcyBwcm92aWRlZCB0byBvdmVycmlkZQorICAgIC8vLyB0aGUgYWN0dWFsIGZpbGUgY29udGVudHMuCisgICAgLy8vCisgICAgLy8vIFdoZW4gdHJ1ZSwgdGhlIG9yaWdpbmFsIGVudHJ5IG1heSBiZSBhIHZpcnR1YWwgZmlsZSB0aGF0IGRvZXMgbm90CisgICAgLy8vIGV4aXN0LgorICAgIHVuc2lnbmVkIEJ1ZmZlck92ZXJyaWRkZW4gOiAxOworCisgICAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgY29udGVudCBjYWNoZSB3YXMgaW5pdGlhbGx5IGNyZWF0ZWQgZm9yIGEgc291cmNlCisgICAgLy8vIGZpbGUgY29uc2lkZXJlZCBhcyBhIHN5c3RlbSBvbmUuCisgICAgdW5zaWduZWQgSXNTeXN0ZW1GaWxlIDogMTsKKworICAgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGlzIGZpbGUgbWF5IGJlIHRyYW5zaWVudCwgdGhhdCBpcywgaWYgaXQgbWlnaHQgbm90CisgICAgLy8vIGV4aXN0IGF0IHNvbWUgbGF0ZXIgcG9pbnQgaW4gdGltZSB3aGVuIHRoaXMgY29udGVudCBlbnRyeSBpcyB1c2VkLAorICAgIC8vLyBhZnRlciBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24uCisgICAgdW5zaWduZWQgSXNUcmFuc2llbnQgOiAxOworCisgICAgQ29udGVudENhY2hlKGNvbnN0IEZpbGVFbnRyeSAqRW50ID0gbnVsbHB0cikgOiBDb250ZW50Q2FjaGUoRW50LCBFbnQpIHt9CisKKyAgICBDb250ZW50Q2FjaGUoY29uc3QgRmlsZUVudHJ5ICpFbnQsIGNvbnN0IEZpbGVFbnRyeSAqY29udGVudEVudCkKKyAgICAgIDogQnVmZmVyKG51bGxwdHIsIGZhbHNlKSwgT3JpZ0VudHJ5KEVudCksIENvbnRlbnRzRW50cnkoY29udGVudEVudCksCisgICAgICAgIEJ1ZmZlck92ZXJyaWRkZW4oZmFsc2UpLCBJc1N5c3RlbUZpbGUoZmFsc2UpLCBJc1RyYW5zaWVudChmYWxzZSkge30KKyAgICAKKyAgICAvLy8gVGhlIGNvcHkgY3RvciBkb2VzIG5vdCBhbGxvdyBjb3BpZXMgd2hlcmUgc291cmNlIG9iamVjdCBoYXMgZWl0aGVyCisgICAgLy8vIGEgbm9uLU5VTEwgQnVmZmVyIG9yIFNvdXJjZUxpbmVDYWNoZS4gIE93bmVyc2hpcCBvZiBhbGxvY2F0ZWQgbWVtb3J5CisgICAgLy8vIGlzIG5vdCB0cmFuc2ZlcnJlZCwgc28gdGhpcyBpcyBhIGxvZ2ljYWwgZXJyb3IuCisgICAgQ29udGVudENhY2hlKGNvbnN0IENvbnRlbnRDYWNoZSAmUkhTKQorICAgICAgOiBCdWZmZXIobnVsbHB0ciwgZmFsc2UpLCBCdWZmZXJPdmVycmlkZGVuKGZhbHNlKSwgSXNTeXN0ZW1GaWxlKGZhbHNlKSwKKyAgICAgICAgSXNUcmFuc2llbnQoZmFsc2UpIHsKKyAgICAgIE9yaWdFbnRyeSA9IFJIUy5PcmlnRW50cnk7CisgICAgICBDb250ZW50c0VudHJ5ID0gUkhTLkNvbnRlbnRzRW50cnk7CisKKyAgICAgIGFzc2VydChSSFMuQnVmZmVyLmdldFBvaW50ZXIoKSA9PSBudWxscHRyICYmCisgICAgICAgICAgICAgUkhTLlNvdXJjZUxpbmVDYWNoZSA9PSBudWxscHRyICYmCisgICAgICAgICAgICAgIlBhc3NlZCBDb250ZW50Q2FjaGUgb2JqZWN0IGNhbm5vdCBvd24gYSBidWZmZXIuIik7CisKKyAgICAgIE51bUxpbmVzID0gUkhTLk51bUxpbmVzOworICAgIH0KKworICAgIENvbnRlbnRDYWNoZSAmb3BlcmF0b3I9KGNvbnN0IENvbnRlbnRDYWNoZSYgUkhTKSA9IGRlbGV0ZTsKKworICAgIH5Db250ZW50Q2FjaGUoKTsKKworICAgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbWVtb3J5IGJ1ZmZlciBmb3IgdGhlIGFzc29jaWF0ZWQgY29udGVudC4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIERpYWcgT2JqZWN0IHRocm91Z2ggd2hpY2ggZGlhZ25vc3RpY3Mgd2lsbCBiZSBlbWl0dGVkIGlmIHRoZQorICAgIC8vLyAgIGJ1ZmZlciBjYW5ub3QgYmUgcmV0cmlldmVkLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gTG9jIElmIHNwZWNpZmllZCwgaXMgdGhlIGxvY2F0aW9uIHRoYXQgaW52YWxpZCBmaWxlIGRpYWdub3N0aWNzCisgICAgLy8vICAgd2lsbCBiZSBlbWl0dGVkIGF0LgorICAgIC8vLworICAgIC8vLyBccGFyYW0gSW52YWxpZCBJZiBub24tTlVMTCwgd2lsbCBiZSBzZXQgXGMgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAgICBsbHZtOjpNZW1vcnlCdWZmZXIgKmdldEJ1ZmZlcihEaWFnbm9zdGljc0VuZ2luZSAmRGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MgPSBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKkludmFsaWQgPSBudWxscHRyKSBjb25zdDsKKworICAgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgY29udGVudCBlbmNhcHN1bGF0ZWQgYnkgdGhpcworICAgIC8vLyBDb250ZW50Q2FjaGUuCisgICAgLy8vCisgICAgLy8vIFRoaXMgY2FuIGJlIHRoZSBzaXplIG9mIHRoZSBzb3VyY2UgZmlsZSBvciB0aGUgc2l6ZSBvZiBhbgorICAgIC8vLyBhcmJpdHJhcnkgc2NyYXRjaCBidWZmZXIuICBJZiB0aGUgQ29udGVudENhY2hlIGVuY2Fwc3VsYXRlcyBhIHNvdXJjZQorICAgIC8vLyBmaWxlIHRoaXMgc2l6ZSBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgZmlsZSdzIEZpbGVFbnRyeS4KKyAgICB1bnNpZ25lZCBnZXRTaXplKCkgY29uc3Q7CisKKyAgICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBtYXBwZWQgZm9yIHRoaXMKKyAgICAvLy8gQ29udGVudENhY2hlLgorICAgIC8vLworICAgIC8vLyBUaGlzIGNhbiBiZSAwIGlmIHRoZSBNZW1CdWZmZXIgd2FzIG5vdCBhY3R1YWxseSBleHBhbmRlZC4KKyAgICB1bnNpZ25lZCBnZXRTaXplQnl0ZXNNYXBwZWQoKSBjb25zdDsKKworICAgIC8vLyBSZXR1cm5zIHRoZSBraW5kIG9mIG1lbW9yeSB1c2VkIHRvIGJhY2sgdGhlIG1lbW9yeSBidWZmZXIgZm9yCisgICAgLy8vIHRoaXMgY29udGVudCBjYWNoZS4gIFRoaXMgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UgYW5hbHlzaXMuCisgICAgbGx2bTo6TWVtb3J5QnVmZmVyOjpCdWZmZXJLaW5kIGdldE1lbW9yeUJ1ZmZlcktpbmQoKSBjb25zdDsKKworICAgIC8vLyBcYnJpZWYgR2V0IHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciwgcmV0dXJuaW5nIE5VTEwgaWYgdGhlIGJ1ZmZlciBpcyBub3QKKyAgICAvLy8geWV0IGF2YWlsYWJsZS4KKyAgICBsbHZtOjpNZW1vcnlCdWZmZXIgKmdldFJhd0J1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIEJ1ZmZlci5nZXRQb2ludGVyKCk7IH0KKworICAgIC8vLyBcYnJpZWYgUmVwbGFjZSB0aGUgZXhpc3RpbmcgYnVmZmVyICh3aGljaCB3aWxsIGJlIGRlbGV0ZWQpCisgICAgLy8vIHdpdGggdGhlIGdpdmVuIGJ1ZmZlci4KKyAgICB2b2lkIHJlcGxhY2VCdWZmZXIobGx2bTo6TWVtb3J5QnVmZmVyICpCLCBib29sIERvTm90RnJlZSA9IGZhbHNlKTsKKworICAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGJ1ZmZlciBpdHNlbGYgaXMgaW52YWxpZC4KKyAgICBib29sIGlzQnVmZmVySW52YWxpZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBCdWZmZXIuZ2V0SW50KCkgJiBJbnZhbGlkRmxhZzsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBidWZmZXIgc2hvdWxkIGJlIGZyZWVkLgorICAgIGJvb2wgc2hvdWxkRnJlZUJ1ZmZlcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoQnVmZmVyLmdldEludCgpICYgRG9Ob3RGcmVlRmxhZykgPT0gMDsKKyAgICB9CisgIH07CisKKyAgLy8gQXNzZXJ0IHRoYXQgdGhlIFxjIENvbnRlbnRDYWNoZSBvYmplY3RzIHdpbGwgYWx3YXlzIGJlIDgtYnl0ZSBhbGlnbmVkIHNvCisgIC8vIHRoYXQgd2UgY2FuIHBhY2sgMyBiaXRzIG9mIGludGVnZXIgaW50byBwb2ludGVycyB0byBzdWNoIG9iamVjdHMuCisgIHN0YXRpY19hc3NlcnQoYWxpZ25vZihDb250ZW50Q2FjaGUpID49IDgsCisgICAgICAgICAgICAgICAgIkNvbnRlbnRDYWNoZSBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiIpOworCisgIC8vLyBcYnJpZWYgSW5mb3JtYXRpb24gYWJvdXQgYSBGaWxlSUQsIGJhc2ljYWxseSBqdXN0IHRoZSBsb2dpY2FsIGZpbGUKKyAgLy8vIHRoYXQgaXQgcmVwcmVzZW50cyBhbmQgaW5jbHVkZSBzdGFjayBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIC8vLyBFYWNoIEZpbGVJbmZvIGhhcyBpbmNsdWRlIHN0YWNrIGluZm9ybWF0aW9uLCBpbmRpY2F0aW5nIHdoZXJlIGl0IGNhbWUKKyAgLy8vIGZyb20uIFRoaXMgaW5mb3JtYXRpb24gZW5jb2RlcyB0aGUgXCNpbmNsdWRlIGNoYWluIHRoYXQgYSB0b2tlbiB3YXMKKyAgLy8vIGV4cGFuZGVkIGZyb20uIFRoZSBtYWluIGluY2x1ZGUgZmlsZSBoYXMgYW4gaW52YWxpZCBJbmNsdWRlTG9jLgorICAvLy8KKyAgLy8vIEZpbGVJbmZvcyBjb250YWluIGEgIkNvbnRlbnRDYWNoZSAqIiwgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUuCisgIC8vLworICBjbGFzcyBGaWxlSW5mbyB7CisgICAgZnJpZW5kIGNsYXNzIGNsYW5nOjpTb3VyY2VNYW5hZ2VyOworICAgIGZyaWVuZCBjbGFzcyBjbGFuZzo6QVNUV3JpdGVyOworICAgIGZyaWVuZCBjbGFzcyBjbGFuZzo6QVNUUmVhZGVyOworCisgICAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIFwjaW5jbHVkZSB0aGF0IGJyb3VnaHQgaW4gdGhpcyBmaWxlLgorICAgIC8vLworICAgIC8vLyBUaGlzIGlzIGFuIGludmFsaWQgU0xPQyBmb3IgdGhlIG1haW4gZmlsZSAodG9wIG9mIHRoZSBcI2luY2x1ZGUgY2hhaW4pLgorICAgIHVuc2lnbmVkIEluY2x1ZGVMb2M7ICAvLyBSZWFsbHkgYSBTb3VyY2VMb2NhdGlvbgorCisgICAgLy8vIFxicmllZiBOdW1iZXIgb2YgRmlsZUlEcyAoZmlsZXMgYW5kIG1hY3JvcykgdGhhdCB3ZXJlIGNyZWF0ZWQgZHVyaW5nCisgICAgLy8vIHByZXByb2Nlc3Npbmcgb2YgdGhpcyBcI2luY2x1ZGUsIGluY2x1ZGluZyB0aGlzIFNMb2NFbnRyeS4KKyAgICAvLy8KKyAgICAvLy8gWmVybyBtZWFucyB0aGUgcHJlcHJvY2Vzc29yIGRpZG4ndCBwcm92aWRlIHN1Y2ggaW5mbyBmb3IgdGhpcyBTTG9jRW50cnkuCisgICAgdW5zaWduZWQgTnVtQ3JlYXRlZEZJRHMgOiAzMTsKKworICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIEZpbGVJbmZvIGhhcyBhbnkgXCNsaW5lIGRpcmVjdGl2ZXMuCisgICAgdW5zaWduZWQgSGFzTGluZURpcmVjdGl2ZXMgOiAxOworCisgICAgLy8vIFxicmllZiBUaGUgY29udGVudCBjYWNoZSBhbmQgdGhlIGNoYXJhY3RlcmlzdGljIG9mIHRoZSBmaWxlLgorICAgIGxsdm06OlBvaW50ZXJJbnRQYWlyPGNvbnN0IENvbnRlbnRDYWNoZSosIDMsIENoYXJhY3RlcmlzdGljS2luZD4KKyAgICAgICAgQ29udGVudEFuZEtpbmQ7CisKKyAgcHVibGljOgorICAgIC8vLyBcYnJpZWYgUmV0dXJuIGEgRmlsZUluZm8gb2JqZWN0LgorICAgIHN0YXRpYyBGaWxlSW5mbyBnZXQoU291cmNlTG9jYXRpb24gSUwsIGNvbnN0IENvbnRlbnRDYWNoZSAqQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyaXN0aWNLaW5kIEZpbGVDaGFyYWN0ZXIpIHsKKyAgICAgIEZpbGVJbmZvIFg7CisgICAgICBYLkluY2x1ZGVMb2MgPSBJTC5nZXRSYXdFbmNvZGluZygpOworICAgICAgWC5OdW1DcmVhdGVkRklEcyA9IDA7CisgICAgICBYLkhhc0xpbmVEaXJlY3RpdmVzID0gZmFsc2U7CisgICAgICBYLkNvbnRlbnRBbmRLaW5kLnNldFBvaW50ZXIoQ29uKTsKKyAgICAgIFguQ29udGVudEFuZEtpbmQuc2V0SW50KEZpbGVDaGFyYWN0ZXIpOworICAgICAgcmV0dXJuIFg7CisgICAgfQorCisgICAgU291cmNlTG9jYXRpb24gZ2V0SW5jbHVkZUxvYygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKEluY2x1ZGVMb2MpOworICAgIH0KKworICAgIGNvbnN0IENvbnRlbnRDYWNoZSAqZ2V0Q29udGVudENhY2hlKCkgY29uc3QgeworICAgICAgcmV0dXJuIENvbnRlbnRBbmRLaW5kLmdldFBvaW50ZXIoKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBzeXN0ZW0gaGVhZGVyIG9yIG5vdC4KKyAgICBDaGFyYWN0ZXJpc3RpY0tpbmQgZ2V0RmlsZUNoYXJhY3RlcmlzdGljKCkgY29uc3QgeworICAgICAgcmV0dXJuIENvbnRlbnRBbmRLaW5kLmdldEludCgpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBGaWxlSUQgaGFzIFwjbGluZSBkaXJlY3RpdmVzIGluIGl0LgorICAgIGJvb2wgaGFzTGluZURpcmVjdGl2ZXMoKSBjb25zdCB7IHJldHVybiBIYXNMaW5lRGlyZWN0aXZlczsgfQorCisgICAgLy8vIFxicmllZiBTZXQgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGlzIEZpbGVJRCBoYXMKKyAgICAvLy8gbGluZSB0YWJsZSBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICB2b2lkIHNldEhhc0xpbmVEaXJlY3RpdmVzKCkgeworICAgICAgSGFzTGluZURpcmVjdGl2ZXMgPSB0cnVlOworICAgIH0KKyAgfTsKKworICAvLy8gXGJyaWVmIEVhY2ggRXhwYW5zaW9uSW5mbyBlbmNvZGVzIHRoZSBleHBhbnNpb24gbG9jYXRpb24gLSB3aGVyZQorICAvLy8gdGhlIHRva2VuIHdhcyB1bHRpbWF0ZWx5IGV4cGFuZGVkLCBhbmQgdGhlIFNwZWxsaW5nTG9jIC0gd2hlcmUgdGhlIGFjdHVhbAorICAvLy8gY2hhcmFjdGVyIGRhdGEgZm9yIHRoZSB0b2tlbiBjYW1lIGZyb20uCisgIGNsYXNzIEV4cGFuc2lvbkluZm8geworICAgIC8vIFJlYWxseSB0aGVzZSBhcmUgYWxsIFNvdXJjZUxvY2F0aW9ucy4KKworICAgIC8vLyBcYnJpZWYgV2hlcmUgdGhlIHNwZWxsaW5nIGZvciB0aGUgdG9rZW4gY2FuIGJlIGZvdW5kLgorICAgIHVuc2lnbmVkIFNwZWxsaW5nTG9jOworCisgICAgLy8vIEluIGEgbWFjcm8gZXhwYW5zaW9uLCBFeHBhbnNpb25Mb2NTdGFydCBhbmQgRXhwYW5zaW9uTG9jRW5kCisgICAgLy8vIGluZGljYXRlIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBleHBhbnNpb24uIEluIG9iamVjdC1saWtlIG1hY3JvcywKKyAgICAvLy8gdGhleSB3aWxsIGJlIHRoZSBzYW1lLiBJbiBhIGZ1bmN0aW9uLWxpa2UgbWFjcm8gZXhwYW5zaW9uLCB0aGUgc3RhcnQKKyAgICAvLy8gd2lsbCBiZSB0aGUgaWRlbnRpZmllciBhbmQgdGhlIGVuZCB3aWxsIGJlIHRoZSAnKScuIEZpbmFsbHksIGluCisgICAgLy8vIG1hY3JvLWFyZ3VtZW50IGluc3RhbnRpYXRpb25zLCB0aGUgZW5kIHdpbGwgYmUgJ1NvdXJjZUxvY2F0aW9uKCknLCBhbgorICAgIC8vLyBpbnZhbGlkIGxvY2F0aW9uLgorICAgIHVuc2lnbmVkIEV4cGFuc2lvbkxvY1N0YXJ0LCBFeHBhbnNpb25Mb2NFbmQ7CisKKyAgcHVibGljOgorICAgIFNvdXJjZUxvY2F0aW9uIGdldFNwZWxsaW5nTG9jKCkgY29uc3QgeworICAgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoU3BlbGxpbmdMb2MpOworICAgIH0KKworICAgIFNvdXJjZUxvY2F0aW9uIGdldEV4cGFuc2lvbkxvY1N0YXJ0KCkgY29uc3QgeworICAgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoRXhwYW5zaW9uTG9jU3RhcnQpOworICAgIH0KKworICAgIFNvdXJjZUxvY2F0aW9uIGdldEV4cGFuc2lvbkxvY0VuZCgpIGNvbnN0IHsKKyAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyA9CisgICAgICAgIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoRXhwYW5zaW9uTG9jRW5kKTsKKyAgICAgIHJldHVybiBFbmRMb2MuaXNJbnZhbGlkKCkgPyBnZXRFeHBhbnNpb25Mb2NTdGFydCgpIDogRW5kTG9jOworICAgIH0KKworICAgIHN0ZDo6cGFpcjxTb3VyY2VMb2NhdGlvbixTb3VyY2VMb2NhdGlvbj4gZ2V0RXhwYW5zaW9uTG9jUmFuZ2UoKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZ2V0RXhwYW5zaW9uTG9jU3RhcnQoKSwgZ2V0RXhwYW5zaW9uTG9jRW5kKCkpOworICAgIH0KKworICAgIGJvb2wgaXNNYWNyb0FyZ0V4cGFuc2lvbigpIGNvbnN0IHsKKyAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG5lZWRzIHRvIHJldHVybiBmYWxzZSBmb3IgZGVmYXVsdCBjb25zdHJ1Y3RlZCBvYmplY3RzLgorICAgICAgcmV0dXJuIGdldEV4cGFuc2lvbkxvY1N0YXJ0KCkuaXNWYWxpZCgpICYmCisgICAgICAgIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoRXhwYW5zaW9uTG9jRW5kKS5pc0ludmFsaWQoKTsKKyAgICB9CisKKyAgICBib29sIGlzTWFjcm9Cb2R5RXhwYW5zaW9uKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldEV4cGFuc2lvbkxvY1N0YXJ0KCkuaXNWYWxpZCgpICYmCisgICAgICAgIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoRXhwYW5zaW9uTG9jRW5kKS5pc1ZhbGlkKCk7CisgICAgfQorCisgICAgYm9vbCBpc0Z1bmN0aW9uTWFjcm9FeHBhbnNpb24oKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0RXhwYW5zaW9uTG9jU3RhcnQoKS5pc1ZhbGlkKCkgJiYKKyAgICAgICAgICBnZXRFeHBhbnNpb25Mb2NTdGFydCgpICE9IGdldEV4cGFuc2lvbkxvY0VuZCgpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIGEgRXhwYW5zaW9uSW5mbyBmb3IgYW4gZXhwYW5zaW9uLgorICAgIC8vLworICAgIC8vLyBTdGFydCBhbmQgRW5kIHNwZWNpZnkgdGhlIGV4cGFuc2lvbiByYW5nZSAod2hlcmUgdGhlIG1hY3JvIGlzCisgICAgLy8vIGV4cGFuZGVkKSwgYW5kIFNwZWxsaW5nTG9jIHNwZWNpZmllcyB0aGUgc3BlbGxpbmcgbG9jYXRpb24gKHdoZXJlCisgICAgLy8vIHRoZSBjaGFyYWN0ZXJzIGZyb20gdGhlIHRva2VuIGNvbWUgZnJvbSkuIEFsbCB0aHJlZSBjYW4gcmVmZXIgdG8KKyAgICAvLy8gbm9ybWFsIEZpbGUgU0xvY3Mgb3IgZXhwYW5zaW9uIGxvY2F0aW9ucy4KKyAgICBzdGF0aWMgRXhwYW5zaW9uSW5mbyBjcmVhdGUoU291cmNlTG9jYXRpb24gU3BlbGxpbmdMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0LCBTb3VyY2VMb2NhdGlvbiBFbmQpIHsKKyAgICAgIEV4cGFuc2lvbkluZm8gWDsKKyAgICAgIFguU3BlbGxpbmdMb2MgPSBTcGVsbGluZ0xvYy5nZXRSYXdFbmNvZGluZygpOworICAgICAgWC5FeHBhbnNpb25Mb2NTdGFydCA9IFN0YXJ0LmdldFJhd0VuY29kaW5nKCk7CisgICAgICBYLkV4cGFuc2lvbkxvY0VuZCA9IEVuZC5nZXRSYXdFbmNvZGluZygpOworICAgICAgcmV0dXJuIFg7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm4gYSBzcGVjaWFsIEV4cGFuc2lvbkluZm8gZm9yIHRoZSBleHBhbnNpb24gb2YKKyAgICAvLy8gYSBtYWNybyBhcmd1bWVudCBpbnRvIGEgZnVuY3Rpb24tbGlrZSBtYWNybydzIGJvZHkuCisgICAgLy8vCisgICAgLy8vIEV4cGFuc2lvbkxvYyBzcGVjaWZpZXMgdGhlIGV4cGFuc2lvbiBsb2NhdGlvbiAod2hlcmUgdGhlIG1hY3JvIGlzCisgICAgLy8vIGV4cGFuZGVkKS4gVGhpcyBkb2Vzbid0IG5lZWQgdG8gYmUgYSByYW5nZSBiZWNhdXNlIGEgbWFjcm8gaXMgYWx3YXlzCisgICAgLy8vIGV4cGFuZGVkIGF0IGEgbWFjcm8gcGFyYW1ldGVyIHJlZmVyZW5jZSwgYW5kIG1hY3JvIHBhcmFtZXRlcnMgYXJlCisgICAgLy8vIGFsd2F5cyBleGFjdGx5IG9uZSB0b2tlbi4gU3BlbGxpbmdMb2Mgc3BlY2lmaWVzIHRoZSBzcGVsbGluZyBsb2NhdGlvbgorICAgIC8vLyAod2hlcmUgdGhlIGNoYXJhY3RlcnMgZnJvbSB0aGUgdG9rZW4gY29tZSBmcm9tKS4gRXhwYW5zaW9uTG9jIGFuZAorICAgIC8vLyBTcGVsbGluZ0xvYyBjYW4gYm90aCByZWZlciB0byBub3JtYWwgRmlsZSBTTG9jcyBvciBleHBhbnNpb24gbG9jYXRpb25zLgorICAgIC8vLworICAgIC8vLyBHaXZlbiB0aGUgY29kZToKKyAgICAvLy8gXGNvZGUKKyAgICAvLy8gICAjZGVmaW5lIEYoeCkgZih4KQorICAgIC8vLyAgIEYoNDIpOworICAgIC8vLyBcZW5kY29kZQorICAgIC8vLworICAgIC8vLyBXaGVuIGV4cGFuZGluZyAnXGMgRig0MiknLCB0aGUgJ1xjIHgnIHdvdWxkIGNhbGwgdGhpcyB3aXRoIGFuCisgICAgLy8vIFNwZWxsaW5nTG9jIHBvaW50aW5nIGF0ICdcYyA0MicgYW5kIGFuIEV4cGFuc2lvbkxvYyBwb2ludGluZyBhdCBpdHMKKyAgICAvLy8gbG9jYXRpb24gaW4gdGhlIGRlZmluaXRpb24gb2YgJ1xjIEYnLgorICAgIHN0YXRpYyBFeHBhbnNpb25JbmZvIGNyZWF0ZUZvck1hY3JvQXJnKFNvdXJjZUxvY2F0aW9uIFNwZWxsaW5nTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEV4cGFuc2lvbkxvYykgeworICAgICAgLy8gV2Ugc3RvcmUgYW4gaW50ZW50aW9uYWxseSBpbnZhbGlkIHNvdXJjZSBsb2NhdGlvbiBmb3IgdGhlIGVuZCBvZiB0aGUKKyAgICAgIC8vIGV4cGFuc2lvbiByYW5nZSB0byBtYXJrIHRoYXQgdGhpcyBpcyBhIG1hY3JvIGFyZ3VtZW50IGlvbiByYXRoZXIgdGhhbgorICAgICAgLy8gYSBub3JtYWwgb25lLgorICAgICAgcmV0dXJuIGNyZWF0ZShTcGVsbGluZ0xvYywgRXhwYW5zaW9uTG9jLCBTb3VyY2VMb2NhdGlvbigpKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFxicmllZiBUaGlzIGlzIGEgZGlzY3JpbWluYXRlZCB1bmlvbiBvZiBGaWxlSW5mbyBhbmQgRXhwYW5zaW9uSW5mby4KKyAgLy8vCisgIC8vLyBTb3VyY2VNYW5hZ2VyIGtlZXBzIGFuIGFycmF5IG9mIHRoZXNlIG9iamVjdHMsIGFuZCB0aGV5IGFyZSB1bmlxdWVseQorICAvLy8gaWRlbnRpZmllZCBieSB0aGUgRmlsZUlEIGRhdGF0eXBlLgorICBjbGFzcyBTTG9jRW50cnkgeworICAgIHVuc2lnbmVkIE9mZnNldCA6IDMxOworICAgIHVuc2lnbmVkIElzRXhwYW5zaW9uIDogMTsKKyAgICB1bmlvbiB7CisgICAgICBGaWxlSW5mbyBGaWxlOworICAgICAgRXhwYW5zaW9uSW5mbyBFeHBhbnNpb247CisgICAgfTsKKworICBwdWJsaWM6CisgICAgU0xvY0VudHJ5KCkgOiBPZmZzZXQoKSwgSXNFeHBhbnNpb24oKSwgRmlsZSgpIHt9CisKKyAgICB1bnNpZ25lZCBnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBPZmZzZXQ7IH0KKworICAgIGJvb2wgaXNFeHBhbnNpb24oKSBjb25zdCB7IHJldHVybiBJc0V4cGFuc2lvbjsgfQorICAgIGJvb2wgaXNGaWxlKCkgY29uc3QgeyByZXR1cm4gIWlzRXhwYW5zaW9uKCk7IH0KKworICAgIGNvbnN0IEZpbGVJbmZvICZnZXRGaWxlKCkgY29uc3QgeworICAgICAgYXNzZXJ0KGlzRmlsZSgpICYmICJOb3QgYSBmaWxlIFNMb2NFbnRyeSEiKTsKKyAgICAgIHJldHVybiBGaWxlOworICAgIH0KKworICAgIGNvbnN0IEV4cGFuc2lvbkluZm8gJmdldEV4cGFuc2lvbigpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpc0V4cGFuc2lvbigpICYmICJOb3QgYSBtYWNybyBleHBhbnNpb24gU0xvY0VudHJ5ISIpOworICAgICAgcmV0dXJuIEV4cGFuc2lvbjsKKyAgICB9CisKKyAgICBzdGF0aWMgU0xvY0VudHJ5IGdldCh1bnNpZ25lZCBPZmZzZXQsIGNvbnN0IEZpbGVJbmZvICZGSSkgeworICAgICAgYXNzZXJ0KCEoT2Zmc2V0ICYgKDEgPDwgMzEpKSAmJiAiT2Zmc2V0IGlzIHRvbyBsYXJnZSIpOworICAgICAgU0xvY0VudHJ5IEU7CisgICAgICBFLk9mZnNldCA9IE9mZnNldDsKKyAgICAgIEUuSXNFeHBhbnNpb24gPSBmYWxzZTsKKyAgICAgIEUuRmlsZSA9IEZJOworICAgICAgcmV0dXJuIEU7CisgICAgfQorCisgICAgc3RhdGljIFNMb2NFbnRyeSBnZXQodW5zaWduZWQgT2Zmc2V0LCBjb25zdCBFeHBhbnNpb25JbmZvICZFeHBhbnNpb24pIHsKKyAgICAgIGFzc2VydCghKE9mZnNldCAmICgxIDw8IDMxKSkgJiYgIk9mZnNldCBpcyB0b28gbGFyZ2UiKTsKKyAgICAgIFNMb2NFbnRyeSBFOworICAgICAgRS5PZmZzZXQgPSBPZmZzZXQ7CisgICAgICBFLklzRXhwYW5zaW9uID0gdHJ1ZTsKKyAgICAgIEUuRXhwYW5zaW9uID0gRXhwYW5zaW9uOworICAgICAgcmV0dXJuIEU7CisgICAgfQorICB9OworCit9IC8vIG5hbWVzcGFjZSBTcmNNZ3IKKworLy8vIFxicmllZiBFeHRlcm5hbCBzb3VyY2Ugb2Ygc291cmNlIGxvY2F0aW9uIGVudHJpZXMuCitjbGFzcyBFeHRlcm5hbFNMb2NFbnRyeVNvdXJjZSB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkV4dGVybmFsU0xvY0VudHJ5U291cmNlKCk7CisKKyAgLy8vIFxicmllZiBSZWFkIHRoZSBzb3VyY2UgbG9jYXRpb24gZW50cnkgd2l0aCBpbmRleCBJRCwgd2hpY2ggd2lsbCBhbHdheXMgYmUKKyAgLy8vIGxlc3MgdGhhbiAtMS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkIHRoYXQgcHJldmVudGVkIHRoZSBzb3VyY2UtbG9jYXRpb24KKyAgLy8vIGVudHJ5IGZyb20gYmVpbmcgbG9hZGVkLgorICB2aXJ0dWFsIGJvb2wgUmVhZFNMb2NFbnRyeShpbnQgSUQpID0gMDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtb2R1bGUgaW1wb3J0IGxvY2F0aW9uIGFuZCBuYW1lIGZvciB0aGUgZ2l2ZW4gSUQsIGlmCisgIC8vLyBpbiBmYWN0IGl0IHdhcyBsb2FkZWQgZnJvbSBhIG1vZHVsZSAocmF0aGVyIHRoYW4sIHNheSwgYSBwcmVjb21waWxlZAorICAvLy8gaGVhZGVyKS4KKyAgdmlydHVhbCBzdGQ6OnBhaXI8U291cmNlTG9jYXRpb24sIFN0cmluZ1JlZj4gZ2V0TW9kdWxlSW1wb3J0TG9jKGludCBJRCkgPSAwOworfTsKKworLy8vIFxicmllZiBIb2xkcyB0aGUgY2FjaGUgdXNlZCBieSBpc0JlZm9yZUluVHJhbnNsYXRpb25Vbml0LgorLy8vCisvLy8gVGhlIGNhY2hlIHN0cnVjdHVyZSBpcyBjb21wbGV4IGVub3VnaCB0byBiZSB3b3J0aCBicmVha2luZyBvdXQgb2YKKy8vLyBTb3VyY2VNYW5hZ2VyLgorY2xhc3MgSW5CZWZvcmVJblRVQ2FjaGVFbnRyeSB7CisgIC8vLyBcYnJpZWYgVGhlIEZpbGVJRCdzIG9mIHRoZSBjYWNoZWQgcXVlcnkuCisgIC8vLworICAvLy8gSWYgdGhlc2UgbWF0Y2ggdXAgd2l0aCBhIHN1YnNlcXVlbnQgcXVlcnksIHRoZSByZXN1bHQgY2FuIGJlIHJldXNlZC4KKyAgRmlsZUlEIExRdWVyeUZJRCwgUlF1ZXJ5RklEOworCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiBMUXVlcnlGSUQgd2FzIGNyZWF0ZWQgYmVmb3JlIFJRdWVyeUZJRC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gY29tcGFyZSBtYWNybyBleHBhbnNpb24gbG9jYXRpb25zLgorICBib29sIElzTFFGSURCZWZvcmVSUUZJRDsKKworICAvLy8gXGJyaWVmIFRoZSBmaWxlIGZvdW5kIGluIGNvbW1vbiBiZXR3ZWVuIHRoZSB0d28gXCNpbmNsdWRlIHRyYWNlcywgaS5lLiwKKyAgLy8vIHRoZSBuZWFyZXN0IGNvbW1vbiBhbmNlc3RvciBvZiB0aGUgXCNpbmNsdWRlIHRyZWUuCisgIEZpbGVJRCBDb21tb25GSUQ7CisKKyAgLy8vIFxicmllZiBUaGUgb2Zmc2V0IG9mIHRoZSBwcmV2aW91cyBxdWVyeSBpbiBDb21tb25GSUQuCisgIC8vLworICAvLy8gVXN1YWxseSwgdGhpcyByZXByZXNlbnRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgXCNpbmNsdWRlIGZvciBRdWVyeUZJRCwgYnV0CisgIC8vLyBpZiBMUXVlcnlGSUQgaXMgYSBwYXJlbnQgb2YgUlF1ZXJ5RklEIChvciB2aWNlIHZlcnNhKSB0aGVuIHRoZXNlIGNhbiBiZSBhCisgIC8vLyByYW5kb20gdG9rZW4gaW4gdGhlIHBhcmVudC4KKyAgdW5zaWduZWQgTENvbW1vbk9mZnNldCwgUkNvbW1vbk9mZnNldDsKKworcHVibGljOgorICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50bHkgY2FjaGVkIHZhbHVlcyBtYXRjaCB1cCB3aXRoCisgIC8vLyB0aGUgc3BlY2lmaWVkIExIUy9SSFMgcXVlcnkuCisgIC8vLworICAvLy8gSWYgbm90LCB3ZSBjYW4ndCB1c2UgdGhlIGNhY2hlLgorICBib29sIGlzQ2FjaGVWYWxpZChGaWxlSUQgTEhTLCBGaWxlSUQgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIExRdWVyeUZJRCA9PSBMSFMgJiYgUlF1ZXJ5RklEID09IFJIUzsKKyAgfQorCisgIC8vLyBcYnJpZWYgSWYgdGhlIGNhY2hlIGlzIHZhbGlkLCBjb21wdXRlIHRoZSByZXN1bHQgZ2l2ZW4gdGhlCisgIC8vLyBzcGVjaWZpZWQgb2Zmc2V0cyBpbiB0aGUgTEhTL1JIUyBGaWxlSUQncy4KKyAgYm9vbCBnZXRDYWNoZWRSZXN1bHQodW5zaWduZWQgTE9mZnNldCwgdW5zaWduZWQgUk9mZnNldCkgY29uc3QgeworICAgIC8vIElmIG9uZSBvZiB0aGUgcXVlcnkgZmlsZXMgaXMgdGhlIGNvbW1vbiBmaWxlLCB1c2UgdGhlIG9mZnNldC4gIE90aGVyd2lzZSwKKyAgICAvLyB1c2UgdGhlICNpbmNsdWRlIGxvYyBpbiB0aGUgY29tbW9uIGZpbGUuCisgICAgaWYgKExRdWVyeUZJRCAhPSBDb21tb25GSUQpIExPZmZzZXQgPSBMQ29tbW9uT2Zmc2V0OworICAgIGlmIChSUXVlcnlGSUQgIT0gQ29tbW9uRklEKSBST2Zmc2V0ID0gUkNvbW1vbk9mZnNldDsKKworICAgIC8vIEl0IGlzIGNvbW1vbiBmb3IgbXVsdGlwbGUgbWFjcm8gZXhwYW5zaW9ucyB0byBiZSAiaW5jbHVkZWQiIGZyb20gdGhlIHNhbWUKKyAgICAvLyBsb2NhdGlvbiAoZXhwYW5zaW9uIGxvY2F0aW9uKSwgaW4gd2hpY2ggY2FzZSB1c2UgdGhlIG9yZGVyIG9mIHRoZSBGaWxlSURzCisgICAgLy8gdG8gZGV0ZXJtaW5lIHdoaWNoIGNhbWUgZmlyc3QuIFRoaXMgd2lsbCBhbHNvIHRha2UgY2FyZSB0aGUgY2FzZSB3aGVyZQorICAgIC8vIG9uZSBvZiB0aGUgbG9jYXRpb25zIHBvaW50cyBhdCB0aGUgaW5jbHVzaW9uL2V4cGFuc2lvbiBwb2ludCBvZiB0aGUgb3RoZXIKKyAgICAvLyBpbiB3aGljaCBjYXNlIGl0cyBGaWxlSUQgd2lsbCBjb21lIGJlZm9yZSB0aGUgb3RoZXIuCisgICAgaWYgKExPZmZzZXQgPT0gUk9mZnNldCkKKyAgICAgIHJldHVybiBJc0xRRklEQmVmb3JlUlFGSUQ7CisKKyAgICByZXR1cm4gTE9mZnNldCA8IFJPZmZzZXQ7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB1cCBhIG5ldyBxdWVyeS4KKyAgdm9pZCBzZXRRdWVyeUZJRHMoRmlsZUlEIExIUywgRmlsZUlEIFJIUywgYm9vbCBpc0xGSURCZWZvcmVSRklEKSB7CisgICAgYXNzZXJ0KExIUyAhPSBSSFMpOworICAgIExRdWVyeUZJRCA9IExIUzsKKyAgICBSUXVlcnlGSUQgPSBSSFM7CisgICAgSXNMUUZJREJlZm9yZVJRRklEID0gaXNMRklEQmVmb3JlUkZJRDsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgTFF1ZXJ5RklEID0gUlF1ZXJ5RklEID0gRmlsZUlEKCk7CisgICAgSXNMUUZJREJlZm9yZVJRRklEID0gZmFsc2U7CisgIH0KKworICB2b2lkIHNldENvbW1vbkxvYyhGaWxlSUQgY29tbW9uRklELCB1bnNpZ25lZCBsQ29tbW9uT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByQ29tbW9uT2Zmc2V0KSB7CisgICAgQ29tbW9uRklEID0gY29tbW9uRklEOworICAgIExDb21tb25PZmZzZXQgPSBsQ29tbW9uT2Zmc2V0OworICAgIFJDb21tb25PZmZzZXQgPSByQ29tbW9uT2Zmc2V0OworICB9Cit9OworCisvLy8gXGJyaWVmIFRoZSBzdGFjayB1c2VkIHdoZW4gYnVpbGRpbmcgbW9kdWxlcyBvbiBkZW1hbmQsIHdoaWNoIGlzIHVzZWQKKy8vLyB0byBwcm92aWRlIGEgbGluayBiZXR3ZWVuIHRoZSBzb3VyY2UgbWFuYWdlcnMgb2YgdGhlIGRpZmZlcmVudCBjb21waWxlcgorLy8vIGluc3RhbmNlcy4KK3VzaW5nIE1vZHVsZUJ1aWxkU3RhY2sgPSBBcnJheVJlZjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIEZ1bGxTb3VyY2VMb2M+PjsKKworLy8vIFxicmllZiBUaGlzIGNsYXNzIGhhbmRsZXMgbG9hZGluZyBhbmQgY2FjaGluZyBvZiBzb3VyY2UgZmlsZXMgaW50byBtZW1vcnkuCisvLy8KKy8vLyBUaGlzIG9iamVjdCBvd25zIHRoZSBNZW1vcnlCdWZmZXIgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBsb2FkZWQKKy8vLyBmaWxlcyBhbmQgYXNzaWducyB1bmlxdWUgRmlsZUlEJ3MgZm9yIGVhY2ggdW5pcXVlIFwjaW5jbHVkZSBjaGFpbi4KKy8vLworLy8vIFRoZSBTb3VyY2VNYW5hZ2VyIGNhbiBiZSBxdWVyaWVkIGZvciBpbmZvcm1hdGlvbiBhYm91dCBTb3VyY2VMb2NhdGlvbgorLy8vIG9iamVjdHMsIHR1cm5pbmcgdGhlbSBpbnRvIGVpdGhlciBzcGVsbGluZyBvciBleHBhbnNpb24gbG9jYXRpb25zLiBTcGVsbGluZworLy8vIGxvY2F0aW9ucyByZXByZXNlbnQgd2hlcmUgdGhlIGJ5dGVzIGNvcnJlc3BvbmRpbmcgdG8gYSB0b2tlbiBjYW1lIGZyb20gYW5kCisvLy8gZXhwYW5zaW9uIGxvY2F0aW9ucyByZXByZXNlbnQgd2hlcmUgdGhlIGxvY2F0aW9uIGlzIGluIHRoZSB1c2VyJ3Mgdmlldy4gSW4KKy8vLyB0aGUgY2FzZSBvZiBhIG1hY3JvIGV4cGFuc2lvbiwgZm9yIGV4YW1wbGUsIHRoZSBzcGVsbGluZyBsb2NhdGlvbiBpbmRpY2F0ZXMKKy8vLyB3aGVyZSB0aGUgZXhwYW5kZWQgdG9rZW4gY2FtZSBmcm9tIGFuZCB0aGUgZXhwYW5zaW9uIGxvY2F0aW9uIHNwZWNpZmllcworLy8vIHdoZXJlIGl0IHdhcyBleHBhbmRlZC4KK2NsYXNzIFNvdXJjZU1hbmFnZXIgOiBwdWJsaWMgUmVmQ291bnRlZEJhc2U8U291cmNlTWFuYWdlcj4geworICAvLy8gXGJyaWVmIERpYWdub3N0aWNzRW5naW5lIG9iamVjdC4KKyAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWc7CisKKyAgRmlsZU1hbmFnZXIgJkZpbGVNZ3I7CisKKyAgbXV0YWJsZSBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yIENvbnRlbnRDYWNoZUFsbG9jOworCisgIC8vLyBcYnJpZWYgTWVtb2l6ZWQgaW5mb3JtYXRpb24gYWJvdXQgYWxsIG9mIHRoZSBmaWxlcyB0cmFja2VkIGJ5IHRoaXMKKyAgLy8vIFNvdXJjZU1hbmFnZXIuCisgIC8vLworICAvLy8gVGhpcyBtYXAgYWxsb3dzIHVzIHRvIG1lcmdlIENvbnRlbnRDYWNoZSBlbnRyaWVzIGJhc2VkCisgIC8vLyBvbiB0aGVpciBGaWxlRW50cnkqLiAgQWxsIENvbnRlbnRDYWNoZSBvYmplY3RzIHdpbGwgdGh1cyBoYXZlIHVuaXF1ZSwKKyAgLy8vIG5vbi1udWxsLCBGaWxlRW50cnkgcG9pbnRlcnMuCisgIGxsdm06OkRlbnNlTWFwPGNvbnN0IEZpbGVFbnRyeSosIFNyY01ncjo6Q29udGVudENhY2hlKj4gRmlsZUluZm9zOworCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGUgQ29udGVudENhY2hlIGZvciBmaWxlcyB0aGF0IGFyZSBvdmVycmlkZGVuIGJ5IG90aGVyCisgIC8vLyBmaWxlcywgc2hvdWxkIHJlcG9ydCB0aGUgb3JpZ2luYWwgZmlsZSBuYW1lLiBEZWZhdWx0cyB0byB0cnVlLgorICBib29sIE92ZXJyaWRlbkZpbGVzS2VlcE9yaWdpbmFsTmFtZSA9IHRydWU7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIG5vbi1zeXN0ZW0gc291cmNlIGZpbGVzIHNob3VsZCBiZSB0cmVhdGVkIGFzIHZvbGF0aWxlCisgIC8vLyAobGlrZWx5IHRvIGNoYW5nZSB3aGlsZSB0cnlpbmcgdG8gdXNlIHRoZW0pLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgYm9vbCBVc2VyRmlsZXNBcmVWb2xhdGlsZTsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgYWxsIGZpbGVzIHJlYWQgZHVyaW5nIHRoaXMgY29tcGlsYXRpb24gc2hvdWxkIGJlIHRyZWF0ZWQKKyAgLy8vIGFzIHRyYW5zaWVudCAobWF5IG5vdCBiZSBwcmVzZW50IGluIGxhdGVyIGNvbXBpbGF0aW9ucyB1c2luZyBhIG1vZHVsZQorICAvLy8gZmlsZSBjcmVhdGVkIGZyb20gdGhpcyBjb21waWxhdGlvbikuIERlZmF1bHRzIHRvIGZhbHNlLgorICBib29sIEZpbGVzQXJlVHJhbnNpZW50ID0gZmFsc2U7CisKKyAgc3RydWN0IE92ZXJyaWRkZW5GaWxlc0luZm9UeSB7CisgICAgLy8vIFxicmllZiBGaWxlcyB0aGF0IGhhdmUgYmVlbiBvdmVycmlkZGVuIHdpdGggdGhlIGNvbnRlbnRzIGZyb20gYW5vdGhlcgorICAgIC8vLyBmaWxlLgorICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IEZpbGVFbnRyeSAqLCBjb25zdCBGaWxlRW50cnkgKj4gT3ZlcnJpZGRlbkZpbGVzOworCisgICAgLy8vIFxicmllZiBGaWxlcyB0aGF0IHdlcmUgb3ZlcnJpZGRlbiB3aXRoIGEgbWVtb3J5IGJ1ZmZlci4KKyAgICBsbHZtOjpEZW5zZVNldDxjb25zdCBGaWxlRW50cnkgKj4gT3ZlcnJpZGRlbkZpbGVzV2l0aEJ1ZmZlcjsKKyAgfTsKKworICAvLy8gXGJyaWVmIExhemlseSBjcmVhdGUgdGhlIG9iamVjdCBrZWVwaW5nIG92ZXJyaWRkZW4gZmlsZXMgaW5mbywgc2luY2UKKyAgLy8vIGl0IGlzIHVuY29tbW9ubHkgdXNlZC4KKyAgc3RkOjp1bmlxdWVfcHRyPE92ZXJyaWRkZW5GaWxlc0luZm9UeT4gT3ZlcnJpZGRlbkZpbGVzSW5mbzsKKworICBPdmVycmlkZGVuRmlsZXNJbmZvVHkgJmdldE92ZXJyaWRkZW5GaWxlc0luZm8oKSB7CisgICAgaWYgKCFPdmVycmlkZGVuRmlsZXNJbmZvKQorICAgICAgT3ZlcnJpZGRlbkZpbGVzSW5mby5yZXNldChuZXcgT3ZlcnJpZGRlbkZpbGVzSW5mb1R5KTsKKyAgICByZXR1cm4gKk92ZXJyaWRkZW5GaWxlc0luZm87CisgIH0KKworICAvLy8gXGJyaWVmIEluZm9ybWF0aW9uIGFib3V0IHZhcmlvdXMgbWVtb3J5IGJ1ZmZlcnMgdGhhdCB3ZSBoYXZlIHJlYWQgaW4uCisgIC8vLworICAvLy8gQWxsIEZpbGVFbnRyeSogd2l0aGluIHRoZSBzdG9yZWQgQ29udGVudENhY2hlIG9iamVjdHMgYXJlIE5VTEwsCisgIC8vLyBhcyB0aGV5IGRvIG5vdCByZWZlciB0byBhIGZpbGUuCisgIHN0ZDo6dmVjdG9yPFNyY01ncjo6Q29udGVudENhY2hlKj4gTWVtQnVmZmVySW5mb3M7CisKKyAgLy8vIFxicmllZiBUaGUgdGFibGUgb2YgU0xvY0VudHJpZXMgdGhhdCBhcmUgbG9jYWwgdG8gdGhpcyBtb2R1bGUuCisgIC8vLworICAvLy8gUG9zaXRpdmUgRmlsZUlEcyBhcmUgaW5kZXhlcyBpbnRvIHRoaXMgdGFibGUuIEVudHJ5IDAgaW5kaWNhdGVzIGFuIGludmFsaWQKKyAgLy8vIGV4cGFuc2lvbi4KKyAgU21hbGxWZWN0b3I8U3JjTWdyOjpTTG9jRW50cnksIDA+IExvY2FsU0xvY0VudHJ5VGFibGU7CisKKyAgLy8vIFxicmllZiBUaGUgdGFibGUgb2YgU0xvY0VudHJpZXMgdGhhdCBhcmUgbG9hZGVkIGZyb20gb3RoZXIgbW9kdWxlcy4KKyAgLy8vCisgIC8vLyBOZWdhdGl2ZSBGaWxlSURzIGFyZSBpbmRleGVzIGludG8gdGhpcyB0YWJsZS4gVG8gZ2V0IGZyb20gSUQgdG8gYW4gaW5kZXgsCisgIC8vLyB1c2UgKC1JRCAtIDIpLgorICBtdXRhYmxlIFNtYWxsVmVjdG9yPFNyY01ncjo6U0xvY0VudHJ5LCAwPiBMb2FkZWRTTG9jRW50cnlUYWJsZTsKKworICAvLy8gXGJyaWVmIFRoZSBzdGFydGluZyBvZmZzZXQgb2YgdGhlIG5leHQgbG9jYWwgU0xvY0VudHJ5LgorICAvLy8KKyAgLy8vIFRoaXMgaXMgTG9jYWxTTG9jRW50cnlUYWJsZS5iYWNrKCkuT2Zmc2V0ICsgdGhlIHNpemUgb2YgdGhhdCBlbnRyeS4KKyAgdW5zaWduZWQgTmV4dExvY2FsT2Zmc2V0OworCisgIC8vLyBcYnJpZWYgVGhlIHN0YXJ0aW5nIG9mZnNldCBvZiB0aGUgbGF0ZXN0IGJhdGNoIG9mIGxvYWRlZCBTTG9jRW50cmllcy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIExvYWRlZFNMb2NFbnRyeVRhYmxlLmJhY2soKS5PZmZzZXQsIGV4Y2VwdCB0aGF0IHRoYXQgZW50cnkgbWlnaHQKKyAgLy8vIG5vdCBoYXZlIGJlZW4gbG9hZGVkLCBzbyB0aGF0IHZhbHVlIHdvdWxkIGJlIHVua25vd24uCisgIHVuc2lnbmVkIEN1cnJlbnRMb2FkZWRPZmZzZXQ7CisKKyAgLy8vIFxicmllZiBUaGUgaGlnaGVzdCBwb3NzaWJsZSBvZmZzZXQgaXMgMl4zMS0xLCBzbyBDdXJyZW50TG9hZGVkT2Zmc2V0CisgIC8vLyBzdGFydHMgYXQgMl4zMS4KKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE1heExvYWRlZE9mZnNldCA9IDFVIDw8IDMxVTsKKworICAvLy8gXGJyaWVmIEEgYml0bWFwIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudHJpZXMgb2YgTG9hZGVkU0xvY0VudHJ5VGFibGUKKyAgLy8vIGhhdmUgYWxyZWFkeSBiZWVuIGxvYWRlZCBmcm9tIHRoZSBleHRlcm5hbCBzb3VyY2UuCisgIC8vLworICAvLy8gU2FtZSBpbmRleGluZyBhcyBMb2FkZWRTTG9jRW50cnlUYWJsZS4KKyAgbGx2bTo6Qml0VmVjdG9yIFNMb2NFbnRyeUxvYWRlZDsKKworICAvLy8gXGJyaWVmIEFuIGV4dGVybmFsIHNvdXJjZSBmb3Igc291cmNlIGxvY2F0aW9uIGVudHJpZXMuCisgIEV4dGVybmFsU0xvY0VudHJ5U291cmNlICpFeHRlcm5hbFNMb2NFbnRyaWVzID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIEEgb25lLWVudHJ5IGNhY2hlIHRvIHNwZWVkIHVwIGdldEZpbGVJRC4KKyAgLy8vCisgIC8vLyBMYXN0RmlsZUlETG9va3VwIHJlY29yZHMgdGhlIGxhc3QgRmlsZUlEIGxvb2tlZCB1cCBvciBjcmVhdGVkLCBiZWNhdXNlIGl0CisgIC8vLyBpcyB2ZXJ5IGNvbW1vbiB0byBsb29rIHVwIG1hbnkgdG9rZW5zIGZyb20gdGhlIHNhbWUgZmlsZS4KKyAgbXV0YWJsZSBGaWxlSUQgTGFzdEZpbGVJRExvb2t1cDsKKworICAvLy8gXGJyaWVmIEhvbGRzIGluZm9ybWF0aW9uIGZvciBcI2xpbmUgZGlyZWN0aXZlcy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHJlZmVyZW5jZWQgYnkgaW5kaWNlcyBmcm9tIFNMb2NFbnRyeVRhYmxlLgorICBMaW5lVGFibGVJbmZvICpMaW5lVGFibGUgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlc2UgaXZhcnMgc2VydmUgYXMgYSBjYWNoZSB1c2VkIGluIHRoZSBnZXRMaW5lTnVtYmVyCisgIC8vLyBtZXRob2Qgd2hpY2ggaXMgdXNlZCB0byBzcGVlZHVwIGdldExpbmVOdW1iZXIgY2FsbHMgdG8gbmVhcmJ5IGxvY2F0aW9ucy4KKyAgbXV0YWJsZSBGaWxlSUQgTGFzdExpbmVOb0ZpbGVJRFF1ZXJ5OworICBtdXRhYmxlIFNyY01ncjo6Q29udGVudENhY2hlICpMYXN0TGluZU5vQ29udGVudENhY2hlOworICBtdXRhYmxlIHVuc2lnbmVkIExhc3RMaW5lTm9GaWxlUG9zOworICBtdXRhYmxlIHVuc2lnbmVkIExhc3RMaW5lTm9SZXN1bHQ7CisKKyAgLy8vIFxicmllZiBUaGUgZmlsZSBJRCBmb3IgdGhlIG1haW4gc291cmNlIGZpbGUgb2YgdGhlIHRyYW5zbGF0aW9uIHVuaXQuCisgIEZpbGVJRCBNYWluRmlsZUlEOworCisgIC8vLyBcYnJpZWYgVGhlIGZpbGUgSUQgZm9yIHRoZSBwcmVjb21waWxlZCBwcmVhbWJsZSB0aGVyZSBpcyBvbmUuCisgIEZpbGVJRCBQcmVhbWJsZUZpbGVJRDsKKworICAvLyBTdGF0aXN0aWNzIGZvciAtcHJpbnQtc3RhdHMuCisgIG11dGFibGUgdW5zaWduZWQgTnVtTGluZWFyU2NhbnMgPSAwOworICBtdXRhYmxlIHVuc2lnbmVkIE51bUJpbmFyeVByb2JlcyA9IDA7CisKKyAgLy8vIFxicmllZiBBc3NvY2lhdGVzIGEgRmlsZUlEIHdpdGggaXRzICJpbmNsdWRlZC9leHBhbmRlZCBpbiIgZGVjb21wb3NlZAorICAvLy8gbG9jYXRpb24uCisgIC8vLworICAvLy8gVXNlZCB0byBjYWNoZSByZXN1bHRzIGZyb20gYW5kIHNwZWVkLXVwIFxjIGdldERlY29tcG9zZWRJbmNsdWRlZExvYworICAvLy8gZnVuY3Rpb24uCisgIG11dGFibGUgbGx2bTo6RGVuc2VNYXA8RmlsZUlELCBzdGQ6OnBhaXI8RmlsZUlELCB1bnNpZ25lZD4+IEluY2x1ZGVkTG9jTWFwOworCisgIC8vLyBUaGUga2V5IHZhbHVlIGludG8gdGhlIElzQmVmb3JlSW5UVUNhY2hlIHRhYmxlLgorICB1c2luZyBJc0JlZm9yZUluVFVDYWNoZUtleSA9IHN0ZDo6cGFpcjxGaWxlSUQsIEZpbGVJRD47CisKKyAgLy8vIFRoZSBJc0JlZm9yZUluVHJhbnNsYXRpb25Vbml0Q2FjaGUgaXMgYSBtYXBwaW5nIGZyb20gRmlsZUlEIHBhaXJzCisgIC8vLyB0byBjYWNoZSByZXN1bHRzLgorICB1c2luZyBJbkJlZm9yZUluVFVDYWNoZSA9CisgICAgICBsbHZtOjpEZW5zZU1hcDxJc0JlZm9yZUluVFVDYWNoZUtleSwgSW5CZWZvcmVJblRVQ2FjaGVFbnRyeT47CisKKyAgLy8vIENhY2hlIHJlc3VsdHMgZm9yIHRoZSBpc0JlZm9yZUluVHJhbnNsYXRpb25Vbml0IG1ldGhvZC4KKyAgbXV0YWJsZSBJbkJlZm9yZUluVFVDYWNoZSBJQlRVQ2FjaGU7CisgIG11dGFibGUgSW5CZWZvcmVJblRVQ2FjaGVFbnRyeSBJQlRVQ2FjaGVPdmVyZmxvdzsKKworICAvLy8gUmV0dXJuIHRoZSBjYWNoZSBlbnRyeSBmb3IgY29tcGFyaW5nIHRoZSBnaXZlbiBmaWxlIElEcworICAvLy8gZm9yIGlzQmVmb3JlSW5UcmFuc2xhdGlvblVuaXQuCisgIEluQmVmb3JlSW5UVUNhY2hlRW50cnkgJmdldEluQmVmb3JlSW5UVUNhY2hlKEZpbGVJRCBMRklELCBGaWxlSUQgUkZJRCkgY29uc3Q7CisKKyAgLy8gQ2FjaGUgZm9yIHRoZSAiZmFrZSIgYnVmZmVyIHVzZWQgZm9yIGVycm9yLXJlY292ZXJ5IHB1cnBvc2VzLgorICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+IEZha2VCdWZmZXJGb3JSZWNvdmVyeTsKKworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxTcmNNZ3I6OkNvbnRlbnRDYWNoZT4gRmFrZUNvbnRlbnRDYWNoZUZvclJlY292ZXJ5OworCisgIC8vLyBcYnJpZWYgTGF6aWx5IGNvbXB1dGVkIG1hcCBvZiBtYWNybyBhcmd1bWVudCBjaHVua3MgdG8gdGhlaXIgZXhwYW5kZWQKKyAgLy8vIHNvdXJjZSBsb2NhdGlvbi4KKyAgdXNpbmcgTWFjcm9BcmdzTWFwID0gc3RkOjptYXA8dW5zaWduZWQsIFNvdXJjZUxvY2F0aW9uPjsKKworICBtdXRhYmxlIGxsdm06OkRlbnNlTWFwPEZpbGVJRCwgc3RkOjp1bmlxdWVfcHRyPE1hY3JvQXJnc01hcD4+CisgICAgICBNYWNyb0FyZ3NDYWNoZU1hcDsKKworICAvLy8gXGJyaWVmIFRoZSBzdGFjayBvZiBtb2R1bGVzIGJlaW5nIGJ1aWx0LCB3aGljaCBpcyB1c2VkIHRvIGRldGVjdAorICAvLy8gY3ljbGVzIGluIHRoZSBtb2R1bGUgZGVwZW5kZW5jeSBncmFwaCBhcyBtb2R1bGVzIGFyZSBiZWluZyBidWlsdCwgYXMKKyAgLy8vIHdlbGwgYXMgdG8gZGVzY3JpYmUgd2h5IHdlJ3JlIHJlYnVpbGRpbmcgYSBwYXJ0aWN1bGFyIG1vZHVsZS4KKyAgLy8vCisgIC8vLyBUaGVyZSBpcyBubyB3YXkgdG8gc2V0IHRoaXMgdmFsdWUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiBJZiB3ZSBldmVyIG5lZWQKKyAgLy8vIHRvIGRvIHNvIChlLmcuLCBpZiBvbi1kZW1hbmQgbW9kdWxlIGNvbnN0cnVjdGlvbiBtb3ZlcyBvdXQtb2YtcHJvY2VzcyksCisgIC8vLyB3ZSBjYW4gYWRkIGEgY2MxLWxldmVsIG9wdGlvbiB0byBkbyBzby4KKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBGdWxsU291cmNlTG9jPiwgMj4gU3RvcmVkTW9kdWxlQnVpbGRTdGFjazsKKworcHVibGljOgorICBTb3VyY2VNYW5hZ2VyKERpYWdub3N0aWNzRW5naW5lICZEaWFnLCBGaWxlTWFuYWdlciAmRmlsZU1nciwKKyAgICAgICAgICAgICAgICBib29sIFVzZXJGaWxlc0FyZVZvbGF0aWxlID0gZmFsc2UpOworICBleHBsaWNpdCBTb3VyY2VNYW5hZ2VyKGNvbnN0IFNvdXJjZU1hbmFnZXIgJikgPSBkZWxldGU7CisgIFNvdXJjZU1hbmFnZXIgJm9wZXJhdG9yPShjb25zdCBTb3VyY2VNYW5hZ2VyICYpID0gZGVsZXRlOworICB+U291cmNlTWFuYWdlcigpOworCisgIHZvaWQgY2xlYXJJRFRhYmxlcygpOworCisgIC8vLyBJbml0aWFsaXplIHRoaXMgc291cmNlIG1hbmFnZXIgc3VpdGFibHkgdG8gcmVwbGF5IHRoZSBjb21waWxhdGlvbgorICAvLy8gZGVzY3JpYmVkIGJ5IFxwIE9sZC4gUmVxdWlyZXMgdGhhdCBccCBPbGQgb3V0bGl2ZSBccCAqdGhpcy4KKyAgdm9pZCBpbml0aWFsaXplRm9yUmVwbGF5KGNvbnN0IFNvdXJjZU1hbmFnZXIgJk9sZCk7CisKKyAgRGlhZ25vc3RpY3NFbmdpbmUgJmdldERpYWdub3N0aWNzKCkgY29uc3QgeyByZXR1cm4gRGlhZzsgfQorCisgIEZpbGVNYW5hZ2VyICZnZXRGaWxlTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIEZpbGVNZ3I7IH0KKworICAvLy8gXGJyaWVmIFNldCB0cnVlIGlmIHRoZSBTb3VyY2VNYW5hZ2VyIHNob3VsZCByZXBvcnQgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZQorICAvLy8gZm9yIGNvbnRlbnRzIG9mIGZpbGVzIHRoYXQgd2VyZSBvdmVycmlkZGVuIGJ5IG90aGVyIGZpbGVzLiBEZWZhdWx0cyB0bworICAvLy8gdHJ1ZS4KKyAgdm9pZCBzZXRPdmVycmlkZW5GaWxlc0tlZXBPcmlnaW5hbE5hbWUoYm9vbCB2YWx1ZSkgeworICAgIE92ZXJyaWRlbkZpbGVzS2VlcE9yaWdpbmFsTmFtZSA9IHZhbHVlOworICB9CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIG5vbi1zeXN0ZW0gc291cmNlIGZpbGVzIHNob3VsZCBiZSB0cmVhdGVkIGFzIHZvbGF0aWxlCisgIC8vLyAobGlrZWx5IHRvIGNoYW5nZSB3aGlsZSB0cnlpbmcgdG8gdXNlIHRoZW0pLgorICBib29sIHVzZXJGaWxlc0FyZVZvbGF0aWxlKCkgY29uc3QgeyByZXR1cm4gVXNlckZpbGVzQXJlVm9sYXRpbGU7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtb2R1bGUgYnVpbGQgc3RhY2suCisgIE1vZHVsZUJ1aWxkU3RhY2sgZ2V0TW9kdWxlQnVpbGRTdGFjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RvcmVkTW9kdWxlQnVpbGRTdGFjazsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBtb2R1bGUgYnVpbGQgc3RhY2suCisgIHZvaWQgc2V0TW9kdWxlQnVpbGRTdGFjayhNb2R1bGVCdWlsZFN0YWNrIHN0YWNrKSB7CisgICAgU3RvcmVkTW9kdWxlQnVpbGRTdGFjay5jbGVhcigpOworICAgIFN0b3JlZE1vZHVsZUJ1aWxkU3RhY2suYXBwZW5kKHN0YWNrLmJlZ2luKCksIHN0YWNrLmVuZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUHVzaCBhbiBlbnRyeSB0byB0aGUgbW9kdWxlIGJ1aWxkIHN0YWNrLgorICB2b2lkIHB1c2hNb2R1bGVCdWlsZFN0YWNrKFN0cmluZ1JlZiBtb2R1bGVOYW1lLCBGdWxsU291cmNlTG9jIGltcG9ydExvYykgeworICAgIFN0b3JlZE1vZHVsZUJ1aWxkU3RhY2sucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKG1vZHVsZU5hbWUuc3RyKCksaW1wb3J0TG9jKSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTWFpbkZpbGVJRCBjcmVhdGlvbiBhbmQgcXVlcnlpbmcgbWV0aG9kcy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBGaWxlSUQgb2YgdGhlIG1haW4gc291cmNlIGZpbGUuCisgIEZpbGVJRCBnZXRNYWluRmlsZUlEKCkgY29uc3QgeyByZXR1cm4gTWFpbkZpbGVJRDsgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBmaWxlIElEIGZvciB0aGUgbWFpbiBzb3VyY2UgZmlsZS4KKyAgdm9pZCBzZXRNYWluRmlsZUlEKEZpbGVJRCBGSUQpIHsKKyAgICBNYWluRmlsZUlEID0gRklEOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGZpbGUgSUQgZm9yIHRoZSBwcmVjb21waWxlZCBwcmVhbWJsZS4KKyAgdm9pZCBzZXRQcmVhbWJsZUZpbGVJRChGaWxlSUQgUHJlYW1ibGUpIHsKKyAgICBhc3NlcnQoUHJlYW1ibGVGaWxlSUQuaXNJbnZhbGlkKCkgJiYgIlByZWFtYmxlRmlsZUlEIGFscmVhZHkgc2V0ISIpOworICAgIFByZWFtYmxlRmlsZUlEID0gUHJlYW1ibGU7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgZmlsZSBJRCBmb3IgdGhlIHByZWNvbXBpbGVkIHByZWFtYmxlIGlmIHRoZXJlIGlzIG9uZS4KKyAgRmlsZUlEIGdldFByZWFtYmxlRmlsZUlEKCkgY29uc3QgeyByZXR1cm4gUHJlYW1ibGVGaWxlSUQ7IH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTWV0aG9kcyB0byBjcmVhdGUgbmV3IEZpbGVJRCdzIGFuZCBtYWNybyBleHBhbnNpb25zLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyBGaWxlSUQgdGhhdCByZXByZXNlbnRzIHRoZSBzcGVjaWZpZWQgZmlsZQorICAvLy8gYmVpbmcgXCNpbmNsdWRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgSW5jbHVkZVBvc2l0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgdHJhbnNsYXRlcyBOVUxMIGludG8gc3RhbmRhcmQgaW5wdXQuCisgIEZpbGVJRCBjcmVhdGVGaWxlSUQoY29uc3QgRmlsZUVudHJ5ICpTb3VyY2VGaWxlLCBTb3VyY2VMb2NhdGlvbiBJbmNsdWRlUG9zLAorICAgICAgICAgICAgICAgICAgICAgIFNyY01ncjo6Q2hhcmFjdGVyaXN0aWNLaW5kIEZpbGVDaGFyYWN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50IExvYWRlZElEID0gMCwgdW5zaWduZWQgTG9hZGVkT2Zmc2V0ID0gMCkgeworICAgIGNvbnN0IFNyY01ncjo6Q29udGVudENhY2hlICpJUiA9CisgICAgICAgIGdldE9yQ3JlYXRlQ29udGVudENhY2hlKFNvdXJjZUZpbGUsIGlzU3lzdGVtKEZpbGVDaGFyYWN0ZXIpKTsKKyAgICBhc3NlcnQoSVIgJiYgImdldE9yQ3JlYXRlQ29udGVudENhY2hlKCkgY2Fubm90IHJldHVybiBOVUxMIik7CisgICAgcmV0dXJuIGNyZWF0ZUZpbGVJRChJUiwgSW5jbHVkZVBvcywgRmlsZUNoYXJhY3RlciwgTG9hZGVkSUQsIExvYWRlZE9mZnNldCk7CisgIH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyBGaWxlSUQgdGhhdCByZXByZXNlbnRzIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGJ1ZmZlci4KKyAgLy8vCisgIC8vLyBUaGlzIGRvZXMgbm8gY2FjaGluZyBvZiB0aGUgYnVmZmVyIGFuZCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlCisgIC8vLyBNZW1vcnlCdWZmZXIsIHNvIG9ubHkgcGFzcyBhIE1lbW9yeUJ1ZmZlciB0byB0aGlzIG9uY2UuCisgIEZpbGVJRCBjcmVhdGVGaWxlSUQoc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgIFNyY01ncjo6Q2hhcmFjdGVyaXN0aWNLaW5kIEZpbGVDaGFyYWN0ZXIgPSBTcmNNZ3I6OkNfVXNlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgTG9hZGVkSUQgPSAwLCB1bnNpZ25lZCBMb2FkZWRPZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEluY2x1ZGVMb2MgPSBTb3VyY2VMb2NhdGlvbigpKSB7CisgICAgcmV0dXJuIGNyZWF0ZUZpbGVJRCgKKyAgICAgICAgY3JlYXRlTWVtQnVmZmVyQ29udGVudENhY2hlKEJ1ZmZlci5yZWxlYXNlKCksIC8qRG9Ob3RGcmVlKi8gZmFsc2UpLAorICAgICAgICBJbmNsdWRlTG9jLCBGaWxlQ2hhcmFjdGVyLCBMb2FkZWRJRCwgTG9hZGVkT2Zmc2V0KTsKKyAgfQorCisgIGVudW0gVW5vd25lZFRhZyB7IFVub3duZWQgfTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyBGaWxlSUQgdGhhdCByZXByZXNlbnRzIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGJ1ZmZlci4KKyAgLy8vCisgIC8vLyBUaGlzIGRvZXMgbm8gY2FjaGluZyBvZiB0aGUgYnVmZmVyIGFuZCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlCisgIC8vLyBNZW1vcnlCdWZmZXIsIHNvIG9ubHkgcGFzcyBhIE1lbW9yeUJ1ZmZlciB0byB0aGlzIG9uY2UuCisgIEZpbGVJRCBjcmVhdGVGaWxlSUQoVW5vd25lZFRhZywgbGx2bTo6TWVtb3J5QnVmZmVyICpCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgU3JjTWdyOjpDaGFyYWN0ZXJpc3RpY0tpbmQgRmlsZUNoYXJhY3RlciA9IFNyY01ncjo6Q19Vc2VyLAorICAgICAgICAgICAgICAgICAgICAgIGludCBMb2FkZWRJRCA9IDAsIHVuc2lnbmVkIExvYWRlZE9mZnNldCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSW5jbHVkZUxvYyA9IFNvdXJjZUxvY2F0aW9uKCkpIHsKKyAgICByZXR1cm4gY3JlYXRlRmlsZUlEKGNyZWF0ZU1lbUJ1ZmZlckNvbnRlbnRDYWNoZShCdWZmZXIsIC8qRG9Ob3RGcmVlKi90cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGVMb2MsIEZpbGVDaGFyYWN0ZXIsIExvYWRlZElELCBMb2FkZWRPZmZzZXQpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIEZpbGVJRCBmb3IgXHAgU291cmNlRmlsZSBpZiBpdCBleGlzdHMuIE90aGVyd2lzZSwgY3JlYXRlIGEKKyAgLy8vIG5ldyBGaWxlSUQgZm9yIHRoZSBccCBTb3VyY2VGaWxlLgorICBGaWxlSUQgZ2V0T3JDcmVhdGVGaWxlSUQoY29uc3QgRmlsZUVudHJ5ICpTb3VyY2VGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjTWdyOjpDaGFyYWN0ZXJpc3RpY0tpbmQgRmlsZUNoYXJhY3RlcikgeworICAgIEZpbGVJRCBJRCA9IHRyYW5zbGF0ZUZpbGUoU291cmNlRmlsZSk7CisgICAgcmV0dXJuIElELmlzVmFsaWQoKSA/IElEIDogY3JlYXRlRmlsZUlEKFNvdXJjZUZpbGUsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVDaGFyYWN0ZXIpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSBuZXcgU291cmNlTG9jYXRpb24gdGhhdCBlbmNvZGVzIHRoZQorICAvLy8gZmFjdCB0aGF0IGEgdG9rZW4gZnJvbSBTcGVsbGluZ0xvYyBzaG91bGQgYWN0dWFsbHkgYmUgcmVmZXJlbmNlZCBmcm9tCisgIC8vLyBFeHBhbnNpb25Mb2MsIGFuZCB0aGF0IGl0IHJlcHJlc2VudHMgdGhlIGV4cGFuc2lvbiBvZiBhIG1hY3JvIGFyZ3VtZW50CisgIC8vLyBpbnRvIHRoZSBmdW5jdGlvbi1saWtlIG1hY3JvIGJvZHkuCisgIFNvdXJjZUxvY2F0aW9uIGNyZWF0ZU1hY3JvQXJnRXhwYW5zaW9uTG9jKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRXhwYW5zaW9uTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUb2tMZW5ndGgpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgbmV3IFNvdXJjZUxvY2F0aW9uIHRoYXQgZW5jb2RlcyB0aGUgZmFjdAorICAvLy8gdGhhdCBhIHRva2VuIGZyb20gU3BlbGxpbmdMb2Mgc2hvdWxkIGFjdHVhbGx5IGJlIHJlZmVyZW5jZWQgZnJvbQorICAvLy8gRXhwYW5zaW9uTG9jLgorICBTb3VyY2VMb2NhdGlvbiBjcmVhdGVFeHBhbnNpb25Mb2MoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRXhwYW5zaW9uTG9jU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFeHBhbnNpb25Mb2NFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUb2tMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTG9hZGVkSUQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTG9hZGVkT2Zmc2V0ID0gMCk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbWVtb3J5IGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZpbGUuCisgIC8vLworICAvLy8gXHBhcmFtIEludmFsaWQgSWYgbm9uLU5VTEwsIHdpbGwgYmUgc2V0IFxjIHRydWUgaWYgYW4gZXJyb3IKKyAgLy8vIG9jY3VycyB3aGlsZSByZXRyaWV2aW5nIHRoZSBtZW1vcnkgYnVmZmVyLgorICBsbHZtOjpNZW1vcnlCdWZmZXIgKmdldE1lbW9yeUJ1ZmZlckZvckZpbGUoY29uc3QgRmlsZUVudHJ5ICpGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqSW52YWxpZCA9IG51bGxwdHIpOworCisgIC8vLyBcYnJpZWYgT3ZlcnJpZGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBzb3VyY2UgZmlsZSBieSBwcm92aWRpbmcgYW4KKyAgLy8vIGFscmVhZHktYWxsb2NhdGVkIGJ1ZmZlci4KKyAgLy8vCisgIC8vLyBccGFyYW0gU291cmNlRmlsZSB0aGUgc291cmNlIGZpbGUgd2hvc2UgY29udGVudHMgd2lsbCBiZSBvdmVycmlkZGVuLgorICAvLy8KKyAgLy8vIFxwYXJhbSBCdWZmZXIgdGhlIG1lbW9yeSBidWZmZXIgd2hvc2UgY29udGVudHMgd2lsbCBiZSB1c2VkIGFzIHRoZQorICAvLy8gZGF0YSBpbiB0aGUgZ2l2ZW4gc291cmNlIGZpbGUuCisgIC8vLworICAvLy8gXHBhcmFtIERvTm90RnJlZSBJZiB0cnVlLCB0aGVuIHRoZSBidWZmZXIgd2lsbCBub3QgYmUgZnJlZWQgd2hlbiB0aGUKKyAgLy8vIHNvdXJjZSBtYW5hZ2VyIGlzIGRlc3Ryb3llZC4KKyAgdm9pZCBvdmVycmlkZUZpbGVDb250ZW50cyhjb25zdCBGaWxlRW50cnkgKlNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6TWVtb3J5QnVmZmVyICpCdWZmZXIsIGJvb2wgRG9Ob3RGcmVlKTsKKyAgdm9pZCBvdmVycmlkZUZpbGVDb250ZW50cyhjb25zdCBGaWxlRW50cnkgKlNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gQnVmZmVyKSB7CisgICAgb3ZlcnJpZGVGaWxlQ29udGVudHMoU291cmNlRmlsZSwgQnVmZmVyLnJlbGVhc2UoKSwgLypEb05vdEZyZWUqLyBmYWxzZSk7CisgIH0KKworICAvLy8gXGJyaWVmIE92ZXJyaWRlIHRoZSBnaXZlbiBzb3VyY2UgZmlsZSB3aXRoIGFub3RoZXIgb25lLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTb3VyY2VGaWxlIHRoZSBzb3VyY2UgZmlsZSB3aGljaCB3aWxsIGJlIG92ZXJyaWRkZW4uCisgIC8vLworICAvLy8gXHBhcmFtIE5ld0ZpbGUgdGhlIGZpbGUgd2hvc2UgY29udGVudHMgd2lsbCBiZSB1c2VkIGFzIHRoZQorICAvLy8gZGF0YSBpbnN0ZWFkIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gc291cmNlIGZpbGUuCisgIHZvaWQgb3ZlcnJpZGVGaWxlQ29udGVudHMoY29uc3QgRmlsZUVudHJ5ICpTb3VyY2VGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVFbnRyeSAqTmV3RmlsZSk7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgY29udGVudHMgaGF2ZSBiZWVuIG92ZXJyaWRkZW4uCisgIGJvb2wgaXNGaWxlT3ZlcnJpZGRlbihjb25zdCBGaWxlRW50cnkgKkZpbGUpIGNvbnN0IHsKKyAgICBpZiAoT3ZlcnJpZGRlbkZpbGVzSW5mbykgeworICAgICAgaWYgKE92ZXJyaWRkZW5GaWxlc0luZm8tPk92ZXJyaWRkZW5GaWxlc1dpdGhCdWZmZXIuY291bnQoRmlsZSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKE92ZXJyaWRkZW5GaWxlc0luZm8tPk92ZXJyaWRkZW5GaWxlcy5maW5kKEZpbGUpICE9CisgICAgICAgICAgT3ZlcnJpZGRlbkZpbGVzSW5mby0+T3ZlcnJpZGRlbkZpbGVzLmVuZCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBEaXNhYmxlIG92ZXJyaWRkaW5nIHRoZSBjb250ZW50cyBvZiBhIGZpbGUsIHByZXZpb3VzbHkgZW5hYmxlZAorICAvLy8gd2l0aCAjb3ZlcnJpZGVGaWxlQ29udGVudHMuCisgIC8vLworICAvLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBwYXJzaW5nIGhhcyBiZWd1bi4KKyAgdm9pZCBkaXNhYmxlRmlsZUNvbnRlbnRzT3ZlcnJpZGUoY29uc3QgRmlsZUVudHJ5ICpGaWxlKTsKKworICAvLy8gXGJyaWVmIFNwZWNpZnkgdGhhdCBhIGZpbGUgaXMgdHJhbnNpZW50LgorICB2b2lkIHNldEZpbGVJc1RyYW5zaWVudChjb25zdCBGaWxlRW50cnkgKlNvdXJjZUZpbGUpOworCisgIC8vLyBcYnJpZWYgU3BlY2lmeSB0aGF0IGFsbCBmaWxlcyB0aGF0IGFyZSByZWFkIGR1cmluZyB0aGlzIGNvbXBpbGF0aW9uIGFyZQorICAvLy8gdHJhbnNpZW50LgorICB2b2lkIHNldEFsbEZpbGVzQXJlVHJhbnNpZW50KGJvb2wgVHJhbnNpZW50KSB7CisgICAgRmlsZXNBcmVUcmFuc2llbnQgPSBUcmFuc2llbnQ7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gRmlsZUlEIG1hbmlwdWxhdGlvbiBtZXRob2RzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgYnVmZmVyIGZvciB0aGUgc3BlY2lmaWVkIEZpbGVJRC4KKyAgLy8vCisgIC8vLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBvcGVuaW5nIHRoaXMgYnVmZmVyIHRoZSBmaXJzdCB0aW1lLCB0aGlzCisgIC8vLyBtYW51ZmFjdHVyZXMgYSB0ZW1wb3JhcnkgYnVmZmVyIGFuZCByZXR1cm5zIGEgbm9uLWVtcHR5IGVycm9yIHN0cmluZy4KKyAgbGx2bTo6TWVtb3J5QnVmZmVyICpnZXRCdWZmZXIoRmlsZUlEIEZJRCwgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpJbnZhbGlkID0gbnVsbHB0cikgY29uc3QgeworICAgIGJvb2wgTXlJbnZhbGlkID0gZmFsc2U7CisgICAgY29uc3QgU3JjTWdyOjpTTG9jRW50cnkgJkVudHJ5ID0gZ2V0U0xvY0VudHJ5KEZJRCwgJk15SW52YWxpZCk7CisgICAgaWYgKE15SW52YWxpZCB8fCAhRW50cnkuaXNGaWxlKCkpIHsKKyAgICAgIGlmIChJbnZhbGlkKQorICAgICAgICAqSW52YWxpZCA9IHRydWU7CisKKyAgICAgIHJldHVybiBnZXRGYWtlQnVmZmVyRm9yUmVjb3ZlcnkoKTsKKyAgICB9CisKKyAgICByZXR1cm4gRW50cnkuZ2V0RmlsZSgpLmdldENvbnRlbnRDYWNoZSgpLT5nZXRCdWZmZXIoRGlhZywgKnRoaXMsIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZCk7CisgIH0KKworICBsbHZtOjpNZW1vcnlCdWZmZXIgKmdldEJ1ZmZlcihGaWxlSUQgRklELCBib29sICpJbnZhbGlkID0gbnVsbHB0cikgY29uc3QgeworICAgIGJvb2wgTXlJbnZhbGlkID0gZmFsc2U7CisgICAgY29uc3QgU3JjTWdyOjpTTG9jRW50cnkgJkVudHJ5ID0gZ2V0U0xvY0VudHJ5KEZJRCwgJk15SW52YWxpZCk7CisgICAgaWYgKE15SW52YWxpZCB8fCAhRW50cnkuaXNGaWxlKCkpIHsKKyAgICAgIGlmIChJbnZhbGlkKQorICAgICAgICAqSW52YWxpZCA9IHRydWU7CisKKyAgICAgIHJldHVybiBnZXRGYWtlQnVmZmVyRm9yUmVjb3ZlcnkoKTsKKyAgICB9CisKKyAgICByZXR1cm4gRW50cnkuZ2V0RmlsZSgpLmdldENvbnRlbnRDYWNoZSgpLT5nZXRCdWZmZXIoRGlhZywgKnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWQpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBGaWxlRW50cnkgcmVjb3JkIGZvciB0aGUgcHJvdmlkZWQgRmlsZUlELgorICBjb25zdCBGaWxlRW50cnkgKmdldEZpbGVFbnRyeUZvcklEKEZpbGVJRCBGSUQpIGNvbnN0IHsKKyAgICBib29sIE15SW52YWxpZCA9IGZhbHNlOworICAgIGNvbnN0IFNyY01ncjo6U0xvY0VudHJ5ICZFbnRyeSA9IGdldFNMb2NFbnRyeShGSUQsICZNeUludmFsaWQpOworICAgIGlmIChNeUludmFsaWQgfHwgIUVudHJ5LmlzRmlsZSgpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBjb25zdCBTcmNNZ3I6OkNvbnRlbnRDYWNoZSAqQ29udGVudCA9IEVudHJ5LmdldEZpbGUoKS5nZXRDb250ZW50Q2FjaGUoKTsKKyAgICBpZiAoIUNvbnRlbnQpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gQ29udGVudC0+T3JpZ0VudHJ5OworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBGaWxlRW50cnkgcmVjb3JkIGZvciB0aGUgcHJvdmlkZWQgU0xvY0VudHJ5LgorICBjb25zdCBGaWxlRW50cnkgKmdldEZpbGVFbnRyeUZvclNMb2NFbnRyeShjb25zdCBTcmNNZ3I6OlNMb2NFbnRyeSAmc2xvYykgY29uc3QKKyAgeworICAgIGNvbnN0IFNyY01ncjo6Q29udGVudENhY2hlICpDb250ZW50ID0gc2xvYy5nZXRGaWxlKCkuZ2V0Q29udGVudENhY2hlKCk7CisgICAgaWYgKCFDb250ZW50KQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIENvbnRlbnQtPk9yaWdFbnRyeTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgU3RyaW5nUmVmIHRvIHRoZSBzb3VyY2UgYnVmZmVyIGRhdGEgZm9yIHRoZQorICAvLy8gc3BlY2lmaWVkIEZpbGVJRC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRklEIFRoZSBmaWxlIElEIHdob3NlIGNvbnRlbnRzIHdpbGwgYmUgcmV0dXJuZWQuCisgIC8vLyBccGFyYW0gSW52YWxpZCBJZiBub24tTlVMTCwgd2lsbCBiZSBzZXQgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAgU3RyaW5nUmVmIGdldEJ1ZmZlckRhdGEoRmlsZUlEIEZJRCwgYm9vbCAqSW52YWxpZCA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgRmlsZUlEcyAoZmlsZXMgYW5kIG1hY3JvcykgdGhhdCB3ZXJlIGNyZWF0ZWQKKyAgLy8vIGR1cmluZyBwcmVwcm9jZXNzaW5nIG9mIFxwIEZJRCwgaW5jbHVkaW5nIGl0LgorICB1bnNpZ25lZCBnZXROdW1DcmVhdGVkRklEc0ZvckZpbGVJRChGaWxlSUQgRklEKSBjb25zdCB7CisgICAgYm9vbCBJbnZhbGlkID0gZmFsc2U7CisgICAgY29uc3QgU3JjTWdyOjpTTG9jRW50cnkgJkVudHJ5ID0gZ2V0U0xvY0VudHJ5KEZJRCwgJkludmFsaWQpOworICAgIGlmIChJbnZhbGlkIHx8ICFFbnRyeS5pc0ZpbGUoKSkKKyAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIEVudHJ5LmdldEZpbGUoKS5OdW1DcmVhdGVkRklEczsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBudW1iZXIgb2YgRmlsZUlEcyAoZmlsZXMgYW5kIG1hY3JvcykgdGhhdCB3ZXJlIGNyZWF0ZWQKKyAgLy8vIGR1cmluZyBwcmVwcm9jZXNzaW5nIG9mIFxwIEZJRCwgaW5jbHVkaW5nIGl0LgorICB2b2lkIHNldE51bUNyZWF0ZWRGSURzRm9yRmlsZUlEKEZpbGVJRCBGSUQsIHVuc2lnbmVkIE51bUZJRHMpIGNvbnN0IHsKKyAgICBib29sIEludmFsaWQgPSBmYWxzZTsKKyAgICBjb25zdCBTcmNNZ3I6OlNMb2NFbnRyeSAmRW50cnkgPSBnZXRTTG9jRW50cnkoRklELCAmSW52YWxpZCk7CisgICAgaWYgKEludmFsaWQgfHwgIUVudHJ5LmlzRmlsZSgpKQorICAgICAgcmV0dXJuOworCisgICAgYXNzZXJ0KEVudHJ5LmdldEZpbGUoKS5OdW1DcmVhdGVkRklEcyA9PSAwICYmICJBbHJlYWR5IHNldCEiKTsKKyAgICBjb25zdF9jYXN0PFNyY01ncjo6RmlsZUluZm8gJj4oRW50cnkuZ2V0RmlsZSgpKS5OdW1DcmVhdGVkRklEcyA9IE51bUZJRHM7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gU291cmNlTG9jYXRpb24gbWFuaXB1bGF0aW9uIG1ldGhvZHMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBGaWxlSUQgZm9yIGEgU291cmNlTG9jYXRpb24uCisgIC8vLworICAvLy8gVGhpcyBpcyBhIHZlcnkgaG90IG1ldGhvZCB0aGF0IGlzIHVzZWQgZm9yIGFsbCBTb3VyY2VNYW5hZ2VyIHF1ZXJpZXMKKyAgLy8vIHRoYXQgc3RhcnQgd2l0aCBhIFNvdXJjZUxvY2F0aW9uIG9iamVjdC4gIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nCisgIC8vLyB0aGUgZW50cnkgaW4gU0xvY0VudHJ5VGFibGUgd2hpY2ggY29udGFpbnMgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KKyAgLy8vCisgIEZpbGVJRCBnZXRGaWxlSUQoU291cmNlTG9jYXRpb24gU3BlbGxpbmdMb2MpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBTTG9jT2Zmc2V0ID0gU3BlbGxpbmdMb2MuZ2V0T2Zmc2V0KCk7CisKKyAgICAvLyBJZiBvdXIgb25lLWVudHJ5IGNhY2hlIGNvdmVycyB0aGlzIG9mZnNldCwganVzdCByZXR1cm4gaXQuCisgICAgaWYgKGlzT2Zmc2V0SW5GaWxlSUQoTGFzdEZpbGVJRExvb2t1cCwgU0xvY09mZnNldCkpCisgICAgICByZXR1cm4gTGFzdEZpbGVJRExvb2t1cDsKKworICAgIHJldHVybiBnZXRGaWxlSURTbG93KFNMb2NPZmZzZXQpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGZpbGVuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgYSBTb3VyY2VMb2NhdGlvbi4KKyAgU3RyaW5nUmVmIGdldEZpbGVuYW1lKFNvdXJjZUxvY2F0aW9uIFNwZWxsaW5nTG9jKSBjb25zdCB7CisgICAgaWYgKGNvbnN0IEZpbGVFbnRyeSAqRiA9IGdldEZpbGVFbnRyeUZvcklEKGdldEZpbGVJRChTcGVsbGluZ0xvYykpKQorICAgICAgcmV0dXJuIEYtPmdldE5hbWUoKTsKKyAgICByZXR1cm4gU3RyaW5nUmVmKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgc291cmNlIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGJ5dGUgb2YKKyAgLy8vIHRoZSBzcGVjaWZpZWQgZmlsZS4KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRm9yU3RhcnRPZkZpbGUoRmlsZUlEIEZJRCkgY29uc3QgeworICAgIGJvb2wgSW52YWxpZCA9IGZhbHNlOworICAgIGNvbnN0IFNyY01ncjo6U0xvY0VudHJ5ICZFbnRyeSA9IGdldFNMb2NFbnRyeShGSUQsICZJbnZhbGlkKTsKKyAgICBpZiAoSW52YWxpZCB8fCAhRW50cnkuaXNGaWxlKCkpCisgICAgICByZXR1cm4gU291cmNlTG9jYXRpb24oKTsKKworICAgIHVuc2lnbmVkIEZpbGVPZmZzZXQgPSBFbnRyeS5nZXRPZmZzZXQoKTsKKyAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZpbGVMb2MoRmlsZU9mZnNldCk7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzb3VyY2UgbG9jYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCBieXRlIG9mIHRoZQorICAvLy8gc3BlY2lmaWVkIGZpbGUuCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY0ZvckVuZE9mRmlsZShGaWxlSUQgRklEKSBjb25zdCB7CisgICAgYm9vbCBJbnZhbGlkID0gZmFsc2U7CisgICAgY29uc3QgU3JjTWdyOjpTTG9jRW50cnkgJkVudHJ5ID0gZ2V0U0xvY0VudHJ5KEZJRCwgJkludmFsaWQpOworICAgIGlmIChJbnZhbGlkIHx8ICFFbnRyeS5pc0ZpbGUoKSkKKyAgICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbigpOworICAgIAorICAgIHVuc2lnbmVkIEZpbGVPZmZzZXQgPSBFbnRyeS5nZXRPZmZzZXQoKTsKKyAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZpbGVMb2MoRmlsZU9mZnNldCArIGdldEZpbGVJRFNpemUoRklEKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGluY2x1ZGUgbG9jYXRpb24gaWYgXHAgRklEIGlzIGEgXCNpbmNsdWRlJ2QgZmlsZQorICAvLy8gb3RoZXJ3aXNlIGl0IHJldHVybnMgYW4gaW52YWxpZCBsb2NhdGlvbi4KKyAgU291cmNlTG9jYXRpb24gZ2V0SW5jbHVkZUxvYyhGaWxlSUQgRklEKSBjb25zdCB7CisgICAgYm9vbCBJbnZhbGlkID0gZmFsc2U7CisgICAgY29uc3QgU3JjTWdyOjpTTG9jRW50cnkgJkVudHJ5ID0gZ2V0U0xvY0VudHJ5KEZJRCwgJkludmFsaWQpOworICAgIGlmIChJbnZhbGlkIHx8ICFFbnRyeS5pc0ZpbGUoKSkKKyAgICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbigpOworCisgICAgcmV0dXJuIEVudHJ5LmdldEZpbGUoKS5nZXRJbmNsdWRlTG9jKCk7CisgIH0KKworICAvLyBcYnJpZWYgUmV0dXJucyB0aGUgaW1wb3J0IGxvY2F0aW9uIGlmIHRoZSBnaXZlbiBzb3VyY2UgbG9jYXRpb24gaXMKKyAgLy8gbG9jYXRlZCB3aXRoaW4gYSBtb2R1bGUsIG9yIGFuIGludmFsaWQgbG9jYXRpb24gaWYgdGhlIHNvdXJjZSBsb2NhdGlvbgorICAvLyBpcyB3aXRoaW4gdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdC4KKyAgc3RkOjpwYWlyPFNvdXJjZUxvY2F0aW9uLCBTdHJpbmdSZWY+CisgIGdldE1vZHVsZUltcG9ydExvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0IHsKKyAgICBGaWxlSUQgRklEID0gZ2V0RmlsZUlEKExvYyk7CisKKyAgICAvLyBQb3NpdGl2ZSBmaWxlIElEcyBhcmUgaW4gdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdCwgYW5kIC0xIGlzIGEKKyAgICAvLyBwbGFjZWhvbGRlci4KKyAgICBpZiAoRklELklEID49IC0xKQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFNvdXJjZUxvY2F0aW9uKCksICIiKTsKKworICAgIHJldHVybiBFeHRlcm5hbFNMb2NFbnRyaWVzLT5nZXRNb2R1bGVJbXBvcnRMb2MoRklELklEKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2l2ZW4gYSBTb3VyY2VMb2NhdGlvbiBvYmplY3QgXHAgTG9jLCByZXR1cm4gdGhlIGV4cGFuc2lvbgorICAvLy8gbG9jYXRpb24gcmVmZXJlbmNlZCBieSB0aGUgSUQuCisgIFNvdXJjZUxvY2F0aW9uIGdldEV4cGFuc2lvbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0IHsKKyAgICAvLyBIYW5kbGUgdGhlIG5vbi1tYXBwZWQgY2FzZSBpbmxpbmUsIGRlZmVyIHRvIG91dCBvZiBsaW5lIGNvZGUgdG8gaGFuZGxlCisgICAgLy8gZXhwYW5zaW9ucy4KKyAgICBpZiAoTG9jLmlzRmlsZUlEKCkpIHJldHVybiBMb2M7CisgICAgcmV0dXJuIGdldEV4cGFuc2lvbkxvY1Nsb3dDYXNlKExvYyk7CisgIH0KKworICAvLy8gXGJyaWVmIEdpdmVuIFxwIExvYywgaWYgaXQgaXMgYSBtYWNybyBsb2NhdGlvbiByZXR1cm4gdGhlIGV4cGFuc2lvbgorICAvLy8gbG9jYXRpb24gb3IgdGhlIHNwZWxsaW5nIGxvY2F0aW9uLCBkZXBlbmRpbmcgb24gaWYgaXQgY29tZXMgZnJvbSBhCisgIC8vLyBtYWNybyBhcmd1bWVudCBvciBub3QuCisgIFNvdXJjZUxvY2F0aW9uIGdldEZpbGVMb2MoU291cmNlTG9jYXRpb24gTG9jKSBjb25zdCB7CisgICAgaWYgKExvYy5pc0ZpbGVJRCgpKSByZXR1cm4gTG9jOworICAgIHJldHVybiBnZXRGaWxlTG9jU2xvd0Nhc2UoTG9jKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzdGFydC9lbmQgb2YgdGhlIGV4cGFuc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4KKyAgLy8vIGV4cGFuc2lvbiBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccHJlIFxwIExvYyBpcyByZXF1aXJlZCB0byBiZSBhbiBleHBhbnNpb24gbG9jYXRpb24uCisgIHN0ZDo6cGFpcjxTb3VyY2VMb2NhdGlvbixTb3VyY2VMb2NhdGlvbj4KKyAgZ2V0SW1tZWRpYXRlRXhwYW5zaW9uUmFuZ2UoU291cmNlTG9jYXRpb24gTG9jKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdpdmVuIGEgU291cmNlTG9jYXRpb24gb2JqZWN0LCByZXR1cm4gdGhlIHJhbmdlIG9mCisgIC8vLyB0b2tlbnMgY292ZXJlZCBieSB0aGUgZXhwYW5zaW9uIGluIHRoZSB1bHRpbWF0ZSBmaWxlLgorICBzdGQ6OnBhaXI8U291cmNlTG9jYXRpb24sU291cmNlTG9jYXRpb24+CisgIGdldEV4cGFuc2lvblJhbmdlKFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHaXZlbiBhIFNvdXJjZVJhbmdlIG9iamVjdCwgcmV0dXJuIHRoZSByYW5nZSBvZgorICAvLy8gdG9rZW5zIGNvdmVyZWQgYnkgdGhlIGV4cGFuc2lvbiBpbiB0aGUgdWx0aW1hdGUgZmlsZS4KKyAgU291cmNlUmFuZ2UgZ2V0RXhwYW5zaW9uUmFuZ2UoU291cmNlUmFuZ2UgUmFuZ2UpIGNvbnN0IHsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0RXhwYW5zaW9uUmFuZ2UoUmFuZ2UuZ2V0QmVnaW4oKSkuZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGdldEV4cGFuc2lvblJhbmdlKFJhbmdlLmdldEVuZCgpKS5zZWNvbmQpOworICB9CisKKyAgLy8vIFxicmllZiBHaXZlbiBhIFNvdXJjZUxvY2F0aW9uIG9iamVjdCwgcmV0dXJuIHRoZSBzcGVsbGluZworICAvLy8gbG9jYXRpb24gcmVmZXJlbmNlZCBieSB0aGUgSUQuCisgIC8vLworICAvLy8gVGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgdGhlIGNoYXJhY3RlcnMgdGhhdCBtYWtlIHVwIHRoZSBsZXhlZCB0b2tlbgorICAvLy8gY2FuIGJlIGZvdW5kLgorICBTb3VyY2VMb2NhdGlvbiBnZXRTcGVsbGluZ0xvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0IHsKKyAgICAvLyBIYW5kbGUgdGhlIG5vbi1tYXBwZWQgY2FzZSBpbmxpbmUsIGRlZmVyIHRvIG91dCBvZiBsaW5lIGNvZGUgdG8gaGFuZGxlCisgICAgLy8gZXhwYW5zaW9ucy4KKyAgICBpZiAoTG9jLmlzRmlsZUlEKCkpIHJldHVybiBMb2M7CisgICAgcmV0dXJuIGdldFNwZWxsaW5nTG9jU2xvd0Nhc2UoTG9jKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2l2ZW4gYSBTb3VyY2VMb2NhdGlvbiBvYmplY3QsIHJldHVybiB0aGUgc3BlbGxpbmcgbG9jYXRpb24KKyAgLy8vIHJlZmVyZW5jZWQgYnkgdGhlIElELgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdGhlIGZpcnN0IGxldmVsIGRvd24gdG93YXJkcyB0aGUgcGxhY2Ugd2hlcmUgdGhlIGNoYXJhY3RlcnMKKyAgLy8vIHRoYXQgbWFrZSB1cCB0aGUgbGV4ZWQgdG9rZW4gY2FuIGJlIGZvdW5kLiAgVGhpcyBzaG91bGQgbm90IGdlbmVyYWxseQorICAvLy8gYmUgdXNlZCBieSBjbGllbnRzLgorICBTb3VyY2VMb2NhdGlvbiBnZXRJbW1lZGlhdGVTcGVsbGluZ0xvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRm9ybSBhIFNvdXJjZUxvY2F0aW9uIGZyb20gYSBGaWxlSUQgYW5kIE9mZnNldCBwYWlyLgorICBTb3VyY2VMb2NhdGlvbiBnZXRDb21wb3NlZExvYyhGaWxlSUQgRklELCB1bnNpZ25lZCBPZmZzZXQpIGNvbnN0IHsKKyAgICBib29sIEludmFsaWQgPSBmYWxzZTsKKyAgICBjb25zdCBTcmNNZ3I6OlNMb2NFbnRyeSAmRW50cnkgPSBnZXRTTG9jRW50cnkoRklELCAmSW52YWxpZCk7CisgICAgaWYgKEludmFsaWQpCisgICAgICByZXR1cm4gU291cmNlTG9jYXRpb24oKTsKKworICAgIHVuc2lnbmVkIEdsb2JhbE9mZnNldCA9IEVudHJ5LmdldE9mZnNldCgpICsgT2Zmc2V0OworICAgIHJldHVybiBFbnRyeS5pc0ZpbGUoKSA/IFNvdXJjZUxvY2F0aW9uOjpnZXRGaWxlTG9jKEdsb2JhbE9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTb3VyY2VMb2NhdGlvbjo6Z2V0TWFjcm9Mb2MoR2xvYmFsT2Zmc2V0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGVjb21wb3NlIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW50byBhIHJhdyBGaWxlSUQgKyBPZmZzZXQgcGFpci4KKyAgLy8vCisgIC8vLyBUaGUgZmlyc3QgZWxlbWVudCBpcyB0aGUgRmlsZUlELCB0aGUgc2Vjb25kIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUKKyAgLy8vIHN0YXJ0IG9mIHRoZSBidWZmZXIgb2YgdGhlIGxvY2F0aW9uLgorICBzdGQ6OnBhaXI8RmlsZUlELCB1bnNpZ25lZD4gZ2V0RGVjb21wb3NlZExvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0IHsKKyAgICBGaWxlSUQgRklEID0gZ2V0RmlsZUlEKExvYyk7CisgICAgYm9vbCBJbnZhbGlkID0gZmFsc2U7CisgICAgY29uc3QgU3JjTWdyOjpTTG9jRW50cnkgJkUgPSBnZXRTTG9jRW50cnkoRklELCAmSW52YWxpZCk7CisgICAgaWYgKEludmFsaWQpCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoRmlsZUlEKCksIDApOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihGSUQsIExvYy5nZXRPZmZzZXQoKS1FLmdldE9mZnNldCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGVjb21wb3NlIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW50byBhIHJhdyBGaWxlSUQgKyBPZmZzZXQgcGFpci4KKyAgLy8vCisgIC8vLyBJZiB0aGUgbG9jYXRpb24gaXMgYW4gZXhwYW5zaW9uIHJlY29yZCwgd2FsayB0aHJvdWdoIGl0IHVudGlsIHdlIGZpbmQKKyAgLy8vIHRoZSBmaW5hbCBsb2NhdGlvbiBleHBhbmRlZC4KKyAgc3RkOjpwYWlyPEZpbGVJRCwgdW5zaWduZWQ+CisgIGdldERlY29tcG9zZWRFeHBhbnNpb25Mb2MoU291cmNlTG9jYXRpb24gTG9jKSBjb25zdCB7CisgICAgRmlsZUlEIEZJRCA9IGdldEZpbGVJRChMb2MpOworICAgIGJvb2wgSW52YWxpZCA9IGZhbHNlOworICAgIGNvbnN0IFNyY01ncjo6U0xvY0VudHJ5ICpFID0gJmdldFNMb2NFbnRyeShGSUQsICZJbnZhbGlkKTsKKyAgICBpZiAoSW52YWxpZCkKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihGaWxlSUQoKSwgMCk7CisKKyAgICB1bnNpZ25lZCBPZmZzZXQgPSBMb2MuZ2V0T2Zmc2V0KCktRS0+Z2V0T2Zmc2V0KCk7CisgICAgaWYgKExvYy5pc0ZpbGVJRCgpKQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEZJRCwgT2Zmc2V0KTsKKworICAgIHJldHVybiBnZXREZWNvbXBvc2VkRXhwYW5zaW9uTG9jU2xvd0Nhc2UoRSk7CisgIH0KKworICAvLy8gXGJyaWVmIERlY29tcG9zZSB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGludG8gYSByYXcgRmlsZUlEICsgT2Zmc2V0IHBhaXIuCisgIC8vLworICAvLy8gSWYgdGhlIGxvY2F0aW9uIGlzIGFuIGV4cGFuc2lvbiByZWNvcmQsIHdhbGsgdGhyb3VnaCBpdCB1bnRpbCB3ZSBmaW5kCisgIC8vLyBpdHMgc3BlbGxpbmcgcmVjb3JkLgorICBzdGQ6OnBhaXI8RmlsZUlELCB1bnNpZ25lZD4KKyAgZ2V0RGVjb21wb3NlZFNwZWxsaW5nTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3QgeworICAgIEZpbGVJRCBGSUQgPSBnZXRGaWxlSUQoTG9jKTsKKyAgICBib29sIEludmFsaWQgPSBmYWxzZTsKKyAgICBjb25zdCBTcmNNZ3I6OlNMb2NFbnRyeSAqRSA9ICZnZXRTTG9jRW50cnkoRklELCAmSW52YWxpZCk7CisgICAgaWYgKEludmFsaWQpCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoRmlsZUlEKCksIDApOworCisgICAgdW5zaWduZWQgT2Zmc2V0ID0gTG9jLmdldE9mZnNldCgpLUUtPmdldE9mZnNldCgpOworICAgIGlmIChMb2MuaXNGaWxlSUQoKSkKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihGSUQsIE9mZnNldCk7CisgICAgcmV0dXJuIGdldERlY29tcG9zZWRTcGVsbGluZ0xvY1Nsb3dDYXNlKEUsIE9mZnNldCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlICJpbmNsdWRlZC9leHBhbmRlZCBpbiIgZGVjb21wb3NlZCBsb2NhdGlvbiBvZiB0aGUgZ2l2ZW4KKyAgLy8vIEZpbGVJRC4KKyAgc3RkOjpwYWlyPEZpbGVJRCwgdW5zaWduZWQ+IGdldERlY29tcG9zZWRJbmNsdWRlZExvYyhGaWxlSUQgRklEKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZSB0aGF0IHRoZQorICAvLy8gc3BlY2lmaWVkIFNvdXJjZUxvY2F0aW9uIHJlcHJlc2VudHMuCisgIC8vLworICAvLy8gVGhpcyBpcyBub3QgdmVyeSBtZWFuaW5nZnVsIGZvciBhIG1hY3JvIElELgorICB1bnNpZ25lZCBnZXRGaWxlT2Zmc2V0KFNvdXJjZUxvY2F0aW9uIFNwZWxsaW5nTG9jKSBjb25zdCB7CisgICAgcmV0dXJuIGdldERlY29tcG9zZWRMb2MoU3BlbGxpbmdMb2MpLnNlY29uZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gc291cmNlIGxvY2F0aW9uIHJlcHJlc2VudHMgYSBtYWNybworICAvLy8gYXJndW1lbnQncyBleHBhbnNpb24gaW50byB0aGUgZnVuY3Rpb24tbGlrZSBtYWNybyBkZWZpbml0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBJZiBub24tbnVsbCBhbmQgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCBpdCBpcyBzZXQgdG8gdGhlCisgIC8vLyBzdGFydCBsb2NhdGlvbiBvZiB0aGUgbWFjcm8gYXJndW1lbnQgZXhwYW5zaW9uLgorICAvLy8KKyAgLy8vIFN1Y2ggc291cmNlIGxvY2F0aW9ucyBvbmx5IGFwcGVhciBpbnNpZGUgb2YgdGhlIGV4cGFuc2lvbgorICAvLy8gbG9jYXRpb25zIHJlcHJlc2VudGluZyB3aGVyZSBhIHBhcnRpY3VsYXIgZnVuY3Rpb24tbGlrZSBtYWNybyB3YXMKKyAgLy8vIGV4cGFuZGVkLgorICBib29sIGlzTWFjcm9BcmdFeHBhbnNpb24oU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gKlN0YXJ0TG9jID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiBzb3VyY2UgbG9jYXRpb24gcmVwcmVzZW50cyB0aGUgZXhwYW5zaW9uIG9mCisgIC8vLyBhIG1hY3JvIGJvZHkuCisgIC8vLworICAvLy8gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRlc3Rpbmcgd2hldGhlciB0aGUgbG9jYXRpb24gaXMgcGFydCBvZiBhIG1hY3JvCisgIC8vLyBleHBhbnNpb24gYnV0IG5vdCB0aGUgZXhwYW5zaW9uIG9mIGFuIGFyZ3VtZW50IHRvIGEgZnVuY3Rpb24tbGlrZSBtYWNyby4KKyAgYm9vbCBpc01hY3JvQm9keUV4cGFuc2lvbihTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBNYWNyb0lEIGxvY2F0aW9uIHBvaW50cyBhdCB0aGUgYmVnaW5uaW5nCisgIC8vLyBvZiB0aGUgaW1tZWRpYXRlIG1hY3JvIGV4cGFuc2lvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gTWFjcm9CZWdpbiBJZiBub24tbnVsbCBhbmQgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCBpdCBpcyBzZXQgdG8gdGhlCisgIC8vLyBiZWdpbiBsb2NhdGlvbiBvZiB0aGUgaW1tZWRpYXRlIG1hY3JvIGV4cGFuc2lvbi4KKyAgYm9vbCBpc0F0U3RhcnRPZkltbWVkaWF0ZU1hY3JvRXhwYW5zaW9uKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICpNYWNyb0JlZ2luID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIE1hY3JvSUQgbG9jYXRpb24gcG9pbnRzIGF0IHRoZSBjaGFyYWN0ZXIKKyAgLy8vIGVuZCBvZiB0aGUgaW1tZWRpYXRlIG1hY3JvIGV4cGFuc2lvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gTWFjcm9FbmQgSWYgbm9uLW51bGwgYW5kIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgaXQgaXMgc2V0IHRvIHRoZQorICAvLy8gY2hhcmFjdGVyIGVuZCBsb2NhdGlvbiBvZiB0aGUgaW1tZWRpYXRlIG1hY3JvIGV4cGFuc2lvbi4KKyAgYm9vbAorICBpc0F0RW5kT2ZJbW1lZGlhdGVNYWNyb0V4cGFuc2lvbihTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICpNYWNyb0VuZCA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIFxwIExvYyBpcyBpbnNpZGUgdGhlIFtccCBTdGFydCwgK1xwIExlbmd0aCkKKyAgLy8vIGNodW5rIG9mIHRoZSBzb3VyY2UgbG9jYXRpb24gYWRkcmVzcyBzcGFjZS4KKyAgLy8vCisgIC8vLyBJZiBpdCdzIHRydWUgYW5kIFxwIFJlbGF0aXZlT2Zmc2V0IGlzIG5vbi1udWxsLCBpdCB3aWxsIGJlIHNldCB0byB0aGUKKyAgLy8vIHJlbGF0aXZlIG9mZnNldCBvZiBccCBMb2MgaW5zaWRlIHRoZSBjaHVuay4KKyAgYm9vbCBpc0luU0xvY0FkZHJTcGFjZShTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnQsIHVuc2lnbmVkIExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqUmVsYXRpdmVPZmZzZXQgPSBudWxscHRyKSBjb25zdCB7CisgICAgYXNzZXJ0KCgoU3RhcnQuZ2V0T2Zmc2V0KCkgPCBOZXh0TG9jYWxPZmZzZXQgJiYKKyAgICAgICAgICAgICAgIFN0YXJ0LmdldE9mZnNldCgpK0xlbmd0aCA8PSBOZXh0TG9jYWxPZmZzZXQpIHx8CisgICAgICAgICAgICAoU3RhcnQuZ2V0T2Zmc2V0KCkgPj0gQ3VycmVudExvYWRlZE9mZnNldCAmJgorICAgICAgICAgICAgICAgIFN0YXJ0LmdldE9mZnNldCgpK0xlbmd0aCA8IE1heExvYWRlZE9mZnNldCkpICYmCisgICAgICAgICAgICJDaHVuayBpcyBub3QgdmFsaWQgU0xvYyBhZGRyZXNzIHNwYWNlIik7CisgICAgdW5zaWduZWQgTG9jT2ZmcyA9IExvYy5nZXRPZmZzZXQoKTsKKyAgICB1bnNpZ25lZCBCZWdpbk9mZnMgPSBTdGFydC5nZXRPZmZzZXQoKTsKKyAgICB1bnNpZ25lZCBFbmRPZmZzID0gQmVnaW5PZmZzICsgTGVuZ3RoOworICAgIGlmIChMb2NPZmZzID49IEJlZ2luT2ZmcyAmJiBMb2NPZmZzIDwgRW5kT2ZmcykgeworICAgICAgaWYgKFJlbGF0aXZlT2Zmc2V0KQorICAgICAgICAqUmVsYXRpdmVPZmZzZXQgPSBMb2NPZmZzIC0gQmVnaW5PZmZzOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBib3RoIFxwIExIUyBhbmQgXHAgUkhTIGFyZSBpbiB0aGUgbG9jYWwgc291cmNlCisgIC8vLyBsb2NhdGlvbiBhZGRyZXNzIHNwYWNlIG9yIHRoZSBsb2FkZWQgb25lLgorICAvLy8KKyAgLy8vIElmIGl0J3MgdHJ1ZSBhbmQgXHAgUmVsYXRpdmVPZmZzZXQgaXMgbm9uLW51bGwsIGl0IHdpbGwgYmUgc2V0IHRvIHRoZQorICAvLy8gb2Zmc2V0IG9mIFxwIFJIUyByZWxhdGl2ZSB0byBccCBMSFMuCisgIGJvb2wgaXNJblNhbWVTTG9jQWRkclNwYWNlKFNvdXJjZUxvY2F0aW9uIExIUywgU291cmNlTG9jYXRpb24gUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKlJlbGF0aXZlT2Zmc2V0KSBjb25zdCB7CisgICAgdW5zaWduZWQgTEhTT2ZmcyA9IExIUy5nZXRPZmZzZXQoKSwgUkhTT2ZmcyA9IFJIUy5nZXRPZmZzZXQoKTsKKyAgICBib29sIExIU0xvYWRlZCA9IExIU09mZnMgPj0gQ3VycmVudExvYWRlZE9mZnNldDsKKyAgICBib29sIFJIU0xvYWRlZCA9IFJIU09mZnMgPj0gQ3VycmVudExvYWRlZE9mZnNldDsKKworICAgIGlmIChMSFNMb2FkZWQgPT0gUkhTTG9hZGVkKSB7CisgICAgICBpZiAoUmVsYXRpdmVPZmZzZXQpCisgICAgICAgICpSZWxhdGl2ZU9mZnNldCA9IFJIU09mZnMgLSBMSFNPZmZzOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFF1ZXJpZXMgYWJvdXQgdGhlIGNvZGUgYXQgYSBTb3VyY2VMb2NhdGlvbi4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uCisgIC8vLyBpbiB0aGUgYXBwcm9wcmlhdGUgc3BlbGxpbmcgTWVtb3J5QnVmZmVyLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJbnZhbGlkIElmIG5vbi1OVUxMLCB3aWxsIGJlIHNldCBcYyB0cnVlIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgY29uc3QgY2hhciAqZ2V0Q2hhcmFjdGVyRGF0YShTb3VyY2VMb2NhdGlvbiBTTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpJbnZhbGlkID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGNvbHVtbiAjIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUgcG9zaXRpb24uCisgIC8vLworICAvLy8gVGhpcyBpcyBzaWduaWZpY2FudGx5IGNoZWFwZXIgdG8gY29tcHV0ZSB0aGFuIHRoZSBsaW5lIG51bWJlci4gIFRoaXMKKyAgLy8vIHJldHVybnMgemVybyBpZiB0aGUgY29sdW1uIG51bWJlciBpc24ndCBrbm93bi4gIFRoaXMgbWF5IG9ubHkgYmUgY2FsbGVkCisgIC8vLyBvbiBhIGZpbGUgc2xvYywgc28geW91IG11c3QgY2hvb3NlIGEgc3BlbGxpbmcgb3IgZXhwYW5zaW9uIGxvY2F0aW9uCisgIC8vLyBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgdW5zaWduZWQgZ2V0Q29sdW1uTnVtYmVyKEZpbGVJRCBGSUQsIHVuc2lnbmVkIEZpbGVQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpJbnZhbGlkID0gbnVsbHB0cikgY29uc3Q7CisgIHVuc2lnbmVkIGdldFNwZWxsaW5nQ29sdW1uTnVtYmVyKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqSW52YWxpZCA9IG51bGxwdHIpIGNvbnN0OworICB1bnNpZ25lZCBnZXRFeHBhbnNpb25Db2x1bW5OdW1iZXIoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqSW52YWxpZCA9IG51bGxwdHIpIGNvbnN0OworICB1bnNpZ25lZCBnZXRQcmVzdW1lZENvbHVtbk51bWJlcihTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKkludmFsaWQgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdpdmVuIGEgU291cmNlTG9jYXRpb24sIHJldHVybiB0aGUgc3BlbGxpbmcgbGluZSBudW1iZXIKKyAgLy8vIGZvciB0aGUgcG9zaXRpb24gaW5kaWNhdGVkLgorICAvLy8KKyAgLy8vIFRoaXMgcmVxdWlyZXMgYnVpbGRpbmcgYW5kIGNhY2hpbmcgYSB0YWJsZSBvZiBsaW5lIG9mZnNldHMgZm9yIHRoZQorICAvLy8gTWVtb3J5QnVmZmVyLCBzbyB0aGlzIGlzIG5vdCBjaGVhcDogdXNlIG9ubHkgd2hlbiBhYm91dCB0byBlbWl0IGEKKyAgLy8vIGRpYWdub3N0aWMuCisgIHVuc2lnbmVkIGdldExpbmVOdW1iZXIoRmlsZUlEIEZJRCwgdW5zaWduZWQgRmlsZVBvcywgYm9vbCAqSW52YWxpZCA9IG51bGxwdHIpIGNvbnN0OworICB1bnNpZ25lZCBnZXRTcGVsbGluZ0xpbmVOdW1iZXIoU291cmNlTG9jYXRpb24gTG9jLCBib29sICpJbnZhbGlkID0gbnVsbHB0cikgY29uc3Q7CisgIHVuc2lnbmVkIGdldEV4cGFuc2lvbkxpbmVOdW1iZXIoU291cmNlTG9jYXRpb24gTG9jLCBib29sICpJbnZhbGlkID0gbnVsbHB0cikgY29uc3Q7CisgIHVuc2lnbmVkIGdldFByZXN1bWVkTGluZU51bWJlcihTb3VyY2VMb2NhdGlvbiBMb2MsIGJvb2wgKkludmFsaWQgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZmlsZW5hbWUgb3IgYnVmZmVyIGlkZW50aWZpZXIgb2YgdGhlIGJ1ZmZlciB0aGUKKyAgLy8vIGxvY2F0aW9uIGlzIGluLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIG5hbWUgZG9lcyBub3QgcmVzcGVjdCBcI2xpbmUgZGlyZWN0aXZlcy4gIFVzZQorICAvLy8gZ2V0UHJlc3VtZWRMb2MgZm9yIG5vcm1hbCBjbGllbnRzLgorICBTdHJpbmdSZWYgZ2V0QnVmZmVyTmFtZShTb3VyY2VMb2NhdGlvbiBMb2MsIGJvb2wgKkludmFsaWQgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZmlsZSBjaGFyYWN0ZXJpc3RpYyBvZiB0aGUgc3BlY2lmaWVkIHNvdXJjZQorICAvLy8gbG9jYXRpb24sIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGlzIGEgbm9ybWFsIGZpbGUsIGEgc3lzdGVtCisgIC8vLyBoZWFkZXIsIG9yIGFuICJpbXBsaWNpdCBleHRlcm4gQyIgc3lzdGVtIGhlYWRlci4KKyAgLy8vCisgIC8vLyBUaGlzIHN0YXRlIGNhbiBiZSBtb2RpZmllZCB3aXRoIGZsYWdzIG9uIEdOVSBsaW5lbWFya2VyIGRpcmVjdGl2ZXMgbGlrZToKKyAgLy8vIFxjb2RlCisgIC8vLyAgICMgNCAiZm9vLmgiIDMKKyAgLy8vIFxlbmRjb2RlCisgIC8vLyB3aGljaCBjaGFuZ2VzIGFsbCBzb3VyY2UgbG9jYXRpb25zIGluIHRoZSBjdXJyZW50IGZpbGUgYWZ0ZXIgdGhhdCB0byBiZQorICAvLy8gY29uc2lkZXJlZCB0byBiZSBmcm9tIGEgc3lzdGVtIGhlYWRlci4KKyAgU3JjTWdyOjpDaGFyYWN0ZXJpc3RpY0tpbmQgZ2V0RmlsZUNoYXJhY3RlcmlzdGljKFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSAicHJlc3VtZWQiIGxvY2F0aW9uIG9mIGEgU291cmNlTG9jYXRpb24gc3BlY2lmaWVzLgorICAvLy8KKyAgLy8vIEEgInByZXN1bWVkIGxvY2F0aW9uIiBjYW4gYmUgbW9kaWZpZWQgYnkgXCNsaW5lIG9yIEdOVSBsaW5lIG1hcmtlcgorICAvLy8gZGlyZWN0aXZlcy4gIFRoaXMgcHJvdmlkZXMgYSB2aWV3IG9uIHRoZSBkYXRhIHRoYXQgYSB1c2VyIHNob3VsZCBzZWUKKyAgLy8vIGluIGRpYWdub3N0aWNzLCBmb3IgZXhhbXBsZS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgYSBwcmVzdW1lZCBsb2NhdGlvbiBpcyBhbHdheXMgZ2l2ZW4gYXMgdGhlIGV4cGFuc2lvbiBwb2ludCBvZgorICAvLy8gYW4gZXhwYW5zaW9uIGxvY2F0aW9uLCBub3QgYXQgdGhlIHNwZWxsaW5nIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSBwcmVzdW1lZCBsb2NhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFNvdXJjZUxvY2F0aW9uLiBJZiB0aGUKKyAgLy8vIHByZXN1bWVkIGxvY2F0aW9uIGNhbm5vdCBiZSBjYWxjdWxhdGVkIChlLmcuLCBiZWNhdXNlIFxwIExvYyBpcyBpbnZhbGlkCisgIC8vLyBvciB0aGUgZmlsZSBjb250YWluaW5nIFxwIExvYyBoYXMgY2hhbmdlZCBvbiBkaXNrKSwgcmV0dXJucyBhbiBpbnZhbGlkCisgIC8vLyBwcmVzdW1lZCBsb2NhdGlvbi4KKyAgUHJlc3VtZWRMb2MgZ2V0UHJlc3VtZWRMb2MoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVzZUxpbmVEaXJlY3RpdmVzID0gdHJ1ZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHdoZXRoZXIgdGhlIFByZXN1bWVkTG9jIGZvciBhIGdpdmVuIFNvdXJjZUxvY2F0aW9uIGlzIAorICAvLy8gaW4gdGhlIG1haW4gZmlsZS4KKyAgLy8vCisgIC8vLyBUaGlzIGNvbXB1dGVzIHRoZSAicHJlc3VtZWQiIGxvY2F0aW9uIGZvciBhIFNvdXJjZUxvY2F0aW9uLCB0aGVuIGNoZWNrcworICAvLy8gd2hldGhlciBpdCBjYW1lIGZyb20gYSBmaWxlIG90aGVyIHRoYW4gdGhlIG1haW4gZmlsZS4gVGhpcyBpcyBkaWZmZXJlbnQKKyAgLy8vIGZyb20gaXNXcml0dGVuSW5NYWluRmlsZSgpIGJlY2F1c2UgaXQgdGFrZXMgbGluZSBtYXJrZXIgZGlyZWN0aXZlcyBpbnRvCisgIC8vLyBhY2NvdW50LgorICBib29sIGlzSW5NYWluRmlsZShTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVsbGluZyBsb2NhdGlvbnMgZm9yIGJvdGggU291cmNlTG9jYXRpb25zCisgIC8vLyBhcmUgcGFydCBvZiB0aGUgc2FtZSBmaWxlIGJ1ZmZlci4KKyAgLy8vCisgIC8vLyBUaGlzIGNoZWNrIGlnbm9yZXMgbGluZSBtYXJrZXIgZGlyZWN0aXZlcy4KKyAgYm9vbCBpc1dyaXR0ZW5JblNhbWVGaWxlKFNvdXJjZUxvY2F0aW9uIExvYzEsIFNvdXJjZUxvY2F0aW9uIExvYzIpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RmlsZUlEKExvYzEpID09IGdldEZpbGVJRChMb2MyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVsbGluZyBsb2NhdGlvbiBmb3IgdGhlIGdpdmVuIGxvY2F0aW9uCisgIC8vLyBpcyBpbiB0aGUgbWFpbiBmaWxlIGJ1ZmZlci4KKyAgLy8vCisgIC8vLyBUaGlzIGNoZWNrIGlnbm9yZXMgbGluZSBtYXJrZXIgZGlyZWN0aXZlcy4KKyAgYm9vbCBpc1dyaXR0ZW5Jbk1haW5GaWxlKFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3QgeworICAgIHJldHVybiBnZXRGaWxlSUQoTG9jKSA9PSBnZXRNYWluRmlsZUlEKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgaWYgYSBTb3VyY2VMb2NhdGlvbiBpcyBpbiBhIHN5c3RlbSBoZWFkZXIuCisgIGJvb2wgaXNJblN5c3RlbUhlYWRlcihTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNTeXN0ZW0oZ2V0RmlsZUNoYXJhY3RlcmlzdGljKExvYykpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGlmIGEgU291cmNlTG9jYXRpb24gaXMgaW4gYW4gImV4dGVybiBDIiBzeXN0ZW0gaGVhZGVyLgorICBib29sIGlzSW5FeHRlcm5DU3lzdGVtSGVhZGVyKFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3QgeworICAgIHJldHVybiBnZXRGaWxlQ2hhcmFjdGVyaXN0aWMoTG9jKSA9PSBTcmNNZ3I6OkNfRXh0ZXJuQ1N5c3RlbTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB3aGV0aGVyIFxwIExvYyBpcyBleHBhbmRlZCBmcm9tIGEgbWFjcm8gaW4gYSBzeXN0ZW0gaGVhZGVyLgorICBib29sIGlzSW5TeXN0ZW1NYWNybyhTb3VyY2VMb2NhdGlvbiBsb2MpIGNvbnN0IHsKKyAgICByZXR1cm4gbG9jLmlzTWFjcm9JRCgpICYmIGlzSW5TeXN0ZW1IZWFkZXIoZ2V0U3BlbGxpbmdMb2MobG9jKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFRoZSBzaXplIG9mIHRoZSBTTG9jRW50cnkgdGhhdCBccCBGSUQgcmVwcmVzZW50cy4KKyAgdW5zaWduZWQgZ2V0RmlsZUlEU2l6ZShGaWxlSUQgRklEKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdpdmVuIGEgc3BlY2lmaWMgRmlsZUlELCByZXR1cm5zIHRydWUgaWYgXHAgTG9jIGlzIGluc2lkZSB0aGF0CisgIC8vLyBGaWxlSUQgY2h1bmsgYW5kIHNldHMgcmVsYXRpdmUgb2Zmc2V0IChvZmZzZXQgb2YgXHAgTG9jIGZyb20gYmVnaW5uaW5nCisgIC8vLyBvZiBGaWxlSUQpIHRvIFxwIHJlbGF0aXZlT2Zmc2V0LgorICBib29sIGlzSW5GaWxlSUQoU291cmNlTG9jYXRpb24gTG9jLCBGaWxlSUQgRklELAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKlJlbGF0aXZlT2Zmc2V0ID0gbnVsbHB0cikgY29uc3QgeworICAgIHVuc2lnbmVkIE9mZnMgPSBMb2MuZ2V0T2Zmc2V0KCk7CisgICAgaWYgKGlzT2Zmc2V0SW5GaWxlSUQoRklELCBPZmZzKSkgeworICAgICAgaWYgKFJlbGF0aXZlT2Zmc2V0KQorICAgICAgICAqUmVsYXRpdmVPZmZzZXQgPSBPZmZzIC0gZ2V0U0xvY0VudHJ5KEZJRCkuZ2V0T2Zmc2V0KCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTGluZSBUYWJsZSBNYW5pcHVsYXRpb24gUm91dGluZXMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHVuaXF1ZWQgSUQgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZW5hbWUuCisgIHVuc2lnbmVkIGdldExpbmVUYWJsZUZpbGVuYW1lSUQoU3RyaW5nUmVmIFN0cik7CisKKyAgLy8vIFxicmllZiBBZGQgYSBsaW5lIG5vdGUgdG8gdGhlIGxpbmUgdGFibGUgZm9yIHRoZSBGaWxlSUQgYW5kIG9mZnNldAorICAvLy8gc3BlY2lmaWVkIGJ5IExvYy4KKyAgLy8vCisgIC8vLyBJZiBGaWxlbmFtZUlEIGlzIC0xLCBpdCBpcyBjb25zaWRlcmVkIHRvIGJlIHVuc3BlY2lmaWVkLgorICB2b2lkIEFkZExpbmVOb3RlKFNvdXJjZUxvY2F0aW9uIExvYywgdW5zaWduZWQgTGluZU5vLCBpbnQgRmlsZW5hbWVJRCwKKyAgICAgICAgICAgICAgICAgICBib29sIElzRmlsZUVudHJ5LCBib29sIElzRmlsZUV4aXQsCisgICAgICAgICAgICAgICAgICAgU3JjTWdyOjpDaGFyYWN0ZXJpc3RpY0tpbmQgRmlsZUtpbmQpOworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBzb3VyY2UgbWFuYWdlciBoYXMgYSBsaW5lIHRhYmxlLgorICBib29sIGhhc0xpbmVUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIExpbmVUYWJsZSAhPSBudWxscHRyOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc3RvcmVkIGxpbmUgdGFibGUuCisgIExpbmVUYWJsZUluZm8gJmdldExpbmVUYWJsZSgpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBRdWVyaWVzIGZvciBwZXJmb3JtYW5jZSBhbmFseXNpcy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHRvdGFsIGFtb3VudCBvZiBwaHlzaWNhbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZQorICAvLy8gQ29udGVudENhY2hlIGFsbG9jYXRvci4KKyAgc2l6ZV90IGdldENvbnRlbnRDYWNoZVNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnRlbnRDYWNoZUFsbG9jLmdldFRvdGFsTWVtb3J5KCk7CisgIH0KKworICBzdHJ1Y3QgTWVtb3J5QnVmZmVyU2l6ZXMgeworICAgIGNvbnN0IHNpemVfdCBtYWxsb2NfYnl0ZXM7CisgICAgY29uc3Qgc2l6ZV90IG1tYXBfYnl0ZXM7CisKKyAgICBNZW1vcnlCdWZmZXJTaXplcyhzaXplX3QgbWFsbG9jX2J5dGVzLCBzaXplX3QgbW1hcF9ieXRlcykKKyAgICAgIDogbWFsbG9jX2J5dGVzKG1hbGxvY19ieXRlcyksIG1tYXBfYnl0ZXMobW1hcF9ieXRlcykge30KKyAgfTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkIGJ5IG1lbW9yeSBidWZmZXJzLCBicmVha2luZyBkb3duCisgIC8vLyBieSBoZWFwLWJhY2tlZCB2ZXJzdXMgbW1hcCdlZCBtZW1vcnkuCisgIE1lbW9yeUJ1ZmZlclNpemVzIGdldE1lbW9yeUJ1ZmZlclNpemVzKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBmb3IgdmFyaW91cyBzaWRlIHRhYmxlcyBhbmQKKyAgLy8vIGRhdGEgc3RydWN0dXJlcyBpbiB0aGUgU291cmNlTWFuYWdlci4KKyAgc2l6ZV90IGdldERhdGFTdHJ1Y3R1cmVTaXplcygpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBPdGhlciBtaXNjZWxsYW5lb3VzIG1ldGhvZHMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBzb3VyY2UgbG9jYXRpb24gZm9yIHRoZSBnaXZlbiBmaWxlOmxpbmU6Y29sIHRyaXBsZXQuCisgIC8vLworICAvLy8gSWYgdGhlIHNvdXJjZSBmaWxlIGlzIGluY2x1ZGVkIG11bHRpcGxlIHRpbWVzLCB0aGUgc291cmNlIGxvY2F0aW9uIHdpbGwKKyAgLy8vIGJlIGJhc2VkIHVwb24gdGhlIGZpcnN0IGluY2x1c2lvbi4KKyAgU291cmNlTG9jYXRpb24gdHJhbnNsYXRlRmlsZUxpbmVDb2woY29uc3QgRmlsZUVudHJ5ICpTb3VyY2VGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lLCB1bnNpZ25lZCBDb2wpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBGaWxlSUQgZm9yIHRoZSBnaXZlbiBmaWxlLgorICAvLy8KKyAgLy8vIElmIHRoZSBzb3VyY2UgZmlsZSBpcyBpbmNsdWRlZCBtdWx0aXBsZSB0aW1lcywgdGhlIEZpbGVJRCB3aWxsIGJlIHRoZQorICAvLy8gZmlyc3QgaW5jbHVzaW9uLgorICBGaWxlSUQgdHJhbnNsYXRlRmlsZShjb25zdCBGaWxlRW50cnkgKlNvdXJjZUZpbGUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBzb3VyY2UgbG9jYXRpb24gaW4gXHAgRklEIGZvciB0aGUgZ2l2ZW4gbGluZTpjb2wuCisgIC8vLyBSZXR1cm5zIG51bGwgbG9jYXRpb24gaWYgXHAgRklEIGlzIG5vdCBhIGZpbGUgU0xvY0VudHJ5LgorICBTb3VyY2VMb2NhdGlvbiB0cmFuc2xhdGVMaW5lQ29sKEZpbGVJRCBGSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZSwgdW5zaWduZWQgQ29sKSBjb25zdDsKKworICAvLy8gXGJyaWVmIElmIFxwIExvYyBwb2ludHMgaW5zaWRlIGEgZnVuY3Rpb24gbWFjcm8gYXJndW1lbnQsIHRoZSByZXR1cm5lZAorICAvLy8gbG9jYXRpb24gd2lsbCBiZSB0aGUgbWFjcm8gbG9jYXRpb24gaW4gd2hpY2ggdGhlIGFyZ3VtZW50IHdhcyBleHBhbmRlZC4KKyAgLy8vIElmIGEgbWFjcm8gYXJndW1lbnQgaXMgdXNlZCBtdWx0aXBsZSB0aW1lcywgdGhlIGV4cGFuZGVkIGxvY2F0aW9uIHdpbGwKKyAgLy8vIGJlIGF0IHRoZSBmaXJzdCBleHBhbnNpb24gb2YgdGhlIGFyZ3VtZW50LgorICAvLy8gZS5nLgorICAvLy8gICBNWV9NQUNSTyhmb28pOworICAvLy8gICAgICAgICAgICAgXgorICAvLy8gUGFzc2luZyBhIGZpbGUgbG9jYXRpb24gcG9pbnRpbmcgYXQgJ2ZvbycsIHdpbGwgeWllbGQgYSBtYWNybyBsb2NhdGlvbgorICAvLy8gd2hlcmUgJ2Zvbycgd2FzIGV4cGFuZGVkIGludG8uCisgIFNvdXJjZUxvY2F0aW9uIGdldE1hY3JvQXJnRXhwYW5kZWRMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB0aGUgb3JkZXIgb2YgMiBzb3VyY2UgbG9jYXRpb25zIGluIHRoZSB0cmFuc2xhdGlvbiB1bml0LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgTEhTIHNvdXJjZSBsb2NhdGlvbiBjb21lcyBiZWZvcmUgUkhTLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgaXNCZWZvcmVJblRyYW5zbGF0aW9uVW5pdChTb3VyY2VMb2NhdGlvbiBMSFMsIFNvdXJjZUxvY2F0aW9uIFJIUykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHR3byBkZWNvbXBvc2VkIHNvdXJjZSBsb2NhdGlvbiBpcyBpbiB0aGUKKyAgLy8vICAgICAgICBzYW1lIHRyYW5zbGF0aW9uIHVuaXQuIEFzIGEgYnlwcm9kdWN0LCBpdCBhbHNvIGNhbGN1bGF0ZXMgdGhlIG9yZGVyCisgIC8vLyAgICAgICAgb2YgdGhlIHNvdXJjZSBsb2NhdGlvbnMgaW4gY2FzZSB0aGV5IGFyZSBpbiB0aGUgc2FtZSBUVS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBQYWlyIG9mIGJvb2xzIHRoZSBmaXJzdCBjb21wb25lbnQgaXMgdHJ1ZSBpZiB0aGUgdHdvIGxvY2F0aW9ucworICAvLy8gICAgICAgICAgYXJlIGluIHRoZSBzYW1lIFRVLiBUaGUgc2Vjb25kIGJvb2wgaXMgdHJ1ZSBpZiB0aGUgZmlyc3QgaXMgdHJ1ZQorICAvLy8gICAgICAgICAgYW5kIFxwIExPZmZzIGlzIGJlZm9yZSBccCBST2Zmcy4KKyAgc3RkOjpwYWlyPGJvb2wsIGJvb2w+CisgIGlzSW5UaGVTYW1lVHJhbnNsYXRpb25Vbml0KHN0ZDo6cGFpcjxGaWxlSUQsIHVuc2lnbmVkPiAmTE9mZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxGaWxlSUQsIHVuc2lnbmVkPiAmUk9mZnMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB0aGUgb3JkZXIgb2YgMiBzb3VyY2UgbG9jYXRpb25zIGluIHRoZSAic291cmNlIGxvY2F0aW9uCisgIC8vLyBhZGRyZXNzIHNwYWNlIi4KKyAgYm9vbCBpc0JlZm9yZUluU0xvY0FkZHJTcGFjZShTb3VyY2VMb2NhdGlvbiBMSFMsIFNvdXJjZUxvY2F0aW9uIFJIUykgY29uc3QgeworICAgIHJldHVybiBpc0JlZm9yZUluU0xvY0FkZHJTcGFjZShMSFMsIFJIUy5nZXRPZmZzZXQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZXMgdGhlIG9yZGVyIG9mIGEgc291cmNlIGxvY2F0aW9uIGFuZCBhIHNvdXJjZSBsb2NhdGlvbgorICAvLy8gb2Zmc2V0IGluIHRoZSAic291cmNlIGxvY2F0aW9uIGFkZHJlc3Mgc3BhY2UiLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB3ZSBhbHdheXMgY29uc2lkZXIgc291cmNlIGxvY2F0aW9ucyBsb2FkZWQgZnJvbQorICBib29sIGlzQmVmb3JlSW5TTG9jQWRkclNwYWNlKFNvdXJjZUxvY2F0aW9uIExIUywgdW5zaWduZWQgUkhTKSBjb25zdCB7CisgICAgdW5zaWduZWQgTEhTT2Zmc2V0ID0gTEhTLmdldE9mZnNldCgpOworICAgIGJvb2wgTEhTTG9hZGVkID0gTEhTT2Zmc2V0ID49IEN1cnJlbnRMb2FkZWRPZmZzZXQ7CisgICAgYm9vbCBSSFNMb2FkZWQgPSBSSFMgPj0gQ3VycmVudExvYWRlZE9mZnNldDsKKyAgICBpZiAoTEhTTG9hZGVkID09IFJIU0xvYWRlZCkKKyAgICAgIHJldHVybiBMSFNPZmZzZXQgPCBSSFM7CisKKyAgICByZXR1cm4gTEhTTG9hZGVkOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBQb2ludCBpcyB3aXRoaW4gU3RhcnQgYW5kIEVuZC4KKyAgYm9vbCBpc1BvaW50V2l0aGluKFNvdXJjZUxvY2F0aW9uIExvY2F0aW9uLCBTb3VyY2VMb2NhdGlvbiBTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZCkgY29uc3QgeworICAgIHJldHVybiBMb2NhdGlvbiA9PSBTdGFydCB8fCBMb2NhdGlvbiA9PSBFbmQgfHwKKyAgICAgICAgICAgKGlzQmVmb3JlSW5UcmFuc2xhdGlvblVuaXQoU3RhcnQsIExvY2F0aW9uKSAmJgorICAgICAgICAgICAgaXNCZWZvcmVJblRyYW5zbGF0aW9uVW5pdChMb2NhdGlvbiwgRW5kKSk7CisgIH0KKworICAvLyBJdGVyYXRvcnMgb3ZlciBGaWxlSW5mb3MuCisgIHVzaW5nIGZpbGVpbmZvX2l0ZXJhdG9yID0KKyAgICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IEZpbGVFbnRyeSosIFNyY01ncjo6Q29udGVudENhY2hlKj46OmNvbnN0X2l0ZXJhdG9yOworCisgIGZpbGVpbmZvX2l0ZXJhdG9yIGZpbGVpbmZvX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gRmlsZUluZm9zLmJlZ2luKCk7IH0KKyAgZmlsZWluZm9faXRlcmF0b3IgZmlsZWluZm9fZW5kKCkgY29uc3QgeyByZXR1cm4gRmlsZUluZm9zLmVuZCgpOyB9CisgIGJvb2wgaGFzRmlsZUluZm8oY29uc3QgRmlsZUVudHJ5ICpGaWxlKSBjb25zdCB7CisgICAgcmV0dXJuIEZpbGVJbmZvcy5maW5kKEZpbGUpICE9IEZpbGVJbmZvcy5lbmQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUHJpbnQgc3RhdGlzdGljcyB0byBzdGRlcnIuCisgIHZvaWQgUHJpbnRTdGF0cygpIGNvbnN0OworCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgbG9jYWwgU0xvY0VudHJpZXMgd2UgaGF2ZS4KKyAgdW5zaWduZWQgbG9jYWxfc2xvY19lbnRyeV9zaXplKCkgY29uc3QgeyByZXR1cm4gTG9jYWxTTG9jRW50cnlUYWJsZS5zaXplKCk7IH0KKworICAvLy8gXGJyaWVmIEdldCBhIGxvY2FsIFNMb2NFbnRyeS4gVGhpcyBpcyBleHBvc2VkIGZvciBpbmRleGluZy4KKyAgY29uc3QgU3JjTWdyOjpTTG9jRW50cnkgJmdldExvY2FsU0xvY0VudHJ5KHVuc2lnbmVkIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqSW52YWxpZCA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICBhc3NlcnQoSW5kZXggPCBMb2NhbFNMb2NFbnRyeVRhYmxlLnNpemUoKSAmJiAiSW52YWxpZCBpbmRleCIpOworICAgIHJldHVybiBMb2NhbFNMb2NFbnRyeVRhYmxlW0luZGV4XTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgbG9hZGVkIFNMb2NFbnRyaWVzIHdlIGhhdmUuCisgIHVuc2lnbmVkIGxvYWRlZF9zbG9jX2VudHJ5X3NpemUoKSBjb25zdCB7IHJldHVybiBMb2FkZWRTTG9jRW50cnlUYWJsZS5zaXplKCk7fQorCisgIC8vLyBcYnJpZWYgR2V0IGEgbG9hZGVkIFNMb2NFbnRyeS4gVGhpcyBpcyBleHBvc2VkIGZvciBpbmRleGluZy4KKyAgY29uc3QgU3JjTWdyOjpTTG9jRW50cnkgJmdldExvYWRlZFNMb2NFbnRyeSh1bnNpZ25lZCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpJbnZhbGlkID0gbnVsbHB0cikgY29uc3QgeworICAgIGFzc2VydChJbmRleCA8IExvYWRlZFNMb2NFbnRyeVRhYmxlLnNpemUoKSAmJiAiSW52YWxpZCBpbmRleCIpOworICAgIGlmIChTTG9jRW50cnlMb2FkZWRbSW5kZXhdKQorICAgICAgcmV0dXJuIExvYWRlZFNMb2NFbnRyeVRhYmxlW0luZGV4XTsKKyAgICByZXR1cm4gbG9hZFNMb2NFbnRyeShJbmRleCwgSW52YWxpZCk7CisgIH0KKworICBjb25zdCBTcmNNZ3I6OlNMb2NFbnRyeSAmZ2V0U0xvY0VudHJ5KEZpbGVJRCBGSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqSW52YWxpZCA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICBpZiAoRklELklEID09IDAgfHwgRklELklEID09IC0xKSB7CisgICAgICBpZiAoSW52YWxpZCkgKkludmFsaWQgPSB0cnVlOworICAgICAgcmV0dXJuIExvY2FsU0xvY0VudHJ5VGFibGVbMF07CisgICAgfQorICAgIHJldHVybiBnZXRTTG9jRW50cnlCeUlEKEZJRC5JRCwgSW52YWxpZCk7CisgIH0KKworICB1bnNpZ25lZCBnZXROZXh0TG9jYWxPZmZzZXQoKSBjb25zdCB7IHJldHVybiBOZXh0TG9jYWxPZmZzZXQ7IH0KKworICB2b2lkIHNldEV4dGVybmFsU0xvY0VudHJ5U291cmNlKEV4dGVybmFsU0xvY0VudHJ5U291cmNlICpTb3VyY2UpIHsKKyAgICBhc3NlcnQoTG9hZGVkU0xvY0VudHJ5VGFibGUuZW1wdHkoKSAmJgorICAgICAgICAgICAiSW52YWxpZGF0aW5nIGV4aXN0aW5nIGxvYWRlZCBlbnRyaWVzIik7CisgICAgRXh0ZXJuYWxTTG9jRW50cmllcyA9IFNvdXJjZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWxsb2NhdGUgYSBudW1iZXIgb2YgbG9hZGVkIFNMb2NFbnRyaWVzLCB3aGljaCB3aWxsIGJlIGFjdHVhbGx5CisgIC8vLyBsb2FkZWQgb24gZGVtYW5kIGZyb20gdGhlIGV4dGVybmFsIHNvdXJjZS4KKyAgLy8vCisgIC8vLyBOdW1TTG9jRW50cmllcyB3aWxsIGJlIGFsbG9jYXRlZCwgd2hpY2ggb2NjdXB5IGEgdG90YWwgb2YgVG90YWxTaXplIHNwYWNlCisgIC8vLyBpbiB0aGUgZ2xvYmFsIHNvdXJjZSB2aWV3LiBUaGUgbG93ZXN0IElEIGFuZCB0aGUgYmFzZSBvZmZzZXQgb2YgdGhlCisgIC8vLyBlbnRyaWVzIHdpbGwgYmUgcmV0dXJuZWQuCisgIHN0ZDo6cGFpcjxpbnQsIHVuc2lnbmVkPgorICBBbGxvY2F0ZUxvYWRlZFNMb2NFbnRyaWVzKHVuc2lnbmVkIE51bVNMb2NFbnRyaWVzLCB1bnNpZ25lZCBUb3RhbFNpemUpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIFxwIExvYyBjYW1lIGZyb20gYSBQQ0gvTW9kdWxlLgorICBib29sIGlzTG9hZGVkU291cmNlTG9jYXRpb24oU291cmNlTG9jYXRpb24gTG9jKSBjb25zdCB7CisgICAgcmV0dXJuIExvYy5nZXRPZmZzZXQoKSA+PSBDdXJyZW50TG9hZGVkT2Zmc2V0OworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgXHAgTG9jIGRpZCBub3QgY29tZSBmcm9tIGEgUENIL01vZHVsZS4KKyAgYm9vbCBpc0xvY2FsU291cmNlTG9jYXRpb24oU291cmNlTG9jYXRpb24gTG9jKSBjb25zdCB7CisgICAgcmV0dXJuIExvYy5nZXRPZmZzZXQoKSA8IE5leHRMb2NhbE9mZnNldDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIFxwIEZJRCBjYW1lIGZyb20gYSBQQ0gvTW9kdWxlLgorICBib29sIGlzTG9hZGVkRmlsZUlEKEZpbGVJRCBGSUQpIGNvbnN0IHsKKyAgICBhc3NlcnQoRklELklEICE9IC0xICYmICJVc2luZyBGaWxlSUQgc2VudGluZWwgdmFsdWUiKTsKKyAgICByZXR1cm4gRklELklEIDwgMDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIFxwIEZJRCBkaWQgbm90IGNvbWUgZnJvbSBhIFBDSC9Nb2R1bGUuCisgIGJvb2wgaXNMb2NhbEZpbGVJRChGaWxlSUQgRklEKSBjb25zdCB7CisgICAgcmV0dXJuICFpc0xvYWRlZEZpbGVJRChGSUQpOworICB9CisKKyAgLy8vIEdldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbW1lZGlhdGUgbWFjcm8gY2FsbGVyLCBvbmUgbGV2ZWwgdXAgdGhlIHN0YWNrCisgIC8vLyB0b3dhcmQgdGhlIGluaXRpYWwgbWFjcm8gdHlwZWQgaW50byB0aGUgc291cmNlLgorICBTb3VyY2VMb2NhdGlvbiBnZXRJbW1lZGlhdGVNYWNyb0NhbGxlckxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0IHsKKyAgICBpZiAoIUxvYy5pc01hY3JvSUQoKSkgcmV0dXJuIExvYzsKKworICAgIC8vIFdoZW4gd2UgaGF2ZSB0aGUgbG9jYXRpb24gb2YgKHBhcnQgb2YpIGFuIGV4cGFuZGVkIHBhcmFtZXRlciwgaXRzCisgICAgLy8gc3BlbGxpbmcgbG9jYXRpb24gcG9pbnRzIHRvIHRoZSBhcmd1bWVudCBhcyBleHBhbmRlZCBpbiB0aGUgbWFjcm8gY2FsbCwKKyAgICAvLyBhbmQgdGhlcmVmb3JlIGlzIHVzZWQgdG8gbG9jYXRlIHRoZSBtYWNybyBjYWxsZXIuCisgICAgaWYgKGlzTWFjcm9BcmdFeHBhbnNpb24oTG9jKSkKKyAgICAgIHJldHVybiBnZXRJbW1lZGlhdGVTcGVsbGluZ0xvYyhMb2MpOworCisgICAgLy8gT3RoZXJ3aXNlLCB0aGUgY2FsbGVyIG9mIHRoZSBtYWNybyBpcyBsb2NhdGVkIHdoZXJlIHRoaXMgbWFjcm8gaXMKKyAgICAvLyBleHBhbmRlZCAod2hpbGUgdGhlIHNwZWxsaW5nIGlzIHBhcnQgb2YgdGhlIG1hY3JvIGRlZmluaXRpb24pLgorICAgIHJldHVybiBnZXRJbW1lZGlhdGVFeHBhbnNpb25SYW5nZShMb2MpLmZpcnN0OworICB9CisKKyAgLy8vIFxyZXR1cm4gTG9jYXRpb24gb2YgdGhlIHRvcC1sZXZlbCBtYWNybyBjYWxsZXIuCisgIFNvdXJjZUxvY2F0aW9uIGdldFRvcE1hY3JvQ2FsbGVyTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3Q7CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBBU1RSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RXcml0ZXI7CisKKyAgbGx2bTo6TWVtb3J5QnVmZmVyICpnZXRGYWtlQnVmZmVyRm9yUmVjb3ZlcnkoKSBjb25zdDsKKyAgY29uc3QgU3JjTWdyOjpDb250ZW50Q2FjaGUgKmdldEZha2VDb250ZW50Q2FjaGVGb3JSZWNvdmVyeSgpIGNvbnN0OworCisgIGNvbnN0IFNyY01ncjo6U0xvY0VudHJ5ICZsb2FkU0xvY0VudHJ5KHVuc2lnbmVkIEluZGV4LCBib29sICpJbnZhbGlkKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gdW53cmFwcGVkIEZpbGVJRC4KKyAgY29uc3QgU3JjTWdyOjpTTG9jRW50cnkgJmdldFNMb2NFbnRyeUJ5SUQoaW50IElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpJbnZhbGlkID0gbnVsbHB0cikgY29uc3QgeworICAgIGFzc2VydChJRCAhPSAtMSAmJiAiVXNpbmcgRmlsZUlEIHNlbnRpbmVsIHZhbHVlIik7CisgICAgaWYgKElEIDwgMCkKKyAgICAgIHJldHVybiBnZXRMb2FkZWRTTG9jRW50cnlCeUlEKElELCBJbnZhbGlkKTsKKyAgICByZXR1cm4gZ2V0TG9jYWxTTG9jRW50cnkoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KElEKSwgSW52YWxpZCk7CisgIH0KKworICBjb25zdCBTcmNNZ3I6OlNMb2NFbnRyeSAmCisgIGdldExvYWRlZFNMb2NFbnRyeUJ5SUQoaW50IElELCBib29sICpJbnZhbGlkID0gbnVsbHB0cikgY29uc3QgeworICAgIHJldHVybiBnZXRMb2FkZWRTTG9jRW50cnkoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KC1JRCAtIDIpLCBJbnZhbGlkKTsKKyAgfQorCisgIC8vLyBJbXBsZW1lbnRzIHRoZSBjb21tb24gZWxlbWVudHMgb2Ygc3RvcmluZyBhbiBleHBhbnNpb24gaW5mbyBzdHJ1Y3QgaW50bworICAvLy8gdGhlIFNMb2NFbnRyeSB0YWJsZSBhbmQgcHJvZHVjaW5nIGEgc291cmNlIGxvY2F0aW9uIHRoYXQgcmVmZXJzIHRvIGl0LgorICBTb3VyY2VMb2NhdGlvbiBjcmVhdGVFeHBhbnNpb25Mb2NJbXBsKGNvbnN0IFNyY01ncjo6RXhwYW5zaW9uSW5mbyAmRXhwYW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFRva0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTG9hZGVkSUQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExvYWRlZE9mZnNldCA9IDApOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBGaWxlSUQgY29udGFpbnMgdGhlCisgIC8vLyBzcGVjaWZpZWQgU291cmNlTG9jYXRpb24gb2Zmc2V0LiAgVGhpcyBpcyBhIHZlcnkgaG90IG1ldGhvZC4KKyAgaW5saW5lIGJvb2wgaXNPZmZzZXRJbkZpbGVJRChGaWxlSUQgRklELCB1bnNpZ25lZCBTTG9jT2Zmc2V0KSBjb25zdCB7CisgICAgY29uc3QgU3JjTWdyOjpTTG9jRW50cnkgJkVudHJ5ID0gZ2V0U0xvY0VudHJ5KEZJRCk7CisgICAgLy8gSWYgdGhlIGVudHJ5IGlzIGFmdGVyIHRoZSBvZmZzZXQsIGl0IGNhbid0IGNvbnRhaW4gaXQuCisgICAgaWYgKFNMb2NPZmZzZXQgPCBFbnRyeS5nZXRPZmZzZXQoKSkgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWYgdGhpcyBpcyB0aGUgdmVyeSBsYXN0IGVudHJ5IHRoZW4gaXQgZG9lcy4KKyAgICBpZiAoRklELklEID09IC0yKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBJZiBpdCBpcyB0aGUgbGFzdCBsb2NhbCBlbnRyeSwgdGhlbiBpdCBkb2VzIGlmIHRoZSBsb2NhdGlvbiBpcyBsb2NhbC4KKyAgICBpZiAoRklELklEKzEgPT0gc3RhdGljX2Nhc3Q8aW50PihMb2NhbFNMb2NFbnRyeVRhYmxlLnNpemUoKSkpCisgICAgICByZXR1cm4gU0xvY09mZnNldCA8IE5leHRMb2NhbE9mZnNldDsKKworICAgIC8vIE90aGVyd2lzZSwgdGhlIGVudHJ5IGFmdGVyIGl0IGhhcyB0byBub3QgaW5jbHVkZSBpdC4gVGhpcyB3b3JrcyBmb3IgYm90aAorICAgIC8vIGxvY2FsIGFuZCBsb2FkZWQgZW50cmllcy4KKyAgICByZXR1cm4gU0xvY09mZnNldCA8IGdldFNMb2NFbnRyeUJ5SUQoRklELklEKzEpLmdldE9mZnNldCgpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBwcmV2aW91cyBpbi1vcmRlciBGaWxlSUQgb3IgYW4gaW52YWxpZCBGaWxlSUQgaWYgdGhlcmUKKyAgLy8vIGlzIG5vIHByZXZpb3VzIG9uZS4KKyAgRmlsZUlEIGdldFByZXZpb3VzRmlsZUlEKEZpbGVJRCBGSUQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbmV4dCBpbi1vcmRlciBGaWxlSUQgb3IgYW4gaW52YWxpZCBGaWxlSUQgaWYgdGhlcmUgaXMKKyAgLy8vIG5vIG5leHQgb25lLgorICBGaWxlSUQgZ2V0TmV4dEZpbGVJRChGaWxlSUQgRklEKSBjb25zdDsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyBmaWxlSUQgZm9yIHRoZSBzcGVjaWZpZWQgQ29udGVudENhY2hlIGFuZAorICAvLy8gaW5jbHVkZSBwb3NpdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIHdvcmtzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgQ29udGVudENhY2hlIGNvcnJlc3BvbmRzIHRvIGEKKyAgLy8vIGZpbGUgb3Igc29tZSBvdGhlciBpbnB1dCBzb3VyY2UuCisgIEZpbGVJRCBjcmVhdGVGaWxlSUQoY29uc3QgU3JjTWdyOjpDb250ZW50Q2FjaGUqIEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSW5jbHVkZVBvcywKKyAgICAgICAgICAgICAgICAgICAgICBTcmNNZ3I6OkNoYXJhY3RlcmlzdGljS2luZCBEaXJDaGFyYWN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50IExvYWRlZElELCB1bnNpZ25lZCBMb2FkZWRPZmZzZXQpOworCisgIGNvbnN0IFNyY01ncjo6Q29udGVudENhY2hlICoKKyAgICBnZXRPckNyZWF0ZUNvbnRlbnRDYWNoZShjb25zdCBGaWxlRW50cnkgKlNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N5c3RlbUZpbGUgPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBuZXcgQ29udGVudENhY2hlIGZvciB0aGUgc3BlY2lmaWVkICBtZW1vcnkgYnVmZmVyLgorICBjb25zdCBTcmNNZ3I6OkNvbnRlbnRDYWNoZSAqCisgIGNyZWF0ZU1lbUJ1ZmZlckNvbnRlbnRDYWNoZShsbHZtOjpNZW1vcnlCdWZmZXIgKkJ1ZiwgYm9vbCBEb05vdEZyZWUpOworCisgIEZpbGVJRCBnZXRGaWxlSURTbG93KHVuc2lnbmVkIFNMb2NPZmZzZXQpIGNvbnN0OworICBGaWxlSUQgZ2V0RmlsZUlETG9jYWwodW5zaWduZWQgU0xvY09mZnNldCkgY29uc3Q7CisgIEZpbGVJRCBnZXRGaWxlSURMb2FkZWQodW5zaWduZWQgU0xvY09mZnNldCkgY29uc3Q7CisKKyAgU291cmNlTG9jYXRpb24gZ2V0RXhwYW5zaW9uTG9jU2xvd0Nhc2UoU291cmNlTG9jYXRpb24gTG9jKSBjb25zdDsKKyAgU291cmNlTG9jYXRpb24gZ2V0U3BlbGxpbmdMb2NTbG93Q2FzZShTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0OworICBTb3VyY2VMb2NhdGlvbiBnZXRGaWxlTG9jU2xvd0Nhc2UoU291cmNlTG9jYXRpb24gTG9jKSBjb25zdDsKKworICBzdGQ6OnBhaXI8RmlsZUlELCB1bnNpZ25lZD4KKyAgZ2V0RGVjb21wb3NlZEV4cGFuc2lvbkxvY1Nsb3dDYXNlKGNvbnN0IFNyY01ncjo6U0xvY0VudHJ5ICpFKSBjb25zdDsKKyAgc3RkOjpwYWlyPEZpbGVJRCwgdW5zaWduZWQ+CisgIGdldERlY29tcG9zZWRTcGVsbGluZ0xvY1Nsb3dDYXNlKGNvbnN0IFNyY01ncjo6U0xvY0VudHJ5ICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPZmZzZXQpIGNvbnN0OworICB2b2lkIGNvbXB1dGVNYWNyb0FyZ3NDYWNoZShNYWNyb0FyZ3NNYXAgJk1hY3JvQXJnc0NhY2hlLCBGaWxlSUQgRklEKSBjb25zdDsKKyAgdm9pZCBhc3NvY2lhdGVGaWxlQ2h1bmtXaXRoTWFjcm9BcmdFeHAoTWFjcm9BcmdzTWFwICZNYWNyb0FyZ3NDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUlEIEZJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3BlbGxMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEV4cGFuc2lvbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRXhwYW5zaW9uTGVuZ3RoKSBjb25zdDsKK307CisKKy8vLyBcYnJpZWYgQ29tcGFyaXNvbiBmdW5jdGlvbiBvYmplY3QuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQmVmb3JlVGhhbkNvbXBhcmU7CisKKy8vLyBcYnJpZWYgQ29tcGFyZSB0d28gc291cmNlIGxvY2F0aW9ucy4KK3RlbXBsYXRlPD4KK2NsYXNzIEJlZm9yZVRoYW5Db21wYXJlPFNvdXJjZUxvY2F0aW9uPiB7CisgIFNvdXJjZU1hbmFnZXIgJlNNOworCitwdWJsaWM6CisgIGV4cGxpY2l0IEJlZm9yZVRoYW5Db21wYXJlKFNvdXJjZU1hbmFnZXIgJlNNKSA6IFNNKFNNKSB7fQorCisgIGJvb2wgb3BlcmF0b3IoKShTb3VyY2VMb2NhdGlvbiBMSFMsIFNvdXJjZUxvY2F0aW9uIFJIUykgY29uc3QgeworICAgIHJldHVybiBTTS5pc0JlZm9yZUluVHJhbnNsYXRpb25Vbml0KExIUywgUkhTKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBDb21wYXJlIHR3byBub24tb3ZlcmxhcHBpbmcgc291cmNlIHJhbmdlcy4KK3RlbXBsYXRlPD4KK2NsYXNzIEJlZm9yZVRoYW5Db21wYXJlPFNvdXJjZVJhbmdlPiB7CisgIFNvdXJjZU1hbmFnZXIgJlNNOworCitwdWJsaWM6CisgIGV4cGxpY2l0IEJlZm9yZVRoYW5Db21wYXJlKFNvdXJjZU1hbmFnZXIgJlNNKSA6IFNNKFNNKSB7fQorCisgIGJvb2wgb3BlcmF0b3IoKShTb3VyY2VSYW5nZSBMSFMsIFNvdXJjZVJhbmdlIFJIUykgY29uc3QgeworICAgIHJldHVybiBTTS5pc0JlZm9yZUluVHJhbnNsYXRpb25Vbml0KExIUy5nZXRCZWdpbigpLCBSSFMuZ2V0QmVnaW4oKSk7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0JBU0lDX1NPVVJDRU1BTkFHRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlckludGVybmFscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlckludGVybmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZDkxMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VySW50ZXJuYWxzLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8vPT09LSBTb3VyY2VNYW5hZ2VySW50ZXJuYWxzLmggLSBTb3VyY2VNYW5hZ2VyIEludGVybmFscyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiB0aGUgY2xhbmc6OlNvdXJjZU1hbmFnZXIgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX1NPVVJDRU1BTkFHRVJJTlRFUk5BTFNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX1NPVVJDRU1BTkFHRVJJTlRFUk5BTFNfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIExpbmUgVGFibGUgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3N0cnVjdCBMaW5lRW50cnkgeworICAvLy8gXGJyaWVmIFRoZSBvZmZzZXQgaW4gdGhpcyBmaWxlIHRoYXQgdGhlIGxpbmUgZW50cnkgb2NjdXJzIGF0LgorICB1bnNpZ25lZCBGaWxlT2Zmc2V0OworCisgIC8vLyBcYnJpZWYgVGhlIHByZXN1bWVkIGxpbmUgbnVtYmVyIG9mIHRoaXMgbGluZSBlbnRyeTogXCNsaW5lIDQuCisgIHVuc2lnbmVkIExpbmVObzsKKworICAvLy8gXGJyaWVmIFRoZSBJRCBvZiB0aGUgZmlsZW5hbWUgaWRlbnRpZmllZCBieSB0aGlzIGxpbmUgZW50cnk6CisgIC8vLyBcI2xpbmUgNCAiZm9vLmMiLiAgVGhpcyBpcyAtMSBpZiBub3Qgc3BlY2lmaWVkLgorICBpbnQgRmlsZW5hbWVJRDsKKworICAvLy8gXGJyaWVmIFNldCB0aGUgMCBpZiBubyBmbGFncywgMSBpZiBhIHN5c3RlbSBoZWFkZXIsCisgIFNyY01ncjo6Q2hhcmFjdGVyaXN0aWNLaW5kIEZpbGVLaW5kOworCisgIC8vLyBcYnJpZWYgVGhlIG9mZnNldCBvZiB0aGUgdmlydHVhbCBpbmNsdWRlIHN0YWNrIGxvY2F0aW9uLAorICAvLy8gd2hpY2ggaXMgbWFuaXB1bGF0ZWQgYnkgR05VIGxpbmVtYXJrZXIgZGlyZWN0aXZlcy4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIGlzIDAgdGhlbiB0aGVyZSBpcyBubyB2aXJ0dWFsIFwjaW5jbHVkZXIuCisgIHVuc2lnbmVkIEluY2x1ZGVPZmZzZXQ7CisKKyAgc3RhdGljIExpbmVFbnRyeSBnZXQodW5zaWduZWQgT2ZmcywgdW5zaWduZWQgTGluZSwgaW50IEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBTcmNNZ3I6OkNoYXJhY3RlcmlzdGljS2luZCBGaWxlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5jbHVkZU9mZnNldCkgeworICAgIExpbmVFbnRyeSBFOworICAgIEUuRmlsZU9mZnNldCA9IE9mZnM7CisgICAgRS5MaW5lTm8gPSBMaW5lOworICAgIEUuRmlsZW5hbWVJRCA9IEZpbGVuYW1lOworICAgIEUuRmlsZUtpbmQgPSBGaWxlS2luZDsKKyAgICBFLkluY2x1ZGVPZmZzZXQgPSBJbmNsdWRlT2Zmc2V0OworICAgIHJldHVybiBFOworICB9Cit9OworCisvLyBuZWVkZWQgZm9yIEZpbmROZWFyZXN0TGluZUVudHJ5ICh1cHBlcl9ib3VuZCBvZiBMaW5lRW50cnkpCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTGluZUVudHJ5ICZsaHMsIGNvbnN0IExpbmVFbnRyeSAmcmhzKSB7CisgIC8vIEZJWE1FOiBzaG91bGQgY2hlY2sgdGhlIG90aGVyIGZpZWxkPworICByZXR1cm4gbGhzLkZpbGVPZmZzZXQgPCByaHMuRmlsZU9mZnNldDsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IExpbmVFbnRyeSAmRSwgdW5zaWduZWQgT2Zmc2V0KSB7CisgIHJldHVybiBFLkZpbGVPZmZzZXQgPCBPZmZzZXQ7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPCh1bnNpZ25lZCBPZmZzZXQsIGNvbnN0IExpbmVFbnRyeSAmRSkgeworICByZXR1cm4gT2Zmc2V0IDwgRS5GaWxlT2Zmc2V0OworfQorCisvLy8gXGJyaWVmIFVzZWQgdG8gaG9sZCBhbmQgdW5pcXVlIGRhdGEgdXNlZCB0byByZXByZXNlbnQgXCNsaW5lIGluZm9ybWF0aW9uLgorY2xhc3MgTGluZVRhYmxlSW5mbyB7CisgIC8vLyBcYnJpZWYgTWFwIHVzZWQgdG8gYXNzaWduIHVuaXF1ZSBJRHMgdG8gZmlsZW5hbWVzIGluIFwjbGluZSBkaXJlY3RpdmVzLiAKKyAgLy8vCisgIC8vLyBUaGlzIGFsbG93cyB1cyB0byB1bmlxdWUgdGhlIGZpbGVuYW1lcyB0aGF0CisgIC8vLyBmcmVxdWVudGx5IHJlb2NjdXIgYW5kIHJlZmVyZW5jZSB0aGVtIHdpdGggaW5kaWNlcy4gIEZpbGVuYW1lSURzIGhvbGRzCisgIC8vLyB0aGUgbWFwcGluZyBmcm9tIHN0cmluZyAtPiBJRCwgYW5kIEZpbGVuYW1lc0J5SUQgaG9sZHMgdGhlIG1hcHBpbmcgb2YgSUQKKyAgLy8vIHRvIHN0cmluZy4KKyAgbGx2bTo6U3RyaW5nTWFwPHVuc2lnbmVkLCBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yPiBGaWxlbmFtZUlEczsKKyAgc3RkOjp2ZWN0b3I8bGx2bTo6U3RyaW5nTWFwRW50cnk8dW5zaWduZWQ+Kj4gRmlsZW5hbWVzQnlJRDsKKworICAvLy8gXGJyaWVmIE1hcCBmcm9tIEZpbGVJRHMgdG8gYSBsaXN0IG9mIGxpbmUgZW50cmllcyAoc29ydGVkIGJ5IHRoZSBvZmZzZXQKKyAgLy8vIGF0IHdoaWNoIHRoZXkgb2NjdXIgaW4gdGhlIGZpbGUpLgorICBzdGQ6Om1hcDxGaWxlSUQsIHN0ZDo6dmVjdG9yPExpbmVFbnRyeT4+IExpbmVFbnRyaWVzOworCitwdWJsaWM6CisgIHZvaWQgY2xlYXIoKSB7CisgICAgRmlsZW5hbWVJRHMuY2xlYXIoKTsKKyAgICBGaWxlbmFtZXNCeUlELmNsZWFyKCk7CisgICAgTGluZUVudHJpZXMuY2xlYXIoKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldExpbmVUYWJsZUZpbGVuYW1lSUQoU3RyaW5nUmVmIFN0cik7CisKKyAgU3RyaW5nUmVmIGdldEZpbGVuYW1lKHVuc2lnbmVkIElEKSBjb25zdCB7CisgICAgYXNzZXJ0KElEIDwgRmlsZW5hbWVzQnlJRC5zaXplKCkgJiYgIkludmFsaWQgRmlsZW5hbWVJRCIpOworICAgIHJldHVybiBGaWxlbmFtZXNCeUlEW0lEXS0+Z2V0S2V5KCk7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1GaWxlbmFtZXMoKSBjb25zdCB7IHJldHVybiBGaWxlbmFtZXNCeUlELnNpemUoKTsgfQorCisgIHZvaWQgQWRkTGluZU5vdGUoRmlsZUlEIEZJRCwgdW5zaWduZWQgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbmVObywgaW50IEZpbGVuYW1lSUQsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRW50cnlFeGl0LCBTcmNNZ3I6OkNoYXJhY3RlcmlzdGljS2luZCBGaWxlS2luZCk7CisKKworICAvLy8gXGJyaWVmIEZpbmQgdGhlIGxpbmUgZW50cnkgbmVhcmVzdCB0byBGSUQgdGhhdCBpcyBiZWZvcmUgaXQuCisgIC8vLworICAvLy8gSWYgdGhlcmUgaXMgbm8gbGluZSBlbnRyeSBiZWZvcmUgXHAgT2Zmc2V0IGluIFxwIEZJRCwgcmV0dXJucyBudWxsLgorICBjb25zdCBMaW5lRW50cnkgKkZpbmROZWFyZXN0TGluZUVudHJ5KEZpbGVJRCBGSUQsIHVuc2lnbmVkIE9mZnNldCk7CisKKyAgLy8gTG93LWxldmVsIGFjY2VzcworICB1c2luZyBpdGVyYXRvciA9IHN0ZDo6bWFwPEZpbGVJRCwgc3RkOjp2ZWN0b3I8TGluZUVudHJ5Pj46Oml0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gTGluZUVudHJpZXMuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBMaW5lRW50cmllcy5lbmQoKTsgfQorCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IGxpbmUgZW50cnkgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGVuY29kZWQgaW50bworICAvLy8gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaW5lIHRhYmxlLgorICB2b2lkIEFkZEVudHJ5KEZpbGVJRCBGSUQsIGNvbnN0IHN0ZDo6dmVjdG9yPExpbmVFbnRyeT4gJkVudHJpZXMpOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQkFTSUNfU09VUkNFTUFOQUdFUklOVEVSTkFMU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9TcGVjaWZpZXJzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9TcGVjaWZpZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3NTM0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1NwZWNpZmllcnMuaApAQCAtMCwwICsxLDMyMSBAQAorLy89PT0tLS0gU3BlY2lmaWVycy5oIC0gRGVjbGFyYXRpb24gYW5kIFR5cGUgU3BlY2lmaWVycyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgdmFyaW91cyBlbnVtZXJhdGlvbnMgdGhhdCBkZXNjcmliZSBkZWNsYXJhdGlvbiBhbmQKKy8vLyB0eXBlIHNwZWNpZmllcnMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19TUEVDSUZJRVJTX0gKKyNkZWZpbmUgTExWTV9DTEFOR19CQVNJQ19TUEVDSUZJRVJTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworICAvLy8gXGJyaWVmIFNwZWNpZmllcyB0aGUgd2lkdGggb2YgYSB0eXBlLCBlLmcuLCBzaG9ydCwgbG9uZywgb3IgbG9uZyBsb25nLgorICBlbnVtIFR5cGVTcGVjaWZpZXJXaWR0aCB7CisgICAgVFNXX3Vuc3BlY2lmaWVkLAorICAgIFRTV19zaG9ydCwKKyAgICBUU1dfbG9uZywKKyAgICBUU1dfbG9uZ2xvbmcKKyAgfTsKKyAgCisgIC8vLyBcYnJpZWYgU3BlY2lmaWVzIHRoZSBzaWduZWRuZXNzIG9mIGEgdHlwZSwgZS5nLiwgc2lnbmVkIG9yIHVuc2lnbmVkLgorICBlbnVtIFR5cGVTcGVjaWZpZXJTaWduIHsKKyAgICBUU1NfdW5zcGVjaWZpZWQsCisgICAgVFNTX3NpZ25lZCwKKyAgICBUU1NfdW5zaWduZWQKKyAgfTsKKyAgCisgIGVudW0gVHlwZVNwZWNpZmllcnNQaXBlIHsKKyAgICBUU1BfdW5zcGVjaWZpZWQsCisgICAgVFNQX3BpcGUKKyAgfTsKKworICAvLy8gXGJyaWVmIFNwZWNpZmllcyB0aGUga2luZCBvZiB0eXBlLgorICBlbnVtIFR5cGVTcGVjaWZpZXJUeXBlIHsKKyAgICBUU1RfdW5zcGVjaWZpZWQsCisgICAgVFNUX3ZvaWQsCisgICAgVFNUX2NoYXIsCisgICAgVFNUX3djaGFyLCAgICAgICAgLy8gQysrIHdjaGFyX3QKKyAgICBUU1RfY2hhcjE2LCAgICAgICAvLyBDKysxMSBjaGFyMTZfdAorICAgIFRTVF9jaGFyMzIsICAgICAgIC8vIEMrKzExIGNoYXIzMl90CisgICAgVFNUX2ludCwKKyAgICBUU1RfaW50MTI4LAorICAgIFRTVF9oYWxmLCAgICAgICAgIC8vIE9wZW5DTCBoYWxmLCBBUk0gTkVPTiBfX2ZwMTYKKyAgICBUU1RfRmxvYXQxNiwgICAgICAvLyBDMTEgZXh0ZW5zaW9uIElTTy9JRUMgVFMgMTg2NjEtMworICAgIFRTVF9mbG9hdCwKKyAgICBUU1RfZG91YmxlLAorICAgIFRTVF9mbG9hdDEyOCwKKyAgICBUU1RfYm9vbCwgICAgICAgICAvLyBfQm9vbAorICAgIFRTVF9kZWNpbWFsMzIsICAgIC8vIF9EZWNpbWFsMzIKKyAgICBUU1RfZGVjaW1hbDY0LCAgICAvLyBfRGVjaW1hbDY0CisgICAgVFNUX2RlY2ltYWwxMjgsICAgLy8gX0RlY2ltYWwxMjgKKyAgICBUU1RfZW51bSwKKyAgICBUU1RfdW5pb24sCisgICAgVFNUX3N0cnVjdCwKKyAgICBUU1RfY2xhc3MsICAgICAgICAvLyBDKysgY2xhc3MgdHlwZQorICAgIFRTVF9pbnRlcmZhY2UsICAgIC8vIEMrKyAoTWljcm9zb2Z0LXNwZWNpZmljKSBfX2ludGVyZmFjZSB0eXBlCisgICAgVFNUX3R5cGVuYW1lLCAgICAgLy8gVHlwZWRlZiwgQysrIGNsYXNzLW5hbWUgb3IgZW51bSBuYW1lLCBldGMuCisgICAgVFNUX3R5cGVvZlR5cGUsCisgICAgVFNUX3R5cGVvZkV4cHIsCisgICAgVFNUX2RlY2x0eXBlLCAgICAgICAgIC8vIEMrKzExIGRlY2x0eXBlCisgICAgVFNUX3VuZGVybHlpbmdUeXBlLCAgIC8vIF9fdW5kZXJseWluZ190eXBlIGZvciBDKysxMQorICAgIFRTVF9hdXRvLCAgICAgICAgICAgICAvLyBDKysxMSBhdXRvCisgICAgVFNUX2RlY2x0eXBlX2F1dG8sICAgIC8vIEMrKzF5IGRlY2x0eXBlKGF1dG8pCisgICAgVFNUX2F1dG9fdHlwZSwgICAgICAgIC8vIF9fYXV0b190eXBlIGV4dGVuc2lvbgorICAgIFRTVF91bmtub3duX2FueXR5cGUsICAvLyBfX3Vua25vd25fYW55dHlwZSBleHRlbnNpb24KKyAgICBUU1RfYXRvbWljLCAgICAgICAgICAgLy8gQzExIF9BdG9taWMKKyNkZWZpbmUgR0VORVJJQ19JTUFHRV9UWVBFKEltZ1R5cGUsIElkKSBUU1RfIyNJbWdUeXBlIyNfdCwgLy8gT3BlbkNMIGltYWdlIHR5cGVzCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3BlbkNMSW1hZ2VUeXBlcy5kZWYiCisgICAgVFNUX2Vycm9yIC8vIGVycm9uZW91cyB0eXBlCisgIH07CisKKyAgLy8vIFxicmllZiBTdHJ1Y3R1cmUgdGhhdCBwYWNrcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBzcGVjaWZpZXJzIHRoYXQKKyAgLy8vIHdlcmUgd3JpdHRlbiBpbiBhIHBhcnRpY3VsYXIgdHlwZSBzcGVjaWZpZXIgc2VxdWVuY2UuCisgIHN0cnVjdCBXcml0dGVuQnVpbHRpblNwZWNzIHsKKyAgICBzdGF0aWNfYXNzZXJ0KFRTVF9lcnJvciA8IDEgPDwgNiwgIlR5cGUgYml0ZmllbGQgbm90IHdpZGUgZW5vdWdoIGZvciBUU1QiKTsKKyAgICAvKkRlY2xTcGVjOjpUU1QqLyB1bnNpZ25lZCBUeXBlICA6IDY7CisgICAgLypEZWNsU3BlYzo6VFNTKi8gdW5zaWduZWQgU2lnbiAgOiAyOworICAgIC8qRGVjbFNwZWM6OlRTVyovIHVuc2lnbmVkIFdpZHRoIDogMjsKKyAgICB1bnNpZ25lZCBNb2RlQXR0ciA6IDE7CisgIH07CisKKyAgLy8vIFxicmllZiBBIEMrKyBhY2Nlc3Mgc3BlY2lmaWVyIChwdWJsaWMsIHByaXZhdGUsIHByb3RlY3RlZCksIHBsdXMgdGhlCisgIC8vLyBzcGVjaWFsIHZhbHVlICJub25lIiB3aGljaCBtZWFucyBkaWZmZXJlbnQgdGhpbmdzIGluIGRpZmZlcmVudCBjb250ZXh0cy4KKyAgZW51bSBBY2Nlc3NTcGVjaWZpZXIgeworICAgIEFTX3B1YmxpYywKKyAgICBBU19wcm90ZWN0ZWQsCisgICAgQVNfcHJpdmF0ZSwKKyAgICBBU19ub25lCisgIH07CisKKyAgLy8vIFxicmllZiBUaGUgY2F0ZWdvcml6YXRpb24gb2YgZXhwcmVzc2lvbiB2YWx1ZXMsIGN1cnJlbnRseSBmb2xsb3dpbmcgdGhlCisgIC8vLyBDKysxMSBzY2hlbWUuCisgIGVudW0gRXhwclZhbHVlS2luZCB7CisgICAgLy8vIFxicmllZiBBbiByLXZhbHVlIGV4cHJlc3Npb24gKGEgcHItdmFsdWUgaW4gdGhlIEMrKzExIHRheG9ub215KQorICAgIC8vLyBwcm9kdWNlcyBhIHRlbXBvcmFyeSB2YWx1ZS4KKyAgICBWS19SVmFsdWUsCisKKyAgICAvLy8gXGJyaWVmIEFuIGwtdmFsdWUgZXhwcmVzc2lvbiBpcyBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3Qgd2l0aAorICAgIC8vLyBpbmRlcGVuZGVudCBzdG9yYWdlLgorICAgIFZLX0xWYWx1ZSwKKworICAgIC8vLyBcYnJpZWYgQW4geC12YWx1ZSBleHByZXNzaW9uIGlzIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCB3aXRoCisgICAgLy8vIGluZGVwZW5kZW50IHN0b3JhZ2UgYnV0IHdoaWNoIGNhbiBiZSAibW92ZWQiLCBpLmUuCisgICAgLy8vIGVmZmljaWVudGx5IGNhbm5pYmFsaXplZCBmb3IgaXRzIHJlc291cmNlcy4KKyAgICBWS19YVmFsdWUKKyAgfTsKKworICAvLy8gXGJyaWVmIEEgZnVydGhlciBjbGFzc2lmaWNhdGlvbiBvZiB0aGUga2luZCBvZiBvYmplY3QgcmVmZXJlbmNlZCBieSBhbgorICAvLy8gbC12YWx1ZSBvciB4LXZhbHVlLgorICBlbnVtIEV4cHJPYmplY3RLaW5kIHsKKyAgICAvLy8gQW4gb3JkaW5hcnkgb2JqZWN0IGlzIGxvY2F0ZWQgYXQgYW4gYWRkcmVzcyBpbiBtZW1vcnkuCisgICAgT0tfT3JkaW5hcnksCisKKyAgICAvLy8gQSBiaXRmaWVsZCBvYmplY3QgaXMgYSBiaXRmaWVsZCBvbiBhIEMgb3IgQysrIHJlY29yZC4KKyAgICBPS19CaXRGaWVsZCwKKworICAgIC8vLyBBIHZlY3RvciBjb21wb25lbnQgaXMgYW4gZWxlbWVudCBvciByYW5nZSBvZiBlbGVtZW50cyBvbiBhIHZlY3Rvci4KKyAgICBPS19WZWN0b3JDb21wb25lbnQsCisKKyAgICAvLy8gQW4gT2JqZWN0aXZlLUMgcHJvcGVydHkgaXMgYSBsb2dpY2FsIGZpZWxkIG9mIGFuIE9iamVjdGl2ZS1DCisgICAgLy8vIG9iamVjdCB3aGljaCBpcyByZWFkIGFuZCB3cml0dGVuIHZpYSBPYmplY3RpdmUtQyBtZXRob2QgY2FsbHMuCisgICAgT0tfT2JqQ1Byb3BlcnR5LAorICAgIAorICAgIC8vLyBBbiBPYmplY3RpdmUtQyBhcnJheS9kaWN0aW9uYXJ5IHN1YnNjcmlwdGluZyB3aGljaCByZWFkcyBhbgorICAgIC8vLyBvYmplY3Qgb3Igd3JpdGVzIGF0IHRoZSBzdWJzY3JpcHRlZCBhcnJheS9kaWN0aW9uYXJ5IGVsZW1lbnQgdmlhCisgICAgLy8vIE9iamVjdGl2ZS1DIG1ldGhvZCBjYWxscy4KKyAgICBPS19PYmpDU3Vic2NyaXB0CisgIH07CisKKyAgLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIGtpbmQgb2YgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdGhhdCBhCisgIC8vLyBwYXJ0aWN1bGFyIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRlY2xhcmF0aW9uIHJlcHJlc2VudHMuCisgIGVudW0gVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQgeworICAgIC8vLyBUaGlzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHdhcyBmb3JtZWQgZnJvbSBhIHRlbXBsYXRlLWlkIGJ1dAorICAgIC8vLyBoYXMgbm90IHlldCBiZWVuIGRlY2xhcmVkLCBkZWZpbmVkLCBvciBpbnN0YW50aWF0ZWQuCisgICAgVFNLX1VuZGVjbGFyZWQgPSAwLAorICAgIC8vLyBUaGlzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHdhcyBpbXBsaWNpdGx5IGluc3RhbnRpYXRlZCBmcm9tIGEKKyAgICAvLy8gdGVtcGxhdGUuIChDKysgW3RlbXAuaW5zdF0pLgorICAgIFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb24sCisgICAgLy8vIFRoaXMgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gd2FzIGRlY2xhcmVkIG9yIGRlZmluZWQgYnkgYW4KKyAgICAvLy8gZXhwbGljaXQgc3BlY2lhbGl6YXRpb24gKEMrKyBbdGVtcC5leHBsLnNwZWNdKSBvciBwYXJ0aWFsCisgICAgLy8vIHNwZWNpYWxpemF0aW9uIChDKysgW3RlbXAuY2xhc3Muc3BlY10pLgorICAgIFRTS19FeHBsaWNpdFNwZWNpYWxpemF0aW9uLAorICAgIC8vLyBUaGlzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHdhcyBpbnN0YW50aWF0ZWQgZnJvbSBhIHRlbXBsYXRlCisgICAgLy8vIGR1ZSB0byBhbiBleHBsaWNpdCBpbnN0YW50aWF0aW9uIGRlY2xhcmF0aW9uIHJlcXVlc3QKKyAgICAvLy8gKEMrKzExIFt0ZW1wLmV4cGxpY2l0XSkuCisgICAgVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlY2xhcmF0aW9uLAorICAgIC8vLyBUaGlzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHdhcyBpbnN0YW50aWF0ZWQgZnJvbSBhIHRlbXBsYXRlCisgICAgLy8vIGR1ZSB0byBhbiBleHBsaWNpdCBpbnN0YW50aWF0aW9uIGRlZmluaXRpb24gcmVxdWVzdAorICAgIC8vLyAoQysrIFt0ZW1wLmV4cGxpY2l0XSkuCisgICAgVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlZmluaXRpb24KKyAgfTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24ga2luZCByZWZlcnMKKyAgLy8vIHRvIGFuIGluc3RhbnRpYXRpb24gb2YgYW4gZW50aXR5IChhcyBvcHBvc2VkIHRvIGEgbm9uLXRlbXBsYXRlIG9yCisgIC8vLyBhbiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbikuCisgIGlubGluZSBib29sIGlzVGVtcGxhdGVJbnN0YW50aWF0aW9uKFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kIEtpbmQpIHsKKyAgICByZXR1cm4gS2luZCAhPSBUU0tfVW5kZWNsYXJlZCAmJiBLaW5kICE9IFRTS19FeHBsaWNpdFNwZWNpYWxpemF0aW9uOworICB9CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24ga2luZCBpcyBhbiBleHBsaWNpdAorICAvLy8gc3BlY2lhbGl6YXRpb24sIGV4cGxpY2l0IGluc3RhbnRpYXRpb24gZGVjbGFyYXRpb24sIG9yIGV4cGxpY2l0CisgIC8vLyBpbnN0YW50aWF0aW9uIGRlZmluaXRpb24uCisgIGlubGluZSBib29sIGlzVGVtcGxhdGVFeHBsaWNpdEluc3RhbnRpYXRpb25PclNwZWNpYWxpemF0aW9uKAorICAgICAgVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQgS2luZCkgeworICAgIHN3aXRjaCAoS2luZCkgeworICAgIGNhc2UgVFNLX0V4cGxpY2l0U3BlY2lhbGl6YXRpb246CisgICAgY2FzZSBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVjbGFyYXRpb246CisgICAgY2FzZSBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVmaW5pdGlvbjoKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBUU0tfVW5kZWNsYXJlZDoKKyAgICBjYXNlIFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb246CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoImJhZCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBraW5kIik7CisgIH0KKworICAvLy8gXGJyaWVmIFRocmVhZCBzdG9yYWdlLWNsYXNzLXNwZWNpZmllci4KKyAgZW51bSBUaHJlYWRTdG9yYWdlQ2xhc3NTcGVjaWZpZXIgeworICAgIFRTQ1NfdW5zcGVjaWZpZWQsCisgICAgLy8vIEdOVSBfX3RocmVhZC4KKyAgICBUU0NTX19fdGhyZWFkLAorICAgIC8vLyBDKysxMSB0aHJlYWRfbG9jYWwuIEltcGxpZXMgJ3N0YXRpYycgYXQgYmxvY2sgc2NvcGUsIGJ1dCBub3QgYXQKKyAgICAvLy8gY2xhc3Mgc2NvcGUuCisgICAgVFNDU190aHJlYWRfbG9jYWwsCisgICAgLy8vIEMxMSBfVGhyZWFkX2xvY2FsLiBNdXN0IGJlIGNvbWJpbmVkIHdpdGggZWl0aGVyICdzdGF0aWMnIG9yICdleHRlcm4nCisgICAgLy8vIGlmIHVzZWQgYXQgYmxvY2sgc2NvcGUuCisgICAgVFNDU19fVGhyZWFkX2xvY2FsCisgIH07CisKKyAgLy8vIFxicmllZiBTdG9yYWdlIGNsYXNzZXMuCisgIGVudW0gU3RvcmFnZUNsYXNzIHsKKyAgICAvLyBUaGVzZSBhcmUgbGVnYWwgb24gYm90aCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcy4KKyAgICBTQ19Ob25lLAorICAgIFNDX0V4dGVybiwKKyAgICBTQ19TdGF0aWMsCisgICAgU0NfUHJpdmF0ZUV4dGVybiwKKworICAgIC8vIFRoZXNlIGFyZSBvbmx5IGxlZ2FsIG9uIHZhcmlhYmxlcy4KKyAgICBTQ19BdXRvLAorICAgIFNDX1JlZ2lzdGVyCisgIH07CisKKyAgLy8vIFxicmllZiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gc3RvcmFnZSBjbGFzcyBpcyBsZWdhbCBmb3IgZnVuY3Rpb25zLgorICBpbmxpbmUgYm9vbCBpc0xlZ2FsRm9yRnVuY3Rpb24oU3RvcmFnZUNsYXNzIFNDKSB7CisgICAgcmV0dXJuIFNDIDw9IFNDX1ByaXZhdGVFeHRlcm47CisgIH0KKworICAvLy8gXGJyaWVmIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBzdG9yYWdlIGNsYXNzIGlzIGxlZ2FsIGZvciB2YXJpYWJsZXMuCisgIGlubGluZSBib29sIGlzTGVnYWxGb3JWYXJpYWJsZShTdG9yYWdlQ2xhc3MgU0MpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSW4tY2xhc3MgaW5pdGlhbGl6YXRpb24gc3R5bGVzIGZvciBub24tc3RhdGljIGRhdGEgbWVtYmVycy4KKyAgZW51bSBJbkNsYXNzSW5pdFN0eWxlIHsKKyAgICBJQ0lTX05vSW5pdCwgICAvLy88IE5vIGluLWNsYXNzIGluaXRpYWxpemVyLgorICAgIElDSVNfQ29weUluaXQsIC8vLzwgQ29weSBpbml0aWFsaXphdGlvbi4KKyAgICBJQ0lTX0xpc3RJbml0ICAvLy88IERpcmVjdCBsaXN0LWluaXRpYWxpemF0aW9uLgorICB9OworCisgIC8vLyBcYnJpZWYgQ2FsbGluZ0NvbnYgLSBTcGVjaWZpZXMgdGhlIGNhbGxpbmcgY29udmVudGlvbiB0aGF0IGEgZnVuY3Rpb24gdXNlcy4KKyAgZW51bSBDYWxsaW5nQ29udiB7CisgICAgQ0NfQywgICAgICAgICAgIC8vIF9fYXR0cmlidXRlX18oKGNkZWNsKSkKKyAgICBDQ19YODZTdGRDYWxsLCAgLy8gX19hdHRyaWJ1dGVfXygoc3RkY2FsbCkpCisgICAgQ0NfWDg2RmFzdENhbGwsIC8vIF9fYXR0cmlidXRlX18oKGZhc3RjYWxsKSkKKyAgICBDQ19YODZUaGlzQ2FsbCwgLy8gX19hdHRyaWJ1dGVfXygodGhpc2NhbGwpKQorICAgIENDX1g4NlZlY3RvckNhbGwsIC8vIF9fYXR0cmlidXRlX18oKHZlY3RvcmNhbGwpKQorICAgIENDX1g4NlBhc2NhbCwgICAvLyBfX2F0dHJpYnV0ZV9fKChwYXNjYWwpKQorICAgIENDX1dpbjY0LCAgICAgICAvLyBfX2F0dHJpYnV0ZV9fKChtc19hYmkpKQorICAgIENDX1g4Nl82NFN5c1YsICAvLyBfX2F0dHJpYnV0ZV9fKChzeXN2X2FiaSkpCisgICAgQ0NfWDg2UmVnQ2FsbCwgLy8gX19hdHRyaWJ1dGVfXygocmVnY2FsbCkpCisgICAgQ0NfQUFQQ1MsICAgICAgIC8vIF9fYXR0cmlidXRlX18oKHBjcygiYWFwY3MiKSkpCisgICAgQ0NfQUFQQ1NfVkZQLCAgIC8vIF9fYXR0cmlidXRlX18oKHBjcygiYWFwY3MtdmZwIikpKQorICAgIENDX0ludGVsT2NsQmljYywgLy8gX19hdHRyaWJ1dGVfXygoaW50ZWxfb2NsX2JpY2MpKQorICAgIENDX1NwaXJGdW5jdGlvbiwgLy8gZGVmYXVsdCBmb3IgT3BlbkNMIGZ1bmN0aW9ucyBvbiBTUElSIHRhcmdldAorICAgIENDX09wZW5DTEtlcm5lbCwgLy8gaW5mZXJyZWQgZm9yIE9wZW5DTCBrZXJuZWxzCisgICAgQ0NfU3dpZnQsICAgICAgICAvLyBfX2F0dHJpYnV0ZV9fKChzd2lmdGNhbGwpKQorICAgIENDX1ByZXNlcnZlTW9zdCwgLy8gX19hdHRyaWJ1dGVfXygocHJlc2VydmVfbW9zdCkpCisgICAgQ0NfUHJlc2VydmVBbGwsICAvLyBfX2F0dHJpYnV0ZV9fKChwcmVzZXJ2ZV9hbGwpKQorICB9OworCisgIC8vLyBcYnJpZWYgQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGNhbGxpbmcgY29udmVudGlvbiBzdXBwb3J0cyB2YXJpYWRpYworICAvLy8gY2FsbHMuIFVucHJvdG90eXBlZCBjYWxscyBhbHNvIHVzZSB0aGUgdmFyaWFkaWMgY2FsbCBydWxlcy4KKyAgaW5saW5lIGJvb2wgc3VwcG9ydHNWYXJpYWRpY0NhbGwoQ2FsbGluZ0NvbnYgQ0MpIHsKKyAgICBzd2l0Y2ggKENDKSB7CisgICAgY2FzZSBDQ19YODZTdGRDYWxsOgorICAgIGNhc2UgQ0NfWDg2RmFzdENhbGw6CisgICAgY2FzZSBDQ19YODZUaGlzQ2FsbDoKKyAgICBjYXNlIENDX1g4NlJlZ0NhbGw6CisgICAgY2FzZSBDQ19YODZQYXNjYWw6CisgICAgY2FzZSBDQ19YODZWZWN0b3JDYWxsOgorICAgIGNhc2UgQ0NfU3BpckZ1bmN0aW9uOgorICAgIGNhc2UgQ0NfT3BlbkNMS2VybmVsOgorICAgIGNhc2UgQ0NfU3dpZnQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIC8vLyBcYnJpZWYgVGhlIHN0b3JhZ2UgZHVyYXRpb24gZm9yIGFuIG9iamVjdCAocGVyIEMrKyBbYmFzaWMuc3RjXSkuCisgIGVudW0gU3RvcmFnZUR1cmF0aW9uIHsKKyAgICBTRF9GdWxsRXhwcmVzc2lvbiwgLy8vPCBGdWxsLWV4cHJlc3Npb24gc3RvcmFnZSBkdXJhdGlvbiAoZm9yIHRlbXBvcmFyaWVzKS4KKyAgICBTRF9BdXRvbWF0aWMsICAgICAgLy8vPCBBdXRvbWF0aWMgc3RvcmFnZSBkdXJhdGlvbiAobW9zdCBsb2NhbCB2YXJpYWJsZXMpLgorICAgIFNEX1RocmVhZCwgICAgICAgICAvLy88IFRocmVhZCBzdG9yYWdlIGR1cmF0aW9uLgorICAgIFNEX1N0YXRpYywgICAgICAgICAvLy88IFN0YXRpYyBzdG9yYWdlIGR1cmF0aW9uLgorICAgIFNEX0R5bmFtaWMgICAgICAgICAvLy88IER5bmFtaWMgc3RvcmFnZSBkdXJhdGlvbi4KKyAgfTsKKworICAvLy8gRGVzY3JpYmVzIHRoZSBudWxsYWJpbGl0eSBvZiBhIHBhcnRpY3VsYXIgdHlwZS4KKyAgZW51bSBjbGFzcyBOdWxsYWJpbGl0eUtpbmQgOiB1aW50OF90IHsKKyAgICAvLy8gVmFsdWVzIG9mIHRoaXMgdHlwZSBjYW4gbmV2ZXIgYmUgbnVsbC4KKyAgICBOb25OdWxsID0gMCwKKyAgICAvLy8gVmFsdWVzIG9mIHRoaXMgdHlwZSBjYW4gYmUgbnVsbC4KKyAgICBOdWxsYWJsZSwKKyAgICAvLy8gV2hldGhlciB2YWx1ZXMgb2YgdGhpcyB0eXBlIGNhbiBiZSBudWxsIGlzIChleHBsaWNpdGx5KQorICAgIC8vLyB1bnNwZWNpZmllZC4gVGhpcyBjYXB0dXJlcyBhIChmYWlybHkgcmFyZSkgY2FzZSB3aGVyZSB3ZQorICAgIC8vLyBjYW4ndCBjb25jbHVkZSBhbnl0aGluZyBhYm91dCB0aGUgbnVsbGFiaWxpdHkgb2YgdGhlIHR5cGUgZXZlbgorICAgIC8vLyB0aG91Z2ggaXQgaGFzIGJlZW4gY29uc2lkZXJlZC4KKyAgICBVbnNwZWNpZmllZAorICB9OworCisgIC8vLyBSZXRyaWV2ZSB0aGUgc3BlbGxpbmcgb2YgdGhlIGdpdmVuIG51bGxhYmlsaXR5IGtpbmQuCisgIGxsdm06OlN0cmluZ1JlZiBnZXROdWxsYWJpbGl0eVNwZWxsaW5nKE51bGxhYmlsaXR5S2luZCBraW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQ29udGV4dFNlbnNpdGl2ZSA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIEtpbmRzIG9mIHBhcmFtZXRlciBBQkkuCisgIGVudW0gY2xhc3MgUGFyYW1ldGVyQUJJIHsKKyAgICAvLy8gVGhpcyBwYXJhbWV0ZXIgdXNlcyBvcmRpbmFyeSBBQkkgcnVsZXMgZm9yIGl0cyB0eXBlLgorICAgIE9yZGluYXJ5LAorCisgICAgLy8vIFRoaXMgcGFyYW1ldGVyICh3aGljaCBtdXN0IGhhdmUgcG9pbnRlciB0eXBlKSBpcyBhIFN3aWZ0CisgICAgLy8vIGluZGlyZWN0IHJlc3VsdCBwYXJhbWV0ZXIuCisgICAgU3dpZnRJbmRpcmVjdFJlc3VsdCwKKworICAgIC8vLyBUaGlzIHBhcmFtZXRlciAod2hpY2ggbXVzdCBoYXZlIHBvaW50ZXItdG8tcG9pbnRlciB0eXBlKSB1c2VzCisgICAgLy8vIHRoZSBzcGVjaWFsIFN3aWZ0IGVycm9yLXJlc3VsdCBBQkkgdHJlYXRtZW50LiAgVGhlcmUgY2FuIGJlIGF0CisgICAgLy8vIG1vc3Qgb25lIHBhcmFtZXRlciBvbiBhIGdpdmVuIGZ1bmN0aW9uIHRoYXQgdXNlcyB0aGlzIHRyZWF0bWVudC4KKyAgICBTd2lmdEVycm9yUmVzdWx0LAorCisgICAgLy8vIFRoaXMgcGFyYW1ldGVyICh3aGljaCBtdXN0IGhhdmUgcG9pbnRlciB0eXBlKSB1c2VzIHRoZSBzcGVjaWFsCisgICAgLy8vIFN3aWZ0IGNvbnRleHQtcG9pbnRlciBBQkkgdHJlYXRtZW50LiAgVGhlcmUgY2FuIGJlIGF0CisgICAgLy8vIG1vc3Qgb25lIHBhcmFtZXRlciBvbiBhIGdpdmVuIGZ1bmN0aW9uIHRoYXQgdXNlcyB0aGlzIHRyZWF0bWVudC4KKyAgICBTd2lmdENvbnRleHQKKyAgfTsKKworICBsbHZtOjpTdHJpbmdSZWYgZ2V0UGFyYW1ldGVyQUJJU3BlbGxpbmcoUGFyYW1ldGVyQUJJIGtpbmQpOworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0JBU0lDX1NQRUNJRklFUlNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvU3luY1Njb3BlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9TeW5jU2NvcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWFjMDA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvU3luY1Njb3BlLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8vPT09LS0tIFN5bmNTY29wZS5oIC0gQXRvbWljIHN5bmNocm9uaXphdGlvbiBzY29wZXMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBQcm92aWRlcyBkZWZpbml0aW9ucyBmb3IgdGhlIGF0b21pYyBzeW5jaHJvbml6YXRpb24gc2NvcGVzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfU1lOQ1NDT1BFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19CQVNJQ19TWU5DU0NPUEVfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBEZWZpbmVzIHN5bmNoIHNjb3BlIHZhbHVlcyB1c2VkIGludGVybmFsbHkgYnkgY2xhbmcuCisvLy8KKy8vLyBUaGUgZW51bSB2YWx1ZXMgc3RhcnQgZnJvbSAwIGFuZCBhcmUgY29udGlndW91cy4gVGhleSBhcmUgbWFpbmx5IHVzZWQgZm9yCisvLy8gZW51bWVyYXRpbmcgYWxsIHN1cHBvcnRlZCBzeW5jaCBzY29wZSB2YWx1ZXMgYW5kIG1hcHBpbmcgdGhlbSB0byBMTFZNCisvLy8gc3luY2ggc2NvcGVzLiBUaGVpciBudW1lcmljYWwgdmFsdWVzIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgY29ycmVzcG9uZGluZworLy8vIHN5bmNoIHNjb3BlIGVudW1zIHVzZWQgaW4gc291cmNlIGxhbmd1YWdlcy4KKy8vLworLy8vIEluIGF0b21pYyBidWlsdGluIGFuZCBleHByZXNzaW9ucywgbGFuZ3VhZ2Utc3BlY2lmaWMgc3luY2ggc2NvcGUgZW51bXMgYXJlCisvLy8gdXNlZC4gQ3VycmVudGx5IG9ubHkgT3BlbkNMIG1lbW9yeSBzY29wZSBlbnVtcyBhcmUgc3VwcG9ydGVkIGFuZCBhc3N1bWVkCisvLy8gdG8gYmUgdXNlZCBieSBhbGwgbGFuZ3VhZ2VzLiBIb3dldmVyLCBpbiB0aGUgZnV0dXJlLCBvdGhlciBsYW5ndWFnZXMgbWF5CisvLy8gZGVmaW5lIHRoZWlyIG93biBzZXQgb2Ygc3luY2ggc2NvcGUgZW51bXMuIFRoZSBsYW5ndWFnZS1zcGVjaWZpYyBzeW5jaCBzY29wZQorLy8vIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYnkgY2xhc3MgQXRvbWljU2NvcGVNb2RlbCBhbmQgaXRzIGRlcml2ZWQgY2xhc3Nlcy4KKy8vLworLy8vIFRvIGFkZCBhIG5ldyBlbnVtIHZhbHVlOgorLy8vICAgQWRkIHRoZSBlbnVtIHZhbHVlIHRvIGVudW0gY2xhc3MgU3luY1Njb3BlLgorLy8vICAgVXBkYXRlIGVudW0gdmFsdWUgTGFzdCBpZiBuZWNlc3NhcnkuCisvLy8gICBVcGRhdGUgZ2V0QXNTdHJpbmcuCisvLy8KK2VudW0gY2xhc3MgU3luY1Njb3BlIHsKKyAgT3BlbkNMV29ya0dyb3VwLAorICBPcGVuQ0xEZXZpY2UsCisgIE9wZW5DTEFsbFNWTURldmljZXMsCisgIE9wZW5DTFN1Ykdyb3VwLAorICBMYXN0ID0gT3BlbkNMU3ViR3JvdXAKK307CisKK2lubGluZSBsbHZtOjpTdHJpbmdSZWYgZ2V0QXNTdHJpbmcoU3luY1Njb3BlIFMpIHsKKyAgc3dpdGNoIChTKSB7CisgIGNhc2UgU3luY1Njb3BlOjpPcGVuQ0xXb3JrR3JvdXA6CisgICAgcmV0dXJuICJvcGVuY2xfd29ya2dyb3VwIjsKKyAgY2FzZSBTeW5jU2NvcGU6Ok9wZW5DTERldmljZToKKyAgICByZXR1cm4gIm9wZW5jbF9kZXZpY2UiOworICBjYXNlIFN5bmNTY29wZTo6T3BlbkNMQWxsU1ZNRGV2aWNlczoKKyAgICByZXR1cm4gIm9wZW5jbF9hbGxzdm1kZXZpY2VzIjsKKyAgY2FzZSBTeW5jU2NvcGU6Ok9wZW5DTFN1Ykdyb3VwOgorICAgIHJldHVybiAib3BlbmNsX3N1Ymdyb3VwIjsKKyAgfQorICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIHN5bmNoIHNjb3BlIik7Cit9CisKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUga2luZCBvZiBhdG9taWMgc2NvcGUgbW9kZWxzLgorZW51bSBjbGFzcyBBdG9taWNTY29wZU1vZGVsS2luZCB7IE5vbmUsIE9wZW5DTCB9OworCisvLy8gXGJyaWVmIERlZmluZXMgdGhlIGludGVyZmFjZSBmb3Igc3luY2ggc2NvcGUgbW9kZWwuCitjbGFzcyBBdG9taWNTY29wZU1vZGVsIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+QXRvbWljU2NvcGVNb2RlbCgpIHt9CisgIC8vLyBcYnJpZWYgTWFwcyBsYW5ndWFnZSBzcGVjaWZpYyBzeW5jaCBzY29wZSB2YWx1ZXMgdG8gaW50ZXJuYWwKKyAgLy8vIFN5bmNTY29wZSBlbnVtLgorICB2aXJ0dWFsIFN5bmNTY29wZSBtYXAodW5zaWduZWQgUykgY29uc3QgPSAwOworCisgIC8vLyBcYnJpZWYgQ2hlY2sgaWYgdGhlIGNvbXBpbGUtdGltZSBjb25zdGFudCBzeW5jaCBzY29wZSB2YWx1ZQorICAvLy8gaXMgdmFsaWQuCisgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkKHVuc2lnbmVkIFMpIGNvbnN0ID0gMDsKKworICAvLy8gXGJyaWVmIEdldCBhbGwgcG9zc2libGUgc3luY2ggc2NvcGUgdmFsdWVzIHRoYXQgbWlnaHQgYmUKKyAgLy8vIGVuY291bnRlcmVkIGF0IHJ1bnRpbWUgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlLgorICB2aXJ0dWFsIEFycmF5UmVmPHVuc2lnbmVkPiBnZXRSdW50aW1lVmFsdWVzKCkgY29uc3QgPSAwOworCisgIC8vLyBcYnJpZWYgSWYgYXRvbWljIGJ1aWx0aW4gZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggaW52YWxpZAorICAvLy8gc3luY2ggc2NvcGUgdmFsdWUgYXQgcnVudGltZSwgaXQgd2lsbCBmYWxsIGJhY2sgdG8gYSB2YWxpZAorICAvLy8gc3luY2ggc2NvcGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRGYWxsQmFja1ZhbHVlKCkgY29uc3QgPSAwOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIGF0b21pYyBzY29wZSBtb2RlbCBieSBBdG9taWNTY29wZU1vZGVsS2luZC4KKyAgLy8vIFxyZXR1cm4gYW4gZW1wdHkgc3RkOjp1bmlxdWVfcHRyIGZvciBBdG9taWNTY29wZU1vZGVsS2luZDo6Tm9uZS4KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBdG9taWNTY29wZU1vZGVsPiBjcmVhdGUoQXRvbWljU2NvcGVNb2RlbEtpbmQgSyk7Cit9OworCisvLy8gXGJyaWVmIERlZmluZXMgdGhlIHN5bmNoIHNjb3BlIG1vZGVsIGZvciBPcGVuQ0wuCitjbGFzcyBBdG9taWNTY29wZU9wZW5DTE1vZGVsIDogcHVibGljIEF0b21pY1Njb3BlTW9kZWwgeworcHVibGljOgorICAvLy8gVGhlIGVudW0gdmFsdWVzIG1hdGNoIHRoZSBwcmUtZGVmaW5lZCBtYWNyb3MKKyAgLy8vIF9fT1BFTkNMX01FTU9SWV9TQ09QRV8qLCB3aGljaCBhcmUgdXNlZCB0byBkZWZpbmUgbWVtb3J5X3Njb3BlXyoKKyAgLy8vIGVudW1zIGluIG9wZW5jbC1jLmguCisgIGVudW0gSUQgeworICAgIFdvcmtHcm91cCA9IDEsCisgICAgRGV2aWNlID0gMiwKKyAgICBBbGxTVk1EZXZpY2VzID0gMywKKyAgICBTdWJHcm91cCA9IDQsCisgICAgTGFzdCA9IFN1Ykdyb3VwCisgIH07CisKKyAgQXRvbWljU2NvcGVPcGVuQ0xNb2RlbCgpIHt9CisKKyAgU3luY1Njb3BlIG1hcCh1bnNpZ25lZCBTKSBjb25zdCBvdmVycmlkZSB7CisgICAgc3dpdGNoIChzdGF0aWNfY2FzdDxJRD4oUykpIHsKKyAgICBjYXNlIFdvcmtHcm91cDoKKyAgICAgIHJldHVybiBTeW5jU2NvcGU6Ok9wZW5DTFdvcmtHcm91cDsKKyAgICBjYXNlIERldmljZToKKyAgICAgIHJldHVybiBTeW5jU2NvcGU6Ok9wZW5DTERldmljZTsKKyAgICBjYXNlIEFsbFNWTURldmljZXM6CisgICAgICByZXR1cm4gU3luY1Njb3BlOjpPcGVuQ0xBbGxTVk1EZXZpY2VzOworICAgIGNhc2UgU3ViR3JvdXA6CisgICAgICByZXR1cm4gU3luY1Njb3BlOjpPcGVuQ0xTdWJHcm91cDsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBsYW5ndWFnZSBzeW5jaCBzY29wZSB2YWx1ZSIpOworICB9CisKKyAgYm9vbCBpc1ZhbGlkKHVuc2lnbmVkIFMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUyA+PSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oV29ya0dyb3VwKSAmJgorICAgICAgICAgICBTIDw9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihMYXN0KTsKKyAgfQorCisgIEFycmF5UmVmPHVuc2lnbmVkPiBnZXRSdW50aW1lVmFsdWVzKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHN0YXRpY19hc3NlcnQoTGFzdCA9PSBTdWJHcm91cCwgIkRvZXMgbm90IGluY2x1ZGUgYWxsIHN5bmNoIHNjb3BlcyIpOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTY29wZXNbXSA9IHsKKyAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KFdvcmtHcm91cCksIHN0YXRpY19jYXN0PHVuc2lnbmVkPihEZXZpY2UpLAorICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oQWxsU1ZNRGV2aWNlcyksIHN0YXRpY19jYXN0PHVuc2lnbmVkPihTdWJHcm91cCl9OworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoU2NvcGVzKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldEZhbGxCYWNrVmFsdWUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkPihBbGxTVk1EZXZpY2VzKTsKKyAgfQorfTsKKworaW5saW5lIHN0ZDo6dW5pcXVlX3B0cjxBdG9taWNTY29wZU1vZGVsPgorQXRvbWljU2NvcGVNb2RlbDo6Y3JlYXRlKEF0b21pY1Njb3BlTW9kZWxLaW5kIEspIHsKKyAgc3dpdGNoIChLKSB7CisgIGNhc2UgQXRvbWljU2NvcGVNb2RlbEtpbmQ6Ok5vbmU6CisgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxBdG9taWNTY29wZU1vZGVsPnt9OworICBjYXNlIEF0b21pY1Njb3BlTW9kZWxLaW5kOjpPcGVuQ0w6CisgICAgcmV0dXJuIGxsdm06Om1ha2VfdW5pcXVlPEF0b21pY1Njb3BlT3BlbkNMTW9kZWw+KCk7CisgIH0KKyAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBhdG9taWMgc2NvcGUgbW9kZWwga2luZCIpOworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1RhcmdldEJ1aWx0aW5zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9UYXJnZXRCdWlsdGlucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNGY1ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9UYXJnZXRCdWlsdGlucy5oCkBAIC0wLDAgKzEsMjE1IEBACisvLz09PS0tLSBUYXJnZXRCdWlsdGlucy5oIC0gVGFyZ2V0IHNwZWNpZmljIGJ1aWx0aW4gSURzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRW51bWVyYXRlcyB0YXJnZXQtc3BlY2lmaWMgYnVpbHRpbnMgaW4gdGhlaXIgb3duIG5hbWVzcGFjZXMgd2l0aGluCisvLy8gbmFtZXNwYWNlIDo6Y2xhbmcuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19UQVJHRVRCVUlMVElOU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfVEFSR0VUQlVJTFRJTlNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQnVpbHRpbnMuaCIKKyN1bmRlZiBQUEMKKworbmFtZXNwYWNlIGNsYW5nIHsKKworICBuYW1lc3BhY2UgTkVPTiB7CisgIGVudW0geworICAgIExhc3RUSUJ1aWx0aW4gPSBjbGFuZzo6QnVpbHRpbjo6Rmlyc3RUU0J1aWx0aW4gLSAxLAorI2RlZmluZSBCVUlMVElOKElELCBUWVBFLCBBVFRSUykgQkkjI0lELAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0J1aWx0aW5zTkVPTi5kZWYiCisgICAgRmlyc3RUU0J1aWx0aW4KKyAgfTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQVJNIGJ1aWx0aW5zCisgIG5hbWVzcGFjZSBBUk0geworICAgIGVudW0geworICAgICAgTGFzdFRJQnVpbHRpbiA9IGNsYW5nOjpCdWlsdGluOjpGaXJzdFRTQnVpbHRpbi0xLAorICAgICAgTGFzdE5FT05CdWlsdGluID0gTkVPTjo6Rmlyc3RUU0J1aWx0aW4gLSAxLAorI2RlZmluZSBCVUlMVElOKElELCBUWVBFLCBBVFRSUykgQkkjI0lELAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0J1aWx0aW5zQVJNLmRlZiIKKyAgICAgIExhc3RUU0J1aWx0aW4KKyAgICB9OworICB9CisKKyAgLy8vIFxicmllZiBBQXJjaDY0IGJ1aWx0aW5zCisgIG5hbWVzcGFjZSBBQXJjaDY0IHsKKyAgZW51bSB7CisgICAgTGFzdFRJQnVpbHRpbiA9IGNsYW5nOjpCdWlsdGluOjpGaXJzdFRTQnVpbHRpbiAtIDEsCisgICAgTGFzdE5FT05CdWlsdGluID0gTkVPTjo6Rmlyc3RUU0J1aWx0aW4gLSAxLAorICAjZGVmaW5lIEJVSUxUSU4oSUQsIFRZUEUsIEFUVFJTKSBCSSMjSUQsCisgICNpbmNsdWRlICJjbGFuZy9CYXNpYy9CdWlsdGluc0FBcmNoNjQuZGVmIgorICAgIExhc3RUU0J1aWx0aW4KKyAgfTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUFBDIGJ1aWx0aW5zCisgIG5hbWVzcGFjZSBQUEMgeworICAgIGVudW0geworICAgICAgICBMYXN0VElCdWlsdGluID0gY2xhbmc6OkJ1aWx0aW46OkZpcnN0VFNCdWlsdGluLTEsCisjZGVmaW5lIEJVSUxUSU4oSUQsIFRZUEUsIEFUVFJTKSBCSSMjSUQsCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQnVpbHRpbnNQUEMuZGVmIgorICAgICAgICBMYXN0VFNCdWlsdGluCisgICAgfTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTlZQVFggYnVpbHRpbnMKKyAgbmFtZXNwYWNlIE5WUFRYIHsKKyAgICBlbnVtIHsKKyAgICAgICAgTGFzdFRJQnVpbHRpbiA9IGNsYW5nOjpCdWlsdGluOjpGaXJzdFRTQnVpbHRpbi0xLAorI2RlZmluZSBCVUlMVElOKElELCBUWVBFLCBBVFRSUykgQkkjI0lELAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0J1aWx0aW5zTlZQVFguZGVmIgorICAgICAgICBMYXN0VFNCdWlsdGluCisgICAgfTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQU1ER1BVIGJ1aWx0aW5zCisgIG5hbWVzcGFjZSBBTURHUFUgeworICBlbnVtIHsKKyAgICBMYXN0VElCdWlsdGluID0gY2xhbmc6OkJ1aWx0aW46OkZpcnN0VFNCdWlsdGluIC0gMSwKKyAgI2RlZmluZSBCVUlMVElOKElELCBUWVBFLCBBVFRSUykgQkkjI0lELAorICAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQnVpbHRpbnNBTURHUFUuZGVmIgorICAgIExhc3RUU0J1aWx0aW4KKyAgfTsKKyAgfQorCisgIC8vLyBcYnJpZWYgWDg2IGJ1aWx0aW5zCisgIG5hbWVzcGFjZSBYODYgeworICBlbnVtIHsKKyAgICBMYXN0VElCdWlsdGluID0gY2xhbmc6OkJ1aWx0aW46OkZpcnN0VFNCdWlsdGluIC0gMSwKKyNkZWZpbmUgQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMpIEJJIyNJRCwKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9CdWlsdGluc1g4Ni5kZWYiCisgICAgRmlyc3RYODZfNjRCdWlsdGluLAorICAgIExhc3RYODZDb21tb25CdWlsdGluID0gRmlyc3RYODZfNjRCdWlsdGluIC0gMSwKKyNkZWZpbmUgQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMpIEJJIyNJRCwKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9CdWlsdGluc1g4Nl82NC5kZWYiCisgICAgTGFzdFRTQnVpbHRpbgorICB9OworICB9CisKKyAgLy8vIFxicmllZiBGbGFncyB0byBpZGVudGlmeSB0aGUgdHlwZXMgZm9yIG92ZXJsb2FkZWQgTmVvbiBidWlsdGlucy4KKyAgLy8vCisgIC8vLyBUaGVzZSBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBmbGFncyBpbiB1dGlscy9UYWJsZUdlbi9OZW9uRW1pdHRlci5oLgorICBjbGFzcyBOZW9uVHlwZUZsYWdzIHsKKyAgICBlbnVtIHsKKyAgICAgIEVsdFR5cGVNYXNrID0gMHhmLAorICAgICAgVW5zaWduZWRGbGFnID0gMHgxMCwKKyAgICAgIFF1YWRGbGFnID0gMHgyMAorICAgIH07CisgICAgdWludDMyX3QgRmxhZ3M7CisKKyAgcHVibGljOgorICAgIGVudW0gRWx0VHlwZSB7CisgICAgICBJbnQ4LAorICAgICAgSW50MTYsCisgICAgICBJbnQzMiwKKyAgICAgIEludDY0LAorICAgICAgUG9seTgsCisgICAgICBQb2x5MTYsCisgICAgICBQb2x5NjQsCisgICAgICBQb2x5MTI4LAorICAgICAgRmxvYXQxNiwKKyAgICAgIEZsb2F0MzIsCisgICAgICBGbG9hdDY0CisgICAgfTsKKworICAgIE5lb25UeXBlRmxhZ3ModW5zaWduZWQgRikgOiBGbGFncyhGKSB7fQorICAgIE5lb25UeXBlRmxhZ3MoRWx0VHlwZSBFVCwgYm9vbCBJc1Vuc2lnbmVkLCBib29sIElzUXVhZCkgOiBGbGFncyhFVCkgeworICAgICAgaWYgKElzVW5zaWduZWQpCisgICAgICAgIEZsYWdzIHw9IFVuc2lnbmVkRmxhZzsKKyAgICAgIGlmIChJc1F1YWQpCisgICAgICAgIEZsYWdzIHw9IFF1YWRGbGFnOworICAgIH0KKworICAgIEVsdFR5cGUgZ2V0RWx0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIChFbHRUeXBlKShGbGFncyAmIEVsdFR5cGVNYXNrKTsgfQorICAgIGJvb2wgaXNQb2x5KCkgY29uc3QgeworICAgICAgRWx0VHlwZSBFVCA9IGdldEVsdFR5cGUoKTsKKyAgICAgIHJldHVybiBFVCA9PSBQb2x5OCB8fCBFVCA9PSBQb2x5MTY7CisgICAgfQorICAgIGJvb2wgaXNVbnNpZ25lZCgpIGNvbnN0IHsgcmV0dXJuIChGbGFncyAmIFVuc2lnbmVkRmxhZykgIT0gMDsgfQorICAgIGJvb2wgaXNRdWFkKCkgY29uc3QgeyByZXR1cm4gKEZsYWdzICYgUXVhZEZsYWcpICE9IDA7IH0KKyAgfTsKKworICAvLy8gXGJyaWVmIEhleGFnb24gYnVpbHRpbnMKKyAgbmFtZXNwYWNlIEhleGFnb24geworICAgIGVudW0geworICAgICAgICBMYXN0VElCdWlsdGluID0gY2xhbmc6OkJ1aWx0aW46OkZpcnN0VFNCdWlsdGluLTEsCisjZGVmaW5lIEJVSUxUSU4oSUQsIFRZUEUsIEFUVFJTKSBCSSMjSUQsCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQnVpbHRpbnNIZXhhZ29uLmRlZiIKKyAgICAgICAgTGFzdFRTQnVpbHRpbgorICAgIH07CisgIH0KKworICAvLy8gXGJyaWVmIE5pb3MyIGJ1aWx0aW5zCisgIG5hbWVzcGFjZSBOaW9zMiB7CisgIGVudW0geworICAgIExhc3RUSUJ1aWx0aW4gPSBjbGFuZzo6QnVpbHRpbjo6Rmlyc3RUU0J1aWx0aW4gLSAxLAorI2RlZmluZSBCVUlMVElOKElELCBUWVBFLCBBVFRSUykgQkkjI0lELAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0J1aWx0aW5zTmlvczIuZGVmIgorICAgIExhc3RUU0J1aWx0aW4KKyAgfTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTUlQUyBidWlsdGlucworICBuYW1lc3BhY2UgTWlwcyB7CisgICAgZW51bSB7CisgICAgICAgIExhc3RUSUJ1aWx0aW4gPSBjbGFuZzo6QnVpbHRpbjo6Rmlyc3RUU0J1aWx0aW4tMSwKKyNkZWZpbmUgQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMpIEJJIyNJRCwKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9CdWlsdGluc01pcHMuZGVmIgorICAgICAgICBMYXN0VFNCdWlsdGluCisgICAgfTsKKyAgfQorCisgIC8vLyBcYnJpZWYgWENvcmUgYnVpbHRpbnMKKyAgbmFtZXNwYWNlIFhDb3JlIHsKKyAgICBlbnVtIHsKKyAgICAgICAgTGFzdFRJQnVpbHRpbiA9IGNsYW5nOjpCdWlsdGluOjpGaXJzdFRTQnVpbHRpbi0xLAorI2RlZmluZSBCVUlMVElOKElELCBUWVBFLCBBVFRSUykgQkkjI0lELAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0J1aWx0aW5zWENvcmUuZGVmIgorICAgICAgICBMYXN0VFNCdWlsdGluCisgICAgfTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTGU2NCBidWlsdGlucworICBuYW1lc3BhY2UgTGU2NCB7CisgIGVudW0geworICAgIExhc3RUSUJ1aWx0aW4gPSBjbGFuZzo6QnVpbHRpbjo6Rmlyc3RUU0J1aWx0aW4gLSAxLAorICAjZGVmaW5lIEJVSUxUSU4oSUQsIFRZUEUsIEFUVFJTKSBCSSMjSUQsCisgICNpbmNsdWRlICJjbGFuZy9CYXNpYy9CdWlsdGluc0xlNjQuZGVmIgorICAgIExhc3RUU0J1aWx0aW4KKyAgfTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU3lzdGVtWiBidWlsdGlucworICBuYW1lc3BhY2UgU3lzdGVtWiB7CisgICAgZW51bSB7CisgICAgICAgIExhc3RUSUJ1aWx0aW4gPSBjbGFuZzo6QnVpbHRpbjo6Rmlyc3RUU0J1aWx0aW4tMSwKKyNkZWZpbmUgQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMpIEJJIyNJRCwKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9CdWlsdGluc1N5c3RlbVouZGVmIgorICAgICAgICBMYXN0VFNCdWlsdGluCisgICAgfTsKKyAgfQorCisgIC8vLyBcYnJpZWYgV2ViQXNzZW1ibHkgYnVpbHRpbnMKKyAgbmFtZXNwYWNlIFdlYkFzc2VtYmx5IHsKKyAgICBlbnVtIHsKKyAgICAgIExhc3RUSUJ1aWx0aW4gPSBjbGFuZzo6QnVpbHRpbjo6Rmlyc3RUU0J1aWx0aW4tMSwKKyNkZWZpbmUgQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMpIEJJIyNJRCwKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9CdWlsdGluc1dlYkFzc2VtYmx5LmRlZiIKKyAgICAgIExhc3RUU0J1aWx0aW4KKyAgICB9OworICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZy4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9UYXJnZXRDWFhBQkkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1RhcmdldENYWEFCSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NGYwN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9UYXJnZXRDWFhBQkkuaApAQCAtMCwwICsxLDM0NiBAQAorLy89PT0tLS0gVGFyZ2V0Q1hYQUJJLmggLSBDKysgQUJJIFRhcmdldCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgdGhlIFRhcmdldENYWEFCSSBjbGFzcywgd2hpY2ggYWJzdHJhY3RzIGRldGFpbHMgb2YgdGhlCisvLy8gQysrIEFCSSB0aGF0IHdlJ3JlIHRhcmdldGluZy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX1RBUkdFVENYWEFCSV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfVEFSR0VUQ1hYQUJJX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKKy8vLyBcYnJpZWYgVGhlIGJhc2ljIGFic3RyYWN0aW9uIGZvciB0aGUgdGFyZ2V0IEMrKyBBQkkuCitjbGFzcyBUYXJnZXRDWFhBQkkgeworcHVibGljOgorICAvLy8gXGJyaWVmIFRoZSBiYXNpYyBDKysgQUJJIGtpbmQuCisgIGVudW0gS2luZCB7CisgICAgLy8vIFRoZSBnZW5lcmljIEl0YW5pdW0gQUJJIGlzIHRoZSBzdGFuZGFyZCBBQkkgb2YgbW9zdCBvcGVuLXNvdXJjZQorICAgIC8vLyBhbmQgVW5peC1saWtlIHBsYXRmb3Jtcy4gIEl0IGlzIHRoZSBwcmltYXJ5IEFCSSB0YXJnZXRlZCBieQorICAgIC8vLyBtYW55IGNvbXBpbGVycywgaW5jbHVkaW5nIENsYW5nIGFuZCBHQ0MuCisgICAgLy8vCisgICAgLy8vIEl0IGlzIGRvY3VtZW50ZWQgaGVyZToKKyAgICAvLy8gICBodHRwOi8vd3d3LmNvZGVzb3VyY2VyeS5jb20vcHVibGljL2N4eC1hYmkvCisgICAgR2VuZXJpY0l0YW5pdW0sCisKKyAgICAvLy8gVGhlIGdlbmVyaWMgQVJNIEFCSSBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIEl0YW5pdW0gQUJJCisgICAgLy8vIHByb3Bvc2VkIGJ5IEFSTSBmb3IgdXNlIG9uIEFSTS1iYXNlZCBwbGF0Zm9ybXMuCisgICAgLy8vCisgICAgLy8vIFRoZXNlIGNoYW5nZXMgaW5jbHVkZToKKyAgICAvLy8gICAtIHRoZSByZXByZXNlbnRhdGlvbiBvZiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgaXMgYWRqdXN0ZWQKKyAgICAvLy8gICAgIHRvIG5vdCBjb25mbGljdCB3aXRoIHRoZSAndGh1bWInIGJpdCBvZiBBUk0gZnVuY3Rpb24gcG9pbnRlcnM7CisgICAgLy8vICAgLSBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIHJldHVybiAndGhpcyc7CisgICAgLy8vICAgLSBndWFyZCB2YXJpYWJsZXMgYXJlIHNtYWxsZXI7CisgICAgLy8vICAgLSBpbmxpbmUgZnVuY3Rpb25zIGFyZSBuZXZlciBrZXkgZnVuY3Rpb25zOworICAgIC8vLyAgIC0gYXJyYXkgY29va2llcyBoYXZlIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGxheW91dDsKKyAgICAvLy8gICAtIGFkZGl0aW9uYWwgY29udmVuaWVuY2UgZnVuY3Rpb25zIGFyZSBzcGVjaWZpZWQ7CisgICAgLy8vICAgLSBhbmQgbW9yZSEKKyAgICAvLy8KKyAgICAvLy8gSXQgaXMgZG9jdW1lbnRlZCBoZXJlOgorICAgIC8vLyAgICBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAvaGVscC90b3BpYy9jb20uYXJtLmRvYy5paGkwMDQxYy9JSEkwMDQxQ19jcHBhYmkucGRmCisgICAgR2VuZXJpY0FSTSwKKworICAgIC8vLyBUaGUgaU9TIEFCSSBpcyBhIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFSTSBBQkkuCisgICAgLy8vIFNldmVyYWwgb2YgdGhlIGZlYXR1cmVzIG9mIHRoZSBBUk0gQUJJIHdlcmUgbm90IGZ1bGx5IGltcGxlbWVudGVkCisgICAgLy8vIGluIHRoZSBjb21waWxlcnMgdGhhdCBpT1Mgd2FzIGxhdW5jaGVkIHdpdGguCisgICAgLy8vCisgICAgLy8vIEVzc2VudGlhbGx5LCB0aGUgaU9TIEFCSSBpbmNsdWRlcyB0aGUgQVJNIGNoYW5nZXMgdG86CisgICAgLy8vICAgLSBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMsCisgICAgLy8vICAgLSBndWFyZCB2YXJpYWJsZXMsCisgICAgLy8vICAgLSBhcnJheSBjb29raWVzLCBhbmQKKyAgICAvLy8gICAtIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3Igc2lnbmF0dXJlcy4KKyAgICBpT1MsCisKKyAgICAvLy8gVGhlIGlPUyA2NC1iaXQgQUJJIGlzIGZvbGxvd3MgQVJNJ3MgcHVibGlzaGVkIDY0LWJpdCBBQkkgbW9yZQorICAgIC8vLyBjbG9zZWx5LCBidXQgd2UgZG9uJ3QgZ3VhcmFudGVlIHRvIGZvbGxvdyBpdCBwZXJmZWN0bHkuCisgICAgLy8vCisgICAgLy8vIEl0IGlzIGRvY3VtZW50ZWQgaGVyZToKKyAgICAvLy8gICAgaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbQorICAgIC8vLyAgICAgICAgICAgICAgICAgIC9oZWxwL3RvcGljL2NvbS5hcm0uZG9jLmloaTAwNTlhL0lISTAwNTlBX2NwcGFiaTY0LnBkZgorICAgIGlPUzY0LAorCisgICAgLy8vIFdhdGNoT1MgaXMgYSBtb2Rlcm5pc2F0aW9uIG9mIHRoZSBpT1MgQUJJLCB3aGljaCByb3VnaGx5IG1lYW5zIGl0J3MKKyAgICAvLy8gdGhlIGlPUzY0IEFCSSBwb3J0ZWQgdG8gMzItYml0cy4gVGhlIHByaW1hcnkgZGlmZmVyZW5jZSBmcm9tIGlPUzY0IGlzCisgICAgLy8vIHRoYXQgUlRUSSBvYmplY3RzIG11c3Qgc3RpbGwgYmUgdW5pcXVlIGF0IHRoZSBtb21lbnQuCisgICAgV2F0Y2hPUywKKworICAgIC8vLyBUaGUgZ2VuZXJpYyBBQXJjaDY0IEFCSSBpcyBhbHNvIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgSXRhbml1bSBBQkksCisgICAgLy8vIGJ1dCBpdCBoYXMgZmV3ZXIgZGl2ZXJnZW5jZXMgdGhhbiB0aGUgMzItYml0IEFSTSBBQkkuCisgICAgLy8vCisgICAgLy8vIFRoZSByZWxldmFudCBjaGFuZ2VzIGZyb20gdGhlIGdlbmVyaWMgQUJJIGluIHRoaXMgY2FzZSBhcmU6CisgICAgLy8vICAgLSByZXByZXNlbnRhdGlvbiBvZiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgYWRqdXN0ZWQgYXMgaW4gQVJNLgorICAgIC8vLyAgIC0gZ3VhcmQgdmFyaWFibGVzICBhcmUgc21hbGxlci4KKyAgICBHZW5lcmljQUFyY2g2NCwKKworICAgIC8vLyBUaGUgZ2VuZXJpYyBNaXBzIEFCSSBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIEl0YW5pdW0gQUJJLgorICAgIC8vLworICAgIC8vLyBBdCB0aGUgbW9tZW50LCBvbmx5IGNoYW5nZSBmcm9tIHRoZSBnZW5lcmljIEFCSSBpbiB0aGlzIGNhc2UgaXM6CisgICAgLy8vICAgLSByZXByZXNlbnRhdGlvbiBvZiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgYWRqdXN0ZWQgYXMgaW4gQVJNLgorICAgIEdlbmVyaWNNSVBTLAorCisgICAgLy8vIFRoZSBXZWJBc3NlbWJseSBBQkkgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBJdGFuaXVtIEFCSS4KKyAgICAvLy8KKyAgICAvLy8gVGhlIGNoYW5nZXMgZnJvbSB0aGUgSXRhbml1bSBBQkkgYXJlOgorICAgIC8vLyAgIC0gcmVwcmVzZW50YXRpb24gb2YgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzIGlzIGFkanVzdGVkLCBhcyBpbiBBUk07CisgICAgLy8vICAgLSBtZW1iZXIgZnVuY3Rpb25zIGFyZSBub3Qgc3BlY2lhbGx5IGFsaWduZWQ7CisgICAgLy8vICAgLSBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIHJldHVybiAndGhpcycsIGFzIGluIEFSTTsKKyAgICAvLy8gICAtIGd1YXJkIHZhcmlhYmxlcyBhcmUgMzItYml0IG9uIHdhc20zMiwgYXMgaW4gQVJNOworICAgIC8vLyAgIC0gdW51c2VkIGJpdHMgb2YgZ3VhcmQgdmFyaWFibGVzIGFyZSByZXNlcnZlZCwgYXMgaW4gQVJNOworICAgIC8vLyAgIC0gaW5saW5lIGZ1bmN0aW9ucyBhcmUgbmV2ZXIga2V5IGZ1bmN0aW9ucywgYXMgaW4gQVJNOworICAgIC8vLyAgIC0gQysrMTEgUE9EIHJ1bGVzIGFyZSB1c2VkIGZvciB0YWlsIHBhZGRpbmcsIGFzIGluIGlPUzY0LgorICAgIC8vLworICAgIC8vLyBUT0RPOiBBdCBwcmVzZW50IHRoZSBXZWJBc3NlbWJseSBBQkkgaXMgbm90IGNvbnNpZGVyZWQgc3RhYmxlLCBzbyBub25lCisgICAgLy8vIG9mIHRoZXNlIGRldGFpbHMgaXMgbmVjZXNzYXJpbHkgZmluYWwgeWV0LgorICAgIFdlYkFzc2VtYmx5LAorCisgICAgLy8vIFRoZSBNaWNyb3NvZnQgQUJJIGlzIHRoZSBBQkkgdXNlZCBieSBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAoYW5kCisgICAgLy8vIGNvbXBhdGlibGUgY29tcGlsZXJzKS4KKyAgICAvLy8KKyAgICAvLy8gRklYTUU6IHNob3VsZCB0aGlzIGJlIHNwbGl0IGludG8gV2luMzIgYW5kIFdpbjY0IHZhcmlhbnRzPworICAgIC8vLworICAgIC8vLyBPbmx5IHNjYXR0ZXJlZCBhbmQgaW5jb21wbGV0ZSBvZmZpY2lhbCBkb2N1bWVudGF0aW9uIGV4aXN0cy4KKyAgICBNaWNyb3NvZnQKKyAgfTsKKworcHJpdmF0ZToKKyAgLy8gUmlnaHQgbm93LCB0aGlzIGNsYXNzIGlzIHBhc3NlZCBhcm91bmQgYXMgYSBjaGVhcCB2YWx1ZSB0eXBlLgorICAvLyBJZiB5b3UgYWRkIG1vcmUgbWVtYmVycywgZXNwZWNpYWxseSBub24tUE9EIG1lbWJlcnMsIHBsZWFzZQorICAvLyBhdWRpdCB0aGUgdXNlcnMgdG8gcGFzcyBpdCBieSByZWZlcmVuY2UgaW5zdGVhZC4KKyAgS2luZCBUaGVLaW5kOworCitwdWJsaWM6CisgIC8vLyBBIGJvZ3VzIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwbGF0Zm9ybSBBQkkuCisgIFRhcmdldENYWEFCSSgpIDogVGhlS2luZChHZW5lcmljSXRhbml1bSkge30KKworICBUYXJnZXRDWFhBQkkoS2luZCBraW5kKSA6IFRoZUtpbmQoa2luZCkge30KKworICB2b2lkIHNldChLaW5kIGtpbmQpIHsKKyAgICBUaGVLaW5kID0ga2luZDsKKyAgfQorCisgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIFRoZUtpbmQ7IH0KKworICAvLy8gXGJyaWVmIERvZXMgdGhpcyBBQkkgZ2VuZXJhbGx5IGZhbGwgaW50byB0aGUgSXRhbml1bSBmYW1pbHkgb2YgQUJJcz8KKyAgYm9vbCBpc0l0YW5pdW1GYW1pbHkoKSBjb25zdCB7CisgICAgc3dpdGNoIChnZXRLaW5kKCkpIHsKKyAgICBjYXNlIEdlbmVyaWNBQXJjaDY0OgorICAgIGNhc2UgR2VuZXJpY0l0YW5pdW06CisgICAgY2FzZSBHZW5lcmljQVJNOgorICAgIGNhc2UgaU9TOgorICAgIGNhc2UgaU9TNjQ6CisgICAgY2FzZSBXYXRjaE9TOgorICAgIGNhc2UgR2VuZXJpY01JUFM6CisgICAgY2FzZSBXZWJBc3NlbWJseToKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBNaWNyb3NvZnQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoImJhZCBBQkkga2luZCIpOworICB9CisKKyAgLy8vIFxicmllZiBJcyB0aGlzIEFCSSBhbiBNU1ZDLWNvbXBhdGlibGUgQUJJPworICBib29sIGlzTWljcm9zb2Z0KCkgY29uc3QgeworICAgIHN3aXRjaCAoZ2V0S2luZCgpKSB7CisgICAgY2FzZSBHZW5lcmljQUFyY2g2NDoKKyAgICBjYXNlIEdlbmVyaWNJdGFuaXVtOgorICAgIGNhc2UgR2VuZXJpY0FSTToKKyAgICBjYXNlIGlPUzoKKyAgICBjYXNlIGlPUzY0OgorICAgIGNhc2UgV2F0Y2hPUzoKKyAgICBjYXNlIEdlbmVyaWNNSVBTOgorICAgIGNhc2UgV2ViQXNzZW1ibHk6CisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjYXNlIE1pY3Jvc29mdDoKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJiYWQgQUJJIGtpbmQiKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQXJlIG1lbWJlciBmdW5jdGlvbnMgZGlmZmVyZW50bHkgYWxpZ25lZD8KKyAgLy8vCisgIC8vLyBNYW55IEl0YW5pdW0tc3R5bGUgQysrIEFCSXMgcmVxdWlyZSBtZW1iZXIgZnVuY3Rpb25zIHRvIGJlIGFsaWduZWQsIHNvCisgIC8vLyB0aGF0IGEgcG9pbnRlciB0byBzdWNoIGEgZnVuY3Rpb24gaXMgZ3VhcmFudGVlZCB0byBoYXZlIGEgemVybyBpbiB0aGUKKyAgLy8vIGxlYXN0IHNpZ25pZmljYW50IGJpdCwgc28gdGhhdCBwb2ludGVycyB0byBtZW1iZXIgZnVuY3Rpb25zIGNhbiB1c2UgdGhhdAorICAvLy8gYml0IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdmlydHVhbCBhbmQgbm9uLXZpcnR1YWwgZnVuY3Rpb25zLiBIb3dldmVyLAorICAvLy8gc29tZSBJdGFuaXVtLXN0eWxlIEMrKyBBQklzIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB2aXJ0dWFsIGFuZCBub24tdmlydHVhbAorICAvLy8gZnVuY3Rpb25zIHZpYSBvdGhlciBtZWFucywgYW5kIGNvbnNlcXVlbnRseSBkb24ndCByZXF1aXJlIHRoYXQgbWVtYmVyCisgIC8vLyBmdW5jdGlvbnMgYmUgYWxpZ25lZC4KKyAgYm9vbCBhcmVNZW1iZXJGdW5jdGlvbnNBbGlnbmVkKCkgY29uc3QgeworICAgIHN3aXRjaCAoZ2V0S2luZCgpKSB7CisgICAgY2FzZSBXZWJBc3NlbWJseToKKyAgICAgIC8vIFdlYkFzc2VtYmx5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgc3BlY2lhbCBhbGlnbm1lbnQgZm9yIG1lbWJlciBmdW5jdGlvbnMuCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBHZW5lcmljQVJNOgorICAgIGNhc2UgR2VuZXJpY0FBcmNoNjQ6CisgICAgY2FzZSBHZW5lcmljTUlQUzoKKyAgICAgIC8vIFRPRE86IEFSTS1zdHlsZSBwb2ludGVycyB0byBtZW1iZXIgZnVuY3Rpb25zIHB1dCB0aGUgZGlzY3JpbWluYXRvciBpbgorICAgICAgLy8gICAgICAgdGhlIHRoaXMgYWRqdXN0bWVudCwgc28gdGhleSBkb24ndCByZXF1aXJlIGZ1bmN0aW9ucyB0byBoYXZlIGFueQorICAgICAgLy8gICAgICAgc3BlY2lhbCBhbGlnbm1lbnQgYW5kIGNvdWxkIHRoZXJlZm9yZSBhbHNvIHJldHVybiBmYWxzZS4KKyAgICBjYXNlIEdlbmVyaWNJdGFuaXVtOgorICAgIGNhc2UgaU9TOgorICAgIGNhc2UgaU9TNjQ6CisgICAgY2FzZSBXYXRjaE9TOgorICAgIGNhc2UgTWljcm9zb2Z0OgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoImJhZCBBQkkga2luZCIpOworICB9CisKKyAgLy8vIEFyZSBhcmd1bWVudHMgdG8gYSBjYWxsIGRlc3Ryb3llZCBsZWZ0IHRvIHJpZ2h0IGluIHRoZSBjYWxsZWU/CisgIC8vLyBUaGlzIGlzIGEgZnVuZGFtZW50YWwgbGFuZ3VhZ2UgY2hhbmdlLCBzaW5jZSBpdCBpbXBsaWVzIHRoYXQgb2JqZWN0cworICAvLy8gcGFzc2VkIGJ5IHZhbHVlIGRvICpub3QqIGxpdmUgdG8gdGhlIGVuZCBvZiB0aGUgZnVsbCBleHByZXNzaW9uLgorICAvLy8gVGVtcG9yYXJpZXMgcGFzc2VkIHRvIGEgZnVuY3Rpb24gdGFraW5nIGEgY29uc3QgcmVmZXJlbmNlIGxpdmUgdG8gdGhlIGVuZAorICAvLy8gb2YgdGhlIGZ1bGwgZXhwcmVzc2lvbiBhcyB1c3VhbC4gIEJvdGggdGhlIGNhbGxlciBhbmQgdGhlIGNhbGxlZSBtdXN0CisgIC8vLyBoYXZlIGFjY2VzcyB0byB0aGUgZGVzdHJ1Y3Rvciwgd2hpbGUgb25seSB0aGUgY2FsbGVyIG5lZWRzIHRoZQorICAvLy8gZGVzdHJ1Y3RvciBpZiB0aGlzIGlzIGZhbHNlLgorICBib29sIGFyZUFyZ3NEZXN0cm95ZWRMZWZ0VG9SaWdodEluQ2FsbGVlKCkgY29uc3QgeworICAgIHJldHVybiBpc01pY3Jvc29mdCgpOworICB9CisKKyAgLy8vIFxicmllZiBEb2VzIHRoaXMgQUJJIGhhdmUgZGlmZmVyZW50IGVudHJ5cG9pbnRzIGZvciBjb21wbGV0ZS1vYmplY3QKKyAgLy8vIGFuZCBiYXNlLXN1Ym9iamVjdCBjb25zdHJ1Y3RvcnM/CisgIGJvb2wgaGFzQ29uc3RydWN0b3JWYXJpYW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNJdGFuaXVtRmFtaWx5KCk7CisgIH0KKworICAvLy8gXGJyaWVmIERvZXMgdGhpcyBBQkkgYWxsb3cgdmlydHVhbCBiYXNlcyB0byBiZSBwcmltYXJ5IGJhc2UgY2xhc3Nlcz8KKyAgYm9vbCBoYXNQcmltYXJ5VkJhc2VzKCkgY29uc3QgeworICAgIHJldHVybiBpc0l0YW5pdW1GYW1pbHkoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRG9lcyB0aGlzIEFCSSB1c2Uga2V5IGZ1bmN0aW9ucz8gIElmIHNvLCBjbGFzcyBkYXRhIHN1Y2ggYXMgdGhlCisgIC8vLyB2dGFibGUgaXMgZW1pdHRlZCB3aXRoIHN0cm9uZyBsaW5rYWdlIGJ5IHRoZSBUVSBjb250YWluaW5nIHRoZSBrZXkKKyAgLy8vIGZ1bmN0aW9uLgorICBib29sIGhhc0tleUZ1bmN0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNJdGFuaXVtRmFtaWx5KCk7CisgIH0KKworICAvLy8gXGJyaWVmIENhbiBhbiBvdXQtb2YtbGluZSBpbmxpbmUgZnVuY3Rpb24gc2VydmUgYXMgYSBrZXkgZnVuY3Rpb24/CisgIC8vLworICAvLy8gVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGluIEFCSXMgd2hlcmUgdHlwZSBkYXRhIChmb3IgZXhhbXBsZSwKKyAgLy8vIHZ0YWJsZXMgYW5kIHR5cGVfaW5mbyBvYmplY3RzKSBhcmUgZW1pdHRlZCBvbmx5IGFmdGVyIHByb2Nlc3NpbmcKKyAgLy8vIHRoZSBkZWZpbml0aW9uIG9mIGEgc3BlY2lhbCAia2V5IiB2aXJ0dWFsIGZ1bmN0aW9uLiAgKFRoaXMgaXMgc2FmZQorICAvLy8gYmVjYXVzZSB0aGUgT0RSIHJlcXVpcmVzIHRoYXQgZXZlcnkgdmlydHVhbCBmdW5jdGlvbiBiZSBkZWZpbmVkCisgIC8vLyBzb21ld2hlcmUgaW4gYSBwcm9ncmFtLikgIFRoaXMgdXN1YWxseSBwZXJtaXRzIHN1Y2ggZGF0YSB0byBiZQorICAvLy8gZW1pdHRlZCBpbiBvbmx5IGEgc2luZ2xlIG9iamVjdCBmaWxlLCBhcyBvcHBvc2VkIHRvIHJlZHVuZGFudGx5CisgIC8vLyBpbiBldmVyeSBvYmplY3QgZmlsZSB0aGF0IHJlcXVpcmVzIGl0LgorICAvLy8KKyAgLy8vIE9uZSBzaW1wbGUgYW5kIGNvbW1vbiBkZWZpbml0aW9uIG9mICJrZXkgZnVuY3Rpb24iIGlzIHRoZSBmaXJzdAorICAvLy8gdmlydHVhbCBmdW5jdGlvbiBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiB3aGljaCBpcyBub3QgZGVmaW5lZCB0aGVyZS4KKyAgLy8vIFRoaXMgcnVsZSB3b3JrcyB2ZXJ5IHdlbGwgd2hlbiB0aGF0IGZ1bmN0aW9uIGhhcyBhIG5vbi1pbmxpbmUKKyAgLy8vIGRlZmluaXRpb24gaW4gc29tZSBub24taGVhZGVyIGZpbGUuICBVbmZvcnR1bmF0ZWx5LCB3aGVuIHRoYXQKKyAgLy8vIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW5saW5lLCB0aGlzIHJ1bGUgcmVxdWlyZXMgdGhlIHR5cGUgZGF0YQorICAvLy8gdG8gYmUgZW1pdHRlZCB3ZWFrbHksIGFzIGlmIHRoZXJlIHdlcmUgbm8ga2V5IGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFRoZSBBUk0gQUJJIG9ic2VydmVzIHRoYXQgdGhlIE9EUiBwcm92aWRlcyBhbiBhZGRpdGlvbmFsIGd1YXJhbnRlZToKKyAgLy8vIGEgdmlydHVhbCBmdW5jdGlvbiBpcyBhbHdheXMgT0RSLXVzZWQsIHNvIGlmIGl0IGlzIGRlZmluZWQgaW5saW5lLAorICAvLy8gdGhhdCBkZWZpbml0aW9uIG11c3QgYXBwZWFyIGluIGV2ZXJ5IHRyYW5zbGF0aW9uIHVuaXQgdGhhdCBkZWZpbmVzCisgIC8vLyB0aGUgY2xhc3MuICBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBhbGxvdyBzdWNoIGZ1bmN0aW9ucworICAvLy8gdG8gc2VydmUgYXMga2V5IGZ1bmN0aW9ucy4KKyAgLy8vCisgIC8vLyBCZWNhdXNlIHRoaXMgY2hhbmdlcyB0aGUgcnVsZXMgZm9yIGVtaXR0aW5nIHR5cGUgZGF0YSwKKyAgLy8vIGl0IGNhbiBjYXVzZSB0eXBlIGRhdGEgdG8gYmUgZW1pdHRlZCB3aXRoIGJvdGggd2VhayBhbmQgc3Ryb25nCisgIC8vLyBsaW5rYWdlLCB3aGljaCBpcyBub3QgYWxsb3dlZCBvbiBhbGwgcGxhdGZvcm1zLiAgVGhlcmVmb3JlLAorICAvLy8gZXhwbG9pdGluZyB0aGlzIG9ic2VydmF0aW9uIHJlcXVpcmVzIGFuIEFCSSBicmVhayBhbmQgY2Fubm90IGJlCisgIC8vLyBkb25lIG9uIGEgZ2VuZXJpYyBJdGFuaXVtIHBsYXRmb3JtLgorICBib29sIGNhbktleUZ1bmN0aW9uQmVJbmxpbmUoKSBjb25zdCB7CisgICAgc3dpdGNoIChnZXRLaW5kKCkpIHsKKyAgICBjYXNlIEdlbmVyaWNBUk06CisgICAgY2FzZSBpT1M2NDoKKyAgICBjYXNlIFdlYkFzc2VtYmx5OgorICAgIGNhc2UgV2F0Y2hPUzoKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNhc2UgR2VuZXJpY0FBcmNoNjQ6CisgICAgY2FzZSBHZW5lcmljSXRhbml1bToKKyAgICBjYXNlIGlPUzogICAvLyBvbGQgaU9TIGNvbXBpbGVycyBkaWQgbm90IGZvbGxvdyB0aGlzIHJ1bGUKKyAgICBjYXNlIE1pY3Jvc29mdDoKKyAgICBjYXNlIEdlbmVyaWNNSVBTOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoImJhZCBBQkkga2luZCIpOworICB9CisKKyAgLy8vIFdoZW4gaXMgcmVjb3JkIGxheW91dCBhbGxvd2VkIHRvIGFsbG9jYXRlIG9iamVjdHMgaW4gdGhlIHRhaWwKKyAgLy8vIHBhZGRpbmcgb2YgYSBiYXNlIGNsYXNzPworICAvLy8KKyAgLy8vIFRoaXMgZGVjaXNpb24gY2Fubm90IGJlIGNoYW5nZWQgd2l0aG91dCBicmVha2luZyBwbGF0Zm9ybSBBQkkKKyAgLy8vIGNvbXBhdGliaWxpdHksIGFuZCB5ZXQgaXQgaXMgdGllZCB0byBsYW5ndWFnZSBndWFyYW50ZWVzIHdoaWNoCisgIC8vLyB0aGUgY29tbWl0dGVlIGhhcyBzbyBmYXIgc2VlbiBmaXQgdG8gc3RyZW5ndGhlbiBubyBsZXNzIHRoYW4KKyAgLy8vIHRocmVlIHNlcGFyYXRlIHRpbWVzOgorICAvLy8gICAtIG9yaWdpbmFsbHksIHRoZXJlIHdlcmUgbm8gcmVzdHJpY3Rpb25zIGF0IGFsbDsKKyAgLy8vICAgLSBDKys5OCBkZWNsYXJlZCB0aGF0IG9iamVjdHMgY291bGQgbm90IGJlIGFsbG9jYXRlZCBpbiB0aGUKKyAgLy8vICAgICB0YWlsIHBhZGRpbmcgb2YgYSBQT0QgdHlwZTsKKyAgLy8vICAgLSBDKyswMyBleHRlbmRlZCB0aGUgZGVmaW5pdGlvbiBvZiBQT0QgdG8gaW5jbHVkZSBjbGFzc2VzCisgIC8vLyAgICAgY29udGFpbmluZyBtZW1iZXIgcG9pbnRlcnM7IGFuZAorICAvLy8gICAtIEMrKzExIGdyZWF0bHkgYnJvYWRlbmVkIHRoZSBkZWZpbml0aW9uIG9mIFBPRCB0byBpbmNsdWRlCisgIC8vLyAgICAgYWxsIHRyaXZpYWwgc3RhbmRhcmQtbGF5b3V0IGNsYXNzZXMuCisgIC8vLyBFYWNoIG9mIHRoZXNlIGNoYW5nZXMgdGVjaG5pY2FsbHkgdG9vayBzZXZlcmFsIGV4aXN0aW5nCisgIC8vLyBwbGF0Zm9ybXMgYW5kIG1hZGUgdGhlbSBwZXJtYW5lbnRseSBub24tY29uZm9ybWFudC4KKyAgZW51bSBUYWlsUGFkZGluZ1VzZVJ1bGVzIHsKKyAgICAvLy8gVGhlIHRhaWwtcGFkZGluZyBvZiBhIGJhc2UgY2xhc3MgaXMgYWx3YXlzIHRoZW9yZXRpY2FsbHkKKyAgICAvLy8gYXZhaWxhYmxlLCBldmVuIGlmIGl0J3MgUE9ELiAgVGhpcyBpcyBub3Qgc3RyaWN0bHkgY29uZm9ybWluZworICAgIC8vLyBpbiBhbnkgbGFuZ3VhZ2UgbW9kZS4KKyAgICBBbHdheXNVc2VUYWlsUGFkZGluZywKKworICAgIC8vLyBPbmx5IGFsbG9jYXRlIG9iamVjdHMgaW4gdGhlIHRhaWwgcGFkZGluZyBvZiBhIGJhc2UgY2xhc3MgaWYKKyAgICAvLy8gdGhlIGJhc2UgY2xhc3MgaXMgbm90IFBPRCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG9mIEMrKyBUUjEuCisgICAgLy8vIFRoaXMgaXMgbm9uLXN0cmljdGx5IGNvbmZvcm1pbmcgaW4gQysrMTEgbW9kZS4KKyAgICBVc2VUYWlsUGFkZGluZ1VubGVzc1BPRDAzLAorCisgICAgLy8vIE9ubHkgYWxsb2NhdGUgb2JqZWN0cyBpbiB0aGUgdGFpbCBwYWRkaW5nIG9mIGEgYmFzZSBjbGFzcyBpZgorICAgIC8vLyB0aGUgYmFzZSBjbGFzcyBpcyBub3QgUE9EIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgQysrMTEuCisgICAgVXNlVGFpbFBhZGRpbmdVbmxlc3NQT0QxMQorICB9OworICBUYWlsUGFkZGluZ1VzZVJ1bGVzIGdldFRhaWxQYWRkaW5nVXNlUnVsZXMoKSBjb25zdCB7CisgICAgc3dpdGNoIChnZXRLaW5kKCkpIHsKKyAgICAvLyBUbyBwcmVzZXJ2ZSBiaW5hcnkgY29tcGF0aWJpbGl0eSwgdGhlIGdlbmVyaWMgSXRhbml1bSBBQkkgaGFzCisgICAgLy8gcGVybWFuZW50bHkgbG9ja2VkIHRoZSBkZWZpbml0aW9uIG9mIFBPRCB0byB0aGUgcnVsZXMgb2YgQysrIFRSMSwKKyAgICAvLyBhbmQgdGhhdCB0cmlja2xlcyBkb3duIHRvIGRlcml2ZWQgQUJJcy4KKyAgICBjYXNlIEdlbmVyaWNJdGFuaXVtOgorICAgIGNhc2UgR2VuZXJpY0FBcmNoNjQ6CisgICAgY2FzZSBHZW5lcmljQVJNOgorICAgIGNhc2UgaU9TOgorICAgIGNhc2UgR2VuZXJpY01JUFM6CisgICAgICByZXR1cm4gVXNlVGFpbFBhZGRpbmdVbmxlc3NQT0QwMzsKKworICAgIC8vIGlPUyBvbiBBUk02NCBhbmQgV2ViQXNzZW1ibHkgdXNlIHRoZSBDKysxMSBQT0QgcnVsZXMuICBUaGV5IGRvIG5vdCBob25vcgorICAgIC8vIHRoZSBJdGFuaXVtIGV4Y2VwdGlvbiBhYm91dCBjbGFzc2VzIHdpdGggb3Zlci1sYXJnZSBiaXRmaWVsZHMuCisgICAgY2FzZSBpT1M2NDoKKyAgICBjYXNlIFdlYkFzc2VtYmx5OgorICAgIGNhc2UgV2F0Y2hPUzoKKyAgICAgIHJldHVybiBVc2VUYWlsUGFkZGluZ1VubGVzc1BPRDExOworCisgICAgLy8gTVNWQyBhbHdheXMgYWxsb2NhdGVzIGZpZWxkcyBpbiB0aGUgdGFpbC1wYWRkaW5nIG9mIGEgYmFzZSBjbGFzcworICAgIC8vIHN1Ym9iamVjdCwgZXZlbiBpZiB0aGV5J3JlIFBPRC4KKyAgICBjYXNlIE1pY3Jvc29mdDoKKyAgICAgIHJldHVybiBBbHdheXNVc2VUYWlsUGFkZGluZzsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiYmFkIEFCSSBraW5kIik7CisgIH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRhcmdldENYWEFCSSAmbGVmdCwgY29uc3QgVGFyZ2V0Q1hYQUJJICZyaWdodCkgeworICAgIHJldHVybiBsZWZ0LmdldEtpbmQoKSA9PSByaWdodC5nZXRLaW5kKCk7CisgIH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRhcmdldENYWEFCSSAmbGVmdCwgY29uc3QgVGFyZ2V0Q1hYQUJJICZyaWdodCkgeworICAgIHJldHVybiAhKGxlZnQgPT0gcmlnaHQpOworICB9Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvVGFyZ2V0SW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvVGFyZ2V0SW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZjcyYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9UYXJnZXRJbmZvLmgKQEAgLTAsMCArMSwxMTU4IEBACisvLz09PS0tLSBUYXJnZXRJbmZvLmggLSBFeHBvc2UgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhcmdldCAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgY2xhbmc6OlRhcmdldEluZm8gaW50ZXJmYWNlLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfVEFSR0VUSU5GT19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfVEFSR0VUSU5GT19ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9BZGRyZXNzU3BhY2VzLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NwZWNpZmllcnMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9UYXJnZXRDWFhBQkkuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVmVyc2lvblR1cGxlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EYXRhTGF5b3V0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworc3RydWN0IGZsdFNlbWFudGljczsKK30KKworbmFtZXNwYWNlIGNsYW5nIHsKK2NsYXNzIERpYWdub3N0aWNzRW5naW5lOworY2xhc3MgTGFuZ09wdGlvbnM7CitjbGFzcyBDb2RlR2VuT3B0aW9uczsKK2NsYXNzIE1hY3JvQnVpbGRlcjsKK2NsYXNzIFF1YWxUeXBlOworY2xhc3MgU291cmNlTG9jYXRpb247CitjbGFzcyBTb3VyY2VNYW5hZ2VyOworCituYW1lc3BhY2UgQnVpbHRpbiB7IHN0cnVjdCBJbmZvOyB9CisKKy8vLyBcYnJpZWYgRXhwb3NlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCB0YXJnZXQuCisvLy8KK2NsYXNzIFRhcmdldEluZm8gOiBwdWJsaWMgUmVmQ291bnRlZEJhc2U8VGFyZ2V0SW5mbz4geworICBzdGQ6OnNoYXJlZF9wdHI8VGFyZ2V0T3B0aW9ucz4gVGFyZ2V0T3B0czsKKyAgbGx2bTo6VHJpcGxlIFRyaXBsZTsKK3Byb3RlY3RlZDoKKyAgLy8gVGFyZ2V0IHZhbHVlcyBzZXQgYnkgdGhlIGN0b3Igb2YgdGhlIGFjdHVhbCB0YXJnZXQgaW1wbGVtZW50YXRpb24uICBEZWZhdWx0CisgIC8vIHZhbHVlcyBhcmUgc3BlY2lmaWVkIGJ5IHRoZSBUYXJnZXRJbmZvIGNvbnN0cnVjdG9yLgorICBib29sIEJpZ0VuZGlhbjsKKyAgYm9vbCBUTFNTdXBwb3J0ZWQ7CisgIGJvb2wgVkxBU3VwcG9ydGVkOworICBib29sIE5vQXNtVmFyaWFudHM7ICAvLyBUcnVlIGlmIHt8fSBhcmUgbm9ybWFsIGNoYXJhY3RlcnMuCisgIGJvb2wgSGFzTGVnYWxIYWxmVHlwZTsgLy8gVHJ1ZSBpZiB0aGUgYmFja2VuZCBzdXBwb3J0cyBvcGVyYXRpb25zIG9uIHRoZSBoYWxmCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTExWTSBJUiB0eXBlLgorICBib29sIEhhc0Zsb2F0MTI4OworICB1bnNpZ25lZCBjaGFyIFBvaW50ZXJXaWR0aCwgUG9pbnRlckFsaWduOworICB1bnNpZ25lZCBjaGFyIEJvb2xXaWR0aCwgQm9vbEFsaWduOworICB1bnNpZ25lZCBjaGFyIEludFdpZHRoLCBJbnRBbGlnbjsKKyAgdW5zaWduZWQgY2hhciBIYWxmV2lkdGgsIEhhbGZBbGlnbjsKKyAgdW5zaWduZWQgY2hhciBGbG9hdFdpZHRoLCBGbG9hdEFsaWduOworICB1bnNpZ25lZCBjaGFyIERvdWJsZVdpZHRoLCBEb3VibGVBbGlnbjsKKyAgdW5zaWduZWQgY2hhciBMb25nRG91YmxlV2lkdGgsIExvbmdEb3VibGVBbGlnbiwgRmxvYXQxMjhBbGlnbjsKKyAgdW5zaWduZWQgY2hhciBMYXJnZUFycmF5TWluV2lkdGgsIExhcmdlQXJyYXlBbGlnbjsKKyAgdW5zaWduZWQgY2hhciBMb25nV2lkdGgsIExvbmdBbGlnbjsKKyAgdW5zaWduZWQgY2hhciBMb25nTG9uZ1dpZHRoLCBMb25nTG9uZ0FsaWduOworICB1bnNpZ25lZCBjaGFyIFN1aXRhYmxlQWxpZ247CisgIHVuc2lnbmVkIGNoYXIgRGVmYXVsdEFsaWduRm9yQXR0cmlidXRlQWxpZ25lZDsKKyAgdW5zaWduZWQgY2hhciBNaW5HbG9iYWxBbGlnbjsKKyAgdW5zaWduZWQgY2hhciBNYXhBdG9taWNQcm9tb3RlV2lkdGgsIE1heEF0b21pY0lubGluZVdpZHRoOworICB1bnNpZ25lZCBzaG9ydCBNYXhWZWN0b3JBbGlnbjsKKyAgdW5zaWduZWQgc2hvcnQgTWF4VExTQWxpZ247CisgIHVuc2lnbmVkIHNob3J0IFNpbWREZWZhdWx0QWxpZ247CisgIHVuc2lnbmVkIHNob3J0IE5ld0FsaWduOworICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6RGF0YUxheW91dD4gRGF0YUxheW91dDsKKyAgY29uc3QgY2hhciAqTUNvdW50TmFtZTsKKyAgY29uc3QgbGx2bTo6Zmx0U2VtYW50aWNzICpIYWxmRm9ybWF0LCAqRmxvYXRGb3JtYXQsICpEb3VibGVGb3JtYXQsCisgICAgKkxvbmdEb3VibGVGb3JtYXQsICpGbG9hdDEyOEZvcm1hdDsKKyAgdW5zaWduZWQgY2hhciBSZWdQYXJtTWF4LCBTU0VSZWdQYXJtTWF4OworICBUYXJnZXRDWFhBQkkgVGhlQ1hYQUJJOworICBjb25zdCBMYW5nQVNNYXAgKkFkZHJTcGFjZU1hcDsKKworICBtdXRhYmxlIFN0cmluZ1JlZiBQbGF0Zm9ybU5hbWU7CisgIG11dGFibGUgVmVyc2lvblR1cGxlIFBsYXRmb3JtTWluVmVyc2lvbjsKKworICB1bnNpZ25lZCBIYXNBbGlnbk1hYzY4a1N1cHBvcnQgOiAxOworICB1bnNpZ25lZCBSZWFsVHlwZVVzZXNPYmpDRlBSZXQgOiAzOworICB1bnNpZ25lZCBDb21wbGV4TG9uZ0RvdWJsZVVzZXNGUDJSZXQgOiAxOworCisgIHVuc2lnbmVkIEhhc0J1aWx0aW5NU1ZhTGlzdCA6IDE7CisKKyAgdW5zaWduZWQgSXNSZW5kZXJTY3JpcHRUYXJnZXQgOiAxOworCisgIC8vIFRhcmdldEluZm8gQ29uc3RydWN0b3IuICBEZWZhdWx0IGluaXRpYWxpemVzIGFsbCBmaWVsZHMuCisgIFRhcmdldEluZm8oY29uc3QgbGx2bTo6VHJpcGxlICZUKTsKKworICB2b2lkIHJlc2V0RGF0YUxheW91dChTdHJpbmdSZWYgREwpIHsKKyAgICBEYXRhTGF5b3V0LnJlc2V0KG5ldyBsbHZtOjpEYXRhTGF5b3V0KERMKSk7CisgIH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIHRhcmdldCBmb3IgdGhlIGdpdmVuIG9wdGlvbnMuCisgIC8vLworICAvLy8gXHBhcmFtIE9wdHMgLSBUaGUgb3B0aW9ucyB0byB1c2UgdG8gaW5pdGlhbGl6ZSB0aGUgdGFyZ2V0LiBUaGUgdGFyZ2V0IG1heQorICAvLy8gbW9kaWZ5IHRoZSBvcHRpb25zIHRvIGNhbm9uaWNhbGl6ZSB0aGUgdGFyZ2V0IGZlYXR1cmUgaW5mb3JtYXRpb24gdG8gbWF0Y2gKKyAgLy8vIHdoYXQgdGhlIGJhY2tlbmQgZXhwZWN0cy4KKyAgc3RhdGljIFRhcmdldEluZm8gKgorICBDcmVhdGVUYXJnZXRJbmZvKERpYWdub3N0aWNzRW5naW5lICZEaWFncywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGFyZ2V0T3B0aW9ucz4gJk9wdHMpOworCisgIHZpcnR1YWwgflRhcmdldEluZm8oKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0YXJnZXQgb3B0aW9ucy4KKyAgVGFyZ2V0T3B0aW9ucyAmZ2V0VGFyZ2V0T3B0cygpIGNvbnN0IHsKKyAgICBhc3NlcnQoVGFyZ2V0T3B0cyAmJiAiTWlzc2luZyB0YXJnZXQgb3B0aW9ucyIpOworICAgIHJldHVybiAqVGFyZ2V0T3B0czsKKyAgfQorCisgIC8vLz09PS0tLS0gVGFyZ2V0IERhdGEgVHlwZSBRdWVyeSBNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICBlbnVtIEludFR5cGUgeworICAgIE5vSW50ID0gMCwKKyAgICBTaWduZWRDaGFyLAorICAgIFVuc2lnbmVkQ2hhciwKKyAgICBTaWduZWRTaG9ydCwKKyAgICBVbnNpZ25lZFNob3J0LAorICAgIFNpZ25lZEludCwKKyAgICBVbnNpZ25lZEludCwKKyAgICBTaWduZWRMb25nLAorICAgIFVuc2lnbmVkTG9uZywKKyAgICBTaWduZWRMb25nTG9uZywKKyAgICBVbnNpZ25lZExvbmdMb25nCisgIH07CisKKyAgZW51bSBSZWFsVHlwZSB7CisgICAgTm9GbG9hdCA9IDI1NSwKKyAgICBGbG9hdCA9IDAsCisgICAgRG91YmxlLAorICAgIExvbmdEb3VibGUsCisgICAgRmxvYXQxMjgKKyAgfTsKKworICAvLy8gXGJyaWVmIFRoZSBkaWZmZXJlbnQga2luZHMgb2YgX19idWlsdGluX3ZhX2xpc3QgdHlwZXMgZGVmaW5lZCBieQorICAvLy8gdGhlIHRhcmdldCBpbXBsZW1lbnRhdGlvbi4KKyAgZW51bSBCdWlsdGluVmFMaXN0S2luZCB7CisgICAgLy8vIHR5cGVkZWYgY2hhciogX19idWlsdGluX3ZhX2xpc3Q7CisgICAgQ2hhclB0ckJ1aWx0aW5WYUxpc3QgPSAwLAorCisgICAgLy8vIHR5cGVkZWYgdm9pZCogX19idWlsdGluX3ZhX2xpc3Q7CisgICAgVm9pZFB0ckJ1aWx0aW5WYUxpc3QsCisKKyAgICAvLy8gX19idWlsdGluX3ZhX2xpc3QgYXMgZGVmaW5lZCBieSB0aGUgQUFyY2g2NCBBQkkKKyAgICAvLy8gaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL3RvcGljL2NvbS5hcm0uZG9jLmloaTAwNTVhL0lISTAwNTVBX2FhcGNzNjQucGRmCisgICAgQUFyY2g2NEFCSUJ1aWx0aW5WYUxpc3QsCisKKyAgICAvLy8gX19idWlsdGluX3ZhX2xpc3QgYXMgZGVmaW5lZCBieSB0aGUgUE5hQ2wgQUJJOgorICAgIC8vLyBodHRwOi8vd3d3LmNocm9taXVtLm9yZy9uYXRpdmVjbGllbnQvcG5hY2wvYml0Y29kZS1hYmkjVE9DLU1hY2hpbmUtVHlwZXMKKyAgICBQTmFDbEFCSUJ1aWx0aW5WYUxpc3QsCisKKyAgICAvLy8gX19idWlsdGluX3ZhX2xpc3QgYXMgZGVmaW5lZCBieSB0aGUgUG93ZXIgQUJJOgorICAgIC8vLyBodHRwczovL3d3dy5wb3dlci5vcmcKKyAgICAvLy8gICAgICAgIC9yZXNvdXJjZXMvZG93bmxvYWRzL1Bvd2VyLUFyY2gtMzItYml0LUFCSS1zdXBwLTEuMC1FbWJlZGRlZC5wZGYKKyAgICBQb3dlckFCSUJ1aWx0aW5WYUxpc3QsCisKKyAgICAvLy8gX19idWlsdGluX3ZhX2xpc3QgYXMgZGVmaW5lZCBieSB0aGUgeDg2LTY0IEFCSToKKyAgICAvLy8gaHR0cDovL3JlZnNwZWNzLmxpbnV4YmFzZS5vcmcvZWxmL3g4Nl82NC1hYmktMC4yMS5wZGYKKyAgICBYODZfNjRBQklCdWlsdGluVmFMaXN0LAorCisgICAgLy8vIF9fYnVpbHRpbl92YV9saXN0IGFzIGRlZmluZWQgYnkgQVJNIEFBUENTIEFCSQorICAgIC8vLyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tCisgICAgLy8gICAgICAgIC9oZWxwL3RvcGljL2NvbS5hcm0uZG9jLmloaTAwNDJkL0lISTAwNDJEX2FhcGNzLnBkZgorICAgIEFBUENTQUJJQnVpbHRpblZhTGlzdCwKKworICAgIC8vIHR5cGVkZWYgc3RydWN0IF9fdmFfbGlzdF90YWcKKyAgICAvLyAgIHsKKyAgICAvLyAgICAgbG9uZyBfX2dwcjsKKyAgICAvLyAgICAgbG9uZyBfX2ZwcjsKKyAgICAvLyAgICAgdm9pZCAqX19vdmVyZmxvd19hcmdfYXJlYTsKKyAgICAvLyAgICAgdm9pZCAqX19yZWdfc2F2ZV9hcmVhOworICAgIC8vICAgfSB2YV9saXN0WzFdOworICAgIFN5c3RlbVpCdWlsdGluVmFMaXN0CisgIH07CisKK3Byb3RlY3RlZDoKKyAgSW50VHlwZSBTaXplVHlwZSwgSW50TWF4VHlwZSwgUHRyRGlmZlR5cGUsIEludFB0clR5cGUsIFdDaGFyVHlwZSwKKyAgICAgICAgICBXSW50VHlwZSwgQ2hhcjE2VHlwZSwgQ2hhcjMyVHlwZSwgSW50NjRUeXBlLCBTaWdBdG9taWNUeXBlLAorICAgICAgICAgIFByb2Nlc3NJRFR5cGU7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIE9iamVjdGl2ZS1DJ3MgYnVpbHQtaW4gYm9vbGVhbiB0eXBlIHNob3VsZCBiZSBzaWduZWQgY2hhci4KKyAgLy8vCisgIC8vLyBPdGhlcndpc2UsIHdoZW4gdGhpcyBmbGFnIGlzIG5vdCBzZXQsIHRoZSBub3JtYWwgYnVpbHQtaW4gYm9vbGVhbiB0eXBlIGlzCisgIC8vLyB1c2VkLgorICB1bnNpZ25lZCBVc2VTaWduZWRDaGFyRm9yT2JqQ0Jvb2wgOiAxOworCisgIC8vLyBDb250cm9sIHdoZXRoZXIgdGhlIGFsaWdubWVudCBvZiBiaXQtZmllbGQgdHlwZXMgaXMgcmVzcGVjdGVkIHdoZW4gbGF5aW5nCisgIC8vLyBvdXQgc3RydWN0dXJlcy4gSWYgdHJ1ZSwgdGhlbiB0aGUgYWxpZ25tZW50IG9mIHRoZSBiaXQtZmllbGQgdHlwZSB3aWxsIGJlCisgIC8vLyB1c2VkIHRvIChhKSBpbXBhY3QgdGhlIGFsaWdubWVudCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUsIGFuZCAoYikKKyAgLy8vIGVuc3VyZSB0aGF0IHRoZSBpbmRpdmlkdWFsIGJpdC1maWVsZCB3aWxsIG5vdCBzdHJhZGRsZSBhbiBhbGlnbm1lbnQKKyAgLy8vIGJvdW5kYXJ5LgorICB1bnNpZ25lZCBVc2VCaXRGaWVsZFR5cGVBbGlnbm1lbnQgOiAxOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB6ZXJvIGxlbmd0aCBiaXRmaWVsZHMgKGUuZy4sIGludCA6IDA7KSBmb3JjZSBhbGlnbm1lbnQgb2YKKyAgLy8vIHRoZSBuZXh0IGJpdGZpZWxkLgorICAvLy8KKyAgLy8vIElmIHRoZSBhbGlnbm1lbnQgb2YgdGhlIHplcm8gbGVuZ3RoIGJpdGZpZWxkIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWVtYmVyCisgIC8vLyB0aGF0IGZvbGxvd3MgaXQsIGBiYXInLCBgYmFyJyB3aWxsIGJlIGFsaWduZWQgYXMgdGhlIHR5cGUgb2YgdGhlCisgIC8vLyB6ZXJvLWxlbmd0aCBiaXRmaWVsZC4KKyAgdW5zaWduZWQgVXNlWmVyb0xlbmd0aEJpdGZpZWxkQWxpZ25tZW50IDogMTsKKworICAvLy8gXGJyaWVmICBXaGV0aGVyIGV4cGxpY2l0IGJpdCBmaWVsZCBhbGlnbm1lbnQgYXR0cmlidXRlcyBhcmUgaG9ub3JlZC4KKyAgdW5zaWduZWQgVXNlRXhwbGljaXRCaXRGaWVsZEFsaWdubWVudCA6IDE7CisKKyAgLy8vIElmIG5vbi16ZXJvLCBzcGVjaWZpZXMgYSBmaXhlZCBhbGlnbm1lbnQgdmFsdWUgZm9yIGJpdGZpZWxkcyB0aGF0IGZvbGxvdworICAvLy8gemVybyBsZW5ndGggYml0ZmllbGQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHplcm8gbGVuZ3RoIGJpdGZpZWxkIHR5cGUuCisgIHVuc2lnbmVkIFplcm9MZW5ndGhCaXRmaWVsZEJvdW5kYXJ5OworCisgIC8vLyBcYnJpZWYgU3BlY2lmeSBpZiBtYW5nbGluZyBiYXNlZCBvbiBhZGRyZXNzIHNwYWNlIG1hcCBzaG91bGQgYmUgdXNlZCBvcgorICAvLy8gbm90IGZvciBsYW5ndWFnZSBzcGVjaWZpYyBhZGRyZXNzIHNwYWNlcworICBib29sIFVzZUFkZHJTcGFjZU1hcE1hbmdsaW5nOworCitwdWJsaWM6CisgIEludFR5cGUgZ2V0U2l6ZVR5cGUoKSBjb25zdCB7IHJldHVybiBTaXplVHlwZTsgfQorICBJbnRUeXBlIGdldFNpZ25lZFNpemVUeXBlKCkgY29uc3QgeworICAgIHN3aXRjaCAoU2l6ZVR5cGUpIHsKKyAgICBjYXNlIFVuc2lnbmVkU2hvcnQ6CisgICAgICByZXR1cm4gU2lnbmVkU2hvcnQ7CisgICAgY2FzZSBVbnNpZ25lZEludDoKKyAgICAgIHJldHVybiBTaWduZWRJbnQ7CisgICAgY2FzZSBVbnNpZ25lZExvbmc6CisgICAgICByZXR1cm4gU2lnbmVkTG9uZzsKKyAgICBjYXNlIFVuc2lnbmVkTG9uZ0xvbmc6CisgICAgICByZXR1cm4gU2lnbmVkTG9uZ0xvbmc7CisgICAgZGVmYXVsdDoKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgU2l6ZVR5cGUiKTsKKyAgICB9CisgIH0KKyAgSW50VHlwZSBnZXRJbnRNYXhUeXBlKCkgY29uc3QgeyByZXR1cm4gSW50TWF4VHlwZTsgfQorICBJbnRUeXBlIGdldFVJbnRNYXhUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRDb3JyZXNwb25kaW5nVW5zaWduZWRUeXBlKEludE1heFR5cGUpOworICB9CisgIEludFR5cGUgZ2V0UHRyRGlmZlR5cGUodW5zaWduZWQgQWRkclNwYWNlKSBjb25zdCB7CisgICAgcmV0dXJuIEFkZHJTcGFjZSA9PSAwID8gUHRyRGlmZlR5cGUgOiBnZXRQdHJEaWZmVHlwZVYoQWRkclNwYWNlKTsKKyAgfQorICBJbnRUeXBlIGdldFVuc2lnbmVkUHRyRGlmZlR5cGUodW5zaWduZWQgQWRkclNwYWNlKSBjb25zdCB7CisgICAgcmV0dXJuIGdldENvcnJlc3BvbmRpbmdVbnNpZ25lZFR5cGUoZ2V0UHRyRGlmZlR5cGUoQWRkclNwYWNlKSk7CisgIH0KKyAgSW50VHlwZSBnZXRJbnRQdHJUeXBlKCkgY29uc3QgeyByZXR1cm4gSW50UHRyVHlwZTsgfQorICBJbnRUeXBlIGdldFVJbnRQdHJUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRDb3JyZXNwb25kaW5nVW5zaWduZWRUeXBlKEludFB0clR5cGUpOworICB9CisgIEludFR5cGUgZ2V0V0NoYXJUeXBlKCkgY29uc3QgeyByZXR1cm4gV0NoYXJUeXBlOyB9CisgIEludFR5cGUgZ2V0V0ludFR5cGUoKSBjb25zdCB7IHJldHVybiBXSW50VHlwZTsgfQorICBJbnRUeXBlIGdldENoYXIxNlR5cGUoKSBjb25zdCB7IHJldHVybiBDaGFyMTZUeXBlOyB9CisgIEludFR5cGUgZ2V0Q2hhcjMyVHlwZSgpIGNvbnN0IHsgcmV0dXJuIENoYXIzMlR5cGU7IH0KKyAgSW50VHlwZSBnZXRJbnQ2NFR5cGUoKSBjb25zdCB7IHJldHVybiBJbnQ2NFR5cGU7IH0KKyAgSW50VHlwZSBnZXRVSW50NjRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRDb3JyZXNwb25kaW5nVW5zaWduZWRUeXBlKEludDY0VHlwZSk7CisgIH0KKyAgSW50VHlwZSBnZXRTaWdBdG9taWNUeXBlKCkgY29uc3QgeyByZXR1cm4gU2lnQXRvbWljVHlwZTsgfQorICBJbnRUeXBlIGdldFByb2Nlc3NJRFR5cGUoKSBjb25zdCB7IHJldHVybiBQcm9jZXNzSURUeXBlOyB9CisKKyAgc3RhdGljIEludFR5cGUgZ2V0Q29ycmVzcG9uZGluZ1Vuc2lnbmVkVHlwZShJbnRUeXBlIFQpIHsKKyAgICBzd2l0Y2ggKFQpIHsKKyAgICBjYXNlIFNpZ25lZENoYXI6CisgICAgICByZXR1cm4gVW5zaWduZWRDaGFyOworICAgIGNhc2UgU2lnbmVkU2hvcnQ6CisgICAgICByZXR1cm4gVW5zaWduZWRTaG9ydDsKKyAgICBjYXNlIFNpZ25lZEludDoKKyAgICAgIHJldHVybiBVbnNpZ25lZEludDsKKyAgICBjYXNlIFNpZ25lZExvbmc6CisgICAgICByZXR1cm4gVW5zaWduZWRMb25nOworICAgIGNhc2UgU2lnbmVkTG9uZ0xvbmc6CisgICAgICByZXR1cm4gVW5zaWduZWRMb25nTG9uZzsKKyAgICBkZWZhdWx0OgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBzaWduZWQgaW50ZWdlciB0eXBlIik7CisgICAgfQorICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHdpZHRoIChpbiBiaXRzKSBvZiB0aGUgc3BlY2lmaWVkIGludGVnZXIgdHlwZSBlbnVtLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlLCBTaWduZWRJbnQgLT4gZ2V0SW50V2lkdGgoKS4KKyAgdW5zaWduZWQgZ2V0VHlwZVdpZHRoKEludFR5cGUgVCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gaW50ZWdlciB0eXBlIHdpdGggc3BlY2lmaWVkIHdpZHRoLgorICB2aXJ0dWFsIEludFR5cGUgZ2V0SW50VHlwZUJ5V2lkdGgodW5zaWduZWQgQml0V2lkdGgsIGJvb2wgSXNTaWduZWQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzbWFsbGVzdCBpbnRlZ2VyIHR5cGUgd2l0aCBhdCBsZWFzdCB0aGUgc3BlY2lmaWVkIHdpZHRoLgorICB2aXJ0dWFsIEludFR5cGUgZ2V0TGVhc3RJbnRUeXBlQnlXaWR0aCh1bnNpZ25lZCBCaXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1NpZ25lZCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gZmxvYXRpbmcgcG9pbnQgdHlwZSB3aXRoIHNwZWNpZmllZCB3aWR0aC4KKyAgUmVhbFR5cGUgZ2V0UmVhbFR5cGVCeVdpZHRoKHVuc2lnbmVkIEJpdFdpZHRoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgYWxpZ25tZW50IChpbiBiaXRzKSBvZiB0aGUgc3BlY2lmaWVkIGludGVnZXIgdHlwZSBlbnVtLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlLCBTaWduZWRJbnQgLT4gZ2V0SW50QWxpZ24oKS4KKyAgdW5zaWduZWQgZ2V0VHlwZUFsaWduKEludFR5cGUgVCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgaXMgc2lnbmVkOyBmYWxzZSBvdGhlcndpc2UuCisgIHN0YXRpYyBib29sIGlzVHlwZVNpZ25lZChJbnRUeXBlIFQpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB3aWR0aCBvZiBwb2ludGVycyBvbiB0aGlzIHRhcmdldCwgZm9yIHRoZQorICAvLy8gc3BlY2lmaWVkIGFkZHJlc3Mgc3BhY2UuCisgIHVpbnQ2NF90IGdldFBvaW50ZXJXaWR0aCh1bnNpZ25lZCBBZGRyU3BhY2UpIGNvbnN0IHsKKyAgICByZXR1cm4gQWRkclNwYWNlID09IDAgPyBQb2ludGVyV2lkdGggOiBnZXRQb2ludGVyV2lkdGhWKEFkZHJTcGFjZSk7CisgIH0KKyAgdWludDY0X3QgZ2V0UG9pbnRlckFsaWduKHVuc2lnbmVkIEFkZHJTcGFjZSkgY29uc3QgeworICAgIHJldHVybiBBZGRyU3BhY2UgPT0gMCA/IFBvaW50ZXJBbGlnbiA6IGdldFBvaW50ZXJBbGlnblYoQWRkclNwYWNlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBtYXhpbXVtIHdpZHRoIG9mIHBvaW50ZXJzIG9uIHRoaXMgdGFyZ2V0LgorICB2aXJ0dWFsIHVpbnQ2NF90IGdldE1heFBvaW50ZXJXaWR0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUG9pbnRlcldpZHRoOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgaW50ZWdlciB2YWx1ZSBmb3IgbnVsbCBwb2ludGVyLgorICAvLy8gXHBhcmFtIEFkZHJTcGFjZSBhZGRyZXNzIHNwYWNlIG9mIHBvaW50ZWUgaW4gc291cmNlIGxhbmd1YWdlLgorICB2aXJ0dWFsIHVpbnQ2NF90IGdldE51bGxQb2ludGVyVmFsdWUoTGFuZ0FTIEFkZHJTcGFjZSkgY29uc3QgeyByZXR1cm4gMDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mICdfQm9vbCcgYW5kIEMrKyAnYm9vbCcgZm9yIHRoaXMgdGFyZ2V0LCBpbiBiaXRzLgorICB1bnNpZ25lZCBnZXRCb29sV2lkdGgoKSBjb25zdCB7IHJldHVybiBCb29sV2lkdGg7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgYWxpZ25tZW50IG9mICdfQm9vbCcgYW5kIEMrKyAnYm9vbCcgZm9yIHRoaXMgdGFyZ2V0LgorICB1bnNpZ25lZCBnZXRCb29sQWxpZ24oKSBjb25zdCB7IHJldHVybiBCb29sQWxpZ247IH0KKworICB1bnNpZ25lZCBnZXRDaGFyV2lkdGgoKSBjb25zdCB7IHJldHVybiA4OyB9IC8vIEZJWE1FCisgIHVuc2lnbmVkIGdldENoYXJBbGlnbigpIGNvbnN0IHsgcmV0dXJuIDg7IH0gLy8gRklYTUUKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiAnc2lnbmVkIHNob3J0JyBhbmQgJ3Vuc2lnbmVkIHNob3J0JyBmb3IgdGhpcworICAvLy8gdGFyZ2V0LCBpbiBiaXRzLgorICB1bnNpZ25lZCBnZXRTaG9ydFdpZHRoKCkgY29uc3QgeyByZXR1cm4gMTY7IH0gLy8gRklYTUUKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgYWxpZ25tZW50IG9mICdzaWduZWQgc2hvcnQnIGFuZCAndW5zaWduZWQgc2hvcnQnIGZvcgorICAvLy8gdGhpcyB0YXJnZXQuCisgIHVuc2lnbmVkIGdldFNob3J0QWxpZ24oKSBjb25zdCB7IHJldHVybiAxNjsgfSAvLyBGSVhNRQorCisgIC8vLyBnZXRJbnRXaWR0aC9BbGlnbiAtIFJldHVybiB0aGUgc2l6ZSBvZiAnc2lnbmVkIGludCcgYW5kICd1bnNpZ25lZCBpbnQnIGZvcgorICAvLy8gdGhpcyB0YXJnZXQsIGluIGJpdHMuCisgIHVuc2lnbmVkIGdldEludFdpZHRoKCkgY29uc3QgeyByZXR1cm4gSW50V2lkdGg7IH0KKyAgdW5zaWduZWQgZ2V0SW50QWxpZ24oKSBjb25zdCB7IHJldHVybiBJbnRBbGlnbjsgfQorCisgIC8vLyBnZXRMb25nV2lkdGgvQWxpZ24gLSBSZXR1cm4gdGhlIHNpemUgb2YgJ3NpZ25lZCBsb25nJyBhbmQgJ3Vuc2lnbmVkIGxvbmcnCisgIC8vLyBmb3IgdGhpcyB0YXJnZXQsIGluIGJpdHMuCisgIHVuc2lnbmVkIGdldExvbmdXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIExvbmdXaWR0aDsgfQorICB1bnNpZ25lZCBnZXRMb25nQWxpZ24oKSBjb25zdCB7IHJldHVybiBMb25nQWxpZ247IH0KKworICAvLy8gZ2V0TG9uZ0xvbmdXaWR0aC9BbGlnbiAtIFJldHVybiB0aGUgc2l6ZSBvZiAnc2lnbmVkIGxvbmcgbG9uZycgYW5kCisgIC8vLyAndW5zaWduZWQgbG9uZyBsb25nJyBmb3IgdGhpcyB0YXJnZXQsIGluIGJpdHMuCisgIHVuc2lnbmVkIGdldExvbmdMb25nV2lkdGgoKSBjb25zdCB7IHJldHVybiBMb25nTG9uZ1dpZHRoOyB9CisgIHVuc2lnbmVkIGdldExvbmdMb25nQWxpZ24oKSBjb25zdCB7IHJldHVybiBMb25nTG9uZ0FsaWduOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgX19pbnQxMjggdHlwZSBpcyBzdXBwb3J0ZWQgb24gdGhpcyB0YXJnZXQuCisgIHZpcnR1YWwgYm9vbCBoYXNJbnQxMjhUeXBlKCkgY29uc3QgeworICAgIHJldHVybiAoZ2V0UG9pbnRlcldpZHRoKDApID49IDY0KSB8fCBnZXRUYXJnZXRPcHRzKCkuRm9yY2VFbmFibGVJbnQxMjg7CisgIH0gLy8gRklYTUUKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIF9GbG9hdDE2IGlzIHN1cHBvcnRlZCBvbiB0aGlzIHRhcmdldC4KKyAgdmlydHVhbCBib29sIGhhc0xlZ2FsSGFsZlR5cGUoKSBjb25zdCB7IHJldHVybiBIYXNMZWdhbEhhbGZUeXBlOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgX19mbG9hdDEyOCB0eXBlIGlzIHN1cHBvcnRlZCBvbiB0aGlzIHRhcmdldC4KKyAgdmlydHVhbCBib29sIGhhc0Zsb2F0MTI4VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEhhc0Zsb2F0MTI4OyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGFsaWdubWVudCB0aGF0IGlzIHN1aXRhYmxlIGZvciBzdG9yaW5nIGFueQorICAvLy8gb2JqZWN0IHdpdGggYSBmdW5kYW1lbnRhbCBhbGlnbm1lbnQgcmVxdWlyZW1lbnQuCisgIHVuc2lnbmVkIGdldFN1aXRhYmxlQWxpZ24oKSBjb25zdCB7IHJldHVybiBTdWl0YWJsZUFsaWduOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGRlZmF1bHQgYWxpZ25tZW50IGZvciBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKSkgb24KKyAgLy8vIHRoaXMgdGFyZ2V0LCB0byBiZSB1c2VkIGlmIG5vIGFsaWdubWVudCB2YWx1ZSBpcyBzcGVjaWZpZWQuCisgIHVuc2lnbmVkIGdldERlZmF1bHRBbGlnbkZvckF0dHJpYnV0ZUFsaWduZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIERlZmF1bHRBbGlnbkZvckF0dHJpYnV0ZUFsaWduZWQ7CisgIH0KKworICAvLy8gZ2V0TWluR2xvYmFsQWxpZ24gLSBSZXR1cm4gdGhlIG1pbmltdW0gYWxpZ25tZW50IG9mIGEgZ2xvYmFsIHZhcmlhYmxlLAorICAvLy8gdW5sZXNzIGl0cyBhbGlnbm1lbnQgaXMgZXhwbGljaXRseSByZWR1Y2VkIHZpYSBhdHRyaWJ1dGVzLgorICB1bnNpZ25lZCBnZXRNaW5HbG9iYWxBbGlnbigpIGNvbnN0IHsgcmV0dXJuIE1pbkdsb2JhbEFsaWduOyB9CisKKyAgLy8vIFJldHVybiB0aGUgbGFyZ2VzdCBhbGlnbm1lbnQgZm9yIHdoaWNoIGEgc3VpdGFibHktc2l6ZWQgYWxsb2NhdGlvbiB3aXRoCisgIC8vLyAnOjpvcGVyYXRvciBuZXcoc2l6ZV90KScgaXMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgY29ycmVjdGx5LWFsaWduZWQKKyAgLy8vIHBvaW50ZXIuCisgIHVuc2lnbmVkIGdldE5ld0FsaWduKCkgY29uc3QgeworICAgIHJldHVybiBOZXdBbGlnbiA/IE5ld0FsaWduIDogc3RkOjptYXgoTG9uZ0RvdWJsZUFsaWduLCBMb25nTG9uZ0FsaWduKTsKKyAgfQorCisgIC8vLyBnZXRXQ2hhcldpZHRoL0FsaWduIC0gUmV0dXJuIHRoZSBzaXplIG9mICd3Y2hhcl90JyBmb3IgdGhpcyB0YXJnZXQsIGluCisgIC8vLyBiaXRzLgorICB1bnNpZ25lZCBnZXRXQ2hhcldpZHRoKCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZVdpZHRoKFdDaGFyVHlwZSk7IH0KKyAgdW5zaWduZWQgZ2V0V0NoYXJBbGlnbigpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVBbGlnbihXQ2hhclR5cGUpOyB9CisKKyAgLy8vIGdldENoYXIxNldpZHRoL0FsaWduIC0gUmV0dXJuIHRoZSBzaXplIG9mICdjaGFyMTZfdCcgZm9yIHRoaXMgdGFyZ2V0LCBpbgorICAvLy8gYml0cy4KKyAgdW5zaWduZWQgZ2V0Q2hhcjE2V2lkdGgoKSBjb25zdCB7IHJldHVybiBnZXRUeXBlV2lkdGgoQ2hhcjE2VHlwZSk7IH0KKyAgdW5zaWduZWQgZ2V0Q2hhcjE2QWxpZ24oKSBjb25zdCB7IHJldHVybiBnZXRUeXBlQWxpZ24oQ2hhcjE2VHlwZSk7IH0KKworICAvLy8gZ2V0Q2hhcjMyV2lkdGgvQWxpZ24gLSBSZXR1cm4gdGhlIHNpemUgb2YgJ2NoYXIzMl90JyBmb3IgdGhpcyB0YXJnZXQsIGluCisgIC8vLyBiaXRzLgorICB1bnNpZ25lZCBnZXRDaGFyMzJXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVXaWR0aChDaGFyMzJUeXBlKTsgfQorICB1bnNpZ25lZCBnZXRDaGFyMzJBbGlnbigpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVBbGlnbihDaGFyMzJUeXBlKTsgfQorCisgIC8vLyBnZXRIYWxmV2lkdGgvQWxpZ24vRm9ybWF0IC0gUmV0dXJuIHRoZSBzaXplL2FsaWduL2Zvcm1hdCBvZiAnaGFsZicuCisgIHVuc2lnbmVkIGdldEhhbGZXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIEhhbGZXaWR0aDsgfQorICB1bnNpZ25lZCBnZXRIYWxmQWxpZ24oKSBjb25zdCB7IHJldHVybiBIYWxmQWxpZ247IH0KKyAgY29uc3QgbGx2bTo6Zmx0U2VtYW50aWNzICZnZXRIYWxmRm9ybWF0KCkgY29uc3QgeyByZXR1cm4gKkhhbGZGb3JtYXQ7IH0KKworICAvLy8gZ2V0RmxvYXRXaWR0aC9BbGlnbi9Gb3JtYXQgLSBSZXR1cm4gdGhlIHNpemUvYWxpZ24vZm9ybWF0IG9mICdmbG9hdCcuCisgIHVuc2lnbmVkIGdldEZsb2F0V2lkdGgoKSBjb25zdCB7IHJldHVybiBGbG9hdFdpZHRoOyB9CisgIHVuc2lnbmVkIGdldEZsb2F0QWxpZ24oKSBjb25zdCB7IHJldHVybiBGbG9hdEFsaWduOyB9CisgIGNvbnN0IGxsdm06OmZsdFNlbWFudGljcyAmZ2V0RmxvYXRGb3JtYXQoKSBjb25zdCB7IHJldHVybiAqRmxvYXRGb3JtYXQ7IH0KKworICAvLy8gZ2V0RG91YmxlV2lkdGgvQWxpZ24vRm9ybWF0IC0gUmV0dXJuIHRoZSBzaXplL2FsaWduL2Zvcm1hdCBvZiAnZG91YmxlJy4KKyAgdW5zaWduZWQgZ2V0RG91YmxlV2lkdGgoKSBjb25zdCB7IHJldHVybiBEb3VibGVXaWR0aDsgfQorICB1bnNpZ25lZCBnZXREb3VibGVBbGlnbigpIGNvbnN0IHsgcmV0dXJuIERvdWJsZUFsaWduOyB9CisgIGNvbnN0IGxsdm06OmZsdFNlbWFudGljcyAmZ2V0RG91YmxlRm9ybWF0KCkgY29uc3QgeyByZXR1cm4gKkRvdWJsZUZvcm1hdDsgfQorCisgIC8vLyBnZXRMb25nRG91YmxlV2lkdGgvQWxpZ24vRm9ybWF0IC0gUmV0dXJuIHRoZSBzaXplL2FsaWduL2Zvcm1hdCBvZiAnbG9uZworICAvLy8gZG91YmxlJy4KKyAgdW5zaWduZWQgZ2V0TG9uZ0RvdWJsZVdpZHRoKCkgY29uc3QgeyByZXR1cm4gTG9uZ0RvdWJsZVdpZHRoOyB9CisgIHVuc2lnbmVkIGdldExvbmdEb3VibGVBbGlnbigpIGNvbnN0IHsgcmV0dXJuIExvbmdEb3VibGVBbGlnbjsgfQorICBjb25zdCBsbHZtOjpmbHRTZW1hbnRpY3MgJmdldExvbmdEb3VibGVGb3JtYXQoKSBjb25zdCB7CisgICAgcmV0dXJuICpMb25nRG91YmxlRm9ybWF0OworICB9CisKKyAgLy8vIGdldEZsb2F0MTI4V2lkdGgvQWxpZ24vRm9ybWF0IC0gUmV0dXJuIHRoZSBzaXplL2FsaWduL2Zvcm1hdCBvZgorICAvLy8gJ19fZmxvYXQxMjgnLgorICB1bnNpZ25lZCBnZXRGbG9hdDEyOFdpZHRoKCkgY29uc3QgeyByZXR1cm4gMTI4OyB9CisgIHVuc2lnbmVkIGdldEZsb2F0MTI4QWxpZ24oKSBjb25zdCB7IHJldHVybiBGbG9hdDEyOEFsaWduOyB9CisgIGNvbnN0IGxsdm06OmZsdFNlbWFudGljcyAmZ2V0RmxvYXQxMjhGb3JtYXQoKSBjb25zdCB7CisgICAgcmV0dXJuICpGbG9hdDEyOEZvcm1hdDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlICdsb25nIGRvdWJsZScgdHlwZSBzaG91bGQgYmUgbWFuZ2xlZCBsaWtlCisgIC8vLyBfX2Zsb2F0MTI4LgorICB2aXJ0dWFsIGJvb2wgdXNlRmxvYXQxMjhNYW5nbGluZ0ZvckxvbmdEb3VibGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB2YWx1ZSBmb3IgdGhlIEM5OSBGTFRfRVZBTF9NRVRIT0QgbWFjcm8uCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0RmxvYXRFdmFsTWV0aG9kKCkgY29uc3QgeyByZXR1cm4gMDsgfQorCisgIC8vIGdldExhcmdlQXJyYXlNaW5XaWR0aC9BbGlnbiAtIFJldHVybiB0aGUgbWluaW11bSBhcnJheSBzaXplIHRoYXQgaXMKKyAgLy8gJ2xhcmdlJyBhbmQgaXRzIGFsaWdubWVudC4KKyAgdW5zaWduZWQgZ2V0TGFyZ2VBcnJheU1pbldpZHRoKCkgY29uc3QgeyByZXR1cm4gTGFyZ2VBcnJheU1pbldpZHRoOyB9CisgIHVuc2lnbmVkIGdldExhcmdlQXJyYXlBbGlnbigpIGNvbnN0IHsgcmV0dXJuIExhcmdlQXJyYXlBbGlnbjsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBtYXhpbXVtIHdpZHRoIGxvY2stZnJlZSBhdG9taWMgb3BlcmF0aW9uIHdoaWNoIHdpbGwKKyAgLy8vIGV2ZXIgYmUgc3VwcG9ydGVkIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0CisgIHVuc2lnbmVkIGdldE1heEF0b21pY1Byb21vdGVXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIE1heEF0b21pY1Byb21vdGVXaWR0aDsgfQorICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbWF4aW11bSB3aWR0aCBsb2NrLWZyZWUgYXRvbWljIG9wZXJhdGlvbiB3aGljaCBjYW4gYmUKKyAgLy8vIGlubGluZWQgZ2l2ZW4gdGhlIHN1cHBvcnRlZCBmZWF0dXJlcyBvZiB0aGUgZ2l2ZW4gdGFyZ2V0LgorICB1bnNpZ25lZCBnZXRNYXhBdG9taWNJbmxpbmVXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIE1heEF0b21pY0lubGluZVdpZHRoOyB9CisgIC8vLyBcYnJpZWYgU2V0IHRoZSBtYXhpbXVtIGlubGluZSBvciBwcm9tb3RlIHdpZHRoIGxvY2stZnJlZSBhdG9taWMgb3BlcmF0aW9uCisgIC8vLyBmb3IgdGhlIGdpdmVuIHRhcmdldC4KKyAgdmlydHVhbCB2b2lkIHNldE1heEF0b21pY1dpZHRoKCkge30KKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHRhcmdldCBzdXBwb3J0cyBsb2NrLWZyZWUgYXRvbWljCisgIC8vLyBvcGVyYXRpb25zIGF0IHRoZSBzcGVjaWZpZWQgd2lkdGggYW5kIGFsaWdubWVudC4KKyAgdmlydHVhbCBib29sIGhhc0J1aWx0aW5BdG9taWModWludDY0X3QgQXRvbWljU2l6ZUluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQWxpZ25tZW50SW5CaXRzKSBjb25zdCB7CisgICAgcmV0dXJuIEF0b21pY1NpemVJbkJpdHMgPD0gQWxpZ25tZW50SW5CaXRzICYmCisgICAgICAgICAgIEF0b21pY1NpemVJbkJpdHMgPD0gZ2V0TWF4QXRvbWljSW5saW5lV2lkdGgoKSAmJgorICAgICAgICAgICAoQXRvbWljU2l6ZUluQml0cyA8PSBnZXRDaGFyV2lkdGgoKSB8fAorICAgICAgICAgICAgbGx2bTo6aXNQb3dlck9mMl82NChBdG9taWNTaXplSW5CaXRzIC8gZ2V0Q2hhcldpZHRoKCkpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBtYXhpbXVtIHZlY3RvciBhbGlnbm1lbnQgc3VwcG9ydGVkIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0LgorICB1bnNpZ25lZCBnZXRNYXhWZWN0b3JBbGlnbigpIGNvbnN0IHsgcmV0dXJuIE1heFZlY3RvckFsaWduOyB9CisgIC8vLyBcYnJpZWYgUmV0dXJuIGRlZmF1bHQgc2ltZCBhbGlnbm1lbnQgZm9yIHRoZSBnaXZlbiB0YXJnZXQuIEdlbmVyYWxseSwgdGhpcworICAvLy8gdmFsdWUgaXMgdHlwZS1zcGVjaWZpYywgYnV0IHRoaXMgYWxpZ25tZW50IGNhbiBiZSB1c2VkIGZvciBtb3N0IG9mIHRoZQorICAvLy8gdHlwZXMgZm9yIHRoZSBnaXZlbiB0YXJnZXQuCisgIHVuc2lnbmVkIGdldFNpbWREZWZhdWx0QWxpZ24oKSBjb25zdCB7IHJldHVybiBTaW1kRGVmYXVsdEFsaWduOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgaW50bWF4X3QgYW5kIHVpbnRtYXhfdCBmb3IgdGhpcyB0YXJnZXQsIGluIGJpdHMuCisgIHVuc2lnbmVkIGdldEludE1heFRXaWR0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHlwZVdpZHRoKEludE1heFR5cGUpOworICB9CisKKyAgLy8gUmV0dXJuIHRoZSBzaXplIG9mIHVud2luZF93b3JkIGZvciB0aGlzIHRhcmdldC4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRVbndpbmRXb3JkV2lkdGgoKSBjb25zdCB7IHJldHVybiBnZXRQb2ludGVyV2lkdGgoMCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgInByZWZlcnJlZCIgcmVnaXN0ZXIgd2lkdGggb24gdGhpcyB0YXJnZXQuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0UmVnaXN0ZXJXaWR0aCgpIGNvbnN0IHsKKyAgICAvLyBDdXJyZW50bHkgd2UgYXNzdW1lIHRoZSByZWdpc3RlciB3aWR0aCBvbiB0aGUgdGFyZ2V0IG1hdGNoZXMgdGhlIHBvaW50ZXIKKyAgICAvLyB3aWR0aCwgd2UgY2FuIGludHJvZHVjZSBhIG5ldyB2YXJpYWJsZSBmb3IgdGhpcyBpZi93aGVuIHNvbWUgdGFyZ2V0IHdhbnRzCisgICAgLy8gaXQuCisgICAgcmV0dXJuIFBvaW50ZXJXaWR0aDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbWNvdW50IGluc3RydW1lbnRhdGlvbiBmdW5jdGlvbi4KKyAgY29uc3QgY2hhciAqZ2V0TUNvdW50TmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTUNvdW50TmFtZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2hlY2sgaWYgdGhlIE9iamVjdGl2ZS1DIGJ1aWx0LWluIGJvb2xlYW4gdHlwZSBzaG91bGQgYmUgc2lnbmVkCisgIC8vLyBjaGFyLgorICAvLy8KKyAgLy8vIE90aGVyd2lzZSwgaWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgbm9ybWFsIGJ1aWx0LWluIGJvb2xlYW4gdHlwZQorICAvLy8gc2hvdWxkIGFsc28gYmUgdXNlZCBmb3IgT2JqZWN0aXZlLUMuCisgIGJvb2wgdXNlU2lnbmVkQ2hhckZvck9iakNCb29sKCkgY29uc3QgeworICAgIHJldHVybiBVc2VTaWduZWRDaGFyRm9yT2JqQ0Jvb2w7CisgIH0KKyAgdm9pZCBub1NpZ25lZENoYXJGb3JPYmpDQm9vbCgpIHsKKyAgICBVc2VTaWduZWRDaGFyRm9yT2JqQ0Jvb2wgPSBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2hlY2sgd2hldGhlciB0aGUgYWxpZ25tZW50IG9mIGJpdC1maWVsZCB0eXBlcyBpcyByZXNwZWN0ZWQKKyAgLy8vIHdoZW4gbGF5aW5nIG91dCBzdHJ1Y3R1cmVzLgorICBib29sIHVzZUJpdEZpZWxkVHlwZUFsaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVXNlQml0RmllbGRUeXBlQWxpZ25tZW50OworICB9CisKKyAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIHplcm8gbGVuZ3RoIGJpdGZpZWxkcyBzaG91bGQgZm9yY2UgYWxpZ25tZW50IG9mCisgIC8vLyB0aGUgbmV4dCBtZW1iZXIuCisgIGJvb2wgdXNlWmVyb0xlbmd0aEJpdGZpZWxkQWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBVc2VaZXJvTGVuZ3RoQml0ZmllbGRBbGlnbm1lbnQ7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgZml4ZWQgYWxpZ25tZW50IHZhbHVlIGluIGJpdHMgZm9yIGEgbWVtYmVyIHRoYXQgZm9sbG93cworICAvLy8gYSB6ZXJvIGxlbmd0aCBiaXRmaWVsZC4KKyAgdW5zaWduZWQgZ2V0WmVyb0xlbmd0aEJpdGZpZWxkQm91bmRhcnkoKSBjb25zdCB7CisgICAgcmV0dXJuIFplcm9MZW5ndGhCaXRmaWVsZEJvdW5kYXJ5OworICB9CisKKyAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIGV4cGxpY2l0IGJpdGZpZWxkIGFsaWdubWVudCBhdHRyaWJ1dGVzIHNob3VsZCBiZQorICAvLyAgaG9ub3JlZCwgYXMgaW4gIl9fYXR0cmlidXRlX18oKGFsaWduZWQoMikpKSBpbnQgYiA6IDE7Ii4KKyAgYm9vbCB1c2VFeHBsaWNpdEJpdEZpZWxkQWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBVc2VFeHBsaWNpdEJpdEZpZWxkQWxpZ25tZW50OworICB9CisKKyAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIHRoaXMgdGFyZ2V0IHN1cHBvcnQgJ1wjcHJhZ21hIG9wdGlvbnMgYWxpZ249bWFjNjhrJy4KKyAgYm9vbCBoYXNBbGlnbk1hYzY4a1N1cHBvcnQoKSBjb25zdCB7CisgICAgcmV0dXJuIEhhc0FsaWduTWFjNjhrU3VwcG9ydDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB1c2VyIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHR5cGUgZW51bS4KKyAgLy8vCisgIC8vLyBGb3IgZXhhbXBsZSwgU2lnbmVkU2hvcnQgLT4gInNob3J0Ii4KKyAgc3RhdGljIGNvbnN0IGNoYXIgKmdldFR5cGVOYW1lKEludFR5cGUgVCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGNvbnN0YW50IHN1ZmZpeCBmb3IgdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHR5cGUgZW51bS4KKyAgLy8vCisgIC8vLyBGb3IgZXhhbXBsZSwgU2lnbmVkTG9uZyAtPiAiTCIuCisgIGNvbnN0IGNoYXIgKmdldFR5cGVDb25zdGFudFN1ZmZpeChJbnRUeXBlIFQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBwcmludGYgZm9ybWF0IG1vZGlmaWVyIGZvciB0aGUgc3BlY2lmaWVkCisgIC8vLyBpbnRlZ2VyIHR5cGUgZW51bS4KKyAgLy8vCisgIC8vLyBGb3IgZXhhbXBsZSwgU2lnbmVkTG9uZyAtPiAibCIuCisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRUeXBlRm9ybWF0TW9kaWZpZXIoSW50VHlwZSBUKTsKKworICAvLy8gXGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHJlYWwgdHlwZSBzaG91bGQgdXNlIHRoZSAiZnByZXQiIGZsYXZvciBvZgorICAvLy8gT2JqZWN0aXZlLUMgbWVzc2FnZSBwYXNzaW5nIG9uIHRoaXMgdGFyZ2V0LgorICBib29sIHVzZU9iakNGUFJldEZvclJlYWxUeXBlKFJlYWxUeXBlIFQpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVhbFR5cGVVc2VzT2JqQ0ZQUmV0ICYgKDEgPDwgVCk7CisgIH0KKworICAvLy8gXGJyaWVmIENoZWNrIHdoZXRoZXIgX0NvbXBsZXggbG9uZyBkb3VibGUgc2hvdWxkIHVzZSB0aGUgImZwMnJldCIgZmxhdm9yCisgIC8vLyBvZiBPYmplY3RpdmUtQyBtZXNzYWdlIHBhc3Npbmcgb24gdGhpcyB0YXJnZXQuCisgIGJvb2wgdXNlT2JqQ0ZQMlJldEZvckNvbXBsZXhMb25nRG91YmxlKCkgY29uc3QgeworICAgIHJldHVybiBDb21wbGV4TG9uZ0RvdWJsZVVzZXNGUDJSZXQ7CisgIH0KKworICAvLy8gQ2hlY2sgd2hldGhlciBsbHZtIGludHJpbnNpY3Mgc3VjaCBhcyBsbHZtLmNvbnZlcnQudG8uZnAxNiBzaG91bGQgYmUgdXNlZAorICAvLy8gdG8gY29udmVydCB0byBhbmQgZnJvbSBfX2ZwMTYuCisgIC8vLyBGSVhNRTogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIGFsbCB0YXJnZXRzIHN0b3AgdXNpbmcgdGhlCisgIC8vLyBjb252ZXJzaW9uIGludHJpbnNpY3MuCisgIHZpcnR1YWwgYm9vbCB1c2VGUDE2Q29udmVyc2lvbkludHJpbnNpY3MoKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gXGJyaWVmIFNwZWNpZnkgaWYgbWFuZ2xpbmcgYmFzZWQgb24gYWRkcmVzcyBzcGFjZSBtYXAgc2hvdWxkIGJlIHVzZWQgb3IKKyAgLy8vIG5vdCBmb3IgbGFuZ3VhZ2Ugc3BlY2lmaWMgYWRkcmVzcyBzcGFjZXMKKyAgYm9vbCB1c2VBZGRyZXNzU3BhY2VNYXBNYW5nbGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gVXNlQWRkclNwYWNlTWFwTWFuZ2xpbmc7CisgIH0KKworICAvLy89PT0tLS0tIE90aGVyIHRhcmdldCBwcm9wZXJ0eSBxdWVyeSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIEFwcGVuZHMgdGhlIHRhcmdldC1zcGVjaWZpYyBcI2RlZmluZSB2YWx1ZXMgZm9yIHRoaXMKKyAgLy8vIHRhcmdldCBzZXQgdG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgIHZpcnR1YWwgdm9pZCBnZXRUYXJnZXREZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0ID0gMDsKKworCisgIC8vLyBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGFyZ2V0LXNwZWNpZmljIGJ1aWx0aW5zIGZvcgorICAvLy8gdGhlIGN1cnJlbnQgcHJpbWFyeSB0YXJnZXQsIGFuZCBpbmZvIGFib3V0IHdoaWNoIGJ1aWx0aW5zIGFyZSBub24tcG9ydGFibGUKKyAgLy8vIGFjcm9zcyB0aGUgY3VycmVudCBzZXQgb2YgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IHRhcmdldHMuCisgIHZpcnR1YWwgQXJyYXlSZWY8QnVpbHRpbjo6SW5mbz4gZ2V0VGFyZ2V0QnVpbHRpbnMoKSBjb25zdCA9IDA7CisKKyAgLy8vIFRoZSBfX2J1aWx0aW5fY2x6KiBhbmQgX19idWlsdGluX2N0eiogYnVpbHQtaW4KKyAgLy8vIGZ1bmN0aW9ucyBhcmUgc3BlY2lmaWVkIHRvIGhhdmUgdW5kZWZpbmVkIHJlc3VsdHMgZm9yIHplcm8gaW5wdXRzLCBidXQKKyAgLy8vIG9uIHRhcmdldHMgdGhhdCBzdXBwb3J0IHRoZXNlIG9wZXJhdGlvbnMgaW4gYSB3YXkgdGhhdCBwcm92aWRlcworICAvLy8gd2VsbC1kZWZpbmVkIHJlc3VsdHMgZm9yIHplcm8gd2l0aG91dCBsb3NzIG9mIHBlcmZvcm1hbmNlLCBpdCBpcyBhIGdvb2QKKyAgLy8vIGlkZWEgdG8gYXZvaWQgb3B0aW1pemluZyBiYXNlZCBvbiB0aGF0IHVuZGVmIGJlaGF2aW9yLgorICB2aXJ0dWFsIGJvb2wgaXNDTFpGb3JaZXJvVW5kZWYoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBraW5kIG9mIF9fYnVpbHRpbl92YV9saXN0IHR5cGUgdGhhdCBzaG91bGQgYmUgdXNlZAorICAvLy8gd2l0aCB0aGlzIHRhcmdldC4KKyAgdmlydHVhbCBCdWlsdGluVmFMaXN0S2luZCBnZXRCdWlsdGluVmFMaXN0S2luZCgpIGNvbnN0ID0gMDsKKworICAvLy8gUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0eXBlIFxjIF9fYnVpbHRpbl9tc192YV9saXN0IHR5cGUgaXMKKyAgLy8vIGF2YWlsYWJsZSBvbiB0aGlzIHRhcmdldC4KKyAgYm9vbCBoYXNCdWlsdGluTVNWYUxpc3QoKSBjb25zdCB7IHJldHVybiBIYXNCdWlsdGluTVNWYUxpc3Q7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGZvciBSZW5kZXJTY3JpcHQuCisgIGJvb2wgaXNSZW5kZXJTY3JpcHRUYXJnZXQoKSBjb25zdCB7IHJldHVybiBJc1JlbmRlclNjcmlwdFRhcmdldDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB3aGV0aGVyIHRoZSBwYXNzZWQgaW4gc3RyaW5nIGlzIGEgdmFsaWQgY2xvYmJlciBpbiBhbgorICAvLy8gaW5saW5lIGFzbSBzdGF0ZW1lbnQuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIGJ5IFNlbWEuCisgIGJvb2wgaXNWYWxpZENsb2JiZXIoU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB3aGV0aGVyIHRoZSBwYXNzZWQgaW4gc3RyaW5nIGlzIGEgdmFsaWQgcmVnaXN0ZXIgbmFtZQorICAvLy8gYWNjb3JkaW5nIHRvIEdDQy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgYnkgU2VtYSBmb3IgaW5saW5lIGFzbSBzdGF0ZW1lbnRzLgorICBib29sIGlzVmFsaWRHQ0NSZWdpc3Rlck5hbWUoU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgIm5vcm1hbGl6ZWQiIEdDQyByZWdpc3RlciBuYW1lLgorICAvLy8KKyAgLy8vIFJldHVybkNhbm5vbmljYWwgdHJ1ZSB3aWxsIHJldHVybiB0aGUgcmVnaXN0ZXIgbmFtZSB3aXRob3V0IGFueSBhZGRpdGlvbnMKKyAgLy8vIHN1Y2ggYXMgInt9IiBvciAiJSIgaW4gaXQncyBjYW5vbmljYWwgZm9ybSwgZm9yIGV4YW1wbGU6CisgIC8vLyBSZXR1cm5DYW5vbmljYWwgPSB0cnVlIGFuZCBOYW1lID0gInJheCIsIHdpbGwgcmV0dXJuICJheCIuCisgIFN0cmluZ1JlZiBnZXROb3JtYWxpemVkR0NDUmVnaXN0ZXJOYW1lKFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJldHVybkNhbm9uaWNhbCA9IGZhbHNlKSBjb25zdDsKKworICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRDb25zdHJhaW50UmVnaXN0ZXIoU3RyaW5nUmVmIENvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRXhwcmVzc2lvbikgY29uc3QgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIHN0cnVjdCBDb25zdHJhaW50SW5mbyB7CisgICAgZW51bSB7CisgICAgICBDSV9Ob25lID0gMHgwMCwKKyAgICAgIENJX0FsbG93c01lbW9yeSA9IDB4MDEsCisgICAgICBDSV9BbGxvd3NSZWdpc3RlciA9IDB4MDIsCisgICAgICBDSV9SZWFkV3JpdGUgPSAweDA0LCAgICAgICAgIC8vICIrciIgb3V0cHV0IGNvbnN0cmFpbnQgKHJlYWQgYW5kIHdyaXRlKS4KKyAgICAgIENJX0hhc01hdGNoaW5nSW5wdXQgPSAweDA4LCAgLy8gVGhpcyBvdXRwdXQgb3BlcmFuZCBoYXMgYSBtYXRjaGluZyBpbnB1dC4KKyAgICAgIENJX0ltbWVkaWF0ZUNvbnN0YW50ID0gMHgxMCwgLy8gVGhpcyBvcGVyYW5kIG11c3QgYmUgYW4gaW1tZWRpYXRlIGNvbnN0YW50CisgICAgICBDSV9FYXJseUNsb2JiZXIgPSAweDIwLCAgICAgIC8vICImIiBvdXRwdXQgY29uc3RyYWludCAoZWFybHkgY2xvYmJlcikuCisgICAgfTsKKyAgICB1bnNpZ25lZCBGbGFnczsKKyAgICBpbnQgVGllZE9wZXJhbmQ7CisgICAgc3RydWN0IHsKKyAgICAgIGludCBNaW47CisgICAgICBpbnQgTWF4OworICAgIH0gSW1tUmFuZ2U7CisgICAgbGx2bTo6U21hbGxTZXQ8aW50LCA0PiBJbW1TZXQ7CisKKyAgICBzdGQ6OnN0cmluZyBDb25zdHJhaW50U3RyOyAgLy8gY29uc3RyYWludDogIj1ybSIKKyAgICBzdGQ6OnN0cmluZyBOYW1lOyAgICAgICAgICAgLy8gT3BlcmFuZCBuYW1lOiBbZm9vXSB3aXRoIG5vIFtdJ3MuCisgIHB1YmxpYzoKKyAgICBDb25zdHJhaW50SW5mbyhTdHJpbmdSZWYgQ29uc3RyYWludFN0ciwgU3RyaW5nUmVmIE5hbWUpCisgICAgICAgIDogRmxhZ3MoMCksIFRpZWRPcGVyYW5kKC0xKSwgQ29uc3RyYWludFN0cihDb25zdHJhaW50U3RyLnN0cigpKSwKKyAgICAgICAgICBOYW1lKE5hbWUuc3RyKCkpIHsKKyAgICAgIEltbVJhbmdlLk1pbiA9IEltbVJhbmdlLk1heCA9IDA7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldENvbnN0cmFpbnRTdHIoKSBjb25zdCB7IHJldHVybiBDb25zdHJhaW50U3RyOyB9CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisgICAgYm9vbCBpc1JlYWRXcml0ZSgpIGNvbnN0IHsgcmV0dXJuIChGbGFncyAmIENJX1JlYWRXcml0ZSkgIT0gMDsgfQorICAgIGJvb2wgZWFybHlDbG9iYmVyKCkgeyByZXR1cm4gKEZsYWdzICYgQ0lfRWFybHlDbG9iYmVyKSAhPSAwOyB9CisgICAgYm9vbCBhbGxvd3NSZWdpc3RlcigpIGNvbnN0IHsgcmV0dXJuIChGbGFncyAmIENJX0FsbG93c1JlZ2lzdGVyKSAhPSAwOyB9CisgICAgYm9vbCBhbGxvd3NNZW1vcnkoKSBjb25zdCB7IHJldHVybiAoRmxhZ3MgJiBDSV9BbGxvd3NNZW1vcnkpICE9IDA7IH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBvdXRwdXQgb3BlcmFuZCBoYXMgYSBtYXRjaGluZworICAgIC8vLyAodGllZCkgaW5wdXQgb3BlcmFuZC4KKyAgICBib29sIGhhc01hdGNoaW5nSW5wdXQoKSBjb25zdCB7IHJldHVybiAoRmxhZ3MgJiBDSV9IYXNNYXRjaGluZ0lucHV0KSAhPSAwOyB9CisKKyAgICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaW5wdXQgb3BlcmFuZCBpcyBhIG1hdGNoaW5nCisgICAgLy8vIGNvbnN0cmFpbnQgdGhhdCB0aWVzIGl0IHRvIGFuIG91dHB1dCBvcGVyYW5kLgorICAgIC8vLworICAgIC8vLyBJZiB0aGlzIHJldHVybnMgdHJ1ZSB0aGVuIGdldFRpZWRPcGVyYW5kIHdpbGwgaW5kaWNhdGUgd2hpY2ggb3V0cHV0CisgICAgLy8vIG9wZXJhbmQgdGhpcyBpcyB0aWVkIHRvLgorICAgIGJvb2wgaGFzVGllZE9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBUaWVkT3BlcmFuZCAhPSAtMTsgfQorICAgIHVuc2lnbmVkIGdldFRpZWRPcGVyYW5kKCkgY29uc3QgeworICAgICAgYXNzZXJ0KGhhc1RpZWRPcGVyYW5kKCkgJiYgIkhhcyBubyB0aWVkIG9wZXJhbmQhIik7CisgICAgICByZXR1cm4gKHVuc2lnbmVkKVRpZWRPcGVyYW5kOworICAgIH0KKworICAgIGJvb2wgcmVxdWlyZXNJbW1lZGlhdGVDb25zdGFudCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoRmxhZ3MgJiBDSV9JbW1lZGlhdGVDb25zdGFudCkgIT0gMDsKKyAgICB9CisgICAgYm9vbCBpc1ZhbGlkQXNtSW1tZWRpYXRlKGNvbnN0IGxsdm06OkFQSW50ICZWYWx1ZSkgY29uc3QgeworICAgICAgcmV0dXJuIChWYWx1ZS5zZ2UoSW1tUmFuZ2UuTWluKSAmJiBWYWx1ZS5zbGUoSW1tUmFuZ2UuTWF4KSkgfHwKKyAgICAgICAgICAgICBJbW1TZXQuY291bnQoVmFsdWUuZ2V0WkV4dFZhbHVlKCkpICE9IDA7CisgICAgfQorCisgICAgdm9pZCBzZXRJc1JlYWRXcml0ZSgpIHsgRmxhZ3MgfD0gQ0lfUmVhZFdyaXRlOyB9CisgICAgdm9pZCBzZXRFYXJseUNsb2JiZXIoKSB7IEZsYWdzIHw9IENJX0Vhcmx5Q2xvYmJlcjsgfQorICAgIHZvaWQgc2V0QWxsb3dzTWVtb3J5KCkgeyBGbGFncyB8PSBDSV9BbGxvd3NNZW1vcnk7IH0KKyAgICB2b2lkIHNldEFsbG93c1JlZ2lzdGVyKCkgeyBGbGFncyB8PSBDSV9BbGxvd3NSZWdpc3RlcjsgfQorICAgIHZvaWQgc2V0SGFzTWF0Y2hpbmdJbnB1dCgpIHsgRmxhZ3MgfD0gQ0lfSGFzTWF0Y2hpbmdJbnB1dDsgfQorICAgIHZvaWQgc2V0UmVxdWlyZXNJbW1lZGlhdGUoaW50IE1pbiwgaW50IE1heCkgeworICAgICAgRmxhZ3MgfD0gQ0lfSW1tZWRpYXRlQ29uc3RhbnQ7CisgICAgICBJbW1SYW5nZS5NaW4gPSBNaW47CisgICAgICBJbW1SYW5nZS5NYXggPSBNYXg7CisgICAgfQorICAgIHZvaWQgc2V0UmVxdWlyZXNJbW1lZGlhdGUobGx2bTo6QXJyYXlSZWY8aW50PiBFeGFjdHMpIHsKKyAgICAgIEZsYWdzIHw9IENJX0ltbWVkaWF0ZUNvbnN0YW50OworICAgICAgZm9yIChpbnQgRXhhY3QgOiBFeGFjdHMpCisgICAgICAgIEltbVNldC5pbnNlcnQoRXhhY3QpOworICAgIH0KKyAgICB2b2lkIHNldFJlcXVpcmVzSW1tZWRpYXRlKGludCBFeGFjdCkgeworICAgICAgRmxhZ3MgfD0gQ0lfSW1tZWRpYXRlQ29uc3RhbnQ7CisgICAgICBJbW1TZXQuaW5zZXJ0KEV4YWN0KTsKKyAgICB9CisgICAgdm9pZCBzZXRSZXF1aXJlc0ltbWVkaWF0ZSgpIHsKKyAgICAgIEZsYWdzIHw9IENJX0ltbWVkaWF0ZUNvbnN0YW50OworICAgICAgSW1tUmFuZ2UuTWluID0gSU5UX01JTjsKKyAgICAgIEltbVJhbmdlLk1heCA9IElOVF9NQVg7CisgICAgfQorCisgICAgLy8vIFxicmllZiBJbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYW4gaW5wdXQgb3BlcmFuZCB0aGF0IGlzIHRpZWQgdG8KKyAgICAvLy8gdGhlIHNwZWNpZmllZCBvdXRwdXQgb3BlcmFuZC4KKyAgICAvLy8KKyAgICAvLy8gQ29weSBvdmVyIHRoZSB2YXJpb3VzIGNvbnN0cmFpbnQgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3V0cHV0LgorICAgIHZvaWQgc2V0VGllZE9wZXJhbmQodW5zaWduZWQgTiwgQ29uc3RyYWludEluZm8gJk91dHB1dCkgeworICAgICAgT3V0cHV0LnNldEhhc01hdGNoaW5nSW5wdXQoKTsKKyAgICAgIEZsYWdzID0gT3V0cHV0LkZsYWdzOworICAgICAgVGllZE9wZXJhbmQgPSBOOworICAgICAgLy8gRG9uJ3QgY29weSBOYW1lIG9yIGNvbnN0cmFpbnQgc3RyaW5nLgorICAgIH0KKyAgfTsKKworICAvLy8gXGJyaWVmIFZhbGlkYXRlIHJlZ2lzdGVyIG5hbWUgdXNlZCBmb3IgZ2xvYmFsIHJlZ2lzdGVyIHZhcmlhYmxlcy4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgcmVnaXN0ZXIgcGFzc2VkIGluIFJlZ05hbWUgY2FuIGJlIHVzZWQKKyAgLy8vIGZvciBnbG9iYWwgcmVnaXN0ZXIgdmFyaWFibGVzIG9uIHRoaXMgdGFyZ2V0LiBJbiBhZGRpdGlvbiwgaXQgcmV0dXJucworICAvLy8gdHJ1ZSBpbiBIYXNTaXplTWlzbWF0Y2ggaWYgdGhlIHNpemUgb2YgdGhlIHJlZ2lzdGVyIGRvZXNuJ3QgbWF0Y2ggdGhlCisgIC8vLyB2YXJpYWJsZSBzaXplIHBhc3NlZCBpbiBSZWdTaXplLgorICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVHbG9iYWxSZWdpc3RlclZhcmlhYmxlKFN0cmluZ1JlZiBSZWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmSGFzU2l6ZU1pc21hdGNoKSBjb25zdCB7CisgICAgSGFzU2l6ZU1pc21hdGNoID0gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyB2YWxpZGF0ZU91dHB1dENvbnN0cmFpbnQsIHZhbGlkYXRlSW5wdXRDb25zdHJhaW50IC0gQ2hlY2tzIHRoYXQKKyAgLy8gYSBjb25zdHJhaW50IGlzIHZhbGlkIGFuZCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBpdC4KKyAgLy8gRklYTUU6IFRoZXNlIHNob3VsZCByZXR1cm4gYSByZWFsIGVycm9yIGluc3RlYWQgb2YganVzdCB0cnVlL2ZhbHNlLgorICBib29sIHZhbGlkYXRlT3V0cHV0Q29uc3RyYWludChDb25zdHJhaW50SW5mbyAmSW5mbykgY29uc3Q7CisgIGJvb2wgdmFsaWRhdGVJbnB1dENvbnN0cmFpbnQoTXV0YWJsZUFycmF5UmVmPENvbnN0cmFpbnRJbmZvPiBPdXRwdXRDb25zdHJhaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50SW5mbyAmaW5mbykgY29uc3Q7CisKKyAgdmlydHVhbCBib29sIHZhbGlkYXRlT3V0cHV0U2l6ZShTdHJpbmdSZWYgLypDb25zdHJhaW50Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgLypTaXplKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUlucHV0U2l6ZShTdHJpbmdSZWYgLypDb25zdHJhaW50Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAvKlNpemUqLykgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisgIHZpcnR1YWwgYm9vbAorICB2YWxpZGF0ZUNvbnN0cmFpbnRNb2RpZmllcihTdHJpbmdSZWYgLypDb25zdHJhaW50Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgLypNb2RpZmllciovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAvKlNpemUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJi8qU3VnZ2VzdGVkTW9kaWZpZXIqLykgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisgIHZpcnR1YWwgYm9vbAorICB2YWxpZGF0ZUFzbUNvbnN0cmFpbnQoY29uc3QgY2hhciAqJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvOjpDb25zdHJhaW50SW5mbyAmaW5mbykgY29uc3QgPSAwOworCisgIGJvb2wgcmVzb2x2ZVN5bWJvbGljTmFtZShjb25zdCBjaGFyIComTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENvbnN0cmFpbnRJbmZvPiBPdXRwdXRDb25zdHJhaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZJbmRleCkgY29uc3Q7CisKKyAgLy8gQ29uc3RyYWludCBwYXJtIHdpbGwgYmUgbGVmdCBwb2ludGluZyBhdCB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YKKyAgLy8gdGhlIGNvbnN0cmFpbnQuICBJbiBwcmFjdGljZSwgaXQgd29uJ3QgYmUgY2hhbmdlZCB1bmxlc3MgdGhlCisgIC8vIGNvbnN0cmFpbnQgaXMgbG9uZ2VyIHRoYW4gb25lIGNoYXJhY3Rlci4KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBjb252ZXJ0Q29uc3RyYWludChjb25zdCBjaGFyIComQ29uc3RyYWludCkgY29uc3QgeworICAgIC8vICdwJyBkZWZhdWx0cyB0byAncicsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0YXJnZXRzLgorICAgIGlmICgqQ29uc3RyYWludCA9PSAncCcpCisgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoInIiKTsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoMSwgKkNvbnN0cmFpbnQpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgc3RyaW5nIG9mIHRhcmdldC1zcGVjaWZpYyBjbG9iYmVycywgaW4gTExWTSBmb3JtYXQuCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0Q2xvYmJlcnMoKSBjb25zdCA9IDA7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgTmFOIGVuY29kaW5nIGlzIElFRUUgNzU0LTIwMDguCisgIC8vLyBPbmx5IE1JUFMgYWxsb3dzIGEgZGlmZmVyZW50IGVuY29kaW5nLgorICB2aXJ0dWFsIGJvb2wgaXNOYW4yMDA4KCkgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSB0YXJnZXQgdHJpcGxlIG9mIHRoZSBwcmltYXJ5IHRhcmdldC4KKyAgY29uc3QgbGx2bTo6VHJpcGxlICZnZXRUcmlwbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIFRyaXBsZTsKKyAgfQorCisgIGNvbnN0IGxsdm06OkRhdGFMYXlvdXQgJmdldERhdGFMYXlvdXQoKSBjb25zdCB7CisgICAgYXNzZXJ0KERhdGFMYXlvdXQgJiYgIlVuaW5pdGlhbGl6ZWQgRGF0YUxheW91dCEiKTsKKyAgICByZXR1cm4gKkRhdGFMYXlvdXQ7CisgIH0KKworICBzdHJ1Y3QgR0NDUmVnQWxpYXMgeworICAgIGNvbnN0IGNoYXIgKiBjb25zdCBBbGlhc2VzWzVdOworICAgIGNvbnN0IGNoYXIgKiBjb25zdCBSZWdpc3RlcjsKKyAgfTsKKworICBzdHJ1Y3QgQWRkbFJlZ05hbWUgeworICAgIGNvbnN0IGNoYXIgKiBjb25zdCBOYW1lc1s1XTsKKyAgICBjb25zdCB1bnNpZ25lZCBSZWdOdW07CisgIH07CisKKyAgLy8vIFxicmllZiBEb2VzIHRoaXMgdGFyZ2V0IHN1cHBvcnQgInByb3RlY3RlZCIgdmlzaWJpbGl0eT8KKyAgLy8vCisgIC8vLyBBbnkgdGFyZ2V0IHdoaWNoIGR5bmFtaWMgbGlicmFyaWVzIHdpbGwgbmF0dXJhbGx5IHN1cHBvcnQKKyAgLy8vIHNvbWV0aGluZyBsaWtlICJkZWZhdWx0IiAobWVhbmluZyB0aGF0IHRoZSBzeW1ib2wgaXMgdmlzaWJsZQorICAvLy8gb3V0c2lkZSB0aGlzIHNoYXJlZCBvYmplY3QpIGFuZCAiaGlkZGVuIiAobWVhbmluZyB0aGF0IGl0IGlzbid0KQorICAvLy8gdmlzaWJpbGl0aWVzLCBidXQgInByb3RlY3RlZCIgaXMgcmVhbGx5IGFuIEVMRi1zcGVjaWZpYyBjb25jZXB0CisgIC8vLyB3aXRoIHdlaXJkIHNlbWFudGljcyBkZXNpZ25lZCBhcm91bmQgdGhlIGNvbnZlbmllbmNlIG9mIGR5bmFtaWMKKyAgLy8vIGxpbmtlciBpbXBsZW1lbnRhdGlvbnMuICBXaGljaCBpcyBub3QgdG8gc3VnZ2VzdCB0aGF0IHRoZXJlJ3MKKyAgLy8vIGNvbnNpc3RlbnQgdGFyZ2V0LWluZGVwZW5kZW50IHNlbWFudGljcyBmb3IgImRlZmF1bHQiIHZpc2liaWxpdHkKKyAgLy8vIGVpdGhlcjsgdGhlIGVudGlyZSB0aGluZyBpcyBwcmV0dHkgYmFkbHkgbWFuZ2xlZC4KKyAgdmlydHVhbCBib29sIGhhc1Byb3RlY3RlZFZpc2liaWxpdHkoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIFxicmllZiBBbiBvcHRpb25hbCBob29rIHRoYXQgdGFyZ2V0cyBjYW4gaW1wbGVtZW50IHRvIHBlcmZvcm0gc2VtYW50aWMKKyAgLy8vIGNoZWNraW5nIG9uIGF0dHJpYnV0ZSgoc2VjdGlvbigiZm9vIikpKSBzcGVjaWZpZXJzLgorICAvLy8KKyAgLy8vIEluIHRoaXMgY2FzZSwgImZvbyIgaXMgcGFzc2VkIGluIHRvIGJlIGNoZWNrZWQuICBJZiB0aGUgc2VjdGlvbgorICAvLy8gc3BlY2lmaWVyIGlzIGludmFsaWQsIHRoZSBiYWNrZW5kIHNob3VsZCByZXR1cm4gYSBub24tZW1wdHkgc3RyaW5nCisgIC8vLyB0aGF0IGluZGljYXRlcyB0aGUgcHJvYmxlbS4KKyAgLy8vCisgIC8vLyBUaGlzIGhvb2sgaXMgYSBzaW1wbGUgcXVhbGl0eSBvZiBpbXBsZW1lbnRhdGlvbiBmZWF0dXJlIHRvIGNhdGNoIGVycm9ycworICAvLy8gYW5kIGdpdmUgZ29vZCBkaWFnbm9zdGljcyBpbiBjYXNlcyB3aGVuIHRoZSBhc3NlbWJsZXIgb3IgY29kZSBnZW5lcmF0b3IKKyAgLy8vIHdvdWxkIG90aGVyd2lzZSByZWplY3QgdGhlIHNlY3Rpb24gc3BlY2lmaWVyLgorICAvLy8KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBpc1ZhbGlkU2VjdGlvblNwZWNpZmllcihTdHJpbmdSZWYgU1IpIGNvbnN0IHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCBmb3JjZWQgbGFuZ3VhZ2Ugb3B0aW9ucy4KKyAgLy8vCisgIC8vLyBBcHBseSBjaGFuZ2VzIHRvIHRoZSB0YXJnZXQgaW5mb3JtYXRpb24gd2l0aCByZXNwZWN0IHRvIGNlcnRhaW4KKyAgLy8vIGxhbmd1YWdlIG9wdGlvbnMgd2hpY2ggY2hhbmdlIHRoZSB0YXJnZXQgY29uZmlndXJhdGlvbiBhbmQgYWRqdXN0CisgIC8vLyB0aGUgbGFuZ3VhZ2UgYmFzZWQgb24gdGhlIHRhcmdldCBvcHRpb25zIHdoZXJlIGFwcGxpY2FibGUuCisgIHZpcnR1YWwgdm9pZCBhZGp1c3QoTGFuZ09wdGlvbnMgJk9wdHMpOworCisgIC8vLyBcYnJpZWYgQWRqdXN0IHRhcmdldCBvcHRpb25zIGJhc2VkIG9uIGNvZGVnZW4gb3B0aW9ucy4KKyAgdmlydHVhbCB2b2lkIGFkanVzdFRhcmdldE9wdGlvbnMoY29uc3QgQ29kZUdlbk9wdGlvbnMgJkNHT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0T3B0aW9ucyAmVGFyZ2V0T3B0cykgY29uc3Qge30KKworICAvLy8gXGJyaWVmIEluaXRpYWxpemUgdGhlIG1hcCB3aXRoIHRoZSBkZWZhdWx0IHNldCBvZiB0YXJnZXQgZmVhdHVyZXMgZm9yIHRoZQorICAvLy8gQ1BVIHRoaXMgc2hvdWxkIGluY2x1ZGUgYWxsIGxlZ2FsIGZlYXR1cmUgc3RyaW5ncyBvbiB0aGUgdGFyZ2V0LgorICAvLy8KKyAgLy8vIFxyZXR1cm4gRmFsc2Ugb24gZXJyb3IgKGludmFsaWQgZmVhdHVyZXMpLgorICB2aXJ0dWFsIGJvb2wgaW5pdEZlYXR1cmVNYXAobGx2bTo6U3RyaW5nTWFwPGJvb2w+ICZGZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lICZEaWFncywgU3RyaW5nUmVmIENQVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmRmVhdHVyZVZlYykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIEFCSSBjdXJyZW50bHkgaW4gdXNlLgorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRBQkkoKSBjb25zdCB7IHJldHVybiBTdHJpbmdSZWYoKTsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBDKysgQUJJIGN1cnJlbnRseSBpbiB1c2UuCisgIFRhcmdldENYWEFCSSBnZXRDWFhBQkkoKSBjb25zdCB7CisgICAgcmV0dXJuIFRoZUNYWEFCSTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGFyZ2V0IHRoZSBzcGVjaWZpZWQgQ1BVLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gIEZhbHNlIG9uIGVycm9yIChpbnZhbGlkIENQVSBuYW1lKS4KKyAgdmlydHVhbCBib29sIHNldENQVShjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBGaWxsIGEgU21hbGxWZWN0b3JJbXBsIHdpdGggdGhlIHZhbGlkIHZhbHVlcyB0byBzZXRDUFUuCisgIHZpcnR1YWwgdm9pZCBmaWxsVmFsaWRDUFVMaXN0KFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICZWYWx1ZXMpIGNvbnN0IHt9CisKKyAgLy8vIGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgVGFyZ2V0SW5mbyBzdXBwb3J0cyB0aGUgZ2l2ZW4gQ1BVIG5hbWUuCisgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkQ1BVTmFtZShTdHJpbmdSZWYgTmFtZSkgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFxicmllZiBVc2UgdGhlIHNwZWNpZmllZCBBQkkuCisgIC8vLworICAvLy8gXHJldHVybiBGYWxzZSBvbiBlcnJvciAoaW52YWxpZCBBQkkgbmFtZSkuCisgIHZpcnR1YWwgYm9vbCBzZXRBQkkoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gXGJyaWVmIFVzZSB0aGUgc3BlY2lmaWVkIHVuaXQgZm9yIEZQIG1hdGguCisgIC8vLworICAvLy8gXHJldHVybiBGYWxzZSBvbiBlcnJvciAoaW52YWxpZCB1bml0IG5hbWUpLgorICB2aXJ0dWFsIGJvb2wgc2V0RlBNYXRoKFN0cmluZ1JlZiBOYW1lKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBFbmFibGUgb3IgZGlzYWJsZSBhIHNwZWNpZmljIHRhcmdldCBmZWF0dXJlOworICAvLy8gdGhlIGZlYXR1cmUgbmFtZSBtdXN0IGJlIHZhbGlkLgorICB2aXJ0dWFsIHZvaWQgc2V0RmVhdHVyZUVuYWJsZWQobGx2bTo6U3RyaW5nTWFwPGJvb2w+ICZGZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbmFibGVkKSBjb25zdCB7CisgICAgRmVhdHVyZXNbTmFtZV0gPSBFbmFibGVkOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIFRhcmdldEluZm8gc3VwcG9ydHMgdGhlIGdpdmVuIGZlYXR1cmUuCisgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkRmVhdHVyZU5hbWUoU3RyaW5nUmVmIEZlYXR1cmUpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUGVyZm9ybSBpbml0aWFsaXphdGlvbiBiYXNlZCBvbiB0aGUgdXNlciBjb25maWd1cmVkCisgIC8vLyBzZXQgb2YgZmVhdHVyZXMgKGUuZy4sICtzc2U0KS4KKyAgLy8vCisgIC8vLyBUaGUgbGlzdCBpcyBndWFyYW50ZWVkIHRvIGhhdmUgYXQgbW9zdCBvbmUgZW50cnkgcGVyIGZlYXR1cmUuCisgIC8vLworICAvLy8gVGhlIHRhcmdldCBtYXkgbW9kaWZ5IHRoZSBmZWF0dXJlcyBsaXN0LCB0byBjaGFuZ2Ugd2hpY2ggb3B0aW9ucyBhcmUKKyAgLy8vIHBhc3NlZCBvbndhcmRzIHRvIHRoZSBiYWNrZW5kLgorICAvLy8gRklYTUU6IFRoaXMgcGFydCBzaG91bGQgYmUgZml4ZWQgc28gdGhhdCB3ZSBjYW4gY2hhbmdlIGhhbmRsZVRhcmdldEZlYXR1cmVzCisgIC8vLyB0byBtZXJlbHkgYSBUYXJnZXRJbmZvIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuCisgIC8vLworICAvLy8gXHJldHVybiAgRmFsc2Ugb24gZXJyb3IuCisgIHZpcnR1YWwgYm9vbCBoYW5kbGVUYXJnZXRGZWF0dXJlcyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJkZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiB0YXJnZXQgaGFzIHRoZSBnaXZlbiBmZWF0dXJlLgorICB2aXJ0dWFsIGJvb2wgaGFzRmVhdHVyZShTdHJpbmdSZWYgRmVhdHVyZSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSWRlbnRpZnkgd2hldGhlciB0aGlzIHRhcmV0IHN1cHBvcnRzIG11bHRpdmVyc2lvbmluZyBvZiBmdW5jdGlvbnMsCisgIC8vLyB3aGljaCByZXF1aXJlcyBzdXBwb3J0IGZvciBjcHVfc3VwcG9ydHMgYW5kIGNwdV9pcyBmdW5jdGlvbmFsaXR5LgorICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNNdWx0aVZlcnNpb25pbmcoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vIFxicmllZiBWYWxpZGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIF9fYnVpbHRpbl9jcHVfc3VwcG9ydHMoY29uc3QgY2hhciopCisgIC8vIGFyZ3VtZW50LgorICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVDcHVTdXBwb3J0cyhTdHJpbmdSZWYgTmFtZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLyBcYnJpZWYgUmV0dXJuIHRoZSB0YXJnZXQtc3BlY2lmaWMgcHJpb3JpdHkgZm9yIGZlYXR1cmVzL2NwdXMvdmVuZG9ycyBzbworICAvLyB0aGF0IHRoZXkgY2FuIGJlIHByb3Blcmx5IHNvcnRlZCBmb3IgY2hlY2tpbmcuCisgIHZpcnR1YWwgdW5zaWduZWQgbXVsdGlWZXJzaW9uU29ydFByaW9yaXR5KFN0cmluZ1JlZiBOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBcYnJpZWYgVmFsaWRhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBfX2J1aWx0aW5fY3B1X2lzKGNvbnN0IGNoYXIqKQorICAvLyBhcmd1bWVudC4KKyAgdmlydHVhbCBib29sIHZhbGlkYXRlQ3B1SXMoU3RyaW5nUmVmIE5hbWUpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8gXGJyaWVmIFJldHVybnMgbWF4aW1hbCBudW1iZXIgb2YgYXJncyBwYXNzZWQgaW4gcmVnaXN0ZXJzLgorICB1bnNpZ25lZCBnZXRSZWdQYXJtTWF4KCkgY29uc3QgeworICAgIGFzc2VydChSZWdQYXJtTWF4IDwgNyAmJiAiUmVnUGFybU1heCB2YWx1ZSBpcyBsYXJnZXIgdGhhbiBBU1QgY2FuIGhhbmRsZSIpOworICAgIHJldHVybiBSZWdQYXJtTWF4OworICB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoZSB0YXJnZXQgc3VwcG9ydHMgdGhyZWFkLWxvY2FsIHN0b3JhZ2UuCisgIGJvb2wgaXNUTFNTdXBwb3J0ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIFRMU1N1cHBvcnRlZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBtYXhpbXVtIGFsaWdubWVudCAoaW4gYml0cykgb2YgYSBUTFMgdmFyaWFibGUKKyAgLy8vCisgIC8vLyBHZXRzIHRoZSBtYXhpbXVtIGFsaWdubWVudCAoaW4gYml0cykgb2YgYSBUTFMgdmFyaWFibGUgb24gdGhpcyB0YXJnZXQuCisgIC8vLyBSZXR1cm5zIHplcm8gaWYgdGhlcmUgaXMgbm8gc3VjaCBjb25zdHJhaW50LgorICB1bnNpZ25lZCBzaG9ydCBnZXRNYXhUTFNBbGlnbigpIGNvbnN0IHsKKyAgICByZXR1cm4gTWF4VExTQWxpZ247CisgIH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGFyZ2V0IHN1cHBvcnRzIHZhcmlhYmxlLWxlbmd0aCBhcnJheXMuCisgIGJvb2wgaXNWTEFTdXBwb3J0ZWQoKSBjb25zdCB7IHJldHVybiBWTEFTdXBwb3J0ZWQ7IH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhlIHRhcmdldCBzdXBwb3J0cyBTRUggX190cnkuCisgIGJvb2wgaXNTRUhUcnlTdXBwb3J0ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRyaXBsZSgpLmlzT1NXaW5kb3dzKCkgJiYKKyAgICAgICAgICAgKGdldFRyaXBsZSgpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4NiB8fAorICAgICAgICAgICAgZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2XzY0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYge3x9IGFyZSBub3JtYWwgY2hhcmFjdGVycyBpbiB0aGUgYXNtIHN0cmluZy4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIHJldHVybnMgZmFsc2UgKHRoZSBkZWZhdWx0KSwgdGhlbiB7YWJjfHh5en0gaXMgc3ludGF4CisgIC8vLyB0aGF0IHNheXMgdGhhdCB3aGVuIGNvbXBpbGluZyBmb3IgYXNtIHZhcmlhbnQgIzAsICJhYmMiIHNob3VsZCBiZQorICAvLy8gZ2VuZXJhdGVkLCBidXQgd2hlbiBjb21waWxpbmcgZm9yIGFzbSB2YXJpYW50ICMxLCAieHl6IiBzaG91bGQgYmUKKyAgLy8vIGdlbmVyYXRlZC4KKyAgYm9vbCBoYXNOb0FzbVZhcmlhbnRzKCkgY29uc3QgeworICAgIHJldHVybiBOb0FzbVZhcmlhbnRzOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHJlZ2lzdGVyIG51bWJlciB0aGF0IF9fYnVpbHRpbl9laF9yZXR1cm5fcmVnbm8gd291bGQKKyAgLy8vIHJldHVybiB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQuCisgIC8vLyBUaGlzIGNvcnJlc3BvbmRzIHdpdGggVGFyZ2V0TG93ZXJpbmcncyBnZXRFeGNlcHRpb25Qb2ludGVyUmVnaXN0ZXIKKyAgLy8vIGFuZCBnZXRFeGNlcHRpb25TZWxlY3RvclJlZ2lzdGVyIGluIHRoZSBiYWNrZW5kLgorICB2aXJ0dWFsIGludCBnZXRFSERhdGFSZWdpc3Rlck51bWJlcih1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzZWN0aW9uIHRvIHVzZSBmb3IgQysrIHN0YXRpYyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0U3RhdGljSW5pdFNlY3Rpb25TcGVjaWZpZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBjb25zdCBMYW5nQVNNYXAgJmdldEFkZHJlc3NTcGFjZU1hcCgpIGNvbnN0IHsgcmV0dXJuICpBZGRyU3BhY2VNYXA7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhbiBBU1QgYWRkcmVzcyBzcGFjZSB3aGljaCBjYW4gYmUgdXNlZCBvcHBvcnR1bmlzdGljYWxseQorICAvLy8gZm9yIGNvbnN0YW50IGdsb2JhbCBtZW1vcnkuIEl0IG11c3QgYmUgcG9zc2libGUgdG8gY29udmVydCBwb2ludGVycyBpbnRvCisgIC8vLyB0aGlzIGFkZHJlc3Mgc3BhY2UgdG8gTGFuZ0FTOjpEZWZhdWx0LiBJZiBubyBzdWNoIGFkZHJlc3Mgc3BhY2UgZXhpc3RzLAorICAvLy8gdGhpcyBtYXkgcmV0dXJuIE5vbmUsIGFuZCBzdWNoIG9wdGltaXphdGlvbnMgd2lsbCBiZSBkaXNhYmxlZC4KKyAgdmlydHVhbCBsbHZtOjpPcHRpb25hbDxMYW5nQVM+IGdldENvbnN0YW50QWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBMYW5nQVM6OkRlZmF1bHQ7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBwbGF0Zm9ybSBhcyBpdCBpcyB1c2VkIGluIHRoZQorICAvLy8gYXZhaWxhYmlsaXR5IGF0dHJpYnV0ZS4KKyAgU3RyaW5nUmVmIGdldFBsYXRmb3JtTmFtZSgpIGNvbnN0IHsgcmV0dXJuIFBsYXRmb3JtTmFtZTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG1pbmltdW0gZGVzaXJlZCB2ZXJzaW9uIG9mIHRoZSBwbGF0Zm9ybSwgdG8KKyAgLy8vIHdoaWNoIHRoZSBwcm9ncmFtIHNob3VsZCBiZSBjb21waWxlZC4KKyAgVmVyc2lvblR1cGxlIGdldFBsYXRmb3JtTWluVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIFBsYXRmb3JtTWluVmVyc2lvbjsgfQorCisgIGJvb2wgaXNCaWdFbmRpYW4oKSBjb25zdCB7IHJldHVybiBCaWdFbmRpYW47IH0KKyAgYm9vbCBpc0xpdHRsZUVuZGlhbigpIGNvbnN0IHsgcmV0dXJuICFCaWdFbmRpYW47IH0KKworICBlbnVtIENhbGxpbmdDb252TWV0aG9kVHlwZSB7CisgICAgQ0NNVF9Vbmtub3duLAorICAgIENDTVRfTWVtYmVyLAorICAgIENDTVRfTm9uTWVtYmVyCisgIH07CisKKyAgLy8vIFxicmllZiBHZXRzIHRoZSBkZWZhdWx0IGNhbGxpbmcgY29udmVudGlvbiBmb3IgdGhlIGdpdmVuIHRhcmdldCBhbmQKKyAgLy8vIGRlY2xhcmF0aW9uIGNvbnRleHQuCisgIHZpcnR1YWwgQ2FsbGluZ0NvbnYgZ2V0RGVmYXVsdENhbGxpbmdDb252KENhbGxpbmdDb252TWV0aG9kVHlwZSBNVCkgY29uc3QgeworICAgIC8vIE5vdCBhbGwgdGFyZ2V0cyB3aWxsIHNwZWNpZnkgYW4gZXhwbGljaXQgY2FsbGluZyBjb252ZW50aW9uIHRoYXQgd2UgY2FuCisgICAgLy8gZXhwcmVzcy4gIFRoaXMgd2lsbCBhbHdheXMgZG8gdGhlIHJpZ2h0IHRoaW5nLCBldmVuIHRob3VnaCBpdCdzIG5vdAorICAgIC8vIGFuIGV4cGxpY2l0IGNhbGxpbmcgY29udmVudGlvbi4KKyAgICByZXR1cm4gQ0NfQzsKKyAgfQorCisgIGVudW0gQ2FsbGluZ0NvbnZDaGVja1Jlc3VsdCB7CisgICAgQ0NDUl9PSywKKyAgICBDQ0NSX1dhcm5pbmcsCisgICAgQ0NDUl9JZ25vcmUsCisgIH07CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBnaXZlbiBjYWxsaW5nIGNvbnZlbnRpb24gaXMgdmFsaWQgZm9yIHRoZQorICAvLy8gdGFyZ2V0LiBBIGNhbGxpbmcgY29udmVudGlvbiBjYW4gZWl0aGVyIGJlIGFjY2VwdGVkLCBwcm9kdWNlIGEgd2FybmluZworICAvLy8gYW5kIGJlIHN1YnN0aXR1dGVkIHdpdGggdGhlIGRlZmF1bHQgY2FsbGluZyBjb252ZW50aW9uLCBvciAoc29tZWRheSkKKyAgLy8vIHByb2R1Y2UgYW4gZXJyb3IgKHN1Y2ggYXMgdXNpbmcgdGhpc2NhbGwgb24gYSBub24taW5zdGFuY2UgZnVuY3Rpb24pLgorICB2aXJ0dWFsIENhbGxpbmdDb252Q2hlY2tSZXN1bHQgY2hlY2tDYWxsaW5nQ29udmVudGlvbihDYWxsaW5nQ29udiBDQykgY29uc3QgeworICAgIHN3aXRjaCAoQ0MpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBDQ0NSX1dhcm5pbmc7CisgICAgICBjYXNlIENDX0M6CisgICAgICAgIHJldHVybiBDQ0NSX09LOworICAgIH0KKyAgfQorCisgIGVudW0gQ2FsbGluZ0NvbnZLaW5kIHsKKyAgICBDQ0tfRGVmYXVsdCwKKyAgICBDQ0tfQ2xhbmdBQkk0T3JQUzQsCisgICAgQ0NLX01pY3Jvc29mdFg4Nl82NAorICB9OworCisgIHZpcnR1YWwgQ2FsbGluZ0NvbnZLaW5kIGdldENhbGxpbmdDb252S2luZChib29sIENsYW5nQUJJQ29tcGF0NCkgY29uc3Q7CisKKyAgLy8vIENvbnRyb2xzIGlmIF9fYnVpbHRpbl9sb25nam1wIC8gX19idWlsdGluX3NldGptcCBjYW4gYmUgbG93ZXJlZCB0bworICAvLy8gbGx2bS5laC5zamxqLmxvbmdqbXAgLyBsbHZtLmVoLnNqbGouc2V0am1wLgorICB2aXJ0dWFsIGJvb2wgaGFzU2pMakxvd2VyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBDaGVjayBpZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIENGUHJvdGVjdGlvbiBicmFuY2guCisgIHZpcnR1YWwgYm9vbAorICBjaGVja0NGUHJvdGVjdGlvbkJyYW5jaFN1cHBvcnRlZChEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gQ2hlY2sgaWYgdGhlIHRhcmdldCBzdXBwb3J0cyBDRlByb3RlY3Rpb24gYnJhbmNoLgorICB2aXJ0dWFsIGJvb2wKKyAgY2hlY2tDRlByb3RlY3Rpb25SZXR1cm5TdXBwb3J0ZWQoRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRhcmdldCBhbGxvd3MgdG8gb3ZlcmFsaWduIEFCSS1zcGVjaWZpZWQgcHJlZmVycmVkIGFsaWdubWVudAorICB2aXJ0dWFsIGJvb2wgYWxsb3dzTGFyZ2VyUHJlZmVyZWRUeXBlQWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBcYnJpZWYgU2V0IHN1cHBvcnRlZCBPcGVuQ0wgZXh0ZW5zaW9ucyBhbmQgb3B0aW9uYWwgY29yZSBmZWF0dXJlcy4KKyAgdmlydHVhbCB2b2lkIHNldFN1cHBvcnRlZE9wZW5DTE9wdHMoKSB7fQorCisgIC8vLyBcYnJpZWYgU2V0IHN1cHBvcnRlZCBPcGVuQ0wgZXh0ZW5zaW9ucyBhcyB3cml0dGVuIG9uIGNvbW1hbmQgbGluZQorICB2aXJ0dWFsIHZvaWQgc2V0T3BlbkNMRXh0ZW5zaW9uT3B0cygpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkV4dCA6IGdldFRhcmdldE9wdHMoKS5PcGVuQ0xFeHRlbnNpb25zQXNXcml0dGVuKSB7CisgICAgICBnZXRUYXJnZXRPcHRzKCkuU3VwcG9ydGVkT3BlbkNMT3B0aW9ucy5zdXBwb3J0KEV4dCk7CisgICAgfQorICB9CisKKyAgLy8vIFxicmllZiBHZXQgc3VwcG9ydGVkIE9wZW5DTCBleHRlbnNpb25zIGFuZCBvcHRpb25hbCBjb3JlIGZlYXR1cmVzLgorICBPcGVuQ0xPcHRpb25zICZnZXRTdXBwb3J0ZWRPcGVuQ0xPcHRzKCkgeworICAgIHJldHVybiBnZXRUYXJnZXRPcHRzKCkuU3VwcG9ydGVkT3BlbkNMT3B0aW9uczsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGNvbnN0IHN1cHBvcnRlZCBPcGVuQ0wgZXh0ZW5zaW9ucyBhbmQgb3B0aW9uYWwgY29yZSBmZWF0dXJlcy4KKyAgY29uc3QgT3BlbkNMT3B0aW9ucyAmZ2V0U3VwcG9ydGVkT3BlbkNMT3B0cygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRUYXJnZXRPcHRzKCkuU3VwcG9ydGVkT3BlbkNMT3B0aW9uczsKKyAgfQorCisgIGVudW0gT3BlbkNMVHlwZUtpbmQgeworICAgIE9DTFRLX0RlZmF1bHQsCisgICAgT0NMVEtfQ2xrRXZlbnQsCisgICAgT0NMVEtfRXZlbnQsCisgICAgT0NMVEtfSW1hZ2UsCisgICAgT0NMVEtfUGlwZSwKKyAgICBPQ0xUS19RdWV1ZSwKKyAgICBPQ0xUS19SZXNlcnZlSUQsCisgICAgT0NMVEtfU2FtcGxlciwKKyAgfTsKKworICAvLy8gXGJyaWVmIEdldCBhZGRyZXNzIHNwYWNlIGZvciBPcGVuQ0wgdHlwZS4KKyAgdmlydHVhbCBMYW5nQVMgZ2V0T3BlbkNMVHlwZUFkZHJTcGFjZShPcGVuQ0xUeXBlS2luZCBUSykgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIFRhcmdldCBzcGVjaWZpYyB2dGJsIHB0ciBhZGRyZXNzIHNwYWNlLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldFZ0YmxQdHJBZGRyZXNzU3BhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gXHJldHVybnMgSWYgYSB0YXJnZXQgcmVxdWlyZXMgYW4gYWRkcmVzcyB3aXRoaW4gYSB0YXJnZXQgc3BlY2lmaWMgYWRkcmVzcworICAvLy8gc3BhY2UgXHAgQWRkcmVzc1NwYWNlIHRvIGJlIGNvbnZlcnRlZCBpbiBvcmRlciB0byBiZSB1c2VkLCB0aGVuIHJldHVybiB0aGUKKyAgLy8vIGNvcnJlc3BvbmRpbmcgdGFyZ2V0IHNwZWNpZmljIERXQVJGIGFkZHJlc3Mgc3BhY2UuCisgIC8vLworICAvLy8gXHJldHVybnMgT3RoZXJ3aXNlIHJldHVybiBOb25lIGFuZCBubyBjb252ZXJzaW9uIHdpbGwgYmUgZW1pdHRlZCBpbiB0aGUKKyAgLy8vIERXQVJGLgorICB2aXJ0dWFsIE9wdGlvbmFsPHVuc2lnbmVkPiBnZXREV0FSRkFkZHJlc3NTcGFjZSh1bnNpZ25lZCBBZGRyZXNzU3BhY2UpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9uZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2hlY2sgdGhlIHRhcmdldCBpcyB2YWxpZCBhZnRlciBpdCBpcyBmdWxseSBpbml0aWFsaXplZC4KKyAgdmlydHVhbCBib29sIHZhbGlkYXRlVGFyZ2V0KERpYWdub3N0aWNzRW5naW5lICZEaWFncykgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCB1aW50NjRfdCBnZXRQb2ludGVyV2lkdGhWKHVuc2lnbmVkIEFkZHJTcGFjZSkgY29uc3QgeworICAgIHJldHVybiBQb2ludGVyV2lkdGg7CisgIH0KKyAgdmlydHVhbCB1aW50NjRfdCBnZXRQb2ludGVyQWxpZ25WKHVuc2lnbmVkIEFkZHJTcGFjZSkgY29uc3QgeworICAgIHJldHVybiBQb2ludGVyQWxpZ247CisgIH0KKyAgdmlydHVhbCBlbnVtIEludFR5cGUgZ2V0UHRyRGlmZlR5cGVWKHVuc2lnbmVkIEFkZHJTcGFjZSkgY29uc3QgeworICAgIHJldHVybiBQdHJEaWZmVHlwZTsKKyAgfQorICB2aXJ0dWFsIEFycmF5UmVmPGNvbnN0IGNoYXIgKj4gZ2V0R0NDUmVnTmFtZXMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgQXJyYXlSZWY8R0NDUmVnQWxpYXM+IGdldEdDQ1JlZ0FsaWFzZXMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgQXJyYXlSZWY8QWRkbFJlZ05hbWU+IGdldEdDQ0FkZGxSZWdOYW1lcygpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9uZTsKKyAgfQorfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1RhcmdldE9wdGlvbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1RhcmdldE9wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDU3MzkzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvVGFyZ2V0T3B0aW9ucy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8vPT09LS0tIFRhcmdldE9wdGlvbnMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHRoZSBjbGFuZzo6VGFyZ2V0T3B0aW9ucyBjbGFzcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX1RBUkdFVE9QVElPTlNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX1RBUkdFVE9QVElPTlNfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9PcGVuQ0xPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCisvLy8gXGJyaWVmIE9wdGlvbnMgZm9yIGNvbnRyb2xsaW5nIHRoZSB0YXJnZXQuCitjbGFzcyBUYXJnZXRPcHRpb25zIHsKK3B1YmxpYzoKKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgdHJpcGxlIHRvIGNvbXBpbGUgZm9yLgorICBzdGQ6OnN0cmluZyBUcmlwbGU7CisKKyAgLy8vIFdoZW4gY29tcGlsaW5nIGZvciB0aGUgZGV2aWNlIHNpZGUsIGNvbnRhaW5zIHRoZSB0cmlwbGUgdXNlZCB0byBjb21waWxlCisgIC8vLyBmb3IgdGhlIGhvc3QuCisgIHN0ZDo6c3RyaW5nIEhvc3RUcmlwbGU7CisKKyAgLy8vIElmIGdpdmVuLCB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IENQVSB0byBnZW5lcmF0ZSBjb2RlIGZvci4KKyAgc3RkOjpzdHJpbmcgQ1BVOworCisgIC8vLyBJZiBnaXZlbiwgdGhlIHVuaXQgdG8gdXNlIGZvciBmbG9hdGluZyBwb2ludCBtYXRoLgorICBzdGQ6OnN0cmluZyBGUE1hdGg7CisKKyAgLy8vIElmIGdpdmVuLCB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IEFCSSB0byB1c2UuCisgIHN0ZDo6c3RyaW5nIEFCSTsKKworICAvLy8gVGhlIEVBQkkgdmVyc2lvbiB0byB1c2UKKyAgbGx2bTo6RUFCSSBFQUJJVmVyc2lvbjsKKworICAvLy8gSWYgZ2l2ZW4sIHRoZSB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgbGlua2VyIGluIHVzZS4KKyAgc3RkOjpzdHJpbmcgTGlua2VyVmVyc2lvbjsKKworICAvLy8gXGJyaWVmIFRoZSBsaXN0IG9mIHRhcmdldCBzcGVjaWZpYyBmZWF0dXJlcyB0byBlbmFibGUgb3IgZGlzYWJsZSwgYXMgd3JpdHRlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRmVhdHVyZXNBc1dyaXR0ZW47CisKKyAgLy8vIFRoZSBsaXN0IG9mIHRhcmdldCBzcGVjaWZpYyBmZWF0dXJlcyB0byBlbmFibGUgb3IgZGlzYWJsZSAtLSB0aGlzIHNob3VsZAorICAvLy8gYmUgYSBsaXN0IG9mIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCBieSAnKycgb3IgJy0nLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRmVhdHVyZXM7CisKKyAgLy8vIFN1cHBvcnRlZCBPcGVuQ0wgZXh0ZW5zaW9ucyBhbmQgb3B0aW9uYWwgY29yZSBmZWF0dXJlcy4KKyAgT3BlbkNMT3B0aW9ucyBTdXBwb3J0ZWRPcGVuQ0xPcHRpb25zOworCisgIC8vLyBcYnJpZWYgVGhlIGxpc3Qgb2YgT3BlbkNMIGV4dGVuc2lvbnMgdG8gZW5hYmxlIG9yIGRpc2FibGUsIGFzIHdyaXR0ZW4gb24KKyAgLy8vIHRoZSBjb21tYW5kIGxpbmUuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBPcGVuQ0xFeHRlbnNpb25zQXNXcml0dGVuOworCisgIC8vLyBcYnJpZWYgSWYgZ2l2ZW4sIGVuYWJsZXMgc3VwcG9ydCBmb3IgX19pbnQxMjhfdCBhbmQgX191aW50MTI4X3QgdHlwZXMuCisgIGJvb2wgRm9yY2VFbmFibGVJbnQxMjggPSBmYWxzZTsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9UZW1wbGF0ZUtpbmRzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9UZW1wbGF0ZUtpbmRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5OWFkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1RlbXBsYXRlS2luZHMuaApAQCAtMCwwICsxLDUyIEBACisvLz09PS0tLSBUZW1wbGF0ZUtpbmRzLmggLSBFbnVtIHZhbHVlcyBmb3IgQysrIFRlbXBsYXRlIEtpbmRzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgY2xhbmc6OlRlbXBsYXRlTmFtZUtpbmQgZW51bS4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19URU1QTEFURUtJTkRTX0gKKyNkZWZpbmUgTExWTV9DTEFOR19CQVNJQ19URU1QTEFURUtJTkRTX0gKKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBTcGVjaWZpZXMgdGhlIGtpbmQgb2YgdGVtcGxhdGUgbmFtZSB0aGF0IGFuIGlkZW50aWZpZXIgcmVmZXJzIHRvLgorLy8vIEJlIGNhcmVmdWwgd2hlbiBjaGFuZ2luZyB0aGlzOiB0aGlzIGVudW1lcmF0aW9uIGlzIHVzZWQgaW4gZGlhZ25vc3RpY3MuCitlbnVtIFRlbXBsYXRlTmFtZUtpbmQgeworICAvLy8gVGhlIG5hbWUgZG9lcyBub3QgcmVmZXIgdG8gYSB0ZW1wbGF0ZS4KKyAgVE5LX05vbl90ZW1wbGF0ZSA9IDAsCisgIC8vLyBUaGUgbmFtZSByZWZlcnMgdG8gYSBmdW5jdGlvbiB0ZW1wbGF0ZSBvciBhIHNldCBvZiBvdmVybG9hZGVkCisgIC8vLyBmdW5jdGlvbnMgdGhhdCBpbmNsdWRlcyBhdCBsZWFzdCBvbmUgZnVuY3Rpb24gdGVtcGxhdGUuCisgIFROS19GdW5jdGlvbl90ZW1wbGF0ZSwKKyAgLy8vIFRoZSBuYW1lIHJlZmVycyB0byBhIHRlbXBsYXRlIHdob3NlIHNwZWNpYWxpemF0aW9uIHByb2R1Y2VzIGEKKyAgLy8vIHR5cGUuIFRoZSB0ZW1wbGF0ZSBpdHNlbGYgY291bGQgYmUgYSBjbGFzcyB0ZW1wbGF0ZSwgdGVtcGxhdGUKKyAgLy8vIHRlbXBsYXRlIHBhcmFtZXRlciwgb3IgdGVtcGxhdGUgYWxpYXMuCisgIFROS19UeXBlX3RlbXBsYXRlLAorICAvLy8gVGhlIG5hbWUgcmVmZXJzIHRvIGEgdmFyaWFibGUgdGVtcGxhdGUgd2hvc2Ugc3BlY2lhbGl6YXRpb24gcHJvZHVjZXMgYQorICAvLy8gdmFyaWFibGUuCisgIFROS19WYXJfdGVtcGxhdGUsCisgIC8vLyBUaGUgbmFtZSByZWZlcnMgdG8gYSBkZXBlbmRlbnQgdGVtcGxhdGUgbmFtZTogCisgIC8vLyBcY29kZQorICAvLy8gdGVtcGxhdGU8dHlwZW5hbWUgTWV0YUZ1biwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiBzdHJ1Y3QgYXBwbHkyIHsKKyAgLy8vICAgdHlwZWRlZiB0eXBlbmFtZSBNZXRhRnVuOjp0ZW1wbGF0ZSBhcHBseTxUMSwgVDI+Ojp0eXBlIHR5cGU7CisgIC8vLyB9OworICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBIZXJlLCAiYXBwbHkiIGlzIGEgZGVwZW5kZW50IHRlbXBsYXRlIG5hbWUgd2l0aGluIHRoZSB0eXBlbmFtZQorICAvLy8gc3BlY2lmaWVyIGluIHRoZSB0eXBlZGVmLiAiYXBwbHkiIGlzIGEgbmVzdGVkIHRlbXBsYXRlLCBhbmQgCisgIC8vLyB3aGV0aGVyIHRoZSB0ZW1wbGF0ZSBuYW1lIGlzIGFzc3VtZWQgdG8gcmVmZXIgdG8gYSB0eXBlIHRlbXBsYXRlIG9yIGEKKyAgLy8vIGZ1bmN0aW9uIHRlbXBsYXRlIGRlcGVuZHMgb24gdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlCisgIC8vLyBuYW1lIG9jY3Vycy4KKyAgVE5LX0RlcGVuZGVudF90ZW1wbGF0ZV9uYW1lCit9OworCit9CisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9Ub2tlbktpbmRzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1Rva2VuS2luZHMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOGUwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9Ub2tlbktpbmRzLmRlZgpAQCAtMCwwICsxLDgyOCBAQAorLy89PT0tLS0gVG9rZW5LaW5kcy5kZWYgLSBDIEZhbWlseSBUb2tlbiBLaW5kIERhdGFiYXNlIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgVG9rZW5LaW5kIGRhdGFiYXNlLiAgVGhpcyBpbmNsdWRlcyBub3JtYWwgdG9rZW5zIGxpa2UKKy8vIHRvazo6YW1wYW1wIChjb3JyZXNwb25kaW5nIHRvIHRoZSAmJiB0b2tlbikgYXMgd2VsbCBhcyBrZXl3b3JkcyBmb3IgdmFyaW91cworLy8gbGFuZ3VhZ2VzLiAgVXNlcnMgb2YgdGhpcyBmaWxlIG11c3Qgb3B0aW9uYWxseSAjZGVmaW5lIHRoZSBUT0ssIEtFWVdPUkQsCisvLyBDWFgxMV9LRVlXT1JELCBDT05DRVBUU19LRVlXT1JELCBBTElBUywgb3IgUFBLRVlXT1JEIG1hY3JvcyB0byBtYWtlIHVzZSBvZgorLy8gdGhpcyBmaWxlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgVE9LCisjZGVmaW5lIFRPSyhYKQorI2VuZGlmCisjaWZuZGVmIFBVTkNUVUFUT1IKKyNkZWZpbmUgUFVOQ1RVQVRPUihYLFkpIFRPSyhYKQorI2VuZGlmCisjaWZuZGVmIEtFWVdPUkQKKyNkZWZpbmUgS0VZV09SRChYLFkpIFRPSyhrd18gIyMgWCkKKyNlbmRpZgorI2lmbmRlZiBDWFgxMV9LRVlXT1JECisjZGVmaW5lIENYWDExX0tFWVdPUkQoWCxZKSBLRVlXT1JEKFgsS0VZQ1hYMTF8KFkpKQorI2VuZGlmCisjaWZuZGVmIENYWDJBX0tFWVdPUkQKKyNkZWZpbmUgQ1hYMkFfS0VZV09SRChYLFkpIEtFWVdPUkQoWCxLRVlDWFgyQXwoWSkpCisjZW5kaWYKKyNpZm5kZWYgQ09OQ0VQVFNfS0VZV09SRAorI2RlZmluZSBDT05DRVBUU19LRVlXT1JEKFgpIENYWDJBX0tFWVdPUkQoWCxLRVlDT05DRVBUUykKKyNlbmRpZgorI2lmbmRlZiBNT0RVTEVTX0tFWVdPUkQKKyNkZWZpbmUgTU9EVUxFU19LRVlXT1JEKFgpIEtFWVdPUkQoWCxLRVlNT0RVTEVTKQorI2VuZGlmCisjaWZuZGVmIFRZUEVfVFJBSVQKKyNkZWZpbmUgVFlQRV9UUkFJVChOLEksSykgS0VZV09SRChJLEspCisjZW5kaWYKKyNpZm5kZWYgVFlQRV9UUkFJVF8xCisjZGVmaW5lIFRZUEVfVFJBSVRfMShJLEUsSykgVFlQRV9UUkFJVCgxLEksSykKKyNlbmRpZgorI2lmbmRlZiBUWVBFX1RSQUlUXzIKKyNkZWZpbmUgVFlQRV9UUkFJVF8yKEksRSxLKSBUWVBFX1RSQUlUKDIsSSxLKQorI2VuZGlmCisjaWZuZGVmIFRZUEVfVFJBSVRfTgorI2RlZmluZSBUWVBFX1RSQUlUX04oSSxFLEspIFRZUEVfVFJBSVQoMCxJLEspCisjZW5kaWYKKyNpZm5kZWYgQUxJQVMKKyNkZWZpbmUgQUxJQVMoWCxZLFopCisjZW5kaWYKKyNpZm5kZWYgUFBLRVlXT1JECisjZGVmaW5lIFBQS0VZV09SRChYKQorI2VuZGlmCisjaWZuZGVmIENYWF9LRVlXT1JEX09QRVJBVE9SCisjZGVmaW5lIENYWF9LRVlXT1JEX09QRVJBVE9SKFgsWSkKKyNlbmRpZgorI2lmbmRlZiBPQkpDMV9BVF9LRVlXT1JECisjZGVmaW5lIE9CSkMxX0FUX0tFWVdPUkQoWCkKKyNlbmRpZgorI2lmbmRlZiBPQkpDMl9BVF9LRVlXT1JECisjZGVmaW5lIE9CSkMyX0FUX0tFWVdPUkQoWCkKKyNlbmRpZgorI2lmbmRlZiBURVNUSU5HX0tFWVdPUkQKKyNkZWZpbmUgVEVTVElOR19LRVlXT1JEKFgsIEwpIEtFWVdPUkQoWCwgTCkKKyNlbmRpZgorI2lmbmRlZiBBTk5PVEFUSU9OCisjZGVmaW5lIEFOTk9UQVRJT04oWCkgVE9LKGFubm90XyAjIyBYKQorI2VuZGlmCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQcmVwcm9jZXNzb3Iga2V5d29yZHMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBUaGVzZSBoYXZlIG1lYW5pbmcgYWZ0ZXIgYSAnIycgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4gVGhlc2UgZGVmaW5lIGVudW1zIGluCisvLyB0aGUgdG9rOjpwcF8qIG5hbWVzcGFjZS4gIE5vdGUgdGhhdCBJZGVudGlmaWVySW5mbzo6Z2V0UFBLZXl3b3JkSUQgbXVzdCBiZQorLy8gbWFudWFsbHkgdXBkYXRlZCBpZiBzb21ldGhpbmcgaXMgYWRkZWQgaGVyZS4KK1BQS0VZV09SRChub3Rfa2V5d29yZCkKKworLy8gQzk5IDYuMTAuMSAtIENvbmRpdGlvbmFsIEluY2x1c2lvbi4KK1BQS0VZV09SRChpZikKK1BQS0VZV09SRChpZmRlZikKK1BQS0VZV09SRChpZm5kZWYpCitQUEtFWVdPUkQoZWxpZikKK1BQS0VZV09SRChlbHNlKQorUFBLRVlXT1JEKGVuZGlmKQorUFBLRVlXT1JEKGRlZmluZWQpCisKKy8vIEM5OSA2LjEwLjIgLSBTb3VyY2UgRmlsZSBJbmNsdXNpb24uCitQUEtFWVdPUkQoaW5jbHVkZSkKK1BQS0VZV09SRChfX2luY2x1ZGVfbWFjcm9zKQorCisvLyBDOTkgNi4xMC4zIC0gTWFjcm8gUmVwbGFjZW1lbnQuCitQUEtFWVdPUkQoZGVmaW5lKQorUFBLRVlXT1JEKHVuZGVmKQorCisvLyBDOTkgNi4xMC40IC0gTGluZSBDb250cm9sLgorUFBLRVlXT1JEKGxpbmUpCisKKy8vIEM5OSA2LjEwLjUgLSBFcnJvciBEaXJlY3RpdmUuCitQUEtFWVdPUkQoZXJyb3IpCisKKy8vIEM5OSA2LjEwLjYgLSBQcmFnbWEgRGlyZWN0aXZlLgorUFBLRVlXT1JEKHByYWdtYSkKKworLy8gR05VIEV4dGVuc2lvbnMuCitQUEtFWVdPUkQoaW1wb3J0KQorUFBLRVlXT1JEKGluY2x1ZGVfbmV4dCkKK1BQS0VZV09SRCh3YXJuaW5nKQorUFBLRVlXT1JEKGlkZW50KQorUFBLRVlXT1JEKHNjY3MpCitQUEtFWVdPUkQoYXNzZXJ0KQorUFBLRVlXT1JEKHVuYXNzZXJ0KQorCisvLyBDbGFuZyBleHRlbnNpb25zCitQUEtFWVdPUkQoX19wdWJsaWNfbWFjcm8pCitQUEtFWVdPUkQoX19wcml2YXRlX21hY3JvKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTGFuZ3VhZ2Uga2V5d29yZHMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBUaGVzZSBkZWZpbmUgbWVtYmVycyBvZiB0aGUgdG9rOjoqIG5hbWVzcGFjZS4KKworVE9LKHVua25vd24pICAgICAgICAgICAgIC8vIE5vdCBhIHRva2VuLgorVE9LKGVvZikgICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBmaWxlLgorVE9LKGVvZCkgICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBwcmVwcm9jZXNzaW5nIGRpcmVjdGl2ZSAoZW5kIG9mIGxpbmUgaW5zaWRlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3RpdmUpLgorVE9LKGNvZGVfY29tcGxldGlvbikgICAgIC8vIENvZGUgY29tcGxldGlvbiBtYXJrZXIKKworLy8gQzk5IDYuNC45OiBDb21tZW50cy4KK1RPSyhjb21tZW50KSAgICAgICAgICAgICAvLyBDb21tZW50IChvbmx5IGluIC1FIC1DW0NdIG1vZGUpCisKKy8vIEM5OSA2LjQuMjogSWRlbnRpZmllcnMuCitUT0soaWRlbnRpZmllcikgICAgICAgICAgLy8gYWJjZGUxMjMKK1RPSyhyYXdfaWRlbnRpZmllcikgICAgICAvLyBVc2VkIG9ubHkgaW4gcmF3IGxleGluZyBtb2RlLgorCisvLyBDOTkgNi40LjQuMTogSW50ZWdlciBDb25zdGFudHMKKy8vIEM5OSA2LjQuNC4yOiBGbG9hdGluZyBDb25zdGFudHMKK1RPSyhudW1lcmljX2NvbnN0YW50KSAgICAvLyAweDEyMworCisvLyBDOTkgNi40LjQ6IENoYXJhY3RlciBDb25zdGFudHMKK1RPSyhjaGFyX2NvbnN0YW50KSAgICAgICAvLyAnYScKK1RPSyh3aWRlX2NoYXJfY29uc3RhbnQpICAvLyBMJ2InCisKKy8vIEMrKzE3IENoYXJhY3RlciBDb25zdGFudHMKK1RPSyh1dGY4X2NoYXJfY29uc3RhbnQpICAvLyB1OCdhJworCisvLyBDKysxMSBDaGFyYWN0ZXIgQ29uc3RhbnRzCitUT0sodXRmMTZfY2hhcl9jb25zdGFudCkgLy8gdSdhJworVE9LKHV0ZjMyX2NoYXJfY29uc3RhbnQpIC8vIFUnYScKKworLy8gQzk5IDYuNC41OiBTdHJpbmcgTGl0ZXJhbHMuCitUT0soc3RyaW5nX2xpdGVyYWwpICAgICAgLy8gImZvbyIKK1RPSyh3aWRlX3N0cmluZ19saXRlcmFsKSAvLyBMImZvbyIKK1RPSyhhbmdsZV9zdHJpbmdfbGl0ZXJhbCkvLyA8Zm9vPgorCisvLyBDKysxMSBTdHJpbmcgTGl0ZXJhbHMuCitUT0sodXRmOF9zdHJpbmdfbGl0ZXJhbCkgLy8gdTgiZm9vIgorVE9LKHV0ZjE2X3N0cmluZ19saXRlcmFsKS8vIHUiZm9vIgorVE9LKHV0ZjMyX3N0cmluZ19saXRlcmFsKS8vIFUiZm9vIgorCisvLyBDOTkgNi40LjY6IFB1bmN0dWF0b3JzLgorUFVOQ1RVQVRPUihsX3NxdWFyZSwgICAgICAgICAgICAiWyIpCitQVU5DVFVBVE9SKHJfc3F1YXJlLCAgICAgICAgICAgICJdIikKK1BVTkNUVUFUT1IobF9wYXJlbiwgICAgICAgICAgICAgIigiKQorUFVOQ1RVQVRPUihyX3BhcmVuLCAgICAgICAgICAgICAiKSIpCitQVU5DVFVBVE9SKGxfYnJhY2UsICAgICAgICAgICAgICJ7IikKK1BVTkNUVUFUT1Iocl9icmFjZSwgICAgICAgICAgICAgIn0iKQorUFVOQ1RVQVRPUihwZXJpb2QsICAgICAgICAgICAgICAiLiIpCitQVU5DVFVBVE9SKGVsbGlwc2lzLCAgICAgICAgICAgICIuLi4iKQorUFVOQ1RVQVRPUihhbXAsICAgICAgICAgICAgICAgICAiJiIpCitQVU5DVFVBVE9SKGFtcGFtcCwgICAgICAgICAgICAgICImJiIpCitQVU5DVFVBVE9SKGFtcGVxdWFsLCAgICAgICAgICAgICImPSIpCitQVU5DVFVBVE9SKHN0YXIsICAgICAgICAgICAgICAgICIqIikKK1BVTkNUVUFUT1Ioc3RhcmVxdWFsLCAgICAgICAgICAgIio9IikKK1BVTkNUVUFUT1IocGx1cywgICAgICAgICAgICAgICAgIisiKQorUFVOQ1RVQVRPUihwbHVzcGx1cywgICAgICAgICAgICAiKysiKQorUFVOQ1RVQVRPUihwbHVzZXF1YWwsICAgICAgICAgICAiKz0iKQorUFVOQ1RVQVRPUihtaW51cywgICAgICAgICAgICAgICAiLSIpCitQVU5DVFVBVE9SKGFycm93LCAgICAgICAgICAgICAgICItPiIpCitQVU5DVFVBVE9SKG1pbnVzbWludXMsICAgICAgICAgICItLSIpCitQVU5DVFVBVE9SKG1pbnVzZXF1YWwsICAgICAgICAgICItPSIpCitQVU5DVFVBVE9SKHRpbGRlLCAgICAgICAgICAgICAgICJ+IikKK1BVTkNUVUFUT1IoZXhjbGFpbSwgICAgICAgICAgICAgIiEiKQorUFVOQ1RVQVRPUihleGNsYWltZXF1YWwsICAgICAgICAiIT0iKQorUFVOQ1RVQVRPUihzbGFzaCwgICAgICAgICAgICAgICAiLyIpCitQVU5DVFVBVE9SKHNsYXNoZXF1YWwsICAgICAgICAgICIvPSIpCitQVU5DVFVBVE9SKHBlcmNlbnQsICAgICAgICAgICAgICIlIikKK1BVTkNUVUFUT1IocGVyY2VudGVxdWFsLCAgICAgICAgIiU9IikKK1BVTkNUVUFUT1IobGVzcywgICAgICAgICAgICAgICAgIjwiKQorUFVOQ1RVQVRPUihsZXNzbGVzcywgICAgICAgICAgICAiPDwiKQorUFVOQ1RVQVRPUihsZXNzZXF1YWwsICAgICAgICAgICAiPD0iKQorUFVOQ1RVQVRPUihsZXNzbGVzc2VxdWFsLCAgICAgICAiPDw9IikKK1BVTkNUVUFUT1Ioc3BhY2VzaGlwLCAgICAgICAgICAgIjw9PiIpCitQVU5DVFVBVE9SKGdyZWF0ZXIsICAgICAgICAgICAgICI+IikKK1BVTkNUVUFUT1IoZ3JlYXRlcmdyZWF0ZXIsICAgICAgIj4+IikKK1BVTkNUVUFUT1IoZ3JlYXRlcmVxdWFsLCAgICAgICAgIj49IikKK1BVTkNUVUFUT1IoZ3JlYXRlcmdyZWF0ZXJlcXVhbCwgIj4+PSIpCitQVU5DVFVBVE9SKGNhcmV0LCAgICAgICAgICAgICAgICJeIikKK1BVTkNUVUFUT1IoY2FyZXRlcXVhbCwgICAgICAgICAgIl49IikKK1BVTkNUVUFUT1IocGlwZSwgICAgICAgICAgICAgICAgInwiKQorUFVOQ1RVQVRPUihwaXBlcGlwZSwgICAgICAgICAgICAifHwiKQorUFVOQ1RVQVRPUihwaXBlZXF1YWwsICAgICAgICAgICAifD0iKQorUFVOQ1RVQVRPUihxdWVzdGlvbiwgICAgICAgICAgICAiPyIpCitQVU5DVFVBVE9SKGNvbG9uLCAgICAgICAgICAgICAgICI6IikKK1BVTkNUVUFUT1Ioc2VtaSwgICAgICAgICAgICAgICAgIjsiKQorUFVOQ1RVQVRPUihlcXVhbCwgICAgICAgICAgICAgICAiPSIpCitQVU5DVFVBVE9SKGVxdWFsZXF1YWwsICAgICAgICAgICI9PSIpCitQVU5DVFVBVE9SKGNvbW1hLCAgICAgICAgICAgICAgICIsIikKK1BVTkNUVUFUT1IoaGFzaCwgICAgICAgICAgICAgICAgIiMiKQorUFVOQ1RVQVRPUihoYXNoaGFzaCwgICAgICAgICAgICAiIyMiKQorUFVOQ1RVQVRPUihoYXNoYXQsICAgICAgICAgICAgICAiI0AiKQorCisvLyBDKysgU3VwcG9ydAorUFVOQ1RVQVRPUihwZXJpb2RzdGFyLCAgICAgICAgICAiLioiKQorUFVOQ1RVQVRPUihhcnJvd3N0YXIsICAgICAgICAgICAiLT4qIikKK1BVTkNUVUFUT1IoY29sb25jb2xvbiwgICAgICAgICAgIjo6IikKKworLy8gT2JqZWN0aXZlIEMgc3VwcG9ydC4KK1BVTkNUVUFUT1IoYXQsICAgICAgICAgICAgICAgICAgIkAiKQorCisvLyBDVURBIHN1cHBvcnQuCitQVU5DVFVBVE9SKGxlc3NsZXNzbGVzcywgICAgICAgICAgIjw8PCIpCitQVU5DVFVBVE9SKGdyZWF0ZXJncmVhdGVyZ3JlYXRlciwgIj4+PiIpCisKKy8vIENMIHN1cHBvcnQKK1BVTkNUVUFUT1IoY2FyZXRjYXJldCwgICAgICAgICAgICAiXl4iKQorCisvLyBDOTkgNi40LjE6IEtleXdvcmRzLiAgVGhlc2UgdHVybiBpbnRvIGt3XyogdG9rZW5zLgorLy8gRmxhZ3MgYWxsb3dlZDoKKy8vICAgS0VZQUxMICAgLSBUaGlzIGlzIGEga2V5d29yZCBpbiBhbGwgdmFyaWFudHMgb2YgQyBhbmQgQysrLCBvciBpdAorLy8gICAgICAgICAgICAgIGlzIGEga2V5d29yZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gbmFtZXNwYWNlIHRoYXQgc2hvdWxkCisvLyAgICAgICAgICAgICAgYWx3YXlzIGJlIHRyZWF0ZWQgYXMgYSBrZXl3b3JkCisvLyAgIEtFWUM5OSAgIC0gVGhpcyBpcyBhIGtleXdvcmQgaW50cm9kdWNlZCB0byBDIGluIEM5OQorLy8gICBLRVlDMTEgICAtIFRoaXMgaXMgYSBrZXl3b3JkIGludHJvZHVjZWQgdG8gQyBpbiBDMTEKKy8vICAgS0VZQ1hYICAgLSBUaGlzIGlzIGEgQysrIGtleXdvcmQsIG9yIGEgQysrLXNwZWNpZmljIGtleXdvcmQgaW4gdGhlCisvLyAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gbmFtZXNwYWNlCisvLyAgIEtFWU5PQ1hYIC0gVGhpcyBpcyBhIGtleXdvcmQgaW4gZXZlcnkgbm9uLUMrKyBkaWFsZWN0LgorLy8gICBLRVlDWFgxMSAtIFRoaXMgaXMgYSBDKysga2V5d29yZCBpbnRyb2R1Y2VkIHRvIEMrKyBpbiBDKysxMQorLy8gICBLRVlDWFgyQSAtIFRoaXMgaXMgYSBDKysga2V5d29yZCBpbnRyb2R1Y2VkIHRvIEMrKyBpbiBDKysyYQorLy8gICBLRVlDT05DRVBUUyAtIFRoaXMgaXMgYSBrZXl3b3JkIGlmIHRoZSBDKysgZXh0ZW5zaW9ucyBmb3IgY29uY2VwdHMKKy8vICAgICAgICAgICAgICAgICBhcmUgZW5hYmxlZC4KKy8vICAgS0VZTU9EVUxFUyAtIFRoaXMgaXMgYSBrZXl3b3JkIGlmIHRoZSBDKysgZXh0ZW5zaW9ucyBmb3IgbW9kdWxlcworLy8gICAgICAgICAgICAgICAgYXJlIGVuYWJsZWQuCisvLyAgIEtFWUdOVSAgIC0gVGhpcyBpcyBhIGtleXdvcmQgaWYgR05VIGV4dGVuc2lvbnMgYXJlIGVuYWJsZWQKKy8vICAgS0VZTVMgICAgLSBUaGlzIGlzIGEga2V5d29yZCBpZiBNaWNyb3NvZnQgZXh0ZW5zaW9ucyBhcmUgZW5hYmxlZAorLy8gICBLRVlOT01TMTggLSBUaGlzIGlzIGEga2V5d29yZCB0aGF0IG11c3QgbmV2ZXIgYmUgZW5hYmxlZCB1bmRlcgorLy8gICAgICAgICAgICAgICBNU1ZDIDw9IHYxOC4KKy8vICAgS0VZT1BFTkNMICAtIFRoaXMgaXMgYSBrZXl3b3JkIGluIE9wZW5DTAorLy8gICBLRVlOT09QRU5DTCAgLSBUaGlzIGlzIGEga2V5d29yZCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgaW4gT3BlbkNMCisvLyAgIEtFWUFMVElWRUMgLSBUaGlzIGlzIGEga2V5d29yZCBpbiBBbHRpVmVjCisvLyAgIEtFWVpWRUNUT1IgLSBUaGlzIGlzIGEga2V5d29yZCBmb3IgdGhlIFN5c3RlbSB6IHZlY3RvciBleHRlbnNpb25zLAorLy8gICAgICAgICAgICAgICAgd2hpY2ggYXJlIGhlYXZpbHkgYmFzZWQgb24gQWx0aVZlYworLy8gICBLRVlCT1JMQU5EIC0gVGhpcyBpcyBhIGtleXdvcmQgaWYgQm9ybGFuZCBleHRlbnNpb25zIGFyZSBlbmFibGVkCisvLyAgIEtFWUNPUk9VVElORVMgLSBUaGlzIGlzIGEga2V5d29yZCBpZiBzdXBwb3J0IGZvciB0aGUgQysrIGNvcm91dGluZXMKKy8vICAgICAgICAgICAgICAgICAgIFRTIGlzIGVuYWJsZWQKKy8vICAgQk9PTFNVUFBPUlQgLSBUaGlzIGlzIGEga2V5d29yZCBpZiAnYm9vbCcgaXMgYSBidWlsdC1pbiB0eXBlCisvLyAgIEhBTEZTVVBQT1JUIC0gVGhpcyBpcyBhIGtleXdvcmQgaWYgJ2hhbGYnIGlzIGEgYnVpbHQtaW4gdHlwZQorLy8gICBXQ0hBUlNVUFBPUlQgLSBUaGlzIGlzIGEga2V5d29yZCBpZiAnd2NoYXJfdCcgaXMgYSBidWlsdC1pbiB0eXBlCisvLworS0VZV09SRChhdXRvICAgICAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKGJyZWFrICAgICAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoY2FzZSAgICAgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChjaGFyICAgICAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKGNvbnN0ICAgICAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoY29udGludWUgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChkZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKGRvICAgICAgICAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoZG91YmxlICAgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChlbHNlICAgICAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKGVudW0gICAgICAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoZXh0ZXJuICAgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKGZvciAgICAgICAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoZ290byAgICAgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKGlubGluZSAgICAgICAgICAgICAgICAgICAgICAsIEtFWUM5OXxLRVlDWFh8S0VZR05VKQorS0VZV09SRChpbnQgICAgICAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKGxvbmcgICAgICAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQocmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChyZXN0cmljdCAgICAgICAgICAgICAgICAgICAgLCBLRVlDOTkpCitLRVlXT1JEKHJldHVybiAgICAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoc2hvcnQgICAgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChzaWduZWQgICAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKHNpemVvZiAgICAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoc3RhdGljICAgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChzdHJ1Y3QgICAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKHN3aXRjaCAgICAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQodHlwZWRlZiAgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRCh1bmlvbiAgICAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQodm9pZCAgICAgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRCh2b2xhdGlsZSAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKHdoaWxlICAgICAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoX0FsaWduYXMgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChfQWxpZ25vZiAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKF9BdG9taWMgICAgICAgICAgICAgICAgICAgICAsIEtFWUFMTHxLRVlOT09QRU5DTCkKK0tFWVdPUkQoX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICwgS0VZTk9DWFgpCitLRVlXT1JEKF9Db21wbGV4ICAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoX0dlbmVyaWMgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChfSW1hZ2luYXJ5ICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKF9Ob3JldHVybiAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoX1N0YXRpY19hc3NlcnQgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChfVGhyZWFkX2xvY2FsICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKF9fZnVuY19fICAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoX19vYmpjX3llcyAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChfX29iamNfbm8gICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCisKKworLy8gQysrIDIuMTFwMTogS2V5d29yZHMuCitLRVlXT1JEKGFzbSAgICAgICAgICAgICAgICAgICAgICAgICAsIEtFWUNYWHxLRVlHTlUpCitLRVlXT1JEKGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAsIEJPT0xTVVBQT1JUKQorS0VZV09SRChjYXRjaCAgICAgICAgICAgICAgICAgICAgICAgLCBLRVlDWFgpCitLRVlXT1JEKGNsYXNzICAgICAgICAgICAgICAgICAgICAgICAsIEtFWUNYWCkKK0tFWVdPUkQoY29uc3RfY2FzdCAgICAgICAgICAgICAgICAgICwgS0VZQ1hYKQorS0VZV09SRChkZWxldGUgICAgICAgICAgICAgICAgICAgICAgLCBLRVlDWFgpCitLRVlXT1JEKGR5bmFtaWNfY2FzdCAgICAgICAgICAgICAgICAsIEtFWUNYWCkKK0tFWVdPUkQoZXhwbGljaXQgICAgICAgICAgICAgICAgICAgICwgS0VZQ1hYKQorS0VZV09SRChleHBvcnQgICAgICAgICAgICAgICAgICAgICAgLCBLRVlDWFgpCitLRVlXT1JEKGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAsIEJPT0xTVVBQT1JUKQorS0VZV09SRChmcmllbmQgICAgICAgICAgICAgICAgICAgICAgLCBLRVlDWFgpCitLRVlXT1JEKG11dGFibGUgICAgICAgICAgICAgICAgICAgICAsIEtFWUNYWCkKK0tFWVdPUkQobmFtZXNwYWNlICAgICAgICAgICAgICAgICAgICwgS0VZQ1hYKQorS0VZV09SRChuZXcgICAgICAgICAgICAgICAgICAgICAgICAgLCBLRVlDWFgpCitLRVlXT1JEKG9wZXJhdG9yICAgICAgICAgICAgICAgICAgICAsIEtFWUNYWCkKK0tFWVdPUkQocHJpdmF0ZSAgICAgICAgICAgICAgICAgICAgICwgS0VZQ1hYKQorS0VZV09SRChwcm90ZWN0ZWQgICAgICAgICAgICAgICAgICAgLCBLRVlDWFgpCitLRVlXT1JEKHB1YmxpYyAgICAgICAgICAgICAgICAgICAgICAsIEtFWUNYWCkKK0tFWVdPUkQocmVpbnRlcnByZXRfY2FzdCAgICAgICAgICAgICwgS0VZQ1hYKQorS0VZV09SRChzdGF0aWNfY2FzdCAgICAgICAgICAgICAgICAgLCBLRVlDWFgpCitLRVlXT1JEKHRlbXBsYXRlICAgICAgICAgICAgICAgICAgICAsIEtFWUNYWCkKK0tFWVdPUkQodGhpcyAgICAgICAgICAgICAgICAgICAgICAgICwgS0VZQ1hYKQorS0VZV09SRCh0aHJvdyAgICAgICAgICAgICAgICAgICAgICAgLCBLRVlDWFgpCitLRVlXT1JEKHRydWUgICAgICAgICAgICAgICAgICAgICAgICAsIEJPT0xTVVBQT1JUKQorS0VZV09SRCh0cnkgICAgICAgICAgICAgICAgICAgICAgICAgLCBLRVlDWFgpCitLRVlXT1JEKHR5cGVuYW1lICAgICAgICAgICAgICAgICAgICAsIEtFWUNYWCkKK0tFWVdPUkQodHlwZWlkICAgICAgICAgICAgICAgICAgICAgICwgS0VZQ1hYKQorS0VZV09SRCh1c2luZyAgICAgICAgICAgICAgICAgICAgICAgLCBLRVlDWFgpCitLRVlXT1JEKHZpcnR1YWwgICAgICAgICAgICAgICAgICAgICAsIEtFWUNYWCkKK0tFWVdPUkQod2NoYXJfdCAgICAgICAgICAgICAgICAgICAgICwgV0NIQVJTVVBQT1JUKQorCisvLyBDKysgMi41cDI6IEFsdGVybmF0aXZlIFJlcHJlc2VudGF0aW9ucy4KK0NYWF9LRVlXT1JEX09QRVJBVE9SKGFuZCAgICAgLCBhbXBhbXApCitDWFhfS0VZV09SRF9PUEVSQVRPUihhbmRfZXEgICwgYW1wZXF1YWwpCitDWFhfS0VZV09SRF9PUEVSQVRPUihiaXRhbmQgICwgYW1wKQorQ1hYX0tFWVdPUkRfT1BFUkFUT1IoYml0b3IgICAsIHBpcGUpCitDWFhfS0VZV09SRF9PUEVSQVRPUihjb21wbCAgICwgdGlsZGUpCitDWFhfS0VZV09SRF9PUEVSQVRPUihub3QgICAgICwgZXhjbGFpbSkKK0NYWF9LRVlXT1JEX09QRVJBVE9SKG5vdF9lcSAgLCBleGNsYWltZXF1YWwpCitDWFhfS0VZV09SRF9PUEVSQVRPUihvciAgICAgICwgcGlwZXBpcGUpCitDWFhfS0VZV09SRF9PUEVSQVRPUihvcl9lcSAgICwgcGlwZWVxdWFsKQorQ1hYX0tFWVdPUkRfT1BFUkFUT1IoeG9yICAgICAsIGNhcmV0KQorQ1hYX0tFWVdPUkRfT1BFUkFUT1IoeG9yX2VxICAsIGNhcmV0ZXF1YWwpCisKKy8vIEMrKzExIGtleXdvcmRzCitDWFgxMV9LRVlXT1JEKGFsaWduYXMgICAgICAgICAgICAgICAsIDApCitDWFgxMV9LRVlXT1JEKGFsaWdub2YgICAgICAgICAgICAgICAsIDApCitDWFgxMV9LRVlXT1JEKGNoYXIxNl90ICAgICAgICAgICAgICAsIEtFWU5PTVMxOCkKK0NYWDExX0tFWVdPUkQoY2hhcjMyX3QgICAgICAgICAgICAgICwgS0VZTk9NUzE4KQorQ1hYMTFfS0VZV09SRChjb25zdGV4cHIgICAgICAgICAgICAgLCAwKQorQ1hYMTFfS0VZV09SRChkZWNsdHlwZSAgICAgICAgICAgICAgLCAwKQorQ1hYMTFfS0VZV09SRChub2V4Y2VwdCAgICAgICAgICAgICAgLCAwKQorQ1hYMTFfS0VZV09SRChudWxscHRyICAgICAgICAgICAgICAgLCAwKQorQ1hYMTFfS0VZV09SRChzdGF0aWNfYXNzZXJ0ICAgICAgICAgLCAwKQorQ1hYMTFfS0VZV09SRCh0aHJlYWRfbG9jYWwgICAgICAgICAgLCAwKQorCisvLyBDKysyYSAvIGNvbmNlcHRzIFRTIGtleXdvcmRzCitDT05DRVBUU19LRVlXT1JEKGNvbmNlcHQpCitDT05DRVBUU19LRVlXT1JEKHJlcXVpcmVzKQorCisvLyBDKysgY29yb3V0aW5lcyBUUyBrZXl3b3JkcworS0VZV09SRChjb19hd2FpdCAgICAgICAgICAgICAgICAgICAgLCBLRVlDT1JPVVRJTkVTKQorS0VZV09SRChjb19yZXR1cm4gICAgICAgICAgICAgICAgICAgLCBLRVlDT1JPVVRJTkVTKQorS0VZV09SRChjb195aWVsZCAgICAgICAgICAgICAgICAgICAgLCBLRVlDT1JPVVRJTkVTKQorCisvLyBDKysgbW9kdWxlcyBUUyBrZXl3b3JkcworTU9EVUxFU19LRVlXT1JEKG1vZHVsZSkKK01PRFVMRVNfS0VZV09SRChpbXBvcnQpCisKKy8vIEMxMSBFeHRlbnNpb24KK0tFWVdPUkQoX0Zsb2F0MTYgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorCisvLyBHTlUgRXh0ZW5zaW9ucyAoaW4gaW1wbC1yZXNlcnZlZCBuYW1lc3BhY2UpCitLRVlXT1JEKF9EZWNpbWFsMzIgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoX0RlY2ltYWw2NCAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChfRGVjaW1hbDEyOCAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKF9fbnVsbCAgICAgICAgICAgICAgICAgICAgICAsIEtFWUNYWCkKK0tFWVdPUkQoX19hbGlnbm9mICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChfX2F0dHJpYnV0ZSAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKF9fYnVpbHRpbl9jaG9vc2VfZXhwciAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoX19idWlsdGluX29mZnNldG9mICAgICAgICAgICwgS0VZQUxMKQorLy8gX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcCBpcyBhIEdOVSBDIGV4dGVuc2lvbiB0aGF0IHdlIGhhbmRsZSBsaWtlIGEgQysrCisvLyB0eXBlIHRyYWl0LgorVFlQRV9UUkFJVF8yKF9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AsIFR5cGVDb21wYXRpYmxlLCBLRVlOT0NYWCkKK0tFWVdPUkQoX19idWlsdGluX3ZhX2FyZyAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChfX2V4dGVuc2lvbl9fICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKF9fZmxvYXQxMjggICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoX19pbWFnICAgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChfX2ludDEyOCAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKF9fbGFiZWxfXyAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoX19yZWFsICAgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChfX3RocmVhZCAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKF9fRlVOQ1RJT05fXyAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoX19QUkVUVFlfRlVOQ1RJT05fXyAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChfX2F1dG9fdHlwZSAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCisKKy8vIEdOVSBFeHRlbnNpb25zIChvdXRzaWRlIGltcGwtcmVzZXJ2ZWQgbmFtZXNwYWNlKQorS0VZV09SRCh0eXBlb2YgICAgICAgICAgICAgICAgICAgICAgLCBLRVlHTlUpCisKKy8vIE1TIEV4dGVuc2lvbnMKK0tFWVdPUkQoX19GVU5DRE5BTUVfXyAgICAgICAgICAgICAgICwgS0VZTVMpCitLRVlXT1JEKF9fRlVOQ1NJR19fICAgICAgICAgICAgICAgICAsIEtFWU1TKQorS0VZV09SRChMX19GVU5DVElPTl9fICAgICAgICAgICAgICAgLCBLRVlNUykKK1RZUEVfVFJBSVRfMShfX2lzX2ludGVyZmFjZV9jbGFzcywgSXNJbnRlcmZhY2VDbGFzcywgS0VZTVMpCitUWVBFX1RSQUlUXzEoX19pc19zZWFsZWQsIElzU2VhbGVkLCBLRVlNUykKKworLy8gTVNWQzEyLjAgLyBWUzIwMTMgVHlwZSBUcmFpdHMKK1RZUEVfVFJBSVRfMShfX2lzX2Rlc3RydWN0aWJsZSwgSXNEZXN0cnVjdGlibGUsIEtFWU1TKQorVFlQRV9UUkFJVF8xKF9faXNfdHJpdmlhbGx5X2Rlc3RydWN0aWJsZSwgSXNUcml2aWFsbHlEZXN0cnVjdGlibGUsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX25vdGhyb3dfZGVzdHJ1Y3RpYmxlLCBJc05vdGhyb3dEZXN0cnVjdGlibGUsIEtFWU1TKQorVFlQRV9UUkFJVF8yKF9faXNfbm90aHJvd19hc3NpZ25hYmxlLCBJc05vdGhyb3dBc3NpZ25hYmxlLCBLRVlDWFgpCitUWVBFX1RSQUlUX04oX19pc19jb25zdHJ1Y3RpYmxlLCBJc0NvbnN0cnVjdGlibGUsIEtFWUNYWCkKK1RZUEVfVFJBSVRfTihfX2lzX25vdGhyb3dfY29uc3RydWN0aWJsZSwgSXNOb3Rocm93Q29uc3RydWN0aWJsZSwgS0VZQ1hYKQorCisvLyBNU1ZDMTQuMCAvIFZTMjAxNSBUeXBlIFRyYWl0cworVFlQRV9UUkFJVF8yKF9faXNfYXNzaWduYWJsZSwgSXNBc3NpZ25hYmxlLCBLRVlDWFgpCisKKy8vIEdOVSBhbmQgTVMgVHlwZSBUcmFpdHMKK1RZUEVfVFJBSVRfMShfX2hhc19ub3Rocm93X2Fzc2lnbiwgSGFzTm90aHJvd0Fzc2lnbiwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faGFzX25vdGhyb3dfbW92ZV9hc3NpZ24sIEhhc05vdGhyb3dNb3ZlQXNzaWduLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19oYXNfbm90aHJvd19jb3B5LCBIYXNOb3Rocm93Q29weSwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faGFzX25vdGhyb3dfY29uc3RydWN0b3IsIEhhc05vdGhyb3dDb25zdHJ1Y3RvciwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faGFzX3RyaXZpYWxfYXNzaWduLCBIYXNUcml2aWFsQXNzaWduLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19oYXNfdHJpdmlhbF9tb3ZlX2Fzc2lnbiwgSGFzVHJpdmlhbE1vdmVBc3NpZ24sIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2hhc190cml2aWFsX2NvcHksIEhhc1RyaXZpYWxDb3B5LCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19oYXNfdHJpdmlhbF9jb25zdHJ1Y3RvciwgSGFzVHJpdmlhbERlZmF1bHRDb25zdHJ1Y3RvciwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faGFzX3RyaXZpYWxfbW92ZV9jb25zdHJ1Y3RvciwgSGFzVHJpdmlhbE1vdmVDb25zdHJ1Y3RvciwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faGFzX3RyaXZpYWxfZGVzdHJ1Y3RvciwgSGFzVHJpdmlhbERlc3RydWN0b3IsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2hhc192aXJ0dWFsX2Rlc3RydWN0b3IsIEhhc1ZpcnR1YWxEZXN0cnVjdG9yLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19hYnN0cmFjdCwgSXNBYnN0cmFjdCwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfYWdncmVnYXRlLCBJc0FnZ3JlZ2F0ZSwgS0VZQ1hYKQorVFlQRV9UUkFJVF8yKF9faXNfYmFzZV9vZiwgSXNCYXNlT2YsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX2NsYXNzLCBJc0NsYXNzLCBLRVlDWFgpCitUWVBFX1RSQUlUXzIoX19pc19jb252ZXJ0aWJsZV90bywgSXNDb252ZXJ0aWJsZVRvLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19lbXB0eSwgSXNFbXB0eSwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfZW51bSwgSXNFbnVtLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19maW5hbCwgSXNGaW5hbCwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfbGl0ZXJhbCwgSXNMaXRlcmFsLCBLRVlDWFgpCisvLyBOYW1lIGZvciBHQ0MgNC42IGNvbXBhdGliaWxpdHkgLSBwZW9wbGUgaGF2ZSBhbHJlYWR5IHdyaXR0ZW4gbGlicmFyaWVzIHVzaW5nCisvLyB0aGlzIG5hbWUgdW5mb3J0dW5hdGVseS4KK0FMSUFTKCJfX2lzX2xpdGVyYWxfdHlwZSIsIF9faXNfbGl0ZXJhbCwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfcG9kLCBJc1BPRCwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfcG9seW1vcnBoaWMsIElzUG9seW1vcnBoaWMsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX3RyaXZpYWwsIElzVHJpdmlhbCwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfdW5pb24sIElzVW5pb24sIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2hhc191bmlxdWVfb2JqZWN0X3JlcHJlc2VudGF0aW9ucywKKyAgICAgICAgICAgICBIYXNVbmlxdWVPYmplY3RSZXByZXNlbnRhdGlvbnMsIEtFWUNYWCkKKworLy8gQ2xhbmctb25seSBDKysgVHlwZSBUcmFpdHMKK1RZUEVfVFJBSVRfTihfX2lzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlLCBJc1RyaXZpYWxseUNvbnN0cnVjdGlibGUsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX3RyaXZpYWxseV9jb3B5YWJsZSwgSXNUcml2aWFsbHlDb3B5YWJsZSwgS0VZQ1hYKQorVFlQRV9UUkFJVF8yKF9faXNfdHJpdmlhbGx5X2Fzc2lnbmFibGUsIElzVHJpdmlhbGx5QXNzaWduYWJsZSwgS0VZQ1hYKQorVFlQRV9UUkFJVF8yKF9fcmVmZXJlbmNlX2JpbmRzX3RvX3RlbXBvcmFyeSwgUmVmZXJlbmNlQmluZHNUb1RlbXBvcmFyeSwgS0VZQ1hYKQorS0VZV09SRChfX3VuZGVybHlpbmdfdHlwZSAgICAgICAgICAgLCBLRVlDWFgpCisKKy8vIEVtYmFyY2FkZXJvIEV4cHJlc3Npb24gVHJhaXRzCitLRVlXT1JEKF9faXNfbHZhbHVlX2V4cHIgICAgICAgICAgICAsIEtFWUNYWCkKK0tFWVdPUkQoX19pc19ydmFsdWVfZXhwciAgICAgICAgICAgICwgS0VZQ1hYKQorCisvLyBFbWJhcmNhZGVybyBVbmFyeSBUeXBlIFRyYWl0cworVFlQRV9UUkFJVF8xKF9faXNfYXJpdGhtZXRpYywgSXNBcml0aG1ldGljLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19mbG9hdGluZ19wb2ludCwgSXNGbG9hdGluZ1BvaW50LCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19pbnRlZ3JhbCwgSXNJbnRlZ3JhbCwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfY29tcGxldGVfdHlwZSwgSXNDb21wbGV0ZVR5cGUsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX3ZvaWQsIElzVm9pZCwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfYXJyYXksIElzQXJyYXksIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX2Z1bmN0aW9uLCBJc0Z1bmN0aW9uLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19yZWZlcmVuY2UsIElzUmVmZXJlbmNlLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19sdmFsdWVfcmVmZXJlbmNlLCBJc0x2YWx1ZVJlZmVyZW5jZSwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfcnZhbHVlX3JlZmVyZW5jZSwgSXNSdmFsdWVSZWZlcmVuY2UsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX2Z1bmRhbWVudGFsLCBJc0Z1bmRhbWVudGFsLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19vYmplY3QsIElzT2JqZWN0LCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19zY2FsYXIsIElzU2NhbGFyLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19jb21wb3VuZCwgSXNDb21wb3VuZCwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfcG9pbnRlciwgSXNQb2ludGVyLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXIsIElzTWVtYmVyT2JqZWN0UG9pbnRlciwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXIsIElzTWVtYmVyRnVuY3Rpb25Qb2ludGVyLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19tZW1iZXJfcG9pbnRlciwgSXNNZW1iZXJQb2ludGVyLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19jb25zdCwgSXNDb25zdCwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfdm9sYXRpbGUsIElzVm9sYXRpbGUsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX3N0YW5kYXJkX2xheW91dCwgSXNTdGFuZGFyZExheW91dCwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfc2lnbmVkLCBJc1NpZ25lZCwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfdW5zaWduZWQsIElzVW5zaWduZWQsIEtFWUNYWCkKKworLy8gRW1iYXJjYWRlcm8gQmluYXJ5IFR5cGUgVHJhaXRzCitUWVBFX1RSQUlUXzIoX19pc19zYW1lLCBJc1NhbWUsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMihfX2lzX2NvbnZlcnRpYmxlLCBJc0NvbnZlcnRpYmxlLCBLRVlDWFgpCitLRVlXT1JEKF9fYXJyYXlfcmFuayAgICAgICAgICAgICAgICAsIEtFWUNYWCkKK0tFWVdPUkQoX19hcnJheV9leHRlbnQgICAgICAgICAgICAgICwgS0VZQ1hYKQorCisvLyBBcHBsZSBFeHRlbnNpb24uCitLRVlXT1JEKF9fcHJpdmF0ZV9leHRlcm5fXyAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoX19tb2R1bGVfcHJpdmF0ZV9fICAgICAgICAgICwgS0VZQUxMKQorCisvLyBFeHRlbnNpb24gdGhhdCB3aWxsIGJlIGVuYWJsZWQgZm9yIE1pY3Jvc29mdCwgQm9ybGFuZCBhbmQgUFM0LCBidXQgY2FuIGJlCisvLyBkaXNhYmxlZCB2aWEgJy1mbm8tZGVjbHNwZWMnLgorS0VZV09SRChfX2RlY2xzcGVjICAgICAgICAgICAgICAgICAgLCAwKQorCisvLyBNaWNyb3NvZnQgRXh0ZW5zaW9uLgorS0VZV09SRChfX2NkZWNsICAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKF9fc3RkY2FsbCAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoX19mYXN0Y2FsbCAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChfX3RoaXNjYWxsICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKF9fcmVnY2FsbCAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoX192ZWN0b3JjYWxsICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChfX2ZvcmNlaW5saW5lICAgICAgICAgICAgICAgLCBLRVlNUykKK0tFWVdPUkQoX191bmFsaWduZWQgICAgICAgICAgICAgICAgICwgS0VZTVMpCitLRVlXT1JEKF9fc3VwZXIgICAgICAgICAgICAgICAgICAgICAsIEtFWU1TKQorCisvLyBPcGVuQ0wgYWRkcmVzcyBzcGFjZSBxdWFsaWZpZXJzCitLRVlXT1JEKF9fZ2xvYmFsICAgICAgICAgICAgICAgICAgICAsIEtFWU9QRU5DTCkKK0tFWVdPUkQoX19sb2NhbCAgICAgICAgICAgICAgICAgICAgICwgS0VZT1BFTkNMKQorS0VZV09SRChfX2NvbnN0YW50ICAgICAgICAgICAgICAgICAgLCBLRVlPUEVOQ0wpCitLRVlXT1JEKF9fcHJpdmF0ZSAgICAgICAgICAgICAgICAgICAsIEtFWU9QRU5DTCkKK0tFWVdPUkQoX19nZW5lcmljICAgICAgICAgICAgICAgICAgICwgS0VZT1BFTkNMKQorQUxJQVMoImdsb2JhbCIsIF9fZ2xvYmFsICAgICAgICAgICAgLCBLRVlPUEVOQ0wpCitBTElBUygibG9jYWwiLCBfX2xvY2FsICAgICAgICAgICAgICAsIEtFWU9QRU5DTCkKK0FMSUFTKCJjb25zdGFudCIsIF9fY29uc3RhbnQgICAgICAgICwgS0VZT1BFTkNMKQorQUxJQVMoInByaXZhdGUiLCBfX3ByaXZhdGUgICAgICAgICAgLCBLRVlPUEVOQ0wpCitBTElBUygiZ2VuZXJpYyIsIF9fZ2VuZXJpYyAgICAgICAgICAsIEtFWU9QRU5DTCkKKy8vIE9wZW5DTCBmdW5jdGlvbiBxdWFsaWZpZXJzCitLRVlXT1JEKF9fa2VybmVsICAgICAgICAgICAgICAgICAgICAsIEtFWU9QRU5DTCkKK0FMSUFTKCJrZXJuZWwiLCBfX2tlcm5lbCAgICAgICAgICAgICwgS0VZT1BFTkNMKQorLy8gT3BlbkNMIGFjY2VzcyBxdWFsaWZpZXJzCitLRVlXT1JEKF9fcmVhZF9vbmx5ICAgICAgICAgICAgICAgICAsIEtFWU9QRU5DTCkKK0tFWVdPUkQoX193cml0ZV9vbmx5ICAgICAgICAgICAgICAgICwgS0VZT1BFTkNMKQorS0VZV09SRChfX3JlYWRfd3JpdGUgICAgICAgICAgICAgICAgLCBLRVlPUEVOQ0wpCitBTElBUygicmVhZF9vbmx5IiwgX19yZWFkX29ubHkgICAgICAsIEtFWU9QRU5DTCkKK0FMSUFTKCJ3cml0ZV9vbmx5IiwgX193cml0ZV9vbmx5ICAgICwgS0VZT1BFTkNMKQorQUxJQVMoInJlYWRfd3JpdGUiLCBfX3JlYWRfd3JpdGUgICAgLCBLRVlPUEVOQ0wpCisvLyBPcGVuQ0wgYnVpbHRpbnMKK0tFWVdPUkQoX19idWlsdGluX2FzdHlwZSAgICAgICAgICAgICwgS0VZT1BFTkNMKQorS0VZV09SRCh2ZWNfc3RlcCAgICAgICAgICAgICAgICAgICAgLCBLRVlPUEVOQ0x8S0VZQUxUSVZFQ3xLRVlaVkVDVE9SKQorI2RlZmluZSBHRU5FUklDX0lNQUdFX1RZUEUoSW1nVHlwZSwgSWQpIEtFWVdPUkQoSW1nVHlwZSMjX3QsIEtFWU9QRU5DTCkKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9PcGVuQ0xJbWFnZVR5cGVzLmRlZiIKKworLy8gT3Blbk1QIFR5cGUgVHJhaXRzCitLRVlXT1JEKF9fYnVpbHRpbl9vbXBfcmVxdWlyZWRfc2ltZF9hbGlnbiwgS0VZQUxMKQorCitLRVlXT1JEKHBpcGUgICAgICAgICAgICAgICAgICAgICAgICAsIEtFWU9QRU5DTCkKKworLy8gQm9ybGFuZCBFeHRlbnNpb25zLgorS0VZV09SRChfX3Bhc2NhbCAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCisKKy8vIEFsdGl2ZWMgRXh0ZW5zaW9uLgorS0VZV09SRChfX3ZlY3RvciAgICAgICAgICAgICAgICAgICAgLCBLRVlBTFRJVkVDfEtFWVpWRUNUT1IpCitLRVlXT1JEKF9fcGl4ZWwgICAgICAgICAgICAgICAgICAgICAsIEtFWUFMVElWRUMpCitLRVlXT1JEKF9fYm9vbCAgICAgICAgICAgICAgICAgICAgICAsIEtFWUFMVElWRUN8S0VZWlZFQ1RPUikKKworLy8gQVJNIE5FT04gZXh0ZW5zaW9ucy4KK0FMSUFTKCJfX2ZwMTYiLCBoYWxmICAgICAgICAgICAgICAgICwgS0VZQUxMKQorCisvLyBPcGVuQ0wgRXh0ZW5zaW9uLgorS0VZV09SRChoYWxmICAgICAgICAgICAgICAgICAgICAgICAgLCBIQUxGU1VQUE9SVCkKKworLy8gT2JqZWN0aXZlLUMgQVJDIGtleXdvcmRzLgorS0VZV09SRChfX2JyaWRnZSAgICAgICAgICAgICAgICAgICAgICwgS0VZQVJDKQorS0VZV09SRChfX2JyaWRnZV90cmFuc2ZlciAgICAgICAgICAgICwgS0VZQVJDKQorS0VZV09SRChfX2JyaWRnZV9yZXRhaW5lZCAgICAgICAgICAgICwgS0VZQVJDKQorS0VZV09SRChfX2JyaWRnZV9yZXRhaW4gICAgICAgICAgICAgICwgS0VZQVJDKQorCisvLyBPYmplY3RpdmUtQyBrZXl3b3Jkcy4KK0tFWVdPUkQoX19jb3ZhcmlhbnQgICAgICAgICAgICAgICAgICAsIEtFWU9CSkMyKQorS0VZV09SRChfX2NvbnRyYXZhcmlhbnQgICAgICAgICAgICAgICwgS0VZT0JKQzIpCitLRVlXT1JEKF9fa2luZG9mICAgICAgICAgICAgICAgICAgICAgLCBLRVlPQkpDMikKKworLy8gQWx0ZXJuYXRlIHNwZWxsaW5nIGZvciB2YXJpb3VzIHRva2Vucy4gIFRoZXJlIGFyZSBHQ0MgZXh0ZW5zaW9ucyBpbiBhbGwKKy8vIGxhbmd1YWdlcywgYnV0IHNob3VsZCBub3QgYmUgZGlzYWJsZWQgaW4gc3RyaWN0IGNvbmZvcm1hbmNlIG1vZGUuCitBTElBUygiX19hbGlnbm9mX18iICAsIF9fYWxpZ25vZiAgLCBLRVlBTEwpCitBTElBUygiX19hc20iICAgICAgICAsIGFzbSAgICAgICAgLCBLRVlBTEwpCitBTElBUygiX19hc21fXyIgICAgICAsIGFzbSAgICAgICAgLCBLRVlBTEwpCitBTElBUygiX19hdHRyaWJ1dGVfXyIsIF9fYXR0cmlidXRlLCBLRVlBTEwpCitBTElBUygiX19jb21wbGV4IiAgICAsIF9Db21wbGV4ICAgLCBLRVlBTEwpCitBTElBUygiX19jb21wbGV4X18iICAsIF9Db21wbGV4ICAgLCBLRVlBTEwpCitBTElBUygiX19jb25zdCIgICAgICAsIGNvbnN0ICAgICAgLCBLRVlBTEwpCitBTElBUygiX19jb25zdF9fIiAgICAsIGNvbnN0ICAgICAgLCBLRVlBTEwpCitBTElBUygiX19kZWNsdHlwZSIgICAsIGRlY2x0eXBlICAgLCBLRVlDWFgpCitBTElBUygiX19pbWFnX18iICAgICAsIF9faW1hZyAgICAgLCBLRVlBTEwpCitBTElBUygiX19pbmxpbmUiICAgICAsIGlubGluZSAgICAgLCBLRVlBTEwpCitBTElBUygiX19pbmxpbmVfXyIgICAsIGlubGluZSAgICAgLCBLRVlBTEwpCitBTElBUygiX19udWxscHRyIiAgICAsIG51bGxwdHIgICAgLCBLRVlDWFgpCitBTElBUygiX19yZWFsX18iICAgICAsIF9fcmVhbCAgICAgLCBLRVlBTEwpCitBTElBUygiX19yZXN0cmljdCIgICAsIHJlc3RyaWN0ICAgLCBLRVlBTEwpCitBTElBUygiX19yZXN0cmljdF9fIiAsIHJlc3RyaWN0ICAgLCBLRVlBTEwpCitBTElBUygiX19zaWduZWQiICAgICAsIHNpZ25lZCAgICAgLCBLRVlBTEwpCitBTElBUygiX19zaWduZWRfXyIgICAsIHNpZ25lZCAgICAgLCBLRVlBTEwpCitBTElBUygiX190eXBlb2YiICAgICAsIHR5cGVvZiAgICAgLCBLRVlBTEwpCitBTElBUygiX190eXBlb2ZfXyIgICAsIHR5cGVvZiAgICAgLCBLRVlBTEwpCitBTElBUygiX192b2xhdGlsZSIgICAsIHZvbGF0aWxlICAgLCBLRVlBTEwpCitBTElBUygiX192b2xhdGlsZV9fIiAsIHZvbGF0aWxlICAgLCBLRVlBTEwpCisKKy8vIFR5cGUgbnVsbGFiaWxpdHkuCitLRVlXT1JEKF9Ob25udWxsICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKK0tFWVdPUkQoX051bGxhYmxlICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChfTnVsbF91bnNwZWNpZmllZCAgICAgICAgLCBLRVlBTEwpCisKKy8vIE1pY3Jvc29mdCBleHRlbnNpb25zIHdoaWNoIHNob3VsZCBiZSBkaXNhYmxlZCBpbiBzdHJpY3QgY29uZm9ybWFuY2UgbW9kZQorS0VZV09SRChfX3B0cjY0ICAgICAgICAgICAgICAgICAgICAgICAsIEtFWU1TKQorS0VZV09SRChfX3B0cjMyICAgICAgICAgICAgICAgICAgICAgICAsIEtFWU1TKQorS0VZV09SRChfX3NwdHIgICAgICAgICAgICAgICAgICAgICAgICAsIEtFWU1TKQorS0VZV09SRChfX3VwdHIgICAgICAgICAgICAgICAgICAgICAgICAsIEtFWU1TKQorS0VZV09SRChfX3c2NCAgICAgICAgICAgICAgICAgICAgICAgICAsIEtFWU1TKQorS0VZV09SRChfX3V1aWRvZiAgICAgICAgICAgICAgICAgICAgICAsIEtFWU1TIHwgS0VZQk9STEFORCkKK0tFWVdPUkQoX190cnkgICAgICAgICAgICAgICAgICAgICAgICAgLCBLRVlNUyB8IEtFWUJPUkxBTkQpCitLRVlXT1JEKF9fZmluYWxseSAgICAgICAgICAgICAgICAgICAgICwgS0VZTVMgfCBLRVlCT1JMQU5EKQorS0VZV09SRChfX2xlYXZlICAgICAgICAgICAgICAgICAgICAgICAsIEtFWU1TIHwgS0VZQk9STEFORCkKK0tFWVdPUkQoX19pbnQ2NCAgICAgICAgICAgICAgICAgICAgICAgLCBLRVlNUykKK0tFWVdPUkQoX19pZl9leGlzdHMgICAgICAgICAgICAgICAgICAgLCBLRVlNUykKK0tFWVdPUkQoX19pZl9ub3RfZXhpc3RzICAgICAgICAgICAgICAgLCBLRVlNUykKK0tFWVdPUkQoX19zaW5nbGVfaW5oZXJpdGFuY2UgICAgICAgICAgLCBLRVlNUykKK0tFWVdPUkQoX19tdWx0aXBsZV9pbmhlcml0YW5jZSAgICAgICAgLCBLRVlNUykKK0tFWVdPUkQoX192aXJ0dWFsX2luaGVyaXRhbmNlICAgICAgICAgLCBLRVlNUykKK0tFWVdPUkQoX19pbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgLCBLRVlNUykKK0FMSUFTKCJfX2ludDgiICAgICAgICAgICAsIGNoYXIgICAgICAgLCBLRVlNUykKK0FMSUFTKCJfaW50OCIgICAgICAgICAgICAsIGNoYXIgICAgICAgLCBLRVlNUykKK0FMSUFTKCJfX2ludDE2IiAgICAgICAgICAsIHNob3J0ICAgICAgLCBLRVlNUykKK0FMSUFTKCJfaW50MTYiICAgICAgICAgICAsIHNob3J0ICAgICAgLCBLRVlNUykKK0FMSUFTKCJfX2ludDMyIiAgICAgICAgICAsIGludCAgICAgICAgLCBLRVlNUykKK0FMSUFTKCJfaW50MzIiICAgICAgICAgICAsIGludCAgICAgICAgLCBLRVlNUykKK0FMSUFTKCJfaW50NjQiICAgICAgICAgICAsIF9faW50NjQgICAgLCBLRVlNUykKK0FMSUFTKCJfX3djaGFyX3QiICAgICAgICAsIHdjaGFyX3QgICAgLCBLRVlNUykKK0FMSUFTKCJfYXNtIiAgICAgICAgICAgICAsIGFzbSAgICAgICAgLCBLRVlNUykKK0FMSUFTKCJfYWxpZ25vZiIgICAgICAgICAsIF9fYWxpZ25vZiAgLCBLRVlNUykKK0FMSUFTKCJfX2J1aWx0aW5fYWxpZ25vZiIsIF9fYWxpZ25vZiAgLCBLRVlNUykKK0FMSUFTKCJfY2RlY2wiICAgICAgICAgICAsIF9fY2RlY2wgICAgLCBLRVlNUyB8IEtFWUJPUkxBTkQpCitBTElBUygiX2Zhc3RjYWxsIiAgICAgICAgLCBfX2Zhc3RjYWxsICwgS0VZTVMgfCBLRVlCT1JMQU5EKQorQUxJQVMoIl9zdGRjYWxsIiAgICAgICAgICwgX19zdGRjYWxsICAsIEtFWU1TIHwgS0VZQk9STEFORCkKK0FMSUFTKCJfdGhpc2NhbGwiICAgICAgICAsIF9fdGhpc2NhbGwgLCBLRVlNUykKK0FMSUFTKCJfdmVjdG9yY2FsbCIgICAgICAsIF9fdmVjdG9yY2FsbCwgS0VZTVMpCitBTElBUygiX3V1aWRvZiIgICAgICAgICAgLCBfX3V1aWRvZiAgICwgS0VZTVMgfCBLRVlCT1JMQU5EKQorQUxJQVMoIl9pbmxpbmUiICAgICAgICAgICwgaW5saW5lICAgICAsIEtFWU1TKQorQUxJQVMoIl9kZWNsc3BlYyIgICAgICAgICwgX19kZWNsc3BlYyAsIEtFWU1TKQorCisvLyBCb3JsYW5kIEV4dGVuc2lvbnMgd2hpY2ggc2hvdWxkIGJlIGRpc2FibGVkIGluIHN0cmljdCBjb25mb3JtYW5jZSBtb2RlLgorQUxJQVMoIl9wYXNjYWwiICAgICAgLCBfX3Bhc2NhbCAgICwgS0VZQk9STEFORCkKKworLy8gQ2xhbmcgRXh0ZW5zaW9ucy4KK0tFWVdPUkQoX19idWlsdGluX2NvbnZlcnR2ZWN0b3IgICAsIEtFWUFMTCkKK0FMSUFTKCJfX2NoYXIxNl90IiAgICwgY2hhcjE2X3QgICAsIEtFWUNYWCkKK0FMSUFTKCJfX2NoYXIzMl90IiAgICwgY2hhcjMyX3QgICAsIEtFWUNYWCkKKworS0VZV09SRChfX2J1aWx0aW5fYXZhaWxhYmxlICAgICAgICwgS0VZQUxMKQorCisvLyBDbGFuZy1zcGVjaWZpYyBrZXl3b3JkcyBlbmFibGVkIG9ubHkgaW4gdGVzdGluZy4KK1RFU1RJTkdfS0VZV09SRChfX3Vua25vd25fYW55dHlwZSAsIEtFWUFMTCkKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gT2JqZWN0aXZlLUMgQC1wcmVjZWRlZCBrZXl3b3Jkcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFRoZXNlIGhhdmUgbWVhbmluZyBhZnRlciBhbiAnQCcgaW4gT2JqZWN0aXZlLUMgbW9kZS4gVGhlc2UgZGVmaW5lIGVudW1zIGluCisvLyB0aGUgdG9rOjpvYmpjXyogbmFtZXNwYWNlLgorCitPQkpDMV9BVF9LRVlXT1JEKG5vdF9rZXl3b3JkKQorT0JKQzFfQVRfS0VZV09SRChjbGFzcykKK09CSkMxX0FUX0tFWVdPUkQoY29tcGF0aWJpbGl0eV9hbGlhcykKK09CSkMxX0FUX0tFWVdPUkQoZGVmcykKK09CSkMxX0FUX0tFWVdPUkQoZW5jb2RlKQorT0JKQzFfQVRfS0VZV09SRChlbmQpCitPQkpDMV9BVF9LRVlXT1JEKGltcGxlbWVudGF0aW9uKQorT0JKQzFfQVRfS0VZV09SRChpbnRlcmZhY2UpCitPQkpDMV9BVF9LRVlXT1JEKHByaXZhdGUpCitPQkpDMV9BVF9LRVlXT1JEKHByb3RlY3RlZCkKK09CSkMxX0FUX0tFWVdPUkQocHJvdG9jb2wpCitPQkpDMV9BVF9LRVlXT1JEKHB1YmxpYykKK09CSkMxX0FUX0tFWVdPUkQoc2VsZWN0b3IpCitPQkpDMV9BVF9LRVlXT1JEKHRocm93KQorT0JKQzFfQVRfS0VZV09SRCh0cnkpCitPQkpDMV9BVF9LRVlXT1JEKGNhdGNoKQorT0JKQzFfQVRfS0VZV09SRChmaW5hbGx5KQorT0JKQzFfQVRfS0VZV09SRChzeW5jaHJvbml6ZWQpCitPQkpDMV9BVF9LRVlXT1JEKGF1dG9yZWxlYXNlcG9vbCkKKworT0JKQzJfQVRfS0VZV09SRChwcm9wZXJ0eSkKK09CSkMyX0FUX0tFWVdPUkQocGFja2FnZSkKK09CSkMyX0FUX0tFWVdPUkQocmVxdWlyZWQpCitPQkpDMl9BVF9LRVlXT1JEKG9wdGlvbmFsKQorT0JKQzJfQVRfS0VZV09SRChzeW50aGVzaXplKQorT0JKQzJfQVRfS0VZV09SRChkeW5hbWljKQorT0JKQzJfQVRfS0VZV09SRChpbXBvcnQpCitPQkpDMl9BVF9LRVlXT1JEKGF2YWlsYWJsZSkKKworLy8gVE9ETzogV2hhdCB0byBkbyBhYm91dCBjb250ZXh0LXNlbnNpdGl2ZSBrZXl3b3JkcyBsaWtlOgorLy8gICAgICAgYnljb3B5L2J5cmVmL2luL2lub3V0L29uZXdheS9vdXQ/CisKK0FOTk9UQVRJT04oY3h4c2NvcGUpICAgICAvLyBhbm5vdGF0aW9uIGZvciBhIEMrKyBzY29wZSBzcGVjLCBlLmcuICI6OmZvbzo6YmFyOjoiCitBTk5PVEFUSU9OKHR5cGVuYW1lKSAgICAgLy8gYW5ub3RhdGlvbiBmb3IgYSBDIHR5cGVkZWYgbmFtZSwgYSBDKysgKHBvc3NpYmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVhbGlmaWVkKSB0eXBlbmFtZSwgZS5nLiAiZm9vOjpNeUNsYXNzIiwgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wbGF0ZS1pZCB0aGF0IG5hbWVzIGEgdHlwZSAoInN0ZDo6dmVjdG9yPGludD4iKQorQU5OT1RBVElPTih0ZW1wbGF0ZV9pZCkgIC8vIGFubm90YXRpb24gZm9yIGEgQysrIHRlbXBsYXRlLWlkIHRoYXQgbmFtZXMgYQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIChub3QgYSB0eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuLCAic3RkOjpzd2FwPGludD4iCitBTk5PVEFUSU9OKHByaW1hcnlfZXhwcikgLy8gYW5ub3RhdGlvbiBmb3IgYSBwcmltYXJ5IGV4cHJlc3Npb24KK0FOTk9UQVRJT04oZGVjbHR5cGUpICAgICAvLyBhbm5vdGF0aW9uIGZvciBhIGRlY2x0eXBlIGV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiwgImRlY2x0eXBlKGZvby5iYXIoKSkiCisKKy8vIEFubm90YXRpb24gZm9yICNwcmFnbWEgdW51c2VkKC4uLikKKy8vIEZvciBlYWNoIGFyZ3VtZW50IGluc2lkZSB0aGUgcGFyZW50aGVzZXMgdGhlIHByYWdtYSBoYW5kbGVyIHdpbGwgcHJvZHVjZQorLy8gb25lICdwcmFnbWFfdW51c2VkJyBhbm5vdGF0aW9uIHRva2VuIGZvbGxvd2VkIGJ5IHRoZSBhcmd1bWVudCB0b2tlbi4KK0FOTk9UQVRJT04ocHJhZ21hX3VudXNlZCkKKworLy8gQW5ub3RhdGlvbiBmb3IgI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eS4uLgorLy8gVGhlIGxleGVyIHByb2R1Y2VzIHRoZXNlIHNvIHRoYXQgdGhleSBvbmx5IHRha2UgZWZmZWN0IHdoZW4gdGhlIHBhcnNlcgorLy8gaGFuZGxlcyB0aGVtLgorQU5OT1RBVElPTihwcmFnbWFfdmlzKQorCisvLyBBbm5vdGF0aW9uIGZvciAjcHJhZ21hIHBhY2suLi4KKy8vIFRoZSBsZXhlciBwcm9kdWNlcyB0aGVzZSBzbyB0aGF0IHRoZXkgb25seSB0YWtlIGVmZmVjdCB3aGVuIHRoZSBwYXJzZXIKKy8vIGhhbmRsZXMgdGhlbS4KK0FOTk9UQVRJT04ocHJhZ21hX3BhY2spCisKKy8vIEFubm90YXRpb24gZm9yICNwcmFnbWEgY2xhbmcgX19kZWJ1ZyBwYXJzZXJfY3Jhc2guLi4KKy8vIFRoZSBsZXhlciBwcm9kdWNlcyB0aGVzZSBzbyB0aGF0IHRoZXkgb25seSB0YWtlIGVmZmVjdCB3aGVuIHRoZSBwYXJzZXIKKy8vIGhhbmRsZXMgdGhlbS4KK0FOTk9UQVRJT04ocHJhZ21hX3BhcnNlcl9jcmFzaCkKKworLy8gQW5ub3RhdGlvbiBmb3IgI3ByYWdtYSBjbGFuZyBfX2RlYnVnIGNhcHR1cmVkLi4uCisvLyBUaGUgbGV4ZXIgcHJvZHVjZXMgdGhlc2Ugc28gdGhhdCB0aGV5IG9ubHkgdGFrZSBlZmZlY3Qgd2hlbiB0aGUgcGFyc2VyCisvLyBoYW5kbGVzIHRoZW0uCitBTk5PVEFUSU9OKHByYWdtYV9jYXB0dXJlZCkKKworLy8gQW5ub3RhdGlvbiBmb3IgI3ByYWdtYSBjbGFuZyBfX2RlYnVnIGR1bXAuLi4KKy8vIFRoZSBsZXhlciBwcm9kdWNlcyB0aGVzZSBzbyB0aGF0IHRoZSBwYXJzZXIgYW5kIHNlbWFudGljIGFuYWx5c2lzIGNhbgorLy8gbG9vayB1cCBhbmQgZHVtcCB0aGUgb3BlcmFuZC4KK0FOTk9UQVRJT04ocHJhZ21hX2R1bXApCisKKy8vIEFubm90YXRpb24gZm9yICNwcmFnbWEgbXNfc3RydWN0Li4uCisvLyBUaGUgbGV4ZXIgcHJvZHVjZXMgdGhlc2Ugc28gdGhhdCB0aGV5IG9ubHkgdGFrZSBlZmZlY3Qgd2hlbiB0aGUgcGFyc2VyCisvLyBoYW5kbGVzIHRoZW0uCitBTk5PVEFUSU9OKHByYWdtYV9tc3N0cnVjdCkKKworLy8gQW5ub3RhdGlvbiBmb3IgI3ByYWdtYSBhbGlnbi4uLgorLy8gVGhlIGxleGVyIHByb2R1Y2VzIHRoZXNlIHNvIHRoYXQgdGhleSBvbmx5IHRha2UgZWZmZWN0IHdoZW4gdGhlIHBhcnNlcgorLy8gaGFuZGxlcyB0aGVtLgorQU5OT1RBVElPTihwcmFnbWFfYWxpZ24pCisKKy8vIEFubm90YXRpb24gZm9yICNwcmFnbWEgd2VhayBpZAorLy8gVGhlIGxleGVyIHByb2R1Y2VzIHRoZXNlIHNvIHRoYXQgdGhleSBvbmx5IHRha2UgZWZmZWN0IHdoZW4gdGhlIHBhcnNlcgorLy8gaGFuZGxlcyB0aGVtLgorQU5OT1RBVElPTihwcmFnbWFfd2VhaykKKworLy8gQW5ub3RhdGlvbiBmb3IgI3ByYWdtYSB3ZWFrIGlkID0gaWQKKy8vIFRoZSBsZXhlciBwcm9kdWNlcyB0aGVzZSBzbyB0aGF0IHRoZXkgb25seSB0YWtlIGVmZmVjdCB3aGVuIHRoZSBwYXJzZXIKKy8vIGhhbmRsZXMgdGhlbS4KK0FOTk9UQVRJT04ocHJhZ21hX3dlYWthbGlhcykKKworLy8gQW5ub3RhdGlvbiBmb3IgI3ByYWdtYSByZWRlZmluZV9leHRuYW1lLi4uCisvLyBUaGUgbGV4ZXIgcHJvZHVjZXMgdGhlc2Ugc28gdGhhdCB0aGV5IG9ubHkgdGFrZSBlZmZlY3Qgd2hlbiB0aGUgcGFyc2VyCisvLyBoYW5kbGVzIHRoZW0uCitBTk5PVEFUSU9OKHByYWdtYV9yZWRlZmluZV9leHRuYW1lKQorCisvLyBBbm5vdGF0aW9uIGZvciAjcHJhZ21hIFNUREMgRlBfQ09OVFJBQ1QuLi4KKy8vIFRoZSBsZXhlciBwcm9kdWNlcyB0aGVzZSBzbyB0aGF0IHRoZXkgb25seSB0YWtlIGVmZmVjdCB3aGVuIHRoZSBwYXJzZXIKKy8vIGhhbmRsZXMgdGhlbS4KK0FOTk9UQVRJT04ocHJhZ21hX2ZwX2NvbnRyYWN0KQorCisvLyBBbm5vdGF0aW9uIGZvciAjcHJhZ21hIHBvaW50ZXJzX3RvX21lbWJlcnMuLi4KKy8vIFRoZSBsZXhlciBwcm9kdWNlcyB0aGVzZSBzbyB0aGF0IHRoZXkgb25seSB0YWtlIGVmZmVjdCB3aGVuIHRoZSBwYXJzZXIKKy8vIGhhbmRsZXMgdGhlbS4KK0FOTk9UQVRJT04ocHJhZ21hX21zX3BvaW50ZXJzX3RvX21lbWJlcnMpCisKKy8vIEFubm90YXRpb24gZm9yICNwcmFnbWEgdnRvcmRpc3AuLi4KKy8vIFRoZSBsZXhlciBwcm9kdWNlcyB0aGVzZSBzbyB0aGF0IHRoZXkgb25seSB0YWtlIGVmZmVjdCB3aGVuIHRoZSBwYXJzZXIKKy8vIGhhbmRsZXMgdGhlbS4KK0FOTk9UQVRJT04ocHJhZ21hX21zX3Z0b3JkaXNwKQorCisvLyBBbm5vdGF0aW9uIGZvciBhbGwgbWljcm9zb2Z0ICNwcmFnbWFzLi4uCisvLyBUaGUgbGV4ZXIgcHJvZHVjZXMgdGhlc2Ugc28gdGhhdCB0aGV5IG9ubHkgdGFrZSBlZmZlY3Qgd2hlbiB0aGUgcGFyc2VyCisvLyBoYW5kbGVzIHRoZW0uCitBTk5PVEFUSU9OKHByYWdtYV9tc19wcmFnbWEpCisKKy8vIEFubm90YXRpb24gZm9yICNwcmFnbWEgT1BFTkNMIEVYVEVOU0lPTi4uLgorLy8gVGhlIGxleGVyIHByb2R1Y2VzIHRoZXNlIHNvIHRoYXQgdGhleSBvbmx5IHRha2UgZWZmZWN0IHdoZW4gdGhlIHBhcnNlcgorLy8gaGFuZGxlcyB0aGVtLgorQU5OT1RBVElPTihwcmFnbWFfb3BlbmNsX2V4dGVuc2lvbikKKworLy8gQW5ub3RhdGlvbnMgZm9yIE9wZW5NUCBwcmFnbWEgZGlyZWN0aXZlcyAtICNwcmFnbWEgb21wIC4uLgorLy8gVGhlIGxleGVyIHByb2R1Y2VzIHRoZXNlIHNvIHRoYXQgdGhleSBvbmx5IHRha2UgZWZmZWN0IHdoZW4gdGhlIHBhcnNlcgorLy8gaGFuZGxlcyAjcHJhZ21hIG9tcCAuLi4gZGlyZWN0aXZlcy4KK0FOTk9UQVRJT04ocHJhZ21hX29wZW5tcCkKK0FOTk9UQVRJT04ocHJhZ21hX29wZW5tcF9lbmQpCisKKy8vIEFubm90YXRpb25zIGZvciBsb29wIHByYWdtYSBkaXJlY3RpdmVzICNwcmFnbWEgY2xhbmcgbG9vcCAuLi4KKy8vIFRoZSBsZXhlciBwcm9kdWNlcyB0aGVzZSBzbyB0aGF0IHRoZXkgb25seSB0YWtlIGVmZmVjdCB3aGVuIHRoZSBwYXJzZXIKKy8vIGhhbmRsZXMgI3ByYWdtYSBsb29wIC4uLiBkaXJlY3RpdmVzLgorQU5OT1RBVElPTihwcmFnbWFfbG9vcF9oaW50KQorCitBTk5PVEFUSU9OKHByYWdtYV9mcCkKKworLy8gQW5ub3RhdGlvbiBmb3IgdGhlIGF0dHJpYnV0ZSBwcmFnbWEgZGlyZWN0aXZlcyAtICNwcmFnbWEgY2xhbmcgYXR0cmlidXRlIC4uLgorQU5OT1RBVElPTihwcmFnbWFfYXR0cmlidXRlKQorCisvLyBBbm5vdGF0aW9ucyBmb3IgbW9kdWxlIGltcG9ydCB0cmFuc2xhdGVkIGZyb20gI2luY2x1ZGUgZXRjLgorQU5OT1RBVElPTihtb2R1bGVfaW5jbHVkZSkKK0FOTk9UQVRJT04obW9kdWxlX2JlZ2luKQorQU5OT1RBVElPTihtb2R1bGVfZW5kKQorCisjdW5kZWYgQU5OT1RBVElPTgorI3VuZGVmIFRFU1RJTkdfS0VZV09SRAorI3VuZGVmIE9CSkMyX0FUX0tFWVdPUkQKKyN1bmRlZiBPQkpDMV9BVF9LRVlXT1JECisjdW5kZWYgQ1hYX0tFWVdPUkRfT1BFUkFUT1IKKyN1bmRlZiBQUEtFWVdPUkQKKyN1bmRlZiBBTElBUworI3VuZGVmIFRZUEVfVFJBSVRfTgorI3VuZGVmIFRZUEVfVFJBSVRfMgorI3VuZGVmIFRZUEVfVFJBSVRfMQorI3VuZGVmIFRZUEVfVFJBSVQKKyN1bmRlZiBDT05DRVBUU19LRVlXT1JECisjdW5kZWYgQ1hYMkFfS0VZV09SRAorI3VuZGVmIENYWDExX0tFWVdPUkQKKyN1bmRlZiBLRVlXT1JECisjdW5kZWYgUFVOQ1RVQVRPUgorI3VuZGVmIFRPSwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvVG9rZW5LaW5kcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvVG9rZW5LaW5kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZWNiM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9Ub2tlbktpbmRzLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8vPT09LS0tIFRva2VuS2luZHMuaCAtIEVudW0gdmFsdWVzIGZvciBDIFRva2VuIEtpbmRzIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHRoZSBjbGFuZzo6VG9rZW5LaW5kIGVudW0gYW5kIHN1cHBvcnQgZnVuY3Rpb25zLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfVE9LRU5LSU5EU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfVE9LRU5LSU5EU19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworbmFtZXNwYWNlIHRvayB7CisKKy8vLyBcYnJpZWYgUHJvdmlkZXMgYSBzaW1wbGUgdW5pZm9ybSBuYW1lc3BhY2UgZm9yIHRva2VucyBmcm9tIGFsbCBDIGxhbmd1YWdlcy4KK2VudW0gVG9rZW5LaW5kIDogdW5zaWduZWQgc2hvcnQgeworI2RlZmluZSBUT0soWCkgWCwKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Ub2tlbktpbmRzLmRlZiIKKyAgTlVNX1RPS0VOUworfTsKKworLy8vIFxicmllZiBQcm92aWRlcyBhIG5hbWVzcGFjZSBmb3IgcHJlcHJvY2Vzc29yIGtleXdvcmRzIHdoaWNoIHN0YXJ0IHdpdGggYQorLy8vICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLgorZW51bSBQUEtleXdvcmRLaW5kIHsKKyNkZWZpbmUgUFBLRVlXT1JEKFgpIHBwXyMjWCwKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Ub2tlbktpbmRzLmRlZiIKKyAgTlVNX1BQX0tFWVdPUkRTCit9OworCisvLy8gXGJyaWVmIFByb3ZpZGVzIGEgbmFtZXNwYWNlIGZvciBPYmplY3RpdmUtQyBrZXl3b3JkcyB3aGljaCBzdGFydCB3aXRoCisvLy8gYW4gJ0AnLgorZW51bSBPYmpDS2V5d29yZEtpbmQgeworI2RlZmluZSBPQkpDMV9BVF9LRVlXT1JEKFgpIG9iamNfIyNYLAorI2RlZmluZSBPQkpDMl9BVF9LRVlXT1JEKFgpIG9iamNfIyNYLAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Rva2VuS2luZHMuZGVmIgorICBOVU1fT0JKQ19LRVlXT1JEUworfTsKKworLy8vIFxicmllZiBEZWZpbmVzIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgYW4gb24tb2ZmLXN3aXRjaCAoQzk5IDYuMTAuNnAyKS4KK2VudW0gT25PZmZTd2l0Y2ggeworICBPT1NfT04sIE9PU19PRkYsIE9PU19ERUZBVUxUCit9OworCisvLy8gXGJyaWVmIERldGVybWluZXMgdGhlIG5hbWUgb2YgYSB0b2tlbiBhcyB1c2VkIHdpdGhpbiB0aGUgZnJvbnQgZW5kLgorLy8vCisvLy8gVGhlIG5hbWUgb2YgYSB0b2tlbiB3aWxsIGJlIGFuIGludGVybmFsIG5hbWUgKHN1Y2ggYXMgImxfc3F1YXJlIikKKy8vLyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgZGlhZ25vc3RpYyBtZXNzYWdlcy4KK2NvbnN0IGNoYXIgKmdldFRva2VuTmFtZShUb2tlbktpbmQgS2luZCkgTExWTV9SRUFETk9ORTsKKworLy8vIFxicmllZiBEZXRlcm1pbmVzIHRoZSBzcGVsbGluZyBvZiBzaW1wbGUgcHVuY3R1YXRpb24gdG9rZW5zIGxpa2UKKy8vLyAnIScgb3IgJyUnLCBhbmQgcmV0dXJucyBOVUxMIGZvciBsaXRlcmFsIGFuZCBhbm5vdGF0aW9uIHRva2Vucy4KKy8vLworLy8vIFRoaXMgcm91dGluZSBvbmx5IHJldHJpZXZlcyB0aGUgInNpbXBsZSIgc3BlbGxpbmcgb2YgdGhlIHRva2VuLAorLy8vIGFuZCB3aWxsIG5vdCBwcm9kdWNlIGFueSBhbHRlcm5hdGl2ZSBzcGVsbGluZ3MgKGUuZy4sIGEKKy8vLyBkaWdyYXBoKS4gRm9yIHRoZSBhY3R1YWwgc3BlbGxpbmcgb2YgYSBnaXZlbiBUb2tlbiwgdXNlCisvLy8gUHJlcHJvY2Vzc29yOjpnZXRTcGVsbGluZygpLgorY29uc3QgY2hhciAqZ2V0UHVuY3R1YXRvclNwZWxsaW5nKFRva2VuS2luZCBLaW5kKSBMTFZNX1JFQUROT05FOworCisvLy8gXGJyaWVmIERldGVybWluZXMgdGhlIHNwZWxsaW5nIG9mIHNpbXBsZSBrZXl3b3JkIGFuZCBjb250ZXh0dWFsIGtleXdvcmQKKy8vLyB0b2tlbnMgbGlrZSAnaW50JyBhbmQgJ2R5bmFtaWNfY2FzdCcuIFJldHVybnMgTlVMTCBmb3Igb3RoZXIgdG9rZW4ga2luZHMuCitjb25zdCBjaGFyICpnZXRLZXl3b3JkU3BlbGxpbmcoVG9rZW5LaW5kIEtpbmQpIExMVk1fUkVBRE5PTkU7CisKKy8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHJhdyBpZGVudGlmaWVyIG9yIGFuIGlkZW50aWZpZXIga2luZC4KK2lubGluZSBib29sIGlzQW55SWRlbnRpZmllcihUb2tlbktpbmQgSykgeworICByZXR1cm4gKEsgPT0gdG9rOjppZGVudGlmaWVyKSB8fCAoSyA9PSB0b2s6OnJhd19pZGVudGlmaWVyKTsKK30KKworLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgQyBvciBDKysgc3RyaW5nLWxpdGVyYWwgKG9yCisvLy8gQysrMTEgdXNlci1kZWZpbmVkLXN0cmluZy1saXRlcmFsKSB0b2tlbi4KK2lubGluZSBib29sIGlzU3RyaW5nTGl0ZXJhbChUb2tlbktpbmQgSykgeworICByZXR1cm4gSyA9PSB0b2s6OnN0cmluZ19saXRlcmFsIHx8IEsgPT0gdG9rOjp3aWRlX3N0cmluZ19saXRlcmFsIHx8CisgICAgICAgICBLID09IHRvazo6dXRmOF9zdHJpbmdfbGl0ZXJhbCB8fCBLID09IHRvazo6dXRmMTZfc3RyaW5nX2xpdGVyYWwgfHwKKyAgICAgICAgIEsgPT0gdG9rOjp1dGYzMl9zdHJpbmdfbGl0ZXJhbDsKK30KKworLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgImxpdGVyYWwiIGtpbmQsIGxpa2UgYSBudW1lcmljCisvLy8gY29uc3RhbnQsIHN0cmluZywgZXRjLgoraW5saW5lIGJvb2wgaXNMaXRlcmFsKFRva2VuS2luZCBLKSB7CisgIHJldHVybiBLID09IHRvazo6bnVtZXJpY19jb25zdGFudCB8fCBLID09IHRvazo6Y2hhcl9jb25zdGFudCB8fAorICAgICAgICAgSyA9PSB0b2s6OndpZGVfY2hhcl9jb25zdGFudCB8fCBLID09IHRvazo6dXRmOF9jaGFyX2NvbnN0YW50IHx8CisgICAgICAgICBLID09IHRvazo6dXRmMTZfY2hhcl9jb25zdGFudCB8fCBLID09IHRvazo6dXRmMzJfY2hhcl9jb25zdGFudCB8fAorICAgICAgICAgaXNTdHJpbmdMaXRlcmFsKEspIHx8IEsgPT0gdG9rOjphbmdsZV9zdHJpbmdfbGl0ZXJhbDsKK30KKworLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFueSBvZiB0b2s6OmFubm90Xyoga2luZHMuCitpbmxpbmUgYm9vbCBpc0Fubm90YXRpb24oVG9rZW5LaW5kIEspIHsKKyNkZWZpbmUgQU5OT1RBVElPTihOQU1FKSBcCisgIGlmIChLID09IHRvazo6YW5ub3RfIyNOQU1FKSBcCisgICAgcmV0dXJuIHRydWU7CisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVG9rZW5LaW5kcy5kZWYiCisgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZSB0b2sKK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9UeXBlVHJhaXRzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9UeXBlVHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5ZThiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1R5cGVUcmFpdHMuaApAQCAtMCwwICsxLDEwNSBAQAorLy89PT0tLS0gVHlwZVRyYWl0cy5oIC0gQysrIFR5cGUgVHJhaXRzIFN1cHBvcnQgRW51bWVyYXRpb25zIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgZW51bWVyYXRpb25zIGZvciB0aGUgdHlwZSB0cmFpdHMgc3VwcG9ydC4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX1RZUEVUUkFJVFNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX1RZUEVUUkFJVFNfSAorCituYW1lc3BhY2UgY2xhbmcgeworCisgIC8vLyBcYnJpZWYgTmFtZXMgZm9yIHRyYWl0cyB0aGF0IG9wZXJhdGUgc3BlY2lmaWNhbGx5IG9uIHR5cGVzLgorICBlbnVtIFR5cGVUcmFpdCB7CisgICAgVVRUX0hhc05vdGhyb3dBc3NpZ24sCisgICAgVVRUX0hhc05vdGhyb3dNb3ZlQXNzaWduLAorICAgIFVUVF9IYXNOb3Rocm93Q29weSwKKyAgICBVVFRfSGFzTm90aHJvd0NvbnN0cnVjdG9yLAorICAgIFVUVF9IYXNUcml2aWFsQXNzaWduLAorICAgIFVUVF9IYXNUcml2aWFsTW92ZUFzc2lnbiwKKyAgICBVVFRfSGFzVHJpdmlhbENvcHksCisgICAgVVRUX0hhc1RyaXZpYWxEZWZhdWx0Q29uc3RydWN0b3IsCisgICAgVVRUX0hhc1RyaXZpYWxNb3ZlQ29uc3RydWN0b3IsCisgICAgVVRUX0hhc1RyaXZpYWxEZXN0cnVjdG9yLAorICAgIFVUVF9IYXNWaXJ0dWFsRGVzdHJ1Y3RvciwKKyAgICBVVFRfSXNBYnN0cmFjdCwKKyAgICBVVFRfSXNBZ2dyZWdhdGUsCisgICAgVVRUX0lzQXJpdGhtZXRpYywKKyAgICBVVFRfSXNBcnJheSwKKyAgICBVVFRfSXNDbGFzcywKKyAgICBVVFRfSXNDb21wbGV0ZVR5cGUsCisgICAgVVRUX0lzQ29tcG91bmQsCisgICAgVVRUX0lzQ29uc3QsCisgICAgVVRUX0lzRGVzdHJ1Y3RpYmxlLAorICAgIFVUVF9Jc0VtcHR5LAorICAgIFVUVF9Jc0VudW0sCisgICAgVVRUX0lzRmluYWwsCisgICAgVVRUX0lzRmxvYXRpbmdQb2ludCwKKyAgICBVVFRfSXNGdW5jdGlvbiwKKyAgICBVVFRfSXNGdW5kYW1lbnRhbCwKKyAgICBVVFRfSXNJbnRlZ3JhbCwKKyAgICBVVFRfSXNJbnRlcmZhY2VDbGFzcywKKyAgICBVVFRfSXNMaXRlcmFsLAorICAgIFVUVF9Jc0x2YWx1ZVJlZmVyZW5jZSwKKyAgICBVVFRfSXNNZW1iZXJGdW5jdGlvblBvaW50ZXIsCisgICAgVVRUX0lzTWVtYmVyT2JqZWN0UG9pbnRlciwKKyAgICBVVFRfSXNNZW1iZXJQb2ludGVyLAorICAgIFVUVF9Jc05vdGhyb3dEZXN0cnVjdGlibGUsCisgICAgVVRUX0lzT2JqZWN0LAorICAgIFVUVF9Jc1BPRCwKKyAgICBVVFRfSXNQb2ludGVyLAorICAgIFVUVF9Jc1BvbHltb3JwaGljLAorICAgIFVUVF9Jc1JlZmVyZW5jZSwKKyAgICBVVFRfSXNSdmFsdWVSZWZlcmVuY2UsCisgICAgVVRUX0lzU2NhbGFyLAorICAgIFVUVF9Jc1NlYWxlZCwKKyAgICBVVFRfSXNTaWduZWQsCisgICAgVVRUX0lzU3RhbmRhcmRMYXlvdXQsCisgICAgVVRUX0lzVHJpdmlhbCwKKyAgICBVVFRfSXNUcml2aWFsbHlDb3B5YWJsZSwKKyAgICBVVFRfSXNUcml2aWFsbHlEZXN0cnVjdGlibGUsCisgICAgVVRUX0lzVW5pb24sCisgICAgVVRUX0lzVW5zaWduZWQsCisgICAgVVRUX0lzVm9pZCwKKyAgICBVVFRfSXNWb2xhdGlsZSwKKyAgICBVVFRfSGFzVW5pcXVlT2JqZWN0UmVwcmVzZW50YXRpb25zLAorICAgIFVUVF9MYXN0ID0gVVRUX0hhc1VuaXF1ZU9iamVjdFJlcHJlc2VudGF0aW9ucywKKyAgICBCVFRfSXNCYXNlT2YsCisgICAgQlRUX0lzQ29udmVydGlibGUsCisgICAgQlRUX0lzQ29udmVydGlibGVUbywKKyAgICBCVFRfSXNTYW1lLAorICAgIEJUVF9UeXBlQ29tcGF0aWJsZSwKKyAgICBCVFRfSXNBc3NpZ25hYmxlLAorICAgIEJUVF9Jc05vdGhyb3dBc3NpZ25hYmxlLAorICAgIEJUVF9Jc1RyaXZpYWxseUFzc2lnbmFibGUsCisgICAgQlRUX1JlZmVyZW5jZUJpbmRzVG9UZW1wb3JhcnksCisgICAgQlRUX0xhc3QgPSBCVFRfUmVmZXJlbmNlQmluZHNUb1RlbXBvcmFyeSwKKyAgICBUVF9Jc0NvbnN0cnVjdGlibGUsCisgICAgVFRfSXNOb3Rocm93Q29uc3RydWN0aWJsZSwKKyAgICBUVF9Jc1RyaXZpYWxseUNvbnN0cnVjdGlibGUKKyAgfTsKKworICAvLy8gXGJyaWVmIE5hbWVzIGZvciB0aGUgYXJyYXkgdHlwZSB0cmFpdHMuCisgIGVudW0gQXJyYXlUeXBlVHJhaXQgeworICAgIEFUVF9BcnJheVJhbmssCisgICAgQVRUX0FycmF5RXh0ZW50CisgIH07CisKKyAgLy8vIFxicmllZiBOYW1lcyBmb3IgdGhlICJleHByZXNzaW9uIG9yIHR5cGUiIHRyYWl0cy4KKyAgZW51bSBVbmFyeUV4cHJPclR5cGVUcmFpdCB7CisgICAgVUVUVF9TaXplT2YsCisgICAgVUVUVF9BbGlnbk9mLAorICAgIFVFVFRfVmVjU3RlcCwKKyAgICBVRVRUX09wZW5NUFJlcXVpcmVkU2ltZEFsaWduLAorICB9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ZlcnNpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2RjZjkyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvVmVyc2lvbi5oCkBAIC0wLDAgKzEsNjIgQEAKKy8vPT09LSBWZXJzaW9uLmggLSBDbGFuZyBWZXJzaW9uIE51bWJlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHZlcnNpb24gbWFjcm9zIGFuZCB2ZXJzaW9uLXJlbGF0ZWQgdXRpbGl0eSBmdW5jdGlvbnMKKy8vLyBmb3IgQ2xhbmcuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19WRVJTSU9OX0gKKyNkZWZpbmUgTExWTV9DTEFOR19CQVNJQ19WRVJTSU9OX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1ZlcnNpb24uaW5jIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorCituYW1lc3BhY2UgY2xhbmcgeworICAvLy8gXGJyaWVmIFJldHJpZXZlcyB0aGUgcmVwb3NpdG9yeSBwYXRoIChlLmcuLCBTdWJ2ZXJzaW9uIHBhdGgpIHRoYXQKKyAgLy8vIGlkZW50aWZpZXMgdGhlIHBhcnRpY3VsYXIgQ2xhbmcgYnJhbmNoLCB0YWcsIG9yIHRydW5rIGZyb20gd2hpY2ggdGhpcworICAvLy8gQ2xhbmcgd2FzIGJ1aWx0LgorICBzdGQ6OnN0cmluZyBnZXRDbGFuZ1JlcG9zaXRvcnlQYXRoKCk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZXMgdGhlIHJlcG9zaXRvcnkgcGF0aCBmcm9tIHdoaWNoIExMVk0gd2FzIGJ1aWx0LgorICAvLy8KKyAgLy8vIFRoaXMgc3VwcG9ydHMgTExWTSByZXNpZGluZyBpbiBhIHNlcGFyYXRlIHJlcG9zaXRvcnkgZnJvbSBjbGFuZy4KKyAgc3RkOjpzdHJpbmcgZ2V0TExWTVJlcG9zaXRvcnlQYXRoKCk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZXMgdGhlIHJlcG9zaXRvcnkgcmV2aXNpb24gbnVtYmVyIChvciBpZGVudGlmZXIpIGZyb20gd2hpY2gKKyAgLy8vIHRoaXMgQ2xhbmcgd2FzIGJ1aWx0LgorICBzdGQ6OnN0cmluZyBnZXRDbGFuZ1JldmlzaW9uKCk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZXMgdGhlIHJlcG9zaXRvcnkgcmV2aXNpb24gbnVtYmVyIChvciBpZGVudGlmZXIpIGZyb20gd2hpY2gKKyAgLy8vIExMVk0gd2FzIGJ1aWx0LgorICAvLy8KKyAgLy8vIElmIENsYW5nIGFuZCBMTFZNIGFyZSBpbiB0aGUgc2FtZSByZXBvc2l0b3J5LCB0aGlzIHJldHVybnMgdGhlIHNhbWUKKyAgLy8vIHN0cmluZyBhcyBnZXRDbGFuZ1JldmlzaW9uLgorICBzdGQ6OnN0cmluZyBnZXRMTFZNUmV2aXNpb24oKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlcyB0aGUgZnVsbCByZXBvc2l0b3J5IHZlcnNpb24gdGhhdCBpcyBhbiBhbWFsZ2FtYXRpb24gb2YKKyAgLy8vIHRoZSBpbmZvcm1hdGlvbiBpbiBnZXRDbGFuZ1JlcG9zaXRvcnlQYXRoKCkgYW5kIGdldENsYW5nUmV2aXNpb24oKS4KKyAgc3RkOjpzdHJpbmcgZ2V0Q2xhbmdGdWxsUmVwb3NpdG9yeVZlcnNpb24oKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlcyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvbXBsZXRlIGNsYW5nIHZlcnNpb24sCisgIC8vLyB3aGljaCBpbmNsdWRlcyB0aGUgY2xhbmcgdmVyc2lvbiBudW1iZXIsIHRoZSByZXBvc2l0b3J5IHZlcnNpb24sCisgIC8vLyBhbmQgdGhlIHZlbmRvciB0YWcuCisgIHN0ZDo6c3RyaW5nIGdldENsYW5nRnVsbFZlcnNpb24oKTsKKworICAvLy8gXGJyaWVmIExpa2UgZ2V0Q2xhbmdGdWxsVmVyc2lvbigpLCBidXQgd2l0aCBhIGN1c3RvbSB0b29sIG5hbWUuCisgIHN0ZDo6c3RyaW5nIGdldENsYW5nVG9vbEZ1bGxWZXJzaW9uKGxsdm06OlN0cmluZ1JlZiBUb29sTmFtZSk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb21wbGV0ZSBjbGFuZyB2ZXJzaW9uIHN1aXRhYmxlCisgIC8vLyBmb3IgdXNlIGluIHRoZSBDUFAgX19WRVJTSU9OX18gbWFjcm8sIHdoaWNoIGluY2x1ZGVzIHRoZSBjbGFuZyB2ZXJzaW9uCisgIC8vLyBudW1iZXIsIHRoZSByZXBvc2l0b3J5IHZlcnNpb24sIGFuZCB0aGUgdmVuZG9yIHRhZy4KKyAgc3RkOjpzdHJpbmcgZ2V0Q2xhbmdGdWxsQ1BQVmVyc2lvbigpOworfQorCisjZW5kaWYgLy8gTExWTV9DTEFOR19CQVNJQ19WRVJTSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ZlcnNpb24uaW5jIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvVmVyc2lvbi5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZkNjBmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ZlcnNpb24uaW5jCkBAIC0wLDAgKzEsNSBAQAorI2RlZmluZSBDTEFOR19WRVJTSU9OIDcuMC4yCisjZGVmaW5lIENMQU5HX1ZFUlNJT05fU1RSSU5HICI3LjAuMiIKKyNkZWZpbmUgQ0xBTkdfVkVSU0lPTl9NQUpPUiA3CisjZGVmaW5lIENMQU5HX1ZFUlNJT05fTUlOT1IgMAorI2RlZmluZSBDTEFOR19WRVJTSU9OX1BBVENITEVWRUwgMgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvVmVyc2lvblR1cGxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9WZXJzaW9uVHVwbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTNiMDE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvVmVyc2lvblR1cGxlLmgKQEAgLTAsMCArMSwxNjggQEAKKy8vPT09LSBWZXJzaW9uVHVwbGUuaCAtIFZlcnNpb24gTnVtYmVyIEhhbmRsaW5nIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHRoZSBjbGFuZzo6VmVyc2lvblR1cGxlIGNsYXNzLCB3aGljaCByZXByZXNlbnRzIGEgdmVyc2lvbiBpbgorLy8vIHRoZSBmb3JtIG1ham9yWy5taW5vclsuc3VibWlub3JdXS4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9DTEFOR19CQVNJQ19WRVJTSU9OVFVQTEVfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX1ZFUlNJT05UVVBMRV9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIHZlcnNpb24gbnVtYmVyIGluIHRoZSBmb3JtIG1ham9yWy5taW5vclsuc3VibWlub3JbLmJ1aWxkXV1dLgorY2xhc3MgVmVyc2lvblR1cGxlIHsKKyAgdW5zaWduZWQgTWFqb3IgOiAzMTsKKworICB1bnNpZ25lZCBVc2VzVW5kZXJzY29yZXMgOiAxOworCisgIHVuc2lnbmVkIE1pbm9yIDogMzE7CisgIHVuc2lnbmVkIEhhc01pbm9yIDogMTsKKworICB1bnNpZ25lZCBTdWJtaW5vciA6IDMxOworICB1bnNpZ25lZCBIYXNTdWJtaW5vciA6IDE7CisKKyAgdW5zaWduZWQgQnVpbGQgOiAzMTsKKyAgdW5zaWduZWQgSGFzQnVpbGQgOiAxOworCitwdWJsaWM6CisgIFZlcnNpb25UdXBsZSgpCisgICAgICA6IE1ham9yKDApLCBVc2VzVW5kZXJzY29yZXMoZmFsc2UpLCBNaW5vcigwKSwgSGFzTWlub3IoZmFsc2UpLAorICAgICAgICBTdWJtaW5vcigwKSwgSGFzU3VibWlub3IoZmFsc2UpLCBCdWlsZCgwKSwgSGFzQnVpbGQoZmFsc2UpIHt9CisKKyAgZXhwbGljaXQgVmVyc2lvblR1cGxlKHVuc2lnbmVkIE1ham9yKQorICAgICAgOiBNYWpvcihNYWpvciksIFVzZXNVbmRlcnNjb3JlcyhmYWxzZSksIE1pbm9yKDApLCBIYXNNaW5vcihmYWxzZSksCisgICAgICAgIFN1Ym1pbm9yKDApLCBIYXNTdWJtaW5vcihmYWxzZSksIEJ1aWxkKDApLCBIYXNCdWlsZChmYWxzZSkge30KKworICBleHBsaWNpdCBWZXJzaW9uVHVwbGUodW5zaWduZWQgTWFqb3IsIHVuc2lnbmVkIE1pbm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVc2VzVW5kZXJzY29yZXMgPSBmYWxzZSkKKyAgICAgIDogTWFqb3IoTWFqb3IpLCBVc2VzVW5kZXJzY29yZXMoVXNlc1VuZGVyc2NvcmVzKSwgTWlub3IoTWlub3IpLAorICAgICAgICBIYXNNaW5vcih0cnVlKSwgU3VibWlub3IoMCksIEhhc1N1Ym1pbm9yKGZhbHNlKSwgQnVpbGQoMCksCisgICAgICAgIEhhc0J1aWxkKGZhbHNlKSB7fQorCisgIGV4cGxpY2l0IFZlcnNpb25UdXBsZSh1bnNpZ25lZCBNYWpvciwgdW5zaWduZWQgTWlub3IsIHVuc2lnbmVkIFN1Ym1pbm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVc2VzVW5kZXJzY29yZXMgPSBmYWxzZSkKKyAgICAgIDogTWFqb3IoTWFqb3IpLCBVc2VzVW5kZXJzY29yZXMoVXNlc1VuZGVyc2NvcmVzKSwgTWlub3IoTWlub3IpLAorICAgICAgICBIYXNNaW5vcih0cnVlKSwgU3VibWlub3IoU3VibWlub3IpLCBIYXNTdWJtaW5vcih0cnVlKSwgQnVpbGQoMCksCisgICAgICAgIEhhc0J1aWxkKGZhbHNlKSB7fQorCisgIGV4cGxpY2l0IFZlcnNpb25UdXBsZSh1bnNpZ25lZCBNYWpvciwgdW5zaWduZWQgTWlub3IsIHVuc2lnbmVkIFN1Ym1pbm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQnVpbGQsIGJvb2wgVXNlc1VuZGVyc2NvcmVzID0gZmFsc2UpCisgICAgICA6IE1ham9yKE1ham9yKSwgVXNlc1VuZGVyc2NvcmVzKFVzZXNVbmRlcnNjb3JlcyksIE1pbm9yKE1pbm9yKSwKKyAgICAgICAgSGFzTWlub3IodHJ1ZSksIFN1Ym1pbm9yKFN1Ym1pbm9yKSwgSGFzU3VibWlub3IodHJ1ZSksIEJ1aWxkKEJ1aWxkKSwKKyAgICAgICAgSGFzQnVpbGQodHJ1ZSkge30KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBlbXB0eQorICAvLy8gKGUuZy4sIGFsbCB2ZXJzaW9uIGNvbXBvbmVudHMgYXJlIHplcm8pLgorICBib29sIGVtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBNYWpvciA9PSAwICYmIE1pbm9yID09IDAgJiYgU3VibWlub3IgPT0gMCAmJiBCdWlsZCA9PSAwOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbWFqb3IgdmVyc2lvbiBudW1iZXIuCisgIHVuc2lnbmVkIGdldE1ham9yKCkgY29uc3QgeyByZXR1cm4gTWFqb3I7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtaW5vciB2ZXJzaW9uIG51bWJlciwgaWYgcHJvdmlkZWQuCisgIE9wdGlvbmFsPHVuc2lnbmVkPiBnZXRNaW5vcigpIGNvbnN0IHsKKyAgICBpZiAoIUhhc01pbm9yKQorICAgICAgcmV0dXJuIE5vbmU7CisgICAgcmV0dXJuIE1pbm9yOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc3VibWlub3IgdmVyc2lvbiBudW1iZXIsIGlmIHByb3ZpZGVkLgorICBPcHRpb25hbDx1bnNpZ25lZD4gZ2V0U3VibWlub3IoKSBjb25zdCB7CisgICAgaWYgKCFIYXNTdWJtaW5vcikKKyAgICAgIHJldHVybiBOb25lOworICAgIHJldHVybiBTdWJtaW5vcjsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGJ1aWxkIHZlcnNpb24gbnVtYmVyLCBpZiBwcm92aWRlZC4KKyAgT3B0aW9uYWw8dW5zaWduZWQ+IGdldEJ1aWxkKCkgY29uc3QgeworICAgIGlmICghSGFzQnVpbGQpCisgICAgICByZXR1cm4gTm9uZTsKKyAgICByZXR1cm4gQnVpbGQ7CisgIH0KKworICBib29sIHVzZXNVbmRlcnNjb3JlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gVXNlc1VuZGVyc2NvcmVzOworICB9CisKKyAgdm9pZCBVc2VEb3RBc1NlcGFyYXRvcigpIHsKKyAgICBVc2VzVW5kZXJzY29yZXMgPSBmYWxzZTsKKyAgfQorICAKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgaWYgdHdvIHZlcnNpb24gbnVtYmVycyBhcmUgZXF1aXZhbGVudC4gSWYgbm90CisgIC8vLyBwcm92aWRlZCwgbWlub3IgYW5kIHN1Ym1pbm9yIHZlcnNpb24gbnVtYmVycyBhcmUgY29uc2lkZXJlZCB0byBiZSB6ZXJvLgorICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZlcnNpb25UdXBsZSYgWCwgY29uc3QgVmVyc2lvblR1cGxlICZZKSB7CisgICAgcmV0dXJuIFguTWFqb3IgPT0gWS5NYWpvciAmJiBYLk1pbm9yID09IFkuTWlub3IgJiYKKyAgICAgICAgICAgWC5TdWJtaW5vciA9PSBZLlN1Ym1pbm9yICYmIFguQnVpbGQgPT0gWS5CdWlsZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIHR3byB2ZXJzaW9uIG51bWJlcnMgYXJlIG5vdCBlcXVpdmFsZW50LgorICAvLy8KKyAgLy8vIElmIG5vdCBwcm92aWRlZCwgbWlub3IgYW5kIHN1Ym1pbm9yIHZlcnNpb24gbnVtYmVycyBhcmUgY29uc2lkZXJlZCB0byBiZSAKKyAgLy8vIHplcm8uCisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgVmVyc2lvblR1cGxlICZYLCBjb25zdCBWZXJzaW9uVHVwbGUgJlkpIHsKKyAgICByZXR1cm4gIShYID09IFkpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciBvbmUgdmVyc2lvbiBudW1iZXIgcHJlY2VkZXMgYW5vdGhlci4KKyAgLy8vCisgIC8vLyBJZiBub3QgcHJvdmlkZWQsIG1pbm9yIGFuZCBzdWJtaW5vciB2ZXJzaW9uIG51bWJlcnMgYXJlIGNvbnNpZGVyZWQgdG8gYmUKKyAgLy8vIHplcm8uCisgIGZyaWVuZCBib29sIG9wZXJhdG9yPChjb25zdCBWZXJzaW9uVHVwbGUgJlgsIGNvbnN0IFZlcnNpb25UdXBsZSAmWSkgeworICAgIHJldHVybiBzdGQ6OnRpZShYLk1ham9yLCBYLk1pbm9yLCBYLlN1Ym1pbm9yLCBYLkJ1aWxkKSA8CisgICAgICAgICAgIHN0ZDo6dGllKFkuTWFqb3IsIFkuTWlub3IsIFkuU3VibWlub3IsIFkuQnVpbGQpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciBvbmUgdmVyc2lvbiBudW1iZXIgZm9sbG93cyBhbm90aGVyLgorICAvLy8KKyAgLy8vIElmIG5vdCBwcm92aWRlZCwgbWlub3IgYW5kIHN1Ym1pbm9yIHZlcnNpb24gbnVtYmVycyBhcmUgY29uc2lkZXJlZCB0byBiZQorICAvLy8gemVyby4KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFZlcnNpb25UdXBsZSAmWCwgY29uc3QgVmVyc2lvblR1cGxlICZZKSB7CisgICAgcmV0dXJuIFkgPCBYOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciBvbmUgdmVyc2lvbiBudW1iZXIgcHJlY2VkZXMgb3IgaXMKKyAgLy8vIGVxdWl2YWxlbnQgdG8gYW5vdGhlci4gCisgIC8vLworICAvLy8gSWYgbm90IHByb3ZpZGVkLCBtaW5vciBhbmQgc3VibWlub3IgdmVyc2lvbiBudW1iZXJzIGFyZSBjb25zaWRlcmVkIHRvIGJlCisgIC8vLyB6ZXJvLgorICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFZlcnNpb25UdXBsZSAmWCwgY29uc3QgVmVyc2lvblR1cGxlICZZKSB7CisgICAgcmV0dXJuICEoWSA8IFgpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciBvbmUgdmVyc2lvbiBudW1iZXIgZm9sbG93cyBvciBpcworICAvLy8gZXF1aXZhbGVudCB0byBhbm90aGVyLgorICAvLy8KKyAgLy8vIElmIG5vdCBwcm92aWRlZCwgbWlub3IgYW5kIHN1Ym1pbm9yIHZlcnNpb24gbnVtYmVycyBhcmUgY29uc2lkZXJlZCB0byBiZQorICAvLy8gemVyby4KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+PShjb25zdCBWZXJzaW9uVHVwbGUgJlgsIGNvbnN0IFZlcnNpb25UdXBsZSAmWSkgeworICAgIHJldHVybiAhKFggPCBZKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlcnNpb24gbnVtYmVyLgorICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVHJ5IHRvIHBhcnNlIHRoZSBnaXZlbiBzdHJpbmcgYXMgYSB2ZXJzaW9uIG51bWJlci4KKyAgLy8vIFxyZXR1cm5zIFxjIHRydWUgaWYgdGhlIHN0cmluZyBkb2VzIG5vdCBtYXRjaCB0aGUgcmVndWxhciBleHByZXNzaW9uCisgIC8vLyAgIFswLTldKyhcLlswLTldKyl7MCwzfQorICBib29sIHRyeVBhcnNlKFN0cmluZ1JlZiBzdHJpbmcpOworfTsKKworLy8vIFxicmllZiBQcmludCBhIHZlcnNpb24gbnVtYmVyLgorcmF3X29zdHJlYW0mIG9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk91dCwgY29uc3QgVmVyc2lvblR1cGxlICZWKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisjZW5kaWYgLy8gTExWTV9DTEFOR19CQVNJQ19WRVJTSU9OVFVQTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvVmlydHVhbEZpbGVTeXN0ZW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ZpcnR1YWxGaWxlU3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM3Y2Q2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ZpcnR1YWxGaWxlU3lzdGVtLmgKQEAgLTAsMCArMSw0MzUgQEAKKy8vPT09LSBWaXJ0dWFsRmlsZVN5c3RlbS5oIC0gVmlydHVhbCBGaWxlIFN5c3RlbSBMYXllciAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgdGhlIHZpcnR1YWwgZmlsZSBzeXN0ZW0gaW50ZXJmYWNlIHZmczo6RmlsZVN5c3RlbS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfVklSVFVBTEZJTEVTWVNURU1fSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX1ZJUlRVQUxGSUxFU1lTVEVNX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nocm9uby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvck9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0ZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU291cmNlTWdyLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGN0aW1lPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1lbW9yeUJ1ZmZlcjsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIHZmcyB7CisKKy8vLyBcYnJpZWYgVGhlIHJlc3VsdCBvZiBhIFxwIHN0YXR1cyBvcGVyYXRpb24uCitjbGFzcyBTdGF0dXMgeworICBzdGQ6OnN0cmluZyBOYW1lOworICBsbHZtOjpzeXM6OmZzOjpVbmlxdWVJRCBVSUQ7CisgIGxsdm06OnN5czo6VGltZVBvaW50PD4gTVRpbWU7CisgIHVpbnQzMl90IFVzZXI7CisgIHVpbnQzMl90IEdyb3VwOworICB1aW50NjRfdCBTaXplOworICBsbHZtOjpzeXM6OmZzOjpmaWxlX3R5cGUgVHlwZSA9IGxsdm06OnN5czo6ZnM6OmZpbGVfdHlwZTo6c3RhdHVzX2Vycm9yOworICBsbHZtOjpzeXM6OmZzOjpwZXJtcyBQZXJtczsKKworcHVibGljOgorICAgLy8gRklYTUU6IHJlbW92ZSB3aGVuIGZpbGVzIHN1cHBvcnQgbXVsdGlwbGUgbmFtZXMKKyAgYm9vbCBJc1ZGU01hcHBlZCA9IGZhbHNlOworCisgIFN0YXR1cygpID0gZGVmYXVsdDsKKyAgU3RhdHVzKGNvbnN0IGxsdm06OnN5czo6ZnM6OmZpbGVfc3RhdHVzICZTdGF0dXMpOworICBTdGF0dXMoU3RyaW5nUmVmIE5hbWUsIGxsdm06OnN5czo6ZnM6OlVuaXF1ZUlEIFVJRCwKKyAgICAgICAgIGxsdm06OnN5czo6VGltZVBvaW50PD4gTVRpbWUsIHVpbnQzMl90IFVzZXIsIHVpbnQzMl90IEdyb3VwLAorICAgICAgICAgdWludDY0X3QgU2l6ZSwgbGx2bTo6c3lzOjpmczo6ZmlsZV90eXBlIFR5cGUsCisgICAgICAgICBsbHZtOjpzeXM6OmZzOjpwZXJtcyBQZXJtcyk7CisKKyAgLy8vIEdldCBhIGNvcHkgb2YgYSBTdGF0dXMgd2l0aCBhIGRpZmZlcmVudCBuYW1lLgorICBzdGF0aWMgU3RhdHVzIGNvcHlXaXRoTmV3TmFtZShjb25zdCBTdGF0dXMgJkluLCBTdHJpbmdSZWYgTmV3TmFtZSk7CisgIHN0YXRpYyBTdGF0dXMgY29weVdpdGhOZXdOYW1lKGNvbnN0IGxsdm06OnN5czo6ZnM6OmZpbGVfc3RhdHVzICZJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5ld05hbWUpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGlzIGZpbGUgb3IgZGlyZWN0b3J5LgorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICAvLy8gQG5hbWUgU3RhdHVzIGludGVyZmFjZSBmcm9tIGxsdm06OnN5czo6ZnMKKyAgLy8vIEB7CisgIGxsdm06OnN5czo6ZnM6OmZpbGVfdHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVHlwZTsgfQorICBsbHZtOjpzeXM6OmZzOjpwZXJtcyBnZXRQZXJtaXNzaW9ucygpIGNvbnN0IHsgcmV0dXJuIFBlcm1zOyB9CisgIGxsdm06OnN5czo6VGltZVBvaW50PD4gZ2V0TGFzdE1vZGlmaWNhdGlvblRpbWUoKSBjb25zdCB7IHJldHVybiBNVGltZTsgfQorICBsbHZtOjpzeXM6OmZzOjpVbmlxdWVJRCBnZXRVbmlxdWVJRCgpIGNvbnN0IHsgcmV0dXJuIFVJRDsgfQorICB1aW50MzJfdCBnZXRVc2VyKCkgY29uc3QgeyByZXR1cm4gVXNlcjsgfQorICB1aW50MzJfdCBnZXRHcm91cCgpIGNvbnN0IHsgcmV0dXJuIEdyb3VwOyB9CisgIHVpbnQ2NF90IGdldFNpemUoKSBjb25zdCB7IHJldHVybiBTaXplOyB9CisgIC8vLyBAfQorICAvLy8gQG5hbWUgU3RhdHVzIHF1ZXJpZXMKKyAgLy8vIFRoZXNlIGFyZSBzdGF0aWMgcXVlcmllcyBpbiBsbHZtOjpzeXM6OmZzLgorICAvLy8gQHsKKyAgYm9vbCBlcXVpdmFsZW50KGNvbnN0IFN0YXR1cyAmT3RoZXIpIGNvbnN0OworICBib29sIGlzRGlyZWN0b3J5KCkgY29uc3Q7CisgIGJvb2wgaXNSZWd1bGFyRmlsZSgpIGNvbnN0OworICBib29sIGlzT3RoZXIoKSBjb25zdDsKKyAgYm9vbCBpc1N5bWxpbmsoKSBjb25zdDsKKyAgYm9vbCBpc1N0YXR1c0tub3duKCkgY29uc3Q7CisgIGJvb2wgZXhpc3RzKCkgY29uc3Q7CisgIC8vLyBAfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGFuIG9wZW4gZmlsZS4KK2NsYXNzIEZpbGUgeworcHVibGljOgorICAvLy8gXGJyaWVmIERlc3Ryb3kgdGhlIGZpbGUgYWZ0ZXIgY2xvc2luZyBpdCAoaWYgb3BlbikuCisgIC8vLyBTdWItY2xhc3NlcyBzaG91bGQgZ2VuZXJhbGx5IGNhbGwgY2xvc2UoKSBpbnNpZGUgdGhlaXIgZGVzdHJ1Y3RvcnMuICBXZQorICAvLy8gY2Fubm90IGRvIHRoYXQgZnJvbSB0aGUgYmFzZSBjbGFzcywgc2luY2UgY2xvc2UgaXMgdmlydHVhbC4KKyAgdmlydHVhbCB+RmlsZSgpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBzdGF0dXMgb2YgdGhlIGZpbGUuCisgIHZpcnR1YWwgbGx2bTo6RXJyb3JPcjxTdGF0dXM+IHN0YXR1cygpID0gMDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgbmFtZSBvZiB0aGUgZmlsZQorICB2aXJ0dWFsIGxsdm06OkVycm9yT3I8c3RkOjpzdHJpbmc+IGdldE5hbWUoKSB7CisgICAgaWYgKGF1dG8gU3RhdHVzID0gc3RhdHVzKCkpCisgICAgICByZXR1cm4gU3RhdHVzLT5nZXROYW1lKCkuc3RyKCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIFN0YXR1cy5nZXRFcnJvcigpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFzIGEgXHAgTWVtb3J5QnVmZmVyLgorICB2aXJ0dWFsIGxsdm06OkVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4+CisgIGdldEJ1ZmZlcihjb25zdCBUd2luZSAmTmFtZSwgaW50NjRfdCBGaWxlU2l6ZSA9IC0xLAorICAgICAgICAgICAgYm9vbCBSZXF1aXJlc051bGxUZXJtaW5hdG9yID0gdHJ1ZSwgYm9vbCBJc1ZvbGF0aWxlID0gZmFsc2UpID0gMDsKKworICAvLy8gXGJyaWVmIENsb3NlcyB0aGUgZmlsZS4KKyAgdmlydHVhbCBzdGQ6OmVycm9yX2NvZGUgY2xvc2UoKSA9IDA7Cit9OworCituYW1lc3BhY2UgZGV0YWlsIHsKKworLy8vIFxicmllZiBBbiBpbnRlcmZhY2UgZm9yIHZpcnR1YWwgZmlsZSBzeXN0ZW1zIHRvIHByb3ZpZGUgYW4gaXRlcmF0b3Igb3ZlciB0aGUKKy8vLyAobm9uLXJlY3Vyc2l2ZSkgY29udGVudHMgb2YgYSBkaXJlY3RvcnkuCitzdHJ1Y3QgRGlySXRlckltcGwgeworICB2aXJ0dWFsIH5EaXJJdGVySW1wbCgpOworCisgIC8vLyBcYnJpZWYgU2V0cyBcYyBDdXJyZW50RW50cnkgdG8gdGhlIG5leHQgZW50cnkgaW4gdGhlIGRpcmVjdG9yeSBvbiBzdWNjZXNzLAorICAvLy8gb3IgcmV0dXJucyBhIHN5c3RlbS1kZWZpbmVkIFxjIGVycm9yX2NvZGUuCisgIHZpcnR1YWwgc3RkOjplcnJvcl9jb2RlIGluY3JlbWVudCgpID0gMDsKKworICBTdGF0dXMgQ3VycmVudEVudHJ5OworfTsKKworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKKy8vLyBcYnJpZWYgQW4gaW5wdXQgaXRlcmF0b3Igb3ZlciB0aGUgZW50cmllcyBpbiBhIHZpcnR1YWwgcGF0aCwgc2ltaWxhciB0bworLy8vIGxsdm06OnN5czo6ZnM6OmRpcmVjdG9yeV9pdGVyYXRvci4KK2NsYXNzIGRpcmVjdG9yeV9pdGVyYXRvciB7CisgIHN0ZDo6c2hhcmVkX3B0cjxkZXRhaWw6OkRpckl0ZXJJbXBsPiBJbXBsOyAvLyBJbnB1dCBpdGVyYXRvciBzZW1hbnRpY3Mgb24gY29weQorCitwdWJsaWM6CisgIGRpcmVjdG9yeV9pdGVyYXRvcihzdGQ6OnNoYXJlZF9wdHI8ZGV0YWlsOjpEaXJJdGVySW1wbD4gSSkKKyAgICAgIDogSW1wbChzdGQ6Om1vdmUoSSkpIHsKKyAgICBhc3NlcnQoSW1wbC5nZXQoKSAhPSBudWxscHRyICYmICJyZXF1aXJlcyBub24tbnVsbCBpbXBsZW1lbnRhdGlvbiIpOworICAgIGlmICghSW1wbC0+Q3VycmVudEVudHJ5LmlzU3RhdHVzS25vd24oKSkKKyAgICAgIEltcGwucmVzZXQoKTsgLy8gTm9ybWFsaXplIHRoZSBlbmQgaXRlcmF0b3IgdG8gSW1wbCA9PSBudWxscHRyLgorICB9CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYW4gJ2VuZCcgaXRlcmF0b3IuCisgIGRpcmVjdG9yeV9pdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIEVxdWl2YWxlbnQgdG8gb3BlcmF0b3IrKywgd2l0aCBhbiBlcnJvciBjb2RlLgorICBkaXJlY3RvcnlfaXRlcmF0b3IgJmluY3JlbWVudChzdGQ6OmVycm9yX2NvZGUgJkVDKSB7CisgICAgYXNzZXJ0KEltcGwgJiYgImF0dGVtcHRpbmcgdG8gaW5jcmVtZW50IHBhc3QgZW5kIik7CisgICAgRUMgPSBJbXBsLT5pbmNyZW1lbnQoKTsKKyAgICBpZiAoIUltcGwtPkN1cnJlbnRFbnRyeS5pc1N0YXR1c0tub3duKCkpCisgICAgICBJbXBsLnJlc2V0KCk7IC8vIE5vcm1hbGl6ZSB0aGUgZW5kIGl0ZXJhdG9yIHRvIEltcGwgPT0gbnVsbHB0ci4KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBTdGF0dXMgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIEltcGwtPkN1cnJlbnRFbnRyeTsgfQorICBjb25zdCBTdGF0dXMgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmSW1wbC0+Q3VycmVudEVudHJ5OyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGRpcmVjdG9yeV9pdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgaWYgKEltcGwgJiYgUkhTLkltcGwpCisgICAgICByZXR1cm4gSW1wbC0+Q3VycmVudEVudHJ5LmVxdWl2YWxlbnQoUkhTLkltcGwtPkN1cnJlbnRFbnRyeSk7CisgICAgcmV0dXJuICFJbXBsICYmICFSSFMuSW1wbDsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgZGlyZWN0b3J5X2l0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBSSFMpOworICB9Cit9OworCitjbGFzcyBGaWxlU3lzdGVtOworCisvLy8gXGJyaWVmIEFuIGlucHV0IGl0ZXJhdG9yIG92ZXIgdGhlIHJlY3Vyc2l2ZSBjb250ZW50cyBvZiBhIHZpcnR1YWwgcGF0aCwKKy8vLyBzaW1pbGFyIHRvIGxsdm06OnN5czo6ZnM6OnJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IuCitjbGFzcyByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yIHsKKyAgdXNpbmcgSXRlclN0YXRlID0KKyAgICAgIHN0ZDo6c3RhY2s8ZGlyZWN0b3J5X2l0ZXJhdG9yLCBzdGQ6OnZlY3RvcjxkaXJlY3RvcnlfaXRlcmF0b3I+PjsKKworICBGaWxlU3lzdGVtICpGUzsKKyAgc3RkOjpzaGFyZWRfcHRyPEl0ZXJTdGF0ZT4gU3RhdGU7IC8vIElucHV0IGl0ZXJhdG9yIHNlbWFudGljcyBvbiBjb3B5LgorCitwdWJsaWM6CisgIHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IoRmlsZVN5c3RlbSAmRlMsIGNvbnN0IFR3aW5lICZQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZXJyb3JfY29kZSAmRUMpOworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuICdlbmQnIGl0ZXJhdG9yLgorICByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgIC8vLyBcYnJpZWYgRXF1aXZhbGVudCB0byBvcGVyYXRvcisrLCB3aXRoIGFuIGVycm9yIGNvZGUuCisgIHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IgJmluY3JlbWVudChzdGQ6OmVycm9yX2NvZGUgJkVDKTsKKworICBjb25zdCBTdGF0dXMgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpTdGF0ZS0+dG9wKCk7IH0KKyAgY29uc3QgU3RhdHVzICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJipTdGF0ZS0+dG9wKCk7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvciAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RhdGUgPT0gT3RoZXIuU3RhdGU7IC8vIGlkZW50aXR5CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IFJIUyk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldHMgdGhlIGN1cnJlbnQgbGV2ZWwuIFN0YXJ0aW5nIHBhdGggaXMgYXQgbGV2ZWwgMC4KKyAgaW50IGxldmVsKCkgY29uc3QgeworICAgIGFzc2VydCghU3RhdGUtPmVtcHR5KCkgJiYgIkNhbm5vdCBnZXQgbGV2ZWwgd2l0aG91dCBhbnkgaXRlcmF0aW9uIHN0YXRlIik7CisgICAgcmV0dXJuIFN0YXRlLT5zaXplKCktMTsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGUgdmlydHVhbCBmaWxlIHN5c3RlbSBpbnRlcmZhY2UuCitjbGFzcyBGaWxlU3lzdGVtIDogcHVibGljIGxsdm06OlRocmVhZFNhZmVSZWZDb3VudGVkQmFzZTxGaWxlU3lzdGVtPiB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkZpbGVTeXN0ZW0oKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgc3RhdHVzIG9mIHRoZSBlbnRyeSBhdCBccCBQYXRoLCBpZiBvbmUgZXhpc3RzLgorICB2aXJ0dWFsIGxsdm06OkVycm9yT3I8U3RhdHVzPiBzdGF0dXMoY29uc3QgVHdpbmUgJlBhdGgpID0gMDsKKworICAvLy8gXGJyaWVmIEdldCBhIFxwIEZpbGUgb2JqZWN0IGZvciB0aGUgZmlsZSBhdCBccCBQYXRoLCBpZiBvbmUgZXhpc3RzLgorICB2aXJ0dWFsIGxsdm06OkVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPEZpbGU+PgorICBvcGVuRmlsZUZvclJlYWQoY29uc3QgVHdpbmUgJlBhdGgpID0gMDsKKworICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IG9wZW5zIGEgZmlsZSwgZ2V0cyBpdHMgY29udGVudCBhbmQgdGhlbgorICAvLy8gY2xvc2VzIHRoZSBmaWxlLgorICBsbHZtOjpFcnJvck9yPHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+PgorICBnZXRCdWZmZXJGb3JGaWxlKGNvbnN0IFR3aW5lICZOYW1lLCBpbnQ2NF90IEZpbGVTaXplID0gLTEsCisgICAgICAgICAgICAgICAgICAgYm9vbCBSZXF1aXJlc051bGxUZXJtaW5hdG9yID0gdHJ1ZSwgYm9vbCBJc1ZvbGF0aWxlID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgR2V0IGEgZGlyZWN0b3J5X2l0ZXJhdG9yIGZvciBccCBEaXIuCisgIC8vLyBcbm90ZSBUaGUgJ2VuZCcgaXRlcmF0b3IgaXMgZGlyZWN0b3J5X2l0ZXJhdG9yKCkuCisgIHZpcnR1YWwgZGlyZWN0b3J5X2l0ZXJhdG9yIGRpcl9iZWdpbihjb25zdCBUd2luZSAmRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjplcnJvcl9jb2RlICZFQykgPSAwOworCisgIC8vLyBTZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LiBUaGlzIHdpbGwgYWZmZWN0IGFsbCBmb2xsb3dpbmcgb3BlcmF0aW9ucyBvbgorICAvLy8gdGhpcyBmaWxlIHN5c3RlbSBhbmQgbWF5IHByb3BhZ2F0ZSBkb3duIGZvciBuZXN0ZWQgZmlsZSBzeXN0ZW1zLgorICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZSBzZXRDdXJyZW50V29ya2luZ0RpcmVjdG9yeShjb25zdCBUd2luZSAmUGF0aCkgPSAwOworCisgIC8vLyBHZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoaXMgZmlsZSBzeXN0ZW0uCisgIHZpcnR1YWwgbGx2bTo6RXJyb3JPcjxzdGQ6OnN0cmluZz4gZ2V0Q3VycmVudFdvcmtpbmdEaXJlY3RvcnkoKSBjb25zdCA9IDA7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgYSBmaWxlIGV4aXN0cy4gUHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlLgorICBib29sIGV4aXN0cyhjb25zdCBUd2luZSAmUGF0aCk7CisKKyAgLy8vIE1ha2UgXGEgUGF0aCBhbiBhYnNvbHV0ZSBwYXRoLgorICAvLy8KKyAgLy8vIE1ha2VzIFxhIFBhdGggYWJzb2x1dGUgdXNpbmcgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIGl0IGlzIG5vdCBhbHJlYWR5LgorICAvLy8gQW4gZW1wdHkgXGEgUGF0aCB3aWxsIHJlc3VsdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgIC8vLworICAvLy8gL2Fic29sdXRlL3BhdGggICA9PiAvYWJzb2x1dGUvcGF0aAorICAvLy8gcmVsYXRpdmUvLi4vcGF0aCA9PiA8Y3VycmVudC1kaXJlY3Rvcnk+L3JlbGF0aXZlLy4uL3BhdGgKKyAgLy8vCisgIC8vLyBccGFyYW0gUGF0aCBBIHBhdGggdGhhdCBpcyBtb2RpZmllZCB0byBiZSBhbiBhYnNvbHV0ZSBwYXRoLgorICAvLy8gXHJldHVybnMgc3VjY2VzcyBpZiBcYSBwYXRoIGhhcyBiZWVuIG1hZGUgYWJzb2x1dGUsIG90aGVyd2lzZSBhCisgIC8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgorICBzdGQ6OmVycm9yX2NvZGUgbWFrZUFic29sdXRlKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUGF0aCkgY29uc3Q7Cit9OworCisvLy8gXGJyaWVmIEdldHMgYW4gXHAgdmZzOjpGaWxlU3lzdGVtIGZvciB0aGUgJ3JlYWwnIGZpbGUgc3lzdGVtLCBhcyBzZWVuIGJ5CisvLy8gdGhlIG9wZXJhdGluZyBzeXN0ZW0uCitJbnRydXNpdmVSZWZDbnRQdHI8RmlsZVN5c3RlbT4gZ2V0UmVhbEZpbGVTeXN0ZW0oKTsKKworLy8vIFxicmllZiBBIGZpbGUgc3lzdGVtIHRoYXQgYWxsb3dzIG92ZXJsYXlpbmcgb25lIFxwIEFic3RyYWN0RmlsZVN5c3RlbSBvbiB0b3AKKy8vLyBvZiBhbm90aGVyLgorLy8vCisvLy8gQ29uc2lzdHMgb2YgYSBzdGFjayBvZiA+PTEgXHAgRmlsZVN5c3RlbSBvYmplY3RzLCB3aGljaCBhcmUgdHJlYXRlZCBhcyBiZWluZworLy8vIG9uZSBtZXJnZWQgZmlsZSBzeXN0ZW0uIFdoZW4gdGhlcmUgaXMgYSBkaXJlY3RvcnkgdGhhdCBleGlzdHMgaW4gbW9yZSB0aGFuCisvLy8gb25lIGZpbGUgc3lzdGVtLCB0aGUgXHAgT3ZlcmxheUZpbGVTeXN0ZW0gY29udGFpbnMgYSBkaXJlY3RvcnkgY29udGFpbmluZworLy8vIHRoZSB1bmlvbiBvZiB0aGVpciBjb250ZW50cy4gIFRoZSBhdHRyaWJ1dGVzIChwZXJtaXNzaW9ucywgZXRjLikgb2YgdGhlCisvLy8gdG9wLW1vc3QgKG1vc3QgcmVjZW50bHkgYWRkZWQpIGRpcmVjdG9yeSBhcmUgdXNlZC4gIFdoZW4gdGhlcmUgaXMgYSBmaWxlCisvLy8gdGhhdCBleGlzdHMgaW4gbW9yZSB0aGFuIG9uZSBmaWxlIHN5c3RlbSwgdGhlIGZpbGUgaW4gdGhlIHRvcC1tb3N0IGZpbGUKKy8vLyBzeXN0ZW0gb3ZlcnJpZGVzIHRoZSBvdGhlcihzKS4KK2NsYXNzIE92ZXJsYXlGaWxlU3lzdGVtIDogcHVibGljIEZpbGVTeXN0ZW0geworICB1c2luZyBGaWxlU3lzdGVtTGlzdCA9IFNtYWxsVmVjdG9yPEludHJ1c2l2ZVJlZkNudFB0cjxGaWxlU3lzdGVtPiwgMT47CisKKyAgLy8vIFxicmllZiBUaGUgc3RhY2sgb2YgZmlsZSBzeXN0ZW1zLCBpbXBsZW1lbnRlZCBhcyBhIGxpc3QgaW4gb3JkZXIgb2YKKyAgLy8vIHRoZWlyIGFkZGl0aW9uLgorICBGaWxlU3lzdGVtTGlzdCBGU0xpc3Q7CisKK3B1YmxpYzoKKyAgT3ZlcmxheUZpbGVTeXN0ZW0oSW50cnVzaXZlUmVmQ250UHRyPEZpbGVTeXN0ZW0+IEJhc2UpOworCisgIC8vLyBcYnJpZWYgUHVzaGVzIGEgZmlsZSBzeXN0ZW0gb24gdG9wIG9mIHRoZSBzdGFjay4KKyAgdm9pZCBwdXNoT3ZlcmxheShJbnRydXNpdmVSZWZDbnRQdHI8RmlsZVN5c3RlbT4gRlMpOworCisgIGxsdm06OkVycm9yT3I8U3RhdHVzPiBzdGF0dXMoY29uc3QgVHdpbmUgJlBhdGgpIG92ZXJyaWRlOworICBsbHZtOjpFcnJvck9yPHN0ZDo6dW5pcXVlX3B0cjxGaWxlPj4KKyAgb3BlbkZpbGVGb3JSZWFkKGNvbnN0IFR3aW5lICZQYXRoKSBvdmVycmlkZTsKKyAgZGlyZWN0b3J5X2l0ZXJhdG9yIGRpcl9iZWdpbihjb25zdCBUd2luZSAmRGlyLCBzdGQ6OmVycm9yX2NvZGUgJkVDKSBvdmVycmlkZTsKKyAgbGx2bTo6RXJyb3JPcjxzdGQ6OnN0cmluZz4gZ2V0Q3VycmVudFdvcmtpbmdEaXJlY3RvcnkoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjplcnJvcl9jb2RlIHNldEN1cnJlbnRXb3JraW5nRGlyZWN0b3J5KGNvbnN0IFR3aW5lICZQYXRoKSBvdmVycmlkZTsKKworICB1c2luZyBpdGVyYXRvciA9IEZpbGVTeXN0ZW1MaXN0OjpyZXZlcnNlX2l0ZXJhdG9yOworICAKKyAgLy8vIFxicmllZiBHZXQgYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgZmlsZSBzeXN0ZW0uCisgIGl0ZXJhdG9yIG92ZXJsYXlzX2JlZ2luKCkgeyByZXR1cm4gRlNMaXN0LnJiZWdpbigpOyB9CisKKyAgLy8vIFxicmllZiBHZXQgYW4gaXRlcmF0b3IgcG9pbnRpbmcgb25lLXBhc3QgdGhlIGxlYXN0IHJlY2VudGx5IGFkZGVkIGZpbGUKKyAgLy8vIHN5c3RlbS4KKyAgaXRlcmF0b3Igb3ZlcmxheXNfZW5kKCkgeyByZXR1cm4gRlNMaXN0LnJlbmQoKTsgfQorfTsKKworbmFtZXNwYWNlIGRldGFpbCB7CisKK2NsYXNzIEluTWVtb3J5RGlyZWN0b3J5OworCit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKKworLy8vIEFuIGluLW1lbW9yeSBmaWxlIHN5c3RlbS4KK2NsYXNzIEluTWVtb3J5RmlsZVN5c3RlbSA6IHB1YmxpYyBGaWxlU3lzdGVtIHsKKyAgc3RkOjp1bmlxdWVfcHRyPGRldGFpbDo6SW5NZW1vcnlEaXJlY3Rvcnk+IFJvb3Q7CisgIHN0ZDo6c3RyaW5nIFdvcmtpbmdEaXJlY3Rvcnk7CisgIGJvb2wgVXNlTm9ybWFsaXplZFBhdGhzID0gdHJ1ZTsKKworcHVibGljOgorICBleHBsaWNpdCBJbk1lbW9yeUZpbGVTeXN0ZW0oYm9vbCBVc2VOb3JtYWxpemVkUGF0aHMgPSB0cnVlKTsKKyAgfkluTWVtb3J5RmlsZVN5c3RlbSgpIG92ZXJyaWRlOworCisgIC8vLyBBZGQgYSBmaWxlIGNvbnRhaW5pbmcgYSBidWZmZXIgb3IgYSBkaXJlY3RvcnkgdG8gdGhlIFZGUyB3aXRoIGEKKyAgLy8vIHBhdGguIFRoZSBWRlMgb3ducyB0aGUgYnVmZmVyLiAgSWYgcHJlc2VudCwgVXNlciwgR3JvdXAsIFR5cGUKKyAgLy8vIGFuZCBQZXJtcyBhcHBseSB0byB0aGUgbmV3bHktY3JlYXRlZCBmaWxlIG9yIGRpcmVjdG9yeS4KKyAgLy8vIFxyZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSBvciBkaXJlY3Rvcnkgd2FzIHN1Y2Nlc3NmdWxseSBhZGRlZCwKKyAgLy8vIGZhbHNlIGlmIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZmlsZSBzeXN0ZW0gd2l0aAorICAvLy8gZGlmZmVyZW50IGNvbnRlbnRzLgorICBib29sIGFkZEZpbGUoY29uc3QgVHdpbmUgJlBhdGgsIHRpbWVfdCBNb2RpZmljYXRpb25UaW1lLAorICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gQnVmZmVyLAorICAgICAgICAgICAgICAgT3B0aW9uYWw8dWludDMyX3Q+IFVzZXIgPSBOb25lLCBPcHRpb25hbDx1aW50MzJfdD4gR3JvdXAgPSBOb25lLAorICAgICAgICAgICAgICAgT3B0aW9uYWw8bGx2bTo6c3lzOjpmczo6ZmlsZV90eXBlPiBUeXBlID0gTm9uZSwKKyAgICAgICAgICAgICAgIE9wdGlvbmFsPGxsdm06OnN5czo6ZnM6OnBlcm1zPiBQZXJtcyA9IE5vbmUpOworCisgIC8vLyBBZGQgYSBidWZmZXIgdG8gdGhlIFZGUyB3aXRoIGEgcGF0aC4gVGhlIFZGUyBkb2VzIG5vdCBvd24gdGhlIGJ1ZmZlci4KKyAgLy8vIElmIHByZXNlbnQsIFVzZXIsIEdyb3VwLCBUeXBlIGFuZCBQZXJtcyBhcHBseSB0byB0aGUgbmV3bHktY3JlYXRlZCBmaWxlCisgIC8vLyBvciBkaXJlY3RvcnkuCisgIC8vLyBccmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQsCisgIC8vLyBmYWxzZSBpZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGZpbGUgc3lzdGVtIHdpdGgKKyAgLy8vIGRpZmZlcmVudCBjb250ZW50cy4KKyAgYm9vbCBhZGRGaWxlTm9Pd24oY29uc3QgVHdpbmUgJlBhdGgsIHRpbWVfdCBNb2RpZmljYXRpb25UaW1lLAorICAgICAgICAgICAgICAgICAgICBsbHZtOjpNZW1vcnlCdWZmZXIgKkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8dWludDMyX3Q+IFVzZXIgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDx1aW50MzJfdD4gR3JvdXAgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxsbHZtOjpzeXM6OmZzOjpmaWxlX3R5cGU+IFR5cGUgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxsbHZtOjpzeXM6OmZzOjpwZXJtcz4gUGVybXMgPSBOb25lKTsKKworICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZpbGUgc3lzdGVtIG5vcm1hbGl6ZXMgLiBhbmQgLi4gaW4gcGF0aHMuCisgIGJvb2wgdXNlTm9ybWFsaXplZFBhdGhzKCkgY29uc3QgeyByZXR1cm4gVXNlTm9ybWFsaXplZFBhdGhzOyB9CisKKyAgbGx2bTo6RXJyb3JPcjxTdGF0dXM+IHN0YXR1cyhjb25zdCBUd2luZSAmUGF0aCkgb3ZlcnJpZGU7CisgIGxsdm06OkVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPEZpbGU+PgorICBvcGVuRmlsZUZvclJlYWQoY29uc3QgVHdpbmUgJlBhdGgpIG92ZXJyaWRlOworICBkaXJlY3RvcnlfaXRlcmF0b3IgZGlyX2JlZ2luKGNvbnN0IFR3aW5lICZEaXIsIHN0ZDo6ZXJyb3JfY29kZSAmRUMpIG92ZXJyaWRlOworCisgIGxsdm06OkVycm9yT3I8c3RkOjpzdHJpbmc+IGdldEN1cnJlbnRXb3JraW5nRGlyZWN0b3J5KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBXb3JraW5nRGlyZWN0b3J5OworICB9CisKKyAgc3RkOjplcnJvcl9jb2RlIHNldEN1cnJlbnRXb3JraW5nRGlyZWN0b3J5KGNvbnN0IFR3aW5lICZQYXRoKSBvdmVycmlkZTsKK307CisKKy8vLyBcYnJpZWYgR2V0IGEgZ2xvYmFsbHkgdW5pcXVlIElEIGZvciBhIHZpcnR1YWwgZmlsZSBvciBkaXJlY3RvcnkuCitsbHZtOjpzeXM6OmZzOjpVbmlxdWVJRCBnZXROZXh0VmlydHVhbFVuaXF1ZUlEKCk7CisKKy8vLyBcYnJpZWYgR2V0cyBhIFxwIEZpbGVTeXN0ZW0gZm9yIGEgdmlydHVhbCBmaWxlIHN5c3RlbSBkZXNjcmliZWQgaW4gWUFNTAorLy8vIGZvcm1hdC4KK0ludHJ1c2l2ZVJlZkNudFB0cjxGaWxlU3lzdGVtPgorZ2V0VkZTRnJvbVlBTUwoc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gQnVmZmVyLAorICAgICAgICAgICAgICAgbGx2bTo6U291cmNlTWdyOjpEaWFnSGFuZGxlclR5IERpYWdIYW5kbGVyLAorICAgICAgICAgICAgICAgU3RyaW5nUmVmIFlBTUxGaWxlUGF0aCwKKyAgICAgICAgICAgICAgIHZvaWQgKkRpYWdDb250ZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjxGaWxlU3lzdGVtPiBFeHRlcm5hbEZTID0gZ2V0UmVhbEZpbGVTeXN0ZW0oKSk7CisKK3N0cnVjdCBZQU1MVkZTRW50cnkgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiBZQU1MVkZTRW50cnkoVDEgJiZWUGF0aCwgVDIgJiZSUGF0aCkKKyAgICAgIDogVlBhdGgoc3RkOjpmb3J3YXJkPFQxPihWUGF0aCkpLCBSUGF0aChzdGQ6OmZvcndhcmQ8VDI+KFJQYXRoKSkge30KKyAgc3RkOjpzdHJpbmcgVlBhdGg7CisgIHN0ZDo6c3RyaW5nIFJQYXRoOworfTsKKworLy8vIFxicmllZiBDb2xsZWN0IGFsbCBwYWlycyBvZiA8dmlydHVhbCBwYXRoLCByZWFsIHBhdGg+IGVudHJpZXMgZnJvbSB0aGUKKy8vLyBccCBZQU1MRmlsZVBhdGguIFRoaXMgaXMgdXNlZCBieSB0aGUgbW9kdWxlIGRlcGVuZGVuY3kgY29sbGVjdG9yIHRvIGZvcndhcmQKKy8vLyB0aGUgZW50cmllcyBpbnRvIHRoZSByZXByb2R1Y2VyIG91dHB1dCBWRlMgWUFNTCBmaWxlLgordm9pZCBjb2xsZWN0VkZTRnJvbVlBTUwoCisgICAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gQnVmZmVyLAorICAgIGxsdm06OlNvdXJjZU1ncjo6RGlhZ0hhbmRsZXJUeSBEaWFnSGFuZGxlciwgU3RyaW5nUmVmIFlBTUxGaWxlUGF0aCwKKyAgICBTbWFsbFZlY3RvckltcGw8WUFNTFZGU0VudHJ5PiAmQ29sbGVjdGVkRW50cmllcywKKyAgICB2b2lkICpEaWFnQ29udGV4dCA9IG51bGxwdHIsCisgICAgSW50cnVzaXZlUmVmQ250UHRyPEZpbGVTeXN0ZW0+IEV4dGVybmFsRlMgPSBnZXRSZWFsRmlsZVN5c3RlbSgpKTsKKworY2xhc3MgWUFNTFZGU1dyaXRlciB7CisgIHN0ZDo6dmVjdG9yPFlBTUxWRlNFbnRyeT4gTWFwcGluZ3M7CisgIE9wdGlvbmFsPGJvb2w+IElzQ2FzZVNlbnNpdGl2ZTsKKyAgT3B0aW9uYWw8Ym9vbD4gSXNPdmVybGF5UmVsYXRpdmU7CisgIE9wdGlvbmFsPGJvb2w+IFVzZUV4dGVybmFsTmFtZXM7CisgIE9wdGlvbmFsPGJvb2w+IElnbm9yZU5vbkV4aXN0ZW50Q29udGVudHM7CisgIHN0ZDo6c3RyaW5nIE92ZXJsYXlEaXI7CisKK3B1YmxpYzoKKyAgWUFNTFZGU1dyaXRlcigpID0gZGVmYXVsdDsKKworICB2b2lkIGFkZEZpbGVNYXBwaW5nKFN0cmluZ1JlZiBWaXJ0dWFsUGF0aCwgU3RyaW5nUmVmIFJlYWxQYXRoKTsKKworICB2b2lkIHNldENhc2VTZW5zaXRpdml0eShib29sIENhc2VTZW5zaXRpdmUpIHsKKyAgICBJc0Nhc2VTZW5zaXRpdmUgPSBDYXNlU2Vuc2l0aXZlOworICB9CisKKyAgdm9pZCBzZXRVc2VFeHRlcm5hbE5hbWVzKGJvb2wgVXNlRXh0TmFtZXMpIHsKKyAgICBVc2VFeHRlcm5hbE5hbWVzID0gVXNlRXh0TmFtZXM7CisgIH0KKworICB2b2lkIHNldElnbm9yZU5vbkV4aXN0ZW50Q29udGVudHMoYm9vbCBJZ25vcmVDb250ZW50cykgeworICAgIElnbm9yZU5vbkV4aXN0ZW50Q29udGVudHMgPSBJZ25vcmVDb250ZW50czsKKyAgfQorCisgIHZvaWQgc2V0T3ZlcmxheURpcihTdHJpbmdSZWYgT3ZlcmxheURpcmVjdG9yeSkgeworICAgIElzT3ZlcmxheVJlbGF0aXZlID0gdHJ1ZTsKKyAgICBPdmVybGF5RGlyLmFzc2lnbihPdmVybGF5RGlyZWN0b3J5LnN0cigpKTsKKyAgfQorCisgIHZvaWQgd3JpdGUobGx2bTo6cmF3X29zdHJlYW0gJk9TKTsKK307CisKK30gLy8gbmFtZXNwYWNlIHZmcworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQkFTSUNfVklSVFVBTEZJTEVTWVNURU1fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvVmlzaWJpbGl0eS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvVmlzaWJpbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjODM5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9WaXNpYmlsaXR5LmgKQEAgLTAsMCArMSwxNDQgQEAKKy8vPT09LS0tIFZpc2liaWxpdHkuaCAtIFZpc2liaWxpdHkgZW51bWVyYXRpb24gYW5kIHV0aWxpdGllcyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHRoZSBjbGFuZzo6VmlzaWJpbGl0eSBlbnVtZXJhdGlvbiBhbmQgdmFyaW91cyB1dGlsaXR5CisvLy8gZnVuY3Rpb25zLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX1ZJU0lCSUxJVFlfSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX1ZJU0lCSUxJVFlfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTGlua2FnZS5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCisvLy8gXGJyaWVmIERlc2NyaWJlcyB0aGUgZGlmZmVyZW50IGtpbmRzIG9mIHZpc2liaWxpdHkgdGhhdCBhIGRlY2xhcmF0aW9uCisvLy8gbWF5IGhhdmUuCisvLy8KKy8vLyBWaXNpYmlsaXR5IGRldGVybWluZXMgaG93IGEgZGVjbGFyYXRpb24gaW50ZXJhY3RzIHdpdGggdGhlIGR5bmFtaWMKKy8vLyBsaW5rZXIuICBJdCBtYXkgYWxzbyBhZmZlY3Qgd2hldGhlciB0aGUgc3ltYm9sIGNhbiBiZSBmb3VuZCBieSBydW50aW1lCisvLy8gc3ltYm9sIGxvb2t1cCBBUElzLgorLy8vCisvLy8gVmlzaWJpbGl0eSBpcyBub3QgZGVzY3JpYmVkIGluIGFueSBsYW5ndWFnZSBzdGFuZGFyZCBhbmQKKy8vLyAobm9uZXRoZWxlc3MpIHNvbWV0aW1lcyBoYXMgb2RkIGJlaGF2aW9yLiAgTm90IGFsbCBwbGF0Zm9ybXMKKy8vLyBzdXBwb3J0IGFsbCB2aXNpYmlsaXR5IGtpbmRzLgorZW51bSBWaXNpYmlsaXR5IHsKKyAgLy8vIE9iamVjdHMgd2l0aCAiaGlkZGVuIiB2aXNpYmlsaXR5IGFyZSBub3Qgc2VlbiBieSB0aGUgZHluYW1pYworICAvLy8gbGlua2VyLgorICBIaWRkZW5WaXNpYmlsaXR5LAorCisgIC8vLyBPYmplY3RzIHdpdGggInByb3RlY3RlZCIgdmlzaWJpbGl0eSBhcmUgc2VlbiBieSB0aGUgZHluYW1pYworICAvLy8gbGlua2VyIGJ1dCBhbHdheXMgZHluYW1pY2FsbHkgcmVzb2x2ZSB0byBhbiBvYmplY3Qgd2l0aGluIHRoaXMKKyAgLy8vIHNoYXJlZCBvYmplY3QuCisgIFByb3RlY3RlZFZpc2liaWxpdHksCisKKyAgLy8vIE9iamVjdHMgd2l0aCAiZGVmYXVsdCIgdmlzaWJpbGl0eSBhcmUgc2VlbiBieSB0aGUgZHluYW1pYyBsaW5rZXIKKyAgLy8vIGFuZCBhY3QgbGlrZSBub3JtYWwgb2JqZWN0cy4KKyAgRGVmYXVsdFZpc2liaWxpdHkKK307CisKK2lubGluZSBWaXNpYmlsaXR5IG1pblZpc2liaWxpdHkoVmlzaWJpbGl0eSBMLCBWaXNpYmlsaXR5IFIpIHsKKyAgcmV0dXJuIEwgPCBSID8gTCA6IFI7Cit9CisKK2NsYXNzIExpbmthZ2VJbmZvIHsKKyAgdWludDhfdCBsaW5rYWdlXyAgICA6IDM7CisgIHVpbnQ4X3QgdmlzaWJpbGl0eV8gOiAyOworICB1aW50OF90IGV4cGxpY2l0XyAgIDogMTsKKworICB2b2lkIHNldFZpc2liaWxpdHkoVmlzaWJpbGl0eSBWLCBib29sIEUpIHsgdmlzaWJpbGl0eV8gPSBWOyBleHBsaWNpdF8gPSBFOyB9CitwdWJsaWM6CisgIExpbmthZ2VJbmZvKCkgOiBsaW5rYWdlXyhFeHRlcm5hbExpbmthZ2UpLCB2aXNpYmlsaXR5XyhEZWZhdWx0VmlzaWJpbGl0eSksCisgICAgICAgICAgICAgICAgICBleHBsaWNpdF8oZmFsc2UpIHt9CisgIExpbmthZ2VJbmZvKExpbmthZ2UgTCwgVmlzaWJpbGl0eSBWLCBib29sIEUpCisgICAgOiBsaW5rYWdlXyhMKSwgdmlzaWJpbGl0eV8oViksIGV4cGxpY2l0XyhFKSB7CisgICAgYXNzZXJ0KGdldExpbmthZ2UoKSA9PSBMICYmIGdldFZpc2liaWxpdHkoKSA9PSBWICYmCisgICAgICAgICAgIGlzVmlzaWJpbGl0eUV4cGxpY2l0KCkgPT0gRSAmJiAiRW51bSB0cnVuY2F0ZWQhIik7CisgIH0KKworICBzdGF0aWMgTGlua2FnZUluZm8gZXh0ZXJuYWwoKSB7CisgICAgcmV0dXJuIExpbmthZ2VJbmZvKCk7CisgIH0KKyAgc3RhdGljIExpbmthZ2VJbmZvIGludGVybmFsKCkgeworICAgIHJldHVybiBMaW5rYWdlSW5mbyhJbnRlcm5hbExpbmthZ2UsIERlZmF1bHRWaXNpYmlsaXR5LCBmYWxzZSk7CisgIH0KKyAgc3RhdGljIExpbmthZ2VJbmZvIHVuaXF1ZUV4dGVybmFsKCkgeworICAgIHJldHVybiBMaW5rYWdlSW5mbyhVbmlxdWVFeHRlcm5hbExpbmthZ2UsIERlZmF1bHRWaXNpYmlsaXR5LCBmYWxzZSk7CisgIH0KKyAgc3RhdGljIExpbmthZ2VJbmZvIG5vbmUoKSB7CisgICAgcmV0dXJuIExpbmthZ2VJbmZvKE5vTGlua2FnZSwgRGVmYXVsdFZpc2liaWxpdHksIGZhbHNlKTsKKyAgfQorICBzdGF0aWMgTGlua2FnZUluZm8gdmlzaWJsZV9ub25lKCkgeworICAgIHJldHVybiBMaW5rYWdlSW5mbyhWaXNpYmxlTm9MaW5rYWdlLCBEZWZhdWx0VmlzaWJpbGl0eSwgZmFsc2UpOworICB9CisKKyAgTGlua2FnZSBnZXRMaW5rYWdlKCkgY29uc3QgeyByZXR1cm4gKExpbmthZ2UpbGlua2FnZV87IH0KKyAgVmlzaWJpbGl0eSBnZXRWaXNpYmlsaXR5KCkgY29uc3QgeyByZXR1cm4gKFZpc2liaWxpdHkpdmlzaWJpbGl0eV87IH0KKyAgYm9vbCBpc1Zpc2liaWxpdHlFeHBsaWNpdCgpIGNvbnN0IHsgcmV0dXJuIGV4cGxpY2l0XzsgfQorCisgIHZvaWQgc2V0TGlua2FnZShMaW5rYWdlIEwpIHsgbGlua2FnZV8gPSBMOyB9CisKKyAgdm9pZCBtZXJnZUxpbmthZ2UoTGlua2FnZSBMKSB7CisgICAgc2V0TGlua2FnZShtaW5MaW5rYWdlKGdldExpbmthZ2UoKSwgTCkpOworICB9CisgIHZvaWQgbWVyZ2VMaW5rYWdlKExpbmthZ2VJbmZvIG90aGVyKSB7CisgICAgbWVyZ2VMaW5rYWdlKG90aGVyLmdldExpbmthZ2UoKSk7CisgIH0KKworICB2b2lkIG1lcmdlRXh0ZXJuYWxWaXNpYmlsaXR5KExpbmthZ2UgTCkgeworICAgIExpbmthZ2UgVGhpc0wgPSBnZXRMaW5rYWdlKCk7CisgICAgaWYgKCFpc0V4dGVybmFsbHlWaXNpYmxlKEwpKSB7CisgICAgICBpZiAoVGhpc0wgPT0gVmlzaWJsZU5vTGlua2FnZSkKKyAgICAgICAgVGhpc0wgPSBOb0xpbmthZ2U7CisgICAgICBlbHNlIGlmIChUaGlzTCA9PSBFeHRlcm5hbExpbmthZ2UpCisgICAgICAgIFRoaXNMID0gVW5pcXVlRXh0ZXJuYWxMaW5rYWdlOworICAgIH0KKyAgICBzZXRMaW5rYWdlKFRoaXNMKTsKKyAgfQorICB2b2lkIG1lcmdlRXh0ZXJuYWxWaXNpYmlsaXR5KExpbmthZ2VJbmZvIE90aGVyKSB7CisgICAgbWVyZ2VFeHRlcm5hbFZpc2liaWxpdHkoT3RoZXIuZ2V0TGlua2FnZSgpKTsKKyAgfQorCisgIC8vLyBNZXJnZSBpbiB0aGUgdmlzaWJpbGl0eSAnbmV3VmlzJy4KKyAgdm9pZCBtZXJnZVZpc2liaWxpdHkoVmlzaWJpbGl0eSBuZXdWaXMsIGJvb2wgbmV3RXhwbGljaXQpIHsKKyAgICBWaXNpYmlsaXR5IG9sZFZpcyA9IGdldFZpc2liaWxpdHkoKTsKKworICAgIC8vIE5ldmVyIGluY3JlYXNlIHZpc2liaWxpdHkuCisgICAgaWYgKG9sZFZpcyA8IG5ld1ZpcykKKyAgICAgIHJldHVybjsKKworICAgIC8vIElmIHRoZSBuZXcgdmlzaWJpbGl0eSBpcyB0aGUgc2FtZSBhcyB0aGUgb2xkIGFuZCB0aGUgbmV3CisgICAgLy8gdmlzaWJpbGl0eSBpc24ndCBleHBsaWNpdCwgd2UgaGF2ZSBub3RoaW5nIHRvIGFkZC4KKyAgICBpZiAob2xkVmlzID09IG5ld1ZpcyAmJiAhbmV3RXhwbGljaXQpCisgICAgICByZXR1cm47CisKKyAgICAvLyBPdGhlcndpc2UsIHdlJ3JlIGVpdGhlciBkZWNyZWFzaW5nIHZpc2liaWxpdHkgb3IgbWFraW5nIG91cgorICAgIC8vIGV4aXN0aW5nIHZpc2liaWxpdHkgZXhwbGljaXQuCisgICAgc2V0VmlzaWJpbGl0eShuZXdWaXMsIG5ld0V4cGxpY2l0KTsKKyAgfQorICB2b2lkIG1lcmdlVmlzaWJpbGl0eShMaW5rYWdlSW5mbyBvdGhlcikgeworICAgIG1lcmdlVmlzaWJpbGl0eShvdGhlci5nZXRWaXNpYmlsaXR5KCksIG90aGVyLmlzVmlzaWJpbGl0eUV4cGxpY2l0KCkpOworICB9CisKKyAgLy8vIE1lcmdlIGJvdGggbGlua2FnZSBhbmQgdmlzaWJpbGl0eS4KKyAgdm9pZCBtZXJnZShMaW5rYWdlSW5mbyBvdGhlcikgeworICAgIG1lcmdlTGlua2FnZShvdGhlcik7CisgICAgbWVyZ2VWaXNpYmlsaXR5KG90aGVyKTsKKyAgfQorCisgIC8vLyBNZXJnZSBsaW5rYWdlIGFuZCBjb25kaXRpb25hbGx5IG1lcmdlIHZpc2liaWxpdHkuCisgIHZvaWQgbWVyZ2VNYXliZVdpdGhWaXNpYmlsaXR5KExpbmthZ2VJbmZvIG90aGVyLCBib29sIHdpdGhWaXMpIHsKKyAgICBtZXJnZUxpbmthZ2Uob3RoZXIpOworICAgIGlmICh3aXRoVmlzKSBtZXJnZVZpc2liaWxpdHkob3RoZXIpOworICB9Cit9OworfQorCisjZW5kaWYgLy8gTExWTV9DTEFOR19CQVNJQ19WSVNJQklMSVRZX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1g4NlRhcmdldC5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9YODZUYXJnZXQuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjc1ODkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9YODZUYXJnZXQuZGVmCkBAIC0wLDAgKzEsMjc3IEBACisvLz09PS0tLSBYODZUYXJnZXQuZGVmIC0gWDg2IEZlYXR1cmUvUHJvY2Vzc29yIERhdGFiYXNlIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBYODYtc3BlY2lmaWMgRmVhdHVyZXMgYW5kIFByb2Nlc3NvcnMsIGFzIHVzZWQgYnkKKy8vIHRoZSBYODYgVGFyZ2V0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFBST0NfV0lUSF9GRUFUCisjZGVmaW5lIFBST0NfV0lUSF9GRUFUKEVOVU0sIFNUUklORywgSVM2NEJJVCwgS0VZRkVBVFVSRSkgICAgICAgICAgICAgICAgICAgICAgXAorICBQUk9DKEVOVU0sIFNUUklORywgSVM2NEJJVCkKKyNlbmRpZgorCisjaWZuZGVmIFBST0MKKyNkZWZpbmUgUFJPQyhFTlVNLCBTVFJJTkcsIElTNjRCSVQpCisjZW5kaWYKKworI2lmbmRlZiBQUk9DX0FMSUFTCisjZGVmaW5lIFBST0NfQUxJQVMoRU5VTSwgQUxJQVMpCisjZW5kaWYKKworI2lmbmRlZiBGRUFUVVJFCisjZGVmaW5lIEZFQVRVUkUoRU5VTSkKKyNlbmRpZgorCisjZGVmaW5lIFBST0NfNjRfQklUIHRydWUKKyNkZWZpbmUgUFJPQ18zMl9CSVQgZmFsc2UKKworLy8vIFxuYW1lIGkzODYKKy8vLyBpMzg2LWdlbmVyYXRpb24gcHJvY2Vzc29ycy4KKy8vQHsKK1BST0MoaTM4NiwgImkzODYiLCBQUk9DXzMyX0JJVCkKKy8vQH0KKworLy8vIFxuYW1lIGk0ODYKKy8vLyBpNDg2LWdlbmVyYXRpb24gcHJvY2Vzc29ycy4KKy8vQHsKK1BST0MoaTQ4NiwgImk0ODYiLCBQUk9DXzMyX0JJVCkKK1BST0MoV2luQ2hpcEM2LCAid2luY2hpcC1jNiIsIFBST0NfMzJfQklUKQorUFJPQyhXaW5DaGlwMiwgIndpbmNoaXAyIiwgUFJPQ18zMl9CSVQpCitQUk9DKEMzLCAiYzMiLCBQUk9DXzMyX0JJVCkKKy8vQH0KKworLy8vIFxuYW1lIGk1ODYKKy8vLyBpNTg2LWdlbmVyYXRpb24gcHJvY2Vzc29ycywgUDUgbWljcm9hcmNoaXRlY3R1cmUgYmFzZWQuCisvL0B7CitQUk9DKGk1ODYsICJpNTg2IiwgUFJPQ18zMl9CSVQpCitQUk9DKFBlbnRpdW0sICJwZW50aXVtIiwgUFJPQ18zMl9CSVQpCitQUk9DKFBlbnRpdW1NTVgsICJwZW50aXVtLW1teCIsIFBST0NfMzJfQklUKQorLy9AfQorCisvLy8gXG5hbWUgaTY4NgorLy8vIGk2ODYtZ2VuZXJhdGlvbiBwcm9jZXNzb3JzLCBQNiAvIFBlbnRpdW0gTSBtaWNyb2FyY2hpdGVjdHVyZSBiYXNlZC4KKy8vQHsKK1BST0MoUGVudGl1bVBybywgInBlbnRpdW1wcm8iLCBQUk9DXzMyX0JJVCkKK1BST0NfQUxJQVMoUGVudGl1bVBybywgImk2ODYiKQorUFJPQyhQZW50aXVtMiwgInBlbnRpdW0yIiwgUFJPQ18zMl9CSVQpCitQUk9DKFBlbnRpdW0zLCAicGVudGl1bTMiLCBQUk9DXzMyX0JJVCkKK1BST0NfQUxJQVMoUGVudGl1bTMsICJwZW50aXVtM20iKQorUFJPQyhQZW50aXVtTSwgInBlbnRpdW0tbSIsIFBST0NfMzJfQklUKQorUFJPQyhDM18yLCAiYzMtMiIsIFBST0NfMzJfQklUKQorCisvLy8gVGhpcyBlbnVtZXJhdG9yIGlzIGEgYml0IG9kZCwgYXMgR0NDIG5vIGxvbmdlciBhY2NlcHRzIC1tYXJjaD15b25haC4KKy8vLyBDbGFuZyBob3dldmVyIGhhcyBzb21lIGxvZ2ljIHRvIHN1cHBvcnQgdGhpcy4KKy8vIEZJWE1FOiBXYXJuLCBkZXByZWNhdGUsIGFuZCBwb3RlbnRpYWxseSByZW1vdmUgdGhpcy4KK1BST0MoWW9uYWgsICJ5b25haCIsIFBST0NfMzJfQklUKQorLy9AfQorCisvLy8gXG5hbWUgTmV0YnVyc3QKKy8vLyBOZXRidXJzdCBtaWNyb2FyY2hpdGVjdHVyZSBiYXNlZCBwcm9jZXNzb3JzLgorLy9AeworUFJPQyhQZW50aXVtNCwgInBlbnRpdW00IiwgUFJPQ18zMl9CSVQpCitQUk9DX0FMSUFTKFBlbnRpdW00LCAicGVudGl1bTRtIikKKworUFJPQyhQcmVzY290dCwgInByZXNjb3R0IiwgUFJPQ18zMl9CSVQpCitQUk9DKE5vY29uYSwgIm5vY29uYSIsIFBST0NfNjRfQklUKQorLy9AfQorCisvLy8gXG5hbWUgQ29yZQorLy8vIENvcmUgbWljcm9hcmNoaXRlY3R1cmUgYmFzZWQgcHJvY2Vzc29ycy4KKy8vQHsKK1BST0NfV0lUSF9GRUFUKENvcmUyLCAiY29yZTIiLCBQUk9DXzY0X0JJVCwgRkVBVFVSRV9TU1NFMykKKworLy8vIFRoaXMgZW51bWVyYXRvciwgbGlrZSBZb25haCwgaXMgYSBiaXQgb2RkLiBJdCBpcyBhbm90aGVyCisvLy8gY29kZW5hbWUgd2hpY2ggR0NDIG5vIGxvbmdlciBhY2NlcHRzIGFzIGFuIG9wdGlvbiB0byAtbWFyY2gsIGJ1dCBDbGFuZworLy8vIGhhcyBzb21lIGxvZ2ljIGZvciByZWNvZ25pemluZyBpdC4KKy8vIEZJWE1FOiBXYXJuLCBkZXByZWNhdGUsIGFuZCBwb3RlbnRpYWxseSByZW1vdmUgdGhpcy4KK1BST0MoUGVucnluLCAicGVucnluIiwgUFJPQ182NF9CSVQpCisvL0B9CisKKy8vLyBcbmFtZSBBdG9tCisvLy8gQXRvbSBwcm9jZXNzb3JzCisvL0B7CitQUk9DX1dJVEhfRkVBVChCb25uZWxsLCAiYm9ubmVsbCIsIFBST0NfNjRfQklULCBGRUFUVVJFX1NTU0UzKQorUFJPQ19BTElBUyhCb25uZWxsLCAiYXRvbSIpCisKK1BST0NfV0lUSF9GRUFUKFNpbHZlcm1vbnQsICJzaWx2ZXJtb250IiwgUFJPQ182NF9CSVQsIEZFQVRVUkVfU1NFNF8yKQorUFJPQ19BTElBUyhTaWx2ZXJtb250LCAic2xtIikKKworUFJPQyhHb2xkbW9udCwgImdvbGRtb250IiwgUFJPQ182NF9CSVQpCisvL0B9CisKKy8vLyBcbmFtZSBOZWhhbGVtCisvLy8gTmVoYWxlbSBtaWNyb2FyY2hpdGVjdHVyZSBiYXNlZCBwcm9jZXNzb3JzLgorUFJPQ19XSVRIX0ZFQVQoTmVoYWxlbSwgIm5laGFsZW0iLCBQUk9DXzY0X0JJVCwgRkVBVFVSRV9TU0U0XzIpCitQUk9DX0FMSUFTKE5laGFsZW0sICJjb3JlaTciKQorCisvLy8gXG5hbWUgV2VzdG1lcmUKKy8vLyBXZXN0bWVyZSBtaWNyb2FyY2hpdGVjdHVyZSBiYXNlZCBwcm9jZXNzb3JzLgorUFJPQ19XSVRIX0ZFQVQoV2VzdG1lcmUsICJ3ZXN0bWVyZSIsIFBST0NfNjRfQklULCBGRUFUVVJFX1BDTE1VTCkKKworLy8vIFxuYW1lIFNhbmR5IEJyaWRnZQorLy8vIFNhbmR5IEJyaWRnZSBtaWNyb2FyY2hpdGVjdHVyZSBiYXNlZCBwcm9jZXNzb3JzLgorUFJPQ19XSVRIX0ZFQVQoU2FuZHlCcmlkZ2UsICJzYW5keWJyaWRnZSIsIFBST0NfNjRfQklULCBGRUFUVVJFX0FWWCkKK1BST0NfQUxJQVMoU2FuZHlCcmlkZ2UsICJjb3JlaTctYXZ4IikKKworLy8vIFxuYW1lIEl2eSBCcmlkZ2UKKy8vLyBJdnkgQnJpZGdlIG1pY3JvYXJjaGl0ZWN0dXJlIGJhc2VkIHByb2Nlc3NvcnMuCitQUk9DX1dJVEhfRkVBVChJdnlCcmlkZ2UsICJpdnlicmlkZ2UiLCBQUk9DXzY0X0JJVCwgRkVBVFVSRV9BVlgpCitQUk9DX0FMSUFTKEl2eUJyaWRnZSwgImNvcmUtYXZ4LWkiKQorCisvLy8gXG5hbWUgSGFzd2VsbAorLy8vIEhhc3dlbGwgbWljcm9hcmNoaXRlY3R1cmUgYmFzZWQgcHJvY2Vzc29ycy4KK1BST0NfV0lUSF9GRUFUKEhhc3dlbGwsICJoYXN3ZWxsIiwgUFJPQ182NF9CSVQsIEZFQVRVUkVfQVZYMikKK1BST0NfQUxJQVMoSGFzd2VsbCwgImNvcmUtYXZ4MiIpCisKKy8vLyBcbmFtZSBCcm9hZHdlbGwKKy8vLyBCcm9hZHdlbGwgbWljcm9hcmNoaXRlY3R1cmUgYmFzZWQgcHJvY2Vzc29ycy4KK1BST0NfV0lUSF9GRUFUKEJyb2Fkd2VsbCwgImJyb2Fkd2VsbCIsIFBST0NfNjRfQklULCBGRUFUVVJFX0FWWDIpCisKKy8vLyBcbmFtZSBTa3lsYWtlIENsaWVudAorLy8vIFNreWxha2UgY2xpZW50IG1pY3JvYXJjaGl0ZWN0dXJlIGJhc2VkIHByb2Nlc3NvcnMuCitQUk9DX1dJVEhfRkVBVChTa3lsYWtlQ2xpZW50LCAic2t5bGFrZSIsIFBST0NfNjRfQklULCBGRUFUVVJFX0FWWDIpCisKKy8vLyBcbmFtZSBTa3lsYWtlIFNlcnZlcgorLy8vIFNreWxha2Ugc2VydmVyIG1pY3JvYXJjaGl0ZWN0dXJlIGJhc2VkIHByb2Nlc3NvcnMuCitQUk9DX1dJVEhfRkVBVChTa3lsYWtlU2VydmVyLCAic2t5bGFrZS1hdng1MTIiLCBQUk9DXzY0X0JJVCwgRkVBVFVSRV9BVlg1MTJGKQorUFJPQ19BTElBUyhTa3lsYWtlU2VydmVyLCAic2t4IikKKworLy8vIFxuYW1lIENhbm5vbmxha2UgQ2xpZW50CisvLy8gQ2Fubm9ubGFrZSBjbGllbnQgbWljcm9hcmNoaXRlY3R1cmUgYmFzZWQgcHJvY2Vzc29ycy4KK1BST0NfV0lUSF9GRUFUKENhbm5vbmxha2UsICJjYW5ub25sYWtlIiwgUFJPQ182NF9CSVQsIEZFQVRVUkVfQVZYNTEyVkJNSSkKKworLy8vIFxuYW1lIEljZWxha2UgQ2xpZW50CisvLy8gSWNlbGFrZSBjbGllbnQgbWljcm9hcmNoaXRlY3R1cmUgYmFzZWQgcHJvY2Vzc29ycy4KK1BST0MoSWNlbGFrZSwgImljZWxha2UiLCBQUk9DXzY0X0JJVCkKKworLy8vIFxuYW1lIEtuaWdodHMgTGFuZGluZworLy8vIEtuaWdodHMgTGFuZGluZyBwcm9jZXNzb3IuCitQUk9DX1dJVEhfRkVBVChLTkwsICJrbmwiLCBQUk9DXzY0X0JJVCwgRkVBVFVSRV9BVlg1MTJGKQorCisvLy8gXG5hbWUgS25pZ2h0cyBNaWxsCisvLy8gS25pZ2h0cyBNaWxsIHByb2Nlc3Nvci4KK1BST0NfV0lUSF9GRUFUKEtOTSwgImtubSIsIFBST0NfNjRfQklULCBGRUFUVVJFX0FWWDUxMjRGTUFQUykKKworLy8vIFxuYW1lIExha2Vtb250CisvLy8gTGFrZW1vbnQgbWljcm9hcmNoaXRlY3R1cmUgYmFzZWQgcHJvY2Vzc29ycy4KK1BST0MoTGFrZW1vbnQsICJsYWtlbW9udCIsIFBST0NfMzJfQklUKQorCisvLy8gXG5hbWUgSzYKKy8vLyBLNiBhcmNoaXRlY3R1cmUgcHJvY2Vzc29ycy4KKy8vQHsKK1BST0MoSzYsICJrNiIsIFBST0NfMzJfQklUKQorUFJPQyhLNl8yLCAiazYtMiIsIFBST0NfMzJfQklUKQorUFJPQyhLNl8zLCAiazYtMyIsIFBST0NfMzJfQklUKQorLy9AfQorCisvLy8gXG5hbWUgSzcKKy8vLyBLNyBhcmNoaXRlY3R1cmUgcHJvY2Vzc29ycy4KKy8vQHsKK1BST0MoQXRobG9uLCAiYXRobG9uIiwgUFJPQ18zMl9CSVQpCitQUk9DX0FMSUFTKEF0aGxvbiwgImF0aGxvbi10YmlyZCIpCisKK1BST0MoQXRobG9uWFAsICJhdGhsb24teHAiLCBQUk9DXzMyX0JJVCkKK1BST0NfQUxJQVMoQXRobG9uWFAsICJhdGhsb24tbXAiKQorUFJPQ19BTElBUyhBdGhsb25YUCwgImF0aGxvbi00IikKKy8vQH0KKworLy8vIFxuYW1lIEs4CisvLy8gSzggYXJjaGl0ZWN0dXJlIHByb2Nlc3NvcnMuCisvL0B7CitQUk9DKEs4LCAiazgiLCBQUk9DXzY0X0JJVCkKK1BST0NfQUxJQVMoSzgsICJhdGhsb242NCIpCitQUk9DX0FMSUFTKEs4LCAiYXRobG9uLWZ4IikKK1BST0NfQUxJQVMoSzgsICJvcHRlcm9uIikKKworUFJPQyhLOFNTRTMsICJrOC1zc2UzIiwgUFJPQ182NF9CSVQpCitQUk9DX0FMSUFTKEs4U1NFMywgImF0aGxvbjY0LXNzZTMiKQorUFJPQ19BTElBUyhLOFNTRTMsICJvcHRlcm9uLXNzZTMiKQorCitQUk9DX1dJVEhfRkVBVChBTURGQU0xMCwgImFtZGZhbTEwIiwgUFJPQ182NF9CSVQsIEZFQVRVUkVfU1NFNF9BKQorUFJPQ19BTElBUyhBTURGQU0xMCwgImJhcmNlbG9uYSIpCisvL0B9CisKKy8vLyBcbmFtZSBCb2JjYXQKKy8vLyBCb2JjYXQgYXJjaGl0ZWN0dXJlIHByb2Nlc3NvcnMuCisvL0B7CitQUk9DX1dJVEhfRkVBVChCVFZFUjEsICJidHZlcjEiLCBQUk9DXzY0X0JJVCwgRkVBVFVSRV9TU0U0X0EpCitQUk9DX1dJVEhfRkVBVChCVFZFUjIsICJidHZlcjIiLCBQUk9DXzY0X0JJVCwgRkVBVFVSRV9CTUkpCisvL0B9CisKKy8vLyBcbmFtZSBCdWxsZG96ZXIKKy8vLyBCdWxsZG96ZXIgYXJjaGl0ZWN0dXJlIHByb2Nlc3NvcnMuCisvL0B7CitQUk9DX1dJVEhfRkVBVChCRFZFUjEsICJiZHZlcjEiLCBQUk9DXzY0X0JJVCwgRkVBVFVSRV9YT1ApCitQUk9DX1dJVEhfRkVBVChCRFZFUjIsICJiZHZlcjIiLCBQUk9DXzY0X0JJVCwgRkVBVFVSRV9GTUEpCitQUk9DX1dJVEhfRkVBVChCRFZFUjMsICJiZHZlcjMiLCBQUk9DXzY0X0JJVCwgRkVBVFVSRV9GTUEpCitQUk9DX1dJVEhfRkVBVChCRFZFUjQsICJiZHZlcjQiLCBQUk9DXzY0X0JJVCwgRkVBVFVSRV9BVlgyKQorLy9AfQorCisvLy8gXG5hbWUgemVuCisvLy8gWmVuIGFyY2hpdGVjdHVyZSBwcm9jZXNzb3JzLgorLy9AeworUFJPQ19XSVRIX0ZFQVQoWk5WRVIxLCAiem52ZXIxIiwgUFJPQ182NF9CSVQsIEZFQVRVUkVfQVZYMikKKy8vQH0KKworLy8vIFRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KKy8vLyBVc2VycyBzaG91bGQgcHJlZmVyIEs4LgorLy8gRklYTUU6IFdhcm4gb24gdGhpcyB3aGVuIHRoZSBDUFUgaXMgc2V0IHRvIGl0LgorLy9AeworUFJPQyh4ODZfNjQsICJ4ODYtNjQiLCBQUk9DXzY0X0JJVCkKKy8vQH0KKworLy8vIFxuYW1lIEdlb2RlCisvLy8gR2VvZGUgcHJvY2Vzc29ycy4KKy8vQHsKK1BST0MoR2VvZGUsICJnZW9kZSIsIFBST0NfMzJfQklUKQorLy9AfQorCisvLyBMaXN0IG9mIENQVSBTdXBwb3J0cyBmZWF0dXJlcyBpbiBvcmRlci4gIFRoZXNlIG5lZWQgdG8gcmVtYWluIGluIHRoZSBvcmRlcgorLy8gcmVxdWlyZWQgYnkgYXR0cmlidXRlICd0YXJnZXQnIGNoZWNraW5nLiAgTm90ZSB0aGF0IG5vdCBhbGwgYXJlIHN1cHBvcnRlZC8KKy8vIHByaW9yaXRpemVkIGJ5IEdDQywgc28gc3luY2hyb25pemF0aW9uIHdpdGggR0NDJ3MgaW1wbGVtZW50YXRpb24gbWF5IHJlcXVpcmUKKy8vIGNoYW5naW5nIHNvbWUgZXhpc3RpbmcgdmFsdWVzLgorRkVBVFVSRShGRUFUVVJFX0NNT1YpCitGRUFUVVJFKEZFQVRVUkVfTU1YKQorRkVBVFVSRShGRUFUVVJFX1NTRSkKK0ZFQVRVUkUoRkVBVFVSRV9TU0UyKQorRkVBVFVSRShGRUFUVVJFX1NTRTMpCitGRUFUVVJFKEZFQVRVUkVfU1NTRTMpCitGRUFUVVJFKEZFQVRVUkVfU1NFNF9BKQorRkVBVFVSRShGRUFUVVJFX1NTRTRfMSkKK0ZFQVRVUkUoRkVBVFVSRV9TU0U0XzIpCitGRUFUVVJFKEZFQVRVUkVfUE9QQ05UKQorRkVBVFVSRShGRUFUVVJFX0FFUykKK0ZFQVRVUkUoRkVBVFVSRV9QQ0xNVUwpCitGRUFUVVJFKEZFQVRVUkVfQVZYKQorRkVBVFVSRShGRUFUVVJFX0JNSSkKK0ZFQVRVUkUoRkVBVFVSRV9GTUE0KQorRkVBVFVSRShGRUFUVVJFX1hPUCkKK0ZFQVRVUkUoRkVBVFVSRV9GTUEpCitGRUFUVVJFKEZFQVRVUkVfQk1JMikKK0ZFQVRVUkUoRkVBVFVSRV9BVlgyKQorRkVBVFVSRShGRUFUVVJFX0FWWDUxMkYpCitGRUFUVVJFKEZFQVRVUkVfQVZYNTEyVkwpCitGRUFUVVJFKEZFQVRVUkVfQVZYNTEyQlcpCitGRUFUVVJFKEZFQVRVUkVfQVZYNTEyRFEpCitGRUFUVVJFKEZFQVRVUkVfQVZYNTEyQ0QpCitGRUFUVVJFKEZFQVRVUkVfQVZYNTEyRVIpCitGRUFUVVJFKEZFQVRVUkVfQVZYNTEyUEYpCitGRUFUVVJFKEZFQVRVUkVfQVZYNTEyVkJNSSkKK0ZFQVRVUkUoRkVBVFVSRV9BVlg1MTJJRk1BKQorRkVBVFVSRShGRUFUVVJFX0FWWDUxMjRWTk5JVykKK0ZFQVRVUkUoRkVBVFVSRV9BVlg1MTI0Rk1BUFMpCitGRUFUVVJFKEZFQVRVUkVfQVZYNTEyVlBPUENOVERRKQorCisjdW5kZWYgUFJPQ182NF9CSVQKKyN1bmRlZiBQUk9DXzMyX0JJVAorI3VuZGVmIEZFQVRVUkUKKyN1bmRlZiBQUk9DCisjdW5kZWYgUFJPQ19BTElBUworI3VuZGVmIFBST0NfV0lUSF9GRUFUCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9YUmF5TGlzdHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL1hSYXlMaXN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZmVhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9YUmF5TGlzdHMuaApAQCAtMCwwICsxLDU1IEBACisvLz09PS0tLSBYUmF5TGlzdHMuaCAtIFhSYXkgYXV0b21hdGljIGF0dHJpYnV0aW9uIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFVzZXItcHJvdmlkZWQgZmlsdGVycyBmb3IgYWx3YXlzL25ldmVyIFhSYXkgaW5zdHJ1bWVudGluZyBjZXJ0YWluIGZ1bmN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX1hSQVlMSVNUU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfWFJBWUxJU1RTX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TcGVjaWFsQ2FzZUxpc3QuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIFhSYXlGdW5jdGlvbkZpbHRlciB7CisgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpTcGVjaWFsQ2FzZUxpc3Q+IEFsd2F5c0luc3RydW1lbnQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpTcGVjaWFsQ2FzZUxpc3Q+IE5ldmVySW5zdHJ1bWVudDsKKyAgU291cmNlTWFuYWdlciAmU007CisKK3B1YmxpYzoKKyAgWFJheUZ1bmN0aW9uRmlsdGVyKEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBBbHdheXNJbnN0cnVtZW50UGF0aHMsCisgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxzdGQ6OnN0cmluZz4gTmV2ZXJJbnN0cnVtZW50UGF0aHMsCisgICAgICAgICAgICAgICAgICAgICBTb3VyY2VNYW5hZ2VyICZTTSk7CisKKyAgZW51bSBjbGFzcyBJbWJ1ZUF0dHJpYnV0ZSB7CisgICAgTk9ORSwKKyAgICBBTFdBWVMsCisgICAgTkVWRVIsCisgICAgQUxXQVlTX0FSRzEsCisgIH07CisKKyAgSW1idWVBdHRyaWJ1dGUgc2hvdWxkSW1idWVGdW5jdGlvbihTdHJpbmdSZWYgRnVuY3Rpb25OYW1lKSBjb25zdDsKKworICBJbWJ1ZUF0dHJpYnV0ZQorICBzaG91bGRJbWJ1ZUZ1bmN0aW9uc0luRmlsZShTdHJpbmdSZWYgRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDYXRlZ29yeSA9IFN0cmluZ1JlZigpKSBjb25zdDsKKworICBJbWJ1ZUF0dHJpYnV0ZSBzaG91bGRJbWJ1ZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQ2F0ZWdvcnkgPSBTdHJpbmdSZWYoKSkgY29uc3Q7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL2FybV9mcDE2LmluYyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Jhc2ljL2FybV9mcDE2LmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2ZlMTlhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvYXJtX2ZwMTYuaW5jCkBAIC0wLDAgKzEsMTEwIEBACisjaWZkZWYgR0VUX05FT05fQlVJTFRJTlMKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFiZGhfZjE2LCAiaGhoIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92YWJzaF9mMTYsICJoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFkZGhfZjE2LCAiaGhoIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2FnZWhfZjE2LCAiVXNoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNhZ3RoX2YxNiwgIlVzaGgiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjYWxlaF9mMTYsICJVc2hoIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2FsdGhfZjE2LCAiVXNoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNlcWhfZjE2LCAiVXNoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNlcXpoX2YxNiwgIlVzaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNnZWhfZjE2LCAiVXNoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNnZXpoX2YxNiwgIlVzaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNndGhfZjE2LCAiVXNoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNndHpoX2YxNiwgIlVzaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNsZWhfZjE2LCAiVXNoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNsZXpoX2YxNiwgIlVzaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNsdGhfZjE2LCAiVXNoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNsdHpoX2YxNiwgIlVzaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGFoX3MxNl9mMTYsICJzaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGFoX3MzMl9mMTYsICJpaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGFoX3M2NF9mMTYsICJXaWgiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRhaF91MTZfZjE2LCAiVXNoIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0YWhfdTMyX2YxNiwgIlVpaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGFoX3U2NF9mMTYsICJVV2loIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0aF9mMTZfczE2LCAiaHMiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRoX2YxNl9zMzIsICJoaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGhfZjE2X3M2NCwgImhXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGhfZjE2X3UxNiwgImhVcyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGhfZjE2X3UzMiwgImhVaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGhfZjE2X3U2NCwgImhVV2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRoX25fZjE2X3MxNiwgImhzSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRoX25fZjE2X3MzMiwgImhpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRoX25fZjE2X3M2NCwgImhXaUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0aF9uX2YxNl91MTYsICJoVXNJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGhfbl9mMTZfdTMyLCAiaFVpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRoX25fZjE2X3U2NCwgImhVV2lJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGhfbl9zMTZfZjE2LCAic2hJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGhfbl9zMzJfZjE2LCAiaWhJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGhfbl9zNjRfZjE2LCAiV2loSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRoX25fdTE2X2YxNiwgIlVzaElpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0aF9uX3UzMl9mMTYsICJVaWhJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGhfbl91NjRfZjE2LCAiVVdpaElpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0aF9zMTZfZjE2LCAic2giLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRoX3MzMl9mMTYsICJpaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGhfczY0X2YxNiwgIldpaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGhfdTE2X2YxNiwgIlVzaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGhfdTMyX2YxNiwgIlVpaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGhfdTY0X2YxNiwgIlVXaWgiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRtaF9zMTZfZjE2LCAic2giLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRtaF9zMzJfZjE2LCAiaWgiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRtaF9zNjRfZjE2LCAiV2loIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0bWhfdTE2X2YxNiwgIlVzaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dG1oX3UzMl9mMTYsICJVaWgiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRtaF91NjRfZjE2LCAiVVdpaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dG5oX3MxNl9mMTYsICJzaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dG5oX3MzMl9mMTYsICJpaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dG5oX3M2NF9mMTYsICJXaWgiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRuaF91MTZfZjE2LCAiVXNoIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0bmhfdTMyX2YxNiwgIlVpaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dG5oX3U2NF9mMTYsICJVV2loIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0cGhfczE2X2YxNiwgInNoIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0cGhfczMyX2YxNiwgImloIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0cGhfczY0X2YxNiwgIldpaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dHBoX3UxNl9mMTYsICJVc2giLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRwaF91MzJfZjE2LCAiVWloIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0cGhfdTY0X2YxNiwgIlVXaWgiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZkaXZoX2YxNiwgImhoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmZtYWhfZjE2LCAiaGhoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmZtc2hfZjE2LCAiaGhoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1heGhfZjE2LCAiaGhoIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWF4bm1oX2YxNiwgImhoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1pbmhfZjE2LCAiaGhoIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWlubm1oX2YxNiwgImhoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm11bGhfZjE2LCAiaGhoIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bXVseGhfZjE2LCAiaGhoIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bmVnaF9mMTYsICJoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJlY3BlaF9mMTYsICJoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJlY3BzaF9mMTYsICJoaGgiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZyZWNweGhfZjE2LCAiaGgiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZybmRhaF9mMTYsICJoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJuZGhfZjE2LCAiaGgiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZybmRpaF9mMTYsICJoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJuZG1oX2YxNiwgImhoIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cm5kbmhfZjE2LCAiaGgiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZybmRwaF9mMTYsICJoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJuZHhoX2YxNiwgImhoIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cnNxcnRlaF9mMTYsICJoaCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJzcXJ0c2hfZjE2LCAiaGhoIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c3FydGhfZjE2LCAiaGgiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzdWJoX2YxNiwgImhoaCIsICJuIikKKyNlbmRpZgorCisjaWZkZWYgR0VUX05FT05fT1ZFUkxPQURfQ0hFQ0sKKyNlbmRpZgorCisjaWZkZWYgR0VUX05FT05fSU1NRURJQVRFX0NIRUNLCitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dGhfbl9zMzJfZjE2OiBpID0gMTsgdSA9IDA7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRoX25fczY0X2YxNjogaSA9IDE7IHUgPSAwOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0aF9uX3MxNl9mMTY6IGkgPSAxOyB1ID0gMDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dGhfbl91MzJfZjE2OiBpID0gMTsgdSA9IDA7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRoX25fdTY0X2YxNjogaSA9IDE7IHUgPSAwOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0aF9uX3UxNl9mMTY6IGkgPSAxOyB1ID0gMDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dGhfbl9mMTZfdTMyOiBpID0gMTsgdSA9IDA7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRoX25fZjE2X3U2NDogaSA9IDE7IHUgPSAwOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0aF9uX2YxNl91MTY6IGkgPSAxOyB1ID0gMDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dGhfbl9mMTZfczMyOiBpID0gMTsgdSA9IDA7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRoX25fZjE2X3M2NDogaSA9IDE7IHUgPSAwOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0aF9uX2YxNl9zMTY6IGkgPSAxOyB1ID0gMDsgYnJlYWs7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvYXJtX25lb24uaW5jIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQmFzaWMvYXJtX25lb24uaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwN2I1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9CYXNpYy9hcm1fbmVvbi5pbmMKQEAgLTAsMCArMSwxMjI3IEBACisjaWZkZWYgR0VUX05FT05fQlVJTFRJTlMKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFiZF92LCAiVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFiZGRfZjY0LCAiZGRkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92YWJkcV92LCAiVjE2U2NWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFiZHNfZjMyLCAiZmZmIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92YWJzX3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZhYnNkX3M2NCwgIldpV2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZhYnNxX3YsICJWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFkZGRfczY0LCAiV2lXaVdpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92YWRkZF91NjQsICJVV2lVV2lVV2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZhZGRobl92LCAiVjhTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92YWRkbHZfczE2LCAiaVY0cyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFkZGx2X3MzMiwgIldpVjJpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92YWRkbHZfczgsICJzVjhTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFkZGx2X3UxNiwgIlVpVjRVcyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFkZGx2X3UzMiwgIlVXaVYyVWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZhZGRsdl91OCwgIlVzVjhTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFkZGx2cV9zMTYsICJpVjhzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92YWRkbHZxX3MzMiwgIldpVjRpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92YWRkbHZxX3M4LCAic1YxNlNjIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92YWRkbHZxX3UxNiwgIlVpVjhVcyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFkZGx2cV91MzIsICJVV2lWNFVpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92YWRkbHZxX3U4LCAiVXNWMTZTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFkZHZfZjMyLCAiZlYyZiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFkZHZfczE2LCAic1Y0cyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFkZHZfczMyLCAiaVYyaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFkZHZfczgsICJTY1Y4U2MiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZhZGR2X3UxNiwgIlVzVjRVcyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFkZHZfdTMyLCAiVWlWMlVpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92YWRkdl91OCwgIlNjVjhTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFkZHZxX2YzMiwgImZWNGYiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZhZGR2cV9mNjQsICJkVjJkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92YWRkdnFfczE2LCAic1Y4cyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFkZHZxX3MzMiwgImlWNGkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZhZGR2cV9zNjQsICJXaVYyV2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZhZGR2cV9zOCwgIlNjVjE2U2MiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZhZGR2cV91MTYsICJVc1Y4VXMiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZhZGR2cV91MzIsICJVaVY0VWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZhZGR2cV91NjQsICJVV2lWMlVXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFkZHZxX3U4LCAiU2NWMTZTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFlc2RxX3YsICJWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92YWVzZXFfdiwgIlYxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZhZXNpbWNxX3YsICJWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmFlc21jcV92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zic2xfdiwgIlY4U2NWOFNjVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92YnNscV92LCAiVjE2U2NWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2FnZV92LCAiVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNhZ2VkX2Y2NCwgIlVXaWRkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2FnZXFfdiwgIlYxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjYWdlc19mMzIsICJVaWZmIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2FndF92LCAiVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNhZ3RkX2Y2NCwgIlVXaWRkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2FndHFfdiwgIlYxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjYWd0c19mMzIsICJVaWZmIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2FsZV92LCAiVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNhbGVkX2Y2NCwgIlVXaWRkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2FsZXFfdiwgIlYxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjYWxlc19mMzIsICJVaWZmIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2FsdF92LCAiVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNhbHRkX2Y2NCwgIlVXaWRkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2FsdHFfdiwgIlYxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjYWx0c19mMzIsICJVaWZmIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2VxZF9mNjQsICJVV2lkZCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNlcWRfczY0LCAiV2lXaVdpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2VxZF91NjQsICJVV2lVV2lVV2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjZXFzX2YzMiwgIlVpZmYiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjZXF6X3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjZXF6ZF9mNjQsICJVV2lkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2VxemRfczY0LCAiV2lXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNlcXpkX3U2NCwgIlVXaVVXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNlcXpxX3YsICJWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNlcXpzX2YzMiwgIlVpZiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNnZWRfZjY0LCAiVVdpZGQiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjZ2VkX3M2NCwgIldpV2lXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNnZWRfdTY0LCAiVVdpVVdpVVdpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2dlc19mMzIsICJVaWZmIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2dlel92LCAiVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2dlemRfZjY0LCAiVVdpZCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNnZXpkX3M2NCwgIldpV2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjZ2V6cV92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjZ2V6c19mMzIsICJVaWYiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjZ3RkX2Y2NCwgIlVXaWRkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2d0ZF9zNjQsICJXaVdpV2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjZ3RkX3U2NCwgIlVXaVVXaVVXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNndHNfZjMyLCAiVWlmZiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNndHpfdiwgIlY4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNndHpkX2Y2NCwgIlVXaWQiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjZ3R6ZF9zNjQsICJXaVdpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2d0enFfdiwgIlYxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2d0enNfZjMyLCAiVWlmIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2xlZF9mNjQsICJVV2lkZCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNsZWRfczY0LCAiV2lXaVdpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2xlZF91NjQsICJVV2lVV2lVV2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjbGVzX2YzMiwgIlVpZmYiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjbGV6X3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjbGV6ZF9mNjQsICJVV2lkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2xlemRfczY0LCAiV2lXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNsZXpxX3YsICJWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNsZXpzX2YzMiwgIlVpZiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNsc192LCAiVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2xzcV92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjbHRkX2Y2NCwgIlVXaWRkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2x0ZF9zNjQsICJXaVdpV2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjbHRkX3U2NCwgIlVXaVVXaVVXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNsdHNfZjMyLCAiVWlmZiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNsdHpfdiwgIlY4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNsdHpkX2Y2NCwgIlVXaWQiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjbHR6ZF9zNjQsICJXaVdpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2x0enFfdiwgIlYxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2x0enNfZjMyLCAiVWlmIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y2x6X3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjbHpxX3YsICJWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmNudF92LCAiVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y250cV92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRfZjE2X2YzMiwgIlY4U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRfZjE2X3YsICJWNGhWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dF9mMzJfZjE2LCAiVjE2U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dF9mMzJfZjY0LCAiVjhTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dF9mMzJfdiwgIlYyZlY4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0X2Y2NF9mMzIsICJWMTZTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0X2Y2NF92LCAiVjFkVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRfbl9mMTZfdiwgIlY0aFY4U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRfbl9mMzJfdiwgIlYyZlY4U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRfbl9mNjRfdiwgIlYxZFY4U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRfbl9zMTZfdiwgIlY4U2NWOFNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0X25fczMyX3YsICJWOFNjVjhTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dF9uX3M2NF92LCAiVjhTY1Y4U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRfbl91MTZfdiwgIlY4U2NWOFNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0X25fdTMyX3YsICJWOFNjVjhTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dF9uX3U2NF92LCAiVjhTY1Y4U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRfczE2X3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRfczMyX3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRfczY0X3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRfdTE2X3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRfdTMyX3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRfdTY0X3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRhX3MxNl92LCAiVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0YV9zMzJfdiwgIlY4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGFfczY0X3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRhX3UxNl92LCAiVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0YV91MzJfdiwgIlY4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGFfdTY0X3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRhZF9zNjRfZjY0LCAiV2lkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0YWRfdTY0X2Y2NCwgIlVXaWQiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRhcV9zMTZfdiwgIlYxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0YXFfczMyX3YsICJWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGFxX3M2NF92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRhcV91MTZfdiwgIlYxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0YXFfdTMyX3YsICJWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGFxX3U2NF92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRhc19zMzJfZjMyLCAiaWYiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRhc191MzJfZjMyLCAiVWlmIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0ZF9mNjRfczY0LCAiZFdpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0ZF9mNjRfdTY0LCAiZFVXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGRfbl9mNjRfczY0LCAiZFdpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRkX25fZjY0X3U2NCwgImRVV2lJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGRfbl9zNjRfZjY0LCAiV2lkSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRkX25fdTY0X2Y2NCwgIlVXaWRJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGRfczY0X2Y2NCwgIldpZCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dGRfdTY0X2Y2NCwgIlVXaWQiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRtX3MxNl92LCAiVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0bV9zMzJfdiwgIlY4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dG1fczY0X3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRtX3UxNl92LCAiVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0bV91MzJfdiwgIlY4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dG1fdTY0X3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRtZF9zNjRfZjY0LCAiV2lkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0bWRfdTY0X2Y2NCwgIlVXaWQiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRtcV9zMTZfdiwgIlYxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0bXFfczMyX3YsICJWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dG1xX3M2NF92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRtcV91MTZfdiwgIlYxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0bXFfdTMyX3YsICJWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dG1xX3U2NF92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRtc19zMzJfZjMyLCAiaWYiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRtc191MzJfZjMyLCAiVWlmIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0bl9zMTZfdiwgIlY4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dG5fczMyX3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRuX3M2NF92LCAiVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0bl91MTZfdiwgIlY4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dG5fdTMyX3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRuX3U2NF92LCAiVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0bmRfczY0X2Y2NCwgIldpZCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dG5kX3U2NF9mNjQsICJVV2lkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0bnFfczE2X3YsICJWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dG5xX3MzMl92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRucV9zNjRfdiwgIlYxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0bnFfdTE2X3YsICJWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dG5xX3UzMl92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRucV91NjRfdiwgIlYxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0bnNfczMyX2YzMiwgImlmIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0bnNfdTMyX2YzMiwgIlVpZiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dHBfczE2X3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRwX3MzMl92LCAiVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0cF9zNjRfdiwgIlY4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dHBfdTE2X3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRwX3UzMl92LCAiVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0cF91NjRfdiwgIlY4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dHBkX3M2NF9mNjQsICJXaWQiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRwZF91NjRfZjY0LCAiVVdpZCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dHBxX3MxNl92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRwcV9zMzJfdiwgIlYxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0cHFfczY0X3YsICJWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dHBxX3UxNl92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRwcV91MzJfdiwgIlYxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0cHFfdTY0X3YsICJWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dHBzX3MzMl9mMzIsICJpZiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dHBzX3UzMl9mMzIsICJVaWYiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRxX2YxNl92LCAiVjhoVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0cV9mMzJfdiwgIlY0ZlYxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dHFfZjY0X3YsICJWMmRWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRxX25fZjE2X3YsICJWOGhWMTZTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dHFfbl9mMzJfdiwgIlY0ZlYxNlNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX2Y2NF92LCAiVjJkVjE2U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRxX25fczE2X3YsICJWMTZTY1YxNlNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX3MzMl92LCAiVjE2U2NWMTZTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dHFfbl9zNjRfdiwgIlYxNlNjVjE2U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRxX25fdTE2X3YsICJWMTZTY1YxNlNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX3UzMl92LCAiVjE2U2NWMTZTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dHFfbl91NjRfdiwgIlYxNlNjVjE2U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRxX3MxNl92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRxX3MzMl92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRxX3M2NF92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRxX3UxNl92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRxX3UzMl92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRxX3U2NF92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRzX2YzMl9zMzIsICJmaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dHNfZjMyX3UzMiwgImZVaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dHNfbl9mMzJfczMyLCAiZmlJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmN2dHNfbl9mMzJfdTMyLCAiZlVpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRzX25fczMyX2YzMiwgImlmSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRzX25fdTMyX2YzMiwgIlVpZklpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0c19zMzJfZjMyLCAiaWYiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnRzX3UzMl9mMzIsICJVaWYiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZjdnR4X2YzMl92LCAiVjJmVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Y3Z0eGRfZjMyX2Y2NCwgImZkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92ZHVwYl9sYW5lX2k4LCAiU2NWOFNjSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZkdXBiX2xhbmVxX2k4LCAiU2NWMTZTY0lpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92ZHVwZF9sYW5lX2Y2NCwgImRWMWRJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmR1cGRfbGFuZV9pNjQsICJVV2lWMVdpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZkdXBkX2xhbmVxX2Y2NCwgImRWMmRJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmR1cGRfbGFuZXFfaTY0LCAiVVdpVjJXaUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92ZHVwaF9sYW5lX2YxNiwgImhWNGhJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmR1cGhfbGFuZV9pMTYsICJVc1Y0c0lpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92ZHVwaF9sYW5lcV9mMTYsICJoVjhoSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZkdXBoX2xhbmVxX2kxNiwgIlVzVjhzSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZkdXBzX2xhbmVfZjMyLCAiZlYyZklpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92ZHVwc19sYW5lX2kzMiwgIlVpVjJpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZkdXBzX2xhbmVxX2YzMiwgImZWNGZJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmR1cHNfbGFuZXFfaTMyLCAiVWlWNGlJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmV4dF92LCAiVjhTY1Y4U2NWOFNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92ZXh0cV92LCAiVjE2U2NWMTZTY1YxNlNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Zm1hX2xhbmVfdiwgIlY4U2NWOFNjVjhTY1Y4U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZmbWFfbGFuZXFfdiwgIlY4U2NWOFNjVjhTY1YxNlNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Zm1hX3YsICJWOFNjVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmZtYWRfbGFuZV9mNjQsICJkZGRWMWRJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmZtYWRfbGFuZXFfZjY0LCAiZGRkVjJkSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZmbWFoX2xhbmVfZjE2LCAiaGhoVjRoSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZmbWFoX2xhbmVxX2YxNiwgImhoaFY4aElpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Zm1hcV9sYW5lX3YsICJWMTZTY1YxNlNjVjE2U2NWOFNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Zm1hcV9sYW5lcV92LCAiVjE2U2NWMTZTY1YxNlNjVjE2U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZmbWFxX3YsICJWMTZTY1YxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZmbWFzX2xhbmVfZjMyLCAiZmZmVjJmSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZmbWFzX2xhbmVxX2YzMiwgImZmZlY0ZklpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfZjMyLCAiZlYyZklpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfZjY0LCAiZFYxZElpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfaTE2LCAiVXNWNHNJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmdldF9sYW5lX2kzMiwgIlVpVjJpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZnZXRfbGFuZV9pNjQsICJVV2lWMVdpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZnZXRfbGFuZV9pOCwgIlNjVjhTY0lpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Z2V0cV9sYW5lX2YzMiwgImZWNGZJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmdldHFfbGFuZV9mNjQsICJkVjJkSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfaTE2LCAiVXNWOHNJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmdldHFfbGFuZV9pMzIsICJVaVY0aUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92Z2V0cV9sYW5lX2k2NCwgIlVXaVYyV2lJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmdldHFfbGFuZV9pOCwgIlNjVjE2U2NJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmhhZGRfdiwgIlY4U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZoYWRkcV92LCAiVjE2U2NWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmhzdWJfdiwgIlY4U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zoc3VicV92LCAiVjE2U2NWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmxkMV9kdXBfdiwgIlY4U2N2QyppIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bGQxX2xhbmVfdiwgIlY4U2N2QypWOFNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bGQxX3YsICJWOFNjdkMqaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmxkMV94Ml92LCAidnYqdkMqaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmxkMV94M192LCAidnYqdkMqaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmxkMV94NF92LCAidnYqdkMqaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmxkMXFfZHVwX3YsICJWMTZTY3ZDKmkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZsZDFxX2xhbmVfdiwgIlYxNlNjdkMqVjE2U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZsZDFxX3YsICJWMTZTY3ZDKmkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZsZDFxX3gyX3YsICJ2dip2QyppIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bGQxcV94M192LCAidnYqdkMqaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmxkMXFfeDRfdiwgInZ2KnZDKmkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZsZDJfZHVwX3YsICJ2dip2QyppIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bGQyX2xhbmVfdiwgInZ2KnZDKlY4U2NWOFNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bGQyX3YsICJ2dip2QyppIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bGQycV9kdXBfdiwgInZ2KnZDKmkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZsZDJxX2xhbmVfdiwgInZ2KnZDKlYxNlNjVjE2U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZsZDJxX3YsICJ2dip2QyppIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bGQzX2R1cF92LCAidnYqdkMqaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmxkM19sYW5lX3YsICJ2dip2QypWOFNjVjhTY1Y4U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZsZDNfdiwgInZ2KnZDKmkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZsZDNxX2R1cF92LCAidnYqdkMqaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmxkM3FfbGFuZV92LCAidnYqdkMqVjE2U2NWMTZTY1YxNlNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bGQzcV92LCAidnYqdkMqaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmxkNF9kdXBfdiwgInZ2KnZDKmkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZsZDRfbGFuZV92LCAidnYqdkMqVjhTY1Y4U2NWOFNjVjhTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmxkNF92LCAidnYqdkMqaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmxkNHFfZHVwX3YsICJ2dip2QyppIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bGQ0cV9sYW5lX3YsICJ2dip2QypWMTZTY1YxNlNjVjE2U2NWMTZTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdmxkNHFfdiwgInZ2KnZDKmkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZsZHJxX3AxMjgsICJVTExMaXZDKiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1heF92LCAiVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1heG5tX3YsICJWOFNjVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWF4bm1xX3YsICJWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWF4bm12X2YxNiwgImhWOFNjIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWF4bm12X2YzMiwgImZWMmYiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZtYXhubXZxX2YxNiwgImhWMTZTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1heG5tdnFfZjMyLCAiZlY0ZiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1heG5tdnFfZjY0LCAiZFYyZCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1heHFfdiwgIlYxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZtYXh2X2YxNiwgImhWOFNjIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWF4dl9mMzIsICJmVjJmIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWF4dl9zMTYsICJzVjRzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWF4dl9zMzIsICJpVjJpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWF4dl9zOCwgIlNjVjhTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1heHZfdTE2LCAiVXNWNFVzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWF4dl91MzIsICJVaVYyVWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZtYXh2X3U4LCAiU2NWOFNjIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWF4dnFfZjE2LCAiaFYxNlNjIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWF4dnFfZjMyLCAiZlY0ZiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1heHZxX2Y2NCwgImRWMmQiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZtYXh2cV9zMTYsICJzVjhzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWF4dnFfczMyLCAiaVY0aSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1heHZxX3M4LCAiU2NWMTZTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1heHZxX3UxNiwgIlVzVjhVcyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1heHZxX3UzMiwgIlVpVjRVaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1heHZxX3U4LCAiU2NWMTZTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1pbl92LCAiVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1pbm5tX3YsICJWOFNjVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWlubm1xX3YsICJWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWlubm12X2YxNiwgImhWOFNjIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWlubm12X2YzMiwgImZWMmYiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZtaW5ubXZxX2YxNiwgImhWMTZTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1pbm5tdnFfZjMyLCAiZlY0ZiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1pbm5tdnFfZjY0LCAiZFYyZCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1pbnFfdiwgIlYxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZtaW52X2YxNiwgImhWOFNjIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWludl9mMzIsICJmVjJmIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWludl9zMTYsICJzVjRzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWludl9zMzIsICJpVjJpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWludl9zOCwgIlNjVjhTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1pbnZfdTE2LCAiVXNWNFVzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWludl91MzIsICJVaVYyVWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZtaW52X3U4LCAiU2NWOFNjIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWludnFfZjE2LCAiaFYxNlNjIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWludnFfZjMyLCAiZlY0ZiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1pbnZxX2Y2NCwgImRWMmQiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZtaW52cV9zMTYsICJzVjhzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bWludnFfczMyLCAiaVY0aSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1pbnZxX3M4LCAiU2NWMTZTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1pbnZxX3UxNiwgIlVzVjhVcyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1pbnZxX3UzMiwgIlVpVjRVaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1pbnZxX3U4LCAiU2NWMTZTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm1vdmxfdiwgIlYxNlNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Ztb3ZuX3YsICJWOFNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bXVsX2xhbmVfdiwgIlY4U2NWOFNjVjhTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm11bF9sYW5lcV92LCAiVjhTY1Y4U2NWMTZTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm11bF9uX2Y2NCwgIlYxZFYxZGQiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZtdWxfdiwgIlY4U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZtdWxsX3A2NCwgIlVMTExpVVdpVVdpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bXVsbF92LCAiVjE2U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZtdWxxX3YsICJWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92bXVseF92LCAiVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm11bHhkX2Y2NCwgImRkZCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm11bHhoX2xhbmVfZjE2LCAiaGhWNGhJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm11bHhoX2xhbmVxX2YxNiwgImhoVjhoSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZtdWx4cV92LCAiVjE2U2NWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm11bHhzX2YzMiwgImZmZiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdm5lZ2RfczY0LCAiV2lXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnBhZGFsX3YsICJWOFNjVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cGFkYWxxX3YsICJWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cGFkZF92LCAiVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnBhZGRkX2Y2NCwgImRWMmQiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZwYWRkZF9zNjQsICJXaVYyV2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZwYWRkZF91NjQsICJVV2lWMlVXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnBhZGRsX3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZwYWRkbHFfdiwgIlYxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cGFkZHFfdiwgIlYxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZwYWRkc19mMzIsICJmVjJmIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cG1heF92LCAiVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnBtYXhubV92LCAiVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnBtYXhubXFfdiwgIlYxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZwbWF4bm1xZF9mNjQsICJkVjJkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cG1heG5tc19mMzIsICJmVjJmIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cG1heHFfdiwgIlYxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZwbWF4cWRfZjY0LCAiZFYyZCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnBtYXhzX2YzMiwgImZWMmYiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZwbWluX3YsICJWOFNjVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cG1pbm5tX3YsICJWOFNjVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cG1pbm5tcV92LCAiVjE2U2NWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnBtaW5ubXFkX2Y2NCwgImRWMmQiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZwbWlubm1zX2YzMiwgImZWMmYiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZwbWlucV92LCAiVjE2U2NWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnBtaW5xZF9mNjQsICJkVjJkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cG1pbnNfZjMyLCAiZlYyZiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFhYnNfdiwgIlY4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFhYnNiX3M4LCAiU2NTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFhYnNkX3M2NCwgIldpV2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxYWJzaF9zMTYsICJzcyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFhYnNxX3YsICJWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFhYnNzX3MzMiwgImlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cWFkZF92LCAiVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFhZGRiX3M4LCAiU2NTY1NjIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cWFkZGJfdTgsICJTY1NjU2MiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxYWRkZF9zNjQsICJXaVdpV2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxYWRkZF91NjQsICJVV2lVV2lVV2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxYWRkaF9zMTYsICJzc3MiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxYWRkaF91MTYsICJVc1VzVXMiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxYWRkcV92LCAiVjE2U2NWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFhZGRzX3MzMiwgImlpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFhZGRzX3UzMiwgIlVpVWlVaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFkbWxhbF92LCAiVjE2U2NWMTZTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFkbWxhbGhfbGFuZV9zMTYsICJpaXNWNHNJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFkbWxhbGhfbGFuZXFfczE2LCAiaWlzVjhzSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxZG1sYWxoX3MxNiwgImlpc3MiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxZG1sYWxzX2xhbmVfczMyLCAiV2lXaWlWMmlJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFkbWxhbHNfbGFuZXFfczMyLCAiV2lXaWlWNGlJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFkbWxhbHNfczMyLCAiV2lXaWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cWRtbHNsX3YsICJWMTZTY1YxNlNjVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cWRtbHNsaF9sYW5lX3MxNiwgImlpc1Y0c0lpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cWRtbHNsaF9sYW5lcV9zMTYsICJpaXNWOHNJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFkbWxzbGhfczE2LCAiaWlzcyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFkbWxzbHNfbGFuZV9zMzIsICJXaVdpaVYyaUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cWRtbHNsc19sYW5lcV9zMzIsICJXaVdpaVY0aUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cWRtbHNsc19zMzIsICJXaVdpaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxZG11bGhfdiwgIlY4U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxZG11bGhoX3MxNiwgInNzcyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFkbXVsaHFfdiwgIlYxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxZG11bGhzX3MzMiwgImlpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFkbXVsbF92LCAiVjE2U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxZG11bGxoX3MxNiwgImlzcyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFkbXVsbHNfczMyLCAiV2lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFtb3ZuX3YsICJWOFNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cW1vdm5kX3M2NCwgImlXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFtb3ZuZF91NjQsICJVaVVXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFtb3ZuaF9zMTYsICJTY3MiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxbW92bmhfdTE2LCAiU2NVcyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFtb3Zuc19zMzIsICJzaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFtb3Zuc191MzIsICJVc1VpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cW1vdnVuX3YsICJWOFNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cW1vdnVuZF9zNjQsICJpV2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxbW92dW5oX3MxNiwgIlNjcyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFtb3Z1bnNfczMyLCAic2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxbmVnX3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxbmVnYl9zOCwgIlNjU2MiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxbmVnZF9zNjQsICJXaVdpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cW5lZ2hfczE2LCAic3MiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxbmVncV92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxbmVnc19zMzIsICJpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFyZG11bGhfdiwgIlY4U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxcmRtdWxoaF9zMTYsICJzc3MiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxcmRtdWxocV92LCAiVjE2U2NWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFyZG11bGhzX3MzMiwgImlpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFyc2hsX3YsICJWOFNjVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXJzaGxiX3M4LCAiU2NTY1NjIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXJzaGxiX3U4LCAiU2NTY1NjIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXJzaGxkX3M2NCwgIldpV2lXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFyc2hsZF91NjQsICJVV2lVV2lVV2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxcnNobGhfczE2LCAic3NzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXJzaGxoX3UxNiwgIlVzVXNVcyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFyc2hscV92LCAiVjE2U2NWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFyc2hsc19zMzIsICJpaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxcnNobHNfdTMyLCAiVWlVaVVpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXJzaHJuX25fdiwgIlY4U2NWMTZTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFyc2hybmRfbl9zNjQsICJpV2lJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFyc2hybmRfbl91NjQsICJVaVVXaUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXJzaHJuaF9uX3MxNiwgIlNjc0lpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXJzaHJuaF9uX3UxNiwgIlNjVXNJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFyc2hybnNfbl9zMzIsICJzaUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXJzaHJuc19uX3UzMiwgIlVzVWlJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFyc2hydW5fbl92LCAiVjhTY1YxNlNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXJzaHJ1bmRfbl9zNjQsICJpV2lJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFyc2hydW5oX25fczE2LCAiU2NzSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxcnNocnVuc19uX3MzMiwgInNpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zxc2hsX25fdiwgIlY4U2NWOFNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXNobF92LCAiVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFzaGxiX25fczgsICJTY1NjSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zxc2hsYl9uX3U4LCAiU2NTY0lpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXNobGJfczgsICJTY1NjU2MiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zxc2hsYl91OCwgIlNjU2NTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFzaGxkX25fczY0LCAiV2lXaUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXNobGRfbl91NjQsICJVV2lVV2lJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFzaGxkX3M2NCwgIldpV2lXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFzaGxkX3U2NCwgIlVXaVVXaVVXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFzaGxoX25fczE2LCAic3NJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFzaGxoX25fdTE2LCAiVXNVc0lpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXNobGhfczE2LCAic3NzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXNobGhfdTE2LCAiVXNVc1VzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXNobHFfbl92LCAiVjE2U2NWMTZTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFzaGxxX3YsICJWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXNobHNfbl9zMzIsICJpaUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXNobHNfbl91MzIsICJVaVVpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zxc2hsc19zMzIsICJpaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zxc2hsc191MzIsICJVaVVpVWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zxc2hsdV9uX3YsICJWOFNjVjhTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFzaGx1Yl9uX3M4LCAiU2NTY0lpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXNobHVkX25fczY0LCAiV2lXaUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXNobHVoX25fczE2LCAic3NJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFzaGx1cV9uX3YsICJWMTZTY1YxNlNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXNobHVzX25fczMyLCAiaWlJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFzaHJuX25fdiwgIlY4U2NWMTZTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFzaHJuZF9uX3M2NCwgImlXaUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXNocm5kX25fdTY0LCAiVWlVV2lJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFzaHJuaF9uX3MxNiwgIlNjc0lpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXNocm5oX25fdTE2LCAiU2NVc0lpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXNocm5zX25fczMyLCAic2lJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFzaHJuc19uX3UzMiwgIlVzVWlJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFzaHJ1bl9uX3YsICJWOFNjVjE2U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zxc2hydW5kX25fczY0LCAiaVdpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zxc2hydW5oX25fczE2LCAiU2NzSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zxc2hydW5zX25fczMyLCAic2lJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFzdWJfdiwgIlY4U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zxc3ViYl9zOCwgIlNjU2NTYyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnFzdWJiX3U4LCAiU2NTY1NjIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXN1YmRfczY0LCAiV2lXaVdpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXN1YmRfdTY0LCAiVVdpVVdpVVdpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXN1YmhfczE2LCAic3NzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXN1YmhfdTE2LCAiVXNVc1VzIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXN1YnFfdiwgIlYxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zxc3Vic19zMzIsICJpaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zxc3Vic191MzIsICJVaVVpVWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxdGJsMV92LCAiVjhTY1YxNlNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxdGJsMXFfdiwgIlYxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxdGJsMl92LCAiVjhTY1YxNlNjVjE2U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnF0YmwycV92LCAiVjE2U2NWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXRibDNfdiwgIlY4U2NWMTZTY1YxNlNjVjE2U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnF0YmwzcV92LCAiVjE2U2NWMTZTY1YxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxdGJsNF92LCAiVjhTY1YxNlNjVjE2U2NWMTZTY1YxNlNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxdGJsNHFfdiwgIlYxNlNjVjE2U2NWMTZTY1YxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxdGJ4MV92LCAiVjhTY1Y4U2NWMTZTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXRieDFxX3YsICJWMTZTY1YxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxdGJ4Ml92LCAiVjhTY1Y4U2NWMTZTY1YxNlNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxdGJ4MnFfdiwgIlYxNlNjVjE2U2NWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXRieDNfdiwgIlY4U2NWOFNjVjE2U2NWMTZTY1YxNlNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxdGJ4M3FfdiwgIlYxNlNjVjE2U2NWMTZTY1YxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZxdGJ4NF92LCAiVjhTY1Y4U2NWMTZTY1YxNlNjVjE2U2NWMTZTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cXRieDRxX3YsICJWMTZTY1YxNlNjVjE2U2NWMTZTY1YxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZyYWRkaG5fdiwgIlY4U2NWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJiaXRfdiwgIlY4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJiaXRxX3YsICJWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJlY3BlX3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZyZWNwZWRfZjY0LCAiZGQiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZyZWNwZXFfdiwgIlYxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cmVjcGVzX2YzMiwgImZmIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cmVjcHNfdiwgIlY4U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZyZWNwc2RfZjY0LCAiZGRkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cmVjcHNxX3YsICJWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cmVjcHNzX2YzMiwgImZmZiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJlY3B4ZF9mNjQsICJkZCIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJlY3B4c19mMzIsICJmZiIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJoYWRkX3YsICJWOFNjVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cmhhZGRxX3YsICJWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cm5kX3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZybmRhX3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZybmRhcV92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZybmRpX3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZybmRpcV92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZybmRtX3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZybmRtcV92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZybmRuX3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZybmRucV92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZybmRwX3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZybmRwcV92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZybmRxX3YsICJWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJuZHhfdiwgIlY4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJuZHhxX3YsICJWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJzaGxfdiwgIlY4U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zyc2hsZF9zNjQsICJXaVdpV2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zyc2hsZF91NjQsICJVV2lVV2lVV2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zyc2hscV92LCAiVjE2U2NWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJzaHJfbl92LCAiVjhTY1Y4U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zyc2hyZF9uX3M2NCwgIldpV2lJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJzaHJkX25fdTY0LCAiVVdpVVdpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zyc2hybl9uX3YsICJWOFNjVjE2U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zyc2hycV9uX3YsICJWMTZTY1YxNlNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cnNxcnRlX3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zyc3FydGVkX2Y2NCwgImRkIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cnNxcnRlcV92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zyc3FydGVzX2YzMiwgImZmIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cnNxcnRzX3YsICJWOFNjVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cnNxcnRzZF9mNjQsICJkZGQiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zyc3FydHNxX3YsICJWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cnNxcnRzc19mMzIsICJmZmYiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zyc3JhX25fdiwgIlY4U2NWOFNjVjhTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnJzcmFkX25fczY0LCAiV2lXaVdpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zyc3JhZF9uX3U2NCwgIlVXaVVXaVVXaUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cnNyYXFfbl92LCAiVjE2U2NWMTZTY1YxNlNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92cnN1YmhuX3YsICJWOFNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9mMzIsICJWMmZmVjJmSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9mNjQsICJWMWRkVjFkSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9pMTYsICJWNHNzVjRzSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9pMzIsICJWMmlpVjJpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9pNjQsICJWMVdpV2lWMVdpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9pOCwgIlY4U2NTY1Y4U2NJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnNldHFfbGFuZV9mMzIsICJWNGZmVjRmSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfZjY0LCAiVjJkZFYyZElpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2kxNiwgIlY4c3NWOHNJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnNldHFfbGFuZV9pMzIsICJWNGlpVjRpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfaTY0LCAiVjJXaVdpVjJXaUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2k4LCAiVjE2U2NTY1YxNlNjSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzaGExY3FfdTMyLCAiVjRpVjRVaVVpVjRVaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnNoYTFoX3UzMiwgIlVpVWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzaGExbXFfdTMyLCAiVjRpVjRVaVVpVjRVaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnNoYTFwcV91MzIsICJWNGlWNFVpVWlWNFVpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c2hhMXN1MHFfdiwgIlYxNlNjVjE2U2NWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnNoYTFzdTFxX3YsICJWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c2hhMjU2aDJxX3YsICJWMTZTY1YxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzaGEyNTZocV92LCAiVjE2U2NWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c2hhMjU2c3UwcV92LCAiVjE2U2NWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnNoYTI1NnN1MXFfdiwgIlYxNlNjVjE2U2NWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnNobF9uX3YsICJWOFNjVjhTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnNobF92LCAiVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnNobGRfbl9zNjQsICJXaVdpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzaGxkX25fdTY0LCAiVVdpVVdpSWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzaGxkX3M2NCwgIldpV2lXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnNobGRfdTY0LCAiVVdpVVdpVVdpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c2hsbF9uX3YsICJWMTZTY1Y4U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzaGxxX25fdiwgIlYxNlNjVjE2U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzaGxxX3YsICJWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c2hyX25fdiwgIlY4U2NWOFNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c2hyZF9uX3M2NCwgIldpV2lJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnNocmRfbl91NjQsICJVV2lVV2lJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnNocm5fbl92LCAiVjhTY1YxNlNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c2hycV9uX3YsICJWMTZTY1YxNlNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c2xpX25fdiwgIlY4U2NWOFNjVjhTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnNsaWRfbl9zNjQsICJXaVdpV2lJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnNsaWRfbl91NjQsICJVV2lVV2lVV2lJaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnNsaXFfbl92LCAiVjE2U2NWMTZTY1YxNlNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c3FhZGRfdiwgIlY4U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzcWFkZGJfdTgsICJTY1NjU2MiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzcWFkZGRfdTY0LCAiVVdpVVdpVVdpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c3FhZGRoX3UxNiwgIlVzVXNVcyIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnNxYWRkcV92LCAiVjE2U2NWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnNxYWRkc191MzIsICJVaVVpVWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzcXJ0X3YsICJWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzcXJ0cV92LCAiVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzcmFfbl92LCAiVjhTY1Y4U2NWOFNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c3JhZF9uX3M2NCwgIldpV2lXaUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c3JhZF9uX3U2NCwgIlVXaVVXaVVXaUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c3JhcV9uX3YsICJWMTZTY1YxNlNjVjE2U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Zzcmlfbl92LCAiVjhTY1Y4U2NWOFNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c3JpZF9uX3M2NCwgIldpV2lXaUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c3JpZF9uX3U2NCwgIlVXaVVXaVVXaUlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c3JpcV9uX3YsICJWMTZTY1YxNlNjVjE2U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzdDFfbGFuZV92LCAidnYqVjhTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnN0MV92LCAidnYqVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzdDFfeDJfdiwgInZ2KlY4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnN0MV94M192LCAidnYqVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnN0MV94NF92LCAidnYqVjhTY1Y4U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzdDFxX2xhbmVfdiwgInZ2KlYxNlNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c3QxcV92LCAidnYqVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c3QxcV94Ml92LCAidnYqVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3gzX3YsICJ2dipWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c3QxcV94NF92LCAidnYqVjE2U2NWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c3QyX2xhbmVfdiwgInZ2KlY4U2NWOFNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c3QyX3YsICJ2dipWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzdDJxX2xhbmVfdiwgInZ2KlYxNlNjVjE2U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzdDJxX3YsICJ2dipWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnN0M19sYW5lX3YsICJ2dipWOFNjVjhTY1Y4U2NJaWkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzdDNfdiwgInZ2KlY4U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzdDNxX2xhbmVfdiwgInZ2KlYxNlNjVjE2U2NWMTZTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnN0M3FfdiwgInZ2KlYxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzdDRfbGFuZV92LCAidnYqVjhTY1Y4U2NWOFNjVjhTY0lpaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnN0NF92LCAidnYqVjhTY1Y4U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzdDRxX2xhbmVfdiwgInZ2KlYxNlNjVjE2U2NWMTZTY1YxNlNjSWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c3Q0cV92LCAidnYqVjE2U2NWMTZTY1YxNlNjVjE2U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c3RycV9wMTI4LCAidnYqVUxMTGkiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3ZzdWJkX3M2NCwgIldpV2lXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnN1YmRfdTY0LCAiVVdpVVdpVVdpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92c3ViaG5fdiwgIlY4U2NWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnRibDFfdiwgIlY4U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Z0YmwyX3YsICJWOFNjVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnRibDNfdiwgIlY4U2NWOFNjVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnRibDRfdiwgIlY4U2NWOFNjVjhTY1Y4U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Z0YngxX3YsICJWOFNjVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnRieDJfdiwgIlY4U2NWOFNjVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnRieDNfdiwgIlY4U2NWOFNjVjhTY1Y4U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Z0Yng0X3YsICJWOFNjVjhTY1Y4U2NWOFNjVjhTY1Y4U2NWOFNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnRybl92LCAidnYqVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92dHJucV92LCAidnYqVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Z0c3RfdiwgIlY4U2NWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Z0c3RkX3M2NCwgIldpV2lXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnRzdGRfdTY0LCAiVVdpVVdpVVdpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92dHN0cV92LCAiVjE2U2NWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnVxYWRkX3YsICJWOFNjVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92dXFhZGRiX3M4LCAiU2NTY1NjIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92dXFhZGRkX3M2NCwgIldpV2lXaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnVxYWRkaF9zMTYsICJzc3MiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Z1cWFkZHFfdiwgIlYxNlNjVjE2U2NWMTZTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Z1cWFkZHNfczMyLCAiaWlpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92dXpwX3YsICJ2dipWOFNjVjhTY2kiLCAibiIpCitCVUlMVElOKF9fYnVpbHRpbl9uZW9uX3Z1enBxX3YsICJ2dipWMTZTY1YxNlNjaSIsICJuIikKK0JVSUxUSU4oX19idWlsdGluX25lb25fdnppcF92LCAidnYqVjhTY1Y4U2NpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fbmVvbl92emlwcV92LCAidnYqVjE2U2NWMTZTY2kiLCAibiIpCisjZW5kaWYKKworI2lmZGVmIEdFVF9ORU9OX09WRVJMT0FEX0NIRUNLCitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmFiZF92OiBtYXNrID0gMHg3MDcwN1VMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmFiZHFfdjogbWFzayA9IDB4NzA3MDcwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmFic192OiBtYXNrID0gMHg3MGZVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZhYnNxX3Y6IG1hc2sgPSAweDcwZjAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92YWRkaG5fdjogbWFzayA9IDB4NzAwMDdVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZhZXNkcV92OiBtYXNrID0gMHgxMDAwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92YWVzZXFfdjogbWFzayA9IDB4MTAwMDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmFlc2ltY3FfdjogbWFzayA9IDB4MTAwMDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmFlc21jcV92OiBtYXNrID0gMHgxMDAwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92YnNsX3Y6IG1hc2sgPSAweGYwNzdmVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92YnNscV92OiBtYXNrID0gMHhmMDc3ZjAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2FnZV92OiBtYXNrID0gMHhlMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNhZ2VxX3Y6IG1hc2sgPSAweGUwMDAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjYWd0X3Y6IG1hc2sgPSAweGUwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2FndHFfdjogbWFzayA9IDB4ZTAwMDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNhbGVfdjogbWFzayA9IDB4ZTAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjYWxlcV92OiBtYXNrID0gMHhlMDAwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2FsdF92OiBtYXNrID0gMHhlMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNhbHRxX3Y6IG1hc2sgPSAweGUwMDAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZXF6X3Y6IG1hc2sgPSAweGYwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2VxenFfdjogbWFzayA9IDB4ZjAwMDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNnZXpfdjogbWFzayA9IDB4ZjAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZ2V6cV92OiBtYXNrID0gMHhmMDAwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2d0el92OiBtYXNrID0gMHhmMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNndHpxX3Y6IG1hc2sgPSAweGYwMDAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjbGV6X3Y6IG1hc2sgPSAweGYwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2xlenFfdjogbWFzayA9IDB4ZjAwMDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNsc192OiBtYXNrID0gMHg3VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2xzcV92OiBtYXNrID0gMHg3MDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjbHR6X3Y6IG1hc2sgPSAweGYwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2x0enFfdjogbWFzayA9IDB4ZjAwMDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNsel92OiBtYXNrID0gMHg3MDAwN1VMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNsenFfdjogbWFzayA9IDB4NzAwMDcwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNudF92OiBtYXNrID0gMHgxMDAxMVVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNudHFfdjogbWFzayA9IDB4MTAwMTEwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dF9mMTZfZjMyOiBtYXNrID0gMHgxMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfZjE2X3Y6IG1hc2sgPSAweDIwMDAyVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X2YzMl9mMTY6IG1hc2sgPSAweDIwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X2YzMl9mNjQ6IG1hc2sgPSAweDIwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dF9mMzJfdjogbWFzayA9IDB4NDAwMDRVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfZjY0X2YzMjogbWFzayA9IDB4NDAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfZjY0X3Y6IG1hc2sgPSAweDgwMDA4VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fZjE2X3Y6IG1hc2sgPSAweDIwMDAyVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fZjMyX3Y6IG1hc2sgPSAweDQwMDA0VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fZjY0X3Y6IG1hc2sgPSAweDgwMDA4VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fczE2X3Y6IG1hc2sgPSAweDJVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfbl9zMzJfdjogbWFzayA9IDB4NFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dF9uX3M2NF92OiBtYXNrID0gMHg4VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fdTE2X3Y6IG1hc2sgPSAweDIwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fdTMyX3Y6IG1hc2sgPSAweDQwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fdTY0X3Y6IG1hc2sgPSAweDgwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X3MxNl92OiBtYXNrID0gMHgyVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X3MzMl92OiBtYXNrID0gMHg0VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X3M2NF92OiBtYXNrID0gMHg4VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X3UxNl92OiBtYXNrID0gMHgyMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dF91MzJfdjogbWFzayA9IDB4NDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfdTY0X3Y6IG1hc2sgPSAweDgwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0YV9zMTZfdjogbWFzayA9IDB4MlVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dGFfczMyX3Y6IG1hc2sgPSAweDRVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRhX3M2NF92OiBtYXNrID0gMHg4VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0YV91MTZfdjogbWFzayA9IDB4MjAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRhX3UzMl92OiBtYXNrID0gMHg0MDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dGFfdTY0X3Y6IG1hc2sgPSAweDgwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0YXFfczE2X3Y6IG1hc2sgPSAweDIwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dGFxX3MzMl92OiBtYXNrID0gMHg0MDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRhcV9zNjRfdjogbWFzayA9IDB4ODAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0YXFfdTE2X3Y6IG1hc2sgPSAweDIwMDAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRhcV91MzJfdjogbWFzayA9IDB4NDAwMDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dGFxX3U2NF92OiBtYXNrID0gMHg4MDAwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bV9zMTZfdjogbWFzayA9IDB4MlVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG1fczMyX3Y6IG1hc2sgPSAweDRVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRtX3M2NF92OiBtYXNrID0gMHg4VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bV91MTZfdjogbWFzayA9IDB4MjAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRtX3UzMl92OiBtYXNrID0gMHg0MDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG1fdTY0X3Y6IG1hc2sgPSAweDgwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bXFfczE2X3Y6IG1hc2sgPSAweDIwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG1xX3MzMl92OiBtYXNrID0gMHg0MDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRtcV9zNjRfdjogbWFzayA9IDB4ODAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bXFfdTE2X3Y6IG1hc2sgPSAweDIwMDAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRtcV91MzJfdjogbWFzayA9IDB4NDAwMDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG1xX3U2NF92OiBtYXNrID0gMHg4MDAwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bl9zMTZfdjogbWFzayA9IDB4MlVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG5fczMyX3Y6IG1hc2sgPSAweDRVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRuX3M2NF92OiBtYXNrID0gMHg4VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bl91MTZfdjogbWFzayA9IDB4MjAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRuX3UzMl92OiBtYXNrID0gMHg0MDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG5fdTY0X3Y6IG1hc2sgPSAweDgwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bnFfczE2X3Y6IG1hc2sgPSAweDIwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG5xX3MzMl92OiBtYXNrID0gMHg0MDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRucV9zNjRfdjogbWFzayA9IDB4ODAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bnFfdTE2X3Y6IG1hc2sgPSAweDIwMDAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRucV91MzJfdjogbWFzayA9IDB4NDAwMDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG5xX3U2NF92OiBtYXNrID0gMHg4MDAwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cF9zMTZfdjogbWFzayA9IDB4MlVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHBfczMyX3Y6IG1hc2sgPSAweDRVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRwX3M2NF92OiBtYXNrID0gMHg4VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cF91MTZfdjogbWFzayA9IDB4MjAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRwX3UzMl92OiBtYXNrID0gMHg0MDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHBfdTY0X3Y6IG1hc2sgPSAweDgwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cHFfczE2X3Y6IG1hc2sgPSAweDIwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHBxX3MzMl92OiBtYXNrID0gMHg0MDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRwcV9zNjRfdjogbWFzayA9IDB4ODAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cHFfdTE2X3Y6IG1hc2sgPSAweDIwMDAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRwcV91MzJfdjogbWFzayA9IDB4NDAwMDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHBxX3U2NF92OiBtYXNrID0gMHg4MDAwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9mMTZfdjogbWFzayA9IDB4MjAwMDIwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHFfZjMyX3Y6IG1hc2sgPSAweDQwMDA0MDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX2Y2NF92OiBtYXNrID0gMHg4MDAwODAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX2YxNl92OiBtYXNrID0gMHgyMDAwMjAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX2YzMl92OiBtYXNrID0gMHg0MDAwNDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX2Y2NF92OiBtYXNrID0gMHg4MDAwODAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX3MxNl92OiBtYXNrID0gMHgyMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX25fczMyX3Y6IG1hc2sgPSAweDQwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHFfbl9zNjRfdjogbWFzayA9IDB4ODAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX3UxNl92OiBtYXNrID0gMHgyMDAwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX3UzMl92OiBtYXNrID0gMHg0MDAwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX3U2NF92OiBtYXNrID0gMHg4MDAwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9zMTZfdjogbWFzayA9IDB4MjAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9zMzJfdjogbWFzayA9IDB4NDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9zNjRfdjogbWFzayA9IDB4ODAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV91MTZfdjogbWFzayA9IDB4MjAwMDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHFfdTMyX3Y6IG1hc2sgPSAweDQwMDAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX3U2NF92OiBtYXNrID0gMHg4MDAwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0eF9mMzJfdjogbWFzayA9IDB4NDAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZleHRfdjogbWFzayA9IDB4ZjA3N2ZVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZleHRxX3Y6IG1hc2sgPSAweGYwNzdmMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFfbGFuZV92OiBtYXNrID0gMHg3MDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFfbGFuZXFfdjogbWFzayA9IDB4NzAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Zm1hX3Y6IG1hc2sgPSAweDcwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmZtYXFfbGFuZV92OiBtYXNrID0gMHg3MDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmZtYXFfbGFuZXFfdjogbWFzayA9IDB4NzAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFxX3Y6IG1hc2sgPSAweDcwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92aGFkZF92OiBtYXNrID0gMHg3MDAwN1VMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmhhZGRxX3Y6IG1hc2sgPSAweDcwMDA3MDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zoc3ViX3Y6IG1hc2sgPSAweDcwMDA3VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92aHN1YnFfdjogbWFzayA9IDB4NzAwMDcwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMV9kdXBfdjogbWFzayA9IDB4ZjA3N2ZVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfbGFuZV92OiBtYXNrID0gMHhmMDc3ZlVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMV92OiBtYXNrID0gMHhmMDc3ZlVMTDsgUHRyQXJnTnVtID0gMDsgSGFzQ29uc3RQdHIgPSB0cnVlOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxX3gyX3Y6IG1hc2sgPSAweGYwNzdmVUxMOyBQdHJBcmdOdW0gPSAxOyBIYXNDb25zdFB0ciA9IHRydWU7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfeDNfdjogbWFzayA9IDB4ZjA3N2ZVTEw7IFB0ckFyZ051bSA9IDE7IEhhc0NvbnN0UHRyID0gdHJ1ZTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMV94NF92OiBtYXNrID0gMHhmMDc3ZlVMTDsgUHRyQXJnTnVtID0gMTsgSGFzQ29uc3RQdHIgPSB0cnVlOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV9kdXBfdjogbWFzayA9IDB4ZjA3N2YwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMXFfbGFuZV92OiBtYXNrID0gMHhmMDc3ZjAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV92OiBtYXNrID0gMHhmMDc3ZjAwMDAwMDAwVUxMOyBQdHJBcmdOdW0gPSAwOyBIYXNDb25zdFB0ciA9IHRydWU7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX3gyX3Y6IG1hc2sgPSAweGYwNzdmMDAwMDAwMDBVTEw7IFB0ckFyZ051bSA9IDE7IEhhc0NvbnN0UHRyID0gdHJ1ZTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMXFfeDNfdjogbWFzayA9IDB4ZjA3N2YwMDAwMDAwMFVMTDsgUHRyQXJnTnVtID0gMTsgSGFzQ29uc3RQdHIgPSB0cnVlOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV94NF92OiBtYXNrID0gMHhmMDc3ZjAwMDAwMDAwVUxMOyBQdHJBcmdOdW0gPSAxOyBIYXNDb25zdFB0ciA9IHRydWU7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJfZHVwX3Y6IG1hc2sgPSAweGYwNzdmVUxMOyBQdHJBcmdOdW0gPSAxOyBIYXNDb25zdFB0ciA9IHRydWU7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJfbGFuZV92OiBtYXNrID0gMHhmMDc3ZlVMTDsgUHRyQXJnTnVtID0gMTsgSGFzQ29uc3RQdHIgPSB0cnVlOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQyX3Y6IG1hc2sgPSAweGYwNzdmVUxMOyBQdHJBcmdOdW0gPSAxOyBIYXNDb25zdFB0ciA9IHRydWU7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJxX2R1cF92OiBtYXNrID0gMHhmMDc3ZjAwMDAwMDAwVUxMOyBQdHJBcmdOdW0gPSAxOyBIYXNDb25zdFB0ciA9IHRydWU7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJxX2xhbmVfdjogbWFzayA9IDB4ZjA3N2YwMDAwMDAwMFVMTDsgUHRyQXJnTnVtID0gMTsgSGFzQ29uc3RQdHIgPSB0cnVlOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQycV92OiBtYXNrID0gMHhmMDc3ZjAwMDAwMDAwVUxMOyBQdHJBcmdOdW0gPSAxOyBIYXNDb25zdFB0ciA9IHRydWU7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNfZHVwX3Y6IG1hc2sgPSAweGYwNzdmVUxMOyBQdHJBcmdOdW0gPSAxOyBIYXNDb25zdFB0ciA9IHRydWU7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNfbGFuZV92OiBtYXNrID0gMHhmMDc3ZlVMTDsgUHRyQXJnTnVtID0gMTsgSGFzQ29uc3RQdHIgPSB0cnVlOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQzX3Y6IG1hc2sgPSAweGYwNzdmVUxMOyBQdHJBcmdOdW0gPSAxOyBIYXNDb25zdFB0ciA9IHRydWU7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNxX2R1cF92OiBtYXNrID0gMHhmMDc3ZjAwMDAwMDAwVUxMOyBQdHJBcmdOdW0gPSAxOyBIYXNDb25zdFB0ciA9IHRydWU7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNxX2xhbmVfdjogbWFzayA9IDB4ZjA3N2YwMDAwMDAwMFVMTDsgUHRyQXJnTnVtID0gMTsgSGFzQ29uc3RQdHIgPSB0cnVlOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQzcV92OiBtYXNrID0gMHhmMDc3ZjAwMDAwMDAwVUxMOyBQdHJBcmdOdW0gPSAxOyBIYXNDb25zdFB0ciA9IHRydWU7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3Y6IG1hc2sgPSAweGYwNzdmVUxMOyBQdHJBcmdOdW0gPSAxOyBIYXNDb25zdFB0ciA9IHRydWU7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRfbGFuZV92OiBtYXNrID0gMHhmMDc3ZlVMTDsgUHRyQXJnTnVtID0gMTsgSGFzQ29uc3RQdHIgPSB0cnVlOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQ0X3Y6IG1hc2sgPSAweGYwNzdmVUxMOyBQdHJBcmdOdW0gPSAxOyBIYXNDb25zdFB0ciA9IHRydWU7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRxX2R1cF92OiBtYXNrID0gMHhmMDc3ZjAwMDAwMDAwVUxMOyBQdHJBcmdOdW0gPSAxOyBIYXNDb25zdFB0ciA9IHRydWU7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRxX2xhbmVfdjogbWFzayA9IDB4ZjA3N2YwMDAwMDAwMFVMTDsgUHRyQXJnTnVtID0gMTsgSGFzQ29uc3RQdHIgPSB0cnVlOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQ0cV92OiBtYXNrID0gMHhmMDc3ZjAwMDAwMDAwVUxMOyBQdHJBcmdOdW0gPSAxOyBIYXNDb25zdFB0ciA9IHRydWU7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZtYXhfdjogbWFzayA9IDB4NzA3MDdVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZtYXhubV92OiBtYXNrID0gMHg3MDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZtYXhubXFfdjogbWFzayA9IDB4NzAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZtYXhxX3Y6IG1hc2sgPSAweDcwNzA3MDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZtaW5fdjogbWFzayA9IDB4NzA3MDdVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZtaW5ubV92OiBtYXNrID0gMHg3MDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZtaW5ubXFfdjogbWFzayA9IDB4NzAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZtaW5xX3Y6IG1hc2sgPSAweDcwNzA3MDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Ztb3ZsX3Y6IG1hc2sgPSAweGUwMDBlMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Ztb3ZuX3Y6IG1hc2sgPSAweDcwMDA3VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bXVsX2xhbmVfdjogbWFzayA9IDB4NDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bXVsX2xhbmVxX3Y6IG1hc2sgPSAweDQwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm11bF92OiBtYXNrID0gMHgxMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm11bGxfdjogbWFzayA9IDB4ZTAwMmUwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm11bHFfdjogbWFzayA9IDB4MTAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm11bHhfdjogbWFzayA9IDB4NzAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bXVseHFfdjogbWFzayA9IDB4NzAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZwYWRhbF92OiBtYXNrID0gMHhlMDAwZVVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnBhZGFscV92OiBtYXNrID0gMHhlMDAwZTAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cGFkZF92OiBtYXNrID0gMHg3MDMwN1VMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnBhZGRsX3Y6IG1hc2sgPSAweGUwMDBlVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cGFkZGxxX3Y6IG1hc2sgPSAweGUwMDBlMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZwYWRkcV92OiBtYXNrID0gMHhmMDcwZjAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cG1heF92OiBtYXNrID0gMHg3MDMwN1VMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnBtYXhubV92OiBtYXNrID0gMHgzMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZwbWF4bm1xX3Y6IG1hc2sgPSAweDcwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cG1heHFfdjogbWFzayA9IDB4NzA3MDcwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnBtaW5fdjogbWFzayA9IDB4NzAzMDdVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZwbWlubm1fdjogbWFzayA9IDB4MzAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cG1pbm5tcV92OiBtYXNrID0gMHg3MDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnBtaW5xX3Y6IG1hc2sgPSAweDcwNzA3MDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxYWJzX3Y6IG1hc2sgPSAweGZVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxYWJzcV92OiBtYXNrID0gMHhmMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxYWRkX3Y6IG1hc2sgPSAweGYwMDBmVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWFkZHFfdjogbWFzayA9IDB4ZjAwMGYwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFkbWxhbF92OiBtYXNrID0gMHhjMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sc2xfdjogbWFzayA9IDB4YzAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtdWxoX3Y6IG1hc2sgPSAweDZVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG11bGhxX3Y6IG1hc2sgPSAweDYwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFkbXVsbF92OiBtYXNrID0gMHhjMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxbW92bl92OiBtYXNrID0gMHg3MDAwN1VMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFtb3Z1bl92OiBtYXNrID0gMHg3MDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFuZWdfdjogbWFzayA9IDB4ZlVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFuZWdxX3Y6IG1hc2sgPSAweGYwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFyZG11bGhfdjogbWFzayA9IDB4NlVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFyZG11bGhxX3Y6IG1hc2sgPSAweDYwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFyc2hsX3Y6IG1hc2sgPSAweGYwMDBmVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXJzaGxxX3Y6IG1hc2sgPSAweGYwMDBmMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxcnNocm5fbl92OiBtYXNrID0gMHg3MDAwN1VMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFyc2hydW5fbl92OiBtYXNrID0gMHg3MDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFzaGxfbl92OiBtYXNrID0gMHhmMDAwZlVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFzaGxfdjogbWFzayA9IDB4ZjAwMGZVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hscV9uX3Y6IG1hc2sgPSAweGYwMDBmMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hscV92OiBtYXNrID0gMHhmMDAwZjAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXNobHVfbl92OiBtYXNrID0gMHhmMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFzaGx1cV9uX3Y6IG1hc2sgPSAweGYwMDAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hybl9uX3Y6IG1hc2sgPSAweDcwMDA3VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXNocnVuX25fdjogbWFzayA9IDB4NzAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc3ViX3Y6IG1hc2sgPSAweGYwMDBmVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXN1YnFfdjogbWFzayA9IDB4ZjAwMGYwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YmwxX3Y6IG1hc2sgPSAweDEwMDExVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRibDFxX3Y6IG1hc2sgPSAweDEwMDExMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsMl92OiBtYXNrID0gMHgxMDAxMVVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YmwycV92OiBtYXNrID0gMHgxMDAxMTAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRibDNfdjogbWFzayA9IDB4MTAwMTFVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsM3FfdjogbWFzayA9IDB4MTAwMTEwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0Ymw0X3Y6IG1hc2sgPSAweDEwMDExVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRibDRxX3Y6IG1hc2sgPSAweDEwMDExMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4MV92OiBtYXNrID0gMHgxMDAxMVVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YngxcV92OiBtYXNrID0gMHgxMDAxMTAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRieDJfdjogbWFzayA9IDB4MTAwMTFVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4MnFfdjogbWFzayA9IDB4MTAwMTEwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YngzX3Y6IG1hc2sgPSAweDEwMDExVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRieDNxX3Y6IG1hc2sgPSAweDEwMDExMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4NF92OiBtYXNrID0gMHgxMDAxMVVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0Yng0cV92OiBtYXNrID0gMHgxMDAxMTAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cmFkZGhuX3Y6IG1hc2sgPSAweDcwMDA3VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cmJpdF92OiBtYXNrID0gMHgxMDAxMVVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJiaXRxX3Y6IG1hc2sgPSAweDEwMDExMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZyZWNwZV92OiBtYXNrID0gMHg0MDcwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJlY3BlcV92OiBtYXNrID0gMHg0MDcwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cmVjcHNfdjogbWFzayA9IDB4NzAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cmVjcHNxX3Y6IG1hc2sgPSAweDcwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cmhhZGRfdjogbWFzayA9IDB4NzAwMDdVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZyaGFkZHFfdjogbWFzayA9IDB4NzAwMDcwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJuZF92OiBtYXNrID0gMHg3MDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZybmRhX3Y6IG1hc2sgPSAweDcwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJuZGFxX3Y6IG1hc2sgPSAweDcwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cm5kaV92OiBtYXNrID0gMHg3MDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZybmRpcV92OiBtYXNrID0gMHg3MDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJuZG1fdjogbWFzayA9IDB4NzAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cm5kbXFfdjogbWFzayA9IDB4NzAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZybmRuX3Y6IG1hc2sgPSAweDcwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJuZG5xX3Y6IG1hc2sgPSAweDcwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cm5kcF92OiBtYXNrID0gMHg3MDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZybmRwcV92OiBtYXNrID0gMHg3MDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJuZHFfdjogbWFzayA9IDB4NzAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZybmR4X3Y6IG1hc2sgPSAweDcwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJuZHhxX3Y6IG1hc2sgPSAweDcwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cnNobF92OiBtYXNrID0gMHhmMDAwZlVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJzaGxxX3Y6IG1hc2sgPSAweGYwMDBmMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hyX25fdjogbWFzayA9IDB4ZjAwMGZVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hybl9uX3Y6IG1hc2sgPSAweDcwMDA3VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cnNocnFfbl92OiBtYXNrID0gMHhmMDAwZjAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cnNxcnRlX3Y6IG1hc2sgPSAweDQwNzAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cnNxcnRlcV92OiBtYXNrID0gMHg0MDcwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cnNxcnRzX3Y6IG1hc2sgPSAweDcwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJzcXJ0c3FfdjogbWFzayA9IDB4NzAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3JhX25fdjogbWFzayA9IDB4ZjAwMGZVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3JhcV9uX3Y6IG1hc2sgPSAweGYwMDBmMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3ViaG5fdjogbWFzayA9IDB4NzAwMDdVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGExc3UwcV92OiBtYXNrID0gMHg0MDAwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2hhMXN1MXFfdjogbWFzayA9IDB4NDAwMDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNoYTI1NmgycV92OiBtYXNrID0gMHg0MDAwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2hhMjU2aHFfdjogbWFzayA9IDB4NDAwMDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNoYTI1NnN1MHFfdjogbWFzayA9IDB4NDAwMDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNoYTI1NnN1MXFfdjogbWFzayA9IDB4NDAwMDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNobF9uX3Y6IG1hc2sgPSAweGYwMDBmVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2hsX3Y6IG1hc2sgPSAweGYwMDBmVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2hsbF9uX3Y6IG1hc2sgPSAweGUwMDBlMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGxxX25fdjogbWFzayA9IDB4ZjAwMGYwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNobHFfdjogbWFzayA9IDB4ZjAwMGYwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNocl9uX3Y6IG1hc2sgPSAweGYwMDBmVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2hybl9uX3Y6IG1hc2sgPSAweDcwMDA3VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2hycV9uX3Y6IG1hc2sgPSAweGYwMDBmMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzbGlfbl92OiBtYXNrID0gMHhmMDA3ZlVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNsaXFfbl92OiBtYXNrID0gMHhmMDA3ZjAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3FhZGRfdjogbWFzayA9IDB4ZjAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzcWFkZHFfdjogbWFzayA9IDB4ZjAwMDAwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNxcnRfdjogbWFzayA9IDB4NzAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3FydHFfdjogbWFzayA9IDB4NzAwMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzcmFfbl92OiBtYXNrID0gMHhmMDAwZlVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNyYXFfbl92OiBtYXNrID0gMHhmMDAwZjAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3JpX25fdjogbWFzayA9IDB4ZjAwN2ZVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzcmlxX25fdjogbWFzayA9IDB4ZjAwN2YwMDAwMDAwMFVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MV9sYW5lX3Y6IG1hc2sgPSAweGYwNzdmVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxX3Y6IG1hc2sgPSAweGYwNzdmVUxMOyBQdHJBcmdOdW0gPSAwOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxX3gyX3Y6IG1hc2sgPSAweGYwNzdmVUxMOyBQdHJBcmdOdW0gPSAwOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxX3gzX3Y6IG1hc2sgPSAweGYwNzdmVUxMOyBQdHJBcmdOdW0gPSAwOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxX3g0X3Y6IG1hc2sgPSAweGYwNzdmVUxMOyBQdHJBcmdOdW0gPSAwOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV9sYW5lX3Y6IG1hc2sgPSAweGYwNzdmMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFxX3Y6IG1hc2sgPSAweGYwNzdmMDAwMDAwMDBVTEw7IFB0ckFyZ051bSA9IDA7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFxX3gyX3Y6IG1hc2sgPSAweGYwNzdmMDAwMDAwMDBVTEw7IFB0ckFyZ051bSA9IDA7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFxX3gzX3Y6IG1hc2sgPSAweGYwNzdmMDAwMDAwMDBVTEw7IFB0ckFyZ051bSA9IDA7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFxX3g0X3Y6IG1hc2sgPSAweGYwNzdmMDAwMDAwMDBVTEw7IFB0ckFyZ051bSA9IDA7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDJfbGFuZV92OiBtYXNrID0gMHhmMDc3ZlVMTDsgUHRyQXJnTnVtID0gMDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0Ml92OiBtYXNrID0gMHhmMDc3ZlVMTDsgUHRyQXJnTnVtID0gMDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MnFfbGFuZV92OiBtYXNrID0gMHhmMDc3ZjAwMDAwMDAwVUxMOyBQdHJBcmdOdW0gPSAwOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QycV92OiBtYXNrID0gMHhmMDc3ZjAwMDAwMDAwVUxMOyBQdHJBcmdOdW0gPSAwOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QzX2xhbmVfdjogbWFzayA9IDB4ZjA3N2ZVTEw7IFB0ckFyZ051bSA9IDA7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDNfdjogbWFzayA9IDB4ZjA3N2ZVTEw7IFB0ckFyZ051bSA9IDA7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDNxX2xhbmVfdjogbWFzayA9IDB4ZjA3N2YwMDAwMDAwMFVMTDsgUHRyQXJnTnVtID0gMDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0M3FfdjogbWFzayA9IDB4ZjA3N2YwMDAwMDAwMFVMTDsgUHRyQXJnTnVtID0gMDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0NF9sYW5lX3Y6IG1hc2sgPSAweGYwNzdmVUxMOyBQdHJBcmdOdW0gPSAwOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3Q0X3Y6IG1hc2sgPSAweGYwNzdmVUxMOyBQdHJBcmdOdW0gPSAwOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3Q0cV9sYW5lX3Y6IG1hc2sgPSAweGYwNzdmMDAwMDAwMDBVTEw7IFB0ckFyZ051bSA9IDA7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDRxX3Y6IG1hc2sgPSAweGYwNzdmMDAwMDAwMDBVTEw7IFB0ckFyZ051bSA9IDA7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdWJobl92OiBtYXNrID0gMHg3MDAwN1VMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRibDFfdjogbWFzayA9IDB4MTAwMTFVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0YmwyX3Y6IG1hc2sgPSAweDEwMDExVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92dGJsM192OiBtYXNrID0gMHgxMDAxMVVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRibDRfdjogbWFzayA9IDB4MTAwMTFVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0YngxX3Y6IG1hc2sgPSAweDEwMDExVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92dGJ4Ml92OiBtYXNrID0gMHgxMDAxMVVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRieDNfdjogbWFzayA9IDB4MTAwMTFVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0Yng0X3Y6IG1hc2sgPSAweDEwMDExVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92dHJuX3Y6IG1hc2sgPSAweDcwMzM3VUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92dHJucV92OiBtYXNrID0gMHg3MDMzNzAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92dHN0X3Y6IG1hc2sgPSAweGYwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92dHN0cV92OiBtYXNrID0gMHhmMDAwMDAwMDAwMDAwVUxMOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92dXFhZGRfdjogbWFzayA9IDB4ZlVMTDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnVxYWRkcV92OiBtYXNrID0gMHhmMDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z1enBfdjogbWFzayA9IDB4NzAzMzdVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z1enBxX3Y6IG1hc2sgPSAweDcwMzM3MDAwMDAwMDBVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z6aXBfdjogbWFzayA9IDB4NzAzMzdVTEw7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z6aXBxX3Y6IG1hc2sgPSAweDcwMzM3MDAwMDAwMDBVTEw7IGJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBHRVRfTkVPTl9JTU1FRElBVEVfQ0hFQ0sKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX2Y2NF92OiBpID0gMTsgbCA9IDE7IHUgPSA2MzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dF9uX2Y2NF92OiBpID0gMTsgbCA9IDE7IHUgPSA2MzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHFfbl9zNjRfdjogaSA9IDE7IGwgPSAxOyB1ID0gNjM7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfbl9zNjRfdjogaSA9IDE7IGwgPSAxOyB1ID0gNjM7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX25fdTY0X3Y6IGkgPSAxOyBsID0gMTsgdSA9IDYzOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fdTY0X3Y6IGkgPSAxOyBsID0gMTsgdSA9IDYzOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfaTY0OiBpID0gMTsgdSA9IDA7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfaTY0OiBpID0gMTsgdSA9IDE7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfZjY0OiBpID0gMTsgdSA9IDE7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRfbGFuZV9mNjQ6IGkgPSAxOyB1ID0gMDsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMV9sYW5lX3Y6IGkgPSAyOyB1ID0gUkZUKFRWLCBmYWxzZSwgZmFsc2UpOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV9sYW5lX3Y6IGkgPSAyOyB1ID0gUkZUKFRWLCBmYWxzZSwgZmFsc2UpOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQyX2xhbmVfdjogaSA9IDQ7IHUgPSBSRlQoVFYsIGZhbHNlLCBmYWxzZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJxX2xhbmVfdjogaSA9IDQ7IHUgPSBSRlQoVFYsIGZhbHNlLCBmYWxzZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNfbGFuZV92OiBpID0gNTsgdSA9IFJGVChUViwgZmFsc2UsIGZhbHNlKTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkM3FfbGFuZV92OiBpID0gNTsgdSA9IFJGVChUViwgZmFsc2UsIGZhbHNlKTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkNF9sYW5lX3Y6IGkgPSA2OyB1ID0gUkZUKFRWLCBmYWxzZSwgZmFsc2UpOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQ0cV9sYW5lX3Y6IGkgPSA2OyB1ID0gUkZUKFRWLCBmYWxzZSwgZmFsc2UpOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0c19uX3MzMl9mMzI6IGkgPSAxOyBsID0gMTsgdSA9IDMxOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0ZF9uX3M2NF9mNjQ6IGkgPSAxOyBsID0gMTsgdSA9IDYzOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0c19uX3UzMl9mMzI6IGkgPSAxOyBsID0gMTsgdSA9IDMxOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0ZF9uX3U2NF9mNjQ6IGkgPSAxOyBsID0gMTsgdSA9IDYzOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Zm1hZF9sYW5lX2Y2NDogaSA9IDM7IHUgPSAwOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Zm1hc19sYW5lX2YzMjogaSA9IDM7IHUgPSAxOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Zm1haF9sYW5lX2YxNjogaSA9IDM7IHUgPSAzOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Zm1hZF9sYW5lcV9mNjQ6IGkgPSAzOyB1ID0gMTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmZtYXNfbGFuZXFfZjMyOiBpID0gMzsgdSA9IDM7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFoX2xhbmVxX2YxNjogaSA9IDM7IHUgPSA3OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bXVseGhfbGFuZV9mMTY6IGkgPSAyOyB1ID0gMzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm11bHhoX2xhbmVxX2YxNjogaSA9IDI7IHUgPSA3OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0c19uX2YzMl91MzI6IGkgPSAxOyBsID0gMTsgdSA9IDMxOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0c19uX2YzMl9zMzI6IGkgPSAxOyBsID0gMTsgdSA9IDMxOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0ZF9uX2Y2NF91NjQ6IGkgPSAxOyBsID0gMTsgdSA9IDYzOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0ZF9uX2Y2NF9zNjQ6IGkgPSAxOyBsID0gMTsgdSA9IDYzOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2hsZF9uX3U2NDogaSA9IDE7IHUgPSA2MzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNobGRfbl9zNjQ6IGkgPSAxOyB1ID0gNjM7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzbGlkX25fdTY0OiBpID0gMjsgdSA9IDYzOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2xpZF9uX3M2NDogaSA9IDI7IHUgPSA2MzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFkbWxhbHNfbGFuZV9zMzI6IGkgPSAzOyB1ID0gMTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFkbWxhbGhfbGFuZV9zMTY6IGkgPSAzOyB1ID0gMzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFkbWxhbHNfbGFuZXFfczMyOiBpID0gMzsgdSA9IDM7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sYWxoX2xhbmVxX3MxNjogaSA9IDM7IHUgPSA3OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbHNsc19sYW5lX3MzMjogaSA9IDM7IHUgPSAxOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbHNsaF9sYW5lX3MxNjogaSA9IDM7IHUgPSAzOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbHNsc19sYW5lcV9zMzI6IGkgPSAzOyB1ID0gMzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFkbWxzbGhfbGFuZXFfczE2OiBpID0gMzsgdSA9IDc7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxcnNocm5zX25fdTMyOiBpID0gMTsgbCA9IDE7IHUgPSAxNTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFyc2hybmRfbl91NjQ6IGkgPSAxOyBsID0gMTsgdSA9IDMxOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJuaF9uX3UxNjogaSA9IDE7IGwgPSAxOyB1ID0gNzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFyc2hybnNfbl9zMzI6IGkgPSAxOyBsID0gMTsgdSA9IDE1OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJuZF9uX3M2NDogaSA9IDE7IGwgPSAxOyB1ID0gMzE7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxcnNocm5oX25fczE2OiBpID0gMTsgbCA9IDE7IHUgPSA3OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJ1bnNfbl9zMzI6IGkgPSAxOyBsID0gMTsgdSA9IDE1OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJ1bmRfbl9zNjQ6IGkgPSAxOyBsID0gMTsgdSA9IDMxOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJ1bmhfbl9zMTY6IGkgPSAxOyBsID0gMTsgdSA9IDc7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsdWJfbl9zODogaSA9IDE7IHUgPSA3OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXNobHVzX25fczMyOiBpID0gMTsgdSA9IDMxOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXNobHVkX25fczY0OiBpID0gMTsgdSA9IDYzOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXNobHVoX25fczE2OiBpID0gMTsgdSA9IDE1OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXNobGJfbl91ODogaSA9IDE7IHUgPSA3OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXNobHNfbl91MzI6IGkgPSAxOyB1ID0gMzE7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsZF9uX3U2NDogaSA9IDE7IHUgPSA2MzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFzaGxoX25fdTE2OiBpID0gMTsgdSA9IDE1OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXNobGJfbl9zODogaSA9IDE7IHUgPSA3OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXNobHNfbl9zMzI6IGkgPSAxOyB1ID0gMzE7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsZF9uX3M2NDogaSA9IDE7IHUgPSA2MzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFzaGxoX25fczE2OiBpID0gMTsgdSA9IDE1OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXNocm5zX25fdTMyOiBpID0gMTsgbCA9IDE7IHUgPSAxNTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFzaHJuZF9uX3U2NDogaSA9IDE7IGwgPSAxOyB1ID0gMzE7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hybmhfbl91MTY6IGkgPSAxOyBsID0gMTsgdSA9IDc7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hybnNfbl9zMzI6IGkgPSAxOyBsID0gMTsgdSA9IDE1OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXNocm5kX25fczY0OiBpID0gMTsgbCA9IDE7IHUgPSAzMTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFzaHJuaF9uX3MxNjogaSA9IDE7IGwgPSAxOyB1ID0gNzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFzaHJ1bnNfbl9zMzI6IGkgPSAxOyBsID0gMTsgdSA9IDE1OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXNocnVuZF9uX3M2NDogaSA9IDE7IGwgPSAxOyB1ID0gMzE7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hydW5oX25fczE2OiBpID0gMTsgbCA9IDE7IHUgPSA3OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3JpZF9uX3U2NDogaSA9IDI7IGwgPSAxOyB1ID0gNjM7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzcmlkX25fczY0OiBpID0gMjsgbCA9IDE7IHUgPSA2MzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJzaHJkX25fdTY0OiBpID0gMTsgbCA9IDE7IHUgPSA2MzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJzaHJkX25fczY0OiBpID0gMTsgbCA9IDE7IHUgPSA2MzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJzcmFkX25fdTY0OiBpID0gMjsgbCA9IDE7IHUgPSA2MzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJzcmFkX25fczY0OiBpID0gMjsgbCA9IDE7IHUgPSA2MzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNocmRfbl91NjQ6IGkgPSAxOyBsID0gMTsgdSA9IDYzOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2hyZF9uX3M2NDogaSA9IDE7IGwgPSAxOyB1ID0gNjM7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzcmFkX25fdTY0OiBpID0gMjsgbCA9IDE7IHUgPSA2MzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNyYWRfbl9zNjQ6IGkgPSAyOyBsID0gMTsgdSA9IDYzOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92ZHVwYl9sYW5lX2k4OiBpID0gMTsgdSA9IDc7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBoX2xhbmVfaTE2OiBpID0gMTsgdSA9IDM7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBzX2xhbmVfaTMyOiBpID0gMTsgdSA9IDE7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBkX2xhbmVfaTY0OiBpID0gMTsgdSA9IDA7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBkX2xhbmVfZjY0OiBpID0gMTsgdSA9IDA7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBzX2xhbmVfZjMyOiBpID0gMTsgdSA9IDE7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBoX2xhbmVfZjE2OiBpID0gMTsgdSA9IDM7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBiX2xhbmVxX2k4OiBpID0gMTsgdSA9IDE1OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92ZHVwaF9sYW5lcV9pMTY6IGkgPSAxOyB1ID0gNzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmR1cHNfbGFuZXFfaTMyOiBpID0gMTsgdSA9IDM7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBkX2xhbmVxX2k2NDogaSA9IDE7IHUgPSAxOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92ZHVwZF9sYW5lcV9mNjQ6IGkgPSAxOyB1ID0gMTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmR1cHNfbGFuZXFfZjMyOiBpID0gMTsgdSA9IDM7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBoX2xhbmVxX2YxNjogaSA9IDE7IHUgPSA3OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bXVsX2xhbmVfdjogaSA9IDI7IHUgPSBSRlQoVFYsIGZhbHNlLCBmYWxzZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZtdWxfbGFuZXFfdjogaSA9IDI7IHUgPSBSRlQoVFYsIGZhbHNlLCB0cnVlKTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNldF9sYW5lX2k2NDogaSA9IDI7IHUgPSAwOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2k2NDogaSA9IDI7IHUgPSAxOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2Y2NDogaSA9IDI7IHUgPSAxOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0X2xhbmVfZjY0OiBpID0gMjsgdSA9IDA7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzbGlfbl92OiBpID0gMjsgdSA9IFJGVChUViwgdHJ1ZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzbGlxX25fdjogaSA9IDI7IHUgPSBSRlQoVFYsIHRydWUpOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3JpX25fdjogaSA9IDI7IGwgPSAxOyB1ID0gUkZUKFRWLCB0cnVlKTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNyaXFfbl92OiBpID0gMjsgbCA9IDE7IHUgPSBSRlQoVFYsIHRydWUpOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxX2xhbmVfdjogaSA9IDI7IHUgPSBSRlQoVFYsIGZhbHNlLCBmYWxzZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFxX2xhbmVfdjogaSA9IDI7IHUgPSBSRlQoVFYsIGZhbHNlLCBmYWxzZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDJfbGFuZV92OiBpID0gMzsgdSA9IFJGVChUViwgZmFsc2UsIGZhbHNlKTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MnFfbGFuZV92OiBpID0gMzsgdSA9IFJGVChUViwgZmFsc2UsIGZhbHNlKTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0M19sYW5lX3Y6IGkgPSA0OyB1ID0gUkZUKFRWLCBmYWxzZSwgZmFsc2UpOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QzcV9sYW5lX3Y6IGkgPSA0OyB1ID0gUkZUKFRWLCBmYWxzZSwgZmFsc2UpOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3Q0X2xhbmVfdjogaSA9IDU7IHUgPSBSRlQoVFYsIGZhbHNlLCBmYWxzZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDRxX2xhbmVfdjogaSA9IDU7IHUgPSBSRlQoVFYsIGZhbHNlLCBmYWxzZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX25fZjE2X3Y6IGkgPSAxOyBsID0gMTsgdSA9IDYzOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fZjE2X3Y6IGkgPSAxOyBsID0gMTsgdSA9IDYzOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX2YzMl92OiBpID0gMTsgbCA9IDE7IHUgPSAzMTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dF9uX2YzMl92OiBpID0gMTsgbCA9IDE7IHUgPSAzMTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHFfbl9zMTZfdjogaSA9IDE7IGwgPSAxOyB1ID0gNjM7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfbl9zMTZfdjogaSA9IDE7IGwgPSAxOyB1ID0gNjM7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX25fczMyX3Y6IGkgPSAxOyBsID0gMTsgdSA9IDMxOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fczMyX3Y6IGkgPSAxOyBsID0gMTsgdSA9IDMxOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX3UxNl92OiBpID0gMTsgbCA9IDE7IHUgPSA2MzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dF9uX3UxNl92OiBpID0gMTsgbCA9IDE7IHUgPSA2MzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHFfbl91MzJfdjogaSA9IDE7IGwgPSAxOyB1ID0gMzE7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfbl91MzJfdjogaSA9IDE7IGwgPSAxOyB1ID0gMzE7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZleHRfdjogaSA9IDI7IHUgPSBSRlQoVFYsIGZhbHNlLCBmYWxzZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZleHRxX3Y6IGkgPSAyOyB1ID0gUkZUKFRWLCBmYWxzZSwgZmFsc2UpOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Zm1hcV9sYW5lX3Y6IGkgPSAzOyB1ID0gUkZUKFRWLCBmYWxzZSwgZmFsc2UpOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Zm1hX2xhbmVfdjogaSA9IDM7IHUgPSBSRlQoVFYsIGZhbHNlLCBmYWxzZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFxX2xhbmVxX3Y6IGkgPSAzOyB1ID0gUkZUKFRWLCBmYWxzZSwgdHJ1ZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFfbGFuZXFfdjogaSA9IDM7IHUgPSBSRlQoVFYsIGZhbHNlLCB0cnVlKTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldF9sYW5lX2k4OiBpID0gMTsgdSA9IDc7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRfbGFuZV9pMTY6IGkgPSAxOyB1ID0gMzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldHFfbGFuZV9pODogaSA9IDE7IHUgPSAxNTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldHFfbGFuZV9pMTY6IGkgPSAxOyB1ID0gNzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldHFfbGFuZV9pMzI6IGkgPSAxOyB1ID0gMzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldHFfbGFuZV9mMzI6IGkgPSAxOyB1ID0gMzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldF9sYW5lX2kzMjogaSA9IDE7IHUgPSAxOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfZjMyOiBpID0gMTsgdSA9IDE7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxcnNocm5fbl92OiBpID0gMTsgbCA9IDE7IHUgPSBSRlQoVFYsIHRydWUpOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJ1bl9uX3Y6IGkgPSAxOyBsID0gMTsgdSA9IFJGVChUViwgdHJ1ZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsdXFfbl92OiBpID0gMTsgdSA9IFJGVChUViwgdHJ1ZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsdV9uX3Y6IGkgPSAxOyB1ID0gUkZUKFRWLCB0cnVlKTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFzaGxxX25fdjogaSA9IDE7IHUgPSBSRlQoVFYsIHRydWUpOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXNobF9uX3Y6IGkgPSAxOyB1ID0gUkZUKFRWLCB0cnVlKTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFzaHJuX25fdjogaSA9IDE7IGwgPSAxOyB1ID0gUkZUKFRWLCB0cnVlKTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFzaHJ1bl9uX3Y6IGkgPSAxOyBsID0gMTsgdSA9IFJGVChUViwgdHJ1ZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hybl9uX3Y6IGkgPSAxOyBsID0gMTsgdSA9IFJGVChUViwgdHJ1ZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hycV9uX3Y6IGkgPSAxOyBsID0gMTsgdSA9IFJGVChUViwgdHJ1ZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hyX25fdjogaSA9IDE7IGwgPSAxOyB1ID0gUkZUKFRWLCB0cnVlKTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJzcmFxX25fdjogaSA9IDI7IGwgPSAxOyB1ID0gUkZUKFRWLCB0cnVlKTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJzcmFfbl92OiBpID0gMjsgbCA9IDE7IHUgPSBSRlQoVFYsIHRydWUpOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0X2xhbmVfaTg6IGkgPSAyOyB1ID0gNzsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNldF9sYW5lX2kxNjogaSA9IDI7IHUgPSAzOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2k4OiBpID0gMjsgdSA9IDE1OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2kxNjogaSA9IDI7IHUgPSA3OyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2kzMjogaSA9IDI7IHUgPSAzOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2YzMjogaSA9IDI7IHUgPSAzOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0X2xhbmVfaTMyOiBpID0gMjsgdSA9IDE7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9mMzI6IGkgPSAyOyB1ID0gMTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNobGxfbl92OiBpID0gMTsgdSA9IFJGVChUViwgdHJ1ZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGxxX25fdjogaSA9IDE7IHUgPSBSRlQoVFYsIHRydWUpOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2hsX25fdjogaSA9IDE7IHUgPSBSRlQoVFYsIHRydWUpOyBicmVhazsKK2Nhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2hybl9uX3Y6IGkgPSAxOyBsID0gMTsgdSA9IFJGVChUViwgdHJ1ZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzaHJxX25fdjogaSA9IDE7IGwgPSAxOyB1ID0gUkZUKFRWLCB0cnVlKTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNocl9uX3Y6IGkgPSAxOyBsID0gMTsgdSA9IFJGVChUViwgdHJ1ZSk7IGJyZWFrOworY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzcmFxX25fdjogaSA9IDI7IGwgPSAxOyB1ID0gUkZUKFRWLCB0cnVlKTsgYnJlYWs7CitjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNyYV9uX3Y6IGkgPSAyOyBsID0gMTsgdSA9IFJGVChUViwgdHJ1ZSk7IGJyZWFrOworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0NvZGVHZW4vQmFja2VuZFV0aWwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0NvZGVHZW4vQmFja2VuZFV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDEyMjFhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9CYWNrZW5kVXRpbC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8vPT09LS0tIEJhY2tlbmRVdGlsLmggLSBMTFZNIEJhY2tlbmQgVXRpbGl0aWVzIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19DT0RFR0VOX0JBQ0tFTkRVVElMX0gKKyNkZWZpbmUgTExWTV9DTEFOR19DT0RFR0VOX0JBQ0tFTkRVVElMX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZVN1bW1hcnlJbmRleC5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBCaXRjb2RlTW9kdWxlOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgRXhwZWN0ZWQ7CisgIGNsYXNzIE1vZHVsZTsKKyAgY2xhc3MgTWVtb3J5QnVmZmVyUmVmOworfQorCituYW1lc3BhY2UgY2xhbmcgeworICBjbGFzcyBEaWFnbm9zdGljc0VuZ2luZTsKKyAgY2xhc3MgSGVhZGVyU2VhcmNoT3B0aW9uczsKKyAgY2xhc3MgQ29kZUdlbk9wdGlvbnM7CisgIGNsYXNzIFRhcmdldE9wdGlvbnM7CisgIGNsYXNzIExhbmdPcHRpb25zOworCisgIGVudW0gQmFja2VuZEFjdGlvbiB7CisgICAgQmFja2VuZF9FbWl0QXNzZW1ibHksICAvLy88IEVtaXQgbmF0aXZlIGFzc2VtYmx5IGZpbGVzCisgICAgQmFja2VuZF9FbWl0QkMsICAgICAgICAvLy88IEVtaXQgTExWTSBiaXRjb2RlIGZpbGVzCisgICAgQmFja2VuZF9FbWl0TEwsICAgICAgICAvLy88IEVtaXQgaHVtYW4tcmVhZGFibGUgTExWTSBhc3NlbWJseQorICAgIEJhY2tlbmRfRW1pdE5vdGhpbmcsICAgLy8vPCBEb24ndCBlbWl0IGFueXRoaW5nIChiZW5jaG1hcmtpbmcgbW9kZSkKKyAgICBCYWNrZW5kX0VtaXRNQ051bGwsICAgIC8vLzwgUnVuIENvZGVHZW4sIGJ1dCBkb24ndCBlbWl0IGFueXRoaW5nCisgICAgQmFja2VuZF9FbWl0T2JqICAgICAgICAvLy88IEVtaXQgbmF0aXZlIG9iamVjdCBmaWxlcworICB9OworCisgIHZvaWQgRW1pdEJhY2tlbmRPdXRwdXQoRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzLCBjb25zdCBIZWFkZXJTZWFyY2hPcHRpb25zICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZUdlbk9wdGlvbnMgJkNHT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRPcHRpb25zICZUT3B0cywgY29uc3QgTGFuZ09wdGlvbnMgJkxPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkRhdGFMYXlvdXQgJlREZXNjLCBsbHZtOjpNb2R1bGUgKk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQmFja2VuZEFjdGlvbiBBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHJhd19wd3JpdGVfc3RyZWFtPiBPUyk7CisKKyAgdm9pZCBFbWJlZEJpdGNvZGUobGx2bTo6TW9kdWxlICpNLCBjb25zdCBDb2RlR2VuT3B0aW9ucyAmQ0dPcHRzLAorICAgICAgICAgICAgICAgICAgICBsbHZtOjpNZW1vcnlCdWZmZXJSZWYgQnVmKTsKKworICBsbHZtOjpFeHBlY3RlZDxsbHZtOjpCaXRjb2RlTW9kdWxlPgorICBGaW5kVGhpbkxUT01vZHVsZShsbHZtOjpNZW1vcnlCdWZmZXJSZWYgTUJSZWYpOworICBsbHZtOjpCaXRjb2RlTW9kdWxlICoKKyAgRmluZFRoaW5MVE9Nb2R1bGUobGx2bTo6TXV0YWJsZUFycmF5UmVmPGxsdm06OkJpdGNvZGVNb2R1bGU+IEJNcyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9DR0Z1bmN0aW9uSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9DR0Z1bmN0aW9uSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Zjk5MDgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Db2RlR2VuL0NHRnVuY3Rpb25JbmZvLmgKQEAgLTAsMCArMSw3MTggQEAKKy8vPT0tLSBDR0Z1bmN0aW9uSW5mby5oIC0gUmVwcmVzZW50YXRpb24gb2YgZnVuY3Rpb24gYXJndW1lbnQvcmV0dXJuIHR5cGVzIC09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVmaW5lcyBDR0Z1bmN0aW9uSW5mbyBhbmQgYXNzb2NpYXRlZCB0eXBlcyB1c2VkIGluIHJlcHJlc2VudGluZyB0aGUKKy8vIExMVk0gc291cmNlIHR5cGVzIGFuZCBBQkktY29lcmNlZCB0eXBlcyBmb3IgZnVuY3Rpb24gYXJndW1lbnRzIGFuZAorLy8gcmV0dXJuIHZhbHVlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQ09ERUdFTl9DR0ZVTkNUSU9OSU5GT19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQ09ERUdFTl9DR0ZVTkNUSU9OSU5GT19ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvQXR0ci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9DYW5vbmljYWxUeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0NoYXJVbml0cy5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVHJhaWxpbmdPYmplY3RzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBDb2RlR2VuIHsKKworLy8vIEFCSUFyZ0luZm8gLSBIZWxwZXIgY2xhc3MgdG8gZW5jYXBzdWxhdGUgaW5mb3JtYXRpb24gYWJvdXQgaG93IGEKKy8vLyBzcGVjaWZpYyBDIHR5cGUgc2hvdWxkIGJlIHBhc3NlZCB0byBvciByZXR1cm5lZCBmcm9tIGEgZnVuY3Rpb24uCitjbGFzcyBBQklBcmdJbmZvIHsKK3B1YmxpYzoKKyAgZW51bSBLaW5kIDogdWludDhfdCB7CisgICAgLy8vIERpcmVjdCAtIFBhc3MgdGhlIGFyZ3VtZW50IGRpcmVjdGx5IHVzaW5nIHRoZSBub3JtYWwgY29udmVydGVkIExMVk0KKyAgICAvLy8gdHlwZSwgb3IgYnkgY29lcmNpbmcgdG8gYW5vdGhlciBzcGVjaWZpZWQgdHlwZSBzdG9yZWQgaW4KKyAgICAvLy8gJ0NvZXJjZVRvVHlwZScpLiAgSWYgYW4gb2Zmc2V0IGlzIHNwZWNpZmllZCAoaW4gVUludERhdGEpLCB0aGVuIHRoZQorICAgIC8vLyBhcmd1bWVudCBwYXNzZWQgaXMgb2Zmc2V0IGJ5IHNvbWUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBtZW1vcnkKKyAgICAvLy8gcmVwcmVzZW50YXRpb24uIEEgZHVtbXkgYXJndW1lbnQgaXMgZW1pdHRlZCBiZWZvcmUgdGhlIHJlYWwgYXJndW1lbnQKKyAgICAvLy8gaWYgdGhlIHNwZWNpZmllZCB0eXBlIHN0b3JlZCBpbiAiUGFkZGluZ1R5cGUiIGlzIG5vdCB6ZXJvLgorICAgIERpcmVjdCwKKworICAgIC8vLyBFeHRlbmQgLSBWYWxpZCBvbmx5IGZvciBpbnRlZ2VyIGFyZ3VtZW50IHR5cGVzLiBTYW1lIGFzICdkaXJlY3QnCisgICAgLy8vIGJ1dCBhbHNvIGVtaXQgYSB6ZXJvL3NpZ24gZXh0ZW5zaW9uIGF0dHJpYnV0ZS4KKyAgICBFeHRlbmQsCisKKyAgICAvLy8gSW5kaXJlY3QgLSBQYXNzIHRoZSBhcmd1bWVudCBpbmRpcmVjdGx5IHZpYSBhIGhpZGRlbiBwb2ludGVyCisgICAgLy8vIHdpdGggdGhlIHNwZWNpZmllZCBhbGlnbm1lbnQgKDAgaW5kaWNhdGVzIGRlZmF1bHQgYWxpZ25tZW50KS4KKyAgICBJbmRpcmVjdCwKKworICAgIC8vLyBJZ25vcmUgLSBJZ25vcmUgdGhlIGFyZ3VtZW50ICh0cmVhdCBhcyB2b2lkKS4gVXNlZnVsIGZvciB2b2lkIGFuZAorICAgIC8vLyBlbXB0eSBzdHJ1Y3RzLgorICAgIElnbm9yZSwKKworICAgIC8vLyBFeHBhbmQgLSBPbmx5IHZhbGlkIGZvciBhZ2dyZWdhdGUgYXJndW1lbnQgdHlwZXMuIFRoZSBzdHJ1Y3R1cmUgc2hvdWxkCisgICAgLy8vIGJlIGV4cGFuZGVkIGludG8gY29uc2VjdXRpdmUgYXJndW1lbnRzIGZvciBpdHMgY29uc3RpdHVlbnQgZmllbGRzLgorICAgIC8vLyBDdXJyZW50bHkgZXhwYW5kIGlzIG9ubHkgYWxsb3dlZCBvbiBzdHJ1Y3R1cmVzIHdob3NlIGZpZWxkcworICAgIC8vLyBhcmUgYWxsIHNjYWxhciB0eXBlcyBvciBhcmUgdGhlbXNlbHZlcyBleHBhbmRhYmxlIHR5cGVzLgorICAgIEV4cGFuZCwKKworICAgIC8vLyBDb2VyY2VBbmRFeHBhbmQgLSBPbmx5IHZhbGlkIGZvciBhZ2dyZWdhdGUgYXJndW1lbnQgdHlwZXMuIFRoZQorICAgIC8vLyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGV4cGFuZGVkIGludG8gY29uc2VjdXRpdmUgYXJndW1lbnRzIGNvcnJlc3BvbmRpbmcKKyAgICAvLy8gdG8gdGhlIG5vbi1hcnJheSBlbGVtZW50cyBvZiB0aGUgdHlwZSBzdG9yZWQgaW4gQ29lcmNlVG9UeXBlLgorICAgIC8vLyBBcnJheSBlbGVtZW50cyBpbiB0aGUgdHlwZSBhcmUgYXNzdW1lZCB0byBiZSBwYWRkaW5nIGFuZCBza2lwcGVkLgorICAgIENvZXJjZUFuZEV4cGFuZCwKKworICAgIC8vLyBJbkFsbG9jYSAtIFBhc3MgdGhlIGFyZ3VtZW50IGRpcmVjdGx5IHVzaW5nIHRoZSBMTFZNIGluYWxsb2NhIGF0dHJpYnV0ZS4KKyAgICAvLy8gVGhpcyBpcyBzaW1pbGFyIHRvIGluZGlyZWN0IHdpdGggYnl2YWwsIGV4Y2VwdCBpdCBvbmx5IGFwcGxpZXMgdG8KKyAgICAvLy8gYXJndW1lbnRzIHN0b3JlZCBpbiBtZW1vcnkgYW5kIGZvcmJpZHMgYW55IGltcGxpY2l0IGNvcGllcy4gIFdoZW4KKyAgICAvLy8gYXBwbGllZCB0byBhIHJldHVybiB0eXBlLCBpdCBtZWFucyB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgaW5kaXJlY3RseSB2aWEKKyAgICAvLy8gYW4gaW1wbGljaXQgc3JldCBwYXJhbWV0ZXIgc3RvcmVkIGluIHRoZSBhcmd1bWVudCBzdHJ1Y3QuCisgICAgSW5BbGxvY2EsCisgICAgS2luZEZpcnN0ID0gRGlyZWN0LAorICAgIEtpbmRMYXN0ID0gSW5BbGxvY2EKKyAgfTsKKworcHJpdmF0ZToKKyAgbGx2bTo6VHlwZSAqVHlwZURhdGE7IC8vIGNhbkhhdmVDb2VyY2VUb1R5cGUoKQorICB1bmlvbiB7CisgICAgbGx2bTo6VHlwZSAqUGFkZGluZ1R5cGU7IC8vIGNhbkhhdmVQYWRkaW5nVHlwZSgpCisgICAgbGx2bTo6VHlwZSAqVW5wYWRkZWRDb2VyY2VBbmRFeHBhbmRUeXBlOyAvLyBpc0NvZXJjZUFuZEV4cGFuZCgpCisgIH07CisgIHVuaW9uIHsKKyAgICB1bnNpZ25lZCBEaXJlY3RPZmZzZXQ7ICAgICAvLyBpc0RpcmVjdCgpIHx8IGlzRXh0ZW5kKCkKKyAgICB1bnNpZ25lZCBJbmRpcmVjdEFsaWduOyAgICAvLyBpc0luZGlyZWN0KCkKKyAgICB1bnNpZ25lZCBBbGxvY2FGaWVsZEluZGV4OyAvLyBpc0luQWxsb2NhKCkKKyAgfTsKKyAgS2luZCBUaGVLaW5kOworICBib29sIFBhZGRpbmdJblJlZyA6IDE7CisgIGJvb2wgSW5BbGxvY2FTUmV0IDogMTsgICAgLy8gaXNJbkFsbG9jYSgpCisgIGJvb2wgSW5kaXJlY3RCeVZhbCA6IDE7ICAgLy8gaXNJbmRpcmVjdCgpCisgIGJvb2wgSW5kaXJlY3RSZWFsaWduIDogMTsgLy8gaXNJbmRpcmVjdCgpCisgIGJvb2wgU1JldEFmdGVyVGhpcyA6IDE7ICAgLy8gaXNJbmRpcmVjdCgpCisgIGJvb2wgSW5SZWcgOiAxOyAgICAgICAgICAgLy8gaXNEaXJlY3QoKSB8fCBpc0V4dGVuZCgpIHx8IGlzSW5kaXJlY3QoKQorICBib29sIENhbkJlRmxhdHRlbmVkOiAxOyAgIC8vIGlzRGlyZWN0KCkKKyAgYm9vbCBTaWduRXh0IDogMTsgICAgICAgICAvLyBpc0V4dGVuZCgpCisKKyAgYm9vbCBjYW5IYXZlUGFkZGluZ1R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRGlyZWN0KCkgfHwgaXNFeHRlbmQoKSB8fCBpc0luZGlyZWN0KCkgfHwgaXNFeHBhbmQoKTsKKyAgfQorICB2b2lkIHNldFBhZGRpbmdUeXBlKGxsdm06OlR5cGUgKlQpIHsKKyAgICBhc3NlcnQoY2FuSGF2ZVBhZGRpbmdUeXBlKCkpOworICAgIFBhZGRpbmdUeXBlID0gVDsKKyAgfQorCisgIHZvaWQgc2V0VW5wYWRkZWRDb2VyY2VUb1R5cGUobGx2bTo6VHlwZSAqVCkgeworICAgIGFzc2VydChpc0NvZXJjZUFuZEV4cGFuZCgpKTsKKyAgICBVbnBhZGRlZENvZXJjZUFuZEV4cGFuZFR5cGUgPSBUOworICB9CisKKyAgQUJJQXJnSW5mbyhLaW5kIEspCisgICAgICA6IFRoZUtpbmQoSyksIFBhZGRpbmdJblJlZyhmYWxzZSksIEluUmVnKGZhbHNlKSB7CisgIH0KKworcHVibGljOgorICBBQklBcmdJbmZvKCkKKyAgICAgIDogVHlwZURhdGEobnVsbHB0ciksIFBhZGRpbmdUeXBlKG51bGxwdHIpLCBEaXJlY3RPZmZzZXQoMCksCisgICAgICAgIFRoZUtpbmQoRGlyZWN0KSwgUGFkZGluZ0luUmVnKGZhbHNlKSwgSW5SZWcoZmFsc2UpIHt9CisKKyAgc3RhdGljIEFCSUFyZ0luZm8gZ2V0RGlyZWN0KGxsdm06OlR5cGUgKlQgPSBudWxscHRyLCB1bnNpZ25lZCBPZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VHlwZSAqUGFkZGluZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENhbkJlRmxhdHRlbmVkID0gdHJ1ZSkgeworICAgIGF1dG8gQUkgPSBBQklBcmdJbmZvKERpcmVjdCk7CisgICAgQUkuc2V0Q29lcmNlVG9UeXBlKFQpOworICAgIEFJLnNldFBhZGRpbmdUeXBlKFBhZGRpbmcpOworICAgIEFJLnNldERpcmVjdE9mZnNldChPZmZzZXQpOworICAgIEFJLnNldENhbkJlRmxhdHRlbmVkKENhbkJlRmxhdHRlbmVkKTsKKyAgICByZXR1cm4gQUk7CisgIH0KKyAgc3RhdGljIEFCSUFyZ0luZm8gZ2V0RGlyZWN0SW5SZWcobGx2bTo6VHlwZSAqVCA9IG51bGxwdHIpIHsKKyAgICBhdXRvIEFJID0gZ2V0RGlyZWN0KFQpOworICAgIEFJLnNldEluUmVnKHRydWUpOworICAgIHJldHVybiBBSTsKKyAgfQorCisgIHN0YXRpYyBBQklBcmdJbmZvIGdldFNpZ25FeHRlbmQoUXVhbFR5cGUgVHksIGxsdm06OlR5cGUgKlQgPSBudWxscHRyKSB7CisgICAgYXNzZXJ0KFR5LT5pc0ludGVncmFsT3JFbnVtZXJhdGlvblR5cGUoKSAmJiAiVW5leHBlY3RlZCBRdWFsVHlwZSIpOworICAgIGF1dG8gQUkgPSBBQklBcmdJbmZvKEV4dGVuZCk7CisgICAgQUkuc2V0Q29lcmNlVG9UeXBlKFQpOworICAgIEFJLnNldFBhZGRpbmdUeXBlKG51bGxwdHIpOworICAgIEFJLnNldERpcmVjdE9mZnNldCgwKTsKKyAgICBBSS5zZXRTaWduRXh0KHRydWUpOworICAgIHJldHVybiBBSTsKKyAgfQorCisgIHN0YXRpYyBBQklBcmdJbmZvIGdldFplcm9FeHRlbmQoUXVhbFR5cGUgVHksIGxsdm06OlR5cGUgKlQgPSBudWxscHRyKSB7CisgICAgYXNzZXJ0KFR5LT5pc0ludGVncmFsT3JFbnVtZXJhdGlvblR5cGUoKSAmJiAiVW5leHBlY3RlZCBRdWFsVHlwZSIpOworICAgIGF1dG8gQUkgPSBBQklBcmdJbmZvKEV4dGVuZCk7CisgICAgQUkuc2V0Q29lcmNlVG9UeXBlKFQpOworICAgIEFJLnNldFBhZGRpbmdUeXBlKG51bGxwdHIpOworICAgIEFJLnNldERpcmVjdE9mZnNldCgwKTsKKyAgICBBSS5zZXRTaWduRXh0KGZhbHNlKTsKKyAgICByZXR1cm4gQUk7CisgIH0KKworICAvLyBBQklBcmdJbmZvIHdpbGwgcmVjb3JkIHRoZSBhcmd1bWVudCBhcyBiZWluZyBleHRlbmRlZCBiYXNlZCBvbiB0aGUgc2lnbgorICAvLyBvZiBpdHMgdHlwZS4KKyAgc3RhdGljIEFCSUFyZ0luZm8gZ2V0RXh0ZW5kKFF1YWxUeXBlIFR5LCBsbHZtOjpUeXBlICpUID0gbnVsbHB0cikgeworICAgIGFzc2VydChUeS0+aXNJbnRlZ3JhbE9yRW51bWVyYXRpb25UeXBlKCkgJiYgIlVuZXhwZWN0ZWQgUXVhbFR5cGUiKTsKKyAgICBpZiAoVHktPmhhc1NpZ25lZEludGVnZXJSZXByZXNlbnRhdGlvbigpKQorICAgICAgcmV0dXJuIGdldFNpZ25FeHRlbmQoVHksIFQpOworICAgIHJldHVybiBnZXRaZXJvRXh0ZW5kKFR5LCBUKTsKKyAgfQorCisgIHN0YXRpYyBBQklBcmdJbmZvIGdldEV4dGVuZEluUmVnKFF1YWxUeXBlIFR5LCBsbHZtOjpUeXBlICpUID0gbnVsbHB0cikgeworICAgIGF1dG8gQUkgPSBnZXRFeHRlbmQoVHksIFQpOworICAgIEFJLnNldEluUmVnKHRydWUpOworICAgIHJldHVybiBBSTsKKyAgfQorICBzdGF0aWMgQUJJQXJnSW5mbyBnZXRJZ25vcmUoKSB7CisgICAgcmV0dXJuIEFCSUFyZ0luZm8oSWdub3JlKTsKKyAgfQorICBzdGF0aWMgQUJJQXJnSW5mbyBnZXRJbmRpcmVjdChDaGFyVW5pdHMgQWxpZ25tZW50LCBib29sIEJ5VmFsID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZWFsaWduID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlR5cGUgKlBhZGRpbmcgPSBudWxscHRyKSB7CisgICAgYXV0byBBSSA9IEFCSUFyZ0luZm8oSW5kaXJlY3QpOworICAgIEFJLnNldEluZGlyZWN0QWxpZ24oQWxpZ25tZW50KTsKKyAgICBBSS5zZXRJbmRpcmVjdEJ5VmFsKEJ5VmFsKTsKKyAgICBBSS5zZXRJbmRpcmVjdFJlYWxpZ24oUmVhbGlnbik7CisgICAgQUkuc2V0U1JldEFmdGVyVGhpcyhmYWxzZSk7CisgICAgQUkuc2V0UGFkZGluZ1R5cGUoUGFkZGluZyk7CisgICAgcmV0dXJuIEFJOworICB9CisgIHN0YXRpYyBBQklBcmdJbmZvIGdldEluZGlyZWN0SW5SZWcoQ2hhclVuaXRzIEFsaWdubWVudCwgYm9vbCBCeVZhbCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZWFsaWduID0gZmFsc2UpIHsKKyAgICBhdXRvIEFJID0gZ2V0SW5kaXJlY3QoQWxpZ25tZW50LCBCeVZhbCwgUmVhbGlnbik7CisgICAgQUkuc2V0SW5SZWcodHJ1ZSk7CisgICAgcmV0dXJuIEFJOworICB9CisgIHN0YXRpYyBBQklBcmdJbmZvIGdldEluQWxsb2NhKHVuc2lnbmVkIEZpZWxkSW5kZXgpIHsKKyAgICBhdXRvIEFJID0gQUJJQXJnSW5mbyhJbkFsbG9jYSk7CisgICAgQUkuc2V0SW5BbGxvY2FGaWVsZEluZGV4KEZpZWxkSW5kZXgpOworICAgIHJldHVybiBBSTsKKyAgfQorICBzdGF0aWMgQUJJQXJnSW5mbyBnZXRFeHBhbmQoKSB7CisgICAgYXV0byBBSSA9IEFCSUFyZ0luZm8oRXhwYW5kKTsKKyAgICBBSS5zZXRQYWRkaW5nVHlwZShudWxscHRyKTsKKyAgICByZXR1cm4gQUk7CisgIH0KKyAgc3RhdGljIEFCSUFyZ0luZm8gZ2V0RXhwYW5kV2l0aFBhZGRpbmcoYm9vbCBQYWRkaW5nSW5SZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlR5cGUgKlBhZGRpbmcpIHsKKyAgICBhdXRvIEFJID0gZ2V0RXhwYW5kKCk7CisgICAgQUkuc2V0UGFkZGluZ0luUmVnKFBhZGRpbmdJblJlZyk7CisgICAgQUkuc2V0UGFkZGluZ1R5cGUoUGFkZGluZyk7CisgICAgcmV0dXJuIEFJOworICB9CisKKyAgLy8vIFxwYXJhbSB1bnBhZGRlZENvZXJjZVRvVHlwZSBUaGUgY29lcmNlLXRvIHR5cGUgd2l0aCBwYWRkaW5nIGVsZW1lbnRzCisgIC8vLyAgIHJlbW92ZWQsIGNhbm9uaWNhbGl6ZWQgdG8gYSBzaW5nbGUgZWxlbWVudCBpZiBpdCB3b3VsZCBvdGhlcndpc2UKKyAgLy8vICAgaGF2ZSBleGFjdGx5IG9uZSBlbGVtZW50LgorICBzdGF0aWMgQUJJQXJnSW5mbyBnZXRDb2VyY2VBbmRFeHBhbmQobGx2bTo6U3RydWN0VHlwZSAqY29lcmNlVG9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VHlwZSAqdW5wYWRkZWRDb2VyY2VUb1R5cGUpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgLy8gU2FuaXR5IGNoZWNrcyBvbiB1bnBhZGRlZENvZXJjZVRvVHlwZS4KKworICAgIC8vIEFzc2VydCB0aGF0IHdlIG9ubHkgaGF2ZSBhIHN0cnVjdCB0eXBlIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cy4KKyAgICBhdXRvIHVucGFkZGVkU3RydWN0ID0gZHluX2Nhc3Q8bGx2bTo6U3RydWN0VHlwZT4odW5wYWRkZWRDb2VyY2VUb1R5cGUpOworICAgIGFzc2VydCghdW5wYWRkZWRTdHJ1Y3QgfHwgdW5wYWRkZWRTdHJ1Y3QtPmdldE51bUVsZW1lbnRzKCkgIT0gMSk7CisKKyAgICAvLyBBc3NlcnQgdGhhdCBhbGwgdGhlIG5vbi1wYWRkaW5nIGVsZW1lbnRzIGhhdmUgYSBjb3JyZXNwb25kaW5nIGVsZW1lbnQKKyAgICAvLyBpbiB0aGUgdW5wYWRkZWQgdHlwZS4KKyAgICB1bnNpZ25lZCB1bnBhZGRlZEluZGV4ID0gMDsKKyAgICBmb3IgKGF1dG8gZWx0VHlwZSA6IGNvZXJjZVRvVHlwZS0+ZWxlbWVudHMoKSkgeworICAgICAgaWYgKGlzUGFkZGluZ0ZvckNvZXJjZUFuZEV4cGFuZChlbHRUeXBlKSkgY29udGludWU7CisgICAgICBpZiAodW5wYWRkZWRTdHJ1Y3QpIHsKKyAgICAgICAgYXNzZXJ0KHVucGFkZGVkU3RydWN0LT5nZXRFbGVtZW50VHlwZSh1bnBhZGRlZEluZGV4KSA9PSBlbHRUeXBlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydCh1bnBhZGRlZEluZGV4ID09IDAgJiYgdW5wYWRkZWRDb2VyY2VUb1R5cGUgPT0gZWx0VHlwZSk7CisgICAgICB9CisgICAgICB1bnBhZGRlZEluZGV4Kys7CisgICAgfQorCisgICAgLy8gQXNzZXJ0IHRoYXQgdGhlcmUgYXJlbid0IGV4dHJhIGVsZW1lbnRzIGluIHRoZSB1bnBhZGRlZCB0eXBlLgorICAgIGlmICh1bnBhZGRlZFN0cnVjdCkgeworICAgICAgYXNzZXJ0KHVucGFkZGVkU3RydWN0LT5nZXROdW1FbGVtZW50cygpID09IHVucGFkZGVkSW5kZXgpOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQodW5wYWRkZWRJbmRleCA9PSAxKTsKKyAgICB9CisjZW5kaWYKKworICAgIGF1dG8gQUkgPSBBQklBcmdJbmZvKENvZXJjZUFuZEV4cGFuZCk7CisgICAgQUkuc2V0Q29lcmNlVG9UeXBlKGNvZXJjZVRvVHlwZSk7CisgICAgQUkuc2V0VW5wYWRkZWRDb2VyY2VUb1R5cGUodW5wYWRkZWRDb2VyY2VUb1R5cGUpOworICAgIHJldHVybiBBSTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzUGFkZGluZ0ZvckNvZXJjZUFuZEV4cGFuZChsbHZtOjpUeXBlICplbHRUeXBlKSB7CisgICAgaWYgKGVsdFR5cGUtPmlzQXJyYXlUeSgpKSB7CisgICAgICBhc3NlcnQoZWx0VHlwZS0+Z2V0QXJyYXlFbGVtZW50VHlwZSgpLT5pc0ludGVnZXJUeSg4KSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIFRoZUtpbmQ7IH0KKyAgYm9vbCBpc0RpcmVjdCgpIGNvbnN0IHsgcmV0dXJuIFRoZUtpbmQgPT0gRGlyZWN0OyB9CisgIGJvb2wgaXNJbkFsbG9jYSgpIGNvbnN0IHsgcmV0dXJuIFRoZUtpbmQgPT0gSW5BbGxvY2E7IH0KKyAgYm9vbCBpc0V4dGVuZCgpIGNvbnN0IHsgcmV0dXJuIFRoZUtpbmQgPT0gRXh0ZW5kOyB9CisgIGJvb2wgaXNJZ25vcmUoKSBjb25zdCB7IHJldHVybiBUaGVLaW5kID09IElnbm9yZTsgfQorICBib29sIGlzSW5kaXJlY3QoKSBjb25zdCB7IHJldHVybiBUaGVLaW5kID09IEluZGlyZWN0OyB9CisgIGJvb2wgaXNFeHBhbmQoKSBjb25zdCB7IHJldHVybiBUaGVLaW5kID09IEV4cGFuZDsgfQorICBib29sIGlzQ29lcmNlQW5kRXhwYW5kKCkgY29uc3QgeyByZXR1cm4gVGhlS2luZCA9PSBDb2VyY2VBbmRFeHBhbmQ7IH0KKworICBib29sIGNhbkhhdmVDb2VyY2VUb1R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRGlyZWN0KCkgfHwgaXNFeHRlbmQoKSB8fCBpc0NvZXJjZUFuZEV4cGFuZCgpOworICB9CisKKyAgLy8gRGlyZWN0L0V4dGVuZCBhY2Nlc3NvcnMKKyAgdW5zaWduZWQgZ2V0RGlyZWN0T2Zmc2V0KCkgY29uc3QgeworICAgIGFzc2VydCgoaXNEaXJlY3QoKSB8fCBpc0V4dGVuZCgpKSAmJiAiTm90IGEgZGlyZWN0IG9yIGV4dGVuZCBraW5kIik7CisgICAgcmV0dXJuIERpcmVjdE9mZnNldDsKKyAgfQorICB2b2lkIHNldERpcmVjdE9mZnNldCh1bnNpZ25lZCBPZmZzZXQpIHsKKyAgICBhc3NlcnQoKGlzRGlyZWN0KCkgfHwgaXNFeHRlbmQoKSkgJiYgIk5vdCBhIGRpcmVjdCBvciBleHRlbmQga2luZCIpOworICAgIERpcmVjdE9mZnNldCA9IE9mZnNldDsKKyAgfQorCisgIGJvb2wgaXNTaWduRXh0KCkgY29uc3QgeworICAgIGFzc2VydChpc0V4dGVuZCgpICYmICJJbnZhbGlkIGtpbmQhIik7CisgICAgcmV0dXJuIFNpZ25FeHQ7CisgIH0KKyAgdm9pZCBzZXRTaWduRXh0KGJvb2wgU0V4dCkgeworICAgIGFzc2VydChpc0V4dGVuZCgpICYmICJJbnZhbGlkIGtpbmQhIik7CisgICAgU2lnbkV4dCA9IFNFeHQ7CisgIH0KKworICBsbHZtOjpUeXBlICpnZXRQYWRkaW5nVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGNhbkhhdmVQYWRkaW5nVHlwZSgpID8gUGFkZGluZ1R5cGUgOiBudWxscHRyKTsKKyAgfQorCisgIGJvb2wgZ2V0UGFkZGluZ0luUmVnKCkgY29uc3QgeworICAgIHJldHVybiBQYWRkaW5nSW5SZWc7CisgIH0KKyAgdm9pZCBzZXRQYWRkaW5nSW5SZWcoYm9vbCBQSVIpIHsKKyAgICBQYWRkaW5nSW5SZWcgPSBQSVI7CisgIH0KKworICBsbHZtOjpUeXBlICpnZXRDb2VyY2VUb1R5cGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGNhbkhhdmVDb2VyY2VUb1R5cGUoKSAmJiAiSW52YWxpZCBraW5kISIpOworICAgIHJldHVybiBUeXBlRGF0YTsKKyAgfQorCisgIHZvaWQgc2V0Q29lcmNlVG9UeXBlKGxsdm06OlR5cGUgKlQpIHsKKyAgICBhc3NlcnQoY2FuSGF2ZUNvZXJjZVRvVHlwZSgpICYmICJJbnZhbGlkIGtpbmQhIik7CisgICAgVHlwZURhdGEgPSBUOworICB9CisKKyAgbGx2bTo6U3RydWN0VHlwZSAqZ2V0Q29lcmNlQW5kRXhwYW5kVHlwZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNDb2VyY2VBbmRFeHBhbmQoKSk7CisgICAgcmV0dXJuIGNhc3Q8bGx2bTo6U3RydWN0VHlwZT4oVHlwZURhdGEpOworICB9CisKKyAgbGx2bTo6VHlwZSAqZ2V0VW5wYWRkZWRDb2VyY2VBbmRFeHBhbmRUeXBlKCkgY29uc3QgeworICAgIGFzc2VydChpc0NvZXJjZUFuZEV4cGFuZCgpKTsKKyAgICByZXR1cm4gVW5wYWRkZWRDb2VyY2VBbmRFeHBhbmRUeXBlOworICB9CisKKyAgQXJyYXlSZWY8bGx2bTo6VHlwZSAqPmdldENvZXJjZUFuZEV4cGFuZFR5cGVTZXF1ZW5jZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNDb2VyY2VBbmRFeHBhbmQoKSk7CisgICAgaWYgKGF1dG8gc3RydWN0VHkgPQorICAgICAgICAgIGR5bl9jYXN0PGxsdm06OlN0cnVjdFR5cGU+KFVucGFkZGVkQ29lcmNlQW5kRXhwYW5kVHlwZSkpIHsKKyAgICAgIHJldHVybiBzdHJ1Y3RUeS0+ZWxlbWVudHMoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZigmVW5wYWRkZWRDb2VyY2VBbmRFeHBhbmRUeXBlLCAxKTsKKyAgICB9CisgIH0KKworICBib29sIGdldEluUmVnKCkgY29uc3QgeworICAgIGFzc2VydCgoaXNEaXJlY3QoKSB8fCBpc0V4dGVuZCgpIHx8IGlzSW5kaXJlY3QoKSkgJiYgIkludmFsaWQga2luZCEiKTsKKyAgICByZXR1cm4gSW5SZWc7CisgIH0KKworICB2b2lkIHNldEluUmVnKGJvb2wgSVIpIHsKKyAgICBhc3NlcnQoKGlzRGlyZWN0KCkgfHwgaXNFeHRlbmQoKSB8fCBpc0luZGlyZWN0KCkpICYmICJJbnZhbGlkIGtpbmQhIik7CisgICAgSW5SZWcgPSBJUjsKKyAgfQorCisgIC8vIEluZGlyZWN0IGFjY2Vzc29ycworICBDaGFyVW5pdHMgZ2V0SW5kaXJlY3RBbGlnbigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNJbmRpcmVjdCgpICYmICJJbnZhbGlkIGtpbmQhIik7CisgICAgcmV0dXJuIENoYXJVbml0czo6ZnJvbVF1YW50aXR5KEluZGlyZWN0QWxpZ24pOworICB9CisgIHZvaWQgc2V0SW5kaXJlY3RBbGlnbihDaGFyVW5pdHMgSUEpIHsKKyAgICBhc3NlcnQoaXNJbmRpcmVjdCgpICYmICJJbnZhbGlkIGtpbmQhIik7CisgICAgSW5kaXJlY3RBbGlnbiA9IElBLmdldFF1YW50aXR5KCk7CisgIH0KKworICBib29sIGdldEluZGlyZWN0QnlWYWwoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzSW5kaXJlY3QoKSAmJiAiSW52YWxpZCBraW5kISIpOworICAgIHJldHVybiBJbmRpcmVjdEJ5VmFsOworICB9CisgIHZvaWQgc2V0SW5kaXJlY3RCeVZhbChib29sIElCVikgeworICAgIGFzc2VydChpc0luZGlyZWN0KCkgJiYgIkludmFsaWQga2luZCEiKTsKKyAgICBJbmRpcmVjdEJ5VmFsID0gSUJWOworICB9CisKKyAgYm9vbCBnZXRJbmRpcmVjdFJlYWxpZ24oKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzSW5kaXJlY3QoKSAmJiAiSW52YWxpZCBraW5kISIpOworICAgIHJldHVybiBJbmRpcmVjdFJlYWxpZ247CisgIH0KKyAgdm9pZCBzZXRJbmRpcmVjdFJlYWxpZ24oYm9vbCBJUikgeworICAgIGFzc2VydChpc0luZGlyZWN0KCkgJiYgIkludmFsaWQga2luZCEiKTsKKyAgICBJbmRpcmVjdFJlYWxpZ24gPSBJUjsKKyAgfQorCisgIGJvb2wgaXNTUmV0QWZ0ZXJUaGlzKCkgY29uc3QgeworICAgIGFzc2VydChpc0luZGlyZWN0KCkgJiYgIkludmFsaWQga2luZCEiKTsKKyAgICByZXR1cm4gU1JldEFmdGVyVGhpczsKKyAgfQorICB2b2lkIHNldFNSZXRBZnRlclRoaXMoYm9vbCBBZnRlclRoaXMpIHsKKyAgICBhc3NlcnQoaXNJbmRpcmVjdCgpICYmICJJbnZhbGlkIGtpbmQhIik7CisgICAgU1JldEFmdGVyVGhpcyA9IEFmdGVyVGhpczsKKyAgfQorCisgIHVuc2lnbmVkIGdldEluQWxsb2NhRmllbGRJbmRleCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNJbkFsbG9jYSgpICYmICJJbnZhbGlkIGtpbmQhIik7CisgICAgcmV0dXJuIEFsbG9jYUZpZWxkSW5kZXg7CisgIH0KKyAgdm9pZCBzZXRJbkFsbG9jYUZpZWxkSW5kZXgodW5zaWduZWQgRmllbGRJbmRleCkgeworICAgIGFzc2VydChpc0luQWxsb2NhKCkgJiYgIkludmFsaWQga2luZCEiKTsKKyAgICBBbGxvY2FGaWVsZEluZGV4ID0gRmllbGRJbmRleDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBmaWVsZCBvZiBhbiBpbmFsbG9jYSBzdHJ1Y3Qgc2hvdWxkIGJlIHJldHVybmVkCisgIC8vLyB0byBpbXBsZW1lbnQgYSBzdHJ1Y3QgcmV0dXJuIGNhbGxpbmcgY29udmVudGlvbi4KKyAgYm9vbCBnZXRJbkFsbG9jYVNSZXQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzSW5BbGxvY2EoKSAmJiAiSW52YWxpZCBraW5kISIpOworICAgIHJldHVybiBJbkFsbG9jYVNSZXQ7CisgIH0KKworICB2b2lkIHNldEluQWxsb2NhU1JldChib29sIFNSZXQpIHsKKyAgICBhc3NlcnQoaXNJbkFsbG9jYSgpICYmICJJbnZhbGlkIGtpbmQhIik7CisgICAgSW5BbGxvY2FTUmV0ID0gU1JldDsKKyAgfQorCisgIGJvb2wgZ2V0Q2FuQmVGbGF0dGVuZWQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzRGlyZWN0KCkgJiYgIkludmFsaWQga2luZCEiKTsKKyAgICByZXR1cm4gQ2FuQmVGbGF0dGVuZWQ7CisgIH0KKworICB2b2lkIHNldENhbkJlRmxhdHRlbmVkKGJvb2wgRmxhdHRlbikgeworICAgIGFzc2VydChpc0RpcmVjdCgpICYmICJJbnZhbGlkIGtpbmQhIik7CisgICAgQ2FuQmVGbGF0dGVuZWQgPSBGbGF0dGVuOworICB9CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCisvLy8gQSBjbGFzcyBmb3IgcmVjb3JkaW5nIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRoYXQgYSBmdW5jdGlvbgorLy8vIHNpZ25hdHVyZSByZXF1aXJlcy4KK2NsYXNzIFJlcXVpcmVkQXJncyB7CisgIC8vLyBUaGUgbnVtYmVyIG9mIHJlcXVpcmVkIGFyZ3VtZW50cywgb3IgfjAgaWYgdGhlIHNpZ25hdHVyZSBkb2VzCisgIC8vLyBub3QgcGVybWl0IG9wdGlvbmFsIGFyZ3VtZW50cy4KKyAgdW5zaWduZWQgTnVtUmVxdWlyZWQ7CitwdWJsaWM6CisgIGVudW0gQWxsX3QgeyBBbGwgfTsKKworICBSZXF1aXJlZEFyZ3MoQWxsX3QgXykgOiBOdW1SZXF1aXJlZCh+MFUpIHt9CisgIGV4cGxpY2l0IFJlcXVpcmVkQXJncyh1bnNpZ25lZCBuKSA6IE51bVJlcXVpcmVkKG4pIHsKKyAgICBhc3NlcnQobiAhPSB+MFUpOworICB9CisKKyAgLy8vIENvbXB1dGUgdGhlIGFyZ3VtZW50cyByZXF1aXJlZCBieSB0aGUgZ2l2ZW4gZm9ybWFsIHByb3RvdHlwZSwKKyAgLy8vIGdpdmVuIHRoYXQgdGhlcmUgbWF5IGJlIHNvbWUgYWRkaXRpb25hbCwgbm9uLWZvcm1hbCBhcmd1bWVudHMKKyAgLy8vIGluIHBsYXkuCisgIC8vLworICAvLy8gSWYgRkQgaXMgbm90IG51bGwsIHRoaXMgd2lsbCBjb25zaWRlciBwYXNzX29iamVjdF9zaXplIHBhcmFtcyBpbiBGRC4KKyAgc3RhdGljIFJlcXVpcmVkQXJncyBmb3JQcm90b3R5cGVQbHVzKGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpwcm90b3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBhZGRpdGlvbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpGRCkgeworICAgIGlmICghcHJvdG90eXBlLT5pc1ZhcmlhZGljKCkpIHJldHVybiBBbGw7CisgICAgaWYgKEZEKQorICAgICAgYWRkaXRpb25hbCArPQorICAgICAgICAgIGxsdm06OmNvdW50X2lmKEZELT5wYXJhbWV0ZXJzKCksIFtdKGNvbnN0IFBhcm1WYXJEZWNsICpQVkQpIHsKKyAgICAgICAgICAgIHJldHVybiBQVkQtPmhhc0F0dHI8UGFzc09iamVjdFNpemVBdHRyPigpOworICAgICAgICAgIH0pOworICAgIHJldHVybiBSZXF1aXJlZEFyZ3MocHJvdG90eXBlLT5nZXROdW1QYXJhbXMoKSArIGFkZGl0aW9uYWwpOworICB9CisKKyAgc3RhdGljIFJlcXVpcmVkQXJncyBmb3JQcm90b3R5cGUoY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKnByb3RvdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpGRCkgeworICAgIHJldHVybiBmb3JQcm90b3R5cGVQbHVzKHByb3RvdHlwZSwgMCwgRkQpOworICB9CisKKyAgc3RhdGljIFJlcXVpcmVkQXJncyBmb3JQcm90b3R5cGUoQ2FuUXVhbDxGdW5jdGlvblByb3RvVHlwZT4gcHJvdG90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkZEKSB7CisgICAgcmV0dXJuIGZvclByb3RvdHlwZShwcm90b3R5cGUuZ2V0VHlwZVB0cigpLCBGRCk7CisgIH0KKworICBzdGF0aWMgUmVxdWlyZWRBcmdzIGZvclByb3RvdHlwZVBsdXMoQ2FuUXVhbDxGdW5jdGlvblByb3RvVHlwZT4gcHJvdG90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYWRkaXRpb25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQpIHsKKyAgICByZXR1cm4gZm9yUHJvdG90eXBlUGx1cyhwcm90b3R5cGUuZ2V0VHlwZVB0cigpLCBhZGRpdGlvbmFsLCBGRCk7CisgIH0KKworICBib29sIGFsbG93c09wdGlvbmFsQXJncygpIGNvbnN0IHsgcmV0dXJuIE51bVJlcXVpcmVkICE9IH4wVTsgfQorICB1bnNpZ25lZCBnZXROdW1SZXF1aXJlZEFyZ3MoKSBjb25zdCB7CisgICAgYXNzZXJ0KGFsbG93c09wdGlvbmFsQXJncygpKTsKKyAgICByZXR1cm4gTnVtUmVxdWlyZWQ7CisgIH0KKworICB1bnNpZ25lZCBnZXRPcGFxdWVEYXRhKCkgY29uc3QgeyByZXR1cm4gTnVtUmVxdWlyZWQ7IH0KKyAgc3RhdGljIFJlcXVpcmVkQXJncyBnZXRGcm9tT3BhcXVlRGF0YSh1bnNpZ25lZCB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA9PSB+MFUpIHJldHVybiBBbGw7CisgICAgcmV0dXJuIFJlcXVpcmVkQXJncyh2YWx1ZSk7CisgIH0KK307CisKKy8vIEltcGxlbWVudGF0aW9uIGRldGFpbCBvZiBDR0Z1bmN0aW9uSW5mbywgZmFjdG9yZWQgb3V0IHNvIGl0IGNhbiBiZSBuYW1lZAorLy8gaW4gdGhlIFRyYWlsaW5nT2JqZWN0cyBiYXNlIGNsYXNzIG9mIENHRnVuY3Rpb25JbmZvLgorc3RydWN0IENHRnVuY3Rpb25JbmZvQXJnSW5mbyB7CisgIENhblF1YWxUeXBlIHR5cGU7CisgIEFCSUFyZ0luZm8gaW5mbzsKK307CisKKy8vLyBDR0Z1bmN0aW9uSW5mbyAtIENsYXNzIHRvIGVuY2Fwc3VsYXRlIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhCisvLy8gZnVuY3Rpb24gZGVmaW5pdGlvbi4KK2NsYXNzIENHRnVuY3Rpb25JbmZvIGZpbmFsCisgICAgOiBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUsCisgICAgICBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxDR0Z1bmN0aW9uSW5mbywgQ0dGdW5jdGlvbkluZm9BcmdJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFBhcmFtZXRlckluZm8+IHsKKyAgdHlwZWRlZiBDR0Z1bmN0aW9uSW5mb0FyZ0luZm8gQXJnSW5mbzsKKyAgdHlwZWRlZiBGdW5jdGlvblByb3RvVHlwZTo6RXh0UGFyYW1ldGVySW5mbyBFeHRQYXJhbWV0ZXJJbmZvOworCisgIC8vLyBUaGUgTExWTTo6Q2FsbGluZ0NvbnYgdG8gdXNlIGZvciB0aGlzIGZ1bmN0aW9uIChhcyBzcGVjaWZpZWQgYnkgdGhlCisgIC8vLyB1c2VyKS4KKyAgdW5zaWduZWQgQ2FsbGluZ0NvbnZlbnRpb24gOiA4OworCisgIC8vLyBUaGUgTExWTTo6Q2FsbGluZ0NvbnYgdG8gYWN0dWFsbHkgdXNlIGZvciB0aGlzIGZ1bmN0aW9uLCB3aGljaCBtYXkKKyAgLy8vIGRlcGVuZCBvbiB0aGUgQUJJLgorICB1bnNpZ25lZCBFZmZlY3RpdmVDYWxsaW5nQ29udmVudGlvbiA6IDg7CisKKyAgLy8vIFRoZSBjbGFuZzo6Q2FsbGluZ0NvbnYgdGhhdCB0aGlzIHdhcyBvcmlnaW5hbGx5IGNyZWF0ZWQgd2l0aC4KKyAgdW5zaWduZWQgQVNUQ2FsbGluZ0NvbnZlbnRpb24gOiA2OworCisgIC8vLyBXaGV0aGVyIHRoaXMgaXMgYW4gaW5zdGFuY2UgbWV0aG9kLgorICB1bnNpZ25lZCBJbnN0YW5jZU1ldGhvZCA6IDE7CisKKyAgLy8vIFdoZXRoZXIgdGhpcyBpcyBhIGNoYWluIGNhbGwuCisgIHVuc2lnbmVkIENoYWluQ2FsbCA6IDE7CisKKyAgLy8vIFdoZXRoZXIgdGhpcyBmdW5jdGlvbiBpcyBub3JldHVybi4KKyAgdW5zaWduZWQgTm9SZXR1cm4gOiAxOworCisgIC8vLyBXaGV0aGVyIHRoaXMgZnVuY3Rpb24gaXMgcmV0dXJucy1yZXRhaW5lZC4KKyAgdW5zaWduZWQgUmV0dXJuc1JldGFpbmVkIDogMTsKKworICAvLy8gV2hldGhlciB0aGlzIGZ1bmN0aW9uIHNhdmVkIGNhbGxlciByZWdpc3RlcnMuCisgIHVuc2lnbmVkIE5vQ2FsbGVyU2F2ZWRSZWdzIDogMTsKKworICAvLy8gSG93IG1hbnkgYXJndW1lbnRzIHRvIHBhc3MgaW5yZWcuCisgIHVuc2lnbmVkIEhhc1JlZ1Bhcm0gOiAxOworICB1bnNpZ25lZCBSZWdQYXJtIDogMzsKKworICAvLy8gV2hldGhlciB0aGlzIGZ1bmN0aW9uIGhhcyBub2NmX2NoZWNrIGF0dHJpYnV0ZS4KKyAgdW5zaWduZWQgTm9DZkNoZWNrIDogMTsKKworICBSZXF1aXJlZEFyZ3MgUmVxdWlyZWQ7CisKKyAgLy8vIFRoZSBzdHJ1Y3QgcmVwcmVzZW50aW5nIGFsbCBhcmd1bWVudHMgcGFzc2VkIGluIG1lbW9yeS4gIE9ubHkgdXNlZCB3aGVuCisgIC8vLyBwYXNzaW5nIG5vbi10cml2aWFsIHR5cGVzIHdpdGggaW5hbGxvY2EuICBOb3QgcGFydCBvZiB0aGUgcHJvZmlsZS4KKyAgbGx2bTo6U3RydWN0VHlwZSAqQXJnU3RydWN0OworICB1bnNpZ25lZCBBcmdTdHJ1Y3RBbGlnbiA6IDMxOworICB1bnNpZ25lZCBIYXNFeHRQYXJhbWV0ZXJJbmZvcyA6IDE7CisKKyAgdW5zaWduZWQgTnVtQXJnczsKKworICBBcmdJbmZvICpnZXRBcmdzQnVmZmVyKCkgeworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8QXJnSW5mbz4oKTsKKyAgfQorICBjb25zdCBBcmdJbmZvICpnZXRBcmdzQnVmZmVyKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8QXJnSW5mbz4oKTsKKyAgfQorCisgIEV4dFBhcmFtZXRlckluZm8gKmdldEV4dFBhcmFtZXRlckluZm9zQnVmZmVyKCkgeworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8RXh0UGFyYW1ldGVySW5mbz4oKTsKKyAgfQorICBjb25zdCBFeHRQYXJhbWV0ZXJJbmZvICpnZXRFeHRQYXJhbWV0ZXJJbmZvc0J1ZmZlcigpIGNvbnN0eworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8RXh0UGFyYW1ldGVySW5mbz4oKTsKKyAgfQorCisgIENHRnVuY3Rpb25JbmZvKCkgOiBSZXF1aXJlZChSZXF1aXJlZEFyZ3M6OkFsbCkge30KKworcHVibGljOgorICBzdGF0aWMgQ0dGdW5jdGlvbkluZm8gKmNyZWF0ZSh1bnNpZ25lZCBsbHZtQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5zdGFuY2VNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2hhaW5DYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvblR5cGU6OkV4dEluZm8gJmV4dEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4dFBhcmFtZXRlckluZm8+IHBhcmFtSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhblF1YWxUeXBlIHJlc3VsdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENhblF1YWxUeXBlPiBhcmdUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWRBcmdzIHJlcXVpcmVkKTsKKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqcCkgeyA6Om9wZXJhdG9yIGRlbGV0ZShwKTsgfQorCisgIC8vIEZyaWVuZGluZyBjbGFzcyBUcmFpbGluZ09iamVjdHMgaXMgYXBwYXJlbnRseSBub3QgZ29vZCBlbm91Z2ggZm9yIE1TVkMsCisgIC8vIHNvIHRoZXNlIGhhdmUgdG8gYmUgcHVibGljLgorICBmcmllbmQgY2xhc3MgVHJhaWxpbmdPYmplY3RzOworICBzaXplX3QgbnVtVHJhaWxpbmdPYmplY3RzKE92ZXJsb2FkVG9rZW48QXJnSW5mbz4pIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtQXJncyArIDE7CisgIH0KKyAgc2l6ZV90IG51bVRyYWlsaW5nT2JqZWN0cyhPdmVybG9hZFRva2VuPEV4dFBhcmFtZXRlckluZm8+KSBjb25zdCB7CisgICAgcmV0dXJuIChIYXNFeHRQYXJhbWV0ZXJJbmZvcyA/IE51bUFyZ3MgOiAwKTsKKyAgfQorCisgIHR5cGVkZWYgY29uc3QgQXJnSW5mbyAqY29uc3RfYXJnX2l0ZXJhdG9yOworICB0eXBlZGVmIEFyZ0luZm8gKmFyZ19pdGVyYXRvcjsKKworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGFyZ19pdGVyYXRvcj4gYXJnX3JhbmdlOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGNvbnN0X2FyZ19pdGVyYXRvcj4gYXJnX2NvbnN0X3JhbmdlOworCisgIGFyZ19yYW5nZSBhcmd1bWVudHMoKSB7IHJldHVybiBhcmdfcmFuZ2UoYXJnX2JlZ2luKCksIGFyZ19lbmQoKSk7IH0KKyAgYXJnX2NvbnN0X3JhbmdlIGFyZ3VtZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gYXJnX2NvbnN0X3JhbmdlKGFyZ19iZWdpbigpLCBhcmdfZW5kKCkpOworICB9CisKKyAgY29uc3RfYXJnX2l0ZXJhdG9yIGFyZ19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGdldEFyZ3NCdWZmZXIoKSArIDE7IH0KKyAgY29uc3RfYXJnX2l0ZXJhdG9yIGFyZ19lbmQoKSBjb25zdCB7IHJldHVybiBnZXRBcmdzQnVmZmVyKCkgKyAxICsgTnVtQXJnczsgfQorICBhcmdfaXRlcmF0b3IgYXJnX2JlZ2luKCkgeyByZXR1cm4gZ2V0QXJnc0J1ZmZlcigpICsgMTsgfQorICBhcmdfaXRlcmF0b3IgYXJnX2VuZCgpIHsgcmV0dXJuIGdldEFyZ3NCdWZmZXIoKSArIDEgKyBOdW1BcmdzOyB9CisKKyAgdW5zaWduZWQgIGFyZ19zaXplKCkgY29uc3QgeyByZXR1cm4gTnVtQXJnczsgfQorCisgIGJvb2wgaXNWYXJpYWRpYygpIGNvbnN0IHsgcmV0dXJuIFJlcXVpcmVkLmFsbG93c09wdGlvbmFsQXJncygpOyB9CisgIFJlcXVpcmVkQXJncyBnZXRSZXF1aXJlZEFyZ3MoKSBjb25zdCB7IHJldHVybiBSZXF1aXJlZDsgfQorICB1bnNpZ25lZCBnZXROdW1SZXF1aXJlZEFyZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzVmFyaWFkaWMoKSA/IGdldFJlcXVpcmVkQXJncygpLmdldE51bVJlcXVpcmVkQXJncygpIDogYXJnX3NpemUoKTsKKyAgfQorCisgIGJvb2wgaXNJbnN0YW5jZU1ldGhvZCgpIGNvbnN0IHsgcmV0dXJuIEluc3RhbmNlTWV0aG9kOyB9CisKKyAgYm9vbCBpc0NoYWluQ2FsbCgpIGNvbnN0IHsgcmV0dXJuIENoYWluQ2FsbDsgfQorCisgIGJvb2wgaXNOb1JldHVybigpIGNvbnN0IHsgcmV0dXJuIE5vUmV0dXJuOyB9CisKKyAgLy8vIEluIEFSQywgd2hldGhlciB0aGlzIGZ1bmN0aW9uIHJldGFpbnMgaXRzIHJldHVybiB2YWx1ZS4gIFRoaXMKKyAgLy8vIGlzIG5vdCBhbHdheXMgcmVsaWFibGUgZm9yIGNhbGwgc2l0ZXMuCisgIGJvb2wgaXNSZXR1cm5zUmV0YWluZWQoKSBjb25zdCB7IHJldHVybiBSZXR1cm5zUmV0YWluZWQ7IH0KKworICAvLy8gV2hldGhlciB0aGlzIGZ1bmN0aW9uIG5vIGxvbmdlciBzYXZlcyBjYWxsZXIgcmVnaXN0ZXJzLgorICBib29sIGlzTm9DYWxsZXJTYXZlZFJlZ3MoKSBjb25zdCB7IHJldHVybiBOb0NhbGxlclNhdmVkUmVnczsgfQorCisgIC8vLyBXaGV0aGVyIHRoaXMgZnVuY3Rpb24gaGFzIG5vY2ZfY2hlY2sgYXR0cmlidXRlLgorICBib29sIGlzTm9DZkNoZWNrKCkgY29uc3QgeyByZXR1cm4gTm9DZkNoZWNrOyB9CisKKyAgLy8vIGdldEFTVENhbGxpbmdDb252ZW50aW9uKCkgLSBSZXR1cm4gdGhlIEFTVC1zcGVjaWZpZWQgY2FsbGluZworICAvLy8gY29udmVudGlvbi4KKyAgQ2FsbGluZ0NvbnYgZ2V0QVNUQ2FsbGluZ0NvbnZlbnRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIENhbGxpbmdDb252KEFTVENhbGxpbmdDb252ZW50aW9uKTsKKyAgfQorCisgIC8vLyBnZXRDYWxsaW5nQ29udmVudGlvbiAtIFJldHVybiB0aGUgdXNlciBzcGVjaWZpZWQgY2FsbGluZworICAvLy8gY29udmVudGlvbiwgd2hpY2ggaGFzIGJlZW4gdHJhbnNsYXRlZCBpbnRvIGFuIExMVk0gQ0MuCisgIHVuc2lnbmVkIGdldENhbGxpbmdDb252ZW50aW9uKCkgY29uc3QgeyByZXR1cm4gQ2FsbGluZ0NvbnZlbnRpb247IH0KKworICAvLy8gZ2V0RWZmZWN0aXZlQ2FsbGluZ0NvbnZlbnRpb24gLSBSZXR1cm4gdGhlIGFjdHVhbCBjYWxsaW5nIGNvbnZlbnRpb24gdG8KKyAgLy8vIHVzZSwgd2hpY2ggbWF5IGRlcGVuZCBvbiB0aGUgQUJJLgorICB1bnNpZ25lZCBnZXRFZmZlY3RpdmVDYWxsaW5nQ29udmVudGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gRWZmZWN0aXZlQ2FsbGluZ0NvbnZlbnRpb247CisgIH0KKyAgdm9pZCBzZXRFZmZlY3RpdmVDYWxsaW5nQ29udmVudGlvbih1bnNpZ25lZCBWYWx1ZSkgeworICAgIEVmZmVjdGl2ZUNhbGxpbmdDb252ZW50aW9uID0gVmFsdWU7CisgIH0KKworICBib29sIGdldEhhc1JlZ1Bhcm0oKSBjb25zdCB7IHJldHVybiBIYXNSZWdQYXJtOyB9CisgIHVuc2lnbmVkIGdldFJlZ1Bhcm0oKSBjb25zdCB7IHJldHVybiBSZWdQYXJtOyB9CisKKyAgRnVuY3Rpb25UeXBlOjpFeHRJbmZvIGdldEV4dEluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbyhpc05vUmV0dXJuKCksIGdldEhhc1JlZ1Bhcm0oKSwgZ2V0UmVnUGFybSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QVNUQ2FsbGluZ0NvbnZlbnRpb24oKSwgaXNSZXR1cm5zUmV0YWluZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTm9DYWxsZXJTYXZlZFJlZ3MoKSwgaXNOb0NmQ2hlY2soKSk7CisgIH0KKworICBDYW5RdWFsVHlwZSBnZXRSZXR1cm5UeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0QXJnc0J1ZmZlcigpWzBdLnR5cGU7IH0KKworICBBQklBcmdJbmZvICZnZXRSZXR1cm5JbmZvKCkgeyByZXR1cm4gZ2V0QXJnc0J1ZmZlcigpWzBdLmluZm87IH0KKyAgY29uc3QgQUJJQXJnSW5mbyAmZ2V0UmV0dXJuSW5mbygpIGNvbnN0IHsgcmV0dXJuIGdldEFyZ3NCdWZmZXIoKVswXS5pbmZvOyB9CisKKyAgQXJyYXlSZWY8RXh0UGFyYW1ldGVySW5mbz4gZ2V0RXh0UGFyYW1ldGVySW5mb3MoKSBjb25zdCB7CisgICAgaWYgKCFIYXNFeHRQYXJhbWV0ZXJJbmZvcykgcmV0dXJuIHt9OworICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoZ2V0RXh0UGFyYW1ldGVySW5mb3NCdWZmZXIoKSwgTnVtQXJncyk7CisgIH0KKyAgRXh0UGFyYW1ldGVySW5mbyBnZXRFeHRQYXJhbWV0ZXJJbmZvKHVuc2lnbmVkIGFyZ0luZGV4KSBjb25zdCB7CisgICAgYXNzZXJ0KGFyZ0luZGV4IDw9IE51bUFyZ3MpOworICAgIGlmICghSGFzRXh0UGFyYW1ldGVySW5mb3MpIHJldHVybiBFeHRQYXJhbWV0ZXJJbmZvKCk7CisgICAgcmV0dXJuIGdldEV4dFBhcmFtZXRlckluZm9zKClbYXJnSW5kZXhdOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIHVzZXMgaW5hbGxvY2EgYXJndW1lbnRzLgorICBib29sIHVzZXNJbkFsbG9jYSgpIGNvbnN0IHsgcmV0dXJuIEFyZ1N0cnVjdDsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBzdHJ1Y3QgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCBhbGwgdGhlIGFyZ3VtZW50cyBpbiBtZW1vcnkuCisgIGxsdm06OlN0cnVjdFR5cGUgKmdldEFyZ1N0cnVjdCgpIGNvbnN0IHsgcmV0dXJuIEFyZ1N0cnVjdDsgfQorICBDaGFyVW5pdHMgZ2V0QXJnU3RydWN0QWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBDaGFyVW5pdHM6OmZyb21RdWFudGl0eShBcmdTdHJ1Y3RBbGlnbik7CisgIH0KKyAgdm9pZCBzZXRBcmdTdHJ1Y3QobGx2bTo6U3RydWN0VHlwZSAqVHksIENoYXJVbml0cyBBbGlnbikgeworICAgIEFyZ1N0cnVjdCA9IFR5OworICAgIEFyZ1N0cnVjdEFsaWduID0gQWxpZ24uZ2V0UXVhbnRpdHkoKTsKKyAgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIElELkFkZEludGVnZXIoZ2V0QVNUQ2FsbGluZ0NvbnZlbnRpb24oKSk7CisgICAgSUQuQWRkQm9vbGVhbihJbnN0YW5jZU1ldGhvZCk7CisgICAgSUQuQWRkQm9vbGVhbihDaGFpbkNhbGwpOworICAgIElELkFkZEJvb2xlYW4oTm9SZXR1cm4pOworICAgIElELkFkZEJvb2xlYW4oUmV0dXJuc1JldGFpbmVkKTsKKyAgICBJRC5BZGRCb29sZWFuKE5vQ2FsbGVyU2F2ZWRSZWdzKTsKKyAgICBJRC5BZGRCb29sZWFuKEhhc1JlZ1Bhcm0pOworICAgIElELkFkZEludGVnZXIoUmVnUGFybSk7CisgICAgSUQuQWRkQm9vbGVhbihOb0NmQ2hlY2spOworICAgIElELkFkZEludGVnZXIoUmVxdWlyZWQuZ2V0T3BhcXVlRGF0YSgpKTsKKyAgICBJRC5BZGRCb29sZWFuKEhhc0V4dFBhcmFtZXRlckluZm9zKTsKKyAgICBpZiAoSGFzRXh0UGFyYW1ldGVySW5mb3MpIHsKKyAgICAgIGZvciAoYXV0byBwYXJhbUluZm8gOiBnZXRFeHRQYXJhbWV0ZXJJbmZvcygpKQorICAgICAgICBJRC5BZGRJbnRlZ2VyKHBhcmFtSW5mby5nZXRPcGFxdWVWYWx1ZSgpKTsKKyAgICB9CisgICAgZ2V0UmV0dXJuVHlwZSgpLlByb2ZpbGUoSUQpOworICAgIGZvciAoY29uc3QgYXV0byAmSSA6IGFyZ3VtZW50cygpKQorICAgICAgSS50eXBlLlByb2ZpbGUoSUQpOworICB9CisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbnN0YW5jZU1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIENoYWluQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvblR5cGU6OkV4dEluZm8gJmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXh0UGFyYW1ldGVySW5mbz4gcGFyYW1JbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZEFyZ3MgcmVxdWlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgQ2FuUXVhbFR5cGUgcmVzdWx0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDYW5RdWFsVHlwZT4gYXJnVHlwZXMpIHsKKyAgICBJRC5BZGRJbnRlZ2VyKGluZm8uZ2V0Q0MoKSk7CisgICAgSUQuQWRkQm9vbGVhbihJbnN0YW5jZU1ldGhvZCk7CisgICAgSUQuQWRkQm9vbGVhbihDaGFpbkNhbGwpOworICAgIElELkFkZEJvb2xlYW4oaW5mby5nZXROb1JldHVybigpKTsKKyAgICBJRC5BZGRCb29sZWFuKGluZm8uZ2V0UHJvZHVjZXNSZXN1bHQoKSk7CisgICAgSUQuQWRkQm9vbGVhbihpbmZvLmdldE5vQ2FsbGVyU2F2ZWRSZWdzKCkpOworICAgIElELkFkZEJvb2xlYW4oaW5mby5nZXRIYXNSZWdQYXJtKCkpOworICAgIElELkFkZEludGVnZXIoaW5mby5nZXRSZWdQYXJtKCkpOworICAgIElELkFkZEJvb2xlYW4oaW5mby5nZXROb0NmQ2hlY2soKSk7CisgICAgSUQuQWRkSW50ZWdlcihyZXF1aXJlZC5nZXRPcGFxdWVEYXRhKCkpOworICAgIElELkFkZEJvb2xlYW4oIXBhcmFtSW5mb3MuZW1wdHkoKSk7CisgICAgaWYgKCFwYXJhbUluZm9zLmVtcHR5KCkpIHsKKyAgICAgIGZvciAoYXV0byBwYXJhbUluZm8gOiBwYXJhbUluZm9zKQorICAgICAgICBJRC5BZGRJbnRlZ2VyKHBhcmFtSW5mby5nZXRPcGFxdWVWYWx1ZSgpKTsKKyAgICB9CisgICAgcmVzdWx0VHlwZS5Qcm9maWxlKElEKTsKKyAgICBmb3IgKEFycmF5UmVmPENhblF1YWxUeXBlPjo6aXRlcmF0b3IKKyAgICAgICAgICAgaSA9IGFyZ1R5cGVzLmJlZ2luKCksIGUgPSBhcmdUeXBlcy5lbmQoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGktPlByb2ZpbGUoSUQpOworICAgIH0KKyAgfQorfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBDb2RlR2VuCit9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9Db2RlR2VuQUJJVHlwZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0NvZGVHZW4vQ29kZUdlbkFCSVR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2MTlmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0NvZGVHZW4vQ29kZUdlbkFCSVR5cGVzLmgKQEAgLTAsMCArMSw5MSBAQAorLy89PS0tLS0gQ29kZUdlbkFCSVR5cGVzLmggLSBDb252ZXJ0IENsYW5nIHR5cGVzIHRvIExMVk0gdHlwZXMgZm9yIEFCSSAtLS0tLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDb2RlR2VuQUJJVHlwZXMgaXMgYSBzaW1wbGUgaW50ZXJmYWNlIGZvciBnZXR0aW5nIExMVk0gdHlwZXMgZm9yCisvLyB0aGUgcGFyYW1ldGVycyBhbmQgdGhlIHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uIGdpdmVuIHRoZSBDbGFuZworLy8gdHlwZXMuCisvLworLy8gVGhlIGNsYXNzIGlzIGltcGxlbWVudGVkIGFzIGEgcHVibGljIHdyYXBwZXIgYXJvdW5kIHRoZSBwcml2YXRlCisvLyBDb2RlR2VuVHlwZXMgY2xhc3MgaW4gbGliL0NvZGVHZW4uCisvLworLy8gSXQgYWxsb3dzIG90aGVyIGNsaWVudHMsIGxpa2UgTExEQiwgdG8gZGV0ZXJtaW5lIHRoZSBMTFZNIHR5cGVzIHRoYXQgYXJlCisvLyBhY3R1YWxseSB1c2VkIGluIGZ1bmN0aW9uIGNhbGxzLCB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0byB0aGVuIGRldGVybWluZQorLy8gdGhlIGFjdHVhbCBBQkkgbG9jYXRpb25zIChlLmcuIHJlZ2lzdGVycywgc3RhY2sgbG9jYXRpb25zLCBldGMuKSB0aGF0CisvLyB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBzdG9yZWQgaW4uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0NPREVHRU5fQ09ERUdFTkFCSVRZUEVTX0gKKyNkZWZpbmUgTExWTV9DTEFOR19DT0RFR0VOX0NPREVHRU5BQklUWVBFU19ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvQ2Fub25pY2FsVHlwZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvQ29kZUdlbi9DR0Z1bmN0aW9uSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIERhdGFMYXlvdXQ7CisgIGNsYXNzIE1vZHVsZTsKKyAgY2xhc3MgRnVuY3Rpb25UeXBlOworICBjbGFzcyBUeXBlOworfQorCituYW1lc3BhY2UgY2xhbmcgeworY2xhc3MgQVNUQ29udGV4dDsKK2NsYXNzIENYWFJlY29yZERlY2w7CitjbGFzcyBDWFhNZXRob2REZWNsOworY2xhc3MgQ29kZUdlbk9wdGlvbnM7CitjbGFzcyBDb3ZlcmFnZVNvdXJjZUluZm87CitjbGFzcyBEaWFnbm9zdGljc0VuZ2luZTsKK2NsYXNzIEhlYWRlclNlYXJjaE9wdGlvbnM7CitjbGFzcyBPYmpDTWV0aG9kRGVjbDsKK2NsYXNzIFByZXByb2Nlc3Nvck9wdGlvbnM7CisKK25hbWVzcGFjZSBDb2RlR2VuIHsKK2NsYXNzIENHRnVuY3Rpb25JbmZvOworY2xhc3MgQ29kZUdlbk1vZHVsZTsKKworY29uc3QgQ0dGdW5jdGlvbkluZm8gJmFycmFuZ2VPYmpDTWVzc2FnZVNlbmRTaWduYXR1cmUoQ29kZUdlbk1vZHVsZSAmQ0dNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ01ldGhvZERlY2wgKk1ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgcmVjZWl2ZXJUeXBlKTsKKworY29uc3QgQ0dGdW5jdGlvbkluZm8gJmFycmFuZ2VGcmVlRnVuY3Rpb25UeXBlKENvZGVHZW5Nb2R1bGUgJkNHTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5RdWFsPEZ1bmN0aW9uUHJvdG9UeXBlPiBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkZEKTsKKworY29uc3QgQ0dGdW5jdGlvbkluZm8gJmFycmFuZ2VGcmVlRnVuY3Rpb25UeXBlKENvZGVHZW5Nb2R1bGUgJkNHTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5RdWFsPEZ1bmN0aW9uTm9Qcm90b1R5cGU+IFR5KTsKKworY29uc3QgQ0dGdW5jdGlvbkluZm8gJmFycmFuZ2VDWFhNZXRob2RUeXBlKENvZGVHZW5Nb2R1bGUgJkNHTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWE1ldGhvZERlY2wgKk1EKTsKKworY29uc3QgQ0dGdW5jdGlvbkluZm8gJmFycmFuZ2VGcmVlRnVuY3Rpb25DYWxsKENvZGVHZW5Nb2R1bGUgJkNHTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5RdWFsVHlwZSByZXR1cm5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENhblF1YWxUeXBlPiBhcmdUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblR5cGU6OkV4dEluZm8gaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZEFyZ3MgYXJncyk7CisKKy8vLyBSZXR1cm5zIG51bGwgaWYgdGhlIGZ1bmN0aW9uIHR5cGUgaXMgaW5jb21wbGV0ZSBhbmQgY2FuJ3QgYmUgbG93ZXJlZC4KK2xsdm06OkZ1bmN0aW9uVHlwZSAqY29udmVydEZyZWVGdW5jdGlvblR5cGUoQ29kZUdlbk1vZHVsZSAmQ0dNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkZEKTsKKworbGx2bTo6VHlwZSAqY29udmVydFR5cGVGb3JNZW1vcnkoQ29kZUdlbk1vZHVsZSAmQ0dNLCBRdWFsVHlwZSBUKTsKKworLy8vIEdpdmVuIGEgbm9uLWJpdGZpZWxkIHN0cnVjdCBmaWVsZCwgcmV0dXJuIGl0cyBpbmRleCB3aXRoaW4gdGhlIGVsZW1lbnRzIG9mCisvLy8gdGhlIHN0cnVjdCdzIGNvbnZlcnRlZCB0eXBlLiAgVGhlIHJldHVybmVkIGluZGV4IHJlZmVycyB0byBhIGZpZWxkIG51bWJlciBpbgorLy8vIHRoZSBjb21wbGV0ZSBvYmplY3QgdHlwZSB3aGljaCBpcyByZXR1cm5lZCBieSBjb252ZXJ0VHlwZUZvck1lbW9yeS4gIEZEIG11c3QKKy8vLyBiZSBhIGZpZWxkIGluIFJEIGRpcmVjdGx5IChpLmUuIG5vdCBhbiBpbmhlcml0ZWQgZmllbGQpLgordW5zaWduZWQgZ2V0TExWTUZpZWxkTnVtYmVyKENvZGVHZW5Nb2R1bGUgJkNHTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWNvcmREZWNsICpSRCwgY29uc3QgRmllbGREZWNsICpGRCk7CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgQ29kZUdlbgorfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0NvZGVHZW4vQ29kZUdlbkFjdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9Db2RlR2VuQWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExOGE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0NvZGVHZW4vQ29kZUdlbkFjdGlvbi5oCkBAIC0wLDAgKzEsMTIyIEBACisvLz09PS0tLSBDb2RlR2VuQWN0aW9uLmggLSBMTFZNIENvZGUgR2VuZXJhdGlvbiBGcm9udGVuZCBBY3Rpb24gLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQ09ERUdFTl9DT0RFR0VOQUNUSU9OX0gKKyNkZWZpbmUgTExWTV9DTEFOR19DT0RFR0VOX0NPREVHRU5BQ1RJT05fSAorCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb24uaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTExWTUNvbnRleHQ7CisgIGNsYXNzIE1vZHVsZTsKK30KKworbmFtZXNwYWNlIGNsYW5nIHsKK2NsYXNzIEJhY2tlbmRDb25zdW1lcjsKKworY2xhc3MgQ29kZUdlbkFjdGlvbiA6IHB1YmxpYyBBU1RGcm9udGVuZEFjdGlvbiB7Citwcml2YXRlOgorICAvLyBMZXQgQmFja2VuZENvbnN1bWVyIGFjY2VzcyBMaW5rTW9kdWxlLgorICBmcmllbmQgY2xhc3MgQmFja2VuZENvbnN1bWVyOworCisgIC8vLyBJbmZvIGFib3V0IG1vZHVsZSB0byBsaW5rIGludG8gYSBtb2R1bGUgd2UncmUgZ2VuZXJhdGluZy4KKyAgc3RydWN0IExpbmtNb2R1bGUgeworICAgIC8vLyBUaGUgbW9kdWxlIHRvIGxpbmsgaW4uCisgICAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1vZHVsZT4gTW9kdWxlOworCisgICAgLy8vIElmIHRydWUsIHdlIHNldCBhdHRyaWJ1dGVzIG9uIE1vZHVsZSdzIGZ1bmN0aW9ucyBhY2NvcmRpbmcgdG8gb3VyCisgICAgLy8vIENvZGVHZW5PcHRpb25zIGFuZCBMYW5nT3B0aW9ucywgYXMgdGhvdWdoIHdlIHdlcmUgZ2VuZXJhdGluZyB0aGUKKyAgICAvLy8gZnVuY3Rpb24gb3Vyc2VsdmVzLgorICAgIGJvb2wgUHJvcGFnYXRlQXR0cnM7CisKKyAgICAvLy8gSWYgdHJ1ZSwgd2UgdXNlIExMVk0gbW9kdWxlIGludGVybmFsaXplci4KKyAgICBib29sIEludGVybmFsaXplOworCisgICAgLy8vIEJpdHdpc2UgY29tYmluYXRpb24gb2YgbGx2bTo6TGlua2VyRmxhZ3MgdXNlZCB3aGVuIHdlIGxpbmsgdGhlIG1vZHVsZS4KKyAgICB1bnNpZ25lZCBMaW5rRmxhZ3M7CisgIH07CisKKyAgdW5zaWduZWQgQWN0OworICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TW9kdWxlPiBUaGVNb2R1bGU7CisKKyAgLy8vIEJpdGNvZGUgbW9kdWxlcyB0byBsaW5rIGluIHRvIG91ciBtb2R1bGUuCisgIFNtYWxsVmVjdG9yPExpbmtNb2R1bGUsIDQ+IExpbmtNb2R1bGVzOworICBsbHZtOjpMTFZNQ29udGV4dCAqVk1Db250ZXh0OworICBib29sIE93bnNWTUNvbnRleHQ7CisKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1vZHVsZT4gbG9hZE1vZHVsZShsbHZtOjpNZW1vcnlCdWZmZXJSZWYgTUJSZWYpOworCitwcm90ZWN0ZWQ6CisgIC8vLyBDcmVhdGUgYSBuZXcgY29kZSBnZW5lcmF0aW9uIGFjdGlvbi4gIElmIHRoZSBvcHRpb25hbCBccCBfVk1Db250ZXh0CisgIC8vLyBwYXJhbWV0ZXIgaXMgc3VwcGxpZWQsIHRoZSBhY3Rpb24gdXNlcyBpdCB3aXRob3V0IHRha2luZyBvd25lcnNoaXAsCisgIC8vLyBvdGhlcndpc2UgaXQgY3JlYXRlcyBhIGZyZXNoIExMVk0gY29udGV4dCBhbmQgdGFrZXMgb3duZXJzaGlwLgorICBDb2RlR2VuQWN0aW9uKHVuc2lnbmVkIF9BY3QsIGxsdm06OkxMVk1Db250ZXh0ICpfVk1Db250ZXh0ID0gbnVsbHB0cik7CisKKyAgYm9vbCBoYXNJUlN1cHBvcnQoKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8QVNUQ29uc3VtZXI+IENyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIG92ZXJyaWRlOworCisgIHZvaWQgRXhlY3V0ZUFjdGlvbigpIG92ZXJyaWRlOworCisgIHZvaWQgRW5kU291cmNlRmlsZUFjdGlvbigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIH5Db2RlR2VuQWN0aW9uKCkgb3ZlcnJpZGU7CisKKyAgLy8vIFRha2UgdGhlIGdlbmVyYXRlZCBMTFZNIG1vZHVsZSwgZm9yIHVzZSBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIHJ1bi4KKyAgLy8vIFRoZSByZXN1bHQgbWF5IGJlIG51bGwgb24gZmFpbHVyZS4KKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1vZHVsZT4gdGFrZU1vZHVsZSgpOworCisgIC8vLyBUYWtlIHRoZSBMTFZNIGNvbnRleHQgdXNlZCBieSB0aGlzIGFjdGlvbi4KKyAgbGx2bTo6TExWTUNvbnRleHQgKnRha2VMTFZNQ29udGV4dCgpOworCisgIEJhY2tlbmRDb25zdW1lciAqQkVDb25zdW1lcjsKK307CisKK2NsYXNzIEVtaXRBc3NlbWJseUFjdGlvbiA6IHB1YmxpYyBDb2RlR2VuQWN0aW9uIHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworcHVibGljOgorICBFbWl0QXNzZW1ibHlBY3Rpb24obGx2bTo6TExWTUNvbnRleHQgKl9WTUNvbnRleHQgPSBudWxscHRyKTsKK307CisKK2NsYXNzIEVtaXRCQ0FjdGlvbiA6IHB1YmxpYyBDb2RlR2VuQWN0aW9uIHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworcHVibGljOgorICBFbWl0QkNBY3Rpb24obGx2bTo6TExWTUNvbnRleHQgKl9WTUNvbnRleHQgPSBudWxscHRyKTsKK307CisKK2NsYXNzIEVtaXRMTFZNQWN0aW9uIDogcHVibGljIENvZGVHZW5BY3Rpb24geworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CitwdWJsaWM6CisgIEVtaXRMTFZNQWN0aW9uKGxsdm06OkxMVk1Db250ZXh0ICpfVk1Db250ZXh0ID0gbnVsbHB0cik7Cit9OworCitjbGFzcyBFbWl0TExWTU9ubHlBY3Rpb24gOiBwdWJsaWMgQ29kZUdlbkFjdGlvbiB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKK3B1YmxpYzoKKyAgRW1pdExMVk1Pbmx5QWN0aW9uKGxsdm06OkxMVk1Db250ZXh0ICpfVk1Db250ZXh0ID0gbnVsbHB0cik7Cit9OworCitjbGFzcyBFbWl0Q29kZUdlbk9ubHlBY3Rpb24gOiBwdWJsaWMgQ29kZUdlbkFjdGlvbiB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKK3B1YmxpYzoKKyAgRW1pdENvZGVHZW5Pbmx5QWN0aW9uKGxsdm06OkxMVk1Db250ZXh0ICpfVk1Db250ZXh0ID0gbnVsbHB0cik7Cit9OworCitjbGFzcyBFbWl0T2JqQWN0aW9uIDogcHVibGljIENvZGVHZW5BY3Rpb24geworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CitwdWJsaWM6CisgIEVtaXRPYmpBY3Rpb24obGx2bTo6TExWTUNvbnRleHQgKl9WTUNvbnRleHQgPSBudWxscHRyKTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Db2RlR2VuL0NvbnN0YW50SW5pdEJ1aWxkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0NvZGVHZW4vQ29uc3RhbnRJbml0QnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMzg4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Db2RlR2VuL0NvbnN0YW50SW5pdEJ1aWxkZXIuaApAQCAtMCwwICsxLDU2MSBAQAorLy89PT0tIENvbnN0YW50SW5pdEJ1aWxkZXIuaCAtIEJ1aWxkZXIgZm9yIExMVk0gSVIgY29uc3RhbnRzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgY29udmVuaWVudCBpbnRlcmZhY2UgZm9yIGJ1aWxkaW5nIGNvbXBsZXgKKy8vIGdsb2JhbCBpbml0aWFsaXplcnMgb2YgdGhlIHNvcnQgdGhhdCBhcmUgZnJlcXVlbnRseSByZXF1aXJlZCBmb3IKKy8vIGxhbmd1YWdlIEFCSXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0NPREVHRU5fQ09OU1RBTlRJTklUQlVJTERFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQ09ERUdFTl9DT05TVEFOVElOSVRCVUlMREVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFsdWUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvQ2hhclVuaXRzLmgiCisjaW5jbHVkZSAiY2xhbmcvQ29kZUdlbi9Db25zdGFudEluaXRGdXR1cmUuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBDb2RlR2VuIHsKKworY2xhc3MgQ29kZUdlbk1vZHVsZTsKKworLy8vIEEgY29udmVuaWVuY2UgYnVpbGRlciBjbGFzcyBmb3IgY29tcGxleCBjb25zdGFudCBpbml0aWFsaXplcnMsCisvLy8gZXNwZWNpYWxseSBmb3IgYW5vbnltb3VzIGdsb2JhbCBzdHJ1Y3R1cmVzIHVzZWQgYnkgdmFyaW91cyBsYW5ndWFnZQorLy8vIHJ1bnRpbWVzLgorLy8vCisvLy8gVGhlIGJhc2ljIHVzYWdlIHBhdHRlcm4gaXMgZXhwZWN0ZWQgdG8gYmUgc29tZXRoaW5nIGxpa2U6CisvLy8gICAgQ29uc3RhbnRJbml0QnVpbGRlciBidWlsZGVyKENHTSk7CisvLy8gICAgYXV0byB0b3BsZXZlbCA9IGJ1aWxkZXIuYmVnaW5TdHJ1Y3QoKTsKKy8vLyAgICB0b3BsZXZlbC5hZGRJbnQoQ0dNLlNpemVUeSwgd2lkZ2V0cy5zaXplKCkpOworLy8vICAgIGF1dG8gd2lkZ2V0QXJyYXkgPSBidWlsZGVyLmJlZ2luQXJyYXkoKTsKKy8vLyAgICBmb3IgKGF1dG8gJndpZGdldCA6IHdpZGdldHMpIHsKKy8vLyAgICAgIGF1dG8gd2lkZ2V0RGVzYyA9IHdpZGdldEFycmF5LmJlZ2luU3RydWN0KCk7CisvLy8gICAgICB3aWRnZXREZXNjLmFkZEludChDR00uU2l6ZVR5LCB3aWRnZXQuZ2V0UG93ZXIoKSk7CisvLy8gICAgICB3aWRnZXREZXNjLmFkZChDR00uR2V0QWRkck9mQ29uc3RhbnRTdHJpbmcod2lkZ2V0LmdldE5hbWUoKSkpOworLy8vICAgICAgd2lkZ2V0RGVzYy5hZGQoQ0dNLkdldEFkZHJPZkdsb2JhbCh3aWRnZXQuZ2V0SW5pdGlhbGl6ZXJEZWNsKCkpKTsKKy8vLyAgICAgIHdpZGdldERlc2MuZmluaXNoQW5kQWRkVG8od2lkZ2V0QXJyYXkpOworLy8vICAgIH0KKy8vLyAgICB3aWRnZXRBcnJheS5maW5pc2hBbmRBZGRUbyh0b3BsZXZlbCk7CisvLy8gICAgYXV0byBnbG9iYWwgPSB0b3BsZXZlbC5maW5pc2hBbmRDcmVhdGVHbG9iYWwoIldJREdFVF9MSVNUIiwgQWxpZ24sCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb25zdGFudCovIHRydWUpOworY2xhc3MgQ29uc3RhbnRJbml0QnVpbGRlckJhc2UgeworICBzdHJ1Y3QgU2VsZlJlZmVyZW5jZSB7CisgICAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKkR1bW15OworICAgIGxsdm06OlNtYWxsVmVjdG9yPGxsdm06OkNvbnN0YW50KiwgND4gSW5kaWNlczsKKworICAgIFNlbGZSZWZlcmVuY2UobGx2bTo6R2xvYmFsVmFyaWFibGUgKmR1bW15KSA6IER1bW15KGR1bW15KSB7fQorICB9OworICBDb2RlR2VuTW9kdWxlICZDR007CisgIGxsdm06OlNtYWxsVmVjdG9yPGxsdm06OkNvbnN0YW50KiwgMTY+IEJ1ZmZlcjsKKyAgc3RkOjp2ZWN0b3I8U2VsZlJlZmVyZW5jZT4gU2VsZlJlZmVyZW5jZXM7CisgIGJvb2wgRnJvemVuID0gZmFsc2U7CisKKyAgZnJpZW5kIGNsYXNzIENvbnN0YW50SW5pdEZ1dHVyZTsKKyAgZnJpZW5kIGNsYXNzIENvbnN0YW50QWdncmVnYXRlQnVpbGRlckJhc2U7CisgIHRlbXBsYXRlIDxjbGFzcywgY2xhc3M+CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudEFnZ3JlZ2F0ZUJ1aWxkZXJUZW1wbGF0ZUJhc2U7CisKK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgQ29uc3RhbnRJbml0QnVpbGRlckJhc2UoQ29kZUdlbk1vZHVsZSAmQ0dNKSA6IENHTShDR00pIHt9CisKKyAgfkNvbnN0YW50SW5pdEJ1aWxkZXJCYXNlKCkgeworICAgIGFzc2VydChCdWZmZXIuZW1wdHkoKSAmJiAiZGlkbid0IGNsYWltIGFsbCB2YWx1ZXMgb3V0IG9mIGJ1ZmZlciIpOworICAgIGFzc2VydChTZWxmUmVmZXJlbmNlcy5lbXB0eSgpICYmICJkaWRuJ3QgYXBwbHkgYWxsIHNlbGYtcmVmZXJlbmNlcyIpOworICB9CisKK3ByaXZhdGU6CisgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpjcmVhdGVHbG9iYWwobGx2bTo6Q29uc3RhbnQgKmluaXRpYWxpemVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR3aW5lICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25zdGFudCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXMgbGlua2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsbHZtOjpHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFkZHJlc3NTcGFjZSA9IDApOworCisgIENvbnN0YW50SW5pdEZ1dHVyZSBjcmVhdGVGdXR1cmUobGx2bTo6Q29uc3RhbnQgKmluaXRpYWxpemVyKTsKKworICB2b2lkIHNldEdsb2JhbEluaXRpYWxpemVyKGxsdm06Okdsb2JhbFZhcmlhYmxlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpDb25zdGFudCAqaW5pdGlhbGl6ZXIpOworCisgIHZvaWQgcmVzb2x2ZVNlbGZSZWZlcmVuY2VzKGxsdm06Okdsb2JhbFZhcmlhYmxlICpHVik7CisKKyAgdm9pZCBhYmFuZG9uKHNpemVfdCBuZXdFbmQpOworfTsKKworLy8vIEEgY29uY3JldGUgYmFzZSBjbGFzcyBmb3Igc3RydWN0IGFuZCBhcnJheSBhZ2dyZWdhdGUKKy8vLyBpbml0aWFsaXplciBidWlsZGVycy4KK2NsYXNzIENvbnN0YW50QWdncmVnYXRlQnVpbGRlckJhc2UgeworcHJvdGVjdGVkOgorICBDb25zdGFudEluaXRCdWlsZGVyQmFzZSAmQnVpbGRlcjsKKyAgQ29uc3RhbnRBZ2dyZWdhdGVCdWlsZGVyQmFzZSAqUGFyZW50OworICBzaXplX3QgQmVnaW47CisgIG11dGFibGUgc2l6ZV90IENhY2hlZE9mZnNldEVuZCA9IDA7CisgIGJvb2wgRmluaXNoZWQgPSBmYWxzZTsKKyAgYm9vbCBGcm96ZW4gPSBmYWxzZTsKKyAgYm9vbCBQYWNrZWQgPSBmYWxzZTsKKyAgbXV0YWJsZSBDaGFyVW5pdHMgQ2FjaGVkT2Zmc2V0RnJvbUdsb2JhbDsKKworICBsbHZtOjpTbWFsbFZlY3RvckltcGw8bGx2bTo6Q29uc3RhbnQqPiAmZ2V0QnVmZmVyKCkgeworICAgIHJldHVybiBCdWlsZGVyLkJ1ZmZlcjsKKyAgfQorCisgIGNvbnN0IGxsdm06OlNtYWxsVmVjdG9ySW1wbDxsbHZtOjpDb25zdGFudCo+ICZnZXRCdWZmZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIEJ1aWxkZXIuQnVmZmVyOworICB9CisKKyAgQ29uc3RhbnRBZ2dyZWdhdGVCdWlsZGVyQmFzZShDb25zdGFudEluaXRCdWlsZGVyQmFzZSAmYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEFnZ3JlZ2F0ZUJ1aWxkZXJCYXNlICpwYXJlbnQpCisgICAgICA6IEJ1aWxkZXIoYnVpbGRlciksIFBhcmVudChwYXJlbnQpLCBCZWdpbihidWlsZGVyLkJ1ZmZlci5zaXplKCkpIHsKKyAgICBpZiAocGFyZW50KSB7CisgICAgICBhc3NlcnQoIXBhcmVudC0+RnJvemVuICYmICJwYXJlbnQgYWxyZWFkeSBoYXMgY2hpbGQgYnVpbGRlciBhY3RpdmUiKTsKKyAgICAgIHBhcmVudC0+RnJvemVuID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KCFidWlsZGVyLkZyb3plbiAmJiAiYnVpbGRlciBhbHJlYWR5IGhhcyBjaGlsZCBidWlsZGVyIGFjdGl2ZSIpOworICAgICAgYnVpbGRlci5Gcm96ZW4gPSB0cnVlOworICAgIH0KKyAgfQorCisgIH5Db25zdGFudEFnZ3JlZ2F0ZUJ1aWxkZXJCYXNlKCkgeworICAgIGFzc2VydChGaW5pc2hlZCAmJiAiZGlkbid0IGZpbmlzaCBhZ2dyZWdhdGUgYnVpbGRlciIpOworICB9CisKKyAgdm9pZCBtYXJrRmluaXNoZWQoKSB7CisgICAgYXNzZXJ0KCFGcm96ZW4gJiYgImNoaWxkIGJ1aWxkZXIgc3RpbGwgYWN0aXZlIik7CisgICAgYXNzZXJ0KCFGaW5pc2hlZCAmJiAiYnVpbGRlciBhbHJlYWR5IGZpbmlzaGVkIik7CisgICAgRmluaXNoZWQgPSB0cnVlOworICAgIGlmIChQYXJlbnQpIHsKKyAgICAgIGFzc2VydChQYXJlbnQtPkZyb3plbiAmJgorICAgICAgICAgICAgICJwYXJlbnQgbm90IGZyb3plbiB3aGlsZSBjaGlsZCBidWlsZGVyIGFjdGl2ZSIpOworICAgICAgUGFyZW50LT5Gcm96ZW4gPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KEJ1aWxkZXIuRnJvemVuICYmCisgICAgICAgICAgICAgImJ1aWxkZXIgbm90IGZyb3plbiB3aGlsZSBjaGlsZCBidWlsZGVyIGFjdGl2ZSIpOworICAgICAgQnVpbGRlci5Gcm96ZW4gPSBmYWxzZTsKKyAgICB9CisgIH0KKworcHVibGljOgorICAvLyBOb3QgY29weWFibGUuCisgIENvbnN0YW50QWdncmVnYXRlQnVpbGRlckJhc2UoY29uc3QgQ29uc3RhbnRBZ2dyZWdhdGVCdWlsZGVyQmFzZSAmKSA9IGRlbGV0ZTsKKyAgQ29uc3RhbnRBZ2dyZWdhdGVCdWlsZGVyQmFzZSAmb3BlcmF0b3I9KGNvbnN0IENvbnN0YW50QWdncmVnYXRlQnVpbGRlckJhc2UgJikKKyAgICA9IGRlbGV0ZTsKKworICAvLyBNb3ZhYmxlLCBtb3N0bHkgdG8gYWxsb3cgcmV0dXJuaW5nLiAgQnV0IHdlIGhhdmUgdG8gd3JpdGUgdGhpcyBvdXQKKyAgLy8gcHJvcGVybHkgdG8gc2F0aXNmeSB0aGUgYXNzZXJ0IGluIHRoZSBkZXN0cnVjdG9yLgorICBDb25zdGFudEFnZ3JlZ2F0ZUJ1aWxkZXJCYXNlKENvbnN0YW50QWdncmVnYXRlQnVpbGRlckJhc2UgJiZvdGhlcikKKyAgICA6IEJ1aWxkZXIob3RoZXIuQnVpbGRlciksIFBhcmVudChvdGhlci5QYXJlbnQpLCBCZWdpbihvdGhlci5CZWdpbiksCisgICAgICBDYWNoZWRPZmZzZXRFbmQob3RoZXIuQ2FjaGVkT2Zmc2V0RW5kKSwKKyAgICAgIEZpbmlzaGVkKG90aGVyLkZpbmlzaGVkKSwgRnJvemVuKG90aGVyLkZyb3plbiksIFBhY2tlZChvdGhlci5QYWNrZWQpLAorICAgICAgQ2FjaGVkT2Zmc2V0RnJvbUdsb2JhbChvdGhlci5DYWNoZWRPZmZzZXRGcm9tR2xvYmFsKSB7CisgICAgb3RoZXIuRmluaXNoZWQgPSB0cnVlOworICB9CisgIENvbnN0YW50QWdncmVnYXRlQnVpbGRlckJhc2UgJm9wZXJhdG9yPShDb25zdGFudEFnZ3JlZ2F0ZUJ1aWxkZXJCYXNlICYmb3RoZXIpCisgICAgPSBkZWxldGU7CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvCisgIC8vLyB0aGlzIHN0cnVjdCBvciBhcnJheS4KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgYXNzZXJ0KCF0aGlzLT5GaW5pc2hlZCAmJiAiY2Fubm90IHF1ZXJ5IGFmdGVyIGZpbmlzaGluZyBidWlsZGVyIik7CisgICAgYXNzZXJ0KCF0aGlzLT5Gcm96ZW4gJiYgImNhbm5vdCBxdWVyeSB3aGlsZSBzdWItYnVpbGRlciBpcyBhY3RpdmUiKTsKKyAgICBhc3NlcnQodGhpcy0+QmVnaW4gPD0gdGhpcy0+Z2V0QnVmZmVyKCkuc2l6ZSgpKTsKKyAgICByZXR1cm4gdGhpcy0+Z2V0QnVmZmVyKCkuc2l6ZSgpIC0gdGhpcy0+QmVnaW47CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgbm8gZWxlbWVudHMgaGF2ZSB5ZXQgYmVlbiBhZGRlZCB0byB0aGlzIHN0cnVjdCBvciBhcnJheS4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc2l6ZSgpID09IDA7CisgIH0KKworICAvLy8gQWJhbmRvbiB0aGlzIGJ1aWxkZXIgY29tcGxldGVseS4KKyAgdm9pZCBhYmFuZG9uKCkgeworICAgIG1hcmtGaW5pc2hlZCgpOworICAgIEJ1aWxkZXIuYWJhbmRvbihCZWdpbik7CisgIH0KKworICAvLy8gQWRkIGEgbmV3IHZhbHVlIHRvIHRoaXMgaW5pdGlhbGl6ZXIuCisgIHZvaWQgYWRkKGxsdm06OkNvbnN0YW50ICp2YWx1ZSkgeworICAgIGFzc2VydCh2YWx1ZSAmJiAiYWRkaW5nIG51bGwgdmFsdWUgdG8gY29uc3RhbnQgaW5pdGlhbGl6ZXIiKTsKKyAgICBhc3NlcnQoIUZpbmlzaGVkICYmICJjYW5ub3QgYWRkIG1vcmUgdmFsdWVzIGFmdGVyIGZpbmlzaGluZyBidWlsZGVyIik7CisgICAgYXNzZXJ0KCFGcm96ZW4gJiYgImNhbm5vdCBhZGQgdmFsdWVzIHdoaWxlIHN1YmJ1aWxkZXIgaXMgYWN0aXZlIik7CisgICAgQnVpbGRlci5CdWZmZXIucHVzaF9iYWNrKHZhbHVlKTsKKyAgfQorCisgIC8vLyBBZGQgYW4gaW50ZWdlciB2YWx1ZSBvZiB0eXBlIHNpemVfdC4KKyAgdm9pZCBhZGRTaXplKENoYXJVbml0cyBzaXplKTsKKworICAvLy8gQWRkIGFuIGludGVnZXIgdmFsdWUgb2YgYSBzcGVjaWZpYyB0eXBlLgorICB2b2lkIGFkZEludChsbHZtOjpJbnRlZ2VyVHlwZSAqaW50VHksIHVpbnQ2NF90IHZhbHVlLAorICAgICAgICAgICAgICBib29sIGlzU2lnbmVkID0gZmFsc2UpIHsKKyAgICBhZGQobGx2bTo6Q29uc3RhbnRJbnQ6OmdldChpbnRUeSwgdmFsdWUsIGlzU2lnbmVkKSk7CisgIH0KKworICAvLy8gQWRkIGEgbnVsbCBwb2ludGVyIG9mIGEgc3BlY2lmaWMgdHlwZS4KKyAgdm9pZCBhZGROdWxsUG9pbnRlcihsbHZtOjpQb2ludGVyVHlwZSAqcHRyVHkpIHsKKyAgICBhZGQobGx2bTo6Q29uc3RhbnRQb2ludGVyTnVsbDo6Z2V0KHB0clR5KSk7CisgIH0KKworICAvLy8gQWRkIGEgYml0Y2FzdCBvZiBhIHZhbHVlIHRvIGEgc3BlY2lmaWMgdHlwZS4KKyAgdm9pZCBhZGRCaXRDYXN0KGxsdm06OkNvbnN0YW50ICp2YWx1ZSwgbGx2bTo6VHlwZSAqdHlwZSkgeworICAgIGFkZChsbHZtOjpDb25zdGFudEV4cHI6OmdldEJpdENhc3QodmFsdWUsIHR5cGUpKTsKKyAgfQorCisgIC8vLyBBZGQgYSBidW5jaCBvZiBuZXcgdmFsdWVzIHRvIHRoaXMgaW5pdGlhbGl6ZXIuCisgIHZvaWQgYWRkQWxsKGxsdm06OkFycmF5UmVmPGxsdm06OkNvbnN0YW50ICo+IHZhbHVlcykgeworICAgIGFzc2VydCghRmluaXNoZWQgJiYgImNhbm5vdCBhZGQgbW9yZSB2YWx1ZXMgYWZ0ZXIgZmluaXNoaW5nIGJ1aWxkZXIiKTsKKyAgICBhc3NlcnQoIUZyb3plbiAmJiAiY2Fubm90IGFkZCB2YWx1ZXMgd2hpbGUgc3ViYnVpbGRlciBpcyBhY3RpdmUiKTsKKyAgICBCdWlsZGVyLkJ1ZmZlci5hcHBlbmQodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7CisgIH0KKworICAvLy8gQWRkIGEgcmVsYXRpdmUgb2Zmc2V0IHRvIHRoZSBnaXZlbiB0YXJnZXQgYWRkcmVzcywgaS5lLiB0aGUKKyAgLy8vIHN0YXRpYyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHRhcmdldCBhZGRyZXNzIGFuZCB0aGUgYWRkcmVzcworICAvLy8gb2YgdGhlIHJlbGF0aXZlIG9mZnNldC4gIFRoZSB0YXJnZXQgbXVzdCBiZSBrbm93biB0byBiZSBkZWZpbmVkCisgIC8vLyBpbiB0aGUgY3VycmVudCBsaW5rYWdlIHVuaXQuICBUaGUgb2Zmc2V0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4KKyAgLy8vIGludGVnZXIgdHlwZSwgd2hpY2ggbXVzdCBiZSBubyB3aWRlciB0aGFuIGludHB0cl90LiAgU29tZQorICAvLy8gdGFyZ2V0cyBtYXkgbm90IGZ1bGx5IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24uCisgIHZvaWQgYWRkUmVsYXRpdmVPZmZzZXQobGx2bTo6SW50ZWdlclR5cGUgKnR5cGUsIGxsdm06OkNvbnN0YW50ICp0YXJnZXQpIHsKKyAgICBhZGQoZ2V0UmVsYXRpdmVPZmZzZXQodHlwZSwgdGFyZ2V0KSk7CisgIH0KKworICAvLy8gQWRkIGEgcmVsYXRpdmUgb2Zmc2V0IHRvIHRoZSB0YXJnZXQgYWRkcmVzcywgcGx1cyBhIHNtYWxsCisgIC8vLyBjb25zdGFudCBvZmZzZXQuICBUaGlzIGlzIHByaW1hcmlseSB1c2VmdWwgd2hlbiB0aGUgcmVsYXRpdmUKKyAgLy8vIG9mZnNldCBpcyBrbm93biB0byBiZSBhIG11bHRpcGxlIG9mIChzYXkpIGZvdXIgYW5kIHRoZXJlZm9yZQorICAvLy8gdGhlIHRhZyBjYW4gYmUgdXNlZCB0byBleHByZXNzIGFuIGV4dHJhIHR3byBiaXRzIG9mIGluZm9ybWF0aW9uLgorICB2b2lkIGFkZFRhZ2dlZFJlbGF0aXZlT2Zmc2V0KGxsdm06OkludGVnZXJUeXBlICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkNvbnN0YW50ICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHRhZykgeworICAgIGxsdm06OkNvbnN0YW50ICpvZmZzZXQgPSBnZXRSZWxhdGl2ZU9mZnNldCh0eXBlLCBhZGRyZXNzKTsKKyAgICBpZiAodGFnKSB7CisgICAgICBvZmZzZXQgPSBsbHZtOjpDb25zdGFudEV4cHI6OmdldEFkZChvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpDb25zdGFudEludDo6Z2V0KHR5cGUsIHRhZykpOworICAgIH0KKyAgICBhZGQob2Zmc2V0KTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5pdGlhbGl6ZXIgdG8gdGhlCisgIC8vLyBuZXh0IHBvc2l0aW9uLCBhc3N1bWluZyBubyBwYWRkaW5nIGlzIHJlcXVpcmVkIHByaW9yIHRvIGl0LgorICAvLy8KKyAgLy8vIFRoaXMgb3BlcmF0aW9uIHdpbGwgbm90IHN1Y2NlZWQgaWYgYW55IHVuc2l6ZWQgcGxhY2Vob2xkZXJzIGFyZQorICAvLy8gY3VycmVudGx5IGluIHBsYWNlIGluIHRoZSBpbml0aWFsaXplci4KKyAgQ2hhclVuaXRzIGdldE5leHRPZmZzZXRGcm9tR2xvYmFsKCkgY29uc3QgeworICAgIGFzc2VydCghRmluaXNoZWQgJiYgImNhbm5vdCBhZGQgbW9yZSB2YWx1ZXMgYWZ0ZXIgZmluaXNoaW5nIGJ1aWxkZXIiKTsKKyAgICBhc3NlcnQoIUZyb3plbiAmJiAiY2Fubm90IGFkZCB2YWx1ZXMgd2hpbGUgc3ViYnVpbGRlciBpcyBhY3RpdmUiKTsKKyAgICByZXR1cm4gZ2V0T2Zmc2V0RnJvbUdsb2JhbFRvKEJ1aWxkZXIuQnVmZmVyLnNpemUoKSk7CisgIH0KKworICAvLy8gQW4gb3BhcXVlIGNsYXNzIHRvIGhvbGQgdGhlIGFic3RyYWN0IHBvc2l0aW9uIG9mIGEgcGxhY2Vob2xkZXIuCisgIGNsYXNzIFBsYWNlaG9sZGVyUG9zaXRpb24geworICAgIHNpemVfdCBJbmRleDsKKyAgICBmcmllbmQgY2xhc3MgQ29uc3RhbnRBZ2dyZWdhdGVCdWlsZGVyQmFzZTsKKyAgICBQbGFjZWhvbGRlclBvc2l0aW9uKHNpemVfdCBpbmRleCkgOiBJbmRleChpbmRleCkge30KKyAgfTsKKworICAvLy8gQWRkIGEgcGxhY2Vob2xkZXIgdmFsdWUgdG8gdGhlIHN0cnVjdHVyZS4gIFRoZSByZXR1cm5lZCBwb3NpdGlvbgorICAvLy8gY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSB2YWx1ZSBsYXRlcjsgaXQgd2lsbCBub3QgYmUgaW52YWxpZGF0ZWQgYnkKKyAgLy8vIGFueSBpbnRlcm1lZGlhdGUgb3BlcmF0aW9ucyBleGNlcHQgKDEpIGZpbGxpbmcgdGhlIHNhbWUgcG9zaXRpb24gb3IKKyAgLy8vICgyKSBmaW5pc2hpbmcgdGhlIGVudGlyZSBidWlsZGVyLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZnVsIGZvciBlbWl0dGluZyBjZXJ0YWluIGtpbmRzIG9mIHN0cnVjdHVyZSB3aGljaAorICAvLy8gY29udGFpbiBzb21lIHNvcnQgb2Ygc3VtbWFyeSBmaWVsZCwgZ2VuZXJhbHkgYSBjb3VudCwgYmVmb3JlIGFueQorICAvLy8gb2YgdGhlIGRhdGEuICBCeSBlbWl0dGluZyBhIHBsYWNlaG9sZGVyIGZpcnN0LCB0aGUgc3RydWN0dXJlIGNhbgorICAvLy8gYmUgZW1pdHRlZCBlYWdlcmx5LgorICBQbGFjZWhvbGRlclBvc2l0aW9uIGFkZFBsYWNlaG9sZGVyKCkgeworICAgIGFzc2VydCghRmluaXNoZWQgJiYgImNhbm5vdCBhZGQgbW9yZSB2YWx1ZXMgYWZ0ZXIgZmluaXNoaW5nIGJ1aWxkZXIiKTsKKyAgICBhc3NlcnQoIUZyb3plbiAmJiAiY2Fubm90IGFkZCB2YWx1ZXMgd2hpbGUgc3ViYnVpbGRlciBpcyBhY3RpdmUiKTsKKyAgICBCdWlsZGVyLkJ1ZmZlci5wdXNoX2JhY2sobnVsbHB0cik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQnVmZmVyLnNpemUoKSAtIDE7CisgIH0KKworICAvLy8gQWRkIGEgcGxhY2Vob2xkZXIsIGdpdmluZyB0aGUgZXhwZWN0ZWQgdHlwZSB0aGF0IHdpbGwgYmUgZmlsbGVkIGluLgorICBQbGFjZWhvbGRlclBvc2l0aW9uIGFkZFBsYWNlaG9sZGVyV2l0aFNpemUobGx2bTo6VHlwZSAqZXhwZWN0ZWRUeXBlKTsKKworICAvLy8gRmlsbCBhIHByZXZpb3VzbHktYWRkZWQgcGxhY2Vob2xkZXIuCisgIHZvaWQgZmlsbFBsYWNlaG9sZGVyV2l0aEludChQbGFjZWhvbGRlclBvc2l0aW9uIHBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6SW50ZWdlclR5cGUgKnR5cGUsIHVpbnQ2NF90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCA9IGZhbHNlKSB7CisgICAgZmlsbFBsYWNlaG9sZGVyKHBvc2l0aW9uLCBsbHZtOjpDb25zdGFudEludDo6Z2V0KHR5cGUsIHZhbHVlLCBpc1NpZ25lZCkpOworICB9CisKKyAgLy8vIEZpbGwgYSBwcmV2aW91c2x5LWFkZGVkIHBsYWNlaG9sZGVyLgorICB2b2lkIGZpbGxQbGFjZWhvbGRlcihQbGFjZWhvbGRlclBvc2l0aW9uIHBvc2l0aW9uLCBsbHZtOjpDb25zdGFudCAqdmFsdWUpIHsKKyAgICBhc3NlcnQoIUZpbmlzaGVkICYmICJjYW5ub3QgY2hhbmdlIHZhbHVlcyBhZnRlciBmaW5pc2hpbmcgYnVpbGRlciIpOworICAgIGFzc2VydCghRnJvemVuICYmICJjYW5ub3QgYWRkIHZhbHVlcyB3aGlsZSBzdWJidWlsZGVyIGlzIGFjdGl2ZSIpOworICAgIGxsdm06OkNvbnN0YW50IComc2xvdCA9IEJ1aWxkZXIuQnVmZmVyW3Bvc2l0aW9uLkluZGV4XTsKKyAgICBhc3NlcnQoc2xvdCA9PSBudWxscHRyICYmICJwbGFjZWhvbGRlciBhbHJlYWR5IGZpbGxlZCIpOworICAgIHNsb3QgPSB2YWx1ZTsKKyAgfQorCisgIC8vLyBQcm9kdWNlIGFuIGFkZHJlc3Mgd2hpY2ggd2lsbCBldmVudHVhbGx5IHBvaW50IHRvIHRoZSBuZXh0CisgIC8vLyBwb3NpdGlvbiB0byBiZSBmaWxsZWQuICBUaGlzIGlzIGNvbXB1dGVkIHdpdGggYW4gaW5kZXhlZAorICAvLy8gZ2V0ZWxlbWVudHB0ciByYXRoZXIgdGhhbiBieSBjb21wdXRpbmcgb2Zmc2V0cy4KKyAgLy8vCisgIC8vLyBUaGUgcmV0dXJuZWQgcG9pbnRlciB3aWxsIGhhdmUgdHlwZSBUKiwgd2hlcmUgVCBpcyB0aGUgZ2l2ZW4KKyAgLy8vIHBvc2l0aW9uLgorICBsbHZtOjpDb25zdGFudCAqZ2V0QWRkck9mQ3VycmVudFBvc2l0aW9uKGxsdm06OlR5cGUgKnR5cGUpOworCisgIGxsdm06OkFycmF5UmVmPGxsdm06OkNvbnN0YW50Kj4gZ2V0R0VQSW5kaWNlc1RvQ3VycmVudFBvc2l0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxWZWN0b3JJbXBsPGxsdm06OkNvbnN0YW50Kj4gJmluZGljZXMpIHsKKyAgICBnZXRHRVBJbmRpY2VzVG8oaW5kaWNlcywgQnVpbGRlci5CdWZmZXIuc2l6ZSgpKTsKKyAgICByZXR1cm4gaW5kaWNlczsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGxsdm06OkNvbnN0YW50ICpmaW5pc2hBcnJheShsbHZtOjpUeXBlICplbHRUeSk7CisgIGxsdm06OkNvbnN0YW50ICpmaW5pc2hTdHJ1Y3QobGx2bTo6U3RydWN0VHlwZSAqc3RydWN0VHkpOworCitwcml2YXRlOgorICB2b2lkIGdldEdFUEluZGljZXNUbyhsbHZtOjpTbWFsbFZlY3RvckltcGw8bGx2bTo6Q29uc3RhbnQqPiAmaW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uKSBjb25zdDsKKworICBsbHZtOjpDb25zdGFudCAqZ2V0UmVsYXRpdmVPZmZzZXQobGx2bTo6SW50ZWdlclR5cGUgKm9mZnNldFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpDb25zdGFudCAqdGFyZ2V0KTsKKworICBDaGFyVW5pdHMgZ2V0T2Zmc2V0RnJvbUdsb2JhbFRvKHNpemVfdCBpbmRleCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgSW1wbCwgY2xhc3MgVHJhaXRzPgorY2xhc3MgQ29uc3RhbnRBZ2dyZWdhdGVCdWlsZGVyVGVtcGxhdGVCYXNlCisgICAgOiBwdWJsaWMgVHJhaXRzOjpBZ2dyZWdhdGVCdWlsZGVyQmFzZSB7CisgIHVzaW5nIHN1cGVyID0gdHlwZW5hbWUgVHJhaXRzOjpBZ2dyZWdhdGVCdWlsZGVyQmFzZTsKK3B1YmxpYzoKKyAgdXNpbmcgSW5pdEJ1aWxkZXIgPSB0eXBlbmFtZSBUcmFpdHM6OkluaXRCdWlsZGVyOworICB1c2luZyBBcnJheUJ1aWxkZXIgPSB0eXBlbmFtZSBUcmFpdHM6OkFycmF5QnVpbGRlcjsKKyAgdXNpbmcgU3RydWN0QnVpbGRlciA9IHR5cGVuYW1lIFRyYWl0czo6U3RydWN0QnVpbGRlcjsKKyAgdXNpbmcgQWdncmVnYXRlQnVpbGRlckJhc2UgPSB0eXBlbmFtZSBUcmFpdHM6OkFnZ3JlZ2F0ZUJ1aWxkZXJCYXNlOworCitwcm90ZWN0ZWQ6CisgIENvbnN0YW50QWdncmVnYXRlQnVpbGRlclRlbXBsYXRlQmFzZShJbml0QnVpbGRlciAmYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZ3JlZ2F0ZUJ1aWxkZXJCYXNlICpwYXJlbnQpCisgICAgOiBzdXBlcihidWlsZGVyLCBwYXJlbnQpIHt9CisKKyAgSW1wbCAmYXNJbXBsKCkgeyByZXR1cm4gKnN0YXRpY19jYXN0PEltcGwqPih0aGlzKTsgfQorCitwdWJsaWM6CisgIEFycmF5QnVpbGRlciBiZWdpbkFycmF5KGxsdm06OlR5cGUgKmVsdFR5ID0gbnVsbHB0cikgeworICAgIHJldHVybiBBcnJheUJ1aWxkZXIoc3RhdGljX2Nhc3Q8SW5pdEJ1aWxkZXImPih0aGlzLT5CdWlsZGVyKSwgdGhpcywgZWx0VHkpOworICB9CisKKyAgU3RydWN0QnVpbGRlciBiZWdpblN0cnVjdChsbHZtOjpTdHJ1Y3RUeXBlICp0eSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gU3RydWN0QnVpbGRlcihzdGF0aWNfY2FzdDxJbml0QnVpbGRlciY+KHRoaXMtPkJ1aWxkZXIpLCB0aGlzLCB0eSk7CisgIH0KKworICAvLy8gR2l2ZW4gdGhhdCB0aGlzIGJ1aWxkZXIgd2FzIGNyZWF0ZWQgYnkgYmVnaW5uaW5nIGFuIGFycmF5IG9yIHN0cnVjdAorICAvLy8gY29tcG9uZW50IG9uIHRoZSBnaXZlbiBwYXJlbnQgYnVpbGRlciwgZmluaXNoIHRoZSBhcnJheS9zdHJ1Y3QKKyAgLy8vIGNvbXBvbmVudCBhbmQgYWRkIGl0IHRvIHRoZSBwYXJlbnQuCisgIC8vLworICAvLy8gSXQgaXMgYW4gaW50ZW50aW9uYWwgY2hvaWNlIHRoYXQgdGhlIHBhcmVudCBpcyBwYXNzZWQgaW4gZXhwbGljaXRseQorICAvLy8gZGVzcGl0ZSBpdCBiZWluZyByZWR1bmRhbnQgd2l0aCBpbmZvcm1hdGlvbiBhbHJlYWR5IGtlcHQgaW4gdGhlCisgIC8vLyBidWlsZGVyLiAgVGhpcyBhaWRzIGluIHJlYWRhYmlsaXR5IGJ5IG1ha2luZyBpdCBlYXNpZXIgdG8gZmluZCB0aGUKKyAgLy8vIHBsYWNlcyB0aGF0IGFkZCBjb21wb25lbnRzIHRvIGEgYnVpbGRlciwgYXMgd2VsbCBhcyAiYm9va2VuZGluZyIKKyAgLy8vIHRoZSBzdWItYnVpbGRlciBtb3JlIGV4cGxpY2l0bHkuCisgIHZvaWQgZmluaXNoQW5kQWRkVG8oQWdncmVnYXRlQnVpbGRlckJhc2UgJnBhcmVudCkgeworICAgIGFzc2VydCh0aGlzLT5QYXJlbnQgPT0gJnBhcmVudCAmJiAiYWRkaW5nIHRvIG5vbi1wYXJlbnQgYnVpbGRlciIpOworICAgIHBhcmVudC5hZGQoYXNJbXBsKCkuZmluaXNoSW1wbCgpKTsKKyAgfQorCisgIC8vLyBHaXZlbiB0aGF0IHRoaXMgYnVpbGRlciB3YXMgY3JlYXRlZCBieSBiZWdpbm5pbmcgYW4gYXJyYXkgb3Igc3RydWN0CisgIC8vLyBkaXJlY3RseSBvbiBhIENvbnN0YW50SW5pdEJ1aWxkZXIsIGZpbmlzaCB0aGUgYXJyYXkvc3RydWN0IGFuZAorICAvLy8gY3JlYXRlIGEgZ2xvYmFsIHZhcmlhYmxlIHdpdGggaXQgYXMgdGhlIGluaXRpYWxpemVyLgorICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXM+CisgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpmaW5pc2hBbmRDcmVhdGVHbG9iYWwoQXMgJiYuLi5hcmdzKSB7CisgICAgYXNzZXJ0KCF0aGlzLT5QYXJlbnQgJiYgImZpbmlzaGluZyBub24tcm9vdCBidWlsZGVyIik7CisgICAgcmV0dXJuIHRoaXMtPkJ1aWxkZXIuY3JlYXRlR2xvYmFsKGFzSW1wbCgpLmZpbmlzaEltcGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPEFzPihhcmdzKS4uLik7CisgIH0KKworICAvLy8gR2l2ZW4gdGhhdCB0aGlzIGJ1aWxkZXIgd2FzIGNyZWF0ZWQgYnkgYmVnaW5uaW5nIGFuIGFycmF5IG9yIHN0cnVjdAorICAvLy8gZGlyZWN0bHkgb24gYSBDb25zdGFudEluaXRCdWlsZGVyLCBmaW5pc2ggdGhlIGFycmF5L3N0cnVjdCBhbmQKKyAgLy8vIHNldCBpdCBhcyB0aGUgaW5pdGlhbGl6ZXIgb2YgdGhlIGdpdmVuIGdsb2JhbCB2YXJpYWJsZS4KKyAgdm9pZCBmaW5pc2hBbmRTZXRBc0luaXRpYWxpemVyKGxsdm06Okdsb2JhbFZhcmlhYmxlICpnbG9iYWwpIHsKKyAgICBhc3NlcnQoIXRoaXMtPlBhcmVudCAmJiAiZmluaXNoaW5nIG5vbi1yb290IGJ1aWxkZXIiKTsKKyAgICByZXR1cm4gdGhpcy0+QnVpbGRlci5zZXRHbG9iYWxJbml0aWFsaXplcihnbG9iYWwsIGFzSW1wbCgpLmZpbmlzaEltcGwoKSk7CisgIH0KKworICAvLy8gR2l2ZW4gdGhhdCB0aGlzIGJ1aWxkZXIgd2FzIGNyZWF0ZWQgYnkgYmVnaW5uaW5nIGFuIGFycmF5IG9yIHN0cnVjdAorICAvLy8gZGlyZWN0bHkgb24gYSBDb25zdGFudEluaXRCdWlsZGVyLCBmaW5pc2ggdGhlIGFycmF5L3N0cnVjdCBhbmQKKyAgLy8vIHJldHVybiBhIGZ1dHVyZSB3aGljaCBjYW4gYmUgdXNlZCB0byBpbnN0YWxsIHRoZSBpbml0aWFsaXplciBpbgorICAvLy8gYSBnbG9iYWwgbGF0ZXIuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VmdWwgZm9yIGFsbG93aW5nIGEgZmluaXNoZWQgaW5pdGlhbGl6ZXIgdG8gcGFzc2VkIHRvCisgIC8vLyBhbiBBUEkgd2hpY2ggd2lsbCBidWlsZCB0aGUgZ2xvYmFsLiAgSG93ZXZlciwgdGhlICJmdXR1cmUiIHByZXNlcnZlcworICAvLy8gYSBkZXBlbmRlbmN5IG9uIHRoZSBvcmlnaW5hbCBidWlsZGVyOyBpdCBpcyBhbiBlcnJvciB0byBwYXNzIGl0IGFzaWRlLgorICBDb25zdGFudEluaXRGdXR1cmUgZmluaXNoQW5kQ3JlYXRlRnV0dXJlKCkgeworICAgIGFzc2VydCghdGhpcy0+UGFyZW50ICYmICJmaW5pc2hpbmcgbm9uLXJvb3QgYnVpbGRlciIpOworICAgIHJldHVybiB0aGlzLT5CdWlsZGVyLmNyZWF0ZUZ1dHVyZShhc0ltcGwoKS5maW5pc2hJbXBsKCkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXRzPgorY2xhc3MgQ29uc3RhbnRBcnJheUJ1aWxkZXJUZW1wbGF0ZUJhc2UKKyAgOiBwdWJsaWMgQ29uc3RhbnRBZ2dyZWdhdGVCdWlsZGVyVGVtcGxhdGVCYXNlPHR5cGVuYW1lIFRyYWl0czo6QXJyYXlCdWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaXRzPiB7CisgIHVzaW5nIHN1cGVyID0KKyAgICBDb25zdGFudEFnZ3JlZ2F0ZUJ1aWxkZXJUZW1wbGF0ZUJhc2U8dHlwZW5hbWUgVHJhaXRzOjpBcnJheUJ1aWxkZXIsIFRyYWl0cz47CisKK3B1YmxpYzoKKyAgdXNpbmcgSW5pdEJ1aWxkZXIgPSB0eXBlbmFtZSBUcmFpdHM6OkluaXRCdWlsZGVyOworICB1c2luZyBBZ2dyZWdhdGVCdWlsZGVyQmFzZSA9IHR5cGVuYW1lIFRyYWl0czo6QWdncmVnYXRlQnVpbGRlckJhc2U7CisKK3ByaXZhdGU6CisgIGxsdm06OlR5cGUgKkVsdFR5OworCisgIHRlbXBsYXRlIDxjbGFzcywgY2xhc3M+CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudEFnZ3JlZ2F0ZUJ1aWxkZXJUZW1wbGF0ZUJhc2U7CisKK3Byb3RlY3RlZDoKKyAgQ29uc3RhbnRBcnJheUJ1aWxkZXJUZW1wbGF0ZUJhc2UoSW5pdEJ1aWxkZXIgJmJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZ3JlZ2F0ZUJ1aWxkZXJCYXNlICpwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlR5cGUgKmVsdFR5KQorICAgIDogc3VwZXIoYnVpbGRlciwgcGFyZW50KSwgRWx0VHkoZWx0VHkpIHt9CisKK3ByaXZhdGU6CisgIC8vLyBGb3JtIGFuIGFycmF5IGNvbnN0YW50IGZyb20gdGhlIHZhbHVlcyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byB0aGlzCisgIC8vLyBidWlsZGVyLgorICBsbHZtOjpDb25zdGFudCAqZmluaXNoSW1wbCgpIHsKKyAgICByZXR1cm4gQWdncmVnYXRlQnVpbGRlckJhc2U6OmZpbmlzaEFycmF5KEVsdFR5KTsKKyAgfQorfTsKKworLy8vIEEgdGVtcGxhdGUgY2xhc3MgZGVzaWduZWQgdG8gYWxsb3cgb3RoZXIgZnJvbnRlbmRzIHRvCisvLy8gZWFzaWx5IGN1c3RvbWl6ZSB0aGUgYnVpbGRlciBjbGFzc2VzIHVzZWQgYnkgQ29uc3RhbnRJbml0QnVpbGRlciwKKy8vLyBhbmQgdGh1cyB0byBleHRlbmQgdGhlIEFQSSB0byB3b3JrIHdpdGggdGhlIGFic3RyYWN0aW9ucyB0aGV5CisvLy8gcHJlZmVyLiAgVGhpcyB3b3VsZCBwcm9iYWJseSBub3QgYmUgbmVjZXNzYXJ5IGlmIEMrKyBqdXN0CisvLy8gc3VwcG9ydGVkIGV4dGVuc2lvbiBtZXRob2RzLgordGVtcGxhdGUgPGNsYXNzIFRyYWl0cz4KK2NsYXNzIENvbnN0YW50U3RydWN0QnVpbGRlclRlbXBsYXRlQmFzZQorICA6IHB1YmxpYyBDb25zdGFudEFnZ3JlZ2F0ZUJ1aWxkZXJUZW1wbGF0ZUJhc2U8dHlwZW5hbWUgVHJhaXRzOjpTdHJ1Y3RCdWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaXRzPiB7CisgIHVzaW5nIHN1cGVyID0KKyAgICBDb25zdGFudEFnZ3JlZ2F0ZUJ1aWxkZXJUZW1wbGF0ZUJhc2U8dHlwZW5hbWUgVHJhaXRzOjpTdHJ1Y3RCdWlsZGVyLFRyYWl0cz47CisKK3B1YmxpYzoKKyAgdXNpbmcgSW5pdEJ1aWxkZXIgPSB0eXBlbmFtZSBUcmFpdHM6OkluaXRCdWlsZGVyOworICB1c2luZyBBZ2dyZWdhdGVCdWlsZGVyQmFzZSA9IHR5cGVuYW1lIFRyYWl0czo6QWdncmVnYXRlQnVpbGRlckJhc2U7CisKK3ByaXZhdGU6CisgIGxsdm06OlN0cnVjdFR5cGUgKlN0cnVjdFR5OworCisgIHRlbXBsYXRlIDxjbGFzcywgY2xhc3M+CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudEFnZ3JlZ2F0ZUJ1aWxkZXJUZW1wbGF0ZUJhc2U7CisKK3Byb3RlY3RlZDoKKyAgQ29uc3RhbnRTdHJ1Y3RCdWlsZGVyVGVtcGxhdGVCYXNlKEluaXRCdWlsZGVyICZidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdncmVnYXRlQnVpbGRlckJhc2UgKnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cnVjdFR5cGUgKnN0cnVjdFR5KQorICAgIDogc3VwZXIoYnVpbGRlciwgcGFyZW50KSwgU3RydWN0VHkoc3RydWN0VHkpIHsKKyAgICBpZiAoc3RydWN0VHkpIHRoaXMtPlBhY2tlZCA9IHN0cnVjdFR5LT5pc1BhY2tlZCgpOworICB9CisKK3B1YmxpYzoKKyAgdm9pZCBzZXRQYWNrZWQoYm9vbCBwYWNrZWQpIHsKKyAgICB0aGlzLT5QYWNrZWQgPSBwYWNrZWQ7CisgIH0KKworICAvLy8gVXNlIHRoZSBnaXZlbiB0eXBlIGZvciB0aGUgc3RydWN0IGlmIGl0cyBlbGVtZW50IGNvdW50IGlzIGNvcnJlY3QuCisgIC8vLyBEb24ndCBhZGQgbW9yZSBlbGVtZW50cyBhZnRlciBjYWxsaW5nIHRoaXMuCisgIHZvaWQgc3VnZ2VzdFR5cGUobGx2bTo6U3RydWN0VHlwZSAqc3RydWN0VHkpIHsKKyAgICBpZiAodGhpcy0+c2l6ZSgpID09IHN0cnVjdFR5LT5nZXROdW1FbGVtZW50cygpKSB7CisgICAgICBTdHJ1Y3RUeSA9IHN0cnVjdFR5OworICAgIH0KKyAgfQorCitwcml2YXRlOgorICAvLy8gRm9ybSBhbiBhcnJheSBjb25zdGFudCBmcm9tIHRoZSB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhpcworICAvLy8gYnVpbGRlci4KKyAgbGx2bTo6Q29uc3RhbnQgKmZpbmlzaEltcGwoKSB7CisgICAgcmV0dXJuIEFnZ3JlZ2F0ZUJ1aWxkZXJCYXNlOjpmaW5pc2hTdHJ1Y3QoU3RydWN0VHkpOworICB9Cit9OworCisvLy8gQSB0ZW1wbGF0ZSBjbGFzcyBkZXNpZ25lZCB0byBhbGxvdyBvdGhlciBmcm9udGVuZHMgdG8KKy8vLyBlYXNpbHkgY3VzdG9taXplIHRoZSBidWlsZGVyIGNsYXNzZXMgdXNlZCBieSBDb25zdGFudEluaXRCdWlsZGVyLAorLy8vIGFuZCB0aHVzIHRvIGV4dGVuZCB0aGUgQVBJIHRvIHdvcmsgd2l0aCB0aGUgYWJzdHJhY3Rpb25zIHRoZXkKKy8vLyBwcmVmZXIuICBUaGlzIHdvdWxkIHByb2JhYmx5IG5vdCBiZSBuZWNlc3NhcnkgaWYgQysrIGp1c3QKKy8vLyBzdXBwb3J0ZWQgZXh0ZW5zaW9uIG1ldGhvZHMuCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXRzPgorY2xhc3MgQ29uc3RhbnRJbml0QnVpbGRlclRlbXBsYXRlQmFzZSA6IHB1YmxpYyBDb25zdGFudEluaXRCdWlsZGVyQmFzZSB7Citwcm90ZWN0ZWQ6CisgIENvbnN0YW50SW5pdEJ1aWxkZXJUZW1wbGF0ZUJhc2UoQ29kZUdlbk1vZHVsZSAmQ0dNKQorICAgIDogQ29uc3RhbnRJbml0QnVpbGRlckJhc2UoQ0dNKSB7fQorCitwdWJsaWM6CisgIHVzaW5nIEluaXRCdWlsZGVyID0gdHlwZW5hbWUgVHJhaXRzOjpJbml0QnVpbGRlcjsKKyAgdXNpbmcgQXJyYXlCdWlsZGVyID0gdHlwZW5hbWUgVHJhaXRzOjpBcnJheUJ1aWxkZXI7CisgIHVzaW5nIFN0cnVjdEJ1aWxkZXIgPSB0eXBlbmFtZSBUcmFpdHM6OlN0cnVjdEJ1aWxkZXI7CisKKyAgQXJyYXlCdWlsZGVyIGJlZ2luQXJyYXkobGx2bTo6VHlwZSAqZWx0VHkgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIEFycmF5QnVpbGRlcihzdGF0aWNfY2FzdDxJbml0QnVpbGRlciY+KCp0aGlzKSwgbnVsbHB0ciwgZWx0VHkpOworICB9CisKKyAgU3RydWN0QnVpbGRlciBiZWdpblN0cnVjdChsbHZtOjpTdHJ1Y3RUeXBlICpzdHJ1Y3RUeSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gU3RydWN0QnVpbGRlcihzdGF0aWNfY2FzdDxJbml0QnVpbGRlciY+KCp0aGlzKSwgbnVsbHB0ciwgc3RydWN0VHkpOworICB9Cit9OworCitjbGFzcyBDb25zdGFudEluaXRCdWlsZGVyOworY2xhc3MgQ29uc3RhbnRTdHJ1Y3RCdWlsZGVyOworY2xhc3MgQ29uc3RhbnRBcnJheUJ1aWxkZXI7CisKK3N0cnVjdCBDb25zdGFudEluaXRCdWlsZGVyVHJhaXRzIHsKKyAgdXNpbmcgSW5pdEJ1aWxkZXIgPSBDb25zdGFudEluaXRCdWlsZGVyOworICB1c2luZyBBZ2dyZWdhdGVCdWlsZGVyQmFzZSA9IENvbnN0YW50QWdncmVnYXRlQnVpbGRlckJhc2U7CisgIHVzaW5nIEFycmF5QnVpbGRlciA9IENvbnN0YW50QXJyYXlCdWlsZGVyOworICB1c2luZyBTdHJ1Y3RCdWlsZGVyID0gQ29uc3RhbnRTdHJ1Y3RCdWlsZGVyOworfTsKKworLy8vIFRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiBDb25zdGFudEluaXRCdWlsZGVyIHVzZWQgaW4gQ2xhbmcuCitjbGFzcyBDb25zdGFudEluaXRCdWlsZGVyCisgICAgOiBwdWJsaWMgQ29uc3RhbnRJbml0QnVpbGRlclRlbXBsYXRlQmFzZTxDb25zdGFudEluaXRCdWlsZGVyVHJhaXRzPiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IENvbnN0YW50SW5pdEJ1aWxkZXIoQ29kZUdlbk1vZHVsZSAmQ0dNKSA6CisgICAgQ29uc3RhbnRJbml0QnVpbGRlclRlbXBsYXRlQmFzZShDR00pIHt9Cit9OworCisvLy8gQSBoZWxwZXIgY2xhc3Mgb2YgQ29uc3RhbnRJbml0QnVpbGRlciwgdXNlZCBmb3IgYnVpbGRpbmcgY29uc3RhbnQKKy8vLyBhcnJheSBpbml0aWFsaXplcnMuCitjbGFzcyBDb25zdGFudEFycmF5QnVpbGRlcgorICAgIDogcHVibGljIENvbnN0YW50QXJyYXlCdWlsZGVyVGVtcGxhdGVCYXNlPENvbnN0YW50SW5pdEJ1aWxkZXJUcmFpdHM+IHsKKyAgdGVtcGxhdGUgPGNsYXNzIFRyYWl0cz4KKyAgZnJpZW5kIGNsYXNzIENvbnN0YW50SW5pdEJ1aWxkZXJUZW1wbGF0ZUJhc2U7CisKKyAgLy8gVGhlIHVzZSBvZiBleHBsaWNpdCBxdWFsaWZpY2F0aW9uIGlzIGEgR0NDIHdvcmthcm91bmQuCisgIHRlbXBsYXRlIDxjbGFzcyBJbXBsLCBjbGFzcyBUcmFpdHM+CisgIGZyaWVuZCBjbGFzcyBDb2RlR2VuOjpDb25zdGFudEFnZ3JlZ2F0ZUJ1aWxkZXJUZW1wbGF0ZUJhc2U7CisKKyAgQ29uc3RhbnRBcnJheUJ1aWxkZXIoQ29uc3RhbnRJbml0QnVpbGRlciAmYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRBZ2dyZWdhdGVCdWlsZGVyQmFzZSAqcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpUeXBlICplbHRUeSkKKyAgICA6IENvbnN0YW50QXJyYXlCdWlsZGVyVGVtcGxhdGVCYXNlKGJ1aWxkZXIsIHBhcmVudCwgZWx0VHkpIHt9Cit9OworCisvLy8gQSBoZWxwZXIgY2xhc3Mgb2YgQ29uc3RhbnRJbml0QnVpbGRlciwgdXNlZCBmb3IgYnVpbGRpbmcgY29uc3RhbnQKKy8vLyBzdHJ1Y3QgaW5pdGlhbGl6ZXJzLgorY2xhc3MgQ29uc3RhbnRTdHJ1Y3RCdWlsZGVyCisgICAgOiBwdWJsaWMgQ29uc3RhbnRTdHJ1Y3RCdWlsZGVyVGVtcGxhdGVCYXNlPENvbnN0YW50SW5pdEJ1aWxkZXJUcmFpdHM+IHsKKyAgdGVtcGxhdGUgPGNsYXNzIFRyYWl0cz4KKyAgZnJpZW5kIGNsYXNzIENvbnN0YW50SW5pdEJ1aWxkZXJUZW1wbGF0ZUJhc2U7CisKKyAgLy8gVGhlIHVzZSBvZiBleHBsaWNpdCBxdWFsaWZpY2F0aW9uIGlzIGEgR0NDIHdvcmthcm91bmQuCisgIHRlbXBsYXRlIDxjbGFzcyBJbXBsLCBjbGFzcyBUcmFpdHM+CisgIGZyaWVuZCBjbGFzcyBDb2RlR2VuOjpDb25zdGFudEFnZ3JlZ2F0ZUJ1aWxkZXJUZW1wbGF0ZUJhc2U7CisKKyAgQ29uc3RhbnRTdHJ1Y3RCdWlsZGVyKENvbnN0YW50SW5pdEJ1aWxkZXIgJmJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEFnZ3JlZ2F0ZUJ1aWxkZXJCYXNlICpwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJ1Y3RUeXBlICpzdHJ1Y3RUeSkKKyAgICA6IENvbnN0YW50U3RydWN0QnVpbGRlclRlbXBsYXRlQmFzZShidWlsZGVyLCBwYXJlbnQsIHN0cnVjdFR5KSB7fQorfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBDb2RlR2VuCit9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9Db25zdGFudEluaXRGdXR1cmUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0NvZGVHZW4vQ29uc3RhbnRJbml0RnV0dXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhN2UyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0NvZGVHZW4vQ29uc3RhbnRJbml0RnV0dXJlLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8vPT09LSBDb25zdGFudEluaXRGdXR1cmUuaCAtICJGdXR1cmUiIGNvbnN0YW50IGluaXRpYWxpemVycyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBDb25zdGFudEluaXRGdXR1cmUgY2xhc3MuICBUaGlzIGlzIHNwbGl0IG91dAorLy8gZnJvbSBDb25zdGFudEluaXRCdWlsZGVyLmggaW4gb3JkZXIgdG8gYWxsb3cgQVBJcyB0byB3b3JrIHdpdGggaXQKKy8vIHdpdGhvdXQgaGF2aW5nIHRvIGluY2x1ZGUgdGhhdCBlbnRpcmUgaGVhZGVyLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkKKy8vIGltcG9ydGFudCBiZWNhdXNlIGl0IGlzIG9mdGVuIHVzZWZ1bCB0byBiZSBhYmxlIHRvIGRlZmF1bHQtY29uc3RydWN0CisvLyBhIGZ1dHVyZSBpbiwgc2F5LCBhIGRlZmF1bHQgYXJndW1lbnQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0NPREVHRU5fQ09OU1RBTlRJTklURlVUVVJFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19DT0RFR0VOX0NPTlNUQU5USU5JVEZVVFVSRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50LmgiCisKKy8vIEZvcndhcmQtZGVjbGFyZSBDb25zdGFudEluaXRCdWlsZGVyQmFzZSBhbmQgZ2l2ZSBpdCBhCisvLyBQb2ludGVyTGlrZVR5cGVUcmFpdHMgc3BlY2lhbGl6YXRpb24gc28gdGhhdCB3ZSBjYW4gc2FmZWx5IHVzZSBpdAorLy8gaW4gYSBQb2ludGVyVW5pb24gYmVsb3cuCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIENvZGVHZW4geworY2xhc3MgQ29uc3RhbnRJbml0QnVpbGRlckJhc2U7Cit9Cit9CituYW1lc3BhY2UgbGx2bSB7Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IFBvaW50ZXJMaWtlVHlwZVRyYWl0czwgOjpjbGFuZzo6Q29kZUdlbjo6Q29uc3RhbnRJbml0QnVpbGRlckJhc2UqPiB7CisgIHVzaW5nIFQgPSA6OmNsYW5nOjpDb2RlR2VuOjpDb25zdGFudEluaXRCdWlsZGVyQmFzZSo7CisKKyAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKFQgcCkgeyByZXR1cm4gcDsgfQorICBzdGF0aWMgaW5saW5lIFQgZ2V0RnJvbVZvaWRQb2ludGVyKHZvaWQgKnApIHtyZXR1cm4gc3RhdGljX2Nhc3Q8VD4ocCk7fQorICBlbnVtIHsgTnVtTG93Qml0c0F2YWlsYWJsZSA9IDIgfTsKK307Cit9CisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgQ29kZUdlbiB7CisKKy8vLyBBICJmdXR1cmUiIGZvciBhIGNvbXBsZXRlZCBjb25zdGFudCBpbml0aWFsaXplciwgd2hpY2ggY2FuIGJlIHBhc3NlZAorLy8vIGFyb3VuZCBpbmRlcGVuZGVudGx5IG9mIGFueSBzdWItYnVpbGRlcnMgKGJ1dCBub3QgdGhlIG9yaWdpbmFsIHBhcmVudCkuCitjbGFzcyBDb25zdGFudEluaXRGdXR1cmUgeworICB1c2luZyBQYWlyVHkgPSBsbHZtOjpQb2ludGVyVW5pb248Q29uc3RhbnRJbml0QnVpbGRlckJhc2UqLCBsbHZtOjpDb25zdGFudCo+OworCisgIFBhaXJUeSBEYXRhOworCisgIGZyaWVuZCBjbGFzcyBDb25zdGFudEluaXRCdWlsZGVyQmFzZTsKKyAgZXhwbGljaXQgQ29uc3RhbnRJbml0RnV0dXJlKENvbnN0YW50SW5pdEJ1aWxkZXJCYXNlICpidWlsZGVyKTsKKworcHVibGljOgorICBDb25zdGFudEluaXRGdXR1cmUoKSB7fQorCisgIC8vLyBBIGZ1dHVyZSBjYW4gYmUgZXhwbGljaXRseSBjcmVhdGVkIGZyb20gYSBmaXhlZCBpbml0aWFsaXplci4KKyAgZXhwbGljaXQgQ29uc3RhbnRJbml0RnV0dXJlKGxsdm06OkNvbnN0YW50ICppbml0aWFsaXplcikgOiBEYXRhKGluaXRpYWxpemVyKSB7CisgICAgYXNzZXJ0KGluaXRpYWxpemVyICYmICJjcmVhdGluZyBudWxsIGZ1dHVyZSIpOworICB9CisKKyAgLy8vIElzIHRoaXMgZnV0dXJlIG5vbi1udWxsPworICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gYm9vbChEYXRhKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGluaXRpYWxpemVyLgorICBsbHZtOjpUeXBlICpnZXRUeXBlKCkgY29uc3Q7CisKKyAgLy8vIEFiYW5kb24gdGhpcyBpbml0aWFsaXplci4KKyAgdm9pZCBhYmFuZG9uKCk7CisKKyAgLy8vIEluc3RhbGwgdGhlIGluaXRpYWxpemVyIGludG8gYSBnbG9iYWwgdmFyaWFibGUuICBUaGlzIGNhbm5vdAorICAvLy8gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgorICB2b2lkIGluc3RhbGxJbkdsb2JhbChsbHZtOjpHbG9iYWxWYXJpYWJsZSAqZ2xvYmFsKTsKKworICB2b2lkICpnZXRPcGFxdWVWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIERhdGEuZ2V0T3BhcXVlVmFsdWUoKTsgfQorICBzdGF0aWMgQ29uc3RhbnRJbml0RnV0dXJlIGdldEZyb21PcGFxdWVWYWx1ZSh2b2lkICp2YWx1ZSkgeworICAgIENvbnN0YW50SW5pdEZ1dHVyZSByZXN1bHQ7CisgICAgcmVzdWx0LkRhdGEgPSBQYWlyVHk6OmdldEZyb21PcGFxdWVWYWx1ZSh2YWx1ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBlbnVtIHsKKyAgICBOdW1Mb3dCaXRzQXZhaWxhYmxlID0KKyAgICAgIGxsdm06OlBvaW50ZXJMaWtlVHlwZVRyYWl0czxQYWlyVHk+OjpOdW1Mb3dCaXRzQXZhaWxhYmxlCisgIH07Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIENvZGVHZW4KK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFBvaW50ZXJMaWtlVHlwZVRyYWl0czwgOjpjbGFuZzo6Q29kZUdlbjo6Q29uc3RhbnRJbml0RnV0dXJlPiB7CisgIHVzaW5nIFQgPSA6OmNsYW5nOjpDb2RlR2VuOjpDb25zdGFudEluaXRGdXR1cmU7CisKKyAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKFQgZnV0dXJlKSB7CisgICAgcmV0dXJuIGZ1dHVyZS5nZXRPcGFxdWVWYWx1ZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgVCBnZXRGcm9tVm9pZFBvaW50ZXIodm9pZCAqcCkgeworICAgIHJldHVybiBUOjpnZXRGcm9tT3BhcXVlVmFsdWUocCk7CisgIH0KKyAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSBUOjpOdW1Mb3dCaXRzQXZhaWxhYmxlIH07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0NvZGVHZW4vTW9kdWxlQnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9Nb2R1bGVCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTExMGY2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0NvZGVHZW4vTW9kdWxlQnVpbGRlci5oCkBAIC0wLDAgKzEsMTA2IEBACisvLz09PS0tLSBDb2RlR2VuL01vZHVsZUJ1aWxkZXIuaCAtIEJ1aWxkIExMVk0gZnJvbSBBU1RzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgTW9kdWxlQnVpbGRlciBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0NPREVHRU5fTU9EVUxFQlVJTERFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQ09ERUdFTl9NT0RVTEVCVUlMREVSX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb25zdW1lci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIENvbnN0YW50OworICBjbGFzcyBMTFZNQ29udGV4dDsKKyAgY2xhc3MgTW9kdWxlOworICBjbGFzcyBTdHJpbmdSZWY7Cit9CisKK25hbWVzcGFjZSBjbGFuZyB7CisgIGNsYXNzIENvZGVHZW5PcHRpb25zOworICBjbGFzcyBDb3ZlcmFnZVNvdXJjZUluZm87CisgIGNsYXNzIERlY2w7CisgIGNsYXNzIERpYWdub3N0aWNzRW5naW5lOworICBjbGFzcyBHbG9iYWxEZWNsOworICBjbGFzcyBIZWFkZXJTZWFyY2hPcHRpb25zOworICBjbGFzcyBMYW5nT3B0aW9uczsKKyAgY2xhc3MgUHJlcHJvY2Vzc29yT3B0aW9uczsKKworbmFtZXNwYWNlIENvZGVHZW4geworICBjbGFzcyBDb2RlR2VuTW9kdWxlOworICBjbGFzcyBDR0RlYnVnSW5mbzsKK30KKworLy8vIFRoZSBwcmltYXJ5IHB1YmxpYyBpbnRlcmZhY2UgdG8gdGhlIENsYW5nIGNvZGUgZ2VuZXJhdG9yLgorLy8vCisvLy8gVGhpcyBpcyBub3QgcmVhbGx5IGFuIGFic3RyYWN0IGludGVyZmFjZS4KK2NsYXNzIENvZGVHZW5lcmF0b3IgOiBwdWJsaWMgQVNUQ29uc3VtZXIgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3B1YmxpYzoKKyAgLy8vIFJldHVybiBhbiBvcGFxdWUgcmVmZXJlbmNlIHRvIHRoZSBDb2RlR2VuTW9kdWxlIG9iamVjdCwgd2hpY2ggY2FuCisgIC8vLyBiZSB1c2VkIGluIHZhcmlvdXMgc2Vjb25kYXJ5IEFQSXMuICBJdCBpcyB2YWxpZCBhcyBsb25nIGFzIHRoZQorICAvLy8gQ29kZUdlbmVyYXRvciBleGlzdHMuCisgIENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgJkNHTSgpOworCisgIC8vLyBSZXR1cm4gdGhlIG1vZHVsZSB0aGF0IHRoaXMgY29kZSBnZW5lcmF0b3IgaXMgYnVpbGRpbmcgaW50by4KKyAgLy8vCisgIC8vLyBUaGlzIG1heSByZXR1cm4gbnVsbCBhZnRlciBIYW5kbGVUcmFuc2xhdGlvblVuaXQgaXMgY2FsbGVkOworICAvLy8gdGhpcyBzaWduaWZpZXMgdGhhdCB0aGVyZSB3YXMgYW4gZXJyb3IgZ2VuZXJhdGluZyBjb2RlLiAgQQorICAvLy8gZGlhZ25vc3RpYyB3aWxsIGhhdmUgYmVlbiBnZW5lcmF0ZWQgaW4gdGhpcyBjYXNlLCBhbmQgdGhlIG1vZHVsZQorICAvLy8gd2lsbCBiZSBkZWxldGVkLgorICAvLy8KKyAgLy8vIEl0IHdpbGwgYWxzbyByZXR1cm4gbnVsbCBpZiB0aGUgbW9kdWxlIGlzIHJlbGVhc2VkLgorICBsbHZtOjpNb2R1bGUgKkdldE1vZHVsZSgpOworCisgIC8vLyBSZWxlYXNlIG93bmVyc2hpcCBvZiB0aGUgbW9kdWxlIHRvIHRoZSBjYWxsZXIuCisgIC8vLworICAvLy8gSXQgaXMgaWxsZWdhbCB0byBjYWxsIG1ldGhvZHMgb3RoZXIgdGhhbiBHZXRNb2R1bGUgb24gdGhlCisgIC8vLyBDb2RlR2VuZXJhdG9yIGFmdGVyIHJlbGVhc2luZyBpdHMgbW9kdWxlLgorICBsbHZtOjpNb2R1bGUgKlJlbGVhc2VNb2R1bGUoKTsKKworICAvLy8gUmV0dXJuIGRlYnVnIGluZm8gY29kZSBnZW5lcmF0b3IuCisgIENvZGVHZW46OkNHRGVidWdJbmZvICpnZXRDR0RlYnVnSW5mbygpOworCisgIC8vLyBHaXZlbiBhIG1hbmdsZWQgbmFtZSwgcmV0dXJuIGEgZGVjbGFyYXRpb24gd2hpY2ggbWFuZ2xlcyB0aGF0IHdheQorICAvLy8gd2hpY2ggaGFzIGJlZW4gYWRkZWQgdG8gdGhpcyBjb2RlIGdlbmVyYXRvciB2aWEgYSBIYW5kbGUgbWV0aG9kLgorICAvLy8KKyAgLy8vIFRoaXMgbWF5IHJldHVybiBudWxsIGlmIHRoZXJlIHdhcyBubyBtYXRjaGluZyBkZWNsYXJhdGlvbi4KKyAgY29uc3QgRGVjbCAqR2V0RGVjbEZvck1hbmdsZWROYW1lKGxsdm06OlN0cmluZ1JlZiBNYW5nbGVkTmFtZSk7CisKKyAgLy8vIFJldHVybiB0aGUgTExWTSBhZGRyZXNzIG9mIHRoZSBnaXZlbiBnbG9iYWwgZW50aXR5LgorICAvLy8KKyAgLy8vIFxwYXJhbSBpc0ZvckRlZmluaXRpb24gSWYgdHJ1ZSwgdGhlIGNhbGxlciBpbnRlbmRzIHRvIGRlZmluZSB0aGUKKyAgLy8vICAgZW50aXR5OyB0aGUgb2JqZWN0IHJldHVybmVkIHdpbGwgYmUgYW4gbGx2bTo6R2xvYmFsVmFsdWUgb2YKKyAgLy8vICAgc29tZSBzb3J0LiAgSWYgZmFsc2UsIHRoZSBjYWxsZXIganVzdCBpbnRlbmRzIHRvIHVzZSB0aGUgZW50aXR5OworICAvLy8gICB0aGUgb2JqZWN0IHJldHVybmVkIG1heSBiZSBhbnkgc29ydCBvZiBjb25zdGFudCB2YWx1ZSwgYW5kIHRoZQorICAvLy8gICBjb2RlIGdlbmVyYXRvciB3aWxsIHNjaGVkdWxlIHRoZSBlbnRpdHkgZm9yIGVtaXNzaW9uIGlmIGEKKyAgLy8vICAgZGVmaW5pdGlvbiBoYXMgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhpcyBjb2RlIGdlbmVyYXRvci4KKyAgbGx2bTo6Q29uc3RhbnQgKkdldEFkZHJPZkdsb2JhbChHbG9iYWxEZWNsIGRlY2wsIGJvb2wgaXNGb3JEZWZpbml0aW9uKTsKKworICAvLy8gQ3JlYXRlIGEgbmV3IFxjIGxsdm06Ok1vZHVsZSBhZnRlciBjYWxsaW5nIEhhbmRsZVRyYW5zbGF0aW9uVW5pdC4gVGhpcworICAvLy8gZW5hYmxlIGNvZGVnZW4gaW4gaW50ZXJhY3RpdmUgcHJvY2Vzc2luZyBlbnZpcm9ubWVudHMuCisgIGxsdm06Ok1vZHVsZSogU3RhcnRNb2R1bGUobGx2bTo6U3RyaW5nUmVmIE1vZHVsZU5hbWUsIGxsdm06OkxMVk1Db250ZXh0ICZDKTsKK307CisKKy8vLyBDcmVhdGVMTFZNQ29kZUdlbiAtIENyZWF0ZSBhIENvZGVHZW5lcmF0b3IgaW5zdGFuY2UuCisvLy8gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gY2FsbCBkZWxldGUgb24KKy8vLyB0aGUgYWxsb2NhdGVkIENvZGVHZW5lcmF0b3IgaW5zdGFuY2UuCitDb2RlR2VuZXJhdG9yICpDcmVhdGVMTFZNQ29kZUdlbihEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgTW9kdWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhlYWRlclNlYXJjaE9wdGlvbnMgJkhlYWRlclNlYXJjaE9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVwcm9jZXNzb3JPcHRpb25zICZQcmVwcm9jZXNzb3JPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZUdlbk9wdGlvbnMgJkNHTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkxMVk1Db250ZXh0JiBDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ292ZXJhZ2VTb3VyY2VJbmZvICpDb3ZlcmFnZUluZm8gPSBudWxscHRyKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9PYmplY3RGaWxlUENIQ29udGFpbmVyT3BlcmF0aW9ucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9PYmplY3RGaWxlUENIQ29udGFpbmVyT3BlcmF0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YmU2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Db2RlR2VuL09iamVjdEZpbGVQQ0hDb250YWluZXJPcGVyYXRpb25zLmgKQEAgLTAsMCArMSw0MyBAQAorLy89PT0tLSBDb2RlR2VuL09iamVjdEZpbGVQQ0hDb250YWluZXJPcGVyYXRpb25zLmggLSAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0NPREVHRU5fT0JKRUNUX0ZJTEVfUENIX0NPTlRBSU5FUl9PUEVSQVRJT05TX0gKKyNkZWZpbmUgTExWTV9DTEFOR19DT0RFR0VOX09CSkVDVF9GSUxFX1BDSF9DT05UQUlORVJfT1BFUkFUSU9OU19ICisKKyNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9QQ0hDb250YWluZXJPcGVyYXRpb25zLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKKy8vLyBBIFBDSENvbnRhaW5lcldyaXRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgTExWTSB0bworLy8vIHdyYXBzIENsYW5nIG1vZHVsZXMgaW5zaWRlIGEgQ09GRiwgRUxGLCBvciBNYWNoLU8gY29udGFpbmVyLgorY2xhc3MgT2JqZWN0RmlsZVBDSENvbnRhaW5lcldyaXRlciA6IHB1YmxpYyBQQ0hDb250YWluZXJXcml0ZXIgeworICBTdHJpbmdSZWYgZ2V0Rm9ybWF0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIm9iaiI7IH0KKworICAvLy8gUmV0dXJuIGFuIEFTVENvbnN1bWVyIHRoYXQgY2FuIGJlIGNoYWluZWQgd2l0aCBhCisgIC8vLyBQQ0hHZW5lcmF0b3IgdGhhdCBwcm9kdWNlcyBhIHdyYXBwZXIgZmlsZSBmb3JtYXQKKyAgLy8vIHRoYXQgYWxzbyBjb250YWlucyBmdWxsIGRlYnVnIGluZm8gZm9yIHRoZSBtb2R1bGUuCisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RDb25zdW1lcj4KKyAgQ3JlYXRlUENIQ29udGFpbmVyR2VuZXJhdG9yKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk1haW5GaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZPdXRwdXRGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpyYXdfcHdyaXRlX3N0cmVhbT4gT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UENIQnVmZmVyPiBCdWZmZXIpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vIEEgUENIQ29udGFpbmVyUmVhZGVyIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBMTFZNIHRvCisvLy8gd3JhcHMgQ2xhbmcgbW9kdWxlcyBpbnNpZGUgYSBDT0ZGLCBFTEYsIG9yIE1hY2gtTyBjb250YWluZXIuCitjbGFzcyBPYmplY3RGaWxlUENIQ29udGFpbmVyUmVhZGVyIDogcHVibGljIFBDSENvbnRhaW5lclJlYWRlciB7CisgIFN0cmluZ1JlZiBnZXRGb3JtYXQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAib2JqIjsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBzZXJpYWxpemVkIEFTVCBpbnNpZGUgdGhlIFBDSCBjb250YWluZXIgQnVmZmVyLgorICBTdHJpbmdSZWYgRXh0cmFjdFBDSChsbHZtOjpNZW1vcnlCdWZmZXJSZWYgQnVmZmVyKSBjb25zdCBvdmVycmlkZTsKK307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9Td2lmdENhbGxpbmdDb252LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Db2RlR2VuL1N3aWZ0Q2FsbGluZ0NvbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWEyYjlkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9Td2lmdENhbGxpbmdDb252LmgKQEAgLTAsMCArMSwxNzYgQEAKKy8vPT0tLSBTd2lmdENhbGxpbmdDb252LmggLSBTd2lmdCBBQkkgbG93ZXJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVmaW5lcyBjb25zdGFudHMgYW5kIHR5cGVzIHJlbGF0ZWQgdG8gU3dpZnQgQUJJIGxvd2VyaW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19DT0RFR0VOX1NXSUZUQ0FMTElOR0NPTlZfSAorI2RlZmluZSBMTFZNX0NMQU5HX0NPREVHRU5fU1dJRlRDQUxMSU5HQ09OVl9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvQ2Fub25pY2FsVHlwZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9DaGFyVW5pdHMuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9UcmFpbGluZ09iamVjdHMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEludGVnZXJUeXBlOworICBjbGFzcyBUeXBlOworICBjbGFzcyBTdHJ1Y3RUeXBlOworICBjbGFzcyBWZWN0b3JUeXBlOworfQorCituYW1lc3BhY2UgY2xhbmcgeworY2xhc3MgRGVjbDsKK2NsYXNzIEZpZWxkRGVjbDsKK2NsYXNzIEFTVFJlY29yZExheW91dDsKKworbmFtZXNwYWNlIENvZGVHZW4geworY2xhc3MgQUJJQXJnSW5mbzsKK2NsYXNzIENvZGVHZW5Nb2R1bGU7CitjbGFzcyBDR0Z1bmN0aW9uSW5mbzsKKworbmFtZXNwYWNlIHN3aWZ0Y2FsbCB7CisKK2NsYXNzIFN3aWZ0QWdnTG93ZXJpbmcgeworICBDb2RlR2VuTW9kdWxlICZDR007CisKKyAgc3RydWN0IFN0b3JhZ2VFbnRyeSB7CisgICAgQ2hhclVuaXRzIEJlZ2luOworICAgIENoYXJVbml0cyBFbmQ7CisgICAgbGx2bTo6VHlwZSAqVHlwZTsKKworICAgIENoYXJVbml0cyBnZXRXaWR0aCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBFbmQgLSBCZWdpbjsKKyAgICB9CisgIH07CisgIFNtYWxsVmVjdG9yPFN0b3JhZ2VFbnRyeSwgND4gRW50cmllczsKKyAgYm9vbCBGaW5pc2hlZCA9IGZhbHNlOworCitwdWJsaWM6CisgIFN3aWZ0QWdnTG93ZXJpbmcoQ29kZUdlbk1vZHVsZSAmQ0dNKSA6IENHTShDR00pIHt9CisKKyAgdm9pZCBhZGRPcGFxdWVEYXRhKENoYXJVbml0cyBiZWdpbiwgQ2hhclVuaXRzIGVuZCkgeworICAgIGFkZEVudHJ5KG51bGxwdHIsIGJlZ2luLCBlbmQpOworICB9CisKKyAgdm9pZCBhZGRUeXBlZERhdGEoUXVhbFR5cGUgdHlwZSwgQ2hhclVuaXRzIGJlZ2luKTsKKyAgdm9pZCBhZGRUeXBlZERhdGEoY29uc3QgUmVjb3JkRGVjbCAqcmVjb3JkLCBDaGFyVW5pdHMgYmVnaW4pOworICB2b2lkIGFkZFR5cGVkRGF0YShjb25zdCBSZWNvcmREZWNsICpyZWNvcmQsIENoYXJVbml0cyBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZsYXlvdXQpOworICB2b2lkIGFkZFR5cGVkRGF0YShsbHZtOjpUeXBlICp0eXBlLCBDaGFyVW5pdHMgYmVnaW4pOworICB2b2lkIGFkZFR5cGVkRGF0YShsbHZtOjpUeXBlICp0eXBlLCBDaGFyVW5pdHMgYmVnaW4sIENoYXJVbml0cyBlbmQpOworCisgIHZvaWQgZmluaXNoKCk7CisKKyAgLy8vIERvZXMgdGhpcyBsb3dlcmluZyByZXF1aXJlIHBhc3NpbmcgYW55IGRhdGE/CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgYXNzZXJ0KEZpbmlzaGVkICYmICJkaWRuJ3QgZmluaXNoIGxvd2VyaW5nIGJlZm9yZSBjYWxsaW5nIGVtcHR5KCkiKTsKKyAgICByZXR1cm4gRW50cmllcy5lbXB0eSgpOworICB9CisKKyAgLy8vIEFjY29yZGluZyB0byB0aGUgdGFyZ2V0IFN3aWZ0IEFCSSwgc2hvdWxkIGEgdmFsdWUgd2l0aCB0aGlzIGxvd2VyaW5nCisgIC8vLyBiZSBwYXNzZWQgaW5kaXJlY3RseT8KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBkZWNpc2lvbiBpcyBiYXNlZCBwdXJlbHkgb24gdGhlIGRhdGEgbGF5b3V0IG9mIHRoZQorICAvLy8gdmFsdWUgYW5kIGRvZXMgbm90IGNvbnNpZGVyIHdoZXRoZXIgdGhlIHR5cGUgaXMgYWRkcmVzcy1vbmx5LAorICAvLy8gbXVzdCBiZSBwYXNzZWQgaW5kaXJlY3RseSB0byBtYXRjaCBhIGZ1bmN0aW9uIGFic3RyYWN0aW9uIHBhdHRlcm4sIG9yCisgIC8vLyBhbnl0aGluZyBlbHNlIHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgaGFuZGxlZCBieSBoaWdoLWxldmVsIGxvd2VyaW5nLgorICAvLy8KKyAgLy8vIFxwYXJhbSBhc1JldHVyblZhbHVlIC0gaWYgdHJ1ZSwgYW5zd2VyIHdoZXRoZXIgaXQgc2hvdWxkIGJlIHBhc3NlZAorICAvLy8gICBpbmRpcmVjdGx5IGFzIGEgcmV0dXJuIHZhbHVlOyBpZiBmYWxzZSwgYW5zd2VyIHdoZXRoZXIgaXQgc2hvdWxkIGJlCisgIC8vLyAgIHBhc3NlZCBpbmRpcmVjdGx5IGFzIGFuIGFyZ3VtZW50CisgIGJvb2wgc2hvdWxkUGFzc0luZGlyZWN0bHkoYm9vbCBhc1JldHVyblZhbHVlKSBjb25zdDsKKworICB1c2luZyBFbnVtZXJhdGlvbkNhbGxiYWNrID0KKyAgICBsbHZtOjpmdW5jdGlvbl9yZWY8dm9pZChDaGFyVW5pdHMgb2Zmc2V0LCBDaGFyVW5pdHMgZW5kLCBsbHZtOjpUeXBlICp0eXBlKT47CisKKyAgLy8vIEVudW1lcmF0ZSB0aGUgZXhwYW5kZWQgY29tcG9uZW50cyBvZiB0aGlzIHR5cGUuCisgIC8vLworICAvLy8gVGhlIGNvbXBvbmVudCB0eXBlcyB3aWxsIGFsd2F5cyBiZSBsZWdhbCB2ZWN0b3IsIGZsb2F0aW5nLXBvaW50LAorICAvLy8gaW50ZWdlciwgb3IgcG9pbnRlciB0eXBlcy4KKyAgdm9pZCBlbnVtZXJhdGVDb21wb25lbnRzKEVudW1lcmF0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHR5cGVzIGZvciBhIGNvZXJjZS1hbmQtZXhwYW5kIG9wZXJhdGlvbi4KKyAgLy8vCisgIC8vLyBUaGUgZmlyc3QgdHlwZSBtYXRjaGVzIHRoZSBtZW1vcnkgbGF5b3V0IG9mIHRoZSBkYXRhIHRoYXQncyBiZWVuCisgIC8vLyBhZGRlZCB0byB0aGlzIHN0cnVjdHVyZSwgaW5jbHVkaW5nIGV4cGxpY2l0IFtOIHggaThdIGFycmF5cyBmb3IgYW55CisgIC8vLyBpbnRlcm5hbCBwYWRkaW5nLgorICAvLy8KKyAgLy8vIFRoZSBzZWNvbmQgdHlwZSByZW1vdmVzIGFueSBpbnRlcm5hbCBwYWRkaW5nIG1lbWJlcnMgYW5kLCBpZiBvbmx5CisgIC8vLyBvbmUgZWxlbWVudCByZW1haW5zLCBpcyBzaW1wbHkgdGhhdCBlbGVtZW50IHR5cGUuCisgIHN0ZDo6cGFpcjxsbHZtOjpTdHJ1Y3RUeXBlKiwgbGx2bTo6VHlwZSo+IGdldENvZXJjZUFuZEV4cGFuZFR5cGVzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIHZvaWQgYWRkQml0RmllbGREYXRhKGNvbnN0IEZpZWxkRGVjbCAqZmllbGQsIENoYXJVbml0cyBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYml0T2Zmc2V0KTsKKyAgdm9pZCBhZGRMZWdhbFR5cGVkRGF0YShsbHZtOjpUeXBlICp0eXBlLCBDaGFyVW5pdHMgYmVnaW4sIENoYXJVbml0cyBlbmQpOworICB2b2lkIGFkZEVudHJ5KGxsdm06OlR5cGUgKnR5cGUsIENoYXJVbml0cyBiZWdpbiwgQ2hhclVuaXRzIGVuZCk7CisgIHZvaWQgc3BsaXRWZWN0b3JFbnRyeSh1bnNpZ25lZCBpbmRleCk7Cit9OworCisvLy8gU2hvdWxkIGFuIGFnZ3JlZ2F0ZSB3aGljaCBleHBhbmRzIHRvIHRoZSBnaXZlbiB0eXBlIHNlcXVlbmNlCisvLy8gYmUgcGFzc2VkL3JldHVybmVkIGluZGlyZWN0bHkgdW5kZXIgc3dpZnRjYWxsPworYm9vbCBzaG91bGRQYXNzSW5kaXJlY3RseShDb2RlR2VuTW9kdWxlICZDR00sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGxsdm06OlR5cGUqPiB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhc1JldHVyblZhbHVlKTsKKworLy8vIFJldHVybiB0aGUgbWF4aW11bSB2b2x1bnRhcnkgaW50ZWdlciBzaXplIGZvciB0aGUgY3VycmVudCB0YXJnZXQuCitDaGFyVW5pdHMgZ2V0TWF4aW11bVZvbHVudGFyeUludGVnZXJTaXplKENvZGVHZW5Nb2R1bGUgJkNHTSk7CisKKy8vLyBSZXR1cm4gdGhlIFN3aWZ0IENDJ3Mgbm90aW9uIG9mIHRoZSBuYXR1cmFsIGFsaWdubWVudCBvZiBhIHR5cGUuCitDaGFyVW5pdHMgZ2V0TmF0dXJhbEFsaWdubWVudChDb2RlR2VuTW9kdWxlICZDR00sIGxsdm06OlR5cGUgKnR5cGUpOworCisvLy8gSXMgdGhlIGdpdmVuIGludGVnZXIgdHlwZSAibGVnYWwiIGZvciBTd2lmdCdzIHBlcnNwZWN0aXZlIG9uIHRoZQorLy8vIGN1cnJlbnQgcGxhdGZvcm0/Citib29sIGlzTGVnYWxJbnRlZ2VyVHlwZShDb2RlR2VuTW9kdWxlICZDR00sIGxsdm06OkludGVnZXJUeXBlICp0eXBlKTsKKworLy8vIElzIHRoZSBnaXZlbiB2ZWN0b3IgdHlwZSAibGVnYWwiIGZvciBTd2lmdCdzIHBlcnNwZWN0aXZlIG9uIHRoZQorLy8vIGN1cnJlbnQgcGxhdGZvcm0/Citib29sIGlzTGVnYWxWZWN0b3JUeXBlKENvZGVHZW5Nb2R1bGUgJkNHTSwgQ2hhclVuaXRzIHZlY3RvclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZlY3RvclR5cGUgKnZlY3RvclR5KTsKK2Jvb2wgaXNMZWdhbFZlY3RvclR5cGUoQ29kZUdlbk1vZHVsZSAmQ0dNLCBDaGFyVW5pdHMgdmVjdG9yU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VHlwZSAqZWx0VHksIHVuc2lnbmVkIG51bUVsdHMpOworCisvLy8gTWluaW1hbGx5IHNwbGl0IGEgbGVnYWwgdmVjdG9yIHR5cGUuCitzdGQ6OnBhaXI8bGx2bTo6VHlwZSosIHVuc2lnbmVkPgorc3BsaXRMZWdhbFZlY3RvclR5cGUoQ29kZUdlbk1vZHVsZSAmQ0dNLCBDaGFyVW5pdHMgdmVjdG9yU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZlY3RvclR5cGUgKnZlY3RvclR5KTsKKworLy8vIFR1cm4gYSB2ZWN0b3IgdHlwZSBpbiBhIHNlcXVlbmNlIG9mIGxlZ2FsIGNvbXBvbmVudCB2ZWN0b3IgdHlwZXMuCisvLy8KKy8vLyBUaGUgY2FsbGVyIG1heSBhc3N1bWUgdGhhdCB0aGUgc3VtIG9mIHRoZSBkYXRhIHNpemVzIG9mIHRoZSByZXN1bHRpbmcKKy8vLyB0eXBlcyB3aWxsIGVxdWFsIHRoZSBkYXRhIHNpemUgb2YgdGhlIHZlY3RvciB0eXBlLgordm9pZCBsZWdhbGl6ZVZlY3RvclR5cGUoQ29kZUdlbk1vZHVsZSAmQ0dNLCBDaGFyVW5pdHMgdmVjdG9yU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZlY3RvclR5cGUgKnZlY3RvclR5LAorICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxWZWN0b3JJbXBsPGxsdm06OlR5cGUqPiAmdHlwZXMpOworCisvLy8gU2hvdWxkIGEgQysrIHJlY29yZCB0eXBlIGJlIHBhc3NlZCBhbmQgcmV0dXJuZWQgaW5kaXJlY3RseT8KK2Jvb2wgc2hvdWxkUGFzc0NYWFJlY29yZEluZGlyZWN0bHkoQ29kZUdlbk1vZHVsZSAmQ0dNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpyZWNvcmQpOworCisvLy8gQ2xhc3NpZnkgdGhlIHJ1bGVzIGZvciBob3cgdG8gcmV0dXJuIGEgcGFydGljdWxhciB0eXBlLgorQUJJQXJnSW5mbyBjbGFzc2lmeVJldHVyblR5cGUoQ29kZUdlbk1vZHVsZSAmQ0dNLCBDYW5RdWFsVHlwZSB0eXBlKTsKKworLy8vIENsYXNzaWZ5IHRoZSBydWxlcyBmb3IgaG93IHRvIHBhc3MgYSBwYXJ0aWN1bGFyIHR5cGUuCitBQklBcmdJbmZvIGNsYXNzaWZ5QXJndW1lbnRUeXBlKENvZGVHZW5Nb2R1bGUgJkNHTSwgQ2FuUXVhbFR5cGUgdHlwZSk7CisKKy8vLyBDb21wdXRlIHRoZSBBQkkgaW5mb3JtYXRpb24gb2YgYSBzd2lmdGNhbGwgZnVuY3Rpb24uICBUaGlzIGlzIGEKKy8vLyBwcml2YXRlIGludGVyZmFjZSBmb3IgQ2xhbmcuCit2b2lkIGNvbXB1dGVBQklJbmZvKENvZGVHZW5Nb2R1bGUgJkNHTSwgQ0dGdW5jdGlvbkluZm8gJkZJKTsKKworLy8vIElzIHN3aWZ0ZXJyb3IgbG93ZXJlZCB0byBhIHJlZ2lzdGVyIGJ5IHRoZSB0YXJnZXQgQUJJLgorYm9vbCBpc1N3aWZ0RXJyb3JMb3dlcmVkSW5SZWdpc3RlcihDb2RlR2VuTW9kdWxlICZDR00pOworCit9IC8vIGVuZCBuYW1lc3BhY2Ugc3dpZnRjYWxsCit9IC8vIGVuZCBuYW1lc3BhY2UgQ29kZUdlbgorfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQ29uZmlnL2NvbmZpZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQ29uZmlnL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzN2E0NzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Db25maWcvY29uZmlnLmgKQEAgLTAsMCArMSw4MCBAQAorLyogVGhpcyBnZW5lcmF0ZWQgZmlsZSBpcyBmb3IgaW50ZXJuYWwgdXNlLiBEbyBub3QgaW5jbHVkZSBpdCBmcm9tIGhlYWRlcnMuICovCisKKyNpZmRlZiBDTEFOR19DT05GSUdfSAorI2Vycm9yIGNvbmZpZy5oIGNhbiBvbmx5IGJlIGluY2x1ZGVkIG9uY2UKKyNlbHNlCisjZGVmaW5lIENMQU5HX0NPTkZJR19ICisKKy8qIEJ1ZyByZXBvcnQgVVJMLiAqLworI2RlZmluZSBCVUdfUkVQT1JUX1VSTCAiaHR0cHM6Ly9idWdzLmxsdm0ub3JnLyIKKworLyogRGVmYXVsdCBsaW5rZXIgdG8gdXNlLiAqLworI2RlZmluZSBDTEFOR19ERUZBVUxUX0xJTktFUiAiIgorCisvKiBEZWZhdWx0IEMvT2JqQyBzdGFuZGFyZCB0byB1c2UuICovCisvKiAjdW5kZWYgQ0xBTkdfREVGQVVMVF9TVERfQyAqLworCisvKiBEZWZhdWx0IEMrKy9PYmpDKysgc3RhbmRhcmQgdG8gdXNlLiAqLworLyogI3VuZGVmIENMQU5HX0RFRkFVTFRfU1REX0NYWCAqLworCisvKiBEZWZhdWx0IEMrKyBzdGRsaWIgdG8gdXNlLiAqLworI2RlZmluZSBDTEFOR19ERUZBVUxUX0NYWF9TVERMSUIgIiIKKworLyogRGVmYXVsdCBydW50aW1lIGxpYnJhcnkgdG8gdXNlLiAqLworI2RlZmluZSBDTEFOR19ERUZBVUxUX1JUTElCICIiCisKKy8qIERlZmF1bHQgb2JqY29weSB0byB1c2UgKi8KKyNkZWZpbmUgQ0xBTkdfREVGQVVMVF9PQkpDT1BZICJvYmpjb3B5IgorCisvKiBEZWZhdWx0IE9wZW5NUCBydW50aW1lIHVzZWQgYnkgLWZvcGVubXAuICovCisjZGVmaW5lIENMQU5HX0RFRkFVTFRfT1BFTk1QX1JVTlRJTUUgImxpYm9tcCIKKworLyogRGVmYXVsdCBhcmNoaXRlY3R1cmUgZm9yIE9wZW5NUCBvZmZsb2FkaW5nIHRvIE52aWRpYSBHUFVzLiAqLworI2RlZmluZSBDTEFOR19PUEVOTVBfTlZQVFhfREVGQVVMVF9BUkNIICJzbV8zNSIKKworLyogTXVsdGlsaWIgc3VmZml4IGZvciBsaWJkaXIuICovCisjZGVmaW5lIENMQU5HX0xJQkRJUl9TVUZGSVggIjY0IgorCisvKiBSZWxhdGl2ZSBkaXJlY3RvcnkgZm9yIHJlc291cmNlIGZpbGVzICovCisjZGVmaW5lIENMQU5HX1JFU09VUkNFX0RJUiAiIgorCisvKiBEaXJlY3RvcmllcyBjbGFuZyB3aWxsIHNlYXJjaCBmb3IgaGVhZGVycyAqLworI2RlZmluZSBDX0lOQ0xVREVfRElSUyAiIgorCisvKiBEaXJlY3RvcmllcyBjbGFuZyB3aWxsIHNlYXJjaCBmb3IgY29uZmlndXJhdGlvbiBmaWxlcyAqLworLyogI3VuZGVmIENMQU5HX0NPTkZJR19GSUxFX1NZU1RFTV9ESVIgKi8KKy8qICN1bmRlZiBDTEFOR19DT05GSUdfRklMRV9VU0VSX0RJUiAqLworCisvKiBEZWZhdWx0IDxwYXRoPiB0byBhbGwgY29tcGlsZXIgaW52b2NhdGlvbnMgZm9yIC0tc3lzcm9vdD08cGF0aD4uICovCisjZGVmaW5lIERFRkFVTFRfU1lTUk9PVCAiIgorCisvKiBEaXJlY3Rvcnkgd2hlcmUgZ2NjIGlzIGluc3RhbGxlZC4gKi8KKyNkZWZpbmUgR0NDX0lOU1RBTExfUFJFRklYICIiCisKKy8qIERlZmluZSBpZiB3ZSBoYXZlIGxpYnhtbDIgKi8KKy8qICN1bmRlZiBDTEFOR19IQVZFX0xJQlhNTCAqLworCisvKiBEZWZpbmUgaWYgd2UgaGF2ZSB6MyBhbmQgd2FudCB0byBidWlsZCBpdCAqLworLyogI3VuZGVmIENMQU5HX0FOQUxZWkVSX1dJVEhfWjMgKi8KKworLyogRGVmaW5lIGlmIHdlIGhhdmUgc3lzL3Jlc291cmNlLmggKHJsaW1pdHMpICovCisjZGVmaW5lIENMQU5HX0hBVkVfUkxJTUlUUyAxCisKKy8qIFRoZSBMTFZNIHByb2R1Y3QgbmFtZSBhbmQgdmVyc2lvbiAqLworI2RlZmluZSBCQUNLRU5EX1BBQ0tBR0VfU1RSSU5HICJMTFZNIDcuMC4yc3ZuIgorCisvKiBMaW5rZXIgdmVyc2lvbiBkZXRlY3RlZCBhdCBjb21waWxlIHRpbWUuICovCisvKiAjdW5kZWYgSE9TVF9MSU5LX1ZFUlNJT04gKi8KKworLyogcGFzcyAtLWJ1aWxkLWlkIHRvIGxkICovCisvKiAjdW5kZWYgRU5BQkxFX0xJTktFUl9CVUlMRF9JRCAqLworCisvKiBlbmFibGUgeDg2IHJlbGF4IHJlbG9jYXRpb25zIGJ5IGRlZmF1bHQgKi8KKyNkZWZpbmUgRU5BQkxFX1g4Nl9SRUxBWF9SRUxPQ0FUSU9OUyAwCisKKy8qIEVuYWJsZSBlYWNoIGZ1bmN0aW9uYWxpdHkgb2YgbW9kdWxlcyAqLworI2RlZmluZSBDTEFOR19FTkFCTEVfQVJDTVQgMQorI2RlZmluZSBDTEFOR19FTkFCTEVfT0JKQ19SRVdSSVRFUiAxCisjZGVmaW5lIENMQU5HX0VOQUJMRV9TVEFUSUNfQU5BTFlaRVIgMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Nyb3NzVFUvQ3Jvc3NUVURpYWdub3N0aWMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Nyb3NzVFUvQ3Jvc3NUVURpYWdub3N0aWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWQzODMwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQ3Jvc3NUVS9Dcm9zc1RVRGlhZ25vc3RpYy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vPT09LS0tIENyb3NzVFVEaWFnbm9zdGljLmggLSBEaWFnbm9zdGljcyBmb3IgQ3Jvc3MgVFUgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19DUk9TU1RVX0NST1NTVFVESUFHTk9TVElDX0gKKyNkZWZpbmUgTExWTV9DTEFOR19DUk9TU1RVX0NST1NTVFVESUFHTk9TVElDX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWMuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBkaWFnIHsKK2VudW0geworI2RlZmluZSBESUFHKEVOVU0sIEZMQUdTLCBERUZBVUxUX01BUFBJTkcsIERFU0MsIEdST1VQLCBTRklOQUUsIE5PV0VSUk9SLCAgICAgIFwKKyAgICAgICAgICAgICBTSE9XSU5TWVNIRUFERVIsIENBVEVHT1JZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU0sCisjZGVmaW5lIENST1NTVFVTVEFSVAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWNDcm9zc1RVS2luZHMuaW5jIgorI3VuZGVmIERJQUcKKyAgTlVNX0JVSUxUSU5fQ1JPU1NUVV9ESUFHTk9TVElDUworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBkaWFnCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfRlJPTlRFTkRfRlJPTlRFTkRESUFHTk9TVElDX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Nyb3NzVFUvQ3Jvc3NUcmFuc2xhdGlvblVuaXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Nyb3NzVFUvQ3Jvc3NUcmFuc2xhdGlvblVuaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmExNjkwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvQ3Jvc3NUVS9Dcm9zc1RyYW5zbGF0aW9uVW5pdC5oCkBAIC0wLDAgKzEsMTU5IEBACisvLz09PS0tLSBDcm9zc1RyYW5zbGF0aW9uVW5pdC5oIC0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIGxvYWQgYmluYXJ5IEFTVCBkdW1wcyBvbiBkZW1hbmQuIFRoaXMKKy8vICBmZWF0dXJlIGNhbiBiZSB1dGlsaXplZCBmb3IgdG9vbHMgdGhhdCByZXF1aXJlIGNyb3NzIHRyYW5zbGF0aW9uIHVuaXQKKy8vICBzdXBwb3J0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fQ0xBTkdfQ1JPU1NUVV9DUk9TU1RSQU5TTEFUSU9OVU5JVF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQ1JPU1NUVV9DUk9TU1RSQU5TTEFUSU9OVU5JVF9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgY2xhbmcgeworY2xhc3MgQ29tcGlsZXJJbnN0YW5jZTsKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBBU1RJbXBvcnRlcjsKK2NsYXNzIEFTVFVuaXQ7CitjbGFzcyBEZWNsQ29udGV4dDsKK2NsYXNzIEZ1bmN0aW9uRGVjbDsKK2NsYXNzIE5hbWVkRGVjbDsKK2NsYXNzIFRyYW5zbGF0aW9uVW5pdERlY2w7CisKK25hbWVzcGFjZSBjcm9zc190dSB7CisKK2VudW0gY2xhc3MgaW5kZXhfZXJyb3JfY29kZSB7CisgIHVuc3BlY2lmaWVkID0gMSwKKyAgbWlzc2luZ19pbmRleF9maWxlLAorICBpbnZhbGlkX2luZGV4X2Zvcm1hdCwKKyAgbXVsdGlwbGVfZGVmaW5pdGlvbnMsCisgIG1pc3NpbmdfZGVmaW5pdGlvbiwKKyAgZmFpbGVkX2ltcG9ydCwKKyAgZmFpbGVkX3RvX2dldF9leHRlcm5hbF9hc3QsCisgIGZhaWxlZF90b19nZW5lcmF0ZV91c3IKK307CisKK2NsYXNzIEluZGV4RXJyb3IgOiBwdWJsaWMgbGx2bTo6RXJyb3JJbmZvPEluZGV4RXJyb3I+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIEluZGV4RXJyb3IoaW5kZXhfZXJyb3JfY29kZSBDKSA6IENvZGUoQyksIExpbmVObygwKSB7fQorICBJbmRleEVycm9yKGluZGV4X2Vycm9yX2NvZGUgQywgc3RkOjpzdHJpbmcgRmlsZU5hbWUsIGludCBMaW5lTm8gPSAwKQorICAgICAgOiBDb2RlKEMpLCBGaWxlTmFtZShzdGQ6Om1vdmUoRmlsZU5hbWUpKSwgTGluZU5vKExpbmVObykge30KKyAgdm9pZCBsb2cocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworICBpbmRleF9lcnJvcl9jb2RlIGdldENvZGUoKSBjb25zdCB7IHJldHVybiBDb2RlOyB9CisgIGludCBnZXRMaW5lTnVtKCkgY29uc3QgeyByZXR1cm4gTGluZU5vOyB9CisgIHN0ZDo6c3RyaW5nIGdldEZpbGVOYW1lKCkgY29uc3QgeyByZXR1cm4gRmlsZU5hbWU7IH0KKworcHJpdmF0ZToKKyAgaW5kZXhfZXJyb3JfY29kZSBDb2RlOworICBzdGQ6OnN0cmluZyBGaWxlTmFtZTsKKyAgaW50IExpbmVObzsKK307CisKKy8vLyBcYnJpZWYgVGhpcyBmdW5jdGlvbiBwYXJzZXMgYW4gaW5kZXggZmlsZSB0aGF0IGRldGVybWluZXMgd2hpY2gKKy8vLyAgICAgICAgdHJhbnNsYXRpb24gdW5pdCBjb250YWlucyB3aGljaCBkZWZpbml0aW9uLgorLy8vCisvLy8gVGhlIGluZGV4IGZpbGUgZm9ybWF0IGlzIHRoZSBmb2xsb3dpbmc6CisvLy8gZWFjaCBsaW5lIGNvbnNpc3RzIG9mIGFuIFVTUiBhbmQgYSBmaWxlcGF0aCBzZXBhcmF0ZWQgYnkgYSBzcGFjZS4KKy8vLworLy8vIFxyZXR1cm4gUmV0dXJucyBhIG1hcCB3aGVyZSB0aGUgVVNSIGlzIHRoZSBrZXkgYW5kIHRoZSBmaWxlcGF0aCBpcyB0aGUgdmFsdWUKKy8vLyAgICAgICAgIG9yIGFuIGVycm9yLgorbGx2bTo6RXhwZWN0ZWQ8bGx2bTo6U3RyaW5nTWFwPHN0ZDo6c3RyaW5nPj4KK3BhcnNlQ3Jvc3NUVUluZGV4KFN0cmluZ1JlZiBJbmRleFBhdGgsIFN0cmluZ1JlZiBDcm9zc1RVRGlyKTsKKworc3RkOjpzdHJpbmcgY3JlYXRlQ3Jvc3NUVUluZGV4U3RyaW5nKGNvbnN0IGxsdm06OlN0cmluZ01hcDxzdGQ6OnN0cmluZz4gJkluZGV4KTsKKworLy8vIFxicmllZiBUaGlzIGNsYXNzIGlzIHVzZWQgZm9yIHRvb2xzIHRoYXQgcmVxdWlyZXMgY3Jvc3MgdHJhbnNsYXRpb24KKy8vLyAgICAgICAgdW5pdCBjYXBhYmlsaXR5LgorLy8vCisvLy8gVGhpcyBjbGFzcyBjYW4gbG9hZCBmdW5jdGlvbiBkZWZpbml0aW9ucyBmcm9tIGV4dGVybmFsIEFTVCBmaWxlcy4KKy8vLyBUaGUgbG9hZGVkIGRlZmluaXRpb24gd2lsbCBiZSBtZXJnZWQgYmFjayB0byB0aGUgb3JpZ2luYWwgQVNUIHVzaW5nIHRoZQorLy8vIEFTVCBJbXBvcnRlci4KKy8vLyBJbiBvcmRlciB0byB1c2UgdGhpcyBjbGFzcywgYW4gaW5kZXggZmlsZSBpcyByZXF1aXJlZCB0aGF0IGRlc2NyaWJlcworLy8vIHRoZSBsb2NhdGlvbnMgb2YgdGhlIEFTVCBmaWxlcyBmb3IgZWFjaCBmdW5jdGlvbiBkZWZpbml0aW9uLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgY2xhc3MgYWxzbyBpbXBsZW1lbnRzIGNhY2hpbmcuCitjbGFzcyBDcm9zc1RyYW5zbGF0aW9uVW5pdENvbnRleHQgeworcHVibGljOgorICBDcm9zc1RyYW5zbGF0aW9uVW5pdENvbnRleHQoQ29tcGlsZXJJbnN0YW5jZSAmQ0kpOworICB+Q3Jvc3NUcmFuc2xhdGlvblVuaXRDb250ZXh0KCk7CisKKyAgLy8vIFxicmllZiBUaGlzIGZ1bmN0aW9uIGxvYWRzIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBmcm9tIGFuIGV4dGVybmFsIEFTVAorICAvLy8gICAgICAgIGZpbGUgYW5kIG1lcmdlIGl0IGludG8gdGhlIG9yaWdpbmFsIEFTVC4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIG9uIGZ1bmN0aW9ucyB0aGF0IGhhdmUgbm8gZGVmaW5pdGlvbnMgaW4KKyAgLy8vIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uIHVuaXQuIEEgZnVuY3Rpb24gZGVmaW5pdGlvbiB3aXRoIHRoZSBzYW1lCisgIC8vLyBkZWNsYXJhdGlvbiB3aWxsIGJlIGxvb2tlZCB1cCBpbiB0aGUgaW5kZXggZmlsZSB3aGljaCBzaG91bGQgYmUgaW4gdGhlCisgIC8vLyBccCBDcm9zc1RVRGlyIGRpcmVjdG9yeSwgY2FsbGVkIFxwIEluZGV4TmFtZS4gSW4gY2FzZSB0aGUgZGVjbGFyYXRpb24gaXMKKyAgLy8vIGZvdW5kIGluIHRoZSBpbmRleCB0aGUgY29ycmVzcG9uZGluZyBBU1QgZmlsZSB3aWxsIGJlIGxvYWRlZCBhbmQgdGhlCisgIC8vLyBkZWZpbml0aW9uIG9mIHRoZSBmdW5jdGlvbiB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZSBvcmlnaW5hbCBBU1QgdXNpbmcKKyAgLy8vIHRoZSBBU1QgSW1wb3J0ZXIuCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgZGVjbGFyYXRpb24gd2l0aCB0aGUgZGVmaW5pdGlvbiB3aWxsIGJlIHJldHVybmVkLgorICAvLy8gSWYgbm8gc3VpdGFibGUgZGVmaW5pdGlvbiBpcyBmb3VuZCBpbiB0aGUgaW5kZXggZmlsZSBvciBtdWx0aXBsZQorICAvLy8gZGVmaW5pdGlvbnMgZm91bmQgZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhlIEFTVCBmaWxlcyBzaG91bGQgYWxzbyBiZSBpbiB0aGUgXHAgQ3Jvc3NUVURpci4KKyAgbGx2bTo6RXhwZWN0ZWQ8Y29uc3QgRnVuY3Rpb25EZWNsICo+CisgIGdldENyb3NzVFVEZWZpbml0aW9uKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQsIFN0cmluZ1JlZiBDcm9zc1RVRGlyLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5kZXhOYW1lKTsKKworICAvLy8gXGJyaWVmIFRoaXMgZnVuY3Rpb24gbG9hZHMgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGZyb20gYW4gZXh0ZXJuYWwgQVNUCisgIC8vLyAgICAgICAgZmlsZS4KKyAgLy8vCisgIC8vLyBBIGZ1bmN0aW9uIGRlZmluaXRpb24gd2l0aCB0aGUgc2FtZSBkZWNsYXJhdGlvbiB3aWxsIGJlIGxvb2tlZCB1cCBpbiB0aGUKKyAgLy8vIGluZGV4IGZpbGUgd2hpY2ggc2hvdWxkIGJlIGluIHRoZSBccCBDcm9zc1RVRGlyIGRpcmVjdG9yeSwgY2FsbGVkCisgIC8vLyBccCBJbmRleE5hbWUuIEluIGNhc2UgdGhlIGRlY2xhcmF0aW9uIGlzIGZvdW5kIGluIHRoZSBpbmRleCB0aGUKKyAgLy8vIGNvcnJlc3BvbmRpbmcgQVNUIGZpbGUgd2lsbCBiZSBsb2FkZWQuCisgIC8vLworICAvLy8gXHJldHVybiBSZXR1cm5zIGFuIEFTVFVuaXQgdGhhdCBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgbG9va2VkIHVwCisgIC8vLyBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhlIEFTVCBmaWxlcyBzaG91bGQgYWxzbyBiZSBpbiB0aGUgXHAgQ3Jvc3NUVURpci4KKyAgbGx2bTo6RXhwZWN0ZWQ8QVNUVW5pdCAqPiBsb2FkRXh0ZXJuYWxBU1QoU3RyaW5nUmVmIExvb2t1cE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDcm9zc1RVRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5kZXhOYW1lKTsKKworICAvLy8gXGJyaWVmIFRoaXMgZnVuY3Rpb24gbWVyZ2VzIGEgZGVmaW5pdGlvbiBmcm9tIGEgc2VwYXJhdGUgQVNUIFVuaXQgaW50bworICAvLy8gICAgICAgIHRoZSBjdXJyZW50IG9uZSB3aGljaCB3YXMgY3JlYXRlZCBieSB0aGUgY29tcGlsZXIgaW5zdGFuY2UgdGhhdAorICAvLy8gICAgICAgIHdhcyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gUmV0dXJucyB0aGUgcmVzdWx0aW5nIGRlZmluaXRpb24gb3IgYW4gZXJyb3IuCisgIGxsdm06OkV4cGVjdGVkPGNvbnN0IEZ1bmN0aW9uRGVjbCAqPiBpbXBvcnREZWZpbml0aW9uKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQpOworCisgIC8vLyBcYnJpZWYgR2V0IGEgbmFtZSB0byBpZGVudGlmeSBhIGZ1bmN0aW9uLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0TG9va3VwTmFtZShjb25zdCBOYW1lZERlY2wgKk5EKTsKKworICAvLy8gXGJyaWVmIEVtaXQgZGlhZ25vc3RpY3MgZm9yIHRoZSB1c2VyIGZvciBwb3RlbnRpYWwgY29uZmlndXJhdGlvbiBlcnJvcnMuCisgIHZvaWQgZW1pdENyb3NzVFVEaWFnbm9zdGljcyhjb25zdCBJbmRleEVycm9yICZJRSk7CisKK3ByaXZhdGU6CisgIEFTVEltcG9ydGVyICZnZXRPckNyZWF0ZUFTVEltcG9ydGVyKEFTVENvbnRleHQgJkZyb20pOworICBjb25zdCBGdW5jdGlvbkRlY2wgKmZpbmRGdW5jdGlvbkluRGVjbENvbnRleHQoY29uc3QgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIExvb2t1cEZuTmFtZSk7CisKKyAgbGx2bTo6U3RyaW5nTWFwPHN0ZDo6dW5pcXVlX3B0cjxjbGFuZzo6QVNUVW5pdD4+IEZpbGVBU1RVbml0TWFwOworICBsbHZtOjpTdHJpbmdNYXA8Y2xhbmc6OkFTVFVuaXQgKj4gRnVuY3Rpb25BU1RVbml0TWFwOworICBsbHZtOjpTdHJpbmdNYXA8c3RkOjpzdHJpbmc+IEZ1bmN0aW9uRmlsZU1hcDsKKyAgbGx2bTo6RGVuc2VNYXA8VHJhbnNsYXRpb25Vbml0RGVjbCAqLCBzdGQ6OnVuaXF1ZV9wdHI8QVNUSW1wb3J0ZXI+PgorICAgICAgQVNUVW5pdEltcG9ydGVyTWFwOworICBDb21waWxlckluc3RhbmNlICZDSTsKKyAgQVNUQ29udGV4dCAmQ29udGV4dDsKK307CisKK30gLy8gbmFtZXNwYWNlIGNyb3NzX3R1Cit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19DUk9TU1RVX0NST1NTVFJBTlNMQVRJT05VTklUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9BY3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9BY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTIyODE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0FjdGlvbi5oCkBAIC0wLDAgKzEsNTk0IEBACisvLz09PS0gQWN0aW9uLmggLSBBYnN0cmFjdCBjb21waWxhdGlvbiBzdGVwcyAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRFJJVkVSX0FDVElPTl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfRFJJVkVSX0FDVElPTl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvRHJpdmVyL1R5cGVzLmgiCisjaW5jbHVkZSAiY2xhbmcvRHJpdmVyL1V0aWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvcHQgeworCitjbGFzcyBBcmc7CisKK30gLy8gbmFtZXNwYWNlIG9wdAorfSAvLyBuYW1lc3BhY2UgbGx2bQorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGRyaXZlciB7CisKK2NsYXNzIFRvb2xDaGFpbjsKKworLy8vIEFjdGlvbiAtIFJlcHJlc2VudCBhbiBhYnN0cmFjdCBjb21waWxhdGlvbiBzdGVwIHRvIHBlcmZvcm0uCisvLy8KKy8vLyBBbiBhY3Rpb24gcmVwcmVzZW50cyBhbiBlZGdlIGluIHRoZSBjb21waWxhdGlvbiBncmFwaDsgdHlwaWNhbGx5CisvLy8gaXQgaXMgYSBqb2IgdG8gdHJhbnNmb3JtIGFuIGlucHV0IHVzaW5nIHNvbWUgdG9vbC4KKy8vLworLy8vIFRoZSBjdXJyZW50IGRyaXZlciBpcyBoYXJkIHdpcmVkIHRvIGV4cGVjdCBhY3Rpb25zIHdoaWNoIHByb2R1Y2UgYQorLy8vIHNpbmdsZSBwcmltYXJ5IG91dHB1dCwgYXQgbGVhc3QgaW4gdGVybXMgb2YgY29udHJvbGxpbmcgdGhlCisvLy8gY29tcGlsYXRpb24uIEFjdGlvbnMgY2FuIHByb2R1Y2UgYXV4aWxpYXJ5IGZpbGVzLCBidXQgY2FuIG9ubHkKKy8vLyBwcm9kdWNlIGEgc2luZ2xlIG91dHB1dCB0byBmZWVkIGludG8gc3Vic2VxdWVudCBhY3Rpb25zLgorLy8vCisvLy8gQWN0aW9ucyBhcmUgdXN1YWxseSBvd25lZCBieSBhIENvbXBpbGF0aW9uLCB3aGljaCBjcmVhdGVzIG5ldworLy8vIGFjdGlvbnMgdmlhIE1ha2VBY3Rpb24oKS4KK2NsYXNzIEFjdGlvbiB7CitwdWJsaWM6CisgIHVzaW5nIHNpemVfdHlwZSA9IEFjdGlvbkxpc3Q6OnNpemVfdHlwZTsKKyAgdXNpbmcgaW5wdXRfaXRlcmF0b3IgPSBBY3Rpb25MaXN0OjppdGVyYXRvcjsKKyAgdXNpbmcgaW5wdXRfY29uc3RfaXRlcmF0b3IgPSBBY3Rpb25MaXN0Ojpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgaW5wdXRfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxpbnB1dF9pdGVyYXRvcj47CisgIHVzaW5nIGlucHV0X2NvbnN0X3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8aW5wdXRfY29uc3RfaXRlcmF0b3I+OworCisgIGVudW0gQWN0aW9uQ2xhc3MgeworICAgIElucHV0Q2xhc3MgPSAwLAorICAgIEJpbmRBcmNoQ2xhc3MsCisgICAgT2ZmbG9hZENsYXNzLAorICAgIFByZXByb2Nlc3NKb2JDbGFzcywKKyAgICBQcmVjb21waWxlSm9iQ2xhc3MsCisgICAgQW5hbHl6ZUpvYkNsYXNzLAorICAgIE1pZ3JhdGVKb2JDbGFzcywKKyAgICBDb21waWxlSm9iQ2xhc3MsCisgICAgQmFja2VuZEpvYkNsYXNzLAorICAgIEFzc2VtYmxlSm9iQ2xhc3MsCisgICAgTGlua0pvYkNsYXNzLAorICAgIExpcG9Kb2JDbGFzcywKKyAgICBEc3ltdXRpbEpvYkNsYXNzLAorICAgIFZlcmlmeURlYnVnSW5mb0pvYkNsYXNzLAorICAgIFZlcmlmeVBDSEpvYkNsYXNzLAorICAgIE9mZmxvYWRCdW5kbGluZ0pvYkNsYXNzLAorICAgIE9mZmxvYWRVbmJ1bmRsaW5nSm9iQ2xhc3MsCisKKyAgICBKb2JDbGFzc0ZpcnN0ID0gUHJlcHJvY2Vzc0pvYkNsYXNzLAorICAgIEpvYkNsYXNzTGFzdCA9IE9mZmxvYWRVbmJ1bmRsaW5nSm9iQ2xhc3MKKyAgfTsKKworICAvLyBUaGUgb2ZmbG9hZGluZyBraW5kIGRldGVybWluZXMgaWYgdGhpcyBhY3Rpb24gaXMgYmluZGVkIHRvIGEgcGFydGljdWxhcgorICAvLyBwcm9ncmFtbWluZyBtb2RlbC4gRWFjaCBlbnRyeSByZXNlcnZlcyBvbmUgYml0LiBXZSBhbHNvIGhhdmUgYSBzcGVjaWFsIGtpbmQKKyAgLy8gdG8gZGVzaWduYXRlIHRoZSBob3N0IG9mZmxvYWRpbmcgdG9vbCBjaGFpbi4KKyAgZW51bSBPZmZsb2FkS2luZCB7CisgICAgT0ZLX05vbmUgPSAweDAwLAorCisgICAgLy8gVGhlIGhvc3Qgb2ZmbG9hZGluZyB0b29sIGNoYWluLgorICAgIE9GS19Ib3N0ID0gMHgwMSwKKworICAgIC8vIFRoZSBkZXZpY2Ugb2ZmbG9hZGluZyB0b29sIGNoYWlucyAtIG9uZSBiaXQgZm9yIGVhY2ggcHJvZ3JhbW1pbmcgbW9kZWwuCisgICAgT0ZLX0N1ZGEgPSAweDAyLAorICAgIE9GS19PcGVuTVAgPSAweDA0LAorICB9OworCisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRDbGFzc05hbWUoQWN0aW9uQ2xhc3MgQUMpOworCitwcml2YXRlOgorICBBY3Rpb25DbGFzcyBLaW5kOworCisgIC8vLyBUaGUgb3V0cHV0IHR5cGUgb2YgdGhpcyBhY3Rpb24uCisgIHR5cGVzOjpJRCBUeXBlOworCisgIEFjdGlvbkxpc3QgSW5wdXRzOworCisgIC8vLyBGbGFnIHRoYXQgaXMgc2V0IHRvIHRydWUgaWYgdGhpcyBhY3Rpb24gY2FuIGJlIGNvbGxhcHNlZCB3aXRoIG90aGVycworICAvLy8gYWN0aW9ucyB0aGF0IGRlcGVuZCBvbiBpdC4gVGhpcyBpcyB0cnVlIGJ5IGRlZmF1bHQgYW5kIHNldCB0byBmYWxzZSB3aGVuCisgIC8vLyB0aGUgYWN0aW9uIGlzIHVzZWQgYnkgdHdvIGRpZmZlcmVudCB0b29sIGNoYWlucywgd2hpY2ggaXMgZW5hYmxlZCBieSB0aGUKKyAgLy8vIG9mZmxvYWRpbmcgc3VwcG9ydCBpbXBsZW1lbnRhdGlvbi4KKyAgYm9vbCBDYW5CZUNvbGxhcHNlZFdpdGhOZXh0RGVwZW5kZW50QWN0aW9uID0gdHJ1ZTsKKworcHJvdGVjdGVkOgorICAvLy8KKyAgLy8vIE9mZmxvYWQgaW5mb3JtYXRpb24uCisgIC8vLworCisgIC8vLyBUaGUgaG9zdCBvZmZsb2FkaW5nIGtpbmQgLSBhIGNvbWJpbmF0aW9uIG9mIGtpbmRzIGVuY29kZWQgaW4gYSBtYXNrLgorICAvLy8gTXVsdGlwbGUgcHJvZ3JhbW1pbmcgbW9kZWxzIG1heSBiZSBzdXBwb3J0ZWQgc2ltdWx0YW5lb3VzbHkgYnkgdGhlIHNhbWUKKyAgLy8vIGhvc3QuCisgIHVuc2lnbmVkIEFjdGl2ZU9mZmxvYWRLaW5kTWFzayA9IDB1OworCisgIC8vLyBPZmZsb2FkaW5nIGtpbmQgb2YgdGhlIGRldmljZS4KKyAgT2ZmbG9hZEtpbmQgT2ZmbG9hZGluZ0RldmljZUtpbmQgPSBPRktfTm9uZTsKKworICAvLy8gVGhlIE9mZmxvYWRpbmcgYXJjaGl0ZWN0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFjdGlvbi4KKyAgY29uc3QgY2hhciAqT2ZmbG9hZGluZ0FyY2ggPSBudWxscHRyOworCisgIEFjdGlvbihBY3Rpb25DbGFzcyBLaW5kLCB0eXBlczo6SUQgVHlwZSkgOiBBY3Rpb24oS2luZCwgQWN0aW9uTGlzdCgpLCBUeXBlKSB7fQorICBBY3Rpb24oQWN0aW9uQ2xhc3MgS2luZCwgQWN0aW9uICpJbnB1dCwgdHlwZXM6OklEIFR5cGUpCisgICAgICA6IEFjdGlvbihLaW5kLCBBY3Rpb25MaXN0KHtJbnB1dH0pLCBUeXBlKSB7fQorICBBY3Rpb24oQWN0aW9uQ2xhc3MgS2luZCwgQWN0aW9uICpJbnB1dCkKKyAgICAgIDogQWN0aW9uKEtpbmQsIEFjdGlvbkxpc3Qoe0lucHV0fSksIElucHV0LT5nZXRUeXBlKCkpIHt9CisgIEFjdGlvbihBY3Rpb25DbGFzcyBLaW5kLCBjb25zdCBBY3Rpb25MaXN0ICZJbnB1dHMsIHR5cGVzOjpJRCBUeXBlKQorICAgICAgOiBLaW5kKEtpbmQpLCBUeXBlKFR5cGUpLCBJbnB1dHMoSW5wdXRzKSB7fQorCitwdWJsaWM6CisgIHZpcnR1YWwgfkFjdGlvbigpOworCisgIGNvbnN0IGNoYXIgKmdldENsYXNzTmFtZSgpIGNvbnN0IHsgcmV0dXJuIEFjdGlvbjo6Z2V0Q2xhc3NOYW1lKGdldEtpbmQoKSk7IH0KKworICBBY3Rpb25DbGFzcyBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorICB0eXBlczo6SUQgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5cGU7IH0KKworICBBY3Rpb25MaXN0ICZnZXRJbnB1dHMoKSB7IHJldHVybiBJbnB1dHM7IH0KKyAgY29uc3QgQWN0aW9uTGlzdCAmZ2V0SW5wdXRzKCkgY29uc3QgeyByZXR1cm4gSW5wdXRzOyB9CisKKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBJbnB1dHMuc2l6ZSgpOyB9CisKKyAgaW5wdXRfaXRlcmF0b3IgaW5wdXRfYmVnaW4oKSB7IHJldHVybiBJbnB1dHMuYmVnaW4oKTsgfQorICBpbnB1dF9pdGVyYXRvciBpbnB1dF9lbmQoKSB7IHJldHVybiBJbnB1dHMuZW5kKCk7IH0KKyAgaW5wdXRfcmFuZ2UgaW5wdXRzKCkgeyByZXR1cm4gaW5wdXRfcmFuZ2UoaW5wdXRfYmVnaW4oKSwgaW5wdXRfZW5kKCkpOyB9CisgIGlucHV0X2NvbnN0X2l0ZXJhdG9yIGlucHV0X2JlZ2luKCkgY29uc3QgeyByZXR1cm4gSW5wdXRzLmJlZ2luKCk7IH0KKyAgaW5wdXRfY29uc3RfaXRlcmF0b3IgaW5wdXRfZW5kKCkgY29uc3QgeyByZXR1cm4gSW5wdXRzLmVuZCgpOyB9CisgIGlucHV0X2NvbnN0X3JhbmdlIGlucHV0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gaW5wdXRfY29uc3RfcmFuZ2UoaW5wdXRfYmVnaW4oKSwgaW5wdXRfZW5kKCkpOworICB9CisKKyAgLy8vIE1hcmsgdGhpcyBhY3Rpb24gYXMgbm90IGxlZ2FsIHRvIGNvbGxhcHNlLgorICB2b2lkIHNldENhbm5vdEJlQ29sbGFwc2VkV2l0aE5leHREZXBlbmRlbnRBY3Rpb24oKSB7CisgICAgQ2FuQmVDb2xsYXBzZWRXaXRoTmV4dERlcGVuZGVudEFjdGlvbiA9IGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNvbGxhcHNlZCB3aXRoIG90aGVycy4KKyAgYm9vbCBpc0NvbGxhcHNpbmdXaXRoTmV4dERlcGVuZGVudEFjdGlvbkxlZ2FsKCkgY29uc3QgeworICAgIHJldHVybiBDYW5CZUNvbGxhcHNlZFdpdGhOZXh0RGVwZW5kZW50QWN0aW9uOworICB9CisKKyAgLy8vIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBvZmZsb2FkIGtpbmQgb2YgdGhlIGFjdGlvbi4KKyAgc3RkOjpzdHJpbmcgZ2V0T2ZmbG9hZGluZ0tpbmRQcmVmaXgoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgYXMgcHJlZml4IGluIG9yZGVyIHRvIGdlbmVyYXRlIHVuaXF1ZQorICAvLy8gZmlsZXMgZm9yIGVhY2ggb2ZmbG9hZGluZyBraW5kLiBCeSBkZWZhdWx0LCBubyBwcmVmaXggaXMgdXNlZCBmb3IKKyAgLy8vIG5vbi1kZXZpY2Uga2luZHMsIGV4Y2VwdCBpZiBcYSBDcmVhdGVQcmVmaXhGb3JIb3N0IGlzIHNldC4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nCisgIEdldE9mZmxvYWRpbmdGaWxlTmFtZVByZWZpeChPZmZsb2FkS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5vcm1hbGl6ZWRUcmlwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENyZWF0ZVByZWZpeEZvckhvc3QgPSBmYWxzZSk7CisKKyAgLy8vIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGEgb2ZmbG9hZCBraW5kIG5hbWUuCisgIHN0YXRpYyBTdHJpbmdSZWYgR2V0T2ZmbG9hZEtpbmROYW1lKE9mZmxvYWRLaW5kIEtpbmQpOworCisgIC8vLyBTZXQgdGhlIGRldmljZSBvZmZsb2FkIGluZm8gb2YgdGhpcyBhY3Rpb24gYW5kIHByb3BhZ2F0ZSBpdCB0byBpdHMKKyAgLy8vIGRlcGVuZGVuY2VzLgorICB2b2lkIHByb3BhZ2F0ZURldmljZU9mZmxvYWRJbmZvKE9mZmxvYWRLaW5kIE9LaW5kLCBjb25zdCBjaGFyICpPQXJjaCk7CisKKyAgLy8vIEFwcGVuZCB0aGUgaG9zdCBvZmZsb2FkIGluZm8gb2YgdGhpcyBhY3Rpb24gYW5kIHByb3BhZ2F0ZSBpdCB0byBpdHMKKyAgLy8vIGRlcGVuZGVuY2VzLgorICB2b2lkIHByb3BhZ2F0ZUhvc3RPZmZsb2FkSW5mbyh1bnNpZ25lZCBPS2luZHMsIGNvbnN0IGNoYXIgKk9BcmNoKTsKKworICAvLy8gU2V0IHRoZSBvZmZsb2FkIGluZm8gb2YgdGhpcyBhY3Rpb24gdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHByb3ZpZGVkIGFjdGlvbiwKKyAgLy8vIGFuZCBwcm9wYWdhdGUgaXQgdG8gaXRzIGRlcGVuZGVuY2VzLgorICB2b2lkIHByb3BhZ2F0ZU9mZmxvYWRJbmZvKGNvbnN0IEFjdGlvbiAqQSk7CisKKyAgdW5zaWduZWQgZ2V0T2ZmbG9hZGluZ0hvc3RBY3RpdmVLaW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gQWN0aXZlT2ZmbG9hZEtpbmRNYXNrOworICB9CisKKyAgT2ZmbG9hZEtpbmQgZ2V0T2ZmbG9hZGluZ0RldmljZUtpbmQoKSBjb25zdCB7IHJldHVybiBPZmZsb2FkaW5nRGV2aWNlS2luZDsgfQorICBjb25zdCBjaGFyICpnZXRPZmZsb2FkaW5nQXJjaCgpIGNvbnN0IHsgcmV0dXJuIE9mZmxvYWRpbmdBcmNoOyB9CisKKyAgLy8vIENoZWNrIGlmIHRoaXMgYWN0aW9uIGhhdmUgYW55IG9mZmxvYWQga2luZHMuIE5vdGUgdGhhdCBob3N0IG9mZmxvYWQga2luZHMKKyAgLy8vIGFyZSBvbmx5IHNldCBpZiB0aGUgYWN0aW9uIGlzIGEgZGVwZW5kZW5jZSB0byBhIGhvc3Qgb2ZmbG9hZCBhY3Rpb24uCisgIGJvb2wgaXNIb3N0T2ZmbG9hZGluZyhPZmZsb2FkS2luZCBPS2luZCkgY29uc3QgeworICAgIHJldHVybiBBY3RpdmVPZmZsb2FkS2luZE1hc2sgJiBPS2luZDsKKyAgfQorICBib29sIGlzRGV2aWNlT2ZmbG9hZGluZyhPZmZsb2FkS2luZCBPS2luZCkgY29uc3QgeworICAgIHJldHVybiBPZmZsb2FkaW5nRGV2aWNlS2luZCA9PSBPS2luZDsKKyAgfQorICBib29sIGlzT2ZmbG9hZGluZyhPZmZsb2FkS2luZCBPS2luZCkgY29uc3QgeworICAgIHJldHVybiBpc0hvc3RPZmZsb2FkaW5nKE9LaW5kKSB8fCBpc0RldmljZU9mZmxvYWRpbmcoT0tpbmQpOworICB9Cit9OworCitjbGFzcyBJbnB1dEFjdGlvbiA6IHB1YmxpYyBBY3Rpb24geworICBjb25zdCBsbHZtOjpvcHQ6OkFyZyAmSW5wdXQ7CisKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIElucHV0QWN0aW9uKGNvbnN0IGxsdm06Om9wdDo6QXJnICZJbnB1dCwgdHlwZXM6OklEIFR5cGUpOworCisgIGNvbnN0IGxsdm06Om9wdDo6QXJnICZnZXRJbnB1dEFyZygpIGNvbnN0IHsgcmV0dXJuIElucHV0OyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBY3Rpb24gKkEpIHsKKyAgICByZXR1cm4gQS0+Z2V0S2luZCgpID09IElucHV0Q2xhc3M7CisgIH0KK307CisKK2NsYXNzIEJpbmRBcmNoQWN0aW9uIDogcHVibGljIEFjdGlvbiB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworICAvLy8gVGhlIGFyY2hpdGVjdHVyZSB0byBiaW5kLCBvciAwIGlmIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZQorICAvLy8gc2hvdWxkIGJlIGJvdW5kLgorICBTdHJpbmdSZWYgQXJjaE5hbWU7CisKK3B1YmxpYzoKKyAgQmluZEFyY2hBY3Rpb24oQWN0aW9uICpJbnB1dCwgU3RyaW5nUmVmIEFyY2hOYW1lKTsKKworICBTdHJpbmdSZWYgZ2V0QXJjaE5hbWUoKSBjb25zdCB7IHJldHVybiBBcmNoTmFtZTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQWN0aW9uICpBKSB7CisgICAgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBCaW5kQXJjaENsYXNzOworICB9Cit9OworCisvLy8gQW4gb2ZmbG9hZCBhY3Rpb24gY29tYmluZXMgaG9zdCBvci9hbmQgZGV2aWNlIGFjdGlvbnMgYWNjb3JkaW5nIHRvIHRoZQorLy8vIHByb2dyYW1taW5nIG1vZGVsIGltcGxlbWVudGF0aW9uIG5lZWRzIGFuZCBwcm9wYWdhdGVzIHRoZSBvZmZsb2FkaW5nIGtpbmQgdG8KKy8vLyBpdHMgZGVwZW5kZW5jZXMuCitjbGFzcyBPZmZsb2FkQWN0aW9uIGZpbmFsIDogcHVibGljIEFjdGlvbiB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHVibGljOgorICAvLy8gVHlwZSB1c2VkIHRvIGNvbW11bmljYXRlIGRldmljZSBhY3Rpb25zLiBJdCBhc3NvY2lhdGVzIGJvdW5kIGFyY2hpdGVjdHVyZSwKKyAgLy8vIHRvb2xjaGFpbiwgYW5kIG9mZmxvYWQga2luZCB0byBlYWNoIGFjdGlvbi4KKyAgY2xhc3MgRGV2aWNlRGVwZW5kZW5jZXMgZmluYWwgeworICBwdWJsaWM6CisgICAgdXNpbmcgVG9vbENoYWluTGlzdCA9IFNtYWxsVmVjdG9yPGNvbnN0IFRvb2xDaGFpbiAqLCAzPjsKKyAgICB1c2luZyBCb3VuZEFyY2hMaXN0ID0gU21hbGxWZWN0b3I8Y29uc3QgY2hhciAqLCAzPjsKKyAgICB1c2luZyBPZmZsb2FkS2luZExpc3QgPSBTbWFsbFZlY3RvcjxPZmZsb2FkS2luZCwgMz47CisKKyAgcHJpdmF0ZToKKyAgICAvLyBMaXN0cyB0aGF0IGtlZXAgdGhlIGluZm9ybWF0aW9uIGZvciBlYWNoIGRlcGVuZGVuY3kuIEFsbCB0aGUgbGlzdHMgYXJlCisgICAgLy8gbWVhbnQgdG8gYmUgdXBkYXRlZCBpbiBzeW5jLiBXZSBhcmUgYWRvcHRpbmcgc2VwYXJhdGUgbGlzdHMgaW5zdGVhZCBvZiBhCisgICAgLy8gbGlzdCBvZiBzdHJ1Y3RzLCBiZWNhdXNlIHRoYXQgc2ltcGxpZmllcyBmb3J3YXJkaW5nIHRoZSBhY3Rpb25zIGxpc3QgdG8KKyAgICAvLyBpbml0aWFsaXplIHRoZSBpbnB1dHMgb2YgdGhlIGJhc2UgQWN0aW9uIGNsYXNzLgorCisgICAgLy8vIFRoZSBkZXBlbmRlbmNlIGFjdGlvbnMuCisgICAgQWN0aW9uTGlzdCBEZXZpY2VBY3Rpb25zOworCisgICAgLy8vIFRoZSBvZmZsb2FkaW5nIHRvb2xjaGFpbnMgdGhhdCBzaG91bGQgYmUgdXNlZCB3aXRoIHRoZSBhY3Rpb24uCisgICAgVG9vbENoYWluTGlzdCBEZXZpY2VUb29sQ2hhaW5zOworCisgICAgLy8vIFRoZSBhcmNoaXRlY3R1cmVzIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2l0aCB0aGlzIGFjdGlvbi4KKyAgICBCb3VuZEFyY2hMaXN0IERldmljZUJvdW5kQXJjaHM7CisKKyAgICAvLy8gVGhlIG9mZmxvYWQga2luZCBvZiBlYWNoIGRlcGVuZGVuY2UuCisgICAgT2ZmbG9hZEtpbmRMaXN0IERldmljZU9mZmxvYWRLaW5kczsKKworICBwdWJsaWM6CisgICAgLy8vIEFkZCBhIGFjdGlvbiBhbG9uZyB3aXRoIHRoZSBhc3NvY2lhdGVkIHRvb2xjaGFpbiwgYm91bmQgYXJjaCwgYW5kCisgICAgLy8vIG9mZmxvYWQga2luZC4KKyAgICB2b2lkIGFkZChBY3Rpb24gJkEsIGNvbnN0IFRvb2xDaGFpbiAmVEMsIGNvbnN0IGNoYXIgKkJvdW5kQXJjaCwKKyAgICAgICAgICAgICBPZmZsb2FkS2luZCBPS2luZCk7CisKKyAgICAvLy8gR2V0IGVhY2ggb2YgdGhlIGluZGl2aWR1YWwgYXJyYXlzLgorICAgIGNvbnN0IEFjdGlvbkxpc3QgJmdldEFjdGlvbnMoKSBjb25zdCB7IHJldHVybiBEZXZpY2VBY3Rpb25zOyB9CisgICAgY29uc3QgVG9vbENoYWluTGlzdCAmZ2V0VG9vbENoYWlucygpIGNvbnN0IHsgcmV0dXJuIERldmljZVRvb2xDaGFpbnM7IH0KKyAgICBjb25zdCBCb3VuZEFyY2hMaXN0ICZnZXRCb3VuZEFyY2hzKCkgY29uc3QgeyByZXR1cm4gRGV2aWNlQm91bmRBcmNoczsgfQorICAgIGNvbnN0IE9mZmxvYWRLaW5kTGlzdCAmZ2V0T2ZmbG9hZEtpbmRzKCkgY29uc3QgeworICAgICAgcmV0dXJuIERldmljZU9mZmxvYWRLaW5kczsKKyAgICB9CisgIH07CisKKyAgLy8vIFR5cGUgdXNlZCB0byBjb21tdW5pY2F0ZSBob3N0IGFjdGlvbnMuIEl0IGFzc29jaWF0ZXMgYm91bmQgYXJjaGl0ZWN0dXJlLAorICAvLy8gdG9vbGNoYWluLCBhbmQgb2ZmbG9hZCBraW5kcyB0byB0aGUgaG9zdCBhY3Rpb24uCisgIGNsYXNzIEhvc3REZXBlbmRlbmNlIGZpbmFsIHsKKyAgICAvLy8gVGhlIGRlcGVuZGVuY2UgYWN0aW9uLgorICAgIEFjdGlvbiAmSG9zdEFjdGlvbjsKKworICAgIC8vLyBUaGUgb2ZmbG9hZGluZyB0b29sY2hhaW4gdGhhdCBzaG91bGQgYmUgdXNlZCB3aXRoIHRoZSBhY3Rpb24uCisgICAgY29uc3QgVG9vbENoYWluICZIb3N0VG9vbENoYWluOworCisgICAgLy8vIFRoZSBhcmNoaXRlY3R1cmVzIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2l0aCB0aGlzIGFjdGlvbi4KKyAgICBjb25zdCBjaGFyICpIb3N0Qm91bmRBcmNoID0gbnVsbHB0cjsKKworICAgIC8vLyBUaGUgb2ZmbG9hZCBraW5kIG9mIGVhY2ggZGVwZW5kZW5jZS4KKyAgICB1bnNpZ25lZCBIb3N0T2ZmbG9hZEtpbmRzID0gMHU7CisKKyAgcHVibGljOgorICAgIEhvc3REZXBlbmRlbmNlKEFjdGlvbiAmQSwgY29uc3QgVG9vbENoYWluICZUQywgY29uc3QgY2hhciAqQm91bmRBcmNoLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIE9mZmxvYWRLaW5kcykKKyAgICAgICAgOiBIb3N0QWN0aW9uKEEpLCBIb3N0VG9vbENoYWluKFRDKSwgSG9zdEJvdW5kQXJjaChCb3VuZEFyY2gpLAorICAgICAgICAgIEhvc3RPZmZsb2FkS2luZHMoT2ZmbG9hZEtpbmRzKSB7fQorCisgICAgLy8vIENvbnN0cnVjdG9yIHZlcnNpb24gdGhhdCBvYnRhaW5zIHRoZSBvZmZsb2FkIGtpbmRzIGZyb20gdGhlIGRldmljZQorICAgIC8vLyBkZXBlbmRlbmNpZXMuCisgICAgSG9zdERlcGVuZGVuY2UoQWN0aW9uICZBLCBjb25zdCBUb29sQ2hhaW4gJlRDLCBjb25zdCBjaGFyICpCb3VuZEFyY2gsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlRGVwZW5kZW5jZXMgJkREZXBzKTsKKyAgICBBY3Rpb24gKmdldEFjdGlvbigpIGNvbnN0IHsgcmV0dXJuICZIb3N0QWN0aW9uOyB9CisgICAgY29uc3QgVG9vbENoYWluICpnZXRUb29sQ2hhaW4oKSBjb25zdCB7IHJldHVybiAmSG9zdFRvb2xDaGFpbjsgfQorICAgIGNvbnN0IGNoYXIgKmdldEJvdW5kQXJjaCgpIGNvbnN0IHsgcmV0dXJuIEhvc3RCb3VuZEFyY2g7IH0KKyAgICB1bnNpZ25lZCBnZXRPZmZsb2FkS2luZHMoKSBjb25zdCB7IHJldHVybiBIb3N0T2ZmbG9hZEtpbmRzOyB9CisgIH07CisKKyAgdXNpbmcgT2ZmbG9hZEFjdGlvbldvcmtUeSA9CisgICAgICBsbHZtOjpmdW5jdGlvbl9yZWY8dm9pZChBY3Rpb24gKiwgY29uc3QgVG9vbENoYWluICosIGNvbnN0IGNoYXIgKik+OworCitwcml2YXRlOgorICAvLy8gVGhlIGhvc3Qgb2ZmbG9hZGluZyB0b29sY2hhaW4gdGhhdCBzaG91bGQgYmUgdXNlZCB3aXRoIHRoZSBhY3Rpb24uCisgIGNvbnN0IFRvb2xDaGFpbiAqSG9zdFRDID0gbnVsbHB0cjsKKworICAvLy8gVGhlIHRvb2wgY2hhaW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGlzdCBvZiBhY3Rpb25zLgorICBEZXZpY2VEZXBlbmRlbmNlczo6VG9vbENoYWluTGlzdCBEZXZUb29sQ2hhaW5zOworCitwdWJsaWM6CisgIE9mZmxvYWRBY3Rpb24oY29uc3QgSG9zdERlcGVuZGVuY2UgJkhEZXApOworICBPZmZsb2FkQWN0aW9uKGNvbnN0IERldmljZURlcGVuZGVuY2VzICZERGVwcywgdHlwZXM6OklEIFR5KTsKKyAgT2ZmbG9hZEFjdGlvbihjb25zdCBIb3N0RGVwZW5kZW5jZSAmSERlcCwgY29uc3QgRGV2aWNlRGVwZW5kZW5jZXMgJkREZXBzKTsKKworICAvLy8gRXhlY3V0ZSB0aGUgd29yayBzcGVjaWZpZWQgaW4gXGEgV29yayBvbiB0aGUgaG9zdCBkZXBlbmRlbmNlLgorICB2b2lkIGRvT25Ib3N0RGVwZW5kZW5jZShjb25zdCBPZmZsb2FkQWN0aW9uV29ya1R5ICZXb3JrKSBjb25zdDsKKworICAvLy8gRXhlY3V0ZSB0aGUgd29yayBzcGVjaWZpZWQgaW4gXGEgV29yayBvbiBlYWNoIGRldmljZSBkZXBlbmRlbmNlLgorICB2b2lkIGRvT25FYWNoRGV2aWNlRGVwZW5kZW5jZShjb25zdCBPZmZsb2FkQWN0aW9uV29ya1R5ICZXb3JrKSBjb25zdDsKKworICAvLy8gRXhlY3V0ZSB0aGUgd29yayBzcGVjaWZpZWQgaW4gXGEgV29yayBvbiBlYWNoIGRlcGVuZGVuY2UuCisgIHZvaWQgZG9PbkVhY2hEZXBlbmRlbmNlKGNvbnN0IE9mZmxvYWRBY3Rpb25Xb3JrVHkgJldvcmspIGNvbnN0OworCisgIC8vLyBFeGVjdXRlIHRoZSB3b3JrIHNwZWNpZmllZCBpbiBcYSBXb3JrIG9uIGVhY2ggaG9zdCBvciBkZXZpY2UgZGVwZW5kZW5jZSBpZgorICAvLy8gXGEgSXNIb3N0RGVwZW5kZW5jZXRvIGlzIHRydWUgb3IgZmFsc2UsIHJlc3BlY3RpdmVseS4KKyAgdm9pZCBkb09uRWFjaERlcGVuZGVuY2UoYm9vbCBJc0hvc3REZXBlbmRlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPZmZsb2FkQWN0aW9uV29ya1R5ICZXb3JrKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGFjdGlvbiBoYXMgYSBob3N0IGRlcGVuZGVuY2UuCisgIGJvb2wgaGFzSG9zdERlcGVuZGVuY2UoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBob3N0IGRlcGVuZGVuY2Ugb2YgdGhpcyBhY3Rpb24uIFRoaXMgZnVuY3Rpb24gaXMgb25seSBleHBlY3RlZAorICAvLy8gdG8gYmUgY2FsbGVkIGlmIHRoZSBob3N0IGRlcGVuZGVuY2UgZXhpc3RzLgorICBBY3Rpb24gKmdldEhvc3REZXBlbmRlbmNlKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBhY3Rpb24gaGFzIGEgc2luZ2xlIGRldmljZSBkZXBlbmRlbmNlLiBJZiBcYQorICAvLy8gRG9Ob3RDb25zaWRlckhvc3RBY3Rpb25zIGlzIHNldCwgaWdub3JlIHRoZSBob3N0IGRlcGVuZGVuY2UsIGlmIGFueSwgd2hpbGUKKyAgLy8vIGFjY291bnRpbmcgZm9yIHRoZSBudW1iZXIgb2YgZGVwZW5kZW5jZXMuCisgIGJvb2wgaGFzU2luZ2xlRGV2aWNlRGVwZW5kZW5jZShib29sIERvTm90Q29uc2lkZXJIb3N0QWN0aW9ucyA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBzaW5nbGUgZGV2aWNlIGRlcGVuZGVuY2Ugb2YgdGhpcyBhY3Rpb24uIFRoaXMgZnVuY3Rpb24gaXMgb25seQorICAvLy8gZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGlmIGEgc2luZ2xlIGRldmljZSBkZXBlbmRlbmNlIGV4aXN0cy4gSWYgXGEKKyAgLy8vIERvTm90Q29uc2lkZXJIb3N0QWN0aW9ucyBpcyBzZXQsIGEgaG9zdCBkZXBlbmRlbmNlIGlzIGFsbG93ZWQuCisgIEFjdGlvbiAqCisgIGdldFNpbmdsZURldmljZURlcGVuZGVuY2UoYm9vbCBEb05vdENvbnNpZGVySG9zdEFjdGlvbnMgPSBmYWxzZSkgY29uc3Q7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBY3Rpb24gKkEpIHsgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBPZmZsb2FkQ2xhc3M7IH0KK307CisKK2NsYXNzIEpvYkFjdGlvbiA6IHB1YmxpYyBBY3Rpb24geworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3Byb3RlY3RlZDoKKyAgSm9iQWN0aW9uKEFjdGlvbkNsYXNzIEtpbmQsIEFjdGlvbiAqSW5wdXQsIHR5cGVzOjpJRCBUeXBlKTsKKyAgSm9iQWN0aW9uKEFjdGlvbkNsYXNzIEtpbmQsIGNvbnN0IEFjdGlvbkxpc3QgJklucHV0cywgdHlwZXM6OklEIFR5cGUpOworCitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQWN0aW9uICpBKSB7CisgICAgcmV0dXJuIChBLT5nZXRLaW5kKCkgPj0gSm9iQ2xhc3NGaXJzdCAmJgorICAgICAgICAgICAgQS0+Z2V0S2luZCgpIDw9IEpvYkNsYXNzTGFzdCk7CisgIH0KK307CisKK2NsYXNzIFByZXByb2Nlc3NKb2JBY3Rpb24gOiBwdWJsaWMgSm9iQWN0aW9uIHsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBQcmVwcm9jZXNzSm9iQWN0aW9uKEFjdGlvbiAqSW5wdXQsIHR5cGVzOjpJRCBPdXRwdXRUeXBlKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEFjdGlvbiAqQSkgeworICAgIHJldHVybiBBLT5nZXRLaW5kKCkgPT0gUHJlcHJvY2Vzc0pvYkNsYXNzOworICB9Cit9OworCitjbGFzcyBQcmVjb21waWxlSm9iQWN0aW9uIDogcHVibGljIEpvYkFjdGlvbiB7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgUHJlY29tcGlsZUpvYkFjdGlvbihBY3Rpb24gKklucHV0LCB0eXBlczo6SUQgT3V0cHV0VHlwZSk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBY3Rpb24gKkEpIHsKKyAgICByZXR1cm4gQS0+Z2V0S2luZCgpID09IFByZWNvbXBpbGVKb2JDbGFzczsKKyAgfQorfTsKKworY2xhc3MgQW5hbHl6ZUpvYkFjdGlvbiA6IHB1YmxpYyBKb2JBY3Rpb24geworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIEFuYWx5emVKb2JBY3Rpb24oQWN0aW9uICpJbnB1dCwgdHlwZXM6OklEIE91dHB1dFR5cGUpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQWN0aW9uICpBKSB7CisgICAgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBBbmFseXplSm9iQ2xhc3M7CisgIH0KK307CisKK2NsYXNzIE1pZ3JhdGVKb2JBY3Rpb24gOiBwdWJsaWMgSm9iQWN0aW9uIHsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBNaWdyYXRlSm9iQWN0aW9uKEFjdGlvbiAqSW5wdXQsIHR5cGVzOjpJRCBPdXRwdXRUeXBlKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEFjdGlvbiAqQSkgeworICAgIHJldHVybiBBLT5nZXRLaW5kKCkgPT0gTWlncmF0ZUpvYkNsYXNzOworICB9Cit9OworCitjbGFzcyBDb21waWxlSm9iQWN0aW9uIDogcHVibGljIEpvYkFjdGlvbiB7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgQ29tcGlsZUpvYkFjdGlvbihBY3Rpb24gKklucHV0LCB0eXBlczo6SUQgT3V0cHV0VHlwZSk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBY3Rpb24gKkEpIHsKKyAgICByZXR1cm4gQS0+Z2V0S2luZCgpID09IENvbXBpbGVKb2JDbGFzczsKKyAgfQorfTsKKworY2xhc3MgQmFja2VuZEpvYkFjdGlvbiA6IHB1YmxpYyBKb2JBY3Rpb24geworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIEJhY2tlbmRKb2JBY3Rpb24oQWN0aW9uICpJbnB1dCwgdHlwZXM6OklEIE91dHB1dFR5cGUpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQWN0aW9uICpBKSB7CisgICAgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBCYWNrZW5kSm9iQ2xhc3M7CisgIH0KK307CisKK2NsYXNzIEFzc2VtYmxlSm9iQWN0aW9uIDogcHVibGljIEpvYkFjdGlvbiB7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgQXNzZW1ibGVKb2JBY3Rpb24oQWN0aW9uICpJbnB1dCwgdHlwZXM6OklEIE91dHB1dFR5cGUpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQWN0aW9uICpBKSB7CisgICAgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBBc3NlbWJsZUpvYkNsYXNzOworICB9Cit9OworCitjbGFzcyBMaW5rSm9iQWN0aW9uIDogcHVibGljIEpvYkFjdGlvbiB7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgTGlua0pvYkFjdGlvbihBY3Rpb25MaXN0ICZJbnB1dHMsIHR5cGVzOjpJRCBUeXBlKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEFjdGlvbiAqQSkgeworICAgIHJldHVybiBBLT5nZXRLaW5kKCkgPT0gTGlua0pvYkNsYXNzOworICB9Cit9OworCitjbGFzcyBMaXBvSm9iQWN0aW9uIDogcHVibGljIEpvYkFjdGlvbiB7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgTGlwb0pvYkFjdGlvbihBY3Rpb25MaXN0ICZJbnB1dHMsIHR5cGVzOjpJRCBUeXBlKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEFjdGlvbiAqQSkgeworICAgIHJldHVybiBBLT5nZXRLaW5kKCkgPT0gTGlwb0pvYkNsYXNzOworICB9Cit9OworCitjbGFzcyBEc3ltdXRpbEpvYkFjdGlvbiA6IHB1YmxpYyBKb2JBY3Rpb24geworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIERzeW11dGlsSm9iQWN0aW9uKEFjdGlvbkxpc3QgJklucHV0cywgdHlwZXM6OklEIFR5cGUpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQWN0aW9uICpBKSB7CisgICAgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBEc3ltdXRpbEpvYkNsYXNzOworICB9Cit9OworCitjbGFzcyBWZXJpZnlKb2JBY3Rpb24gOiBwdWJsaWMgSm9iQWN0aW9uIHsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBWZXJpZnlKb2JBY3Rpb24oQWN0aW9uQ2xhc3MgS2luZCwgQWN0aW9uICpJbnB1dCwgdHlwZXM6OklEIFR5cGUpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQWN0aW9uICpBKSB7CisgICAgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBWZXJpZnlEZWJ1Z0luZm9Kb2JDbGFzcyB8fAorICAgICAgICAgICBBLT5nZXRLaW5kKCkgPT0gVmVyaWZ5UENISm9iQ2xhc3M7CisgIH0KK307CisKK2NsYXNzIFZlcmlmeURlYnVnSW5mb0pvYkFjdGlvbiA6IHB1YmxpYyBWZXJpZnlKb2JBY3Rpb24geworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIFZlcmlmeURlYnVnSW5mb0pvYkFjdGlvbihBY3Rpb24gKklucHV0LCB0eXBlczo6SUQgVHlwZSk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBY3Rpb24gKkEpIHsKKyAgICByZXR1cm4gQS0+Z2V0S2luZCgpID09IFZlcmlmeURlYnVnSW5mb0pvYkNsYXNzOworICB9Cit9OworCitjbGFzcyBWZXJpZnlQQ0hKb2JBY3Rpb24gOiBwdWJsaWMgVmVyaWZ5Sm9iQWN0aW9uIHsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBWZXJpZnlQQ0hKb2JBY3Rpb24oQWN0aW9uICpJbnB1dCwgdHlwZXM6OklEIFR5cGUpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQWN0aW9uICpBKSB7CisgICAgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBWZXJpZnlQQ0hKb2JDbGFzczsKKyAgfQorfTsKKworY2xhc3MgT2ZmbG9hZEJ1bmRsaW5nSm9iQWN0aW9uIDogcHVibGljIEpvYkFjdGlvbiB7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgLy8gT2ZmbG9hZGluZyBidW5kbGluZyBkb2Vzbid0IGNoYW5nZSB0aGUgdHlwZSBvZiBvdXRwdXQuCisgIE9mZmxvYWRCdW5kbGluZ0pvYkFjdGlvbihBY3Rpb25MaXN0ICZJbnB1dHMpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQWN0aW9uICpBKSB7CisgICAgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBPZmZsb2FkQnVuZGxpbmdKb2JDbGFzczsKKyAgfQorfTsKKworY2xhc3MgT2ZmbG9hZFVuYnVuZGxpbmdKb2JBY3Rpb24gZmluYWwgOiBwdWJsaWMgSm9iQWN0aW9uIHsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICAvLy8gVHlwZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY3Rpb25zIHRoYXQgZGVwZW5kIG9uIHRoaXMKKyAgLy8vIHVuYnVuZGxpbmcgYWN0aW9uLgorICBzdHJ1Y3QgRGVwZW5kZW50QWN0aW9uSW5mbyBmaW5hbCB7CisgICAgLy8vIFxicmllZiBUaGUgdG9vbCBjaGFpbiBvZiB0aGUgZGVwZW5kZW50IGFjdGlvbi4KKyAgICBjb25zdCBUb29sQ2hhaW4gKkRlcGVuZGVudFRvb2xDaGFpbiA9IG51bGxwdHI7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBib3VuZCBhcmNoaXRlY3R1cmUgb2YgdGhlIGRlcGVuZGVudCBhY3Rpb24uCisgICAgU3RyaW5nUmVmIERlcGVuZGVudEJvdW5kQXJjaDsKKworICAgIC8vLyBcYnJpZWYgVGhlIG9mZmxvYWQga2luZCBvZiB0aGUgZGVwZW5kZW50IGFjdGlvbi4KKyAgICBjb25zdCBPZmZsb2FkS2luZCBEZXBlbmRlbnRPZmZsb2FkS2luZCA9IE9GS19Ob25lOworCisgICAgRGVwZW5kZW50QWN0aW9uSW5mbyhjb25zdCBUb29sQ2hhaW4gKkRlcGVuZGVudFRvb2xDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEZXBlbmRlbnRCb3VuZEFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPZmZsb2FkS2luZCBEZXBlbmRlbnRPZmZsb2FkS2luZCkKKyAgICAgICAgOiBEZXBlbmRlbnRUb29sQ2hhaW4oRGVwZW5kZW50VG9vbENoYWluKSwKKyAgICAgICAgICBEZXBlbmRlbnRCb3VuZEFyY2goRGVwZW5kZW50Qm91bmRBcmNoKSwKKyAgICAgICAgICBEZXBlbmRlbnRPZmZsb2FkS2luZChEZXBlbmRlbnRPZmZsb2FkS2luZCkge30KKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIENvbnRhaW5lciB0aGF0IGtlZXBzIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggZGVwZW5kZW5jZSBvZiB0aGlzIHVuYnVuZGxpbmcKKyAgLy8vIGFjdGlvbi4KKyAgU21hbGxWZWN0b3I8RGVwZW5kZW50QWN0aW9uSW5mbywgNj4gRGVwZW5kZW50QWN0aW9uSW5mb0FycmF5OworCitwdWJsaWM6CisgIC8vIE9mZmxvYWRpbmcgdW5idW5kbGluZyBkb2Vzbid0IGNoYW5nZSB0aGUgdHlwZSBvZiBvdXRwdXQuCisgIE9mZmxvYWRVbmJ1bmRsaW5nSm9iQWN0aW9uKEFjdGlvbiAqSW5wdXQpOworCisgIC8vLyBSZWdpc3RlciBpbmZvcm1hdGlvbiBhYm91dCBhIGRlcGVuZGVudCBhY3Rpb24uCisgIHZvaWQgcmVnaXN0ZXJEZXBlbmRlbnRBY3Rpb25JbmZvKGNvbnN0IFRvb2xDaGFpbiAqVEMsIFN0cmluZ1JlZiBCb3VuZEFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZmxvYWRLaW5kIEtpbmQpIHsKKyAgICBEZXBlbmRlbnRBY3Rpb25JbmZvQXJyYXkucHVzaF9iYWNrKHtUQywgQm91bmRBcmNoLCBLaW5kfSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhbGwgZGVwZW5kaW5nIGFjdGlvbnMuCisgIEFycmF5UmVmPERlcGVuZGVudEFjdGlvbkluZm8+IGdldERlcGVuZGVudEFjdGlvbnNJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBEZXBlbmRlbnRBY3Rpb25JbmZvQXJyYXk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEFjdGlvbiAqQSkgeworICAgIHJldHVybiBBLT5nZXRLaW5kKCkgPT0gT2ZmbG9hZFVuYnVuZGxpbmdKb2JDbGFzczsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgZHJpdmVyCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19EUklWRVJfQUNUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9Db21waWxhdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0NvbXBpbGF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI0YmI1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9Db21waWxhdGlvbi5oCkBAIC0wLDAgKzEsMzA5IEBACisvLz09PS0gQ29tcGlsYXRpb24uaCAtIENvbXBpbGF0aW9uIFRhc2sgRGF0YSBTdHJ1Y3R1cmUgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRFJJVkVSX0NPTVBJTEFUSU9OX0gKKyNkZWZpbmUgTExWTV9DTEFOR19EUklWRVJfQ09NUElMQVRJT05fSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0RyaXZlci9BY3Rpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9Ecml2ZXIvSm9iLmgiCisjaW5jbHVkZSAiY2xhbmcvRHJpdmVyL1V0aWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL09wdGlvbi9PcHRpb24uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvcHQgeworCitjbGFzcyBEZXJpdmVkQXJnTGlzdDsKK2NsYXNzIElucHV0QXJnTGlzdDsKKworfSAvLyBuYW1lc3BhY2Ugb3B0Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgZHJpdmVyIHsKKworY2xhc3MgRHJpdmVyOworY2xhc3MgVG9vbENoYWluOworCisvLy8gQ29tcGlsYXRpb24gLSBBIHNldCBvZiB0YXNrcyB0byBwZXJmb3JtIGZvciBhIHNpbmdsZSBkcml2ZXIKKy8vLyBpbnZvY2F0aW9uLgorY2xhc3MgQ29tcGlsYXRpb24geworICAvLy8gVGhlIGRyaXZlciB3ZSB3ZXJlIGNyZWF0ZWQgYnkuCisgIGNvbnN0IERyaXZlciAmVGhlRHJpdmVyOworCisgIC8vLyBUaGUgZGVmYXVsdCB0b29sIGNoYWluLgorICBjb25zdCBUb29sQ2hhaW4gJkRlZmF1bHRUb29sQ2hhaW47CisKKyAgLy8vIEEgbWFzayBvZiBhbGwgdGhlIHByb2dyYW1taW5nIG1vZGVscyB0aGUgaG9zdCBoYXMgdG8gc3VwcG9ydCBpbiB0aGUKKyAgLy8vIGN1cnJlbnQgY29tcGlsYXRpb24uCisgIHVuc2lnbmVkIEFjdGl2ZU9mZmxvYWRNYXNrID0gMDsKKworICAvLy8gQXJyYXkgd2l0aCB0aGUgdG9vbGNoYWlucyBvZiBvZmZsb2FkaW5nIGhvc3QgYW5kIGRldmljZXMgaW4gdGhlIG9yZGVyIHRoZXkKKyAgLy8vIHdlcmUgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyLiBXZSBhcmUgcHJlc2VydmluZyB0aGF0IG9yZGVyIGluIGNhc2UgdGhlIGNvZGUKKyAgLy8vIGdlbmVyYXRpb24gbmVlZHMgdG8gZGVyaXZlIGEgcHJvZ3JhbW1pbmctbW9kZWwtc3BlY2lmaWMgc2VtYW50aWMgb3V0IG9mCisgIC8vLyBpdC4KKyAgc3RkOjptdWx0aW1hcDxBY3Rpb246Ok9mZmxvYWRLaW5kLCBjb25zdCBUb29sQ2hhaW4gKj4KKyAgICAgIE9yZGVyZWRPZmZsb2FkaW5nVG9vbGNoYWluczsKKworICAvLy8gVGhlIG9yaWdpbmFsICh1bnRyYW5zbGF0ZWQpIGlucHV0IGFyZ3VtZW50IGxpc3QuCisgIGxsdm06Om9wdDo6SW5wdXRBcmdMaXN0ICpBcmdzOworCisgIC8vLyBUaGUgZHJpdmVyIHRyYW5zbGF0ZWQgYXJndW1lbnRzLiBOb3RlIHRoYXQgdG9vbGNoYWlucyBtYXkgcGVyZm9ybSB0aGVpcgorICAvLy8gb3duIGFyZ3VtZW50IHRyYW5zbGF0aW9uLgorICBsbHZtOjpvcHQ6OkRlcml2ZWRBcmdMaXN0ICpUcmFuc2xhdGVkQXJnczsKKworICAvLy8gVGhlIGxpc3Qgb2YgYWN0aW9ucyB3ZSd2ZSBjcmVhdGVkIHZpYSBNYWtlQWN0aW9uLiAgVGhpcyBpcyBub3QgYWNjZXNzaWJsZQorICAvLy8gdG8gY29uc3VtZXJzOyBpdCdzIGhlcmUganVzdCB0byBtYW5hZ2Ugb3duZXJzaGlwLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QWN0aW9uPj4gQWxsQWN0aW9uczsKKworICAvLy8gVGhlIGxpc3Qgb2YgYWN0aW9ucy4gIFRoaXMgaXMgbWFpbnRhaW5lZCBhbmQgbW9kaWZpZWQgYnkgY29uc3VtZXJzLCB2aWEKKyAgLy8vIGdldEFjdGlvbnMoKS4KKyAgQWN0aW9uTGlzdCBBY3Rpb25zOworCisgIC8vLyBUaGUgcm9vdCBsaXN0IG9mIGpvYnMuCisgIEpvYkxpc3QgSm9iczsKKworICAvLy8gQ2FjaGUgb2YgdHJhbnNsYXRlZCBhcmd1bWVudHMgZm9yIGEgcGFydGljdWxhciB0b29sIGNoYWluLCBib3VuZAorICAvLy8gYXJjaGl0ZWN0dXJlLCBhbmQgZGV2aWNlIG9mZmxvYWQga2luZC4KKyAgc3RydWN0IFRDQXJnc0tleSBmaW5hbCB7CisgICAgY29uc3QgVG9vbENoYWluICpUQyA9IG51bGxwdHI7CisgICAgU3RyaW5nUmVmIEJvdW5kQXJjaDsKKyAgICBBY3Rpb246Ok9mZmxvYWRLaW5kIERldmljZU9mZmxvYWRLaW5kID0gQWN0aW9uOjpPRktfTm9uZTsKKworICAgIFRDQXJnc0tleShjb25zdCBUb29sQ2hhaW4gKlRDLCBTdHJpbmdSZWYgQm91bmRBcmNoLAorICAgICAgICAgICAgICBBY3Rpb246Ok9mZmxvYWRLaW5kIERldmljZU9mZmxvYWRLaW5kKQorICAgICAgICA6IFRDKFRDKSwgQm91bmRBcmNoKEJvdW5kQXJjaCksIERldmljZU9mZmxvYWRLaW5kKERldmljZU9mZmxvYWRLaW5kKSB7fQorCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgVENBcmdzS2V5ICZLKSBjb25zdCB7CisgICAgICBpZiAoVEMgPCBLLlRDKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGVsc2UgaWYgKFRDID09IEsuVEMgJiYgQm91bmRBcmNoIDwgSy5Cb3VuZEFyY2gpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZWxzZSBpZiAoVEMgPT0gSy5UQyAmJiBCb3VuZEFyY2ggPT0gSy5Cb3VuZEFyY2ggJiYKKyAgICAgICAgICAgICAgIERldmljZU9mZmxvYWRLaW5kIDwgSy5EZXZpY2VPZmZsb2FkS2luZCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9OworICBzdGQ6Om1hcDxUQ0FyZ3NLZXksIGxsdm06Om9wdDo6RGVyaXZlZEFyZ0xpc3QgKj4gVENBcmdzOworCisgIC8vLyBUZW1wb3JhcnkgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIHJlbW92ZWQgb24gZXhpdC4KKyAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0IFRlbXBGaWxlczsKKworICAvLy8gUmVzdWx0IGZpbGVzIHdoaWNoIHNob3VsZCBiZSByZW1vdmVkIG9uIGZhaWx1cmUuCisgIEFyZ1N0cmluZ01hcCBSZXN1bHRGaWxlczsKKworICAvLy8gUmVzdWx0IGZpbGVzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgY29ycmVjdGx5IG9uIGZhaWx1cmUsIGFuZCB3aGljaCBzaG91bGQKKyAgLy8vIG9ubHkgYmUgcmVtb3ZlZCBpZiB3ZSBjcmFzaC4KKyAgQXJnU3RyaW5nTWFwIEZhaWx1cmVSZXN1bHRGaWxlczsKKworICAvLy8gT3B0aW9uYWwgcmVkaXJlY3Rpb24gZm9yIHN0ZGluLCBzdGRvdXQsIHN0ZGVyci4KKyAgc3RkOjp2ZWN0b3I8T3B0aW9uYWw8U3RyaW5nUmVmPj4gUmVkaXJlY3RzOworCisgIC8vLyBXaGV0aGVyIHdlJ3JlIGNvbXBpbGluZyBmb3IgZGlhZ25vc3RpYyBwdXJwb3Nlcy4KKyAgYm9vbCBGb3JEaWFnbm9zdGljcyA9IGZhbHNlOworCisgIC8vLyBXaGV0aGVyIGFuIGVycm9yIGR1cmluZyB0aGUgcGFyc2luZyBvZiB0aGUgaW5wdXQgYXJncy4KKyAgYm9vbCBDb250YWluc0Vycm9yOworCitwdWJsaWM6CisgIENvbXBpbGF0aW9uKGNvbnN0IERyaXZlciAmRCwgY29uc3QgVG9vbENoYWluICZEZWZhdWx0VG9vbENoYWluLAorICAgICAgICAgICAgICBsbHZtOjpvcHQ6OklucHV0QXJnTGlzdCAqQXJncywKKyAgICAgICAgICAgICAgbGx2bTo6b3B0OjpEZXJpdmVkQXJnTGlzdCAqVHJhbnNsYXRlZEFyZ3MsIGJvb2wgQ29udGFpbnNFcnJvcik7CisgIH5Db21waWxhdGlvbigpOworCisgIGNvbnN0IERyaXZlciAmZ2V0RHJpdmVyKCkgY29uc3QgeyByZXR1cm4gVGhlRHJpdmVyOyB9CisKKyAgY29uc3QgVG9vbENoYWluICZnZXREZWZhdWx0VG9vbENoYWluKCkgY29uc3QgeyByZXR1cm4gRGVmYXVsdFRvb2xDaGFpbjsgfQorCisgIHVuc2lnbmVkIGlzT2ZmbG9hZGluZ0hvc3RLaW5kKEFjdGlvbjo6T2ZmbG9hZEtpbmQgS2luZCkgY29uc3QgeworICAgIHJldHVybiBBY3RpdmVPZmZsb2FkTWFzayAmIEtpbmQ7CisgIH0KKworICAvLy8gSXRlcmF0b3IgdGhhdCB2aXNpdHMgZGV2aWNlIHRvb2xjaGFpbnMgb2YgYSBnaXZlbiBraW5kLgorICB1c2luZyBjb25zdF9vZmZsb2FkX3Rvb2xjaGFpbnNfaXRlcmF0b3IgPQorICAgICAgY29uc3Qgc3RkOjptdWx0aW1hcDxBY3Rpb246Ok9mZmxvYWRLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUb29sQ2hhaW4gKj46OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBjb25zdF9vZmZsb2FkX3Rvb2xjaGFpbnNfcmFuZ2UgPQorICAgICAgc3RkOjpwYWlyPGNvbnN0X29mZmxvYWRfdG9vbGNoYWluc19pdGVyYXRvciwKKyAgICAgICAgICAgICAgICBjb25zdF9vZmZsb2FkX3Rvb2xjaGFpbnNfaXRlcmF0b3I+OworCisgIHRlbXBsYXRlIDxBY3Rpb246Ok9mZmxvYWRLaW5kIEtpbmQ+CisgIGNvbnN0X29mZmxvYWRfdG9vbGNoYWluc19yYW5nZSBnZXRPZmZsb2FkVG9vbENoYWlucygpIGNvbnN0IHsKKyAgICByZXR1cm4gT3JkZXJlZE9mZmxvYWRpbmdUb29sY2hhaW5zLmVxdWFsX3JhbmdlKEtpbmQpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGFuIG9mZmxvYWRpbmcgdG9vbCBjaGFpbiBvZiBhIGdpdmVuIGtpbmQgZXhpc3RzLgorICB0ZW1wbGF0ZSA8QWN0aW9uOjpPZmZsb2FkS2luZCBLaW5kPiBib29sIGhhc09mZmxvYWRUb29sQ2hhaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIE9yZGVyZWRPZmZsb2FkaW5nVG9vbGNoYWlucy5maW5kKEtpbmQpICE9CisgICAgICAgICAgIE9yZGVyZWRPZmZsb2FkaW5nVG9vbGNoYWlucy5lbmQoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYW4gb2ZmbG9hZCB0b29sY2hhaW4gb2YgdGhlIHByb3ZpZGVkIGtpbmQuIE9ubHkgb25lIGlzIGV4cGVjdGVkIHRvCisgIC8vLyBleGlzdC4KKyAgdGVtcGxhdGUgPEFjdGlvbjo6T2ZmbG9hZEtpbmQgS2luZD4KKyAgY29uc3QgVG9vbENoYWluICpnZXRTaW5nbGVPZmZsb2FkVG9vbENoYWluKCkgY29uc3QgeworICAgIGF1dG8gVENzID0gZ2V0T2ZmbG9hZFRvb2xDaGFpbnM8S2luZD4oKTsKKworICAgIGFzc2VydChUQ3MuZmlyc3QgIT0gVENzLnNlY29uZCAmJgorICAgICAgICAgICAiTm8gdG9vbCBjaGFpbnMgb2YgdGhlIHNlbGVjdGVkIGtpbmQgZXhpc3QhIik7CisgICAgYXNzZXJ0KHN0ZDo6bmV4dChUQ3MuZmlyc3QpID09IFRDcy5zZWNvbmQgJiYKKyAgICAgICAgICAgIk1vcmUgdGhhbiBvbmUgdG9vbCBjaGFpbiBvZiB0aGUgdGhpcyBraW5kIGV4aXN0LiIpOworICAgIHJldHVybiBUQ3MuZmlyc3QtPnNlY29uZDsKKyAgfQorCisgIHZvaWQgYWRkT2ZmbG9hZERldmljZVRvb2xDaGFpbihjb25zdCBUb29sQ2hhaW4gKkRldmljZVRvb2xDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjo6T2ZmbG9hZEtpbmQgT2ZmbG9hZEtpbmQpIHsKKyAgICBhc3NlcnQoT2ZmbG9hZEtpbmQgIT0gQWN0aW9uOjpPRktfSG9zdCAmJiBPZmZsb2FkS2luZCAhPSBBY3Rpb246Ok9GS19Ob25lICYmCisgICAgICAgICAgICJUaGlzIGlzIG5vdCBhIGRldmljZSB0b29sIGNoYWluISIpOworCisgICAgLy8gVXBkYXRlIHRoZSBob3N0IG9mZmxvYWQga2luZCB0byBhbHNvIGNvbnRhaW4gdGhpcyBraW5kLgorICAgIEFjdGl2ZU9mZmxvYWRNYXNrIHw9IE9mZmxvYWRLaW5kOworICAgIE9yZGVyZWRPZmZsb2FkaW5nVG9vbGNoYWlucy5pbnNlcnQoCisgICAgICAgIHN0ZDo6bWFrZV9wYWlyKE9mZmxvYWRLaW5kLCBEZXZpY2VUb29sQ2hhaW4pKTsKKyAgfQorCisgIGNvbnN0IGxsdm06Om9wdDo6SW5wdXRBcmdMaXN0ICZnZXRJbnB1dEFyZ3MoKSBjb25zdCB7IHJldHVybiAqQXJnczsgfQorCisgIGNvbnN0IGxsdm06Om9wdDo6RGVyaXZlZEFyZ0xpc3QgJmdldEFyZ3MoKSBjb25zdCB7IHJldHVybiAqVHJhbnNsYXRlZEFyZ3M7IH0KKworICBsbHZtOjpvcHQ6OkRlcml2ZWRBcmdMaXN0ICZnZXRBcmdzKCkgeyByZXR1cm4gKlRyYW5zbGF0ZWRBcmdzOyB9CisKKyAgQWN0aW9uTGlzdCAmZ2V0QWN0aW9ucygpIHsgcmV0dXJuIEFjdGlvbnM7IH0KKyAgY29uc3QgQWN0aW9uTGlzdCAmZ2V0QWN0aW9ucygpIGNvbnN0IHsgcmV0dXJuIEFjdGlvbnM7IH0KKworICAvLy8gQ3JlYXRlcyBhIG5ldyBBY3Rpb24gb3duZWQgYnkgdGhpcyBDb21waWxhdGlvbi4KKyAgLy8vCisgIC8vLyBUaGUgbmV3IEFjdGlvbiBpcyAqbm90KiBhZGRlZCB0byB0aGUgbGlzdCByZXR1cm5lZCBieSBnZXRBY3Rpb25zKCkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPiBUICpNYWtlQWN0aW9uKEFyZ3MgJiYuLi4gQXJnKSB7CisgICAgVCAqUmF3UHRyID0gbmV3IFQoc3RkOjpmb3J3YXJkPEFyZ3M+KEFyZykuLi4pOworICAgIEFsbEFjdGlvbnMucHVzaF9iYWNrKHN0ZDo6dW5pcXVlX3B0cjxBY3Rpb24+KFJhd1B0cikpOworICAgIHJldHVybiBSYXdQdHI7CisgIH0KKworICBKb2JMaXN0ICZnZXRKb2JzKCkgeyByZXR1cm4gSm9iczsgfQorICBjb25zdCBKb2JMaXN0ICZnZXRKb2JzKCkgY29uc3QgeyByZXR1cm4gSm9iczsgfQorCisgIHZvaWQgYWRkQ29tbWFuZChzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZD4gQykgeyBKb2JzLmFkZEpvYihzdGQ6Om1vdmUoQykpOyB9CisKKyAgY29uc3QgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZnZXRUZW1wRmlsZXMoKSBjb25zdCB7IHJldHVybiBUZW1wRmlsZXM7IH0KKworICBjb25zdCBBcmdTdHJpbmdNYXAgJmdldFJlc3VsdEZpbGVzKCkgY29uc3QgeyByZXR1cm4gUmVzdWx0RmlsZXM7IH0KKworICBjb25zdCBBcmdTdHJpbmdNYXAgJmdldEZhaWx1cmVSZXN1bHRGaWxlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gRmFpbHVyZVJlc3VsdEZpbGVzOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHN5c3Jvb3QgcGF0aC4KKyAgU3RyaW5nUmVmIGdldFN5c1Jvb3QoKSBjb25zdDsKKworICAvLy8gZ2V0QXJnc0ZvclRvb2xDaGFpbiAtIFJldHVybiB0aGUgZGVyaXZlZCBhcmd1bWVudCBsaXN0IGZvciB0aGUKKyAgLy8vIHRvb2wgY2hhaW4gXHAgVEMgKG9yIHRoZSBkZWZhdWx0IHRvb2wgY2hhaW4sIGlmIFRDIGlzIG5vdCBzcGVjaWZpZWQpLgorICAvLy8gSWYgYSBkZXZpY2Ugb2ZmbG9hZGluZyBraW5kIGlzIHNwZWNpZmllZCwgYSB0cmFuc2xhdGlvbiBzcGVjaWZpYyBmb3IgdGhhdAorICAvLy8ga2luZCBpcyBwZXJmb3JtZWQsIGlmIGFueS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQm91bmRBcmNoIC0gVGhlIGJvdW5kIGFyY2hpdGVjdHVyZSBuYW1lLCBvciAwLgorICAvLy8gXHBhcmFtIERldmljZU9mZmxvYWRLaW5kIC0gVGhlIG9mZmxvYWQgZGV2aWNlIGtpbmQgdGhhdCBzaG91bGQgYmUgdXNlZCBpbgorICAvLy8gdGhlIHRyYW5zbGF0aW9uLCBpZiBhbnkuCisgIGNvbnN0IGxsdm06Om9wdDo6RGVyaXZlZEFyZ0xpc3QgJgorICBnZXRBcmdzRm9yVG9vbENoYWluKGNvbnN0IFRvb2xDaGFpbiAqVEMsIFN0cmluZ1JlZiBCb3VuZEFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOjpPZmZsb2FkS2luZCBEZXZpY2VPZmZsb2FkS2luZCk7CisKKyAgLy8vIGFkZFRlbXBGaWxlIC0gQWRkIGEgZmlsZSB0byByZW1vdmUgb24gZXhpdCwgYW5kIHJldHVybnMgaXRzCisgIC8vLyBhcmd1bWVudC4KKyAgY29uc3QgY2hhciAqYWRkVGVtcEZpbGUoY29uc3QgY2hhciAqTmFtZSkgeworICAgIFRlbXBGaWxlcy5wdXNoX2JhY2soTmFtZSk7CisgICAgcmV0dXJuIE5hbWU7CisgIH0KKworICAvLy8gYWRkUmVzdWx0RmlsZSAtIEFkZCBhIGZpbGUgdG8gcmVtb3ZlIG9uIGZhaWx1cmUsIGFuZCByZXR1cm5zIGl0cworICAvLy8gYXJndW1lbnQuCisgIGNvbnN0IGNoYXIgKmFkZFJlc3VsdEZpbGUoY29uc3QgY2hhciAqTmFtZSwgY29uc3QgSm9iQWN0aW9uICpKQSkgeworICAgIFJlc3VsdEZpbGVzW0pBXSA9IE5hbWU7CisgICAgcmV0dXJuIE5hbWU7CisgIH0KKworICAvLy8gYWRkRmFpbHVyZVJlc3VsdEZpbGUgLSBBZGQgYSBmaWxlIHRvIHJlbW92ZSBpZiB3ZSBjcmFzaCwgYW5kIHJldHVybnMgaXRzCisgIC8vLyBhcmd1bWVudC4KKyAgY29uc3QgY2hhciAqYWRkRmFpbHVyZVJlc3VsdEZpbGUoY29uc3QgY2hhciAqTmFtZSwgY29uc3QgSm9iQWN0aW9uICpKQSkgeworICAgIEZhaWx1cmVSZXN1bHRGaWxlc1tKQV0gPSBOYW1lOworICAgIHJldHVybiBOYW1lOworICB9CisKKyAgLy8vIENsZWFudXBGaWxlIC0gRGVsZXRlIGEgZ2l2ZW4gZmlsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gSXNzdWVFcnJvcnMgLSBSZXBvcnQgZmFpbHVyZXMgYXMgZXJyb3JzLgorICAvLy8gXHJldHVybiBXaGV0aGVyIHRoZSBmaWxlIHdhcyByZW1vdmVkIHN1Y2Nlc3NmdWxseS4KKyAgYm9vbCBDbGVhbnVwRmlsZShjb25zdCBjaGFyICpGaWxlLCBib29sIElzc3VlRXJyb3JzID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyBDbGVhbnVwRmlsZUxpc3QgLSBSZW1vdmUgdGhlIGZpbGVzIGluIHRoZSBnaXZlbiBsaXN0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBJc3N1ZUVycm9ycyAtIFJlcG9ydCBmYWlsdXJlcyBhcyBlcnJvcnMuCisgIC8vLyBccmV0dXJuIFdoZXRoZXIgYWxsIGZpbGVzIHdlcmUgcmVtb3ZlZCBzdWNjZXNzZnVsbHkuCisgIGJvb2wgQ2xlYW51cEZpbGVMaXN0KGNvbnN0IGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmRmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNzdWVFcnJvcnMgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIENsZWFudXBGaWxlTWFwIC0gUmVtb3ZlIHRoZSBmaWxlcyBpbiB0aGUgZ2l2ZW4gbWFwLgorICAvLy8KKyAgLy8vIFxwYXJhbSBKQSAtIElmIHNwZWNpZmllZCwgb25seSBkZWxldGUgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgIC8vLyBKb2JBY3Rpb24uICBPdGhlcndpc2UsIGRlbGV0ZSBhbGwgZmlsZXMgaW4gdGhlIG1hcC4KKyAgLy8vIFxwYXJhbSBJc3N1ZUVycm9ycyAtIFJlcG9ydCBmYWlsdXJlcyBhcyBlcnJvcnMuCisgIC8vLyBccmV0dXJuIFdoZXRoZXIgYWxsIGZpbGVzIHdlcmUgcmVtb3ZlZCBzdWNjZXNzZnVsbHkuCisgIGJvb2wgQ2xlYW51cEZpbGVNYXAoY29uc3QgQXJnU3RyaW5nTWFwICZGaWxlcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBKb2JBY3Rpb24gKkpBLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNzdWVFcnJvcnMgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIEV4ZWN1dGVDb21tYW5kIC0gRXhlY3V0ZSBhbiBhY3R1YWwgY29tbWFuZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRmFpbGluZ0NvbW1hbmQgLSBGb3Igbm9uLXplcm8gcmVzdWx0cywgdGhpcyB3aWxsIGJlIHNldCB0byB0aGUKKyAgLy8vIENvbW1hbmQgd2hpY2ggZmFpbGVkLCBpZiBhbnkuCisgIC8vLyBccmV0dXJuIFRoZSByZXN1bHQgY29kZSBvZiB0aGUgc3VicHJvY2Vzcy4KKyAgaW50IEV4ZWN1dGVDb21tYW5kKGNvbnN0IENvbW1hbmQgJkMsIGNvbnN0IENvbW1hbmQgKiZGYWlsaW5nQ29tbWFuZCkgY29uc3Q7CisKKyAgLy8vIEV4ZWN1dGVKb2IgLSBFeGVjdXRlIGEgc2luZ2xlIGpvYi4KKyAgLy8vCisgIC8vLyBccGFyYW0gRmFpbGluZ0NvbW1hbmRzIC0gRm9yIG5vbi16ZXJvIHJlc3VsdHMsIHRoaXMgd2lsbCBiZSBhIHZlY3RvciBvZgorICAvLy8gZmFpbGluZyBjb21tYW5kcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCByZXN1bHQgY29kZS4KKyAgdm9pZCBFeGVjdXRlSm9icygKKyAgICAgIGNvbnN0IEpvYkxpc3QgJkpvYnMsCisgICAgICBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGludCwgY29uc3QgQ29tbWFuZCAqPj4gJkZhaWxpbmdDb21tYW5kcykgY29uc3Q7CisKKyAgLy8vIGluaXRDb21waWxhdGlvbkZvckRpYWdub3N0aWNzIC0gUmVtb3ZlIHN0YWxlIHN0YXRlIGFuZCBzdXBwcmVzcyBvdXRwdXQKKyAgLy8vIHNvIGNvbXBpbGF0aW9uIGNhbiBiZSByZWV4ZWN1dGVkIHRvIGdlbmVyYXRlIGFkZGl0aW9uYWwgZGlhZ25vc3RpYworICAvLy8gaW5mb3JtYXRpb24gKGUuZy4sIHByZXByb2Nlc3NlZCBzb3VyY2UocykpLgorICB2b2lkIGluaXRDb21waWxhdGlvbkZvckRpYWdub3N0aWNzKCk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHdlJ3JlIGNvbXBpbGluZyBmb3IgZGlhZ25vc3RpY3MuCisgIGJvb2wgaXNGb3JEaWFnbm9zdGljcygpIGNvbnN0IHsgcmV0dXJuIEZvckRpYWdub3N0aWNzOyB9CisKKyAgLy8vIFJldHVybiB3aGV0aGVyIGFuIGVycm9yIGR1cmluZyB0aGUgcGFyc2luZyBvZiB0aGUgaW5wdXQgYXJncy4KKyAgYm9vbCBjb250YWluc0Vycm9yKCkgY29uc3QgeyByZXR1cm4gQ29udGFpbnNFcnJvcjsgfQorCisgIC8vLyBSZWRpcmVjdCAtIFJlZGlyZWN0IG91dHB1dCBvZiB0aGlzIGNvbXBpbGF0aW9uLiBDYW4gb25seSBiZSBkb25lIG9uY2UuCisgIC8vLworICAvLy8gXHBhcmFtIFJlZGlyZWN0cyAtIGFycmF5IG9mIG9wdGlvbmFsIHBhdGhzLiBUaGUgYXJyYXkgc2hvdWxkIGhhdmUgYSBzaXplCisgIC8vLyBvZiB0aHJlZS4gVGhlIGluZmVyaW9yIHByb2Nlc3MncyBzdGRpbigwKSwgc3Rkb3V0KDEpLCBhbmQgc3RkZXJyKDIpIHdpbGwKKyAgLy8vIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcGF0aHMsIGlmIHByb3ZpZGVkIChub3QgbGx2bTo6Tm9uZSkuCisgIHZvaWQgUmVkaXJlY3QoQXJyYXlSZWY8T3B0aW9uYWw8U3RyaW5nUmVmPj4gUmVkaXJlY3RzKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGRyaXZlcgorfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfRFJJVkVSX0NPTVBJTEFUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9EaXN0cm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9EaXN0cm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWI0ZTJhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0Rpc3Ryby5oCkBAIC0wLDAgKzEsMTMwIEBACisvLz09PS0tLSBEaXN0cm8uaCAtIExpbnV4IGRpc3RyaWJ1dGlvbiBkZXRlY3Rpb24gc3VwcG9ydCAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRFJJVkVSX0RJU1RST19ICisjZGVmaW5lIExMVk1fQ0xBTkdfRFJJVkVSX0RJU1RST19ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9WaXJ0dWFsRmlsZVN5c3RlbS5oIgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGRyaXZlciB7CisKKy8vLyBEaXN0cm8gLSBIZWxwZXIgY2xhc3MgZm9yIGRldGVjdGluZyBhbmQgY2xhc3NpZnlpbmcgTGludXggZGlzdHJpYnV0aW9ucy4KKy8vLworLy8vIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBjbGFuZyBMaW51eCBkaXN0cmlidXRpb24gZGV0ZWN0aW9uIG1lY2hhbmlzbQorLy8vIGFzIHdlbGwgYXMgaGVscGVyIGZ1bmN0aW9ucyB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpYyAodmVyc2lvbmVkKSByZXN1bHRzCisvLy8gaW50byB3aWRlciBkaXN0cmlidXRpb24gY2xhc3Nlcy4KK2NsYXNzIERpc3RybyB7CitwdWJsaWM6CisgIGVudW0gRGlzdHJvVHlwZSB7CisgICAgLy8gTkI6IFJlbGVhc2VzIG9mIGEgcGFydGljdWxhciBMaW51eCBkaXN0cm8gc2hvdWxkIGJlIGtlcHQgdG9nZXRoZXIKKyAgICAvLyBpbiB0aGlzIGVudW0sIGJlY2F1c2Ugc29tZSB0ZXN0cyBhcmUgZG9uZSBieSBpbnRlZ2VyIGNvbXBhcmlzb24gYWdhaW5zdAorICAgIC8vIHRoZSBmaXJzdCBhbmQgbGFzdCBrbm93biBtZW1iZXIgaW4gdGhlIGZhbWlseSwgZS5nLiBJc1JlZEhhdCgpLgorICAgIEFscGluZUxpbnV4LAorICAgIEFyY2hMaW51eCwKKyAgICBEZWJpYW5MZW5ueSwKKyAgICBEZWJpYW5TcXVlZXplLAorICAgIERlYmlhbldoZWV6eSwKKyAgICBEZWJpYW5KZXNzaWUsCisgICAgRGViaWFuU3RyZXRjaCwKKyAgICBEZWJpYW5CdXN0ZXIsCisgICAgRXhoZXJibywKKyAgICBSSEVMNSwKKyAgICBSSEVMNiwKKyAgICBSSEVMNywKKyAgICBGZWRvcmEsCisgICAgT3BlblNVU0UsCisgICAgVWJ1bnR1SGFyZHksCisgICAgVWJ1bnR1SW50cmVwaWQsCisgICAgVWJ1bnR1SmF1bnR5LAorICAgIFVidW50dUthcm1pYywKKyAgICBVYnVudHVMdWNpZCwKKyAgICBVYnVudHVNYXZlcmljaywKKyAgICBVYnVudHVOYXR0eSwKKyAgICBVYnVudHVPbmVpcmljLAorICAgIFVidW50dVByZWNpc2UsCisgICAgVWJ1bnR1UXVhbnRhbCwKKyAgICBVYnVudHVSYXJpbmcsCisgICAgVWJ1bnR1U2F1Y3ksCisgICAgVWJ1bnR1VHJ1c3R5LAorICAgIFVidW50dVV0b3BpYywKKyAgICBVYnVudHVWaXZpZCwKKyAgICBVYnVudHVXaWx5LAorICAgIFVidW50dVhlbmlhbCwKKyAgICBVYnVudHVZYWtrZXR5LAorICAgIFVidW50dVplc3R5LAorICAgIFVidW50dUFydGZ1bCwKKyAgICBVYnVudHVCaW9uaWMsCisgICAgVW5rbm93bkRpc3RybworICB9OworCitwcml2YXRlOgorICAvLy8gVGhlIGRpc3RyaWJ1dGlvbiwgcG9zc2libHkgd2l0aCBzcGVjaWZpYyB2ZXJzaW9uLgorICBEaXN0cm9UeXBlIERpc3Ryb1ZhbDsKKworcHVibGljOgorICAvLy8gQG5hbWUgQ29uc3RydWN0b3JzCisgIC8vLyBAeworCisgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yIGxlYXZlcyB0aGUgZGlzdHJpYnV0aW9uIHVua25vd24uCisgIERpc3RybygpIDogRGlzdHJvVmFsKCkge30KKworICAvLy8gQ29uc3RydWN0cyBhIERpc3RybyB0eXBlIGZvciBzcGVjaWZpYyBkaXN0cmlidXRpb24uCisgIERpc3RybyhEaXN0cm9UeXBlIEQpIDogRGlzdHJvVmFsKEQpIHt9CisKKyAgLy8vIERldGVjdHMgdGhlIGRpc3RyaWJ1dGlvbiB1c2luZyBzcGVjaWZpZWQgVkZTLgorICBleHBsaWNpdCBEaXN0cm8oY2xhbmc6OnZmczo6RmlsZVN5c3RlbSYgVkZTKTsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgRGlzdHJvICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBEaXN0cm9WYWwgPT0gT3RoZXIuRGlzdHJvVmFsOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IERpc3RybyAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gRGlzdHJvVmFsICE9IE90aGVyLkRpc3Ryb1ZhbDsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBEaXN0cm8gJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIERpc3Ryb1ZhbCA+PSBPdGhlci5EaXN0cm9WYWw7CisgIH0KKworICBib29sIG9wZXJhdG9yPD0oY29uc3QgRGlzdHJvICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBEaXN0cm9WYWwgPD0gT3RoZXIuRGlzdHJvVmFsOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBDb252ZW5pZW5jZSBQcmVkaWNhdGVzCisgIC8vLyBAeworCisgIGJvb2wgSXNSZWRoYXQoKSBjb25zdCB7CisgICAgcmV0dXJuIERpc3Ryb1ZhbCA9PSBGZWRvcmEgfHwgKERpc3Ryb1ZhbCA+PSBSSEVMNSAmJiBEaXN0cm9WYWwgPD0gUkhFTDcpOworICB9CisKKyAgYm9vbCBJc09wZW5TVVNFKCkgY29uc3QgeworICAgIHJldHVybiBEaXN0cm9WYWwgPT0gT3BlblNVU0U7CisgIH0KKworICBib29sIElzRGViaWFuKCkgY29uc3QgeworICAgIHJldHVybiBEaXN0cm9WYWwgPj0gRGViaWFuTGVubnkgJiYgRGlzdHJvVmFsIDw9IERlYmlhbkJ1c3RlcjsKKyAgfQorCisgIGJvb2wgSXNVYnVudHUoKSBjb25zdCB7CisgICAgcmV0dXJuIERpc3Ryb1ZhbCA+PSBVYnVudHVIYXJkeSAmJiBEaXN0cm9WYWwgPD0gVWJ1bnR1QmlvbmljOworICB9CisKKyAgYm9vbCBJc0FscGluZUxpbnV4KCkgY29uc3QgeworICAgIHJldHVybiBEaXN0cm9WYWwgPT0gQWxwaW5lTGludXg7CisgIH0KKworICAvLy8gQH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkcml2ZXIKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9Ecml2ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9Ecml2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTJjYTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0RyaXZlci5oCkBAIC0wLDAgKzEsNTg4IEBACisvLz09PS0tLSBEcml2ZXIuaCAtIENsYW5nIEdDQyBDb21wYXRpYmxlIERyaXZlciAtLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRFJJVkVSX0RSSVZFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfRFJJVkVSX0RSSVZFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0RyaXZlci9BY3Rpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9Ecml2ZXIvUGhhc2VzLmgiCisjaW5jbHVkZSAiY2xhbmcvRHJpdmVyL1Rvb2xDaGFpbi5oIgorI2luY2x1ZGUgImNsYW5nL0RyaXZlci9UeXBlcy5oIgorI2luY2x1ZGUgImNsYW5nL0RyaXZlci9VdGlsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9PcHRpb24vQXJnTGlzdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TdHJpbmdTYXZlci5oIgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBUcmlwbGU7Cit9CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK25hbWVzcGFjZSB2ZnMgeworY2xhc3MgRmlsZVN5c3RlbTsKK30KKworbmFtZXNwYWNlIGRyaXZlciB7CisKKyAgY2xhc3MgQ29tbWFuZDsKKyAgY2xhc3MgQ29tcGlsYXRpb247CisgIGNsYXNzIElucHV0SW5mbzsKKyAgY2xhc3MgSm9iTGlzdDsKKyAgY2xhc3MgSm9iQWN0aW9uOworICBjbGFzcyBTYW5pdGl6ZXJBcmdzOworICBjbGFzcyBUb29sQ2hhaW47CisKKy8vLyBEZXNjcmliZXMgdGhlIGtpbmQgb2YgTFRPIG1vZGUgc2VsZWN0ZWQgdmlhIC1mKG5vLSk/bHRvKD0uKik/IG9wdGlvbnMuCitlbnVtIExUT0tpbmQgeworICBMVE9LX05vbmUsCisgIExUT0tfRnVsbCwKKyAgTFRPS19UaGluLAorICBMVE9LX1Vua25vd24KK307CisKKy8vLyBEcml2ZXIgLSBFbmNhcHN1bGF0ZSBsb2dpYyBmb3IgY29uc3RydWN0aW5nIGNvbXBpbGF0aW9uIHByb2Nlc3NlcworLy8vIGZyb20gYSBzZXQgb2YgZ2NjLWRyaXZlci1saWtlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCitjbGFzcyBEcml2ZXIgeworICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6b3B0OjpPcHRUYWJsZT4gT3B0czsKKworICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3M7CisKKyAgSW50cnVzaXZlUmVmQ250UHRyPHZmczo6RmlsZVN5c3RlbT4gVkZTOworCisgIGVudW0gRHJpdmVyTW9kZSB7CisgICAgR0NDTW9kZSwKKyAgICBHWFhNb2RlLAorICAgIENQUE1vZGUsCisgICAgQ0xNb2RlCisgIH0gTW9kZTsKKworICBlbnVtIFNhdmVUZW1wc01vZGUgeworICAgIFNhdmVUZW1wc05vbmUsCisgICAgU2F2ZVRlbXBzQ3dkLAorICAgIFNhdmVUZW1wc09iagorICB9IFNhdmVUZW1wczsKKworICBlbnVtIEJpdGNvZGVFbWJlZE1vZGUgeworICAgIEVtYmVkTm9uZSwKKyAgICBFbWJlZE1hcmtlciwKKyAgICBFbWJlZEJpdGNvZGUKKyAgfSBCaXRjb2RlRW1iZWQ7CisKKyAgLy8vIExUTyBtb2RlIHNlbGVjdGVkIHZpYSAtZihuby0pP2x0byg9LiopPyBvcHRpb25zLgorICBMVE9LaW5kIExUT01vZGU7CisKK3B1YmxpYzoKKyAgZW51bSBPcGVuTVBSdW50aW1lS2luZCB7CisgICAgLy8vIEFuIHVua25vd24gT3Blbk1QIHJ1bnRpbWUuIFdlIGNhbid0IGdlbmVyYXRlIGVmZmVjdGl2ZSBPcGVuTVAgY29kZQorICAgIC8vLyB3aXRob3V0IGtub3dpbmcgd2hhdCBydW50aW1lIHRvIHRhcmdldC4KKyAgICBPTVBSVF9Vbmtub3duLAorCisgICAgLy8vIFRoZSBMTFZNIE9wZW5NUCBydW50aW1lLiBXaGVuIGNvbXBsZXRlZCBhbmQgaW50ZWdyYXRlZCwgdGhpcyB3aWxsIGJlY29tZQorICAgIC8vLyB0aGUgZGVmYXVsdCBmb3IgQ2xhbmcuCisgICAgT01QUlRfT01QLAorCisgICAgLy8vIFRoZSBHTlUgT3Blbk1QIHJ1bnRpbWUuIENsYW5nIGRvZXNuJ3Qgc3VwcG9ydCBnZW5lcmF0aW5nIE9wZW5NUCBjb2RlIGZvcgorICAgIC8vLyB0aGlzIHJ1bnRpbWUgYnV0IGNhbiBzd2FsbG93IHRoZSBwcmFnbWFzLCBhbmQgZmluZCBhbmQgbGluayBhZ2FpbnN0IHRoZQorICAgIC8vLyBydW50aW1lIGxpYnJhcnkgaXRzZWxmLgorICAgIE9NUFJUX0dPTVAsCisKKyAgICAvLy8gVGhlIGxlZ2FjeSBuYW1lIGZvciB0aGUgTExWTSBPcGVuTVAgcnVudGltZSBmcm9tIHdoZW4gaXQgd2FzIHRoZSBJbnRlbAorICAgIC8vLyBPcGVuTVAgcnVudGltZS4gV2Ugc3VwcG9ydCB0aGlzIG1vZGUgZm9yIHVzZXJzIHdpdGggZXhpc3RpbmcKKyAgICAvLy8gZGVwZW5kZW5jaWVzIG9uIHRoaXMgcnVudGltZSBsaWJyYXJ5IG5hbWUuCisgICAgT01QUlRfSU9NUDUKKyAgfTsKKworICAvLyBEaWFnIC0gRm9yd2FyZGluZyBmdW5jdGlvbiBmb3IgZGlhZ25vc3RpY3MuCisgIERpYWdub3N0aWNCdWlsZGVyIERpYWcodW5zaWduZWQgRGlhZ0lEKSBjb25zdCB7CisgICAgcmV0dXJuIERpYWdzLlJlcG9ydChEaWFnSUQpOworICB9CisKKyAgLy8gRklYTUU6IFByaXZhdGl6ZSBvbmNlIGludGVyZmFjZSBpcyBzdGFibGUuCitwdWJsaWM6CisgIC8vLyBUaGUgbmFtZSB0aGUgZHJpdmVyIHdhcyBpbnZva2VkIGFzLgorICBzdGQ6OnN0cmluZyBOYW1lOworCisgIC8vLyBUaGUgcGF0aCB0aGUgZHJpdmVyIGV4ZWN1dGFibGUgd2FzIGluLCBhcyBpbnZva2VkIGZyb20gdGhlCisgIC8vLyBjb21tYW5kIGxpbmUuCisgIHN0ZDo6c3RyaW5nIERpcjsKKworICAvLy8gVGhlIG9yaWdpbmFsIHBhdGggdG8gdGhlIGNsYW5nIGV4ZWN1dGFibGUuCisgIHN0ZDo6c3RyaW5nIENsYW5nRXhlY3V0YWJsZTsKKworICAvLy8gVGFyZ2V0IGFuZCBkcml2ZXIgbW9kZSBjb21wb25lbnRzIGV4dHJhY3RlZCBmcm9tIGNsYW5nIGV4ZWN1dGFibGUgbmFtZS4KKyAgUGFyc2VkQ2xhbmdOYW1lIENsYW5nTmFtZVBhcnRzOworCisgIC8vLyBUaGUgcGF0aCB0byB0aGUgaW5zdGFsbGVkIGNsYW5nIGRpcmVjdG9yeSwgaWYgYW55LgorICBzdGQ6OnN0cmluZyBJbnN0YWxsZWREaXI7CisKKyAgLy8vIFRoZSBwYXRoIHRvIHRoZSBjb21waWxlciByZXNvdXJjZSBkaXJlY3RvcnkuCisgIHN0ZDo6c3RyaW5nIFJlc291cmNlRGlyOworCisgIC8vLyBTeXN0ZW0gZGlyZWN0b3J5IGZvciBjb25maWcgZmlsZXMuCisgIHN0ZDo6c3RyaW5nIFN5c3RlbUNvbmZpZ0RpcjsKKworICAvLy8gVXNlciBkaXJlY3RvcnkgZm9yIGNvbmZpZyBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgVXNlckNvbmZpZ0RpcjsKKworICAvLy8gQSBwcmVmaXggZGlyZWN0b3J5IHVzZWQgdG8gZW11bGF0ZSBhIGxpbWl0ZWQgc3Vic2V0IG9mIEdDQydzICctQnByZWZpeCcKKyAgLy8vIGZ1bmN0aW9uYWxpdHkuCisgIC8vLyBGSVhNRTogVGhpcyB0eXBlIG9mIGN1c3RvbWl6YXRpb24gc2hvdWxkIGJlIHJlbW92ZWQgaW4gZmF2b3Igb2YgdGhlCisgIC8vLyB1bml2ZXJzYWwgZHJpdmVyIHdoZW4gaXQgaXMgcmVhZHkuCisgIHR5cGVkZWYgU21hbGxWZWN0b3I8c3RkOjpzdHJpbmcsIDQ+IHByZWZpeF9saXN0OworICBwcmVmaXhfbGlzdCBQcmVmaXhEaXJzOworCisgIC8vLyBzeXNyb290LCBpZiBwcmVzZW50CisgIHN0ZDo6c3RyaW5nIFN5c1Jvb3Q7CisKKyAgLy8vIER5bmFtaWMgbG9hZGVyIHByZWZpeCwgaWYgcHJlc2VudAorICBzdGQ6OnN0cmluZyBEeWxkUHJlZml4OworCisgIC8vLyBEcml2ZXIgdGl0bGUgdG8gdXNlIHdpdGggaGVscC4KKyAgc3RkOjpzdHJpbmcgRHJpdmVyVGl0bGU7CisKKyAgLy8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSBob3N0IHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSB1c2VyLgorICBzdGQ6OnN0cmluZyBIb3N0Qml0cywgSG9zdE1hY2hpbmUsIEhvc3RTeXN0ZW0sIEhvc3RSZWxlYXNlOworCisgIC8vLyBUaGUgZmlsZSB0byBsb2cgQ0NfUFJJTlRfT1BUSU9OUyBvdXRwdXQgdG8sIGlmIGVuYWJsZWQuCisgIGNvbnN0IGNoYXIgKkNDUHJpbnRPcHRpb25zRmlsZW5hbWU7CisKKyAgLy8vIFRoZSBmaWxlIHRvIGxvZyBDQ19QUklOVF9IRUFERVJTIG91dHB1dCB0bywgaWYgZW5hYmxlZC4KKyAgY29uc3QgY2hhciAqQ0NQcmludEhlYWRlcnNGaWxlbmFtZTsKKworICAvLy8gVGhlIGZpbGUgdG8gbG9nIENDX0xPR19ESUFHTk9TVElDUyBvdXRwdXQgdG8sIGlmIGVuYWJsZWQuCisgIGNvbnN0IGNoYXIgKkNDTG9nRGlhZ25vc3RpY3NGaWxlbmFtZTsKKworICAvLy8gQSBsaXN0IG9mIGlucHV0cyBhbmQgdGhlaXIgdHlwZXMgZm9yIHRoZSBnaXZlbiBhcmd1bWVudHMuCisgIHR5cGVkZWYgU21hbGxWZWN0b3I8c3RkOjpwYWlyPHR5cGVzOjpJRCwgY29uc3QgbGx2bTo6b3B0OjpBcmcgKj4sIDE2PgorICAgICAgSW5wdXRMaXN0OworCisgIC8vLyBXaGV0aGVyIHRoZSBkcml2ZXIgc2hvdWxkIGZvbGxvdyBnKysgbGlrZSBiZWhhdmlvci4KKyAgYm9vbCBDQ0NJc0NYWCgpIGNvbnN0IHsgcmV0dXJuIE1vZGUgPT0gR1hYTW9kZTsgfQorCisgIC8vLyBXaGV0aGVyIHRoZSBkcml2ZXIgaXMganVzdCB0aGUgcHJlcHJvY2Vzc29yLgorICBib29sIENDQ0lzQ1BQKCkgY29uc3QgeyByZXR1cm4gTW9kZSA9PSBDUFBNb2RlOyB9CisKKyAgLy8vIFdoZXRoZXIgdGhlIGRyaXZlciBzaG91bGQgZm9sbG93IGdjYyBsaWtlIGJlaGF2aW9yLgorICBib29sIENDQ0lzQ0MoKSBjb25zdCB7IHJldHVybiBNb2RlID09IEdDQ01vZGU7IH0KKworICAvLy8gV2hldGhlciB0aGUgZHJpdmVyIHNob3VsZCBmb2xsb3cgY2wuZXhlIGxpa2UgYmVoYXZpb3IuCisgIGJvb2wgSXNDTE1vZGUoKSBjb25zdCB7IHJldHVybiBNb2RlID09IENMTW9kZTsgfQorCisgIC8vLyBPbmx5IHByaW50IHRvb2wgYmluZGluZ3MsIGRvbid0IGJ1aWxkIGFueSBqb2JzLgorICB1bnNpZ25lZCBDQ0NQcmludEJpbmRpbmdzIDogMTsKKworICAvLy8gU2V0IENDX1BSSU5UX09QVElPTlMgbW9kZSwgd2hpY2ggaXMgbGlrZSAtdiBidXQgbG9ncyB0aGUgY29tbWFuZHMgdG8KKyAgLy8vIENDUHJpbnRPcHRpb25zRmlsZW5hbWUgb3IgdG8gc3RkZXJyLgorICB1bnNpZ25lZCBDQ1ByaW50T3B0aW9ucyA6IDE7CisKKyAgLy8vIFNldCBDQ19QUklOVF9IRUFERVJTIG1vZGUsIHdoaWNoIGNhdXNlcyB0aGUgZnJvbnRlbmQgdG8gbG9nIGhlYWRlciBpbmNsdWRlCisgIC8vLyBpbmZvcm1hdGlvbiB0byBDQ1ByaW50SGVhZGVyc0ZpbGVuYW1lIG9yIHRvIHN0ZGVyci4KKyAgdW5zaWduZWQgQ0NQcmludEhlYWRlcnMgOiAxOworCisgIC8vLyBTZXQgQ0NfTE9HX0RJQUdOT1NUSUNTIG1vZGUsIHdoaWNoIGNhdXNlcyB0aGUgZnJvbnRlbmQgdG8gbG9nIGRpYWdub3N0aWNzCisgIC8vLyB0byBDQ0xvZ0RpYWdub3N0aWNzRmlsZW5hbWUgb3IgdG8gc3RkZXJyLCBpbiBhIHN0YWJsZSBtYWNoaW5lIHJlYWRhYmxlCisgIC8vLyBmb3JtYXQuCisgIHVuc2lnbmVkIENDTG9nRGlhZ25vc3RpY3MgOiAxOworCisgIC8vLyBXaGV0aGVyIHRoZSBkcml2ZXIgaXMgZ2VuZXJhdGluZyBkaWFnbm9zdGljcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICB1bnNpZ25lZCBDQ0dlbkRpYWdub3N0aWNzIDogMTsKKworcHJpdmF0ZToKKyAgLy8vIERlZmF1bHQgdGFyZ2V0IHRyaXBsZS4KKyAgc3RkOjpzdHJpbmcgRGVmYXVsdFRhcmdldFRyaXBsZTsKKworICAvLy8gTmFtZSB0byB1c2Ugd2hlbiBpbnZva2luZyBnY2MvZysrLgorICBzdGQ6OnN0cmluZyBDQ0NHZW5lcmljR0NDTmFtZTsKKworICAvLy8gTmFtZSBvZiBjb25maWd1cmF0aW9uIGZpbGUgaWYgdXNlZC4KKyAgc3RkOjpzdHJpbmcgQ29uZmlnRmlsZTsKKworICAvLy8gQWxsb2NhdG9yIGZvciBzdHJpbmcgc2F2ZXIuCisgIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgQWxsb2M7CisKKyAgLy8vIE9iamVjdCB0aGF0IHN0b3JlcyBzdHJpbmdzIHJlYWQgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUuCisgIGxsdm06OlN0cmluZ1NhdmVyIFNhdmVyOworCisgIC8vLyBBcmd1bWVudHMgb3JpZ2luYXRlZCBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Om9wdDo6SW5wdXRBcmdMaXN0PiBDZmdPcHRpb25zOworCisgIC8vLyBBcmd1bWVudHMgb3JpZ2luYXRlZCBmcm9tIGNvbW1hbmQgbGluZS4KKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Om9wdDo6SW5wdXRBcmdMaXN0PiBDTE9wdGlvbnM7CisKKyAgLy8vIFdoZXRoZXIgdG8gY2hlY2sgdGhhdCBpbnB1dCBmaWxlcyBleGlzdCB3aGVuIGNvbnN0cnVjdGluZyBjb21waWxhdGlvbgorICAvLy8gam9icy4KKyAgdW5zaWduZWQgQ2hlY2tJbnB1dHNFeGlzdCA6IDE7CisKK3B1YmxpYzoKKyAgLy8vIFVzZSBsYXp5IHByZWNvbXBpbGVkIGhlYWRlcnMgZm9yIFBDSCBzdXBwb3J0LgorICB1bnNpZ25lZCBDQ0NVc2VQQ0ggOiAxOworCisgIC8vLyBGb3JjZSBjbGFuZyB0byBlbWl0IHJlcHJvZHVjZXIgZm9yIGRyaXZlciBpbnZvY2F0aW9uLiBUaGlzIGlzIGVuYWJsZWQKKyAgLy8vIGluZGlyZWN0bHkgYnkgc2V0dGluZyBGT1JDRV9DTEFOR19ESUFHTk9TVElDU19DUkFTSCBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAvLy8gb3Igd2hlbiB1c2luZyB0aGUgLWdlbi1yZXByb2R1Y2VyIGRyaXZlciBmbGFnLgorICB1bnNpZ25lZCBHZW5SZXByb2R1Y2VyIDogMTsKKworcHJpdmF0ZToKKyAgLy8vIENlcnRhaW4gb3B0aW9ucyBzdXBwcmVzcyB0aGUgJ25vIGlucHV0IGZpbGVzJyB3YXJuaW5nLgorICB1bnNpZ25lZCBTdXBwcmVzc01pc3NpbmdJbnB1dFdhcm5pbmcgOiAxOworCisgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gVGVtcEZpbGVzOworICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+IFJlc3VsdEZpbGVzOworCisgIC8vLyBcYnJpZWYgQ2FjaGUgb2YgYWxsIHRoZSBUb29sQ2hhaW5zIGluIHVzZSBieSB0aGUgZHJpdmVyLgorICAvLy8KKyAgLy8vIFRoaXMgbWFwcyBmcm9tIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB0cmlwbGUgdG8gYSBUb29sQ2hhaW4KKyAgLy8vIGNyZWF0ZWQgdGFyZ2V0aW5nIHRoYXQgdHJpcGxlLiBUaGUgZHJpdmVyIG93bnMgYWxsIHRoZSBUb29sQ2hhaW4gb2JqZWN0cworICAvLy8gc3RvcmVkIGluIGl0LCBhbmQgd2lsbCBjbGVhbiB0aGVtIHVwIHdoZW4gdG9ybiBkb3duLgorICBtdXRhYmxlIGxsdm06OlN0cmluZ01hcDxzdGQ6OnVuaXF1ZV9wdHI8VG9vbENoYWluPj4gVG9vbENoYWluczsKKworcHJpdmF0ZToKKyAgLy8vIFRyYW5zbGF0ZUlucHV0QXJncyAtIENyZWF0ZSBhIG5ldyBkZXJpdmVkIGFyZ3VtZW50IGxpc3QgZnJvbSB0aGUgaW5wdXQKKyAgLy8vIGFyZ3VtZW50cywgYWZ0ZXIgYXBwbHlpbmcgdGhlIHN0YW5kYXJkIGFyZ3VtZW50IHRyYW5zbGF0aW9ucy4KKyAgbGx2bTo6b3B0OjpEZXJpdmVkQXJnTGlzdCAqCisgIFRyYW5zbGF0ZUlucHV0QXJncyhjb25zdCBsbHZtOjpvcHQ6OklucHV0QXJnTGlzdCAmQXJncykgY29uc3Q7CisKKyAgLy8gZ2V0RmluYWxQaGFzZSAtIERldGVybWluZSB3aGljaCBjb21waWxhdGlvbiBtb2RlIHdlIGFyZSBpbiBhbmQgcmVjb3JkIAorICAvLyB3aGljaCBvcHRpb24gd2UgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGZpbmFsIHBoYXNlLgorICBwaGFzZXM6OklEIGdldEZpbmFsUGhhc2UoY29uc3QgbGx2bTo6b3B0OjpEZXJpdmVkQXJnTGlzdCAmREFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmcgKipGaW5hbFBoYXNlQXJnID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8gQmVmb3JlIGV4ZWN1dGluZyBqb2JzLCBzZXRzIHVwIHJlc3BvbnNlIGZpbGVzIGZvciBjb21tYW5kcyB0aGF0IG5lZWQgdGhlbS4KKyAgdm9pZCBzZXRVcFJlc3BvbnNlRmlsZXMoQ29tcGlsYXRpb24gJkMsIENvbW1hbmQgJkNtZCk7CisKKyAgdm9pZCBnZW5lcmF0ZVByZWZpeGVkVG9vbE5hbWVzKFN0cmluZ1JlZiBUb29sLCBjb25zdCBUb29sQ2hhaW4gJlRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6c3RyaW5nPiAmTmFtZXMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRmluZCB0aGUgYXBwcm9wcmlhdGUgLmNyYXNoIGRpYWdvbm9zdGljIGZpbGUgZm9yIHRoZSBjaGlsZCBjcmFzaAorICAvLy8gdW5kZXIgdGhpcyBkcml2ZXIgYW5kIGNvcHkgaXQgb3V0IHRvIGEgdGVtcG9yYXJ5IGRlc3RpbmF0aW9uIHdpdGggdGhlCisgIC8vLyBvdGhlciByZXByb2R1Y2VyIHJlbGF0ZWQgZmlsZXMgKC5zaCwgLmNhY2hlLCBldGMpLiBJZiBub3QgZm91bmQsIHN1Z2dlc3QgYQorICAvLy8gZGlyZWN0b3J5IGZvciB0aGUgdXNlciB0byBsb29rIGF0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBSZXByb0NyYXNoRmlsZW5hbWUgVGhlIGZpbGUgcGF0aCB0byBjb3B5IHRoZSAuY3Jhc2ggdG8uCisgIC8vLyBccGFyYW0gQ3Jhc2hEaWFnRGlyICAgICAgIFRoZSBzdWdnZXN0ZWQgZGlyZWN0b3J5IGZvciB0aGUgdXNlciB0byBsb29rIGF0CisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGNhc2UgdGhlIHNlYXJjaCBvciBjb3B5IGZhaWxzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIElmIHRoZSAuY3Jhc2ggaXMgZm91bmQgYW5kIHN1Y2Nlc3NmdWxseSBjb3BpZWQgcmV0dXJuIHRydWUsCisgIC8vLyBvdGhlcndpc2UgZmFsc2UgYW5kIHJldHVybiB0aGUgc3VnZ2VzdGVkIGRpcmVjdG9yeSBpbiBccCBDcmFzaERpYWdEaXIuCisgIGJvb2wgZ2V0Q3Jhc2hEaWFnbm9zdGljRmlsZShTdHJpbmdSZWYgUmVwcm9DcmFzaEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxTdHJpbmc8MTI4PiAmQ3Jhc2hEaWFnRGlyKTsKKworcHVibGljOgorICBEcml2ZXIoU3RyaW5nUmVmIENsYW5nRXhlY3V0YWJsZSwgU3RyaW5nUmVmIERlZmF1bHRUYXJnZXRUcmlwbGUsCisgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MsCisgICAgICAgICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpGaWxlU3lzdGVtPiBWRlMgPSBudWxscHRyKTsKKworICAvLy8gQG5hbWUgQWNjZXNzb3JzCisgIC8vLyBAeworCisgIC8vLyBOYW1lIHRvIHVzZSB3aGVuIGludm9raW5nIGdjYy9nKysuCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRDQ0NHZW5lcmljR0NDTmFtZSgpIGNvbnN0IHsgcmV0dXJuIENDQ0dlbmVyaWNHQ0NOYW1lOyB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldENvbmZpZ0ZpbGUoKSBjb25zdCB7IHJldHVybiBDb25maWdGaWxlOyB9CisKKyAgY29uc3QgbGx2bTo6b3B0OjpPcHRUYWJsZSAmZ2V0T3B0cygpIGNvbnN0IHsgcmV0dXJuICpPcHRzOyB9CisKKyAgY29uc3QgRGlhZ25vc3RpY3NFbmdpbmUgJmdldERpYWdzKCkgY29uc3QgeyByZXR1cm4gRGlhZ3M7IH0KKworICB2ZnM6OkZpbGVTeXN0ZW0gJmdldFZGUygpIGNvbnN0IHsgcmV0dXJuICpWRlM7IH0KKworICBib29sIGdldENoZWNrSW5wdXRzRXhpc3QoKSBjb25zdCB7IHJldHVybiBDaGVja0lucHV0c0V4aXN0OyB9CisKKyAgdm9pZCBzZXRDaGVja0lucHV0c0V4aXN0KGJvb2wgVmFsdWUpIHsgQ2hlY2tJbnB1dHNFeGlzdCA9IFZhbHVlOyB9CisKKyAgdm9pZCBzZXRUYXJnZXRBbmRNb2RlKGNvbnN0IFBhcnNlZENsYW5nTmFtZSAmVE0pIHsgQ2xhbmdOYW1lUGFydHMgPSBUTTsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRUaXRsZSgpIHsgcmV0dXJuIERyaXZlclRpdGxlOyB9CisgIHZvaWQgc2V0VGl0bGUoc3RkOjpzdHJpbmcgVmFsdWUpIHsgRHJpdmVyVGl0bGUgPSBzdGQ6Om1vdmUoVmFsdWUpOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHBhdGggdG8gdGhlIG1haW4gY2xhbmcgZXhlY3V0YWJsZS4KKyAgY29uc3QgY2hhciAqZ2V0Q2xhbmdQcm9ncmFtUGF0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2xhbmdFeGVjdXRhYmxlLmNfc3RyKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgcGF0aCB0byB3aGVyZSB0aGUgY2xhbmcgZXhlY3V0YWJsZSB3YXMgaW5zdGFsbGVkLgorICBjb25zdCBjaGFyICpnZXRJbnN0YWxsZWREaXIoKSBjb25zdCB7CisgICAgaWYgKCFJbnN0YWxsZWREaXIuZW1wdHkoKSkKKyAgICAgIHJldHVybiBJbnN0YWxsZWREaXIuY19zdHIoKTsKKyAgICByZXR1cm4gRGlyLmNfc3RyKCk7CisgIH0KKyAgdm9pZCBzZXRJbnN0YWxsZWREaXIoU3RyaW5nUmVmIFZhbHVlKSB7CisgICAgSW5zdGFsbGVkRGlyID0gVmFsdWU7CisgIH0KKworICBib29sIGlzU2F2ZVRlbXBzRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIFNhdmVUZW1wcyAhPSBTYXZlVGVtcHNOb25lOyB9CisgIGJvb2wgaXNTYXZlVGVtcHNPYmooKSBjb25zdCB7IHJldHVybiBTYXZlVGVtcHMgPT0gU2F2ZVRlbXBzT2JqOyB9CisKKyAgYm9vbCBlbWJlZEJpdGNvZGVFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gQml0Y29kZUVtYmVkICE9IEVtYmVkTm9uZTsgfQorICBib29sIGVtYmVkQml0Y29kZUluT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gKEJpdGNvZGVFbWJlZCA9PSBFbWJlZEJpdGNvZGUpOyB9CisgIGJvb2wgZW1iZWRCaXRjb2RlTWFya2VyT25seSgpIGNvbnN0IHsgcmV0dXJuIChCaXRjb2RlRW1iZWQgPT0gRW1iZWRNYXJrZXIpOyB9CisKKyAgLy8vIENvbXB1dGUgdGhlIGRlc2lyZWQgT3Blbk1QIHJ1bnRpbWUgZnJvbSB0aGUgZmxhZ3MgcHJvdmlkZWQuCisgIE9wZW5NUFJ1bnRpbWVLaW5kIGdldE9wZW5NUFJ1bnRpbWUoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzKSBjb25zdDsKKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIFByaW1hcnkgRnVuY3Rpb25hbGl0eQorICAvLy8gQHsKKworICAvLy8gQ3JlYXRlT2ZmbG9hZGluZ0RldmljZVRvb2xDaGFpbnMgLSBjcmVhdGUgYWxsIHRoZSB0b29sY2hhaW5zIHJlcXVpcmVkIHRvCisgIC8vLyBzdXBwb3J0IG9mZmxvYWRpbmcgZGV2aWNlcyBnaXZlbiB0aGUgcHJvZ3JhbW1pbmcgbW9kZWxzIHNwZWNpZmllZCBpbiB0aGUKKyAgLy8vIGN1cnJlbnQgY29tcGlsYXRpb24uIEFsc28sIHVwZGF0ZSB0aGUgaG9zdCB0b29sIGNoYWluIGtpbmQgYWNjb3JkaW5nbHkuCisgIHZvaWQgQ3JlYXRlT2ZmbG9hZGluZ0RldmljZVRvb2xDaGFpbnMoQ29tcGlsYXRpb24gJkMsIElucHV0TGlzdCAmSW5wdXRzKTsKKworICAvLy8gQnVpbGRDb21waWxhdGlvbiAtIENvbnN0cnVjdCBhIGNvbXBpbGF0aW9uIG9iamVjdCBmb3IgYSBjb21tYW5kCisgIC8vLyBsaW5lIGFyZ3VtZW50IHZlY3Rvci4KKyAgLy8vCisgIC8vLyBccmV0dXJuIEEgY29tcGlsYXRpb24sIG9yIDAgaWYgbm9uZSB3YXMgYnVpbHQgZm9yIHRoZSBnaXZlbgorICAvLy8gYXJndW1lbnQgdmVjdG9yLiBBIG51bGwgcmV0dXJuIHZhbHVlIGRvZXMgbm90IG5lY2Vzc2FyaWx5CisgIC8vLyBpbmRpY2F0ZSBhbiBlcnJvciBjb25kaXRpb24sIHRoZSBkaWFnbm9zdGljcyBzaG91bGQgYmUgcXVlcmllZAorICAvLy8gdG8gZGV0ZXJtaW5lIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICBDb21waWxhdGlvbiAqQnVpbGRDb21waWxhdGlvbihBcnJheVJlZjxjb25zdCBjaGFyICo+IEFyZ3MpOworCisgIC8vLyBAbmFtZSBEcml2ZXIgU3RlcHMKKyAgLy8vIEB7CisKKyAgLy8vIFBhcnNlRHJpdmVyTW9kZSAtIExvb2sgZm9yIGFuZCBoYW5kbGUgdGhlIGRyaXZlciBtb2RlIG9wdGlvbiBpbiBBcmdzLgorICB2b2lkIFBhcnNlRHJpdmVyTW9kZShTdHJpbmdSZWYgUHJvZ3JhbU5hbWUsIEFycmF5UmVmPGNvbnN0IGNoYXIgKj4gQXJncyk7CisKKyAgLy8vIFBhcnNlQXJnU3RyaW5ncyAtIFBhcnNlIHRoZSBnaXZlbiBsaXN0IG9mIHN0cmluZ3MgaW50byBhbgorICAvLy8gQXJnTGlzdC4KKyAgbGx2bTo6b3B0OjpJbnB1dEFyZ0xpc3QgUGFyc2VBcmdTdHJpbmdzKEFycmF5UmVmPGNvbnN0IGNoYXIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkNvbnRhaW5zRXJyb3IpOworCisgIC8vLyBCdWlsZElucHV0cyAtIENvbnN0cnVjdCB0aGUgbGlzdCBvZiBpbnB1dHMgYW5kIHRoZWlyIHR5cGVzIGZyb20gCisgIC8vLyB0aGUgZ2l2ZW4gYXJndW1lbnRzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUQyAtIFRoZSBkZWZhdWx0IGhvc3QgdG9vbCBjaGFpbi4KKyAgLy8vIFxwYXJhbSBBcmdzIC0gVGhlIGlucHV0IGFyZ3VtZW50cy4KKyAgLy8vIFxwYXJhbSBJbnB1dHMgLSBUaGUgbGlzdCB0byBzdG9yZSB0aGUgcmVzdWx0aW5nIGNvbXBpbGF0aW9uIAorICAvLy8gaW5wdXRzIG9udG8uCisgIHZvaWQgQnVpbGRJbnB1dHMoY29uc3QgVG9vbENoYWluICZUQywgbGx2bTo6b3B0OjpEZXJpdmVkQXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgICAgICBJbnB1dExpc3QgJklucHV0cykgY29uc3Q7CisKKyAgLy8vIEJ1aWxkQWN0aW9ucyAtIENvbnN0cnVjdCB0aGUgbGlzdCBvZiBhY3Rpb25zIHRvIHBlcmZvcm0gZm9yIHRoZQorICAvLy8gZ2l2ZW4gYXJndW1lbnRzLCB3aGljaCBhcmUgb25seSBkb25lIGZvciBhIHNpbmdsZSBhcmNoaXRlY3R1cmUuCisgIC8vLworICAvLy8gXHBhcmFtIEMgLSBUaGUgY29tcGlsYXRpb24gdGhhdCBpcyBiZWluZyBidWlsdC4KKyAgLy8vIFxwYXJhbSBBcmdzIC0gVGhlIGlucHV0IGFyZ3VtZW50cy4KKyAgLy8vIFxwYXJhbSBBY3Rpb25zIC0gVGhlIGxpc3QgdG8gc3RvcmUgdGhlIHJlc3VsdGluZyBhY3Rpb25zIG9udG8uCisgIHZvaWQgQnVpbGRBY3Rpb25zKENvbXBpbGF0aW9uICZDLCBsbHZtOjpvcHQ6OkRlcml2ZWRBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dExpc3QgJklucHV0cywgQWN0aW9uTGlzdCAmQWN0aW9ucykgY29uc3Q7CisKKyAgLy8vIEJ1aWxkVW5pdmVyc2FsQWN0aW9ucyAtIENvbnN0cnVjdCB0aGUgbGlzdCBvZiBhY3Rpb25zIHRvIHBlcmZvcm0KKyAgLy8vIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnRzLCB3aGljaCBtYXkgcmVxdWlyZSBhIHVuaXZlcnNhbCBidWlsZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyAtIFRoZSBjb21waWxhdGlvbiB0aGF0IGlzIGJlaW5nIGJ1aWx0LgorICAvLy8gXHBhcmFtIFRDIC0gVGhlIGRlZmF1bHQgaG9zdCB0b29sIGNoYWluLgorICB2b2lkIEJ1aWxkVW5pdmVyc2FsQWN0aW9ucyhDb21waWxhdGlvbiAmQywgY29uc3QgVG9vbENoYWluICZUQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRMaXN0ICZCQUlucHV0cykgY29uc3Q7CisKKyAgLy8vIEJ1aWxkSm9icyAtIEJpbmQgYWN0aW9ucyB0byBjb25jcmV0ZSB0b29scyBhbmQgdHJhbnNsYXRlCisgIC8vLyBhcmd1bWVudHMgdG8gZm9ybSB0aGUgbGlzdCBvZiBqb2JzIHRvIHJ1bi4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyAtIFRoZSBjb21waWxhdGlvbiB0aGF0IGlzIGJlaW5nIGJ1aWx0LgorICB2b2lkIEJ1aWxkSm9icyhDb21waWxhdGlvbiAmQykgY29uc3Q7CisKKyAgLy8vIEV4ZWN1dGVDb21waWxhdGlvbiAtIEV4ZWN1dGUgdGhlIGNvbXBpbGF0aW9uIGFjY29yZGluZyB0byB0aGUgY29tbWFuZCBsaW5lCisgIC8vLyBhcmd1bWVudHMgYW5kIHJldHVybiBhbiBhcHByb3ByaWF0ZSBleGl0IGNvZGUuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIGhhbmRsZXMgYWRkaXRpb25hbCBwcm9jZXNzaW5nIHRoYXQgbXVzdCBiZSBkb25lIGluIGFkZGl0aW9uCisgIC8vLyB0byBqdXN0IHJ1bm5pbmcgdGhlIHN1YnByb2Nlc3NlcywgZm9yIGV4YW1wbGUgcmVwb3J0aW5nIGVycm9ycywgc2V0dGluZworICAvLy8gdXAgcmVzcG9uc2UgZmlsZXMsIHJlbW92aW5nIHRlbXBvcmFyeSBmaWxlcywgZXRjLgorICBpbnQgRXhlY3V0ZUNvbXBpbGF0aW9uKENvbXBpbGF0aW9uICZDLAorICAgICBTbWFsbFZlY3RvckltcGw8IHN0ZDo6cGFpcjxpbnQsIGNvbnN0IENvbW1hbmQgKj4gPiAmRmFpbGluZ0NvbW1hbmRzKTsKKworICAvLy8gZ2VuZXJhdGVDb21waWxhdGlvbkRpYWdub3N0aWNzIC0gR2VuZXJhdGUgZGlhZ25vc3RpY3MgaW5mb3JtYXRpb24gCisgIC8vLyBpbmNsdWRpbmcgcHJlcHJvY2Vzc2VkIHNvdXJjZSBmaWxlKHMpLgorICAvLy8gCisgIHZvaWQgZ2VuZXJhdGVDb21waWxhdGlvbkRpYWdub3N0aWNzKENvbXBpbGF0aW9uICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kICZGYWlsaW5nQ29tbWFuZCk7CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBIZWxwZXIgTWV0aG9kcworICAvLy8gQHsKKworICAvLy8gUHJpbnRBY3Rpb25zIC0gUHJpbnQgdGhlIGxpc3Qgb2YgYWN0aW9ucy4KKyAgdm9pZCBQcmludEFjdGlvbnMoY29uc3QgQ29tcGlsYXRpb24gJkMpIGNvbnN0OworCisgIC8vLyBQcmludEhlbHAgLSBQcmludCB0aGUgaGVscCB0ZXh0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBTaG93SGlkZGVuIC0gU2hvdyBoaWRkZW4gb3B0aW9ucy4KKyAgdm9pZCBQcmludEhlbHAoYm9vbCBTaG93SGlkZGVuKSBjb25zdDsKKworICAvLy8gUHJpbnRWZXJzaW9uIC0gUHJpbnQgdGhlIGRyaXZlciB2ZXJzaW9uLgorICB2b2lkIFByaW50VmVyc2lvbihjb25zdCBDb21waWxhdGlvbiAmQywgcmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gR2V0RmlsZVBhdGggLSBMb29rdXAgXHAgTmFtZSBpbiB0aGUgbGlzdCBvZiBmaWxlIHNlYXJjaCBwYXRocy4KKyAgLy8vCisgIC8vLyBccGFyYW0gVEMgLSBUaGUgdG9vbCBjaGFpbiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbgorICAvLy8gZGlyZWN0b3JpZXMgdG8gc2VhcmNoLgorICAvLworICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgaW4gQ29tcGlsYXRpb25JbmZvLgorICBzdGQ6OnN0cmluZyBHZXRGaWxlUGF0aChTdHJpbmdSZWYgTmFtZSwgY29uc3QgVG9vbENoYWluICZUQykgY29uc3Q7CisKKyAgLy8vIEdldFByb2dyYW1QYXRoIC0gTG9va3VwIFxwIE5hbWUgaW4gdGhlIGxpc3Qgb2YgcHJvZ3JhbSBzZWFyY2ggcGF0aHMuCisgIC8vLworICAvLy8gXHBhcmFtIFRDIC0gVGhlIHByb3ZpZGVkIHRvb2wgY2hhaW4gZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24KKyAgLy8vIGRpcmVjdG9yaWVzIHRvIHNlYXJjaC4KKyAgLy8KKyAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGluIENvbXBpbGF0aW9uSW5mby4KKyAgc3RkOjpzdHJpbmcgR2V0UHJvZ3JhbVBhdGgoU3RyaW5nUmVmIE5hbWUsIGNvbnN0IFRvb2xDaGFpbiAmVEMpIGNvbnN0OworCisgIC8vLyBIYW5kbGVBdXRvY29tcGxldGlvbnMgLSBIYW5kbGUgLS1hdXRvY29tcGxldGUgYnkgc2VhcmNoaW5nIGFuZCBwcmludGluZworICAvLy8gcG9zc2libGUgZmxhZ3MsIGRlc2NyaXB0aW9ucywgYW5kIGl0cyBhcmd1bWVudHMuCisgIHZvaWQgSGFuZGxlQXV0b2NvbXBsZXRpb25zKFN0cmluZ1JlZiBQYXNzZWRGbGFncykgY29uc3Q7CisKKyAgLy8vIEhhbmRsZUltbWVkaWF0ZUFyZ3MgLSBIYW5kbGUgYW55IGFyZ3VtZW50cyB3aGljaCBzaG91bGQgYmUKKyAgLy8vIHRyZWF0ZWQgYmVmb3JlIGJ1aWxkaW5nIGFjdGlvbnMgb3IgYmluZGluZyB0b29scy4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFdoZXRoZXIgYW55IGNvbXBpbGF0aW9uIHNob3VsZCBiZSBidWlsdCBmb3IgdGhpcworICAvLy8gaW52b2NhdGlvbi4KKyAgYm9vbCBIYW5kbGVJbW1lZGlhdGVBcmdzKGNvbnN0IENvbXBpbGF0aW9uICZDKTsKKworICAvLy8gQ29uc3RydWN0QWN0aW9uIC0gQ29uc3RydWN0IHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24gdG8gZG8gZm9yCisgIC8vLyBccCBQaGFzZSBvbiB0aGUgXHAgSW5wdXQsIHRha2luZyBpbiB0byBhY2NvdW50IGFyZ3VtZW50cworICAvLy8gbGlrZSAtZnN5bnRheC1vbmx5IG9yIC0tYW5hbHl6ZS4KKyAgQWN0aW9uICpDb25zdHJ1Y3RQaGFzZUFjdGlvbigKKyAgICAgIENvbXBpbGF0aW9uICZDLCBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsIHBoYXNlczo6SUQgUGhhc2UsCisgICAgICBBY3Rpb24gKklucHV0LAorICAgICAgQWN0aW9uOjpPZmZsb2FkS2luZCBUYXJnZXREZXZpY2VPZmZsb2FkS2luZCA9IEFjdGlvbjo6T0ZLX05vbmUpIGNvbnN0OworCisgIC8vLyBCdWlsZEpvYnNGb3JBY3Rpb24gLSBDb25zdHJ1Y3QgdGhlIGpvYnMgdG8gcGVyZm9ybSBmb3IgdGhlIGFjdGlvbiBccCBBIGFuZAorICAvLy8gcmV0dXJuIGFuIElucHV0SW5mbyBmb3IgdGhlIHJlc3VsdCBvZiBydW5uaW5nIFxwIEEuICBXaWxsIG9ubHkgY29uc3RydWN0CisgIC8vLyBqb2JzIGZvciBhIGdpdmVuIChBY3Rpb24sIFRvb2xDaGFpbiwgQm91bmRBcmNoLCBEZXZpY2VLaW5kKSB0dXBsZSBvbmNlLgorICBJbnB1dEluZm8KKyAgQnVpbGRKb2JzRm9yQWN0aW9uKENvbXBpbGF0aW9uICZDLCBjb25zdCBBY3Rpb24gKkEsIGNvbnN0IFRvb2xDaGFpbiAqVEMsCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQm91bmRBcmNoLCBib29sIEF0VG9wTGV2ZWwsIGJvb2wgTXVsdGlwbGVBcmNocywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8Y29uc3QgQWN0aW9uICosIHN0ZDo6c3RyaW5nPiwgSW5wdXRJbmZvPgorICAgICAgICAgICAgICAgICAgICAgICAgICZDYWNoZWRSZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOjpPZmZsb2FkS2luZCBUYXJnZXREZXZpY2VPZmZsb2FkS2luZCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIGRlZmF1bHQgbmFtZSBmb3IgbGlua2VkIGltYWdlcyAoZS5nLiwgImEub3V0IikuCisgIGNvbnN0IGNoYXIgKmdldERlZmF1bHRJbWFnZU5hbWUoKSBjb25zdDsKKworICAvLy8gR2V0TmFtZWRPdXRwdXRQYXRoIC0gUmV0dXJuIHRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIG91dHB1dCBvZgorICAvLy8gdGhlIGFjdGlvbiBccCBKQS4gVGhlIHJlc3VsdCBpcyBhcHBlbmRlZCB0byB0aGUgY29tcGlsYXRpb24ncworICAvLy8gbGlzdCBvZiB0ZW1wb3Jhcnkgb3IgcmVzdWx0IGZpbGVzLCBhcyBhcHByb3ByaWF0ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyAtIFRoZSBjb21waWxhdGlvbi4KKyAgLy8vIFxwYXJhbSBKQSAtIFRoZSBhY3Rpb24gb2YgaW50ZXJlc3QuCisgIC8vLyBccGFyYW0gQmFzZUlucHV0IC0gVGhlIG9yaWdpbmFsIGlucHV0IGZpbGUgdGhhdCB0aGlzIGFjdGlvbiB3YXMKKyAgLy8vIHRyaWdnZXJlZCBieS4KKyAgLy8vIFxwYXJhbSBCb3VuZEFyY2ggLSBUaGUgYm91bmQgYXJjaGl0ZWN0dXJlLiAKKyAgLy8vIFxwYXJhbSBBdFRvcExldmVsIC0gV2hldGhlciB0aGlzIGlzIGEgInRvcC1sZXZlbCIgYWN0aW9uLgorICAvLy8gXHBhcmFtIE11bHRpcGxlQXJjaHMgLSBXaGV0aGVyIG11bHRpcGxlIC1hcmNoIG9wdGlvbnMgd2VyZSBzdXBwbGllZC4KKyAgLy8vIFxwYXJhbSBOb3JtYWxpemVkVHJpcGxlIC0gVGhlIG5vcm1hbGl6ZWQgdHJpcGxlIG9mIHRoZSByZWxldmFudCB0YXJnZXQuCisgIGNvbnN0IGNoYXIgKkdldE5hbWVkT3V0cHV0UGF0aChDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkJhc2VJbnB1dCwgU3RyaW5nUmVmIEJvdW5kQXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQXRUb3BMZXZlbCwgYm9vbCBNdWx0aXBsZUFyY2hzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5vcm1hbGl6ZWRUcmlwbGUpIGNvbnN0OworCisgIC8vLyBHZXRUZW1wb3JhcnlQYXRoIC0gUmV0dXJuIHRoZSBwYXRobmFtZSBvZiBhIHRlbXBvcmFyeSBmaWxlIHRvIHVzZSAKKyAgLy8vIGFzIHBhcnQgb2YgY29tcGlsYXRpb247IHRoZSBmaWxlIHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gcHJlZml4IGFuZCBzdWZmaXguCisgIC8vLworICAvLy8gR0NDIGdvZXMgdG8gZXh0cmEgbGVuZ3RocyBoZXJlIHRvIGJlIGEgYml0IG1vcmUgcm9idXN0LgorICBzdGQ6OnN0cmluZyBHZXRUZW1wb3JhcnlQYXRoKFN0cmluZ1JlZiBQcmVmaXgsIFN0cmluZ1JlZiBTdWZmaXgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHBhdGhuYW1lIG9mIHRoZSBwY2ggZmlsZSBpbiBjbGFuZy1jbCBtb2RlLgorICBzdGQ6OnN0cmluZyBHZXRDbFBjaFBhdGgoQ29tcGlsYXRpb24gJkMsIFN0cmluZ1JlZiBCYXNlTmFtZSkgY29uc3Q7CisKKyAgLy8vIFNob3VsZFVzZUNsYW5nQ29tcGlsZXIgLSBTaG91bGQgdGhlIGNsYW5nIGNvbXBpbGVyIGJlIHVzZWQgdG8KKyAgLy8vIGhhbmRsZSB0aGlzIGFjdGlvbi4KKyAgYm9vbCBTaG91bGRVc2VDbGFuZ0NvbXBpbGVyKGNvbnN0IEpvYkFjdGlvbiAmSkEpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgd2UgYXJlIHBlcmZvcm1pbmcgYW55IGtpbmQgb2YgTFRPLgorICBib29sIGlzVXNpbmdMVE8oKSBjb25zdCB7IHJldHVybiBMVE9Nb2RlICE9IExUT0tfTm9uZTsgfQorCisgIC8vLyBHZXQgdGhlIHNwZWNpZmljIGtpbmQgb2YgTFRPIGJlaW5nIHBlcmZvcm1lZC4KKyAgTFRPS2luZCBnZXRMVE9Nb2RlKCkgY29uc3QgeyByZXR1cm4gTFRPTW9kZTsgfQorCitwcml2YXRlOgorCisgIC8vLyBUcmllcyB0byBsb2FkIG9wdGlvbnMgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBlcnJvciBvY2N1cnJlZC4KKyAgYm9vbCBsb2FkQ29uZmlnRmlsZSgpOworCisgIC8vLyBSZWFkIG9wdGlvbnMgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUuCisgIC8vLworICAvLy8gXHBhcmFtIFtpbl0gRmlsZU5hbWUgRmlsZSB0byByZWFkLgorICAvLy8gXHJldHVybnMgdHJ1ZSwgaWYgZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVhZGluZy4KKyAgYm9vbCByZWFkQ29uZmlnRmlsZShTdHJpbmdSZWYgRmlsZU5hbWUpOworCisgIC8vLyBTZXQgdGhlIGRyaXZlciBtb2RlIChjbCwgZ2NjLCBldGMpIGZyb20gYW4gb3B0aW9uIHN0cmluZyBvZiB0aGUgZm9ybQorICAvLy8gLS1kcml2ZXItbW9kZT08bW9kZT4uCisgIHZvaWQgc2V0RHJpdmVyTW9kZUZyb21PcHRpb24oU3RyaW5nUmVmIE9wdCk7CisKKyAgLy8vIFBhcnNlIHRoZSBccCBBcmdzIGxpc3QgZm9yIExUTyBvcHRpb25zIGFuZCByZWNvcmQgdGhlIHR5cGUgb2YgTFRPCisgIC8vLyBjb21waWxhdGlvbiBiYXNlZCBvbiB3aGljaCAtZihuby0pP2x0byg9LiopPyBvcHRpb24gb2NjdXJzIGxhc3QuCisgIHZvaWQgc2V0TFRPTW9kZShjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MpOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmVzIGEgVG9vbENoYWluIGZvciBhIHBhcnRpY3VsYXIgXHAgVGFyZ2V0IHRyaXBsZS4KKyAgLy8vCisgIC8vLyBXaWxsIGNhY2hlIFRvb2xDaGFpbnMgZm9yIHRoZSBsaWZlIG9mIHRoZSBkcml2ZXIgb2JqZWN0LCBhbmQgY3JlYXRlIHRoZW0KKyAgLy8vIG9uLWRlbWFuZC4KKyAgY29uc3QgVG9vbENoYWluICZnZXRUb29sQ2hhaW4oY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUcmlwbGUgJlRhcmdldCkgY29uc3Q7CisKKyAgLy8vIEB9CisKKyAgLy8vIFxicmllZiBHZXQgYml0bWFza3MgZm9yIHdoaWNoIG9wdGlvbiBmbGFncyB0byBpbmNsdWRlIGFuZCBleGNsdWRlIGJhc2VkIG9uCisgIC8vLyB0aGUgZHJpdmVyIG1vZGUuCisgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+IGdldEluY2x1ZGVFeGNsdWRlT3B0aW9uRmxhZ01hc2tzKCkgY29uc3Q7CisKKyAgLy8vIEhlbHBlciB1c2VkIGluIEJ1aWxkSm9ic0ZvckFjdGlvbi4gIERvZXNuJ3QgdXNlIHRoZSBjYWNoZSB3aGVuIGJ1aWxkaW5nCisgIC8vLyBqb2JzIHNwZWNpZmljYWxseSBmb3IgdGhlIGdpdmVuIGFjdGlvbiwgYnV0IHdpbGwgdXNlIHRoZSBjYWNoZSB3aGVuCisgIC8vLyBidWlsZGluZyBqb2JzIGZvciB0aGUgQWN0aW9uJ3MgaW5wdXRzLgorICBJbnB1dEluZm8gQnVpbGRKb2JzRm9yQWN0aW9uTm9DYWNoZSgKKyAgICAgIENvbXBpbGF0aW9uICZDLCBjb25zdCBBY3Rpb24gKkEsIGNvbnN0IFRvb2xDaGFpbiAqVEMsIFN0cmluZ1JlZiBCb3VuZEFyY2gsCisgICAgICBib29sIEF0VG9wTGV2ZWwsIGJvb2wgTXVsdGlwbGVBcmNocywgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCwKKyAgICAgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxjb25zdCBBY3Rpb24gKiwgc3RkOjpzdHJpbmc+LCBJbnB1dEluZm8+CisgICAgICAgICAgJkNhY2hlZFJlc3VsdHMsCisgICAgICBBY3Rpb246Ok9mZmxvYWRLaW5kIFRhcmdldERldmljZU9mZmxvYWRLaW5kKSBjb25zdDsKKworcHVibGljOgorICAvLy8gR2V0UmVsZWFzZVZlcnNpb24gLSBQYXJzZSAoKFswLTldKykoLihbMC05XSspKC4oWzAtOV0rKT8pKT8pPyBhbmQKKyAgLy8vIHJldHVybiB0aGUgZ3JvdXBlZCB2YWx1ZXMgYXMgaW50ZWdlcnMuIE51bWJlcnMgd2hpY2ggYXJlIG5vdAorICAvLy8gcHJvdmlkZWQgYXJlIHNldCB0byAwLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVHJ1ZSBpZiB0aGUgZW50aXJlIHN0cmluZyB3YXMgcGFyc2VkICg5LjIpLCBvciBhbGwKKyAgLy8vIGdyb3VwcyB3ZXJlIHBhcnNlZCAoMTAuMy41ZXh0cmFzdHVmZikuIEhhZEV4dHJhIGlzIHRydWUgaWYgYWxsCisgIC8vLyBncm91cHMgd2VyZSBwYXJzZWQgYnV0IGV4dHJhIGNoYXJhY3RlcnMgcmVtYWluIGF0IHRoZSBlbmQuCisgIHN0YXRpYyBib29sIEdldFJlbGVhc2VWZXJzaW9uKFN0cmluZ1JlZiBTdHIsIHVuc2lnbmVkICZNYWpvciwgdW5zaWduZWQgJk1pbm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTWljcm8sIGJvb2wgJkhhZEV4dHJhKTsKKworICAvLy8gUGFyc2UgZGlnaXRzIGZyb20gYSBzdHJpbmcgXHAgU3RyIGFuZCBmdWxmaWxsIFxwIERpZ2l0cyB3aXRoCisgIC8vLyB0aGUgcGFyc2VkIG51bWJlcnMuIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgbWF4IG51bWJlciBvZgorICAvLy8gZGlnaXRzIHRvIGxvb2sgZm9yIGlzIGVxdWFsIHRvIERpZ2l0cy5zaXplKCkuCisgIC8vLworICAvLy8gXHJldHVybiBUcnVlIGlmIHRoZSBlbnRpcmUgc3RyaW5nIHdhcyBwYXJzZWQgYW5kIHRoZXJlIGFyZQorICAvLy8gbm8gZXh0cmEgY2hhcmFjdGVycyByZW1haW5pbmcgYXQgdGhlIGVuZC4KKyAgc3RhdGljIGJvb2wgR2V0UmVsZWFzZVZlcnNpb24oU3RyaW5nUmVmIFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0YWJsZUFycmF5UmVmPHVuc2lnbmVkPiBEaWdpdHMpOworICAvLy8gQ29tcHV0ZSB0aGUgZGVmYXVsdCAtZm1vZHVsZS1jYWNoZS1wYXRoLgorICBzdGF0aWMgdm9pZCBnZXREZWZhdWx0TW9kdWxlQ2FjaGVQYXRoKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0KTsKK307CisKKy8vLyBccmV0dXJuIFRydWUgaWYgdGhlIGxhc3QgZGVmaW5lZCBvcHRpbWl6YXRpb24gbGV2ZWwgaXMgLU9mYXN0LgorLy8vIEFuZCBGYWxzZSBvdGhlcndpc2UuCitib29sIGlzT3B0aW1pemF0aW9uTGV2ZWxGYXN0KGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncyk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkcml2ZXIKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9Ecml2ZXJEaWFnbm9zdGljLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvRHJpdmVyRGlhZ25vc3RpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MDMzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvRHJpdmVyRGlhZ25vc3RpYy5oCkBAIC0wLDAgKzEsMjggQEAKKy8vPT09LS0tIERpYWdub3N0aWNEcml2ZXIuaCAtIERpYWdub3N0aWNzIGZvciBsaWJkcml2ZXIgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19EUklWRVJfRFJJVkVSRElBR05PU1RJQ19ICisjZGVmaW5lIExMVk1fQ0xBTkdfRFJJVkVSX0RSSVZFUkRJQUdOT1NUSUNfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworICBuYW1lc3BhY2UgZGlhZyB7CisgICAgZW51bSB7CisjZGVmaW5lIERJQUcoRU5VTSxGTEFHUyxERUZBVUxUX01BUFBJTkcsREVTQyxHUk9VUCxcCisgICAgICAgICAgICAgU0ZJTkFFLE5PV0VSUk9SLFNIT1dJTlNZU0hFQURFUixDQVRFR09SWSkgRU5VTSwKKyNkZWZpbmUgRFJJVkVSU1RBUlQKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljRHJpdmVyS2luZHMuaW5jIgorI3VuZGVmIERJQUcKKyAgICAgIE5VTV9CVUlMVElOX0RSSVZFUl9ESUFHTk9TVElDUworICAgIH07CisgIH0gIC8vIGVuZCBuYW1lc3BhY2UgZGlhZworfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9Kb2IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9Kb2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGMxZWRiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0pvYi5oCkBAIC0wLDAgKzEsMjAwIEBACisvLz09PS0gSm9iLmggLSBDb21tYW5kcyB0byBFeGVjdXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRFJJVkVSX0pPQl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfRFJJVkVSX0pPQl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL09wdGlvbi9PcHRpb24uaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGRyaXZlciB7CisKK2NsYXNzIEFjdGlvbjsKK2NsYXNzIElucHV0SW5mbzsKK2NsYXNzIFRvb2w7CisKKy8vIFJlLWV4cG9ydCB0aGlzIGFzIGNsYW5nOjpkcml2ZXI6OkFyZ1N0cmluZ0xpc3QuCit1c2luZyBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3Q7CisKK3N0cnVjdCBDcmFzaFJlcG9ydEluZm8geworICBTdHJpbmdSZWYgRmlsZW5hbWU7CisgIFN0cmluZ1JlZiBWRlNQYXRoOworCisgIENyYXNoUmVwb3J0SW5mbyhTdHJpbmdSZWYgRmlsZW5hbWUsIFN0cmluZ1JlZiBWRlNQYXRoKQorICAgICAgOiBGaWxlbmFtZShGaWxlbmFtZSksIFZGU1BhdGgoVkZTUGF0aCkge30KK307CisKKy8vLyBDb21tYW5kIC0gQW4gZXhlY3V0YWJsZSBwYXRoL25hbWUgYW5kIGFyZ3VtZW50IHZlY3RvciB0bworLy8vIGV4ZWN1dGUuCitjbGFzcyBDb21tYW5kIHsKKyAgLy8vIFNvdXJjZSAtIFRoZSBhY3Rpb24gd2hpY2ggY2F1c2VkIHRoZSBjcmVhdGlvbiBvZiB0aGlzIGpvYi4KKyAgY29uc3QgQWN0aW9uICZTb3VyY2U7CisKKyAgLy8vIFRvb2wgLSBUaGUgdG9vbCB3aGljaCBjYXVzZWQgdGhlIGNyZWF0aW9uIG9mIHRoaXMgam9iLgorICBjb25zdCBUb29sICZDcmVhdG9yOworCisgIC8vLyBUaGUgZXhlY3V0YWJsZSB0byBydW4uCisgIGNvbnN0IGNoYXIgKkV4ZWN1dGFibGU7CisKKyAgLy8vIFRoZSBsaXN0IG9mIHByb2dyYW0gYXJndW1lbnRzIChub3QgaW5jbHVkaW5nIHRoZSBpbXBsaWNpdCBmaXJzdAorICAvLy8gYXJndW1lbnQsIHdoaWNoIHdpbGwgYmUgdGhlIGV4ZWN1dGFibGUpLgorICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgQXJndW1lbnRzOworCisgIC8vLyBUaGUgbGlzdCBvZiBwcm9ncmFtIGFyZ3VtZW50cyB3aGljaCBhcmUgaW5wdXRzLgorICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgSW5wdXRGaWxlbmFtZXM7CisKKyAgLy8vIFJlc3BvbnNlIGZpbGUgbmFtZSwgaWYgdGhpcyBjb21tYW5kIGlzIHNldCB0byB1c2Ugb25lLCBvciBudWxscHRyCisgIC8vLyBvdGhlcndpc2UKKyAgY29uc3QgY2hhciAqUmVzcG9uc2VGaWxlID0gbnVsbHB0cjsKKworICAvLy8gVGhlIGlucHV0IGZpbGUgbGlzdCBpbiBjYXNlIHdlIG5lZWQgdG8gZW1pdCBhIGZpbGUgbGlzdCBpbnN0ZWFkIG9mIGEKKyAgLy8vIHByb3BlciByZXNwb25zZSBmaWxlCisgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCBJbnB1dEZpbGVMaXN0OworCisgIC8vLyBTdHJpbmcgc3RvcmFnZSBpZiB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBhcmd1bWVudCB0byBzcGVjaWZ5IGEgcmVzcG9uc2UKKyAgLy8vIGZpbGUKKyAgc3RkOjpzdHJpbmcgUmVzcG9uc2VGaWxlRmxhZzsKKworICAvLy8gU2VlIENvbW1hbmQ6OnNldEVudmlyb25tZW50CisgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gRW52aXJvbm1lbnQ7CisKKyAgLy8vIFdoZW4gYSByZXNwb25zZSBmaWxlIGlzIG5lZWRlZCwgd2UgdHJ5IHRvIHB1dCBtb3N0IGFyZ3VtZW50cyBpbiBhbgorICAvLy8gZXhjbHVzaXZlIGZpbGUsIHdoaWxlIG90aGVycyByZW1haW5zIGFzIHJlZ3VsYXIgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgLy8vIFRoaXMgZnVuY3Rpb25zIGZpbGxzIGEgdmVjdG9yIHdpdGggdGhlIHJlZ3VsYXIgY29tbWFuZCBsaW5lIGFyZ3VtZW50cywKKyAgLy8vIGFyZ3YsIGV4Y2x1ZGluZyB0aGUgb25lcyBwYXNzZWQgaW4gYSByZXNwb25zZSBmaWxlLgorICB2b2lkIGJ1aWxkQXJndkZvclJlc3BvbnNlRmlsZShsbHZtOjpTbWFsbFZlY3RvckltcGw8Y29uc3QgY2hhciAqPiAmT3V0KSBjb25zdDsKKworICAvLy8gRW5jb2RlcyBhbiBhcnJheSBvZiBDIHN0cmluZ3MgaW50byBhIHNpbmdsZSBzdHJpbmcgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyBwdXQgaW4gcXVvdGVzIGFyZ3VtZW50cyB0aGF0IGhhdmUgd2hpdGVzcGFjZXMgYW5kCisgIC8vLyB3aWxsIGVzY2FwZSB0aGUgcmVndWxhciBiYWNrc2xhc2hlcyAodXNlZCBpbiBXaW5kb3dzIHBhdGhzKSBhbmQgcXVvdGVzLgorICAvLy8gVGhlIHJlc3VsdHMgYXJlIHRoZSBjb250ZW50cyBvZiBhIHJlc3BvbnNlIGZpbGUsIHdyaXR0ZW4gaW50byBhIHJhd19vc3RyZWFtLgorICB2b2lkIHdyaXRlUmVzcG9uc2VGaWxlKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKK3B1YmxpYzoKKyAgQ29tbWFuZChjb25zdCBBY3Rpb24gJlNvdXJjZSwgY29uc3QgVG9vbCAmQ3JlYXRvciwgY29uc3QgY2hhciAqRXhlY3V0YWJsZSwKKyAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkFyZ3VtZW50cywKKyAgICAgICAgICBBcnJheVJlZjxJbnB1dEluZm8+IElucHV0cyk7CisgIC8vIEZJWE1FOiBUaGlzIHJlYWxseSBzaG91bGRuJ3QgYmUgY29weWFibGUsIGJ1dCBpcyBjdXJyZW50bHkgY29waWVkIGluIHNvbWUKKyAgLy8gZXJyb3IgaGFuZGxpbmcgaW4gRHJpdmVyOjpnZW5lcmF0ZUNvbXBpbGF0aW9uRGlhZ25vc3RpY3MuCisgIENvbW1hbmQoY29uc3QgQ29tbWFuZCAmKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgfkNvbW1hbmQoKSA9IGRlZmF1bHQ7CisKKyAgdmlydHVhbCB2b2lkIFByaW50KGxsdm06OnJhd19vc3RyZWFtICZPUywgY29uc3QgY2hhciAqVGVybWluYXRvciwgYm9vbCBRdW90ZSwKKyAgICAgICAgICAgICAgICAgICAgIENyYXNoUmVwb3J0SW5mbyAqQ3Jhc2hJbmZvID0gbnVsbHB0cikgY29uc3Q7CisKKyAgdmlydHVhbCBpbnQgRXhlY3V0ZShBcnJheVJlZjxPcHRpb25hbDxTdHJpbmdSZWY+PiBSZWRpcmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVyck1zZywgYm9vbCAqRXhlY3V0aW9uRmFpbGVkKSBjb25zdDsKKworICAvLy8gZ2V0U291cmNlIC0gUmV0dXJuIHRoZSBBY3Rpb24gd2hpY2ggY2F1c2VkIHRoZSBjcmVhdGlvbiBvZiB0aGlzIGpvYi4KKyAgY29uc3QgQWN0aW9uICZnZXRTb3VyY2UoKSBjb25zdCB7IHJldHVybiBTb3VyY2U7IH0KKworICAvLy8gZ2V0Q3JlYXRvciAtIFJldHVybiB0aGUgVG9vbCB3aGljaCBjYXVzZWQgdGhlIGNyZWF0aW9uIG9mIHRoaXMgam9iLgorICBjb25zdCBUb29sICZnZXRDcmVhdG9yKCkgY29uc3QgeyByZXR1cm4gQ3JlYXRvcjsgfQorCisgIC8vLyBTZXQgdG8gcGFzcyBhcmd1bWVudHMgdmlhIGEgcmVzcG9uc2UgZmlsZSB3aGVuIGxhdW5jaGluZyB0aGUgY29tbWFuZAorICB2b2lkIHNldFJlc3BvbnNlRmlsZShjb25zdCBjaGFyICpGaWxlTmFtZSk7CisKKyAgLy8vIFNldCBhbiBpbnB1dCBmaWxlIGxpc3QsIG5lY2Vzc2FyeSBpZiB3ZSBuZWVkIHRvIHVzZSBhIHJlc3BvbnNlIGZpbGUgYnV0CisgIC8vLyB0aGUgdG9vbCBiZWluZyBjYWxsZWQgb25seSBzdXBwb3J0cyBpbnB1dCBmaWxlcyBsaXN0cy4KKyAgdm9pZCBzZXRJbnB1dEZpbGVMaXN0KGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCBMaXN0KSB7CisgICAgSW5wdXRGaWxlTGlzdCA9IHN0ZDo6bW92ZShMaXN0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgZW52aXJvbm1lbnQgdG8gYmUgdXNlZCBieSB0aGUgbmV3IHByb2Nlc3MuCisgIC8vLyBccGFyYW0gTmV3RW52aXJvbm1lbnQgQW4gYXJyYXkgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICAvLy8gXHJlbWFyayBJZiB0aGUgZW52aXJvbm1lbnQgcmVtYWlucyB1bnNldCwgdGhlbiB0aGUgZW52aXJvbm1lbnQKKyAgLy8vICAgICAgICAgZnJvbSB0aGUgcGFyZW50IHByb2Nlc3Mgd2lsbCBiZSB1c2VkLgorICB2b2lkIHNldEVudmlyb25tZW50KGxsdm06OkFycmF5UmVmPGNvbnN0IGNoYXIgKj4gTmV3RW52aXJvbm1lbnQpOworCisgIGNvbnN0IGNoYXIgKmdldEV4ZWN1dGFibGUoKSBjb25zdCB7IHJldHVybiBFeGVjdXRhYmxlOyB9CisKKyAgY29uc3QgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZnZXRBcmd1bWVudHMoKSBjb25zdCB7IHJldHVybiBBcmd1bWVudHM7IH0KKworICAvLy8gUHJpbnQgYSBjb21tYW5kIGFyZ3VtZW50LCBhbmQgb3B0aW9uYWxseSBxdW90ZSBpdC4KKyAgc3RhdGljIHZvaWQgcHJpbnRBcmcobGx2bTo6cmF3X29zdHJlYW0gJk9TLCBTdHJpbmdSZWYgQXJnLCBib29sIFF1b3RlKTsKK307CisKKy8vLyBMaWtlIENvbW1hbmQsIGJ1dCB3aXRoIGEgZmFsbGJhY2sgd2hpY2ggaXMgZXhlY3V0ZWQgaW4gY2FzZQorLy8vIHRoZSBwcmltYXJ5IGNvbW1hbmQgY3Jhc2hlcy4KK2NsYXNzIEZhbGxiYWNrQ29tbWFuZCA6IHB1YmxpYyBDb21tYW5kIHsKK3B1YmxpYzoKKyAgRmFsbGJhY2tDb21tYW5kKGNvbnN0IEFjdGlvbiAmU291cmNlXywgY29uc3QgVG9vbCAmQ3JlYXRvcl8sCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpFeGVjdXRhYmxlXywgY29uc3QgQXJnU3RyaW5nTGlzdCAmQXJndW1lbnRzXywKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPElucHV0SW5mbz4gSW5wdXRzLAorICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmQ+IEZhbGxiYWNrXyk7CisKKyAgdm9pZCBQcmludChsbHZtOjpyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IGNoYXIgKlRlcm1pbmF0b3IsIGJvb2wgUXVvdGUsCisgICAgICAgICAgICAgQ3Jhc2hSZXBvcnRJbmZvICpDcmFzaEluZm8gPSBudWxscHRyKSBjb25zdCBvdmVycmlkZTsKKworICBpbnQgRXhlY3V0ZShBcnJheVJlZjxPcHRpb25hbDxTdHJpbmdSZWY+PiBSZWRpcmVjdHMsIHN0ZDo6c3RyaW5nICpFcnJNc2csCisgICAgICAgICAgICAgIGJvb2wgKkV4ZWN1dGlvbkZhaWxlZCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kPiBGYWxsYmFjazsKK307CisKKy8vLyBMaWtlIENvbW1hbmQsIGJ1dCBhbHdheXMgcHJldGVuZHMgdGhhdCB0aGUgd3JhcHBlZCBjb21tYW5kIHN1Y2NlZWRlZC4KK2NsYXNzIEZvcmNlU3VjY2Vzc0NvbW1hbmQgOiBwdWJsaWMgQ29tbWFuZCB7CitwdWJsaWM6CisgIEZvcmNlU3VjY2Vzc0NvbW1hbmQoY29uc3QgQWN0aW9uICZTb3VyY2VfLCBjb25zdCBUb29sICZDcmVhdG9yXywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpFeGVjdXRhYmxlXywgY29uc3QgQXJnU3RyaW5nTGlzdCAmQXJndW1lbnRzXywKKyAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxJbnB1dEluZm8+IElucHV0cyk7CisKKyAgdm9pZCBQcmludChsbHZtOjpyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IGNoYXIgKlRlcm1pbmF0b3IsIGJvb2wgUXVvdGUsCisgICAgICAgICAgICAgQ3Jhc2hSZXBvcnRJbmZvICpDcmFzaEluZm8gPSBudWxscHRyKSBjb25zdCBvdmVycmlkZTsKKworICBpbnQgRXhlY3V0ZShBcnJheVJlZjxPcHRpb25hbDxTdHJpbmdSZWY+PiBSZWRpcmVjdHMsIHN0ZDo6c3RyaW5nICpFcnJNc2csCisgICAgICAgICAgICAgIGJvb2wgKkV4ZWN1dGlvbkZhaWxlZCkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gSm9iTGlzdCAtIEEgc2VxdWVuY2Ugb2Ygam9icyB0byBwZXJmb3JtLgorY2xhc3MgSm9iTGlzdCB7CitwdWJsaWM6CisgIHVzaW5nIGxpc3RfdHlwZSA9IFNtYWxsVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kPiwgND47CisgIHVzaW5nIHNpemVfdHlwZSA9IGxpc3RfdHlwZTo6c2l6ZV90eXBlOworICB1c2luZyBpdGVyYXRvciA9IGxsdm06OnBvaW50ZWVfaXRlcmF0b3I8bGlzdF90eXBlOjppdGVyYXRvcj47CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gbGx2bTo6cG9pbnRlZV9pdGVyYXRvcjxsaXN0X3R5cGU6OmNvbnN0X2l0ZXJhdG9yPjsKKworcHJpdmF0ZToKKyAgbGlzdF90eXBlIEpvYnM7CisKK3B1YmxpYzoKKyAgdm9pZCBQcmludChsbHZtOjpyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IGNoYXIgKlRlcm1pbmF0b3IsCisgICAgICAgICAgICAgYm9vbCBRdW90ZSwgQ3Jhc2hSZXBvcnRJbmZvICpDcmFzaEluZm8gPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gQWRkIGEgam9iIHRvIHRoZSBsaXN0ICh0YWtpbmcgb3duZXJzaGlwKS4KKyAgdm9pZCBhZGRKb2Ioc3RkOjp1bmlxdWVfcHRyPENvbW1hbmQ+IEopIHsgSm9icy5wdXNoX2JhY2soc3RkOjptb3ZlKEopKTsgfQorCisgIC8vLyBDbGVhciB0aGUgam9iIGxpc3QuCisgIHZvaWQgY2xlYXIoKTsKKworICBjb25zdCBsaXN0X3R5cGUgJmdldEpvYnMoKSBjb25zdCB7IHJldHVybiBKb2JzOyB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEpvYnMuZW1wdHkoKTsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEpvYnMuc2l6ZSgpOyB9CisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gSm9icy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gSm9icy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIEpvYnMuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gSm9icy5lbmQoKTsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgZHJpdmVyCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19EUklWRVJfSk9CX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9NdWx0aWxpYi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRHJpdmVyL011bHRpbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE0OGZhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9NdWx0aWxpYi5oCkBAIC0wLDAgKzEsMTk3IEBACisvLz09PS0gTXVsdGlsaWIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRFJJVkVSX01VTFRJTElCX0gKKyNkZWZpbmUgTExWTV9DTEFOR19EUklWRVJfTVVMVElMSUJfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBkcml2ZXIgeworCisvLy8gVGhpcyBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSBHQ0MgTXVsdGlsaWIsIG9yIGEgc2VnbWVudCBvZiBvbmUgY29udHJvbGxlZAorLy8vIGJ5IGEgY29tbWFuZCBsaW5lIGZsYWcKK2NsYXNzIE11bHRpbGliIHsKK3B1YmxpYzoKKyAgdXNpbmcgZmxhZ3NfbGlzdCA9IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjsKKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgR0NDU3VmZml4OworICBzdGQ6OnN0cmluZyBPU1N1ZmZpeDsKKyAgc3RkOjpzdHJpbmcgSW5jbHVkZVN1ZmZpeDsKKyAgZmxhZ3NfbGlzdCBGbGFnczsKKworcHVibGljOgorICBNdWx0aWxpYihTdHJpbmdSZWYgR0NDU3VmZml4ID0ge30sIFN0cmluZ1JlZiBPU1N1ZmZpeCA9IHt9LAorICAgICAgICAgICBTdHJpbmdSZWYgSW5jbHVkZVN1ZmZpeCA9IHt9KTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgZGV0ZWN0ZWQgR0NDIGluc3RhbGxhdGlvbiBwYXRoIHN1ZmZpeCBmb3IgdGhlIG11bHRpLWFyY2gKKyAgLy8vIHRhcmdldCB2YXJpYW50LiBBbHdheXMgc3RhcnRzIHdpdGggYSAnLycsIHVubGVzcyBlbXB0eQorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2NjU3VmZml4KCkgY29uc3QgeworICAgIGFzc2VydChHQ0NTdWZmaXguZW1wdHkoKSB8fAorICAgICAgICAgICAoU3RyaW5nUmVmKEdDQ1N1ZmZpeCkuZnJvbnQoKSA9PSAnLycgJiYgR0NDU3VmZml4LnNpemUoKSA+IDEpKTsKKyAgICByZXR1cm4gR0NDU3VmZml4OworICB9CisKKyAgLy8vIFNldCB0aGUgR0NDIGluc3RhbGxhdGlvbiBwYXRoIHN1ZmZpeC4KKyAgTXVsdGlsaWIgJmdjY1N1ZmZpeChTdHJpbmdSZWYgUyk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGRldGVjdGVkIG9zIHBhdGggc3VmZml4IGZvciB0aGUgbXVsdGktYXJjaAorICAvLy8gdGFyZ2V0IHZhcmlhbnQuIEFsd2F5cyBzdGFydHMgd2l0aCBhICcvJywgdW5sZXNzIGVtcHR5CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZvc1N1ZmZpeCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoT1NTdWZmaXguZW1wdHkoKSB8fAorICAgICAgICAgICAoU3RyaW5nUmVmKE9TU3VmZml4KS5mcm9udCgpID09ICcvJyAmJiBPU1N1ZmZpeC5zaXplKCkgPiAxKSk7CisgICAgcmV0dXJuIE9TU3VmZml4OworICB9CisKKyAgLy8vIFNldCB0aGUgb3MgcGF0aCBzdWZmaXguCisgIE11bHRpbGliICZvc1N1ZmZpeChTdHJpbmdSZWYgUyk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGluY2x1ZGUgZGlyZWN0b3J5IHN1ZmZpeC4gQWx3YXlzIHN0YXJ0cyB3aXRoIGEgJy8nLCB1bmxlc3MKKyAgLy8vIGVtcHR5CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZpbmNsdWRlU3VmZml4KCkgY29uc3QgeworICAgIGFzc2VydChJbmNsdWRlU3VmZml4LmVtcHR5KCkgfHwKKyAgICAgICAgICAgKFN0cmluZ1JlZihJbmNsdWRlU3VmZml4KS5mcm9udCgpID09ICcvJyAmJiBJbmNsdWRlU3VmZml4LnNpemUoKSA+IDEpKTsKKyAgICByZXR1cm4gSW5jbHVkZVN1ZmZpeDsKKyAgfQorCisgIC8vLyBTZXQgdGhlIGluY2x1ZGUgZGlyZWN0b3J5IHN1ZmZpeAorICBNdWx0aWxpYiAmaW5jbHVkZVN1ZmZpeChTdHJpbmdSZWYgUyk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGZsYWdzIHRoYXQgaW5kaWNhdGUgb3IgY29udHJhaW5kaWNhdGUgdGhpcyBtdWx0aWxpYidzIHVzZQorICAvLy8gQWxsIGVsZW1lbnRzIGJlZ2luIHdpdGggZWl0aGVyICcrJyBvciAnLScKKyAgY29uc3QgZmxhZ3NfbGlzdCAmZmxhZ3MoKSBjb25zdCB7IHJldHVybiBGbGFnczsgfQorICBmbGFnc19saXN0ICZmbGFncygpIHsgcmV0dXJuIEZsYWdzOyB9CisKKyAgLy8vIEFkZCBhIGZsYWcgdG8gdGhlIGZsYWdzIGxpc3QKKyAgLy8vIFxwIEZsYWcgbXVzdCBiZSBhIGZsYWcgYWNjZXB0ZWQgYnkgdGhlIGRyaXZlciB3aXRoIGl0cyBsZWFkaW5nICctJyByZW1vdmVkLAorICAvLy8gICAgIGFuZCByZXBsYWNlZCB3aXRoIGVpdGhlcjoKKyAgLy8vICAgICAgICctJyB3aGljaCBjb250cmFpbmRpY2F0ZXMgdXNpbmcgdGhpcyBtdWx0aWxpYiB3aXRoIHRoYXQgZmxhZworICAvLy8gICAgIG9yOgorICAvLy8gICAgICAgJysnIHdoaWNoIHByb21vdGVzIHVzaW5nIHRoaXMgbXVsdGlsaWIgaW4gdGhlIHByZXNlbmNlIG9mIHRoYXQgZmxhZworICAvLy8gICAgIG90aGVyd2lzZSAnLXByaW50LW11bHRpLWxpYicgd2lsbCBub3QgZW1pdCB0aGVtIGNvcnJlY3RseS4KKyAgTXVsdGlsaWIgJmZsYWcoU3RyaW5nUmVmIEYpIHsKKyAgICBhc3NlcnQoRi5mcm9udCgpID09ICcrJyB8fCBGLmZyb250KCkgPT0gJy0nKTsKKyAgICBGbGFncy5wdXNoX2JhY2soRik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTExWTV9EVU1QX01FVEhPRCB2b2lkIGR1bXAoKSBjb25zdDsKKyAgLy8vIFxicmllZiBwcmludCBzdW1tYXJ5IG9mIHRoZSBNdWx0aWxpYgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgYW55IG9mIHRoZSAnYWdhaW5zdCcgZmxhZ3MgY29udHJhZGljdCB0aGUgJ2ZvcicgZmxhZ3MuCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OworCisgIC8vLyBDaGVjayB3aGV0aGVyIHRoZSBkZWZhdWx0IGlzIHNlbGVjdGVkCisgIGJvb2wgaXNEZWZhdWx0KCkgY29uc3QKKyAgeyByZXR1cm4gR0NDU3VmZml4LmVtcHR5KCkgJiYgT1NTdWZmaXguZW1wdHkoKSAmJiBJbmNsdWRlU3VmZml4LmVtcHR5KCk7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTXVsdGlsaWIgJk90aGVyKSBjb25zdDsKK307CisKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTXVsdGlsaWIgJk0pOworCitjbGFzcyBNdWx0aWxpYlNldCB7CitwdWJsaWM6CisgIHVzaW5nIG11bHRpbGliX2xpc3QgPSBzdGQ6OnZlY3RvcjxNdWx0aWxpYj47CisgIHVzaW5nIGl0ZXJhdG9yID0gbXVsdGlsaWJfbGlzdDo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gbXVsdGlsaWJfbGlzdDo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIEluY2x1ZGVEaXJzRnVuYyA9CisgICAgICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPihjb25zdCBNdWx0aWxpYiAmTSk+OworICB1c2luZyBGaWx0ZXJDYWxsYmFjayA9IGxsdm06OmZ1bmN0aW9uX3JlZjxib29sKGNvbnN0IE11bHRpbGliICYpPjsKKworcHJpdmF0ZToKKyAgbXVsdGlsaWJfbGlzdCBNdWx0aWxpYnM7CisgIEluY2x1ZGVEaXJzRnVuYyBJbmNsdWRlQ2FsbGJhY2s7CisgIEluY2x1ZGVEaXJzRnVuYyBGaWxlUGF0aHNDYWxsYmFjazsKKworcHVibGljOgorICBNdWx0aWxpYlNldCgpID0gZGVmYXVsdDsKKworICAvLy8gQWRkIGFuIG9wdGlvbmFsIE11bHRpbGliIHNlZ21lbnQKKyAgTXVsdGlsaWJTZXQgJk1heWJlKGNvbnN0IE11bHRpbGliICZNKTsKKworICAvLy8gQWRkIGEgc2V0IG9mIG11dHVhbGx5IGluY29tcGF0aWJsZSBNdWx0aWxpYiBzZWdtZW50cworICBNdWx0aWxpYlNldCAmRWl0aGVyKGNvbnN0IE11bHRpbGliICZNMSwgY29uc3QgTXVsdGlsaWIgJk0yKTsKKyAgTXVsdGlsaWJTZXQgJkVpdGhlcihjb25zdCBNdWx0aWxpYiAmTTEsIGNvbnN0IE11bHRpbGliICZNMiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aWxpYiAmTTMpOworICBNdWx0aWxpYlNldCAmRWl0aGVyKGNvbnN0IE11bHRpbGliICZNMSwgY29uc3QgTXVsdGlsaWIgJk0yLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE11bHRpbGliICZNMywgY29uc3QgTXVsdGlsaWIgJk00KTsKKyAgTXVsdGlsaWJTZXQgJkVpdGhlcihjb25zdCBNdWx0aWxpYiAmTTEsIGNvbnN0IE11bHRpbGliICZNMiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aWxpYiAmTTMsIGNvbnN0IE11bHRpbGliICZNNCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aWxpYiAmTTUpOworICBNdWx0aWxpYlNldCAmRWl0aGVyKEFycmF5UmVmPE11bHRpbGliPiBNcyk7CisKKyAgLy8vIEZpbHRlciBvdXQgc29tZSBzdWJzZXQgb2YgdGhlIE11bHRpbGlicyB1c2luZyBhIHVzZXIgZGVmaW5lZCBjYWxsYmFjaworICBNdWx0aWxpYlNldCAmRmlsdGVyT3V0KEZpbHRlckNhbGxiYWNrIEYpOworCisgIC8vLyBGaWx0ZXIgb3V0IHRob3NlIE11bHRpbGlicyB3aG9zZSBnY2NTdWZmaXggbWF0Y2hlcyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbgorICBNdWx0aWxpYlNldCAmRmlsdGVyT3V0KGNvbnN0IGNoYXIgKlJlZ2V4KTsKKworICAvLy8gQWRkIGEgY29tcGxldGVkIE11bHRpbGliIHRvIHRoZSBzZXQKKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgTXVsdGlsaWIgJk0pOworCisgIC8vLyBVbmlvbiB0aGlzIHNldCBvZiBtdWx0aWxpYnMgd2l0aCBhbm90aGVyCisgIHZvaWQgY29tYmluZVdpdGgoY29uc3QgTXVsdGlsaWJTZXQgJk1TKTsKKworICAvLy8gUmVtb3ZlIGFsbCBvZiB0aGllIG11bHRpbGlicyBmcm9tIHRoZSBzZXQKKyAgdm9pZCBjbGVhcigpIHsgTXVsdGlsaWJzLmNsZWFyKCk7IH0KKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIE11bHRpbGlicy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gTXVsdGlsaWJzLmJlZ2luKCk7IH0KKworICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBNdWx0aWxpYnMuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gTXVsdGlsaWJzLmVuZCgpOyB9CisKKyAgLy8vIFBpY2sgdGhlIGJlc3QgbXVsdGlsaWIgaW4gdGhlIHNldCwgXHJldHVybnMgZmFsc2UgaWYgbm9uZSBhcmUgY29tcGF0aWJsZQorICBib29sIHNlbGVjdChjb25zdCBNdWx0aWxpYjo6ZmxhZ3NfbGlzdCAmRmxhZ3MsIE11bHRpbGliICZNKSBjb25zdDsKKworICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gTXVsdGlsaWJzLnNpemUoKTsgfQorCisgIExMVk1fRFVNUF9NRVRIT0Qgdm9pZCBkdW1wKCkgY29uc3Q7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICBNdWx0aWxpYlNldCAmc2V0SW5jbHVkZURpcnNDYWxsYmFjayhJbmNsdWRlRGlyc0Z1bmMgRikgeworICAgIEluY2x1ZGVDYWxsYmFjayA9IHN0ZDo6bW92ZShGKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBJbmNsdWRlRGlyc0Z1bmMgJmluY2x1ZGVEaXJzQ2FsbGJhY2soKSBjb25zdCB7IHJldHVybiBJbmNsdWRlQ2FsbGJhY2s7IH0KKworICBNdWx0aWxpYlNldCAmc2V0RmlsZVBhdGhzQ2FsbGJhY2soSW5jbHVkZURpcnNGdW5jIEYpIHsKKyAgICBGaWxlUGF0aHNDYWxsYmFjayA9IHN0ZDo6bW92ZShGKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBJbmNsdWRlRGlyc0Z1bmMgJmZpbGVQYXRoc0NhbGxiYWNrKCkgY29uc3QgeyByZXR1cm4gRmlsZVBhdGhzQ2FsbGJhY2s7IH0KKworcHJpdmF0ZToKKyAgLy8vIEFwcGx5IHRoZSBmaWx0ZXIgdG8gTXVsdGlsaWJzIGFuZCByZXR1cm4gdGhlIHN1YnNldCB0aGF0IHJlbWFpbnMKKyAgc3RhdGljIG11bHRpbGliX2xpc3QgZmlsdGVyQ29weShGaWx0ZXJDYWxsYmFjayBGLCBjb25zdCBtdWx0aWxpYl9saXN0ICZNcyk7CisKKyAgLy8vIEFwcGx5IHRoZSBmaWx0ZXIgdG8gdGhlIG11bHRpbGliX2xpc3QsIHJlbW92aW5nIHRob3NlIHRoYXQgZG9uJ3QgbWF0Y2gKKyAgc3RhdGljIHZvaWQgZmlsdGVySW5QbGFjZShGaWx0ZXJDYWxsYmFjayBGLCBtdWx0aWxpYl9saXN0ICZNcyk7Cit9OworCityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE11bHRpbGliU2V0ICZNUyk7CisKK30gLy8gbmFtZXNwYWNlIGRyaXZlcgorfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfRFJJVkVSX01VTFRJTElCX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9PcHRpb25zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvT3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYTNjYjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvT3B0aW9ucy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vPT09LS0tIE9wdGlvbnMuaCAtIE9wdGlvbiBpbmZvICYgdGFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19EUklWRVJfT1BUSU9OU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfRFJJVkVSX09QVElPTlNfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb3B0IHsKK2NsYXNzIE9wdFRhYmxlOworfQorfQorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGRyaXZlciB7CisKK25hbWVzcGFjZSBvcHRpb25zIHsKKy8vLyBGbGFncyBzcGVjaWZpY2FsbHkgZm9yIGNsYW5nIG9wdGlvbnMuICBNdXN0IG5vdCBvdmVybGFwIHdpdGgKKy8vLyBsbHZtOjpvcHQ6OkRyaXZlckZsYWcuCitlbnVtIENsYW5nRmxhZ3MgeworICBEcml2ZXJPcHRpb24gPSAoMSA8PCA0KSwKKyAgTGlua2VySW5wdXQgPSAoMSA8PCA1KSwKKyAgTm9Bcmd1bWVudFVudXNlZCA9ICgxIDw8IDYpLAorICBVbnN1cHBvcnRlZCA9ICgxIDw8IDcpLAorICBDb3JlT3B0aW9uID0gKDEgPDwgOCksCisgIENMT3B0aW9uID0gKDEgPDwgOSksCisgIENDMU9wdGlvbiA9ICgxIDw8IDEwKSwKKyAgQ0MxQXNPcHRpb24gPSAoMSA8PCAxMSksCisgIE5vRHJpdmVyT3B0aW9uID0gKDEgPDwgMTIpLAorICBJZ25vcmVkID0gKDEgPDwgMTMpCit9OworCitlbnVtIElEIHsKKyAgICBPUFRfSU5WQUxJRCA9IDAsIC8vIFRoaXMgaXMgbm90IGFuIG9wdGlvbiBJRC4KKyNkZWZpbmUgT1BUSU9OKFBSRUZJWCwgTkFNRSwgSUQsIEtJTkQsIEdST1VQLCBBTElBUywgQUxJQVNBUkdTLCBGTEFHUywgUEFSQU0sICBcCisgICAgICAgICAgICAgICBIRUxQVEVYVCwgTUVUQVZBUiwgVkFMVUVTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUFRfIyNJRCwKKyNpbmNsdWRlICJjbGFuZy9Ecml2ZXIvT3B0aW9ucy5pbmMiCisgICAgTGFzdE9wdGlvbgorI3VuZGVmIE9QVElPTgorICB9OworfQorCitzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6b3B0OjpPcHRUYWJsZT4gY3JlYXRlRHJpdmVyT3B0VGFibGUoKTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvT3B0aW9ucy5pbmMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvT3B0aW9ucy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ3MDVmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9PcHRpb25zLmluYwpAQCAtMCwwICsxLDMyOTMgQEAKKy8qPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogT3B0aW9uIFBhcnNpbmcgRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLCBkbyBub3QgZWRpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKy8vLy8vLy8vLworLy8gUHJlZml4ZXMKKworI2lmZGVmIFBSRUZJWAorI2RlZmluZSBDT01NQSAsCitQUkVGSVgocHJlZml4XzAsIHtudWxscHRyfSkKK1BSRUZJWChwcmVmaXhfMSwgeyItIiBDT01NQSBudWxscHRyfSkKK1BSRUZJWChwcmVmaXhfNCwgeyItIiBDT01NQSAiLS0iIENPTU1BIG51bGxwdHJ9KQorUFJFRklYKHByZWZpeF8zLCB7Ii0tIiBDT01NQSBudWxscHRyfSkKK1BSRUZJWChwcmVmaXhfMiwgeyIvIiBDT01NQSAiLSIgQ09NTUEgbnVsbHB0cn0pCisjdW5kZWYgQ09NTUEKKyNlbmRpZiAvLyBQUkVGSVgKKworLy8vLy8vLy8vCisvLyBHcm91cHMKKworI2lmZGVmIE9QVElPTgorT1BUSU9OKG51bGxwdHIsICI8YWN0aW9uIGdyb3VwPiIsIEFjdGlvbl9Hcm91cCwgR3JvdXAsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxDb21waWxlT25seSBncm91cD4iLCBDb21waWxlT25seV9Hcm91cCwgR3JvdXAsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxnIGdyb3VwPiIsIERlYnVnSW5mb19Hcm91cCwgR3JvdXAsIENvbXBpbGVPbmx5X0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKG51bGxwdHIsICI8Vy9SIGdyb3VwPiIsIERpYWdfR3JvdXAsIEdyb3VwLCBDb21waWxlT25seV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihudWxscHRyLCAiPEkgZ3JvdXA+IiwgSV9Hcm91cCwgR3JvdXAsIEluY2x1ZGVQYXRoX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKG51bGxwdHIsICI8SS9pIGdyb3VwPiIsIEluY2x1ZGVQYXRoX0dyb3VwLCBHcm91cCwgUHJlcHJvY2Vzc29yX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKG51bGxwdHIsICI8VC9lL3MvdC91IGdyb3VwPiIsIExpbmtfR3JvdXAsIEdyb3VwLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKG51bGxwdHIsICI8TSBncm91cD4iLCBNX0dyb3VwLCBHcm91cCwgUHJlcHJvY2Vzc29yX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKG51bGxwdHIsICI8TyBncm91cD4iLCBPX0dyb3VwLCBHcm91cCwgQ29tcGlsZU9ubHlfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxQcmVwcm9jZXNzb3IgZ3JvdXA+IiwgUHJlcHJvY2Vzc29yX0dyb3VwLCBHcm91cCwgQ29tcGlsZU9ubHlfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxSIGdyb3VwPiIsIFJfR3JvdXAsIEdyb3VwLCBEaWFnX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKG51bGxwdHIsICI8UiAod2l0aCB2YWx1ZSkgZ3JvdXA+IiwgUl92YWx1ZV9Hcm91cCwgR3JvdXAsIFJfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxTdGF0aWMgYW5hbHl6ZXIgZ3JvdXA+IiwgU3RhdGljQW5hbHl6ZXJfR3JvdXAsIEdyb3VwLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKG51bGxwdHIsICI8VCBncm91cD4iLCBUX0dyb3VwLCBHcm91cCwgTGlua19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihudWxscHRyLCAiPFcgZ3JvdXA+IiwgV19Hcm91cCwgR3JvdXAsIERpYWdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxXICh3aXRoIHZhbHVlKSBncm91cD4iLCBXX3ZhbHVlX0dyb3VwLCBHcm91cCwgV19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihudWxscHRyLCAiPC9NIGdyb3VwPiIsIF9TTEFTSF9NX0dyb3VwLCBHcm91cCwgY2xfY29tcGlsZV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihudWxscHRyLCAiPC92b2xhdGlsZSBncm91cD4iLCBfU0xBU0hfdm9sYXRpbGVfR3JvdXAsIEdyb3VwLCBjbF9jb21waWxlX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKG51bGxwdHIsICI8Y2xhbmctY2wgb3B0aW9ucz4iLCBjbF9Hcm91cCwgR3JvdXAsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkNMLkVYRSBDT01QQVRJQklMSVRZIE9QVElPTlMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKG51bGxwdHIsICI8Y2xhbmctY2wgY29tcGlsZS1vbmx5IG9wdGlvbnM+IiwgY2xfY29tcGlsZV9Hcm91cCwgR3JvdXAsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKG51bGxwdHIsICI8Y2xhbmctY2wgaWdub3JlZCBvcHRpb25zPiIsIGNsX2lnbm9yZWRfR3JvdXAsIEdyb3VwLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihudWxscHRyLCAiPGNsYW5nIGkgZ3JvdXA+IiwgY2xhbmdfaV9Hcm91cCwgR3JvdXAsIGlfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxjbGFuZyBpZ25vcmVkIGYgZ3JvdXA+IiwgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBHcm91cCwgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihudWxscHRyLCAiPGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwPiIsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBHcm91cCwgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihudWxscHRyLCAiPGNsYW5nIGxlZ2FjeSBmbGFncz4iLCBjbGFuZ19pZ25vcmVkX2xlZ2FjeV9vcHRpb25zX0dyb3VwLCBHcm91cCwgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihudWxscHRyLCAiPGNsYW5nIGlnbm9yZWQgbSBncm91cD4iLCBjbGFuZ19pZ25vcmVkX21fR3JvdXAsIEdyb3VwLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKG51bGxwdHIsICI8ZCBncm91cD4iLCBkX0dyb3VwLCBHcm91cCwgUHJlcHJvY2Vzc29yX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKG51bGxwdHIsICI8ZiBncm91cD4iLCBmX0dyb3VwLCBHcm91cCwgQ29tcGlsZU9ubHlfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxmIChjbGFuZy1vbmx5KSBncm91cD4iLCBmX2NsYW5nX0dyb3VwLCBHcm91cCwgQ29tcGlsZU9ubHlfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxnTiBncm91cD4iLCBnTl9Hcm91cCwgR3JvdXAsIGdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxnVHVuZSBncm91cD4iLCBnVHVuZV9Hcm91cCwgR3JvdXAsIGdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxnIGdyb3VwPiIsIGdfR3JvdXAsIEdyb3VwLCBEZWJ1Z0luZm9fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxnIGZsYWdzIGdyb3VwPiIsIGdfZmxhZ3NfR3JvdXAsIEdyb3VwLCBEZWJ1Z0luZm9fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxnZm9ydHJhbiBncm91cD4iLCBnZm9ydHJhbl9Hcm91cCwgR3JvdXAsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxnZ2RiTiBncm91cD4iLCBnZ2RiTl9Hcm91cCwgR3JvdXAsIGdOX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKG51bGxwdHIsICI8aSBncm91cD4iLCBpX0dyb3VwLCBHcm91cCwgSW5jbHVkZVBhdGhfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxjbGFuZyBpbnRlcm5hbCBvcHRpb25zPiIsIGludGVybmFsX0dyb3VwLCBHcm91cCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihudWxscHRyLCAiPGNsYW5nIGRlYnVnL2RldmVsb3BtZW50IGludGVybmFsIG9wdGlvbnM+IiwgaW50ZXJuYWxfZGVidWdfR3JvdXAsIEdyb3VwLCBpbnRlcm5hbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiREVCVUcvREVWRUxPUE1FTlQgT1BUSU9OUyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxjbGFuZyBkcml2ZXIgaW50ZXJuYWwgb3B0aW9ucz4iLCBpbnRlcm5hbF9kcml2ZXJfR3JvdXAsIEdyb3VwLCBpbnRlcm5hbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRFJJVkVSIE9QVElPTlMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKG51bGxwdHIsICI8bSBncm91cD4iLCBtX0dyb3VwLCBHcm91cCwgQ29tcGlsZU9ubHlfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxhYXJjaDY0IGZlYXR1cmVzIGdyb3VwPiIsIG1fYWFyY2g2NF9GZWF0dXJlc19Hcm91cCwgR3JvdXAsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxhbWRncHUgZmVhdHVyZXMgZ3JvdXA+IiwgbV9hbWRncHVfRmVhdHVyZXNfR3JvdXAsIEdyb3VwLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKG51bGxwdHIsICI8YXJtIGZlYXR1cmVzIGdyb3VwPiIsIG1fYXJtX0ZlYXR1cmVzX0dyb3VwLCBHcm91cCwgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihudWxscHRyLCAiPGhleGFnb24gZmVhdHVyZXMgZ3JvdXA+IiwgbV9oZXhhZ29uX0ZlYXR1cmVzX0dyb3VwLCBHcm91cCwgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihudWxscHRyLCAiPGhleGFnb24gZmVhdHVyZXMgZ3JvdXA+IiwgbV9oZXhhZ29uX0ZlYXR1cmVzX0hWWF9Hcm91cCwgR3JvdXAsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxtIGxpYmMgZ3JvdXA+IiwgbV9saWJjX0dyb3VwLCBHcm91cCwgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihudWxscHRyLCAiPHBwYyBmZWF0dXJlcyBncm91cD4iLCBtX3BwY19GZWF0dXJlc19Hcm91cCwgR3JvdXAsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjx3YXNtIGZlYXR1cmVzIGdyb3VwPiIsIG1fd2FzbV9GZWF0dXJlc19Hcm91cCwgR3JvdXAsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjx4ODYgZmVhdHVyZXMgZ3JvdXA+IiwgbV94ODZfRmVhdHVyZXNfR3JvdXAsIEdyb3VwLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKG51bGxwdHIsICI8b3BlbmNsIGdyb3VwPiIsIG9wZW5jbF9Hcm91cCwgR3JvdXAsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxwZWRhbnRpYyBncm91cD4iLCBwZWRhbnRpY19Hcm91cCwgR3JvdXAsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjxyZXNlcnZlZCBsaWJzIGdyb3VwPiIsIHJlc2VydmVkX2xpYl9Hcm91cCwgR3JvdXAsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04obnVsbHB0ciwgIjx1IGdyb3VwPiIsIHVfR3JvdXAsIEdyb3VwLCBMaW5rX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorCisvLy8vLy8vLy8vCisvLyBPcHRpb25zCisKK09QVElPTihwcmVmaXhfMCwgIjxpbnB1dD4iLCBJTlBVVCwgSW5wdXQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzAsICI8dW5rbm93bj4iLCBVTktOT1dOLCBVbmtub3duLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiIyMjIiwgX0hBU0hfSEFTSF9IQVNILCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJQcmludCAoYnV0IGRvIG5vdCBydW4pIHRoZSBjb21tYW5kcyB0byBydW4gZm9yIHRoaXMgY29tcGlsYXRpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiPyIsIF9TTEFTSF9RVUVTVElPTiwgRmxhZywgY2xfR3JvdXAsIGhlbHAsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkRpc3BsYXkgYXZhaWxhYmxlIG9wdGlvbnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiQS0iLCBBX0RBU0gsIEpvaW5lZCwgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhZGQtcGx1Z2luIiwgYWRkX3BsdWdpbiwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJVc2UgdGhlIG5hbWVkIHBsdWdpbiBhY3Rpb24gaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgYWN0aW9uIiwgIjxuYW1lPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJBSSIsIF9TTEFTSF9BSSwgSm9pbmVkLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImFsbC13YXJuaW5ncyIsIF9hbGxfd2FybmluZ3MsIEZsYWcsIElOVkFMSUQsIFdhbGwsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhbGxfbG9hZCIsIGFsbF9fbG9hZCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImFsbG93YWJsZV9jbGllbnQiLCBhbGxvd2FibGVfX2NsaWVudCwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJhbmFseXplLWF1dG8iLCBfYW5hbHl6ZV9hdXRvLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhbmFseXplLWZ1bmN0aW9uPSIsIGFuYWx5emVfZnVuY3Rpb25fRVEsIEpvaW5lZCwgSU5WQUxJRCwgYW5hbHl6ZV9mdW5jdGlvbiwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhbmFseXplLWZ1bmN0aW9uIiwgYW5hbHl6ZV9mdW5jdGlvbiwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJSdW4gYW5hbHlzaXMgb24gc3BlY2lmaWMgZnVuY3Rpb24gKGZvciBDKysgaW5jbHVkZSBwYXJhbWV0ZXJzIGluIG5hbWUpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgImFuYWx5emUtIiwgX1NMQVNIX2FuYWx5emVfLCBGbGFnLCBjbF9pZ25vcmVkX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImFuYWx5emVyLWNoZWNrZXItaGVscCIsIGFuYWx5emVyX2NoZWNrZXJfaGVscCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkRpc3BsYXkgdGhlIGxpc3Qgb2YgYW5hbHl6ZXIgY2hlY2tlcnMgdGhhdCBhcmUgYXZhaWxhYmxlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImFuYWx5emVyLWNoZWNrZXI9IiwgYW5hbHl6ZXJfY2hlY2tlcl9FUSwgSm9pbmVkLCBJTlZBTElELCBhbmFseXplcl9jaGVja2VyLCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImFuYWx5emVyLWNoZWNrZXIiLCBhbmFseXplcl9jaGVja2VyLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkNob29zZSBhbmFseXplciBjaGVja2VycyB0byBlbmFibGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiYW5hbHl6ZXItY29uZmlnIiwgYW5hbHl6ZXJfY29uZmlnLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkNob29zZSBhbmFseXplciBvcHRpb25zIHRvIGVuYWJsZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhbmFseXplci1jb25zdHJhaW50cz0iLCBhbmFseXplcl9jb25zdHJhaW50c19FUSwgSm9pbmVkLCBJTlZBTElELCBhbmFseXplcl9jb25zdHJhaW50cywgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhbmFseXplci1jb25zdHJhaW50cyIsIGFuYWx5emVyX2NvbnN0cmFpbnRzLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlNvdXJjZSBDb2RlIEFuYWx5c2lzIC0gU3ltYm9saWMgQ29uc3RyYWludCBFbmdpbmVzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImFuYWx5emVyLWRpc2FibGUtYWxsLWNoZWNrcyIsIGFuYWx5emVyX2Rpc2FibGVfYWxsX2NoZWNrcywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgYWxsIHN0YXRpYyBhbmFseXplciBjaGVja3MiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiYW5hbHl6ZXItZGlzYWJsZS1jaGVja2VyPSIsIGFuYWx5emVyX2Rpc2FibGVfY2hlY2tlcl9FUSwgSm9pbmVkLCBJTlZBTElELCBhbmFseXplcl9kaXNhYmxlX2NoZWNrZXIsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiYW5hbHl6ZXItZGlzYWJsZS1jaGVja2VyIiwgYW5hbHl6ZXJfZGlzYWJsZV9jaGVja2VyLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkNob29zZSBhbmFseXplciBjaGVja2VycyB0byBkaXNhYmxlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImFuYWx5emVyLWRpc2FibGUtcmV0cnktZXhoYXVzdGVkIiwgYW5hbHl6ZXJfZGlzYWJsZV9yZXRyeV9leGhhdXN0ZWQsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEbyBub3QgcmUtYW5hbHl6ZSBwYXRocyBsZWFkaW5nIHRvIGV4aGF1c3RlZCBub2RlcyB3aXRoIGEgZGlmZmVyZW50IHN0cmF0ZWd5IChtYXkgZGVjcmVhc2UgY29kZSBjb3ZlcmFnZSkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiYW5hbHl6ZXItZGlzcGxheS1wcm9ncmVzcyIsIGFuYWx5emVyX2Rpc3BsYXlfcHJvZ3Jlc3MsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJFbWl0IHZlcmJvc2Ugb3V0cHV0IGFib3V0IHRoZSBhbmFseXplcidzIHByb2dyZXNzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImFuYWx5emVyLWVhZ2VybHktYXNzdW1lIiwgYW5hbHl6ZXJfZWFnZXJseV9hc3N1bWUsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJFYWdlcmx5IGFzc3VtZSB0aGUgdHJ1dGgvZmFsc2VuZXNzIG9mIHNvbWUgc3ltYm9saWMgY29uc3RyYWludHMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiYW5hbHl6ZXItaW5saW5lLW1heC1zdGFjay1kZXB0aD0iLCBhbmFseXplcl9pbmxpbmVfbWF4X3N0YWNrX2RlcHRoX0VRLCBKb2luZWQsIElOVkFMSUQsIGFuYWx5emVyX2lubGluZV9tYXhfc3RhY2tfZGVwdGgsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiYW5hbHl6ZXItaW5saW5lLW1heC1zdGFjay1kZXB0aCIsIGFuYWx5emVyX2lubGluZV9tYXhfc3RhY2tfZGVwdGgsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiQm91bmQgb24gc3RhY2sgZGVwdGggd2hpbGUgaW5saW5pbmcgKDQgYnkgZGVmYXVsdCkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiYW5hbHl6ZXItaW5saW5pbmctbW9kZT0iLCBhbmFseXplcl9pbmxpbmluZ19tb2RlX0VRLCBKb2luZWQsIElOVkFMSUQsIGFuYWx5emVyX2lubGluaW5nX21vZGUsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiYW5hbHl6ZXItaW5saW5pbmctbW9kZSIsIGFuYWx5emVyX2lubGluaW5nX21vZGUsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiU3BlY2lmeSB0aGUgZnVuY3Rpb24gc2VsZWN0aW9uIGhldXJpc3RpYyB1c2VkIGR1cmluZyBpbmxpbmluZyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhbmFseXplci1saXN0LWVuYWJsZWQtY2hlY2tlcnMiLCBhbmFseXplcl9saXN0X2VuYWJsZWRfY2hlY2tlcnMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEaXNwbGF5IHRoZSBsaXN0IG9mIGVuYWJsZWQgYW5hbHl6ZXIgY2hlY2tlcnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiYW5hbHl6ZXItbWF4LWxvb3AiLCBhbmFseXplcl9tYXhfbG9vcCwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGFuYWx5emVyIHdpbGwgZ28gdGhyb3VnaCBhIGxvb3AiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiYW5hbHl6ZXItbm8tZGVmYXVsdC1jaGVja3MiLCBfYW5hbHl6ZXJfbm9fZGVmYXVsdF9jaGVja3MsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImFuYWx5emVyLW9wdC1hbmFseXplLWhlYWRlcnMiLCBhbmFseXplcl9vcHRfYW5hbHl6ZV9oZWFkZXJzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRm9yY2UgdGhlIHN0YXRpYyBhbmFseXplciB0byBhbmFseXplIGZ1bmN0aW9ucyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhbmFseXplci1vcHQtYW5hbHl6ZS1uZXN0ZWQtYmxvY2tzIiwgYW5hbHl6ZXJfb3B0X2FuYWx5emVfbmVzdGVkX2Jsb2NrcywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkFuYWx5emUgdGhlIGRlZmluaXRpb25zIG9mIGJsb2NrcyBpbiBhZGRpdGlvbiB0byBmdW5jdGlvbnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiYW5hbHl6ZXItb3V0cHV0PSIsIGFuYWx5emVyX291dHB1dF9FUSwgSm9pbmVkLCBJTlZBTElELCBhbmFseXplcl9vdXRwdXQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiYW5hbHl6ZXItb3V0cHV0IiwgX2FuYWx5emVyX291dHB1dCwgSm9pbmVkT3JTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJTdGF0aWMgYW5hbHl6ZXIgcmVwb3J0IG91dHB1dCBmb3JtYXQgKGh0bWx8cGxpc3R8cGxpc3QtbXVsdGktZmlsZXxwbGlzdC1odG1sfHRleHQpLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhbmFseXplci1vdXRwdXQiLCBhbmFseXplcl9vdXRwdXQsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiU291cmNlIENvZGUgQW5hbHlzaXMgLSBPdXRwdXQgT3B0aW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhbmFseXplci1wdXJnZT0iLCBhbmFseXplcl9wdXJnZV9FUSwgSm9pbmVkLCBJTlZBTElELCBhbmFseXplcl9wdXJnZSwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhbmFseXplci1wdXJnZSIsIGFuYWx5emVyX3B1cmdlLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlNvdXJjZSBDb2RlIEFuYWx5c2lzIC0gRGVhZCBTeW1ib2wgUmVtb3ZhbCBGcmVxdWVuY3kiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiYW5hbHl6ZXItc3RhdHMiLCBhbmFseXplcl9zdGF0cywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlByaW50IGludGVybmFsIGFuYWx5emVyIHN0YXRpc3RpY3MuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImFuYWx5emVyLXN0b3JlPSIsIGFuYWx5emVyX3N0b3JlX0VRLCBKb2luZWQsIElOVkFMSUQsIGFuYWx5emVyX3N0b3JlLCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImFuYWx5emVyLXN0b3JlIiwgYW5hbHl6ZXJfc3RvcmUsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiU291cmNlIENvZGUgQW5hbHlzaXMgLSBBYnN0cmFjdCBNZW1vcnkgU3RvcmUgTW9kZWxzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImFuYWx5emVyLXZpei1lZ3JhcGgtZ3JhcGh2aXoiLCBhbmFseXplcl92aXpfZWdyYXBoX2dyYXBodml6LCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRGlzcGxheSBleHBsb2RlZCBncmFwaCB1c2luZyBHcmFwaFZpeiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhbmFseXplci12aXotZWdyYXBoLXViaWdyYXBoIiwgYW5hbHl6ZXJfdml6X2VncmFwaF91YmlncmFwaCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkRpc3BsYXkgZXhwbG9kZWQgZ3JhcGggdXNpbmcgVWJpZ3JhcGgiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiYW5hbHl6ZSIsIF9hbmFseXplLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJSdW4gdGhlIHN0YXRpYyBhbmFseXplciIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhbmFseXplIiwgYW5hbHl6ZSwgRmxhZywgQWN0aW9uX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiUnVuIHN0YXRpYyBhbmFseXNpcyBlbmdpbmUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF80LCAiYW5zaSIsIGFuc2ksIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhcmFuZ2Vfc2VjdGlvbnMiLCBhcmFuZ2Vfc2VjdGlvbnMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJFbWl0IERXQVJGIC5kZWJ1Z19hcmFuZ2Ugc2VjdGlvbnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiYXJjaDoiLCBfU0xBU0hfYXJjaCwgSm9pbmVkLCBjbF9jb21waWxlX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiU2V0IGFyY2hpdGVjdHVyZSBmb3IgY29kZSBnZW5lcmF0aW9uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImFyY2hfZXJyb3JzX2ZhdGFsIiwgYXJjaF9fZXJyb3JzX19mYXRhbCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImFyY2hfb25seSIsIGFyY2hfX29ubHksIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiYXJjaCIsIGFyY2gsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhcmNtdC1jaGVjayIsIGFyY210X2NoZWNrLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiQ2hlY2sgZm9yIEFSQyBtaWdyYXRpb24gaXNzdWVzIHRoYXQgbmVlZCBtYW51YWwgaGFuZGxpbmciLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiYXJjbXQtbWlncmF0ZS1lbWl0LWVycm9ycyIsIGFyY210X21pZ3JhdGVfZW1pdF9hcmNfZXJyb3JzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVtaXQgQVJDIGVycm9ycyBldmVuIGlmIHRoZSBtaWdyYXRvciBjYW4gZml4IHRoZW0iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiYXJjbXQtbWlncmF0ZS1yZXBvcnQtb3V0cHV0IiwgYXJjbXRfbWlncmF0ZV9yZXBvcnRfb3V0cHV0LCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJPdXRwdXQgcGF0aCBmb3IgdGhlIHBsaXN0IHJlcG9ydCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhcmNtdC1taWdyYXRlIiwgYXJjbXRfbWlncmF0ZSwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkFwcGx5IG1vZGlmaWNhdGlvbnMgYW5kIHByb2R1Y2VzIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGNvbmZvcm0gdG8gQVJDIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImFyY210LW1vZGlmeSIsIGFyY210X21vZGlmeSwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkFwcGx5IG1vZGlmaWNhdGlvbnMgdG8gZmlsZXMgdG8gY29uZm9ybSB0byBBUkMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiYXNzZW1ibGUiLCBfYXNzZW1ibGUsIEZsYWcsIElOVkFMSUQsIFMsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJhc3NlcnQ9IiwgX2Fzc2VydF9FUSwgSm9pbmVkLCBJTlZBTElELCBBLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiYXNzZXJ0IiwgX2Fzc2VydCwgU2VwYXJhdGUsIElOVkFMSUQsIEEsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhc3QtZHVtcC1hbGwiLCBhc3RfZHVtcF9hbGwsIEZsYWcsIEFjdGlvbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkJ1aWxkIEFTVHMgYW5kIHRoZW4gZGVidWcgZHVtcCB0aGVtLCBmb3JjaW5nIGRlc2VyaWFsaXphdGlvbiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhc3QtZHVtcC1maWx0ZXIiLCBhc3RfZHVtcF9maWx0ZXIsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiVXNlIHdpdGggLWFzdC1kdW1wIG9yIC1hc3QtcHJpbnQgdG8gZHVtcC9wcmludCBvbmx5IEFTVCBkZWNsYXJhdGlvbiBub2RlcyBoYXZpbmcgYSBjZXJ0YWluIHN1YnN0cmluZyBpbiBhIHF1YWxpZmllZCBuYW1lLiBVc2UgLWFzdC1saXN0IHRvIGxpc3QgYWxsIGZpbHRlcmFibGUgZGVjbGFyYXRpb24gbm9kZSBuYW1lcy4iLCAiPGR1bXBfZmlsdGVyPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhc3QtZHVtcC1sb29rdXBzIiwgYXN0X2R1bXBfbG9va3VwcywgRmxhZywgQWN0aW9uX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiQnVpbGQgQVNUcyBhbmQgdGhlbiBkZWJ1ZyBkdW1wIHRoZWlyIG5hbWUgbG9va3VwIHRhYmxlcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhc3QtZHVtcCIsIGFzdF9kdW1wLCBGbGFnLCBBY3Rpb25fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJCdWlsZCBBU1RzIGFuZCB0aGVuIGRlYnVnIGR1bXAgdGhlbSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhc3QtbGlzdCIsIGFzdF9saXN0LCBGbGFnLCBBY3Rpb25fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJCdWlsZCBBU1RzIGFuZCBwcmludCB0aGUgbGlzdCBvZiBkZWNsYXJhdGlvbiBub2RlIHF1YWxpZmllZCBuYW1lcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJhc3QtbWVyZ2UiLCBhc3RfbWVyZ2UsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiTWVyZ2UgdGhlIGdpdmVuIEFTVCBmaWxlIGludG8gdGhlIHRyYW5zbGF0aW9uIHVuaXQgYmVpbmcgY29tcGlsZWQuIiwgIjxhc3QgZmlsZT4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiYXN0LXByaW50IiwgYXN0X3ByaW50LCBGbGFnLCBBY3Rpb25fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJCdWlsZCBBU1RzIGFuZCB0aGVuIHByZXR0eS1wcmludCB0aGVtIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImFzdC12aWV3IiwgYXN0X3ZpZXcsIEZsYWcsIEFjdGlvbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkJ1aWxkIEFTVHMgYW5kIHZpZXcgdGhlbSB3aXRoIEdyYXBoVml6IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImF1dG9jb21wbGV0ZT0iLCBhdXRvY29tcGxldGUsIEpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImF1eC10cmlwbGUiLCBhdXhfdHJpcGxlLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkF1eGlsaWFyeSB0YXJnZXQgdHJpcGxlLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJBIiwgQSwgSm9pbmVkT3JTZXBhcmF0ZSwgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIFJlbmRlckpvaW5lZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImEiLCBhLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJiYWNrZW5kLW9wdGlvbiIsIGJhY2tlbmRfb3B0aW9uLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIGZvcndhcmQgdG8gTExWTSBiYWNrZW5kIChkdXJpbmcgY29kZSBnZW4pIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgImJpZ29iaiIsIF9TTEFTSF9iaWdvYmosIEZsYWcsIGNsX2lnbm9yZWRfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiYmluZF9hdF9sb2FkIiwgYmluZF9fYXRfX2xvYWQsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJib290Y2xhc3NwYXRoPSIsIF9ib290Y2xhc3NwYXRoX0VRLCBKb2luZWQsIElOVkFMSUQsIGZib290Y2xhc3NwYXRoX0VRLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiYm9vdGNsYXNzcGF0aCIsIF9ib290Y2xhc3NwYXRoLCBTZXBhcmF0ZSwgSU5WQUxJRCwgZmJvb3RjbGFzc3BhdGhfRVEsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJCcmVwcm8tIiwgX1NMQVNIX0JyZXByb18sIEZsYWcsIGNsX0dyb3VwLCBtaW5jcmVtZW50YWxfbGlua2VyX2NvbXBhdGlibGUsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkVtaXQgYW4gb2JqZWN0IGZpbGUgd2hpY2ggY2Fubm90IGJlIHJlcHJvZHVjZWQgb3ZlciB0aW1lIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkJyZXBybyIsIF9TTEFTSF9CcmVwcm8sIEZsYWcsIGNsX0dyb3VwLCBtbm9faW5jcmVtZW50YWxfbGlua2VyX2NvbXBhdGlibGUsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkVtaXQgYW4gb2JqZWN0IGZpbGUgd2hpY2ggY2FuIGJlIHJlcHJvZHVjZWQgb3ZlciB0aW1lIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkJ0KyIsIF9TTEFTSF9CdF9wbHVzLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkJ0IiwgX1NMQVNIX0J0LCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImJ1bmRsZV9sb2FkZXIiLCBidW5kbGVfX2xvYWRlciwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJidW5kbGUiLCBidW5kbGUsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJCIiwgQiwgSm9pbmVkT3JTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiQWRkIDxkaXI+IHRvIHNlYXJjaCBwYXRoIGZvciBiaW5hcmllcyBhbmQgb2JqZWN0IGZpbGVzIHVzZWQgaW1wbGljaXRseSIsICI8ZGlyPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJiIiwgYiwgSm9pbmVkT3JTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgVW5zdXBwb3J0ZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjLWlzeXN0ZW0iLCBjX2lzeXN0ZW0sIEpvaW5lZE9yU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJBZGQgZGlyZWN0b3J5IHRvIHRoZSBDIFNZU1RFTSBpbmNsdWRlIHNlYXJjaCBwYXRoIiwgIjxkaXJlY3Rvcnk+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImNjMWFzIiwgY2MxYXMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiY2MxIiwgY2MxLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImNjYy1hcmNtdC1jaGVjayIsIGNjY19hcmNtdF9jaGVjaywgRmxhZywgaW50ZXJuYWxfZHJpdmVyX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBIZWxwSGlkZGVuLCAwLAorICAgICAgICJDaGVjayBmb3IgQVJDIG1pZ3JhdGlvbiBpc3N1ZXMgdGhhdCBuZWVkIG1hbnVhbCBoYW5kbGluZyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjY2MtYXJjbXQtbWlncmF0ZSIsIGNjY19hcmNtdF9taWdyYXRlLCBTZXBhcmF0ZSwgaW50ZXJuYWxfZHJpdmVyX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBIZWxwSGlkZGVuLCAwLAorICAgICAgICJBcHBseSBtb2RpZmljYXRpb25zIGFuZCBwcm9kdWNlcyB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBjb25mb3JtIHRvIEFSQyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjY2MtYXJjbXQtbW9kaWZ5IiwgY2NjX2FyY210X21vZGlmeSwgRmxhZywgaW50ZXJuYWxfZHJpdmVyX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBIZWxwSGlkZGVuLCAwLAorICAgICAgICJBcHBseSBtb2RpZmljYXRpb25zIHRvIGZpbGVzIHRvIGNvbmZvcm0gdG8gQVJDIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImNjYy1nY2MtbmFtZSIsIGNjY19nY2NfbmFtZSwgU2VwYXJhdGUsIGludGVybmFsX2RyaXZlcl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgSGVscEhpZGRlbiwgMCwKKyAgICAgICAiTmFtZSBmb3IgbmF0aXZlIEdDQyBjb21waWxlciIsICI8Z2NjLXBhdGg+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImNjYy1pbnN0YWxsLWRpciIsIGNjY19pbnN0YWxsX2RpciwgU2VwYXJhdGUsIGludGVybmFsX2RlYnVnX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBIZWxwSGlkZGVuIHwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiU2ltdWxhdGUgaW5zdGFsbGF0aW9uIGluIHRoZSBnaXZlbiBkaXJlY3RvcnkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiY2NjLW9iamNtdC1taWdyYXRlIiwgY2NjX29iamNtdF9taWdyYXRlLCBTZXBhcmF0ZSwgaW50ZXJuYWxfZHJpdmVyX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBIZWxwSGlkZGVuLCAwLAorICAgICAgICJBcHBseSBtb2RpZmljYXRpb25zIGFuZCBwcm9kdWNlcyB0ZW1wb3JhcnkgZmlsZXMgdG8gbWlncmF0ZSB0byBtb2Rlcm4gT2JqQyBzeW50YXgiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiY2NjLXBjaC1pcy1wY2giLCBjY2NfcGNoX2lzX3BjaCwgRmxhZywgaW50ZXJuYWxfZHJpdmVyX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBIZWxwSGlkZGVuLCAwLAorICAgICAgICJVc2UgbGF6eSBQQ0ggZm9yIHByZWNvbXBpbGVkIGhlYWRlcnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiY2NjLXBjaC1pcy1wdGgiLCBjY2NfcGNoX2lzX3B0aCwgRmxhZywgaW50ZXJuYWxfZHJpdmVyX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBIZWxwSGlkZGVuLCAwLAorICAgICAgICJVc2UgcHJldG9rZW5pemVkIGhlYWRlcnMgZm9yIHByZWNvbXBpbGVkIGhlYWRlcnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiY2NjLXByaW50LWJpbmRpbmdzIiwgY2NjX3ByaW50X2JpbmRpbmdzLCBGbGFnLCBpbnRlcm5hbF9kZWJ1Z19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgSGVscEhpZGRlbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIlNob3cgYmluZGluZ3Mgb2YgdG9vbHMgdG8gYWN0aW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjY2MtcHJpbnQtcGhhc2VzIiwgY2NjX3ByaW50X3BoYXNlcywgRmxhZywgaW50ZXJuYWxfZGVidWdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IEhlbHBIaWRkZW4gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJEdW1wIGxpc3Qgb2YgYWN0aW9ucyB0byBwZXJmb3JtIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImNjYy0iLCBjY2NfLCBKb2luZWQsIGludGVybmFsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBVbnN1cHBvcnRlZCB8IEhlbHBIaWRkZW4sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJDQyIsIENDLCBGbGFnLCBQcmVwcm9jZXNzb3JfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiSW5jbHVkZSBjb21tZW50cyBmcm9tIHdpdGhpbiBtYWNyb3MgaW4gcHJlcHJvY2Vzc2VkIG91dHB1dCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjZmctYWRkLWltcGxpY2l0LWR0b3JzIiwgYW5hbHlzaXNfQ0ZHQWRkSW1wbGljaXREdG9ycywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkFkZCBDKysgaW1wbGljaXQgZGVzdHJ1Y3RvcnMgdG8gQ0ZHcyBmb3IgYWxsIGFuYWx5c2VzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImNmZ3VhcmQiLCBjZmd1YXJkLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVtaXQgdGFibGVzIHJlcXVpcmVkIGZvciBXaW5kb3dzIENvbnRyb2wgRmxvdyBHdWFyZC4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiY2d0aHJlYWRzIiwgX1NMQVNIX2NndGhyZWFkcywgSm9pbmVkLCBjbF9pZ25vcmVkX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IEhlbHBIaWRkZW4sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjaGFpbi1pbmNsdWRlIiwgY2hhaW5faW5jbHVkZSwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJJbmNsdWRlIGFuZCBjaGFpbiBhIGhlYWRlciBmaWxlIGFmdGVyIHR1cm5pbmcgaXQgaW50byBQQ0giLCAiPGZpbGU+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImNsLWRlbm9ybXMtYXJlLXplcm8iLCBjbF9kZW5vcm1zX2FyZV96ZXJvLCBGbGFnLCBvcGVuY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiT3BlbkNMIG9ubHkuIEFsbG93IGRlbm9ybWFscyB0byBiZSBmbHVzaGVkIHRvIHplcm8uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImNsLWV4dD0iLCBjbF9leHRfRVEsIENvbW1hSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiT3BlbkNMIG9ubHkuIEVuYWJsZSBvciBkaXNhYmxlIE9wZW5DTCBleHRlbnNpb25zLiBUaGUgYXJndW1lbnQgaXMgYSBjb21tYS1zZXBhcmF0ZWQgc2VxdWVuY2Ugb2Ygb25lIG9yIG1vcmUgZXh0ZW5zaW9uIG5hbWVzLCBlYWNoIHByZWZpeGVkIGJ5ICcrJyBvciAnLScuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImNsLWZhc3QtcmVsYXhlZC1tYXRoIiwgY2xfZmFzdF9yZWxheGVkX21hdGgsIEZsYWcsIG9wZW5jbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJPcGVuQ0wgb25seS4gU2V0cyAtY2wtZmluaXRlLW1hdGgtb25seSBhbmQgLWNsLXVuc2FmZS1tYXRoLW9wdGltaXphdGlvbnMsIGFuZCBkZWZpbmVzIF9fRkFTVF9SRUxBWEVEX01BVEhfXy4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiY2wtZmluaXRlLW1hdGgtb25seSIsIGNsX2Zpbml0ZV9tYXRoX29ubHksIEZsYWcsIG9wZW5jbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJPcGVuQ0wgb25seS4gQWxsb3cgZmxvYXRpbmctcG9pbnQgb3B0aW1pemF0aW9ucyB0aGF0IGFzc3VtZSBhcmd1bWVudHMgYW5kIHJlc3VsdHMgYXJlIG5vdCBOYU5zIG9yICstSW5mLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjbC1mcDMyLWNvcnJlY3RseS1yb3VuZGVkLWRpdmlkZS1zcXJ0IiwgY2xfZnAzMl9jb3JyZWN0bHlfcm91bmRlZF9kaXZpZGVfc3FydCwgRmxhZywgb3BlbmNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIk9wZW5DTCBvbmx5LiBTcGVjaWZ5IHRoYXQgc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBkaXZpZGUgYW5kIHNxcnQgdXNlZCBpbiB0aGUgcHJvZ3JhbSBzb3VyY2UgYXJlIGNvcnJlY3RseSByb3VuZGVkLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjbC1rZXJuZWwtYXJnLWluZm8iLCBjbF9rZXJuZWxfYXJnX2luZm8sIEZsYWcsIG9wZW5jbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJPcGVuQ0wgb25seS4gR2VuZXJhdGUga2VybmVsIGFyZ3VtZW50IG1ldGFkYXRhLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjbC1tYWQtZW5hYmxlIiwgY2xfbWFkX2VuYWJsZSwgRmxhZywgb3BlbmNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIk9wZW5DTCBvbmx5LiBBbGxvdyB1c2Ugb2YgbGVzcyBwcmVjaXNlIE1BRCBjb21wdXRhdGlvbnMgaW4gdGhlIGdlbmVyYXRlZCBiaW5hcnkuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImNsLW5vLXNpZ25lZC16ZXJvcyIsIGNsX25vX3NpZ25lZF96ZXJvcywgRmxhZywgb3BlbmNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIk9wZW5DTCBvbmx5LiBBbGxvdyB1c2Ugb2YgbGVzcyBwcmVjaXNlIG5vIHNpZ25lZCB6ZXJvcyBjb21wdXRhdGlvbnMgaW4gdGhlIGdlbmVyYXRlZCBiaW5hcnkuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImNsLW9wdC1kaXNhYmxlIiwgY2xfb3B0X2Rpc2FibGUsIEZsYWcsIG9wZW5jbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJPcGVuQ0wgb25seS4gVGhpcyBvcHRpb24gZGlzYWJsZXMgYWxsIG9wdGltaXphdGlvbnMuIEJ5IGRlZmF1bHQgb3B0aW1pemF0aW9ucyBhcmUgZW5hYmxlZC4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiY2wtc2luZ2xlLXByZWNpc2lvbi1jb25zdGFudCIsIGNsX3NpbmdsZV9wcmVjaXNpb25fY29uc3RhbnQsIEZsYWcsIG9wZW5jbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJPcGVuQ0wgb25seS4gVHJlYXQgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBjb25zdGFudCBhcyBzaW5nbGUgcHJlY2lzaW9uIGNvbnN0YW50LiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjbC1zdGQ9IiwgY2xfc3RkX0VRLCBKb2luZWQsIG9wZW5jbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJPcGVuQ0wgbGFuZ3VhZ2Ugc3RhbmRhcmQgdG8gY29tcGlsZSBmb3IuIiwgbnVsbHB0ciwgImNsLENMLGNsMS4xLENMMS4xLGNsMS4yLENMMS4yLGNsMi4wLENMMi4wIikKK09QVElPTihwcmVmaXhfMSwgImNsLXN0cmljdC1hbGlhc2luZyIsIGNsX3N0cmljdF9hbGlhc2luZywgRmxhZywgb3BlbmNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIk9wZW5DTCBvbmx5LiBUaGlzIG9wdGlvbiBpcyBhZGRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE9wZW5DTCAxLjAuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImNsLXVuaWZvcm0td29yay1ncm91cC1zaXplIiwgY2xfdW5pZm9ybV93b3JrX2dyb3VwX3NpemUsIEZsYWcsIG9wZW5jbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJPcGVuQ0wgb25seS4gRGVmaW5lcyB0aGF0IHRoZSBnbG9iYWwgd29yay1zaXplIGJlIGEgbXVsdGlwbGUgb2YgdGhlIHdvcmstZ3JvdXAgc2l6ZSBzcGVjaWZpZWQgdG8gY2xFbnF1ZXVlTkRSYW5nZUtlcm5lbCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjbC11bnNhZmUtbWF0aC1vcHRpbWl6YXRpb25zIiwgY2xfdW5zYWZlX21hdGhfb3B0aW1pemF0aW9ucywgRmxhZywgb3BlbmNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIk9wZW5DTCBvbmx5LiBBbGxvdyB1bnNhZmUgZmxvYXRpbmctcG9pbnQgb3B0aW1pemF0aW9ucy4gIEFsc28gaW1wbGllcyAtY2wtbm8tc2lnbmVkLXplcm9zIGFuZCAtY2wtbWFkLWVuYWJsZS4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiQ0xBU1NQQVRIPSIsIF9DTEFTU1BBVEhfRVEsIEpvaW5lZCwgSU5WQUxJRCwgZmNsYXNzcGF0aF9FUSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImNsYXNzcGF0aD0iLCBfY2xhc3NwYXRoX0VRLCBKb2luZWQsIElOVkFMSUQsIGZjbGFzc3BhdGhfRVEsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJDTEFTU1BBVEgiLCBfQ0xBU1NQQVRILCBTZXBhcmF0ZSwgSU5WQUxJRCwgZmNsYXNzcGF0aF9FUSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImNsYXNzcGF0aCIsIF9jbGFzc3BhdGgsIFNlcGFyYXRlLCBJTlZBTElELCBmY2xhc3NwYXRoX0VRLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiY2xpZW50X25hbWUiLCBjbGllbnRfX25hbWUsIEpvaW5lZE9yU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJjbHIiLCBfU0xBU0hfY2xyLCBKb2luZWQsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiY29kZS1jb21wbGV0aW9uLWF0PSIsIGNvZGVfY29tcGxldGlvbl9hdF9FUSwgSm9pbmVkLCBJTlZBTElELCBjb2RlX2NvbXBsZXRpb25fYXQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiY29kZS1jb21wbGV0aW9uLWF0IiwgY29kZV9jb21wbGV0aW9uX2F0LCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkR1bXAgY29kZS1jb21wbGV0aW9uIGluZm9ybWF0aW9uIGF0IGEgbG9jYXRpb24iLCAiPGZpbGU+OjxsaW5lPjo8Y29sdW1uPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjb2RlLWNvbXBsZXRpb24tYnJpZWYtY29tbWVudHMiLCBjb2RlX2NvbXBsZXRpb25fYnJpZWZfY29tbWVudHMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJJbmNsdWRlIGJyaWVmIGRvY3VtZW50YXRpb24gY29tbWVudHMgaW4gY29kZS1jb21wbGV0aW9uIHJlc3VsdHMuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImNvZGUtY29tcGxldGlvbi1tYWNyb3MiLCBjb2RlX2NvbXBsZXRpb25fbWFjcm9zLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiSW5jbHVkZSBtYWNyb3MgaW4gY29kZS1jb21wbGV0aW9uIHJlc3VsdHMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiY29kZS1jb21wbGV0aW9uLXBhdHRlcm5zIiwgY29kZV9jb21wbGV0aW9uX3BhdHRlcm5zLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiSW5jbHVkZSBjb2RlIHBhdHRlcm5zIGluIGNvZGUtY29tcGxldGlvbiByZXN1bHRzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfNCwgImNvbWJpbmUiLCBjb21iaW5lLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBVbnN1cHBvcnRlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImNvbW1lbnRzLWluLW1hY3JvcyIsIF9jb21tZW50c19pbl9tYWNyb3MsIEZsYWcsIElOVkFMSUQsIENDLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiY29tbWVudHMiLCBfY29tbWVudHMsIEZsYWcsIElOVkFMSUQsIEMsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjb21wYXRpYmlsaXR5X3ZlcnNpb24iLCBjb21wYXRpYmlsaXR5X192ZXJzaW9uLCBKb2luZWRPclNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiY29tcGlsZSIsIF9jb21waWxlLCBGbGFnLCBJTlZBTElELCBjLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiY29tcHJlc3MtZGVidWctc2VjdGlvbnM9IiwgY29tcHJlc3NfZGVidWdfc2VjdGlvbnNfRVEsIEpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ0MxQXNPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRFdBUkYgZGVidWcgc2VjdGlvbnMgY29tcHJlc3Npb24gdHlwZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzQsICJjb21wcmVzcy1kZWJ1Zy1zZWN0aW9ucyIsIGNvbXByZXNzX2RlYnVnX3NlY3Rpb25zLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDQzFBc09wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEV0FSRiBkZWJ1ZyBzZWN0aW9ucyBjb21wcmVzc2lvbiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJjb25maWctc3lzdGVtLWRpcj0iLCBjb25maWdfc3lzdGVtX2Rpcl9FUSwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBIZWxwSGlkZGVuLCAwLAorICAgICAgICJTeXN0ZW0gZGlyZWN0b3J5IGZvciBjb25maWd1cmF0aW9uIGZpbGVzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImNvbmZpZy11c2VyLWRpcj0iLCBjb25maWdfdXNlcl9kaXJfRVEsIEpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgSGVscEhpZGRlbiwgMCwKKyAgICAgICAiVXNlciBkaXJlY3RvcnkgZm9yIGNvbmZpZ3VyYXRpb24gZmlsZXMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiY29uZmlnIiwgY29uZmlnLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJTcGVjaWZpZXMgY29uZmlndXJhdGlvbiBmaWxlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImNvbnN0YW50LWNmc3RyaW5ncyIsIF9jb25zdGFudF9jZnN0cmluZ3MsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjb3ZlcmFnZS1jZmctY2hlY2tzdW0iLCBjb3ZlcmFnZV9jZmdfY2hlY2tzdW0sIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJFbWl0IENGRyBjaGVja3N1bSBmb3IgZnVuY3Rpb25zIGluIC5nY25vIGZpbGVzLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjb3ZlcmFnZS1kYXRhLWZpbGU9IiwgY292ZXJhZ2VfZGF0YV9maWxlX0VRLCBKb2luZWQsIElOVkFMSUQsIGNvdmVyYWdlX2RhdGFfZmlsZSwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjb3ZlcmFnZS1kYXRhLWZpbGUiLCBjb3ZlcmFnZV9kYXRhX2ZpbGUsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRW1pdCBjb3ZlcmFnZSBkYXRhIHRvIHRoaXMgZmlsZW5hbWUuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImNvdmVyYWdlLWV4aXQtYmxvY2stYmVmb3JlLWJvZHkiLCBjb3ZlcmFnZV9leGl0X2Jsb2NrX2JlZm9yZV9ib2R5LCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRW1pdCB0aGUgZXhpdCBibG9jayBiZWZvcmUgdGhlIGJvZHkgYmxvY2tzIGluIC5nY25vIGZpbGVzLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjb3ZlcmFnZS1uby1mdW5jdGlvbi1uYW1lcy1pbi1kYXRhIiwgY292ZXJhZ2Vfbm9fZnVuY3Rpb25fbmFtZXNfaW5fZGF0YSwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkVtaXQgZnVuY3Rpb24gbmFtZXMgaW4gLmdjZGEgZmlsZXMuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImNvdmVyYWdlLW5vdGVzLWZpbGU9IiwgY292ZXJhZ2Vfbm90ZXNfZmlsZV9FUSwgSm9pbmVkLCBJTlZBTElELCBjb3ZlcmFnZV9ub3Rlc19maWxlLCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImNvdmVyYWdlLW5vdGVzLWZpbGUiLCBjb3ZlcmFnZV9ub3Rlc19maWxlLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkVtaXQgY292ZXJhZ2Ugbm90ZXMgdG8gdGhpcyBmaWxlbmFtZS4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiY292ZXJhZ2UtdmVyc2lvbj0iLCBjb3ZlcmFnZV92ZXJzaW9uX0VRLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJGb3VyLWJ5dGUgdmVyc2lvbiBzdHJpbmcgZm9yIGdjb3YgZmlsZXMuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfNCwgImNvdmVyYWdlIiwgY292ZXJhZ2UsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjcHAtcHJlY29tcCIsIGNwcF9wcmVjb21wLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjcHAiLCBjcHAsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiY3VkYS1jb21waWxlLWhvc3QtZGV2aWNlIiwgY3VkYV9jb21waWxlX2hvc3RfZGV2aWNlLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJDb21waWxlIENVREEgY29kZSBmb3IgYm90aCBob3N0IGFuZCBkZXZpY2UgKGRlZmF1bHQpLiAgSGFzIG5vIGVmZmVjdCBvbiBub24tQ1VEQSBjb21waWxhdGlvbnMuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImN1ZGEtZGV2aWNlLW9ubHkiLCBjdWRhX2RldmljZV9vbmx5LCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJDb21waWxlIENVREEgY29kZSBmb3IgZGV2aWNlIG9ubHkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiY3VkYS1ncHUtYXJjaD0iLCBjdWRhX2dwdV9hcmNoX0VRLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiQ1VEQSBHUFUgYXJjaGl0ZWN0dXJlIChlLmcuIHNtXzM1KS4gIE1heSBiZSBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImN1ZGEtaG9zdC1vbmx5IiwgY3VkYV9ob3N0X29ubHksIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkNvbXBpbGUgQ1VEQSBjb2RlIGZvciBob3N0IG9ubHkuICBIYXMgbm8gZWZmZWN0IG9uIG5vbi1DVURBIGNvbXBpbGF0aW9ucy4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiY3VkYS1ub29wdC1kZXZpY2UtZGVidWciLCBjdWRhX25vb3B0X2RldmljZV9kZWJ1ZywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRW5hYmxlIGRldmljZS1zaWRlIGRlYnVnIGluZm8gZ2VuZXJhdGlvbi4gRGlzYWJsZXMgcHR4YXMgb3B0aW1pemF0aW9ucy4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiY3VkYS1wYXRoLWlnbm9yZS1lbnYiLCBjdWRhX3BhdGhfaWdub3JlX2VudiwgRmxhZywgaV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiSWdub3JlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBkZXRlY3QgQ1VEQSBpbnN0YWxsYXRpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiY3VkYS1wYXRoPSIsIGN1ZGFfcGF0aF9FUSwgSm9pbmVkLCBpX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJDVURBIGluc3RhbGxhdGlvbiBwYXRoIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImN1cnJlbnRfdmVyc2lvbiIsIGN1cnJlbnRfX3ZlcnNpb24sIEpvaW5lZE9yU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjeHgtaXN5c3RlbSIsIGN4eF9pc3lzdGVtLCBKb2luZWRPclNlcGFyYXRlLCBjbGFuZ19pX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkFkZCBkaXJlY3RvcnkgdG8gdGhlIEMrKyBTWVNURU0gaW5jbHVkZSBzZWFyY2ggcGF0aCIsICI8ZGlyZWN0b3J5PiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJDIiwgQywgRmxhZywgUHJlcHJvY2Vzc29yX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkluY2x1ZGUgY29tbWVudHMgaW4gcHJlcHJvY2Vzc2VkIG91dHB1dCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJDIiwgX1NMQVNIX0MsIEZsYWcsIGNsX0dyb3VwLCBDLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJEb24ndCBkaXNjYXJkIGNvbW1lbnRzIHdoZW4gcHJlcHJvY2Vzc2luZyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJjIiwgYywgRmxhZywgQWN0aW9uX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsCisgICAgICAgIk9ubHkgcnVuIHByZXByb2Nlc3MsIGNvbXBpbGUsIGFuZCBhc3NlbWJsZSBzdGVwcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJjIiwgX1NMQVNIX2MsIEZsYWcsIGNsX0dyb3VwLCBjLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJDb21waWxlIG9ubHkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiZDFQUCIsIF9TTEFTSF9kMVBQLCBGbGFnLCBjbF9Hcm91cCwgZEQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIlJldGFpbiBtYWNybyBkZWZpbml0aW9ucyBpbiAvRSBtb2RlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgImQxcmVwb3J0QWxsQ2xhc3NMYXlvdXQiLCBfU0xBU0hfZDFyZXBvcnRBbGxDbGFzc0xheW91dCwgRmxhZywgY2xfR3JvdXAsIGZkdW1wX3JlY29yZF9sYXlvdXRzLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJEdW1wIHJlY29yZCBsYXlvdXQgaW5mb3JtYXRpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiZDJGYXN0RmFpbCIsIF9TTEFTSF9kMkZhc3RGYWlsLCBGbGFnLCBjbF9pZ25vcmVkX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgImQyWmkrIiwgX1NMQVNIX2QyWmlfUExVUywgRmxhZywgY2xfaWdub3JlZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJkQSIsIGRBLCBGbGFnLCBkX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZEQiLCBkRCwgRmxhZywgZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJQcmludCBtYWNybyBkZWZpbml0aW9ucyBpbiAtRSBtb2RlIGluIGFkZGl0aW9uIHRvIG5vcm1hbCBvdXRwdXQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZGVhZF9zdHJpcCIsIGRlYWRfX3N0cmlwLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZGVidWctZm9yd2FyZC10ZW1wbGF0ZS1wYXJhbXMiLCBkZWJ1Z19mb3J3YXJkX3RlbXBsYXRlX3BhcmFtcywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkVtaXQgY29tcGxldGUgZGVzY3JpcHRpb25zIG9mIHRlbXBsYXRlIHBhcmFtZXRlcnMgaW4gZm9yd2FyZCBkZWNsYXJhdGlvbnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZGVidWctaW5mby1raW5kPSIsIGRlYnVnX2luZm9fa2luZF9FUSwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDQzFBc09wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZGVidWctaW5mby1tYWNybyIsIGRlYnVnX2luZm9fbWFjcm8sIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENDMUFzT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkVtaXQgbWFjcm8gZGVidWcgaW5mb3JtYXRpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiZGVidWc9IiwgX2RlYnVnX0VRLCBKb2luZWQsIElOVkFMSUQsIGdfRmxhZywgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImRlYnVnZ2VyLXR1bmluZz0iLCBkZWJ1Z2dlcl90dW5pbmdfRVEsIEpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ0MxQXNPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImRlYnVnIiwgX2RlYnVnLCBGbGFnLCBJTlZBTElELCBnX0ZsYWcsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJkZWZpbmUtbWFjcm89IiwgX2RlZmluZV9tYWNyb19FUSwgSm9pbmVkLCBJTlZBTElELCBELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiZGVmaW5lLW1hY3JvIiwgX2RlZmluZV9tYWNybywgU2VwYXJhdGUsIElOVkFMSUQsIEQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJkZWZzeW0iLCBkZWZzeW0sIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFBc09wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEZWZpbmUgYSB2YWx1ZSBmb3IgYSBzeW1ib2wiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiZGVwZW5kZW5jaWVzIiwgX2RlcGVuZGVuY2llcywgRmxhZywgSU5WQUxJRCwgTSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImRlcGVuZGVuY3ktZG90IiwgZGVwZW5kZW5jeV9kb3QsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkZpbGVuYW1lIHRvIHdyaXRlIERPVC1mb3JtYXR0ZWQgaGVhZGVyIGRlcGVuZGVuY2llcyB0byIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJkZXBlbmRlbmN5LWZpbGUiLCBkZXBlbmRlbmN5X2ZpbGUsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkZpbGVuYW1lIChvciAtKSB0byB3cml0ZSBkZXBlbmRlbmN5IG91dHB1dCB0byIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJkZXBlbmRlbnQtbGliPSIsIGRlcGVuZGVudF9saWIsIEpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkFkZCBkZXBlbmRlbnQgbGlicmFyeSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJkZXRhaWxlZC1wcmVwcm9jZXNzaW5nLXJlY29yZCIsIGRldGFpbGVkX3ByZXByb2Nlc3NpbmdfcmVjb3JkLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiaW5jbHVkZSBhIGRldGFpbGVkIHJlY29yZCBvZiBwcmVwcm9jZXNzaW5nIGFjdGlvbnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZGlhZ25vc3RpYy1sb2ctZmlsZSIsIGRpYWdub3N0aWNfbG9nX2ZpbGUsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRmlsZW5hbWUgKG9yIC0pIHRvIGxvZyBkaWFnbm9zdGljcyB0byIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJkaWFnbm9zdGljczpjYXJldCIsIF9TTEFTSF9kaWFnbm9zdGljc19jYXJldCwgRmxhZywgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBjYXJldCBhbmQgY29sdW1uIGRpYWdub3N0aWNzIChvbiBieSBkZWZhdWx0KSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJkaWFnbm9zdGljczpjbGFzc2ljIiwgX1NMQVNIX2RpYWdub3N0aWNzX2NsYXNzaWMsIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIGNvbHVtbiBhbmQgY2FyZXQgZGlhZ25vc3RpY3MiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiZGlhZ25vc3RpY3M6Y29sdW1uIiwgX1NMQVNIX2RpYWdub3N0aWNzX2NvbHVtbiwgRmxhZywgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgY2FyZXQgZGlhZ25vc3RpY3MgYnV0IGtlZXAgY29sdW1uIGluZm8iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZGlzYWJsZS1mcmVlIiwgZGlzYWJsZV9mcmVlLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSBmcmVlaW5nIG9mIG1lbW9yeSBvbiBleGl0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImRpc2FibGUtbGlmZXRpbWUtbWFya2VycyIsIGRpc2FibGVfbGlmZXRpbWVtYXJrZXJzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSBsaWZldGltZS1tYXJrZXJzIGVtaXNzaW9uIGV2ZW4gd2hlbiBvcHRpbWl6YXRpb25zIGFyZSBlbmFibGVkIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImRpc2FibGUtbGx2bS1vcHR6bnMiLCBkaXNhYmxlX2xsdm1fb3B0em5zLCBGbGFnLCBJTlZBTElELCBkaXNhYmxlX2xsdm1fcGFzc2VzLCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImRpc2FibGUtbGx2bS1wYXNzZXMiLCBkaXNhYmxlX2xsdm1fcGFzc2VzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiVXNlIHRvZ2V0aGVyIHdpdGggLWVtaXQtbGx2bSB0byBnZXQgcHJpc3RpbmUgTExWTSBJUiBmcm9tIHRoZSBmcm9udGVuZCBieSBub3QgcnVubmluZyBhbnkgTExWTSBwYXNzZXMgYXQgYWxsIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImRpc2FibGUtbGx2bS12ZXJpZmllciIsIGRpc2FibGVfbGx2bV92ZXJpZmllciwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkRvbid0IHJ1biB0aGUgTExWTSBJUiB2ZXJpZmllciBwYXNzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImRpc2FibGUtTzAtb3B0bm9uZSIsIGRpc2FibGVfTzBfb3B0bm9uZSwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgYWRkaW5nIHRoZSBvcHRub25lIGF0dHJpYnV0ZSB0byBmdW5jdGlvbnMgYXQgTzAiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZGlzYWJsZS1vYmpjLWRlZmF1bHQtc3ludGhlc2l6ZS1wcm9wZXJ0aWVzIiwgZGlzYWJsZV9vYmpjX2RlZmF1bHRfc3ludGhlc2l6ZV9wcm9wZXJ0aWVzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiZGlzYWJsZSB0aGUgZGVmYXVsdCBzeW50aGVzaXMgb2YgT2JqZWN0aXZlLUMgcHJvcGVydGllcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJkaXNhYmxlLXJlZC16b25lIiwgZGlzYWJsZV9yZWRfem9uZSwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkRvIG5vdCBlbWl0IGNvZGUgdGhhdCB1c2VzIHRoZSByZWQgem9uZS4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZGlzY2FyZC12YWx1ZS1uYW1lcyIsIGRpc2NhcmRfdmFsdWVfbmFtZXMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEaXNjYXJkIHZhbHVlIG5hbWVzIGluIExMVk0gSVIiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZEkiLCBkSSwgRmxhZywgZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJQcmludCBpbmNsdWRlIGRpcmVjdGl2ZXMgaW4gLUUgbW9kZSBpbiBhZGRpdGlvbiB0byBub3JtYWwgb3V0cHV0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImRNIiwgZE0sIEZsYWcsIGRfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiUHJpbnQgbWFjcm8gZGVmaW5pdGlvbnMgaW4gLUUgbW9kZSBpbnN0ZWFkIG9mIG5vcm1hbCBvdXRwdXQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiZG9jIiwgX1NMQVNIX2RvYywgSm9pbmVkLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImRyaXZlci1tb2RlPSIsIGRyaXZlcl9tb2RlLCBKb2luZWQsIGludGVybmFsX2RyaXZlcl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiB8IERyaXZlck9wdGlvbiB8IEhlbHBIaWRkZW4sIDAsCisgICAgICAgIlNldCB0aGUgZHJpdmVyIG1vZGUgdG8gZWl0aGVyICdnY2MnLCAnZysrJywgJ2NwcCcsIG9yICdjbCciLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZHVtcC1jb3ZlcmFnZS1tYXBwaW5nIiwgZHVtcF9jb3ZlcmFnZV9tYXBwaW5nLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRHVtcCB0aGUgY292ZXJhZ2UgbWFwcGluZyByZWNvcmRzLCBmb3IgdGVzdGluZyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJkdW1wLWRlc2VyaWFsaXplZC1kZWNscyIsIGR1bXBfZGVzZXJpYWxpemVkX3BjaF9kZWNscywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkR1bXAgZGVjbGFyYXRpb25zIHRoYXQgYXJlIGRlc2VyaWFsaXplZCBmcm9tIFBDSCwgZm9yIHRlc3RpbmciLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZHVtcC1yYXctdG9rZW5zIiwgZHVtcF9yYXdfdG9rZW5zLCBGbGFnLCBBY3Rpb25fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJMZXggZmlsZSBpbiByYXcgbW9kZSBhbmQgZHVtcCByYXcgdG9rZW5zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImR1bXAtdG9rZW5zIiwgZHVtcF90b2tlbnMsIEZsYWcsIEFjdGlvbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlJ1biBwcmVwcm9jZXNzb3IsIGR1bXAgaW50ZXJuYWwgcmVwIG9mIHRva2VucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJkdW1wbWFjaGluZSIsIGR1bXBtYWNoaW5lLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZHVtcHNwZWNzIiwgZHVtcHNwZWNzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBVbnN1cHBvcnRlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImR1bXB2ZXJzaW9uIiwgZHVtcHZlcnNpb24sIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJkd2FyZi1jb2x1bW4taW5mbyIsIGR3YXJmX2NvbHVtbl9pbmZvLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiVHVybiBvbiBjb2x1bW4gbG9jYXRpb24gaW5mb3JtYXRpb24uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImR3YXJmLWRlYnVnLWZsYWdzIiwgZHdhcmZfZGVidWdfZmxhZ3MsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDQzFBc09wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJUaGUgc3RyaW5nIHRvIGVtYmVkIGluIHRoZSBEd2FyZiBkZWJ1ZyBmbGFncyByZWNvcmQuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImR3YXJmLWRlYnVnLXByb2R1Y2VyIiwgZHdhcmZfZGVidWdfcHJvZHVjZXIsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFBc09wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJUaGUgc3RyaW5nIHRvIGVtYmVkIGluIHRoZSBEd2FyZiBkZWJ1ZyBBVF9wcm9kdWNlciByZWNvcmQuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImR3YXJmLWV4cGxpY2l0LWltcG9ydCIsIGR3YXJmX2V4cGxpY2l0X2ltcG9ydCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkdlbmVyYXRlIGV4cGxpY2l0IGltcG9ydCBmcm9tIGFub255bW91cyBuYW1lc3BhY2UgdG8gY29udGFpbmluZyBzY29wZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJkd2FyZi1leHQtcmVmcyIsIGR3YXJmX2V4dF9yZWZzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiR2VuZXJhdGUgZGVidWcgaW5mbyB3aXRoIGV4dGVybmFsIHJlZmVyZW5jZXMgdG8gY2xhbmcgbW9kdWxlcyBvciBwcmVjb21waWxlZCBoZWFkZXJzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImR3YXJmLXZlcnNpb249IiwgZHdhcmZfdmVyc2lvbl9FUSwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDQzFBc09wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiZHlsZC1wcmVmaXg9IiwgX2R5bGRfcHJlZml4X0VRLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJkeWxkLXByZWZpeCIsIF9keWxkX3ByZWZpeCwgU2VwYXJhdGUsIElOVkFMSUQsIF9keWxkX3ByZWZpeF9FUSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImR5bGliX2ZpbGUiLCBkeWxpYl9fZmlsZSwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJkeWxpbmtlcl9pbnN0YWxsX25hbWUiLCBkeWxpbmtlcl9faW5zdGFsbF9fbmFtZSwgSm9pbmVkT3JTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImR5bGlua2VyIiwgZHlsaW5rZXIsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJkeW5hbWljbGliIiwgZHluYW1pY2xpYiwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImR5bmFtaWMiLCBkeW5hbWljLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBOb0FyZ3VtZW50VW51c2VkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiRCIsIEQsIEpvaW5lZE9yU2VwYXJhdGUsIFByZXByb2Nlc3Nvcl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJEZWZpbmUgPG1hY3JvPiB0byA8dmFsdWU+IChvciAxIGlmIDx2YWx1ZT4gb21pdHRlZCkiLCAiPG1hY3JvPj08dmFsdWU+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkQiLCBfU0xBU0hfRCwgSm9pbmVkT3JTZXBhcmF0ZSwgY2xfR3JvdXAsIEQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkRlZmluZSBtYWNybyIsICI8bWFjcm9bPXZhbHVlXT4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZCIsIGRfRmxhZywgRmxhZywgZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImQiLCBkX0pvaW5lZCwgSm9pbmVkLCBkX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiRUIiLCBFQiwgRmxhZywgSU5WQUxJRCwgbWJpZ19lbmRpYW4sIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJFSCIsIF9TTEFTSF9FSCwgSm9pbmVkLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiRXhjZXB0aW9uIGhhbmRsaW5nIG1vZGVsIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIkVMIiwgRUwsIEZsYWcsIElOVkFMSUQsIG1saXR0bGVfZW5kaWFuLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZW1pdC1hc3QiLCBlbWl0X2FzdCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRW1pdCBDbGFuZyBBU1QgZmlsZXMgZm9yIHNvdXJjZSBpbnB1dHMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZW1pdC1jb2RlZ2VuLW9ubHkiLCBlbWl0X2NvZGVnZW5fb25seSwgRmxhZywgQWN0aW9uX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiR2VuZXJhdGUgbWFjaGluZSBjb2RlLCBidXQgZGlzY2FyZCBvdXRwdXQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZW1pdC1odG1sIiwgZW1pdF9odG1sLCBGbGFnLCBBY3Rpb25fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJPdXRwdXQgaW5wdXQgc291cmNlIGFzIEhUTUwiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZW1pdC1sbHZtLWJjIiwgZW1pdF9sbHZtX2JjLCBGbGFnLCBBY3Rpb25fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJCdWlsZCBBU1RzIHRoZW4gY29udmVydCB0byBMTFZNLCBlbWl0IC5iYyBmaWxlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImVtaXQtbGx2bS1vbmx5IiwgZW1pdF9sbHZtX29ubHksIEZsYWcsIEFjdGlvbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkJ1aWxkIEFTVHMgYW5kIGNvbnZlcnQgdG8gTExWTSwgZGlzY2FyZGluZyBvdXRwdXQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZW1pdC1sbHZtLXVzZWxpc3RzIiwgZW1pdF9sbHZtX3VzZWxpc3RzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiUHJlc2VydmUgb3JkZXIgb2YgTExWTSB1c2UtbGlzdHMgd2hlbiBzZXJpYWxpemluZyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJlbWl0LWxsdm0iLCBlbWl0X2xsdm0sIEZsYWcsIEFjdGlvbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJVc2UgdGhlIExMVk0gcmVwcmVzZW50YXRpb24gZm9yIGFzc2VtYmxlciBhbmQgb2JqZWN0IGZpbGVzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImVtaXQtbW9kdWxlLWludGVyZmFjZSIsIGVtaXRfbW9kdWxlX2ludGVyZmFjZSwgRmxhZywgQWN0aW9uX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiR2VuZXJhdGUgcHJlLWNvbXBpbGVkIG1vZHVsZSBmaWxlIGZyb20gYSBDKysgbW9kdWxlIGludGVyZmFjZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJlbWl0LW1vZHVsZSIsIGVtaXRfbW9kdWxlLCBGbGFnLCBBY3Rpb25fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJHZW5lcmF0ZSBwcmUtY29tcGlsZWQgbW9kdWxlIGZpbGUgZnJvbSBhIG1vZHVsZSBtYXAiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZW1pdC1vYmoiLCBlbWl0X29iaiwgRmxhZywgQWN0aW9uX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRW1pdCBuYXRpdmUgb2JqZWN0IGZpbGVzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImVtaXQtcGNoIiwgZW1pdF9wY2gsIEZsYWcsIEFjdGlvbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkdlbmVyYXRlIHByZS1jb21waWxlZCBoZWFkZXIgZmlsZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJlbWl0LXB0aCIsIGVtaXRfcHRoLCBGbGFnLCBBY3Rpb25fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJHZW5lcmF0ZSBwcmUtdG9rZW5pemVkIGhlYWRlciBmaWxlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImVuYWJsZS1zcGxpdC1kd2FyZiIsIGVuYWJsZV9zcGxpdF9kd2FyZiwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlVzZSBzcGxpdCBkd2FyZi9GaXNzaW9uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImVuY29kaW5nPSIsIF9lbmNvZGluZ19FUSwgSm9pbmVkLCBJTlZBTElELCBmZW5jb2RpbmdfRVEsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJlbmNvZGluZyIsIF9lbmNvZGluZywgU2VwYXJhdGUsIElOVkFMSUQsIGZlbmNvZGluZ19FUSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImVudHJ5IiwgX2VudHJ5LCBGbGFnLCBJTlZBTElELCBlLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiRW9ubHkiLCBFb25seSwgRmxhZywgQWN0aW9uX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiSnVzdCBydW4gcHJlcHJvY2Vzc29yLCBubyBvdXRwdXQgKGZvciB0aW1pbmdzKSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJFUCIsIF9TTEFTSF9FUCwgRmxhZywgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgbGluZW1hcmtlciBvdXRwdXQgYW5kIHByZXByb2Nlc3MgdG8gc3Rkb3V0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImVycm9yLW9uLWRlc2VyaWFsaXplZC1kZWNsPSIsIGVycm9yX29uX2Rlc2VyaWFsaXplZF9wY2hfZGVjbF9FUSwgSm9pbmVkLCBJTlZBTElELCBlcnJvcl9vbl9kZXNlcmlhbGl6ZWRfcGNoX2RlY2wsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZXJyb3Itb24tZGVzZXJpYWxpemVkLWRlY2wiLCBlcnJvcl9vbl9kZXNlcmlhbGl6ZWRfcGNoX2RlY2wsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRW1pdCBlcnJvciBpZiBhIHNwZWNpZmljIGRlY2xhcmF0aW9uIGlzIGRlc2VyaWFsaXplZCBmcm9tIFBDSCwgZm9yIHRlc3RpbmciLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiZXJyb3JSZXBvcnQiLCBfU0xBU0hfZXJyb3JSZXBvcnQsIEpvaW5lZCwgY2xfaWdub3JlZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBIZWxwSGlkZGVuLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiZXhlY3V0aW9uLWNoYXJzZXQ6IiwgX1NMQVNIX2V4ZWN1dGlvbl9jaGFyc2V0LCBKb2luZWQsIGNsX2NvbXBpbGVfR3JvdXAsIGZleGVjX2NoYXJzZXRfRVEsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJSdW50aW1lIGVuY29kaW5nLCBzdXBwb3J0cyBvbmx5IFVURi04IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImV4cG9ydGVkX3N5bWJvbHNfbGlzdCIsIGV4cG9ydGVkX19zeW1ib2xzX19saXN0LCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImV4dGRpcnM9IiwgX2V4dGRpcnNfRVEsIEpvaW5lZCwgSU5WQUxJRCwgZmV4dGRpcnNfRVEsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJleHRkaXJzIiwgX2V4dGRpcnMsIFNlcGFyYXRlLCBJTlZBTElELCBmZXh0ZGlyc19FUSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImV4dHJhLXdhcm5pbmdzIiwgX2V4dHJhX3dhcm5pbmdzLCBGbGFnLCBJTlZBTElELCBXX0pvaW5lZCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIkUiLCBFLCBGbGFnLCBBY3Rpb25fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENDMU9wdGlvbiwgMCwKKyAgICAgICAiT25seSBydW4gdGhlIHByZXByb2Nlc3NvciIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJFIiwgX1NMQVNIX0UsIEZsYWcsIGNsX0dyb3VwLCBFLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJQcmVwcm9jZXNzIHRvIHN0ZG91dCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJlIiwgZSwgSm9pbmVkT3JTZXBhcmF0ZSwgTGlua19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZhY2Nlc3MtY29udHJvbCIsIGZhY2Nlc3NfY29udHJvbCwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZhZGRyZXNzLXNwYWNlLW1hcC1tYW5nbGluZz0iLCBmYWRkcmVzc19zcGFjZV9tYXBfbWFuZ2xpbmdfRVEsIEpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlNldCB0aGUgbW9kZSBmb3IgYWRkcmVzcyBzcGFjZSBtYXAgYmFzZWQgbWFuZ2xpbmc7IE9wZW5DTCB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkiLCAiPHllc3xub3x0YXJnZXQ+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZhZ2dyZXNzaXZlLWZ1bmN0aW9uLWVsaW1pbmF0aW9uIiwgYWdncmVzc2l2ZV9mdW5jdGlvbl9lbGltaW5hdGlvbl9mLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZhbGlnbi1jb21tb25zIiwgYWxpZ25fY29tbW9uc19mLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZhbGlnbi1mdW5jdGlvbnM9IiwgZmFsaWduX2Z1bmN0aW9uc19FUSwgSm9pbmVkLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZhbGlnbi1mdW5jdGlvbnMiLCBhbGlnbl9mdW5jdGlvbnNfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmYWxpZ24tanVtcHM9IiwgZmFsaWduX2p1bXBzX0VRLCBKb2luZWQsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmFsaWduLWp1bXBzIiwgYWxpZ25fanVtcHNfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmYWxpZ24tbGFiZWxzPSIsIGZhbGlnbl9sYWJlbHNfRVEsIEpvaW5lZCwgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmYWxpZ24tbGFiZWxzIiwgYWxpZ25fbGFiZWxzX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmFsaWduLWxvb3BzPSIsIGZhbGlnbl9sb29wc19FUSwgSm9pbmVkLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZhbGlnbi1sb29wcyIsIGFsaWduX2xvb3BzX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmFsaWduZWQtYWxsb2MtdW5hdmFpbGFibGUiLCBhbGlnbmVkX2FsbG9jX3VuYXZhaWxhYmxlLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiQWxpZ25lZCBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiBmdW5jdGlvbnMgYXJlIHVuYXZhaWxhYmxlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZhbGlnbmVkLWFsbG9jYXRpb24iLCBmYWxpZ25lZF9hbGxvY2F0aW9uLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBDKysxNyBhbGlnbmVkIGFsbG9jYXRpb24gZnVuY3Rpb25zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZhbGlnbmVkLW5ldz0iLCBmYWxpZ25lZF9uZXdfRVEsIEpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZhbGlnbmVkLW5ldyIsIGFub255bW91c18xNCwgRmxhZywgSU5WQUxJRCwgZmFsaWduZWRfYWxsb2NhdGlvbiwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZhbGwtaW50cmluc2ljcyIsIGFsbF9pbnRyaW5zaWNzX2YsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiZmFsbGJhY2siLCBfU0xBU0hfZmFsbGJhY2ssIEZsYWcsIGNsX2NvbXBpbGVfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJGYWxsIGJhY2sgdG8gY2wuZXhlIGlmIGNsYW5nLWNsIGZhaWxzIHRvIGNvbXBpbGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmFsbG93LWVkaXRvci1wbGFjZWhvbGRlcnMiLCBmYWxsb3dfZWRpdG9yX3BsYWNlaG9sZGVycywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJUcmVhdCBlZGl0b3IgcGxhY2Vob2xkZXJzIGFzIHZhbGlkIHNvdXJjZSBjb2RlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZhbGxvdy1oYWxmLWFyZ3VtZW50cy1hbmQtcmV0dXJucyIsIGZhbGxvd19oYWxmX2FyZ3VtZW50c19hbmRfcmV0dXJucywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkFsbG93IGZ1bmN0aW9uIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBvZiB0eXBlIGhhbGYiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmFsbG93LXBjaC13aXRoLWNvbXBpbGVyLWVycm9ycyIsIGZhbGxvd19wY2hfd2l0aF9lcnJvcnMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJBY2NlcHQgYSBQQ0ggZmlsZSB0aGF0IHdhcyBjcmVhdGVkIHdpdGggY29tcGlsZXIgZXJyb3JzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZhbGxvdy11bnN1cHBvcnRlZCIsIGZhbGxvd191bnN1cHBvcnRlZCwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZhbHRpdmVjIiwgZmFsdGl2ZWMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZhbnNpLWVzY2FwZS1jb2RlcyIsIGZhbnNpX2VzY2FwZV9jb2RlcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiB8IENDMU9wdGlvbiwgMCwKKyAgICAgICAiVXNlIEFOU0kgZXNjYXBlIGNvZGVzIGZvciBkaWFnbm9zdGljcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmYXBwbGUta2V4dCIsIGZhcHBsZV9rZXh0LCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlVzZSBBcHBsZSdzIGtlcm5lbCBleHRlbnNpb25zIEFCSSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmYXBwbGUtcHJhZ21hLXBhY2siLCBmYXBwbGVfcHJhZ21hX3BhY2ssIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIEFwcGxlIGdjYy1jb21wYXRpYmxlICNwcmFnbWEgcGFjayBoYW5kbGluZyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmYXBwbGljYXRpb24tZXh0ZW5zaW9uIiwgZmFwcGxpY2F0aW9uX2V4dGVuc2lvbiwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJSZXN0cmljdCBjb2RlIHRvIHRob3NlIGF2YWlsYWJsZSBmb3IgQXBwIEV4dGVuc2lvbnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmFzbS1ibG9ja3MiLCBmYXNtX2Jsb2NrcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmFzbSIsIGZhc20sIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmYXNzb2NpYXRpdmUtbWF0aCIsIGZhc3NvY2lhdGl2ZV9tYXRoLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmFzc3VtZS1zYW5lLW9wZXJhdG9yLW5ldyIsIGZhc3N1bWVfc2FuZV9vcGVyYXRvcl9uZXcsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmYXN0Y3AiLCBmYXN0Y3AsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmYXN0ZiIsIGZhc3RmLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmFzdCIsIGZhc3QsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMiLCBmYXN5bmNocm9ub3VzX3Vud2luZF90YWJsZXMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmYXV0by1wcm9maWxlLWFjY3VyYXRlIiwgZmF1dG9fcHJvZmlsZV9hY2N1cmF0ZSwgRmxhZywgZl9Hcm91cCwgZnByb2ZpbGVfc2FtcGxlX2FjY3VyYXRlLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmF1dG8tcHJvZmlsZT0iLCBmYXV0b19wcm9maWxlX0VRLCBKb2luZWQsIElOVkFMSUQsIGZwcm9maWxlX3NhbXBsZV91c2VfRVEsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmYXV0by1wcm9maWxlIiwgZmF1dG9fcHJvZmlsZSwgRmxhZywgZl9Hcm91cCwgZnByb2ZpbGVfc2FtcGxlX3VzZSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZhdXRvbGluayIsIGZhdXRvbGluaywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZhdXRvbWF0aWMiLCBhdXRvbWF0aWNfZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJmYXZvciIsIF9TTEFTSF9mYXZvciwgSm9pbmVkLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkZBIiwgX1NMQVNIX0ZBLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiT3V0cHV0IGFzc2VtYmx5IGNvZGUgZmlsZSBkdXJpbmcgY29tcGlsYXRpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiRkEiLCBfU0xBU0hfRkFfam9pbmVkLCBKb2luZWQsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiRmEiLCBfU0xBU0hfRmEsIEpvaW5lZCwgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIk91dHB1dCBhc3NlbWJseSBjb2RlIHRvIHRoaXMgZmlsZSBkdXJpbmcgY29tcGlsYXRpb24gKHdpdGggL0ZBKSIsICI8ZmlsZSBvciBkaXJlY3Rvcnk+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZiYWNrc2xhc2giLCBiYWNrc2xhc2hfZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmYmFja3RyYWNlIiwgYmFja3RyYWNlX2YsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmJsYXMtbWF0bXVsLWxpbWl0PSIsIGZibGFzX21hdG11bF9saW1pdF9FUSwgSm9pbmVkLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZibG9ja3MtcnVudGltZS1vcHRpb25hbCIsIGZibG9ja3NfcnVudGltZV9vcHRpb25hbCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIldlYWtseSBsaW5rIGluIHRoZSBibG9ja3MgcnVudGltZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmYmxvY2tzIiwgZmJsb2NrcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgdGhlICdibG9ja3MnIGxhbmd1YWdlIGZlYXR1cmUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmJvb3RjbGFzc3BhdGg9IiwgZmJvb3RjbGFzc3BhdGhfRVEsIEpvaW5lZCwgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZib3JsYW5kLWV4dGVuc2lvbnMiLCBmYm9ybGFuZF9leHRlbnNpb25zLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkFjY2VwdCBub24tc3RhbmRhcmQgY29uc3RydWN0cyBzdXBwb3J0ZWQgYnkgdGhlIEJvcmxhbmQgY29tcGlsZXIiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmJvdW5kcy1jaGVjayIsIGJvdW5kc19jaGVja19mLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZicmFja2V0LWRlcHRoPSIsIGZicmFja2V0X2RlcHRoX0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmYnJhY2tldC1kZXB0aCIsIGZicmFja2V0X2RlcHRoLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIk1heGltdW0gbmVzdGluZyBsZXZlbCBmb3IgcGFyZW50aGVzZXMsIGJyYWNrZXRzLCBhbmQgYnJhY2VzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZicmFuY2gtY291bnQtcmVnIiwgYnJhbmNoX2NvdW50X3JlZ19mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZidWlsZC1zZXNzaW9uLWZpbGU9IiwgZmJ1aWxkX3Nlc3Npb25fZmlsZSwgSm9pbmVkLCBpX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJVc2UgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgb2YgPGZpbGU+IGFzIHRoZSBidWlsZCBzZXNzaW9uIHRpbWVzdGFtcCIsICI8ZmlsZT4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmJ1aWxkLXNlc3Npb24tdGltZXN0YW1wPSIsIGZidWlsZF9zZXNzaW9uX3RpbWVzdGFtcCwgSm9pbmVkLCBpX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlRpbWUgd2hlbiB0aGUgY3VycmVudCBidWlsZCBzZXNzaW9uIHN0YXJ0ZWQiLCAiPHRpbWUgc2luY2UgRXBvY2ggaW4gc2Vjb25kcz4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmJ1aWx0aW4tbW9kdWxlLW1hcCIsIGZidWlsdGluX21vZHVsZV9tYXAsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiTG9hZCB0aGUgY2xhbmcgYnVpbHRpbnMgbW9kdWxlIG1hcCBmaWxlLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmYnVpbHRpbiIsIGZidWlsdGluLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmNhbGxlci1zYXZlcyIsIGNhbGxlcl9zYXZlc19mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZjYXJldC1kaWFnbm9zdGljcy1tYXgtbGluZXMiLCBmY2FyZXRfZGlhZ25vc3RpY3NfbWF4X2xpbmVzLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlNldCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc291cmNlIGxpbmVzIHRvIHNob3cgaW4gYSBjYXJldCBkaWFnbm9zdGljIiwgIjxOPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmY2FyZXQtZGlhZ25vc3RpY3MiLCBmY2FyZXRfZGlhZ25vc3RpY3MsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmY2YtcHJvdGVjdGlvbj0iLCBmY2ZfcHJvdGVjdGlvbl9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uIHwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJJbnN0cnVtZW50IGNvbnRyb2wtZmxvdyBhcmNoaXRlY3R1cmUgcHJvdGVjdGlvbi4gT3B0aW9uczogcmV0dXJuLCBicmFuY2gsIGZ1bGwsIG5vbmUuIiwgbnVsbHB0ciwgInJldHVybixicmFuY2gsZnVsbCxub25lIikKK09QVElPTihwcmVmaXhfMSwgImZjZi1wcm90ZWN0aW9uIiwgZmNmX3Byb3RlY3Rpb24sIEZsYWcsIGZfR3JvdXAsIGZjZl9wcm90ZWN0aW9uX0VRLCAiZnVsbFwwIiwgQ29yZU9wdGlvbiB8IENDMU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIGNmLXByb3RlY3Rpb24gaW4gJ2Z1bGwnIG1vZGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmNoZWNrLWFycmF5LXRlbXBvcmFyaWVzIiwgY2hlY2tfYXJyYXlfdGVtcG9yYXJpZXNfZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmY2hlY2stbmV3IiwgZmNoZWNrX25ld19mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmY2hlY2s9IiwgZmNoZWNrX0VRLCBKb2luZWQsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmNsYW5nLWFiaS1jb21wYXQ9IiwgZmNsYW5nX2FiaV9jb21wYXRfRVEsIEpvaW5lZCwgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJBdHRlbXB0IHRvIG1hdGNoIHRoZSBBQkkgb2YgQ2xhbmcgPHZlcnNpb24+IiwgIjx2ZXJzaW9uPiIsICI8bWFqb3I+LjxtaW5vcj4sbGF0ZXN0IikKK09QVElPTihwcmVmaXhfMSwgImZjbGFzc3BhdGg9IiwgZmNsYXNzcGF0aF9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmNvYXJyYXk9IiwgZmNvYXJyYXlfRVEsIEpvaW5lZCwgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmY29sb3ItZGlhZ25vc3RpY3MiLCBmY29sb3JfZGlhZ25vc3RpY3MsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24gfCBDQzFPcHRpb24sIDAsCisgICAgICAgIlVzZSBjb2xvcnMgaW4gZGlhZ25vc3RpY3MiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmNvbW1lbnQtYmxvY2stY29tbWFuZHM9IiwgZmNvbW1lbnRfYmxvY2tfY29tbWFuZHMsIENvbW1hSm9pbmVkLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlRyZWF0IGVhY2ggY29tbWEgc2VwYXJhdGVkIGFyZ3VtZW50IGluIDxhcmc+IGFzIGEgZG9jdW1lbnRhdGlvbiBjb21tZW50IGJsb2NrIGNvbW1hbmQiLCAiPGFyZz4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmNvbW1vbiIsIGZjb21tb24sIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmY29tcGlsZS1yZXNvdXJjZT0iLCBmY29tcGlsZV9yZXNvdXJjZV9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmNvbmNlcHRzLXRzIiwgZmNvbmNlcHRzX3RzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIEMrKyBFeHRlbnNpb25zIGZvciBDb25jZXB0cy4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmNvbnN0LXN0cmluZ3MiLCBmY29uc3Rfc3RyaW5ncywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlVzZSBhIGNvbnN0IHF1YWxpZmllZCB0eXBlIGZvciBzdHJpbmcgbGl0ZXJhbHMgaW4gQyBhbmQgT2JqQyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmY29uc3RhbnQtY2ZzdHJpbmdzIiwgZmNvbnN0YW50X2Nmc3RyaW5ncywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZjb25zdGFudC1zdHJpbmctY2xhc3M9IiwgZmNvbnN0YW50X3N0cmluZ19jbGFzc19FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmNvbnN0YW50LXN0cmluZy1jbGFzcyIsIGZjb25zdGFudF9zdHJpbmdfY2xhc3MsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiU3BlY2lmeSB0aGUgY2xhc3MgdG8gdXNlIGZvciBjb25zdGFudCBPYmplY3RpdmUtQyBzdHJpbmcgb2JqZWN0cy4iLCAiPGNsYXNzIG5hbWU+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZjb25zdGV4cHItYmFja3RyYWNlLWxpbWl0PSIsIGZjb25zdGV4cHJfYmFja3RyYWNlX2xpbWl0X0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmY29uc3RleHByLWJhY2t0cmFjZS1saW1pdCIsIGZjb25zdGV4cHJfYmFja3RyYWNlX2xpbWl0LCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB0byBwcmludCBpbiBhIGNvbnN0ZXhwciBldmFsdWF0aW9uIGJhY2t0cmFjZSAoMCA9IG5vIGxpbWl0KS4iLCAiPE4+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZjb25zdGV4cHItZGVwdGg9IiwgZmNvbnN0ZXhwcl9kZXB0aF9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmNvbnN0ZXhwci1kZXB0aCIsIGZjb25zdGV4cHJfZGVwdGgsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiTWF4aW11bSBkZXB0aCBvZiByZWN1cnNpdmUgY29uc3RleHByIGZ1bmN0aW9uIGNhbGxzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZjb25zdGV4cHItc3RlcHM9IiwgZmNvbnN0ZXhwcl9zdGVwc19FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmNvbnN0ZXhwci1zdGVwcyIsIGZjb25zdGV4cHJfc3RlcHMsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiTWF4aW11bSBudW1iZXIgb2Ygc3RlcHMgaW4gY29uc3RleHByIGZ1bmN0aW9uIGV2YWx1YXRpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmNvbnZlcnQ9IiwgZmNvbnZlcnRfRVEsIEpvaW5lZCwgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmY29yb3V0aW5lcy10cyIsIGZjb3JvdXRpbmVzX3RzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBzdXBwb3J0IGZvciB0aGUgQysrIENvcm91dGluZXMgVFMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmNvdmVyYWdlLW1hcHBpbmciLCBmY292ZXJhZ2VfbWFwcGluZywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJHZW5lcmF0ZSBjb3ZlcmFnZSBtYXBwaW5nIHRvIGVuYWJsZSBjb2RlIGNvdmVyYWdlIGFuYWx5c2lzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZjcmF5LXBvaW50ZXIiLCBjcmF5X3BvaW50ZXJfZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmY3JlYXRlLXByb2ZpbGUiLCBmY3JlYXRlX3Byb2ZpbGUsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmY3VkYS1hbGxvdy12YXJpYWRpYy1mdW5jdGlvbnMiLCBmY3VkYV9hbGxvd192YXJpYWRpY19mdW5jdGlvbnMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJBbGxvdyB2YXJpYWRpYyBmdW5jdGlvbnMgaW4gQ1VEQSBkZXZpY2UgY29kZS4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmN1ZGEtYXBwcm94LXRyYW5zY2VuZGVudGFscyIsIGZjdWRhX2FwcHJveF90cmFuc2NlbmRlbnRhbHMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiVXNlIGFwcHJveGltYXRlIHRyYW5zY2VuZGVudGFsIGZ1bmN0aW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmY3VkYS1mbHVzaC1kZW5vcm1hbHMtdG8temVybyIsIGZjdWRhX2ZsdXNoX2Rlbm9ybWFsc190b196ZXJvLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkZsdXNoIGRlbm9ybWFsIGZsb2F0aW5nIHBvaW50IHZhbHVlcyB0byB6ZXJvIGluIENVREEgZGV2aWNlIG1vZGUuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZjdWRhLWluY2x1ZGUtZ3B1YmluYXJ5IiwgZmN1ZGFfaW5jbHVkZV9ncHViaW5hcnksIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiSW5jb3Jwb3JhdGUgQ1VEQSBkZXZpY2Utc2lkZSBiaW5hcnkgaW50byBob3N0IG9iamVjdCBmaWxlLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmY3VkYS1pcy1kZXZpY2UiLCBmY3VkYV9pc19kZXZpY2UsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJHZW5lcmF0ZSBjb2RlIGZvciBDVURBIGRldmljZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmY3VkYS1yZGMiLCBmY3VkYV9yZGMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IEhlbHBIaWRkZW4sIDAsCisgICAgICAgIkdlbmVyYXRlIHJlbG9jYXRhYmxlIGRldmljZSBjb2RlLCBhbHNvIGtub3duIGFzIHNlcGFyYXRlIGNvbXBpbGF0aW9uIG1vZGUuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZjeHgtZXhjZXB0aW9ucyIsIGZjeHhfZXhjZXB0aW9ucywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgQysrIGV4Y2VwdGlvbnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmN4eC1tb2R1bGVzIiwgZmN4eF9tb2R1bGVzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJGQyIsIF9TTEFTSF9GQywgRmxhZywgY2xfaWdub3JlZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZC1saW5lcy1hcy1jb2RlIiwgZF9saW5lc19hc19jb2RlX2YsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmQtbGluZXMtYXMtY29tbWVudHMiLCBkX2xpbmVzX2FzX2NvbW1lbnRzX2YsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRhdGEtc2VjdGlvbnMiLCBmZGF0YV9zZWN0aW9ucywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJQbGFjZSBlYWNoIGRhdGEgaW4gaXRzIG93biBzZWN0aW9uIChFTEYgT25seSkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRlYnVnLWNvbXBpbGF0aW9uLWRpciIsIGZkZWJ1Z19jb21waWxhdGlvbl9kaXIsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDQzFBc09wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJUaGUgY29tcGlsYXRpb24gZGlyZWN0b3J5IHRvIGVtYmVkIGluIHRoZSBkZWJ1ZyBpbmZvLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZGVidWctaW5mby1mb3ItcHJvZmlsaW5nIiwgZmRlYnVnX2luZm9fZm9yX3Byb2ZpbGluZywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbWl0IGV4dHJhIGRlYnVnIGluZm8gdG8gbWFrZSBzYW1wbGUgcHJvZmlsZSBtb3JlIGFjY3VyYXRlLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZGVidWctbWFjcm8iLCBmZGVidWdfbWFjcm8sIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsCisgICAgICAgIkVtaXQgbWFjcm8gZGVidWcgaW5mb3JtYXRpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRlYnVnLXBhc3MtYXJndW1lbnRzIiwgZmRlYnVnX3Bhc3NfYXJndW1lbnRzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRlYnVnLXBhc3MtbWFuYWdlciIsIGZkZWJ1Z19wYXNzX21hbmFnZXIsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJQcmludHMgZGVidWcgaW5mb3JtYXRpb24gZm9yIHRoZSBuZXcgcGFzcyBtYW5hZ2VyIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZkZWJ1Zy1wYXNzLXN0cnVjdHVyZSIsIGZkZWJ1Z19wYXNzX3N0cnVjdHVyZSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZkZWJ1Zy1wcmVmaXgtbWFwPSIsIGZkZWJ1Z19wcmVmaXhfbWFwX0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAicmVtYXAgZmlsZSBzb3VyY2UgcGF0aHMgaW4gZGVidWcgaW5mbyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZGVidWctdHlwZXMtc2VjdGlvbiIsIGZkZWJ1Z190eXBlc19zZWN0aW9uLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlBsYWNlIGRlYnVnIHR5cGVzIGluIHRoZWlyIG93biBzZWN0aW9uIChFTEYgT25seSkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRlYnVnZ2VyLWNhc3QtcmVzdWx0LXRvLWlkIiwgZmRlYnVnZ2VyX2Nhc3RfcmVzdWx0X3RvX2lkLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIGNhc3RpbmcgdW5rbm93biBleHByZXNzaW9uIHJlc3VsdHMgdG8gaWQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRlYnVnZ2VyLW9iamMtbGl0ZXJhbCIsIGZkZWJ1Z2dlcl9vYmpjX2xpdGVyYWwsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgc3BlY2lhbCBkZWJ1Z2dlciBzdXBwb3J0IGZvciBPYmplY3RpdmUtQyBzdWJzY3JpcHRpbmcgYW5kIGxpdGVyYWxzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZkZWJ1Z2dlci1zdXBwb3J0IiwgZmRlYnVnZ2VyX3N1cHBvcnQsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgc3BlY2lhbCBkZWJ1Z2dlciBzdXBwb3J0IGJlaGF2aW9yIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZkZWNsc3BlYyIsIGZkZWNsc3BlYywgRmxhZywgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJBbGxvdyBfX2RlY2xzcGVjIGFzIGEga2V5d29yZCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZGVmYXVsdC1jYWxsaW5nLWNvbnY9IiwgZmRlZmF1bHRfY2FsbGluZ19jb252X0VRLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJTZXQgZGVmYXVsdCBjYWxsaW5nIGNvbnZlbnRpb24iLCBudWxscHRyLCAiY2RlY2wsZmFzdGNhbGwsc3RkY2FsbCx2ZWN0b3JjYWxsLHJlZ2NhbGwiKQorT1BUSU9OKHByZWZpeF8xLCAiZmRlZmF1bHQtZG91YmxlLTgiLCBkZWZhdWx0X2RvdWJsZV84X2YsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRlZmF1bHQtaW5saW5lIiwgZGVmYXVsdF9pbmxpbmVfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZGVmYXVsdC1pbnRlZ2VyLTgiLCBkZWZhdWx0X2ludGVnZXJfOF9mLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZkZWZhdWx0LXJlYWwtOCIsIGRlZmF1bHRfcmVhbF84X2YsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRlZmVyLXBvcCIsIGFub255bW91c182LCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZkZWxheWVkLXRlbXBsYXRlLXBhcnNpbmciLCBmZGVsYXllZF90ZW1wbGF0ZV9wYXJzaW5nLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJQYXJzZSB0ZW1wbGF0ZWQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNsYXRpb24gdW5pdCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZGVsZXRlLW51bGwtcG9pbnRlci1jaGVja3MiLCBkZWxldGVfbnVsbF9wb2ludGVyX2NoZWNrc19mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZkZW5vcm1hbC1mcC1tYXRoPSIsIGZkZW5vcm1hbF9mcF9tYXRoX0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZkZXBmaWxlLWVudHJ5PSIsIGZkZXBmaWxlX2VudHJ5LCBKb2luZWQsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZkZXByZWNhdGVkLW1hY3JvIiwgZmRlcHJlY2F0ZWRfbWFjcm8sIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEZWZpbmVzIHRoZSBfX0RFUFJFQ0FURUQgbWFjcm8iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRldmlydHVhbGl6ZS1zcGVjdWxhdGl2ZWx5IiwgZGV2aXJ0dWFsaXplX3NwZWN1bGF0aXZlbHlfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZGV2aXJ0dWFsaXplIiwgZGV2aXJ0dWFsaXplX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRpYWdub3N0aWNzLWFic29sdXRlLXBhdGhzIiwgZmRpYWdub3N0aWNzX2Fic29sdXRlX3BhdGhzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJQcmludCBhYnNvbHV0ZSBwYXRocyBpbiBkaWFnbm9zdGljcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZGlhZ25vc3RpY3MtY29sb3I9IiwgZmRpYWdub3N0aWNzX2NvbG9yX0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZGlhZ25vc3RpY3MtY29sb3IiLCBmZGlhZ25vc3RpY3NfY29sb3IsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24gfCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZGlhZ25vc3RpY3MtZml4aXQtaW5mbyIsIGZkaWFnbm9zdGljc19maXhpdF9pbmZvLCBGbGFnLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRpYWdub3N0aWNzLWZvcm1hdD0iLCBmZGlhZ25vc3RpY3NfZm9ybWF0X0VRLCBKb2luZWQsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZGlhZ25vc3RpY3MtZm9ybWF0IiwgZmRpYWdub3N0aWNzX2Zvcm1hdCwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJDaGFuZ2UgZGlhZ25vc3RpYyBmb3JtYXR0aW5nIHRvIG1hdGNoIElERSBhbmQgY29tbWFuZCBsaW5lIHRvb2xzIiwgbnVsbHB0ciwgImNsYW5nLG1zdmMsbXN2Yy1mYWxsYmFjayx2aSIpCitPUFRJT04ocHJlZml4XzEsICJmZGlhZ25vc3RpY3MtaG90bmVzcy10aHJlc2hvbGQ9IiwgZmRpYWdub3N0aWNzX2hvdG5lc3NfdGhyZXNob2xkX0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiUHJldmVudCBvcHRpbWl6YXRpb24gcmVtYXJrcyBmcm9tIGJlaW5nIG91dHB1dCBpZiB0aGV5IGRvIG5vdCBoYXZlIGF0IGxlYXN0IHRoaXMgcHJvZmlsZSBjb3VudCIsICI8bnVtYmVyPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZGlhZ25vc3RpY3MtcGFyc2VhYmxlLWZpeGl0cyIsIGZkaWFnbm9zdGljc19wYXJzZWFibGVfZml4aXRzLCBGbGFnLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uIHwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJQcmludCBmaXgtaXRzIGluIG1hY2hpbmUgcGFyc2VhYmxlIGZvcm0iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRpYWdub3N0aWNzLXByaW50LXNvdXJjZS1yYW5nZS1pbmZvIiwgZmRpYWdub3N0aWNzX3ByaW50X3NvdXJjZV9yYW5nZV9pbmZvLCBGbGFnLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlByaW50IHNvdXJjZSByYW5nZSBzcGFucyBpbiBudW1lcmljIGZvcm0iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRpYWdub3N0aWNzLXNob3ctY2F0ZWdvcnk9IiwgZmRpYWdub3N0aWNzX3Nob3dfY2F0ZWdvcnlfRVEsIEpvaW5lZCwgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZkaWFnbm9zdGljcy1zaG93LWNhdGVnb3J5IiwgZmRpYWdub3N0aWNzX3Nob3dfY2F0ZWdvcnksIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiUHJpbnQgZGlhZ25vc3RpYyBjYXRlZ29yeSIsIG51bGxwdHIsICJub25lLGlkLG5hbWUiKQorT1BUSU9OKHByZWZpeF8xLCAiZmRpYWdub3N0aWNzLXNob3ctaG90bmVzcyIsIGZkaWFnbm9zdGljc19zaG93X2hvdG5lc3MsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIHByb2ZpbGUgaG90bmVzcyBpbmZvcm1hdGlvbiBpbiBkaWFnbm9zdGljIGxpbmUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRpYWdub3N0aWNzLXNob3ctbG9jYXRpb249IiwgZmRpYWdub3N0aWNzX3Nob3dfbG9jYXRpb25fRVEsIEpvaW5lZCwgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRpYWdub3N0aWNzLXNob3ctbm90ZS1pbmNsdWRlLXN0YWNrIiwgZmRpYWdub3N0aWNzX3Nob3dfbm90ZV9pbmNsdWRlX3N0YWNrLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkRpc3BsYXkgaW5jbHVkZSBzdGFja3MgZm9yIGRpYWdub3N0aWMgbm90ZXMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRpYWdub3N0aWNzLXNob3ctb3B0aW9uIiwgZmRpYWdub3N0aWNzX3Nob3dfb3B0aW9uLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlByaW50IG9wdGlvbiBuYW1lIHdpdGggbWFwcGFibGUgZGlhZ25vc3RpY3MiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRpYWdub3N0aWNzLXNob3ctdGVtcGxhdGUtdHJlZSIsIGZkaWFnbm9zdGljc19zaG93X3RlbXBsYXRlX3RyZWUsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiUHJpbnQgYSB0ZW1wbGF0ZSBjb21wYXJpc29uIHRyZWUgZm9yIGRpZmZlcmluZyB0ZW1wbGF0ZXMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmRpc2FibGUtbW9kdWxlLWhhc2giLCBmZGlzYWJsZV9tb2R1bGVfaGFzaCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgdGhlIG1vZHVsZSBoYXNoIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZkaXNjYXJkLXZhbHVlLW5hbWVzIiwgZmRpc2NhcmRfdmFsdWVfbmFtZXMsIEZsYWcsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRGlzY2FyZCB2YWx1ZSBuYW1lcyBpbiBMTFZNIElSIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZkb2xsYXItb2siLCBkb2xsYXJfb2tfZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZG9sbGFycy1pbi1pZGVudGlmaWVycyIsIGZkb2xsYXJzX2luX2lkZW50aWZpZXJzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkFsbG93ICckJyBpbiBpZGVudGlmaWVycyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZG91YmxlLXNxdWFyZS1icmFja2V0LWF0dHJpYnV0ZXMiLCBmZG91YmxlX3NxdWFyZV9icmFja2V0X2F0dHJpYnV0ZXMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENDMU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlICdbW11dJyBhdHRyaWJ1dGVzIGluIGFsbCBDIGFuZCBDKysgbGFuZ3VhZ2UgbW9kZXMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmR1bXAtZm9ydHJhbi1vcHRpbWl6ZWQiLCBkdW1wX2ZvcnRyYW5fb3B0aW1pemVkX2YsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmR1bXAtZm9ydHJhbi1vcmlnaW5hbCIsIGR1bXBfZm9ydHJhbl9vcmlnaW5hbF9mLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZkdW1wLXBhcnNlLXRyZWUiLCBkdW1wX3BhcnNlX3RyZWVfZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZHVtcC1yZWNvcmQtbGF5b3V0cy1zaW1wbGUiLCBmZHVtcF9yZWNvcmRfbGF5b3V0c19zaW1wbGUsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEdW1wIHJlY29yZCBsYXlvdXQgaW5mb3JtYXRpb24gaW4gYSBzaW1wbGUgZm9ybSB1c2VkIGZvciB0ZXN0aW5nIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZkdW1wLXJlY29yZC1sYXlvdXRzIiwgZmR1bXBfcmVjb3JkX2xheW91dHMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEdW1wIHJlY29yZCBsYXlvdXQgaW5mb3JtYXRpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmR1bXAtdnRhYmxlLWxheW91dHMiLCBmZHVtcF92dGFibGVfbGF5b3V0cywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkR1bXAgdGhlIGxheW91dHMgb2YgYWxsIHZ0YWJsZXMgdGhhdCB3aWxsIGJlIGVtaXR0ZWQgaW4gYSB0cmFuc2xhdGlvbiB1bml0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZkd2FyZi1kaXJlY3RvcnktYXNtIiwgZmR3YXJmX2RpcmVjdG9yeV9hc20sIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZHdhcmYtZXhjZXB0aW9ucyIsIGZkd2FyZl9leGNlcHRpb25zLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlVzZSBEV0FSRiBzdHlsZSBleGNlcHRpb25zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZkd2FyZjItY2ZpLWFzbSIsIGZkd2FyZjJfY2ZpX2FzbSwgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiRmQiLCBfU0xBU0hfRmQsIEpvaW5lZCwgY2xfaWdub3JlZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBIZWxwSGlkZGVuLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmVsaWRlLWNvbnN0cnVjdG9ycyIsIGZlbGlkZV9jb25zdHJ1Y3RvcnMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZWxpbWluYXRlLXVudXNlZC1kZWJ1Zy1zeW1ib2xzIiwgZmVsaW1pbmF0ZV91bnVzZWRfZGVidWdfc3ltYm9scywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZlbGltaW5hdGUtdW51c2VkLWRlYnVnLXR5cGVzIiwgZWxpbWluYXRlX3VudXNlZF9kZWJ1Z190eXBlc19mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZW1iZWQtYml0Y29kZS1tYXJrZXIiLCBmZW1iZWRfYml0Y29kZV9tYXJrZXIsIEZsYWcsIElOVkFMSUQsIGZlbWJlZF9iaXRjb2RlX0VRLCAibWFya2VyXDAiLCAwLCAwLAorICAgICAgICJFbWJlZCBwbGFjZWhvbGRlciBMTFZNIElSIGRhdGEgYXMgYSBtYXJrZXIiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmVtYmVkLWJpdGNvZGU9IiwgZmVtYmVkX2JpdGNvZGVfRVEsIEpvaW5lZCwgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbWJlZCBMTFZNIGJpdGNvZGUgKG9wdGlvbjogb2ZmLCBhbGwsIGJpdGNvZGUsIG1hcmtlcikiLCAiPG9wdGlvbj4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmVtYmVkLWJpdGNvZGUiLCBmZW1iZWRfYml0Y29kZSwgRmxhZywgZl9Hcm91cCwgZmVtYmVkX2JpdGNvZGVfRVEsICJhbGxcMCIsIDAsIDAsCisgICAgICAgIkVtYmVkIExMVk0gSVIgYml0Y29kZSBhcyBkYXRhIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZlbWl0LWFsbC1kZWNscyIsIGZlbWl0X2FsbF9kZWNscywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbWl0IGFsbCBkZWNsYXJhdGlvbnMsIGV2ZW4gaWYgdW51c2VkIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZlbWl0LWNvdmVyYWdlLWRhdGEiLCBmZW1pdF9jb3ZlcmFnZV9kYXRhLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiSW5zdHJ1bWVudCB0aGUgcHJvZ3JhbSB0byBlbWl0IGdjb3YgY292ZXJhZ2UgZGF0YSB3aGVuIHJ1bi4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmVtaXQtY292ZXJhZ2Utbm90ZXMiLCBmZW1pdF9jb3ZlcmFnZV9ub3RlcywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkVtaXQgYSBnY292IGNvdmVyYWdlIG5vdGVzIGZpbGUgd2hlbiBjb21waWxpbmcuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZlbXVsYXRlZC10bHMiLCBmZW11bGF0ZWRfdGxzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlVzZSBlbXV0bHMgZnVuY3Rpb25zIHRvIGFjY2VzcyB0aHJlYWRfbG9jYWwgdmFyaWFibGVzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZlbmNvZGUtZXh0ZW5kZWQtYmxvY2stc2lnbmF0dXJlIiwgZmVuY29kZV9leHRlbmRlZF9ibG9ja19zaWduYXR1cmUsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJlbmFibGUgZXh0ZW5kZWQgZW5jb2Rpbmcgb2YgYmxvY2sgdHlwZSBzaWduYXR1cmUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmVuY29kaW5nPSIsIGZlbmNvZGluZ19FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmVycm9yLWxpbWl0PSIsIGZlcnJvcl9saW1pdF9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmVycm9yLWxpbWl0IiwgZmVycm9yX2xpbWl0LCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZXJyb3JzIHRvIGVtaXQgYmVmb3JlIHN0b3BwaW5nICgwID0gbm8gbGltaXQpLiIsICI8Tj4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmVzY2FwaW5nLWJsb2NrLXRhaWwtY2FsbHMiLCBmZXNjYXBpbmdfYmxvY2tfdGFpbF9jYWxscywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZleGNlcHRpb25zIiwgZmV4Y2VwdGlvbnMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIHN1cHBvcnQgZm9yIGV4Y2VwdGlvbiBoYW5kbGluZyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZXhjZXNzLXByZWNpc2lvbj0iLCBmZXhjZXNzX3ByZWNpc2lvbl9FUSwgSm9pbmVkLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZleGVjLWNoYXJzZXQ9IiwgZmV4ZWNfY2hhcnNldF9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmV4cGVuc2l2ZS1vcHRpbWl6YXRpb25zIiwgYW5vbnltb3VzXzQsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmV4cGVyaW1lbnRhbC1pc2VsIiwgZmV4cGVyaW1lbnRhbF9pc2VsLCBGbGFnLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJFbmFibGVzIHRoZSBleHBlcmltZW50YWwgZ2xvYmFsIGluc3RydWN0aW9uIHNlbGVjdG9yIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZleHBlcmltZW50YWwtbmV3LXBhc3MtbWFuYWdlciIsIGZleHBlcmltZW50YWxfbmV3X3Bhc3NfbWFuYWdlciwgRmxhZywgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbmFibGVzIGFuIGV4cGVyaW1lbnRhbCBuZXcgcGFzcyBtYW5hZ2VyIGluIExMVk0uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZleHRkaXJzPSIsIGZleHRkaXJzX0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZXh0ZW5kZWQtaWRlbnRpZmllcnMiLCBhbm9ueW1vdXNfOCwgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmV4dGVybmFsLWJsYXMiLCBleHRlcm5hbF9ibGFzX2YsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmV4dGVybmMtbm91bndpbmQiLCBmZXh0ZXJuY19ub3Vud2luZCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkFzc3VtZSBhbGwgZnVuY3Rpb25zIHdpdGggQyBsaW5rYWdlIGRvIG5vdCB1bndpbmQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiRmUiLCBfU0xBU0hfRmUsIEpvaW5lZCwgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIlNldCBvdXRwdXQgZXhlY3V0YWJsZSBmaWxlIG9yIGRpcmVjdG9yeSAoZW5kcyBpbiAvIG9yIFxcKSIsICI8ZmlsZSBvciBkaXJlY3Rvcnk+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZmMmMiLCBmMmNfZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZmFrZS1hZGRyZXNzLXNwYWNlLW1hcCIsIGZmYWtlX2FkZHJlc3Nfc3BhY2VfbWFwLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiVXNlIGEgZmFrZSBhZGRyZXNzIHNwYWNlIG1hcDsgT3BlbkNMIHRlc3RpbmcgcHVycG9zZXMgb25seSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZmFzdC1tYXRoIiwgZmZhc3RfbWF0aCwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJBbGxvdyBhZ2dyZXNzaXZlLCBsb3NzeSBmbG9hdGluZy1wb2ludCBvcHRpbWl6YXRpb25zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZmYXQtbHRvLW9iamVjdHMiLCBmYXRfbHRvX29iamVjdHNfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZmluZS1ncmFpbmVkLWJpdGZpZWxkLWFjY2Vzc2VzIiwgZmZpbmVfZ3JhaW5lZF9iaXRmaWVsZF9hY2Nlc3NlcywgRmxhZywgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJVc2Ugc2VwYXJhdGUgYWNjZXNzZXMgZm9yIGJpdGZpZWxkcyB3aXRoIGxlZ2FsIHdpZHRocyBhbmQgYWxpZ25tZW50cy4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmZpbml0ZS1tYXRoLW9ubHkiLCBmZmluaXRlX21hdGhfb25seSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmZpeGVkLWZvcm0iLCBmaXhlZF9mb3JtX2YsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmZpeGVkLWxpbmUtbGVuZ3RoLSIsIGZmaXhlZF9saW5lX2xlbmd0aF9WQUxVRSwgSm9pbmVkLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZmaXhlZC1yMTkiLCBmZml4ZWRfcjE5LCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJSZXNlcnZlIHRoZSByMTkgcmVnaXN0ZXIgKEhleGFnb24gb25seSkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmZpeGVkLXI5IiwgZmZpeGVkX3I5LCBGbGFnLCBtX2FybV9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiUmVzZXJ2ZSB0aGUgcjkgcmVnaXN0ZXIgKEFSTSBvbmx5KSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZml4ZWQteDE4IiwgZmZpeGVkX3gxOCwgRmxhZywgbV9hYXJjaDY0X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJSZXNlcnZlIHRoZSB4MTggcmVnaXN0ZXIgKEFBcmNoNjQgb25seSkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmZsb2F0LXN0b3JlIiwgZmxvYXRfc3RvcmVfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZm9yLXNjb3BlIiwgZmZvcl9zY29wZSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZmb3JiaWQtZ3VhcmQtdmFyaWFibGVzIiwgZmZvcmJpZF9ndWFyZF92YXJpYWJsZXMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJFbWl0IGFuIGVycm9yIGlmIGEgQysrIHN0YXRpYyBsb2NhbCBpbml0aWFsaXplciB3b3VsZCBuZWVkIGEgZ3VhcmQgdmFyaWFibGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmZvcmNlLWFkZHIiLCBmb3JjZV9hZGRyLCBKb2luZWQsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZmb3JjZS1lbmFibGUtaW50MTI4IiwgZmZvcmNlX2VuYWJsZV9pbnQxMjgsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIHN1cHBvcnQgZm9yIGludDEyOF90IHR5cGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmZwLWNvbnRyYWN0PSIsIGZmcF9jb250cmFjdCwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkZvcm0gZnVzZWQgRlAgb3BzIChlLmcuIEZNQXMpOiBmYXN0IChldmVyeXdoZXJlKSB8IG9uIChhY2NvcmRpbmcgdG8gRlBfQ09OVFJBQ1QgcHJhZ21hLCBkZWZhdWx0KSB8IG9mZiAobmV2ZXIgZnVzZSkiLCBudWxscHRyLCAiZmFzdCxvbixvZmYiKQorT1BUSU9OKHByZWZpeF8xLCAiZmZwZS10cmFwPSIsIGZmcGVfdHJhcF9FUSwgSm9pbmVkLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZmcmVlLWZvcm0iLCBmcmVlX2Zvcm1fZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZnJlZS1saW5lLWxlbmd0aC0iLCBmZnJlZV9saW5lX2xlbmd0aF9WQUxVRSwgSm9pbmVkLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZmcmVlc3RhbmRpbmciLCBmZnJlZXN0YW5kaW5nLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkFzc2VydCB0aGF0IHRoZSBjb21waWxhdGlvbiB0YWtlcyBwbGFjZSBpbiBhIGZyZWVzdGFuZGluZyBlbnZpcm9ubWVudCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZnJpZW5kLWluamVjdGlvbiIsIGZyaWVuZF9pbmplY3Rpb25fZiwgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmZyb250ZW5kLW9wdGltaXplIiwgZnJvbnRlbmRfb3B0aW1pemVfZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZnVuY3Rpb24tYXR0cmlidXRlLWxpc3QiLCBmdW5jdGlvbl9hdHRyaWJ1dGVfbGlzdF9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZnVuY3Rpb24tc2VjdGlvbnMiLCBmZnVuY3Rpb25fc2VjdGlvbnMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiUGxhY2UgZWFjaCBmdW5jdGlvbiBpbiBpdHMgb3duIHNlY3Rpb24gKEVMRiBPbmx5KSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZ2NzZS1hZnRlci1yZWxvYWQiLCBnY3NlX2FmdGVyX3JlbG9hZF9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZnY3NlLWxhcyIsIGdjc2VfbGFzX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmdjc2Utc20iLCBnY3NlX3NtX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmdjc2UiLCBnY3NlX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmdudS1pbmxpbmUtYXNtIiwgZmdudV9pbmxpbmVfYXNtLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZ251LWtleXdvcmRzIiwgZmdudV9rZXl3b3JkcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJBbGxvdyBHTlUtZXh0ZW5zaW9uIGtleXdvcmRzIHJlZ2FyZGxlc3Mgb2YgbGFuZ3VhZ2Ugc3RhbmRhcmQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmdudS1ydW50aW1lIiwgZmdudV9ydW50aW1lLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJHZW5lcmF0ZSBvdXRwdXQgY29tcGF0aWJsZSB3aXRoIHRoZSBzdGFuZGFyZCBHTlUgT2JqZWN0aXZlLUMgcnVudGltZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmZ251ODktaW5saW5lIiwgZmdudTg5X2lubGluZSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJVc2UgdGhlIGdudTg5IGlubGluZSBzZW1hbnRpY3MiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmdudSIsIGdudV9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmaGVpbm91cy1nbnUtZXh0ZW5zaW9ucyIsIGZoZWlub3VzX2dudV9leHRlbnNpb25zLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmaG9ub3ItaW5maW5pdGVzIiwgYW5vbnltb3VzXzEwLCBGbGFnLCBJTlZBTElELCBmaG9ub3JfaW5maW5pdGllcywgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZob25vci1pbmZpbml0aWVzIiwgZmhvbm9yX2luZmluaXRpZXMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmaG9ub3ItbmFucyIsIGZob25vcl9uYW5zLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmhvc3RlZCIsIGZob3N0ZWQsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmaWRlbnQiLCBpZGVudF9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmaWxlbGlzdCIsIGZpbGVsaXN0LCBTZXBhcmF0ZSwgTGlua19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgTGlua2VySW5wdXQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmaWxldHlwZSIsIGZpbGV0eXBlLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxQXNPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiU3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgdHlwZSAoJ2FzbScsICdudWxsJywgb3IgJ29iaicpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZpbXBsZW1lbnQtaW5saW5lcyIsIGltcGxlbWVudF9pbmxpbmVzX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZpbXBsaWNpdC1tb2R1bGUtbWFwcyIsIGZpbXBsaWNpdF9tb2R1bGVfbWFwcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJJbXBsaWNpdGx5IHNlYXJjaCB0aGUgZmlsZSBzeXN0ZW0gZm9yIG1vZHVsZSBtYXAgZmlsZXMuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZpbXBsaWNpdC1tb2R1bGVzIiwgZmltcGxpY2l0X21vZHVsZXMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZpbXBsaWNpdC1ub25lIiwgaW1wbGljaXRfbm9uZV9mLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZpbXBsaWNpdC10ZW1wbGF0ZXMiLCBpbXBsaWNpdF90ZW1wbGF0ZXNfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmluY2x1ZGUtZGVmYXVsdC1oZWFkZXIiLCBmaW5jbHVkZV9kZWZhdWx0X2hlYWRlciwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkluY2x1ZGUgdGhlIGRlZmF1bHQgaGVhZGVyIGZpbGUgZm9yIE9wZW5DTCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmaW5kLXBjaC1zb3VyY2U9IiwgZmluZF9wY2hfc291cmNlX0VRLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJXaGVuIGJ1aWxkaW5nIGEgcGNoLCB0cnkgdG8gZmluZCB0aGUgaW5wdXQgZmlsZSBpbiBpbmNsdWRlIGRpcmVjdG9yaWVzLCBhcyBpZiBpdCBoYWQgYmVlbiBpbmNsdWRlZCBieSB0aGUgYXJndW1lbnQgcGFzc2VkIHRvIHRoaXMgZmxhZy4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmluZGlyZWN0LXZpcnR1YWwtY2FsbHMiLCBhbm9ueW1vdXNfMTIsIEZsYWcsIElOVkFMSUQsIGZhcHBsZV9rZXh0LCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmluaXQtY2hhcmFjdGVyPSIsIGZpbml0X2NoYXJhY3Rlcl9FUSwgSm9pbmVkLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZpbml0LWludGVnZXI9IiwgZmluaXRfaW50ZWdlcl9FUSwgSm9pbmVkLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZpbml0LWxvY2FsLXplcm8iLCBpbml0X2xvY2FsX3plcm9fZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmaW5pdC1sb2dpY2FsPSIsIGZpbml0X2xvZ2ljYWxfRVEsIEpvaW5lZCwgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmaW5pdC1yZWFsPSIsIGZpbml0X3JlYWxfRVEsIEpvaW5lZCwgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmaW5saW5lLWZ1bmN0aW9ucy1jYWxsZWQtb25jZSIsIGlubGluZV9mdW5jdGlvbnNfY2FsbGVkX29uY2VfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmaW5saW5lLWZ1bmN0aW9ucyIsIGZpbmxpbmVfZnVuY3Rpb25zLCBGbGFnLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIklubGluZSBzdWl0YWJsZSBmdW5jdGlvbnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmlubGluZS1oaW50LWZ1bmN0aW9ucyIsIGZpbmxpbmVfaGludF9mdW5jdGlvbnMsIEZsYWcsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiSW5saW5lIGZ1bmN0aW9ucyB3aGljaCBhcmUgKGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSkgbWFya2VkIGlubGluZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmaW5saW5lLWxpbWl0PSIsIGZpbmxpbmVfbGltaXRfRVEsIEpvaW5lZCwgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmaW5saW5lLWxpbWl0IiwgZmlubGluZV9saW1pdF9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZpbmxpbmUtc21hbGwtZnVuY3Rpb25zIiwgaW5saW5lX3NtYWxsX2Z1bmN0aW9uc19mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZpbmxpbmUiLCBmaW5saW5lLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmaW5wdXQtY2hhcnNldD0iLCBmaW5wdXRfY2hhcnNldF9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmluc3RydW1lbnQtZnVuY3Rpb24tZW50cnktYmFyZSIsIGZpbnN0cnVtZW50X2Z1bmN0aW9uX2VudHJ5X2JhcmUsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiSW5zdHJ1bWVudCBmdW5jdGlvbiBlbnRyeSBvbmx5LCBhZnRlciBpbmxpbmluZywgd2l0aG91dCBhcmd1bWVudHMgdG8gdGhlIGluc3RydW1lbnRhdGlvbiBjYWxsIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZpbnN0cnVtZW50LWZ1bmN0aW9ucy1hZnRlci1pbmxpbmluZyIsIGZpbnN0cnVtZW50X2Z1bmN0aW9uc19hZnRlcl9pbmxpbmluZywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJMaWtlIC1maW5zdHJ1bWVudC1mdW5jdGlvbnMsIGJ1dCBpbnNlcnQgdGhlIGNhbGxzIGFmdGVyIGlubGluaW5nIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZpbnN0cnVtZW50LWZ1bmN0aW9ucyIsIGZpbnN0cnVtZW50X2Z1bmN0aW9ucywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJHZW5lcmF0ZSBjYWxscyB0byBpbnN0cnVtZW50IGZ1bmN0aW9uIGVudHJ5IGFuZCBleGl0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZpbnRlZ2VyLTQtaW50ZWdlci04IiwgaW50ZWdlcl80X2ludGVnZXJfOF9mLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZpbnRlZ3JhdGVkLWFzIiwgZmludGVncmF0ZWRfYXMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIHRoZSBpbnRlZ3JhdGVkIGFzc2VtYmxlciIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmaW50cmluc2ljLW1vZHVsZXMtcGF0aCIsIGludHJpbnNpY19tb2R1bGVzX3BhdGhfZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmaXBhLWNwIiwgaXBhX2NwX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZml2b3B0cyIsIGl2b3B0c19mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZpeC1vbmx5LXdhcm5pbmdzIiwgZml4X29ubHlfd2FybmluZ3MsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJBcHBseSBmaXgtaXQgYWR2aWNlIG9ubHkgZm9yIHdhcm5pbmdzLCBub3QgZXJyb3JzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZpeC13aGF0LXlvdS1jYW4iLCBmaXhfd2hhdF95b3VfY2FuLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiQXBwbHkgZml4LWl0IGFkdmljZSBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiB1bmZpeGFibGUgZXJyb3JzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZpeGl0LXJlY29tcGlsZSIsIGZpeGl0X3JlY29tcGlsZSwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkFwcGx5IGZpeC1pdCBjaGFuZ2VzIGFuZCByZWNvbXBpbGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZml4aXQtdG8tdGVtcG9yYXJ5IiwgZml4aXRfdG9fdGVtcCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkFwcGx5IGZpeC1pdCBjaGFuZ2VzIHRvIHRlbXBvcmFyeSBmaWxlcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmaXhpdD0iLCBmaXhpdF9FUSwgSm9pbmVkLCBBY3Rpb25fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJBcHBseSBmaXgtaXQgYWR2aWNlIGNyZWF0aW5nIGEgZmlsZSB3aXRoIHRoZSBnaXZlbiBzdWZmaXgiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZml4aXQiLCBmaXhpdCwgRmxhZywgQWN0aW9uX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiQXBwbHkgZml4LWl0IGFkdmljZSB0byB0aGUgaW5wdXQgc291cmNlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkZJIiwgX1NMQVNIX0ZJLCBKb2luZWRPclNlcGFyYXRlLCBjbF9Hcm91cCwgaW5jbHVkZSwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiSW5jbHVkZSBmaWxlIGJlZm9yZSBwYXJzaW5nIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkZpIiwgX1NMQVNIX0ZpLCBKb2luZWQsIGNsX2NvbXBpbGVfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJTZXQgcHJlcHJvY2VzcyBvdXRwdXQgZmlsZSBuYW1lICh3aXRoIC9QKSIsICI8ZmlsZT4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmp1bXAtdGFibGVzIiwgZmp1bXBfdGFibGVzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmtlZXAtaW5saW5lLWZ1bmN0aW9ucyIsIGFub255bW91c18yNl9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZsYXRfbmFtZXNwYWNlIiwgZmxhdF9fbmFtZXNwYWNlLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmxheC12ZWN0b3ItY29udmVyc2lvbnMiLCBmbGF4X3ZlY3Rvcl9jb252ZXJzaW9ucywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZsaW1pdC1kZWJ1Zy1pbmZvIiwgZmxpbWl0X2RlYnVnX2luZm8sIEZsYWcsIElOVkFMSUQsIGZub19zdGFuZGFsb25lX2RlYnVnLCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmxpbWl0ZWQtcHJlY2lzaW9uPSIsIGZsaW1pdGVkX3ByZWNpc2lvbl9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZmx0by1qb2JzPSIsIGZsdG9fam9ic19FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkNvbnRyb2xzIHRoZSBiYWNrZW5kIHBhcmFsbGVsaXNtIG9mIC1mbHRvPXRoaW4gKGRlZmF1bHQgb2YgMCBtZWFucyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgd2lsbCBiZSBkZXJpdmVkIGZyb20gdGhlIG51bWJlciBvZiBDUFVzIGRldGVjdGVkKSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbHRvLXVuaXQiLCBmbHRvX3VuaXQsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJFbWl0IElSIHRvIHN1cHBvcnQgTFRPIHVuaXQgZmVhdHVyZXMgKENGSSwgd2hvbGUgcHJvZ3JhbSB2dGFibGUgb3B0KSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbHRvLXZpc2liaWxpdHktcHVibGljLXN0ZCIsIGZsdG9fdmlzaWJpbGl0eV9wdWJsaWNfc3RkLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiVXNlIHB1YmxpYyBMVE8gdmlzaWJpbGl0eSBmb3IgY2xhc3NlcyBpbiBzdGQgYW5kIHN0ZGV4dCBuYW1lc3BhY2VzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZsdG89IiwgZmx0b19FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uIHwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJTZXQgTFRPIG1vZGUgdG8gZWl0aGVyICdmdWxsJyBvciAndGhpbiciLCBudWxscHRyLCAidGhpbixmdWxsIikKK09QVElPTihwcmVmaXhfMSwgImZsdG8iLCBmbHRvLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uIHwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgTFRPIGluICdmdWxsJyBtb2RlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtYWNyby1iYWNrdHJhY2UtbGltaXQ9IiwgZm1hY3JvX2JhY2t0cmFjZV9saW1pdF9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm1hY3JvLWJhY2t0cmFjZS1saW1pdCIsIGZtYWNyb19iYWNrdHJhY2VfbGltaXQsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRvIHByaW50IGluIGEgbWFjcm8gZXhwYW5zaW9uIGJhY2t0cmFjZSAoMCA9IG5vIGxpbWl0KS4iLCAiPE4+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtYXRoLWVycm5vIiwgZm1hdGhfZXJybm8sIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiUmVxdWlyZSBtYXRoIGZ1bmN0aW9ucyB0byBpbmRpY2F0ZSBlcnJvcnMgYnkgc2V0dGluZyBlcnJubyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbWF4LWFycmF5LWNvbnN0cnVjdG9yPSIsIGZtYXhfYXJyYXlfY29uc3RydWN0b3JfRVEsIEpvaW5lZCwgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbWF4LWVycm9ycz0iLCBmbWF4X2Vycm9yc19FUSwgSm9pbmVkLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtYXgtaWRlbnRpZmllci1sZW5ndGgiLCBtYXhfaWRlbnRpZmllcl9sZW5ndGhfZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbWF4LXN0YWNrLXZhci1zaXplPSIsIGZtYXhfc3RhY2tfdmFyX3NpemVfRVEsIEpvaW5lZCwgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbWF4LXN1YnJlY29yZC1sZW5ndGg9IiwgZm1heF9zdWJyZWNvcmRfbGVuZ3RoX0VRLCBKb2luZWQsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm1heC10eXBlLWFsaWduPSIsIGZtYXhfdHlwZV9hbGlnbl9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlNwZWNpZnkgdGhlIG1heGltdW0gYWxpZ25tZW50IHRvIGVuZm9yY2Ugb24gcG9pbnRlcnMgbGFja2luZyBhbiBleHBsaWNpdCBhbGlnbm1lbnQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm1lcmdlLWFsbC1jb25zdGFudHMiLCBmbWVyZ2VfYWxsX2NvbnN0YW50cywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJBbGxvdyBtZXJnaW5nIG9mIGNvbnN0YW50cyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbWVyZ2UtY29uc3RhbnRzIiwgbWVyZ2VfY29uc3RhbnRzX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm1lcmdlLWZ1bmN0aW9ucyIsIGZtZXJnZV9mdW5jdGlvbnMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJQZXJtaXQgbWVyZ2luZyBvZiBpZGVudGljYWwgZnVuY3Rpb25zIHdoZW4gb3B0aW1pemluZy4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm1lc3NhZ2UtbGVuZ3RoPSIsIGZtZXNzYWdlX2xlbmd0aF9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm1lc3NhZ2UtbGVuZ3RoIiwgZm1lc3NhZ2VfbGVuZ3RoLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkZvcm1hdCBtZXNzYWdlIGRpYWdub3N0aWNzIHNvIHRoYXQgdGhleSBmaXQgd2l0aGluIE4gY29sdW1ucyBvciBmZXdlciwgd2hlbiBwb3NzaWJsZS4iLCAiPE4+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtb2R1bGUtZmVhdHVyZSIsIGZtb2R1bGVfZmVhdHVyZSwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgPGZlYXR1cmU+IGluIG1vZHVsZSBtYXAgcmVxdWlyZXMgZGVjbGFyYXRpb25zIiwgIjxmZWF0dXJlPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbW9kdWxlLWZpbGUtZGVwcyIsIGZtb2R1bGVfZmlsZV9kZXBzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbW9kdWxlLWZpbGU9IiwgZm1vZHVsZV9maWxlLCBKb2luZWQsIGlfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENDMU9wdGlvbiwgMCwKKyAgICAgICAiU3BlY2lmeSB0aGUgbWFwcGluZyBvZiBtb2R1bGUgbmFtZSB0byBwcmVjb21waWxlZCBtb2R1bGUgZmlsZSwgb3IgbG9hZCBhIG1vZHVsZSBmaWxlIGlmIG5hbWUgaXMgb21pdHRlZC4iLCAiWzxuYW1lPj1dPGZpbGU+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtb2R1bGUtZm9ybWF0PSIsIGZtb2R1bGVfZm9ybWF0X0VRLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJTZWxlY3QgdGhlIGNvbnRhaW5lciBmb3JtYXQgZm9yIGNsYW5nIG1vZHVsZXMgYW5kIFBDSC4gU3VwcG9ydGVkIG9wdGlvbnMgYXJlICdyYXcnIGFuZCAnb2JqJy4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm1vZHVsZS1pbXBsZW1lbnRhdGlvbi1vZiIsIGZtb2R1bGVfaW1wbGVtZW50YXRpb25fb2YsIFNlcGFyYXRlLCBJTlZBTElELCBmbW9kdWxlX25hbWVfRVEsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtb2R1bGUtbWFwLWZpbGUtaG9tZS1pcy1jd2QiLCBmbW9kdWxlX21hcF9maWxlX2hvbWVfaXNfY3dkLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiVXNlIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGFzIHRoZSBob21lIGRpcmVjdG9yeSBvZiBtb2R1bGUgbWFwcyBzcGVjaWZpZWQgYnkgLWZtb2R1bGUtbWFwLWZpbGU9PEZJTEU+IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtb2R1bGUtbWFwLWZpbGU9IiwgZm1vZHVsZV9tYXBfZmlsZSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBDQzFPcHRpb24sIDAsCisgICAgICAgIkxvYWQgdGhpcyBtb2R1bGUgbWFwIGZpbGUiLCAiPGZpbGU+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtb2R1bGUtbWFwcyIsIGZtb2R1bGVfbWFwcywgRmxhZywgSU5WQUxJRCwgZmltcGxpY2l0X21vZHVsZV9tYXBzLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm1vZHVsZS1uYW1lPSIsIGZtb2R1bGVfbmFtZV9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBDQzFPcHRpb24sIDAsCisgICAgICAgIlNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBidWlsZCIsICI8bmFtZT4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm1vZHVsZS1uYW1lIiwgZm1vZHVsZV9uYW1lLCBTZXBhcmF0ZSwgSU5WQUxJRCwgZm1vZHVsZV9uYW1lX0VRLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm1vZHVsZS1wcml2YXRlIiwgbW9kdWxlX3ByaXZhdGVfZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbW9kdWxlcy1jYWNoZS1wYXRoPSIsIGZtb2R1bGVzX2NhY2hlX3BhdGgsIEpvaW5lZCwgaV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJTcGVjaWZ5IHRoZSBtb2R1bGUgY2FjaGUgcGF0aCIsICI8ZGlyZWN0b3J5PiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbW9kdWxlcy1jb2RlZ2VuIiwgZm1vZHVsZXNfY29kZWdlbiwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkdlbmVyYXRlIGNvZGUgZm9yIHVzZXMgb2YgdGhpcyBtb2R1bGUgdGhhdCBhc3N1bWVzIGFuIGV4cGxpY2l0IG9iamVjdCBmaWxlIHdpbGwgYmUgYnVpbHQgZm9yIHRoZSBtb2R1bGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm1vZHVsZXMtZGVidWdpbmZvIiwgZm1vZHVsZXNfZGVidWdpbmZvLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiR2VuZXJhdGUgZGVidWcgaW5mbyBmb3IgdHlwZXMgaW4gYW4gb2JqZWN0IGZpbGUgYnVpbHQgZnJvbSB0aGlzIG1vZHVsZSBhbmQgZG8gbm90IGdlbmVyYXRlIHRoZW0gZWxzZXdoZXJlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtb2R1bGVzLWRlY2x1c2UiLCBmbW9kdWxlc19kZWNsdXNlLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBDQzFPcHRpb24sIDAsCisgICAgICAgIlJlcXVpcmUgZGVjbGFyYXRpb24gb2YgbW9kdWxlcyB1c2VkIHdpdGhpbiBhIG1vZHVsZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbW9kdWxlcy1kaXNhYmxlLWRpYWdub3N0aWMtdmFsaWRhdGlvbiIsIGZtb2R1bGVzX2Rpc2FibGVfZGlhZ25vc3RpY192YWxpZGF0aW9uLCBGbGFnLCBpX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgdmFsaWRhdGlvbiBvZiB0aGUgZGlhZ25vc3RpYyBvcHRpb25zIHdoZW4gbG9hZGluZyB0aGUgbW9kdWxlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtb2R1bGVzLWVtYmVkLWFsbC1maWxlcyIsIGZtb2R1bGVzX2VtYmVkX2FsbF9maWxlcywgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRW1iZWQgdGhlIGNvbnRlbnRzIG9mIGFsbCBmaWxlcyByZWFkIGJ5IHRoaXMgY29tcGlsYXRpb24gaW50byB0aGUgcHJvZHVjZWQgbW9kdWxlIGZpbGUuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtb2R1bGVzLWVtYmVkLWZpbGU9IiwgZm1vZHVsZXNfZW1iZWRfZmlsZV9FUSwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRW1iZWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSBpbnRvIHRoZSBtb2R1bGUgZmlsZSBiZWluZyBjb21waWxlZC4iLCAiPGZpbGU+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtb2R1bGVzLWhhc2gtY29udGVudCIsIGZtb2R1bGVzX2hhc2hfY29udGVudCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBoYXNoaW5nIHRoZSBjb250ZW50IG9mIGEgbW9kdWxlIGZpbGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm1vZHVsZXMtaWdub3JlLW1hY3JvPSIsIGZtb2R1bGVzX2lnbm9yZV9tYWNybywgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIklnbm9yZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZ2l2ZW4gbWFjcm8gd2hlbiBidWlsZGluZyBhbmQgbG9hZGluZyBtb2R1bGVzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtb2R1bGVzLWxvY2FsLXN1Ym1vZHVsZS12aXNpYmlsaXR5IiwgZm1vZHVsZXNfbG9jYWxfc3VibW9kdWxlX3Zpc2liaWxpdHksIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJFbmZvcmNlIG5hbWUgdmlzaWJpbGl0eSBydWxlcyBhY3Jvc3Mgc3VibW9kdWxlcyBvZiB0aGUgc2FtZSB0b3AtbGV2ZWwgbW9kdWxlLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbW9kdWxlcy1wcnVuZS1hZnRlcj0iLCBmbW9kdWxlc19wcnVuZV9hZnRlciwgSm9pbmVkLCBpX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlNwZWNpZnkgdGhlIGludGVydmFsIChpbiBzZWNvbmRzKSBhZnRlciB3aGljaCBhIG1vZHVsZSBmaWxlIHdpbGwgYmUgY29uc2lkZXJlZCB1bnVzZWQiLCAiPHNlY29uZHM+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtb2R1bGVzLXBydW5lLWludGVydmFsPSIsIGZtb2R1bGVzX3BydW5lX2ludGVydmFsLCBKb2luZWQsIGlfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiU3BlY2lmeSB0aGUgaW50ZXJ2YWwgKGluIHNlY29uZHMpIGJldHdlZW4gYXR0ZW1wdHMgdG8gcHJ1bmUgdGhlIG1vZHVsZSBjYWNoZSIsICI8c2Vjb25kcz4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm1vZHVsZXMtc2VhcmNoLWFsbCIsIGZtb2R1bGVzX3NlYXJjaF9hbGwsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENDMU9wdGlvbiwgMCwKKyAgICAgICAiU2VhcmNoIGV2ZW4gbm9uLWltcG9ydGVkIG1vZHVsZXMgdG8gcmVzb2x2ZSByZWZlcmVuY2VzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtb2R1bGVzLXN0cmljdC1kZWNsdXNlIiwgZm1vZHVsZXNfc3RyaWN0X2RlY2x1c2UsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENDMU9wdGlvbiwgMCwKKyAgICAgICAiTGlrZSAtZm1vZHVsZXMtZGVjbHVzZSBidXQgcmVxdWlyZXMgYWxsIGhlYWRlcnMgdG8gYmUgaW4gbW9kdWxlcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbW9kdWxlcy10cyIsIGZtb2R1bGVzX3RzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBzdXBwb3J0IGZvciB0aGUgQysrIE1vZHVsZXMgVFMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm1vZHVsZXMtdXNlci1idWlsZC1wYXRoIiwgZm1vZHVsZXNfdXNlcl9idWlsZF9wYXRoLCBTZXBhcmF0ZSwgaV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJTcGVjaWZ5IHRoZSBtb2R1bGUgdXNlciBidWlsZCBwYXRoIiwgIjxkaXJlY3Rvcnk+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtb2R1bGVzLXZhbGlkYXRlLW9uY2UtcGVyLWJ1aWxkLXNlc3Npb24iLCBmbW9kdWxlc192YWxpZGF0ZV9vbmNlX3Blcl9idWlsZF9zZXNzaW9uLCBGbGFnLCBpX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkRvbid0IHZlcmlmeSBpbnB1dCBmaWxlcyBmb3IgdGhlIG1vZHVsZXMgaWYgdGhlIG1vZHVsZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdmFsaWRhdGVkIG9yIGxvYWRlZCBkdXJpbmcgdGhpcyBidWlsZCBzZXNzaW9uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtb2R1bGVzLXZhbGlkYXRlLXN5c3RlbS1oZWFkZXJzIiwgZm1vZHVsZXNfdmFsaWRhdGVfc3lzdGVtX2hlYWRlcnMsIEZsYWcsIGlfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiVmFsaWRhdGUgdGhlIHN5c3RlbSBoZWFkZXJzIHRoYXQgYSBtb2R1bGUgZGVwZW5kcyBvbiB3aGVuIGxvYWRpbmcgdGhlIG1vZHVsZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbW9kdWxlcyIsIGZtb2R1bGVzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSB0aGUgJ21vZHVsZXMnIGxhbmd1YWdlIGZlYXR1cmUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm1vZHVsby1zY2hlZC1hbGxvdy1yZWdtb3ZlcyIsIG1vZHVsb19zY2hlZF9hbGxvd19yZWdtb3Zlc19mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtb2R1bG8tc2NoZWQiLCBtb2R1bG9fc2NoZWRfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbXMtY29tcGF0aWJpbGl0eS12ZXJzaW9uPSIsIGZtc19jb21wYXRpYmlsaXR5X3ZlcnNpb24sIEpvaW5lZCwgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiRG90LXNlcGFyYXRlZCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIE1pY3Jvc29mdCBjb21waWxlciB2ZXJzaW9uIG51bWJlciB0byByZXBvcnQgaW4gX01TQ19WRVIgKDAgPSBkb24ndCBkZWZpbmUgaXQgKGRlZmF1bHQpKSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbXMtY29tcGF0aWJpbGl0eSIsIGZtc19jb21wYXRpYmlsaXR5LCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgZnVsbCBNaWNyb3NvZnQgVmlzdWFsIEMrKyBjb21wYXRpYmlsaXR5IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtcy1leHRlbnNpb25zIiwgZm1zX2V4dGVuc2lvbnMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIkFjY2VwdCBzb21lIG5vbi1zdGFuZGFyZCBjb25zdHJ1Y3RzIHN1cHBvcnRlZCBieSB0aGUgTWljcm9zb2Z0IGNvbXBpbGVyIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtcy1tZW1wdHItcmVwPSIsIGZtc19tZW1wdHJfcmVwX0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtcy12b2xhdGlsZSIsIGZtc192b2xhdGlsZSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbXNjLXZlcnNpb249IiwgZm1zY192ZXJzaW9uLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIk1pY3Jvc29mdCBjb21waWxlciB2ZXJzaW9uIG51bWJlciB0byByZXBvcnQgaW4gX01TQ19WRVIgKDAgPSBkb24ndCBkZWZpbmUgaXQgKGRlZmF1bHQpKSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbXVkZmxhcHRoIiwgZm11ZGZsYXB0aCwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZtdWRmbGFwIiwgZm11ZGZsYXAsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJGbSIsIF9TTEFTSF9GbSwgSm9pbmVkLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuYXRpdmUtaGFsZi1hcmd1bWVudHMtYW5kLXJldHVybnMiLCBmbmF0aXZlX2hhbGZfYXJndW1lbnRzX2FuZF9yZXR1cm5zLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiVXNlIHRoZSBuYXRpdmUgX19mcDE2IHR5cGUgZm9yIGFyZ3VtZW50cyBhbmQgcmV0dXJucyAoYW5kIHNraXAgQUJJLXNwZWNpZmljIGxvd2VyaW5nKSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbmF0aXZlLWhhbGYtdHlwZSIsIGZuYXRpdmVfaGFsZl90eXBlLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiVXNlIHRoZSBuYXRpdmUgaGFsZiB0eXBlIGZvciBfX2ZwMTYgaW5zdGVhZCBvZiBwcm9tb3RpbmcgdG8gZmxvYXQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5lc3RlZC1mdW5jdGlvbnMiLCBmbmVzdGVkX2Z1bmN0aW9ucywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuZXctYWxpZ25tZW50PSIsIGZuZXdfYWxpZ25tZW50X0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiU3BlY2lmaWVzIHRoZSBsYXJnZXN0IGFsaWdubWVudCBndWFyYW50ZWVkIGJ5ICc6Om9wZXJhdG9yIG5ldyhzaXplX3QpJyIsICI8YWxpZ24+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuZXctYWxpZ25tZW50IiwgYW5vbnltb3VzXzEzLCBTZXBhcmF0ZSwgSU5WQUxJRCwgZm5ld19hbGlnbm1lbnRfRVEsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbmV4dC1ydW50aW1lIiwgZm5leHRfcnVudGltZSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1hY2Nlc3MtY29udHJvbCIsIGZub19hY2Nlc3NfY29udHJvbCwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIEMrKyBhY2Nlc3MgY29udHJvbCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tYWdncmVzc2l2ZS1mdW5jdGlvbi1lbGltaW5hdGlvbiIsIGFnZ3Jlc3NpdmVfZnVuY3Rpb25fZWxpbWluYXRpb25fZm5vLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1hbGlnbi1jb21tb25zIiwgYWxpZ25fY29tbW9uc19mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWFsaWduLWZ1bmN0aW9ucyIsIGFsaWduX2Z1bmN0aW9uc19mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWFsaWduLWp1bXBzIiwgYWxpZ25fanVtcHNfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1hbGlnbi1sYWJlbHMiLCBhbGlnbl9sYWJlbHNfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1hbGlnbi1sb29wcyIsIGFsaWduX2xvb3BzX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tYWxpZ25lZC1hbGxvY2F0aW9uIiwgZm5vX2FsaWduZWRfYWxsb2NhdGlvbiwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWFsaWduZWQtbmV3IiwgYW5vbnltb3VzXzE1LCBGbGFnLCBJTlZBTElELCBmbm9fYWxpZ25lZF9hbGxvY2F0aW9uLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWFsbC1pbnRyaW5zaWNzIiwgYWxsX2ludHJpbnNpY3NfZm5vLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1hbGxvdy1lZGl0b3ItcGxhY2Vob2xkZXJzIiwgZm5vX2FsbG93X2VkaXRvcl9wbGFjZWhvbGRlcnMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tYWx0aXZlYyIsIGZub19hbHRpdmVjLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tYXBwbGUtcHJhZ21hLXBhY2siLCBmbm9fYXBwbGVfcHJhZ21hX3BhY2ssIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tYXBwbGljYXRpb24tZXh0ZW5zaW9uIiwgZm5vX2FwcGxpY2F0aW9uX2V4dGVuc2lvbiwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1hc20tYmxvY2tzIiwgZm5vX2FzbV9ibG9ja3MsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tYXNtIiwgZm5vX2FzbSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1hc3NvY2lhdGl2ZS1tYXRoIiwgZm5vX2Fzc29jaWF0aXZlX21hdGgsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tYXNzdW1lLXNhbmUtb3BlcmF0b3ItbmV3IiwgZm5vX2Fzc3VtZV9zYW5lX29wZXJhdG9yX25ldywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJEb24ndCBhc3N1bWUgdGhhdCBDKysncyBnbG9iYWwgb3BlcmF0b3IgbmV3IGNhbid0IGFsaWFzIGFueSBwb2ludGVyIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyIsIGZub19hc3luY2hyb25vdXNfdW53aW5kX3RhYmxlcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1hdXRvLXByb2ZpbGUtYWNjdXJhdGUiLCBmbm9fYXV0b19wcm9maWxlX2FjY3VyYXRlLCBGbGFnLCBmX0dyb3VwLCBmbm9fcHJvZmlsZV9zYW1wbGVfYWNjdXJhdGUsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tYXV0by1wcm9maWxlIiwgZm5vX2F1dG9fcHJvZmlsZSwgRmxhZywgZl9Hcm91cCwgZm5vX3Byb2ZpbGVfc2FtcGxlX3VzZSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1hdXRvbGluayIsIGZub19hdXRvbGluaywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIGdlbmVyYXRpb24gb2YgbGlua2VyIGRpcmVjdGl2ZXMgZm9yIGF1dG9tYXRpYyBsaWJyYXJ5IGxpbmtpbmciLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWF1dG9tYXRpYyIsIGF1dG9tYXRpY19mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWJhY2tzbGFzaCIsIGJhY2tzbGFzaF9mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWJhY2t0cmFjZSIsIGJhY2t0cmFjZV9mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWJpdGZpZWxkLXR5cGUtYWxpZ24iLCBmbm9fYml0ZmllbGRfdHlwZV9hbGlnbiwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIklnbm9yZSBiaXQtZmllbGQgdHlwZXMgd2hlbiBhbGlnbmluZyBzdHJ1Y3R1cmVzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1ibG9ja3MiLCBmbm9fYmxvY2tzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWJvcmxhbmQtZXh0ZW5zaW9ucyIsIGZub19ib3JsYW5kX2V4dGVuc2lvbnMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tYm91bmRzLWNoZWNrIiwgYm91bmRzX2NoZWNrX2ZubywgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tYnJhbmNoLWNvdW50LXJlZyIsIGJyYW5jaF9jb3VudF9yZWdfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1idWlsdGluLSIsIGZub19idWlsdGluXywgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgaW1wbGljaXQgYnVpbHRpbiBrbm93bGVkZ2Ugb2YgYSBzcGVjaWZpYyBmdW5jdGlvbiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tYnVpbHRpbiIsIGZub19idWlsdGluLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgaW1wbGljaXQgYnVpbHRpbiBrbm93bGVkZ2Ugb2YgZnVuY3Rpb25zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1jYWxsZXItc2F2ZXMiLCBjYWxsZXJfc2F2ZXNfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1jYXJldC1kaWFnbm9zdGljcyIsIGZub19jYXJldF9kaWFnbm9zdGljcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWNoZWNrLWFycmF5LXRlbXBvcmFyaWVzIiwgY2hlY2tfYXJyYXlfdGVtcG9yYXJpZXNfZm5vLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1jaGVjay1uZXciLCBmY2hlY2tfbmV3X2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWNvbG9yLWRpYWdub3N0aWNzIiwgZm5vX2NvbG9yX2RpYWdub3N0aWNzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uIHwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWNvbW1vbiIsIGZub19jb21tb24sIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiQ29tcGlsZSBjb21tb24gZ2xvYmFscyBsaWtlIG5vcm1hbCBkZWZpbml0aW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tY29uc3Qtc3RyaW5ncyIsIGZub19jb25zdF9zdHJpbmdzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRG9uJ3QgdXNlIGEgY29uc3QgcXVhbGlmaWVkIHR5cGUgZm9yIHN0cmluZyBsaXRlcmFscyBpbiBDIGFuZCBPYmpDIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1jb25zdGFudC1jZnN0cmluZ3MiLCBmbm9fY29uc3RhbnRfY2ZzdHJpbmdzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgY3JlYXRpb24gb2YgQ29kZUZvdW5kYXRpb24tdHlwZSBjb25zdGFudCBzdHJpbmdzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1jb3JvdXRpbmVzLXRzIiwgZm5vX2Nvcm91dGluZXNfdHMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1jb3ZlcmFnZS1tYXBwaW5nIiwgZm5vX2NvdmVyYWdlX21hcHBpbmcsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSBjb2RlIGNvdmVyYWdlIGFuYWx5c2lzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1jcmFzaC1kaWFnbm9zdGljcyIsIGZub19jcmFzaF9kaWFnbm9zdGljcywgRmxhZywgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgTm9Bcmd1bWVudFVudXNlZCwgMCwKKyAgICAgICAiRGlzYWJsZSBhdXRvLWdlbmVyYXRpb24gb2YgcHJlcHJvY2Vzc2VkIHNvdXJjZSBmaWxlcyBhbmQgYSBzY3JpcHQgZm9yIHJlcHJvZHVjdGlvbiBkdXJpbmcgYSBjbGFuZyBjcmFzaCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tY3JheS1wb2ludGVyIiwgY3JheV9wb2ludGVyX2ZubywgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tY3VkYS1hcHByb3gtdHJhbnNjZW5kZW50YWxzIiwgZm5vX2N1ZGFfYXBwcm94X3RyYW5zY2VuZGVudGFscywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1jdWRhLWZsdXNoLWRlbm9ybWFscy10by16ZXJvIiwgZm5vX2N1ZGFfZmx1c2hfZGVub3JtYWxzX3RvX3plcm8sIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tY3VkYS1ob3N0LWRldmljZS1jb25zdGV4cHIiLCBmbm9fY3VkYV9ob3N0X2RldmljZV9jb25zdGV4cHIsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEb24ndCB0cmVhdCB1bmF0dHJpYnV0ZWQgY29uc3RleHByIGZ1bmN0aW9ucyBhcyBfX2hvc3RfXyBfX2RldmljZV9fLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tY3VkYS1yZGMiLCBmbm9fY3VkYV9yZGMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tY3h4LWV4Y2VwdGlvbnMiLCBmbm9fY3h4X2V4Y2VwdGlvbnMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tY3h4LW1vZHVsZXMiLCBmbm9fY3h4X21vZHVsZXMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1kLWxpbmVzLWFzLWNvZGUiLCBkX2xpbmVzX2FzX2NvZGVfZm5vLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1kLWxpbmVzLWFzLWNvbW1lbnRzIiwgZF9saW5lc19hc19jb21tZW50c19mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWRhdGEtc2VjdGlvbnMiLCBmbm9fZGF0YV9zZWN0aW9ucywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWRlYnVnLWluZm8tZm9yLXByb2ZpbGluZyIsIGZub19kZWJ1Z19pbmZvX2Zvcl9wcm9maWxpbmcsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRG8gbm90IGVtaXQgZXh0cmEgZGVidWcgaW5mbyBmb3Igc2FtcGxlIHByb2ZpbGVyLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZGVidWctbWFjcm8iLCBmbm9fZGVidWdfbWFjcm8sIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsCisgICAgICAgIkRvIG5vdCBlbWl0IG1hY3JvIGRlYnVnIGluZm9ybWF0aW9uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1kZWJ1Zy1wYXNzLW1hbmFnZXIiLCBmbm9fZGVidWdfcGFzc19tYW5hZ2VyLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZXMgZGVidWcgcHJpbnRpbmcgZm9yIHRoZSBuZXcgcGFzcyBtYW5hZ2VyIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1kZWJ1Zy10eXBlcy1zZWN0aW9uIiwgZm5vX2RlYnVnX3R5cGVzX3NlY3Rpb24sIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1kZWNsc3BlYyIsIGZub19kZWNsc3BlYywgRmxhZywgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJEaXNhbGxvdyBfX2RlY2xzcGVjIGFzIGEga2V5d29yZCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZGVmYXVsdC1kb3VibGUtOCIsIGRlZmF1bHRfZG91YmxlXzhfZm5vLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1kZWZhdWx0LWlubGluZSIsIGRlZmF1bHRfaW5saW5lX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZGVmYXVsdC1pbnRlZ2VyLTgiLCBkZWZhdWx0X2ludGVnZXJfOF9mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWRlZmF1bHQtcmVhbC04IiwgZGVmYXVsdF9yZWFsXzhfZm5vLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1kZWZlci1wb3AiLCBhbm9ueW1vdXNfNywgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZGVsYXllZC10ZW1wbGF0ZS1wYXJzaW5nIiwgZm5vX2RlbGF5ZWRfdGVtcGxhdGVfcGFyc2luZywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSBkZWxheWVkIHRlbXBsYXRlIHBhcnNpbmciLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWRlbGV0ZS1udWxsLXBvaW50ZXItY2hlY2tzIiwgZGVsZXRlX251bGxfcG9pbnRlcl9jaGVja3NfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1kZXByZWNhdGVkLW1hY3JvIiwgZm5vX2RlcHJlY2F0ZWRfbWFjcm8sIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJVbmRlZmluZXMgdGhlIF9fREVQUkVDQVRFRCBtYWNybyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZGV2aXJ0dWFsaXplLXNwZWN1bGF0aXZlbHkiLCBkZXZpcnR1YWxpemVfc3BlY3VsYXRpdmVseV9mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWRldmlydHVhbGl6ZSIsIGRldmlydHVhbGl6ZV9mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWRpYWdub3N0aWNzLWNvbG9yIiwgZm5vX2RpYWdub3N0aWNzX2NvbG9yLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uIHwgRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWRpYWdub3N0aWNzLWZpeGl0LWluZm8iLCBmbm9fZGlhZ25vc3RpY3NfZml4aXRfaW5mbywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJEbyBub3QgaW5jbHVkZSBmaXhpdCBpbmZvcm1hdGlvbiBpbiBkaWFnbm9zdGljcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZGlhZ25vc3RpY3Mtc2hvdy1ob3RuZXNzIiwgZm5vX2RpYWdub3N0aWNzX3Nob3dfaG90bmVzcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1kaWFnbm9zdGljcy1zaG93LW5vdGUtaW5jbHVkZS1zdGFjayIsIGZub19kaWFnbm9zdGljc19zaG93X25vdGVfaW5jbHVkZV9zdGFjaywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWRpYWdub3N0aWNzLXNob3ctb3B0aW9uIiwgZm5vX2RpYWdub3N0aWNzX3Nob3dfb3B0aW9uLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWRpYWdub3N0aWNzLXVzZS1wcmVzdW1lZC1sb2NhdGlvbiIsIGZub19kaWFnbm9zdGljc191c2VfcHJlc3VtZWRfbG9jYXRpb24sIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJJZ25vcmUgI2xpbmUgZGlyZWN0aXZlcyB3aGVuIGRpc3BsYXlpbmcgZGlhZ25vc3RpYyBsb2NhdGlvbnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWRpc2NhcmQtdmFsdWUtbmFtZXMiLCBmbm9fZGlzY2FyZF92YWx1ZV9uYW1lcywgRmxhZywgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEbyBub3QgZGlzY2FyZCB2YWx1ZSBuYW1lcyBpbiBMTFZNIElSIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1kb2xsYXItb2siLCBkb2xsYXJfb2tfZm5vLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1kb2xsYXJzLWluLWlkZW50aWZpZXJzIiwgZm5vX2RvbGxhcnNfaW5faWRlbnRpZmllcnMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWxsb3cgJyQnIGluIGlkZW50aWZpZXJzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1kb3VibGUtc3F1YXJlLWJyYWNrZXQtYXR0cmlidXRlcyIsIGZub19kb3VibGVfc3F1YXJlX2JyYWNrZXRfYXR0cmlidXRlcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlICdbW11dJyBhdHRyaWJ1dGVzIGluIGFsbCBDIGFuZCBDKysgbGFuZ3VhZ2UgbW9kZXMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWR1bXAtZm9ydHJhbi1vcHRpbWl6ZWQiLCBkdW1wX2ZvcnRyYW5fb3B0aW1pemVkX2ZubywgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZHVtcC1mb3J0cmFuLW9yaWdpbmFsIiwgZHVtcF9mb3J0cmFuX29yaWdpbmFsX2ZubywgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZHVtcC1wYXJzZS10cmVlIiwgZHVtcF9wYXJzZV90cmVlX2ZubywgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZHdhcmYtZGlyZWN0b3J5LWFzbSIsIGZub19kd2FyZl9kaXJlY3RvcnlfYXNtLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZHdhcmYyLWNmaS1hc20iLCBmbm9fZHdhcmYyX2NmaV9hc20sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1lbGlkZS1jb25zdHJ1Y3RvcnMiLCBmbm9fZWxpZGVfY29uc3RydWN0b3JzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgQysrIGNvcHkgY29uc3RydWN0b3IgZWxpc2lvbiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZWxpZGUtdHlwZSIsIGZub19lbGlkZV90eXBlLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkRvIG5vdCBlbGlkZSB0eXBlcyB3aGVuIHByaW50aW5nIGRpYWdub3N0aWNzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1lbGltaW5hdGUtdW51c2VkLWRlYnVnLXN5bWJvbHMiLCBmbm9fZWxpbWluYXRlX3VudXNlZF9kZWJ1Z19zeW1ib2xzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWVsaW1pbmF0ZS11bnVzZWQtZGVidWctdHlwZXMiLCBlbGltaW5hdGVfdW51c2VkX2RlYnVnX3R5cGVzX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWVtdWxhdGVkLXRscyIsIGZub19lbXVsYXRlZF90bHMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1lc2NhcGluZy1ibG9jay10YWlsLWNhbGxzIiwgZm5vX2VzY2FwaW5nX2Jsb2NrX3RhaWxfY2FsbHMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1leGNlcHRpb25zIiwgZm5vX2V4Y2VwdGlvbnMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZXhwZW5zaXZlLW9wdGltaXphdGlvbnMiLCBhbm9ueW1vdXNfNSwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZXhwZXJpbWVudGFsLWlzZWwiLCBmbm9fZXhwZXJpbWVudGFsX2lzZWwsIEZsYWcsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkRpc2FibGVzIHRoZSBleHBlcmltZW50YWwgZ2xvYmFsIGluc3RydWN0aW9uIHNlbGVjdG9yIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1leHBlcmltZW50YWwtbmV3LXBhc3MtbWFuYWdlciIsIGZub19leHBlcmltZW50YWxfbmV3X3Bhc3NfbWFuYWdlciwgRmxhZywgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlcyBhbiBleHBlcmltZW50YWwgbmV3IHBhc3MgbWFuYWdlciBpbiBMTFZNLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZXh0ZW5kZWQtaWRlbnRpZmllcnMiLCBhbm9ueW1vdXNfOSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgVW5zdXBwb3J0ZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZXh0ZXJuYWwtYmxhcyIsIGV4dGVybmFsX2JsYXNfZm5vLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1mMmMiLCBmMmNfZm5vLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1mYXN0LW1hdGgiLCBmbm9fZmFzdF9tYXRoLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWZhdC1sdG8tb2JqZWN0cyIsIGZhdF9sdG9fb2JqZWN0c19mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWZpbmUtZ3JhaW5lZC1iaXRmaWVsZC1hY2Nlc3NlcyIsIGZub19maW5lX2dyYWluZWRfYml0ZmllbGRfYWNjZXNzZXMsIEZsYWcsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiVXNlIGxhcmdlLWludGVnZXIgYWNjZXNzIGZvciBjb25zZWN1dGl2ZSBiaXRmaWVsZCBydW5zLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZmluaXRlLW1hdGgtb25seSIsIGZub19maW5pdGVfbWF0aF9vbmx5LCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWZpeGVkLWZvcm0iLCBmaXhlZF9mb3JtX2ZubywgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZmxvYXQtc3RvcmUiLCBmbG9hdF9zdG9yZV9mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWZvci1zY29wZSIsIGZub19mb3Jfc2NvcGUsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZm9yY2UtZW5hYmxlLWludDEyOCIsIGZub19mb3JjZV9lbmFibGVfaW50MTI4LCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgc3VwcG9ydCBmb3IgaW50MTI4X3QgdHlwZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZnJlZS1mb3JtIiwgZnJlZV9mb3JtX2ZubywgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZnJpZW5kLWluamVjdGlvbiIsIGZyaWVuZF9pbmplY3Rpb25fZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZnJvbnRlbmQtb3B0aW1pemUiLCBmcm9udGVuZF9vcHRpbWl6ZV9mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWZ1bmN0aW9uLWF0dHJpYnV0ZS1saXN0IiwgZnVuY3Rpb25fYXR0cmlidXRlX2xpc3RfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZnVuY3Rpb24tc2VjdGlvbnMiLCBmbm9fZnVuY3Rpb25fc2VjdGlvbnMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1nY3NlLWFmdGVyLXJlbG9hZCIsIGdjc2VfYWZ0ZXJfcmVsb2FkX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZ2NzZS1sYXMiLCBnY3NlX2xhc19mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWdjc2Utc20iLCBnY3NlX3NtX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZ2NzZSIsIGdjc2VfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1nbnUtaW5saW5lLWFzbSIsIGZub19nbnVfaW5saW5lX2FzbSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIEdOVSBzdHlsZSBpbmxpbmUgYXNtIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1nbnUta2V5d29yZHMiLCBmbm9fZ251X2tleXdvcmRzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tZ251ODktaW5saW5lIiwgZm5vX2dudTg5X2lubGluZSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1nbnUiLCBnbnVfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8taG9ub3ItaW5maW5pdGVzIiwgYW5vbnltb3VzXzExLCBGbGFnLCBJTlZBTElELCBmbm9faG9ub3JfaW5maW5pdGllcywgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1ob25vci1pbmZpbml0aWVzIiwgZm5vX2hvbm9yX2luZmluaXRpZXMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8taG9ub3ItbmFucyIsIGZub19ob25vcl9uYW5zLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWlkZW50IiwgaWRlbnRfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8taW1wbGVtZW50LWlubGluZXMiLCBpbXBsZW1lbnRfaW5saW5lc19mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1pbXBsaWNpdC1tb2R1bGUtbWFwcyIsIGZub19pbXBsaWNpdF9tb2R1bGVfbWFwcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWltcGxpY2l0LW1vZHVsZXMiLCBmbm9faW1wbGljaXRfbW9kdWxlcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWltcGxpY2l0LW5vbmUiLCBpbXBsaWNpdF9ub25lX2ZubywgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8taW1wbGljaXQtdGVtcGxhdGVzIiwgaW1wbGljaXRfdGVtcGxhdGVzX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWluaXQtbG9jYWwtemVybyIsIGluaXRfbG9jYWxfemVyb19mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWlubGluZS1mdW5jdGlvbnMtY2FsbGVkLW9uY2UiLCBpbmxpbmVfZnVuY3Rpb25zX2NhbGxlZF9vbmNlX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8taW5saW5lLWZ1bmN0aW9ucyIsIGZub19pbmxpbmVfZnVuY3Rpb25zLCBGbGFnLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8taW5saW5lLWxpbWl0IiwgZmlubGluZV9saW1pdF9mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWlubGluZS1zbWFsbC1mdW5jdGlvbnMiLCBpbmxpbmVfc21hbGxfZnVuY3Rpb25zX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8taW5saW5lIiwgZm5vX2lubGluZSwgRmxhZywgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWludGVnZXItNC1pbnRlZ2VyLTgiLCBpbnRlZ2VyXzRfaW50ZWdlcl84X2ZubywgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8taW50ZWdyYXRlZC1hcyIsIGZub19pbnRlZ3JhdGVkX2FzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBEcml2ZXJPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgdGhlIGludGVncmF0ZWQgYXNzZW1ibGVyIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1pbnRyaW5zaWMtbW9kdWxlcy1wYXRoIiwgaW50cmluc2ljX21vZHVsZXNfcGF0aF9mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWlwYS1jcCIsIGlwYV9jcF9mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWl2b3B0cyIsIGl2b3B0c19mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWp1bXAtdGFibGVzIiwgZm5vX2p1bXBfdGFibGVzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkRvIG5vdCB1c2UganVtcCB0YWJsZXMgZm9yIGxvd2VyaW5nIHN3aXRjaGVzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1rZWVwLWlubGluZS1mdW5jdGlvbnMiLCBhbm9ueW1vdXNfMjZfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1sYXgtdmVjdG9yLWNvbnZlcnNpb25zIiwgZm5vX2xheF92ZWN0b3JfY29udmVyc2lvbnMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWxsb3cgaW1wbGljaXQgY29udmVyc2lvbnMgYmV0d2VlbiB2ZWN0b3JzIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGVsZW1lbnRzIG9yIGRpZmZlcmVudCBlbGVtZW50IHR5cGVzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1saW1pdC1kZWJ1Zy1pbmZvIiwgZm5vX2xpbWl0X2RlYnVnX2luZm8sIEZsYWcsIElOVkFMSUQsIGZzdGFuZGFsb25lX2RlYnVnLCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLWx0by11bml0IiwgZm5vX2x0b191bml0LCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1sdG8iLCBmbm9fbHRvLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJEaXNhYmxlIExUTyBtb2RlIChkZWZhdWx0KSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tbWF0aC1idWlsdGluIiwgZm5vX21hdGhfYnVpbHRpbiwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ0MxQXNPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSBpbXBsaWNpdCBidWlsdGluIGtub3dsZWRnZSBvZiBtYXRoIGZ1bmN0aW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tbWF0aC1lcnJubyIsIGZub19tYXRoX2Vycm5vLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLW1heC1pZGVudGlmaWVyLWxlbmd0aCIsIG1heF9pZGVudGlmaWVyX2xlbmd0aF9mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLW1heC10eXBlLWFsaWduIiwgZm5vX21heF90eXBlX2FsaWduLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLW1lcmdlLWFsbC1jb25zdGFudHMiLCBmbm9fbWVyZ2VfYWxsX2NvbnN0YW50cywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRGlzYWxsb3cgbWVyZ2luZyBvZiBjb25zdGFudHMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLW1lcmdlLWNvbnN0YW50cyIsIG1lcmdlX2NvbnN0YW50c19mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLW1vZHVsZS1maWxlLWRlcHMiLCBmbm9fbW9kdWxlX2ZpbGVfZGVwcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLW1vZHVsZS1tYXBzIiwgZm5vX21vZHVsZV9tYXBzLCBGbGFnLCBJTlZBTElELCBmbm9faW1wbGljaXRfbW9kdWxlX21hcHMsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tbW9kdWxlLXByaXZhdGUiLCBtb2R1bGVfcHJpdmF0ZV9mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLW1vZHVsZXMtZGVjbHVzZSIsIGZub19tb2R1bGVzX2RlY2x1c2UsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1tb2R1bGVzLWVycm9yLXJlY292ZXJ5IiwgZm5vX21vZHVsZXNfZXJyb3JfcmVjb3ZlcnksIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEbyBub3QgYXV0b21hdGljYWxseSBpbXBvcnQgbW9kdWxlcyBmb3IgZXJyb3IgcmVjb3ZlcnkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLW1vZHVsZXMtZ2xvYmFsLWluZGV4IiwgZm5vX21vZHVsZXNfZ2xvYmFsX2luZGV4LCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRG8gbm90IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgb3IgdXBkYXRlIHRoZSBnbG9iYWwgbW9kdWxlIGluZGV4IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1tb2R1bGVzLXNlYXJjaC1hbGwiLCBmbm9fbW9kdWxlc19zZWFyY2hfYWxsLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBDQzFPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tbW9kdWxlcyIsIGZub19tb2R1bGVzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tbW9kdWxvLXNjaGVkLWFsbG93LXJlZ21vdmVzIiwgbW9kdWxvX3NjaGVkX2FsbG93X3JlZ21vdmVzX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tbW9kdWxvLXNjaGVkIiwgbW9kdWxvX3NjaGVkX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tbXMtY29tcGF0aWJpbGl0eSIsIGZub19tc19jb21wYXRpYmlsaXR5LCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLW1zLWV4dGVuc2lvbnMiLCBmbm9fbXNfZXh0ZW5zaW9ucywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1ub24tY2FsbC1leGNlcHRpb25zIiwgbm9uX2NhbGxfZXhjZXB0aW9uc19mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1vYmpjLWFyYy1leGNlcHRpb25zIiwgZm5vX29iamNfYXJjX2V4Y2VwdGlvbnMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tb2JqYy1hcmMiLCBmbm9fb2JqY19hcmMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tb2JqYy1leGNlcHRpb25zIiwgZm5vX29iamNfZXhjZXB0aW9ucywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1vYmpjLWluZmVyLXJlbGF0ZWQtcmVzdWx0LXR5cGUiLCBmbm9fb2JqY19pbmZlcl9yZWxhdGVkX3Jlc3VsdF90eXBlLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgImRvIG5vdCBpbmZlciBPYmplY3RpdmUtQyByZWxhdGVkIHJlc3VsdCB0eXBlIGJhc2VkIG9uIG1ldGhvZCBmYW1pbHkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLW9iamMtbGVnYWN5LWRpc3BhdGNoIiwgZm5vX29iamNfbGVnYWN5X2Rpc3BhdGNoLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLW9iamMtbm9uZnJhZ2lsZS1hYmkiLCBmbm9fb2JqY19ub25mcmFnaWxlX2FiaSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1vYmpjLXdlYWsiLCBmbm9fb2JqY193ZWFrLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tb21pdC1mcmFtZS1wb2ludGVyIiwgZm5vX29taXRfZnJhbWVfcG9pbnRlciwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1vcGVubXAtY3VkYS1tb2RlIiwgZm5vX29wZW5tcF9jdWRhX21vZGUsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIE5vQXJndW1lbnRVbnVzZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tb3Blbm1wLXNpbWQiLCBmbm9fb3Blbm1wX3NpbWQsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vQXJndW1lbnRVbnVzZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tb3Blbm1wIiwgZm5vX29wZW5tcCwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgTm9Bcmd1bWVudFVudXNlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1vcGVyYXRvci1uYW1lcyIsIGZub19vcGVyYXRvcl9uYW1lcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJEbyBub3QgdHJlYXQgQysrIG9wZXJhdG9yIG5hbWUga2V5d29yZHMgYXMgc3lub255bXMgZm9yIG9wZXJhdG9ycyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tb3B0aW1pemUtc2libGluZy1jYWxscyIsIGZub19vcHRpbWl6ZV9zaWJsaW5nX2NhbGxzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXBhY2stZGVyaXZlZCIsIHBhY2tfZGVyaXZlZF9mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXBhY2stc3RydWN0IiwgZm5vX3BhY2tfc3RydWN0LCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXBhc2NhbC1zdHJpbmdzIiwgZm5vX3Bhc2NhbF9zdHJpbmdzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXBjaC10aW1lc3RhbXAiLCBmbm9fcGNoX3RpbWVzdGFtcCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgaW5jbHVzaW9uIG9mIHRpbWVzdGFtcCBpbiBwcmVjb21waWxlZCBoZWFkZXJzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1wZWVsLWxvb3BzIiwgcGVlbF9sb29wc19mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXBlcm1pc3NpdmUiLCBwZXJtaXNzaXZlX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLVBJQyIsIGZub19QSUMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tcGljIiwgZm5vX3BpYywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1QSUUiLCBmbm9fUElFLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXBpZSIsIGZub19waWUsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tcGx0IiwgZm5vX3BsdCwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJEbyBub3QgdXNlIHRoZSBQTFQgdG8gbWFrZSBmdW5jdGlvbiBjYWxscyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tcHJlZmV0Y2gtbG9vcC1hcnJheXMiLCBwcmVmZXRjaF9sb29wX2FycmF5c19mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXByZXNlcnZlLWFzLWNvbW1lbnRzIiwgZm5vX3ByZXNlcnZlX2FzX2NvbW1lbnRzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkRvIG5vdCBwcmVzZXJ2ZSBjb21tZW50cyBpbiBpbmxpbmUgYXNzZW1ibHkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXByaW50ZiIsIHByaW50Zl9mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1wcm9maWxlLWFyY3MiLCBmbm9fcHJvZmlsZV9hcmNzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXByb2ZpbGUtY29ycmVjdGlvbiIsIHByb2ZpbGVfY29ycmVjdGlvbl9mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXByb2ZpbGUtZ2VuZXJhdGUtc2FtcGxpbmciLCBwcm9maWxlX2dlbmVyYXRlX3NhbXBsaW5nX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXByb2ZpbGUtZ2VuZXJhdGUiLCBmbm9fcHJvZmlsZV9nZW5lcmF0ZSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIGdlbmVyYXRpb24gb2YgcHJvZmlsZSBpbnN0cnVtZW50YXRpb24uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1wcm9maWxlLWluc3RyLWdlbmVyYXRlIiwgZm5vX3Byb2ZpbGVfaW5zdHJfZ2VuZXJhdGUsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSBnZW5lcmF0aW9uIG9mIHByb2ZpbGUgaW5zdHJ1bWVudGF0aW9uLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tcHJvZmlsZS1pbnN0ci11c2UiLCBmbm9fcHJvZmlsZV9pbnN0cl91c2UsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSB1c2luZyBpbnN0cnVtZW50YXRpb24gZGF0YSBmb3IgcHJvZmlsZS1ndWlkZWQgb3B0aW1pemF0aW9uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1wcm9maWxlLXJldXNlZGlzdCIsIHByb2ZpbGVfcmV1c2VkaXN0X2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXByb2ZpbGUtc2FtcGxlLWFjY3VyYXRlIiwgZm5vX3Byb2ZpbGVfc2FtcGxlX2FjY3VyYXRlLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tcHJvZmlsZS1zYW1wbGUtdXNlIiwgZm5vX3Byb2ZpbGVfc2FtcGxlX3VzZSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1wcm9maWxlLXVzZSIsIGZub19wcm9maWxlX3VzZSwgRmxhZywgSU5WQUxJRCwgZm5vX3Byb2ZpbGVfaW5zdHJfdXNlLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXByb2ZpbGUtdmFsdWVzIiwgcHJvZmlsZV92YWx1ZXNfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1wcm9maWxlIiwgcHJvZmlsZV9mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1wcm90ZWN0LXBhcmVucyIsIHByb3RlY3RfcGFyZW5zX2ZubywgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tcmFuZ2UtY2hlY2siLCByYW5nZV9jaGVja19mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXJlYWwtNC1yZWFsLTEwIiwgcmVhbF80X3JlYWxfMTBfZm5vLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1yZWFsLTQtcmVhbC0xNiIsIHJlYWxfNF9yZWFsXzE2X2ZubywgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tcmVhbC00LXJlYWwtOCIsIHJlYWxfNF9yZWFsXzhfZm5vLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1yZWFsLTgtcmVhbC0xMCIsIHJlYWxfOF9yZWFsXzEwX2ZubywgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tcmVhbC04LXJlYWwtMTYiLCByZWFsXzhfcmVhbF8xNl9mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXJlYWwtOC1yZWFsLTQiLCByZWFsXzhfcmVhbF80X2ZubywgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tcmVhbGxvYy1saHMiLCByZWFsbG9jX2xoc19mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXJlY2lwcm9jYWwtbWF0aCIsIGZub19yZWNpcHJvY2FsX21hdGgsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tcmVjdXJzaXZlIiwgcmVjdXJzaXZlX2ZubywgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tcmVncy1ncmFwaCIsIHJlZ3NfZ3JhcGhfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tcmVsYXhlZC10ZW1wbGF0ZS10ZW1wbGF0ZS1hcmdzIiwgZm5vX3JlbGF4ZWRfdGVtcGxhdGVfdGVtcGxhdGVfYXJncywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1yZW5hbWUtcmVnaXN0ZXJzIiwgcmVuYW1lX3JlZ2lzdGVyc19mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXJlb3JkZXItYmxvY2tzIiwgcmVvcmRlcl9ibG9ja3NfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1yZXBhY2stYXJyYXlzIiwgcmVwYWNrX2FycmF5c19mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXJlcm9sbC1sb29wcyIsIGZub19yZXJvbGxfbG9vcHMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIlR1cm4gb2ZmIGxvb3AgcmVyb2xsZXIiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXJld3JpdGUtaW1wb3J0cyIsIGZub19yZXdyaXRlX2ltcG9ydHMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tcmV3cml0ZS1pbmNsdWRlcyIsIGZub19yZXdyaXRlX2luY2x1ZGVzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXJpcGEiLCByaXBhX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXJvcGkiLCBmbm9fcm9waSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1yb3VuZGluZy1tYXRoIiwgcm91bmRpbmdfbWF0aF9mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXJ0bGliLWFkZC1ycGF0aCIsIGZub19ydGxpYl9hZGRfcnBhdGgsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIE5vQXJndW1lbnRVbnVzZWQsIDAsCisgICAgICAgIkRvIG5vdCBhZGQgLXJwYXRoIHdpdGggYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHJlc291cmNlIGRpcmVjdG9yeSB0byB0aGUgbGlua2VyIGZsYWdzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1ydHRpLWRhdGEiLCBmbm9fcnR0aV9kYXRhLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkNvbnRyb2wgZW1pc3Npb24gb2YgUlRUSSBkYXRhIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1ydHRpIiwgZm5vX3J0dGksIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSBnZW5lcmF0aW9uIG9mIHJ0dGkgaW5mb3JtYXRpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXJ3cGkiLCBmbm9fcndwaSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zYW5pdGl6ZS1hZGRyZXNzLXBvaXNvbi1jbGFzcy1tZW1iZXItYXJyYXktbmV3LWNvb2tpZSIsIGZub19zYW5pdGl6ZV9hZGRyZXNzX3BvaXNvbl9jbGFzc19tZW1iZXJfYXJyYXlfbmV3X2Nvb2tpZSwgRmxhZywgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSBwb2lzb25pbmcgYXJyYXkgY29va2llcyB3aGVuIHVzaW5nIGNsYXNzIG1lbWJlciBvcGVyYXRvciBuZXdbXSBpbiBBZGRyZXNzU2FuaXRpemVyIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zYW5pdGl6ZS1hZGRyZXNzLXVzZS1hZnRlci1zY29wZSIsIGZub19zYW5pdGl6ZV9hZGRyZXNzX3VzZV9hZnRlcl9zY29wZSwgRmxhZywgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSB1c2UtYWZ0ZXItc2NvcGUgZGV0ZWN0aW9uIGluIEFkZHJlc3NTYW5pdGl6ZXIiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXNhbml0aXplLWJsYWNrbGlzdCIsIGZub19zYW5pdGl6ZV9ibGFja2xpc3QsIEZsYWcsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIkRvbid0IHVzZSBibGFja2xpc3QgZmlsZSBmb3Igc2FuaXRpemVycyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tc2FuaXRpemUtY2ZpLWNyb3NzLWRzbyIsIGZub19zYW5pdGl6ZV9jZmlfY3Jvc3NfZHNvLCBGbGFnLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIGNvbnRyb2wgZmxvdyBpbnRlZ3JpdHkgKENGSSkgY2hlY2tzIGZvciBjcm9zcy1EU08gY2FsbHMuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zYW5pdGl6ZS1jb3ZlcmFnZT0iLCBmbm9fc2FuaXRpemVfY292ZXJhZ2UsIENvbW1hSm9pbmVkLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIHNwZWNpZmllZCBmZWF0dXJlcyBvZiBjb3ZlcmFnZSBpbnN0cnVtZW50YXRpb24gZm9yIFNhbml0aXplcnMiLCBudWxscHRyLCAiZnVuYyxiYixlZGdlLGluZGlyZWN0LWNhbGxzLHRyYWNlLWJiLHRyYWNlLWNtcCx0cmFjZS1kaXYsdHJhY2UtZ2VwLDhiaXQtY291bnRlcnMsdHJhY2UtcGMsdHJhY2UtcGMtZ3VhcmQsbm8tcHJ1bmUsaW5saW5lLThiaXQtY291bnRlcnMiKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zIiwgZm5vX3Nhbml0aXplX21lbW9yeV90cmFja19vcmlnaW5zLCBGbGFnLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIG9yaWdpbnMgdHJhY2tpbmcgaW4gTWVtb3J5U2FuaXRpemVyIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zYW5pdGl6ZS1tZW1vcnktdXNlLWFmdGVyLWR0b3IiLCBmbm9fc2FuaXRpemVfbWVtb3J5X3VzZV9hZnRlcl9kdG9yLCBGbGFnLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIHVzZS1hZnRlci1kZXN0cm95IGRldGVjdGlvbiBpbiBNZW1vcnlTYW5pdGl6ZXIiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXNhbml0aXplLW1pbmltYWwtcnVudGltZSIsIGZub19zYW5pdGl6ZV9taW5pbWFsX3J1bnRpbWUsIEZsYWcsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tc2FuaXRpemUtcmVjb3Zlcj0iLCBmbm9fc2FuaXRpemVfcmVjb3Zlcl9FUSwgQ29tbWFKb2luZWQsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgcmVjb3ZlcnkgZm9yIHNwZWNpZmllZCBzYW5pdGl6ZXJzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zYW5pdGl6ZS1yZWNvdmVyIiwgZm5vX3Nhbml0aXplX3JlY292ZXIsIEZsYWcsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tc2FuaXRpemUtc3RhdHMiLCBmbm9fc2FuaXRpemVfc3RhdHMsIEZsYWcsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgc2FuaXRpemVyIHN0YXRpc3RpY3MgZ2F0aGVyaW5nLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tc2FuaXRpemUtdGhyZWFkLWF0b21pY3MiLCBmbm9fc2FuaXRpemVfdGhyZWFkX2F0b21pY3MsIEZsYWcsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgYXRvbWljIG9wZXJhdGlvbnMgaW5zdHJ1bWVudGF0aW9uIGluIFRocmVhZFNhbml0aXplciIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tc2FuaXRpemUtdGhyZWFkLWZ1bmMtZW50cnktZXhpdCIsIGZub19zYW5pdGl6ZV90aHJlYWRfZnVuY19lbnRyeV9leGl0LCBGbGFnLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIGZ1bmN0aW9uIGVudHJ5L2V4aXQgaW5zdHJ1bWVudGF0aW9uIGluIFRocmVhZFNhbml0aXplciIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tc2FuaXRpemUtdGhyZWFkLW1lbW9yeS1hY2Nlc3MiLCBmbm9fc2FuaXRpemVfdGhyZWFkX21lbW9yeV9hY2Nlc3MsIEZsYWcsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgbWVtb3J5IGFjY2VzcyBpbnN0cnVtZW50YXRpb24gaW4gVGhyZWFkU2FuaXRpemVyIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zYW5pdGl6ZS10cmFwPSIsIGZub19zYW5pdGl6ZV90cmFwX0VRLCBDb21tYUpvaW5lZCwgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSB0cmFwcGluZyBmb3Igc3BlY2lmaWVkIHNhbml0aXplcnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXNhbml0aXplLXVuZGVmaW5lZC10cmFwLW9uLWVycm9yIiwgZm5vX3Nhbml0aXplX3VuZGVmaW5lZF90cmFwX29uX2Vycm9yLCBGbGFnLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXNhbml0aXplPSIsIGZub19zYW5pdGl6ZV9FUSwgQ29tbWFKb2luZWQsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tc2F2ZS1vcHRpbWl6YXRpb24tcmVjb3JkIiwgZm5vX3NhdmVfb3B0aW1pemF0aW9uX3JlY29yZCwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgTm9Bcmd1bWVudFVudXNlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zY2hlZHVsZS1pbnNuczIiLCBzY2hlZHVsZV9pbnNuczJfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zY2hlZHVsZS1pbnNucyIsIHNjaGVkdWxlX2luc25zX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tc2Vjb25kLXVuZGVyc2NvcmUiLCBzZWNvbmRfdW5kZXJzY29yZV9mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXNlZSIsIHNlZV9mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zaG9ydC1lbnVtcyIsIGZub19zaG9ydF9lbnVtcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zaG9ydC13Y2hhciIsIGZub19zaG9ydF93Y2hhciwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRm9yY2Ugd2NoYXJfdCB0byBiZSBhbiB1bnNpZ25lZCBpbnQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXNob3ctY29sdW1uIiwgZm5vX3Nob3dfY29sdW1uLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkRvIG5vdCBpbmNsdWRlIGNvbHVtbiBudW1iZXIgb24gZGlhZ25vc3RpY3MiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXNob3ctc291cmNlLWxvY2F0aW9uIiwgZm5vX3Nob3dfc291cmNlX2xvY2F0aW9uLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkRvIG5vdCBpbmNsdWRlIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3aXRoIGRpYWdub3N0aWNzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zaWduLXplcm8iLCBzaWduX3plcm9fZm5vLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zaWduYWxpbmctbWF0aCIsIGZub19zaWduYWxpbmdfbWF0aCwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zaWduYWxpbmctbmFucyIsIHNpZ25hbGluZ19uYW5zX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tc2lnbmVkLWNoYXIiLCBmbm9fc2lnbmVkX2NoYXIsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiQ2hhciBpcyB1bnNpZ25lZCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tc2lnbmVkLXdjaGFyIiwgZm5vX3NpZ25lZF93Y2hhciwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlVzZSBhbiB1bnNpZ25lZCB0eXBlIGZvciB3Y2hhcl90IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zaWduZWQtemVyb3MiLCBmbm9fc2lnbmVkX3plcm9zLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkFsbG93IG9wdGltaXphdGlvbnMgdGhhdCBpZ25vcmUgdGhlIHNpZ24gb2YgZmxvYXRpbmcgcG9pbnQgemVyb3MiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXNpbmdsZS1wcmVjaXNpb24tY29uc3RhbnQiLCBzaW5nbGVfcHJlY2lzaW9uX2NvbnN0YW50X2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tc2l6ZWQtZGVhbGxvY2F0aW9uIiwgZm5vX3NpemVkX2RlYWxsb2NhdGlvbiwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zbHAtdmVjdG9yaXplLWFnZ3Jlc3NpdmUiLCBhbm9ueW1vdXNfMSwgRmxhZywgY2xhbmdfaWdub3JlZF9sZWdhY3lfb3B0aW9uc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zbHAtdmVjdG9yaXplIiwgZm5vX3NscF92ZWN0b3JpemUsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tc3BlYy1jb25zdHItY291bnQiLCBzcGVjX2NvbnN0cl9jb3VudF9mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zcGVsbC1jaGVja2luZyIsIGZub19zcGVsbF9jaGVja2luZywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIHNwZWxsLWNoZWNraW5nIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zcGxpdC1kd2FyZi1pbmxpbmluZyIsIGZub19zcGxpdF9kd2FyZl9pbmxpbmluZywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXN0YWNrLWFycmF5cyIsIHN0YWNrX2FycmF5c19mbm8sIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXN0YWNrLWNoZWNrIiwgc3RhY2tfY2hlY2tfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tc3RhY2stcHJvdGVjdG9yIiwgZm5vX3N0YWNrX3Byb3RlY3RvciwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRGlzYWJsZSB0aGUgdXNlIG9mIHN0YWNrIHByb3RlY3RvcnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXN0YWNrLXNpemUtc2VjdGlvbiIsIGZub19zdGFja19zaXplX3NlY3Rpb24sIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRG9uJ3QgZW1pdCBzZWN0aW9uIGNvbnRhaW5pbmcgbWV0YWRhdGEgb24gZnVuY3Rpb24gc3RhY2sgc2l6ZXMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXN0YW5kYWxvbmUtZGVidWciLCBmbm9fc3RhbmRhbG9uZV9kZWJ1ZywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiTGltaXQgZGVidWcgaW5mb3JtYXRpb24gcHJvZHVjZWQgdG8gcmVkdWNlIHNpemUgb2YgZGVidWcgYmluYXJ5IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zdHJlbmd0aC1yZWR1Y2UiLCBzdHJlbmd0aF9yZWR1Y2VfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zdHJpY3QtYWxpYXNpbmciLCBmbm9fc3RyaWN0X2FsaWFzaW5nLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXN0cmljdC1lbnVtcyIsIGZub19zdHJpY3RfZW51bXMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tc3RyaWN0LW1vZHVsZXMtZGVjbHVzZSIsIGZub19tb2R1bGVzX3N0cmljdF9kZWNsdXNlLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tc3RyaWN0LW92ZXJmbG93IiwgZm5vX3N0cmljdF9vdmVyZmxvdywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zdHJpY3QtcmV0dXJuIiwgZm5vX3N0cmljdF9yZXR1cm4sIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby1zdHJpY3QtdnRhYmxlLXBvaW50ZXJzIiwgZm5vX3N0cmljdF92dGFibGVfcG9pbnRlcnMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tc3RydWN0LXBhdGgtdGJhYSIsIGZub19zdHJ1Y3RfcGF0aF90YmFhLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXRocmVhZHNhZmUtc3RhdGljcyIsIGZub190aHJlYWRzYWZlX3N0YXRpY3MsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRG8gbm90IGVtaXQgY29kZSB0byBtYWtlIGluaXRpYWxpemF0aW9uIG9mIGxvY2FsIHN0YXRpY3MgdGhyZWFkIHNhZmUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXRscy1tb2RlbCIsIHRsc19tb2RlbF9mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby10cmFjZXIiLCB0cmFjZXJfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby10cmFwcGluZy1tYXRoIiwgZm5vX3RyYXBwaW5nX21hdGgsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby10cmVlLWRjZSIsIHRyZWVfZGNlX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tdHJlZS1zYWxpYXMiLCB0cmVlX3NhbGlhc19mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby10cmVlLXNscC12ZWN0b3JpemUiLCBhbm9ueW1vdXNfMjAsIEZsYWcsIElOVkFMSUQsIGZub19zbHBfdmVjdG9yaXplLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXRyZWUtdGVyIiwgdHJlZV90ZXJfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby10cmVlLXZlY3Rvcml6ZXItdmVyYm9zZSIsIHRyZWVfdmVjdG9yaXplcl92ZXJib3NlX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXRyZWUtdmVjdG9yaXplIiwgYW5vbnltb3VzXzE4LCBGbGFnLCBJTlZBTElELCBmbm9fdmVjdG9yaXplLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXRyZWUtdnJwIiwgdHJlZV92cnBfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby10cmVlX2xvb3BfaW0iLCB0cmVlX2xvb3BfaW1fZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby10cmVlX2xvb3BfaXZjYW5vbiIsIHRyZWVfbG9vcF9pdmNhbm9uX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tdHJlZV9sb29wX2xpbmVhciIsIHRyZWVfbG9vcF9saW5lYXJfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby10cmlncmFwaHMiLCBmbm9fdHJpZ3JhcGhzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkRvIG5vdCBwcm9jZXNzIHRyaWdyYXBoIHNlcXVlbmNlcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tdW5kZXJzY29yaW5nIiwgdW5kZXJzY29yaW5nX2ZubywgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tdW5pcXVlLXNlY3Rpb24tbmFtZXMiLCBmbm9fdW5pcXVlX3NlY3Rpb25fbmFtZXMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby11bml0LWF0LWEtdGltZSIsIGZub191bml0X2F0X2FfdGltZSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby11bnJvbGwtYWxsLWxvb3BzIiwgdW5yb2xsX2FsbF9sb29wc19mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXVucm9sbC1sb29wcyIsIGZub191bnJvbGxfbG9vcHMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiVHVybiBvZmYgbG9vcCB1bnJvbGxlciIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tdW5zYWZlLWxvb3Atb3B0aW1pemF0aW9ucyIsIHVuc2FmZV9sb29wX29wdGltaXphdGlvbnNfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby11bnNhZmUtbWF0aC1vcHRpbWl6YXRpb25zIiwgZm5vX3Vuc2FmZV9tYXRoX29wdGltaXphdGlvbnMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tdW5zaWduZWQtY2hhciIsIGZub191bnNpZ25lZF9jaGFyLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXVuc3dpdGNoLWxvb3BzIiwgdW5zd2l0Y2hfbG9vcHNfZm5vLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby11bndpbmQtdGFibGVzIiwgZm5vX3Vud2luZF90YWJsZXMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tdXNlLWN4YS1hdGV4aXQiLCBmbm9fdXNlX2N4YV9hdGV4aXQsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRG9uJ3QgdXNlIF9fY3hhX2F0ZXhpdCBmb3IgY2FsbGluZyBkZXN0cnVjdG9ycyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tdXNlLWluaXQtYXJyYXkiLCBmbm9fdXNlX2luaXRfYXJyYXksIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRG9uJ3QgdXNlIC5pbml0X2FycmF5IGluc3RlYWQgb2YgLmN0b3JzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby11c2UtbGluZS1kaXJlY3RpdmVzIiwgZm5vX3VzZV9saW5lX2RpcmVjdGl2ZXMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tdXNlLWxpbmtlci1wbHVnaW4iLCB1c2VfbGlua2VyX3BsdWdpbl9mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXZhbGlkYXRlLXBjaCIsIGZub192YWxpZGF0ZV9wY2gsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIHZhbGlkYXRpb24gb2YgcHJlY29tcGlsZWQgaGVhZGVycyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tdmFyLXRyYWNraW5nIiwgZm5vX3Zhcl90cmFja2luZywgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXZhcmlhYmxlLWV4cGFuc2lvbi1pbi11bnJvbGxlciIsIHZhcmlhYmxlX2V4cGFuc2lvbl9pbl91bnJvbGxlcl9mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXZlY3QtY29zdC1tb2RlbCIsIHZlY3RfY29zdF9tb2RlbF9mbm8sIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXZlY3Rvcml6ZSIsIGZub192ZWN0b3JpemUsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8tdmVyYm9zZS1hc20iLCBmbm9fdmVyYm9zZV9hc20sIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8td2NoYXIiLCBmbm9fd2NoYXIsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIEMrKyBidWlsdGluIHR5cGUgd2NoYXJfdCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8td2ViIiwgd2ViX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8td2hvbGUtZmlsZSIsIHdob2xlX2ZpbGVfZm5vLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZuby13aG9sZS1wcm9ncmFtLXZ0YWJsZXMiLCBmbm9fd2hvbGVfcHJvZ3JhbV92dGFibGVzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXdob2xlLXByb2dyYW0iLCB3aG9sZV9wcm9ncmFtX2ZubywgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8td29ya2luZy1kaXJlY3RvcnkiLCBmbm9fd29ya2luZ19kaXJlY3RvcnksIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8td3JhcHYiLCBmbm9fd3JhcHYsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmbm8teHJheS1hbHdheXMtZW1pdC1jdXN0b21ldmVudHMiLCBmbm94cmF5X2Fsd2F5c19lbWl0X2N1c3RvbWV2ZW50cywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXhyYXktaW5zdHJ1bWVudCIsIGZub3hyYXlfaW5zdHJ1bWVudCwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXplcm8taW5pdGlhbGl6ZWQtaW4tYnNzIiwgZm5vX3plcm9faW5pdGlhbGl6ZWRfaW5fYnNzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vLXp2ZWN0b3IiLCBmbm9fenZlY3RvciwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm5vbi1jYWxsLWV4Y2VwdGlvbnMiLCBub25fY2FsbF9leGNlcHRpb25zX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZub29wZW5tcC1yZWxvY2F0YWJsZS10YXJnZXQiLCBmbm9vcGVubXBfcmVsb2NhdGFibGVfdGFyZ2V0LCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0FyZ3VtZW50VW51c2VkIHwgSGVscEhpZGRlbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZub29wZW5tcC11c2UtdGxzIiwgZm5vb3Blbm1wX3VzZV90bHMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vQXJndW1lbnRVbnVzZWQgfCBIZWxwSGlkZGVuLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm9iamMtYWJpLXZlcnNpb249IiwgZm9iamNfYWJpX3ZlcnNpb25fRVEsIEpvaW5lZCwgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZvYmpjLWFyYy1jeHhsaWI9IiwgZm9iamNfYXJjX2N4eGxpYl9FUSwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiT2JqZWN0aXZlLUMrKyBBdXRvbWF0aWMgUmVmZXJlbmNlIENvdW50aW5nIHN0YW5kYXJkIGxpYnJhcnkga2luZCIsIG51bGxwdHIsICJsaWJjKyssbGlic3RkYysrLG5vbmUiKQorT1BUSU9OKHByZWZpeF8xLCAiZm9iamMtYXJjLWV4Y2VwdGlvbnMiLCBmb2JqY19hcmNfZXhjZXB0aW9ucywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJVc2UgRUgtc2FmZSBjb2RlIHdoZW4gc3ludGhlc2l6aW5nIHJldGFpbnMgYW5kIHJlbGVhc2VzIGluIC1mb2JqYy1hcmMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm9iamMtYXJjIiwgZm9iamNfYXJjLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlN5bnRoZXNpemUgcmV0YWluIGFuZCByZWxlYXNlIGNhbGxzIGZvciBPYmplY3RpdmUtQyBwb2ludGVycyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmb2JqYy1hdGRlZnMiLCBmb2JqY19hdGRlZnMsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZvYmpjLWNhbGwtY3h4LWNkdG9ycyIsIGZvYmpjX2NhbGxfY3h4X2NkdG9ycywgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm9iamMtZGlzcGF0Y2gtbWV0aG9kPSIsIGZvYmpjX2Rpc3BhdGNoX21ldGhvZF9FUSwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiT2JqZWN0aXZlLUMgZGlzcGF0Y2ggbWV0aG9kIHRvIHVzZSIsIG51bGxwdHIsICJsZWdhY3ksbm9uLWxlZ2FjeSxtaXhlZCIpCitPUFRJT04ocHJlZml4XzEsICJmb2JqYy1leGNlcHRpb25zIiwgZm9iamNfZXhjZXB0aW9ucywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgT2JqZWN0aXZlLUMgZXhjZXB0aW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmb2JqYy1nYy1vbmx5IiwgZm9iamNfZ2Nfb25seSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlVzZSBHQyBleGNsdXNpdmVseSBmb3IgT2JqZWN0aXZlLUMgcmVsYXRlZCBtZW1vcnkgbWFuYWdlbWVudCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmb2JqYy1nYyIsIGZvYmpjX2djLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIE9iamVjdGl2ZS1DIGdhcmJhZ2UgY29sbGVjdGlvbiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmb2JqYy1pbmZlci1yZWxhdGVkLXJlc3VsdC10eXBlIiwgZm9iamNfaW5mZXJfcmVsYXRlZF9yZXN1bHRfdHlwZSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZvYmpjLWxlZ2FjeS1kaXNwYXRjaCIsIGZvYmpjX2xlZ2FjeV9kaXNwYXRjaCwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZvYmpjLWxpbmstcnVudGltZSIsIGZvYmpjX2xpbmtfcnVudGltZSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZvYmpjLW5ldy1wcm9wZXJ0eSIsIGZvYmpjX25ld19wcm9wZXJ0eSwgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm9iamMtbm9uZnJhZ2lsZS1hYmktdmVyc2lvbj0iLCBmb2JqY19ub25mcmFnaWxlX2FiaV92ZXJzaW9uX0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmb2JqYy1ub25mcmFnaWxlLWFiaSIsIGZvYmpjX25vbmZyYWdpbGVfYWJpLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm9iamMtcnVudGltZS1oYXMtd2VhayIsIGZvYmpjX3J1bnRpbWVfaGFzX3dlYWssIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJUaGUgdGFyZ2V0IE9iamVjdGl2ZS1DIHJ1bnRpbWUgc3VwcG9ydHMgQVJDIHdlYWsgb3BlcmF0aW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmb2JqYy1ydW50aW1lPSIsIGZvYmpjX3J1bnRpbWVfRVEsIEpvaW5lZCwgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJTcGVjaWZ5IHRoZSB0YXJnZXQgT2JqZWN0aXZlLUMgcnVudGltZSBraW5kIGFuZCB2ZXJzaW9uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZvYmpjLXNlbmRlci1kZXBlbmRlbnQtZGlzcGF0Y2giLCBmb2JqY19zZW5kZXJfZGVwZW5kZW50X2Rpc3BhdGNoLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm9iamMtc3Vic2NyaXB0aW5nLWxlZ2FjeS1ydW50aW1lIiwgZm9iamNfc3Vic2NyaXB0aW5nX2xlZ2FjeV9ydW50aW1lLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiQWxsb3cgT2JqZWN0aXZlLUMgYXJyYXkgYW5kIGRpY3Rpb25hcnkgc3Vic2NyaXB0aW5nIGluIGxlZ2FjeSBydW50aW1lIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZvYmpjLXdlYWsiLCBmb2JqY193ZWFrLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBBUkMtc3R5bGUgd2VhayByZWZlcmVuY2VzIGluIE9iamVjdGl2ZS1DIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZvbWl0LWZyYW1lLXBvaW50ZXIiLCBmb21pdF9mcmFtZV9wb2ludGVyLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm9wZW5tcC1jdWRhLW1vZGUiLCBmb3Blbm1wX2N1ZGFfbW9kZSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Bcmd1bWVudFVudXNlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZvcGVubXAtZHVtcC1vZmZsb2FkLWxpbmtlci1zY3JpcHQiLCBmb3Blbm1wX2R1bXBfb2ZmbG9hZF9saW5rZXJfc2NyaXB0LCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBOb0FyZ3VtZW50VW51c2VkIHwgSGVscEhpZGRlbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZvcGVubXAtaG9zdC1pci1maWxlLXBhdGgiLCBmb3Blbm1wX2hvc3RfaXJfZmlsZV9wYXRoLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlBhdGggdG8gdGhlIElSIGZpbGUgcHJvZHVjZWQgYnkgdGhlIGZyb250ZW5kIGZvciB0aGUgaG9zdC4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm9wZW5tcC1pcy1kZXZpY2UiLCBmb3Blbm1wX2lzX2RldmljZSwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkdlbmVyYXRlIGNvZGUgb25seSBmb3IgYW4gT3Blbk1QIHRhcmdldCBkZXZpY2UuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZvcGVubXAtcmVsb2NhdGFibGUtdGFyZ2V0IiwgZm9wZW5tcF9yZWxvY2F0YWJsZV90YXJnZXQsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vQXJndW1lbnRVbnVzZWQgfCBIZWxwSGlkZGVuLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm9wZW5tcC1zaW1kIiwgZm9wZW5tcF9zaW1kLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0FyZ3VtZW50VW51c2VkLCAwLAorICAgICAgICJFbWl0IE9wZW5NUCBjb2RlIG9ubHkgZm9yIFNJTUQtYmFzZWQgY29uc3RydWN0cy4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm9wZW5tcC10YXJnZXRzPSIsIGZvcGVubXBfdGFyZ2V0c19FUSwgQ29tbWFKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENDMU9wdGlvbiwgMCwKKyAgICAgICAiU3BlY2lmeSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0cmlwbGVzIE9wZW5NUCBvZmZsb2FkaW5nIHRhcmdldHMgdG8gYmUgc3VwcG9ydGVkIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZvcGVubXAtdXNlLXRscyIsIGZvcGVubXBfdXNlX3RscywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgTm9Bcmd1bWVudFVudXNlZCB8IEhlbHBIaWRkZW4sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmb3Blbm1wLXZlcnNpb249IiwgZm9wZW5tcF92ZXJzaW9uX0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vQXJndW1lbnRVbnVzZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmb3Blbm1wPSIsIGZvcGVubXBfRVEsIEpvaW5lZCwgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZvcGVubXAiLCBmb3Blbm1wLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0FyZ3VtZW50VW51c2VkLCAwLAorICAgICAgICJQYXJzZSBPcGVuTVAgcHJhZ21hcyBhbmQgZ2VuZXJhdGUgcGFyYWxsZWwgY29kZS4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm9wZXJhdG9yLWFycm93LWRlcHRoPSIsIGZvcGVyYXRvcl9hcnJvd19kZXB0aF9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm9wZXJhdG9yLWFycm93LWRlcHRoIiwgZm9wZXJhdG9yX2Fycm93X2RlcHRoLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIk1heGltdW0gbnVtYmVyIG9mICdvcGVyYXRvci0+J3MgdG8gY2FsbCBmb3IgYSBtZW1iZXIgYWNjZXNzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZvcHRpbWl6YXRpb24tcmVjb3JkLWZpbGU9IiwgZm9wdGltaXphdGlvbl9yZWNvcmRfZmlsZV9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJTcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgYW55IGdlbmVyYXRlZCBZQU1MIG9wdGltaXphdGlvbiByZWNvcmQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm9wdGltaXplLXNpYmxpbmctY2FsbHMiLCBmb3B0aW1pemVfc2libGluZ19jYWxscywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImZvci1saW5rZXI9IiwgX2Zvcl9saW5rZXJfRVEsIEpvaW5lZCwgSU5WQUxJRCwgWGxpbmtlciwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImZvci1saW5rZXIiLCBfZm9yX2xpbmtlciwgU2VwYXJhdGUsIElOVkFMSUQsIFhsaW5rZXIsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJmb3JjZS1saW5rPSIsIF9mb3JjZV9saW5rX0VRLCBKb2luZWQsIElOVkFMSUQsIHUsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJmb3JjZS1saW5rIiwgX2ZvcmNlX2xpbmssIFNlcGFyYXRlLCBJTlZBTElELCB1LCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm9yY2VfY3B1c3VidHlwZV9BTEwiLCBmb3JjZV9fY3B1c3VidHlwZV9fQUxMLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm9yY2VfZmxhdF9uYW1lc3BhY2UiLCBmb3JjZV9fZmxhdF9fbmFtZXNwYWNlLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZm9yY2VfbG9hZCIsIGZvcmNlX19sb2FkLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZvdXRwdXQtY2xhc3MtZGlyPSIsIGZvdXRwdXRfY2xhc3NfZGlyX0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmb3ZlcnJpZGUtcmVjb3JkLWxheW91dD0iLCBmb3ZlcnJpZGVfcmVjb3JkX2xheW91dF9FUSwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiT3ZlcnJpZGUgcmVjb3JkIGxheW91dHMgd2l0aCB0aG9zZSBpbiB0aGUgZ2l2ZW4gZmlsZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJGbyIsIF9TTEFTSF9GbywgSm9pbmVkLCBjbF9jb21waWxlX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiU2V0IG91dHB1dCBvYmplY3QgZmlsZSwgb3IgZGlyZWN0b3J5IChlbmRzIGluIC8gb3IgXFwpICh3aXRoIC9jKSIsICI8ZmlsZSBvciBkaXJlY3Rvcnk+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgImZwOmV4Y2VwdC0iLCBfU0xBU0hfZnBfZXhjZXB0XywgRmxhZywgY2xfR3JvdXAsIGZub190cmFwcGluZ19tYXRoLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICIiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiZnA6ZXhjZXB0IiwgX1NMQVNIX2ZwX2V4Y2VwdCwgRmxhZywgY2xfR3JvdXAsIGZ0cmFwcGluZ19tYXRoLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICIiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiZnA6ZmFzdCIsIF9TTEFTSF9mcF9mYXN0LCBGbGFnLCBjbF9Hcm91cCwgZmZhc3RfbWF0aCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgImZwOnByZWNpc2UiLCBfU0xBU0hfZnBfcHJlY2lzZSwgRmxhZywgY2xfR3JvdXAsIGZub19mYXN0X21hdGgsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJmcDpzdHJpY3QiLCBfU0xBU0hfZnBfc3RyaWN0LCBGbGFnLCBjbF9Hcm91cCwgZm5vX2Zhc3RfbWF0aCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZwYWNrLWRlcml2ZWQiLCBwYWNrX2Rlcml2ZWRfZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmcGFjay1zdHJ1Y3Q9IiwgZnBhY2tfc3RydWN0X0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiU3BlY2lmeSB0aGUgZGVmYXVsdCBtYXhpbXVtIHN0cnVjdCBwYWNraW5nIGFsaWdubWVudCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmcGFjay1zdHJ1Y3QiLCBmcGFja19zdHJ1Y3QsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmcGFyc2UtYWxsLWNvbW1lbnRzIiwgZnBhcnNlX2FsbF9jb21tZW50cywgRmxhZywgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnBhc2NhbC1zdHJpbmdzIiwgZnBhc2NhbF9zdHJpbmdzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlJlY29nbml6ZSBhbmQgY29uc3RydWN0IFBhc2NhbC1zdHlsZSBzdHJpbmcgbGl0ZXJhbHMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnBjYy1zdHJ1Y3QtcmV0dXJuIiwgZnBjY19zdHJ1Y3RfcmV0dXJuLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIk92ZXJyaWRlIHRoZSBkZWZhdWx0IEFCSSB0byByZXR1cm4gYWxsIHN0cnVjdHMgb24gdGhlIHN0YWNrIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZwY2gtcHJlcHJvY2VzcyIsIGZwY2hfcHJlcHJvY2VzcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZwZWVsLWxvb3BzIiwgcGVlbF9sb29wc19mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZwZXJtaXNzaXZlIiwgcGVybWlzc2l2ZV9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmUElDIiwgZlBJQywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZwaWMiLCBmcGljLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZlBJRSIsIGZQSUUsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmcGllIiwgZnBpZSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZwbHQiLCBmcGx0LCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlVzZSB0aGUgUExUIHRvIG1ha2UgZnVuY3Rpb24gY2FsbHMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnBsdWdpbj0iLCBmcGx1Z2luX0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiTG9hZCB0aGUgbmFtZWQgcGx1Z2luIChkeW5hbWljIHNoYXJlZCBvYmplY3QpIiwgIjxkc29wYXRoPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmcHJlYnVpbHQtbW9kdWxlLXBhdGg9IiwgZnByZWJ1aWx0X21vZHVsZV9wYXRoLCBKb2luZWQsIGlfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENDMU9wdGlvbiwgMCwKKyAgICAgICAiU3BlY2lmeSB0aGUgcHJlYnVpbHQgbW9kdWxlIHBhdGgiLCAiPGRpcmVjdG9yeT4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnByZWZldGNoLWxvb3AtYXJyYXlzIiwgcHJlZmV0Y2hfbG9vcF9hcnJheXNfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmcHJlc2VydmUtYXMtY29tbWVudHMiLCBmcHJlc2VydmVfYXNfY29tbWVudHMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmcHJlc2VydmUtdmVjMy10eXBlIiwgZnByZXNlcnZlX3ZlYzNfdHlwZSwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlByZXNlcnZlIDMtY29tcG9uZW50IHZlY3RvciB0eXBlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZwcmludGYiLCBwcmludGZfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnByb2ZpbGUtYXJjcyIsIGZwcm9maWxlX2FyY3MsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmcHJvZmlsZS1jb3JyZWN0aW9uIiwgcHJvZmlsZV9jb3JyZWN0aW9uX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnByb2ZpbGUtZGlyPSIsIGZwcm9maWxlX2RpciwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnByb2ZpbGUtZ2VuZXJhdGUtc2FtcGxpbmciLCBwcm9maWxlX2dlbmVyYXRlX3NhbXBsaW5nX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZwcm9maWxlLWdlbmVyYXRlPSIsIGZwcm9maWxlX2dlbmVyYXRlX0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiR2VuZXJhdGUgaW5zdHJ1bWVudGVkIGNvZGUgdG8gY29sbGVjdCBleGVjdXRpb24gY291bnRzIGludG8gPGRpcmVjdG9yeT4vZGVmYXVsdC5wcm9mcmF3IChvdmVycmlkZGVuIGJ5IExMVk1fUFJPRklMRV9GSUxFIGVudiB2YXIpIiwgIjxkaXJlY3Rvcnk+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZwcm9maWxlLWdlbmVyYXRlIiwgZnByb2ZpbGVfZ2VuZXJhdGUsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiR2VuZXJhdGUgaW5zdHJ1bWVudGVkIGNvZGUgdG8gY29sbGVjdCBleGVjdXRpb24gY291bnRzIGludG8gZGVmYXVsdC5wcm9mcmF3IChvdmVycmlkZGVuIGJ5IExMVk1fUFJPRklMRV9GSUxFIGVudiB2YXIpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZwcm9maWxlLWluc3RyLWdlbmVyYXRlPSIsIGZwcm9maWxlX2luc3RyX2dlbmVyYXRlX0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsCisgICAgICAgIkdlbmVyYXRlIGluc3RydW1lbnRlZCBjb2RlIHRvIGNvbGxlY3QgZXhlY3V0aW9uIGNvdW50cyBpbnRvIDxmaWxlPiAob3ZlcnJpZGRlbiBieSBMTFZNX1BST0ZJTEVfRklMRSBlbnYgdmFyKSIsICI8ZmlsZT4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnByb2ZpbGUtaW5zdHItZ2VuZXJhdGUiLCBmcHJvZmlsZV9pbnN0cl9nZW5lcmF0ZSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiR2VuZXJhdGUgaW5zdHJ1bWVudGVkIGNvZGUgdG8gY29sbGVjdCBleGVjdXRpb24gY291bnRzIGludG8gZGVmYXVsdC5wcm9mcmF3IGZpbGUgKG92ZXJyaWRkZW4gYnkgJz0nIGZvcm0gb2Ygb3B0aW9uIG9yIExMVk1fUFJPRklMRV9GSUxFIGVudiB2YXIpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZwcm9maWxlLWluc3RyLXVzZT0iLCBmcHJvZmlsZV9pbnN0cl91c2VfRVEsIEpvaW5lZCwgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiVXNlIGluc3RydW1lbnRhdGlvbiBkYXRhIGZvciBwcm9maWxlLWd1aWRlZCBvcHRpbWl6YXRpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnByb2ZpbGUtaW5zdHItdXNlIiwgZnByb2ZpbGVfaW5zdHJfdXNlLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnByb2ZpbGUtaW5zdHJ1bWVudC1wYXRoPSIsIGZwcm9maWxlX2luc3RydW1lbnRfcGF0aF9FUSwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiR2VuZXJhdGUgaW5zdHJ1bWVudGVkIGNvZGUgdG8gY29sbGVjdCBleGVjdXRpb24gY291bnRzIGludG8gPGZpbGU+IChvdmVycmlkZGVuIGJ5IExMVk1fUFJPRklMRV9GSUxFIGVudiB2YXIpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZwcm9maWxlLWluc3RydW1lbnQtdXNlLXBhdGg9IiwgZnByb2ZpbGVfaW5zdHJ1bWVudF91c2VfcGF0aF9FUSwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiU3BlY2lmeSB0aGUgcHJvZmlsZSBwYXRoIGluIFBHTyB1c2UgY29tcGlsYXRpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnByb2ZpbGUtaW5zdHJ1bWVudD0iLCBmcHJvZmlsZV9pbnN0cnVtZW50X0VRLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgUEdPIGluc3RydW1lbnRhdGlvbi4gVGhlIGFjY2VwdGVkIHZhbHVlIGlzIGNsYW5nLCBsbHZtLCBvciBub25lIiwgbnVsbHB0ciwgIm5vbmUsY2xhbmcsbGx2bSIpCitPUFRJT04ocHJlZml4XzEsICJmcHJvZmlsZS1yZXVzZWRpc3QiLCBwcm9maWxlX3JldXNlZGlzdF9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmcHJvZmlsZS1zYW1wbGUtYWNjdXJhdGUiLCBmcHJvZmlsZV9zYW1wbGVfYWNjdXJhdGUsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENDMU9wdGlvbiwgMCwKKyAgICAgICAiU3BlY2lmaWVzIHRoYXQgdGhlIHNhbXBsZSBwcm9maWxlIGlzIGFjY3VyYXRlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZwcm9maWxlLXNhbXBsZS11c2U9IiwgZnByb2ZpbGVfc2FtcGxlX3VzZV9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBzYW1wbGUtYmFzZWQgcHJvZmlsZSBndWlkZWQgb3B0aW1pemF0aW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmcHJvZmlsZS1zYW1wbGUtdXNlIiwgZnByb2ZpbGVfc2FtcGxlX3VzZSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZwcm9maWxlLXVzZT0iLCBmcHJvZmlsZV91c2VfRVEsIEpvaW5lZCwgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJVc2UgaW5zdHJ1bWVudGF0aW9uIGRhdGEgZm9yIHByb2ZpbGUtZ3VpZGVkIG9wdGltaXphdGlvbi4gSWYgcGF0aG5hbWUgaXMgYSBkaXJlY3RvcnksIGl0IHJlYWRzIGZyb20gPHBhdGhuYW1lPi9kZWZhdWx0LnByb2ZkYXRhLiBPdGhlcndpc2UsIGl0IHJlYWRzIGZyb20gZmlsZSA8cGF0aG5hbWU+LiIsICI8cGF0aG5hbWU+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZwcm9maWxlLXVzZSIsIGZwcm9maWxlX3VzZSwgRmxhZywgZl9Hcm91cCwgZnByb2ZpbGVfaW5zdHJfdXNlLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnByb2ZpbGUtdmFsdWVzIiwgcHJvZmlsZV92YWx1ZXNfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmcHJvZmlsZSIsIHByb2ZpbGVfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnByb3RlY3QtcGFyZW5zIiwgcHJvdGVjdF9wYXJlbnNfZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJGcCIsIF9TTEFTSF9GcCwgSm9pbmVkLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiU2V0IHBjaCBmaWxlbmFtZSAod2l0aCAvWWMgYW5kIC9ZdSkiLCAiPGZpbGVuYW1lPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmcmFtZXdvcmsiLCBmcmFtZXdvcmssIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBMaW5rZXJJbnB1dCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZyYW5kb20tc2VlZD0iLCBmcmFuZG9tX3NlZWRfRVEsIEpvaW5lZCwgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnJhbmdlLWNoZWNrIiwgcmFuZ2VfY2hlY2tfZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmcmVhbC00LXJlYWwtMTAiLCByZWFsXzRfcmVhbF8xMF9mLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZyZWFsLTQtcmVhbC0xNiIsIHJlYWxfNF9yZWFsXzE2X2YsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnJlYWwtNC1yZWFsLTgiLCByZWFsXzRfcmVhbF84X2YsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnJlYWwtOC1yZWFsLTEwIiwgcmVhbF84X3JlYWxfMTBfZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmcmVhbC04LXJlYWwtMTYiLCByZWFsXzhfcmVhbF8xNl9mLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZyZWFsLTgtcmVhbC00IiwgcmVhbF84X3JlYWxfNF9mLCBGbGFnLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZyZWFsbG9jLWxocyIsIHJlYWxsb2NfbGhzX2YsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnJlY2lwcm9jYWwtbWF0aCIsIGZyZWNpcHJvY2FsX21hdGgsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiQWxsb3cgZGl2aXNpb24gb3BlcmF0aW9ucyB0byBiZSByZWFzc29jaWF0ZWQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnJlY29yZC1tYXJrZXI9IiwgZnJlY29yZF9tYXJrZXJfRVEsIEpvaW5lZCwgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmcmVjdXJzaXZlIiwgcmVjdXJzaXZlX2YsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnJlZy1zdHJ1Y3QtcmV0dXJuIiwgZnJlZ19zdHJ1Y3RfcmV0dXJuLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIk92ZXJyaWRlIHRoZSBkZWZhdWx0IEFCSSB0byByZXR1cm4gc21hbGwgc3RydWN0cyBpbiByZWdpc3RlcnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnJlZ3MtZ3JhcGgiLCByZWdzX2dyYXBoX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZyZWxheGVkLXRlbXBsYXRlLXRlbXBsYXRlLWFyZ3MiLCBmcmVsYXhlZF90ZW1wbGF0ZV90ZW1wbGF0ZV9hcmdzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBDKysxNyByZWxheGVkIHRlbXBsYXRlIHRlbXBsYXRlIGFyZ3VtZW50IG1hdGNoaW5nIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZyZW5hbWUtcmVnaXN0ZXJzIiwgcmVuYW1lX3JlZ2lzdGVyc19mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZyZW9yZGVyLWJsb2NrcyIsIHJlb3JkZXJfYmxvY2tzX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnJlcGFjay1hcnJheXMiLCByZXBhY2tfYXJyYXlzX2YsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnJlcm9sbC1sb29wcyIsIGZyZXJvbGxfbG9vcHMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiVHVybiBvbiBsb29wIHJlcm9sbGVyIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZyZXRhaW4tY29tbWVudHMtZnJvbS1zeXN0ZW0taGVhZGVycyIsIGZyZXRhaW5fY29tbWVudHNfZnJvbV9zeXN0ZW1faGVhZGVycywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnJld3JpdGUtaW1wb3J0cyIsIGZyZXdyaXRlX2ltcG9ydHMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZyZXdyaXRlLWluY2x1ZGVzIiwgZnJld3JpdGVfaW5jbHVkZXMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZyZXdyaXRlLW1hcC1maWxlPSIsIGZyZXdyaXRlX21hcF9maWxlX0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZyZXdyaXRlLW1hcC1maWxlIiwgZnJld3JpdGVfbWFwX2ZpbGUsIFNlcGFyYXRlLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBDQzFPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmcmlwYSIsIHJpcGFfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnJvcGkiLCBmcm9waSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZyb3VuZGluZy1tYXRoIiwgcm91bmRpbmdfbWF0aF9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZydGxpYi1hZGQtcnBhdGgiLCBmcnRsaWJfYWRkX3JwYXRoLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBOb0FyZ3VtZW50VW51c2VkLCAwLAorICAgICAgICJBZGQgLXJwYXRoIHdpdGggYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHJlc291cmNlIGRpcmVjdG9yeSB0byB0aGUgbGlua2VyIGZsYWdzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZydHRpIiwgZnJ0dGksIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmcndwaSIsIGZyd3BpLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiRlIiLCBfU0xBU0hfRlIsIEpvaW5lZCwgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJGciIsIF9TTEFTSF9GciwgSm9pbmVkLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzYW5pdGl6ZS1hZGRyZXNzLWZpZWxkLXBhZGRpbmc9IiwgZnNhbml0aXplX2FkZHJlc3NfZmllbGRfcGFkZGluZywgSm9pbmVkLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJMZXZlbCBvZiBmaWVsZCBwYWRkaW5nIGZvciBBZGRyZXNzU2FuaXRpemVyIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzYW5pdGl6ZS1hZGRyZXNzLWdsb2JhbHMtZGVhZC1zdHJpcHBpbmciLCBmc2FuaXRpemVfYWRkcmVzc19nbG9iYWxzX2RlYWRfc3RyaXBwaW5nLCBGbGFnLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgbGlua2VyIGRlYWQgc3RyaXBwaW5nIG9mIGdsb2JhbHMgaW4gQWRkcmVzc1Nhbml0aXplciIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2FuaXRpemUtYWRkcmVzcy1wb2lzb24tY2xhc3MtbWVtYmVyLWFycmF5LW5ldy1jb29raWUiLCBmc2FuaXRpemVfYWRkcmVzc19wb2lzb25fY2xhc3NfbWVtYmVyX2FycmF5X25ld19jb29raWUsIEZsYWcsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBwb2lzb25pbmcgYXJyYXkgY29va2llcyB3aGVuIHVzaW5nIGNsYXNzIG1lbWJlciBvcGVyYXRvciBuZXdbXSBpbiBBZGRyZXNzU2FuaXRpemVyIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzYW5pdGl6ZS1hZGRyZXNzLXVzZS1hZnRlci1zY29wZSIsIGZzYW5pdGl6ZV9hZGRyZXNzX3VzZV9hZnRlcl9zY29wZSwgRmxhZywgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIHVzZS1hZnRlci1zY29wZSBkZXRlY3Rpb24gaW4gQWRkcmVzc1Nhbml0aXplciIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2FuaXRpemUtYmxhY2tsaXN0PSIsIGZzYW5pdGl6ZV9ibGFja2xpc3QsIEpvaW5lZCwgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiUGF0aCB0byBibGFja2xpc3QgZmlsZSBmb3Igc2FuaXRpemVycyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2FuaXRpemUtY2ZpLWNyb3NzLWRzbyIsIGZzYW5pdGl6ZV9jZmlfY3Jvc3NfZHNvLCBGbGFnLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgY29udHJvbCBmbG93IGludGVncml0eSAoQ0ZJKSBjaGVja3MgZm9yIGNyb3NzLURTTyBjYWxscy4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNhbml0aXplLWNmaS1pY2FsbC1nZW5lcmFsaXplLXBvaW50ZXJzIiwgZnNhbml0aXplX2NmaV9pY2FsbF9nZW5lcmFsaXplX3BvaW50ZXJzLCBGbGFnLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJHZW5lcmFsaXplIHBvaW50ZXJzIGluIENGSSBpbmRpcmVjdCBjYWxsIHR5cGUgc2lnbmF0dXJlIGNoZWNrcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2FuaXRpemUtY292ZXJhZ2UtOGJpdC1jb3VudGVycyIsIGZzYW5pdGl6ZV9jb3ZlcmFnZV84Yml0X2NvdW50ZXJzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIGZyZXF1ZW5jeSBjb3VudGVycyBpbiBzYW5pdGl6ZXIgY292ZXJhZ2UiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNhbml0aXplLWNvdmVyYWdlLWluZGlyZWN0LWNhbGxzIiwgZnNhbml0aXplX2NvdmVyYWdlX2luZGlyZWN0X2NhbGxzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIHNhbml0aXplciBjb3ZlcmFnZSBmb3IgaW5kaXJlY3QgY2FsbHMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNhbml0aXplLWNvdmVyYWdlLWlubGluZS04Yml0LWNvdW50ZXJzIiwgZnNhbml0aXplX2NvdmVyYWdlX2lubGluZV84Yml0X2NvdW50ZXJzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIGlubGluZSA4LWJpdCBjb3VudGVycyBpbiBzYW5pdGl6ZXIgY292ZXJhZ2UiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNhbml0aXplLWNvdmVyYWdlLW5vLXBydW5lIiwgZnNhbml0aXplX2NvdmVyYWdlX25vX3BydW5lLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSBjb3ZlcmFnZSBwcnVuaW5nIChpLmUuIGluc3RydW1lbnQgYWxsIGJsb2Nrcy9lZGdlcykiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNhbml0aXplLWNvdmVyYWdlLXBjLXRhYmxlIiwgZnNhbml0aXplX2NvdmVyYWdlX3BjX3RhYmxlLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiQ3JlYXRlIGEgdGFibGUgb2YgY292ZXJhZ2UtaW5zdHJ1bWVudGVkIFBDcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2FuaXRpemUtY292ZXJhZ2Utc3RhY2stZGVwdGgiLCBmc2FuaXRpemVfY292ZXJhZ2Vfc3RhY2tfZGVwdGgsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgbWF4IHN0YWNrIGRlcHRoIHRyYWNpbmciLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNhbml0aXplLWNvdmVyYWdlLXRyYWNlLWJiIiwgZnNhbml0aXplX2NvdmVyYWdlX3RyYWNlX2JiLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIGJhc2ljIGJsb2NrIHRyYWNpbmcgaW4gc2FuaXRpemVyIGNvdmVyYWdlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzYW5pdGl6ZS1jb3ZlcmFnZS10cmFjZS1jbXAiLCBmc2FuaXRpemVfY292ZXJhZ2VfdHJhY2VfY21wLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIGNtcCBpbnN0cnVjdGlvbiB0cmFjaW5nIGluIHNhbml0aXplciBjb3ZlcmFnZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2FuaXRpemUtY292ZXJhZ2UtdHJhY2UtZGl2IiwgZnNhbml0aXplX2NvdmVyYWdlX3RyYWNlX2RpdiwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBkaXYgaW5zdHJ1Y3Rpb24gdHJhY2luZyBpbiBzYW5pdGl6ZXIgY292ZXJhZ2UiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNhbml0aXplLWNvdmVyYWdlLXRyYWNlLWdlcCIsIGZzYW5pdGl6ZV9jb3ZlcmFnZV90cmFjZV9nZXAsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgZ2VwIGluc3RydWN0aW9uIHRyYWNpbmcgaW4gc2FuaXRpemVyIGNvdmVyYWdlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzYW5pdGl6ZS1jb3ZlcmFnZS10cmFjZS1wYy1ndWFyZCIsIGZzYW5pdGl6ZV9jb3ZlcmFnZV90cmFjZV9wY19ndWFyZCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBQQyB0cmFjaW5nIHdpdGggZ3VhcmQgaW4gc2FuaXRpemVyIGNvdmVyYWdlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzYW5pdGl6ZS1jb3ZlcmFnZS10cmFjZS1wYyIsIGZzYW5pdGl6ZV9jb3ZlcmFnZV90cmFjZV9wYywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBQQyB0cmFjaW5nIGluIHNhbml0aXplciBjb3ZlcmFnZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2FuaXRpemUtY292ZXJhZ2UtdHlwZT0iLCBmc2FuaXRpemVfY292ZXJhZ2VfdHlwZSwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiU2FuaXRpemVyIGNvdmVyYWdlIHR5cGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNhbml0aXplLWNvdmVyYWdlPSIsIGZzYW5pdGl6ZV9jb3ZlcmFnZSwgQ29tbWFKb2luZWQsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIlNwZWNpZnkgdGhlIHR5cGUgb2YgY292ZXJhZ2UgaW5zdHJ1bWVudGF0aW9uIGZvciBTYW5pdGl6ZXJzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzYW5pdGl6ZS1saW5rLWMrKy1ydW50aW1lIiwgZnNhbml0aXplX2xpbmtfY3h4X3J1bnRpbWUsIEZsYWcsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2FuaXRpemUtbWVtb3J5LXRyYWNrLW9yaWdpbnM9IiwgZnNhbml0aXplX21lbW9yeV90cmFja19vcmlnaW5zX0VRLCBKb2luZWQsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBvcmlnaW5zIHRyYWNraW5nIGluIE1lbW9yeVNhbml0aXplciIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2FuaXRpemUtbWVtb3J5LXRyYWNrLW9yaWdpbnMiLCBmc2FuaXRpemVfbWVtb3J5X3RyYWNrX29yaWdpbnMsIEZsYWcsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBvcmlnaW5zIHRyYWNraW5nIGluIE1lbW9yeVNhbml0aXplciIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2FuaXRpemUtbWVtb3J5LXVzZS1hZnRlci1kdG9yIiwgZnNhbml0aXplX21lbW9yeV91c2VfYWZ0ZXJfZHRvciwgRmxhZywgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIHVzZS1hZnRlci1kZXN0cm95IGRldGVjdGlvbiBpbiBNZW1vcnlTYW5pdGl6ZXIiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNhbml0aXplLW1pbmltYWwtcnVudGltZSIsIGZzYW5pdGl6ZV9taW5pbWFsX3J1bnRpbWUsIEZsYWcsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2FuaXRpemUtcmVjb3Zlcj0iLCBmc2FuaXRpemVfcmVjb3Zlcl9FUSwgQ29tbWFKb2luZWQsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSByZWNvdmVyeSBmb3Igc3BlY2lmaWVkIHNhbml0aXplcnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNhbml0aXplLXJlY292ZXIiLCBmc2FuaXRpemVfcmVjb3ZlciwgRmxhZywgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzYW5pdGl6ZS1zdGF0cyIsIGZzYW5pdGl6ZV9zdGF0cywgRmxhZywgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIHNhbml0aXplciBzdGF0aXN0aWNzIGdhdGhlcmluZy4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNhbml0aXplLXRocmVhZC1hdG9taWNzIiwgZnNhbml0aXplX3RocmVhZF9hdG9taWNzLCBGbGFnLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgYXRvbWljIG9wZXJhdGlvbnMgaW5zdHJ1bWVudGF0aW9uIGluIFRocmVhZFNhbml0aXplciAoZGVmYXVsdCkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNhbml0aXplLXRocmVhZC1mdW5jLWVudHJ5LWV4aXQiLCBmc2FuaXRpemVfdGhyZWFkX2Z1bmNfZW50cnlfZXhpdCwgRmxhZywgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIGZ1bmN0aW9uIGVudHJ5L2V4aXQgaW5zdHJ1bWVudGF0aW9uIGluIFRocmVhZFNhbml0aXplciAoZGVmYXVsdCkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNhbml0aXplLXRocmVhZC1tZW1vcnktYWNjZXNzIiwgZnNhbml0aXplX3RocmVhZF9tZW1vcnlfYWNjZXNzLCBGbGFnLCBmX2NsYW5nX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgbWVtb3J5IGFjY2VzcyBpbnN0cnVtZW50YXRpb24gaW4gVGhyZWFkU2FuaXRpemVyIChkZWZhdWx0KSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2FuaXRpemUtdHJhcD0iLCBmc2FuaXRpemVfdHJhcF9FUSwgQ29tbWFKb2luZWQsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSB0cmFwcGluZyBmb3Igc3BlY2lmaWVkIHNhbml0aXplcnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNhbml0aXplLXVuZGVmaW5lZC1zdHJpcC1wYXRoLWNvbXBvbmVudHM9IiwgZnNhbml0aXplX3VuZGVmaW5lZF9zdHJpcF9wYXRoX2NvbXBvbmVudHNfRVEsIEpvaW5lZCwgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiU3RyaXAgKG9yIGtlZXAgb25seSwgaWYgbmVnYXRpdmUpIGEgZ2l2ZW4gbnVtYmVyIG9mIHBhdGggY29tcG9uZW50cyB3aGVuIGVtaXR0aW5nIGNoZWNrIG1ldGFkYXRhLiIsICI8bnVtYmVyPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2FuaXRpemUtdW5kZWZpbmVkLXRyYXAtb24tZXJyb3IiLCBmc2FuaXRpemVfdW5kZWZpbmVkX3RyYXBfb25fZXJyb3IsIEZsYWcsIGZfY2xhbmdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2FuaXRpemU9IiwgZnNhbml0aXplX0VRLCBDb21tYUpvaW5lZCwgZl9jbGFuZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiVHVybiBvbiBydW50aW1lIGNoZWNrcyBmb3IgdmFyaW91cyBmb3JtcyBvZiB1bmRlZmluZWQgb3Igc3VzcGljaW91cyBiZWhhdmlvci4gU2VlIHVzZXIgbWFudWFsIGZvciBhdmFpbGFibGUgY2hlY2tzIiwgIjxjaGVjaz4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNhdmUtb3B0aW1pemF0aW9uLXJlY29yZCIsIGZzYXZlX29wdGltaXphdGlvbl9yZWNvcmQsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkdlbmVyYXRlIGEgWUFNTCBvcHRpbWl6YXRpb24gcmVjb3JkIGZpbGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNjaGVkLWludGVyYmxvY2siLCBhbm9ueW1vdXNfMTYsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzY2hlZHVsZS1pbnNuczIiLCBzY2hlZHVsZV9pbnNuczJfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2NoZWR1bGUtaW5zbnMiLCBzY2hlZHVsZV9pbnNuc19mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzZWNvbmQtdW5kZXJzY29yZSIsIHNlY29uZF91bmRlcnNjb3JlX2YsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNlZSIsIHNlZV9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2VoLWV4Y2VwdGlvbnMiLCBmc2VoX2V4Y2VwdGlvbnMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiVXNlIFNFSCBzdHlsZSBleGNlcHRpb25zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzaG9ydC1lbnVtcyIsIGZzaG9ydF9lbnVtcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJBbGxvY2F0ZSB0byBhbiBlbnVtIHR5cGUgb25seSBhcyBtYW55IGJ5dGVzIGFzIGl0IG5lZWRzIGZvciB0aGUgZGVjbGFyZWQgcmFuZ2Ugb2YgcG9zc2libGUgdmFsdWVzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzaG9ydC13Y2hhciIsIGZzaG9ydF93Y2hhciwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRm9yY2Ugd2NoYXJfdCB0byBiZSBhIHNob3J0IHVuc2lnbmVkIGludCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2hvdy1jb2x1bW4iLCBmc2hvd19jb2x1bW4sIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzaG93LW92ZXJsb2Fkcz0iLCBmc2hvd19vdmVybG9hZHNfRVEsIEpvaW5lZCwgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJXaGljaCBvdmVybG9hZCBjYW5kaWRhdGVzIHRvIHNob3cgd2hlbiBvdmVybG9hZCByZXNvbHV0aW9uIGZhaWxzOiBiZXN0fGFsbDsgZGVmYXVsdHMgdG8gYWxsIiwgbnVsbHB0ciwgImJlc3QsYWxsIikKK09QVElPTihwcmVmaXhfMSwgImZzaG93LXNvdXJjZS1sb2NhdGlvbiIsIGZzaG93X3NvdXJjZV9sb2NhdGlvbiwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzaWduLXplcm8iLCBzaWduX3plcm9fZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2lnbmFsaW5nLW1hdGgiLCBmc2lnbmFsaW5nX21hdGgsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2lnbmFsaW5nLW5hbnMiLCBzaWduYWxpbmdfbmFuc19mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzaWduZWQtYml0ZmllbGRzIiwgZnNpZ25lZF9iaXRmaWVsZHMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2lnbmVkLWNoYXIiLCBmc2lnbmVkX2NoYXIsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc2lnbmVkLXdjaGFyIiwgZnNpZ25lZF93Y2hhciwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlVzZSBhIHNpZ25lZCB0eXBlIGZvciB3Y2hhcl90IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzaWduZWQtemVyb3MiLCBmc2lnbmVkX3plcm9zLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNpbmdsZS1wcmVjaXNpb24tY29uc3RhbnQiLCBzaW5nbGVfcHJlY2lzaW9uX2NvbnN0YW50X2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNpemVkLWRlYWxsb2NhdGlvbiIsIGZzaXplZF9kZWFsbG9jYXRpb24sIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIEMrKzE0IHNpemVkIGdsb2JhbCBkZWFsbG9jYXRpb24gZnVuY3Rpb25zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzamxqLWV4Y2VwdGlvbnMiLCBmc2psal9leGNlcHRpb25zLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlVzZSBTakxqIHN0eWxlIGV4Y2VwdGlvbnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNscC12ZWN0b3JpemUtYWdncmVzc2l2ZSIsIGFub255bW91c18wLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2xlZ2FjeV9vcHRpb25zX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNscC12ZWN0b3JpemUiLCBmc2xwX3ZlY3Rvcml6ZSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRW5hYmxlIHRoZSBzdXBlcndvcmQtbGV2ZWwgcGFyYWxsZWxpc20gdmVjdG9yaXphdGlvbiBwYXNzZXMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNwZWMtY29uc3RyLWNvdW50Iiwgc3BlY19jb25zdHJfY291bnRfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNwZWxsLWNoZWNraW5nLWxpbWl0PSIsIGZzcGVsbF9jaGVja2luZ19saW1pdF9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnNwZWxsLWNoZWNraW5nLWxpbWl0IiwgZnNwZWxsX2NoZWNraW5nX2xpbWl0LCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdG8gcGVyZm9ybSBzcGVsbCBjaGVja2luZyBvbiB1bnJlY29nbml6ZWQgaWRlbnRpZmllcnMgKDAgPSBubyBsaW1pdCkuIiwgIjxOPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc3BlbGwtY2hlY2tpbmciLCBmc3BlbGxfY2hlY2tpbmcsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc3BsaXQtZHdhcmYtaW5saW5pbmciLCBmc3BsaXRfZHdhcmZfaW5saW5pbmcsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiUHJvdmlkZSBtaW5pbWFsIGRlYnVnIGluZm8gaW4gdGhlIG9iamVjdC9leGVjdXRhYmxlIHRvIGZhY2lsaXRhdGUgb25saW5lIHN5bWJvbGljYXRpb24vc3RhY2sgdHJhY2VzIGluIHRoZSBhYnNlbmNlIG9mIC5kd28vLmR3cCBmaWxlcyB3aGVuIHVzaW5nIFNwbGl0IERXQVJGIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzcGxpdC1zdGFjayIsIGZzcGxpdF9zdGFjaywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzdGFjay1hcnJheXMiLCBzdGFja19hcnJheXNfZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc3RhY2stY2hlY2siLCBzdGFja19jaGVja19mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc3RhY2stcHJvdGVjdG9yLWFsbCIsIGZzdGFja19wcm90ZWN0b3JfYWxsLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJGb3JjZSB0aGUgdXNhZ2Ugb2Ygc3RhY2sgcHJvdGVjdG9ycyBmb3IgYWxsIGZ1bmN0aW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc3RhY2stcHJvdGVjdG9yLXN0cm9uZyIsIGZzdGFja19wcm90ZWN0b3Jfc3Ryb25nLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJVc2UgYSBzdHJvbmcgaGV1cmlzdGljIHRvIGFwcGx5IHN0YWNrIHByb3RlY3RvcnMgdG8gZnVuY3Rpb25zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzdGFjay1wcm90ZWN0b3IiLCBmc3RhY2tfcHJvdGVjdG9yLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJFbmFibGUgc3RhY2sgcHJvdGVjdG9ycyBmb3IgZnVuY3Rpb25zIHBvdGVudGlhbGx5IHZ1bG5lcmFibGUgdG8gc3RhY2sgc21hc2hpbmciLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnN0YWNrLXNpemUtc2VjdGlvbiIsIGZzdGFja19zaXplX3NlY3Rpb24sIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRW1pdCBzZWN0aW9uIGNvbnRhaW5pbmcgbWV0YWRhdGEgb24gZnVuY3Rpb24gc3RhY2sgc2l6ZXMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnN0YW5kYWxvbmUtZGVidWciLCBmc3RhbmRhbG9uZV9kZWJ1ZywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiRW1pdCBmdWxsIGRlYnVnIGluZm8gZm9yIGFsbCB0eXBlcyB1c2VkIGJ5IHRoZSBwcm9ncmFtIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzdHJlbmd0aC1yZWR1Y2UiLCBzdHJlbmd0aF9yZWR1Y2VfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc3RyaWN0LWFsaWFzaW5nIiwgZnN0cmljdF9hbGlhc2luZywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZzdHJpY3QtZW51bXMiLCBmc3RyaWN0X2VudW1zLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBvcHRpbWl6YXRpb25zIGJhc2VkIG9uIHRoZSBzdHJpY3QgZGVmaW5pdGlvbiBvZiBhbiBlbnVtJ3MgdmFsdWUgcmFuZ2UiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnN0cmljdC1vdmVyZmxvdyIsIGZzdHJpY3Rfb3ZlcmZsb3csIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc3RyaWN0LXJldHVybiIsIGZzdHJpY3RfcmV0dXJuLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkFsd2F5cyB0cmVhdCBjb250cm9sIGZsb3cgcGF0aHMgdGhhdCBmYWxsIG9mZiB0aGUgZW5kIG9mIGEgbm9uLXZvaWQgZnVuY3Rpb24gYXMgdW5yZWFjaGFibGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnN0cmljdC12dGFibGUtcG9pbnRlcnMiLCBmc3RyaWN0X3Z0YWJsZV9wb2ludGVycywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgb3B0aW1pemF0aW9ucyBiYXNlZCBvbiB0aGUgc3RyaWN0IHJ1bGVzIGZvciBvdmVyd3JpdGluZyBwb2x5bW9ycGhpYyBDKysgb2JqZWN0cyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmc3RydWN0LXBhdGgtdGJhYSIsIGZzdHJ1Y3RfcGF0aF90YmFhLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnN5bnRheC1vbmx5IiwgZnN5bnRheF9vbmx5LCBGbGFnLCBBY3Rpb25fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENvcmVPcHRpb24gfCBDQzFPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJGUyIsIF9TTEFTSF9GUywgRmxhZywgY2xfaWdub3JlZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdGFic3RvcD0iLCBmdGFic3RvcF9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnRhYnN0b3AiLCBmdGFic3RvcCwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJTZXQgdGhlIHRhYiBzdG9wIGRpc3RhbmNlLiIsICI8Tj4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnRlbXBsYXRlLWJhY2t0cmFjZS1saW1pdD0iLCBmdGVtcGxhdGVfYmFja3RyYWNlX2xpbWl0X0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdGVtcGxhdGUtYmFja3RyYWNlLWxpbWl0IiwgZnRlbXBsYXRlX2JhY2t0cmFjZV9saW1pdCwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgdG8gcHJpbnQgaW4gYSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGJhY2t0cmFjZSAoMCA9IG5vIGxpbWl0KS4iLCAiPE4+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ0ZW1wbGF0ZS1kZXB0aC0iLCBmdGVtcGxhdGVfZGVwdGhfLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdGVtcGxhdGUtZGVwdGg9IiwgZnRlbXBsYXRlX2RlcHRoX0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdGVtcGxhdGUtZGVwdGgiLCBmdGVtcGxhdGVfZGVwdGgsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiTWF4aW11bSBkZXB0aCBvZiByZWN1cnNpdmUgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdGVybWluYXRlZC12dGFibGVzIiwgYW5vbnltb3VzXzIxLCBGbGFnLCBJTlZBTElELCBmYXBwbGVfa2V4dCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ0ZXN0LWNvdmVyYWdlIiwgZnRlc3RfY292ZXJhZ2UsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdGVzdC1tb2R1bGUtZmlsZS1leHRlbnNpb249IiwgZnRlc3RfbW9kdWxlX2ZpbGVfZXh0ZW5zaW9uX0VRLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJpbnRyb2R1Y2UgYSBtb2R1bGUgZmlsZSBleHRlbnNpb24gZm9yIHRlc3RpbmcgcHVycG9zZXMuIFRoZSBhcmd1bWVudCBpcyBwYXJzZWQgYXMgYmxvY2tuYW1lOm1ham9yOm1pbm9yOmhhc2hlZDp1c2VyIGluZm8iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnRoaW4tbGluay1iaXRjb2RlPSIsIGZ0aGluX2xpbmtfYml0Y29kZV9FUSwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiV3JpdGUgbWluaW1pemVkIGJpdGNvZGUgdG8gPGZpbGU+IGZvciB0aGUgVGhpbkxUTyB0aGluIGxpbmsgb25seSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdGhpbmx0by1pbmRleD0iLCBmdGhpbmx0b19pbmRleF9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlBlcmZvcm0gVGhpbkxUTyBpbXBvcnRpbmcgdXNpbmcgcHJvdmlkZWQgZnVuY3Rpb24gc3VtbWFyeSBpbmRleCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdGhyZWFkc2FmZS1zdGF0aWNzIiwgZnRocmVhZHNhZmVfc3RhdGljcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ0aW1lLXJlcG9ydCIsIGZ0aW1lX3JlcG9ydCwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnRscy1tb2RlbD0iLCBmdGxzbW9kZWxfRVEsIEpvaW5lZCwgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnRscy1tb2RlbCIsIHRsc19tb2RlbF9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdHJhY2VyIiwgdHJhY2VyX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnRyYXAtZnVuY3Rpb249IiwgZnRyYXBfZnVuY3Rpb25fRVEsIEpvaW5lZCwgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJJc3N1ZSBjYWxsIHRvIHNwZWNpZmllZCBmdW5jdGlvbiByYXRoZXIgdGhhbiBhIHRyYXAgaW5zdHJ1Y3Rpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnRyYXBwaW5nLW1hdGgiLCBmdHJhcHBpbmdfbWF0aCwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnRyYXB2LWhhbmRsZXI9IiwgZnRyYXB2X2hhbmRsZXJfRVEsIEpvaW5lZCwgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiU3BlY2lmeSB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIG92ZXJmbG93IiwgIjxmdW5jdGlvbiBuYW1lPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdHJhcHYtaGFuZGxlciIsIGZ0cmFwdl9oYW5kbGVyLCBTZXBhcmF0ZSwgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnRyYXB2IiwgZnRyYXB2LCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlRyYXAgb24gaW50ZWdlciBvdmVyZmxvdyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdHJlZS1kY2UiLCB0cmVlX2RjZV9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ0cmVlLXNhbGlhcyIsIHRyZWVfc2FsaWFzX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ0cmVlLXNscC12ZWN0b3JpemUiLCBhbm9ueW1vdXNfMTksIEZsYWcsIElOVkFMSUQsIGZzbHBfdmVjdG9yaXplLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnRyZWUtdGVyIiwgdHJlZV90ZXJfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdHJlZS12ZWN0b3JpemVyLXZlcmJvc2UiLCB0cmVlX3ZlY3Rvcml6ZXJfdmVyYm9zZV9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdHJlZS12ZWN0b3JpemUiLCBhbm9ueW1vdXNfMTcsIEZsYWcsIElOVkFMSUQsIGZ2ZWN0b3JpemUsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdHJlZS12cnAiLCB0cmVlX3ZycF9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ0cmVlX2xvb3BfaW0iLCB0cmVlX2xvb3BfaW1fZiwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdHJlZV9sb29wX2l2Y2Fub24iLCB0cmVlX2xvb3BfaXZjYW5vbl9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ0cmVlX2xvb3BfbGluZWFyIiwgdHJlZV9sb29wX2xpbmVhcl9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ0cmlncmFwaHMiLCBmdHJpZ3JhcGhzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlByb2Nlc3MgdHJpZ3JhcGggc2VxdWVuY2VzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ0eXBlLXZpc2liaWxpdHkiLCBmdHlwZV92aXNpYmlsaXR5LCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkRlZmF1bHQgdHlwZSB2aXNpYmlsaXR5IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ1bmRlcnNjb3JpbmciLCB1bmRlcnNjb3JpbmdfZiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdW5pcXVlLXNlY3Rpb24tbmFtZXMiLCBmdW5pcXVlX3NlY3Rpb25fbmFtZXMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiVXNlIHVuaXF1ZSBuYW1lcyBmb3IgdGV4dCBhbmQgZGF0YSBzZWN0aW9ucyAoRUxGIE9ubHkpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ1bml0LWF0LWEtdGltZSIsIGZ1bml0X2F0X2FfdGltZSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ1bmtub3duLWFueXR5cGUiLCBmdW5rbm93bl9hbnl0eXBlLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIHBhcnNlciBzdXBwb3J0IGZvciB0aGUgX191bmtub3duX2FueXR5cGUgdHlwZTsgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdW5yb2xsLWFsbC1sb29wcyIsIHVucm9sbF9hbGxfbG9vcHNfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdW5yb2xsLWxvb3BzIiwgZnVucm9sbF9sb29wcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJUdXJuIG9uIGxvb3AgdW5yb2xsZXIiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnVuc2FmZS1sb29wLW9wdGltaXphdGlvbnMiLCB1bnNhZmVfbG9vcF9vcHRpbWl6YXRpb25zX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnVuc2FmZS1tYXRoLW9wdGltaXphdGlvbnMiLCBmdW5zYWZlX21hdGhfb3B0aW1pemF0aW9ucywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ1bnNpZ25lZC1iaXRmaWVsZHMiLCBmdW5zaWduZWRfYml0ZmllbGRzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnVuc2lnbmVkLWNoYXIiLCBmdW5zaWduZWRfY2hhciwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ1bnN3aXRjaC1sb29wcyIsIHVuc3dpdGNoX2xvb3BzX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnVud2luZC10YWJsZXMiLCBmdW53aW5kX3RhYmxlcywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ1c2UtY3hhLWF0ZXhpdCIsIGZ1c2VfY3hhX2F0ZXhpdCwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ1c2UtaW5pdC1hcnJheSIsIGZ1c2VfaW5pdF9hcnJheSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJVc2UgLmluaXRfYXJyYXkgaW5zdGVhZCBvZiAuY3RvcnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnVzZS1sZD0iLCBmdXNlX2xkX0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdXNlLWxpbmUtZGlyZWN0aXZlcyIsIGZ1c2VfbGluZV9kaXJlY3RpdmVzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdXNlLWxpbmtlci1wbHVnaW4iLCB1c2VfbGlua2VyX3BsdWdpbl9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ1c2UtcmVnaXN0ZXItc2l6ZWQtYml0ZmllbGQtYWNjZXNzIiwgZnVzZV9yZWdpc3Rlcl9zaXplZF9iaXRmaWVsZF9hY2Nlc3MsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJVc2UgcmVnaXN0ZXIgc2l6ZWQgYWNjZXNzZXMgdG8gYml0LWZpZWxkcywgd2hlbiBwb3NzaWJsZS4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiRlUiLCBfU0xBU0hfRlUsIEpvaW5lZE9yU2VwYXJhdGUsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnZhcmlhYmxlLWV4cGFuc2lvbi1pbi11bnJvbGxlciIsIHZhcmlhYmxlX2V4cGFuc2lvbl9pbl91bnJvbGxlcl9mLCBGbGFnLCBjbGFuZ19pZ25vcmVkX2djY19vcHRpbWl6YXRpb25fZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ2ZWNsaWI9IiwgZnZlY2xpYiwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlVzZSB0aGUgZ2l2ZW4gdmVjdG9yIGZ1bmN0aW9ucyBsaWJyYXJ5IiwgbnVsbHB0ciwgIkFjY2VsZXJhdGUsU1ZNTCxub25lIikKK09QVElPTihwcmVmaXhfMSwgImZ2ZWN0LWNvc3QtbW9kZWwiLCB2ZWN0X2Nvc3RfbW9kZWxfZiwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdmVjdG9yaXplIiwgZnZlY3Rvcml6ZSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRW5hYmxlIHRoZSBsb29wIHZlY3Rvcml6YXRpb24gcGFzc2VzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ2ZXJib3NlLWFzbSIsIGZ2ZXJib3NlX2FzbSwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ2aXNpYmlsaXR5LWlubGluZXMtaGlkZGVuIiwgZnZpc2liaWxpdHlfaW5saW5lc19oaWRkZW4sIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiR2l2ZSBpbmxpbmUgQysrIG1lbWJlciBmdW5jdGlvbnMgZGVmYXVsdCB2aXNpYmlsaXR5IGJ5IGRlZmF1bHQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZnZpc2liaWxpdHktbXMtY29tcGF0IiwgZnZpc2liaWxpdHlfbXNfY29tcGF0LCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJHaXZlIGdsb2JhbCB0eXBlcyAnZGVmYXVsdCcgdmlzaWJpbGl0eSBhbmQgZ2xvYmFsIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzICdoaWRkZW4nIHZpc2liaWxpdHkgYnkgZGVmYXVsdCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmdmlzaWJpbGl0eT0iLCBmdmlzaWJpbGl0eV9FUSwgSm9pbmVkLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJTZXQgdGhlIGRlZmF1bHQgc3ltYm9sIHZpc2liaWxpdHkgZm9yIGFsbCBnbG9iYWwgZGVjbGFyYXRpb25zIiwgbnVsbHB0ciwgImhpZGRlbixkZWZhdWx0IikKK09QVElPTihwcmVmaXhfMSwgImZ2aXNpYmlsaXR5IiwgZnZpc2liaWxpdHksIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRGVmYXVsdCB0eXBlIGFuZCBzeW1ib2wgdmlzaWJpbGl0eSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmd2NoYXItdHlwZT0iLCBmd2NoYXJfdHlwZV9FUSwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiU2VsZWN0IHVuZGVybHlpbmcgdHlwZSBmb3Igd2NoYXJfdCIsIG51bGxwdHIsICJjaGFyLHNob3J0LGludCIpCitPUFRJT04ocHJlZml4XzEsICJmd2ViIiwgd2ViX2YsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZ2NjX29wdGltaXphdGlvbl9mX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZndob2xlLWZpbGUiLCB3aG9sZV9maWxlX2YsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZndob2xlLXByb2dyYW0tdnRhYmxlcyIsIGZ3aG9sZV9wcm9ncmFtX3Z0YWJsZXMsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24gfCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZXMgd2hvbGUtcHJvZ3JhbSB2dGFibGUgb3B0aW1pemF0aW9uLiBSZXF1aXJlcyAtZmx0byIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmd2hvbGUtcHJvZ3JhbSIsIHdob2xlX3Byb2dyYW1fZiwgRmxhZywgY2xhbmdfaWdub3JlZF9nY2Nfb3B0aW1pemF0aW9uX2ZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmd3JhcHYiLCBmd3JhcHYsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiVHJlYXQgc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cgYXMgdHdvJ3MgY29tcGxlbWVudCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmd3JpdGFibGUtc3RyaW5ncyIsIGZ3cml0YWJsZV9zdHJpbmdzLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlN0b3JlIHN0cmluZyBsaXRlcmFscyBhcyB3cml0YWJsZSBkYXRhIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImZ4cmF5LWFsd2F5cy1lbWl0LWN1c3RvbWV2ZW50cyIsIGZ4cmF5X2Fsd2F5c19lbWl0X2N1c3RvbWV2ZW50cywgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJEZXRlcm1pbmUgd2hldGhlciB0byBhbHdheXMgZW1pdCBfX3hyYXlfY3VzdG9tZXZlbnQoLi4uKSBjYWxscyBldmVuIGlmIHRoZSBmdW5jdGlvbiBpdCBhcHBlYXJzIGluIGlzIG5vdCBhbHdheXMgaW5zdHJ1bWVudGVkLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmeHJheS1hbHdheXMtaW5zdHJ1bWVudD0iLCBmeHJheV9hbHdheXNfaW5zdHJ1bWVudCwgSm9pbmVkT3JTZXBhcmF0ZSwgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJGaWxlbmFtZSBkZWZpbmluZyB0aGUgd2hpdGVsaXN0IGZvciBpbWJ1aW5nIHRoZSAnYWx3YXlzIGluc3RydW1lbnQnIFhSYXkgYXR0cmlidXRlLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmeHJheS1pbnN0cnVjdGlvbi10aHJlc2hvbGQ9IiwgZnhyYXlfaW5zdHJ1Y3Rpb25fdGhyZXNob2xkX0VRLCBKb2luZWRPclNlcGFyYXRlLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlNldHMgdGhlIG1pbmltdW0gZnVuY3Rpb24gc2l6ZSB0byBpbnN0cnVtZW50IHdpdGggWFJheSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmeHJheS1pbnN0cnVjdGlvbi10aHJlc2hvbGQiLCBmeHJheV9pbnN0cnVjdGlvbl90aHJlc2hvbGRfLCBKb2luZWRPclNlcGFyYXRlLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmeHJheS1pbnN0cnVtZW50IiwgZnhyYXlfaW5zdHJ1bWVudCwgRmxhZywgZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJHZW5lcmF0ZSBYUmF5IGluc3RydW1lbnRhdGlvbiBzbGVkcyBvbiBmdW5jdGlvbiBlbnRyeSBhbmQgZXhpdCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmeHJheS1uZXZlci1pbnN0cnVtZW50PSIsIGZ4cmF5X25ldmVyX2luc3RydW1lbnQsIEpvaW5lZE9yU2VwYXJhdGUsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRmlsZW5hbWUgZGVmaW5pbmcgdGhlIHdoaXRlbGlzdCBmb3IgaW1idWluZyB0aGUgJ25ldmVyIGluc3RydW1lbnQnIFhSYXkgYXR0cmlidXRlLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJGeCIsIF9TTEFTSF9GeCwgRmxhZywgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmemVyby1pbml0aWFsaXplZC1pbi1ic3MiLCBmemVyb19pbml0aWFsaXplZF9pbl9ic3MsIEZsYWcsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJmenZlY3RvciIsIGZ6dmVjdG9yLCBGbGFnLCBmX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBTeXN0ZW0geiB2ZWN0b3IgbGFuZ3VhZ2UgZXh0ZW5zaW9uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIkYiLCBGLCBKb2luZWRPclNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBSZW5kZXJKb2luZWQgfCBDQzFPcHRpb24sIDAsCisgICAgICAgIkFkZCBkaXJlY3RvcnkgdG8gZnJhbWV3b3JrIGluY2x1ZGUgc2VhcmNoIHBhdGgiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiRiIsIF9TTEFTSF9GLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImcwIiwgZzAsIEZsYWcsIGdOX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiRzEiLCBfU0xBU0hfRzEsIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZzEiLCBnMSwgRmxhZywgZ05fR3JvdXAsIGdsaW5lX3RhYmxlc19vbmx5LCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiRzIiLCBfU0xBU0hfRzIsIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZzIiLCBnMiwgRmxhZywgZ05fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJnMyIsIGczLCBGbGFnLCBnTl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIkc9IiwgR19FUSwgSm9pbmVkLCBtX0dyb3VwLCBHLCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJHQSIsIF9TTEFTSF9HQSwgRmxhZywgY2xfR3JvdXAsIGZ0bHNtb2RlbF9FUSwgImxvY2FsLWV4ZWNcMCIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkFzc3VtZSB0aHJlYWQtbG9jYWwgdmFyaWFibGVzIGFyZSBkZWZpbmVkIGluIHRoZSBleGVjdXRhYmxlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImdjYy10b29sY2hhaW49IiwgZ2NjX3Rvb2xjaGFpbiwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsCisgICAgICAgIlVzZSB0aGUgZ2NjIHRvb2xjaGFpbiBhdCB0aGUgZ2l2ZW4gZGlyZWN0b3J5IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImdjYy10b29sY2hhaW4iLCBnY2NfdG9vbGNoYWluX2xlZ2FjeV9zcGVsbGluZywgU2VwYXJhdGUsIElOVkFMSUQsIGdjY190b29sY2hhaW4sIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJnY29kZXZpZXciLCBnY29kZXZpZXcsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENDMUFzT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiR2VuZXJhdGUgQ29kZVZpZXcgZGVidWcgaW5mb3JtYXRpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZ2NvZmYiLCBnY29mZiwgSm9pbmVkLCBnX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBVbnN1cHBvcnRlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImdjb2x1bW4taW5mbyIsIGdjb2x1bW5faW5mbywgRmxhZywgZ19mbGFnc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImdkd2FyZi0yIiwgZ2R3YXJmXzIsIEZsYWcsIGdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkdlbmVyYXRlIHNvdXJjZS1sZXZlbCBkZWJ1ZyBpbmZvcm1hdGlvbiB3aXRoIGR3YXJmIHZlcnNpb24gMiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJnZHdhcmYtMyIsIGdkd2FyZl8zLCBGbGFnLCBnX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJHZW5lcmF0ZSBzb3VyY2UtbGV2ZWwgZGVidWcgaW5mb3JtYXRpb24gd2l0aCBkd2FyZiB2ZXJzaW9uIDMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZ2R3YXJmLTQiLCBnZHdhcmZfNCwgRmxhZywgZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiR2VuZXJhdGUgc291cmNlLWxldmVsIGRlYnVnIGluZm9ybWF0aW9uIHdpdGggZHdhcmYgdmVyc2lvbiA0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImdkd2FyZi01IiwgZ2R3YXJmXzUsIEZsYWcsIGdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkdlbmVyYXRlIHNvdXJjZS1sZXZlbCBkZWJ1ZyBpbmZvcm1hdGlvbiB3aXRoIGR3YXJmIHZlcnNpb24gNSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJnZHdhcmYtYXJhbmdlcyIsIGdkd2FyZl9hcmFuZ2VzLCBGbGFnLCBnX2ZsYWdzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZ2R3YXJmIiwgZ2R3YXJmLCBGbGFnLCBJTlZBTElELCBnZHdhcmZfNCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkdkIiwgX1NMQVNIX0dkLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiU2V0IF9fY2RlY2wgYXMgYSBkZWZhdWx0IGNhbGxpbmcgY29udmVudGlvbiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJnZW1iZWQtc291cmNlIiwgZ2VtYmVkX3NvdXJjZSwgRmxhZywgZ19mbGFnc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbWJlZCBzb3VyY2UgdGV4dCBpbiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJnZW4tcmVwcm9kdWNlciIsIGdlbl9yZXByb2R1Y2VyLCBGbGFnLCBpbnRlcm5hbF9kZWJ1Z19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgSGVscEhpZGRlbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIkF1dG8tZ2VuZXJhdGVzIHByZXByb2Nlc3NlZCBzb3VyY2UgZmlsZXMgYW5kIGEgcmVwcm9kdWN0aW9uIHNjcmlwdCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJHZSIsIF9TTEFTSF9HZSwgRmxhZywgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJHRi0iLCBfU0xBU0hfR0ZfLCBGbGFnLCBjbF9Hcm91cCwgZndyaXRhYmxlX3N0cmluZ3MsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgc3RyaW5nIHBvb2xpbmciLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZ2Z1bGwiLCBnZnVsbCwgRmxhZywgZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkdGIiwgX1NMQVNIX0dGLCBGbGFnLCBjbF9pZ25vcmVkX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImdnZGIwIiwgZ2dkYjAsIEZsYWcsIGdnZGJOX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZ2dkYjEiLCBnZ2RiMSwgRmxhZywgZ2dkYk5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJnZ2RiMiIsIGdnZGIyLCBGbGFnLCBnZ2RiTl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImdnZGIzIiwgZ2dkYjMsIEZsYWcsIGdnZGJOX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZ2dkYiIsIGdnZGIsIEZsYWcsIGdUdW5lX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZ2dudS1wdWJuYW1lcyIsIGdnbnVfcHVibmFtZXMsIEZsYWcsIGdfZmxhZ3NfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkdIIiwgX1NMQVNIX0dILCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkdoIiwgX1NMQVNIX0doLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkdMLSIsIF9TTEFTSF9HTF8sIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZ2xpbmUtdGFibGVzLW9ubHkiLCBnbGluZV90YWJsZXNfb25seSwgRmxhZywgZ05fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsCisgICAgICAgIkVtaXQgZGVidWcgbGluZSBudW1iZXIgdGFibGVzIG9ubHkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZ2xsZGIiLCBnbGxkYiwgRmxhZywgZ1R1bmVfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJHTCIsIF9TTEFTSF9HTCwgRmxhZywgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJHbS0iLCBfU0xBU0hfR21fLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImdtbHQiLCBnbWx0LCBGbGFnLCBJTlZBTElELCBnbGluZV90YWJsZXNfb25seSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImdtb2R1bGVzIiwgZ21vZHVsZXMsIEZsYWcsIGdOX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJHZW5lcmF0ZSBkZWJ1ZyBpbmZvIHdpdGggZXh0ZXJuYWwgcmVmZXJlbmNlcyB0byBjbGFuZyBtb2R1bGVzIG9yIHByZWNvbXBpbGVkIGhlYWRlcnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiR20iLCBfU0xBU0hfR20sIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZ25vLWNvbHVtbi1pbmZvIiwgZ25vX2NvbHVtbl9pbmZvLCBGbGFnLCBnX2ZsYWdzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZ25vLWVtYmVkLXNvdXJjZSIsIGdub19lbWJlZF9zb3VyY2UsIEZsYWcsIGdfZmxhZ3NfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiUmVzdG9yZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBub3QgZW1iZWRkaW5nIHNvdXJjZSB0ZXh0IGluIERXQVJGIGRlYnVnIHNlY3Rpb25zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImduby1yZWNvcmQtZ2NjLXN3aXRjaGVzIiwgZ25vX3JlY29yZF9nY2Nfc3dpdGNoZXMsIEZsYWcsIGdfZmxhZ3NfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJnbm8tc3RyaWN0LWR3YXJmIiwgZ25vX3N0cmljdF9kd2FyZiwgRmxhZywgZ19mbGFnc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImdudS1wdWJuYW1lcyIsIGdudV9wdWJuYW1lcywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkVtaXQgbmV3ZXIgR05VIHN0eWxlIHB1Ym5hbWVzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkdSLSIsIF9TTEFTSF9HUl8sIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIGVtaXNzaW9uIG9mIFJUVEkgZGF0YSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJncmVjb3JkLWdjYy1zd2l0Y2hlcyIsIGdyZWNvcmRfZ2NjX3N3aXRjaGVzLCBGbGFnLCBnX2ZsYWdzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiR3JlZ2NhbGwiLCBfU0xBU0hfR3JlZ2NhbGwsIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJTZXQgX19yZWdjYWxsIGFzIGEgZGVmYXVsdCBjYWxsaW5nIGNvbnZlbnRpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiR1IiLCBfU0xBU0hfR1IsIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgZW1pc3Npb24gb2YgUlRUSSBkYXRhIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkdyIiwgX1NMQVNIX0dyLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiU2V0IF9fZmFzdGNhbGwgYXMgYSBkZWZhdWx0IGNhbGxpbmcgY29udmVudGlvbiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJHUy0iLCBfU0xBU0hfR1NfLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSBidWZmZXIgc2VjdXJpdHkgY2hlY2siLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZ3NjZSIsIGdzY2UsIEZsYWcsIGdUdW5lX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZ3NwbGl0LWR3YXJmIiwgZ3NwbGl0X2R3YXJmLCBGbGFnLCBnX2ZsYWdzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZ3N0YWJzIiwgZ3N0YWJzLCBKb2luZWQsIGdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIFVuc3VwcG9ydGVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZ3N0cmljdC1kd2FyZiIsIGdzdHJpY3RfZHdhcmYsIEZsYWcsIGdfZmxhZ3NfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJHUyIsIF9TTEFTSF9HUywgRmxhZywgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBidWZmZXIgc2VjdXJpdHkgY2hlY2siLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiR3MiLCBfU0xBU0hfR3MsIEpvaW5lZCwgY2xfR3JvdXAsIG1zdGFja19wcm9iZV9zaXplLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJTZXQgc3RhY2sgcHJvYmUgc2l6ZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJndG9nZ2xlIiwgZ3RvZ2dsZSwgRmxhZywgZ19mbGFnc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgVW5zdXBwb3J0ZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJHVCIsIF9TTEFTSF9HVCwgRmxhZywgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJndWFyZDoiLCBfU0xBU0hfR3VhcmQsIEpvaW5lZCwgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBDb250cm9sIEZsb3cgR3VhcmQgd2l0aCAvZ3VhcmQ6Y2YiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZ3VzZWQiLCBndXNlZCwgRmxhZywgZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImd2bXMiLCBndm1zLCBKb2luZWQsIGdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIFVuc3VwcG9ydGVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiR3YiLCBfU0xBU0hfR3YsIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJTZXQgX192ZWN0b3JjYWxsIGFzIGEgZGVmYXVsdCBjYWxsaW5nIGNvbnZlbnRpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiR3ctIiwgX1NMQVNIX0d3XywgRmxhZywgY2xfR3JvdXAsIGZub19kYXRhX3NlY3Rpb25zLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJEb24ndCBwdXQgZWFjaCBkYXRhIGl0ZW0gaW4gaXRzIG93biBzZWN0aW9uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkd3IiwgX1NMQVNIX0d3LCBGbGFnLCBjbF9Hcm91cCwgZmRhdGFfc2VjdGlvbnMsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIlB1dCBlYWNoIGRhdGEgaXRlbSBpbiBpdHMgb3duIHNlY3Rpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiR1gtIiwgX1NMQVNIX0dYXywgRmxhZywgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgZXhjZXB0aW9uIGhhbmRsaW5nIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImd4Y29mZiIsIGd4Y29mZiwgSm9pbmVkLCBnX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBVbnN1cHBvcnRlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkdYIiwgX1NMQVNIX0dYLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIGV4Y2VwdGlvbiBoYW5kbGluZyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJHeS0iLCBfU0xBU0hfR3lfLCBGbGFnLCBjbF9Hcm91cCwgZm5vX2Z1bmN0aW9uX3NlY3Rpb25zLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJEb24ndCBwdXQgZWFjaCBmdW5jdGlvbiBpbiBpdHMgb3duIHNlY3Rpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiR3kiLCBfU0xBU0hfR3ksIEZsYWcsIGNsX0dyb3VwLCBmZnVuY3Rpb25fc2VjdGlvbnMsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIlB1dCBlYWNoIGZ1bmN0aW9uIGluIGl0cyBvd24gc2VjdGlvbiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJnej0iLCBnel9FUSwgSm9pbmVkLCBnX2ZsYWdzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJEV0FSRiBkZWJ1ZyBzZWN0aW9ucyBjb21wcmVzc2lvbiB0eXBlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkdaIiwgX1NMQVNIX0daLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkd6IiwgX1NMQVNIX0d6LCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiU2V0IF9fc3RkY2FsbCBhcyBhIGRlZmF1bHQgY2FsbGluZyBjb252ZW50aW9uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImd6IiwgZ3osIEZsYWcsIGdfZmxhZ3NfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkRXQVJGIGRlYnVnIHNlY3Rpb25zIGNvbXByZXNzaW9uIHR5cGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiRyIsIEcsIEpvaW5lZE9yU2VwYXJhdGUsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiUHV0IG9iamVjdHMgb2YgYXQgbW9zdCA8c2l6ZT4gYnl0ZXMgaW50byBzbWFsbCBkYXRhIHNlY3Rpb24gKE1JUFMgLyBIZXhhZ29uKSIsICI8c2l6ZT4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiZyIsIGdfRmxhZywgRmxhZywgZ19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiR2VuZXJhdGUgc291cmNlLWxldmVsIGRlYnVnIGluZm9ybWF0aW9uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImhlYWRlci1pbmNsdWRlLWZpbGUiLCBoZWFkZXJfaW5jbHVkZV9maWxlLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkZpbGVuYW1lIChvciAtKSB0byB3cml0ZSBoZWFkZXIgaW5jbHVkZSBvdXRwdXQgdG8iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiaGVhZGVycGFkX21heF9pbnN0YWxsX25hbWVzIiwgaGVhZGVycGFkX19tYXhfX2luc3RhbGxfX25hbWVzLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJoZWxwLWhpZGRlbiIsIF9oZWxwX2hpZGRlbiwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRGlzcGxheSBoZWxwIGZvciBoaWRkZW4gb3B0aW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJIRUxQIiwgX1NMQVNIX0hFTFAsIEZsYWcsIGNsX0dyb3VwLCBoZWxwLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF80LCAiaGVscCIsIGhlbHAsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENDMUFzT3B0aW9uLCAwLAorICAgICAgICJEaXNwbGF5IGF2YWlsYWJsZSBvcHRpb25zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgImhlbHAiLCBfU0xBU0hfaGVscCwgRmxhZywgY2xfR3JvdXAsIGhlbHAsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkRpc3BsYXkgYXZhaWxhYmxlIG9wdGlvbnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiaG9tZXBhcmFtcyIsIF9TTEFTSF9ob21lcGFyYW1zLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgImhvdHBhdGNoIiwgX1NMQVNIX2hvdHBhdGNoLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIkgiLCBILCBGbGFnLCBQcmVwcm9jZXNzb3JfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiU2hvdyBoZWFkZXIgaW5jbHVkZXMgYW5kIG5lc3RpbmcgZGVwdGgiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiSCIsIF9TTEFTSF9ILCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIkktIiwgSV8sIEZsYWcsIElfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIlJlc3RyaWN0IGFsbCBwcmlvciAtSSBmbGFncyB0byBkb3VibGUtcXVvdGVkIGluY2x1c2lvbiBhbmQgcmVtb3ZlIGN1cnJlbnQgZGlyZWN0b3J5IGZyb20gaW5jbHVkZSBwYXRoIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImlkaXJhZnRlciIsIGlkaXJhZnRlciwgSm9pbmVkT3JTZXBhcmF0ZSwgY2xhbmdfaV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJBZGQgZGlyZWN0b3J5IHRvIEFGVEVSIGluY2x1ZGUgc2VhcmNoIHBhdGgiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiaWZyYW1ld29ya3dpdGhzeXNyb290IiwgaWZyYW1ld29ya3dpdGhzeXNyb290LCBKb2luZWRPclNlcGFyYXRlLCBjbGFuZ19pX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkFkZCBkaXJlY3RvcnkgdG8gU1lTVEVNIGZyYW1ld29yayBzZWFyY2ggcGF0aCwgYWJzb2x1dGUgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIC1pc3lzcm9vdCIsICI8ZGlyZWN0b3J5PiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJpZnJhbWV3b3JrIiwgaWZyYW1ld29yaywgSm9pbmVkT3JTZXBhcmF0ZSwgY2xhbmdfaV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJBZGQgZGlyZWN0b3J5IHRvIFNZU1RFTSBmcmFtZXdvcmsgc2VhcmNoIHBhdGgiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiaW1hY3Jvcz0iLCBfaW1hY3Jvc19FUSwgSm9pbmVkLCBJTlZBTElELCBpbWFjcm9zLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF80LCAiaW1hY3JvcyIsIGltYWNyb3MsIEpvaW5lZE9yU2VwYXJhdGUsIGNsYW5nX2lfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiSW5jbHVkZSBtYWNyb3MgZnJvbSBmaWxlIGJlZm9yZSBwYXJzaW5nIiwgIjxmaWxlPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJpbWFnZV9iYXNlIiwgaW1hZ2VfX2Jhc2UsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiaW1zdmMiLCBfU0xBU0hfaW1zdmMsIEpvaW5lZE9yU2VwYXJhdGUsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJBZGQgZGlyZWN0b3J5IHRvIHN5c3RlbSBpbmNsdWRlIHNlYXJjaCBwYXRoLCBhcyBpZiBwYXJ0IG9mICVJTkNMVURFJSIsICI8ZGlyPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJpbXVsdGlsaWIiLCBpbXVsdGlsaWIsIFNlcGFyYXRlLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImluY2x1ZGUtYmFycmllciIsIF9pbmNsdWRlX2JhcnJpZXIsIEZsYWcsIElOVkFMSUQsIElfLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiaW5jbHVkZS1kaXJlY3RvcnktYWZ0ZXI9IiwgX2luY2x1ZGVfZGlyZWN0b3J5X2FmdGVyX0VRLCBKb2luZWQsIElOVkFMSUQsIGlkaXJhZnRlciwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImluY2x1ZGUtZGlyZWN0b3J5LWFmdGVyIiwgX2luY2x1ZGVfZGlyZWN0b3J5X2FmdGVyLCBTZXBhcmF0ZSwgSU5WQUxJRCwgaWRpcmFmdGVyLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiaW5jbHVkZS1kaXJlY3Rvcnk9IiwgX2luY2x1ZGVfZGlyZWN0b3J5X0VRLCBKb2luZWQsIElOVkFMSUQsIEksIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJpbmNsdWRlLWRpcmVjdG9yeSIsIF9pbmNsdWRlX2RpcmVjdG9yeSwgU2VwYXJhdGUsIElOVkFMSUQsIEksIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJpbmNsdWRlLXBjaCIsIGluY2x1ZGVfcGNoLCBTZXBhcmF0ZSwgY2xhbmdfaV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJJbmNsdWRlIHByZWNvbXBpbGVkIGhlYWRlciBmaWxlIiwgIjxmaWxlPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJpbmNsdWRlLXByZWZpeD0iLCBfaW5jbHVkZV9wcmVmaXhfRVEsIEpvaW5lZCwgSU5WQUxJRCwgaXByZWZpeCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImluY2x1ZGUtcHJlZml4IiwgX2luY2x1ZGVfcHJlZml4LCBTZXBhcmF0ZSwgSU5WQUxJRCwgaXByZWZpeCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImluY2x1ZGUtcHRoIiwgaW5jbHVkZV9wdGgsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiSW5jbHVkZSBmaWxlIGJlZm9yZSBwYXJzaW5nIiwgIjxmaWxlPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJpbmNsdWRlLXdpdGgtcHJlZml4LWFmdGVyPSIsIF9pbmNsdWRlX3dpdGhfcHJlZml4X2FmdGVyX0VRLCBKb2luZWQsIElOVkFMSUQsIGl3aXRocHJlZml4LCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiaW5jbHVkZS13aXRoLXByZWZpeC1hZnRlciIsIF9pbmNsdWRlX3dpdGhfcHJlZml4X2FmdGVyLCBTZXBhcmF0ZSwgSU5WQUxJRCwgaXdpdGhwcmVmaXgsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJpbmNsdWRlLXdpdGgtcHJlZml4LWJlZm9yZT0iLCBfaW5jbHVkZV93aXRoX3ByZWZpeF9iZWZvcmVfRVEsIEpvaW5lZCwgSU5WQUxJRCwgaXdpdGhwcmVmaXhiZWZvcmUsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJpbmNsdWRlLXdpdGgtcHJlZml4LWJlZm9yZSIsIF9pbmNsdWRlX3dpdGhfcHJlZml4X2JlZm9yZSwgU2VwYXJhdGUsIElOVkFMSUQsIGl3aXRocHJlZml4YmVmb3JlLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiaW5jbHVkZS13aXRoLXByZWZpeD0iLCBfaW5jbHVkZV93aXRoX3ByZWZpeF9FUSwgSm9pbmVkLCBJTlZBTElELCBpd2l0aHByZWZpeCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImluY2x1ZGUtd2l0aC1wcmVmaXgiLCBfaW5jbHVkZV93aXRoX3ByZWZpeCwgU2VwYXJhdGUsIElOVkFMSUQsIGl3aXRocHJlZml4LCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAiaW5jbHVkZT0iLCBfaW5jbHVkZV9FUSwgSm9pbmVkLCBJTlZBTElELCBpbmNsdWRlLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF80LCAiaW5jbHVkZSIsIGluY2x1ZGUsIEpvaW5lZE9yU2VwYXJhdGUsIGNsYW5nX2lfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiSW5jbHVkZSBmaWxlIGJlZm9yZSBwYXJzaW5nIiwgIjxmaWxlPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJpbmRleC1oZWFkZXItbWFwIiwgaW5kZXhfaGVhZGVyX21hcCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJNYWtlIHRoZSBuZXh0IGluY2x1ZGVkIGRpcmVjdG9yeSAoLUkgb3IgLUYpIGFuIGluZGV4ZXIgaGVhZGVyIG1hcCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJpbml0LW9ubHkiLCBpbml0X29ubHksIEZsYWcsIEFjdGlvbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIk9ubHkgZXhlY3V0ZSBmcm9udGVuZCBpbml0aWFsaXphdGlvbiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJpbml0IiwgaW5pdCwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJpbnN0YWxsX25hbWUiLCBpbnN0YWxsX19uYW1lLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImludGVncmF0ZWQtYXMiLCBhbm9ueW1vdXNfMjQsIEZsYWcsIElOVkFMSUQsIGZpbnRlZ3JhdGVkX2FzLCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJpbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iLCBpbnRlcm5hbF9leHRlcm5jX2lzeXN0ZW0sIEpvaW5lZE9yU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJBZGQgZGlyZWN0b3J5IHRvIHRoZSBpbnRlcm5hbCBzeXN0ZW0gaW5jbHVkZSBzZWFyY2ggcGF0aCB3aXRoIGltcGxpY2l0IGV4dGVybiBcIkNcIiBzZW1hbnRpY3M7IHRoZXNlIGFyZSBhc3N1bWVkIHRvIG5vdCBiZSB1c2VyLXByb3ZpZGVkIGFuZCBhcmUgdXNlZCB0byBtb2RlbCBzeXN0ZW0gYW5kIHN0YW5kYXJkIGhlYWRlcnMnIHBhdGhzLiIsICI8ZGlyZWN0b3J5PiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJpbnRlcm5hbC1pc3lzdGVtIiwgaW50ZXJuYWxfaXN5c3RlbSwgSm9pbmVkT3JTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkFkZCBkaXJlY3RvcnkgdG8gdGhlIGludGVybmFsIHN5c3RlbSBpbmNsdWRlIHNlYXJjaCBwYXRoOyB0aGVzZSBhcmUgYXNzdW1lZCB0byBub3QgYmUgdXNlci1wcm92aWRlZCBhbmQgYXJlIHVzZWQgdG8gbW9kZWwgc3lzdGVtIGFuZCBzdGFuZGFyZCBoZWFkZXJzJyBwYXRocy4iLCAiPGRpcmVjdG9yeT4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiaXByZWZpeCIsIGlwcmVmaXgsIEpvaW5lZE9yU2VwYXJhdGUsIGNsYW5nX2lfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiU2V0IHRoZSAtaXdpdGhwcmVmaXgvLWl3aXRocHJlZml4YmVmb3JlIHByZWZpeCIsICI8ZGlyPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJpcXVvdGUiLCBpcXVvdGUsIEpvaW5lZE9yU2VwYXJhdGUsIGNsYW5nX2lfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiQWRkIGRpcmVjdG9yeSB0byBRVU9URSBpbmNsdWRlIHNlYXJjaCBwYXRoIiwgIjxkaXJlY3Rvcnk+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImlzeXNyb290IiwgaXN5c3Jvb3QsIEpvaW5lZE9yU2VwYXJhdGUsIGNsYW5nX2lfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiU2V0IHRoZSBzeXN0ZW0gcm9vdCBkaXJlY3RvcnkgKHVzdWFsbHkgLykiLCAiPGRpcj4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiaXN5c3RlbS1hZnRlciIsIGlzeXN0ZW1fYWZ0ZXIsIEpvaW5lZE9yU2VwYXJhdGUsIGNsYW5nX2lfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiQWRkIGRpcmVjdG9yeSB0byBlbmQgb2YgdGhlIFNZU1RFTSBpbmNsdWRlIHNlYXJjaCBwYXRoIiwgIjxkaXJlY3Rvcnk+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImlzeXN0ZW0iLCBpc3lzdGVtLCBKb2luZWRPclNlcGFyYXRlLCBjbGFuZ19pX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkFkZCBkaXJlY3RvcnkgdG8gU1lTVEVNIGluY2x1ZGUgc2VhcmNoIHBhdGgiLCAiPGRpcmVjdG9yeT4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiaXZmc292ZXJsYXkiLCBpdmZzb3ZlcmxheSwgSm9pbmVkT3JTZXBhcmF0ZSwgY2xhbmdfaV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJPdmVybGF5IHRoZSB2aXJ0dWFsIGZpbGVzeXN0ZW0gZGVzY3JpYmVkIGJ5IGZpbGUgb3ZlciB0aGUgcmVhbCBmaWxlIHN5c3RlbSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJpd2l0aHByZWZpeGJlZm9yZSIsIGl3aXRocHJlZml4YmVmb3JlLCBKb2luZWRPclNlcGFyYXRlLCBjbGFuZ19pX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlNldCBkaXJlY3RvcnkgdG8gaW5jbHVkZSBzZWFyY2ggcGF0aCB3aXRoIHByZWZpeCIsICI8ZGlyPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJpd2l0aHByZWZpeCIsIGl3aXRocHJlZml4LCBKb2luZWRPclNlcGFyYXRlLCBjbGFuZ19pX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlNldCBkaXJlY3RvcnkgdG8gU1lTVEVNIGluY2x1ZGUgc2VhcmNoIHBhdGggd2l0aCBwcmVmaXgiLCAiPGRpcj4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiaXdpdGhzeXNyb290IiwgaXdpdGhzeXNyb290LCBKb2luZWRPclNlcGFyYXRlLCBjbGFuZ19pX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkFkZCBkaXJlY3RvcnkgdG8gU1lTVEVNIGluY2x1ZGUgc2VhcmNoIHBhdGgsIGFic29sdXRlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byAtaXN5c3Jvb3QiLCAiPGRpcmVjdG9yeT4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiSSIsIEksIEpvaW5lZE9yU2VwYXJhdGUsIElfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENDMUFzT3B0aW9uLCAwLAorICAgICAgICJBZGQgZGlyZWN0b3J5IHRvIGluY2x1ZGUgc2VhcmNoIHBhdGgiLCAiPGRpcj4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiSSIsIF9TTEFTSF9JLCBKb2luZWRPclNlcGFyYXRlLCBjbF9Hcm91cCwgSSwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiQWRkIGRpcmVjdG9yeSB0byBpbmNsdWRlIHNlYXJjaCBwYXRoIiwgIjxkaXI+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIkoiLCBKLCBKb2luZWRPclNlcGFyYXRlLCBnZm9ydHJhbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgUmVuZGVySm9pbmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiSiIsIF9TTEFTSF9KLCBGbGFnLCBjbF9Hcm91cCwgZnVuc2lnbmVkX2NoYXIsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIk1ha2UgY2hhciB0eXBlIHVuc2lnbmVkIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImtlZXBfcHJpdmF0ZV9leHRlcm5zIiwga2VlcF9fcHJpdmF0ZV9fZXh0ZXJucywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgImtlcm5lbC0iLCBfU0xBU0hfa2VybmVsXywgRmxhZywgY2xfaWdub3JlZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJrZXJuZWwiLCBfU0xBU0hfa2VybmVsLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImxhbmd1YWdlPSIsIF9sYW5ndWFnZV9FUSwgSm9pbmVkLCBJTlZBTElELCB4LCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAibGFuZ3VhZ2UiLCBfbGFuZ3VhZ2UsIFNlcGFyYXRlLCBJTlZBTElELCB4LCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibGF6eV9mcmFtZXdvcmsiLCBsYXp5X19mcmFtZXdvcmssIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBMaW5rZXJJbnB1dCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImxhenlfbGlicmFyeSIsIGxhenlfX2xpYnJhcnksIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBMaW5rZXJJbnB1dCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkxEZCIsIF9TTEFTSF9MRGQsIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJDcmVhdGUgZGVidWcgRExMIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkxEIiwgX1NMQVNIX0xELCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiQ3JlYXRlIERMTCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJsaWJyYXJ5LWRpcmVjdG9yeT0iLCBfbGlicmFyeV9kaXJlY3RvcnlfRVEsIEpvaW5lZCwgSU5WQUxJRCwgTCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImxpYnJhcnktZGlyZWN0b3J5IiwgX2xpYnJhcnlfZGlyZWN0b3J5LCBTZXBhcmF0ZSwgSU5WQUxJRCwgTCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgImxpbmtlci1vcHRpb249IiwgbGlua2VyX29wdGlvbiwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiQWRkIGxpbmtlciBvcHRpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAibGluayIsIF9TTEFTSF9saW5rLCBSZW1haW5pbmdBcmdzSm9pbmVkLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiRm9yd2FyZCBvcHRpb25zIHRvIHRoZSBsaW5rZXIiLCAiPG9wdGlvbnM+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIkxOIiwgX1NMQVNIX0xOLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImxvYWQiLCBsb2FkLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkxvYWQgdGhlIG5hbWVkIHBsdWdpbiAoZHluYW1pYyBzaGFyZWQgb2JqZWN0KSIsICI8ZHNvcGF0aD4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiTCIsIEwsIEpvaW5lZE9yU2VwYXJhdGUsIExpbmtfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIFJlbmRlckpvaW5lZCwgMCwKKyAgICAgICAiQWRkIGRpcmVjdG9yeSB0byBsaWJyYXJ5IHNlYXJjaCBwYXRoIiwgIjxkaXI+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgImwiLCBsLCBKb2luZWRPclNlcGFyYXRlLCBMaW5rX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBMaW5rZXJJbnB1dCB8IFJlbmRlckpvaW5lZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm0xNiIsIG0xNiwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm0zMiIsIG0zMiwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm0zZG5vd2EiLCBtM2Rub3dhLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm0zZG5vdyIsIG0zZG5vdywgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtNjQiLCBtNjQsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtODAzODciLCBtODAzODcsIEZsYWcsIElOVkFMSUQsIG14ODcsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtYWJpPSIsIG1hYmlfRVEsIEpvaW5lZCwgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1hYmljYWxscyIsIG1hYmljYWxscywgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRW5hYmxlIFNWUjQtc3R5bGUgcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZSAoTWlwcyBvbmx5KSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtYWJzPSIsIG1hYnNfRVEsIEpvaW5lZCwgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIk1hY2giLCBNYWNoLCBGbGFnLCBMaW5rX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWFkeCIsIG1hZHgsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWFlcyIsIG1hZXMsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWFpbi1maWxlLW5hbWUiLCBtYWluX2ZpbGVfbmFtZSwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENDMUFzT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIk1haW4gZmlsZSBuYW1lIHRvIHVzZSBmb3IgZGVidWcgaW5mbyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtYWxpZ24tZG91YmxlIiwgbWFsaWduX2RvdWJsZSwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJBbGlnbiBkb3VibGVzIHRvIHR3byB3b3JkcyBpbiBzdHJ1Y3RzICh4ODYgb25seSkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWFsaWduLWZ1bmN0aW9ucz0iLCBtYWxpZ25fZnVuY3Rpb25zX0VRLCBKb2luZWQsIGNsYW5nX2lnbm9yZWRfbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1hbGlnbi1qdW1wcz0iLCBtYWxpZ25fanVtcHNfRVEsIEpvaW5lZCwgY2xhbmdfaWdub3JlZF9tX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWFsaWduLWxvb3BzPSIsIG1hbGlnbl9sb29wc19FUSwgSm9pbmVkLCBjbGFuZ19pZ25vcmVkX21fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtYWx0aXZlYyIsIG1hbHRpdmVjLCBGbGFnLCBtX3BwY19GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1hbWRncHUtZGVidWdnZXItYWJpPSIsIG1hbWRncHVfZGVidWdnZXJfYWJpLCBKb2luZWQsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIEhlbHBIaWRkZW4sIDAsCisgICAgICAgIkdlbmVyYXRlIGFkZGl0aW9uYWwgY29kZSBmb3Igc3BlY2lmaWVkIDx2ZXJzaW9uPiBvZiBkZWJ1Z2dlciBBQkkgKEFNREdQVSBvbmx5KSIsICI8dmVyc2lvbj4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWFwcGxldHZvcy12ZXJzaW9uLW1pbj0iLCBtYXBwbGV0dm9zX3ZlcnNpb25fbWluX0VRLCBKb2luZWQsIElOVkFMSUQsIG10dm9zX3ZlcnNpb25fbWluX0VRLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWFwcGxldHZzaW11bGF0b3ItdmVyc2lvbi1taW49IiwgbWFwcGxldHZzaW11bGF0b3JfdmVyc2lvbl9taW5fRVEsIEpvaW5lZCwgSU5WQUxJRCwgbXR2b3Nfc2ltdWxhdG9yX3ZlcnNpb25fbWluX0VRLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWFyY2g9IiwgbWFyY2hfRVEsIEpvaW5lZCwgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1hcm0iLCBtYXJtLCBGbGFnLCBJTlZBTElELCBtbm9fdGh1bWIsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtYXNtLXZlcmJvc2UiLCBtYXNtX3ZlcmJvc2UsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJHZW5lcmF0ZSB2ZXJib3NlIGFzc2VtYmx5IG91dHB1dCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtYXNtPSIsIG1hc21fRVEsIEpvaW5lZCwgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWFzc2VtYmxlci1mYXRhbC13YXJuaW5ncyIsIG1hc3NlbWJsZXJfZmF0YWxfd2FybmluZ3MsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENDMUFzT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIk1ha2UgYXNzZW1ibGVyIHdhcm5pbmdzIGZhdGFsIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1hdngyIiwgbWF2eDIsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWF2eDUxMmJpdGFsZyIsIG1hdng1MTJiaXRhbGcsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWF2eDUxMmJ3IiwgbWF2eDUxMmJ3LCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1hdng1MTJjZCIsIG1hdng1MTJjZCwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtYXZ4NTEyZHEiLCBtYXZ4NTEyZHEsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWF2eDUxMmVyIiwgbWF2eDUxMmVyLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1hdng1MTJmIiwgbWF2eDUxMmYsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWF2eDUxMmlmbWEiLCBtYXZ4NTEyaWZtYSwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtYXZ4NTEycGYiLCBtYXZ4NTEycGYsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWF2eDUxMnZibWkyIiwgbWF2eDUxMnZibWkyLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1hdng1MTJ2Ym1pIiwgbWF2eDUxMnZibWksIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWF2eDUxMnZsIiwgbWF2eDUxMnZsLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1hdng1MTJ2bm5pIiwgbWF2eDUxMnZubmksIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWF2eDUxMnZwb3BjbnRkcSIsIG1hdng1MTJ2cG9wY250ZHEsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWF2eCIsIG1hdngsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWJhY2tjaGFpbiIsIG1iYWNrY2hhaW4sIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENDMU9wdGlvbiwgMCwKKyAgICAgICAiTGluayBzdGFjayBmcmFtZXMgdGhyb3VnaCBiYWNrY2hhaW4gb24gU3lzdGVtIFoiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWJpZy1lbmRpYW4iLCBtYmlnX2VuZGlhbiwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWJtaTIiLCBtYm1pMiwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtYm1pIiwgbWJtaSwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtYnJhbmNoLWxpa2VseSIsIG1icmFuY2hfbGlrZWx5LCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBIZWxwSGlkZGVuLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWNoZWNrLXplcm8tZGl2aXNpb24iLCBtY2hlY2tfemVyb19kaXZpc2lvbiwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1jbGZsdXNob3B0IiwgbWNsZmx1c2hvcHQsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWNsd2IiLCBtY2x3YiwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtY2x6ZXJvIiwgbWNsemVybywgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtY21vZGVsPSIsIG1jbW9kZWxfRVEsIEpvaW5lZCwgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1jbXBiIiwgbWNtcGIsIEZsYWcsIG1fcHBjX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWNvZGUtbW9kZWwiLCBtY29kZV9tb2RlbCwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJUaGUgY29kZSBtb2RlbCB0byB1c2UiLCBudWxscHRyLCAic21hbGwsa2VybmVsLG1lZGl1bSxsYXJnZSIpCitPUFRJT04ocHJlZml4XzEsICJtY29tcGFjdC1icmFuY2hlcz0iLCBtY29tcGFjdF9icmFuY2hlc19FUSwgSm9pbmVkLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWNvbnNvbGUiLCBtY29uc29sZSwgSm9pbmVkLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtY29uc3RhbnQtY2ZzdHJpbmdzIiwgbWNvbnN0YW50X2Nmc3RyaW5ncywgRmxhZywgY2xhbmdfaWdub3JlZF9tX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWNvbnN0cnVjdG9yLWFsaWFzZXMiLCBtY29uc3RydWN0b3JfYWxpYXNlcywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkVtaXQgY29tcGxldGUgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhcyBhbGlhc2VzIHdoZW4gcG9zc2libGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWNwdT0iLCBtY3B1X0VRLCBKb2luZWQsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtY3JiaXRzIiwgbWNyYml0cywgRmxhZywgbV9wcGNfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtY3JjIiwgbWNyYywgRmxhZywgbV9hcm1fRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkFsbG93IHVzZSBvZiBDUkMgaW5zdHJ1Y3Rpb25zIChBUk0gb25seSkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWNyeXB0byIsIG1wb3dlcjhfY3J5cHRvLCBGbGFnLCBtX3BwY19GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1jeDE2IiwgbWN4MTYsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiTURkIiwgX1NMQVNIX01EZCwgRmxhZywgX1NMQVNIX01fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJVc2UgRExMIGRlYnVnIHJ1bi10aW1lIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1kZWJ1Zy1wYXNzIiwgbWRlYnVnX3Bhc3MsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIGFkZGl0aW9uYWwgZGVidWcgb3V0cHV0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1kZWZhdWx0LWJ1aWxkLWF0dHJpYnV0ZXMiLCBtZGVmYXVsdF9idWlsZF9hdHRyaWJ1dGVzLCBKb2luZWQsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtZGlyZWN0LW1vdmUiLCBtZGlyZWN0X21vdmUsIEZsYWcsIG1fcHBjX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWRpc2FibGUtZnAtZWxpbSIsIG1kaXNhYmxlX2ZwX2VsaW0sIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIGZyYW1lIHBvaW50ZXIgZWxpbWluYXRpb24gb3B0aW1pemF0aW9uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1kaXNhYmxlLXRhaWwtY2FsbHMiLCBtZGlzYWJsZV90YWlsX2NhbGxzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSB0YWlsIGNhbGwgb3B0aW1pemF0aW9uLCBrZWVwaW5nIHRoZSBjYWxsIHN0YWNrIGFjY3VyYXRlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1kbGwiLCBtZGxsLCBKb2luZWQsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1kb3VibGUtZmxvYXQiLCBtZG91YmxlX2Zsb2F0LCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWRzcHIyIiwgbWRzcHIyLCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWRzcCIsIG1kc3AsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtZHluYW1pYy1uby1waWMiLCBtZHluYW1pY19ub19waWMsIEpvaW5lZCwgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIk1EIiwgTUQsIEZsYWcsIE1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIldyaXRlIGEgZGVwZmlsZSBjb250YWluaW5nIHVzZXIgYW5kIHN5c3RlbSBoZWFkZXJzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIk1EIiwgX1NMQVNIX01ELCBGbGFnLCBfU0xBU0hfTV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24sIDAsCisgICAgICAgIlVzZSBETEwgcnVuLXRpbWUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWVhYmkiLCBtZWFiaSwgU2VwYXJhdGUsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiU2V0IEVBQkkgdHlwZSwgZS5nLiA0LCA1IG9yIGdudSAoZGVmYXVsdCBkZXBlbmRzIG9uIHRyaXBsZSkiLCBudWxscHRyLCAiZGVmYXVsdCw0LDUsZ251IikKK09QVElPTihwcmVmaXhfMSwgIm1lbWJlZGRlZC1kYXRhIiwgbWVtYmVkZGVkX2RhdGEsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIlBsYWNlIGNvbnN0YW50cyBpbiB0aGUgLnJvZGF0YSBzZWN0aW9uIGluc3RlYWQgb2YgdGhlIC5zZGF0YSBzZWN0aW9uIGV2ZW4gaWYgdGhleSBtZWV0IHRoZSAtRyA8c2l6ZT4gdGhyZXNob2xkIChNSVBTKSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtZW5hYmxlLW5vLWluZnMiLCBtZW5hYmxlX25vX2luZmluaXRpZXMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJBbGxvdyBvcHRpbWl6YXRpb24gdG8gYXNzdW1lIHRoZXJlIGFyZSBubyBpbmZpbml0aWVzLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtZW5hYmxlLW5vLW5hbnMiLCBtZW5hYmxlX25vX25hbnMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJBbGxvdyBvcHRpbWl6YXRpb24gdG8gYXNzdW1lIHRoZXJlIGFyZSBubyBOYU5zLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtZW5hYmxlLXVuc2FmZS1mcC1tYXRoIiwgbWVuYWJsZV91bnNhZmVfZnBfbWF0aCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkFsbG93IHVuc2FmZSBmbG9hdGluZy1wb2ludCBtYXRoIG9wdGltaXphdGlvbnMgd2hpY2ggbWF5IGRlY3JlYXNlIHByZWNpc2lvbiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtZXhjZXB0aW9uLWhhbmRsaW5nIiwgbWV4Y2VwdGlvbl9oYW5kaW5nLCBGbGFnLCBtX3dhc21fRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtZXhlY3V0ZS1vbmx5IiwgbWV4ZWN1dGVfb25seSwgRmxhZywgbV9hcm1fRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkRpc2FsbG93IGdlbmVyYXRpb24gb2YgZGF0YSBhY2Nlc3MgdG8gY29kZSBzZWN0aW9ucyAoQVJNIG9ubHkpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1leHRlcm4tc2RhdGEiLCBtZXh0ZXJuX3NkYXRhLCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJBc3N1bWUgdGhhdCBleHRlcm5hbGx5IGRlZmluZWQgZGF0YSBpcyBpbiB0aGUgc21hbGwgZGF0YSBpZiBpdCBtZWV0cyB0aGUgLUcgPHNpemU+IHRocmVzaG9sZCAoTUlQUykiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWYxNmMiLCBtZjE2YywgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtZmFuY3ktbWF0aC0zODciLCBtZmFuY3lfbWF0aF8zODcsIEZsYWcsIGNsYW5nX2lnbm9yZWRfbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1mZW50cnkiLCBtZmVudHJ5LCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkluc2VydCBjYWxscyB0byBmZW50cnkgYXQgZnVuY3Rpb24gZW50cnkgKHg4NiBvbmx5KSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtZml4LWFuZC1jb250aW51ZSIsIG1maXhfYW5kX2NvbnRpbnVlLCBGbGFnLCBjbGFuZ19pZ25vcmVkX21fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIElnbm9yZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtZml4LWNvcnRleC1hNTMtODM1NzY5IiwgbWZpeF9jb3J0ZXhfYTUzXzgzNTc2OSwgRmxhZywgbV9hYXJjaDY0X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJXb3JrYXJvdW5kIENvcnRleC1BNTMgZXJyYXR1bSA4MzU3NjkgKEFBcmNoNjQgb25seSkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWZsb2F0LWFiaT0iLCBtZmxvYXRfYWJpX0VRLCBKb2luZWQsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsICJzb2Z0LHNvZnRmcCxoYXJkIikKK09QVElPTihwcmVmaXhfMSwgIm1mbG9hdC1hYmkiLCBtZmxvYXRfYWJpLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlRoZSBmbG9hdCBBQkkgdG8gdXNlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1mbG9hdDEyOCIsIG1mbG9hdDEyOCwgRmxhZywgbV9wcGNfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtZm1hNCIsIG1mbWE0LCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1mbWEiLCBtZm1hLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1mcDMyIiwgbWZwMzIsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIlVzZSAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIChNSVBTIG9ubHkpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1mcDY0IiwgbWZwNjQsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIlVzZSA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIChNSVBTIG9ubHkpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1mcG1hdGg9IiwgbWZwbWF0aF9FUSwgSm9pbmVkLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWZwbWF0aCIsIG1mcG1hdGgsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiV2hpY2ggdW5pdCB0byB1c2UgZm9yIGZwIG1hdGgiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWZwcm5kIiwgbWZwcm5kLCBGbGFnLCBtX3BwY19GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1mcHU9IiwgbWZwdV9FUSwgSm9pbmVkLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWZweHgiLCBtZnB4eCwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSGVscEhpZGRlbiwgMCwKKyAgICAgICAiQXZvaWQgRlBVIG1vZGUgZGVwZW5kZW50IG9wZXJhdGlvbnMgd2hlbiB1c2VkIHdpdGggdGhlIE8zMiBBQkkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWZzZ3NiYXNlIiwgbWZzZ3NiYXNlLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1meHNyIiwgbWZ4c3IsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiTUYiLCBNRiwgSm9pbmVkT3JTZXBhcmF0ZSwgTV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiV3JpdGUgZGVwZmlsZSBvdXRwdXQgZnJvbSAtTU1ELCAtTUQsIC1NTSwgb3IgLU0gdG8gPGZpbGU+IiwgIjxmaWxlPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtZ2VuZXJhbC1yZWdzLW9ubHkiLCBtZ2VuZXJhbF9yZWdzX29ubHksIEZsYWcsIG1fYWFyY2g2NF9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiR2VuZXJhdGUgY29kZSB3aGljaCBvbmx5IHVzZXMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgKEFBcmNoNjQgb25seSkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWdmbmkiLCBtZ2ZuaSwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtZ2xpYmMiLCBtZ2xpYmMsIEZsYWcsIG1fbGliY19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSGVscEhpZGRlbiB8IEhlbHBIaWRkZW4sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtZ2xvYmFsLW1lcmdlIiwgbWdsb2JhbF9tZXJnZSwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgbWVyZ2luZyBvZiBnbG9iYWxzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1ncG9wdCIsIG1ncG9wdCwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiVXNlIEdQIHJlbGF0aXZlIGFjY2Vzc2VzIGZvciBzeW1ib2xzIGtub3duIHRvIGJlIGluIGEgc21hbGwgZGF0YSBzZWN0aW9uIChNSVBTKSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJNRyIsIE1HLCBGbGFnLCBNX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkFkZCBtaXNzaW5nIGhlYWRlcnMgdG8gZGVwZmlsZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtaGFyZC1mbG9hdCIsIG1oYXJkX2Zsb2F0LCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWh0bSIsIG1odG0sIEZsYWcsIG1fcHBjX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWh2eC1kb3VibGUiLCBtaGV4YWdvbl9odnhfZG91YmxlLCBGbGFnLCBtX2hleGFnb25fRmVhdHVyZXNfSFZYX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJFbmFibGUgSGV4YWdvbiBEb3VibGUgVmVjdG9yIGVYdGVuc2lvbnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWh2eC1sZW5ndGg9IiwgbWhleGFnb25faHZ4X2xlbmd0aF9FUSwgSm9pbmVkLCBtX2hleGFnb25fRmVhdHVyZXNfSFZYX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJTZXQgSGV4YWdvbiBWZWN0b3IgTGVuZ3RoIiwgbnVsbHB0ciwgIjY0QiwxMjhCIikKK09QVElPTihwcmVmaXhfMSwgIm1odng9IiwgbWhleGFnb25faHZ4X0VRLCBKb2luZWQsIG1faGV4YWdvbl9GZWF0dXJlc19IVlhfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkVuYWJsZSBIZXhhZ29uIFZlY3RvciBlWHRlbnNpb25zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1odngiLCBtaGV4YWdvbl9odngsIEZsYWcsIG1faGV4YWdvbl9GZWF0dXJlc19IVlhfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkVuYWJsZSBIZXhhZ29uIFZlY3RvciBlWHRlbnNpb25zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgIm1od2Rpdj0iLCBfbWh3ZGl2X0VRLCBKb2luZWQsIElOVkFMSUQsIG1od2Rpdl9FUSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1od2Rpdj0iLCBtaHdkaXZfRVEsIEpvaW5lZCwgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgIm1od2RpdiIsIF9taHdkaXYsIFNlcGFyYXRlLCBJTlZBTElELCBtaHdkaXZfRVEsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtaWFtY3UiLCBtaWFtY3UsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIlVzZSBJbnRlbCBNQ1UgQUJJIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pYnQiLCBtaWJ0LCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pZWVlLWZwIiwgbWllZWVfZnAsIEZsYWcsIGNsYW5nX2lnbm9yZWRfbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pZWVlLXJuZC1uZWFyIiwgbWllZWVfcm5kX25lYXIsIEZsYWcsIG1faGV4YWdvbl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgIm1pZ3JhdGUiLCBfbWlncmF0ZSwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJSdW4gdGhlIG1pZ3JhdG9yIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pZ3JhdGUiLCBtaWdyYXRlLCBGbGFnLCBBY3Rpb25fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJNaWdyYXRlIHNvdXJjZSBjb2RlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pbXBsaWNpdC1mbG9hdCIsIG1pbXBsaWNpdF9mbG9hdCwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pbXBsaWNpdC1pdD0iLCBtaW1wbGljaXRfaXRfRVEsIEpvaW5lZCwgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pbmNyZW1lbnRhbC1saW5rZXItY29tcGF0aWJsZSIsIG1pbmNyZW1lbnRhbF9saW5rZXJfY29tcGF0aWJsZSwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ0MxQXNPcHRpb24sIDAsCisgICAgICAgIihpbnRlZ3JhdGVkLWFzKSBFbWl0IGFuIG9iamVjdCBmaWxlIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggYW4gaW5jcmVtZW50YWwgbGlua2VyIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pbmRpcmVjdC1qdW1wPSIsIG1pbmRpcmVjdF9qdW1wX0VRLCBKb2luZWQsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkNoYW5nZSBpbmRpcmVjdCBqdW1wIGluc3RydWN0aW9ucyB0byBpbmhpYml0IHNwZWN1bGF0aW9uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pbmxpbmUtYWxsLXN0cmluZ29wcyIsIG1pbmxpbmVfYWxsX3N0cmluZ29wcywgRmxhZywgY2xhbmdfaWdub3JlZF9tX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWludmFyaWFudC1mdW5jdGlvbi1kZXNjcmlwdG9ycyIsIG1pbnZhcmlhbnRfZnVuY3Rpb25fZGVzY3JpcHRvcnMsIEZsYWcsIG1fcHBjX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWlvcy1zaW11bGF0b3ItdmVyc2lvbi1taW49IiwgbWlvc19zaW11bGF0b3JfdmVyc2lvbl9taW5fRVEsIEpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pb3MtdmVyc2lvbi1taW49IiwgbWlvc192ZXJzaW9uX21pbl9FUSwgSm9pbmVkLCBJTlZBTElELCBtaXBob25lb3NfdmVyc2lvbl9taW5fRVEsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIlNldCBpT1MgZGVwbG95bWVudCB0YXJnZXQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWlwaG9uZW9zLXZlcnNpb24tbWluPSIsIG1pcGhvbmVvc192ZXJzaW9uX21pbl9FUSwgSm9pbmVkLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWlwaG9uZXNpbXVsYXRvci12ZXJzaW9uLW1pbj0iLCBtaXBob25lc2ltdWxhdG9yX3ZlcnNpb25fbWluX0VRLCBKb2luZWQsIElOVkFMSUQsIG1pb3Nfc2ltdWxhdG9yX3ZlcnNpb25fbWluX0VRLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWlwczE2IiwgbWlwczE2LCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWlwczEiLCBtaXBzMSwgRmxhZywgSU5WQUxJRCwgbWFyY2hfRVEsICJtaXBzMVwwIiwgSGVscEhpZGRlbiwgMCwKKyAgICAgICAiRXF1aXZhbGVudCB0byAtbWFyY2g9bWlwczEiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWlwczIiLCBtaXBzMiwgRmxhZywgSU5WQUxJRCwgbWFyY2hfRVEsICJtaXBzMlwwIiwgSGVscEhpZGRlbiwgMCwKKyAgICAgICAiRXF1aXZhbGVudCB0byAtbWFyY2g9bWlwczIiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWlwczMycjIiLCBtaXBzMzJyMiwgRmxhZywgSU5WQUxJRCwgbWFyY2hfRVEsICJtaXBzMzJyMlwwIiwgSGVscEhpZGRlbiwgMCwKKyAgICAgICAiRXF1aXZhbGVudCB0byAtbWFyY2g9bWlwczMycjIiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWlwczMycjMiLCBtaXBzMzJyMywgRmxhZywgSU5WQUxJRCwgbWFyY2hfRVEsICJtaXBzMzJyM1wwIiwgSGVscEhpZGRlbiwgMCwKKyAgICAgICAiRXF1aXZhbGVudCB0byAtbWFyY2g9bWlwczMycjMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWlwczMycjUiLCBtaXBzMzJyNSwgRmxhZywgSU5WQUxJRCwgbWFyY2hfRVEsICJtaXBzMzJyNVwwIiwgSGVscEhpZGRlbiwgMCwKKyAgICAgICAiRXF1aXZhbGVudCB0byAtbWFyY2g9bWlwczMycjUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWlwczMycjYiLCBtaXBzMzJyNiwgRmxhZywgSU5WQUxJRCwgbWFyY2hfRVEsICJtaXBzMzJyNlwwIiwgSGVscEhpZGRlbiwgMCwKKyAgICAgICAiRXF1aXZhbGVudCB0byAtbWFyY2g9bWlwczMycjYiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWlwczMyIiwgbWlwczMyLCBGbGFnLCBJTlZBTElELCBtYXJjaF9FUSwgIm1pcHMzMlwwIiwgSGVscEhpZGRlbiwgMCwKKyAgICAgICAiRXF1aXZhbGVudCB0byAtbWFyY2g9bWlwczMyIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pcHMzIiwgbWlwczMsIEZsYWcsIElOVkFMSUQsIG1hcmNoX0VRLCAibWlwczNcMCIsIEhlbHBIaWRkZW4sIDAsCisgICAgICAgIkVxdWl2YWxlbnQgdG8gLW1hcmNoPW1pcHMzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pcHM0IiwgbWlwczQsIEZsYWcsIElOVkFMSUQsIG1hcmNoX0VRLCAibWlwczRcMCIsIEhlbHBIaWRkZW4sIDAsCisgICAgICAgIkVxdWl2YWxlbnQgdG8gLW1hcmNoPW1pcHM0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pcHM1IiwgbWlwczUsIEZsYWcsIElOVkFMSUQsIG1hcmNoX0VRLCAibWlwczVcMCIsIEhlbHBIaWRkZW4sIDAsCisgICAgICAgIkVxdWl2YWxlbnQgdG8gLW1hcmNoPW1pcHM1IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pcHM2NHIyIiwgbWlwczY0cjIsIEZsYWcsIElOVkFMSUQsIG1hcmNoX0VRLCAibWlwczY0cjJcMCIsIEhlbHBIaWRkZW4sIDAsCisgICAgICAgIkVxdWl2YWxlbnQgdG8gLW1hcmNoPW1pcHM2NHIyIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pcHM2NHIzIiwgbWlwczY0cjMsIEZsYWcsIElOVkFMSUQsIG1hcmNoX0VRLCAibWlwczY0cjNcMCIsIEhlbHBIaWRkZW4sIDAsCisgICAgICAgIkVxdWl2YWxlbnQgdG8gLW1hcmNoPW1pcHM2NHIzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pcHM2NHI1IiwgbWlwczY0cjUsIEZsYWcsIElOVkFMSUQsIG1hcmNoX0VRLCAibWlwczY0cjVcMCIsIEhlbHBIaWRkZW4sIDAsCisgICAgICAgIkVxdWl2YWxlbnQgdG8gLW1hcmNoPW1pcHM2NHI1IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pcHM2NHI2IiwgbWlwczY0cjYsIEZsYWcsIElOVkFMSUQsIG1hcmNoX0VRLCAibWlwczY0cjZcMCIsIEhlbHBIaWRkZW4sIDAsCisgICAgICAgIkVxdWl2YWxlbnQgdG8gLW1hcmNoPW1pcHM2NHI2IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1pcHM2NCIsIG1pcHM2NCwgRmxhZywgSU5WQUxJRCwgbWFyY2hfRVEsICJtaXBzNjRcMCIsIEhlbHBIaWRkZW4sIDAsCisgICAgICAgIkVxdWl2YWxlbnQgdG8gLW1hcmNoPW1pcHM2NCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtaXNlbCIsIG1pc2VsLCBGbGFnLCBtX3BwY19GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIk1KIiwgTUosIEpvaW5lZE9yU2VwYXJhdGUsIE1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIldyaXRlIGEgY29tcGlsYXRpb24gZGF0YWJhc2UgZW50cnkgcGVyIGlucHV0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1rZXJuZWwiLCBta2VybmVsLCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWxkYzEtc2RjMSIsIG1sZGMxX3NkYzEsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbGltaXQtZmxvYXQtcHJlY2lzaW9uIiwgbWxpbWl0X2Zsb2F0X3ByZWNpc2lvbiwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJMaW1pdCBmbG9hdCBwcmVjaXNpb24gdG8gdGhlIGdpdmVuIHZhbHVlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1saW5rLWJpdGNvZGUtZmlsZSIsIG1saW5rX2JpdGNvZGVfZmlsZSwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJMaW5rIHRoZSBnaXZlbiBiaXRjb2RlIGZpbGUgYmVmb3JlIHBlcmZvcm1pbmcgb3B0aW1pemF0aW9ucy4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWxpbmstY3VkYS1iaXRjb2RlIiwgbWxpbmtfY3VkYV9iaXRjb2RlLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkxpbmsgYW5kIGludGVybmFsaXplIG5lZWRlZCBzeW1ib2xzIGZyb20gdGhlIGdpdmVuIGJpdGNvZGUgZmlsZSBiZWZvcmUgcGVyZm9ybWluZyBvcHRpbWl6YXRpb25zLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbGlua2VyLXZlcnNpb249IiwgbWxpbmtlcl92ZXJzaW9uX0VRLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1saXR0bGUtZW5kaWFuIiwgbWxpdHRsZV9lbmRpYW4sIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1sbHZtIiwgbWxsdm0sIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDQzFBc09wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIkFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIGZvcndhcmQgdG8gTExWTSdzIG9wdGlvbiBwcm9jZXNzaW5nIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1sb2NhbC1zZGF0YSIsIG1sb2NhbF9zZGF0YSwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRXh0ZW5kIHRoZSAtRyBiZWhhdmlvdXIgdG8gb2JqZWN0IGxvY2FsIGRhdGEgKE1JUFMpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1sb25nLWNhbGxzIiwgbWxvbmdfY2FsbHMsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkdlbmVyYXRlIGJyYW5jaGVzIHdpdGggZXh0ZW5kZWQgYWRkcmVzc2FiaWxpdHksIHVzdWFsbHkgdmlhIGluZGlyZWN0IGp1bXBzLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbG9uZ2NhbGwiLCBtbG9uZ2NhbGwsIEZsYWcsIG1fcHBjX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWx3cCIsIG1sd3AsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibWx6Y250IiwgbWx6Y250LCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1tYWNvcy12ZXJzaW9uLW1pbj0iLCBtbWFjb3NfdmVyc2lvbl9taW5fRVEsIEpvaW5lZCwgbV9Hcm91cCwgbW1hY29zeF92ZXJzaW9uX21pbl9FUSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1tYWNvc3gtdmVyc2lvbi1taW49IiwgbW1hY29zeF92ZXJzaW9uX21pbl9FUSwgSm9pbmVkLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJTZXQgTWFjIE9TIFggZGVwbG95bWVudCB0YXJnZXQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW1hZGQ0IiwgbW1hZGQ0LCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJFbmFibGUgdGhlIGdlbmVyYXRpb24gb2YgNC1vcGVyYW5kIG1hZGQucywgbWFkZC5kIGFuZCByZWxhdGVkIGluc3RydWN0aW9ucy4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW1jdT0iLCBtbWN1X0VRLCBKb2luZWQsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJNTUQiLCBNTUQsIEZsYWcsIE1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIldyaXRlIGEgZGVwZmlsZSBjb250YWluaW5nIHVzZXIgaGVhZGVycyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbWZjcmYiLCBtbWZjcmYsIEZsYWcsIElOVkFMSUQsIG1tZm9jcmYsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbWZvY3JmIiwgbW1mb2NyZiwgRmxhZywgbV9wcGNfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbWljcm9taXBzIiwgbW1pY3JvbWlwcywgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1tbXgiLCBtbW14LCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1tb3ZiZSIsIG1tb3ZiZSwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbXB4IiwgbW1weCwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbXMtYml0ZmllbGRzIiwgbW1zX2JpdGZpZWxkcywgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJTZXQgdGhlIGRlZmF1bHQgc3RydWN0dXJlIGxheW91dCB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIE1pY3Jvc29mdCBjb21waWxlciBzdGFuZGFyZCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbXNhIiwgbW1zYSwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRW5hYmxlIE1TQSBBU0UgKE1JUFMgb25seSkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW10IiwgbW10LCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJFbmFibGUgTVQgQVNFIChNSVBTIG9ubHkpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1td2FpdHgiLCBtbXdhaXR4LCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIk1NIiwgTU0sIEZsYWcsIE1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkxpa2UgLU1NRCwgYnV0IGFsc28gaW1wbGllcyAtRSBhbmQgd3JpdGVzIHRvIHN0ZG91dCBieSBkZWZhdWx0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uYW49IiwgbW5hbl9FUSwgSm9pbmVkLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLTNkbm93YSIsIG1ub18zZG5vd2EsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLTNkbm93IiwgbW5vXzNkbm93LCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby04MDM4NyIsIG1ub184MDM4NywgRmxhZywgSU5WQUxJRCwgbW5vX3g4NywgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1hYmljYWxscyIsIG1ub19hYmljYWxscywgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRGlzYWJsZSBTVlI0LXN0eWxlIHBvc2l0aW9uLWluZGVwZW5kZW50IGNvZGUgKE1pcHMgb25seSkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLWFkeCIsIG1ub19hZHgsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLWFlcyIsIG1ub19hZXMsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLWFsdGl2ZWMiLCBtbm9fYWx0aXZlYywgRmxhZywgbV9wcGNfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tYXZ4MiIsIG1ub19hdngyLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1hdng1MTJiaXRhbGciLCBtbm9fYXZ4NTEyYml0YWxnLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1hdng1MTJidyIsIG1ub19hdng1MTJidywgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tYXZ4NTEyY2QiLCBtbm9fYXZ4NTEyY2QsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLWF2eDUxMmRxIiwgbW5vX2F2eDUxMmRxLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1hdng1MTJlciIsIG1ub19hdng1MTJlciwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tYXZ4NTEyZiIsIG1ub19hdng1MTJmLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1hdng1MTJpZm1hIiwgbW5vX2F2eDUxMmlmbWEsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLWF2eDUxMnBmIiwgbW5vX2F2eDUxMnBmLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1hdng1MTJ2Ym1pMiIsIG1ub19hdng1MTJ2Ym1pMiwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tYXZ4NTEydmJtaSIsIG1ub19hdng1MTJ2Ym1pLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1hdng1MTJ2bCIsIG1ub19hdng1MTJ2bCwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tYXZ4NTEydm5uaSIsIG1ub19hdng1MTJ2bm5pLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1hdng1MTJ2cG9wY250ZHEiLCBtbm9fYXZ4NTEydnBvcGNudGRxLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1hdngiLCBtbm9fYXZ4LCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1iYWNrY2hhaW4iLCBtbm9fYmFja2NoYWluLCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBDQzFPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tYm1pMiIsIG1ub19ibWkyLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1ibWkiLCBtbm9fYm1pLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1icmFuY2gtbGlrZWx5IiwgbW5vX2JyYW5jaF9saWtlbHksIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIEhlbHBIaWRkZW4sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tY2hlY2stemVyby1kaXZpc2lvbiIsIG1ub19jaGVja196ZXJvX2RpdmlzaW9uLCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLWNsZmx1c2hvcHQiLCBtbm9fY2xmbHVzaG9wdCwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tY2x3YiIsIG1ub19jbHdiLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1jbHplcm8iLCBtbm9fY2x6ZXJvLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1jbXBiIiwgbW5vX2NtcGIsIEZsYWcsIG1fcHBjX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLWNvbnN0YW50LWNmc3RyaW5ncyIsIG1ub19jb25zdGFudF9jZnN0cmluZ3MsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tY3JiaXRzIiwgbW5vX2NyYml0cywgRmxhZywgbV9wcGNfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tY3J5cHRvIiwgbW5vcG93ZXI4X2NyeXB0bywgRmxhZywgbV9wcGNfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tY3gxNiIsIG1ub19jeDE2LCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1kZWZhdWx0LWJ1aWxkLWF0dHJpYnV0ZXMiLCBtbm9fZGVmYXVsdF9idWlsZF9hdHRyaWJ1dGVzLCBKb2luZWQsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tZGlyZWN0LW1vdmUiLCBtbm9kaXJlY3RfbW92ZSwgRmxhZywgbV9wcGNfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tZHNwcjIiLCBtbm9fZHNwcjIsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tZHNwIiwgbW5vX2RzcCwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1lbWJlZGRlZC1kYXRhIiwgbW5vX2VtYmVkZGVkX2RhdGEsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkRvIG5vdCBwbGFjZSBjb25zdGFudHMgaW4gdGhlIC5yb2RhdGEgc2VjdGlvbiBpbnN0ZWFkIG9mIHRoZSAuc2RhdGEgaWYgdGhleSBtZWV0IHRoZSAtRyA8c2l6ZT4gdGhyZXNob2xkIChNSVBTKSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tZXhjZXB0aW9uLWhhbmRsaW5nIiwgbW5vX2V4Y2VwdGlvbl9oYW5kaW5nLCBGbGFnLCBtX3dhc21fRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tZXhlY3V0ZS1vbmx5IiwgbW5vX2V4ZWN1dGVfb25seSwgRmxhZywgbV9hcm1fRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkFsbG93IGdlbmVyYXRpb24gb2YgZGF0YSBhY2Nlc3MgdG8gY29kZSBzZWN0aW9ucyAoQVJNIG9ubHkpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1leHRlcm4tc2RhdGEiLCBtbm9fZXh0ZXJuX3NkYXRhLCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJEbyBub3QgYXNzdW1lIHRoYXQgZXh0ZXJuYWxseSBkZWZpbmVkIGRhdGEgaXMgaW4gdGhlIHNtYWxsIGRhdGEgaWYgaXQgbWVldHMgdGhlIC1HIDxzaXplPiB0aHJlc2hvbGQgKE1JUFMpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1mMTZjIiwgbW5vX2YxNmMsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLWZpeC1jb3J0ZXgtYTUzLTgzNTc2OSIsIG1ub19maXhfY29ydGV4X2E1M184MzU3NjksIEZsYWcsIG1fYWFyY2g2NF9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRG9uJ3Qgd29ya2Fyb3VuZCBDb3J0ZXgtQTUzIGVycmF0dW0gODM1NzY5IChBQXJjaDY0IG9ubHkpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1mbG9hdDEyOCIsIG1ub19mbG9hdDEyOCwgRmxhZywgbV9wcGNfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tZm1hNCIsIG1ub19mbWE0LCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1mbWEiLCBtbm9fZm1hLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1mcHJuZCIsIG1ub19mcHJuZCwgRmxhZywgbV9wcGNfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tZnNnc2Jhc2UiLCBtbm9fZnNnc2Jhc2UsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLWZ4c3IiLCBtbm9fZnhzciwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tZ2ZuaSIsIG1ub19nZm5pLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1nbG9iYWwtbWVyZ2UiLCBtbm9fZ2xvYmFsX21lcmdlLCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgbWVyZ2luZyBvZiBnbG9iYWxzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1ncG9wdCIsIG1ub19ncG9wdCwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRG8gbm90IHVzZSBHUCByZWxhdGl2ZSBhY2Nlc3NlcyBmb3Igc3ltYm9scyBrbm93biB0byBiZSBpbiBhIHNtYWxsIGRhdGEgc2VjdGlvbiAoTUlQUykiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLWh0bSIsIG1ub19odG0sIEZsYWcsIG1fcHBjX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLWh2eC1kb3VibGUiLCBtbm9faGV4YWdvbl9odnhfZG91YmxlLCBGbGFnLCBtX2hleGFnb25fRmVhdHVyZXNfSFZYX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJEaXNhYmxlIEhleGFnb24gRG91YmxlIFZlY3RvciBlWHRlbnNpb25zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1odngiLCBtbm9faGV4YWdvbl9odngsIEZsYWcsIG1faGV4YWdvbl9GZWF0dXJlc19IVlhfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkRpc2FibGUgSGV4YWdvbiBWZWN0b3IgZVh0ZW5zaW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8taWFtY3UiLCBtbm9faWFtY3UsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8taWJ0IiwgbW5vX2lidCwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8taW1wbGljaXQtZmxvYXQiLCBtbm9faW1wbGljaXRfZmxvYXQsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkRvbid0IGdlbmVyYXRlIGltcGxpY2l0IGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8taW5jcmVtZW50YWwtbGlua2VyLWNvbXBhdGlibGUiLCBtbm9faW5jcmVtZW50YWxfbGlua2VyX2NvbXBhdGlibGUsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIihpbnRlZ3JhdGVkLWFzKSBFbWl0IGFuIG9iamVjdCBmaWxlIHdoaWNoIGNhbm5vdCBiZSB1c2VkIHdpdGggYW4gaW5jcmVtZW50YWwgbGlua2VyIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1pbmxpbmUtYWxsLXN0cmluZ29wcyIsIG1ub19pbmxpbmVfYWxsX3N0cmluZ29wcywgRmxhZywgY2xhbmdfaWdub3JlZF9tX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBJZ25vcmVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLWludmFyaWFudC1mdW5jdGlvbi1kZXNjcmlwdG9ycyIsIG1ub19pbnZhcmlhbnRfZnVuY3Rpb25fZGVzY3JpcHRvcnMsIEZsYWcsIG1fcHBjX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLWlzZWwiLCBtbm9faXNlbCwgRmxhZywgbV9wcGNfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tbGRjMS1zZGMxIiwgbW5vX2xkYzFfc2RjMSwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1sb2NhbC1zZGF0YSIsIG1ub19sb2NhbF9zZGF0YSwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRG8gbm90IGV4dGVuZCB0aGUgLUcgYmVoYXZpb3VyIHRvIG9iamVjdCBsb2NhbCBkYXRhIChNSVBTKSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tbG9uZy1jYWxscyIsIG1ub19sb25nX2NhbGxzLCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJSZXN0b3JlIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBub3QgZ2VuZXJhdGluZyBsb25nIGNhbGxzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1sb25nY2FsbCIsIG1ub19sb25nY2FsbCwgRmxhZywgbV9wcGNfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tbHdwIiwgbW5vX2x3cCwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tbHpjbnQiLCBtbm9fbHpjbnQsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLW1hZGQ0IiwgbW5vX21hZGQ0LCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJEaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIDQtb3BlcmFuZCBtYWRkLnMsIG1hZGQuZCBhbmQgcmVsYXRlZCBpbnN0cnVjdGlvbnMuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1tZmNyZiIsIG1ub19tZmNyZiwgRmxhZywgSU5WQUxJRCwgbW5vX21mb2NyZiwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1tZm9jcmYiLCBtbm9fbWZvY3JmLCBGbGFnLCBtX3BwY19GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1taWNyb21pcHMiLCBtbm9fbWljcm9taXBzLCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLW1pcHMxNiIsIG1ub19taXBzMTYsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tbW14IiwgbW5vX21teCwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tbW92YmUiLCBtbm9fbW92YmUsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLW1vdnQiLCBtbm9fbW92dCwgRmxhZywgbV9hcm1fRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkRpc2FsbG93IHVzZSBvZiBtb3Z0L21vdncgcGFpcnMgKEFSTSBvbmx5KSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tbXB4IiwgbW5vX21weCwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tbXMtYml0ZmllbGRzIiwgbW5vX21zX2JpdGZpZWxkcywgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRG8gbm90IHNldCB0aGUgZGVmYXVsdCBzdHJ1Y3R1cmUgbGF5b3V0IHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgTWljcm9zb2Z0IGNvbXBpbGVyIHN0YW5kYXJkIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1tc2EiLCBtbm9fbXNhLCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJEaXNhYmxlIE1TQSBBU0UgKE1JUFMgb25seSkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLW10IiwgbW5vX210LCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJEaXNhYmxlIE1UIEFTRSAoTUlQUyBvbmx5KSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tbXdhaXR4IiwgbW5vX213YWl0eCwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tbmVnLWltbWVkaWF0ZXMiLCBtbm9fbmVnX2ltbWVkaWF0ZXMsIEZsYWcsIG1fYXJtX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJEaXNhbGxvdyBjb252ZXJ0aW5nIGluc3RydWN0aW9ucyB3aXRoIG5lZ2F0aXZlIGltbWVkaWF0ZXMgdG8gdGhlaXIgbmVnYXRpb24gb3IgaW52ZXJzaW9uLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tbm9udHJhcHBpbmctZnB0b2ludCIsIG1ub19ub250cmFwcGluZ19mcHRvaW50LCBGbGFnLCBtX3dhc21fRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tb2RkLXNwcmVnIiwgbW5vX29kZF9zcHJlZywgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSGVscEhpZGRlbiwgMCwKKyAgICAgICAiRGlzYWJsZSBvZGQgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLW9taXQtbGVhZi1mcmFtZS1wb2ludGVyIiwgbW5vX29taXRfbGVhZl9mcmFtZV9wb2ludGVyLCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXBhY2tldHMiLCBtbm9fcGFja2V0cywgRmxhZywgbV9oZXhhZ29uX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgZ2VuZXJhdGlvbiBvZiBpbnN0cnVjdGlvbiBwYWNrZXRzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1wYXNjYWwtc3RyaW5ncyIsIG1ub19wYXNjYWxfc3RyaW5ncywgRmxhZywgSU5WQUxJRCwgZm5vX3Bhc2NhbF9zdHJpbmdzLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXBjbG11bCIsIG1ub19wY2xtdWwsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXBpZS1jb3B5LXJlbG9jYXRpb25zIiwgbW5vX3BpZV9jb3B5X3JlbG9jYXRpb25zLCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXBrdSIsIG1ub19wa3UsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXBvcGNudGQiLCBtbm9fcG9wY250ZCwgRmxhZywgbV9wcGNfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tcG9wY250IiwgbW5vX3BvcGNudCwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tcG93ZXI4LXZlY3RvciIsIG1ub19wb3dlcjhfdmVjdG9yLCBGbGFnLCBtX3BwY19GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1wb3dlcjktdmVjdG9yIiwgbW5vX3Bvd2VyOV92ZWN0b3IsIEZsYWcsIG1fcHBjX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXByZWZldGNod3QxIiwgbW5vX3ByZWZldGNod3QxLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1wcmZjaHciLCBtbm9fcHJmY2h3LCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1wdXJlLWNvZGUiLCBtbm9fcHVyZV9jb2RlLCBGbGFnLCBJTlZBTElELCBtbm9fZXhlY3V0ZV9vbmx5LCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXFweCIsIG1ub19xcHgsIEZsYWcsIG1fcHBjX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXJkcGlkIiwgbW5vX3JkcGlkLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1yZHJuZCIsIG1ub19yZHJuZCwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tcmRzZWVkIiwgbW5vX3Jkc2VlZCwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tcmVkLXpvbmUiLCBtbm9fcmVkX3pvbmUsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tcmVsYXgtYWxsIiwgbW5vX3JlbGF4X2FsbCwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1yZXN0cmljdC1pdCIsIG1ub19yZXN0cmljdF9pdCwgRmxhZywgbV9hcm1fRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkFsbG93IGdlbmVyYXRpb24gb2YgZGVwcmVjYXRlZCBJVCBibG9ja3MgZm9yIEFSTXY4LiBJdCBpcyBvZmYgYnkgZGVmYXVsdCBmb3IgQVJNdjggVGh1bWIgbW9kZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tcmV0cG9saW5lLWV4dGVybmFsLXRodW5rIiwgbW5vX3JldHBvbGluZV9leHRlcm5hbF90aHVuaywgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tcmV0cG9saW5lIiwgbW5vX3JldHBvbGluZSwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tcnRkIiwgbW5vX3J0ZCwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1ydG0iLCBtbm9fcnRtLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1zYWhmIiwgbW5vX3NhaGYsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXNneCIsIG1ub19zZ3gsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXNoYSIsIG1ub19zaGEsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXNoc3RrIiwgbW5vX3Noc3RrLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1zaWduLWV4dCIsIG1ub19zaWduX2V4dCwgRmxhZywgbV93YXNtX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXNpbWQxMjgiLCBtbm9fc2ltZDEyOCwgRmxhZywgbV93YXNtX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXNvZnQtZmxvYXQiLCBtbm9fc29mdF9mbG9hdCwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1zc2UyIiwgbW5vX3NzZTIsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXNzZTMiLCBtbm9fc3NlMywgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tc3NlNC4xIiwgbW5vX3NzZTRfMSwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tc3NlNC4yIiwgbW5vX3NzZTRfMiwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tc3NlNGEiLCBtbm9fc3NlNGEsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXNzZTQiLCBtbm9fc3NlNCwgRmxhZywgSU5WQUxJRCwgbW5vX3NzZTRfMSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1zc2UiLCBtbm9fc3NlLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1zc3NlMyIsIG1ub19zc3NlMywgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tc3RhY2stYXJnLXByb2JlIiwgbW5vX3N0YWNrX2FyZ19wcm9iZSwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIHN0YWNrIHByb2JlcyB3aGljaCBhcmUgZW5hYmxlZCBieSBkZWZhdWx0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby1zdGFja3JlYWxpZ24iLCBtbm9fc3RhY2tyZWFsaWduLCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXRibSIsIG1ub190Ym0sIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXRodW1iIiwgbW5vX3RodW1iLCBGbGFnLCBtX2FybV9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby11bmFsaWduZWQtYWNjZXNzIiwgbW5vX3VuYWxpZ25lZF9hY2Nlc3MsIEZsYWcsIG1fYXJtX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJGb3JjZSBhbGwgbWVtb3J5IGFjY2Vzc2VzIHRvIGJlIGFsaWduZWQgKEFBcmNoMzIvQUFyY2g2NCBvbmx5KSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8tdmFlcyIsIG1ub192YWVzLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby12cGNsbXVscWRxIiwgbW5vX3ZwY2xtdWxxZHEsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXZzeCIsIG1ub192c3gsIEZsYWcsIG1fcHBjX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXZ4IiwgbW5vX3Z4LCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXdhcm4tbm9ucG9ydGFibGUtY2ZzdHJpbmdzIiwgbW5vX3dhcm5fbm9ucG9ydGFibGVfY2ZzdHJpbmdzLCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXg4NyIsIG1ub194ODcsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXhnb3QiLCBtbm9feGdvdCwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby14bmFjayIsIG1ub194bmFjaywgRmxhZywgbV9hbWRncHVfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkRpc2FibGUgWE5BQ0sgKEFNREdQVSBvbmx5KSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8teG9wIiwgbW5vX3hvcCwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8teHNhdmVjIiwgbW5vX3hzYXZlYywgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm8teHNhdmVvcHQiLCBtbm9feHNhdmVvcHQsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXhzYXZlcyIsIG1ub194c2F2ZXMsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXhzYXZlIiwgbW5vX3hzYXZlLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1uby16ZXJvLWluaXRpYWxpemVkLWluLWJzcyIsIG1ub196ZXJvX2luaXRpYWxpemVkX2luX2JzcywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkRvIG5vdCBwdXQgemVybyBpbml0aWFsaXplZCBkYXRhIGluIHRoZSBCU1MiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vLXp2ZWN0b3IiLCBtbm9fenZlY3RvciwgRmxhZywgSU5WQUxJRCwgZm5vX3p2ZWN0b3IsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtbm9jcmMiLCBtbm9jcmMsIEZsYWcsIG1fYXJtX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJEaXNhbGxvdyB1c2Ugb2YgQ1JDIGluc3RydWN0aW9ucyAoQVJNIG9ubHkpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1ub2V4ZWNzdGFjayIsIG1ub19leGVjX3N0YWNrLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDQzFBc09wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJNYXJrIHRoZSBmaWxlIGFzIG5vdCBuZWVkaW5nIGFuIGV4ZWN1dGFibGUgc3RhY2siLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW5vbnRyYXBwaW5nLWZwdG9pbnQiLCBtbm9udHJhcHBpbmdfZnB0b2ludCwgRmxhZywgbV93YXNtX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW9kZC1zcHJlZyIsIG1vZGRfc3ByZWcsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIEhlbHBIaWRkZW4sIDAsCisgICAgICAgIkVuYWJsZSBvZGQgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW9kdWxlLWRlcGVuZGVuY3ktZGlyIiwgbW9kdWxlX2RlcGVuZGVuY3lfZGlyLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJEaXJlY3RvcnkgdG8gZHVtcCBtb2R1bGUgZGVwZW5kZW5jaWVzIHRvIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1vZHVsZS1maWxlLWRlcHMiLCBtb2R1bGVfZmlsZV9kZXBzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiSW5jbHVkZSBtb2R1bGUgZmlsZXMgaW4gZGVwZW5kZW5jeSBvdXRwdXQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibW9kdWxlLWZpbGUtaW5mbyIsIG1vZHVsZV9maWxlX2luZm8sIEZsYWcsIEFjdGlvbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJQcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBtb2R1bGUgZmlsZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtb21pdC1sZWFmLWZyYW1lLXBvaW50ZXIiLCBtb21pdF9sZWFmX2ZyYW1lX3BvaW50ZXIsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiT21pdCBmcmFtZSBwb2ludGVyIHNldHVwIGZvciBsZWFmIGZ1bmN0aW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtb3NsaWI9IiwgbW9zbGliX0VRLCBKb2luZWQsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtcGFja2V0cyIsIG1wYWNrZXRzLCBGbGFnLCBtX2hleGFnb25fRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIGdlbmVyYXRpb24gb2YgaW5zdHJ1Y3Rpb24gcGFja2V0cyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtcGFzY2FsLXN0cmluZ3MiLCBtcGFzY2FsX3N0cmluZ3MsIEZsYWcsIElOVkFMSUQsIGZwYXNjYWxfc3RyaW5ncywgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1wY2xtdWwiLCBtcGNsbXVsLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1waWUtY29weS1yZWxvY2F0aW9ucyIsIG1waWVfY29weV9yZWxvY2F0aW9ucywgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJVc2UgY29weSByZWxvY2F0aW9ucyBzdXBwb3J0IGZvciBQSUUgYnVpbGRzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1wa3UiLCBtcGt1LCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1wb3BjbnRkIiwgbXBvcGNudGQsIEZsYWcsIG1fcHBjX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXBvcGNudCIsIG1wb3BjbnQsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXBvd2VyOC12ZWN0b3IiLCBtcG93ZXI4X3ZlY3RvciwgRmxhZywgbV9wcGNfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtcG93ZXI5LXZlY3RvciIsIG1wb3dlcjlfdmVjdG9yLCBGbGFnLCBtX3BwY19GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1wcmVmZXItdmVjdG9yLXdpZHRoPSIsIG1wcmVmZXJfdmVjdG9yX3dpZHRoX0VRLCBKb2luZWQsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiU3BlY2lmaWVzIHByZWZlcnJlZCB2ZWN0b3Igd2lkdGggZm9yIGF1dG8tdmVjdG9yaXphdGlvbi4gRGVmYXVsdHMgdG8gJ25vbmUnIHdoaWNoIGFsbG93cyB0YXJnZXQgc3BlY2lmaWMgZGVjaXNpb25zLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtcHJlZmV0Y2h3dDEiLCBtcHJlZmV0Y2h3dDEsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXByZmNodyIsIG1wcmZjaHcsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXB1cmUtY29kZSIsIG1wdXJlX2NvZGUsIEZsYWcsIElOVkFMSUQsIG1leGVjdXRlX29ubHksIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJNUCIsIE1QLCBGbGFnLCBNX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkNyZWF0ZSBwaG9ueSB0YXJnZXQgZm9yIGVhY2ggZGVwZW5kZW5jeSAob3RoZXIgdGhhbiBtYWluIGZpbGUpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIk1QIiwgX1NMQVNIX01QLCBKb2luZWQsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXFkc3A2LWNvbXBhdCIsIG1xZHNwNl9jb21wYXQsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENDMU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIGhleGFnb24tcWRzcDYgYmFja3dhcmQgY29tcGF0aWJpbGl0eSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtcXB4IiwgbXFweCwgRmxhZywgbV9wcGNfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJNUSIsIE1RLCBKb2luZWRPclNlcGFyYXRlLCBNX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlNwZWNpZnkgbmFtZSBvZiBtYWluIGZpbGUgb3V0cHV0IHRvIHF1b3RlIGluIGRlcGZpbGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXJkcGlkIiwgbXJkcGlkLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1yZHJuZCIsIG1yZHJuZCwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtcmRzZWVkIiwgbXJkc2VlZCwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtcmVhc3NvY2lhdGUiLCBtcmVhc3NvY2lhdGUsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJBbGxvdyByZWFzc29jaWF0aW9uIHRyYW5zZm9ybWF0aW9ucyBmb3IgZmxvYXRpbmctcG9pbnQgaW5zdHJ1Y3Rpb25zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1yZWNpcD0iLCBtcmVjaXBfRVEsIENvbW1hSm9pbmVkLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtcmVjaXAiLCBtcmVjaXAsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtcmVkLXpvbmUiLCBtcmVkX3pvbmUsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtcmVncGFybT0iLCBtcmVncGFybV9FUSwgSm9pbmVkLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXJlZ3Bhcm0iLCBtcmVncGFybSwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJMaW1pdCB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBhdmFpbGFibGUgZm9yIGludGVnZXIgYXJndW1lbnRzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1yZWxheC1hbGwiLCBtcmVsYXhfYWxsLCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDQzFBc09wdGlvbiwgMCwKKyAgICAgICAiKGludGVncmF0ZWQtYXMpIFJlbGF4IGFsbCBtYWNoaW5lIGluc3RydWN0aW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJtcmVsYXgtcmVsb2NhdGlvbnMiLCBtcmVsYXhfcmVsb2NhdGlvbnMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENDMUFzT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlVzZSByZWxheGFibGUgZWxmIHJlbG9jYXRpb25zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1yZWxvY2F0aW9uLW1vZGVsIiwgbXJlbG9jYXRpb25fbW9kZWwsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDQzFBc09wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJUaGUgcmVsb2NhdGlvbiBtb2RlbCB0byB1c2UiLCBudWxscHRyLCAic3RhdGljLHBpYyxyb3BpLHJ3cGkscm9waS1yd3BpLGR5bmFtaWMtbm8tcGljIikKK09QVElPTihwcmVmaXhfMSwgIm1yZXN0cmljdC1pdCIsIG1yZXN0cmljdF9pdCwgRmxhZywgbV9hcm1fRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIkRpc2FsbG93IGdlbmVyYXRpb24gb2YgZGVwcmVjYXRlZCBJVCBibG9ja3MgZm9yIEFSTXY4LiBJdCBpcyBvbiBieSBkZWZhdWx0IGZvciBBUk12OCBUaHVtYiBtb2RlLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtcmV0cG9saW5lLWV4dGVybmFsLXRodW5rIiwgbXJldHBvbGluZV9leHRlcm5hbF90aHVuaywgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtcmV0cG9saW5lIiwgbXJldHBvbGluZSwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtcnRkIiwgbXJ0ZCwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJNYWtlIFN0ZENhbGwgY2FsbGluZyBjb252ZW50aW9uIHRoZSBkZWZhdWx0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1ydG0iLCBtcnRtLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1zYWhmIiwgbXNhaGYsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXNhdmUtdGVtcC1sYWJlbHMiLCBtc2F2ZV90ZW1wX2xhYmVscywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ0MxQXNPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiU2F2ZSB0ZW1wb3JhcnkgbGFiZWxzIGluIHRoZSBzeW1ib2wgdGFibGUuIE5vdGUgdGhpcyBtYXkgY2hhbmdlIC5zIHNlbWFudGljcyBhbmQgc2hvdWxkbid0IGdlbmVyYWxseSBiZSB1c2VkIG9uIGNvbXBpbGVyLWdlbmVyYXRlZCBjb2RlLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtc2d4IiwgbXNneCwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtc2hhIiwgbXNoYSwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtc2hzdGsiLCBtc2hzdGssIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXNpZ24tZXh0IiwgbXNpZ25fZXh0LCBGbGFnLCBtX3dhc21fRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtc2ltZDEyOCIsIG1zaW1kMTI4LCBGbGFnLCBtX3dhc21fRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtc2luZ2xlLWZsb2F0IiwgbXNpbmdsZV9mbG9hdCwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1zbWFsbC1kYXRhLXRocmVzaG9sZD0iLCBtc21hbGxfZGF0YV90aHJlc2hvbGRfRVEsIEpvaW5lZCwgbV9Hcm91cCwgRywgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1zb2Z0LWZsb2F0IiwgbXNvZnRfZmxvYXQsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiVXNlIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1zc2UyIiwgbXNzZTIsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXNzZTMiLCBtc3NlMywgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtc3NlNC4xIiwgbXNzZTRfMSwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtc3NlNC4yIiwgbXNzZTRfMiwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtc3NlNGEiLCBtc3NlNGEsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXNzZTQiLCBtc3NlNCwgRmxhZywgSU5WQUxJRCwgbXNzZTRfMiwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1zc2UiLCBtc3NlLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm1zc3NlMyIsIG1zc3NlMywgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtc3RhY2stYWxpZ25tZW50PSIsIG1zdGFja19hbGlnbm1lbnQsIEpvaW5lZCwgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJTZXQgdGhlIHN0YWNrIGFsaWdubWVudCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtc3RhY2stYXJnLXByb2JlIiwgbXN0YWNrX2FyZ19wcm9iZSwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRW5hYmxlIHN0YWNrIHByb2JlcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtc3RhY2stcHJvYmUtc2l6ZT0iLCBtc3RhY2tfcHJvYmVfc2l6ZSwgSm9pbmVkLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlNldCB0aGUgc3RhY2sgcHJvYmUgc2l6ZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtc3RhY2tyZWFsaWduIiwgbXN0YWNrcmVhbGlnbiwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJGb3JjZSByZWFsaWduIHRoZSBzdGFjayBhdCBlbnRyeSB0byBldmVyeSBmdW5jdGlvbiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtc3RyaWN0LWFsaWduIiwgbXN0cmljdF9hbGlnbiwgRmxhZywgSU5WQUxJRCwgbW5vX3VuYWxpZ25lZF9hY2Nlc3MsIG51bGxwdHIsIENDMU9wdGlvbiB8IEhlbHBIaWRkZW4sIDAsCisgICAgICAgIkZvcmNlIGFsbCBtZW1vcnkgYWNjZXNzZXMgdG8gYmUgYWxpZ25lZCAoc2FtZSBhcyBtbm8tdW5hbGlnbmVkLWFjY2VzcykiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXQtbWlncmF0ZS1kaXJlY3RvcnkiLCBtdF9taWdyYXRlX2RpcmVjdG9yeSwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSBmaWxlcyBwcm9kdWNlZCBkdXJpbmcgQVJDIG9yIE9iakMgbWlncmF0aW9uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm10Ym0iLCBtdGJtLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIk1UZCIsIF9TTEFTSF9NVGQsIEZsYWcsIF9TTEFTSF9NX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiVXNlIHN0YXRpYyBkZWJ1ZyBydW4tdGltZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtdGhyZWFkLW1vZGVsIiwgbXRocmVhZF9tb2RlbCwgU2VwYXJhdGUsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiVGhlIHRocmVhZCBtb2RlbCB0byB1c2UsIGUuZy4gcG9zaXgsIHNpbmdsZSAocG9zaXggYnkgZGVmYXVsdCkiLCBudWxscHRyLCAicG9zaXgsc2luZ2xlIikKK09QVElPTihwcmVmaXhfMSwgIm10aHJlYWRzIiwgbXRocmVhZHMsIEpvaW5lZCwgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXRodW1iIiwgbXRodW1iLCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXRwPSIsIG10cF9tb2RlX0VRLCBKb2luZWQsIG1fYXJtX0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJSZWFkIHRocmVhZCBwb2ludGVyIGZyb20gY29wcm9jZXNzb3IgcmVnaXN0ZXIgKEFSTSBvbmx5KSIsIG51bGxwdHIsICJzb2Z0LCBjcDE1IikKK09QVElPTihwcmVmaXhfMSwgIm10cCIsIG10cCwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJNb2RlIGZvciByZWFkaW5nIHRocmVhZCBwb2ludGVyIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm10dW5lPSIsIG10dW5lX0VRLCBKb2luZWQsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtdHZvcy1zaW11bGF0b3ItdmVyc2lvbi1taW49IiwgbXR2b3Nfc2ltdWxhdG9yX3ZlcnNpb25fbWluX0VRLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtdHZvcy12ZXJzaW9uLW1pbj0iLCBtdHZvc192ZXJzaW9uX21pbl9FUSwgSm9pbmVkLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiTVQiLCBNVCwgSm9pbmVkT3JTZXBhcmF0ZSwgTV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJTcGVjaWZ5IG5hbWUgb2YgbWFpbiBmaWxlIG91dHB1dCBpbiBkZXBmaWxlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIk1UIiwgX1NMQVNIX01ULCBGbGFnLCBfU0xBU0hfTV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24sIDAsCisgICAgICAgIlVzZSBzdGF0aWMgcnVuLXRpbWUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXVjbGliYyIsIG11Y2xpYmMsIEZsYWcsIG1fbGliY19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSGVscEhpZGRlbiB8IEhlbHBIaWRkZW4sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtdWx0aV9tb2R1bGUiLCBtdWx0aV9fbW9kdWxlLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXVsdGlwbHlfZGVmaW5lZF91bnVzZWQiLCBtdWx0aXBseV9fZGVmaW5lZF9fdW51c2VkLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm11bHRpcGx5X2RlZmluZWQiLCBtdWx0aXBseV9fZGVmaW5lZCwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtdW5hbGlnbmVkLWFjY2VzcyIsIG11bmFsaWduZWRfYWNjZXNzLCBGbGFnLCBtX2FybV9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiQWxsb3cgbWVtb3J5IGFjY2Vzc2VzIHRvIGJlIHVuYWxpZ25lZCAoQUFyY2gzMi9BQXJjaDY0IG9ubHkpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm11bmljb2RlIiwgbXVuaWNvZGUsIEpvaW5lZCwgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXVud2luZC10YWJsZXMiLCBtdW53aW5kX3RhYmxlcywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkdlbmVyYXRlIHVud2luZGluZyB0YWJsZXMgZm9yIGFsbCBmdW5jdGlvbnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXY0IiwgbXY0LCBGbGFnLCBtX2hleGFnb25fRmVhdHVyZXNfR3JvdXAsIG1jcHVfRVEsICJoZXhhZ29udjRcMCIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtdjU1IiwgbXY1NSwgRmxhZywgbV9oZXhhZ29uX0ZlYXR1cmVzX0dyb3VwLCBtY3B1X0VRLCAiaGV4YWdvbnY1NVwwIiwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm12NSIsIG12NSwgRmxhZywgbV9oZXhhZ29uX0ZlYXR1cmVzX0dyb3VwLCBtY3B1X0VRLCAiaGV4YWdvbnY1XDAiLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXY2MCIsIG12NjAsIEZsYWcsIG1faGV4YWdvbl9GZWF0dXJlc19Hcm91cCwgbWNwdV9FUSwgImhleGFnb252NjBcMCIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtdjYyIiwgbXY2MiwgRmxhZywgbV9oZXhhZ29uX0ZlYXR1cmVzX0dyb3VwLCBtY3B1X0VRLCAiaGV4YWdvbnY2MlwwIiwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm12NjUiLCBtdjY1LCBGbGFnLCBtX2hleGFnb25fRmVhdHVyZXNfR3JvdXAsIG1jcHVfRVEsICJoZXhhZ29udjY1XDAiLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXZhZXMiLCBtdmFlcywgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtdnBjbG11bHFkcSIsIG12cGNsbXVscWRxLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm12c3giLCBtdnN4LCBGbGFnLCBtX3BwY19GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm12eCIsIG12eCwgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIk1WIiwgTVYsIEZsYWcsIE1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiVXNlIE5NYWtlL0pvbSBmb3JtYXQgZm9yIHRoZSBkZXBmaWxlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm13YXJuLW5vbnBvcnRhYmxlLWNmc3RyaW5ncyIsIG13YXJuX25vbnBvcnRhYmxlX2Nmc3RyaW5ncywgRmxhZywgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm13YXRjaG9zLXNpbXVsYXRvci12ZXJzaW9uLW1pbj0iLCBtd2F0Y2hvc19zaW11bGF0b3JfdmVyc2lvbl9taW5fRVEsIEpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm13YXRjaG9zLXZlcnNpb24tbWluPSIsIG13YXRjaG9zX3ZlcnNpb25fbWluX0VRLCBKb2luZWQsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtd2F0Y2hzaW11bGF0b3ItdmVyc2lvbi1taW49IiwgbXdhdGNoc2ltdWxhdG9yX3ZlcnNpb25fbWluX0VRLCBKb2luZWQsIElOVkFMSUQsIG13YXRjaG9zX3NpbXVsYXRvcl92ZXJzaW9uX21pbl9FUSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm13aW5kb3dzIiwgbXdpbmRvd3MsIEpvaW5lZCwgbV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXgzMiIsIG14MzIsIEZsYWcsIG1fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJteDg3IiwgbXg4NywgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJteGdvdCIsIG14Z290LCBGbGFnLCBtX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXhuYWNrIiwgbXhuYWNrLCBGbGFnLCBtX2FtZGdwdV9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRW5hYmxlIFhOQUNLIChBTURHUFUgb25seSkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXhvcCIsIG14b3AsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXhzYXZlYyIsIG14c2F2ZWMsIEZsYWcsIG1feDg2X0ZlYXR1cmVzX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibXhzYXZlb3B0IiwgbXhzYXZlb3B0LCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm14c2F2ZXMiLCBteHNhdmVzLCBGbGFnLCBtX3g4Nl9GZWF0dXJlc19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm14c2F2ZSIsIG14c2F2ZSwgRmxhZywgbV94ODZfRmVhdHVyZXNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJtenZlY3RvciIsIG16dmVjdG9yLCBGbGFnLCBJTlZBTElELCBmenZlY3RvciwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIk0iLCBNLCBGbGFnLCBNX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJMaWtlIC1NRCwgYnV0IGFsc28gaW1wbGllcyAtRSBhbmQgd3JpdGVzIHRvIHN0ZG91dCBieSBkZWZhdWx0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm5ldy1zdHJ1Y3QtcGF0aC10YmFhIiwgbmV3X3N0cnVjdF9wYXRoX3RiYWEsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgZW5oYW5jZWQgc3RydWN0LXBhdGggYXdhcmUgVHlwZSBCYXNlZCBBbGlhcyBBbmFseXNpcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJuby1jYW5vbmljYWwtcHJlZml4ZXMiLCBub19jYW5vbmljYWxfcHJlZml4ZXMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIEhlbHBIaWRkZW4sIDAsCisgICAgICAgIlVzZSByZWxhdGl2ZSBpbnN0ZWFkIG9mIGNhbm9uaWNhbCBwYXRocyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJuby1jb2RlLWNvbXBsZXRpb24tZ2xvYmFscyIsIG5vX2NvZGVfY29tcGxldGlvbl9nbG9iYWxzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRG8gbm90IGluY2x1ZGUgZ2xvYmFsIGRlY2xhcmF0aW9ucyBpbiBjb2RlLWNvbXBsZXRpb24gcmVzdWx0cy4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibm8tY29kZS1jb21wbGV0aW9uLW5zLWxldmVsLWRlY2xzIiwgbm9fY29kZV9jb21wbGV0aW9uX25zX2xldmVsX2RlY2xzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRG8gbm90IGluY2x1ZGUgZGVjbGFyYXRpb25zIGluc2lkZSBuYW1lc3BhY2VzIChpbmNsLiBnbG9iYWwgbmFtZXNwYWNlKSBpbiB0aGUgY29kZS1jb21wbGV0aW9uIHJlc3VsdHMuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm5vLWNwcC1wcmVjb21wIiwgbm9fY3BwX3ByZWNvbXAsIEZsYWcsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgIm5vLWN1ZGEtZ3B1LWFyY2g9Iiwgbm9fY3VkYV9ncHVfYXJjaF9FUSwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsCisgICAgICAgIlJlbW92ZSBHUFUgYXJjaGl0ZWN0dXJlIChlLmcuIHNtXzM1KSBmcm9tIHRoZSBsaXN0IG9mIEdQVXMgdG8gY29tcGlsZSBmb3IuICdhbGwnIHJlc2V0cyB0aGUgbGlzdCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAibm8tY3VkYS1ub29wdC1kZXZpY2UtZGVidWciLCBub19jdWRhX25vb3B0X2RldmljZV9kZWJ1ZywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgIm5vLWN1ZGEtdmVyc2lvbi1jaGVjayIsIG5vX2N1ZGFfdmVyc2lvbl9jaGVjaywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiRG9uJ3QgZXJyb3Igb3V0IGlmIHRoZSBkZXRlY3RlZCB2ZXJzaW9uIG9mIHRoZSBDVURBIGluc3RhbGwgaXMgdG9vIGxvdyBmb3IgdGhlIHJlcXVlc3RlZCBDVURBIGdwdSBhcmNoaXRlY3R1cmUuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm5vLWVtaXQtbGx2bS11c2VsaXN0cyIsIG5vX2VtaXRfbGx2bV91c2VsaXN0cywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkRvbid0IHByZXNlcnZlIG9yZGVyIG9mIExMVk0gdXNlLWxpc3RzIHdoZW4gc2VyaWFsaXppbmciLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibm8tZmluYWxpemUtcmVtb3ZhbCIsIG1pZ3JhdG9yX25vX2ZpbmFsaXplX3JlbW92YWwsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEbyBub3QgcmVtb3ZlIGZpbmFsaXplIG1ldGhvZCBpbiBnYyBtb2RlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm5vLWltcGxpY2l0LWZsb2F0Iiwgbm9faW1wbGljaXRfZmxvYXQsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEb24ndCBnZW5lcmF0ZSBpbXBsaWNpdCBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibm8taW50ZWdyYXRlZC1hcyIsIGFub255bW91c18yNSwgRmxhZywgSU5WQUxJRCwgZm5vX2ludGVncmF0ZWRfYXMsIG51bGxwdHIsIENDMU9wdGlvbiB8IERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfNCwgIm5vLWludGVncmF0ZWQtY3BwIiwgbm9faW50ZWdyYXRlZF9jcHAsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgIm5vLWxpbmUtY29tbWFuZHMiLCBfbm9fbGluZV9jb21tYW5kcywgRmxhZywgSU5WQUxJRCwgUCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm5vLW5zLWFsbG9jLWVycm9yIiwgbWlncmF0b3Jfbm9fbnNhbGxvY19lcnJvciwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkRvIG5vdCBlcnJvciBvbiB1c2Ugb2YgTlNBbGxvY2F0ZUNvbGxlY3RhYmxlL05TUmVhbGxvY2F0ZUNvbGxlY3RhYmxlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfNCwgIm5vLXBlZGFudGljIiwgbm9fcGVkYW50aWMsIEZsYWcsIHBlZGFudGljX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibm8tcGllIiwgbm9fcGllLCBGbGFnLCBJTlZBTElELCBub3BpZSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm5vLXB0aHJlYWQiLCBub19wdGhyZWFkLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJuby1zdGFuZGFyZC1pbmNsdWRlcyIsIF9ub19zdGFuZGFyZF9pbmNsdWRlcywgRmxhZywgSU5WQUxJRCwgbm9zdGRpbmMsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJuby1zdGFuZGFyZC1saWJyYXJpZXMiLCBfbm9fc3RhbmRhcmRfbGlicmFyaWVzLCBGbGFnLCBJTlZBTElELCBub3N0ZGxpYiwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm5vLXN0cnVjdC1wYXRoLXRiYWEiLCBub19zdHJ1Y3RfcGF0aF90YmFhLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiVHVybiBvZmYgc3RydWN0LXBhdGggYXdhcmUgVHlwZSBCYXNlZCBBbGlhcyBBbmFseXNpcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJuby1zeXN0ZW0taGVhZGVyLXByZWZpeD0iLCBub19zeXN0ZW1faGVhZGVyX3ByZWZpeCwgSm9pbmVkLCBjbGFuZ19pX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlRyZWF0IGFsbCAjaW5jbHVkZSBwYXRocyBzdGFydGluZyB3aXRoIDxwcmVmaXg+IGFzIG5vdCBpbmNsdWRpbmcgYSBzeXN0ZW0gaGVhZGVyLiIsICI8cHJlZml4PiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJuby1zeXN0ZW0taGVhZGVyLXByZWZpeCIsIGFub255bW91c18yMywgU2VwYXJhdGUsIElOVkFMSUQsIG5vX3N5c3RlbV9oZWFkZXJfcHJlZml4LCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAibm8tdW5kZWZpbmVkIiwgX25vX3VuZGVmaW5lZCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgTGlua2VySW5wdXQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJuby13YXJuaW5ncyIsIF9ub193YXJuaW5ncywgRmxhZywgSU5WQUxJRCwgdywgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm5vX2RlYWRfc3RyaXBfaW5pdHNfYW5kX3Rlcm1zIiwgbm9fX2RlYWRfX3N0cmlwX19pbml0c19fYW5kX190ZXJtcywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm5vYnVpbHRpbmluYyIsIG5vYnVpbHRpbmluYywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSBidWlsdGluICNpbmNsdWRlIGRpcmVjdG9yaWVzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm5vY3BwIiwgbm9jcHAsIEZsYWcsIGdmb3J0cmFuX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibm9jdWRhaW5jIiwgbm9jdWRhaW5jLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibm9jdWRhbGliIiwgbm9jdWRhbGliLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibm9kZWZhdWx0bGlicyIsIG5vZGVmYXVsdGxpYnMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJub2ZpeHByZWJpbmRpbmciLCBub2ZpeHByZWJpbmRpbmcsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJub2xpYmMiLCBub2xpYmMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJub2xvZ28iLCBfU0xBU0hfbm9sb2dvLCBGbGFnLCBjbF9pZ25vcmVkX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm5vbXVsdGlkZWZzIiwgbm9tdWx0aWRlZnMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJub3BpZSIsIG5vcGllLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibm9wcmViaW5kIiwgbm9wcmViaW5kLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibm9zZWdsaW5rZWRpdCIsIG5vc2VnbGlua2VkaXQsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJub3N0YXJ0ZmlsZXMiLCBub3N0YXJ0ZmlsZXMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJub3N0ZGluYysrIiwgbm9zdGRpbmN4eCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIHN0YW5kYXJkICNpbmNsdWRlIGRpcmVjdG9yaWVzIGZvciB0aGUgQysrIHN0YW5kYXJkIGxpYnJhcnkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibm9zdGRpbmMiLCBub3N0ZGluYywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ29yZU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm5vc3RkbGliKysiLCBub3N0ZGxpYnh4LCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibm9zdGRsaWJpbmMiLCBub3N0ZGxpYmluYywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm5vc3RkbGliIiwgbm9zdGRsaWIsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJub3N0ZHN5c3RlbWluYyIsIG5vc3Rkc3lzdGVtaW5jLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSBzdGFuZGFyZCBzeXN0ZW0gI2luY2x1ZGUgZGlyZWN0b3JpZXMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibiIsIG4sIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMUFzT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkRvbid0IGF1dG9tYXRpY2FsbHkgc3RhcnQgYXNzZW1ibHkgZmlsZSB3aXRoIGEgdGV4dCBzZWN0aW9uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIk8wIiwgTzAsIEZsYWcsIE9fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IEhlbHBIaWRkZW4sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJPMCIsIF9TTEFTSF9PMCwgRmxhZywgY2xfR3JvdXAsIE8wLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiTzQiLCBPNCwgRmxhZywgT19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgSGVscEhpZGRlbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIk9iakMrKyIsIE9iakNYWCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJUcmVhdCBzb3VyY2UgaW5wdXQgZmlsZXMgYXMgT2JqZWN0aXZlLUMrKyBpbnB1dHMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAib2JqYy1pc3lzdGVtIiwgb2JqY19pc3lzdGVtLCBKb2luZWRPclNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiQWRkIGRpcmVjdG9yeSB0byB0aGUgT2JqQyBTWVNURU0gaW5jbHVkZSBzZWFyY2ggcGF0aCIsICI8ZGlyZWN0b3J5PiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJvYmpjbXQtYXRvbWljLXByb3BlcnR5Iiwgb2JqY210X2F0b21pY19wcm9wZXJ0eSwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJNYWtlIG1pZ3JhdGlvbiB0byAnYXRvbWljJyBwcm9wZXJ0aWVzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm9iamNtdC1taWdyYXRlLWFsbCIsIG9iamNtdF9taWdyYXRlX2FsbCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgbWlncmF0aW9uIHRvIG1vZGVybiBPYmpDIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm9iamNtdC1taWdyYXRlLWFubm90YXRpb24iLCBvYmpjbXRfbWlncmF0ZV9hbm5vdGF0aW9uLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBtaWdyYXRpb24gdG8gcHJvcGVydHkgYW5kIG1ldGhvZCBhbm5vdGF0aW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJvYmpjbXQtbWlncmF0ZS1kZXNpZ25hdGVkLWluaXQiLCBvYmpjbXRfbWlncmF0ZV9kZXNpZ25hdGVkX2luaXQsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIG1pZ3JhdGlvbiB0byBpbmZlciBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSIGZvciBpbml0aWFsaXplciBtZXRob2RzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm9iamNtdC1taWdyYXRlLWluc3RhbmNldHlwZSIsIG9iamNtdF9taWdyYXRlX2luc3RhbmNldHlwZSwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgbWlncmF0aW9uIHRvIGluZmVyIGluc3RhbmNldHlwZSBmb3IgbWV0aG9kIHJlc3VsdCB0eXBlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm9iamNtdC1taWdyYXRlLWxpdGVyYWxzIiwgb2JqY210X21pZ3JhdGVfbGl0ZXJhbHMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIG1pZ3JhdGlvbiB0byBtb2Rlcm4gT2JqQyBsaXRlcmFscyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJvYmpjbXQtbWlncmF0ZS1ucy1tYWNyb3MiLCBvYmpjbXRfbWlncmF0ZV9uc21hY3JvcywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgbWlncmF0aW9uIHRvIE5TX0VOVU0vTlNfT1BUSU9OUyBtYWNyb3MiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAib2JqY210LW1pZ3JhdGUtcHJvcGVydHktZG90LXN5bnRheCIsIG9iamNtdF9taWdyYXRlX3Byb3BlcnR5X2RvdF9zeW50YXgsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIG1pZ3JhdGlvbiBvZiBzZXR0ZXIvZ2V0dGVyIG1lc3NhZ2VzIHRvIHByb3BlcnR5LWRvdCBzeW50YXgiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAib2JqY210LW1pZ3JhdGUtcHJvcGVydHkiLCBvYmpjbXRfbWlncmF0ZV9wcm9wZXJ0eSwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgbWlncmF0aW9uIHRvIG1vZGVybiBPYmpDIHByb3BlcnR5IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm9iamNtdC1taWdyYXRlLXByb3RvY29sLWNvbmZvcm1hbmNlIiwgb2JqY210X21pZ3JhdGVfcHJvdG9jb2xfY29uZm9ybWFuY2UsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIG1pZ3JhdGlvbiB0byBhZGQgcHJvdG9jb2wgY29uZm9ybWFuY2Ugb24gY2xhc3NlcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJvYmpjbXQtbWlncmF0ZS1yZWFkb25seS1wcm9wZXJ0eSIsIG9iamNtdF9taWdyYXRlX3JlYWRvbmx5X3Byb3BlcnR5LCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBtaWdyYXRpb24gdG8gbW9kZXJuIE9iakMgcmVhZG9ubHkgcHJvcGVydHkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAib2JqY210LW1pZ3JhdGUtcmVhZHdyaXRlLXByb3BlcnR5Iiwgb2JqY210X21pZ3JhdGVfcmVhZHdyaXRlX3Byb3BlcnR5LCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBtaWdyYXRpb24gdG8gbW9kZXJuIE9iakMgcmVhZHdyaXRlIHByb3BlcnR5IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm9iamNtdC1taWdyYXRlLXN1YnNjcmlwdGluZyIsIG9iamNtdF9taWdyYXRlX3N1YnNjcmlwdGluZywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgbWlncmF0aW9uIHRvIG1vZGVybiBPYmpDIHN1YnNjcmlwdGluZyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJvYmpjbXQtbnMtbm9uYXRvbWljLWlvc29ubHkiLCBvYmpjbXRfbnNfbm9uYXRvbWljX2lvc29ubHksIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIG1pZ3JhdGlvbiB0byB1c2UgTlNfTk9OQVRPTUlDX0lPU09OTFkgbWFjcm8gZm9yIHNldHRpbmcgcHJvcGVydHkncyAnYXRvbWljJyBhdHRyaWJ1dGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAib2JqY210LXJldHVybnMtaW5uZXJwb2ludGVyLXByb3BlcnR5Iiwgb2JqY210X3JldHVybnNfaW5uZXJwb2ludGVyX3Byb3BlcnR5LCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBtaWdyYXRpb24gdG8gYW5ub3RhdGUgcHJvcGVydHkgd2l0aCBOU19SRVRVUk5TX0lOTkVSX1BPSU5URVIiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAib2JqY210LXdoaXRlLWxpc3QtZGlyLXBhdGg9IiwgYW5vbnltb3VzXzIsIEpvaW5lZCwgSU5WQUxJRCwgb2JqY210X3doaXRlbGlzdF9kaXJfcGF0aCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAib2JqY210LXdoaXRlbGlzdC1kaXItcGF0aD0iLCBvYmpjbXRfd2hpdGVsaXN0X2Rpcl9wYXRoLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiT25seSBtb2RpZnkgZmlsZXMgd2l0aCBhIGZpbGVuYW1lIGNvbnRhaW5lZCBpbiB0aGUgcHJvdmlkZWQgZGlyZWN0b3J5IHBhdGgiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAib2JqY3h4LWlzeXN0ZW0iLCBvYmpjeHhfaXN5c3RlbSwgSm9pbmVkT3JTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkFkZCBkaXJlY3RvcnkgdG8gdGhlIE9iakMrKyBTWVNURU0gaW5jbHVkZSBzZWFyY2ggcGF0aCIsICI8ZGlyZWN0b3J5PiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJPYmpDIiwgT2JqQywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJUcmVhdCBzb3VyY2UgaW5wdXQgZmlsZXMgYXMgT2JqZWN0aXZlLUMgaW5wdXRzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm9iamVjdCIsIG9iamVjdCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIk9kIiwgX1NMQVNIX09kLCBGbGFnLCBjbF9Hcm91cCwgTzAsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgb3B0aW1pemF0aW9uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIk9mYXN0IiwgT2Zhc3QsIEpvaW5lZCwgT19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiT2ciLCBfU0xBU0hfT2csIEZsYWcsIGNsX2lnbm9yZWRfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiT2ktIiwgX1NMQVNIX09pXywgRmxhZywgY2xfR3JvdXAsIGZub19idWlsdGluLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIHVzZSBvZiBidWlsdGluIGZ1bmN0aW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJPaSIsIF9TTEFTSF9PaSwgRmxhZywgY2xfR3JvdXAsIGZidWlsdGluLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgdXNlIG9mIGJ1aWx0aW4gZnVuY3Rpb25zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIm9wZW5tcC0iLCBfU0xBU0hfb3Blbm1wXywgRmxhZywgY2xfaWdub3JlZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJvcGVubXAiLCBfU0xBU0hfb3Blbm1wLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIm9wdC1yZWNvcmQtZmlsZSIsIG9wdF9yZWNvcmRfZmlsZSwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJGaWxlIG5hbWUgdG8gdXNlIGZvciBZQU1MIG9wdGltaXphdGlvbiByZWNvcmQgb3V0cHV0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgIm9wdGltaXplPSIsIF9vcHRpbWl6ZV9FUSwgSm9pbmVkLCBJTlZBTElELCBPLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAib3B0aW1pemUiLCBfb3B0aW1pemUsIEZsYWcsIElOVkFMSUQsIE8sIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJPcyIsIF9TTEFTSF9PcywgRmxhZywgY2xfR3JvdXAsIE8sICJzXDAiLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJPcHRpbWl6ZSBmb3Igc2l6ZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJPdCIsIF9TTEFTSF9PdCwgRmxhZywgY2xfR3JvdXAsIE8sICIyXDAiLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJPcHRpbWl6ZSBmb3Igc3BlZWQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAib3V0cHV0LWFzbS12YXJpYW50Iiwgb3V0cHV0X2FzbV92YXJpYW50LCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxQXNPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiU2VsZWN0IHRoZSBhc20gdmFyaWFudCBpbmRleCB0byB1c2UgZm9yIG91dHB1dCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJvdXRwdXQtY2xhc3MtZGlyZWN0b3J5PSIsIF9vdXRwdXRfY2xhc3NfZGlyZWN0b3J5X0VRLCBKb2luZWQsIElOVkFMSUQsIGZvdXRwdXRfY2xhc3NfZGlyX0VRLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAib3V0cHV0LWNsYXNzLWRpcmVjdG9yeSIsIF9vdXRwdXRfY2xhc3NfZGlyZWN0b3J5LCBTZXBhcmF0ZSwgSU5WQUxJRCwgZm91dHB1dF9jbGFzc19kaXJfRVEsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJvdXRwdXQ9IiwgX291dHB1dF9FUSwgSm9pbmVkLCBJTlZBTElELCBvLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAib3V0cHV0IiwgX291dHB1dCwgU2VwYXJhdGUsIElOVkFMSUQsIG8sIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJPIiwgT19mbGFnLCBGbGFnLCBJTlZBTElELCBPLCAiMlwwIiwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiTyIsIE8sIEpvaW5lZCwgT19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiTyIsIF9TTEFTSF9PLCBKb2luZWQsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJPcHRpbWl6YXRpb24gbGV2ZWwiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAibyIsIG8sIEpvaW5lZE9yU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IFJlbmRlckFzSW5wdXQgfCBDQzFPcHRpb24gfCBDQzFBc09wdGlvbiwgMCwKKyAgICAgICAiV3JpdGUgb3V0cHV0IHRvIDxmaWxlPiIsICI8ZmlsZT4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAibyIsIF9TTEFTSF9vLCBKb2luZWRPclNlcGFyYXRlLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiU2V0IG91dHB1dCBmaWxlIG9yIGRpcmVjdG9yeSAoZW5kcyBpbiAvIG9yIFxcKSIsICI8ZmlsZSBvciBkaXJlY3Rvcnk+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInBhZ2V6ZXJvX3NpemUiLCBwYWdlemVyb19fc2l6ZSwgSm9pbmVkT3JTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgInBhcmFtPSIsIF9wYXJhbV9FUSwgSm9pbmVkLCBJTlZBTElELCBfcGFyYW0sIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJwYXJhbSIsIF9wYXJhbSwgU2VwYXJhdGUsIENvbXBpbGVPbmx5X0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF80LCAicGFzcy1leGl0LWNvZGVzIiwgcGFzc19leGl0X2NvZGVzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBVbnN1cHBvcnRlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfNCwgInBlZGFudGljLWVycm9ycyIsIHBlZGFudGljX2Vycm9ycywgRmxhZywgcGVkYW50aWNfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfNCwgInBlZGFudGljIiwgcGVkYW50aWMsIEZsYWcsIHBlZGFudGljX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJwZXJtaXNzaXZlLSIsIF9TTEFTSF9wZXJtaXNzaXZlXywgRmxhZywgY2xfaWdub3JlZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJwZyIsIHBnLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBtY291bnQgaW5zdHJ1bWVudGF0aW9uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInBpYy1pcy1waWUiLCBwaWNfaXNfcGllLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRmlsZSBpcyBmb3IgYSBwb3NpdGlvbiBpbmRlcGVuZGVudCBleGVjdXRhYmxlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInBpYy1sZXZlbCIsIHBpY19sZXZlbCwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJWYWx1ZSBmb3IgX19QSUNfXyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJwaWUiLCBwaWUsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzQsICJwaXBlIiwgcGlwZSwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiVXNlIHBpcGVzIGJldHdlZW4gY29tbWFuZHMsIHdoZW4gcG9zc2libGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAicGx1Z2luLWFyZy0iLCBwbHVnaW5fYXJnLCBKb2luZWRBbmRTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlBhc3MgPGFyZz4gdG8gcGx1Z2luIDxuYW1lPiIsICI8bmFtZT4gPGFyZz4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAicGx1Z2luIiwgcGx1Z2luLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlVzZSB0aGUgbmFtZWQgcGx1Z2luIGFjdGlvbiBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGFjdGlvbiAodXNlIFwiaGVscFwiIHRvIGxpc3QgYXZhaWxhYmxlIG9wdGlvbnMpIiwgIjxuYW1lPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJwcmVhbWJsZS1ieXRlcz0iLCBwcmVhbWJsZV9ieXRlc19FUSwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiQXNzdW1lIHRoYXQgdGhlIHByZWNvbXBpbGVkIGhlYWRlciBpcyBhIHByZWNvbXBpbGVkIHByZWFtYmxlIGNvdmVyaW5nIHRoZSBmaXJzdCBOIGJ5dGVzIG9mIHRoZSBtYWluIGZpbGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAicHJlYmluZF9hbGxfdHdvbGV2ZWxfbW9kdWxlcyIsIHByZWJpbmRfX2FsbF9fdHdvbGV2ZWxfX21vZHVsZXMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJwcmViaW5kIiwgcHJlYmluZCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgInByZWNvbXBpbGUiLCBfcHJlY29tcGlsZSwgRmxhZywgQWN0aW9uX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsCisgICAgICAgIk9ubHkgcHJlY29tcGlsZSB0aGUgaW5wdXQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAicHJlZml4PSIsIF9wcmVmaXhfRVEsIEpvaW5lZCwgSU5WQUxJRCwgQiwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgInByZWZpeCIsIF9wcmVmaXgsIFNlcGFyYXRlLCBJTlZBTElELCBCLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAicHJlbG9hZCIsIHByZWxvYWQsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJwcmVwcm9jZXNzIiwgX3ByZXByb2Nlc3MsIEZsYWcsIElOVkFMSUQsIEUsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJwcmludC1kZWNsLWNvbnRleHRzIiwgcHJpbnRfZGVjbF9jb250ZXh0cywgRmxhZywgQWN0aW9uX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiUHJpbnQgRGVjbENvbnRleHRzIGFuZCB0aGVpciBEZWNscyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJwcmludC1kaWFnbm9zdGljLWNhdGVnb3JpZXMiLCBfcHJpbnRfZGlhZ25vc3RpY19jYXRlZ29yaWVzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF80LCAicHJpbnQtZmlsZS1uYW1lPSIsIHByaW50X2ZpbGVfbmFtZV9FUSwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJQcmludCB0aGUgZnVsbCBsaWJyYXJ5IHBhdGggb2YgPGZpbGU+IiwgIjxmaWxlPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJwcmludC1maWxlLW5hbWUiLCBfcHJpbnRfZmlsZV9uYW1lLCBTZXBhcmF0ZSwgSU5WQUxJRCwgcHJpbnRfZmlsZV9uYW1lX0VRLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAicHJpbnQtaXZhci1sYXlvdXQiLCBwcmludF9pdmFyX2xheW91dCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgT2JqZWN0aXZlLUMgSXZhciBsYXlvdXQgYml0bWFwIHByaW50IHRyYWNlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfNCwgInByaW50LWxpYmdjYy1maWxlLW5hbWUiLCBwcmludF9saWJnY2NfZmlsZV9uYW1lLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJQcmludCB0aGUgbGlicmFyeSBwYXRoIGZvciB0aGUgY3VycmVudGx5IHVzZWQgY29tcGlsZXIgcnVudGltZSBsaWJyYXJ5IChcImxpYmdjYy5hXCIgb3IgXCJsaWJjbGFuZ19ydC5idWlsdGlucy4qLmFcIikiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAicHJpbnQtbWlzc2luZy1maWxlLWRlcGVuZGVuY2llcyIsIF9wcmludF9taXNzaW5nX2ZpbGVfZGVwZW5kZW5jaWVzLCBGbGFnLCBJTlZBTElELCBNRywgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfNCwgInByaW50LW11bHRpLWRpcmVjdG9yeSIsIHByaW50X211bHRpX2RpcmVjdG9yeSwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfNCwgInByaW50LW11bHRpLWxpYiIsIHByaW50X211bHRpX2xpYiwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfNCwgInByaW50LW11bHRpLW9zLWRpcmVjdG9yeSIsIHByaW50X211bHRpX29zX2RpcmVjdG9yeSwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgVW5zdXBwb3J0ZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJwcmludC1wcmVhbWJsZSIsIHByaW50X3ByZWFtYmxlLCBGbGFnLCBBY3Rpb25fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJQcmludCB0aGUgXCJwcmVhbWJsZVwiIG9mIGEgZmlsZSwgd2hpY2ggaXMgYSBjYW5kaWRhdGUgZm9yIGltcGxpY2l0IHByZWNvbXBpbGVkIGhlYWRlcnMuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfNCwgInByaW50LXByb2ctbmFtZT0iLCBwcmludF9wcm9nX25hbWVfRVEsIEpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiUHJpbnQgdGhlIGZ1bGwgcHJvZ3JhbSBwYXRoIG9mIDxuYW1lPiIsICI8bmFtZT4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAicHJpbnQtcHJvZy1uYW1lIiwgX3ByaW50X3Byb2dfbmFtZSwgU2VwYXJhdGUsIElOVkFMSUQsIHByaW50X3Byb2dfbmFtZV9FUSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfNCwgInByaW50LXJlc291cmNlLWRpciIsIHByaW50X3Jlc291cmNlX2RpciwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiUHJpbnQgdGhlIHJlc291cmNlIGRpcmVjdG9yeSBwYXRobmFtZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzQsICJwcmludC1zZWFyY2gtZGlycyIsIHByaW50X3NlYXJjaF9kaXJzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJQcmludCB0aGUgcGF0aHMgdXNlZCBmb3IgZmluZGluZyBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInByaW50LXN0YXRzIiwgcHJpbnRfc3RhdHMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJQcmludCBwZXJmb3JtYW5jZSBtZXRyaWNzIGFuZCBzdGF0aXN0aWNzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInByaXZhdGVfYnVuZGxlIiwgcHJpdmF0ZV9fYnVuZGxlLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAicHJvZmlsZS1ibG9ja3MiLCBfcHJvZmlsZV9ibG9ja3MsIEZsYWcsIElOVkFMSUQsIGEsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJwcm9maWxlIiwgX3Byb2ZpbGUsIEZsYWcsIElOVkFMSUQsIHAsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJwdGhyZWFkcyIsIHB0aHJlYWRzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAicHRocmVhZCIsIHB0aHJlYWQsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiU3VwcG9ydCBQT1NJWCB0aHJlYWRzIGluIGdlbmVyYXRlZCBjb2RlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgInB0eGFzLXBhdGg9IiwgcHR4YXNfcGF0aF9FUSwgSm9pbmVkLCBpX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJQYXRoIHRvIHB0eGFzICh1c2VkIGZvciBjb21waWxpbmcgQ1VEQSBjb2RlKSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJQIiwgUCwgRmxhZywgUHJlcHJvY2Vzc29yX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgbGluZW1hcmtlciBvdXRwdXQgaW4gLUUgbW9kZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJQIiwgX1NMQVNIX1AsIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJQcmVwcm9jZXNzIHRvIGZpbGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAicCIsIHAsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJRZmFzdF90cmFuc2NlbmRlbnRhbHMiLCBfU0xBU0hfUWZhc3RfdHJhbnNjZW5kZW50YWxzLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlFJZmlzdCIsIF9TTEFTSF9RSWZpc3QsIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiUWltcHJlY2lzZV9md2FpdHMiLCBfU0xBU0hfUWltcHJlY2lzZV9md2FpdHMsIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiUW4iLCBRbiwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgSGVscEhpZGRlbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlFwYXIiLCBfU0xBU0hfUXBhciwgRmxhZywgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJRdW51c2VkLWFyZ3VtZW50cyIsIFF1bnVzZWRfYXJndW1lbnRzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJEb24ndCBlbWl0IHdhcm5pbmcgZm9yIHVudXNlZCBkcml2ZXIgYXJndW1lbnRzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlF2ZWMtcmVwb3J0IiwgX1NMQVNIX1F2ZWNfcmVwb3J0LCBKb2luZWQsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiUXZlYy0iLCBfU0xBU0hfUXZlY18sIEZsYWcsIGNsX0dyb3VwLCBmbm9fdmVjdG9yaXplLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIHRoZSBsb29wIHZlY3Rvcml6YXRpb24gcGFzc2VzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlF2ZWMiLCBfU0xBU0hfUXZlYywgRmxhZywgY2xfR3JvdXAsIGZ2ZWN0b3JpemUsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSB0aGUgbG9vcCB2ZWN0b3JpemF0aW9uIHBhc3NlcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJRIiwgUSwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgSGVscEhpZGRlbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInJkeW5hbWljIiwgcmR5bmFtaWMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJyZWFkX29ubHlfcmVsb2NzIiwgcmVhZF9fb25seV9fcmVsb2NzLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInJlbGF4ZWQtYWxpYXNpbmciLCByZWxheGVkX2FsaWFzaW5nLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiVHVybiBvZmYgVHlwZSBCYXNlZCBBbGlhcyBBbmFseXNpcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzQsICJyZWxvY2F0YWJsZS1wY2giLCByZWxvY2F0YWJsZV9wY2gsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiV2hldGhlciB0byBidWlsZCBhIHJlbG9jYXRhYmxlIHByZWNvbXBpbGVkIGhlYWRlciIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJyZW1hcC1maWxlIiwgcmVtYXBfZmlsZSwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJSZXBsYWNlIHRoZSBjb250ZW50cyBvZiB0aGUgPGZyb20+IGZpbGUgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIDx0bz4gZmlsZSIsICI8ZnJvbT47PHRvPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJyZW1hcCIsIHJlbWFwLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAicmVzb3VyY2UtZGlyPSIsIHJlc291cmNlX2Rpcl9FUSwgSm9pbmVkLCBJTlZBTElELCByZXNvdXJjZV9kaXIsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJyZXNvdXJjZS1kaXIiLCByZXNvdXJjZV9kaXIsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBDQzFPcHRpb24gfCBDb3JlT3B0aW9uIHwgSGVscEhpZGRlbiwgMCwKKyAgICAgICAiVGhlIGRpcmVjdG9yeSB3aGljaCBob2xkcyB0aGUgY29tcGlsZXIgcmVzb3VyY2UgZmlsZXMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAicmVzb3VyY2U9IiwgX3Jlc291cmNlX0VRLCBKb2luZWQsIElOVkFMSUQsIGZjb21waWxlX3Jlc291cmNlX0VRLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAicmVzb3VyY2UiLCBfcmVzb3VyY2UsIFNlcGFyYXRlLCBJTlZBTElELCBmY29tcGlsZV9yZXNvdXJjZV9FUSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInJld3JpdGUtbGVnYWN5LW9iamMiLCByZXdyaXRlX2xlZ2FjeV9vYmpjLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsCisgICAgICAgIlJld3JpdGUgTGVnYWN5IE9iamVjdGl2ZS1DIHNvdXJjZSB0byBDKysiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAicmV3cml0ZS1tYWNyb3MiLCByZXdyaXRlX21hY3JvcywgRmxhZywgQWN0aW9uX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiRXhwYW5kIG1hY3JvcyB3aXRob3V0IGZ1bGwgcHJlcHJvY2Vzc2luZyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJyZXdyaXRlLW9iamMiLCByZXdyaXRlX29iamMsIEZsYWcsIEFjdGlvbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJSZXdyaXRlIE9iamVjdGl2ZS1DIHNvdXJjZSB0byBDKysiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAicmV3cml0ZS10ZXN0IiwgcmV3cml0ZV90ZXN0LCBGbGFnLCBBY3Rpb25fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJSZXdyaXRlciBwbGF5Z3JvdW5kIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIlJwYXNzLWFuYWx5c2lzPSIsIFJwYXNzX2FuYWx5c2lzX0VRLCBKb2luZWQsIFJfdmFsdWVfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiUmVwb3J0IHRyYW5zZm9ybWF0aW9uIGFuYWx5c2lzIGZyb20gb3B0aW1pemF0aW9uIHBhc3NlcyB3aG9zZSBuYW1lIG1hdGNoZXMgdGhlIGdpdmVuIFBPU0lYIHJlZ3VsYXIgZXhwcmVzc2lvbiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJScGFzcy1taXNzZWQ9IiwgUnBhc3NfbWlzc2VkX0VRLCBKb2luZWQsIFJfdmFsdWVfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiUmVwb3J0IG1pc3NlZCB0cmFuc2Zvcm1hdGlvbnMgYnkgb3B0aW1pemF0aW9uIHBhc3NlcyB3aG9zZSBuYW1lIG1hdGNoZXMgdGhlIGdpdmVuIFBPU0lYIHJlZ3VsYXIgZXhwcmVzc2lvbiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJScGFzcz0iLCBScGFzc19FUSwgSm9pbmVkLCBSX3ZhbHVlX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlJlcG9ydCB0cmFuc2Zvcm1hdGlvbnMgcGVyZm9ybWVkIGJ5IG9wdGltaXphdGlvbiBwYXNzZXMgd2hvc2UgbmFtZSBtYXRjaGVzIHRoZSBnaXZlbiBQT1NJWCByZWd1bGFyIGV4cHJlc3Npb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAicnBhdGgiLCBycGF0aCwgU2VwYXJhdGUsIExpbmtfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIExpbmtlcklucHV0LCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAicnNwLXF1b3Rpbmc9IiwgcnNwX3F1b3RpbmcsIEpvaW5lZCwgaW50ZXJuYWxfZHJpdmVyX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgSGVscEhpZGRlbiwgMCwKKyAgICAgICAiU2V0IHRoZSByc3AgcXVvdGluZyB0byBlaXRoZXIgJ3Bvc2l4Jywgb3IgJ3dpbmRvd3MnIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlJUQyIsIF9TTEFTSF9SVEMsIEpvaW5lZCwgY2xfaWdub3JlZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBIZWxwSGlkZGVuLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF80LCAicnRsaWI9IiwgcnRsaWJfRVEsIEpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiQ29tcGlsZXIgcnVudGltZSBsaWJyYXJ5IHRvIHVzZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJydGxpYiIsIF9ydGxpYiwgU2VwYXJhdGUsIElOVkFMSUQsIHJ0bGliX0VRLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiUiIsIFJfSm9pbmVkLCBKb2luZWQsIFJfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSB0aGUgc3BlY2lmaWVkIHJlbWFyayIsICI8cmVtYXJrPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJyIiwgciwgRmxhZywgTGlua19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgTGlua2VySW5wdXQgfCBOb0FyZ3VtZW50VW51c2VkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF80LCAic2F2ZS1zdGF0cz0iLCBzYXZlX3N0YXRzX0VRLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiU2F2ZSBsbHZtIHN0YXRpc3RpY3MuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfNCwgInNhdmUtc3RhdHMiLCBzYXZlX3N0YXRzLCBGbGFnLCBJTlZBTElELCBzYXZlX3N0YXRzX0VRLCAiY3dkXDAiLCBEcml2ZXJPcHRpb24sIDAsCisgICAgICAgIlNhdmUgbGx2bSBzdGF0aXN0aWNzLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzQsICJzYXZlLXRlbXBzPSIsIHNhdmVfdGVtcHNfRVEsIEpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJTYXZlIGludGVybWVkaWF0ZSBjb21waWxhdGlvbiByZXN1bHRzLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzQsICJzYXZlLXRlbXBzIiwgc2F2ZV90ZW1wcywgRmxhZywgSU5WQUxJRCwgc2F2ZV90ZW1wc19FUSwgImN3ZFwwIiwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJTYXZlIGludGVybWVkaWF0ZSBjb21waWxhdGlvbiByZXN1bHRzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgInNkbC0iLCBfU0xBU0hfc2RsXywgRmxhZywgY2xfaWdub3JlZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJzZGwiLCBfU0xBU0hfc2RsLCBGbGFnLCBjbF9pZ25vcmVkX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInNlY3RhbGlnbiIsIHNlY3RhbGlnbiwgTXVsdGlBcmcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDMsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJzZWN0Y3JlYXRlIiwgc2VjdGNyZWF0ZSwgTXVsdGlBcmcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDMsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJzZWN0b2JqZWN0c3ltYm9scyIsIHNlY3RvYmplY3RzeW1ib2xzLCBNdWx0aUFyZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMiwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInNlY3RvcmRlciIsIHNlY3RvcmRlciwgTXVsdGlBcmcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDMsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJzZWcxYWRkciIsIHNlZzFhZGRyLCBKb2luZWRPclNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAic2VnX2FkZHJfdGFibGVfZmlsZW5hbWUiLCBzZWdfX2FkZHJfX3RhYmxlX19maWxlbmFtZSwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJzZWdfYWRkcl90YWJsZSIsIHNlZ19fYWRkcl9fdGFibGUsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAic2VnYWRkciIsIHNlZ2FkZHIsIE11bHRpQXJnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAic2VnY3JlYXRlIiwgc2VnY3JlYXRlLCBNdWx0aUFyZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMywgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInNlZ2xpbmtlZGl0Iiwgc2VnbGlua2VkaXQsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJzZWdwcm90Iiwgc2VncHJvdCwgTXVsdGlBcmcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDMsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJzZWdzX3JlYWRfb25seV9hZGRyIiwgc2Vnc19fcmVhZF9fb25seV9fYWRkciwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJzZWdzX3JlYWRfd3JpdGVfYWRkciIsIHNlZ3NfX3JlYWRfX3dyaXRlX19hZGRyLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInNlZ3NfcmVhZF8iLCBzZWdzX19yZWFkX18sIEpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInNlcmlhbGl6ZS1kaWFnbm9zdGljLWZpbGUiLCBkaWFnbm9zdGljX3NlcmlhbGl6ZWRfZmlsZSwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJGaWxlIGZvciBzZXJpYWxpemluZyBkaWFnbm9zdGljcyBpbiBhIGJpbmFyeSBmb3JtYXQiLCAiPGZpbGVuYW1lPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzQsICJzZXJpYWxpemUtZGlhZ25vc3RpY3MiLCBfc2VyaWFsaXplX2RpYWdzLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJTZXJpYWxpemUgY29tcGlsZXIgZGlhZ25vc3RpY3MgdG8gYSBmaWxlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInNoYXJlZC1saWJhc2FuIiwgYW5vbnltb3VzXzMsIEZsYWcsIElOVkFMSUQsIHNoYXJlZF9saWJzYW4sIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJzaGFyZWQtbGliZ2NjIiwgc2hhcmVkX2xpYmdjYywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInNoYXJlZC1saWJzYW4iLCBzaGFyZWRfbGlic2FuLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF80LCAic2hhcmVkIiwgc2hhcmVkLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAic2hvdy1lbmNvZGluZyIsIHNob3dfZW5jb2RpbmcsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMUFzT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlNob3cgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcgaW5mb3JtYXRpb24gaW4gdHJhbnNsaXRlcmF0ZSBtb2RlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgInNob3ctaW5jbHVkZXMiLCBzaG93X2luY2x1ZGVzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiUHJpbnQgY2wuZXhlIHN0eWxlIC9zaG93SW5jbHVkZXMgdG8gc3Rkb3V0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInNob3ctaW5zdCIsIHNob3dfaW5zdCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxQXNPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiU2hvdyBpbnRlcm5hbCBpbnN0cnVjdGlvbiByZXByZXNlbnRhdGlvbiBpbiB0cmFuc2xpdGVyYXRlIG1vZGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAic2hvd0luY2x1ZGVzIiwgX1NMQVNIX3Nob3dJbmNsdWRlcywgRmxhZywgY2xfR3JvdXAsIHNob3dfaW5jbHVkZXMsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIlByaW50IGluZm8gYWJvdXQgaW5jbHVkZWQgZmlsZXMgdG8gc3RkZXJyIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgInNpZ25lZC1jaGFyIiwgX3NpZ25lZF9jaGFyLCBGbGFnLCBJTlZBTElELCBmc2lnbmVkX2NoYXIsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJzaW5nbGVfbW9kdWxlIiwgc2luZ2xlX19tb2R1bGUsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJzb3VyY2UtY2hhcnNldDoiLCBfU0xBU0hfc291cmNlX2NoYXJzZXQsIEpvaW5lZCwgY2xfY29tcGlsZV9Hcm91cCwgZmlucHV0X2NoYXJzZXRfRVEsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJTb3VyY2UgZW5jb2RpbmcsIHN1cHBvcnRzIG9ubHkgVVRGLTgiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF80LCAic3BlY3M9Iiwgc3BlY3NfRVEsIEpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfNCwgInNwZWNzIiwgc3BlY3MsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBVbnN1cHBvcnRlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInNwbGl0LWR3YXJmLWZpbGUiLCBzcGxpdF9kd2FyZl9maWxlLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkZpbGUgbmFtZSB0byB1c2UgZm9yIHNwbGl0IGR3YXJmIGRlYnVnIGluZm8gb3V0cHV0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInNwbGl0LWR3YXJmIiwgc3BsaXRfZHdhcmYsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJTcGxpdCBvdXQgdGhlIGR3YXJmIC5kd28gc2VjdGlvbnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAic3BsaXQtc3RhY2tzIiwgc3BsaXRfc3RhY2tzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiVHJ5IHRvIHVzZSBhIHNwbGl0IHN0YWNrIGlmIHBvc3NpYmxlLiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJzdGFjay1wcm90ZWN0b3ItYnVmZmVyLXNpemUiLCBzdGFja19wcm90ZWN0b3JfYnVmZmVyX3NpemUsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiTG93ZXIgYm91bmQgZm9yIGEgYnVmZmVyIHRvIGJlIGNvbnNpZGVyZWQgZm9yIHN0YWNrIHByb3RlY3Rpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAic3RhY2stcHJvdGVjdG9yIiwgc3RhY2tfcHJvdGVjdG9yLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBzdGFjayBwcm90ZWN0b3JzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInN0YXRpYy1kZWZpbmUiLCBzdGF0aWNfZGVmaW5lLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiU2hvdWxkIF9fU1RBVElDX18gYmUgZGVmaW5lZCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJzdGF0aWMtbGliZ2NjIiwgc3RhdGljX2xpYmdjYywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInN0YXRpYy1saWJnZm9ydHJhbiIsIHN0YXRpY19saWJnZm9ydHJhbiwgRmxhZywgZ2ZvcnRyYW5fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJzdGF0aWMtbGlic2FuIiwgc3RhdGljX2xpYnNhbiwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInN0YXRpYy1saWJzdGRjKysiLCBzdGF0aWNfbGlic3RkY3h4LCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF80LCAic3RhdGljIiwgc3RhdGljLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBOb0FyZ3VtZW50VW51c2VkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAic3RhdHMtZmlsZT0iLCBzdGF0c19maWxlLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJGaWxlbmFtZSB0byB3cml0ZSBzdGF0aXN0aWNzIHRvIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInN0ZC1kZWZhdWx0PSIsIHN0ZF9kZWZhdWx0X0VRLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJzdGQ6IiwgX1NMQVNIX3N0ZCwgSm9pbmVkLCBjbF9jb21waWxlX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiTGFuZ3VhZ2Ugc3RhbmRhcmQgdG8gY29tcGlsZSBmb3IiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF80LCAic3RkPSIsIHN0ZF9FUSwgSm9pbmVkLCBDb21waWxlT25seV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJMYW5ndWFnZSBzdGFuZGFyZCB0byBjb21waWxlIGZvciIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzQsICJzdGRsaWI9Iiwgc3RkbGliX0VRLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwKKyAgICAgICAiQysrIHN0YW5kYXJkIGxpYnJhcnkgdG8gdXNlIiwgbnVsbHB0ciwgImxpYmMrKyxsaWJzdGRjKysscGxhdGZvcm0iKQorT1BUSU9OKHByZWZpeF8zLCAic3RkbGliIiwgX3N0ZGxpYiwgU2VwYXJhdGUsIElOVkFMSUQsIHN0ZGxpYl9FUSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgInN0ZCIsIF9zdGQsIFNlcGFyYXRlLCBJTlZBTElELCBzdGRfRVEsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJzdWJfbGlicmFyeSIsIHN1Yl9fbGlicmFyeSwgSm9pbmVkT3JTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInN1Yl91bWJyZWxsYSIsIHN1Yl9fdW1icmVsbGEsIEpvaW5lZE9yU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJzeXMtaGVhZGVyLWRlcHMiLCBzeXNfaGVhZGVyX2RlcHMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJJbmNsdWRlIHN5c3RlbSBoZWFkZXJzIGluIGRlcGVuZGVuY3kgb3V0cHV0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgInN5c3Jvb3Q9IiwgX3N5c3Jvb3RfRVEsIEpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgInN5c3Jvb3QiLCBfc3lzcm9vdCwgU2VwYXJhdGUsIElOVkFMSUQsIF9zeXNyb290X0VRLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAic3lzdGVtLWhlYWRlci1wcmVmaXg9Iiwgc3lzdGVtX2hlYWRlcl9wcmVmaXgsIEpvaW5lZCwgY2xhbmdfaV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJUcmVhdCBhbGwgI2luY2x1ZGUgcGF0aHMgc3RhcnRpbmcgd2l0aCA8cHJlZml4PiBhcyBpbmNsdWRpbmcgYSBzeXN0ZW0gaGVhZGVyLiIsICI8cHJlZml4PiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJzeXN0ZW0taGVhZGVyLXByZWZpeCIsIGFub255bW91c18yMiwgU2VwYXJhdGUsIElOVkFMSUQsIHN5c3RlbV9oZWFkZXJfcHJlZml4LCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiUyIsIFMsIEZsYWcsIEFjdGlvbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uIHwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJPbmx5IHJ1biBwcmVwcm9jZXNzIGFuZCBjb21waWxhdGlvbiBzdGVwcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJzIiwgcywgRmxhZywgTGlua19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInRhcmdldC1hYmkiLCB0YXJnZXRfYWJpLCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ0MxQXNPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiVGFyZ2V0IGEgcGFydGljdWxhciBBQkkgdHlwZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ0YXJnZXQtY3B1IiwgdGFyZ2V0X2NwdSwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENDMUFzT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlRhcmdldCBhIHNwZWNpZmljIGNwdSB0eXBlIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInRhcmdldC1mZWF0dXJlIiwgdGFyZ2V0X2ZlYXR1cmUsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDQzFBc09wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJUYXJnZXQgc3BlY2lmaWMgYXR0cmlidXRlcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJ0YXJnZXQtaGVscCIsIF90YXJnZXRfaGVscCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInRhcmdldC1saW5rZXItdmVyc2lvbiIsIHRhcmdldF9saW5rZXJfdmVyc2lvbiwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJUYXJnZXQgbGlua2VyIHZlcnNpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAidGFyZ2V0PSIsIHRhcmdldCwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBDb3JlT3B0aW9uLCAwLAorICAgICAgICJHZW5lcmF0ZSBjb2RlIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInRhcmdldCIsIHRhcmdldF9sZWdhY3lfc3BlbGxpbmcsIFNlcGFyYXRlLCBJTlZBTElELCB0YXJnZXQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJUYnNzIiwgVGJzcywgSm9pbmVkT3JTZXBhcmF0ZSwgVF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiU2V0IHN0YXJ0aW5nIGFkZHJlc3Mgb2YgQlNTIHRvIDxhZGRyPiIsICI8YWRkcj4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiVEMiLCBfU0xBU0hfVEMsIEZsYWcsIGNsX2NvbXBpbGVfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJUcmVhdCBhbGwgc291cmNlIGZpbGVzIGFzIEMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiVGMiLCBfU0xBU0hfVGMsIEpvaW5lZE9yU2VwYXJhdGUsIGNsX2NvbXBpbGVfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJTcGVjaWZ5IGEgQyBzb3VyY2UgZmlsZSIsICI8ZmlsZW5hbWU+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIlRkYXRhIiwgVGRhdGEsIEpvaW5lZE9yU2VwYXJhdGUsIFRfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIlNldCBzdGFydGluZyBhZGRyZXNzIG9mIERBVEEgdG8gPGFkZHI+IiwgIjxhZGRyPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ0ZW1wbGlnaHQtZHVtcCIsIHRlbXBsaWdodF9kdW1wLCBGbGFnLCBBY3Rpb25fR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEdW1wIHRlbXBsaWdodCBpbmZvcm1hdGlvbiB0byBzdGRvdXQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAidGVzdC1jb3ZlcmFnZSIsIHRlc3RfY292ZXJhZ2UsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJEbyBub3QgZ2VuZXJhdGUgY292ZXJhZ2UgZmlsZXMgb3IgcmVtb3ZlIGNvdmVyYWdlIGNoYW5nZXMgZnJvbSBJUiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ0aW1lIiwgdGltZSwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiVGltZSBpbmRpdmlkdWFsIGNvbW1hbmRzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInRva2VuLWNhY2hlIiwgdG9rZW5fY2FjaGUsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiVXNlIHNwZWNpZmllZCB0b2tlbiBjYWNoZSBmaWxlIiwgIjxwYXRoPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJUUCIsIF9TTEFTSF9UUCwgRmxhZywgY2xfY29tcGlsZV9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24sIDAsCisgICAgICAgIlRyZWF0IGFsbCBzb3VyY2UgZmlsZXMgYXMgQysrIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlRwIiwgX1NMQVNIX1RwLCBKb2luZWRPclNlcGFyYXRlLCBjbF9jb21waWxlX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiU3BlY2lmeSBhIEMrKyBzb3VyY2UgZmlsZSIsICI8ZmlsZW5hbWU+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgInRyYWNlLWluY2x1ZGVzIiwgX3RyYWNlX2luY2x1ZGVzLCBGbGFnLCBJTlZBTElELCBILCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF80LCAidHJhZGl0aW9uYWwtY3BwIiwgdHJhZGl0aW9uYWxfY3BwLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSBzb21lIHRyYWRpdGlvbmFsIENQUCBlbXVsYXRpb24iLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF80LCAidHJhZGl0aW9uYWwiLCB0cmFkaXRpb25hbCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfNCwgInRyaWdyYXBocyIsIHRyaWdyYXBocywgRmxhZywgSU5WQUxJRCwgZnRyaWdyYXBocywgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiUHJvY2VzcyB0cmlncmFwaCBzZXF1ZW5jZXMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAidHJpbS1lZ3JhcGgiLCB0cmltX2VncmFwaCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIk9ubHkgc2hvdyBlcnJvci1yZWxhdGVkIHBhdGhzIGluIHRoZSBhbmFseXNpcyBncmFwaCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ0cmlwbGU9IiwgdHJpcGxlX0VRLCBKb2luZWQsIElOVkFMSUQsIHRyaXBsZSwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ0cmlwbGUiLCB0cmlwbGUsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDQzFBc09wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJTcGVjaWZ5IHRhcmdldCB0cmlwbGUgKGUuZy4gaTY4Ni1hcHBsZS1kYXJ3aW45KSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJUdGV4dCIsIFR0ZXh0LCBKb2luZWRPclNlcGFyYXRlLCBUX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJTZXQgc3RhcnRpbmcgYWRkcmVzcyBvZiBURVhUIHRvIDxhZGRyPiIsICI8YWRkcj4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAidHdvbGV2ZWxfbmFtZXNwYWNlX2hpbnRzIiwgdHdvbGV2ZWxfX25hbWVzcGFjZV9faGludHMsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ0d29sZXZlbF9uYW1lc3BhY2UiLCB0d29sZXZlbF9fbmFtZXNwYWNlLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiVCIsIFQsIEpvaW5lZE9yU2VwYXJhdGUsIFRfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIlNwZWNpZnkgPHNjcmlwdD4gYXMgbGlua2VyIHNjcmlwdCIsICI8c2NyaXB0PiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ0IiwgdCwgRmxhZywgTGlua19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInVtYnJlbGxhIiwgdW1icmVsbGEsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAidW5kZWZpbmUtbWFjcm89IiwgX3VuZGVmaW5lX21hY3JvX0VRLCBKb2luZWQsIElOVkFMSUQsIFUsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJ1bmRlZmluZS1tYWNybyIsIF91bmRlZmluZV9tYWNybywgU2VwYXJhdGUsIElOVkFMSUQsIFUsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ1bmRlZmluZWQiLCB1bmRlZmluZWQsIEpvaW5lZE9yU2VwYXJhdGUsIHVfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ1bmRlZiIsIHVuZGVmLCBGbGFnLCB1X0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgInVuZGVmIGFsbCBzeXN0ZW0gZGVmaW5lcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ1bmV4cG9ydGVkX3N5bWJvbHNfbGlzdCIsIHVuZXhwb3J0ZWRfX3N5bWJvbHNfX2xpc3QsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAidW5vcHRpbWl6ZWQtY2ZnIiwgYW5hbHlzaXNfVW5vcHRpbWl6ZWRDRkcsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJHZW5lcmF0ZSB1bm9wdGltaXplZCBDRkdzIGZvciBhbGwgYW5hbHlzZXMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAidW5zaWduZWQtY2hhciIsIF91bnNpZ25lZF9jaGFyLCBGbGFnLCBJTlZBTElELCBmdW5zaWduZWRfY2hhciwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgInVzZXItZGVwZW5kZW5jaWVzIiwgX3VzZXJfZGVwZW5kZW5jaWVzLCBGbGFnLCBJTlZBTElELCBNTSwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgInV0Zi04IiwgX1NMQVNIX3V0ZjgsIEZsYWcsIGNsX2lnbm9yZWRfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJTZXQgc291cmNlIGFuZCBydW50aW1lIGVuY29kaW5nIHRvIFVURi04IChkZWZhdWx0KSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJVIiwgVSwgSm9pbmVkT3JTZXBhcmF0ZSwgUHJlcHJvY2Vzc29yX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlVuZGVmaW5lIG1hY3JvIDxtYWNybz4iLCAiPG1hY3JvPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJVIiwgX1NMQVNIX1UsIEpvaW5lZE9yU2VwYXJhdGUsIGNsX0dyb3VwLCBVLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJVbmRlZmluZSBtYWNybyIsICI8bWFjcm8+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInUiLCB1LCBKb2luZWRPclNlcGFyYXRlLCB1X0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAidSIsIF9TTEFTSF91LCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgInZhbGlkYXRlLWNoYXJzZXQtIiwgX1NMQVNIX3ZhbGlkYXRlX2NoYXJzZXRfLCBGbGFnLCBjbF9Hcm91cCwgV19Kb2luZWQsICJuby1pbnZhbGlkLXNvdXJjZS1lbmNvZGluZ1wwIiwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgInZhbGlkYXRlLWNoYXJzZXQiLCBfU0xBU0hfdmFsaWRhdGVfY2hhcnNldCwgRmxhZywgY2xfR3JvdXAsIFdfSm9pbmVkLCAiaW52YWxpZC1zb3VyY2UtZW5jb2RpbmdcMCIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJ2ZCIsIF9TTEFTSF92ZCwgSm9pbmVkLCBjbF9Hcm91cCwgdnRvcmRpc3BfbW9kZV9FUSwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiQ29udHJvbCB2dG9yZGlzcCBwbGFjZW1lbnQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAidmVjdG9yaXplLWxvb3BzIiwgdmVjdG9yaXplX2xvb3BzLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiUnVuIHRoZSBMb29wIHZlY3Rvcml6YXRpb24gcGFzc2VzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInZlY3Rvcml6ZS1zbHAiLCB2ZWN0b3JpemVfc2xwLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBOb0RyaXZlck9wdGlvbiwgMCwKKyAgICAgICAiUnVuIHRoZSBTTFAgdmVjdG9yaXphdGlvbiBwYXNzZXMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAidmVyYm9zZSIsIF92ZXJib3NlLCBGbGFnLCBJTlZBTElELCB2LCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAidmVyaWZ5LWRlYnVnLWluZm8iLCB2ZXJpZnlfZGVidWdfaW5mbywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJWZXJpZnkgdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBkZWJ1ZyBvdXRwdXQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAidmVyaWZ5LWlnbm9yZS11bmV4cGVjdGVkPSIsIHZlcmlmeV9pZ25vcmVfdW5leHBlY3RlZF9FUSwgQ29tbWFKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJJZ25vcmUgdW5leHBlY3RlZCBkaWFnbm9zdGljIG1lc3NhZ2VzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInZlcmlmeS1pZ25vcmUtdW5leHBlY3RlZCIsIHZlcmlmeV9pZ25vcmVfdW5leHBlY3RlZCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIklnbm9yZSB1bmV4cGVjdGVkIGRpYWdub3N0aWMgbWVzc2FnZXMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAidmVyaWZ5LXBjaCIsIHZlcmlmeV9wY2gsIEZsYWcsIEFjdGlvbl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJMb2FkIGFuZCB2ZXJpZnkgdGhhdCBhIHByZS1jb21waWxlZCBoZWFkZXIgZmlsZSBpcyBub3Qgc3RhbGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAidmVyaWZ5PSIsIHZlcmlmeV9FUSwgQ29tbWFKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJWZXJpZnkgZGlhZ25vc3RpYyBvdXRwdXQgdXNpbmcgY29tbWVudCBkaXJlY3RpdmVzIHRoYXQgc3RhcnQgd2l0aCBwcmVmaXhlcyBpbiB0aGUgY29tbWEtc2VwYXJhdGVkIHNlcXVlbmNlIDxwcmVmaXhlcz4iLCAiPHByZWZpeGVzPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ2ZXJpZnkiLCB2ZXJpZnksIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJFcXVpdmFsZW50IHRvIC12ZXJpZnk9ZXhwZWN0ZWQiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8zLCAidmVyc2lvbiIsIF92ZXJzaW9uLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDb3JlT3B0aW9uIHwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInZlcnNpb24iLCB2ZXJzaW9uLCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBDQzFBc09wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJQcmludCB0aGUgY29tcGlsZXIgdmVyc2lvbiIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzQsICJ2aWEtZmlsZS1hc20iLCB2aWFfZmlsZV9hc20sIEZsYWcsIGludGVybmFsX2RlYnVnX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBIZWxwSGlkZGVuIHwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiV3JpdGUgYXNzZW1ibHkgdG8gZmlsZSBmb3IgaW5wdXQgdG8gYXNzZW1ibGUgam9icyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJ2bWIiLCBfU0xBU0hfdm1iLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiVXNlIGEgYmVzdC1jYXNlIHJlcHJlc2VudGF0aW9uIG1ldGhvZCBmb3IgbWVtYmVyIHBvaW50ZXJzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgInZtZyIsIF9TTEFTSF92bWcsIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJVc2UgYSBtb3N0LWdlbmVyYWwgcmVwcmVzZW50YXRpb24gZm9yIG1lbWJlciBwb2ludGVycyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJ2bW0iLCBfU0xBU0hfdm1tLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiU2V0IHRoZSBkZWZhdWx0IG1vc3QtZ2VuZXJhbCByZXByZXNlbnRhdGlvbiB0byBtdWx0aXBsZSBpbmhlcml0YW5jZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJ2bXMiLCBfU0xBU0hfdm1zLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiU2V0IHRoZSBkZWZhdWx0IG1vc3QtZ2VuZXJhbCByZXByZXNlbnRhdGlvbiB0byBzaW5nbGUgaW5oZXJpdGFuY2UiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAidm12IiwgX1NMQVNIX3ZtdiwgRmxhZywgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIlNldCB0aGUgZGVmYXVsdCBtb3N0LWdlbmVyYWwgcmVwcmVzZW50YXRpb24gdG8gdmlydHVhbCBpbmhlcml0YW5jZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJ2b2xhdGlsZTppc28iLCBfU0xBU0hfdm9sYXRpbGVfaXNvLCBGbGFnLCBfU0xBU0hfdm9sYXRpbGVfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJWb2xhdGlsZSBsb2FkcyBhbmQgc3RvcmVzIGhhdmUgc3RhbmRhcmQgc2VtYW50aWNzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgInZvbGF0aWxlOm1zIiwgX1NMQVNIX3ZvbGF0aWxlX21zLCBGbGFnLCBfU0xBU0hfdm9sYXRpbGVfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJWb2xhdGlsZSBsb2FkcyBhbmQgc3RvcmVzIGhhdmUgYWNxdWlyZSBhbmQgcmVsZWFzZSBzZW1hbnRpY3MiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAidnRvcmRpc3AtbW9kZT0iLCB2dG9yZGlzcF9tb2RlX0VRLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IE5vRHJpdmVyT3B0aW9uLCAwLAorICAgICAgICJDb250cm9sIHZ0b3JkaXNwIHBsYWNlbWVudCBvbiB3aW4zMiB0YXJnZXRzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIlYiLCBWLCBKb2luZWRPclNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24gfCBVbnN1cHBvcnRlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlYiLCBfU0xBU0hfViwgRmxhZywgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ2IiwgdiwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgQ29yZU9wdGlvbiwgMCwKKyAgICAgICAiU2hvdyBjb21tYW5kcyB0byBydW4gYW5kIHVzZSB2ZXJib3NlIG91dHB1dCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJXMCIsIF9TTEFTSF9XMCwgRmxhZywgY2xfR3JvdXAsIHcsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgYWxsIHdhcm5pbmdzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlcxIiwgX1NMQVNIX1cxLCBGbGFnLCBjbF9Hcm91cCwgV2FsbCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIC1XYWxsIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlcyIiwgX1NMQVNIX1cyLCBGbGFnLCBjbF9Hcm91cCwgV2FsbCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIC1XYWxsIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlczIiwgX1NMQVNIX1czLCBGbGFnLCBjbF9Hcm91cCwgV2FsbCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIC1XYWxsIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlc0IiwgX1NMQVNIX1c0LCBGbGFnLCBjbF9Hcm91cCwgV0NMNCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIC1XYWxsIGFuZCAtV2V4dHJhIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIldhLCIsIFdhX0NPTU1BLCBDb21tYUpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiUGFzcyB0aGUgY29tbWEgc2VwYXJhdGVkIGFyZ3VtZW50cyBpbiA8YXJnPiB0byB0aGUgYXNzZW1ibGVyIiwgIjxhcmc+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIldhbGwiLCBXYWxsLCBGbGFnLCBXX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBIZWxwSGlkZGVuLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiV2FsbCIsIF9TTEFTSF9XYWxsLCBGbGFnLCBjbF9Hcm91cCwgV19Kb2luZWQsICJldmVyeXRoaW5nXDAiLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgLVdldmVyeXRoaW5nIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgIndhcm4tPSIsIF93YXJuX19FUSwgSm9pbmVkLCBJTlZBTElELCBXX0pvaW5lZCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgIndhcm4tIiwgX3dhcm5fLCBKb2luZWQsIElOVkFMSUQsIFdfSm9pbmVkLCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiV0NMNCIsIFdDTDQsIEZsYWcsIFdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IEhlbHBIaWRkZW4sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJ3ZDQwMDUiLCBfU0xBU0hfd2Q0MDA1LCBGbGFnLCBjbF9Hcm91cCwgV19Kb2luZWQsICJuby1tYWNyby1yZWRlZmluZWRcMCIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJ3ZDQwMTgiLCBfU0xBU0hfd2Q0MDE4LCBGbGFnLCBjbF9Hcm91cCwgV19Kb2luZWQsICJuby1zaWduLWNvbXBhcmVcMCIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJ3ZDQxMDAiLCBfU0xBU0hfd2Q0MTAwLCBGbGFnLCBjbF9Hcm91cCwgV19Kb2luZWQsICJuby11bnVzZWQtcGFyYW1ldGVyXDAiLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAid2Q0OTEwIiwgX1NMQVNIX3dkNDkxMCwgRmxhZywgY2xfR3JvdXAsIFdfSm9pbmVkLCAibm8tZGxsZXhwb3J0LWV4cGxpY2l0LWluc3RhbnRpYXRpb24tZGVjbFwwIiwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIndkNDk5NiIsIF9TTEFTSF93ZDQ5OTYsIEZsYWcsIGNsX0dyb3VwLCBXX0pvaW5lZCwgIm5vLWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zXDAiLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiV2RlcHJlY2F0ZWQiLCBXZGVwcmVjYXRlZCwgRmxhZywgV19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgd2FybmluZ3MgZm9yIGRlcHJlY2F0ZWQgY29uc3RydWN0cyBhbmQgZGVmaW5lIF9fREVQUkVDQVRFRCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ3ZWFrLWwiLCB3ZWFrX2wsIEpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgTGlua2VySW5wdXQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ3ZWFrX2ZyYW1ld29yayIsIHdlYWtfX2ZyYW1ld29yaywgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIExpbmtlcklucHV0LCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAid2Vha19saWJyYXJ5Iiwgd2Vha19fbGlicmFyeSwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIExpbmtlcklucHV0LCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAid2Vha19yZWZlcmVuY2VfbWlzbWF0Y2hlcyIsIHdlYWtfX3JlZmVyZW5jZV9fbWlzbWF0Y2hlcywgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJXZnJhbWUtbGFyZ2VyLXRoYW49IiwgV2ZyYW1lX2xhcmdlcl90aGFuX0VRLCBKb2luZWQsIGZfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIndoYXRzbG9hZGVkIiwgd2hhdHNsb2FkZWQsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ3aHlsb2FkIiwgd2h5bG9hZCwgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIldsLCIsIFdsX0NPTU1BLCBDb21tYUpvaW5lZCwgTGlua19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgTGlua2VySW5wdXQgfCBSZW5kZXJBc0lucHV0LCAwLAorICAgICAgICJQYXNzIHRoZSBjb21tYSBzZXBhcmF0ZWQgYXJndW1lbnRzIGluIDxhcmc+IHRvIHRoZSBsaW5rZXIiLCAiPGFyZz4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiV2xhcmdlLWJ5LXZhbHVlLWNvcHk9IiwgV2xhcmdlX2J5X3ZhbHVlX2NvcHlfRVEsIEpvaW5lZCwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiV2xhcmdlLWJ5LXZhbHVlLWNvcHkiLCBXbGFyZ2VfYnlfdmFsdWVfY29weV9kZWYsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIEhlbHBIaWRkZW4sIDAsCisgICAgICAgIldhcm4gaWYgYSBmdW5jdGlvbiBkZWZpbml0aW9uIHJldHVybnMgb3IgYWNjZXB0cyBhbiBvYmplY3QgbGFyZ2VyIGluIGJ5dGVzIHRoYW4gYSBnaXZlbiB2YWx1ZSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJXbGFyZ2VyLXRoYW4tIiwgV2xhcmdlcl90aGFuXywgSm9pbmVkLCBJTlZBTElELCBXbGFyZ2VyX3RoYW5fRVEsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJXbGFyZ2VyLXRoYW49IiwgV2xhcmdlcl90aGFuX0VRLCBKb2luZWQsIGNsYW5nX2lnbm9yZWRfZl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgSWdub3JlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIldMIiwgX1NMQVNIX1dMLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIlduby1kZXByZWNhdGVkIiwgV25vX2RlcHJlY2F0ZWQsIEZsYWcsIFdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIlduby1ub25wb3J0YWJsZS1jZnN0cmluZ3MiLCBXbm9fbm9ucG9ydGFibGVfY2ZzdHJpbmdzLCBKb2luZWQsIFdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIlduby1yZXdyaXRlLW1hY3JvcyIsIFdub19yZXdyaXRlX21hY3JvcywgRmxhZywgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgTm9Ecml2ZXJPcHRpb24sIDAsCisgICAgICAgIlNpbGVuY2UgT2JqQyByZXdyaXRpbmcgd2FybmluZ3MiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiV25vLXdyaXRlLXN0cmluZ3MiLCBXbm9fd3JpdGVfc3RyaW5ncywgRmxhZywgV19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0MxT3B0aW9uIHwgSGVscEhpZGRlbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIldub25wb3J0YWJsZS1jZnN0cmluZ3MiLCBXbm9ucG9ydGFibGVfY2ZzdHJpbmdzLCBKb2luZWQsIFdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIndvcmtpbmctZGlyZWN0b3J5PSIsIHdvcmtpbmdfZGlyZWN0b3J5X0VRLCBKb2luZWQsIElOVkFMSUQsIHdvcmtpbmdfZGlyZWN0b3J5LCBudWxscHRyLCBDQzFPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ3b3JraW5nLWRpcmVjdG9yeSIsIHdvcmtpbmdfZGlyZWN0b3J5LCBKb2luZWRPclNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlJlc29sdmUgZmlsZSBwYXRocyByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJXcCwiLCBXcF9DT01NQSwgQ29tbWFKb2luZWQsIFByZXByb2Nlc3Nvcl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiUGFzcyB0aGUgY29tbWEgc2VwYXJhdGVkIGFyZ3VtZW50cyBpbiA8YXJnPiB0byB0aGUgcHJlcHJvY2Vzc29yIiwgIjxhcmc+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIldwNjQiLCBfU0xBU0hfV3A2NCwgRmxhZywgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICJ3cml0ZS1kZXBlbmRlbmNpZXMiLCBfd3JpdGVfZGVwZW5kZW5jaWVzLCBGbGFnLCBJTlZBTElELCBNRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgIndyaXRlLXVzZXItZGVwZW5kZW5jaWVzIiwgX3dyaXRlX3VzZXJfZGVwZW5kZW5jaWVzLCBGbGFnLCBJTlZBTElELCBNTUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJXd3JpdGUtc3RyaW5ncyIsIFd3cml0ZV9zdHJpbmdzLCBGbGFnLCBXX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24gfCBIZWxwSGlkZGVuLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiV1gtIiwgX1NMQVNIX1dYXywgRmxhZywgY2xfR3JvdXAsIFdfSm9pbmVkLCAibm8tZXJyb3JcMCIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkRvIG5vdCB0cmVhdCB3YXJuaW5ncyBhcyBlcnJvcnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiV1giLCBfU0xBU0hfV1gsIEZsYWcsIGNsX0dyb3VwLCBXX0pvaW5lZCwgImVycm9yXDAiLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJUcmVhdCB3YXJuaW5ncyBhcyBlcnJvcnMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiVyIsIFdfSm9pbmVkLCBKb2luZWQsIFdfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENDMU9wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIkVuYWJsZSB0aGUgc3BlY2lmaWVkIHdhcm5pbmciLCAiPHdhcm5pbmc+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgInciLCB3LCBGbGFnLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBDQzFPcHRpb24sIDAsCisgICAgICAgIlN1cHByZXNzIGFsbCB3YXJuaW5ncyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJ3IiwgX1NMQVNIX3dfZmxhZywgRmxhZywgY2xfR3JvdXAsIHcsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkRpc2FibGUgYWxsIHdhcm5pbmdzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgInciLCBfU0xBU0hfdywgSm9pbmVkLCBjbF9pZ25vcmVkX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IEhlbHBIaWRkZW4sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJYYW5hbHl6ZXIiLCBYYW5hbHl6ZXIsIFNlcGFyYXRlLCBTdGF0aWNBbmFseXplcl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiUGFzcyA8YXJnPiB0byB0aGUgc3RhdGljIGFuYWx5emVyIiwgIjxhcmc+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIlhhcmNoXyIsIFhhcmNoX18sIEpvaW5lZEFuZFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJYYXNzZW1ibGVyIiwgWGFzc2VtYmxlciwgU2VwYXJhdGUsIENvbXBpbGVPbmx5X0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJQYXNzIDxhcmc+IHRvIHRoZSBhc3NlbWJsZXIiLCAiPGFyZz4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiWGNsYW5nIiwgWGNsYW5nLCBTZXBhcmF0ZSwgQ29tcGlsZU9ubHlfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENvcmVPcHRpb24sIDAsCisgICAgICAgIlBhc3MgPGFyZz4gdG8gdGhlIGNsYW5nIGNvbXBpbGVyIiwgIjxhcmc+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIlhjdWRhLWZhdGJpbmFyeSIsIFhjdWRhX2ZhdGJpbmFyeSwgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIlBhc3MgPGFyZz4gdG8gZmF0YmluYXJ5IGludm9jYXRpb24iLCAiPGFyZz4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiWGN1ZGEtcHR4YXMiLCBYY3VkYV9wdHhhcywgU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsCisgICAgICAgIlBhc3MgPGFyZz4gdG8gdGhlIHB0eGFzIGFzc2VtYmxlciIsICI8YXJnPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJYbGlua2VyIiwgWGxpbmtlciwgU2VwYXJhdGUsIExpbmtfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIExpbmtlcklucHV0IHwgUmVuZGVyQXNJbnB1dCwgMCwKKyAgICAgICAiUGFzcyA8YXJnPiB0byB0aGUgbGlua2VyIiwgIjxhcmc+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIlhvcGVubXAtdGFyZ2V0PSIsIFhvcGVubXBfdGFyZ2V0X0VRLCBKb2luZWRBbmRTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwKKyAgICAgICAiUGFzcyA8YXJnPiB0byB0aGUgdGFyZ2V0IG9mZmxvYWRpbmcgdG9vbGNoYWluIGlkZW50aWZpZWQgYnkgPHRyaXBsZT4uIiwgIjx0cmlwbGU+IDxhcmc+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIlhvcGVubXAtdGFyZ2V0IiwgWG9wZW5tcF90YXJnZXQsIFNlcGFyYXRlLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJQYXNzIDxhcmc+IHRvIHRoZSB0YXJnZXQgb2ZmbG9hZGluZyB0b29sY2hhaW4uIiwgIjxhcmc+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIlhwcmVwcm9jZXNzb3IiLCBYcHJlcHJvY2Vzc29yLCBTZXBhcmF0ZSwgUHJlcHJvY2Vzc29yX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLAorICAgICAgICJQYXNzIDxhcmc+IHRvIHRoZSBwcmVwcm9jZXNzb3IiLCAiPGFyZz4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiWCIsIFhfRmxhZywgRmxhZywgTGlua19Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgMCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIlgiLCBYX0pvaW5lZCwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCBIZWxwSGlkZGVuLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiWCIsIF9TTEFTSF9YLCBGbGFnLCBjbF9Hcm91cCwgbm9zdGRsaWJpbmMsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsCisgICAgICAgIkRvbid0IGFkZCAlSU5DTFVERSUgdG8gdGhlIGluY2x1ZGUgc2VhcmNoIHBhdGgiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAieCIsIHgsIEpvaW5lZE9yU2VwYXJhdGUsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENDMU9wdGlvbiwgMCwKKyAgICAgICAiVHJlYXQgc3Vic2VxdWVudCBpbnB1dCBmaWxlcyBhcyBoYXZpbmcgdHlwZSA8bGFuZ3VhZ2U+IiwgIjxsYW5ndWFnZT4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiWS0iLCBfU0xBU0hfWV8sIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIHByZWNvbXBpbGVkIGhlYWRlcnMsIG92ZXJyaWRlcyAvWWMgYW5kIC9ZdSIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJZYyIsIF9TTEFTSF9ZYywgSm9pbmVkLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiR2VuZXJhdGUgYSBwY2ggZmlsZSBmb3IgYWxsIGNvZGUgdXAgdG8gYW5kIGluY2x1ZGluZyA8ZmlsZW5hbWU+IiwgIjxmaWxlbmFtZT4iLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiWWQiLCBfU0xBU0hfWWQsIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiWWwiLCBfU0xBU0hfWWwsIEpvaW5lZCwgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJZdSIsIF9TTEFTSF9ZdSwgSm9pbmVkLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiTG9hZCBhIHBjaCBmaWxlIGFuZCB1c2UgaXQgaW5zdGVhZCBvZiBhbGwgY29kZSB1cCB0byBhbmQgaW5jbHVkaW5nIDxmaWxlbmFtZT4iLCAiPGZpbGVuYW1lPiIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ5IiwgeSwgSm9pbmVkLCBJTlZBTElELCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiWi1yZXNlcnZlZC1saWItY2NrZXh0IiwgWl9yZXNlcnZlZF9saWJfY2NrZXh0LCBGbGFnLCByZXNlcnZlZF9saWJfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIExpbmtlcklucHV0IHwgTm9Bcmd1bWVudFVudXNlZCB8IFVuc3VwcG9ydGVkIHwgVW5zdXBwb3J0ZWQsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJaLXJlc2VydmVkLWxpYi1zdGRjKysiLCBaX3Jlc2VydmVkX2xpYl9zdGRjeHgsIEZsYWcsIHJlc2VydmVkX2xpYl9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgTGlua2VySW5wdXQgfCBOb0FyZ3VtZW50VW51c2VkIHwgVW5zdXBwb3J0ZWQgfCBVbnN1cHBvcnRlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIlotWGxpbmtlci1uby1kZW1hbmdsZSIsIFpfWGxpbmtlcl9fbm9fZGVtYW5nbGUsIEZsYWcsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIFVuc3VwcG9ydGVkIHwgTm9Bcmd1bWVudFVudXNlZCwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlo3IiwgX1NMQVNIX1o3LCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIENvZGVWaWV3IGRlYnVnIGluZm9ybWF0aW9uIGluIG9iamVjdCBmaWxlcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJaYSIsIF9TTEFTSF9aYSwgRmxhZywgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJaYzphdXRvIiwgX1NMQVNIX1pjX2F1dG8sIEZsYWcsIGNsX2lnbm9yZWRfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiWmM6Zm9yU2NvcGUiLCBfU0xBU0hfWmNfZm9yU2NvcGUsIEZsYWcsIGNsX2lnbm9yZWRfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiWmM6aW5saW5lIiwgX1NMQVNIX1pjX2lubGluZSwgRmxhZywgY2xfaWdub3JlZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJaYzpydmFsdWVDYXN0IiwgX1NMQVNIX1pjX3J2YWx1ZUNhc3QsIEZsYWcsIGNsX2lnbm9yZWRfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiWmM6c2l6ZWREZWFsbG9jLSIsIF9TTEFTSF9aY19zaXplZERlYWxsb2NfLCBGbGFnLCBjbF9Hcm91cCwgZm5vX3NpemVkX2RlYWxsb2NhdGlvbiwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSBDKysxNCBzaXplZCBnbG9iYWwgZGVhbGxvY2F0aW9uIGZ1bmN0aW9ucyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJaYzpzaXplZERlYWxsb2MiLCBfU0xBU0hfWmNfc2l6ZWREZWFsbG9jLCBGbGFnLCBjbF9Hcm91cCwgZnNpemVkX2RlYWxsb2NhdGlvbiwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIEMrKzE0IHNpemVkIGdsb2JhbCBkZWFsbG9jYXRpb24gZnVuY3Rpb25zIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlpjOnN0cmljdFN0cmluZ3MiLCBfU0xBU0hfWmNfc3RyaWN0U3RyaW5ncywgRmxhZywgY2xfR3JvdXAsIFdfSm9pbmVkLCAiZXJyb3I9YysrMTEtY29tcGF0LWRlcHJlY2F0ZWQtd3JpdGFibGUtc3RyaW5nc1wwIiwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiVHJlYXQgc3RyaW5nIGxpdGVyYWxzIGFzIGNvbnN0IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlpjOnRlcm5hcnkiLCBfU0xBU0hfWmNfdGVybmFyeSwgRmxhZywgY2xfaWdub3JlZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJaYzp0aHJlYWRTYWZlSW5pdC0iLCBfU0xBU0hfWmNfdGhyZWFkU2FmZUluaXRfLCBGbGFnLCBjbF9Hcm91cCwgZm5vX3RocmVhZHNhZmVfc3RhdGljcywgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSB0aHJlYWQtc2FmZSBpbml0aWFsaXphdGlvbiBvZiBzdGF0aWMgdmFyaWFibGVzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlpjOnRocmVhZFNhZmVJbml0IiwgX1NMQVNIX1pjX3RocmVhZFNhZmVJbml0LCBGbGFnLCBjbF9Hcm91cCwgZnRocmVhZHNhZmVfc3RhdGljcywgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiRW5hYmxlIHRocmVhZC1zYWZlIGluaXRpYWxpemF0aW9uIG9mIHN0YXRpYyB2YXJpYWJsZXMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiWmM6dHJpZ3JhcGhzLSIsIF9TTEFTSF9aY190cmlncmFwaHNfb2ZmLCBGbGFnLCBjbF9Hcm91cCwgZm5vX3RyaWdyYXBocywgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiRGlzYWJsZSB0cmlncmFwaHMgKGRlZmF1bHQpIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlpjOnRyaWdyYXBocyIsIF9TTEFTSF9aY190cmlncmFwaHMsIEZsYWcsIGNsX0dyb3VwLCBmdHJpZ3JhcGhzLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgdHJpZ3JhcGhzIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlpjOnR3b1BoYXNlLSIsIF9TTEFTSF9aY190d29QaGFzZV8sIEZsYWcsIGNsX0dyb3VwLCBmZGVsYXllZF90ZW1wbGF0ZV9wYXJzaW5nLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJEaXNhYmxlIHR3by1waGFzZSBuYW1lIGxvb2t1cCBpbiB0ZW1wbGF0ZXMiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiWmM6dHdvUGhhc2UiLCBfU0xBU0hfWmNfdHdvUGhhc2UsIEZsYWcsIGNsX0dyb3VwLCBmbm9fZGVsYXllZF90ZW1wbGF0ZV9wYXJzaW5nLCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJFbmFibGUgdHdvLXBoYXNlIG5hbWUgbG9va3VwIGluIHRlbXBsYXRlcyIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJaYzp3Y2hhcl90IiwgX1NMQVNIX1pjX3djaGFyX3QsIEZsYWcsIGNsX2lnbm9yZWRfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiWmM6IiwgX1NMQVNIX1pjLCBKb2luZWQsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiWmQiLCBfU0xBU0hfWmQsIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJFbWl0IGRlYnVnIGxpbmUgbnVtYmVyIHRhYmxlcyBvbmx5IiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlplIiwgX1NMQVNIX1plLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlpnIiwgX1NMQVNIX1pnLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlpJIiwgX1NMQVNIX1pJLCBGbGFnLCBjbF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMiwgIlppIiwgX1NMQVNIX1ppLCBGbGFnLCBjbF9Hcm91cCwgX1NMQVNIX1o3LCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJBbGlhcyBmb3IgL1o3LiBEb2VzIG5vdCBwcm9kdWNlIFBEQnMuIiwgbnVsbHB0ciwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMSwgIlpsaW5rZXItaW5wdXQiLCBabGlua2VyX2lucHV0LCBTZXBhcmF0ZSwgSU5WQUxJRCwgSU5WQUxJRCwgbnVsbHB0ciwgVW5zdXBwb3J0ZWQgfCBOb0FyZ3VtZW50VW51c2VkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiWmwiLCBfU0xBU0hfWmwsIEZsYWcsIGNsX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCBDTE9wdGlvbiB8IERyaXZlck9wdGlvbiB8IENMT3B0aW9uLCAwLAorICAgICAgICJEb24ndCBtZW50aW9uIGFueSBkZWZhdWx0IGxpYnJhcmllcyBpbiB0aGUgb2JqZWN0IGZpbGUiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiWm0iLCBfU0xBU0hfWm0sIEpvaW5lZCwgY2xfaWdub3JlZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBIZWxwSGlkZGVuLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiWm8tIiwgX1NMQVNIX1pvXywgRmxhZywgY2xfaWdub3JlZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJabyIsIF9TTEFTSF9abywgRmxhZywgY2xfaWdub3JlZF9Hcm91cCwgSU5WQUxJRCwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJacCIsIF9TTEFTSF9acF9mbGFnLCBGbGFnLCBjbF9Hcm91cCwgZnBhY2tfc3RydWN0X0VRLCAiMVwwIiwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiU2V0IHRoZSBkZWZhdWx0IG1heGltdW0gc3RydWN0IHBhY2tpbmcgYWxpZ25tZW50IHRvIDEiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiWnAiLCBfU0xBU0hfWnAsIEpvaW5lZCwgY2xfR3JvdXAsIGZwYWNrX3N0cnVjdF9FUSwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiU3BlY2lmeSB0aGUgZGVmYXVsdCBtYXhpbXVtIHN0cnVjdCBwYWNraW5nIGFsaWdubWVudCIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzIsICJacyIsIF9TTEFTSF9acywgRmxhZywgY2xfR3JvdXAsIGZzeW50YXhfb25seSwgbnVsbHB0ciwgQ0xPcHRpb24gfCBEcml2ZXJPcHRpb24gfCBDTE9wdGlvbiwgMCwKKyAgICAgICAiU3ludGF4LWNoZWNrIG9ubHkiLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8yLCAiWlciLCBfU0xBU0hfWlcsIEpvaW5lZCwgY2xfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIENMT3B0aW9uIHwgRHJpdmVyT3B0aW9uIHwgQ0xPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJaIiwgWl9GbGFnLCBGbGFnLCBMaW5rX0dyb3VwLCBJTlZBTElELCBudWxscHRyLCAwLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorT1BUSU9OKHByZWZpeF8xLCAiWiIsIFpfSm9pbmVkLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzEsICJ6IiwgeiwgU2VwYXJhdGUsIExpbmtfR3JvdXAsIElOVkFMSUQsIG51bGxwdHIsIExpbmtlcklucHV0IHwgUmVuZGVyQXNJbnB1dCwgMCwKKyAgICAgICAiUGFzcyAteiA8YXJnPiB0byB0aGUgbGlua2VyIiwgIjxhcmc+IiwgbnVsbHB0cikKK09QVElPTihwcmVmaXhfMywgIiIsIF9EQVNIX0RBU0gsIFJlbWFpbmluZ0FyZ3MsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIERyaXZlck9wdGlvbiB8IENvcmVPcHRpb24sIDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpCitPUFRJT04ocHJlZml4XzMsICIiLCBfLCBKb2luZWQsIElOVkFMSUQsIElOVkFMSUQsIG51bGxwdHIsIFVuc3VwcG9ydGVkLCAwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKQorI2VuZGlmIC8vIE9QVElPTgorCisjaWZkZWYgT1BUVEFCTEVfQVJHX0lOSVQKKy8vLy8vLy8vLy8KKy8vIE9wdGlvbiBWYWx1ZXMKKworeworYm9vbCBWYWx1ZXNXZXJlQWRkZWQ7CisKKyAgICBjb25zdCBjaGFyICpWYWx1ZXMgPQorICAgICNkZWZpbmUgR0VUX0NIRUNLRVJTCisgICAgI2RlZmluZSBDSEVDS0VSKEZVTExOQU1FLCBDTEFTUywgREVTQ0ZJTEUsIEhULCBHLCBIKSAgRlVMTE5BTUUgIiwiCisgICAgI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0NoZWNrZXJzLmluYyIKKyAgICAjdW5kZWYgR0VUX0NIRUNLRVJTCisgICAgI2RlZmluZSBHRVRfUEFDS0FHRVMKKyAgICAjZGVmaW5lIFBBQ0tBR0UoRlVMTE5BTUUsIEcsIEQpICBGVUxMTkFNRSAiLCIKKyAgICAjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQ2hlY2tlcnMuaW5jIgorICAgICN1bmRlZiBHRVRfUEFDS0FHRVMKKyAgICA7CisgIAorVmFsdWVzV2VyZUFkZGVkID0gT3B0LmFkZFZhbHVlcygiLWFuYWx5emVyLWNoZWNrZXIiLCBWYWx1ZXMpOworKHZvaWQpVmFsdWVzV2VyZUFkZGVkOworYXNzZXJ0KFZhbHVlc1dlcmVBZGRlZCAmJiAiQ291bGRuJ3QgYWRkIHZhbHVlcyB0byBPcHRUYWJsZSEiKTsKK30KK3sKK2Jvb2wgVmFsdWVzV2VyZUFkZGVkOworCisgICAgY29uc3QgY2hhciAqVmFsdWVzID0KKyAgICAjZGVmaW5lIExBTkdTVEFOREFSRChpZCwgbmFtZSwgbGFuZywgZGVzYywgZmVhdHVyZXMpIG5hbWUgIiwiCisgICAgI2RlZmluZSBMQU5HU1RBTkRBUkRfQUxJQVMoaWQsIGFsaWFzKSBhbGlhcyAiLCIKKyAgICAjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvTGFuZ1N0YW5kYXJkcy5kZWYiCisgICAgOworICAKK1ZhbHVlc1dlcmVBZGRlZCA9IE9wdC5hZGRWYWx1ZXMoIi1zdGQ9IiwgVmFsdWVzKTsKKyh2b2lkKVZhbHVlc1dlcmVBZGRlZDsKK2Fzc2VydChWYWx1ZXNXZXJlQWRkZWQgJiYgIkNvdWxkbid0IGFkZCB2YWx1ZXMgdG8gT3B0VGFibGUhIik7CitWYWx1ZXNXZXJlQWRkZWQgPSBPcHQuYWRkVmFsdWVzKCItLXN0ZD0iLCBWYWx1ZXMpOworKHZvaWQpVmFsdWVzV2VyZUFkZGVkOworYXNzZXJ0KFZhbHVlc1dlcmVBZGRlZCAmJiAiQ291bGRuJ3QgYWRkIHZhbHVlcyB0byBPcHRUYWJsZSEiKTsKK30KKworI2VuZGlmIC8vIE9QVFRBQkxFX0FSR19JTklUCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvUGhhc2VzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvUGhhc2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2YjViNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9QaGFzZXMuaApAQCAtMCwwICsxLDM3IEBACisvLz09PS0tLSBQaGFzZXMuaCAtIFRyYW5zZm9ybWF0aW9ucyBvbiBEcml2ZXIgVHlwZXMgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRFJJVkVSX1BIQVNFU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfRFJJVkVSX1BIQVNFU19ICisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgZHJpdmVyIHsKK25hbWVzcGFjZSBwaGFzZXMgeworICAvLy8gSUQgLSBPcmRlcmVkIHZhbHVlcyBmb3Igc3VjY2Vzc2l2ZSBzdGFnZXMgaW4gdGhlCisgIC8vLyBjb21waWxhdGlvbiBwcm9jZXNzIHdoaWNoIGludGVyYWN0IHdpdGggdXNlciBvcHRpb25zLgorICBlbnVtIElEIHsKKyAgICBQcmVwcm9jZXNzLAorICAgIFByZWNvbXBpbGUsCisgICAgQ29tcGlsZSwKKyAgICBCYWNrZW5kLAorICAgIEFzc2VtYmxlLAorICAgIExpbmsKKyAgfTsKKworICBlbnVtIHsKKyAgICBNYXhOdW1iZXJPZlBoYXNlcyA9IExpbmsgKyAxCisgIH07CisKKyAgY29uc3QgY2hhciAqZ2V0UGhhc2VOYW1lKElEIElkKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHBoYXNlcworfSAvLyBlbmQgbmFtZXNwYWNlIGRyaXZlcgorfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRHJpdmVyL1Nhbml0aXplckFyZ3MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9TYW5pdGl6ZXJBcmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE0NGU0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9TYW5pdGl6ZXJBcmdzLmgKQEAgLTAsMCArMSw5MCBAQAorLy89PT0tLS0gU2FuaXRpemVyQXJncy5oIC0gQXJndW1lbnRzIGZvciBzYW5pdGl6ZXIgdG9vbHMgIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9DTEFOR19EUklWRVJfU0FOSVRJWkVSQVJHU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfRFJJVkVSX1NBTklUSVpFUkFSR1NfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU2FuaXRpemVycy5oIgorI2luY2x1ZGUgImNsYW5nL0RyaXZlci9UeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vT3B0aW9uL0FyZy5oIgorI2luY2x1ZGUgImxsdm0vT3B0aW9uL0FyZ0xpc3QuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGRyaXZlciB7CisKK2NsYXNzIFRvb2xDaGFpbjsKKworY2xhc3MgU2FuaXRpemVyQXJncyB7CisgIFNhbml0aXplclNldCBTYW5pdGl6ZXJzOworICBTYW5pdGl6ZXJTZXQgUmVjb3ZlcmFibGVTYW5pdGl6ZXJzOworICBTYW5pdGl6ZXJTZXQgVHJhcFNhbml0aXplcnM7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEJsYWNrbGlzdEZpbGVzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRXh0cmFEZXBzOworICBpbnQgQ292ZXJhZ2VGZWF0dXJlcyA9IDA7CisgIGludCBNc2FuVHJhY2tPcmlnaW5zID0gMDsKKyAgYm9vbCBNc2FuVXNlQWZ0ZXJEdG9yID0gdHJ1ZTsKKyAgYm9vbCBDZmlDcm9zc0RzbyA9IGZhbHNlOworICBib29sIENmaUlDYWxsR2VuZXJhbGl6ZVBvaW50ZXJzID0gZmFsc2U7CisgIGludCBBc2FuRmllbGRQYWRkaW5nID0gMDsKKyAgYm9vbCBTaGFyZWRSdW50aW1lID0gZmFsc2U7CisgIGJvb2wgQXNhblVzZUFmdGVyU2NvcGUgPSB0cnVlOworICBib29sIEFzYW5HbG9iYWxzRGVhZFN0cmlwcGluZyA9IGZhbHNlOworICBib29sIExpbmtDWFhSdW50aW1lcyA9IGZhbHNlOworICBib29sIE5lZWRQSUUgPSBmYWxzZTsKKyAgYm9vbCBTYWZlU3RhY2tSdW50aW1lID0gZmFsc2U7CisgIGJvb2wgU3RhdHMgPSBmYWxzZTsKKyAgYm9vbCBUc2FuTWVtb3J5QWNjZXNzID0gdHJ1ZTsKKyAgYm9vbCBUc2FuRnVuY0VudHJ5RXhpdCA9IHRydWU7CisgIGJvb2wgVHNhbkF0b21pY3MgPSB0cnVlOworICBib29sIE1pbmltYWxSdW50aW1lID0gZmFsc2U7CisgIC8vIFRydWUgaWYgY3Jvc3MtZHNvIENGSSBzdXBwb3J0IGlmIHByb3ZpZGVkIGJ5IHRoZSBzeXN0ZW0gKGkuZS4gQW5kcm9pZCkuCisgIGJvb2wgSW1wbGljaXRDZmlSdW50aW1lID0gZmFsc2U7CisKKyBwdWJsaWM6CisgIC8vLyBQYXJzZXMgdGhlIHNhbml0aXplciBhcmd1bWVudHMgZnJvbSBhbiBhcmd1bWVudCBsaXN0LgorICBTYW5pdGl6ZXJBcmdzKGNvbnN0IFRvb2xDaGFpbiAmVEMsIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncyk7CisKKyAgYm9vbCBuZWVkc1NoYXJlZFJ0KCkgY29uc3QgeyByZXR1cm4gU2hhcmVkUnVudGltZTsgfQorCisgIGJvb2wgbmVlZHNBc2FuUnQoKSBjb25zdCB7IHJldHVybiBTYW5pdGl6ZXJzLmhhcyhTYW5pdGl6ZXJLaW5kOjpBZGRyZXNzKTsgfQorICBib29sIG5lZWRzSHdhc2FuUnQoKSBjb25zdCB7IHJldHVybiBTYW5pdGl6ZXJzLmhhcyhTYW5pdGl6ZXJLaW5kOjpIV0FkZHJlc3MpOyB9CisgIGJvb2wgbmVlZHNUc2FuUnQoKSBjb25zdCB7IHJldHVybiBTYW5pdGl6ZXJzLmhhcyhTYW5pdGl6ZXJLaW5kOjpUaHJlYWQpOyB9CisgIGJvb2wgbmVlZHNNc2FuUnQoKSBjb25zdCB7IHJldHVybiBTYW5pdGl6ZXJzLmhhcyhTYW5pdGl6ZXJLaW5kOjpNZW1vcnkpOyB9CisgIGJvb2wgbmVlZHNGdXp6ZXIoKSBjb25zdCB7IHJldHVybiBTYW5pdGl6ZXJzLmhhcyhTYW5pdGl6ZXJLaW5kOjpGdXp6ZXIpOyB9CisgIGJvb2wgbmVlZHNMc2FuUnQoKSBjb25zdCB7CisgICAgcmV0dXJuIFNhbml0aXplcnMuaGFzKFNhbml0aXplcktpbmQ6OkxlYWspICYmCisgICAgICAgICAgICFTYW5pdGl6ZXJzLmhhcyhTYW5pdGl6ZXJLaW5kOjpBZGRyZXNzKSAmJgorICAgICAgICAgICAhU2FuaXRpemVycy5oYXMoU2FuaXRpemVyS2luZDo6SFdBZGRyZXNzKTsKKyAgfQorICBib29sIG5lZWRzVWJzYW5SdCgpIGNvbnN0OworICBib29sIHJlcXVpcmVzTWluaW1hbFJ1bnRpbWUoKSBjb25zdCB7IHJldHVybiBNaW5pbWFsUnVudGltZTsgfQorICBib29sIG5lZWRzRGZzYW5SdCgpIGNvbnN0IHsgcmV0dXJuIFNhbml0aXplcnMuaGFzKFNhbml0aXplcktpbmQ6OkRhdGFGbG93KTsgfQorICBib29sIG5lZWRzU2FmZVN0YWNrUnQoKSBjb25zdCB7IHJldHVybiBTYWZlU3RhY2tSdW50aW1lOyB9CisgIGJvb2wgbmVlZHNDZmlSdCgpIGNvbnN0OworICBib29sIG5lZWRzQ2ZpRGlhZ1J0KCkgY29uc3Q7CisgIGJvb2wgbmVlZHNTdGF0c1J0KCkgY29uc3QgeyByZXR1cm4gU3RhdHM7IH0KKyAgYm9vbCBuZWVkc0VzYW5SdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU2FuaXRpemVycy5oYXNPbmVPZihTYW5pdGl6ZXJLaW5kOjpFZmZpY2llbmN5KTsKKyAgfQorICBib29sIG5lZWRzU2N1ZG9SdCgpIGNvbnN0IHsgcmV0dXJuIFNhbml0aXplcnMuaGFzKFNhbml0aXplcktpbmQ6OlNjdWRvKTsgfQorCisgIGJvb2wgcmVxdWlyZXNQSUUoKSBjb25zdDsKKyAgYm9vbCBuZWVkc1Vud2luZFRhYmxlcygpIGNvbnN0OworICBib29sIGxpbmtDWFhSdW50aW1lcygpIGNvbnN0IHsgcmV0dXJuIExpbmtDWFhSdW50aW1lczsgfQorICBib29sIGhhc0Nyb3NzRHNvQ2ZpKCkgY29uc3QgeyByZXR1cm4gQ2ZpQ3Jvc3NEc287IH0KKyAgdm9pZCBhZGRBcmdzKGNvbnN0IFRvb2xDaGFpbiAmVEMsIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ21kQXJncywgdHlwZXM6OklEIElucHV0VHlwZSkgY29uc3Q7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZHJpdmVyCit9ICAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvVG9vbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRHJpdmVyL1Rvb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjc2ZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRHJpdmVyL1Rvb2wuaApAQCAtMCwwICsxLDE1MSBAQAorLy89PT0tLS0gVG9vbC5oIC0gQ29tcGlsYXRpb24gVG9vbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0RSSVZFUl9UT09MX0gKKyNkZWZpbmUgTExWTV9DTEFOR19EUklWRVJfVE9PTF9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1Byb2dyYW0uaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9wdCB7CisgIGNsYXNzIEFyZ0xpc3Q7Cit9Cit9CisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgZHJpdmVyIHsKKworICBjbGFzcyBDb21waWxhdGlvbjsKKyAgY2xhc3MgSW5wdXRJbmZvOworICBjbGFzcyBKb2I7CisgIGNsYXNzIEpvYkFjdGlvbjsKKyAgY2xhc3MgVG9vbENoYWluOworCisgIHR5cGVkZWYgU21hbGxWZWN0b3I8SW5wdXRJbmZvLCA0PiBJbnB1dEluZm9MaXN0OworCisvLy8gVG9vbCAtIEluZm9ybWF0aW9uIG9uIGEgc3BlY2lmaWMgY29tcGlsYXRpb24gdG9vbC4KK2NsYXNzIFRvb2wgeworcHVibGljOgorICAvLyBEb2N1bWVudHMgdGhlIGxldmVsIG9mIHN1cHBvcnQgZm9yIHJlc3BvbnNlIGZpbGVzIGluIHRoaXMgdG9vbC4KKyAgLy8gUmVzcG9uc2UgZmlsZXMgYXJlIG5lY2Vzc2FyeSBpZiB0aGUgY29tbWFuZCBsaW5lIGdldHMgdG9vIGxhcmdlLAorICAvLyByZXF1aXJpbmcgdGhlIGFyZ3VtZW50cyB0byBiZSB0cmFuc2ZlcnJlZCB0byBhIGZpbGUuCisgIGVudW0gUmVzcG9uc2VGaWxlU3VwcG9ydCB7CisgICAgLy8gUHJvdmlkZXMgZnVsbCBzdXBwb3J0IGZvciByZXNwb25zZSBmaWxlcywgd2hpY2ggbWVhbnMgd2UgY2FuIHRyYW5zZmVyCisgICAgLy8gYWxsIHRvb2wgaW5wdXQgYXJndW1lbnRzIHRvIGEgZmlsZS4gRS5nLjogY2xhbmcsIGdjYywgYmludXRpbHMgYW5kIE1TVkMKKyAgICAvLyB0b29scy4KKyAgICBSRl9GdWxsLAorICAgIC8vIElucHV0IGZpbGUgbmFtZXMgY2FuIGxpdmUgaW4gYSBmaWxlLCBidXQgZmxhZ3MgY2FuJ3QuIEUuZy46IGxkNjQgKE1hYworICAgIC8vIE9TIFggbGlua2VyKS4KKyAgICBSRl9GaWxlTGlzdCwKKyAgICAvLyBEb2VzIG5vdCBzdXBwb3J0IHJlc3BvbnNlIGZpbGVzOiBhbGwgYXJndW1lbnRzIG11c3QgYmUgcGFzc2VkIHZpYQorICAgIC8vIGNvbW1hbmQgbGluZS4KKyAgICBSRl9Ob25lCisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBUaGUgdG9vbCBuYW1lIChmb3IgZGVidWdnaW5nKS4KKyAgY29uc3QgY2hhciAqTmFtZTsKKworICAvLy8gVGhlIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoZSB0b29sLCBmb3IgdXNlIGluIGRpYWdub3N0aWNzLgorICBjb25zdCBjaGFyICpTaG9ydE5hbWU7CisKKyAgLy8vIFRoZSB0b29sIGNoYWluIHRoaXMgdG9vbCBpcyBhIHBhcnQgb2YuCisgIGNvbnN0IFRvb2xDaGFpbiAmVGhlVG9vbENoYWluOworCisgIC8vLyBUaGUgbGV2ZWwgb2Ygc3VwcG9ydCBmb3IgcmVzcG9uc2UgZmlsZXMgc2VlbiBpbiB0aGlzIHRvb2wKKyAgY29uc3QgUmVzcG9uc2VGaWxlU3VwcG9ydCBSZXNwb25zZVN1cHBvcnQ7CisKKyAgLy8vIFRoZSBlbmNvZGluZyB0byB1c2Ugd2hlbiB3cml0aW5nIHJlc3BvbnNlIGZpbGVzIGZvciB0aGlzIHRvb2wgb24gV2luZG93cworICBjb25zdCBsbHZtOjpzeXM6OldpbmRvd3NFbmNvZGluZ01ldGhvZCBSZXNwb25zZUVuY29kaW5nOworCisgIC8vLyBUaGUgZmxhZyB1c2VkIHRvIHBhc3MgYSByZXNwb25zZSBmaWxlIHZpYSBjb21tYW5kIGxpbmUgdG8gdGhpcyB0b29sCisgIGNvbnN0IGNoYXIgKmNvbnN0IFJlc3BvbnNlRmxhZzsKKworcHVibGljOgorICBUb29sKGNvbnN0IGNoYXIgKk5hbWUsIGNvbnN0IGNoYXIgKlNob3J0TmFtZSwgY29uc3QgVG9vbENoYWluICZUQywKKyAgICAgICBSZXNwb25zZUZpbGVTdXBwb3J0IFJlc3BvbnNlU3VwcG9ydCA9IFJGX05vbmUsCisgICAgICAgbGx2bTo6c3lzOjpXaW5kb3dzRW5jb2RpbmdNZXRob2QgUmVzcG9uc2VFbmNvZGluZyA9IGxsdm06OnN5czo6V0VNX1VURjgsCisgICAgICAgY29uc3QgY2hhciAqUmVzcG9uc2VGbGFnID0gIkAiKTsKKworcHVibGljOgorICB2aXJ0dWFsIH5Ub29sKCk7CisKKyAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICBjb25zdCBjaGFyICpnZXRTaG9ydE5hbWUoKSBjb25zdCB7IHJldHVybiBTaG9ydE5hbWU7IH0KKworICBjb25zdCBUb29sQ2hhaW4gJmdldFRvb2xDaGFpbigpIGNvbnN0IHsgcmV0dXJuIFRoZVRvb2xDaGFpbjsgfQorCisgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQXNzZW1ibGVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGNhbkVtaXRJUigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNMaW5rSm9iKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzRHN5bXV0aWxKb2IoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGxldmVsIG9mIHN1cHBvcnQgZm9yIHJlc3BvbnNlIGZpbGVzIG9mIHRoaXMgdG9vbCwKKyAgLy8vIHdoZXRoZXIgaXQgYWNjZXB0cyBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHZpYSBhIGZpbGUgb24gZGlzay4KKyAgUmVzcG9uc2VGaWxlU3VwcG9ydCBnZXRSZXNwb25zZUZpbGVzU3VwcG9ydCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVzcG9uc2VTdXBwb3J0OworICB9CisgIC8vLyBcYnJpZWYgUmV0dXJucyB3aGljaCBlbmNvZGluZyB0aGUgcmVzcG9uc2UgZmlsZSBzaG91bGQgdXNlLiBUaGlzIGlzIG9ubHkKKyAgLy8vIHJlbGV2YW50IG9uIFdpbmRvd3MgcGxhdGZvcm1zIHdoZXJlIHRoZXJlIGFyZSBkaWZmZXJlbnQgZW5jb2RpbmdzIGJlaW5nCisgIC8vLyBhY2NlcHRlZCBmb3IgZGlmZmVyZW50IHRvb2xzLiBPbiBVTklYLCBVVEY4IGlzIHVuaXZlcnNhbC4KKyAgLy8vCisgIC8vLyBXaW5kb3dzIHVzZSBjYXNlczogLSBHQ0MgYW5kIEJpbnV0aWxzIG9uIG1pbmd3IG9ubHkgYWNjZXB0IEFOU0kgcmVzcG9uc2UKKyAgLy8vIGZpbGVzIGVuY29kZWQgd2l0aCB0aGUgc3lzdGVtIGN1cnJlbnQgY29kZSBwYWdlLgorICAvLy8gLSBNU1ZDJ3MgQ0wuZXhlIGFuZCBMSU5LLmV4ZSBhY2NlcHQgVVRGMTYgb24gV2luZG93cy4KKyAgLy8vIC0gQ2xhbmcgYWNjZXB0cyBib3RoIFVURjggYW5kIFVURjE2LgorICAvLy8KKyAgLy8vIEZJWE1FOiBXaGVuIEdOVSB0b29scyBsZWFybiBob3cgdG8gcGFyc2UgVVRGMTYgb24gV2luZG93cywgd2Ugc2hvdWxkCisgIC8vLyBhbHdheXMgdXNlIFVURjE2IGZvciBXaW5kb3dzLCB3aGljaCBpcyB0aGUgV2luZG93cyBvZmZpY2lhbCBlbmNvZGluZyBmb3IKKyAgLy8vIGludGVybmF0aW9uYWwgY2hhcmFjdGVycy4KKyAgbGx2bTo6c3lzOjpXaW5kb3dzRW5jb2RpbmdNZXRob2QgZ2V0UmVzcG9uc2VGaWxlRW5jb2RpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlc3BvbnNlRW5jb2Rpbmc7CisgIH0KKyAgLy8vIFxicmllZiBSZXR1cm5zIHdoaWNoIHByZWZpeCB0byB1c2Ugd2hlbiBwYXNzaW5nIHRoZSBuYW1lIG9mIGEgcmVzcG9uc2UKKyAgLy8vIGZpbGUgYXMgYSBwYXJhbWV0ZXIgdG8gdGhpcyB0b29sLgorICBjb25zdCBjaGFyICpnZXRSZXNwb25zZUZpbGVGbGFnKCkgY29uc3QgeyByZXR1cm4gUmVzcG9uc2VGbGFnOyB9CisKKyAgLy8vIFxicmllZiBEb2VzIHRoaXMgdG9vbCBoYXZlICJnb29kIiBzdGFuZGFyZGl6ZWQgZGlhZ25vc3RpY3MsIG9yIHNob3VsZCB0aGUKKyAgLy8vIGRyaXZlciBhZGQgYW4gYWRkaXRpb25hbCAiY29tbWFuZCBmYWlsZWQiIGRpYWdub3N0aWMgb24gZmFpbHVyZXMuCisgIHZpcnR1YWwgYm9vbCBoYXNHb29kRGlhZ25vc3RpY3MoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBDb25zdHJ1Y3RKb2IgLSBDb25zdHJ1Y3Qgam9icyB0byBwZXJmb3JtIHRoZSBhY3Rpb24gXHAgSkEsCisgIC8vLyB3cml0aW5nIHRvIFxwIE91dHB1dCBhbmQgd2l0aCBccCBJbnB1dHMsIGFuZCBhZGQgdGhlIGpvYnMgdG8KKyAgLy8vIFxwIEMuCisgIC8vLworICAvLy8gXHBhcmFtIFRDQXJncyAtIFRoZSBhcmd1bWVudCBsaXN0IGZvciB0aGlzIHRvb2xjaGFpbiwgd2l0aCBhbnkKKyAgLy8vIHRvb2wgY2hhaW4gc3BlY2lmaWMgdHJhbnNsYXRpb25zIGFwcGxpZWQuCisgIC8vLyBccGFyYW0gTGlua2luZ091dHB1dCAtIElmIHRoaXMgb3V0cHV0IHdpbGwgZXZlbnR1YWxseSBmZWVkIHRoZQorICAvLy8gbGlua2VyLCB0aGVuIHRoaXMgaXMgdGhlIGZpbmFsIG91dHB1dCBuYW1lIG9mIHRoZSBsaW5rZWQgaW1hZ2UuCisgIHZpcnR1YWwgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0ID0gMDsKKyAgLy8vIENvbnN0cnVjdCBqb2JzIHRvIHBlcmZvcm0gdGhlIGFjdGlvbiBccCBKQSwgd3JpdGluZyB0byB0aGUgXHAgT3V0cHV0cyBhbmQKKyAgLy8vIHdpdGggXHAgSW5wdXRzLCBhbmQgYWRkIHRoZSBqb2JzIHRvIFxwIEMuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgIC8vLyBhc3N1bWVzIGEgc2luZ2xlIG91dHB1dCBhbmQgaXMgZXhwZWN0ZWQgdG8gYmUgb3ZlcmxvYWRlZCBmb3IgdGhlIHRvb2xzCisgIC8vLyB0aGF0IHN1cHBvcnQgbXVsdGlwbGUgaW5wdXRzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUQ0FyZ3MgVGhlIGFyZ3VtZW50IGxpc3QgZm9yIHRoaXMgdG9vbGNoYWluLCB3aXRoIGFueQorICAvLy8gdG9vbCBjaGFpbiBzcGVjaWZpYyB0cmFuc2xhdGlvbnMgYXBwbGllZC4KKyAgLy8vIFxwYXJhbSBMaW5raW5nT3V0cHV0IElmIHRoaXMgb3V0cHV0IHdpbGwgZXZlbnR1YWxseSBmZWVkIHRoZQorICAvLy8gbGlua2VyLCB0aGVuIHRoaXMgaXMgdGhlIGZpbmFsIG91dHB1dCBuYW1lIG9mIHRoZSBsaW5rZWQgaW1hZ2UuCisgIHZpcnR1YWwgdm9pZCBDb25zdHJ1Y3RKb2JNdWx0aXBsZU91dHB1dHMoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmT3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZHJpdmVyCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvVG9vbENoYWluLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvVG9vbENoYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmNzMzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9Ub29sQ2hhaW4uaApAQCAtMCwwICsxLDU1MiBAQAorLy89PT0tIFRvb2xDaGFpbi5oIC0gQ29sbGVjdGlvbnMgb2YgdG9vbHMgZm9yIG9uZSBwbGF0Zm9ybSAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0RSSVZFUl9UT09MQ0hBSU5fSAorI2RlZmluZSBMTFZNX0NMQU5HX0RSSVZFUl9UT09MQ0hBSU5fSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Nhbml0aXplcnMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9WZXJzaW9uVHVwbGUuaCIKKyNpbmNsdWRlICJjbGFuZy9Ecml2ZXIvQWN0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvRHJpdmVyL011bHRpbGliLmgiCisjaW5jbHVkZSAiY2xhbmcvRHJpdmVyL1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNUYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9PcHRpb24vT3B0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb3B0IHsKKworY2xhc3MgQXJnOworY2xhc3MgQXJnTGlzdDsKK2NsYXNzIERlcml2ZWRBcmdMaXN0OworCit9IC8vIG5hbWVzcGFjZSBvcHQKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgT2JqQ1J1bnRpbWU7CisKK25hbWVzcGFjZSB2ZnMgeworCitjbGFzcyBGaWxlU3lzdGVtOworCit9IC8vIG5hbWVzcGFjZSB2ZnMKKworbmFtZXNwYWNlIGRyaXZlciB7CisKK2NsYXNzIERyaXZlcjsKK2NsYXNzIElucHV0SW5mbzsKK2NsYXNzIFNhbml0aXplckFyZ3M7CitjbGFzcyBUb29sOworY2xhc3MgWFJheUFyZ3M7CisKKy8vLyBIZWxwZXIgc3RydWN0dXJlIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBleHRyYWN0ZWQgZnJvbSBjbGFuZyBleGVjdXRhYmxlCisvLy8gbmFtZSBzdWNoIGFzIGBpNjg2LWxpbnV4LWFuZHJvaWQtZysrYC4KK3N0cnVjdCBQYXJzZWRDbGFuZ05hbWUgeworICAvLy8gVGFyZ2V0IHBhcnQgb2YgdGhlIGV4ZWN1dGFibGUgbmFtZSwgYXMgYGk2ODYtbGludXgtYW5kcm9pZGAuCisgIHN0ZDo6c3RyaW5nIFRhcmdldFByZWZpeDsKKworICAvLy8gRHJpdmVyIG1vZGUgcGFydCBvZiB0aGUgZXhlY3V0YWJsZSBuYW1lLCBhcyBgZysrYC4KKyAgc3RkOjpzdHJpbmcgTW9kZVN1ZmZpeDsKKworICAvLy8gQ29ycmVzcG9uZGluZyBkcml2ZXIgbW9kZSBhcmd1bWVudCwgYXMgJy0tZHJpdmVyLW1vZGU9ZysrJworICBjb25zdCBjaGFyICpEcml2ZXJNb2RlID0gbnVsbHB0cjsKKworICAvLy8gVHJ1ZSBpZiBUYXJnZXRQcmVmaXggaXMgcmVjb2duaXplZCBhcyBhIHJlZ2lzdGVyZWQgdGFyZ2V0IG5hbWUuCisgIGJvb2wgVGFyZ2V0SXNWYWxpZCA9IGZhbHNlOworCisgIFBhcnNlZENsYW5nTmFtZSgpID0gZGVmYXVsdDsKKyAgUGFyc2VkQ2xhbmdOYW1lKHN0ZDo6c3RyaW5nIFN1ZmZpeCwgY29uc3QgY2hhciAqTW9kZSkKKyAgICAgIDogTW9kZVN1ZmZpeChTdWZmaXgpLCBEcml2ZXJNb2RlKE1vZGUpIHt9CisgIFBhcnNlZENsYW5nTmFtZShzdGQ6OnN0cmluZyBUYXJnZXQsIHN0ZDo6c3RyaW5nIFN1ZmZpeCwgY29uc3QgY2hhciAqTW9kZSwKKyAgICAgICAgICAgICAgICAgIGJvb2wgSXNSZWdpc3RlcmVkKQorICAgICAgOiBUYXJnZXRQcmVmaXgoVGFyZ2V0KSwgTW9kZVN1ZmZpeChTdWZmaXgpLCBEcml2ZXJNb2RlKE1vZGUpLAorICAgICAgICBUYXJnZXRJc1ZhbGlkKElzUmVnaXN0ZXJlZCkge30KK307CisKKy8vLyBUb29sQ2hhaW4gLSBBY2Nlc3MgdG8gdG9vbHMgZm9yIGEgc2luZ2xlIHBsYXRmb3JtLgorY2xhc3MgVG9vbENoYWluIHsKK3B1YmxpYzoKKyAgdXNpbmcgcGF0aF9saXN0ID0gU21hbGxWZWN0b3I8c3RkOjpzdHJpbmcsIDE2PjsKKworICBlbnVtIENYWFN0ZGxpYlR5cGUgeworICAgIENTVF9MaWJjeHgsCisgICAgQ1NUX0xpYnN0ZGN4eAorICB9OworCisgIGVudW0gUnVudGltZUxpYlR5cGUgeworICAgIFJMVF9Db21waWxlclJULAorICAgIFJMVF9MaWJnY2MKKyAgfTsKKworICBlbnVtIFJUVElNb2RlIHsKKyAgICBSTV9FbmFibGVkRXhwbGljaXRseSwKKyAgICBSTV9FbmFibGVkSW1wbGljaXRseSwKKyAgICBSTV9EaXNhYmxlZEV4cGxpY2l0bHksCisgICAgUk1fRGlzYWJsZWRJbXBsaWNpdGx5CisgIH07CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBSZWdpc3RlckVmZmVjdGl2ZVRyaXBsZTsKKworICBjb25zdCBEcml2ZXIgJkQ7CisgIGxsdm06OlRyaXBsZSBUcmlwbGU7CisgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJnczsKKworICAvLyBXZSBuZWVkIHRvIGluaXRpYWxpemUgQ2FjaGVkUlRUSUFyZyBiZWZvcmUgQ2FjaGVkUlRUSU1vZGUKKyAgY29uc3QgbGx2bTo6b3B0OjpBcmcgKmNvbnN0IENhY2hlZFJUVElBcmc7CisKKyAgY29uc3QgUlRUSU1vZGUgQ2FjaGVkUlRUSU1vZGU7CisKKyAgLy8vIFRoZSBsaXN0IG9mIHRvb2xjaGFpbiBzcGVjaWZpYyBwYXRoIHByZWZpeGVzIHRvIHNlYXJjaCBmb3IgZmlsZXMuCisgIHBhdGhfbGlzdCBGaWxlUGF0aHM7CisKKyAgLy8vIFRoZSBsaXN0IG9mIHRvb2xjaGFpbiBzcGVjaWZpYyBwYXRoIHByZWZpeGVzIHRvIHNlYXJjaCBmb3IgcHJvZ3JhbXMuCisgIHBhdGhfbGlzdCBQcm9ncmFtUGF0aHM7CisKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8VG9vbD4gQ2xhbmc7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPFRvb2w+IEFzc2VtYmxlOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxUb29sPiBMaW5rOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxUb29sPiBPZmZsb2FkQnVuZGxlcjsKKworICBUb29sICpnZXRDbGFuZygpIGNvbnN0OworICBUb29sICpnZXRBc3NlbWJsZSgpIGNvbnN0OworICBUb29sICpnZXRMaW5rKCkgY29uc3Q7CisgIFRvb2wgKmdldENsYW5nQXMoKSBjb25zdDsKKyAgVG9vbCAqZ2V0T2ZmbG9hZEJ1bmRsZXIoKSBjb25zdDsKKworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxTYW5pdGl6ZXJBcmdzPiBTYW5pdGl6ZXJBcmd1bWVudHM7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPFhSYXlBcmdzPiBYUmF5QXJndW1lbnRzOworCisgIC8vLyBUaGUgZWZmZWN0aXZlIGNsYW5nIHRyaXBsZSBmb3IgdGhlIGN1cnJlbnQgSm9iLgorICBtdXRhYmxlIGxsdm06OlRyaXBsZSBFZmZlY3RpdmVUcmlwbGU7CisKKyAgLy8vIFNldCB0aGUgdG9vbGNoYWluJ3MgZWZmZWN0aXZlIGNsYW5nIHRyaXBsZS4KKyAgdm9pZCBzZXRFZmZlY3RpdmVUcmlwbGUobGx2bTo6VHJpcGxlIEVUKSBjb25zdCB7CisgICAgRWZmZWN0aXZlVHJpcGxlID0gc3RkOjptb3ZlKEVUKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIE11bHRpbGliU2V0IE11bHRpbGliczsKKworICBUb29sQ2hhaW4oY29uc3QgRHJpdmVyICZELCBjb25zdCBsbHZtOjpUcmlwbGUgJlQsCisgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MpOworCisgIHZvaWQgc2V0VHJpcGxlRW52aXJvbm1lbnQobGx2bTo6VHJpcGxlOjpFbnZpcm9ubWVudFR5cGUgRW52KTsKKworICB2aXJ0dWFsIFRvb2wgKmJ1aWxkQXNzZW1ibGVyKCkgY29uc3Q7CisgIHZpcnR1YWwgVG9vbCAqYnVpbGRMaW5rZXIoKSBjb25zdDsKKyAgdmlydHVhbCBUb29sICpnZXRUb29sKEFjdGlvbjo6QWN0aW9uQ2xhc3MgQUMpIGNvbnN0OworCisgIC8vLyBcbmFtZSBVdGlsaXRpZXMgZm9yIGltcGxlbWVudGluZyBzdWJjbGFzc2VzLgorICAvLy9AeworICBzdGF0aWMgdm9pZCBhZGRTeXN0ZW1JbmNsdWRlKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmRHJpdmVyQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJlBhdGgpOworICBzdGF0aWMgdm9pZCBhZGRFeHRlcm5DU3lzdGVtSW5jbHVkZShjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkRyaXZlckFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ0MxQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJlBhdGgpOworICBzdGF0aWMgdm9pZAorICAgICAgYWRkRXh0ZXJuQ1N5c3RlbUluY2x1ZGVJZkV4aXN0cyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkRyaXZlckFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ0MxQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJlBhdGgpOworICBzdGF0aWMgdm9pZCBhZGRTeXN0ZW1JbmNsdWRlcyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkRyaXZlckFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ0MxQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U3RyaW5nUmVmPiBQYXRocyk7CisgIC8vL0B9CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+VG9vbENoYWluKCk7CisKKyAgLy8gQWNjZXNzb3JzCisKKyAgY29uc3QgRHJpdmVyICZnZXREcml2ZXIoKSBjb25zdCB7IHJldHVybiBEOyB9CisgIHZmczo6RmlsZVN5c3RlbSAmZ2V0VkZTKCkgY29uc3Q7CisgIGNvbnN0IGxsdm06OlRyaXBsZSAmZ2V0VHJpcGxlKCkgY29uc3QgeyByZXR1cm4gVHJpcGxlOyB9CisKKyAgLy8vIEdldCB0aGUgdG9vbGNoYWluJ3MgYXV4IHRyaXBsZSwgaWYgaXQgaGFzIG9uZS4KKyAgLy8vCisgIC8vLyBFeGFjdGx5IHdoYXQgdGhlIGF1eCB0cmlwbGUgcmVwcmVzZW50cyBkZXBlbmRzIG9uIHRoZSB0b29sY2hhaW4sIGJ1dCBmb3IKKyAgLy8vIGV4YW1wbGUgd2hlbiBjb21waWxpbmcgQ1VEQSBjb2RlIGZvciB0aGUgR1BVLCB0aGUgdHJpcGxlIG1pZ2h0IGJlIE5WUFRYLAorICAvLy8gd2hpbGUgdGhlIGF1eCB0cmlwbGUgaXMgdGhlIGhvc3QgKENQVSkgdG9vbGNoYWluLCBlLmcuIHg4Ni1saW51eC1nbnUuCisgIHZpcnR1YWwgY29uc3QgbGx2bTo6VHJpcGxlICpnZXRBdXhUcmlwbGUoKSBjb25zdCB7IHJldHVybiBudWxscHRyOyB9CisKKyAgLy8vIFNvbWUgdG9vbGNoYWlucyBuZWVkIHRvIG1vZGlmeSB0aGUgZmlsZSBuYW1lLCBmb3IgZXhhbXBsZSB0byByZXBsYWNlIHRoZQorICAvLy8gZXh0ZW5zaW9uIGZvciBvYmplY3QgZmlsZXMgd2l0aCAuY3ViaW4gZm9yIE9wZW5NUCBvZmZsb2FkaW5nIHRvIE52aWRpYQorICAvLy8gR1BVcy4KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRJbnB1dEZpbGVuYW1lKGNvbnN0IElucHV0SW5mbyAmSW5wdXQpIGNvbnN0OworCisgIGxsdm06OlRyaXBsZTo6QXJjaFR5cGUgZ2V0QXJjaCgpIGNvbnN0IHsgcmV0dXJuIFRyaXBsZS5nZXRBcmNoKCk7IH0KKyAgU3RyaW5nUmVmIGdldEFyY2hOYW1lKCkgY29uc3QgeyByZXR1cm4gVHJpcGxlLmdldEFyY2hOYW1lKCk7IH0KKyAgU3RyaW5nUmVmIGdldFBsYXRmb3JtKCkgY29uc3QgeyByZXR1cm4gVHJpcGxlLmdldFZlbmRvck5hbWUoKTsgfQorICBTdHJpbmdSZWYgZ2V0T1MoKSBjb25zdCB7IHJldHVybiBUcmlwbGUuZ2V0T1NOYW1lKCk7IH0KKworICAvLy8gXGJyaWVmIFByb3ZpZGUgdGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIG5hbWUgKGFzIGV4cGVjdGVkIGJ5IC1hcmNoKSBmb3IKKyAgLy8vIHRoaXMgdG9vbGNoYWluLgorICBTdHJpbmdSZWYgZ2V0RGVmYXVsdFVuaXZlcnNhbEFyY2hOYW1lKCkgY29uc3Q7CisKKyAgc3RkOjpzdHJpbmcgZ2V0VHJpcGxlU3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBUcmlwbGUuZ2V0VHJpcGxlKCk7CisgIH0KKworICAvLy8gR2V0IHRoZSB0b29sY2hhaW4ncyBlZmZlY3RpdmUgY2xhbmcgdHJpcGxlLgorICBjb25zdCBsbHZtOjpUcmlwbGUgJmdldEVmZmVjdGl2ZVRyaXBsZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIUVmZmVjdGl2ZVRyaXBsZS5nZXRUcmlwbGUoKS5lbXB0eSgpICYmICJObyBlZmZlY3RpdmUgdHJpcGxlIik7CisgICAgcmV0dXJuIEVmZmVjdGl2ZVRyaXBsZTsKKyAgfQorCisgIHBhdGhfbGlzdCAmZ2V0RmlsZVBhdGhzKCkgeyByZXR1cm4gRmlsZVBhdGhzOyB9CisgIGNvbnN0IHBhdGhfbGlzdCAmZ2V0RmlsZVBhdGhzKCkgY29uc3QgeyByZXR1cm4gRmlsZVBhdGhzOyB9CisKKyAgcGF0aF9saXN0ICZnZXRQcm9ncmFtUGF0aHMoKSB7IHJldHVybiBQcm9ncmFtUGF0aHM7IH0KKyAgY29uc3QgcGF0aF9saXN0ICZnZXRQcm9ncmFtUGF0aHMoKSBjb25zdCB7IHJldHVybiBQcm9ncmFtUGF0aHM7IH0KKworICBjb25zdCBNdWx0aWxpYlNldCAmZ2V0TXVsdGlsaWJzKCkgY29uc3QgeyByZXR1cm4gTXVsdGlsaWJzOyB9CisKKyAgY29uc3QgU2FuaXRpemVyQXJncyYgZ2V0U2FuaXRpemVyQXJncygpIGNvbnN0OworCisgIGNvbnN0IFhSYXlBcmdzJiBnZXRYUmF5QXJncygpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIEFyZyAqIHRoYXQgZXhwbGljaXRseSB0dXJuZWQgb24vb2ZmIHJ0dGksIG9yIG51bGxwdHIuCisgIGNvbnN0IGxsdm06Om9wdDo6QXJnICpnZXRSVFRJQXJnKCkgY29uc3QgeyByZXR1cm4gQ2FjaGVkUlRUSUFyZzsgfQorCisgIC8vIFJldHVybnMgdGhlIFJUVElNb2RlIGZvciB0aGUgdG9vbGNoYWluIHdpdGggdGhlIGN1cnJlbnQgYXJndW1lbnRzLgorICBSVFRJTW9kZSBnZXRSVFRJTW9kZSgpIGNvbnN0IHsgcmV0dXJuIENhY2hlZFJUVElNb2RlOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYW55IGltcGxpY2l0IHRhcmdldCBhbmQvb3IgbW9kZSBmbGFnIGZvciBhbiBpbnZvY2F0aW9uIG9mCisgIC8vLyB0aGUgY29tcGlsZXIgZHJpdmVyIGFzIGBQcm9nTmFtZWAuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsIHdoZW4gY2FsbGVkIHdpdGggaTY4Ni1saW51eC1hbmRyb2lkLWcrKywgdGhlIGZpcnN0IGVsZW1lbnQKKyAgLy8vIG9mIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBzZXQgdG8gYCJpNjg2LWxpbnV4LWFuZHJvaWQiYCBhbmQgdGhlIHNlY29uZAorICAvLy8gd2lsbCBiZSBzZXQgdG8gIi0tZHJpdmVyLW1vZGU9ZysrImAuCisgIC8vLyBJdCBpcyBPSyBpZiB0aGUgdGFyZ2V0IG5hbWUgaXMgbm90IHJlZ2lzdGVyZWQuIEluIHRoaXMgY2FzZSB0aGUgcmV0dXJuCisgIC8vLyB2YWx1ZSBjb250YWlucyBmYWxzZSBpbiB0aGUgZmllbGQgVGFyZ2V0SXNWYWxpZC4KKyAgLy8vCisgIC8vLyBccHJlIGBsbHZtOjpJbml0aWFsaXplQWxsVGFyZ2V0cygpYCBoYXMgYmVlbiBjYWxsZWQuCisgIC8vLyBccGFyYW0gUHJvZ05hbWUgVGhlIG5hbWUgdGhlIENsYW5nIGRyaXZlciB3YXMgaW52b2tlZCB3aXRoIChmcm9tLAorICAvLy8gZS5nLiwgYXJndlswXSkuCisgIC8vLyBccmV0dXJuIEEgc3RydWN0dXJlIG9mIHR5cGUgUGFyc2VkQ2xhbmdOYW1lIHRoYXQgY29udGFpbnMgdGhlIGV4ZWN1dGFibGUKKyAgLy8vIG5hbWUgcGFydHMuCisgIHN0YXRpYyBQYXJzZWRDbGFuZ05hbWUgZ2V0VGFyZ2V0QW5kTW9kZUZyb21Qcm9ncmFtTmFtZShTdHJpbmdSZWYgUHJvZ05hbWUpOworCisgIC8vIFRvb2wgYWNjZXNzLgorCisgIC8vLyBUcmFuc2xhdGVBcmdzIC0gQ3JlYXRlIGEgbmV3IGRlcml2ZWQgYXJndW1lbnQgbGlzdCBmb3IgYW55IGFyZ3VtZW50CisgIC8vLyB0cmFuc2xhdGlvbnMgdGhpcyBUb29sQ2hhaW4gbWF5IHdpc2ggdG8gcGVyZm9ybSwgb3IgMCBpZiBubyB0b29sIGNoYWluCisgIC8vLyBzcGVjaWZpYyB0cmFuc2xhdGlvbnMgYXJlIG5lZWRlZC4gSWYgXHAgRGV2aWNlT2ZmbG9hZEtpbmQgaXMgc3BlY2lmaWVkCisgIC8vLyB0aGUgdHJhbnNsYXRpb24gc3BlY2lmaWMgZm9yIHRoYXQgb2ZmbG9hZCBraW5kIGlzIHBlcmZvcm1lZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQm91bmRBcmNoIC0gVGhlIGJvdW5kIGFyY2hpdGVjdHVyZSBuYW1lLCBvciAwLgorICAvLy8gXHBhcmFtIERldmljZU9mZmxvYWRLaW5kIC0gVGhlIGRldmljZSBvZmZsb2FkIGtpbmQgdXNlZCBmb3IgdGhlCisgIC8vLyB0cmFuc2xhdGlvbi4KKyAgdmlydHVhbCBsbHZtOjpvcHQ6OkRlcml2ZWRBcmdMaXN0ICoKKyAgVHJhbnNsYXRlQXJncyhjb25zdCBsbHZtOjpvcHQ6OkRlcml2ZWRBcmdMaXN0ICZBcmdzLCBTdHJpbmdSZWYgQm91bmRBcmNoLAorICAgICAgICAgICAgICAgIEFjdGlvbjo6T2ZmbG9hZEtpbmQgRGV2aWNlT2ZmbG9hZEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBUcmFuc2xhdGVPcGVuTVBUYXJnZXRBcmdzIC0gQ3JlYXRlIGEgbmV3IGRlcml2ZWQgYXJndW1lbnQgbGlzdCBmb3IKKyAgLy8vIHRoYXQgY29udGFpbnMgdGhlIE9wZW5NUCB0YXJnZXQgc3BlY2lmaWMgZmxhZ3MgcGFzc2VkIHZpYQorICAvLy8gLVhvcGVubXAtdGFyZ2V0IC1vcHQ9dmFsIE9SIC1Yb3Blbm1wLXRhcmdldD08dHJpcGxlPiAtb3B0PXZhbAorICB2aXJ0dWFsIGxsdm06Om9wdDo6RGVyaXZlZEFyZ0xpc3QgKlRyYW5zbGF0ZU9wZW5NUFRhcmdldEFyZ3MoCisgICAgICBjb25zdCBsbHZtOjpvcHQ6OkRlcml2ZWRBcmdMaXN0ICZBcmdzLCBib29sIFNhbWVUcmlwbGVBc0hvc3QsCisgICAgICBTbWFsbFZlY3RvckltcGw8bGx2bTo6b3B0OjpBcmcgKj4gJkFsbG9jYXRlZEFyZ3MpIGNvbnN0OworCisgIC8vLyBDaG9vc2UgYSB0b29sIHRvIHVzZSB0byBoYW5kbGUgdGhlIGFjdGlvbiBccCBKQS4KKyAgLy8vCisgIC8vLyBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIHdoZW4gYSBwYXJ0aWN1bGFyIFRvb2xDaGFpbiBuZWVkcyB0byB1c2UKKyAgLy8vIGEgY29tcGlsZXIgb3RoZXIgdGhhbiBDbGFuZy4KKyAgdmlydHVhbCBUb29sICpTZWxlY3RUb29sKGNvbnN0IEpvYkFjdGlvbiAmSkEpIGNvbnN0OworCisgIC8vIEhlbHBlciBtZXRob2RzCisKKyAgc3RkOjpzdHJpbmcgR2V0RmlsZVBhdGgoY29uc3QgY2hhciAqTmFtZSkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nIEdldFByb2dyYW1QYXRoKGNvbnN0IGNoYXIgKk5hbWUpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBsaW5rZXIgcGF0aCwgcmVzcGVjdGluZyB0aGUgLWZ1c2UtbGQ9IGFyZ3VtZW50IHRvIGRldGVybWluZQorICAvLy8gdGhlIGxpbmtlciBzdWZmaXggb3IgbmFtZS4KKyAgc3RkOjpzdHJpbmcgR2V0TGlua2VyUGF0aCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGlzcGF0Y2ggdG8gdGhlIHNwZWNpZmljIHRvb2xjaGFpbiBmb3IgdmVyYm9zZSBwcmludGluZy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgd2hlbiBoYW5kbGluZyB0aGUgdmVyYm9zZSBvcHRpb24gdG8gcHJpbnQgZGV0YWlsZWQsCisgIC8vLyB0b29sY2hhaW4tc3BlY2lmaWMgaW5mb3JtYXRpb24gdXNlZnVsIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBiZWhhdmlvciBvZgorICAvLy8gdGhlIGRyaXZlciBvbiBhIHNwZWNpZmljIHBsYXRmb3JtLgorICB2aXJ0dWFsIHZvaWQgcHJpbnRWZXJib3NlSW5mbyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHt9CisKKyAgLy8gUGxhdGZvcm0gZGVmYXVsdHMgaW5mb3JtYXRpb24KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgdG9vbGNoYWluIGlzIHRhcmdldGluZyBhIG5vbi1uYXRpdmUKKyAgLy8vIGFyY2hpdGVjdHVyZS4KKyAgdmlydHVhbCBib29sIGlzQ3Jvc3NDb21waWxpbmcoKSBjb25zdDsKKworICAvLy8gSGFzTmF0aXZlTFRPTGlua2VyIC0gQ2hlY2sgd2hldGhlciB0aGUgbGlua2VyIGFuZCByZWxhdGVkIHRvb2xzIGhhdmUKKyAgLy8vIG5hdGl2ZSBMTFZNIHN1cHBvcnQuCisgIHZpcnR1YWwgYm9vbCBIYXNOYXRpdmVMTFZNU3VwcG9ydCgpIGNvbnN0OworCisgIC8vLyBMb29rdXBUeXBlRm9yRXh0ZW5zaW9uIC0gUmV0dXJuIHRoZSBkZWZhdWx0IGxhbmd1YWdlIHR5cGUgdG8gdXNlIGZvciB0aGUKKyAgLy8vIGdpdmVuIGV4dGVuc2lvbi4KKyAgdmlydHVhbCB0eXBlczo6SUQgTG9va3VwVHlwZUZvckV4dGVuc2lvbihTdHJpbmdSZWYgRXh0KSBjb25zdDsKKworICAvLy8gSXNCbG9ja3NEZWZhdWx0IC0gRG9lcyB0aGlzIHRvb2wgY2hhaW4gZW5hYmxlIC1mYmxvY2tzIGJ5IGRlZmF1bHQuCisgIHZpcnR1YWwgYm9vbCBJc0Jsb2Nrc0RlZmF1bHQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBJc0ludGVncmF0ZWRBc3NlbWJsZXJEZWZhdWx0IC0gRG9lcyB0aGlzIHRvb2wgY2hhaW4gZW5hYmxlIC1pbnRlZ3JhdGVkLWFzCisgIC8vLyBieSBkZWZhdWx0LgorICB2aXJ0dWFsIGJvb2wgSXNJbnRlZ3JhdGVkQXNzZW1ibGVyRGVmYXVsdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiB0aGUgdG9vbGNoYWluIHNob3VsZCB1c2UgdGhlIGludGVncmF0ZWQgYXNzZW1ibGVyLgorICB2aXJ0dWFsIGJvb2wgdXNlSW50ZWdyYXRlZEFzKCkgY29uc3Q7CisKKyAgLy8vIElzTWF0aEVycm5vRGVmYXVsdCAtIERvZXMgdGhpcyB0b29sIGNoYWluIHVzZSAtZm1hdGgtZXJybm8gYnkgZGVmYXVsdC4KKyAgdmlydHVhbCBib29sIElzTWF0aEVycm5vRGVmYXVsdCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAvLy8gSXNFbmNvZGVFeHRlbmRlZEJsb2NrU2lnbmF0dXJlRGVmYXVsdCAtIERvZXMgdGhpcyB0b29sIGNoYWluIGVuYWJsZQorICAvLy8gLWZlbmNvZGUtZXh0ZW5kZWQtYmxvY2stc2lnbmF0dXJlIGJ5IGRlZmF1bHQuCisgIHZpcnR1YWwgYm9vbCBJc0VuY29kZUV4dGVuZGVkQmxvY2tTaWduYXR1cmVEZWZhdWx0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gSXNPYmpDTm9uRnJhZ2lsZUFCSURlZmF1bHQgLSBEb2VzIHRoaXMgdG9vbCBjaGFpbiBzZXQKKyAgLy8vIC1mb2JqYy1ub25mcmFnaWxlLWFiaSBieSBkZWZhdWx0LgorICB2aXJ0dWFsIGJvb2wgSXNPYmpDTm9uRnJhZ2lsZUFCSURlZmF1bHQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBVc2VPYmpDTWl4ZWREaXNwYXRjaERlZmF1bHQgLSBXaGVuIHVzaW5nIG5vbi1sZWdhY3kgZGlzcGF0Y2gsIHNob3VsZCB0aGUKKyAgLy8vIG1peGVkIGRpc3BhdGNoIG1ldGhvZCBiZSB1c2VkPworICB2aXJ0dWFsIGJvb2wgVXNlT2JqQ01peGVkRGlzcGF0Y2goKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBcYnJpZWYgQ2hlY2sgd2hldGhlciB0byBlbmFibGUgeDg2IHJlbGF4IHJlbG9jYXRpb25zIGJ5IGRlZmF1bHQuCisgIHZpcnR1YWwgYm9vbCB1c2VSZWxheFJlbG9jYXRpb25zKCkgY29uc3Q7CisKKyAgLy8vIEdldERlZmF1bHRTdGFja1Byb3RlY3RvckxldmVsIC0gR2V0IHRoZSBkZWZhdWx0IHN0YWNrIHByb3RlY3RvciBsZXZlbCBmb3IKKyAgLy8vIHRoaXMgdG9vbCBjaGFpbiAoMD1vZmYsIDE9b24sIDI9c3Ryb25nLCAzPWFsbCkuCisgIHZpcnR1YWwgdW5zaWduZWQgR2V0RGVmYXVsdFN0YWNrUHJvdGVjdG9yTGV2ZWwoYm9vbCBLZXJuZWxPcktleHQpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBHZXREZWZhdWx0TGlua2VyIC0gR2V0IHRoZSBkZWZhdWx0IGxpbmtlciB0byB1c2UuCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0RGVmYXVsdExpbmtlcigpIGNvbnN0IHsgcmV0dXJuICJsZCI7IH0KKworICAvLy8gR2V0RGVmYXVsdFJ1bnRpbWVMaWJUeXBlIC0gR2V0IHRoZSBkZWZhdWx0IHJ1bnRpbWUgbGlicmFyeSB2YXJpYW50IHRvIHVzZS4KKyAgdmlydHVhbCBSdW50aW1lTGliVHlwZSBHZXREZWZhdWx0UnVudGltZUxpYlR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIFRvb2xDaGFpbjo6UkxUX0xpYmdjYzsKKyAgfQorCisgIHZpcnR1YWwgQ1hYU3RkbGliVHlwZSBHZXREZWZhdWx0Q1hYU3RkbGliVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVG9vbENoYWluOjpDU1RfTGlic3RkY3h4OworICB9CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRDb21waWxlclJUUGF0aCgpIGNvbnN0OworCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0Q29tcGlsZXJSVChjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaGFyZWQgPSBmYWxzZSkgY29uc3Q7CisKKyAgY29uc3QgY2hhciAqZ2V0Q29tcGlsZXJSVEFyZ1N0cmluZyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNoYXJlZCA9IGZhbHNlKSBjb25zdDsKKworICAvLyBSZXR1cm5zIDxSZXNvdXJjZURpcj4vbGliLzxPU05hbWU+LzxhcmNoPi4gIFRoaXMgaXMgdXNlZCBieSBydW50aW1lcyAoc3VjaAorICAvLyBhcyBPcGVuTVApIHRvIGZpbmQgYXJjaC1zcGVjaWZpYyBsaWJyYXJpZXMuCisgIHN0ZDo6c3RyaW5nIGdldEFyY2hTcGVjaWZpY0xpYlBhdGgoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIDxPU25hbWU+IHBhcnQgb2YgYWJvdmUuCisgIFN0cmluZ1JlZiBnZXRPU0xpYk5hbWUoKSBjb25zdDsKKworICAvLy8gbmVlZHNQcm9maWxlUlQgLSByZXR1cm5zIHRydWUgaWYgaW5zdHJ1bWVudGF0aW9uIHByb2ZpbGUgaXMgb24uCisgIHN0YXRpYyBib29sIG5lZWRzUHJvZmlsZVJUKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncyk7CisKKyAgLy8vIElzVW53aW5kVGFibGVzRGVmYXVsdCAtIERvZXMgdGhpcyB0b29sIGNoYWluIHVzZSAtZnVud2luZC10YWJsZXMKKyAgLy8vIGJ5IGRlZmF1bHQuCisgIHZpcnR1YWwgYm9vbCBJc1Vud2luZFRhYmxlc0RlZmF1bHQoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFRlc3Qgd2hldGhlciB0aGlzIHRvb2xjaGFpbiBkZWZhdWx0cyB0byBQSUMuCisgIHZpcnR1YWwgYm9vbCBpc1BJQ0RlZmF1bHQoKSBjb25zdCA9IDA7CisKKyAgLy8vIFxicmllZiBUZXN0IHdoZXRoZXIgdGhpcyB0b29sY2hhaW4gZGVmYXVsdHMgdG8gUElFLgorICB2aXJ0dWFsIGJvb2wgaXNQSUVEZWZhdWx0KCkgY29uc3QgPSAwOworCisgIC8vLyBcYnJpZWYgVGVzdHMgd2hldGhlciB0aGlzIHRvb2xjaGFpbiBmb3JjZXMgaXRzIGRlZmF1bHQgZm9yIFBJQywgUElFIG9yCisgIC8vLyBub24tUElDLiAgSWYgdGhpcyByZXR1cm5zIHRydWUsIGFueSBQSUMgcmVsYXRlZCBmbGFncyBzaG91bGQgYmUgaWdub3JlZAorICAvLy8gYW5kIGluc3RlYWQgdGhlIHJlc3VsdHMgb2YgXGMgaXNQSUNEZWZhdWx0KCkgYW5kIFxjIGlzUElFRGVmYXVsdCgpIGFyZQorICAvLy8gdXNlZCBleGNsdXNpdmVseS4KKyAgdmlydHVhbCBib29sIGlzUElDRGVmYXVsdEZvcmNlZCgpIGNvbnN0ID0gMDsKKworICAvLy8gU3VwcG9ydHNQcm9maWxpbmcgLSBEb2VzIHRoaXMgdG9vbCBjaGFpbiBzdXBwb3J0IC1wZy4KKyAgdmlydHVhbCBib29sIFN1cHBvcnRzUHJvZmlsaW5nKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBDb21wbGFpbiBpZiB0aGlzIHRvb2wgY2hhaW4gZG9lc24ndCBzdXBwb3J0IE9iamVjdGl2ZS1DIEFSQy4KKyAgdmlydHVhbCB2b2lkIENoZWNrT2JqQ0FSQygpIGNvbnN0IHt9CisKKyAgLy8vIFVzZUR3YXJmRGVidWdGbGFncyAtIEVtYmVkIHRoZSBjb21waWxlIG9wdGlvbnMgdG8gY2xhbmcgaW50byB0aGUgRHdhcmYKKyAgLy8vIGNvbXBpbGUgdW5pdCBpbmZvcm1hdGlvbi4KKyAgdmlydHVhbCBib29sIFVzZUR3YXJmRGVidWdGbGFncygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8gUmV0dXJuIHRoZSBEV0FSRiB2ZXJzaW9uIHRvIGVtaXQsIGluIHRoZSBhYnNlbmNlIG9mIGFyZ3VtZW50cworICAvLyB0byB0aGUgY29udHJhcnkuCisgIHZpcnR1YWwgdW5zaWduZWQgR2V0RGVmYXVsdER3YXJmVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIDQ7IH0KKworICAvLyBUcnVlIGlmIHRoZSBkcml2ZXIgc2hvdWxkIGFzc3VtZSAiLWZzdGFuZGFsb25lLWRlYnVnIgorICAvLyBpbiB0aGUgYWJzZW5jZSBvZiBhbiBvcHRpb24gc3BlY2lmeWluZyBvdGhlcndpc2UsCisgIC8vIHByb3ZpZGVkIHRoYXQgZGVidWdnaW5nIHdhcyByZXF1ZXN0ZWQgaW4gdGhlIGZpcnN0IHBsYWNlLgorICAvLyBpLmUuIGEgdmFsdWUgb2YgJ3RydWUnIGRvZXMgbm90IGltcGx5IHRoYXQgZGVidWdnaW5nIGlzIHdhbnRlZC4KKyAgdmlydHVhbCBib29sIEdldERlZmF1bHRTdGFuZGFsb25lRGVidWcoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vIFJldHVybiB0aGUgZGVmYXVsdCBkZWJ1Z2dlciAidHVuaW5nLiIKKyAgdmlydHVhbCBsbHZtOjpEZWJ1Z2dlcktpbmQgZ2V0RGVmYXVsdERlYnVnZ2VyVHVuaW5nKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjpEZWJ1Z2dlcktpbmQ6OkdEQjsKKyAgfQorCisgIC8vLyBHZXRFeGNlcHRpb25Nb2RlbCAtIFJldHVybiB0aGUgdG9vbCBjaGFpbiBleGNlcHRpb24gbW9kZWwuCisgIHZpcnR1YWwgbGx2bTo6RXhjZXB0aW9uSGFuZGxpbmcKKyAgR2V0RXhjZXB0aW9uTW9kZWwoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzKSBjb25zdDsKKworICAvLy8gU3VwcG9ydHNFbWJlZGRlZEJpdGNvZGUgLSBEb2VzIHRoaXMgdG9vbCBjaGFpbiBzdXBwb3J0IGVtYmVkZGVkIGJpdGNvZGUuCisgIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0VtYmVkZGVkQml0Y29kZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIGdldFRocmVhZE1vZGVsKCkgLSBXaGljaCB0aHJlYWQgbW9kZWwgZG9lcyB0aGlzIHRhcmdldCB1c2U/CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0VGhyZWFkTW9kZWwoKSBjb25zdCB7IHJldHVybiAicG9zaXgiOyB9CisKKyAgLy8vIGlzVGhyZWFkTW9kZWxTdXBwb3J0ZWQoKSAtIERvZXMgdGhpcyB0YXJnZXQgc3VwcG9ydCBhIHRocmVhZCBtb2RlbD8KKyAgdmlydHVhbCBib29sIGlzVGhyZWFkTW9kZWxTdXBwb3J0ZWQoY29uc3QgU3RyaW5nUmVmIE1vZGVsKSBjb25zdDsKKworICAvLy8gQ29tcHV0ZUxMVk1UcmlwbGUgLSBSZXR1cm4gdGhlIExMVk0gdGFyZ2V0IHRyaXBsZSB0byB1c2UsIGFmdGVyIHRha2luZworICAvLy8gY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBpbnRvIGFjY291bnQuCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcKKyAgQ29tcHV0ZUxMVk1UcmlwbGUoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICB0eXBlczo6SUQgSW5wdXRUeXBlID0gdHlwZXM6OlRZX0lOVkFMSUQpIGNvbnN0OworCisgIC8vLyBDb21wdXRlRWZmZWN0aXZlQ2xhbmdUcmlwbGUgLSBSZXR1cm4gdGhlIENsYW5nIHRyaXBsZSB0byB1c2UgZm9yIHRoaXMKKyAgLy8vIHRhcmdldCwgd2hpY2ggbWF5IHRha2UgaW50byBhY2NvdW50IHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiBGb3IKKyAgLy8vIGV4YW1wbGUsIG9uIERhcndpbiB0aGUgLW1tYWNvc3gtdmVyc2lvbi1taW49IGNvbW1hbmQgbGluZSBhcmd1bWVudCAod2hpY2gKKyAgLy8vIHNldHMgdGhlIGRlcGxveW1lbnQgdGFyZ2V0KSBkZXRlcm1pbmVzIHRoZSB2ZXJzaW9uIGluIHRoZSB0cmlwbGUgcGFzc2VkIHRvCisgIC8vLyBDbGFuZy4KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBDb21wdXRlRWZmZWN0aXZlQ2xhbmdUcmlwbGUoCisgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCisgICAgICB0eXBlczo6SUQgSW5wdXRUeXBlID0gdHlwZXM6OlRZX0lOVkFMSUQpIGNvbnN0OworCisgIC8vLyBnZXREZWZhdWx0T2JqQ1J1bnRpbWUgLSBSZXR1cm4gdGhlIGRlZmF1bHQgT2JqZWN0aXZlLUMgcnVudGltZQorICAvLy8gZm9yIHRoaXMgcGxhdGZvcm0uCisgIC8vLworICAvLy8gRklYTUU6IHRoaXMgcmVhbGx5IGJlbG9uZ3Mgb24gc29tZSBzb3J0IG9mIERlcGxveW1lbnRUYXJnZXQgYWJzdHJhY3Rpb24KKyAgdmlydHVhbCBPYmpDUnVudGltZSBnZXREZWZhdWx0T2JqQ1J1bnRpbWUoYm9vbCBpc05vbkZyYWdpbGUpIGNvbnN0OworCisgIC8vLyBoYXNCbG9ja3NSdW50aW1lIC0gR2l2ZW4gdGhhdCB0aGUgdXNlciBpcyBjb21waWxpbmcgd2l0aAorICAvLy8gLWZibG9ja3MsIGRvZXMgdGhpcyB0b29sIGNoYWluIGd1YXJhbnRlZSB0aGUgZXhpc3RlbmNlIG9mIGEKKyAgLy8vIGJsb2NrcyBydW50aW1lPworICAvLy8KKyAgLy8vIEZJWE1FOiB0aGlzIHJlYWxseSBiZWxvbmdzIG9uIHNvbWUgc29ydCBvZiBEZXBsb3ltZW50VGFyZ2V0IGFic3RyYWN0aW9uCisgIHZpcnR1YWwgYm9vbCBoYXNCbG9ja3NSdW50aW1lKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBcYnJpZWYgQWRkIHRoZSBjbGFuZyBjYzEgYXJndW1lbnRzIGZvciBzeXN0ZW0gaW5jbHVkZSBwYXRocy4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIGFkZGluZyB0aGUgbmVjZXNzYXJ5IGNjMSBhcmd1bWVudHMgdG8KKyAgLy8vIGluY2x1ZGUgaGVhZGVycyBmcm9tIHN0YW5kYXJkIHN5c3RlbSBoZWFkZXIgZGlyZWN0b3JpZXMuCisgIHZpcnR1YWwgdm9pZAorICBBZGRDbGFuZ1N5c3RlbUluY2x1ZGVBcmdzKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmRHJpdmVyQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQWRkIG9wdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHBhc3NlZCB0byBjYzEgZm9yIHRoaXMgdGFyZ2V0LgorICB2aXJ0dWFsIHZvaWQgYWRkQ2xhbmdUYXJnZXRPcHRpb25zKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmRHJpdmVyQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOjpPZmZsb2FkS2luZCBEZXZpY2VPZmZsb2FkS2luZCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBBZGQgd2FybmluZyBvcHRpb25zIHRoYXQgbmVlZCB0byBiZSBwYXNzZWQgdG8gY2MxIGZvciB0aGlzIHRhcmdldC4KKyAgdmlydHVhbCB2b2lkIGFkZENsYW5nV2FybmluZ09wdGlvbnMobGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDQzFBcmdzKSBjb25zdDsKKworICAvLyBHZXRSdW50aW1lTGliVHlwZSAtIERldGVybWluZSB0aGUgcnVudGltZSBsaWJyYXJ5IHR5cGUgdG8gdXNlIHdpdGggdGhlCisgIC8vIGdpdmVuIGNvbXBpbGF0aW9uIGFyZ3VtZW50cy4KKyAgdmlydHVhbCBSdW50aW1lTGliVHlwZQorICBHZXRSdW50aW1lTGliVHlwZShjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MpIGNvbnN0OworCisgIC8vIEdldENYWFN0ZGxpYlR5cGUgLSBEZXRlcm1pbmUgdGhlIEMrKyBzdGFuZGFyZCBsaWJyYXJ5IHR5cGUgdG8gdXNlIHdpdGggdGhlCisgIC8vIGdpdmVuIGNvbXBpbGF0aW9uIGFyZ3VtZW50cy4KKyAgdmlydHVhbCBDWFhTdGRsaWJUeXBlIEdldENYWFN0ZGxpYlR5cGUoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzKSBjb25zdDsKKworICAvLy8gQWRkQ2xhbmdDWFhTdGRsaWJJbmNsdWRlQXJncyAtIEFkZCB0aGUgY2xhbmcgLWNjMSBsZXZlbCBhcmd1bWVudHMgdG8gc2V0CisgIC8vLyB0aGUgaW5jbHVkZSBwYXRocyB0byB1c2UgZm9yIHRoZSBnaXZlbiBDKysgc3RhbmRhcmQgbGlicmFyeSB0eXBlLgorICB2aXJ0dWFsIHZvaWQKKyAgQWRkQ2xhbmdDWFhTdGRsaWJJbmNsdWRlQXJncyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkRyaXZlckFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDQzFBcmdzKSBjb25zdDsKKworICAvLy8gUmV0dXJucyBpZiB0aGUgQysrIHN0YW5kYXJkIGxpYnJhcnkgc2hvdWxkIGJlIGxpbmtlZCBpbi4KKyAgLy8vIE5vdGUgdGhhdCBlLmcuIC1sbSBzaG91bGQgc3RpbGwgYmUgbGlua2VkIGV2ZW4gaWYgdGhpcyByZXR1cm5zIGZhbHNlLgorICBib29sIFNob3VsZExpbmtDWFhTdGRsaWIoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzKSBjb25zdDsKKworICAvLy8gQWRkQ1hYU3RkbGliTGliQXJncyAtIEFkZCB0aGUgc3lzdGVtIHNwZWNpZmljIGxpbmtlciBhcmd1bWVudHMgdG8gdXNlCisgIC8vLyBmb3IgdGhlIGdpdmVuIEMrKyBzdGFuZGFyZCBsaWJyYXJ5IHR5cGUuCisgIHZpcnR1YWwgdm9pZCBBZGRDWFhTdGRsaWJMaWJBcmdzKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDbWRBcmdzKSBjb25zdDsKKworICAvLy8gQWRkRmlsZVBhdGhMaWJBcmdzIC0gQWRkIGVhY2ggdGhpbmcgaW4gZ2V0RmlsZVBhdGhzKCkgYXMgYSAiLUwiIG9wdGlvbi4KKyAgdm9pZCBBZGRGaWxlUGF0aExpYkFyZ3MoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0OworCisgIC8vLyBBZGRDQ0tleHRMaWJBcmdzIC0gQWRkIHRoZSBzeXN0ZW0gc3BlY2lmaWMgbGlua2VyIGFyZ3VtZW50cyB0byB1c2UKKyAgLy8vIGZvciBrZXJuZWwgZXh0ZW5zaW9ucyAoRGFyd2luLXNwZWNpZmljKS4KKyAgdmlydHVhbCB2b2lkIEFkZENDS2V4dExpYkFyZ3MoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0OworCisgIC8vLyBBZGRGYXN0TWF0aFJ1bnRpbWVJZkF2YWlsYWJsZSAtIElmIGEgcnVudGltZSBsaWJyYXJ5IGV4aXN0cyB0aGF0IHNldHMKKyAgLy8vIGdsb2JhbCBmbGFncyBmb3IgdW5zYWZlIGZsb2F0aW5nIHBvaW50IG1hdGgsIGFkZCBpdCBhbmQgcmV0dXJuIHRydWUuCisgIC8vLworICAvLy8gVGhpcyBjaGVja3MgZm9yIHByZXNlbmNlIG9mIHRoZSAtT2Zhc3QsIC1mZmFzdC1tYXRoIG9yIC1mdW5zYWZlLW1hdGggZmxhZ3MuCisgIHZpcnR1YWwgYm9vbCBBZGRGYXN0TWF0aFJ1bnRpbWVJZkF2YWlsYWJsZSgKKyAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncywgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDbWRBcmdzKSBjb25zdDsKKworICAvLy8gYWRkUHJvZmlsZVJUTGlicyAtIFdoZW4gLWZwcm9maWxlLWluc3RyLXByb2ZpbGUgaXMgc3BlY2lmaWVkLCB0cnkgdG8gcGFzcworICAvLy8gYSBzdWl0YWJsZSBwcm9maWxlIHJ1bnRpbWUgbGlicmFyeSB0byB0aGUgbGlua2VyLgorICB2aXJ0dWFsIHZvaWQgYWRkUHJvZmlsZVJUTGlicyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ21kQXJncykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBBZGQgYXJndW1lbnRzIHRvIHVzZSBzeXN0ZW0tc3BlY2lmaWMgQ1VEQSBpbmNsdWRlcy4KKyAgdmlydHVhbCB2b2lkIEFkZEN1ZGFJbmNsdWRlQXJncyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkRyaXZlckFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDQzFBcmdzKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEFkZCBhcmd1bWVudHMgdG8gdXNlIE1DVSBHQ0MgdG9vbGNoYWluIGluY2x1ZGVzLgorICB2aXJ0dWFsIHZvaWQgQWRkSUFNQ1VJbmNsdWRlQXJncyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkRyaXZlckFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ0MxQXJncykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBPbiBXaW5kb3dzLCByZXR1cm5zIHRoZSBNU1ZDIGNvbXBhdGliaWxpdHkgdmVyc2lvbi4KKyAgdmlydHVhbCBWZXJzaW9uVHVwbGUgY29tcHV0ZU1TVkNWZXJzaW9uKGNvbnN0IERyaXZlciAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gc2FuaXRpemVycyB3aGljaCBhcmUgYXZhaWxhYmxlIGluIHRoaXMgdG9vbGNoYWluLgorICB2aXJ0dWFsIFNhbml0aXplck1hc2sgZ2V0U3VwcG9ydGVkU2FuaXRpemVycygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHNhbml0aXplcnMgd2hpY2ggYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgdmlydHVhbCBTYW5pdGl6ZXJNYXNrIGdldERlZmF1bHRTYW5pdGl6ZXJzKCkgY29uc3QgeyByZXR1cm4gMDsgfQorfTsKKworLy8vIFNldCBhIFRvb2xDaGFpbidzIGVmZmVjdGl2ZSB0cmlwbGUuIFJlc2V0IGl0IHdoZW4gdGhlIHJlZ2lzdHJhdGlvbiBvYmplY3QKKy8vLyBpcyBkZXN0cm95ZWQuCitjbGFzcyBSZWdpc3RlckVmZmVjdGl2ZVRyaXBsZSB7CisgIGNvbnN0IFRvb2xDaGFpbiAmVEM7CisKK3B1YmxpYzoKKyAgUmVnaXN0ZXJFZmZlY3RpdmVUcmlwbGUoY29uc3QgVG9vbENoYWluICZUQywgbGx2bTo6VHJpcGxlIFQpIDogVEMoVEMpIHsKKyAgICBUQy5zZXRFZmZlY3RpdmVUcmlwbGUoc3RkOjptb3ZlKFQpKTsKKyAgfQorCisgIH5SZWdpc3RlckVmZmVjdGl2ZVRyaXBsZSgpIHsgVEMuc2V0RWZmZWN0aXZlVHJpcGxlKGxsdm06OlRyaXBsZSgpKTsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgZHJpdmVyCisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0RSSVZFUl9UT09MQ0hBSU5fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRHJpdmVyL1R5cGVzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9UeXBlcy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzMGI1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9UeXBlcy5kZWYKQEAgLTAsMCArMSwxMDEgQEAKKy8vPT09LS0tIFR5cGVzLmRlZiAtIERyaXZlciBUeXBlIGluZm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGRyaXZlciB0eXBlIGluZm9ybWF0aW9uLiBVc2VycyBvZiB0aGlzIGZpbGUKKy8vIG11c3QgZGVmaW5lIHRoZSBUWVBFIG1hY3JvIHRvIG1ha2UgdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBUWVBFCisjZXJyb3IgIkRlZmluZSBUWVBFIHByaW9yIHRvIGluY2x1ZGluZyB0aGlzIGZpbGUhIgorI2VuZGlmCisKKy8vIFRZUEUoTkFNRSwgSUQsIFBQX1RZUEUsIFRFTVBfU1VGRklYLCBGTEFHUykKKworLy8gVGhlIGZpcnN0IHZhbHVlIGlzIHRoZSB0eXBlIG5hbWUgYXMgYSBzdHJpbmc7IGZvciB0eXBlcyB3aGljaCBjYW4KKy8vIGJlIHVzZXIgc3BlY2lmaWVkIHRoaXMgc2hvdWxkIGJlIHRoZSBlcXVpdmFsZW50IC14IG9wdGlvbi4KKworLy8gVGhlIHNlY29uZCB2YWx1ZSBpcyB0aGUgdHlwZSBpZCwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYQorLy8gY2xhbmc6OmRyaXZlcjo6dHlwZXM6OlRZX1hYIGVudW0gY29uc3RhbnQuCisKKy8vIFRoZSB0aGlyZCB2YWx1ZSBpcyB0aGF0IGlkIG9mIHRoZSB0eXBlIGZvciBwcmVwcm9jZXNzZWQgaW5wdXRzIG9mCisvLyB0aGlzIHR5cGUsIG9yIElOVkFMSUQgaWYgdGhpcyB0eXBlIGlzIG5vdCBwcmVwcm9jZXNzZWQuCisKKy8vIFRoZSBmb3VydGggdmFsdWUgaXMgdGhlIHN1ZmZpeCB0byB1c2Ugd2hlbiBjcmVhdGluZyB0ZW1wb3JhcnkgZmlsZXMKKy8vIG9mIHRoaXMgdHlwZSwgb3IgbnVsbCBpZiB1bnNwZWNpZmllZC4KKworLy8gVGhlIGZpZnRoIHZhbHVlIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgb3B0aW9uIGZsYWdzLiBWYWxpZCB2YWx1ZXM6CisvLyAgYSAtIFRoZSB0eXBlIHNob3VsZCBvbmx5IGJlIGFzc2VtYmxlZC4KKy8vICBwIC0gVGhlIHR5cGUgc2hvdWxkIG9ubHkgYmUgcHJlY29tcGlsZWQuCisvLyAgdSAtIFRoZSB0eXBlIGNhbiBiZSB1c2VyIHNwZWNpZmllZCAod2l0aCAteCkuCisvLyAgbSAtIFByZWNvbXBpbGluZyB0aGlzIHR5cGUgcHJvZHVjZXMgYSBtb2R1bGUgZmlsZS4KKy8vICBBIC0gVGhlIHR5cGUncyB0ZW1wb3Jhcnkgc3VmZml4IHNob3VsZCBiZSBhcHBlbmRlZCB3aGVuIGdlbmVyYXRpbmcKKy8vICAgICAgb3V0cHV0cyBvZiB0aGlzIHR5cGUuCisKKworLy8gQyBmYW1pbHkgc291cmNlIGxhbmd1YWdlICh3aXRoIGFuZCB3aXRob3V0IHByZXByb2Nlc3NpbmcpLgorVFlQRSgiY3BwLW91dHB1dCIsICAgICAgICAgICAgICAgUFBfQywgICAgICAgICBJTlZBTElELCAgICAgICAgICJpIiwgICAgICJ1IikKK1RZUEUoImMiLCAgICAgICAgICAgICAgICAgICAgICAgIEMsICAgICAgICAgICAgUFBfQywgICAgICAgICAgICAiYyIsICAgICAidSIpCitUWVBFKCJjbCIsICAgICAgICAgICAgICAgICAgICAgICBDTCwgICAgICAgICAgIFBQX0MsICAgICAgICAgICAgImNsIiwgICAgInUiKQorVFlQRSgiY3VkYS1jcHAtb3V0cHV0IiwgICAgICAgICAgUFBfQ1VEQSwgICAgICBJTlZBTElELCAgICAgICAgICJjdWkiLCAgICJ1IikKK1RZUEUoImN1ZGEiLCAgICAgICAgICAgICAgICAgICAgIENVREEsICAgICAgICAgUFBfQ1VEQSwgICAgICAgICAiY3UiLCAgICAidSIpCitUWVBFKCJjdWRhIiwgICAgICAgICAgICAgICAgICAgICBDVURBX0RFVklDRSwgIFBQX0NVREEsICAgICAgICAgImN1IiwgICAgIiIpCitUWVBFKCJvYmplY3RpdmUtYy1jcHAtb3V0cHV0IiwgICBQUF9PYmpDLCAgICAgIElOVkFMSUQsICAgICAgICAgIm1pIiwgICAgInUiKQorVFlQRSgib2JqYy1jcHAtb3V0cHV0IiwgICAgICAgICAgUFBfT2JqQ19BbGlhcywgSU5WQUxJRCwgICAgICAgICJtaSIsICAgICJ1IikKK1RZUEUoIm9iamVjdGl2ZS1jIiwgICAgICAgICAgICAgIE9iakMsICAgICAgICAgUFBfT2JqQywgICAgICAgICAibSIsICAgICAidSIpCitUWVBFKCJjKystY3BwLW91dHB1dCIsICAgICAgICAgICBQUF9DWFgsICAgICAgIElOVkFMSUQsICAgICAgICAgImlpIiwgICAgInUiKQorVFlQRSgiYysrIiwgICAgICAgICAgICAgICAgICAgICAgQ1hYLCAgICAgICAgICBQUF9DWFgsICAgICAgICAgICJjcHAiLCAgICJ1IikKK1RZUEUoIm9iamVjdGl2ZS1jKystY3BwLW91dHB1dCIsIFBQX09iakNYWCwgICAgSU5WQUxJRCwgICAgICAgICAibWlpIiwgICAidSIpCitUWVBFKCJvYmpjKystY3BwLW91dHB1dCIsICAgICAgICBQUF9PYmpDWFhfQWxpYXMsIElOVkFMSUQsICAgICAgIm1paSIsICAgInUiKQorVFlQRSgib2JqZWN0aXZlLWMrKyIsICAgICAgICAgICAgT2JqQ1hYLCAgICAgICBQUF9PYmpDWFgsICAgICAgICJtbSIsICAgICJ1IikKK1RZUEUoInJlbmRlcnNjcmlwdCIsICAgICAgICAgICAgIFJlbmRlclNjcmlwdCwgUFBfQywgICAgICAgICAgICAicnMiLCAgICAidSIpCisKKy8vIEMgZmFtaWx5IGlucHV0IGZpbGVzIHRvIHByZWNvbXBpbGUuCitUWVBFKCJjLWhlYWRlci1jcHAtb3V0cHV0IiwgICAgICBQUF9DSGVhZGVyLCAgIElOVkFMSUQsICAgICAgICAgImkiLCAgICAgInAiKQorVFlQRSgiYy1oZWFkZXIiLCAgICAgICAgICAgICAgICAgQ0hlYWRlciwgICAgICBQUF9DSGVhZGVyLCAgICAgICJoIiwgICAgICJwdSIpCitUWVBFKCJjbC1oZWFkZXIiLCAgICAgICAgICAgICAgICBDTEhlYWRlciwgICAgIFBQX0NIZWFkZXIsICAgICAgImgiLCAgICAgInB1IikKK1RZUEUoIm9iamVjdGl2ZS1jLWhlYWRlci1jcHAtb3V0cHV0IiwgUFBfT2JqQ0hlYWRlciwgSU5WQUxJRCwgICAibWkiLCAgICAicCIpCitUWVBFKCJvYmplY3RpdmUtYy1oZWFkZXIiLCAgICAgICBPYmpDSGVhZGVyLCAgIFBQX09iakNIZWFkZXIsICAgImgiLCAgICAgInB1IikKK1RZUEUoImMrKy1oZWFkZXItY3BwLW91dHB1dCIsICAgIFBQX0NYWEhlYWRlciwgSU5WQUxJRCwgICAgICAgICAiaWkiLCAgICAicCIpCitUWVBFKCJjKystaGVhZGVyIiwgICAgICAgICAgICAgICBDWFhIZWFkZXIsICAgIFBQX0NYWEhlYWRlciwgICAgImhoIiwgICAgInB1IikKK1RZUEUoIm9iamVjdGl2ZS1jKystaGVhZGVyLWNwcC1vdXRwdXQiLCBQUF9PYmpDWFhIZWFkZXIsIElOVkFMSUQsICJtaWkiLCAicCIpCitUWVBFKCJvYmplY3RpdmUtYysrLWhlYWRlciIsICAgICBPYmpDWFhIZWFkZXIsIFBQX09iakNYWEhlYWRlciwgImgiLCAgICAgInB1IikKK1RZUEUoImMrKy1tb2R1bGUiLCAgICAgICAgICAgICAgIENYWE1vZHVsZSwgICAgUFBfQ1hYTW9kdWxlLCAgICAiY3BwbSIsICAibXUiKQorVFlQRSgiYysrLW1vZHVsZS1jcHAtb3V0cHV0IiwgICAgUFBfQ1hYTW9kdWxlLCBJTlZBTElELCAgICAgICAgICJpaW0iLCAgICJtIikKKworLy8gT3RoZXIgbGFuZ3VhZ2VzLgorVFlQRSgiYWRhIiwgICAgICAgICAgICAgICAgICAgICAgQWRhLCAgICAgICAgICBJTlZBTElELCAgICAgICAgIG51bGxwdHIsICJ1IikKK1RZUEUoImFzc2VtYmxlciIsICAgICAgICAgICAgICAgIFBQX0FzbSwgICAgICAgSU5WQUxJRCwgICAgICAgICAicyIsICAgICAiYXUiKQorVFlQRSgiYXNzZW1ibGVyLXdpdGgtY3BwIiwgICAgICAgQXNtLCAgICAgICAgICBQUF9Bc20sICAgICAgICAgICJTIiwgICAgICJhdSIpCitUWVBFKCJmOTUiLCAgICAgICAgICAgICAgICAgICAgICBQUF9Gb3J0cmFuLCAgIElOVkFMSUQsICAgICAgICAgbnVsbHB0ciwgInUiKQorVFlQRSgiZjk1LWNwcC1pbnB1dCIsICAgICAgICAgICAgRm9ydHJhbiwgICAgICBQUF9Gb3J0cmFuLCAgICAgIG51bGxwdHIsICJ1IikKK1RZUEUoImphdmEiLCAgICAgICAgICAgICAgICAgICAgIEphdmEsICAgICAgICAgSU5WQUxJRCwgICAgICAgICBudWxscHRyLCAidSIpCisKKy8vIExMVk0gSVIvTFRPIHR5cGVzLiBXZSBkZWZpbmUgc2VwYXJhdGUgdHlwZXMgZm9yIElSIGFuZCBMVE8gYmVjYXVzZSBMVE8KKy8vIG91dHB1dHMgc2hvdWxkIHVzZSB0aGUgc3RhbmRhcmQgc3VmZml4ZXMuCitUWVBFKCJpciIsICAgICAgICAgICAgICAgICAgICAgICBMTFZNX0lSLCAgICAgIElOVkFMSUQsICAgICAgICAgImxsIiwgICAgInUiKQorVFlQRSgiaXIiLCAgICAgICAgICAgICAgICAgICAgICAgTExWTV9CQywgICAgICBJTlZBTElELCAgICAgICAgICJiYyIsICAgICJ1IikKK1RZUEUoImx0by1pciIsICAgICAgICAgICAgICAgICAgIExUT19JUiwgICAgICAgSU5WQUxJRCwgICAgICAgICAicyIsICAgICAiIikKK1RZUEUoImx0by1iYyIsICAgICAgICAgICAgICAgICAgIExUT19CQywgICAgICAgSU5WQUxJRCwgICAgICAgICAibyIsICAgICAiIikKKworLy8gTWlzYy4KK1RZUEUoImFzdCIsICAgICAgICAgICAgICAgICAgICAgIEFTVCwgICAgICAgICAgSU5WQUxJRCwgICAgICAgICAiYXN0IiwgICAidSIpCitUWVBFKCJwY20iLCAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVGaWxlLCAgIElOVkFMSUQsICAgICAgICAgInBjbSIsICAgInUiKQorVFlQRSgicGxpc3QiLCAgICAgICAgICAgICAgICAgICAgUGxpc3QsICAgICAgICBJTlZBTElELCAgICAgICAgICJwbGlzdCIsICIiKQorVFlQRSgicmV3cml0dGVuLW9iamMiLCAgICAgICAgICAgUmV3cml0dGVuT2JqQyxJTlZBTElELCAgICAgICAgICJjcHAiLCAgICIiKQorVFlQRSgicmV3cml0dGVuLWxlZ2FjeS1vYmpjIiwgICAgUmV3cml0dGVuTGVnYWN5T2JqQyxJTlZBTElELCAgICJjcHAiLCAgICIiKQorVFlQRSgicmVtYXAiLCAgICAgICAgICAgICAgICAgICAgUmVtYXAsICAgICAgICBJTlZBTElELCAgICAgICAgICJyZW1hcCIsICIiKQorVFlQRSgicHJlY29tcGlsZWQtaGVhZGVyIiwgICAgICAgUENILCAgICAgICAgICBJTlZBTElELCAgICAgICAgICJnY2giLCAgICJBIikKK1RZUEUoIm9iamVjdCIsICAgICAgICAgICAgICAgICAgIE9iamVjdCwgICAgICAgSU5WQUxJRCwgICAgICAgICAibyIsICAgICAiIikKK1RZUEUoInRyZWVsYW5nIiwgICAgICAgICAgICAgICAgIFRyZWVsYW5nLCAgICAgSU5WQUxJRCwgICAgICAgICBudWxscHRyLCAidSIpCitUWVBFKCJpbWFnZSIsICAgICAgICAgICAgICAgICAgICBJbWFnZSwgICAgICAgIElOVkFMSUQsICAgICAgICAgIm91dCIsICAgIiIpCitUWVBFKCJkU1lNIiwgICAgICAgICAgICAgICAgICAgICBkU1lNLCAgICAgICAgIElOVkFMSUQsICAgICAgICAgImRTWU0iLCAgIkEiKQorVFlQRSgiZGVwZW5kZW5jaWVzIiwgICAgICAgICAgICAgRGVwZW5kZW5jaWVzLCBJTlZBTElELCAgICAgICAgICJkIiwgICAgICIiKQorVFlQRSgiY3VkYS1mYXRiaW4iLCAgICAgICAgICAgICAgQ1VEQV9GQVRCSU4sICBJTlZBTElELCAgICAgICAgICJmYXRiaW4iLCJBIikKK1RZUEUoIm5vbmUiLCAgICAgICAgICAgICAgICAgICAgIE5vdGhpbmcsICAgICAgSU5WQUxJRCwgICAgICAgICBudWxscHRyLCAidSIpCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvVHlwZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9UeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYTI2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvVHlwZXMuaApAQCAtMCwwICsxLDExNCBAQAorLy89PT0tLS0gVHlwZXMuaCAtIElucHV0ICYgVGVtcG9yYXJ5IERyaXZlciBUeXBlcyAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0RSSVZFUl9UWVBFU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfRFJJVkVSX1RZUEVTX0gKKworI2luY2x1ZGUgImNsYW5nL0RyaXZlci9QaGFzZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBTdHJpbmdSZWY7Cit9CituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGRyaXZlciB7CituYW1lc3BhY2UgdHlwZXMgeworICBlbnVtIElEIHsKKyAgICBUWV9JTlZBTElELAorI2RlZmluZSBUWVBFKE5BTUUsIElELCBQUF9UWVBFLCBURU1QX1NVRkZJWCwgRkxBR1MpIFRZXyMjSUQsCisjaW5jbHVkZSAiY2xhbmcvRHJpdmVyL1R5cGVzLmRlZiIKKyN1bmRlZiBUWVBFCisgICAgVFlfTEFTVAorICB9OworCisgIC8vLyBnZXRUeXBlTmFtZSAtIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdHlwZSBmb3IgXHAgSWQuCisgIGNvbnN0IGNoYXIgKmdldFR5cGVOYW1lKElEIElkKTsKKworICAvLy8gZ2V0UHJlcHJvY2Vzc2VkVHlwZSAtIEdldCB0aGUgSUQgb2YgdGhlIHR5cGUgZm9yIHRoaXMgaW5wdXQgd2hlbgorICAvLy8gaXQgaGFzIGJlZW4gcHJlcHJvY2Vzc2VkLCBvciBJTlZBTElEIGlmIHRoaXMgaW5wdXQgaXMgbm90CisgIC8vLyBwcmVwcm9jZXNzZWQuCisgIElEIGdldFByZXByb2Nlc3NlZFR5cGUoSUQgSWQpOworCisgIC8vLyBnZXRQcmVjb21waWxlZFR5cGUgLSBHZXQgdGhlIElEIG9mIHRoZSB0eXBlIGZvciB0aGlzIGlucHV0IHdoZW4KKyAgLy8vIGl0IGhhcyBiZWVuIHByZWNvbXBpbGVkLCBvciBJTlZBTElEIGlmIHRoaXMgaW5wdXQgaXMgbm90CisgIC8vLyBwcmVjb21waWxlZC4KKyAgSUQgZ2V0UHJlY29tcGlsZWRUeXBlKElEIElkKTsKKworICAvLy8gZ2V0VHlwZVRlbXBTdWZmaXggLSBSZXR1cm4gdGhlIHN1ZmZpeCB0byB1c2Ugd2hlbiBjcmVhdGluZyBhCisgIC8vLyB0ZW1wIGZpbGUgb2YgdGhpcyB0eXBlLCBvciBudWxsIGlmIHVuc3BlY2lmaWVkLgorICBjb25zdCBjaGFyICpnZXRUeXBlVGVtcFN1ZmZpeChJRCBJZCwgYm9vbCBDTE1vZGUgPSBmYWxzZSk7CisKKyAgLy8vIG9ubHlBc3NlbWJsZVR5cGUgLSBTaG91bGQgdGhpcyB0eXBlIG9ubHkgYmUgYXNzZW1ibGVkLgorICBib29sIG9ubHlBc3NlbWJsZVR5cGUoSUQgSWQpOworCisgIC8vLyBvbmx5UHJlY29tcGlsZVR5cGUgLSBTaG91bGQgdGhpcyB0eXBlIG9ubHkgYmUgcHJlY29tcGlsZWQuCisgIGJvb2wgb25seVByZWNvbXBpbGVUeXBlKElEIElkKTsKKworICAvLy8gY2FuVHlwZUJlVXNlclNwZWNpZmllZCAtIENhbiB0aGlzIHR5cGUgYmUgc3BlY2lmaWVkIG9uIHRoZQorICAvLy8gY29tbWFuZCBsaW5lIChieSB0aGUgdHlwZSBuYW1lKTsgdGhpcyBpcyB1c2VkIHdoZW4gZm9yd2FyZGluZworICAvLy8gY29tbWFuZHMgdG8gZ2NjLgorICBib29sIGNhblR5cGVCZVVzZXJTcGVjaWZpZWQoSUQgSWQpOworCisgIC8vLyBhcHBlbmRTdWZmaXhGb3JUeXBlIC0gV2hlbiBnZW5lcmF0aW5nIG91dHB1dHMgb2YgdGhpcyB0eXBlLAorICAvLy8gc2hvdWxkIHRoZSBzdWZmaXggYmUgYXBwZW5kZWQgKGluc3RlYWQgb2YgcmVwbGFjaW5nIHRoZSBleGlzdGluZworICAvLy8gc3VmZml4KS4KKyAgYm9vbCBhcHBlbmRTdWZmaXhGb3JUeXBlKElEIElkKTsKKworICAvLy8gY2FuTGlwb1R5cGUgLSBJcyB0aGlzIHR5cGUgYWNjZXB0YWJsZSBhcyB0aGUgb3V0cHV0IG9mIGEKKyAgLy8vIHVuaXZlcnNhbCBidWlsZCAoY3VycmVudGx5LCBqdXN0IHRoZSBOb3RoaW5nLCBJbWFnZSwgYW5kIE9iamVjdAorICAvLy8gdHlwZXMpLgorICBib29sIGNhbkxpcG9UeXBlKElEIElkKTsKKworICAvLy8gaXNBY2NlcHRlZEJ5Q2xhbmcgLSBDYW4gY2xhbmcgaGFuZGxlIHRoaXMgaW5wdXQgdHlwZS4KKyAgYm9vbCBpc0FjY2VwdGVkQnlDbGFuZyhJRCBJZCk7CisKKyAgLy8vIGlzQ1hYIC0gSXMgdGhpcyBhICJDKysiIGlucHV0IChDKysgYW5kIE9iai1DKysgc291cmNlcyBhbmQgaGVhZGVycykuCisgIGJvb2wgaXNDWFgoSUQgSWQpOworCisgIC8vLyBJcyB0aGlzIExMVk0gSVIuCisgIGJvb2wgaXNMTFZNSVIoSUQgSWQpOworCisgIC8vLyBpc0N1ZGEgLSBJcyB0aGlzIGEgQ1VEQSBpbnB1dC4KKyAgYm9vbCBpc0N1ZGEoSUQgSWQpOworCisgIC8vLyBpc09iakMgLSBJcyB0aGlzIGFuICJPYmpDIiBpbnB1dCAoT2JqLUMgYW5kIE9iai1DKysgc291cmNlcyBhbmQgaGVhZGVycykuCisgIGJvb2wgaXNPYmpDKElEIElkKTsKKworICAvLy8gaXNTcmNGaWxlIC0gSXMgdGhpcyBhIHNvdXJjZSBmaWxlLCBpLmUuIHNvbWV0aGluZyB0aGF0IHN0aWxsIGhhcyB0byBiZQorICAvLy8gcHJlcHJvY2Vzc2VkLiBUaGUgbG9naWMgYmVoaW5kIHRoaXMgaXMgdGhlIHNhbWUgdGhhdCBkZWNpZGVzIGlmIHRoZSBmaXJzdAorICAvLy8gY29tcGlsYXRpb24gcGhhc2UgaXMgYSBwcmVwcm9jZXNzaW5nIG9uZS4KKyAgYm9vbCBpc1NyY0ZpbGUoSUQgSWQpOworCisgIC8vLyBsb29rdXBUeXBlRm9yRXh0ZW5zaW9uIC0gTG9va3VwIHRoZSB0eXBlIHRvIHVzZSBmb3IgdGhlIGZpbGUKKyAgLy8vIGV4dGVuc2lvbiBccCBFeHQuCisgIElEIGxvb2t1cFR5cGVGb3JFeHRlbnNpb24obGx2bTo6U3RyaW5nUmVmIEV4dCk7CisKKyAgLy8vIGxvb2t1cFR5cGVGb3JUeXBTcGVjaWZpZXIgLSBMb29rdXAgdGhlIHR5cGUgdG8gdXNlIGZvciBhIHVzZXIKKyAgLy8vIHNwZWNpZmllZCB0eXBlIG5hbWUuCisgIElEIGxvb2t1cFR5cGVGb3JUeXBlU3BlY2lmaWVyKGNvbnN0IGNoYXIgKk5hbWUpOworCisgIC8vLyBnZXRDb21waWxhdGlvblBoYXNlcyAtIEdldCB0aGUgbGlzdCBvZiBjb21waWxhdGlvbiBwaGFzZXMgKCdQaGFzZXMnKSB0byBiZQorICAvLy8gZG9uZSBmb3IgdHlwZSAnSWQnLgorICB2b2lkIGdldENvbXBpbGF0aW9uUGhhc2VzKAorICAgIElEIElkLAorICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxwaGFzZXM6OklEPiAmUGhhc2VzKTsKKworICAvLy8gbG9va3VwQ1hYVHlwZUZvckNUeXBlIC0gTG9va3VwIENYWCBpbnB1dCB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gZ2l2ZW4KKyAgLy8vIEMgdHlwZSAodXNlZCBmb3IgY2xhbmcrKyBlbXVsYXRpb24gb2YgZysrIGJlaGF2aW91cikKKyAgSUQgbG9va3VwQ1hYVHlwZUZvckNUeXBlKElEIElkKTsKKworICAvLy8gTG9va3VwIGhlYWRlciBmaWxlIGlucHV0IHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byBnaXZlbgorICAvLy8gc291cmNlIGZpbGUgdHlwZSAodXNlZCBmb3IgY2xhbmctY2wgZW11bGF0aW9uIG9mIFxZYykuCisgIElEIGxvb2t1cEhlYWRlclR5cGVGb3JTb3VyY2VUeXBlKElEIElkKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHR5cGVzCit9IC8vIGVuZCBuYW1lc3BhY2UgZHJpdmVyCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvVXRpbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRHJpdmVyL1V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzQ5NWExCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRHJpdmVyL1V0aWwuaApAQCAtMCwwICsxLDMyIEBACisvLz09PS0tLSBVdGlsLmggLSBDb21tb24gRHJpdmVyIFV0aWxpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRFJJVkVSX1VUSUxfSAorI2RlZmluZSBMTFZNX0NMQU5HX0RSSVZFUl9VVElMX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorCituYW1lc3BhY2UgY2xhbmcgeworY2xhc3MgRGlhZ25vc3RpY3NFbmdpbmU7CisKK25hbWVzcGFjZSBkcml2ZXIgeworICBjbGFzcyBBY3Rpb247CisgIGNsYXNzIEpvYkFjdGlvbjsKKworICAvLy8gQXJnU3RyaW5nTWFwIC0gVHlwZSB1c2VkIHRvIG1hcCBhIEpvYkFjdGlvbiB0byBpdHMgcmVzdWx0IGZpbGUuCisgIHR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8Y29uc3QgSm9iQWN0aW9uKiwgY29uc3QgY2hhcio+IEFyZ1N0cmluZ01hcDsKKworICAvLy8gQWN0aW9uTGlzdCAtIFR5cGUgdXNlZCBmb3IgbGlzdHMgb2YgYWN0aW9ucy4KKyAgdHlwZWRlZiBTbWFsbFZlY3RvcjxBY3Rpb24qLCAzPiBBY3Rpb25MaXN0OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZHJpdmVyCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvWFJheUFyZ3MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0RyaXZlci9YUmF5QXJncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1Yjc2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvWFJheUFyZ3MuaApAQCAtMCwwICsxLDM5IEBACisvLz09PS0tLSBYUmF5QXJncy5oIC0gQXJndW1lbnRzIGZvciBYUmF5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX0NMQU5HX0RSSVZFUl9YUkFZQVJHU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfRFJJVkVSX1hSQVlBUkdTX0gKKworI2luY2x1ZGUgImNsYW5nL0RyaXZlci9UeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vT3B0aW9uL0FyZy5oIgorI2luY2x1ZGUgImxsdm0vT3B0aW9uL0FyZ0xpc3QuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBkcml2ZXIgeworCitjbGFzcyBUb29sQ2hhaW47CisKK2NsYXNzIFhSYXlBcmdzIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEFsd2F5c0luc3RydW1lbnRGaWxlczsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IE5ldmVySW5zdHJ1bWVudEZpbGVzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRXh0cmFEZXBzOworICBib29sIFhSYXlJbnN0cnVtZW50ID0gZmFsc2U7CisgIGludCBJbnN0cnVjdGlvblRocmVzaG9sZCA9IDIwMDsKKyAgYm9vbCBYUmF5QWx3YXlzRW1pdEN1c3RvbUV2ZW50cyA9IGZhbHNlOworCitwdWJsaWM6CisgIC8vLyBQYXJzZXMgdGhlIFhSYXkgYXJndW1lbnRzIGZyb20gYW4gYXJndW1lbnQgbGlzdC4KKyAgWFJheUFyZ3MoY29uc3QgVG9vbENoYWluICZUQywgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzKTsKKyAgdm9pZCBhZGRBcmdzKGNvbnN0IFRvb2xDaGFpbiAmVEMsIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ21kQXJncywgdHlwZXM6OklEIElucHV0VHlwZSkgY29uc3Q7Cit9OworCit9IC8vIG5hbWVzcGFjZSBkcml2ZXIKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0RSSVZFUl9YUkFZQVJHU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9FZGl0L0NvbW1pdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRWRpdC9Db21taXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTc0YjhlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRWRpdC9Db21taXQuaApAQCAtMCwwICsxLDE1NSBAQAorLy89PT0tIENvbW1pdC5oIC0gQSB1bml0IG9mIGVkaXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0VESVRfQ09NTUlUX0gKKyNkZWZpbmUgTExWTV9DTEFOR19FRElUX0NPTU1JVF9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9FZGl0L0ZpbGVPZmZzZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgTGFuZ09wdGlvbnM7CitjbGFzcyBQUENvbmRpdGlvbmFsRGlyZWN0aXZlUmVjb3JkOworY2xhc3MgU291cmNlTWFuYWdlcjsKKworbmFtZXNwYWNlIGVkaXQgeworCitjbGFzcyBFZGl0ZWRTb3VyY2U7CisKK2NsYXNzIENvbW1pdCB7CitwdWJsaWM6CisgIGVudW0gRWRpdEtpbmQgeworICAgIEFjdF9JbnNlcnQsCisgICAgQWN0X0luc2VydEZyb21SYW5nZSwKKyAgICBBY3RfUmVtb3ZlCisgIH07CisKKyAgc3RydWN0IEVkaXQgeworICAgIEVkaXRLaW5kIEtpbmQ7CisgICAgU3RyaW5nUmVmIFRleHQ7CisgICAgU291cmNlTG9jYXRpb24gT3JpZ0xvYzsKKyAgICBGaWxlT2Zmc2V0IE9mZnNldDsKKyAgICBGaWxlT2Zmc2V0IEluc2VydEZyb21SYW5nZU9mZnM7CisgICAgdW5zaWduZWQgTGVuZ3RoOworICAgIGJvb2wgQmVmb3JlUHJldjsKKworICAgIFNvdXJjZUxvY2F0aW9uIGdldEZpbGVMb2NhdGlvbihTb3VyY2VNYW5hZ2VyICZTTSkgY29uc3Q7CisgICAgQ2hhclNvdXJjZVJhbmdlIGdldEZpbGVSYW5nZShTb3VyY2VNYW5hZ2VyICZTTSkgY29uc3Q7CisgICAgQ2hhclNvdXJjZVJhbmdlIGdldEluc2VydEZyb21SYW5nZShTb3VyY2VNYW5hZ2VyICZTTSkgY29uc3Q7CisgIH07CisKK3ByaXZhdGU6CisgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNvdXJjZU1ncjsKKyAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzOworICBjb25zdCBQUENvbmRpdGlvbmFsRGlyZWN0aXZlUmVjb3JkICpQUFJlYzsKKyAgRWRpdGVkU291cmNlICpFZGl0b3IgPSBudWxscHRyOworCisgIGJvb2wgSXNDb21taXRhYmxlID0gdHJ1ZTsKKyAgU21hbGxWZWN0b3I8RWRpdCwgOD4gQ2FjaGVkRWRpdHM7CisgIAorICBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yIFN0ckFsbG9jOworCitwdWJsaWM6CisgIGV4cGxpY2l0IENvbW1pdChFZGl0ZWRTb3VyY2UgJkVkaXRvcik7CisgIENvbW1pdChjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLAorICAgICAgICAgY29uc3QgUFBDb25kaXRpb25hbERpcmVjdGl2ZVJlY29yZCAqUFBSZWMgPSBudWxscHRyKQorICAgICAgOiBTb3VyY2VNZ3IoU00pLCBMYW5nT3B0cyhMYW5nT3B0cyksIFBQUmVjKFBQUmVjKSB7fQorCisgIGJvb2wgaXNDb21taXRhYmxlKCkgY29uc3QgeyByZXR1cm4gSXNDb21taXRhYmxlOyB9CisKKyAgYm9vbCBpbnNlcnQoU291cmNlTG9jYXRpb24gbG9jLCBTdHJpbmdSZWYgdGV4dCwgYm9vbCBhZnRlclRva2VuID0gZmFsc2UsCisgICAgICAgICAgICAgIGJvb2wgYmVmb3JlUHJldmlvdXNJbnNlcnRpb25zID0gZmFsc2UpOworCisgIGJvb2wgaW5zZXJ0QWZ0ZXJUb2tlbihTb3VyY2VMb2NhdGlvbiBsb2MsIFN0cmluZ1JlZiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiZWZvcmVQcmV2aW91c0luc2VydGlvbnMgPSBmYWxzZSkgeworICAgIHJldHVybiBpbnNlcnQobG9jLCB0ZXh0LCAvKmFmdGVyVG9rZW49Ki90cnVlLCBiZWZvcmVQcmV2aW91c0luc2VydGlvbnMpOworICB9CisKKyAgYm9vbCBpbnNlcnRCZWZvcmUoU291cmNlTG9jYXRpb24gbG9jLCBTdHJpbmdSZWYgdGV4dCkgeworICAgIHJldHVybiBpbnNlcnQobG9jLCB0ZXh0LCAvKmFmdGVyVG9rZW49Ki9mYWxzZSwKKyAgICAgICAgICAgICAgICAgIC8qYmVmb3JlUHJldmlvdXNJbnNlcnRpb25zPSovdHJ1ZSk7CisgIH0KKworICBib29sIGluc2VydEZyb21SYW5nZShTb3VyY2VMb2NhdGlvbiBsb2MsIENoYXJTb3VyY2VSYW5nZSByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZnRlclRva2VuID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmVmb3JlUHJldmlvdXNJbnNlcnRpb25zID0gZmFsc2UpOworICBib29sIGluc2VydFdyYXAoU3RyaW5nUmVmIGJlZm9yZSwgQ2hhclNvdXJjZVJhbmdlIHJhbmdlLCBTdHJpbmdSZWYgYWZ0ZXIpOworCisgIGJvb2wgcmVtb3ZlKENoYXJTb3VyY2VSYW5nZSByYW5nZSk7CisKKyAgYm9vbCByZXBsYWNlKENoYXJTb3VyY2VSYW5nZSByYW5nZSwgU3RyaW5nUmVmIHRleHQpOworICBib29sIHJlcGxhY2VXaXRoSW5uZXIoQ2hhclNvdXJjZVJhbmdlIHJhbmdlLCBDaGFyU291cmNlUmFuZ2UgaW5uZXJSYW5nZSk7CisgIGJvb2wgcmVwbGFjZVRleHQoU291cmNlTG9jYXRpb24gbG9jLCBTdHJpbmdSZWYgdGV4dCwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgcmVwbGFjZW1lbnRUZXh0KTsKKworICBib29sIGluc2VydEZyb21SYW5nZShTb3VyY2VMb2NhdGlvbiBsb2MsIFNvdXJjZVJhbmdlIFRva2VuUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWZ0ZXJUb2tlbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJlZm9yZVByZXZpb3VzSW5zZXJ0aW9ucyA9IGZhbHNlKSB7CisgICAgcmV0dXJuIGluc2VydEZyb21SYW5nZShsb2MsIENoYXJTb3VyY2VSYW5nZTo6Z2V0VG9rZW5SYW5nZShUb2tlblJhbmdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyVG9rZW4sIGJlZm9yZVByZXZpb3VzSW5zZXJ0aW9ucyk7CisgIH0KKworICBib29sIGluc2VydFdyYXAoU3RyaW5nUmVmIGJlZm9yZSwgU291cmNlUmFuZ2UgVG9rZW5SYW5nZSwgU3RyaW5nUmVmIGFmdGVyKSB7CisgICAgcmV0dXJuIGluc2VydFdyYXAoYmVmb3JlLCBDaGFyU291cmNlUmFuZ2U6OmdldFRva2VuUmFuZ2UoVG9rZW5SYW5nZSksIGFmdGVyKTsKKyAgfQorCisgIGJvb2wgcmVtb3ZlKFNvdXJjZVJhbmdlIFRva2VuUmFuZ2UpIHsKKyAgICByZXR1cm4gcmVtb3ZlKENoYXJTb3VyY2VSYW5nZTo6Z2V0VG9rZW5SYW5nZShUb2tlblJhbmdlKSk7CisgIH0KKworICBib29sIHJlcGxhY2UoU291cmNlUmFuZ2UgVG9rZW5SYW5nZSwgU3RyaW5nUmVmIHRleHQpIHsKKyAgICByZXR1cm4gcmVwbGFjZShDaGFyU291cmNlUmFuZ2U6OmdldFRva2VuUmFuZ2UoVG9rZW5SYW5nZSksIHRleHQpOworICB9CisKKyAgYm9vbCByZXBsYWNlV2l0aElubmVyKFNvdXJjZVJhbmdlIFRva2VuUmFuZ2UsIFNvdXJjZVJhbmdlIFRva2VuSW5uZXJSYW5nZSkgeworICAgIHJldHVybiByZXBsYWNlV2l0aElubmVyKENoYXJTb3VyY2VSYW5nZTo6Z2V0VG9rZW5SYW5nZShUb2tlblJhbmdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU291cmNlUmFuZ2U6OmdldFRva2VuUmFuZ2UoVG9rZW5Jbm5lclJhbmdlKSk7CisgIH0KKworICB1c2luZyBlZGl0X2l0ZXJhdG9yID0gU21hbGxWZWN0b3JJbXBsPEVkaXQ+Ojpjb25zdF9pdGVyYXRvcjsKKworICBlZGl0X2l0ZXJhdG9yIGVkaXRfYmVnaW4oKSBjb25zdCB7IHJldHVybiBDYWNoZWRFZGl0cy5iZWdpbigpOyB9CisgIGVkaXRfaXRlcmF0b3IgZWRpdF9lbmQoKSBjb25zdCB7IHJldHVybiBDYWNoZWRFZGl0cy5lbmQoKTsgfQorCitwcml2YXRlOgorICB2b2lkIGFkZEluc2VydChTb3VyY2VMb2NhdGlvbiBPcmlnTG9jLAorICAgICAgICAgICAgICAgIEZpbGVPZmZzZXQgT2ZmcywgU3RyaW5nUmVmIHRleHQsIGJvb2wgYmVmb3JlUHJldmlvdXNJbnNlcnRpb25zKTsKKyAgdm9pZCBhZGRJbnNlcnRGcm9tUmFuZ2UoU291cmNlTG9jYXRpb24gT3JpZ0xvYywgRmlsZU9mZnNldCBPZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlT2Zmc2V0IFJhbmdlT2ZmcywgdW5zaWduZWQgUmFuZ2VMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmVmb3JlUHJldmlvdXNJbnNlcnRpb25zKTsKKyAgdm9pZCBhZGRSZW1vdmUoU291cmNlTG9jYXRpb24gT3JpZ0xvYywgRmlsZU9mZnNldCBPZmZzLCB1bnNpZ25lZCBMZW4pOworCisgIGJvb2wgY2FuSW5zZXJ0KFNvdXJjZUxvY2F0aW9uIGxvYywgRmlsZU9mZnNldCAmT2Zmc2V0KTsKKyAgYm9vbCBjYW5JbnNlcnRBZnRlclRva2VuKFNvdXJjZUxvY2F0aW9uIGxvYywgRmlsZU9mZnNldCAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gJkFmdGVyTG9jKTsKKyAgYm9vbCBjYW5JbnNlcnRJbk9mZnNldChTb3VyY2VMb2NhdGlvbiBPcmlnTG9jLCBGaWxlT2Zmc2V0IE9mZnMpOworICBib29sIGNhblJlbW92ZVJhbmdlKENoYXJTb3VyY2VSYW5nZSByYW5nZSwgRmlsZU9mZnNldCAmT2ZmcywgdW5zaWduZWQgJkxlbik7CisgIGJvb2wgY2FuUmVwbGFjZVRleHQoU291cmNlTG9jYXRpb24gbG9jLCBTdHJpbmdSZWYgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICBGaWxlT2Zmc2V0ICZPZmZzLCB1bnNpZ25lZCAmTGVuKTsKKworICB2b2lkIGNvbW1pdEluc2VydChGaWxlT2Zmc2V0IG9mZnNldCwgU3RyaW5nUmVmIHRleHQsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYmVmb3JlUHJldmlvdXNJbnNlcnRpb25zKTsKKyAgdm9pZCBjb21taXRSZW1vdmUoRmlsZU9mZnNldCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCk7CisKKyAgYm9vbCBpc0F0U3RhcnRPZk1hY3JvRXhwYW5zaW9uKFNvdXJjZUxvY2F0aW9uIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICpNYWNyb0JlZ2luID0gbnVsbHB0cikgY29uc3Q7CisgIGJvb2wgaXNBdEVuZE9mTWFjcm9FeHBhbnNpb24oU291cmNlTG9jYXRpb24gbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICpNYWNyb0VuZCA9IG51bGxwdHIpIGNvbnN0OworfTsKKworfSAvLyBuYW1lc3BhY2UgZWRpdAorCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19FRElUX0NPTU1JVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9FZGl0L0VkaXRlZFNvdXJjZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRWRpdC9FZGl0ZWRTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDMzNjg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRWRpdC9FZGl0ZWRTb3VyY2UuaApAQCAtMCwwICsxLDExOCBAQAorLy89PT0tIEVkaXRlZFNvdXJjZS5oIC0gQ29sbGVjdGlvbiBvZiBzb3VyY2UgZWRpdHMgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0VESVRfRURJVEVEU09VUkNFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19FRElUX0VESVRFRFNPVVJDRV9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9FZGl0L0ZpbGVPZmZzZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBMYW5nT3B0aW9uczsKK2NsYXNzIFBQQ29uZGl0aW9uYWxEaXJlY3RpdmVSZWNvcmQ7CitjbGFzcyBTb3VyY2VNYW5hZ2VyOworCituYW1lc3BhY2UgZWRpdCB7CisKK2NsYXNzIENvbW1pdDsKK2NsYXNzIEVkaXRzUmVjZWl2ZXI7CisKK2NsYXNzIEVkaXRlZFNvdXJjZSB7CisgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNvdXJjZU1ncjsKKyAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzOworICBjb25zdCBQUENvbmRpdGlvbmFsRGlyZWN0aXZlUmVjb3JkICpQUFJlYzsKKworICBzdHJ1Y3QgRmlsZUVkaXQgeworICAgIFN0cmluZ1JlZiBUZXh0OworICAgIHVuc2lnbmVkIFJlbW92ZUxlbiA9IDA7CisKKyAgICBGaWxlRWRpdCgpID0gZGVmYXVsdDsKKyAgfTsKKworICB1c2luZyBGaWxlRWRpdHNUeSA9IHN0ZDo6bWFwPEZpbGVPZmZzZXQsIEZpbGVFZGl0PjsKKworICBGaWxlRWRpdHNUeSBGaWxlRWRpdHM7CisKKyAgc3RydWN0IE1hY3JvQXJnVXNlIHsKKyAgICBJZGVudGlmaWVySW5mbyAqSWRlbnRpZmllcjsKKyAgICBTb3VyY2VMb2NhdGlvbiBJbW1lZGlhdGVFeHBhbnNpb25Mb2M7CisKKyAgICAvLyBMb2NhdGlvbiBvZiBhcmd1bWVudCB1c2UgaW5zaWRlIHRoZSB0b3AtbGV2ZWwgbWFjcm8KKyAgICBTb3VyY2VMb2NhdGlvbiBVc2VMb2M7CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFjcm9BcmdVc2UgJk90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoSWRlbnRpZmllciwgSW1tZWRpYXRlRXhwYW5zaW9uTG9jLCBVc2VMb2MpID09CisgICAgICAgICAgICAgc3RkOjp0aWUoT3RoZXIuSWRlbnRpZmllciwgT3RoZXIuSW1tZWRpYXRlRXhwYW5zaW9uTG9jLAorICAgICAgICAgICAgICAgICAgICAgIE90aGVyLlVzZUxvYyk7CisgICAgfQorICB9OworCisgIGxsdm06OkRlbnNlTWFwPHVuc2lnbmVkLCBTbWFsbFZlY3RvcjxNYWNyb0FyZ1VzZSwgMj4+IEV4cGFuc2lvblRvQXJnTWFwOworICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8U291cmNlTG9jYXRpb24sIE1hY3JvQXJnVXNlPiwgMj4KKyAgICBDdXJyQ29tbWl0TWFjcm9BcmdFeHBzOworCisgIElkZW50aWZpZXJUYWJsZSBJZGVudFRhYmxlOworICBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yIFN0ckFsbG9jOworCitwdWJsaWM6CisgIEVkaXRlZFNvdXJjZShjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLAorICAgICAgICAgICAgICAgY29uc3QgUFBDb25kaXRpb25hbERpcmVjdGl2ZVJlY29yZCAqUFBSZWMgPSBudWxscHRyKQorICAgICAgOiBTb3VyY2VNZ3IoU00pLCBMYW5nT3B0cyhMYW5nT3B0cyksIFBQUmVjKFBQUmVjKSwgSWRlbnRUYWJsZShMYW5nT3B0cykge30KKworICBjb25zdCBTb3VyY2VNYW5hZ2VyICZnZXRTb3VyY2VNYW5hZ2VyKCkgY29uc3QgeyByZXR1cm4gU291cmNlTWdyOyB9CisgIGNvbnN0IExhbmdPcHRpb25zICZnZXRMYW5nT3B0cygpIGNvbnN0IHsgcmV0dXJuIExhbmdPcHRzOyB9CisKKyAgY29uc3QgUFBDb25kaXRpb25hbERpcmVjdGl2ZVJlY29yZCAqZ2V0UFBDb25kRGlyZWN0aXZlUmVjb3JkKCkgY29uc3QgeworICAgIHJldHVybiBQUFJlYzsKKyAgfQorCisgIGJvb2wgY2FuSW5zZXJ0SW5PZmZzZXQoU291cmNlTG9jYXRpb24gT3JpZ0xvYywgRmlsZU9mZnNldCBPZmZzKTsKKworICBib29sIGNvbW1pdChjb25zdCBDb21taXQgJmNvbW1pdCk7CisgIAorICB2b2lkIGFwcGx5UmV3cml0ZXMoRWRpdHNSZWNlaXZlciAmcmVjZWl2ZXIsIGJvb2wgYWRqdXN0UmVtb3ZhbHMgPSB0cnVlKTsKKyAgdm9pZCBjbGVhclJld3JpdGVzKCk7CisKKyAgU3RyaW5nUmVmIGNvcHlTdHJpbmcoU3RyaW5nUmVmIHN0cikgeyByZXR1cm4gc3RyLmNvcHkoU3RyQWxsb2MpOyB9CisgIFN0cmluZ1JlZiBjb3B5U3RyaW5nKGNvbnN0IFR3aW5lICZ0d2luZSk7CisKK3ByaXZhdGU6CisgIGJvb2wgY29tbWl0SW5zZXJ0KFNvdXJjZUxvY2F0aW9uIE9yaWdMb2MsIEZpbGVPZmZzZXQgT2ZmcywgU3RyaW5nUmVmIHRleHQsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYmVmb3JlUHJldmlvdXNJbnNlcnRpb25zKTsKKyAgYm9vbCBjb21taXRJbnNlcnRGcm9tUmFuZ2UoU291cmNlTG9jYXRpb24gT3JpZ0xvYywgRmlsZU9mZnNldCBPZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlT2Zmc2V0IEluc2VydEZyb21SYW5nZU9mZnMsIHVuc2lnbmVkIExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiZWZvcmVQcmV2aW91c0luc2VydGlvbnMpOworICB2b2lkIGNvbW1pdFJlbW92ZShTb3VyY2VMb2NhdGlvbiBPcmlnTG9jLCBGaWxlT2Zmc2V0IEJlZ2luT2ZmcywgdW5zaWduZWQgTGVuKTsKKworICBTdHJpbmdSZWYgZ2V0U291cmNlVGV4dChGaWxlT2Zmc2V0IEJlZ2luT2ZmcywgRmlsZU9mZnNldCBFbmRPZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZJbnZhbGlkKTsKKyAgRmlsZUVkaXRzVHk6Oml0ZXJhdG9yIGdldEFjdGlvbkZvck9mZnNldChGaWxlT2Zmc2V0IE9mZnMpOworICB2b2lkIGRlY29uc3RydWN0TWFjcm9BcmdMb2MoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gJkV4cGFuc2lvbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQXJnVXNlICZBcmdVc2UpOworCisgIHZvaWQgc3RhcnRpbmdDb21taXQoKTsKKyAgdm9pZCBmaW5pc2hlZENvbW1pdCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgZWRpdAorCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19FRElUX0VESVRFRFNPVVJDRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9FZGl0L0VkaXRzUmVjZWl2ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0VkaXQvRWRpdHNSZWNlaXZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZDQzNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9FZGl0L0VkaXRzUmVjZWl2ZXIuaApAQCAtMCwwICsxLDM0IEBACisvLz09PS0gRWRpdGVkU291cmNlLmggLSBDb2xsZWN0aW9uIG9mIHNvdXJjZSBlZGl0cyAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRURJVF9FRElUU1JFQ0VJVkVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19FRElUX0VESVRTUkVDRUlWRVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgZWRpdCB7CisKK2NsYXNzIEVkaXRzUmVjZWl2ZXIgeworcHVibGljOgorICB2aXJ0dWFsIH5FZGl0c1JlY2VpdmVyKCkgPSBkZWZhdWx0OworCisgIHZpcnR1YWwgdm9pZCBpbnNlcnQoU291cmNlTG9jYXRpb24gbG9jLCBTdHJpbmdSZWYgdGV4dCkgPSAwOworICB2aXJ0dWFsIHZvaWQgcmVwbGFjZShDaGFyU291cmNlUmFuZ2UgcmFuZ2UsIFN0cmluZ1JlZiB0ZXh0KSA9IDA7CisKKyAgLy8vIFxicmllZiBCeSBkZWZhdWx0IGl0IGNhbGxzIHJlcGxhY2Ugd2l0aCBhbiBlbXB0eSBzdHJpbmcuCisgIHZpcnR1YWwgdm9pZCByZW1vdmUoQ2hhclNvdXJjZVJhbmdlIHJhbmdlKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGVkaXQKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0VESVRfRURJVFNSRUNFSVZFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9FZGl0L0ZpbGVPZmZzZXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0VkaXQvRmlsZU9mZnNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYzFiOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9FZGl0L0ZpbGVPZmZzZXQuaApAQCAtMCwwICsxLDY2IEBACisvLz09PS0gRmlsZU9mZnNldC5oIC0gT2Zmc2V0IGluIGEgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRURJVF9GSUxFT0ZGU0VUX0gKKyNkZWZpbmUgTExWTV9DTEFOR19FRElUX0ZJTEVPRkZTRVRfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlIDx0dXBsZT4KKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBlZGl0IHsKKworY2xhc3MgRmlsZU9mZnNldCB7CisgIEZpbGVJRCBGSUQ7CisgIHVuc2lnbmVkIE9mZnMgPSAwOworCitwdWJsaWM6CisgIEZpbGVPZmZzZXQoKSA9IGRlZmF1bHQ7CisgIEZpbGVPZmZzZXQoRmlsZUlEIGZpZCwgdW5zaWduZWQgb2ZmcykgOiBGSUQoZmlkKSwgT2ZmcyhvZmZzKSB7fQorCisgIGJvb2wgaXNJbnZhbGlkKCkgY29uc3QgeyByZXR1cm4gRklELmlzSW52YWxpZCgpOyB9CisKKyAgRmlsZUlEIGdldEZJRCgpIGNvbnN0IHsgcmV0dXJuIEZJRDsgfQorICB1bnNpZ25lZCBnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBPZmZzOyB9CisKKyAgRmlsZU9mZnNldCBnZXRXaXRoT2Zmc2V0KHVuc2lnbmVkIG9mZnNldCkgY29uc3QgeworICAgIEZpbGVPZmZzZXQgTmV3T2ZmcyA9ICp0aGlzOworICAgIE5ld09mZnMuT2ZmcyArPSBvZmZzZXQ7CisgICAgcmV0dXJuIE5ld09mZnM7CisgIH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KEZpbGVPZmZzZXQgTEhTLCBGaWxlT2Zmc2V0IFJIUykgeworICAgIHJldHVybiBMSFMuRklEID09IFJIUy5GSUQgJiYgTEhTLk9mZnMgPT0gUkhTLk9mZnM7CisgIH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KEZpbGVPZmZzZXQgTEhTLCBGaWxlT2Zmc2V0IFJIUykgeworICAgIHJldHVybiAhKExIUyA9PSBSSFMpOworICB9CisKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KEZpbGVPZmZzZXQgTEhTLCBGaWxlT2Zmc2V0IFJIUykgeworICAgIHJldHVybiBzdGQ6OnRpZShMSFMuRklELCBMSFMuT2ZmcykgPCBzdGQ6OnRpZShSSFMuRklELCBSSFMuT2Zmcyk7CisgIH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvcj4oRmlsZU9mZnNldCBMSFMsIEZpbGVPZmZzZXQgUkhTKSB7CisgICAgcmV0dXJuIFJIUyA8IExIUzsKKyAgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yPj0oRmlsZU9mZnNldCBMSFMsIEZpbGVPZmZzZXQgUkhTKSB7CisgICAgcmV0dXJuICEoTEhTIDwgUkhTKTsKKyAgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yPD0oRmlsZU9mZnNldCBMSFMsIEZpbGVPZmZzZXQgUkhTKSB7CisgICAgcmV0dXJuICEoUkhTIDwgTEhTKTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgZWRpdAorfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfRURJVF9GSUxFT0ZGU0VUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0VkaXQvUmV3cml0ZXJzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9FZGl0L1Jld3JpdGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MGVkMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9FZGl0L1Jld3JpdGVycy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09LS0tIFJld3JpdGVycy5oIC0gUmV3cml0aW5ncyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19FRElUX1JFV1JJVEVSU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfRURJVF9SRVdSSVRFUlNfSAorCituYW1lc3BhY2UgY2xhbmcgeworICBjbGFzcyBPYmpDTWVzc2FnZUV4cHI7CisgIGNsYXNzIE9iakNNZXRob2REZWNsOworICBjbGFzcyBPYmpDSW50ZXJmYWNlRGVjbDsKKyAgY2xhc3MgT2JqQ1Byb3RvY29sRGVjbDsKKyAgY2xhc3MgTlNBUEk7CisgIGNsYXNzIEVudW1EZWNsOworICBjbGFzcyBUeXBlZGVmRGVjbDsKKyAgY2xhc3MgUGFyZW50TWFwOworCituYW1lc3BhY2UgZWRpdCB7CisgIGNsYXNzIENvbW1pdDsKKworYm9vbCByZXdyaXRlT2JqQ1JlZHVuZGFudENhbGxXaXRoTGl0ZXJhbChjb25zdCBPYmpDTWVzc2FnZUV4cHIgKk1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTlNBUEkgJk5TLCBDb21taXQgJmNvbW1pdCk7CisKK2Jvb2wgcmV3cml0ZVRvT2JqQ0xpdGVyYWxTeW50YXgoY29uc3QgT2JqQ01lc3NhZ2VFeHByICpNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5TQVBJICZOUywgQ29tbWl0ICZjb21taXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmVudE1hcCAqUE1hcCk7CisgIAorYm9vbCByZXdyaXRlVG9PYmpDU3Vic2NyaXB0U3ludGF4KGNvbnN0IE9iakNNZXNzYWdlRXhwciAqTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5TQVBJICZOUywgQ29tbWl0ICZjb21taXQpOworCit9CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gb3JtYXQvRm9ybWF0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gb3JtYXQvRm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4YjZjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zvcm1hdC9Gb3JtYXQuaApAQCAtMCwwICsxLDIwNDYgQEAKKy8vPT09LS0tIEZvcm1hdC5oIC0gRm9ybWF0IEMrKyBjb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFZhcmlvdXMgZnVuY3Rpb25zIHRvIGNvbmZpZ3VyYWJseSBmb3JtYXQgc291cmNlIGNvZGUuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19GT1JNQVRfRk9STUFUX0gKKyNkZWZpbmUgTExWTV9DTEFOR19GT1JNQVRfRk9STUFUX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xhbmdPcHRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9Db3JlL1JlcGxhY2VtZW50LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIExleGVyOworY2xhc3MgU291cmNlTWFuYWdlcjsKK2NsYXNzIERpYWdub3N0aWNDb25zdW1lcjsKKworbmFtZXNwYWNlIHZmcyB7CitjbGFzcyBGaWxlU3lzdGVtOworfQorCituYW1lc3BhY2UgZm9ybWF0IHsKKworZW51bSBjbGFzcyBQYXJzZUVycm9yIHsgU3VjY2VzcyA9IDAsIEVycm9yLCBVbnN1aXRhYmxlIH07CitjbGFzcyBQYXJzZUVycm9yQ2F0ZWdvcnkgZmluYWwgOiBwdWJsaWMgc3RkOjplcnJvcl9jYXRlZ29yeSB7CitwdWJsaWM6CisgIGNvbnN0IGNoYXIgKm5hbWUoKSBjb25zdCBub2V4Y2VwdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgbWVzc2FnZShpbnQgRVYpIGNvbnN0IG92ZXJyaWRlOworfTsKK2NvbnN0IHN0ZDo6ZXJyb3JfY2F0ZWdvcnkgJmdldFBhcnNlQ2F0ZWdvcnkoKTsKK3N0ZDo6ZXJyb3JfY29kZSBtYWtlX2Vycm9yX2NvZGUoUGFyc2VFcnJvciBlKTsKKworLy8vIFxicmllZiBUaGUgYGBGb3JtYXRTdHlsZWBgIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBmb3JtYXR0aW5nIHRvIGZvbGxvdworLy8vIHNwZWNpZmljIGd1aWRlbGluZXMuCitzdHJ1Y3QgRm9ybWF0U3R5bGUgeworICAvLy8gXGJyaWVmIFRoZSBleHRyYSBpbmRlbnQgb3Igb3V0ZGVudCBvZiBhY2Nlc3MgbW9kaWZpZXJzLCBlLmcuIGBgcHVibGljOmBgLgorICBpbnQgQWNjZXNzTW9kaWZpZXJPZmZzZXQ7CisKKyAgLy8vIFxicmllZiBEaWZmZXJlbnQgc3R5bGVzIGZvciBhbGlnbmluZyBhZnRlciBvcGVuIGJyYWNrZXRzLgorICBlbnVtIEJyYWNrZXRBbGlnbm1lbnRTdHlsZSB7CisgICAgLy8vIFxicmllZiBBbGlnbiBwYXJhbWV0ZXJzIG9uIHRoZSBvcGVuIGJyYWNrZXQsIGUuZy46CisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgc29tZUxvbmdGdW5jdGlvbihhcmd1bWVudDEsCisgICAgLy8vICAgICAgICAgICAgICAgICAgICBhcmd1bWVudDIpOworICAgIC8vLyBcZW5kY29kZQorICAgIEJBU19BbGlnbiwKKyAgICAvLy8gXGJyaWVmIERvbid0IGFsaWduLCBpbnN0ZWFkIHVzZSBgYENvbnRpbnVhdGlvbkluZGVudFdpZHRoYGAsIGUuZy46CisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgc29tZUxvbmdGdW5jdGlvbihhcmd1bWVudDEsCisgICAgLy8vICAgICAgIGFyZ3VtZW50Mik7CisgICAgLy8vIFxlbmRjb2RlCisgICAgQkFTX0RvbnRBbGlnbiwKKyAgICAvLy8gXGJyaWVmIEFsd2F5cyBicmVhayBhZnRlciBhbiBvcGVuIGJyYWNrZXQsIGlmIHRoZSBwYXJhbWV0ZXJzIGRvbid0IGZpdAorICAgIC8vLyBvbiBhIHNpbmdsZSBsaW5lLCBlLmcuOgorICAgIC8vLyBcY29kZQorICAgIC8vLyAgIHNvbWVMb25nRnVuY3Rpb24oCisgICAgLy8vICAgICAgIGFyZ3VtZW50MSwgYXJndW1lbnQyKTsKKyAgICAvLy8gXGVuZGNvZGUKKyAgICBCQVNfQWx3YXlzQnJlYWssCisgIH07CisKKyAgLy8vIFxicmllZiBJZiBgYHRydWVgYCwgaG9yaXpvbnRhbGx5IGFsaWducyBhcmd1bWVudHMgYWZ0ZXIgYW4gb3BlbiBicmFja2V0LgorICAvLy8KKyAgLy8vIFRoaXMgYXBwbGllcyB0byByb3VuZCBicmFja2V0cyAocGFyZW50aGVzZXMpLCBhbmdsZSBicmFja2V0cyBhbmQgc3F1YXJlCisgIC8vLyBicmFja2V0cy4KKyAgQnJhY2tldEFsaWdubWVudFN0eWxlIEFsaWduQWZ0ZXJPcGVuQnJhY2tldDsKKworICAvLy8gXGJyaWVmIElmIGBgdHJ1ZWBgLCBhbGlnbnMgY29uc2VjdXRpdmUgYXNzaWdubWVudHMuCisgIC8vLworICAvLy8gVGhpcyB3aWxsIGFsaWduIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9ycyBvZiBjb25zZWN1dGl2ZSBsaW5lcy4gVGhpcworICAvLy8gd2lsbCByZXN1bHQgaW4gZm9ybWF0dGluZ3MgbGlrZQorICAvLy8gXGNvZGUKKyAgLy8vICAgaW50IGFhYWEgPSAxMjsKKyAgLy8vICAgaW50IGIgICAgPSAyMzsKKyAgLy8vICAgaW50IGNjYyAgPSAyMzsKKyAgLy8vIFxlbmRjb2RlCisgIGJvb2wgQWxpZ25Db25zZWN1dGl2ZUFzc2lnbm1lbnRzOworCisgIC8vLyBcYnJpZWYgSWYgYGB0cnVlYGAsIGFsaWducyBjb25zZWN1dGl2ZSBkZWNsYXJhdGlvbnMuCisgIC8vLworICAvLy8gVGhpcyB3aWxsIGFsaWduIHRoZSBkZWNsYXJhdGlvbiBuYW1lcyBvZiBjb25zZWN1dGl2ZSBsaW5lcy4gVGhpcworICAvLy8gd2lsbCByZXN1bHQgaW4gZm9ybWF0dGluZ3MgbGlrZQorICAvLy8gXGNvZGUKKyAgLy8vICAgaW50ICAgICAgICAgYWFhYSA9IDEyOworICAvLy8gICBmbG9hdCAgICAgICBiID0gMjM7CisgIC8vLyAgIHN0ZDo6c3RyaW5nIGNjYyA9IDIzOworICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBBbGlnbkNvbnNlY3V0aXZlRGVjbGFyYXRpb25zOworCisgIC8vLyBcYnJpZWYgRGlmZmVyZW50IHN0eWxlcyBmb3IgYWxpZ25pbmcgZXNjYXBlZCBuZXdsaW5lcy4KKyAgZW51bSBFc2NhcGVkTmV3bGluZUFsaWdubWVudFN0eWxlIHsKKyAgICAvLy8gXGJyaWVmIERvbid0IGFsaWduIGVzY2FwZWQgbmV3bGluZXMuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgI2RlZmluZSBBIFwKKyAgICAvLy8gICAgIGludCBhYWFhOyBcCisgICAgLy8vICAgICBpbnQgYjsgXAorICAgIC8vLyAgICAgaW50IGRkZGRkZGRkZGQ7CisgICAgLy8vIFxlbmRjb2RlCisgICAgRU5BU19Eb250QWxpZ24sCisgICAgLy8vIFxicmllZiBBbGlnbiBlc2NhcGVkIG5ld2xpbmVzIGFzIGZhciBsZWZ0IGFzIHBvc3NpYmxlLgorICAgIC8vLyBcY29kZQorICAgIC8vLyAgIHRydWU6CisgICAgLy8vICAgI2RlZmluZSBBICAgXAorICAgIC8vLyAgICAgaW50IGFhYWE7IFwKKyAgICAvLy8gICAgIGludCBiOyAgICBcCisgICAgLy8vICAgICBpbnQgZGRkZGRkZGRkZDsKKyAgICAvLy8KKyAgICAvLy8gICBmYWxzZToKKyAgICAvLy8gXGVuZGNvZGUKKyAgICBFTkFTX0xlZnQsCisgICAgLy8vIFxicmllZiBBbGlnbiBlc2NhcGVkIG5ld2xpbmVzIGluIHRoZSByaWdodC1tb3N0IGNvbHVtbi4KKyAgICAvLy8gXGNvZGUKKyAgICAvLy8gICAjZGVmaW5lIEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8vLyAgICAgaW50IGFhYWE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLy8vICAgICBpbnQgYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvLy8gICAgIGludCBkZGRkZGRkZGRkOworICAgIC8vLyBcZW5kY29kZQorICAgIEVOQVNfUmlnaHQsCisgIH07CisKKyAgLy8vIFxicmllZiBPcHRpb25zIGZvciBhbGlnbmluZyBiYWNrc2xhc2hlcyBpbiBlc2NhcGVkIG5ld2xpbmVzLgorICBFc2NhcGVkTmV3bGluZUFsaWdubWVudFN0eWxlIEFsaWduRXNjYXBlZE5ld2xpbmVzOworCisgIC8vLyBcYnJpZWYgSWYgYGB0cnVlYGAsIGhvcml6b250YWxseSBhbGlnbiBvcGVyYW5kcyBvZiBiaW5hcnkgYW5kIHRlcm5hcnkKKyAgLy8vIGV4cHJlc3Npb25zLgorICAvLy8KKyAgLy8vIFNwZWNpZmljYWxseSwgdGhpcyBhbGlnbnMgb3BlcmFuZHMgb2YgYSBzaW5nbGUgZXhwcmVzc2lvbiB0aGF0IG5lZWRzIHRvIGJlCisgIC8vLyBzcGxpdCBvdmVyIG11bHRpcGxlIGxpbmVzLCBlLmcuOgorICAvLy8gXGNvZGUKKyAgLy8vICAgaW50IGFhYSA9IGJiYmJiYmJiYmJiYmJiYiArCisgIC8vLyAgICAgICAgICAgICBjY2NjY2NjY2NjY2NjY2M7CisgIC8vLyBcZW5kY29kZQorICBib29sIEFsaWduT3BlcmFuZHM7CisKKyAgLy8vIFxicmllZiBJZiBgYHRydWVgYCwgYWxpZ25zIHRyYWlsaW5nIGNvbW1lbnRzLgorICAvLy8gXGNvZGUKKyAgLy8vICAgdHJ1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlOgorICAvLy8gICBpbnQgYTsgICAgIC8vIE15IGNvbW1lbnQgYSAgICAgIHZzLiAgICAgaW50IGE7IC8vIE15IGNvbW1lbnQgYQorICAvLy8gICBpbnQgYiA9IDI7IC8vIGNvbW1lbnQgIGIgICAgICAgICAgICAgICAgaW50IGIgPSAyOyAvLyBjb21tZW50IGFib3V0IGIKKyAgLy8vIFxlbmRjb2RlCisgIGJvb2wgQWxpZ25UcmFpbGluZ0NvbW1lbnRzOworCisgIC8vLyBcYnJpZWYgSWYgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGRvZXNuJ3QgZml0IG9uIGEgbGluZSwKKyAgLy8vIGFsbG93IHB1dHRpbmcgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBvbnRvCisgIC8vLyB0aGUgbmV4dCBsaW5lIGV2ZW4gaWYgYGBCaW5QYWNrUGFyYW1ldGVyc2BgIGlzIGBgZmFsc2VgYC4KKyAgLy8vIFxjb2RlCisgIC8vLyAgIHRydWU6CisgIC8vLyAgIHZvaWQgbXlGdW5jdGlvbigKKyAgLy8vICAgICAgIGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkLCBpbnQgZSk7CisgIC8vLworICAvLy8gICBmYWxzZToKKyAgLy8vICAgdm9pZCBteUZ1bmN0aW9uKGludCBhLAorICAvLy8gICAgICAgICAgICAgICAgICAgaW50IGIsCisgIC8vLyAgICAgICAgICAgICAgICAgICBpbnQgYywKKyAgLy8vICAgICAgICAgICAgICAgICAgIGludCBkLAorICAvLy8gICAgICAgICAgICAgICAgICAgaW50IGUpOworICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBBbGxvd0FsbFBhcmFtZXRlcnNPZkRlY2xhcmF0aW9uT25OZXh0TGluZTsKKworICAvLy8gXGJyaWVmIEFsbG93cyBjb250cmFjdGluZyBzaW1wbGUgYnJhY2VkIHN0YXRlbWVudHMgdG8gYSBzaW5nbGUgbGluZS4KKyAgLy8vCisgIC8vLyBFLmcuLCB0aGlzIGFsbG93cyBgYGlmIChhKSB7IHJldHVybjsgfWBgIHRvIGJlIHB1dCBvbiBhIHNpbmdsZSBsaW5lLgorICBib29sIEFsbG93U2hvcnRCbG9ja3NPbkFTaW5nbGVMaW5lOworCisgIC8vLyBcYnJpZWYgSWYgYGB0cnVlYGAsIHNob3J0IGNhc2UgbGFiZWxzIHdpbGwgYmUgY29udHJhY3RlZCB0byBhIHNpbmdsZSBsaW5lLgorICAvLy8gXGNvZGUKKyAgLy8vICAgdHJ1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlOgorICAvLy8gICBzd2l0Y2ggKGEpIHsgICAgICAgICAgICAgICAgICAgIHZzLiAgICAgc3dpdGNoIChhKSB7CisgIC8vLyAgIGNhc2UgMTogeCA9IDE7IGJyZWFrOyAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgIC8vLyAgIGNhc2UgMjogcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAxOworICAvLy8gICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBBbGxvd1Nob3J0Q2FzZUxhYmVsc09uQVNpbmdsZUxpbmU7CisKKyAgLy8vIFxicmllZiBEaWZmZXJlbnQgc3R5bGVzIGZvciBtZXJnaW5nIHNob3J0IGZ1bmN0aW9ucyBjb250YWluaW5nIGF0IG1vc3Qgb25lCisgIC8vLyBzdGF0ZW1lbnQuCisgIGVudW0gU2hvcnRGdW5jdGlvblN0eWxlIHsKKyAgICAvLy8gXGJyaWVmIE5ldmVyIG1lcmdlIGZ1bmN0aW9ucyBpbnRvIGEgc2luZ2xlIGxpbmUuCisgICAgU0ZTX05vbmUsCisgICAgLy8vIFxicmllZiBPbmx5IG1lcmdlIGZ1bmN0aW9ucyBkZWZpbmVkIGluc2lkZSBhIGNsYXNzLiBTYW1lIGFzICJpbmxpbmUiLAorICAgIC8vLyBleGNlcHQgaXQgZG9lcyBub3QgaW1wbGllcyAiZW1wdHkiOiBpLmUuIHRvcCBsZXZlbCBlbXB0eSBmdW5jdGlvbnMKKyAgICAvLy8gYXJlIG5vdCBtZXJnZWQgZWl0aGVyLgorICAgIC8vLyBcY29kZQorICAgIC8vLyAgIGNsYXNzIEZvbyB7CisgICAgLy8vICAgICB2b2lkIGYoKSB7IGZvbygpOyB9CisgICAgLy8vICAgfTsKKyAgICAvLy8gICB2b2lkIGYoKSB7CisgICAgLy8vICAgICBmb28oKTsKKyAgICAvLy8gICB9CisgICAgLy8vICAgdm9pZCBmKCkgeworICAgIC8vLyAgIH0KKyAgICAvLy8gXGVuZGNvZGUKKyAgICBTRlNfSW5saW5lT25seSwKKyAgICAvLy8gXGJyaWVmIE9ubHkgbWVyZ2UgZW1wdHkgZnVuY3Rpb25zLgorICAgIC8vLyBcY29kZQorICAgIC8vLyAgIHZvaWQgZigpIHt9CisgICAgLy8vICAgdm9pZCBmMigpIHsKKyAgICAvLy8gICAgIGJhcjIoKTsKKyAgICAvLy8gICB9CisgICAgLy8vIFxlbmRjb2RlCisgICAgU0ZTX0VtcHR5LAorICAgIC8vLyBcYnJpZWYgT25seSBtZXJnZSBmdW5jdGlvbnMgZGVmaW5lZCBpbnNpZGUgYSBjbGFzcy4gSW1wbGllcyAiZW1wdHkiLgorICAgIC8vLyBcY29kZQorICAgIC8vLyAgIGNsYXNzIEZvbyB7CisgICAgLy8vICAgICB2b2lkIGYoKSB7IGZvbygpOyB9CisgICAgLy8vICAgfTsKKyAgICAvLy8gICB2b2lkIGYoKSB7CisgICAgLy8vICAgICBmb28oKTsKKyAgICAvLy8gICB9CisgICAgLy8vICAgdm9pZCBmKCkge30KKyAgICAvLy8gXGVuZGNvZGUKKyAgICBTRlNfSW5saW5lLAorICAgIC8vLyBcYnJpZWYgTWVyZ2UgYWxsIGZ1bmN0aW9ucyBmaXR0aW5nIG9uIGEgc2luZ2xlIGxpbmUuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgY2xhc3MgRm9vIHsKKyAgICAvLy8gICAgIHZvaWQgZigpIHsgZm9vKCk7IH0KKyAgICAvLy8gICB9OworICAgIC8vLyAgIHZvaWQgZigpIHsgYmFyKCk7IH0KKyAgICAvLy8gXGVuZGNvZGUKKyAgICBTRlNfQWxsLAorICB9OworCisgIC8vLyBcYnJpZWYgRGVwZW5kZW50IG9uIHRoZSB2YWx1ZSwgYGBpbnQgZigpIHsgcmV0dXJuIDA7IH1gYCBjYW4gYmUgcHV0IG9uIGEKKyAgLy8vIHNpbmdsZSBsaW5lLgorICBTaG9ydEZ1bmN0aW9uU3R5bGUgQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmU7CisKKyAgLy8vIFxicmllZiBJZiBgYHRydWVgYCwgYGBpZiAoYSkgcmV0dXJuO2BgIGNhbiBiZSBwdXQgb24gYSBzaW5nbGUgbGluZS4KKyAgYm9vbCBBbGxvd1Nob3J0SWZTdGF0ZW1lbnRzT25BU2luZ2xlTGluZTsKKworICAvLy8gXGJyaWVmIElmIGBgdHJ1ZWBgLCBgYHdoaWxlICh0cnVlKSBjb250aW51ZTtgYCBjYW4gYmUgcHV0IG9uIGEgc2luZ2xlCisgIC8vLyBsaW5lLgorICBib29sIEFsbG93U2hvcnRMb29wc09uQVNpbmdsZUxpbmU7CisKKyAgLy8vIFxicmllZiBEaWZmZXJlbnQgd2F5cyB0byBicmVhayBhZnRlciB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiByZXR1cm4gdHlwZS4KKyAgLy8vIFRoaXMgb3B0aW9uIGlzICoqZGVwcmVjYXRlZCoqIGFuZCBpcyByZXRhaW5lZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgIGVudW0gRGVmaW5pdGlvblJldHVyblR5cGVCcmVha2luZ1N0eWxlIHsKKyAgICAvLy8gQnJlYWsgYWZ0ZXIgcmV0dXJuIHR5cGUgYXV0b21hdGljYWxseS4KKyAgICAvLy8gYGBQZW5hbHR5UmV0dXJuVHlwZU9uSXRzT3duTGluZWBgIGlzIHRha2VuIGludG8gYWNjb3VudC4KKyAgICBEUlRCU19Ob25lLAorICAgIC8vLyBBbHdheXMgYnJlYWsgYWZ0ZXIgdGhlIHJldHVybiB0eXBlLgorICAgIERSVEJTX0FsbCwKKyAgICAvLy8gQWx3YXlzIGJyZWFrIGFmdGVyIHRoZSByZXR1cm4gdHlwZXMgb2YgdG9wLWxldmVsIGZ1bmN0aW9ucy4KKyAgICBEUlRCU19Ub3BMZXZlbCwKKyAgfTsKKworICAvLy8gXGJyaWVmIERpZmZlcmVudCB3YXlzIHRvIGJyZWFrIGFmdGVyIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIG9yCisgIC8vLyBkZWNsYXJhdGlvbiByZXR1cm4gdHlwZS4KKyAgZW51bSBSZXR1cm5UeXBlQnJlYWtpbmdTdHlsZSB7CisgICAgLy8vIEJyZWFrIGFmdGVyIHJldHVybiB0eXBlIGF1dG9tYXRpY2FsbHkuCisgICAgLy8vIGBgUGVuYWx0eVJldHVyblR5cGVPbkl0c093bkxpbmVgYCBpcyB0YWtlbiBpbnRvIGFjY291bnQuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgY2xhc3MgQSB7CisgICAgLy8vICAgICBpbnQgZigpIHsgcmV0dXJuIDA7IH07CisgICAgLy8vICAgfTsKKyAgICAvLy8gICBpbnQgZigpOworICAgIC8vLyAgIGludCBmKCkgeyByZXR1cm4gMTsgfQorICAgIC8vLyBcZW5kY29kZQorICAgIFJUQlNfTm9uZSwKKyAgICAvLy8gQWx3YXlzIGJyZWFrIGFmdGVyIHRoZSByZXR1cm4gdHlwZS4KKyAgICAvLy8gXGNvZGUKKyAgICAvLy8gICBjbGFzcyBBIHsKKyAgICAvLy8gICAgIGludAorICAgIC8vLyAgICAgZigpIHsKKyAgICAvLy8gICAgICAgcmV0dXJuIDA7CisgICAgLy8vICAgICB9OworICAgIC8vLyAgIH07CisgICAgLy8vICAgaW50CisgICAgLy8vICAgZigpOworICAgIC8vLyAgIGludAorICAgIC8vLyAgIGYoKSB7CisgICAgLy8vICAgICByZXR1cm4gMTsKKyAgICAvLy8gICB9CisgICAgLy8vIFxlbmRjb2RlCisgICAgUlRCU19BbGwsCisgICAgLy8vIEFsd2F5cyBicmVhayBhZnRlciB0aGUgcmV0dXJuIHR5cGVzIG9mIHRvcC1sZXZlbCBmdW5jdGlvbnMuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgY2xhc3MgQSB7CisgICAgLy8vICAgICBpbnQgZigpIHsgcmV0dXJuIDA7IH07CisgICAgLy8vICAgfTsKKyAgICAvLy8gICBpbnQKKyAgICAvLy8gICBmKCk7CisgICAgLy8vICAgaW50CisgICAgLy8vICAgZigpIHsKKyAgICAvLy8gICAgIHJldHVybiAxOworICAgIC8vLyAgIH0KKyAgICAvLy8gXGVuZGNvZGUKKyAgICBSVEJTX1RvcExldmVsLAorICAgIC8vLyBBbHdheXMgYnJlYWsgYWZ0ZXIgdGhlIHJldHVybiB0eXBlIG9mIGZ1bmN0aW9uIGRlZmluaXRpb25zLgorICAgIC8vLyBcY29kZQorICAgIC8vLyAgIGNsYXNzIEEgeworICAgIC8vLyAgICAgaW50CisgICAgLy8vICAgICBmKCkgeworICAgIC8vLyAgICAgICByZXR1cm4gMDsKKyAgICAvLy8gICAgIH07CisgICAgLy8vICAgfTsKKyAgICAvLy8gICBpbnQgZigpOworICAgIC8vLyAgIGludAorICAgIC8vLyAgIGYoKSB7CisgICAgLy8vICAgICByZXR1cm4gMTsKKyAgICAvLy8gICB9CisgICAgLy8vIFxlbmRjb2RlCisgICAgUlRCU19BbGxEZWZpbml0aW9ucywKKyAgICAvLy8gQWx3YXlzIGJyZWFrIGFmdGVyIHRoZSByZXR1cm4gdHlwZSBvZiB0b3AtbGV2ZWwgZGVmaW5pdGlvbnMuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgY2xhc3MgQSB7CisgICAgLy8vICAgICBpbnQgZigpIHsgcmV0dXJuIDA7IH07CisgICAgLy8vICAgfTsKKyAgICAvLy8gICBpbnQgZigpOworICAgIC8vLyAgIGludAorICAgIC8vLyAgIGYoKSB7CisgICAgLy8vICAgICByZXR1cm4gMTsKKyAgICAvLy8gICB9CisgICAgLy8vIFxlbmRjb2RlCisgICAgUlRCU19Ub3BMZXZlbERlZmluaXRpb25zLAorICB9OworCisgIC8vLyBcYnJpZWYgVGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gcmV0dXJuIHR5cGUgYnJlYWtpbmcgc3R5bGUgdG8gdXNlLiAgVGhpcworICAvLy8gb3B0aW9uIGlzICoqZGVwcmVjYXRlZCoqIGFuZCBpcyByZXRhaW5lZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgIERlZmluaXRpb25SZXR1cm5UeXBlQnJlYWtpbmdTdHlsZSBBbHdheXNCcmVha0FmdGVyRGVmaW5pdGlvblJldHVyblR5cGU7CisKKyAgLy8vIFxicmllZiBUaGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gcmV0dXJuIHR5cGUgYnJlYWtpbmcgc3R5bGUgdG8gdXNlLgorICBSZXR1cm5UeXBlQnJlYWtpbmdTdHlsZSBBbHdheXNCcmVha0FmdGVyUmV0dXJuVHlwZTsKKworICAvLy8gXGJyaWVmIElmIGBgdHJ1ZWBgLCBhbHdheXMgYnJlYWsgYmVmb3JlIG11bHRpbGluZSBzdHJpbmcgbGl0ZXJhbHMuCisgIC8vLworICAvLy8gVGhpcyBmbGFnIGlzIG1lYW4gdG8gbWFrZSBjYXNlcyB3aGVyZSB0aGVyZSBhcmUgbXVsdGlwbGUgbXVsdGlsaW5lIHN0cmluZ3MKKyAgLy8vIGluIGEgZmlsZSBsb29rIG1vcmUgY29uc2lzdGVudC4gVGh1cywgaXQgd2lsbCBvbmx5IHRha2UgZWZmZWN0IGlmIHdyYXBwaW5nCisgIC8vLyB0aGUgc3RyaW5nIGF0IHRoYXQgcG9pbnQgbGVhZHMgdG8gaXQgYmVpbmcgaW5kZW50ZWQKKyAgLy8vIGBgQ29udGludWF0aW9uSW5kZW50V2lkdGhgYCBzcGFjZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuCisgIC8vLyBcY29kZQorICAvLy8gICAgdHJ1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2U6CisgIC8vLyAgICBhYWFhID0gICAgICAgICAgICAgICAgICAgICAgICAgdnMuICAgICBhYWFhID0gImJiYmIiCisgIC8vLyAgICAgICAgImJiYmIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNjY2MiOworICAvLy8gICAgICAgICJjY2NjIjsKKyAgLy8vIFxlbmRjb2RlCisgIGJvb2wgQWx3YXlzQnJlYWtCZWZvcmVNdWx0aWxpbmVTdHJpbmdzOworCisgIC8vLyBcYnJpZWYgSWYgYGB0cnVlYGAsIGFsd2F5cyBicmVhayBhZnRlciB0aGUgYGB0ZW1wbGF0ZTwuLi4+YGAgb2YgYSB0ZW1wbGF0ZQorICAvLy8gZGVjbGFyYXRpb24uCisgIC8vLyBcY29kZQorICAvLy8gICAgdHJ1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2U6CisgIC8vLyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gICAgICAgICAgdnMuICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQyB7fTsKKyAgLy8vICAgIGNsYXNzIEMge307CisgIC8vLyBcZW5kY29kZQorICBib29sIEFsd2F5c0JyZWFrVGVtcGxhdGVEZWNsYXJhdGlvbnM7CisKKyAgLy8vIFxicmllZiBJZiBgYGZhbHNlYGAsIGEgZnVuY3Rpb24gY2FsbCdzIGFyZ3VtZW50cyB3aWxsIGVpdGhlciBiZSBhbGwgb24gdGhlCisgIC8vLyBzYW1lIGxpbmUgb3Igd2lsbCBoYXZlIG9uZSBsaW5lIGVhY2guCisgIC8vLyBcY29kZQorICAvLy8gICB0cnVlOgorICAvLy8gICB2b2lkIGYoKSB7CisgIC8vLyAgICAgZihhYWFhYWFhYWFhYWFhYWFhYWFhYSwgYWFhYWFhYWFhYWFhYWFhYWFhYWEsCisgIC8vLyAgICAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhKTsKKyAgLy8vICAgfQorICAvLy8KKyAgLy8vICAgZmFsc2U6CisgIC8vLyAgIHZvaWQgZigpIHsKKyAgLy8vICAgICBmKGFhYWFhYWFhYWFhYWFhYWFhYWFhLAorICAvLy8gICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWEsCisgIC8vLyAgICAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhKTsKKyAgLy8vICAgfQorICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBCaW5QYWNrQXJndW1lbnRzOworCisgIC8vLyBcYnJpZWYgSWYgYGBmYWxzZWBgLCBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uJ3Mgb3IgZnVuY3Rpb24gZGVmaW5pdGlvbidzCisgIC8vLyBwYXJhbWV0ZXJzIHdpbGwgZWl0aGVyIGFsbCBiZSBvbiB0aGUgc2FtZSBsaW5lIG9yIHdpbGwgaGF2ZSBvbmUgbGluZSBlYWNoLgorICAvLy8gXGNvZGUKKyAgLy8vICAgdHJ1ZToKKyAgLy8vICAgdm9pZCBmKGludCBhYWFhYWFhYWFhYWFhYWFhYWFhYSwgaW50IGFhYWFhYWFhYWFhYWFhYWFhYWFhLAorICAvLy8gICAgICAgICAgaW50IGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEpIHt9CisgIC8vLworICAvLy8gICBmYWxzZToKKyAgLy8vICAgdm9pZCBmKGludCBhYWFhYWFhYWFhYWFhYWFhYWFhYSwKKyAgLy8vICAgICAgICAgIGludCBhYWFhYWFhYWFhYWFhYWFhYWFhYSwKKyAgLy8vICAgICAgICAgIGludCBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhKSB7fQorICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBCaW5QYWNrUGFyYW1ldGVyczsKKworICAvLy8gXGJyaWVmIFRoZSBzdHlsZSBvZiB3cmFwcGluZyBwYXJhbWV0ZXJzIG9uIHRoZSBzYW1lIGxpbmUgKGJpbi1wYWNrZWQpIG9yCisgIC8vLyBvbiBvbmUgbGluZSBlYWNoLgorICBlbnVtIEJpblBhY2tTdHlsZSB7CisgICAgLy8vIEF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHBhcmFtZXRlciBiaW4tcGFja2luZyBiZWhhdmlvci4KKyAgICBCUFNfQXV0bywKKyAgICAvLy8gQWx3YXlzIGJpbi1wYWNrIHBhcmFtZXRlcnMuCisgICAgQlBTX0Fsd2F5cywKKyAgICAvLy8gTmV2ZXIgYmluLXBhY2sgcGFyYW1ldGVycy4KKyAgICBCUFNfTmV2ZXIsCisgIH07CisKKyAgLy8vIFxicmllZiBUaGUgc3R5bGUgb2YgYnJlYWtpbmcgYmVmb3JlIG9yIGFmdGVyIGJpbmFyeSBvcGVyYXRvcnMuCisgIGVudW0gQmluYXJ5T3BlcmF0b3JTdHlsZSB7CisgICAgLy8vIEJyZWFrIGFmdGVyIG9wZXJhdG9ycy4KKyAgICAvLy8gXGNvZGUKKyAgICAvLy8gICAgTG9vb29vb29vb29vbmdUeXBlIGxvb29vb29vb29vb29vb29vb29vb29vbmdWYXJpYWJsZSA9CisgICAgLy8vICAgICAgICBzb21lTG9vb29vb29vb29vb29vb29vbmdGdW5jdGlvbigpOworICAgIC8vLworICAgIC8vLyAgICBib29sIHZhbHVlID0gYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhICsKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSA9PQorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhICYmCisgICAgLy8vICAgICAgICAgICAgICAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEgPgorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIGNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjOworICAgIC8vLyBcZW5kY29kZQorICAgIEJPU19Ob25lLAorICAgIC8vLyBCcmVhayBiZWZvcmUgb3BlcmF0b3JzIHRoYXQgYXJlbid0IGFzc2lnbm1lbnRzLgorICAgIC8vLyBcY29kZQorICAgIC8vLyAgICBMb29vb29vb29vb29uZ1R5cGUgbG9vb29vb29vb29vb29vb29vb29vb29uZ1ZhcmlhYmxlID0KKyAgICAvLy8gICAgICAgIHNvbWVMb29vb29vb29vb29vb29vb29uZ0Z1bmN0aW9uKCk7CisgICAgLy8vCisgICAgLy8vICAgIGJvb2wgdmFsdWUgPSBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgKyBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgPT0gYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEKKyAgICAvLy8gICAgICAgICAgICAgICAgICYmIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgID4gY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2M7CisgICAgLy8vIFxlbmRjb2RlCisgICAgQk9TX05vbkFzc2lnbm1lbnQsCisgICAgLy8vIEJyZWFrIGJlZm9yZSBvcGVyYXRvcnMuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgIExvb29vb29vb29vb25nVHlwZSBsb29vb29vb29vb29vb29vb29vb29vb25nVmFyaWFibGUKKyAgICAvLy8gICAgICAgID0gc29tZUxvb29vb29vb29vb29vb29vb25nRnVuY3Rpb24oKTsKKyAgICAvLy8KKyAgICAvLy8gICAgYm9vbCB2YWx1ZSA9IGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICArIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICA9PSBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQorICAgIC8vLyAgICAgICAgICAgICAgICAgJiYgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgPiBjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjYzsKKyAgICAvLy8gXGVuZGNvZGUKKyAgICBCT1NfQWxsLAorICB9OworCisgIC8vLyBcYnJpZWYgVGhlIHdheSB0byB3cmFwIGJpbmFyeSBvcGVyYXRvcnMuCisgIEJpbmFyeU9wZXJhdG9yU3R5bGUgQnJlYWtCZWZvcmVCaW5hcnlPcGVyYXRvcnM7CisKKyAgLy8vIFxicmllZiBEaWZmZXJlbnQgd2F5cyB0byBhdHRhY2ggYnJhY2VzIHRvIHRoZWlyIHN1cnJvdW5kaW5nIGNvbnRleHQuCisgIGVudW0gQnJhY2VCcmVha2luZ1N0eWxlIHsKKyAgICAvLy8gQWx3YXlzIGF0dGFjaCBicmFjZXMgdG8gc3Vycm91bmRpbmcgY29udGV4dC4KKyAgICAvLy8gXGNvZGUKKyAgICAvLy8gICB0cnkgeworICAgIC8vLyAgICAgZm9vKCk7CisgICAgLy8vICAgfSBjYXRjaCAoKSB7CisgICAgLy8vICAgfQorICAgIC8vLyAgIHZvaWQgZm9vKCkgeyBiYXIoKTsgfQorICAgIC8vLyAgIGNsYXNzIGZvbyB7fTsKKyAgICAvLy8gICBpZiAoZm9vKCkpIHsKKyAgICAvLy8gICB9IGVsc2UgeworICAgIC8vLyAgIH0KKyAgICAvLy8gICBlbnVtIFggOiBpbnQgeyBBLCBCIH07CisgICAgLy8vIFxlbmRjb2RlCisgICAgQlNfQXR0YWNoLAorICAgIC8vLyBMaWtlIGBgQXR0YWNoYGAsIGJ1dCBicmVhayBiZWZvcmUgYnJhY2VzIG9uIGZ1bmN0aW9uLCBuYW1lc3BhY2UgYW5kCisgICAgLy8vIGNsYXNzIGRlZmluaXRpb25zLgorICAgIC8vLyBcY29kZQorICAgIC8vLyAgIHRyeSB7CisgICAgLy8vICAgICBmb28oKTsKKyAgICAvLy8gICB9IGNhdGNoICgpIHsKKyAgICAvLy8gICB9CisgICAgLy8vICAgdm9pZCBmb28oKSB7IGJhcigpOyB9CisgICAgLy8vICAgY2xhc3MgZm9vCisgICAgLy8vICAgeworICAgIC8vLyAgIH07CisgICAgLy8vICAgaWYgKGZvbygpKSB7CisgICAgLy8vICAgfSBlbHNlIHsKKyAgICAvLy8gICB9CisgICAgLy8vICAgZW51bSBYIDogaW50IHsgQSwgQiB9OworICAgIC8vLyBcZW5kY29kZQorICAgIEJTX0xpbnV4LAorICAgIC8vLyBMaWtlIGBgQXR0YWNoYGAsIGJ1dCBicmVhayBiZWZvcmUgYnJhY2VzIG9uIGVudW0sIGZ1bmN0aW9uLCBhbmQgcmVjb3JkCisgICAgLy8vIGRlZmluaXRpb25zLgorICAgIC8vLyBcY29kZQorICAgIC8vLyAgIHRyeSB7CisgICAgLy8vICAgICBmb28oKTsKKyAgICAvLy8gICB9IGNhdGNoICgpIHsKKyAgICAvLy8gICB9CisgICAgLy8vICAgdm9pZCBmb28oKSB7IGJhcigpOyB9CisgICAgLy8vICAgY2xhc3MgZm9vCisgICAgLy8vICAgeworICAgIC8vLyAgIH07CisgICAgLy8vICAgaWYgKGZvbygpKSB7CisgICAgLy8vICAgfSBlbHNlIHsKKyAgICAvLy8gICB9CisgICAgLy8vICAgZW51bSBYIDogaW50IHsgQSwgQiB9OworICAgIC8vLyBcZW5kY29kZQorICAgIEJTX01vemlsbGEsCisgICAgLy8vIExpa2UgYGBBdHRhY2hgYCwgYnV0IGJyZWFrIGJlZm9yZSBmdW5jdGlvbiBkZWZpbml0aW9ucywgYGBjYXRjaGBgLCBhbmQKKyAgICAvLy8gYGBlbHNlYGAuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgdHJ5IHsKKyAgICAvLy8gICAgIGZvbygpOworICAgIC8vLyAgIH0gY2F0Y2ggKCkgeworICAgIC8vLyAgIH0KKyAgICAvLy8gICB2b2lkIGZvbygpIHsgYmFyKCk7IH0KKyAgICAvLy8gICBjbGFzcyBmb28KKyAgICAvLy8gICB7CisgICAgLy8vICAgfTsKKyAgICAvLy8gICBpZiAoZm9vKCkpIHsKKyAgICAvLy8gICB9IGVsc2UgeworICAgIC8vLyAgIH0KKyAgICAvLy8gICBlbnVtIFggOiBpbnQKKyAgICAvLy8gICB7CisgICAgLy8vICAgICBBLAorICAgIC8vLyAgICAgQgorICAgIC8vLyAgIH07CisgICAgLy8vIFxlbmRjb2RlCisgICAgQlNfU3Ryb3VzdHJ1cCwKKyAgICAvLy8gQWx3YXlzIGJyZWFrIGJlZm9yZSBicmFjZXMuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgdHJ5IHsKKyAgICAvLy8gICAgIGZvbygpOworICAgIC8vLyAgIH0KKyAgICAvLy8gICBjYXRjaCAoKSB7CisgICAgLy8vICAgfQorICAgIC8vLyAgIHZvaWQgZm9vKCkgeyBiYXIoKTsgfQorICAgIC8vLyAgIGNsYXNzIGZvbyB7CisgICAgLy8vICAgfTsKKyAgICAvLy8gICBpZiAoZm9vKCkpIHsKKyAgICAvLy8gICB9CisgICAgLy8vICAgZWxzZSB7CisgICAgLy8vICAgfQorICAgIC8vLyAgIGVudW0gWCA6IGludCB7IEEsIEIgfTsKKyAgICAvLy8gXGVuZGNvZGUKKyAgICBCU19BbGxtYW4sCisgICAgLy8vIEFsd2F5cyBicmVhayBiZWZvcmUgYnJhY2VzIGFuZCBhZGQgYW4gZXh0cmEgbGV2ZWwgb2YgaW5kZW50YXRpb24gdG8KKyAgICAvLy8gYnJhY2VzIG9mIGNvbnRyb2wgc3RhdGVtZW50cywgbm90IHRvIHRob3NlIG9mIGNsYXNzLCBmdW5jdGlvbgorICAgIC8vLyBvciBvdGhlciBkZWZpbml0aW9ucy4KKyAgICAvLy8gXGNvZGUKKyAgICAvLy8gICB0cnkKKyAgICAvLy8gICAgIHsKKyAgICAvLy8gICAgICAgZm9vKCk7CisgICAgLy8vICAgICB9CisgICAgLy8vICAgY2F0Y2ggKCkKKyAgICAvLy8gICAgIHsKKyAgICAvLy8gICAgIH0KKyAgICAvLy8gICB2b2lkIGZvbygpIHsgYmFyKCk7IH0KKyAgICAvLy8gICBjbGFzcyBmb28KKyAgICAvLy8gICB7CisgICAgLy8vICAgfTsKKyAgICAvLy8gICBpZiAoZm9vKCkpCisgICAgLy8vICAgICB7CisgICAgLy8vICAgICB9CisgICAgLy8vICAgZWxzZQorICAgIC8vLyAgICAgeworICAgIC8vLyAgICAgfQorICAgIC8vLyAgIGVudW0gWCA6IGludAorICAgIC8vLyAgIHsKKyAgICAvLy8gICAgIEEsCisgICAgLy8vICAgICBCCisgICAgLy8vICAgfTsKKyAgICAvLy8gXGVuZGNvZGUKKyAgICBCU19HTlUsCisgICAgLy8vIExpa2UgYGBBdHRhY2hgYCwgYnV0IGJyZWFrIGJlZm9yZSBmdW5jdGlvbnMuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgdHJ5IHsKKyAgICAvLy8gICAgIGZvbygpOworICAgIC8vLyAgIH0gY2F0Y2ggKCkgeworICAgIC8vLyAgIH0KKyAgICAvLy8gICB2b2lkIGZvbygpIHsgYmFyKCk7IH0KKyAgICAvLy8gICBjbGFzcyBmb28geworICAgIC8vLyAgIH07CisgICAgLy8vICAgaWYgKGZvbygpKSB7CisgICAgLy8vICAgfSBlbHNlIHsKKyAgICAvLy8gICB9CisgICAgLy8vICAgZW51bSBYIDogaW50IHsgQSwgQiB9OworICAgIC8vLyBcZW5kY29kZQorICAgIEJTX1dlYktpdCwKKyAgICAvLy8gQ29uZmlndXJlIGVhY2ggaW5kaXZpZHVhbCBicmFjZSBpbiBgQnJhY2VXcmFwcGluZ2AuCisgICAgQlNfQ3VzdG9tCisgIH07CisKKyAgLy8vIFxicmllZiBUaGUgYnJhY2UgYnJlYWtpbmcgc3R5bGUgdG8gdXNlLgorICBCcmFjZUJyZWFraW5nU3R5bGUgQnJlYWtCZWZvcmVCcmFjZXM7CisKKyAgLy8vIFxicmllZiBQcmVjaXNlIGNvbnRyb2wgb3ZlciB0aGUgd3JhcHBpbmcgb2YgYnJhY2VzLgorICAvLy8gXGNvZGUKKyAgLy8vICAgIyBTaG91bGQgYmUgZGVjbGFyZWQgdGhpcyB3YXk6CisgIC8vLyAgIEJyZWFrQmVmb3JlQnJhY2VzOiBDdXN0b20KKyAgLy8vICAgQnJhY2VXcmFwcGluZzoKKyAgLy8vICAgICAgIEFmdGVyQ2xhc3M6IHRydWUKKyAgLy8vIFxlbmRjb2RlCisgIHN0cnVjdCBCcmFjZVdyYXBwaW5nRmxhZ3MgeworICAgIC8vLyBcYnJpZWYgV3JhcCBjbGFzcyBkZWZpbml0aW9ucy4KKyAgICAvLy8gXGNvZGUKKyAgICAvLy8gICB0cnVlOgorICAgIC8vLyAgIGNsYXNzIGZvbyB7fTsKKyAgICAvLy8KKyAgICAvLy8gICBmYWxzZToKKyAgICAvLy8gICBjbGFzcyBmb28KKyAgICAvLy8gICB7fTsKKyAgICAvLy8gXGVuZGNvZGUKKyAgICBib29sIEFmdGVyQ2xhc3M7CisgICAgLy8vIFxicmllZiBXcmFwIGNvbnRyb2wgc3RhdGVtZW50cyAoYGBpZmBgL2BgZm9yYGAvYGB3aGlsZWBgL2Bgc3dpdGNoYGAvLi4pLgorICAgIC8vLyBcY29kZQorICAgIC8vLyAgIHRydWU6CisgICAgLy8vICAgaWYgKGZvbygpKQorICAgIC8vLyAgIHsKKyAgICAvLy8gICB9IGVsc2UKKyAgICAvLy8gICB7fQorICAgIC8vLyAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkKKyAgICAvLy8gICB7fQorICAgIC8vLworICAgIC8vLyAgIGZhbHNlOgorICAgIC8vLyAgIGlmIChmb28oKSkgeworICAgIC8vLyAgIH0gZWxzZSB7CisgICAgLy8vICAgfQorICAgIC8vLyAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgIC8vLyAgIH0KKyAgICAvLy8gXGVuZGNvZGUKKyAgICBib29sIEFmdGVyQ29udHJvbFN0YXRlbWVudDsKKyAgICAvLy8gXGJyaWVmIFdyYXAgZW51bSBkZWZpbml0aW9ucy4KKyAgICAvLy8gXGNvZGUKKyAgICAvLy8gICB0cnVlOgorICAgIC8vLyAgIGVudW0gWCA6IGludAorICAgIC8vLyAgIHsKKyAgICAvLy8gICAgIEIKKyAgICAvLy8gICB9OworICAgIC8vLworICAgIC8vLyAgIGZhbHNlOgorICAgIC8vLyAgIGVudW0gWCA6IGludCB7IEIgfTsKKyAgICAvLy8gXGVuZGNvZGUKKyAgICBib29sIEFmdGVyRW51bTsKKyAgICAvLy8gXGJyaWVmIFdyYXAgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgdHJ1ZToKKyAgICAvLy8gICB2b2lkIGZvbygpCisgICAgLy8vICAgeworICAgIC8vLyAgICAgYmFyKCk7CisgICAgLy8vICAgICBiYXIyKCk7CisgICAgLy8vICAgfQorICAgIC8vLworICAgIC8vLyAgIGZhbHNlOgorICAgIC8vLyAgIHZvaWQgZm9vKCkgeworICAgIC8vLyAgICAgYmFyKCk7CisgICAgLy8vICAgICBiYXIyKCk7CisgICAgLy8vICAgfQorICAgIC8vLyBcZW5kY29kZQorICAgIGJvb2wgQWZ0ZXJGdW5jdGlvbjsKKyAgICAvLy8gXGJyaWVmIFdyYXAgbmFtZXNwYWNlIGRlZmluaXRpb25zLgorICAgIC8vLyBcY29kZQorICAgIC8vLyAgIHRydWU6CisgICAgLy8vICAgbmFtZXNwYWNlCisgICAgLy8vICAgeworICAgIC8vLyAgIGludCBmb28oKTsKKyAgICAvLy8gICBpbnQgYmFyKCk7CisgICAgLy8vICAgfQorICAgIC8vLworICAgIC8vLyAgIGZhbHNlOgorICAgIC8vLyAgIG5hbWVzcGFjZSB7CisgICAgLy8vICAgaW50IGZvbygpOworICAgIC8vLyAgIGludCBiYXIoKTsKKyAgICAvLy8gICB9CisgICAgLy8vIFxlbmRjb2RlCisgICAgYm9vbCBBZnRlck5hbWVzcGFjZTsKKyAgICAvLy8gXGJyaWVmIFdyYXAgT2JqQyBkZWZpbml0aW9ucyAoaW50ZXJmYWNlcywgaW1wbGVtZW50YXRpb25zLi4uKS4KKyAgICAvLy8gXG5vdGUgQGF1dG9yZWxlYXNlcG9vbCBhbmQgQHN5bmNocm9uaXplZCBibG9ja3MgYXJlIHdyYXBwZWQKKyAgICAvLy8gYWNjb3JkaW5nIHRvIGBBZnRlckNvbnRyb2xTdGF0ZW1lbnRgIGZsYWcuCisgICAgYm9vbCBBZnRlck9iakNEZWNsYXJhdGlvbjsKKyAgICAvLy8gXGJyaWVmIFdyYXAgc3RydWN0IGRlZmluaXRpb25zLgorICAgIC8vLyBcY29kZQorICAgIC8vLyAgIHRydWU6CisgICAgLy8vICAgc3RydWN0IGZvbworICAgIC8vLyAgIHsKKyAgICAvLy8gICAgIGludCB4OworICAgIC8vLyAgIH07CisgICAgLy8vCisgICAgLy8vICAgZmFsc2U6CisgICAgLy8vICAgc3RydWN0IGZvbyB7CisgICAgLy8vICAgICBpbnQgeDsKKyAgICAvLy8gICB9OworICAgIC8vLyBcZW5kY29kZQorICAgIGJvb2wgQWZ0ZXJTdHJ1Y3Q7CisgICAgLy8vIFxicmllZiBXcmFwIHVuaW9uIGRlZmluaXRpb25zLgorICAgIC8vLyBcY29kZQorICAgIC8vLyAgIHRydWU6CisgICAgLy8vICAgdW5pb24gZm9vCisgICAgLy8vICAgeworICAgIC8vLyAgICAgaW50IHg7CisgICAgLy8vICAgfQorICAgIC8vLworICAgIC8vLyAgIGZhbHNlOgorICAgIC8vLyAgIHVuaW9uIGZvbyB7CisgICAgLy8vICAgICBpbnQgeDsKKyAgICAvLy8gICB9CisgICAgLy8vIFxlbmRjb2RlCisgICAgYm9vbCBBZnRlclVuaW9uOworICAgIC8vLyBcYnJpZWYgV3JhcCBleHRlcm4gYmxvY2tzLgorICAgIC8vLyBcY29kZQorICAgIC8vLyAgIHRydWU6CisgICAgLy8vICAgZXh0ZXJuICJDIgorICAgIC8vLyAgIHsKKyAgICAvLy8gICAgIGludCBmb28oKTsKKyAgICAvLy8gICB9CisgICAgLy8vCisgICAgLy8vICAgZmFsc2U6CisgICAgLy8vICAgZXh0ZXJuICJDIiB7CisgICAgLy8vICAgaW50IGZvbygpOworICAgIC8vLyAgIH0KKyAgICAvLy8gXGVuZGNvZGUKKyAgICBib29sIEFmdGVyRXh0ZXJuQmxvY2s7CisgICAgLy8vIFxicmllZiBXcmFwIGJlZm9yZSBgYGNhdGNoYGAuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgdHJ1ZToKKyAgICAvLy8gICB0cnkgeworICAgIC8vLyAgICAgZm9vKCk7CisgICAgLy8vICAgfQorICAgIC8vLyAgIGNhdGNoICgpIHsKKyAgICAvLy8gICB9CisgICAgLy8vCisgICAgLy8vICAgZmFsc2U6CisgICAgLy8vICAgdHJ5IHsKKyAgICAvLy8gICAgIGZvbygpOworICAgIC8vLyAgIH0gY2F0Y2ggKCkgeworICAgIC8vLyAgIH0KKyAgICAvLy8gXGVuZGNvZGUKKyAgICBib29sIEJlZm9yZUNhdGNoOworICAgIC8vLyBcYnJpZWYgV3JhcCBiZWZvcmUgYGBlbHNlYGAuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgdHJ1ZToKKyAgICAvLy8gICBpZiAoZm9vKCkpIHsKKyAgICAvLy8gICB9CisgICAgLy8vICAgZWxzZSB7CisgICAgLy8vICAgfQorICAgIC8vLworICAgIC8vLyAgIGZhbHNlOgorICAgIC8vLyAgIGlmIChmb28oKSkgeworICAgIC8vLyAgIH0gZWxzZSB7CisgICAgLy8vICAgfQorICAgIC8vLyBcZW5kY29kZQorICAgIGJvb2wgQmVmb3JlRWxzZTsKKyAgICAvLy8gXGJyaWVmIEluZGVudCB0aGUgd3JhcHBlZCBicmFjZXMgdGhlbXNlbHZlcy4KKyAgICBib29sIEluZGVudEJyYWNlczsKKyAgICAvLy8gXGJyaWVmIElmIGBgZmFsc2VgYCwgZW1wdHkgZnVuY3Rpb24gYm9keSBjYW4gYmUgcHV0IG9uIGEgc2luZ2xlIGxpbmUuCisgICAgLy8vIFRoaXMgb3B0aW9uIGlzIHVzZWQgb25seSBpZiB0aGUgb3BlbmluZyBicmFjZSBvZiB0aGUgZnVuY3Rpb24gaGFzCisgICAgLy8vIGFscmVhZHkgYmVlbiB3cmFwcGVkLCBpLmUuIHRoZSBgQWZ0ZXJGdW5jdGlvbmAgYnJhY2Ugd3JhcHBpbmcgbW9kZSBpcworICAgIC8vLyBzZXQsIGFuZCB0aGUgZnVuY3Rpb24gY291bGQvc2hvdWxkIG5vdCBiZSBwdXQgb24gYSBzaW5nbGUgbGluZSAoYXMgcGVyCisgICAgLy8vIGBBbGxvd1Nob3J0RnVuY3Rpb25zT25BU2luZ2xlTGluZWAgYW5kIGNvbnN0cnVjdG9yIGZvcm1hdHRpbmcgb3B0aW9ucykuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgaW50IGYoKSAgIHZzLiAgIGluZiBmKCkKKyAgICAvLy8gICB7fSAgICAgICAgICAgICAgeworICAgIC8vLyAgICAgICAgICAgICAgICAgICB9CisgICAgLy8vIFxlbmRjb2RlCisgICAgLy8vCisgICAgYm9vbCBTcGxpdEVtcHR5RnVuY3Rpb247CisgICAgLy8vIFxicmllZiBJZiBgYGZhbHNlYGAsIGVtcHR5IHJlY29yZCAoZS5nLiBjbGFzcywgc3RydWN0IG9yIHVuaW9uKSBib2R5CisgICAgLy8vIGNhbiBiZSBwdXQgb24gYSBzaW5nbGUgbGluZS4gVGhpcyBvcHRpb24gaXMgdXNlZCBvbmx5IGlmIHRoZSBvcGVuaW5nCisgICAgLy8vIGJyYWNlIG9mIHRoZSByZWNvcmQgaGFzIGFscmVhZHkgYmVlbiB3cmFwcGVkLCBpLmUuIHRoZSBgQWZ0ZXJDbGFzc2AKKyAgICAvLy8gKGZvciBjbGFzc2VzKSBicmFjZSB3cmFwcGluZyBtb2RlIGlzIHNldC4KKyAgICAvLy8gXGNvZGUKKyAgICAvLy8gICBjbGFzcyBGb28gICB2cy4gIGNsYXNzIEZvbworICAgIC8vLyAgIHt9ICAgICAgICAgICAgICAgeworICAgIC8vLyAgICAgICAgICAgICAgICAgICAgfQorICAgIC8vLyBcZW5kY29kZQorICAgIC8vLworICAgIGJvb2wgU3BsaXRFbXB0eVJlY29yZDsKKyAgICAvLy8gXGJyaWVmIElmIGBgZmFsc2VgYCwgZW1wdHkgbmFtZXNwYWNlIGJvZHkgY2FuIGJlIHB1dCBvbiBhIHNpbmdsZSBsaW5lLgorICAgIC8vLyBUaGlzIG9wdGlvbiBpcyB1c2VkIG9ubHkgaWYgdGhlIG9wZW5pbmcgYnJhY2Ugb2YgdGhlIG5hbWVzcGFjZSBoYXMKKyAgICAvLy8gYWxyZWFkeSBiZWVuIHdyYXBwZWQsIGkuZS4gdGhlIGBBZnRlck5hbWVzcGFjZWAgYnJhY2Ugd3JhcHBpbmcgbW9kZSBpcworICAgIC8vLyBzZXQuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgbmFtZXNwYWNlIEZvbyAgIHZzLiAgbmFtZXNwYWNlIEZvbworICAgIC8vLyAgIHt9ICAgICAgICAgICAgICAgICAgIHsKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgLy8vIFxlbmRjb2RlCisgICAgLy8vCisgICAgYm9vbCBTcGxpdEVtcHR5TmFtZXNwYWNlOworICB9OworCisgIC8vLyBcYnJpZWYgQ29udHJvbCBvZiBpbmRpdmlkdWFsIGJyYWNlIHdyYXBwaW5nIGNhc2VzLgorICAvLy8KKyAgLy8vIElmIGBgQnJlYWtCZWZvcmVCcmFjZXNgYCBpcyBzZXQgdG8gYGBCU19DdXN0b21gYCwgdXNlIHRoaXMgdG8gc3BlY2lmeSBob3cKKyAgLy8vIGVhY2ggaW5kaXZpZHVhbCBicmFjZSBjYXNlIHNob3VsZCBiZSBoYW5kbGVkLiBPdGhlcndpc2UsIHRoaXMgaXMgaWdub3JlZC4KKyAgLy8vIFxjb2Rley55YW1sfQorICAvLy8gICAjIEV4YW1wbGUgb2YgdXNhZ2U6CisgIC8vLyAgIEJyZWFrQmVmb3JlQnJhY2VzOiBDdXN0b20KKyAgLy8vICAgQnJhY2VXcmFwcGluZzoKKyAgLy8vICAgICBBZnRlckVudW06IHRydWUKKyAgLy8vICAgICBBZnRlclN0cnVjdDogZmFsc2UKKyAgLy8vICAgICBTcGxpdEVtcHR5RnVuY3Rpb246IGZhbHNlCisgIC8vLyBcZW5kY29kZQorICBCcmFjZVdyYXBwaW5nRmxhZ3MgQnJhY2VXcmFwcGluZzsKKworICAvLy8gXGJyaWVmIElmIGBgdHJ1ZWBgLCB0ZXJuYXJ5IG9wZXJhdG9ycyB3aWxsIGJlIHBsYWNlZCBhZnRlciBsaW5lIGJyZWFrcy4KKyAgLy8vIFxjb2RlCisgIC8vLyAgICB0cnVlOgorICAvLy8gICAgdmVyeVZlcnlWZXJ5VmVyeVZlcnlWZXJ5VmVyeVZlcnlWZXJ5VmVyeVZlcnlMb25nRGVzY3JpcHRpb24KKyAgLy8vICAgICAgICA/IGZpcnN0VmFsdWUKKyAgLy8vICAgICAgICA6IFNlY29uZFZhbHVlVmVyeVZlcnlWZXJ5VmVyeUxvbmc7CisgIC8vLworICAvLy8gICAgZmFsc2U6CisgIC8vLyAgICB2ZXJ5VmVyeVZlcnlWZXJ5VmVyeVZlcnlWZXJ5VmVyeVZlcnlWZXJ5VmVyeUxvbmdEZXNjcmlwdGlvbiA/CisgIC8vLyAgICAgICAgZmlyc3RWYWx1ZSA6CisgIC8vLyAgICAgICAgU2Vjb25kVmFsdWVWZXJ5VmVyeVZlcnlWZXJ5TG9uZzsKKyAgLy8vIFxlbmRjb2RlCisgIGJvb2wgQnJlYWtCZWZvcmVUZXJuYXJ5T3BlcmF0b3JzOworCisgIC8vLyBcYnJpZWYgRGlmZmVyZW50IHdheXMgdG8gYnJlYWsgaW5pdGlhbGl6ZXJzLgorICBlbnVtIEJyZWFrQ29uc3RydWN0b3JJbml0aWFsaXplcnNTdHlsZSB7CisgICAgLy8vIEJyZWFrIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycyBiZWZvcmUgdGhlIGNvbG9uIGFuZCBhZnRlciB0aGUgY29tbWFzLgorICAgIC8vLyBcY29kZQorICAgIC8vLyBDb25zdHJ1Y3RvcigpCisgICAgLy8vICAgICA6IGluaXRpYWxpemVyMSgpLAorICAgIC8vLyAgICAgICBpbml0aWFsaXplcjIoKQorICAgIC8vLyBcZW5kY29kZQorICAgIEJDSVNfQmVmb3JlQ29sb24sCisgICAgLy8vIEJyZWFrIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycyBiZWZvcmUgdGhlIGNvbG9uIGFuZCBjb21tYXMsIGFuZCBhbGlnbgorICAgIC8vLyB0aGUgY29tbWFzIHdpdGggdGhlIGNvbG9uLgorICAgIC8vLyBcY29kZQorICAgIC8vLyBDb25zdHJ1Y3RvcigpCisgICAgLy8vICAgICA6IGluaXRpYWxpemVyMSgpCisgICAgLy8vICAgICAsIGluaXRpYWxpemVyMigpCisgICAgLy8vIFxlbmRjb2RlCisgICAgQkNJU19CZWZvcmVDb21tYSwKKyAgICAvLy8gQnJlYWsgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzIGFmdGVyIHRoZSBjb2xvbiBhbmQgY29tbWFzLgorICAgIC8vLyBcY29kZQorICAgIC8vLyBDb25zdHJ1Y3RvcigpIDoKKyAgICAvLy8gICAgIGluaXRpYWxpemVyMSgpLAorICAgIC8vLyAgICAgaW5pdGlhbGl6ZXIyKCkKKyAgICAvLy8gXGVuZGNvZGUKKyAgICBCQ0lTX0FmdGVyQ29sb24KKyAgfTsKKworICAvLy8gXGJyaWVmIFRoZSBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMgc3R5bGUgdG8gdXNlLgorICBCcmVha0NvbnN0cnVjdG9ySW5pdGlhbGl6ZXJzU3R5bGUgQnJlYWtDb25zdHJ1Y3RvckluaXRpYWxpemVyczsKKworICAvLy8gXGJyaWVmIEJyZWFrIGFmdGVyIGVhY2ggYW5ub3RhdGlvbiBvbiBhIGZpZWxkIGluIEphdmEgZmlsZXMuCisgIC8vLyBcY29kZXsuamF2YX0KKyAgLy8vICAgIHRydWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlOgorICAvLy8gICAgQFBhcnRpYWwgICAgICAgICAgICAgICAgICAgICAgIHZzLiAgICAgQFBhcnRpYWwgQE1vY2sgRGF0YUxvYWQgbG9hZGVyOworICAvLy8gICAgQE1vY2sKKyAgLy8vICAgIERhdGFMb2FkIGxvYWRlcjsKKyAgLy8vIFxlbmRjb2RlCisgIGJvb2wgQnJlYWtBZnRlckphdmFGaWVsZEFubm90YXRpb25zOworCisgIC8vLyBcYnJpZWYgQWxsb3cgYnJlYWtpbmcgc3RyaW5nIGxpdGVyYWxzIHdoZW4gZm9ybWF0dGluZy4KKyAgYm9vbCBCcmVha1N0cmluZ0xpdGVyYWxzOworCisgIC8vLyBcYnJpZWYgVGhlIGNvbHVtbiBsaW1pdC4KKyAgLy8vCisgIC8vLyBBIGNvbHVtbiBsaW1pdCBvZiBgYDBgYCBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIGNvbHVtbiBsaW1pdC4gSW4gdGhpcyBjYXNlLAorICAvLy8gY2xhbmctZm9ybWF0IHdpbGwgcmVzcGVjdCB0aGUgaW5wdXQncyBsaW5lIGJyZWFraW5nIGRlY2lzaW9ucyB3aXRoaW4KKyAgLy8vIHN0YXRlbWVudHMgdW5sZXNzIHRoZXkgY29udHJhZGljdCBvdGhlciBydWxlcy4KKyAgdW5zaWduZWQgQ29sdW1uTGltaXQ7CisKKyAgLy8vIFxicmllZiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IGRlc2NyaWJlcyBjb21tZW50cyB3aXRoIHNwZWNpYWwgbWVhbmluZywKKyAgLy8vIHdoaWNoIHNob3VsZCBub3QgYmUgc3BsaXQgaW50byBsaW5lcyBvciBvdGhlcndpc2UgY2hhbmdlZC4KKyAgLy8vIFxjb2RlCisgIC8vLyAgICAvLyBDb21tZW50UHJhZ21hczogJ14gRk9PQkFSIHByYWdtYTonCisgIC8vLyAgICAvLyBXaWxsIGxlYXZlIHRoZSBmb2xsb3dpbmcgbGluZSB1bmFmZmVjdGVkCisgIC8vLyAgICAjaW5jbHVkZSA8dmVjdG9yPiAvLyBGT09CQVIgcHJhZ21hOiBrZWVwCisgIC8vLyBcZW5kY29kZQorICBzdGQ6OnN0cmluZyBDb21tZW50UHJhZ21hczsKKworICAvLy8gXGJyaWVmIElmIGBgdHJ1ZWBgLCBpbiB0aGUgY2xhc3MgaW5oZXJpdGFuY2UgZXhwcmVzc2lvbiBjbGFuZy1mb3JtYXQgd2lsbAorICAvLy8gYnJlYWsgYmVmb3JlIGBgOmBgIGFuZCBgYCxgYCBpZiB0aGVyZSBpcyBtdWx0aXBsZSBpbmhlcml0YW5jZS4KKyAgLy8vIFxjb2RlCisgIC8vLyAgICB0cnVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZToKKyAgLy8vICAgIGNsYXNzIE15Q2xhc3MgICAgICAgICAgICAgICAgICB2cy4gICAgIGNsYXNzIE15Q2xhc3MgOiBwdWJsaWMgWCwgcHVibGljIFkgeworICAvLy8gICAgICAgIDogcHVibGljIFggICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgLy8vICAgICAgICAsIHB1YmxpYyBZIHsKKyAgLy8vICAgIH07CisgIC8vLyBcZW5kY29kZQorICBib29sIEJyZWFrQmVmb3JlSW5oZXJpdGFuY2VDb21tYTsKKworICAvLy8gXGJyaWVmIElmIGBgdHJ1ZWBgLCBjb25zZWN1dGl2ZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIHdpbGwgYmUgb24gdGhlIHNhbWUKKyAgLy8vIGxpbmUuIElmIGBgZmFsc2VgYCwgZWFjaCBuYW1lc3BhY2UgaXMgZGVjbGFyZWQgb24gYSBuZXcgbGluZS4KKyAgLy8vIFxjb2RlCisgIC8vLyAgIHRydWU6CisgIC8vLyAgIG5hbWVzcGFjZSBGb28geyBuYW1lc3BhY2UgQmFyIHsKKyAgLy8vICAgfX0KKyAgLy8vCisgIC8vLyAgIGZhbHNlOgorICAvLy8gICBuYW1lc3BhY2UgRm9vIHsKKyAgLy8vICAgbmFtZXNwYWNlIEJhciB7CisgIC8vLyAgIH0KKyAgLy8vICAgfQorICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBJZiBpdCBkb2VzIG5vdCBmaXQgb24gYSBzaW5nbGUgbGluZSwgdGhlIG92ZXJmbG93aW5nIG5hbWVzcGFjZXMgZ2V0CisgIC8vLyB3cmFwcGVkOgorICAvLy8gXGNvZGUKKyAgLy8vICAgbmFtZXNwYWNlIEZvbyB7IG5hbWVzcGFjZSBCYXIgeworICAvLy8gICBuYW1lc3BhY2UgRXh0cmEgeworICAvLy8gICB9fX0KKyAgLy8vIFxlbmRjb2RlCisgIGJvb2wgQ29tcGFjdE5hbWVzcGFjZXM7CisKKyAgLy8vIFxicmllZiBJZiB0aGUgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzIGRvbid0IGZpdCBvbiBhIGxpbmUsIHB1dCBlYWNoCisgIC8vLyBpbml0aWFsaXplciBvbiBpdHMgb3duIGxpbmUuCisgIC8vLyBcY29kZQorICAvLy8gICB0cnVlOgorICAvLy8gICBTb21lQ2xhc3M6OkNvbnN0cnVjdG9yKCkKKyAgLy8vICAgICAgIDogYWFhYWFhYWEoYWFhYWFhYWEpLCBhYWFhYWFhYShhYWFhYWFhYSksIGFhYWFhYWFhKGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEpIHsKKyAgLy8vICAgICByZXR1cm4gMDsKKyAgLy8vICAgfQorICAvLy8KKyAgLy8vICAgZmFsc2U6CisgIC8vLyAgIFNvbWVDbGFzczo6Q29uc3RydWN0b3IoKQorICAvLy8gICAgICAgOiBhYWFhYWFhYShhYWFhYWFhYSksIGFhYWFhYWFhKGFhYWFhYWFhKSwKKyAgLy8vICAgICAgICAgYWFhYWFhYWEoYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSkgeworICAvLy8gICAgIHJldHVybiAwOworICAvLy8gICB9CisgIC8vLyBcZW5kY29kZQorICBib29sIENvbnN0cnVjdG9ySW5pdGlhbGl6ZXJBbGxPbk9uZUxpbmVPck9uZVBlckxpbmU7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlIGZvciBpbmRlbnRhdGlvbiBvZiBjb25zdHJ1Y3RvcgorICAvLy8gaW5pdGlhbGl6ZXIgbGlzdHMuCisgIHVuc2lnbmVkIENvbnN0cnVjdG9ySW5pdGlhbGl6ZXJJbmRlbnRXaWR0aDsKKworICAvLy8gXGJyaWVmIEluZGVudCB3aWR0aCBmb3IgbGluZSBjb250aW51YXRpb25zLgorICAvLy8gXGNvZGUKKyAgLy8vICAgIENvbnRpbnVhdGlvbkluZGVudFdpZHRoOiAyCisgIC8vLworICAvLy8gICAgaW50IGkgPSAgICAgICAgIC8vICBWZXJ5VmVyeVZlcnlWZXJ5VmVyeUxvbmdDb21tZW50CisgIC8vLyAgICAgIGxvbmdGdW5jdGlvbiggLy8gQWdhaW4gYSBsb25nIGNvbW1lbnQKKyAgLy8vICAgICAgICBhcmcpOworICAvLy8gXGVuZGNvZGUKKyAgdW5zaWduZWQgQ29udGludWF0aW9uSW5kZW50V2lkdGg7CisKKyAgLy8vIFxicmllZiBJZiBgYHRydWVgYCwgZm9ybWF0IGJyYWNlZCBsaXN0cyBhcyBiZXN0IHN1aXRlZCBmb3IgQysrMTEgYnJhY2VkCisgIC8vLyBsaXN0cy4KKyAgLy8vCisgIC8vLyBJbXBvcnRhbnQgZGlmZmVyZW5jZXM6CisgIC8vLyAtIE5vIHNwYWNlcyBpbnNpZGUgdGhlIGJyYWNlZCBsaXN0LgorICAvLy8gLSBObyBsaW5lIGJyZWFrIGJlZm9yZSB0aGUgY2xvc2luZyBicmFjZS4KKyAgLy8vIC0gSW5kZW50YXRpb24gd2l0aCB0aGUgY29udGludWF0aW9uIGluZGVudCwgbm90IHdpdGggdGhlIGJsb2NrIGluZGVudC4KKyAgLy8vCisgIC8vLyBGdW5kYW1lbnRhbGx5LCBDKysxMSBicmFjZWQgbGlzdHMgYXJlIGZvcm1hdHRlZCBleGFjdGx5IGxpa2UgZnVuY3Rpb24KKyAgLy8vIGNhbGxzIHdvdWxkIGJlIGZvcm1hdHRlZCBpbiB0aGVpciBwbGFjZS4gSWYgdGhlIGJyYWNlZCBsaXN0IGZvbGxvd3MgYSBuYW1lCisgIC8vLyAoZS5nLiBhIHR5cGUgb3IgdmFyaWFibGUgbmFtZSksIGNsYW5nLWZvcm1hdCBmb3JtYXRzIGFzIGlmIHRoZSBgYHt9YGAgd2VyZQorICAvLy8gdGhlIHBhcmVudGhlc2VzIG9mIGEgZnVuY3Rpb24gY2FsbCB3aXRoIHRoYXQgbmFtZS4gSWYgdGhlcmUgaXMgbm8gbmFtZSwKKyAgLy8vIGEgemVyby1sZW5ndGggbmFtZSBpcyBhc3N1bWVkLgorICAvLy8gXGNvZGUKKyAgLy8vICAgIHRydWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlOgorICAvLy8gICAgdmVjdG9yPGludD4geHsxLCAyLCAzLCA0fTsgICAgIHZzLiAgICAgdmVjdG9yPGludD4geHsgMSwgMiwgMywgNCB9OworICAvLy8gICAgdmVjdG9yPFQ+IHh7e30sIHt9LCB7fSwge319OyAgICAgICAgICAgdmVjdG9yPFQ+IHh7IHt9LCB7fSwge30sIHt9IH07CisgIC8vLyAgICBmKE15TWFwW3tjb21wb3NpdGUsIGtleX1dKTsgICAgICAgICAgICBmKE15TWFwW3sgY29tcG9zaXRlLCBrZXkgfV0pOworICAvLy8gICAgbmV3IGludFszXXsxLCAyLCAzfTsgICAgICAgICAgICAgICAgICAgbmV3IGludFszXXsgMSwgMiwgMyB9OworICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBDcHAxMUJyYWNlZExpc3RTdHlsZTsKKworICAvLy8gXGJyaWVmIElmIGBgdHJ1ZWBgLCBhbmFseXplIHRoZSBmb3JtYXR0ZWQgZmlsZSBmb3IgdGhlIG1vc3QgY29tbW9uCisgIC8vLyBhbGlnbm1lbnQgb2YgYGAmYGAgYW5kIGBgKmBgLgorICAvLy8gUG9pbnRlciBhbmQgcmVmZXJlbmNlIGFsaWdubWVudCBzdHlsZXMgYXJlIGdvaW5nIHRvIGJlIHVwZGF0ZWQgYWNjb3JkaW5nCisgIC8vLyB0byB0aGUgcHJlZmVyZW5jZXMgZm91bmQgaW4gdGhlIGZpbGUuCisgIC8vLyBgYFBvaW50ZXJBbGlnbm1lbnRgYCBpcyB0aGVuIHVzZWQgb25seSBhcyBmYWxsYmFjay4KKyAgYm9vbCBEZXJpdmVQb2ludGVyQWxpZ25tZW50OworCisgIC8vLyBcYnJpZWYgRGlzYWJsZXMgZm9ybWF0dGluZyBjb21wbGV0ZWx5LgorICBib29sIERpc2FibGVGb3JtYXQ7CisKKyAgLy8vIFxicmllZiBJZiBgYHRydWVgYCwgY2xhbmctZm9ybWF0IGRldGVjdHMgd2hldGhlciBmdW5jdGlvbiBjYWxscyBhbmQKKyAgLy8vIGRlZmluaXRpb25zIGFyZSBmb3JtYXR0ZWQgd2l0aCBvbmUgcGFyYW1ldGVyIHBlciBsaW5lLgorICAvLy8KKyAgLy8vIEVhY2ggY2FsbCBjYW4gYmUgYmluLXBhY2tlZCwgb25lLXBlci1saW5lIG9yIGluY29uY2x1c2l2ZS4gSWYgaXQgaXMKKyAgLy8vIGluY29uY2x1c2l2ZSwgZS5nLiBjb21wbGV0ZWx5IG9uIG9uZSBsaW5lLCBidXQgYSBkZWNpc2lvbiBuZWVkcyB0byBiZQorICAvLy8gbWFkZSwgY2xhbmctZm9ybWF0IGFuYWx5emVzIHdoZXRoZXIgdGhlcmUgYXJlIG90aGVyIGJpbi1wYWNrZWQgY2FzZXMgaW4KKyAgLy8vIHRoZSBpbnB1dCBmaWxlIGFuZCBhY3QgYWNjb3JkaW5nbHkuCisgIC8vLworICAvLy8gTk9URTogVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmxhZywgdGhhdCBtaWdodCBnbyBhd2F5IG9yIGJlIHJlbmFtZWQuIERvCisgIC8vLyBub3QgdXNlIHRoaXMgaW4gY29uZmlnIGZpbGVzLCBldGMuIFVzZSBhdCB5b3VyIG93biByaXNrLgorICBib29sIEV4cGVyaW1lbnRhbEF1dG9EZXRlY3RCaW5QYWNraW5nOworCisgIC8vLyBcYnJpZWYgSWYgYGB0cnVlYGAsIGNsYW5nLWZvcm1hdCBhZGRzIG1pc3NpbmcgbmFtZXNwYWNlIGVuZCBjb21tZW50cyBhbmQKKyAgLy8vIGZpeGVzIGludmFsaWQgZXhpc3Rpbmcgb25lcy4KKyAgLy8vIFxjb2RlCisgIC8vLyAgICB0cnVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZToKKyAgLy8vICAgIG5hbWVzcGFjZSBhIHsgICAgICAgICAgICAgICAgICB2cy4gICAgIG5hbWVzcGFjZSBhIHsKKyAgLy8vICAgIGZvbygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbygpOworICAvLy8gICAgfSAvLyBuYW1lc3BhY2UgYTsgICAgICAgICAgICAgICAgICAgICAgfQorICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBGaXhOYW1lc3BhY2VDb21tZW50czsKKworICAvLy8gXGJyaWVmIEEgdmVjdG9yIG9mIG1hY3JvcyB0aGF0IHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBmb3JlYWNoIGxvb3BzCisgIC8vLyBpbnN0ZWFkIG9mIGFzIGZ1bmN0aW9uIGNhbGxzLgorICAvLy8KKyAgLy8vIFRoZXNlIGFyZSBleHBlY3RlZCB0byBiZSBtYWNyb3Mgb2YgdGhlIGZvcm06CisgIC8vLyBcY29kZQorICAvLy8gICBGT1JFQUNIKDx2YXJpYWJsZS1kZWNsYXJhdGlvbj4sIC4uLikKKyAgLy8vICAgICA8bG9vcC1ib2R5PgorICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBJbiB0aGUgLmNsYW5nLWZvcm1hdCBjb25maWd1cmF0aW9uIGZpbGUsIHRoaXMgY2FuIGJlIGNvbmZpZ3VyZWQgbGlrZToKKyAgLy8vIFxjb2Rley55YW1sfQorICAvLy8gICBGb3JFYWNoTWFjcm9zOiBbJ1JBTkdFU19GT1InLCAnRk9SRUFDSCddCisgIC8vLyBcZW5kY29kZQorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlOiBCT09TVF9GT1JFQUNILgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRm9yRWFjaE1hY3JvczsKKworICAvLy8gXGJyaWVmIFN0eWxlcyBmb3Igc29ydGluZyBtdWx0aXBsZSBgYCNpbmNsdWRlYGAgYmxvY2tzLgorICBlbnVtIEluY2x1ZGVCbG9ja3NTdHlsZSB7CisgICAgLy8vIFxicmllZiBTb3J0IGVhY2ggYGAjaW5jbHVkZWBgIGJsb2NrIHNlcGFyYXRlbHkuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgICNpbmNsdWRlICJiLmgiICAgICAgICAgICAgICAgaW50byAgICAgICNpbmNsdWRlICJiLmgiCisgICAgLy8vCisgICAgLy8vICAgICNpbmNsdWRlIDxsaWIvbWFpbi5oPiAgICAgICAgICAgICAgICAgICNpbmNsdWRlICJhLmgiCisgICAgLy8vICAgICNpbmNsdWRlICJhLmgiICAgICAgICAgICAgICAgICAgICAgICAgICNpbmNsdWRlIDxsaWIvbWFpbi5oPgorICAgIC8vLyBcZW5kY29kZQorICAgIElCU19QcmVzZXJ2ZSwKKyAgICAvLy8gXGJyaWVmIE1lcmdlIG11bHRpcGxlIGBgI2luY2x1ZGVgYCBibG9ja3MgdG9nZXRoZXIgYW5kIHNvcnQgYXMgb25lLgorICAgIC8vLyBcY29kZQorICAgIC8vLyAgICAjaW5jbHVkZSAiYi5oIiAgICAgICAgICAgICAgIGludG8gICAgICAjaW5jbHVkZSAiYS5oIgorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaW5jbHVkZSAiYi5oIgorICAgIC8vLyAgICAjaW5jbHVkZSA8bGliL21haW4uaD4gICAgICAgICAgICAgICAgICAjaW5jbHVkZSA8bGliL21haW4uaD4KKyAgICAvLy8gICAgI2luY2x1ZGUgImEuaCIKKyAgICAvLy8gXGVuZGNvZGUKKyAgICBJQlNfTWVyZ2UsCisgICAgLy8vIFxicmllZiBNZXJnZSBtdWx0aXBsZSBgYCNpbmNsdWRlYGAgYmxvY2tzIHRvZ2V0aGVyIGFuZCBzb3J0IGFzIG9uZS4KKyAgICAvLy8gVGhlbiBzcGxpdCBpbnRvIGdyb3VwcyBiYXNlZCBvbiBjYXRlZ29yeSBwcmlvcml0eS4gU2VlCisgICAgLy8vIGBgSW5jbHVkZUNhdGVnb3JpZXNgYC4KKyAgICAvLy8gXGNvZGUKKyAgICAvLy8gICAgI2luY2x1ZGUgImIuaCIgICAgICAgICAgICAgICBpbnRvICAgICAgI2luY2x1ZGUgImEuaCIKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2luY2x1ZGUgImIuaCIKKyAgICAvLy8gICAgI2luY2x1ZGUgPGxpYi9tYWluLmg+CisgICAgLy8vICAgICNpbmNsdWRlICJhLmgiICAgICAgICAgICAgICAgICAgICAgICAgICNpbmNsdWRlIDxsaWIvbWFpbi5oPgorICAgIC8vLyBcZW5kY29kZQorICAgIElCU19SZWdyb3VwLAorICB9OworCisgIC8vLyBcYnJpZWYgRGVwZW5kZW50IG9uIHRoZSB2YWx1ZSwgbXVsdGlwbGUgYGAjaW5jbHVkZWBgIGJsb2NrcyBjYW4gYmUgc29ydGVkCisgIC8vLyBhcyBvbmUgYW5kIGRpdmlkZWQgYmFzZWQgb24gY2F0ZWdvcnkuCisgIEluY2x1ZGVCbG9ja3NTdHlsZSBJbmNsdWRlQmxvY2tzOworCisgIC8vLyBcYnJpZWYgU2VlIGRvY3VtZW50YXRpb24gb2YgYGBJbmNsdWRlQ2F0ZWdvcmllc2BgLgorICBzdHJ1Y3QgSW5jbHVkZUNhdGVnb3J5IHsKKyAgICAvLy8gXGJyaWVmIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCB0aGlzIGNhdGVnb3J5IG1hdGNoZXMuCisgICAgc3RkOjpzdHJpbmcgUmVnZXg7CisgICAgLy8vIFxicmllZiBUaGUgcHJpb3JpdHkgdG8gYXNzaWduIHRvIHRoaXMgY2F0ZWdvcnkuCisgICAgaW50IFByaW9yaXR5OworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbmNsdWRlQ2F0ZWdvcnkgJk90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gUmVnZXggPT0gT3RoZXIuUmVnZXggJiYgUHJpb3JpdHkgPT0gT3RoZXIuUHJpb3JpdHk7CisgICAgfQorICB9OworCisgIC8vLyBcYnJpZWYgUmVndWxhciBleHByZXNzaW9ucyBkZW5vdGluZyB0aGUgZGlmZmVyZW50IGBgI2luY2x1ZGVgYCBjYXRlZ29yaWVzCisgIC8vLyB1c2VkIGZvciBvcmRlcmluZyBgYCNpbmNsdWRlc2BgLgorICAvLy8KKyAgLy8vIFRoZXNlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZW5hbWUgb2YgYW4gaW5jbHVkZQorICAvLy8gKGluY2x1ZGluZyB0aGUgPD4gb3IgIiIpIGluIG9yZGVyLiBUaGUgdmFsdWUgYmVsb25naW5nIHRvIHRoZSBmaXJzdAorICAvLy8gbWF0Y2hpbmcgcmVndWxhciBleHByZXNzaW9uIGlzIGFzc2lnbmVkIGFuZCBgYCNpbmNsdWRlc2BgIGFyZSBzb3J0ZWQgZmlyc3QKKyAgLy8vIGFjY29yZGluZyB0byBpbmNyZWFzaW5nIGNhdGVnb3J5IG51bWJlciBhbmQgdGhlbiBhbHBoYWJldGljYWxseSB3aXRoaW4KKyAgLy8vIGVhY2ggY2F0ZWdvcnkuCisgIC8vLworICAvLy8gSWYgbm9uZSBvZiB0aGUgcmVndWxhciBleHByZXNzaW9ucyBtYXRjaCwgSU5UX01BWCBpcyBhc3NpZ25lZCBhcworICAvLy8gY2F0ZWdvcnkuIFRoZSBtYWluIGhlYWRlciBmb3IgYSBzb3VyY2UgZmlsZSBhdXRvbWF0aWNhbGx5IGdldHMgY2F0ZWdvcnkgMC4KKyAgLy8vIHNvIHRoYXQgaXQgaXMgZ2VuZXJhbGx5IGtlcHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYGAjaW5jbHVkZXNgYAorICAvLy8gKGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0NvZGluZ1N0YW5kYXJkcy5odG1sI2luY2x1ZGUtc3R5bGUpLiBIb3dldmVyLCB5b3UKKyAgLy8vIGNhbiBhbHNvIGFzc2lnbiBuZWdhdGl2ZSBwcmlvcml0aWVzIGlmIHlvdSBoYXZlIGNlcnRhaW4gaGVhZGVycyB0aGF0CisgIC8vLyBhbHdheXMgbmVlZCB0byBiZSBmaXJzdC4KKyAgLy8vCisgIC8vLyBUbyBjb25maWd1cmUgdGhpcyBpbiB0aGUgLmNsYW5nLWZvcm1hdCBmaWxlLCB1c2U6CisgIC8vLyBcY29kZXsueWFtbH0KKyAgLy8vICAgSW5jbHVkZUNhdGVnb3JpZXM6CisgIC8vLyAgICAgLSBSZWdleDogICAgICAgICAgICdeIihsbHZtfGxsdm0tY3xjbGFuZ3xjbGFuZy1jKS8nCisgIC8vLyAgICAgICBQcmlvcml0eTogICAgICAgIDIKKyAgLy8vICAgICAtIFJlZ2V4OiAgICAgICAgICAgJ14oPHwiKGd0ZXN0fGdtb2NrfGlzbHxqc29uKS8pJworICAvLy8gICAgICAgUHJpb3JpdHk6ICAgICAgICAzCisgIC8vLyAgICAgLSBSZWdleDogICAgICAgICAgICcuKicKKyAgLy8vICAgICAgIFByaW9yaXR5OiAgICAgICAgMQorICAvLy8gXGVuZGNvZGUKKyAgc3RkOjp2ZWN0b3I8SW5jbHVkZUNhdGVnb3J5PiBJbmNsdWRlQ2F0ZWdvcmllczsKKworICAvLy8gXGJyaWVmIFNwZWNpZnkgYSByZWd1bGFyIGV4cHJlc3Npb24gb2Ygc3VmZml4ZXMgdGhhdCBhcmUgYWxsb3dlZCBpbiB0aGUKKyAgLy8vIGZpbGUtdG8tbWFpbi1pbmNsdWRlIG1hcHBpbmcuCisgIC8vLworICAvLy8gV2hlbiBndWVzc2luZyB3aGV0aGVyIGEgI2luY2x1ZGUgaXMgdGhlICJtYWluIiBpbmNsdWRlICh0byBhc3NpZ24KKyAgLy8vIGNhdGVnb3J5IDAsIHNlZSBhYm92ZSksIHVzZSB0aGlzIHJlZ2V4IG9mIGFsbG93ZWQgc3VmZml4ZXMgdG8gdGhlIGhlYWRlcgorICAvLy8gc3RlbS4gQSBwYXJ0aWFsIG1hdGNoIGlzIGRvbmUsIHNvIHRoYXQ6CisgIC8vLyAtICIiIG1lYW5zICJhcmJpdHJhcnkgc3VmZml4IgorICAvLy8gLSAiJCIgbWVhbnMgIm5vIHN1ZmZpeCIKKyAgLy8vCisgIC8vLyBGb3IgZXhhbXBsZSwgaWYgY29uZmlndXJlZCB0byAiKF90ZXN0KT8kIiwgdGhlbiBhIGhlYWRlciBhLmggd291bGQgYmUgc2VlbgorICAvLy8gYXMgdGhlICJtYWluIiBpbmNsdWRlIGluIGJvdGggYS5jYyBhbmQgYV90ZXN0LmNjLgorICBzdGQ6OnN0cmluZyBJbmNsdWRlSXNNYWluUmVnZXg7CisKKyAgLy8vIFxicmllZiBJbmRlbnQgY2FzZSBsYWJlbHMgb25lIGxldmVsIGZyb20gdGhlIHN3aXRjaCBzdGF0ZW1lbnQuCisgIC8vLworICAvLy8gV2hlbiBgYGZhbHNlYGAsIHVzZSB0aGUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbCBhcyBmb3IgdGhlIHN3aXRjaCBzdGF0ZW1lbnQuCisgIC8vLyBTd2l0Y2ggc3RhdGVtZW50IGJvZHkgaXMgYWx3YXlzIGluZGVudGVkIG9uZSBsZXZlbCBtb3JlIHRoYW4gY2FzZSBsYWJlbHMuCisgIC8vLyBcY29kZQorICAvLy8gICAgZmFsc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZToKKyAgLy8vICAgIHN3aXRjaCAoZm9vbCkgeyAgICAgICAgICAgICAgICB2cy4gICAgIHN3aXRjaCAoZm9vbCkgeworICAvLy8gICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgIC8vLyAgICAgIGJhcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyKCk7CisgIC8vLyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgIC8vLyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgIC8vLyAgICAgIHBsb3AoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvcCgpOworICAvLy8gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBJbmRlbnRDYXNlTGFiZWxzOworCisgIC8vLyBcYnJpZWYgT3B0aW9ucyBmb3IgaW5kZW50aW5nIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLgorICBlbnVtIFBQRGlyZWN0aXZlSW5kZW50U3R5bGUgeworICAgIC8vLyBEb2VzIG5vdCBpbmRlbnQgYW55IGRpcmVjdGl2ZXMuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgICNpZiBGT08KKyAgICAvLy8gICAgI2lmIEJBUgorICAgIC8vLyAgICAjaW5jbHVkZSA8Zm9vPgorICAgIC8vLyAgICAjZW5kaWYKKyAgICAvLy8gICAgI2VuZGlmCisgICAgLy8vIFxlbmRjb2RlCisgICAgUFBESVNfTm9uZSwKKyAgICAvLy8gSW5kZW50cyBkaXJlY3RpdmVzIGFmdGVyIHRoZSBoYXNoLgorICAgIC8vLyBcY29kZQorICAgIC8vLyAgICAjaWYgRk9PCisgICAgLy8vICAgICMgIGlmIEJBUgorICAgIC8vLyAgICAjICAgIGluY2x1ZGUgPGZvbz4KKyAgICAvLy8gICAgIyAgZW5kaWYKKyAgICAvLy8gICAgI2VuZGlmCisgICAgLy8vIFxlbmRjb2RlCisgICAgUFBESVNfQWZ0ZXJIYXNoCisgIH07CisKKyAgLy8vIFxicmllZiBUaGUgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSBpbmRlbnRpbmcgc3R5bGUgdG8gdXNlLgorICBQUERpcmVjdGl2ZUluZGVudFN0eWxlIEluZGVudFBQRGlyZWN0aXZlczsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgY29sdW1ucyB0byB1c2UgZm9yIGluZGVudGF0aW9uLgorICAvLy8gXGNvZGUKKyAgLy8vICAgIEluZGVudFdpZHRoOiAzCisgIC8vLworICAvLy8gICAgdm9pZCBmKCkgeworICAvLy8gICAgICAgc29tZUZ1bmN0aW9uKCk7CisgIC8vLyAgICAgICBpZiAodHJ1ZSwgZmFsc2UpIHsKKyAgLy8vICAgICAgICAgIGYoKTsKKyAgLy8vICAgICAgIH0KKyAgLy8vICAgIH0KKyAgLy8vIFxlbmRjb2RlCisgIHVuc2lnbmVkIEluZGVudFdpZHRoOworCisgIC8vLyBcYnJpZWYgSW5kZW50IGlmIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBvciBkZWNsYXJhdGlvbiBpcyB3cmFwcGVkIGFmdGVyIHRoZQorICAvLy8gdHlwZS4KKyAgLy8vIFxjb2RlCisgIC8vLyAgICB0cnVlOgorICAvLy8gICAgTG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ1JldHVyblR5cGUKKyAgLy8vICAgICAgICBMb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ0Z1bmN0aW9uRGVjbGFyYXRpb24oKTsKKyAgLy8vCisgIC8vLyAgICBmYWxzZToKKyAgLy8vICAgIExvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdSZXR1cm5UeXBlCisgIC8vLyAgICBMb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ0Z1bmN0aW9uRGVjbGFyYXRpb24oKTsKKyAgLy8vIFxlbmRjb2RlCisgIGJvb2wgSW5kZW50V3JhcHBlZEZ1bmN0aW9uTmFtZXM7CisKKyAgLy8vIFxicmllZiBRdW90YXRpb24gc3R5bGVzIGZvciBKYXZhU2NyaXB0IHN0cmluZ3MuIERvZXMgbm90IGFmZmVjdCB0ZW1wbGF0ZQorICAvLy8gc3RyaW5ncy4KKyAgZW51bSBKYXZhU2NyaXB0UXVvdGVTdHlsZSB7CisgICAgLy8vIExlYXZlIHN0cmluZyBxdW90ZXMgYXMgdGhleSBhcmUuCisgICAgLy8vIFxjb2Rley5qc30KKyAgICAvLy8gICAgc3RyaW5nMSA9ICJmb28iOworICAgIC8vLyAgICBzdHJpbmcyID0gJ2Jhcic7CisgICAgLy8vIFxlbmRjb2RlCisgICAgSlNRU19MZWF2ZSwKKyAgICAvLy8gQWx3YXlzIHVzZSBzaW5nbGUgcXVvdGVzLgorICAgIC8vLyBcY29kZXsuanN9CisgICAgLy8vICAgIHN0cmluZzEgPSAnZm9vJzsKKyAgICAvLy8gICAgc3RyaW5nMiA9ICdiYXInOworICAgIC8vLyBcZW5kY29kZQorICAgIEpTUVNfU2luZ2xlLAorICAgIC8vLyBBbHdheXMgdXNlIGRvdWJsZSBxdW90ZXMuCisgICAgLy8vIFxjb2Rley5qc30KKyAgICAvLy8gICAgc3RyaW5nMSA9ICJmb28iOworICAgIC8vLyAgICBzdHJpbmcyID0gImJhciI7CisgICAgLy8vIFxlbmRjb2RlCisgICAgSlNRU19Eb3VibGUKKyAgfTsKKworICAvLy8gXGJyaWVmIFRoZSBKYXZhU2NyaXB0UXVvdGVTdHlsZSB0byB1c2UgZm9yIEphdmFTY3JpcHQgc3RyaW5ncy4KKyAgSmF2YVNjcmlwdFF1b3RlU3R5bGUgSmF2YVNjcmlwdFF1b3RlczsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdG8gd3JhcCBKYXZhU2NyaXB0IGltcG9ydC9leHBvcnQgc3RhdGVtZW50cy4KKyAgLy8vIFxjb2Rley5qc30KKyAgLy8vICAgIHRydWU6CisgIC8vLyAgICBpbXBvcnQgeworICAvLy8gICAgICAgIFZlcnlMb25nSW1wb3J0c0FyZUFubm95aW5nLAorICAvLy8gICAgICAgIFZlcnlMb25nSW1wb3J0c0FyZUFubm95aW5nLAorICAvLy8gICAgICAgIFZlcnlMb25nSW1wb3J0c0FyZUFubm95aW5nLAorICAvLy8gICAgfSBmcm9tICdzb21lL21vZHVsZS5qcycKKyAgLy8vCisgIC8vLyAgICBmYWxzZToKKyAgLy8vICAgIGltcG9ydCB7VmVyeUxvbmdJbXBvcnRzQXJlQW5ub3lpbmcsIFZlcnlMb25nSW1wb3J0c0FyZUFubm95aW5nLCBWZXJ5TG9uZ0ltcG9ydHNBcmVBbm5veWluZyx9IGZyb20gInNvbWUvbW9kdWxlLmpzIgorICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBKYXZhU2NyaXB0V3JhcEltcG9ydHM7CisKKyAgLy8vIFxicmllZiBJZiB0cnVlLCB0aGUgZW1wdHkgbGluZSBhdCB0aGUgc3RhcnQgb2YgYmxvY2tzIGlzIGtlcHQuCisgIC8vLyBcY29kZQorICAvLy8gICAgdHJ1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2U6CisgIC8vLyAgICBpZiAoZm9vKSB7ICAgICAgICAgICAgICAgICAgICAgdnMuICAgICBpZiAoZm9vKSB7CisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcigpOworICAvLy8gICAgICBiYXIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAvLy8gICAgfQorICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBLZWVwRW1wdHlMaW5lc0F0VGhlU3RhcnRPZkJsb2NrczsKKworICAvLy8gXGJyaWVmIFN1cHBvcnRlZCBsYW5ndWFnZXMuCisgIC8vLworICAvLy8gV2hlbiBzdG9yZWQgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUsIHNwZWNpZmllcyB0aGUgbGFuZ3VhZ2UsIHRoYXQgdGhlCisgIC8vLyBjb25maWd1cmF0aW9uIHRhcmdldHMuIFdoZW4gcGFzc2VkIHRvIHRoZSBgYHJlZm9ybWF0KClgYCBmdW5jdGlvbiwgZW5hYmxlcworICAvLy8gc3ludGF4IGZlYXR1cmVzIHNwZWNpZmljIHRvIHRoZSBsYW5ndWFnZS4KKyAgZW51bSBMYW5ndWFnZUtpbmQgeworICAgIC8vLyBEbyBub3QgdXNlLgorICAgIExLX05vbmUsCisgICAgLy8vIFNob3VsZCBiZSB1c2VkIGZvciBDLCBDKysuCisgICAgTEtfQ3BwLAorICAgIC8vLyBTaG91bGQgYmUgdXNlZCBmb3IgSmF2YS4KKyAgICBMS19KYXZhLAorICAgIC8vLyBTaG91bGQgYmUgdXNlZCBmb3IgSmF2YVNjcmlwdC4KKyAgICBMS19KYXZhU2NyaXB0LAorICAgIC8vLyBTaG91bGQgYmUgdXNlZCBmb3IgT2JqZWN0aXZlLUMsIE9iamVjdGl2ZS1DKysuCisgICAgTEtfT2JqQywKKyAgICAvLy8gU2hvdWxkIGJlIHVzZWQgZm9yIFByb3RvY29sIEJ1ZmZlcnMKKyAgICAvLy8gKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvKS4KKyAgICBMS19Qcm90bywKKyAgICAvLy8gU2hvdWxkIGJlIHVzZWQgZm9yIFRhYmxlR2VuIGNvZGUuCisgICAgTEtfVGFibGVHZW4sCisgICAgLy8vIFNob3VsZCBiZSB1c2VkIGZvciBQcm90b2NvbCBCdWZmZXIgbWVzc2FnZXMgaW4gdGV4dCBmb3JtYXQKKyAgICAvLy8gKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvKS4KKyAgICBMS19UZXh0UHJvdG8KKyAgfTsKKyAgYm9vbCBpc0NwcCgpIGNvbnN0IHsgcmV0dXJuIExhbmd1YWdlID09IExLX0NwcCB8fCBMYW5ndWFnZSA9PSBMS19PYmpDOyB9CisKKyAgLy8vIFxicmllZiBMYW5ndWFnZSwgdGhpcyBmb3JtYXQgc3R5bGUgaXMgdGFyZ2V0ZWQgYXQuCisgIExhbmd1YWdlS2luZCBMYW5ndWFnZTsKKworICAvLy8gXGJyaWVmIEEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIG1hY3JvcyB0aGF0IHN0YXJ0IGEgYmxvY2suCisgIC8vLyBcY29kZQorICAvLy8gICAgIyBXaXRoOgorICAvLy8gICAgTWFjcm9CbG9ja0JlZ2luOiAiXk5TX01BUF9CRUdJTnxcCisgIC8vLyAgICBOU19UQUJMRV9IRUFEJCIKKyAgLy8vICAgIE1hY3JvQmxvY2tFbmQ6ICJeXAorICAvLy8gICAgTlNfTUFQX0VORHxcCisgIC8vLyAgICBOU19UQUJMRV8uKl9FTkQkIgorICAvLy8KKyAgLy8vICAgIE5TX01BUF9CRUdJTgorICAvLy8gICAgICBmb28oKTsKKyAgLy8vICAgIE5TX01BUF9FTkQKKyAgLy8vCisgIC8vLyAgICBOU19UQUJMRV9IRUFECisgIC8vLyAgICAgIGJhcigpOworICAvLy8gICAgTlNfVEFCTEVfRk9PX0VORAorICAvLy8KKyAgLy8vICAgICMgV2l0aG91dDoKKyAgLy8vICAgIE5TX01BUF9CRUdJTgorICAvLy8gICAgZm9vKCk7CisgIC8vLyAgICBOU19NQVBfRU5ECisgIC8vLworICAvLy8gICAgTlNfVEFCTEVfSEVBRAorICAvLy8gICAgYmFyKCk7CisgIC8vLyAgICBOU19UQUJMRV9GT09fRU5ECisgIC8vLyBcZW5kY29kZQorICBzdGQ6OnN0cmluZyBNYWNyb0Jsb2NrQmVnaW47CisKKyAgLy8vIFxicmllZiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyBtYWNyb3MgdGhhdCBlbmQgYSBibG9jay4KKyAgc3RkOjpzdHJpbmcgTWFjcm9CbG9ja0VuZDsKKworICAvLy8gXGJyaWVmIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25zZWN1dGl2ZSBlbXB0eSBsaW5lcyB0byBrZWVwLgorICAvLy8gXGNvZGUKKyAgLy8vICAgIE1heEVtcHR5TGluZXNUb0tlZXA6IDEgICAgICAgICB2cy4gICAgIE1heEVtcHR5TGluZXNUb0tlZXA6IDAKKyAgLy8vICAgIGludCBmKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmKCkgeworICAvLy8gICAgICBpbnQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpID0gMTsKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZm9vKCk7CisgIC8vLyAgICAgIGkgPSBmb28oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgIC8vLyAgICAgIHJldHVybiBpOworICAvLy8gICAgfQorICAvLy8gXGVuZGNvZGUKKyAgdW5zaWduZWQgTWF4RW1wdHlMaW5lc1RvS2VlcDsKKworICAvLy8gXGJyaWVmIERpZmZlcmVudCB3YXlzIHRvIGluZGVudCBuYW1lc3BhY2UgY29udGVudHMuCisgIGVudW0gTmFtZXNwYWNlSW5kZW50YXRpb25LaW5kIHsKKyAgICAvLy8gRG9uJ3QgaW5kZW50IGluIG5hbWVzcGFjZXMuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgIG5hbWVzcGFjZSBvdXQgeworICAgIC8vLyAgICBpbnQgaTsKKyAgICAvLy8gICAgbmFtZXNwYWNlIGluIHsKKyAgICAvLy8gICAgaW50IGk7CisgICAgLy8vICAgIH0KKyAgICAvLy8gICAgfQorICAgIC8vLyBcZW5kY29kZQorICAgIE5JX05vbmUsCisgICAgLy8vIEluZGVudCBvbmx5IGluIGlubmVyIG5hbWVzcGFjZXMgKG5lc3RlZCBpbiBvdGhlciBuYW1lc3BhY2VzKS4KKyAgICAvLy8gXGNvZGUKKyAgICAvLy8gICAgbmFtZXNwYWNlIG91dCB7CisgICAgLy8vICAgIGludCBpOworICAgIC8vLyAgICBuYW1lc3BhY2UgaW4geworICAgIC8vLyAgICAgIGludCBpOworICAgIC8vLyAgICB9CisgICAgLy8vICAgIH0KKyAgICAvLy8gXGVuZGNvZGUKKyAgICBOSV9Jbm5lciwKKyAgICAvLy8gSW5kZW50IGluIGFsbCBuYW1lc3BhY2VzLgorICAgIC8vLyBcY29kZQorICAgIC8vLyAgICBuYW1lc3BhY2Ugb3V0IHsKKyAgICAvLy8gICAgICBpbnQgaTsKKyAgICAvLy8gICAgICBuYW1lc3BhY2UgaW4geworICAgIC8vLyAgICAgICAgaW50IGk7CisgICAgLy8vICAgICAgfQorICAgIC8vLyAgICB9CisgICAgLy8vIFxlbmRjb2RlCisgICAgTklfQWxsCisgIH07CisKKyAgLy8vIFxicmllZiBUaGUgaW5kZW50YXRpb24gdXNlZCBmb3IgbmFtZXNwYWNlcy4KKyAgTmFtZXNwYWNlSW5kZW50YXRpb25LaW5kIE5hbWVzcGFjZUluZGVudGF0aW9uOworCisgIC8vLyBcYnJpZWYgQ29udHJvbHMgYmluLXBhY2tpbmcgT2JqZWN0aXZlLUMgcHJvdG9jb2wgY29uZm9ybWFuY2UgbGlzdAorICAvLy8gaXRlbXMgaW50byBhcyBmZXcgbGluZXMgYXMgcG9zc2libGUgd2hlbiB0aGV5IGdvIG92ZXIgYGBDb2x1bW5MaW1pdGBgLgorICAvLy8KKyAgLy8vIElmIGBgQXV0b2BgICh0aGUgZGVmYXVsdCksIGRlbGVnYXRlcyB0byB0aGUgdmFsdWUgaW4KKyAgLy8vIGBgQmluUGFja1BhcmFtZXRlcnNgYC4gSWYgdGhhdCBpcyBgYHRydWVgYCwgYmluLXBhY2tzIE9iamVjdGl2ZS1DCisgIC8vLyBwcm90b2NvbCBjb25mb3JtYW5jZSBsaXN0IGl0ZW1zIGludG8gYXMgZmV3IGxpbmVzIGFzIHBvc3NpYmxlCisgIC8vLyB3aGVuZXZlciB0aGV5IGdvIG92ZXIgYGBDb2x1bW5MaW1pdGBgLgorICAvLy8KKyAgLy8vIElmIGBgQWx3YXlzYGAsIGFsd2F5cyBiaW4tcGFja3MgT2JqZWN0aXZlLUMgcHJvdG9jb2wgY29uZm9ybWFuY2UKKyAgLy8vIGxpc3QgaXRlbXMgaW50byBhcyBmZXcgbGluZXMgYXMgcG9zc2libGUgd2hlbmV2ZXIgdGhleSBnbyBvdmVyCisgIC8vLyBgYENvbHVtbkxpbWl0YGAuCisgIC8vLworICAvLy8gSWYgYGBOZXZlcmBgLCBsYXlzIG91dCBPYmplY3RpdmUtQyBwcm90b2NvbCBjb25mb3JtYW5jZSBsaXN0IGl0ZW1zCisgIC8vLyBvbnRvIGluZGl2aWR1YWwgbGluZXMgd2hlbmV2ZXIgdGhleSBnbyBvdmVyIGBgQ29sdW1uTGltaXRgYC4KKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gICAgQWx3YXlzIChvciBBdXRvLCBpZiBCaW5QYWNrUGFyYW1ldGVycz10cnVlKToKKyAgLy8vICAgIEBpbnRlcmZhY2UgY2NjY2NjY2NjY2NjYyAoKSA8CisgIC8vLyAgICAgICAgY2NjY2NjY2NjY2NjYywgY2NjY2NjY2NjY2NjYywKKyAgLy8vICAgICAgICBjY2NjY2NjY2NjY2NjLCBjY2NjY2NjY2NjY2NjPiB7CisgIC8vLyAgICB9CisgIC8vLworICAvLy8gICAgTmV2ZXIgKG9yIEF1dG8sIGlmIEJpblBhY2tQYXJhbWV0ZXJzPWZhbHNlKToKKyAgLy8vICAgIEBpbnRlcmZhY2UgZGRkZGRkZGRkZGRkZCAoKSA8CisgIC8vLyAgICAgICAgZGRkZGRkZGRkZGRkZCwKKyAgLy8vICAgICAgICBkZGRkZGRkZGRkZGRkLAorICAvLy8gICAgICAgIGRkZGRkZGRkZGRkZGQsCisgIC8vLyAgICAgICAgZGRkZGRkZGRkZGRkZD4geworICAvLy8gICAgfQorICAvLy8gXGVuZGNvZGUKKyAgQmluUGFja1N0eWxlIE9iakNCaW5QYWNrUHJvdG9jb2xMaXN0OworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZSBmb3IgaW5kZW50YXRpb24gb2YgT2JqQyBibG9ja3MuCisgIC8vLyBcY29kZXsub2JqY30KKyAgLy8vICAgIE9iakNCbG9ja0luZGVudFdpZHRoOiA0CisgIC8vLworICAvLy8gICAgW29wZXJhdGlvbiBzZXRDb21wbGV0aW9uQmxvY2s6XnsKKyAgLy8vICAgICAgICBbc2VsZiBvbk9wZXJhdGlvbkRvbmVdOworICAvLy8gICAgfV07CisgIC8vLyBcZW5kY29kZQorICB1bnNpZ25lZCBPYmpDQmxvY2tJbmRlbnRXaWR0aDsKKworICAvLy8gXGJyaWVmIEFkZCBhIHNwYWNlIGFmdGVyIGBgQHByb3BlcnR5YGAgaW4gT2JqZWN0aXZlLUMsIGkuZS4gdXNlCisgIC8vLyBgYEBwcm9wZXJ0eSAocmVhZG9ubHkpYGAgaW5zdGVhZCBvZiBgYEBwcm9wZXJ0eShyZWFkb25seSlgYC4KKyAgYm9vbCBPYmpDU3BhY2VBZnRlclByb3BlcnR5OworCisgIC8vLyBcYnJpZWYgQWRkIGEgc3BhY2UgaW4gZnJvbnQgb2YgYW4gT2JqZWN0aXZlLUMgcHJvdG9jb2wgbGlzdCwgaS5lLiB1c2UKKyAgLy8vIGBgRm9vIDxQcm90b2NvbD5gYCBpbnN0ZWFkIG9mIGBgRm9vPFByb3RvY29sPmBgLgorICBib29sIE9iakNTcGFjZUJlZm9yZVByb3RvY29sTGlzdDsKKworICAvLy8gXGJyaWVmIFRoZSBwZW5hbHR5IGZvciBicmVha2luZyBhcm91bmQgYW4gYXNzaWdubWVudCBvcGVyYXRvci4KKyAgdW5zaWduZWQgUGVuYWx0eUJyZWFrQXNzaWdubWVudDsKKworICAvLy8gXGJyaWVmIFRoZSBwZW5hbHR5IGZvciBicmVha2luZyBhIGZ1bmN0aW9uIGNhbGwgYWZ0ZXIgYGBjYWxsKGBgLgorICB1bnNpZ25lZCBQZW5hbHR5QnJlYWtCZWZvcmVGaXJzdENhbGxQYXJhbWV0ZXI7CisKKyAgLy8vIFxicmllZiBUaGUgcGVuYWx0eSBmb3IgZWFjaCBsaW5lIGJyZWFrIGludHJvZHVjZWQgaW5zaWRlIGEgY29tbWVudC4KKyAgdW5zaWduZWQgUGVuYWx0eUJyZWFrQ29tbWVudDsKKworICAvLy8gXGJyaWVmIFRoZSBwZW5hbHR5IGZvciBicmVha2luZyBiZWZvcmUgdGhlIGZpcnN0IGBgPDxgYC4KKyAgdW5zaWduZWQgUGVuYWx0eUJyZWFrRmlyc3RMZXNzTGVzczsKKworICAvLy8gXGJyaWVmIFRoZSBwZW5hbHR5IGZvciBlYWNoIGxpbmUgYnJlYWsgaW50cm9kdWNlZCBpbnNpZGUgYSBzdHJpbmcgbGl0ZXJhbC4KKyAgdW5zaWduZWQgUGVuYWx0eUJyZWFrU3RyaW5nOworCisgIC8vLyBcYnJpZWYgVGhlIHBlbmFsdHkgZm9yIGVhY2ggY2hhcmFjdGVyIG91dHNpZGUgb2YgdGhlIGNvbHVtbiBsaW1pdC4KKyAgdW5zaWduZWQgUGVuYWx0eUV4Y2Vzc0NoYXJhY3RlcjsKKworICAvLy8gXGJyaWVmIFBlbmFsdHkgZm9yIHB1dHRpbmcgdGhlIHJldHVybiB0eXBlIG9mIGEgZnVuY3Rpb24gb250byBpdHMgb3duCisgIC8vLyBsaW5lLgorICB1bnNpZ25lZCBQZW5hbHR5UmV0dXJuVHlwZU9uSXRzT3duTGluZTsKKworICAvLy8gXGJyaWVmIFRoZSBgYCZgYCBhbmQgYGAqYGAgYWxpZ25tZW50IHN0eWxlLgorICBlbnVtIFBvaW50ZXJBbGlnbm1lbnRTdHlsZSB7CisgICAgLy8vIEFsaWduIHBvaW50ZXIgdG8gdGhlIGxlZnQuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgaW50KiBhOworICAgIC8vLyBcZW5kY29kZQorICAgIFBBU19MZWZ0LAorICAgIC8vLyBBbGlnbiBwb2ludGVyIHRvIHRoZSByaWdodC4KKyAgICAvLy8gXGNvZGUKKyAgICAvLy8gICBpbnQgKmE7CisgICAgLy8vIFxlbmRjb2RlCisgICAgUEFTX1JpZ2h0LAorICAgIC8vLyBBbGlnbiBwb2ludGVyIGluIHRoZSBtaWRkbGUuCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgaW50ICogYTsKKyAgICAvLy8gXGVuZGNvZGUKKyAgICBQQVNfTWlkZGxlCisgIH07CisKKyAgLy8vIFxicmllZiBQb2ludGVyIGFuZCByZWZlcmVuY2UgYWxpZ25tZW50IHN0eWxlLgorICBQb2ludGVyQWxpZ25tZW50U3R5bGUgUG9pbnRlckFsaWdubWVudDsKKworICAvLy8gU2VlIGRvY3VtZW50YXRpb24gb2YgYGBSYXdTdHJpbmdGb3JtYXRzYGAuCisgIHN0cnVjdCBSYXdTdHJpbmdGb3JtYXQgeworICAgIC8vLyBcYnJpZWYgVGhlIGxhbmd1YWdlIG9mIHRoaXMgcmF3IHN0cmluZy4KKyAgICBMYW5ndWFnZUtpbmQgTGFuZ3VhZ2U7CisgICAgLy8vIFxicmllZiBBIGxpc3Qgb2YgcmF3IHN0cmluZyBkZWxpbWl0ZXJzIHRoYXQgbWF0Y2ggdGhpcyBsYW5ndWFnZS4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRGVsaW1pdGVyczsKKyAgICAvLy8gXGJyaWVmIEEgbGlzdCBvZiBlbmNsb3NpbmcgZnVuY3Rpb24gbmFtZXMgdGhhdCBtYXRjaCB0aGlzIGxhbmd1YWdlLgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBFbmNsb3NpbmdGdW5jdGlvbnM7CisgICAgLy8vIFxicmllZiBUaGUgY2Fub25pY2FsIGRlbGltaXRlciBmb3IgdGhpcyBsYW5ndWFnZS4KKyAgICBzdGQ6OnN0cmluZyBDYW5vbmljYWxEZWxpbWl0ZXI7CisgICAgLy8vIFxicmllZiBUaGUgc3R5bGUgbmFtZSBvbiB3aGljaCB0aGlzIHJhdyBzdHJpbmcgZm9ybWF0IGlzIGJhc2VkIG9uLgorICAgIC8vLyBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgcmF3IHN0cmluZyBmb3JtYXQgaXMgYmFzZWQgb24gdGhlIHN0eWxlIHRoYXQgdGhpcworICAgIC8vLyBmb3JtYXQgaXMgYmFzZWQgb24uCisgICAgc3RkOjpzdHJpbmcgQmFzZWRPblN0eWxlOworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSYXdTdHJpbmdGb3JtYXQgJk90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gTGFuZ3VhZ2UgPT0gT3RoZXIuTGFuZ3VhZ2UgJiYgRGVsaW1pdGVycyA9PSBPdGhlci5EZWxpbWl0ZXJzICYmCisgICAgICAgICAgICAgRW5jbG9zaW5nRnVuY3Rpb25zID09IE90aGVyLkVuY2xvc2luZ0Z1bmN0aW9ucyAmJgorICAgICAgICAgICAgIENhbm9uaWNhbERlbGltaXRlciA9PSBPdGhlci5DYW5vbmljYWxEZWxpbWl0ZXIgJiYKKyAgICAgICAgICAgICBCYXNlZE9uU3R5bGUgPT0gT3RoZXIuQmFzZWRPblN0eWxlOworICAgIH0KKyAgfTsKKworICAvLy8gXGJyaWVmIERlZmluZXMgaGludHMgZm9yIGRldGVjdGluZyBzdXBwb3J0ZWQgbGFuZ3VhZ2VzIGNvZGUgYmxvY2tzIGluIHJhdworICAvLy8gc3RyaW5ncy4KKyAgLy8vCisgIC8vLyBBIHJhdyBzdHJpbmcgd2l0aCBhIG1hdGNoaW5nIGRlbGltaXRlciBvciBhIG1hdGNoaW5nIGVuY2xvc2luZyBmdW5jdGlvbgorICAvLy8gbmFtZSB3aWxsIGJlIHJlZm9ybWF0dGVkIGFzc3VtaW5nIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UgYmFzZWQgb24gdGhlCisgIC8vLyBzdHlsZSBmb3IgdGhhdCBsYW5ndWFnZSBkZWZpbmVkIGluIHRoZSAuY2xhbmctZm9ybWF0IGZpbGUuIElmIG5vIHN0eWxlIGhhcworICAvLy8gYmVlbiBkZWZpbmVkIGluIHRoZSAuY2xhbmctZm9ybWF0IGZpbGUgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSwgYQorICAvLy8gcHJlZGVmaW5lZCBzdHlsZSBnaXZlbiBieSAnQmFzZWRPblN0eWxlJyBpcyB1c2VkLiBJZiAnQmFzZWRPblN0eWxlJyBpcyBub3QKKyAgLy8vIGZvdW5kLCB0aGUgZm9ybWF0dGluZyBpcyBiYXNlZCBvbiBsbHZtIHN0eWxlLiBBIG1hdGNoaW5nIGRlbGltaXRlciB0YWtlcworICAvLy8gcHJlY2VkZW5jZSBvdmVyIGEgbWF0Y2hpbmcgZW5jbG9zaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIGRldGVybWluaW5nIHRoZQorICAvLy8gbGFuZ3VhZ2Ugb2YgdGhlIHJhdyBzdHJpbmcgY29udGVudHMuCisgIC8vLworICAvLy8gSWYgYSBjYW5vbmljYWwgZGVsaW1pdGVyIGlzIHNwZWNpZmllZCwgb2NjdXJyZW5jZXMgb2Ygb3RoZXIgZGVsaW1pdGVycyBmb3IKKyAgLy8vIHRoZSBzYW1lIGxhbmd1YWdlIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgY2Fub25pY2FsIGlmIHBvc3NpYmxlLgorICAvLy8KKyAgLy8vIFRoZXJlIHNob3VsZCBiZSBhdCBtb3N0IG9uZSBzcGVjaWZpY2F0aW9uIHBlciBsYW5ndWFnZSBhbmQgZWFjaCBkZWxpbWl0ZXIKKyAgLy8vIGFuZCBlbmNsb3NpbmcgZnVuY3Rpb24gc2hvdWxkIG5vdCBvY2N1ciBpbiBtdWx0aXBsZSBzcGVjaWZpY2F0aW9ucy4KKyAgLy8vCisgIC8vLyBUbyBjb25maWd1cmUgdGhpcyBpbiB0aGUgLmNsYW5nLWZvcm1hdCBmaWxlLCB1c2U6CisgIC8vLyBcY29kZXsueWFtbH0KKyAgLy8vICAgUmF3U3RyaW5nRm9ybWF0czoKKyAgLy8vICAgICAtIExhbmd1YWdlOiBUZXh0UHJvdG8KKyAgLy8vICAgICAgICAgRGVsaW1pdGVyczoKKyAgLy8vICAgICAgICAgICAtICdwYicKKyAgLy8vICAgICAgICAgICAtICdwcm90bycKKyAgLy8vICAgICAgICAgRW5jbG9zaW5nRnVuY3Rpb25zOgorICAvLy8gICAgICAgICAgIC0gJ1BBUlNFX1RFWFRfUFJPVE8nCisgIC8vLyAgICAgICAgIEJhc2VkT25TdHlsZTogZ29vZ2xlCisgIC8vLyAgICAgLSBMYW5ndWFnZTogQ3BwCisgIC8vLyAgICAgICAgIERlbGltaXRlcnM6CisgIC8vLyAgICAgICAgICAgLSAnY2MnCisgIC8vLyAgICAgICAgICAgLSAnY3BwJworICAvLy8gICAgICAgICBCYXNlZE9uU3R5bGU6IGxsdm0KKyAgLy8vICAgICAgICAgQ2Fub25pY2FsRGVsaW1pdGVyOiAnY2MnCisgIC8vLyBcZW5kY29kZQorICBzdGQ6OnZlY3RvcjxSYXdTdHJpbmdGb3JtYXQ+IFJhd1N0cmluZ0Zvcm1hdHM7CisKKyAgLy8vIFxicmllZiBJZiBgYHRydWVgYCwgY2xhbmctZm9ybWF0IHdpbGwgYXR0ZW1wdCB0byByZS1mbG93IGNvbW1lbnRzLgorICAvLy8gXGNvZGUKKyAgLy8vICAgIGZhbHNlOgorICAvLy8gICAgLy8gdmVyeVZlcnlWZXJ5VmVyeVZlcnlWZXJ5VmVyeVZlcnlWZXJ5VmVyeVZlcnlMb25nQ29tbWVudCB3aXRoIHBsZW50eSBvZiBpbmZvcm1hdGlvbgorICAvLy8gICAgLyogc2Vjb25kIHZlcnlWZXJ5VmVyeVZlcnlWZXJ5VmVyeVZlcnlWZXJ5VmVyeVZlcnlWZXJ5TG9uZ0NvbW1lbnQgd2l0aCBwbGVudHkgb2YgaW5mb3JtYXRpb24gKi8KKyAgLy8vCisgIC8vLyAgICB0cnVlOgorICAvLy8gICAgLy8gdmVyeVZlcnlWZXJ5VmVyeVZlcnlWZXJ5VmVyeVZlcnlWZXJ5VmVyeVZlcnlMb25nQ29tbWVudCB3aXRoIHBsZW50eSBvZgorICAvLy8gICAgLy8gaW5mb3JtYXRpb24KKyAgLy8vICAgIC8qIHNlY29uZCB2ZXJ5VmVyeVZlcnlWZXJ5VmVyeVZlcnlWZXJ5VmVyeVZlcnlWZXJ5VmVyeUxvbmdDb21tZW50IHdpdGggcGxlbnR5IG9mCisgIC8vLyAgICAgKiBpbmZvcm1hdGlvbiAqLworICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBSZWZsb3dDb21tZW50czsKKworICAvLy8gXGJyaWVmIElmIGBgdHJ1ZWBgLCBjbGFuZy1mb3JtYXQgd2lsbCBzb3J0IGBgI2luY2x1ZGVzYGAuCisgIC8vLyBcY29kZQorICAvLy8gICAgZmFsc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZToKKyAgLy8vICAgICNpbmNsdWRlICJiLmgiICAgICAgICAgICAgICAgICB2cy4gICAgICNpbmNsdWRlICJhLmgiCisgIC8vLyAgICAjaW5jbHVkZSAiYS5oIiAgICAgICAgICAgICAgICAgICAgICAgICAjaW5jbHVkZSAiYi5oIgorICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBTb3J0SW5jbHVkZXM7CisKKyAgLy8vIFxicmllZiBJZiBgYHRydWVgYCwgY2xhbmctZm9ybWF0IHdpbGwgc29ydCB1c2luZyBkZWNsYXJhdGlvbnMuCisgIC8vLworICAvLy8gVGhlIG9yZGVyIG9mIHVzaW5nIGRlY2xhcmF0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisgIC8vLyBTcGxpdCB0aGUgc3RyaW5ncyBieSAiOjoiIGFuZCBkaXNjYXJkIGFueSBpbml0aWFsIGVtcHR5IHN0cmluZ3MuIFRoZSBsYXN0CisgIC8vLyBlbGVtZW50IG9mIGVhY2ggbGlzdCBpcyBhIG5vbi1uYW1lc3BhY2UgbmFtZTsgYWxsIG90aGVycyBhcmUgbmFtZXNwYWNlCisgIC8vLyBuYW1lcy4gU29ydCB0aGUgbGlzdHMgb2YgbmFtZXMgbGV4aWNvZ3JhcGhpY2FsbHksIHdoZXJlIHRoZSBzb3J0IG9yZGVyIG9mCisgIC8vLyBpbmRpdmlkdWFsIG5hbWVzIGlzIHRoYXQgYWxsIG5vbi1uYW1lc3BhY2UgbmFtZXMgY29tZSBiZWZvcmUgYWxsIG5hbWVzcGFjZQorICAvLy8gbmFtZXMsIGFuZCB3aXRoaW4gdGhvc2UgZ3JvdXBzLCBuYW1lcyBhcmUgaW4gY2FzZS1pbnNlbnNpdGl2ZQorICAvLy8gbGV4aWNvZ3JhcGhpYyBvcmRlci4KKyAgLy8vIFxjb2RlCisgIC8vLyAgICBmYWxzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlOgorICAvLy8gICAgdXNpbmcgc3RkOjpjb3V0OyAgICAgICAgICAgICAgIHZzLiAgICAgdXNpbmcgc3RkOjpjaW47CisgIC8vLyAgICB1c2luZyBzdGQ6OmNpbjsgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBzdGQ6OmNvdXQ7CisgIC8vLyBcZW5kY29kZQorICBib29sIFNvcnRVc2luZ0RlY2xhcmF0aW9uczsKKworICAvLy8gXGJyaWVmIElmIGBgdHJ1ZWBgLCBhIHNwYWNlIGlzIGluc2VydGVkIGFmdGVyIEMgc3R5bGUgY2FzdHMuCisgIC8vLyBcY29kZQorICAvLy8gICAgdHJ1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2U6CisgIC8vLyAgICAoaW50KSBpOyAgICAgICAgICAgICAgICAgICAgICAgdnMuICAgICAoaW50KWk7CisgIC8vLyBcZW5kY29kZQorICBib29sIFNwYWNlQWZ0ZXJDU3R5bGVDYXN0OworCisgIC8vLyBcYnJpZWYgSWYgXGMgdHJ1ZSwgYSBzcGFjZSB3aWxsIGJlIGluc2VydGVkIGFmdGVyIHRoZSAndGVtcGxhdGUnIGtleXdvcmQuCisgIC8vLyBcY29kZQorICAvLy8gICAgdHJ1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2U6CisgIC8vLyAgICB0ZW1wbGF0ZSA8aW50PiB2b2lkIGZvbygpOyAgICAgdnMuICAgICB0ZW1wbGF0ZTxpbnQ+IHZvaWQgZm9vKCk7CisgIC8vLyBcZW5kY29kZQorICBib29sIFNwYWNlQWZ0ZXJUZW1wbGF0ZUtleXdvcmQ7CisKKyAgLy8vIFxicmllZiBJZiBgYGZhbHNlYGAsIHNwYWNlcyB3aWxsIGJlIHJlbW92ZWQgYmVmb3JlIGFzc2lnbm1lbnQgb3BlcmF0b3JzLgorICAvLy8gXGNvZGUKKyAgLy8vICAgIHRydWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlOgorICAvLy8gICAgaW50IGEgPSA1OyAgICAgICAgICAgICAgICAgICAgIHZzLiAgICAgaW50IGE9NTsKKyAgLy8vICAgIGEgKz0gNDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGErPTQyOworICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBTcGFjZUJlZm9yZUFzc2lnbm1lbnRPcGVyYXRvcnM7CisKKyAgLy8vIFxicmllZiBJZiBgYGZhbHNlYGAsIHNwYWNlcyB3aWxsIGJlIHJlbW92ZWQgYmVmb3JlIGNvbnN0cnVjdG9yIGluaXRpYWxpemVyCisgIC8vLyBjb2xvbi4KKyAgLy8vIFxjb2RlCisgIC8vLyAgICB0cnVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZToKKyAgLy8vICAgIEZvbzo6Rm9vKCkgOiBhKGEpIHt9ICAgICAgICAgICAgICAgICAgIEZvbzo6Rm9vKCk6IGEoYSkge30KKyAgLy8vIFxlbmRjb2RlCisgIGJvb2wgU3BhY2VCZWZvcmVDdG9ySW5pdGlhbGl6ZXJDb2xvbjsKKworICAvLy8gXGJyaWVmIElmIGBgZmFsc2VgYCwgc3BhY2VzIHdpbGwgYmUgcmVtb3ZlZCBiZWZvcmUgaW5oZXJpdGFuY2UgY29sb24uCisgIC8vLyBcY29kZQorICAvLy8gICAgdHJ1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2U6CisgIC8vLyAgICBjbGFzcyBGb28gOiBCYXIge30gICAgICAgICAgICAgdnMuICAgICBjbGFzcyBGb286IEJhciB7fQorICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBTcGFjZUJlZm9yZUluaGVyaXRhbmNlQ29sb247CisKKyAgLy8vIFxicmllZiBEaWZmZXJlbnQgd2F5cyB0byBwdXQgYSBzcGFjZSBiZWZvcmUgb3BlbmluZyBwYXJlbnRoZXNlcy4KKyAgZW51bSBTcGFjZUJlZm9yZVBhcmVuc09wdGlvbnMgeworICAgIC8vLyBOZXZlciBwdXQgYSBzcGFjZSBiZWZvcmUgb3BlbmluZyBwYXJlbnRoZXNlcy4KKyAgICAvLy8gXGNvZGUKKyAgICAvLy8gICAgdm9pZCBmKCkgeworICAgIC8vLyAgICAgIGlmKHRydWUpIHsKKyAgICAvLy8gICAgICAgIGYoKTsKKyAgICAvLy8gICAgICB9CisgICAgLy8vICAgIH0KKyAgICAvLy8gXGVuZGNvZGUKKyAgICBTQlBPX05ldmVyLAorICAgIC8vLyBQdXQgYSBzcGFjZSBiZWZvcmUgb3BlbmluZyBwYXJlbnRoZXNlcyBvbmx5IGFmdGVyIGNvbnRyb2wgc3RhdGVtZW50CisgICAgLy8vIGtleXdvcmRzIChgYGZvci9pZi93aGlsZS4uLmBgKS4KKyAgICAvLy8gXGNvZGUKKyAgICAvLy8gICAgdm9pZCBmKCkgeworICAgIC8vLyAgICAgIGlmICh0cnVlKSB7CisgICAgLy8vICAgICAgICBmKCk7CisgICAgLy8vICAgICAgfQorICAgIC8vLyAgICB9CisgICAgLy8vIFxlbmRjb2RlCisgICAgU0JQT19Db250cm9sU3RhdGVtZW50cywKKyAgICAvLy8gQWx3YXlzIHB1dCBhIHNwYWNlIGJlZm9yZSBvcGVuaW5nIHBhcmVudGhlc2VzLCBleGNlcHQgd2hlbiBpdCdzCisgICAgLy8vIHByb2hpYml0ZWQgYnkgdGhlIHN5bnRheCBydWxlcyAoaW4gZnVuY3Rpb24tbGlrZSBtYWNybyBkZWZpbml0aW9ucykgb3IKKyAgICAvLy8gd2hlbiBkZXRlcm1pbmVkIGJ5IG90aGVyIHN0eWxlIHJ1bGVzIChhZnRlciB1bmFyeSBvcGVyYXRvcnMsIG9wZW5pbmcKKyAgICAvLy8gcGFyZW50aGVzZXMsIGV0Yy4pCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgIHZvaWQgZiAoKSB7CisgICAgLy8vICAgICAgaWYgKHRydWUpIHsKKyAgICAvLy8gICAgICAgIGYgKCk7CisgICAgLy8vICAgICAgfQorICAgIC8vLyAgICB9CisgICAgLy8vIFxlbmRjb2RlCisgICAgU0JQT19BbHdheXMKKyAgfTsKKworICAvLy8gXGJyaWVmIERlZmluZXMgaW4gd2hpY2ggY2FzZXMgdG8gcHV0IGEgc3BhY2UgYmVmb3JlIG9wZW5pbmcgcGFyZW50aGVzZXMuCisgIFNwYWNlQmVmb3JlUGFyZW5zT3B0aW9ucyBTcGFjZUJlZm9yZVBhcmVuczsKKworICAvLy8gXGJyaWVmIElmIGBgZmFsc2VgYCwgc3BhY2VzIHdpbGwgYmUgcmVtb3ZlZCBiZWZvcmUgcmFuZ2UtYmFzZWQgZm9yIGxvb3AKKyAgLy8vIGNvbG9uLgorICAvLy8gXGNvZGUKKyAgLy8vICAgIHRydWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlOgorICAvLy8gICAgZm9yIChhdXRvIHYgOiB2YWx1ZXMpIHt9ICAgICAgIHZzLiAgICAgZm9yKGF1dG8gdjogdmFsdWVzKSB7fQorICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBTcGFjZUJlZm9yZVJhbmdlQmFzZWRGb3JMb29wQ29sb247CisKKyAgLy8vIFxicmllZiBJZiBgYHRydWVgYCwgc3BhY2VzIG1heSBiZSBpbnNlcnRlZCBpbnRvIGBgKClgYC4KKyAgLy8vIFxjb2RlCisgIC8vLyAgICB0cnVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2U6CisgIC8vLyAgICB2b2lkIGYoICkgeyAgICAgICAgICAgICAgICAgICAgdnMuICAgdm9pZCBmKCkgeworICAvLy8gICAgICBpbnQgeFtdID0ge2ZvbyggKSwgYmFyKCApfTsgICAgICAgICAgaW50IHhbXSA9IHtmb28oKSwgYmFyKCl9OworICAvLy8gICAgICBpZiAodHJ1ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRydWUpIHsKKyAgLy8vICAgICAgICBmKCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZigpOworICAvLy8gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAvLy8gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgLy8vIFxlbmRjb2RlCisgIGJvb2wgU3BhY2VJbkVtcHR5UGFyZW50aGVzZXM7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHNwYWNlcyBiZWZvcmUgdHJhaWxpbmcgbGluZSBjb21tZW50cworICAvLy8gKGBgLy9gYCAtIGNvbW1lbnRzKS4KKyAgLy8vCisgIC8vLyBUaGlzIGRvZXMgbm90IGFmZmVjdCB0cmFpbGluZyBibG9jayBjb21tZW50cyAoYGAvKmBgIC0gY29tbWVudHMpIGFzCisgIC8vLyB0aG9zZSBjb21tb25seSBoYXZlIGRpZmZlcmVudCB1c2FnZSBwYXR0ZXJucyBhbmQgYSBudW1iZXIgb2Ygc3BlY2lhbAorICAvLy8gY2FzZXMuCisgIC8vLyBcY29kZQorICAvLy8gICAgU3BhY2VzQmVmb3JlVHJhaWxpbmdDb21tZW50czogMworICAvLy8gICAgdm9pZCBmKCkgeworICAvLy8gICAgICBpZiAodHJ1ZSkgeyAgIC8vIGZvbzEKKyAgLy8vICAgICAgICBmKCk7ICAgICAgICAvLyBiYXIKKyAgLy8vICAgICAgfSAgICAgICAgICAgICAvLyBmb28KKyAgLy8vICAgIH0KKyAgLy8vIFxlbmRjb2RlCisgIHVuc2lnbmVkIFNwYWNlc0JlZm9yZVRyYWlsaW5nQ29tbWVudHM7CisKKyAgLy8vIFxicmllZiBJZiBgYHRydWVgYCwgc3BhY2VzIHdpbGwgYmUgaW5zZXJ0ZWQgYWZ0ZXIgYGA8YGAgYW5kIGJlZm9yZSBgYD5gYAorICAvLy8gaW4gdGVtcGxhdGUgYXJndW1lbnQgbGlzdHMuCisgIC8vLyBcY29kZQorICAvLy8gICAgdHJ1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2U6CisgIC8vLyAgICBzdGF0aWNfY2FzdDwgaW50ID4oYXJnKTsgICAgICAgdnMuICAgICBzdGF0aWNfY2FzdDxpbnQ+KGFyZyk7CisgIC8vLyAgICBzdGQ6OmZ1bmN0aW9uPCB2b2lkKGludCkgPiBmY3Q7ICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50KT4gZmN0OworICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBTcGFjZXNJbkFuZ2xlczsKKworICAvLy8gXGJyaWVmIElmIGBgdHJ1ZWBgLCBzcGFjZXMgYXJlIGluc2VydGVkIGluc2lkZSBjb250YWluZXIgbGl0ZXJhbHMgKGUuZy4KKyAgLy8vIE9iakMgYW5kIEphdmFzY3JpcHQgYXJyYXkgYW5kIGRpY3QgbGl0ZXJhbHMpLgorICAvLy8gXGNvZGV7LmpzfQorICAvLy8gICAgdHJ1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2U6CisgIC8vLyAgICB2YXIgYXJyID0gWyAxLCAyLCAzIF07ICAgICAgICAgdnMuICAgICB2YXIgYXJyID0gWzEsIDIsIDNdOworICAvLy8gICAgZih7YSA6IDEsIGIgOiAyLCBjIDogM30pOyAgICAgICAgICAgICAgZih7YTogMSwgYjogMiwgYzogM30pOworICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBTcGFjZXNJbkNvbnRhaW5lckxpdGVyYWxzOworCisgIC8vLyBcYnJpZWYgSWYgYGB0cnVlYGAsIHNwYWNlcyBtYXkgYmUgaW5zZXJ0ZWQgaW50byBDIHN0eWxlIGNhc3RzLgorICAvLy8gXGNvZGUKKyAgLy8vICAgIHRydWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlOgorICAvLy8gICAgeCA9ICggaW50MzIgKXkgICAgICAgICAgICAgICAgIHZzLiAgICAgeCA9IChpbnQzMil5CisgIC8vLyBcZW5kY29kZQorICBib29sIFNwYWNlc0luQ1N0eWxlQ2FzdFBhcmVudGhlc2VzOworCisgIC8vLyBcYnJpZWYgSWYgYGB0cnVlYGAsIHNwYWNlcyB3aWxsIGJlIGluc2VydGVkIGFmdGVyIGBgKGBgIGFuZCBiZWZvcmUgYGApYGAuCisgIC8vLyBcY29kZQorICAvLy8gICAgdHJ1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2U6CisgIC8vLyAgICB0IGYoIERlbGV0ZWQgJiApICYgPSBkZWxldGU7ICAgdnMuICAgICB0IGYoRGVsZXRlZCAmKSAmID0gZGVsZXRlOworICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBTcGFjZXNJblBhcmVudGhlc2VzOworCisgIC8vLyBcYnJpZWYgSWYgYGB0cnVlYGAsIHNwYWNlcyB3aWxsIGJlIGluc2VydGVkIGFmdGVyIGBgW2BgIGFuZCBiZWZvcmUgYGBdYGAuCisgIC8vLyBMYW1iZGFzIG9yIHVuc3BlY2lmaWVkIHNpemUgYXJyYXkgZGVjbGFyYXRpb25zIHdpbGwgbm90IGJlIGFmZmVjdGVkLgorICAvLy8gXGNvZGUKKyAgLy8vICAgIHRydWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlOgorICAvLy8gICAgaW50IGFbIDUgXTsgICAgICAgICAgICAgICAgICAgIHZzLiAgICAgaW50IGFbNV07CisgIC8vLyAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50W10+IGZvbygpIHt9IC8vIFdvbid0IGJlIGFmZmVjdGVkCisgIC8vLyBcZW5kY29kZQorICBib29sIFNwYWNlc0luU3F1YXJlQnJhY2tldHM7CisKKyAgLy8vIFxicmllZiBTdXBwb3J0ZWQgbGFuZ3VhZ2Ugc3RhbmRhcmRzLgorICBlbnVtIExhbmd1YWdlU3RhbmRhcmQgeworICAgIC8vLyBVc2UgQysrMDMtY29tcGF0aWJsZSBzeW50YXguCisgICAgTFNfQ3BwMDMsCisgICAgLy8vIFVzZSBmZWF0dXJlcyBvZiBDKysxMSwgQysrMTQgYW5kIEMrKzF6IChlLmcuIGBgQTxBPGludD4+YGAgaW5zdGVhZCBvZgorICAgIC8vLyBgYEE8QTxpbnQ+ID5gYCkuCisgICAgTFNfQ3BwMTEsCisgICAgLy8vIEF1dG9tYXRpYyBkZXRlY3Rpb24gYmFzZWQgb24gdGhlIGlucHV0LgorICAgIExTX0F1dG8KKyAgfTsKKworICAvLy8gXGJyaWVmIEZvcm1hdCBjb21wYXRpYmxlIHdpdGggdGhpcyBzdGFuZGFyZCwgZS5nLiB1c2UgYGBBPEE8aW50PiA+YGAKKyAgLy8vIGluc3RlYWQgb2YgYGBBPEE8aW50Pj5gYCBmb3IgYGBMU19DcHAwM2BgLgorICBMYW5ndWFnZVN0YW5kYXJkIFN0YW5kYXJkOworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBjb2x1bW5zIHVzZWQgZm9yIHRhYiBzdG9wcy4KKyAgdW5zaWduZWQgVGFiV2lkdGg7CisKKyAgLy8vIFxicmllZiBEaWZmZXJlbnQgd2F5cyB0byB1c2UgdGFiIGluIGZvcm1hdHRpbmcuCisgIGVudW0gVXNlVGFiU3R5bGUgeworICAgIC8vLyBOZXZlciB1c2UgdGFiLgorICAgIFVUX05ldmVyLAorICAgIC8vLyBVc2UgdGFicyBvbmx5IGZvciBpbmRlbnRhdGlvbi4KKyAgICBVVF9Gb3JJbmRlbnRhdGlvbiwKKyAgICAvLy8gVXNlIHRhYnMgb25seSBmb3IgbGluZSBjb250aW51YXRpb24gYW5kIGluZGVudGF0aW9uLgorICAgIFVUX0ZvckNvbnRpbnVhdGlvbkFuZEluZGVudGF0aW9uLAorICAgIC8vLyBVc2UgdGFicyB3aGVuZXZlciB3ZSBuZWVkIHRvIGZpbGwgd2hpdGVzcGFjZSB0aGF0IHNwYW5zIGF0IGxlYXN0IGZyb20KKyAgICAvLy8gb25lIHRhYiBzdG9wIHRvIHRoZSBuZXh0IG9uZS4KKyAgICBVVF9BbHdheXMKKyAgfTsKKworICAvLy8gXGJyaWVmIFRoZSB3YXkgdG8gdXNlIHRhYiBjaGFyYWN0ZXJzIGluIHRoZSByZXN1bHRpbmcgZmlsZS4KKyAgVXNlVGFiU3R5bGUgVXNlVGFiOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGb3JtYXRTdHlsZSAmUikgY29uc3QgeworICAgIHJldHVybiBBY2Nlc3NNb2RpZmllck9mZnNldCA9PSBSLkFjY2Vzc01vZGlmaWVyT2Zmc2V0ICYmCisgICAgICAgICAgIEFsaWduQWZ0ZXJPcGVuQnJhY2tldCA9PSBSLkFsaWduQWZ0ZXJPcGVuQnJhY2tldCAmJgorICAgICAgICAgICBBbGlnbkNvbnNlY3V0aXZlQXNzaWdubWVudHMgPT0gUi5BbGlnbkNvbnNlY3V0aXZlQXNzaWdubWVudHMgJiYKKyAgICAgICAgICAgQWxpZ25Db25zZWN1dGl2ZURlY2xhcmF0aW9ucyA9PSBSLkFsaWduQ29uc2VjdXRpdmVEZWNsYXJhdGlvbnMgJiYKKyAgICAgICAgICAgQWxpZ25Fc2NhcGVkTmV3bGluZXMgPT0gUi5BbGlnbkVzY2FwZWROZXdsaW5lcyAmJgorICAgICAgICAgICBBbGlnbk9wZXJhbmRzID09IFIuQWxpZ25PcGVyYW5kcyAmJgorICAgICAgICAgICBBbGlnblRyYWlsaW5nQ29tbWVudHMgPT0gUi5BbGlnblRyYWlsaW5nQ29tbWVudHMgJiYKKyAgICAgICAgICAgQWxsb3dBbGxQYXJhbWV0ZXJzT2ZEZWNsYXJhdGlvbk9uTmV4dExpbmUgPT0KKyAgICAgICAgICAgICAgIFIuQWxsb3dBbGxQYXJhbWV0ZXJzT2ZEZWNsYXJhdGlvbk9uTmV4dExpbmUgJiYKKyAgICAgICAgICAgQWxsb3dTaG9ydEJsb2Nrc09uQVNpbmdsZUxpbmUgPT0gUi5BbGxvd1Nob3J0QmxvY2tzT25BU2luZ2xlTGluZSAmJgorICAgICAgICAgICBBbGxvd1Nob3J0Q2FzZUxhYmVsc09uQVNpbmdsZUxpbmUgPT0KKyAgICAgICAgICAgICAgIFIuQWxsb3dTaG9ydENhc2VMYWJlbHNPbkFTaW5nbGVMaW5lICYmCisgICAgICAgICAgIEFsbG93U2hvcnRGdW5jdGlvbnNPbkFTaW5nbGVMaW5lID09CisgICAgICAgICAgICAgICBSLkFsbG93U2hvcnRGdW5jdGlvbnNPbkFTaW5nbGVMaW5lICYmCisgICAgICAgICAgIEFsbG93U2hvcnRJZlN0YXRlbWVudHNPbkFTaW5nbGVMaW5lID09CisgICAgICAgICAgICAgICBSLkFsbG93U2hvcnRJZlN0YXRlbWVudHNPbkFTaW5nbGVMaW5lICYmCisgICAgICAgICAgIEFsbG93U2hvcnRMb29wc09uQVNpbmdsZUxpbmUgPT0gUi5BbGxvd1Nob3J0TG9vcHNPbkFTaW5nbGVMaW5lICYmCisgICAgICAgICAgIEFsd2F5c0JyZWFrQWZ0ZXJSZXR1cm5UeXBlID09IFIuQWx3YXlzQnJlYWtBZnRlclJldHVyblR5cGUgJiYKKyAgICAgICAgICAgQWx3YXlzQnJlYWtCZWZvcmVNdWx0aWxpbmVTdHJpbmdzID09CisgICAgICAgICAgICAgICBSLkFsd2F5c0JyZWFrQmVmb3JlTXVsdGlsaW5lU3RyaW5ncyAmJgorICAgICAgICAgICBBbHdheXNCcmVha1RlbXBsYXRlRGVjbGFyYXRpb25zID09CisgICAgICAgICAgICAgICBSLkFsd2F5c0JyZWFrVGVtcGxhdGVEZWNsYXJhdGlvbnMgJiYKKyAgICAgICAgICAgQmluUGFja0FyZ3VtZW50cyA9PSBSLkJpblBhY2tBcmd1bWVudHMgJiYKKyAgICAgICAgICAgQmluUGFja1BhcmFtZXRlcnMgPT0gUi5CaW5QYWNrUGFyYW1ldGVycyAmJgorICAgICAgICAgICBCcmVha0JlZm9yZUJpbmFyeU9wZXJhdG9ycyA9PSBSLkJyZWFrQmVmb3JlQmluYXJ5T3BlcmF0b3JzICYmCisgICAgICAgICAgIEJyZWFrQmVmb3JlQnJhY2VzID09IFIuQnJlYWtCZWZvcmVCcmFjZXMgJiYKKyAgICAgICAgICAgQnJlYWtCZWZvcmVUZXJuYXJ5T3BlcmF0b3JzID09IFIuQnJlYWtCZWZvcmVUZXJuYXJ5T3BlcmF0b3JzICYmCisgICAgICAgICAgIEJyZWFrQ29uc3RydWN0b3JJbml0aWFsaXplcnMgPT0gUi5CcmVha0NvbnN0cnVjdG9ySW5pdGlhbGl6ZXJzICYmCisgICAgICAgICAgIENvbXBhY3ROYW1lc3BhY2VzID09IFIuQ29tcGFjdE5hbWVzcGFjZXMgJiYKKyAgICAgICAgICAgQnJlYWtBZnRlckphdmFGaWVsZEFubm90YXRpb25zID09IFIuQnJlYWtBZnRlckphdmFGaWVsZEFubm90YXRpb25zICYmCisgICAgICAgICAgIEJyZWFrU3RyaW5nTGl0ZXJhbHMgPT0gUi5CcmVha1N0cmluZ0xpdGVyYWxzICYmCisgICAgICAgICAgIENvbHVtbkxpbWl0ID09IFIuQ29sdW1uTGltaXQgJiYgQ29tbWVudFByYWdtYXMgPT0gUi5Db21tZW50UHJhZ21hcyAmJgorICAgICAgICAgICBCcmVha0JlZm9yZUluaGVyaXRhbmNlQ29tbWEgPT0gUi5CcmVha0JlZm9yZUluaGVyaXRhbmNlQ29tbWEgJiYKKyAgICAgICAgICAgQ29uc3RydWN0b3JJbml0aWFsaXplckFsbE9uT25lTGluZU9yT25lUGVyTGluZSA9PQorICAgICAgICAgICAgICAgUi5Db25zdHJ1Y3RvckluaXRpYWxpemVyQWxsT25PbmVMaW5lT3JPbmVQZXJMaW5lICYmCisgICAgICAgICAgIENvbnN0cnVjdG9ySW5pdGlhbGl6ZXJJbmRlbnRXaWR0aCA9PQorICAgICAgICAgICAgICAgUi5Db25zdHJ1Y3RvckluaXRpYWxpemVySW5kZW50V2lkdGggJiYKKyAgICAgICAgICAgQ29udGludWF0aW9uSW5kZW50V2lkdGggPT0gUi5Db250aW51YXRpb25JbmRlbnRXaWR0aCAmJgorICAgICAgICAgICBDcHAxMUJyYWNlZExpc3RTdHlsZSA9PSBSLkNwcDExQnJhY2VkTGlzdFN0eWxlICYmCisgICAgICAgICAgIERlcml2ZVBvaW50ZXJBbGlnbm1lbnQgPT0gUi5EZXJpdmVQb2ludGVyQWxpZ25tZW50ICYmCisgICAgICAgICAgIERpc2FibGVGb3JtYXQgPT0gUi5EaXNhYmxlRm9ybWF0ICYmCisgICAgICAgICAgIEV4cGVyaW1lbnRhbEF1dG9EZXRlY3RCaW5QYWNraW5nID09CisgICAgICAgICAgICAgICBSLkV4cGVyaW1lbnRhbEF1dG9EZXRlY3RCaW5QYWNraW5nICYmCisgICAgICAgICAgIEZpeE5hbWVzcGFjZUNvbW1lbnRzID09IFIuRml4TmFtZXNwYWNlQ29tbWVudHMgJiYKKyAgICAgICAgICAgRm9yRWFjaE1hY3JvcyA9PSBSLkZvckVhY2hNYWNyb3MgJiYKKyAgICAgICAgICAgSW5jbHVkZUJsb2NrcyA9PSBSLkluY2x1ZGVCbG9ja3MgJiYKKyAgICAgICAgICAgSW5jbHVkZUNhdGVnb3JpZXMgPT0gUi5JbmNsdWRlQ2F0ZWdvcmllcyAmJgorICAgICAgICAgICBJbmRlbnRDYXNlTGFiZWxzID09IFIuSW5kZW50Q2FzZUxhYmVscyAmJgorICAgICAgICAgICBJbmRlbnRQUERpcmVjdGl2ZXMgPT0gUi5JbmRlbnRQUERpcmVjdGl2ZXMgJiYKKyAgICAgICAgICAgSW5kZW50V2lkdGggPT0gUi5JbmRlbnRXaWR0aCAmJiBMYW5ndWFnZSA9PSBSLkxhbmd1YWdlICYmCisgICAgICAgICAgIEluZGVudFdyYXBwZWRGdW5jdGlvbk5hbWVzID09IFIuSW5kZW50V3JhcHBlZEZ1bmN0aW9uTmFtZXMgJiYKKyAgICAgICAgICAgSmF2YVNjcmlwdFF1b3RlcyA9PSBSLkphdmFTY3JpcHRRdW90ZXMgJiYKKyAgICAgICAgICAgSmF2YVNjcmlwdFdyYXBJbXBvcnRzID09IFIuSmF2YVNjcmlwdFdyYXBJbXBvcnRzICYmCisgICAgICAgICAgIEtlZXBFbXB0eUxpbmVzQXRUaGVTdGFydE9mQmxvY2tzID09CisgICAgICAgICAgICAgICBSLktlZXBFbXB0eUxpbmVzQXRUaGVTdGFydE9mQmxvY2tzICYmCisgICAgICAgICAgIE1hY3JvQmxvY2tCZWdpbiA9PSBSLk1hY3JvQmxvY2tCZWdpbiAmJgorICAgICAgICAgICBNYWNyb0Jsb2NrRW5kID09IFIuTWFjcm9CbG9ja0VuZCAmJgorICAgICAgICAgICBNYXhFbXB0eUxpbmVzVG9LZWVwID09IFIuTWF4RW1wdHlMaW5lc1RvS2VlcCAmJgorICAgICAgICAgICBOYW1lc3BhY2VJbmRlbnRhdGlvbiA9PSBSLk5hbWVzcGFjZUluZGVudGF0aW9uICYmCisgICAgICAgICAgIE9iakNCaW5QYWNrUHJvdG9jb2xMaXN0ID09IFIuT2JqQ0JpblBhY2tQcm90b2NvbExpc3QgJiYKKyAgICAgICAgICAgT2JqQ0Jsb2NrSW5kZW50V2lkdGggPT0gUi5PYmpDQmxvY2tJbmRlbnRXaWR0aCAmJgorICAgICAgICAgICBPYmpDU3BhY2VBZnRlclByb3BlcnR5ID09IFIuT2JqQ1NwYWNlQWZ0ZXJQcm9wZXJ0eSAmJgorICAgICAgICAgICBPYmpDU3BhY2VCZWZvcmVQcm90b2NvbExpc3QgPT0gUi5PYmpDU3BhY2VCZWZvcmVQcm90b2NvbExpc3QgJiYKKyAgICAgICAgICAgUGVuYWx0eUJyZWFrQXNzaWdubWVudCA9PQorICAgICAgICAgICAgICAgUi5QZW5hbHR5QnJlYWtBc3NpZ25tZW50ICYmCisgICAgICAgICAgIFBlbmFsdHlCcmVha0JlZm9yZUZpcnN0Q2FsbFBhcmFtZXRlciA9PQorICAgICAgICAgICAgICAgUi5QZW5hbHR5QnJlYWtCZWZvcmVGaXJzdENhbGxQYXJhbWV0ZXIgJiYKKyAgICAgICAgICAgUGVuYWx0eUJyZWFrQ29tbWVudCA9PSBSLlBlbmFsdHlCcmVha0NvbW1lbnQgJiYKKyAgICAgICAgICAgUGVuYWx0eUJyZWFrRmlyc3RMZXNzTGVzcyA9PSBSLlBlbmFsdHlCcmVha0ZpcnN0TGVzc0xlc3MgJiYKKyAgICAgICAgICAgUGVuYWx0eUJyZWFrU3RyaW5nID09IFIuUGVuYWx0eUJyZWFrU3RyaW5nICYmCisgICAgICAgICAgIFBlbmFsdHlFeGNlc3NDaGFyYWN0ZXIgPT0gUi5QZW5hbHR5RXhjZXNzQ2hhcmFjdGVyICYmCisgICAgICAgICAgIFBlbmFsdHlSZXR1cm5UeXBlT25JdHNPd25MaW5lID09IFIuUGVuYWx0eVJldHVyblR5cGVPbkl0c093bkxpbmUgJiYKKyAgICAgICAgICAgUG9pbnRlckFsaWdubWVudCA9PSBSLlBvaW50ZXJBbGlnbm1lbnQgJiYKKyAgICAgICAgICAgUmF3U3RyaW5nRm9ybWF0cyA9PSBSLlJhd1N0cmluZ0Zvcm1hdHMgJiYKKyAgICAgICAgICAgU3BhY2VBZnRlckNTdHlsZUNhc3QgPT0gUi5TcGFjZUFmdGVyQ1N0eWxlQ2FzdCAmJgorICAgICAgICAgICBTcGFjZUFmdGVyVGVtcGxhdGVLZXl3b3JkID09IFIuU3BhY2VBZnRlclRlbXBsYXRlS2V5d29yZCAmJgorICAgICAgICAgICBTcGFjZUJlZm9yZUFzc2lnbm1lbnRPcGVyYXRvcnMgPT0gUi5TcGFjZUJlZm9yZUFzc2lnbm1lbnRPcGVyYXRvcnMgJiYKKyAgICAgICAgICAgU3BhY2VCZWZvcmVDdG9ySW5pdGlhbGl6ZXJDb2xvbiA9PQorICAgICAgICAgICAgICAgUi5TcGFjZUJlZm9yZUN0b3JJbml0aWFsaXplckNvbG9uICYmCisgICAgICAgICAgIFNwYWNlQmVmb3JlSW5oZXJpdGFuY2VDb2xvbiA9PSBSLlNwYWNlQmVmb3JlSW5oZXJpdGFuY2VDb2xvbiAmJgorICAgICAgICAgICBTcGFjZUJlZm9yZVBhcmVucyA9PSBSLlNwYWNlQmVmb3JlUGFyZW5zICYmCisgICAgICAgICAgIFNwYWNlQmVmb3JlUmFuZ2VCYXNlZEZvckxvb3BDb2xvbiA9PQorICAgICAgICAgICAgICAgUi5TcGFjZUJlZm9yZVJhbmdlQmFzZWRGb3JMb29wQ29sb24gJiYKKyAgICAgICAgICAgU3BhY2VJbkVtcHR5UGFyZW50aGVzZXMgPT0gUi5TcGFjZUluRW1wdHlQYXJlbnRoZXNlcyAmJgorICAgICAgICAgICBTcGFjZXNCZWZvcmVUcmFpbGluZ0NvbW1lbnRzID09IFIuU3BhY2VzQmVmb3JlVHJhaWxpbmdDb21tZW50cyAmJgorICAgICAgICAgICBTcGFjZXNJbkFuZ2xlcyA9PSBSLlNwYWNlc0luQW5nbGVzICYmCisgICAgICAgICAgIFNwYWNlc0luQ29udGFpbmVyTGl0ZXJhbHMgPT0gUi5TcGFjZXNJbkNvbnRhaW5lckxpdGVyYWxzICYmCisgICAgICAgICAgIFNwYWNlc0luQ1N0eWxlQ2FzdFBhcmVudGhlc2VzID09IFIuU3BhY2VzSW5DU3R5bGVDYXN0UGFyZW50aGVzZXMgJiYKKyAgICAgICAgICAgU3BhY2VzSW5QYXJlbnRoZXNlcyA9PSBSLlNwYWNlc0luUGFyZW50aGVzZXMgJiYKKyAgICAgICAgICAgU3BhY2VzSW5TcXVhcmVCcmFja2V0cyA9PSBSLlNwYWNlc0luU3F1YXJlQnJhY2tldHMgJiYKKyAgICAgICAgICAgU3RhbmRhcmQgPT0gUi5TdGFuZGFyZCAmJiBUYWJXaWR0aCA9PSBSLlRhYldpZHRoICYmCisgICAgICAgICAgIFVzZVRhYiA9PSBSLlVzZVRhYjsKKyAgfQorCisgIGxsdm06Ok9wdGlvbmFsPEZvcm1hdFN0eWxlPiBHZXRMYW5ndWFnZVN0eWxlKExhbmd1YWdlS2luZCBMYW5ndWFnZSkgY29uc3Q7CisKKyAgLy8gU3RvcmVzIHBlci1sYW5ndWFnZSBzdHlsZXMuIEEgRm9ybWF0U3R5bGUgaW5zdGFuY2UgaW5zaWRlIGhhcyBhbiBlbXB0eQorICAvLyBTdHlsZVNldC4gQSBGb3JtYXRTdHlsZSBpbnN0YW5jZSByZXR1cm5lZCBieSB0aGUgR2V0IG1ldGhvZCBoYXMgaXRzCisgIC8vIFN0eWxlU2V0IHNldCB0byBhIGNvcHkgb2YgdGhlIG9yaWdpbmF0aW5nIFN0eWxlU2V0LCBlZmZlY3RpdmVseSBrZWVwaW5nIHRoZQorICAvLyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGF0IFN0eWxlU2V0IGFsaXZlLgorICAvLworICAvLyBUaGUgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIG93bmVyc2hpcCByZW1pbmRzIG9mIGEgYmlyZHMgbmVzdDogY2hpY2tzCisgIC8vIGxlYXZpbmcgdGhlIG5lc3QgdGFrZSBwaG90b3Mgb2YgdGhlIG5lc3Qgd2l0aCB0aGVtLgorICBzdHJ1Y3QgRm9ybWF0U3R5bGVTZXQgeworICAgIHR5cGVkZWYgc3RkOjptYXA8Rm9ybWF0U3R5bGU6Okxhbmd1YWdlS2luZCwgRm9ybWF0U3R5bGU+IE1hcFR5cGU7CisKKyAgICBsbHZtOjpPcHRpb25hbDxGb3JtYXRTdHlsZT4gR2V0KEZvcm1hdFN0eWxlOjpMYW5ndWFnZUtpbmQgTGFuZ3VhZ2UpIGNvbnN0OworCisgICAgLy8gQWRkcyBccCBTdHlsZSB0byB0aGlzIEZvcm1hdFN0eWxlU2V0LiBTdHlsZSBtdXN0IG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQKKyAgICAvLyBGb3JtYXRTdHlsZVNldC4KKyAgICAvLyBTdHlsZS5MYW5ndWFnZSBzaG91bGQgYmUgZGlmZmVyZW50IHRoYW4gTEtfTm9uZS4gSWYgdGhpcyBGb3JtYXRTdHlsZVNldAorICAgIC8vIGFscmVhZHkgY29udGFpbnMgYW4gZW50cnkgZm9yIFN0eWxlLkxhbmd1YWdlLCB0aGF0IGdldHMgcmVwbGFjZWQgd2l0aCB0aGUKKyAgICAvLyBwYXNzZWQgU3R5bGUuCisgICAgdm9pZCBBZGQoRm9ybWF0U3R5bGUgU3R5bGUpOworCisgICAgLy8gQ2xlYXJzIHRoaXMgRm9ybWF0U3R5bGVTZXQuCisgICAgdm9pZCBDbGVhcigpOworCisgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPE1hcFR5cGU+IFN0eWxlczsKKyAgfTsKKworICBzdGF0aWMgRm9ybWF0U3R5bGVTZXQgQnVpbGRTdHlsZVNldEZyb21Db25maWd1cmF0aW9uKAorICAgICAgY29uc3QgRm9ybWF0U3R5bGUgJk1haW5TdHlsZSwKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEZvcm1hdFN0eWxlPiAmQ29uZmlndXJhdGlvblN0eWxlcyk7CisKK3ByaXZhdGU6CisgIEZvcm1hdFN0eWxlU2V0IFN0eWxlU2V0OworCisgIGZyaWVuZCBzdGQ6OmVycm9yX2NvZGUgcGFyc2VDb25maWd1cmF0aW9uKFN0cmluZ1JlZiBUZXh0LCBGb3JtYXRTdHlsZSAqU3R5bGUpOworfTsKKworLy8vIFxicmllZiBSZXR1cm5zIGEgZm9ybWF0IHN0eWxlIGNvbXBseWluZyB3aXRoIHRoZSBMTFZNIGNvZGluZyBzdGFuZGFyZHM6CisvLy8gaHR0cDovL2xsdm0ub3JnL2RvY3MvQ29kaW5nU3RhbmRhcmRzLmh0bWwuCitGb3JtYXRTdHlsZSBnZXRMTFZNU3R5bGUoKTsKKworLy8vIFxicmllZiBSZXR1cm5zIGEgZm9ybWF0IHN0eWxlIGNvbXBseWluZyB3aXRoIG9uZSBvZiBHb29nbGUncyBzdHlsZSBndWlkZXM6CisvLy8gaHR0cDovL2dvb2dsZS1zdHlsZWd1aWRlLmdvb2dsZWNvZGUuY29tL3N2bi90cnVuay9jcHBndWlkZS54bWwuCisvLy8gaHR0cDovL2dvb2dsZS1zdHlsZWd1aWRlLmdvb2dsZWNvZGUuY29tL3N2bi90cnVuay9qYXZhc2NyaXB0Z3VpZGUueG1sLgorLy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9zdHlsZS4KK0Zvcm1hdFN0eWxlIGdldEdvb2dsZVN0eWxlKEZvcm1hdFN0eWxlOjpMYW5ndWFnZUtpbmQgTGFuZ3VhZ2UpOworCisvLy8gXGJyaWVmIFJldHVybnMgYSBmb3JtYXQgc3R5bGUgY29tcGx5aW5nIHdpdGggQ2hyb21pdW0ncyBzdHlsZSBndWlkZToKKy8vLyBodHRwOi8vd3d3LmNocm9taXVtLm9yZy9kZXZlbG9wZXJzL2NvZGluZy1zdHlsZS4KK0Zvcm1hdFN0eWxlIGdldENocm9taXVtU3R5bGUoRm9ybWF0U3R5bGU6Okxhbmd1YWdlS2luZCBMYW5ndWFnZSk7CisKKy8vLyBcYnJpZWYgUmV0dXJucyBhIGZvcm1hdCBzdHlsZSBjb21wbHlpbmcgd2l0aCBNb3ppbGxhJ3Mgc3R5bGUgZ3VpZGU6CisvLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9EZXZlbG9wZXJfR3VpZGUvQ29kaW5nX1N0eWxlLgorRm9ybWF0U3R5bGUgZ2V0TW96aWxsYVN0eWxlKCk7CisKKy8vLyBcYnJpZWYgUmV0dXJucyBhIGZvcm1hdCBzdHlsZSBjb21wbHlpbmcgd2l0aCBXZWJraXQncyBzdHlsZSBndWlkZToKKy8vLyBodHRwOi8vd3d3LndlYmtpdC5vcmcvY29kaW5nL2NvZGluZy1zdHlsZS5odG1sCitGb3JtYXRTdHlsZSBnZXRXZWJLaXRTdHlsZSgpOworCisvLy8gXGJyaWVmIFJldHVybnMgYSBmb3JtYXQgc3R5bGUgY29tcGx5aW5nIHdpdGggR05VIENvZGluZyBTdGFuZGFyZHM6CisvLy8gaHR0cDovL3d3dy5nbnUub3JnL3ByZXAvc3RhbmRhcmRzL3N0YW5kYXJkcy5odG1sCitGb3JtYXRTdHlsZSBnZXRHTlVTdHlsZSgpOworCisvLy8gXGJyaWVmIFJldHVybnMgc3R5bGUgaW5kaWNhdGluZyBmb3JtYXR0aW5nIHNob3VsZCBiZSBub3QgYXBwbGllZCBhdCBhbGwuCitGb3JtYXRTdHlsZSBnZXROb1N0eWxlKCk7CisKKy8vLyBcYnJpZWYgR2V0cyBhIHByZWRlZmluZWQgc3R5bGUgZm9yIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UgYnkgbmFtZS4KKy8vLworLy8vIEN1cnJlbnRseSBzdXBwb3J0ZWQgbmFtZXM6IExMVk0sIEdvb2dsZSwgQ2hyb21pdW0sIE1vemlsbGEuIE5hbWVzIGFyZQorLy8vIGNvbXBhcmVkIGNhc2UtaW5zZW5zaXRpdmVseS4KKy8vLworLy8vIFJldHVybnMgYGB0cnVlYGAgaWYgdGhlIFN0eWxlIGhhcyBiZWVuIHNldC4KK2Jvb2wgZ2V0UHJlZGVmaW5lZFN0eWxlKFN0cmluZ1JlZiBOYW1lLCBGb3JtYXRTdHlsZTo6TGFuZ3VhZ2VLaW5kIExhbmd1YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0U3R5bGUgKlN0eWxlKTsKKworLy8vIFxicmllZiBQYXJzZSBjb25maWd1cmF0aW9uIGZyb20gWUFNTC1mb3JtYXR0ZWQgdGV4dC4KKy8vLworLy8vIFN0eWxlLT5MYW5ndWFnZSBpcyB1c2VkIHRvIGdldCB0aGUgYmFzZSBzdHlsZSwgaWYgdGhlIGBgQmFzZWRPblN0eWxlYGAKKy8vLyBvcHRpb24gaXMgcHJlc2VudC4KKy8vLworLy8vIFRoZSBGb3JtYXRTdHlsZVNldCBvZiBTdHlsZSBpcyByZXNldC4KKy8vLworLy8vIFdoZW4gYGBCYXNlZE9uU3R5bGVgYCBpcyBub3QgcHJlc2VudCwgb3B0aW9ucyBub3QgcHJlc2VudCBpbiB0aGUgWUFNTAorLy8vIGRvY3VtZW50LCBhcmUgcmV0YWluZWQgaW4gXHAgU3R5bGUuCitzdGQ6OmVycm9yX2NvZGUgcGFyc2VDb25maWd1cmF0aW9uKFN0cmluZ1JlZiBUZXh0LCBGb3JtYXRTdHlsZSAqU3R5bGUpOworCisvLy8gXGJyaWVmIEdldHMgY29uZmlndXJhdGlvbiBpbiBhIFlBTUwgc3RyaW5nLgorc3RkOjpzdHJpbmcgY29uZmlndXJhdGlvbkFzVGV4dChjb25zdCBGb3JtYXRTdHlsZSAmU3R5bGUpOworCisvLy8gXGJyaWVmIFJldHVybnMgdGhlIHJlcGxhY2VtZW50cyBuZWNlc3NhcnkgdG8gc29ydCBhbGwgYGAjaW5jbHVkZWBgIGJsb2NrcworLy8vIHRoYXQgYXJlIGFmZmVjdGVkIGJ5IGBgUmFuZ2VzYGAuCit0b29saW5nOjpSZXBsYWNlbWVudHMgc29ydEluY2x1ZGVzKGNvbnN0IEZvcm1hdFN0eWxlICZTdHlsZSwgU3RyaW5nUmVmIENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHRvb2xpbmc6OlJhbmdlPiBSYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKkN1cnNvciA9IG51bGxwdHIpOworCisvLy8gXGJyaWVmIFJldHVybnMgdGhlIHJlcGxhY2VtZW50cyBjb3JyZXNwb25kaW5nIHRvIGFwcGx5aW5nIGFuZCBmb3JtYXR0aW5nCisvLy8gXHAgUmVwbGFjZXMgb24gc3VjY2Vzczsgb3RoZXJpd3NlLCByZXR1cm4gYW4gbGx2bTo6RXJyb3IgY2FycnlpbmcKKy8vLyBsbHZtOjpTdHJpbmdFcnJvci4KK2xsdm06OkV4cGVjdGVkPHRvb2xpbmc6OlJlcGxhY2VtZW50cz4KK2Zvcm1hdFJlcGxhY2VtZW50cyhTdHJpbmdSZWYgQ29kZSwgY29uc3QgdG9vbGluZzo6UmVwbGFjZW1lbnRzICZSZXBsYWNlcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXRTdHlsZSAmU3R5bGUpOworCisvLy8gXGJyaWVmIFJldHVybnMgdGhlIHJlcGxhY2VtZW50cyBjb3JyZXNwb25kaW5nIHRvIGFwcGx5aW5nIFxwIFJlcGxhY2VzIGFuZAorLy8vIGNsZWFuaW5nIHVwIHRoZSBjb2RlIGFmdGVyIHRoYXQgb24gc3VjY2Vzczsgb3RoZXJ3aXNlLCByZXR1cm4gYW4gbGx2bTo6RXJyb3IKKy8vLyBjYXJyeWluZyBsbHZtOjpTdHJpbmdFcnJvci4KKy8vLyBUaGlzIGFsc28gc3VwcG9ydHMgaW5zZXJ0aW5nL2RlbGV0aW5nIEMrKyAjaW5jbHVkZSBkaXJlY3RpdmVzOgorLy8vIC0gSWYgYSByZXBsYWNlbWVudCBoYXMgb2Zmc2V0IFVJTlRfTUFYLCBsZW5ndGggMCwgYW5kIGEgcmVwbGFjZW1lbnQgdGV4dAorLy8vICAgdGhhdCBpcyBhbiAjaW5jbHVkZSBkaXJlY3RpdmUsIHRoaXMgd2lsbCBpbnNlcnQgdGhlICNpbmNsdWRlIGludG8gdGhlCisvLy8gICBjb3JyZWN0IGJsb2NrIGluIHRoZSBccCBDb2RlLiBXaGVuIHNlYXJjaGluZyBmb3IgcG9pbnRzIHRvIGluc2VydCBuZXcKKy8vLyAgIGhlYWRlciwgdGhpcyBpZ25vcmVzICNpbmNsdWRlJ3MgYWZ0ZXIgdGhlICNpbmNsdWRlIGJsb2NrKHMpIGluIHRoZQorLy8vICAgYmVnaW5uaW5nIG9mIGEgZmlsZSB0byBhdm9pZCBpbnNlcnRpbmcgaGVhZGVycyBpbnRvIGNvZGUgc2VjdGlvbnMgd2hlcmUKKy8vLyAgIG5ldyAjaW5jbHVkZSdzIHNob3VsZCBub3QgYmUgYWRkZWQgYnkgZGVmYXVsdC4gVGhlc2UgY29kZSBzZWN0aW9ucworLy8vICAgaW5jbHVkZToKKy8vLyAgICAgLSByYXcgc3RyaW5nIGxpdGVyYWxzIChjb250YWluaW5nICNpbmNsdWRlKS4KKy8vLyAgICAgLSAjaWYgYmxvY2tzLgorLy8vICAgICAtIFNwZWNpYWwgI2luY2x1ZGUncyBhbW9uZyBkZWNsYXJhdGlvbnMgKGUuZy4gZnVuY3Rpb25zKS4KKy8vLyAtIElmIGEgcmVwbGFjZW1lbnQgaGFzIG9mZnNldCBVSU5UX01BWCwgbGVuZ3RoIDEsIGFuZCBhIHJlcGxhY2VtZW50IHRleHQKKy8vLyAgIHRoYXQgaXMgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciB0byBiZSByZW1vdmVkLCB0aGUgaGVhZGVyIHdpbGwgYmUgcmVtb3ZlZAorLy8vICAgZnJvbSBccCBDb2RlIGlmIGl0IGV4aXN0cy4KK2xsdm06OkV4cGVjdGVkPHRvb2xpbmc6OlJlcGxhY2VtZW50cz4KK2NsZWFudXBBcm91bmRSZXBsYWNlbWVudHMoU3RyaW5nUmVmIENvZGUsIGNvbnN0IHRvb2xpbmc6OlJlcGxhY2VtZW50cyAmUmVwbGFjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdFN0eWxlICZTdHlsZSk7CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyB0aGUgc3RhdHVzIG9mIGEgZm9ybWF0dGluZyBhdHRlbXB0Lgorc3RydWN0IEZvcm1hdHRpbmdBdHRlbXB0U3RhdHVzIHsKKyAgLy8vIFxicmllZiBBIHZhbHVlIG9mIGBgZmFsc2VgYCBtZWFucyB0aGF0IGFueSBvZiB0aGUgYWZmZWN0ZWQgcmFuZ2VzIHdlcmUgbm90CisgIC8vLyBmb3JtYXR0ZWQgZHVlIHRvIGEgbm9uLXJlY292ZXJhYmxlIHN5bnRheCBlcnJvci4KKyAgYm9vbCBGb3JtYXRDb21wbGV0ZSA9IHRydWU7CisKKyAgLy8vIFxicmllZiBJZiBgYEZvcm1hdENvbXBsZXRlYGAgaXMgZmFsc2UsIGBgTGluZWBgIHJlY29yZHMgYSBvbmUtYmFzZWQKKyAgLy8vIG9yaWdpbmFsIGxpbmUgbnVtYmVyIGF0IHdoaWNoIGEgc3ludGF4IGVycm9yIG1pZ2h0IGhhdmUgb2NjdXJyZWQuIFRoaXMgaXMKKyAgLy8vIGJhc2VkIG9uIGEgYmVzdC1lZmZvcnQgYW5hbHlzaXMgYW5kIGNvdWxkIGJlIGltcHJlY2lzZS4KKyAgdW5zaWduZWQgTGluZSA9IDA7Cit9OworCisvLy8gXGJyaWVmIFJlZm9ybWF0cyB0aGUgZ2l2ZW4gXHAgUmFuZ2VzIGluIFxwIENvZGUuCisvLy8KKy8vLyBFYWNoIHJhbmdlIGlzIGV4dGVuZGVkIG9uIGVpdGhlciBlbmQgdG8gaXRzIG5leHQgYmlnZ2VyIGxvZ2ljIHVuaXQsIGkuZS4KKy8vLyBldmVyeXRoaW5nIHRoYXQgbWlnaHQgaW5mbHVlbmNlIGl0cyBmb3JtYXR0aW5nIG9yIG1pZ2h0IGJlIGluZmx1ZW5jZWQgYnkgaXRzCisvLy8gZm9ybWF0dGluZy4KKy8vLworLy8vIFJldHVybnMgdGhlIGBgUmVwbGFjZW1lbnRzYGAgbmVjZXNzYXJ5IHRvIG1ha2UgYWxsIFxwIFJhbmdlcyBjb21wbHkgd2l0aAorLy8vIFxwIFN0eWxlLgorLy8vCisvLy8gSWYgYGBTdGF0dXNgYCBpcyBub24tbnVsbCwgaXRzIHZhbHVlIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggdGhlIHN0YXR1cyBvZgorLy8vIHRoaXMgZm9ybWF0dGluZyBhdHRlbXB0LiBTZWUgXGMgRm9ybWF0dGluZ0F0dGVtcHRTdGF0dXMuCit0b29saW5nOjpSZXBsYWNlbWVudHMgcmVmb3JtYXQoY29uc3QgRm9ybWF0U3R5bGUgJlN0eWxlLCBTdHJpbmdSZWYgQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx0b29saW5nOjpSYW5nZT4gUmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlTmFtZSA9ICI8c3RkaW4+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXR0aW5nQXR0ZW1wdFN0YXR1cyAqU3RhdHVzID0gbnVsbHB0cik7CisKKy8vLyBcYnJpZWYgU2FtZSBhcyBhYm92ZSwgZXhjZXB0IGlmIGBgSW5jb21wbGV0ZUZvcm1hdGBgIGlzIG5vbi1udWxsLCBpdHMgdmFsdWUKKy8vLyB3aWxsIGJlIHNldCB0byB0cnVlIGlmIGFueSBvZiB0aGUgYWZmZWN0ZWQgcmFuZ2VzIHdlcmUgbm90IGZvcm1hdHRlZCBkdWUgdG8KKy8vLyBhIG5vbi1yZWNvdmVyYWJsZSBzeW50YXggZXJyb3IuCit0b29saW5nOjpSZXBsYWNlbWVudHMgcmVmb3JtYXQoY29uc3QgRm9ybWF0U3R5bGUgJlN0eWxlLCBTdHJpbmdSZWYgQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx0b29saW5nOjpSYW5nZT4gUmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpJbmNvbXBsZXRlRm9ybWF0KTsKKworLy8vIFxicmllZiBDbGVhbiB1cCBhbnkgZXJyb25lb3VzL3JlZHVuZGFudCBjb2RlIGluIHRoZSBnaXZlbiBccCBSYW5nZXMgaW4gXHAKKy8vLyBDb2RlLgorLy8vCisvLy8gUmV0dXJucyB0aGUgYGBSZXBsYWNlbWVudHNgYCB0aGF0IGNsZWFuIHVwIGFsbCBccCBSYW5nZXMgaW4gXHAgQ29kZS4KK3Rvb2xpbmc6OlJlcGxhY2VtZW50cyBjbGVhbnVwKGNvbnN0IEZvcm1hdFN0eWxlICZTdHlsZSwgU3RyaW5nUmVmIENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx0b29saW5nOjpSYW5nZT4gUmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVOYW1lID0gIjxzdGRpbj4iKTsKKworLy8vIFxicmllZiBGaXggbmFtZXNwYWNlIGVuZCBjb21tZW50cyBpbiB0aGUgZ2l2ZW4gXHAgUmFuZ2VzIGluIFxwIENvZGUuCisvLy8KKy8vLyBSZXR1cm5zIHRoZSBgYFJlcGxhY2VtZW50c2BgIHRoYXQgZml4IHRoZSBuYW1lc3BhY2UgY29tbWVudHMgaW4gYWxsCisvLy8gXHAgUmFuZ2VzIGluIFxwIENvZGUuCit0b29saW5nOjpSZXBsYWNlbWVudHMgZml4TmFtZXNwYWNlRW5kQ29tbWVudHMoY29uc3QgRm9ybWF0U3R5bGUgJlN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHRvb2xpbmc6OlJhbmdlPiBSYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVOYW1lID0gIjxzdGRpbj4iKTsKKworLy8vIFxicmllZiBTb3J0IGNvbnNlY3V0aXZlIHVzaW5nIGRlY2xhcmF0aW9ucyBpbiB0aGUgZ2l2ZW4gXHAgUmFuZ2VzIGluCisvLy8gXHAgQ29kZS4KKy8vLworLy8vIFJldHVybnMgdGhlIGBgUmVwbGFjZW1lbnRzYGAgdGhhdCBzb3J0IHRoZSB1c2luZyBkZWNsYXJhdGlvbnMgaW4gYWxsCisvLy8gXHAgUmFuZ2VzIGluIFxwIENvZGUuCit0b29saW5nOjpSZXBsYWNlbWVudHMgc29ydFVzaW5nRGVjbGFyYXRpb25zKGNvbnN0IEZvcm1hdFN0eWxlICZTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHRvb2xpbmc6OlJhbmdlPiBSYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlTmFtZSA9ICI8c3RkaW4+Iik7CisKKy8vLyBcYnJpZWYgUmV0dXJucyB0aGUgYGBMYW5nT3B0c2BgIHRoYXQgdGhlIGZvcm1hdHRlciBleHBlY3RzIHlvdSB0byBzZXQuCisvLy8KKy8vLyBccGFyYW0gU3R5bGUgZGV0ZXJtaW5lcyBzcGVjaWZpYyBzZXR0aW5ncyBmb3IgbGV4aW5nIG1vZGUuCitMYW5nT3B0aW9ucyBnZXRGb3JtYXR0aW5nTGFuZ09wdHMoY29uc3QgRm9ybWF0U3R5bGUgJlN0eWxlID0gZ2V0TExWTVN0eWxlKCkpOworCisvLy8gXGJyaWVmIERlc2NyaXB0aW9uIHRvIGJlIHVzZWQgZm9yIGhlbHAgdGV4dCBmb3IgYSBgYGxsdm06OmNsYGAgb3B0aW9uIGZvcgorLy8vIHNwZWNpZnlpbmcgZm9ybWF0IHN0eWxlLiBUaGUgZGVzY3JpcHRpb24gaXMgY2xvc2VseSByZWxhdGVkIHRvIHRoZSBvcGVyYXRpb24KKy8vLyBvZiBgYGdldFN0eWxlKClgYC4KK2V4dGVybiBjb25zdCBjaGFyICpTdHlsZU9wdGlvbkhlbHBEZXNjcmlwdGlvbjsKKworLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBGb3JtYXRTdHlsZSBiYXNlZCBvbiBgYFN0eWxlTmFtZWBgLgorLy8vCisvLy8gYGBTdHlsZU5hbWVgYCBjYW4gdGFrZSBzZXZlcmFsIGZvcm1zOgorLy8vICogIns8a2V5PjogPHZhbHVlPiwgLi4ufSIgLSBTZXQgc3BlY2ljIHN0eWxlIHBhcmFtZXRlcnMuCisvLy8gKiAiPHN0eWxlIG5hbWU+IiAtIE9uZSBvZiB0aGUgc3R5bGUgbmFtZXMgc3VwcG9ydGVkIGJ5CisvLy8gZ2V0UHJlZGVmaW5lZFN0eWxlKCkuCisvLy8gKiAiZmlsZSIgLSBMb2FkIHN0eWxlIGNvbmZpZ3VyYXRpb24gZnJvbSBhIGZpbGUgY2FsbGVkIGBgLmNsYW5nLWZvcm1hdGBgCisvLy8gbG9jYXRlZCBpbiBvbmUgb2YgdGhlIHBhcmVudCBkaXJlY3RvcmllcyBvZiBgYEZpbGVOYW1lYGAgb3IgdGhlIGN1cnJlbnQKKy8vLyBkaXJlY3RvcnkgaWYgYGBGaWxlTmFtZWBgIGlzIGVtcHR5LgorLy8vCisvLy8gXHBhcmFtW2luXSBTdHlsZU5hbWUgU3R5bGUgbmFtZSB0byBpbnRlcnByZXQgYWNjb3JkaW5nIHRvIHRoZSBkZXNjcmlwdGlvbgorLy8vIGFib3ZlLgorLy8vIFxwYXJhbVtpbl0gRmlsZU5hbWUgUGF0aCB0byBzdGFydCBzZWFyY2ggZm9yIC5jbGFuZy1mb3JtYXQgaWYgYGBTdHlsZU5hbWVgYAorLy8vID09ICJmaWxlIi4KKy8vLyBccGFyYW1baW5dIEZhbGxiYWNrU3R5bGUgVGhlIG5hbWUgb2YgYSBwcmVkZWZpbmVkIHN0eWxlIHVzZWQgdG8gZmFsbGJhY2sgdG8KKy8vLyBpbiBjYXNlIFxwIFN0eWxlTmFtZSBpcyAiZmlsZSIgYW5kIG5vIGZpbGUgY2FuIGJlIGZvdW5kLgorLy8vIFxwYXJhbVtpbl0gQ29kZSBUaGUgYWN0dWFsIGNvZGUgdG8gYmUgZm9ybWF0dGVkLiBVc2VkIHRvIGRldGVybWluZSB0aGUKKy8vLyBsYW5ndWFnZSBpZiB0aGUgZmlsZW5hbWUgaXNuJ3Qgc3VmZmljaWVudC4KKy8vLyBccGFyYW1baW5dIEZTIFRoZSB1bmRlcmx5aW5nIGZpbGUgc3lzdGVtLCBpbiB3aGljaCB0aGUgZmlsZSByZXNpZGVzLiBCeQorLy8vIGRlZmF1bHQsIHRoZSBmaWxlIHN5c3RlbSBpcyB0aGUgcmVhbCBmaWxlIHN5c3RlbS4KKy8vLworLy8vIFxyZXR1cm5zIEZvcm1hdFN0eWxlIGFzIHNwZWNpZmllZCBieSBgYFN0eWxlTmFtZWBgLiBJZiBgYFN0eWxlTmFtZWBgIGlzCisvLy8gImZpbGUiIGFuZCBubyBmaWxlIGlzIGZvdW5kLCByZXR1cm5zIGBgRmFsbGJhY2tTdHlsZWBgLiBJZiBubyBzdHlsZSBjb3VsZCBiZQorLy8vIGRldGVybWluZWQsIHJldHVybnMgYW4gRXJyb3IuCitsbHZtOjpFeHBlY3RlZDxGb3JtYXRTdHlsZT4gZ2V0U3R5bGUoU3RyaW5nUmVmIFN0eWxlTmFtZSwgU3RyaW5nUmVmIEZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGYWxsYmFja1N0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDb2RlID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmZzOjpGaWxlU3lzdGVtICpGUyA9IG51bGxwdHIpOworCisvLyBcYnJpZWYgR3Vlc3NlcyB0aGUgbGFuZ3VhZ2UgZnJvbSB0aGUgYGBGaWxlTmFtZWBgIGFuZCBgYENvZGVgYCB0byBiZSBmb3JtYXR0ZWQuCisvLyBEZWZhdWx0cyB0byBGb3JtYXRTdHlsZTo6TEtfQ3BwLgorRm9ybWF0U3R5bGU6Okxhbmd1YWdlS2luZCBndWVzc0xhbmd1YWdlKFN0cmluZ1JlZiBGaWxlTmFtZSwgU3RyaW5nUmVmIENvZGUpOworCisvLyBcYnJpZWYgUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBgYExhbmd1YWdlYGAuCitpbmxpbmUgU3RyaW5nUmVmIGdldExhbmd1YWdlTmFtZShGb3JtYXRTdHlsZTo6TGFuZ3VhZ2VLaW5kIExhbmd1YWdlKSB7CisgIHN3aXRjaCAoTGFuZ3VhZ2UpIHsKKyAgY2FzZSBGb3JtYXRTdHlsZTo6TEtfQ3BwOgorICAgIHJldHVybiAiQysrIjsKKyAgY2FzZSBGb3JtYXRTdHlsZTo6TEtfT2JqQzoKKyAgICByZXR1cm4gIk9iamVjdGl2ZS1DIjsKKyAgY2FzZSBGb3JtYXRTdHlsZTo6TEtfSmF2YToKKyAgICByZXR1cm4gIkphdmEiOworICBjYXNlIEZvcm1hdFN0eWxlOjpMS19KYXZhU2NyaXB0OgorICAgIHJldHVybiAiSmF2YVNjcmlwdCI7CisgIGNhc2UgRm9ybWF0U3R5bGU6OkxLX1Byb3RvOgorICAgIHJldHVybiAiUHJvdG8iOworICBjYXNlIEZvcm1hdFN0eWxlOjpMS19UZXh0UHJvdG86CisgICAgcmV0dXJuICJUZXh0UHJvdG8iOworICBkZWZhdWx0OgorICAgIHJldHVybiAiVW5rbm93biI7CisgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGZvcm1hdAorfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKK25hbWVzcGFjZSBzdGQgewordGVtcGxhdGUgPD4KK3N0cnVjdCBpc19lcnJvcl9jb2RlX2VudW08Y2xhbmc6OmZvcm1hdDo6UGFyc2VFcnJvcj4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKK30KKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfRk9STUFUX0ZPUk1BVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9BU1RDb25zdW1lcnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0FTVENvbnN1bWVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTc1YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9BU1RDb25zdW1lcnMuaApAQCAtMCwwICsxLDU4IEBACisvLz09PS0tLSBBU1RDb25zdW1lcnMuaCAtIEFTVENvbnN1bWVyIGltcGxlbWVudGF0aW9ucyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEFTVCBDb25zdW1lcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0ZST05URU5EX0FTVENPTlNVTUVSU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfRlJPTlRFTkRfQVNUQ09OU1VNRVJTX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFTVENvbnN1bWVyOworY2xhc3MgQ29kZUdlbk9wdGlvbnM7CitjbGFzcyBEaWFnbm9zdGljc0VuZ2luZTsKK2NsYXNzIEZpbGVNYW5hZ2VyOworY2xhc3MgTGFuZ09wdGlvbnM7CitjbGFzcyBQcmVwcm9jZXNzb3I7CitjbGFzcyBUYXJnZXRPcHRpb25zOworCisvLyBBU1QgcHJldHR5LXByaW50ZXI6IHByaW50cyBvdXQgdGhlIEFTVCBpbiBhIGZvcm1hdCB0aGF0IGlzIGNsb3NlIHRvIHRoZQorLy8gb3JpZ2luYWwgQyBjb2RlLiAgVGhlIG91dHB1dCBpcyBpbnRlbmRlZCB0byBiZSBpbiBhIGZvcm1hdCBzdWNoIHRoYXQKKy8vIGNsYW5nIGNvdWxkIHJlLXBhcnNlIHRoZSBvdXRwdXQgYmFjayBpbnRvIHRoZSBzYW1lIEFTVCwgYnV0IHRoZQorLy8gaW1wbGVtZW50YXRpb24gaXMgc3RpbGwgaW5jb21wbGV0ZS4KK3N0ZDo6dW5pcXVlX3B0cjxBU1RDb25zdW1lcj4gQ3JlYXRlQVNUUHJpbnRlcihzdGQ6OnVuaXF1ZV9wdHI8cmF3X29zdHJlYW0+IE9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWx0ZXJTdHJpbmcpOworCisvLyBBU1QgZHVtcGVyOiBkdW1wcyB0aGUgcmF3IEFTVCBpbiBodW1hbi1yZWFkYWJsZSBmb3JtIHRvIHN0ZGVycjsgdGhpcyBpcworLy8gaW50ZW5kZWQgZm9yIGRlYnVnZ2luZy4KK3N0ZDo6dW5pcXVlX3B0cjxBU1RDb25zdW1lcj4gQ3JlYXRlQVNURHVtcGVyKFN0cmluZ1JlZiBGaWx0ZXJTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIER1bXBEZWNscywgYm9vbCBEZXNlcmlhbGl6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRHVtcExvb2t1cHMpOworCisvLyBBU1QgRGVjbCBub2RlIGxpc3RlcjogcHJpbnRzIHF1YWxpZmllZCBuYW1lcyBvZiBhbGwgZmlsdGVyYWJsZSBBU1QgRGVjbAorLy8gbm9kZXMuCitzdGQ6OnVuaXF1ZV9wdHI8QVNUQ29uc3VtZXI+IENyZWF0ZUFTVERlY2xOb2RlTGlzdGVyKCk7CisKKy8vIEdyYXBoaWNhbCBBU1Qgdmlld2VyOiBmb3IgZWFjaCBmdW5jdGlvbiBkZWZpbml0aW9uLCBjcmVhdGVzIGEgZ3JhcGggb2YKKy8vIHRoZSBBU1QgYW5kIGRpc3BsYXlzIGl0IHdpdGggdGhlIGdyYXBoIHZpZXdlciAiZG90dHkiLiAgQWxzbyBvdXRwdXRzCisvLyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgdG8gc3RkZXJyLgorc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPiBDcmVhdGVBU1RWaWV3ZXIoKTsKKworLy8gRGVjbENvbnRleHQgcHJpbnRlcjogcHJpbnRzIG91dCB0aGUgRGVjbENvbnRleHQgdHJlZSBpbiBodW1hbi1yZWFkYWJsZSBmb3JtCisvLyB0byBzdGRlcnI7IHRoaXMgaXMgaW50ZW5kZWQgZm9yIGRlYnVnZ2luZy4KK3N0ZDo6dW5pcXVlX3B0cjxBU1RDb25zdW1lcj4gQ3JlYXRlRGVjbENvbnRleHRQcmludGVyKCk7CisKK30gLy8gZW5kIGNsYW5nIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0FTVFVuaXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0FTVFVuaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWMwZGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvQVNUVW5pdC5oCkBAIC0wLDAgKzEsODc1IEBACisvLz09PS0gQVNUVW5pdC5oIC0gQVNUVW5pdCB1dGlsaXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEFTVFVuaXQgdXRpbGl0eSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRlJPTlRFTkRfQVNUVU5JVF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfRlJPTlRFTkRfQVNUVU5JVF9ICisKKyNpbmNsdWRlICJjbGFuZy1jL0luZGV4LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVENvbnRleHQuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRmlsZVN5c3RlbU9wdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L0hlYWRlclNlYXJjaE9wdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9MZXgvTW9kdWxlTG9hZGVyLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L1ByZXByb2Nlc3NpbmdSZWNvcmQuaCIKKyNpbmNsdWRlICJjbGFuZy9TZW1hL0NvZGVDb21wbGV0ZUNvbnN1bWVyLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VyaWFsaXphdGlvbi9BU1RCaXRDb2Rlcy5oIgorI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL1ByZWNvbXBpbGVkUHJlYW1ibGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWVtb3J5QnVmZmVyOworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBBU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lcjsKK2NsYXNzIEFTVE11dGF0aW9uTGlzdGVuZXI7CitjbGFzcyBBU1RSZWFkZXI7CitjbGFzcyBDb21waWxlckluc3RhbmNlOworY2xhc3MgQ29tcGlsZXJJbnZvY2F0aW9uOworY2xhc3MgRGVjbDsKK2NsYXNzIEZpbGVFbnRyeTsKK2NsYXNzIEZpbGVNYW5hZ2VyOworY2xhc3MgRnJvbnRlbmRBY3Rpb247CitjbGFzcyBIZWFkZXJTZWFyY2g7CitjbGFzcyBJbnB1dEtpbmQ7CitjbGFzcyBNZW1vcnlCdWZmZXJDYWNoZTsKK2NsYXNzIFBDSENvbnRhaW5lck9wZXJhdGlvbnM7CitjbGFzcyBQQ0hDb250YWluZXJSZWFkZXI7CitjbGFzcyBQcmVwcm9jZXNzb3I7CitjbGFzcyBQcmVwcm9jZXNzb3JPcHRpb25zOworY2xhc3MgU2VtYTsKK2NsYXNzIFRhcmdldEluZm87CisKK25hbWVzcGFjZSB2ZnMgeworCitjbGFzcyBGaWxlU3lzdGVtOworCit9IC8vIG5hbWVzcGFjZSB2ZnMKKworLy8vIFxicmllZiBVdGlsaXR5IGNsYXNzIGZvciBsb2FkaW5nIGEgQVNUQ29udGV4dCBmcm9tIGFuIEFTVCBmaWxlLgorY2xhc3MgQVNUVW5pdCB7CitwdWJsaWM6CisgIHN0cnVjdCBTdGFuZGFsb25lRml4SXQgeworICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+IFJlbW92ZVJhbmdlOworICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+IEluc2VydEZyb21SYW5nZTsKKyAgICBzdGQ6OnN0cmluZyBDb2RlVG9JbnNlcnQ7CisgICAgYm9vbCBCZWZvcmVQcmV2aW91c0luc2VydGlvbnM7CisgIH07CisKKyAgc3RydWN0IFN0YW5kYWxvbmVEaWFnbm9zdGljIHsKKyAgICB1bnNpZ25lZCBJRDsKKyAgICBEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWw7CisgICAgc3RkOjpzdHJpbmcgTWVzc2FnZTsKKyAgICBzdGQ6OnN0cmluZyBGaWxlbmFtZTsKKyAgICB1bnNpZ25lZCBMb2NPZmZzZXQ7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4+IFJhbmdlczsKKyAgICBzdGQ6OnZlY3RvcjxTdGFuZGFsb25lRml4SXQ+IEZpeEl0czsKKyAgfTsKKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPExhbmdPcHRpb25zPiAgICAgICAgICAgIExhbmdPcHRzOworICBJbnRydXNpdmVSZWZDbnRQdHI8RGlhZ25vc3RpY3NFbmdpbmU+ICAgRGlhZ25vc3RpY3M7CisgIEludHJ1c2l2ZVJlZkNudFB0cjxGaWxlTWFuYWdlcj4gICAgICAgICBGaWxlTWdyOworICBJbnRydXNpdmVSZWZDbnRQdHI8U291cmNlTWFuYWdlcj4gICAgICAgU291cmNlTWdyOworICBJbnRydXNpdmVSZWZDbnRQdHI8TWVtb3J5QnVmZmVyQ2FjaGU+ICAgUENNQ2FjaGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxIZWFkZXJTZWFyY2g+ICAgICAgICAgICBIZWFkZXJJbmZvOworICBJbnRydXNpdmVSZWZDbnRQdHI8VGFyZ2V0SW5mbz4gICAgICAgICAgVGFyZ2V0OworICBzdGQ6OnNoYXJlZF9wdHI8UHJlcHJvY2Vzc29yPiAgICAgICAgICAgUFA7CisgIEludHJ1c2l2ZVJlZkNudFB0cjxBU1RDb250ZXh0PiAgICAgICAgICBDdHg7CisgIHN0ZDo6c2hhcmVkX3B0cjxUYXJnZXRPcHRpb25zPiAgICAgICAgICBUYXJnZXRPcHRzOworICBzdGQ6OnNoYXJlZF9wdHI8SGVhZGVyU2VhcmNoT3B0aW9ucz4gICAgSFNPcHRzOworICBzdGQ6OnNoYXJlZF9wdHI8UHJlcHJvY2Vzc29yT3B0aW9ucz4gICAgUFBPcHRzOworICBJbnRydXNpdmVSZWZDbnRQdHI8QVNUUmVhZGVyPiBSZWFkZXI7CisgIGJvb2wgSGFkTW9kdWxlTG9hZGVyRmF0YWxGYWlsdXJlID0gZmFsc2U7CisKKyAgc3RydWN0IEFTVFdyaXRlckRhdGE7CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RXcml0ZXJEYXRhPiBXcml0ZXJEYXRhOworCisgIEZpbGVTeXN0ZW1PcHRpb25zIEZpbGVTeXN0ZW1PcHRzOworCisgIC8vLyBcYnJpZWYgVGhlIEFTVCBjb25zdW1lciB0aGF0IHJlY2VpdmVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2xhdGlvbgorICAvLy8gdW5pdCBhcyBpdCB3YXMgcGFyc2VkIG9yIGxvYWRlZC4KKyAgc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPiBDb25zdW1lcjsKKworICAvLy8gXGJyaWVmIFRoZSBzZW1hbnRpYyBhbmFseXNpcyBvYmplY3QgdXNlZCB0byB0eXBlLWNoZWNrIHRoZSB0cmFuc2xhdGlvbgorICAvLy8gdW5pdC4KKyAgc3RkOjp1bmlxdWVfcHRyPFNlbWE+IFRoZVNlbWE7CisKKyAgLy8vIE9wdGlvbmFsIG93bmVkIGludm9jYXRpb24sIGp1c3QgdXNlZCB0byBtYWtlIHRoZSBpbnZvY2F0aW9uIHVzZWQgaW4KKyAgLy8vIExvYWRGcm9tQ29tbWFuZExpbmUgYXZhaWxhYmxlLgorICBzdGQ6OnNoYXJlZF9wdHI8Q29tcGlsZXJJbnZvY2F0aW9uPiBJbnZvY2F0aW9uOworCisgIC8vLyBGYWtlIG1vZHVsZSBsb2FkZXI6IHRoZSBBU1QgdW5pdCBkb2Vzbid0IG5lZWQgdG8gbG9hZCBhbnkgbW9kdWxlcy4KKyAgVHJpdmlhbE1vZHVsZUxvYWRlciBNb2R1bGVMb2FkZXI7CisKKyAgLy8gT25seUxvY2FsRGVjbHMgLSB3aGVuIHRydWUsIHdhbGtpbmcgdGhpcyBBU1Qgc2hvdWxkIG9ubHkgdmlzaXQgZGVjbGFyYXRpb25zCisgIC8vIHRoYXQgY29tZSBmcm9tIHRoZSBBU1QgaXRzZWxmLCBub3QgZnJvbSBpbmNsdWRlZCBwcmVjb21waWxlZCBoZWFkZXJzLgorICAvLyBGSVhNRTogVGhpcyBpcyB0ZW1wb3Jhcnk7IGV2ZW50dWFsbHksIENJbmRleCB3aWxsIGFsd2F5cyBkbyB0aGlzLgorICBib29sIE9ubHlMb2NhbERlY2xzID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRvIGNhcHR1cmUgYW55IGRpYWdub3N0aWNzIHByb2R1Y2VkLgorICBib29sIENhcHR1cmVEaWFnbm9zdGljcyA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgVHJhY2sgd2hldGhlciB0aGUgbWFpbiBmaWxlIHdhcyBsb2FkZWQgZnJvbSBhbiBBU1Qgb3Igbm90LgorICBib29sIE1haW5GaWxlSXNBU1Q7CisKKyAgLy8vIFxicmllZiBXaGF0IGtpbmQgb2YgdHJhbnNsYXRpb24gdW5pdCB0aGlzIEFTVCByZXByZXNlbnRzLgorICBUcmFuc2xhdGlvblVuaXRLaW5kIFRVS2luZCA9IFRVX0NvbXBsZXRlOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB3ZSBzaG91bGQgdGltZSBlYWNoIG9wZXJhdGlvbi4KKyAgYm9vbCBXYW50VGltaW5nOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgQVNUVW5pdCBzaG91bGQgZGVsZXRlIHRoZSByZW1hcHBlZCBidWZmZXJzLgorICBib29sIE93bnNSZW1hcHBlZEZpbGVCdWZmZXJzID0gdHJ1ZTsKKyAgCisgIC8vLyBUcmFjayB0aGUgdG9wLWxldmVsIGRlY2xzIHdoaWNoIGFwcGVhcmVkIGluIGFuIEFTVFVuaXQgd2hpY2ggd2FzIGxvYWRlZAorICAvLy8gZnJvbSBhIHNvdXJjZSBmaWxlLgorICAvLworICAvLyBGSVhNRTogVGhpcyBpcyBqdXN0IGFuIG9wdGltaXphdGlvbiBoYWNrIHRvIGF2b2lkIGRlc2VyaWFsaXppbmcgbGFyZ2UgcGFydHMKKyAgLy8gb2YgYSBQQ0ggZmlsZSB3aGVuIHVzaW5nIHRoZSBJbmRleCBsaWJyYXJ5IG9uIGFuIEFTVFVuaXQgbG9hZGVkIGZyb20KKyAgLy8gc291cmNlLiBJbiB0aGUgbG9uZyB0ZXJtIHdlIHNob3VsZCBtYWtlIHRoZSBJbmRleCBsaWJyYXJ5IHVzZSBlZmZpY2llbnQgYW5kCisgIC8vIG1vcmUgc2NhbGFibGUgc2VhcmNoIG1lY2hhbmlzbXMuCisgIHN0ZDo6dmVjdG9yPERlY2wqPiBUb3BMZXZlbERlY2xzOworCisgIC8vLyBcYnJpZWYgU29ydGVkIChieSBmaWxlIG9mZnNldCkgdmVjdG9yIG9mIHBhaXJzIG9mIGZpbGUgb2Zmc2V0L0RlY2wuCisgIHVzaW5nIExvY0RlY2xzVHkgPSBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIERlY2wgKj4sIDY0PjsKKyAgdXNpbmcgRmlsZURlY2xzVHkgPSBsbHZtOjpEZW5zZU1hcDxGaWxlSUQsIExvY0RlY2xzVHkgKj47CisKKyAgLy8vIFxicmllZiBNYXAgZnJvbSBGaWxlSUQgdG8gdGhlIGZpbGUtbGV2ZWwgZGVjbGFyYXRpb25zIHRoYXQgaXQgY29udGFpbnMuCisgIC8vLyBUaGUgZmlsZXMgYW5kIGRlY2xzIGFyZSBvbmx5IGxvY2FsIChhbmQgbm9uLXByZWFtYmxlKSBvbmVzLgorICBGaWxlRGVjbHNUeSBGaWxlRGVjbHM7CisgIAorICAvLy8gVGhlIG5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIHVzZWQgdG8gZ2VuZXJhdGUgdGhpcyBBU1RVbml0LgorICBzdGQ6OnN0cmluZyBPcmlnaW5hbFNvdXJjZUZpbGU7CisKKyAgLy8vIFxicmllZiBUaGUgc2V0IG9mIGRpYWdub3N0aWNzIHByb2R1Y2VkIHdoZW4gY3JlYXRpbmcgdGhlIHByZWFtYmxlLgorICBTbWFsbFZlY3RvcjxTdGFuZGFsb25lRGlhZ25vc3RpYywgND4gUHJlYW1ibGVEaWFnbm9zdGljczsKKworICAvLy8gXGJyaWVmIFRoZSBzZXQgb2YgZGlhZ25vc3RpY3MgcHJvZHVjZWQgd2hlbiBjcmVhdGluZyB0aGlzCisgIC8vLyB0cmFuc2xhdGlvbiB1bml0LgorICBTbWFsbFZlY3RvcjxTdG9yZWREaWFnbm9zdGljLCA0PiBTdG9yZWREaWFnbm9zdGljczsKKworICAvLy8gXGJyaWVmIFRoZSBzZXQgb2YgZGlhZ25vc3RpY3MgcHJvZHVjZWQgd2hlbiBmYWlsaW5nIHRvIHBhcnNlLCBlLmcuIGR1ZQorICAvLy8gdG8gZmFpbHVyZSB0byBsb2FkIHRoZSBQQ0guCisgIFNtYWxsVmVjdG9yPFN0b3JlZERpYWdub3N0aWMsIDQ+IEZhaWxlZFBhcnNlRGlhZ25vc3RpY3M7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHN0b3JlZCBkaWFnbm9zdGljcyB0aGF0IGNvbWUgZnJvbSB0aGUgZHJpdmVyCisgIC8vLyBpdHNlbGYuCisgIC8vLworICAvLy8gRGlhZ25vc3RpY3MgdGhhdCBjb21lIGZyb20gdGhlIGRyaXZlciBhcmUgcmV0YWluZWQgZnJvbSBvbmUgcGFyc2UgdG8KKyAgLy8vIHRoZSBuZXh0LgorICB1bnNpZ25lZCBOdW1TdG9yZWREaWFnbm9zdGljc0Zyb21Ecml2ZXIgPSAwOworICAKKyAgLy8vIFxicmllZiBDb3VudGVyIHRoYXQgZGV0ZXJtaW5lcyB3aGVuIHdlIHdhbnQgdG8gdHJ5IGJ1aWxkaW5nIGEKKyAgLy8vIHByZWNvbXBpbGVkIHByZWFtYmxlLgorICAvLy8KKyAgLy8vIElmIHplcm8sIHdlIHdpbGwgbmV2ZXIgYnVpbGQgYSBwcmVjb21waWxlZCBwcmVhbWJsZS4gT3RoZXJ3aXNlLAorICAvLy8gaXQncyB0cmVhdGVkIGFzIGEgY291bnRlciB0aGF0IGRlY3JlbWVudHMgZWFjaCB0aW1lIHdlIHJlcGFyc2UKKyAgLy8vIHdpdGhvdXQgdGhlIGJlbmVmaXQgb2YgYSBwcmVjb21waWxlZCBwcmVhbWJsZS4gV2hlbiBpdCBoaXRzIDEsCisgIC8vLyB3ZSdsbCBhdHRlbXB0IHRvIHJlYnVpbGQgdGhlIHByZWNvbXBpbGVkIGhlYWRlci4gVGhpcyB3YXksIGlmCisgIC8vLyBidWlsZGluZyB0aGUgcHJlY29tcGlsZWQgcHJlYW1ibGUgZmFpbHMsIHdlIHdvbid0IHRyeSBhZ2FpbiBmb3IKKyAgLy8vIHNvbWUgbnVtYmVyIG9mIGNhbGxzLgorICB1bnNpZ25lZCBQcmVhbWJsZVJlYnVpbGRDb3VudGVyID0gMDsKKworICAvLy8gXGJyaWVmIENhY2hlIHBhaXJzICJmaWxlbmFtZSAtIHNvdXJjZSBsb2NhdGlvbiIKKyAgLy8vCisgIC8vLyBDYWNoZSBjb250YWlucyBvbmx5IHNvdXJjZSBsb2NhdGlvbnMgZnJvbSBwcmVhbWJsZSBzbyBpdCBpcworICAvLy8gZ3VhcmFudGVlZCB0aGF0IHRoZXkgc3RheSB2YWxpZCB3aGVuIHRoZSBTb3VyY2VNYW5hZ2VyIGlzIHJlY3JlYXRlZC4KKyAgLy8vIFRoaXMgY2FjaGUgaXMgdXNlZCB3aGVuIGxvYWRpbmcgcHJlYW1idWxlIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlCisgIC8vLyBvZiB0aGF0IGxvYWRpbmcuIEl0IG11c3QgYmUgY2xlYXJlZCB3aGVuIHByZWFtYmxlIGlzIHJlY3JlYXRlZC4KKyAgbGx2bTo6U3RyaW5nTWFwPFNvdXJjZUxvY2F0aW9uPiBQcmVhbWJsZVNyY0xvY0NhY2hlOworCisgIC8vLyBUaGUgY29udGVudHMgb2YgdGhlIHByZWFtYmxlLgorICBsbHZtOjpPcHRpb25hbDxQcmVjb21waWxlZFByZWFtYmxlPiBQcmVhbWJsZTsKKworICAvLy8gXGJyaWVmIFdoZW4gbm9uLU5VTEwsIHRoaXMgaXMgdGhlIGJ1ZmZlciB1c2VkIHRvIHN0b3JlIHRoZSBjb250ZW50cyBvZgorICAvLy8gdGhlIG1haW4gZmlsZSB3aGVuIGl0IGhhcyBiZWVuIHBhZGRlZCBmb3IgdXNlIHdpdGggdGhlIHByZWNvbXBpbGVkCisgIC8vLyBwcmVhbWJsZS4KKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gU2F2ZWRNYWluRmlsZUJ1ZmZlcjsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2Ygd2FybmluZ3MgdGhhdCBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIHRoZSBwcmVhbWJsZS4KKyAgLy8vCisgIC8vLyBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCB0byByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgXGMgRGlhZ25vc3RpY3NFbmdpbmUKKyAgLy8vIG9iamVjdCB3aGVuIHJlLXVzaW5nIHRoZSBwcmVjb21waWxlZCBwcmVhbWJsZS4gTm90ZSB0aGF0IG9ubHkgdGhlCisgIC8vLyBudW1iZXIgb2Ygd2FybmluZ3MgbWF0dGVycywgc2luY2Ugd2Ugd2lsbCBub3Qgc2F2ZSB0aGUgcHJlYW1ibGUKKyAgLy8vIHdoZW4gYW55IGVycm9ycyBhcmUgcHJlc2VudC4KKyAgdW5zaWduZWQgTnVtV2FybmluZ3NJblByZWFtYmxlID0gMDsKKworICAvLy8gXGJyaWVmIEEgbGlzdCBvZiB0aGUgc2VyaWFsaXphdGlvbiBJRCBudW1iZXJzIGZvciBlYWNoIG9mIHRoZSB0b3AtbGV2ZWwKKyAgLy8vIGRlY2xhcmF0aW9ucyBwYXJzZWQgd2l0aGluIHRoZSBwcmVjb21waWxlZCBwcmVhbWJsZS4KKyAgc3RkOjp2ZWN0b3I8c2VyaWFsaXphdGlvbjo6RGVjbElEPiBUb3BMZXZlbERlY2xzSW5QcmVhbWJsZTsKKyAgCisgIC8vLyBcYnJpZWYgV2hldGhlciB3ZSBzaG91bGQgYmUgY2FjaGluZyBjb2RlLWNvbXBsZXRpb24gcmVzdWx0cy4KKyAgYm9vbCBTaG91bGRDYWNoZUNvZGVDb21wbGV0aW9uUmVzdWx0cyA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRvIGluY2x1ZGUgYnJpZWYgZG9jdW1lbnRhdGlvbiB3aXRoaW4gdGhlIHNldCBvZiBjb2RlCisgIC8vLyBjb21wbGV0aW9ucyBjYWNoZWQuCisgIGJvb2wgSW5jbHVkZUJyaWVmQ29tbWVudHNJbkNvZGVDb21wbGV0aW9uIDogMTsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgbm9uLXN5c3RlbSBzb3VyY2UgZmlsZXMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgdm9sYXRpbGUKKyAgLy8vIChsaWtlbHkgdG8gY2hhbmdlIHdoaWxlIHRyeWluZyB0byB1c2UgdGhlbSkuCisgIGJvb2wgVXNlckZpbGVzQXJlVm9sYXRpbGUgOiAxOworIAorICBzdGF0aWMgdm9pZCBDb25maWd1cmVEaWFncyhJbnRydXNpdmVSZWZDbnRQdHI8RGlhZ25vc3RpY3NFbmdpbmU+IERpYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RVbml0ICZBU1QsIGJvb2wgQ2FwdHVyZURpYWdub3N0aWNzKTsKKworICB2b2lkIFRyYW5zbGF0ZVN0b3JlZERpYWdub3N0aWNzKEZpbGVNYW5hZ2VyICZGaWxlTWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZU1hbmFnZXIgJlNyY01hbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U3RhbmRhbG9uZURpYWdub3N0aWM+ICZEaWFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U3RvcmVkRGlhZ25vc3RpYz4gJk91dCk7CisKKyAgdm9pZCBjbGVhckZpbGVMZXZlbERlY2xzKCk7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBBIGNhY2hlZCBjb2RlLWNvbXBsZXRpb24gcmVzdWx0LCB3aGljaCBtYXkgYmUgaW50cm9kdWNlZCBpbiBvbmUgb2YKKyAgLy8vIG1hbnkgZGlmZmVyZW50IGNvbnRleHRzLgorICBzdHJ1Y3QgQ2FjaGVkQ29kZUNvbXBsZXRpb25SZXN1bHQgeworICAgIC8vLyBcYnJpZWYgVGhlIGNvZGUtY29tcGxldGlvbiBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGlzIGNvbXBsZXRpb24KKyAgICAvLy8gcmVzdWx0LgorICAgIENvZGVDb21wbGV0aW9uU3RyaW5nICpDb21wbGV0aW9uOworICAgIAorICAgIC8vLyBcYnJpZWYgQSBiaXRtYXNrIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGNvZGUtY29tcGxldGlvbiBjb250ZXh0cyBzaG91bGQKKyAgICAvLy8gY29udGFpbiB0aGlzIGNvbXBsZXRpb24gcmVzdWx0LgorICAgIC8vLworICAgIC8vLyBUaGUgYml0cyBpbiB0aGUgYml0bWFzayBjb3JyZXNwb25kIHRvIHRoZSB2YWx1ZXMgb2YKKyAgICAvLy8gQ29kZUNvbXBsZXRlQ29udGV4dDo6S2luZC4gVG8gbWFwIGZyb20gYSBjb21wbGV0aW9uIGNvbnRleHQga2luZCB0byBhCisgICAgLy8vIGJpdCwgc2hpZnQgMSBieSB0aGF0IG51bWJlciBvZiBiaXRzLiBNYW55IGNvbXBsZXRpb25zIGNhbiBvY2N1ciBpbgorICAgIC8vLyBzZXZlcmFsIGRpZmZlcmVudCBjb250ZXh0cy4KKyAgICB1aW50NjRfdCBTaG93SW5Db250ZXh0czsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFRoZSBwcmlvcml0eSBnaXZlbiB0byB0aGlzIGNvZGUtY29tcGxldGlvbiByZXN1bHQuCisgICAgdW5zaWduZWQgUHJpb3JpdHk7CisgICAgCisgICAgLy8vIFxicmllZiBUaGUgbGliY2xhbmcgY3Vyc29yIGtpbmQgY29ycmVzcG9uZGluZyB0byB0aGlzIGNvZGUtY29tcGxldGlvbiAKKyAgICAvLy8gcmVzdWx0LgorICAgIENYQ3Vyc29yS2luZCBLaW5kOworICAgIAorICAgIC8vLyBcYnJpZWYgVGhlIGF2YWlsYWJpbGl0eSBvZiB0aGlzIGNvZGUtY29tcGxldGlvbiByZXN1bHQuCisgICAgQ1hBdmFpbGFiaWxpdHlLaW5kIEF2YWlsYWJpbGl0eTsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFRoZSBzaW1wbGlmaWVkIHR5cGUgY2xhc3MgZm9yIGEgbm9uLW1hY3JvIGNvbXBsZXRpb24gcmVzdWx0LgorICAgIFNpbXBsaWZpZWRUeXBlQ2xhc3MgVHlwZUNsYXNzOworICAgIAorICAgIC8vLyBcYnJpZWYgVGhlIHR5cGUgb2YgYSBub24tbWFjcm8gY29tcGxldGlvbiByZXN1bHQsIHN0b3JlZCBhcyBhIHVuaXF1ZQorICAgIC8vLyBpbnRlZ2VyIHVzZWQgYnkgdGhlIHN0cmluZyBtYXAgb2YgY2FjaGVkIGNvbXBsZXRpb24gdHlwZXMuCisgICAgLy8vCisgICAgLy8vIFRoaXMgdmFsdWUgd2lsbCBiZSB6ZXJvIGlmIHRoZSB0eXBlIGlzIG5vdCBrbm93biwgb3IgYSB1bmlxdWUgdmFsdWUKKyAgICAvLy8gZGV0ZXJtaW5lZCBieSB0aGUgZm9ybWF0dGVkIHR5cGUgc3RyaW5nLiBTZSBcYyBDYWNoZWRDb21wbGV0aW9uVHlwZXMKKyAgICAvLy8gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgdW5zaWduZWQgVHlwZTsKKyAgfTsKKyAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG1hcHBpbmcgZnJvbSBmb3JtYXR0ZWQgdHlwZSBuYW1lcyB0byB1bmlxdWUgdHlwZQorICAvLy8gaWRlbnRpZmllcnMuCisgIGxsdm06OlN0cmluZ01hcDx1bnNpZ25lZD4gJmdldENhY2hlZENvbXBsZXRpb25UeXBlcygpIHsKKyAgICByZXR1cm4gQ2FjaGVkQ29tcGxldGlvblR5cGVzOyAKKyAgfQorICAKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgYWxsb2NhdG9yIHVzZWQgdG8gY2FjaGUgZ2xvYmFsIGNvZGUgY29tcGxldGlvbnMuCisgIHN0ZDo6c2hhcmVkX3B0cjxHbG9iYWxDb2RlQ29tcGxldGlvbkFsbG9jYXRvcj4KKyAgZ2V0Q2FjaGVkQ29tcGxldGlvbkFsbG9jYXRvcigpIHsKKyAgICByZXR1cm4gQ2FjaGVkQ29tcGxldGlvbkFsbG9jYXRvcjsKKyAgfQorCisgIENvZGVDb21wbGV0aW9uVFVJbmZvICZnZXRDb2RlQ29tcGxldGlvblRVSW5mbygpIHsKKyAgICBpZiAoIUNDVFVJbmZvKQorICAgICAgQ0NUVUluZm8gPSBsbHZtOjptYWtlX3VuaXF1ZTxDb2RlQ29tcGxldGlvblRVSW5mbz4oCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxHbG9iYWxDb2RlQ29tcGxldGlvbkFsbG9jYXRvcj4oKSk7CisgICAgcmV0dXJuICpDQ1RVSW5mbzsKKyAgfQorCitwcml2YXRlOgorICAvLy8gXGJyaWVmIEFsbG9jYXRvciB1c2VkIHRvIHN0b3JlIGNhY2hlZCBjb2RlIGNvbXBsZXRpb25zLgorICBzdGQ6OnNoYXJlZF9wdHI8R2xvYmFsQ29kZUNvbXBsZXRpb25BbGxvY2F0b3I+IENhY2hlZENvbXBsZXRpb25BbGxvY2F0b3I7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENvZGVDb21wbGV0aW9uVFVJbmZvPiBDQ1RVSW5mbzsKKworICAvLy8gXGJyaWVmIFRoZSBzZXQgb2YgY2FjaGVkIGNvZGUtY29tcGxldGlvbiByZXN1bHRzLgorICBzdGQ6OnZlY3RvcjxDYWNoZWRDb2RlQ29tcGxldGlvblJlc3VsdD4gQ2FjaGVkQ29tcGxldGlvblJlc3VsdHM7CisgIAorICAvLy8gXGJyaWVmIEEgbWFwcGluZyBmcm9tIHRoZSBmb3JtYXR0ZWQgdHlwZSBuYW1lIHRvIGEgdW5pcXVlIG51bWJlciBmb3IgdGhhdAorICAvLy8gdHlwZSwgd2hpY2ggaXMgdXNlZCBmb3IgdHlwZSBlcXVhbGl0eSBjb21wYXJpc29ucy4KKyAgbGx2bTo6U3RyaW5nTWFwPHVuc2lnbmVkPiBDYWNoZWRDb21wbGV0aW9uVHlwZXM7CisgIAorICAvLy8gXGJyaWVmIEEgc3RyaW5nIGhhc2ggb2YgdGhlIHRvcC1sZXZlbCBkZWNsYXJhdGlvbiBhbmQgbWFjcm8gZGVmaW5pdGlvbiAKKyAgLy8vIG5hbWVzIHByb2Nlc3NlZCB0aGUgbGFzdCB0aW1lIHRoYXQgd2UgcmVwYXJzZWQgdGhlIGZpbGUuCisgIC8vLworICAvLy8gVGhpcyBoYXNoIHZhbHVlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gd2UgbmVlZCB0byByZWZyZXNoIHRoZSAKKyAgLy8vIGdsb2JhbCBjb2RlLWNvbXBsZXRpb24gY2FjaGUuCisgIHVuc2lnbmVkIENvbXBsZXRpb25DYWNoZVRvcExldmVsSGFzaFZhbHVlID0gMDsKKworICAvLy8gXGJyaWVmIEEgc3RyaW5nIGhhc2ggb2YgdGhlIHRvcC1sZXZlbCBkZWNsYXJhdGlvbiBhbmQgbWFjcm8gZGVmaW5pdGlvbiAKKyAgLy8vIG5hbWVzIHByb2Nlc3NlZCB0aGUgbGFzdCB0aW1lIHRoYXQgd2UgcmVwYXJzZWQgdGhlIHByZWNvbXBpbGVkIHByZWFtYmxlLgorICAvLy8KKyAgLy8vIFRoaXMgaGFzaCB2YWx1ZSBpcyB1c2VkIHRvIGRldGVybWluZSB3aGVuIHdlIG5lZWQgdG8gcmVmcmVzaCB0aGUgCisgIC8vLyBnbG9iYWwgY29kZS1jb21wbGV0aW9uIGNhY2hlIGFmdGVyIGEgcmVidWlsZCBvZiB0aGUgcHJlY29tcGlsZWQgcHJlYW1ibGUuCisgIHVuc2lnbmVkIFByZWFtYmxlVG9wTGV2ZWxIYXNoVmFsdWUgPSAwOworCisgIC8vLyBcYnJpZWYgVGhlIGN1cnJlbnQgaGFzaCB2YWx1ZSBmb3IgdGhlIHRvcC1sZXZlbCBkZWNsYXJhdGlvbiBhbmQgbWFjcm8KKyAgLy8vIGRlZmluaXRpb24gbmFtZXMKKyAgdW5zaWduZWQgQ3VycmVudFRvcExldmVsSGFzaFZhbHVlID0gMDsKKyAgCisgIC8vLyBcYnJpZWYgQml0IHVzZWQgYnkgQ0luZGV4IHRvIG1hcmsgd2hlbiBhIHRyYW5zbGF0aW9uIHVuaXQgbWF5IGJlIGluIGFuCisgIC8vLyBpbmNvbnNpc3RlbnQgc3RhdGUsIGFuZCBpcyBub3Qgc2FmZSB0byBmcmVlLgorICB1bnNpZ25lZCBVbnNhZmVUb0ZyZWUgOiAxOworCisgIC8vLyBcYnJpZWYgQ2FjaGUgYW55ICJnbG9iYWwiIGNvZGUtY29tcGxldGlvbiByZXN1bHRzLCBzbyB0aGF0IHdlIGNhbiBhdm9pZAorICAvLy8gcmVjb21wdXRpbmcgdGhlbSB3aXRoIGVhY2ggY29tcGxldGlvbi4KKyAgdm9pZCBDYWNoZUNvZGVDb21wbGV0aW9uUmVzdWx0cygpOworICAKKyAgLy8vIFxicmllZiBDbGVhciBvdXQgYW5kIGRlYWxsb2NhdGUgCisgIHZvaWQgQ2xlYXJDYWNoZWRDb21wbGV0aW9uUmVzdWx0cygpOworICAKKyAgZXhwbGljaXQgQVNUVW5pdChib29sIE1haW5GaWxlSXNBU1QpOworCisgIGJvb2wgUGFyc2Uoc3RkOjpzaGFyZWRfcHRyPFBDSENvbnRhaW5lck9wZXJhdGlvbnM+IFBDSENvbnRhaW5lck9wcywKKyAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBPdmVycmlkZU1haW5CdWZmZXIsCisgICAgICAgICAgICAgSW50cnVzaXZlUmVmQ250UHRyPHZmczo6RmlsZVN5c3RlbT4gVkZTKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBnZXRNYWluQnVmZmVyV2l0aFByZWNvbXBpbGVkUHJlYW1ibGUoCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8UENIQ29udGFpbmVyT3BlcmF0aW9ucz4gUENIQ29udGFpbmVyT3BzLAorICAgICAgY29uc3QgQ29tcGlsZXJJbnZvY2F0aW9uICZQcmVhbWJsZUludm9jYXRpb25JbiwKKyAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjx2ZnM6OkZpbGVTeXN0ZW0+IFZGUywgYm9vbCBBbGxvd1JlYnVpbGQgPSB0cnVlLAorICAgICAgdW5zaWduZWQgTWF4TGluZXMgPSAwKTsKKyAgdm9pZCBSZWFsaXplVG9wTGV2ZWxEZWNsc0Zyb21QcmVhbWJsZSgpOworCisgIC8vLyBcYnJpZWYgVHJhbnNmZXJzIG93bmVyc2hpcCBvZiB0aGUgb2JqZWN0cyAobGlrZSBTb3VyY2VNYW5hZ2VyKSBmcm9tCisgIC8vLyBccGFyYW0gQ0kgdG8gdGhpcyBBU1RVbml0LgorICB2b2lkIHRyYW5zZmVyQVNURGF0YUZyb21Db21waWxlckluc3RhbmNlKENvbXBpbGVySW5zdGFuY2UgJkNJKTsKKworICAvLy8gXGJyaWVmIEFsbG93cyB1cyB0byBhc3NlcnQgdGhhdCBBU1RVbml0IGlzIG5vdCBiZWluZyB1c2VkIGNvbmN1cnJlbnRseSwKKyAgLy8vIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQuCisgIC8vLworICAvLy8gQ2xpZW50cyBzaG91bGQgY3JlYXRlIGluc3RhbmNlcyBvZiB0aGUgQ29uY3VycmVuY3lDaGVjayBjbGFzcyB3aGVuZXZlcgorICAvLy8gdXNpbmcgdGhlIEFTVFVuaXQgaW4gYSB3YXkgdGhhdCBpc24ndCBpbnRlbmRlZCB0byBiZSBjb25jdXJyZW50LCB3aGljaCBpcworICAvLy8ganVzdCBhYm91dCBhbnkgdXNhZ2UuCisgIC8vLyBCZWNvbWVzIGEgbm9vcCBpbiByZWxlYXNlIG1vZGU7IG9ubHkgdXNlZnVsIGZvciBkZWJ1ZyBtb2RlIGNoZWNraW5nLgorICBjbGFzcyBDb25jdXJyZW5jeVN0YXRlIHsKKyAgICB2b2lkICpNdXRleDsgLy8gYSBsbHZtOjpzeXM6Ok11dGV4SW1wbCBpbiBkZWJ1ZzsKKworICBwdWJsaWM6CisgICAgQ29uY3VycmVuY3lTdGF0ZSgpOworICAgIH5Db25jdXJyZW5jeVN0YXRlKCk7CisKKyAgICB2b2lkIHN0YXJ0KCk7CisgICAgdm9pZCBmaW5pc2goKTsKKyAgfTsKKyAgQ29uY3VycmVuY3lTdGF0ZSBDb25jdXJyZW5jeUNoZWNrVmFsdWU7CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIENvbmN1cnJlbmN5Q2hlY2s7CisKKyAgY2xhc3MgQ29uY3VycmVuY3lDaGVjayB7CisgICAgQVNUVW5pdCAmU2VsZjsKKyAgICAKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IENvbmN1cnJlbmN5Q2hlY2soQVNUVW5pdCAmU2VsZikgOiBTZWxmKFNlbGYpIHsgCisgICAgICBTZWxmLkNvbmN1cnJlbmN5Q2hlY2tWYWx1ZS5zdGFydCgpOworICAgIH0KKworICAgIH5Db25jdXJyZW5jeUNoZWNrKCkgeworICAgICAgU2VsZi5Db25jdXJyZW5jeUNoZWNrVmFsdWUuZmluaXNoKCk7CisgICAgfQorICB9OworCisgIEFTVFVuaXQoY29uc3QgQVNUVW5pdCAmKSA9IGRlbGV0ZTsKKyAgQVNUVW5pdCAmb3BlcmF0b3I9KGNvbnN0IEFTVFVuaXQgJikgPSBkZWxldGU7CisgIH5BU1RVbml0KCk7CisKKyAgYm9vbCBpc01haW5GaWxlQVNUKCkgY29uc3QgeyByZXR1cm4gTWFpbkZpbGVJc0FTVDsgfQorCisgIGJvb2wgaXNVbnNhZmVUb0ZyZWUoKSBjb25zdCB7IHJldHVybiBVbnNhZmVUb0ZyZWU7IH0KKyAgdm9pZCBzZXRVbnNhZmVUb0ZyZWUoYm9vbCBWYWx1ZSkgeyBVbnNhZmVUb0ZyZWUgPSBWYWx1ZTsgfQorCisgIGNvbnN0IERpYWdub3N0aWNzRW5naW5lICZnZXREaWFnbm9zdGljcygpIGNvbnN0IHsgcmV0dXJuICpEaWFnbm9zdGljczsgfQorICBEaWFnbm9zdGljc0VuZ2luZSAmZ2V0RGlhZ25vc3RpY3MoKSB7IHJldHVybiAqRGlhZ25vc3RpY3M7IH0KKyAgCisgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJmdldFNvdXJjZU1hbmFnZXIoKSBjb25zdCB7IHJldHVybiAqU291cmNlTWdyOyB9CisgIFNvdXJjZU1hbmFnZXIgJmdldFNvdXJjZU1hbmFnZXIoKSB7IHJldHVybiAqU291cmNlTWdyOyB9CisKKyAgY29uc3QgUHJlcHJvY2Vzc29yICZnZXRQcmVwcm9jZXNzb3IoKSBjb25zdCB7IHJldHVybiAqUFA7IH0KKyAgUHJlcHJvY2Vzc29yICZnZXRQcmVwcm9jZXNzb3IoKSB7IHJldHVybiAqUFA7IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFByZXByb2Nlc3Nvcj4gZ2V0UHJlcHJvY2Vzc29yUHRyKCkgY29uc3QgeyByZXR1cm4gUFA7IH0KKworICBjb25zdCBBU1RDb250ZXh0ICZnZXRBU1RDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gKkN0eDsgfQorICBBU1RDb250ZXh0ICZnZXRBU1RDb250ZXh0KCkgeyByZXR1cm4gKkN0eDsgfQorCisgIHZvaWQgc2V0QVNUQ29udGV4dChBU1RDb250ZXh0ICpjdHgpIHsgQ3R4ID0gY3R4OyB9CisgIHZvaWQgc2V0UHJlcHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxQcmVwcm9jZXNzb3I+IHBwKTsKKworICBib29sIGhhc1NlbWEoKSBjb25zdCB7IHJldHVybiAoYm9vbClUaGVTZW1hOyB9CisKKyAgU2VtYSAmZ2V0U2VtYSgpIGNvbnN0IHsgCisgICAgYXNzZXJ0KFRoZVNlbWEgJiYgIkFTVFVuaXQgZG9lcyBub3QgaGF2ZSBhIFNlbWEgb2JqZWN0ISIpOworICAgIHJldHVybiAqVGhlU2VtYTsKKyAgfQorCisgIGNvbnN0IExhbmdPcHRpb25zICZnZXRMYW5nT3B0cygpIGNvbnN0IHsKKyAgICBhc3NlcnQoTGFuZ09wdHMgJiYgIkFTVFVuaXQgZG9lcyBub3QgaGF2ZSBsYW5ndWFnZSBvcHRpb25zIik7CisgICAgcmV0dXJuICpMYW5nT3B0czsKKyAgfQorCisgIGNvbnN0IEhlYWRlclNlYXJjaE9wdGlvbnMgJmdldEhlYWRlclNlYXJjaE9wdHMoKSBjb25zdCB7CisgICAgYXNzZXJ0KEhTT3B0cyAmJiAiQVNUVW5pdCBkb2VzIG5vdCBoYXZlIGhlYWRlciBzZWFyY2ggb3B0aW9ucyIpOworICAgIHJldHVybiAqSFNPcHRzOworICB9CisgIAorICBjb25zdCBQcmVwcm9jZXNzb3JPcHRpb25zICZnZXRQcmVwcm9jZXNzb3JPcHRzKCkgY29uc3QgeworICAgIGFzc2VydChQUE9wdHMgJiYgIkFTVFVuaXQgZG9lcyBub3QgaGF2ZSBwcmVwcm9jZXNzb3Igb3B0aW9ucyIpOworICAgIHJldHVybiAqUFBPcHRzOworICB9CisgIAorICBjb25zdCBGaWxlTWFuYWdlciAmZ2V0RmlsZU1hbmFnZXIoKSBjb25zdCB7IHJldHVybiAqRmlsZU1ncjsgfQorICBGaWxlTWFuYWdlciAmZ2V0RmlsZU1hbmFnZXIoKSB7IHJldHVybiAqRmlsZU1ncjsgfQorCisgIGNvbnN0IEZpbGVTeXN0ZW1PcHRpb25zICZnZXRGaWxlU3lzdGVtT3B0cygpIGNvbnN0IHsgcmV0dXJuIEZpbGVTeXN0ZW1PcHRzOyB9CisKKyAgSW50cnVzaXZlUmVmQ250UHRyPEFTVFJlYWRlcj4gZ2V0QVNUUmVhZGVyKCkgY29uc3Q7CisKKyAgU3RyaW5nUmVmIGdldE9yaWdpbmFsU291cmNlRmlsZU5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIE9yaWdpbmFsU291cmNlRmlsZTsKKyAgfQorCisgIEFTVE11dGF0aW9uTGlzdGVuZXIgKmdldEFTVE11dGF0aW9uTGlzdGVuZXIoKTsKKyAgQVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXIgKmdldERlc2VyaWFsaXphdGlvbkxpc3RlbmVyKCk7CisKKyAgYm9vbCBnZXRPbmx5TG9jYWxEZWNscygpIGNvbnN0IHsgcmV0dXJuIE9ubHlMb2NhbERlY2xzOyB9CisKKyAgYm9vbCBnZXRPd25zUmVtYXBwZWRGaWxlQnVmZmVycygpIGNvbnN0IHsgcmV0dXJuIE93bnNSZW1hcHBlZEZpbGVCdWZmZXJzOyB9CisgIHZvaWQgc2V0T3duc1JlbWFwcGVkRmlsZUJ1ZmZlcnMoYm9vbCB2YWwpIHsgT3duc1JlbWFwcGVkRmlsZUJ1ZmZlcnMgPSB2YWw7IH0KKworICBTdHJpbmdSZWYgZ2V0TWFpbkZpbGVOYW1lKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJZiB0aGlzIEFTVFVuaXQgY2FtZSBmcm9tIGFuIEFTVCBmaWxlLCByZXR1cm5zIHRoZSBmaWxlbmFtZSBmb3IgaXQuCisgIFN0cmluZ1JlZiBnZXRBU1RGaWxlTmFtZSgpIGNvbnN0OworCisgIHVzaW5nIHRvcF9sZXZlbF9pdGVyYXRvciA9IHN0ZDo6dmVjdG9yPERlY2wgKj46Oml0ZXJhdG9yOworCisgIHRvcF9sZXZlbF9pdGVyYXRvciB0b3BfbGV2ZWxfYmVnaW4oKSB7CisgICAgYXNzZXJ0KCFpc01haW5GaWxlQVNUKCkgJiYgIkludmFsaWQgY2FsbCBmb3IgQVNUIGJhc2VkIEFTVFVuaXQhIik7CisgICAgaWYgKCFUb3BMZXZlbERlY2xzSW5QcmVhbWJsZS5lbXB0eSgpKQorICAgICAgUmVhbGl6ZVRvcExldmVsRGVjbHNGcm9tUHJlYW1ibGUoKTsKKyAgICByZXR1cm4gVG9wTGV2ZWxEZWNscy5iZWdpbigpOworICB9CisKKyAgdG9wX2xldmVsX2l0ZXJhdG9yIHRvcF9sZXZlbF9lbmQoKSB7CisgICAgYXNzZXJ0KCFpc01haW5GaWxlQVNUKCkgJiYgIkludmFsaWQgY2FsbCBmb3IgQVNUIGJhc2VkIEFTVFVuaXQhIik7CisgICAgaWYgKCFUb3BMZXZlbERlY2xzSW5QcmVhbWJsZS5lbXB0eSgpKQorICAgICAgUmVhbGl6ZVRvcExldmVsRGVjbHNGcm9tUHJlYW1ibGUoKTsKKyAgICByZXR1cm4gVG9wTGV2ZWxEZWNscy5lbmQoKTsKKyAgfQorCisgIHN0ZDo6c2l6ZV90IHRvcF9sZXZlbF9zaXplKCkgY29uc3QgeworICAgIGFzc2VydCghaXNNYWluRmlsZUFTVCgpICYmICJJbnZhbGlkIGNhbGwgZm9yIEFTVCBiYXNlZCBBU1RVbml0ISIpOworICAgIHJldHVybiBUb3BMZXZlbERlY2xzSW5QcmVhbWJsZS5zaXplKCkgKyBUb3BMZXZlbERlY2xzLnNpemUoKTsKKyAgfQorCisgIGJvb2wgdG9wX2xldmVsX2VtcHR5KCkgY29uc3QgeworICAgIGFzc2VydCghaXNNYWluRmlsZUFTVCgpICYmICJJbnZhbGlkIGNhbGwgZm9yIEFTVCBiYXNlZCBBU1RVbml0ISIpOworICAgIHJldHVybiBUb3BMZXZlbERlY2xzSW5QcmVhbWJsZS5lbXB0eSgpICYmIFRvcExldmVsRGVjbHMuZW1wdHkoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IHRvcC1sZXZlbCBkZWNsYXJhdGlvbi4KKyAgdm9pZCBhZGRUb3BMZXZlbERlY2woRGVjbCAqRCkgeworICAgIFRvcExldmVsRGVjbHMucHVzaF9iYWNrKEQpOworICB9CisKKyAgLy8vIFxicmllZiBBZGQgYSBuZXcgbG9jYWwgZmlsZS1sZXZlbCBkZWNsYXJhdGlvbi4KKyAgdm9pZCBhZGRGaWxlTGV2ZWxEZWNsKERlY2wgKkQpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBkZWNscyB0aGF0IGFyZSBjb250YWluZWQgaW4gYSBmaWxlIGluIHRoZSBPZmZzZXQvTGVuZ3RoCisgIC8vLyByYW5nZS4gXHAgTGVuZ3RoIGNhbiBiZSAwIHRvIGluZGljYXRlIGEgcG9pbnQgYXQgXHAgT2Zmc2V0IGluc3RlYWQgb2YKKyAgLy8vIGEgcmFuZ2UuIAorICB2b2lkIGZpbmRGaWxlUmVnaW9uRGVjbHMoRmlsZUlEIEZpbGUsIHVuc2lnbmVkIE9mZnNldCwgdW5zaWduZWQgTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPERlY2wgKj4gJkRlY2xzKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHRvcC1sZXZlbCBuYW1lIGhhc2ggdmFsdWUuCisgIC8vLworICAvLy8gTm90ZTogVGhpcyBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIHRvcC1sZXZlbCB0cmFja2luZyBhY3Rpb24KKyAgdW5zaWduZWQgJmdldEN1cnJlbnRUb3BMZXZlbEhhc2hWYWx1ZSgpIHsgcmV0dXJuIEN1cnJlbnRUb3BMZXZlbEhhc2hWYWx1ZTsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBzb3VyY2UgbG9jYXRpb24gZm9yIHRoZSBnaXZlbiBmaWxlOmxpbmU6Y29sIHRyaXBsZXQuCisgIC8vLworICAvLy8gVGhlIGRpZmZlcmVuY2Ugd2l0aCBTb3VyY2VNYW5hZ2VyOjpnZXRMb2NhdGlvbiBpcyB0aGF0IHRoaXMgbWV0aG9kIGNoZWNrcworICAvLy8gd2hldGhlciB0aGUgcmVxdWVzdGVkIGxvY2F0aW9uIHBvaW50cyBpbnNpZGUgdGhlIHByZWNvbXBpbGVkIHByZWFtYmxlCisgIC8vLyBpbiB3aGljaCBjYXNlIHRoZSByZXR1cm5lZCBzb3VyY2UgbG9jYXRpb24gd2lsbCBiZSBhICJsb2FkZWQiIG9uZS4KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jYXRpb24oY29uc3QgRmlsZUVudHJ5ICpGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lLCB1bnNpZ25lZCBDb2wpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBzb3VyY2UgbG9jYXRpb24gZm9yIHRoZSBnaXZlbiBmaWxlOm9mZnNldCBwYWlyLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NhdGlvbihjb25zdCBGaWxlRW50cnkgKkZpbGUsIHVuc2lnbmVkIE9mZnNldCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJZiBccCBMb2MgaXMgYSBsb2FkZWQgbG9jYXRpb24gZnJvbSB0aGUgcHJlYW1ibGUsIHJldHVybnMKKyAgLy8vIHRoZSBjb3JyZXNwb25kaW5nIGxvY2FsIGxvY2F0aW9uIG9mIHRoZSBtYWluIGZpbGUsIG90aGVyd2lzZSBpdCByZXR1cm5zCisgIC8vLyBccCBMb2MuCisgIFNvdXJjZUxvY2F0aW9uIG1hcExvY2F0aW9uRnJvbVByZWFtYmxlKFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJZiBccCBMb2MgaXMgYSBsb2NhbCBsb2NhdGlvbiBvZiB0aGUgbWFpbiBmaWxlIGJ1dCBpbnNpZGUgdGhlCisgIC8vLyBwcmVhbWJsZSBjaHVuaywgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBsb2FkZWQgbG9jYXRpb24gZnJvbSB0aGUKKyAgLy8vIHByZWFtYmxlLCBvdGhlcndpc2UgaXQgcmV0dXJucyBccCBMb2MuCisgIFNvdXJjZUxvY2F0aW9uIG1hcExvY2F0aW9uVG9QcmVhbWJsZShTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0OworCisgIGJvb2wgaXNJblByZWFtYmxlRmlsZUlEKFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3Q7CisgIGJvb2wgaXNJbk1haW5GaWxlSUQoU291cmNlTG9jYXRpb24gTG9jKSBjb25zdDsKKyAgU291cmNlTG9jYXRpb24gZ2V0U3RhcnRPZk1haW5GaWxlSUQoKSBjb25zdDsKKyAgU291cmNlTG9jYXRpb24gZ2V0RW5kT2ZQcmVhbWJsZUZpbGVJRCgpIGNvbnN0OworCisgIC8vLyBcc2VlIG1hcExvY2F0aW9uRnJvbVByZWFtYmxlLgorICBTb3VyY2VSYW5nZSBtYXBSYW5nZUZyb21QcmVhbWJsZShTb3VyY2VSYW5nZSBSKSBjb25zdCB7CisgICAgcmV0dXJuIFNvdXJjZVJhbmdlKG1hcExvY2F0aW9uRnJvbVByZWFtYmxlKFIuZ2V0QmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgIG1hcExvY2F0aW9uRnJvbVByZWFtYmxlKFIuZ2V0RW5kKCkpKTsKKyAgfQorCisgIC8vLyBcc2VlIG1hcExvY2F0aW9uVG9QcmVhbWJsZS4KKyAgU291cmNlUmFuZ2UgbWFwUmFuZ2VUb1ByZWFtYmxlKFNvdXJjZVJhbmdlIFIpIGNvbnN0IHsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UobWFwTG9jYXRpb25Ub1ByZWFtYmxlKFIuZ2V0QmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgIG1hcExvY2F0aW9uVG9QcmVhbWJsZShSLmdldEVuZCgpKSk7CisgIH0KKyAgCisgIC8vIFJldHJpZXZlIHRoZSBkaWFnbm9zdGljcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBBU1QKKyAgdXNpbmcgc3RvcmVkX2RpYWdfaXRlcmF0b3IgPSBTdG9yZWREaWFnbm9zdGljICo7CisgIHVzaW5nIHN0b3JlZF9kaWFnX2NvbnN0X2l0ZXJhdG9yID0gY29uc3QgU3RvcmVkRGlhZ25vc3RpYyAqOworCisgIHN0b3JlZF9kaWFnX2NvbnN0X2l0ZXJhdG9yIHN0b3JlZF9kaWFnX2JlZ2luKCkgY29uc3QgeyAKKyAgICByZXR1cm4gU3RvcmVkRGlhZ25vc3RpY3MuYmVnaW4oKTsgCisgIH0KKworICBzdG9yZWRfZGlhZ19pdGVyYXRvciBzdG9yZWRfZGlhZ19iZWdpbigpIHsgCisgICAgcmV0dXJuIFN0b3JlZERpYWdub3N0aWNzLmJlZ2luKCk7IAorICB9CisKKyAgc3RvcmVkX2RpYWdfY29uc3RfaXRlcmF0b3Igc3RvcmVkX2RpYWdfZW5kKCkgY29uc3QgeyAKKyAgICByZXR1cm4gU3RvcmVkRGlhZ25vc3RpY3MuZW5kKCk7IAorICB9CisKKyAgc3RvcmVkX2RpYWdfaXRlcmF0b3Igc3RvcmVkX2RpYWdfZW5kKCkgeyAKKyAgICByZXR1cm4gU3RvcmVkRGlhZ25vc3RpY3MuZW5kKCk7IAorICB9CisKKyAgdW5zaWduZWQgc3RvcmVkX2RpYWdfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFN0b3JlZERpYWdub3N0aWNzLnNpemUoKTsgfQorCisgIHN0b3JlZF9kaWFnX2l0ZXJhdG9yIHN0b3JlZF9kaWFnX2FmdGVyRHJpdmVyX2JlZ2luKCkgeworICAgIGlmIChOdW1TdG9yZWREaWFnbm9zdGljc0Zyb21Ecml2ZXIgPiBTdG9yZWREaWFnbm9zdGljcy5zaXplKCkpCisgICAgICBOdW1TdG9yZWREaWFnbm9zdGljc0Zyb21Ecml2ZXIgPSAwOworICAgIHJldHVybiBTdG9yZWREaWFnbm9zdGljcy5iZWdpbigpICsgTnVtU3RvcmVkRGlhZ25vc3RpY3NGcm9tRHJpdmVyOyAKKyAgfQorCisgIHVzaW5nIGNhY2hlZF9jb21wbGV0aW9uX2l0ZXJhdG9yID0KKyAgICAgIHN0ZDo6dmVjdG9yPENhY2hlZENvZGVDb21wbGV0aW9uUmVzdWx0Pjo6aXRlcmF0b3I7CisgIAorICBjYWNoZWRfY29tcGxldGlvbl9pdGVyYXRvciBjYWNoZWRfY29tcGxldGlvbl9iZWdpbigpIHsKKyAgICByZXR1cm4gQ2FjaGVkQ29tcGxldGlvblJlc3VsdHMuYmVnaW4oKTsKKyAgfQorCisgIGNhY2hlZF9jb21wbGV0aW9uX2l0ZXJhdG9yIGNhY2hlZF9jb21wbGV0aW9uX2VuZCgpIHsKKyAgICByZXR1cm4gQ2FjaGVkQ29tcGxldGlvblJlc3VsdHMuZW5kKCk7CisgIH0KKworICB1bnNpZ25lZCBjYWNoZWRfY29tcGxldGlvbl9zaXplKCkgY29uc3QgeyAKKyAgICByZXR1cm4gQ2FjaGVkQ29tcGxldGlvblJlc3VsdHMuc2l6ZSgpOyAKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhbiBpdGVyYXRvciByYW5nZSBmb3IgdGhlIGxvY2FsIHByZXByb2Nlc3NpbmcgZW50aXRpZXMKKyAgLy8vIG9mIHRoZSBsb2NhbCBQcmVwcm9jZXNzb3IsIGlmIHRoaXMgaXMgYSBwYXJzZWQgc291cmNlIGZpbGUsIG9yIHRoZSBsb2FkZWQKKyAgLy8vIHByZXByb2Nlc3NpbmcgZW50aXRpZXMgb2YgdGhlIHByaW1hcnkgbW9kdWxlIGlmIHRoaXMgaXMgYW4gQVNUIGZpbGUuCisgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPFByZXByb2Nlc3NpbmdSZWNvcmQ6Oml0ZXJhdG9yPgorICBnZXRMb2NhbFByZXByb2Nlc3NpbmdFbnRpdGllcygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVHlwZSBmb3IgYSBmdW5jdGlvbiBpdGVyYXRpbmcgb3ZlciBhIG51bWJlciBvZiBkZWNsYXJhdGlvbnMuCisgIC8vLyBccmV0dXJucyB0cnVlIHRvIGNvbnRpbnVlIGl0ZXJhdGlvbiBhbmQgZmFsc2UgdG8gYWJvcnQuCisgIHVzaW5nIERlY2xWaXNpdG9yRm4gPSBib29sICgqKSh2b2lkICpjb250ZXh0LCBjb25zdCBEZWNsICpEKTsKKworICAvLy8gXGJyaWVmIEl0ZXJhdGUgb3ZlciBsb2NhbCBkZWNsYXJhdGlvbnMgKGxvY2FsbHkgcGFyc2VkIGlmIHRoaXMgaXMgYSBwYXJzZWQKKyAgLy8vIHNvdXJjZSBmaWxlIG9yIHRoZSBsb2FkZWQgZGVjbGFyYXRpb25zIG9mIHRoZSBwcmltYXJ5IG1vZHVsZSBpZiB0aGlzIGlzIGFuCisgIC8vLyBBU1QgZmlsZSkuCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZSBpdGVyYXRpb24gd2FzIGNvbXBsZXRlIG9yIGZhbHNlIGlmIGl0IHdhcyBhYm9ydGVkLgorICBib29sIHZpc2l0TG9jYWxUb3BMZXZlbERlY2xzKHZvaWQgKmNvbnRleHQsIERlY2xWaXNpdG9yRm4gRm4pOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBQQ0ggZmlsZSBpZiBvbmUgd2FzIGluY2x1ZGVkLgorICBjb25zdCBGaWxlRW50cnkgKmdldFBDSEZpbGUoKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgQVNUVW5pdCB3YXMgY29uc3RydWN0ZWQgZnJvbSBhIHNlcmlhbGl6ZWQKKyAgLy8vIG1vZHVsZSBmaWxlLgorICBib29sIGlzTW9kdWxlRmlsZSgpIGNvbnN0OworCisgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+CisgIGdldEJ1ZmZlckZvckZpbGUoU3RyaW5nUmVmIEZpbGVuYW1lLCBzdGQ6OnN0cmluZyAqRXJyb3JTdHIgPSBudWxscHRyKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGF0IGtpbmQgb2YgdHJhbnNsYXRpb24gdW5pdCB0aGlzIEFTVCByZXByZXNlbnRzLgorICBUcmFuc2xhdGlvblVuaXRLaW5kIGdldFRyYW5zbGF0aW9uVW5pdEtpbmQoKSBjb25zdCB7IHJldHVybiBUVUtpbmQ7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgaW5wdXQga2luZCB0aGlzIEFTVCB1bml0IHJlcHJlc2VudHMuCisgIElucHV0S2luZCBnZXRJbnB1dEtpbmQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEEgbWFwcGluZyBmcm9tIGEgZmlsZSBuYW1lIHRvIHRoZSBtZW1vcnkgYnVmZmVyIHRoYXQgc3RvcmVzIHRoZQorICAvLy8gcmVtYXBwZWQgY29udGVudHMgb2YgdGhhdCBmaWxlLgorICB1c2luZyBSZW1hcHBlZEZpbGUgPSBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGxsdm06Ok1lbW9yeUJ1ZmZlciAqPjsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIEFTVFVuaXQuIEdldHMgb3duZXJzaGlwIG9mIHRoZSBwYXNzZWQgQ29tcGlsZXJJbnZvY2F0aW9uLgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEFTVFVuaXQ+CisgIGNyZWF0ZShzdGQ6OnNoYXJlZF9wdHI8Q29tcGlsZXJJbnZvY2F0aW9uPiBDSSwKKyAgICAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljc0VuZ2luZT4gRGlhZ3MsIGJvb2wgQ2FwdHVyZURpYWdub3N0aWNzLAorICAgICAgICAgYm9vbCBVc2VyRmlsZXNBcmVWb2xhdGlsZSk7CisKKyAgZW51bSBXaGF0VG9Mb2FkIHsKKyAgICAvLy8gTG9hZCBvcHRpb25zIGFuZCB0aGUgcHJlcHJvY2Vzc29yIHN0YXRlLgorICAgIExvYWRQcmVwcm9jZXNzb3JPbmx5LAorCisgICAgLy8vIExvYWQgdGhlIEFTVCwgYnV0IGRvIG5vdCByZXN0b3JlIFNlbWEgc3RhdGUuCisgICAgTG9hZEFTVE9ubHksCisKKyAgICAvLy8gTG9hZCBldmVyeXRoaW5nLCBpbmNsdWRpbmcgU2VtYS4KKyAgICBMb2FkRXZlcnl0aGluZworICB9OworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgQVNUVW5pdCBmcm9tIGFuIEFTVCBmaWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBGaWxlbmFtZSAtIFRoZSBBU1QgZmlsZSB0byBsb2FkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBQQ0hDb250YWluZXJSZHIgLSBUaGUgUENIQ29udGFpbmVyT3BlcmF0aW9ucyB0byB1c2UgZm9yIGxvYWRpbmcgYW5kCisgIC8vLyBjcmVhdGluZyBtb2R1bGVzLgorICAvLy8gXHBhcmFtIERpYWdzIC0gVGhlIGRpYWdub3N0aWNzIGVuZ2luZSB0byB1c2UgZm9yIHJlcG9ydGluZyBlcnJvcnM7IGl0cworICAvLy8gbGlmZXRpbWUgaXMgZXhwZWN0ZWQgdG8gZXh0ZW5kIHBhc3QgdGhhdCBvZiB0aGUgcmV0dXJuZWQgQVNUVW5pdC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyAtIFRoZSBpbml0aWFsaXplZCBBU1RVbml0IG9yIG51bGwgaWYgdGhlIEFTVCBmYWlsZWQgdG8gbG9hZC4KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBU1RVbml0PiBMb2FkRnJvbUFTVEZpbGUoCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRmlsZW5hbWUsIGNvbnN0IFBDSENvbnRhaW5lclJlYWRlciAmUENIQ29udGFpbmVyUmRyLAorICAgICAgV2hhdFRvTG9hZCBUb0xvYWQsIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljc0VuZ2luZT4gRGlhZ3MsCisgICAgICBjb25zdCBGaWxlU3lzdGVtT3B0aW9ucyAmRmlsZVN5c3RlbU9wdHMsIGJvb2wgVXNlRGVidWdJbmZvID0gZmFsc2UsCisgICAgICBib29sIE9ubHlMb2NhbERlY2xzID0gZmFsc2UsIEFycmF5UmVmPFJlbWFwcGVkRmlsZT4gUmVtYXBwZWRGaWxlcyA9IE5vbmUsCisgICAgICBib29sIENhcHR1cmVEaWFnbm9zdGljcyA9IGZhbHNlLCBib29sIEFsbG93UENIV2l0aENvbXBpbGVyRXJyb3JzID0gZmFsc2UsCisgICAgICBib29sIFVzZXJGaWxlc0FyZVZvbGF0aWxlID0gZmFsc2UpOworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIEhlbHBlciBmdW5jdGlvbiBmb3IgXGMgTG9hZEZyb21Db21waWxlckludm9jYXRpb24oKSBhbmQKKyAgLy8vIFxjIExvYWRGcm9tQ29tbWFuZExpbmUoKSwgd2hpY2ggbG9hZHMgYW4gQVNUIGZyb20gYSBjb21waWxlciBpbnZvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBQcmVjb21waWxlUHJlYW1ibGVBZnRlck5QYXJzZXMgQWZ0ZXIgaG93IG1hbnkgcGFyc2VzIHRoZSBwcmVhbWJsZQorICAvLy8gb2YgdGhpcyB0cmFuc2xhdGlvbiB1bml0IHNob3VsZCBiZSBwcmVjb21waWxlZCwgdG8gaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2UKKyAgLy8vIG9mIHJlcGFyc2luZy4gU2V0IHRvIHplcm8gdG8gZGlzYWJsZSBwcmVhbWJsZXMuCisgIC8vLworICAvLy8gXHBhcmFtIFZGUyAtIEEgdmZzOjpGaWxlU3lzdGVtIHRvIGJlIHVzZWQgZm9yIGFsbCBmaWxlIGFjY2Vzc2VzLiBOb3RlIHRoYXQKKyAgLy8vIHByZWFtYmxlIGlzIHNhdmVkIHRvIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBvbiBhIFJlYWxGaWxlU3lzdGVtLCBzbyBpbiBvcmRlcgorICAvLy8gZm9yIGl0IHRvIGJlIGxvYWRlZCBjb3JyZWN0bHksIFZGUyBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8gaXQoaS5lLiwgYmUgYW4KKyAgLy8vIG92ZXJsYXkgb3ZlciBSZWFsRmlsZVN5c3RlbSkuCisgIC8vLworICAvLy8gXHJldHVybnMgXGMgdHJ1ZSBpZiBhIGNhdGFzdHJvcGhpYyBmYWlsdXJlIG9jY3VycmVkICh3aGljaCBtZWFucyB0aGF0IHRoZQorICAvLy8gXGMgQVNUVW5pdCBpdHNlbGYgaXMgaW52YWxpZCksIG9yIFxjIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBMb2FkRnJvbUNvbXBpbGVySW52b2NhdGlvbigKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQQ0hDb250YWluZXJPcGVyYXRpb25zPiBQQ0hDb250YWluZXJPcHMsCisgICAgICB1bnNpZ25lZCBQcmVjb21waWxlUHJlYW1ibGVBZnRlck5QYXJzZXMsCisgICAgICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpGaWxlU3lzdGVtPiBWRlMpOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIEFTVFVuaXQgZnJvbSBhIHNvdXJjZSBmaWxlLCB2aWEgYSBDb21waWxlckludm9jYXRpb24KKyAgLy8vIG9iamVjdCwgYnkgaW52b2tpbmcgdGhlIG9wdGlvbmFsbHkgcHJvdmlkZWQgQVNURnJvbnRlbmRBY3Rpb24uIAorICAvLy8KKyAgLy8vIFxwYXJhbSBDSSAtIFRoZSBjb21waWxlciBpbnZvY2F0aW9uIHRvIHVzZTsgaXQgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGlucHV0CisgIC8vLyBzb3VyY2UgZmlsZS4gVGhlIEFTVFVuaXQgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBDb21waWxlckludm9jYXRpb24gb2JqZWN0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBQQ0hDb250YWluZXJPcHMgLSBUaGUgUENIQ29udGFpbmVyT3BlcmF0aW9ucyB0byB1c2UgZm9yIGxvYWRpbmcgYW5kCisgIC8vLyBjcmVhdGluZyBtb2R1bGVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBEaWFncyAtIFRoZSBkaWFnbm9zdGljcyBlbmdpbmUgdG8gdXNlIGZvciByZXBvcnRpbmcgZXJyb3JzOyBpdHMKKyAgLy8vIGxpZmV0aW1lIGlzIGV4cGVjdGVkIHRvIGV4dGVuZCBwYXN0IHRoYXQgb2YgdGhlIHJldHVybmVkIEFTVFVuaXQuCisgIC8vLworICAvLy8gXHBhcmFtIEFjdGlvbiAtIFRoZSBBU1RGcm9udGVuZEFjdGlvbiB0byBpbnZva2UuIEl0cyBvd25lcnNoaXAgaXMgbm90CisgIC8vLyB0cmFuc2ZlcnJlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gVW5pdCAtIG9wdGlvbmFsbHkgYW4gYWxyZWFkeSBjcmVhdGVkIEFTVFVuaXQuIEl0cyBvd25lcnNoaXAgaXMgbm90CisgIC8vLyB0cmFuc2ZlcnJlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gUGVyc2lzdGVudCAtIGlmIHRydWUgdGhlIHJldHVybmVkIEFTVFVuaXQgd2lsbCBiZSBjb21wbGV0ZS4KKyAgLy8vIGZhbHNlIG1lYW5zIHRoZSBjYWxsZXIgaXMgb25seSBpbnRlcmVzdGVkIGluIGdldHRpbmcgaW5mbyB0aHJvdWdoIHRoZQorICAvLy8gcHJvdmlkZWQgXHNlZSBBY3Rpb24uCisgIC8vLworICAvLy8gXHBhcmFtIEVyckFTVCAtIElmIG5vbi1udWxsIGFuZCBwYXJzaW5nIGZhaWxlZCB3aXRob3V0IGFueSBBU1QgdG8gcmV0dXJuCisgIC8vLyAoZS5nLiBiZWNhdXNlIHRoZSBQQ0ggY291bGQgbm90IGJlIGxvYWRlZCksIHRoaXMgYWNjZXB0cyB0aGUgQVNUVW5pdAorICAvLy8gbWFpbmx5IHRvIGFsbG93IHRoZSBjYWxsZXIgdG8gc2VlIHRoZSBkaWFnbm9zdGljcy4KKyAgLy8vIFRoaXMgd2lsbCBvbmx5IHJlY2VpdmUgYW4gQVNUVW5pdCBpZiBhIG5ldyBvbmUgd2FzIGNyZWF0ZWQuIElmIGFuIGFscmVhZHkKKyAgLy8vIGNyZWF0ZWQgQVNUVW5pdCB3YXMgcGFzc2VkIGluIFxwIFVuaXQgdGhlbiB0aGUgY2FsbGVyIGNhbiBjaGVjayB0aGF0LgorICAvLy8KKyAgc3RhdGljIEFTVFVuaXQgKkxvYWRGcm9tQ29tcGlsZXJJbnZvY2F0aW9uQWN0aW9uKAorICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBpbGVySW52b2NhdGlvbj4gQ0ksCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8UENIQ29udGFpbmVyT3BlcmF0aW9ucz4gUENIQ29udGFpbmVyT3BzLAorICAgICAgSW50cnVzaXZlUmVmQ250UHRyPERpYWdub3N0aWNzRW5naW5lPiBEaWFncywKKyAgICAgIEZyb250ZW5kQWN0aW9uICpBY3Rpb24gPSBudWxscHRyLCBBU1RVbml0ICpVbml0ID0gbnVsbHB0ciwKKyAgICAgIGJvb2wgUGVyc2lzdGVudCA9IHRydWUsIFN0cmluZ1JlZiBSZXNvdXJjZUZpbGVzUGF0aCA9IFN0cmluZ1JlZigpLAorICAgICAgYm9vbCBPbmx5TG9jYWxEZWNscyA9IGZhbHNlLCBib29sIENhcHR1cmVEaWFnbm9zdGljcyA9IGZhbHNlLAorICAgICAgdW5zaWduZWQgUHJlY29tcGlsZVByZWFtYmxlQWZ0ZXJOUGFyc2VzID0gMCwKKyAgICAgIGJvb2wgQ2FjaGVDb2RlQ29tcGxldGlvblJlc3VsdHMgPSBmYWxzZSwKKyAgICAgIGJvb2wgSW5jbHVkZUJyaWVmQ29tbWVudHNJbkNvZGVDb21wbGV0aW9uID0gZmFsc2UsCisgICAgICBib29sIFVzZXJGaWxlc0FyZVZvbGF0aWxlID0gZmFsc2UsCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QVNUVW5pdD4gKkVyckFTVCA9IG51bGxwdHIpOworCisgIC8vLyBMb2FkRnJvbUNvbXBpbGVySW52b2NhdGlvbiAtIENyZWF0ZSBhbiBBU1RVbml0IGZyb20gYSBzb3VyY2UgZmlsZSwgdmlhIGEKKyAgLy8vIENvbXBpbGVySW52b2NhdGlvbiBvYmplY3QuCisgIC8vLworICAvLy8gXHBhcmFtIENJIC0gVGhlIGNvbXBpbGVyIGludm9jYXRpb24gdG8gdXNlOyBpdCBtdXN0IGhhdmUgZXhhY3RseSBvbmUgaW5wdXQKKyAgLy8vIHNvdXJjZSBmaWxlLiBUaGUgQVNUVW5pdCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIENvbXBpbGVySW52b2NhdGlvbiBvYmplY3QuCisgIC8vLworICAvLy8gXHBhcmFtIFBDSENvbnRhaW5lck9wcyAtIFRoZSBQQ0hDb250YWluZXJPcGVyYXRpb25zIHRvIHVzZSBmb3IgbG9hZGluZyBhbmQKKyAgLy8vIGNyZWF0aW5nIG1vZHVsZXMuCisgIC8vLworICAvLy8gXHBhcmFtIERpYWdzIC0gVGhlIGRpYWdub3N0aWNzIGVuZ2luZSB0byB1c2UgZm9yIHJlcG9ydGluZyBlcnJvcnM7IGl0cworICAvLy8gbGlmZXRpbWUgaXMgZXhwZWN0ZWQgdG8gZXh0ZW5kIHBhc3QgdGhhdCBvZiB0aGUgcmV0dXJuZWQgQVNUVW5pdC4KKyAgLy8KKyAgLy8gRklYTUU6IE1vdmUgT25seUxvY2FsRGVjbHMsIFVzZUJ1bXBBbGxvY2F0b3IgdG8gc2V0dGVycyBvbiB0aGUgQVNUVW5pdCwgd2UKKyAgLy8gc2hvdWxkbid0IG5lZWQgdG8gc3BlY2lmeSB0aGVtIGF0IGNvbnN0cnVjdGlvbiB0aW1lLgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEFTVFVuaXQ+IExvYWRGcm9tQ29tcGlsZXJJbnZvY2F0aW9uKAorICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBpbGVySW52b2NhdGlvbj4gQ0ksCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8UENIQ29udGFpbmVyT3BlcmF0aW9ucz4gUENIQ29udGFpbmVyT3BzLAorICAgICAgSW50cnVzaXZlUmVmQ250UHRyPERpYWdub3N0aWNzRW5naW5lPiBEaWFncywgRmlsZU1hbmFnZXIgKkZpbGVNZ3IsCisgICAgICBib29sIE9ubHlMb2NhbERlY2xzID0gZmFsc2UsIGJvb2wgQ2FwdHVyZURpYWdub3N0aWNzID0gZmFsc2UsCisgICAgICB1bnNpZ25lZCBQcmVjb21waWxlUHJlYW1ibGVBZnRlck5QYXJzZXMgPSAwLAorICAgICAgVHJhbnNsYXRpb25Vbml0S2luZCBUVUtpbmQgPSBUVV9Db21wbGV0ZSwKKyAgICAgIGJvb2wgQ2FjaGVDb2RlQ29tcGxldGlvblJlc3VsdHMgPSBmYWxzZSwKKyAgICAgIGJvb2wgSW5jbHVkZUJyaWVmQ29tbWVudHNJbkNvZGVDb21wbGV0aW9uID0gZmFsc2UsCisgICAgICBib29sIFVzZXJGaWxlc0FyZVZvbGF0aWxlID0gZmFsc2UpOworCisgIC8vLyBMb2FkRnJvbUNvbW1hbmRMaW5lIC0gQ3JlYXRlIGFuIEFTVFVuaXQgZnJvbSBhIHZlY3RvciBvZiBjb21tYW5kIGxpbmUKKyAgLy8vIGFyZ3VtZW50cywgd2hpY2ggbXVzdCBzcGVjaWZ5IGV4YWN0bHkgb25lIHNvdXJjZSBmaWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBBcmdCZWdpbiAtIFRoZSBiZWdpbm5pbmcgb2YgdGhlIGFyZ3VtZW50IHZlY3Rvci4KKyAgLy8vCisgIC8vLyBccGFyYW0gQXJnRW5kIC0gVGhlIGVuZCBvZiB0aGUgYXJndW1lbnQgdmVjdG9yLgorICAvLy8KKyAgLy8vIFxwYXJhbSBQQ0hDb250YWluZXJPcHMgLSBUaGUgUENIQ29udGFpbmVyT3BlcmF0aW9ucyB0byB1c2UgZm9yIGxvYWRpbmcgYW5kCisgIC8vLyBjcmVhdGluZyBtb2R1bGVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBEaWFncyAtIFRoZSBkaWFnbm9zdGljcyBlbmdpbmUgdG8gdXNlIGZvciByZXBvcnRpbmcgZXJyb3JzOyBpdHMKKyAgLy8vIGxpZmV0aW1lIGlzIGV4cGVjdGVkIHRvIGV4dGVuZCBwYXN0IHRoYXQgb2YgdGhlIHJldHVybmVkIEFTVFVuaXQuCisgIC8vLworICAvLy8gXHBhcmFtIFJlc291cmNlRmlsZXNQYXRoIC0gVGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyIHJlc291cmNlIGZpbGVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNb2R1bGVGb3JtYXQgLSBJZiBwcm92aWRlZCwgdXNlcyB0aGUgc3BlY2lmaWMgbW9kdWxlIGZvcm1hdC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRXJyQVNUIC0gSWYgbm9uLW51bGwgYW5kIHBhcnNpbmcgZmFpbGVkIHdpdGhvdXQgYW55IEFTVCB0byByZXR1cm4KKyAgLy8vIChlLmcuIGJlY2F1c2UgdGhlIFBDSCBjb3VsZCBub3QgYmUgbG9hZGVkKSwgdGhpcyBhY2NlcHRzIHRoZSBBU1RVbml0CisgIC8vLyBtYWlubHkgdG8gYWxsb3cgdGhlIGNhbGxlciB0byBzZWUgdGhlIGRpYWdub3N0aWNzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBWRlMgLSBBIHZmczo6RmlsZVN5c3RlbSB0byBiZSB1c2VkIGZvciBhbGwgZmlsZSBhY2Nlc3Nlcy4gTm90ZSB0aGF0CisgIC8vLyBwcmVhbWJsZSBpcyBzYXZlZCB0byBhIHRlbXBvcmFyeSBkaXJlY3Rvcnkgb24gYSBSZWFsRmlsZVN5c3RlbSwgc28gaW4gb3JkZXIKKyAgLy8vIGZvciBpdCB0byBiZSBsb2FkZWQgY29ycmVjdGx5LCBWRlMgc2hvdWxkIGhhdmUgYWNjZXNzIHRvIGl0KGkuZS4sIGJlIGFuCisgIC8vLyBvdmVybGF5IG92ZXIgUmVhbEZpbGVTeXN0ZW0pLiBSZWFsRmlsZVN5c3RlbSB3aWxsIGJlIHVzZWQgaWYgXHAgVkZTIGlzIG51bGxwdHIuCisgIC8vLworICAvLyBGSVhNRTogTW92ZSBPbmx5TG9jYWxEZWNscywgVXNlQnVtcEFsbG9jYXRvciB0byBzZXR0ZXJzIG9uIHRoZSBBU1RVbml0LCB3ZQorICAvLyBzaG91bGRuJ3QgbmVlZCB0byBzcGVjaWZ5IHRoZW0gYXQgY29uc3RydWN0aW9uIHRpbWUuCisgIHN0YXRpYyBBU1RVbml0ICpMb2FkRnJvbUNvbW1hbmRMaW5lKAorICAgICAgY29uc3QgY2hhciAqKkFyZ0JlZ2luLCBjb25zdCBjaGFyICoqQXJnRW5kLAorICAgICAgc3RkOjpzaGFyZWRfcHRyPFBDSENvbnRhaW5lck9wZXJhdGlvbnM+IFBDSENvbnRhaW5lck9wcywKKyAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljc0VuZ2luZT4gRGlhZ3MsIFN0cmluZ1JlZiBSZXNvdXJjZUZpbGVzUGF0aCwKKyAgICAgIGJvb2wgT25seUxvY2FsRGVjbHMgPSBmYWxzZSwgYm9vbCBDYXB0dXJlRGlhZ25vc3RpY3MgPSBmYWxzZSwKKyAgICAgIEFycmF5UmVmPFJlbWFwcGVkRmlsZT4gUmVtYXBwZWRGaWxlcyA9IE5vbmUsCisgICAgICBib29sIFJlbWFwcGVkRmlsZXNLZWVwT3JpZ2luYWxOYW1lID0gdHJ1ZSwKKyAgICAgIHVuc2lnbmVkIFByZWNvbXBpbGVQcmVhbWJsZUFmdGVyTlBhcnNlcyA9IDAsCisgICAgICBUcmFuc2xhdGlvblVuaXRLaW5kIFRVS2luZCA9IFRVX0NvbXBsZXRlLAorICAgICAgYm9vbCBDYWNoZUNvZGVDb21wbGV0aW9uUmVzdWx0cyA9IGZhbHNlLAorICAgICAgYm9vbCBJbmNsdWRlQnJpZWZDb21tZW50c0luQ29kZUNvbXBsZXRpb24gPSBmYWxzZSwKKyAgICAgIGJvb2wgQWxsb3dQQ0hXaXRoQ29tcGlsZXJFcnJvcnMgPSBmYWxzZSwgYm9vbCBTa2lwRnVuY3Rpb25Cb2RpZXMgPSBmYWxzZSwKKyAgICAgIGJvb2wgU2luZ2xlRmlsZVBhcnNlID0gZmFsc2UsCisgICAgICBib29sIFVzZXJGaWxlc0FyZVZvbGF0aWxlID0gZmFsc2UsIGJvb2wgRm9yU2VyaWFsaXphdGlvbiA9IGZhbHNlLAorICAgICAgbGx2bTo6T3B0aW9uYWw8U3RyaW5nUmVmPiBNb2R1bGVGb3JtYXQgPSBsbHZtOjpOb25lLAorICAgICAgc3RkOjp1bmlxdWVfcHRyPEFTVFVuaXQ+ICpFcnJBU1QgPSBudWxscHRyLAorICAgICAgSW50cnVzaXZlUmVmQ250UHRyPHZmczo6RmlsZVN5c3RlbT4gVkZTID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBSZXBhcnNlIHRoZSBzb3VyY2UgZmlsZXMgdXNpbmcgdGhlIHNhbWUgY29tbWFuZC1saW5lIG9wdGlvbnMgdGhhdAorICAvLy8gd2VyZSBvcmlnaW5hbGx5IHVzZWQgdG8gcHJvZHVjZSB0aGlzIHRyYW5zbGF0aW9uIHVuaXQuCisgIC8vLworICAvLy8gXHBhcmFtIFZGUyAtIEEgdmZzOjpGaWxlU3lzdGVtIHRvIGJlIHVzZWQgZm9yIGFsbCBmaWxlIGFjY2Vzc2VzLiBOb3RlIHRoYXQKKyAgLy8vIHByZWFtYmxlIGlzIHNhdmVkIHRvIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBvbiBhIFJlYWxGaWxlU3lzdGVtLCBzbyBpbiBvcmRlcgorICAvLy8gZm9yIGl0IHRvIGJlIGxvYWRlZCBjb3JyZWN0bHksIFZGUyBzaG91bGQgZ2l2ZSBhbiBhY2Nlc3MgdG8gdGhpcyhpLmUuIGJlIGFuCisgIC8vLyBvdmVybGF5IG92ZXIgUmVhbEZpbGVTeXN0ZW0pLiBGaWxlTWdyLT5nZXRWaXJ0dWFsRmlsZVN5c3RlbSgpIHdpbGwgYmUgdXNlZCBpZgorICAvLy8gXHAgVkZTIGlzIG51bGxwdHIuCisgIC8vLworICAvLy8gXHJldHVybnMgVHJ1ZSBpZiBhIGZhaWx1cmUgb2NjdXJyZWQgdGhhdCBjYXVzZXMgdGhlIEFTVFVuaXQgbm90IHRvCisgIC8vLyBjb250YWluIGFueSB0cmFuc2xhdGlvbi11bml0IGluZm9ybWF0aW9uLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgUmVwYXJzZShzdGQ6OnNoYXJlZF9wdHI8UENIQ29udGFpbmVyT3BlcmF0aW9ucz4gUENIQ29udGFpbmVyT3BzLAorICAgICAgICAgICAgICAgQXJyYXlSZWY8UmVtYXBwZWRGaWxlPiBSZW1hcHBlZEZpbGVzID0gTm9uZSwKKyAgICAgICAgICAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjx2ZnM6OkZpbGVTeXN0ZW0+IFZGUyA9IG51bGxwdHIpOworCisgIC8vLyBcYnJpZWYgRnJlZSBkYXRhIHRoYXQgd2lsbCBiZSByZS1nZW5lcmF0ZWQgb24gdGhlIG5leHQgcGFyc2UuCisgIC8vLworICAvLy8gUHJlYW1ibGUtcmVsYXRlZCBkYXRhIGlzIG5vdCBhZmZlY3RlZC4KKyAgdm9pZCBSZXNldEZvclBhcnNlKCk7CisKKyAgLy8vIFxicmllZiBQZXJmb3JtIGNvZGUgY29tcGxldGlvbiBhdCB0aGUgZ2l2ZW4gZmlsZSwgbGluZSwgYW5kCisgIC8vLyBjb2x1bW4gd2l0aGluIHRoaXMgdHJhbnNsYXRpb24gdW5pdC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRmlsZSBUaGUgZmlsZSBpbiB3aGljaCBjb2RlIGNvbXBsZXRpb24gd2lsbCBvY2N1ci4KKyAgLy8vCisgIC8vLyBccGFyYW0gTGluZSBUaGUgbGluZSBhdCB3aGljaCBjb2RlIGNvbXBsZXRpb24gd2lsbCBvY2N1ci4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29sdW1uIFRoZSBjb2x1bW4gYXQgd2hpY2ggY29kZSBjb21wbGV0aW9uIHdpbGwgb2NjdXIuCisgIC8vLworICAvLy8gXHBhcmFtIEluY2x1ZGVNYWNyb3MgV2hldGhlciB0byBpbmNsdWRlIG1hY3JvcyBpbiB0aGUgY29kZS1jb21wbGV0aW9uIAorICAvLy8gcmVzdWx0cy4KKyAgLy8vCisgIC8vLyBccGFyYW0gSW5jbHVkZUNvZGVQYXR0ZXJucyBXaGV0aGVyIHRvIGluY2x1ZGUgY29kZSBwYXR0ZXJucyAoc3VjaCBhcyBhIAorICAvLy8gZm9yIGxvb3ApIGluIHRoZSBjb2RlLWNvbXBsZXRpb24gcmVzdWx0cy4KKyAgLy8vCisgIC8vLyBccGFyYW0gSW5jbHVkZUJyaWVmQ29tbWVudHMgV2hldGhlciB0byBpbmNsdWRlIGJyaWVmIGRvY3VtZW50YXRpb24gd2l0aGluCisgIC8vLyB0aGUgc2V0IG9mIGNvZGUgY29tcGxldGlvbnMgcmV0dXJuZWQuCisgIC8vLworICAvLy8gRklYTUU6IFRoZSBEaWFnLCBMYW5nT3B0cywgU291cmNlTWdyLCBGaWxlTWdyLCBTdG9yZWREaWFnbm9zdGljcywgYW5kCisgIC8vLyBPd25lZEJ1ZmZlcnMgcGFyYW1ldGVycyBhcmUgYWxsIGRpc2d1c3RpbmcgaGFja3MuIFRoZXkgd2lsbCBnbyBhd2F5LgorICB2b2lkIENvZGVDb21wbGV0ZShTdHJpbmdSZWYgRmlsZSwgdW5zaWduZWQgTGluZSwgdW5zaWduZWQgQ29sdW1uLAorICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxSZW1hcHBlZEZpbGU+IFJlbWFwcGVkRmlsZXMsIGJvb2wgSW5jbHVkZU1hY3JvcywKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlQ29kZVBhdHRlcm5zLCBib29sIEluY2x1ZGVCcmllZkNvbW1lbnRzLAorICAgICAgICAgICAgICAgICAgICBDb2RlQ29tcGxldGVDb25zdW1lciAmQ29uc3VtZXIsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQQ0hDb250YWluZXJPcGVyYXRpb25zPiBQQ0hDb250YWluZXJPcHMsCisgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lICZEaWFnLCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZU1hbmFnZXIgJlNvdXJjZU1nciwgRmlsZU1hbmFnZXIgJkZpbGVNZ3IsCisgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTdG9yZWREaWFnbm9zdGljPiAmU3RvcmVkRGlhZ25vc3RpY3MsCisgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjb25zdCBsbHZtOjpNZW1vcnlCdWZmZXIgKj4gJk93bmVkQnVmZmVycyk7CisKKyAgLy8vIFxicmllZiBTYXZlIHRoaXMgdHJhbnNsYXRpb24gdW5pdCB0byBhIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZXJlIHdhcyBhIGZpbGUgZXJyb3Igb3IgZmFsc2UgaWYgdGhlIHNhdmUgd2FzCisgIC8vLyBzdWNjZXNzZnVsLgorICBib29sIFNhdmUoU3RyaW5nUmVmIEZpbGUpOworCisgIC8vLyBcYnJpZWYgU2VyaWFsaXplIHRoaXMgdHJhbnNsYXRpb24gdW5pdCB3aXRoIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBzZXJpYWxpemUocmF3X29zdHJlYW0gJk9TKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0ZST05URU5EX0FTVFVOSVRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvQ2hhaW5lZERpYWdub3N0aWNDb25zdW1lci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvQ2hhaW5lZERpYWdub3N0aWNDb25zdW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMzMyNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9DaGFpbmVkRGlhZ25vc3RpY0NvbnN1bWVyLmgKQEAgLTAsMCArMSw3MiBAQAorLy89PT0tIENoYWluZWREaWFnbm9zdGljQ29uc3VtZXIuaCAtIENoYWluIERpYWdub3N0aWMgQ2xpZW50cyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0ZST05URU5EX0NIQUlORURESUFHTk9TVElDQ09OU1VNRVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX0ZST05URU5EX0NIQUlORURESUFHTk9TVElDQ09OU1VNRVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGNsYW5nIHsKK2NsYXNzIExhbmdPcHRpb25zOworCisvLy8gQ2hhaW5lZERpYWdub3N0aWNDb25zdW1lciAtIENoYWluIHR3byBkaWFnbm9zdGljIGNsaWVudHMgc28gdGhhdCBkaWFnbm9zdGljcworLy8vIGdvIHRvIHRoZSBmaXJzdCBjbGllbnQgYW5kIHRoZW4gdGhlIHNlY29uZC4gVGhlIGZpcnN0IGRpYWdub3N0aWMgY2xpZW50CisvLy8gc2hvdWxkIGJlIHRoZSAicHJpbWFyeSIgY2xpZW50LCBhbmQgd2lsbCBiZSB1c2VkIGZvciBjb21wdXRpbmcgd2hldGhlciB0aGUKKy8vLyBkaWFnbm9zdGljcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gY291bnRzLgorY2xhc3MgQ2hhaW5lZERpYWdub3N0aWNDb25zdW1lciA6IHB1YmxpYyBEaWFnbm9zdGljQ29uc3VtZXIgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxEaWFnbm9zdGljQ29uc3VtZXI+IE93bmluZ1ByaW1hcnk7CisgIERpYWdub3N0aWNDb25zdW1lciAqUHJpbWFyeTsKKyAgc3RkOjp1bmlxdWVfcHRyPERpYWdub3N0aWNDb25zdW1lcj4gU2Vjb25kYXJ5OworCitwdWJsaWM6CisgIENoYWluZWREaWFnbm9zdGljQ29uc3VtZXIoc3RkOjp1bmlxdWVfcHRyPERpYWdub3N0aWNDb25zdW1lcj4gUHJpbWFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RGlhZ25vc3RpY0NvbnN1bWVyPiBTZWNvbmRhcnkpCisgICAgICA6IE93bmluZ1ByaW1hcnkoc3RkOjptb3ZlKFByaW1hcnkpKSwgUHJpbWFyeShPd25pbmdQcmltYXJ5LmdldCgpKSwKKyAgICAgICAgU2Vjb25kYXJ5KHN0ZDo6bW92ZShTZWNvbmRhcnkpKSB7fQorCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IHdpdGhvdXQgdGFraW5nIG93bmVyc2hpcCBvZiBcYyBQcmltYXJ5LgorICBDaGFpbmVkRGlhZ25vc3RpY0NvbnN1bWVyKERpYWdub3N0aWNDb25zdW1lciAqUHJpbWFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RGlhZ25vc3RpY0NvbnN1bWVyPiBTZWNvbmRhcnkpCisgICAgICA6IFByaW1hcnkoUHJpbWFyeSksIFNlY29uZGFyeShzdGQ6Om1vdmUoU2Vjb25kYXJ5KSkge30KKworICB2b2lkIEJlZ2luU291cmNlRmlsZShjb25zdCBMYW5nT3B0aW9ucyAmTE8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByZXByb2Nlc3NvciAqUFApIG92ZXJyaWRlIHsKKyAgICBQcmltYXJ5LT5CZWdpblNvdXJjZUZpbGUoTE8sIFBQKTsKKyAgICBTZWNvbmRhcnktPkJlZ2luU291cmNlRmlsZShMTywgUFApOworICB9CisKKyAgdm9pZCBFbmRTb3VyY2VGaWxlKCkgb3ZlcnJpZGUgeworICAgIFNlY29uZGFyeS0+RW5kU291cmNlRmlsZSgpOworICAgIFByaW1hcnktPkVuZFNvdXJjZUZpbGUoKTsKKyAgfQorCisgIHZvaWQgZmluaXNoKCkgb3ZlcnJpZGUgeworICAgIFNlY29uZGFyeS0+ZmluaXNoKCk7CisgICAgUHJpbWFyeS0+ZmluaXNoKCk7CisgIH0KKworICBib29sIEluY2x1ZGVJbkRpYWdub3N0aWNDb3VudHMoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFByaW1hcnktPkluY2x1ZGVJbkRpYWdub3N0aWNDb3VudHMoKTsKKyAgfQorCisgIHZvaWQgSGFuZGxlRGlhZ25vc3RpYyhEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgRGlhZ0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpYyAmSW5mbykgb3ZlcnJpZGUgeworICAgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gKFdhcm5pbmdzL2Vycm9ycyBjb3VudCkuCisgICAgRGlhZ25vc3RpY0NvbnN1bWVyOjpIYW5kbGVEaWFnbm9zdGljKERpYWdMZXZlbCwgSW5mbyk7CisKKyAgICBQcmltYXJ5LT5IYW5kbGVEaWFnbm9zdGljKERpYWdMZXZlbCwgSW5mbyk7CisgICAgU2Vjb25kYXJ5LT5IYW5kbGVEaWFnbm9zdGljKERpYWdMZXZlbCwgSW5mbyk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvQ29kZUdlbk9wdGlvbnMuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvQ29kZUdlbk9wdGlvbnMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkY2JlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Db2RlR2VuT3B0aW9ucy5kZWYKQEAgLTAsMCArMSwzMjcgQEAKKy8vPT09LS0tIENvZGVHZW5PcHRpb25zLmRlZiAtIENvZGUgZ2VuZXJhdGlvbiBvcHRpb24gZGF0YWJhc2UgLS0tLS0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGNvZGUgZ2VuZXJhdGlvbiBvcHRpb25zLiBVc2VycyBvZiB0aGlzIGZpbGUKKy8vIG11c3QgZGVmaW5lIHRoZSBDT0RFR0VOT1BUIG1hY3JvIHRvIG1ha2UgdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24uCisvLyBPcHRpb25hbGx5LCB0aGUgdXNlciBtYXkgYWxzbyBkZWZpbmUgRU5VTV9DT0RFR0VOT1BUIChmb3Igb3B0aW9ucworLy8gdGhhdCBoYXZlIGVudW1lcmF0aW9uIHR5cGUgYW5kIFZBTFVFX0NPREVHRU5PUFQgaXMgYSBjb2RlCisvLyBnZW5lcmF0aW9uIG9wdGlvbiB0aGF0IGRlc2NyaWJlcyBhIHZhbHVlIHJhdGhlciB0aGFuIGEgZmxhZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBDT0RFR0VOT1BUCisjICBlcnJvciBEZWZpbmUgdGhlIENPREVHRU5PUFQgbWFjcm8gdG8gaGFuZGxlIGxhbmd1YWdlIG9wdGlvbnMKKyNlbmRpZgorCisjaWZuZGVmIFZBTFVFX0NPREVHRU5PUFQKKyMgIGRlZmluZSBWQUxVRV9DT0RFR0VOT1BUKE5hbWUsIEJpdHMsIERlZmF1bHQpIFwKK0NPREVHRU5PUFQoTmFtZSwgQml0cywgRGVmYXVsdCkKKyNlbmRpZgorCisjaWZuZGVmIEVOVU1fQ09ERUdFTk9QVAorIyAgZGVmaW5lIEVOVU1fQ09ERUdFTk9QVChOYW1lLCBUeXBlLCBCaXRzLCBEZWZhdWx0KSBcCitDT0RFR0VOT1BUKE5hbWUsIEJpdHMsIERlZmF1bHQpCisjZW5kaWYKKworQ09ERUdFTk9QVChEaXNhYmxlSW50ZWdyYXRlZEFTLCAxLCAwKSAvLy88IC1uby1pbnRlZ3JhdGVkLWFzCitFTlVNX0NPREVHRU5PUFQoQ29tcHJlc3NEZWJ1Z1NlY3Rpb25zLCBsbHZtOjpEZWJ1Z0NvbXByZXNzaW9uVHlwZSwgMiwKKyAgICAgICAgICAgICAgICBsbHZtOjpEZWJ1Z0NvbXByZXNzaW9uVHlwZTo6Tm9uZSkKK0NPREVHRU5PUFQoUmVsYXhFTEZSZWxvY2F0aW9ucywgMSwgMCkgLy8vPCAtV2EsLS1tcmVsYXgtcmVsb2NhdGlvbnMKK0NPREVHRU5PUFQoQXNtVmVyYm9zZSAgICAgICAgLCAxLCAwKSAvLy88IC1kQSwgLWZ2ZXJib3NlLWFzbS4KK0NPREVHRU5PUFQoUHJlc2VydmVBc21Db21tZW50cywgMSwgMSkgLy8vPCAtZEEsIC1mbm8tcHJlc2VydmUtYXMtY29tbWVudHMuCitDT0RFR0VOT1BUKEFzc3VtZVNhbmVPcGVyYXRvck5ldyAsIDEsIDEpIC8vLzwgaW1wbGljaXQgX19hdHRyaWJ1dGVfXygobWFsbG9jKSkgb3BlcmF0b3IgbmV3CitDT0RFR0VOT1BUKEF1dG9saW5rICAgICAgICAgICwgMSwgMSkgLy8vPCAtZm5vLWF1dG9saW5rCitDT0RFR0VOT1BUKE9iakNBdXRvUmVmQ291bnRFeGNlcHRpb25zICwgMSwgMCkgLy8vPCBXaGV0aGVyIEFSQyBzaG91bGQgYmUgRUgtc2FmZS4KK0NPREVHRU5PUFQoQmFja2NoYWluICAgICAgICAgLCAxLCAwKSAvLy88IC1tYmFja2NoYWluCitDT0RFR0VOT1BUKENvbnRyb2xGbG93R3VhcmQgICwgMSwgMCkgLy8vPCAtY2ZndWFyZAorQ09ERUdFTk9QVChDb3ZlcmFnZUV4dHJhQ2hlY2tzdW0sIDEsIDApIC8vLzwgV2hldGhlciB3ZSBuZWVkIGEgc2Vjb25kIGNoZWNrc3VtIGZvciBmdW5jdGlvbnMgaW4gR0NOTyBmaWxlcy4KK0NPREVHRU5PUFQoQ292ZXJhZ2VOb0Z1bmN0aW9uTmFtZXNJbkRhdGEsIDEsIDApIC8vLzwgRG8gbm90IGluY2x1ZGUgZnVuY3Rpb24gbmFtZXMgaW4gR0NEQSBmaWxlcy4KK0NPREVHRU5PUFQoQ292ZXJhZ2VFeGl0QmxvY2tCZWZvcmVCb2R5LCAxLCAwKSAvLy88IFdoZXRoZXIgdG8gZW1pdCB0aGUgZXhpdCBibG9jayBiZWZvcmUgdGhlIGJvZHkgYmxvY2tzIGluIEdDTk8gZmlsZXMuCitDT0RFR0VOT1BUKENYQUF0RXhpdCAgICAgICAgICwgMSwgMSkgLy8vPCBVc2UgX19jeGFfYXRleGl0IGZvciBjYWxsaW5nIGRlc3RydWN0b3JzLgorQ09ERUdFTk9QVChDWFhDdG9yRHRvckFsaWFzZXMsIDEsIDApIC8vLzwgRW1pdCBjb21wbGV0ZSBjdG9ycy9kdG9ycyBhcyBsaW5rZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGFsaWFzZXMgdG8gYmFzZSBjdG9ycyB3aGVuIHBvc3NpYmxlLgorQ09ERUdFTk9QVChEYXRhU2VjdGlvbnMgICAgICAsIDEsIDApIC8vLzwgU2V0IHdoZW4gLWZkYXRhLXNlY3Rpb25zIGlzIGVuYWJsZWQuCitDT0RFR0VOT1BUKFVuaXF1ZVNlY3Rpb25OYW1lcywgMSwgMSkgLy8vPCBTZXQgZm9yIC1mdW5pcXVlLXNlY3Rpb24tbmFtZXMuCitDT0RFR0VOT1BUKERpc2FibGVGUEVsaW0gICAgICwgMSwgMCkgLy8vPCBTZXQgd2hlbiAtZm9taXQtZnJhbWUtcG9pbnRlciBpcyBlbmFibGVkLgorQ09ERUdFTk9QVChEaXNhYmxlRnJlZSAgICAgICAsIDEsIDApIC8vLzwgRG9uJ3QgZnJlZSBtZW1vcnkuCitDT0RFR0VOT1BUKERpc2NhcmRWYWx1ZU5hbWVzICwgMSwgMCkgLy8vPCBEaXNjYXJkIFZhbHVlIE5hbWVzIGZyb20gdGhlIElSIChMTFZNQ29udGV4dCBmbGFnKQorQ09ERUdFTk9QVChEaXNhYmxlR0NvdiAgICAgICAsIDEsIDApIC8vLzwgRG9uJ3QgcnVuIHRoZSBHQ292IHBhc3MsIGZvciB0ZXN0aW5nLgorQ09ERUdFTk9QVChEaXNhYmxlTExWTVBhc3NlcyAsIDEsIDApIC8vLzwgRG9uJ3QgcnVuIGFueSBMTFZNIElSIHBhc3NlcyB0byBnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHRoZSBwcmlzdGluZSBJUiBnZW5lcmF0ZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBmcm9udGVuZC4KK0NPREVHRU5PUFQoRGlzYWJsZUxpZmV0aW1lTWFya2VycywgMSwgMCkgLy8vPCBEb24ndCBlbWl0IGFueSBsaWZldGltZSBtYXJrZXJzCitDT0RFR0VOT1BUKERpc2FibGVPMEltcGx5T3B0Tm9uZSAsIDEsIDApIC8vLzwgRG9uJ3QgYW5ub25hdGUgZnVuY3Rpb24gd2l0aCBvcHRub25lIGF0IE8wCitDT0RFR0VOT1BUKEV4cGVyaW1lbnRhbE5ld1Bhc3NNYW5hZ2VyLCAxLCAwKSAvLy88IEVuYWJsZXMgdGhlIG5ldywgZXhwZXJpbWVudGFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHBhc3MgbWFuYWdlci4KK0NPREVHRU5PUFQoRGVidWdQYXNzTWFuYWdlciwgMSwgMCkgLy8vPCBQcmludHMgZGVidWcgaW5mb3JtYXRpb24gZm9yIHRoZSBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBwYXNzIG1hbmFnZXIuCitDT0RFR0VOT1BUKERpc2FibGVSZWRab25lICAgICwgMSwgMCkgLy8vPCBTZXQgd2hlbiAtbW5vLXJlZC16b25lIGlzIGVuYWJsZWQuCitDT0RFR0VOT1BUKERpc2FibGVUYWlsQ2FsbHMgICwgMSwgMCkgLy8vPCBEbyBub3QgZW1pdCB0YWlsIGNhbGxzLgorQ09ERUdFTk9QVChOb0VzY2FwaW5nQmxvY2tUYWlsQ2FsbHMsIDEsIDApIC8vLzwgRG8gbm90IGVtaXQgdGFpbCBjYWxscyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBlc2NhcGluZyBibG9ja3MuCitDT0RFR0VOT1BUKEVtaXREZWNsTWV0YWRhdGEgICwgMSwgMCkgLy8vPCBFbWl0IHNwZWNpYWwgbWV0YWRhdGEgaW5kaWNhdGluZyB3aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEZWNsKiB2YXJpb3VzIElSIGVudGl0aWVzIGNhbWUgZnJvbS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE9ubHkgdXNlZnVsIHdoZW4gcnVubmluZyBDb2RlR2VuIGFzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHN1YnJvdXRpbmUuCitDT0RFR0VOT1BUKEVtaXRHY292QXJjcyAgICAgICwgMSwgMCkgLy8vPCBFbWl0IGNvdmVyYWdlIGRhdGEgZmlsZXMsIGFrYS4gR0NEQS4KK0NPREVHRU5PUFQoRW1pdEdjb3ZOb3RlcyAgICAgLCAxLCAwKSAvLy88IEVtaXQgY292ZXJhZ2UgIm5vdGVzIiBmaWxlcywgYWthIEdDTk8uCitDT0RFR0VOT1BUKEVtaXRPcGVuQ0xBcmdNZXRhZGF0YSAsIDEsIDApIC8vLzwgRW1pdCBPcGVuQ0wga2VybmVsIGFyZyBtZXRhZGF0YS4KK0NPREVHRU5PUFQoRW11bGF0ZWRUTFMgICAgICAgLCAxLCAwKSAvLy88IFNldCBieSBkZWZhdWx0IG9yIC1mW25vLV1lbXVsYXRlZC10bHMuCitDT0RFR0VOT1BUKEV4cGxpY2l0RW11bGF0ZWRUTFMgLCAxLCAwKSAvLy88IFNldCBpZiAtZltuby1dZW11bGF0ZWQtdGxzIGlzIHVzZWQuCisvLy8gXGJyaWVmIEVtYmVkIEJpdGNvZGUgbW9kZSAob2ZmL2FsbC9iaXRjb2RlL21hcmtlcikuCitFTlVNX0NPREVHRU5PUFQoRW1iZWRCaXRjb2RlLCBFbWJlZEJpdGNvZGVLaW5kLCAyLCBFbWJlZF9PZmYpCitDT0RFR0VOT1BUKEZvcmJpZEd1YXJkVmFyaWFibGVzICwgMSwgMCkgLy8vPCBJc3N1ZSBlcnJvcnMgaWYgQysrIGd1YXJkIHZhcmlhYmxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYXJlIHJlcXVpcmVkLgorQ09ERUdFTk9QVChGdW5jdGlvblNlY3Rpb25zICAsIDEsIDApIC8vLzwgU2V0IHdoZW4gLWZmdW5jdGlvbi1zZWN0aW9ucyBpcyBlbmFibGVkLgorQ09ERUdFTk9QVChJbnN0cnVtZW50RnVuY3Rpb25zICwgMSwgMCkgLy8vPCBTZXQgd2hlbiAtZmluc3RydW1lbnQtZnVuY3Rpb25zIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGVuYWJsZWQuCitDT0RFR0VOT1BUKEluc3RydW1lbnRGdW5jdGlvbnNBZnRlcklubGluaW5nICwgMSwgMCkgLy8vPCBTZXQgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IC1maW5zdHJ1bWVudC1mdW5jdGlvbnMtYWZ0ZXItaW5saW5pbmcgaXMgZW5hYmxlZC4KK0NPREVHRU5PUFQoSW5zdHJ1bWVudEZ1bmN0aW9uRW50cnlCYXJlICwgMSwgMCkgLy8vPCBTZXQgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgLWZpbnN0cnVtZW50LWZ1bmN0aW9uLWVudHJ5LWJhcmUgaXMgZW5hYmxlZC4KK0NPREVHRU5PUFQoQ0ZQcm90ZWN0aW9uUmV0dXJuICwgMSwgMCkgLy8vPCBpZiAtZmNmLXByb3RlY3Rpb24gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBzZXQgdG8gZnVsbCBvciByZXR1cm4uCitDT0RFR0VOT1BUKENGUHJvdGVjdGlvbkJyYW5jaCAsIDEsIDApIC8vLzwgaWYgLWZjZi1wcm90ZWN0aW9uIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgc2V0IHRvIGZ1bGwgb3IgYnJhbmNoLgorQ09ERUdFTk9QVChYUmF5SW5zdHJ1bWVudEZ1bmN0aW9ucyAsIDEsIDApIC8vLzwgU2V0IHdoZW4gLWZ4cmF5LWluc3RydW1lbnQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGVuYWJsZWQuCitDT0RFR0VOT1BUKFN0YWNrU2l6ZVNlY3Rpb24gICwgMSwgMCkgLy8vPCBTZXQgd2hlbiAtZnN0YWNrLXNpemUtc2VjdGlvbiBpcyBlbmFibGVkLgorCisvLy88IFNldCB3aGVuIC1meHJheS1hbHdheXMtZW1pdC1jdXN0b21ldmVudHMgaXMgZW5hYmxlZC4KK0NPREVHRU5PUFQoWFJheUFsd2F5c0VtaXRDdXN0b21FdmVudHMgLCAxLCAwKQorCisvLy88IFNldCB0aGUgbWluaW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGluIGEgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHNlbGVjdGl2ZQorLy8vPCBYUmF5IGluc3RydW1lbnRhdGlvbi4KK1ZBTFVFX0NPREVHRU5PUFQoWFJheUluc3RydWN0aW9uVGhyZXNob2xkICwgMzIsIDIwMCkKKworQ09ERUdFTk9QVChJbnN0cnVtZW50Rm9yUHJvZmlsaW5nICwgMSwgMCkgLy8vPCBTZXQgd2hlbiAtcGcgaXMgZW5hYmxlZC4KK0NPREVHRU5PUFQoQ2FsbEZFbnRyeSAsIDEsIDApIC8vLzwgU2V0IHdoZW4gLW1mZW50cnkgaXMgZW5hYmxlZC4KK0NPREVHRU5PUFQoTGVzc1ByZWNpc2VGUE1BRCAgLCAxLCAwKSAvLy88IEVuYWJsZSBsZXNzIHByZWNpc2UgTUFEIGluc3RydWN0aW9ucyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYmUgZ2VuZXJhdGVkLgorQ09ERUdFTk9QVChQcmVwYXJlRm9yTFRPICAgICAsIDEsIDApIC8vLzwgU2V0IHdoZW4gLWZsdG8gaXMgZW5hYmxlZCBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGNvbXBpbGUgc3RlcC4KK0NPREVHRU5PUFQoRW1pdFN1bW1hcnlJbmRleCwgMSwgMCkgICAvLy88IFNldCB3aGVuIC1mbHRvPXRoaW4gaXMgZW5hYmxlZCBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGNvbXBpbGUgc3RlcC4KK0NPREVHRU5PUFQoTFRPVW5pdCwgMSwgMCkgLy8vPCBFbWl0IElSIHRvIHN1cHBvcnQgTFRPIHVuaXQgZmVhdHVyZXMgKENGSSwgd2hvbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBwcm9ncmFtIHZ0YWJsZSBvcHQpLgorQ09ERUdFTk9QVChJbmNyZW1lbnRhbExpbmtlckNvbXBhdGlibGUsIDEsIDApIC8vLzwgRW1pdCBhbiBvYmplY3QgZmlsZSB3aGljaCBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGJlIHVzZWQgd2l0aCBhbiBpbmNyZW1lbnRhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbGlua2VyLgorQ09ERUdFTk9QVChNZXJnZUFsbENvbnN0YW50cyAsIDEsIDEpIC8vLzwgTWVyZ2UgaWRlbnRpY2FsIGNvbnN0YW50cy4KK0NPREVHRU5PUFQoTWVyZ2VGdW5jdGlvbnMgICAgLCAxLCAwKSAvLy88IFNldCB3aGVuIC1mbWVyZ2UtZnVuY3Rpb25zIGlzIGVuYWJsZWQuCitDT0RFR0VOT1BUKE1TVm9sYXRpbGUgICAgICAgICwgMSwgMCkgLy8vPCBTZXQgd2hlbiAvdm9sYXRpbGU6bXMgaXMgZW5hYmxlZC4KK0NPREVHRU5PUFQoTm9Db21tb24gICAgICAgICAgLCAxLCAwKSAvLy88IFNldCB3aGVuIC1mbm8tY29tbW9uIG9yIEMrKyBpcyBlbmFibGVkLgorQ09ERUdFTk9QVChOb0R3YXJmRGlyZWN0b3J5QXNtICwgMSwgMCkgLy8vPCBTZXQgd2hlbiAtZm5vLWR3YXJmLWRpcmVjdG9yeS1hc20gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZW5hYmxlZC4KK0NPREVHRU5PUFQoTm9FeGVjU3RhY2sgICAgICAgLCAxLCAwKSAvLy88IFNldCB3aGVuIC1XYSwtLW5vZXhlY3N0YWNrIGlzIGVuYWJsZWQuCitDT0RFR0VOT1BUKEZhdGFsV2FybmluZ3MgICAgICwgMSwgMCkgLy8vPCBTZXQgd2hlbiAtV2EsLS1mYXRhbC13YXJuaW5ncyBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZW5hYmxlZC4KK0NPREVHRU5PUFQoRW5hYmxlU2VnbWVudGVkU3RhY2tzICwgMSwgMCkgLy8vPCBTZXQgd2hlbiAtZnNwbGl0LXN0YWNrIGlzIGVuYWJsZWQuCitDT0RFR0VOT1BUKE5vSW1wbGljaXRGbG9hdCAgICwgMSwgMCkgLy8vPCBTZXQgd2hlbiAtbW5vLWltcGxpY2l0LWZsb2F0IGlzIGVuYWJsZWQuCitDT0RFR0VOT1BUKE5vSW5mc0ZQTWF0aCAgICAgICwgMSwgMCkgLy8vPCBBc3N1bWUgRlAgYXJndW1lbnRzLCByZXN1bHRzIG5vdCArLUluZi4KK0NPREVHRU5PUFQoTm9TaWduZWRaZXJvcyAgICAgLCAxLCAwKSAvLy88IEFsbG93IGlnbm9yaW5nIHRoZSBzaWduZWRuZXNzIG9mIEZQIHplcm8KK0NPREVHRU5PUFQoUmVhc3NvY2lhdGUgICAgICAgLCAxLCAwKSAvLy88IEFsbG93IHJlYXNzb2NpYXRpb24gb2YgRlAgbWF0aCBvcHMKK0NPREVHRU5PUFQoUmVjaXByb2NhbE1hdGggICAgLCAxLCAwKSAvLy88IEFsbG93IEZQIGRpdmlzaW9ucyB0byBiZSByZWFzc29jaWF0ZWQuCitDT0RFR0VOT1BUKE5vVHJhcHBpbmdNYXRoICAgICwgMSwgMCkgLy8vPCBTZXQgd2hlbiAtZm5vLXRyYXBwaW5nLW1hdGggaXMgZW5hYmxlZC4KK0NPREVHRU5PUFQoTm9OYU5zRlBNYXRoICAgICAgLCAxLCAwKSAvLy88IEFzc3VtZSBGUCBhcmd1bWVudHMsIHJlc3VsdHMgbm90IE5hTi4KK0NPREVHRU5PUFQoRmx1c2hEZW5vcm0gICAgICAgLCAxLCAwKSAvLy88IEFsbG93IEZQIGRlbm9ybSBudW1iZXJzIHRvIGJlIGZsdXNoZWQgdG8gemVybworQ09ERUdFTk9QVChDb3JyZWN0bHlSb3VuZGVkRGl2U3FydCwgMSwgMCkgLy8vPCAtY2wtZnAzMi1jb3JyZWN0bHktcm91bmRlZC1kaXZpZGUtc3FydAorQ09ERUdFTk9QVChVbmlmb3JtV0dTaXplICAgICAsIDEsIDApIC8vLzwgLWNsLXVuaWZvcm0td29yay1ncm91cC1zaXplCitDT0RFR0VOT1BUKE5vWmVyb0luaXRpYWxpemVkSW5CU1MgLCAxLCAwKSAvLy88IC1mbm8temVyby1pbml0aWFsaXplZC1pbi1ic3MuCisvLy8gXGJyaWVmIE1ldGhvZCBvZiBPYmplY3RpdmUtQyBkaXNwYXRjaCB0byB1c2UuCitFTlVNX0NPREVHRU5PUFQoT2JqQ0Rpc3BhdGNoTWV0aG9kLCBPYmpDRGlzcGF0Y2hNZXRob2RLaW5kLCAyLCBMZWdhY3kpCitDT0RFR0VOT1BUKE9taXRMZWFmRnJhbWVQb2ludGVyICwgMSwgMCkgLy8vPCBTZXQgd2hlbiAtbW9taXQtbGVhZi1mcmFtZS1wb2ludGVyIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBlbmFibGVkLgorCitWQUxVRV9DT0RFR0VOT1BUKE9wdGltaXphdGlvbkxldmVsLCAyLCAwKSAvLy88IFRoZSAtT1swLTNdIG9wdGlvbiBzcGVjaWZpZWQuCitWQUxVRV9DT0RFR0VOT1BUKE9wdGltaXplU2l6ZSwgMiwgMCkgLy8vPCBJZiAtT3MgKD09MSkgb3IgLU96ICg9PTIpIGlzIHNwZWNpZmllZC4KKworLy8vIFxicmllZiBDaG9vc2UgcHJvZmlsZSBpbnN0cnVtZW5hdGlvbiBraW5kIG9yIG5vIGluc3RydW1lbnRhdGlvbi4KK0VOVU1fQ09ERUdFTk9QVChQcm9maWxlSW5zdHIsIFByb2ZpbGVJbnN0cktpbmQsIDIsIFByb2ZpbGVOb25lKQorLy8vIFxicmllZiBDaG9vc2UgcHJvZmlsZSBraW5kIGZvciBQR08gdXNlIGNvbXBpbGF0aW9uLgorRU5VTV9DT0RFR0VOT1BUKFByb2ZpbGVVc2UsIFByb2ZpbGVJbnN0cktpbmQsIDIsIFByb2ZpbGVOb25lKQorQ09ERUdFTk9QVChDb3ZlcmFnZU1hcHBpbmcgLCAxLCAwKSAvLy88IEdlbmVyYXRlIGNvdmVyYWdlIG1hcHBpbmcgcmVnaW9ucyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGVuYWJsZSBjb2RlIGNvdmVyYWdlIGFuYWx5c2lzLgorQ09ERUdFTk9QVChEdW1wQ292ZXJhZ2VNYXBwaW5nICwgMSwgMCkgLy8vPCBEdW1wIHRoZSBnZW5lcmF0ZWQgY292ZXJhZ2UgbWFwcGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCByZWdpb25zLgorCisgIC8vLyBJZiAtZnBjYy1zdHJ1Y3QtcmV0dXJuIG9yIC1mcmVnLXN0cnVjdC1yZXR1cm4gaXMgc3BlY2lmaWVkLgorRU5VTV9DT0RFR0VOT1BUKFN0cnVjdFJldHVybkNvbnZlbnRpb24sIFN0cnVjdFJldHVybkNvbnZlbnRpb25LaW5kLCAyLCBTUkNLX0RlZmF1bHQpCisKK0NPREVHRU5PUFQoUmVsYXhBbGwgICAgICAgICAgLCAxLCAwKSAvLy88IFJlbGF4IGFsbCBtYWNoaW5lIGNvZGUgaW5zdHJ1Y3Rpb25zLgorQ09ERUdFTk9QVChSZWxheGVkQWxpYXNpbmcgICAsIDEsIDApIC8vLzwgU2V0IHdoZW4gLWZuby1zdHJpY3QtYWxpYXNpbmcgaXMgZW5hYmxlZC4KK0NPREVHRU5PUFQoU3RydWN0UGF0aFRCQUEgICAgLCAxLCAwKSAvLy88IFdoZXRoZXIgb3Igbm90IHRvIHVzZSBzdHJ1Y3QtcGF0aCBUQkFBLgorQ09ERUdFTk9QVChOZXdTdHJ1Y3RQYXRoVEJBQSAsIDEsIDApIC8vLzwgV2hldGhlciBvciBub3QgdG8gdXNlIGVuaGFuY2VkIHN0cnVjdC1wYXRoIFRCQUEuCitDT0RFR0VOT1BUKFNhdmVUZW1wTGFiZWxzICAgICwgMSwgMCkgLy8vPCBTYXZlIHRlbXBvcmFyeSBsYWJlbHMuCitDT0RFR0VOT1BUKFNhbml0aXplQWRkcmVzc1VzZUFmdGVyU2NvcGUgLCAxLCAwKSAvLy88IEVuYWJsZSB1c2UtYWZ0ZXItc2NvcGUgZGV0ZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGluIEFkZHJlc3NTYW5pdGl6ZXIKK0NPREVHRU5PUFQoU2FuaXRpemVBZGRyZXNzUG9pc29uQ2xhc3NNZW1iZXJBcnJheU5ld0Nvb2tpZSwgMSwKKyAgICAgICAgICAgMCkgLy8vPCBFbmFibGUgcG9pc29uaW5nIG9wZXJhdG9yIG5ld1tdIHdoaWNoIGlzIG5vdCBhIHJlcGxhY2VhYmxlCisgICAgICAgICAgICAgIC8vLzwgZ2xvYmFsIGFsbG9jYXRpb24gZnVuY3Rpb24gaW4gQWRkcmVzc1Nhbml0aXplcgorQ09ERUdFTk9QVChTYW5pdGl6ZUFkZHJlc3NHbG9iYWxzRGVhZFN0cmlwcGluZywgMSwgMCkgLy8vPCBFbmFibGUgbGlua2VyIGRlYWQgc3RyaXBwaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG9mIGdsb2JhbHMgaW4gQWRkcmVzc1Nhbml0aXplcgorQ09ERUdFTk9QVChTYW5pdGl6ZU1lbW9yeVRyYWNrT3JpZ2lucywgMiwgMCkgLy8vPCBFbmFibGUgdHJhY2tpbmcgb3JpZ2lucyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNZW1vcnlTYW5pdGl6ZXIKK0NPREVHRU5PUFQoU2FuaXRpemVNZW1vcnlVc2VBZnRlckR0b3IsIDEsIDApIC8vLzwgRW5hYmxlIHVzZS1hZnRlci1kZWxldGUgZGV0ZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGluIE1lbW9yeVNhbml0aXplcgorQ09ERUdFTk9QVChTYW5pdGl6ZUNmaUNyb3NzRHNvLCAxLCAwKSAvLy88IEVuYWJsZSBjcm9zcy1kc28gc3VwcG9ydCBpbiBDRkkuCitDT0RFR0VOT1BUKFNhbml0aXplTWluaW1hbFJ1bnRpbWUsIDEsIDApIC8vLzwgVXNlICJfbWluaW1hbCIgc2FuaXRpemVyIHJ1bnRpbWUgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZGlhZ25vc3RpY3MuCitDT0RFR0VOT1BUKFNhbml0aXplQ2ZpSUNhbGxHZW5lcmFsaXplUG9pbnRlcnMsIDEsIDApIC8vLzwgR2VuZXJhbGl6ZSBwb2ludGVyIHR5cGVzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQ0ZJIGljYWxsIGZ1bmN0aW9uIHNpZ25hdHVyZXMKK0NPREVHRU5PUFQoU2FuaXRpemVDb3ZlcmFnZVR5cGUsIDIsIDApIC8vLzwgVHlwZSBvZiBzYW5pdGl6ZXIgY292ZXJhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW5zdHJ1bWVudGF0aW9uLgorQ09ERUdFTk9QVChTYW5pdGl6ZUNvdmVyYWdlSW5kaXJlY3RDYWxscywgMSwgMCkgLy8vPCBFbmFibGUgc2FuaXRpemVyIGNvdmVyYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGZvciBpbmRpcmVjdCBjYWxscy4KK0NPREVHRU5PUFQoU2FuaXRpemVDb3ZlcmFnZVRyYWNlQkIsIDEsIDApIC8vLzwgRW5hYmxlIGJhc2ljIGJsb2NrIHRyYWNpbmcgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW4gc2FuaXRpemVyIGNvdmVyYWdlLgorQ09ERUdFTk9QVChTYW5pdGl6ZUNvdmVyYWdlVHJhY2VDbXAsIDEsIDApIC8vLzwgRW5hYmxlIGNtcCBpbnN0cnVjdGlvbiB0cmFjaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBpbiBzYW5pdGl6ZXIgY292ZXJhZ2UuCitDT0RFR0VOT1BUKFNhbml0aXplQ292ZXJhZ2VUcmFjZURpdiwgMSwgMCkgLy8vPCBFbmFibGUgZGl2IGluc3RydWN0aW9uIHRyYWNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGluIHNhbml0aXplciBjb3ZlcmFnZS4KK0NPREVHRU5PUFQoU2FuaXRpemVDb3ZlcmFnZVRyYWNlR2VwLCAxLCAwKSAvLy88IEVuYWJsZSBHRVAgaW5zdHJ1Y3Rpb24gdHJhY2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW4gc2FuaXRpemVyIGNvdmVyYWdlLgorQ09ERUdFTk9QVChTYW5pdGl6ZUNvdmVyYWdlOGJpdENvdW50ZXJzLCAxLCAwKSAvLy88IFVzZSA4LWJpdCBmcmVxdWVuY3kgY291bnRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBpbiBzYW5pdGl6ZXIgY292ZXJhZ2UuCitDT0RFR0VOT1BUKFNhbml0aXplQ292ZXJhZ2VUcmFjZVBDLCAxLCAwKSAvLy88IEVuYWJsZSBQQyB0cmFjaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGluIHNhbml0aXplciBjb3ZlcmFnZS4KK0NPREVHRU5PUFQoU2FuaXRpemVDb3ZlcmFnZVRyYWNlUENHdWFyZCwgMSwgMCkgLy8vPCBFbmFibGUgUEMgdHJhY2luZyB3aXRoIGd1YXJkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW4gc2FuaXRpemVyIGNvdmVyYWdlLgorQ09ERUdFTk9QVChTYW5pdGl6ZUNvdmVyYWdlSW5saW5lOGJpdENvdW50ZXJzLCAxLCAwKSAvLy88IFVzZSBpbmxpbmUgOGJpdCBjb3VudGVycy4KK0NPREVHRU5PUFQoU2FuaXRpemVDb3ZlcmFnZVBDVGFibGUsIDEsIDApIC8vLzwgQ3JlYXRlIGEgUEMgVGFibGUuCitDT0RFR0VOT1BUKFNhbml0aXplQ292ZXJhZ2VOb1BydW5lLCAxLCAwKSAvLy88IERpc2FibGUgY292ZXJhZ2UgcHJ1bmluZy4KK0NPREVHRU5PUFQoU2FuaXRpemVDb3ZlcmFnZVN0YWNrRGVwdGgsIDEsIDApIC8vLzwgRW5hYmxlIG1heCBzdGFjayBkZXB0aCB0cmFjaW5nCitDT0RFR0VOT1BUKFNhbml0aXplU3RhdHMgICAgICwgMSwgMCkgLy8vPCBDb2xsZWN0IHN0YXRpc3RpY3MgZm9yIHNhbml0aXplcnMuCitDT0RFR0VOT1BUKFNpbXBsaWZ5TGliQ2FsbHMgICwgMSwgMSkgLy8vPCBTZXQgd2hlbiAtZmJ1aWx0aW4gaXMgZW5hYmxlZC4KK0NPREVHRU5PUFQoU29mdEZsb2F0ICAgICAgICAgLCAxLCAwKSAvLy88IC1zb2Z0LWZsb2F0LgorQ09ERUdFTk9QVChGaW5lR3JhaW5lZEJpdGZpZWxkQWNjZXNzZXMsIDEsIDApIC8vLzwgRW5hYmxlIGZpbmUtZ3JhaW5lZCBiaXRmaWVsZCBhY2Nlc3Nlcy4KK0NPREVHRU5PUFQoU3RyaWN0RW51bXMgICAgICAgLCAxLCAwKSAvLy88IE9wdGltaXplIGJhc2VkIG9uIHN0cmljdCBlbnVtIGRlZmluaXRpb24uCitDT0RFR0VOT1BUKFN0cmljdFZUYWJsZVBvaW50ZXJzLCAxLCAwKSAvLy88IE9wdGltaXplIGJhc2VkIG9uIHRoZSBzdHJpY3QgdnRhYmxlIHBvaW50ZXJzCitDT0RFR0VOT1BUKFRpbWVQYXNzZXMgICAgICAgICwgMSwgMCkgLy8vPCBTZXQgd2hlbiAtZnRpbWUtcmVwb3J0IGlzIGVuYWJsZWQuCitDT0RFR0VOT1BUKFVucm9sbExvb3BzICAgICAgICwgMSwgMCkgLy8vPCBDb250cm9sIHdoZXRoZXIgbG9vcHMgYXJlIHVucm9sbGVkLgorQ09ERUdFTk9QVChSZXJvbGxMb29wcyAgICAgICAsIDEsIDApIC8vLzwgQ29udHJvbCB3aGV0aGVyIGxvb3BzIGFyZSByZXJvbGxlZC4KK0NPREVHRU5PUFQoTm9Vc2VKdW1wVGFibGVzICAgLCAxLCAwKSAvLy88IFNldCB3aGVuIC1mbm8tanVtcC10YWJsZXMgaXMgZW5hYmxlZC4KK0NPREVHRU5PUFQoVW5zYWZlRlBNYXRoICAgICAgLCAxLCAwKSAvLy88IEFsbG93IHVuc2FmZSBmbG9hdGluZyBwb2ludCBvcHR6bnMuCitDT0RFR0VOT1BUKFVud2luZFRhYmxlcyAgICAgICwgMSwgMCkgLy8vPCBFbWl0IHVud2luZCB0YWJsZXMuCitDT0RFR0VOT1BUKFZlY3Rvcml6ZUxvb3AgICAgICwgMSwgMCkgLy8vPCBSdW4gbG9vcCB2ZWN0b3JpemVyLgorQ09ERUdFTk9QVChWZWN0b3JpemVTTFAgICAgICAsIDEsIDApIC8vLzwgUnVuIFNMUCB2ZWN0b3JpemVyLgorQ09ERUdFTk9QVChQcm9maWxlU2FtcGxlQWNjdXJhdGUsIDEsIDApIC8vLzwgU2FtcGxlIHByb2ZpbGUgaXMgYWNjdXJhdGUuCisKKyAgLy8vIEF0dGVtcHQgdG8gdXNlIHJlZ2lzdGVyIHNpemVkIGFjY2Vzc2VzIHRvIGJpdC1maWVsZHMgaW4gc3RydWN0dXJlcywgd2hlbgorICAvLy8gcG9zc2libGUuCitDT0RFR0VOT1BUKFVzZVJlZ2lzdGVyU2l6ZWRCaXRmaWVsZEFjY2VzcyAsIDEsIDApCisKK0NPREVHRU5PUFQoVmVyaWZ5TW9kdWxlICAgICAgLCAxLCAxKSAvLy88IENvbnRyb2wgd2hldGhlciB0aGUgbW9kdWxlIHNob3VsZCBiZSBydW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHRocm91Z2ggdGhlIExMVk0gVmVyaWZpZXIuCisKK0NPREVHRU5PUFQoU3RhY2tSZWFsaWdubWVudCAgLCAxLCAwKSAvLy88IENvbnRyb2wgd2hldGhlciB0byBmb3JjZSBzdGFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcmVhbGlnbm1lbnQuCitDT0RFR0VOT1BUKFVzZUluaXRBcnJheSAgICAgICwgMSwgMCkgLy8vPCBDb250cm9sIHdoZXRoZXIgdG8gdXNlIC5pbml0X2FycmF5IG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCAuY3RvcnMuCitWQUxVRV9DT0RFR0VOT1BUKFN0YWNrQWxpZ25tZW50ICAgICwgMzIsIDApIC8vLzwgT3ZlcnJpZGVzIGRlZmF1bHQgc3RhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBhbGlnbm1lbnQsIGlmIG5vdCAwLgorVkFMVUVfQ09ERUdFTk9QVChTdGFja1Byb2JlU2l6ZSAgICAsIDMyLCA0MDk2KSAvLy88IE92ZXJyaWRlcyBkZWZhdWx0IHN0YWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcHJvYmUgc2l6ZSwgZXZlbiBpZiAwLgorQ09ERUdFTk9QVChOb1N0YWNrQXJnUHJvYmUsIDEsIDApIC8vLzwgU2V0IHdoZW4gLW1uby1zdGFjay1hcmctcHJvYmUgaXMgdXNlZAorQ09ERUdFTk9QVChEZWJ1Z0NvbHVtbkluZm8sIDEsIDApIC8vLzwgV2hldGhlciBvciBub3QgdG8gdXNlIGNvbHVtbiBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW4gZGVidWcgaW5mby4KKworQ09ERUdFTk9QVChEZWJ1Z1R5cGVFeHRSZWZzLCAxLCAwKSAvLy88IFdoZXRoZXIgb3Igbm90IGRlYnVnIGluZm8gc2hvdWxkIGNvbnRhaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBleHRlcm5hbCByZWZlcmVuY2VzIHRvIGEgUENIIG9yIG1vZHVsZS4KKworQ09ERUdFTk9QVChEZWJ1Z0V4cGxpY2l0SW1wb3J0LCAxLCAwKSAgLy8vPCBXaGV0aGVyIG9yIG5vdCBkZWJ1ZyBpbmZvIHNob3VsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjb250YWluIGV4cGxpY2l0IGltcG9ydHMgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGFub255bW91cyBuYW1lc3BhY2VzCitDT0RFR0VOT1BUKEVuYWJsZVNwbGl0RHdhcmYsIDEsIDApIC8vLzwgV2hldGhlciB0byBlbmFibGUgc3BsaXQgRFdBUkYKK0NPREVHRU5PUFQoU3BsaXREd2FyZklubGluaW5nLCAxLCAxKSAvLy88IFdoZXRoZXIgdG8gaW5jbHVkZSBpbmxpbmluZyBpbmZvIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgc2tlbGV0b24gQ1UgdG8gYWxsb3cgZm9yIHN5bWJvbGljYXRpb24KKwkJCQkgICAgIC8vLzwgb2YgaW5saW5lIHN0YWNrIGZyYW1lcyB3aXRob3V0IC5kd28gZmlsZXMuCitDT0RFR0VOT1BUKERlYnVnRndkVGVtcGxhdGVQYXJhbXMsIDEsIDApIC8vLzwgV2hldGhlciB0byBlbWl0IGNvbXBsZXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgdGVtcGxhdGUgcGFyYW1ldGVyIGRlc2NyaXB0aW9ucyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGZvcndhcmQgZGVjbGFyYXRpb25zICh2ZXJzdXMganVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGluY2x1ZGluZyB0aGVtIGluIHRoZSBuYW1lKS4KKworQ09ERUdFTk9QVChFbWl0TExWTVVzZUxpc3RzLCAxLCAwKSAvLy88IENvbnRyb2wgd2hldGhlciB0byBzZXJpYWxpemUgdXNlLWxpc3RzLgorCitDT0RFR0VOT1BUKFdob2xlUHJvZ3JhbVZUYWJsZXMsIDEsIDApIC8vLzwgV2hldGhlciB0byBhcHBseSB3aG9sZS1wcm9ncmFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyAgdnRhYmxlIG9wdGltaXphdGlvbi4KKworLy8vIFdoZXRoZXIgdG8gdXNlIHB1YmxpYyBMVE8gdmlzaWJpbGl0eSBmb3IgZW50aXRpZXMgaW4gc3RkIGFuZCBzdGRleHQKKy8vLyBuYW1lc3BhY2VzLiBUaGlzIGlzIGVuYWJsZWQgYnkgY2xhbmctY2wncyAvTVQgYW5kIC9NVGQgZmxhZ3MuCitDT0RFR0VOT1BUKExUT1Zpc2liaWxpdHlQdWJsaWNTdGQsIDEsIDApCisKKy8vLyBUaGUgdXNlciBzcGVjaWZpZWQgbnVtYmVyIG9mIHJlZ2lzdGVycyB0byBiZSB1c2VkIGZvciBpbnRlZ3JhbCBhcmd1bWVudHMsCisvLy8gb3IgMCBpZiB1bnNwZWNpZmllZC4KK1ZBTFVFX0NPREVHRU5PUFQoTnVtUmVnaXN0ZXJQYXJhbWV0ZXJzLCAzMiwgMCkKKworLy8vIFRoZSBsb3dlciBib3VuZCBmb3IgYSBidWZmZXIgdG8gYmUgY29uc2lkZXJlZCBmb3Igc3RhY2sgcHJvdGVjdGlvbi4KK1ZBTFVFX0NPREVHRU5PUFQoU1NQQnVmZmVyU2l6ZSwgMzIsIDApCisKKy8vLyBUaGUga2luZCBvZiBnZW5lcmF0ZWQgZGVidWcgaW5mby4KK0VOVU1fQ09ERUdFTk9QVChEZWJ1Z0luZm8sIGNvZGVnZW5vcHRpb25zOjpEZWJ1Z0luZm9LaW5kLCAzLCBjb2RlZ2Vub3B0aW9uczo6Tm9EZWJ1Z0luZm8pCisKKy8vLyBXaGV0aGVyIHRvIGdlbmVyYXRlIG1hY3JvIGRlYnVnIGluZm8uCitDT0RFR0VOT1BUKE1hY3JvRGVidWdJbmZvLCAxLCAwKQorCisvLy8gVHVuZSB0aGUgZGVidWcgaW5mbyBmb3IgdGhpcyBkZWJ1Z2dlci4KK0VOVU1fQ09ERUdFTk9QVChEZWJ1Z2dlclR1bmluZywgbGx2bTo6RGVidWdnZXJLaW5kLCAyLAorICAgICAgICAgICAgICAgIGxsdm06OkRlYnVnZ2VyS2luZDo6RGVmYXVsdCkKKworLy8vIER3YXJmIHZlcnNpb24uIFZlcnNpb24gemVybyBpbmRpY2F0ZXMgdG8gTExWTSB0aGF0IG5vIERXQVJGIHNob3VsZCBiZQorLy8vIGVtaXR0ZWQuCitWQUxVRV9DT0RFR0VOT1BUKER3YXJmVmVyc2lvbiwgMywgMCkKKworLy8vIFdoZXRoZXIgd2Ugc2hvdWxkIGVtaXQgQ29kZVZpZXcgZGVidWcgaW5mb3JtYXRpb24uIEl0J3MgcG9zc2libGUgdG8gZW1pdAorLy8vIENvZGVWaWV3IGFuZCBEV0FSRiBpbnRvIHRoZSBzYW1lIG9iamVjdC4KK0NPREVHRU5PUFQoRW1pdENvZGVWaWV3LCAxLCAwKQorCisvLy8gVGhlIGtpbmQgb2YgaW5saW5pbmcgdG8gcGVyZm9ybS4KK0VOVU1fQ09ERUdFTk9QVChJbmxpbmluZywgSW5saW5pbmdNZXRob2QsIDIsIE5vcm1hbElubGluaW5nKQorCisvLyBWZWN0b3IgZnVuY3Rpb25zIGxpYnJhcnkgdG8gdXNlLgorRU5VTV9DT0RFR0VOT1BUKFZlY0xpYiwgVmVjdG9yTGlicmFyeSwgMiwgTm9MaWJyYXJ5KQorCisvLy8gVGhlIGRlZmF1bHQgVExTIG1vZGVsIHRvIHVzZS4KK0VOVU1fQ09ERUdFTk9QVChEZWZhdWx0VExTTW9kZWwsIFRMU01vZGVsLCAyLCBHZW5lcmFsRHluYW1pY1RMU01vZGVsKQorCisvLy8gTnVtYmVyIG9mIHBhdGggY29tcG9uZW50cyB0byBzdHJpcCB3aGVuIGVtaXR0aW5nIGNoZWNrcy4gKDAgPT0gZnVsbAorLy8vIGZpbGVuYW1lKQorVkFMVUVfQ09ERUdFTk9QVChFbWl0Q2hlY2tQYXRoQ29tcG9uZW50c1RvU3RyaXAsIDMyLCAwKQorCisvLy8gV2hldGhlciB0byByZXBvcnQgdGhlIGhvdG5lc3Mgb2YgdGhlIGNvZGUgcmVnaW9uIGZvciBvcHRpbWl6YXRpb24gcmVtYXJrcy4KK0NPREVHRU5PUFQoRGlhZ25vc3RpY3NXaXRoSG90bmVzcywgMSwgMCkKKworLy8vIFRoZSBtaW5pbXVtIGhvdG5lc3MgdmFsdWUgYSBkaWFnbm9zdGljIG5lZWRzIGluIG9yZGVyIHRvIGJlIGluY2x1ZGVkIGluCisvLy8gb3B0aW1pemF0aW9uIGRpYWdub3N0aWNzLgorVkFMVUVfQ09ERUdFTk9QVChEaWFnbm9zdGljc0hvdG5lc3NUaHJlc2hvbGQsIDMyLCAwKQorCisvLy8gV2hldGhlciBjb3B5IHJlbG9jYXRpb25zIHN1cHBvcnQgaXMgYXZhaWxhYmxlIHdoZW4gYnVpbGRpbmcgYXMgUElFLgorQ09ERUdFTk9QVChQSUVDb3B5UmVsb2NhdGlvbnMsIDEsIDApCisKKy8vLyBXaGV0aGVyIHdlIHNob3VsZCB1c2UgdGhlIHVuZGVmaW5lZCBiZWhhdmlvdXIgb3B0aW1pemF0aW9uIGZvciBjb250cm9sIGZsb3cKKy8vLyBwYXRocyB0aGF0IHJlYWNoIHRoZSBlbmQgb2YgYSBmdW5jdGlvbiB3aXRob3V0IGV4ZWN1dGluZyBhIHJlcXVpcmVkIHJldHVybi4KK0NPREVHRU5PUFQoU3RyaWN0UmV0dXJuLCAxLCAxKQorCisvLy8gV2hldGhlciBlbWl0IGV4dHJhIGRlYnVnIGluZm8gZm9yIHNhbXBsZSBwZ28gcHJvZmlsZSBjb2xsZWN0aW9uLgorQ09ERUdFTk9QVChEZWJ1Z0luZm9Gb3JQcm9maWxpbmcsIDEsIDApCisKKy8vLyBXaGV0aGVyIDMtY29tcG9uZW50IHZlY3RvciB0eXBlIGlzIHByZXNlcnZlZC4KK0NPREVHRU5PUFQoUHJlc2VydmVWZWMzVHlwZSwgMSwgMCkKKworLy8vIFdoZXRoZXIgdG8gZW1pdCAuZGVidWdfZ251X3B1Ym5hbWVzIHNlY3Rpb24gaW5zdGVhZCBvZiAuZGVidWdfcHVibmFtZXMuCitDT0RFR0VOT1BUKEdudVB1Ym5hbWVzLCAxLCAwKQorCitDT0RFR0VOT1BUKE5vUExULCAxLCAwKQorCisvLy8gV2hldGhlciB0byBlbWJlZCBzb3VyY2UgaW4gRFdBUkYgZGVidWcgbGluZSBzZWN0aW9uLgorQ09ERUdFTk9QVChFbWJlZFNvdXJjZSwgMSwgMCkKKworI3VuZGVmIENPREVHRU5PUFQKKyN1bmRlZiBFTlVNX0NPREVHRU5PUFQKKyN1bmRlZiBWQUxVRV9DT0RFR0VOT1BUCisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0NvZGVHZW5PcHRpb25zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Db2RlR2VuT3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMmU5YmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Db2RlR2VuT3B0aW9ucy5oCkBAIC0wLDAgKzEsMzAzIEBACisvLz09PS0tLSBDb2RlR2VuT3B0aW9ucy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQ29kZUdlbk9wdGlvbnMgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19GUk9OVEVORF9DT0RFR0VOT1BUSU9OU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfRlJPTlRFTkRfQ09ERUdFTk9QVElPTlNfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGVidWdJbmZvT3B0aW9ucy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Nhbml0aXplcnMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29kZUdlbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9SZWdleC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKKy8vLyBcYnJpZWYgQml0ZmllbGRzIG9mIENvZGVHZW5PcHRpb25zLCBzcGxpdCBvdXQgZnJvbSBDb2RlR2VuT3B0aW9ucyB0byBlbnN1cmUKKy8vLyB0aGF0IHRoaXMgbGFyZ2UgY29sbGVjdGlvbiBvZiBiaXRmaWVsZHMgaXMgYSB0cml2aWFsIGNsYXNzIHR5cGUuCitjbGFzcyBDb2RlR2VuT3B0aW9uc0Jhc2UgeworcHVibGljOgorI2RlZmluZSBDT0RFR0VOT1BUKE5hbWUsIEJpdHMsIERlZmF1bHQpIHVuc2lnbmVkIE5hbWUgOiBCaXRzOworI2RlZmluZSBFTlVNX0NPREVHRU5PUFQoTmFtZSwgVHlwZSwgQml0cywgRGVmYXVsdCkKKyNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Db2RlR2VuT3B0aW9ucy5kZWYiCisKK3Byb3RlY3RlZDoKKyNkZWZpbmUgQ09ERUdFTk9QVChOYW1lLCBCaXRzLCBEZWZhdWx0KQorI2RlZmluZSBFTlVNX0NPREVHRU5PUFQoTmFtZSwgVHlwZSwgQml0cywgRGVmYXVsdCkgdW5zaWduZWQgTmFtZSA6IEJpdHM7CisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvQ29kZUdlbk9wdGlvbnMuZGVmIgorfTsKKworLy8vIENvZGVHZW5PcHRpb25zIC0gVHJhY2sgdmFyaW91cyBvcHRpb25zIHdoaWNoIGNvbnRyb2wgaG93IHRoZSBjb2RlCisvLy8gaXMgb3B0aW1pemVkIGFuZCBwYXNzZWQgdG8gdGhlIGJhY2tlbmQuCitjbGFzcyBDb2RlR2VuT3B0aW9ucyA6IHB1YmxpYyBDb2RlR2VuT3B0aW9uc0Jhc2UgeworcHVibGljOgorICBlbnVtIElubGluaW5nTWV0aG9kIHsKKyAgICBOb3JtYWxJbmxpbmluZywgICAgIC8vIFVzZSB0aGUgc3RhbmRhcmQgZnVuY3Rpb24gaW5saW5pbmcgcGFzcy4KKyAgICBPbmx5SGludElubGluaW5nLCAgIC8vIElubGluZSBvbmx5IChpbXBsaWNpdGx5KSBoaW50ZWQgZnVuY3Rpb25zLgorICAgIE9ubHlBbHdheXNJbmxpbmluZyAgLy8gT25seSBydW4gdGhlIGFsd2F5cyBpbmxpbmluZyBwYXNzLgorICB9OworCisgIGVudW0gVmVjdG9yTGlicmFyeSB7CisgICAgTm9MaWJyYXJ5LCAgLy8gRG9uJ3QgdXNlIGFueSB2ZWN0b3IgbGlicmFyeS4KKyAgICBBY2NlbGVyYXRlLCAvLyBVc2UgdGhlIEFjY2VsZXJhdGUgZnJhbWV3b3JrLgorICAgIFNWTUwgICAgICAgIC8vIEludGVsIHNob3J0IHZlY3RvciBtYXRoIGxpYnJhcnkuCisgIH07CisKKworICBlbnVtIE9iakNEaXNwYXRjaE1ldGhvZEtpbmQgeworICAgIExlZ2FjeSA9IDAsCisgICAgTm9uTGVnYWN5ID0gMSwKKyAgICBNaXhlZCA9IDIKKyAgfTsKKworICBlbnVtIFRMU01vZGVsIHsKKyAgICBHZW5lcmFsRHluYW1pY1RMU01vZGVsLAorICAgIExvY2FsRHluYW1pY1RMU01vZGVsLAorICAgIEluaXRpYWxFeGVjVExTTW9kZWwsCisgICAgTG9jYWxFeGVjVExTTW9kZWwKKyAgfTsKKworICAvLy8gQ2xhbmcgdmVyc2lvbnMgd2l0aCBkaWZmZXJlbnQgcGxhdGZvcm0gQUJJIGNvbmZvcm1hbmNlLgorICBlbnVtIGNsYXNzIENsYW5nQUJJIHsKKyAgICAvLy8gQXR0ZW1wdCB0byBiZSBBQkktY29tcGF0aWJsZSB3aXRoIGNvZGUgZ2VuZXJhdGVkIGJ5IENsYW5nIDMuOC54CisgICAgLy8vIChTVk4gcjI1NzYyNikuIFRoaXMgY2F1c2VzIDwxIHggbG9uZyBsb25nPiB0byBiZSBwYXNzZWQgaW4gYW4KKyAgICAvLy8gaW50ZWdlciByZWdpc3RlciBpbnN0ZWFkIG9mIGFuIFNTRSByZWdpc3RlciBvbiB4NjRfNjQuCisgICAgVmVyM184LAorCisgICAgLy8vIEF0dGVtcHQgdG8gYmUgQUJJLWNvbXBhdGlibGUgd2l0aCBjb2RlIGdlbmVyYXRlZCBieSBDbGFuZyA0LjAueAorICAgIC8vLyAoU1ZOIHIyOTE4MTQpLiBUaGlzIGNhdXNlcyBtb3ZlIG9wZXJhdGlvbnMgdG8gYmUgaWdub3JlZCB3aGVuCisgICAgLy8vIGRldGVybWluaW5nIHdoZXRoZXIgYSBjbGFzcyB0eXBlIGNhbiBiZSBwYXNzZWQgb3IgcmV0dXJuZWQgZGlyZWN0bHkuCisgICAgVmVyNCwKKworICAgIC8vLyBDb25mb3JtIHRvIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3JtJ3MgQyBhbmQgQysrIEFCSXMgYXMgY2xvc2VseQorICAgIC8vLyBhcyB3ZSBjYW4uCisgICAgTGF0ZXN0CisgIH07CisKKyAgZW51bSBTdHJ1Y3RSZXR1cm5Db252ZW50aW9uS2luZCB7CisgICAgU1JDS19EZWZhdWx0LCAgLy8gTm8gc3BlY2lhbCBvcHRpb24gd2FzIHBhc3NlZC4KKyAgICBTUkNLX09uU3RhY2ssICAvLyBTbWFsbCBzdHJ1Y3RzIG9uIHRoZSBzdGFjayAoLWZwY2Mtc3RydWN0LXJldHVybikuCisgICAgU1JDS19JblJlZ3MgICAgLy8gU21hbGwgc3RydWN0cyBpbiByZWdpc3RlcnMgKC1mcmVnLXN0cnVjdC1yZXR1cm4pLgorICB9OworCisgIGVudW0gUHJvZmlsZUluc3RyS2luZCB7CisgICAgUHJvZmlsZU5vbmUsICAgICAgIC8vIFByb2ZpbGUgaW5zdHJ1bWVudGF0aW9uIGlzIHR1cm5lZCBvZmYuCisgICAgUHJvZmlsZUNsYW5nSW5zdHIsIC8vIENsYW5nIGluc3RydW1lbnRhdGlvbiB0byBnZW5lcmF0ZSBleGVjdXRpb24gY291bnRzCisgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHVzZSB3aXRoIFBHTy4KKyAgICBQcm9maWxlSVJJbnN0ciwgICAgLy8gSVIgbGV2ZWwgUEdPIGluc3RydW1lbnRhdGlvbiBpbiBMTFZNLgorICB9OworCisgIGVudW0gRW1iZWRCaXRjb2RlS2luZCB7CisgICAgRW1iZWRfT2ZmLCAgICAgIC8vIE5vIGVtYmVkZGVkIGJpdGNvZGUuCisgICAgRW1iZWRfQWxsLCAgICAgIC8vIEVtYmVkIGJvdGggYml0Y29kZSBhbmQgY29tbWFuZGxpbmUgaW4gdGhlIG91dHB1dC4KKyAgICBFbWJlZF9CaXRjb2RlLCAgLy8gRW1iZWQganVzdCB0aGUgYml0Y29kZSBpbiB0aGUgb3V0cHV0LgorICAgIEVtYmVkX01hcmtlciAgICAvLyBFbWJlZCBhIG1hcmtlciBhcyBhIHBsYWNlaG9sZGVyIGZvciBiaXRjb2RlLgorICB9OworCisgIC8vLyBUaGUgY29kZSBtb2RlbCB0byB1c2UgKC1tY21vZGVsKS4KKyAgc3RkOjpzdHJpbmcgQ29kZU1vZGVsOworCisgIC8vLyBUaGUgZmlsZW5hbWUgd2l0aCBwYXRoIHdlIHVzZSBmb3IgY292ZXJhZ2UgZGF0YSBmaWxlcy4gVGhlIHJ1bnRpbWUKKyAgLy8vIGFsbG93cyBmdXJ0aGVyIG1hbmlwdWxhdGlvbiB3aXRoIHRoZSBHQ09WX1BSRUZJWCBhbmQgR0NPVl9QUkVGSVhfU1RSSVAKKyAgLy8vIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKyAgc3RkOjpzdHJpbmcgQ292ZXJhZ2VEYXRhRmlsZTsKKworICAvLy8gVGhlIGZpbGVuYW1lIHdpdGggcGF0aCB3ZSB1c2UgZm9yIGNvdmVyYWdlIG5vdGVzIGZpbGVzLgorICBzdGQ6OnN0cmluZyBDb3ZlcmFnZU5vdGVzRmlsZTsKKworICAvLy8gVGhlIHZlcnNpb24gc3RyaW5nIHRvIHB1dCBpbnRvIGNvdmVyYWdlIGZpbGVzLgorICBjaGFyIENvdmVyYWdlVmVyc2lvbls0XTsKKworICAvLy8gRW5hYmxlIGFkZGl0aW9uYWwgZGVidWdnaW5nIGluZm9ybWF0aW9uLgorICBzdGQ6OnN0cmluZyBEZWJ1Z1Bhc3M7CisKKyAgLy8vIFRoZSBzdHJpbmcgdG8gZW1iZWQgaW4gZGVidWcgaW5mb3JtYXRpb24gYXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisgIHN0ZDo6c3RyaW5nIERlYnVnQ29tcGlsYXRpb25EaXI7CisKKyAgLy8vIFRoZSBzdHJpbmcgdG8gZW1iZWQgaW4gdGhlIGRlYnVnIGluZm9ybWF0aW9uIGZvciB0aGUgY29tcGlsZSB1bml0LCBpZgorICAvLy8gbm9uLWVtcHR5LgorICBzdGQ6OnN0cmluZyBEd2FyZkRlYnVnRmxhZ3M7CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBEZWJ1Z1ByZWZpeE1hcDsKKworICAvLy8gVGhlIEFCSSB0byB1c2UgZm9yIHBhc3NpbmcgZmxvYXRpbmcgcG9pbnQgYXJndW1lbnRzLgorICBzdGQ6OnN0cmluZyBGbG9hdEFCSTsKKworICAvLy8gVGhlIGZsb2F0aW5nLXBvaW50IGRlbm9ybWFsIG1vZGUgdG8gdXNlLgorICBzdGQ6OnN0cmluZyBGUERlbm9ybWFsTW9kZTsKKworICAvLy8gVGhlIGZsb2F0IHByZWNpc2lvbiBsaW1pdCB0byB1c2UsIGlmIG5vbi1lbXB0eS4KKyAgc3RkOjpzdHJpbmcgTGltaXRGbG9hdFByZWNpc2lvbjsKKworICBzdHJ1Y3QgQml0Y29kZUZpbGVUb0xpbmsgeworICAgIC8vLyBUaGUgZmlsZW5hbWUgb2YgdGhlIGJpdGNvZGUgZmlsZSB0byBsaW5rIGluLgorICAgIHN0ZDo6c3RyaW5nIEZpbGVuYW1lOworICAgIC8vLyBJZiB0cnVlLCB3ZSBzZXQgYXR0cmlidXRlcyBmdW5jdGlvbnMgaW4gdGhlIGJpdGNvZGUgbGlicmFyeSBhY2NvcmRpbmcgdG8KKyAgICAvLy8gb3VyIENvZGVHZW5PcHRpb25zLCBtdWNoIGFzIHdlIHNldCBhdHRycyBvbiBmdW5jdGlvbnMgdGhhdCB3ZSBnZW5lcmF0ZQorICAgIC8vLyBvdXJzZWx2ZXMuCisgICAgYm9vbCBQcm9wYWdhdGVBdHRycyA9IGZhbHNlOworICAgIC8vLyBJZiB0cnVlLCB3ZSB1c2UgTExWTSBtb2R1bGUgaW50ZXJuYWxpemVyLgorICAgIGJvb2wgSW50ZXJuYWxpemUgPSBmYWxzZTsKKyAgICAvLy8gQml0d2lzZSBjb21iaW5hdGlvbiBvZiBsbHZtOjpMaW5rZXI6OkZsYWdzLCBwYXNzZWQgdG8gdGhlIExMVk0gbGlua2VyLgorICAgIHVuc2lnbmVkIExpbmtGbGFncyA9IDA7CisgIH07CisKKyAgLy8vIFRoZSBmaWxlcyBzcGVjaWZpZWQgaGVyZSBhcmUgbGlua2VkIGluIHRvIHRoZSBtb2R1bGUgYmVmb3JlIG9wdGltaXphdGlvbnMuCisgIHN0ZDo6dmVjdG9yPEJpdGNvZGVGaWxlVG9MaW5rPiBMaW5rQml0Y29kZUZpbGVzOworCisgIC8vLyBUaGUgdXNlciBwcm92aWRlZCBuYW1lIGZvciB0aGUgIm1haW4gZmlsZSIsIGlmIG5vbi1lbXB0eS4gVGhpcyBpcyB1c2VmdWwKKyAgLy8vIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhlIGlucHV0IGZpbGUgbmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUgb3JpZ2luYWwgaW5wdXQKKyAgLy8vIGZpbGUsIGZvciBleGFtcGxlIHdpdGggLXNhdmUtdGVtcHMuCisgIHN0ZDo6c3RyaW5nIE1haW5GaWxlTmFtZTsKKworICAvLy8gVGhlIG5hbWUgZm9yIHRoZSBzcGxpdCBkZWJ1ZyBpbmZvIGZpbGUgdGhhdCB3ZSdsbCBicmVhayBvdXQuIFRoaXMgaXMgdXNlZAorICAvLy8gaW4gdGhlIGJhY2tlbmQgZm9yIHNldHRpbmcgdGhlIG5hbWUgaW4gdGhlIHNrZWxldG9uIGN1LgorICBzdGQ6OnN0cmluZyBTcGxpdER3YXJmRmlsZTsKKworICAvLy8gVGhlIG5hbWUgb2YgdGhlIHJlbG9jYXRpb24gbW9kZWwgdG8gdXNlLgorICBsbHZtOjpSZWxvYzo6TW9kZWwgUmVsb2NhdGlvbk1vZGVsOworCisgIC8vLyBUaGUgdGhyZWFkIG1vZGVsIHRvIHVzZQorICBzdGQ6OnN0cmluZyBUaHJlYWRNb2RlbDsKKworICAvLy8gSWYgbm90IGFuIGVtcHR5IHN0cmluZywgdHJhcCBpbnRyaW5zaWNzIGFyZSBsb3dlcmVkIHRvIGNhbGxzIHRvIHRoaXMKKyAgLy8vIGZ1bmN0aW9uIGluc3RlYWQgb2YgdG8gdHJhcCBpbnN0cnVjdGlvbnMuCisgIHN0ZDo6c3RyaW5nIFRyYXBGdW5jTmFtZTsKKworICAvLy8gQSBsaXN0IG9mIGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIGZvcndhcmQgdG8gdGhlIExMVk0gYmFja2VuZC4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEJhY2tlbmRPcHRpb25zOworCisgIC8vLyBBIGxpc3Qgb2YgZGVwZW5kZW50IGxpYnJhcmllcy4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IERlcGVuZGVudExpYnJhcmllczsKKworICAvLy8gQSBsaXN0IG9mIGxpbmtlciBvcHRpb25zIHRvIGVtYmVkIGluIHRoZSBvYmplY3QgZmlsZS4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IExpbmtlck9wdGlvbnM7CisKKyAgLy8vIE5hbWUgb2YgdGhlIHByb2ZpbGUgZmlsZSB0byB1c2UgYXMgb3V0cHV0IGZvciAtZnByb2ZpbGUtaW5zdHItZ2VuZXJhdGUKKyAgLy8vIGFuZCAtZnByb2ZpbGUtZ2VuZXJhdGUuCisgIHN0ZDo6c3RyaW5nIEluc3RyUHJvZmlsZU91dHB1dDsKKworICAvLy8gTmFtZSBvZiB0aGUgcHJvZmlsZSBmaWxlIHRvIHVzZSB3aXRoIC1mcHJvZmlsZS1zYW1wbGUtdXNlLgorICBzdGQ6OnN0cmluZyBTYW1wbGVQcm9maWxlRmlsZTsKKworICAvLy8gTmFtZSBvZiB0aGUgcHJvZmlsZSBmaWxlIHRvIHVzZSBhcyBpbnB1dCBmb3IgLWZwcm9maWxlLWluc3RyLXVzZQorICBzdGQ6OnN0cmluZyBQcm9maWxlSW5zdHJ1bWVudFVzZVBhdGg7CisKKyAgLy8vIE5hbWUgb2YgdGhlIGZ1bmN0aW9uIHN1bW1hcnkgaW5kZXggZmlsZSB0byB1c2UgZm9yIFRoaW5MVE8gZnVuY3Rpb24KKyAgLy8vIGltcG9ydGluZy4KKyAgc3RkOjpzdHJpbmcgVGhpbkxUT0luZGV4RmlsZTsKKworICAvLy8gTmFtZSBvZiBhIGZpbGUgdGhhdCBjYW4gb3B0aW9uYWxseSBiZSB3cml0dGVuIHdpdGggbWluaW1pemVkIGJpdGNvZGUKKyAgLy8vIHRvIGJlIHVzZWQgYXMgaW5wdXQgZm9yIHRoZSBUaGluTFRPIHRoaW4gbGluayBzdGVwLCB3aGljaCBvbmx5IG5lZWRzCisgIC8vLyB0aGUgc3VtbWFyeSBhbmQgbW9kdWxlIHN5bWJvbCB0YWJsZSAoYW5kIG5vdCwgZS5nLiBhbnkgZGVidWcgbWV0YWRhdGEpLgorICBzdGQ6OnN0cmluZyBUaGluTGlua0JpdGNvZGVGaWxlOworCisgIC8vLyBOYW1lIG9mIGZpbGUgcGFzc2VkIHdpdGggLWZjdWRhLWluY2x1ZGUtZ3B1YmluYXJ5IG9wdGlvbiB0byBmb3J3YXJkIHRvCisgIC8vLyBDVURBIHJ1bnRpbWUgYmFjay1lbmQgZm9yIGluY29ycG9yYXRpbmcgdGhlbSBpbnRvIGhvc3Qtc2lkZSBvYmplY3QgZmlsZS4KKyAgc3RkOjpzdHJpbmcgQ3VkYUdwdUJpbmFyeUZpbGVOYW1lOworCisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byB3aGljaCB0aGUgYmFja2VuZCBzaG91bGQgc2F2ZSBZQU1MIG9wdGltaXphdGlvbgorICAvLy8gcmVjb3Jkcy4KKyAgc3RkOjpzdHJpbmcgT3B0UmVjb3JkRmlsZTsKKworICAvLy8gUmVndWxhciBleHByZXNzaW9uIHRvIHNlbGVjdCBvcHRpbWl6YXRpb25zIGZvciB3aGljaCB3ZSBzaG91bGQgZW5hYmxlCisgIC8vLyBvcHRpbWl6YXRpb24gcmVtYXJrcy4gVHJhbnNmb3JtYXRpb24gcGFzc2VzIHdob3NlIG5hbWUgbWF0Y2hlcyB0aGlzCisgIC8vLyBleHByZXNzaW9uIChhbmQgc3VwcG9ydCB0aGlzIGZlYXR1cmUpLCB3aWxsIGVtaXQgYSBkaWFnbm9zdGljCisgIC8vLyB3aGVuZXZlciB0aGV5IHBlcmZvcm0gYSB0cmFuc2Zvcm1hdGlvbi4gVGhpcyBpcyBlbmFibGVkIGJ5IHRoZQorICAvLy8gLVJwYXNzPXJlZ2V4cCBmbGFnLgorICBzdGQ6OnNoYXJlZF9wdHI8bGx2bTo6UmVnZXg+IE9wdGltaXphdGlvblJlbWFya1BhdHRlcm47CisKKyAgLy8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWxlY3Qgb3B0aW1pemF0aW9ucyBmb3Igd2hpY2ggd2Ugc2hvdWxkIGVuYWJsZQorICAvLy8gbWlzc2VkIG9wdGltaXphdGlvbiByZW1hcmtzLiBUcmFuc2Zvcm1hdGlvbiBwYXNzZXMgd2hvc2UgbmFtZSBtYXRjaGVzIHRoaXMKKyAgLy8vIGV4cHJlc3Npb24gKGFuZCBzdXBwb3J0IHRoaXMgZmVhdHVyZSksIHdpbGwgZW1pdCBhIGRpYWdub3N0aWMKKyAgLy8vIHdoZW5ldmVyIHRoZXkgdHJpZWQgYnV0IGZhaWxlZCB0byBwZXJmb3JtIGEgdHJhbnNmb3JtYXRpb24uIFRoaXMgaXMKKyAgLy8vIGVuYWJsZWQgYnkgdGhlIC1ScGFzcy1taXNzZWQ9cmVnZXhwIGZsYWcuCisgIHN0ZDo6c2hhcmVkX3B0cjxsbHZtOjpSZWdleD4gT3B0aW1pemF0aW9uUmVtYXJrTWlzc2VkUGF0dGVybjsKKworICAvLy8gUmVndWxhciBleHByZXNzaW9uIHRvIHNlbGVjdCBvcHRpbWl6YXRpb25zIGZvciB3aGljaCB3ZSBzaG91bGQgZW5hYmxlCisgIC8vLyBvcHRpbWl6YXRpb24gYW5hbHlzZXMuIFRyYW5zZm9ybWF0aW9uIHBhc3NlcyB3aG9zZSBuYW1lIG1hdGNoZXMgdGhpcworICAvLy8gZXhwcmVzc2lvbiAoYW5kIHN1cHBvcnQgdGhpcyBmZWF0dXJlKSwgd2lsbCBlbWl0IGEgZGlhZ25vc3RpYworICAvLy8gd2hlbmV2ZXIgdGhleSB3YW50IHRvIGV4cGxhaW4gd2h5IHRoZXkgZGVjaWRlZCB0byBhcHBseSBvciBub3QgYXBwbHkKKyAgLy8vIGEgZ2l2ZW4gdHJhbnNmb3JtYXRpb24uIFRoaXMgaXMgZW5hYmxlZCBieSB0aGUgLVJwYXNzLWFuYWx5c2lzPXJlZ2V4cAorICAvLy8gZmxhZy4KKyAgc3RkOjpzaGFyZWRfcHRyPGxsdm06OlJlZ2V4PiBPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpc1BhdHRlcm47CisKKyAgLy8vIFNldCBvZiBmaWxlcyBkZWZpbmluZyB0aGUgcnVsZXMgZm9yIHRoZSBzeW1ib2wgcmV3cml0aW5nLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gUmV3cml0ZU1hcEZpbGVzOworCisgIC8vLyBTZXQgb2Ygc2FuaXRpemVyIGNoZWNrcyB0aGF0IGFyZSBub24tZmF0YWwgKGkuZS4gZXhlY3V0aW9uIHNob3VsZCBiZQorICAvLy8gY29udGludWVkIHdoZW4gcG9zc2libGUpLgorICBTYW5pdGl6ZXJTZXQgU2FuaXRpemVSZWNvdmVyOworCisgIC8vLyBTZXQgb2Ygc2FuaXRpemVyIGNoZWNrcyB0aGF0IHRyYXAgcmF0aGVyIHRoYW4gZGlhZ25vc2UuCisgIFNhbml0aXplclNldCBTYW5pdGl6ZVRyYXA7CisKKyAgLy8vIExpc3Qgb2YgYmFja2VuZCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgLWZlbWJlZC1iaXRjb2RlLgorICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBDbWRBcmdzOworCisgIC8vLyBcYnJpZWYgQSBsaXN0IG9mIGFsbCAtZm5vLWJ1aWx0aW4tKiBmdW5jdGlvbiBuYW1lcyAoZS5nLiwgbWVtc2V0KS4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IE5vQnVpbHRpbkZ1bmNzOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBSZWNpcHJvY2FsczsKKworICAvLy8gVGhlIHByZWZlcnJlZCB3aWR0aCBmb3IgYXV0by12ZWN0b3JpemF0aW9uIHRyYW5zZm9ybXMuIFRoaXMgaXMgaW50ZW5kZWQgdG8KKyAgLy8vIG92ZXJyaWRlIGRlZmF1bHQgdHJhbnNmb3JtcyBiYXNlZCBvbiB0aGUgd2lkdGggb2YgdGhlIGFyY2hpdGVjdGVkIHZlY3RvcgorICAvLy8gcmVnaXN0ZXJzLgorICBzdGQ6OnN0cmluZyBQcmVmZXJWZWN0b3JXaWR0aDsKKworcHVibGljOgorICAvLyBEZWZpbmUgYWNjZXNzb3JzL211dGF0b3JzIGZvciBjb2RlIGdlbmVyYXRpb24gb3B0aW9ucyBvZiBlbnVtZXJhdGlvbiB0eXBlLgorI2RlZmluZSBDT0RFR0VOT1BUKE5hbWUsIEJpdHMsIERlZmF1bHQpCisjZGVmaW5lIEVOVU1fQ09ERUdFTk9QVChOYW1lLCBUeXBlLCBCaXRzLCBEZWZhdWx0KSBcCisgIFR5cGUgZ2V0IyNOYW1lKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZT4oTmFtZSk7IH0gXAorICB2b2lkIHNldCMjTmFtZShUeXBlIFZhbHVlKSB7IE5hbWUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oVmFsdWUpOyB9CisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvQ29kZUdlbk9wdGlvbnMuZGVmIgorCisgIENvZGVHZW5PcHRpb25zKCk7CisKKyAgLy8vIFxicmllZiBJcyB0aGlzIGEgbGliYy9saWJtIGZ1bmN0aW9uIHRoYXQgaXMgbm8gbG9uZ2VyIHJlY29nbml6ZWQgYXMgYQorICAvLy8gYnVpbHRpbiBiZWNhdXNlIGEgLWZuby1idWlsdGluLSogb3B0aW9uIGhhcyBiZWVuIHNwZWNpZmllZD8KKyAgYm9vbCBpc05vQnVpbHRpbkZ1bmMoY29uc3QgY2hhciAqTmFtZSkgY29uc3Q7CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZnZXROb0J1aWx0aW5GdW5jcygpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9CdWlsdGluRnVuY3M7CisgIH0KKworICAvLy8gXGJyaWVmIENoZWNrIGlmIENsYW5nIHByb2ZpbGUgaW5zdHJ1bWVuYXRpb24gaXMgb24uCisgIGJvb2wgaGFzUHJvZmlsZUNsYW5nSW5zdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFByb2ZpbGVJbnN0cigpID09IFByb2ZpbGVDbGFuZ0luc3RyOworICB9CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiBJUiBsZXZlbCBwcm9maWxlIGluc3RydW1lbnRhdGlvbiBpcyBvbi4KKyAgYm9vbCBoYXNQcm9maWxlSVJJbnN0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UHJvZmlsZUluc3RyKCkgPT0gUHJvZmlsZUlSSW5zdHI7CisgIH0KKworICAvLy8gXGJyaWVmIENoZWNrIGlmIENsYW5nIHByb2ZpbGUgdXNlIGlzIG9uLgorICBib29sIGhhc1Byb2ZpbGVDbGFuZ1VzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UHJvZmlsZVVzZSgpID09IFByb2ZpbGVDbGFuZ0luc3RyOworICB9CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiBJUiBsZXZlbCBwcm9maWxlIHVzZSBpcyBvbi4KKyAgYm9vbCBoYXNQcm9maWxlSVJVc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFByb2ZpbGVVc2UoKSA9PSBQcm9maWxlSVJJbnN0cjsKKyAgfQorCit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvQ29tbWFuZExpbmVTb3VyY2VMb2MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0NvbW1hbmRMaW5lU291cmNlTG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjMWUxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0NvbW1hbmRMaW5lU291cmNlTG9jLmgKQEAgLTAsMCArMSwxMzMgQEAKKworLy89PT0tLS0gQ29tbWFuZExpbmVTb3VyY2VMb2MuaCAtIFBhcnNpbmcgZm9yIHNvdXJjZSBsb2NhdGlvbnMtKi0gQysrIC0qLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDb21tYW5kIGxpbmUgcGFyc2luZyBmb3Igc291cmNlIGxvY2F0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRlJPTlRFTkRfQ09NTUFORExJTkVTT1VSQ0VMT0NfSAorI2RlZmluZSBMTFZNX0NMQU5HX0ZST05URU5EX0NPTU1BTkRMSU5FU09VUkNFTE9DX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBBIHNvdXJjZSBsb2NhdGlvbiB0aGF0IGhhcyBiZWVuIHBhcnNlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorc3RydWN0IFBhcnNlZFNvdXJjZUxvY2F0aW9uIHsKKyAgc3RkOjpzdHJpbmcgRmlsZU5hbWU7CisgIHVuc2lnbmVkIExpbmU7CisgIHVuc2lnbmVkIENvbHVtbjsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0IGEgcGFyc2VkIHNvdXJjZSBsb2NhdGlvbiBmcm9tIGEgc3RyaW5nOyB0aGUgRmlsZW5hbWUgaXMgZW1wdHkgb24KKyAgLy8vIGVycm9yLgorICBzdGF0aWMgUGFyc2VkU291cmNlTG9jYXRpb24gRnJvbVN0cmluZyhTdHJpbmdSZWYgU3RyKSB7CisgICAgUGFyc2VkU291cmNlTG9jYXRpb24gUFNMOworICAgIHN0ZDo6cGFpcjxTdHJpbmdSZWYsIFN0cmluZ1JlZj4gQ29sU3BsaXQgPSBTdHIucnNwbGl0KCc6Jyk7CisgICAgc3RkOjpwYWlyPFN0cmluZ1JlZiwgU3RyaW5nUmVmPiBMaW5lU3BsaXQgPQorICAgICAgQ29sU3BsaXQuZmlyc3QucnNwbGl0KCc6Jyk7CisKKyAgICAvLyBJZiBib3RoIHRhaWwgc3BsaXRzIHdlcmUgdmFsaWQgaW50ZWdlcnMsIHJldHVybiBzdWNjZXNzLgorICAgIGlmICghQ29sU3BsaXQuc2Vjb25kLmdldEFzSW50ZWdlcigxMCwgUFNMLkNvbHVtbikgJiYKKyAgICAgICAgIUxpbmVTcGxpdC5zZWNvbmQuZ2V0QXNJbnRlZ2VyKDEwLCBQU0wuTGluZSkpIHsKKyAgICAgIFBTTC5GaWxlTmFtZSA9IExpbmVTcGxpdC5maXJzdDsKKworICAgICAgLy8gT24gdGhlIGNvbW1hbmQtbGluZSwgc3RkaW4gbWF5IGJlIHNwZWNpZmllZCB2aWEgIi0iLiBJbnNpZGUgdGhlCisgICAgICAvLyBjb21waWxlciwgc3RkaW4gaXMgY2FsbGVkICI8c3RkaW4+Ii4KKyAgICAgIGlmIChQU0wuRmlsZU5hbWUgPT0gIi0iKQorICAgICAgICBQU0wuRmlsZU5hbWUgPSAiPHN0ZGluPiI7CisgICAgfQorCisgICAgcmV0dXJuIFBTTDsKKyAgfQorfTsKKworLy8vIEEgc291cmNlIHJhbmdlIHRoYXQgaGFzIGJlZW4gcGFyc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUuCitzdHJ1Y3QgUGFyc2VkU291cmNlUmFuZ2UgeworICBzdGQ6OnN0cmluZyBGaWxlTmFtZTsKKyAgLy8vIFRoZSBzdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgcmFuZ2UuIFRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBsaW5lIGFuZAorICAvLy8gdGhlIHNlY29uZCBlbGVtZW50IGlzIHRoZSBjb2x1bW4uCisgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+IEJlZ2luOworICAvLy8gVGhlIGVuZGluZyBsb2NhdGlvbiBvZiB0aGUgcmFuZ2UuIFRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBsaW5lIGFuZCB0aGUKKyAgLy8vIHNlY29uZCBlbGVtZW50IGlzIHRoZSBjb2x1bW4uCisgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+IEVuZDsKKworICAvLy8gUmV0dXJucyBhIHBhcnNlZCBzb3VyY2UgcmFuZ2UgZnJvbSBhIHN0cmluZyBvciBOb25lIGlmIHRoZSBzdHJpbmcgaXMKKyAgLy8vIGludmFsaWQuCisgIC8vLworICAvLy8gVGhlc2Ugc291cmNlIHN0cmluZyBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgIC8vLworICAvLy8gZmlsZTpzdGFydF9saW5lOnN0YXJ0X2NvbHVtblstZW5kX2xpbmU6ZW5kX2NvbHVtbl0KKyAgLy8vCisgIC8vLyBJZiB0aGUgZW5kIGxpbmUgYW5kIGNvbHVtbiBhcmUgb21pdHRlZCwgdGhlIHN0YXJ0aW5nIGxpbmUgYW5kIGNvbHVtbnMKKyAgLy8vIGFyZSB1c2VkIGFzIHRoZSBlbmQgdmFsdWVzLgorICBzdGF0aWMgT3B0aW9uYWw8UGFyc2VkU291cmNlUmFuZ2U+IGZyb21TdHJpbmcoU3RyaW5nUmVmIFN0cikgeworICAgIHN0ZDo6cGFpcjxTdHJpbmdSZWYsIFN0cmluZ1JlZj4gUmFuZ2VTcGxpdCA9IFN0ci5yc3BsaXQoJy0nKTsKKyAgICB1bnNpZ25lZCBFbmRMaW5lLCBFbmRDb2x1bW47CisgICAgYm9vbCBIYXNFbmRMb2MgPSBmYWxzZTsKKyAgICBpZiAoIVJhbmdlU3BsaXQuc2Vjb25kLmVtcHR5KCkpIHsKKyAgICAgIHN0ZDo6cGFpcjxTdHJpbmdSZWYsIFN0cmluZ1JlZj4gU3BsaXQgPSBSYW5nZVNwbGl0LnNlY29uZC5yc3BsaXQoJzonKTsKKyAgICAgIGlmIChTcGxpdC5maXJzdC5nZXRBc0ludGVnZXIoMTAsIEVuZExpbmUpIHx8CisgICAgICAgICAgU3BsaXQuc2Vjb25kLmdldEFzSW50ZWdlcigxMCwgRW5kQ29sdW1uKSkgeworICAgICAgICAvLyBUaGUgc3RyaW5nIGRvZXMgbm90IGVuZCBpbiBlbmRfbGluZTplbmRfY29sdW1uLCBzbyB0aGUgJy0nCisgICAgICAgIC8vIHByb2JhYmx5IGJlbG9uZ3MgdG8gdGhlIGZpbGVuYW1lIHdoaWNoIG1lbmFzIHRoZSB3aG9sZQorICAgICAgICAvLyBzdHJpbmcgc2hvdWxkIGJlIHBhcnNlZC4KKyAgICAgICAgUmFuZ2VTcGxpdC5maXJzdCA9IFN0cjsKKyAgICAgIH0gZWxzZQorICAgICAgICBIYXNFbmRMb2MgPSB0cnVlOworICAgIH0KKyAgICBhdXRvIEJlZ2luID0gUGFyc2VkU291cmNlTG9jYXRpb246OkZyb21TdHJpbmcoUmFuZ2VTcGxpdC5maXJzdCk7CisgICAgaWYgKEJlZ2luLkZpbGVOYW1lLmVtcHR5KCkpCisgICAgICByZXR1cm4gTm9uZTsKKyAgICBpZiAoIUhhc0VuZExvYykgeworICAgICAgRW5kTGluZSA9IEJlZ2luLkxpbmU7CisgICAgICBFbmRDb2x1bW4gPSBCZWdpbi5Db2x1bW47CisgICAgfQorICAgIHJldHVybiBQYXJzZWRTb3VyY2VSYW5nZXtzdGQ6Om1vdmUoQmVnaW4uRmlsZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QmVnaW4uTGluZSwgQmVnaW4uQ29sdW1ufSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0VuZExpbmUsIEVuZENvbHVtbn19OworICB9Cit9OworfQorCituYW1lc3BhY2UgbGx2bSB7CisgIG5hbWVzcGFjZSBjbCB7CisgICAgLy8vIFxicmllZiBDb21tYW5kLWxpbmUgb3B0aW9uIHBhcnNlciB0aGF0IHBhcnNlcyBzb3VyY2UgbG9jYXRpb25zLgorICAgIC8vLworICAgIC8vLyBTb3VyY2UgbG9jYXRpb25zIGFyZSBvZiB0aGUgZm9ybSBmaWxlbmFtZTpsaW5lOmNvbHVtbi4KKyAgICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgcGFyc2VyPGNsYW5nOjpQYXJzZWRTb3VyY2VMb2NhdGlvbj4gZmluYWwKKyAgICAgIDogcHVibGljIGJhc2ljX3BhcnNlcjxjbGFuZzo6UGFyc2VkU291cmNlTG9jYXRpb24+IHsKKyAgICBwdWJsaWM6CisgICAgICBpbmxpbmUgYm9vbCBwYXJzZShPcHRpb24gJk8sIFN0cmluZ1JlZiBBcmdOYW1lLCBTdHJpbmdSZWYgQXJnVmFsdWUsCisgICAgICAgICAgICAgICAgIGNsYW5nOjpQYXJzZWRTb3VyY2VMb2NhdGlvbiAmVmFsKTsKKyAgICB9OworCisgICAgYm9vbAorICAgIHBhcnNlcjxjbGFuZzo6UGFyc2VkU291cmNlTG9jYXRpb24+OjoKKyAgICBwYXJzZShPcHRpb24gJk8sIFN0cmluZ1JlZiBBcmdOYW1lLCBTdHJpbmdSZWYgQXJnVmFsdWUsCisgICAgICAgICAgY2xhbmc6OlBhcnNlZFNvdXJjZUxvY2F0aW9uICZWYWwpIHsKKyAgICAgIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKKworICAgICAgVmFsID0gUGFyc2VkU291cmNlTG9jYXRpb246OkZyb21TdHJpbmcoQXJnVmFsdWUpOworICAgICAgaWYgKFZhbC5GaWxlTmFtZS5lbXB0eSgpKSB7CisgICAgICAgIGVycnMoKSA8PCAiZXJyb3I6ICIKKyAgICAgICAgICAgICAgIDw8ICJzb3VyY2UgbG9jYXRpb24gbXVzdCBiZSBvZiB0aGUgZm9ybSBmaWxlbmFtZTpsaW5lOmNvbHVtblxuIjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Db21waWxlckluc3RhbmNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Db21waWxlckluc3RhbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQwMTcwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0NvbXBpbGVySW5zdGFuY2UuaApAQCAtMCwwICsxLDgyMSBAQAorLy89PT0tLSBDb21waWxlckluc3RhbmNlLmggLSBDbGFuZyBDb21waWxlciBJbnN0YW5jZSAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0ZST05URU5EX0NPTVBJTEVSSU5TVEFOQ0VfSF8KKyNkZWZpbmUgTExWTV9DTEFOR19GUk9OVEVORF9DT01QSUxFUklOU1RBTkNFX0hfCisKKyNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29uc3VtZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oIgorI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0NvbXBpbGVySW52b2NhdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL1BDSENvbnRhaW5lck9wZXJhdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9VdGlscy5oIgorI2luY2x1ZGUgImNsYW5nL0xleC9IZWFkZXJTZWFyY2hPcHRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L01vZHVsZUxvYWRlci5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyByYXdfZmRfb3N0cmVhbTsKK2NsYXNzIFRpbWVyOworY2xhc3MgVGltZXJHcm91cDsKK30KKworbmFtZXNwYWNlIGNsYW5nIHsKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBBU1RSZWFkZXI7CitjbGFzcyBDb2RlQ29tcGxldGVDb25zdW1lcjsKK2NsYXNzIERpYWdub3N0aWNzRW5naW5lOworY2xhc3MgRGlhZ25vc3RpY0NvbnN1bWVyOworY2xhc3MgRXh0ZXJuYWxBU1RTb3VyY2U7CitjbGFzcyBGaWxlRW50cnk7CitjbGFzcyBGaWxlTWFuYWdlcjsKK2NsYXNzIEZyb250ZW5kQWN0aW9uOworY2xhc3MgTWVtb3J5QnVmZmVyQ2FjaGU7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBQcmVwcm9jZXNzb3I7CitjbGFzcyBTZW1hOworY2xhc3MgU291cmNlTWFuYWdlcjsKK2NsYXNzIFRhcmdldEluZm87CisKKy8vLyBDb21waWxlckluc3RhbmNlIC0gSGVscGVyIGNsYXNzIGZvciBtYW5hZ2luZyBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgQ2xhbmcKKy8vLyBjb21waWxlci4KKy8vLworLy8vIFRoZSBDb21waWxlckluc3RhbmNlIHNlcnZlcyB0d28gcHVycG9zZXM6CisvLy8gICgxKSBJdCBtYW5hZ2VzIHRoZSB2YXJpb3VzIG9iamVjdHMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBydW4gdGhlIGNvbXBpbGVyLAorLy8vICAgICAgZm9yIGV4YW1wbGUgdGhlIHByZXByb2Nlc3NvciwgdGhlIHRhcmdldCBpbmZvcm1hdGlvbiwgYW5kIHRoZSBBU1QKKy8vLyAgICAgIGNvbnRleHQuCisvLy8gICgyKSBJdCBwcm92aWRlcyB1dGlsaXR5IHJvdXRpbmVzIGZvciBjb25zdHJ1Y3RpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGUKKy8vLyAgICAgIGNvbW1vbiBDbGFuZyBvYmplY3RzLgorLy8vCisvLy8gVGhlIGNvbXBpbGVyIGluc3RhbmNlIGdlbmVyYWxseSBvd25zIHRoZSBpbnN0YW5jZSBvZiBhbGwgdGhlIG9iamVjdHMgdGhhdCBpdAorLy8vIG1hbmFnZXMuIEhvd2V2ZXIsIGNsaWVudHMgY2FuIHN0aWxsIHNoYXJlIG9iamVjdHMgYnkgbWFudWFsbHkgc2V0dGluZyB0aGUKKy8vLyBvYmplY3QgYW5kIHJldGFraW5nIG93bmVyc2hpcCBwcmlvciB0byBkZXN0cm95aW5nIHRoZSBDb21waWxlckluc3RhbmNlLgorLy8vCisvLy8gVGhlIGNvbXBpbGVyIGluc3RhbmNlIGlzIGludGVuZGVkIHRvIHNpbXBsaWZ5IGNsaWVudHMsIGJ1dCBub3QgdG8gbG9jayB0aGVtCisvLy8gaW4gdG8gdGhlIGNvbXBpbGVyIGluc3RhbmNlIGZvciBldmVyeXRoaW5nLiBXaGVuIHBvc3NpYmxlLCB1dGlsaXR5IGZ1bmN0aW9ucworLy8vIGNvbWUgaW4gdHdvIGZvcm1zOyBhIHNob3J0IGZvcm0gdGhhdCByZXVzZXMgdGhlIENvbXBpbGVySW5zdGFuY2Ugb2JqZWN0cywKKy8vLyBhbmQgYSBsb25nIGZvcm0gdGhhdCB0YWtlcyBleHBsaWNpdCBpbnN0YW5jZXMgb2YgYW55IHJlcXVpcmVkIG9iamVjdHMuCitjbGFzcyBDb21waWxlckluc3RhbmNlIDogcHVibGljIE1vZHVsZUxvYWRlciB7CisgIC8vLyBUaGUgb3B0aW9ucyB1c2VkIGluIHRoaXMgY29tcGlsZXIgaW5zdGFuY2UuCisgIHN0ZDo6c2hhcmVkX3B0cjxDb21waWxlckludm9jYXRpb24+IEludm9jYXRpb247CisKKyAgLy8vIFRoZSBkaWFnbm9zdGljcyBlbmdpbmUgaW5zdGFuY2UuCisgIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljc0VuZ2luZT4gRGlhZ25vc3RpY3M7CisKKyAgLy8vIFRoZSB0YXJnZXQgYmVpbmcgY29tcGlsZWQgZm9yLgorICBJbnRydXNpdmVSZWZDbnRQdHI8VGFyZ2V0SW5mbz4gVGFyZ2V0OworCisgIC8vLyBBdXhpbGlhcnkgVGFyZ2V0IGluZm8uCisgIEludHJ1c2l2ZVJlZkNudFB0cjxUYXJnZXRJbmZvPiBBdXhUYXJnZXQ7CisKKyAgLy8vIFRoZSB2aXJ0dWFsIGZpbGUgc3lzdGVtLgorICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpGaWxlU3lzdGVtPiBWaXJ0dWFsRmlsZVN5c3RlbTsKKworICAvLy8gVGhlIGZpbGUgbWFuYWdlci4KKyAgSW50cnVzaXZlUmVmQ250UHRyPEZpbGVNYW5hZ2VyPiBGaWxlTWdyOworCisgIC8vLyBUaGUgc291cmNlIG1hbmFnZXIuCisgIEludHJ1c2l2ZVJlZkNudFB0cjxTb3VyY2VNYW5hZ2VyPiBTb3VyY2VNZ3I7CisKKyAgLy8vIFRoZSBjYWNoZSBvZiBQQ00gZmlsZXMuCisgIEludHJ1c2l2ZVJlZkNudFB0cjxNZW1vcnlCdWZmZXJDYWNoZT4gUENNQ2FjaGU7CisKKyAgLy8vIFRoZSBwcmVwcm9jZXNzb3IuCisgIHN0ZDo6c2hhcmVkX3B0cjxQcmVwcm9jZXNzb3I+IFBQOworCisgIC8vLyBUaGUgQVNUIGNvbnRleHQuCisgIEludHJ1c2l2ZVJlZkNudFB0cjxBU1RDb250ZXh0PiBDb250ZXh0OworCisgIC8vLyBBbiBvcHRpb25hbCBzZW1hIHNvdXJjZSB0aGF0IHdpbGwgYmUgYXR0YWNoZWQgdG8gc2VtYS4KKyAgSW50cnVzaXZlUmVmQ250UHRyPEV4dGVybmFsU2VtYVNvdXJjZT4gRXh0ZXJuYWxTZW1hU3JjOworCisgIC8vLyBUaGUgQVNUIGNvbnN1bWVyLgorICBzdGQ6OnVuaXF1ZV9wdHI8QVNUQ29uc3VtZXI+IENvbnN1bWVyOworCisgIC8vLyBUaGUgY29kZSBjb21wbGV0aW9uIGNvbnN1bWVyLgorICBzdGQ6OnVuaXF1ZV9wdHI8Q29kZUNvbXBsZXRlQ29uc3VtZXI+IENvbXBsZXRpb25Db25zdW1lcjsKKworICAvLy8gXGJyaWVmIFRoZSBzZW1hbnRpYyBhbmFseXNpcyBvYmplY3QuCisgIHN0ZDo6dW5pcXVlX3B0cjxTZW1hPiBUaGVTZW1hOworCisgIC8vLyBcYnJpZWYgVGhlIGZyb250ZW5kIHRpbWVyIGdyb3VwLgorICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6VGltZXJHcm91cD4gRnJvbnRlbmRUaW1lckdyb3VwOworCisgIC8vLyBcYnJpZWYgVGhlIGZyb250ZW5kIHRpbWVyLgorICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6VGltZXI+IEZyb250ZW5kVGltZXI7CisKKyAgLy8vIFxicmllZiBUaGUgQVNUUmVhZGVyLCBpZiBvbmUgZXhpc3RzLgorICBJbnRydXNpdmVSZWZDbnRQdHI8QVNUUmVhZGVyPiBNb2R1bGVNYW5hZ2VyOworCisgIC8vLyBcYnJpZWYgVGhlIG1vZHVsZSBkZXBlbmRlbmN5IGNvbGxlY3RvciBmb3IgY3Jhc2hkdW1wcworICBzdGQ6OnNoYXJlZF9wdHI8TW9kdWxlRGVwZW5kZW5jeUNvbGxlY3Rvcj4gTW9kdWxlRGVwQ29sbGVjdG9yOworCisgIC8vLyBcYnJpZWYgVGhlIG1vZHVsZSBwcm92aWRlci4KKyAgc3RkOjpzaGFyZWRfcHRyPFBDSENvbnRhaW5lck9wZXJhdGlvbnM+IFRoZVBDSENvbnRhaW5lck9wZXJhdGlvbnM7CisKKyAgLy8vIFxicmllZiBUaGUgZGVwZW5kZW5jeSBmaWxlIGdlbmVyYXRvci4KKyAgc3RkOjp1bmlxdWVfcHRyPERlcGVuZGVuY3lGaWxlR2VuZXJhdG9yPiBUaGVEZXBlbmRlbmN5RmlsZUdlbmVyYXRvcjsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8RGVwZW5kZW5jeUNvbGxlY3Rvcj4+IERlcGVuZGVuY3lDb2xsZWN0b3JzOworCisgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiB0b3AtbGV2ZWwgbW9kdWxlcyB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLAorICAvLy8gYWxvbmcgd2l0aCB0aGUgbW9kdWxlIG1hcAorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBJZGVudGlmaWVySW5mbyAqLCBNb2R1bGUgKj4gS25vd25Nb2R1bGVzOworCisgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiB0b3AtbGV2ZWwgbW9kdWxlcyB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gYnVpbHQgb24gdGhlCisgIC8vLyBmbHkgYXMgcGFydCBvZiB0aGlzIG92ZXJhbGwgY29tcGlsYXRpb24gYWN0aW9uLgorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IEJ1aWx0TW9kdWxlczsKKworICAvLy8gU2hvdWxkIHdlIGRlbGV0ZSB0aGUgQnVpbHRNb2R1bGVzIHdoZW4gd2UncmUgZG9uZT8KKyAgYm9vbCBEZWxldGVCdWlsdE1vZHVsZXMgPSB0cnVlOworCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSBtb2R1bGUtaW1wb3J0IGtleXdvcmQgZm9yIHRoZSBsYXN0IG1vZHVsZQorICAvLy8gaW1wb3J0LiAKKyAgU291cmNlTG9jYXRpb24gTGFzdE1vZHVsZUltcG9ydExvYzsKKyAgCisgIC8vLyBcYnJpZWYgVGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBtb2R1bGUgaW1wb3J0LgorICAvLy8KKyAgTW9kdWxlTG9hZFJlc3VsdCBMYXN0TW9kdWxlSW1wb3J0UmVzdWx0OworCisgIC8vLyBcYnJpZWYgV2hldGhlciB3ZSBzaG91bGQgKHJlKWJ1aWxkIHRoZSBnbG9iYWwgbW9kdWxlIGluZGV4IG9uY2Ugd2UKKyAgLy8vIGhhdmUgZmluaXNoZWQgd2l0aCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQuCisgIGJvb2wgQnVpbGRHbG9iYWxNb2R1bGVJbmRleCA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgV2UgaGF2ZSBhIGZ1bGwgZ2xvYmFsIG1vZHVsZSBpbmRleCwgd2l0aCBhbGwgbW9kdWxlcy4KKyAgYm9vbCBIYXZlRnVsbEdsb2JhbE1vZHVsZUluZGV4ID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBPbmUgb3IgbW9yZSBtb2R1bGVzIGZhaWxlZCB0byBidWlsZC4KKyAgYm9vbCBNb2R1bGVCdWlsZEZhaWxlZCA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgSG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG91dHB1dCBmaWxlLgorICAvLy8KKyAgLy8vIElmIFRlbXBGaWxlbmFtZSBpcyBub3QgZW1wdHkgd2UgbXVzdCByZW5hbWUgaXQgdG8gRmlsZW5hbWUgYXQgdGhlIGVuZC4KKyAgLy8vIFRlbXBGaWxlbmFtZSBtYXkgYmUgZW1wdHkgYW5kIEZpbGVuYW1lIG5vbi1lbXB0eSBpZiBjcmVhdGluZyB0aGUgdGVtcG9yYXJ5CisgIC8vLyBmYWlsZWQuCisgIHN0cnVjdCBPdXRwdXRGaWxlIHsKKyAgICBzdGQ6OnN0cmluZyBGaWxlbmFtZTsKKyAgICBzdGQ6OnN0cmluZyBUZW1wRmlsZW5hbWU7CisKKyAgICBPdXRwdXRGaWxlKHN0ZDo6c3RyaW5nIGZpbGVuYW1lLCBzdGQ6OnN0cmluZyB0ZW1wRmlsZW5hbWUpCisgICAgICAgIDogRmlsZW5hbWUoc3RkOjptb3ZlKGZpbGVuYW1lKSksIFRlbXBGaWxlbmFtZShzdGQ6Om1vdmUodGVtcEZpbGVuYW1lKSkgeworICAgIH0KKyAgfTsKKworICAvLy8gSWYgdGhlIG91dHB1dCBkb2Vzbid0IHN1cHBvcnQgc2Vla2luZyAodGVybWluYWwsIHBpcGUpLiB3ZSBzd2l0Y2gKKyAgLy8vIHRoZSBzdHJlYW0gdG8gYSBidWZmZXJfb3N0cmVhbS4gVGhlc2UgYXJlIHRoZSBidWZmZXIgYW5kIHRoZSBvcmlnaW5hbAorICAvLy8gc3RyZWFtLgorICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6cmF3X2ZkX29zdHJlYW0+IE5vblNlZWtTdHJlYW07CisKKyAgLy8vIFRoZSBsaXN0IG9mIGFjdGl2ZSBvdXRwdXQgZmlsZXMuCisgIHN0ZDo6bGlzdDxPdXRwdXRGaWxlPiBPdXRwdXRGaWxlczsKKworICAvLy8gRm9yY2UgYW4gb3V0cHV0IGJ1ZmZlci4KKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06OnJhd19wd3JpdGVfc3RyZWFtPiBPdXRwdXRTdHJlYW07CisKKyAgQ29tcGlsZXJJbnN0YW5jZShjb25zdCBDb21waWxlckluc3RhbmNlICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBDb21waWxlckluc3RhbmNlICYpID0gZGVsZXRlOworcHVibGljOgorICBleHBsaWNpdCBDb21waWxlckluc3RhbmNlKAorICAgICAgc3RkOjpzaGFyZWRfcHRyPFBDSENvbnRhaW5lck9wZXJhdGlvbnM+IFBDSENvbnRhaW5lck9wcyA9CisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxQQ0hDb250YWluZXJPcGVyYXRpb25zPigpLAorICAgICAgTWVtb3J5QnVmZmVyQ2FjaGUgKlNoYXJlZFBDTUNhY2hlID0gbnVsbHB0cik7CisgIH5Db21waWxlckluc3RhbmNlKCkgb3ZlcnJpZGU7CisKKyAgLy8vIEBuYW1lIEhpZ2gtTGV2ZWwgT3BlcmF0aW9ucworICAvLy8geworCisgIC8vLyBFeGVjdXRlQWN0aW9uIC0gRXhlY3V0ZSB0aGUgcHJvdmlkZWQgYWN0aW9uIGFnYWluc3QgdGhlIGNvbXBpbGVyJ3MKKyAgLy8vIENvbXBpbGVySW52b2NhdGlvbiBvYmplY3QuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBtYWtlcyB0aGUgZm9sbG93aW5nIGFzc3VtcHRpb25zOgorICAvLy8KKyAgLy8vICAtIFRoZSBpbnZvY2F0aW9uIG9wdGlvbnMgc2hvdWxkIGJlIGluaXRpYWxpemVkLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90CisgIC8vLyAgICBoYW5kbGUgdGhlICctaGVscCcgb3IgJy12ZXJzaW9uJyBvcHRpb25zLCBjbGllbnRzIHNob3VsZCBoYW5kbGUgdGhvc2UKKyAgLy8vICAgIGRpcmVjdGx5LgorICAvLy8KKyAgLy8vICAtIFRoZSBkaWFnbm9zdGljcyBlbmdpbmUgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgYnkgdGhlIGNsaWVudC4KKyAgLy8vCisgIC8vLyAgLSBObyBvdGhlciBDb21waWxlckluc3RhbmNlIHN0YXRlIHNob3VsZCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgKHRoaXMgaXMKKyAgLy8vICAgIGFuIHVuY2hlY2tlZCBlcnJvcikuCisgIC8vLworICAvLy8gIC0gQ2xpZW50cyBzaG91bGQgaGF2ZSBpbml0aWFsaXplZCBhbnkgTExWTSB0YXJnZXQgZmVhdHVyZXMgdGhhdCBtYXkgYmUKKyAgLy8vICAgIHJlcXVpcmVkLgorICAvLy8KKyAgLy8vICAtIENsaWVudHMgc2hvdWxkIGV2ZW50dWFsbHkgY2FsbCBsbHZtX3NodXRkb3duKCkgdXBvbiB0aGUgY29tcGxldGlvbiBvZgorICAvLy8gICAgdGhpcyByb3V0aW5lIHRvIGVuc3VyZSB0aGF0IGFueSBtYW5hZ2VkIG9iamVjdHMgYXJlIHByb3Blcmx5IGRlc3Ryb3llZC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIG1heSB3cml0ZSBvdXRwdXQgdG8gJ3N0ZGVycicuCisgIC8vLworICAvLy8gXHBhcmFtIEFjdCAtIFRoZSBhY3Rpb24gdG8gZXhlY3V0ZS4KKyAgLy8vIFxyZXR1cm4gLSBUcnVlIG9uIHN1Y2Nlc3MuCisgIC8vCisgIC8vIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCB0YWtlIHRoZSBzdHJlYW0gdG8gd3JpdGUgYW55IGRlYnVnZ2luZyAvCisgIC8vIHZlcmJvc2Ugb3V0cHV0IHRvIGFzIGFuIGFyZ3VtZW50LgorICAvLworICAvLyBGSVhNRTogRWxpbWluYXRlIHRoZSBsbHZtX3NodXRkb3duIHJlcXVpcmVtZW50LCB0aGF0IHNob3VsZCBlaXRoZXIgYmUgcGFydAorICAvLyBvZiB0aGUgY29udGV4dCBvciBlbHNlIG5vdCBDb21waWxlckluc3RhbmNlIHNwZWNpZmljLgorICBib29sIEV4ZWN1dGVBY3Rpb24oRnJvbnRlbmRBY3Rpb24gJkFjdCk7CisKKyAgLy8vIH0KKyAgLy8vIEBuYW1lIENvbXBpbGVyIEludm9jYXRpb24gYW5kIE9wdGlvbnMKKyAgLy8vIHsKKworICBib29sIGhhc0ludm9jYXRpb24oKSBjb25zdCB7IHJldHVybiBJbnZvY2F0aW9uICE9IG51bGxwdHI7IH0KKworICBDb21waWxlckludm9jYXRpb24gJmdldEludm9jYXRpb24oKSB7CisgICAgYXNzZXJ0KEludm9jYXRpb24gJiYgIkNvbXBpbGVyIGluc3RhbmNlIGhhcyBubyBpbnZvY2F0aW9uISIpOworICAgIHJldHVybiAqSW52b2NhdGlvbjsKKyAgfQorCisgIC8vLyBzZXRJbnZvY2F0aW9uIC0gUmVwbGFjZSB0aGUgY3VycmVudCBpbnZvY2F0aW9uLgorICB2b2lkIHNldEludm9jYXRpb24oc3RkOjpzaGFyZWRfcHRyPENvbXBpbGVySW52b2NhdGlvbj4gVmFsdWUpOworCisgIC8vLyBcYnJpZWYgSW5kaWNhdGVzIHdoZXRoZXIgd2Ugc2hvdWxkIChyZSlidWlsZCB0aGUgZ2xvYmFsIG1vZHVsZSBpbmRleC4KKyAgYm9vbCBzaG91bGRCdWlsZEdsb2JhbE1vZHVsZUluZGV4KCkgY29uc3Q7CisgIAorICAvLy8gXGJyaWVmIFNldCB0aGUgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgd2Ugc2hvdWxkIChyZSlidWlsZCB0aGUgZ2xvYmFsCisgIC8vLyBtb2R1bGUgaW5kZXguCisgIHZvaWQgc2V0QnVpbGRHbG9iYWxNb2R1bGVJbmRleChib29sIEJ1aWxkKSB7CisgICAgQnVpbGRHbG9iYWxNb2R1bGVJbmRleCA9IEJ1aWxkOworICB9CisKKyAgLy8vIH0KKyAgLy8vIEBuYW1lIEZvcndhcmRpbmcgTWV0aG9kcworICAvLy8geworCisgIEFuYWx5emVyT3B0aW9uc1JlZiBnZXRBbmFseXplck9wdHMoKSB7CisgICAgcmV0dXJuIEludm9jYXRpb24tPmdldEFuYWx5emVyT3B0cygpOworICB9CisKKyAgQ29kZUdlbk9wdGlvbnMgJmdldENvZGVHZW5PcHRzKCkgeworICAgIHJldHVybiBJbnZvY2F0aW9uLT5nZXRDb2RlR2VuT3B0cygpOworICB9CisgIGNvbnN0IENvZGVHZW5PcHRpb25zICZnZXRDb2RlR2VuT3B0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gSW52b2NhdGlvbi0+Z2V0Q29kZUdlbk9wdHMoKTsKKyAgfQorCisgIERlcGVuZGVuY3lPdXRwdXRPcHRpb25zICZnZXREZXBlbmRlbmN5T3V0cHV0T3B0cygpIHsKKyAgICByZXR1cm4gSW52b2NhdGlvbi0+Z2V0RGVwZW5kZW5jeU91dHB1dE9wdHMoKTsKKyAgfQorICBjb25zdCBEZXBlbmRlbmN5T3V0cHV0T3B0aW9ucyAmZ2V0RGVwZW5kZW5jeU91dHB1dE9wdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIEludm9jYXRpb24tPmdldERlcGVuZGVuY3lPdXRwdXRPcHRzKCk7CisgIH0KKworICBEaWFnbm9zdGljT3B0aW9ucyAmZ2V0RGlhZ25vc3RpY09wdHMoKSB7CisgICAgcmV0dXJuIEludm9jYXRpb24tPmdldERpYWdub3N0aWNPcHRzKCk7CisgIH0KKyAgY29uc3QgRGlhZ25vc3RpY09wdGlvbnMgJmdldERpYWdub3N0aWNPcHRzKCkgY29uc3QgeworICAgIHJldHVybiBJbnZvY2F0aW9uLT5nZXREaWFnbm9zdGljT3B0cygpOworICB9CisKKyAgRmlsZVN5c3RlbU9wdGlvbnMgJmdldEZpbGVTeXN0ZW1PcHRzKCkgeworICAgIHJldHVybiBJbnZvY2F0aW9uLT5nZXRGaWxlU3lzdGVtT3B0cygpOworICB9CisgIGNvbnN0IEZpbGVTeXN0ZW1PcHRpb25zICZnZXRGaWxlU3lzdGVtT3B0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gSW52b2NhdGlvbi0+Z2V0RmlsZVN5c3RlbU9wdHMoKTsKKyAgfQorCisgIEZyb250ZW5kT3B0aW9ucyAmZ2V0RnJvbnRlbmRPcHRzKCkgeworICAgIHJldHVybiBJbnZvY2F0aW9uLT5nZXRGcm9udGVuZE9wdHMoKTsKKyAgfQorICBjb25zdCBGcm9udGVuZE9wdGlvbnMgJmdldEZyb250ZW5kT3B0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gSW52b2NhdGlvbi0+Z2V0RnJvbnRlbmRPcHRzKCk7CisgIH0KKworICBIZWFkZXJTZWFyY2hPcHRpb25zICZnZXRIZWFkZXJTZWFyY2hPcHRzKCkgeworICAgIHJldHVybiBJbnZvY2F0aW9uLT5nZXRIZWFkZXJTZWFyY2hPcHRzKCk7CisgIH0KKyAgY29uc3QgSGVhZGVyU2VhcmNoT3B0aW9ucyAmZ2V0SGVhZGVyU2VhcmNoT3B0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gSW52b2NhdGlvbi0+Z2V0SGVhZGVyU2VhcmNoT3B0cygpOworICB9CisgIHN0ZDo6c2hhcmVkX3B0cjxIZWFkZXJTZWFyY2hPcHRpb25zPiBnZXRIZWFkZXJTZWFyY2hPcHRzUHRyKCkgY29uc3QgeworICAgIHJldHVybiBJbnZvY2F0aW9uLT5nZXRIZWFkZXJTZWFyY2hPcHRzUHRyKCk7CisgIH0KKworICBMYW5nT3B0aW9ucyAmZ2V0TGFuZ09wdHMoKSB7CisgICAgcmV0dXJuICpJbnZvY2F0aW9uLT5nZXRMYW5nT3B0cygpOworICB9CisgIGNvbnN0IExhbmdPcHRpb25zICZnZXRMYW5nT3B0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gKkludm9jYXRpb24tPmdldExhbmdPcHRzKCk7CisgIH0KKworICBQcmVwcm9jZXNzb3JPcHRpb25zICZnZXRQcmVwcm9jZXNzb3JPcHRzKCkgeworICAgIHJldHVybiBJbnZvY2F0aW9uLT5nZXRQcmVwcm9jZXNzb3JPcHRzKCk7CisgIH0KKyAgY29uc3QgUHJlcHJvY2Vzc29yT3B0aW9ucyAmZ2V0UHJlcHJvY2Vzc29yT3B0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gSW52b2NhdGlvbi0+Z2V0UHJlcHJvY2Vzc29yT3B0cygpOworICB9CisKKyAgUHJlcHJvY2Vzc29yT3V0cHV0T3B0aW9ucyAmZ2V0UHJlcHJvY2Vzc29yT3V0cHV0T3B0cygpIHsKKyAgICByZXR1cm4gSW52b2NhdGlvbi0+Z2V0UHJlcHJvY2Vzc29yT3V0cHV0T3B0cygpOworICB9CisgIGNvbnN0IFByZXByb2Nlc3Nvck91dHB1dE9wdGlvbnMgJmdldFByZXByb2Nlc3Nvck91dHB1dE9wdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIEludm9jYXRpb24tPmdldFByZXByb2Nlc3Nvck91dHB1dE9wdHMoKTsKKyAgfQorCisgIFRhcmdldE9wdGlvbnMgJmdldFRhcmdldE9wdHMoKSB7CisgICAgcmV0dXJuIEludm9jYXRpb24tPmdldFRhcmdldE9wdHMoKTsKKyAgfQorICBjb25zdCBUYXJnZXRPcHRpb25zICZnZXRUYXJnZXRPcHRzKCkgY29uc3QgeworICAgIHJldHVybiBJbnZvY2F0aW9uLT5nZXRUYXJnZXRPcHRzKCk7CisgIH0KKworICAvLy8gfQorICAvLy8gQG5hbWUgRGlhZ25vc3RpY3MgRW5naW5lCisgIC8vLyB7CisKKyAgYm9vbCBoYXNEaWFnbm9zdGljcygpIGNvbnN0IHsgcmV0dXJuIERpYWdub3N0aWNzICE9IG51bGxwdHI7IH0KKworICAvLy8gR2V0IHRoZSBjdXJyZW50IGRpYWdub3N0aWNzIGVuZ2luZS4KKyAgRGlhZ25vc3RpY3NFbmdpbmUgJmdldERpYWdub3N0aWNzKCkgY29uc3QgeworICAgIGFzc2VydChEaWFnbm9zdGljcyAmJiAiQ29tcGlsZXIgaW5zdGFuY2UgaGFzIG5vIGRpYWdub3N0aWNzISIpOworICAgIHJldHVybiAqRGlhZ25vc3RpY3M7CisgIH0KKworICAvLy8gc2V0RGlhZ25vc3RpY3MgLSBSZXBsYWNlIHRoZSBjdXJyZW50IGRpYWdub3N0aWNzIGVuZ2luZS4KKyAgdm9pZCBzZXREaWFnbm9zdGljcyhEaWFnbm9zdGljc0VuZ2luZSAqVmFsdWUpOworCisgIERpYWdub3N0aWNDb25zdW1lciAmZ2V0RGlhZ25vc3RpY0NsaWVudCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoRGlhZ25vc3RpY3MgJiYgRGlhZ25vc3RpY3MtPmdldENsaWVudCgpICYmIAorICAgICAgICAgICAiQ29tcGlsZXIgaW5zdGFuY2UgaGFzIG5vIGRpYWdub3N0aWMgY2xpZW50ISIpOworICAgIHJldHVybiAqRGlhZ25vc3RpY3MtPmdldENsaWVudCgpOworICB9CisKKyAgLy8vIH0KKyAgLy8vIEBuYW1lIFRhcmdldCBJbmZvCisgIC8vLyB7CisKKyAgYm9vbCBoYXNUYXJnZXQoKSBjb25zdCB7IHJldHVybiBUYXJnZXQgIT0gbnVsbHB0cjsgfQorCisgIFRhcmdldEluZm8gJmdldFRhcmdldCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoVGFyZ2V0ICYmICJDb21waWxlciBpbnN0YW5jZSBoYXMgbm8gdGFyZ2V0ISIpOworICAgIHJldHVybiAqVGFyZ2V0OworICB9CisKKyAgLy8vIFJlcGxhY2UgdGhlIGN1cnJlbnQgVGFyZ2V0LgorICB2b2lkIHNldFRhcmdldChUYXJnZXRJbmZvICpWYWx1ZSk7CisKKyAgLy8vIH0KKyAgLy8vIEBuYW1lIEF1eFRhcmdldCBJbmZvCisgIC8vLyB7CisKKyAgVGFyZ2V0SW5mbyAqZ2V0QXV4VGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gQXV4VGFyZ2V0LmdldCgpOyB9CisKKyAgLy8vIFJlcGxhY2UgdGhlIGN1cnJlbnQgQXV4VGFyZ2V0LgorICB2b2lkIHNldEF1eFRhcmdldChUYXJnZXRJbmZvICpWYWx1ZSk7CisKKyAgLy8vIH0KKyAgLy8vIEBuYW1lIFZpcnR1YWwgRmlsZSBTeXN0ZW0KKyAgLy8vIHsKKworICBib29sIGhhc1ZpcnR1YWxGaWxlU3lzdGVtKCkgY29uc3QgeyByZXR1cm4gVmlydHVhbEZpbGVTeXN0ZW0gIT0gbnVsbHB0cjsgfQorCisgIHZmczo6RmlsZVN5c3RlbSAmZ2V0VmlydHVhbEZpbGVTeXN0ZW0oKSBjb25zdCB7CisgICAgYXNzZXJ0KGhhc1ZpcnR1YWxGaWxlU3lzdGVtKCkgJiYKKyAgICAgICAgICAgIkNvbXBpbGVyIGluc3RhbmNlIGhhcyBubyB2aXJ0dWFsIGZpbGUgc3lzdGVtIik7CisgICAgcmV0dXJuICpWaXJ0dWFsRmlsZVN5c3RlbTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVwbGFjZSB0aGUgY3VycmVudCB2aXJ0dWFsIGZpbGUgc3lzdGVtLgorICAvLy8KKyAgLy8vIFxub3RlIE1vc3QgY2xpZW50cyBzaG91bGQgdXNlIHNldEZpbGVNYW5hZ2VyLCB3aGljaCB3aWxsIGltcGxpY2l0bHkgcmVzZXQKKyAgLy8vIHRoZSB2aXJ0dWFsIGZpbGUgc3lzdGVtIHRvIHRoZSBvbmUgY29udGFpbmVkIGluIHRoZSBmaWxlIG1hbmFnZXIuCisgIHZvaWQgc2V0VmlydHVhbEZpbGVTeXN0ZW0oSW50cnVzaXZlUmVmQ250UHRyPHZmczo6RmlsZVN5c3RlbT4gRlMpIHsKKyAgICBWaXJ0dWFsRmlsZVN5c3RlbSA9IHN0ZDo6bW92ZShGUyk7CisgIH0KKworICAvLy8gfQorICAvLy8gQG5hbWUgRmlsZSBNYW5hZ2VyCisgIC8vLyB7CisKKyAgYm9vbCBoYXNGaWxlTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIEZpbGVNZ3IgIT0gbnVsbHB0cjsgfQorCisgIC8vLyBSZXR1cm4gdGhlIGN1cnJlbnQgZmlsZSBtYW5hZ2VyIHRvIHRoZSBjYWxsZXIuCisgIEZpbGVNYW5hZ2VyICZnZXRGaWxlTWFuYWdlcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoRmlsZU1nciAmJiAiQ29tcGlsZXIgaW5zdGFuY2UgaGFzIG5vIGZpbGUgbWFuYWdlciEiKTsKKyAgICByZXR1cm4gKkZpbGVNZ3I7CisgIH0KKyAgCisgIHZvaWQgcmVzZXRBbmRMZWFrRmlsZU1hbmFnZXIoKSB7CisgICAgQnVyeVBvaW50ZXIoRmlsZU1nci5nZXQoKSk7CisgICAgRmlsZU1nci5yZXNldFdpdGhvdXRSZWxlYXNlKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlcGxhY2UgdGhlIGN1cnJlbnQgZmlsZSBtYW5hZ2VyIGFuZCB2aXJ0dWFsIGZpbGUgc3lzdGVtLgorICB2b2lkIHNldEZpbGVNYW5hZ2VyKEZpbGVNYW5hZ2VyICpWYWx1ZSk7CisKKyAgLy8vIH0KKyAgLy8vIEBuYW1lIFNvdXJjZSBNYW5hZ2VyCisgIC8vLyB7CisKKyAgYm9vbCBoYXNTb3VyY2VNYW5hZ2VyKCkgY29uc3QgeyByZXR1cm4gU291cmNlTWdyICE9IG51bGxwdHI7IH0KKworICAvLy8gUmV0dXJuIHRoZSBjdXJyZW50IHNvdXJjZSBtYW5hZ2VyLgorICBTb3VyY2VNYW5hZ2VyICZnZXRTb3VyY2VNYW5hZ2VyKCkgY29uc3QgeworICAgIGFzc2VydChTb3VyY2VNZ3IgJiYgIkNvbXBpbGVyIGluc3RhbmNlIGhhcyBubyBzb3VyY2UgbWFuYWdlciEiKTsKKyAgICByZXR1cm4gKlNvdXJjZU1ncjsKKyAgfQorICAKKyAgdm9pZCByZXNldEFuZExlYWtTb3VyY2VNYW5hZ2VyKCkgeworICAgIEJ1cnlQb2ludGVyKFNvdXJjZU1nci5nZXQoKSk7CisgICAgU291cmNlTWdyLnJlc2V0V2l0aG91dFJlbGVhc2UoKTsKKyAgfQorCisgIC8vLyBzZXRTb3VyY2VNYW5hZ2VyIC0gUmVwbGFjZSB0aGUgY3VycmVudCBzb3VyY2UgbWFuYWdlci4KKyAgdm9pZCBzZXRTb3VyY2VNYW5hZ2VyKFNvdXJjZU1hbmFnZXIgKlZhbHVlKTsKKworICAvLy8gfQorICAvLy8gQG5hbWUgUHJlcHJvY2Vzc29yCisgIC8vLyB7CisKKyAgYm9vbCBoYXNQcmVwcm9jZXNzb3IoKSBjb25zdCB7IHJldHVybiBQUCAhPSBudWxscHRyOyB9CisKKyAgLy8vIFJldHVybiB0aGUgY3VycmVudCBwcmVwcm9jZXNzb3IuCisgIFByZXByb2Nlc3NvciAmZ2V0UHJlcHJvY2Vzc29yKCkgY29uc3QgeworICAgIGFzc2VydChQUCAmJiAiQ29tcGlsZXIgaW5zdGFuY2UgaGFzIG5vIHByZXByb2Nlc3NvciEiKTsKKyAgICByZXR1cm4gKlBQOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFByZXByb2Nlc3Nvcj4gZ2V0UHJlcHJvY2Vzc29yUHRyKCkgeyByZXR1cm4gUFA7IH0KKworICB2b2lkIHJlc2V0QW5kTGVha1ByZXByb2Nlc3NvcigpIHsKKyAgICBCdXJ5UG9pbnRlcihuZXcgc3RkOjpzaGFyZWRfcHRyPFByZXByb2Nlc3Nvcj4oUFApKTsKKyAgfQorCisgIC8vLyBSZXBsYWNlIHRoZSBjdXJyZW50IHByZXByb2Nlc3Nvci4KKyAgdm9pZCBzZXRQcmVwcm9jZXNzb3Ioc3RkOjpzaGFyZWRfcHRyPFByZXByb2Nlc3Nvcj4gVmFsdWUpOworCisgIC8vLyB9CisgIC8vLyBAbmFtZSBBU1RDb250ZXh0CisgIC8vLyB7CisKKyAgYm9vbCBoYXNBU1RDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQ29udGV4dCAhPSBudWxscHRyOyB9CisKKyAgQVNUQ29udGV4dCAmZ2V0QVNUQ29udGV4dCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoQ29udGV4dCAmJiAiQ29tcGlsZXIgaW5zdGFuY2UgaGFzIG5vIEFTVCBjb250ZXh0ISIpOworICAgIHJldHVybiAqQ29udGV4dDsKKyAgfQorICAKKyAgdm9pZCByZXNldEFuZExlYWtBU1RDb250ZXh0KCkgeworICAgIEJ1cnlQb2ludGVyKENvbnRleHQuZ2V0KCkpOworICAgIENvbnRleHQucmVzZXRXaXRob3V0UmVsZWFzZSgpOworICB9CisKKyAgLy8vIHNldEFTVENvbnRleHQgLSBSZXBsYWNlIHRoZSBjdXJyZW50IEFTVCBjb250ZXh0LgorICB2b2lkIHNldEFTVENvbnRleHQoQVNUQ29udGV4dCAqVmFsdWUpOworCisgIC8vLyBcYnJpZWYgUmVwbGFjZSB0aGUgY3VycmVudCBTZW1hOyB0aGUgY29tcGlsZXIgaW5zdGFuY2UgdGFrZXMgb3duZXJzaGlwCisgIC8vLyBvZiBTLgorICB2b2lkIHNldFNlbWEoU2VtYSAqUyk7CisgIAorICAvLy8gfQorICAvLy8gQG5hbWUgQVNUQ29uc3VtZXIKKyAgLy8vIHsKKworICBib29sIGhhc0FTVENvbnN1bWVyKCkgY29uc3QgeyByZXR1cm4gKGJvb2wpQ29uc3VtZXI7IH0KKworICBBU1RDb25zdW1lciAmZ2V0QVNUQ29uc3VtZXIoKSBjb25zdCB7CisgICAgYXNzZXJ0KENvbnN1bWVyICYmICJDb21waWxlciBpbnN0YW5jZSBoYXMgbm8gQVNUIGNvbnN1bWVyISIpOworICAgIHJldHVybiAqQ29uc3VtZXI7CisgIH0KKworICAvLy8gdGFrZUFTVENvbnN1bWVyIC0gUmVtb3ZlIHRoZSBjdXJyZW50IEFTVCBjb25zdW1lciBhbmQgZ2l2ZSBvd25lcnNoaXAgdG8KKyAgLy8vIHRoZSBjYWxsZXIuCisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RDb25zdW1lcj4gdGFrZUFTVENvbnN1bWVyKCkgeyByZXR1cm4gc3RkOjptb3ZlKENvbnN1bWVyKTsgfQorCisgIC8vLyBzZXRBU1RDb25zdW1lciAtIFJlcGxhY2UgdGhlIGN1cnJlbnQgQVNUIGNvbnN1bWVyOyB0aGUgY29tcGlsZXIgaW5zdGFuY2UKKyAgLy8vIHRha2VzIG93bmVyc2hpcCBvZiBccCBWYWx1ZS4KKyAgdm9pZCBzZXRBU1RDb25zdW1lcihzdGQ6OnVuaXF1ZV9wdHI8QVNUQ29uc3VtZXI+IFZhbHVlKTsKKworICAvLy8gfQorICAvLy8gQG5hbWUgU2VtYW50aWMgYW5hbHlzaXMKKyAgLy8vIHsKKyAgYm9vbCBoYXNTZW1hKCkgY29uc3QgeyByZXR1cm4gKGJvb2wpVGhlU2VtYTsgfQorCisgIFNlbWEgJmdldFNlbWEoKSBjb25zdCB7IAorICAgIGFzc2VydChUaGVTZW1hICYmICJDb21waWxlciBpbnN0YW5jZSBoYXMgbm8gU2VtYSBvYmplY3QhIik7CisgICAgcmV0dXJuICpUaGVTZW1hOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPFNlbWE+IHRha2VTZW1hKCk7CisgIHZvaWQgcmVzZXRBbmRMZWFrU2VtYSgpOworCisgIC8vLyB9CisgIC8vLyBAbmFtZSBNb2R1bGUgTWFuYWdlbWVudAorICAvLy8geworCisgIEludHJ1c2l2ZVJlZkNudFB0cjxBU1RSZWFkZXI+IGdldE1vZHVsZU1hbmFnZXIoKSBjb25zdDsKKyAgdm9pZCBzZXRNb2R1bGVNYW5hZ2VyKEludHJ1c2l2ZVJlZkNudFB0cjxBU1RSZWFkZXI+IFJlYWRlcik7CisKKyAgc3RkOjpzaGFyZWRfcHRyPE1vZHVsZURlcGVuZGVuY3lDb2xsZWN0b3I+IGdldE1vZHVsZURlcENvbGxlY3RvcigpIGNvbnN0OworICB2b2lkIHNldE1vZHVsZURlcENvbGxlY3RvcigKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNb2R1bGVEZXBlbmRlbmN5Q29sbGVjdG9yPiBDb2xsZWN0b3IpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxQQ0hDb250YWluZXJPcGVyYXRpb25zPiBnZXRQQ0hDb250YWluZXJPcGVyYXRpb25zKCkgY29uc3QgeworICAgIHJldHVybiBUaGVQQ0hDb250YWluZXJPcGVyYXRpb25zOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgUENIQ29udGFpbmVyV3JpdGVyIGRlcGVuZGluZyBvbiB0aGUKKyAgLy8vIGN1cnJlbnQgQ29kZUdlbk9wdGlvbnMuCisgIGNvbnN0IFBDSENvbnRhaW5lcldyaXRlciAmZ2V0UENIQ29udGFpbmVyV3JpdGVyKCkgY29uc3QgeworICAgIGFzc2VydChJbnZvY2F0aW9uICYmICJjYW5ub3QgZGV0ZXJtaW5lIG1vZHVsZSBmb3JtYXQgd2l0aG91dCBpbnZvY2F0aW9uIik7CisgICAgU3RyaW5nUmVmIEZvcm1hdCA9IGdldEhlYWRlclNlYXJjaE9wdHMoKS5Nb2R1bGVGb3JtYXQ7CisgICAgYXV0byAqV3JpdGVyID0gVGhlUENIQ29udGFpbmVyT3BlcmF0aW9ucy0+Z2V0V3JpdGVyT3JOdWxsKEZvcm1hdCk7CisgICAgaWYgKCFXcml0ZXIpIHsKKyAgICAgIGlmIChEaWFnbm9zdGljcykKKyAgICAgICAgRGlhZ25vc3RpY3MtPlJlcG9ydChkaWFnOjplcnJfbW9kdWxlX2Zvcm1hdF91bmhhbmRsZWQpIDw8IEZvcm1hdDsKKyAgICAgIGxsdm06OnJlcG9ydF9mYXRhbF9lcnJvcigidW5rbm93biBtb2R1bGUgZm9ybWF0Iik7CisgICAgfQorICAgIHJldHVybiAqV3JpdGVyOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgUENIQ29udGFpbmVyUmVhZGVyIGRlcGVuZGluZyBvbiB0aGUKKyAgLy8vIGN1cnJlbnQgQ29kZUdlbk9wdGlvbnMuCisgIGNvbnN0IFBDSENvbnRhaW5lclJlYWRlciAmZ2V0UENIQ29udGFpbmVyUmVhZGVyKCkgY29uc3QgeworICAgIGFzc2VydChJbnZvY2F0aW9uICYmICJjYW5ub3QgZGV0ZXJtaW5lIG1vZHVsZSBmb3JtYXQgd2l0aG91dCBpbnZvY2F0aW9uIik7CisgICAgU3RyaW5nUmVmIEZvcm1hdCA9IGdldEhlYWRlclNlYXJjaE9wdHMoKS5Nb2R1bGVGb3JtYXQ7CisgICAgYXV0byAqUmVhZGVyID0gVGhlUENIQ29udGFpbmVyT3BlcmF0aW9ucy0+Z2V0UmVhZGVyT3JOdWxsKEZvcm1hdCk7CisgICAgaWYgKCFSZWFkZXIpIHsKKyAgICAgIGlmIChEaWFnbm9zdGljcykKKyAgICAgICAgRGlhZ25vc3RpY3MtPlJlcG9ydChkaWFnOjplcnJfbW9kdWxlX2Zvcm1hdF91bmhhbmRsZWQpIDw8IEZvcm1hdDsKKyAgICAgIGxsdm06OnJlcG9ydF9mYXRhbF9lcnJvcigidW5rbm93biBtb2R1bGUgZm9ybWF0Iik7CisgICAgfQorICAgIHJldHVybiAqUmVhZGVyOworICB9CisKKyAgLy8vIH0KKyAgLy8vIEBuYW1lIENvZGUgQ29tcGxldGlvbgorICAvLy8geworCisgIGJvb2wgaGFzQ29kZUNvbXBsZXRpb25Db25zdW1lcigpIGNvbnN0IHsgcmV0dXJuIChib29sKUNvbXBsZXRpb25Db25zdW1lcjsgfQorCisgIENvZGVDb21wbGV0ZUNvbnN1bWVyICZnZXRDb2RlQ29tcGxldGlvbkNvbnN1bWVyKCkgY29uc3QgeworICAgIGFzc2VydChDb21wbGV0aW9uQ29uc3VtZXIgJiYKKyAgICAgICAgICAgIkNvbXBpbGVyIGluc3RhbmNlIGhhcyBubyBjb2RlIGNvbXBsZXRpb24gY29uc3VtZXIhIik7CisgICAgcmV0dXJuICpDb21wbGV0aW9uQ29uc3VtZXI7CisgIH0KKworICAvLy8gc2V0Q29kZUNvbXBsZXRpb25Db25zdW1lciAtIFJlcGxhY2UgdGhlIGN1cnJlbnQgY29kZSBjb21wbGV0aW9uIGNvbnN1bWVyOworICAvLy8gdGhlIGNvbXBpbGVyIGluc3RhbmNlIHRha2VzIG93bmVyc2hpcCBvZiBccCBWYWx1ZS4KKyAgdm9pZCBzZXRDb2RlQ29tcGxldGlvbkNvbnN1bWVyKENvZGVDb21wbGV0ZUNvbnN1bWVyICpWYWx1ZSk7CisKKyAgLy8vIH0KKyAgLy8vIEBuYW1lIEZyb250ZW5kIHRpbWVyCisgIC8vLyB7CisKKyAgYm9vbCBoYXNGcm9udGVuZFRpbWVyKCkgY29uc3QgeyByZXR1cm4gKGJvb2wpRnJvbnRlbmRUaW1lcjsgfQorCisgIGxsdm06OlRpbWVyICZnZXRGcm9udGVuZFRpbWVyKCkgY29uc3QgeworICAgIGFzc2VydChGcm9udGVuZFRpbWVyICYmICJDb21waWxlciBpbnN0YW5jZSBoYXMgbm8gZnJvbnRlbmQgdGltZXIhIik7CisgICAgcmV0dXJuICpGcm9udGVuZFRpbWVyOworICB9CisKKyAgLy8vIH0KKyAgLy8vIEBuYW1lIE91dHB1dCBGaWxlcworICAvLy8geworCisgIC8vLyBhZGRPdXRwdXRGaWxlIC0gQWRkIGFuIG91dHB1dCBmaWxlIG9udG8gdGhlIGxpc3Qgb2YgdHJhY2tlZCBvdXRwdXQgZmlsZXMuCisgIC8vLworICAvLy8gXHBhcmFtIE91dEZpbGUgLSBUaGUgb3V0cHV0IGZpbGUgaW5mby4KKyAgdm9pZCBhZGRPdXRwdXRGaWxlKE91dHB1dEZpbGUgJiZPdXRGaWxlKTsKKworICAvLy8gY2xlYXJPdXRwdXRGaWxlcyAtIENsZWFyIHRoZSBvdXRwdXQgZmlsZSBsaXN0LiBUaGUgdW5kZXJseWluZyBvdXRwdXQKKyAgLy8vIHN0cmVhbXMgbXVzdCBoYXZlIGJlZW4gY2xvc2VkIGJlZm9yZWhhbmQuCisgIC8vLworICAvLy8gXHBhcmFtIEVyYXNlRmlsZXMgLSBJZiB0cnVlLCBhdHRlbXB0IHRvIGVyYXNlIHRoZSBmaWxlcyBmcm9tIGRpc2suCisgIHZvaWQgY2xlYXJPdXRwdXRGaWxlcyhib29sIEVyYXNlRmlsZXMpOworCisgIC8vLyB9CisgIC8vLyBAbmFtZSBDb25zdHJ1Y3Rpb24gVXRpbGl0eSBNZXRob2RzCisgIC8vLyB7CisKKyAgLy8vIENyZWF0ZSB0aGUgZGlhZ25vc3RpY3MgZW5naW5lIHVzaW5nIHRoZSBpbnZvY2F0aW9uJ3MgZGlhZ25vc3RpYyBvcHRpb25zCisgIC8vLyBhbmQgcmVwbGFjZSBhbnkgZXhpc3Rpbmcgb25lIHdpdGggaXQuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgcm91dGluZSBhbHNvIHJlcGxhY2VzIHRoZSBkaWFnbm9zdGljIGNsaWVudCwKKyAgLy8vIGFsbG9jYXRpbmcgb25lIGlmIG9uZSBpcyBub3QgcHJvdmlkZWQuCisgIC8vLworICAvLy8gXHBhcmFtIENsaWVudCBJZiBub24tTlVMTCwgYSBkaWFnbm9zdGljIGNsaWVudCB0aGF0IHdpbGwgYmUKKyAgLy8vIGF0dGFjaGVkIHRvIChhbmQsIHRoZW4sIG93bmVkIGJ5KSB0aGUgRGlhZ25vc3RpY3NFbmdpbmUgaW5zaWRlIHRoaXMgQVNUCisgIC8vLyB1bml0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBTaG91bGRPd25DbGllbnQgSWYgQ2xpZW50IGlzIG5vbi1OVUxMLCBzcGVjaWZpZXMgd2hldGhlciAKKyAgLy8vIHRoZSBkaWFnbm9zdGljIG9iamVjdCBzaG91bGQgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGNsaWVudC4KKyAgdm9pZCBjcmVhdGVEaWFnbm9zdGljcyhEaWFnbm9zdGljQ29uc3VtZXIgKkNsaWVudCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRPd25DbGllbnQgPSB0cnVlKTsKKworICAvLy8gQ3JlYXRlIGEgRGlhZ25vc3RpY3NFbmdpbmUgb2JqZWN0IHdpdGggYSB0aGUgVGV4dERpYWdub3N0aWNQcmludGVyLgorICAvLy8KKyAgLy8vIElmIG5vIGRpYWdub3N0aWMgY2xpZW50IGlzIHByb3ZpZGVkLCB0aGlzIGNyZWF0ZXMgYQorICAvLy8gRGlhZ25vc3RpY0NvbnN1bWVyIHRoYXQgaXMgb3duZWQgYnkgdGhlIHJldHVybmVkIGRpYWdub3N0aWMKKyAgLy8vIG9iamVjdCwgaWYgdXNpbmcgZGlyZWN0bHkgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAgLy8vIHJlbGVhc2luZyB0aGUgcmV0dXJuZWQgRGlhZ25vc3RpY3NFbmdpbmUncyBjbGllbnQgZXZlbnR1YWxseS4KKyAgLy8vCisgIC8vLyBccGFyYW0gT3B0cyAtIFRoZSBkaWFnbm9zdGljIG9wdGlvbnM7IG5vdGUgdGhhdCB0aGUgY3JlYXRlZCB0ZXh0CisgIC8vLyBkaWFnbm9zdGljIG9iamVjdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGVzZSBvcHRpb25zLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDbGllbnQgSWYgbm9uLU5VTEwsIGEgZGlhZ25vc3RpYyBjbGllbnQgdGhhdCB3aWxsIGJlCisgIC8vLyBhdHRhY2hlZCB0byAoYW5kLCB0aGVuLCBvd25lZCBieSkgdGhlIHJldHVybmVkIERpYWdub3N0aWNzRW5naW5lCisgIC8vLyBvYmplY3QuCisgIC8vLworICAvLy8gXHBhcmFtIENvZGVHZW5PcHRzIElmIG5vbi1OVUxMLCB0aGUgY29kZSBnZW4gb3B0aW9ucyBpbiB1c2UsIHdoaWNoIG1heSBiZQorICAvLy8gdXNlZCBieSBzb21lIGRpYWdub3N0aWNzIHByaW50ZXJzIChmb3IgbG9nZ2luZyBwdXJwb3NlcyBvbmx5KS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBuZXcgb2JqZWN0IG9uIHN1Y2Nlc3MsIG9yIG51bGwgb24gZmFpbHVyZS4KKyAgc3RhdGljIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljc0VuZ2luZT4KKyAgY3JlYXRlRGlhZ25vc3RpY3MoRGlhZ25vc3RpY09wdGlvbnMgKk9wdHMsCisgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNDb25zdW1lciAqQ2xpZW50ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRPd25DbGllbnQgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlR2VuT3B0aW9ucyAqQ29kZUdlbk9wdHMgPSBudWxscHRyKTsKKworICAvLy8gQ3JlYXRlIHRoZSBmaWxlIG1hbmFnZXIgYW5kIHJlcGxhY2UgYW55IGV4aXN0aW5nIG9uZSB3aXRoIGl0LgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVGhlIG5ldyBmaWxlIG1hbmFnZXIgb24gc3VjY2Vzcywgb3IgbnVsbCBvbiBmYWlsdXJlLgorICBGaWxlTWFuYWdlciAqY3JlYXRlRmlsZU1hbmFnZXIoKTsKKworICAvLy8gQ3JlYXRlIHRoZSBzb3VyY2UgbWFuYWdlciBhbmQgcmVwbGFjZSBhbnkgZXhpc3Rpbmcgb25lIHdpdGggaXQuCisgIHZvaWQgY3JlYXRlU291cmNlTWFuYWdlcihGaWxlTWFuYWdlciAmRmlsZU1ncik7CisKKyAgLy8vIENyZWF0ZSB0aGUgcHJlcHJvY2Vzc29yLCB1c2luZyB0aGUgaW52b2NhdGlvbiwgZmlsZSwgYW5kIHNvdXJjZSBtYW5hZ2VycywKKyAgLy8vIGFuZCByZXBsYWNlIGFueSBleGlzdGluZyBvbmUgd2l0aCBpdC4KKyAgdm9pZCBjcmVhdGVQcmVwcm9jZXNzb3IoVHJhbnNsYXRpb25Vbml0S2luZCBUVUtpbmQpOworCisgIHN0ZDo6c3RyaW5nIGdldFNwZWNpZmljTW9kdWxlQ2FjaGVQYXRoKCk7CisKKyAgLy8vIENyZWF0ZSB0aGUgQVNUIGNvbnRleHQuCisgIHZvaWQgY3JlYXRlQVNUQ29udGV4dCgpOworCisgIC8vLyBDcmVhdGUgYW4gZXh0ZXJuYWwgQVNUIHNvdXJjZSB0byByZWFkIGEgUENIIGZpbGUgYW5kIGF0dGFjaCBpdCB0byB0aGUgQVNUCisgIC8vLyBjb250ZXh0LgorICB2b2lkIGNyZWF0ZVBDSEV4dGVybmFsQVNUU291cmNlKFN0cmluZ1JlZiBQYXRoLCBib29sIERpc2FibGVQQ0hWYWxpZGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dQQ0hXaXRoQ29tcGlsZXJFcnJvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqRGVzZXJpYWxpemF0aW9uTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPd25EZXNlcmlhbGl6YXRpb25MaXN0ZW5lcik7CisKKyAgLy8vIENyZWF0ZSBhbiBleHRlcm5hbCBBU1Qgc291cmNlIHRvIHJlYWQgYSBQQ0ggZmlsZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIC0gVGhlIG5ldyBvYmplY3Qgb24gc3VjY2Vzcywgb3IgbnVsbCBvbiBmYWlsdXJlLgorICBzdGF0aWMgSW50cnVzaXZlUmVmQ250UHRyPEFTVFJlYWRlcj4gY3JlYXRlUENIRXh0ZXJuYWxBU1RTb3VyY2UoCisgICAgICBTdHJpbmdSZWYgUGF0aCwgU3RyaW5nUmVmIFN5c3Jvb3QsIGJvb2wgRGlzYWJsZVBDSFZhbGlkYXRpb24sCisgICAgICBib29sIEFsbG93UENIV2l0aENvbXBpbGVyRXJyb3JzLCBQcmVwcm9jZXNzb3IgJlBQLCBBU1RDb250ZXh0ICZDb250ZXh0LAorICAgICAgY29uc3QgUENIQ29udGFpbmVyUmVhZGVyICZQQ0hDb250YWluZXJSZHIsCisgICAgICBBcnJheVJlZjxzdGQ6OnNoYXJlZF9wdHI8TW9kdWxlRmlsZUV4dGVuc2lvbj4+IEV4dGVuc2lvbnMsCisgICAgICBEZXBlbmRlbmN5RmlsZUdlbmVyYXRvciAqRGVwZW5kZW5jeUZpbGUsCisgICAgICBBcnJheVJlZjxzdGQ6OnNoYXJlZF9wdHI8RGVwZW5kZW5jeUNvbGxlY3Rvcj4+IERlcGVuZGVuY3lDb2xsZWN0b3JzLAorICAgICAgdm9pZCAqRGVzZXJpYWxpemF0aW9uTGlzdGVuZXIsIGJvb2wgT3duRGVzZXJpYWxpemF0aW9uTGlzdGVuZXIsCisgICAgICBib29sIFByZWFtYmxlLCBib29sIFVzZUdsb2JhbE1vZHVsZUluZGV4KTsKKworICAvLy8gQ3JlYXRlIGEgY29kZSBjb21wbGV0aW9uIGNvbnN1bWVyIHVzaW5nIHRoZSBpbnZvY2F0aW9uOyBub3RlIHRoYXQgdGhpcworICAvLy8gd2lsbCBjYXVzZSB0aGUgc291cmNlIG1hbmFnZXIgdG8gdHJ1bmNhdGUgdGhlIGlucHV0IHNvdXJjZSBmaWxlIGF0IHRoZQorICAvLy8gY29tcGxldGlvbiBwb2ludC4KKyAgdm9pZCBjcmVhdGVDb2RlQ29tcGxldGlvbkNvbnN1bWVyKCk7CisKKyAgLy8vIENyZWF0ZSBhIGNvZGUgY29tcGxldGlvbiBjb25zdW1lciB0byBwcmludCBjb2RlIGNvbXBsZXRpb24gcmVzdWx0cywgYXQKKyAgLy8vIFxwIEZpbGVuYW1lLCBccCBMaW5lLCBhbmQgXHAgQ29sdW1uLCB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbSBccCBPUy4KKyAgc3RhdGljIENvZGVDb21wbGV0ZUNvbnN1bWVyICpjcmVhdGVDb2RlQ29tcGxldGlvbkNvbnN1bWVyKAorICAgICAgUHJlcHJvY2Vzc29yICZQUCwgU3RyaW5nUmVmIEZpbGVuYW1lLCB1bnNpZ25lZCBMaW5lLCB1bnNpZ25lZCBDb2x1bW4sCisgICAgICBjb25zdCBDb2RlQ29tcGxldGVPcHRpb25zICZPcHRzLCByYXdfb3N0cmVhbSAmT1MpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIHRoZSBTZW1hIG9iamVjdCB0byBiZSB1c2VkIGZvciBwYXJzaW5nLgorICB2b2lkIGNyZWF0ZVNlbWEoVHJhbnNsYXRpb25Vbml0S2luZCBUVUtpbmQsCisgICAgICAgICAgICAgICAgICBDb2RlQ29tcGxldGVDb25zdW1lciAqQ29tcGxldGlvbkNvbnN1bWVyKTsKKyAgCisgIC8vLyBDcmVhdGUgdGhlIGZyb250ZW5kIHRpbWVyIGFuZCByZXBsYWNlIGFueSBleGlzdGluZyBvbmUgd2l0aCBpdC4KKyAgdm9pZCBjcmVhdGVGcm9udGVuZFRpbWVyKCk7CisKKyAgLy8vIENyZWF0ZSB0aGUgZGVmYXVsdCBvdXRwdXQgZmlsZSAoZnJvbSB0aGUgaW52b2NhdGlvbidzIG9wdGlvbnMpIGFuZCBhZGQgaXQKKyAgLy8vIHRvIHRoZSBsaXN0IG9mIHRyYWNrZWQgb3V0cHV0IGZpbGVzLgorICAvLy8KKyAgLy8vIFRoZSBmaWxlcyBjcmVhdGVkIGJ5IHRoaXMgZnVuY3Rpb24gYWx3YXlzIHVzZSB0ZW1wb3JhcnkgZmlsZXMgdG8gd3JpdGUgdG8KKyAgLy8vIHRoZWlyIHJlc3VsdCAodGhhdCBpcywgdGhlIGRhdGEgaXMgd3JpdHRlbiB0byBhIHRlbXBvcmFyeSBmaWxlIHdoaWNoIHdpbGwKKyAgLy8vIGF0b21pY2FsbHkgcmVwbGFjZSB0aGUgdGFyZ2V0IG91dHB1dCBvbiBzdWNjZXNzKS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIC0gTnVsbCBvbiBlcnJvci4KKyAgc3RkOjp1bmlxdWVfcHRyPHJhd19wd3JpdGVfc3RyZWFtPgorICBjcmVhdGVEZWZhdWx0T3V0cHV0RmlsZShib29sIEJpbmFyeSA9IHRydWUsIFN0cmluZ1JlZiBCYXNlSW5wdXQgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEV4dGVuc2lvbiA9ICIiKTsKKworICAvLy8gQ3JlYXRlIGEgbmV3IG91dHB1dCBmaWxlIGFuZCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgdHJhY2tlZCBvdXRwdXQgZmlsZXMsCisgIC8vLyBvcHRpb25hbGx5IGRlcml2aW5nIHRoZSBvdXRwdXQgcGF0aCBuYW1lLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gLSBOdWxsIG9uIGVycm9yLgorICBzdGQ6OnVuaXF1ZV9wdHI8cmF3X3B3cml0ZV9zdHJlYW0+CisgIGNyZWF0ZU91dHB1dEZpbGUoU3RyaW5nUmVmIE91dHB1dFBhdGgsIGJvb2wgQmluYXJ5LCBib29sIFJlbW92ZUZpbGVPblNpZ25hbCwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQmFzZUlucHV0LCBTdHJpbmdSZWYgRXh0ZW5zaW9uLCBib29sIFVzZVRlbXBvcmFyeSwKKyAgICAgICAgICAgICAgICAgICBib29sIENyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyA9IGZhbHNlKTsKKworICAvLy8gQ3JlYXRlIGEgbmV3IG91dHB1dCBmaWxlLCBvcHRpb25hbGx5IGRlcml2aW5nIHRoZSBvdXRwdXQgcGF0aCBuYW1lLgorICAvLy8KKyAgLy8vIElmIFxwIE91dHB1dFBhdGggaXMgZW1wdHksIHRoZW4gY3JlYXRlT3V0cHV0RmlsZSB3aWxsIGRlcml2ZSBhbiBvdXRwdXQKKyAgLy8vIHBhdGggbG9jYXRpb24gYXMgXHAgQmFzZUlucHV0LCB3aXRoIGFueSBzdWZmaXggcmVtb3ZlZCwgYW5kIFxwIEV4dGVuc2lvbgorICAvLy8gYXBwZW5kZWQuIElmIFxwIE91dHB1dFBhdGggaXMgbm90IHN0ZG91dCBhbmQgXHAgVXNlVGVtcG9yYXJ5CisgIC8vLyBpcyB0cnVlLCBjcmVhdGVPdXRwdXRGaWxlIHdpbGwgY3JlYXRlIGEgbmV3IHRlbXBvcmFyeSBmaWxlIHRoYXQgbXVzdCBiZQorICAvLy8gcmVuYW1lZCB0byBccCBPdXRwdXRQYXRoIGluIHRoZSBlbmQuCisgIC8vLworICAvLy8gXHBhcmFtIE91dHB1dFBhdGggLSBJZiBnaXZlbiwgdGhlIHBhdGggdG8gdGhlIG91dHB1dCBmaWxlLgorICAvLy8gXHBhcmFtIEVycm9yIFtvdXRdIC0gT24gZmFpbHVyZSwgdGhlIGVycm9yLgorICAvLy8gXHBhcmFtIEJhc2VJbnB1dCAtIElmIFxwIE91dHB1dFBhdGggaXMgZW1wdHksIHRoZSBpbnB1dCBwYXRoIG5hbWUgdG8gdXNlCisgIC8vLyBmb3IgZGVyaXZpbmcgdGhlIG91dHB1dCBwYXRoLgorICAvLy8gXHBhcmFtIEV4dGVuc2lvbiAtIFRoZSBleHRlbnNpb24gdG8gdXNlIGZvciBkZXJpdmVkIG91dHB1dCBuYW1lcy4KKyAgLy8vIFxwYXJhbSBCaW5hcnkgLSBUaGUgbW9kZSB0byBvcGVuIHRoZSBmaWxlIGluLgorICAvLy8gXHBhcmFtIFJlbW92ZUZpbGVPblNpZ25hbCAtIFdoZXRoZXIgdGhlIGZpbGUgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgd2l0aAorICAvLy8gbGx2bTo6c3lzOjpSZW1vdmVGaWxlT25TaWduYWwuIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBzYWZlIGZvcgorICAvLy8gbXVsdGl0aHJlYWRlZCB1c2UsIGFzIHRoZSB1bmRlcmx5aW5nIHNpZ25hbCBtZWNoYW5pc20gaXMgbm90IHJlZW50cmFudAorICAvLy8gXHBhcmFtIFVzZVRlbXBvcmFyeSAtIENyZWF0ZSBhIG5ldyB0ZW1wb3JhcnkgZmlsZSB0aGF0IG11c3QgYmUgcmVuYW1lZCB0bworICAvLy8gT3V0cHV0UGF0aCBpbiB0aGUgZW5kLgorICAvLy8gXHBhcmFtIENyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyAtIFdoZW4gXHAgVXNlVGVtcG9yYXJ5IGlzIHRydWUsIGNyZWF0ZQorICAvLy8gbWlzc2luZyBkaXJlY3RvcmllcyBpbiB0aGUgb3V0cHV0IHBhdGguCisgIC8vLyBccGFyYW0gUmVzdWx0UGF0aE5hbWUgW291dF0gLSBJZiBnaXZlbiwgdGhlIHJlc3VsdCBwYXRoIG5hbWUgd2lsbCBiZQorICAvLy8gc3RvcmVkIGhlcmUgb24gc3VjY2Vzcy4KKyAgLy8vIFxwYXJhbSBUZW1wUGF0aE5hbWUgW291dF0gLSBJZiBnaXZlbiwgdGhlIHRlbXBvcmFyeSBmaWxlIHBhdGggbmFtZQorICAvLy8gd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBzdWNjZXNzLgorICBzdGQ6OnVuaXF1ZV9wdHI8cmF3X3B3cml0ZV9zdHJlYW0+CisgIGNyZWF0ZU91dHB1dEZpbGUoU3RyaW5nUmVmIE91dHB1dFBhdGgsIHN0ZDo6ZXJyb3JfY29kZSAmRXJyb3IsIGJvb2wgQmluYXJ5LAorICAgICAgICAgICAgICAgICAgIGJvb2wgUmVtb3ZlRmlsZU9uU2lnbmFsLCBTdHJpbmdSZWYgQmFzZUlucHV0LAorICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBFeHRlbnNpb24sIGJvb2wgVXNlVGVtcG9yYXJ5LAorICAgICAgICAgICAgICAgICAgIGJvb2wgQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzLCBzdGQ6OnN0cmluZyAqUmVzdWx0UGF0aE5hbWUsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKlRlbXBQYXRoTmFtZSk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPHJhd19wd3JpdGVfc3RyZWFtPiBjcmVhdGVOdWxsT3V0cHV0RmlsZSgpOworCisgIC8vLyB9CisgIC8vLyBAbmFtZSBJbml0aWFsaXphdGlvbiBVdGlsaXR5IE1ldGhvZHMKKyAgLy8vIHsKKworICAvLy8gSW5pdGlhbGl6ZVNvdXJjZU1hbmFnZXIgLSBJbml0aWFsaXplIHRoZSBzb3VyY2UgbWFuYWdlciB0byBzZXQgSW5wdXRGaWxlCisgIC8vLyBhcyB0aGUgbWFpbiBmaWxlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVHJ1ZSBvbiBzdWNjZXNzLgorICBib29sIEluaXRpYWxpemVTb3VyY2VNYW5hZ2VyKGNvbnN0IEZyb250ZW5kSW5wdXRGaWxlICZJbnB1dCk7CisKKyAgLy8vIEluaXRpYWxpemVTb3VyY2VNYW5hZ2VyIC0gSW5pdGlhbGl6ZSB0aGUgc291cmNlIG1hbmFnZXIgdG8gc2V0IElucHV0RmlsZQorICAvLy8gYXMgdGhlIG1haW4gZmlsZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRydWUgb24gc3VjY2Vzcy4KKyAgc3RhdGljIGJvb2wgSW5pdGlhbGl6ZVNvdXJjZU1hbmFnZXIoY29uc3QgRnJvbnRlbmRJbnB1dEZpbGUgJklucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVNYW5hZ2VyICZGaWxlTWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlclNlYXJjaCAqSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZGVuY3lPdXRwdXRPcHRpb25zICZEZXBPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGcm9udGVuZE9wdGlvbnMgJk9wdHMpOworCisgIC8vLyB9CisKKyAgdm9pZCBzZXRPdXRwdXRTdHJlYW0oc3RkOjp1bmlxdWVfcHRyPGxsdm06OnJhd19wd3JpdGVfc3RyZWFtPiBPdXRTdHJlYW0pIHsKKyAgICBPdXRwdXRTdHJlYW0gPSBzdGQ6Om1vdmUoT3V0U3RyZWFtKTsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpyYXdfcHdyaXRlX3N0cmVhbT4gdGFrZU91dHB1dFN0cmVhbSgpIHsKKyAgICByZXR1cm4gc3RkOjptb3ZlKE91dHB1dFN0cmVhbSk7CisgIH0KKworICAvLyBDcmVhdGUgbW9kdWxlIG1hbmFnZXIuCisgIHZvaWQgY3JlYXRlTW9kdWxlTWFuYWdlcigpOworCisgIGJvb2wgbG9hZE1vZHVsZUZpbGUoU3RyaW5nUmVmIEZpbGVOYW1lKTsKKworICBNb2R1bGVMb2FkUmVzdWx0IGxvYWRNb2R1bGUoU291cmNlTG9jYXRpb24gSW1wb3J0TG9jLCBNb2R1bGVJZFBhdGggUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZTo6TmFtZVZpc2liaWxpdHlLaW5kIFZpc2liaWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzSW5jbHVzaW9uRGlyZWN0aXZlKSBvdmVycmlkZTsKKworICB2b2lkIGxvYWRNb2R1bGVGcm9tU291cmNlKFNvdXJjZUxvY2F0aW9uIEltcG9ydExvYywgU3RyaW5nUmVmIE1vZHVsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNvdXJjZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBtYWtlTW9kdWxlVmlzaWJsZShNb2R1bGUgKk1vZCwgTW9kdWxlOjpOYW1lVmlzaWJpbGl0eUtpbmQgVmlzaWJpbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MpIG92ZXJyaWRlOworCisgIGJvb2wgaGFkTW9kdWxlTG9hZGVyRmF0YWxGYWlsdXJlKCkgY29uc3QgeworICAgIHJldHVybiBNb2R1bGVMb2FkZXI6OkhhZEZhdGFsRmFpbHVyZTsKKyAgfQorCisgIEdsb2JhbE1vZHVsZUluZGV4ICpsb2FkR2xvYmFsTW9kdWxlSW5kZXgoU291cmNlTG9jYXRpb24gVHJpZ2dlckxvYykgb3ZlcnJpZGU7CisKKyAgYm9vbCBsb29rdXBNaXNzaW5nSW1wb3J0cyhTdHJpbmdSZWYgTmFtZSwgU291cmNlTG9jYXRpb24gVHJpZ2dlckxvYykgb3ZlcnJpZGU7CisKKyAgdm9pZCBhZGREZXBlbmRlbmN5Q29sbGVjdG9yKHN0ZDo6c2hhcmVkX3B0cjxEZXBlbmRlbmN5Q29sbGVjdG9yPiBMaXN0ZW5lcikgeworICAgIERlcGVuZGVuY3lDb2xsZWN0b3JzLnB1c2hfYmFjayhzdGQ6Om1vdmUoTGlzdGVuZXIpKTsKKyAgfQorCisgIHZvaWQgc2V0RXh0ZXJuYWxTZW1hU291cmNlKEludHJ1c2l2ZVJlZkNudFB0cjxFeHRlcm5hbFNlbWFTb3VyY2U+IEVTUyk7CisKKyAgTWVtb3J5QnVmZmVyQ2FjaGUgJmdldFBDTUNhY2hlKCkgY29uc3QgeyByZXR1cm4gKlBDTUNhY2hlOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Db21waWxlckludm9jYXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0NvbXBpbGVySW52b2NhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZWZjYWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Db21waWxlckludm9jYXRpb24uaApAQCAtMCwwICsxLDIzNyBAQAorLy89PT0tIENvbXBpbGVySW52b2NhdGlvbi5oIC0gQ29tcGlsZXIgSW52b2NhdGlvbiBIZWxwZXIgRGF0YSAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0ZST05URU5EX0NPTVBJTEVSSU5WT0NBVElPTl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfRlJPTlRFTkRfQ09NUElMRVJJTlZPQ0FUSU9OX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWNPcHRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRmlsZVN5c3RlbU9wdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Db2RlR2VuT3B0aW9ucy5oIgorI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0RlcGVuZGVuY3lPdXRwdXRPcHRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRPcHRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvTGFuZ1N0YW5kYXJkLmgiCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvTWlncmF0b3JPcHRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvUHJlcHJvY2Vzc29yT3V0cHV0T3B0aW9ucy5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQW5hbHl6ZXJPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBUcmlwbGU7CisKK25hbWVzcGFjZSBvcHQgeworCitjbGFzcyBBcmdMaXN0OworCit9IC8vIG5hbWVzcGFjZSBvcHQKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBEaWFnbm9zdGljc0VuZ2luZTsKK2NsYXNzIEhlYWRlclNlYXJjaE9wdGlvbnM7CitjbGFzcyBQcmVwcm9jZXNzb3JPcHRpb25zOworY2xhc3MgVGFyZ2V0T3B0aW9uczsKKworLy8vIFxicmllZiBGaWxsIG91dCBPcHRzIGJhc2VkIG9uIHRoZSBvcHRpb25zIGdpdmVuIGluIEFyZ3MuCisvLy8KKy8vLyBBcmdzIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgZnJvbSB0aGUgT3B0VGFibGUgcmV0dXJuZWQgYnkKKy8vLyBjcmVhdGVDQzFPcHRUYWJsZSgpLgorLy8vCisvLy8gV2hlbiBlcnJvcnMgYXJlIGVuY291bnRlcmVkLCByZXR1cm4gZmFsc2UgYW5kLCBpZiBEaWFncyBpcyBub24tbnVsbCwKKy8vLyByZXBvcnQgdGhlIGVycm9yKHMpLgorYm9vbCBQYXJzZURpYWdub3N0aWNBcmdzKERpYWdub3N0aWNPcHRpb25zICZPcHRzLCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgKkRpYWdzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERlZmF1bHREaWFnQ29sb3IgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVmYXVsdFNob3dPcHQgPSB0cnVlKTsKKworY2xhc3MgQ29tcGlsZXJJbnZvY2F0aW9uQmFzZSB7CitwdWJsaWM6CisgIC8vLyBPcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBsYW5ndWFnZSB2YXJpYW50LgorICBzdGQ6OnNoYXJlZF9wdHI8TGFuZ09wdGlvbnM+IExhbmdPcHRzOworCisgIC8vLyBPcHRpb25zIGNvbnRyb2xsaW5nIHRoZSB0YXJnZXQuCisgIHN0ZDo6c2hhcmVkX3B0cjxUYXJnZXRPcHRpb25zPiBUYXJnZXRPcHRzOworCisgIC8vLyBPcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBkaWFnbm9zdGljIGVuZ2luZS4KKyAgSW50cnVzaXZlUmVmQ250UHRyPERpYWdub3N0aWNPcHRpb25zPiBEaWFnbm9zdGljT3B0czsKKworICAvLy8gT3B0aW9ucyBjb250cm9sbGluZyB0aGUgXCNpbmNsdWRlIGRpcmVjdGl2ZS4KKyAgc3RkOjpzaGFyZWRfcHRyPEhlYWRlclNlYXJjaE9wdGlvbnM+IEhlYWRlclNlYXJjaE9wdHM7CisKKyAgLy8vIE9wdGlvbnMgY29udHJvbGxpbmcgdGhlIHByZXByb2Nlc3NvciAoYXNpZGUgZnJvbSBcI2luY2x1ZGUgaGFuZGxpbmcpLgorICBzdGQ6OnNoYXJlZF9wdHI8UHJlcHJvY2Vzc29yT3B0aW9ucz4gUHJlcHJvY2Vzc29yT3B0czsKKworICBDb21waWxlckludm9jYXRpb25CYXNlKCk7CisgIENvbXBpbGVySW52b2NhdGlvbkJhc2UoY29uc3QgQ29tcGlsZXJJbnZvY2F0aW9uQmFzZSAmWCk7CisgIENvbXBpbGVySW52b2NhdGlvbkJhc2UgJm9wZXJhdG9yPShjb25zdCBDb21waWxlckludm9jYXRpb25CYXNlICYpID0gZGVsZXRlOworICB+Q29tcGlsZXJJbnZvY2F0aW9uQmFzZSgpOworCisgIExhbmdPcHRpb25zICpnZXRMYW5nT3B0cygpIHsgcmV0dXJuIExhbmdPcHRzLmdldCgpOyB9CisgIGNvbnN0IExhbmdPcHRpb25zICpnZXRMYW5nT3B0cygpIGNvbnN0IHsgcmV0dXJuIExhbmdPcHRzLmdldCgpOyB9CisKKyAgVGFyZ2V0T3B0aW9ucyAmZ2V0VGFyZ2V0T3B0cygpIHsgcmV0dXJuICpUYXJnZXRPcHRzLmdldCgpOyB9CisgIGNvbnN0IFRhcmdldE9wdGlvbnMgJmdldFRhcmdldE9wdHMoKSBjb25zdCB7IHJldHVybiAqVGFyZ2V0T3B0cy5nZXQoKTsgfQorCisgIERpYWdub3N0aWNPcHRpb25zICZnZXREaWFnbm9zdGljT3B0cygpIGNvbnN0IHsgcmV0dXJuICpEaWFnbm9zdGljT3B0czsgfQorCisgIEhlYWRlclNlYXJjaE9wdGlvbnMgJmdldEhlYWRlclNlYXJjaE9wdHMoKSB7IHJldHVybiAqSGVhZGVyU2VhcmNoT3B0czsgfQorCisgIGNvbnN0IEhlYWRlclNlYXJjaE9wdGlvbnMgJmdldEhlYWRlclNlYXJjaE9wdHMoKSBjb25zdCB7CisgICAgcmV0dXJuICpIZWFkZXJTZWFyY2hPcHRzOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPEhlYWRlclNlYXJjaE9wdGlvbnM+IGdldEhlYWRlclNlYXJjaE9wdHNQdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIEhlYWRlclNlYXJjaE9wdHM7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8UHJlcHJvY2Vzc29yT3B0aW9ucz4gZ2V0UHJlcHJvY2Vzc29yT3B0c1B0cigpIHsKKyAgICByZXR1cm4gUHJlcHJvY2Vzc29yT3B0czsKKyAgfQorCisgIFByZXByb2Nlc3Nvck9wdGlvbnMgJmdldFByZXByb2Nlc3Nvck9wdHMoKSB7IHJldHVybiAqUHJlcHJvY2Vzc29yT3B0czsgfQorCisgIGNvbnN0IFByZXByb2Nlc3Nvck9wdGlvbnMgJmdldFByZXByb2Nlc3Nvck9wdHMoKSBjb25zdCB7CisgICAgcmV0dXJuICpQcmVwcm9jZXNzb3JPcHRzOworICB9Cit9OworICAKKy8vLyBcYnJpZWYgSGVscGVyIGNsYXNzIGZvciBob2xkaW5nIHRoZSBkYXRhIG5lY2Vzc2FyeSB0byBpbnZva2UgdGhlIGNvbXBpbGVyLgorLy8vCisvLy8gVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byByZXByZXNlbnQgYW4gYWJzdHJhY3QgImludm9jYXRpb24iIG9mIHRoZQorLy8vIGNvbXBpbGVyLCBpbmNsdWRpbmcgZGF0YSBzdWNoIGFzIHRoZSBpbmNsdWRlIHBhdGhzLCB0aGUgY29kZSBnZW5lcmF0aW9uCisvLy8gb3B0aW9ucywgdGhlIHdhcm5pbmcgZmxhZ3MsIGFuZCBzbyBvbi4KK2NsYXNzIENvbXBpbGVySW52b2NhdGlvbiA6IHB1YmxpYyBDb21waWxlckludm9jYXRpb25CYXNlIHsKKyAgLy8vIE9wdGlvbnMgY29udHJvbGxpbmcgdGhlIHN0YXRpYyBhbmFseXplci4KKyAgQW5hbHl6ZXJPcHRpb25zUmVmIEFuYWx5emVyT3B0czsKKworICBNaWdyYXRvck9wdGlvbnMgTWlncmF0b3JPcHRzOworICAKKyAgLy8vIE9wdGlvbnMgY29udHJvbGxpbmcgSVJnZW4gYW5kIHRoZSBiYWNrZW5kLgorICBDb2RlR2VuT3B0aW9ucyBDb2RlR2VuT3B0czsKKworICAvLy8gT3B0aW9ucyBjb250cm9sbGluZyBkZXBlbmRlbmN5IG91dHB1dC4KKyAgRGVwZW5kZW5jeU91dHB1dE9wdGlvbnMgRGVwZW5kZW5jeU91dHB1dE9wdHM7CisKKyAgLy8vIE9wdGlvbnMgY29udHJvbGxpbmcgZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4KKyAgRmlsZVN5c3RlbU9wdGlvbnMgRmlsZVN5c3RlbU9wdHM7CisKKyAgLy8vIE9wdGlvbnMgY29udHJvbGxpbmcgdGhlIGZyb250ZW5kIGl0c2VsZi4KKyAgRnJvbnRlbmRPcHRpb25zIEZyb250ZW5kT3B0czsKKworICAvLy8gT3B0aW9ucyBjb250cm9sbGluZyBwcmVwcm9jZXNzZWQgb3V0cHV0LgorICBQcmVwcm9jZXNzb3JPdXRwdXRPcHRpb25zIFByZXByb2Nlc3Nvck91dHB1dE9wdHM7CisKK3B1YmxpYzoKKyAgQ29tcGlsZXJJbnZvY2F0aW9uKCkgOiBBbmFseXplck9wdHMobmV3IEFuYWx5emVyT3B0aW9ucygpKSB7fQorCisgIC8vLyBAbmFtZSBVdGlsaXR5IE1ldGhvZHMKKyAgLy8vIEB7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBjb21waWxlciBpbnZvY2F0aW9uIGZyb20gYSBsaXN0IG9mIGlucHV0IG9wdGlvbnMuCisgIC8vLyBccmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCisgIC8vLworICAvLy8gXHBhcmFtIFtvdXRdIFJlcyAtIFRoZSByZXN1bHRpbmcgaW52b2NhdGlvbi4KKyAgLy8vIFxwYXJhbSBBcmdCZWdpbiAtIFRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcmd1bWVudCB2ZWN0b3IuCisgIC8vLyBccGFyYW0gQXJnRW5kIC0gVGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJndW1lbnQgdmVjdG9yLgorICAvLy8gXHBhcmFtIERpYWdzIC0gVGhlIGRpYWdub3N0aWMgZW5naW5lIHRvIHVzZSBmb3IgZXJyb3JzLgorICBzdGF0aWMgYm9vbCBDcmVhdGVGcm9tQXJncyhDb21waWxlckludm9jYXRpb24gJlJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QgKkFyZ0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCAqQXJnRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNvbXBpbGVyIGhlYWRlcnMKKyAgLy8vIHJlc2lkZSwgcmVsYXRpdmUgdG8gdGhlIGNvbXBpbGVyIGJpbmFyeSAoZm91bmQgYnkgdGhlIHBhc3NlZCBpbgorICAvLy8gYXJndW1lbnRzKS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQXJndjAgLSBUaGUgcHJvZ3JhbSBwYXRoIChmcm9tIGFyZ3ZbMF0pLCBmb3IgZmluZGluZyB0aGUgYnVpbHRpbgorICAvLy8gY29tcGlsZXIgcGF0aC4KKyAgLy8vIFxwYXJhbSBNYWluQWRkciAtIFRoZSBhZGRyZXNzIG9mIG1haW4gKG9yIHNvbWUgb3RoZXIgZnVuY3Rpb24gaW4gdGhlIG1haW4KKyAgLy8vIGV4ZWN1dGFibGUpLCBmb3IgZmluZGluZyB0aGUgYnVpbHRpbiBjb21waWxlciBwYXRoLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgR2V0UmVzb3VyY2VzUGF0aChjb25zdCBjaGFyICpBcmd2MCwgdm9pZCAqTWFpbkFkZHIpOworCisgIC8vLyBcYnJpZWYgU2V0IGxhbmd1YWdlIGRlZmF1bHRzIGZvciB0aGUgZ2l2ZW4gaW5wdXQgbGFuZ3VhZ2UgYW5kCisgIC8vLyBsYW5ndWFnZSBzdGFuZGFyZCBpbiB0aGUgZ2l2ZW4gTGFuZ09wdGlvbnMgb2JqZWN0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBPcHRzIC0gVGhlIExhbmdPcHRpb25zIG9iamVjdCB0byBzZXQgdXAuCisgIC8vLyBccGFyYW0gSUsgLSBUaGUgaW5wdXQgbGFuZ3VhZ2UuCisgIC8vLyBccGFyYW0gVCAtIFRoZSB0YXJnZXQgdHJpcGxlLgorICAvLy8gXHBhcmFtIFBQT3B0cyAtIFRoZSBQcmVwcm9jZXNzb3JPcHRpb25zIGFmZmVjdGVkLgorICAvLy8gXHBhcmFtIExhbmdTdGQgLSBUaGUgaW5wdXQgbGFuZ3VhZ2Ugc3RhbmRhcmQuCisgIHN0YXRpYyB2b2lkIHNldExhbmdEZWZhdWx0cyhMYW5nT3B0aW9ucyAmT3B0cywgSW5wdXRLaW5kIElLLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlRyaXBsZSAmVCwgUHJlcHJvY2Vzc29yT3B0aW9ucyAmUFBPcHRzLAorICAgICAgICAgICAgICAgICAgIExhbmdTdGFuZGFyZDo6S2luZCBMYW5nU3RkID0gTGFuZ1N0YW5kYXJkOjpsYW5nX3Vuc3BlY2lmaWVkKTsKKyAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYSBtb2R1bGUgaGFzaCBzdHJpbmcgdGhhdCBpcyBzdWl0YWJsZSBmb3IgdW5pcXVlbHkgCisgIC8vLyBpZGVudGlmeWluZyB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCB0aGUgbW9kdWxlIHdhcyBidWlsdC4KKyAgc3RkOjpzdHJpbmcgZ2V0TW9kdWxlSGFzaCgpIGNvbnN0OworICAKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBPcHRpb24gU3ViZ3JvdXBzCisgIC8vLyBAeworCisgIEFuYWx5emVyT3B0aW9uc1JlZiBnZXRBbmFseXplck9wdHMoKSBjb25zdCB7IHJldHVybiBBbmFseXplck9wdHM7IH0KKworICBNaWdyYXRvck9wdGlvbnMgJmdldE1pZ3JhdG9yT3B0cygpIHsgcmV0dXJuIE1pZ3JhdG9yT3B0czsgfQorICBjb25zdCBNaWdyYXRvck9wdGlvbnMgJmdldE1pZ3JhdG9yT3B0cygpIGNvbnN0IHsgcmV0dXJuIE1pZ3JhdG9yT3B0czsgfQorICAKKyAgQ29kZUdlbk9wdGlvbnMgJmdldENvZGVHZW5PcHRzKCkgeyByZXR1cm4gQ29kZUdlbk9wdHM7IH0KKyAgY29uc3QgQ29kZUdlbk9wdGlvbnMgJmdldENvZGVHZW5PcHRzKCkgY29uc3QgeyByZXR1cm4gQ29kZUdlbk9wdHM7IH0KKworICBEZXBlbmRlbmN5T3V0cHV0T3B0aW9ucyAmZ2V0RGVwZW5kZW5jeU91dHB1dE9wdHMoKSB7CisgICAgcmV0dXJuIERlcGVuZGVuY3lPdXRwdXRPcHRzOworICB9CisKKyAgY29uc3QgRGVwZW5kZW5jeU91dHB1dE9wdGlvbnMgJmdldERlcGVuZGVuY3lPdXRwdXRPcHRzKCkgY29uc3QgeworICAgIHJldHVybiBEZXBlbmRlbmN5T3V0cHV0T3B0czsKKyAgfQorCisgIEZpbGVTeXN0ZW1PcHRpb25zICZnZXRGaWxlU3lzdGVtT3B0cygpIHsgcmV0dXJuIEZpbGVTeXN0ZW1PcHRzOyB9CisKKyAgY29uc3QgRmlsZVN5c3RlbU9wdGlvbnMgJmdldEZpbGVTeXN0ZW1PcHRzKCkgY29uc3QgeworICAgIHJldHVybiBGaWxlU3lzdGVtT3B0czsKKyAgfQorCisgIEZyb250ZW5kT3B0aW9ucyAmZ2V0RnJvbnRlbmRPcHRzKCkgeyByZXR1cm4gRnJvbnRlbmRPcHRzOyB9CisgIGNvbnN0IEZyb250ZW5kT3B0aW9ucyAmZ2V0RnJvbnRlbmRPcHRzKCkgY29uc3QgeyByZXR1cm4gRnJvbnRlbmRPcHRzOyB9CisKKyAgUHJlcHJvY2Vzc29yT3V0cHV0T3B0aW9ucyAmZ2V0UHJlcHJvY2Vzc29yT3V0cHV0T3B0cygpIHsKKyAgICByZXR1cm4gUHJlcHJvY2Vzc29yT3V0cHV0T3B0czsKKyAgfQorCisgIGNvbnN0IFByZXByb2Nlc3Nvck91dHB1dE9wdGlvbnMgJmdldFByZXByb2Nlc3Nvck91dHB1dE9wdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIFByZXByb2Nlc3Nvck91dHB1dE9wdHM7CisgIH0KKworICAvLy8gQH0KK307CisKK25hbWVzcGFjZSB2ZnMgeworCitjbGFzcyBGaWxlU3lzdGVtOworCit9IC8vIG5hbWVzcGFjZSB2ZnMKKworSW50cnVzaXZlUmVmQ250UHRyPHZmczo6RmlsZVN5c3RlbT4KK2NyZWF0ZVZGU0Zyb21Db21waWxlckludm9jYXRpb24oY29uc3QgQ29tcGlsZXJJbnZvY2F0aW9uICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzKTsKKworSW50cnVzaXZlUmVmQ250UHRyPHZmczo6RmlsZVN5c3RlbT4KK2NyZWF0ZVZGU0Zyb21Db21waWxlckludm9jYXRpb24oY29uc3QgQ29tcGlsZXJJbnZvY2F0aW9uICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpGaWxlU3lzdGVtPiBCYXNlRlMpOworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19GUk9OVEVORF9DT01QSUxFUklOVk9DQVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvRGVwZW5kZW5jeU91dHB1dE9wdGlvbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0RlcGVuZGVuY3lPdXRwdXRPcHRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlMzZjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0RlcGVuZGVuY3lPdXRwdXRPcHRpb25zLmgKQEAgLTAsMCArMSw3NiBAQAorLy89PT0tLS0gRGVwZW5kZW5jeU91dHB1dE9wdGlvbnMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0ZST05URU5EX0RFUEVOREVOQ1lPVVRQVVRPUFRJT05TX0gKKyNkZWZpbmUgTExWTV9DTEFOR19GUk9OVEVORF9ERVBFTkRFTkNZT1VUUFVUT1BUSU9OU19ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworCisvLy8gRGVwZW5kZW5jeU91dHB1dEZvcm1hdCAtIEZvcm1hdCBmb3IgdGhlIGNvbXBpbGVyIGRlcGVuZGVuY3kgZmlsZS4KK2VudW0gY2xhc3MgRGVwZW5kZW5jeU91dHB1dEZvcm1hdCB7IE1ha2UsIE5NYWtlIH07CisKKy8vLyBEZXBlbmRlbmN5T3V0cHV0T3B0aW9ucyAtIE9wdGlvbnMgZm9yIGNvbnRyb2xsaW5nIHRoZSBjb21waWxlciBkZXBlbmRlbmN5CisvLy8gZmlsZSBnZW5lcmF0aW9uLgorY2xhc3MgRGVwZW5kZW5jeU91dHB1dE9wdGlvbnMgeworcHVibGljOgorICB1bnNpZ25lZCBJbmNsdWRlU3lzdGVtSGVhZGVycyA6IDE7IC8vLzwgSW5jbHVkZSBzeXN0ZW0gaGVhZGVyIGRlcGVuZGVuY2llcy4KKyAgdW5zaWduZWQgU2hvd0hlYWRlckluY2x1ZGVzIDogMTsgICAvLy88IFNob3cgaGVhZGVyIGluY2x1c2lvbnMgKC1IKS4KKyAgdW5zaWduZWQgVXNlUGhvbnlUYXJnZXRzIDogMTsgICAgICAvLy88IEluY2x1ZGUgcGhvbnkgdGFyZ2V0cyBmb3IgZWFjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBkZXBlbmRlbmN5LCB3aGljaCBjYW4gYXZvaWQgc29tZSAnbWFrZScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gcHJvYmxlbXMuCisgIHVuc2lnbmVkIEFkZE1pc3NpbmdIZWFkZXJEZXBzIDogMTsgLy8vPCBBZGQgbWlzc2luZyBoZWFkZXJzIHRvIGRlcGVuZGVuY3kgbGlzdAorICB1bnNpZ25lZCBQcmludFNob3dJbmNsdWRlcyA6IDE7IC8vLzwgUHJpbnQgY2wuZXhlIHN0eWxlIC9zaG93SW5jbHVkZXMgaW5mby4KKyAgdW5zaWduZWQgSW5jbHVkZU1vZHVsZUZpbGVzIDogMTsgLy8vPCBJbmNsdWRlIG1vZHVsZSBmaWxlIGRlcGVuZGVuY2llcy4KKworICAvLy8gVGhlIGZvcm1hdCBmb3IgdGhlIGRlcGVuZGVuY3kgZmlsZS4KKyAgRGVwZW5kZW5jeU91dHB1dEZvcm1hdCBPdXRwdXRGb3JtYXQ7CisKKyAgLy8vIFRoZSBmaWxlIHRvIHdyaXRlIGRlcGVuZGVuY3kgb3V0cHV0IHRvLgorICBzdGQ6OnN0cmluZyBPdXRwdXRGaWxlOworCisgIC8vLyBUaGUgZmlsZSB0byB3cml0ZSBoZWFkZXIgaW5jbHVkZSBvdXRwdXQgdG8uIFRoaXMgaXMgb3J0aG9nb25hbCB0bworICAvLy8gU2hvd0hlYWRlckluY2x1ZGVzICgtSCkgYW5kIHdpbGwgaW5jbHVkZSBoZWFkZXJzIG1lbnRpb25lZCBpbiB0aGUKKyAgLy8vIHByZWRlZmluZXMgYnVmZmVyLiBJZiB0aGUgb3V0cHV0IGZpbGUgaXMgIi0iLCBvdXRwdXQgd2lsbCBiZSBzZW50IHRvCisgIC8vLyBzdGRlcnIuCisgIHN0ZDo6c3RyaW5nIEhlYWRlckluY2x1ZGVPdXRwdXRGaWxlOworCisgIC8vLyBBIGxpc3Qgb2YgbmFtZXMgdG8gdXNlIGFzIHRoZSB0YXJnZXRzIGluIHRoZSBkZXBlbmRlbmN5IGZpbGU7IHRoaXMgbGlzdAorICAvLy8gbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlbnRyeS4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFRhcmdldHM7CisKKyAgLy8vIEEgbGlzdCBvZiBmaWxlbmFtZXMgdG8gYmUgdXNlZCBhcyBleHRyYSBkZXBlbmRlbmNpZXMgZm9yIGV2ZXJ5IHRhcmdldC4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEV4dHJhRGVwczsKKworICAvLy8gSW4gL3Nob3dJbmNsdWRlcyBtb2RlLCBwcmV0ZW5kIHRoZSBtYWluIFRVIGlzIGEgaGVhZGVyIHdpdGggdGhpcyBuYW1lLgorICBzdGQ6OnN0cmluZyBTaG93SW5jbHVkZXNQcmV0ZW5kSGVhZGVyOworCisgIC8vLyBcYnJpZWYgVGhlIGZpbGUgdG8gd3JpdGUgR3JhcGhWaXotZm9ybWF0dGVkIGhlYWRlciBkZXBlbmRlbmNpZXMgdG8uCisgIHN0ZDo6c3RyaW5nIERPVE91dHB1dEZpbGU7CisKKyAgLy8vIFxicmllZiBUaGUgZGlyZWN0b3J5IHRvIGNvcHkgbW9kdWxlIGRlcGVuZGVuY2llcyB0byB3aGVuIGNvbGxlY3RpbmcgdGhlbS4KKyAgc3RkOjpzdHJpbmcgTW9kdWxlRGVwZW5kZW5jeU91dHB1dERpcjsKKworcHVibGljOgorICBEZXBlbmRlbmN5T3V0cHV0T3B0aW9ucygpIHsKKyAgICBJbmNsdWRlU3lzdGVtSGVhZGVycyA9IDA7CisgICAgU2hvd0hlYWRlckluY2x1ZGVzID0gMDsKKyAgICBVc2VQaG9ueVRhcmdldHMgPSAwOworICAgIEFkZE1pc3NpbmdIZWFkZXJEZXBzID0gMDsKKyAgICBQcmludFNob3dJbmNsdWRlcyA9IDA7CisgICAgSW5jbHVkZU1vZHVsZUZpbGVzID0gMDsKKyAgICBPdXRwdXRGb3JtYXQgPSBEZXBlbmRlbmN5T3V0cHV0Rm9ybWF0OjpNYWtlOworICB9Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvRGlhZ25vc3RpY1JlbmRlcmVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9EaWFnbm9zdGljUmVuZGVyZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODE0NTY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvRGlhZ25vc3RpY1JlbmRlcmVyLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8vPT09LSBEaWFnbm9zdGljUmVuZGVyZXIuaCAtIERpYWdub3N0aWMgUHJldHR5LVByaW50aW5nIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MgdGhhdCBwcm92aWRlcyBzdXBwb3J0IGZvciBwcmV0dHktcHJpbnRpbmcgb2YKKy8vIGRpYWdub3N0aWNzLiBJdCBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgZGlmZmVyZW50IGNvZGUgcGF0aHMgd2hpY2ggcmVxdWlyZQorLy8gc3VjaCBmdW5jdGlvbmFsaXR5IGluIGEgY29uc2lzdGVudCB3YXkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0ZST05URU5EX0RJQUdOT1NUSUNSRU5ERVJFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfRlJPTlRFTkRfRElBR05PU1RJQ1JFTkRFUkVSX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljT3B0aW9ucy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlclVuaW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIExhbmdPcHRpb25zOworY2xhc3MgU291cmNlTWFuYWdlcjsKKwordXNpbmcgRGlhZ09yU3RvcmVkRGlhZyA9CisgICAgbGx2bTo6UG9pbnRlclVuaW9uPGNvbnN0IERpYWdub3N0aWMgKiwgY29uc3QgU3RvcmVkRGlhZ25vc3RpYyAqPjsKKyAgCisvLy8gXGJyaWVmIENsYXNzIHRvIGVuY2Fwc3VsYXRlIHRoZSBsb2dpYyBmb3IgZm9ybWF0dGluZyBhIGRpYWdub3N0aWMgbWVzc2FnZS4KKy8vLworLy8vIEFjdHVhbCAicHJpbnRpbmciIGxvZ2ljIGlzIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuCisvLy8KKy8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgYnVpbGRpbmcgYW5kIGVtaXR0aW5nCisvLy8gZGlhZ25vc3RpYywgaW5jbHVkaW5nIGFsbCBvZiB0aGUgbWFjcm8gYmFja3RyYWNlcywgY2FyZXQgZGlhZ25vc3RpY3MsIEZpeEl0CisvLy8gSGludHMsIGFuZCBjb2RlIHNuaXBwZXRzLiBJbiB0aGUgcHJlc2VuY2Ugb2YgbWFjcm9zIHRoaXMgaW52b2x2ZXMKKy8vLyBhIHJlY3Vyc2l2ZSBwcm9jZXNzLCBzeW50aGVzaXppbmcgbm90ZXMgZm9yIGVhY2ggbWFjcm8gZXhwYW5zaW9uLgorLy8vCisvLy8gQSBicmllZiB3b3JrbGlzdDoKKy8vLyBGSVhNRTogU2luayB0aGUgcmVjdXJzaXZlIHByaW50aW5nIG9mIHRlbXBsYXRlIGluc3RhbnRpYXRpb25zIGludG8gdGhpcworLy8vIGNsYXNzLgorY2xhc3MgRGlhZ25vc3RpY1JlbmRlcmVyIHsKK3Byb3RlY3RlZDoKKyAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzOworICBJbnRydXNpdmVSZWZDbnRQdHI8RGlhZ25vc3RpY09wdGlvbnM+IERpYWdPcHRzOworICAKKyAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIHByZXZpb3VzIGRpYWdub3N0aWMgaWYga25vd24uCisgIC8vLworICAvLy8gVGhpcyB3aWxsIGJlIGludmFsaWQgaW4gY2FzZXMgd2hlcmUgdGhlcmUgaXMgbm8gKGtub3duKSBwcmV2aW91cworICAvLy8gZGlhZ25vc3RpYyBsb2NhdGlvbiwgb3IgdGhhdCBsb2NhdGlvbiBpdHNlbGYgaXMgaW52YWxpZCBvciBjb21lcyBmcm9tCisgIC8vLyBhIGRpZmZlcmVudCBzb3VyY2UgbWFuYWdlciB0aGFuIFNNLgorICBTb3VyY2VMb2NhdGlvbiBMYXN0TG9jOworICAKKyAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgaW5jbHVkZSB3aG9zZSBzdGFjayB3YXMgcHJpbnRlZCBpZiBrbm93bi4KKyAgLy8vCisgIC8vLyBTYW1lIHJlc3RyaWN0aW9uIGFzIExhc3RMb2MgZXNzZW50aWFsbHksIGJ1dCB0cmFja2luZyBpbmNsdWRlIHN0YWNrCisgIC8vLyByb290IGxvY2F0aW9ucyByYXRoZXIgdGhhbiBkaWFnbm9zdGljIGxvY2F0aW9ucy4KKyAgU291cmNlTG9jYXRpb24gTGFzdEluY2x1ZGVMb2M7CisgIAorICAvLy8gXGJyaWVmIFRoZSBsZXZlbCBvZiB0aGUgbGFzdCBkaWFnbm9zdGljIGVtaXR0ZWQuCisgIC8vLworICAvLy8gVGhlIGxldmVsIG9mIHRoZSBsYXN0IGRpYWdub3N0aWMgZW1pdHRlZC4gVXNlZCB0byBkZXRlY3QgbGV2ZWwgY2hhbmdlcworICAvLy8gd2hpY2ggY2hhbmdlIHRoZSBhbW91bnQgb2YgaW5mb3JtYXRpb24gZGlzcGxheWVkLgorICBEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGFzdExldmVsID0gRGlhZ25vc3RpY3NFbmdpbmU6Oklnbm9yZWQ7CisKKyAgRGlhZ25vc3RpY1JlbmRlcmVyKGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKKyAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNPcHRpb25zICpEaWFnT3B0cyk7CisgIAorICB2aXJ0dWFsIH5EaWFnbm9zdGljUmVuZGVyZXIoKTsKKworICB2aXJ0dWFsIHZvaWQgZW1pdERpYWdub3N0aWNNZXNzYWdlKEZ1bGxTb3VyY2VMb2MgTG9jLCBQcmVzdW1lZExvYyBQTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDaGFyU291cmNlUmFuZ2U+IFJhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnT3JTdG9yZWREaWFnIEluZm8pID0gMDsKKworICB2aXJ0dWFsIHZvaWQgZW1pdERpYWdub3N0aWNMb2MoRnVsbFNvdXJjZUxvYyBMb2MsIFByZXN1bWVkTG9jIFBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDaGFyU291cmNlUmFuZ2U+IFJhbmdlcykgPSAwOworCisgIHZpcnR1YWwgdm9pZCBlbWl0Q29kZUNvbnRleHQoRnVsbFNvdXJjZUxvYyBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxDaGFyU291cmNlUmFuZ2U+ICZSYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Rml4SXRIaW50PiBIaW50cykgPSAwOworCisgIHZpcnR1YWwgdm9pZCBlbWl0SW5jbHVkZUxvY2F0aW9uKEZ1bGxTb3VyY2VMb2MgTG9jLCBQcmVzdW1lZExvYyBQTG9jKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBlbWl0SW1wb3J0TG9jYXRpb24oRnVsbFNvdXJjZUxvYyBMb2MsIFByZXN1bWVkTG9jIFBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1vZHVsZU5hbWUpID0gMDsKKyAgdmlydHVhbCB2b2lkIGVtaXRCdWlsZGluZ01vZHVsZUxvY2F0aW9uKEZ1bGxTb3VyY2VMb2MgTG9jLCBQcmVzdW1lZExvYyBQTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1vZHVsZU5hbWUpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgYmVnaW5EaWFnbm9zdGljKERpYWdPclN0b3JlZERpYWcgRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwpIHt9CisgIHZpcnR1YWwgdm9pZCBlbmREaWFnbm9zdGljKERpYWdPclN0b3JlZERpYWcgRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIExldmVsKSB7fQorCitwcml2YXRlOgorICB2b2lkIGVtaXRCYXNpY05vdGUoU3RyaW5nUmVmIE1lc3NhZ2UpOworICB2b2lkIGVtaXRJbmNsdWRlU3RhY2soRnVsbFNvdXJjZUxvYyBMb2MsIFByZXN1bWVkTG9jIFBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwpOworICB2b2lkIGVtaXRJbmNsdWRlU3RhY2tSZWN1cnNpdmVseShGdWxsU291cmNlTG9jIExvYyk7CisgIHZvaWQgZW1pdEltcG9ydFN0YWNrKEZ1bGxTb3VyY2VMb2MgTG9jKTsKKyAgdm9pZCBlbWl0SW1wb3J0U3RhY2tSZWN1cnNpdmVseShGdWxsU291cmNlTG9jIExvYywgU3RyaW5nUmVmIE1vZHVsZU5hbWUpOworICB2b2lkIGVtaXRNb2R1bGVCdWlsZFN0YWNrKGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKTsKKyAgdm9pZCBlbWl0Q2FyZXQoRnVsbFNvdXJjZUxvYyBMb2MsIERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBMZXZlbCwKKyAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q2hhclNvdXJjZVJhbmdlPiBSYW5nZXMsIEFycmF5UmVmPEZpeEl0SGludD4gSGludHMpOworICB2b2lkIGVtaXRTaW5nbGVNYWNyb0V4cGFuc2lvbihGdWxsU291cmNlTG9jIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDaGFyU291cmNlUmFuZ2U+IFJhbmdlcyk7CisgIHZvaWQgZW1pdE1hY3JvRXhwYW5zaW9ucyhGdWxsU291cmNlTG9jIExvYywgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q2hhclNvdXJjZVJhbmdlPiBSYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxGaXhJdEhpbnQ+IEhpbnRzKTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIEVtaXQgYSBkaWFnbm9zdGljLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQgZm9yIGVtaXR0aW5nIGRpYWdub3N0aWMgbWVzc2FnZXMuCisgIC8vLyBJdCBoYW5kbGVzIGZvcm1hdHRpbmcgYW5kIHJlbmRlcmluZyB0aGUgbWVzc2FnZSBhcyB3ZWxsIGFzIGFueSBhbmNpbGxhcnkKKyAgLy8vIGluZm9ybWF0aW9uIG5lZWRlZCBiYXNlZCBvbiBtYWNyb3Mgd2hvc2UgZXhwYW5zaW9ucyBpbXBhY3QgdGhlCisgIC8vLyBkaWFnbm9zdGljLgorICAvLy8KKyAgLy8vIFxwYXJhbSBMb2MgVGhlIGxvY2F0aW9uIGZvciB0aGlzIGNhcmV0LgorICAvLy8gXHBhcmFtIExldmVsIFRoZSBsZXZlbCBvZiB0aGUgZGlhZ25vc3RpYyB0byBiZSBlbWl0dGVkLgorICAvLy8gXHBhcmFtIE1lc3NhZ2UgVGhlIGRpYWdub3N0aWMgbWVzc2FnZSB0byBlbWl0LgorICAvLy8gXHBhcmFtIFJhbmdlcyBUaGUgdW5kZXJsaW5lZCByYW5nZXMgZm9yIHRoaXMgY29kZSBzbmlwcGV0LgorICAvLy8gXHBhcmFtIEZpeEl0SGludHMgVGhlIEZpeEl0IGhpbnRzIGFjdGl2ZSBmb3IgdGhpcyBkaWFnbm9zdGljLgorICB2b2lkIGVtaXREaWFnbm9zdGljKEZ1bGxTb3VyY2VMb2MgTG9jLCBEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1lc3NhZ2UsIEFycmF5UmVmPENoYXJTb3VyY2VSYW5nZT4gUmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEZpeEl0SGludD4gRml4SXRIaW50cywKKyAgICAgICAgICAgICAgICAgICAgICBEaWFnT3JTdG9yZWREaWFnIEQgPSAoRGlhZ25vc3RpYyAqKW51bGxwdHIpOworCisgIHZvaWQgZW1pdFN0b3JlZERpYWdub3N0aWMoU3RvcmVkRGlhZ25vc3RpYyAmRGlhZyk7Cit9OworICAKKy8vLyBTdWJjbGFzcyBvZiBEaWFnbm9zdGljUmVuZGVyIHRoYXQgdHVybnMgYWxsIHN1YmRpYWdvc3RpY3MgaW50byBleHBsaWNpdAorLy8vIG5vdGVzLiAgSXQgaXMgdXAgdG8gc3ViY2xhc3NlcyB0byBmdXJ0aGVyIGRlZmluZSB0aGUgYmVoYXZpb3IuCitjbGFzcyBEaWFnbm9zdGljTm90ZVJlbmRlcmVyIDogcHVibGljIERpYWdub3N0aWNSZW5kZXJlciB7CitwdWJsaWM6CisgIERpYWdub3N0aWNOb3RlUmVuZGVyZXIoY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNPcHRpb25zICpEaWFnT3B0cykKKyAgICAgIDogRGlhZ25vc3RpY1JlbmRlcmVyKExhbmdPcHRzLCBEaWFnT3B0cykge30KKworICB+RGlhZ25vc3RpY05vdGVSZW5kZXJlcigpIG92ZXJyaWRlOworCisgIHZvaWQgZW1pdEluY2x1ZGVMb2NhdGlvbihGdWxsU291cmNlTG9jIExvYywgUHJlc3VtZWRMb2MgUExvYykgb3ZlcnJpZGU7CisKKyAgdm9pZCBlbWl0SW1wb3J0TG9jYXRpb24oRnVsbFNvdXJjZUxvYyBMb2MsIFByZXN1bWVkTG9jIFBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNb2R1bGVOYW1lKSBvdmVycmlkZTsKKworICB2b2lkIGVtaXRCdWlsZGluZ01vZHVsZUxvY2F0aW9uKEZ1bGxTb3VyY2VMb2MgTG9jLCBQcmVzdW1lZExvYyBQTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNb2R1bGVOYW1lKSBvdmVycmlkZTsKKworICB2aXJ0dWFsIHZvaWQgZW1pdE5vdGUoRnVsbFNvdXJjZUxvYyBMb2MsIFN0cmluZ1JlZiBNZXNzYWdlKSA9IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19GUk9OVEVORF9ESUFHTk9TVElDUkVOREVSRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FlNjE3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9uLmgKQEAgLTAsMCArMSwzMTIgQEAKKy8vPT09LS0gRnJvbnRlbmRBY3Rpb24uaCAtIEdlbmVyaWMgRnJvbnRlbmQgQWN0aW9uIEludGVyZmFjZSAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHRoZSBjbGFuZzo6RnJvbnRlbmRBY3Rpb24gaW50ZXJmYWNlIGFuZCB2YXJpb3VzIGNvbnZlbmllbmNlCisvLy8gYWJzdHJhY3QgY2xhc3NlcyAoY2xhbmc6OkFTVEZyb250ZW5kQWN0aW9uLCBjbGFuZzo6UGx1Z2luQVNUQWN0aW9uLAorLy8vIGNsYW5nOjpQcmVwcm9jZXNzb3JGcm9udGVuZEFjdGlvbiwgYW5kIGNsYW5nOjpXcmFwcGVyRnJvbnRlbmRBY3Rpb24pCisvLy8gZGVyaXZlZCBmcm9tIGl0LgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRlJPTlRFTkRfRlJPTlRFTkRBQ1RJT05fSAorI2RlZmluZSBMTFZNX0NMQU5HX0ZST05URU5EX0ZST05URU5EQUNUSU9OX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb25zdW1lci5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MYW5nT3B0aW9ucy5oIgorI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0FTVFVuaXQuaCIKKyNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Gcm9udGVuZE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKK2NsYXNzIEFTVE1lcmdlQWN0aW9uOworY2xhc3MgQ29tcGlsZXJJbnN0YW5jZTsKKworLy8vIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFjdGlvbnMgd2hpY2ggY2FuIGJlIHBlcmZvcm1lZCBieSB0aGUgZnJvbnRlbmQuCitjbGFzcyBGcm9udGVuZEFjdGlvbiB7CisgIEZyb250ZW5kSW5wdXRGaWxlIEN1cnJlbnRJbnB1dDsKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVFVuaXQ+IEN1cnJlbnRBU1RVbml0OworICBDb21waWxlckluc3RhbmNlICpJbnN0YW5jZTsKKyAgZnJpZW5kIGNsYXNzIEFTVE1lcmdlQWN0aW9uOworICBmcmllbmQgY2xhc3MgV3JhcHBlckZyb250ZW5kQWN0aW9uOworCitwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8QVNUQ29uc3VtZXI+IENyZWF0ZVdyYXBwZWRBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSk7CisKK3Byb3RlY3RlZDoKKyAgLy8vIEBuYW1lIEltcGxlbWVudGF0aW9uIEFjdGlvbiBJbnRlcmZhY2UKKyAgLy8vIEB7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgdGhlIEFTVCBjb25zdW1lciBvYmplY3QgZm9yIHRoaXMgYWN0aW9uLCBpZiBzdXBwb3J0ZWQuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhcyBwYXJ0IG9mIEJlZ2luU291cmNlRmlsZSgpLCB3aGljaCB3aWxsCisgIC8vLyBmYWlsIGlmIHRoZSBBU1QgY29uc3VtZXIgY2Fubm90IGJlIGNyZWF0ZWQuIFRoaXMgd2lsbCBub3QgYmUgY2FsbGVkIGlmIHRoZQorICAvLy8gYWN0aW9uIGhhcyBpbmRpY2F0ZWQgdGhhdCBpdCBvbmx5IHVzZXMgdGhlIHByZXByb2Nlc3Nvci4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ0kgLSBUaGUgY3VycmVudCBjb21waWxlciBpbnN0YW5jZSwgcHJvdmlkZWQgYXMgYSBjb252ZW5pZW5jZSwgc2VlCisgIC8vLyBnZXRDb21waWxlckluc3RhbmNlKCkuCisgIC8vLworICAvLy8gXHBhcmFtIEluRmlsZSAtIFRoZSBjdXJyZW50IGlucHV0IGZpbGUsIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2UsIHNlZQorICAvLy8gZ2V0Q3VycmVudEZpbGUoKS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBuZXcgQVNUIGNvbnN1bWVyLCBvciBudWxsIG9uIGZhaWx1cmUuCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPiBDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpID0gMDsKKworICAvLy8gXGJyaWVmIENhbGxiYWNrIGJlZm9yZSBzdGFydGluZyBwcm9jZXNzaW5nIGEgc2luZ2xlIGlucHV0LCBnaXZpbmcgdGhlCisgIC8vLyBvcHBvcnR1bml0eSB0byBtb2RpZnkgdGhlIENvbXBpbGVySW52b2NhdGlvbiBvciBkbyBzb21lIG90aGVyIGFjdGlvbgorICAvLy8gYmVmb3JlIEJlZ2luU291cmNlRmlsZUFjdGlvbiBpcyBjYWxsZWQuCisgIC8vLworICAvLy8gXHJldHVybiBUcnVlIG9uIHN1Y2Nlc3M7IG9uIGZhaWx1cmUgQmVnaW5Tb3VyY2VGaWxlQWN0aW9uKCksCisgIC8vLyBFeGVjdXRlQWN0aW9uKCkgYW5kIEVuZFNvdXJjZUZpbGVBY3Rpb24oKSB3aWxsIG5vdCBiZSBjYWxsZWQuCisgIHZpcnR1YWwgYm9vbCBCZWdpbkludm9jYXRpb24oQ29tcGlsZXJJbnN0YW5jZSAmQ0kpIHsgcmV0dXJuIHRydWU7IH0KKworICAvLy8gXGJyaWVmIENhbGxiYWNrIGF0IHRoZSBzdGFydCBvZiBwcm9jZXNzaW5nIGEgc2luZ2xlIGlucHV0LgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVHJ1ZSBvbiBzdWNjZXNzOyBvbiBmYWlsdXJlIEV4ZWN1dGlvbkFjdGlvbigpIGFuZAorICAvLy8gRW5kU291cmNlRmlsZUFjdGlvbigpIHdpbGwgbm90IGJlIGNhbGxlZC4KKyAgdmlydHVhbCBib29sIEJlZ2luU291cmNlRmlsZUFjdGlvbihDb21waWxlckluc3RhbmNlICZDSSkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFxicmllZiBDYWxsYmFjayB0byBydW4gdGhlIHByb2dyYW0gYWN0aW9uLCB1c2luZyB0aGUgaW5pdGlhbGl6ZWQKKyAgLy8vIGNvbXBpbGVyIGluc3RhbmNlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBvbmx5IGJlIGNhbGxlZCBiZXR3ZWVuIEJlZ2luU291cmNlRmlsZUFjdGlvbigpCisgIC8vLyBhbmQgRW5kU291cmNlRmlsZUFjdGlvbigpLgorICB2aXJ0dWFsIHZvaWQgRXhlY3V0ZUFjdGlvbigpID0gMDsKKworICAvLy8gXGJyaWVmIENhbGxiYWNrIGF0IHRoZSBlbmQgb2YgcHJvY2Vzc2luZyBhIHNpbmdsZSBpbnB1dC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGd1YXJhbnRlZWQgdG8gb25seSBiZSBjYWxsZWQgZm9sbG93aW5nIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvCisgIC8vLyBCZWdpblNvdXJjZUZpbGVBY3Rpb24gKGFuZCBCZWdpblNvdXJjZUZpbGUpLgorICB2aXJ0dWFsIHZvaWQgRW5kU291cmNlRmlsZUFjdGlvbigpIHt9CisKKyAgLy8vIFxicmllZiBDYWxsYmFjayBhdCB0aGUgZW5kIG9mIHByb2Nlc3NpbmcgYSBzaW5nbGUgaW5wdXQsIHRvIGRldGVybWluZQorICAvLy8gaWYgdGhlIG91dHB1dCBmaWxlcyBzaG91bGQgYmUgZXJhc2VkIG9yIG5vdC4KKyAgLy8vCisgIC8vLyBCeSBkZWZhdWx0IGl0IHJldHVybnMgdHJ1ZSBpZiBhIGNvbXBpbGVyIGVycm9yIG9jY3VycmVkLgorICAvLy8gVGhpcyBpcyBndWFyYW50ZWVkIHRvIG9ubHkgYmUgY2FsbGVkIGZvbGxvd2luZyBhIHN1Y2Nlc3NmdWwgY2FsbCB0bworICAvLy8gQmVnaW5Tb3VyY2VGaWxlQWN0aW9uIChhbmQgQmVnaW5Tb3VyY2VGaWxlKS4KKyAgdmlydHVhbCBib29sIHNob3VsZEVyYXNlT3V0cHV0RmlsZXMoKTsKKworICAvLy8gQH0KKworcHVibGljOgorICBGcm9udGVuZEFjdGlvbigpOworICB2aXJ0dWFsIH5Gcm9udGVuZEFjdGlvbigpOworCisgIC8vLyBAbmFtZSBDb21waWxlciBJbnN0YW5jZSBBY2Nlc3MKKyAgLy8vIEB7CisKKyAgQ29tcGlsZXJJbnN0YW5jZSAmZ2V0Q29tcGlsZXJJbnN0YW5jZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSW5zdGFuY2UgJiYgIkNvbXBpbGVyIGluc3RhbmNlIG5vdCByZWdpc3RlcmVkISIpOworICAgIHJldHVybiAqSW5zdGFuY2U7CisgIH0KKworICB2b2lkIHNldENvbXBpbGVySW5zdGFuY2UoQ29tcGlsZXJJbnN0YW5jZSAqVmFsdWUpIHsgSW5zdGFuY2UgPSBWYWx1ZTsgfQorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgQ3VycmVudCBGaWxlIEluZm9ybWF0aW9uCisgIC8vLyBAeworCisgIGJvb2wgaXNDdXJyZW50RmlsZUFTVCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIUN1cnJlbnRJbnB1dC5pc0VtcHR5KCkgJiYgIk5vIGN1cnJlbnQgZmlsZSEiKTsKKyAgICByZXR1cm4gKGJvb2wpQ3VycmVudEFTVFVuaXQ7CisgIH0KKworICBjb25zdCBGcm9udGVuZElucHV0RmlsZSAmZ2V0Q3VycmVudElucHV0KCkgY29uc3QgeworICAgIHJldHVybiBDdXJyZW50SW5wdXQ7CisgIH0KKworICBjb25zdCBTdHJpbmdSZWYgZ2V0Q3VycmVudEZpbGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFDdXJyZW50SW5wdXQuaXNFbXB0eSgpICYmICJObyBjdXJyZW50IGZpbGUhIik7CisgICAgcmV0dXJuIEN1cnJlbnRJbnB1dC5nZXRGaWxlKCk7CisgIH0KKworICBJbnB1dEtpbmQgZ2V0Q3VycmVudEZpbGVLaW5kKCkgY29uc3QgeworICAgIGFzc2VydCghQ3VycmVudElucHV0LmlzRW1wdHkoKSAmJiAiTm8gY3VycmVudCBmaWxlISIpOworICAgIHJldHVybiBDdXJyZW50SW5wdXQuZ2V0S2luZCgpOworICB9CisKKyAgQVNUVW5pdCAmZ2V0Q3VycmVudEFTVFVuaXQoKSBjb25zdCB7CisgICAgYXNzZXJ0KEN1cnJlbnRBU1RVbml0ICYmICJObyBjdXJyZW50IEFTVCB1bml0ISIpOworICAgIHJldHVybiAqQ3VycmVudEFTVFVuaXQ7CisgIH0KKworICBNb2R1bGUgKmdldEN1cnJlbnRNb2R1bGUoKSBjb25zdDsKKworICBzdGQ6OnVuaXF1ZV9wdHI8QVNUVW5pdD4gdGFrZUN1cnJlbnRBU1RVbml0KCkgeworICAgIHJldHVybiBzdGQ6Om1vdmUoQ3VycmVudEFTVFVuaXQpOworICB9CisKKyAgdm9pZCBzZXRDdXJyZW50SW5wdXQoY29uc3QgRnJvbnRlbmRJbnB1dEZpbGUgJkN1cnJlbnRJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEFTVFVuaXQ+IEFTVCA9IG51bGxwdHIpOworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgU3VwcG9ydGVkIE1vZGVzCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgSXMgdGhpcyBhY3Rpb24gaW52b2tlZCBvbiBhIG1vZGVsIGZpbGU/CisgIC8vLworICAvLy8gTW9kZWwgZmlsZXMgYXJlIGluY29tcGxldGUgdHJhbnNsYXRpb24gdW5pdHMgdGhhdCByZWxpZXMgb24gdHlwZQorICAvLy8gaW5mb3JtYXRpb24gZnJvbSBhbm90aGVyIHRyYW5zbGF0aW9uIHVuaXQuIENoZWNrIFBhcnNlTW9kZWxGaWxlQWN0aW9uIGZvcgorICAvLy8gZGV0YWlscy4KKyAgdmlydHVhbCBib29sIGlzTW9kZWxQYXJzaW5nQWN0aW9uKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gXGJyaWVmIERvZXMgdGhpcyBhY3Rpb24gb25seSB1c2UgdGhlIHByZXByb2Nlc3Nvcj8KKyAgLy8vCisgIC8vLyBJZiBzbyBubyBBU1QgY29udGV4dCB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoaXMgYWN0aW9uIHdpbGwgYmUgaW52YWxpZAorICAvLy8gd2l0aCBBU1QgZmlsZSBpbnB1dHMuCisgIHZpcnR1YWwgYm9vbCB1c2VzUHJlcHJvY2Vzc29yT25seSgpIGNvbnN0ID0gMDsKKworICAvLy8gXGJyaWVmIEZvciBBU1QtYmFzZWQgYWN0aW9ucywgdGhlIGtpbmQgb2YgdHJhbnNsYXRpb24gdW5pdCB3ZSdyZSBoYW5kbGluZy4KKyAgdmlydHVhbCBUcmFuc2xhdGlvblVuaXRLaW5kIGdldFRyYW5zbGF0aW9uVW5pdEtpbmQoKSB7IHJldHVybiBUVV9Db21wbGV0ZTsgfQorCisgIC8vLyBcYnJpZWYgRG9lcyB0aGlzIGFjdGlvbiBzdXBwb3J0IHVzZSB3aXRoIFBDSD8KKyAgdmlydHVhbCBib29sIGhhc1BDSFN1cHBvcnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIFxicmllZiBEb2VzIHRoaXMgYWN0aW9uIHN1cHBvcnQgdXNlIHdpdGggQVNUIGZpbGVzPworICB2aXJ0dWFsIGJvb2wgaGFzQVNURmlsZVN1cHBvcnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIFxicmllZiBEb2VzIHRoaXMgYWN0aW9uIHN1cHBvcnQgdXNlIHdpdGggSVIgZmlsZXM/CisgIHZpcnR1YWwgYm9vbCBoYXNJUlN1cHBvcnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBcYnJpZWYgRG9lcyB0aGlzIGFjdGlvbiBzdXBwb3J0IHVzZSB3aXRoIGNvZGUgY29tcGxldGlvbj8KKyAgdmlydHVhbCBib29sIGhhc0NvZGVDb21wbGV0aW9uU3VwcG9ydCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBQdWJsaWMgQWN0aW9uIEludGVyZmFjZQorICAvLy8gQHsKKworICAvLy8gXGJyaWVmIFByZXBhcmUgdGhlIGFjdGlvbiBmb3IgcHJvY2Vzc2luZyB0aGUgaW5wdXQgZmlsZSBccCBJbnB1dC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHJ1biBhZnRlciB0aGUgb3B0aW9ucyBhbmQgZnJvbnRlbmQgaGF2ZSBiZWVuIGluaXRpYWxpemVkLAorICAvLy8gYnV0IHByaW9yIHRvIGV4ZWN1dGluZyBhbnkgcGVyLWZpbGUgcHJvY2Vzc2luZy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ0kgLSBUaGUgY29tcGlsZXIgaW5zdGFuY2UgdGhpcyBhY3Rpb24gaXMgYmVpbmcgcnVuIGZyb20uIFRoZQorICAvLy8gYWN0aW9uIG1heSBzdG9yZSBhbmQgdXNlIHRoaXMgb2JqZWN0IHVwIHVudGlsIHRoZSBtYXRjaGluZyBFbmRTb3VyY2VGaWxlCisgIC8vLyBhY3Rpb24uCisgIC8vLworICAvLy8gXHBhcmFtIElucHV0IC0gVGhlIGlucHV0IGZpbGVuYW1lIGFuZCBraW5kLiBTb21lIGlucHV0IGtpbmRzIGFyZSBoYW5kbGVkCisgIC8vLyBzcGVjaWFsbHksIGZvciBleGFtcGxlIEFTVCBpbnB1dHMsIHNpbmNlIHRoZSBBU1QgZmlsZSBpdHNlbGYgY29udGFpbnMKKyAgLy8vIHNldmVyYWwgb2JqZWN0cyB3aGljaCB3b3VsZCBub3JtYWxseSBiZSBvd25lZCBieSB0aGUKKyAgLy8vIENvbXBpbGVySW5zdGFuY2UuIFdoZW4gcHJvY2Vzc2luZyBBU1QgaW5wdXQgZmlsZXMsIHRoZXNlIG9iamVjdHMgc2hvdWxkCisgIC8vLyBnZW5lcmFsbHkgbm90IGJlIGluaXRpYWxpemVkIGluIHRoZSBDb21waWxlckluc3RhbmNlIC0tIHRoZXkgd2lsbAorICAvLy8gYXV0b21hdGljYWxseSBiZSBzaGFyZWQgd2l0aCB0aGUgQVNUIGZpbGUgaW4gYmV0d2VlbgorICAvLy8gQmVnaW5Tb3VyY2VGaWxlKCkgYW5kIEVuZFNvdXJjZUZpbGUoKS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRydWUgb24gc3VjY2Vzczsgb24gZmFpbHVyZSB0aGUgY29tcGlsYXRpb24gb2YgdGhpcyBmaWxlIHNob3VsZAorICAvLy8gYmUgYWJvcnRlZCBhbmQgbmVpdGhlciBFeGVjdXRlKCkgbm9yIEVuZFNvdXJjZUZpbGUoKSBzaG91bGQgYmUgY2FsbGVkLgorICBib29sIEJlZ2luU291cmNlRmlsZShDb21waWxlckluc3RhbmNlICZDSSwgY29uc3QgRnJvbnRlbmRJbnB1dEZpbGUgJklucHV0KTsKKworICAvLy8gXGJyaWVmIFNldCB0aGUgc291cmNlIG1hbmFnZXIncyBtYWluIGlucHV0IGZpbGUsIGFuZCBydW4gdGhlIGFjdGlvbi4KKyAgYm9vbCBFeGVjdXRlKCk7CisKKyAgLy8vIFxicmllZiBQZXJmb3JtIGFueSBwZXItZmlsZSBwb3N0IHByb2Nlc3NpbmcsIGRlYWxsb2NhdGUgcGVyLWZpbGUKKyAgLy8vIG9iamVjdHMsIGFuZCBydW4gc3RhdGlzdGljcyBhbmQgb3V0cHV0IGZpbGUgY2xlYW51cCBjb2RlLgorICB2b2lkIEVuZFNvdXJjZUZpbGUoKTsKKworICAvLy8gQH0KK307CisKKy8vLyBcYnJpZWYgQWJzdHJhY3QgYmFzZSBjbGFzcyB0byB1c2UgZm9yIEFTVCBjb25zdW1lci1iYXNlZCBmcm9udGVuZCBhY3Rpb25zLgorY2xhc3MgQVNURnJvbnRlbmRBY3Rpb24gOiBwdWJsaWMgRnJvbnRlbmRBY3Rpb24geworcHJvdGVjdGVkOgorICAvLy8gXGJyaWVmIEltcGxlbWVudCB0aGUgRXhlY3V0ZUFjdGlvbiBpbnRlcmZhY2UgYnkgcnVubmluZyBTZW1hIG9uCisgIC8vLyB0aGUgYWxyZWFkeS1pbml0aWFsaXplZCBBU1QgY29uc3VtZXIuCisgIC8vLworICAvLy8gVGhpcyB3aWxsIGFsc28gdGFrZSBjYXJlIG9mIGluc3RhbnRpYXRpbmcgYSBjb2RlIGNvbXBsZXRpb24gY29uc3VtZXIgaWYKKyAgLy8vIHRoZSB1c2VyIHJlcXVlc3RlZCBpdCBhbmQgdGhlIGFjdGlvbiBzdXBwb3J0cyBpdC4KKyAgdm9pZCBFeGVjdXRlQWN0aW9uKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgQVNURnJvbnRlbmRBY3Rpb24oKSB7fQorICBib29sIHVzZXNQcmVwcm9jZXNzb3JPbmx5KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KK307CisKK2NsYXNzIFBsdWdpbkFTVEFjdGlvbiA6IHB1YmxpYyBBU1RGcm9udGVuZEFjdGlvbiB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKK3B1YmxpYzoKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPiBDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKSBvdmVycmlkZSA9IDA7CisKKyAgLy8vIFxicmllZiBQYXJzZSB0aGUgZ2l2ZW4gcGx1Z2luIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgIC8vLworICAvLy8gXHBhcmFtIENJIC0gVGhlIGNvbXBpbGVyIGluc3RhbmNlLCBmb3IgdXNlIGluIHJlcG9ydGluZyBkaWFnbm9zdGljcy4KKyAgLy8vIFxyZXR1cm4gVHJ1ZSBpZiB0aGUgcGFyc2luZyBzdWNjZWVkZWQ7IG90aGVyd2lzZSB0aGUgcGx1Z2luIHdpbGwgYmUKKyAgLy8vIGRlc3Ryb3llZCBhbmQgbm8gYWN0aW9uIHJ1bi4gVGhlIHBsdWdpbiBpcyByZXNwb25zaWJsZSBmb3IgdXNpbmcgdGhlCisgIC8vLyBDb21waWxlckluc3RhbmNlJ3MgRGlhZ25vc3RpYyBvYmplY3QgdG8gcmVwb3J0IGVycm9ycy4KKyAgdmlydHVhbCBib29sIFBhcnNlQXJncyhjb25zdCBDb21waWxlckluc3RhbmNlICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmFyZykgPSAwOworCisgIGVudW0gQWN0aW9uVHlwZSB7CisgICAgQ21kbGluZSwgICAgICAgICAgICAgLy8vPCBBY3Rpb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgY2MxIGNvbW1hbmQtbGluZQorICAgIFJlcGxhY2VBY3Rpb24sICAgICAgIC8vLzwgUmVwbGFjZSB0aGUgbWFpbiBhY3Rpb24KKyAgICBBZGRCZWZvcmVNYWluQWN0aW9uLCAvLy88IEV4ZWN1dGUgdGhlIGFjdGlvbiBiZWZvcmUgdGhlIG1haW4gYWN0aW9uCisgICAgQWRkQWZ0ZXJNYWluQWN0aW9uICAgLy8vPCBFeGVjdXRlIHRoZSBhY3Rpb24gYWZ0ZXIgdGhlIG1haW4gYWN0aW9uCisgIH07CisgIC8vLyBcYnJpZWYgR2V0IHRoZSBhY3Rpb24gdHlwZSBmb3IgdGhpcyBwbHVnaW4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBhY3Rpb24gdHlwZS4gSWYgdGhlIHR5cGUgaXMgQ21kbGluZSB0aGVuIGJ5IGRlZmF1bHQgdGhlCisgIC8vLyBwbHVnaW4gZG9lcyBub3RoaW5nIGFuZCB3aGF0IGl0IGRvZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY2MxCisgIC8vLyBjb21tYW5kLWxpbmUuCisgIHZpcnR1YWwgQWN0aW9uVHlwZSBnZXRBY3Rpb25UeXBlKCkgeyByZXR1cm4gQ21kbGluZTsgfQorfTsKKworLy8vIFxicmllZiBBYnN0cmFjdCBiYXNlIGNsYXNzIHRvIHVzZSBmb3IgcHJlcHJvY2Vzc29yLWJhc2VkIGZyb250ZW5kIGFjdGlvbnMuCitjbGFzcyBQcmVwcm9jZXNzb3JGcm9udGVuZEFjdGlvbiA6IHB1YmxpYyBGcm9udGVuZEFjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIC8vLyBcYnJpZWYgUHJvdmlkZSBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggcmV0dXJucyBhYm9ydHM7CisgIC8vLyB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ5IEZyb250ZW5kQWN0aW9uIGNsaWVudHMuCisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RDb25zdW1lcj4gQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgYm9vbCB1c2VzUHJlcHJvY2Vzc29yT25seSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KK307CisKKy8vLyBcYnJpZWYgQSBmcm9udGVuZCBhY3Rpb24gd2hpY2ggc2ltcGx5IHdyYXBzIHNvbWUgb3RoZXIgcnVudGltZS1zcGVjaWZpZWQKKy8vLyBmcm9udGVuZCBhY3Rpb24uCisvLy8KKy8vLyBEZXJpdmluZyBmcm9tIHRoaXMgY2xhc3MgYWxsb3dzIGFuIGFjdGlvbiB0byBpbmplY3QgY3VzdG9tIGxvZ2ljIGFyb3VuZAorLy8vIHNvbWUgZXhpc3RpbmcgYWN0aW9uJ3MgYmVoYXZpb3IuIEl0IGltcGxlbWVudHMgZXZlcnkgdmlydHVhbCBtZXRob2QgaW4KKy8vLyB0aGUgRnJvbnRlbmRBY3Rpb24gaW50ZXJmYWNlIGJ5IGZvcndhcmRpbmcgdG8gdGhlIHdyYXBwZWQgYWN0aW9uLgorY2xhc3MgV3JhcHBlckZyb250ZW5kQWN0aW9uIDogcHVibGljIEZyb250ZW5kQWN0aW9uIHsKKyAgc3RkOjp1bmlxdWVfcHRyPEZyb250ZW5kQWN0aW9uPiBXcmFwcGVkQWN0aW9uOworCitwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RDb25zdW1lcj4gQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7CisgIGJvb2wgQmVnaW5JbnZvY2F0aW9uKENvbXBpbGVySW5zdGFuY2UgJkNJKSBvdmVycmlkZTsKKyAgYm9vbCBCZWdpblNvdXJjZUZpbGVBY3Rpb24oQ29tcGlsZXJJbnN0YW5jZSAmQ0kpIG92ZXJyaWRlOworICB2b2lkIEV4ZWN1dGVBY3Rpb24oKSBvdmVycmlkZTsKKyAgdm9pZCBFbmRTb3VyY2VGaWxlQWN0aW9uKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdCBhIFdyYXBwZXJGcm9udGVuZEFjdGlvbiBmcm9tIGFuIGV4aXN0aW5nIGFjdGlvbiwgdGFraW5nCisgIC8vLyBvd25lcnNoaXAgb2YgaXQuCisgIFdyYXBwZXJGcm9udGVuZEFjdGlvbihzdGQ6OnVuaXF1ZV9wdHI8RnJvbnRlbmRBY3Rpb24+IFdyYXBwZWRBY3Rpb24pOworCisgIGJvb2wgdXNlc1ByZXByb2Nlc3Nvck9ubHkoKSBjb25zdCBvdmVycmlkZTsKKyAgVHJhbnNsYXRpb25Vbml0S2luZCBnZXRUcmFuc2xhdGlvblVuaXRLaW5kKCkgb3ZlcnJpZGU7CisgIGJvb2wgaGFzUENIU3VwcG9ydCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0FTVEZpbGVTdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzSVJTdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzQ29kZUNvbXBsZXRpb25TdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb25zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjBiN2E2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb25zLmgKQEAgLTAsMCArMSwyNTggQEAKKy8vPT09LS0gRnJvbnRlbmRBY3Rpb25zLmggLSBVc2VmdWwgRnJvbnRlbmQgQWN0aW9ucyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19GUk9OVEVORF9GUk9OVEVOREFDVElPTlNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0ZST05URU5EX0ZST05URU5EQUNUSU9OU19ICisKKyNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbi5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIEZpbGVFbnRyeTsKKyAgCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ3VzdG9tIENvbnN1bWVyIEFjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIEluaXRPbmx5QWN0aW9uIDogcHVibGljIEZyb250ZW5kQWN0aW9uIHsKKyAgdm9pZCBFeGVjdXRlQWN0aW9uKCkgb3ZlcnJpZGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPiBDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKSBvdmVycmlkZTsKKworcHVibGljOgorICAvLyBEb24ndCBjbGFpbSB0byBvbmx5IHVzZSB0aGUgcHJlcHJvY2Vzc29yLCB3ZSB3YW50IHRvIGZvbGxvdyB0aGUgQVNUIHBhdGgsCisgIC8vIGJ1dCBkbyBub3RoaW5nLgorICBib29sIHVzZXNQcmVwcm9jZXNzb3JPbmx5KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBU1QgQ29uc3VtZXIgQWN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgQVNUUHJpbnRBY3Rpb24gOiBwdWJsaWMgQVNURnJvbnRlbmRBY3Rpb24geworcHJvdGVjdGVkOgorICBzdGQ6OnVuaXF1ZV9wdHI8QVNUQ29uc3VtZXI+IENyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIG92ZXJyaWRlOworfTsKKworY2xhc3MgQVNURHVtcEFjdGlvbiA6IHB1YmxpYyBBU1RGcm9udGVuZEFjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RDb25zdW1lcj4gQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBBU1REZWNsTGlzdEFjdGlvbiA6IHB1YmxpYyBBU1RGcm9udGVuZEFjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RDb25zdW1lcj4gQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBBU1RWaWV3QWN0aW9uIDogcHVibGljIEFTVEZyb250ZW5kQWN0aW9uIHsKK3Byb3RlY3RlZDoKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPiBDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKSBvdmVycmlkZTsKK307CisKK2NsYXNzIERlY2xDb250ZXh0UHJpbnRBY3Rpb24gOiBwdWJsaWMgQVNURnJvbnRlbmRBY3Rpb24geworcHJvdGVjdGVkOgorICBzdGQ6OnVuaXF1ZV9wdHI8QVNUQ29uc3VtZXI+IENyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIG92ZXJyaWRlOworfTsKKworY2xhc3MgR2VuZXJhdGVQQ0hBY3Rpb24gOiBwdWJsaWMgQVNURnJvbnRlbmRBY3Rpb24geworcHJvdGVjdGVkOgorICBzdGQ6OnVuaXF1ZV9wdHI8QVNUQ29uc3VtZXI+IENyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIG92ZXJyaWRlOworCisgIFRyYW5zbGF0aW9uVW5pdEtpbmQgZ2V0VHJhbnNsYXRpb25Vbml0S2luZCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gVFVfUHJlZml4OworICB9CisKKyAgYm9vbCBoYXNBU1RGaWxlU3VwcG9ydCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgYm9vbCBzaG91bGRFcmFzZU91dHB1dEZpbGVzKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDb21wdXRlIHRoZSBBU1QgY29uc3VtZXIgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSB1c2VkIHRvCisgIC8vLyBjcmVhdGUgdGhlIFBDSEdlbmVyYXRvciBpbnN0YW5jZSByZXR1cm5lZCBieSBDcmVhdGVBU1RDb25zdW1lci4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSBpZiBhbiBlcnJvciBvY2N1cnJlZCwgdHJ1ZSBvdGhlcndpc2UuCisgIHN0YXRpYyBib29sIENvbXB1dGVBU1RDb25zdW1lckFyZ3VtZW50cyhDb21waWxlckluc3RhbmNlICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZTeXNyb290KTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgZmlsZSB0byB3cml0ZSB0aGUgUENIIGludG8gYW5kIHJldHVybnMgYSBzdHJlYW0gdG8gd3JpdGUgaXQKKyAgLy8vIGludG8uIE9uIGVycm9yLCByZXR1cm5zIG51bGwuCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6cmF3X3B3cml0ZV9zdHJlYW0+CisgIENyZWF0ZU91dHB1dEZpbGUoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksIFN0cmluZ1JlZiBJbkZpbGUsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJk91dHB1dEZpbGUpOworCisgIGJvb2wgQmVnaW5Tb3VyY2VGaWxlQWN0aW9uKENvbXBpbGVySW5zdGFuY2UgJkNJKSBvdmVycmlkZTsKK307CisKK2NsYXNzIEdlbmVyYXRlTW9kdWxlQWN0aW9uIDogcHVibGljIEFTVEZyb250ZW5kQWN0aW9uIHsKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8cmF3X3B3cml0ZV9zdHJlYW0+CisgIENyZWF0ZU91dHB1dEZpbGUoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksIFN0cmluZ1JlZiBJbkZpbGUpID0gMDsKKworcHJvdGVjdGVkOgorICBzdGQ6OnVuaXF1ZV9wdHI8QVNUQ29uc3VtZXI+IENyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIG92ZXJyaWRlOworCisgIFRyYW5zbGF0aW9uVW5pdEtpbmQgZ2V0VHJhbnNsYXRpb25Vbml0S2luZCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gVFVfTW9kdWxlOworICB9CisKKyAgYm9vbCBoYXNBU1RGaWxlU3VwcG9ydCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9Cit9OworCitjbGFzcyBHZW5lcmF0ZU1vZHVsZUZyb21Nb2R1bGVNYXBBY3Rpb24gOiBwdWJsaWMgR2VuZXJhdGVNb2R1bGVBY3Rpb24geworcHJpdmF0ZToKKyAgYm9vbCBCZWdpblNvdXJjZUZpbGVBY3Rpb24oQ29tcGlsZXJJbnN0YW5jZSAmQ0kpIG92ZXJyaWRlOworCisgIHN0ZDo6dW5pcXVlX3B0cjxyYXdfcHdyaXRlX3N0cmVhbT4KKyAgQ3JlYXRlT3V0cHV0RmlsZShDb21waWxlckluc3RhbmNlICZDSSwgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBHZW5lcmF0ZU1vZHVsZUludGVyZmFjZUFjdGlvbiA6IHB1YmxpYyBHZW5lcmF0ZU1vZHVsZUFjdGlvbiB7Citwcml2YXRlOgorICBib29sIEJlZ2luU291cmNlRmlsZUFjdGlvbihDb21waWxlckluc3RhbmNlICZDSSkgb3ZlcnJpZGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPHJhd19wd3JpdGVfc3RyZWFtPgorICBDcmVhdGVPdXRwdXRGaWxlKENvbXBpbGVySW5zdGFuY2UgJkNJLCBTdHJpbmdSZWYgSW5GaWxlKSBvdmVycmlkZTsKK307CisKK2NsYXNzIFN5bnRheE9ubHlBY3Rpb24gOiBwdWJsaWMgQVNURnJvbnRlbmRBY3Rpb24geworcHJvdGVjdGVkOgorICBzdGQ6OnVuaXF1ZV9wdHI8QVNUQ29uc3VtZXI+IENyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIH5TeW50YXhPbmx5QWN0aW9uKCkgb3ZlcnJpZGU7CisgIGJvb2wgaGFzQ29kZUNvbXBsZXRpb25TdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworLy8vIFxicmllZiBEdW1wIGluZm9ybWF0aW9uIGFib3V0IHRoZSBnaXZlbiBtb2R1bGUgZmlsZSwgdG8gYmUgdXNlZCBmb3IKKy8vLyBiYXNpYyBkZWJ1Z2dpbmcgYW5kIGRpc2NvdmVyeS4KK2NsYXNzIER1bXBNb2R1bGVJbmZvQWN0aW9uIDogcHVibGljIEFTVEZyb250ZW5kQWN0aW9uIHsKK3Byb3RlY3RlZDoKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPiBDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKSBvdmVycmlkZTsKKyAgYm9vbCBCZWdpbkludm9jYXRpb24oQ29tcGlsZXJJbnN0YW5jZSAmQ0kpIG92ZXJyaWRlOworICB2b2lkIEV4ZWN1dGVBY3Rpb24oKSBvdmVycmlkZTsKKworcHVibGljOgorICBib29sIGhhc1BDSFN1cHBvcnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorICBib29sIGhhc0FTVEZpbGVTdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIGhhc0lSU3VwcG9ydCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisgIGJvb2wgaGFzQ29kZUNvbXBsZXRpb25TdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KK307CisKK2NsYXNzIFZlcmlmeVBDSEFjdGlvbiA6IHB1YmxpYyBBU1RGcm9udGVuZEFjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RDb25zdW1lcj4gQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBFeGVjdXRlQWN0aW9uKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgYm9vbCBoYXNDb2RlQ29tcGxldGlvblN1cHBvcnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorfTsKKworY2xhc3MgVGVtcGxpZ2h0RHVtcEFjdGlvbiA6IHB1YmxpYyBBU1RGcm9udGVuZEFjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RDb25zdW1lcj4gQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBFeGVjdXRlQWN0aW9uKCkgb3ZlcnJpZGU7Cit9OworCisvKioKKyAqIFxicmllZiBGcm9udGVuZCBhY3Rpb24gYWRhcHRvciB0aGF0IG1lcmdlcyBBU1RzIHRvZ2V0aGVyLgorICoKKyAqIFRoaXMgYWN0aW9uIHRha2VzIGFuIGV4aXN0aW5nIEFTVCBmaWxlIGFuZCAibWVyZ2VzIiBpdCBpbnRvIHRoZSBBU1QKKyAqIGNvbnRleHQsIHByb2R1Y2luZyBhIG1lcmdlZCBjb250ZXh0LiBUaGlzIGFjdGlvbiBpcyBhbiBhY3Rpb24KKyAqIGFkYXB0b3IsIHdoaWNoIGZvcndhcmRzIG1vc3Qgb2YgaXRzIGNhbGxzIHRvIGFub3RoZXIgYWN0aW9uIHRoYXQKKyAqIHdpbGwgY29uc3VtZSB0aGUgbWVyZ2VkIGNvbnRleHQuCisgKi8KK2NsYXNzIEFTVE1lcmdlQWN0aW9uIDogcHVibGljIEZyb250ZW5kQWN0aW9uIHsKKyAgLy8vIFxicmllZiBUaGUgYWN0aW9uIHRoYXQgdGhlIG1lcmdlIGFjdGlvbiBhZGFwdHMuCisgIHN0ZDo6dW5pcXVlX3B0cjxGcm9udGVuZEFjdGlvbj4gQWRhcHRlZEFjdGlvbjsKKyAgCisgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiBBU1QgZmlsZXMgdG8gbWVyZ2UuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBBU1RGaWxlczsKKworcHJvdGVjdGVkOgorICBzdGQ6OnVuaXF1ZV9wdHI8QVNUQ29uc3VtZXI+IENyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIG92ZXJyaWRlOworCisgIGJvb2wgQmVnaW5Tb3VyY2VGaWxlQWN0aW9uKENvbXBpbGVySW5zdGFuY2UgJkNJKSBvdmVycmlkZTsKKworICB2b2lkIEV4ZWN1dGVBY3Rpb24oKSBvdmVycmlkZTsKKyAgdm9pZCBFbmRTb3VyY2VGaWxlQWN0aW9uKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgQVNUTWVyZ2VBY3Rpb24oc3RkOjp1bmlxdWVfcHRyPEZyb250ZW5kQWN0aW9uPiBBZGFwdGVkQWN0aW9uLAorICAgICAgICAgICAgICAgICBBcnJheVJlZjxzdGQ6OnN0cmluZz4gQVNURmlsZXMpOworICB+QVNUTWVyZ2VBY3Rpb24oKSBvdmVycmlkZTsKKworICBib29sIHVzZXNQcmVwcm9jZXNzb3JPbmx5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIFRyYW5zbGF0aW9uVW5pdEtpbmQgZ2V0VHJhbnNsYXRpb25Vbml0S2luZCgpIG92ZXJyaWRlOworICBib29sIGhhc1BDSFN1cHBvcnQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNBU1RGaWxlU3VwcG9ydCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0NvZGVDb21wbGV0aW9uU3VwcG9ydCgpIGNvbnN0IG92ZXJyaWRlOworfTsKKworY2xhc3MgUHJpbnRQcmVhbWJsZUFjdGlvbiA6IHB1YmxpYyBGcm9udGVuZEFjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIHZvaWQgRXhlY3V0ZUFjdGlvbigpIG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8QVNUQ29uc3VtZXI+IENyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGJvb2wgdXNlc1ByZXByb2Nlc3Nvck9ubHkoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9Cit9OworICAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQcmVwcm9jZXNzb3IgQWN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgRHVtcFJhd1Rva2Vuc0FjdGlvbiA6IHB1YmxpYyBQcmVwcm9jZXNzb3JGcm9udGVuZEFjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIHZvaWQgRXhlY3V0ZUFjdGlvbigpIG92ZXJyaWRlOworfTsKKworY2xhc3MgRHVtcFRva2Vuc0FjdGlvbiA6IHB1YmxpYyBQcmVwcm9jZXNzb3JGcm9udGVuZEFjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIHZvaWQgRXhlY3V0ZUFjdGlvbigpIG92ZXJyaWRlOworfTsKKworY2xhc3MgR2VuZXJhdGVQVEhBY3Rpb24gOiBwdWJsaWMgUHJlcHJvY2Vzc29yRnJvbnRlbmRBY3Rpb24geworcHJvdGVjdGVkOgorICB2b2lkIEV4ZWN1dGVBY3Rpb24oKSBvdmVycmlkZTsKK307CisKK2NsYXNzIFByZXByb2Nlc3NPbmx5QWN0aW9uIDogcHVibGljIFByZXByb2Nlc3NvckZyb250ZW5kQWN0aW9uIHsKK3Byb3RlY3RlZDoKKyAgdm9pZCBFeGVjdXRlQWN0aW9uKCkgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBQcmludFByZXByb2Nlc3NlZEFjdGlvbiA6IHB1YmxpYyBQcmVwcm9jZXNzb3JGcm9udGVuZEFjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIHZvaWQgRXhlY3V0ZUFjdGlvbigpIG92ZXJyaWRlOworCisgIGJvb2wgaGFzUENIU3VwcG9ydCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KK307CisgIAorfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0Zyb250ZW5kRGlhZ25vc3RpYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmREaWFnbm9zdGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzN2I3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0Zyb250ZW5kRGlhZ25vc3RpYy5oCkBAIC0wLDAgKzEsMjggQEAKKy8vPT09LS0tIERpYWdub3N0aWNGcm9udGVuZC5oIC0gRGlhZ25vc3RpY3MgZm9yIGZyb250ZW5kIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19GUk9OVEVORF9GUk9OVEVORERJQUdOT1NUSUNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0ZST05URU5EX0ZST05URU5ERElBR05PU1RJQ19ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisgIG5hbWVzcGFjZSBkaWFnIHsKKyAgICBlbnVtIHsKKyNkZWZpbmUgRElBRyhFTlVNLEZMQUdTLERFRkFVTFRfTUFQUElORyxERVNDLEdST1VQLFwKKyAgICAgICAgICAgICBTRklOQUUsTk9XRVJST1IsU0hPV0lOU1lTSEVBREVSLENBVEVHT1JZKSBFTlVNLAorI2RlZmluZSBGUk9OVEVORFNUQVJUCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0Zyb250ZW5kS2luZHMuaW5jIgorI3VuZGVmIERJQUcKKyAgICAgIE5VTV9CVUlMVElOX0ZST05URU5EX0RJQUdOT1NUSUNTCisgICAgfTsKKyAgfSAgLy8gZW5kIG5hbWVzcGFjZSBkaWFnCit9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRPcHRpb25zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Gcm9udGVuZE9wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njg5NTdhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRPcHRpb25zLmgKQEAgLTAsMCArMSw0NjIgQEAKKy8vPT09LSBGcm9udGVuZE9wdGlvbnMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19GUk9OVEVORF9GUk9OVEVORE9QVElPTlNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0ZST05URU5EX0ZST05URU5ET1BUSU9OU19ICisKKyNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Db21tYW5kTGluZVNvdXJjZUxvYy5oIgorI2luY2x1ZGUgImNsYW5nL1NlcmlhbGl6YXRpb24vTW9kdWxlRmlsZUV4dGVuc2lvbi5oIgorI2luY2x1ZGUgImNsYW5nL1NlbWEvQ29kZUNvbXBsZXRlT3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNZW1vcnlCdWZmZXI7CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworbmFtZXNwYWNlIGNsYW5nIHsKKworbmFtZXNwYWNlIGZyb250ZW5kIHsKKworZW51bSBBY3Rpb25LaW5kIHsKKyAgLy8vIFBhcnNlIEFTVHMgYW5kIGxpc3QgRGVjbCBub2Rlcy4KKyAgQVNURGVjbExpc3QsCisKKyAgLy8vIFBhcnNlIEFTVHMgYW5kIGR1bXAgdGhlbS4KKyAgQVNURHVtcCwKKworICAvLy8gUGFyc2UgQVNUcyBhbmQgcHJpbnQgdGhlbS4KKyAgQVNUUHJpbnQsCisKKyAgLy8vIFBhcnNlIEFTVHMgYW5kIHZpZXcgdGhlbSBpbiBHcmFwaHZpei4KKyAgQVNUVmlldywKKworICAvLy8gRHVtcCBvdXQgcmF3IHRva2Vucy4KKyAgRHVtcFJhd1Rva2VucywKKworICAvLy8gRHVtcCBvdXQgcHJlcHJvY2Vzc2VkIHRva2Vucy4KKyAgRHVtcFRva2VucywKKworICAvLy8gRW1pdCBhIC5zIGZpbGUuCisgIEVtaXRBc3NlbWJseSwKKworICAvLy8gRW1pdCBhIC5iYyBmaWxlLgorICBFbWl0QkMsCisKKyAgLy8vIFRyYW5zbGF0ZSBpbnB1dCBzb3VyY2UgaW50byBIVE1MLgorICBFbWl0SFRNTCwKKworICAvLy8gRW1pdCBhIC5sbCBmaWxlLgorICBFbWl0TExWTSwKKworICAvLy8gR2VuZXJhdGUgTExWTSBJUiwgYnV0IGRvIG5vdCBlbWl0IGFueXRoaW5nLgorICBFbWl0TExWTU9ubHksCisKKyAgLy8vIEdlbmVyYXRlIG1hY2hpbmUgY29kZSwgYnV0IGRvbid0IGVtaXQgYW55dGhpbmcuCisgIEVtaXRDb2RlR2VuT25seSwKKworICAvLy8gRW1pdCBhIC5vIGZpbGUuCisgIEVtaXRPYmosCisKKyAgLy8vIFBhcnNlIGFuZCBhcHBseSBhbnkgZml4aXRzIHRvIHRoZSBzb3VyY2UuCisgIEZpeEl0LAorCisgIC8vLyBHZW5lcmF0ZSBwcmUtY29tcGlsZWQgbW9kdWxlIGZyb20gYSBtb2R1bGUgbWFwLgorICBHZW5lcmF0ZU1vZHVsZSwKKworICAvLy8gR2VuZXJhdGUgcHJlLWNvbXBpbGVkIG1vZHVsZSBmcm9tIGEgQysrIG1vZHVsZSBpbnRlcmZhY2UgZmlsZS4KKyAgR2VuZXJhdGVNb2R1bGVJbnRlcmZhY2UsCisKKyAgLy8vIEdlbmVyYXRlIHByZS1jb21waWxlZCBoZWFkZXIuCisgIEdlbmVyYXRlUENILAorCisgIC8vLyBHZW5lcmF0ZSBwcmUtdG9rZW5pemVkIGhlYWRlci4KKyAgR2VuZXJhdGVQVEgsCisKKyAgLy8vIE9ubHkgZXhlY3V0ZSBmcm9udGVuZCBpbml0aWFsaXphdGlvbi4KKyAgSW5pdE9ubHksCisKKyAgLy8vIER1bXAgaW5mb3JtYXRpb24gYWJvdXQgYSBtb2R1bGUgZmlsZS4KKyAgTW9kdWxlRmlsZUluZm8sCisKKyAgLy8vIExvYWQgYW5kIHZlcmlmeSB0aGF0IGEgUENIIGZpbGUgaXMgdXNhYmxlLgorICBWZXJpZnlQQ0gsCisKKyAgLy8vIFBhcnNlIGFuZCBwZXJmb3JtIHNlbWFudGljIGFuYWx5c2lzLgorICBQYXJzZVN5bnRheE9ubHksCisKKyAgLy8vIFJ1biBhIHBsdWdpbiBhY3Rpb24sIFxzZWUgQWN0aW9uTmFtZS4KKyAgUGx1Z2luQWN0aW9uLAorCisgIC8vLyBQcmludCBEZWNsQ29udGV4dCBhbmQgdGhlaXIgRGVjbHMuCisgIFByaW50RGVjbENvbnRleHQsCisKKyAgLy8vIFByaW50IHRoZSAicHJlYW1ibGUiIG9mIHRoZSBpbnB1dCBmaWxlCisgIFByaW50UHJlYW1ibGUsCisKKyAgLy8vIC1FIG1vZGUuCisgIFByaW50UHJlcHJvY2Vzc2VkSW5wdXQsCisKKyAgLy8vIEV4cGFuZCBtYWNyb3MgYnV0IG5vdCBcI2luY2x1ZGVzLgorICBSZXdyaXRlTWFjcm9zLAorCisgIC8vLyBPYmpDLT5DIFJld3JpdGVyLgorICBSZXdyaXRlT2JqQywKKworICAvLy8gUmV3cml0ZXIgcGxheWdyb3VuZAorICBSZXdyaXRlVGVzdCwKKworICAvLy8gUnVuIG9uZSBvciBtb3JlIHNvdXJjZSBjb2RlIGFuYWx5c2VzLgorICBSdW5BbmFseXNpcywKKworICAvLy8gRHVtcCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9ucworICBUZW1wbGlnaHREdW1wLAorCisgIC8vLyBSdW4gbWlncmF0b3IuCisgIE1pZ3JhdGVTb3VyY2UsCisKKyAgLy8vIEp1c3QgbGV4LCBubyBvdXRwdXQuCisgIFJ1blByZXByb2Nlc3Nvck9ubHkKK307CisKK30gLy8gbmFtZXNwYWNlIGZyb250ZW5kCisKKy8vLyBUaGUga2luZCBvZiBhIGZpbGUgdGhhdCB3ZSd2ZSBiZWVuIGhhbmRlZCBhcyBhbiBpbnB1dC4KK2NsYXNzIElucHV0S2luZCB7Citwcml2YXRlOgorICB1bnNpZ25lZCBMYW5nIDogNDsKKyAgdW5zaWduZWQgRm10IDogMzsKKyAgdW5zaWduZWQgUHJlcHJvY2Vzc2VkIDogMTsKKworcHVibGljOgorICAvLy8gVGhlIGxhbmd1YWdlIGZvciB0aGUgaW5wdXQsIHVzZWQgdG8gc2VsZWN0IGFuZCB2YWxpZGF0ZSB0aGUgbGFuZ3VhZ2UKKyAgLy8vIHN0YW5kYXJkIGFuZCBwb3NzaWJsZSBhY3Rpb25zLgorICBlbnVtIExhbmd1YWdlIHsKKyAgICBVbmtub3duLAorCisgICAgLy8vIEFzc2VtYmx5OiB3ZSBhY2NlcHQgdGhpcyBvbmx5IHNvIHRoYXQgd2UgY2FuIHByZXByb2Nlc3MgaXQuCisgICAgQXNtLAorCisgICAgLy8vIExMVk0gSVI6IHdlIGFjY2VwdCB0aGlzIHNvIHRoYXQgd2UgY2FuIHJ1biB0aGUgb3B0aW1pemVyIG9uIGl0LAorICAgIC8vLyBhbmQgY29tcGlsZSBpdCB0byBhc3NlbWJseSBvciBvYmplY3QgY29kZS4KKyAgICBMTFZNX0lSLAorCisgICAgLy8vQHsgTGFuZ3VhZ2VzIHRoYXQgdGhlIGZyb250ZW5kIGNhbiBwYXJzZSBhbmQgY29tcGlsZS4KKyAgICBDLAorICAgIENYWCwKKyAgICBPYmpDLAorICAgIE9iakNYWCwKKyAgICBPcGVuQ0wsCisgICAgQ1VEQSwKKyAgICBSZW5kZXJTY3JpcHQsCisgICAgLy8vQH0KKyAgfTsKKworICAvLy8gVGhlIGlucHV0IGZpbGUgZm9ybWF0LgorICBlbnVtIEZvcm1hdCB7CisgICAgU291cmNlLAorICAgIE1vZHVsZU1hcCwKKyAgICBQcmVjb21waWxlZAorICB9OworCisgIGNvbnN0ZXhwciBJbnB1dEtpbmQoTGFuZ3VhZ2UgTCA9IFVua25vd24sIEZvcm1hdCBGID0gU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUFAgPSBmYWxzZSkKKyAgICAgIDogTGFuZyhMKSwgRm10KEYpLCBQcmVwcm9jZXNzZWQoUFApIHt9CisKKyAgTGFuZ3VhZ2UgZ2V0TGFuZ3VhZ2UoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxMYW5ndWFnZT4oTGFuZyk7IH0KKyAgRm9ybWF0IGdldEZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PEZvcm1hdD4oRm10KTsgfQorICBib29sIGlzUHJlcHJvY2Vzc2VkKCkgY29uc3QgeyByZXR1cm4gUHJlcHJvY2Vzc2VkOyB9CisKKyAgLy8vIElzIHRoZSBpbnB1dCBraW5kIGZ1bGx5LXVua25vd24/CisgIGJvb2wgaXNVbmtub3duKCkgY29uc3QgeyByZXR1cm4gTGFuZyA9PSBVbmtub3duICYmIEZtdCA9PSBTb3VyY2U7IH0KKworICAvLy8gSXMgdGhlIGxhbmd1YWdlIG9mIHRoZSBpbnB1dCBzb21lIGRpYWxlY3Qgb2YgT2JqZWN0aXZlLUM/CisgIGJvb2wgaXNPYmplY3RpdmVDKCkgY29uc3QgeyByZXR1cm4gTGFuZyA9PSBPYmpDIHx8IExhbmcgPT0gT2JqQ1hYOyB9CisKKyAgSW5wdXRLaW5kIGdldFByZXByb2Nlc3NlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5wdXRLaW5kKGdldExhbmd1YWdlKCksIGdldEZvcm1hdCgpLCB0cnVlKTsKKyAgfQorCisgIElucHV0S2luZCB3aXRoRm9ybWF0KEZvcm1hdCBGKSBjb25zdCB7CisgICAgcmV0dXJuIElucHV0S2luZChnZXRMYW5ndWFnZSgpLCBGLCBpc1ByZXByb2Nlc3NlZCgpKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBBbiBpbnB1dCBmaWxlIGZvciB0aGUgZnJvbnQgZW5kLgorY2xhc3MgRnJvbnRlbmRJbnB1dEZpbGUgeworICAvLy8gXGJyaWVmIFRoZSBmaWxlIG5hbWUsIG9yICItIiB0byByZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQuCisgIHN0ZDo6c3RyaW5nIEZpbGU7CisKKyAgLy8vIFRoZSBpbnB1dCwgaWYgaXQgY29tZXMgZnJvbSBhIGJ1ZmZlciByYXRoZXIgdGhhbiBhIGZpbGUuIFRoaXMgb2JqZWN0CisgIC8vLyBkb2VzIG5vdCBvd24gdGhlIGJ1ZmZlciwgYW5kIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nCisgIC8vLyB0aGF0IGl0IG91dGxpdmVzIGFueSB1c2Vycy4KKyAgbGx2bTo6TWVtb3J5QnVmZmVyICpCdWZmZXIgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIGtpbmQgb2YgaW5wdXQsIGUuZy4sIEMgc291cmNlLCBBU1QgZmlsZSwgTExWTSBJUi4KKyAgSW5wdXRLaW5kIEtpbmQ7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHdlJ3JlIGRlYWxpbmcgd2l0aCBhICdzeXN0ZW0nIGlucHV0ICh2cy4gYSAndXNlcicgaW5wdXQpLgorICBib29sIElzU3lzdGVtID0gZmFsc2U7CisKK3B1YmxpYzoKKyAgRnJvbnRlbmRJbnB1dEZpbGUoKSA9IGRlZmF1bHQ7CisgIEZyb250ZW5kSW5wdXRGaWxlKFN0cmluZ1JlZiBGaWxlLCBJbnB1dEtpbmQgS2luZCwgYm9vbCBJc1N5c3RlbSA9IGZhbHNlKQorICAgICAgOiBGaWxlKEZpbGUuc3RyKCkpLCBLaW5kKEtpbmQpLCBJc1N5c3RlbShJc1N5c3RlbSkge30KKyAgRnJvbnRlbmRJbnB1dEZpbGUobGx2bTo6TWVtb3J5QnVmZmVyICpCdWZmZXIsIElucHV0S2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICBib29sIElzU3lzdGVtID0gZmFsc2UpCisgICAgICA6IEJ1ZmZlcihCdWZmZXIpLCBLaW5kKEtpbmQpLCBJc1N5c3RlbShJc1N5c3RlbSkge30KKworICBJbnB1dEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKyAgYm9vbCBpc1N5c3RlbSgpIGNvbnN0IHsgcmV0dXJuIElzU3lzdGVtOyB9CisKKyAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gRmlsZS5lbXB0eSgpICYmIEJ1ZmZlciA9PSBudWxscHRyOyB9CisgIGJvb2wgaXNGaWxlKCkgY29uc3QgeyByZXR1cm4gIWlzQnVmZmVyKCk7IH0KKyAgYm9vbCBpc0J1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIEJ1ZmZlciAhPSBudWxscHRyOyB9CisgIGJvb2wgaXNQcmVwcm9jZXNzZWQoKSBjb25zdCB7IHJldHVybiBLaW5kLmlzUHJlcHJvY2Vzc2VkKCk7IH0KKworICBTdHJpbmdSZWYgZ2V0RmlsZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNGaWxlKCkpOworICAgIHJldHVybiBGaWxlOworICB9CisKKyAgbGx2bTo6TWVtb3J5QnVmZmVyICpnZXRCdWZmZXIoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQnVmZmVyKCkpOworICAgIHJldHVybiBCdWZmZXI7CisgIH0KK307CisKKy8vLyBGcm9udGVuZE9wdGlvbnMgLSBPcHRpb25zIGZvciBjb250cm9sbGluZyB0aGUgYmVoYXZpb3Igb2YgdGhlIGZyb250ZW5kLgorY2xhc3MgRnJvbnRlbmRPcHRpb25zIHsKK3B1YmxpYzoKKyAgLy8vIERpc2FibGUgbWVtb3J5IGZyZWVpbmcgb24gZXhpdC4KKyAgdW5zaWduZWQgRGlzYWJsZUZyZWUgOiAxOworCisgIC8vLyBXaGVuIGdlbmVyYXRpbmcgUENIIGZpbGVzLCBpbnN0cnVjdCB0aGUgQVNUIHdyaXRlciB0byBjcmVhdGUgcmVsb2NhdGFibGUKKyAgLy8vIFBDSCBmaWxlcy4KKyAgdW5zaWduZWQgUmVsb2NhdGFibGVQQ0ggOiAxOworCisgIC8vLyBTaG93IHRoZSAtaGVscCB0ZXh0LgorICB1bnNpZ25lZCBTaG93SGVscCA6IDE7CisKKyAgLy8vIFNob3cgZnJvbnRlbmQgcGVyZm9ybWFuY2UgbWV0cmljcyBhbmQgc3RhdGlzdGljcy4KKyAgdW5zaWduZWQgU2hvd1N0YXRzIDogMTsKKworICAvLy8gU2hvdyB0aW1lcnMgZm9yIGluZGl2aWR1YWwgYWN0aW9ucy4KKyAgdW5zaWduZWQgU2hvd1RpbWVycyA6IDE7CisKKyAgLy8vIFNob3cgdGhlIC12ZXJzaW9uIHRleHQuCisgIHVuc2lnbmVkIFNob3dWZXJzaW9uIDogMTsKKworICAvLy8gQXBwbHkgZml4ZXMgZXZlbiBpZiB0aGVyZSBhcmUgdW5maXhhYmxlIGVycm9ycy4KKyAgdW5zaWduZWQgRml4V2hhdFlvdUNhbiA6IDE7CisKKyAgLy8vIEFwcGx5IGZpeGVzIG9ubHkgZm9yIHdhcm5pbmdzLgorICB1bnNpZ25lZCBGaXhPbmx5V2FybmluZ3MgOiAxOworCisgIC8vLyBBcHBseSBmaXhlcyBhbmQgcmVjb21waWxlLgorICB1bnNpZ25lZCBGaXhBbmRSZWNvbXBpbGUgOiAxOworCisgIC8vLyBBcHBseSBmaXhlcyB0byB0ZW1wb3JhcnkgZmlsZXMuCisgIHVuc2lnbmVkIEZpeFRvVGVtcG9yYXJpZXMgOiAxOworCisgIC8vLyBFbWl0IEFSQyBlcnJvcnMgZXZlbiBpZiB0aGUgbWlncmF0b3IgY2FuIGZpeCB0aGVtLgorICB1bnNpZ25lZCBBUkNNVE1pZ3JhdGVFbWl0QVJDRXJyb3JzIDogMTsKKworICAvLy8gU2tpcCBvdmVyIGZ1bmN0aW9uIGJvZGllcyB0byBzcGVlZCB1cCBwYXJzaW5nIGluIGNhc2VzIHlvdSBkbyBub3QgbmVlZAorICAvLy8gdGhlbSAoZS5nLiB3aXRoIGNvZGUgY29tcGxldGlvbikuCisgIHVuc2lnbmVkIFNraXBGdW5jdGlvbkJvZGllcyA6IDE7CisKKyAgLy8vIFdoZXRoZXIgd2UgY2FuIHVzZSB0aGUgZ2xvYmFsIG1vZHVsZSBpbmRleCBpZiBhdmFpbGFibGUuCisgIHVuc2lnbmVkIFVzZUdsb2JhbE1vZHVsZUluZGV4IDogMTsKKworICAvLy8gV2hldGhlciB3ZSBjYW4gZ2VuZXJhdGUgdGhlIGdsb2JhbCBtb2R1bGUgaW5kZXggaWYgbmVlZGVkLgorICB1bnNpZ25lZCBHZW5lcmF0ZUdsb2JhbE1vZHVsZUluZGV4IDogMTsKKworICAvLy8gV2hldGhlciB3ZSBpbmNsdWRlIGRlY2xhcmF0aW9uIGR1bXBzIGluIEFTVCBkdW1wcy4KKyAgdW5zaWduZWQgQVNURHVtcERlY2xzIDogMTsKKworICAvLy8gV2hldGhlciB3ZSBkZXNlcmlhbGl6ZSBhbGwgZGVjbHMgd2hlbiBmb3JtaW5nIEFTVCBkdW1wcy4KKyAgdW5zaWduZWQgQVNURHVtcEFsbCA6IDE7CisKKyAgLy8vIFdoZXRoZXIgd2UgaW5jbHVkZSBsb29rdXAgdGFibGUgZHVtcHMgaW4gQVNUIGR1bXBzLgorICB1bnNpZ25lZCBBU1REdW1wTG9va3VwcyA6IDE7CisKKyAgLy8vIFdoZXRoZXIgd2UgYXJlIHBlcmZvcm1pbmcgYW4gaW1wbGljaXQgbW9kdWxlIGJ1aWxkLgorICB1bnNpZ25lZCBCdWlsZGluZ0ltcGxpY2l0TW9kdWxlIDogMTsKKworICAvLy8gV2hldGhlciB3ZSBzaG91bGQgZW1iZWQgYWxsIHVzZWQgZmlsZXMgaW50byB0aGUgUENNIGZpbGUuCisgIHVuc2lnbmVkIE1vZHVsZXNFbWJlZEFsbEZpbGVzIDogMTsKKworICAvLy8gV2hldGhlciB0aW1lc3RhbXBzIHNob3VsZCBiZSB3cml0dGVuIHRvIHRoZSBwcm9kdWNlZCBQQ0ggZmlsZS4KKyAgdW5zaWduZWQgSW5jbHVkZVRpbWVzdGFtcHMgOiAxOworCisgIENvZGVDb21wbGV0ZU9wdGlvbnMgQ29kZUNvbXBsZXRlT3B0czsKKworICBlbnVtIHsKKyAgICBBUkNNVF9Ob25lLAorICAgIEFSQ01UX0NoZWNrLAorICAgIEFSQ01UX01vZGlmeSwKKyAgICBBUkNNVF9NaWdyYXRlCisgIH0gQVJDTVRBY3Rpb24gPSBBUkNNVF9Ob25lOworCisgIGVudW0geworICAgIE9iakNNVF9Ob25lID0gMCwKKworICAgIC8vLyBcYnJpZWYgRW5hYmxlIG1pZ3JhdGlvbiB0byBtb2Rlcm4gT2JqQyBsaXRlcmFscy4KKyAgICBPYmpDTVRfTGl0ZXJhbHMgPSAweDEsCisKKyAgICAvLy8gXGJyaWVmIEVuYWJsZSBtaWdyYXRpb24gdG8gbW9kZXJuIE9iakMgc3Vic2NyaXB0aW5nLgorICAgIE9iakNNVF9TdWJzY3JpcHRpbmcgPSAweDIsCisKKyAgICAvLy8gXGJyaWVmIEVuYWJsZSBtaWdyYXRpb24gdG8gbW9kZXJuIE9iakMgcmVhZG9ubHkgcHJvcGVydHkuCisgICAgT2JqQ01UX1JlYWRvbmx5UHJvcGVydHkgPSAweDQsCisKKyAgICAvLy8gXGJyaWVmIEVuYWJsZSBtaWdyYXRpb24gdG8gbW9kZXJuIE9iakMgcmVhZHdyaXRlIHByb3BlcnR5LgorICAgIE9iakNNVF9SZWFkd3JpdGVQcm9wZXJ0eSA9IDB4OCwKKworICAgIC8vLyBcYnJpZWYgRW5hYmxlIG1pZ3JhdGlvbiB0byBtb2Rlcm4gT2JqQyBwcm9wZXJ0eS4KKyAgICBPYmpDTVRfUHJvcGVydHkgPSAoT2JqQ01UX1JlYWRvbmx5UHJvcGVydHkgfCBPYmpDTVRfUmVhZHdyaXRlUHJvcGVydHkpLAorCisgICAgLy8vIFxicmllZiBFbmFibGUgYW5ub3RhdGlvbiBvZiBPYmpDTWV0aG9kcyBvZiBhbGwga2luZHMuCisgICAgT2JqQ01UX0Fubm90YXRpb24gPSAweDEwLAorCisgICAgLy8vIFxicmllZiBFbmFibGUgbWlncmF0aW9uIG9mIE9iakMgbWV0aG9kcyB0byAnaW5zdGFuY2V0eXBlJy4KKyAgICBPYmpDTVRfSW5zdGFuY2V0eXBlID0gMHgyMCwKKworICAgIC8vLyBcYnJpZWYgRW5hYmxlIG1pZ3JhdGlvbiB0byBOU19FTlVNL05TX09QVElPTlMgbWFjcm9zLgorICAgIE9iakNNVF9Oc01hY3JvcyA9IDB4NDAsCisKKyAgICAvLy8gXGJyaWVmIEVuYWJsZSBtaWdyYXRpb24gdG8gYWRkIGNvbmZvcm1pbmcgcHJvdG9jb2xzLgorICAgIE9iakNNVF9Qcm90b2NvbENvbmZvcm1hbmNlID0gMHg4MCwKKworICAgIC8vLyBcYnJpZWYgcHJlZmVyICdhdG9taWMnIHByb3BlcnR5IG92ZXIgJ25vbmF0b21pYycuCisgICAgT2JqQ01UX0F0b21pY1Byb3BlcnR5ID0gMHgxMDAsCisKKyAgICAvLy8gXGJyaWVmIGFubm90YXRlIHByb3BlcnR5IHdpdGggTlNfUkVUVVJOU19JTk5FUl9QT0lOVEVSCisgICAgT2JqQ01UX1JldHVybnNJbm5lclBvaW50ZXJQcm9wZXJ0eSA9IDB4MjAwLAorCisgICAgLy8vIFxicmllZiB1c2UgTlNfTk9OQVRPTUlDX0lPU09OTFkgZm9yIHByb3BlcnR5ICdhdG9taWMnIGF0dHJpYnV0ZQorICAgIE9iakNNVF9Oc0F0b21pY0lPU09ubHlQcm9wZXJ0eSA9IDB4NDAwLAorCisgICAgLy8vIFxicmllZiBFbmFibGUgaW5mZXJyaW5nIE5TX0RFU0lHTkFURURfSU5JVElBTElaRVIgZm9yIE9iakMgbWV0aG9kcy4KKyAgICBPYmpDTVRfRGVzaWduYXRlZEluaXRpYWxpemVyID0gMHg4MDAsCisKKyAgICAvLy8gXGJyaWVmIEVuYWJsZSBjb252ZXJ0aW5nIHNldHRlci9nZXR0ZXIgZXhwcmVzc2lvbnMgdG8gcHJvcGVydHktZG90IHN5bnR4LgorICAgIE9iakNNVF9Qcm9wZXJ0eURvdFN5bnRheCA9IDB4MTAwMCwKKworICAgIE9iakNNVF9NaWdyYXRlRGVjbHMgPSAoT2JqQ01UX1JlYWRvbmx5UHJvcGVydHkgfCBPYmpDTVRfUmVhZHdyaXRlUHJvcGVydHkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ01UX0Fubm90YXRpb24gfCBPYmpDTVRfSW5zdGFuY2V0eXBlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNVF9Oc01hY3JvcyB8IE9iakNNVF9Qcm90b2NvbENvbmZvcm1hbmNlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNVF9Oc0F0b21pY0lPU09ubHlQcm9wZXJ0eSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDTVRfRGVzaWduYXRlZEluaXRpYWxpemVyKSwKKyAgICBPYmpDTVRfTWlncmF0ZUFsbCA9IChPYmpDTVRfTGl0ZXJhbHMgfCBPYmpDTVRfU3Vic2NyaXB0aW5nIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDTVRfTWlncmF0ZURlY2xzIHwgT2JqQ01UX1Byb3BlcnR5RG90U3ludGF4KQorICB9OworICB1bnNpZ25lZCBPYmpDTVRBY3Rpb24gPSBPYmpDTVRfTm9uZTsKKyAgc3RkOjpzdHJpbmcgT2JqQ01UV2hpdGVMaXN0UGF0aDsKKworICBzdGQ6OnN0cmluZyBNVE1pZ3JhdGVEaXI7CisgIHN0ZDo6c3RyaW5nIEFSQ01UTWlncmF0ZVJlcG9ydE91dDsKKworICAvLy8gVGhlIGlucHV0IGZpbGVzIGFuZCB0aGVpciB0eXBlcy4KKyAgc3RkOjp2ZWN0b3I8RnJvbnRlbmRJbnB1dEZpbGU+IElucHV0czsKKworICAvLy8gV2hlbiB0aGUgaW5wdXQgaXMgYSBtb2R1bGUgbWFwLCB0aGUgb3JpZ2luYWwgbW9kdWxlIG1hcCBmaWxlIGZyb20gd2hpY2gKKyAgLy8vIHRoYXQgbWFwIHdhcyBpbmZlcnJlZCwgaWYgYW55IChmb3IgdW1icmVsbGEgbW9kdWxlcykuCisgIHN0ZDo6c3RyaW5nIE9yaWdpbmFsTW9kdWxlTWFwOworCisgIC8vLyBUaGUgb3V0cHV0IGZpbGUsIGlmIGFueS4KKyAgc3RkOjpzdHJpbmcgT3V0cHV0RmlsZTsKKworICAvLy8gSWYgZ2l2ZW4sIHRoZSBuZXcgc3VmZml4IGZvciBmaXgtaXQgcmV3cml0dGVuIGZpbGVzLgorICBzdGQ6OnN0cmluZyBGaXhJdFN1ZmZpeDsKKworICAvLy8gSWYgZ2l2ZW4sIGZpbHRlciBkdW1wZWQgQVNUIERlY2wgbm9kZXMgYnkgdGhpcyBzdWJzdHJpbmcuCisgIHN0ZDo6c3RyaW5nIEFTVER1bXBGaWx0ZXI7CisKKyAgLy8vIElmIGdpdmVuLCBlbmFibGUgY29kZSBjb21wbGV0aW9uIGF0IHRoZSBwcm92aWRlZCBsb2NhdGlvbi4KKyAgUGFyc2VkU291cmNlTG9jYXRpb24gQ29kZUNvbXBsZXRpb25BdDsKKworICAvLy8gVGhlIGZyb250ZW5kIGFjdGlvbiB0byBwZXJmb3JtLgorICBmcm9udGVuZDo6QWN0aW9uS2luZCBQcm9ncmFtQWN0aW9uID0gZnJvbnRlbmQ6OlBhcnNlU3ludGF4T25seTsKKworICAvLy8gVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBydW4gd2hlbiB1c2luZyBhIHBsdWdpbiBhY3Rpb24uCisgIHN0ZDo6c3RyaW5nIEFjdGlvbk5hbWU7CisKKyAgLy8vIEFyZ3MgdG8gcGFzcyB0byB0aGUgcGx1Z2lucworICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiBQbHVnaW5BcmdzOworCisgIC8vLyBUaGUgbGlzdCBvZiBwbHVnaW4gYWN0aW9ucyB0byBydW4gaW4gYWRkaXRpb24gdG8gdGhlIG5vcm1hbCBhY3Rpb24uCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBBZGRQbHVnaW5BY3Rpb25zOworCisgIC8vLyBUaGUgbGlzdCBvZiBwbHVnaW5zIHRvIGxvYWQuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBQbHVnaW5zOworCisgIC8vLyBUaGUgbGlzdCBvZiBtb2R1bGUgZmlsZSBleHRlbnNpb25zLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TW9kdWxlRmlsZUV4dGVuc2lvbj4+IE1vZHVsZUZpbGVFeHRlbnNpb25zOworCisgIC8vLyBcYnJpZWYgVGhlIGxpc3Qgb2YgbW9kdWxlIG1hcCBmaWxlcyB0byBsb2FkIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBpbnB1dC4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IE1vZHVsZU1hcEZpbGVzOworCisgIC8vLyBcYnJpZWYgVGhlIGxpc3Qgb2YgYWRkaXRpb25hbCBwcmVidWlsdCBtb2R1bGUgZmlsZXMgdG8gbG9hZCBiZWZvcmUKKyAgLy8vIHByb2Nlc3NpbmcgdGhlIGlucHV0LgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTW9kdWxlRmlsZXM7CisKKyAgLy8vIFxicmllZiBUaGUgbGlzdCBvZiBmaWxlcyB0byBlbWJlZCBpbnRvIHRoZSBjb21waWxlZCBtb2R1bGUgZmlsZS4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IE1vZHVsZXNFbWJlZEZpbGVzOworCisgIC8vLyBcYnJpZWYgVGhlIGxpc3Qgb2YgQVNUIGZpbGVzIHRvIG1lcmdlLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQVNUTWVyZ2VGaWxlczsKKworICAvLy8gXGJyaWVmIEEgbGlzdCBvZiBhcmd1bWVudHMgdG8gZm9yd2FyZCB0byBMTFZNJ3Mgb3B0aW9uIHByb2Nlc3Npbmc7IHRoaXMKKyAgLy8vIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBhbmQgZXhwZXJpbWVudGFsIGZlYXR1cmVzLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTExWTUFyZ3M7CisKKyAgLy8vIFxicmllZiBGaWxlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCB3aWxsIHByb3ZpZGUgcmVjb3JkIGxheW91dHMKKyAgLy8vIChpbiB0aGUgZm9ybWF0IHByb2R1Y2VkIGJ5IC1mZHVtcC1yZWNvcmQtbGF5b3V0cykuCisgIHN0ZDo6c3RyaW5nIE92ZXJyaWRlUmVjb3JkTGF5b3V0c0ZpbGU7CisKKyAgLy8vIFxicmllZiBBdXhpbGlhcnkgdHJpcGxlIGZvciBDVURBIGNvbXBpbGF0aW9uLgorICBzdGQ6OnN0cmluZyBBdXhUcmlwbGU7CisKKyAgLy8vIFxicmllZiBJZiBub24tZW1wdHksIHNlYXJjaCB0aGUgcGNoIGlucHV0IGZpbGUgYXMgaWYgaXQgd2FzIGEgaGVhZGVyCisgIC8vLyBpbmNsdWRlZCBieSB0aGlzIGZpbGUuCisgIHN0ZDo6c3RyaW5nIEZpbmRQY2hTb3VyY2U7CisKKyAgLy8vIEZpbGVuYW1lIHRvIHdyaXRlIHN0YXRpc3RpY3MgdG8uCisgIHN0ZDo6c3RyaW5nIFN0YXRzRmlsZTsKKworcHVibGljOgorICBGcm9udGVuZE9wdGlvbnMoKQorICAgICAgOiBEaXNhYmxlRnJlZShmYWxzZSksIFJlbG9jYXRhYmxlUENIKGZhbHNlKSwgU2hvd0hlbHAoZmFsc2UpLAorICAgICAgICBTaG93U3RhdHMoZmFsc2UpLCBTaG93VGltZXJzKGZhbHNlKSwgU2hvd1ZlcnNpb24oZmFsc2UpLAorICAgICAgICBGaXhXaGF0WW91Q2FuKGZhbHNlKSwgRml4T25seVdhcm5pbmdzKGZhbHNlKSwgRml4QW5kUmVjb21waWxlKGZhbHNlKSwKKyAgICAgICAgRml4VG9UZW1wb3JhcmllcyhmYWxzZSksIEFSQ01UTWlncmF0ZUVtaXRBUkNFcnJvcnMoZmFsc2UpLAorICAgICAgICBTa2lwRnVuY3Rpb25Cb2RpZXMoZmFsc2UpLCBVc2VHbG9iYWxNb2R1bGVJbmRleCh0cnVlKSwKKyAgICAgICAgR2VuZXJhdGVHbG9iYWxNb2R1bGVJbmRleCh0cnVlKSwgQVNURHVtcERlY2xzKGZhbHNlKSwKKyAgICAgICAgQVNURHVtcExvb2t1cHMoZmFsc2UpLCBCdWlsZGluZ0ltcGxpY2l0TW9kdWxlKGZhbHNlKSwKKyAgICAgICAgTW9kdWxlc0VtYmVkQWxsRmlsZXMoZmFsc2UpLCBJbmNsdWRlVGltZXN0YW1wcyh0cnVlKSB7fQorCisgIC8vLyBnZXRJbnB1dEtpbmRGb3JFeHRlbnNpb24gLSBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGlucHV0IGtpbmQgZm9yIGEgZmlsZQorICAvLy8gZXh0ZW5zaW9uLiBGb3IgZXhhbXBsZSwgImMiIHdvdWxkIHJldHVybiBJbnB1dEtpbmQ6OkMuCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgaW5wdXQga2luZCBmb3IgdGhlIGV4dGVuc2lvbiwgb3IgSW5wdXRLaW5kOjpVbmtub3duIGlmIHRoZQorICAvLy8gZXh0ZW5zaW9uIGlzIG5vdCByZWNvZ25pemVkLgorICBzdGF0aWMgSW5wdXRLaW5kIGdldElucHV0S2luZEZvckV4dGVuc2lvbihTdHJpbmdSZWYgRXh0ZW5zaW9uKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0ZST05URU5EX0ZST05URU5ET1BUSU9OU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Gcm9udGVuZFBsdWdpblJlZ2lzdHJ5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Gcm9udGVuZFBsdWdpblJlZ2lzdHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4NWU4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0Zyb250ZW5kUGx1Z2luUmVnaXN0cnkuaApAQCAtMCwwICsxLDI3IEBACisvLz09PS0gRnJvbnRlbmRQbHVnaW5SZWdpc3RyeS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFBsdWdnYWJsZSBGcm9udGVuZCBBY3Rpb24gSW50ZXJmYWNlCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0ZST05URU5EX0ZST05URU5EUExVR0lOUkVHSVNUUllfSAorI2RlZmluZSBMTFZNX0NMQU5HX0ZST05URU5EX0ZST05URU5EUExVR0lOUkVHSVNUUllfSAorCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUmVnaXN0cnkuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFRoZSBmcm9udGVuZCBwbHVnaW4gcmVnaXN0cnkuCit1c2luZyBGcm9udGVuZFBsdWdpblJlZ2lzdHJ5ID0gbGx2bTo6UmVnaXN0cnk8UGx1Z2luQVNUQWN0aW9uPjsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfRlJPTlRFTkRfRlJPTlRFTkRQTFVHSU5SRUdJU1RSWV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9MYW5nU3RhbmRhcmQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0xhbmdTdGFuZGFyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZTQ1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9MYW5nU3RhbmRhcmQuaApAQCAtMCwwICsxLDExNCBAQAorLy89PT0tLS0gTGFuZ1N0YW5kYXJkLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0ZST05URU5EX0xBTkdTVEFOREFSRF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfRlJPTlRFTkRfTEFOR1NUQU5EQVJEX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Gcm9udGVuZE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworbmFtZXNwYWNlIGZyb250ZW5kIHsKKworZW51bSBMYW5nRmVhdHVyZXMgeworICBMaW5lQ29tbWVudCA9ICgxIDw8IDApLAorICBDOTkgPSAoMSA8PCAxKSwKKyAgQzExID0gKDEgPDwgMiksCisgIEMxNyA9ICgxIDw8IDMpLAorICBDUGx1c1BsdXMgPSAoMSA8PCA0KSwKKyAgQ1BsdXNQbHVzMTEgPSAoMSA8PCA1KSwKKyAgQ1BsdXNQbHVzMTQgPSAoMSA8PCA2KSwKKyAgQ1BsdXNQbHVzMTcgPSAoMSA8PCA3KSwKKyAgQ1BsdXNQbHVzMmEgPSAoMSA8PCA4KSwKKyAgRGlncmFwaHMgPSAoMSA8PCA5KSwKKyAgR05VTW9kZSA9ICgxIDw8IDEwKSwKKyAgSGV4RmxvYXQgPSAoMSA8PCAxMSksCisgIEltcGxpY2l0SW50ID0gKDEgPDwgMTIpLAorICBPcGVuQ0wgPSAoMSA8PCAxMykKK307CisKK30KKworLy8vIExhbmdTdGFuZGFyZCAtIEluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9wZXJ0aWVzIG9mIGEgcGFydGljdWxhciBsYW5ndWFnZQorLy8vIHN0YW5kYXJkLgorc3RydWN0IExhbmdTdGFuZGFyZCB7CisgIGVudW0gS2luZCB7CisjZGVmaW5lIExBTkdTVEFOREFSRChpZCwgbmFtZSwgbGFuZywgZGVzYywgZmVhdHVyZXMpIFwKKyAgICBsYW5nXyMjaWQsCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvTGFuZ1N0YW5kYXJkcy5kZWYiCisgICAgbGFuZ191bnNwZWNpZmllZAorICB9OworCisgIGNvbnN0IGNoYXIgKlNob3J0TmFtZTsKKyAgY29uc3QgY2hhciAqRGVzY3JpcHRpb247CisgIHVuc2lnbmVkIEZsYWdzOworICBJbnB1dEtpbmQ6Okxhbmd1YWdlIExhbmd1YWdlOworCitwdWJsaWM6CisgIC8vLyBnZXROYW1lIC0gR2V0IHRoZSBuYW1lIG9mIHRoaXMgc3RhbmRhcmQuCisgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBTaG9ydE5hbWU7IH0KKworICAvLy8gZ2V0RGVzY3JpcHRpb24gLSBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgc3RhbmRhcmQuCisgIGNvbnN0IGNoYXIgKmdldERlc2NyaXB0aW9uKCkgY29uc3QgeyByZXR1cm4gRGVzY3JpcHRpb247IH0KKworICAvLy8gR2V0IHRoZSBsYW5ndWFnZSB0aGF0IHRoaXMgc3RhbmRhcmQgZGVzY3JpYmVzLgorICBJbnB1dEtpbmQ6Okxhbmd1YWdlIGdldExhbmd1YWdlKCkgY29uc3QgeyByZXR1cm4gTGFuZ3VhZ2U7IH0KKworICAvLy8gTGFuZ3VhZ2Ugc3VwcG9ydHMgJy8vJyBjb21tZW50cy4KKyAgYm9vbCBoYXNMaW5lQ29tbWVudHMoKSBjb25zdCB7IHJldHVybiBGbGFncyAmIGZyb250ZW5kOjpMaW5lQ29tbWVudDsgfQorCisgIC8vLyBpc0M5OSAtIExhbmd1YWdlIGlzIGEgc3VwZXJzZXQgb2YgQzk5LgorICBib29sIGlzQzk5KCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiBmcm9udGVuZDo6Qzk5OyB9CisKKyAgLy8vIGlzQzExIC0gTGFuZ3VhZ2UgaXMgYSBzdXBlcnNldCBvZiBDMTEuCisgIGJvb2wgaXNDMTEoKSBjb25zdCB7IHJldHVybiBGbGFncyAmIGZyb250ZW5kOjpDMTE7IH0KKworICAvLy8gaXNDMTcgLSBMYW5ndWFnZSBpcyBhIHN1cGVyc2V0IG9mIEMxNy4KKyAgYm9vbCBpc0MxNygpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgZnJvbnRlbmQ6OkMxNzsgfQorCisgIC8vLyBpc0NQbHVzUGx1cyAtIExhbmd1YWdlIGlzIGEgQysrIHZhcmlhbnQuCisgIGJvb2wgaXNDUGx1c1BsdXMoKSBjb25zdCB7IHJldHVybiBGbGFncyAmIGZyb250ZW5kOjpDUGx1c1BsdXM7IH0KKworICAvLy8gaXNDUGx1c1BsdXMxMSAtIExhbmd1YWdlIGlzIGEgQysrMTEgdmFyaWFudCAob3IgbGF0ZXIpLgorICBib29sIGlzQ1BsdXNQbHVzMTEoKSBjb25zdCB7IHJldHVybiBGbGFncyAmIGZyb250ZW5kOjpDUGx1c1BsdXMxMTsgfQorCisgIC8vLyBpc0NQbHVzUGx1czE0IC0gTGFuZ3VhZ2UgaXMgYSBDKysxNCB2YXJpYW50IChvciBsYXRlcikuCisgIGJvb2wgaXNDUGx1c1BsdXMxNCgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgZnJvbnRlbmQ6OkNQbHVzUGx1czE0OyB9CisKKyAgLy8vIGlzQ1BsdXNQbHVzMTcgLSBMYW5ndWFnZSBpcyBhIEMrKzE3IHZhcmlhbnQgKG9yIGxhdGVyKS4KKyAgYm9vbCBpc0NQbHVzUGx1czE3KCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiBmcm9udGVuZDo6Q1BsdXNQbHVzMTc7IH0KKworICAvLy8gaXNDUGx1c1BsdXMyYSAtIExhbmd1YWdlIGlzIGEgcG9zdC1DKysxNyB2YXJpYW50IChvciBsYXRlcikuCisgIGJvb2wgaXNDUGx1c1BsdXMyYSgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgZnJvbnRlbmQ6OkNQbHVzUGx1czJhOyB9CisKKworICAvLy8gaGFzRGlncmFwaHMgLSBMYW5ndWFnZSBzdXBwb3J0cyBkaWdyYXBocy4KKyAgYm9vbCBoYXNEaWdyYXBocygpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgZnJvbnRlbmQ6OkRpZ3JhcGhzOyB9CisKKyAgLy8vIGlzR05VTW9kZSAtIExhbmd1YWdlIGluY2x1ZGVzIEdOVSBleHRlbnNpb25zLgorICBib29sIGlzR05VTW9kZSgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgZnJvbnRlbmQ6OkdOVU1vZGU7IH0KKworICAvLy8gaGFzSGV4RmxvYXRzIC0gTGFuZ3VhZ2Ugc3VwcG9ydHMgaGV4YWRlY2ltYWwgZmxvYXQgY29uc3RhbnRzLgorICBib29sIGhhc0hleEZsb2F0cygpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgZnJvbnRlbmQ6OkhleEZsb2F0OyB9CisKKyAgLy8vIGhhc0ltcGxpY2l0SW50IC0gTGFuZ3VhZ2UgYWxsb3dzIHZhcmlhYmxlcyB0byBiZSB0eXBlZCBhcyBpbnQgaW1wbGljaXRseS4KKyAgYm9vbCBoYXNJbXBsaWNpdEludCgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgZnJvbnRlbmQ6OkltcGxpY2l0SW50OyB9CisKKyAgLy8vIGlzT3BlbkNMIC0gTGFuZ3VhZ2UgaXMgYSBPcGVuQ0wgdmFyaWFudC4KKyAgYm9vbCBpc09wZW5DTCgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgZnJvbnRlbmQ6Ok9wZW5DTDsgfQorCisgIHN0YXRpYyBjb25zdCBMYW5nU3RhbmRhcmQgJmdldExhbmdTdGFuZGFyZEZvcktpbmQoS2luZCBLKTsKKyAgc3RhdGljIGNvbnN0IExhbmdTdGFuZGFyZCAqZ2V0TGFuZ1N0YW5kYXJkRm9yTmFtZShTdHJpbmdSZWYgTmFtZSk7Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvTGFuZ1N0YW5kYXJkcy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9MYW5nU3RhbmRhcmRzLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2EwODFkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvTGFuZ1N0YW5kYXJkcy5kZWYKQEAgLTAsMCArMSwxNzAgQEAKKy8vPT09LS0gTGFuZ1N0YW5kYXJkcy5kZWYgLSBMYW5ndWFnZSBTdGFuZGFyZCBEYXRhIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTEFOR1NUQU5EQVJECisjZXJyb3IgIkxBTkdTVEFOREFSRCBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUiCisjZW5kaWYKKworLy8vIExBTkdTVEFOREFSRChJREVOVCwgTkFNRSwgTEFORywgREVTQywgRkVBVFVSRVMpCisvLy8KKy8vLyBccGFyYW0gSURFTlQgLSBUaGUgbmFtZSBvZiB0aGUgc3RhbmRhcmQgYXMgYSBDKysgaWRlbnRpZmllci4KKy8vLyBccGFyYW0gTkFNRSAtIFRoZSBuYW1lIG9mIHRoZSBzdGFuZGFyZC4KKy8vLyBccGFyYW0gTEFORyAtIFRoZSBJbnB1dEtpbmQ6Okxhbmd1YWdlIGZvciB3aGljaCB0aGlzIGlzIGEgc3RhbmRhcmQuCisvLy8gXHBhcmFtIERFU0MgLSBBIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBzdGFuZGFyZC4KKy8vLyBccGFyYW0gRkVBVFVSRVMgLSBUaGUgc3RhbmRhcmQgZmVhdHVyZXMgYXMgZmxhZ3MsIHRoZXNlIGFyZSBlbnVtcyBmcm9tIHRoZQorLy8vIGNsYW5nOjpmcm9udGVuZCBuYW1lc3BhY2UsIHdoaWNoIGlzIGFzc3VtZWQgdG8gYmUgYmUgYXZhaWxhYmxlLgorCisvLy8gTEFOR1NUQU5EQVJEX0FMSUFTKElERU5ULCBBTElBUykKKy8vLyBccGFyYW0gSURFTlQgLSBUaGUgbmFtZSBvZiB0aGUgc3RhbmRhcmQgYXMgYSBDKysgaWRlbnRpZmllci4KKy8vLyBccGFyYW0gQUxJQVMgLSBUaGUgYWxpYXMgb2YgdGhlIHN0YW5kYXJkLgorCisvLy8gTEFOR1NUQU5EQVJEX0FMSUFTX0RFUFIoSURFTlQsIEFMSUFTKQorLy8vIFNhbWUgYXMgTEFOR1NUQU5EQVJEX0FMSUFTLCBidXQgZm9yIGEgZGVwcmVjYXRlZCBhbGlhcy4KKworI2lmbmRlZiBMQU5HU1RBTkRBUkRfQUxJQVMKKyNkZWZpbmUgTEFOR1NUQU5EQVJEX0FMSUFTKElERU5ULCBBTElBUykKKyNlbmRpZgorCisjaWZuZGVmIExBTkdTVEFOREFSRF9BTElBU19ERVBSCisjZGVmaW5lIExBTkdTVEFOREFSRF9BTElBU19ERVBSKElERU5ULCBBTElBUykgTEFOR1NUQU5EQVJEX0FMSUFTKElERU5ULCBBTElBUykKKyNlbmRpZgorCisvLyBDODktaXNoIG1vZGVzLgorTEFOR1NUQU5EQVJEKGM4OSwgImM4OSIsCisgICAgICAgICAgICAgQywgIklTTyBDIDE5OTAiLAorICAgICAgICAgICAgIEltcGxpY2l0SW50KQorTEFOR1NUQU5EQVJEX0FMSUFTKGM4OSwgImM5MCIpCitMQU5HU1RBTkRBUkRfQUxJQVMoYzg5LCAiaXNvOTg5OToxOTkwIikKKworTEFOR1NUQU5EQVJEKGM5NCwgImlzbzk4OTk6MTk5NDA5IiwKKyAgICAgICAgICAgICBDLCAiSVNPIEMgMTk5MCB3aXRoIGFtZW5kbWVudCAxIiwKKyAgICAgICAgICAgICBEaWdyYXBocyB8IEltcGxpY2l0SW50KQorCitMQU5HU1RBTkRBUkQoZ251ODksICJnbnU4OSIsCisgICAgICAgICAgICAgQywgIklTTyBDIDE5OTAgd2l0aCBHTlUgZXh0ZW5zaW9ucyIsCisgICAgICAgICAgICAgTGluZUNvbW1lbnQgfCBEaWdyYXBocyB8IEdOVU1vZGUgfCBJbXBsaWNpdEludCkKK0xBTkdTVEFOREFSRF9BTElBUyhnbnU4OSwgImdudTkwIikKKworLy8gQzk5LWlzaCBtb2RlcworTEFOR1NUQU5EQVJEKGM5OSwgImM5OSIsCisgICAgICAgICAgICAgQywgIklTTyBDIDE5OTkiLAorICAgICAgICAgICAgIExpbmVDb21tZW50IHwgQzk5IHwgRGlncmFwaHMgfCBIZXhGbG9hdCkKK0xBTkdTVEFOREFSRF9BTElBUyhjOTksICJpc285ODk5OjE5OTkiKQorTEFOR1NUQU5EQVJEX0FMSUFTX0RFUFIoYzk5LCAiYzl4IikKK0xBTkdTVEFOREFSRF9BTElBU19ERVBSKGM5OSwgImlzbzk4OTk6MTk5eCIpCisKK0xBTkdTVEFOREFSRChnbnU5OSwgImdudTk5IiwKKyAgICAgICAgICAgICBDLCAiSVNPIEMgMTk5OSB3aXRoIEdOVSBleHRlbnNpb25zIiwKKyAgICAgICAgICAgICBMaW5lQ29tbWVudCB8IEM5OSB8IERpZ3JhcGhzIHwgR05VTW9kZSB8IEhleEZsb2F0KQorTEFOR1NUQU5EQVJEX0FMSUFTX0RFUFIoZ251OTksICJnbnU5eCIpCisKKy8vIEMxMSBtb2RlcworTEFOR1NUQU5EQVJEKGMxMSwgImMxMSIsCisgICAgICAgICAgICAgQywgIklTTyBDIDIwMTEiLAorICAgICAgICAgICAgIExpbmVDb21tZW50IHwgQzk5IHwgQzExIHwgRGlncmFwaHMgfCBIZXhGbG9hdCkKK0xBTkdTVEFOREFSRF9BTElBUyhjMTEsICJpc285ODk5OjIwMTEiKQorTEFOR1NUQU5EQVJEX0FMSUFTX0RFUFIoYzExLCAiYzF4IikKK0xBTkdTVEFOREFSRF9BTElBU19ERVBSKGMxMSwgImlzbzk4OTk6MjAxeCIpCisKK0xBTkdTVEFOREFSRChnbnUxMSwgImdudTExIiwKKyAgICAgICAgICAgICBDLCAiSVNPIEMgMjAxMSB3aXRoIEdOVSBleHRlbnNpb25zIiwKKyAgICAgICAgICAgICBMaW5lQ29tbWVudCB8IEM5OSB8IEMxMSB8IERpZ3JhcGhzIHwgR05VTW9kZSB8IEhleEZsb2F0KQorTEFOR1NUQU5EQVJEX0FMSUFTX0RFUFIoZ251MTEsICJnbnUxeCIpCisKKy8vIEMxNyBtb2RlcworTEFOR1NUQU5EQVJEKGMxNywgImMxNyIsCisgICAgICAgICAgICAgQywgIklTTyBDIDIwMTciLAorICAgICAgICAgICAgIExpbmVDb21tZW50IHwgQzk5IHwgQzExIHwgQzE3IHwgRGlncmFwaHMgfCBIZXhGbG9hdCkKK0xBTkdTVEFOREFSRF9BTElBUyhjMTcsICJpc285ODk5OjIwMTciKQorTEFOR1NUQU5EQVJEKGdudTE3LCAiZ251MTciLAorICAgICAgICAgICAgIEMsICJJU08gQyAyMDE3IHdpdGggR05VIGV4dGVuc2lvbnMiLAorICAgICAgICAgICAgIExpbmVDb21tZW50IHwgQzk5IHwgQzExIHwgQzE3IHwgRGlncmFwaHMgfCBHTlVNb2RlIHwgSGV4RmxvYXQpCisKKy8vIEMrKyBtb2RlcworTEFOR1NUQU5EQVJEKGN4eDk4LCAiYysrOTgiLAorICAgICAgICAgICAgIENYWCwgIklTTyBDKysgMTk5OCB3aXRoIGFtZW5kbWVudHMiLAorICAgICAgICAgICAgIExpbmVDb21tZW50IHwgQ1BsdXNQbHVzIHwgRGlncmFwaHMpCitMQU5HU1RBTkRBUkRfQUxJQVMoY3h4OTgsICJjKyswMyIpCisKK0xBTkdTVEFOREFSRChnbnVjeHg5OCwgImdudSsrOTgiLAorICAgICAgICAgICAgIENYWCwgIklTTyBDKysgMTk5OCB3aXRoIGFtZW5kbWVudHMgYW5kIEdOVSBleHRlbnNpb25zIiwKKyAgICAgICAgICAgICBMaW5lQ29tbWVudCB8IENQbHVzUGx1cyB8IERpZ3JhcGhzIHwgR05VTW9kZSkKK0xBTkdTVEFOREFSRF9BTElBUyhnbnVjeHg5OCwgImdudSsrMDMiKQorCitMQU5HU1RBTkRBUkQoY3h4MTEsICJjKysxMSIsCisgICAgICAgICAgICAgQ1hYLCAiSVNPIEMrKyAyMDExIHdpdGggYW1lbmRtZW50cyIsCisgICAgICAgICAgICAgTGluZUNvbW1lbnQgfCBDUGx1c1BsdXMgfCBDUGx1c1BsdXMxMSB8IERpZ3JhcGhzKQorTEFOR1NUQU5EQVJEX0FMSUFTX0RFUFIoY3h4MTEsICJjKysweCIpCisKK0xBTkdTVEFOREFSRChnbnVjeHgxMSwgImdudSsrMTEiLCBDWFgsCisgICAgICAgICAgICAgIklTTyBDKysgMjAxMSB3aXRoIGFtZW5kbWVudHMgYW5kIEdOVSBleHRlbnNpb25zIiwKKyAgICAgICAgICAgICBMaW5lQ29tbWVudCB8IENQbHVzUGx1cyB8IENQbHVzUGx1czExIHwgRGlncmFwaHMgfCBHTlVNb2RlKQorTEFOR1NUQU5EQVJEX0FMSUFTX0RFUFIoZ251Y3h4MTEsICJnbnUrKzB4IikKKworTEFOR1NUQU5EQVJEKGN4eDE0LCAiYysrMTQiLAorICAgICAgICAgICAgIENYWCwgIklTTyBDKysgMjAxNCB3aXRoIGFtZW5kbWVudHMiLAorICAgICAgICAgICAgIExpbmVDb21tZW50IHwgQ1BsdXNQbHVzIHwgQ1BsdXNQbHVzMTEgfCBDUGx1c1BsdXMxNCB8IERpZ3JhcGhzKQorTEFOR1NUQU5EQVJEX0FMSUFTX0RFUFIoY3h4MTQsICJjKysxeSIpCisKK0xBTkdTVEFOREFSRChnbnVjeHgxNCwgImdudSsrMTQiLAorICAgICAgICAgICAgIENYWCwgIklTTyBDKysgMjAxNCB3aXRoIGFtZW5kbWVudHMgYW5kIEdOVSBleHRlbnNpb25zIiwKKyAgICAgICAgICAgICBMaW5lQ29tbWVudCB8IENQbHVzUGx1cyB8IENQbHVzUGx1czExIHwgQ1BsdXNQbHVzMTQgfCBEaWdyYXBocyB8CisgICAgICAgICAgICAgR05VTW9kZSkKK0xBTkdTVEFOREFSRF9BTElBU19ERVBSKGdudWN4eDE0LCAiZ251KysxeSIpCisKK0xBTkdTVEFOREFSRChjeHgxNywgImMrKzE3IiwKKyAgICAgICAgICAgICBDWFgsICJJU08gQysrIDIwMTcgd2l0aCBhbWVuZG1lbnRzIiwKKyAgICAgICAgICAgICBMaW5lQ29tbWVudCB8IENQbHVzUGx1cyB8IENQbHVzUGx1czExIHwgQ1BsdXNQbHVzMTQgfCBDUGx1c1BsdXMxNyB8CisgICAgICAgICAgICAgRGlncmFwaHMgfCBIZXhGbG9hdCkKK0xBTkdTVEFOREFSRF9BTElBU19ERVBSKGN4eDE3LCAiYysrMXoiKQorCitMQU5HU1RBTkRBUkQoZ251Y3h4MTcsICJnbnUrKzE3IiwKKyAgICAgICAgICAgICBDWFgsICJJU08gQysrIDIwMTcgd2l0aCBhbWVuZG1lbnRzIGFuZCBHTlUgZXh0ZW5zaW9ucyIsCisgICAgICAgICAgICAgTGluZUNvbW1lbnQgfCBDUGx1c1BsdXMgfCBDUGx1c1BsdXMxMSB8IENQbHVzUGx1czE0IHwgQ1BsdXNQbHVzMTcgfAorICAgICAgICAgICAgIERpZ3JhcGhzIHwgSGV4RmxvYXQgfCBHTlVNb2RlKQorTEFOR1NUQU5EQVJEX0FMSUFTX0RFUFIoZ251Y3h4MTcsICJnbnUrKzF6IikKKworTEFOR1NUQU5EQVJEKGN4eDJhLCAiYysrMmEiLAorICAgICAgICAgICAgIENYWCwgIldvcmtpbmcgZHJhZnQgZm9yIElTTyBDKysgMjAyMCIsCisgICAgICAgICAgICAgTGluZUNvbW1lbnQgfCBDUGx1c1BsdXMgfCBDUGx1c1BsdXMxMSB8IENQbHVzUGx1czE0IHwgQ1BsdXNQbHVzMTcgfAorICAgICAgICAgICAgIENQbHVzUGx1czJhIHwgRGlncmFwaHMgfCBIZXhGbG9hdCkKKworTEFOR1NUQU5EQVJEKGdudWN4eDJhLCAiZ251KysyYSIsCisgICAgICAgICAgICAgQ1hYLCAiV29ya2luZyBkcmFmdCBmb3IgSVNPIEMrKyAyMDIwIHdpdGggR05VIGV4dGVuc2lvbnMiLAorICAgICAgICAgICAgIExpbmVDb21tZW50IHwgQ1BsdXNQbHVzIHwgQ1BsdXNQbHVzMTEgfCBDUGx1c1BsdXMxNCB8IENQbHVzUGx1czE3IHwKKyAgICAgICAgICAgICBDUGx1c1BsdXMyYSB8IERpZ3JhcGhzIHwgSGV4RmxvYXQgfCBHTlVNb2RlKQorCisvLyBPcGVuQ0wKK0xBTkdTVEFOREFSRChvcGVuY2wxMCwgImNsMS4wIiwKKyAgICAgICAgICAgICBPcGVuQ0wsICJPcGVuQ0wgMS4wIiwKKyAgICAgICAgICAgICBMaW5lQ29tbWVudCB8IEM5OSB8IERpZ3JhcGhzIHwgSGV4RmxvYXQgfCBPcGVuQ0wpCitMQU5HU1RBTkRBUkRfQUxJQVNfREVQUihvcGVuY2wxMCwgImNsIikKKworTEFOR1NUQU5EQVJEKG9wZW5jbDExLCAiY2wxLjEiLAorICAgICAgICAgICAgIE9wZW5DTCwgIk9wZW5DTCAxLjEiLAorICAgICAgICAgICAgIExpbmVDb21tZW50IHwgQzk5IHwgRGlncmFwaHMgfCBIZXhGbG9hdCB8IE9wZW5DTCkKK0xBTkdTVEFOREFSRChvcGVuY2wxMiwgImNsMS4yIiwKKyAgICAgICAgICAgICBPcGVuQ0wsICJPcGVuQ0wgMS4yIiwKKyAgICAgICAgICAgICBMaW5lQ29tbWVudCB8IEM5OSB8IERpZ3JhcGhzIHwgSGV4RmxvYXQgfCBPcGVuQ0wpCitMQU5HU1RBTkRBUkQob3BlbmNsMjAsICJjbDIuMCIsCisgICAgICAgICAgICAgT3BlbkNMLCAiT3BlbkNMIDIuMCIsCisgICAgICAgICAgICAgTGluZUNvbW1lbnQgfCBDOTkgfCBEaWdyYXBocyB8IEhleEZsb2F0IHwgT3BlbkNMKQorCitMQU5HU1RBTkRBUkRfQUxJQVNfREVQUihvcGVuY2wxMCwgIkNMIikKK0xBTkdTVEFOREFSRF9BTElBU19ERVBSKG9wZW5jbDExLCAiQ0wxLjEiKQorTEFOR1NUQU5EQVJEX0FMSUFTX0RFUFIob3BlbmNsMTIsICJDTDEuMiIpCitMQU5HU1RBTkRBUkRfQUxJQVNfREVQUihvcGVuY2wyMCwgIkNMMi4wIikKKworLy8gQ1VEQQorTEFOR1NUQU5EQVJEKGN1ZGEsICJjdWRhIiwgQ1VEQSwgIk5WSURJQSBDVURBKHRtKSIsCisgICAgICAgICAgICAgTGluZUNvbW1lbnQgfCBDUGx1c1BsdXMgfCBEaWdyYXBocykKKworI3VuZGVmIExBTkdTVEFOREFSRAorI3VuZGVmIExBTkdTVEFOREFSRF9BTElBUworI3VuZGVmIExBTkdTVEFOREFSRF9BTElBU19ERVBSCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9MYXlvdXRPdmVycmlkZVNvdXJjZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvTGF5b3V0T3ZlcnJpZGVTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmQwMzJiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvTGF5b3V0T3ZlcnJpZGVTb3VyY2UuaApAQCAtMCwwICsxLDYzIEBACisvLz09PS0tLSBMYXlvdXRPdmVycmlkZVNvdXJjZS5oIC0tT3ZlcnJpZGUgUmVjb3JkIExheW91dHMgLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRlJPTlRFTkRfTEFZT1VUT1ZFUlJJREVTT1VSQ0VfSAorI2RlZmluZSBMTFZNX0NMQU5HX0ZST05URU5EX0xBWU9VVE9WRVJSSURFU09VUkNFX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9FeHRlcm5hbEFTVFNvdXJjZS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgLy8vIFxicmllZiBBbiBleHRlcm5hbCBBU1Qgc291cmNlIHRoYXQgb3ZlcnJpZGVzIHRoZSBsYXlvdXQgb2YKKyAgLy8vIGEgc3BlY2lmaWVkIHNldCBvZiByZWNvcmQgdHlwZXMuCisgIC8vLworICAvLy8gVGhpcyBjbGFzcyBpcyB1c2VkIG9ubHkgZm9yIHRlc3RpbmcgdGhlIGFiaWxpdHkgb2YgZXh0ZXJuYWwgQVNUIHNvdXJjZXMKKyAgLy8vIHRvIG92ZXJyaWRlIHRoZSBsYXlvdXQgb2YgcmVjb3JkIHR5cGVzLiBJdHMgaW5wdXQgaXMgdGhlIG91dHB1dCBmb3JtYXQKKyAgLy8vIG9mIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnQgLWZkdW1wLXJlY29yZC1sYXlvdXRzLgorICBjbGFzcyBMYXlvdXRPdmVycmlkZVNvdXJjZSA6IHB1YmxpYyBFeHRlcm5hbEFTVFNvdXJjZSB7CisgICAgLy8vIFxicmllZiBUaGUgbGF5b3V0IG9mIGEgZ2l2ZW4gcmVjb3JkLgorICAgIHN0cnVjdCBMYXlvdXQgeworICAgICAgLy8vIFxicmllZiBUaGUgc2l6ZSBvZiB0aGUgcmVjb3JkLgorICAgICAgdWludDY0X3QgU2l6ZTsKKyAgICAgIAorICAgICAgLy8vIFxicmllZiBUaGUgYWxpZ25tZW50IG9mIHRoZSByZWNvcmQuCisgICAgICB1aW50NjRfdCBBbGlnbjsKKyAgICAgIAorICAgICAgLy8vIFxicmllZiBUaGUgb2Zmc2V0cyBvZiB0aGUgZmllbGRzLCBpbiBzb3VyY2Ugb3JkZXIuCisgICAgICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgOD4gRmllbGRPZmZzZXRzOworICAgIH07CisgICAgCisgICAgLy8vIFxicmllZiBUaGUgc2V0IG9mIGxheW91dHMgdGhhdCB3aWxsIGJlIG92ZXJyaWRkZW4uCisgICAgbGx2bTo6U3RyaW5nTWFwPExheW91dD4gTGF5b3V0czsKKyAgICAKKyAgcHVibGljOgorICAgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbmV3IEFTVCBzb3VyY2UgdGhhdCBvdmVycmlkZXMgdGhlIGxheW91dCBvZiBzb21lCisgICAgLy8vIHNldCBvZiByZWNvcmQgdHlwZXMuCisgICAgLy8vCisgICAgLy8vIFRoZSBmaWxlIGlzIHRoZSByZXN1bHQgb2YgcGFzc2luZyAtZmR1bXAtcmVjb3JkLWxheW91dHMgdG8gYSBmaWxlLgorICAgIGV4cGxpY2l0IExheW91dE92ZXJyaWRlU291cmNlKFN0cmluZ1JlZiBGaWxlbmFtZSk7CisgICAgCisgICAgLy8vIFxicmllZiBJZiB0aGlzIHBhcnRpY3VsYXIgcmVjb3JkIHR5cGUgaGFzIGFuIG92ZXJyaWRkZW4gbGF5b3V0LAorICAgIC8vLyByZXR1cm4gdGhhdCBsYXlvdXQuCisgICAgYm9vbAorICAgIGxheW91dFJlY29yZFR5cGUoY29uc3QgUmVjb3JkRGVjbCAqUmVjb3JkLAorICAgICAgIHVpbnQ2NF90ICZTaXplLCB1aW50NjRfdCAmQWxpZ25tZW50LAorICAgICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IEZpZWxkRGVjbCAqLCB1aW50NjRfdD4gJkZpZWxkT2Zmc2V0cywKKyAgICAgICBsbHZtOjpEZW5zZU1hcDxjb25zdCBDWFhSZWNvcmREZWNsICosIENoYXJVbml0cz4gJkJhc2VPZmZzZXRzLAorICAgICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IENYWFJlY29yZERlY2wgKiwKKyAgICAgICAgICAgICAgICAgICAgICBDaGFyVW5pdHM+ICZWaXJ0dWFsQmFzZU9mZnNldHMpIG92ZXJyaWRlOworICAgIAorICAgIC8vLyBcYnJpZWYgRHVtcCB0aGUgb3ZlcnJpZGRlbiBsYXlvdXRzLgorICAgIHZvaWQgZHVtcCgpOworICB9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0xvZ0RpYWdub3N0aWNQcmludGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Mb2dEaWFnbm9zdGljUHJpbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YWRmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Mb2dEaWFnbm9zdGljUHJpbnRlci5oCkBAIC0wLDAgKzEsODUgQEAKKy8vPT09LS0tIExvZ0RpYWdub3N0aWNQcmludGVyLmggLSBMb2cgRGlhZ25vc3RpYyBDbGllbnQgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19GUk9OVEVORF9MT0dESUFHTk9TVElDUFJJTlRFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfRlJPTlRFTkRfTE9HRElBR05PU1RJQ1BSSU5URVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK2NsYXNzIERpYWdub3N0aWNPcHRpb25zOworY2xhc3MgTGFuZ09wdGlvbnM7CisKK2NsYXNzIExvZ0RpYWdub3N0aWNQcmludGVyIDogcHVibGljIERpYWdub3N0aWNDb25zdW1lciB7CisgIHN0cnVjdCBEaWFnRW50cnkgeworICAgIC8vLyBUaGUgcHJpbWFyeSBtZXNzYWdlIGxpbmUgb2YgdGhlIGRpYWdub3N0aWMuCisgICAgc3RkOjpzdHJpbmcgTWVzc2FnZTsKKyAgCisgICAgLy8vIFRoZSBzb3VyY2UgZmlsZSBuYW1lLCBpZiBhdmFpbGFibGUuCisgICAgc3RkOjpzdHJpbmcgRmlsZW5hbWU7CisgIAorICAgIC8vLyBUaGUgc291cmNlIGZpbGUgbGluZSBudW1iZXIsIGlmIGF2YWlsYWJsZS4KKyAgICB1bnNpZ25lZCBMaW5lOworICAKKyAgICAvLy8gVGhlIHNvdXJjZSBmaWxlIGNvbHVtbiBudW1iZXIsIGlmIGF2YWlsYWJsZS4KKyAgICB1bnNpZ25lZCBDb2x1bW47CisgIAorICAgIC8vLyBUaGUgSUQgb2YgdGhlIGRpYWdub3N0aWMuCisgICAgdW5zaWduZWQgRGlhZ25vc3RpY0lEOworCisgICAgLy8vIFRoZSBPcHRpb24gRmxhZyBmb3IgdGhlIGRpYWdub3N0aWMKKyAgICBzdGQ6OnN0cmluZyBXYXJuaW5nT3B0aW9uOworICAKKyAgICAvLy8gVGhlIGxldmVsIG9mIHRoZSBkaWFnbm9zdGljLgorICAgIERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBEaWFnbm9zdGljTGV2ZWw7CisgIH07CisKKyAgdm9pZCBFbWl0RGlhZ0VudHJ5KGxsdm06OnJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZ0RpYWdub3N0aWNQcmludGVyOjpEaWFnRW50cnkgJkRFKTsKKworICAvLyBDb25kaXRpb25hbCBvd25lcnNoaXAgKHdoZW4gU3RyZWFtT3duZXIgaXMgbm9uLW51bGwsIGl0J3Mga2VlcGluZyBPUworICAvLyBhbGl2ZSkuIFdlIG1pZ2h0IHdhbnQgdG8gcmVwbGFjZSB0aGlzIHdpdGggYSB3cmFwcGVyIGZvciBjb25kaXRpb25hbAorICAvLyBvd25lcnNoaXAgZXZlbnR1YWxseSAtIGl0IHNlZW1zIHRvIHBvcCB1cCBvZnRlbiBlbm91Z2guCisgIHJhd19vc3RyZWFtICZPUzsKKyAgc3RkOjp1bmlxdWVfcHRyPHJhd19vc3RyZWFtPiBTdHJlYW1Pd25lcjsKKyAgY29uc3QgTGFuZ09wdGlvbnMgKkxhbmdPcHRzOworICBJbnRydXNpdmVSZWZDbnRQdHI8RGlhZ25vc3RpY09wdGlvbnM+IERpYWdPcHRzOworCisgIFNvdXJjZUxvY2F0aW9uIExhc3RXYXJuaW5nTG9jOworICBGdWxsU291cmNlTG9jIExhc3RMb2M7CisKKyAgU21hbGxWZWN0b3I8RGlhZ0VudHJ5LCA4PiBFbnRyaWVzOworCisgIHN0ZDo6c3RyaW5nIE1haW5GaWxlbmFtZTsKKyAgc3RkOjpzdHJpbmcgRHdhcmZEZWJ1Z0ZsYWdzOworCitwdWJsaWM6CisgIExvZ0RpYWdub3N0aWNQcmludGVyKHJhd19vc3RyZWFtICZPUywgRGlhZ25vc3RpY09wdGlvbnMgKkRpYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8cmF3X29zdHJlYW0+IFN0cmVhbU93bmVyKTsKKworICB2b2lkIHNldER3YXJmRGVidWdGbGFncyhTdHJpbmdSZWYgVmFsdWUpIHsKKyAgICBEd2FyZkRlYnVnRmxhZ3MgPSBWYWx1ZTsKKyAgfQorCisgIHZvaWQgQmVnaW5Tb3VyY2VGaWxlKGNvbnN0IExhbmdPcHRpb25zICZMTywgY29uc3QgUHJlcHJvY2Vzc29yICpQUCkgb3ZlcnJpZGUgeworICAgIExhbmdPcHRzID0gJkxPOworICB9CisKKyAgdm9pZCBFbmRTb3VyY2VGaWxlKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBIYW5kbGVEaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBEaWFnTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljICZJbmZvKSBvdmVycmlkZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL01pZ3JhdG9yT3B0aW9ucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvTWlncmF0b3JPcHRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViNzFiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL01pZ3JhdG9yT3B0aW9ucy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vPT09LS0tIE1pZ3JhdG9yT3B0aW9ucy5oIC0gTWlncmF0b3JPcHRpb25zIE9wdGlvbnMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgY29udGFpbnMgdGhlIHN0cnVjdHVyZXMgbmVjZXNzYXJ5IGZvciBhIGZyb250LWVuZCB0byBzcGVjaWZ5CisvLyB2YXJpb3VzIG1pZ3JhdGlvbiBhbmFseXNpcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRlJPTlRFTkRfTUlHUkFUT1JPUFRJT05TX0gKKyNkZWZpbmUgTExWTV9DTEFOR19GUk9OVEVORF9NSUdSQVRPUk9QVElPTlNfSAorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBNaWdyYXRvck9wdGlvbnMgeworcHVibGljOgorICB1bnNpZ25lZCBOb05TQWxsb2NSZWFsbG9jRXJyb3IgOiAxOworICB1bnNpZ25lZCBOb0ZpbmFsaXplUmVtb3ZhbCA6IDE7CisgIE1pZ3JhdG9yT3B0aW9ucygpIHsKKyAgICBOb05TQWxsb2NSZWFsbG9jRXJyb3IgPSAwOworICAgIE5vRmluYWxpemVSZW1vdmFsID0gMDsKKyAgfQorfTsKKworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9NdWx0aXBsZXhDb25zdW1lci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvTXVsdGlwbGV4Q29uc3VtZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTM1NjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvTXVsdGlwbGV4Q29uc3VtZXIuaApAQCAtMCwwICsxLDY3IEBACisvLz09PS0tIE11bHRpcGxleENvbnN1bWVyLmggLSBBU1QgQ29uc3VtZXIgZm9yIFBDSCBHZW5lcmF0aW9uIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE11bHRpcGxleENvbnN1bWVyIGNsYXNzLCB3aGljaCBjYW4gYmUgdXNlZCB0bworLy8gIG11bHRpcGxleCBBU1RDb25zdW1lciBhbmQgU2VtYUNvbnN1bWVyIG1lc3NhZ2VzIHRvIG1hbnkgY29uc3VtZXJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19GUk9OVEVORF9NVUxUSVBMRVhDT05TVU1FUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfRlJPTlRFTkRfTVVMVElQTEVYQ09OU1VNRVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL1NlbWEvU2VtYUNvbnN1bWVyLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgTXVsdGlwbGV4QVNUTXV0YXRpb25MaXN0ZW5lcjsKK2NsYXNzIE11bHRpcGxleEFTVERlc2VyaWFsaXphdGlvbkxpc3RlbmVyOworCisvLyBIYXMgYSBsaXN0IG9mIEFTVENvbnN1bWVycyBhbmQgY2FsbHMgZWFjaCBvZiB0aGVtLiBPd25zIGl0cyBjaGlsZHJlbi4KK2NsYXNzIE11bHRpcGxleENvbnN1bWVyIDogcHVibGljIFNlbWFDb25zdW1lciB7CitwdWJsaWM6CisgIC8vIFRha2VzIG93bmVyc2hpcCBvZiB0aGUgcG9pbnRlcnMgaW4gQy4KKyAgTXVsdGlwbGV4Q29uc3VtZXIoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPj4gQyk7CisgIH5NdWx0aXBsZXhDb25zdW1lcigpIG92ZXJyaWRlOworCisgIC8vIEFTVENvbnN1bWVyCisgIHZvaWQgSW5pdGlhbGl6ZShBU1RDb250ZXh0ICZDb250ZXh0KSBvdmVycmlkZTsKKyAgdm9pZCBIYW5kbGVDWFhTdGF0aWNNZW1iZXJWYXJJbnN0YW50aWF0aW9uKFZhckRlY2wgKlZEKSBvdmVycmlkZTsKKyAgYm9vbCBIYW5kbGVUb3BMZXZlbERlY2woRGVjbEdyb3VwUmVmIEQpIG92ZXJyaWRlOworICB2b2lkIEhhbmRsZUlubGluZUZ1bmN0aW9uRGVmaW5pdGlvbihGdW5jdGlvbkRlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIEhhbmRsZUludGVyZXN0aW5nRGVjbChEZWNsR3JvdXBSZWYgRCkgb3ZlcnJpZGU7CisgIHZvaWQgSGFuZGxlVHJhbnNsYXRpb25Vbml0KEFTVENvbnRleHQgJkN0eCkgb3ZlcnJpZGU7CisgIHZvaWQgSGFuZGxlVGFnRGVjbERlZmluaXRpb24oVGFnRGVjbCAqRCkgb3ZlcnJpZGU7CisgIHZvaWQgSGFuZGxlVGFnRGVjbFJlcXVpcmVkRGVmaW5pdGlvbihjb25zdCBUYWdEZWNsICpEKSBvdmVycmlkZTsKKyAgdm9pZCBIYW5kbGVDWFhJbXBsaWNpdEZ1bmN0aW9uSW5zdGFudGlhdGlvbihGdW5jdGlvbkRlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIEhhbmRsZVRvcExldmVsRGVjbEluT2JqQ0NvbnRhaW5lcihEZWNsR3JvdXBSZWYgRCkgb3ZlcnJpZGU7CisgIHZvaWQgSGFuZGxlSW1wbGljaXRJbXBvcnREZWNsKEltcG9ydERlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIENvbXBsZXRlVGVudGF0aXZlRGVmaW5pdGlvbihWYXJEZWNsICpEKSBvdmVycmlkZTsKKyAgdm9pZCBBc3NpZ25Jbmhlcml0YW5jZU1vZGVsKENYWFJlY29yZERlY2wgKlJEKSBvdmVycmlkZTsKKyAgdm9pZCBIYW5kbGVWVGFibGUoQ1hYUmVjb3JkRGVjbCAqUkQpIG92ZXJyaWRlOworICBBU1RNdXRhdGlvbkxpc3RlbmVyICpHZXRBU1RNdXRhdGlvbkxpc3RlbmVyKCkgb3ZlcnJpZGU7CisgIEFTVERlc2VyaWFsaXphdGlvbkxpc3RlbmVyICpHZXRBU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lcigpIG92ZXJyaWRlOworICB2b2lkIFByaW50U3RhdHMoKSBvdmVycmlkZTsKKyAgYm9vbCBzaG91bGRTa2lwRnVuY3Rpb25Cb2R5KERlY2wgKkQpIG92ZXJyaWRlOworCisgIC8vIFNlbWFDb25zdW1lcgorICB2b2lkIEluaXRpYWxpemVTZW1hKFNlbWEgJlMpIG92ZXJyaWRlOworICB2b2lkIEZvcmdldFNlbWEoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPj4gQ29uc3VtZXJzOyAvLyBPd25zIHRoZXNlLgorICBzdGQ6OnVuaXF1ZV9wdHI8TXVsdGlwbGV4QVNUTXV0YXRpb25MaXN0ZW5lcj4gTXV0YXRpb25MaXN0ZW5lcjsKKyAgc3RkOjp1bmlxdWVfcHRyPE11bHRpcGxleEFTVERlc2VyaWFsaXphdGlvbkxpc3RlbmVyPiBEZXNlcmlhbGl6YXRpb25MaXN0ZW5lcjsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9QQ0hDb250YWluZXJPcGVyYXRpb25zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9QQ0hDb250YWluZXJPcGVyYXRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhNzM1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1BDSENvbnRhaW5lck9wZXJhdGlvbnMuaApAQCAtMCwwICsxLDExOSBAQAorLy89PT0tLS0gRnJvbnRlbmQvUENIQ29udGFpbmVyT3BlcmF0aW9ucy5oIC0gUENIIENvbnRhaW5lcnMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1BDSF9DT05UQUlORVJfT1BFUkFUSU9OU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfUENIX0NPTlRBSU5FUl9PUEVSQVRJT05TX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgcmF3X3B3cml0ZV9zdHJlYW07Cit9CisKK3VzaW5nIGxsdm06OlN0cmluZ1JlZjsKKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQVNUQ29uc3VtZXI7CitjbGFzcyBDb2RlR2VuT3B0aW9uczsKK2NsYXNzIERpYWdub3N0aWNzRW5naW5lOworY2xhc3MgQ29tcGlsZXJJbnN0YW5jZTsKKworc3RydWN0IFBDSEJ1ZmZlciB7CisgIEFTVEZpbGVTaWduYXR1cmUgU2lnbmF0dXJlOworICBsbHZtOjpTbWFsbFZlY3RvcjxjaGFyLCAwPiBEYXRhOworICBib29sIElzQ29tcGxldGU7Cit9OworICAKKy8vLyBUaGlzIGFic3RyYWN0IGludGVyZmFjZSBwcm92aWRlcyBvcGVyYXRpb25zIGZvciBjcmVhdGluZworLy8vIGNvbnRhaW5lcnMgZm9yIHNlcmlhbGl6ZWQgQVNUcyAocHJlY29tcGlsZWQgaGVhZGVycyBhbmQgY2xhbmcKKy8vLyBtb2R1bGVzKS4KK2NsYXNzIFBDSENvbnRhaW5lcldyaXRlciB7CitwdWJsaWM6IAorICB2aXJ0dWFsIH5QQ0hDb250YWluZXJXcml0ZXIoKSA9IDA7CisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldEZvcm1hdCgpIGNvbnN0ID0gMDsKKworICAvLy8gUmV0dXJuIGFuIEFTVENvbnN1bWVyIHRoYXQgY2FuIGJlIGNoYWluZWQgd2l0aCBhCisgIC8vLyBQQ0hHZW5lcmF0b3IgdGhhdCBwcm9kdWNlcyBhIHdyYXBwZXIgZmlsZSBmb3JtYXQgY29udGFpbmluZyBhCisgIC8vLyBzZXJpYWxpemVkIEFTVCBiaXRzdHJlYW0uCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPgorICBDcmVhdGVQQ0hDb250YWluZXJHZW5lcmF0b3IoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmTWFpbkZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk91dHB1dEZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGxsdm06OnJhd19wd3JpdGVfc3RyZWFtPiBPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQQ0hCdWZmZXI+IEJ1ZmZlcikgY29uc3QgPSAwOworfTsKKworLy8vIFRoaXMgYWJzdHJhY3QgaW50ZXJmYWNlIHByb3ZpZGVzIG9wZXJhdGlvbnMgZm9yIHVud3JhcHBpbmcKKy8vLyBjb250YWluZXJzIGZvciBzZXJpYWxpemVkIEFTVHMgKHByZWNvbXBpbGVkIGhlYWRlcnMgYW5kIGNsYW5nCisvLy8gbW9kdWxlcykuCitjbGFzcyBQQ0hDb250YWluZXJSZWFkZXIgeworcHVibGljOiAKKyAgdmlydHVhbCB+UENIQ29udGFpbmVyUmVhZGVyKCkgPSAwOworICAvLy8gRXF1aXZhbGVudCB0byB0aGUgZm9ybWF0IHBhc3NlZCB0byAtZm1vZHVsZS1mb3JtYXQ9CisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldEZvcm1hdCgpIGNvbnN0ID0gMDsKKworICAvLy8gUmV0dXJucyB0aGUgc2VyaWFsaXplZCBBU1QgaW5zaWRlIHRoZSBQQ0ggY29udGFpbmVyIEJ1ZmZlci4KKyAgdmlydHVhbCBTdHJpbmdSZWYgRXh0cmFjdFBDSChsbHZtOjpNZW1vcnlCdWZmZXJSZWYgQnVmZmVyKSBjb25zdCA9IDA7Cit9OworCisvLy8gSW1wbGVtZW50cyB3cml0ZSBvcGVyYXRpb25zIGZvciBhIHJhdyBwYXNzLXRocm91Z2ggUENIIGNvbnRhaW5lci4KK2NsYXNzIFJhd1BDSENvbnRhaW5lcldyaXRlciA6IHB1YmxpYyBQQ0hDb250YWluZXJXcml0ZXIgeworICBTdHJpbmdSZWYgZ2V0Rm9ybWF0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gInJhdyI7IH0KKworICAvLy8gUmV0dXJuIGFuIEFTVENvbnN1bWVyIHRoYXQgY2FuIGJlIGNoYWluZWQgd2l0aCBhCisgIC8vLyBQQ0hHZW5lcmF0b3IgdGhhdCB3cml0ZXMgdGhlIG1vZHVsZSB0byBhIGZsYXQgZmlsZS4KKyAgc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPgorICBDcmVhdGVQQ0hDb250YWluZXJHZW5lcmF0b3IoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmTWFpbkZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk91dHB1dEZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGxsdm06OnJhd19wd3JpdGVfc3RyZWFtPiBPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQQ0hCdWZmZXI+IEJ1ZmZlcikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gSW1wbGVtZW50cyByZWFkIG9wZXJhdGlvbnMgZm9yIGEgcmF3IHBhc3MtdGhyb3VnaCBQQ0ggY29udGFpbmVyLgorY2xhc3MgUmF3UENIQ29udGFpbmVyUmVhZGVyIDogcHVibGljIFBDSENvbnRhaW5lclJlYWRlciB7CisgIFN0cmluZ1JlZiBnZXRGb3JtYXQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAicmF3IjsgfQorCisgIC8vLyBTaW1wbHkgcmV0dXJucyB0aGUgYnVmZmVyIGNvbnRhaW5lZCBpbiBCdWZmZXIuCisgIFN0cmluZ1JlZiBFeHRyYWN0UENIKGxsdm06Ok1lbW9yeUJ1ZmZlclJlZiBCdWZmZXIpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vIEEgcmVnaXN0cnkgb2YgUENIQ29udGFpbmVyV3JpdGVyIGFuZCAtUmVhZGVyIG9iamVjdHMgZm9yIGRpZmZlcmVudCBmb3JtYXRzLgorY2xhc3MgUENIQ29udGFpbmVyT3BlcmF0aW9ucyB7CisgIGxsdm06OlN0cmluZ01hcDxzdGQ6OnVuaXF1ZV9wdHI8UENIQ29udGFpbmVyV3JpdGVyPj4gV3JpdGVyczsKKyAgbGx2bTo6U3RyaW5nTWFwPHN0ZDo6dW5pcXVlX3B0cjxQQ0hDb250YWluZXJSZWFkZXI+PiBSZWFkZXJzOworcHVibGljOgorICAvLy8gQXV0b21hdGljYWxseSByZWdpc3RlcnMgYSBSYXdQQ0hDb250YWluZXJXcml0ZXIgYW5kCisgIC8vLyBSYXdQQ0hDb250YWluZXJSZWFkZXIuCisgIFBDSENvbnRhaW5lck9wZXJhdGlvbnMoKTsKKyAgdm9pZCByZWdpc3RlcldyaXRlcihzdGQ6OnVuaXF1ZV9wdHI8UENIQ29udGFpbmVyV3JpdGVyPiBXcml0ZXIpIHsKKyAgICBXcml0ZXJzW1dyaXRlci0+Z2V0Rm9ybWF0KCldID0gc3RkOjptb3ZlKFdyaXRlcik7CisgIH0KKyAgdm9pZCByZWdpc3RlclJlYWRlcihzdGQ6OnVuaXF1ZV9wdHI8UENIQ29udGFpbmVyUmVhZGVyPiBSZWFkZXIpIHsKKyAgICBSZWFkZXJzW1JlYWRlci0+Z2V0Rm9ybWF0KCldID0gc3RkOjptb3ZlKFJlYWRlcik7CisgIH0gIAorICBjb25zdCBQQ0hDb250YWluZXJXcml0ZXIgKmdldFdyaXRlck9yTnVsbChTdHJpbmdSZWYgRm9ybWF0KSB7CisgICAgcmV0dXJuIFdyaXRlcnNbRm9ybWF0XS5nZXQoKTsKKyAgfQorICBjb25zdCBQQ0hDb250YWluZXJSZWFkZXIgKmdldFJlYWRlck9yTnVsbChTdHJpbmdSZWYgRm9ybWF0KSB7CisgICAgcmV0dXJuIFJlYWRlcnNbRm9ybWF0XS5nZXQoKTsKKyAgfQorICBjb25zdCBQQ0hDb250YWluZXJSZWFkZXIgJmdldFJhd1JlYWRlcigpIHsKKyAgICByZXR1cm4gKmdldFJlYWRlck9yTnVsbCgicmF3Iik7CisgIH0KK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9QcmVjb21waWxlZFByZWFtYmxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9QcmVjb21waWxlZFByZWFtYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4ZmI4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1ByZWNvbXBpbGVkUHJlYW1ibGUuaApAQCAtMCwwICsxLDMxMCBAQAorLy89PT0tLS0gUHJlY29tcGlsZWRQcmVhbWJsZS5oIC0gQnVpbGQgcHJlY29tcGlsZWQgcHJlYW1ibGVzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBIZWxwZXIgY2xhc3MgdG8gYnVpbGQgcHJlY29tcGlsZWQgcHJlYW1ibGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0ZST05URU5EX1BSRUNPTVBJTEVEX1BSRUFNQkxFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19GUk9OVEVORF9QUkVDT01QSUxFRF9QUkVBTUJMRV9ICisKKyNpbmNsdWRlICJjbGFuZy9MZXgvTGV4ZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9MZXgvUHJlcHJvY2Vzc29yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsaWduT2YuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTUQ1LmgiCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNZW1vcnlCdWZmZXI7Cit9CisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgdmZzIHsKK2NsYXNzIEZpbGVTeXN0ZW07Cit9CisKK2NsYXNzIENvbXBpbGVySW5zdGFuY2U7CitjbGFzcyBDb21waWxlckludm9jYXRpb247CitjbGFzcyBEZWNsR3JvdXBSZWY7CitjbGFzcyBQQ0hDb250YWluZXJPcGVyYXRpb25zOworCisvLy8gXGJyaWVmIFJ1bnMgbGV4ZXIgdG8gY29tcHV0ZSBzdWdnZXN0ZWQgcHJlYW1ibGUgYm91bmRzLgorUHJlYW1ibGVCb3VuZHMgQ29tcHV0ZVByZWFtYmxlQm91bmRzKGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpNZW1vcnlCdWZmZXIgKkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXhMaW5lcyk7CisKK2NsYXNzIFByZWFtYmxlQ2FsbGJhY2tzOworCisvLy8gQSBjbGFzcyBob2xkaW5nIGEgUENIIGFuZCBhbGwgaW5mb3JtYXRpb24gdG8gY2hlY2sgd2hldGhlciBpdCBpcyB2YWxpZCB0bworLy8vIHJldXNlIHRoZSBQQ0ggZm9yIHRoZSBzdWJzZXF1ZW50IHJ1bnMuIFVzZSBCdWlsZFByZWFtYmxlIHRvIGNyZWF0ZSBQQ0ggYW5kCisvLy8gQ2FuUmV1c2VQcmVhbWJsZSArIEFkZEltcGxpY2l0UHJlYW1ibGUgdG8gbWFrZSB1c2Ugb2YgaXQuCitjbGFzcyBQcmVjb21waWxlZFByZWFtYmxlIHsKKyAgY2xhc3MgUENIU3RvcmFnZTsKKyAgc3RydWN0IFByZWFtYmxlRmlsZUhhc2g7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBUcnkgdG8gYnVpbGQgUHJlY29tcGlsZWRQcmVhbWJsZSBmb3IgXHAgSW52b2NhdGlvbi4gU2VlCisgIC8vLyBCdWlsZFByZWFtYmxlRXJyb3IgZm9yIHBvc3NpYmxlIGVycm9yIGNvZGVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJbnZvY2F0aW9uIE9yaWdpbmFsIENvbXBpbGVySW52b2NhdGlvbiB3aXRoIG9wdGlvbnMgdG8gY29tcGlsZSB0aGUKKyAgLy8vIGZpbGUuCisgIC8vLworICAvLy8gXHBhcmFtIE1haW5GaWxlQnVmZmVyIEJ1ZmZlciB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgbWFpbiBmaWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBCb3VuZHMgQm91bmRzIG9mIHRoZSBwcmVhbWJsZSwgcmVzdWx0IG9mIGNhbGxpbmcKKyAgLy8vIENvbXB1dGVQcmVhbWJsZUJvdW5kcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gRGlhZ25vc3RpY3MgRGlhZ25vc3RpY3MgZW5naW5lIHRvIGJlIHVzZWQgd2hpbGUgYnVpbGRpbmcgdGhlCisgIC8vLyBwcmVhbWJsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gVkZTIEFuIGluc3RhbmNlIG9mIHZmczo6RmlsZVN5c3RlbSB0byBiZSB1c2VkIGZvciBmaWxlCisgIC8vLyBhY2Nlc3Nlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gUENIQ29udGFpbmVyT3BzIEFuIGluc3RhbmNlIG9mIFBDSENvbnRhaW5lck9wZXJhdGlvbnMuCisgIC8vLworICAvLy8gXHBhcmFtIFN0b3JlSW5NZW1vcnkgU3RvcmUgUENIIGluIG1lbW9yeS4gSWYgZmFsc2UsIFBDSCB3aWxsIGJlIHN0b3JlZCBpbgorICAvLy8gYSB0ZW1wb3JhcnkgZmlsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ2FsbGJhY2tzIEEgc2V0IG9mIGNhbGxiYWNrcyB0byBiZSBleGVjdXRlZCB3aGVuIGJ1aWxkaW5nCisgIC8vLyB0aGUgcHJlYW1ibGUuCisgIHN0YXRpYyBsbHZtOjpFcnJvck9yPFByZWNvbXBpbGVkUHJlYW1ibGU+CisgIEJ1aWxkKGNvbnN0IENvbXBpbGVySW52b2NhdGlvbiAmSW52b2NhdGlvbiwKKyAgICAgICAgY29uc3QgbGx2bTo6TWVtb3J5QnVmZmVyICpNYWluRmlsZUJ1ZmZlciwgUHJlYW1ibGVCb3VuZHMgQm91bmRzLAorICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ25vc3RpY3MsIEludHJ1c2l2ZVJlZkNudFB0cjx2ZnM6OkZpbGVTeXN0ZW0+IFZGUywKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBDSENvbnRhaW5lck9wZXJhdGlvbnM+IFBDSENvbnRhaW5lck9wcywKKyAgICAgICAgYm9vbCBTdG9yZUluTWVtb3J5LCBQcmVhbWJsZUNhbGxiYWNrcyAmQ2FsbGJhY2tzKTsKKworICBQcmVjb21waWxlZFByZWFtYmxlKFByZWNvbXBpbGVkUHJlYW1ibGUgJiYpID0gZGVmYXVsdDsKKyAgUHJlY29tcGlsZWRQcmVhbWJsZSAmb3BlcmF0b3I9KFByZWNvbXBpbGVkUHJlYW1ibGUgJiYpID0gZGVmYXVsdDsKKworICAvLy8gUHJlYW1ibGVCb3VuZHMgdXNlZCB0byBidWlsZCB0aGUgcHJlYW1ibGUuCisgIFByZWFtYmxlQm91bmRzIGdldEJvdW5kcygpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBzaXplLCBpbiBieXRlcywgdGhhdCBwcmVhbWJsZSB0YWtlcyBvbiBkaXNrIG9yIGluIG1lbW9yeS4KKyAgLy8vIEZvciBvbi1kaXNrIHByZWFtYmxlcyByZXR1cm5zIDAgaWYgZmlsZXN5c3RlbSBvcGVyYXRpb25zIGZhaWwuIEludGVuZGVkIHRvCisgIC8vLyBiZSB1c2VkIGZvciBsb2dnaW5nIGFuZCBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4KKyAgc3RkOjpzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0OworCisgIC8vLyBDaGVjayB3aGV0aGVyIFByZWNvbXBpbGVkUHJlYW1ibGUgY2FuIGJlIHJldXNlZCBmb3IgdGhlIG5ldyBjb250ZW50cyhccAorICAvLy8gTWFpbkZpbGVCdWZmZXIpIG9mIHRoZSBtYWluIGZpbGUuCisgIGJvb2wgQ2FuUmV1c2UoY29uc3QgQ29tcGlsZXJJbnZvY2F0aW9uICZJbnZvY2F0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Ok1lbW9yeUJ1ZmZlciAqTWFpbkZpbGVCdWZmZXIsIFByZWFtYmxlQm91bmRzIEJvdW5kcywKKyAgICAgICAgICAgICAgICB2ZnM6OkZpbGVTeXN0ZW0gKlZGUykgY29uc3Q7CisKKyAgLy8vIENoYW5nZXMgb3B0aW9ucyBpbnNpZGUgXHAgQ0kgdG8gdXNlIFBDSCBmcm9tIHRoaXMgcHJlYW1ibGUuIEFsc28gcmVtYXBzCisgIC8vLyBtYWluIGZpbGUgdG8gXHAgTWFpbkZpbGVCdWZmZXIgYW5kIHVwZGF0ZXMgXHAgVkZTIHRvIGVuc3VyZSB0aGUgcHJlYW1ibGUKKyAgLy8vIGlzIGFjY2Vzc2libGUuCisgIC8vLyBSZXF1aXJlcyB0aGF0IENhblJldXNlKCkgaXMgdHJ1ZS4KKyAgLy8vIEZvciBpbi1tZW1vcnkgcHJlYW1ibGVzLCBQcmVjb21waWxlZFByZWFtYmxlIGluc3RhbmNlIGNvbnRpbnVlcyB0byBvd24gdGhlCisgIC8vLyBNZW1vcnlCdWZmZXIgd2l0aCB0aGUgUHJlYW1ibGUgYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy4gVGhlIGNhbGxlciBpcworICAvLy8gcmVwb25zaWJsZSBmb3IgbWFraW5nIHN1cmUgdGhlIFByZWNvbXBpbGVkUHJlYW1ibGUgaW5zdGFuY2Ugb3V0bGl2ZXMgdGhlCisgIC8vLyBjb21waWxlciBydW4gYW5kIHRoZSBBU1QgdGhhdCB3aWxsIGJlIHVzaW5nIHRoZSBQQ0guCisgIHZvaWQgQWRkSW1wbGljaXRQcmVhbWJsZShDb21waWxlckludm9jYXRpb24gJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cnVzaXZlUmVmQ250UHRyPHZmczo6RmlsZVN5c3RlbT4gJlZGUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Ok1lbW9yeUJ1ZmZlciAqTWFpbkZpbGVCdWZmZXIpIGNvbnN0OworCisgIC8vLyBDb25maWd1cmUgXHAgQ0kgdG8gdXNlIHRoaXMgcHJlYW1ibGUuCisgIC8vLyBMaWtlIEFkZEltcGxpY2l0UHJlYW1ibGUsIGJ1dCBkb2Vzbid0IGFzc3VtZSBDYW5SZXVzZSgpIGlzIHRydWUuCisgIC8vLyBJZiB0aGlzIHByZWFtYmxlIGRvZXMgbm90IG1hdGNoIHRoZSBmaWxlLCBpdCBtYXkgcGFyc2UgZGlmZmVyZW50bHkuCisgIHZvaWQgT3ZlcnJpZGVQcmVhbWJsZShDb21waWxlckludm9jYXRpb24gJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgSW50cnVzaXZlUmVmQ250UHRyPHZmczo6RmlsZVN5c3RlbT4gJlZGUywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Ok1lbW9yeUJ1ZmZlciAqTWFpbkZpbGVCdWZmZXIpIGNvbnN0OworCitwcml2YXRlOgorICBQcmVjb21waWxlZFByZWFtYmxlKFBDSFN0b3JhZ2UgU3RvcmFnZSwgc3RkOjp2ZWN0b3I8Y2hhcj4gUHJlYW1ibGVCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIFByZWFtYmxlRW5kc0F0U3RhcnRPZkxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nTWFwPFByZWFtYmxlRmlsZUhhc2g+IEZpbGVzSW5QcmVhbWJsZSk7CisKKyAgLy8vIEEgdGVtcCBmaWxlIHRoYXQgd291bGQgYmUgZGVsZXRlZCBvbiBkZXN0cnVjdG9yIGNhbGwuIElmIGRlc3RydWN0b3IgaXMgbm90CisgIC8vLyBjYWxsZWQgZm9yIGFueSByZWFzb24sIHRoZSBmaWxlIHdpbGwgYmUgZGVsZXRlZCBhdCBzdGF0aWMgb2JqZWN0cycKKyAgLy8vIGRlc3RydWN0aW9uLgorICAvLy8gQW4gYXNzZXJ0aW9uIHdpbGwgZmlyZSBpZiB0d28gVGVtcFBDSEZpbGVzIGFyZSBjcmVhdGVkIHdpdGggdGhlIHNhbWUgbmFtZSwKKyAgLy8vIHNvIGl0J3Mgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgb3V0c2lkZSBwcmVhbWJsZS1oYW5kbGluZy4KKyAgY2xhc3MgVGVtcFBDSEZpbGUgeworICBwdWJsaWM6CisgICAgLy8gQSBtYWluIG1ldGhvZCB1c2VkIHRvIGNvbnN0cnVjdCBUZW1wUENIRmlsZS4KKyAgICBzdGF0aWMgbGx2bTo6RXJyb3JPcjxUZW1wUENIRmlsZT4gQ3JlYXRlTmV3UHJlYW1ibGVQQ0hGaWxlKCk7CisKKyAgICAvLy8gQ2FsbCBsbHZtOjpzeXM6OmZzOjpjcmVhdGVUZW1wb3JhcnlGaWxlIHRvIGNyZWF0ZSBhIG5ldyB0ZW1wb3JhcnkgZmlsZS4KKyAgICBzdGF0aWMgbGx2bTo6RXJyb3JPcjxUZW1wUENIRmlsZT4gY3JlYXRlSW5TeXN0ZW1UZW1wRGlyKGNvbnN0IFR3aW5lICZQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU3VmZml4KTsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIFRlbXBvcmFyeUZpbGUgZm9yIGZpbGUgYXQgXHAgUGF0aC4gVXNlIHdpdGgKKyAgICAvLy8gZXh0cmVtZSBjYXV0aW9uLCB0aGVyZSdzIGFuIGFzc2VydGlvbiBjaGVja2luZyB0aGF0IHRoZXJlJ3Mgb25seSBhCisgICAgLy8vIHNpbmdsZSBpbnN0YW5jZSBvZiBUZW1wUENIRmlsZSBhbGl2ZSBmb3IgZWFjaCBwYXRoLgorICAgIHN0YXRpYyBsbHZtOjpFcnJvck9yPFRlbXBQQ0hGaWxlPiBjcmVhdGVGcm9tQ3VzdG9tUGF0aChjb25zdCBUd2luZSAmUGF0aCk7CisKKyAgcHJpdmF0ZToKKyAgICBUZW1wUENIRmlsZShzdGQ6OnN0cmluZyBGaWxlUGF0aCk7CisKKyAgcHVibGljOgorICAgIFRlbXBQQ0hGaWxlKFRlbXBQQ0hGaWxlICYmT3RoZXIpOworICAgIFRlbXBQQ0hGaWxlICZvcGVyYXRvcj0oVGVtcFBDSEZpbGUgJiZPdGhlcik7CisKKyAgICBUZW1wUENIRmlsZShjb25zdCBUZW1wUENIRmlsZSAmKSA9IGRlbGV0ZTsKKyAgICB+VGVtcFBDSEZpbGUoKTsKKworICAgIC8vLyBBIHBhdGggd2hlcmUgdGVtcG9yYXJ5IGZpbGUgaXMgc3RvcmVkLgorICAgIGxsdm06OlN0cmluZ1JlZiBnZXRGaWxlUGF0aCgpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgdm9pZCBSZW1vdmVGaWxlSWZQcmVzZW50KCk7CisKKyAgcHJpdmF0ZToKKyAgICBsbHZtOjpPcHRpb25hbDxzdGQ6OnN0cmluZz4gRmlsZVBhdGg7CisgIH07CisKKyAgY2xhc3MgSW5NZW1vcnlQcmVhbWJsZSB7CisgIHB1YmxpYzoKKyAgICBzdGQ6OnN0cmluZyBEYXRhOworICB9OworCisgIGNsYXNzIFBDSFN0b3JhZ2UgeworICBwdWJsaWM6CisgICAgZW51bSBjbGFzcyBLaW5kIHsgRW1wdHksIEluTWVtb3J5LCBUZW1wRmlsZSB9OworCisgICAgUENIU3RvcmFnZSgpID0gZGVmYXVsdDsKKyAgICBQQ0hTdG9yYWdlKFRlbXBQQ0hGaWxlIEZpbGUpOworICAgIFBDSFN0b3JhZ2UoSW5NZW1vcnlQcmVhbWJsZSBNZW1vcnkpOworCisgICAgUENIU3RvcmFnZShjb25zdCBQQ0hTdG9yYWdlICYpID0gZGVsZXRlOworICAgIFBDSFN0b3JhZ2UgJm9wZXJhdG9yPShjb25zdCBQQ0hTdG9yYWdlICYpID0gZGVsZXRlOworCisgICAgUENIU3RvcmFnZShQQ0hTdG9yYWdlICYmT3RoZXIpOworICAgIFBDSFN0b3JhZ2UgJm9wZXJhdG9yPShQQ0hTdG9yYWdlICYmT3RoZXIpOworCisgICAgflBDSFN0b3JhZ2UoKTsKKworICAgIEtpbmQgZ2V0S2luZCgpIGNvbnN0OworCisgICAgVGVtcFBDSEZpbGUgJmFzRmlsZSgpOworICAgIGNvbnN0IFRlbXBQQ0hGaWxlICZhc0ZpbGUoKSBjb25zdDsKKworICAgIEluTWVtb3J5UHJlYW1ibGUgJmFzTWVtb3J5KCk7CisgICAgY29uc3QgSW5NZW1vcnlQcmVhbWJsZSAmYXNNZW1vcnkoKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIHZvaWQgZGVzdHJveSgpOworICAgIHZvaWQgc2V0RW1wdHkoKTsKKworICBwcml2YXRlOgorICAgIEtpbmQgU3RvcmFnZUtpbmQgPSBLaW5kOjpFbXB0eTsKKyAgICBsbHZtOjpBbGlnbmVkQ2hhckFycmF5VW5pb248VGVtcFBDSEZpbGUsIEluTWVtb3J5UHJlYW1ibGU+IFN0b3JhZ2UgPSB7fTsKKyAgfTsKKworICAvLy8gRGF0YSB1c2VkIHRvIGRldGVybWluZSBpZiBhIGZpbGUgdXNlZCBpbiB0aGUgcHJlYW1ibGUgaGFzIGJlZW4gY2hhbmdlZC4KKyAgc3RydWN0IFByZWFtYmxlRmlsZUhhc2ggeworICAgIC8vLyBBbGwgZmlsZXMgaGF2ZSBzaXplIHNldC4KKyAgICBvZmZfdCBTaXplID0gMDsKKworICAgIC8vLyBNb2RpZmljYXRpb24gdGltZSBpcyBzZXQgZm9yIGZpbGVzIHRoYXQgYXJlIG9uIGRpc2suICBGb3IgbWVtb3J5CisgICAgLy8vIGJ1ZmZlcnMgaXQgaXMgemVyby4KKyAgICB0aW1lX3QgTW9kVGltZSA9IDA7CisKKyAgICAvLy8gTWVtb3J5IGJ1ZmZlcnMgaGF2ZSBNRDUgaW5zdGVhZCBvZiBtb2RpZmljYXRpb24gdGltZS4gIFdlIGRvbid0CisgICAgLy8vIGNvbXB1dGUgTUQ1IGZvciBvbi1kaXNrIGZpbGVzIGJlY2F1c2Ugd2UgaG9wZSB0aGF0IG1vZGlmaWNhdGlvbiB0aW1lIGlzCisgICAgLy8vIGVub3VnaCB0byB0ZWxsIGlmIHRoZSBmaWxlIHdhcyBjaGFuZ2VkLgorICAgIGxsdm06Ok1ENTo6TUQ1UmVzdWx0IE1ENSA9IHt9OworCisgICAgc3RhdGljIFByZWFtYmxlRmlsZUhhc2ggY3JlYXRlRm9yRmlsZShvZmZfdCBTaXplLCB0aW1lX3QgTW9kVGltZSk7CisgICAgc3RhdGljIFByZWFtYmxlRmlsZUhhc2gKKyAgICBjcmVhdGVGb3JNZW1vcnlCdWZmZXIoY29uc3QgbGx2bTo6TWVtb3J5QnVmZmVyICpCdWZmZXIpOworCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQcmVhbWJsZUZpbGVIYXNoICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVhbWJsZUZpbGVIYXNoICZSSFMpIHsKKyAgICAgIHJldHVybiBMSFMuU2l6ZSA9PSBSSFMuU2l6ZSAmJiBMSFMuTW9kVGltZSA9PSBSSFMuTW9kVGltZSAmJgorICAgICAgICAgICAgIExIUy5NRDUgPT0gUkhTLk1ENTsKKyAgICB9CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBQcmVhbWJsZUZpbGVIYXNoICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVhbWJsZUZpbGVIYXNoICZSSFMpIHsKKyAgICAgIHJldHVybiAhKExIUyA9PSBSSFMpOworICAgIH0KKyAgfTsKKworICAvLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHNldCB1cCBQQ0ggZm9yIHRoZSBwcmVhbWJsZSBpbnRvIFxwIENJIGFuZCBccCBWRlMgdG8KKyAgLy8vIHdpdGggdGhlIHNwZWNpZmllZCBccCBCb3VuZHMuCisgIHZvaWQgY29uZmlndXJlUHJlYW1ibGUoUHJlYW1ibGVCb3VuZHMgQm91bmRzLCBDb21waWxlckludm9jYXRpb24gJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjx2ZnM6OkZpbGVTeXN0ZW0+ICZWRlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6TWVtb3J5QnVmZmVyICpNYWluRmlsZUJ1ZmZlcikgY29uc3Q7CisKKyAgLy8vIFNldHMgdXAgdGhlIFByZXByb2Nlc3Nvck9wdGlvbnMgYW5kIGNoYW5nZXMgVkZTLCBzbyB0aGF0IFBDSCBzdG9yZWQgaW4gXHAKKyAgLy8vIFN0b3JhZ2UgaXMgYWNjZXNzaWJsZSB0byBjbGFuZy4gVGhpcyBtZXRob2QgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mCisgIC8vLyBBZGRJbXBsaWNpdFByZWFtYmxlLgorICBzdGF0aWMgdm9pZCBzZXR1cFByZWFtYmxlU3RvcmFnZShjb25zdCBQQ0hTdG9yYWdlICZTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVwcm9jZXNzb3JPcHRpb25zICZQcmVwcm9jZXNzb3JPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpGaWxlU3lzdGVtPiAmVkZTKTsKKworICAvLy8gTWFuYWdlcyB0aGUgbWVtb3J5IGJ1ZmZlciBvciB0ZW1wb3JhcnkgZmlsZSB0aGF0IHN0b3JlcyB0aGUgUENILgorICBQQ0hTdG9yYWdlIFN0b3JhZ2U7CisgIC8vLyBLZWVwcyB0cmFjayBvZiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgd2hlbiBjb21wdXRpbmcgdGhlCisgIC8vLyBwcmVhbWJsZSwgd2l0aCBib3RoIHRoZWlyIGJ1ZmZlciBzaXplIGFuZCB0aGVpciBtb2RpZmljYXRpb24gdGltZS4KKyAgLy8vCisgIC8vLyBJZiBhbnkgb2YgdGhlIGZpbGVzIGhhdmUgY2hhbmdlZCBmcm9tIG9uZSBjb21waWxlIHRvIHRoZSBuZXh0LAorICAvLy8gdGhlIHByZWFtYmxlIG11c3QgYmUgdGhyb3duIGF3YXkuCisgIGxsdm06OlN0cmluZ01hcDxQcmVhbWJsZUZpbGVIYXNoPiBGaWxlc0luUHJlYW1ibGU7CisgIC8vLyBUaGUgY29udGVudHMgb2YgdGhlIGZpbGUgdGhhdCB3YXMgdXNlZCB0byBwcmVjb21waWxlIHRoZSBwcmVhbWJsZS4gT25seQorICAvLy8gY29udGFpbnMgZmlyc3QgUHJlYW1ibGVCb3VuZHM6OlNpemUgYnl0ZXMuIFVzZWQgdG8gY29tcGFyZSBpZiB0aGUgcmVsZXZhbnQKKyAgLy8vIHBhcnQgb2YgdGhlIGZpbGUgaGFzIG5vdCBjaGFuZ2VkLCBzbyB0aGF0IHByZWFtYmxlIGNhbiBiZSByZXVzZWQuCisgIHN0ZDo6dmVjdG9yPGNoYXI+IFByZWFtYmxlQnl0ZXM7CisgIC8vLyBTZWUgUHJlYW1ibGVCb3VuZHM6OlByZWFtYmxlRW5kc0F0U3RhcnRPZkxpbmUKKyAgYm9vbCBQcmVhbWJsZUVuZHNBdFN0YXJ0T2ZMaW5lOworfTsKKworLy8vIEEgc2V0IG9mIGNhbGxiYWNrcyB0byBnYXRoZXIgdXNlZnVsIGluZm9ybWF0aW9uIHdoaWxlIGJ1aWxkaW5nIGEgcHJlYW1ibGUuCitjbGFzcyBQcmVhbWJsZUNhbGxiYWNrcyB7CitwdWJsaWM6CisgIHZpcnR1YWwgflByZWFtYmxlQ2FsbGJhY2tzKCkgPSBkZWZhdWx0OworCisgIC8vLyBDYWxsZWQgYmVmb3JlIEZyb250ZW5kQWN0aW9uOjpCZWdpblNvdXJjZUZpbGUuCisgIC8vLyBDYW4gYmUgdXNlZCB0byBzdG9yZSByZWZlcmVuY2VzIHRvIHZhcmlvdXMgQ29tcGlsZXJJbnN0YW5jZSBmaWVsZHMKKyAgLy8vIChlLmcuIFNvdXJjZU1hbmFnZXIpIHRoYXQgbWF5IGJlIGludGVyZXN0aW5nIHRvIHRoZSBjb25zdW1lcnMgb2Ygb3RoZXIKKyAgLy8vIGNhbGxiYWNrcy4KKyAgdmlydHVhbCB2b2lkIEJlZm9yZUV4ZWN1dGUoQ29tcGlsZXJJbnN0YW5jZSAmQ0kpOworICAvLy8gQ2FsbGVkIGFmdGVyIEZyb250ZW5kQWN0aW9uOjpFeGVjdXRlKCksIGJ1dCBiZWZvcmUKKyAgLy8vIEZyb250ZW5kQWN0aW9uOjpFbmRTb3VyY2VGaWxlKCkuIENhbiBiZSB1c2VkIHRvIHRyYW5zZmVyIG93bmVyc2hpcCBvZgorICAvLy8gdmFyaW91cyBDb21waWxlckluc3RhbmNlIGZpZWxkcyBiZWZvcmUgdGhleSBhcmUgZGVzdHJveWVkLgorICB2aXJ0dWFsIHZvaWQgQWZ0ZXJFeGVjdXRlKENvbXBpbGVySW5zdGFuY2UgJkNJKTsKKyAgLy8vIENhbGxlZCBhZnRlciBQQ0ggaGFzIGJlZW4gZW1pdHRlZC4gXHAgV3JpdGVyIG1heSBiZSB1c2VkIHRvIHJldHJpZXZlCisgIC8vLyBpbmZvcm1hdGlvbiBhYm91dCBBU1QsIHNlcmlhbGl6ZWQgaW4gUENILgorICB2aXJ0dWFsIHZvaWQgQWZ0ZXJQQ0hFbWl0dGVkKEFTVFdyaXRlciAmV3JpdGVyKTsKKyAgLy8vIENhbGxlZCBmb3IgZWFjaCBUb3BMZXZlbERlY2wuCisgIC8vLyBOT1RFOiBUbyBhbGxvdyBtb3JlIGZsZXhpYmlsaXR5IGEgY3VzdG9tIEFTVENvbnN1bWVyIGNvdWxkIHByb2JhYmx5IGJlCisgIC8vLyB1c2VkIGluc3RlYWQsIGJ1dCBoYXZpbmcgb25seSB0aGlzIG1ldGhvZCBhbGxvd3MgYSBzaW1wbGVyIEFQSS4KKyAgdmlydHVhbCB2b2lkIEhhbmRsZVRvcExldmVsRGVjbChEZWNsR3JvdXBSZWYgREcpOworICAvLy8gQ3JlYXRlcyB3cmFwcGVyIGNsYXNzIGZvciBQUENhbGxiYWNrcyBzbyB3ZSBjYW4gYWxzbyBwcm9jZXNzIGluZm9ybWF0aW9uCisgIC8vLyBhYm91dCBpbmNsdWRlcyB0aGF0IGFyZSBpbnNpZGUgb2YgYSBwcmVhbWJsZQorICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxQUENhbGxiYWNrcz4gY3JlYXRlUFBDYWxsYmFja3MoKTsKK307CisKK2VudW0gY2xhc3MgQnVpbGRQcmVhbWJsZUVycm9yIHsKKyAgUHJlYW1ibGVJc0VtcHR5ID0gMSwKKyAgQ291bGRudENyZWF0ZVRlbXBGaWxlLAorICBDb3VsZG50Q3JlYXRlVGFyZ2V0SW5mbywKKyAgQmVnaW5Tb3VyY2VGaWxlRmFpbGVkLAorICBDb3VsZG50RW1pdFBDSAorfTsKKworY2xhc3MgQnVpbGRQcmVhbWJsZUVycm9yQ2F0ZWdvcnkgZmluYWwgOiBwdWJsaWMgc3RkOjplcnJvcl9jYXRlZ29yeSB7CitwdWJsaWM6CisgIGNvbnN0IGNoYXIgKm5hbWUoKSBjb25zdCBub2V4Y2VwdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgbWVzc2FnZShpbnQgY29uZGl0aW9uKSBjb25zdCBvdmVycmlkZTsKK307CisKK3N0ZDo6ZXJyb3JfY29kZSBtYWtlX2Vycm9yX2NvZGUoQnVpbGRQcmVhbWJsZUVycm9yIEVycm9yKTsKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKK25hbWVzcGFjZSBzdGQgewordGVtcGxhdGUgPD4KK3N0cnVjdCBpc19lcnJvcl9jb2RlX2VudW08Y2xhbmc6OkJ1aWxkUHJlYW1ibGVFcnJvcj4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1ByZXByb2Nlc3Nvck91dHB1dE9wdGlvbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1ByZXByb2Nlc3Nvck91dHB1dE9wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGFmY2QwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvUHJlcHJvY2Vzc29yT3V0cHV0T3B0aW9ucy5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vPT09LS0tIFByZXByb2Nlc3Nvck91dHB1dE9wdGlvbnMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19GUk9OVEVORF9QUkVQUk9DRVNTT1JPVVRQVVRPUFRJT05TX0gKKyNkZWZpbmUgTExWTV9DTEFOR19GUk9OVEVORF9QUkVQUk9DRVNTT1JPVVRQVVRPUFRJT05TX0gKKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFByZXByb2Nlc3Nvck91dHB1dE9wdGlvbnMgLSBPcHRpb25zIGZvciBjb250cm9sbGluZyB0aGUgQyBwcmVwcm9jZXNzb3IKKy8vLyBvdXRwdXQgKGUuZy4sIC1FKS4KK2NsYXNzIFByZXByb2Nlc3Nvck91dHB1dE9wdGlvbnMgeworcHVibGljOgorICB1bnNpZ25lZCBTaG93Q1BQIDogMTsgICAgICAgICAgICAvLy88IFByaW50IG5vcm1hbCBwcmVwcm9jZXNzZWQgb3V0cHV0LgorICB1bnNpZ25lZCBTaG93Q29tbWVudHMgOiAxOyAgICAgICAvLy88IFNob3cgY29tbWVudHMuCisgIHVuc2lnbmVkIFNob3dMaW5lTWFya2VycyA6IDE7ICAgIC8vLzwgU2hvdyBcI2xpbmUgbWFya2Vycy4KKyAgdW5zaWduZWQgVXNlTGluZURpcmVjdGl2ZXMgOiAxOyAgIC8vLzwgVXNlIFwjbGluZSBpbnN0ZWFkIG9mIEdDQy1zdHlsZSBcIyBOLgorICB1bnNpZ25lZCBTaG93TWFjcm9Db21tZW50cyA6IDE7ICAvLy88IFNob3cgY29tbWVudHMsIGV2ZW4gaW4gbWFjcm9zLgorICB1bnNpZ25lZCBTaG93TWFjcm9zIDogMTsgICAgICAgICAvLy88IFByaW50IG1hY3JvIGRlZmluaXRpb25zLgorICB1bnNpZ25lZCBTaG93SW5jbHVkZURpcmVjdGl2ZXMgOiAxOyAgLy8vPCBQcmludCBpbmNsdWRlcywgaW1wb3J0cyBldGMuIHdpdGhpbiBwcmVwcm9jZXNzZWQgb3V0cHV0LgorICB1bnNpZ25lZCBSZXdyaXRlSW5jbHVkZXMgOiAxOyAgICAvLy88IFByZXByb2Nlc3MgaW5jbHVkZSBkaXJlY3RpdmVzIG9ubHkuCisgIHVuc2lnbmVkIFJld3JpdGVJbXBvcnRzICA6IDE7ICAgIC8vLzwgSW5jbHVkZSBjb250ZW50cyBvZiB0cmFuc2l0aXZlbHktaW1wb3J0ZWQgbW9kdWxlcy4KKworcHVibGljOgorICBQcmVwcm9jZXNzb3JPdXRwdXRPcHRpb25zKCkgeworICAgIFNob3dDUFAgPSAwOworICAgIFNob3dDb21tZW50cyA9IDA7CisgICAgU2hvd0xpbmVNYXJrZXJzID0gMTsKKyAgICBVc2VMaW5lRGlyZWN0aXZlcyA9IDA7CisgICAgU2hvd01hY3JvQ29tbWVudHMgPSAwOworICAgIFNob3dNYWNyb3MgPSAwOworICAgIFNob3dJbmNsdWRlRGlyZWN0aXZlcyA9IDA7CisgICAgUmV3cml0ZUluY2x1ZGVzID0gMDsKKyAgICBSZXdyaXRlSW1wb3J0cyA9IDA7CisgIH0KK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9TZXJpYWxpemVkRGlhZ25vc3RpY1ByaW50ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1NlcmlhbGl6ZWREaWFnbm9zdGljUHJpbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZWYwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9TZXJpYWxpemVkRGlhZ25vc3RpY1ByaW50ZXIuaApAQCAtMCwwICsxLDQzIEBACisvLz09PS0tLSBTZXJpYWxpemVkRGlhZ25vc3RpY1ByaW50ZXIuaCAtIFNlcmlhbGl6ZXIgZm9yIGRpYWdub3N0aWNzIC0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRlJPTlRFTkRfU0VSSUFMSVpFRERJQUdOT1NUSUNQUklOVEVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19GUk9OVEVORF9TRVJJQUxJWkVERElBR05PU1RJQ1BSSU5URVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL1NlcmlhbGl6ZWREaWFnbm9zdGljcy5oIgorI2luY2x1ZGUgImxsdm0vQml0Y29kZS9CaXRzdHJlYW1Xcml0ZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgcmF3X29zdHJlYW07Cit9CisKK25hbWVzcGFjZSBjbGFuZyB7CitjbGFzcyBEaWFnbm9zdGljQ29uc3VtZXI7CitjbGFzcyBEaWFnbm9zdGljc0VuZ2luZTsKK2NsYXNzIERpYWdub3N0aWNPcHRpb25zOworCituYW1lc3BhY2Ugc2VyaWFsaXplZF9kaWFncyB7CisKKy8vLyBcYnJpZWYgUmV0dXJucyBhIERpYWdub3N0aWNDb25zdW1lciB0aGF0IHNlcmlhbGl6ZXMgZGlhZ25vc3RpY3MgdG8KKy8vLyAgYSBiaXRjb2RlIGZpbGUuCisvLy8KKy8vLyBUaGUgY3JlYXRlZCBEaWFnbm9zdGljQ29uc3VtZXIgaXMgZGVzaWduZWQgZm9yIHF1aWNrIGFuZCBsaWdodHdlaWdodAorLy8vIHRyYW5zZmVyIG9mIGRpYWdub3N0aWNzIHRvIHRoZSBlbmNsb3NpbmcgYnVpbGQgc3lzdGVtIChlLmcuLCBhbiBJREUpLgorLy8vIFRoaXMgYWxsb3dzIHdyYXBwZXIgdG9vbHMgZm9yIENsYW5nIHRvIGdldCBkaWFnbm9zdGljcyBmcm9tIENsYW5nCisvLy8gKHZpYSBsaWJjbGFuZykgd2l0aG91dCBuZWVkaW5nIHRvIHBhcnNlIENsYW5nJ3MgY29tbWFuZCBsaW5lIG91dHB1dC4KKy8vLworc3RkOjp1bmlxdWVfcHRyPERpYWdub3N0aWNDb25zdW1lcj4gY3JlYXRlKFN0cmluZ1JlZiBPdXRwdXRGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNPcHRpb25zICpEaWFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE1lcmdlQ2hpbGRSZWNvcmRzID0gZmFsc2UpOworCit9IC8vIGVuZCBzZXJpYWxpemVkX2RpYWdzIG5hbWVzcGFjZQorfSAvLyBlbmQgY2xhbmcgbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvU2VyaWFsaXplZERpYWdub3N0aWNSZWFkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1NlcmlhbGl6ZWREaWFnbm9zdGljUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2MzdjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1NlcmlhbGl6ZWREaWFnbm9zdGljUmVhZGVyLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8vPT09LSBTZXJpYWxpemVkRGlhZ25vc3RpY1JlYWRlci5oIC0gUmVhZHMgZGlhZ25vc3RpY3MgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19GUk9OVEVORF9TRVJJQUxJWkVERElBR05PU1RJQ1JFQURFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfRlJPTlRFTkRfU0VSSUFMSVpFRERJQUdOT1NUSUNSRUFERVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQml0Y29kZS9CaXRzdHJlYW1SZWFkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JPci5oIgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBzZXJpYWxpemVkX2RpYWdzIHsKKworZW51bSBjbGFzcyBTREVycm9yIHsKKyAgQ291bGROb3RMb2FkID0gMSwKKyAgSW52YWxpZFNpZ25hdHVyZSwKKyAgSW52YWxpZERpYWdub3N0aWNzLAorICBNYWxmb3JtZWRUb3BMZXZlbEJsb2NrLAorICBNYWxmb3JtZWRTdWJCbG9jaywKKyAgTWFsZm9ybWVkQmxvY2tJbmZvQmxvY2ssCisgIE1hbGZvcm1lZE1ldGFkYXRhQmxvY2ssCisgIE1hbGZvcm1lZERpYWdub3N0aWNCbG9jaywKKyAgTWFsZm9ybWVkRGlhZ25vc3RpY1JlY29yZCwKKyAgTWlzc2luZ1ZlcnNpb24sCisgIFZlcnNpb25NaXNtYXRjaCwKKyAgVW5zdXBwb3J0ZWRDb25zdHJ1Y3QsCisgIC8vLyBBIGdlbmVyaWMgZXJyb3IgZm9yIHN1YmNsYXNzIGhhbmRsZXJzIHRoYXQgZG9uJ3Qgd2FudCBvciBuZWVkIHRvIGRlZmluZQorICAvLy8gdGhlaXIgb3duIGVycm9yX2NhdGVnb3J5LgorICBIYW5kbGVyRmFpbGVkCit9OworCitjb25zdCBzdGQ6OmVycm9yX2NhdGVnb3J5ICZTREVycm9yQ2F0ZWdvcnkoKTsKKworaW5saW5lIHN0ZDo6ZXJyb3JfY29kZSBtYWtlX2Vycm9yX2NvZGUoU0RFcnJvciBFKSB7CisgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoc3RhdGljX2Nhc3Q8aW50PihFKSwgU0RFcnJvckNhdGVnb3J5KCkpOworfQorCisvLy8gXGJyaWVmIEEgbG9jYXRpb24gdGhhdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgc2VyaWFsaXplZCBkaWFnbm9zdGljcy4KK3N0cnVjdCBMb2NhdGlvbiB7CisgIHVuc2lnbmVkIEZpbGVJRDsKKyAgdW5zaWduZWQgTGluZTsKKyAgdW5zaWduZWQgQ29sOworICB1bnNpZ25lZCBPZmZzZXQ7CisKKyAgTG9jYXRpb24odW5zaWduZWQgRmlsZUlELCB1bnNpZ25lZCBMaW5lLCB1bnNpZ25lZCBDb2wsIHVuc2lnbmVkIE9mZnNldCkKKyAgICAgIDogRmlsZUlEKEZpbGVJRCksIExpbmUoTGluZSksIENvbChDb2wpLCBPZmZzZXQoT2Zmc2V0KSB7fQorfTsKKworLy8vIFxicmllZiBBIGJhc2UgY2xhc3MgdGhhdCBoYW5kbGVzIHJlYWRpbmcgc2VyaWFsaXplZCBkaWFnbm9zdGljcyBmcm9tIGEgZmlsZS4KKy8vLworLy8vIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoZSB2aXNpdCogbWV0aG9kcyB3aXRoIHRoZWlyIGxvZ2ljIGZvciBoYW5kbGluZworLy8vIHRoZSB2YXJpb3VzIGNvbnN0cnVjdHMgdGhhdCBhcmUgZm91bmQgaW4gc2VyaWFsaXplZCBkaWFnbm9zdGljcy4KK2NsYXNzIFNlcmlhbGl6ZWREaWFnbm9zdGljUmVhZGVyIHsKK3B1YmxpYzoKKyAgU2VyaWFsaXplZERpYWdub3N0aWNSZWFkZXIoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgflNlcmlhbGl6ZWREaWFnbm9zdGljUmVhZGVyKCkgPSBkZWZhdWx0OworCisgIC8vLyBcYnJpZWYgUmVhZCB0aGUgZGlhZ25vc3RpY3MgaW4gXGMgRmlsZQorICBzdGQ6OmVycm9yX2NvZGUgcmVhZERpYWdub3N0aWNzKFN0cmluZ1JlZiBGaWxlKTsKKworcHJpdmF0ZToKKyAgZW51bSBjbGFzcyBDdXJzb3I7CisKKyAgLy8vIFxicmllZiBSZWFkIHRvIHRoZSBuZXh0IHJlY29yZCBvciBibG9jayB0byBwcm9jZXNzLgorICBsbHZtOjpFcnJvck9yPEN1cnNvcj4gc2tpcFVudGlsUmVjb3JkT3JCbG9jayhsbHZtOjpCaXRzdHJlYW1DdXJzb3IgJlN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkJsb2NrT3JSZWNvcmRJZCk7CisKKyAgLy8vIFxicmllZiBSZWFkIGEgbWV0YWRhdGEgYmxvY2sgZnJvbSBcYyBTdHJlYW0uCisgIHN0ZDo6ZXJyb3JfY29kZSByZWFkTWV0YUJsb2NrKGxsdm06OkJpdHN0cmVhbUN1cnNvciAmU3RyZWFtKTsKKworICAvLy8gXGJyaWVmIFJlYWQgYSBkaWFnbm9zdGljIGJsb2NrIGZyb20gXGMgU3RyZWFtLgorICBzdGQ6OmVycm9yX2NvZGUgcmVhZERpYWdub3N0aWNCbG9jayhsbHZtOjpCaXRzdHJlYW1DdXJzb3IgJlN0cmVhbSk7CisKK3Byb3RlY3RlZDoKKyAgLy8vIFxicmllZiBWaXNpdCB0aGUgc3RhcnQgb2YgYSBkaWFnbm9zdGljIGJsb2NrLgorICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZSB2aXNpdFN0YXJ0T2ZEaWFnbm9zdGljKCkgeyByZXR1cm4ge307IH0KKworICAvLy8gXGJyaWVmIFZpc2l0IHRoZSBlbmQgb2YgYSBkaWFnbm9zdGljIGJsb2NrLgorICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZSB2aXNpdEVuZE9mRGlhZ25vc3RpYygpIHsgcmV0dXJuIHt9OyB9CisKKyAgLy8vIFxicmllZiBWaXNpdCBhIGNhdGVnb3J5LiBUaGlzIGFzc29jaWF0ZXMgdGhlIGNhdGVnb3J5IFxjIElEIHRvIGEgXGMgTmFtZS4KKyAgdmlydHVhbCBzdGQ6OmVycm9yX2NvZGUgdmlzaXRDYXRlZ29yeVJlY29yZCh1bnNpZ25lZCBJRCwgU3RyaW5nUmVmIE5hbWUpIHsKKyAgICByZXR1cm4ge307CisgIH0KKworICAvLy8gXGJyaWVmIFZpc2l0IGEgZmxhZy4gVGhpcyBhc3NvY2lhdGVzIHRoZSBmbGFnJ3MgXGMgSUQgdG8gYSBcYyBOYW1lLgorICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZSB2aXNpdERpYWdGbGFnUmVjb3JkKHVuc2lnbmVkIElELCBTdHJpbmdSZWYgTmFtZSkgeworICAgIHJldHVybiB7fTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVmlzaXQgYSBkaWFnbm9zdGljLgorICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZQorICB2aXNpdERpYWdub3N0aWNSZWNvcmQodW5zaWduZWQgU2V2ZXJpdHksIGNvbnN0IExvY2F0aW9uICZMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENhdGVnb3J5LCB1bnNpZ25lZCBGbGFnLCBTdHJpbmdSZWYgTWVzc2FnZSkgeworICAgIHJldHVybiB7fTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVmlzaXQgYSBmaWxlbmFtZS4gVGhpcyBhc3NvY2lhdGVzIHRoZSBmaWxlJ3MgXGMgSUQgdG8gYSBcYyBOYW1lLgorICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZSB2aXNpdEZpbGVuYW1lUmVjb3JkKHVuc2lnbmVkIElELCB1bnNpZ25lZCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSkgeworICAgIHJldHVybiB7fTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVmlzaXQgYSBmaXhpdCBoaW50LgorICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZQorICB2aXNpdEZpeGl0UmVjb3JkKGNvbnN0IExvY2F0aW9uICZTdGFydCwgY29uc3QgTG9jYXRpb24gJkVuZCwgU3RyaW5nUmVmIFRleHQpIHsKKyAgICByZXR1cm4ge307CisgIH0KKworICAvLy8gXGJyaWVmIFZpc2l0IGEgc291cmNlIHJhbmdlLgorICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZSB2aXNpdFNvdXJjZVJhbmdlUmVjb3JkKGNvbnN0IExvY2F0aW9uICZTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbiAmRW5kKSB7CisgICAgcmV0dXJuIHt9OworICB9CisKKyAgLy8vIFxicmllZiBWaXNpdCB0aGUgdmVyc2lvbiBvZiB0aGUgc2V0IG9mIGRpYWdub3N0aWNzLgorICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZSB2aXNpdFZlcnNpb25SZWNvcmQodW5zaWduZWQgVmVyc2lvbikgeyByZXR1cm4ge307IH0KK307CisKK30gLy8gbmFtZXNwYWNlIHNlcmlhbGl6ZWRfZGlhZ3MKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKK25hbWVzcGFjZSBzdGQgeworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGlzX2Vycm9yX2NvZGVfZW51bTxjbGFuZzo6c2VyaWFsaXplZF9kaWFnczo6U0RFcnJvcj4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKKworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0ZST05URU5EX1NFUklBTElaRURESUFHTk9TVElDUkVBREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1NlcmlhbGl6ZWREaWFnbm9zdGljcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvU2VyaWFsaXplZERpYWdub3N0aWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzMmNkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1NlcmlhbGl6ZWREaWFnbm9zdGljcy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vPT09LS0tIFNlcmlhbGl6ZWREaWFnbm9zdGljcy5oIC0gQ29tbW9uIGRhdGEgZm9yIHNlcmlhbGl6ZWQgZGlhZ25vc3RpY3MgLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19GUk9OVEVORF9TRVJJQUxJWkVfRElBR05PU1RJQ1NfSF8KKyNkZWZpbmUgTExWTV9DTEFOR19GUk9OVEVORF9TRVJJQUxJWkVfRElBR05PU1RJQ1NfSF8KKworI2luY2x1ZGUgImxsdm0vQml0Y29kZS9CaXRDb2Rlcy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIHNlcmlhbGl6ZWRfZGlhZ3MgeworCitlbnVtIEJsb2NrSURzIHsKKyAgLy8vIFxicmllZiBBIHRvcC1sZXZlbCBibG9jayB3aGljaCByZXByZXNlbnRzIGFueSBtZXRhIGRhdGEgYXNzb2NpYXRlZAorICAvLy8gd2l0aCB0aGUgZGlhZ29zdGljcywgaW5jbHVkaW5nIHZlcnNpb25pbmcgb2YgdGhlIGZvcm1hdC4KKyAgQkxPQ0tfTUVUQSA9IGxsdm06OmJpdGM6OkZJUlNUX0FQUExJQ0FUSU9OX0JMT0NLSUQsCisKKyAgLy8vIFxicmllZiBUaGUgdGhpcyBibG9jayBhY3RzIGFzIGEgY29udGFpbmVyIGZvciBhbGwgdGhlIGluZm9ybWF0aW9uCisgIC8vLyBmb3IgYSBzcGVjaWZpYyBkaWFnbm9zdGljLgorICBCTE9DS19ESUFHCit9OworCitlbnVtIFJlY29yZElEcyB7CisgIFJFQ09SRF9WRVJTSU9OID0gMSwKKyAgUkVDT1JEX0RJQUcsCisgIFJFQ09SRF9TT1VSQ0VfUkFOR0UsCisgIFJFQ09SRF9ESUFHX0ZMQUcsCisgIFJFQ09SRF9DQVRFR09SWSwKKyAgUkVDT1JEX0ZJTEVOQU1FLAorICBSRUNPUkRfRklYSVQsCisgIFJFQ09SRF9GSVJTVCA9IFJFQ09SRF9WRVJTSU9OLAorICBSRUNPUkRfTEFTVCA9IFJFQ09SRF9GSVhJVAorfTsKKworLy8vIFxicmllZiBBIHN0YWJsZSB2ZXJzaW9uIG9mIERpYWdub3N0aWNJRHM6OkxldmVsLgorLy8vCisvLy8gRG8gbm90IGNoYW5nZSB0aGUgb3JkZXIgb2YgdmFsdWVzIGluIHRoaXMgZW51bSwgYW5kIHBsZWFzZSBpbmNyZW1lbnQgdGhlCisvLy8gc2VyaWFsaXplZCBkaWFnbm9zdGljcyB2ZXJzaW9uIG51bWJlciB3aGVuIHlvdSBhZGQgdG8gaXQuCitlbnVtIExldmVsIHsKKyAgSWdub3JlZCA9IDAsCisgIE5vdGUsCisgIFdhcm5pbmcsCisgIEVycm9yLAorICBGYXRhbCwKKyAgUmVtYXJrCit9OworCisvLy8gXGJyaWVmIFRoZSBzZXJpYWxpemVkIGRpYWdub3N0aWNzIHZlcnNpb24gbnVtYmVyLgorZW51bSB7IFZlcnNpb25OdW1iZXIgPSAyIH07CisKK30gLy8gZW5kIHNlcmlhbGl6ZWRfZGlhZ3MgbmFtZXNwYWNlCit9IC8vIGVuZCBjbGFuZyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9UZXh0RGlhZ25vc3RpYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvVGV4dERpYWdub3N0aWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmJmZTlmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvVGV4dERpYWdub3N0aWMuaApAQCAtMCwwICsxLDExNSBAQAorLy89PT0tLS0gVGV4dERpYWdub3N0aWMuaCAtIFRleHQgRGlhZ25vc3RpYyBQcmV0dHktUHJpbnRpbmcgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyB0aGF0IHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRleHR1YWwgcHJldHR5LXByaW50aW5nIG9mCisvLyBkaWFnbm9zdGljcy4gSXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGRpZmZlcmVudCBjb2RlIHBhdGhzIHdoaWNoIHJlcXVpcmUKKy8vIHN1Y2ggZnVuY3Rpb25hbGl0eSBpbiBhIGNvbnNpc3RlbnQgd2F5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19GUk9OVEVORF9URVhURElBR05PU1RJQ19ICisjZGVmaW5lIExMVk1fQ0xBTkdfRlJPTlRFTkRfVEVYVERJQUdOT1NUSUNfSAorCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvRGlhZ25vc3RpY1JlbmRlcmVyLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKKy8vLyBcYnJpZWYgQ2xhc3MgdG8gZW5jYXBzdWxhdGUgdGhlIGxvZ2ljIGZvciBmb3JtYXR0aW5nIGFuZCBwcmludGluZyBhIHRleHR1YWwKKy8vLyBkaWFnbm9zdGljIG1lc3NhZ2UuCisvLy8KKy8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgYnVpbGRpbmcgYW5kIGVtaXR0aW5nIGEgdGV4dHVhbAorLy8vIGRpYWdub3N0aWMsIGluY2x1ZGluZyBhbGwgb2YgdGhlIG1hY3JvIGJhY2t0cmFjZXMsIGNhcmV0IGRpYWdub3N0aWNzLCBGaXhJdAorLy8vIEhpbnRzLCBhbmQgY29kZSBzbmlwcGV0cy4gSW4gdGhlIHByZXNlbmNlIG9mIG1hY3JvcyB0aGlzIGludm9sdmVzCisvLy8gYSByZWN1cnNpdmUgcHJvY2Vzcywgc3ludGhlc2l6aW5nIG5vdGVzIGZvciBlYWNoIG1hY3JvIGV4cGFuc2lvbi4KKy8vLworLy8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gaXNvbGF0ZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgcHJpbnRpbmcKKy8vLyBiZWF1dGlmdWwgdGV4dCBkaWFnbm9zdGljcyBmcm9tIGFueSBwYXJ0aWN1bGFyIGludGVyZmFjZXMuIFRoZSBDbGFuZworLy8vIERpYWdub3N0aWNDbGllbnQgaXMgaW1wbGVtZW50ZWQgdGhyb3VnaCB0aGlzIGNsYXNzIGFzIGlzIGRpYWdub3N0aWMKKy8vLyBwcmludGluZyBjb21pbmcgb3V0IG9mIGxpYmNsYW5nLgorY2xhc3MgVGV4dERpYWdub3N0aWMgOiBwdWJsaWMgRGlhZ25vc3RpY1JlbmRlcmVyIHsKKyAgcmF3X29zdHJlYW0gJk9TOworCitwdWJsaWM6CisgIFRleHREaWFnbm9zdGljKHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLAorICAgICAgICAgICAgICAgICBEaWFnbm9zdGljT3B0aW9ucyAqRGlhZ09wdHMpOworCisgIH5UZXh0RGlhZ25vc3RpYygpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUHJpbnQgdGhlIGRpYWdvbnN0aWMgbGV2ZWwgdG8gYSByYXdfb3N0cmVhbS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGEgc3RhdGljIGhlbHBlciB0aGF0IGhhbmRsZXMgY29sb3JpemluZyB0aGUgbGV2ZWwgYW5kIGZvcm1hdHRpbmcKKyAgLy8vIGl0IGludG8gYW4gYXJiaXRyYXJ5IG91dHB1dCBzdHJlYW0uIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZQorICAvLy8gVGV4dERpYWdub3N0aWMgZW1pc3Npb24gY29kZSwgYnV0IGl0IGNhbiBhbHNvIGJlIHVzZWQgZGlyZWN0bHkgYnkKKyAgLy8vIGNvbnN1bWVycyB0aGF0IGRvbid0IGhhdmUgYSBzb3VyY2UgbWFuYWdlciBvciBvdGhlciBzdGF0ZSB0aGF0IHRoZSBmdWxsCisgIC8vLyBUZXh0RGlhZ25vc3RpYyBsb2dpYyByZXF1aXJlcy4KKyAgc3RhdGljIHZvaWQgcHJpbnREaWFnbm9zdGljTGV2ZWwocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvd0NvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDTEZhbGxiYWNrTW9kZSA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIFByZXR0eS1wcmludCBhIGRpYWdub3N0aWMgbWVzc2FnZSB0byBhIHJhd19vc3RyZWFtLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYSBzdGF0aWMgaGVscGVyIHRvIGhhbmRsZSB0aGUgbGluZSB3cmFwcGluZywgY29sb3JpemluZywgYW5kCisgIC8vLyByZW5kZXJpbmcgb2YgYSBkaWFnbm9zdGljIG1lc3NhZ2UgdG8gYSBwYXJ0aWN1bGFyIG9zdHJlYW0uIEl0IGlzCisgIC8vLyBwdWJsaWNseSB2aXNpYmxlIHNvIHRoYXQgY2xpZW50cyB3aGljaCBkbyBub3QgaGF2ZSBzdWZmaWNpZW50IHN0YXRlIHRvCisgIC8vLyBidWlsZCBhIGNvbXBsZXRlIFRleHREaWFnbm9zdGljIG9iamVjdCBjYW4gc3RpbGwgZ2V0IGNvbnNpc3RlbnQKKyAgLy8vIGZvcm1hdHRpbmcgb2YgdGhlaXIgZGlhZ25vc3RpYyBtZXNzYWdlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gT1MgV2hlcmUgdGhlIG1lc3NhZ2UgaXMgcHJpbnRlZAorICAvLy8gXHBhcmFtIElzU3VwcGxlbWVudGFsIHRydWUgaWYgdGhpcyBpcyBhIGNvbnRpbnVhdGlvbiBub3RlIGRpYWdub3N0aWMKKyAgLy8vIFxwYXJhbSBNZXNzYWdlIFRoZSB0ZXh0IGFjdHVhbGx5IHByaW50ZWQKKyAgLy8vIFxwYXJhbSBDdXJyZW50Q29sdW1uIFRoZSBzdGFydGluZyBjb2x1bW4gb2YgdGhlIGZpcnN0IGxpbmUsIGFjY291bnRpbmcKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgIGZvciBhbnkgcHJlZml4LgorICAvLy8gXHBhcmFtIENvbHVtbnMgVGhlIG51bWJlciBvZiBjb2x1bW5zIHRvIHVzZSBpbiBsaW5lLXdyYXBwaW5nLCAwIGRpc2FibGVzCisgIC8vLyAgICAgICAgICAgICAgICBhbGwgbGluZS13cmFwcGluZy4KKyAgLy8vIFxwYXJhbSBTaG93Q29sb3JzIEVuYWJsZSBjb2xvcml6aW5nIG9mIHRoZSBtZXNzYWdlLgorICBzdGF0aWMgdm9pZCBwcmludERpYWdub3N0aWNNZXNzYWdlKHJhd19vc3RyZWFtICZPUywgYm9vbCBJc1N1cHBsZW1lbnRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTWVzc2FnZSwgdW5zaWduZWQgQ3VycmVudENvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2x1bW5zLCBib29sIFNob3dDb2xvcnMpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgZW1pdERpYWdub3N0aWNNZXNzYWdlKEZ1bGxTb3VyY2VMb2MgTG9jLCBQcmVzdW1lZExvYyBQTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwsIFN0cmluZ1JlZiBNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDaGFyU291cmNlUmFuZ2U+IFJhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ09yU3RvcmVkRGlhZyBEKSBvdmVycmlkZTsKKworICB2b2lkIGVtaXREaWFnbm9zdGljTG9jKEZ1bGxTb3VyY2VMb2MgTG9jLCBQcmVzdW1lZExvYyBQTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDaGFyU291cmNlUmFuZ2U+IFJhbmdlcykgb3ZlcnJpZGU7CisKKyAgdm9pZCBlbWl0Q29kZUNvbnRleHQoRnVsbFNvdXJjZUxvYyBMb2MsIERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPENoYXJTb3VyY2VSYW5nZT4gJlJhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Rml4SXRIaW50PiBIaW50cykgb3ZlcnJpZGUgeworICAgIGVtaXRTbmlwcGV0QW5kQ2FyZXQoTG9jLCBMZXZlbCwgUmFuZ2VzLCBIaW50cyk7CisgIH0KKworICB2b2lkIGVtaXRJbmNsdWRlTG9jYXRpb24oRnVsbFNvdXJjZUxvYyBMb2MsIFByZXN1bWVkTG9jIFBMb2MpIG92ZXJyaWRlOworCisgIHZvaWQgZW1pdEltcG9ydExvY2F0aW9uKEZ1bGxTb3VyY2VMb2MgTG9jLCBQcmVzdW1lZExvYyBQTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTW9kdWxlTmFtZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBlbWl0QnVpbGRpbmdNb2R1bGVMb2NhdGlvbihGdWxsU291cmNlTG9jIExvYywgUHJlc3VtZWRMb2MgUExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTW9kdWxlTmFtZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIHZvaWQgZW1pdEZpbGVuYW1lKFN0cmluZ1JlZiBGaWxlbmFtZSwgY29uc3QgU291cmNlTWFuYWdlciAmU00pOworCisgIHZvaWQgZW1pdFNuaXBwZXRBbmRDYXJldChGdWxsU291cmNlTG9jIExvYywgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPENoYXJTb3VyY2VSYW5nZT4gJlJhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEZpeEl0SGludD4gSGludHMpOworCisgIHZvaWQgZW1pdFNuaXBwZXQoU3RyaW5nUmVmIFNvdXJjZUxpbmUpOworCisgIHZvaWQgZW1pdFBhcnNlYWJsZUZpeGl0cyhBcnJheVJlZjxGaXhJdEhpbnQ+IEhpbnRzLCBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9UZXh0RGlhZ25vc3RpY0J1ZmZlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvVGV4dERpYWdub3N0aWNCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjk1ZjlkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvVGV4dERpYWdub3N0aWNCdWZmZXIuaApAQCAtMCwwICsxLDY0IEBACisvLz09PS0gVGV4dERpYWdub3N0aWNCdWZmZXIuaCAtIEJ1ZmZlciBUZXh0IERpYWdub3N0aWNzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaXMgYSBjb25jcmV0ZSBkaWFnbm9zdGljIGNsaWVudCwgd2hpY2ggYnVmZmVycyB0aGUgZGlhZ25vc3RpYyBtZXNzYWdlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRlJPTlRFTkRfVEVYVERJQUdOT1NUSUNCVUZGRVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX0ZST05URU5EX1RFWFRESUFHTk9TVElDQlVGRkVSX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBUZXh0RGlhZ25vc3RpY0J1ZmZlciA6IHB1YmxpYyBEaWFnbm9zdGljQ29uc3VtZXIgeworcHVibGljOgorICB1c2luZyBEaWFnTGlzdCA9IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxTb3VyY2VMb2NhdGlvbiwgc3RkOjpzdHJpbmc+PjsKKyAgdXNpbmcgaXRlcmF0b3IgPSBEaWFnTGlzdDo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gRGlhZ0xpc3Q6OmNvbnN0X2l0ZXJhdG9yOworCitwcml2YXRlOgorICBEaWFnTGlzdCBFcnJvcnMsIFdhcm5pbmdzLCBSZW1hcmtzLCBOb3RlczsKKworICAvLy8gQWxsIC0gQWxsIGRpYWdub3N0aWNzIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgZ2VuZXJhdGVkLiAgVGhhdAorICAvLy8gb3JkZXIgbGlrZWx5IGRvZXNuJ3QgY29ycmVzcG9uZCB0byB1c2VyIGlucHV0IG9yZGVyLCBidXQgaXQgYXQgbGVhc3QKKyAgLy8vIGtlZXBzIG5vdGVzIGluIHRoZSByaWdodCBwbGFjZXMuICBFYWNoIHBhaXIgaW4gdGhlIHZlY3RvciBpcyBhIGRpYWdub3N0aWMKKyAgLy8vIGxldmVsIGFuZCBhbiBpbmRleCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIERpYWdMaXN0IGFib3ZlLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8RGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsLCBzaXplX3Q+PiBBbGw7CisKK3B1YmxpYzoKKyAgY29uc3RfaXRlcmF0b3IgZXJyX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gRXJyb3JzLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZXJyX2VuZCgpIGNvbnN0IHsgcmV0dXJuIEVycm9ycy5lbmQoKTsgfQorCisgIGNvbnN0X2l0ZXJhdG9yIHdhcm5fYmVnaW4oKSBjb25zdCB7IHJldHVybiBXYXJuaW5ncy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIHdhcm5fZW5kKCkgY29uc3QgeyByZXR1cm4gV2FybmluZ3MuZW5kKCk7IH0KKworICBjb25zdF9pdGVyYXRvciByZW1hcmtfYmVnaW4oKSBjb25zdCB7IHJldHVybiBSZW1hcmtzLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgcmVtYXJrX2VuZCgpIGNvbnN0IHsgcmV0dXJuIFJlbWFya3MuZW5kKCk7IH0KKworICBjb25zdF9pdGVyYXRvciBub3RlX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gTm90ZXMuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBub3RlX2VuZCgpIGNvbnN0IHsgcmV0dXJuIE5vdGVzLmVuZCgpOyB9CisKKyAgdm9pZCBIYW5kbGVEaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBEaWFnTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljICZJbmZvKSBvdmVycmlkZTsKKworICAvLy8gRmx1c2hEaWFnbm9zdGljcyAtIEZsdXNoIHRoZSBidWZmZXJlZCBkaWFnbm9zdGljcyB0byBhbiBnaXZlbgorICAvLy8gZGlhZ25vc3RpYyBlbmdpbmUuCisgIHZvaWQgRmx1c2hEaWFnbm9zdGljcyhEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MpIGNvbnN0OworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfRlJPTlRFTkRfVEVYVERJQUdOT1NUSUNCVUZGRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvVGV4dERpYWdub3N0aWNQcmludGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9UZXh0RGlhZ25vc3RpY1ByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2NlZTlmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvVGV4dERpYWdub3N0aWNQcmludGVyLmgKQEAgLTAsMCArMSw1OCBAQAorLy89PT0tLS0gVGV4dERpYWdub3N0aWNQcmludGVyLmggLSBUZXh0IERpYWdub3N0aWMgQ2xpZW50IC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGlzIGEgY29uY3JldGUgZGlhZ25vc3RpYyBjbGllbnQsIHdoaWNoIHByaW50cyB0aGUgZGlhZ25vc3RpY3MgdG8KKy8vIHN0YW5kYXJkIGVycm9yLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19GUk9OVEVORF9URVhURElBR05PU1RJQ1BSSU5URVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX0ZST05URU5EX1RFWFRESUFHTk9TVElDUFJJTlRFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGNsYW5nIHsKK2NsYXNzIERpYWdub3N0aWNPcHRpb25zOworY2xhc3MgTGFuZ09wdGlvbnM7CitjbGFzcyBUZXh0RGlhZ25vc3RpYzsKKworY2xhc3MgVGV4dERpYWdub3N0aWNQcmludGVyIDogcHVibGljIERpYWdub3N0aWNDb25zdW1lciB7CisgIHJhd19vc3RyZWFtICZPUzsKKyAgSW50cnVzaXZlUmVmQ250UHRyPERpYWdub3N0aWNPcHRpb25zPiBEaWFnT3B0czsKKworICAvLy8gXGJyaWVmIEhhbmRsZSB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSB0ZXh0IGRpYWdub3N0aWMgZW1pdHRlci4KKyAgc3RkOjp1bmlxdWVfcHRyPFRleHREaWFnbm9zdGljPiBUZXh0RGlhZzsKKworICAvLy8gQSBzdHJpbmcgdG8gcHJlZml4IHRvIGVycm9yIG1lc3NhZ2VzLgorICBzdGQ6OnN0cmluZyBQcmVmaXg7CisKKyAgdW5zaWduZWQgT3duc091dHB1dFN0cmVhbSA6IDE7CisKK3B1YmxpYzoKKyAgVGV4dERpYWdub3N0aWNQcmludGVyKHJhd19vc3RyZWFtICZvcywgRGlhZ25vc3RpY09wdGlvbnMgKmRpYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPd25zT3V0cHV0U3RyZWFtID0gZmFsc2UpOworICB+VGV4dERpYWdub3N0aWNQcmludGVyKCkgb3ZlcnJpZGU7CisKKyAgLy8vIHNldFByZWZpeCAtIFNldCB0aGUgZGlhZ25vc3RpYyBwcmludGVyIHByZWZpeCBzdHJpbmcsIHdoaWNoIHdpbGwgYmUKKyAgLy8vIHByaW50ZWQgYXQgdGhlIHN0YXJ0IG9mIGFueSBkaWFnbm9zdGljcy4gSWYgZW1wdHksIG5vIHByZWZpeCBzdHJpbmcgaXMKKyAgLy8vIHVzZWQuCisgIHZvaWQgc2V0UHJlZml4KHN0ZDo6c3RyaW5nIFZhbHVlKSB7IFByZWZpeCA9IHN0ZDo6bW92ZShWYWx1ZSk7IH0KKworICB2b2lkIEJlZ2luU291cmNlRmlsZShjb25zdCBMYW5nT3B0aW9ucyAmTE8sIGNvbnN0IFByZXByb2Nlc3NvciAqUFApIG92ZXJyaWRlOworICB2b2lkIEVuZFNvdXJjZUZpbGUoKSBvdmVycmlkZTsKKyAgdm9pZCBIYW5kbGVEaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWMgJkluZm8pIG92ZXJyaWRlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhNWU5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1V0aWxzLmgKQEAgLTAsMCArMSwyMzkgQEAKKy8vPT09LSBVdGlscy5oIC0gTWlzYyB1dGlsaXRpZXMgZm9yIHRoZSBmcm9udC1lbmQgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgaGVhZGVyIGNvbnRhaW5zIG1pc2NlbGxhbmVvdXMgdXRpbGl0aWVzIGZvciB2YXJpb3VzIGZyb250LWVuZCBhY3Rpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19GUk9OVEVORF9VVElMU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfRlJPTlRFTkRfVVRJTFNfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9WaXJ0dWFsRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9PcHRpb24vT3B0U3BlY2lmaWVyLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBUcmlwbGU7CisKK25hbWVzcGFjZSBvcHQgeworCitjbGFzcyBBcmdMaXN0OworCit9IC8vIG5hbWVzcGFjZSBvcHQKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBU1RSZWFkZXI7CitjbGFzcyBDb21waWxlckluc3RhbmNlOworY2xhc3MgQ29tcGlsZXJJbnZvY2F0aW9uOworY2xhc3MgRGVwZW5kZW5jeU91dHB1dE9wdGlvbnM7CitjbGFzcyBEaWFnbm9zdGljc0VuZ2luZTsKK2NsYXNzIEV4dGVybmFsU2VtYVNvdXJjZTsKK2NsYXNzIEZyb250ZW5kT3B0aW9uczsKK2NsYXNzIEhlYWRlclNlYXJjaDsKK2NsYXNzIEhlYWRlclNlYXJjaE9wdGlvbnM7CitjbGFzcyBMYW5nT3B0aW9uczsKK2NsYXNzIFBDSENvbnRhaW5lclJlYWRlcjsKK2NsYXNzIFByZXByb2Nlc3NvcjsKK2NsYXNzIFByZXByb2Nlc3Nvck9wdGlvbnM7CitjbGFzcyBQcmVwcm9jZXNzb3JPdXRwdXRPcHRpb25zOworCisvLy8gQXBwbHkgdGhlIGhlYWRlciBzZWFyY2ggb3B0aW9ucyB0byBnZXQgZ2l2ZW4gSGVhZGVyU2VhcmNoIG9iamVjdC4KK3ZvaWQgQXBwbHlIZWFkZXJTZWFyY2hPcHRpb25zKEhlYWRlclNlYXJjaCAmSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIZWFkZXJTZWFyY2hPcHRpb25zICZIU09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlRyaXBsZSAmdHJpcGxlKTsKKworLy8vIEluaXRpYWxpemVQcmVwcm9jZXNzb3IgLSBJbml0aWFsaXplIHRoZSBwcmVwcm9jZXNzb3IgZ2V0dGluZyBpdCBhbmQgdGhlCisvLy8gZW52aXJvbm1lbnQgcmVhZHkgdG8gcHJvY2VzcyBhIHNpbmdsZSBmaWxlLgordm9pZCBJbml0aWFsaXplUHJlcHJvY2Vzc29yKFByZXByb2Nlc3NvciAmUFAsIGNvbnN0IFByZXByb2Nlc3Nvck9wdGlvbnMgJlBQT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQQ0hDb250YWluZXJSZWFkZXIgJlBDSENvbnRhaW5lclJkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGcm9udGVuZE9wdGlvbnMgJkZFT3B0cyk7CisKKy8vLyBEb1ByaW50UHJlcHJvY2Vzc2VkSW5wdXQgLSBJbXBsZW1lbnQgLUUgbW9kZS4KK3ZvaWQgRG9QcmludFByZXByb2Nlc3NlZElucHV0KFByZXByb2Nlc3NvciAmUFAsIHJhd19vc3RyZWFtICpPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByZXByb2Nlc3Nvck91dHB1dE9wdGlvbnMgJk9wdHMpOworCisvLy8gQW4gaW50ZXJmYWNlIGZvciBjb2xsZWN0aW5nIHRoZSBkZXBlbmRlbmNpZXMgb2YgYSBjb21waWxhdGlvbi4gVXNlcnMgc2hvdWxkCisvLy8gdXNlIFxjIGF0dGFjaFRvUHJlcHJvY2Vzc29yIGFuZCBcYyBhdHRhY2hUb0FTVFJlYWRlciB0byBnZXQgYWxsIG9mIHRoZQorLy8vIGRlcGVuZGVuY2llcy4KKy8vLyBGSVhNRTogTWlncmF0ZSBEZXBlbmRlbmN5RmlsZUdlbiBhbmQgRGVwZW5kZW5jeUdyYXBoR2VuIHRvIHVzZSB0aGlzCisvLy8gaW50ZXJmYWNlLgorY2xhc3MgRGVwZW5kZW5jeUNvbGxlY3RvciB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkRlcGVuZGVuY3lDb2xsZWN0b3IoKTsKKworICB2aXJ0dWFsIHZvaWQgYXR0YWNoVG9QcmVwcm9jZXNzb3IoUHJlcHJvY2Vzc29yICZQUCk7CisgIHZpcnR1YWwgdm9pZCBhdHRhY2hUb0FTVFJlYWRlcihBU1RSZWFkZXIgJlIpOworICBBcnJheVJlZjxzdGQ6OnN0cmluZz4gZ2V0RGVwZW5kZW5jaWVzKCkgY29uc3QgeyByZXR1cm4gRGVwZW5kZW5jaWVzOyB9CisKKyAgLy8vIENhbGxlZCB3aGVuIGEgbmV3IGZpbGUgaXMgc2Vlbi4gUmV0dXJuIHRydWUgaWYgXHAgRmlsZW5hbWUgc2hvdWxkIGJlIGFkZGVkCisgIC8vLyB0byB0aGUgbGlzdCBvZiBkZXBlbmRlbmNpZXMuCisgIC8vLworICAvLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaWdub3JlcyA8YnVpbHQtaW4+IGFuZCBzeXN0ZW0gZmlsZXMuCisgIHZpcnR1YWwgYm9vbCBzYXdEZXBlbmRlbmN5KFN0cmluZ1JlZiBGaWxlbmFtZSwgYm9vbCBGcm9tTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzU3lzdGVtLCBib29sIElzTW9kdWxlRmlsZSwgYm9vbCBJc01pc3NpbmcpOworCisgIC8vLyBDYWxsZWQgd2hlbiB0aGUgZW5kIG9mIHRoZSBtYWluIGZpbGUgaXMgcmVhY2hlZC4KKyAgdmlydHVhbCB2b2lkIGZpbmlzaGVkTWFpbkZpbGUoKSB7fQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBzeXN0ZW0gZmlsZXMgc2hvdWxkIGJlIHBhc3NlZCB0byBzYXdEZXBlbmRlbmN5KCkuCisgIHZpcnR1YWwgYm9vbCBuZWVkU3lzdGVtRGVwZW5kZW5jaWVzKCkgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWwKKyAgLy8vIEFkZCBhIGRlcGVuZGVuY3kgXHAgRmlsZW5hbWUgaWYgaXQgaGFzIG5vdCBiZWVuIHNlZW4gYmVmb3JlIGFuZAorICAvLy8gc2F3RGVwZW5kZW5jeSgpIHJldHVybnMgdHJ1ZS4KKyAgdm9pZCBtYXliZUFkZERlcGVuZGVuY3koU3RyaW5nUmVmIEZpbGVuYW1lLCBib29sIEZyb21Nb2R1bGUsIGJvb2wgSXNTeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNNb2R1bGVGaWxlLCBib29sIElzTWlzc2luZyk7CisKK3ByaXZhdGU6CisgIGxsdm06OlN0cmluZ1NldDw+IFNlZW47CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBEZXBlbmRlbmNpZXM7Cit9OworCisvLy8gQnVpbGRzIGEgZGVwZGVuZW5jeSBmaWxlIHdoZW4gYXR0YWNoZWQgdG8gYSBQcmVwcm9jZXNzb3IgKGZvciBpbmNsdWRlcykgYW5kCisvLy8gQVNUUmVhZGVyIChmb3IgbW9kdWxlIGltcG9ydHMpLCBhbmQgd3JpdGVzIGl0IG91dCBhdCB0aGUgZW5kIG9mIHByb2Nlc3NpbmcKKy8vLyBhIHNvdXJjZSBmaWxlLiAgVXNlcnMgc2hvdWxkIGF0dGFjaCB0byB0aGUgYXN0IHJlYWRlciB3aGVuZXZlciBhIG1vZHVsZSBpcworLy8vIGxvYWRlZC4KK2NsYXNzIERlcGVuZGVuY3lGaWxlR2VuZXJhdG9yIHsKKyAgdm9pZCAqSW1wbDsgLy8gT3BhcXVlIGltcGxlbWVudGF0aW9uCisKKyAgRGVwZW5kZW5jeUZpbGVHZW5lcmF0b3Iodm9pZCAqSW1wbCk7CisKK3B1YmxpYzoKKyAgc3RhdGljIERlcGVuZGVuY3lGaWxlR2VuZXJhdG9yICpDcmVhdGVBbmRBdHRhY2hUb1ByZXByb2Nlc3NvcigKKyAgICBQcmVwcm9jZXNzb3IgJlBQLCBjb25zdCBEZXBlbmRlbmN5T3V0cHV0T3B0aW9ucyAmT3B0cyk7CisKKyAgdm9pZCBBdHRhY2hUb0FTVFJlYWRlcihBU1RSZWFkZXIgJlIpOworfTsKKworLy8vIENvbGxlY3RzIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGltcG9ydGVkIG1vZHVsZXMgaW50byBhIGRpcmVjdG9yeS4gIFVzZXJzCisvLy8gc2hvdWxkIGF0dGFjaCB0byB0aGUgQVNUIHJlYWRlciB3aGVuZXZlciBhIG1vZHVsZSBpcyBsb2FkZWQuCitjbGFzcyBNb2R1bGVEZXBlbmRlbmN5Q29sbGVjdG9yIDogcHVibGljIERlcGVuZGVuY3lDb2xsZWN0b3IgeworICBzdGQ6OnN0cmluZyBEZXN0RGlyOworICBib29sIEhhc0Vycm9ycyA9IGZhbHNlOworICBsbHZtOjpTdHJpbmdTZXQ8PiBTZWVuOworICB2ZnM6OllBTUxWRlNXcml0ZXIgVkZTV3JpdGVyOworICBsbHZtOjpTdHJpbmdNYXA8c3RkOjpzdHJpbmc+IFN5bUxpbmtNYXA7CisKKyAgYm9vbCBnZXRSZWFsUGF0aChTdHJpbmdSZWYgU3JjUGF0aCwgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZSZXN1bHQpOworICBzdGQ6OmVycm9yX2NvZGUgY29weVRvUm9vdChTdHJpbmdSZWYgU3JjLCBTdHJpbmdSZWYgRHN0ID0ge30pOworCitwdWJsaWM6CisgIE1vZHVsZURlcGVuZGVuY3lDb2xsZWN0b3Ioc3RkOjpzdHJpbmcgRGVzdERpcikKKyAgICAgIDogRGVzdERpcihzdGQ6Om1vdmUoRGVzdERpcikpIHt9CisgIH5Nb2R1bGVEZXBlbmRlbmN5Q29sbGVjdG9yKCkgb3ZlcnJpZGUgeyB3cml0ZUZpbGVNYXAoKTsgfQorCisgIFN0cmluZ1JlZiBnZXREZXN0KCkgeyByZXR1cm4gRGVzdERpcjsgfQorICBib29sIGluc2VydFNlZW4oU3RyaW5nUmVmIEZpbGVuYW1lKSB7IHJldHVybiBTZWVuLmluc2VydChGaWxlbmFtZSkuc2Vjb25kOyB9CisgIHZvaWQgYWRkRmlsZShTdHJpbmdSZWYgRmlsZW5hbWUsIFN0cmluZ1JlZiBGaWxlRHN0ID0ge30pOworCisgIHZvaWQgYWRkRmlsZU1hcHBpbmcoU3RyaW5nUmVmIFZQYXRoLCBTdHJpbmdSZWYgUlBhdGgpIHsKKyAgICBWRlNXcml0ZXIuYWRkRmlsZU1hcHBpbmcoVlBhdGgsIFJQYXRoKTsKKyAgfQorCisgIHZvaWQgYXR0YWNoVG9QcmVwcm9jZXNzb3IoUHJlcHJvY2Vzc29yICZQUCkgb3ZlcnJpZGU7CisgIHZvaWQgYXR0YWNoVG9BU1RSZWFkZXIoQVNUUmVhZGVyICZSKSBvdmVycmlkZTsKKworICB2b2lkIHdyaXRlRmlsZU1hcCgpOworICBib29sIGhhc0Vycm9ycygpIHsgcmV0dXJuIEhhc0Vycm9yczsgfQorfTsKKworLy8vIEF0dGFjaERlcGVuZGVuY3lHcmFwaEdlbiAtIENyZWF0ZSBhIGRlcGVuZGVuY3kgZ3JhcGggZ2VuZXJhdG9yLCBhbmQgYXR0YWNoCisvLy8gaXQgdG8gdGhlIGdpdmVuIHByZXByb2Nlc3Nvci4KK3ZvaWQgQXR0YWNoRGVwZW5kZW5jeUdyYXBoR2VuKFByZXByb2Nlc3NvciAmUFAsIFN0cmluZ1JlZiBPdXRwdXRGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFN5c1Jvb3QpOworCisvLy8gQXR0YWNoSGVhZGVySW5jbHVkZUdlbiAtIENyZWF0ZSBhIGhlYWRlciBpbmNsdWRlIGxpc3QgZ2VuZXJhdG9yLCBhbmQgYXR0YWNoCisvLy8gaXQgdG8gdGhlIGdpdmVuIHByZXByb2Nlc3Nvci4KKy8vLworLy8vIFxwYXJhbSBEZXBPcHRzIC0gT3B0aW9ucyBjb250cm9sbGluZyB0aGUgb3V0cHV0LgorLy8vIFxwYXJhbSBTaG93QWxsSGVhZGVycyAtIElmIHRydWUsIHNob3cgYWxsIGhlYWRlciBpbmZvcm1hdGlvbiBpbnN0ZWFkIG9mIGp1c3QKKy8vLyBoZWFkZXJzIGZvbGxvd2luZyB0aGUgcHJlZGVmaW5lcyBidWZmZXIuIFRoaXMgaXMgdXNlZnVsIGZvciBtYWtpbmcgc3VyZQorLy8vIGluY2x1ZGVzIG1lbnRpb25lZCBvbiB0aGUgY29tbWFuZCBsaW5lIGFyZSBhbHNvIHJlcG9ydGVkLCBidXQgZGlmZmVycyBmcm9tCisvLy8gdGhlIGRlZmF1bHQgYmVoYXZpb3IgdXNlZCBieSAtSC4KKy8vLyBccGFyYW0gT3V0cHV0UGF0aCAtIElmIG5vbi1lbXB0eSwgYSBwYXRoIHRvIHdyaXRlIHRoZSBoZWFkZXIgaW5jbHVkZQorLy8vIGluZm9ybWF0aW9uIHRvLCBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gc3RkZXJyLgorLy8vIFxwYXJhbSBTaG93RGVwdGggLSBXaGV0aGVyIHRvIGluZGVudCB0byBzaG93IHRoZSBuZXN0aW5nIG9mIHRoZSBpbmNsdWRlcy4KKy8vLyBccGFyYW0gTVNTdHlsZSAtIFdoZXRoZXIgdG8gcHJpbnQgaW4gY2wuZXhlIC9zaG93SW5jbHVkZXMgc3R5bGUuCit2b2lkIEF0dGFjaEhlYWRlckluY2x1ZGVHZW4oUHJlcHJvY2Vzc29yICZQUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXBlbmRlbmN5T3V0cHV0T3B0aW9ucyAmRGVwT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3dBbGxIZWFkZXJzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE91dHB1dFBhdGggPSB7fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3dEZXB0aCA9IHRydWUsIGJvb2wgTVNTdHlsZSA9IGZhbHNlKTsKKworLy8vIENhY2hlIHRva2VucyBmb3IgdXNlIHdpdGggUENILiBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhIHNlZWthYmxlIHN0cmVhbS4KK3ZvaWQgQ2FjaGVUb2tlbnMoUHJlcHJvY2Vzc29yICZQUCwgcmF3X3B3cml0ZV9zdHJlYW0gKk9TKTsKKworLy8vIFRoZSBDaGFpbmVkSW5jbHVkZXNTb3VyY2UgY2xhc3MgY29udmVydHMgaGVhZGVycyB0byBjaGFpbmVkIFBDSHMgaW4KKy8vLyBtZW1vcnksIG1haW5seSBmb3IgdGVzdGluZy4KK0ludHJ1c2l2ZVJlZkNudFB0cjxFeHRlcm5hbFNlbWFTb3VyY2U+CitjcmVhdGVDaGFpbmVkSW5jbHVkZXNTb3VyY2UoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cnVzaXZlUmVmQ250UHRyPEV4dGVybmFsU2VtYVNvdXJjZT4gJlJlYWRlcik7CisKKy8vLyBjcmVhdGVJbnZvY2F0aW9uRnJvbUNvbW1hbmRMaW5lIC0gQ29uc3RydWN0IGEgY29tcGlsZXIgaW52b2NhdGlvbiBvYmplY3QgZm9yCisvLy8gYSBjb21tYW5kIGxpbmUgYXJndW1lbnQgdmVjdG9yLgorLy8vCisvLy8gXHJldHVybiBBIENvbXBpbGVySW52b2NhdGlvbiwgb3IgMCBpZiBub25lIHdhcyBidWlsdCBmb3IgdGhlIGdpdmVuCisvLy8gYXJndW1lbnQgdmVjdG9yLgorc3RkOjp1bmlxdWVfcHRyPENvbXBpbGVySW52b2NhdGlvbj4gY3JlYXRlSW52b2NhdGlvbkZyb21Db21tYW5kTGluZSgKKyAgICBBcnJheVJlZjxjb25zdCBjaGFyICo+IEFyZ3MsCisgICAgSW50cnVzaXZlUmVmQ250UHRyPERpYWdub3N0aWNzRW5naW5lPiBEaWFncyA9CisgICAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljc0VuZ2luZT4oKSwKKyAgICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpGaWxlU3lzdGVtPiBWRlMgPSBudWxscHRyKTsKKworLy8vIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgYXJndW1lbnQgYXMgYW4gaW50ZWdlciwgb3IgYSBkZWZhdWx0LiBJZiBEaWFncworLy8vIGlzIG5vbi1udWxsLCBlbWl0cyBhbiBlcnJvciBpZiB0aGUgYXJndW1lbnQgaXMgZ2l2ZW4sIGJ1dCBub24taW50ZWdyYWwuCitpbnQgZ2V0TGFzdEFyZ0ludFZhbHVlKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpPcHRTcGVjaWZpZXIgSWQsIGludCBEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAqRGlhZ3MgPSBudWxscHRyKTsKKworaW5saW5lIGludCBnZXRMYXN0QXJnSW50VmFsdWUoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpPcHRTcGVjaWZpZXIgSWQsIGludCBEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzKSB7CisgIHJldHVybiBnZXRMYXN0QXJnSW50VmFsdWUoQXJncywgSWQsIERlZmF1bHQsICZEaWFncyk7Cit9CisKK3VpbnQ2NF90IGdldExhc3RBcmdVSW50NjRWYWx1ZShjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpPcHRTcGVjaWZpZXIgSWQsIHVpbnQ2NF90IERlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgKkRpYWdzID0gbnVsbHB0cik7CisKK2lubGluZSB1aW50NjRfdCBnZXRMYXN0QXJnVUludDY0VmFsdWUoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6Ok9wdFNwZWNpZmllciBJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzKSB7CisgIHJldHVybiBnZXRMYXN0QXJnVUludDY0VmFsdWUoQXJncywgSWQsIERlZmF1bHQsICZEaWFncyk7Cit9CisKKy8vIFdoZW4gQ2xhbmctPmdldEZyb250ZW5kT3B0cygpLkRpc2FibGVGcmVlIGlzIHNldCB3ZSBkb24ndCBkZWxldGUgc29tZSBvZiB0aGUKKy8vIGdsb2JhbCBvYmplY3RzLCBidXQgd2UgZG9uJ3Qgd2FudCBMZWFrRGV0ZWN0b3JzIHRvIGNvbXBsYWluLCBzbyB3ZSBidXJ5IHRoZW0KKy8vIGluIGEgZ2xvYmFsbHkgdmlzaWJsZSBhcnJheS4KK3ZvaWQgQnVyeVBvaW50ZXIoY29uc3Qgdm9pZCAqUHRyKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEJ1cnlQb2ludGVyKHN0ZDo6dW5pcXVlX3B0cjxUPiBQdHIpIHsKKyAgQnVyeVBvaW50ZXIoUHRyLnJlbGVhc2UoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0ZST05URU5EX1VUSUxTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1ZlcmlmeURpYWdub3N0aWNDb25zdW1lci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvVmVyaWZ5RGlhZ25vc3RpY0NvbnN1bWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0OTliNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1ZlcmlmeURpYWdub3N0aWNDb25zdW1lci5oCkBAIC0wLDAgKzEsMjg3IEBACisvLz09PS0gVmVyaWZ5RGlhZ25vc3RpY0NvbnN1bWVyLmggLSBWZXJpZnlpbmcgRGlhZ25vc3RpYyBDbGllbnQgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRlJPTlRFTkRfVkVSSUZZRElBR05PU1RJQ0NPTlNVTUVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19GUk9OVEVORF9WRVJJRllESUFHTk9TVElDQ09OU1VNRVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL0xleC9QcmVwcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEZpbGVFbnRyeTsKK2NsYXNzIExhbmdPcHRpb25zOworY2xhc3MgU291cmNlTWFuYWdlcjsKK2NsYXNzIFRleHREaWFnbm9zdGljQnVmZmVyOworCisvLy8gVmVyaWZ5RGlhZ25vc3RpY0NvbnN1bWVyIC0gQ3JlYXRlIGEgZGlhZ25vc3RpYyBjbGllbnQgd2hpY2ggd2lsbCB1c2UKKy8vLyBtYXJrZXJzIGluIHRoZSBpbnB1dCBzb3VyY2UgdG8gY2hlY2sgdGhhdCBhbGwgdGhlIGVtaXR0ZWQgZGlhZ25vc3RpY3MgbWF0Y2gKKy8vLyB0aG9zZSBleHBlY3RlZC4KKy8vLworLy8vIFVTSU5HIFRIRSBESUFHTk9TVElDIENIRUNLRVI6CisvLy8KKy8vLyBJbmRpY2F0aW5nIHRoYXQgYSBsaW5lIGV4cGVjdHMgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGlzIHNpbXBsZS4gUHV0IGEKKy8vLyBjb21tZW50IG9uIHRoZSBsaW5lIHRoYXQgaGFzIHRoZSBkaWFnbm9zdGljLCB1c2U6CisvLy8KKy8vLyBcY29kZQorLy8vICAgZXhwZWN0ZWQte2Vycm9yLHdhcm5pbmcscmVtYXJrLG5vdGV9CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIHRvIHRhZyBpZiBpdCdzIGFuIGV4cGVjdGVkIGVycm9yLCByZW1hcmsgb3Igd2FybmluZywgYW5kIHBsYWNlIHRoZSBleHBlY3RlZAorLy8vIHRleHQgYmV0d2VlbiB7eyBhbmQgfX0gbWFya2Vycy4gVGhlIGZ1bGwgdGV4dCBkb2Vzbid0IGhhdmUgdG8gYmUgaW5jbHVkZWQsCisvLy8gb25seSBlbm91Z2ggdG8gZW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QgZGlhZ25vc3RpYyB3YXMgZW1pdHRlZC4KKy8vLworLy8vIEhlcmUncyBhbiBleGFtcGxlOgorLy8vCisvLy8gXGNvZGUKKy8vLyAgIGludCBBID0gQjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdCJ319CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFlvdSBjYW4gcGxhY2UgYXMgbWFueSBkaWFnbm9zdGljcyBvbiBvbmUgbGluZSBhcyB5b3Ugd2lzaC4gVG8gbWFrZSB0aGUgY29kZQorLy8vIG1vcmUgcmVhZGFibGUsIHlvdSBjYW4gdXNlIHNsYXNoLW5ld2xpbmUgdG8gc2VwYXJhdGUgb3V0IHRoZSBkaWFnbm9zdGljcy4KKy8vLworLy8vIEFsdGVybmF0aXZlbHksIGl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgdGhlIGxpbmUgb24gd2hpY2ggdGhlIGRpYWdub3N0aWMKKy8vLyBzaG91bGQgYXBwZWFyIGJ5IGFwcGVuZGluZyAiQDxsaW5lPiIgdG8gImV4cGVjdGVkLTx0eXBlPiIsIGZvciBleGFtcGxlOgorLy8vCisvLy8gXGNvZGUKKy8vLyAgICN3YXJuaW5nIHNvbWUgdGV4dAorLy8vICAgLy8gZXhwZWN0ZWQtd2FybmluZ0AxMCB7e3NvbWUgdGV4dH19CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoZSBsaW5lIG51bWJlciBtYXkgYmUgYWJzb2x1dGUgKGFzIGFib3ZlKSwgb3IgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQKKy8vLyBsaW5lIGJ5IHByZWZpeGluZyB0aGUgbnVtYmVyIHdpdGggZWl0aGVyICcrJyBvciAnLScuCisvLy8KKy8vLyBJZiB0aGUgZGlhZ25vc3RpYyBpcyBnZW5lcmF0ZWQgaW4gYSBzZXBhcmF0ZSBmaWxlLCBmb3IgZXhhbXBsZSBpbiBhIHNoYXJlZAorLy8vIGhlYWRlciBmaWxlLCBpdCBtYXkgYmUgYmVuZWZpY2lhbCB0byBiZSBhYmxlIHRvIGRlY2xhcmUgdGhlIGZpbGUgaW4gd2hpY2gKKy8vLyB0aGUgZGlhZ25vc3RpYyB3aWxsIGFwcGVhciwgcmF0aGVyIHRoYW4gcGxhY2luZyB0aGUgZXhwZWN0ZWQtKiBkaXJlY3RpdmUgaW4KKy8vLyB0aGUgYWN0dWFsIGZpbGUgaXRzZWxmLiAgVGhpcyBjYW4gYmUgZG9uZSB1c2luZyB0aGUgZm9sbG93aW5nIHN5bnRheDoKKy8vLworLy8vIFxjb2RlCisvLy8gICAvLyBleHBlY3RlZC1lcnJvckBwYXRoL2luY2x1ZGUuaDoxNSB7e2Vycm9yIG1lc3NhZ2V9fQorLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGUgcGF0aCBjYW4gYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgYW5kIHRoZSBzYW1lIHNlYXJjaCBwYXRocyB3aWxsIGJlIHVzZWQKKy8vLyBhcyBmb3IgI2luY2x1ZGUgZGlyZWN0aXZlcy4gIFRoZSBsaW5lIG51bWJlciBpbiBhbiBleHRlcm5hbCBmaWxlIG1heSBiZQorLy8vIHN1YnN0aXR1dGVkIHdpdGggJyonIG1lYW5pbmcgdGhhdCBhbnkgbGluZSBudW1iZXIgd2lsbCBtYXRjaCAodXNlZnVsIHdoZXJlCisvLy8gdGhlIGluY2x1ZGVkIGZpbGUgaXMsIGZvciBleGFtcGxlLCBhIHN5c3RlbSBoZWFkZXIgd2hlcmUgdGhlIGFjdHVhbCBsaW5lCisvLy8gbnVtYmVyIG1heSBjaGFuZ2UgYW5kIGlzIG5vdCBjcml0aWNhbCkuCisvLy8KKy8vLyBUaGUgc2ltcGxlIHN5bnRheCBhYm92ZSBhbGxvd3MgZWFjaCBzcGVjaWZpY2F0aW9uIHRvIG1hdGNoIGV4YWN0bHkgb25lCisvLy8gZXJyb3IuICBZb3UgY2FuIHVzZSB0aGUgZXh0ZW5kZWQgc3ludGF4IHRvIGN1c3RvbWl6ZSB0aGlzLiBUaGUgZXh0ZW5kZWQKKy8vLyBzeW50YXggaXMgImV4cGVjdGVkLTx0eXBlPiA8bj4ge3tkaWFnIHRleHR9fSIsIHdoZXJlIFw8dHlwZT4gaXMgb25lIG9mCisvLy8gImVycm9yIiwgIndhcm5pbmciIG9yICJub3RlIiwgYW5kIFw8bj4gaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyLiBUaGlzIGFsbG93cworLy8vIHRoZSBkaWFnbm9zdGljIHRvIGFwcGVhciBhcyBtYW55IHRpbWVzIGFzIHNwZWNpZmllZC4gRXhhbXBsZToKKy8vLworLy8vIFxjb2RlCisvLy8gICB2b2lkIGYoKTsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7cHJldmlvdXMgZGVjbGFyYXRpb24gaXMgaGVyZX19CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFdoZXJlIHRoZSBkaWFnbm9zdGljIGlzIGV4cGVjdGVkIHRvIG9jY3VyIGEgbWluaW11bSBudW1iZXIgb2YgdGltZXMsIHRoaXMKKy8vLyBjYW4gYmUgc3BlY2lmaWVkIGJ5IGFwcGVuZGluZyBhICcrJyB0byB0aGUgbnVtYmVyLiBFeGFtcGxlOgorLy8vCisvLy8gXGNvZGUKKy8vLyAgIHZvaWQgZigpOyAvLyBleHBlY3RlZC1ub3RlIDArIHt7cHJldmlvdXMgZGVjbGFyYXRpb24gaXMgaGVyZX19CisvLy8gICB2b2lkIGcoKTsgLy8gZXhwZWN0ZWQtbm90ZSAxKyB7e3ByZXZpb3VzIGRlY2xhcmF0aW9uIGlzIGhlcmV9fQorLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBJbiB0aGUgZmlyc3QgZXhhbXBsZSwgdGhlIGRpYWdub3N0aWMgYmVjb21lcyBvcHRpb25hbCwgaS5lLiBpdCB3aWxsIGJlCisvLy8gc3dhbGxvd2VkIGlmIGl0IG9jY3VycywgYnV0IHdpbGwgbm90IGdlbmVyYXRlIGFuIGVycm9yIGlmIGl0IGRvZXMgbm90CisvLy8gb2NjdXIuICBJbiB0aGUgc2Vjb25kIGV4YW1wbGUsIHRoZSBkaWFnbm9zdGljIG11c3Qgb2NjdXIgYXQgbGVhc3Qgb25jZS4KKy8vLyBBcyBhIHNob3J0LWhhbmQsICJvbmUgb3IgbW9yZSIgY2FuIGJlIHNwZWNpZmllZCBzaW1wbHkgYnkgJysnLiBFeGFtcGxlOgorLy8vCisvLy8gXGNvZGUKKy8vLyAgIHZvaWQgZygpOyAvLyBleHBlY3RlZC1ub3RlICsge3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0KKy8vLyBcZW5kY29kZQorLy8vCisvLy8gQSByYW5nZSBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgYnkgIjxuPi08bT4iLiAgRXhhbXBsZToKKy8vLworLy8vIFxjb2RlCisvLy8gICB2b2lkIGYoKTsgLy8gZXhwZWN0ZWQtbm90ZSAwLTEge3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0KKy8vLyBcZW5kY29kZQorLy8vCisvLy8gSW4gdGhpcyBleGFtcGxlLCB0aGUgZGlhZ25vc3RpYyBtYXkgYXBwZWFyIG9ubHkgb25jZSwgaWYgYXQgYWxsLgorLy8vCisvLy8gUmVnZXggbWF0Y2hpbmcgbW9kZSBtYXkgYmUgc2VsZWN0ZWQgYnkgYXBwZW5kaW5nICctcmUnIHRvIHR5cGUgYW5kCisvLy8gaW5jbHVkaW5nIHJlZ2V4ZXMgd3JhcHBlZCBpbiBkb3VibGUgY3VybHkgYnJhY2VzIGluIHRoZSBkaXJlY3RpdmUsIHN1Y2ggYXM6CisvLy8KKy8vLyBcY29kZQorLy8vICAgZXhwZWN0ZWQtZXJyb3ItcmUge3tmb3JtYXQgc3BlY2lmaWVzIHR5cGUgJ3djaGFyX3QgKionIChha2EgJ3t7Lit9fScpfX0KKy8vLyBcZW5kY29kZQorLy8vCisvLy8gRXhhbXBsZXMgbWF0Y2hpbmcgZXJyb3I6ICJ2YXJpYWJsZSBoYXMgaW5jb21wbGV0ZSB0eXBlICdzdHJ1Y3QgcyciCisvLy8KKy8vLyBcY29kZQorLy8vICAgLy8gZXhwZWN0ZWQtZXJyb3Ige3t2YXJpYWJsZSBoYXMgaW5jb21wbGV0ZSB0eXBlICdzdHJ1Y3Qgcyd9fQorLy8vICAgLy8gZXhwZWN0ZWQtZXJyb3Ige3t2YXJpYWJsZSBoYXMgaW5jb21wbGV0ZSB0eXBlfX0KKy8vLworLy8vICAgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3t2YXJpYWJsZSBoYXMgdHlwZSAnc3RydWN0IHt7Ln19J319CisvLy8gICAvLyBleHBlY3RlZC1lcnJvci1yZSB7e3ZhcmlhYmxlIGhhcyB0eXBlICdzdHJ1Y3Qge3suKn19J319CisvLy8gICAvLyBleHBlY3RlZC1lcnJvci1yZSB7e3ZhcmlhYmxlIGhhcyB0eXBlICdzdHJ1Y3Qge3soLiopfX0nfX0KKy8vLyAgIC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7dmFyaWFibGUgaGFzIHR5cGUgJ3N0cnVjdHt7W1s6c3BhY2U6XV0oLiopfX0nfX0KKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVmVyaWZ5RGlhZ25vc3RpY0NvbnN1bWVyIGV4cGVjdHMgYXQgbGVhc3Qgb25lIGV4cGVjdGVkLSogZGlyZWN0aXZlIHRvCisvLy8gYmUgZm91bmQgaW5zaWRlIHRoZSBzb3VyY2UgY29kZS4gIElmIG5vIGRpYWdub3N0aWNzIGFyZSBleHBlY3RlZCB0aGUKKy8vLyBmb2xsb3dpbmcgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoaXM6CisvLy8KKy8vLyBcY29kZQorLy8vICAgLy8gZXhwZWN0ZWQtbm8tZGlhZ25vc3RpY3MKKy8vLyBcZW5kY29kZQorLy8vCitjbGFzcyBWZXJpZnlEaWFnbm9zdGljQ29uc3VtZXI6IHB1YmxpYyBEaWFnbm9zdGljQ29uc3VtZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDb21tZW50SGFuZGxlciB7CitwdWJsaWM6CisgIC8vLyBEaXJlY3RpdmUgLSBBYnN0cmFjdCBjbGFzcyByZXByZXNlbnRpbmcgYSBwYXJzZWQgdmVyaWZ5IGRpcmVjdGl2ZS4KKyAgLy8vCisgIGNsYXNzIERpcmVjdGl2ZSB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPERpcmVjdGl2ZT4gY3JlYXRlKGJvb2wgUmVnZXhLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRGlyZWN0aXZlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRGlhZ25vc3RpY0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTWF0Y2hBbnlMaW5lLCBTdHJpbmdSZWYgVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1pbiwgdW5zaWduZWQgTWF4KTsKKworICBwdWJsaWM6CisgICAgLy8vIENvbnN0YW50IHJlcHJlc2VudGluZyBuIG9yIG1vcmUgbWF0Y2hlcy4KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgTWF4Q291bnQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCk7CisKKyAgICBTb3VyY2VMb2NhdGlvbiBEaXJlY3RpdmVMb2M7CisgICAgU291cmNlTG9jYXRpb24gRGlhZ25vc3RpY0xvYzsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBUZXh0OworICAgIHVuc2lnbmVkIE1pbiwgTWF4OworICAgIGJvb2wgTWF0Y2hBbnlMaW5lOworCisgICAgRGlyZWN0aXZlKGNvbnN0IERpcmVjdGl2ZSAmKSA9IGRlbGV0ZTsKKyAgICBEaXJlY3RpdmUgJm9wZXJhdG9yPShjb25zdCBEaXJlY3RpdmUgJikgPSBkZWxldGU7CisgICAgdmlydHVhbCB+RGlyZWN0aXZlKCkgPSBkZWZhdWx0OworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGRpcmVjdGl2ZSB0ZXh0IGlzIHZhbGlkLgorICAgIC8vIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlIGFuZCBwb3B1bGF0ZXMgRS4KKyAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZChzdGQ6OnN0cmluZyAmRXJyb3IpID0gMDsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBvbiBtYXRjaC4KKyAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goU3RyaW5nUmVmIFMpID0gMDsKKworICBwcm90ZWN0ZWQ6CisgICAgRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIERpcmVjdGl2ZUxvYywgU291cmNlTG9jYXRpb24gRGlhZ25vc3RpY0xvYywKKyAgICAgICAgICAgICAgYm9vbCBNYXRjaEFueUxpbmUsIFN0cmluZ1JlZiBUZXh0LCB1bnNpZ25lZCBNaW4sIHVuc2lnbmVkIE1heCkKKyAgICAgICAgOiBEaXJlY3RpdmVMb2MoRGlyZWN0aXZlTG9jKSwgRGlhZ25vc3RpY0xvYyhEaWFnbm9zdGljTG9jKSwKKyAgICAgICAgICBUZXh0KFRleHQpLCBNaW4oTWluKSwgTWF4KE1heCksIE1hdGNoQW55TGluZShNYXRjaEFueUxpbmUpIHsKKyAgICAgIGFzc2VydCghRGlyZWN0aXZlTG9jLmlzSW52YWxpZCgpICYmICJEaXJlY3RpdmVMb2MgaXMgaW52YWxpZCEiKTsKKyAgICAgIGFzc2VydCgoIURpYWdub3N0aWNMb2MuaXNJbnZhbGlkKCkgfHwgTWF0Y2hBbnlMaW5lKSAmJgorICAgICAgICAgICAgICJEaWFnbm9zdGljTG9jIGlzIGludmFsaWQhIik7CisgICAgfQorICB9OworCisgIHVzaW5nIERpcmVjdGl2ZUxpc3QgPSBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGlyZWN0aXZlPj47CisKKyAgLy8vIEV4cGVjdGVkRGF0YSAtIG93bnMgZGlyZWN0aXZlIG9iamVjdHMgYW5kIGRlbGV0ZXMgb24gZGVzdHJ1Y3Rvci4KKyAgc3RydWN0IEV4cGVjdGVkRGF0YSB7CisgICAgRGlyZWN0aXZlTGlzdCBFcnJvcnM7CisgICAgRGlyZWN0aXZlTGlzdCBXYXJuaW5nczsKKyAgICBEaXJlY3RpdmVMaXN0IFJlbWFya3M7CisgICAgRGlyZWN0aXZlTGlzdCBOb3RlczsKKworICAgIHZvaWQgUmVzZXQoKSB7CisgICAgICBFcnJvcnMuY2xlYXIoKTsKKyAgICAgIFdhcm5pbmdzLmNsZWFyKCk7CisgICAgICBSZW1hcmtzLmNsZWFyKCk7CisgICAgICBOb3Rlcy5jbGVhcigpOworICAgIH0KKyAgfTsKKworICBlbnVtIERpcmVjdGl2ZVN0YXR1cyB7CisgICAgSGFzTm9EaXJlY3RpdmVzLAorICAgIEhhc05vRGlyZWN0aXZlc1JlcG9ydGVkLAorICAgIEhhc0V4cGVjdGVkTm9EaWFnbm9zdGljcywKKyAgICBIYXNPdGhlckV4cGVjdGVkRGlyZWN0aXZlcworICB9OworCitwcml2YXRlOgorICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3M7CisgIERpYWdub3N0aWNDb25zdW1lciAqUHJpbWFyeUNsaWVudDsKKyAgc3RkOjp1bmlxdWVfcHRyPERpYWdub3N0aWNDb25zdW1lcj4gUHJpbWFyeUNsaWVudE93bmVyOworICBzdGQ6OnVuaXF1ZV9wdHI8VGV4dERpYWdub3N0aWNCdWZmZXI+IEJ1ZmZlcjsKKyAgY29uc3QgUHJlcHJvY2Vzc29yICpDdXJyZW50UHJlcHJvY2Vzc29yID0gbnVsbHB0cjsKKyAgY29uc3QgTGFuZ09wdGlvbnMgKkxhbmdPcHRzID0gbnVsbHB0cjsKKyAgU291cmNlTWFuYWdlciAqU3JjTWFuYWdlciA9IG51bGxwdHI7CisgIHVuc2lnbmVkIEFjdGl2ZVNvdXJjZUZpbGVzID0gMDsKKyAgRGlyZWN0aXZlU3RhdHVzIFN0YXR1czsKKyAgRXhwZWN0ZWREYXRhIEVEOworCisgIHZvaWQgQ2hlY2tEaWFnbm9zdGljcygpOworCisgIHZvaWQgc2V0U291cmNlTWFuYWdlcihTb3VyY2VNYW5hZ2VyICZTTSkgeworICAgIGFzc2VydCgoIVNyY01hbmFnZXIgfHwgU3JjTWFuYWdlciA9PSAmU00pICYmICJTb3VyY2VNYW5hZ2VyIGNoYW5nZWQhIik7CisgICAgU3JjTWFuYWdlciA9ICZTTTsKKyAgfQorCisgIC8vIFRoZXNlIGZhY2lsaXRpZXMgYXJlIHVzZWQgZm9yIHZhbGlkYXRpb24gaW4gZGVidWcgYnVpbGRzLgorICBjbGFzcyBVbnBhcnNlZEZpbGVTdGF0dXMgeworICAgIGxsdm06OlBvaW50ZXJJbnRQYWlyPGNvbnN0IEZpbGVFbnRyeSAqLCAxLCBib29sPiBEYXRhOworCisgIHB1YmxpYzoKKyAgICBVbnBhcnNlZEZpbGVTdGF0dXMoY29uc3QgRmlsZUVudHJ5ICpGaWxlLCBib29sIEZvdW5kRGlyZWN0aXZlcykKKyAgICAgICAgOiBEYXRhKEZpbGUsIEZvdW5kRGlyZWN0aXZlcykge30KKworICAgIGNvbnN0IEZpbGVFbnRyeSAqZ2V0RmlsZSgpIGNvbnN0IHsgcmV0dXJuIERhdGEuZ2V0UG9pbnRlcigpOyB9CisgICAgYm9vbCBmb3VuZERpcmVjdGl2ZXMoKSBjb25zdCB7IHJldHVybiBEYXRhLmdldEludCgpOyB9CisgIH07CisKKyAgdXNpbmcgUGFyc2VkRmlsZXNNYXAgPSBsbHZtOjpEZW5zZU1hcDxGaWxlSUQsIGNvbnN0IEZpbGVFbnRyeSAqPjsKKyAgdXNpbmcgVW5wYXJzZWRGaWxlc01hcCA9IGxsdm06OkRlbnNlTWFwPEZpbGVJRCwgVW5wYXJzZWRGaWxlU3RhdHVzPjsKKworICBQYXJzZWRGaWxlc01hcCBQYXJzZWRGaWxlczsKKyAgVW5wYXJzZWRGaWxlc01hcCBVbnBhcnNlZEZpbGVzOworCitwdWJsaWM6CisgIC8vLyBDcmVhdGUgYSBuZXcgdmVyaWZ5aW5nIGRpYWdub3N0aWMgY2xpZW50LCB3aGljaCB3aWxsIGlzc3VlIGVycm9ycyB0bworICAvLy8gdGhlIGN1cnJlbnRseS1hdHRhY2hlZCBkaWFnbm9zdGljIGNsaWVudCB3aGVuIGEgZGlhZ25vc3RpYyBkb2VzIG5vdCBtYXRjaCAKKyAgLy8vIHdoYXQgaXMgZXhwZWN0ZWQgKGFzIGluZGljYXRlZCBpbiB0aGUgc291cmNlIGZpbGUpLgorICBWZXJpZnlEaWFnbm9zdGljQ29uc3VtZXIoRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzKTsKKyAgflZlcmlmeURpYWdub3N0aWNDb25zdW1lcigpIG92ZXJyaWRlOworCisgIHZvaWQgQmVnaW5Tb3VyY2VGaWxlKGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJlcHJvY2Vzc29yICpQUCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBFbmRTb3VyY2VGaWxlKCkgb3ZlcnJpZGU7CisKKyAgZW51bSBQYXJzZWRTdGF0dXMgeworICAgIC8vLyBGaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCB2aWEgSGFuZGxlQ29tbWVudC4KKyAgICBJc1BhcnNlZCwKKworICAgIC8vLyBGaWxlIGhhcyBkaWFnbm9zdGljcyBhbmQgbWF5IGhhdmUgZGlyZWN0aXZlcy4KKyAgICBJc1VucGFyc2VkLAorCisgICAgLy8vIEZpbGUgaGFzIGRpYWdub3N0aWNzIGJ1dCBndWFyYW50ZWVkIG5vIGRpcmVjdGl2ZXMuCisgICAgSXNVbnBhcnNlZE5vRGlyZWN0aXZlcworICB9OworCisgIC8vLyBcYnJpZWYgVXBkYXRlIGxpc3RzIG9mIHBhcnNlZCBhbmQgdW5wYXJzZWQgZmlsZXMuCisgIHZvaWQgVXBkYXRlUGFyc2VkRmlsZVN0YXR1cyhTb3VyY2VNYW5hZ2VyICZTTSwgRmlsZUlEIEZJRCwgUGFyc2VkU3RhdHVzIFBTKTsKKworICBib29sIEhhbmRsZUNvbW1lbnQoUHJlcHJvY2Vzc29yICZQUCwgU291cmNlUmFuZ2UgQ29tbWVudCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBIYW5kbGVEaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBEaWFnTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljICZJbmZvKSBvdmVycmlkZTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0ZST05URU5EX1ZFUklGWURJQUdOT1NUSUNDT05TVU1FUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZFRvb2wvVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kVG9vbC9VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNmI3YjUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZFRvb2wvVXRpbHMuaApAQCAtMCwwICsxLDM5IEBACisvLz09PS0tLSBVdGlscy5oIC0gTWlzYyB1dGlsaXRpZXMgZm9yIHRoZSBmcm9udC1lbmQgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGhlYWRlciBjb250YWlucyBtaXNjZWxsYW5lb3VzIHV0aWxpdGllcyBmb3IgdmFyaW91cyBmcm9udC1lbmQgYWN0aW9ucworLy8gIHdoaWNoIHdlcmUgc3BsaXQgZnJvbSBGcm9udGVuZCB0byBtaW5pbWlzZSBGcm9udGVuZCdzIGRlcGVuZGVuY2llcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfRlJPTlRFTkRUT09MX1VUSUxTX0gKKyNkZWZpbmUgTExWTV9DTEFOR19GUk9OVEVORFRPT0xfVVRJTFNfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBDb21waWxlckluc3RhbmNlOworY2xhc3MgRnJvbnRlbmRBY3Rpb247CisKKy8vLyBDb25zdHJ1Y3QgdGhlIEZyb250ZW5kQWN0aW9uIG9mIGEgY29tcGlsZXIgaW52b2NhdGlvbiBiYXNlZCBvbiB0aGUKKy8vLyBvcHRpb25zIHNwZWNpZmllZCBmb3IgdGhlIGNvbXBpbGVyIGludm9jYXRpb24uCisvLy8KKy8vLyBccmV0dXJuIC0gVGhlIGNyZWF0ZWQgRnJvbnRlbmRBY3Rpb24gb2JqZWN0CitzdGQ6OnVuaXF1ZV9wdHI8RnJvbnRlbmRBY3Rpb24+IENyZWF0ZUZyb250ZW5kQWN0aW9uKENvbXBpbGVySW5zdGFuY2UgJkNJKTsKKworLy8vIEV4ZWN1dGVDb21waWxlckludm9jYXRpb24gLSBFeGVjdXRlIHRoZSBnaXZlbiBhY3Rpb25zIGRlc2NyaWJlZCBieSB0aGUKKy8vLyBjb21waWxlciBpbnZvY2F0aW9uIG9iamVjdCBpbiB0aGUgZ2l2ZW4gY29tcGlsZXIgaW5zdGFuY2UuCisvLy8KKy8vLyBccmV0dXJuIC0gVHJ1ZSBvbiBzdWNjZXNzLgorYm9vbCBFeGVjdXRlQ29tcGlsZXJJbnZvY2F0aW9uKENvbXBpbGVySW5zdGFuY2UgKkNsYW5nKTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0luZGV4L0NvZGVnZW5OYW1lR2VuZXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9JbmRleC9Db2RlZ2VuTmFtZUdlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZGMxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9JbmRleC9Db2RlZ2VuTmFtZUdlbmVyYXRvci5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vPT09LSBDb2RlZ2VuTmFtZUdlbmVyYXRvci5oIC0gQ29kZWdlbiBuYW1lIGdlbmVyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGV0ZXJtaW5lcyB0aGUgbmFtZSB0aGF0IHRoZSBzeW1ib2wgd2lsbCBnZXQgZm9yIGNvZGUgZ2VuZXJhdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfSU5ERVhfQ09ERUdFTk5BTUVHRU5FUkFUT1JfSAorI2RlZmluZSBMTFZNX0NMQU5HX0lOREVYX0NPREVHRU5OQU1FR0VORVJBVE9SX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgY2xhc3MgQVNUQ29udGV4dDsKKyAgY2xhc3MgRGVjbDsKKworbmFtZXNwYWNlIGluZGV4IHsKKworY2xhc3MgQ29kZWdlbk5hbWVHZW5lcmF0b3IgeworcHVibGljOgorICBleHBsaWNpdCBDb2RlZ2VuTmFtZUdlbmVyYXRvcihBU1RDb250ZXh0ICZDdHgpOworICB+Q29kZWdlbk5hbWVHZW5lcmF0b3IoKTsKKworICAvLy8gXHJldHVybnMgdHJ1ZSBvbiBmYWlsdXJlIHRvIHByb2R1Y2UgYSBuYW1lIGZvciB0aGUgZ2l2ZW4gZGVjbCwgZmFsc2Ugb24KKyAgLy8vIHN1Y2Nlc3MuCisgIGJvb2wgd3JpdGVOYW1lKGNvbnN0IERlY2wgKkQsIHJhd19vc3RyZWFtICZPUyk7CisKKyAgLy8vIFZlcnNpb24gb2YgXGMgd3JpdGVOYW1lIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHN0cmluZy4KKyAgc3RkOjpzdHJpbmcgZ2V0TmFtZShjb25zdCBEZWNsICpEKTsKKworICAvLy8gVGhpcyBjYW4gcmV0dXJuIG11bHRpcGxlIG1hbmdsZWQgbmFtZXMgd2hlbiBhcHBsaWNhYmxlLCBlLmcuIGZvciBDKysKKyAgLy8vIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycy4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdldEFsbE1hbmdsaW5ncyhjb25zdCBEZWNsICpEKTsKKworcHJpdmF0ZToKKyAgc3RydWN0IEltcGxlbWVudGF0aW9uOworICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbGVtZW50YXRpb24+IEltcGw7Cit9OworCit9IC8vIG5hbWVzcGFjZSBpbmRleAorfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfSU5ERVhfQ09ERUdFTk5BTUVHRU5FUkFUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvSW5kZXgvQ29tbWVudFRvWE1MLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9JbmRleC9Db21tZW50VG9YTUwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGY5NTAxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvSW5kZXgvQ29tbWVudFRvWE1MLmgKQEAgLTAsMCArMSw0NyBAQAorLy89PT0tLS0gQ29tbWVudFRvWE1MLmggLSBDb252ZXJ0IGNvbW1lbnRzIHRvIFhNTCByZXByZXNlbnRhdGlvbiAtLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0lOREVYX0NPTU1FTlRUT1hNTF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfSU5ERVhfQ09NTUVOVFRPWE1MX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBjbGFuZyB7CitjbGFzcyBBU1RDb250ZXh0OworCituYW1lc3BhY2UgY29tbWVudHMgeworY2xhc3MgRnVsbENvbW1lbnQ7CitjbGFzcyBIVE1MVGFnQ29tbWVudDsKK30KKworbmFtZXNwYWNlIGluZGV4IHsKK2NsYXNzIENvbW1lbnRUb1hNTENvbnZlcnRlciB7CitwdWJsaWM6CisgIENvbW1lbnRUb1hNTENvbnZlcnRlcigpOworICB+Q29tbWVudFRvWE1MQ29udmVydGVyKCk7CisKKyAgdm9pZCBjb252ZXJ0Q29tbWVudFRvSFRNTChjb25zdCBjb21tZW50czo6RnVsbENvbW1lbnQgKkZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmSFRNTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0KTsKKworICB2b2lkIGNvbnZlcnRIVE1MVGFnTm9kZVRvVGV4dChjb25zdCBjb21tZW50czo6SFRNTFRhZ0NvbW1lbnQgKkhUQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0KTsKKworICB2b2lkIGNvbnZlcnRDb21tZW50VG9YTUwoY29uc3QgY29tbWVudHM6OkZ1bGxDb21tZW50ICpGQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmWE1MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBpbmRleAorfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfSU5ERVhfQ09NTUVOVFRPWE1MX0gKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvSW5kZXgvSW5kZXhEYXRhQ29uc3VtZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0luZGV4L0luZGV4RGF0YUNvbnN1bWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwZjRjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0luZGV4L0luZGV4RGF0YUNvbnN1bWVyLmgKQEAgLTAsMCArMSw2NyBAQAorLy89PT0tLS0gSW5kZXhEYXRhQ29uc3VtZXIuaCAtIEFic3RyYWN0IGluZGV4IGRhdGEgY29uc3VtZXIgLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0lOREVYX0lOREVYREFUQUNPTlNVTUVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19JTkRFWF9JTkRFWERBVEFDT05TVU1FUl9ICisKKyNpbmNsdWRlICJjbGFuZy9JbmRleC9JbmRleFN5bWJvbC5oIgorI2luY2x1ZGUgImNsYW5nL0xleC9QcmVwcm9jZXNzb3IuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgY2xhc3MgQVNUQ29udGV4dDsKKyAgY2xhc3MgRGVjbENvbnRleHQ7CisgIGNsYXNzIEV4cHI7CisgIGNsYXNzIEZpbGVJRDsKKyAgY2xhc3MgSWRlbnRpZmllckluZm87CisgIGNsYXNzIEltcG9ydERlY2w7CisgIGNsYXNzIE1hY3JvSW5mbzsKKworbmFtZXNwYWNlIGluZGV4IHsKKworY2xhc3MgSW5kZXhEYXRhQ29uc3VtZXIgeworcHVibGljOgorICBzdHJ1Y3QgQVNUTm9kZUluZm8geworICAgIGNvbnN0IEV4cHIgKk9yaWdFOworICAgIGNvbnN0IERlY2wgKk9yaWdEOworICAgIGNvbnN0IERlY2wgKlBhcmVudDsKKyAgICBjb25zdCBEZWNsQ29udGV4dCAqQ29udGFpbmVyREM7CisgIH07CisKKyAgdmlydHVhbCB+SW5kZXhEYXRhQ29uc3VtZXIoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBpbml0aWFsaXplKEFTVENvbnRleHQgJkN0eCkge30KKworICB2aXJ0dWFsIHZvaWQgc2V0UHJlcHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxQcmVwcm9jZXNzb3I+IFBQKSB7fQorCisgIC8vLyBccmV0dXJucyB0cnVlIHRvIGNvbnRpbnVlIGluZGV4aW5nLCBvciBmYWxzZSB0byBhYm9ydC4KKyAgdmlydHVhbCBib29sIGhhbmRsZURlY2xPY2N1cmVuY2UoY29uc3QgRGVjbCAqRCwgU3ltYm9sUm9sZVNldCBSb2xlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U3ltYm9sUmVsYXRpb24+IFJlbGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUlEIEZJRCwgdW5zaWduZWQgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1ROb2RlSW5mbyBBU1ROb2RlKTsKKworICAvLy8gXHJldHVybnMgdHJ1ZSB0byBjb250aW51ZSBpbmRleGluZywgb3IgZmFsc2UgdG8gYWJvcnQuCisgIHZpcnR1YWwgYm9vbCBoYW5kbGVNYWNyb09jY3VyZW5jZShjb25zdCBJZGVudGlmaWVySW5mbyAqTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY3JvSW5mbyAqTUksIFN5bWJvbFJvbGVTZXQgUm9sZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSUQgRklELCB1bnNpZ25lZCBPZmZzZXQpOworCisgIC8vLyBccmV0dXJucyB0cnVlIHRvIGNvbnRpbnVlIGluZGV4aW5nLCBvciBmYWxzZSB0byBhYm9ydC4KKyAgdmlydHVhbCBib29sIGhhbmRsZU1vZHVsZU9jY3VyZW5jZShjb25zdCBJbXBvcnREZWNsICpJbXBvcnRELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFJvbGVTZXQgUm9sZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUlEIEZJRCwgdW5zaWduZWQgT2Zmc2V0KTsKKworICB2aXJ0dWFsIHZvaWQgZmluaXNoKCkge30KKworcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIF9hbmNob3IoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGluZGV4Cit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0luZGV4L0luZGV4U3ltYm9sLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9JbmRleC9JbmRleFN5bWJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTVkZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9JbmRleC9JbmRleFN5bWJvbC5oCkBAIC0wLDAgKzEsMTYwIEBACisvLz09PS0tLSBJbmRleFN5bWJvbC5oIC0gVHlwZXMgYW5kIGZ1bmN0aW9ucyBmb3IgaW5kZXhpbmcgc3ltYm9scyAtLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfSU5ERVhfSU5ERVhTWU1CT0xfSAorI2RlZmluZSBMTFZNX0NMQU5HX0lOREVYX0lOREVYU1lNQk9MX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisgIGNsYXNzIERlY2w7CisgIGNsYXNzIExhbmdPcHRpb25zOworCituYW1lc3BhY2UgaW5kZXggeworCitlbnVtIGNsYXNzIFN5bWJvbEtpbmQgOiB1aW50OF90IHsKKyAgVW5rbm93biwKKworICBNb2R1bGUsCisgIE5hbWVzcGFjZSwKKyAgTmFtZXNwYWNlQWxpYXMsCisgIE1hY3JvLAorCisgIEVudW0sCisgIFN0cnVjdCwKKyAgQ2xhc3MsCisgIFByb3RvY29sLAorICBFeHRlbnNpb24sCisgIFVuaW9uLAorICBUeXBlQWxpYXMsCisKKyAgRnVuY3Rpb24sCisgIFZhcmlhYmxlLAorICBGaWVsZCwKKyAgRW51bUNvbnN0YW50LAorCisgIEluc3RhbmNlTWV0aG9kLAorICBDbGFzc01ldGhvZCwKKyAgU3RhdGljTWV0aG9kLAorICBJbnN0YW5jZVByb3BlcnR5LAorICBDbGFzc1Byb3BlcnR5LAorICBTdGF0aWNQcm9wZXJ0eSwKKworICBDb25zdHJ1Y3RvciwKKyAgRGVzdHJ1Y3RvciwKKyAgQ29udmVyc2lvbkZ1bmN0aW9uLAorCisgIFBhcmFtZXRlciwKKyAgVXNpbmcsCit9OworCitlbnVtIGNsYXNzIFN5bWJvbExhbmd1YWdlIDogdWludDhfdCB7CisgIEMsCisgIE9iakMsCisgIENYWCwKKyAgU3dpZnQsCit9OworCisvLy8gTGFuZ3VhZ2Ugc3BlY2lmaWMgc3ViLWtpbmRzLgorZW51bSBjbGFzcyBTeW1ib2xTdWJLaW5kIDogdWludDhfdCB7CisgIE5vbmUsCisgIENYWENvcHlDb25zdHJ1Y3RvciwKKyAgQ1hYTW92ZUNvbnN0cnVjdG9yLAorICBBY2Nlc3NvckdldHRlciwKKyAgQWNjZXNzb3JTZXR0ZXIsCisgIFVzaW5nVHlwZW5hbWUsCisgIFVzaW5nVmFsdWUsCit9OworCit0eXBlZGVmIHVpbnQ4X3QgU3ltYm9sUHJvcGVydHlTZXQ7CisvLy8gU2V0IG9mIHByb3BlcnRpZXMgdGhhdCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mbyBhYm91dCBhIHN5bWJvbC4KK2VudW0gY2xhc3MgU3ltYm9sUHJvcGVydHkgOiBTeW1ib2xQcm9wZXJ0eVNldCB7CisgIEdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgID0gMSA8PCAwLAorICBUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbiA9IDEgPDwgMSwKKyAgVGVtcGxhdGVTcGVjaWFsaXphdGlvbiAgICAgICAgPSAxIDw8IDIsCisgIFVuaXRUZXN0ICAgICAgICAgICAgICAgICAgICAgID0gMSA8PCAzLAorICBJQkFubm90YXRlZCAgICAgICAgICAgICAgICAgICA9IDEgPDwgNCwKKyAgSUJPdXRsZXRDb2xsZWN0aW9uICAgICAgICAgICAgPSAxIDw8IDUsCisgIEdLSW5zcGVjdGFibGUgICAgICAgICAgICAgICAgID0gMSA8PCA2LAorICBMb2NhbCAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgPDwgNywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgU3ltYm9sUHJvcGVydHlCaXROdW0gPSA4OworCisvLy8gU2V0IG9mIHJvbGVzIHRoYXQgYXJlIGF0dHJpYnV0ZWQgdG8gc3ltYm9sIG9jY3VycmVuY2VzLgorLy8vCisvLy8gTG93IDkgYml0cyBvZiBjbGFuZy1jL2luY2x1ZGUvSW5kZXguaCBDWFN5bWJvbFJvbGUgbWlycm9ycyB0aGlzIGVudW0uCitlbnVtIGNsYXNzIFN5bWJvbFJvbGUgOiB1aW50MzJfdCB7CisgIERlY2xhcmF0aW9uID0gMSA8PCAwLAorICBEZWZpbml0aW9uICA9IDEgPDwgMSwKKyAgUmVmZXJlbmNlICAgPSAxIDw8IDIsCisgIFJlYWQgICAgICAgID0gMSA8PCAzLAorICBXcml0ZSAgICAgICA9IDEgPDwgNCwKKyAgQ2FsbCAgICAgICAgPSAxIDw8IDUsCisgIER5bmFtaWMgICAgID0gMSA8PCA2LAorICBBZGRyZXNzT2YgICA9IDEgPDwgNywKKyAgSW1wbGljaXQgICAgPSAxIDw8IDgsCisKKyAgLy8gUmVsYXRpb24gcm9sZXMuCisgIFJlbGF0aW9uQ2hpbGRPZiAgICAgPSAxIDw8IDksCisgIFJlbGF0aW9uQmFzZU9mICAgICAgPSAxIDw8IDEwLAorICBSZWxhdGlvbk92ZXJyaWRlT2YgID0gMSA8PCAxMSwKKyAgUmVsYXRpb25SZWNlaXZlZEJ5ICA9IDEgPDwgMTIsCisgIFJlbGF0aW9uQ2FsbGVkQnkgICAgPSAxIDw8IDEzLAorICBSZWxhdGlvbkV4dGVuZGVkQnkgID0gMSA8PCAxNCwKKyAgUmVsYXRpb25BY2Nlc3Nvck9mICA9IDEgPDwgMTUsCisgIFJlbGF0aW9uQ29udGFpbmVkQnkgPSAxIDw8IDE2LAorICBSZWxhdGlvbklCVHlwZU9mICAgID0gMSA8PCAxNywKKyAgUmVsYXRpb25TcGVjaWFsaXphdGlvbk9mID0gMSA8PCAxOCwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgU3ltYm9sUm9sZUJpdE51bSA9IDE5OwordHlwZWRlZiB1bnNpZ25lZCBTeW1ib2xSb2xlU2V0OworCisvLy8gUmVwcmVzZW50cyBhIHJlbGF0aW9uIHRvIGFub3RoZXIgc3ltYm9sIGZvciBhIHN5bWJvbCBvY2N1cnJlbmNlLgorc3RydWN0IFN5bWJvbFJlbGF0aW9uIHsKKyAgU3ltYm9sUm9sZVNldCBSb2xlczsKKyAgY29uc3QgRGVjbCAqUmVsYXRlZFN5bWJvbDsKKworICBTeW1ib2xSZWxhdGlvbihTeW1ib2xSb2xlU2V0IFJvbGVzLCBjb25zdCBEZWNsICpTeW0pCisgICAgOiBSb2xlcyhSb2xlcyksIFJlbGF0ZWRTeW1ib2woU3ltKSB7fQorfTsKKworc3RydWN0IFN5bWJvbEluZm8geworICBTeW1ib2xLaW5kIEtpbmQ7CisgIFN5bWJvbFN1YktpbmQgU3ViS2luZDsKKyAgU3ltYm9sTGFuZ3VhZ2UgTGFuZzsKKyAgU3ltYm9sUHJvcGVydHlTZXQgUHJvcGVydGllczsKK307CisKK1N5bWJvbEluZm8gZ2V0U3ltYm9sSW5mbyhjb25zdCBEZWNsICpEKTsKKworYm9vbCBpc0Z1bmN0aW9uTG9jYWxTeW1ib2woY29uc3QgRGVjbCAqRCk7CisKK3ZvaWQgYXBwbHlGb3JFYWNoU3ltYm9sUm9sZShTeW1ib2xSb2xlU2V0IFJvbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmZ1bmN0aW9uX3JlZjx2b2lkKFN5bWJvbFJvbGUpPiBGbik7Citib29sIGFwcGx5Rm9yRWFjaFN5bWJvbFJvbGVJbnRlcnJ1cHRpYmxlKFN5bWJvbFJvbGVTZXQgUm9sZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6ZnVuY3Rpb25fcmVmPGJvb2woU3ltYm9sUm9sZSk+IEZuKTsKK3ZvaWQgcHJpbnRTeW1ib2xSb2xlcyhTeW1ib2xSb2xlU2V0IFJvbGVzLCByYXdfb3N0cmVhbSAmT1MpOworCisvLy8gXHJldHVybnMgdHJ1ZSBpZiBubyBuYW1lIHdhcyBwcmludGVkLCBmYWxzZSBvdGhlcndpc2UuCitib29sIHByaW50U3ltYm9sTmFtZShjb25zdCBEZWNsICpELCBjb25zdCBMYW5nT3B0aW9ucyAmTE8sIHJhd19vc3RyZWFtICZPUyk7CisKK1N0cmluZ1JlZiBnZXRTeW1ib2xLaW5kU3RyaW5nKFN5bWJvbEtpbmQgSyk7CitTdHJpbmdSZWYgZ2V0U3ltYm9sU3ViS2luZFN0cmluZyhTeW1ib2xTdWJLaW5kIEspOworU3RyaW5nUmVmIGdldFN5bWJvbExhbmd1YWdlU3RyaW5nKFN5bWJvbExhbmd1YWdlIEspOworCit2b2lkIGFwcGx5Rm9yRWFjaFN5bWJvbFByb3BlcnR5KFN5bWJvbFByb3BlcnR5U2V0IFByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmZ1bmN0aW9uX3JlZjx2b2lkKFN5bWJvbFByb3BlcnR5KT4gRm4pOwordm9pZCBwcmludFN5bWJvbFByb3BlcnRpZXMoU3ltYm9sUHJvcGVydHlTZXQgUHJvcHMsIHJhd19vc3RyZWFtICZPUyk7CisKK30gLy8gbmFtZXNwYWNlIGluZGV4Cit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0luZGV4L0luZGV4aW5nQWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9JbmRleC9JbmRleGluZ0FjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNzAzYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9JbmRleC9JbmRleGluZ0FjdGlvbi5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vPT09LS0tIEluZGV4aW5nQWN0aW9uLmggLSBGcm9udGVuZCBpbmRleCBhY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19JTkRFWF9JTkRFWElOR0FDVElPTl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfSU5ERVhfSU5ERVhJTkdBQ1RJT05fSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgY2xhbmcgeworICBjbGFzcyBBU1RDb250ZXh0OworICBjbGFzcyBBU1RSZWFkZXI7CisgIGNsYXNzIEFTVFVuaXQ7CisgIGNsYXNzIERlY2w7CisgIGNsYXNzIEZyb250ZW5kQWN0aW9uOworCituYW1lc3BhY2Ugc2VyaWFsaXphdGlvbiB7CisgIGNsYXNzIE1vZHVsZUZpbGU7Cit9CisKK25hbWVzcGFjZSBpbmRleCB7CisgIGNsYXNzIEluZGV4RGF0YUNvbnN1bWVyOworCitzdHJ1Y3QgSW5kZXhpbmdPcHRpb25zIHsKKyAgZW51bSBjbGFzcyBTeXN0ZW1TeW1ib2xGaWx0ZXJLaW5kIHsKKyAgICBOb25lLAorICAgIERlY2xhcmF0aW9uc09ubHksCisgICAgQWxsLAorICB9OworCisgIFN5c3RlbVN5bWJvbEZpbHRlcktpbmQgU3lzdGVtU3ltYm9sRmlsdGVyCisgICAgPSBTeXN0ZW1TeW1ib2xGaWx0ZXJLaW5kOjpEZWNsYXJhdGlvbnNPbmx5OworICBib29sIEluZGV4RnVuY3Rpb25Mb2NhbHMgPSBmYWxzZTsKK307CisKKy8vLyBccGFyYW0gV3JhcHBlZEFjdGlvbiBhbm90aGVyIGZyb250ZW5kIGFjdGlvbiB0byB3cmFwIG92ZXIgb3IgbnVsbC4KK3N0ZDo6dW5pcXVlX3B0cjxGcm9udGVuZEFjdGlvbj4KK2NyZWF0ZUluZGV4aW5nQWN0aW9uKHN0ZDo6c2hhcmVkX3B0cjxJbmRleERhdGFDb25zdW1lcj4gRGF0YUNvbnN1bWVyLAorICAgICAgICAgICAgICAgICAgICAgSW5kZXhpbmdPcHRpb25zIE9wdHMsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RnJvbnRlbmRBY3Rpb24+IFdyYXBwZWRBY3Rpb24pOworCit2b2lkIGluZGV4QVNUVW5pdChBU1RVbml0ICZVbml0LAorICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEluZGV4RGF0YUNvbnN1bWVyPiBEYXRhQ29uc3VtZXIsCisgICAgICAgICAgICAgICAgICBJbmRleGluZ09wdGlvbnMgT3B0cyk7CisKK3ZvaWQgaW5kZXhUb3BMZXZlbERlY2xzKEFTVENvbnRleHQgJkN0eCwgQXJyYXlSZWY8Y29uc3QgRGVjbCAqPiBEZWNscywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbmRleERhdGFDb25zdW1lcj4gRGF0YUNvbnN1bWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhpbmdPcHRpb25zIE9wdHMpOworCit2b2lkIGluZGV4TW9kdWxlRmlsZShzZXJpYWxpemF0aW9uOjpNb2R1bGVGaWxlICZNb2QsIEFTVFJlYWRlciAmUmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEluZGV4RGF0YUNvbnN1bWVyPiBEYXRhQ29uc3VtZXIsCisgICAgICAgICAgICAgICAgICAgICBJbmRleGluZ09wdGlvbnMgT3B0cyk7CisKK30gLy8gbmFtZXNwYWNlIGluZGV4Cit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0luZGV4L1VTUkdlbmVyYXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0luZGV4L1VTUkdlbmVyYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzY2MWJkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvSW5kZXgvVVNSR2VuZXJhdGlvbi5oCkBAIC0wLDAgKzEsNzcgQEAKKy8vPT09LSBVU1JHZW5lcmF0aW9uLmggLSBSb3V0aW5lcyBmb3IgVVNSIGdlbmVyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19JTkRFWF9VU1JHRU5FUkFUSU9OX0gKKyNkZWZpbmUgTExWTV9DTEFOR19JTkRFWF9VU1JHRU5FUkFUSU9OX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK2NsYXNzIERlY2w7CitjbGFzcyBNYWNyb0RlZmluaXRpb25SZWNvcmQ7CitjbGFzcyBTb3VyY2VMb2NhdGlvbjsKK2NsYXNzIFNvdXJjZU1hbmFnZXI7CisKK25hbWVzcGFjZSBpbmRleCB7CisKK3N0YXRpYyBpbmxpbmUgU3RyaW5nUmVmIGdldFVTUlNwYWNlUHJlZml4KCkgeworICByZXR1cm4gImM6IjsKK30KKworLy8vIFxicmllZiBHZW5lcmF0ZSBhIFVTUiBmb3IgYSBEZWNsLCBpbmNsdWRpbmcgdGhlIFVTUiBwcmVmaXguCisvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGUgcmVzdWx0cyBzaG91bGQgYmUgaWdub3JlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorYm9vbCBnZW5lcmF0ZVVTUkZvckRlY2woY29uc3QgRGVjbCAqRCwgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZCdWYpOworCisvLy8gXGJyaWVmIEdlbmVyYXRlIGEgVVNSIGZyYWdtZW50IGZvciBhbiBPYmplY3RpdmUtQyBjbGFzcy4KK3ZvaWQgZ2VuZXJhdGVVU1JGb3JPYmpDQ2xhc3MoU3RyaW5nUmVmIENscywgcmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRXh0U3ltYm9sRGVmaW5lZEluID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDYXRlZ29yeUNvbnRleHRFeHRTeW1ib2xEZWZpbmVkSW4gPSAiIik7CisKKy8vLyBcYnJpZWYgR2VuZXJhdGUgYSBVU1IgZnJhZ21lbnQgZm9yIGFuIE9iamVjdGl2ZS1DIGNsYXNzIGNhdGVnb3J5Lgordm9pZCBnZW5lcmF0ZVVTUkZvck9iakNDYXRlZ29yeShTdHJpbmdSZWYgQ2xzLCBTdHJpbmdSZWYgQ2F0LCByYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDbHNFeHRTeW1ib2xEZWZpbmVkSW4gPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENhdEV4dFN5bWJvbERlZmluZWRJbiA9ICIiKTsKKworLy8vIFxicmllZiBHZW5lcmF0ZSBhIFVTUiBmcmFnbWVudCBmb3IgYW4gT2JqZWN0aXZlLUMgaW5zdGFuY2UgdmFyaWFibGUuICBUaGUKKy8vLyBjb21wbGV0ZSBVU1IgY2FuIGJlIGNyZWF0ZWQgYnkgY29uY2F0ZW5hdGluZyB0aGUgVVNSIGZvciB0aGUKKy8vLyBlbmNvbXBhc3NpbmcgY2xhc3Mgd2l0aCB0aGlzIFVTUiBmcmFnbWVudC4KK3ZvaWQgZ2VuZXJhdGVVU1JGb3JPYmpDSXZhcihTdHJpbmdSZWYgSXZhciwgcmF3X29zdHJlYW0gJk9TKTsKKworLy8vIFxicmllZiBHZW5lcmF0ZSBhIFVTUiBmcmFnbWVudCBmb3IgYW4gT2JqZWN0aXZlLUMgbWV0aG9kLgordm9pZCBnZW5lcmF0ZVVTUkZvck9iakNNZXRob2QoU3RyaW5nUmVmIFNlbCwgYm9vbCBJc0luc3RhbmNlTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKTsKKworLy8vIFxicmllZiBHZW5lcmF0ZSBhIFVTUiBmcmFnbWVudCBmb3IgYW4gT2JqZWN0aXZlLUMgcHJvcGVydHkuCit2b2lkIGdlbmVyYXRlVVNSRm9yT2JqQ1Byb3BlcnR5KFN0cmluZ1JlZiBQcm9wLCBib29sIGlzQ2xhc3NQcm9wLCByYXdfb3N0cmVhbSAmT1MpOworCisvLy8gXGJyaWVmIEdlbmVyYXRlIGEgVVNSIGZyYWdtZW50IGZvciBhbiBPYmplY3RpdmUtQyBwcm90b2NvbC4KK3ZvaWQgZ2VuZXJhdGVVU1JGb3JPYmpDUHJvdG9jb2woU3RyaW5nUmVmIFByb3QsIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEV4dFN5bWJvbERlZmluZWRJbiA9ICIiKTsKKworLy8vIEdlbmVyYXRlIFVTUiBmcmFnbWVudCBmb3IgYSBnbG9iYWwgKG5vbi1uZXN0ZWQpIGVudW0uCit2b2lkIGdlbmVyYXRlVVNSRm9yR2xvYmFsRW51bShTdHJpbmdSZWYgRW51bU5hbWUsIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBFeHRTeW1ib2xEZWZpbmVkSW4gPSAiIik7CisKKy8vLyBHZW5lcmF0ZSBhIFVTUiBmcmFnbWVudCBmb3IgYW4gZW51bSBjb25zdGFudC4KK3ZvaWQgZ2VuZXJhdGVVU1JGb3JFbnVtQ29uc3RhbnQoU3RyaW5nUmVmIEVudW1Db25zdGFudE5hbWUsIHJhd19vc3RyZWFtICZPUyk7CisKKy8vLyBcYnJpZWYgR2VuZXJhdGUgYSBVU1IgZm9yIGEgbWFjcm8sIGluY2x1ZGluZyB0aGUgVVNSIHByZWZpeC4KKy8vLworLy8vIFxyZXR1cm5zIHRydWUgb24gZXJyb3IsIGZhbHNlIG9uIHN1Y2Nlc3MuCitib29sIGdlbmVyYXRlVVNSRm9yTWFjcm8oY29uc3QgTWFjcm9EZWZpbml0aW9uUmVjb3JkICpNRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZCdWYpOworYm9vbCBnZW5lcmF0ZVVTUkZvck1hY3JvKFN0cmluZ1JlZiBNYWNyb05hbWUsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZCdWYpOworCit9IC8vIG5hbWVzcGFjZSBpbmRleAorfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfSURFX1VTUkdFTkVSQVRJT05fSAorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvQ29kZUNvbXBsZXRpb25IYW5kbGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvQ29kZUNvbXBsZXRpb25IYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjM2I3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9Db2RlQ29tcGxldGlvbkhhbmRsZXIuaApAQCAtMCwwICsxLDcxIEBACisvLz09PS0tLSBDb2RlQ29tcGxldGlvbkhhbmRsZXIuaCAtIFByZXByb2Nlc3NvciBjb2RlIGNvbXBsZXRpb24gLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQ29kZUNvbXBsZXRpb25IYW5kbGVyIGludGVyZmFjZSwgd2hpY2ggcHJvdmlkZXMKKy8vICBjb2RlLWNvbXBsZXRpb24gY2FsbGJhY2tzIGZvciB0aGUgcHJlcHJvY2Vzc29yLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fQ0xBTkdfTEVYX0NPREVDT01QTEVUSU9OSEFORExFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfTEVYX0NPREVDT01QTEVUSU9OSEFORExFUl9ICisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIElkZW50aWZpZXJJbmZvOworY2xhc3MgTWFjcm9JbmZvOworICAKKy8vLyBcYnJpZWYgQ2FsbGJhY2sgaGFuZGxlciB0aGF0IHJlY2VpdmVzIG5vdGlmaWNhdGlvbnMgd2hlbiBwZXJmb3JtaW5nIGNvZGUgCisvLy8gY29tcGxldGlvbiB3aXRoaW4gdGhlIHByZXByb2Nlc3Nvci4KK2NsYXNzIENvZGVDb21wbGV0aW9uSGFuZGxlciB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkNvZGVDb21wbGV0aW9uSGFuZGxlcigpOworICAKKyAgLy8vIFxicmllZiBDYWxsYmFjayBpbnZva2VkIHdoZW4gcGVyZm9ybWluZyBjb2RlIGNvbXBsZXRpb24gZm9yIGEgcHJlcHJvY2Vzc29yCisgIC8vLyBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gVGhpcyBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgcHJlcHJvY2Vzc29yIHByb2Nlc3NlcyBhICcjJyBhdCB0aGUKKyAgLy8vIHN0YXJ0IG9mIGEgbGluZSwgZm9sbG93ZWQgYnkgdGhlIGNvZGUtY29tcGxldGlvbiB0b2tlbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gSW5Db25kaXRpb25hbCBXaGV0aGVyIHdlJ3JlIGluc2lkZSBhIHByZXByb2Nlc3NvciBjb25kaXRpb25hbAorICAvLy8gYWxyZWFkeS4KKyAgdmlydHVhbCB2b2lkIENvZGVDb21wbGV0ZURpcmVjdGl2ZShib29sIEluQ29uZGl0aW9uYWwpIHsgfQorICAKKyAgLy8vIFxicmllZiBDYWxsYmFjayBpbnZva2VkIHdoZW4gcGVyZm9ybWluZyBjb2RlIGNvbXBsZXRpb24gd2l0aGluIGEgYmxvY2sgb2YKKyAgLy8vIGNvZGUgdGhhdCB3YXMgZXhjbHVkZWQgZHVlIHRvIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMuCisgIHZpcnR1YWwgdm9pZCBDb2RlQ29tcGxldGVJbkNvbmRpdGlvbmFsRXhjbHVzaW9uKCkgeyB9CisgIAorICAvLy8gXGJyaWVmIENhbGxiYWNrIGludm9rZWQgd2hlbiBwZXJmb3JtaW5nIGNvZGUgY29tcGxldGlvbiBpbiBhIGNvbnRleHQKKyAgLy8vIHdoZXJlIHRoZSBuYW1lIG9mIGEgbWFjcm8gaXMgZXhwZWN0ZWQuCisgIC8vLworICAvLy8gXHBhcmFtIElzRGVmaW5pdGlvbiBXaGV0aGVyIHRoaXMgaXMgdGhlIGRlZmluaXRpb24gb2YgYSBtYWNybywgZS5nLiwKKyAgLy8vIGluIGEgXCNkZWZpbmUuCisgIHZpcnR1YWwgdm9pZCBDb2RlQ29tcGxldGVNYWNyb05hbWUoYm9vbCBJc0RlZmluaXRpb24pIHsgfQorICAKKyAgLy8vIFxicmllZiBDYWxsYmFjayBpbnZva2VkIHdoZW4gcGVyZm9ybWluZyBjb2RlIGNvbXBsZXRpb24gaW4gYSBwcmVwcm9jZXNzb3IKKyAgLy8vIGV4cHJlc3Npb24sIHN1Y2ggYXMgdGhlIGNvbmRpdGlvbiBvZiBhbiBcI2lmIG9yIFwjZWxpZiBkaXJlY3RpdmUuCisgIHZpcnR1YWwgdm9pZCBDb2RlQ29tcGxldGVQcmVwcm9jZXNzb3JFeHByZXNzaW9uKCkgeyB9CisgIAorICAvLy8gXGJyaWVmIENhbGxiYWNrIGludm9rZWQgd2hlbiBwZXJmb3JtaW5nIGNvZGUgY29tcGxldGlvbiBpbnNpZGUgYSAKKyAgLy8vIGZ1bmN0aW9uLWxpa2UgbWFjcm8gYXJndW1lbnQuCisgIC8vLworICAvLy8gVGhlcmUgd2lsbCBiZSBhbm90aGVyIGNhbGxiYWNrIGludm9jYXRpb24gYWZ0ZXIgdGhlIG1hY3JvIGFyZ3VtZW50cyBhcmUKKyAgLy8vIHBhcnNlZCwgc28gdGhpcyBjYWxsYmFjayBzaG91bGQgZ2VuZXJhbGx5IGJlIHVzZWQgdG8gbm90ZSB0aGF0IHRoZSBuZXh0CisgIC8vLyBjYWxsYmFjayBpcyBpbnZva2VkIGluc2lkZSBhIG1hY3JvIGFyZ3VtZW50LgorICB2aXJ0dWFsIHZvaWQgQ29kZUNvbXBsZXRlTWFjcm9Bcmd1bWVudChJZGVudGlmaWVySW5mbyAqTWFjcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvSW5mbyAqTWFjcm9JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBcmd1bWVudEluZGV4KSB7IH0KKworICAvLy8gXGJyaWVmIENhbGxiYWNrIGludm9rZWQgd2hlbiBwZXJmb3JtaW5nIGNvZGUgY29tcGxldGlvbiBpbiBhIHBhcnQgb2YgdGhlCisgIC8vLyBmaWxlIHdoZXJlIHdlIGV4cGVjdCBuYXR1cmFsIGxhbmd1YWdlLCBlLmcuLCBhIGNvbW1lbnQsIHN0cmluZywgb3IgCisgIC8vLyBcI2Vycm9yIGRpcmVjdGl2ZS4KKyAgdmlydHVhbCB2b2lkIENvZGVDb21wbGV0ZU5hdHVyYWxMYW5ndWFnZSgpIHsgfQorfTsKKyAgCit9CisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0xFWF9DT0RFQ09NUExFVElPTkhBTkRMRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L0RpcmVjdG9yeUxvb2t1cC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L0RpcmVjdG9yeUxvb2t1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZDU4ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvRGlyZWN0b3J5TG9va3VwLmgKQEAgLTAsMCArMSwyMDAgQEAKKy8vPT09LS0tIERpcmVjdG9yeUxvb2t1cC5oIC0gSW5mbyBmb3Igc2VhcmNoaW5nIGZvciBoZWFkZXJzIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIERpcmVjdG9yeUxvb2t1cCBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0xFWF9ESVJFQ1RPUllMT09LVVBfSAorI2RlZmluZSBMTFZNX0NMQU5HX0xFWF9ESVJFQ1RPUllMT09LVVBfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9MZXgvTW9kdWxlTWFwLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CitjbGFzcyBIZWFkZXJNYXA7CitjbGFzcyBEaXJlY3RvcnlFbnRyeTsKK2NsYXNzIEZpbGVFbnRyeTsKK2NsYXNzIEhlYWRlclNlYXJjaDsKK2NsYXNzIE1vZHVsZTsKKyAgCisvLy8gRGlyZWN0b3J5TG9va3VwIC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIG9uZSBlbnRyeSBpbiB0aGUgc2VhcmNoIGxpc3QgdGhhdAorLy8vIHNwZWNpZmllcyB0aGUgc2VhcmNoIG9yZGVyIGZvciBkaXJlY3RvcmllcyBpbiBcI2luY2x1ZGUgZGlyZWN0aXZlcy4gIEl0CisvLy8gcmVwcmVzZW50cyBlaXRoZXIgYSBkaXJlY3RvcnksIGEgZnJhbWV3b3JrLCBvciBhIGhlYWRlcm1hcC4KKy8vLworY2xhc3MgRGlyZWN0b3J5TG9va3VwIHsKK3B1YmxpYzoKKyAgZW51bSBMb29rdXBUeXBlX3QgeworICAgIExUX05vcm1hbERpciwKKyAgICBMVF9GcmFtZXdvcmssCisgICAgTFRfSGVhZGVyTWFwCisgIH07Citwcml2YXRlOgorICB1bmlvbiB7ICAvLyBUaGlzIHVuaW9uIGlzIGRpc2NyaW1pbmF0ZWQgYnkgaXNIZWFkZXJNYXAuCisgICAgLy8vIERpciAtIFRoaXMgaXMgdGhlIGFjdHVhbCBkaXJlY3RvcnkgdGhhdCB3ZSdyZSByZWZlcnJpbmcgdG8gZm9yIGEgbm9ybWFsCisgICAgLy8vIGRpcmVjdG9yeSBvciBhIGZyYW1ld29yay4KKyAgICBjb25zdCBEaXJlY3RvcnlFbnRyeSAqRGlyOworCisgICAgLy8vIE1hcCAtIFRoaXMgaXMgdGhlIEhlYWRlck1hcCBpZiB0aGlzIGlzIGEgaGVhZGVybWFwIGxvb2t1cC4KKyAgICAvLy8KKyAgICBjb25zdCBIZWFkZXJNYXAgKk1hcDsKKyAgfSB1OworCisgIC8vLyBEaXJDaGFyYWN0ZXJpc3RpYyAtIFRoZSB0eXBlIG9mIGRpcmVjdG9yeSB0aGlzIGlzOiB0aGlzIGlzIGFuIGluc3RhbmNlIG9mCisgIC8vLyBTcmNNZ3I6OkNoYXJhY3RlcmlzdGljS2luZC4KKyAgdW5zaWduZWQgRGlyQ2hhcmFjdGVyaXN0aWMgOiAyOworCisgIC8vLyBMb29rdXBUeXBlIC0gVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIERpcmVjdG9yeUxvb2t1cCBvYmplY3QgaXMgYQorICAvLy8gbm9ybWFsIGRpcmVjdG9yeSwgYSBmcmFtZXdvcmssIG9yIGEgaGVhZGVybWFwLgorICB1bnNpZ25lZCBMb29rdXBUeXBlIDogMjsKKyAgCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGlzIGEgaGVhZGVyIG1hcCB1c2VkIHdoZW4gYnVpbGRpbmcgYSBmcmFtZXdvcmsuCisgIHVuc2lnbmVkIElzSW5kZXhIZWFkZXJNYXAgOiAxOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB3ZSd2ZSBwZXJmb3JtZWQgYW4gZXhoYXVzdGl2ZSBzZWFyY2ggZm9yIG1vZHVsZSBtYXBzCisgIC8vLyB3aXRoaW4gdGhlIHN1YmRpcmVjdG9yaWVzIG9mIHRoaXMgZGlyZWN0b3J5LgorICB1bnNpZ25lZCBTZWFyY2hlZEFsbE1vZHVsZU1hcHMgOiAxOworICAKK3B1YmxpYzoKKyAgLy8vIERpcmVjdG9yeUxvb2t1cCBjdG9yIC0gTm90ZSB0aGF0IHRoaXMgY3RvciAqZG9lcyBub3QgdGFrZSBvd25lcnNoaXAqIG9mCisgIC8vLyAnZGlyJy4KKyAgRGlyZWN0b3J5TG9va3VwKGNvbnN0IERpcmVjdG9yeUVudHJ5ICpkaXIsIFNyY01ncjo6Q2hhcmFjdGVyaXN0aWNLaW5kIERULAorICAgICAgICAgICAgICAgICAgYm9vbCBpc0ZyYW1ld29yaykKKyAgICA6IERpckNoYXJhY3RlcmlzdGljKERUKSwKKyAgICAgIExvb2t1cFR5cGUoaXNGcmFtZXdvcmsgPyBMVF9GcmFtZXdvcmsgOiBMVF9Ob3JtYWxEaXIpLAorICAgICAgSXNJbmRleEhlYWRlck1hcChmYWxzZSksIFNlYXJjaGVkQWxsTW9kdWxlTWFwcyhmYWxzZSkgeworICAgIHUuRGlyID0gZGlyOworICB9CisKKyAgLy8vIERpcmVjdG9yeUxvb2t1cCBjdG9yIC0gTm90ZSB0aGF0IHRoaXMgY3RvciAqZG9lcyBub3QgdGFrZSBvd25lcnNoaXAqIG9mCisgIC8vLyAnbWFwJy4KKyAgRGlyZWN0b3J5TG9va3VwKGNvbnN0IEhlYWRlck1hcCAqbWFwLCBTcmNNZ3I6OkNoYXJhY3RlcmlzdGljS2luZCBEVCwKKyAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbmRleEhlYWRlck1hcCkKKyAgICA6IERpckNoYXJhY3RlcmlzdGljKERUKSwgTG9va3VwVHlwZShMVF9IZWFkZXJNYXApLAorICAgICAgSXNJbmRleEhlYWRlck1hcChpc0luZGV4SGVhZGVyTWFwKSwgU2VhcmNoZWRBbGxNb2R1bGVNYXBzKGZhbHNlKSB7CisgICAgdS5NYXAgPSBtYXA7CisgIH0KKworICAvLy8gZ2V0TG9va3VwVHlwZSAtIFJldHVybiB0aGUga2luZCBvZiBkaXJlY3RvcnkgbG9va3VwIHRoYXQgdGhpcyBpczogZWl0aGVyIGEKKyAgLy8vIG5vcm1hbCBkaXJlY3RvcnksIGEgZnJhbWV3b3JrIHBhdGgsIG9yIGEgSGVhZGVyTWFwLgorICBMb29rdXBUeXBlX3QgZ2V0TG9va3VwVHlwZSgpIGNvbnN0IHsgcmV0dXJuIChMb29rdXBUeXBlX3QpTG9va3VwVHlwZTsgfQorCisgIC8vLyBnZXROYW1lIC0gUmV0dXJuIHRoZSBkaXJlY3Rvcnkgb3IgZmlsZW5hbWUgY29ycmVzcG9uZGluZyB0byB0aGlzIGxvb2t1cAorICAvLy8gb2JqZWN0LgorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0OworCisgIC8vLyBnZXREaXIgLSBSZXR1cm4gdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgZW50cnkgcmVmZXJzIHRvLgorICAvLy8KKyAgY29uc3QgRGlyZWN0b3J5RW50cnkgKmdldERpcigpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNOb3JtYWxEaXIoKSA/IHUuRGlyIDogbnVsbHB0cjsKKyAgfQorCisgIC8vLyBnZXRGcmFtZXdvcmtEaXIgLSBSZXR1cm4gdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgZnJhbWV3b3JrIHJlZmVycyB0by4KKyAgLy8vCisgIGNvbnN0IERpcmVjdG9yeUVudHJ5ICpnZXRGcmFtZXdvcmtEaXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRnJhbWV3b3JrKCkgPyB1LkRpciA6IG51bGxwdHI7CisgIH0KKworICAvLy8gZ2V0SGVhZGVyTWFwIC0gUmV0dXJuIHRoZSBkaXJlY3RvcnkgdGhhdCB0aGlzIGVudHJ5IHJlZmVycyB0by4KKyAgLy8vCisgIGNvbnN0IEhlYWRlck1hcCAqZ2V0SGVhZGVyTWFwKCkgY29uc3QgeworICAgIHJldHVybiBpc0hlYWRlck1hcCgpID8gdS5NYXAgOiBudWxscHRyOworICB9CisKKyAgLy8vIGlzTm9ybWFsRGlyIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIG5vcm1hbCBkaXJlY3RvcnksIG5vdCBhIGhlYWRlciBtYXAuCisgIGJvb2wgaXNOb3JtYWxEaXIoKSBjb25zdCB7IHJldHVybiBnZXRMb29rdXBUeXBlKCkgPT0gTFRfTm9ybWFsRGlyOyB9CisKKyAgLy8vIGlzRnJhbWV3b3JrIC0gVHJ1ZSBpZiB0aGlzIGlzIGEgZnJhbWV3b3JrIGRpcmVjdG9yeS4KKyAgLy8vCisgIGJvb2wgaXNGcmFtZXdvcmsoKSBjb25zdCB7IHJldHVybiBnZXRMb29rdXBUeXBlKCkgPT0gTFRfRnJhbWV3b3JrOyB9CisKKyAgLy8vIGlzSGVhZGVyTWFwIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGhlYWRlciBtYXAsIG5vdCBhIG5vcm1hbCBkaXJlY3RvcnkuCisgIGJvb2wgaXNIZWFkZXJNYXAoKSBjb25zdCB7IHJldHVybiBnZXRMb29rdXBUeXBlKCkgPT0gTFRfSGVhZGVyTWFwOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB3ZSBoYXZlIGFscmVhZHkgc2VhcmNoZWQgdGhpcyBlbnRpcmUKKyAgLy8vIGRpcmVjdG9yeSBmb3IgbW9kdWxlIG1hcHMuCisgIGJvb2wgaGF2ZVNlYXJjaGVkQWxsTW9kdWxlTWFwcygpIGNvbnN0IHsgcmV0dXJuIFNlYXJjaGVkQWxsTW9kdWxlTWFwczsgfQorCisgIC8vLyBcYnJpZWYgU3BlY2lmeSB3aGV0aGVyIHdlIGhhdmUgYWxyZWFkeSBzZWFyY2hlZCBhbGwgb2YgdGhlIHN1YmRpcmVjdG9yaWVzCisgIC8vLyBmb3IgbW9kdWxlIG1hcHMuCisgIHZvaWQgc2V0U2VhcmNoZWRBbGxNb2R1bGVNYXBzKGJvb2wgU0FNTSkgeworICAgIFNlYXJjaGVkQWxsTW9kdWxlTWFwcyA9IFNBTU07CisgIH0KKworICAvLy8gRGlyQ2hhcmFjdGVyaXN0aWMgLSBUaGUgdHlwZSBvZiBkaXJlY3RvcnkgdGhpcyBpcywgb25lIG9mIHRoZSBEaXJUeXBlIGVudW0KKyAgLy8vIHZhbHVlcy4KKyAgU3JjTWdyOjpDaGFyYWN0ZXJpc3RpY0tpbmQgZ2V0RGlyQ2hhcmFjdGVyaXN0aWMoKSBjb25zdCB7CisgICAgcmV0dXJuIChTcmNNZ3I6OkNoYXJhY3RlcmlzdGljS2luZClEaXJDaGFyYWN0ZXJpc3RpYzsKKyAgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGRlc2NyaWJlcyBhIHN5c3RlbSBoZWFkZXIgZGlyZWN0b3J5LgorICBib29sIGlzU3lzdGVtSGVhZGVyRGlyZWN0b3J5KCkgY29uc3QgeworICAgIHJldHVybiBnZXREaXJDaGFyYWN0ZXJpc3RpYygpICE9IFNyY01ncjo6Q19Vc2VyOworICB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgaGVhZGVyIG1hcCBpcyBidWlsZGluZyBhIGZyYW1ld29yayBvciBub3QuCisgIGJvb2wgaXNJbmRleEhlYWRlck1hcCgpIGNvbnN0IHsgCisgICAgcmV0dXJuIGlzSGVhZGVyTWFwKCkgJiYgSXNJbmRleEhlYWRlck1hcDsgCisgIH0KKyAgCisgIC8vLyBMb29rdXBGaWxlIC0gTG9va3VwIHRoZSBzcGVjaWZpZWQgZmlsZSBpbiB0aGlzIHNlYXJjaCBwYXRoLCByZXR1cm5pbmcgaXQKKyAgLy8vIGlmIGl0IGV4aXN0cyBvciByZXR1cm5pbmcgbnVsbCBpZiBub3QuCisgIC8vLworICAvLy8gXHBhcmFtIEZpbGVuYW1lIFRoZSBmaWxlIHRvIGxvb2sgdXAgcmVsYXRpdmUgdG8gdGhlIHNlYXJjaCBwYXRocy4KKyAgLy8vCisgIC8vLyBccGFyYW0gSFMgVGhlIGhlYWRlciBzZWFyY2ggaW5zdGFuY2UgdG8gc2VhcmNoIHdpdGguCisgIC8vLworICAvLy8gXHBhcmFtIEluY2x1ZGVMb2MgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgI2luY2x1ZGUgb3IgI2ltcG9ydAorICAvLy8gZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTZWFyY2hQYXRoIElmIG5vdCBOVUxMLCB3aWxsIGJlIHNldCB0byB0aGUgc2VhcmNoIHBhdGggcmVsYXRpdmUKKyAgLy8vIHRvIHdoaWNoIHRoZSBmaWxlIHdhcyBmb3VuZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gUmVsYXRpdmVQYXRoIElmIG5vdCBOVUxMLCB3aWxsIGJlIHNldCB0byB0aGUgcGF0aCByZWxhdGl2ZSB0bworICAvLy8gU2VhcmNoUGF0aCBhdCB3aGljaCB0aGUgZmlsZSB3YXMgZm91bmQuIFRoaXMgb25seSBkaWZmZXJzIGZyb20gdGhlCisgIC8vLyBGaWxlbmFtZSBmb3IgZnJhbWV3b3JrIGluY2x1ZGVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSZXF1ZXN0aW5nTW9kdWxlIFRoZSBtb2R1bGUgaW4gd2hpY2ggdGhlIGxvb2t1cCB3YXMgcGVyZm9ybWVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdWdnZXN0ZWRNb2R1bGUgSWYgbm9uLW51bGwsIGFuZCB0aGUgZmlsZSBmb3VuZCBpcyBzZW1hbnRpY2FsbHkKKyAgLy8vIHBhcnQgb2YgYSBrbm93biBtb2R1bGUsIHRoaXMgd2lsbCBiZSBzZXQgdG8gdGhlIG1vZHVsZSB0aGF0IHNob3VsZAorICAvLy8gYmUgaW1wb3J0ZWQgaW5zdGVhZCBvZiBwcmVwcm9jZXNzaW5nL3BhcnNpbmcgdGhlIGZpbGUgZm91bmQuCisgIC8vLworICAvLy8gXHBhcmFtIFtvdXRdIEluVXNlclNwZWNpZmllZFN5c3RlbUZyYW1ld29yayBJZiB0aGUgZmlsZSBpcyBmb3VuZCwKKyAgLy8vIHNldCB0byB0cnVlIGlmIHRoZSBmaWxlIGlzIGxvY2F0ZWQgaW4gYSBmcmFtZXdvcmsgdGhhdCBoYXMgYmVlbgorICAvLy8gdXNlci1zcGVjaWZpZWQgdG8gYmUgdHJlYXRlZCBhcyBhIHN5c3RlbSBmcmFtZXdvcmsuCisgIC8vLworICAvLy8gXHBhcmFtIFtvdXRdIE1hcHBlZE5hbWUgaWYgdGhpcyBpcyBhIGhlYWRlcm1hcCB3aGljaCBtYXBzIHRoZSBmaWxlbmFtZSB0bworICAvLy8gYSBmcmFtZXdvcmsgaW5jbHVkZSAoIkZvby5oIiAtPiAiRm9vL0Zvby5oIiksIHNldCB0aGUgbmV3IG5hbWUgdG8gdGhpcworICAvLy8gdmVjdG9yIGFuZCBwb2ludCBGaWxlbmFtZSB0byBpdC4KKyAgY29uc3QgRmlsZUVudHJ5ICpMb29rdXBGaWxlKFN0cmluZ1JlZiAmRmlsZW5hbWUsIEhlYWRlclNlYXJjaCAmSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJbmNsdWRlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICpTZWFyY2hQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICpSZWxhdGl2ZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUgKlJlcXVlc3RpbmdNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVNYXA6Oktub3duSGVhZGVyICpTdWdnZXN0ZWRNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZJblVzZXJTcGVjaWZpZWRTeXN0ZW1GcmFtZXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZIYXNCZWVuTWFwcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZNYXBwZWROYW1lKSBjb25zdDsKKworcHJpdmF0ZToKKyAgY29uc3QgRmlsZUVudHJ5ICpEb0ZyYW1ld29ya0xvb2t1cCgKKyAgICAgIFN0cmluZ1JlZiBGaWxlbmFtZSwgSGVhZGVyU2VhcmNoICZIUywKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAqU2VhcmNoUGF0aCwKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAqUmVsYXRpdmVQYXRoLAorICAgICAgTW9kdWxlICpSZXF1ZXN0aW5nTW9kdWxlLAorICAgICAgTW9kdWxlTWFwOjpLbm93bkhlYWRlciAqU3VnZ2VzdGVkTW9kdWxlLAorICAgICAgYm9vbCAmSW5Vc2VyU3BlY2lmaWVkU3lzdGVtSGVhZGVyKSBjb25zdDsKKworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9FeHRlcm5hbFByZXByb2Nlc3NvclNvdXJjZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L0V4dGVybmFsUHJlcHJvY2Vzc29yU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRmOGU3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9FeHRlcm5hbFByZXByb2Nlc3NvclNvdXJjZS5oCkBAIC0wLDAgKzEsNDggQEAKKy8vPT09LSBFeHRlcm5hbFByZXByb2Nlc3NvclNvdXJjZS5oIC0gQWJzdHJhY3QgTWFjcm8gSW50ZXJmYWNlIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBFeHRlcm5hbFByZXByb2Nlc3NvclNvdXJjZSBpbnRlcmZhY2UsIHdoaWNoIGVuYWJsZXMKKy8vICBjb25zdHJ1Y3Rpb24gb2YgbWFjcm8gZGVmaW5pdGlvbnMgZnJvbSBzb21lIGV4dGVybmFsIHNvdXJjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX0NMQU5HX0xFWF9FWFRFUk5BTFBSRVBST0NFU1NPUlNPVVJDRV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfTEVYX0VYVEVSTkFMUFJFUFJPQ0VTU09SU09VUkNFX0gKKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgSWRlbnRpZmllckluZm87CitjbGFzcyBNb2R1bGU7CisKKy8vLyBcYnJpZWYgQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBleHRlcm5hbCBzb3VyY2VzIG9mIHByZXByb2Nlc3NvciAKKy8vLyBpbmZvcm1hdGlvbi4KKy8vLworLy8vIFRoaXMgYWJzdHJhY3QgY2xhc3MgYWxsb3dzIGFuIGV4dGVybmFsIHNvdXJjZXMgKHN1Y2ggYXMgdGhlIFxjIEFTVFJlYWRlcikgCisvLy8gdG8gcHJvdmlkZSBhZGRpdGlvbmFsIHByZXByb2Nlc3NpbmcgaW5mb3JtYXRpb24uCitjbGFzcyBFeHRlcm5hbFByZXByb2Nlc3NvclNvdXJjZSB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkV4dGVybmFsUHJlcHJvY2Vzc29yU291cmNlKCk7CisgIAorICAvLy8gXGJyaWVmIFJlYWQgdGhlIHNldCBvZiBtYWNyb3MgZGVmaW5lZCBieSB0aGlzIGV4dGVybmFsIG1hY3JvIHNvdXJjZS4KKyAgdmlydHVhbCB2b2lkIFJlYWREZWZpbmVkTWFjcm9zKCkgPSAwOworICAKKyAgLy8vIFxicmllZiBVcGRhdGUgYW4gb3V0LW9mLWRhdGUgaWRlbnRpZmllci4KKyAgdmlydHVhbCB2b2lkIHVwZGF0ZU91dE9mRGF0ZUlkZW50aWZpZXIoSWRlbnRpZmllckluZm8gJklJKSA9IDA7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCBudW1iZXIuCisgIC8vLworICAvLy8gVGhlIElEIDAgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBOVUxMIGlkZW50aWZpZXIuCisgIHZpcnR1YWwgSWRlbnRpZmllckluZm8gKkdldElkZW50aWZpZXIodW5zaWduZWQgSUQpID0gMDsKKworICAvLy8gXGJyaWVmIE1hcCBhIG1vZHVsZSBJRCB0byBhIG1vZHVsZS4KKyAgdmlydHVhbCBNb2R1bGUgKmdldE1vZHVsZSh1bnNpZ25lZCBNb2R1bGVJRCkgPSAwOworfTsKKyAgCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L0hlYWRlck1hcC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L0hlYWRlck1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YmY3OTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvSGVhZGVyTWFwLmgKQEAgLTAsMCArMSw5MCBAQAorLy89PT0tLS0gSGVhZGVyTWFwLmggLSBBIGZpbGUgdGhhdCBhY3RzIGxpa2UgZGlyIG9mIHN5bWxpbmtzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgSGVhZGVyTWFwIGludGVyZmFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfTEVYX0hFQURFUk1BUF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfTEVYX0hFQURFUk1BUF9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBGaWxlRW50cnk7CitjbGFzcyBGaWxlTWFuYWdlcjsKK3N0cnVjdCBITWFwQnVja2V0Oworc3RydWN0IEhNYXBIZWFkZXI7CisKKy8vLyBJbXBsZW1lbnRhdGlvbiBmb3IgXGEgSGVhZGVyTWFwIHRoYXQgZG9lc24ndCBkZXBlbmQgb24gXGEgRmlsZU1hbmFnZXIuCitjbGFzcyBIZWFkZXJNYXBJbXBsIHsKKyAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IGxsdm06Ok1lbW9yeUJ1ZmZlcj4gRmlsZUJ1ZmZlcjsKKyAgYm9vbCBOZWVkc0JTd2FwOworCitwdWJsaWM6CisgIEhlYWRlck1hcEltcGwoc3RkOjp1bmlxdWVfcHRyPGNvbnN0IGxsdm06Ok1lbW9yeUJ1ZmZlcj4gRmlsZSwgYm9vbCBOZWVkc0JTd2FwKQorICAgICAgOiBGaWxlQnVmZmVyKHN0ZDo6bW92ZShGaWxlKSksIE5lZWRzQlN3YXAoTmVlZHNCU3dhcCkge30KKworICAvLyBDaGVjayBmb3IgYSB2YWxpZCBoZWFkZXIgYW5kIGV4dHJhY3QgdGhlIGJ5dGUgc3dhcC4KKyAgc3RhdGljIGJvb2wgY2hlY2tIZWFkZXIoY29uc3QgbGx2bTo6TWVtb3J5QnVmZmVyICZGaWxlLCBib29sICZOZWVkc0J5dGVTd2FwKTsKKworICAvLy8gSWYgdGhlIHNwZWNpZmllZCByZWxhdGl2ZSBmaWxlbmFtZSBpcyBsb2NhdGVkIGluIHRoaXMgSGVhZGVyTWFwIHJldHVybgorICAvLy8gdGhlIGZpbGVuYW1lIGl0IGlzIG1hcHBlZCB0bywgb3RoZXJ3aXNlIHJldHVybiBhbiBlbXB0eSBTdHJpbmdSZWYuCisgIFN0cmluZ1JlZiBsb29rdXBGaWxlbmFtZShTdHJpbmdSZWYgRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJkRlc3RQYXRoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBmaWxlbmFtZSBvZiB0aGUgaGVhZGVybWFwLgorICBTdHJpbmdSZWYgZ2V0RmlsZU5hbWUoKSBjb25zdDsKKworICAvLy8gUHJpbnQgdGhlIGNvbnRlbnRzIG9mIHRoaXMgaGVhZGVybWFwIHRvIHN0ZGVyci4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIHVuc2lnbmVkIGdldEVuZGlhbkFkanVzdGVkV29yZCh1bnNpZ25lZCBYKSBjb25zdDsKKyAgY29uc3QgSE1hcEhlYWRlciAmZ2V0SGVhZGVyKCkgY29uc3Q7CisgIEhNYXBCdWNrZXQgZ2V0QnVja2V0KHVuc2lnbmVkIEJ1Y2tldE5vKSBjb25zdDsKKworICAvLy8gTG9vayB1cCB0aGUgc3BlY2lmaWVkIHN0cmluZyBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgSWYgdGhlIHN0cmluZyBpbmRleCBpcworICAvLy8gbm90IHZhbGlkLCByZXR1cm4gTm9uZS4KKyAgT3B0aW9uYWw8U3RyaW5nUmVmPiBnZXRTdHJpbmcodW5zaWduZWQgU3RyVGFiSWR4KSBjb25zdDsKK307CisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gQXBwbGUgY29uY2VwdCBrbm93biBhcyBhICdoZWFkZXIgbWFwJy4gIFRvIHRoZQorLy8vIFwjaW5jbHVkZSBmaWxlIHJlc29sdXRpb24gcHJvY2VzcywgaXQgYmFzaWNhbGx5IGFjdHMgbGlrZSBhIGRpcmVjdG9yeSBvZgorLy8vIHN5bWxpbmtzIHRvIGZpbGVzLiAgSXRzIGFkdmFudGFnZXMgYXJlIHRoYXQgaXQgaXMgZGVuc2UgYW5kIG1vcmUgZWZmaWNpZW50CisvLy8gdG8gY3JlYXRlIGFuZCBwcm9jZXNzIHRoYW4gYSBkaXJlY3Rvcnkgb2Ygc3ltbGlua3MuCitjbGFzcyBIZWFkZXJNYXAgOiBwcml2YXRlIEhlYWRlck1hcEltcGwgeworICBIZWFkZXJNYXAoc3RkOjp1bmlxdWVfcHRyPGNvbnN0IGxsdm06Ok1lbW9yeUJ1ZmZlcj4gRmlsZSwgYm9vbCBCU3dhcCkKKyAgICAgIDogSGVhZGVyTWFwSW1wbChzdGQ6Om1vdmUoRmlsZSksIEJTd2FwKSB7fQorCitwdWJsaWM6CisgIC8vLyBUaGlzIGF0dGVtcHRzIHRvIGxvYWQgdGhlIHNwZWNpZmllZCBmaWxlIGFzIGEgaGVhZGVyIG1hcC4gIElmIGl0IGRvZXNuJ3QKKyAgLy8vIGxvb2sgbGlrZSBhIEhlYWRlck1hcCwgaXQgZ2l2ZXMgdXAgYW5kIHJldHVybnMgbnVsbC4KKyAgc3RhdGljIGNvbnN0IEhlYWRlck1hcCAqQ3JlYXRlKGNvbnN0IEZpbGVFbnRyeSAqRkUsIEZpbGVNYW5hZ2VyICZGTSk7CisKKyAgLy8vIENoZWNrIHRvIHNlZSBpZiB0aGUgc3BlY2lmaWVkIHJlbGF0aXZlIGZpbGVuYW1lIGlzIGxvY2F0ZWQgaW4gdGhpcworICAvLy8gSGVhZGVyTWFwLiAgSWYgc28sIG9wZW4gaXQgYW5kIHJldHVybiBpdHMgRmlsZUVudHJ5LiAgSWYgUmF3UGF0aCBpcyBub3QKKyAgLy8vIE5VTEwgYW5kIHRoZSBmaWxlIGlzIGZvdW5kLCBSYXdQYXRoIHdpbGwgYmUgc2V0IHRvIHRoZSByYXcgcGF0aCBhdCB3aGljaAorICAvLy8gdGhlIGZpbGUgd2FzIGZvdW5kIGluIHRoZSBmaWxlIHN5c3RlbS4gRm9yIGV4YW1wbGUsIGZvciBhIHNlYXJjaCBwYXRoCisgIC8vLyAiLi4iIGFuZCBhIGZpbGVuYW1lICIuLi9maWxlLmgiIHRoaXMgd291bGQgYmUgIi4uLy4uL2ZpbGUuaCIuCisgIGNvbnN0IEZpbGVFbnRyeSAqTG9va3VwRmlsZShTdHJpbmdSZWYgRmlsZW5hbWUsIEZpbGVNYW5hZ2VyICZGTSkgY29uc3Q7CisKKyAgdXNpbmcgSGVhZGVyTWFwSW1wbDo6bG9va3VwRmlsZW5hbWU7CisgIHVzaW5nIEhlYWRlck1hcEltcGw6OmdldEZpbGVOYW1lOworICB1c2luZyBIZWFkZXJNYXBJbXBsOjpkdW1wOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nLgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9IZWFkZXJNYXBUeXBlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L0hlYWRlck1hcFR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJhZjRiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9IZWFkZXJNYXBUeXBlcy5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vPT09LSBIZWFkZXJNYXBUeXBlcy5oIC0gVHlwZXMgZm9yIHRoZSBoZWFkZXIgbWFwIGZvcm1hdCAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19MRVhfSEVBREVSTUFQVFlQRVNfSAorI2RlZmluZSBMTFZNX0NMQU5HX0xFWF9IRUFERVJNQVBUWVBFU19ICisKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgY2xhbmcgeworCitlbnVtIHsKKyAgSE1BUF9IZWFkZXJNYWdpY051bWJlciA9ICgnaCcgPDwgMjQpIHwgKCdtJyA8PCAxNikgfCAoJ2EnIDw8IDgpIHwgJ3AnLAorICBITUFQX0hlYWRlclZlcnNpb24gPSAxLAorICBITUFQX0VtcHR5QnVja2V0S2V5ID0gMAorfTsKKworc3RydWN0IEhNYXBCdWNrZXQgeworICB1aW50MzJfdCBLZXk7ICAgIC8vIE9mZnNldCAoaW50byBzdHJpbmdzKSBvZiBrZXkuCisgIHVpbnQzMl90IFByZWZpeDsgLy8gT2Zmc2V0IChpbnRvIHN0cmluZ3MpIG9mIHZhbHVlIHByZWZpeC4KKyAgdWludDMyX3QgU3VmZml4OyAvLyBPZmZzZXQgKGludG8gc3RyaW5ncykgb2YgdmFsdWUgc3VmZml4LgorfTsKKworc3RydWN0IEhNYXBIZWFkZXIgeworICB1aW50MzJfdCBNYWdpYzsgICAgICAgICAgLy8gTWFnaWMgd29yZCwgYWxzbyBpbmRpY2F0ZXMgYnl0ZSBvcmRlci4KKyAgdWludDE2X3QgVmVyc2lvbjsgICAgICAgIC8vIFZlcnNpb24gbnVtYmVyIC0tIGN1cnJlbnRseSAxLgorICB1aW50MTZfdCBSZXNlcnZlZDsgICAgICAgLy8gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgLSB6ZXJvIGZvciBub3cuCisgIHVpbnQzMl90IFN0cmluZ3NPZmZzZXQ7ICAvLyBPZmZzZXQgdG8gc3RhcnQgb2Ygc3RyaW5nIHBvb2wuCisgIHVpbnQzMl90IE51bUVudHJpZXM7ICAgICAvLyBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc3RyaW5nIHRhYmxlLgorICB1aW50MzJfdCBOdW1CdWNrZXRzOyAgICAgLy8gTnVtYmVyIG9mIGJ1Y2tldHMgKGFsd2F5cyBhIHBvd2VyIG9mIDIpLgorICB1aW50MzJfdCBNYXhWYWx1ZUxlbmd0aDsgLy8gTGVuZ3RoIG9mIGxvbmdlc3QgcmVzdWx0IHBhdGggKGV4Y2x1ZGluZyBudWwpLgorICAvLyBBbiBhcnJheSBvZiAnTnVtQnVja2V0cycgSE1hcEJ1Y2tldCBvYmplY3RzIGZvbGxvd3MgdGhpcyBoZWFkZXIuCisgIC8vIFN0cmluZ3MgZm9sbG93IHRoZSBidWNrZXRzLCBhdCBTdHJpbmdzT2Zmc2V0LgorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nLgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9IZWFkZXJTZWFyY2guaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9IZWFkZXJTZWFyY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZThkOWNiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L0hlYWRlclNlYXJjaC5oCkBAIC0wLDAgKzEsNzY3IEBACisvLz09PS0gSGVhZGVyU2VhcmNoLmggLSBSZXNvbHZlIEhlYWRlciBGaWxlIExvY2F0aW9ucyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBIZWFkZXJTZWFyY2ggaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19MRVhfSEVBREVSU0VBUkNIX0gKKyNkZWZpbmUgTExWTV9DTEFOR19MRVhfSEVBREVSU0VBUkNIX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oIgorI2luY2x1ZGUgImNsYW5nL0xleC9EaXJlY3RvcnlMb29rdXAuaCIKKyNpbmNsdWRlICJjbGFuZy9MZXgvTW9kdWxlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgRGlhZ25vc3RpY3NFbmdpbmU7CitjbGFzcyBEaXJlY3RvcnlFbnRyeTsKK2NsYXNzIEV4dGVybmFsUHJlcHJvY2Vzc29yU291cmNlOworY2xhc3MgRmlsZUVudHJ5OworY2xhc3MgRmlsZU1hbmFnZXI7CitjbGFzcyBIZWFkZXJNYXA7CitjbGFzcyBIZWFkZXJTZWFyY2hPcHRpb25zOworY2xhc3MgSWRlbnRpZmllckluZm87CitjbGFzcyBMYW5nT3B0aW9uczsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFByZXByb2Nlc3NvcjsKK2NsYXNzIFRhcmdldEluZm87CisKKy8vLyBcYnJpZWYgVGhlIHByZXByb2Nlc3NvciBrZWVwcyB0cmFjayBvZiB0aGlzIGluZm9ybWF0aW9uIGZvciBlYWNoCisvLy8gZmlsZSB0aGF0IGlzIFwjaW5jbHVkZWQuCitzdHJ1Y3QgSGVhZGVyRmlsZUluZm8geworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBpcyBhIFwjaW1wb3J0J2Qgb3IgXCNwcmFnbWEgb25jZSBmaWxlLgorICB1bnNpZ25lZCBpc0ltcG9ydCA6IDE7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgaXMgYSBcI3ByYWdtYSBvbmNlIGZpbGUuCisgIHVuc2lnbmVkIGlzUHJhZ21hT25jZSA6IDE7CisKKyAgLy8vIERpckluZm8gLSBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhpcyBpcyBhIHN5c3RlbSBoZWFkZXIsIGFuZCBpZiBzbywKKyAgLy8vIHdoZXRoZXIgaXQgaXMgQysrIGNsZWFuIG9yIG5vdC4gIFRoaXMgY2FuIGJlIHNldCBieSB0aGUgaW5jbHVkZSBwYXRocyBvcgorICAvLy8gYnkgXCNwcmFnbWEgZ2NjIHN5c3RlbV9oZWFkZXIuICBUaGlzIGlzIGFuIGluc3RhbmNlIG9mCisgIC8vLyBTcmNNZ3I6OkNoYXJhY3RlcmlzdGljS2luZC4KKyAgdW5zaWduZWQgRGlySW5mbyA6IDM7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgaGVhZGVyIGZpbGUgaW5mbyB3YXMgc3VwcGxpZWQgYnkgYW4gZXh0ZXJuYWwgc291cmNlLAorICAvLy8gYW5kIGhhcyBub3QgY2hhbmdlZCBzaW5jZS4KKyAgdW5zaWduZWQgRXh0ZXJuYWwgOiAxOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGhlYWRlciBpcyBwYXJ0IG9mIGEgbW9kdWxlLgorICB1bnNpZ25lZCBpc01vZHVsZUhlYWRlciA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgaGVhZGVyIGlzIHBhcnQgb2YgdGhlIG1vZHVsZSB0aGF0IHdlIGFyZSBidWlsZGluZy4KKyAgdW5zaWduZWQgaXNDb21waWxpbmdNb2R1bGVIZWFkZXIgOiAxOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIHN0cnVjdHVyZSBpcyBjb25zaWRlcmVkIHRvIGFscmVhZHkgaGF2ZSBiZWVuCisgIC8vLyAicmVzb2x2ZWQiLCBtZWFuaW5nIHRoYXQgaXQgd2FzIGxvYWRlZCBmcm9tIHRoZSBleHRlcm5hbCBzb3VyY2UuCisgIHVuc2lnbmVkIFJlc29sdmVkIDogMTsKKyAgCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGlzIGEgaGVhZGVyIGluc2lkZSBhIGZyYW1ld29yayB0aGF0IGlzIGN1cnJlbnRseQorICAvLy8gYmVpbmcgYnVpbHQuIAorICAvLy8KKyAgLy8vIFdoZW4gYSBmcmFtZXdvcmsgaXMgYmVpbmcgYnVpbHQsIHRoZSBoZWFkZXJzIGhhdmUgbm90IHlldCBiZWVuIHBsYWNlZAorICAvLy8gaW50byB0aGUgYXBwcm9wcmlhdGUgZnJhbWV3b3JrIHN1YmRpcmVjdG9yaWVzLCBhbmQgdGhlcmVmb3JlIGFyZQorICAvLy8gcHJvdmlkZWQgdmlhIGEgaGVhZGVyIG1hcC4gVGhpcyBiaXQgaW5kaWNhdGVzIHdoZW4gdGhpcyBpcyBvbmUgb2YKKyAgLy8vIHRob3NlIGZyYW1ld29yayBoZWFkZXJzLgorICB1bnNpZ25lZCBJbmRleEhlYWRlck1hcEhlYWRlciA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgZmlsZSBoYXMgYmVlbiBsb29rZWQgdXAgYXMgYSBoZWFkZXIuCisgIHVuc2lnbmVkIElzVmFsaWQgOiAxOworICAKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIGhhcyBiZWVuIGluY2x1ZGVkIGFscmVhZHkuCisgIHVuc2lnbmVkIHNob3J0IE51bUluY2x1ZGVzID0gMDsKKworICAvLy8gXGJyaWVmIFRoZSBJRCBudW1iZXIgb2YgdGhlIGNvbnRyb2xsaW5nIG1hY3JvLgorICAvLy8KKyAgLy8vIFRoaXMgSUQgbnVtYmVyIHdpbGwgYmUgbm9uLXplcm8gd2hlbiB0aGVyZSBpcyBhIGNvbnRyb2xsaW5nCisgIC8vLyBtYWNybyB3aG9zZSBJZGVudGlmaWVySW5mbyBtYXkgbm90IHlldCBoYXZlIGJlZW4gbG9hZGVkIGZyb20KKyAgLy8vIGV4dGVybmFsIHN0b3JhZ2UuCisgIHVuc2lnbmVkIENvbnRyb2xsaW5nTWFjcm9JRCA9IDA7CisKKyAgLy8vIElmIHRoaXMgZmlsZSBoYXMgYSBcI2lmbmRlZiBYWFggKG9yIGVxdWl2YWxlbnQpIGd1YXJkIHRoYXQKKyAgLy8vIHByb3RlY3RzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGZpbGUsIHRoaXMgaXMgdGhlIGlkZW50aWZpZXIKKyAgLy8vIGZvciB0aGUgbWFjcm8gdGhhdCBjb250cm9scyB3aGV0aGVyIG9yIG5vdCBpdCBoYXMgYW55IGVmZmVjdC4KKyAgLy8vCisgIC8vLyBOb3RlOiBNb3N0IGNsaWVudHMgc2hvdWxkIHVzZSBnZXRDb250cm9sbGluZ01hY3JvKCkgdG8gYWNjZXNzCisgIC8vLyB0aGUgY29udHJvbGxpbmcgbWFjcm8gb2YgdGhpcyBoZWFkZXIsIHNpbmNlCisgIC8vLyBnZXRDb250cm9sbGluZ01hY3JvKCkgaXMgYWJsZSB0byBsb2FkIGEgY29udHJvbGxpbmcgbWFjcm8gZnJvbQorICAvLy8gZXh0ZXJuYWwgc3RvcmFnZS4KKyAgY29uc3QgSWRlbnRpZmllckluZm8gKkNvbnRyb2xsaW5nTWFjcm8gPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgSWYgdGhpcyBoZWFkZXIgY2FtZSBmcm9tIGEgZnJhbWV3b3JrIGluY2x1ZGUsIHRoaXMgaXMgdGhlIG5hbWUKKyAgLy8vIG9mIHRoZSBmcmFtZXdvcmsuCisgIFN0cmluZ1JlZiBGcmFtZXdvcms7CisgIAorICBIZWFkZXJGaWxlSW5mbygpCisgICAgICA6IGlzSW1wb3J0KGZhbHNlKSwgaXNQcmFnbWFPbmNlKGZhbHNlKSwgRGlySW5mbyhTcmNNZ3I6OkNfVXNlciksIAorICAgICAgICBFeHRlcm5hbChmYWxzZSksIGlzTW9kdWxlSGVhZGVyKGZhbHNlKSwgaXNDb21waWxpbmdNb2R1bGVIZWFkZXIoZmFsc2UpLAorICAgICAgICBSZXNvbHZlZChmYWxzZSksIEluZGV4SGVhZGVyTWFwSGVhZGVyKGZhbHNlKSwgSXNWYWxpZChmYWxzZSkgIHt9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgY29udHJvbGxpbmcgbWFjcm8gZm9yIHRoaXMgaGVhZGVyIGZpbGUsIGlmCisgIC8vLyBhbnkuCisgIGNvbnN0IElkZW50aWZpZXJJbmZvICoKKyAgZ2V0Q29udHJvbGxpbmdNYWNybyhFeHRlcm5hbFByZXByb2Nlc3NvclNvdXJjZSAqRXh0ZXJuYWwpOworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIG5vbi1kZWZhdWx0IGhlYWRlciBmaWxlIGluZm8sIGUuZy4sCisgIC8vLyBpdCBjb3JyZXNwb25kcyB0byBhbiBhY3R1YWwgaGVhZGVyIHdlJ3ZlIGluY2x1ZGVkIG9yIHRyaWVkIHRvIGluY2x1ZGUuCisgIGJvb2wgaXNOb25EZWZhdWx0KCkgY29uc3QgeworICAgIHJldHVybiBpc0ltcG9ydCB8fCBpc1ByYWdtYU9uY2UgfHwgTnVtSW5jbHVkZXMgfHwgQ29udHJvbGxpbmdNYWNybyB8fCAKKyAgICAgIENvbnRyb2xsaW5nTWFjcm9JRDsKKyAgfQorfTsKKworLy8vIFxicmllZiBBbiBleHRlcm5hbCBzb3VyY2Ugb2YgaGVhZGVyIGZpbGUgaW5mb3JtYXRpb24sIHdoaWNoIG1heSBzdXBwbHkKKy8vLyBpbmZvcm1hdGlvbiBhYm91dCBoZWFkZXIgZmlsZXMgYWxyZWFkeSBpbmNsdWRlZC4KK2NsYXNzIEV4dGVybmFsSGVhZGVyRmlsZUluZm9Tb3VyY2UgeworcHVibGljOgorICB2aXJ0dWFsIH5FeHRlcm5hbEhlYWRlckZpbGVJbmZvU291cmNlKCk7CisgIAorICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBoZWFkZXIgZmlsZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIGZpbGUgZW50cnkuCisgIC8vLworICAvLy8gXHJldHVybnMgSGVhZGVyIGZpbGUgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBmaWxlIGVudHJ5LCB3aXRoIHRoZQorICAvLy8gXGMgRXh0ZXJuYWwgYml0IHNldC4gSWYgdGhlIGZpbGUgZW50cnkgaXMgbm90IGtub3duLCByZXR1cm4gYSAKKyAgLy8vIGRlZmF1bHQtY29uc3RydWN0ZWQgXGMgSGVhZGVyRmlsZUluZm8uCisgIHZpcnR1YWwgSGVhZGVyRmlsZUluZm8gR2V0SGVhZGVyRmlsZUluZm8oY29uc3QgRmlsZUVudHJ5ICpGRSkgPSAwOworfTsKKyAgCisvLy8gXGJyaWVmIEVuY2Fwc3VsYXRlcyB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGZpbmQgdGhlIGZpbGUgcmVmZXJlbmNlZAorLy8vIGJ5IGEgXCNpbmNsdWRlIG9yIFwjaW5jbHVkZV9uZXh0LCAoc3ViLSlmcmFtZXdvcmsgbG9va3VwLCBldGMuCitjbGFzcyBIZWFkZXJTZWFyY2ggeworICBmcmllbmQgY2xhc3MgRGlyZWN0b3J5TG9va3VwOworCisgIC8vLyBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJlY29yZCBlbnRyaWVzIGluIG91ciBmcmFtZXdvcmsgY2FjaGUuCisgIHN0cnVjdCBGcmFtZXdvcmtDYWNoZUVudHJ5IHsKKyAgICAvLy8gVGhlIGRpcmVjdG9yeSBlbnRyeSB3aGljaCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGNhY2hlZCBmcmFtZXdvcmsuCisgICAgY29uc3QgRGlyZWN0b3J5RW50cnkgKkRpcmVjdG9yeTsKKworICAgIC8vLyBXaGV0aGVyIHRoaXMgZnJhbWV3b3JrIGhhcyBiZWVuICJ1c2VyLXNwZWNpZmllZCIgdG8gYmUgdHJlYXRlZCBhcyBpZiBpdAorICAgIC8vLyB3ZXJlIGEgc3lzdGVtIGZyYW1ld29yayAoZXZlbiBpZiBpdCB3YXMgZm91bmQgb3V0c2lkZSBhIHN5c3RlbSBmcmFtZXdvcmsKKyAgICAvLy8gZGlyZWN0b3J5KS4KKyAgICBib29sIElzVXNlclNwZWNpZmllZFN5c3RlbUZyYW1ld29yazsKKyAgfTsKKworICAvLy8gXGJyaWVmIEhlYWRlci1zZWFyY2ggb3B0aW9ucyB1c2VkIHRvIGluaXRpYWxpemUgdGhpcyBoZWFkZXIgc2VhcmNoLgorICBzdGQ6OnNoYXJlZF9wdHI8SGVhZGVyU2VhcmNoT3B0aW9ucz4gSFNPcHRzOworCisgIERpYWdub3N0aWNzRW5naW5lICZEaWFnczsKKyAgRmlsZU1hbmFnZXIgJkZpbGVNZ3I7CisKKyAgLy8vIFwjaW5jbHVkZSBzZWFyY2ggcGF0aCBpbmZvcm1hdGlvbi4gIFJlcXVlc3RzIGZvciBcI2luY2x1ZGUgIngiIHNlYXJjaCB0aGUKKyAgLy8vIGRpcmVjdG9yeSBvZiB0aGUgXCNpbmNsdWRpbmcgZmlsZSBmaXJzdCwgdGhlbiBlYWNoIGRpcmVjdG9yeSBpbiBTZWFyY2hEaXJzCisgIC8vLyBjb25zZWN1dGl2ZWx5LiBSZXF1ZXN0cyBmb3IgPHg+IHNlYXJjaCB0aGUgY3VycmVudCBkaXIgZmlyc3QsIHRoZW4gZWFjaAorICAvLy8gZGlyZWN0b3J5IGluIFNlYXJjaERpcnMsIHN0YXJ0aW5nIGF0IEFuZ2xlZERpcklkeCwgY29uc2VjdXRpdmVseS4gIElmCisgIC8vLyBOb0N1ckRpclNlYXJjaCBpcyB0cnVlLCB0aGVuIHRoZSBjaGVjayBmb3IgdGhlIGZpbGUgaW4gdGhlIGN1cnJlbnQKKyAgLy8vIGRpcmVjdG9yeSBpcyBzdXBwcmVzc2VkLgorICBzdGQ6OnZlY3RvcjxEaXJlY3RvcnlMb29rdXA+IFNlYXJjaERpcnM7CisgIHVuc2lnbmVkIEFuZ2xlZERpcklkeCA9IDA7CisgIHVuc2lnbmVkIFN5c3RlbURpcklkeCA9IDA7CisgIGJvb2wgTm9DdXJEaXJTZWFyY2ggPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIFwjaW5jbHVkZSBwcmVmaXhlcyBmb3Igd2hpY2ggdGhlICdzeXN0ZW0gaGVhZGVyJyBwcm9wZXJ0eSBpcworICAvLy8gb3ZlcnJpZGRlbi4KKyAgLy8vCisgIC8vLyBGb3IgYSBcI2luY2x1ZGUgIngiIG9yIFwjaW5jbHVkZSBcPHg+IGRpcmVjdGl2ZSwgdGhlIGxhc3Qgc3RyaW5nIGluIHRoaXMKKyAgLy8vIGxpc3Qgd2hpY2ggaXMgYSBwcmVmaXggb2YgJ3gnIGRldGVybWluZXMgd2hldGhlciB0aGUgZmlsZSBpcyB0cmVhdGVkIGFzCisgIC8vLyBhIHN5c3RlbSBoZWFkZXIuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgYm9vbD4+IFN5c3RlbUhlYWRlclByZWZpeGVzOworCisgIC8vLyBcYnJpZWYgVGhlIHBhdGggdG8gdGhlIG1vZHVsZSBjYWNoZS4KKyAgc3RkOjpzdHJpbmcgTW9kdWxlQ2FjaGVQYXRoOworICAKKyAgLy8vIFxicmllZiBBbGwgb2YgdGhlIHByZXByb2Nlc3Nvci1zcGVjaWZpYyBkYXRhIGFib3V0IGZpbGVzIHRoYXQgYXJlCisgIC8vLyBpbmNsdWRlZCwgaW5kZXhlZCBieSB0aGUgRmlsZUVudHJ5J3MgVUlELgorICBtdXRhYmxlIHN0ZDo6dmVjdG9yPEhlYWRlckZpbGVJbmZvPiBGaWxlSW5mbzsKKworICAvLy8gS2VlcHMgdHJhY2sgb2YgZWFjaCBsb29rdXAgcGVyZm9ybWVkIGJ5IExvb2t1cEZpbGUuCisgIHN0cnVjdCBMb29rdXBGaWxlQ2FjaGVJbmZvIHsKKyAgICAvLy8gU3RhcnRpbmcgaW5kZXggaW4gU2VhcmNoRGlycyB0aGF0IHRoZSBjYWNoZWQgc2VhcmNoIHdhcyBwZXJmb3JtZWQgZnJvbS4KKyAgICAvLy8gSWYgdGhlcmUgaXMgYSBoaXQgYW5kIHRoaXMgdmFsdWUgZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudCBxdWVyeSwgdGhlCisgICAgLy8vIGNhY2hlIGhhcyB0byBiZSBpZ25vcmVkLgorICAgIHVuc2lnbmVkIFN0YXJ0SWR4ID0gMDsKKworICAgIC8vLyBUaGUgZW50cnkgaW4gU2VhcmNoRGlycyB0aGF0IHNhdGlzZmllZCB0aGUgcXVlcnkuCisgICAgdW5zaWduZWQgSGl0SWR4ID0gMDsKKworICAgIC8vLyBUaGlzIGlzIG5vbi1udWxsIGlmIHRoZSBvcmlnaW5hbCBmaWxlbmFtZSB3YXMgbWFwcGVkIHRvIGEgZnJhbWV3b3JrCisgICAgLy8vIGluY2x1ZGUgdmlhIGEgaGVhZGVybWFwLgorICAgIGNvbnN0IGNoYXIgKk1hcHBlZE5hbWUgPSBudWxscHRyOworCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IgLS0gSW5pdGlhbGl6ZSBhbGwgbWVtYmVycyB3aXRoIHplcm8uCisgICAgTG9va3VwRmlsZUNhY2hlSW5mbygpID0gZGVmYXVsdDsKKworICAgIHZvaWQgcmVzZXQodW5zaWduZWQgU3RhcnRJZHgpIHsKKyAgICAgIHRoaXMtPlN0YXJ0SWR4ID0gU3RhcnRJZHg7CisgICAgICB0aGlzLT5NYXBwZWROYW1lID0gbnVsbHB0cjsKKyAgICB9CisgIH07CisgIGxsdm06OlN0cmluZ01hcDxMb29rdXBGaWxlQ2FjaGVJbmZvLCBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yPiBMb29rdXBGaWxlQ2FjaGU7CisKKyAgLy8vIFxicmllZiBDb2xsZWN0aW9uIG1hcHBpbmcgYSBmcmFtZXdvcmsgb3Igc3ViZnJhbWV3b3JrCisgIC8vLyBuYW1lIGxpa2UgIkNhcmJvbiIgdG8gdGhlIENhcmJvbi5mcmFtZXdvcmsgZGlyZWN0b3J5LgorICBsbHZtOjpTdHJpbmdNYXA8RnJhbWV3b3JrQ2FjaGVFbnRyeSwgbGx2bTo6QnVtcFB0ckFsbG9jYXRvcj4gRnJhbWV3b3JrTWFwOworCisgIC8vLyBJbmNsdWRlQWxpYXNlcyAtIG1hcHMgaW5jbHVkZSBmaWxlIG5hbWVzIChpbmNsdWRpbmcgdGhlIHF1b3RlcyBvcgorICAvLy8gYW5nbGUgYnJhY2tldHMpIHRvIG90aGVyIGluY2x1ZGUgZmlsZSBuYW1lcy4gIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IHRoZQorICAvLy8gaW5jbHVkZV9hbGlhcyBwcmFnbWEgZm9yIE1pY3Jvc29mdCBjb21wYXRpYmlsaXR5LgorICB1c2luZyBJbmNsdWRlQWxpYXNNYXAgPQorICAgICAgbGx2bTo6U3RyaW5nTWFwPHN0ZDo6c3RyaW5nLCBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yPjsKKyAgc3RkOjp1bmlxdWVfcHRyPEluY2x1ZGVBbGlhc01hcD4gSW5jbHVkZUFsaWFzZXM7CisKKyAgLy8vIEhlYWRlck1hcHMgLSBUaGlzIGlzIGEgbWFwcGluZyBmcm9tIEZpbGVFbnRyeSAtPiBIZWFkZXJNYXAsIHVuaXF1aW5nCisgIC8vLyBoZWFkZXJtYXBzLiAgVGhpcyB2ZWN0b3Igb3ducyB0aGUgaGVhZGVybWFwLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgRmlsZUVudHJ5ICosIGNvbnN0IEhlYWRlck1hcCAqPj4gSGVhZGVyTWFwczsKKworICAvLy8gXGJyaWVmIFRoZSBtYXBwaW5nIGJldHdlZW4gbW9kdWxlcyBhbmQgaGVhZGVycy4KKyAgbXV0YWJsZSBNb2R1bGVNYXAgTW9kTWFwOworICAKKyAgLy8vIFxicmllZiBEZXNjcmliZXMgd2hldGhlciBhIGdpdmVuIGRpcmVjdG9yeSBoYXMgYSBtb2R1bGUgbWFwIGluIGl0LgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBEaXJlY3RvcnlFbnRyeSAqLCBib29sPiBEaXJlY3RvcnlIYXNNb2R1bGVNYXA7CisKKyAgLy8vIFxicmllZiBTZXQgb2YgbW9kdWxlIG1hcCBmaWxlcyB3ZSd2ZSBhbHJlYWR5IGxvYWRlZCwgYW5kIGEgZmxhZyBpbmRpY2F0aW5nCisgIC8vLyB3aGV0aGVyIHRoZXkgd2VyZSB2YWxpZCBvciBub3QuCisgIGxsdm06OkRlbnNlTWFwPGNvbnN0IEZpbGVFbnRyeSAqLCBib29sPiBMb2FkZWRNb2R1bGVNYXBzOworCisgIC8vLyBcYnJpZWYgVW5pcXVlZCBzZXQgb2YgZnJhbWV3b3JrIG5hbWVzLCB3aGljaCBpcyB1c2VkIHRvIHRyYWNrIHdoaWNoIAorICAvLy8gaGVhZGVycyB3ZXJlIGluY2x1ZGVkIGFzIGZyYW1ld29yayBoZWFkZXJzLgorICBsbHZtOjpTdHJpbmdTZXQ8bGx2bTo6QnVtcFB0ckFsbG9jYXRvcj4gRnJhbWV3b3JrTmFtZXM7CisgIAorICAvLy8gXGJyaWVmIEVudGl0eSB1c2VkIHRvIHJlc29sdmUgdGhlIGlkZW50aWZpZXIgSURzIG9mIGNvbnRyb2xsaW5nCisgIC8vLyBtYWNyb3MgaW50byBJZGVudGlmaWVySW5mbyBwb2ludGVycywgYW5kIGtlZXAgdGhlIGlkZW50aWZpcmUgdXAgdG8gZGF0ZSwKKyAgLy8vIGFzIG5lZWRlZC4KKyAgRXh0ZXJuYWxQcmVwcm9jZXNzb3JTb3VyY2UgKkV4dGVybmFsTG9va3VwID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIEVudGl0eSB1c2VkIHRvIGxvb2sgdXAgc3RvcmVkIGhlYWRlciBmaWxlIGluZm9ybWF0aW9uLgorICBFeHRlcm5hbEhlYWRlckZpbGVJbmZvU291cmNlICpFeHRlcm5hbFNvdXJjZSA9IG51bGxwdHI7CisgIAorICAvLyBWYXJpb3VzIHN0YXRpc3RpY3Mgd2UgdHJhY2sgZm9yIHBlcmZvcm1hbmNlIGFuYWx5c2lzLgorICB1bnNpZ25lZCBOdW1JbmNsdWRlZCA9IDA7CisgIHVuc2lnbmVkIE51bU11bHRpSW5jbHVkZUZpbGVPcHR6biA9IDA7CisgIHVuc2lnbmVkIE51bUZyYW1ld29ya0xvb2t1cHMgPSAwOworICB1bnNpZ25lZCBOdW1TdWJGcmFtZXdvcmtMb29rdXBzID0gMDsKKworcHVibGljOgorICBIZWFkZXJTZWFyY2goc3RkOjpzaGFyZWRfcHRyPEhlYWRlclNlYXJjaE9wdGlvbnM+IEhTT3B0cywKKyAgICAgICAgICAgICAgIFNvdXJjZU1hbmFnZXIgJlNvdXJjZU1nciwgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzLAorICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLCBjb25zdCBUYXJnZXRJbmZvICpUYXJnZXQpOworICBIZWFkZXJTZWFyY2goY29uc3QgSGVhZGVyU2VhcmNoICYpID0gZGVsZXRlOworICBIZWFkZXJTZWFyY2ggJm9wZXJhdG9yPShjb25zdCBIZWFkZXJTZWFyY2ggJikgPSBkZWxldGU7CisgIH5IZWFkZXJTZWFyY2goKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBoZWFkZXItc2VhcmNoIG9wdGlvbnMgd2l0aCB3aGljaCB0aGlzIGhlYWRlciBzZWFyY2gKKyAgLy8vIHdhcyBpbml0aWFsaXplZC4KKyAgSGVhZGVyU2VhcmNoT3B0aW9ucyAmZ2V0SGVhZGVyU2VhcmNoT3B0cygpIGNvbnN0IHsgcmV0dXJuICpIU09wdHM7IH0KKyAgCisgIEZpbGVNYW5hZ2VyICZnZXRGaWxlTWdyKCkgY29uc3QgeyByZXR1cm4gRmlsZU1ncjsgfQorCisgIC8vLyBcYnJpZWYgSW50ZXJmYWNlIGZvciBzZXR0aW5nIHRoZSBmaWxlIHNlYXJjaCBwYXRocy4KKyAgdm9pZCBTZXRTZWFyY2hQYXRocyhjb25zdCBzdGQ6OnZlY3RvcjxEaXJlY3RvcnlMb29rdXA+ICZkaXJzLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFuZ2xlZERpcklkeCwgdW5zaWduZWQgc3lzdGVtRGlySWR4LAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbm9DdXJEaXJTZWFyY2gpIHsKKyAgICBhc3NlcnQoYW5nbGVkRGlySWR4IDw9IHN5c3RlbURpcklkeCAmJiBzeXN0ZW1EaXJJZHggPD0gZGlycy5zaXplKCkgJiYKKyAgICAgICAgIkRpcmVjdG9yeSBpbmRpY2llcyBhcmUgdW5vcmRlcmVkIik7CisgICAgU2VhcmNoRGlycyA9IGRpcnM7CisgICAgQW5nbGVkRGlySWR4ID0gYW5nbGVkRGlySWR4OworICAgIFN5c3RlbURpcklkeCA9IHN5c3RlbURpcklkeDsKKyAgICBOb0N1ckRpclNlYXJjaCA9IG5vQ3VyRGlyU2VhcmNoOworICAgIC8vTG9va3VwRmlsZUNhY2hlLmNsZWFyKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEFkZCBhbiBhZGRpdGlvbmFsIHNlYXJjaCBwYXRoLgorICB2b2lkIEFkZFNlYXJjaFBhdGgoY29uc3QgRGlyZWN0b3J5TG9va3VwICZkaXIsIGJvb2wgaXNBbmdsZWQpIHsKKyAgICB1bnNpZ25lZCBpZHggPSBpc0FuZ2xlZCA/IFN5c3RlbURpcklkeCA6IEFuZ2xlZERpcklkeDsKKyAgICBTZWFyY2hEaXJzLmluc2VydChTZWFyY2hEaXJzLmJlZ2luKCkgKyBpZHgsIGRpcik7CisgICAgaWYgKCFpc0FuZ2xlZCkKKyAgICAgIEFuZ2xlZERpcklkeCsrOworICAgIFN5c3RlbURpcklkeCsrOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGxpc3Qgb2Ygc3lzdGVtIGhlYWRlciBwcmVmaXhlcy4KKyAgdm9pZCBTZXRTeXN0ZW1IZWFkZXJQcmVmaXhlcyhBcnJheVJlZjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGJvb2w+PiBQKSB7CisgICAgU3lzdGVtSGVhZGVyUHJlZml4ZXMuYXNzaWduKFAuYmVnaW4oKSwgUC5lbmQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIENoZWNrcyB3aGV0aGVyIHRoZSBtYXAgZXhpc3RzIG9yIG5vdC4KKyAgYm9vbCBIYXNJbmNsdWRlQWxpYXNNYXAoKSBjb25zdCB7IHJldHVybiAoYm9vbClJbmNsdWRlQWxpYXNlczsgfQorCisgIC8vLyBcYnJpZWYgTWFwIHRoZSBzb3VyY2UgaW5jbHVkZSBuYW1lIHRvIHRoZSBkZXN0IGluY2x1ZGUgbmFtZS4KKyAgLy8vCisgIC8vLyBUaGUgU291cmNlIHNob3VsZCBpbmNsdWRlIHRoZSBhbmdsZSBicmFja2V0cyBvciBxdW90ZXMsIHRoZSBkZXN0IAorICAvLy8gc2hvdWxkIG5vdC4gIFRoaXMgYWxsb3dzIGZvciBkaXN0aW5jdGlvbiBiZXR3ZWVuIDw+IGFuZCAiIiBoZWFkZXJzLgorICB2b2lkIEFkZEluY2x1ZGVBbGlhcyhTdHJpbmdSZWYgU291cmNlLCBTdHJpbmdSZWYgRGVzdCkgeworICAgIGlmICghSW5jbHVkZUFsaWFzZXMpCisgICAgICBJbmNsdWRlQWxpYXNlcy5yZXNldChuZXcgSW5jbHVkZUFsaWFzTWFwKTsKKyAgICAoKkluY2x1ZGVBbGlhc2VzKVtTb3VyY2VdID0gRGVzdDsKKyAgfQorCisgIC8vLyBNYXBIZWFkZXJUb0luY2x1ZGVBbGlhcyAtIE1hcHMgb25lIGhlYWRlciBmaWxlIG5hbWUgdG8gYSBkaWZmZXJlbnQgaGVhZGVyCisgIC8vLyBmaWxlIG5hbWUsIGZvciB1c2Ugd2l0aCB0aGUgaW5jbHVkZV9hbGlhcyBwcmFnbWEuICBOb3RlIHRoYXQgdGhlIHNvdXJjZQorICAvLy8gZmlsZSBuYW1lIHNob3VsZCBpbmNsdWRlIHRoZSBhbmdsZSBicmFja2V0cyBvciBxdW90ZXMuICBSZXR1cm5zIFN0cmluZ1JlZgorICAvLy8gYXMgbnVsbCBpZiB0aGUgaGVhZGVyIGNhbm5vdCBiZSBtYXBwZWQuCisgIFN0cmluZ1JlZiBNYXBIZWFkZXJUb0luY2x1ZGVBbGlhcyhTdHJpbmdSZWYgU291cmNlKSB7CisgICAgYXNzZXJ0KEluY2x1ZGVBbGlhc2VzICYmICJUcnlpbmcgdG8gbWFwIGhlYWRlcnMgd2hlbiB0aGVyZSdzIG5vIG1hcCIpOworCisgICAgLy8gRG8gYW55IGZpbGVuYW1lIHJlcGxhY2VtZW50cyBiZWZvcmUgYW55dGhpbmcgZWxzZQorICAgIEluY2x1ZGVBbGlhc01hcDo6Y29uc3RfaXRlcmF0b3IgSXRlciA9IEluY2x1ZGVBbGlhc2VzLT5maW5kKFNvdXJjZSk7CisgICAgaWYgKEl0ZXIgIT0gSW5jbHVkZUFsaWFzZXMtPmVuZCgpKQorICAgICAgcmV0dXJuIEl0ZXItPnNlY29uZDsKKyAgICByZXR1cm4ge307CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgcGF0aCB0byB0aGUgbW9kdWxlIGNhY2hlLgorICB2b2lkIHNldE1vZHVsZUNhY2hlUGF0aChTdHJpbmdSZWYgQ2FjaGVQYXRoKSB7CisgICAgTW9kdWxlQ2FjaGVQYXRoID0gQ2FjaGVQYXRoOworICB9CisgIAorICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBwYXRoIHRvIHRoZSBtb2R1bGUgY2FjaGUuCisgIFN0cmluZ1JlZiBnZXRNb2R1bGVDYWNoZVBhdGgoKSBjb25zdCB7IHJldHVybiBNb2R1bGVDYWNoZVBhdGg7IH0KKworICAvLy8gXGJyaWVmIENvbnNpZGVyIG1vZHVsZXMgd2hlbiBpbmNsdWRpbmcgZmlsZXMgZnJvbSB0aGlzIGRpcmVjdG9yeS4KKyAgdm9pZCBzZXREaXJlY3RvcnlIYXNNb2R1bGVNYXAoY29uc3QgRGlyZWN0b3J5RW50cnkqIERpcikgeworICAgIERpcmVjdG9yeUhhc01vZHVsZU1hcFtEaXJdID0gdHJ1ZTsKKyAgfQorICAKKyAgLy8vIFxicmllZiBGb3JnZXQgZXZlcnl0aGluZyB3ZSBrbm93IGFib3V0IGhlYWRlcnMgc28gZmFyLgorICB2b2lkIENsZWFyRmlsZUluZm8oKSB7CisgICAgRmlsZUluZm8uY2xlYXIoKTsKKyAgfQorCisgIHZvaWQgU2V0RXh0ZXJuYWxMb29rdXAoRXh0ZXJuYWxQcmVwcm9jZXNzb3JTb3VyY2UgKkVQUykgeworICAgIEV4dGVybmFsTG9va3VwID0gRVBTOworICB9CisKKyAgRXh0ZXJuYWxQcmVwcm9jZXNzb3JTb3VyY2UgKmdldEV4dGVybmFsTG9va3VwKCkgY29uc3QgeworICAgIHJldHVybiBFeHRlcm5hbExvb2t1cDsKKyAgfQorICAKKyAgLy8vIFxicmllZiBTZXQgdGhlIGV4dGVybmFsIHNvdXJjZSBvZiBoZWFkZXIgaW5mb3JtYXRpb24uCisgIHZvaWQgU2V0RXh0ZXJuYWxTb3VyY2UoRXh0ZXJuYWxIZWFkZXJGaWxlSW5mb1NvdXJjZSAqRVMpIHsKKyAgICBFeHRlcm5hbFNvdXJjZSA9IEVTOworICB9CisgIAorICAvLy8gXGJyaWVmIFNldCB0aGUgdGFyZ2V0IGluZm9ybWF0aW9uIGZvciB0aGUgaGVhZGVyIHNlYXJjaCwgaWYgbm90CisgIC8vLyBhbHJlYWR5IGtub3duLgorICB2b2lkIHNldFRhcmdldChjb25zdCBUYXJnZXRJbmZvICZUYXJnZXQpOworICAKKyAgLy8vIFxicmllZiBHaXZlbiBhICJmb28iIG9yIFw8Zm9vPiByZWZlcmVuY2UsIGxvb2sgdXAgdGhlIGluZGljYXRlZCBmaWxlLAorICAvLy8gcmV0dXJuIG51bGwgb24gZmFpbHVyZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBJZiBzdWNjZXNzZnVsLCB0aGlzIHJldHVybnMgJ1VzZWREaXInLCB0aGUgRGlyZWN0b3J5TG9va3VwIG1lbWJlcgorICAvLy8gdGhlIGZpbGUgd2FzIGZvdW5kIGluLCBvciBudWxsIGlmIG5vdCBhcHBsaWNhYmxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJbmNsdWRlTG9jIFVzZWQgZm9yIGRpYWdub3N0aWNzIGlmIHZhbGlkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBpc0FuZ2xlZCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZmlsZSByZWZlcmVuY2UgaXMgYSA8PiByZWZlcmVuY2UuCisgIC8vLworICAvLy8gXHBhcmFtIEN1ckRpciBJZiBub24tbnVsbCwgdGhlIGZpbGUgd2FzIGZvdW5kIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5CisgIC8vLyBzZWFyY2ggbG9jYXRpb24uICBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IFwjaW5jbHVkZV9uZXh0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBJbmNsdWRlcnMgSW5kaWNhdGVzIHdoZXJlIHRoZSBcI2luY2x1ZGluZyBmaWxlKHMpIGFyZSwgaW4gY2FzZQorICAvLy8gcmVsYXRpdmUgc2VhcmNoZXMgYXJlIG5lZWRlZC4gSW4gcmV2ZXJzZSBvcmRlciBvZiBpbmNsdXNpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFNlYXJjaFBhdGggSWYgbm9uLW51bGwsIHdpbGwgYmUgc2V0IHRvIHRoZSBzZWFyY2ggcGF0aCByZWxhdGl2ZQorICAvLy8gdG8gd2hpY2ggdGhlIGZpbGUgd2FzIGZvdW5kLiBJZiB0aGUgaW5jbHVkZSBwYXRoIGlzIGFic29sdXRlLCBTZWFyY2hQYXRoCisgIC8vLyB3aWxsIGJlIHNldCB0byBhbiBlbXB0eSBzdHJpbmcuCisgIC8vLworICAvLy8gXHBhcmFtIFJlbGF0aXZlUGF0aCBJZiBub24tbnVsbCwgd2lsbCBiZSBzZXQgdG8gdGhlIHBhdGggcmVsYXRpdmUgdG8KKyAgLy8vIFNlYXJjaFBhdGggYXQgd2hpY2ggdGhlIGZpbGUgd2FzIGZvdW5kLiBUaGlzIG9ubHkgZGlmZmVycyBmcm9tIHRoZQorICAvLy8gRmlsZW5hbWUgZm9yIGZyYW1ld29yayBpbmNsdWRlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3VnZ2VzdGVkTW9kdWxlIElmIG5vbi1udWxsLCBhbmQgdGhlIGZpbGUgZm91bmQgaXMgc2VtYW50aWNhbGx5CisgIC8vLyBwYXJ0IG9mIGEga25vd24gbW9kdWxlLCB0aGlzIHdpbGwgYmUgc2V0IHRvIHRoZSBtb2R1bGUgdGhhdCBzaG91bGQKKyAgLy8vIGJlIGltcG9ydGVkIGluc3RlYWQgb2YgcHJlcHJvY2Vzc2luZy9wYXJzaW5nIHRoZSBmaWxlIGZvdW5kLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJc01hcHBlZCBJZiBub24tbnVsbCwgYW5kIHRoZSBzZWFyY2ggaW52b2x2ZWQgaGVhZGVyIG1hcHMsIHNldCB0bworICAvLy8gdHJ1ZS4KKyAgY29uc3QgRmlsZUVudHJ5ICpMb29rdXBGaWxlKAorICAgICAgU3RyaW5nUmVmIEZpbGVuYW1lLCBTb3VyY2VMb2NhdGlvbiBJbmNsdWRlTG9jLCBib29sIGlzQW5nbGVkLAorICAgICAgY29uc3QgRGlyZWN0b3J5TG9va3VwICpGcm9tRGlyLCBjb25zdCBEaXJlY3RvcnlMb29rdXAgKiZDdXJEaXIsCisgICAgICBBcnJheVJlZjxzdGQ6OnBhaXI8Y29uc3QgRmlsZUVudHJ5ICosIGNvbnN0IERpcmVjdG9yeUVudHJ5ICo+PiBJbmNsdWRlcnMsCisgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gKlNlYXJjaFBhdGgsIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAqUmVsYXRpdmVQYXRoLAorICAgICAgTW9kdWxlICpSZXF1ZXN0aW5nTW9kdWxlLCBNb2R1bGVNYXA6Oktub3duSGVhZGVyICpTdWdnZXN0ZWRNb2R1bGUsCisgICAgICBib29sICpJc01hcHBlZCwgYm9vbCBTa2lwQ2FjaGUgPSBmYWxzZSwgYm9vbCBCdWlsZFN5c3RlbU1vZHVsZSA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIExvb2sgdXAgYSBzdWJmcmFtZXdvcmsgZm9yIHRoZSBzcGVjaWZpZWQgXCNpbmNsdWRlIGZpbGUuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsIGlmIFwjaW5jbHVkZSdpbmcgPEhJVG9vbGJveC9ISVRvb2xib3guaD4gZnJvbQorICAvLy8gd2l0aGluICIuLi4vQ2FyYm9uLmZyYW1ld29yay9IZWFkZXJzL0NhcmJvbi5oIiwgY2hlY2sgdG8gc2VlIGlmCisgIC8vLyBISVRvb2xib3ggaXMgYSBzdWJmcmFtZXdvcmsgd2l0aGluIENhcmJvbi5mcmFtZXdvcmsuICBJZiBzbywgcmV0dXJuCisgIC8vLyB0aGUgRmlsZUVudHJ5IGZvciB0aGUgZGVzaWduYXRlZCBmaWxlLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuCisgIGNvbnN0IEZpbGVFbnRyeSAqTG9va3VwU3ViZnJhbWV3b3JrSGVhZGVyKAorICAgICAgU3RyaW5nUmVmIEZpbGVuYW1lLCBjb25zdCBGaWxlRW50cnkgKlJlbGF0aXZlRmlsZUVudCwKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAqU2VhcmNoUGF0aCwgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICpSZWxhdGl2ZVBhdGgsCisgICAgICBNb2R1bGUgKlJlcXVlc3RpbmdNb2R1bGUsIE1vZHVsZU1hcDo6S25vd25IZWFkZXIgKlN1Z2dlc3RlZE1vZHVsZSk7CisKKyAgLy8vIFxicmllZiBMb29rIHVwIHRoZSBzcGVjaWZpZWQgZnJhbWV3b3JrIG5hbWUgaW4gb3VyIGZyYW1ld29yayBjYWNoZS4KKyAgLy8vIFxyZXR1cm5zIFRoZSBEaXJlY3RvcnlFbnRyeSBpdCBpcyBpbiBpZiB3ZSBrbm93LCBudWxsIG90aGVyd2lzZS4KKyAgRnJhbWV3b3JrQ2FjaGVFbnRyeSAmTG9va3VwRnJhbWV3b3JrQ2FjaGUoU3RyaW5nUmVmIEZXTmFtZSkgeworICAgIHJldHVybiBGcmFtZXdvcmtNYXBbRldOYW1lXTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTWFyayB0aGUgc3BlY2lmaWVkIGZpbGUgYXMgYSB0YXJnZXQgb2YgYSBcI2luY2x1ZGUsCisgIC8vLyBcI2luY2x1ZGVfbmV4dCwgb3IgXCNpbXBvcnQgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gZmFsc2UgaWYgXCNpbmNsdWRpbmcgdGhlIGZpbGUgd2lsbCBoYXZlIG5vIGVmZmVjdCBvciB0cnVlCisgIC8vLyBpZiB3ZSBzaG91bGQgaW5jbHVkZSBpdC4KKyAgYm9vbCBTaG91bGRFbnRlckluY2x1ZGVGaWxlKFByZXByb2Nlc3NvciAmUFAsIGNvbnN0IEZpbGVFbnRyeSAqRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbXBvcnQsIGJvb2wgTW9kdWxlc0VuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUgKkNvcnJlc3BvbmRpbmdNb2R1bGUpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIGlzIGEgbm9ybWFsIGhlYWRlciwKKyAgLy8vIGEgc3lzdGVtIGhlYWRlciwgb3IgYSBDKysgZnJpZW5kbHkgc3lzdGVtIGhlYWRlci4KKyAgU3JjTWdyOjpDaGFyYWN0ZXJpc3RpY0tpbmQgZ2V0RmlsZURpckZsYXZvcihjb25zdCBGaWxlRW50cnkgKkZpbGUpIHsKKyAgICByZXR1cm4gKFNyY01ncjo6Q2hhcmFjdGVyaXN0aWNLaW5kKWdldEZpbGVJbmZvKEZpbGUpLkRpckluZm87CisgIH0KKworICAvLy8gXGJyaWVmIE1hcmsgdGhlIHNwZWNpZmllZCBmaWxlIGFzIGEgIm9uY2Ugb25seSIgZmlsZSwgZS5nLiBkdWUgdG8KKyAgLy8vIFwjcHJhZ21hIG9uY2UuCisgIHZvaWQgTWFya0ZpbGVJbmNsdWRlT25jZShjb25zdCBGaWxlRW50cnkgKkZpbGUpIHsKKyAgICBIZWFkZXJGaWxlSW5mbyAmRkkgPSBnZXRGaWxlSW5mbyhGaWxlKTsKKyAgICBGSS5pc0ltcG9ydCA9IHRydWU7CisgICAgRkkuaXNQcmFnbWFPbmNlID0gdHJ1ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTWFyayB0aGUgc3BlY2lmaWVkIGZpbGUgYXMgYSBzeXN0ZW0gaGVhZGVyLCBlLmcuIGR1ZSB0bworICAvLy8gXCNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIuCisgIHZvaWQgTWFya0ZpbGVTeXN0ZW1IZWFkZXIoY29uc3QgRmlsZUVudHJ5ICpGaWxlKSB7CisgICAgZ2V0RmlsZUluZm8oRmlsZSkuRGlySW5mbyA9IFNyY01ncjo6Q19TeXN0ZW07CisgIH0KKworICAvLy8gXGJyaWVmIE1hcmsgdGhlIHNwZWNpZmllZCBmaWxlIGFzIHBhcnQgb2YgYSBtb2R1bGUuCisgIHZvaWQgTWFya0ZpbGVNb2R1bGVIZWFkZXIoY29uc3QgRmlsZUVudHJ5ICpGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZU1hcDo6TW9kdWxlSGVhZGVyUm9sZSBSb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNDb21waWxlZE1vZHVsZUhlYWRlcik7CisKKyAgLy8vIFxicmllZiBJbmNyZW1lbnQgdGhlIGNvdW50IGZvciB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBzcGVjaWZpZWQKKyAgLy8vIEZpbGVFbnRyeSBoYXMgYmVlbiBlbnRlcmVkLgorICB2b2lkIEluY3JlbWVudEluY2x1ZGVDb3VudChjb25zdCBGaWxlRW50cnkgKkZpbGUpIHsKKyAgICArK2dldEZpbGVJbmZvKEZpbGUpLk51bUluY2x1ZGVzOworICB9CisKKyAgLy8vIFxicmllZiBNYXJrIHRoZSBzcGVjaWZpZWQgZmlsZSBhcyBoYXZpbmcgYSBjb250cm9sbGluZyBtYWNyby4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgYnkgdGhlIG11bHRpcGxlLWluY2x1ZGUgb3B0aW1pemF0aW9uIHRvIGVsaW1pbmF0ZQorICAvLy8gbm8tb3AgXCNpbmNsdWRlcy4KKyAgdm9pZCBTZXRGaWxlQ29udHJvbGxpbmdNYWNybyhjb25zdCBGaWxlRW50cnkgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSWRlbnRpZmllckluZm8gKkNvbnRyb2xsaW5nTWFjcm8pIHsKKyAgICBnZXRGaWxlSW5mbyhGaWxlKS5Db250cm9sbGluZ01hY3JvID0gQ29udHJvbGxpbmdNYWNybzsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSBlbmNvdW50ZXJpbmcgdGhpcyBoZWFkZXIuCisgIGJvb2wgRmlyc3RUaW1lTGV4aW5nRmlsZShjb25zdCBGaWxlRW50cnkgKkZpbGUpIHsKKyAgICByZXR1cm4gZ2V0RmlsZUluZm8oRmlsZSkuTnVtSW5jbHVkZXMgPT0gMTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIHNhZmUgZnJvbQorICAvLy8gbXVsdGlwbGUgaW5jbHVzaW9ucywgZS5nLiwgaXQgaGFzIFwjcHJhZ21hIG9uY2Ugb3IgYSBjb250cm9sbGluZworICAvLy8gbWFjcm8uCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIGRvZXMgbm90IGNvbnNpZGVyIHRoZSBlZmZlY3Qgb2YgXCNpbXBvcnQKKyAgYm9vbCBpc0ZpbGVNdWx0aXBsZUluY2x1ZGVHdWFyZGVkKGNvbnN0IEZpbGVFbnRyeSAqRmlsZSk7CisKKyAgLy8vIENyZWF0ZUhlYWRlck1hcCAtIFRoaXMgbWV0aG9kIHJldHVybnMgYSBIZWFkZXJNYXAgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIEZpbGVFbnRyeSwgdW5pcXVpbmcgdGhlbSB0aHJvdWdoIHRoZSAnSGVhZGVyTWFwcycgZGF0YXN0cnVjdHVyZS4KKyAgY29uc3QgSGVhZGVyTWFwICpDcmVhdGVIZWFkZXJNYXAoY29uc3QgRmlsZUVudHJ5ICpGRSk7CisKKyAgLy8vIFxicmllZiBHZXQgZmlsZW5hbWVzIGZvciBhbGwgcmVnaXN0ZXJlZCBoZWFkZXIgbWFwcy4KKyAgdm9pZCBnZXRIZWFkZXJNYXBGaWxlTmFtZXMoU21hbGxWZWN0b3JJbXBsPHN0ZDo6c3RyaW5nPiAmTmFtZXMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIGNhY2hlZCBtb2R1bGUgZmlsZSB0aGF0IHNob3VsZCBiZSB1c2VkCisgIC8vLyB0byBsb2FkIHRoZSBnaXZlbiBtb2R1bGUuCisgIC8vLworICAvLy8gXHBhcmFtIE1vZHVsZSBUaGUgbW9kdWxlIHdob3NlIG1vZHVsZSBmaWxlIG5hbWUgd2lsbCBiZSByZXR1cm5lZC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIGZpbGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIG1vZHVsZSwKKyAgLy8vIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGlzIG1vZHVsZSBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFueSBtb2R1bGUgZmlsZS4KKyAgc3RkOjpzdHJpbmcgZ2V0Q2FjaGVkTW9kdWxlRmlsZU5hbWUoTW9kdWxlICpNb2R1bGUpOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIHByZWJ1aWx0IG1vZHVsZSBmaWxlIHRoYXQgc2hvdWxkIGJlIHVzZWQKKyAgLy8vIHRvIGxvYWQgYSBtb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTW9kdWxlTmFtZSBUaGUgbW9kdWxlIHdob3NlIG1vZHVsZSBmaWxlIG5hbWUgd2lsbCBiZSByZXR1cm5lZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRmlsZU1hcE9ubHkgSWYgdHJ1ZSwgdGhlbiBvbmx5IGxvb2sgaW4gdGhlIGV4cGxpY2l0IG1vZHVsZSBuYW1lCisgIC8vICB0byBmaWxlIG5hbWUgbWFwIGFuZCBza2lwIHRoZSBkaXJlY3Rvcnkgc2VhcmNoLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgZmlsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgbW9kdWxlLAorICAvLy8gb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoaXMgbW9kdWxlIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW55IG1vZHVsZSBmaWxlLgorICBzdGQ6OnN0cmluZyBnZXRQcmVidWlsdE1vZHVsZUZpbGVOYW1lKFN0cmluZ1JlZiBNb2R1bGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRmlsZU1hcE9ubHkgPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgKHRvLWJlLSljYWNoZWQgbW9kdWxlIGZpbGUgdGhhdCBzaG91bGQKKyAgLy8vIGJlIHVzZWQgdG8gbG9hZCBhIG1vZHVsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNb2R1bGVOYW1lIFRoZSBtb2R1bGUgd2hvc2UgbW9kdWxlIGZpbGUgbmFtZSB3aWxsIGJlIHJldHVybmVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNb2R1bGVNYXBQYXRoIEEgcGF0aCB0aGF0IHdoZW4gY29tYmluZWQgd2l0aCBcYyBNb2R1bGVOYW1lCisgIC8vLyB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgbW9kdWxlLiBTZWUgTW9kdWxlOjpNb2R1bGVNYXAuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBmaWxlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBtb2R1bGUsCisgIC8vLyBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhpcyBtb2R1bGUgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbnkgbW9kdWxlIGZpbGUuCisgIHN0ZDo6c3RyaW5nIGdldENhY2hlZE1vZHVsZUZpbGVOYW1lKFN0cmluZ1JlZiBNb2R1bGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTW9kdWxlTWFwUGF0aCk7CisKKyAgLy8vIFxicmllZiBMb29rdXAgYSBtb2R1bGUgU2VhcmNoIGZvciBhIG1vZHVsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNb2R1bGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgd2UncmUgbG9va2luZyBmb3IuCisgIC8vLworICAvLy8gXHBhcmFtIEFsbG93U2VhcmNoIFdoZXRoZXIgd2UgYXJlIGFsbG93ZWQgdG8gc2VhcmNoIGluIHRoZSB2YXJpb3VzCisgIC8vLyBzZWFyY2ggZGlyZWN0b3JpZXMgdG8gcHJvZHVjZSBhIG1vZHVsZSBkZWZpbml0aW9uLiBJZiBub3QsIHRoaXMgbG9va3VwCisgIC8vLyB3aWxsIG9ubHkgcmV0dXJuIGFuIGFscmVhZHkta25vd24gbW9kdWxlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSBtb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgTW9kdWxlICpsb29rdXBNb2R1bGUoU3RyaW5nUmVmIE1vZHVsZU5hbWUsIGJvb2wgQWxsb3dTZWFyY2ggPSB0cnVlKTsKKworICAvLy8gXGJyaWVmIFRyeSB0byBmaW5kIGEgbW9kdWxlIG1hcCBmaWxlIGluIHRoZSBnaXZlbiBkaXJlY3RvcnksIHJldHVybmluZworICAvLy8gXGMgbnVsbHB0ciBpZiBub25lIGlzIGZvdW5kLgorICBjb25zdCBGaWxlRW50cnkgKmxvb2t1cE1vZHVsZU1hcEZpbGUoY29uc3QgRGlyZWN0b3J5RW50cnkgKkRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNGcmFtZXdvcmspOworICAKKyAgdm9pZCBJbmNyZW1lbnRGcmFtZXdvcmtMb29rdXBDb3VudCgpIHsgKytOdW1GcmFtZXdvcmtMb29rdXBzOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcyBhIG1vZHVsZSBtYXAgdGhhdCBtYXkgbWFwIHRoZSBoZWFkZXIKKyAgLy8vIHdpdGggdGhlIGdpdmVuIGZpbGUgbmFtZSB0byBhIChzdWIpbW9kdWxlLgorICAvLy8gQWx3YXlzIHJldHVybnMgZmFsc2UgaWYgbW9kdWxlcyBhcmUgZGlzYWJsZWQuCisgIC8vLworICAvLy8gXHBhcmFtIEZpbGVuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSb290IFRoZSAicm9vdCIgZGlyZWN0b3J5LCBhdCB3aGljaCB3ZSBzaG91bGQgc3RvcCBsb29raW5nIGZvcgorICAvLy8gbW9kdWxlIG1hcHMuCisgIC8vLworICAvLy8gXHBhcmFtIElzU3lzdGVtIFdoZXRoZXIgdGhlIGRpcmVjdG9yaWVzIHdlJ3JlIGxvb2tpbmcgYXQgYXJlIHN5c3RlbQorICAvLy8gaGVhZGVyIGRpcmVjdG9yaWVzLgorICBib29sIGhhc01vZHVsZU1hcChTdHJpbmdSZWYgRmlsZW5hbWUsIGNvbnN0IERpcmVjdG9yeUVudHJ5ICpSb290LAorICAgICAgICAgICAgICAgICAgICBib29sIElzU3lzdGVtKTsKKyAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG1vZHVsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBmaWxlLCBpZiBhbnkuCisgIC8vLworICAvLy8gXHBhcmFtIEZpbGUgVGhlIGhlYWRlciB0aGF0IHdlIHdpc2ggdG8gbWFwIHRvIGEgbW9kdWxlLgorICAvLy8gXHBhcmFtIEFsbG93VGV4dHVhbCBXaGV0aGVyIHdlIHdhbnQgdG8gZmluZCB0ZXh0dWFsIGhlYWRlcnMgdG9vLgorICBNb2R1bGVNYXA6Oktub3duSGVhZGVyIGZpbmRNb2R1bGVGb3JIZWFkZXIoY29uc3QgRmlsZUVudHJ5ICpGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd1RleHR1YWwgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gbW9kdWxlIG1hcCBmaWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBGaWxlIFRoZSBtb2R1bGUgbWFwIGZpbGUuCisgIC8vLyBccGFyYW0gSXNTeXN0ZW0gV2hldGhlciB0aGlzIGZpbGUgaXMgaW4gYSBzeXN0ZW0gaGVhZGVyIGRpcmVjdG9yeS4KKyAgLy8vIFxwYXJhbSBJRCBJZiB0aGUgbW9kdWxlIG1hcCBmaWxlIGlzIGFscmVhZHkgbWFwcGVkIChwZXJoYXBzIGFzIHBhcnQgb2YKKyAgLy8vICAgICAgICBwcm9jZXNzaW5nIGEgcHJlcHJvY2Vzc2VkIG1vZHVsZSksIHRoZSBJRCBvZiB0aGUgZmlsZS4KKyAgLy8vIFxwYXJhbSBPZmZzZXQgW2lub3V0XSBBbiBvZmZzZXQgd2l0aGluIElEIHRvIHN0YXJ0IHBhcnNpbmcuIE9uIGV4aXQsCisgIC8vLyAgICAgICAgZmlsbGVkIGJ5IHRoZSBlbmQgb2YgdGhlIHBhcnNlZCBjb250ZW50cyAoZWl0aGVyIEVPRiBvciB0aGUKKyAgLy8vICAgICAgICBsb2NhdGlvbiBvZiBhbiBlbmQtb2YtbW9kdWxlLW1hcCBwcmFnbWEpLgorICAvLy8gXHBhcmFtIE9yaWdpbmFsTW9kdWxlTWFwRmlsZSBUaGUgb3JpZ2luYWwgcGF0aCB0byB0aGUgbW9kdWxlIG1hcCBmaWxlLAorICAvLy8gICAgICAgIHVzZWQgdG8gcmVzb2x2ZSBwYXRocyB3aXRoaW4gdGhlIG1vZHVsZSAodGhpcyBpcyByZXF1aXJlZCB3aGVuCisgIC8vLyAgICAgICAgYnVpbGRpbmcgdGhlIG1vZHVsZSBmcm9tIHByZXByb2Nlc3NlZCBzb3VyY2UpLgorICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGxvYWRNb2R1bGVNYXBGaWxlKGNvbnN0IEZpbGVFbnRyeSAqRmlsZSwgYm9vbCBJc1N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSUQgSUQgPSBGaWxlSUQoKSwgdW5zaWduZWQgKk9mZnNldCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE9yaWdpbmFsTW9kdWxlTWFwRmlsZSA9IFN0cmluZ1JlZigpKTsKKworICAvLy8gXGJyaWVmIENvbGxlY3QgdGhlIHNldCBvZiBhbGwga25vd24sIHRvcC1sZXZlbCBtb2R1bGVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNb2R1bGVzIFdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHNldCBvZiBrbm93biwgdG9wLWxldmVsIG1vZHVsZXMuCisgIHZvaWQgY29sbGVjdEFsbE1vZHVsZXMoU21hbGxWZWN0b3JJbXBsPE1vZHVsZSAqPiAmTW9kdWxlcyk7CisKKyAgLy8vIFxicmllZiBMb2FkIGFsbCBrbm93biwgdG9wLWxldmVsIHN5c3RlbSBtb2R1bGVzLgorICB2b2lkIGxvYWRUb3BMZXZlbFN5c3RlbU1vZHVsZXMoKTsKKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBMb29rdXAgYSBtb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gbW9kdWxlIG5hbWUgYW5kIHNlYXJjaC1uYW1lLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNb2R1bGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgd2UncmUgbG9va2luZyBmb3IuCisgIC8vLworICAvLy8gXHBhcmFtIFNlYXJjaE5hbWUgVGhlICJzZWFyY2gtbmFtZSIgdG8gZGVyaXZlIGZpbGVzeXN0ZW0gcGF0aHMgZnJvbQorICAvLy8gd2hlbiBsb29raW5nIGZvciB0aGUgbW9kdWxlIG1hcDsgdGhpcyBpcyB1c3VhbGx5IGVxdWFsIHRvIE1vZHVsZU5hbWUsCisgIC8vLyBidXQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzb21lIGJ1Z2d5IGZyYW1ld29ya3MsIGFkZGl0aW9uYWwgYXR0ZW1wdHMKKyAgLy8vIG1heSBiZSBtYWRlIHRvIGZpbmQgdGhlIG1vZHVsZSB1bmRlciBhIHJlbGF0ZWQtYnV0LWRpZmZlcmVudCBzZWFyY2gtbmFtZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBUaGUgbW9kdWxlIG5hbWVkIE1vZHVsZU5hbWUuCisgIE1vZHVsZSAqbG9va3VwTW9kdWxlKFN0cmluZ1JlZiBNb2R1bGVOYW1lLCBTdHJpbmdSZWYgU2VhcmNoTmFtZSk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBhIG1vZHVsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCB3aGljaCBtYXkgYmUgcGFydCBvZiB0aGUKKyAgLy8vIGdpdmVuIGZyYW1ld29yay4KKyAgLy8vCisgIC8vLyBccGFyYW0gTmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIHJldHJpZXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBEaXIgVGhlIGZyYW1ld29yayBkaXJlY3RvcnkgKGUuZy4sIE1vZHVsZU5hbWUuZnJhbWV3b3JrKS4KKyAgLy8vCisgIC8vLyBccGFyYW0gSXNTeXN0ZW0gV2hldGhlciB0aGUgZnJhbWV3b3JrIGRpcmVjdG9yeSBpcyBwYXJ0IG9mIHRoZSBzeXN0ZW0KKyAgLy8vIGZyYW1ld29ya3MuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIG1vZHVsZSwgaWYgZm91bmQ7IG90aGVyd2lzZSwgbnVsbC4KKyAgTW9kdWxlICpsb2FkRnJhbWV3b3JrTW9kdWxlKFN0cmluZ1JlZiBOYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpcmVjdG9yeUVudHJ5ICpEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzU3lzdGVtKTsKKworICAvLy8gXGJyaWVmIExvYWQgYWxsIG9mIHRoZSBtb2R1bGUgbWFwcyB3aXRoaW4gdGhlIGltbWVkaWF0ZSBzdWJkaXJlY3RvcmllcworICAvLy8gb2YgdGhlIGdpdmVuIHNlYXJjaCBkaXJlY3RvcnkuCisgIHZvaWQgbG9hZFN1YmRpcmVjdG9yeU1vZHVsZU1hcHMoRGlyZWN0b3J5TG9va3VwICZTZWFyY2hEaXIpOworCisgIC8vLyBcYnJpZWYgRmluZCBhbmQgc3VnZ2VzdCBhIHVzYWJsZSBtb2R1bGUgZm9yIHRoZSBnaXZlbiBmaWxlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gXGMgdHJ1ZSBpZiB0aGUgZmlsZSBjYW4gYmUgdXNlZCwgXGMgZmFsc2UgaWYgd2UgYXJlIG5vdCBwZXJtaXR0ZWQgdG8KKyAgLy8vICAgICAgICAgZmluZCB0aGlzIGZpbGUgZHVlIHRvIHJlcXVpcmVtZW50cyBmcm9tIFxwIFJlcXVlc3RpbmdNb2R1bGUuCisgIGJvb2wgZmluZFVzYWJsZU1vZHVsZUZvckhlYWRlcihjb25zdCBGaWxlRW50cnkgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaXJlY3RvcnlFbnRyeSAqUm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqUmVxdWVzdGluZ01vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZU1hcDo6S25vd25IZWFkZXIgKlN1Z2dlc3RlZE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNTeXN0ZW1IZWFkZXJEaXIpOworCisgIC8vLyBcYnJpZWYgRmluZCBhbmQgc3VnZ2VzdCBhIHVzYWJsZSBtb2R1bGUgZm9yIHRoZSBnaXZlbiBmaWxlLCB3aGljaCBpcyBwYXJ0IG9mCisgIC8vLyB0aGUgc3BlY2lmaWVkIGZyYW1ld29yay4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFxjIHRydWUgaWYgdGhlIGZpbGUgY2FuIGJlIHVzZWQsIFxjIGZhbHNlIGlmIHdlIGFyZSBub3QgcGVybWl0dGVkIHRvCisgIC8vLyAgICAgICAgIGZpbmQgdGhpcyBmaWxlIGR1ZSB0byByZXF1aXJlbWVudHMgZnJvbSBccCBSZXF1ZXN0aW5nTW9kdWxlLgorICBib29sIGZpbmRVc2FibGVNb2R1bGVGb3JGcmFtZXdvcmtIZWFkZXIoCisgICAgICBjb25zdCBGaWxlRW50cnkgKkZpbGUsIFN0cmluZ1JlZiBGcmFtZXdvcmtEaXIsIE1vZHVsZSAqUmVxdWVzdGluZ01vZHVsZSwKKyAgICAgIE1vZHVsZU1hcDo6S25vd25IZWFkZXIgKlN1Z2dlc3RlZE1vZHVsZSwgYm9vbCBJc1N5c3RlbUZyYW1ld29yayk7CisKKyAgLy8vIFxicmllZiBMb29rIHVwIHRoZSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBkZXRlcm1pbmUgaXRzIG93bmluZworICAvLy8gbW9kdWxlLgorICBjb25zdCBGaWxlRW50cnkgKgorICBnZXRGaWxlQW5kU3VnZ2VzdE1vZHVsZShTdHJpbmdSZWYgRmlsZU5hbWUsIFNvdXJjZUxvY2F0aW9uIEluY2x1ZGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpcmVjdG9yeUVudHJ5ICpEaXIsIGJvb2wgSXNTeXN0ZW1IZWFkZXJEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqUmVxdWVzdGluZ01vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlTWFwOjpLbm93bkhlYWRlciAqU3VnZ2VzdGVkTW9kdWxlKTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtb2R1bGUgbWFwLgorICBNb2R1bGVNYXAgJmdldE1vZHVsZU1hcCgpIHsgcmV0dXJuIE1vZE1hcDsgfQorICAKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbW9kdWxlIG1hcC4KKyAgY29uc3QgTW9kdWxlTWFwICZnZXRNb2R1bGVNYXAoKSBjb25zdCB7IHJldHVybiBNb2RNYXA7IH0KKyAgCisgIHVuc2lnbmVkIGhlYWRlcl9maWxlX3NpemUoKSBjb25zdCB7IHJldHVybiBGaWxlSW5mby5zaXplKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgSGVhZGVyRmlsZUluZm8gc3RydWN0dXJlIGZvciB0aGUgc3BlY2lmaWVkIEZpbGVFbnRyeSwKKyAgLy8vIGluIHByZXBhcmF0aW9uIGZvciB1cGRhdGluZyBpdCBpbiBzb21lIHdheS4KKyAgSGVhZGVyRmlsZUluZm8gJmdldEZpbGVJbmZvKGNvbnN0IEZpbGVFbnRyeSAqRkUpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBIZWFkZXJGaWxlSW5mbyBzdHJ1Y3R1cmUgZm9yIHRoZSBzcGVjaWZpZWQgRmlsZUVudHJ5LAorICAvLy8gaWYgaXQgaGFzIGV2ZXIgYmVlbiBmaWxsZWQgaW4uCisgIC8vLyBccGFyYW0gV2FudEV4dGVybmFsIFdoZXRoZXIgdGhlIGNhbGxlciB3YW50cyBwdXJlbHktZXh0ZXJuYWwgaGVhZGVyIGZpbGUKKyAgLy8vICAgICAgICBpbmZvICh3aGVyZSBccCBFeHRlcm5hbCBpcyB0cnVlKS4KKyAgY29uc3QgSGVhZGVyRmlsZUluZm8gKmdldEV4aXN0aW5nRmlsZUluZm8oY29uc3QgRmlsZUVudHJ5ICpGRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBXYW50RXh0ZXJuYWwgPSB0cnVlKSBjb25zdDsKKworICAvLyBVc2VkIGJ5IGV4dGVybmFsIHRvb2xzCisgIHVzaW5nIHNlYXJjaF9kaXJfaXRlcmF0b3IgPSBzdGQ6OnZlY3RvcjxEaXJlY3RvcnlMb29rdXA+Ojpjb25zdF9pdGVyYXRvcjsKKworICBzZWFyY2hfZGlyX2l0ZXJhdG9yIHNlYXJjaF9kaXJfYmVnaW4oKSBjb25zdCB7IHJldHVybiBTZWFyY2hEaXJzLmJlZ2luKCk7IH0KKyAgc2VhcmNoX2Rpcl9pdGVyYXRvciBzZWFyY2hfZGlyX2VuZCgpIGNvbnN0IHsgcmV0dXJuIFNlYXJjaERpcnMuZW5kKCk7IH0KKyAgdW5zaWduZWQgc2VhcmNoX2Rpcl9zaXplKCkgY29uc3QgeyByZXR1cm4gU2VhcmNoRGlycy5zaXplKCk7IH0KKworICBzZWFyY2hfZGlyX2l0ZXJhdG9yIHF1b3RlZF9kaXJfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIFNlYXJjaERpcnMuYmVnaW4oKTsKKyAgfQorCisgIHNlYXJjaF9kaXJfaXRlcmF0b3IgcXVvdGVkX2Rpcl9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIFNlYXJjaERpcnMuYmVnaW4oKSArIEFuZ2xlZERpcklkeDsKKyAgfQorCisgIHNlYXJjaF9kaXJfaXRlcmF0b3IgYW5nbGVkX2Rpcl9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gU2VhcmNoRGlycy5iZWdpbigpICsgQW5nbGVkRGlySWR4OworICB9CisKKyAgc2VhcmNoX2Rpcl9pdGVyYXRvciBhbmdsZWRfZGlyX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU2VhcmNoRGlycy5iZWdpbigpICsgU3lzdGVtRGlySWR4OworICB9CisKKyAgc2VhcmNoX2Rpcl9pdGVyYXRvciBzeXN0ZW1fZGlyX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBTZWFyY2hEaXJzLmJlZ2luKCkgKyBTeXN0ZW1EaXJJZHg7CisgIH0KKworICBzZWFyY2hfZGlyX2l0ZXJhdG9yIHN5c3RlbV9kaXJfZW5kKCkgY29uc3QgeyByZXR1cm4gU2VhcmNoRGlycy5lbmQoKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYSB1bmlxdWVkIGZyYW1ld29yayBuYW1lLgorICBTdHJpbmdSZWYgZ2V0VW5pcXVlRnJhbWV3b3JrTmFtZShTdHJpbmdSZWYgRnJhbWV3b3JrKTsKKworICAvLy8gXGJyaWVmIFN1Z2dlc3QgYSBwYXRoIGJ5IHdoaWNoIHRoZSBzcGVjaWZpZWQgZmlsZSBjb3VsZCBiZSBmb3VuZCwgZm9yCisgIC8vLyB1c2UgaW4gZGlhZ25vc3RpY3MgdG8gc3VnZ2VzdCBhICNpbmNsdWRlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJc1N5c3RlbSBJZiBub24tbnVsbCwgZmlsbGVkIGluIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHN1Z2dlc3RlZAorICAvLy8gICAgICAgIHBhdGggaXMgcmVsYXRpdmUgdG8gYSBzeXN0ZW0gaGVhZGVyIGRpcmVjdG9yeS4KKyAgc3RkOjpzdHJpbmcgc3VnZ2VzdFBhdGhUb0ZpbGVGb3JEaWFnbm9zdGljcyhjb25zdCBGaWxlRW50cnkgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqSXNTeXN0ZW0gPSBudWxscHRyKTsKKworICAvLy8gXGJyaWVmIFN1Z2dlc3QgYSBwYXRoIGJ5IHdoaWNoIHRoZSBzcGVjaWZpZWQgZmlsZSBjb3VsZCBiZSBmb3VuZCwgZm9yCisgIC8vLyB1c2UgaW4gZGlhZ25vc3RpY3MgdG8gc3VnZ2VzdCBhICNpbmNsdWRlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBXb3JraW5nRGlyIElmIG5vbi1lbXB0eSwgdGhpcyB3aWxsIGJlIHByZXBlbmRlZCB0byBzZWFyY2ggZGlyZWN0b3J5CisgIC8vLyBwYXRocyB0aGF0IGFyZSByZWxhdGl2ZS4KKyAgc3RkOjpzdHJpbmcgc3VnZ2VzdFBhdGhUb0ZpbGVGb3JEaWFnbm9zdGljcyhsbHZtOjpTdHJpbmdSZWYgRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgV29ya2luZ0RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpJc1N5c3RlbSA9IG51bGxwdHIpOworCisgIHZvaWQgUHJpbnRTdGF0cygpOworICAKKyAgc2l6ZV90IGdldFRvdGFsTWVtb3J5KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgRGVzY3JpYmVzIHdoYXQgaGFwcGVuZWQgd2hlbiB3ZSB0cmllZCB0byBsb2FkIGEgbW9kdWxlIG1hcCBmaWxlLgorICBlbnVtIExvYWRNb2R1bGVNYXBSZXN1bHQgeworICAgIC8vLyBcYnJpZWYgVGhlIG1vZHVsZSBtYXAgZmlsZSBoYWQgYWxyZWFkeSBiZWVuIGxvYWRlZC4KKyAgICBMTU1fQWxyZWFkeUxvYWRlZCwKKworICAgIC8vLyBcYnJpZWYgVGhlIG1vZHVsZSBtYXAgZmlsZSB3YXMgbG9hZGVkIGJ5IHRoaXMgaW52b2NhdGlvbi4KKyAgICBMTU1fTmV3bHlMb2FkZWQsCisKKyAgICAvLy8gXGJyaWVmIFRoZXJlIGlzIHdhcyBkaXJlY3Rvcnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICBMTU1fTm9EaXJlY3RvcnksCisKKyAgICAvLy8gXGJyaWVmIFRoZXJlIHdhcyBlaXRoZXIgbm8gbW9kdWxlIG1hcCBmaWxlIG9yIHRoZSBtb2R1bGUgbWFwIGZpbGUgd2FzCisgICAgLy8vIGludmFsaWQuCisgICAgTE1NX0ludmFsaWRNb2R1bGVNYXAKKyAgfTsKKworICBMb2FkTW9kdWxlTWFwUmVzdWx0IGxvYWRNb2R1bGVNYXBGaWxlSW1wbChjb25zdCBGaWxlRW50cnkgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNTeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpcmVjdG9yeUVudHJ5ICpEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJRCBJRCA9IEZpbGVJRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqT2Zmc2V0ID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBUcnkgdG8gbG9hZCB0aGUgbW9kdWxlIG1hcCBmaWxlIGluIHRoZSBnaXZlbiBkaXJlY3RvcnkuCisgIC8vLworICAvLy8gXHBhcmFtIERpck5hbWUgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB3aGVyZSB3ZSB3aWxsIGxvb2sgZm9yIGEgbW9kdWxlCisgIC8vLyBtYXAgZmlsZS4KKyAgLy8vIFxwYXJhbSBJc1N5c3RlbSBXaGV0aGVyIHRoaXMgaXMgYSBzeXN0ZW0gaGVhZGVyIGRpcmVjdG9yeS4KKyAgLy8vIFxwYXJhbSBJc0ZyYW1ld29yayBXaGV0aGVyIHRoaXMgaXMgYSBmcmFtZXdvcmsgZGlyZWN0b3J5LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSByZXN1bHQgb2YgYXR0ZW1wdGluZyB0byBsb2FkIHRoZSBtb2R1bGUgbWFwIGZpbGUgZnJvbSB0aGUKKyAgLy8vIG5hbWVkIGRpcmVjdG9yeS4KKyAgTG9hZE1vZHVsZU1hcFJlc3VsdCBsb2FkTW9kdWxlTWFwRmlsZShTdHJpbmdSZWYgRGlyTmFtZSwgYm9vbCBJc1N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRnJhbWV3b3JrKTsKKworICAvLy8gXGJyaWVmIFRyeSB0byBsb2FkIHRoZSBtb2R1bGUgbWFwIGZpbGUgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeS4KKyAgLy8vCisgIC8vLyBccGFyYW0gRGlyIFRoZSBkaXJlY3Rvcnkgd2hlcmUgd2Ugd2lsbCBsb29rIGZvciBhIG1vZHVsZSBtYXAgZmlsZS4KKyAgLy8vIFxwYXJhbSBJc1N5c3RlbSBXaGV0aGVyIHRoaXMgaXMgYSBzeXN0ZW0gaGVhZGVyIGRpcmVjdG9yeS4KKyAgLy8vIFxwYXJhbSBJc0ZyYW1ld29yayBXaGV0aGVyIHRoaXMgaXMgYSBmcmFtZXdvcmsgZGlyZWN0b3J5LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSByZXN1bHQgb2YgYXR0ZW1wdGluZyB0byBsb2FkIHRoZSBtb2R1bGUgbWFwIGZpbGUgZnJvbSB0aGUKKyAgLy8vIG5hbWVkIGRpcmVjdG9yeS4KKyAgTG9hZE1vZHVsZU1hcFJlc3VsdCBsb2FkTW9kdWxlTWFwRmlsZShjb25zdCBEaXJlY3RvcnlFbnRyeSAqRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNTeXN0ZW0sIGJvb2wgSXNGcmFtZXdvcmspOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfTEVYX0hFQURFUlNFQVJDSF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvSGVhZGVyU2VhcmNoT3B0aW9ucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L0hlYWRlclNlYXJjaE9wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzdhZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L0hlYWRlclNlYXJjaE9wdGlvbnMuaApAQCAtMCwwICsxLDIzOSBAQAorLy89PT0tIEhlYWRlclNlYXJjaE9wdGlvbnMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0xFWF9IRUFERVJTRUFSQ0hPUFRJT05TX0gKKyNkZWZpbmUgTExWTV9DTEFOR19MRVhfSEVBREVSU0VBUkNIT1BUSU9OU19ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQ2FjaGVkSGFzaFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+IAorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgY2xhbmcgeworCituYW1lc3BhY2UgZnJvbnRlbmQgeworCisvLy8gSW5jbHVkZURpckdyb3VwIC0gSWRlbnRpZmllcyB0aGUgZ3JvdXAgYW4gaW5jbHVkZSBFbnRyeSBiZWxvbmdzIHRvLAorLy8vIHJlcHJlc2VudGluZyBpdHMgcmVsYXRpdmUgcG9zaXRpdmUgaW4gdGhlIHNlYXJjaCBsaXN0LgorLy8vIFwjaW5jbHVkZSBkaXJlY3RpdmVzIHdob3NlIHBhdGhzIGFyZSBlbmNsb3NlZCBieSBzdHJpbmcgcXVvdGVzICgiIikKKy8vLyBzdGFydCBzZWFyY2hpbmcgYXQgdGhlIFF1b3RlZCBncm91cCAoc3BlY2lmaWVkIGJ5ICctaXF1b3RlJyksCisvLy8gdGhlbiBzZWFyY2ggdGhlIEFuZ2xlZCBncm91cCwgdGhlbiB0aGUgU3lzdGVtIGdyb3VwLCBldGMuCitlbnVtIEluY2x1ZGVEaXJHcm91cCB7CisgIC8vLyAnXCNpbmNsdWRlICIiJyBwYXRocywgYWRkZWQgYnkgJ2djYyAtaXF1b3RlJy4KKyAgUXVvdGVkID0gMCwKKworICAvLy8gUGF0aHMgZm9yICdcI2luY2x1ZGUgPD4nIGFkZGVkIGJ5ICctSScuCisgIEFuZ2xlZCwKKworICAvLy8gTGlrZSBBbmdsZWQsIGJ1dCBtYXJrcyBoZWFkZXIgbWFwcyB1c2VkIHdoZW4gYnVpbGRpbmcgZnJhbWV3b3Jrcy4KKyAgSW5kZXhIZWFkZXJNYXAsIAorCisgIC8vLyBMaWtlIEFuZ2xlZCwgYnV0IG1hcmtzIHN5c3RlbSBkaXJlY3Rvcmllcy4KKyAgU3lzdGVtLAorCisgIC8vLyBMaWtlIFN5c3RlbSwgYnV0IGhlYWRlcnMgYXJlIGltcGxpY2l0bHkgd3JhcHBlZCBpbiBleHRlcm4gIkMiLgorICBFeHRlcm5DU3lzdGVtLAorCisgIC8vLyBMaWtlIFN5c3RlbSwgYnV0IG9ubHkgdXNlZCBmb3IgQy4KKyAgQ1N5c3RlbSwKKworICAvLy8gTGlrZSBTeXN0ZW0sIGJ1dCBvbmx5IHVzZWQgZm9yIEMrKy4KKyAgQ1hYU3lzdGVtLAorCisgIC8vLyBMaWtlIFN5c3RlbSwgYnV0IG9ubHkgdXNlZCBmb3IgT2JqQy4KKyAgT2JqQ1N5c3RlbSwKKworICAvLy8gTGlrZSBTeXN0ZW0sIGJ1dCBvbmx5IHVzZWQgZm9yIE9iakMrKy4KKyAgT2JqQ1hYU3lzdGVtLAorCisgIC8vLyBMaWtlIFN5c3RlbSwgYnV0IHNlYXJjaGVkIGFmdGVyIHRoZSBzeXN0ZW0gZGlyZWN0b3JpZXMuCisgIEFmdGVyCit9OworCit9IC8vIG5hbWVzcGFjZSBmcm9udGVuZAorCisvLy8gSGVhZGVyU2VhcmNoT3B0aW9ucyAtIEhlbHBlciBjbGFzcyBmb3Igc3RvcmluZyBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlCisvLy8gaW5pdGlhbGl6YXRpb24gb2YgdGhlIEhlYWRlclNlYXJjaCBvYmplY3QuCitjbGFzcyBIZWFkZXJTZWFyY2hPcHRpb25zIHsKK3B1YmxpYzoKKyAgc3RydWN0IEVudHJ5IHsKKyAgICBzdGQ6OnN0cmluZyBQYXRoOworICAgIGZyb250ZW5kOjpJbmNsdWRlRGlyR3JvdXAgR3JvdXA7CisgICAgdW5zaWduZWQgSXNGcmFtZXdvcmsgOiAxOworICAgIAorICAgIC8vLyBJZ25vcmVTeXNSb290IC0gVGhpcyBpcyBmYWxzZSBpZiBhbiBhYnNvbHV0ZSBwYXRoIHNob3VsZCBiZSB0cmVhdGVkCisgICAgLy8vIHJlbGF0aXZlIHRvIHRoZSBzeXNyb290LCBvciB0cnVlIGlmIGl0IHNob3VsZCBhbHdheXMgYmUgdGhlIGFic29sdXRlCisgICAgLy8vIHBhdGguCisgICAgdW5zaWduZWQgSWdub3JlU3lzUm9vdCA6IDE7CisKKyAgICBFbnRyeShTdHJpbmdSZWYgcGF0aCwgZnJvbnRlbmQ6OkluY2x1ZGVEaXJHcm91cCBncm91cCwgYm9vbCBpc0ZyYW1ld29yaywKKyAgICAgICAgICBib29sIGlnbm9yZVN5c1Jvb3QpCisgICAgICAgIDogUGF0aChwYXRoKSwgR3JvdXAoZ3JvdXApLCBJc0ZyYW1ld29yayhpc0ZyYW1ld29yayksCisgICAgICAgICAgSWdub3JlU3lzUm9vdChpZ25vcmVTeXNSb290KSB7fQorICB9OworCisgIHN0cnVjdCBTeXN0ZW1IZWFkZXJQcmVmaXggeworICAgIC8vLyBBIHByZWZpeCB0byBiZSBtYXRjaGVkIGFnYWluc3QgcGF0aHMgaW4gXCNpbmNsdWRlIGRpcmVjdGl2ZXMuCisgICAgc3RkOjpzdHJpbmcgUHJlZml4OworCisgICAgLy8vIFRydWUgaWYgcGF0aHMgYmVnaW5uaW5nIHdpdGggdGhpcyBwcmVmaXggc2hvdWxkIGJlIHRyZWF0ZWQgYXMgc3lzdGVtCisgICAgLy8vIGhlYWRlcnMuCisgICAgYm9vbCBJc1N5c3RlbUhlYWRlcjsKKworICAgIFN5c3RlbUhlYWRlclByZWZpeChTdHJpbmdSZWYgUHJlZml4LCBib29sIElzU3lzdGVtSGVhZGVyKQorICAgICAgICA6IFByZWZpeChQcmVmaXgpLCBJc1N5c3RlbUhlYWRlcihJc1N5c3RlbUhlYWRlcikge30KKyAgfTsKKworICAvLy8gSWYgbm9uLWVtcHR5LCB0aGUgZGlyZWN0b3J5IHRvIHVzZSBhcyBhICJ2aXJ0dWFsIHN5c3RlbSByb290IiBmb3IgaW5jbHVkZQorICAvLy8gcGF0aHMuCisgIHN0ZDo6c3RyaW5nIFN5c3Jvb3Q7CisKKyAgLy8vIFVzZXIgc3BlY2lmaWVkIGluY2x1ZGUgZW50cmllcy4KKyAgc3RkOjp2ZWN0b3I8RW50cnk+IFVzZXJFbnRyaWVzOworCisgIC8vLyBVc2VyLXNwZWNpZmllZCBzeXN0ZW0gaGVhZGVyIHByZWZpeGVzLgorICBzdGQ6OnZlY3RvcjxTeXN0ZW1IZWFkZXJQcmVmaXg+IFN5c3RlbUhlYWRlclByZWZpeGVzOworCisgIC8vLyBUaGUgZGlyZWN0b3J5IHdoaWNoIGhvbGRzIHRoZSBjb21waWxlciByZXNvdXJjZSBmaWxlcyAoYnVpbHRpbiBpbmNsdWRlcywKKyAgLy8vIGV0Yy4pLgorICBzdGQ6OnN0cmluZyBSZXNvdXJjZURpcjsKKworICAvLy8gXGJyaWVmIFRoZSBkaXJlY3RvcnkgdXNlZCBmb3IgdGhlIG1vZHVsZSBjYWNoZS4KKyAgc3RkOjpzdHJpbmcgTW9kdWxlQ2FjaGVQYXRoOworCisgIC8vLyBcYnJpZWYgVGhlIGRpcmVjdG9yeSB1c2VkIGZvciBhIHVzZXIgYnVpbGQuCisgIHN0ZDo6c3RyaW5nIE1vZHVsZVVzZXJCdWlsZFBhdGg7CisKKyAgLy8vIFxicmllZiBUaGUgbWFwcGluZyBvZiBtb2R1bGUgbmFtZXMgdG8gcHJlYnVpbHQgbW9kdWxlIGZpbGVzLgorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IFByZWJ1aWx0TW9kdWxlRmlsZXM7CisKKyAgLy8vIFxicmllZiBUaGUgZGlyZWN0b3JpZXMgdXNlZCB0byBsb2FkIHByZWJ1aWx0IG1vZHVsZSBmaWxlcy4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFByZWJ1aWx0TW9kdWxlUGF0aHM7CisKKyAgLy8vIFRoZSBtb2R1bGUvcGNoIGNvbnRhaW5lciBmb3JtYXQuCisgIHN0ZDo6c3RyaW5nIE1vZHVsZUZvcm1hdDsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgd2Ugc2hvdWxkIGRpc2FibGUgdGhlIHVzZSBvZiB0aGUgaGFzaCBzdHJpbmcgd2l0aGluIHRoZQorICAvLy8gbW9kdWxlIGNhY2hlLgorICAvLy8KKyAgLy8vIE5vdGU6IE9ubHkgdXNlZCBmb3IgdGVzdGluZyEKKyAgdW5zaWduZWQgRGlzYWJsZU1vZHVsZUhhc2ggOiAxOworCisgIC8vLyBcYnJpZWYgSW1wbGljaXQgbW9kdWxlIG1hcHMuICBUaGlzIG9wdGlvbiBpcyBlbmFibGQgYnkgZGVmYXVsdCB3aGVuCisgIC8vLyBtb2R1bGVzIGlzIGVuYWJsZWQuCisgIHVuc2lnbmVkIEltcGxpY2l0TW9kdWxlTWFwcyA6IDE7CisKKyAgLy8vIFxicmllZiBTZXQgdGhlICdob21lIGRpcmVjdG9yeScgb2YgYSBtb2R1bGUgbWFwIGZpbGUgdG8gdGhlIGN1cnJlbnQKKyAgLy8vIHdvcmtpbmcgZGlyZWN0b3J5IChvciB0aGUgaG9tZSBkaXJlY3Rvcnkgb2YgdGhlIG1vZHVsZSBtYXAgZmlsZSB0aGF0CisgIC8vLyBjb250YWluZWQgdGhlICdleHRlcm4gbW9kdWxlJyBkaXJlY3RpdmUgaW1wb3J0aW5nIHRoaXMgbW9kdWxlIG1hcCBmaWxlCisgIC8vLyBpZiBhbnkpIHJhdGhlciB0aGFuIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgbW9kdWxlIG1hcCBmaWxlLgorICAvLworICAvLy8gVGhlIGhvbWUgZGlyZWN0b3J5IGlzIHdoZXJlIHdlIGxvb2sgZm9yIGZpbGVzIG5hbWVkIGluIHRoZSBtb2R1bGUgbWFwCisgIC8vLyBmaWxlLgorICB1bnNpZ25lZCBNb2R1bGVNYXBGaWxlSG9tZUlzQ3dkIDogMTsKKworICAvLy8gXGJyaWVmIFRoZSBpbnRlcnZhbCAoaW4gc2Vjb25kcykgYmV0d2VlbiBwcnVuaW5nIG9wZXJhdGlvbnMuCisgIC8vLworICAvLy8gVGhpcyBvcGVyYXRpb24gaXMgZXhwZW5zaXZlLCBiZWNhdXNlIGl0IHJlcXVpcmVzIENsYW5nIHRvIHdhbGsgdGhyb3VnaAorICAvLy8gdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZHVsZSBjYWNoZSwgc3RhdCgpJ2luZyBhbmQgcmVtb3ZpbmcKKyAgLy8vIGZpbGVzLgorICAvLy8KKyAgLy8vIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGxhcmdlLCBlLmcuLCB0aGUgb3BlcmF0aW9uIHJ1bnMgb25jZSBhIHdlZWsuCisgIHVuc2lnbmVkIE1vZHVsZUNhY2hlUHJ1bmVJbnRlcnZhbCA9IDcgKiAyNCAqIDYwICogNjA7CisKKyAgLy8vIFxicmllZiBUaGUgdGltZSAoaW4gc2Vjb25kcykgYWZ0ZXIgd2hpY2ggYW4gdW51c2VkIG1vZHVsZSBmaWxlIHdpbGwgYmUKKyAgLy8vIGNvbnNpZGVyZWQgdW51c2VkIGFuZCB3aWxsLCB0aGVyZWZvcmUsIGJlIHBydW5lZC4KKyAgLy8vCisgIC8vLyBXaGVuIHRoZSBtb2R1bGUgY2FjaGUgaXMgcHJ1bmVkLCBhbnkgbW9kdWxlIGZpbGUgdGhhdCBoYXMgbm90IGJlZW4KKyAgLy8vIGFjY2Vzc2VkIGluIHRoaXMgbWFueSBzZWNvbmRzIHdpbGwgYmUgcmVtb3ZlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKKyAgLy8vIGxhcmdlLCBlLmcuLCBhIG1vbnRoLCB0byBhdm9pZCBmb3JjaW5nIGluZnJlcXVlbnRseS11c2VkIG1vZHVsZXMgdG8gYmUKKyAgLy8vIHJlZ2VuZXJhdGVkIG9mdGVuLgorICB1bnNpZ25lZCBNb2R1bGVDYWNoZVBydW5lQWZ0ZXIgPSAzMSAqIDI0ICogNjAgKiA2MDsKKworICAvLy8gXGJyaWVmIFRoZSB0aW1lIGluIHNlY29uZHMgd2hlbiB0aGUgYnVpbGQgc2Vzc2lvbiBzdGFydGVkLgorICAvLy8KKyAgLy8vIFRoaXMgdGltZSBpcyB1c2VkIGJ5IG90aGVyIG9wdGltaXphdGlvbnMgaW4gaGVhZGVyIHNlYXJjaCBhbmQgbW9kdWxlCisgIC8vLyBsb2FkaW5nLgorICB1aW50NjRfdCBCdWlsZFNlc3Npb25UaW1lc3RhbXAgPSAwOworCisgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBpZ25vcmVkIGZvciB0aGUgcHVycG9zZXMKKyAgLy8vIG9mIGNvbXB1dGluZyB0aGUgbW9kdWxlIGhhc2guCisgIGxsdm06OlNtYWxsU2V0VmVjdG9yPGxsdm06OkNhY2hlZEhhc2hTdHJpbmcsIDE2PiBNb2R1bGVzSWdub3JlTWFjcm9zOworCisgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiB1c2VyLXByb3ZpZGVkIHZpcnR1YWwgZmlsZXN5c3RlbSBvdmVybGF5IGZpbGVzLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gVkZTT3ZlcmxheUZpbGVzOworCisgIC8vLyBJbmNsdWRlIHRoZSBjb21waWxlciBidWlsdGluIGluY2x1ZGVzLgorICB1bnNpZ25lZCBVc2VCdWlsdGluSW5jbHVkZXMgOiAxOworCisgIC8vLyBJbmNsdWRlIHRoZSBzeXN0ZW0gc3RhbmRhcmQgaW5jbHVkZSBzZWFyY2ggZGlyZWN0b3JpZXMuCisgIHVuc2lnbmVkIFVzZVN0YW5kYXJkU3lzdGVtSW5jbHVkZXMgOiAxOworCisgIC8vLyBJbmNsdWRlIHRoZSBzeXN0ZW0gc3RhbmRhcmQgQysrIGxpYnJhcnkgaW5jbHVkZSBzZWFyY2ggZGlyZWN0b3JpZXMuCisgIHVuc2lnbmVkIFVzZVN0YW5kYXJkQ1hYSW5jbHVkZXMgOiAxOworCisgIC8vLyBVc2UgbGliYysrIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgbGlic3RkYysrLgorICB1bnNpZ25lZCBVc2VMaWJjeHggOiAxOworCisgIC8vLyBXaGV0aGVyIGhlYWRlciBzZWFyY2ggaW5mb3JtYXRpb24gc2hvdWxkIGJlIG91dHB1dCBhcyBmb3IgLXYuCisgIHVuc2lnbmVkIFZlcmJvc2UgOiAxOworCisgIC8vLyBcYnJpZWYgSWYgdHJ1ZSwgc2tpcCB2ZXJpZnlpbmcgaW5wdXQgZmlsZXMgdXNlZCBieSBtb2R1bGVzIGlmIHRoZQorICAvLy8gbW9kdWxlIHdhcyBhbHJlYWR5IHZlcmlmaWVkIGR1cmluZyB0aGlzIGJ1aWxkIHNlc3Npb24gKHNlZQorICAvLy8gXGMgQnVpbGRTZXNzaW9uVGltZXN0YW1wKS4KKyAgdW5zaWduZWQgTW9kdWxlc1ZhbGlkYXRlT25jZVBlckJ1aWxkU2Vzc2lvbiA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRvIHZhbGlkYXRlIHN5c3RlbSBpbnB1dCBmaWxlcyB3aGVuIGEgbW9kdWxlIGlzIGxvYWRlZC4KKyAgdW5zaWduZWQgTW9kdWxlc1ZhbGlkYXRlU3lzdGVtSGVhZGVycyA6IDE7CisKKyAgLy8vIFdoZXRoZXIgdGhlIG1vZHVsZSBpbmNsdWRlcyBkZWJ1ZyBpbmZvcm1hdGlvbiAoLWdtb2R1bGVzKS4KKyAgdW5zaWduZWQgVXNlRGVidWdJbmZvIDogMTsKKworICB1bnNpZ25lZCBNb2R1bGVzVmFsaWRhdGVEaWFnbm9zdGljT3B0aW9ucyA6IDE7CisKKyAgdW5zaWduZWQgTW9kdWxlc0hhc2hDb250ZW50IDogMTsKKworICBIZWFkZXJTZWFyY2hPcHRpb25zKFN0cmluZ1JlZiBfU3lzcm9vdCA9ICIvIikKKyAgICAgIDogU3lzcm9vdChfU3lzcm9vdCksIE1vZHVsZUZvcm1hdCgicmF3IiksIERpc2FibGVNb2R1bGVIYXNoKGZhbHNlKSwKKyAgICAgICAgSW1wbGljaXRNb2R1bGVNYXBzKGZhbHNlKSwgTW9kdWxlTWFwRmlsZUhvbWVJc0N3ZChmYWxzZSksCisgICAgICAgIFVzZUJ1aWx0aW5JbmNsdWRlcyh0cnVlKSwgVXNlU3RhbmRhcmRTeXN0ZW1JbmNsdWRlcyh0cnVlKSwKKyAgICAgICAgVXNlU3RhbmRhcmRDWFhJbmNsdWRlcyh0cnVlKSwgVXNlTGliY3h4KGZhbHNlKSwgVmVyYm9zZShmYWxzZSksCisgICAgICAgIE1vZHVsZXNWYWxpZGF0ZU9uY2VQZXJCdWlsZFNlc3Npb24oZmFsc2UpLAorICAgICAgICBNb2R1bGVzVmFsaWRhdGVTeXN0ZW1IZWFkZXJzKGZhbHNlKSwgVXNlRGVidWdJbmZvKGZhbHNlKSwKKyAgICAgICAgTW9kdWxlc1ZhbGlkYXRlRGlhZ25vc3RpY09wdGlvbnModHJ1ZSksIE1vZHVsZXNIYXNoQ29udGVudChmYWxzZSkge30KKworICAvLy8gQWRkUGF0aCAtIEFkZCB0aGUgXHAgUGF0aCBwYXRoIHRvIHRoZSBzcGVjaWZpZWQgXHAgR3JvdXAgbGlzdC4KKyAgdm9pZCBBZGRQYXRoKFN0cmluZ1JlZiBQYXRoLCBmcm9udGVuZDo6SW5jbHVkZURpckdyb3VwIEdyb3VwLAorICAgICAgICAgICAgICAgYm9vbCBJc0ZyYW1ld29yaywgYm9vbCBJZ25vcmVTeXNSb290KSB7CisgICAgVXNlckVudHJpZXMuZW1wbGFjZV9iYWNrKFBhdGgsIEdyb3VwLCBJc0ZyYW1ld29yaywgSWdub3JlU3lzUm9vdCk7CisgIH0KKworICAvLy8gQWRkU3lzdGVtSGVhZGVyUHJlZml4IC0gT3ZlcnJpZGUgd2hldGhlciBcI2luY2x1ZGUgZGlyZWN0aXZlcyBuYW1pbmcgYQorICAvLy8gcGF0aCBzdGFydGluZyB3aXRoIFxwIFByZWZpeCBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBuYW1pbmcgYSBzeXN0ZW0KKyAgLy8vIGhlYWRlci4KKyAgdm9pZCBBZGRTeXN0ZW1IZWFkZXJQcmVmaXgoU3RyaW5nUmVmIFByZWZpeCwgYm9vbCBJc1N5c3RlbUhlYWRlcikgeworICAgIFN5c3RlbUhlYWRlclByZWZpeGVzLmVtcGxhY2VfYmFjayhQcmVmaXgsIElzU3lzdGVtSGVhZGVyKTsKKyAgfQorCisgIHZvaWQgQWRkVkZTT3ZlcmxheUZpbGUoU3RyaW5nUmVmIE5hbWUpIHsKKyAgICBWRlNPdmVybGF5RmlsZXMucHVzaF9iYWNrKE5hbWUpOworICB9CisKKyAgdm9pZCBBZGRQcmVidWlsdE1vZHVsZVBhdGgoU3RyaW5nUmVmIE5hbWUpIHsKKyAgICBQcmVidWlsdE1vZHVsZVBhdGhzLnB1c2hfYmFjayhOYW1lKTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfTEVYX0hFQURFUlNFQVJDSE9QVElPTlNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L0xleERpYWdub3N0aWMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9MZXhEaWFnbm9zdGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ3MjRjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9MZXhEaWFnbm9zdGljLmgKQEAgLTAsMCArMSwyOCBAQAorLy89PT0tLS0gRGlhZ25vc3RpY0xleC5oIC0gRGlhZ25vc3RpY3MgZm9yIGxpYmxleCAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0xFWF9MRVhESUFHTk9TVElDX0gKKyNkZWZpbmUgTExWTV9DTEFOR19MRVhfTEVYRElBR05PU1RJQ19ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisgIG5hbWVzcGFjZSBkaWFnIHsKKyAgICBlbnVtIHsKKyNkZWZpbmUgRElBRyhFTlVNLEZMQUdTLERFRkFVTFRfTUFQUElORyxERVNDLEdST1VQLFwKKyAgICAgICAgICAgICBTRklOQUUsTk9XRVJST1IsU0hPV0lOU1lTSEVBREVSLENBVEVHT1JZKSBFTlVNLAorI2RlZmluZSBMRVhTVEFSVAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWNMZXhLaW5kcy5pbmMiCisjdW5kZWYgRElBRworICAgICAgTlVNX0JVSUxUSU5fTEVYX0RJQUdOT1NUSUNTCisgICAgfTsKKyAgfSAgLy8gZW5kIG5hbWVzcGFjZSBkaWFnCit9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L0xleGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvTGV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTg4NDk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L0xleGVyLmgKQEAgLTAsMCArMSw3NDMgQEAKKy8vPT09LSBMZXhlci5oIC0gQyBMYW5ndWFnZSBGYW1pbHkgTGV4ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBMZXhlciBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0xFWF9MRVhFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfTEVYX0xFWEVSX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xhbmdPcHRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Ub2tlbktpbmRzLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L1ByZXByb2Nlc3NvckxleGVyLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L1Rva2VuLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWVtb3J5QnVmZmVyOworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIERpYWdub3N0aWNCdWlsZGVyOworY2xhc3MgUHJlcHJvY2Vzc29yOworY2xhc3MgU291cmNlTWFuYWdlcjsKKworLy8vIENvbmZsaWN0TWFya2VyS2luZCAtIEtpbmRzIG9mIGNvbmZsaWN0IG1hcmtlciB3aGljaCB0aGUgbGV4ZXIgbWlnaHQgYmUKKy8vLyByZWNvdmVyaW5nIGZyb20uCitlbnVtIENvbmZsaWN0TWFya2VyS2luZCB7CisgIC8vLyBOb3Qgd2l0aGluIGEgY29uZmxpY3QgbWFya2VyLgorICBDTUtfTm9uZSwKKworICAvLy8gQSBub3JtYWwgb3IgZGlmZjMgY29uZmxpY3QgbWFya2VyLCBpbml0aWF0ZWQgYnkgYXQgbGVhc3QgNyAiPCJzLAorICAvLy8gc2VwYXJhdGVkIGJ5IGF0IGxlYXN0IDcgIj0icyBvciAifCJzLCBhbmQgdGVybWluYXRlZCBieSBhdCBsZWFzdCA3ICI+InMuCisgIENNS19Ob3JtYWwsCisKKyAgLy8vIEEgUGVyZm9yY2Utc3R5bGUgY29uZmxpY3QgbWFya2VyLCBpbml0aWF0ZWQgYnkgNCAiPiJzLAorICAvLy8gc2VwYXJhdGVkIGJ5IDQgIj0icywgYW5kIHRlcm1pbmF0ZWQgYnkgNCAiPCJzLgorICBDTUtfUGVyZm9yY2UKK307CisKKy8vLyBEZXNjcmliZXMgdGhlIGJvdW5kcyAoc3RhcnQsIHNpemUpIG9mIHRoZSBwcmVhbWJsZSBhbmQgYSBmbGFnIHJlcXVpcmVkIGJ5CisvLy8gUHJlcHJvY2Vzc29yT3B0aW9uczo6UHJlY29tcGlsZWRQcmVhbWJsZUJ5dGVzLgorLy8vIFRoZSBwcmVhbWJsZSBpbmNsdWRlcyB0aGUgQk9NLCBpZiBhbnkuCitzdHJ1Y3QgUHJlYW1ibGVCb3VuZHMgeworICAvLy8gXGJyaWVmIFNpemUgb2YgdGhlIHByZWFtYmxlIGluIGJ5dGVzLgorICB1bnNpZ25lZCBTaXplOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgcHJlYW1ibGUgZW5kcyBhdCB0aGUgc3RhcnQgb2YgYSBuZXcgbGluZS4KKyAgLy8vCisgIC8vLyBVc2VkIHRvIGluZm9ybSB0aGUgbGV4ZXIgYXMgdG8gd2hldGhlciBpdCdzIHN0YXJ0aW5nIGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgLy8vIGEgbGluZSBhZnRlciBza2lwcGluZyB0aGUgcHJlYW1ibGUuCisgIGJvb2wgUHJlYW1ibGVFbmRzQXRTdGFydE9mTGluZTsKKworICBQcmVhbWJsZUJvdW5kcyh1bnNpZ25lZCBTaXplLCBib29sIFByZWFtYmxlRW5kc0F0U3RhcnRPZkxpbmUpCisgICAgICA6IFNpemUoU2l6ZSksIFByZWFtYmxlRW5kc0F0U3RhcnRPZkxpbmUoUHJlYW1ibGVFbmRzQXRTdGFydE9mTGluZSkge30KK307CisKKy8vLyBMZXhlciAtIFRoaXMgcHJvdmlkZXMgYSBzaW1wbGUgaW50ZXJmYWNlIHRoYXQgdHVybnMgYSB0ZXh0IGJ1ZmZlciBpbnRvIGEKKy8vLyBzdHJlYW0gb2YgdG9rZW5zLiAgVGhpcyBwcm92aWRlcyBubyBzdXBwb3J0IGZvciBmaWxlIHJlYWRpbmcgb3IgYnVmZmVyaW5nLAorLy8vIG9yIGJ1ZmZlcmluZy9zZWVraW5nIG9mIHRva2Vucywgb25seSBmb3J3YXJkIGxleGluZyBpcyBzdXBwb3J0ZWQuICBJdCByZWxpZXMKKy8vLyBvbiB0aGUgc3BlY2lmaWVkIFByZXByb2Nlc3NvciBvYmplY3QgdG8gaGFuZGxlIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLCBldGMuCitjbGFzcyBMZXhlciA6IHB1YmxpYyBQcmVwcm9jZXNzb3JMZXhlciB7CisgIGZyaWVuZCBjbGFzcyBQcmVwcm9jZXNzb3I7CisKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQ29uc3RhbnQgY29uZmlndXJhdGlvbiB2YWx1ZXMgZm9yIHRoaXMgbGV4ZXIuCisKKyAgLy8gU3RhcnQgb2YgdGhlIGJ1ZmZlci4KKyAgY29uc3QgY2hhciAqQnVmZmVyU3RhcnQ7CisKKyAgLy8gRW5kIG9mIHRoZSBidWZmZXIuCisgIGNvbnN0IGNoYXIgKkJ1ZmZlckVuZDsKKworICAvLyBMb2NhdGlvbiBmb3Igc3RhcnQgb2YgZmlsZS4KKyAgU291cmNlTG9jYXRpb24gRmlsZUxvYzsKKworICAvLyBMYW5nT3B0cyBlbmFibGVkIGJ5IHRoaXMgbGFuZ3VhZ2UgKGNhY2hlKS4KKyAgTGFuZ09wdGlvbnMgTGFuZ09wdHM7CisKKyAgLy8gVHJ1ZSBpZiBsZXhlciBmb3IgX1ByYWdtYSBoYW5kbGluZy4KKyAgYm9vbCBJc19QcmFnbWFMZXhlcjsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQ29udGV4dC1zcGVjaWZpYyBsZXhpbmcgZmxhZ3Mgc2V0IGJ5IHRoZSBwcmVwcm9jZXNzb3IuCisgIC8vCisKKyAgLy8vIEV4dGVuZGVkVG9rZW5Nb2RlIC0gVGhlIGxleGVyIGNhbiBvcHRpb25hbGx5IGtlZXAgY29tbWVudHMgYW5kIHdoaXRlc3BhY2UKKyAgLy8vIGFuZCByZXR1cm4gdGhlbSBhcyB0b2tlbnMuICBUaGlzIGlzIHVzZWQgZm9yIC1DIGFuZCAtQ0MgbW9kZXMsIGFuZAorICAvLy8gd2hpdGVzcGFjZSBwcmVzZXJ2YXRpb24gY2FuIGJlIHVzZWZ1bCBmb3Igc29tZSBjbGllbnRzIHRoYXQgd2FudCB0byBsZXgKKyAgLy8vIHRoZSBmaWxlIGluIHJhdyBtb2RlIGFuZCBnZXQgZXZlcnkgY2hhcmFjdGVyIGZyb20gdGhlIGZpbGUuCisgIC8vLworICAvLy8gV2hlbiB0aGlzIGlzIHNldCB0byAyIGl0IHJldHVybnMgY29tbWVudHMgYW5kIHdoaXRlc3BhY2UuICBXaGVuIHNldCB0byAxCisgIC8vLyBpdCByZXR1cm5zIGNvbW1lbnRzLCB3aGVuIGl0IGlzIHNldCB0byAwIGl0IHJldHVybnMgbm9ybWFsIHRva2VucyBvbmx5LgorICB1bnNpZ25lZCBjaGFyIEV4dGVuZGVkVG9rZW5Nb2RlOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDb250ZXh0IHRoYXQgY2hhbmdlcyBhcyB0aGUgZmlsZSBpcyBsZXhlZC4KKyAgLy8gTk9URTogYW55IHN0YXRlIHRoYXQgbXV0YXRlcyB3aGVuIGluIHJhdyBtb2RlIG11c3QgaGF2ZSBzYXZlL3Jlc3RvcmUgY29kZQorICAvLyBpbiBMZXhlcjo6aXNOZXh0UFBUb2tlbkxQYXJlbi4KKworICAvLyBCdWZmZXJQdHIgLSBDdXJyZW50IHBvaW50ZXIgaW50byB0aGUgYnVmZmVyLiAgVGhpcyBpcyB0aGUgbmV4dCBjaGFyYWN0ZXIKKyAgLy8gdG8gYmUgbGV4ZWQuCisgIGNvbnN0IGNoYXIgKkJ1ZmZlclB0cjsKKworICAvLyBJc0F0U3RhcnRPZkxpbmUgLSBUcnVlIGlmIHRoZSBuZXh0IGxleGVkIHRva2VuIHNob3VsZCBnZXQgdGhlICJzdGFydCBvZgorICAvLyBsaW5lIiBmbGFnIHNldCBvbiBpdC4KKyAgYm9vbCBJc0F0U3RhcnRPZkxpbmU7CisKKyAgYm9vbCBJc0F0UGh5c2ljYWxTdGFydE9mTGluZTsKKworICBib29sIEhhc0xlYWRpbmdTcGFjZTsKKworICBib29sIEhhc0xlYWRpbmdFbXB0eU1hY3JvOworCisgIC8vIEN1cnJlbnRDb25mbGljdE1hcmtlclN0YXRlIC0gVGhlIGtpbmQgb2YgY29uZmxpY3QgbWFya2VyIHdlIGFyZSBoYW5kbGluZy4KKyAgQ29uZmxpY3RNYXJrZXJLaW5kIEN1cnJlbnRDb25mbGljdE1hcmtlclN0YXRlOworCisgIHZvaWQgSW5pdExleGVyKGNvbnN0IGNoYXIgKkJ1ZlN0YXJ0LCBjb25zdCBjaGFyICpCdWZQdHIsIGNvbnN0IGNoYXIgKkJ1ZkVuZCk7CisKK3B1YmxpYzoKKyAgLy8vIExleGVyIGNvbnN0cnVjdG9yIC0gQ3JlYXRlIGEgbmV3IGxleGVyIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBidWZmZXIKKyAgLy8vIHdpdGggdGhlIHNwZWNpZmllZCBwcmVwcm9jZXNzb3IgbWFuYWdpbmcgdGhlIGxleGluZyBwcm9jZXNzLiAgVGhpcyBsZXhlcgorICAvLy8gYXNzdW1lcyB0aGF0IHRoZSBhc3NvY2lhdGVkIGZpbGUgYnVmZmVyIGFuZCBQcmVwcm9jZXNzb3Igb2JqZWN0cyB3aWxsCisgIC8vLyBvdXRsaXZlIGl0LCBzbyBpdCBkb2Vzbid0IHRha2Ugb3duZXJzaGlwIG9mIGVpdGhlciBvZiB0aGVtLgorICBMZXhlcihGaWxlSUQgRklELCBjb25zdCBsbHZtOjpNZW1vcnlCdWZmZXIgKklucHV0QnVmZmVyLCBQcmVwcm9jZXNzb3IgJlBQKTsKKworICAvLy8gTGV4ZXIgY29uc3RydWN0b3IgLSBDcmVhdGUgYSBuZXcgcmF3IGxleGVyIG9iamVjdC4gIFRoaXMgb2JqZWN0IGlzIG9ubHkKKyAgLy8vIHN1aXRhYmxlIGZvciBjYWxscyB0byAnTGV4RnJvbVJhd0xleGVyJy4gIFRoaXMgbGV4ZXIgYXNzdW1lcyB0aGF0IHRoZQorICAvLy8gdGV4dCByYW5nZSB3aWxsIG91dGxpdmUgaXQsIHNvIGl0IGRvZXNuJ3QgdGFrZSBvd25lcnNoaXAgb2YgaXQuCisgIExleGVyKFNvdXJjZUxvY2F0aW9uIEZpbGVMb2MsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKKyAgICAgICAgY29uc3QgY2hhciAqQnVmU3RhcnQsIGNvbnN0IGNoYXIgKkJ1ZlB0ciwgY29uc3QgY2hhciAqQnVmRW5kKTsKKworICAvLy8gTGV4ZXIgY29uc3RydWN0b3IgLSBDcmVhdGUgYSBuZXcgcmF3IGxleGVyIG9iamVjdC4gIFRoaXMgb2JqZWN0IGlzIG9ubHkKKyAgLy8vIHN1aXRhYmxlIGZvciBjYWxscyB0byAnTGV4RnJvbVJhd0xleGVyJy4gIFRoaXMgbGV4ZXIgYXNzdW1lcyB0aGF0IHRoZQorICAvLy8gdGV4dCByYW5nZSB3aWxsIG91dGxpdmUgaXQsIHNvIGl0IGRvZXNuJ3QgdGFrZSBvd25lcnNoaXAgb2YgaXQuCisgIExleGVyKEZpbGVJRCBGSUQsIGNvbnN0IGxsdm06Ok1lbW9yeUJ1ZmZlciAqSW5wdXRCdWZmZXIsCisgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpOworCisgIExleGVyKGNvbnN0IExleGVyICYpID0gZGVsZXRlOworICBMZXhlciAmb3BlcmF0b3I9KGNvbnN0IExleGVyICYpID0gZGVsZXRlOworCisgIC8vLyBDcmVhdGVfUHJhZ21hTGV4ZXI6IExleGVyIGNvbnN0cnVjdG9yIC0gQ3JlYXRlIGEgbmV3IGxleGVyIG9iamVjdCBmb3IKKyAgLy8vIF9QcmFnbWEgZXhwYW5zaW9uLiAgVGhpcyBoYXMgYSB2YXJpZXR5IG9mIG1hZ2ljIHNlbWFudGljcyB0aGF0IHRoaXMgbWV0aG9kCisgIC8vLyBzZXRzIHVwLiAgSXQgcmV0dXJucyBhIG5ldydkIExleGVyIHRoYXQgbXVzdCBiZSBkZWxldGUnZCB3aGVuIGRvbmUuCisgIHN0YXRpYyBMZXhlciAqQ3JlYXRlX1ByYWdtYUxleGVyKFNvdXJjZUxvY2F0aW9uIFNwZWxsaW5nTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFeHBhbnNpb25Mb2NTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRXhwYW5zaW9uTG9jRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUb2tMZW4sIFByZXByb2Nlc3NvciAmUFApOworCisgIC8vLyBnZXRMYW5nT3B0cyAtIFJldHVybiB0aGUgbGFuZ3VhZ2UgZmVhdHVyZXMgY3VycmVudGx5IGVuYWJsZWQuCisgIC8vLyBOT1RFOiB0aGlzIGxleGVyIG1vZGlmaWVzIGZlYXR1cmVzIGFzIGEgZmlsZSBpcyBwYXJzZWQhCisgIGNvbnN0IExhbmdPcHRpb25zICZnZXRMYW5nT3B0cygpIGNvbnN0IHsgcmV0dXJuIExhbmdPcHRzOyB9CisKKyAgLy8vIGdldEZpbGVMb2MgLSBSZXR1cm4gdGhlIEZpbGUgTG9jYXRpb24gZm9yIHRoZSBmaWxlIHdlIGFyZSBsZXhpbmcgb3V0IG9mLgorICAvLy8gVGhlIHBoeXNpY2FsIGxvY2F0aW9uIGVuY29kZXMgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBjaGFyYWN0ZXJzIGNvbWUgZnJvbSwKKyAgLy8vIHRoZSB2aXJ0dWFsIGxvY2F0aW9uIGVuY29kZXMgd2hlcmUgd2Ugc2hvdWxkICpjbGFpbSogdGhlIGNoYXJhY3RlcnMgY2FtZQorICAvLy8gZnJvbS4gIEN1cnJlbnRseSB0aGlzIGlzIG9ubHkgdXNlZCBieSBfUHJhZ21hIGhhbmRsaW5nLgorICBTb3VyY2VMb2NhdGlvbiBnZXRGaWxlTG9jKCkgY29uc3QgeyByZXR1cm4gRmlsZUxvYzsgfQorCitwcml2YXRlOgorICAvLy8gTGV4IC0gUmV0dXJuIHRoZSBuZXh0IHRva2VuIGluIHRoZSBmaWxlLiAgSWYgdGhpcyBpcyB0aGUgZW5kIG9mIGZpbGUsIGl0CisgIC8vLyByZXR1cm4gdGhlIHRvazo6ZW9mIHRva2VuLiAgVGhpcyBpbXBsaWNpdGx5IGludm9sdmVzIHRoZSBwcmVwcm9jZXNzb3IuCisgIGJvb2wgTGV4KFRva2VuICZSZXN1bHQpOworCitwdWJsaWM6CisgIC8vLyBpc1ByYWdtYUxleGVyIC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgTGV4ZXIgaXMgYmVpbmcgdXNlZCB0byBsZXggYSBwcmFnbWEuCisgIGJvb2wgaXNQcmFnbWFMZXhlcigpIGNvbnN0IHsgcmV0dXJuIElzX1ByYWdtYUxleGVyOyB9CisKK3ByaXZhdGU6CisgIC8vLyBJbmRpcmVjdExleCAtIEFuIGluZGlyZWN0IGNhbGwgdG8gJ0xleCcgdGhhdCBjYW4gYmUgaW52b2tlZCB2aWEKKyAgLy8vICB0aGUgUHJlcHJvY2Vzc29yTGV4ZXIgaW50ZXJmYWNlLgorICB2b2lkIEluZGlyZWN0TGV4KFRva2VuICZSZXN1bHQpIG92ZXJyaWRlIHsgTGV4KFJlc3VsdCk7IH0KKworcHVibGljOgorICAvLy8gTGV4RnJvbVJhd0xleGVyIC0gTGV4IGEgdG9rZW4gZnJvbSBhIGRlc2lnbmF0ZWQgcmF3IGxleGVyIChvbmUgd2l0aCBubworICAvLy8gYXNzb2NpYXRlZCBwcmVwcm9jZXNzb3Igb2JqZWN0LiAgUmV0dXJuIHRydWUgaWYgdGhlICduZXh0IGNoYXJhY3RlciB0bworICAvLy8gcmVhZCcgcG9pbnRlciBwb2ludHMgYXQgdGhlIGVuZCBvZiB0aGUgbGV4ZXIgYnVmZmVyLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgTGV4RnJvbVJhd0xleGVyKFRva2VuICZSZXN1bHQpIHsKKyAgICBhc3NlcnQoTGV4aW5nUmF3TW9kZSAmJiAiTm90IGFscmVhZHkgaW4gcmF3IG1vZGUhIik7CisgICAgTGV4KFJlc3VsdCk7CisgICAgLy8gTm90ZSB0aGF0IGxleGluZyB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIgZG9lc24ndCBpbXBsaWNpdGx5IGRlbGV0ZSB0aGUKKyAgICAvLyBsZXhlciB3aGVuIGluIHJhdyBtb2RlLgorICAgIHJldHVybiBCdWZmZXJQdHIgPT0gQnVmZmVyRW5kOworICB9CisKKyAgLy8vIGlzS2VlcFdoaXRlc3BhY2VNb2RlIC0gUmV0dXJuIHRydWUgaWYgdGhlIGxleGVyIHNob3VsZCByZXR1cm4gdG9rZW5zIGZvcgorICAvLy8gZXZlcnkgY2hhcmFjdGVyIGluIHRoZSBmaWxlLCBpbmNsdWRpbmcgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMuICBUaGlzCisgIC8vLyBzaG91bGQgb25seSBiZSB1c2VkIGluIHJhdyBtb2RlLCBhcyB0aGUgcHJlcHJvY2Vzc29yIGlzIG5vdCBwcmVwYXJlZCB0bworICAvLy8gZGVhbCB3aXRoIHRoZSBleGNlc3MgdG9rZW5zLgorICBib29sIGlzS2VlcFdoaXRlc3BhY2VNb2RlKCkgY29uc3QgeworICAgIHJldHVybiBFeHRlbmRlZFRva2VuTW9kZSA+IDE7CisgIH0KKworICAvLy8gU2V0S2VlcFdoaXRlc3BhY2VNb2RlIC0gVGhpcyBtZXRob2QgbGV0cyBjbGllbnRzIGVuYWJsZSBvciBkaXNhYmxlCisgIC8vLyB3aGl0ZXNwYWNlIHJldGVudGlvbiBtb2RlLgorICB2b2lkIFNldEtlZXBXaGl0ZXNwYWNlTW9kZShib29sIFZhbCkgeworICAgIGFzc2VydCgoIVZhbCB8fCBMZXhpbmdSYXdNb2RlIHx8IExhbmdPcHRzLlRyYWRpdGlvbmFsQ1BQKSAmJgorICAgICAgICAgICAiQ2FuIG9ubHkgcmV0YWluIHdoaXRlc3BhY2UgaW4gcmF3IG1vZGUgb3IgLXRyYWRpdGlvbmFsLWNwcCIpOworICAgIEV4dGVuZGVkVG9rZW5Nb2RlID0gVmFsID8gMiA6IDA7CisgIH0KKworICAvLy8gaW5LZWVwQ29tbWVudE1vZGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGV4ZXIgc2hvdWxkIHJldHVybiBjb21tZW50cyBhcworICAvLy8gdG9rZW5zLgorICBib29sIGluS2VlcENvbW1lbnRNb2RlKCkgY29uc3QgeworICAgIHJldHVybiBFeHRlbmRlZFRva2VuTW9kZSA+IDA7CisgIH0KKworICAvLy8gU2V0Q29tbWVudFJldGVudGlvbk1vZGUgLSBDaGFuZ2UgdGhlIGNvbW1lbnQgcmV0ZW50aW9uIG1vZGUgb2YgdGhlIGxleGVyCisgIC8vLyB0byB0aGUgc3BlY2lmaWVkIG1vZGUuICBUaGlzIGlzIHJlYWxseSBvbmx5IHVzZWZ1bCB3aGVuIGxleGluZyBpbiByYXcKKyAgLy8vIG1vZGUsIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBsZXhlciBuZWVkcyB0byBtYW5hZ2UgdGhpcy4KKyAgdm9pZCBTZXRDb21tZW50UmV0ZW50aW9uU3RhdGUoYm9vbCBNb2RlKSB7CisgICAgYXNzZXJ0KCFpc0tlZXBXaGl0ZXNwYWNlTW9kZSgpICYmCisgICAgICAgICAgICJDYW4ndCBwbGF5IHdpdGggY29tbWVudCByZXRlbnRpb24gc3RhdGUgd2hlbiByZXRhaW5pbmcgd2hpdGVzcGFjZSIpOworICAgIEV4dGVuZGVkVG9rZW5Nb2RlID0gTW9kZSA/IDEgOiAwOworICB9CisKKyAgLy8vIFNldHMgdGhlIGV4dGVuZGVkIHRva2VuIG1vZGUgYmFjayB0byBpdHMgaW5pdGlhbCB2YWx1ZSwgYWNjb3JkaW5nIHRvIHRoZQorICAvLy8gbGFuZ3VhZ2Ugb3B0aW9ucyBhbmQgcHJlcHJvY2Vzc29yLiBUaGlzIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGxleGVyCisgIC8vLyBwcm9kdWNlcyBjb21tZW50IGFuZCB3aGl0ZXNwYWNlIHRva2Vucy4KKyAgLy8vCisgIC8vLyBUaGlzIHJlcXVpcmVzIHRoZSBsZXhlciB0byBoYXZlIGFuIGFzc29jaWF0ZWQgcHJlcHJvY2Vzc29yLiBBIHN0YW5kYWxvbmUKKyAgLy8vIGxleGVyIGhhcyBub3RoaW5nIHRvIHJlc2V0IHRvLgorICB2b2lkIHJlc2V0RXh0ZW5kZWRUb2tlbk1vZGUoKTsKKworICAvLy8gR2V0cyBzb3VyY2UgY29kZSBidWZmZXIuCisgIFN0cmluZ1JlZiBnZXRCdWZmZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFN0cmluZ1JlZihCdWZmZXJTdGFydCwgQnVmZmVyRW5kIC0gQnVmZmVyU3RhcnQpOworICB9CisKKyAgLy8vIFJlYWRUb0VuZE9mTGluZSAtIFJlYWQgdGhlIHJlc3Qgb2YgdGhlIGN1cnJlbnQgcHJlcHJvY2Vzc29yIGxpbmUgYXMgYW4KKyAgLy8vIHVuaW50ZXJwcmV0ZWQgc3RyaW5nLiAgVGhpcyBzd2l0Y2hlcyB0aGUgbGV4ZXIgb3V0IG9mIGRpcmVjdGl2ZSBtb2RlLgorICB2b2lkIFJlYWRUb0VuZE9mTGluZShTbWFsbFZlY3RvckltcGw8Y2hhcj4gKlJlc3VsdCA9IG51bGxwdHIpOworCisKKyAgLy8vIERpYWcgLSBGb3J3YXJkaW5nIGZ1bmN0aW9uIGZvciBkaWFnbm9zdGljcy4gIFRoaXMgdHJhbnNsYXRlIGEgc291cmNlCisgIC8vLyBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBidWZmZXIgaW50byBhIFNvdXJjZUxvY2F0aW9uIG9iamVjdCBmb3IgcmVuZGVyaW5nLgorICBEaWFnbm9zdGljQnVpbGRlciBEaWFnKGNvbnN0IGNoYXIgKkxvYywgdW5zaWduZWQgRGlhZ0lEKSBjb25zdDsKKworICAvLy8gZ2V0U291cmNlTG9jYXRpb24gLSBSZXR1cm4gYSBzb3VyY2UgbG9jYXRpb24gaWRlbnRpZmllciBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gb2Zmc2V0IGluIHRoZSBjdXJyZW50IGZpbGUuCisgIFNvdXJjZUxvY2F0aW9uIGdldFNvdXJjZUxvY2F0aW9uKGNvbnN0IGNoYXIgKkxvYywgdW5zaWduZWQgVG9rTGVuID0gMSkgY29uc3Q7CisKKyAgLy8vIGdldFNvdXJjZUxvY2F0aW9uIC0gUmV0dXJuIGEgc291cmNlIGxvY2F0aW9uIGZvciB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4KKyAgLy8vIHRoZSBjdXJyZW50IGZpbGUuCisgIFNvdXJjZUxvY2F0aW9uIGdldFNvdXJjZUxvY2F0aW9uKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRTb3VyY2VMb2NhdGlvbihCdWZmZXJQdHIpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGJ1ZmZlci4KKyAgY29uc3QgY2hhciAqZ2V0QnVmZmVyTG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBCdWZmZXJQdHI7IH0KKworICAvLy8gU3RyaW5naWZ5IC0gQ29udmVydCB0aGUgc3BlY2lmaWVkIHN0cmluZyBpbnRvIGEgQyBzdHJpbmcgYnkgaSkgZXNjYXBpbmcKKyAgLy8vICdcXCcgYW5kICIgY2hhcmFjdGVycyBhbmQgaWkpIHJlcGxhY2luZyBuZXdsaW5lIGNoYXJhY3RlcihzKSB3aXRoICJcXG4iLgorICAvLy8gSWYgQ2hhcmlmeSBpcyB0cnVlLCB0aGlzIGVzY2FwZXMgdGhlICcgY2hhcmFjdGVyIGluc3RlYWQgb2YgIi4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIFN0cmluZ2lmeShTdHJpbmdSZWYgU3RyLCBib29sIENoYXJpZnkgPSBmYWxzZSk7CisKKyAgLy8vIFN0cmluZ2lmeSAtIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgaW50byBhIEMgc3RyaW5nIGJ5IGkpIGVzY2FwaW5nCisgIC8vLyAnXFwnIGFuZCAiIGNoYXJhY3RlcnMgYW5kIGlpKSByZXBsYWNpbmcgbmV3bGluZSBjaGFyYWN0ZXIocykgd2l0aCAiXFxuIi4KKyAgc3RhdGljIHZvaWQgU3RyaW5naWZ5KFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmU3RyKTsKKworICAvLy8gZ2V0U3BlbGxpbmcgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgc3BlbGxpbmcgb2YgYSB0b2tlbiBpbnRvIGEKKyAgLy8vIHByZWFsbG9jYXRlZCBidWZmZXIsIGluc3RlYWQgb2YgYXMgYW4gc3RkOjpzdHJpbmcuICBUaGUgY2FsbGVyIGlzIHJlcXVpcmVkCisgIC8vLyB0byBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSB0b2tlbiwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBhdCBsZWFzdAorICAvLy8gVG9rLmdldExlbmd0aCgpIGJ5dGVzIGxvbmcuICBUaGUgbGVuZ3RoIG9mIHRoZSBhY3R1YWwgcmVzdWx0IGlzIHJldHVybmVkLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBtYXkgZG8gdHdvIHBvc3NpYmxlIHRoaW5nczogaXQgbWF5IGVpdGhlciBmaWxsIGluCisgIC8vLyB0aGUgYnVmZmVyIHNwZWNpZmllZCB3aXRoIGNoYXJhY3RlcnMsIG9yIGl0IG1heSAqY2hhbmdlIHRoZSBpbnB1dCBwb2ludGVyKgorICAvLy8gdG8gcG9pbnQgdG8gYSBjb25zdGFudCBidWZmZXIgd2l0aCB0aGUgZGF0YSBhbHJlYWR5IGluIGl0IChhdm9pZGluZyBhCisgIC8vLyBjb3B5KS4gIFRoZSBjYWxsZXIgaXMgbm90IGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSByZXR1cm5lZCBidWZmZXIgcG9pbnRlcgorICAvLy8gaWYgYW4gaW50ZXJuYWwgYnVmZmVyIGlzIHJldHVybmVkLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0U3BlbGxpbmcoY29uc3QgVG9rZW4gJlRvaywgY29uc3QgY2hhciAqJkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNvdXJjZU1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKkludmFsaWQgPSBudWxscHRyKTsKKworICAvLy8gZ2V0U3BlbGxpbmcoKSAtIFJldHVybiB0aGUgJ3NwZWxsaW5nJyBvZiB0aGUgVG9rIHRva2VuLiAgVGhlIHNwZWxsaW5nIG9mIGEKKyAgLy8vIHRva2VuIGlzIHRoZSBjaGFyYWN0ZXJzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB0b2tlbiBpbiB0aGUgc291cmNlIGZpbGUKKyAgLy8vIGFmdGVyIHRyaWdyYXBoIGV4cGFuc2lvbiBhbmQgZXNjYXBlZC1uZXdsaW5lIGZvbGRpbmcuICBJbiBwYXJ0aWN1bGFyLCB0aGlzCisgIC8vLyB3YW50cyB0byBnZXQgdGhlIHRydWUsIHVuY2Fub25pY2FsaXplZCwgc3BlbGxpbmcgb2YgdGhpbmdzIGxpa2UgZGlncmFwaHMKKyAgLy8vIFVDTnMsIGV0Yy4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldFNwZWxsaW5nKGNvbnN0IFRva2VuICZUb2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpJbnZhbGlkID0gbnVsbHB0cik7CisKKyAgLy8vIGdldFNwZWxsaW5nIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIHNwZWxsaW5nIG9mIHRoZQorICAvLy8gdG9rZW4gYXQgdGhlIGdpdmVuIHNvdXJjZSBsb2NhdGlvbi4gIElmLCBhcyBpcyB1c3VhbGx5IHRydWUsIGl0CisgIC8vLyBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvcHkgYW55IGRhdGEsIHRoZW4gdGhlIHJldHVybmVkIHN0cmluZyBtYXkKKyAgLy8vIG5vdCBwb2ludCBpbnRvIHRoZSBwcm92aWRlZCBidWZmZXIuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgbGV4ZXMgYXQgdGhlIGV4cGFuc2lvbiBkZXB0aCBvZiB0aGUgZ2l2ZW4KKyAgLy8vIGxvY2F0aW9uIGFuZCBkb2VzIG5vdCBqdW1wIHRvIHRoZSBleHBhbnNpb24gb3Igc3BlbGxpbmcKKyAgLy8vIGxvY2F0aW9uLgorICBzdGF0aWMgU3RyaW5nUmVmIGdldFNwZWxsaW5nKFNvdXJjZUxvY2F0aW9uIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmludmFsaWQgPSBudWxscHRyKTsKKworICAvLy8gTWVhc3VyZVRva2VuTGVuZ3RoIC0gUmVsZXggdGhlIHRva2VuIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gYW5kIHJldHVybgorICAvLy8gaXRzIGxlbmd0aCBpbiBieXRlcyBpbiB0aGUgaW5wdXQgZmlsZS4gIElmIHRoZSB0b2tlbiBuZWVkcyBjbGVhbmluZyAoZS5nLgorICAvLy8gaW5jbHVkZXMgYSB0cmlncmFwaCBvciBhbiBlc2NhcGVkIG5ld2xpbmUpIHRoZW4gdGhpcyBjb3VudCBpbmNsdWRlcyBieXRlcworICAvLy8gdGhhdCBhcmUgcGFydCBvZiB0aGF0LgorICBzdGF0aWMgdW5zaWduZWQgTWVhc3VyZVRva2VuTGVuZ3RoKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpOworCisgIC8vLyBcYnJpZWYgUmVsZXggdGhlIHRva2VuIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUsIGZhbHNlIG9uIHN1Y2Nlc3MuCisgIHN0YXRpYyBib29sIGdldFJhd1Rva2VuKFNvdXJjZUxvY2F0aW9uIExvYywgVG9rZW4gJlJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJZ25vcmVXaGl0ZVNwYWNlID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgR2l2ZW4gYSBsb2NhdGlvbiBhbnkgd2hlcmUgaW4gYSBzb3VyY2UgYnVmZmVyLCBmaW5kIHRoZSBsb2NhdGlvbgorICAvLy8gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0b2tlbiBpbiB3aGljaCB0aGUgb3JpZ2luYWwKKyAgLy8vIHNvdXJjZSBsb2NhdGlvbiBsYW5kcy4KKyAgc3RhdGljIFNvdXJjZUxvY2F0aW9uIEdldEJlZ2lubmluZ09mVG9rZW4oU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKTsKKworICAvLy8gQWR2YW5jZVRvVG9rZW5DaGFyYWN0ZXIgLSBJZiB0aGUgY3VycmVudCBTb3VyY2VMb2NhdGlvbiBzcGVjaWZpZXMgYQorICAvLy8gbG9jYXRpb24gYXQgdGhlIHN0YXJ0IG9mIGEgdG9rZW4sIHJldHVybiBhIG5ldyBsb2NhdGlvbiB0aGF0IHNwZWNpZmllcyBhCisgIC8vLyBjaGFyYWN0ZXIgd2l0aGluIHRoZSB0b2tlbi4gIFRoaXMgaGFuZGxlcyB0cmlncmFwaHMgYW5kIGVzY2FwZWQgbmV3bGluZXMuCisgIHN0YXRpYyBTb3VyY2VMb2NhdGlvbiBBZHZhbmNlVG9Ub2tlbkNoYXJhY3RlcihTb3VyY2VMb2NhdGlvbiBUb2tTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENoYXJhY3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKTsKKworICAvLy8gXGJyaWVmIENvbXB1dGVzIHRoZSBzb3VyY2UgbG9jYXRpb24ganVzdCBwYXN0IHRoZSBlbmQgb2YgdGhlCisgIC8vLyB0b2tlbiBhdCB0aGlzIHNvdXJjZSBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIHVzZWQgdG8gcHJvZHVjZSBhIHNvdXJjZSBsb2NhdGlvbiB0aGF0CisgIC8vLyBwb2ludHMganVzdCBwYXN0IHRoZSBlbmQgb2YgdGhlIHRva2VuIHJlZmVyZW5jZWQgYnkgXHAgTG9jLCBhbmQKKyAgLy8vIGlzIGdlbmVyYWxseSB1c2VkIHdoZW4gYSBkaWFnbm9zdGljIG5lZWRzIHRvIHBvaW50IGp1c3QgYWZ0ZXIgYQorICAvLy8gdG9rZW4gd2hlcmUgaXQgZXhwZWN0ZWQgc29tZXRoaW5nIGRpZmZlcmVudCB0aGF0IGl0IHJlY2VpdmVkLiBJZgorICAvLy8gdGhlIHJldHVybmVkIHNvdXJjZSBsb2NhdGlvbiB3b3VsZCBub3QgYmUgbWVhbmluZ2Z1bCAoZS5nLiwgaWYKKyAgLy8vIGl0IHBvaW50cyBpbnRvIGEgbWFjcm8pLCB0aGlzIHJvdXRpbmUgcmV0dXJucyBhbiBpbnZhbGlkCisgIC8vLyBzb3VyY2UgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIE9mZnNldCBhbiBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIHRoZSB0b2tlbiwgd2hlcmUgdGhlIHNvdXJjZQorICAvLy8gbG9jYXRpb24gc2hvdWxkIHJlZmVyIHRvLiBUaGUgZGVmYXVsdCBvZmZzZXQgKDApIHByb2R1Y2VzIGEgc291cmNlCisgIC8vLyBsb2NhdGlvbiBwb2ludGluZyBqdXN0IHBhc3QgdGhlIGVuZCBvZiB0aGUgdG9rZW47IGFuIG9mZnNldCBvZiAxIHByb2R1Y2VzCisgIC8vLyBhIHNvdXJjZSBsb2NhdGlvbiBwb2ludGluZyB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHRva2VuLCBldGMuCisgIHN0YXRpYyBTb3VyY2VMb2NhdGlvbiBnZXRMb2NGb3JFbmRPZlRva2VuKFNvdXJjZUxvY2F0aW9uIExvYywgdW5zaWduZWQgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKTsKKworICAvLy8gXGJyaWVmIEdpdmVuIGEgdG9rZW4gcmFuZ2UsIHByb2R1Y2UgYSBjb3JyZXNwb25kaW5nIENoYXJTb3VyY2VSYW5nZSB0aGF0CisgIC8vLyBpcyBub3QgYSB0b2tlbiByYW5nZS4gVGhpcyBhbGxvd3MgdGhlIHNvdXJjZSByYW5nZSB0byBiZSB1c2VkIGJ5CisgIC8vLyBjb21wb25lbnRzIHRoYXQgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGxleGVyIGFuZCB0aHVzIGNhbid0IGZpbmQgdGhlCisgIC8vLyBlbmQgb2YgdGhlIHJhbmdlIGZvciB0aGVtc2VsdmVzLgorICBzdGF0aWMgQ2hhclNvdXJjZVJhbmdlIGdldEFzQ2hhclJhbmdlKFNvdXJjZVJhbmdlIFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICAgIFNvdXJjZUxvY2F0aW9uIEVuZCA9IGdldExvY0ZvckVuZE9mVG9rZW4oUmFuZ2UuZ2V0RW5kKCksIDAsIFNNLCBMYW5nT3B0cyk7CisgICAgcmV0dXJuIEVuZC5pc0ludmFsaWQoKSA/IENoYXJTb3VyY2VSYW5nZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENoYXJTb3VyY2VSYW5nZTo6Z2V0Q2hhclJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2UuZ2V0QmVnaW4oKSwgRW5kLmdldExvY1dpdGhPZmZzZXQoLTEpKTsKKyAgfQorICBzdGF0aWMgQ2hhclNvdXJjZVJhbmdlIGdldEFzQ2hhclJhbmdlKENoYXJTb3VyY2VSYW5nZSBSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgICByZXR1cm4gUmFuZ2UuaXNUb2tlblJhbmdlKCkKKyAgICAgICAgICAgICAgID8gZ2V0QXNDaGFyUmFuZ2UoUmFuZ2UuZ2V0QXNSYW5nZSgpLCBTTSwgTGFuZ09wdHMpCisgICAgICAgICAgICAgICA6IFJhbmdlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIE1hY3JvSUQgbG9jYXRpb24gcG9pbnRzIGF0IHRoZSBmaXJzdAorICAvLy8gdG9rZW4gb2YgdGhlIG1hY3JvIGV4cGFuc2lvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gTWFjcm9CZWdpbiBJZiBub24tbnVsbCBhbmQgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCBpdCBpcyBzZXQgdG8KKyAgLy8vIGJlZ2luIGxvY2F0aW9uIG9mIHRoZSBtYWNyby4KKyAgc3RhdGljIGJvb2wgaXNBdFN0YXJ0T2ZNYWNyb0V4cGFuc2lvbihTb3VyY2VMb2NhdGlvbiBsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICpNYWNyb0JlZ2luID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIE1hY3JvSUQgbG9jYXRpb24gcG9pbnRzIGF0IHRoZSBsYXN0CisgIC8vLyB0b2tlbiBvZiB0aGUgbWFjcm8gZXhwYW5zaW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNYWNyb0VuZCBJZiBub24tbnVsbCBhbmQgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCBpdCBpcyBzZXQgdG8KKyAgLy8vIGVuZCBsb2NhdGlvbiBvZiB0aGUgbWFjcm8uCisgIHN0YXRpYyBib29sIGlzQXRFbmRPZk1hY3JvRXhwYW5zaW9uKFNvdXJjZUxvY2F0aW9uIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gKk1hY3JvRW5kID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBBY2NlcHRzIGEgcmFuZ2UgYW5kIHJldHVybnMgYSBjaGFyYWN0ZXIgcmFuZ2Ugd2l0aCBmaWxlIGxvY2F0aW9ucy4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIGEgbnVsbCByYW5nZSBpZiBhIHBhcnQgb2YgdGhlIHJhbmdlIHJlc2lkZXMgaW5zaWRlIGEgbWFjcm8KKyAgLy8vIGV4cGFuc2lvbiBvciB0aGUgcmFuZ2UgZG9lcyBub3QgcmVzaWRlIG9uIHRoZSBzYW1lIEZpbGVJRC4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIHRyeWluZyB0byBkZWFsIHdpdGggbWFjcm9zIGFuZCByZXR1cm4gYSByYW5nZSBiYXNlZCBvbgorICAvLy8gZmlsZSBsb2NhdGlvbnMuIFRoZSBjYXNlcyB3aGVyZSBpdCBjYW4gc3VjY2Vzc2Z1bGx5IGhhbmRsZSBtYWNyb3MgYXJlOgorICAvLy8KKyAgLy8vIC1iZWdpbiBvciBlbmQgcmFuZ2UgbGllcyBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIGEgbWFjcm8gZXhwYW5zaW9uLCBpbgorICAvLy8gIHdoaWNoIGNhc2UgdGhlIGxvY2F0aW9uIHdpbGwgYmUgc2V0IHRvIHRoZSBleHBhbnNpb24gcG9pbnQsIGUuZzoKKyAgLy8vICAgIFwjZGVmaW5lIE0gMSAyCisgIC8vLyAgICBhIE0KKyAgLy8vIElmIHlvdSBoYXZlIGEgcmFuZ2UgW2EsIDJdICh3aGVyZSAyIGNhbWUgZnJvbSB0aGUgbWFjcm8pLCB0aGUgZnVuY3Rpb24KKyAgLy8vIHdpbGwgcmV0dXJuIGEgcmFuZ2UgZm9yICJhIE0iCisgIC8vLyBpZiB5b3UgaGF2ZSByYW5nZSBbYSwgMV0sIHRoZSBmdW5jdGlvbiB3aWxsIGZhaWwgYmVjYXVzZSB0aGUgcmFuZ2UKKyAgLy8vIG92ZXJsYXBzIHdpdGggb25seSBhIHBhcnQgb2YgdGhlIG1hY3JvCisgIC8vLworICAvLy8gLVRoZSBtYWNybyBpcyBhIGZ1bmN0aW9uIG1hY3JvIGFuZCB0aGUgcmFuZ2UgY2FuIGJlIG1hcHBlZCB0byB0aGUgbWFjcm8KKyAgLy8vICBhcmd1bWVudHMsIGUuZzoKKyAgLy8vICAgIFwjZGVmaW5lIE0gMSAyCisgIC8vLyAgICBcI2RlZmluZSBGTSh4KSB4CisgIC8vLyAgICBGTShhIGIgTSkKKyAgLy8vIGlmIHlvdSBoYXZlIHJhbmdlIFtiLCAyXSwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBmaWxlIHJhbmdlICJiIE0iCisgIC8vLyBpbnNpZGUgdGhlIG1hY3JvIGFyZ3VtZW50cy4KKyAgLy8vIGlmIHlvdSBoYXZlIHJhbmdlIFthLCAyXSwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBmaWxlIHJhbmdlCisgIC8vLyAiRk0oYSBiIE0pIiBzaW5jZSB0aGUgcmFuZ2UgaW5jbHVkZXMgYWxsIG9mIHRoZSBtYWNybyBleHBhbnNpb24uCisgIHN0YXRpYyBDaGFyU291cmNlUmFuZ2UgbWFrZUZpbGVDaGFyUmFuZ2UoQ2hhclNvdXJjZVJhbmdlIFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cyk7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgc3RyaW5nIGZvciB0aGUgc291cmNlIHRoYXQgdGhlIHJhbmdlIGVuY29tcGFzc2VzLgorICBzdGF0aWMgU3RyaW5nUmVmIGdldFNvdXJjZVRleHQoQ2hhclNvdXJjZVJhbmdlIFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpJbnZhbGlkID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgaW1tZWRpYXRlIG1hY3JvIGV4cGFuc2lvbi4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgc3RhcnRzIGZyb20gYSBzb3VyY2UgbG9jYXRpb24sIGFuZCBmaW5kcyB0aGUgbmFtZSBvZiB0aGUgbWFjcm8KKyAgLy8vIHJlc3BvbnNpYmxlIGZvciBpdHMgaW1tZWRpYXRlIGV4cGFuc2lvbi4gSXQgbG9va3MgdGhyb3VnaCBhbnkgaW50ZXJ2ZW5pbmcKKyAgLy8vIG1hY3JvIGFyZ3VtZW50IGV4cGFuc2lvbnMgdG8gY29tcHV0ZSB0aGlzLiBJdCByZXR1cm5zIGEgU3RyaW5nUmVmIHdoaWNoCisgIC8vLyByZWZlcnMgdG8gdGhlIFNvdXJjZU1hbmFnZXItb3duZWQgYnVmZmVyIG9mIHRoZSBzb3VyY2Ugd2hlcmUgdGhhdCBtYWNybworICAvLy8gbmFtZSBpcyBzcGVsbGVkLiBUaHVzLCB0aGUgcmVzdWx0IHNob3VsZG4ndCBvdXQtbGl2ZSB0aGF0IFNvdXJjZU1hbmFnZXIuCisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0SW1tZWRpYXRlTWFjcm9OYW1lKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cyk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgaW1tZWRpYXRlIG1hY3JvIGV4cGFuc2lvbi4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgc3RhcnRzIGZyb20gYSBzb3VyY2UgbG9jYXRpb24sIGFuZCBmaW5kcyB0aGUgbmFtZSBvZiB0aGUKKyAgLy8vIG1hY3JvIHJlc3BvbnNpYmxlIGZvciBpdHMgaW1tZWRpYXRlIGV4cGFuc2lvbi4gSXQgbG9va3MgdGhyb3VnaCBhbnkKKyAgLy8vIGludGVydmVuaW5nIG1hY3JvIGFyZ3VtZW50IGV4cGFuc2lvbnMgdG8gY29tcHV0ZSB0aGlzLiBJdCByZXR1cm5zIGEKKyAgLy8vIFN0cmluZ1JlZiB3aGljaCByZWZlcnMgdG8gdGhlIFNvdXJjZU1hbmFnZXItb3duZWQgYnVmZmVyIG9mIHRoZSBzb3VyY2UKKyAgLy8vIHdoZXJlIHRoYXQgbWFjcm8gbmFtZSBpcyBzcGVsbGVkLiBUaHVzLCB0aGUgcmVzdWx0IHNob3VsZG4ndCBvdXQtbGl2ZQorICAvLy8gdGhhdCBTb3VyY2VNYW5hZ2VyLgorICAvLy8KKyAgLy8vIFRoaXMgZGlmZmVycyBmcm9tIExleGVyOjpnZXRJbW1lZGlhdGVNYWNyb05hbWUgaW4gdGhhdCBhbnkgbWFjcm8gYXJndW1lbnQKKyAgLy8vIGxvY2F0aW9uIHdpbGwgcmVzdWx0IGluIHRoZSB0b3Btb3N0IGZ1bmN0aW9uIG1hY3JvIHRoYXQgYWNjZXB0ZWQgaXQuCisgIC8vLyBlLmcuCisgIC8vLyBcY29kZQorICAvLy8gICBNQUMxKCBNQUMyKGZvbykgKQorICAvLy8gXGVuZGNvZGUKKyAgLy8vIGZvciBsb2NhdGlvbiBvZiAnZm9vJyB0b2tlbiwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAiTUFDMSIgd2hpbGUKKyAgLy8vIExleGVyOjpnZXRJbW1lZGlhdGVNYWNyb05hbWUgd2lsbCByZXR1cm4gIk1BQzIiLgorICBzdGF0aWMgU3RyaW5nUmVmIGdldEltbWVkaWF0ZU1hY3JvTmFtZUZvckRpYWdub3N0aWNzKAorICAgICAgU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKTsKKworICAvLy8gXGJyaWVmIENvbXB1dGUgdGhlIHByZWFtYmxlIG9mIHRoZSBnaXZlbiBmaWxlLgorICAvLy8KKyAgLy8vIFRoZSBwcmVhbWJsZSBvZiBhIGZpbGUgY29udGFpbnMgdGhlIGluaXRpYWwgY29tbWVudHMsIGluY2x1ZGUgZGlyZWN0aXZlcywKKyAgLy8vIGFuZCBvdGhlciBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyB0aGF0IG9jY3VyIGJlZm9yZSB0aGUgY29kZSBpbiB0aGlzCisgIC8vLyBwYXJ0aWN1bGFyIGZpbGUgYWN0dWFsbHkgYmVnaW5zLiBUaGUgcHJlYW1ibGUgb2YgdGhlIG1haW4gc291cmNlIGZpbGUgaXMKKyAgLy8vIGEgcG90ZW50aWFsIHByZWZpeCBoZWFkZXIuCisgIC8vLworICAvLy8gXHBhcmFtIEJ1ZmZlciBUaGUgbWVtb3J5IGJ1ZmZlciBjb250YWluaW5nIHRoZSBmaWxlJ3MgY29udGVudHMuCisgIC8vLworICAvLy8gXHBhcmFtIE1heExpbmVzIElmIG5vbi16ZXJvLCByZXN0cmljdCB0aGUgbGVuZ3RoIG9mIHRoZSBwcmVhbWJsZQorICAvLy8gdG8gZmV3ZXIgdGhhbiB0aGlzIG51bWJlciBvZiBsaW5lcy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBUaGUgb2Zmc2V0IGludG8gdGhlIGZpbGUgd2hlcmUgdGhlIHByZWFtYmxlIGVuZHMgYW5kIHRoZSByZXN0CisgIC8vLyBvZiB0aGUgZmlsZSBiZWdpbnMgYWxvbmcgd2l0aCBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyCisgIC8vLyB0aGUgcHJlYW1ibGUgZW5kcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbmV3IGxpbmUuCisgIHN0YXRpYyBQcmVhbWJsZUJvdW5kcyBDb21wdXRlUHJlYW1ibGUoU3RyaW5nUmVmIEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4TGluZXMgPSAwKTsKKworICAvLy8gRmluZHMgdGhlIHRva2VuIHRoYXQgY29tZXMgcmlnaHQgYWZ0ZXIgdGhlIGdpdmVuIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFJldHVybnMgdGhlIG5leHQgdG9rZW4sIG9yIG5vbmUgaWYgdGhlIGxvY2F0aW9uIGlzIGluc2lkZSBhIG1hY3JvLgorICBzdGF0aWMgT3B0aW9uYWw8VG9rZW4+IGZpbmROZXh0VG9rZW4oU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpOworCisgIC8vLyBcYnJpZWYgQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHRva2VuIGlzIHRoZSBmaXJzdCB0b2tlbiB0aGF0IG9jY3VycyBhZnRlcgorICAvLy8gdGhlIGdpdmVuIGxvY2F0aW9uICh0aGlzIGV4Y2x1ZGVzIGNvbW1lbnRzIGFuZCB3aGl0ZXNwYWNlKS4gUmV0dXJucyB0aGUKKyAgLy8vIGxvY2F0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBzcGVjaWZpZWQgdG9rZW4uIElmIHRoZSB0b2tlbiBpcyBub3QgZm91bmQKKyAgLy8vIG9yIHRoZSBsb2NhdGlvbiBpcyBpbnNpZGUgYSBtYWNybywgdGhlIHJldHVybmVkIHNvdXJjZSBsb2NhdGlvbiB3aWxsIGJlCisgIC8vLyBpbnZhbGlkLgorICBzdGF0aWMgU291cmNlTG9jYXRpb24gZmluZExvY2F0aW9uQWZ0ZXJUb2tlbihTb3VyY2VMb2NhdGlvbiBsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6VG9rZW5LaW5kIFRLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNraXBUcmFpbGluZ1doaXRlc3BhY2VBbmROZXdMaW5lKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGNvdWxkIGFwcGVhciBpbiBhbiBpZGVudGlmaWVyLgorICBzdGF0aWMgYm9vbCBpc0lkZW50aWZpZXJCb2R5Q2hhcihjaGFyIGMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cyk7CisKKyAgLy8vIFxicmllZiBDaGVja3Mgd2hldGhlciBuZXcgbGluZSBwb2ludGVkIGJ5IFN0ciBpcyBwcmVjZWRlZCBieSBlc2NhcGUKKyAgLy8vIHNlcXVlbmNlLgorICBzdGF0aWMgYm9vbCBpc05ld0xpbmVFc2NhcGVkKGNvbnN0IGNoYXIgKkJ1ZmZlclN0YXJ0LCBjb25zdCBjaGFyICpTdHIpOworCisgIC8vLyBnZXRDaGFyQW5kU2l6ZU5vV2FybiAtIExpa2UgdGhlIGdldENoYXJBbmRTaXplIG1ldGhvZCwgYnV0IGRvZXMgbm90IGV2ZXIKKyAgLy8vIGVtaXQgYSB3YXJuaW5nLgorICBzdGF0aWMgaW5saW5lIGNoYXIgZ2V0Q2hhckFuZFNpemVOb1dhcm4oY29uc3QgY2hhciAqUHRyLCB1bnNpZ25lZCAmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICAgIC8vIElmIHRoaXMgaXMgbm90IGEgdHJpZ3JhcGggYW5kIG5vdCBhIFVDTiBvciBlc2NhcGVkIG5ld2xpbmUsIHJldHVybgorICAgIC8vIHF1aWNrbHkuCisgICAgaWYgKGlzT2J2aW91c2x5U2ltcGxlQ2hhcmFjdGVyKFB0clswXSkpIHsKKyAgICAgIFNpemUgPSAxOworICAgICAgcmV0dXJuICpQdHI7CisgICAgfQorCisgICAgU2l6ZSA9IDA7CisgICAgcmV0dXJuIGdldENoYXJBbmRTaXplU2xvd05vV2FybihQdHIsIFNpemUsIExhbmdPcHRzKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBsZWFkaW5nIHdoaXRlc3BhY2UgZm9yIGxpbmUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4KKyAgLy8vIGxvY2F0aW9uIFxwIExvYy4KKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRJbmRlbnRhdGlvbkZvckxpbmUoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSk7CisKK3ByaXZhdGU6CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBpbnRlcmZhY2VzLgorCisgIC8vLyBMZXhUb2tlbkludGVybmFsIC0gSW50ZXJuYWwgaW50ZXJmYWNlIHRvIGxleCBhIHByZXByb2Nlc3NpbmcgdG9rZW4uIENhbGxlZAorICAvLy8gYnkgTGV4LgorICAvLy8KKyAgYm9vbCBMZXhUb2tlbkludGVybmFsKFRva2VuICZSZXN1bHQsIGJvb2wgVG9rQXRQaHlzaWNhbFN0YXJ0T2ZMaW5lKTsKKworICBib29sIENoZWNrVW5pY29kZVdoaXRlc3BhY2UoVG9rZW4gJlJlc3VsdCwgdWludDMyX3QgQywgY29uc3QgY2hhciAqQ3VyUHRyKTsKKworICAvLy8gR2l2ZW4gdGhhdCBhIHRva2VuIGJlZ2lucyB3aXRoIHRoZSBVbmljb2RlIGNoYXJhY3RlciBccCBDLCBmaWd1cmUgb3V0CisgIC8vLyB3aGF0IGtpbmQgb2YgdG9rZW4gaXQgaXMgYW5kIGRpc3BhdGNoIHRvIHRoZSBhcHByb3ByaWF0ZSBsZXhpbmcgaGVscGVyCisgIC8vLyBmdW5jdGlvbi4KKyAgYm9vbCBMZXhVbmljb2RlKFRva2VuICZSZXN1bHQsIHVpbnQzMl90IEMsIGNvbnN0IGNoYXIgKkN1clB0cik7CisKKyAgLy8vIEZvcm1Ub2tlbldpdGhDaGFycyAtIFdoZW4gd2UgbGV4IGEgdG9rZW4sIHdlIGhhdmUgaWRlbnRpZmllZCBhIHNwYW4KKyAgLy8vIHN0YXJ0aW5nIGF0IEJ1ZmZlclB0ciwgZ29pbmcgdG8gVG9rRW5kIHRoYXQgZm9ybXMgdGhlIHRva2VuLiAgVGhpcyBtZXRob2QKKyAgLy8vIHRha2VzIHRoYXQgcmFuZ2UgYW5kIGFzc2lnbnMgaXQgdG8gdGhlIHRva2VuIGFzIGl0cyBsb2NhdGlvbiBhbmQgc2l6ZS4gIEluCisgIC8vLyBhZGRpdGlvbiwgc2luY2UgdG9rZW5zIGNhbm5vdCBvdmVybGFwLCB0aGlzIGFsc28gdXBkYXRlcyBCdWZmZXJQdHIgdG8gYmUKKyAgLy8vIFRva0VuZC4KKyAgdm9pZCBGb3JtVG9rZW5XaXRoQ2hhcnMoVG9rZW4gJlJlc3VsdCwgY29uc3QgY2hhciAqVG9rRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6OlRva2VuS2luZCBLaW5kKSB7CisgICAgdW5zaWduZWQgVG9rTGVuID0gVG9rRW5kLUJ1ZmZlclB0cjsKKyAgICBSZXN1bHQuc2V0TGVuZ3RoKFRva0xlbik7CisgICAgUmVzdWx0LnNldExvY2F0aW9uKGdldFNvdXJjZUxvY2F0aW9uKEJ1ZmZlclB0ciwgVG9rTGVuKSk7CisgICAgUmVzdWx0LnNldEtpbmQoS2luZCk7CisgICAgQnVmZmVyUHRyID0gVG9rRW5kOworICB9CisKKyAgLy8vIGlzTmV4dFBQVG9rZW5MUGFyZW4gLSBSZXR1cm4gMSBpZiB0aGUgbmV4dCB1bmV4cGFuZGVkIHRva2VuIHdpbGwgcmV0dXJuIGEKKyAgLy8vIHRvazo6bF9wYXJlbiB0b2tlbiwgMCBpZiBpdCBpcyBzb21ldGhpbmcgZWxzZSBhbmQgMiBpZiB0aGVyZSBhcmUgbm8gbW9yZQorICAvLy8gdG9rZW5zIGluIHRoZSBidWZmZXIgY29udHJvbGxlZCBieSB0aGlzIGxleGVyLgorICB1bnNpZ25lZCBpc05leHRQUFRva2VuTFBhcmVuKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIExleGVyIGNoYXJhY3RlciByZWFkaW5nIGludGVyZmFjZXMuCisKKyAgLy8gVGhpcyBsZXhlciBpcyBidWlsdCBvbiB0d28gaW50ZXJmYWNlcyBmb3IgcmVhZGluZyBjaGFyYWN0ZXJzLCBib3RoIG9mIHdoaWNoCisgIC8vIGF1dG9tYXRpY2FsbHkgcHJvdmlkZSBwaGFzZSAxLzIgdHJhbnNsYXRpb24uICBnZXRBbmRBZHZhbmNlQ2hhciBpcyB1c2VkCisgIC8vIHdoZW4gd2Uga25vdyB0aGF0IHdlIHdpbGwgYmUgcmVhZGluZyBhIGNoYXJhY3RlciBmcm9tIHRoZSBpbnB1dCBidWZmZXIgYW5kCisgIC8vIHRoYXQgdGhpcyBjaGFyYWN0ZXIgd2lsbCBiZSBwYXJ0IG9mIHRoZSByZXN1bHQgdG9rZW4uIFRoaXMgb2NjdXJzIGluIChmLmUuKQorICAvLyBzdHJpbmcgcHJvY2Vzc2luZywgYmVjYXVzZSB3ZSBrbm93IHdlIG5lZWQgdG8gcmVhZCB1bnRpbCB3ZSBmaW5kIHRoZQorICAvLyBjbG9zaW5nICciJyBjaGFyYWN0ZXIuCisgIC8vCisgIC8vIFRoZSBzZWNvbmQgaW50ZXJmYWNlIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBnZXRDaGFyQW5kU2l6ZSB3aXRoCisgIC8vIENvbnN1bWVDaGFyLiAgZ2V0Q2hhckFuZFNpemUgcmVhZHMgYSBwaGFzZSAxLzIgdHJhbnNsYXRlZCBjaGFyYWN0ZXIsCisgIC8vIHJldHVybmluZyBpdCBhbmQgaXRzIHNpemUuICBJZiB0aGUgbGV4ZXIgZGVjaWRlcyB0aGF0IHRoaXMgY2hhcmFjdGVyIGlzCisgIC8vIHBhcnQgb2YgdGhlIGN1cnJlbnQgdG9rZW4sIGl0IGNhbGxzIENvbnN1bWVDaGFyIG9uIGl0LiAgVGhpcyB0d28gc3RhZ2UKKyAgLy8gYXBwcm9hY2ggYWxsb3dzIHVzIHRvIGVtaXQgZGlhZ25vc3RpY3MgZm9yIGNoYXJhY3RlcnMgKGUuZy4gd2FybmluZ3MgYWJvdXQKKyAgLy8gdHJpZ3JhcGhzKSwga25vd2luZyB0aGF0IHRoZXkgb25seSBhcmUgZW1pdHRlZCBpZiB0aGUgY2hhcmFjdGVyIGlzCisgIC8vIGNvbnN1bWVkLgorCisgIC8vLyBpc09idmlvdXNseVNpbXBsZUNoYXJhY3RlciAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzCisgIC8vLyBvYnZpb3VzbHkgdGhlIHNhbWUgaW4gdHJhbnNsYXRpb24gcGhhc2UgMSBhbmQgdHJhbnNsYXRpb24gcGhhc2UgMy4gIFRoaXMKKyAgLy8vIGNhbiByZXR1cm4gZmFsc2UgZm9yIGNoYXJhY3RlcnMgdGhhdCBlbmQgdXAgYmVpbmcgdGhlIHNhbWUsIGJ1dCBpdCB3aWxsCisgIC8vLyBuZXZlciByZXR1cm4gdHJ1ZSBmb3Igc29tZXRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgbWFwcGVkLgorICBzdGF0aWMgYm9vbCBpc09idmlvdXNseVNpbXBsZUNoYXJhY3RlcihjaGFyIEMpIHsKKyAgICByZXR1cm4gQyAhPSAnPycgJiYgQyAhPSAnXFwnOworICB9CisKKyAgLy8vIGdldEFuZEFkdmFuY2VDaGFyIC0gUmVhZCBhIHNpbmdsZSAnY2hhcmFjdGVyJyBmcm9tIHRoZSBzcGVjaWZpZWQgYnVmZmVyLAorICAvLy8gYWR2YW5jZSBvdmVyIGl0LCBhbmQgcmV0dXJuIGl0LiAgVGhpcyBpcyB0cmlja3kgaW4gc2V2ZXJhbCBjYXNlcy4gIEhlcmUgd2UKKyAgLy8vIGp1c3QgaGFuZGxlIHRoZSB0cml2aWFsIGNhc2UgYW5kIGZhbGwtYmFjayB0byB0aGUgbm9uLWlubGluZWQKKyAgLy8vIGdldENoYXJBbmRTaXplU2xvdyBtZXRob2QgdG8gaGFuZGxlIHRoZSBoYXJkIGNhc2UuCisgIGlubGluZSBjaGFyIGdldEFuZEFkdmFuY2VDaGFyKGNvbnN0IGNoYXIgKiZQdHIsIFRva2VuICZUb2spIHsKKyAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIHRyaWdyYXBoIGFuZCBub3QgYSBVQ04gb3IgZXNjYXBlZCBuZXdsaW5lLCByZXR1cm4KKyAgICAvLyBxdWlja2x5LgorICAgIGlmIChpc09idmlvdXNseVNpbXBsZUNoYXJhY3RlcihQdHJbMF0pKSByZXR1cm4gKlB0cisrOworCisgICAgdW5zaWduZWQgU2l6ZSA9IDA7CisgICAgY2hhciBDID0gZ2V0Q2hhckFuZFNpemVTbG93KFB0ciwgU2l6ZSwgJlRvayk7CisgICAgUHRyICs9IFNpemU7CisgICAgcmV0dXJuIEM7CisgIH0KKworICAvLy8gQ29uc3VtZUNoYXIgLSBXaGVuIGEgY2hhcmFjdGVyIChpZGVudGlmaWVkIGJ5IGdldENoYXJBbmRTaXplKSBpcyBjb25zdW1lZAorICAvLy8gYW5kIGFkZGVkIHRvIGEgZ2l2ZW4gdG9rZW4sIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgZGlhZ25vc3RpY3MgdGhhdAorICAvLy8gbmVlZCB0byBiZSBlbWl0dGVkIG9yIGZsYWdzIHRoYXQgbmVlZCB0byBiZSBzZXQgb24gdGhlIHRva2VuLiAgSWYgc28sIGRvCisgIC8vLyBpdC4KKyAgY29uc3QgY2hhciAqQ29uc3VtZUNoYXIoY29uc3QgY2hhciAqUHRyLCB1bnNpZ25lZCBTaXplLCBUb2tlbiAmVG9rKSB7CisgICAgLy8gTm9ybWFsIGNhc2UsIHdlIGNvbnN1bWVkIGV4YWN0bHkgb25lIHRva2VuLiAgSnVzdCByZXR1cm4gaXQuCisgICAgaWYgKFNpemUgPT0gMSkKKyAgICAgIHJldHVybiBQdHIrU2l6ZTsKKworICAgIC8vIE90aGVyd2lzZSwgcmUtbGV4IHRoZSBjaGFyYWN0ZXIgd2l0aCBhIGN1cnJlbnQgdG9rZW4sIGFsbG93aW5nCisgICAgLy8gZGlhZ25vc3RpY3MgdG8gYmUgZW1pdHRlZCBhbmQgZmxhZ3MgdG8gYmUgc2V0LgorICAgIFNpemUgPSAwOworICAgIGdldENoYXJBbmRTaXplU2xvdyhQdHIsIFNpemUsICZUb2spOworICAgIHJldHVybiBQdHIrU2l6ZTsKKyAgfQorCisgIC8vLyBnZXRDaGFyQW5kU2l6ZSAtIFBlZWsgYSBzaW5nbGUgJ2NoYXJhY3RlcicgZnJvbSB0aGUgc3BlY2lmaWVkIGJ1ZmZlciwKKyAgLy8vIGdldCBpdHMgc2l6ZSwgYW5kIHJldHVybiBpdC4gIFRoaXMgaXMgdHJpY2t5IGluIHNldmVyYWwgY2FzZXMuICBIZXJlIHdlCisgIC8vLyBqdXN0IGhhbmRsZSB0aGUgdHJpdmlhbCBjYXNlIGFuZCBmYWxsLWJhY2sgdG8gdGhlIG5vbi1pbmxpbmVkCisgIC8vLyBnZXRDaGFyQW5kU2l6ZVNsb3cgbWV0aG9kIHRvIGhhbmRsZSB0aGUgaGFyZCBjYXNlLgorICBpbmxpbmUgY2hhciBnZXRDaGFyQW5kU2l6ZShjb25zdCBjaGFyICpQdHIsIHVuc2lnbmVkICZTaXplKSB7CisgICAgLy8gSWYgdGhpcyBpcyBub3QgYSB0cmlncmFwaCBhbmQgbm90IGEgVUNOIG9yIGVzY2FwZWQgbmV3bGluZSwgcmV0dXJuCisgICAgLy8gcXVpY2tseS4KKyAgICBpZiAoaXNPYnZpb3VzbHlTaW1wbGVDaGFyYWN0ZXIoUHRyWzBdKSkgeworICAgICAgU2l6ZSA9IDE7CisgICAgICByZXR1cm4gKlB0cjsKKyAgICB9CisKKyAgICBTaXplID0gMDsKKyAgICByZXR1cm4gZ2V0Q2hhckFuZFNpemVTbG93KFB0ciwgU2l6ZSk7CisgIH0KKworICAvLy8gZ2V0Q2hhckFuZFNpemVTbG93IC0gSGFuZGxlIHRoZSBzbG93L3VuY29tbW9uIGNhc2Ugb2YgdGhlIGdldENoYXJBbmRTaXplCisgIC8vLyBtZXRob2QuCisgIGNoYXIgZ2V0Q2hhckFuZFNpemVTbG93KGNvbnN0IGNoYXIgKlB0ciwgdW5zaWduZWQgJlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuICpUb2sgPSBudWxscHRyKTsKKworICAvLy8gZ2V0RXNjYXBlZE5ld0xpbmVTaXplIC0gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzcGVjaWZpZWQgZXNjYXBlZCBuZXdsaW5lLAorICAvLy8gb3IgMCBpZiBpdCBpcyBub3QgYW4gZXNjYXBlZCBuZXdsaW5lLiBQWy0xXSBpcyBrbm93biB0byBiZSBhICJcIiBvbiBlbnRyeQorICAvLy8gdG8gdGhpcyBmdW5jdGlvbi4KKyAgc3RhdGljIHVuc2lnbmVkIGdldEVzY2FwZWROZXdMaW5lU2l6ZShjb25zdCBjaGFyICpQKTsKKworICAvLy8gU2tpcEVzY2FwZWROZXdMaW5lcyAtIElmIFAgcG9pbnRzIHRvIGFuIGVzY2FwZWQgbmV3bGluZSAob3IgYSBzZXJpZXMgb2YKKyAgLy8vIHRoZW0pLCBza2lwIG92ZXIgdGhlbSBhbmQgcmV0dXJuIHRoZSBmaXJzdCBub24tZXNjYXBlZC1uZXdsaW5lIGZvdW5kLAorICAvLy8gb3RoZXJ3aXNlIHJldHVybiBQLgorICBzdGF0aWMgY29uc3QgY2hhciAqU2tpcEVzY2FwZWROZXdMaW5lcyhjb25zdCBjaGFyICpQKTsKKworICAvLy8gZ2V0Q2hhckFuZFNpemVTbG93Tm9XYXJuIC0gU2FtZSBhcyBnZXRDaGFyQW5kU2l6ZVNsb3csIGJ1dCBuZXZlciBlbWl0cyBhCisgIC8vLyBkaWFnbm9zdGljLgorICBzdGF0aWMgY2hhciBnZXRDaGFyQW5kU2l6ZVNsb3dOb1dhcm4oY29uc3QgY2hhciAqUHRyLCB1bnNpZ25lZCAmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cyk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE90aGVyIGxleGVyIGZ1bmN0aW9ucy4KKworICB2b2lkIFNldEJ5dGVPZmZzZXQodW5zaWduZWQgT2Zmc2V0LCBib29sIFN0YXJ0T2ZMaW5lKTsKKworICB2b2lkIFByb3BhZ2F0ZUxpbmVTdGFydExlYWRpbmdTcGFjZUluZm8oVG9rZW4gJlJlc3VsdCk7CisKKyAgY29uc3QgY2hhciAqTGV4VURTdWZmaXgoVG9rZW4gJlJlc3VsdCwgY29uc3QgY2hhciAqQ3VyUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzU3RyaW5nTGl0ZXJhbCk7CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9ucyB0byBsZXggdGhlIHJlbWFpbmRlciBvZiBhIHRva2VuIG9mIHRoZSBzcGVjaWZpYyB0eXBlLgorICBib29sIExleElkZW50aWZpZXIgICAgICAgICAoVG9rZW4gJlJlc3VsdCwgY29uc3QgY2hhciAqQ3VyUHRyKTsKKyAgYm9vbCBMZXhOdW1lcmljQ29uc3RhbnQgICAgKFRva2VuICZSZXN1bHQsIGNvbnN0IGNoYXIgKkN1clB0cik7CisgIGJvb2wgTGV4U3RyaW5nTGl0ZXJhbCAgICAgIChUb2tlbiAmUmVzdWx0LCBjb25zdCBjaGFyICpDdXJQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6OlRva2VuS2luZCBLaW5kKTsKKyAgYm9vbCBMZXhSYXdTdHJpbmdMaXRlcmFsICAgKFRva2VuICZSZXN1bHQsIGNvbnN0IGNoYXIgKkN1clB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6VG9rZW5LaW5kIEtpbmQpOworICBib29sIExleEFuZ2xlZFN0cmluZ0xpdGVyYWwoVG9rZW4gJlJlc3VsdCwgY29uc3QgY2hhciAqQ3VyUHRyKTsKKyAgYm9vbCBMZXhDaGFyQ29uc3RhbnQgICAgICAgKFRva2VuICZSZXN1bHQsIGNvbnN0IGNoYXIgKkN1clB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6VG9rZW5LaW5kIEtpbmQpOworICBib29sIExleEVuZE9mRmlsZSAgICAgICAgICAoVG9rZW4gJlJlc3VsdCwgY29uc3QgY2hhciAqQ3VyUHRyKTsKKyAgYm9vbCBTa2lwV2hpdGVzcGFjZSAgICAgICAgKFRva2VuICZSZXN1bHQsIGNvbnN0IGNoYXIgKkN1clB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJlRva0F0UGh5c2ljYWxTdGFydE9mTGluZSk7CisgIGJvb2wgU2tpcExpbmVDb21tZW50ICAgICAgIChUb2tlbiAmUmVzdWx0LCBjb25zdCBjaGFyICpDdXJQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZUb2tBdFBoeXNpY2FsU3RhcnRPZkxpbmUpOworICBib29sIFNraXBCbG9ja0NvbW1lbnQgICAgICAoVG9rZW4gJlJlc3VsdCwgY29uc3QgY2hhciAqQ3VyUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmVG9rQXRQaHlzaWNhbFN0YXJ0T2ZMaW5lKTsKKyAgYm9vbCBTYXZlTGluZUNvbW1lbnQgICAgICAgKFRva2VuICZSZXN1bHQsIGNvbnN0IGNoYXIgKkN1clB0cik7CisKKyAgYm9vbCBJc1N0YXJ0T2ZDb25mbGljdE1hcmtlcihjb25zdCBjaGFyICpDdXJQdHIpOworICBib29sIEhhbmRsZUVuZE9mQ29uZmxpY3RNYXJrZXIoY29uc3QgY2hhciAqQ3VyUHRyKTsKKworICBib29sIGxleEVkaXRvclBsYWNlaG9sZGVyKFRva2VuICZSZXN1bHQsIGNvbnN0IGNoYXIgKkN1clB0cik7CisKKyAgYm9vbCBpc0NvZGVDb21wbGV0aW9uUG9pbnQoY29uc3QgY2hhciAqQ3VyUHRyKSBjb25zdDsKKyAgdm9pZCBjdXRPZmZMZXhpbmcoKSB7IEJ1ZmZlclB0ciA9IEJ1ZmZlckVuZDsgfQorCisgIGJvb2wgaXNIZXhhTGl0ZXJhbChjb25zdCBjaGFyICpTdGFydCwgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKTsKKworCisgIC8vLyBSZWFkIGEgdW5pdmVyc2FsIGNoYXJhY3RlciBuYW1lLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDdXJQdHIgVGhlIHBvc2l0aW9uIGluIHRoZSBzb3VyY2UgYnVmZmVyIGFmdGVyIHRoZSBpbml0aWFsICdcJy4KKyAgLy8vICAgICAgICAgICAgICAgSWYgdGhlIFVDTiBpcyBzeW50YWN0aWNhbGx5IHdlbGwtZm9ybWVkIChidXQgbm90IG5lY2Vzc2FyaWx5CisgIC8vLyAgICAgICAgICAgICAgIHZhbGlkKSwgdGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZQorICAvLy8gICAgICAgICAgICAgICBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIFVDTi4KKyAgLy8vIFxwYXJhbSBTbGFzaExvYyBUaGUgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSBidWZmZXIgb2YgdGhlICdcJy4KKyAgLy8vIFxwYXJhbSBUb2sgVGhlIHRva2VuIGJlaW5nIGZvcm1lZC4gUGFzcyBcYyBudWxscHRyIHRvIHN1cHByZXNzIGRpYWdub3N0aWNzCisgIC8vLyAgICAgICAgICAgIGFuZCBoYW5kbGUgdG9rZW4gZm9ybWF0aW9uIGluIHRoZSBjYWxsZXIuCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgVW5pY29kZSBjb2RlcG9pbnQgc3BlY2lmaWVkIGJ5IHRoZSBVQ04sIG9yIDAgaWYgdGhlIFVDTiBpcworICAvLy8gICAgICAgICBpbnZhbGlkLgorICB1aW50MzJfdCB0cnlSZWFkVUNOKGNvbnN0IGNoYXIgKiZDdXJQdHIsIGNvbnN0IGNoYXIgKlNsYXNoTG9jLCBUb2tlbiAqVG9rKTsKKworICAvLy8gXGJyaWVmIFRyeSB0byBjb25zdW1lIGEgVUNOIGFzIHBhcnQgb2YgYW4gaWRlbnRpZmllciBhdCB0aGUgY3VycmVudAorICAvLy8gbG9jYXRpb24uCisgIC8vLyBccGFyYW0gQ3VyUHRyIEluaXRpYWxseSBwb2ludHMgdG8gdGhlIHJhbmdlIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHNvdXJjZQorICAvLy8gICAgICAgICAgICAgICBidWZmZXIgY29udGFpbmluZyB0aGUgJ1wnLiBVcGRhdGVkIHRvIHBvaW50IHBhc3QgdGhlIGVuZCBvZgorICAvLy8gICAgICAgICAgICAgICB0aGUgVUNOIG9uIHN1Y2Nlc3MuCisgIC8vLyBccGFyYW0gU2l6ZSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgb2NjdXBpZWQgYnkgdGhlICdcJyAoaW5jbHVkaW5nCisgIC8vLyAgICAgICAgICAgICB0cmlncmFwaHMgYW5kIGVzY2FwZWQgbmV3bGluZXMpLgorICAvLy8gXHBhcmFtIFJlc3VsdCBUaGUgdG9rZW4gYmVpbmcgcHJvZHVjZWQuIE1hcmtlZCBhcyBjb250YWluaW5nIGEgVUNOIG9uCisgIC8vLyAgICAgICAgICAgICAgIHN1Y2Nlc3MuCisgIC8vLyBccmV0dXJuIFxjIHRydWUgaWYgYSBVQ04gd2FzIGxleGVkIGFuZCBpdCBwcm9kdWNlZCBhbiBhY2NlcHRhYmxlCisgIC8vLyAgICAgICAgIGlkZW50aWZpZXIgY2hhcmFjdGVyLCBcYyBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgdHJ5Q29uc3VtZUlkZW50aWZpZXJVQ04oY29uc3QgY2hhciAqJkN1clB0ciwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmUmVzdWx0KTsKKworICAvLy8gXGJyaWVmIFRyeSB0byBjb25zdW1lIGFuIGlkZW50aWZpZXIgY2hhcmFjdGVyIGVuY29kZWQgaW4gVVRGLTguCisgIC8vLyBccGFyYW0gQ3VyUHRyIFBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIChwb3RlbnRpYWwpIFVURi04IGNvZGUgdW5pdAorICAvLy8gICAgICAgIHNlcXVlbmNlLiBPbiBzdWNjZXNzLCB1cGRhdGVkIHRvIHBvaW50IHBhc3QgdGhlIGVuZCBvZiBpdC4KKyAgLy8vIFxyZXR1cm4gXGMgdHJ1ZSBpZiBhIFVURi04IHNlcXVlbmNlIG1hcHBpbmcgdG8gYW4gYWNjZXB0YWJsZSBpZGVudGlmaWVyCisgIC8vLyAgICAgICAgIGNoYXJhY3RlciB3YXMgbGV4ZWQsIFxjIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCB0cnlDb25zdW1lSWRlbnRpZmllclVURjhDaGFyKGNvbnN0IGNoYXIgKiZDdXJQdHIpOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfTEVYX0xFWEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9MaXRlcmFsU3VwcG9ydC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L0xpdGVyYWxTdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M5MjIzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9MaXRlcmFsU3VwcG9ydC5oCkBAIC0wLDAgKzEsMjc0IEBACisvLz09PS0tLSBMaXRlcmFsU3VwcG9ydC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBOdW1lcmljTGl0ZXJhbFBhcnNlciwgQ2hhckxpdGVyYWxQYXJzZXIsIGFuZAorLy8gU3RyaW5nTGl0ZXJhbFBhcnNlciBpbnRlcmZhY2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19MRVhfTElURVJBTFNVUFBPUlRfSAorI2RlZmluZSBMTFZNX0NMQU5HX0xFWF9MSVRFUkFMU1VQUE9SVF9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9DaGFySW5mby5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Ub2tlbktpbmRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQVBGbG9hdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIERpYWdub3N0aWNzRW5naW5lOworY2xhc3MgUHJlcHJvY2Vzc29yOworY2xhc3MgVG9rZW47CitjbGFzcyBTb3VyY2VMb2NhdGlvbjsKK2NsYXNzIFRhcmdldEluZm87CitjbGFzcyBTb3VyY2VNYW5hZ2VyOworY2xhc3MgTGFuZ09wdGlvbnM7CisKKy8vLyBDb3B5IGNoYXJhY3RlcnMgZnJvbSBJbnB1dCB0byBCdWYsIGV4cGFuZGluZyBhbnkgVUNOcy4KK3ZvaWQgZXhwYW5kVUNOcyhTbWFsbFZlY3RvckltcGw8Y2hhcj4gJkJ1ZiwgU3RyaW5nUmVmIElucHV0KTsKKworLy8vIE51bWVyaWNMaXRlcmFsUGFyc2VyIC0gVGhpcyBwZXJmb3JtcyBzdHJpY3Qgc2VtYW50aWMgYW5hbHlzaXMgb2YgdGhlIGNvbnRlbnQKKy8vLyBvZiBhIHBwbnVtYmVyLCBjbGFzc2lmeWluZyBpdCBhcyBlaXRoZXIgaW50ZWdlciwgZmxvYXRpbmcsIG9yIGVycm9uZW91cywKKy8vLyBkZXRlcm1pbmVzIHRoZSByYWRpeCBvZiB0aGUgdmFsdWUgYW5kIGNhbiBjb252ZXJ0IGl0IHRvIGEgdXNlZnVsIHZhbHVlLgorY2xhc3MgTnVtZXJpY0xpdGVyYWxQYXJzZXIgeworICBQcmVwcm9jZXNzb3IgJlBQOyAvLyBuZWVkZWQgZm9yIGRpYWdub3N0aWNzCisKKyAgY29uc3QgY2hhciAqY29uc3QgVGhpc1Rva0JlZ2luOworICBjb25zdCBjaGFyICpjb25zdCBUaGlzVG9rRW5kOworICBjb25zdCBjaGFyICpEaWdpdHNCZWdpbiwgKlN1ZmZpeEJlZ2luOyAvLyBtYXJrZXJzCisgIGNvbnN0IGNoYXIgKnM7IC8vIGN1cnNvcgorCisgIHVuc2lnbmVkIHJhZGl4OworCisgIGJvb2wgc2F3X2V4cG9uZW50LCBzYXdfcGVyaW9kLCBzYXdfdWRfc3VmZml4OworCisgIFNtYWxsU3RyaW5nPDMyPiBVRFN1ZmZpeEJ1ZjsKKworcHVibGljOgorICBOdW1lcmljTGl0ZXJhbFBhcnNlcihTdHJpbmdSZWYgVG9rU3BlbGxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRva0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgUHJlcHJvY2Vzc29yICZQUCk7CisgIGJvb2wgaGFkRXJyb3IgOiAxOworICBib29sIGlzVW5zaWduZWQgOiAxOworICBib29sIGlzTG9uZyA6IDE7ICAgICAgICAgIC8vIFRoaXMgaXMgKm5vdCogc2V0IGZvciBsb25nIGxvbmcuCisgIGJvb2wgaXNMb25nTG9uZyA6IDE7CisgIGJvb2wgaXNIYWxmIDogMTsgICAgICAgICAgLy8gMS4waAorICBib29sIGlzRmxvYXQgOiAxOyAgICAgICAgIC8vIDEuMGYKKyAgYm9vbCBpc0ltYWdpbmFyeSA6IDE7ICAgICAvLyAxLjBpCisgIGJvb2wgaXNGbG9hdDE2IDogMTsgICAgICAgLy8gMS4wZjE2CisgIGJvb2wgaXNGbG9hdDEyOCA6IDE7ICAgICAgLy8gMS4wcQorICB1aW50OF90IE1pY3Jvc29mdEludGVnZXI7IC8vIE1pY3Jvc29mdCBzdWZmaXggZXh0ZW5zaW9uIGk4LCBpMTYsIGkzMiwgb3IgaTY0LgorCisgIGJvb2wgaXNJbnRlZ2VyTGl0ZXJhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gIXNhd19wZXJpb2QgJiYgIXNhd19leHBvbmVudDsKKyAgfQorICBib29sIGlzRmxvYXRpbmdMaXRlcmFsKCkgY29uc3QgeworICAgIHJldHVybiBzYXdfcGVyaW9kIHx8IHNhd19leHBvbmVudDsKKyAgfQorCisgIGJvb2wgaGFzVURTdWZmaXgoKSBjb25zdCB7CisgICAgcmV0dXJuIHNhd191ZF9zdWZmaXg7CisgIH0KKyAgU3RyaW5nUmVmIGdldFVEU3VmZml4KCkgY29uc3QgeworICAgIGFzc2VydChzYXdfdWRfc3VmZml4KTsKKyAgICByZXR1cm4gVURTdWZmaXhCdWY7CisgIH0KKyAgdW5zaWduZWQgZ2V0VURTdWZmaXhPZmZzZXQoKSBjb25zdCB7CisgICAgYXNzZXJ0KHNhd191ZF9zdWZmaXgpOworICAgIHJldHVybiBTdWZmaXhCZWdpbiAtIFRoaXNUb2tCZWdpbjsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzVmFsaWRVRFN1ZmZpeChjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsIFN0cmluZ1JlZiBTdWZmaXgpOworCisgIHVuc2lnbmVkIGdldFJhZGl4KCkgY29uc3QgeyByZXR1cm4gcmFkaXg7IH0KKworICAvLy8gR2V0SW50ZWdlclZhbHVlIC0gQ29udmVydCB0aGlzIG51bWVyaWMgbGl0ZXJhbCB2YWx1ZSB0byBhbiBBUEludCB0aGF0CisgIC8vLyBtYXRjaGVzIFZhbCdzIGlucHV0IHdpZHRoLiAgSWYgdGhlcmUgaXMgYW4gb3ZlcmZsb3cgKGkuZS4sIGlmIHRoZSB1bnNpZ25lZAorICAvLy8gdmFsdWUgcmVhZCBpcyBsYXJnZXIgdGhhbiB0aGUgQVBJbnQncyBiaXRzIHdpbGwgaG9sZCksIHNldCBWYWwgdG8gdGhlIGxvdworICAvLy8gYml0cyBvZiB0aGUgcmVzdWx0IGFuZCByZXR1cm4gdHJ1ZS4gIE90aGVyd2lzZSwgcmV0dXJuIGZhbHNlLgorICBib29sIEdldEludGVnZXJWYWx1ZShsbHZtOjpBUEludCAmVmFsKTsKKworICAvLy8gR2V0RmxvYXRWYWx1ZSAtIENvbnZlcnQgdGhpcyBudW1lcmljIGxpdGVyYWwgdG8gYSBmbG9hdGluZyB2YWx1ZSwgdXNpbmcKKyAgLy8vIHRoZSBzcGVjaWZpZWQgQVBGbG9hdCBmbHRTZW1hbnRpY3MgKHNwZWNpZnlpbmcgZmxvYXQsIGRvdWJsZSwgZXRjKS4KKyAgLy8vIFRoZSBvcHRpb25hbCBib29sIGlzRXhhY3QgKHBhc3NlZC1ieS1yZWZlcmVuY2UpIGhhcyBpdHMgdmFsdWUKKyAgLy8vIHNldCB0byB0cnVlIGlmIHRoZSByZXR1cm5lZCBBUEZsb2F0IGNhbiByZXByZXNlbnQgdGhlIG51bWJlciBpbiB0aGUKKyAgLy8vIGxpdGVyYWwgZXhhY3RseSwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgbGx2bTo6QVBGbG9hdDo6b3BTdGF0dXMgR2V0RmxvYXRWYWx1ZShsbHZtOjpBUEZsb2F0ICZSZXN1bHQpOworCitwcml2YXRlOgorCisgIHZvaWQgUGFyc2VOdW1iZXJTdGFydGluZ1dpdGhaZXJvKFNvdXJjZUxvY2F0aW9uIFRva0xvYyk7CisgIHZvaWQgUGFyc2VEZWNpbWFsT3JPY3RhbENvbW1vbihTb3VyY2VMb2NhdGlvbiBUb2tMb2MpOworCisgIHN0YXRpYyBib29sIGlzRGlnaXRTZXBhcmF0b3IoY2hhciBDKSB7IHJldHVybiBDID09ICdcJyc7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIFtTdGFydCwgRW5kKSBjb250YWlucworICAvLy8gYW55IHJlYWwgZGlnaXRzIChub3QgZGlnaXQgc2VwYXJhdG9ycykuCisgIGJvb2wgY29udGFpbnNEaWdpdHMoY29uc3QgY2hhciAqU3RhcnQsIGNvbnN0IGNoYXIgKkVuZCkgeworICAgIHJldHVybiBTdGFydCAhPSBFbmQgJiYgKFN0YXJ0ICsgMSAhPSBFbmQgfHwgIWlzRGlnaXRTZXBhcmF0b3IoU3RhcnRbMF0pKTsKKyAgfQorCisgIGVudW0gQ2hlY2tTZXBhcmF0b3JLaW5kIHsgQ1NLX0JlZm9yZURpZ2l0cywgQ1NLX0FmdGVyRGlnaXRzIH07CisKKyAgLy8vIFxicmllZiBFbnN1cmUgdGhhdCB3ZSBkb24ndCBoYXZlIGEgZGlnaXQgc2VwYXJhdG9yIGhlcmUuCisgIHZvaWQgY2hlY2tTZXBhcmF0b3IoU291cmNlTG9jYXRpb24gVG9rTG9jLCBjb25zdCBjaGFyICpQb3MsCisgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tTZXBhcmF0b3JLaW5kIElzQWZ0ZXJEaWdpdHMpOworCisgIC8vLyBTa2lwSGV4RGlnaXRzIC0gUmVhZCBhbmQgc2tpcCBvdmVyIGFueSBoZXggZGlnaXRzLCB1cCB0byBFbmQuCisgIC8vLyBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBub24taGV4IGRpZ2l0IG9yIEVuZC4KKyAgY29uc3QgY2hhciAqU2tpcEhleERpZ2l0cyhjb25zdCBjaGFyICpwdHIpIHsKKyAgICB3aGlsZSAocHRyICE9IFRoaXNUb2tFbmQgJiYgKGlzSGV4RGlnaXQoKnB0cikgfHwgaXNEaWdpdFNlcGFyYXRvcigqcHRyKSkpCisgICAgICBwdHIrKzsKKyAgICByZXR1cm4gcHRyOworICB9CisKKyAgLy8vIFNraXBPY3RhbERpZ2l0cyAtIFJlYWQgYW5kIHNraXAgb3ZlciBhbnkgb2N0YWwgZGlnaXRzLCB1cCB0byBFbmQuCisgIC8vLyBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBub24taGV4IGRpZ2l0IG9yIEVuZC4KKyAgY29uc3QgY2hhciAqU2tpcE9jdGFsRGlnaXRzKGNvbnN0IGNoYXIgKnB0cikgeworICAgIHdoaWxlIChwdHIgIT0gVGhpc1Rva0VuZCAmJgorICAgICAgICAgICAoKCpwdHIgPj0gJzAnICYmICpwdHIgPD0gJzcnKSB8fCBpc0RpZ2l0U2VwYXJhdG9yKCpwdHIpKSkKKyAgICAgIHB0cisrOworICAgIHJldHVybiBwdHI7CisgIH0KKworICAvLy8gU2tpcERpZ2l0cyAtIFJlYWQgYW5kIHNraXAgb3ZlciBhbnkgZGlnaXRzLCB1cCB0byBFbmQuCisgIC8vLyBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBub24taGV4IGRpZ2l0IG9yIEVuZC4KKyAgY29uc3QgY2hhciAqU2tpcERpZ2l0cyhjb25zdCBjaGFyICpwdHIpIHsKKyAgICB3aGlsZSAocHRyICE9IFRoaXNUb2tFbmQgJiYgKGlzRGlnaXQoKnB0cikgfHwgaXNEaWdpdFNlcGFyYXRvcigqcHRyKSkpCisgICAgICBwdHIrKzsKKyAgICByZXR1cm4gcHRyOworICB9CisKKyAgLy8vIFNraXBCaW5hcnlEaWdpdHMgLSBSZWFkIGFuZCBza2lwIG92ZXIgYW55IGJpbmFyeSBkaWdpdHMsIHVwIHRvIEVuZC4KKyAgLy8vIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG5vbi1iaW5hcnkgZGlnaXQgb3IgRW5kLgorICBjb25zdCBjaGFyICpTa2lwQmluYXJ5RGlnaXRzKGNvbnN0IGNoYXIgKnB0cikgeworICAgIHdoaWxlIChwdHIgIT0gVGhpc1Rva0VuZCAmJgorICAgICAgICAgICAoKnB0ciA9PSAnMCcgfHwgKnB0ciA9PSAnMScgfHwgaXNEaWdpdFNlcGFyYXRvcigqcHRyKSkpCisgICAgICBwdHIrKzsKKyAgICByZXR1cm4gcHRyOworICB9CisKK307CisKKy8vLyBDaGFyTGl0ZXJhbFBhcnNlciAtIFBlcmZvcm0gaW50ZXJwcmV0YXRpb24gYW5kIHNlbWFudGljIGFuYWx5c2lzIG9mIGEKKy8vLyBjaGFyYWN0ZXIgbGl0ZXJhbC4KK2NsYXNzIENoYXJMaXRlcmFsUGFyc2VyIHsKKyAgdWludDY0X3QgVmFsdWU7CisgIHRvazo6VG9rZW5LaW5kIEtpbmQ7CisgIGJvb2wgSXNNdWx0aUNoYXI7CisgIGJvb2wgSGFkRXJyb3I7CisgIFNtYWxsU3RyaW5nPDMyPiBVRFN1ZmZpeEJ1ZjsKKyAgdW5zaWduZWQgVURTdWZmaXhPZmZzZXQ7CitwdWJsaWM6CisgIENoYXJMaXRlcmFsUGFyc2VyKGNvbnN0IGNoYXIgKmJlZ2luLCBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywgUHJlcHJvY2Vzc29yICZQUCwKKyAgICAgICAgICAgICAgICAgICAgdG9rOjpUb2tlbktpbmQga2luZCk7CisKKyAgYm9vbCBoYWRFcnJvcigpIGNvbnN0IHsgcmV0dXJuIEhhZEVycm9yOyB9CisgIGJvb2wgaXNBc2NpaSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gdG9rOjpjaGFyX2NvbnN0YW50OyB9CisgIGJvb2wgaXNXaWRlKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSB0b2s6OndpZGVfY2hhcl9jb25zdGFudDsgfQorICBib29sIGlzVVRGOCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gdG9rOjp1dGY4X2NoYXJfY29uc3RhbnQ7IH0KKyAgYm9vbCBpc1VURjE2KCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSB0b2s6OnV0ZjE2X2NoYXJfY29uc3RhbnQ7IH0KKyAgYm9vbCBpc1VURjMyKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSB0b2s6OnV0ZjMyX2NoYXJfY29uc3RhbnQ7IH0KKyAgYm9vbCBpc011bHRpQ2hhcigpIGNvbnN0IHsgcmV0dXJuIElzTXVsdGlDaGFyOyB9CisgIHVpbnQ2NF90IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKyAgU3RyaW5nUmVmIGdldFVEU3VmZml4KCkgY29uc3QgeyByZXR1cm4gVURTdWZmaXhCdWY7IH0KKyAgdW5zaWduZWQgZ2V0VURTdWZmaXhPZmZzZXQoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFVRFN1ZmZpeEJ1Zi5lbXB0eSgpICYmICJubyB1ZC1zdWZmaXgiKTsKKyAgICByZXR1cm4gVURTdWZmaXhPZmZzZXQ7CisgIH0KK307CisKKy8vLyBTdHJpbmdMaXRlcmFsUGFyc2VyIC0gVGhpcyBkZWNvZGVzIHN0cmluZyBlc2NhcGUgY2hhcmFjdGVycyBhbmQgcGVyZm9ybXMKKy8vLyB3aWRlIHN0cmluZyBhbmFseXNpcyBhbmQgVHJhbnNsYXRpb24gUGhhc2UgIzYgKGNvbmNhdGVuYXRpb24gb2Ygc3RyaW5nCisvLy8gbGl0ZXJhbHMpIChDOTkgNS4xLjEuMnAxKS4KK2NsYXNzIFN0cmluZ0xpdGVyYWxQYXJzZXIgeworICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTTsKKyAgY29uc3QgTGFuZ09wdGlvbnMgJkZlYXR1cmVzOworICBjb25zdCBUYXJnZXRJbmZvICZUYXJnZXQ7CisgIERpYWdub3N0aWNzRW5naW5lICpEaWFnczsKKyAgCisgIHVuc2lnbmVkIE1heFRva2VuTGVuZ3RoOworICB1bnNpZ25lZCBTaXplQm91bmQ7CisgIHVuc2lnbmVkIENoYXJCeXRlV2lkdGg7CisgIHRvazo6VG9rZW5LaW5kIEtpbmQ7CisgIFNtYWxsU3RyaW5nPDUxMj4gUmVzdWx0QnVmOworICBjaGFyICpSZXN1bHRQdHI7IC8vIGN1cnNvcgorICBTbWFsbFN0cmluZzwzMj4gVURTdWZmaXhCdWY7CisgIHVuc2lnbmVkIFVEU3VmZml4VG9rZW47CisgIHVuc2lnbmVkIFVEU3VmZml4T2Zmc2V0OworcHVibGljOgorICBTdHJpbmdMaXRlcmFsUGFyc2VyKEFycmF5UmVmPFRva2VuPiBTdHJpbmdUb2tzLAorICAgICAgICAgICAgICAgICAgICAgIFByZXByb2Nlc3NvciAmUFAsIGJvb2wgQ29tcGxhaW4gPSB0cnVlKTsKKyAgU3RyaW5nTGl0ZXJhbFBhcnNlcihBcnJheVJlZjxUb2tlbj4gU3RyaW5nVG9rcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZzbSwgY29uc3QgTGFuZ09wdGlvbnMgJmZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluZm8gJnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAqZGlhZ3MgPSBudWxscHRyKQorICAgIDogU00oc20pLCBGZWF0dXJlcyhmZWF0dXJlcyksIFRhcmdldCh0YXJnZXQpLCBEaWFncyhkaWFncyksCisgICAgICBNYXhUb2tlbkxlbmd0aCgwKSwgU2l6ZUJvdW5kKDApLCBDaGFyQnl0ZVdpZHRoKDApLCBLaW5kKHRvazo6dW5rbm93biksCisgICAgICBSZXN1bHRQdHIoUmVzdWx0QnVmLmRhdGEoKSksIGhhZEVycm9yKGZhbHNlKSwgUGFzY2FsKGZhbHNlKSB7CisgICAgaW5pdChTdHJpbmdUb2tzKTsKKyAgfQorICAgIAorCisgIGJvb2wgaGFkRXJyb3I7CisgIGJvb2wgUGFzY2FsOworCisgIFN0cmluZ1JlZiBHZXRTdHJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIFN0cmluZ1JlZihSZXN1bHRCdWYuZGF0YSgpLCBHZXRTdHJpbmdMZW5ndGgoKSk7CisgIH0KKyAgdW5zaWduZWQgR2V0U3RyaW5nTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gUmVzdWx0UHRyLVJlc3VsdEJ1Zi5kYXRhKCk7IH0KKworICB1bnNpZ25lZCBHZXROdW1TdHJpbmdDaGFycygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0U3RyaW5nTGVuZ3RoKCkgLyBDaGFyQnl0ZVdpZHRoOworICB9CisgIC8vLyBnZXRPZmZzZXRPZlN0cmluZ0J5dGUgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUKKyAgLy8vIHNwZWNpZmllZCBieXRlIG9mIHRoZSBzdHJpbmcgZGF0YSByZXByZXNlbnRlZCBieSBUb2tlbi4gIFRoaXMgaGFuZGxlcworICAvLy8gYWR2YW5jaW5nIG92ZXIgZXNjYXBlIHNlcXVlbmNlcyBpbiB0aGUgc3RyaW5nLgorICAvLy8KKyAgLy8vIElmIHRoZSBEaWFnbm9zdGljcyBwb2ludGVyIGlzIG5vbi1udWxsLCB0aGVuIHRoaXMgd2lsbCBkbyBzZW1hbnRpYworICAvLy8gY2hlY2tpbmcgb2YgdGhlIHN0cmluZyBsaXRlcmFsIGFuZCBlbWl0IGVycm9ycyBhbmQgd2FybmluZ3MuCisgIHVuc2lnbmVkIGdldE9mZnNldE9mU3RyaW5nQnl0ZShjb25zdCBUb2tlbiAmVGhlVG9rLCB1bnNpZ25lZCBCeXRlTm8pIGNvbnN0OworCisgIGJvb2wgaXNBc2NpaSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gdG9rOjpzdHJpbmdfbGl0ZXJhbDsgfQorICBib29sIGlzV2lkZSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gdG9rOjp3aWRlX3N0cmluZ19saXRlcmFsOyB9CisgIGJvb2wgaXNVVEY4KCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSB0b2s6OnV0Zjhfc3RyaW5nX2xpdGVyYWw7IH0KKyAgYm9vbCBpc1VURjE2KCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSB0b2s6OnV0ZjE2X3N0cmluZ19saXRlcmFsOyB9CisgIGJvb2wgaXNVVEYzMigpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gdG9rOjp1dGYzMl9zdHJpbmdfbGl0ZXJhbDsgfQorICBib29sIGlzUGFzY2FsKCkgY29uc3QgeyByZXR1cm4gUGFzY2FsOyB9CisKKyAgU3RyaW5nUmVmIGdldFVEU3VmZml4KCkgY29uc3QgeyByZXR1cm4gVURTdWZmaXhCdWY7IH0KKworICAvLy8gR2V0IHRoZSBpbmRleCBvZiBhIHRva2VuIGNvbnRhaW5pbmcgYSB1ZC1zdWZmaXguCisgIHVuc2lnbmVkIGdldFVEU3VmZml4VG9rZW4oKSBjb25zdCB7CisgICAgYXNzZXJ0KCFVRFN1ZmZpeEJ1Zi5lbXB0eSgpICYmICJubyB1ZC1zdWZmaXgiKTsKKyAgICByZXR1cm4gVURTdWZmaXhUb2tlbjsKKyAgfQorICAvLy8gR2V0IHRoZSBzcGVsbGluZyBvZmZzZXQgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHVkLXN1ZmZpeC4KKyAgdW5zaWduZWQgZ2V0VURTdWZmaXhPZmZzZXQoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFVRFN1ZmZpeEJ1Zi5lbXB0eSgpICYmICJubyB1ZC1zdWZmaXgiKTsKKyAgICByZXR1cm4gVURTdWZmaXhPZmZzZXQ7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc1ZhbGlkVURTdWZmaXgoY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLCBTdHJpbmdSZWYgU3VmZml4KTsKKworcHJpdmF0ZToKKyAgdm9pZCBpbml0KEFycmF5UmVmPFRva2VuPiBTdHJpbmdUb2tzKTsKKyAgYm9vbCBDb3B5U3RyaW5nRnJhZ21lbnQoY29uc3QgVG9rZW4gJlRvaywgY29uc3QgY2hhciAqVG9rQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGcmFnbWVudCk7CisgIHZvaWQgRGlhZ25vc2VMZXhpbmdFcnJvcihTb3VyY2VMb2NhdGlvbiBMb2MpOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9NYWNyb0FyZ3MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9NYWNyb0FyZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjAyNTUwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L01hY3JvQXJncy5oCkBAIC0wLDAgKzEsMTQ3IEBACisvLz09PS0tLSBNYWNyb0FyZ3MuaCAtIEZvcm1hbCBhcmd1bWVudCBpbmZvIGZvciBNYWNyb3MgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNYWNyb0FyZ3MgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19MRVhfTUFDUk9BUkdTX0gKKyNkZWZpbmUgTExWTV9DTEFOR19MRVhfTUFDUk9BUkdTX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9MZXgvVG9rZW4uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9UcmFpbGluZ09iamVjdHMuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CisgIGNsYXNzIE1hY3JvSW5mbzsKKyAgY2xhc3MgUHJlcHJvY2Vzc29yOworICBjbGFzcyBTb3VyY2VMb2NhdGlvbjsKKworLy8vIE1hY3JvQXJncyAtIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgY2FwdHVyZXMgaW5mb3JtYXRpb24gYWJvdXQKKy8vLyB0aGUgZm9ybWFsIGFyZ3VtZW50cyBzcGVjaWZpZWQgdG8gYSBmdW5jdGlvbi1saWtlIG1hY3JvIGludm9jYXRpb24uCitjbGFzcyBNYWNyb0FyZ3MgZmluYWwgCisgICAgOiBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxNYWNyb0FyZ3MsIFRva2VuPiB7CisKKyAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKyAgLy8vIE51bVVuZXhwQXJnVG9rZW5zIC0gVGhlIG51bWJlciBvZiByYXcsIHVuZXhwYW5kZWQgdG9rZW5zIGZvciB0aGUKKyAgLy8vIGFyZ3VtZW50cy4gIEFsbCBvZiB0aGUgYWN0dWFsIGFyZ3VtZW50IHRva2VucyBhcmUgYWxsb2NhdGVkIGltbWVkaWF0ZWx5CisgIC8vLyBhZnRlciB0aGUgTWFjcm9BcmdzIG9iamVjdCBpbiBtZW1vcnkuICBUaGlzIGlzIGFsbCBvZiB0aGUgYXJndW1lbnRzCisgIC8vLyBjb25jYXRlbmF0ZWQgdG9nZXRoZXIsIHdpdGggJ0VPRicgbWFya2VycyBhdCB0aGUgZW5kIG9mIGVhY2ggYXJndW1lbnQuCisgIHVuc2lnbmVkIE51bVVuZXhwQXJnVG9rZW5zOworCisgIC8vLyBWYXJhcmdzRWxpZGVkIC0gVHJ1ZSBpZiB0aGlzIGlzIGEgQzk5IHN0eWxlIHZhcmFyZ3MgbWFjcm8gaW52b2NhdGlvbiBhbmQKKyAgLy8vIHRoZXJlIHdhcyBubyBhcmd1bWVudCBzcGVjaWZpZWQgZm9yIHRoZSAiLi4uIiBhcmd1bWVudC4gIElmIHRoZSBhcmd1bWVudAorICAvLy8gd2FzIHNwZWNpZmllZCAoZXZlbiBlbXB0eSkgb3IgdGhpcyBpc24ndCBhIEM5OSBzdHlsZSB2YXJhcmdzIGZ1bmN0aW9uLCBvcgorICAvLy8gaWYgaW4gc3RyaWN0IG1vZGUgYW5kIHRoZSBDOTkgdmFyYXJncyBtYWNybyBoYWQgb25seSBhIC4uLiBhcmd1bWVudCwgdGhpcworICAvLy8gaXMgZmFsc2UuCisgIGJvb2wgVmFyYXJnc0VsaWRlZDsKKyAgCisgIC8vLyBQcmVFeHBBcmdUb2tlbnMgLSBQcmUtZXhwYW5kZWQgdG9rZW5zIGZvciBhcmd1bWVudHMgdGhhdCBuZWVkIHRoZW0uICBFbXB0eQorICAvLy8gaWYgbm90IHlldCBjb21wdXRlZC4gIFRoaXMgaW5jbHVkZXMgdGhlIEVPRiBtYXJrZXIgYXQgdGhlIGVuZCBvZiB0aGUKKyAgLy8vIHN0cmVhbS4KKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8VG9rZW4+ID4gUHJlRXhwQXJnVG9rZW5zOworCisgIC8vLyBTdHJpbmdpZmllZEFyZ3MgLSBUaGlzIGNvbnRhaW5zIGFyZ3VtZW50cyBpbiAnc3RyaW5naWZpZWQnIGZvcm0uICBJZiB0aGUKKyAgLy8vIHN0cmluZ2lmaWVkIGZvcm0gb2YgYW4gYXJndW1lbnQgaGFzIG5vdCB5ZXQgYmVlbiBjb21wdXRlZCwgdGhpcyBpcyBlbXB0eS4KKyAgc3RkOjp2ZWN0b3I8VG9rZW4+IFN0cmluZ2lmaWVkQXJnczsKKworICAvLy8gQXJnQ2FjaGUgLSBUaGlzIGlzIGEgbGlua2VkIGxpc3Qgb2YgTWFjcm9BcmdzIG9iamVjdHMgdGhhdCB0aGUKKyAgLy8vIFByZXByb2Nlc3NvciBvd25zIHdoaWNoIHdlIHVzZSB0byBhdm9pZCB0aHJhc2hpbmcgbWFsbG9jL2ZyZWUuCisgIE1hY3JvQXJncyAqQXJnQ2FjaGU7CisKKyAgLy8vIE1hY3JvQXJncyAtIFRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRoZSBpbnZva2VkIG1hY3JvIGV4cGVjdHMuCisgIHVuc2lnbmVkIE51bU1hY3JvQXJnczsKKworICBNYWNyb0FyZ3ModW5zaWduZWQgTnVtVG9rcywgYm9vbCB2YXJhcmdzRWxpZGVkLCB1bnNpZ25lZCBNYWNyb0FyZ3MpCisgICAgICA6IE51bVVuZXhwQXJnVG9rZW5zKE51bVRva3MpLCBWYXJhcmdzRWxpZGVkKHZhcmFyZ3NFbGlkZWQpLAorICAgICAgICBBcmdDYWNoZShudWxscHRyKSwgTnVtTWFjcm9BcmdzKE1hY3JvQXJncykge30KKyAgfk1hY3JvQXJncygpID0gZGVmYXVsdDsKKworcHVibGljOgorICAvLy8gTWFjcm9BcmdzIGN0b3IgZnVuY3Rpb24gLSBDcmVhdGUgYSBuZXcgTWFjcm9BcmdzIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgLy8vIG1hY3JvIGFuZCBhcmd1bWVudCBpbmZvLgorICBzdGF0aWMgTWFjcm9BcmdzICpjcmVhdGUoY29uc3QgTWFjcm9JbmZvICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFRva2VuPiBVbmV4cEFyZ1Rva2VucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVmFyYXJnc0VsaWRlZCwgUHJlcHJvY2Vzc29yICZQUCk7CisKKyAgLy8vIGRlc3Ryb3kgLSBEZXN0cm95IGFuZCBkZWFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIHRoaXMgb2JqZWN0LgorICAvLy8KKyAgdm9pZCBkZXN0cm95KFByZXByb2Nlc3NvciAmUFApOworCisgIC8vLyBBcmdOZWVkc1ByZWV4cGFuc2lvbiAtIElmIHdlIGNhbiBwcm92ZSB0aGF0IHRoZSBhcmd1bWVudCB3b24ndCBiZSBhZmZlY3RlZAorICAvLy8gYnkgcHJlLWV4cGFuc2lvbiwgcmV0dXJuIGZhbHNlLiAgT3RoZXJ3aXNlLCBjb25zZXJ2YXRpdmVseSByZXR1cm4gdHJ1ZS4KKyAgYm9vbCBBcmdOZWVkc1ByZWV4cGFuc2lvbihjb25zdCBUb2tlbiAqQXJnVG9rLCBQcmVwcm9jZXNzb3IgJlBQKSBjb25zdDsKKworICAvLy8gZ2V0VW5leHBBcmd1bWVudCAtIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHRva2VuIG9mIHRoZSB1bmV4cGFuZGVkCisgIC8vLyB0b2tlbiBsaXN0IGZvciB0aGUgc3BlY2lmaWVkIGZvcm1hbC4KKyAgLy8vCisgIGNvbnN0IFRva2VuICpnZXRVbmV4cEFyZ3VtZW50KHVuc2lnbmVkIEFyZykgY29uc3Q7CisKKyAgLy8vIGdldEFyZ0xlbmd0aCAtIEdpdmVuIGEgcG9pbnRlciB0byBhbiBleHBhbmRlZCBvciB1bmV4cGFuZGVkIGFyZ3VtZW50LAorICAvLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdG9rZW5zLCBub3QgY291bnRpbmcgdGhlIEVPRiwgdGhhdCBtYWtlIHVwIHRoZQorICAvLy8gYXJndW1lbnQuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRBcmdMZW5ndGgoY29uc3QgVG9rZW4gKkFyZ1B0cik7CisKKyAgLy8vIGdldFByZUV4cEFyZ3VtZW50IC0gUmV0dXJuIHRoZSBwcmUtZXhwYW5kZWQgZm9ybSBvZiB0aGUgc3BlY2lmaWVkCisgIC8vLyBhcmd1bWVudC4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VG9rZW4+ICYKKyAgICBnZXRQcmVFeHBBcmd1bWVudCh1bnNpZ25lZCBBcmcsIFByZXByb2Nlc3NvciAmUFApOworCisgIC8vLyBnZXRTdHJpbmdpZmllZEFyZ3VtZW50IC0gQ29tcHV0ZSwgY2FjaGUsIGFuZCByZXR1cm4gdGhlIHNwZWNpZmllZCBhcmd1bWVudAorICAvLy8gdGhhdCBoYXMgYmVlbiAnc3RyaW5naWZpZWQnIGFzIHJlcXVpcmVkIGJ5IHRoZSAjIG9wZXJhdG9yLgorICBjb25zdCBUb2tlbiAmZ2V0U3RyaW5naWZpZWRBcmd1bWVudCh1bnNpZ25lZCBBcmdObywgUHJlcHJvY2Vzc29yICZQUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRXhwYW5zaW9uTG9jU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEV4cGFuc2lvbkxvY0VuZCk7CisKKyAgLy8vIGdldE51bU1hY3JvQXJndW1lbnRzIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRoZSBpbnZva2VkIG1hY3JvCisgIC8vLyBleHBlY3RzLgorICB1bnNpZ25lZCBnZXROdW1NYWNyb0FyZ3VtZW50cygpIGNvbnN0IHsgcmV0dXJuIE51bU1hY3JvQXJnczsgfQorCisgIC8vLyBpc1ZhcmFyZ3NFbGlkZWRVc2UgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgQzk5IHN0eWxlIHZhcmFyZ3MgbWFjcm8KKyAgLy8vIGludm9jYXRpb24gYW5kIHRoZXJlIHdhcyBubyBhcmd1bWVudCBzcGVjaWZpZWQgZm9yIHRoZSAiLi4uIiBhcmd1bWVudC4gIElmCisgIC8vLyB0aGUgYXJndW1lbnQgd2FzIHNwZWNpZmllZCAoZXZlbiBlbXB0eSkgb3IgdGhpcyBpc24ndCBhIEM5OSBzdHlsZSB2YXJhcmdzCisgIC8vLyBmdW5jdGlvbiwgb3IgaWYgaW4gc3RyaWN0IG1vZGUgYW5kIHRoZSBDOTkgdmFyYXJncyBtYWNybyBoYWQgb25seSBhIC4uLgorICAvLy8gYXJndW1lbnQsIHRoaXMgcmV0dXJucyBmYWxzZS4KKyAgYm9vbCBpc1ZhcmFyZ3NFbGlkZWRVc2UoKSBjb25zdCB7IHJldHVybiBWYXJhcmdzRWxpZGVkOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFjcm8gd2FzIGRlZmluZWQgd2l0aCBhIHZhcmlhZGljIChlbGxpcHNpcykgcGFyYW1ldGVyCisgIC8vLyBBTkQgd2FzIGludm9rZWQgd2l0aCBhdCBsZWFzdCBvbmUgdG9rZW4gc3VwcGxpZWQgYXMgYSB2YXJpYWRpYyBhcmd1bWVudC4KKyAgLy8vCisgIC8vLyBcY29kZSAKKyAgLy8vICAgI2RlZmluZSBGKGEpICBhCisgIC8vLyAgICNkZWZpbmUgVihhLCAuLi4pIF9fVkFfT1BUX18oYSkKKyAgLy8vICAgRigpICAgIDwtLSByZXR1cm5zIGZhbHNlIG9uIHRoaXMgaW52b2NhdGlvbi4KKyAgLy8vICAgVigsYSkgIDwtLSByZXR1cm5zIHRydWUgb24gdGhpcyBpbnZvY2F0aW9uLgorICAvLy8gICBWKCwpICAgPC0tIHJldHVybnMgZmFsc2Ugb24gdGhpcyBpbnZvY2F0aW9uLgorICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgCisgIGJvb2wgaW52b2tlZFdpdGhWYXJpYWRpY0FyZ3VtZW50KGNvbnN0IE1hY3JvSW5mbyAqY29uc3QgTUkpIGNvbnN0OworCisgIC8vLyBTdHJpbmdpZnlBcmd1bWVudCAtIEltcGxlbWVudCBDOTkgNi4xMC4zLjJwMiwgY29udmVydGluZyBhIHNlcXVlbmNlIG9mCisgIC8vLyB0b2tlbnMgaW50byB0aGUgbGl0ZXJhbCBzdHJpbmcgdG9rZW4gdGhhdCBzaG91bGQgYmUgcHJvZHVjZWQgYnkgdGhlIEMgIworICAvLy8gcHJlcHJvY2Vzc29yIG9wZXJhdG9yLiAgSWYgQ2hhcmlmeSBpcyB0cnVlLCB0aGVuIGl0IHNob3VsZCBiZSB0dXJuZWQgaW50bworICAvLy8gYSBjaGFyYWN0ZXIgbGl0ZXJhbCBmb3IgdGhlIE1pY3Jvc29mdCBjaGFyaXplICgjQCkgZXh0ZW5zaW9uLgorICAvLy8KKyAgc3RhdGljIFRva2VuIFN0cmluZ2lmeUFyZ3VtZW50KGNvbnN0IFRva2VuICpBcmdUb2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlcHJvY2Vzc29yICZQUCwgYm9vbCBDaGFyaWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRXhwYW5zaW9uTG9jU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFeHBhbnNpb25Mb2NFbmQpOworICAKKyAgCisgIC8vLyBkZWFsbG9jYXRlIC0gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIFByZXByb2Nlc3NvciB3aGVuIG1hbmFnaW5nCisgIC8vLyBpdHMgZnJlZWxpc3QuCisgIE1hY3JvQXJncyAqZGVhbGxvY2F0ZSgpOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9NYWNyb0luZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9NYWNyb0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDI5Mjk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L01hY3JvSW5mby5oCkBAIC0wLDAgKzEsNjEwIEBACisvLz09PS0gTWFjcm9JbmZvLmggLSBJbmZvcm1hdGlvbiBhYm91dCAjZGVmaW5lZCBpZGVudGlmaWVycyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHRoZSBjbGFuZzo6TWFjcm9JbmZvIGFuZCBjbGFuZzo6TWFjcm9EaXJlY3RpdmUgY2xhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfTEVYX01BQ1JPSU5GT19ICisjZGVmaW5lIExMVk1fQ0xBTkdfTEVYX01BQ1JPSU5GT19ICisKKyNpbmNsdWRlICJjbGFuZy9MZXgvVG9rZW4uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBEZWZNYWNyb0RpcmVjdGl2ZTsKK2NsYXNzIElkZW50aWZpZXJJbmZvOworY2xhc3MgTW9kdWxlOworY2xhc3MgUHJlcHJvY2Vzc29yOworY2xhc3MgU291cmNlTWFuYWdlcjsKKworLy8vIFxicmllZiBFbmNhcHN1bGF0ZXMgdGhlIGRhdGEgYWJvdXQgYSBtYWNybyBkZWZpbml0aW9uIChlLmcuIGl0cyB0b2tlbnMpLgorLy8vCisvLy8gVGhlcmUncyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZvciBldmVyeSAjZGVmaW5lLgorY2xhc3MgTWFjcm9JbmZvIHsKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFN0YXRlIHNldCB3aGVuIHRoZSBtYWNybyBpcyBkZWZpbmVkLgorCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIHRoZSBtYWNybyBpcyBkZWZpbmVkLgorICBTb3VyY2VMb2NhdGlvbiBMb2NhdGlvbjsKKworICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCB0b2tlbiBpbiB0aGUgbWFjcm8uCisgIFNvdXJjZUxvY2F0aW9uIEVuZExvY2F0aW9uOworCisgIC8vLyBcYnJpZWYgVGhlIGxpc3Qgb2YgYXJndW1lbnRzIGZvciBhIGZ1bmN0aW9uLWxpa2UgbWFjcm8uCisgIC8vLworICAvLy8gUGFyYW1ldGVyTGlzdCBwb2ludHMgdG8gdGhlIGZpcnN0IG9mIE51bVBhcmFtZXRlcnMgcG9pbnRlcnMuCisgIC8vLworICAvLy8gVGhpcyBjYW4gYmUgZW1wdHksIGZvciwgZS5nLiAiI2RlZmluZSBYKCkiLiAgSW4gYSBDOTktc3R5bGUgdmFyaWFkaWMKKyAgLy8vIG1hY3JvLCB0aGlzIGluY2x1ZGVzIHRoZSBcYyBfX1ZBX0FSR1NfXyBpZGVudGlmaWVyIG9uIHRoZSBsaXN0LgorICBJZGVudGlmaWVySW5mbyAqKlBhcmFtZXRlckxpc3QgPSBudWxscHRyOworCisgIC8vLyBcc2VlIFBhcmFtZXRlckxpc3QKKyAgdW5zaWduZWQgTnVtUGFyYW1ldGVycyA9IDA7CisKKyAgLy8vIFxicmllZiBUaGlzIGlzIHRoZSBsaXN0IG9mIHRva2VucyB0aGF0IHRoZSBtYWNybyBpcyBkZWZpbmVkIHRvLgorICBTbWFsbFZlY3RvcjxUb2tlbiwgOD4gUmVwbGFjZW1lbnRUb2tlbnM7CisKKyAgLy8vIFxicmllZiBMZW5ndGggaW4gY2hhcmFjdGVycyBvZiB0aGUgbWFjcm8gZGVmaW5pdGlvbi4KKyAgbXV0YWJsZSB1bnNpZ25lZCBEZWZpbml0aW9uTGVuZ3RoOworICBtdXRhYmxlIGJvb2wgSXNEZWZpbml0aW9uTGVuZ3RoQ2FjaGVkIDogMTsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBtYWNybyBpcyBmdW5jdGlvbi1saWtlLCBmYWxzZSBpZiBpdCBpcyBvYmplY3QtbGlrZS4KKyAgYm9vbCBJc0Z1bmN0aW9uTGlrZSA6IDE7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgbWFjcm8gaXMgb2YgdGhlIGZvcm0gIiNkZWZpbmUgWCguLi4pIiBvcgorICAvLy8gIiNkZWZpbmUgWChZLFosLi4uKSIuCisgIC8vLworICAvLy8gVGhlIF9fVkFfQVJHU19fIHRva2VuIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSBjb250ZW50cyBvZiAiLi4uIiBpbiBhbgorICAvLy8gaW52b2NhdGlvbi4KKyAgYm9vbCBJc0M5OVZhcmFyZ3MgOiAxOworCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGlzIG1hY3JvIGlzIG9mIHRoZSBmb3JtICIjZGVmaW5lIFgoYS4uLikiLgorICAvLy8KKyAgLy8vIFRoZSAiYSIgaWRlbnRpZmllciBpbiB0aGUgcmVwbGFjZW1lbnQgbGlzdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYWxsCisgIC8vLyBhcmd1bWVudHMgb2YgdGhlIG1hY3JvIHN0YXJ0aW5nIHdpdGggdGhlIHNwZWNpZmllZCBvbmUuCisgIGJvb2wgSXNHTlVWYXJhcmdzIDogMTsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBtYWNybyByZXF1aXJlcyBwcm9jZXNzaW5nIGJlZm9yZSBleHBhbnNpb24uCisgIC8vLworICAvLy8gVGhpcyBpcyB0aGUgY2FzZSBmb3IgYnVpbHRpbiBtYWNyb3Mgc3VjaCBhcyBfX0xJTkVfXywgc28gbG9uZyBhcyB0aGV5IGhhdmUKKyAgLy8vIG5vdCBiZWVuIHJlZGVmaW5lZCwgYnV0IG5vdCBmb3IgcmVndWxhciBwcmVkZWZpbmVkIG1hY3JvcyBmcm9tIHRoZQorICAvLy8gIjxidWlsdC1pbj4iIG1lbW9yeSBidWZmZXIgKHNlZSBQcmVwcm9jZXNzaW5nOjpnZXRQcmVkZWZpbmVzRmlsZUlEKS4KKyAgYm9vbCBJc0J1aWx0aW5NYWNybyA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgbWFjcm8gY29udGFpbnMgdGhlIHNlcXVlbmNlICIsICMjIF9fVkFfQVJHU19fIgorICBib29sIEhhc0NvbW1hUGFzdGluZyA6IDE7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFN0YXRlIHRoYXQgY2hhbmdlcyBhcyB0aGUgbWFjcm8gaXMgdXNlZC4KKworICAvLy8gXGJyaWVmIFRydWUgaWYgd2UgaGF2ZSBzdGFydGVkIGFuIGV4cGFuc2lvbiBvZiB0aGlzIG1hY3JvIGFscmVhZHkuCisgIC8vLworICAvLy8gVGhpcyBkaXNhYmxlcyByZWN1cnNpdmUgZXhwYW5zaW9uLCB3aGljaCB3b3VsZCBiZSBxdWl0ZSBiYWQgZm9yIHRoaW5ncworICAvLy8gbGlrZSBcI2RlZmluZSBBIEEuCisgIGJvb2wgSXNEaXNhYmxlZCA6IDE7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgbWFjcm8gaXMgZWl0aGVyIGRlZmluZWQgaW4gdGhlIG1haW4gZmlsZSBhbmQgaGFzCisgIC8vLyBiZWVuIHVzZWQsIG9yIGlmIGl0IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBtYWluIGZpbGUuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHRvIGVtaXQgLVd1bnVzZWQtbWFjcm9zIGRpYWdub3N0aWNzLgorICBib29sIElzVXNlZCA6IDE7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgbWFjcm8gY2FuIGJlIHJlZGVmaW5lZCB3aXRob3V0IGVtaXR0aW5nIGEgd2FybmluZy4KKyAgYm9vbCBJc0FsbG93UmVkZWZpbml0aW9uc1dpdGhvdXRXYXJuaW5nIDogMTsKKworICAvLy8gXGJyaWVmIE11c3Qgd2FybiBpZiB0aGUgbWFjcm8gaXMgdW51c2VkIGF0IHRoZSBlbmQgb2YgdHJhbnNsYXRpb24gdW5pdC4KKyAgYm9vbCBJc1dhcm5JZlVudXNlZCA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgbWFjcm8gd2FzIHVzZWQgYXMgaGVhZGVyIGd1YXJkLgorICBib29sIFVzZWRGb3JIZWFkZXJHdWFyZCA6IDE7CisKKyAgLy8gT25seSB0aGUgUHJlcHJvY2Vzc29yIGdldHMgdG8gY3JlYXRlIGFuZCBkZXN0cm95IHRoZXNlLgorICBNYWNyb0luZm8oU291cmNlTG9jYXRpb24gRGVmTG9jKTsKKyAgfk1hY3JvSW5mbygpID0gZGVmYXVsdDsKKworcHVibGljOgorICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbG9jYXRpb24gdGhhdCB0aGUgbWFjcm8gd2FzIGRlZmluZWQgYXQuCisgIFNvdXJjZUxvY2F0aW9uIGdldERlZmluaXRpb25Mb2MoKSBjb25zdCB7IHJldHVybiBMb2NhdGlvbjsgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCB0b2tlbiBpbiB0aGUgbWFjcm8uCisgIHZvaWQgc2V0RGVmaW5pdGlvbkVuZExvYyhTb3VyY2VMb2NhdGlvbiBFbmRMb2MpIHsgRW5kTG9jYXRpb24gPSBFbmRMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgdG9rZW4gaW4gdGhlIG1hY3JvLgorICBTb3VyY2VMb2NhdGlvbiBnZXREZWZpbml0aW9uRW5kTG9jKCkgY29uc3QgeyByZXR1cm4gRW5kTG9jYXRpb247IH0KKworICAvLy8gXGJyaWVmIEdldCBsZW5ndGggaW4gY2hhcmFjdGVycyBvZiB0aGUgbWFjcm8gZGVmaW5pdGlvbi4KKyAgdW5zaWduZWQgZ2V0RGVmaW5pdGlvbkxlbmd0aChjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSkgY29uc3QgeworICAgIGlmIChJc0RlZmluaXRpb25MZW5ndGhDYWNoZWQpCisgICAgICByZXR1cm4gRGVmaW5pdGlvbkxlbmd0aDsKKyAgICByZXR1cm4gZ2V0RGVmaW5pdGlvbkxlbmd0aFNsb3coU00pOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG1hY3JvIGRlZmluaXRpb24gaXMgZXF1YWwgdG8KKyAgLy8vIHRoaXMgbWFjcm8gaW4gc3BlbGxpbmcsIGFyZ3VtZW50cywgYW5kIHdoaXRlc3BhY2UuCisgIC8vLworICAvLy8gXHBhcmFtIFN5bnRhY3RpY2FsbHkgaWYgdHJ1ZSwgdGhlIG1hY3JvIGRlZmluaXRpb25zIGNhbiBiZSBpZGVudGljYWwgZXZlbgorICAvLy8gaWYgdGhleSB1c2UgZGlmZmVyZW50IGlkZW50aWZpZXJzIGZvciB0aGUgZnVuY3Rpb24gbWFjcm8gcGFyYW1ldGVycy4KKyAgLy8vIE90aGVyd2lzZSB0aGUgY29tcGFyaXNvbiBpcyBsZXhpY2FsIGFuZCB0aGlzIGltcGxlbWVudHMgdGhlIHJ1bGVzIGluCisgIC8vLyBDOTkgNi4xMC4zLgorICBib29sIGlzSWRlbnRpY2FsVG8oY29uc3QgTWFjcm9JbmZvICZPdGhlciwgUHJlcHJvY2Vzc29yICZQUCwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3ludGFjdGljYWxseSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTZXQgb3IgY2xlYXIgdGhlIGlzQnVpbHRpbk1hY3JvIGZsYWcuCisgIHZvaWQgc2V0SXNCdWlsdGluTWFjcm8oYm9vbCBWYWwgPSB0cnVlKSB7IElzQnVpbHRpbk1hY3JvID0gVmFsOyB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBJc1VzZWQgZmxhZy4KKyAgdm9pZCBzZXRJc1VzZWQoYm9vbCBWYWwpIHsgSXNVc2VkID0gVmFsOyB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBJc0FsbG93UmVkZWZpbml0aW9uc1dpdGhvdXRXYXJuaW5nIGZsYWcuCisgIHZvaWQgc2V0SXNBbGxvd1JlZGVmaW5pdGlvbnNXaXRob3V0V2FybmluZyhib29sIFZhbCkgeworICAgIElzQWxsb3dSZWRlZmluaXRpb25zV2l0aG91dFdhcm5pbmcgPSBWYWw7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgdmFsdWUgb2YgdGhlIElzV2FybklmVW51c2VkIGZsYWcuCisgIHZvaWQgc2V0SXNXYXJuSWZVbnVzZWQoYm9vbCB2YWwpIHsgSXNXYXJuSWZVbnVzZWQgPSB2YWw7IH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgaWRlbnRpZmllcnMgYXMgdGhlIHBhcmFtZXRlciBsaXN0IGZvcgorICAvLy8gdGhpcyBtYWNyby4KKyAgdm9pZCBzZXRQYXJhbWV0ZXJMaXN0KEFycmF5UmVmPElkZW50aWZpZXJJbmZvICo+IExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgJlBQQWxsb2NhdG9yKSB7CisgICAgYXNzZXJ0KFBhcmFtZXRlckxpc3QgPT0gbnVsbHB0ciAmJiBOdW1QYXJhbWV0ZXJzID09IDAgJiYKKyAgICAgICAgICAgIlBhcmFtZXRlciBsaXN0IGFscmVhZHkgc2V0ISIpOworICAgIGlmIChMaXN0LmVtcHR5KCkpCisgICAgICByZXR1cm47CisKKyAgICBOdW1QYXJhbWV0ZXJzID0gTGlzdC5zaXplKCk7CisgICAgUGFyYW1ldGVyTGlzdCA9IFBQQWxsb2NhdG9yLkFsbG9jYXRlPElkZW50aWZpZXJJbmZvICo+KExpc3Quc2l6ZSgpKTsKKyAgICBzdGQ6OmNvcHkoTGlzdC5iZWdpbigpLCBMaXN0LmVuZCgpLCBQYXJhbWV0ZXJMaXN0KTsKKyAgfQorCisgIC8vLyBQYXJhbWV0ZXJzIC0gVGhlIGxpc3Qgb2YgcGFyYW1ldGVycyBmb3IgYSBmdW5jdGlvbi1saWtlIG1hY3JvLiAgVGhpcyBjYW4gCisgIC8vLyBiZSBlbXB0eSwgZm9yLCBlLmcuICIjZGVmaW5lIFgoKSIuCisgIHVzaW5nIHBhcmFtX2l0ZXJhdG9yID0gSWRlbnRpZmllckluZm8gKmNvbnN0ICo7CisgIGJvb2wgcGFyYW1fZW1wdHkoKSBjb25zdCB7IHJldHVybiBOdW1QYXJhbWV0ZXJzID09IDA7IH0KKyAgcGFyYW1faXRlcmF0b3IgcGFyYW1fYmVnaW4oKSBjb25zdCB7IHJldHVybiBQYXJhbWV0ZXJMaXN0OyB9CisgIHBhcmFtX2l0ZXJhdG9yIHBhcmFtX2VuZCgpIGNvbnN0IHsgcmV0dXJuIFBhcmFtZXRlckxpc3QgKyBOdW1QYXJhbWV0ZXJzOyB9CisgIHVuc2lnbmVkIGdldE51bVBhcmFtcygpIGNvbnN0IHsgcmV0dXJuIE51bVBhcmFtZXRlcnM7IH0KKyAgQXJyYXlSZWY8Y29uc3QgSWRlbnRpZmllckluZm8gKj4gcGFyYW1zKCkgY29uc3QgeworICAgIHJldHVybiBBcnJheVJlZjxjb25zdCBJZGVudGlmaWVySW5mbyAqPihQYXJhbWV0ZXJMaXN0LCBOdW1QYXJhbWV0ZXJzKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBwYXJhbWV0ZXIgbnVtYmVyIG9mIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllciwKKyAgLy8vIG9yIC0xIGlmIHRoZSBpZGVudGlmaWVyIGlzIG5vdCBhIGZvcm1hbCBwYXJhbWV0ZXIgaWRlbnRpZmllci4KKyAgaW50IGdldFBhcmFtZXRlck51bShjb25zdCBJZGVudGlmaWVySW5mbyAqQXJnKSBjb25zdCB7CisgICAgZm9yIChwYXJhbV9pdGVyYXRvciBJID0gcGFyYW1fYmVnaW4oKSwgRSA9IHBhcmFtX2VuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGlmICgqSSA9PSBBcmcpCisgICAgICAgIHJldHVybiBJIC0gcGFyYW1fYmVnaW4oKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLy8gRnVuY3Rpb24vT2JqZWN0LWxpa2VuZXNzLiAgS2VlcCB0cmFjayBvZiB3aGV0aGVyIHRoaXMgbWFjcm8gaGFzIGZvcm1hbAorICAvLy8gcGFyYW1ldGVycy4KKyAgdm9pZCBzZXRJc0Z1bmN0aW9uTGlrZSgpIHsgSXNGdW5jdGlvbkxpa2UgPSB0cnVlOyB9CisgIGJvb2wgaXNGdW5jdGlvbkxpa2UoKSBjb25zdCB7IHJldHVybiBJc0Z1bmN0aW9uTGlrZTsgfQorICBib29sIGlzT2JqZWN0TGlrZSgpIGNvbnN0IHsgcmV0dXJuICFJc0Z1bmN0aW9uTGlrZTsgfQorCisgIC8vLyBWYXJhcmdzIHF1ZXJ5aW5nIG1ldGhvZHMuICBUaGlzIGNhbiBvbmx5IGJlIHNldCBmb3IgZnVuY3Rpb24tbGlrZSBtYWNyb3MuCisgIHZvaWQgc2V0SXNDOTlWYXJhcmdzKCkgeyBJc0M5OVZhcmFyZ3MgPSB0cnVlOyB9CisgIHZvaWQgc2V0SXNHTlVWYXJhcmdzKCkgeyBJc0dOVVZhcmFyZ3MgPSB0cnVlOyB9CisgIGJvb2wgaXNDOTlWYXJhcmdzKCkgY29uc3QgeyByZXR1cm4gSXNDOTlWYXJhcmdzOyB9CisgIGJvb2wgaXNHTlVWYXJhcmdzKCkgY29uc3QgeyByZXR1cm4gSXNHTlVWYXJhcmdzOyB9CisgIGJvb2wgaXNWYXJpYWRpYygpIGNvbnN0IHsgcmV0dXJuIElzQzk5VmFyYXJncyB8IElzR05VVmFyYXJnczsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBtYWNybyByZXF1aXJlcyBwcm9jZXNzaW5nIGJlZm9yZSBleHBhbnNpb24uCisgIC8vLworICAvLy8gVGhpcyBpcyB0cnVlIG9ubHkgZm9yIGJ1aWx0aW4gbWFjcm8sIHN1Y2ggYXMgXF9fTElORV9fLCB3aG9zZSB2YWx1ZXMKKyAgLy8vIGFyZSBub3QgZ2l2ZW4gYnkgZml4ZWQgdGV4dHVhbCBleHBhbnNpb25zLiAgUmVndWxhciBwcmVkZWZpbmVkIG1hY3JvcworICAvLy8gZnJvbSB0aGUgIjxidWlsdC1pbj4iIGJ1ZmZlciBhcmUgbm90IHJlcG9ydGVkIGFzIGJ1aWx0aW5zIGJ5IHRoaXMKKyAgLy8vIGZ1bmN0aW9uLgorICBib29sIGlzQnVpbHRpbk1hY3JvKCkgY29uc3QgeyByZXR1cm4gSXNCdWlsdGluTWFjcm87IH0KKworICBib29sIGhhc0NvbW1hUGFzdGluZygpIGNvbnN0IHsgcmV0dXJuIEhhc0NvbW1hUGFzdGluZzsgfQorICB2b2lkIHNldEhhc0NvbW1hUGFzdGluZygpIHsgSGFzQ29tbWFQYXN0aW5nID0gdHJ1ZTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGZhbHNlIGlmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBmaWxlIGFuZCBoYXMKKyAgLy8vIG5vdCB5ZXQgYmVlbiB1c2VkLgorICBib29sIGlzVXNlZCgpIGNvbnN0IHsgcmV0dXJuIElzVXNlZDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBtYWNybyBjYW4gYmUgcmVkZWZpbmVkIHdpdGhvdXQgd2FybmluZy4KKyAgYm9vbCBpc0FsbG93UmVkZWZpbml0aW9uc1dpdGhvdXRXYXJuaW5nKCkgY29uc3QgeworICAgIHJldHVybiBJc0FsbG93UmVkZWZpbml0aW9uc1dpdGhvdXRXYXJuaW5nOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB3ZSBzaG91bGQgZW1pdCBhIHdhcm5pbmcgaWYgdGhlIG1hY3JvIGlzIHVudXNlZC4KKyAgYm9vbCBpc1dhcm5JZlVudXNlZCgpIGNvbnN0IHsgcmV0dXJuIElzV2FybklmVW51c2VkOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiB0b2tlbnMgdGhhdCB0aGlzIG1hY3JvIGV4cGFuZHMgdG8uCisgIHVuc2lnbmVkIGdldE51bVRva2VucygpIGNvbnN0IHsgcmV0dXJuIFJlcGxhY2VtZW50VG9rZW5zLnNpemUoKTsgfQorCisgIGNvbnN0IFRva2VuICZnZXRSZXBsYWNlbWVudFRva2VuKHVuc2lnbmVkIFRvaykgY29uc3QgeworICAgIGFzc2VydChUb2sgPCBSZXBsYWNlbWVudFRva2Vucy5zaXplKCkgJiYgIkludmFsaWQgdG9rZW4gIyIpOworICAgIHJldHVybiBSZXBsYWNlbWVudFRva2Vuc1tUb2tdOworICB9CisKKyAgdXNpbmcgdG9rZW5zX2l0ZXJhdG9yID0gU21hbGxWZWN0b3JJbXBsPFRva2VuPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgdG9rZW5zX2l0ZXJhdG9yIHRva2Vuc19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIFJlcGxhY2VtZW50VG9rZW5zLmJlZ2luKCk7IH0KKyAgdG9rZW5zX2l0ZXJhdG9yIHRva2Vuc19lbmQoKSBjb25zdCB7IHJldHVybiBSZXBsYWNlbWVudFRva2Vucy5lbmQoKTsgfQorICBib29sIHRva2Vuc19lbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFJlcGxhY2VtZW50VG9rZW5zLmVtcHR5KCk7IH0KKyAgQXJyYXlSZWY8VG9rZW4+IHRva2VucygpIGNvbnN0IHsgcmV0dXJuIFJlcGxhY2VtZW50VG9rZW5zOyB9CisKKyAgLy8vIFxicmllZiBBZGQgdGhlIHNwZWNpZmllZCB0b2tlbiB0byB0aGUgcmVwbGFjZW1lbnQgdGV4dCBmb3IgdGhlIG1hY3JvLgorICB2b2lkIEFkZFRva2VuVG9Cb2R5KGNvbnN0IFRva2VuICZUb2spIHsKKyAgICBhc3NlcnQoCisgICAgICAgICFJc0RlZmluaXRpb25MZW5ndGhDYWNoZWQgJiYKKyAgICAgICAgIkNoYW5naW5nIHJlcGxhY2VtZW50IHRva2VucyBhZnRlciBkZWZpbml0aW9uIGxlbmd0aCBnb3QgY2FsY3VsYXRlZCIpOworICAgIFJlcGxhY2VtZW50VG9rZW5zLnB1c2hfYmFjayhUb2spOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG1hY3JvIGlzIGVuYWJsZWQuCisgIC8vLworICAvLy8gSW4gb3RoZXIgd29yZHMsIHRoYXQgd2UgYXJlIG5vdCBjdXJyZW50bHkgaW4gYW4gZXhwYW5zaW9uIG9mIHRoaXMgbWFjcm8uCisgIGJvb2wgaXNFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gIUlzRGlzYWJsZWQ7IH0KKworICB2b2lkIEVuYWJsZU1hY3JvKCkgeworICAgIGFzc2VydChJc0Rpc2FibGVkICYmICJDYW5ub3QgZW5hYmxlIGFuIGFscmVhZHktZW5hYmxlZCBtYWNybyEiKTsKKyAgICBJc0Rpc2FibGVkID0gZmFsc2U7CisgIH0KKworICB2b2lkIERpc2FibGVNYWNybygpIHsKKyAgICBhc3NlcnQoIUlzRGlzYWJsZWQgJiYgIkNhbm5vdCBkaXNhYmxlIGFuIGFscmVhZHktZGlzYWJsZWQgbWFjcm8hIik7CisgICAgSXNEaXNhYmxlZCA9IHRydWU7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgbWFjcm8gd2FzIHVzZWQgZm9yIGEgaGVhZGVyIGd1YXJkLgorICBib29sIGlzVXNlZEZvckhlYWRlckd1YXJkKCkgY29uc3QgeyByZXR1cm4gVXNlZEZvckhlYWRlckd1YXJkOyB9CisKKyAgdm9pZCBzZXRVc2VkRm9ySGVhZGVyR3VhcmQoYm9vbCBWYWwpIHsgVXNlZEZvckhlYWRlckd1YXJkID0gVmFsOyB9CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBQcmVwcm9jZXNzb3I7CisKKyAgdW5zaWduZWQgZ2V0RGVmaW5pdGlvbkxlbmd0aFNsb3coY29uc3QgU291cmNlTWFuYWdlciAmU00pIGNvbnN0OworfTsKKworLy8vIFxicmllZiBFbmNhcHN1bGF0ZXMgY2hhbmdlcyB0byB0aGUgIm1hY3JvcyBuYW1lc3BhY2UiICh0aGUgbG9jYXRpb24gd2hlcmUKKy8vLyB0aGUgbWFjcm8gbmFtZSBiZWNhbWUgYWN0aXZlLCB0aGUgbG9jYXRpb24gd2hlcmUgaXQgd2FzIHVuZGVmaW5lZCwgZXRjLikuCisvLy8KKy8vLyBNYWNyb0RpcmVjdGl2ZXMsIGFzc29jaWF0ZWQgd2l0aCBhbiBpZGVudGlmaWVyLCBhcmUgdXNlZCB0byBtb2RlbCB0aGUgbWFjcm8KKy8vLyBoaXN0b3J5LiBVc3VhbGx5IGEgbWFjcm8gZGVmaW5pdGlvbiAoTWFjcm9JbmZvKSBpcyB3aGVyZSBhIG1hY3JvIG5hbWUKKy8vLyBiZWNvbWVzIGFjdGl2ZSAoTWFjcm9EaXJlY3RpdmUpIGJ1dCAjcHJhZ21hIHB1c2hfbWFjcm8gLyBwb3BfbWFjcm8gY2FuCisvLy8gY3JlYXRlIGFkZGl0aW9uYWwgRGVmTWFjcm9EaXJlY3RpdmVzIGZvciB0aGUgc2FtZSBNYWNyb0luZm8uCitjbGFzcyBNYWNyb0RpcmVjdGl2ZSB7CitwdWJsaWM6CisgIGVudW0gS2luZCB7CisgICAgTURfRGVmaW5lLAorICAgIE1EX1VuZGVmaW5lLAorICAgIE1EX1Zpc2liaWxpdHkKKyAgfTsKKworcHJvdGVjdGVkOgorICAvLy8gXGJyaWVmIFByZXZpb3VzIG1hY3JvIGRpcmVjdGl2ZSBmb3IgdGhlIHNhbWUgaWRlbnRpZmllciwgb3IgbnVsbHB0ci4KKyAgTWFjcm9EaXJlY3RpdmUgKlByZXZpb3VzID0gbnVsbHB0cjsKKworICBTb3VyY2VMb2NhdGlvbiBMb2M7CisKKyAgLy8vIFxicmllZiBNYWNyb0RpcmVjdGl2ZSBraW5kLgorICB1bnNpZ25lZCBNREtpbmQgOiAyOworCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGUgbWFjcm8gZGlyZWN0aXZlIHdhcyBsb2FkZWQgZnJvbSBhIFBDSCBmaWxlLgorICB1bnNpZ25lZCBJc0Zyb21QQ0ggOiAxOworCisgIC8vIFVzZWQgYnkgVmlzaWJpbGl0eU1hY3JvRGlyZWN0aXZlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgbWFjcm8gaGFzIHB1YmxpYyB2aXNpYmlsaXR5ICh3aGVuIGRlc2NyaWJlZCBpbiBhCisgIC8vLyBtb2R1bGUpLgorICB1bnNpZ25lZCBJc1B1YmxpYyA6IDE7CisKKyAgTWFjcm9EaXJlY3RpdmUoS2luZCBLLCBTb3VyY2VMb2NhdGlvbiBMb2MpCisgICAgICA6IExvYyhMb2MpLCBNREtpbmQoSyksIElzRnJvbVBDSChmYWxzZSksIElzUHVibGljKHRydWUpIHt9CisKK3B1YmxpYzoKKyAgS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZChNREtpbmQpOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKworICAvLy8gXGJyaWVmIFNldCBwcmV2aW91cyBkZWZpbml0aW9uIG9mIHRoZSBtYWNybyB3aXRoIHRoZSBzYW1lIG5hbWUuCisgIHZvaWQgc2V0UHJldmlvdXMoTWFjcm9EaXJlY3RpdmUgKlByZXYpIHsgUHJldmlvdXMgPSBQcmV2OyB9CisKKyAgLy8vIFxicmllZiBHZXQgcHJldmlvdXMgZGVmaW5pdGlvbiBvZiB0aGUgbWFjcm8gd2l0aCB0aGUgc2FtZSBuYW1lLgorICBjb25zdCBNYWNyb0RpcmVjdGl2ZSAqZ2V0UHJldmlvdXMoKSBjb25zdCB7IHJldHVybiBQcmV2aW91czsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHByZXZpb3VzIGRlZmluaXRpb24gb2YgdGhlIG1hY3JvIHdpdGggdGhlIHNhbWUgbmFtZS4KKyAgTWFjcm9EaXJlY3RpdmUgKmdldFByZXZpb3VzKCkgeyByZXR1cm4gUHJldmlvdXM7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBtYWNybyBkaXJlY3RpdmUgd2FzIGxvYWRlZCBmcm9tIGEgUENIIGZpbGUuCisgIGJvb2wgaXNGcm9tUENIKCkgY29uc3QgeyByZXR1cm4gSXNGcm9tUENIOyB9CisKKyAgdm9pZCBzZXRJc0Zyb21QQ0goKSB7IElzRnJvbVBDSCA9IHRydWU7IH0KKworICBjbGFzcyBEZWZJbmZvIHsKKyAgICBEZWZNYWNyb0RpcmVjdGl2ZSAqRGVmRGlyZWN0aXZlID0gbnVsbHB0cjsKKyAgICBTb3VyY2VMb2NhdGlvbiBVbmRlZkxvYzsKKyAgICBib29sIElzUHVibGljID0gdHJ1ZTsKKworICBwdWJsaWM6CisgICAgRGVmSW5mbygpID0gZGVmYXVsdDsKKyAgICBEZWZJbmZvKERlZk1hY3JvRGlyZWN0aXZlICpEZWZEaXJlY3RpdmUsIFNvdXJjZUxvY2F0aW9uIFVuZGVmTG9jLAorICAgICAgICAgICAgYm9vbCBpc1B1YmxpYykKKyAgICAgICAgOiBEZWZEaXJlY3RpdmUoRGVmRGlyZWN0aXZlKSwgVW5kZWZMb2MoVW5kZWZMb2MpLCBJc1B1YmxpYyhpc1B1YmxpYykge30KKworICAgIGNvbnN0IERlZk1hY3JvRGlyZWN0aXZlICpnZXREaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBEZWZEaXJlY3RpdmU7IH0KKyAgICBEZWZNYWNyb0RpcmVjdGl2ZSAqZ2V0RGlyZWN0aXZlKCkgeyByZXR1cm4gRGVmRGlyZWN0aXZlOyB9CisKKyAgICBpbmxpbmUgU291cmNlTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdDsKKyAgICBpbmxpbmUgTWFjcm9JbmZvICpnZXRNYWNyb0luZm8oKTsKKworICAgIGNvbnN0IE1hY3JvSW5mbyAqZ2V0TWFjcm9JbmZvKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RGVmSW5mbyAqPih0aGlzKS0+Z2V0TWFjcm9JbmZvKCk7CisgICAgfQorCisgICAgU291cmNlTG9jYXRpb24gZ2V0VW5kZWZMb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIFVuZGVmTG9jOyB9CisgICAgYm9vbCBpc1VuZGVmaW5lZCgpIGNvbnN0IHsgcmV0dXJuIFVuZGVmTG9jLmlzVmFsaWQoKTsgfQorCisgICAgYm9vbCBpc1B1YmxpYygpIGNvbnN0IHsgcmV0dXJuIElzUHVibGljOyB9CisKKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBEZWZEaXJlY3RpdmUgIT0gbnVsbHB0cjsgfQorICAgIGJvb2wgaXNJbnZhbGlkKCkgY29uc3QgeyByZXR1cm4gIWlzVmFsaWQoKTsgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGlzVmFsaWQoKTsgfQorCisgICAgaW5saW5lIERlZkluZm8gZ2V0UHJldmlvdXNEZWZpbml0aW9uKCk7CisKKyAgICBjb25zdCBEZWZJbmZvIGdldFByZXZpb3VzRGVmaW5pdGlvbigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjb25zdF9jYXN0PERlZkluZm8gKj4odGhpcyktPmdldFByZXZpb3VzRGVmaW5pdGlvbigpOworICAgIH0KKyAgfTsKKworICAvLy8gXGJyaWVmIFRyYXZlcnNlcyB0aGUgbWFjcm8gZGlyZWN0aXZlcyBoaXN0b3J5IGFuZCByZXR1cm5zIHRoZSBuZXh0CisgIC8vLyBtYWNybyBkZWZpbml0aW9uIGRpcmVjdGl2ZSBhbG9uZyB3aXRoIGluZm8gYWJvdXQgaXRzIHVuZGVmaW5lZCBsb2NhdGlvbgorICAvLy8gKGlmIHRoZXJlIGlzIG9uZSkgYW5kIGlmIGl0IGlzIHB1YmxpYyBvciBwcml2YXRlLgorICBEZWZJbmZvIGdldERlZmluaXRpb24oKTsKKyAgY29uc3QgRGVmSW5mbyBnZXREZWZpbml0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PE1hY3JvRGlyZWN0aXZlICo+KHRoaXMpLT5nZXREZWZpbml0aW9uKCk7CisgIH0KKworICBib29sIGlzRGVmaW5lZCgpIGNvbnN0IHsKKyAgICBpZiAoY29uc3QgRGVmSW5mbyBEZWYgPSBnZXREZWZpbml0aW9uKCkpCisgICAgICByZXR1cm4gIURlZi5pc1VuZGVmaW5lZCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvbnN0IE1hY3JvSW5mbyAqZ2V0TWFjcm9JbmZvKCkgY29uc3QgeworICAgIHJldHVybiBnZXREZWZpbml0aW9uKCkuZ2V0TWFjcm9JbmZvKCk7CisgIH0KKyAgTWFjcm9JbmZvICpnZXRNYWNyb0luZm8oKSB7IHJldHVybiBnZXREZWZpbml0aW9uKCkuZ2V0TWFjcm9JbmZvKCk7IH0KKworICAvLy8gXGJyaWVmIEZpbmQgbWFjcm8gZGVmaW5pdGlvbiBhY3RpdmUgaW4gdGhlIHNwZWNpZmllZCBzb3VyY2UgbG9jYXRpb24uIElmCisgIC8vLyB0aGlzIG1hY3JvIHdhcyBub3QgZGVmaW5lZCB0aGVyZSwgcmV0dXJuIE5VTEwuCisgIGNvbnN0IERlZkluZm8gZmluZERpcmVjdGl2ZUF0TG9jKFNvdXJjZUxvY2F0aW9uIEwsIFNvdXJjZU1hbmFnZXIgJlNNKSBjb25zdDsKKworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1hY3JvRGlyZWN0aXZlICopIHsgcmV0dXJuIHRydWU7IH0KK307CisKKy8vLyBcYnJpZWYgQSBkaXJlY3RpdmUgZm9yIGEgZGVmaW5lZCBtYWNybyBvciBhIG1hY3JvIGltcG9ydGVkIGZyb20gYSBtb2R1bGUuCitjbGFzcyBEZWZNYWNyb0RpcmVjdGl2ZSA6IHB1YmxpYyBNYWNyb0RpcmVjdGl2ZSB7CisgIE1hY3JvSW5mbyAqSW5mbzsKKworcHVibGljOgorICBEZWZNYWNyb0RpcmVjdGl2ZShNYWNyb0luZm8gKk1JLCBTb3VyY2VMb2NhdGlvbiBMb2MpCisgICAgICA6IE1hY3JvRGlyZWN0aXZlKE1EX0RlZmluZSwgTG9jKSwgSW5mbyhNSSkgeworICAgIGFzc2VydChNSSAmJiAiTWFjcm9JbmZvIGlzIG51bGwiKTsKKyAgfQorICBleHBsaWNpdCBEZWZNYWNyb0RpcmVjdGl2ZShNYWNyb0luZm8gKk1JKQorICAgICAgOiBEZWZNYWNyb0RpcmVjdGl2ZShNSSwgTUktPmdldERlZmluaXRpb25Mb2MoKSkge30KKworICAvLy8gXGJyaWVmIFRoZSBkYXRhIGZvciB0aGUgbWFjcm8gZGVmaW5pdGlvbi4KKyAgY29uc3QgTWFjcm9JbmZvICpnZXRJbmZvKCkgY29uc3QgeyByZXR1cm4gSW5mbzsgfQorICBNYWNyb0luZm8gKmdldEluZm8oKSB7IHJldHVybiBJbmZvOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNYWNyb0RpcmVjdGl2ZSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldEtpbmQoKSA9PSBNRF9EZWZpbmU7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlZk1hY3JvRGlyZWN0aXZlICopIHsgcmV0dXJuIHRydWU7IH0KK307CisKKy8vLyBcYnJpZWYgQSBkaXJlY3RpdmUgZm9yIGFuIHVuZGVmaW5lZCBtYWNyby4KK2NsYXNzIFVuZGVmTWFjcm9EaXJlY3RpdmUgOiBwdWJsaWMgTWFjcm9EaXJlY3RpdmUgeworcHVibGljOgorICBleHBsaWNpdCBVbmRlZk1hY3JvRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFVuZGVmTG9jKQorICAgICAgOiBNYWNyb0RpcmVjdGl2ZShNRF9VbmRlZmluZSwgVW5kZWZMb2MpIHsKKyAgICBhc3NlcnQoVW5kZWZMb2MuaXNWYWxpZCgpICYmICJJbnZhbGlkIFVuZGVmTG9jISIpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNYWNyb0RpcmVjdGl2ZSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldEtpbmQoKSA9PSBNRF9VbmRlZmluZTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVW5kZWZNYWNyb0RpcmVjdGl2ZSAqKSB7IHJldHVybiB0cnVlOyB9Cit9OworCisvLy8gXGJyaWVmIEEgZGlyZWN0aXZlIGZvciBzZXR0aW5nIHRoZSBtb2R1bGUgdmlzaWJpbGl0eSBvZiBhIG1hY3JvLgorY2xhc3MgVmlzaWJpbGl0eU1hY3JvRGlyZWN0aXZlIDogcHVibGljIE1hY3JvRGlyZWN0aXZlIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgVmlzaWJpbGl0eU1hY3JvRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIExvYywgYm9vbCBQdWJsaWMpCisgICAgICA6IE1hY3JvRGlyZWN0aXZlKE1EX1Zpc2liaWxpdHksIExvYykgeworICAgIElzUHVibGljID0gUHVibGljOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIG1hY3JvIGlzIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgb2YgaXRzCisgIC8vLyBtb2R1bGUuCisgIGJvb2wgaXNQdWJsaWMoKSBjb25zdCB7IHJldHVybiBJc1B1YmxpYzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWFjcm9EaXJlY3RpdmUgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRLaW5kKCkgPT0gTURfVmlzaWJpbGl0eTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmlzaWJpbGl0eU1hY3JvRGlyZWN0aXZlICopIHsgcmV0dXJuIHRydWU7IH0KK307CisKK2lubGluZSBTb3VyY2VMb2NhdGlvbiBNYWNyb0RpcmVjdGl2ZTo6RGVmSW5mbzo6Z2V0TG9jYXRpb24oKSBjb25zdCB7CisgIGlmIChpc0ludmFsaWQoKSkKKyAgICByZXR1cm4ge307CisgIHJldHVybiBEZWZEaXJlY3RpdmUtPmdldExvY2F0aW9uKCk7Cit9CisKK2lubGluZSBNYWNyb0luZm8gKk1hY3JvRGlyZWN0aXZlOjpEZWZJbmZvOjpnZXRNYWNyb0luZm8oKSB7CisgIGlmIChpc0ludmFsaWQoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIERlZkRpcmVjdGl2ZS0+Z2V0SW5mbygpOworfQorCitpbmxpbmUgTWFjcm9EaXJlY3RpdmU6OkRlZkluZm8KK01hY3JvRGlyZWN0aXZlOjpEZWZJbmZvOjpnZXRQcmV2aW91c0RlZmluaXRpb24oKSB7CisgIGlmIChpc0ludmFsaWQoKSB8fCBEZWZEaXJlY3RpdmUtPmdldFByZXZpb3VzKCkgPT0gbnVsbHB0cikKKyAgICByZXR1cm4ge307CisgIHJldHVybiBEZWZEaXJlY3RpdmUtPmdldFByZXZpb3VzKCktPmdldERlZmluaXRpb24oKTsKK30KKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgbWFjcm8gZGlyZWN0aXZlIGV4cG9ydGVkIGJ5IGEgbW9kdWxlLgorLy8vCisvLy8gVGhlcmUncyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZvciBldmVyeSBtYWNybyAjZGVmaW5lIG9yICN1bmRlZiB0aGF0IGlzCisvLy8gdGhlIGZpbmFsIGRpcmVjdGl2ZSBmb3IgYSBtYWNybyBuYW1lIHdpdGhpbiBhIG1vZHVsZS4gVGhlc2UgZW50aXRpZXMgYWxzbworLy8vIHJlcHJlc2VudCB0aGUgbWFjcm8gb3ZlcnJpZGUgZ3JhcGguCisvLy8KKy8vLyBUaGVzZSBhcmUgc3RvcmVkIGluIGEgRm9sZGluZ1NldCBpbiB0aGUgcHJlcHJvY2Vzc29yLgorY2xhc3MgTW9kdWxlTWFjcm8gOiBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworICBmcmllbmQgY2xhc3MgUHJlcHJvY2Vzc29yOworCisgIC8vLyBUaGUgbmFtZSBkZWZpbmVkIGJ5IHRoZSBtYWNyby4KKyAgSWRlbnRpZmllckluZm8gKklJOworCisgIC8vLyBUaGUgYm9keSBvZiB0aGUgI2RlZmluZSwgb3IgbnVsbHB0ciBpZiB0aGlzIGlzIGEgI3VuZGVmLgorICBNYWNyb0luZm8gKk1hY3JvOworCisgIC8vLyBUaGUgbW9kdWxlIHRoYXQgZXhwb3J0cyB0aGlzIG1hY3JvLgorICBNb2R1bGUgKk93bmluZ01vZHVsZTsKKworICAvLy8gVGhlIG51bWJlciBvZiBtb2R1bGUgbWFjcm9zIHRoYXQgb3ZlcnJpZGUgdGhpcyBvbmUuCisgIHVuc2lnbmVkIE51bU92ZXJyaWRkZW5CeSA9IDA7CisKKyAgLy8vIFRoZSBudW1iZXIgb2YgbW9kdWxlcyB3aG9zZSBtYWNyb3MgYXJlIGRpcmVjdGx5IG92ZXJyaWRkZW4gYnkgdGhpcyBvbmUuCisgIHVuc2lnbmVkIE51bU92ZXJyaWRlczsKKworICBNb2R1bGVNYWNybyhNb2R1bGUgKk93bmluZ01vZHVsZSwgSWRlbnRpZmllckluZm8gKklJLCBNYWNyb0luZm8gKk1hY3JvLAorICAgICAgICAgICAgICBBcnJheVJlZjxNb2R1bGVNYWNybyAqPiBPdmVycmlkZXMpCisgICAgICA6IElJKElJKSwgTWFjcm8oTWFjcm8pLCBPd25pbmdNb2R1bGUoT3duaW5nTW9kdWxlKSwKKyAgICAgICAgTnVtT3ZlcnJpZGVzKE92ZXJyaWRlcy5zaXplKCkpIHsKKyAgICBzdGQ6OmNvcHkoT3ZlcnJpZGVzLmJlZ2luKCksIE92ZXJyaWRlcy5lbmQoKSwKKyAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNb2R1bGVNYWNybyAqKj4odGhpcyArIDEpKTsKKyAgfQorCitwdWJsaWM6CisgIHN0YXRpYyBNb2R1bGVNYWNybyAqY3JlYXRlKFByZXByb2Nlc3NvciAmUFAsIE1vZHVsZSAqT3duaW5nTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSUksIE1hY3JvSW5mbyAqTWFjcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE1vZHVsZU1hY3JvICo+IE92ZXJyaWRlcyk7CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7CisgICAgcmV0dXJuIFByb2ZpbGUoSUQsIE93bmluZ01vZHVsZSwgSUkpOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgTW9kdWxlICpPd25pbmdNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklJKSB7CisgICAgSUQuQWRkUG9pbnRlcihPd25pbmdNb2R1bGUpOworICAgIElELkFkZFBvaW50ZXIoSUkpOworICB9CisKKyAgLy8vIEdldCB0aGUgbmFtZSBvZiB0aGUgbWFjcm8uCisgIElkZW50aWZpZXJJbmZvICpnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gSUk7IH0KKworICAvLy8gR2V0IHRoZSBJRCBvZiB0aGUgbW9kdWxlIHRoYXQgZXhwb3J0cyB0aGlzIG1hY3JvLgorICBNb2R1bGUgKmdldE93bmluZ01vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIE93bmluZ01vZHVsZTsgfQorCisgIC8vLyBHZXQgZGVmaW5pdGlvbiBmb3IgdGhpcyBleHBvcnRlZCAjZGVmaW5lLCBvciBudWxscHRyIGlmIHRoaXMKKyAgLy8vIHJlcHJlc2VudHMgYSAjdW5kZWYuCisgIE1hY3JvSW5mbyAqZ2V0TWFjcm9JbmZvKCkgY29uc3QgeyByZXR1cm4gTWFjcm87IH0KKworICAvLy8gSXRlcmF0b3JzIG92ZXIgdGhlIG92ZXJyaWRkZW4gbW9kdWxlIElEcy4KKyAgLy8vIFx7CisgIHVzaW5nIG92ZXJyaWRlc19pdGVyYXRvciA9IE1vZHVsZU1hY3JvICpjb25zdCAqOworCisgIG92ZXJyaWRlc19pdGVyYXRvciBvdmVycmlkZXNfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8b3ZlcnJpZGVzX2l0ZXJhdG9yPih0aGlzICsgMSk7CisgIH0KKworICBvdmVycmlkZXNfaXRlcmF0b3Igb3ZlcnJpZGVzX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gb3ZlcnJpZGVzX2JlZ2luKCkgKyBOdW1PdmVycmlkZXM7CisgIH0KKworICBBcnJheVJlZjxNb2R1bGVNYWNybyAqPiBvdmVycmlkZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZihvdmVycmlkZXNfYmVnaW4oKSwgb3ZlcnJpZGVzX2VuZCgpKTsKKyAgfQorICAvLy8gXH0KKworICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgbWFjcm9zIHRoYXQgb3ZlcnJpZGUgdGhpcyBvbmUuCisgIHVuc2lnbmVkIGdldE51bU92ZXJyaWRpbmdNYWNyb3MoKSBjb25zdCB7IHJldHVybiBOdW1PdmVycmlkZGVuQnk7IH0KK307CisKKy8vLyBcYnJpZWYgQSBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudCBkZWZpbml0aW9uIG9mIGEgbWFjcm8uCisvLy8KKy8vLyBUaGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNvbXByaXNlcyBhIHNldCBvZiAoYXQgbGVhc3Qgb25lKSBkZWZpbmluZworLy8vIGVudGl0aWVzLCB3aGljaCBhcmUgZWl0aGVyIGxvY2FsIE1hY3JvRGlyZWN0aXZlcyBvciBpbXBvcnRlZCBNb2R1bGVNYWNyb3MuCitjbGFzcyBNYWNyb0RlZmluaXRpb24geworICBsbHZtOjpQb2ludGVySW50UGFpcjxEZWZNYWNyb0RpcmVjdGl2ZSAqLCAxLCBib29sPiBMYXRlc3RMb2NhbEFuZEFtYmlndW91czsKKyAgQXJyYXlSZWY8TW9kdWxlTWFjcm8gKj4gTW9kdWxlTWFjcm9zOworCitwdWJsaWM6CisgIE1hY3JvRGVmaW5pdGlvbigpID0gZGVmYXVsdDsKKyAgTWFjcm9EZWZpbml0aW9uKERlZk1hY3JvRGlyZWN0aXZlICpNRCwgQXJyYXlSZWY8TW9kdWxlTWFjcm8gKj4gTU1zLAorICAgICAgICAgICAgICAgICAgYm9vbCBJc0FtYmlndW91cykKKyAgICAgIDogTGF0ZXN0TG9jYWxBbmRBbWJpZ3VvdXMoTUQsIElzQW1iaWd1b3VzKSwgTW9kdWxlTWFjcm9zKE1Ncykge30KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZXJlIGlzIGEgZGVmaW5pdGlvbiBvZiB0aGlzIG1hY3JvLgorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgIHJldHVybiBnZXRMb2NhbERpcmVjdGl2ZSgpIHx8ICFNb2R1bGVNYWNyb3MuZW1wdHkoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBNYWNyb0luZm8gdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyBkZWZpbml0aW9uLgorICBNYWNyb0luZm8gKmdldE1hY3JvSW5mbygpIGNvbnN0IHsKKyAgICBpZiAoIU1vZHVsZU1hY3Jvcy5lbXB0eSgpKQorICAgICAgcmV0dXJuIE1vZHVsZU1hY3Jvcy5iYWNrKCktPmdldE1hY3JvSW5mbygpOworICAgIGlmIChhdXRvICpNRCA9IGdldExvY2FsRGlyZWN0aXZlKCkpCisgICAgICByZXR1cm4gTUQtPmdldE1hY3JvSW5mbygpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFxicmllZiBcYyB0cnVlIGlmIHRoZSBkZWZpbml0aW9uIGlzIGFtYmlndW91cywgXGMgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGlzQW1iaWd1b3VzKCkgY29uc3QgeyByZXR1cm4gTGF0ZXN0TG9jYWxBbmRBbWJpZ3VvdXMuZ2V0SW50KCk7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbGF0ZXN0IG5vbi1pbXBvcnRlZCwgbm9uLVwjdW5kZWYnZCBtYWNybyBkZWZpbml0aW9uCisgIC8vLyBmb3IgdGhpcyBtYWNyby4KKyAgRGVmTWFjcm9EaXJlY3RpdmUgKmdldExvY2FsRGlyZWN0aXZlKCkgY29uc3QgeworICAgIHJldHVybiBMYXRlc3RMb2NhbEFuZEFtYmlndW91cy5nZXRQb2ludGVyKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgYWN0aXZlIG1vZHVsZSBtYWNyb3MgZm9yIHRoaXMgbWFjcm8uCisgIEFycmF5UmVmPE1vZHVsZU1hY3JvICo+IGdldE1vZHVsZU1hY3JvcygpIGNvbnN0IHsgcmV0dXJuIE1vZHVsZU1hY3JvczsgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGbj4gdm9pZCBmb3JBbGxEZWZpbml0aW9ucyhGbiBGKSBjb25zdCB7CisgICAgaWYgKGF1dG8gKk1EID0gZ2V0TG9jYWxEaXJlY3RpdmUoKSkKKyAgICAgIEYoTUQtPmdldE1hY3JvSW5mbygpKTsKKyAgICBmb3IgKGF1dG8gKk1NIDogZ2V0TW9kdWxlTWFjcm9zKCkpCisgICAgICBGKE1NLT5nZXRNYWNyb0luZm8oKSk7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0xFWF9NQUNST0lORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L01vZHVsZUxvYWRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L01vZHVsZUxvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZWE1ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvTW9kdWxlTG9hZGVyLmgKQEAgLTAsMCArMSwxODMgQEAKKy8vPT09LSBNb2R1bGVMb2FkZXIuaCAtIE1vZHVsZSBMb2FkZXIgSW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNb2R1bGVMb2FkZXIgaW50ZXJmYWNlLCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgCisvLyAgbG9hZGluZyBuYW1lZCBtb2R1bGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19MRVhfTU9EVUxFTE9BREVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19MRVhfTU9EVUxFTE9BREVSX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Nb2R1bGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBHbG9iYWxNb2R1bGVJbmRleDsKK2NsYXNzIElkZW50aWZpZXJJbmZvOworCisvLy8gXGJyaWVmIEEgc2VxdWVuY2Ugb2YgaWRlbnRpZmllci9sb2NhdGlvbiBwYWlycyB1c2VkIHRvIGRlc2NyaWJlIGEgcGFydGljdWxhcgorLy8vIG1vZHVsZSBvciBzdWJtb2R1bGUsIGUuZy4sIHN0ZC52ZWN0b3IuCit1c2luZyBNb2R1bGVJZFBhdGggPSBBcnJheVJlZjxzdGQ6OnBhaXI8SWRlbnRpZmllckluZm8gKiwgU291cmNlTG9jYXRpb24+PjsKKworLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIHJlc3VsdCBvZiBhdHRlbXB0aW5nIHRvIGxvYWQgYSBtb2R1bGUuCitjbGFzcyBNb2R1bGVMb2FkUmVzdWx0IHsKK3B1YmxpYzoKKyAgZW51bSBMb2FkUmVzdWx0S2luZCB7CisgICAgLy8gV2UgZWl0aGVyIHN1Y2NlZWRlZCBvciBmYWlsZWQgdG8gbG9hZCB0aGUgbmFtZWQgbW9kdWxlLgorICAgIE5vcm1hbCwKKworICAgIC8vIFRoZSBtb2R1bGUgZXhpc3RzLCBidXQgZG9lcyBub3QgYWN0dWFsbHkgY29udGFpbiB0aGUgbmFtZWQgc3VibW9kdWxlLgorICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSBuYW1lZCBzdWJtb2R1bGUgd2FzIGluZmVycmVkIGZyb20gYW4KKyAgICAvLyB1bWJyZWxsYSBkaXJlY3RvcnksIGJ1dCBub3QgYWN0dWFsbHkgcGFydCBvZiB0aGUgdW1icmVsbGEgaGVhZGVyLgorICAgIE1pc3NpbmdFeHBlY3RlZCwKKworICAgIC8vIFRoZSBtb2R1bGUgZXhpc3RzIGJ1dCBjYW5ub3QgYmUgaW1wb3J0ZWQgZHVlIHRvIGEgY29uZmlndXJhdGlvbiBtaXNtYXRjaC4KKyAgICBDb25maWdNaXNtYXRjaAorICB9OworICBsbHZtOjpQb2ludGVySW50UGFpcjxNb2R1bGUgKiwgMiwgTG9hZFJlc3VsdEtpbmQ+IFN0b3JhZ2U7CisKKyAgTW9kdWxlTG9hZFJlc3VsdCgpID0gZGVmYXVsdDsKKyAgTW9kdWxlTG9hZFJlc3VsdChNb2R1bGUgKk0pIDogU3RvcmFnZShNLCBOb3JtYWwpIHt9CisgIE1vZHVsZUxvYWRSZXN1bHQoTG9hZFJlc3VsdEtpbmQgS2luZCkgOiBTdG9yYWdlKG51bGxwdHIsIEtpbmQpIHt9CisKKyAgb3BlcmF0b3IgTW9kdWxlICooKSBjb25zdCB7IHJldHVybiBTdG9yYWdlLmdldFBvaW50ZXIoKTsgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBtb2R1bGUsIHdoaWNoIGZhaWxlZCB0byBsb2FkLCB3YXMKKyAgLy8vIGFjdHVhbGx5IGEgc3VibW9kdWxlIHRoYXQgd2UgZXhwZWN0ZWQgdG8gc2VlIChiYXNlZCBvbiBpbXBseWluZyB0aGUKKyAgLy8vIHN1Ym1vZHVsZSBmcm9tIGhlYWRlciBzdHJ1Y3R1cmUpLCBidXQgZGlkbid0IG1hdGVyaWFsaXplIGluIHRoZSBhY3R1YWwKKyAgLy8vIG1vZHVsZS4KKyAgYm9vbCBpc01pc3NpbmdFeHBlY3RlZCgpIGNvbnN0IHsgcmV0dXJuIFN0b3JhZ2UuZ2V0SW50KCkgPT0gTWlzc2luZ0V4cGVjdGVkOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG1vZHVsZSBmYWlsZWQgdG8gbG9hZCBkdWUgdG8gYSBjb25maWd1cmF0aW9uCisgIC8vLyBtaXNtYXRjaCB3aXRoIGFuIGV4cGxpY2l0bHktbmFtZWQgLnBjbSBmaWxlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKyAgYm9vbCBpc0NvbmZpZ01pc21hdGNoKCkgY29uc3QgeyByZXR1cm4gU3RvcmFnZS5nZXRJbnQoKSA9PSBDb25maWdNaXNtYXRjaDsgfQorfTsKKworLy8vIFxicmllZiBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIGEgbW9kdWxlIGxvYWRlci4KKy8vLworLy8vIFRoaXMgYWJzdHJhY3QgaW50ZXJmYWNlIGRlc2NyaWJlcyBhIG1vZHVsZSBsb2FkZXIsIHdoaWNoIGlzIHJlc3BvbnNpYmxlCisvLy8gZm9yIHJlc29sdmluZyBhIG1vZHVsZSBuYW1lIChlLmcuLCAic3RkIikgdG8gYW4gYWN0dWFsIG1vZHVsZSBmaWxlLCBhbmQKKy8vLyB0aGVuIGxvYWRpbmcgdGhhdCBtb2R1bGUuCitjbGFzcyBNb2R1bGVMb2FkZXIgeworICAvLyBCdWlsZGluZyBhIG1vZHVsZSBpZiB0cnVlLgorICBib29sIEJ1aWxkaW5nTW9kdWxlOworCitwdWJsaWM6CisgIGV4cGxpY2l0IE1vZHVsZUxvYWRlcihib29sIEJ1aWxkaW5nTW9kdWxlID0gZmFsc2UpCisgICAgICA6IEJ1aWxkaW5nTW9kdWxlKEJ1aWxkaW5nTW9kdWxlKSB7fQorCisgIHZpcnR1YWwgfk1vZHVsZUxvYWRlcigpOworICAKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnN0YW5jZSBpcyBidWlsZGluZyBhIG1vZHVsZS4KKyAgYm9vbCBidWlsZGluZ01vZHVsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQnVpbGRpbmdNb2R1bGU7CisgIH0KKworICAvLy8gXGJyaWVmIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgaW5zdGFuY2UgaXMgYnVpbGRpbmcgYSBtb2R1bGUuCisgIHZvaWQgc2V0QnVpbGRpbmdNb2R1bGUoYm9vbCBCdWlsZGluZ01vZHVsZUZsYWcpIHsKKyAgICBCdWlsZGluZ01vZHVsZSA9IEJ1aWxkaW5nTW9kdWxlRmxhZzsKKyAgfQorIAorICAvLy8gXGJyaWVmIEF0dGVtcHQgdG8gbG9hZCB0aGUgZ2l2ZW4gbW9kdWxlLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBhdHRlbXB0cyB0byBsb2FkIHRoZSBtb2R1bGUgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiAKKyAgLy8vIHBhcmFtZXRlcnMuCisgIC8vLworICAvLy8gXHBhcmFtIEltcG9ydExvYyBUaGUgbG9jYXRpb24gb2YgdGhlICdpbXBvcnQnIGtleXdvcmQuCisgIC8vLworICAvLy8gXHBhcmFtIFBhdGggVGhlIGlkZW50aWZpZXJzIChhbmQgdGhlaXIgbG9jYXRpb25zKSBvZiB0aGUgbW9kdWxlCisgIC8vLyAicGF0aCIsIGUuZy4sICJzdGQudmVjdG9yIiB3b3VsZCBiZSBzcGxpdCBpbnRvICJzdGQiIGFuZCAidmVjdG9yIi4KKyAgLy8vIAorICAvLy8gXHBhcmFtIFZpc2liaWxpdHkgVGhlIHZpc2liaWxpdHkgcHJvdmlkZWQgZm9yIHRoZSBuYW1lcyBpbiB0aGUgbG9hZGVkCisgIC8vLyBtb2R1bGUuCisgIC8vLworICAvLy8gXHBhcmFtIElzSW5jbHVzaW9uRGlyZWN0aXZlIEluZGljYXRlcyB0aGF0IHRoaXMgbW9kdWxlIGlzIGJlaW5nIGxvYWRlZAorICAvLy8gaW1wbGljaXRseSwgZHVlIHRvIHRoZSBwcmVzZW5jZSBvZiBhbiBpbmNsdXNpb24gZGlyZWN0aXZlLiBPdGhlcndpc2UsCisgIC8vLyBpdCBpcyBiZWluZyBsb2FkZWQgZHVlIHRvIGFuIGltcG9ydCBkZWNsYXJhdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBJZiBzdWNjZXNzZnVsLCByZXR1cm5zIHRoZSBsb2FkZWQgbW9kdWxlLiBPdGhlcndpc2UsIHJldHVybnMgCisgIC8vLyBOVUxMIHRvIGluZGljYXRlIHRoYXQgdGhlIG1vZHVsZSBjb3VsZCBub3QgYmUgbG9hZGVkLgorICB2aXJ0dWFsIE1vZHVsZUxvYWRSZXN1bHQgbG9hZE1vZHVsZShTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUlkUGF0aCBQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGU6Ok5hbWVWaXNpYmlsaXR5S2luZCBWaXNpYmlsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzSW5jbHVzaW9uRGlyZWN0aXZlKSA9IDA7CisKKyAgLy8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgZ2l2ZW4gbW9kdWxlIGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgYnVmZmVyLiBEb2VzCisgIC8vLyBub3QgbWFrZSBhbnkgc3VibW9kdWxlIHZpc2libGU7IGZvciB0aGF0LCB1c2UgbG9hZE1vZHVsZSBvcgorICAvLy8gbWFrZU1vZHVsZVZpc2libGUuCisgIC8vLworICAvLy8gXHBhcmFtIExvYyBUaGUgbG9jYXRpb24gYXQgd2hpY2ggdGhlIG1vZHVsZSB3YXMgbG9hZGVkLgorICAvLy8gXHBhcmFtIE1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBidWlsZC4KKyAgLy8vIFxwYXJhbSBTb3VyY2UgVGhlIHNvdXJjZSBvZiB0aGUgbW9kdWxlOiBhIChwcmVwcm9jZXNzZWQpIG1vZHVsZSBtYXAuCisgIHZpcnR1YWwgdm9pZCBsb2FkTW9kdWxlRnJvbVNvdXJjZShTb3VyY2VMb2NhdGlvbiBMb2MsIFN0cmluZ1JlZiBNb2R1bGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNvdXJjZSkgPSAwOworCisgIC8vLyBcYnJpZWYgTWFrZSB0aGUgZ2l2ZW4gbW9kdWxlIHZpc2libGUuCisgIHZpcnR1YWwgdm9pZCBtYWtlTW9kdWxlVmlzaWJsZShNb2R1bGUgKk1vZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZTo6TmFtZVZpc2liaWxpdHlLaW5kIFZpc2liaWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MpID0gMDsKKworICAvLy8gXGJyaWVmIExvYWQsIGNyZWF0ZSwgb3IgcmV0dXJuIGdsb2JhbCBtb2R1bGUuCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXhpc3RpbmcgZ2xvYmFsIG1vZHVsZSBpbmRleCwgaWYgb25lCisgIC8vLyBoYWQgYWxyZWFkeSBiZWVuIGxvYWRlZCBvciBjcmVhdGVkLCBvciBsb2FkcyBvbmUgaWYgaXQKKyAgLy8vIGV4aXN0cywgb3IgY3JlYXRlcyBvbmUgaWYgaXQgZG9lc24ndCBleGlzdC4KKyAgLy8vIEFsc28sIGltcG9ydGFudGx5LCBpZiB0aGUgaW5kZXggZG9lc24ndCBjb3ZlciBhbGwgdGhlIG1vZHVsZXMKKyAgLy8vIGluIHRoZSBtb2R1bGUgbWFwLCBpdCB3aWxsIGJlIHVwZGF0ZSB0byBkbyBzbyBoZXJlLCBiZWNhdXNlCisgIC8vLyBvZiBpdHMgdXNlIGluIHNlYXJjaGluZyBmb3IgbmVlZGVkIG1vZHVsZSBpbXBvcnRzIGFuZAorICAvLy8gYXNzb2NpYXRlZCBmaXhpdCBtZXNzYWdlcy4KKyAgLy8vIFxwYXJhbSBUcmlnZ2VyTG9jIFRoZSBsb2NhdGlvbiBmb3Igd2hhdCB0cmlnZ2VyZWQgdGhlIGxvYWQuCisgIC8vLyBccmV0dXJucyBSZXR1cm5zIG51bGwgaWYgbG9hZCBmYWlsZWQuCisgIHZpcnR1YWwgR2xvYmFsTW9kdWxlSW5kZXggKmxvYWRHbG9iYWxNb2R1bGVJbmRleCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRyaWdnZXJMb2MpID0gMDsKKworICAvLy8gQ2hlY2sgZ2xvYmFsIG1vZHVsZSBpbmRleCBmb3IgbWlzc2luZyBpbXBvcnRzLgorICAvLy8gXHBhcmFtIE5hbWUgVGhlIHN5bWJvbCBuYW1lIHRvIGxvb2sgZm9yLgorICAvLy8gXHBhcmFtIFRyaWdnZXJMb2MgVGhlIGxvY2F0aW9uIGZvciB3aGF0IHRyaWdnZXJlZCB0aGUgbG9hZC4KKyAgLy8vIFxyZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiBhbnkgbW9kdWxlcyB3aXRoIHRoYXQgc3ltYm9sIGZvdW5kLgorICB2aXJ0dWFsIGJvb2wgbG9va3VwTWlzc2luZ0ltcG9ydHMoU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUcmlnZ2VyTG9jKSA9IDA7CisKKyAgYm9vbCBIYWRGYXRhbEZhaWx1cmUgPSBmYWxzZTsKK307CisKKy8vLyBBIG1vZHVsZSBsb2FkZXIgdGhhdCBkb2Vzbid0IGtub3cgaG93IHRvIGxvYWQgbW9kdWxlcy4KK2NsYXNzIFRyaXZpYWxNb2R1bGVMb2FkZXIgOiBwdWJsaWMgTW9kdWxlTG9hZGVyIHsKK3B1YmxpYzoKKyAgTW9kdWxlTG9hZFJlc3VsdCBsb2FkTW9kdWxlKFNvdXJjZUxvY2F0aW9uIEltcG9ydExvYywgTW9kdWxlSWRQYXRoIFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGU6Ok5hbWVWaXNpYmlsaXR5S2luZCBWaXNpYmlsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0luY2x1c2lvbkRpcmVjdGl2ZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiB7fTsKKyAgfQorCisgIHZvaWQgbG9hZE1vZHVsZUZyb21Tb3VyY2UoU291cmNlTG9jYXRpb24gSW1wb3J0TG9jLCBTdHJpbmdSZWYgTW9kdWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU291cmNlKSBvdmVycmlkZSB7fQorCisgIHZvaWQgbWFrZU1vZHVsZVZpc2libGUoTW9kdWxlICpNb2QsIE1vZHVsZTo6TmFtZVZpc2liaWxpdHlLaW5kIFZpc2liaWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSW1wb3J0TG9jKSBvdmVycmlkZSB7fQorCisgIEdsb2JhbE1vZHVsZUluZGV4ICpsb2FkR2xvYmFsTW9kdWxlSW5kZXgoU291cmNlTG9jYXRpb24gVHJpZ2dlckxvYykgb3ZlcnJpZGUgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgYm9vbCBsb29rdXBNaXNzaW5nSW1wb3J0cyhTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUcmlnZ2VyTG9jKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworICAKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0xFWF9NT0RVTEVMT0FERVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L01vZHVsZU1hcC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L01vZHVsZU1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Y2EzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvTW9kdWxlTWFwLmgKQEAgLTAsMCArMSw2NTYgQEAKKy8vPT09LSBNb2R1bGVNYXAuaCAtIERlc2NyaWJlIHRoZSBsYXlvdXQgb2YgbW9kdWxlcyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIE1vZHVsZU1hcCBpbnRlcmZhY2UsIHdoaWNoIGRlc2NyaWJlcyB0aGUgbGF5b3V0IG9mIGEKKy8vIG1vZHVsZSBhcyBpdCByZWxhdGVzIHRvIGhlYWRlcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0xFWF9NT0RVTEVNQVBfSAorI2RlZmluZSBMTFZNX0NMQU5HX0xFWF9NT0RVTEVNQVBfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Nb2R1bGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UaW55UHRyVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIERpYWdub3N0aWNzRW5naW5lOworY2xhc3MgRGlyZWN0b3J5RW50cnk7CitjbGFzcyBGaWxlRW50cnk7CitjbGFzcyBGaWxlTWFuYWdlcjsKK2NsYXNzIEhlYWRlclNlYXJjaDsKK2NsYXNzIFNvdXJjZU1hbmFnZXI7CisKKy8vLyBcYnJpZWYgQSBtZWNoYW5pc20gdG8gb2JzZXJ2ZSB0aGUgYWN0aW9ucyBvZiB0aGUgbW9kdWxlIG1hcCBwYXJzZXIgYXMgaXQKKy8vLyByZWFkcyBtb2R1bGUgbWFwIGZpbGVzLgorY2xhc3MgTW9kdWxlTWFwQ2FsbGJhY2tzIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+TW9kdWxlTWFwQ2FsbGJhY2tzKCkgPSBkZWZhdWx0OworCisgIC8vLyBcYnJpZWYgQ2FsbGVkIHdoZW4gYSBtb2R1bGUgbWFwIGZpbGUgaGFzIGJlZW4gcmVhZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRmlsZVN0YXJ0IEEgU291cmNlTG9jYXRpb24gcmVmZXJyaW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgZmlsZSdzCisgIC8vLyBjb250ZW50cy4KKyAgLy8vIFxwYXJhbSBGaWxlIFRoZSBmaWxlIGl0c2VsZi4KKyAgLy8vIFxwYXJhbSBJc1N5c3RlbSBXaGV0aGVyIHRoaXMgaXMgYSBtb2R1bGUgbWFwIGZyb20gYSBzeXN0ZW0gaW5jbHVkZSBwYXRoLgorICB2aXJ0dWFsIHZvaWQgbW9kdWxlTWFwRmlsZVJlYWQoU291cmNlTG9jYXRpb24gRmlsZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZUVudHJ5ICZGaWxlLCBib29sIElzU3lzdGVtKSB7fQorCisgIC8vLyBcYnJpZWYgQ2FsbGVkIHdoZW4gYSBoZWFkZXIgaXMgYWRkZWQgZHVyaW5nIG1vZHVsZSBtYXAgcGFyc2luZy4KKyAgLy8vCisgIC8vLyBccGFyYW0gRmlsZW5hbWUgVGhlIGhlYWRlciBmaWxlIGl0c2VsZi4KKyAgdmlydHVhbCB2b2lkIG1vZHVsZU1hcEFkZEhlYWRlcihTdHJpbmdSZWYgRmlsZW5hbWUpIHt9CisKKyAgLy8vIFxicmllZiBDYWxsZWQgd2hlbiBhbiB1bWJyZWxsYSBoZWFkZXIgaXMgYWRkZWQgZHVyaW5nIG1vZHVsZSBtYXAgcGFyc2luZy4KKyAgLy8vCisgIC8vLyBccGFyYW0gRmlsZU1nciBGaWxlTWFuYWdlciBpbnN0YW5jZQorICAvLy8gXHBhcmFtIEhlYWRlciBUaGUgdW1icmVsbGEgaGVhZGVyIHRvIGNvbGxlY3QuCisgIHZpcnR1YWwgdm9pZCBtb2R1bGVNYXBBZGRVbWJyZWxsYUhlYWRlcihGaWxlTWFuYWdlciAqRmlsZU1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVFbnRyeSAqSGVhZGVyKSB7fQorfTsKKyAgCitjbGFzcyBNb2R1bGVNYXAgeworICBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3I7CisgIERpYWdub3N0aWNzRW5naW5lICZEaWFnczsKKyAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzOworICBjb25zdCBUYXJnZXRJbmZvICpUYXJnZXQ7CisgIEhlYWRlclNlYXJjaCAmSGVhZGVySW5mbzsKKworICBsbHZtOjpTbWFsbFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlTWFwQ2FsbGJhY2tzPiwgMT4gQ2FsbGJhY2tzOworICAKKyAgLy8vIFxicmllZiBUaGUgZGlyZWN0b3J5IHVzZWQgZm9yIENsYW5nLXN1cHBsaWVkLCBidWlsdGluIGluY2x1ZGUgaGVhZGVycywKKyAgLy8vIHN1Y2ggYXMgInN0ZGludC5oIi4KKyAgY29uc3QgRGlyZWN0b3J5RW50cnkgKkJ1aWx0aW5JbmNsdWRlRGlyID0gbnVsbHB0cjsKKyAgCisgIC8vLyBcYnJpZWYgTGFuZ3VhZ2Ugb3B0aW9ucyB1c2VkIHRvIHBhcnNlIHRoZSBtb2R1bGUgbWFwIGl0c2VsZi4KKyAgLy8vCisgIC8vLyBUaGVzZSBhcmUgYWx3YXlzIHNpbXBsZSBDIGxhbmd1YWdlIG9wdGlvbnMuCisgIExhbmdPcHRpb25zIE1NYXBMYW5nT3B0czsKKworICAvLy8gVGhlIG1vZHVsZSB0aGF0IHRoZSBtYWluIHNvdXJjZSBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCAodGhlIG1vZHVsZQorICAvLy8gbmFtZWQgTGFuZ09wdHM6OkN1cnJlbnRNb2R1bGUsIGlmIHdlJ3ZlIGxvYWRlZCBpdCkuCisgIE1vZHVsZSAqU291cmNlTW9kdWxlID0gbnVsbHB0cjsKKworICAvLy8gVGhlIGdsb2JhbCBtb2R1bGUgZm9yIHRoZSBjdXJyZW50IFRVLCBpZiB3ZSBzdGlsbCBvd24gaXQuIChPd25lcnNoaXAgaXMKKyAgLy8vIHRyYW5zZmVycmVkIGlmL3doZW4gd2UgY3JlYXRlIGFuIGVuY2xvc2luZyBtb2R1bGUuCisgIHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IFBlbmRpbmdHbG9iYWxNb2R1bGU7CisKKyAgLy8vIFxicmllZiBUaGUgdG9wLWxldmVsIG1vZHVsZXMgdGhhdCBhcmUga25vd24uCisgIGxsdm06OlN0cmluZ01hcDxNb2R1bGUgKj4gTW9kdWxlczsKKworICAvLy8gU2hhZG93IG1vZHVsZXMgY3JlYXRlZCB3aGlsZSBidWlsZGluZyB0aGlzIG1vZHVsZSBtYXAuCisgIGxsdm06OlNtYWxsVmVjdG9yPE1vZHVsZSosIDI+IFNoYWRvd01vZHVsZXM7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIG1vZHVsZXMgd2UgaGF2ZSBjcmVhdGVkIGluIHRvdGFsLgorICB1bnNpZ25lZCBOdW1DcmVhdGVkTW9kdWxlcyA9IDA7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBGbGFncyBkZXNjcmliaW5nIHRoZSByb2xlIG9mIGEgbW9kdWxlIGhlYWRlci4KKyAgZW51bSBNb2R1bGVIZWFkZXJSb2xlIHsKKyAgICAvLy8gXGJyaWVmIFRoaXMgaGVhZGVyIGlzIG5vcm1hbGx5IGluY2x1ZGVkIGluIHRoZSBtb2R1bGUuCisgICAgTm9ybWFsSGVhZGVyICA9IDB4MCwKKworICAgIC8vLyBcYnJpZWYgVGhpcyBoZWFkZXIgaXMgaW5jbHVkZWQgYnV0IHByaXZhdGUuCisgICAgUHJpdmF0ZUhlYWRlciA9IDB4MSwKKworICAgIC8vLyBcYnJpZWYgVGhpcyBoZWFkZXIgaXMgcGFydCBvZiB0aGUgbW9kdWxlIChmb3IgbGF5ZXJpbmcgcHVycG9zZXMpIGJ1dAorICAgIC8vLyBzaG91bGQgYmUgdGV4dHVhbGx5IGluY2x1ZGVkLgorICAgIFRleHR1YWxIZWFkZXIgPSAweDIsCisKKyAgICAvLyBDYXV0aW9uOiBBZGRpbmcgYW4gZW51bWVyYXRvciBuZWVkcyBvdGhlciBjaGFuZ2VzLgorICAgIC8vIEFkanVzdCB0aGUgbnVtYmVyIG9mIGJpdHMgZm9yIEtub3duSGVhZGVyOjpTdG9yYWdlLgorICAgIC8vIEFkanVzdCB0aGUgYml0ZmllbGQgSGVhZGVyRmlsZUluZm86OkhlYWRlclJvbGUgc2l6ZS4KKyAgICAvLyBBZGp1c3QgdGhlIEhlYWRlckZpbGVJbmZvVHJhaXQ6OlJlYWREYXRhIHN0cmVhbWluZy4KKyAgICAvLyBBZGp1c3QgdGhlIEhlYWRlckZpbGVJbmZvVHJhaXQ6OkVtaXREYXRhIHN0cmVhbWluZy4KKyAgICAvLyBBZGp1c3QgTW9kdWxlTWFwOjphZGRIZWFkZXIuCisgIH07CisKKyAgLy8vIENvbnZlcnQgYSBoZWFkZXIga2luZCB0byBhIHJvbGUuIFJlcXVpcmVzIEtpbmQgdG8gbm90IGJlIEhLX0V4Y2x1ZGVkLgorICBzdGF0aWMgTW9kdWxlSGVhZGVyUm9sZSBoZWFkZXJLaW5kVG9Sb2xlKE1vZHVsZTo6SGVhZGVyS2luZCBLaW5kKTsKKworICAvLy8gQ29udmVydCBhIGhlYWRlciByb2xlIHRvIGEga2luZC4KKyAgc3RhdGljIE1vZHVsZTo6SGVhZGVyS2luZCBoZWFkZXJSb2xlVG9LaW5kKE1vZHVsZUhlYWRlclJvbGUgUm9sZSk7CisKKyAgLy8vIFxicmllZiBBIGhlYWRlciB0aGF0IGlzIGtub3duIHRvIHJlc2lkZSB3aXRoaW4gYSBnaXZlbiBtb2R1bGUsCisgIC8vLyB3aGV0aGVyIGl0IHdhcyBpbmNsdWRlZCBvciBleGNsdWRlZC4KKyAgY2xhc3MgS25vd25IZWFkZXIgeworICAgIGxsdm06OlBvaW50ZXJJbnRQYWlyPE1vZHVsZSAqLCAyLCBNb2R1bGVIZWFkZXJSb2xlPiBTdG9yYWdlOworCisgIHB1YmxpYzoKKyAgICBLbm93bkhlYWRlcigpIDogU3RvcmFnZShudWxscHRyLCBOb3JtYWxIZWFkZXIpIHt9CisgICAgS25vd25IZWFkZXIoTW9kdWxlICpNLCBNb2R1bGVIZWFkZXJSb2xlIFJvbGUpIDogU3RvcmFnZShNLCBSb2xlKSB7fQorCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBLbm93bkhlYWRlciAmQSwgY29uc3QgS25vd25IZWFkZXIgJkIpIHsKKyAgICAgIHJldHVybiBBLlN0b3JhZ2UgPT0gQi5TdG9yYWdlOworICAgIH0KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEtub3duSGVhZGVyICZBLCBjb25zdCBLbm93bkhlYWRlciAmQikgeworICAgICAgcmV0dXJuIEEuU3RvcmFnZSAhPSBCLlN0b3JhZ2U7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbW9kdWxlIHRoZSBoZWFkZXIgaXMgc3RvcmVkIGluLgorICAgIE1vZHVsZSAqZ2V0TW9kdWxlKCkgY29uc3QgeyByZXR1cm4gU3RvcmFnZS5nZXRQb2ludGVyKCk7IH0KKworICAgIC8vLyBcYnJpZWYgVGhlIHJvbGUgb2YgdGhpcyBoZWFkZXIgd2l0aGluIHRoZSBtb2R1bGUuCisgICAgTW9kdWxlSGVhZGVyUm9sZSBnZXRSb2xlKCkgY29uc3QgeyByZXR1cm4gU3RvcmFnZS5nZXRJbnQoKTsgfQorCisgICAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgaGVhZGVyIGlzIGF2YWlsYWJsZSBpbiB0aGUgbW9kdWxlLgorICAgIGJvb2wgaXNBdmFpbGFibGUoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0TW9kdWxlKCktPmlzQXZhaWxhYmxlKCk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgaGVhZGVyIGlzIGFjY2Vzc2libGUgZnJvbSB0aGUgc3BlY2lmaWVkIG1vZHVsZS4KKyAgICBib29sIGlzQWNjZXNzaWJsZUZyb20oTW9kdWxlICpNKSBjb25zdCB7CisgICAgICByZXR1cm4gIShnZXRSb2xlKCkgJiBQcml2YXRlSGVhZGVyKSB8fAorICAgICAgICAgICAgIChNICYmIE0tPmdldFRvcExldmVsTW9kdWxlKCkgPT0gZ2V0TW9kdWxlKCktPmdldFRvcExldmVsTW9kdWxlKCkpOworICAgIH0KKworICAgIC8vIFxicmllZiBXaGV0aGVyIHRoaXMga25vd24gaGVhZGVyIGlzIHZhbGlkIChpLmUuLCBpdCBoYXMgYW4KKyAgICAvLyBhc3NvY2lhdGVkIG1vZHVsZSkuCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTdG9yYWdlLmdldFBvaW50ZXIoKSAhPSBudWxscHRyOworICAgIH0KKyAgfTsKKworICB1c2luZyBBZGRpdGlvbmFsTW9kTWFwc1NldCA9IGxsdm06OlNtYWxsUHRyU2V0PGNvbnN0IEZpbGVFbnRyeSAqLCAxPjsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIE1vZHVsZU1hcFBhcnNlcjsKKworICB1c2luZyBIZWFkZXJzTWFwID0KKyAgICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IEZpbGVFbnRyeSAqLCBTbWFsbFZlY3RvcjxLbm93bkhlYWRlciwgMT4+OworCisgIC8vLyBcYnJpZWYgTWFwcGluZyBmcm9tIGVhY2ggaGVhZGVyIHRvIHRoZSBtb2R1bGUgdGhhdCBvd25zIHRoZSBjb250ZW50cyBvZgorICAvLy8gdGhhdCBoZWFkZXIuCisgIEhlYWRlcnNNYXAgSGVhZGVyczsKKworICAvLy8gTWFwIGZyb20gZmlsZSBzaXplcyB0byBtb2R1bGVzIHdpdGggbGF6eSBoZWFkZXIgZGlyZWN0aXZlcyBvZiB0aGF0IHNpemUuCisgIG11dGFibGUgbGx2bTo6RGVuc2VNYXA8b2ZmX3QsIGxsdm06OlRpbnlQdHJWZWN0b3I8TW9kdWxlKj4+IExhenlIZWFkZXJzQnlTaXplOworCisgIC8vLyBNYXAgZnJvbSBtdGltZXMgdG8gbW9kdWxlcyB3aXRoIGxhenkgaGVhZGVyIGRpcmVjdGl2ZXMgd2l0aCB0aG9zZSBtdGltZXMuCisgIG11dGFibGUgbGx2bTo6RGVuc2VNYXA8dGltZV90LCBsbHZtOjpUaW55UHRyVmVjdG9yPE1vZHVsZSo+PgorICAgICAgICAgICAgICBMYXp5SGVhZGVyc0J5TW9kVGltZTsKKworICAvLy8gXGJyaWVmIE1hcHBpbmcgZnJvbSBkaXJlY3RvcmllcyB3aXRoIHVtYnJlbGxhIGhlYWRlcnMgdG8gdGhlIG1vZHVsZQorICAvLy8gdGhhdCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgdW1icmVsbGEgaGVhZGVyLgorICAvLy8KKyAgLy8vIFRoaXMgbWFwcGluZyBpcyB1c2VkIHRvIG1hcCBoZWFkZXJzIHRoYXQgaGF2ZW4ndCBleHBsaWNpdGx5IGJlZW4gbmFtZWQKKyAgLy8vIGluIHRoZSBtb2R1bGUgbWFwIG92ZXIgdG8gdGhlIG1vZHVsZSB0aGF0IGluY2x1ZGVzIHRoZW0gdmlhIGl0cyB1bWJyZWxsYQorICAvLy8gaGVhZGVyLgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBEaXJlY3RvcnlFbnRyeSAqLCBNb2R1bGUgKj4gVW1icmVsbGFEaXJzOworCisgIC8vLyBcYnJpZWYgQSBnZW5lcmF0aW9uIGNvdW50ZXIgdGhhdCBpcyB1c2VkIHRvIHRlc3Qgd2hldGhlciBtb2R1bGVzIG9mIHRoZQorICAvLy8gc2FtZSBuYW1lIG1heSBzaGFkb3cgb3IgYXJlIGlsbGVnYWwgcmVkZWZpbnRpb25zLgorICAvLy8KKyAgLy8vIE1vZHVsZXMgZnJvbSBlYXJsaWVyIHNjb3BlcyBtYXkgc2hhZG93IG1vZHVsZXMgZnJvbSBsYXRlciBvbmVzLgorICAvLy8gTW9kdWxlcyBmcm9tIHRoZSBzYW1lIHNjb3BlIG1heSBub3QgaGF2ZSB0aGUgc2FtZSBuYW1lLgorICB1bnNpZ25lZCBDdXJyZW50TW9kdWxlU2NvcGVJRCA9IDA7CisKKyAgbGx2bTo6RGVuc2VNYXA8TW9kdWxlICosIHVuc2lnbmVkPiBNb2R1bGVTY29wZUlEczsKKworICAvLy8gXGJyaWVmIFRoZSBzZXQgb2YgYXR0cmlidXRlcyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIG1vZHVsZS4KKyAgc3RydWN0IEF0dHJpYnV0ZXMgeworICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGlzIGEgc3lzdGVtIG1vZHVsZS4KKyAgICB1bnNpZ25lZCBJc1N5c3RlbSA6IDE7CisKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBpcyBhbiBleHRlcm4gIkMiIG1vZHVsZS4KKyAgICB1bnNpZ25lZCBJc0V4dGVybkMgOiAxOworCisgICAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgaXMgYW4gZXhoYXVzdGl2ZSBzZXQgb2YgY29uZmlndXJhdGlvbiBtYWNyb3MuCisgICAgdW5zaWduZWQgSXNFeGhhdXN0aXZlIDogMTsKKworICAgIC8vLyBcYnJpZWYgV2hldGhlciBmaWxlcyBpbiB0aGlzIG1vZHVsZSBjYW4gb25seSBpbmNsdWRlIG5vbi1tb2R1bGFyIGhlYWRlcnMKKyAgICAvLy8gYW5kIGhlYWRlcnMgZnJvbSB1c2VkIG1vZHVsZXMuCisgICAgdW5zaWduZWQgTm9VbmRlY2xhcmVkSW5jbHVkZXMgOiAxOworCisgICAgQXR0cmlidXRlcygpCisgICAgICAgIDogSXNTeXN0ZW0oZmFsc2UpLCBJc0V4dGVybkMoZmFsc2UpLCBJc0V4aGF1c3RpdmUoZmFsc2UpLAorICAgICAgICAgIE5vVW5kZWNsYXJlZEluY2x1ZGVzKGZhbHNlKSB7fQorICB9OworCisgIC8vLyBcYnJpZWYgQSBkaXJlY3RvcnkgZm9yIHdoaWNoIGZyYW1ld29yayBtb2R1bGVzIGNhbiBiZSBpbmZlcnJlZC4KKyAgc3RydWN0IEluZmVycmVkRGlyZWN0b3J5IHsKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdG8gaW5mZXIgbW9kdWxlcyBmcm9tIHRoaXMgZGlyZWN0b3J5LgorICAgIHVuc2lnbmVkIEluZmVyTW9kdWxlcyA6IDE7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBhdHRyaWJ1dGVzIHRvIHVzZSBmb3IgaW5mZXJyZWQgbW9kdWxlcy4KKyAgICBBdHRyaWJ1dGVzIEF0dHJzOworCisgICAgLy8vIFxicmllZiBJZiBcYyBJbmZlck1vZHVsZXMgaXMgbm9uLXplcm8sIHRoZSBtb2R1bGUgbWFwIGZpbGUgdGhhdCBhbGxvd2VkCisgICAgLy8vIGluZmVycmVkIG1vZHVsZXMuICBPdGhlcndpc2UsIG51bGxwdHIuCisgICAgY29uc3QgRmlsZUVudHJ5ICpNb2R1bGVNYXBGaWxlOworCisgICAgLy8vIFxicmllZiBUaGUgbmFtZXMgb2YgbW9kdWxlcyB0aGF0IGNhbm5vdCBiZSBpbmZlcnJlZCB3aXRoaW4gdGhpcworICAgIC8vLyBkaXJlY3RvcnkuCisgICAgU21hbGxWZWN0b3I8c3RkOjpzdHJpbmcsIDI+IEV4Y2x1ZGVkTW9kdWxlczsKKworICAgIEluZmVycmVkRGlyZWN0b3J5KCkgOiBJbmZlck1vZHVsZXMoZmFsc2UpIHt9CisgIH07CisKKyAgLy8vIFxicmllZiBBIG1hcHBpbmcgZnJvbSBkaXJlY3RvcmllcyB0byBpbmZvcm1hdGlvbiBhYm91dCBpbmZlcnJpbmcKKyAgLy8vIGZyYW1ld29yayBtb2R1bGVzIGZyb20gd2l0aGluIHRob3NlIGRpcmVjdG9yaWVzLgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBEaXJlY3RvcnlFbnRyeSAqLCBJbmZlcnJlZERpcmVjdG9yeT4gSW5mZXJyZWREaXJlY3RvcmllczsKKworICAvLy8gQSBtYXBwaW5nIGZyb20gYW4gaW5mZXJyZWQgbW9kdWxlIHRvIHRoZSBtb2R1bGUgbWFwIHRoYXQgYWxsb3dlZCB0aGUKKyAgLy8vIGluZmVyZW5jZS4KKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgTW9kdWxlICosIGNvbnN0IEZpbGVFbnRyeSAqPiBJbmZlcnJlZE1vZHVsZUFsbG93ZWRCeTsKKworICBsbHZtOjpEZW5zZU1hcDxjb25zdCBNb2R1bGUgKiwgQWRkaXRpb25hbE1vZE1hcHNTZXQ+IEFkZGl0aW9uYWxNb2RNYXBzOworCisgIC8vLyBcYnJpZWYgRGVzY3JpYmVzIHdoZXRoZXIgd2UgaGF2ZWQgcGFyc2VkIGEgcGFydGljdWxhciBmaWxlIGFzIGEgbW9kdWxlCisgIC8vLyBtYXAuCisgIGxsdm06OkRlbnNlTWFwPGNvbnN0IEZpbGVFbnRyeSAqLCBib29sPiBQYXJzZWRNb2R1bGVNYXA7CisKKyAgLy8vIFxicmllZiBSZXNvbHZlIHRoZSBnaXZlbiBleHBvcnQgZGVjbGFyYXRpb24gaW50byBhbiBhY3R1YWwgZXhwb3J0CisgIC8vLyBkZWNsYXJhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gTW9kIFRoZSBtb2R1bGUgaW4gd2hpY2ggd2UncmUgcmVzb2x2aW5nIHRoZSBleHBvcnQgZGVjbGFyYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFVucmVzb2x2ZWQgVGhlIGV4cG9ydCBkZWNsYXJhdGlvbiB0byByZXNvbHZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb21wbGFpbiBXaGV0aGVyIHRoaXMgcm91dGluZSBzaG91bGQgY29tcGxhaW4gYWJvdXQgdW5yZXNvbHZhYmxlCisgIC8vLyBleHBvcnRzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSByZXNvbHZlZCBleHBvcnQgZGVjbGFyYXRpb24sIHdoaWNoIHdpbGwgaGF2ZSBhIE5VTEwgcG9pbnRlcgorICAvLy8gaWYgdGhlIGV4cG9ydCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuCisgIE1vZHVsZTo6RXhwb3J0RGVjbCAKKyAgcmVzb2x2ZUV4cG9ydChNb2R1bGUgKk1vZCwgY29uc3QgTW9kdWxlOjpVbnJlc29sdmVkRXhwb3J0RGVjbCAmVW5yZXNvbHZlZCwKKyAgICAgICAgICAgICAgICBib29sIENvbXBsYWluKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJlc29sdmUgdGhlIGdpdmVuIG1vZHVsZSBpZCB0byBhbiBhY3R1YWwgbW9kdWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJZCBUaGUgbW9kdWxlLWlkIHRvIHJlc29sdmUuCisgIC8vLworICAvLy8gXHBhcmFtIE1vZCBUaGUgbW9kdWxlIGluIHdoaWNoIHdlJ3JlIHJlc29sdmluZyB0aGUgbW9kdWxlLWlkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb21wbGFpbiBXaGV0aGVyIHRoaXMgcm91dGluZSBzaG91bGQgY29tcGxhaW4gYWJvdXQgdW5yZXNvbHZhYmxlCisgIC8vLyBtb2R1bGUtaWRzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSByZXNvbHZlZCBtb2R1bGUsIG9yIG51bGwgaWYgdGhlIG1vZHVsZS1pZCBjb3VsZCBub3QgYmUKKyAgLy8vIHJlc29sdmVkLgorICBNb2R1bGUgKnJlc29sdmVNb2R1bGVJZChjb25zdCBNb2R1bGVJZCAmSWQsIE1vZHVsZSAqTW9kLCBib29sIENvbXBsYWluKSBjb25zdDsKKworICAvLy8gQWRkIGFuIHVucmVzb2x2ZWQgaGVhZGVyIHRvIGEgbW9kdWxlLgorICB2b2lkIGFkZFVucmVzb2x2ZWRIZWFkZXIoTW9kdWxlICpNb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGU6OlVucmVzb2x2ZWRIZWFkZXJEaXJlY3RpdmUgSGVhZGVyKTsKKworICAvLy8gTG9vayB1cCB0aGUgZ2l2ZW4gaGVhZGVyIGRpcmVjdGl2ZSB0byBmaW5kIGFuIGFjdHVhbCBoZWFkZXIgZmlsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTSBUaGUgbW9kdWxlIGluIHdoaWNoIHdlJ3JlIHJlc29sdmluZyB0aGUgaGVhZGVyIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBIZWFkZXIgVGhlIGhlYWRlciBkaXJlY3RpdmUgdG8gcmVzb2x2ZS4KKyAgLy8vIFxwYXJhbSBSZWxhdGl2ZVBhdGhOYW1lIEZpbGxlZCBpbiB3aXRoIHRoZSByZWxhdGl2ZSBwYXRoIG5hbWUgZnJvbSB0aGUKKyAgLy8vICAgICAgICBtb2R1bGUgdG8gdGhlIHJlc29sdmVkIGhlYWRlci4KKyAgLy8vIFxyZXR1cm4gVGhlIHJlc29sdmVkIGZpbGUsIGlmIGFueS4KKyAgY29uc3QgRmlsZUVudHJ5ICpmaW5kSGVhZGVyKE1vZHVsZSAqTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZTo6VW5yZXNvbHZlZEhlYWRlckRpcmVjdGl2ZSAmSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZSZWxhdGl2ZVBhdGhOYW1lKTsKKworICAvLy8gUmVzb2x2ZSB0aGUgZ2l2ZW4gaGVhZGVyIGRpcmVjdGl2ZS4KKyAgdm9pZCByZXNvbHZlSGVhZGVyKE1vZHVsZSAqTSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZTo6VW5yZXNvbHZlZEhlYWRlckRpcmVjdGl2ZSAmSGVhZGVyKTsKKworICAvLy8gQXR0ZW1wdCB0byByZXNvbHZlIHRoZSBzcGVjaWZpZWQgaGVhZGVyIGRpcmVjdGl2ZSBhcyBuYW1pbmcgYSBidWlsdGluCisgIC8vLyBoZWFkZXIuCisgIC8vLyBccmV0dXJuIFxjIHRydWUgaWYgYSBjb3JyZXNwb25kaW5nIGJ1aWx0aW4gaGVhZGVyIHdhcyBmb3VuZC4KKyAgYm9vbCByZXNvbHZlQXNCdWlsdGluSGVhZGVyKE1vZHVsZSAqTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZTo6VW5yZXNvbHZlZEhlYWRlckRpcmVjdGl2ZSAmSGVhZGVyKTsKKworICAvLy8gXGJyaWVmIExvb2tzIHVwIHRoZSBtb2R1bGVzIHRoYXQgXHAgRmlsZSBjb3JyZXNwb25kcyB0by4KKyAgLy8vCisgIC8vLyBJZiBccCBGaWxlIHJlcHJlc2VudHMgYSBidWlsdGluIGhlYWRlciB3aXRoaW4gQ2xhbmcncyBidWlsdGluIGluY2x1ZGUKKyAgLy8vIGRpcmVjdG9yeSwgdGhpcyBhbHNvIGxvYWRzIGFsbCBvZiB0aGUgbW9kdWxlIG1hcHMgdG8gc2VlIGlmIGl0IHdpbGwgZ2V0CisgIC8vLyBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBtb2R1bGUgKGUuZy4gaW4gL3Vzci9pbmNsdWRlKS4KKyAgSGVhZGVyc01hcDo6aXRlcmF0b3IgZmluZEtub3duSGVhZGVyKGNvbnN0IEZpbGVFbnRyeSAqRmlsZSk7CisKKyAgLy8vIFxicmllZiBTZWFyY2hlcyBmb3IgYSBtb2R1bGUgd2hvc2UgdW1icmVsbGEgZGlyZWN0b3J5IGNvbnRhaW5zIFxwIEZpbGUuCisgIC8vLworICAvLy8gXHBhcmFtIEZpbGUgVGhlIGhlYWRlciB0byBzZWFyY2ggZm9yLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJbnRlcm1lZGlhdGVEaXJzIE9uIHN1Y2Nlc3MsIGNvbnRhaW5zIHRoZSBzZXQgb2YgZGlyZWN0b3JpZXMKKyAgLy8vIHNlYXJjaGVkIGJlZm9yZSBmaW5kaW5nIFxwIEZpbGUuCisgIEtub3duSGVhZGVyIGZpbmRIZWFkZXJJblVtYnJlbGxhRGlycyhjb25zdCBGaWxlRW50cnkgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjb25zdCBEaXJlY3RvcnlFbnRyeSAqPiAmSW50ZXJtZWRpYXRlRGlycyk7CisKKyAgLy8vIFxicmllZiBHaXZlbiB0aGF0IFxwIEZpbGUgaXMgbm90IGluIHRoZSBIZWFkZXJzIG1hcCwgbG9vayBpdCB1cCB3aXRoaW4KKyAgLy8vIHVtYnJlbGxhIGRpcmVjdG9yaWVzIGFuZCBmaW5kIG9yIGNyZWF0ZSBhIG1vZHVsZSBmb3IgaXQuCisgIEtub3duSGVhZGVyIGZpbmRPckNyZWF0ZU1vZHVsZUZvckhlYWRlckluVW1icmVsbGFEaXIoY29uc3QgRmlsZUVudHJ5ICpGaWxlKTsKKworICAvLy8gXGJyaWVmIEEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGRldGVybWluZSBpZiBccCBGaWxlIGlzIChwb3NzaWJseSBuZXN0ZWQpCisgIC8vLyBpbiBhbiB1bWJyZWxsYSBkaXJlY3RvcnkuCisgIGJvb2wgaXNIZWFkZXJJblVtYnJlbGxhRGlycyhjb25zdCBGaWxlRW50cnkgKkZpbGUpIHsKKyAgICBTbWFsbFZlY3Rvcjxjb25zdCBEaXJlY3RvcnlFbnRyeSAqLCAyPiBJbnRlcm1lZGlhdGVEaXJzOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxib29sPihmaW5kSGVhZGVySW5VbWJyZWxsYURpcnMoRmlsZSwgSW50ZXJtZWRpYXRlRGlycykpOworICB9CisKKyAgTW9kdWxlICppbmZlckZyYW1ld29ya01vZHVsZShjb25zdCBEaXJlY3RvcnlFbnRyeSAqRnJhbWV3b3JrRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgQXR0cnMsIE1vZHVsZSAqUGFyZW50KTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIG5ldyBtb2R1bGUgbWFwLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTb3VyY2VNZ3IgVGhlIHNvdXJjZSBtYW5hZ2VyIHVzZWQgdG8gZmluZCBtb2R1bGUgZmlsZXMgYW5kIGhlYWRlcnMuCisgIC8vLyBUaGlzIHNvdXJjZSBtYW5hZ2VyIHNob3VsZCBiZSBzaGFyZWQgd2l0aCB0aGUgaGVhZGVyLXNlYXJjaCBtZWNoYW5pc20sCisgIC8vLyBzaW5jZSB0aGV5IHdpbGwgcmVmZXIgdG8gdGhlIHNhbWUgaGVhZGVycy4KKyAgLy8vCisgIC8vLyBccGFyYW0gRGlhZ3MgQSBkaWFnbm9zdGljIGVuZ2luZSB1c2VkIGZvciBkaWFnbm9zdGljcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gTGFuZ09wdHMgTGFuZ3VhZ2Ugb3B0aW9ucyBmb3IgdGhpcyB0cmFuc2xhdGlvbiB1bml0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBUYXJnZXQgVGhlIHRhcmdldCBmb3IgdGhpcyB0cmFuc2xhdGlvbiB1bml0LgorICBNb2R1bGVNYXAoU291cmNlTWFuYWdlciAmU291cmNlTWdyLCBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MsCisgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsIGNvbnN0IFRhcmdldEluZm8gKlRhcmdldCwKKyAgICAgICAgICAgIEhlYWRlclNlYXJjaCAmSGVhZGVySW5mbyk7CisKKyAgLy8vIFxicmllZiBEZXN0cm95IHRoZSBtb2R1bGUgbWFwLgorICB+TW9kdWxlTWFwKCk7CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIHRhcmdldCBpbmZvcm1hdGlvbi4KKyAgdm9pZCBzZXRUYXJnZXQoY29uc3QgVGFyZ2V0SW5mbyAmVGFyZ2V0KTsKKworICAvLy8gXGJyaWVmIFNldCB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgQ2xhbmctc3VwcGxpZWQgaW5jbHVkZQorICAvLy8gZmlsZXMsIHN1Y2ggYXMgb3VyIHN0ZGFyZy5oIG9yIHRnbWF0aC5oLgorICB2b2lkIHNldEJ1aWx0aW5JbmNsdWRlRGlyKGNvbnN0IERpcmVjdG9yeUVudHJ5ICpEaXIpIHsKKyAgICBCdWlsdGluSW5jbHVkZURpciA9IERpcjsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBDbGFuZy1zdXBwbGllZCBpbmNsdWRlIGZpbGVzLgorICBjb25zdCBEaXJlY3RvcnlFbnRyeSAqZ2V0QnVpbHRpbkRpcigpIGNvbnN0IHsKKyAgICByZXR1cm4gQnVpbHRpbkluY2x1ZGVEaXI7CisgIH0KKworICAvLy8gXGJyaWVmIElzIHRoaXMgYSBjb21waWxlciBidWlsdGluIGhlYWRlcj8KKyAgc3RhdGljIGJvb2wgaXNCdWlsdGluSGVhZGVyKFN0cmluZ1JlZiBGaWxlTmFtZSk7CisKKyAgLy8vIFxicmllZiBBZGQgYSBtb2R1bGUgbWFwIGNhbGxiYWNrLgorICB2b2lkIGFkZE1vZHVsZU1hcENhbGxiYWNrcyhzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlTWFwQ2FsbGJhY2tzPiBDYWxsYmFjaykgeworICAgIENhbGxiYWNrcy5wdXNoX2JhY2soc3RkOjptb3ZlKENhbGxiYWNrKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtb2R1bGUgdGhhdCBvd25zIHRoZSBnaXZlbiBoZWFkZXIgZmlsZSwgaWYgYW55LgorICAvLy8KKyAgLy8vIFxwYXJhbSBGaWxlIFRoZSBoZWFkZXIgZmlsZSB0aGF0IGlzIGxpa2VseSB0byBiZSBpbmNsdWRlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQWxsb3dUZXh0dWFsIElmIFxjIHRydWUgYW5kIFxwIEZpbGUgaXMgYSB0ZXh0dWFsIGhlYWRlciwgcmV0dXJuCisgIC8vLyBpdHMgb3duaW5nIG1vZHVsZS4gT3RoZXJ3aXNlLCBubyBLbm93bkhlYWRlciB3aWxsIGJlIHJldHVybmVkIGlmIHRoZQorICAvLy8gZmlsZSBpcyBvbmx5IGtub3duIGFzIGEgdGV4dHVhbCBoZWFkZXIuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIG1vZHVsZSBLbm93bkhlYWRlciwgd2hpY2ggcHJvdmlkZXMgdGhlIG1vZHVsZSB0aGF0IG93bnMgdGhlCisgIC8vLyBnaXZlbiBoZWFkZXIgZmlsZS4gIFRoZSBLbm93bkhlYWRlciBpcyBkZWZhdWx0IGNvbnN0cnVjdGVkIHRvIGluZGljYXRlCisgIC8vLyB0aGF0IG5vIG1vZHVsZSBvd25zIHRoaXMgaGVhZGVyIGZpbGUuCisgIEtub3duSGVhZGVyIGZpbmRNb2R1bGVGb3JIZWFkZXIoY29uc3QgRmlsZUVudHJ5ICpGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dUZXh0dWFsID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYWxsIHRoZSBtb2R1bGVzIHRoYXQgY29udGFpbiB0aGUgZ2l2ZW4gaGVhZGVyIGZpbGUuIFRoaXMKKyAgLy8vIG1heSBub3QgaW5jbHVkZSB1bWJyZWxsYSBtb2R1bGVzLCBub3IgaW5mb3JtYXRpb24gZnJvbSBleHRlcm5hbCBzb3VyY2VzLAorICAvLy8gaWYgdGhleSBoYXZlIG5vdCB5ZXQgYmVlbiBpbmZlcnJlZCAvIGxvYWRlZC4KKyAgLy8vCisgIC8vLyBUeXBpY2FsbHksIFxyZWYgZmluZE1vZHVsZUZvckhlYWRlciBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLCBhcyBpdCBwaWNrcworICAvLy8gdGhlIHByZWZlcnJlZCBtb2R1bGUgZm9yIHRoZSBoZWFkZXIuCisgIEFycmF5UmVmPEtub3duSGVhZGVyPiBmaW5kQWxsTW9kdWxlc0ZvckhlYWRlcihjb25zdCBGaWxlRW50cnkgKkZpbGUpIGNvbnN0OworCisgIC8vLyBSZXNvbHZlIGFsbCBsYXp5IGhlYWRlciBkaXJlY3RpdmVzIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuCisgIC8vLworICAvLy8gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIEhlYWRlckZpbGVJbmZvIG9uIEhlYWRlclNlYXJjaCBpcyB1cCB0byBkYXRlLiBUaGlzCisgIC8vLyBpcyBlZmZlY3RpdmVseSBpbnRlcm5hbCwgYnV0IGlzIGV4cG9zZWQgc28gSGVhZGVyU2VhcmNoIGNhbiBjYWxsIGl0LgorICB2b2lkIHJlc29sdmVIZWFkZXJEaXJlY3RpdmVzKGNvbnN0IEZpbGVFbnRyeSAqRmlsZSkgY29uc3Q7CisKKyAgLy8vIFJlc29sdmUgYWxsIGxhenkgaGVhZGVyIGRpcmVjdGl2ZXMgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlLgorICB2b2lkIHJlc29sdmVIZWFkZXJEaXJlY3RpdmVzKE1vZHVsZSAqTW9kKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJlcG9ydHMgZXJyb3JzIGlmIGEgbW9kdWxlIG11c3Qgbm90IGluY2x1ZGUgYSBzcGVjaWZpYyBmaWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSZXF1ZXN0aW5nTW9kdWxlIFRoZSBtb2R1bGUgaW5jbHVkaW5nIGEgZmlsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gUmVxdWVzdGluZ01vZHVsZUlzTW9kdWxlSW50ZXJmYWNlIFxjIHRydWUgaWYgdGhlIGluY2x1c2lvbiBpcyBpbgorICAvLy8gICAgICAgIHRoZSBpbnRlcmZhY2Ugb2YgUmVxdWVzdGluZ01vZHVsZSwgXGMgZmFsc2UgaWYgaXQncyBpbiB0aGUKKyAgLy8vICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiBSZXF1ZXN0aW5nTW9kdWxlLiBWYWx1ZSBpcyBpZ25vcmVkIGFuZAorICAvLy8gICAgICAgIG1lYW5pbmdsZXNzIGlmIFJlcXVlc3RpbmdNb2R1bGUgaXMgbnVsbHB0ci4KKyAgLy8vCisgIC8vLyBccGFyYW0gRmlsZW5hbWVMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBpbmNsdXNpb24ncyBmaWxlbmFtZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gRmlsZW5hbWUgVGhlIGluY2x1ZGVkIGZpbGVuYW1lIGFzIHdyaXR0ZW4uCisgIC8vLworICAvLy8gXHBhcmFtIEZpbGUgVGhlIGluY2x1ZGVkIGZpbGUuCisgIHZvaWQgZGlhZ25vc2VIZWFkZXJJbmNsdXNpb24oTW9kdWxlICpSZXF1ZXN0aW5nTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVxdWVzdGluZ01vZHVsZUlzTW9kdWxlSW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEZpbGVuYW1lTG9jLCBTdHJpbmdSZWYgRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZUVudHJ5ICpGaWxlKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBoZWFkZXIgaXMgcGFydCBvZiBhIG1vZHVsZQorICAvLy8gbWFya2VkICd1bmF2YWlsYWJsZScuCisgIGJvb2wgaXNIZWFkZXJJblVuYXZhaWxhYmxlTW9kdWxlKGNvbnN0IEZpbGVFbnRyeSAqSGVhZGVyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBoZWFkZXIgaXMgdW5hdmFpbGFibGUgYXMgcGFydAorICAvLy8gb2YgdGhlIHNwZWNpZmllZCBtb2R1bGUuCisgIGJvb2wgaXNIZWFkZXJVbmF2YWlsYWJsZUluTW9kdWxlKGNvbnN0IEZpbGVFbnRyeSAqSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKlJlcXVlc3RpbmdNb2R1bGUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYSBtb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGxvb2sgdXAuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIG5hbWVkIG1vZHVsZSwgaWYga25vd247IG90aGVyd2lzZSwgcmV0dXJucyBudWxsLgorICBNb2R1bGUgKmZpbmRNb2R1bGUoU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYSBtb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSB1c2luZyBsZXhpY2FsIG5hbWUgbG9va3VwLAorICAvLy8gc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGNvbnRleHQuCisgIC8vLworICAvLy8gXHBhcmFtIE5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBsb29rIHVwLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb250ZXh0IFRoZSBtb2R1bGUgY29udGV4dCwgZnJvbSB3aGljaCB3ZSB3aWxsIHBlcmZvcm0gbGV4aWNhbAorICAvLy8gbmFtZSBsb29rdXAuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIG5hbWVkIG1vZHVsZSwgaWYga25vd247IG90aGVyd2lzZSwgcmV0dXJucyBudWxsLgorICBNb2R1bGUgKmxvb2t1cE1vZHVsZVVucXVhbGlmaWVkKFN0cmluZ1JlZiBOYW1lLCBNb2R1bGUgKkNvbnRleHQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYSBtb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSB3aXRoaW4gdGhlIGdpdmVuIGNvbnRleHQsCisgIC8vLyB1c2luZyBkaXJlY3QgKHF1YWxpZmllZCkgbmFtZSBsb29rdXAuCisgIC8vLworICAvLy8gXHBhcmFtIE5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBsb29rIHVwLgorICAvLy8gCisgIC8vLyBccGFyYW0gQ29udGV4dCBUaGUgbW9kdWxlIGZvciB3aGljaCB3ZSB3aWxsIGxvb2sgZm9yIGEgc3VibW9kdWxlLiBJZgorICAvLy8gbnVsbCwgd2Ugd2lsbCBsb29rIGZvciBhIHRvcC1sZXZlbCBtb2R1bGUuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIG5hbWVkIHN1Ym1vZHVsZSwgaWYga25vd247IG90aGVyd29zZSwgcmV0dXJucyBudWxsLgorICBNb2R1bGUgKmxvb2t1cE1vZHVsZVF1YWxpZmllZChTdHJpbmdSZWYgTmFtZSwgTW9kdWxlICpDb250ZXh0KSBjb25zdDsKKyAgCisgIC8vLyBcYnJpZWYgRmluZCBhIG5ldyBtb2R1bGUgb3Igc3VibW9kdWxlLCBvciBjcmVhdGUgaXQgaWYgaXQgZG9lcyBub3QgYWxyZWFkeQorICAvLy8gZXhpc3QuCisgIC8vLworICAvLy8gXHBhcmFtIE5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBmaW5kIG9yIGNyZWF0ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gUGFyZW50IFRoZSBtb2R1bGUgdGhhdCB3aWxsIGFjdCBhcyB0aGUgcGFyZW50IG9mIHRoaXMgc3VibW9kdWxlLAorICAvLy8gb3IgbnVsbHB0ciB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYSB0b3AtbGV2ZWwgbW9kdWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJc0ZyYW1ld29yayBXaGV0aGVyIHRoaXMgaXMgYSBmcmFtZXdvcmsgbW9kdWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJc0V4cGxpY2l0IFdoZXRoZXIgdGhpcyBpcyBhbiBleHBsaWNpdCBzdWJtb2R1bGUuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIGZvdW5kIG9yIG5ld2x5LWNyZWF0ZWQgbW9kdWxlLCBhbG9uZyB3aXRoIGEgYm9vbGVhbiB2YWx1ZQorICAvLy8gdGhhdCB3aWxsIGJlIHRydWUgaWYgdGhlIG1vZHVsZSBpcyBuZXdseS1jcmVhdGVkLgorICBzdGQ6OnBhaXI8TW9kdWxlICosIGJvb2w+IGZpbmRPckNyZWF0ZU1vZHVsZShTdHJpbmdSZWYgTmFtZSwgTW9kdWxlICpQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNGcmFtZXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNFeHBsaWNpdCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSAnZ2xvYmFsIG1vZHVsZScgZm9yIGEgQysrIE1vZHVsZXMgVFMgbW9kdWxlIGludGVyZmFjZQorICAvLy8gdW5pdC4KKyAgLy8vCisgIC8vLyBXZSBtb2RlbCB0aGUgZ2xvYmFsIG1vZHVsZSBhcyBhIHN1Ym1vZHVsZSBvZiB0aGUgbW9kdWxlIGludGVyZmFjZSB1bml0LgorICAvLy8gVW5mb3J0dW5hdGVseSwgd2UgY2FuJ3QgY3JlYXRlIHRoZSBtb2R1bGUgaW50ZXJmYWNlIHVuaXQncyBNb2R1bGUgdW50aWwKKyAgLy8vIGxhdGVyLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgd2hhdCBpdCB3aWxsIGJlIGNhbGxlZC4KKyAgTW9kdWxlICpjcmVhdGVHbG9iYWxNb2R1bGVGb3JJbnRlcmZhY2VVbml0KFNvdXJjZUxvY2F0aW9uIExvYyk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBuZXcgbW9kdWxlIGZvciBhIEMrKyBNb2R1bGVzIFRTIG1vZHVsZSBpbnRlcmZhY2UgdW5pdC4KKyAgLy8vIFRoZSBtb2R1bGUgbXVzdCBub3QgYWxyZWFkeSBleGlzdCwgYW5kIHdpbGwgYmUgY29uZmlndXJlZCBmb3IgdGhlIGN1cnJlbnQKKyAgLy8vIGNvbXBpbGF0aW9uLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGFsc28gc2V0cyB0aGUgY3VycmVudCBtb2R1bGUgdG8gdGhlIG5ld2x5LWNyZWF0ZWQgbW9kdWxlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSBuZXdseS1jcmVhdGVkIG1vZHVsZS4KKyAgTW9kdWxlICpjcmVhdGVNb2R1bGVGb3JJbnRlcmZhY2VVbml0KFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUgKkdsb2JhbE1vZHVsZSk7CisKKyAgLy8vIFxicmllZiBJbmZlciB0aGUgY29udGVudHMgb2YgYSBmcmFtZXdvcmsgbW9kdWxlIG1hcCBmcm9tIHRoZSBnaXZlbgorICAvLy8gZnJhbWV3b3JrIGRpcmVjdG9yeS4KKyAgTW9kdWxlICppbmZlckZyYW1ld29ya01vZHVsZShjb25zdCBEaXJlY3RvcnlFbnRyeSAqRnJhbWV3b3JrRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNTeXN0ZW0sIE1vZHVsZSAqUGFyZW50KTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyB0b3AtbGV2ZWwgbW9kdWxlIHRoYXQgaXMgc2hhZG93ZWQgYnkKKyAgLy8vIFxwIFNoYWRvd2luZ01vZHVsZS4KKyAgTW9kdWxlICpjcmVhdGVTaGFkb3dlZE1vZHVsZShTdHJpbmdSZWYgTmFtZSwgYm9vbCBJc0ZyYW1ld29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUgKlNoYWRvd2luZ01vZHVsZSk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGEgbmV3IGRlY2xhcmF0aW9uIHNjb3BlIGZvciBtb2R1bGUgbmFtZXMsIGFsbG93aW5nCisgIC8vLyBwcmV2aW91c2x5IGRlZmluZWQgbW9kdWxlcyB0byBzaGFkb3cgZGVmaW5pdGlvbnMgZnJvbSB0aGUgbmV3IHNjb3BlLgorICAvLy8KKyAgLy8vIFxub3RlIE1vZHVsZSBuYW1lcyBmcm9tIGVhcmxpZXIgc2NvcGVzIHdpbGwgc2hhZG93IG5hbWVzIGZyb20gdGhlIG5ldworICAvLy8gc2NvcGUsIHdoaWNoIGlzIHRoZSBvcHBvc2l0ZSBvZiBob3cgc2hhZG93aW5nIHdvcmtzIGZvciB2YXJpYWJsZXMuCisgIHZvaWQgZmluaXNoTW9kdWxlRGVjbGFyYXRpb25TY29wZSgpIHsgQ3VycmVudE1vZHVsZVNjb3BlSUQgKz0gMTsgfQorCisgIGJvb2wgbWF5U2hhZG93TmV3TW9kdWxlKE1vZHVsZSAqRXhpc3RpbmdNb2R1bGUpIHsKKyAgICBhc3NlcnQoIUV4aXN0aW5nTW9kdWxlLT5QYXJlbnQgJiYgImV4cGVjdGVkIHRvcC1sZXZlbCBtb2R1bGUiKTsKKyAgICBhc3NlcnQoTW9kdWxlU2NvcGVJRHMuY291bnQoRXhpc3RpbmdNb2R1bGUpICYmICJ1bmtub3duIG1vZHVsZSIpOworICAgIHJldHVybiBNb2R1bGVTY29wZUlEc1tFeGlzdGluZ01vZHVsZV0gPCBDdXJyZW50TW9kdWxlU2NvcGVJRDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG1vZHVsZSBtYXAgZmlsZSBjb250YWluaW5nIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBnaXZlbgorICAvLy8gbW9kdWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNb2R1bGUgVGhlIG1vZHVsZSB3aG9zZSBtb2R1bGUgbWFwIGZpbGUgd2lsbCBiZSByZXR1cm5lZCwgaWYga25vd24uCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIGZpbGUgZW50cnkgZm9yIHRoZSBtb2R1bGUgbWFwIGZpbGUgY29udGFpbmluZyB0aGUgZ2l2ZW4KKyAgLy8vIG1vZHVsZSwgb3IgbnVsbHB0ciBpZiB0aGUgbW9kdWxlIGRlZmluaXRpb24gd2FzIGluZmVycmVkLgorICBjb25zdCBGaWxlRW50cnkgKmdldENvbnRhaW5pbmdNb2R1bGVNYXBGaWxlKGNvbnN0IE1vZHVsZSAqTW9kdWxlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgbW9kdWxlIG1hcCBmaWxlIHRoYXQgKGFsb25nIHdpdGggdGhlIG1vZHVsZSBuYW1lKSB1bmlxdWVseQorICAvLy8gaWRlbnRpZmllcyB0aGlzIG1vZHVsZS4KKyAgLy8vCisgIC8vLyBUaGUgcGFydGljdWxhciBtb2R1bGUgdGhhdCBcYyBOYW1lIHJlZmVycyB0byBtYXkgZGVwZW5kIG9uIGhvdyB0aGUgbW9kdWxlCisgIC8vLyB3YXMgZm91bmQgaW4gaGVhZGVyIHNlYXJjaC4gSG93ZXZlciwgdGhlIGNvbWJpbmF0aW9uIG9mIFxjIE5hbWUgYW5kCisgIC8vLyB0aGlzIG1vZHVsZSBtYXAgd2lsbCBiZSBnbG9iYWxseSB1bmlxdWUgZm9yIHRvcC1sZXZlbCBtb2R1bGVzLiBJbiB0aGUgY2FzZQorICAvLy8gb2YgaW5mZXJyZWQgbW9kdWxlcywgcmV0dXJucyB0aGUgbW9kdWxlIG1hcCB0aGF0IGFsbG93ZWQgdGhlIGluZmVyZW5jZQorICAvLy8gKGUuZy4gY29udGFpbmVkICdtb2R1bGUgKicpLiBPdGhlcndpc2UsIHJldHVybnMKKyAgLy8vIGdldENvbnRhaW5pbmdNb2R1bGVNYXBGaWxlKCkuCisgIGNvbnN0IEZpbGVFbnRyeSAqZ2V0TW9kdWxlTWFwRmlsZUZvclVuaXF1aW5nKGNvbnN0IE1vZHVsZSAqTSkgY29uc3Q7CisKKyAgdm9pZCBzZXRJbmZlcnJlZE1vZHVsZUFsbG93ZWRCeShNb2R1bGUgKk0sIGNvbnN0IEZpbGVFbnRyeSAqTW9kdWxlTWFwKTsKKworICAvLy8gXGJyaWVmIEdldCBhbnkgbW9kdWxlIG1hcCBmaWxlcyBvdGhlciB0aGFuIGdldE1vZHVsZU1hcEZpbGVGb3JVbmlxdWluZyhNKQorICAvLy8gdGhhdCBkZWZpbmUgc3VibW9kdWxlcyBvZiBhIHRvcC1sZXZlbCBtb2R1bGUgXHAgTS4gVGhpcyBpcyBjaGVhcGVyIHRoYW4KKyAgLy8vIGdldHRpbmcgdGhlIG1vZHVsZSBtYXAgZmlsZSBmb3IgZWFjaCBzdWJtb2R1bGUgaW5kaXZpZHVhbGx5LCBzaW5jZSB0aGUKKyAgLy8vIGV4cGVjdGVkIG51bWJlciBvZiByZXN1bHRzIGlzIHZlcnkgc21hbGwuCisgIEFkZGl0aW9uYWxNb2RNYXBzU2V0ICpnZXRBZGRpdGlvbmFsTW9kdWxlTWFwRmlsZXMoY29uc3QgTW9kdWxlICpNKSB7CisgICAgYXV0byBJID0gQWRkaXRpb25hbE1vZE1hcHMuZmluZChNKTsKKyAgICBpZiAoSSA9PSBBZGRpdGlvbmFsTW9kTWFwcy5lbmQoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiAmSS0+c2Vjb25kOworICB9CisKKyAgdm9pZCBhZGRBZGRpdGlvbmFsTW9kdWxlTWFwRmlsZShjb25zdCBNb2R1bGUgKk0sIGNvbnN0IEZpbGVFbnRyeSAqTW9kdWxlTWFwKSB7CisgICAgQWRkaXRpb25hbE1vZE1hcHNbTV0uaW5zZXJ0KE1vZHVsZU1hcCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlc29sdmUgYWxsIG9mIHRoZSB1bnJlc29sdmVkIGV4cG9ydHMgaW4gdGhlIGdpdmVuIG1vZHVsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTW9kIFRoZSBtb2R1bGUgd2hvc2UgZXhwb3J0cyBzaG91bGQgYmUgcmVzb2x2ZWQuCisgIC8vLworICAvLy8gXHBhcmFtIENvbXBsYWluIFdoZXRoZXIgdG8gZW1pdCBkaWFnbm9zdGljcyBmb3IgZmFpbHVyZXMuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBhbnkgZXJyb3JzIHdlcmUgZW5jb3VudGVyZWQgd2hpbGUgcmVzb2x2aW5nIGV4cG9ydHMsCisgIC8vLyBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgcmVzb2x2ZUV4cG9ydHMoTW9kdWxlICpNb2QsIGJvb2wgQ29tcGxhaW4pOworCisgIC8vLyBcYnJpZWYgUmVzb2x2ZSBhbGwgb2YgdGhlIHVucmVzb2x2ZWQgdXNlcyBpbiB0aGUgZ2l2ZW4gbW9kdWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNb2QgVGhlIG1vZHVsZSB3aG9zZSB1c2VzIHNob3VsZCBiZSByZXNvbHZlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29tcGxhaW4gV2hldGhlciB0byBlbWl0IGRpYWdub3N0aWNzIGZvciBmYWlsdXJlcy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGFueSBlcnJvcnMgd2VyZSBlbmNvdW50ZXJlZCB3aGlsZSByZXNvbHZpbmcgdXNlcywKKyAgLy8vIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCByZXNvbHZlVXNlcyhNb2R1bGUgKk1vZCwgYm9vbCBDb21wbGFpbik7CisKKyAgLy8vIFxicmllZiBSZXNvbHZlIGFsbCBvZiB0aGUgdW5yZXNvbHZlZCBjb25mbGljdHMgaW4gdGhlIGdpdmVuIG1vZHVsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTW9kIFRoZSBtb2R1bGUgd2hvc2UgY29uZmxpY3RzIHNob3VsZCBiZSByZXNvbHZlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29tcGxhaW4gV2hldGhlciB0byBlbWl0IGRpYWdub3N0aWNzIGZvciBmYWlsdXJlcy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGFueSBlcnJvcnMgd2VyZSBlbmNvdW50ZXJlZCB3aGlsZSByZXNvbHZpbmcgY29uZmxpY3RzLAorICAvLy8gZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIHJlc29sdmVDb25mbGljdHMoTW9kdWxlICpNb2QsIGJvb2wgQ29tcGxhaW4pOworCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgdW1icmVsbGEgaGVhZGVyIG9mIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIGdpdmVuCisgIC8vLyBoZWFkZXIuCisgIHZvaWQgc2V0VW1icmVsbGFIZWFkZXIoTW9kdWxlICpNb2QsIGNvbnN0IEZpbGVFbnRyeSAqVW1icmVsbGFIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUgTmFtZUFzV3JpdHRlbik7CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSB1bWJyZWxsYSBkaXJlY3Rvcnkgb2YgdGhlIGdpdmVuIG1vZHVsZSB0byB0aGUgZ2l2ZW4KKyAgLy8vIGRpcmVjdG9yeS4KKyAgdm9pZCBzZXRVbWJyZWxsYURpcihNb2R1bGUgKk1vZCwgY29uc3QgRGlyZWN0b3J5RW50cnkgKlVtYnJlbGxhRGlyLAorICAgICAgICAgICAgICAgICAgICAgIFR3aW5lIE5hbWVBc1dyaXR0ZW4pOworCisgIC8vLyBcYnJpZWYgQWRkcyB0aGlzIGhlYWRlciB0byB0aGUgZ2l2ZW4gbW9kdWxlLgorICAvLy8gXHBhcmFtIFJvbGUgVGhlIHJvbGUgb2YgdGhlIGhlYWRlciB3cnQgdGhlIG1vZHVsZS4KKyAgdm9pZCBhZGRIZWFkZXIoTW9kdWxlICpNb2QsIE1vZHVsZTo6SGVhZGVyIEhlYWRlciwKKyAgICAgICAgICAgICAgICAgTW9kdWxlSGVhZGVyUm9sZSBSb2xlLCBib29sIEltcG9ydGVkID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgTWFya3MgdGhpcyBoZWFkZXIgYXMgYmVpbmcgZXhjbHVkZWQgZnJvbSB0aGUgZ2l2ZW4gbW9kdWxlLgorICB2b2lkIGV4Y2x1ZGVIZWFkZXIoTW9kdWxlICpNb2QsIE1vZHVsZTo6SGVhZGVyIEhlYWRlcik7CisKKyAgLy8vIFxicmllZiBQYXJzZSB0aGUgZ2l2ZW4gbW9kdWxlIG1hcCBmaWxlLCBhbmQgcmVjb3JkIGFueSBtb2R1bGVzIHdlIAorICAvLy8gZW5jb3VudGVyLgorICAvLy8KKyAgLy8vIFxwYXJhbSBGaWxlIFRoZSBmaWxlIHRvIGJlIHBhcnNlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gSXNTeXN0ZW0gV2hldGhlciB0aGlzIG1vZHVsZSBtYXAgZmlsZSBpcyBpbiBhIHN5c3RlbSBoZWFkZXIKKyAgLy8vIGRpcmVjdG9yeSwgYW5kIHRoZXJlZm9yZSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIHN5c3RlbSBtb2R1bGUuCisgIC8vLworICAvLy8gXHBhcmFtIEhvbWVEaXIgVGhlIGRpcmVjdG9yeSBpbiB3aGljaCByZWxhdGl2ZSBwYXRocyB3aXRoaW4gdGhpcyBtb2R1bGUKKyAgLy8vICAgICAgICBtYXAgZmlsZSB3aWxsIGJlIHJlc29sdmVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJRCBUaGUgRmlsZUlEIG9mIHRoZSBmaWxlIHRvIHByb2Nlc3MsIGlmIHdlJ3ZlIGFscmVhZHkgZW50ZXJlZCBpdC4KKyAgLy8vCisgIC8vLyBccGFyYW0gT2Zmc2V0IFtpbm91dF0gT24gaW5wdXQgdGhlIG9mZnNldCBhdCB3aGljaCB0byBzdGFydCBwYXJzaW5nLiBPbgorICAvLy8gICAgICAgIG91dHB1dCwgdGhlIG9mZnNldCBhdCB3aGljaCB0aGUgbW9kdWxlIG1hcCB0ZXJtaW5hdGVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBFeHRlcm5Nb2R1bGVMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSAiZXh0ZXJuIG1vZHVsZSIgZGVjbGFyYXRpb24KKyAgLy8vICAgICAgICB0aGF0IGNhdXNlZCB1cyB0byBsb2FkIHRoaXMgbW9kdWxlIG1hcCBmaWxlLCBpZiBhbnkuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIHBhcnNlTW9kdWxlTWFwRmlsZShjb25zdCBGaWxlRW50cnkgKkZpbGUsIGJvb2wgSXNTeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpcmVjdG9yeUVudHJ5ICpIb21lRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSUQgSUQgPSBGaWxlSUQoKSwgdW5zaWduZWQgKk9mZnNldCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEV4dGVybk1vZHVsZUxvYyA9IFNvdXJjZUxvY2F0aW9uKCkpOworCisgIC8vLyBcYnJpZWYgRHVtcCB0aGUgY29udGVudHMgb2YgdGhlIG1vZHVsZSBtYXAsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgIHZvaWQgZHVtcCgpOworICAKKyAgdXNpbmcgbW9kdWxlX2l0ZXJhdG9yID0gbGx2bTo6U3RyaW5nTWFwPE1vZHVsZSAqPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgbW9kdWxlX2l0ZXJhdG9yIG1vZHVsZV9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIE1vZHVsZXMuYmVnaW4oKTsgfQorICBtb2R1bGVfaXRlcmF0b3IgbW9kdWxlX2VuZCgpICAgY29uc3QgeyByZXR1cm4gTW9kdWxlcy5lbmQoKTsgfQorfTsKKyAgCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19MRVhfTU9EVUxFTUFQX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9NdWx0aXBsZUluY2x1ZGVPcHQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9NdWx0aXBsZUluY2x1ZGVPcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGQzMDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L011bHRpcGxlSW5jbHVkZU9wdC5oCkBAIC0wLDAgKzEsMTgxIEBACisvLz09PS0tLSBNdWx0aXBsZUluY2x1ZGVPcHQuaCAtIEhlYWRlciBNdWx0aXBsZS1JbmNsdWRlIE9wdHpuIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgTXVsdGlwbGVJbmNsdWRlT3B0IGludGVyZmFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfTEVYX01VTFRJUExFSU5DTFVERU9QVF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfTEVYX01VTFRJUExFSU5DTFVERU9QVF9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorCituYW1lc3BhY2UgY2xhbmcgeworY2xhc3MgSWRlbnRpZmllckluZm87CisKKy8vLyBcYnJpZWYgSW1wbGVtZW50cyB0aGUgc2ltcGxlIHN0YXRlIG1hY2hpbmUgdGhhdCB0aGUgTGV4ZXIgY2xhc3MgdXNlcyB0bworLy8vIGRldGVjdCBmaWxlcyBzdWJqZWN0IHRvIHRoZSAnbXVsdGlwbGUtaW5jbHVkZScgb3B0aW1pemF0aW9uLgorLy8vCisvLy8gVGhlIHB1YmxpYyBtZXRob2RzIGluIHRoaXMgY2xhc3MgYXJlIHRyaWdnZXJlZCBieSB2YXJpb3VzCisvLy8gZXZlbnRzIHRoYXQgb2NjdXIgd2hlbiBhIGZpbGUgaXMgbGV4ZWQsIGFuZCBhZnRlciB0aGUgZW50aXJlIGZpbGUgaXMgbGV4ZWQsCisvLy8gaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggbWFjcm8gKGlmIGFueSkgY29udHJvbHMgdGhlIGhlYWRlciBpcyByZXR1cm5lZC4KK2NsYXNzIE11bHRpcGxlSW5jbHVkZU9wdCB7CisgIC8vLyBSZWFkQW55VG9rZW5zIC0gVGhpcyBpcyBzZXQgdG8gZmFsc2Ugd2hlbiBhIGZpbGUgaXMgZmlyc3Qgb3BlbmVkIGFuZCB0cnVlCisgIC8vLyBhbnkgdGltZSBhIHRva2VuIGlzIHJldHVybmVkIHRvIHRoZSBjbGllbnQgb3IgYSAobm9uLW11bHRpcGxlLWluY2x1ZGUpCisgIC8vLyBkaXJlY3RpdmUgaXMgcGFyc2VkLiAgV2hlbiB0aGUgZmluYWwgXCNlbmRpZiBpcyBwYXJzZWQgdGhpcyBpcyByZXNldCBiYWNrCisgIC8vLyB0byBmYWxzZSwgdGhhdCB3YXkgYW55IHRva2VucyBiZWZvcmUgdGhlIGZpcnN0IFwjaWZkZWYgb3IgYWZ0ZXIgdGhlIGxhc3QKKyAgLy8vIFwjZW5kaWYgY2FuIGJlIGVhc2lseSBkZXRlY3RlZC4KKyAgYm9vbCBSZWFkQW55VG9rZW5zOworCisgIC8vLyBJbW1lZGlhdGVseUFmdGVyVG9wTGV2ZWxJZm5kZWYgLSBUaGlzIGlzIHRydWUgd2hlbiB0aGUgb25seSB0b2tlbnMKKyAgLy8vIHByb2Nlc3NlZCBpbiB0aGUgZmlsZSBzbyBmYXIgaXMgYW4gI2lmbmRlZiBhbmQgYW4gaWRlbnRpZmllci4gIFVzZWQgaW4KKyAgLy8vIHRoZSBkZXRlY3Rpb24gb2YgaGVhZGVyIGd1YXJkcyBpbiBhIGZpbGUuCisgIGJvb2wgSW1tZWRpYXRlbHlBZnRlclRvcExldmVsSWZuZGVmOworCisgIC8vLyBSZWFkQW55VG9rZW5zIC0gVGhpcyBpcyBzZXQgdG8gZmFsc2Ugd2hlbiBhIGZpbGUgaXMgZmlyc3Qgb3BlbmVkIGFuZCB0cnVlCisgIC8vLyBhbnkgdGltZSBhIHRva2VuIGlzIHJldHVybmVkIHRvIHRoZSBjbGllbnQgb3IgYSAobm9uLW11bHRpcGxlLWluY2x1ZGUpCisgIC8vLyBkaXJlY3RpdmUgaXMgcGFyc2VkLiAgV2hlbiB0aGUgZmluYWwgI2VuZGlmIGlzIHBhcnNlZCB0aGlzIGlzIHJlc2V0IGJhY2sKKyAgLy8vIHRvIGZhbHNlLCB0aGF0IHdheSBhbnkgdG9rZW5zIGJlZm9yZSB0aGUgZmlyc3QgI2lmZGVmIG9yIGFmdGVyIHRoZSBsYXN0CisgIC8vLyAjZW5kaWYgY2FuIGJlIGVhc2lseSBkZXRlY3RlZC4KKyAgYm9vbCBEaWRNYWNyb0V4cGFuc2lvbjsKKworICAvLy8gVGhlTWFjcm8gLSBUaGUgY29udHJvbGxpbmcgbWFjcm8gZm9yIGEgZmlsZSwgaWYgdmFsaWQuCisgIC8vLworICBjb25zdCBJZGVudGlmaWVySW5mbyAqVGhlTWFjcm87CisKKyAgLy8vIERlZmluZWRNYWNybyAtIFRoZSBtYWNybyBkZWZpbmVkIHJpZ2h0IGFmdGVyIFRoZU1hY3JvLCBpZiBhbnkuCisgIGNvbnN0IElkZW50aWZpZXJJbmZvICpEZWZpbmVkTWFjcm87CisKKyAgU291cmNlTG9jYXRpb24gTWFjcm9Mb2M7CisgIFNvdXJjZUxvY2F0aW9uIERlZmluZWRMb2M7CitwdWJsaWM6CisgIE11bHRpcGxlSW5jbHVkZU9wdCgpIHsKKyAgICBSZWFkQW55VG9rZW5zID0gZmFsc2U7CisgICAgSW1tZWRpYXRlbHlBZnRlclRvcExldmVsSWZuZGVmID0gZmFsc2U7CisgICAgRGlkTWFjcm9FeHBhbnNpb24gPSBmYWxzZTsKKyAgICBUaGVNYWNybyA9IG51bGxwdHI7CisgICAgRGVmaW5lZE1hY3JvID0gbnVsbHB0cjsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIEdldE1hY3JvTG9jYXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIE1hY3JvTG9jOworICB9CisKKyAgU291cmNlTG9jYXRpb24gR2V0RGVmaW5lZExvY2F0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBEZWZpbmVkTG9jOworICB9CisKKyAgdm9pZCByZXNldEltbWVkaWF0ZWx5QWZ0ZXJUb3BMZXZlbElmbmRlZigpIHsKKyAgICBJbW1lZGlhdGVseUFmdGVyVG9wTGV2ZWxJZm5kZWYgPSBmYWxzZTsKKyAgfQorCisgIHZvaWQgU2V0RGVmaW5lZE1hY3JvKElkZW50aWZpZXJJbmZvICpNLCBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBEZWZpbmVkTWFjcm8gPSBNOworICAgIERlZmluZWRMb2MgPSBMb2M7CisgIH0KKworICAvLy8gSW52YWxpZGF0ZSAtIFBlcm1hbmVudGx5IG1hcmsgdGhpcyBmaWxlIGFzIG5vdCBiZWluZyBzdWl0YWJsZSBmb3IgdGhlCisgIC8vLyBpbmNsdWRlLWZpbGUgb3B0aW1pemF0aW9uLgorICB2b2lkIEludmFsaWRhdGUoKSB7CisgICAgLy8gSWYgd2UgaGF2ZSByZWFkIHRva2VucyBidXQgaGF2ZSBubyBjb250cm9sbGluZyBtYWNybywgdGhlIHN0YXRlLW1hY2hpbmUKKyAgICAvLyBiZWxvdyBjYW4gbmV2ZXIgImFjY2VwdCIuCisgICAgUmVhZEFueVRva2VucyA9IHRydWU7CisgICAgSW1tZWRpYXRlbHlBZnRlclRvcExldmVsSWZuZGVmID0gZmFsc2U7CisgICAgRGVmaW5lZE1hY3JvID0gbnVsbHB0cjsKKyAgICBUaGVNYWNybyA9IG51bGxwdHI7CisgIH0KKworICAvLy8gZ2V0SGFzUmVhZEFueVRva2Vuc1ZhbCAtIFRoaXMgaXMgdXNlZCBmb3IgdGhlIFwjaWZuZGVmIGhhbmRzaGFrZSBhdCB0aGUKKyAgLy8vIHRvcCBvZiB0aGUgZmlsZSB3aGVuIHJlYWRpbmcgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMuICBPdGhlcndpc2UsIHJlYWRpbmcKKyAgLy8vIHRoZSAiaWZuZGVmIHgiIHdvdWxkIGNvdW50IGFzIHJlYWRpbmcgdG9rZW5zLgorICBib29sIGdldEhhc1JlYWRBbnlUb2tlbnNWYWwoKSBjb25zdCB7IHJldHVybiBSZWFkQW55VG9rZW5zOyB9CisKKyAgLy8vIGdldEltbWVkaWF0ZWx5QWZ0ZXJUb3BMZXZlbElmbmRlZiAtIHJldHVybnMgdHJ1ZSBpZiB0aGUgbGFzdCBkaXJlY3RpdmUKKyAgLy8vIHdhcyBhbiAjaWZuZGVmIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgIGJvb2wgZ2V0SW1tZWRpYXRlbHlBZnRlclRvcExldmVsSWZuZGVmKCkgY29uc3QgeworICAgIHJldHVybiBJbW1lZGlhdGVseUFmdGVyVG9wTGV2ZWxJZm5kZWY7CisgIH0KKworICAvLyBJZiBhIHRva2VuIGlzIHJlYWQsIHJlbWVtYmVyIHRoYXQgd2UgaGF2ZSBzZWVuIGEgc2lkZS1lZmZlY3QgaW4gdGhpcyBmaWxlLgorICB2b2lkIFJlYWRUb2tlbigpIHsKKyAgICBSZWFkQW55VG9rZW5zID0gdHJ1ZTsKKyAgICBJbW1lZGlhdGVseUFmdGVyVG9wTGV2ZWxJZm5kZWYgPSBmYWxzZTsKKyAgfQorCisgIC8vLyBFeHBhbmRlZE1hY3JvIC0gV2hlbiBhIG1hY3JvIGlzIGV4cGFuZGVkIHdpdGggdGhpcyBsZXhlciBhcyB0aGUgY3VycmVudAorICAvLy8gYnVmZmVyLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gZGlzYWJsZSB0aGUgTUlPcHQgaWYgbmVlZGVkLgorICB2b2lkIEV4cGFuZGVkTWFjcm8oKSB7IERpZE1hY3JvRXhwYW5zaW9uID0gdHJ1ZTsgfQorCisgIC8vLyBcYnJpZWYgQ2FsbGVkIHdoZW4gZW50ZXJpbmcgYSB0b3AtbGV2ZWwgXCNpZm5kZWYgZGlyZWN0aXZlIChvciB0aGUKKyAgLy8vICJcI2lmICFkZWZpbmVkIiBlcXVpdmFsZW50KSB3aXRob3V0IGFueSBwcmVjZWRpbmcgdG9rZW5zLgorICAvLy8KKyAgLy8vIE5vdGUsIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGlucHV0IHZhbHVlIG9mICdSZWFkQW55VG9rZW5zJy4gIFRoZSBjYWxsZXIKKyAgLy8vIGVuc3VyZXMgdGhhdCB0aGlzIGlzIG9ubHkgY2FsbGVkIGlmIHRoZXJlIGFyZSBubyB0b2tlbnMgcmVhZCBiZWZvcmUgdGhlCisgIC8vLyBcI2lmbmRlZi4gIFRoZSBjYWxsZXIgaXMgcmVxdWlyZWQgdG8gZG8gdGhpcywgYmVjYXVzZSByZWFkaW5nIHRoZSBcI2lmCisgIC8vLyBsaW5lIG9idmlvdXNseSByZWFkcyBpbiB0b2tlbnMuCisgIHZvaWQgRW50ZXJUb3BMZXZlbElmbmRlZihjb25zdCBJZGVudGlmaWVySW5mbyAqTSwgU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgLy8gSWYgdGhlIG1hY3JvIGlzIGFscmVhZHkgc2V0LCB0aGlzIGlzIGFmdGVyIHRoZSB0b3AtbGV2ZWwgI2VuZGlmLgorICAgIGlmIChUaGVNYWNybykKKyAgICAgIHJldHVybiBJbnZhbGlkYXRlKCk7CisKKyAgICAvLyBJZiB3ZSBoYXZlIGFscmVhZHkgZXhwYW5kZWQgYSBtYWNybyBieSB0aGUgZW5kIG9mIHRoZSAjaWZuZGVmIGxpbmUsIHRoZW4KKyAgICAvLyB0aGVyZSBpcyBhIG1hY3JvIGV4cGFuc2lvbiAqaW4qIHRoZSAjaWZuZGVmIGxpbmUuICBUaGlzIG1lYW5zIHRoYXQgdGhlCisgICAgLy8gY29uZGl0aW9uIGNvdWxkIGV2YWx1YXRlIGRpZmZlcmVudGx5IHdoZW4gc3Vic2VxdWVudGx5ICNpbmNsdWRlZC4gIFJlamVjdAorICAgIC8vIHRoaXMuCisgICAgaWYgKERpZE1hY3JvRXhwYW5zaW9uKQorICAgICAgcmV0dXJuIEludmFsaWRhdGUoKTsKKworICAgIC8vIFJlbWVtYmVyIHRoYXQgd2UncmUgaW4gdGhlICNpZiBhbmQgdGhhdCB3ZSBoYXZlIHRoZSBtYWNyby4KKyAgICBSZWFkQW55VG9rZW5zID0gdHJ1ZTsKKyAgICBJbW1lZGlhdGVseUFmdGVyVG9wTGV2ZWxJZm5kZWYgPSB0cnVlOworICAgIFRoZU1hY3JvID0gTTsKKyAgICBNYWNyb0xvYyA9IExvYzsKKyAgfQorCisgIC8vLyBcYnJpZWYgSW52b2tlZCB3aGVuIGEgdG9wIGxldmVsIGNvbmRpdGlvbmFsIChleGNlcHQgXCNpZm5kZWYpIGlzIGZvdW5kLgorICB2b2lkIEVudGVyVG9wTGV2ZWxDb25kaXRpb25hbCgpIHsKKyAgICAvLyBJZiBhIGNvbmRpdGlvbmFsIGRpcmVjdGl2ZSAoZXhjZXB0ICNpZm5kZWYpIGlzIGZvdW5kIGF0IHRoZSB0b3AgbGV2ZWwsCisgICAgLy8gdGhlcmUgaXMgYSBjaHVuayBvZiB0aGUgZmlsZSBub3QgZ3VhcmRlZCBieSB0aGUgY29udHJvbGxpbmcgbWFjcm8uCisgICAgSW52YWxpZGF0ZSgpOworICB9CisKKyAgLy8vIFxicmllZiBDYWxsZWQgd2hlbiB0aGUgbGV4ZXIgZXhpdHMgdGhlIHRvcC1sZXZlbCBjb25kaXRpb25hbC4KKyAgdm9pZCBFeGl0VG9wTGV2ZWxDb25kaXRpb25hbCgpIHsKKyAgICAvLyBJZiB3ZSBoYXZlIGEgbWFjcm8sIHRoYXQgbWVhbnMgdGhlIHRvcCBvZiB0aGUgZmlsZSB3YXMgb2suICBTZXQgb3VyIHN0YXRlCisgICAgLy8gYmFjayB0byAibm90IGhhdmluZyByZWFkIGFueSB0b2tlbnMiIHNvIHdlIGNhbiBkZXRlY3QgYW55dGhpbmcgYWZ0ZXIgdGhlCisgICAgLy8gI2VuZGlmLgorICAgIGlmICghVGhlTWFjcm8pIHJldHVybiBJbnZhbGlkYXRlKCk7CisKKyAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlbid0ICJyZWFkIGFueSB0b2tlbnMiIGJ1dCB3ZSBkbyBoYXZlIGEgY29udHJvbGxpbmcKKyAgICAvLyBtYWNyby4KKyAgICBSZWFkQW55VG9rZW5zID0gZmFsc2U7CisgICAgSW1tZWRpYXRlbHlBZnRlclRvcExldmVsSWZuZGVmID0gZmFsc2U7CisgIH0KKworICAvLy8gXGJyaWVmIE9uY2UgdGhlIGVudGlyZSBmaWxlIGhhcyBiZWVuIGxleGVkLCBpZiB0aGVyZSBpcyBhIGNvbnRyb2xsaW5nCisgIC8vLyBtYWNybywgcmV0dXJuIGl0LgorICBjb25zdCBJZGVudGlmaWVySW5mbyAqR2V0Q29udHJvbGxpbmdNYWNyb0F0RW5kT2ZGaWxlKCkgY29uc3QgeworICAgIC8vIElmIHdlIGhhdmVuJ3QgcmVhZCBhbnkgdG9rZW5zIGFmdGVyIHRoZSAjZW5kaWYsIHJldHVybiB0aGUgY29udHJvbGxpbmcKKyAgICAvLyBtYWNybyBpZiBpdCdzIHZhbGlkIChpZiBpdCBpc24ndCwgaXQgd2lsbCBiZSBudWxsKS4KKyAgICBpZiAoIVJlYWRBbnlUb2tlbnMpCisgICAgICByZXR1cm4gVGhlTWFjcm87CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIElmIHRoZSBDb250cm9sbGluZ01hY3JvIGlzIGZvbGxvd2VkIGJ5IGEgbWFjcm8gZGVmaW5pdGlvbiwgcmV0dXJuCisgIC8vLyB0aGUgbWFjcm8gdGhhdCB3YXMgZGVmaW5lZC4KKyAgY29uc3QgSWRlbnRpZmllckluZm8gKkdldERlZmluZWRNYWNybygpIGNvbnN0IHsKKyAgICByZXR1cm4gRGVmaW5lZE1hY3JvOworICB9Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L1BQQ2FsbGJhY2tzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvUFBDYWxsYmFja3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWJjZTRkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L1BQQ2FsbGJhY2tzLmgKQEAgLTAsMCArMSw1NDUgQEAKKy8vPT09LS0tIFBQQ2FsbGJhY2tzLmggLSBDYWxsYmFja3MgZm9yIFByZXByb2Nlc3NvciBhY3Rpb25zIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHRoZSBQUENhbGxiYWNrcyBpbnRlcmZhY2UuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19MRVhfUFBDQUxMQkFDS1NfSAorI2RlZmluZSBMTFZNX0NMQU5HX0xFWF9QUENBTExCQUNLU19ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljSURzLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L01vZHVsZUxvYWRlci5oIgorI2luY2x1ZGUgImNsYW5nL0xleC9QcmFnbWEuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgY2xhc3MgVG9rZW47CisgIGNsYXNzIElkZW50aWZpZXJJbmZvOworICBjbGFzcyBNYWNyb0RlZmluaXRpb247CisgIGNsYXNzIE1hY3JvRGlyZWN0aXZlOworICBjbGFzcyBNYWNyb0FyZ3M7CisKKy8vLyBcYnJpZWYgVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYSB3YXkgdG8gb2JzZXJ2ZSB0aGUgYWN0aW9ucyBvZiB0aGUKKy8vLyBwcmVwcm9jZXNzb3IgYXMgaXQgZG9lcyBpdHMgdGhpbmcuCisvLy8KKy8vLyBDbGllbnRzIGNhbiBkZWZpbmUgdGhlaXIgaG9va3MgaGVyZSB0byBpbXBsZW1lbnQgcHJlcHJvY2Vzc29yIGxldmVsIHRvb2xzLgorY2xhc3MgUFBDYWxsYmFja3MgeworcHVibGljOgorICB2aXJ0dWFsIH5QUENhbGxiYWNrcygpOworCisgIGVudW0gRmlsZUNoYW5nZVJlYXNvbiB7CisgICAgRW50ZXJGaWxlLCBFeGl0RmlsZSwgU3lzdGVtSGVhZGVyUHJhZ21hLCBSZW5hbWVGaWxlCisgIH07CisKKyAgLy8vIFxicmllZiBDYWxsYmFjayBpbnZva2VkIHdoZW5ldmVyIGEgc291cmNlIGZpbGUgaXMgZW50ZXJlZCBvciBleGl0ZWQuCisgIC8vLworICAvLy8gXHBhcmFtIExvYyBJbmRpY2F0ZXMgdGhlIG5ldyBsb2NhdGlvbi4KKyAgLy8vIFxwYXJhbSBQcmV2RklEIHRoZSBmaWxlIHRoYXQgd2FzIGV4aXRlZCBpZiBccCBSZWFzb24gaXMgRXhpdEZpbGUuCisgIHZpcnR1YWwgdm9pZCBGaWxlQ2hhbmdlZChTb3VyY2VMb2NhdGlvbiBMb2MsIEZpbGVDaGFuZ2VSZWFzb24gUmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjTWdyOjpDaGFyYWN0ZXJpc3RpY0tpbmQgRmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSUQgUHJldkZJRCA9IEZpbGVJRCgpKSB7CisgIH0KKworICAvLy8gXGJyaWVmIENhbGxiYWNrIGludm9rZWQgd2hlbmV2ZXIgYSBzb3VyY2UgZmlsZSBpcyBza2lwcGVkIGFzIHRoZSByZXN1bHQKKyAgLy8vIG9mIGhlYWRlciBndWFyZCBvcHRpbWl6YXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFNraXBwZWRGaWxlIFRoZSBmaWxlIHRoYXQgaXMgc2tpcHBlZCBpbnN0ZWFkIG9mIGVudGVyaW5nIFwjaW5jbHVkZQorICAvLy8KKyAgLy8vIFxwYXJhbSBGaWxlbmFtZVRvayBUaGUgZmlsZSBuYW1lIHRva2VuIGluIFwjaW5jbHVkZSAiRmlsZU5hbWUiIGRpcmVjdGl2ZQorICAvLy8gb3IgbWFjcm8gZXhwYW5kZWQgZmlsZSBuYW1lIHRva2VuIGZyb20gXCNpbmNsdWRlIE1BQ1JPKFBBUkFNUykgZGlyZWN0aXZlLgorICAvLy8gTm90ZSB0aGF0IEZpbGVuYW1lVG9rIGNvbnRhaW5zIGNvcnJlc3BvbmRpbmcgcXVvdGVzL2FuZ2xlcyBzeW1ib2xzLgorICB2aXJ0dWFsIHZvaWQgRmlsZVNraXBwZWQoY29uc3QgRmlsZUVudHJ5ICZTa2lwcGVkRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRva2VuICZGaWxlbmFtZVRvaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY01ncjo6Q2hhcmFjdGVyaXN0aWNLaW5kIEZpbGVUeXBlKSB7CisgIH0KKworICAvLy8gXGJyaWVmIENhbGxiYWNrIGludm9rZWQgd2hlbmV2ZXIgYW4gaW5jbHVzaW9uIGRpcmVjdGl2ZSByZXN1bHRzIGluIGEKKyAgLy8vIGZpbGUtbm90LWZvdW5kIGVycm9yLgorICAvLy8KKyAgLy8vIFxwYXJhbSBGaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSBiZWluZyBpbmNsdWRlZCwgYXMgd3JpdHRlbiBpbiB0aGUgCisgIC8vLyBzb3VyY2UgY29kZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gUmVjb3ZlcnlQYXRoIElmIHRoaXMgY2xpZW50IGluZGljYXRlcyB0aGF0IGl0IGNhbiByZWNvdmVyIGZyb20gCisgIC8vLyB0aGlzIG1pc3NpbmcgZmlsZSwgdGhlIGNsaWVudCBzaG91bGQgc2V0IHRoaXMgYXMgYW4gYWRkaXRpb25hbCBoZWFkZXIKKyAgLy8vIHNlYXJjaCBwYXRjaC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIHByZXByb2Nlc3NvciBzaG91bGQgYXR0ZW1wdCB0byByZWNvdmVyCisgIC8vLyBieSBhZGRpbmcgXHAgUmVjb3ZlcnlQYXRoIGFzIGEgaGVhZGVyIHNlYXJjaCBwYXRoLgorICB2aXJ0dWFsIGJvb2wgRmlsZU5vdEZvdW5kKFN0cmluZ1JlZiBGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlJlY292ZXJ5UGF0aCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2FsbGJhY2sgaW52b2tlZCB3aGVuZXZlciBhbiBpbmNsdXNpb24gZGlyZWN0aXZlIG9mCisgIC8vLyBhbnkga2luZCAoXGMgXCNpbmNsdWRlLCBcYyBcI2ltcG9ydCwgZXRjLikgaGFzIGJlZW4gcHJvY2Vzc2VkLCByZWdhcmRsZXNzCisgIC8vLyBvZiB3aGV0aGVyIHRoZSBpbmNsdXNpb24gd2lsbCBhY3R1YWxseSByZXN1bHQgaW4gYW4gaW5jbHVzaW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBIYXNoTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgJyMnIHRoYXQgc3RhcnRzIHRoZSBpbmNsdXNpb24gCisgIC8vLyBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gXHBhcmFtIEluY2x1ZGVUb2sgVGhlIHRva2VuIHRoYXQgaW5kaWNhdGVzIHRoZSBraW5kIG9mIGluY2x1c2lvbiAKKyAgLy8vIGRpcmVjdGl2ZSwgZS5nLiwgJ2luY2x1ZGUnIG9yICdpbXBvcnQnLgorICAvLy8KKyAgLy8vIFxwYXJhbSBGaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSBiZWluZyBpbmNsdWRlZCwgYXMgd3JpdHRlbiBpbiB0aGUgCisgIC8vLyBzb3VyY2UgY29kZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gSXNBbmdsZWQgV2hldGhlciB0aGUgZmlsZSBuYW1lIHdhcyBlbmNsb3NlZCBpbiBhbmdsZSBicmFja2V0czsKKyAgLy8vIG90aGVyd2lzZSwgaXQgd2FzIGVuY2xvc2VkIGluIHF1b3Rlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gRmlsZW5hbWVSYW5nZSBUaGUgY2hhcmFjdGVyIHJhbmdlIG9mIHRoZSBxdW90ZXMgb3IgYW5nbGUgYnJhY2tldHMKKyAgLy8vIGZvciB0aGUgd3JpdHRlbiBmaWxlIG5hbWUuCisgIC8vLworICAvLy8gXHBhcmFtIEZpbGUgVGhlIGFjdHVhbCBmaWxlIHRoYXQgbWF5IGJlIGluY2x1ZGVkIGJ5IHRoaXMgaW5jbHVzaW9uIAorICAvLy8gZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTZWFyY2hQYXRoIENvbnRhaW5zIHRoZSBzZWFyY2ggcGF0aCB3aGljaCB3YXMgdXNlZCB0byBmaW5kIHRoZSBmaWxlCisgIC8vLyBpbiB0aGUgZmlsZSBzeXN0ZW0uIElmIHRoZSBmaWxlIHdhcyBmb3VuZCB2aWEgYW4gYWJzb2x1dGUgaW5jbHVkZSBwYXRoLAorICAvLy8gU2VhcmNoUGF0aCB3aWxsIGJlIGVtcHR5LiBGb3IgZnJhbWV3b3JrIGluY2x1ZGVzLCB0aGUgU2VhcmNoUGF0aCBhbmQKKyAgLy8vIFJlbGF0aXZlUGF0aCB3aWxsIGJlIHNwbGl0IHVwLiBGb3IgZXhhbXBsZSwgaWYgYW4gaW5jbHVkZSBvZiAiU29tZS9Tb21lLmgiCisgIC8vLyBpcyBmb3VuZCB2aWEgdGhlIGZyYW1ld29yayBwYXRoCisgIC8vLyAicGF0aC90by9GcmFtZXdvcmtzL1NvbWUuZnJhbWV3b3JrL0hlYWRlcnMvU29tZS5oIiwgU2VhcmNoUGF0aCB3aWxsIGJlCisgIC8vLyAicGF0aC90by9GcmFtZXdvcmtzL1NvbWUuZnJhbWV3b3JrL0hlYWRlcnMiIGFuZCBSZWxhdGl2ZVBhdGggd2lsbCBiZQorICAvLy8gIlNvbWUuaCIuCisgIC8vLworICAvLy8gXHBhcmFtIFJlbGF0aXZlUGF0aCBUaGUgcGF0aCByZWxhdGl2ZSB0byBTZWFyY2hQYXRoLCBhdCB3aGljaCB0aGUgaW5jbHVkZQorICAvLy8gZmlsZSB3YXMgZm91bmQuIFRoaXMgaXMgZXF1YWwgdG8gRmlsZU5hbWUgZXhjZXB0IGZvciBmcmFtZXdvcmsgaW5jbHVkZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEltcG9ydGVkIFRoZSBtb2R1bGUsIHdoZW5ldmVyIGFuIGluY2x1c2lvbiBkaXJlY3RpdmUgd2FzCisgIC8vLyBhdXRvbWF0aWNhbGx5IHR1cm5lZCBpbnRvIGEgbW9kdWxlIGltcG9ydCBvciBudWxsIG90aGVyd2lzZS4KKyAgLy8vCisgIHZpcnR1YWwgdm9pZCBJbmNsdXNpb25EaXJlY3RpdmUoU291cmNlTG9jYXRpb24gSGFzaExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUb2tlbiAmSW5jbHVkZVRvaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0FuZ2xlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU291cmNlUmFuZ2UgRmlsZW5hbWVSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRW50cnkgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNlYXJjaFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlbGF0aXZlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKkltcG9ydGVkKSB7CisgIH0KKworICAvLy8gXGJyaWVmIENhbGxiYWNrIGludm9rZWQgd2hlbmV2ZXIgdGhlcmUgd2FzIGFuIGV4cGxpY2l0IG1vZHVsZS1pbXBvcnQKKyAgLy8vIHN5bnRheC4KKyAgLy8vCisgIC8vLyBccGFyYW0gSW1wb3J0TG9jIFRoZSBsb2NhdGlvbiBvZiBpbXBvcnQgZGlyZWN0aXZlIHRva2VuLgorICAvLy8KKyAgLy8vIFxwYXJhbSBQYXRoIFRoZSBpZGVudGlmaWVycyAoYW5kIHRoZWlyIGxvY2F0aW9ucykgb2YgdGhlIG1vZHVsZQorICAvLy8gInBhdGgiLCBlLmcuLCAic3RkLnZlY3RvciIgd291bGQgYmUgc3BsaXQgaW50byAic3RkIiBhbmQgInZlY3RvciIuCisgIC8vLworICAvLy8gXHBhcmFtIEltcG9ydGVkIFRoZSBpbXBvcnRlZCBtb2R1bGU7IGNhbiBiZSBudWxsIGlmIGltcG9ydGluZyBmYWlsZWQuCisgIC8vLworICB2aXJ0dWFsIHZvaWQgbW9kdWxlSW1wb3J0KFNvdXJjZUxvY2F0aW9uIEltcG9ydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVJZFBhdGggUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKkltcG9ydGVkKSB7CisgIH0KKworICAvLy8gXGJyaWVmIENhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgZW5kIG9mIHRoZSBtYWluIGZpbGUgaXMgcmVhY2hlZC4KKyAgLy8vCisgIC8vLyBObyBzdWJzZXF1ZW50IGNhbGxiYWNrcyB3aWxsIGJlIG1hZGUuCisgIHZpcnR1YWwgdm9pZCBFbmRPZk1haW5GaWxlKCkgeworICB9CisKKyAgLy8vIFxicmllZiBDYWxsYmFjayBpbnZva2VkIHdoZW4gYSBcI2lkZW50IG9yIFwjc2NjcyBkaXJlY3RpdmUgaXMgcmVhZC4KKyAgLy8vIFxwYXJhbSBMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gc3RyIFRoZSB0ZXh0IG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLworICB2aXJ0dWFsIHZvaWQgSWRlbnQoU291cmNlTG9jYXRpb24gTG9jLCBTdHJpbmdSZWYgc3RyKSB7CisgIH0KKworICAvLy8gXGJyaWVmIENhbGxiYWNrIGludm9rZWQgd2hlbiBzdGFydCByZWFkaW5nIGFueSBwcmFnbWEgZGlyZWN0aXZlLgorICB2aXJ0dWFsIHZvaWQgUHJhZ21hRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyKSB7CisgIH0KKworICAvLy8gXGJyaWVmIENhbGxiYWNrIGludm9rZWQgd2hlbiBhIFwjcHJhZ21hIGNvbW1lbnQgZGlyZWN0aXZlIGlzIHJlYWQuCisgIHZpcnR1YWwgdm9pZCBQcmFnbWFDb21tZW50KFNvdXJjZUxvY2F0aW9uIExvYywgY29uc3QgSWRlbnRpZmllckluZm8gKktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTdHIpIHsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGEgXCNwcmFnbWEgZGV0ZWN0X21pc21hdGNoIGRpcmVjdGl2ZSBpcworICAvLy8gcmVhZC4KKyAgdmlydHVhbCB2b2lkIFByYWdtYURldGVjdE1pc21hdGNoKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVmFsdWUpIHsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGEgXCNwcmFnbWEgY2xhbmcgX19kZWJ1ZyBkaXJlY3RpdmUgaXMgcmVhZC4KKyAgLy8vIFxwYXJhbSBMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBkZWJ1ZyBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gRGVidWdUeXBlIFRoZSBpZGVudGlmaWVyIGZvbGxvd2luZyBfX2RlYnVnLgorICB2aXJ0dWFsIHZvaWQgUHJhZ21hRGVidWcoU291cmNlTG9jYXRpb24gTG9jLCBTdHJpbmdSZWYgRGVidWdUeXBlKSB7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZXMgdGhlIGtpbmQgb2YgXCNwcmFnbWEgaW52b2tpbmcgYSBjYWxsIHRvIFByYWdtYU1lc3NhZ2UuCisgIGVudW0gUHJhZ21hTWVzc2FnZUtpbmQgeworICAgIC8vLyBcYnJpZWYgXCNwcmFnbWEgbWVzc2FnZSBoYXMgYmVlbiBpbnZva2VkLgorICAgIFBNS19NZXNzYWdlLAorCisgICAgLy8vIFxicmllZiBcI3ByYWdtYSBHQ0Mgd2FybmluZyBoYXMgYmVlbiBpbnZva2VkLgorICAgIFBNS19XYXJuaW5nLAorCisgICAgLy8vIFxicmllZiBcI3ByYWdtYSBHQ0MgZXJyb3IgaGFzIGJlZW4gaW52b2tlZC4KKyAgICBQTUtfRXJyb3IKKyAgfTsKKworICAvLy8gXGJyaWVmIENhbGxiYWNrIGludm9rZWQgd2hlbiBhIFwjcHJhZ21hIG1lc3NhZ2UgZGlyZWN0aXZlIGlzIHJlYWQuCisgIC8vLyBccGFyYW0gTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gTmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIG1lc3NhZ2UgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIEtpbmQgVGhlIHR5cGUgb2YgdGhlIG1lc3NhZ2UgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIFN0ciBUaGUgdGV4dCBvZiB0aGUgbWVzc2FnZSBkaXJlY3RpdmUuCisgIHZpcnR1YWwgdm9pZCBQcmFnbWFNZXNzYWdlKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIE5hbWVzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJhZ21hTWVzc2FnZUtpbmQgS2luZCwgU3RyaW5nUmVmIFN0cikgeworICB9CisKKyAgLy8vIFxicmllZiBDYWxsYmFjayBpbnZva2VkIHdoZW4gYSBcI3ByYWdtYSBnY2MgZGlhZ25vc3RpYyBwdXNoIGRpcmVjdGl2ZQorICAvLy8gaXMgcmVhZC4KKyAgdmlydHVhbCB2b2lkIFByYWdtYURpYWdub3N0aWNQdXNoKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lc3BhY2UpIHsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGEgXCNwcmFnbWEgZ2NjIGRpYWdub3N0aWMgcG9wIGRpcmVjdGl2ZQorICAvLy8gaXMgcmVhZC4KKyAgdmlydHVhbCB2b2lkIFByYWdtYURpYWdub3N0aWNQb3AoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZXNwYWNlKSB7CisgIH0KKworICAvLy8gXGJyaWVmIENhbGxiYWNrIGludm9rZWQgd2hlbiBhIFwjcHJhZ21hIGdjYyBkaWFnbm9zdGljIGRpcmVjdGl2ZSBpcyByZWFkLgorICB2aXJ0dWFsIHZvaWQgUHJhZ21hRGlhZ25vc3RpYyhTb3VyY2VMb2NhdGlvbiBMb2MsIFN0cmluZ1JlZiBOYW1lc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWc6OlNldmVyaXR5IG1hcHBpbmcsIFN0cmluZ1JlZiBTdHIpIHt9CisKKyAgLy8vIFxicmllZiBDYWxsZWQgd2hlbiBhbiBPcGVuQ0wgZXh0ZW5zaW9uIGlzIGVpdGhlciBkaXNhYmxlZCBvcgorICAvLy8gZW5hYmxlZCB3aXRoIGEgcHJhZ21hLgorICB2aXJ0dWFsIHZvaWQgUHJhZ21hT3BlbkNMRXh0ZW5zaW9uKFNvdXJjZUxvY2F0aW9uIE5hbWVMb2MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElkZW50aWZpZXJJbmZvICpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXRlTG9jLCB1bnNpZ25lZCBTdGF0ZSkgeworICB9CisKKyAgLy8vIFxicmllZiBDYWxsYmFjayBpbnZva2VkIHdoZW4gYSBcI3ByYWdtYSB3YXJuaW5nIGRpcmVjdGl2ZSBpcyByZWFkLgorICB2aXJ0dWFsIHZvaWQgUHJhZ21hV2FybmluZyhTb3VyY2VMb2NhdGlvbiBMb2MsIFN0cmluZ1JlZiBXYXJuaW5nU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8aW50PiBJZHMpIHsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGEgXCNwcmFnbWEgd2FybmluZyhwdXNoKSBkaXJlY3RpdmUgaXMgcmVhZC4KKyAgdmlydHVhbCB2b2lkIFByYWdtYVdhcm5pbmdQdXNoKFNvdXJjZUxvY2F0aW9uIExvYywgaW50IExldmVsKSB7CisgIH0KKworICAvLy8gXGJyaWVmIENhbGxiYWNrIGludm9rZWQgd2hlbiBhIFwjcHJhZ21hIHdhcm5pbmcocG9wKSBkaXJlY3RpdmUgaXMgcmVhZC4KKyAgdmlydHVhbCB2b2lkIFByYWdtYVdhcm5pbmdQb3AoU291cmNlTG9jYXRpb24gTG9jKSB7CisgIH0KKworICAvLy8gXGJyaWVmIENhbGxiYWNrIGludm9rZWQgd2hlbiBhIFwjcHJhZ21hIGNsYW5nIGFzc3VtZV9ub25udWxsIGJlZ2luIGRpcmVjdGl2ZQorICAvLy8gaXMgcmVhZC4KKyAgdmlydHVhbCB2b2lkIFByYWdtYUFzc3VtZU5vbk51bGxCZWdpbihTb3VyY2VMb2NhdGlvbiBMb2MpIHt9CisKKyAgLy8vIFxicmllZiBDYWxsYmFjayBpbnZva2VkIHdoZW4gYSBcI3ByYWdtYSBjbGFuZyBhc3N1bWVfbm9ubnVsbCBlbmQgZGlyZWN0aXZlCisgIC8vLyBpcyByZWFkLgorICB2aXJ0dWFsIHZvaWQgUHJhZ21hQXNzdW1lTm9uTnVsbEVuZChTb3VyY2VMb2NhdGlvbiBMb2MpIHt9CisKKyAgLy8vIFxicmllZiBDYWxsZWQgYnkgUHJlcHJvY2Vzc29yOjpIYW5kbGVNYWNyb0V4cGFuZGVkSWRlbnRpZmllciB3aGVuIGEKKyAgLy8vIG1hY3JvIGludm9jYXRpb24gaXMgZm91bmQuCisgIHZpcnR1YWwgdm9pZCBNYWNyb0V4cGFuZHMoY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNyb0RlZmluaXRpb24gJk1ELCBTb3VyY2VSYW5nZSBSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNyb0FyZ3MgKkFyZ3MpIHt9CisKKyAgLy8vIFxicmllZiBIb29rIGNhbGxlZCB3aGVuZXZlciBhIG1hY3JvIGRlZmluaXRpb24gaXMgc2Vlbi4KKyAgdmlydHVhbCB2b2lkIE1hY3JvRGVmaW5lZChjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY3JvRGlyZWN0aXZlICpNRCkgeworICB9CisKKyAgLy8vIFxicmllZiBIb29rIGNhbGxlZCB3aGVuZXZlciBhIG1hY3JvIFwjdW5kZWYgaXMgc2Vlbi4KKyAgLy8vIFxwYXJhbSBNYWNyb05hbWVUb2sgVGhlIGFjdGl2ZSBUb2tlbgorICAvLy8gXHBhcmFtIE1EIEEgTWFjcm9EZWZpbml0aW9uIGZvciB0aGUgbmFtZWQgbWFjcm8uCisgIC8vLyBccGFyYW0gVW5kZWYgTmV3IE1hY3JvRGlyZWN0aXZlIGlmIHRoZSBtYWNybyB3YXMgZGVmaW5lZCwgbnVsbCBvdGhlcndpc2UuCisgIC8vLworICAvLy8gTUQgaXMgcmVsZWFzZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoaXMgY2FsbGJhY2suCisgIHZpcnR1YWwgdm9pZCBNYWNyb1VuZGVmaW5lZChjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjcm9EZWZpbml0aW9uICZNRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY3JvRGlyZWN0aXZlICpVbmRlZikgeworICB9CisgIAorICAvLy8gXGJyaWVmIEhvb2sgY2FsbGVkIHdoZW5ldmVyIHRoZSAnZGVmaW5lZCcgb3BlcmF0b3IgaXMgc2Vlbi4KKyAgLy8vIFxwYXJhbSBNRCBUaGUgTWFjcm9EaXJlY3RpdmUgaWYgdGhlIG5hbWUgd2FzIGEgbWFjcm8sIG51bGwgb3RoZXJ3aXNlLgorICB2aXJ0dWFsIHZvaWQgRGVmaW5lZChjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLCBjb25zdCBNYWNyb0RlZmluaXRpb24gJk1ELAorICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSYW5nZSkgeworICB9CisgIAorICAvLy8gXGJyaWVmIEhvb2sgY2FsbGVkIHdoZW4gYSBzb3VyY2UgcmFuZ2UgaXMgc2tpcHBlZC4KKyAgLy8vIFxwYXJhbSBSYW5nZSBUaGUgU291cmNlUmFuZ2UgdGhhdCB3YXMgc2tpcHBlZC4gVGhlIHJhbmdlIGJlZ2lucyBhdCB0aGUKKyAgLy8vIFwjaWYvXCNlbHNlIGRpcmVjdGl2ZSBhbmQgZW5kcyBhZnRlciB0aGUgXCNlbmRpZi9cI2Vsc2UgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIEVuZGlmTG9jIFRoZSBlbmQgbG9jYXRpb24gb2YgdGhlICdlbmRpZicgdG9rZW4sIHdoaWNoIG1heSBwcmVjZWRlCisgIC8vLyB0aGUgcmFuZ2Ugc2tpcHBlZCBieSB0aGUgZGlyZWN0aXZlIChlLmcgZXhjbHVkaW5nIGNvbW1lbnRzIGFmdGVyIGFuCisgIC8vLyAnZW5kaWYnKS4KKyAgdmlydHVhbCB2b2lkIFNvdXJjZVJhbmdlU2tpcHBlZChTb3VyY2VSYW5nZSBSYW5nZSwgU291cmNlTG9jYXRpb24gRW5kaWZMb2MpIHsKKyAgfQorCisgIGVudW0gQ29uZGl0aW9uVmFsdWVLaW5kIHsKKyAgICBDVktfTm90RXZhbHVhdGVkLCBDVktfRmFsc2UsIENWS19UcnVlCisgIH07CisKKyAgLy8vIFxicmllZiBIb29rIGNhbGxlZCB3aGVuZXZlciBhbiBcI2lmIGlzIHNlZW4uCisgIC8vLyBccGFyYW0gTG9jIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDb25kaXRpb25SYW5nZSBUaGUgU291cmNlUmFuZ2Ugb2YgdGhlIGV4cHJlc3Npb24gYmVpbmcgdGVzdGVkLgorICAvLy8gXHBhcmFtIENvbmRpdGlvblZhbHVlIFRoZSBldmFsdWF0ZWQgdmFsdWUgb2YgdGhlIGNvbmRpdGlvbi4KKyAgLy8vCisgIC8vIEZJWE1FOiBiZXR0ZXIgdG8gcGFzcyBpbiBhIGxpc3QgKG9yIHRyZWUhKSBvZiBUb2tlbnMuCisgIHZpcnR1YWwgdm9pZCBJZihTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZVJhbmdlIENvbmRpdGlvblJhbmdlLAorICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uVmFsdWVLaW5kIENvbmRpdGlvblZhbHVlKSB7CisgIH0KKworICAvLy8gXGJyaWVmIEhvb2sgY2FsbGVkIHdoZW5ldmVyIGFuIFwjZWxpZiBpcyBzZWVuLgorICAvLy8gXHBhcmFtIExvYyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ29uZGl0aW9uUmFuZ2UgVGhlIFNvdXJjZVJhbmdlIG9mIHRoZSBleHByZXNzaW9uIGJlaW5nIHRlc3RlZC4KKyAgLy8vIFxwYXJhbSBDb25kaXRpb25WYWx1ZSBUaGUgZXZhbHVhdGVkIHZhbHVlIG9mIHRoZSBjb25kaXRpb24uCisgIC8vLyBccGFyYW0gSWZMb2MgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgXCNpZi9cI2lmZGVmL1wjaWZuZGVmIGRpcmVjdGl2ZS4KKyAgLy8gRklYTUU6IGJldHRlciB0byBwYXNzIGluIGEgbGlzdCAob3IgdHJlZSEpIG9mIFRva2Vucy4KKyAgdmlydHVhbCB2b2lkIEVsaWYoU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VSYW5nZSBDb25kaXRpb25SYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uVmFsdWVLaW5kIENvbmRpdGlvblZhbHVlLCBTb3VyY2VMb2NhdGlvbiBJZkxvYykgeworICB9CisKKyAgLy8vIFxicmllZiBIb29rIGNhbGxlZCB3aGVuZXZlciBhbiBcI2lmZGVmIGlzIHNlZW4uCisgIC8vLyBccGFyYW0gTG9jIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBNYWNyb05hbWVUb2sgSW5mb3JtYXRpb24gb24gdGhlIHRva2VuIGJlaW5nIHRlc3RlZC4KKyAgLy8vIFxwYXJhbSBNRCBUaGUgTWFjcm9EZWZpbml0aW9uIGlmIHRoZSBuYW1lIHdhcyBhIG1hY3JvLCBudWxsIG90aGVyd2lzZS4KKyAgdmlydHVhbCB2b2lkIElmZGVmKFNvdXJjZUxvY2F0aW9uIExvYywgY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY3JvRGVmaW5pdGlvbiAmTUQpIHsKKyAgfQorCisgIC8vLyBcYnJpZWYgSG9vayBjYWxsZWQgd2hlbmV2ZXIgYW4gXCNpZm5kZWYgaXMgc2Vlbi4KKyAgLy8vIFxwYXJhbSBMb2MgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIE1hY3JvTmFtZVRvayBJbmZvcm1hdGlvbiBvbiB0aGUgdG9rZW4gYmVpbmcgdGVzdGVkLgorICAvLy8gXHBhcmFtIE1EIFRoZSBNYWNyb0RlZmluaXRvbiBpZiB0aGUgbmFtZSB3YXMgYSBtYWNybywgbnVsbCBvdGhlcndpc2UuCisgIHZpcnR1YWwgdm9pZCBJZm5kZWYoU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY3JvRGVmaW5pdGlvbiAmTUQpIHsKKyAgfQorCisgIC8vLyBcYnJpZWYgSG9vayBjYWxsZWQgd2hlbmV2ZXIgYW4gXCNlbHNlIGlzIHNlZW4uCisgIC8vLyBccGFyYW0gTG9jIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBJZkxvYyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBcI2lmL1wjaWZkZWYvXCNpZm5kZWYgZGlyZWN0aXZlLgorICB2aXJ0dWFsIHZvaWQgRWxzZShTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZUxvY2F0aW9uIElmTG9jKSB7CisgIH0KKworICAvLy8gXGJyaWVmIEhvb2sgY2FsbGVkIHdoZW5ldmVyIGFuIFwjZW5kaWYgaXMgc2Vlbi4KKyAgLy8vIFxwYXJhbSBMb2MgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIElmTG9jIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIFwjaWYvXCNpZmRlZi9cI2lmbmRlZiBkaXJlY3RpdmUuCisgIHZpcnR1YWwgdm9pZCBFbmRpZihTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZUxvY2F0aW9uIElmTG9jKSB7CisgIH0KK307CisKKy8vLyBcYnJpZWYgU2ltcGxlIHdyYXBwZXIgY2xhc3MgZm9yIGNoYWluaW5nIGNhbGxiYWNrcy4KK2NsYXNzIFBQQ2hhaW5lZENhbGxiYWNrcyA6IHB1YmxpYyBQUENhbGxiYWNrcyB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKyAgc3RkOjp1bmlxdWVfcHRyPFBQQ2FsbGJhY2tzPiBGaXJzdCwgU2Vjb25kOworCitwdWJsaWM6CisgIFBQQ2hhaW5lZENhbGxiYWNrcyhzdGQ6OnVuaXF1ZV9wdHI8UFBDYWxsYmFja3M+IF9GaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQUENhbGxiYWNrcz4gX1NlY29uZCkKKyAgICA6IEZpcnN0KHN0ZDo6bW92ZShfRmlyc3QpKSwgU2Vjb25kKHN0ZDo6bW92ZShfU2Vjb25kKSkge30KKworICB2b2lkIEZpbGVDaGFuZ2VkKFNvdXJjZUxvY2F0aW9uIExvYywgRmlsZUNoYW5nZVJlYXNvbiBSZWFzb24sCisgICAgICAgICAgICAgICAgICAgU3JjTWdyOjpDaGFyYWN0ZXJpc3RpY0tpbmQgRmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgRmlsZUlEIFByZXZGSUQpIG92ZXJyaWRlIHsKKyAgICBGaXJzdC0+RmlsZUNoYW5nZWQoTG9jLCBSZWFzb24sIEZpbGVUeXBlLCBQcmV2RklEKTsKKyAgICBTZWNvbmQtPkZpbGVDaGFuZ2VkKExvYywgUmVhc29uLCBGaWxlVHlwZSwgUHJldkZJRCk7CisgIH0KKworICB2b2lkIEZpbGVTa2lwcGVkKGNvbnN0IEZpbGVFbnRyeSAmU2tpcHBlZEZpbGUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgVG9rZW4gJkZpbGVuYW1lVG9rLAorICAgICAgICAgICAgICAgICAgIFNyY01ncjo6Q2hhcmFjdGVyaXN0aWNLaW5kIEZpbGVUeXBlKSBvdmVycmlkZSB7CisgICAgRmlyc3QtPkZpbGVTa2lwcGVkKFNraXBwZWRGaWxlLCBGaWxlbmFtZVRvaywgRmlsZVR5cGUpOworICAgIFNlY29uZC0+RmlsZVNraXBwZWQoU2tpcHBlZEZpbGUsIEZpbGVuYW1lVG9rLCBGaWxlVHlwZSk7CisgIH0KKworICBib29sIEZpbGVOb3RGb3VuZChTdHJpbmdSZWYgRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVjb3ZlcnlQYXRoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEZpcnN0LT5GaWxlTm90Rm91bmQoRmlsZU5hbWUsIFJlY292ZXJ5UGF0aCkgfHwKKyAgICAgICAgICAgU2Vjb25kLT5GaWxlTm90Rm91bmQoRmlsZU5hbWUsIFJlY292ZXJ5UGF0aCk7CisgIH0KKworICB2b2lkIEluY2x1c2lvbkRpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBIYXNoTG9jLCBjb25zdCBUb2tlbiAmSW5jbHVkZVRvaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVOYW1lLCBib29sIElzQW5nbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU291cmNlUmFuZ2UgRmlsZW5hbWVSYW5nZSwgY29uc3QgRmlsZUVudHJ5ICpGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VhcmNoUGF0aCwgU3RyaW5nUmVmIFJlbGF0aXZlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTW9kdWxlICpJbXBvcnRlZCkgb3ZlcnJpZGUgeworICAgIEZpcnN0LT5JbmNsdXNpb25EaXJlY3RpdmUoSGFzaExvYywgSW5jbHVkZVRvaywgRmlsZU5hbWUsIElzQW5nbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWVSYW5nZSwgRmlsZSwgU2VhcmNoUGF0aCwgUmVsYXRpdmVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0ZWQpOworICAgIFNlY29uZC0+SW5jbHVzaW9uRGlyZWN0aXZlKEhhc2hMb2MsIEluY2x1ZGVUb2ssIEZpbGVOYW1lLCBJc0FuZ2xlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZVJhbmdlLCBGaWxlLCBTZWFyY2hQYXRoLCBSZWxhdGl2ZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0ZWQpOworICB9CisKKyAgdm9pZCBtb2R1bGVJbXBvcnQoU291cmNlTG9jYXRpb24gSW1wb3J0TG9jLCBNb2R1bGVJZFBhdGggUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgTW9kdWxlICpJbXBvcnRlZCkgb3ZlcnJpZGUgeworICAgIEZpcnN0LT5tb2R1bGVJbXBvcnQoSW1wb3J0TG9jLCBQYXRoLCBJbXBvcnRlZCk7CisgICAgU2Vjb25kLT5tb2R1bGVJbXBvcnQoSW1wb3J0TG9jLCBQYXRoLCBJbXBvcnRlZCk7CisgIH0KKworICB2b2lkIEVuZE9mTWFpbkZpbGUoKSBvdmVycmlkZSB7CisgICAgRmlyc3QtPkVuZE9mTWFpbkZpbGUoKTsKKyAgICBTZWNvbmQtPkVuZE9mTWFpbkZpbGUoKTsKKyAgfQorCisgIHZvaWQgSWRlbnQoU291cmNlTG9jYXRpb24gTG9jLCBTdHJpbmdSZWYgc3RyKSBvdmVycmlkZSB7CisgICAgRmlyc3QtPklkZW50KExvYywgc3RyKTsKKyAgICBTZWNvbmQtPklkZW50KExvYywgc3RyKTsKKyAgfQorCisgIHZvaWQgUHJhZ21hRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlcikgb3ZlcnJpZGUgeworICAgIEZpcnN0LT5QcmFnbWFEaXJlY3RpdmUoTG9jLCBJbnRyb2R1Y2VyKTsKKyAgICBTZWNvbmQtPlByYWdtYURpcmVjdGl2ZShMb2MsIEludHJvZHVjZXIpOworICB9CisKKyAgdm9pZCBQcmFnbWFDb21tZW50KFNvdXJjZUxvY2F0aW9uIExvYywgY29uc3QgSWRlbnRpZmllckluZm8gKktpbmQsCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU3RyKSBvdmVycmlkZSB7CisgICAgRmlyc3QtPlByYWdtYUNvbW1lbnQoTG9jLCBLaW5kLCBTdHIpOworICAgIFNlY29uZC0+UHJhZ21hQ29tbWVudChMb2MsIEtpbmQsIFN0cik7CisgIH0KKworICB2b2lkIFByYWdtYURldGVjdE1pc21hdGNoKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFZhbHVlKSBvdmVycmlkZSB7CisgICAgRmlyc3QtPlByYWdtYURldGVjdE1pc21hdGNoKExvYywgTmFtZSwgVmFsdWUpOworICAgIFNlY29uZC0+UHJhZ21hRGV0ZWN0TWlzbWF0Y2goTG9jLCBOYW1lLCBWYWx1ZSk7CisgIH0KKworICB2b2lkIFByYWdtYURlYnVnKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIERlYnVnVHlwZSkgb3ZlcnJpZGUgeworICAgIEZpcnN0LT5QcmFnbWFEZWJ1ZyhMb2MsIERlYnVnVHlwZSk7CisgICAgU2Vjb25kLT5QcmFnbWFEZWJ1ZyhMb2MsIERlYnVnVHlwZSk7CisgIH0KKworICB2b2lkIFByYWdtYU1lc3NhZ2UoU291cmNlTG9jYXRpb24gTG9jLCBTdHJpbmdSZWYgTmFtZXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgUHJhZ21hTWVzc2FnZUtpbmQgS2luZCwgU3RyaW5nUmVmIFN0cikgb3ZlcnJpZGUgeworICAgIEZpcnN0LT5QcmFnbWFNZXNzYWdlKExvYywgTmFtZXNwYWNlLCBLaW5kLCBTdHIpOworICAgIFNlY29uZC0+UHJhZ21hTWVzc2FnZShMb2MsIE5hbWVzcGFjZSwgS2luZCwgU3RyKTsKKyAgfQorCisgIHZvaWQgUHJhZ21hRGlhZ25vc3RpY1B1c2goU291cmNlTG9jYXRpb24gTG9jLCBTdHJpbmdSZWYgTmFtZXNwYWNlKSBvdmVycmlkZSB7CisgICAgRmlyc3QtPlByYWdtYURpYWdub3N0aWNQdXNoKExvYywgTmFtZXNwYWNlKTsKKyAgICBTZWNvbmQtPlByYWdtYURpYWdub3N0aWNQdXNoKExvYywgTmFtZXNwYWNlKTsKKyAgfQorCisgIHZvaWQgUHJhZ21hRGlhZ25vc3RpY1BvcChTb3VyY2VMb2NhdGlvbiBMb2MsIFN0cmluZ1JlZiBOYW1lc3BhY2UpIG92ZXJyaWRlIHsKKyAgICBGaXJzdC0+UHJhZ21hRGlhZ25vc3RpY1BvcChMb2MsIE5hbWVzcGFjZSk7CisgICAgU2Vjb25kLT5QcmFnbWFEaWFnbm9zdGljUG9wKExvYywgTmFtZXNwYWNlKTsKKyAgfQorCisgIHZvaWQgUHJhZ21hRGlhZ25vc3RpYyhTb3VyY2VMb2NhdGlvbiBMb2MsIFN0cmluZ1JlZiBOYW1lc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjpTZXZlcml0eSBtYXBwaW5nLCBTdHJpbmdSZWYgU3RyKSBvdmVycmlkZSB7CisgICAgRmlyc3QtPlByYWdtYURpYWdub3N0aWMoTG9jLCBOYW1lc3BhY2UsIG1hcHBpbmcsIFN0cik7CisgICAgU2Vjb25kLT5QcmFnbWFEaWFnbm9zdGljKExvYywgTmFtZXNwYWNlLCBtYXBwaW5nLCBTdHIpOworICB9CisKKyAgdm9pZCBQcmFnbWFPcGVuQ0xFeHRlbnNpb24oU291cmNlTG9jYXRpb24gTmFtZUxvYywgY29uc3QgSWRlbnRpZmllckluZm8gKk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXRlTG9jLCB1bnNpZ25lZCBTdGF0ZSkgb3ZlcnJpZGUgeworICAgIEZpcnN0LT5QcmFnbWFPcGVuQ0xFeHRlbnNpb24oTmFtZUxvYywgTmFtZSwgU3RhdGVMb2MsIFN0YXRlKTsKKyAgICBTZWNvbmQtPlByYWdtYU9wZW5DTEV4dGVuc2lvbihOYW1lTG9jLCBOYW1lLCBTdGF0ZUxvYywgU3RhdGUpOworICB9CisKKyAgdm9pZCBQcmFnbWFXYXJuaW5nKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIFdhcm5pbmdTcGVjLAorICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8aW50PiBJZHMpIG92ZXJyaWRlIHsKKyAgICBGaXJzdC0+UHJhZ21hV2FybmluZyhMb2MsIFdhcm5pbmdTcGVjLCBJZHMpOworICAgIFNlY29uZC0+UHJhZ21hV2FybmluZyhMb2MsIFdhcm5pbmdTcGVjLCBJZHMpOworICB9CisKKyAgdm9pZCBQcmFnbWFXYXJuaW5nUHVzaChTb3VyY2VMb2NhdGlvbiBMb2MsIGludCBMZXZlbCkgb3ZlcnJpZGUgeworICAgIEZpcnN0LT5QcmFnbWFXYXJuaW5nUHVzaChMb2MsIExldmVsKTsKKyAgICBTZWNvbmQtPlByYWdtYVdhcm5pbmdQdXNoKExvYywgTGV2ZWwpOworICB9CisKKyAgdm9pZCBQcmFnbWFXYXJuaW5nUG9wKFNvdXJjZUxvY2F0aW9uIExvYykgb3ZlcnJpZGUgeworICAgIEZpcnN0LT5QcmFnbWFXYXJuaW5nUG9wKExvYyk7CisgICAgU2Vjb25kLT5QcmFnbWFXYXJuaW5nUG9wKExvYyk7CisgIH0KKworICB2b2lkIFByYWdtYUFzc3VtZU5vbk51bGxCZWdpbihTb3VyY2VMb2NhdGlvbiBMb2MpIG92ZXJyaWRlIHsKKyAgICBGaXJzdC0+UHJhZ21hQXNzdW1lTm9uTnVsbEJlZ2luKExvYyk7CisgICAgU2Vjb25kLT5QcmFnbWFBc3N1bWVOb25OdWxsQmVnaW4oTG9jKTsKKyAgfQorCisgIHZvaWQgUHJhZ21hQXNzdW1lTm9uTnVsbEVuZChTb3VyY2VMb2NhdGlvbiBMb2MpIG92ZXJyaWRlIHsKKyAgICBGaXJzdC0+UHJhZ21hQXNzdW1lTm9uTnVsbEVuZChMb2MpOworICAgIFNlY29uZC0+UHJhZ21hQXNzdW1lTm9uTnVsbEVuZChMb2MpOworICB9CisKKyAgdm9pZCBNYWNyb0V4cGFuZHMoY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywgY29uc3QgTWFjcm9EZWZpbml0aW9uICZNRCwKKyAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgUmFuZ2UsIGNvbnN0IE1hY3JvQXJncyAqQXJncykgb3ZlcnJpZGUgeworICAgIEZpcnN0LT5NYWNyb0V4cGFuZHMoTWFjcm9OYW1lVG9rLCBNRCwgUmFuZ2UsIEFyZ3MpOworICAgIFNlY29uZC0+TWFjcm9FeHBhbmRzKE1hY3JvTmFtZVRvaywgTUQsIFJhbmdlLCBBcmdzKTsKKyAgfQorCisgIHZvaWQgTWFjcm9EZWZpbmVkKGNvbnN0IFRva2VuICZNYWNyb05hbWVUb2ssCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY3JvRGlyZWN0aXZlICpNRCkgb3ZlcnJpZGUgeworICAgIEZpcnN0LT5NYWNyb0RlZmluZWQoTWFjcm9OYW1lVG9rLCBNRCk7CisgICAgU2Vjb25kLT5NYWNyb0RlZmluZWQoTWFjcm9OYW1lVG9rLCBNRCk7CisgIH0KKworICB2b2lkIE1hY3JvVW5kZWZpbmVkKGNvbnN0IFRva2VuICZNYWNyb05hbWVUb2ssCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjcm9EZWZpbml0aW9uICZNRCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNyb0RpcmVjdGl2ZSAqVW5kZWYpIG92ZXJyaWRlIHsKKyAgICBGaXJzdC0+TWFjcm9VbmRlZmluZWQoTWFjcm9OYW1lVG9rLCBNRCwgVW5kZWYpOworICAgIFNlY29uZC0+TWFjcm9VbmRlZmluZWQoTWFjcm9OYW1lVG9rLCBNRCwgVW5kZWYpOworICB9CisKKyAgdm9pZCBEZWZpbmVkKGNvbnN0IFRva2VuICZNYWNyb05hbWVUb2ssIGNvbnN0IE1hY3JvRGVmaW5pdGlvbiAmTUQsCisgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSYW5nZSkgb3ZlcnJpZGUgeworICAgIEZpcnN0LT5EZWZpbmVkKE1hY3JvTmFtZVRvaywgTUQsIFJhbmdlKTsKKyAgICBTZWNvbmQtPkRlZmluZWQoTWFjcm9OYW1lVG9rLCBNRCwgUmFuZ2UpOworICB9CisKKyAgdm9pZCBTb3VyY2VSYW5nZVNraXBwZWQoU291cmNlUmFuZ2UgUmFuZ2UsIFNvdXJjZUxvY2F0aW9uIEVuZGlmTG9jKSBvdmVycmlkZSB7CisgICAgRmlyc3QtPlNvdXJjZVJhbmdlU2tpcHBlZChSYW5nZSwgRW5kaWZMb2MpOworICAgIFNlY29uZC0+U291cmNlUmFuZ2VTa2lwcGVkKFJhbmdlLCBFbmRpZkxvYyk7CisgIH0KKworICAvLy8gXGJyaWVmIEhvb2sgY2FsbGVkIHdoZW5ldmVyIGFuIFwjaWYgaXMgc2Vlbi4KKyAgdm9pZCBJZihTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZVJhbmdlIENvbmRpdGlvblJhbmdlLAorICAgICAgICAgIENvbmRpdGlvblZhbHVlS2luZCBDb25kaXRpb25WYWx1ZSkgb3ZlcnJpZGUgeworICAgIEZpcnN0LT5JZihMb2MsIENvbmRpdGlvblJhbmdlLCBDb25kaXRpb25WYWx1ZSk7CisgICAgU2Vjb25kLT5JZihMb2MsIENvbmRpdGlvblJhbmdlLCBDb25kaXRpb25WYWx1ZSk7CisgIH0KKworICAvLy8gXGJyaWVmIEhvb2sgY2FsbGVkIHdoZW5ldmVyIGFuIFwjZWxpZiBpcyBzZWVuLgorICB2b2lkIEVsaWYoU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VSYW5nZSBDb25kaXRpb25SYW5nZSwKKyAgICAgICAgICAgIENvbmRpdGlvblZhbHVlS2luZCBDb25kaXRpb25WYWx1ZSwgU291cmNlTG9jYXRpb24gSWZMb2MpIG92ZXJyaWRlIHsKKyAgICBGaXJzdC0+RWxpZihMb2MsIENvbmRpdGlvblJhbmdlLCBDb25kaXRpb25WYWx1ZSwgSWZMb2MpOworICAgIFNlY29uZC0+RWxpZihMb2MsIENvbmRpdGlvblJhbmdlLCBDb25kaXRpb25WYWx1ZSwgSWZMb2MpOworICB9CisKKyAgLy8vIFxicmllZiBIb29rIGNhbGxlZCB3aGVuZXZlciBhbiBcI2lmZGVmIGlzIHNlZW4uCisgIHZvaWQgSWZkZWYoU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAorICAgICAgICAgICAgIGNvbnN0IE1hY3JvRGVmaW5pdGlvbiAmTUQpIG92ZXJyaWRlIHsKKyAgICBGaXJzdC0+SWZkZWYoTG9jLCBNYWNyb05hbWVUb2ssIE1EKTsKKyAgICBTZWNvbmQtPklmZGVmKExvYywgTWFjcm9OYW1lVG9rLCBNRCk7CisgIH0KKworICAvLy8gXGJyaWVmIEhvb2sgY2FsbGVkIHdoZW5ldmVyIGFuIFwjaWZuZGVmIGlzIHNlZW4uCisgIHZvaWQgSWZuZGVmKFNvdXJjZUxvY2F0aW9uIExvYywgY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywKKyAgICAgICAgICAgICAgY29uc3QgTWFjcm9EZWZpbml0aW9uICZNRCkgb3ZlcnJpZGUgeworICAgIEZpcnN0LT5JZm5kZWYoTG9jLCBNYWNyb05hbWVUb2ssIE1EKTsKKyAgICBTZWNvbmQtPklmbmRlZihMb2MsIE1hY3JvTmFtZVRvaywgTUQpOworICB9CisKKyAgLy8vIFxicmllZiBIb29rIGNhbGxlZCB3aGVuZXZlciBhbiBcI2Vsc2UgaXMgc2Vlbi4KKyAgdm9pZCBFbHNlKFNvdXJjZUxvY2F0aW9uIExvYywgU291cmNlTG9jYXRpb24gSWZMb2MpIG92ZXJyaWRlIHsKKyAgICBGaXJzdC0+RWxzZShMb2MsIElmTG9jKTsKKyAgICBTZWNvbmQtPkVsc2UoTG9jLCBJZkxvYyk7CisgIH0KKworICAvLy8gXGJyaWVmIEhvb2sgY2FsbGVkIHdoZW5ldmVyIGFuIFwjZW5kaWYgaXMgc2Vlbi4KKyAgdm9pZCBFbmRpZihTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZUxvY2F0aW9uIElmTG9jKSBvdmVycmlkZSB7CisgICAgRmlyc3QtPkVuZGlmKExvYywgSWZMb2MpOworICAgIFNlY29uZC0+RW5kaWYoTG9jLCBJZkxvYyk7CisgIH0KK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvUFBDb25kaXRpb25hbERpcmVjdGl2ZVJlY29yZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L1BQQ29uZGl0aW9uYWxEaXJlY3RpdmVSZWNvcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzUyMjc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L1BQQ29uZGl0aW9uYWxEaXJlY3RpdmVSZWNvcmQuaApAQCAtMCwwICsxLDEwMyBAQAorLy89PT0tLS0gUFBDb25kaXRpb25hbERpcmVjdGl2ZVJlY29yZC5oIC0gUHJlcHJvY2Vzc2luZyBEaXJlY3RpdmVzLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIFBQQ29uZGl0aW9uYWxEaXJlY3RpdmVSZWNvcmQgY2xhc3MsIHdoaWNoIG1haW50YWlucworLy8gIGEgcmVjb3JkIG9mIGNvbmRpdGlvbmFsIGRpcmVjdGl2ZSByZWdpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fQ0xBTkdfTEVYX1BQQ09ORElUSU9OQUxESVJFQ1RJVkVSRUNPUkRfSAorI2RlZmluZSBMTFZNX0NMQU5HX0xFWF9QUENPTkRJVElPTkFMRElSRUNUSVZFUkVDT1JEX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L1BQQ2FsbGJhY2tzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CisgIAorLy8vIFxicmllZiBSZWNvcmRzIHByZXByb2Nlc3NvciBjb25kaXRpb25hbCBkaXJlY3RpdmUgcmVnaW9ucyBhbmQgYWxsb3dzCisvLy8gcXVlcnlpbmcgaW4gd2hpY2ggcmVnaW9uIHNvdXJjZSBsb2NhdGlvbnMgYmVsb25nIHRvLgorY2xhc3MgUFBDb25kaXRpb25hbERpcmVjdGl2ZVJlY29yZCA6IHB1YmxpYyBQUENhbGxiYWNrcyB7CisgIFNvdXJjZU1hbmFnZXIgJlNvdXJjZU1ncjsKKyAgCisgIFNtYWxsVmVjdG9yPFNvdXJjZUxvY2F0aW9uLCA2PiBDb25kRGlyZWN0aXZlU3RhY2s7CisKKyAgY2xhc3MgQ29uZERpcmVjdGl2ZUxvYyB7CisgICAgU291cmNlTG9jYXRpb24gTG9jOworICAgIFNvdXJjZUxvY2F0aW9uIFJlZ2lvbkxvYzsKKworICBwdWJsaWM6CisgICAgQ29uZERpcmVjdGl2ZUxvYyhTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZUxvY2F0aW9uIFJlZ2lvbkxvYykKKyAgICAgIDogTG9jKExvYyksIFJlZ2lvbkxvYyhSZWdpb25Mb2MpIHt9CisKKyAgICBTb3VyY2VMb2NhdGlvbiBnZXRMb2MoKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKyAgICBTb3VyY2VMb2NhdGlvbiBnZXRSZWdpb25Mb2MoKSBjb25zdCB7IHJldHVybiBSZWdpb25Mb2M7IH0KKworICAgIGNsYXNzIENvbXAgeworICAgICAgU291cmNlTWFuYWdlciAmU007CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQgQ29tcChTb3VyY2VNYW5hZ2VyICZTTSkgOiBTTShTTSkge30KKyAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBDb25kRGlyZWN0aXZlTG9jICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uZERpcmVjdGl2ZUxvYyAmUkhTKSB7CisgICAgICAgIHJldHVybiBTTS5pc0JlZm9yZUluVHJhbnNsYXRpb25Vbml0KExIUy5nZXRMb2MoKSwgUkhTLmdldExvYygpKTsKKyAgICAgIH0KKyAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBDb25kRGlyZWN0aXZlTG9jICZMSFMsIFNvdXJjZUxvY2F0aW9uIFJIUykgeworICAgICAgICByZXR1cm4gU00uaXNCZWZvcmVJblRyYW5zbGF0aW9uVW5pdChMSFMuZ2V0TG9jKCksIFJIUyk7CisgICAgICB9CisgICAgICBib29sIG9wZXJhdG9yKCkoU291cmNlTG9jYXRpb24gTEhTLCBjb25zdCBDb25kRGlyZWN0aXZlTG9jICZSSFMpIHsKKyAgICAgICAgcmV0dXJuIFNNLmlzQmVmb3JlSW5UcmFuc2xhdGlvblVuaXQoTEhTLCBSSFMuZ2V0TG9jKCkpOworICAgICAgfQorICAgIH07CisgIH07CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxDb25kRGlyZWN0aXZlTG9jPiBDb25kRGlyZWN0aXZlTG9jc1R5OworICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbnMgb2YgY29uZGl0aW9uYWwgZGlyZWN0aXZlcyBpbiBzb3VyY2Ugb3JkZXIuCisgIENvbmREaXJlY3RpdmVMb2NzVHkgQ29uZERpcmVjdGl2ZUxvY3M7CisKKyAgdm9pZCBhZGRDb25kRGlyZWN0aXZlTG9jKENvbmREaXJlY3RpdmVMb2MgRGlyTG9jKTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIG5ldyBwcmVwcm9jZXNzaW5nIHJlY29yZC4KKyAgZXhwbGljaXQgUFBDb25kaXRpb25hbERpcmVjdGl2ZVJlY29yZChTb3VyY2VNYW5hZ2VyICZTTSk7CisKKyAgc2l6ZV90IGdldFRvdGFsTWVtb3J5KCkgY29uc3Q7CisKKyAgU291cmNlTWFuYWdlciAmZ2V0U291cmNlTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZU1ncjsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiByYW5nZSBpbnRlcnNlY3RzIHdpdGggYSBjb25kaXRpb25hbAorICAvLy8gZGlyZWN0aXZlLiBpZiBhIFwjaWYvXCNlbmRpZiBibG9jayBpcyBmdWxseSBjb250YWluZWQgd2l0aGluIHRoZSByYW5nZSwKKyAgLy8vIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UuCisgIGJvb2wgcmFuZ2VJbnRlcnNlY3RzQ29uZGl0aW9uYWxEaXJlY3RpdmUoU291cmNlUmFuZ2UgUmFuZ2UpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBsb2NhdGlvbnMgYXJlIGluIGRpZmZlcmVudCByZWdpb25zLAorICAvLy8gc2VwYXJhdGVkIGJ5IGNvbmRpdGlvbmFsIGRpcmVjdGl2ZSBibG9ja3MuCisgIGJvb2wgYXJlSW5EaWZmZXJlbnRDb25kaXRpb25hbERpcmVjdGl2ZVJlZ2lvbihTb3VyY2VMb2NhdGlvbiBMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gZmluZENvbmRpdGlvbmFsRGlyZWN0aXZlUmVnaW9uTG9jKExIUykgIT0KKyAgICAgICAgZmluZENvbmRpdGlvbmFsRGlyZWN0aXZlUmVnaW9uTG9jKFJIUyk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBmaW5kQ29uZGl0aW9uYWxEaXJlY3RpdmVSZWdpb25Mb2MoU291cmNlTG9jYXRpb24gTG9jKSBjb25zdDsKKworcHJpdmF0ZToKKyAgdm9pZCBJZihTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZVJhbmdlIENvbmRpdGlvblJhbmdlLAorICAgICAgICAgIENvbmRpdGlvblZhbHVlS2luZCBDb25kaXRpb25WYWx1ZSkgb3ZlcnJpZGU7CisgIHZvaWQgRWxpZihTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZVJhbmdlIENvbmRpdGlvblJhbmdlLAorICAgICAgICAgICAgQ29uZGl0aW9uVmFsdWVLaW5kIENvbmRpdGlvblZhbHVlLCBTb3VyY2VMb2NhdGlvbiBJZkxvYykgb3ZlcnJpZGU7CisgIHZvaWQgSWZkZWYoU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAorICAgICAgICAgICAgIGNvbnN0IE1hY3JvRGVmaW5pdGlvbiAmTUQpIG92ZXJyaWRlOworICB2b2lkIElmbmRlZihTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IFRva2VuICZNYWNyb05hbWVUb2ssCisgICAgICAgICAgICAgIGNvbnN0IE1hY3JvRGVmaW5pdGlvbiAmTUQpIG92ZXJyaWRlOworICB2b2lkIEVsc2UoU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VMb2NhdGlvbiBJZkxvYykgb3ZlcnJpZGU7CisgIHZvaWQgRW5kaWYoU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VMb2NhdGlvbiBJZkxvYykgb3ZlcnJpZGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfTEVYX1BQQ09ORElUSU9OQUxESVJFQ1RJVkVSRUNPUkRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L1BUSExleGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvUFRITGV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTIyYTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L1BUSExleGVyLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8vPT09LSBQVEhMZXhlci5oIC0gTGV4ZXIgYmFzZWQgb24gUHJlLXRva2VuaXplZCBpbnB1dCAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFBUSExleGVyIGludGVyZmFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfTEVYX1BUSExFWEVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19MRVhfUFRITEVYRVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Ub2tlbktpbmRzLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L1ByZXByb2Nlc3NvckxleGVyLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L1Rva2VuLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIFByZXByb2Nlc3NvcjsKK2NsYXNzIFBUSE1hbmFnZXI7CisKK2NsYXNzIFBUSExleGVyIDogcHVibGljIFByZXByb2Nlc3NvckxleGVyIHsKKyAgU291cmNlTG9jYXRpb24gRmlsZVN0YXJ0TG9jOworCisgIC8vLyBUb2tCdWYgLSBCdWZmZXIgZnJvbSBQVEggZmlsZSBjb250YWluaW5nIHJhdyB0b2tlbiBkYXRhLgorICBjb25zdCB1bnNpZ25lZCBjaGFyKiBUb2tCdWY7CisKKyAgLy8vIEN1clB0ciAtIFBvaW50ZXIgaW50byBjdXJyZW50IG9mZnNldCBvZiB0aGUgdG9rZW4gYnVmZmVyIHdoZXJlCisgIC8vLyAgdGhlIG5leHQgdG9rZW4gd2lsbCBiZSByZWFkLgorICBjb25zdCB1bnNpZ25lZCBjaGFyKiBDdXJQdHI7CisKKyAgLy8vIExhc3RIYXNoVG9rUHRyIC0gUG9pbnRlciBpbnRvIFRva0J1ZiBvZiB0aGUgbGFzdCBwcm9jZXNzZWQgJyMnCisgIC8vLyAgdG9rZW4gdGhhdCBhcHBlYXJzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIExhc3RIYXNoVG9rUHRyID0gbnVsbHB0cjsKKworICAvLy8gUFBDb25kIC0gUG9pbnRlciB0byBhIHNpZGUgdGFibGUgaW4gdGhlIFBUSCBmaWxlIHRoYXQgcHJvdmlkZXMgYQorICAvLy8gIGEgY29uY2lzZSBzdW1tYXJ5IG9mIHRoZSBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWwgYmxvY2sgc3RydWN0dXJlLgorICAvLy8gIFRoaXMgaXMgdXNlZCB0byBwZXJmb3JtIHF1aWNrIHNraXBwaW5nIG9mIGNvbmRpdGlvbmFsIGJsb2Nrcy4KKyAgY29uc3QgdW5zaWduZWQgY2hhciogUFBDb25kOworCisgIC8vLyBDdXJQUENvbmRQdHIgLSBQb2ludGVyIGluc2lkZSBQUENvbmQgdGhhdCByZWZlcnMgdG8gdGhlIG5leHQgZW50cnkKKyAgLy8vICB0byBwcm9jZXNzIHdoZW4gZG9pbmcgcXVpY2sgc2tpcHBpbmcgb2YgcHJlcHJvY2Vzc29yIGJsb2Nrcy4KKyAgY29uc3QgdW5zaWduZWQgY2hhciogQ3VyUFBDb25kUHRyOworCisgIC8vLyBSZWFkVG9rZW4gLSBVc2VkIGJ5IFBUSExleGVyIHRvIHJlYWQgdG9rZW5zIFRva0J1Zi4KKyAgdm9pZCBSZWFkVG9rZW4oVG9rZW4gJlQpOworICAKKyAgYm9vbCBMZXhFbmRPZkZpbGUoVG9rZW4gJlJlc3VsdCk7CisKKyAgLy8vIFBUSE1nciAtIFRoZSBQVEhNYW5hZ2VyIG9iamVjdCB0aGF0IGNyZWF0ZWQgdGhpcyBQVEhMZXhlci4KKyAgUFRITWFuYWdlciYgUFRITWdyOworCisgIFRva2VuIEVvZlRva2VuOworCitwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBQVEhNYW5hZ2VyOworCisgIC8vLyBDcmVhdGUgYSBQVEhMZXhlciBmb3IgdGhlIHNwZWNpZmllZCB0b2tlbiBzdHJlYW0uCisgIFBUSExleGVyKFByZXByb2Nlc3NvciAmcHAsIEZpbGVJRCBGSUQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKkQsCisgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHBwY29uZCwgUFRITWFuYWdlciAmUE0pOworCitwdWJsaWM6CisgIFBUSExleGVyKGNvbnN0IFBUSExleGVyICYpID0gZGVsZXRlOworICBQVEhMZXhlciAmb3BlcmF0b3I9KGNvbnN0IFBUSExleGVyICYpID0gZGVsZXRlOworICB+UFRITGV4ZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgLy8vIExleCAtIFJldHVybiB0aGUgbmV4dCB0b2tlbi4KKyAgYm9vbCBMZXgoVG9rZW4gJlRvayk7CisKKyAgdm9pZCBnZXRFT0YoVG9rZW4gJlRvayk7CisKKyAgLy8vIERpc2NhcmRUb0VuZE9mTGluZSAtIFJlYWQgdGhlIHJlc3Qgb2YgdGhlIGN1cnJlbnQgcHJlcHJvY2Vzc29yIGxpbmUgYXMgYW4KKyAgLy8vIHVuaW50ZXJwcmV0ZWQgc3RyaW5nLiAgVGhpcyBzd2l0Y2hlcyB0aGUgbGV4ZXIgb3V0IG9mIGRpcmVjdGl2ZSBtb2RlLgorICB2b2lkIERpc2NhcmRUb0VuZE9mTGluZSgpOworCisgIC8vLyBpc05leHRQUFRva2VuTFBhcmVuIC0gUmV0dXJuIDEgaWYgdGhlIG5leHQgdW5leHBhbmRlZCB0b2tlbiB3aWxsIHJldHVybiBhCisgIC8vLyB0b2s6OmxfcGFyZW4gdG9rZW4sIDAgaWYgaXQgaXMgc29tZXRoaW5nIGVsc2UgYW5kIDIgaWYgdGhlcmUgYXJlIG5vIG1vcmUKKyAgLy8vIHRva2VucyBjb250cm9sbGVkIGJ5IHRoaXMgbGV4ZXIuCisgIHVuc2lnbmVkIGlzTmV4dFBQVG9rZW5MUGFyZW4oKSB7CisgICAgLy8gaXNOZXh0UFBUb2tlbkxQYXJlbiBpcyBub3Qgb24gdGhlIGhvdCBwYXRoLCBhbmQgYWxsIHdlIGNhcmUgYWJvdXQgaXMKKyAgICAvLyB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgYXQgYSB0b2tlbiB3aXRoIGtpbmQgdG9rOjplb2Ygb3IgdG9rOjpsX3BhcmVuLgorICAgIC8vIEp1c3QgcmVhZCB0aGUgZmlyc3QgYnl0ZSBmcm9tIHRoZSBjdXJyZW50IHRva2VuIHBvaW50ZXIgdG8gZGV0ZXJtaW5lCisgICAgLy8gaXRzIGtpbmQuCisgICAgdG9rOjpUb2tlbktpbmQgeCA9ICh0b2s6OlRva2VuS2luZCkqQ3VyUHRyOworICAgIHJldHVybiB4ID09IHRvazo6ZW9mID8gMiA6IHggPT0gdG9rOjpsX3BhcmVuOworICB9CisKKyAgLy8vIEluZGlyZWN0TGV4IC0gQW4gaW5kaXJlY3QgY2FsbCB0byAnTGV4JyB0aGF0IGNhbiBiZSBpbnZva2VkIHZpYQorICAvLy8gIHRoZSBQcmVwcm9jZXNzb3JMZXhlciBpbnRlcmZhY2UuCisgIHZvaWQgSW5kaXJlY3RMZXgoVG9rZW4gJlJlc3VsdCkgb3ZlcnJpZGUgeyBMZXgoUmVzdWx0KTsgfQorCisgIC8vLyBnZXRTb3VyY2VMb2NhdGlvbiAtIFJldHVybiBhIHNvdXJjZSBsb2NhdGlvbiBmb3IgdGhlIHRva2VuIGluCisgIC8vLyB0aGUgY3VycmVudCBmaWxlLgorICBTb3VyY2VMb2NhdGlvbiBnZXRTb3VyY2VMb2NhdGlvbigpIG92ZXJyaWRlOworCisgIC8vLyBTa2lwQmxvY2sgLSBVc2VkIGJ5IFByZXByb2Nlc3NvciB0byBza2lwIHRoZSBjdXJyZW50IGNvbmRpdGlvbmFsIGJsb2NrLgorICBib29sIFNraXBCbG9jaygpOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfTEVYX1BUSExFWEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9QVEhNYW5hZ2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvUFRITWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4M2I2OWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvUFRITWFuYWdlci5oCkBAIC0wLDAgKzEsMTQ5IEBACisvLz09PS0gUFRITWFuYWdlci5oIC0gTWFuYWdlciBvYmplY3QgZm9yIFBUSCBwcm9jZXNzaW5nIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUFRITWFuYWdlciBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0xFWF9QVEhNQU5BR0VSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19MRVhfUFRITUFOQUdFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvT25EaXNrSGFzaFRhYmxlLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1lbW9yeUJ1ZmZlcjsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBEaWFnbm9zdGljc0VuZ2luZTsKK2NsYXNzIEZpbGVTeXN0ZW1TdGF0Q2FjaGU7CitjbGFzcyBQcmVwcm9jZXNzb3I7CitjbGFzcyBQVEhMZXhlcjsKKworY2xhc3MgUFRITWFuYWdlciA6IHB1YmxpYyBJZGVudGlmaWVySW5mb0xvb2t1cCB7CisgIGZyaWVuZCBjbGFzcyBQVEhMZXhlcjsKKyAgZnJpZW5kIGNsYXNzIFBUSFN0YXRDYWNoZTsKKworICBjbGFzcyBQVEhGaWxlTG9va3VwVHJhaXQ7CisgIGNsYXNzIFBUSFN0cmluZ0xvb2t1cFRyYWl0OworCisgIHVzaW5nIFBUSFN0cmluZ0lkTG9va3VwID0gbGx2bTo6T25EaXNrQ2hhaW5lZEhhc2hUYWJsZTxQVEhTdHJpbmdMb29rdXBUcmFpdD47CisgIHVzaW5nIFBUSEZpbGVMb29rdXAgPSBsbHZtOjpPbkRpc2tDaGFpbmVkSGFzaFRhYmxlPFBUSEZpbGVMb29rdXBUcmFpdD47CisKKyAgLy8vIFRoZSBtZW1vcnkgbWFwcGVkIFBUSCBmaWxlLgorICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgbGx2bTo6TWVtb3J5QnVmZmVyPiBCdWY7CisKKyAgLy8vIEFsbG9jIC0gQWxsb2NhdG9yIHVzZWQgZm9yIElkZW50aWZpZXJJbmZvIG9iamVjdHMuCisgIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgQWxsb2M7CisKKyAgLy8vIElkTWFwIC0gQSBsYXppbHkgZ2VuZXJhdGVkIGNhY2hlIG1hcHBpbmcgZnJvbSBwZXJzaXN0ZW50IGlkZW50aWZpZXJzIHRvCisgIC8vLyAgSWRlbnRpZmllckluZm8qLgorICBzdGQ6OnVuaXF1ZV9wdHI8SWRlbnRpZmllckluZm8gKltdLCBsbHZtOjpGcmVlRGVsZXRlcj4gUGVySURDYWNoZTsKKworICAvLy8gRmlsZUxvb2t1cCAtIEFic3RyYWN0IGRhdGEgc3RydWN0dXJlIHVzZWQgZm9yIG1hcHBpbmcgYmV0d2VlbiBmaWxlcworICAvLy8gIGFuZCB0b2tlbiBkYXRhIGluIHRoZSBQVEggZmlsZS4KKyAgc3RkOjp1bmlxdWVfcHRyPFBUSEZpbGVMb29rdXA+IEZpbGVMb29rdXA7CisKKyAgLy8vIElkRGF0YVRhYmxlIC0gQXJyYXkgcmVwcmVzZW50aW5nIHRoZSBtYXBwaW5nIGZyb20gcGVyc2lzdGVudCBJRHMgdG8gdGhlCisgIC8vLyAgZGF0YSBvZmZzZXQgd2l0aGluIHRoZSBQVEggZmlsZSBjb250YWluaW5nIHRoZSBpbmZvcm1hdGlvbiB0bworICAvLy8gIHJlY29uc2l0dXRlIGFuIElkZW50aWZpZXJJbmZvLgorICBjb25zdCB1bnNpZ25lZCBjaGFyKiBjb25zdCBJZERhdGFUYWJsZTsKKworICAvLy8gU29ydGVkSWRUYWJsZSAtIEFic3RyYWN0IGRhdGEgc3RydWN0dXJlIG1hcHBpbmcgZnJvbSBzdHJpbmdzIHRvCisgIC8vLyAgcGVyc2lzdGVudCBJRHMuICBUaGlzIGlzIHVzZWQgYnkgZ2V0KCkuCisgIHN0ZDo6dW5pcXVlX3B0cjxQVEhTdHJpbmdJZExvb2t1cD4gU3RyaW5nSWRMb29rdXA7CisKKyAgLy8vIE51bUlkcyAtIFRoZSBudW1iZXIgb2YgaWRlbnRpZmllcnMgaW4gdGhlIFBUSCBmaWxlLgorICBjb25zdCB1bnNpZ25lZCBOdW1JZHM7CisKKyAgLy8vIFBQIC0gVGhlIFByZXByb2Nlc3NvciBvYmplY3QgdGhhdCB3aWxsIHVzZSB0aGlzIFBUSE1hbmFnZXIgdG8gY3JlYXRlCisgIC8vLyAgUFRITGV4ZXIgb2JqZWN0cy4KKyAgUHJlcHJvY2Vzc29yKiBQUCA9IG51bGxwdHI7CisKKyAgLy8vIFNwZWxsaW5nQmFzZSAtIFRoZSBiYXNlIG9mZnNldCB3aXRoaW4gdGhlIFBUSCBtZW1vcnkgYnVmZmVyIHRoYXQKKyAgLy8vICBjb250YWlucyB0aGUgY2FjaGVkIHNwZWxsaW5ncyBmb3IgbGl0ZXJhbHMuCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGNvbnN0IFNwZWxsaW5nQmFzZTsKKworICAvLy8gT3JpZ2luYWxTb3VyY2VGaWxlIC0gQSBudWxsLXRlcm1pbmF0ZWQgQy1zdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIG5hbWUKKyAgLy8vICBpZiB0aGUgZmlsZSAoaWYgYW55KSB0aGF0IHdhcyB0byB1c2VkIHRvIGdlbmVyYXRlIHRoZSBQVEggY2FjaGUuCisgIGNvbnN0IGNoYXIqIE9yaWdpbmFsU291cmNlRmlsZTsKKworICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyBpbnRlbmRlZCB0byBvbmx5IGJlIGNhbGxlZCBieSB0aGUgc3RhdGljICdDcmVhdGUnCisgIC8vLyBtZXRob2QuCisgIFBUSE1hbmFnZXIoc3RkOjp1bmlxdWVfcHRyPGNvbnN0IGxsdm06Ok1lbW9yeUJ1ZmZlcj4gYnVmLAorICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQVEhGaWxlTG9va3VwPiBmaWxlTG9va3VwLAorICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlkRGF0YVRhYmxlLAorICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJZGVudGlmaWVySW5mbyAqW10sIGxsdm06OkZyZWVEZWxldGVyPiBwZXJJRENhY2hlLAorICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQVEhTdHJpbmdJZExvb2t1cD4gc3RyaW5nSWRMb29rdXAsIHVuc2lnbmVkIG51bUlkcywKKyAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcGVsbGluZ0Jhc2UsIGNvbnN0IGNoYXIgKm9yaWdpbmFsU291cmNlRmlsZSk7CisKKyAgLy8vIGdldFNwZWxsaW5nQXRQVEhPZmZzZXQgLSBVc2VkIGJ5IFBUSExleGVyIGNsYXNzZXMgdG8gZ2V0IHRoZSBjYWNoZWQKKyAgLy8vICBzcGVsbGluZyBmb3IgYSB0b2tlbi4KKyAgdW5zaWduZWQgZ2V0U3BlbGxpbmdBdFBUSE9mZnNldCh1bnNpZ25lZCBQVEhPZmZzZXQsIGNvbnN0IGNoYXIqJiBCdWZmZXIpOworCisgIC8vLyBHZXRJZGVudGlmaWVySW5mbyAtIFVzZWQgdG8gcmVjb25zdHJ1Y3QgSWRlbnRpZmllckluZm8gb2JqZWN0cyBmcm9tIHRoZQorICAvLy8gIFBUSCBmaWxlLgorICBJZGVudGlmaWVySW5mbyAqR2V0SWRlbnRpZmllckluZm8odW5zaWduZWQgUGVyc2lzdGVudElEKSB7CisgICAgLy8gQ2hlY2sgaWYgdGhlIElkZW50aWZpZXJJbmZvIGhhcyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQuCisgICAgaWYgKElkZW50aWZpZXJJbmZvKiBJSSA9IFBlcklEQ2FjaGVbUGVyc2lzdGVudElEXSkKKyAgICAgIHJldHVybiBJSTsKKyAgICByZXR1cm4gTGF6aWx5Q3JlYXRlSWRlbnRpZmllckluZm8oUGVyc2lzdGVudElEKTsKKyAgfQorICBJZGVudGlmaWVySW5mbyogTGF6aWx5Q3JlYXRlSWRlbnRpZmllckluZm8odW5zaWduZWQgUGVyc2lzdGVudElEKTsKKworcHVibGljOgorICAvLyBUaGUgY3VycmVudCBQVEggdmVyc2lvbi4KKyAgZW51bSB7IFZlcnNpb24gPSAxMCB9OworCisgIFBUSE1hbmFnZXIoY29uc3QgUFRITWFuYWdlciAmKSA9IGRlbGV0ZTsKKyAgUFRITWFuYWdlciAmb3BlcmF0b3I9KGNvbnN0IFBUSE1hbmFnZXIgJikgPSBkZWxldGU7CisgIH5QVEhNYW5hZ2VyKCkgb3ZlcnJpZGU7CisKKyAgLy8vIGdldE9yaWdpbmFsU291cmNlRmlsZSAtIFJldHVybiB0aGUgZnVsbCBwYXRoIHRvIHRoZSBvcmlnaW5hbCBoZWFkZXIKKyAgLy8vICBmaWxlIG5hbWUgdGhhdCB3YXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgUFRIIGNhY2hlLgorICBjb25zdCBjaGFyKiBnZXRPcmlnaW5hbFNvdXJjZUZpbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIE9yaWdpbmFsU291cmNlRmlsZTsKKyAgfQorCisgIC8vLyBnZXQgLSBSZXR1cm4gdGhlIGlkZW50aWZpZXIgdG9rZW4gaW5mbyBmb3IgdGhlIHNwZWNpZmllZCBuYW1lZCBpZGVudGlmaWVyLgorICAvLy8gIFVubGlrZSB0aGUgdmVyc2lvbiBpbiBJZGVudGlmaWVyVGFibGUsIHRoaXMgcmV0dXJucyBhIHBvaW50ZXIgaW5zdGVhZAorICAvLy8gIG9mIGEgcmVmZXJlbmNlLiAgSWYgdGhlIHBvaW50ZXIgaXMgbnVsbHB0ciB0aGVuIHRoZSBJZGVudGlmaWVySW5mbyBjYW5ub3QKKyAgLy8vICBiZSBmb3VuZC4KKyAgSWRlbnRpZmllckluZm8gKmdldChTdHJpbmdSZWYgTmFtZSkgb3ZlcnJpZGU7CisKKyAgLy8vIENyZWF0ZSAtIFRoaXMgbWV0aG9kIGNyZWF0ZXMgUFRITWFuYWdlciBvYmplY3RzLiAgVGhlICdmaWxlJyBhcmd1bWVudAorICAvLy8gIGlzIHRoZSBuYW1lIG9mIHRoZSBQVEggZmlsZS4gIFRoaXMgbWV0aG9kIHJldHVybnMgbnVsbHB0ciB1cG9uIGZhaWx1cmUuCisgIHN0YXRpYyBQVEhNYW5hZ2VyICpDcmVhdGUoU3RyaW5nUmVmIGZpbGUsIERpYWdub3N0aWNzRW5naW5lICZEaWFncyk7CisKKyAgdm9pZCBzZXRQcmVwcm9jZXNzb3IoUHJlcHJvY2Vzc29yICpwcCkgeyBQUCA9IHBwOyB9CisKKyAgLy8vIENyZWF0ZUxleGVyIC0gUmV0dXJuIGEgUFRITGV4ZXIgdGhhdCAibGV4ZXMiIHRoZSBjYWNoZWQgdG9rZW5zIGZvciB0aGUKKyAgLy8vICBzcGVjaWZpZWQgZmlsZS4gIFRoaXMgbWV0aG9kIHJldHVybnMgbnVsbHB0ciBpZiBubyBjYWNoZWQgdG9rZW5zIGV4aXN0LgorICAvLy8gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvICdkZWxldGUnIHRoZSByZXR1cm5lZCBvYmplY3QuCisgIFBUSExleGVyICpDcmVhdGVMZXhlcihGaWxlSUQgRklEKTsKKworICAvLy8gY3JlYXRlU3RhdENhY2hlIC0gUmV0dXJucyBhIEZpbGVTeXN0ZW1TdGF0Q2FjaGUgb2JqZWN0IGZvciB1c2Ugd2l0aAorICAvLy8gIEZpbGVNYW5hZ2VyIG9iamVjdHMuICBUaGVzZSBvYmplY3RzIHVzZSB0aGUgUFRIIGRhdGEgdG8gc3BlZWQgdXAKKyAgLy8vICBjYWxscyB0byBzdGF0IGJ5IG1lbW9pemluZyB0aGVpciByZXN1bHRzIGZyb20gd2hlbiB0aGUgUFRIIGZpbGUKKyAgLy8vICB3YXMgZ2VuZXJhdGVkLgorICBzdGQ6OnVuaXF1ZV9wdHI8RmlsZVN5c3RlbVN0YXRDYWNoZT4gY3JlYXRlU3RhdENhY2hlKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19MRVhfUFRITUFOQUdFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvUHJhZ21hLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvUHJhZ21hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkwYWUyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9QcmFnbWEuaApAQCAtMCwwICsxLDEyMyBAQAorLy89PT0tIFByYWdtYS5oIC0gUHJhZ21hIHJlZ2lzdHJhdGlvbiBhbmQgaGFuZGxpbmcgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUHJhZ21hSGFuZGxlciBhbmQgUHJhZ21hVGFibGUgaW50ZXJmYWNlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfTEVYX1BSQUdNQV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfTEVYX1BSQUdNQV9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBQcmFnbWFOYW1lc3BhY2U7CitjbGFzcyBQcmVwcm9jZXNzb3I7CitjbGFzcyBUb2tlbjsKKworICAvKioKKyAgICogXGJyaWVmIERlc2NyaWJlcyBob3cgdGhlIHByYWdtYSB3YXMgaW50cm9kdWNlZCwgZS5nLiwgd2l0aCBcI3ByYWdtYSwKKyAgICogX1ByYWdtYSwgb3IgX19wcmFnbWEuCisgICAqLworICBlbnVtIFByYWdtYUludHJvZHVjZXJLaW5kIHsKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgVGhlIHByYWdtYSB3YXMgaW50cm9kdWNlZCB2aWEgXCNwcmFnbWEuCisgICAgICovCisgICAgUElLX0hhc2hQcmFnbWEsCisgICAgCisgICAgLyoqCisgICAgICogXGJyaWVmIFRoZSBwcmFnbWEgd2FzIGludHJvZHVjZWQgdmlhIHRoZSBDOTkgX1ByYWdtYShzdHJpbmctbGl0ZXJhbCkuCisgICAgICovCisgICAgUElLX19QcmFnbWEsCisgICAgCisgICAgLyoqCisgICAgICogXGJyaWVmIFRoZSBwcmFnbWEgd2FzIGludHJvZHVjZWQgdmlhIHRoZSBNaWNyb3NvZnQgCisgICAgICogX19wcmFnbWEodG9rZW4tc3RyaW5nKS4KKyAgICAgKi8KKyAgICBQSUtfX19wcmFnbWEKKyAgfTsKKyAgCisvLy8gUHJhZ21hSGFuZGxlciAtIEluc3RhbmNlcyBvZiB0aGlzIGludGVyZmFjZSBkZWZpbmVkIHRvIGhhbmRsZSB0aGUgdmFyaW91cworLy8vIHByYWdtYXMgdGhhdCB0aGUgbGFuZ3VhZ2UgZnJvbnQtZW5kIHVzZXMuICBFYWNoIGhhbmRsZXIgb3B0aW9uYWxseSBoYXMgYQorLy8vIG5hbWUgKGUuZy4gInBhY2siKSBhbmQgdGhlIEhhbmRsZVByYWdtYSBtZXRob2QgaXMgaW52b2tlZCB3aGVuIGEgcHJhZ21hIHdpdGgKKy8vLyB0aGF0IGlkZW50aWZpZXIgaXMgZm91bmQuICBJZiBhIGhhbmRsZXIgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBkZWNsYXJlZAorLy8vIHByYWdtYXMgdGhlIGhhbmRsZXIgd2l0aCBhIG51bGwgaWRlbnRpZmllciBpcyBpbnZva2VkLCBpZiBpdCBleGlzdHMuCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhlIFByYWdtYU5hbWVzcGFjZSBjbGFzcyBjYW4gYmUgdXNlZCB0byBzdWJkaXZpZGUgcHJhZ21hcywgZS5nLgorLy8vIHdlIHRyZWF0ICJcI3ByYWdtYSBTVERDIiBhbmQgIlwjcHJhZ21hIEdDQyIgYXMgbmFtZXNwYWNlcyB0aGF0IGNvbnRhaW4gb3RoZXIKKy8vLyBwcmFnbWFzLgorY2xhc3MgUHJhZ21hSGFuZGxlciB7CisgIHN0ZDo6c3RyaW5nIE5hbWU7CisKK3B1YmxpYzoKKyAgUHJhZ21hSGFuZGxlcigpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgUHJhZ21hSGFuZGxlcihTdHJpbmdSZWYgbmFtZSkgOiBOYW1lKG5hbWUpIHt9CisgIHZpcnR1YWwgflByYWdtYUhhbmRsZXIoKTsKKworICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKyAgdmlydHVhbCB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuICZGaXJzdFRva2VuKSA9IDA7CisKKyAgLy8vIGdldElmTmFtZXNwYWNlIC0gSWYgdGhpcyBpcyBhIG5hbWVzcGFjZSwgcmV0dXJuIGl0LiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCisgIC8vLyB1c2luZyBhIGR5bmFtaWNfY2FzdCwgYnV0IGRvZXNuJ3QgcmVxdWlyZSBSVFRJLgorICB2aXJ0dWFsIFByYWdtYU5hbWVzcGFjZSAqZ2V0SWZOYW1lc3BhY2UoKSB7IHJldHVybiBudWxscHRyOyB9Cit9OworCisvLy8gRW1wdHlQcmFnbWFIYW5kbGVyIC0gQSBwcmFnbWEgaGFuZGxlciB3aGljaCB0YWtlcyBubyBhY3Rpb24sIHdoaWNoIGNhbiBiZQorLy8vIHVzZWQgdG8gaWdub3JlIHBhcnRpY3VsYXIgcHJhZ21hcy4KK2NsYXNzIEVtcHR5UHJhZ21hSGFuZGxlciA6IHB1YmxpYyBQcmFnbWFIYW5kbGVyIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRW1wdHlQcmFnbWFIYW5kbGVyKFN0cmluZ1JlZiBOYW1lID0gU3RyaW5nUmVmKCkpOworCisgIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIFRva2VuICZGaXJzdFRva2VuKSBvdmVycmlkZTsKK307CisKKy8vLyBQcmFnbWFOYW1lc3BhY2UgLSBUaGlzIFByYWdtYUhhbmRsZXIgc3ViZGl2aWRlcyB0aGUgbmFtZXNwYWNlIG9mIHByYWdtYXMsCisvLy8gYWxsb3dpbmcgaGllcmFyY2hpY2FsIHByYWdtYXMgdG8gYmUgZGVmaW5lZC4gIENvbW1vbiBleGFtcGxlcyBvZiBuYW1lc3BhY2VzCisvLy8gYXJlICJcI3ByYWdtYSBHQ0MiLCAiXCNwcmFnbWEgU1REQyIsIGFuZCAiXCNwcmFnbWEgb21wIiwgYnV0IGFueSBuYW1lc3BhY2VzCisvLy8gbWF5IGJlIChwb3RlbnRpYWxseSByZWN1cnNpdmVseSkgZGVmaW5lZC4KK2NsYXNzIFByYWdtYU5hbWVzcGFjZSA6IHB1YmxpYyBQcmFnbWFIYW5kbGVyIHsKKyAgLy8vIEhhbmRsZXJzIC0gVGhpcyBpcyBhIG1hcCBvZiB0aGUgaGFuZGxlcnMgaW4gdGhpcyBuYW1lc3BhY2Ugd2l0aCB0aGVpciBuYW1lCisgIC8vLyBhcyBrZXkuCisgIGxsdm06OlN0cmluZ01hcDxQcmFnbWFIYW5kbGVyICo+IEhhbmRsZXJzOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFByYWdtYU5hbWVzcGFjZShTdHJpbmdSZWYgTmFtZSkgOiBQcmFnbWFIYW5kbGVyKE5hbWUpIHt9CisgIH5QcmFnbWFOYW1lc3BhY2UoKSBvdmVycmlkZTsKKworICAvLy8gRmluZEhhbmRsZXIgLSBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIGhhbmRsZXIgZm9yIHRoZQorICAvLy8gc3BlY2lmaWVkIG5hbWUuICBJZiBub3QsIHJldHVybiB0aGUgaGFuZGxlciBmb3IgdGhlIG51bGwgbmFtZSBpZiBpdAorICAvLy8gZXhpc3RzLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuICBJZiBJZ25vcmVOdWxsIGlzIHRydWUgKHRoZSBkZWZhdWx0KSB0aGVuCisgIC8vLyB0aGUgbnVsbCBoYW5kbGVyIGlzbid0IHJldHVybmVkIG9uIGZhaWx1cmUgdG8gbWF0Y2guCisgIFByYWdtYUhhbmRsZXIgKkZpbmRIYW5kbGVyKFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElnbm9yZU51bGwgPSB0cnVlKSBjb25zdDsKKworICAvLy8gQWRkUHJhZ21hIC0gQWRkIGEgcHJhZ21hIHRvIHRoaXMgbmFtZXNwYWNlLgorICB2b2lkIEFkZFByYWdtYShQcmFnbWFIYW5kbGVyICpIYW5kbGVyKTsKKworICAvLy8gUmVtb3ZlUHJhZ21hSGFuZGxlciAtIFJlbW92ZSB0aGUgZ2l2ZW4gaGFuZGxlciBmcm9tIHRoZQorICAvLy8gbmFtZXNwYWNlLgorICB2b2lkIFJlbW92ZVByYWdtYUhhbmRsZXIoUHJhZ21hSGFuZGxlciAqSGFuZGxlcik7CisKKyAgYm9vbCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gSGFuZGxlcnMuZW1wdHkoKTsgfQorCisgIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIFRva2VuICZGaXJzdFRva2VuKSBvdmVycmlkZTsKKworICBQcmFnbWFOYW1lc3BhY2UgKmdldElmTmFtZXNwYWNlKCkgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfTEVYX1BSQUdNQV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvUHJlcHJvY2Vzc2luZ1JlY29yZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L1ByZXByb2Nlc3NpbmdSZWNvcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2RhMWViCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L1ByZXByb2Nlc3NpbmdSZWNvcmQuaApAQCAtMCwwICsxLDU3NCBAQAorLy89PT0tIFByZXByb2Nlc3NpbmdSZWNvcmQuaCAtIFJlY29yZCBvZiBQcmVwcm9jZXNzaW5nIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIFByZXByb2Nlc3NpbmdSZWNvcmQgY2xhc3MsIHdoaWNoIG1haW50YWlucyBhIHJlY29yZAorLy8gIG9mIHdoYXQgb2NjdXJyZWQgZHVyaW5nIHByZXByb2Nlc3NpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0xFWF9QUkVQUk9DRVNTSU5HUkVDT1JEX0gKKyNkZWZpbmUgTExWTV9DTEFOR19MRVhfUFJFUFJPQ0VTU0lOR1JFQ09SRF9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9MZXgvUFBDYWxsYmFja3MuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBQcmVwcm9jZXNzaW5nUmVjb3JkOworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisvLy8gXGJyaWVmIEFsbG9jYXRlcyBtZW1vcnkgd2l0aGluIGEgQ2xhbmcgcHJlcHJvY2Vzc2luZyByZWNvcmQuCit2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IGJ5dGVzLCBjbGFuZzo6UHJlcHJvY2Vzc2luZ1JlY29yZCAmUFIsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYWxpZ25tZW50ID0gOCkgbm9leGNlcHQ7CisKKy8vLyBcYnJpZWYgRnJlZXMgbWVtb3J5IGFsbG9jYXRlZCBpbiBhIENsYW5nIHByZXByb2Nlc3NpbmcgcmVjb3JkLgordm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqcHRyLCBjbGFuZzo6UHJlcHJvY2Vzc2luZ1JlY29yZCAmUFIsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCkgbm9leGNlcHQ7CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEZpbGVFbnRyeTsKK2NsYXNzIElkZW50aWZpZXJJbmZvOworY2xhc3MgTWFjcm9JbmZvOworY2xhc3MgU291cmNlTWFuYWdlcjsKK2NsYXNzIFRva2VuOworCisgIC8vLyBcYnJpZWYgQmFzZSBjbGFzcyB0aGF0IGRlc2NyaWJlcyBhIHByZXByb2Nlc3NlZCBlbnRpdHksIHdoaWNoIG1heSBiZSBhCisgIC8vLyBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIG9yIG1hY3JvIGV4cGFuc2lvbi4KKyAgY2xhc3MgUHJlcHJvY2Vzc2VkRW50aXR5IHsKKyAgcHVibGljOgorICAgIC8vLyBcYnJpZWYgVGhlIGtpbmQgb2YgcHJlcHJvY2Vzc2VkIGVudGl0eSBhbiBvYmplY3QgZGVzY3JpYmVzLgorICAgIGVudW0gRW50aXR5S2luZCB7CisgICAgICAvLy8gXGJyaWVmIEluZGljYXRlcyBhIHByb2JsZW0gdHJ5aW5nIHRvIGxvYWQgdGhlIHByZXByb2Nlc3NlZCBlbnRpdHkuCisgICAgICBJbnZhbGlkS2luZCwKKworICAgICAgLy8vIFxicmllZiBBIG1hY3JvIGV4cGFuc2lvbi4KKyAgICAgIE1hY3JvRXhwYW5zaW9uS2luZCwKKyAgICAgIAorICAgICAgLy8vIFxkZWZncm91cCBQcmVwcm9jZXNzaW5nIGRpcmVjdGl2ZXMKKyAgICAgIC8vLyBAeworICAgICAgCisgICAgICAvLy8gXGJyaWVmIEEgbWFjcm8gZGVmaW5pdGlvbi4KKyAgICAgIE1hY3JvRGVmaW5pdGlvbktpbmQsCisgICAgICAKKyAgICAgIC8vLyBcYnJpZWYgQW4gaW5jbHVzaW9uIGRpcmVjdGl2ZSwgc3VjaCBhcyBcYyBcI2luY2x1ZGUsIFxjCisgICAgICAvLy8gXCNpbXBvcnQsIG9yIFxjIFwjaW5jbHVkZV9uZXh0LgorICAgICAgSW5jbHVzaW9uRGlyZWN0aXZlS2luZCwKKworICAgICAgLy8vIEB9CisKKyAgICAgIEZpcnN0UHJlcHJvY2Vzc2luZ0RpcmVjdGl2ZSA9IE1hY3JvRGVmaW5pdGlvbktpbmQsCisgICAgICBMYXN0UHJlcHJvY2Vzc2luZ0RpcmVjdGl2ZSA9IEluY2x1c2lvbkRpcmVjdGl2ZUtpbmQKKyAgICB9OworCisgIHByaXZhdGU6CisgICAgLy8vIFxicmllZiBUaGUga2luZCBvZiBwcmVwcm9jZXNzZWQgZW50aXR5IHRoYXQgdGhpcyBvYmplY3QgZGVzY3JpYmVzLgorICAgIEVudGl0eUtpbmQgS2luZDsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFRoZSBzb3VyY2UgcmFuZ2UgdGhhdCBjb3ZlcnMgdGhpcyBwcmVwcm9jZXNzZWQgZW50aXR5LgorICAgIFNvdXJjZVJhbmdlIFJhbmdlOworICAgIAorICBwcm90ZWN0ZWQ6CisgICAgZnJpZW5kIGNsYXNzIFByZXByb2Nlc3NpbmdSZWNvcmQ7CisKKyAgICBQcmVwcm9jZXNzZWRFbnRpdHkoRW50aXR5S2luZCBLaW5kLCBTb3VyY2VSYW5nZSBSYW5nZSkKKyAgICAgICAgOiBLaW5kKEtpbmQpLCBSYW5nZShSYW5nZSkge30KKworICBwdWJsaWM6CisgICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUga2luZCBvZiBwcmVwcm9jZXNzZWQgZW50aXR5IHN0b3JlZCBpbiB0aGlzIG9iamVjdC4KKyAgICBFbnRpdHlLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisgICAgCisgICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc291cmNlIHJhbmdlIHRoYXQgY292ZXJzIHRoaXMgZW50aXJlIHByZXByb2Nlc3NlZCAKKyAgICAvLy8gZW50aXR5LgorICAgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSYW5nZTsgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSBsb2FkaW5nIHRoZSBwcmVwcm9jZXNzZWQKKyAgICAvLy8gZW50aXR5LgorICAgIGJvb2wgaXNJbnZhbGlkKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBJbnZhbGlkS2luZDsgfQorCisgICAgLy8gT25seSBhbGxvdyBhbGxvY2F0aW9uIG9mIHByZXByb2Nlc3NlZCBlbnRpdGllcyB1c2luZyB0aGUgYWxsb2NhdG9yIAorICAgIC8vIGluIFByZXByb2Nlc3NpbmdSZWNvcmQgb3IgYnkgZG9pbmcgYSBwbGFjZW1lbnQgbmV3LgorICAgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgYnl0ZXMsIFByZXByb2Nlc3NpbmdSZWNvcmQgJlBSLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBhbGlnbm1lbnQgPSA4KSBub2V4Y2VwdCB7CisgICAgICByZXR1cm4gOjpvcGVyYXRvciBuZXcoYnl0ZXMsIFBSLCBhbGlnbm1lbnQpOworICAgIH0KKworICAgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgYnl0ZXMsIHZvaWQgKm1lbSkgbm9leGNlcHQgeyByZXR1cm4gbWVtOyB9CisKKyAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwdHIsIFByZXByb2Nlc3NpbmdSZWNvcmQgJlBSLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFsaWdubWVudCkgbm9leGNlcHQgeworICAgICAgcmV0dXJuIDo6b3BlcmF0b3IgZGVsZXRlKHB0ciwgUFIsIGFsaWdubWVudCk7CisgICAgfQorCisgICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqLCBzdGQ6OnNpemVfdCkgbm9leGNlcHQge30KKyAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICosIHZvaWQgKikgbm9leGNlcHQge30KKworICBwcml2YXRlOgorICAgIC8vIE1ha2UgdmFuaWxsYSAnbmV3JyBhbmQgJ2RlbGV0ZScgaWxsZWdhbCBmb3IgcHJlcHJvY2Vzc2VkIGVudGl0aWVzLgorICAgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgYnl0ZXMpIG5vZXhjZXB0OworICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKmRhdGEpIG5vZXhjZXB0OworICB9OworICAKKyAgLy8vIFxicmllZiBSZWNvcmRzIHRoZSBwcmVzZW5jZSBvZiBhIHByZXByb2Nlc3NvciBkaXJlY3RpdmUuCisgIGNsYXNzIFByZXByb2Nlc3NpbmdEaXJlY3RpdmUgOiBwdWJsaWMgUHJlcHJvY2Vzc2VkRW50aXR5IHsKKyAgcHVibGljOgorICAgIFByZXByb2Nlc3NpbmdEaXJlY3RpdmUoRW50aXR5S2luZCBLaW5kLCBTb3VyY2VSYW5nZSBSYW5nZSkgCisgICAgICAgIDogUHJlcHJvY2Vzc2VkRW50aXR5KEtpbmQsIFJhbmdlKSB7fQorICAgIAorICAgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFByZXByb2Nlc3NlZEVudGl0eSAqUEQpIHsgCisgICAgICByZXR1cm4gUEQtPmdldEtpbmQoKSA+PSBGaXJzdFByZXByb2Nlc3NpbmdEaXJlY3RpdmUgJiYKKyAgICAgICAgICAgICBQRC0+Z2V0S2luZCgpIDw9IExhc3RQcmVwcm9jZXNzaW5nRGlyZWN0aXZlOworICAgIH0KKyAgfTsKKworICAvLy8gXGJyaWVmIFJlY29yZCB0aGUgbG9jYXRpb24gb2YgYSBtYWNybyBkZWZpbml0aW9uLgorICBjbGFzcyBNYWNyb0RlZmluaXRpb25SZWNvcmQgOiBwdWJsaWMgUHJlcHJvY2Vzc2luZ0RpcmVjdGl2ZSB7CisgICAgLy8vIFxicmllZiBUaGUgbmFtZSBvZiB0aGUgbWFjcm8gYmVpbmcgZGVmaW5lZC4KKyAgICBjb25zdCBJZGVudGlmaWVySW5mbyAqTmFtZTsKKworICBwdWJsaWM6CisgICAgZXhwbGljaXQgTWFjcm9EZWZpbml0aW9uUmVjb3JkKGNvbnN0IElkZW50aWZpZXJJbmZvICpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSYW5nZSkKKyAgICAgICAgOiBQcmVwcm9jZXNzaW5nRGlyZWN0aXZlKE1hY3JvRGVmaW5pdGlvbktpbmQsIFJhbmdlKSwgTmFtZShOYW1lKSB7fQorCisgICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgbWFjcm8gYmVpbmcgZGVmaW5lZC4KKyAgICBjb25zdCBJZGVudGlmaWVySW5mbyAqZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBtYWNybyBuYW1lIGluIHRoZSBkZWZpbml0aW9uLgorICAgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gZ2V0U291cmNlUmFuZ2UoKS5nZXRCZWdpbigpOyB9CisgICAgCisgICAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgUHJlcHJvY2Vzc2VkRW50aXR5ICpQRSkgeworICAgICAgcmV0dXJuIFBFLT5nZXRLaW5kKCkgPT0gTWFjcm9EZWZpbml0aW9uS2luZDsKKyAgICB9CisgIH07CisgIAorICAvLy8gXGJyaWVmIFJlY29yZHMgdGhlIGxvY2F0aW9uIG9mIGEgbWFjcm8gZXhwYW5zaW9uLgorICBjbGFzcyBNYWNyb0V4cGFuc2lvbiA6IHB1YmxpYyBQcmVwcm9jZXNzZWRFbnRpdHkgeworICAgIC8vLyBcYnJpZWYgVGhlIGRlZmluaXRpb24gb2YgdGhpcyBtYWNybyBvciB0aGUgbmFtZSBvZiB0aGUgbWFjcm8gaWYgaXQgaXMKKyAgICAvLy8gYSBidWlsdGluIG1hY3JvLgorICAgIGxsdm06OlBvaW50ZXJVbmlvbjxJZGVudGlmaWVySW5mbyAqLCBNYWNyb0RlZmluaXRpb25SZWNvcmQgKj4gTmFtZU9yRGVmOworCisgIHB1YmxpYzoKKyAgICBNYWNyb0V4cGFuc2lvbihJZGVudGlmaWVySW5mbyAqQnVpbHRpbk5hbWUsIFNvdXJjZVJhbmdlIFJhbmdlKQorICAgICAgICA6IFByZXByb2Nlc3NlZEVudGl0eShNYWNyb0V4cGFuc2lvbktpbmQsIFJhbmdlKSwKKyAgICAgICAgICBOYW1lT3JEZWYoQnVpbHRpbk5hbWUpIHt9CisKKyAgICBNYWNyb0V4cGFuc2lvbihNYWNyb0RlZmluaXRpb25SZWNvcmQgKkRlZmluaXRpb24sIFNvdXJjZVJhbmdlIFJhbmdlKQorICAgICAgICA6IFByZXByb2Nlc3NlZEVudGl0eShNYWNyb0V4cGFuc2lvbktpbmQsIFJhbmdlKSwgTmFtZU9yRGVmKERlZmluaXRpb24pIHsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFRydWUgaWYgaXQgaXMgYSBidWlsdGluIG1hY3JvLgorICAgIGJvb2wgaXNCdWlsdGluTWFjcm8oKSBjb25zdCB7IHJldHVybiBOYW1lT3JEZWYuaXM8SWRlbnRpZmllckluZm8gKj4oKTsgfQorCisgICAgLy8vIFxicmllZiBUaGUgbmFtZSBvZiB0aGUgbWFjcm8gYmVpbmcgZXhwYW5kZWQuCisgICAgY29uc3QgSWRlbnRpZmllckluZm8gKmdldE5hbWUoKSBjb25zdCB7CisgICAgICBpZiAoTWFjcm9EZWZpbml0aW9uUmVjb3JkICpEZWYgPSBnZXREZWZpbml0aW9uKCkpCisgICAgICAgIHJldHVybiBEZWYtPmdldE5hbWUoKTsKKyAgICAgIHJldHVybiBOYW1lT3JEZWYuZ2V0PElkZW50aWZpZXJJbmZvICo+KCk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgbWFjcm8gYmVpbmcgZXhwYW5kZWQuIE1heSByZXR1cm4gbnVsbCBpZgorICAgIC8vLyB0aGlzIGlzIGEgYnVpbHRpbiBtYWNyby4KKyAgICBNYWNyb0RlZmluaXRpb25SZWNvcmQgKmdldERlZmluaXRpb24oKSBjb25zdCB7CisgICAgICByZXR1cm4gTmFtZU9yRGVmLmR5bl9jYXN0PE1hY3JvRGVmaW5pdGlvblJlY29yZCAqPigpOworICAgIH0KKworICAgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFByZXByb2Nlc3NlZEVudGl0eSAqUEUpIHsKKyAgICAgIHJldHVybiBQRS0+Z2V0S2luZCgpID09IE1hY3JvRXhwYW5zaW9uS2luZDsKKyAgICB9CisgIH07CisKKyAgLy8vIFxicmllZiBSZWNvcmQgdGhlIGxvY2F0aW9uIG9mIGFuIGluY2x1c2lvbiBkaXJlY3RpdmUsIHN1Y2ggYXMgYW4KKyAgLy8vIFxjIFwjaW5jbHVkZSBvciBcYyBcI2ltcG9ydCBzdGF0ZW1lbnQuCisgIGNsYXNzIEluY2x1c2lvbkRpcmVjdGl2ZSA6IHB1YmxpYyBQcmVwcm9jZXNzaW5nRGlyZWN0aXZlIHsKKyAgcHVibGljOgorICAgIC8vLyBcYnJpZWYgVGhlIGtpbmQgb2YgaW5jbHVzaW9uIGRpcmVjdGl2ZXMga25vd24gdG8gdGhlCisgICAgLy8vIHByZXByb2Nlc3Nvci4KKyAgICBlbnVtIEluY2x1c2lvbktpbmQgeworICAgICAgLy8vIFxicmllZiBBbiBcYyBcI2luY2x1ZGUgZGlyZWN0aXZlLgorICAgICAgSW5jbHVkZSwKKworICAgICAgLy8vIFxicmllZiBBbiBPYmplY3RpdmUtQyBcYyBcI2ltcG9ydCBkaXJlY3RpdmUuCisgICAgICBJbXBvcnQsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBHTlUgXGMgXCNpbmNsdWRlX25leHQgZGlyZWN0aXZlLgorICAgICAgSW5jbHVkZU5leHQsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBDbGFuZyBcYyBcI19faW5jbHVkZV9tYWNyb3MgZGlyZWN0aXZlLgorICAgICAgSW5jbHVkZU1hY3JvcworICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gXGJyaWVmIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgd2FzIGluY2x1ZGVkLCBhcyB3cml0dGVuIGluCisgICAgLy8vIHRoZSBzb3VyY2UuCisgICAgU3RyaW5nUmVmIEZpbGVOYW1lOworCisgICAgLy8vIFxicmllZiBXaGV0aGVyIHRoZSBmaWxlIG5hbWUgd2FzIGluIHF1b3RhdGlvbiBtYXJrczsgb3RoZXJ3aXNlLCBpdCB3YXMKKyAgICAvLy8gaW4gYW5nbGUgYnJhY2tldHMuCisgICAgdW5zaWduZWQgSW5RdW90ZXMgOiAxOworCisgICAgLy8vIFxicmllZiBUaGUga2luZCBvZiBpbmNsdXNpb24gZGlyZWN0aXZlIHdlIGhhdmUuCisgICAgLy8vCisgICAgLy8vIFRoaXMgaXMgYSB2YWx1ZSBvZiB0eXBlIEluY2x1c2lvbktpbmQuCisgICAgdW5zaWduZWQgS2luZCA6IDI7CisKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhlIGluY2x1c2lvbiBkaXJlY3RpdmUgd2FzIGF1dG9tYXRpY2FsbHkgdHVybmVkIGludG8KKyAgICAvLy8gYSBtb2R1bGUgaW1wb3J0LgorICAgIHVuc2lnbmVkIEltcG9ydGVkTW9kdWxlIDogMTsKKworICAgIC8vLyBcYnJpZWYgVGhlIGZpbGUgdGhhdCB3YXMgaW5jbHVkZWQuCisgICAgY29uc3QgRmlsZUVudHJ5ICpGaWxlOworCisgIHB1YmxpYzoKKyAgICBJbmNsdXNpb25EaXJlY3RpdmUoUHJlcHJvY2Vzc2luZ1JlY29yZCAmUFBSZWMsCisgICAgICAgICAgICAgICAgICAgICAgIEluY2x1c2lvbktpbmQgS2luZCwgU3RyaW5nUmVmIEZpbGVOYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJblF1b3RlcywgYm9vbCBJbXBvcnRlZE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZUVudHJ5ICpGaWxlLCBTb3VyY2VSYW5nZSBSYW5nZSk7CisgICAgCisgICAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hhdCBraW5kIG9mIGluY2x1c2lvbiBkaXJlY3RpdmUgdGhpcyBpcy4KKyAgICBJbmNsdXNpb25LaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxJbmNsdXNpb25LaW5kPihLaW5kKTsgfQorICAgIAorICAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGluY2x1ZGVkIGZpbGUgbmFtZSBhcyBpdCB3YXMgd3JpdHRlbiBpbiB0aGUgc291cmNlLgorICAgIFN0cmluZ1JlZiBnZXRGaWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIEZpbGVOYW1lOyB9CisgICAgCisgICAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgaW5jbHVkZWQgZmlsZSBuYW1lIHdhcyB3cml0dGVuIGluIHF1b3RlczsKKyAgICAvLy8gb3RoZXJ3aXNlLCBpdCB3YXMgd3JpdHRlbiBpbiBhbmdsZSBicmFja2V0cy4KKyAgICBib29sIHdhc0luUXVvdGVzKCkgY29uc3QgeyByZXR1cm4gSW5RdW90ZXM7IH0KKworICAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGluY2x1c2lvbiBkaXJlY3RpdmUgd2FzIGF1dG9tYXRpY2FsbHkKKyAgICAvLy8gdHVybmVkIGludG8gYSBtb2R1bGUgaW1wb3J0LgorICAgIGJvb2wgaW1wb3J0ZWRNb2R1bGUoKSBjb25zdCB7IHJldHVybiBJbXBvcnRlZE1vZHVsZTsgfQorICAgIAorICAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGZpbGUgZW50cnkgZm9yIHRoZSBhY3R1YWwgZmlsZSB0aGF0IHdhcyBpbmNsdWRlZAorICAgIC8vLyBieSB0aGlzIGRpcmVjdGl2ZS4KKyAgICBjb25zdCBGaWxlRW50cnkgKmdldEZpbGUoKSBjb25zdCB7IHJldHVybiBGaWxlOyB9CisgICAgICAgIAorICAgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFByZXByb2Nlc3NlZEVudGl0eSAqUEUpIHsKKyAgICAgIHJldHVybiBQRS0+Z2V0S2luZCgpID09IEluY2x1c2lvbkRpcmVjdGl2ZUtpbmQ7CisgICAgfQorICB9OworICAKKyAgLy8vIFxicmllZiBBbiBhYnN0cmFjdCBjbGFzcyB0aGF0IHNob3VsZCBiZSBzdWJjbGFzc2VkIGJ5IGFueSBleHRlcm5hbCBzb3VyY2UKKyAgLy8vIG9mIHByZXByb2Nlc3NpbmcgcmVjb3JkIGVudHJpZXMuCisgIGNsYXNzIEV4dGVybmFsUHJlcHJvY2Vzc2luZ1JlY29yZFNvdXJjZSB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5FeHRlcm5hbFByZXByb2Nlc3NpbmdSZWNvcmRTb3VyY2UoKTsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFJlYWQgYSBwcmVhbGxvY2F0ZWQgcHJlcHJvY2Vzc2VkIGVudGl0eSBmcm9tIHRoZSBleHRlcm5hbCBzb3VyY2UuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm5zIG51bGwgaWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhhdCBwcmV2ZW50ZWQgdGhlIHByZXByb2Nlc3NlZAorICAgIC8vLyBlbnRpdHkgZnJvbSBiZWluZyBsb2FkZWQuCisgICAgdmlydHVhbCBQcmVwcm9jZXNzZWRFbnRpdHkgKlJlYWRQcmVwcm9jZXNzZWRFbnRpdHkodW5zaWduZWQgSW5kZXgpID0gMDsKKworICAgIC8vLyBcYnJpZWYgUmV0dXJucyBhIHBhaXIgb2YgW0JlZ2luLCBFbmQpIGluZGljZXMgb2YgcHJlYWxsb2NhdGVkCisgICAgLy8vIHByZXByb2Nlc3NlZCBlbnRpdGllcyB0aGF0IFxwIFJhbmdlIGVuY29tcGFzc2VzLgorICAgIHZpcnR1YWwgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4KKyAgICAgICAgZmluZFByZXByb2Nlc3NlZEVudGl0aWVzSW5SYW5nZShTb3VyY2VSYW5nZSBSYW5nZSkgPSAwOworCisgICAgLy8vIFxicmllZiBPcHRpb25hbGx5IHJldHVybnMgdHJ1ZSBvciBmYWxzZSBpZiB0aGUgcHJlYWxsb2NhdGVkIHByZXByb2Nlc3NlZAorICAgIC8vLyBlbnRpdHkgd2l0aCBpbmRleCBccCBJbmRleCBjYW1lIGZyb20gZmlsZSBccCBGSUQuCisgICAgdmlydHVhbCBPcHRpb25hbDxib29sPiBpc1ByZXByb2Nlc3NlZEVudGl0eUluRmlsZUlEKHVuc2lnbmVkIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSUQgRklEKSB7CisgICAgICByZXR1cm4gTm9uZTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJlYWQgYSBwcmVhbGxvY2F0ZWQgc2tpcHBlZCByYW5nZSBmcm9tIHRoZSBleHRlcm5hbCBzb3VyY2UuCisgICAgdmlydHVhbCBTb3VyY2VSYW5nZSBSZWFkU2tpcHBlZFJhbmdlKHVuc2lnbmVkIEluZGV4KSA9IDA7CisgIH07CisgIAorICAvLy8gXGJyaWVmIEEgcmVjb3JkIG9mIHRoZSBzdGVwcyB0YWtlbiB3aGlsZSBwcmVwcm9jZXNzaW5nIGEgc291cmNlIGZpbGUsCisgIC8vLyBpbmNsdWRpbmcgdGhlIHZhcmlvdXMgcHJlcHJvY2Vzc2luZyBkaXJlY3RpdmVzIHByb2Nlc3NlZCwgbWFjcm9zIAorICAvLy8gZXhwYW5kZWQsIGV0Yy4KKyAgY2xhc3MgUHJlcHJvY2Vzc2luZ1JlY29yZCA6IHB1YmxpYyBQUENhbGxiYWNrcyB7CisgICAgU291cmNlTWFuYWdlciAmU291cmNlTWdyOworICAgIAorICAgIC8vLyBcYnJpZWYgQWxsb2NhdG9yIHVzZWQgdG8gc3RvcmUgcHJlcHJvY2Vzc2luZyBvYmplY3RzLgorICAgIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgQnVtcEFsbG9jOworCisgICAgLy8vIFxicmllZiBUaGUgc2V0IG9mIHByZXByb2Nlc3NlZCBlbnRpdGllcyBpbiB0aGlzIHJlY29yZCwgaW4gb3JkZXIgdGhleQorICAgIC8vLyB3ZXJlIHNlZW4uCisgICAgc3RkOjp2ZWN0b3I8UHJlcHJvY2Vzc2VkRW50aXR5ICo+IFByZXByb2Nlc3NlZEVudGl0aWVzOworICAgIAorICAgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiBwcmVwcm9jZXNzZWQgZW50aXRpZXMgaW4gdGhpcyByZWNvcmQgdGhhdCBoYXZlIGJlZW4KKyAgICAvLy8gbG9hZGVkIGZyb20gZXh0ZXJuYWwgc291cmNlcy4KKyAgICAvLy8KKyAgICAvLy8gVGhlIGVudHJpZXMgaW4gdGhpcyB2ZWN0b3IgYXJlIGxvYWRlZCBsYXppbHkgZnJvbSB0aGUgZXh0ZXJuYWwgc291cmNlLAorICAgIC8vLyBhbmQgYXJlIHJlZmVyZW5jZWQgYnkgdGhlIGl0ZXJhdG9yIHVzaW5nIG5lZ2F0aXZlIGluZGljZXMuCisgICAgc3RkOjp2ZWN0b3I8UHJlcHJvY2Vzc2VkRW50aXR5ICo+IExvYWRlZFByZXByb2Nlc3NlZEVudGl0aWVzOworCisgICAgLy8vIFxicmllZiBUaGUgc2V0IG9mIHJhbmdlcyB0aGF0IHdlcmUgc2tpcHBlZCBieSB0aGUgcHJlcHJvY2Vzc29yLAorICAgIHN0ZDo6dmVjdG9yPFNvdXJjZVJhbmdlPiBTa2lwcGVkUmFuZ2VzOworCisgICAgYm9vbCBTa2lwcGVkUmFuZ2VzQWxsTG9hZGVkID0gdHJ1ZTsKKworICAgIC8vLyBcYnJpZWYgR2xvYmFsIChsb2FkZWQgb3IgbG9jYWwpIElEIGZvciBhIHByZXByb2Nlc3NlZCBlbnRpdHkuCisgICAgLy8vIE5lZ2F0aXZlIHZhbHVlcyBhcmUgdXNlZCB0byBpbmRpY2F0ZSBwcmVwcm9jZXNzZWQgZW50aXRpZXMKKyAgICAvLy8gbG9hZGVkIGZyb20gdGhlIGV4dGVybmFsIHNvdXJjZSB3aGlsZSBub24tbmVnYXRpdmUgdmFsdWVzIGFyZSB1c2VkIHRvCisgICAgLy8vIGluZGljYXRlIHByZXByb2Nlc3NlZCBlbnRpdGllcyBpbnRyb2R1Y2VkIGJ5IHRoZSBjdXJyZW50IHByZXByb2Nlc3Nvci4KKyAgICAvLy8gVmFsdWUgLTEgY29ycmVzcG9uZHMgdG8gZWxlbWVudCAwIGluIHRoZSBsb2FkZWQgZW50aXRpZXMgdmVjdG9yLAorICAgIC8vLyB2YWx1ZSAtMiBjb3JyZXNwb25kcyB0byBlbGVtZW50IDEgaW4gdGhlIGxvYWRlZCBlbnRpdGllcyB2ZWN0b3IsIGV0Yy4KKyAgICAvLy8gVmFsdWUgMCBpcyBhbiBpbnZhbGlkIHZhbHVlLCB0aGUgaW5kZXggdG8gbG9jYWwgZW50aXRpZXMgaXMgMS1iYXNlZCwKKyAgICAvLy8gdmFsdWUgMSBjb3JyZXNwb25kcyB0byBlbGVtZW50IDAgaW4gdGhlIGxvY2FsIGVudGl0aWVzIHZlY3RvciwKKyAgICAvLy8gdmFsdWUgMiBjb3JyZXNwb25kcyB0byBlbGVtZW50IDEgaW4gdGhlIGxvY2FsIGVudGl0aWVzIHZlY3RvciwgZXRjLgorICAgIGNsYXNzIFBQRW50aXR5SUQgeworICAgICAgZnJpZW5kIGNsYXNzIFByZXByb2Nlc3NpbmdSZWNvcmQ7CisKKyAgICAgIGludCBJRCA9IDA7CisKKyAgICAgIGV4cGxpY2l0IFBQRW50aXR5SUQoaW50IElEKSA6IElEKElEKSB7fQorCisgICAgcHVibGljOgorICAgICAgUFBFbnRpdHlJRCgpID0gZGVmYXVsdDsKKyAgICB9OworCisgICAgc3RhdGljIFBQRW50aXR5SUQgZ2V0UFBFbnRpdHlJRCh1bnNpZ25lZCBJbmRleCwgYm9vbCBpc0xvYWRlZCkgeworICAgICAgcmV0dXJuIGlzTG9hZGVkID8gUFBFbnRpdHlJRCgtaW50KEluZGV4KS0xKSA6IFBQRW50aXR5SUQoSW5kZXgrMSk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBNYXBwaW5nIGZyb20gTWFjcm9JbmZvIHN0cnVjdHVyZXMgdG8gdGhlaXIgZGVmaW5pdGlvbnMuCisgICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgTWFjcm9JbmZvICosIE1hY3JvRGVmaW5pdGlvblJlY29yZCAqPiBNYWNyb0RlZmluaXRpb25zOworCisgICAgLy8vIFxicmllZiBFeHRlcm5hbCBzb3VyY2Ugb2YgcHJlcHJvY2Vzc2VkIGVudGl0aWVzLgorICAgIEV4dGVybmFsUHJlcHJvY2Vzc2luZ1JlY29yZFNvdXJjZSAqRXh0ZXJuYWxTb3VyY2UgPSBudWxscHRyOworCisgICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgcHJlcHJvY2Vzc2VkIGVudGl0eSBhdCB0aGUgZ2l2ZW4gSUQuCisgICAgUHJlcHJvY2Vzc2VkRW50aXR5ICpnZXRQcmVwcm9jZXNzZWRFbnRpdHkoUFBFbnRpdHlJRCBQUElEKTsKKworICAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvYWRlZCBwcmVwcm9jZXNzZWQgZW50aXR5IGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgICBQcmVwcm9jZXNzZWRFbnRpdHkgKmdldExvYWRlZFByZXByb2Nlc3NlZEVudGl0eSh1bnNpZ25lZCBJbmRleCk7CisgICAgCisgICAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBwcmVwcm9jZXNzZWQgZW50aXRpZXMgdGhhdCB3ZXJlCisgICAgLy8vIGxvYWRlZCAob3IgY2FuIGJlIGxvYWRlZCkgZnJvbSBhbiBleHRlcm5hbCBzb3VyY2UuCisgICAgdW5zaWduZWQgZ2V0TnVtTG9hZGVkUHJlcHJvY2Vzc2VkRW50aXRpZXMoKSBjb25zdCB7CisgICAgICByZXR1cm4gTG9hZGVkUHJlcHJvY2Vzc2VkRW50aXRpZXMuc2l6ZSgpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJucyBhIHBhaXIgb2YgW0JlZ2luLCBFbmQpIGluZGljZXMgb2YgbG9jYWwgcHJlcHJvY2Vzc2VkCisgICAgLy8vIGVudGl0aWVzIHRoYXQgXHAgUmFuZ2UgZW5jb21wYXNzZXMuCisgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4KKyAgICAgIGZpbmRMb2NhbFByZXByb2Nlc3NlZEVudGl0aWVzSW5SYW5nZShTb3VyY2VSYW5nZSBSYW5nZSkgY29uc3Q7CisgICAgdW5zaWduZWQgZmluZEJlZ2luTG9jYWxQcmVwcm9jZXNzZWRFbnRpdHkoU291cmNlTG9jYXRpb24gTG9jKSBjb25zdDsKKyAgICB1bnNpZ25lZCBmaW5kRW5kTG9jYWxQcmVwcm9jZXNzZWRFbnRpdHkoU291cmNlTG9jYXRpb24gTG9jKSBjb25zdDsKKworICAgIC8vLyBcYnJpZWYgQWxsb2NhdGUgc3BhY2UgZm9yIGEgbmV3IHNldCBvZiBsb2FkZWQgcHJlcHJvY2Vzc2VkIGVudGl0aWVzLgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyBUaGUgaW5kZXggaW50byB0aGUgc2V0IG9mIGxvYWRlZCBwcmVwcm9jZXNzZWQgZW50aXRpZXMsIHdoaWNoCisgICAgLy8vIGNvcnJlc3BvbmRzIHRvIHRoZSBmaXJzdCBuZXdseS1hbGxvY2F0ZWQgZW50aXR5LgorICAgIHVuc2lnbmVkIGFsbG9jYXRlTG9hZGVkRW50aXRpZXModW5zaWduZWQgTnVtRW50aXRpZXMpOworCisgICAgLy8vIFxicmllZiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSBuZXcgc2V0IG9mIGxvYWRlZCBwcmVwcm9jZXNzZWQgc2tpcHBlZAorICAgIC8vLyByYW5nZXMuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm5zIFRoZSBpbmRleCBpbnRvIHRoZSBzZXQgb2YgbG9hZGVkIHByZXByb2Nlc3NlZCByYW5nZXMsIHdoaWNoCisgICAgLy8vIGNvcnJlc3BvbmRzIHRvIHRoZSBmaXJzdCBuZXdseS1hbGxvY2F0ZWQgcmFuZ2UuCisgICAgdW5zaWduZWQgYWxsb2NhdGVTa2lwcGVkUmFuZ2VzKHVuc2lnbmVkIE51bVJhbmdlcyk7CisKKyAgICAvLy8gXGJyaWVmIEVuc3VyZXMgdGhhdCBhbGwgZXh0ZXJuYWwgc2tpcHBlZCByYW5nZXMgaGF2ZSBiZWVuIGxvYWRlZC4KKyAgICB2b2lkIGVuc3VyZVNraXBwZWRSYW5nZXNMb2FkZWQoKTsKKworICAgIC8vLyBcYnJpZWYgUmVnaXN0ZXIgYSBuZXcgbWFjcm8gZGVmaW5pdGlvbi4KKyAgICB2b2lkIFJlZ2lzdGVyTWFjcm9EZWZpbml0aW9uKE1hY3JvSW5mbyAqTWFjcm8sIE1hY3JvRGVmaW5pdGlvblJlY29yZCAqRGVmKTsKKworICBwdWJsaWM6CisgICAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBuZXcgcHJlcHJvY2Vzc2luZyByZWNvcmQuCisgICAgZXhwbGljaXQgUHJlcHJvY2Vzc2luZ1JlY29yZChTb3VyY2VNYW5hZ2VyICZTTSk7CisKKyAgICAvLy8gXGJyaWVmIEFsbG9jYXRlIG1lbW9yeSBpbiB0aGUgcHJlcHJvY2Vzc2luZyByZWNvcmQuCisgICAgdm9pZCAqQWxsb2NhdGUodW5zaWduZWQgU2l6ZSwgdW5zaWduZWQgQWxpZ24gPSA4KSB7CisgICAgICByZXR1cm4gQnVtcEFsbG9jLkFsbG9jYXRlKFNpemUsIEFsaWduKTsKKyAgICB9CisgICAgCisgICAgLy8vIFxicmllZiBEZWFsbG9jYXRlIG1lbW9yeSBpbiB0aGUgcHJlcHJvY2Vzc2luZyByZWNvcmQuCisgICAgdm9pZCBEZWFsbG9jYXRlKHZvaWQgKlB0cikge30KKworICAgIHNpemVfdCBnZXRUb3RhbE1lbW9yeSgpIGNvbnN0OworCisgICAgU291cmNlTWFuYWdlciAmZ2V0U291cmNlTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZU1ncjsgfQorCisgICAgLy8vIEl0ZXJhdGlvbiBvdmVyIHRoZSBwcmVwcm9jZXNzZWQgZW50aXRpZXMuCisgICAgLy8vCisgICAgLy8vIEluIGEgY29tcGxldGUgaXRlcmF0aW9uLCB0aGUgaXRlcmF0b3Igd2Fsa3MgdGhlIHJhbmdlIFstTSwgTiksCisgICAgLy8vIHdoZXJlIG5lZ2F0aXZlIHZhbHVlcyBhcmUgdXNlZCB0byBpbmRpY2F0ZSBwcmVwcm9jZXNzZWQgZW50aXRpZXMKKyAgICAvLy8gbG9hZGVkIGZyb20gdGhlIGV4dGVybmFsIHNvdXJjZSB3aGlsZSBub24tbmVnYXRpdmUgdmFsdWVzIGFyZSB1c2VkIHRvCisgICAgLy8vIGluZGljYXRlIHByZXByb2Nlc3NlZCBlbnRpdGllcyBpbnRyb2R1Y2VkIGJ5IHRoZSBjdXJyZW50IHByZXByb2Nlc3Nvci4KKyAgICAvLy8gSG93ZXZlciwgdG8gcHJvdmlkZSBpdGVyYXRpb24gaW4gc291cmNlIG9yZGVyIChmb3IsIGUuZy4sIGNoYWluZWQKKyAgICAvLy8gcHJlY29tcGlsZWQgaGVhZGVycyksIGRlcmVmZXJlbmNpbmcgdGhlIGl0ZXJhdG9yIGZsaXBzIHRoZSBuZWdhdGl2ZQorICAgIC8vLyB2YWx1ZXMgKGNvcnJlc3BvbmRpbmcgdG8gbG9hZGVkIGVudGl0aWVzKSwgc28gdGhhdCBwb3NpdGlvbiAtTQorICAgIC8vLyBjb3JyZXNwb25kcyB0byBlbGVtZW50IDAgaW4gdGhlIGxvYWRlZCBlbnRpdGllcyB2ZWN0b3IsIHBvc2l0aW9uIC1NKzEKKyAgICAvLy8gY29ycmVzcG9uZHMgdG8gZWxlbWVudCAxIGluIHRoZSBsb2FkZWQgZW50aXRpZXMgdmVjdG9yLCBldGMuIFRoaXMKKyAgICAvLy8gZ2l2ZXMgdXMgYSByZWFzb25hYmx5IGVmZmljaWVudCwgc291cmNlLW9yZGVyIHdhbGsuCisgICAgLy8vCisgICAgLy8vIFdlIGRlZmluZSB0aGlzIGFzIGEgd3JhcHBpbmcgaXRlcmF0b3IgYXJvdW5kIGFuIGludC4gVGhlCisgICAgLy8vIGl0ZXJhdG9yX2FkYXB0b3JfYmFzZSBjbGFzcyBmb3J3YXJkcyB0aGUgaXRlcmF0b3IgbWV0aG9kcyB0byBiYXNpYworICAgIC8vLyBpbnRlZ2VyIGFyaXRobWV0aWMuCisgICAgY2xhc3MgaXRlcmF0b3IgOiBwdWJsaWMgbGx2bTo6aXRlcmF0b3JfYWRhcHRvcl9iYXNlPAorICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLCBpbnQsIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJlcHJvY2Vzc2VkRW50aXR5ICosIGludCwgUHJlcHJvY2Vzc2VkRW50aXR5ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJlcHJvY2Vzc2VkRW50aXR5ICo+IHsKKyAgICAgIGZyaWVuZCBjbGFzcyBQcmVwcm9jZXNzaW5nUmVjb3JkOworCisgICAgICBQcmVwcm9jZXNzaW5nUmVjb3JkICpTZWxmOworCisgICAgICBpdGVyYXRvcihQcmVwcm9jZXNzaW5nUmVjb3JkICpTZWxmLCBpbnQgUG9zaXRpb24pCisgICAgICAgICAgOiBpdGVyYXRvcjo6aXRlcmF0b3JfYWRhcHRvcl9iYXNlKFBvc2l0aW9uKSwgU2VsZihTZWxmKSB7fQorCisgICAgcHVibGljOgorICAgICAgaXRlcmF0b3IoKSA6IGl0ZXJhdG9yKG51bGxwdHIsIDApIHt9CisKKyAgICAgIFByZXByb2Nlc3NlZEVudGl0eSAqb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgICBib29sIGlzTG9hZGVkID0gdGhpcy0+SSA8IDA7CisgICAgICAgIHVuc2lnbmVkIEluZGV4ID0gaXNMb2FkZWQgPworICAgICAgICAgICAgU2VsZi0+TG9hZGVkUHJlcHJvY2Vzc2VkRW50aXRpZXMuc2l6ZSgpICsgdGhpcy0+SSA6IHRoaXMtPkk7CisgICAgICAgIFBQRW50aXR5SUQgSUQgPSBTZWxmLT5nZXRQUEVudGl0eUlEKEluZGV4LCBpc0xvYWRlZCk7CisgICAgICAgIHJldHVybiBTZWxmLT5nZXRQcmVwcm9jZXNzZWRFbnRpdHkoSUQpOworICAgICAgfQorICAgICAgUHJlcHJvY2Vzc2VkRW50aXR5ICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gKip0aGlzOyB9CisgICAgfTsKKworICAgIC8vLyBcYnJpZWYgQmVnaW4gaXRlcmF0b3IgZm9yIGFsbCBwcmVwcm9jZXNzZWQgZW50aXRpZXMuCisgICAgaXRlcmF0b3IgYmVnaW4oKSB7CisgICAgICByZXR1cm4gaXRlcmF0b3IodGhpcywgLShpbnQpTG9hZGVkUHJlcHJvY2Vzc2VkRW50aXRpZXMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIEVuZCBpdGVyYXRvciBmb3IgYWxsIHByZXByb2Nlc3NlZCBlbnRpdGllcy4KKyAgICBpdGVyYXRvciBlbmQoKSB7CisgICAgICByZXR1cm4gaXRlcmF0b3IodGhpcywgUHJlcHJvY2Vzc2VkRW50aXRpZXMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIEJlZ2luIGl0ZXJhdG9yIGZvciBsb2NhbCwgbm9uLWxvYWRlZCwgcHJlcHJvY2Vzc2VkIGVudGl0aWVzLgorICAgIGl0ZXJhdG9yIGxvY2FsX2JlZ2luKCkgeworICAgICAgcmV0dXJuIGl0ZXJhdG9yKHRoaXMsIDApOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgRW5kIGl0ZXJhdG9yIGZvciBsb2NhbCwgbm9uLWxvYWRlZCwgcHJlcHJvY2Vzc2VkIGVudGl0aWVzLgorICAgIGl0ZXJhdG9yIGxvY2FsX2VuZCgpIHsKKyAgICAgIHJldHVybiBpdGVyYXRvcih0aGlzLCBQcmVwcm9jZXNzZWRFbnRpdGllcy5zaXplKCkpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgaXRlcmF0b3IgcmFuZ2UgZm9yIHRoZSBnaXZlbiByYW5nZSBvZiBsb2FkZWQKKyAgICAvLy8gcHJlcHJvY2Vzc2VkIGVudGl0aWVzLgorICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGl0ZXJhdG9yPiBnZXRJdGVyYXRvcnNGb3JMb2FkZWRSYW5nZSh1bnNpZ25lZCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY291bnQpIHsKKyAgICAgIHVuc2lnbmVkIGVuZCA9IHN0YXJ0ICsgY291bnQ7CisgICAgICBhc3NlcnQoZW5kIDw9IExvYWRlZFByZXByb2Nlc3NlZEVudGl0aWVzLnNpemUoKSk7CisgICAgICByZXR1cm4gbGx2bTo6bWFrZV9yYW5nZSgKKyAgICAgICAgICBpdGVyYXRvcih0aGlzLCBpbnQoc3RhcnQpIC0gTG9hZGVkUHJlcHJvY2Vzc2VkRW50aXRpZXMuc2l6ZSgpKSwKKyAgICAgICAgICBpdGVyYXRvcih0aGlzLCBpbnQoZW5kKSAtIExvYWRlZFByZXByb2Nlc3NlZEVudGl0aWVzLnNpemUoKSkpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJucyBhIHJhbmdlIG9mIHByZXByb2Nlc3NlZCBlbnRpdGllcyB0aGF0IHNvdXJjZSByYW5nZSBccCBSCisgICAgLy8vIGVuY29tcGFzc2VzLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gUiB0aGUgcmFuZ2UgdG8gbG9vayBmb3IgcHJlcHJvY2Vzc2VkIGVudGl0aWVzLgorICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGl0ZXJhdG9yPgorICAgIGdldFByZXByb2Nlc3NlZEVudGl0aWVzSW5SYW5nZShTb3VyY2VSYW5nZSBSKTsKKworICAgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBwcmVwcm9jZXNzZWQgZW50aXR5IHRoYXQgXHAgUFBFSSBpdGVyYXRvcgorICAgIC8vLyBwb2ludHMgdG8gaXMgY29taW5nIGZyb20gdGhlIGZpbGUgXHAgRklELgorICAgIC8vLworICAgIC8vLyBDYW4gYmUgdXNlZCB0byBhdm9pZCBpbXBsaWNpdCBkZXNlcmlhbGl6YXRpb25zIG9mIHByZWFsbG9jYXRlZAorICAgIC8vLyBwcmVwcm9jZXNzZWQgZW50aXRpZXMgaWYgd2Ugb25seSBjYXJlIGFib3V0IGVudGl0aWVzIG9mIGEgc3BlY2lmaWMgZmlsZQorICAgIC8vLyBhbmQgbm90IGZyb20gZmlsZXMgXCNpbmNsdWRlZCBpbiB0aGUgcmFuZ2UgZ2l2ZW4gYXQKKyAgICAvLy8gXHNlZSBnZXRQcmVwcm9jZXNzZWRFbnRpdGllc0luUmFuZ2UuCisgICAgYm9vbCBpc0VudGl0eUluRmlsZUlEKGl0ZXJhdG9yIFBQRUksIEZpbGVJRCBGSUQpOworCisgICAgLy8vIFxicmllZiBBZGQgYSBuZXcgcHJlcHJvY2Vzc2VkIGVudGl0eSB0byB0aGlzIHJlY29yZC4KKyAgICBQUEVudGl0eUlEIGFkZFByZXByb2Nlc3NlZEVudGl0eShQcmVwcm9jZXNzZWRFbnRpdHkgKkVudGl0eSk7CisKKyAgICAvLy8gXGJyaWVmIFNldCB0aGUgZXh0ZXJuYWwgc291cmNlIGZvciBwcmVwcm9jZXNzZWQgZW50aXRpZXMuCisgICAgdm9pZCBTZXRFeHRlcm5hbFNvdXJjZShFeHRlcm5hbFByZXByb2Nlc3NpbmdSZWNvcmRTb3VyY2UgJlNvdXJjZSk7CisKKyAgICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBleHRlcm5hbCBzb3VyY2UgZm9yIHByZXByb2Nlc3NlZCBlbnRpdGllcy4KKyAgICBFeHRlcm5hbFByZXByb2Nlc3NpbmdSZWNvcmRTb3VyY2UgKmdldEV4dGVybmFsU291cmNlKCkgY29uc3QgeworICAgICAgcmV0dXJuIEV4dGVybmFsU291cmNlOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG1hY3JvIGRlZmluaXRpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4KKyAgICAvLy8gXGMgTWFjcm9JbmZvLgorICAgIE1hY3JvRGVmaW5pdGlvblJlY29yZCAqZmluZE1hY3JvRGVmaW5pdGlvbihjb25zdCBNYWNyb0luZm8gKk1JKTsKKworICAgIC8vLyBcYnJpZWYgUmV0cmlldmUgYWxsIHJhbmdlcyB0aGF0IGdvdCBza2lwcGVkIHdoaWxlIHByZXByb2Nlc3NpbmcuCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U291cmNlUmFuZ2U+ICZnZXRTa2lwcGVkUmFuZ2VzKCkgeworICAgICAgZW5zdXJlU2tpcHBlZFJhbmdlc0xvYWRlZCgpOworICAgICAgcmV0dXJuIFNraXBwZWRSYW5nZXM7CisgICAgfQorICAgICAgICAKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQVNUUmVhZGVyOworICAgIGZyaWVuZCBjbGFzcyBBU1RXcml0ZXI7CisKKyAgICB2b2lkIE1hY3JvRXhwYW5kcyhjb25zdCBUb2tlbiAmSWQsIGNvbnN0IE1hY3JvRGVmaW5pdGlvbiAmTUQsCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgUmFuZ2UsIGNvbnN0IE1hY3JvQXJncyAqQXJncykgb3ZlcnJpZGU7CisgICAgdm9pZCBNYWNyb0RlZmluZWQoY29uc3QgVG9rZW4gJklkLCBjb25zdCBNYWNyb0RpcmVjdGl2ZSAqTUQpIG92ZXJyaWRlOworICAgIHZvaWQgTWFjcm9VbmRlZmluZWQoY29uc3QgVG9rZW4gJklkLCBjb25zdCBNYWNyb0RlZmluaXRpb24gJk1ELAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjcm9EaXJlY3RpdmUgKlVuZGVmKSBvdmVycmlkZTsKKyAgICB2b2lkIEluY2x1c2lvbkRpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBIYXNoTG9jLCBjb25zdCBUb2tlbiAmSW5jbHVkZVRvaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZU5hbWUsIGJvb2wgSXNBbmdsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNvdXJjZVJhbmdlIEZpbGVuYW1lUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZUVudHJ5ICpGaWxlLCBTdHJpbmdSZWYgU2VhcmNoUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgUmVsYXRpdmVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZSAqSW1wb3J0ZWQpIG92ZXJyaWRlOworICAgIHZvaWQgSWZkZWYoU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAorICAgICAgICAgICAgICAgY29uc3QgTWFjcm9EZWZpbml0aW9uICZNRCkgb3ZlcnJpZGU7CisgICAgdm9pZCBJZm5kZWYoU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAorICAgICAgICAgICAgICAgIGNvbnN0IE1hY3JvRGVmaW5pdGlvbiAmTUQpIG92ZXJyaWRlOworCisgICAgLy8vIFxicmllZiBIb29rIGNhbGxlZCB3aGVuZXZlciB0aGUgJ2RlZmluZWQnIG9wZXJhdG9yIGlzIHNlZW4uCisgICAgdm9pZCBEZWZpbmVkKGNvbnN0IFRva2VuICZNYWNyb05hbWVUb2ssIGNvbnN0IE1hY3JvRGVmaW5pdGlvbiAmTUQsCisgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFJhbmdlKSBvdmVycmlkZTsKKworICAgIHZvaWQgU291cmNlUmFuZ2VTa2lwcGVkKFNvdXJjZVJhbmdlIFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZGlmTG9jKSBvdmVycmlkZTsKKworICAgIHZvaWQgYWRkTWFjcm9FeHBhbnNpb24oY29uc3QgVG9rZW4gJklkLCBjb25zdCBNYWNyb0luZm8gKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgUmFuZ2UpOworCisgICAgLy8vIFxicmllZiBDYWNoZWQgcmVzdWx0IG9mIHRoZSBsYXN0IFxzZWUgZ2V0UHJlcHJvY2Vzc2VkRW50aXRpZXNJblJhbmdlCisgICAgLy8vIHF1ZXJ5LgorICAgIHN0cnVjdCB7CisgICAgICBTb3VyY2VSYW5nZSBSYW5nZTsKKyAgICAgIHN0ZDo6cGFpcjxpbnQsIGludD4gUmVzdWx0OworICAgIH0gQ2FjaGVkUmFuZ2VRdWVyeTsKKworICAgIHN0ZDo6cGFpcjxpbnQsIGludD4gZ2V0UHJlcHJvY2Vzc2VkRW50aXRpZXNJblJhbmdlU2xvdyhTb3VyY2VSYW5nZSBSKTsKKyAgfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworaW5saW5lIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgYnl0ZXMsIGNsYW5nOjpQcmVwcm9jZXNzaW5nUmVjb3JkICZQUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYWxpZ25tZW50KSBub2V4Y2VwdCB7CisgIHJldHVybiBQUi5BbGxvY2F0ZShieXRlcywgYWxpZ25tZW50KTsKK30KKworaW5saW5lIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKnB0ciwgY2xhbmc6OlByZXByb2Nlc3NpbmdSZWNvcmQgJlBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkKSBub2V4Y2VwdCB7CisgIFBSLkRlYWxsb2NhdGUocHRyKTsKK30KKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfTEVYX1BSRVBST0NFU1NJTkdSRUNPUkRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L1ByZXByb2Nlc3Nvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvTGV4L1ByZXByb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NTYwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvUHJlcHJvY2Vzc29yLmgKQEAgLTAsMCArMSwyMTg4IEBACisvLz09PS0gUHJlcHJvY2Vzc29yLmggLSBDIExhbmd1YWdlIEZhbWlseSBQcmVwcm9jZXNzb3IgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHRoZSBjbGFuZzo6UHJlcHJvY2Vzc29yIGludGVyZmFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfTEVYX1BSRVBST0NFU1NPUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfTEVYX1BSRVBST0NFU1NPUl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9CdWlsdGlucy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Nb2R1bGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Ub2tlbktpbmRzLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L0xleGVyLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L01hY3JvSW5mby5oIgorI2luY2x1ZGUgImNsYW5nL0xleC9Nb2R1bGVMb2FkZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9MZXgvTW9kdWxlTWFwLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L1BQQ2FsbGJhY2tzLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L1BUSExleGVyLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L1Rva2VuLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L1Rva2VuTGV4ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UaW55UHRyVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUmVnaXN0cnkuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZTx1bnNpZ25lZCBJbnRlcm5hbExlbj4gY2xhc3MgU21hbGxTdHJpbmc7CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQ29kZUNvbXBsZXRpb25IYW5kbGVyOworY2xhc3MgQ29tbWVudEhhbmRsZXI7CitjbGFzcyBEaXJlY3RvcnlFbnRyeTsKK2NsYXNzIERpcmVjdG9yeUxvb2t1cDsKK2NsYXNzIEV4dGVybmFsUHJlcHJvY2Vzc29yU291cmNlOworY2xhc3MgRmlsZUVudHJ5OworY2xhc3MgRmlsZU1hbmFnZXI7CitjbGFzcyBIZWFkZXJTZWFyY2g7CitjbGFzcyBNYWNyb0FyZ3M7CitjbGFzcyBNZW1vcnlCdWZmZXJDYWNoZTsKK2NsYXNzIFByYWdtYUhhbmRsZXI7CitjbGFzcyBQcmFnbWFOYW1lc3BhY2U7CitjbGFzcyBQcmVwcm9jZXNzaW5nUmVjb3JkOworY2xhc3MgUHJlcHJvY2Vzc29yTGV4ZXI7CitjbGFzcyBQcmVwcm9jZXNzb3JPcHRpb25zOworY2xhc3MgUFRITWFuYWdlcjsKK2NsYXNzIFNjcmF0Y2hCdWZmZXI7CitjbGFzcyBUYXJnZXRJbmZvOworCisvLy8gXGJyaWVmIFN0b3JlcyB0b2tlbiBpbmZvcm1hdGlvbiBmb3IgY29tcGFyaW5nIGFjdHVhbCB0b2tlbnMgd2l0aAorLy8vIHByZWRlZmluZWQgdmFsdWVzLiAgT25seSBoYW5kbGVzIHNpbXBsZSB0b2tlbnMgYW5kIGlkZW50aWZpZXJzLgorY2xhc3MgVG9rZW5WYWx1ZSB7CisgIHRvazo6VG9rZW5LaW5kIEtpbmQ7CisgIElkZW50aWZpZXJJbmZvICpJSTsKKworcHVibGljOgorICBUb2tlblZhbHVlKHRvazo6VG9rZW5LaW5kIEtpbmQpIDogS2luZChLaW5kKSwgSUkobnVsbHB0cikgeworICAgIGFzc2VydChLaW5kICE9IHRvazo6cmF3X2lkZW50aWZpZXIgJiYgIlJhdyBpZGVudGlmaWVycyBhcmUgbm90IHN1cHBvcnRlZC4iKTsKKyAgICBhc3NlcnQoS2luZCAhPSB0b2s6OmlkZW50aWZpZXIgJiYKKyAgICAgICAgICAgIklkZW50aWZpZXJzIHNob3VsZCBiZSBjcmVhdGVkIGJ5IFRva2VuVmFsdWUoSWRlbnRpZmllckluZm8gKikiKTsKKyAgICBhc3NlcnQoIXRvazo6aXNMaXRlcmFsKEtpbmQpICYmICJMaXRlcmFscyBhcmUgbm90IHN1cHBvcnRlZC4iKTsKKyAgICBhc3NlcnQoIXRvazo6aXNBbm5vdGF0aW9uKEtpbmQpICYmICJBbm5vdGF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZC4iKTsKKyAgfQorCisgIFRva2VuVmFsdWUoSWRlbnRpZmllckluZm8gKklJKSA6IEtpbmQodG9rOjppZGVudGlmaWVyKSwgSUkoSUkpIHt9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRva2VuICZUb2spIGNvbnN0IHsKKyAgICByZXR1cm4gVG9rLmdldEtpbmQoKSA9PSBLaW5kICYmCisgICAgICAgICghSUkgfHwgSUkgPT0gVG9rLmdldElkZW50aWZpZXJJbmZvKCkpOworICB9Cit9OworCisvLy8gXGJyaWVmIENvbnRleHQgaW4gd2hpY2ggbWFjcm8gbmFtZSBpcyB1c2VkLgorZW51bSBNYWNyb1VzZSB7CisgIC8vIG90aGVyIHRoYW4gI2RlZmluZSBvciAjdW5kZWYKKyAgTVVfT3RoZXIgID0gMCwKKworICAvLyBtYWNybyBuYW1lIHNwZWNpZmllZCBpbiAjZGVmaW5lCisgIE1VX0RlZmluZSA9IDEsCisKKyAgLy8gbWFjcm8gbmFtZSBzcGVjaWZpZWQgaW4gI3VuZGVmCisgIE1VX1VuZGVmICA9IDIKK307CisKKy8vLyBcYnJpZWYgRW5nYWdlcyBpbiBhIHRpZ2h0IGxpdHRsZSBkYW5jZSB3aXRoIHRoZSBsZXhlciB0byBlZmZpY2llbnRseQorLy8vIHByZXByb2Nlc3MgdG9rZW5zLgorLy8vCisvLy8gTGV4ZXJzIGtub3cgb25seSBhYm91dCB0b2tlbnMgd2l0aGluIGEgc2luZ2xlIHNvdXJjZSBmaWxlLCBhbmQgZG9uJ3QKKy8vLyBrbm93IGFueXRoaW5nIGFib3V0IHByZXByb2Nlc3Nvci1sZXZlbCBpc3N1ZXMgbGlrZSB0aGUgXCNpbmNsdWRlIHN0YWNrLAorLy8vIHRva2VuIGV4cGFuc2lvbiwgZXRjLgorY2xhc3MgUHJlcHJvY2Vzc29yIHsKKyAgZnJpZW5kIGNsYXNzIFZBT3B0RGVmaW5pdGlvbkNvbnRleHQ7CisgIGZyaWVuZCBjbGFzcyBWYXJpYWRpY01hY3JvU2NvcGVHdWFyZDsKKworICBzdGQ6OnNoYXJlZF9wdHI8UHJlcHJvY2Vzc29yT3B0aW9ucz4gUFBPcHRzOworICBEaWFnbm9zdGljc0VuZ2luZSAgICAgICAgKkRpYWdzOworICBMYW5nT3B0aW9ucyAgICAgICAmTGFuZ09wdHM7CisgIGNvbnN0IFRhcmdldEluZm8gKlRhcmdldCA9IG51bGxwdHI7CisgIGNvbnN0IFRhcmdldEluZm8gKkF1eFRhcmdldCA9IG51bGxwdHI7CisgIEZpbGVNYW5hZ2VyICAgICAgICZGaWxlTWdyOworICBTb3VyY2VNYW5hZ2VyICAgICAmU291cmNlTWdyOworICBNZW1vcnlCdWZmZXJDYWNoZSAmUENNQ2FjaGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxTY3JhdGNoQnVmZmVyPiBTY3JhdGNoQnVmOworICBIZWFkZXJTZWFyY2ggICAgICAmSGVhZGVySW5mbzsKKyAgTW9kdWxlTG9hZGVyICAgICAgJlRoZU1vZHVsZUxvYWRlcjsKKworICAvLy8gXGJyaWVmIEV4dGVybmFsIHNvdXJjZSBvZiBtYWNyb3MuCisgIEV4dGVybmFsUHJlcHJvY2Vzc29yU291cmNlICpFeHRlcm5hbFNvdXJjZTsKKworICAvLy8gQW4gb3B0aW9uYWwgUFRITWFuYWdlciBvYmplY3QgdXNlZCBmb3IgZ2V0dGluZyB0b2tlbnMgZnJvbQorICAvLy8gYSB0b2tlbiBjYWNoZSByYXRoZXIgdGhhbiBsZXhpbmcgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLgorICBzdGQ6OnVuaXF1ZV9wdHI8UFRITWFuYWdlcj4gUFRIOworCisgIC8vLyBBIEJ1bXBQdHJBbGxvY2F0b3Igb2JqZWN0IHVzZWQgdG8gcXVpY2tseSBhbGxvY2F0ZSBhbmQgcmVsZWFzZQorICAvLy8gb2JqZWN0cyBpbnRlcm5hbCB0byB0aGUgUHJlcHJvY2Vzc29yLgorICBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yIEJQOworCisgIC8vLyBJZGVudGlmaWVycyBmb3IgYnVpbHRpbiBtYWNyb3MgYW5kIG90aGVyIGJ1aWx0aW5zLgorICBJZGVudGlmaWVySW5mbyAqSWRlbnRfX0xJTkVfXywgKklkZW50X19GSUxFX187ICAgLy8gX19MSU5FX18sIF9fRklMRV9fCisgIElkZW50aWZpZXJJbmZvICpJZGVudF9fREFURV9fLCAqSWRlbnRfX1RJTUVfXzsgICAvLyBfX0RBVEVfXywgX19USU1FX18KKyAgSWRlbnRpZmllckluZm8gKklkZW50X19JTkNMVURFX0xFVkVMX187ICAgICAgICAgIC8vIF9fSU5DTFVERV9MRVZFTF9fCisgIElkZW50aWZpZXJJbmZvICpJZGVudF9fQkFTRV9GSUxFX187ICAgICAgICAgICAgICAvLyBfX0JBU0VfRklMRV9fCisgIElkZW50aWZpZXJJbmZvICpJZGVudF9fVElNRVNUQU1QX187ICAgICAgICAgICAgICAvLyBfX1RJTUVTVEFNUF9fCisgIElkZW50aWZpZXJJbmZvICpJZGVudF9fQ09VTlRFUl9fOyAgICAgICAgICAgICAgICAvLyBfX0NPVU5URVJfXworICBJZGVudGlmaWVySW5mbyAqSWRlbnRfUHJhZ21hLCAqSWRlbnRfX3ByYWdtYTsgICAgLy8gX1ByYWdtYSwgX19wcmFnbWEKKyAgSWRlbnRpZmllckluZm8gKklkZW50X19pZGVudGlmaWVyOyAgICAgICAgICAgICAgIC8vIF9faWRlbnRpZmllcgorICBJZGVudGlmaWVySW5mbyAqSWRlbnRfX1ZBX0FSR1NfXzsgICAgICAgICAgICAgICAgLy8gX19WQV9BUkdTX18KKyAgSWRlbnRpZmllckluZm8gKklkZW50X19WQV9PUFRfXzsgICAgICAgICAgICAgICAgIC8vIF9fVkFfT1BUX18KKyAgSWRlbnRpZmllckluZm8gKklkZW50X19oYXNfZmVhdHVyZTsgICAgICAgICAgICAgIC8vIF9faGFzX2ZlYXR1cmUKKyAgSWRlbnRpZmllckluZm8gKklkZW50X19oYXNfZXh0ZW5zaW9uOyAgICAgICAgICAgIC8vIF9faGFzX2V4dGVuc2lvbgorICBJZGVudGlmaWVySW5mbyAqSWRlbnRfX2hhc19idWlsdGluOyAgICAgICAgICAgICAgLy8gX19oYXNfYnVpbHRpbgorICBJZGVudGlmaWVySW5mbyAqSWRlbnRfX2hhc19hdHRyaWJ1dGU7ICAgICAgICAgICAgLy8gX19oYXNfYXR0cmlidXRlCisgIElkZW50aWZpZXJJbmZvICpJZGVudF9faGFzX2luY2x1ZGU7ICAgICAgICAgICAgICAvLyBfX2hhc19pbmNsdWRlCisgIElkZW50aWZpZXJJbmZvICpJZGVudF9faGFzX2luY2x1ZGVfbmV4dDsgICAgICAgICAvLyBfX2hhc19pbmNsdWRlX25leHQKKyAgSWRlbnRpZmllckluZm8gKklkZW50X19oYXNfd2FybmluZzsgICAgICAgICAgICAgIC8vIF9faGFzX3dhcm5pbmcKKyAgSWRlbnRpZmllckluZm8gKklkZW50X19pc19pZGVudGlmaWVyOyAgICAgICAgICAgIC8vIF9faXNfaWRlbnRpZmllcgorICBJZGVudGlmaWVySW5mbyAqSWRlbnRfX2J1aWxkaW5nX21vZHVsZTsgICAgICAgICAgLy8gX19idWlsZGluZ19tb2R1bGUKKyAgSWRlbnRpZmllckluZm8gKklkZW50X19NT0RVTEVfXzsgICAgICAgICAgICAgICAgIC8vIF9fTU9EVUxFX18KKyAgSWRlbnRpZmllckluZm8gKklkZW50X19oYXNfY3BwX2F0dHJpYnV0ZTsgICAgICAgIC8vIF9faGFzX2NwcF9hdHRyaWJ1dGUKKyAgSWRlbnRpZmllckluZm8gKklkZW50X19oYXNfY19hdHRyaWJ1dGU7ICAgICAgICAgIC8vIF9faGFzX2NfYXR0cmlidXRlCisgIElkZW50aWZpZXJJbmZvICpJZGVudF9faGFzX2RlY2xzcGVjOyAgICAgICAgICAgICAvLyBfX2hhc19kZWNsc3BlY19hdHRyaWJ1dGUKKyAgSWRlbnRpZmllckluZm8gKklkZW50X19pc190YXJnZXRfYXJjaDsgICAgICAgICAgIC8vIF9faXNfdGFyZ2V0X2FyY2gKKyAgSWRlbnRpZmllckluZm8gKklkZW50X19pc190YXJnZXRfdmVuZG9yOyAgICAgICAgIC8vIF9faXNfdGFyZ2V0X3ZlbmRvcgorICBJZGVudGlmaWVySW5mbyAqSWRlbnRfX2lzX3RhcmdldF9vczsgICAgICAgICAgICAgLy8gX19pc190YXJnZXRfb3MKKyAgSWRlbnRpZmllckluZm8gKklkZW50X19pc190YXJnZXRfZW52aXJvbm1lbnQ7ICAgIC8vIF9faXNfdGFyZ2V0X2Vudmlyb25tZW50CisKKyAgU291cmNlTG9jYXRpb24gREFURUxvYywgVElNRUxvYzsKKworICAvLyBOZXh0IF9fQ09VTlRFUl9fIHZhbHVlLCBzdGFydHMgYXQgMC4KKyAgdW5zaWduZWQgQ291bnRlclZhbHVlID0gMDsKKworICBlbnVtIHsKKyAgICAvLy8gXGJyaWVmIE1heGltdW0gZGVwdGggb2YgXCNpbmNsdWRlcy4KKyAgICBNYXhBbGxvd2VkSW5jbHVkZVN0YWNrRGVwdGggPSAyMDAKKyAgfTsKKworICAvLyBTdGF0ZSB0aGF0IGlzIHNldCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBiZWdpbnMuCisgIGJvb2wgS2VlcENvbW1lbnRzIDogMTsKKyAgYm9vbCBLZWVwTWFjcm9Db21tZW50cyA6IDE7CisgIGJvb2wgU3VwcHJlc3NJbmNsdWRlTm90Rm91bmRFcnJvciA6IDE7CisKKyAgLy8gU3RhdGUgdGhhdCBjaGFuZ2VzIHdoaWxlIHRoZSBwcmVwcm9jZXNzb3IgcnVuczoKKyAgYm9vbCBJbk1hY3JvQXJncyA6IDE7ICAgICAgICAgICAgLy8gVHJ1ZSBpZiBwYXJzaW5nIGZuIG1hY3JvIGludm9jYXRpb24gYXJncy4KKworICAvLy8gV2hldGhlciB0aGUgcHJlcHJvY2Vzc29yIG93bnMgdGhlIGhlYWRlciBzZWFyY2ggb2JqZWN0LgorICBib29sIE93bnNIZWFkZXJTZWFyY2ggOiAxOworCisgIC8vLyBUcnVlIGlmIG1hY3JvIGV4cGFuc2lvbiBpcyBkaXNhYmxlZC4KKyAgYm9vbCBEaXNhYmxlTWFjcm9FeHBhbnNpb24gOiAxOworCisgIC8vLyBUZW1wb3JhcmlseSBkaXNhYmxlcyBEaXNhYmxlTWFjcm9FeHBhbnNpb24gKGkuZS4gZW5hYmxlcyBleHBhbnNpb24pCisgIC8vLyB3aGVuIHBhcnNpbmcgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMuCisgIGJvb2wgTWFjcm9FeHBhbnNpb25JbkRpcmVjdGl2ZXNPdmVycmlkZSA6IDE7CisKKyAgY2xhc3MgUmVzZXRNYWNyb0V4cGFuc2lvbkhlbHBlcjsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgd2UgaGF2ZSBhbHJlYWR5IGxvYWRlZCBtYWNyb3MgZnJvbSB0aGUgZXh0ZXJuYWwgc291cmNlLgorICBtdXRhYmxlIGJvb2wgUmVhZE1hY3Jvc0Zyb21FeHRlcm5hbFNvdXJjZSA6IDE7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHByYWdtYXMgYXJlIGVuYWJsZWQuCisgIGJvb2wgUHJhZ21hc0VuYWJsZWQgOiAxOworCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGUgY3VycmVudCBidWlsZCBhY3Rpb24gaXMgYSBwcmVwcm9jZXNzaW5nIGFjdGlvbi4KKyAgYm9vbCBQcmVwcm9jZXNzZWRPdXRwdXQgOiAxOworCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB3ZSBhcmUgY3VycmVudGx5IHByZXByb2Nlc3NpbmcgYSAjaWYgb3IgI2VsaWYgZGlyZWN0aXZlCisgIGJvb2wgUGFyc2luZ0lmT3JFbGlmRGlyZWN0aXZlOworCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB3ZSBhcmUgcHJlLWV4cGFuZGluZyBtYWNybyBhcmd1bWVudHMuCisgIGJvb2wgSW5NYWNyb0FyZ1ByZUV4cGFuc2lvbjsKKworICAvLy8gXGJyaWVmIE1hcHBpbmcvbG9va3VwIGluZm9ybWF0aW9uIGZvciBhbGwgaWRlbnRpZmllcnMgaW4KKyAgLy8vIHRoZSBwcm9ncmFtLCBpbmNsdWRpbmcgcHJvZ3JhbSBrZXl3b3Jkcy4KKyAgbXV0YWJsZSBJZGVudGlmaWVyVGFibGUgSWRlbnRpZmllcnM7CisKKyAgLy8vIFxicmllZiBUaGlzIHRhYmxlIGNvbnRhaW5zIGFsbCB0aGUgc2VsZWN0b3JzIGluIHRoZSBwcm9ncmFtLgorICAvLy8KKyAgLy8vIFVubGlrZSBJZGVudGlmaWVyVGFibGUgYWJvdmUsIHRoaXMgdGFibGUgKmlzbid0KiBwb3B1bGF0ZWQgYnkgdGhlCisgIC8vLyBwcmVwcm9jZXNzb3IuIEl0IGlzIGRlY2xhcmVkL2V4cGFuZGVkIGhlcmUgYmVjYXVzZSBpdHMgcm9sZS9saWZldGltZSBpcworICAvLy8gY29uY2VwdHVhbGx5IHNpbWlsYXIgdG8gdGhlIElkZW50aWZpZXJUYWJsZS4gSW4gYWRkaXRpb24sIHRoZSBjdXJyZW50CisgIC8vLyBjb250cm9sIGZsb3cgKGluIGNsYW5nOjpQYXJzZUFTVCgpKSwgbWFrZSBpdCBjb252ZW5pZW50IHRvIHB1dCBoZXJlLgorICAvLy8KKyAgLy8vIEZJWE1FOiBNYWtlIHN1cmUgdGhlIGxpZmV0aW1lIG9mIElkZW50aWZpZXJzL1NlbGVjdG9ycyAqaXNuJ3QqIHRpZWQgdG8KKyAgLy8vIHRoZSBsaWZldGltZSBvZiB0aGUgcHJlcHJvY2Vzc29yLgorICBTZWxlY3RvclRhYmxlIFNlbGVjdG9yczsKKworICAvLy8gXGJyaWVmIEluZm9ybWF0aW9uIGFib3V0IGJ1aWx0aW5zLgorICBCdWlsdGluOjpDb250ZXh0IEJ1aWx0aW5JbmZvOworCisgIC8vLyBcYnJpZWYgVHJhY2tzIGFsbCBvZiB0aGUgcHJhZ21hcyB0aGF0IHRoZSBjbGllbnQgcmVnaXN0ZXJlZAorICAvLy8gd2l0aCB0aGlzIHByZXByb2Nlc3Nvci4KKyAgc3RkOjp1bmlxdWVfcHRyPFByYWdtYU5hbWVzcGFjZT4gUHJhZ21hSGFuZGxlcnM7CisKKyAgLy8vIFxicmllZiBQcmFnbWEgaGFuZGxlcnMgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZSBpcyBzdG9yZWQgaGVyZSBkdXJpbmcgdGhlCisgIC8vLyBwYXJzaW5nIG9mIGEgbW9kZWwgZmlsZS4KKyAgc3RkOjp1bmlxdWVfcHRyPFByYWdtYU5hbWVzcGFjZT4gUHJhZ21hSGFuZGxlcnNCYWNrdXA7CisKKyAgLy8vIFxicmllZiBUcmFja3MgYWxsIG9mIHRoZSBjb21tZW50IGhhbmRsZXJzIHRoYXQgdGhlIGNsaWVudCByZWdpc3RlcmVkCisgIC8vLyB3aXRoIHRoaXMgcHJlcHJvY2Vzc29yLgorICBzdGQ6OnZlY3RvcjxDb21tZW50SGFuZGxlciAqPiBDb21tZW50SGFuZGxlcnM7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHdlIHdhbnQgdG8gaWdub3JlIEVPRiB0b2tlbiBhbmQgY29udGludWUgbGF0ZXIgb24gKHRodXMgCisgIC8vLyBhdm9pZCB0ZWFyaW5nIHRoZSBMZXhlciBhbmQgZXRjLiBkb3duKS4KKyAgYm9vbCBJbmNyZW1lbnRhbFByb2Nlc3NpbmcgPSBmYWxzZTsKKworICAvLy8gVGhlIGtpbmQgb2YgdHJhbnNsYXRpb24gdW5pdCB3ZSBhcmUgcHJvY2Vzc2luZy4KKyAgVHJhbnNsYXRpb25Vbml0S2luZCBUVUtpbmQ7CisKKyAgLy8vIFxicmllZiBUaGUgY29kZS1jb21wbGV0aW9uIGhhbmRsZXIuCisgIENvZGVDb21wbGV0aW9uSGFuZGxlciAqQ29kZUNvbXBsZXRlID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFRoZSBmaWxlIHRoYXQgd2UncmUgcGVyZm9ybWluZyBjb2RlLWNvbXBsZXRpb24gZm9yLCBpZiBhbnkuCisgIGNvbnN0IEZpbGVFbnRyeSAqQ29kZUNvbXBsZXRpb25GaWxlID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFRoZSBvZmZzZXQgaW4gZmlsZSBmb3IgdGhlIGNvZGUtY29tcGxldGlvbiBwb2ludC4KKyAgdW5zaWduZWQgQ29kZUNvbXBsZXRpb25PZmZzZXQgPSAwOworCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIGZvciB0aGUgY29kZS1jb21wbGV0aW9uIHBvaW50LiBUaGlzIGdldHMgaW5zdGFudGlhdGVkCisgIC8vLyB3aGVuIHRoZSBDb2RlQ29tcGxldGlvbkZpbGUgZ2V0cyBcI2luY2x1ZGUnZWQgZm9yIHByZXByb2Nlc3NpbmcuCisgIFNvdXJjZUxvY2F0aW9uIENvZGVDb21wbGV0aW9uTG9jOworCisgIC8vLyBcYnJpZWYgVGhlIHN0YXJ0IGxvY2F0aW9uIGZvciB0aGUgZmlsZSBvZiB0aGUgY29kZS1jb21wbGV0aW9uIHBvaW50LgorICAvLy8KKyAgLy8vIFRoaXMgZ2V0cyBpbnN0YW50aWF0ZWQgd2hlbiB0aGUgQ29kZUNvbXBsZXRpb25GaWxlIGdldHMgXCNpbmNsdWRlJ2VkCisgIC8vLyBmb3IgcHJlcHJvY2Vzc2luZy4KKyAgU291cmNlTG9jYXRpb24gQ29kZUNvbXBsZXRpb25GaWxlTG9jOworCisgIC8vLyBcYnJpZWYgVGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgXGMgaW1wb3J0IGNvbnRleHR1YWwga2V5d29yZCB3ZSBqdXN0IAorICAvLy8gbGV4ZWQsIGlmIGFueS4KKyAgU291cmNlTG9jYXRpb24gTW9kdWxlSW1wb3J0TG9jOworCisgIC8vLyBcYnJpZWYgVGhlIG1vZHVsZSBpbXBvcnQgcGF0aCB0aGF0IHdlJ3JlIGN1cnJlbnRseSBwcm9jZXNzaW5nLgorICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8SWRlbnRpZmllckluZm8gKiwgU291cmNlTG9jYXRpb24+LCAyPiBNb2R1bGVJbXBvcnRQYXRoOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgbGFzdCB0b2tlbiB3ZSBsZXhlZCB3YXMgYW4gJ0AnLgorICBib29sIExhc3RUb2tlbldhc0F0ID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoZSBtb2R1bGUgaW1wb3J0IGV4cGVjdHMgYW4gaWRlbnRpZmllciBuZXh0LiBPdGhlcndpc2UsCisgIC8vLyBpdCBleHBlY3RzIGEgJy4nIG9yICc7Jy4KKyAgYm9vbCBNb2R1bGVJbXBvcnRFeHBlY3RzSWRlbnRpZmllciA9IGZhbHNlOworICAKKyAgLy8vIFxicmllZiBUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50bHktYWN0aXZlCisgIC8vLyBcI3ByYWdtYSBjbGFuZyBhcmNfY2ZfY29kZV9hdWRpdGVkIGJlZ2luLgorICBTb3VyY2VMb2NhdGlvbiBQcmFnbWFBUkNDRkNvZGVBdWRpdGVkTG9jOworCisgIC8vLyBcYnJpZWYgVGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudGx5LWFjdGl2ZQorICAvLy8gXCNwcmFnbWEgY2xhbmcgYXNzdW1lX25vbm51bGwgYmVnaW4uCisgIFNvdXJjZUxvY2F0aW9uIFByYWdtYUFzc3VtZU5vbk51bGxMb2M7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHdlIGhpdCB0aGUgY29kZS1jb21wbGV0aW9uIHBvaW50LgorICBib29sIENvZGVDb21wbGV0aW9uUmVhY2hlZCA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgVGhlIGNvZGUgY29tcGxldGlvbiB0b2tlbiBjb250YWluaW5nIHRoZSBpbmZvcm1hdGlvbgorICAvLy8gb24gdGhlIHN0ZW0gdGhhdCBpcyB0byBiZSBjb2RlIGNvbXBsZXRlZC4KKyAgSWRlbnRpZmllckluZm8gKkNvZGVDb21wbGV0aW9uSUkgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIGRpcmVjdG9yeSB0aGF0IHRoZSBtYWluIGZpbGUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gb2NjdXB5LAorICAvLy8gaWYgaXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHJlYWwgZmlsZSAoYXMgaGFwcGVucyB3aGVuIGJ1aWxkaW5nIGEKKyAgLy8vIG1vZHVsZSkuCisgIGNvbnN0IERpcmVjdG9yeUVudHJ5ICpNYWluRmlsZURpciA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2Ugd2lsbCBpbml0aWFsbHkgc2tpcCB3aGVuIGVudGVyaW5nIHRoZQorICAvLy8gbWFpbiBmaWxlLCBhbG9uZyB3aXRoIGEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHNraXBwaW5nIHRoaXMgbnVtYmVyCisgIC8vLyBvZiBieXRlcyB3aWxsIHBsYWNlIHRoZSBsZXhlciBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCB3aGVuIGxvYWRpbmcgYSBwcmVjb21waWxlZCBwcmVhbWJsZS4KKyAgc3RkOjpwYWlyPGludCwgYm9vbD4gU2tpcE1haW5GaWxlUHJlYW1ibGU7CisKK3B1YmxpYzoKKyAgc3RydWN0IFByZWFtYmxlU2tpcEluZm8geworICAgIFNvdXJjZUxvY2F0aW9uIEhhc2hUb2tlbkxvYzsKKyAgICBTb3VyY2VMb2NhdGlvbiBJZlRva2VuTG9jOworICAgIGJvb2wgRm91bmROb25Ta2lwUG9ydGlvbjsKKyAgICBib29sIEZvdW5kRWxzZTsKKyAgICBTb3VyY2VMb2NhdGlvbiBFbHNlTG9jOworCisgICAgUHJlYW1ibGVTa2lwSW5mbyhTb3VyY2VMb2NhdGlvbiBIYXNoVG9rZW5Mb2MsIFNvdXJjZUxvY2F0aW9uIElmVG9rZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICBib29sIEZvdW5kTm9uU2tpcFBvcnRpb24sIGJvb2wgRm91bmRFbHNlLAorICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRWxzZUxvYykKKyAgICAgICAgOiBIYXNoVG9rZW5Mb2MoSGFzaFRva2VuTG9jKSwgSWZUb2tlbkxvYyhJZlRva2VuTG9jKSwKKyAgICAgICAgICBGb3VuZE5vblNraXBQb3J0aW9uKEZvdW5kTm9uU2tpcFBvcnRpb24pLCBGb3VuZEVsc2UoRm91bmRFbHNlKSwKKyAgICAgICAgICBFbHNlTG9jKEVsc2VMb2MpIHt9CisgIH07CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBBU1RSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBNYWNyb0FyZ3M7CisKKyAgY2xhc3MgUHJlYW1ibGVDb25kaXRpb25hbFN0YWNrU3RvcmUgeworICAgIGVudW0gU3RhdGUgeworICAgICAgT2ZmID0gMCwKKyAgICAgIFJlY29yZGluZyA9IDEsCisgICAgICBSZXBsYXlpbmcgPSAyLAorICAgIH07CisKKyAgcHVibGljOgorICAgIFByZWFtYmxlQ29uZGl0aW9uYWxTdGFja1N0b3JlKCkgPSBkZWZhdWx0OworCisgICAgdm9pZCBzdGFydFJlY29yZGluZygpIHsgQ29uZGl0aW9uYWxTdGFja1N0YXRlID0gUmVjb3JkaW5nOyB9CisgICAgdm9pZCBzdGFydFJlcGxheWluZygpIHsgQ29uZGl0aW9uYWxTdGFja1N0YXRlID0gUmVwbGF5aW5nOyB9CisgICAgYm9vbCBpc1JlY29yZGluZygpIGNvbnN0IHsgcmV0dXJuIENvbmRpdGlvbmFsU3RhY2tTdGF0ZSA9PSBSZWNvcmRpbmc7IH0KKyAgICBib29sIGlzUmVwbGF5aW5nKCkgY29uc3QgeyByZXR1cm4gQ29uZGl0aW9uYWxTdGFja1N0YXRlID09IFJlcGxheWluZzsgfQorCisgICAgQXJyYXlSZWY8UFBDb25kaXRpb25hbEluZm8+IGdldFN0YWNrKCkgY29uc3QgeworICAgICAgcmV0dXJuIENvbmRpdGlvbmFsU3RhY2s7CisgICAgfQorCisgICAgdm9pZCBkb25lUmVwbGF5aW5nKCkgeworICAgICAgQ29uZGl0aW9uYWxTdGFjay5jbGVhcigpOworICAgICAgQ29uZGl0aW9uYWxTdGFja1N0YXRlID0gT2ZmOworICAgIH0KKworICAgIHZvaWQgc2V0U3RhY2soQXJyYXlSZWY8UFBDb25kaXRpb25hbEluZm8+IHMpIHsKKyAgICAgIGlmICghaXNSZWNvcmRpbmcoKSAmJiAhaXNSZXBsYXlpbmcoKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgQ29uZGl0aW9uYWxTdGFjay5jbGVhcigpOworICAgICAgQ29uZGl0aW9uYWxTdGFjay5hcHBlbmQocy5iZWdpbigpLCBzLmVuZCgpKTsKKyAgICB9CisKKyAgICBib29sIGhhc1JlY29yZGVkUHJlYW1ibGUoKSBjb25zdCB7IHJldHVybiAhQ29uZGl0aW9uYWxTdGFjay5lbXB0eSgpOyB9CisKKyAgICBib29sIHJlYWNoZWRFT0ZXaGlsZVNraXBwaW5nKCkgY29uc3QgeyByZXR1cm4gU2tpcEluZm8uaGFzVmFsdWUoKTsgfQorCisgICAgdm9pZCBjbGVhclNraXBJbmZvKCkgeyBTa2lwSW5mby5yZXNldCgpOyB9CisKKyAgICBsbHZtOjpPcHRpb25hbDxQcmVhbWJsZVNraXBJbmZvPiBTa2lwSW5mbzsKKworICBwcml2YXRlOgorICAgIFNtYWxsVmVjdG9yPFBQQ29uZGl0aW9uYWxJbmZvLCA0PiBDb25kaXRpb25hbFN0YWNrOworICAgIFN0YXRlIENvbmRpdGlvbmFsU3RhY2tTdGF0ZSA9IE9mZjsKKyAgfSBQcmVhbWJsZUNvbmRpdGlvbmFsU3RhY2s7CisKKyAgLy8vIFxicmllZiBUaGUgY3VycmVudCB0b3Agb2YgdGhlIHN0YWNrIHRoYXQgd2UncmUgbGV4aW5nIGZyb20gaWYKKyAgLy8vIG5vdCBleHBhbmRpbmcgYSBtYWNybyBhbmQgd2UgYXJlIGxleGluZyBkaXJlY3RseSBmcm9tIHNvdXJjZSBjb2RlLgorICAvLy8KKyAgLy8vIE9ubHkgb25lIG9mIEN1ckxleGVyLCBDdXJQVEhMZXhlciwgb3IgQ3VyVG9rZW5MZXhlciB3aWxsIGJlIG5vbi1udWxsLgorICBzdGQ6OnVuaXF1ZV9wdHI8TGV4ZXI+IEN1ckxleGVyOworCisgIC8vLyBcYnJpZWYgVGhlIGN1cnJlbnQgdG9wIG9mIHN0YWNrIHRoYXQgd2UncmUgbGV4aW5nIGZyb20gaWYKKyAgLy8vIG5vdCBleHBhbmRpbmcgZnJvbSBhIG1hY3JvIGFuZCB3ZSBhcmUgbGV4aW5nIGZyb20gYSBQVEggY2FjaGUuCisgIC8vLworICAvLy8gT25seSBvbmUgb2YgQ3VyTGV4ZXIsIEN1clBUSExleGVyLCBvciBDdXJUb2tlbkxleGVyIHdpbGwgYmUgbm9uLW51bGwuCisgIHN0ZDo6dW5pcXVlX3B0cjxQVEhMZXhlcj4gQ3VyUFRITGV4ZXI7CisKKyAgLy8vIFxicmllZiBUaGUgY3VycmVudCB0b3Agb2YgdGhlIHN0YWNrIHdoYXQgd2UncmUgbGV4aW5nIGZyb20KKyAgLy8vIGlmIG5vdCBleHBhbmRpbmcgYSBtYWNyby4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGFuIGFsaWFzIGZvciBlaXRoZXIgQ3VyTGV4ZXIgb3IgIEN1clBUSExleGVyLgorICBQcmVwcm9jZXNzb3JMZXhlciAqQ3VyUFBMZXhlciA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBVc2VkIHRvIGZpbmQgdGhlIGN1cnJlbnQgRmlsZUVudHJ5LCBpZiBDdXJMZXhlciBpcyBub24tbnVsbAorICAvLy8gYW5kIGlmIGFwcGxpY2FibGUuCisgIC8vLworICAvLy8gVGhpcyBhbGxvd3MgdXMgdG8gaW1wbGVtZW50IFwjaW5jbHVkZV9uZXh0IGFuZCBmaW5kIGRpcmVjdG9yeS1zcGVjaWZpYworICAvLy8gcHJvcGVydGllcy4KKyAgY29uc3QgRGlyZWN0b3J5TG9va3VwICpDdXJEaXJMb29rdXAgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIGN1cnJlbnQgbWFjcm8gd2UgYXJlIGV4cGFuZGluZywgaWYgd2UgYXJlIGV4cGFuZGluZyBhIG1hY3JvLgorICAvLy8KKyAgLy8vIE9uZSBvZiBDdXJMZXhlciBhbmQgQ3VyVG9rZW5MZXhlciBtdXN0IGJlIG51bGwuCisgIHN0ZDo6dW5pcXVlX3B0cjxUb2tlbkxleGVyPiBDdXJUb2tlbkxleGVyOworCisgIC8vLyBcYnJpZWYgVGhlIGtpbmQgb2YgbGV4ZXIgd2UncmUgY3VycmVudGx5IHdvcmtpbmcgd2l0aC4KKyAgZW51bSBDdXJMZXhlcktpbmQgeworICAgIENMS19MZXhlciwKKyAgICBDTEtfUFRITGV4ZXIsCisgICAgQ0xLX1Rva2VuTGV4ZXIsCisgICAgQ0xLX0NhY2hpbmdMZXhlciwKKyAgICBDTEtfTGV4QWZ0ZXJNb2R1bGVJbXBvcnQKKyAgfSBDdXJMZXhlcktpbmQgPSBDTEtfTGV4ZXI7CisKKyAgLy8vIFxicmllZiBJZiB0aGUgY3VycmVudCBsZXhlciBpcyBmb3IgYSBzdWJtb2R1bGUgdGhhdCBpcyBiZWluZyBidWlsdCwgdGhpcworICAvLy8gaXMgdGhhdCBzdWJtb2R1bGUuCisgIE1vZHVsZSAqQ3VyTGV4ZXJTdWJtb2R1bGUgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgS2VlcHMgdHJhY2sgb2YgdGhlIHN0YWNrIG9mIGZpbGVzIGN1cnJlbnRseQorICAvLy8gXCNpbmNsdWRlZCwgYW5kIG1hY3JvcyBjdXJyZW50bHkgYmVpbmcgZXhwYW5kZWQgZnJvbSwgbm90IGNvdW50aW5nCisgIC8vLyBDdXJMZXhlci9DdXJUb2tlbkxleGVyLgorICBzdHJ1Y3QgSW5jbHVkZVN0YWNrSW5mbyB7CisgICAgZW51bSBDdXJMZXhlcktpbmQgICAgICAgICAgIEN1ckxleGVyS2luZDsKKyAgICBNb2R1bGUgICAgICAgICAgICAgICAgICAgICAqVGhlU3VibW9kdWxlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxMZXhlcj4gICAgICBUaGVMZXhlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UFRITGV4ZXI+ICAgVGhlUFRITGV4ZXI7CisgICAgUHJlcHJvY2Vzc29yTGV4ZXIgICAgICAgICAgKlRoZVBQTGV4ZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPFRva2VuTGV4ZXI+IFRoZVRva2VuTGV4ZXI7CisgICAgY29uc3QgRGlyZWN0b3J5TG9va3VwICAgICAgKlRoZURpckxvb2t1cDsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgY29uc3RydWN0b3JzIGFyZSBjb21wbGV0ZWx5IHVzZWxlc3MgY29waWVzIG9mIHRoZSBkZWZhdWx0CisgICAgLy8gdmVyc2lvbnMsIG9ubHkgbmVlZGVkIHRvIHBhY2lmeSBNU1ZDLgorICAgIEluY2x1ZGVTdGFja0luZm8oZW51bSBDdXJMZXhlcktpbmQgQ3VyTGV4ZXJLaW5kLCBNb2R1bGUgKlRoZVN1Ym1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxMZXhlcj4gJiZUaGVMZXhlciwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQVEhMZXhlcj4gJiZUaGVQVEhMZXhlciwKKyAgICAgICAgICAgICAgICAgICAgIFByZXByb2Nlc3NvckxleGVyICpUaGVQUExleGVyLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFRva2VuTGV4ZXI+ICYmVGhlVG9rZW5MZXhlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpcmVjdG9yeUxvb2t1cCAqVGhlRGlyTG9va3VwKQorICAgICAgICA6IEN1ckxleGVyS2luZChzdGQ6Om1vdmUoQ3VyTGV4ZXJLaW5kKSksCisgICAgICAgICAgVGhlU3VibW9kdWxlKHN0ZDo6bW92ZShUaGVTdWJtb2R1bGUpKSwgVGhlTGV4ZXIoc3RkOjptb3ZlKFRoZUxleGVyKSksCisgICAgICAgICAgVGhlUFRITGV4ZXIoc3RkOjptb3ZlKFRoZVBUSExleGVyKSksCisgICAgICAgICAgVGhlUFBMZXhlcihzdGQ6Om1vdmUoVGhlUFBMZXhlcikpLAorICAgICAgICAgIFRoZVRva2VuTGV4ZXIoc3RkOjptb3ZlKFRoZVRva2VuTGV4ZXIpKSwKKyAgICAgICAgICBUaGVEaXJMb29rdXAoc3RkOjptb3ZlKFRoZURpckxvb2t1cCkpIHt9CisgIH07CisgIHN0ZDo6dmVjdG9yPEluY2x1ZGVTdGFja0luZm8+IEluY2x1ZGVNYWNyb1N0YWNrOworCisgIC8vLyBcYnJpZWYgQWN0aW9ucyBpbnZva2VkIHdoZW4gc29tZSBwcmVwcm9jZXNzb3IgYWN0aXZpdHkgaXMKKyAgLy8vIGVuY291bnRlcmVkIChlLmcuIGEgZmlsZSBpcyBcI2luY2x1ZGVkLCBldGMpLgorICBzdGQ6OnVuaXF1ZV9wdHI8UFBDYWxsYmFja3M+IENhbGxiYWNrczsKKworICBzdHJ1Y3QgTWFjcm9FeHBhbmRzSW5mbyB7CisgICAgVG9rZW4gVG9rOworICAgIE1hY3JvRGVmaW5pdGlvbiBNRDsKKyAgICBTb3VyY2VSYW5nZSBSYW5nZTsKKworICAgIE1hY3JvRXhwYW5kc0luZm8oVG9rZW4gVG9rLCBNYWNyb0RlZmluaXRpb24gTUQsIFNvdXJjZVJhbmdlIFJhbmdlKQorICAgICAgICA6IFRvayhUb2spLCBNRChNRCksIFJhbmdlKFJhbmdlKSB7fQorICB9OworICBTbWFsbFZlY3RvcjxNYWNyb0V4cGFuZHNJbmZvLCAyPiBEZWxheWVkTWFjcm9FeHBhbmRzQ2FsbGJhY2tzOworCisgIC8vLyBJbmZvcm1hdGlvbiBhYm91dCBhIG5hbWUgdGhhdCBoYXMgYmVlbiB1c2VkIHRvIGRlZmluZSBhIG1vZHVsZSBtYWNyby4KKyAgc3RydWN0IE1vZHVsZU1hY3JvSW5mbyB7CisgICAgLy8vIFRoZSBtb3N0IHJlY2VudCBtYWNybyBkaXJlY3RpdmUgZm9yIHRoaXMgaWRlbnRpZmllci4KKyAgICBNYWNyb0RpcmVjdGl2ZSAqTUQ7CisKKyAgICAvLy8gVGhlIGFjdGl2ZSBtb2R1bGUgbWFjcm9zIGZvciB0aGlzIGlkZW50aWZpZXIuCisgICAgbGx2bTo6VGlueVB0clZlY3RvcjxNb2R1bGVNYWNybyAqPiBBY3RpdmVNb2R1bGVNYWNyb3M7CisKKyAgICAvLy8gVGhlIGdlbmVyYXRpb24gbnVtYmVyIGF0IHdoaWNoIHdlIGxhc3QgdXBkYXRlZCBBY3RpdmVNb2R1bGVNYWNyb3MuCisgICAgLy8vIFxzZWUgUHJlcHJvY2Vzc29yOjpWaXNpYmxlTW9kdWxlcy4KKyAgICB1bnNpZ25lZCBBY3RpdmVNb2R1bGVNYWNyb3NHZW5lcmF0aW9uID0gMDsKKworICAgIC8vLyBXaGV0aGVyIHRoaXMgbWFjcm8gbmFtZSBpcyBhbWJpZ3VvdXMuCisgICAgYm9vbCBJc0FtYmlndW91cyA9IGZhbHNlOworCisgICAgLy8vIFRoZSBtb2R1bGUgbWFjcm9zIHRoYXQgYXJlIG92ZXJyaWRkZW4gYnkgdGhpcyBtYWNyby4KKyAgICBsbHZtOjpUaW55UHRyVmVjdG9yPE1vZHVsZU1hY3JvICo+IE92ZXJyaWRkZW5NYWNyb3M7CisKKyAgICBNb2R1bGVNYWNyb0luZm8oTWFjcm9EaXJlY3RpdmUgKk1EKSA6IE1EKE1EKSB7fQorICB9OworCisgIC8vLyBUaGUgc3RhdGUgb2YgYSBtYWNybyBmb3IgYW4gaWRlbnRpZmllci4KKyAgY2xhc3MgTWFjcm9TdGF0ZSB7CisgICAgbXV0YWJsZSBsbHZtOjpQb2ludGVyVW5pb248TWFjcm9EaXJlY3RpdmUgKiwgTW9kdWxlTWFjcm9JbmZvICo+IFN0YXRlOworCisgICAgTW9kdWxlTWFjcm9JbmZvICpnZXRNb2R1bGVJbmZvKFByZXByb2Nlc3NvciAmUFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElkZW50aWZpZXJJbmZvICpJSSkgY29uc3QgeworICAgICAgaWYgKElJLT5pc091dE9mRGF0ZSgpKQorICAgICAgICBQUC51cGRhdGVPdXRPZkRhdGVJZGVudGlmaWVyKGNvbnN0X2Nhc3Q8SWRlbnRpZmllckluZm8mPigqSUkpKTsKKyAgICAgIC8vIEZJWE1FOiBGaW5kIGEgc3BhcmUgYml0IG9uIElkZW50aWZpZXJJbmZvIGFuZCBzdG9yZSBhCisgICAgICAvLyAgICAgICAgSGFzTW9kdWxlTWFjcm9zIGZsYWcuCisgICAgICBpZiAoIUlJLT5oYXNNYWNyb0RlZmluaXRpb24oKSB8fAorICAgICAgICAgICghUFAuZ2V0TGFuZ09wdHMoKS5Nb2R1bGVzICYmCisgICAgICAgICAgICFQUC5nZXRMYW5nT3B0cygpLk1vZHVsZXNMb2NhbFZpc2liaWxpdHkpIHx8CisgICAgICAgICAgIVBQLkN1clN1Ym1vZHVsZVN0YXRlLT5WaXNpYmxlTW9kdWxlcy5nZXRHZW5lcmF0aW9uKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICBhdXRvICpJbmZvID0gU3RhdGUuZHluX2Nhc3Q8TW9kdWxlTWFjcm9JbmZvKj4oKTsKKyAgICAgIGlmICghSW5mbykgeworICAgICAgICBJbmZvID0gbmV3IChQUC5nZXRQcmVwcm9jZXNzb3JBbGxvY2F0b3IoKSkKKyAgICAgICAgICAgIE1vZHVsZU1hY3JvSW5mbyhTdGF0ZS5nZXQ8TWFjcm9EaXJlY3RpdmUgKj4oKSk7CisgICAgICAgIFN0YXRlID0gSW5mbzsKKyAgICAgIH0KKworICAgICAgaWYgKFBQLkN1clN1Ym1vZHVsZVN0YXRlLT5WaXNpYmxlTW9kdWxlcy5nZXRHZW5lcmF0aW9uKCkgIT0KKyAgICAgICAgICBJbmZvLT5BY3RpdmVNb2R1bGVNYWNyb3NHZW5lcmF0aW9uKQorICAgICAgICBQUC51cGRhdGVNb2R1bGVNYWNyb0luZm8oSUksICpJbmZvKTsKKyAgICAgIHJldHVybiBJbmZvOworICAgIH0KKworICBwdWJsaWM6CisgICAgTWFjcm9TdGF0ZSgpIDogTWFjcm9TdGF0ZShudWxscHRyKSB7fQorICAgIE1hY3JvU3RhdGUoTWFjcm9EaXJlY3RpdmUgKk1EKSA6IFN0YXRlKE1EKSB7fQorCisgICAgTWFjcm9TdGF0ZShNYWNyb1N0YXRlICYmTykgbm9leGNlcHQgOiBTdGF0ZShPLlN0YXRlKSB7CisgICAgICBPLlN0YXRlID0gKE1hY3JvRGlyZWN0aXZlICopbnVsbHB0cjsKKyAgICB9CisKKyAgICBNYWNyb1N0YXRlICZvcGVyYXRvcj0oTWFjcm9TdGF0ZSAmJk8pIG5vZXhjZXB0IHsKKyAgICAgIGF1dG8gUyA9IE8uU3RhdGU7CisgICAgICBPLlN0YXRlID0gKE1hY3JvRGlyZWN0aXZlICopbnVsbHB0cjsKKyAgICAgIFN0YXRlID0gUzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB+TWFjcm9TdGF0ZSgpIHsKKyAgICAgIGlmIChhdXRvICpJbmZvID0gU3RhdGUuZHluX2Nhc3Q8TW9kdWxlTWFjcm9JbmZvKj4oKSkKKyAgICAgICAgSW5mby0+fk1vZHVsZU1hY3JvSW5mbygpOworICAgIH0KKworICAgIE1hY3JvRGlyZWN0aXZlICpnZXRMYXRlc3QoKSBjb25zdCB7CisgICAgICBpZiAoYXV0byAqSW5mbyA9IFN0YXRlLmR5bl9jYXN0PE1vZHVsZU1hY3JvSW5mbyo+KCkpCisgICAgICAgIHJldHVybiBJbmZvLT5NRDsKKyAgICAgIHJldHVybiBTdGF0ZS5nZXQ8TWFjcm9EaXJlY3RpdmUqPigpOworICAgIH0KKworICAgIHZvaWQgc2V0TGF0ZXN0KE1hY3JvRGlyZWN0aXZlICpNRCkgeworICAgICAgaWYgKGF1dG8gKkluZm8gPSBTdGF0ZS5keW5fY2FzdDxNb2R1bGVNYWNyb0luZm8qPigpKQorICAgICAgICBJbmZvLT5NRCA9IE1EOworICAgICAgZWxzZQorICAgICAgICBTdGF0ZSA9IE1EOworICAgIH0KKworICAgIGJvb2wgaXNBbWJpZ3VvdXMoUHJlcHJvY2Vzc29yICZQUCwgY29uc3QgSWRlbnRpZmllckluZm8gKklJKSBjb25zdCB7CisgICAgICBhdXRvICpJbmZvID0gZ2V0TW9kdWxlSW5mbyhQUCwgSUkpOworICAgICAgcmV0dXJuIEluZm8gPyBJbmZvLT5Jc0FtYmlndW91cyA6IGZhbHNlOworICAgIH0KKworICAgIEFycmF5UmVmPE1vZHVsZU1hY3JvICo+CisgICAgZ2V0QWN0aXZlTW9kdWxlTWFjcm9zKFByZXByb2Nlc3NvciAmUFAsIGNvbnN0IElkZW50aWZpZXJJbmZvICpJSSkgY29uc3QgeworICAgICAgaWYgKGF1dG8gKkluZm8gPSBnZXRNb2R1bGVJbmZvKFBQLCBJSSkpCisgICAgICAgIHJldHVybiBJbmZvLT5BY3RpdmVNb2R1bGVNYWNyb3M7CisgICAgICByZXR1cm4gTm9uZTsKKyAgICB9CisKKyAgICBNYWNyb0RpcmVjdGl2ZTo6RGVmSW5mbyBmaW5kRGlyZWN0aXZlQXRMb2MoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3IpIGNvbnN0IHsKKyAgICAgIC8vIEZJWE1FOiBJbmNvcnBvcmF0ZSBtb2R1bGUgbWFjcm9zIGludG8gdGhlIHJlc3VsdCBvZiB0aGlzLgorICAgICAgaWYgKGF1dG8gKkxhdGVzdCA9IGdldExhdGVzdCgpKQorICAgICAgICByZXR1cm4gTGF0ZXN0LT5maW5kRGlyZWN0aXZlQXRMb2MoTG9jLCBTb3VyY2VNZ3IpOworICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIHZvaWQgb3ZlcnJpZGVBY3RpdmVNb2R1bGVNYWNyb3MoUHJlcHJvY2Vzc29yICZQUCwgSWRlbnRpZmllckluZm8gKklJKSB7CisgICAgICBpZiAoYXV0byAqSW5mbyA9IGdldE1vZHVsZUluZm8oUFAsIElJKSkgeworICAgICAgICBJbmZvLT5PdmVycmlkZGVuTWFjcm9zLmluc2VydChJbmZvLT5PdmVycmlkZGVuTWFjcm9zLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvLT5BY3RpdmVNb2R1bGVNYWNyb3MuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mby0+QWN0aXZlTW9kdWxlTWFjcm9zLmVuZCgpKTsKKyAgICAgICAgSW5mby0+QWN0aXZlTW9kdWxlTWFjcm9zLmNsZWFyKCk7CisgICAgICAgIEluZm8tPklzQW1iaWd1b3VzID0gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgQXJyYXlSZWY8TW9kdWxlTWFjcm8qPiBnZXRPdmVycmlkZGVuTWFjcm9zKCkgY29uc3QgeworICAgICAgaWYgKGF1dG8gKkluZm8gPSBTdGF0ZS5keW5fY2FzdDxNb2R1bGVNYWNyb0luZm8qPigpKQorICAgICAgICByZXR1cm4gSW5mby0+T3ZlcnJpZGRlbk1hY3JvczsKKyAgICAgIHJldHVybiBOb25lOworICAgIH0KKworICAgIHZvaWQgc2V0T3ZlcnJpZGRlbk1hY3JvcyhQcmVwcm9jZXNzb3IgJlBQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxNb2R1bGVNYWNybyAqPiBPdmVycmlkZXMpIHsKKyAgICAgIGF1dG8gKkluZm8gPSBTdGF0ZS5keW5fY2FzdDxNb2R1bGVNYWNyb0luZm8qPigpOworICAgICAgaWYgKCFJbmZvKSB7CisgICAgICAgIGlmIChPdmVycmlkZXMuZW1wdHkoKSkKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIEluZm8gPSBuZXcgKFBQLmdldFByZXByb2Nlc3NvckFsbG9jYXRvcigpKQorICAgICAgICAgICAgTW9kdWxlTWFjcm9JbmZvKFN0YXRlLmdldDxNYWNyb0RpcmVjdGl2ZSAqPigpKTsKKyAgICAgICAgU3RhdGUgPSBJbmZvOworICAgICAgfQorICAgICAgSW5mby0+T3ZlcnJpZGRlbk1hY3Jvcy5jbGVhcigpOworICAgICAgSW5mby0+T3ZlcnJpZGRlbk1hY3Jvcy5pbnNlcnQoSW5mby0+T3ZlcnJpZGRlbk1hY3Jvcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJyaWRlcy5iZWdpbigpLCBPdmVycmlkZXMuZW5kKCkpOworICAgICAgSW5mby0+QWN0aXZlTW9kdWxlTWFjcm9zR2VuZXJhdGlvbiA9IDA7CisgICAgfQorICB9OworCisgIC8vLyBGb3IgZWFjaCBJZGVudGlmaWVySW5mbyB0aGF0IHdhcyBhc3NvY2lhdGVkIHdpdGggYSBtYWNybywgd2UKKyAgLy8vIGtlZXAgYSBtYXBwaW5nIHRvIHRoZSBoaXN0b3J5IG9mIGFsbCBtYWNybyBkZWZpbml0aW9ucyBhbmQgI3VuZGVmcyBpbgorICAvLy8gdGhlIHJldmVyc2Ugb3JkZXIgKHRoZSBsYXRlc3Qgb25lIGlzIGluIHRoZSBoZWFkIG9mIHRoZSBsaXN0KS4KKyAgLy8vCisgIC8vLyBUaGlzIG1hcHBpbmcgbGl2ZXMgd2l0aGluIHRoZSBccCBDdXJTdWJtb2R1bGVTdGF0ZS4KKyAgdXNpbmcgTWFjcm9NYXAgPSBsbHZtOjpEZW5zZU1hcDxjb25zdCBJZGVudGlmaWVySW5mbyAqLCBNYWNyb1N0YXRlPjsKKworICBzdHJ1Y3QgU3VibW9kdWxlU3RhdGU7CisKKyAgLy8vIFxicmllZiBJbmZvcm1hdGlvbiBhYm91dCBhIHN1Ym1vZHVsZSB0aGF0IHdlJ3JlIGN1cnJlbnRseSBidWlsZGluZy4KKyAgc3RydWN0IEJ1aWxkaW5nU3VibW9kdWxlSW5mbyB7CisgICAgLy8vIFRoZSBtb2R1bGUgdGhhdCB3ZSBhcmUgYnVpbGRpbmcuCisgICAgTW9kdWxlICpNOworCisgICAgLy8vIFRoZSBsb2NhdGlvbiBhdCB3aGljaCB0aGUgbW9kdWxlIHdhcyBpbmNsdWRlZC4KKyAgICBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2M7CisKKyAgICAvLy8gV2hldGhlciB3ZSBlbnRlcmVkIHRoaXMgc3VibW9kdWxlIHZpYSBhIHByYWdtYS4KKyAgICBib29sIElzUHJhZ21hOworCisgICAgLy8vIFRoZSBwcmV2aW91cyBTdWJtb2R1bGVTdGF0ZS4KKyAgICBTdWJtb2R1bGVTdGF0ZSAqT3V0ZXJTdWJtb2R1bGVTdGF0ZTsKKworICAgIC8vLyBUaGUgbnVtYmVyIG9mIHBlbmRpbmcgbW9kdWxlIG1hY3JvIG5hbWVzIHdoZW4gd2Ugc3RhcnRlZCBidWlsZGluZyB0aGlzLgorICAgIHVuc2lnbmVkIE91dGVyUGVuZGluZ01vZHVsZU1hY3JvTmFtZXM7CisKKyAgICBCdWlsZGluZ1N1Ym1vZHVsZUluZm8oTW9kdWxlICpNLCBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MsIGJvb2wgSXNQcmFnbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym1vZHVsZVN0YXRlICpPdXRlclN1Ym1vZHVsZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPdXRlclBlbmRpbmdNb2R1bGVNYWNyb05hbWVzKQorICAgICAgICA6IE0oTSksIEltcG9ydExvYyhJbXBvcnRMb2MpLCBJc1ByYWdtYShJc1ByYWdtYSksCisgICAgICAgICAgT3V0ZXJTdWJtb2R1bGVTdGF0ZShPdXRlclN1Ym1vZHVsZVN0YXRlKSwKKyAgICAgICAgICBPdXRlclBlbmRpbmdNb2R1bGVNYWNyb05hbWVzKE91dGVyUGVuZGluZ01vZHVsZU1hY3JvTmFtZXMpIHt9CisgIH07CisgIFNtYWxsVmVjdG9yPEJ1aWxkaW5nU3VibW9kdWxlSW5mbywgOD4gQnVpbGRpbmdTdWJtb2R1bGVTdGFjazsKKworICAvLy8gXGJyaWVmIEluZm9ybWF0aW9uIGFib3V0IGEgc3VibW9kdWxlJ3MgcHJlcHJvY2Vzc29yIHN0YXRlLgorICBzdHJ1Y3QgU3VibW9kdWxlU3RhdGUgeworICAgIC8vLyBUaGUgbWFjcm9zIGZvciB0aGUgc3VibW9kdWxlLgorICAgIE1hY3JvTWFwIE1hY3JvczsKKworICAgIC8vLyBUaGUgc2V0IG9mIG1vZHVsZXMgdGhhdCBhcmUgdmlzaWJsZSB3aXRoaW4gdGhlIHN1Ym1vZHVsZS4KKyAgICBWaXNpYmxlTW9kdWxlU2V0IFZpc2libGVNb2R1bGVzOworCisgICAgLy8gRklYTUU6IENvdW50ZXJWYWx1ZT8KKyAgICAvLyBGSVhNRTogUHJhZ21hUHVzaE1hY3JvSW5mbz8KKyAgfTsKKyAgc3RkOjptYXA8TW9kdWxlICosIFN1Ym1vZHVsZVN0YXRlPiBTdWJtb2R1bGVzOworCisgIC8vLyBUaGUgcHJlcHJvY2Vzc29yIHN0YXRlIGZvciBwcmVwcm9jZXNzaW5nIG91dHNpZGUgb2YgYW55IHN1Ym1vZHVsZS4KKyAgU3VibW9kdWxlU3RhdGUgTnVsbFN1Ym1vZHVsZVN0YXRlOworCisgIC8vLyBUaGUgY3VycmVudCBzdWJtb2R1bGUgc3RhdGUuIFdpbGwgYmUgXHAgTnVsbFN1Ym1vZHVsZVN0YXRlIGlmIHdlJ3JlIG5vdAorICAvLy8gaW4gYSBzdWJtb2R1bGUuCisgIFN1Ym1vZHVsZVN0YXRlICpDdXJTdWJtb2R1bGVTdGF0ZTsKKworICAvLy8gVGhlIHNldCBvZiBrbm93biBtYWNyb3MgZXhwb3J0ZWQgZnJvbSBtb2R1bGVzLgorICBsbHZtOjpGb2xkaW5nU2V0PE1vZHVsZU1hY3JvPiBNb2R1bGVNYWNyb3M7CisKKyAgLy8vIFRoZSBuYW1lcyBvZiBwb3RlbnRpYWwgbW9kdWxlIG1hY3JvcyB0aGF0IHdlJ3ZlIG5vdCB5ZXQgcHJvY2Vzc2VkLgorICBsbHZtOjpTbWFsbFZlY3Rvcjxjb25zdCBJZGVudGlmaWVySW5mbyAqLCAzMj4gUGVuZGluZ01vZHVsZU1hY3JvTmFtZXM7CisKKyAgLy8vIFRoZSBsaXN0IG9mIG1vZHVsZSBtYWNyb3MsIGZvciBlYWNoIGlkZW50aWZpZXIsIHRoYXQgYXJlIG5vdCBvdmVycmlkZGVuIGJ5CisgIC8vLyBhbnkgb3RoZXIgbW9kdWxlIG1hY3JvLgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBJZGVudGlmaWVySW5mbyAqLCBsbHZtOjpUaW55UHRyVmVjdG9yPE1vZHVsZU1hY3JvICo+PgorICAgICAgTGVhZk1vZHVsZU1hY3JvczsKKworICAvLy8gXGJyaWVmIE1hY3JvcyB0aGF0IHdlIHdhbnQgdG8gd2FybiBiZWNhdXNlIHRoZXkgYXJlIG5vdCB1c2VkIGF0IHRoZSBlbmQKKyAgLy8vIG9mIHRoZSB0cmFuc2xhdGlvbiB1bml0LgorICAvLy8KKyAgLy8vIFdlIHN0b3JlIGp1c3QgdGhlaXIgU291cmNlTG9jYXRpb25zIGluc3RlYWQgb2YKKyAgLy8vIHNvbWV0aGluZyBsaWtlIE1hY3JvSW5mbyouIFRoZSBiZW5lZml0IG9mIHRoaXMgaXMgdGhhdCB3aGVuIHdlIGFyZQorICAvLy8gZGVzZXJpYWxpemluZyBmcm9tIFBDSCwgd2UgZG9uJ3QgbmVlZCB0byBkZXNlcmlhbGl6ZSBpZGVudGlmaWVyICYgbWFjcm9zCisgIC8vLyBqdXN0IHNvIHRoYXQgd2UgY2FuIHJlcG9ydCB0aGF0IHRoZXkgYXJlIHVudXNlZCwgd2UganVzdCB3YXJuIHVzaW5nCisgIC8vLyB0aGUgU291cmNlTG9jYXRpb25zIG9mIHRoaXMgc2V0ICh0aGF0IHdpbGwgYmUgZmlsbGVkIGJ5IHRoZSBBU1RSZWFkZXIpLgorICAvLy8gV2UgYXJlIHVzaW5nIFNtYWxsUHRyU2V0IGluc3RlYWQgb2YgYSB2ZWN0b3IgZm9yIGZhc3RlciByZW1vdmFsLgorICB1c2luZyBXYXJuVW51c2VkTWFjcm9Mb2NzVHkgPSBsbHZtOjpTbWFsbFB0clNldDxTb3VyY2VMb2NhdGlvbiwgMzI+OworICBXYXJuVW51c2VkTWFjcm9Mb2NzVHkgV2FyblVudXNlZE1hY3JvTG9jczsKKworICAvLy8gXGJyaWVmIEEgImZyZWVsaXN0IiBvZiBNYWNyb0FyZyBvYmplY3RzIHRoYXQgY2FuIGJlCisgIC8vLyByZXVzZWQgZm9yIHF1aWNrIGFsbG9jYXRpb24uCisgIE1hY3JvQXJncyAqTWFjcm9BcmdDYWNoZSA9IG51bGxwdHI7CisKKyAgLy8vIEZvciBlYWNoIElkZW50aWZpZXJJbmZvIHVzZWQgaW4gYSBcI3ByYWdtYSBwdXNoX21hY3JvIGRpcmVjdGl2ZSwKKyAgLy8vIHdlIGtlZXAgYSBNYWNyb0luZm8gc3RhY2sgdXNlZCB0byByZXN0b3JlIHRoZSBwcmV2aW91cyBtYWNybyB2YWx1ZS4KKyAgbGx2bTo6RGVuc2VNYXA8SWRlbnRpZmllckluZm8gKiwgc3RkOjp2ZWN0b3I8TWFjcm9JbmZvICo+PgorICAgICAgUHJhZ21hUHVzaE1hY3JvSW5mbzsKKworICAvLyBWYXJpb3VzIHN0YXRpc3RpY3Mgd2UgdHJhY2sgZm9yIHBlcmZvcm1hbmNlIGFuYWx5c2lzLgorICB1bnNpZ25lZCBOdW1EaXJlY3RpdmVzID0gMDsKKyAgdW5zaWduZWQgTnVtRGVmaW5lZCA9IDA7CisgIHVuc2lnbmVkIE51bVVuZGVmaW5lZCA9IDA7CisgIHVuc2lnbmVkIE51bVByYWdtYSA9IDA7CisgIHVuc2lnbmVkIE51bUlmID0gMDsKKyAgdW5zaWduZWQgTnVtRWxzZSA9IDA7CisgIHVuc2lnbmVkIE51bUVuZGlmID0gMDsKKyAgdW5zaWduZWQgTnVtRW50ZXJlZFNvdXJjZUZpbGVzID0gMDsKKyAgdW5zaWduZWQgTWF4SW5jbHVkZVN0YWNrRGVwdGggPSAwOworICB1bnNpZ25lZCBOdW1NYWNyb0V4cGFuZGVkID0gMDsKKyAgdW5zaWduZWQgTnVtRm5NYWNyb0V4cGFuZGVkID0gMDsKKyAgdW5zaWduZWQgTnVtQnVpbHRpbk1hY3JvRXhwYW5kZWQgPSAwOworICB1bnNpZ25lZCBOdW1GYXN0TWFjcm9FeHBhbmRlZCA9IDA7CisgIHVuc2lnbmVkIE51bVRva2VuUGFzdGUgPSAwOworICB1bnNpZ25lZCBOdW1GYXN0VG9rZW5QYXN0ZSA9IDA7CisgIHVuc2lnbmVkIE51bVNraXBwZWQgPSAwOworCisgIC8vLyBcYnJpZWYgVGhlIHByZWRlZmluZWQgbWFjcm9zIHRoYXQgcHJlcHJvY2Vzc29yIHNob3VsZCB1c2UgZnJvbSB0aGUKKyAgLy8vIGNvbW1hbmQgbGluZSBldGMuCisgIHN0ZDo6c3RyaW5nIFByZWRlZmluZXM7CisKKyAgLy8vIFxicmllZiBUaGUgZmlsZSBJRCBmb3IgdGhlIHByZXByb2Nlc3NvciBwcmVkZWZpbmVzLgorICBGaWxlSUQgUHJlZGVmaW5lc0ZpbGVJRDsKKworICAvLy8gXHsKKyAgLy8vIFxicmllZiBDYWNoZSBvZiBtYWNybyBleHBhbmRlcnMgdG8gcmVkdWNlIG1hbGxvYyB0cmFmZmljLgorICBlbnVtIHsgVG9rZW5MZXhlckNhY2hlU2l6ZSA9IDggfTsKKyAgdW5zaWduZWQgTnVtQ2FjaGVkVG9rZW5MZXhlcnM7CisgIHN0ZDo6dW5pcXVlX3B0cjxUb2tlbkxleGVyPiBUb2tlbkxleGVyQ2FjaGVbVG9rZW5MZXhlckNhY2hlU2l6ZV07CisgIC8vLyBcfQorCisgIC8vLyBcYnJpZWYgS2VlcHMgbWFjcm8gZXhwYW5kZWQgdG9rZW5zIGZvciBUb2tlbkxleGVycy4KKyAgLy8KKyAgLy8vIFdvcmtzIGxpa2UgYSBzdGFjazsgYSBUb2tlbkxleGVyIGFkZHMgdGhlIG1hY3JvIGV4cGFuZGVkIHRva2VucyB0aGF0IGlzCisgIC8vLyBnb2luZyB0byBsZXggaW4gdGhlIGNhY2hlIGFuZCB3aGVuIGl0IGZpbmlzaGVzIHRoZSB0b2tlbnMgYXJlIHJlbW92ZWQKKyAgLy8vIGZyb20gdGhlIGVuZCBvZiB0aGUgY2FjaGUuCisgIFNtYWxsVmVjdG9yPFRva2VuLCAxNj4gTWFjcm9FeHBhbmRlZFRva2VuczsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFRva2VuTGV4ZXIgKiwgc2l6ZV90Pj4gTWFjcm9FeHBhbmRpbmdMZXhlcnNTdGFjazsKKworICAvLy8gXGJyaWVmIEEgcmVjb3JkIG9mIHRoZSBtYWNybyBkZWZpbml0aW9ucyBhbmQgZXhwYW5zaW9ucyB0aGF0CisgIC8vLyBvY2N1cnJlZCBkdXJpbmcgcHJlcHJvY2Vzc2luZy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGFuIG9wdGlvbmFsIHNpZGUgc3RydWN0dXJlIHRoYXQgY2FuIGJlIGVuYWJsZWQgd2l0aAorICAvLy8gXGMgY3JlYXRlUHJlcHJvY2Vzc2luZ1JlY29yZCgpIHByaW9yIHRvIHByZXByb2Nlc3NpbmcuCisgIFByZXByb2Nlc3NpbmdSZWNvcmQgKlJlY29yZCA9IG51bGxwdHI7CisKKyAgLy8vIENhY2hlZCB0b2tlbnMgc3RhdGUuCisgIHVzaW5nIENhY2hlZFRva2Vuc1R5ID0gU21hbGxWZWN0b3I8VG9rZW4sIDE+OworCisgIC8vLyBcYnJpZWYgQ2FjaGVkIHRva2VucyBhcmUgc3RvcmVkIGhlcmUgd2hlbiB3ZSBkbyBiYWNrdHJhY2tpbmcgb3IKKyAgLy8vIGxvb2thaGVhZC4gVGhleSBhcmUgImxleGVkIiBieSB0aGUgQ2FjaGluZ0xleCgpIG1ldGhvZC4KKyAgQ2FjaGVkVG9rZW5zVHkgQ2FjaGVkVG9rZW5zOworCisgIC8vLyBcYnJpZWYgVGhlIHBvc2l0aW9uIG9mIHRoZSBjYWNoZWQgdG9rZW4gdGhhdCBDYWNoaW5nTGV4KCkgc2hvdWxkCisgIC8vLyAibGV4IiBuZXh0LgorICAvLy8KKyAgLy8vIElmIGl0IHBvaW50cyBiZXlvbmQgdGhlIENhY2hlZFRva2VucyB2ZWN0b3IsIGl0IG1lYW5zIHRoYXQgYSBub3JtYWwKKyAgLy8vIExleCgpIHNob3VsZCBiZSBpbnZva2VkLgorICBDYWNoZWRUb2tlbnNUeTo6c2l6ZV90eXBlIENhY2hlZExleFBvcyA9IDA7CisKKyAgLy8vIFxicmllZiBTdGFjayBvZiBiYWNrdHJhY2sgcG9zaXRpb25zLCBhbGxvd2luZyBuZXN0ZWQgYmFja3RyYWNrcy4KKyAgLy8vCisgIC8vLyBUaGUgRW5hYmxlQmFja3RyYWNrQXRUaGlzUG9zKCkgbWV0aG9kIHB1c2hlcyBhIHBvc2l0aW9uIHRvCisgIC8vLyBpbmRpY2F0ZSB3aGVyZSBDYWNoZWRMZXhQb3Mgc2hvdWxkIGJlIHNldCB3aGVuIHRoZSBCYWNrVHJhY2soKSBtZXRob2QgaXMKKyAgLy8vIGludm9rZWQgKGF0IHdoaWNoIHBvaW50IHRoZSBsYXN0IHBvc2l0aW9uIGlzIHBvcHBlZCkuCisgIHN0ZDo6dmVjdG9yPENhY2hlZFRva2Vuc1R5OjpzaXplX3R5cGU+IEJhY2t0cmFja1Bvc2l0aW9uczsKKworICBzdHJ1Y3QgTWFjcm9JbmZvQ2hhaW4geworICAgIE1hY3JvSW5mbyBNSTsKKyAgICBNYWNyb0luZm9DaGFpbiAqTmV4dDsKKyAgfTsKKworICAvLy8gTWFjcm9JbmZvcyBhcmUgbWFuYWdlZCBhcyBhIGNoYWluIGZvciBlYXN5IGRpc3Bvc2FsLiAgVGhpcyBpcyB0aGUgaGVhZAorICAvLy8gb2YgdGhhdCBsaXN0LgorICBNYWNyb0luZm9DaGFpbiAqTUlDaGFpbkhlYWQgPSBudWxscHRyOworCisgIHZvaWQgdXBkYXRlT3V0T2ZEYXRlSWRlbnRpZmllcihJZGVudGlmaWVySW5mbyAmSUkpIGNvbnN0OworCitwdWJsaWM6CisgIFByZXByb2Nlc3NvcihzdGQ6OnNoYXJlZF9wdHI8UHJlcHJvY2Vzc29yT3B0aW9ucz4gUFBPcHRzLAorICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJmRpYWdzLCBMYW5nT3B0aW9ucyAmb3B0cywgU291cmNlTWFuYWdlciAmU00sCisgICAgICAgICAgICAgICBNZW1vcnlCdWZmZXJDYWNoZSAmUENNQ2FjaGUsCisgICAgICAgICAgICAgICBIZWFkZXJTZWFyY2ggJkhlYWRlcnMsIE1vZHVsZUxvYWRlciAmVGhlTW9kdWxlTG9hZGVyLAorICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm9Mb29rdXAgKklJTG9va3VwID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgIGJvb2wgT3duc0hlYWRlclNlYXJjaCA9IGZhbHNlLAorICAgICAgICAgICAgICAgVHJhbnNsYXRpb25Vbml0S2luZCBUVUtpbmQgPSBUVV9Db21wbGV0ZSk7CisKKyAgflByZXByb2Nlc3NvcigpOworCisgIC8vLyBcYnJpZWYgSW5pdGlhbGl6ZSB0aGUgcHJlcHJvY2Vzc29yIHVzaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXJnZXQuCisgIC8vLworICAvLy8gXHBhcmFtIFRhcmdldCBpcyBvd25lZCBieSB0aGUgY2FsbGVyIGFuZCBtdXN0IHJlbWFpbiB2YWxpZCBmb3IgdGhlCisgIC8vLyBsaWZldGltZSBvZiB0aGUgcHJlcHJvY2Vzc29yLgorICAvLy8gXHBhcmFtIEF1eFRhcmdldCBpcyBvd25lZCBieSB0aGUgY2FsbGVyIGFuZCBtdXN0IHJlbWFpbiB2YWxpZCBmb3IKKyAgLy8vIHRoZSBsaWZldGltZSBvZiB0aGUgcHJlcHJvY2Vzc29yLgorICB2b2lkIEluaXRpYWxpemUoY29uc3QgVGFyZ2V0SW5mbyAmVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5mbyAqQXV4VGFyZ2V0ID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBJbml0aWFsaXplIHRoZSBwcmVwcm9jZXNzb3IgdG8gcGFyc2UgYSBtb2RlbCBmaWxlCisgIC8vLworICAvLy8gVG8gcGFyc2UgbW9kZWwgZmlsZXMgdGhlIHByZXByb2Nlc3NvciBvZiB0aGUgb3JpZ2luYWwgc291cmNlIGlzIHJldXNlZCB0bworICAvLy8gcHJlc2VydmVyIHRoZSBpZGVudGlmaWVyIHRhYmxlLiBIb3dldmVyIHRvIGF2b2lkIHNvbWUgZHVwbGljYXRlCisgIC8vLyBpbmZvcm1hdGlvbiBpbiB0aGUgcHJlcHJvY2Vzc29yIHNvbWUgY2xlYW51cCBpcyBuZWVkZWQgYmVmb3JlIGl0IGlzIHVzZWQKKyAgLy8vIHRvIHBhcnNlIG1vZGVsIGZpbGVzLiBUaGlzIG1ldGhvZCBkb2VzIHRoYXQgY2xlYW51cC4KKyAgdm9pZCBJbml0aWFsaXplRm9yTW9kZWxGaWxlKCk7CisKKyAgLy8vIFxicmllZiBDbGVhbnVwIGFmdGVyIG1vZGVsIGZpbGUgcGFyc2luZworICB2b2lkIEZpbmFsaXplRm9yTW9kZWxGaWxlKCk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgcHJlcHJvY2Vzc29yIG9wdGlvbnMgdXNlZCB0byBpbml0aWFsaXplIHRoaXMKKyAgLy8vIHByZXByb2Nlc3Nvci4KKyAgUHJlcHJvY2Vzc29yT3B0aW9ucyAmZ2V0UHJlcHJvY2Vzc29yT3B0cygpIGNvbnN0IHsgcmV0dXJuICpQUE9wdHM7IH0KKyAgCisgIERpYWdub3N0aWNzRW5naW5lICZnZXREaWFnbm9zdGljcygpIGNvbnN0IHsgcmV0dXJuICpEaWFnczsgfQorICB2b2lkIHNldERpYWdub3N0aWNzKERpYWdub3N0aWNzRW5naW5lICZEKSB7IERpYWdzID0gJkQ7IH0KKworICBjb25zdCBMYW5nT3B0aW9ucyAmZ2V0TGFuZ09wdHMoKSBjb25zdCB7IHJldHVybiBMYW5nT3B0czsgfQorICBjb25zdCBUYXJnZXRJbmZvICZnZXRUYXJnZXRJbmZvKCkgY29uc3QgeyByZXR1cm4gKlRhcmdldDsgfQorICBjb25zdCBUYXJnZXRJbmZvICpnZXRBdXhUYXJnZXRJbmZvKCkgY29uc3QgeyByZXR1cm4gQXV4VGFyZ2V0OyB9CisgIEZpbGVNYW5hZ2VyICZnZXRGaWxlTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIEZpbGVNZ3I7IH0KKyAgU291cmNlTWFuYWdlciAmZ2V0U291cmNlTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZU1ncjsgfQorICBNZW1vcnlCdWZmZXJDYWNoZSAmZ2V0UENNQ2FjaGUoKSBjb25zdCB7IHJldHVybiBQQ01DYWNoZTsgfQorICBIZWFkZXJTZWFyY2ggJmdldEhlYWRlclNlYXJjaEluZm8oKSBjb25zdCB7IHJldHVybiBIZWFkZXJJbmZvOyB9CisKKyAgSWRlbnRpZmllclRhYmxlICZnZXRJZGVudGlmaWVyVGFibGUoKSB7IHJldHVybiBJZGVudGlmaWVyczsgfQorICBjb25zdCBJZGVudGlmaWVyVGFibGUgJmdldElkZW50aWZpZXJUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIElkZW50aWZpZXJzOyB9CisgIFNlbGVjdG9yVGFibGUgJmdldFNlbGVjdG9yVGFibGUoKSB7IHJldHVybiBTZWxlY3RvcnM7IH0KKyAgQnVpbHRpbjo6Q29udGV4dCAmZ2V0QnVpbHRpbkluZm8oKSB7IHJldHVybiBCdWlsdGluSW5mbzsgfQorICBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yICZnZXRQcmVwcm9jZXNzb3JBbGxvY2F0b3IoKSB7IHJldHVybiBCUDsgfQorCisgIHZvaWQgc2V0UFRITWFuYWdlcihQVEhNYW5hZ2VyKiBwbSk7CisKKyAgUFRITWFuYWdlciAqZ2V0UFRITWFuYWdlcigpIHsgcmV0dXJuIFBUSC5nZXQoKTsgfQorCisgIHZvaWQgc2V0RXh0ZXJuYWxTb3VyY2UoRXh0ZXJuYWxQcmVwcm9jZXNzb3JTb3VyY2UgKlNvdXJjZSkgeworICAgIEV4dGVybmFsU291cmNlID0gU291cmNlOworICB9CisKKyAgRXh0ZXJuYWxQcmVwcm9jZXNzb3JTb3VyY2UgKmdldEV4dGVybmFsU291cmNlKCkgY29uc3QgeworICAgIHJldHVybiBFeHRlcm5hbFNvdXJjZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG1vZHVsZSBsb2FkZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJlcHJvY2Vzc29yLgorICBNb2R1bGVMb2FkZXIgJmdldE1vZHVsZUxvYWRlcigpIGNvbnN0IHsgcmV0dXJuIFRoZU1vZHVsZUxvYWRlcjsgfQorCisgIGJvb2wgaGFkTW9kdWxlTG9hZGVyRmF0YWxGYWlsdXJlKCkgY29uc3QgeworICAgIHJldHVybiBUaGVNb2R1bGVMb2FkZXIuSGFkRmF0YWxGYWlsdXJlOworICB9CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHdlIGFyZSBjdXJyZW50bHkgcHJlcHJvY2Vzc2luZyBhICNpZiBvciAjZWxpZiBkaXJlY3RpdmUKKyAgYm9vbCBpc1BhcnNpbmdJZk9yRWxpZkRpcmVjdGl2ZSgpIGNvbnN0IHsgCisgICAgcmV0dXJuIFBhcnNpbmdJZk9yRWxpZkRpcmVjdGl2ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29udHJvbCB3aGV0aGVyIHRoZSBwcmVwcm9jZXNzb3IgcmV0YWlucyBjb21tZW50cyBpbiBvdXRwdXQuCisgIHZvaWQgU2V0Q29tbWVudFJldGVudGlvblN0YXRlKGJvb2wgS2VlcENvbW1lbnRzLCBib29sIEtlZXBNYWNyb0NvbW1lbnRzKSB7CisgICAgdGhpcy0+S2VlcENvbW1lbnRzID0gS2VlcENvbW1lbnRzIHwgS2VlcE1hY3JvQ29tbWVudHM7CisgICAgdGhpcy0+S2VlcE1hY3JvQ29tbWVudHMgPSBLZWVwTWFjcm9Db21tZW50czsKKyAgfQorCisgIGJvb2wgZ2V0Q29tbWVudFJldGVudGlvblN0YXRlKCkgY29uc3QgeyByZXR1cm4gS2VlcENvbW1lbnRzOyB9CisKKyAgdm9pZCBzZXRQcmFnbWFzRW5hYmxlZChib29sIEVuYWJsZWQpIHsgUHJhZ21hc0VuYWJsZWQgPSBFbmFibGVkOyB9CisgIGJvb2wgZ2V0UHJhZ21hc0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBQcmFnbWFzRW5hYmxlZDsgfQorCisgIHZvaWQgU2V0U3VwcHJlc3NJbmNsdWRlTm90Rm91bmRFcnJvcihib29sIFN1cHByZXNzKSB7CisgICAgU3VwcHJlc3NJbmNsdWRlTm90Rm91bmRFcnJvciA9IFN1cHByZXNzOworICB9CisKKyAgYm9vbCBHZXRTdXBwcmVzc0luY2x1ZGVOb3RGb3VuZEVycm9yKCkgeworICAgIHJldHVybiBTdXBwcmVzc0luY2x1ZGVOb3RGb3VuZEVycm9yOworICB9CisKKyAgLy8vIFNldHMgd2hldGhlciB0aGUgcHJlcHJvY2Vzc29yIGlzIHJlc3BvbnNpYmxlIGZvciBwcm9kdWNpbmcgb3V0cHV0IG9yIGlmCisgIC8vLyBpdCBpcyBwcm9kdWNpbmcgdG9rZW5zIHRvIGJlIGNvbnN1bWVkIGJ5IFBhcnNlIGFuZCBTZW1hLgorICB2b2lkIHNldFByZXByb2Nlc3NlZE91dHB1dChib29sIElzUHJlcHJvY2Vzc2VkT3V0cHV0KSB7CisgICAgUHJlcHJvY2Vzc2VkT3V0cHV0ID0gSXNQcmVwcm9jZXNzZWRPdXRwdXQ7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBwcmVwcm9jZXNzb3IgaXMgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgb3V0cHV0LAorICAvLy8gZmFsc2UgaWYgaXQgaXMgcHJvZHVjaW5nIHRva2VucyB0byBiZSBjb25zdW1lZCBieSBQYXJzZSBhbmQgU2VtYS4KKyAgYm9vbCBpc1ByZXByb2Nlc3NlZE91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIFByZXByb2Nlc3NlZE91dHB1dDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgd2UgYXJlIGxleGluZyBkaXJlY3RseSBmcm9tIHRoZSBzcGVjaWZpZWQgbGV4ZXIuCisgIGJvb2wgaXNDdXJyZW50TGV4ZXIoY29uc3QgUHJlcHJvY2Vzc29yTGV4ZXIgKkwpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3VyUFBMZXhlciA9PSBMOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGN1cnJlbnQgbGV4ZXIgYmVpbmcgbGV4ZWQgZnJvbS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBpZ25vcmVzIGFueSBwb3RlbnRpYWxseSBhY3RpdmUgbWFjcm8gZXhwYW5zaW9ucyBhbmQgX1ByYWdtYQorICAvLy8gZXhwYW5zaW9ucyBnb2luZyBvbiBhdCB0aGUgdGltZS4KKyAgUHJlcHJvY2Vzc29yTGV4ZXIgKmdldEN1cnJlbnRMZXhlcigpIGNvbnN0IHsgcmV0dXJuIEN1clBQTGV4ZXI7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgY3VycmVudCBmaWxlIGxleGVyIGJlaW5nIGxleGVkIGZyb20uCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgaWdub3JlcyBhbnkgcG90ZW50aWFsbHkgYWN0aXZlIG1hY3JvIGV4cGFuc2lvbnMgYW5kIF9QcmFnbWEKKyAgLy8vIGV4cGFuc2lvbnMgZ29pbmcgb24gYXQgdGhlIHRpbWUuCisgIFByZXByb2Nlc3NvckxleGVyICpnZXRDdXJyZW50RmlsZUxleGVyKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHN1Ym1vZHVsZSBvd25pbmcgdGhlIGZpbGUgYmVpbmcgbGV4ZWQuIFRoaXMgbWF5IG5vdCBiZQorICAvLy8gdGhlIGN1cnJlbnQgbW9kdWxlIGlmIHdlIGhhdmUgY2hhbmdlZCBtb2R1bGVzIHNpbmNlIGVudGVyaW5nIHRoZSBmaWxlLgorICBNb2R1bGUgKmdldEN1cnJlbnRMZXhlclN1Ym1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIEN1ckxleGVyU3VibW9kdWxlOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBGaWxlSUQgZm9yIHRoZSBwcmVwcm9jZXNzb3IgcHJlZGVmaW5lcy4KKyAgRmlsZUlEIGdldFByZWRlZmluZXNGaWxlSUQoKSBjb25zdCB7IHJldHVybiBQcmVkZWZpbmVzRmlsZUlEOyB9CisKKyAgLy8vIFx7CisgIC8vLyBcYnJpZWYgQWNjZXNzb3JzIGZvciBwcmVwcm9jZXNzb3IgY2FsbGJhY2tzLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGNsYXNzIHRha2VzIG93bmVyc2hpcCBvZiBhbnkgUFBDYWxsYmFja3Mgb2JqZWN0IGdpdmVuIHRvCisgIC8vLyBpdC4KKyAgUFBDYWxsYmFja3MgKmdldFBQQ2FsbGJhY2tzKCkgY29uc3QgeyByZXR1cm4gQ2FsbGJhY2tzLmdldCgpOyB9CisgIHZvaWQgYWRkUFBDYWxsYmFja3Moc3RkOjp1bmlxdWVfcHRyPFBQQ2FsbGJhY2tzPiBDKSB7CisgICAgaWYgKENhbGxiYWNrcykKKyAgICAgIEMgPSBsbHZtOjptYWtlX3VuaXF1ZTxQUENoYWluZWRDYWxsYmFja3M+KHN0ZDo6bW92ZShDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShDYWxsYmFja3MpKTsKKyAgICBDYWxsYmFja3MgPSBzdGQ6Om1vdmUoQyk7CisgIH0KKyAgLy8vIFx9CisKKyAgYm9vbCBpc01hY3JvRGVmaW5lZChTdHJpbmdSZWYgSWQpIHsKKyAgICByZXR1cm4gaXNNYWNyb0RlZmluZWQoJklkZW50aWZpZXJzLmdldChJZCkpOworICB9CisgIGJvb2wgaXNNYWNyb0RlZmluZWQoY29uc3QgSWRlbnRpZmllckluZm8gKklJKSB7CisgICAgcmV0dXJuIElJLT5oYXNNYWNyb0RlZmluaXRpb24oKSAmJgorICAgICAgICAgICAoIWdldExhbmdPcHRzKCkuTW9kdWxlcyB8fCAoYm9vbClnZXRNYWNyb0RlZmluaXRpb24oSUkpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgSUkgaXMgZGVmaW5lZCBhcyBhIG1hY3JvIHdpdGhpbiB0aGUgbW9kdWxlIE0sCisgIC8vLyBpZiB0aGF0IGlzIGEgbW9kdWxlIHRoYXQgd2UndmUgYWxyZWFkeSBwcmVwcm9jZXNzZWQuIERvZXMgbm90IGNoZWNrIGZvcgorICAvLy8gbWFjcm9zIGltcG9ydGVkIGludG8gTS4KKyAgYm9vbCBpc01hY3JvRGVmaW5lZEluTG9jYWxNb2R1bGUoY29uc3QgSWRlbnRpZmllckluZm8gKklJLCBNb2R1bGUgKk0pIHsKKyAgICBpZiAoIUlJLT5oYXNNYWNyb0RlZmluaXRpb24oKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBhdXRvIEkgPSBTdWJtb2R1bGVzLmZpbmQoTSk7CisgICAgaWYgKEkgPT0gU3VibW9kdWxlcy5lbmQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBhdXRvIEogPSBJLT5zZWNvbmQuTWFjcm9zLmZpbmQoSUkpOworICAgIGlmIChKID09IEktPnNlY29uZC5NYWNyb3MuZW5kKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgYXV0byAqTUQgPSBKLT5zZWNvbmQuZ2V0TGF0ZXN0KCk7CisgICAgcmV0dXJuIE1EICYmIE1ELT5pc0RlZmluZWQoKTsKKyAgfQorCisgIE1hY3JvRGVmaW5pdGlvbiBnZXRNYWNyb0RlZmluaXRpb24oY29uc3QgSWRlbnRpZmllckluZm8gKklJKSB7CisgICAgaWYgKCFJSS0+aGFzTWFjcm9EZWZpbml0aW9uKCkpCisgICAgICByZXR1cm4ge307CisKKyAgICBNYWNyb1N0YXRlICZTID0gQ3VyU3VibW9kdWxlU3RhdGUtPk1hY3Jvc1tJSV07CisgICAgYXV0byAqTUQgPSBTLmdldExhdGVzdCgpOworICAgIHdoaWxlIChNRCAmJiBpc2E8VmlzaWJpbGl0eU1hY3JvRGlyZWN0aXZlPihNRCkpCisgICAgICBNRCA9IE1ELT5nZXRQcmV2aW91cygpOworICAgIHJldHVybiBNYWNyb0RlZmluaXRpb24oZHluX2Nhc3Rfb3JfbnVsbDxEZWZNYWNyb0RpcmVjdGl2ZT4oTUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5nZXRBY3RpdmVNb2R1bGVNYWNyb3MoKnRoaXMsIElJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuaXNBbWJpZ3VvdXMoKnRoaXMsIElJKSk7CisgIH0KKworICBNYWNyb0RlZmluaXRpb24gZ2V0TWFjcm9EZWZpbml0aW9uQXRMb2MoY29uc3QgSWRlbnRpZmllckluZm8gKklJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgaWYgKCFJSS0+aGFkTWFjcm9EZWZpbml0aW9uKCkpCisgICAgICByZXR1cm4ge307CisKKyAgICBNYWNyb1N0YXRlICZTID0gQ3VyU3VibW9kdWxlU3RhdGUtPk1hY3Jvc1tJSV07CisgICAgTWFjcm9EaXJlY3RpdmU6OkRlZkluZm8gREk7CisgICAgaWYgKGF1dG8gKk1EID0gUy5nZXRMYXRlc3QoKSkKKyAgICAgIERJID0gTUQtPmZpbmREaXJlY3RpdmVBdExvYyhMb2MsIGdldFNvdXJjZU1hbmFnZXIoKSk7CisgICAgLy8gRklYTUU6IENvbXB1dGUgdGhlIHNldCBvZiBhY3RpdmUgbW9kdWxlIG1hY3JvcyBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAgIHJldHVybiBNYWNyb0RlZmluaXRpb24oREkuZ2V0RGlyZWN0aXZlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTLmdldEFjdGl2ZU1vZHVsZU1hY3JvcygqdGhpcywgSUkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5pc0FtYmlndW91cygqdGhpcywgSUkpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2l2ZW4gYW4gaWRlbnRpZmllciwgcmV0dXJuIGl0cyBsYXRlc3Qgbm9uLWltcG9ydGVkIE1hY3JvRGlyZWN0aXZlCisgIC8vLyBpZiBpdCBpcyBcI2RlZmluZSdkIGFuZCBub3QgXCN1bmRlZidkLCBvciBudWxsIGlmIGl0IGlzbid0IFwjZGVmaW5lJ2QuCisgIE1hY3JvRGlyZWN0aXZlICpnZXRMb2NhbE1hY3JvRGlyZWN0aXZlKGNvbnN0IElkZW50aWZpZXJJbmZvICpJSSkgY29uc3QgeworICAgIGlmICghSUktPmhhc01hY3JvRGVmaW5pdGlvbigpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBhdXRvICpNRCA9IGdldExvY2FsTWFjcm9EaXJlY3RpdmVIaXN0b3J5KElJKTsKKyAgICBpZiAoIU1EIHx8IE1ELT5nZXREZWZpbml0aW9uKCkuaXNVbmRlZmluZWQoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgcmV0dXJuIE1EOworICB9CisKKyAgY29uc3QgTWFjcm9JbmZvICpnZXRNYWNyb0luZm8oY29uc3QgSWRlbnRpZmllckluZm8gKklJKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8UHJlcHJvY2Vzc29yKj4odGhpcyktPmdldE1hY3JvSW5mbyhJSSk7CisgIH0KKworICBNYWNyb0luZm8gKmdldE1hY3JvSW5mbyhjb25zdCBJZGVudGlmaWVySW5mbyAqSUkpIHsKKyAgICBpZiAoIUlJLT5oYXNNYWNyb0RlZmluaXRpb24oKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIGlmIChhdXRvIE1EID0gZ2V0TWFjcm9EZWZpbml0aW9uKElJKSkKKyAgICAgIHJldHVybiBNRC5nZXRNYWNyb0luZm8oKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2l2ZW4gYW4gaWRlbnRpZmllciwgcmV0dXJuIHRoZSBsYXRlc3Qgbm9uLWltcG9ydGVkIG1hY3JvCisgIC8vLyBkaXJlY3RpdmUgZm9yIHRoYXQgaWRlbnRpZmllci4KKyAgLy8vCisgIC8vLyBPbmUgY2FuIGl0ZXJhdGUgb3ZlciBhbGwgcHJldmlvdXMgbWFjcm8gZGlyZWN0aXZlcyBmcm9tIHRoZSBtb3N0IHJlY2VudAorICAvLy8gb25lLgorICBNYWNyb0RpcmVjdGl2ZSAqZ2V0TG9jYWxNYWNyb0RpcmVjdGl2ZUhpc3RvcnkoY29uc3QgSWRlbnRpZmllckluZm8gKklJKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEFkZCBhIGRpcmVjdGl2ZSB0byB0aGUgbWFjcm8gZGlyZWN0aXZlIGhpc3RvcnkgZm9yIHRoaXMgaWRlbnRpZmllci4KKyAgdm9pZCBhcHBlbmRNYWNyb0RpcmVjdGl2ZShJZGVudGlmaWVySW5mbyAqSUksIE1hY3JvRGlyZWN0aXZlICpNRCk7CisgIERlZk1hY3JvRGlyZWN0aXZlICphcHBlbmREZWZNYWNyb0RpcmVjdGl2ZShJZGVudGlmaWVySW5mbyAqSUksIE1hY3JvSW5mbyAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBEZWZNYWNyb0RpcmVjdGl2ZSAqTUQgPSBBbGxvY2F0ZURlZk1hY3JvRGlyZWN0aXZlKE1JLCBMb2MpOworICAgIGFwcGVuZE1hY3JvRGlyZWN0aXZlKElJLCBNRCk7CisgICAgcmV0dXJuIE1EOworICB9CisgIERlZk1hY3JvRGlyZWN0aXZlICphcHBlbmREZWZNYWNyb0RpcmVjdGl2ZShJZGVudGlmaWVySW5mbyAqSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0luZm8gKk1JKSB7CisgICAgcmV0dXJuIGFwcGVuZERlZk1hY3JvRGlyZWN0aXZlKElJLCBNSSwgTUktPmdldERlZmluaXRpb25Mb2MoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCBhIE1hY3JvRGlyZWN0aXZlIHRoYXQgd2FzIGxvYWRlZCBmcm9tIGEgUENIIGZpbGUuCisgIHZvaWQgc2V0TG9hZGVkTWFjcm9EaXJlY3RpdmUoSWRlbnRpZmllckluZm8gKklJLCBNYWNyb0RpcmVjdGl2ZSAqRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9EaXJlY3RpdmUgKk1EKTsKKworICAvLy8gXGJyaWVmIFJlZ2lzdGVyIGFuIGV4cG9ydGVkIG1hY3JvIGZvciBhIG1vZHVsZSBhbmQgaWRlbnRpZmllci4KKyAgTW9kdWxlTWFjcm8gKmFkZE1vZHVsZU1hY3JvKE1vZHVsZSAqTW9kLCBJZGVudGlmaWVySW5mbyAqSUksIE1hY3JvSW5mbyAqTWFjcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxNb2R1bGVNYWNybyAqPiBPdmVycmlkZXMsIGJvb2wgJklzTmV3KTsKKyAgTW9kdWxlTWFjcm8gKmdldE1vZHVsZU1hY3JvKE1vZHVsZSAqTW9kLCBJZGVudGlmaWVySW5mbyAqSUkpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBsaXN0IG9mIGxlYWYgKG5vbi1vdmVycmlkZGVuKSBtb2R1bGUgbWFjcm9zIGZvciBhIG5hbWUuCisgIEFycmF5UmVmPE1vZHVsZU1hY3JvKj4gZ2V0TGVhZk1vZHVsZU1hY3Jvcyhjb25zdCBJZGVudGlmaWVySW5mbyAqSUkpIGNvbnN0IHsKKyAgICBpZiAoSUktPmlzT3V0T2ZEYXRlKCkpCisgICAgICB1cGRhdGVPdXRPZkRhdGVJZGVudGlmaWVyKGNvbnN0X2Nhc3Q8SWRlbnRpZmllckluZm8mPigqSUkpKTsKKyAgICBhdXRvIEkgPSBMZWFmTW9kdWxlTWFjcm9zLmZpbmQoSUkpOworICAgIGlmIChJICE9IExlYWZNb2R1bGVNYWNyb3MuZW5kKCkpCisgICAgICByZXR1cm4gSS0+c2Vjb25kOworICAgIHJldHVybiBOb25lOworICB9CisKKyAgLy8vIFx7CisgIC8vLyBJdGVyYXRvcnMgZm9yIHRoZSBtYWNybyBoaXN0b3J5IHRhYmxlLiBDdXJyZW50bHkgZGVmaW5lZCBtYWNyb3MgaGF2ZQorICAvLy8gSWRlbnRpZmllckluZm86Omhhc01hY3JvRGVmaW5pdGlvbigpIHNldCBhbmQgYW4gZW1wdHkKKyAgLy8vIE1hY3JvSW5mbzo6Z2V0VW5kZWZMb2MoKSBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4KKyAgdXNpbmcgbWFjcm9faXRlcmF0b3IgPSBNYWNyb01hcDo6Y29uc3RfaXRlcmF0b3I7CisKKyAgbWFjcm9faXRlcmF0b3IgbWFjcm9fYmVnaW4oYm9vbCBJbmNsdWRlRXh0ZXJuYWxNYWNyb3MgPSB0cnVlKSBjb25zdDsKKyAgbWFjcm9faXRlcmF0b3IgbWFjcm9fZW5kKGJvb2wgSW5jbHVkZUV4dGVybmFsTWFjcm9zID0gdHJ1ZSkgY29uc3Q7CisgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPG1hY3JvX2l0ZXJhdG9yPgorCisgIG1hY3Jvcyhib29sIEluY2x1ZGVFeHRlcm5hbE1hY3JvcyA9IHRydWUpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZV9yYW5nZShtYWNyb19iZWdpbihJbmNsdWRlRXh0ZXJuYWxNYWNyb3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvX2VuZChJbmNsdWRlRXh0ZXJuYWxNYWNyb3MpKTsKKyAgfQorICAvLy8gXH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgbWFjcm8gZGVmaW5lZCBiZWZvcmUgXHAgTG9jIHRoYXQgaGFzCisgIC8vLyBzcGVsbGluZyBccCBUb2tlbnMuICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWFjcm9zIHdpdGggc2FtZSBzcGVsbGluZywKKyAgLy8vIHJldHVybiB0aGUgbGFzdCBvbmUgZGVmaW5lZC4KKyAgU3RyaW5nUmVmIGdldExhc3RNYWNyb1dpdGhTcGVsbGluZyhTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VG9rZW5WYWx1ZT4gVG9rZW5zKSBjb25zdDsKKworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0UHJlZGVmaW5lcygpIGNvbnN0IHsgcmV0dXJuIFByZWRlZmluZXM7IH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgcHJlZGVmaW5lcyBmb3IgdGhpcyBQcmVwcm9jZXNzb3IuCisgIC8vLworICAvLy8gVGhlc2UgcHJlZGVmaW5lcyBhcmUgYXV0b21hdGljYWxseSBpbmplY3RlZCB3aGVuIHBhcnNpbmcgdGhlIG1haW4gZmlsZS4KKyAgdm9pZCBzZXRQcmVkZWZpbmVzKGNvbnN0IGNoYXIgKlApIHsgUHJlZGVmaW5lcyA9IFA7IH0KKyAgdm9pZCBzZXRQcmVkZWZpbmVzKFN0cmluZ1JlZiBQKSB7IFByZWRlZmluZXMgPSBQOyB9CisKKyAgLy8vIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3BlY2lmaWVkIHByZXByb2Nlc3NvcgorICAvLy8gaWRlbnRpZmllciB0b2tlbi4KKyAgSWRlbnRpZmllckluZm8gKmdldElkZW50aWZpZXJJbmZvKFN0cmluZ1JlZiBOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuICZJZGVudGlmaWVycy5nZXQoTmFtZSk7CisgIH0KKworICAvLy8gXGJyaWVmIEFkZCB0aGUgc3BlY2lmaWVkIHByYWdtYSBoYW5kbGVyIHRvIHRoaXMgcHJlcHJvY2Vzc29yLgorICAvLy8KKyAgLy8vIElmIFxwIE5hbWVzcGFjZSBpcyBub24tbnVsbCwgdGhlbiBpdCBpcyBhIHRva2VuIHJlcXVpcmVkIHRvIGV4aXN0IG9uIHRoZQorICAvLy8gcHJhZ21hIGxpbmUgYmVmb3JlIHRoZSBwcmFnbWEgc3RyaW5nIHN0YXJ0cywgZS5nLiAiU1REQyIgb3IgIkdDQyIuCisgIHZvaWQgQWRkUHJhZ21hSGFuZGxlcihTdHJpbmdSZWYgTmFtZXNwYWNlLCBQcmFnbWFIYW5kbGVyICpIYW5kbGVyKTsKKyAgdm9pZCBBZGRQcmFnbWFIYW5kbGVyKFByYWdtYUhhbmRsZXIgKkhhbmRsZXIpIHsKKyAgICBBZGRQcmFnbWFIYW5kbGVyKFN0cmluZ1JlZigpLCBIYW5kbGVyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVtb3ZlIHRoZSBzcGVjaWZpYyBwcmFnbWEgaGFuZGxlciBmcm9tIHRoaXMgcHJlcHJvY2Vzc29yLgorICAvLy8KKyAgLy8vIElmIFxwIE5hbWVzcGFjZSBpcyBub24tbnVsbCwgdGhlbiBpdCBzaG91bGQgYmUgdGhlIG5hbWVzcGFjZSB0aGF0CisgIC8vLyBccCBIYW5kbGVyIHdhcyBhZGRlZCB0by4gSXQgaXMgYW4gZXJyb3IgdG8gcmVtb3ZlIGEgaGFuZGxlciB0aGF0CisgIC8vLyBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZC4KKyAgdm9pZCBSZW1vdmVQcmFnbWFIYW5kbGVyKFN0cmluZ1JlZiBOYW1lc3BhY2UsIFByYWdtYUhhbmRsZXIgKkhhbmRsZXIpOworICB2b2lkIFJlbW92ZVByYWdtYUhhbmRsZXIoUHJhZ21hSGFuZGxlciAqSGFuZGxlcikgeworICAgIFJlbW92ZVByYWdtYUhhbmRsZXIoU3RyaW5nUmVmKCksIEhhbmRsZXIpOworICB9CisKKyAgLy8vIEluc3RhbGwgZW1wdHkgaGFuZGxlcnMgZm9yIGFsbCBwcmFnbWFzIChtYWtpbmcgdGhlbSBpZ25vcmVkKS4KKyAgdm9pZCBJZ25vcmVQcmFnbWFzKCk7CisKKyAgLy8vIFxicmllZiBBZGQgdGhlIHNwZWNpZmllZCBjb21tZW50IGhhbmRsZXIgdG8gdGhlIHByZXByb2Nlc3Nvci4KKyAgdm9pZCBhZGRDb21tZW50SGFuZGxlcihDb21tZW50SGFuZGxlciAqSGFuZGxlcik7CisKKyAgLy8vIFxicmllZiBSZW1vdmUgdGhlIHNwZWNpZmllZCBjb21tZW50IGhhbmRsZXIuCisgIC8vLworICAvLy8gSXQgaXMgYW4gZXJyb3IgdG8gcmVtb3ZlIGEgaGFuZGxlciB0aGF0IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkLgorICB2b2lkIHJlbW92ZUNvbW1lbnRIYW5kbGVyKENvbW1lbnRIYW5kbGVyICpIYW5kbGVyKTsKKworICAvLy8gXGJyaWVmIFNldCB0aGUgY29kZSBjb21wbGV0aW9uIGhhbmRsZXIgdG8gdGhlIGdpdmVuIG9iamVjdC4KKyAgdm9pZCBzZXRDb2RlQ29tcGxldGlvbkhhbmRsZXIoQ29kZUNvbXBsZXRpb25IYW5kbGVyICZIYW5kbGVyKSB7CisgICAgQ29kZUNvbXBsZXRlID0gJkhhbmRsZXI7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBjdXJyZW50IGNvZGUtY29tcGxldGlvbiBoYW5kbGVyLgorICBDb2RlQ29tcGxldGlvbkhhbmRsZXIgKmdldENvZGVDb21wbGV0aW9uSGFuZGxlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29kZUNvbXBsZXRlOworICB9CisKKyAgLy8vIFxicmllZiBDbGVhciBvdXQgdGhlIGNvZGUgY29tcGxldGlvbiBoYW5kbGVyLgorICB2b2lkIGNsZWFyQ29kZUNvbXBsZXRpb25IYW5kbGVyKCkgeworICAgIENvZGVDb21wbGV0ZSA9IG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIEhvb2sgdXNlZCBieSB0aGUgbGV4ZXIgdG8gaW52b2tlIHRoZSAibmF0dXJhbCBsYW5ndWFnZSIgY29kZQorICAvLy8gY29tcGxldGlvbiBwb2ludC4KKyAgdm9pZCBDb2RlQ29tcGxldGVOYXR1cmFsTGFuZ3VhZ2UoKTsKKworICAvLy8gXGJyaWVmIFNldCB0aGUgY29kZSBjb21wbGV0aW9uIHRva2VuIGZvciBmaWx0ZXJpbmcgcHVycG9zZXMuCisgIHZvaWQgc2V0Q29kZUNvbXBsZXRpb25JZGVudGlmaWVySW5mbyhJZGVudGlmaWVySW5mbyAqRmlsdGVyKSB7CisgICAgQ29kZUNvbXBsZXRpb25JSSA9IEZpbHRlcjsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBjb2RlIGNvbXBsZXRpb24gdG9rZW4gZm9yIGZpbHRlcmluZyBwdXJwb3Nlcy4KKyAgU3RyaW5nUmVmIGdldENvZGVDb21wbGV0aW9uRmlsdGVyKCkgeworICAgIGlmIChDb2RlQ29tcGxldGlvbklJKQorICAgICAgcmV0dXJuIENvZGVDb21wbGV0aW9uSUktPmdldE5hbWUoKTsKKyAgICByZXR1cm4ge307CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBwcmVwcm9jZXNzaW5nIHJlY29yZCwgb3IgTlVMTCBpZiB0aGVyZSBpcyBubworICAvLy8gcHJlcHJvY2Vzc2luZyByZWNvcmQuCisgIFByZXByb2Nlc3NpbmdSZWNvcmQgKmdldFByZXByb2Nlc3NpbmdSZWNvcmQoKSBjb25zdCB7IHJldHVybiBSZWNvcmQ7IH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyBwcmVwcm9jZXNzaW5nIHJlY29yZCwgd2hpY2ggd2lsbCBrZWVwIHRyYWNrIG9mCisgIC8vLyBhbGwgbWFjcm8gZXhwYW5zaW9ucywgbWFjcm8gZGVmaW5pdGlvbnMsIGV0Yy4KKyAgdm9pZCBjcmVhdGVQcmVwcm9jZXNzaW5nUmVjb3JkKCk7CisKKyAgLy8vIFxicmllZiBFbnRlciB0aGUgc3BlY2lmaWVkIEZpbGVJRCBhcyB0aGUgbWFpbiBzb3VyY2UgZmlsZSwKKyAgLy8vIHdoaWNoIGltcGxpY2l0bHkgYWRkcyB0aGUgYnVpbHRpbiBkZWZpbmVzIGV0Yy4KKyAgdm9pZCBFbnRlck1haW5Tb3VyY2VGaWxlKCk7CisKKyAgLy8vIFxicmllZiBJbmZvcm0gdGhlIHByZXByb2Nlc3NvciBjYWxsYmFja3MgdGhhdCBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlLgorICB2b2lkIEVuZFNvdXJjZUZpbGUoKTsKKworICAvLy8gXGJyaWVmIEFkZCBhIHNvdXJjZSBmaWxlIHRvIHRoZSB0b3Agb2YgdGhlIGluY2x1ZGUgc3RhY2sgYW5kCisgIC8vLyBzdGFydCBsZXhpbmcgdG9rZW5zIGZyb20gaXQgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBidWZmZXIuCisgIC8vLworICAvLy8gRW1pdHMgYSBkaWFnbm9zdGljLCBkb2Vzbid0IGVudGVyIHRoZSBmaWxlLCBhbmQgcmV0dXJucyB0cnVlIG9uIGVycm9yLgorICBib29sIEVudGVyU291cmNlRmlsZShGaWxlSUQgQ3VyRmlsZUlELCBjb25zdCBEaXJlY3RvcnlMb29rdXAgKkRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKTsKKworICAvLy8gXGJyaWVmIEFkZCBhIE1hY3JvIHRvIHRoZSB0b3Agb2YgdGhlIGluY2x1ZGUgc3RhY2sgYW5kIHN0YXJ0IGxleGluZworICAvLy8gdG9rZW5zIGZyb20gaXQgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBidWZmZXIuCisgIC8vLworICAvLy8gXHBhcmFtIEFyZ3Mgc3BlY2lmaWVzIHRoZSB0b2tlbnMgaW5wdXQgdG8gYSBmdW5jdGlvbi1saWtlIG1hY3JvLgorICAvLy8gXHBhcmFtIElMRW5kIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlICcpJyBmb3IgYSBmdW5jdGlvbi1saWtlIG1hY3JvCisgIC8vLyBvciB0aGUgaWRlbnRpZmllciBmb3IgYW4gb2JqZWN0LWxpa2UgbWFjcm8uCisgIHZvaWQgRW50ZXJNYWNybyhUb2tlbiAmSWRlbnRpZmllciwgU291cmNlTG9jYXRpb24gSUxFbmQsIE1hY3JvSW5mbyAqTWFjcm8sCisgICAgICAgICAgICAgICAgICBNYWNyb0FyZ3MgKkFyZ3MpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgIm1hY3JvIiBjb250ZXh0IHRvIHRoZSB0b3Agb2YgdGhlIGluY2x1ZGUgc3RhY2ssCisgIC8vLyB3aGljaCB3aWxsIGNhdXNlIHRoZSBsZXhlciB0byBzdGFydCByZXR1cm5pbmcgdGhlIHNwZWNpZmllZCB0b2tlbnMuCisgIC8vLworICAvLy8gSWYgXHAgRGlzYWJsZU1hY3JvRXhwYW5zaW9uIGlzIHRydWUsIHRva2VucyBsZXhlZCBmcm9tIHRoZSB0b2tlbiBzdHJlYW0KKyAgLy8vIHdpbGwgbm90IGJlIHN1YmplY3QgdG8gZnVydGhlciBtYWNybyBleHBhbnNpb24uIE90aGVyd2lzZSwgdGhlc2UgdG9rZW5zCisgIC8vLyB3aWxsIGJlIHJlLW1hY3JvLWV4cGFuZGVkIHdoZW4vaWYgZXhwYW5zaW9uIGlzIGVuYWJsZWQuCisgIC8vLworICAvLy8gSWYgXHAgT3duc1Rva2VucyBpcyBmYWxzZSwgdGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBzcGVjaWZpZWQgc3RyZWFtCisgIC8vLyBvZiB0b2tlbnMgaGFzIGEgcGVybWFuZW50IG93bmVyIHNvbWV3aGVyZSwgc28gdGhleSBkbyBub3QgbmVlZCB0byBiZQorICAvLy8gY29waWVkLiBJZiBpdCBpcyB0cnVlLCBpdCBhc3N1bWVzIHRoZSBhcnJheSBvZiB0b2tlbnMgaXMgYWxsb2NhdGVkIHdpdGgKKyAgLy8vIFxjIG5ld1tdIGFuZCB0aGUgUHJlcHJvY2Vzc29yIHdpbGwgZGVsZXRlW10gaXQuCitwcml2YXRlOgorICB2b2lkIEVudGVyVG9rZW5TdHJlYW0oY29uc3QgVG9rZW4gKlRva3MsIHVuc2lnbmVkIE51bVRva3MsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpc2FibGVNYWNyb0V4cGFuc2lvbiwgYm9vbCBPd25zVG9rZW5zKTsKKworcHVibGljOgorICB2b2lkIEVudGVyVG9rZW5TdHJlYW0oc3RkOjp1bmlxdWVfcHRyPFRva2VuW10+IFRva3MsIHVuc2lnbmVkIE51bVRva3MsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpc2FibGVNYWNyb0V4cGFuc2lvbikgeworICAgIEVudGVyVG9rZW5TdHJlYW0oVG9rcy5yZWxlYXNlKCksIE51bVRva3MsIERpc2FibGVNYWNyb0V4cGFuc2lvbiwgdHJ1ZSk7CisgIH0KKworICB2b2lkIEVudGVyVG9rZW5TdHJlYW0oQXJyYXlSZWY8VG9rZW4+IFRva3MsIGJvb2wgRGlzYWJsZU1hY3JvRXhwYW5zaW9uKSB7CisgICAgRW50ZXJUb2tlblN0cmVhbShUb2tzLmRhdGEoKSwgVG9rcy5zaXplKCksIERpc2FibGVNYWNyb0V4cGFuc2lvbiwgZmFsc2UpOworICB9CisKKyAgLy8vIFxicmllZiBQb3AgdGhlIGN1cnJlbnQgbGV4ZXIvbWFjcm8gZXhwIG9mZiB0aGUgdG9wIG9mIHRoZSBsZXhlciBzdGFjay4KKyAgLy8vCisgIC8vLyBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKKyAgLy8vIHRvcC1vZi1zdGFjayBsZXhlciBpcyBrbm93bi4KKyAgdm9pZCBSZW1vdmVUb3BPZkxleGVyU3RhY2soKTsKKworICAvLy8gRnJvbSB0aGUgcG9pbnQgdGhhdCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGFuZCB1bnRpbAorICAvLy8gQ29tbWl0QmFja3RyYWNrZWRUb2tlbnMoKSBvciBCYWNrdHJhY2soKSBpcyBjYWxsZWQsIHRoZSBQcmVwcm9jZXNzb3IKKyAgLy8vIGtlZXBzIHRyYWNrIG9mIHRoZSBsZXhlZCB0b2tlbnMgc28gdGhhdCBhIHN1YnNlcXVlbnQgQmFja3RyYWNrKCkgY2FsbCB3aWxsCisgIC8vLyBtYWtlIHRoZSBQcmVwcm9jZXNzb3IgcmUtbGV4IHRoZSBzYW1lIHRva2Vucy4KKyAgLy8vCisgIC8vLyBOZXN0ZWQgYmFja3RyYWNrcyBhcmUgYWxsb3dlZCwgbWVhbmluZyB0aGF0IEVuYWJsZUJhY2t0cmFja0F0VGhpc1BvcyBjYW4KKyAgLy8vIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhbmQgQ29tbWl0QmFja3RyYWNrZWRUb2tlbnMvQmFja3RyYWNrIGNhbGxzIHdpbGwKKyAgLy8vIGJlIGNvbWJpbmVkIHdpdGggdGhlIEVuYWJsZUJhY2t0cmFja0F0VGhpc1BvcyBjYWxscyBpbiByZXZlcnNlIG9yZGVyLgorICAvLy8KKyAgLy8vIE5PVEU6ICpETyBOT1QqIGZvcmdldCB0byBjYWxsIGVpdGhlciBDb21taXRCYWNrdHJhY2tlZFRva2VucyBvciBCYWNrdHJhY2sKKyAgLy8vIGF0IHNvbWUgcG9pbnQgYWZ0ZXIgRW5hYmxlQmFja3RyYWNrQXRUaGlzUG9zLiBJZiB5b3UgZG9uJ3QsIGNhY2hpbmcgb2YKKyAgLy8vIHRva2VucyB3aWxsIGNvbnRpbnVlIGluZGVmaW5pdGVseS4KKyAgLy8vCisgIHZvaWQgRW5hYmxlQmFja3RyYWNrQXRUaGlzUG9zKCk7CisKKyAgLy8vIFxicmllZiBEaXNhYmxlIHRoZSBsYXN0IEVuYWJsZUJhY2t0cmFja0F0VGhpc1BvcyBjYWxsLgorICB2b2lkIENvbW1pdEJhY2t0cmFja2VkVG9rZW5zKCk7CisKKyAgc3RydWN0IENhY2hlZFRva2Vuc1JhbmdlIHsKKyAgICBDYWNoZWRUb2tlbnNUeTo6c2l6ZV90eXBlIEJlZ2luLCBFbmQ7CisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgQSByYW5nZSBvZiBjYWNoZWQgdG9rZW5zIHRoYXQgc2hvdWxkIGJlIGVyYXNlZCBhZnRlciBsZXhpbmcKKyAgLy8vIHdoZW4gYmFja3RyYWNraW5nIHJlcXVpcmVzIHRoZSBlcmFzdXJlIG9mIHN1Y2ggY2FjaGVkIHRva2Vucy4KKyAgT3B0aW9uYWw8Q2FjaGVkVG9rZW5zUmFuZ2U+IENhY2hlZFRva2VuUmFuZ2VUb0VyYXNlOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgcmFuZ2Ugb2YgY2FjaGVkIHRva2VucyB0aGF0IHdlcmUgbGV4ZWQgc2luY2UKKyAgLy8vIEVuYWJsZUJhY2t0cmFja0F0VGhpc1BvcygpIHdhcyBwcmV2aW91c2x5IGNhbGxlZC4KKyAgQ2FjaGVkVG9rZW5zUmFuZ2UgTGFzdENhY2hlZFRva2VuUmFuZ2UoKTsKKworICAvLy8gXGJyaWVmIEVyYXNlIHRoZSByYW5nZSBvZiBjYWNoZWQgdG9rZW5zIHRoYXQgd2VyZSBsZXhlZCBzaW5jZQorICAvLy8gRW5hYmxlQmFja3RyYWNrQXRUaGlzUG9zKCkgd2FzIHByZXZpb3VzbHkgY2FsbGVkLgorICB2b2lkIEVyYXNlQ2FjaGVkVG9rZW5zKENhY2hlZFRva2Vuc1JhbmdlIFRva2VuUmFuZ2UpOworCisgIC8vLyBcYnJpZWYgTWFrZSBQcmVwcm9jZXNzb3IgcmUtbGV4IHRoZSB0b2tlbnMgdGhhdCB3ZXJlIGxleGVkIHNpbmNlCisgIC8vLyBFbmFibGVCYWNrdHJhY2tBdFRoaXNQb3MoKSB3YXMgcHJldmlvdXNseSBjYWxsZWQuCisgIHZvaWQgQmFja3RyYWNrKCk7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIEVuYWJsZUJhY2t0cmFja0F0VGhpc1BvcygpIHdhcyBjYWxsZWQgYW5kCisgIC8vLyBjYWNoaW5nIG9mIHRva2VucyBpcyBvbi4KKyAgYm9vbCBpc0JhY2t0cmFja0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiAhQmFja3RyYWNrUG9zaXRpb25zLmVtcHR5KCk7IH0KKworICAvLy8gXGJyaWVmIExleCB0aGUgbmV4dCB0b2tlbiBmb3IgdGhpcyBwcmVwcm9jZXNzb3IuCisgIHZvaWQgTGV4KFRva2VuICZSZXN1bHQpOworCisgIHZvaWQgTGV4QWZ0ZXJNb2R1bGVJbXBvcnQoVG9rZW4gJlJlc3VsdCk7CisKKyAgdm9pZCBtYWtlTW9kdWxlVmlzaWJsZShNb2R1bGUgKk0sIFNvdXJjZUxvY2F0aW9uIExvYyk7CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TW9kdWxlSW1wb3J0TG9jKE1vZHVsZSAqTSkgY29uc3QgeworICAgIHJldHVybiBDdXJTdWJtb2R1bGVTdGF0ZS0+VmlzaWJsZU1vZHVsZXMuZ2V0SW1wb3J0TG9jKE0pOworICB9CisKKyAgLy8vIFxicmllZiBMZXggYSBzdHJpbmcgbGl0ZXJhbCwgd2hpY2ggbWF5IGJlIHRoZSBjb25jYXRlbmF0aW9uIG9mIG11bHRpcGxlCisgIC8vLyBzdHJpbmcgbGl0ZXJhbHMgYW5kIG1heSBldmVuIGNvbWUgZnJvbSBtYWNybyBleHBhbnNpb24uCisgIC8vLyBccmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGEgZXJyb3IgZGlhZ25vc3RpYyBoYXMgYmVlbiBnZW5lcmF0ZWQuCisgIGJvb2wgTGV4U3RyaW5nTGl0ZXJhbChUb2tlbiAmUmVzdWx0LCBzdGQ6OnN0cmluZyAmU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqRGlhZ25vc3RpY1RhZywgYm9vbCBBbGxvd01hY3JvRXhwYW5zaW9uKSB7CisgICAgaWYgKEFsbG93TWFjcm9FeHBhbnNpb24pCisgICAgICBMZXgoUmVzdWx0KTsKKyAgICBlbHNlCisgICAgICBMZXhVbmV4cGFuZGVkVG9rZW4oUmVzdWx0KTsKKyAgICByZXR1cm4gRmluaXNoTGV4U3RyaW5nTGl0ZXJhbChSZXN1bHQsIFN0cmluZywgRGlhZ25vc3RpY1RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvd01hY3JvRXhwYW5zaW9uKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29tcGxldGUgdGhlIGxleGluZyBvZiBhIHN0cmluZyBsaXRlcmFsIHdoZXJlIHRoZSBmaXJzdCB0b2tlbiBoYXMKKyAgLy8vIGFscmVhZHkgYmVlbiBsZXhlZCAoc2VlIExleFN0cmluZ0xpdGVyYWwpLgorICBib29sIEZpbmlzaExleFN0cmluZ0xpdGVyYWwoVG9rZW4gJlJlc3VsdCwgc3RkOjpzdHJpbmcgJlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkRpYWdub3N0aWNUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93TWFjcm9FeHBhbnNpb24pOworCisgIC8vLyBcYnJpZWYgTGV4IGEgdG9rZW4uICBJZiBpdCdzIGEgY29tbWVudCwga2VlcCBsZXhpbmcgdW50aWwgd2UgZ2V0CisgIC8vLyBzb21ldGhpbmcgbm90IGEgY29tbWVudC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWZ1bCBpbiAtRSAtQyBtb2RlIHdoZXJlIGNvbW1lbnRzIHdvdWxkIGZvdWwgdXAgcHJlcHJvY2Vzc29yCisgIC8vLyBkaXJlY3RpdmUgaGFuZGxpbmcuCisgIHZvaWQgTGV4Tm9uQ29tbWVudChUb2tlbiAmUmVzdWx0KSB7CisgICAgZG8KKyAgICAgIExleChSZXN1bHQpOworICAgIHdoaWxlIChSZXN1bHQuZ2V0S2luZCgpID09IHRvazo6Y29tbWVudCk7CisgIH0KKworICAvLy8gXGJyaWVmIEp1c3QgbGlrZSBMZXgsIGJ1dCBkaXNhYmxlcyBtYWNybyBleHBhbnNpb24gb2YgaWRlbnRpZmllciB0b2tlbnMuCisgIHZvaWQgTGV4VW5leHBhbmRlZFRva2VuKFRva2VuICZSZXN1bHQpIHsKKyAgICAvLyBEaXNhYmxlIG1hY3JvIGV4cGFuc2lvbi4KKyAgICBib29sIE9sZFZhbCA9IERpc2FibGVNYWNyb0V4cGFuc2lvbjsKKyAgICBEaXNhYmxlTWFjcm9FeHBhbnNpb24gPSB0cnVlOworICAgIC8vIExleCB0aGUgdG9rZW4uCisgICAgTGV4KFJlc3VsdCk7CisKKyAgICAvLyBSZWVuYWJsZSBpdC4KKyAgICBEaXNhYmxlTWFjcm9FeHBhbnNpb24gPSBPbGRWYWw7CisgIH0KKworICAvLy8gXGJyaWVmIExpa2UgTGV4Tm9uQ29tbWVudCwgYnV0IHRoaXMgZGlzYWJsZXMgbWFjcm8gZXhwYW5zaW9uIG9mCisgIC8vLyBpZGVudGlmaWVyIHRva2Vucy4KKyAgdm9pZCBMZXhVbmV4cGFuZGVkTm9uQ29tbWVudChUb2tlbiAmUmVzdWx0KSB7CisgICAgZG8KKyAgICAgIExleFVuZXhwYW5kZWRUb2tlbihSZXN1bHQpOworICAgIHdoaWxlIChSZXN1bHQuZ2V0S2luZCgpID09IHRvazo6Y29tbWVudCk7CisgIH0KKworICAvLy8gXGJyaWVmIFBhcnNlcyBhIHNpbXBsZSBpbnRlZ2VyIGxpdGVyYWwgdG8gZ2V0IGl0cyBudW1lcmljIHZhbHVlLiAgRmxvYXRpbmcKKyAgLy8vIHBvaW50IGxpdGVyYWxzIGFuZCB1c2VyIGRlZmluZWQgbGl0ZXJhbHMgYXJlIHJlamVjdGVkLiAgVXNlZCBwcmltYXJpbHkgdG8KKyAgLy8vIGhhbmRsZSBwcmFnbWFzIHRoYXQgYWNjZXB0IGludGVnZXIgYXJndW1lbnRzLgorICBib29sIHBhcnNlU2ltcGxlSW50ZWdlckxpdGVyYWwoVG9rZW4gJlRvaywgdWludDY0X3QgJlZhbHVlKTsKKworICAvLy8gRGlzYWJsZXMgbWFjcm8gZXhwYW5zaW9uIGV2ZXJ5d2hlcmUgZXhjZXB0IGZvciBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcy4KKyAgdm9pZCBTZXRNYWNyb0V4cGFuc2lvbk9ubHlJbkRpcmVjdGl2ZXMoKSB7CisgICAgRGlzYWJsZU1hY3JvRXhwYW5zaW9uID0gdHJ1ZTsKKyAgICBNYWNyb0V4cGFuc2lvbkluRGlyZWN0aXZlc092ZXJyaWRlID0gdHJ1ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUGVla3MgYWhlYWQgTiB0b2tlbnMgYW5kIHJldHVybnMgdGhhdCB0b2tlbiB3aXRob3V0IGNvbnN1bWluZyBhbnkKKyAgLy8vIHRva2Vucy4KKyAgLy8vCisgIC8vLyBMb29rQWhlYWQoMCkgcmV0dXJucyB0aGUgbmV4dCB0b2tlbiB0aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5IExleCgpLAorICAvLy8gTG9va0FoZWFkKDEpIHJldHVybnMgdGhlIHRva2VuIGFmdGVyIGl0LCBldGMuICBUaGlzIHJldHVybnMgbm9ybWFsCisgIC8vLyB0b2tlbnMgYWZ0ZXIgcGhhc2UgNS4gIEFzIHN1Y2gsIGl0IGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcKKyAgLy8vICdMZXgnLCBub3QgJ0xleFVuZXhwYW5kZWRUb2tlbicuCisgIGNvbnN0IFRva2VuICZMb29rQWhlYWQodW5zaWduZWQgTikgeworICAgIGlmIChDYWNoZWRMZXhQb3MgKyBOIDwgQ2FjaGVkVG9rZW5zLnNpemUoKSkKKyAgICAgIHJldHVybiBDYWNoZWRUb2tlbnNbQ2FjaGVkTGV4UG9zK05dOworICAgIGVsc2UKKyAgICAgIHJldHVybiBQZWVrQWhlYWQoTisxKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgV2hlbiBiYWNrdHJhY2tpbmcgaXMgZW5hYmxlZCBhbmQgdG9rZW5zIGFyZSBjYWNoZWQsCisgIC8vLyB0aGlzIGFsbG93cyB0byByZXZlcnQgYSBzcGVjaWZpYyBudW1iZXIgb2YgdG9rZW5zLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIHRva2VucyBiZWluZyByZXZlcnRlZCBzaG91bGQgYmUgdXAgdG8gdGhlIGxhc3QKKyAgLy8vIGJhY2t0cmFjayBwb3NpdGlvbiwgbm90IG1vcmUuCisgIHZvaWQgUmV2ZXJ0Q2FjaGVkVG9rZW5zKHVuc2lnbmVkIE4pIHsKKyAgICBhc3NlcnQoaXNCYWNrdHJhY2tFbmFibGVkKCkgJiYKKyAgICAgICAgICAgIlNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRva2VucyBhcmUgY2FjaGVkIGZvciBiYWNrdHJhY2tpbmciKTsKKyAgICBhc3NlcnQoc2lnbmVkKENhY2hlZExleFBvcykgLSBzaWduZWQoTikgPj0gc2lnbmVkKEJhY2t0cmFja1Bvc2l0aW9ucy5iYWNrKCkpCisgICAgICAgICAmJiAiU2hvdWxkIHJldmVydCB0b2tlbnMgdXAgdG8gdGhlIGxhc3QgYmFja3RyYWNrIHBvc2l0aW9uLCBub3QgbW9yZSIpOworICAgIGFzc2VydChzaWduZWQoQ2FjaGVkTGV4UG9zKSAtIHNpZ25lZChOKSA+PSAwICYmCisgICAgICAgICAgICJDb3JydXB0ZWQgYmFja3RyYWNrIHBvc2l0aW9ucyA/Iik7CisgICAgQ2FjaGVkTGV4UG9zIC09IE47CisgIH0KKworICAvLy8gXGJyaWVmIEVudGVycyBhIHRva2VuIGluIHRoZSB0b2tlbiBzdHJlYW0gdG8gYmUgbGV4ZWQgbmV4dC4KKyAgLy8vCisgIC8vLyBJZiBCYWNrVHJhY2soKSBpcyBjYWxsZWQgYWZ0ZXJ3YXJkcywgdGhlIHRva2VuIHdpbGwgcmVtYWluIGF0IHRoZQorICAvLy8gaW5zZXJ0aW9uIHBvaW50LgorICB2b2lkIEVudGVyVG9rZW4oY29uc3QgVG9rZW4gJlRvaykgeworICAgIEVudGVyQ2FjaGluZ0xleE1vZGUoKTsKKyAgICBDYWNoZWRUb2tlbnMuaW5zZXJ0KENhY2hlZFRva2Vucy5iZWdpbigpK0NhY2hlZExleFBvcywgVG9rKTsKKyAgfQorCisgIC8vLyBXZSBub3RpZnkgdGhlIFByZXByb2Nlc3NvciB0aGF0IGlmIGl0IGlzIGNhY2hpbmcgdG9rZW5zIChiZWNhdXNlCisgIC8vLyBiYWNrdHJhY2sgaXMgZW5hYmxlZCkgaXQgc2hvdWxkIHJlcGxhY2UgdGhlIG1vc3QgcmVjZW50IGNhY2hlZCB0b2tlbnMKKyAgLy8vIHdpdGggdGhlIGdpdmVuIGFubm90YXRpb24gdG9rZW4uIFRoaXMgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCBpZgorICAvLy8gYmFja3RyYWNraW5nIGlzIG5vdCBlbmFibGVkLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMganVzdCBmb3Igb3B0aW1pemF0aW9uLCBzbyB0aGF0IHRoZQorICAvLy8gY2FjaGVkIHRva2VucyBkb2Vzbid0IGdldCByZS1wYXJzZWQgYW5kIHJlLXJlc29sdmVkIGFmdGVyIGEgYmFja3RyYWNrIGlzCisgIC8vLyBpbnZva2VkLgorICB2b2lkIEFubm90YXRlQ2FjaGVkVG9rZW5zKGNvbnN0IFRva2VuICZUb2spIHsKKyAgICBhc3NlcnQoVG9rLmlzQW5ub3RhdGlvbigpICYmICJFeHBlY3RlZCBhbm5vdGF0aW9uIHRva2VuIik7CisgICAgaWYgKENhY2hlZExleFBvcyAhPSAwICYmIGlzQmFja3RyYWNrRW5hYmxlZCgpKQorICAgICAgQW5ub3RhdGVQcmV2aW91c0NhY2hlZFRva2VucyhUb2spOworICB9CisKKyAgLy8vIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgY2FjaGVkIHRva2VuLCBzdWl0YWJsZSBmb3Igc2V0dGluZyB0aGUgZW5kCisgIC8vLyBsb2NhdGlvbiBvZiBhbiBhbm5vdGF0aW9uIHRva2VuLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMYXN0Q2FjaGVkVG9rZW5Mb2NhdGlvbigpIGNvbnN0IHsKKyAgICBhc3NlcnQoQ2FjaGVkTGV4UG9zICE9IDApOworICAgIHJldHVybiBDYWNoZWRUb2tlbnNbQ2FjaGVkTGV4UG9zLTFdLmdldExhc3RMb2MoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciBccCBUb2sgaXMgdGhlIG1vc3QgcmVjZW50IHRva2VuIChgQ2FjaGVkTGV4UG9zIC0gMWApIGluCisgIC8vLyBDYWNoZWRUb2tlbnMuCisgIGJvb2wgSXNQcmV2aW91c0NhY2hlZFRva2VuKGNvbnN0IFRva2VuICZUb2spIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmVwbGFjZSB0b2tlbiBpbiBgQ2FjaGVkTGV4UG9zIC0gMWAgaW4gQ2FjaGVkVG9rZW5zIGJ5IHRoZSB0b2tlbnMKKyAgLy8vIGluIFxwIE5ld1Rva3MuCisgIC8vLworICAvLy8gVXNlZnVsIHdoZW4gYSB0b2tlbiBuZWVkcyB0byBiZSBzcGxpdCBpbiBzbWFsbGVyIG9uZXMgYW5kIENhY2hlZFRva2VucworICAvLy8gbW9zdCByZWNlbnQgdG9rZW4gbXVzdCB0byBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhhdC4KKyAgdm9pZCBSZXBsYWNlUHJldmlvdXNDYWNoZWRUb2tlbihBcnJheVJlZjxUb2tlbj4gTmV3VG9rcyk7CisKKyAgLy8vIFxicmllZiBSZXBsYWNlIHRoZSBsYXN0IHRva2VuIHdpdGggYW4gYW5ub3RhdGlvbiB0b2tlbi4KKyAgLy8vCisgIC8vLyBMaWtlIEFubm90YXRlQ2FjaGVkVG9rZW5zKCksIHRoaXMgcm91dGluZSByZXBsYWNlcyBhbgorICAvLy8gYWxyZWFkeS1wYXJzZWQgKGFuZCByZXNvbHZlZCkgdG9rZW4gd2l0aCBhbiBhbm5vdGF0aW9uCisgIC8vLyB0b2tlbi4gSG93ZXZlciwgdGhpcyByb3V0aW5lIG9ubHkgcmVwbGFjZXMgdGhlIGxhc3QgdG9rZW4gd2l0aAorICAvLy8gdGhlIGFubm90YXRpb24gdG9rZW47IGl0IGRvZXMgbm90IGFmZmVjdCBhbnkgb3RoZXIgY2FjaGVkCisgIC8vLyB0b2tlbnMuIFRoaXMgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCBpZiBiYWNrdHJhY2tpbmcgaXMgbm90CisgIC8vLyBlbmFibGVkLgorICB2b2lkIFJlcGxhY2VMYXN0VG9rZW5XaXRoQW5ub3RhdGlvbihjb25zdCBUb2tlbiAmVG9rKSB7CisgICAgYXNzZXJ0KFRvay5pc0Fubm90YXRpb24oKSAmJiAiRXhwZWN0ZWQgYW5ub3RhdGlvbiB0b2tlbiIpOworICAgIGlmIChDYWNoZWRMZXhQb3MgIT0gMCAmJiBpc0JhY2t0cmFja0VuYWJsZWQoKSkKKyAgICAgIENhY2hlZFRva2Vuc1tDYWNoZWRMZXhQb3MtMV0gPSBUb2s7CisgIH0KKworICAvLy8gRW50ZXIgYW4gYW5ub3RhdGlvbiB0b2tlbiBpbnRvIHRoZSB0b2tlbiBzdHJlYW0uCisgIHZvaWQgRW50ZXJBbm5vdGF0aW9uVG9rZW4oU291cmNlUmFuZ2UgUmFuZ2UsIHRvazo6VG9rZW5LaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQW5ub3RhdGlvblZhbCk7CisKKyAgLy8vIFVwZGF0ZSB0aGUgY3VycmVudCB0b2tlbiB0byByZXByZXNlbnQgdGhlIHByb3ZpZGVkCisgIC8vLyBpZGVudGlmaWVyLCBpbiBvcmRlciB0byBjYWNoZSBhbiBhY3Rpb24gcGVyZm9ybWVkIGJ5IHR5cG8gY29ycmVjdGlvbi4KKyAgdm9pZCBUeXBvQ29ycmVjdFRva2VuKGNvbnN0IFRva2VuICZUb2spIHsKKyAgICBhc3NlcnQoVG9rLmdldElkZW50aWZpZXJJbmZvKCkgJiYgIkV4cGVjdGVkIGlkZW50aWZpZXIgdG9rZW4iKTsKKyAgICBpZiAoQ2FjaGVkTGV4UG9zICE9IDAgJiYgaXNCYWNrdHJhY2tFbmFibGVkKCkpCisgICAgICBDYWNoZWRUb2tlbnNbQ2FjaGVkTGV4UG9zLTFdID0gVG9rOworICB9CisKKyAgLy8vIFxicmllZiBSZWNvbXB1dGUgdGhlIGN1cnJlbnQgbGV4ZXIga2luZCBiYXNlZCBvbiB0aGUgQ3VyTGV4ZXIvQ3VyUFRITGV4ZXIvCisgIC8vLyBDdXJUb2tlbkxleGVyIHBvaW50ZXJzLgorICB2b2lkIHJlY29tcHV0ZUN1ckxleGVyS2luZCgpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIGluY3JlbWVudGFsIHByb2Nlc3NpbmcgaXMgZW5hYmxlZAorICBib29sIGlzSW5jcmVtZW50YWxQcm9jZXNzaW5nRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIEluY3JlbWVudGFsUHJvY2Vzc2luZzsgfQorCisgIC8vLyBcYnJpZWYgRW5hYmxlcyB0aGUgaW5jcmVtZW50YWwgcHJvY2Vzc2luZworICB2b2lkIGVuYWJsZUluY3JlbWVudGFsUHJvY2Vzc2luZyhib29sIHZhbHVlID0gdHJ1ZSkgeworICAgIEluY3JlbWVudGFsUHJvY2Vzc2luZyA9IHZhbHVlOworICB9CisgIAorICAvLy8gXGJyaWVmIFNwZWNpZnkgdGhlIHBvaW50IGF0IHdoaWNoIGNvZGUtY29tcGxldGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRmlsZSB0aGUgZmlsZSBpbiB3aGljaCBjb2RlIGNvbXBsZXRpb24gc2hvdWxkIG9jY3VyLiBJZgorICAvLy8gdGhpcyBmaWxlIGlzIGluY2x1ZGVkIG11bHRpcGxlIHRpbWVzLCBjb2RlLWNvbXBsZXRpb24gd2lsbAorICAvLy8gcGVyZm9ybSBjb21wbGV0aW9uIHRoZSBmaXJzdCB0aW1lIGl0IGlzIGluY2x1ZGVkLiBJZiBOVUxMLCB0aGlzCisgIC8vLyBmdW5jdGlvbiBjbGVhcnMgb3V0IHRoZSBjb2RlLWNvbXBsZXRpb24gcG9pbnQuCisgIC8vLworICAvLy8gXHBhcmFtIExpbmUgdGhlIGxpbmUgYXQgd2hpY2ggY29kZSBjb21wbGV0aW9uIHNob3VsZCBvY2N1cgorICAvLy8gKDEtYmFzZWQpLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb2x1bW4gdGhlIGNvbHVtbiBhdCB3aGljaCBjb2RlIGNvbXBsZXRpb24gc2hvdWxkIG9jY3VyCisgIC8vLyAoMS1iYXNlZCkuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIFNldENvZGVDb21wbGV0aW9uUG9pbnQoY29uc3QgRmlsZUVudHJ5ICpGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZSwgdW5zaWduZWQgQ29sdW1uKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSBpZiB3ZSBhcmUgcGVyZm9ybWluZyBjb2RlIGNvbXBsZXRpb24uCisgIGJvb2wgaXNDb2RlQ29tcGxldGlvbkVuYWJsZWQoKSBjb25zdCB7IHJldHVybiBDb2RlQ29tcGxldGlvbkZpbGUgIT0gbnVsbHB0cjsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIGNvZGUtY29tcGxldGlvbiBwb2ludC4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIGFuIGludmFsaWQgbG9jYXRpb24gaWYgY29kZS1jb21wbGV0aW9uIGlzIG5vdCBlbmFibGVkIG9yIHRoZSBmaWxlCisgIC8vLyBjb250YWluaW5nIHRoZSBjb2RlLWNvbXBsZXRpb24gcG9pbnQgaGFzIG5vdCBiZWVuIGxleGVkIHlldC4KKyAgU291cmNlTG9jYXRpb24gZ2V0Q29kZUNvbXBsZXRpb25Mb2MoKSBjb25zdCB7IHJldHVybiBDb2RlQ29tcGxldGlvbkxvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgc3RhcnQgbG9jYXRpb24gb2YgdGhlIGZpbGUgb2YgY29kZS1jb21wbGV0aW9uIHBvaW50LgorICAvLy8KKyAgLy8vIFJldHVybnMgYW4gaW52YWxpZCBsb2NhdGlvbiBpZiBjb2RlLWNvbXBsZXRpb24gaXMgbm90IGVuYWJsZWQgb3IgdGhlIGZpbGUKKyAgLy8vIGNvbnRhaW5pbmcgdGhlIGNvZGUtY29tcGxldGlvbiBwb2ludCBoYXMgbm90IGJlZW4gbGV4ZWQgeWV0LgorICBTb3VyY2VMb2NhdGlvbiBnZXRDb2RlQ29tcGxldGlvbkZpbGVMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIENvZGVDb21wbGV0aW9uRmlsZUxvYzsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIGNvZGUtY29tcGxldGlvbiBpcyBlbmFibGVkIGFuZCB3ZSBoYXZlIGhpdCB0aGUKKyAgLy8vIGNvZGUtY29tcGxldGlvbiBwb2ludC4KKyAgYm9vbCBpc0NvZGVDb21wbGV0aW9uUmVhY2hlZCgpIGNvbnN0IHsgcmV0dXJuIENvZGVDb21wbGV0aW9uUmVhY2hlZDsgfQorCisgIC8vLyBcYnJpZWYgTm90ZSB0aGF0IHdlIGhpdCB0aGUgY29kZS1jb21wbGV0aW9uIHBvaW50LgorICB2b2lkIHNldENvZGVDb21wbGV0aW9uUmVhY2hlZCgpIHsKKyAgICBhc3NlcnQoaXNDb2RlQ29tcGxldGlvbkVuYWJsZWQoKSAmJiAiQ29kZS1jb21wbGV0aW9uIG5vdCBlbmFibGVkISIpOworICAgIENvZGVDb21wbGV0aW9uUmVhY2hlZCA9IHRydWU7CisgICAgLy8gU2lsZW5jZSBhbnkgZGlhZ25vc3RpY3MgdGhhdCBvY2N1ciBhZnRlciB3ZSBoaXQgdGhlIGNvZGUtY29tcGxldGlvbi4KKyAgICBnZXREaWFnbm9zdGljcygpLnNldFN1cHByZXNzQWxsRGlhZ25vc3RpY3ModHJ1ZSk7CisgIH0KKworICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudGx5LWFjdGl2ZSBcI3ByYWdtYSBjbGFuZworICAvLy8gYXJjX2NmX2NvZGVfYXVkaXRlZCBiZWdpbi4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIGFuIGludmFsaWQgbG9jYXRpb24gaWYgdGhlcmUgaXMgbm8gc3VjaCBwcmFnbWEgYWN0aXZlLgorICBTb3VyY2VMb2NhdGlvbiBnZXRQcmFnbWFBUkNDRkNvZGVBdWRpdGVkTG9jKCkgY29uc3QgeworICAgIHJldHVybiBQcmFnbWFBUkNDRkNvZGVBdWRpdGVkTG9jOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50bHktYWN0aXZlIFwjcHJhZ21hIGNsYW5nCisgIC8vLyBhcmNfY2ZfY29kZV9hdWRpdGVkIGJlZ2luLiAgQW4gaW52YWxpZCBsb2NhdGlvbiBlbmRzIHRoZSBwcmFnbWEuCisgIHZvaWQgc2V0UHJhZ21hQVJDQ0ZDb2RlQXVkaXRlZExvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBQcmFnbWFBUkNDRkNvZGVBdWRpdGVkTG9jID0gTG9jOworICB9CisKKyAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnRseS1hY3RpdmUgXCNwcmFnbWEgY2xhbmcKKyAgLy8vIGFzc3VtZV9ub25udWxsIGJlZ2luLgorICAvLy8KKyAgLy8vIFJldHVybnMgYW4gaW52YWxpZCBsb2NhdGlvbiBpZiB0aGVyZSBpcyBubyBzdWNoIHByYWdtYSBhY3RpdmUuCisgIFNvdXJjZUxvY2F0aW9uIGdldFByYWdtYUFzc3VtZU5vbk51bGxMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIFByYWdtYUFzc3VtZU5vbk51bGxMb2M7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnRseS1hY3RpdmUgXCNwcmFnbWEgY2xhbmcKKyAgLy8vIGFzc3VtZV9ub25udWxsIGJlZ2luLiAgQW4gaW52YWxpZCBsb2NhdGlvbiBlbmRzIHRoZSBwcmFnbWEuCisgIHZvaWQgc2V0UHJhZ21hQXNzdW1lTm9uTnVsbExvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBQcmFnbWFBc3N1bWVOb25OdWxsTG9jID0gTG9jOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgbWFpbiBmaWxlIHNob3VsZCBiZSBjb25zaWRlcmVkCisgIC8vLyB0byBoYXZlIGJlZW4gZm91bmQsIGlmIGl0IGlzIG5vdCBhIHJlYWwgZmlsZS4KKyAgdm9pZCBzZXRNYWluRmlsZURpcihjb25zdCBEaXJlY3RvcnlFbnRyeSAqRGlyKSB7CisgICAgTWFpbkZpbGVEaXIgPSBEaXI7CisgIH0KKworICAvLy8gXGJyaWVmIEluc3RydWN0IHRoZSBwcmVwcm9jZXNzb3IgdG8gc2tpcCBwYXJ0IG9mIHRoZSBtYWluIHNvdXJjZSBmaWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBCeXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBwcmVhbWJsZSB0byBza2lwLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydE9mTGluZSBXaGV0aGVyIHNraXBwaW5nIHRoZXNlIGJ5dGVzIHB1dHMgdGhlIGxleGVyIGF0IHRoZQorICAvLy8gc3RhcnQgb2YgYSBsaW5lLgorICB2b2lkIHNldFNraXBNYWluRmlsZVByZWFtYmxlKHVuc2lnbmVkIEJ5dGVzLCBib29sIFN0YXJ0T2ZMaW5lKSB7CisgICAgU2tpcE1haW5GaWxlUHJlYW1ibGUuZmlyc3QgPSBCeXRlczsKKyAgICBTa2lwTWFpbkZpbGVQcmVhbWJsZS5zZWNvbmQgPSBTdGFydE9mTGluZTsKKyAgfQorCisgIC8vLyBGb3J3YXJkaW5nIGZ1bmN0aW9uIGZvciBkaWFnbm9zdGljcy4gIFRoaXMgZW1pdHMgYSBkaWFnbm9zdGljIGF0CisgIC8vLyB0aGUgc3BlY2lmaWVkIFRva2VuJ3MgbG9jYXRpb24sIHRyYW5zbGF0aW5nIHRoZSB0b2tlbidzIHN0YXJ0CisgIC8vLyBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBidWZmZXIgaW50byBhIFNvdXJjZVBvc2l0aW9uIG9iamVjdCBmb3IgcmVuZGVyaW5nLgorICBEaWFnbm9zdGljQnVpbGRlciBEaWFnKFNvdXJjZUxvY2F0aW9uIExvYywgdW5zaWduZWQgRGlhZ0lEKSBjb25zdCB7CisgICAgcmV0dXJuIERpYWdzLT5SZXBvcnQoTG9jLCBEaWFnSUQpOworICB9CisKKyAgRGlhZ25vc3RpY0J1aWxkZXIgRGlhZyhjb25zdCBUb2tlbiAmVG9rLCB1bnNpZ25lZCBEaWFnSUQpIGNvbnN0IHsKKyAgICByZXR1cm4gRGlhZ3MtPlJlcG9ydChUb2suZ2V0TG9jYXRpb24oKSwgRGlhZ0lEKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlICdzcGVsbGluZycgb2YgdGhlIHRva2VuIGF0IHRoZSBnaXZlbgorICAvLy8gbG9jYXRpb247IGRvZXMgbm90IGdvIHVwIHRvIHRoZSBzcGVsbGluZyBsb2NhdGlvbiBvciBkb3duIHRvIHRoZQorICAvLy8gZXhwYW5zaW9uIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBidWZmZXIgQSBidWZmZXIgd2hpY2ggd2lsbCBiZSB1c2VkIG9ubHkgaWYgdGhlIHRva2VuIHJlcXVpcmVzCisgIC8vLyAgICJjbGVhbmluZyIsIGUuZy4gaWYgaXQgY29udGFpbnMgdHJpZ3JhcGhzIG9yIGVzY2FwZWQgbmV3bGluZXMKKyAgLy8vIFxwYXJhbSBpbnZhbGlkIElmIG5vbi1udWxsLCB3aWxsIGJlIHNldCBcYyB0cnVlIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgU3RyaW5nUmVmIGdldFNwZWxsaW5nKFNvdXJjZUxvY2F0aW9uIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaW52YWxpZCA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gTGV4ZXI6OmdldFNwZWxsaW5nKGxvYywgYnVmZmVyLCBTb3VyY2VNZ3IsIExhbmdPcHRzLCBpbnZhbGlkKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSAnc3BlbGxpbmcnIG9mIHRoZSBUb2sgdG9rZW4uCisgIC8vLworICAvLy8gVGhlIHNwZWxsaW5nIG9mIGEgdG9rZW4gaXMgdGhlIGNoYXJhY3RlcnMgdXNlZCB0byByZXByZXNlbnQgdGhlIHRva2VuIGluCisgIC8vLyB0aGUgc291cmNlIGZpbGUgYWZ0ZXIgdHJpZ3JhcGggZXhwYW5zaW9uIGFuZCBlc2NhcGVkLW5ld2xpbmUgZm9sZGluZy4gIEluCisgIC8vLyBwYXJ0aWN1bGFyLCB0aGlzIHdhbnRzIHRvIGdldCB0aGUgdHJ1ZSwgdW5jYW5vbmljYWxpemVkLCBzcGVsbGluZyBvZgorICAvLy8gdGhpbmdzIGxpa2UgZGlncmFwaHMsIFVDTnMsIGV0Yy4KKyAgLy8vCisgIC8vLyBccGFyYW0gSW52YWxpZCBJZiBub24tbnVsbCwgd2lsbCBiZSBzZXQgXGMgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnMuCisgIHN0ZDo6c3RyaW5nIGdldFNwZWxsaW5nKGNvbnN0IFRva2VuICZUb2ssIGJvb2wgKkludmFsaWQgPSBudWxscHRyKSBjb25zdCB7CisgICAgcmV0dXJuIExleGVyOjpnZXRTcGVsbGluZyhUb2ssIFNvdXJjZU1nciwgTGFuZ09wdHMsIEludmFsaWQpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHNwZWxsaW5nIG9mIGEgdG9rZW4gaW50byBhIHByZWFsbG9jYXRlZCBidWZmZXIsIGluc3RlYWQKKyAgLy8vIG9mIGFzIGFuIHN0ZDo6c3RyaW5nLgorICAvLy8KKyAgLy8vIFRoZSBjYWxsZXIgaXMgcmVxdWlyZWQgdG8gYWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciB0aGUgdG9rZW4sIHdoaWNoIGlzCisgIC8vLyBndWFyYW50ZWVkIHRvIGJlIGF0IGxlYXN0IFRvay5nZXRMZW5ndGgoKSBieXRlcyBsb25nLiBUaGUgbGVuZ3RoIG9mIHRoZQorICAvLy8gYWN0dWFsIHJlc3VsdCBpcyByZXR1cm5lZC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGRvIHR3byBwb3NzaWJsZSB0aGluZ3M6IGl0IG1heSBlaXRoZXIgZmlsbCBpbgorICAvLy8gdGhlIGJ1ZmZlciBzcGVjaWZpZWQgd2l0aCBjaGFyYWN0ZXJzLCBvciBpdCBtYXkgKmNoYW5nZSB0aGUgaW5wdXQgcG9pbnRlcioKKyAgLy8vIHRvIHBvaW50IHRvIGEgY29uc3RhbnQgYnVmZmVyIHdpdGggdGhlIGRhdGEgYWxyZWFkeSBpbiBpdCAoYXZvaWRpbmcgYQorICAvLy8gY29weSkuICBUaGUgY2FsbGVyIGlzIG5vdCBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgcmV0dXJuZWQgYnVmZmVyIHBvaW50ZXIKKyAgLy8vIGlmIGFuIGludGVybmFsIGJ1ZmZlciBpcyByZXR1cm5lZC4KKyAgdW5zaWduZWQgZ2V0U3BlbGxpbmcoY29uc3QgVG9rZW4gJlRvaywgY29uc3QgY2hhciAqJkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqSW52YWxpZCA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gTGV4ZXI6OmdldFNwZWxsaW5nKFRvaywgQnVmZmVyLCBTb3VyY2VNZ3IsIExhbmdPcHRzLCBJbnZhbGlkKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBzcGVsbGluZyBvZiBhIHRva2VuIGludG8gYSBTbWFsbFZlY3Rvci4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhlIHJldHVybmVkIFN0cmluZ1JlZiBtYXkgbm90IHBvaW50IHRvIHRoZQorICAvLy8gc3VwcGxpZWQgYnVmZmVyIGlmIGEgY29weSBjYW4gYmUgYXZvaWRlZC4KKyAgU3RyaW5nUmVmIGdldFNwZWxsaW5nKGNvbnN0IFRva2VuICZUb2ssCisgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKkludmFsaWQgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJlbGV4IHRoZSB0b2tlbiBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3YXMgYSBmYWlsdXJlLCBmYWxzZSBvbiBzdWNjZXNzLgorICBib29sIGdldFJhd1Rva2VuKFNvdXJjZUxvY2F0aW9uIExvYywgVG9rZW4gJlJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICBib29sIElnbm9yZVdoaXRlU3BhY2UgPSBmYWxzZSkgeworICAgIHJldHVybiBMZXhlcjo6Z2V0UmF3VG9rZW4oTG9jLCBSZXN1bHQsIFNvdXJjZU1nciwgTGFuZ09wdHMsIElnbm9yZVdoaXRlU3BhY2UpOworICB9CisKKyAgLy8vIFxicmllZiBHaXZlbiBhIFRva2VuIFxwIFRvayB0aGF0IGlzIGEgbnVtZXJpYyBjb25zdGFudCB3aXRoIGxlbmd0aCAxLAorICAvLy8gcmV0dXJuIHRoZSBjaGFyYWN0ZXIuCisgIGNoYXIKKyAgZ2V0U3BlbGxpbmdPZlNpbmdsZUNoYXJhY3Rlck51bWVyaWNDb25zdGFudChjb25zdCBUb2tlbiAmVG9rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKkludmFsaWQgPSBudWxscHRyKSBjb25zdCB7CisgICAgYXNzZXJ0KFRvay5pcyh0b2s6Om51bWVyaWNfY29uc3RhbnQpICYmCisgICAgICAgICAgIFRvay5nZXRMZW5ndGgoKSA9PSAxICYmICJDYWxsZWQgb24gdW5zdXBwb3J0ZWQgdG9rZW4iKTsKKyAgICBhc3NlcnQoIVRvay5uZWVkc0NsZWFuaW5nKCkgJiYgIlRva2VuIGNhbid0IG5lZWQgY2xlYW5pbmcgd2l0aCBsZW5ndGggMSIpOworCisgICAgLy8gSWYgdGhlIHRva2VuIGlzIGNhcnJ5aW5nIGEgbGl0ZXJhbCBkYXRhIHBvaW50ZXIsIGp1c3QgdXNlIGl0LgorICAgIGlmIChjb25zdCBjaGFyICpEID0gVG9rLmdldExpdGVyYWxEYXRhKCkpCisgICAgICByZXR1cm4gKkQ7CisKKyAgICAvLyBPdGhlcndpc2UsIGZhbGwgYmFjayBvbiBnZXRDaGFyYWN0ZXJEYXRhLCB3aGljaCBpcyBzbG93ZXIsIGJ1dCBhbHdheXMKKyAgICAvLyB3b3Jrcy4KKyAgICByZXR1cm4gKlNvdXJjZU1nci5nZXRDaGFyYWN0ZXJEYXRhKFRvay5nZXRMb2NhdGlvbigpLCBJbnZhbGlkKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIGltbWVkaWF0ZSBtYWNybyBleHBhbnNpb24uCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIHN0YXJ0cyBmcm9tIGEgc291cmNlIGxvY2F0aW9uLCBhbmQgZmluZHMgdGhlIG5hbWUgb2YgdGhlCisgIC8vLyBtYWNybyByZXNwb25zaWJsZSBmb3IgaXRzIGltbWVkaWF0ZSBleHBhbnNpb24uIEl0IGxvb2tzIHRocm91Z2ggYW55CisgIC8vLyBpbnRlcnZlbmluZyBtYWNybyBhcmd1bWVudCBleHBhbnNpb25zIHRvIGNvbXB1dGUgdGhpcy4gSXQgcmV0dXJucyBhCisgIC8vLyBTdHJpbmdSZWYgdGhhdCByZWZlcnMgdG8gdGhlIFNvdXJjZU1hbmFnZXItb3duZWQgYnVmZmVyIG9mIHRoZSBzb3VyY2UKKyAgLy8vIHdoZXJlIHRoYXQgbWFjcm8gbmFtZSBpcyBzcGVsbGVkLiBUaHVzLCB0aGUgcmVzdWx0IHNob3VsZG4ndCBvdXQtbGl2ZQorICAvLy8gdGhlIFNvdXJjZU1hbmFnZXIuCisgIFN0cmluZ1JlZiBnZXRJbW1lZGlhdGVNYWNyb05hbWUoU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgcmV0dXJuIExleGVyOjpnZXRJbW1lZGlhdGVNYWNyb05hbWUoTG9jLCBTb3VyY2VNZ3IsIGdldExhbmdPcHRzKCkpOworICB9CisKKyAgLy8vIFxicmllZiBQbG9wIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGludG8gYSBzY3JhdGNoIGJ1ZmZlciBhbmQgc2V0IHRoZQorICAvLy8gc3BlY2lmaWVkIHRva2VuJ3MgbG9jYXRpb24gYW5kIGxlbmd0aCB0byBpdC4gCisgIC8vLworICAvLy8gSWYgc3BlY2lmaWVkLCB0aGUgc291cmNlIGxvY2F0aW9uIHByb3ZpZGVzIGEgbG9jYXRpb24gb2YgdGhlIGV4cGFuc2lvbgorICAvLy8gcG9pbnQgb2YgdGhlIHRva2VuLgorICB2b2lkIENyZWF0ZVN0cmluZyhTdHJpbmdSZWYgU3RyLCBUb2tlbiAmVG9rLAorICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFeHBhbnNpb25Mb2NTdGFydCA9IFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEV4cGFuc2lvbkxvY0VuZCA9IFNvdXJjZUxvY2F0aW9uKCkpOworCisgIC8vLyBcYnJpZWYgQ29tcHV0ZXMgdGhlIHNvdXJjZSBsb2NhdGlvbiBqdXN0IHBhc3QgdGhlIGVuZCBvZiB0aGUKKyAgLy8vIHRva2VuIGF0IHRoaXMgc291cmNlIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBjYW4gYmUgdXNlZCB0byBwcm9kdWNlIGEgc291cmNlIGxvY2F0aW9uIHRoYXQKKyAgLy8vIHBvaW50cyBqdXN0IHBhc3QgdGhlIGVuZCBvZiB0aGUgdG9rZW4gcmVmZXJlbmNlZCBieSBccCBMb2MsIGFuZAorICAvLy8gaXMgZ2VuZXJhbGx5IHVzZWQgd2hlbiBhIGRpYWdub3N0aWMgbmVlZHMgdG8gcG9pbnQganVzdCBhZnRlciBhCisgIC8vLyB0b2tlbiB3aGVyZSBpdCBleHBlY3RlZCBzb21ldGhpbmcgZGlmZmVyZW50IHRoYXQgaXQgcmVjZWl2ZWQuIElmCisgIC8vLyB0aGUgcmV0dXJuZWQgc291cmNlIGxvY2F0aW9uIHdvdWxkIG5vdCBiZSBtZWFuaW5nZnVsIChlLmcuLCBpZgorICAvLy8gaXQgcG9pbnRzIGludG8gYSBtYWNybyksIHRoaXMgcm91dGluZSByZXR1cm5zIGFuIGludmFsaWQKKyAgLy8vIHNvdXJjZSBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gT2Zmc2V0IGFuIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgdGhlIHRva2VuLCB3aGVyZSB0aGUgc291cmNlCisgIC8vLyBsb2NhdGlvbiBzaG91bGQgcmVmZXIgdG8uIFRoZSBkZWZhdWx0IG9mZnNldCAoMCkgcHJvZHVjZXMgYSBzb3VyY2UKKyAgLy8vIGxvY2F0aW9uIHBvaW50aW5nIGp1c3QgcGFzdCB0aGUgZW5kIG9mIHRoZSB0b2tlbjsgYW4gb2Zmc2V0IG9mIDEgcHJvZHVjZXMKKyAgLy8vIGEgc291cmNlIGxvY2F0aW9uIHBvaW50aW5nIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgdG9rZW4sIGV0Yy4KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRm9yRW5kT2ZUb2tlbihTb3VyY2VMb2NhdGlvbiBMb2MsIHVuc2lnbmVkIE9mZnNldCA9IDApIHsKKyAgICByZXR1cm4gTGV4ZXI6OmdldExvY0ZvckVuZE9mVG9rZW4oTG9jLCBPZmZzZXQsIFNvdXJjZU1nciwgTGFuZ09wdHMpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIE1hY3JvSUQgbG9jYXRpb24gcG9pbnRzIGF0IHRoZSBmaXJzdAorICAvLy8gdG9rZW4gb2YgdGhlIG1hY3JvIGV4cGFuc2lvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gTWFjcm9CZWdpbiBJZiBub24tbnVsbCBhbmQgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCBpdCBpcyBzZXQgdG8KKyAgLy8vIGJlZ2luIGxvY2F0aW9uIG9mIHRoZSBtYWNyby4KKyAgYm9vbCBpc0F0U3RhcnRPZk1hY3JvRXhwYW5zaW9uKFNvdXJjZUxvY2F0aW9uIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICpNYWNyb0JlZ2luID0gbnVsbHB0cikgY29uc3QgeworICAgIHJldHVybiBMZXhlcjo6aXNBdFN0YXJ0T2ZNYWNyb0V4cGFuc2lvbihsb2MsIFNvdXJjZU1nciwgTGFuZ09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQmVnaW4pOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIE1hY3JvSUQgbG9jYXRpb24gcG9pbnRzIGF0IHRoZSBsYXN0CisgIC8vLyB0b2tlbiBvZiB0aGUgbWFjcm8gZXhwYW5zaW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNYWNyb0VuZCBJZiBub24tbnVsbCBhbmQgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCBpdCBpcyBzZXQgdG8KKyAgLy8vIGVuZCBsb2NhdGlvbiBvZiB0aGUgbWFjcm8uCisgIGJvb2wgaXNBdEVuZE9mTWFjcm9FeHBhbnNpb24oU291cmNlTG9jYXRpb24gbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICpNYWNyb0VuZCA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gTGV4ZXI6OmlzQXRFbmRPZk1hY3JvRXhwYW5zaW9uKGxvYywgU291cmNlTWdyLCBMYW5nT3B0cywgTWFjcm9FbmQpOworICB9CisKKyAgLy8vIFxicmllZiBQcmludCB0aGUgdG9rZW4gdG8gc3RkZXJyLCB1c2VkIGZvciBkZWJ1Z2dpbmcuCisgIHZvaWQgRHVtcFRva2VuKGNvbnN0IFRva2VuICZUb2ssIGJvb2wgRHVtcEZsYWdzID0gZmFsc2UpIGNvbnN0OworICB2b2lkIER1bXBMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0OworICB2b2lkIER1bXBNYWNybyhjb25zdCBNYWNyb0luZm8gJk1JKSBjb25zdDsKKyAgdm9pZCBkdW1wTWFjcm9JbmZvKGNvbnN0IElkZW50aWZpZXJJbmZvICpJSSk7CisKKyAgLy8vIFxicmllZiBHaXZlbiBhIGxvY2F0aW9uIHRoYXQgc3BlY2lmaWVzIHRoZSBzdGFydCBvZiBhCisgIC8vLyB0b2tlbiwgcmV0dXJuIGEgbmV3IGxvY2F0aW9uIHRoYXQgc3BlY2lmaWVzIGEgY2hhcmFjdGVyIHdpdGhpbiB0aGUgdG9rZW4uCisgIFNvdXJjZUxvY2F0aW9uIEFkdmFuY2VUb1Rva2VuQ2hhcmFjdGVyKFNvdXJjZUxvY2F0aW9uIFRva1N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDaGFyKSBjb25zdCB7CisgICAgcmV0dXJuIExleGVyOjpBZHZhbmNlVG9Ub2tlbkNoYXJhY3RlcihUb2tTdGFydCwgQ2hhciwgU291cmNlTWdyLCBMYW5nT3B0cyk7CisgIH0KKworICAvLy8gXGJyaWVmIEluY3JlbWVudCB0aGUgY291bnRlcnMgZm9yIHRoZSBudW1iZXIgb2YgdG9rZW4gcGFzdGUgb3BlcmF0aW9ucworICAvLy8gcGVyZm9ybWVkLgorICAvLy8KKyAgLy8vIElmIGZhc3Qgd2FzIHNwZWNpZmllZCwgdGhpcyBpcyBhICdmYXN0IHBhc3RlJyBjYXNlIHdlIGhhbmRsZWQuCisgIHZvaWQgSW5jcmVtZW50UGFzdGVDb3VudGVyKGJvb2wgaXNGYXN0KSB7CisgICAgaWYgKGlzRmFzdCkKKyAgICAgICsrTnVtRmFzdFRva2VuUGFzdGU7CisgICAgZWxzZQorICAgICAgKytOdW1Ub2tlblBhc3RlOworICB9CisKKyAgdm9pZCBQcmludFN0YXRzKCk7CisKKyAgc2l6ZV90IGdldFRvdGFsTWVtb3J5KCkgY29uc3Q7CisKKyAgLy8vIFdoZW4gdGhlIG1hY3JvIGV4cGFuZGVyIHBhc3RlcyB0b2dldGhlciBhIGNvbW1lbnQgKC8jIy8pIGluIE1pY3Jvc29mdAorICAvLy8gbW9kZSwgdGhpcyBtZXRob2QgaGFuZGxlcyB1cGRhdGluZyB0aGUgY3VycmVudCBzdGF0ZSwgcmV0dXJuaW5nIHRoZQorICAvLy8gdG9rZW4gb24gdGhlIG5leHQgc291cmNlIGxpbmUuCisgIHZvaWQgSGFuZGxlTWljcm9zb2Z0Q29tbWVudFBhc3RlKFRva2VuICZUb2spOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBQcmVwcm9jZXNzb3IgY2FsbGJhY2sgbWV0aG9kcy4gIFRoZXNlIGFyZSBpbnZva2VkIGJ5IGEgbGV4ZXIgYXMgdmFyaW91cworICAvLyBkaXJlY3RpdmVzIGFuZCBldmVudHMgYXJlIGZvdW5kLgorCisgIC8vLyBHaXZlbiBhIHRvazo6cmF3X2lkZW50aWZpZXIgdG9rZW4sIGxvb2sgdXAgdGhlCisgIC8vLyBpZGVudGlmaWVyIGluZm9ybWF0aW9uIGZvciB0aGUgdG9rZW4gYW5kIGluc3RhbGwgaXQgaW50byB0aGUgdG9rZW4sCisgIC8vLyB1cGRhdGluZyB0aGUgdG9rZW4ga2luZCBhY2NvcmRpbmdseS4KKyAgSWRlbnRpZmllckluZm8gKkxvb2tVcElkZW50aWZpZXJJbmZvKFRva2VuICZJZGVudGlmaWVyKSBjb25zdDsKKworcHJpdmF0ZToKKyAgbGx2bTo6RGVuc2VNYXA8SWRlbnRpZmllckluZm8qLHVuc2lnbmVkPiBQb2lzb25SZWFzb25zOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgU3BlY2lmaWVzIHRoZSByZWFzb24gZm9yIHBvaXNvbmluZyBhbiBpZGVudGlmaWVyLgorICAvLy8KKyAgLy8vIElmIHRoYXQgaWRlbnRpZmllciBpcyBhY2Nlc3NlZCB3aGlsZSBwb2lzb25lZCwgdGhlbiB0aGlzIHJlYXNvbiB3aWxsIGJlCisgIC8vLyB1c2VkIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgInBvaXNvbmVkIiBkaWFnbm9zdGljLgorICB2b2lkIFNldFBvaXNvblJlYXNvbihJZGVudGlmaWVySW5mbyAqSUksIHVuc2lnbmVkIERpYWdJRCk7CisKKyAgLy8vIFxicmllZiBEaXNwbGF5IHJlYXNvbiBmb3IgcG9pc29uZWQgaWRlbnRpZmllci4KKyAgdm9pZCBIYW5kbGVQb2lzb25lZElkZW50aWZpZXIoVG9rZW4gJiBUb2spOworCisgIHZvaWQgTWF5YmVIYW5kbGVQb2lzb25lZElkZW50aWZpZXIoVG9rZW4gJiBJZGVudGlmaWVyKSB7CisgICAgaWYoSWRlbnRpZmllckluZm8gKiBJSSA9IElkZW50aWZpZXIuZ2V0SWRlbnRpZmllckluZm8oKSkgeworICAgICAgaWYoSUktPmlzUG9pc29uZWQoKSkgeworICAgICAgICBIYW5kbGVQb2lzb25lZElkZW50aWZpZXIoSWRlbnRpZmllcik7CisgICAgICB9CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIC8vLyBJZGVudGlmaWVycyB1c2VkIGZvciBTRUggaGFuZGxpbmcgaW4gQm9ybGFuZC4gVGhlc2UgYXJlIG9ubHkKKyAgLy8vIGFsbG93ZWQgaW4gcGFydGljdWxhciBjaXJjdW1zdGFuY2VzCisgIC8vIF9fZXhjZXB0IGJsb2NrCisgIElkZW50aWZpZXJJbmZvICpJZGVudF9fZXhjZXB0aW9uX2NvZGUsCisgICAgICAgICAgICAgICAgICpJZGVudF9fX2V4Y2VwdGlvbl9jb2RlLAorICAgICAgICAgICAgICAgICAqSWRlbnRfR2V0RXhjZXB0aW9uQ29kZTsKKyAgLy8gX19leGNlcHQgZmlsdGVyIGV4cHJlc3Npb24KKyAgSWRlbnRpZmllckluZm8gKklkZW50X19leGNlcHRpb25faW5mbywKKyAgICAgICAgICAgICAgICAgKklkZW50X19fZXhjZXB0aW9uX2luZm8sCisgICAgICAgICAgICAgICAgICpJZGVudF9HZXRFeGNlcHRpb25JbmZvOworICAvLyBfX2ZpbmFsbHkKKyAgSWRlbnRpZmllckluZm8gKklkZW50X19hYm5vcm1hbF90ZXJtaW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgKklkZW50X19fYWJub3JtYWxfdGVybWluYXRpb24sCisgICAgICAgICAgICAgICAgICpJZGVudF9BYm5vcm1hbFRlcm1pbmF0aW9uOworCisgIGNvbnN0IGNoYXIgKmdldEN1ckxleGVyRW5kUG9zKCk7CisgIHZvaWQgZGlhZ25vc2VNaXNzaW5nSGVhZGVySW5VbWJyZWxsYURpcihjb25zdCBNb2R1bGUgJk1vZCk7CisKK3B1YmxpYzoKKyAgdm9pZCBQb2lzb25TRUhJZGVudGlmaWVycyhib29sIFBvaXNvbiA9IHRydWUpOyAvLyBCb3JsYW5kCisKKyAgLy8vIFxicmllZiBDYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIGxleGVyIHJlYWRzIGFuIGlkZW50aWZpZXIgYW5kIGhhcworICAvLy8gZmlsbGVkIGluIHRoZSB0b2tlbnMgSWRlbnRpZmllckluZm8gbWVtYmVyLiAKKyAgLy8vCisgIC8vLyBUaGlzIGNhbGxiYWNrIHBvdGVudGlhbGx5IG1hY3JvIGV4cGFuZHMgaXQgb3IgdHVybnMgaXQgaW50byBhIG5hbWVkCisgIC8vLyB0b2tlbiAobGlrZSAnZm9yJykuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB3ZSBhY3R1YWxseSBjb21wdXRlZCBhIHRva2VuLCBmYWxzZSBpZiB3ZSBuZWVkIHRvCisgIC8vLyBsZXggYWdhaW4uCisgIGJvb2wgSGFuZGxlSWRlbnRpZmllcihUb2tlbiAmSWRlbnRpZmllcik7CisKKyAgLy8vIFxicmllZiBDYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIGxleGVyIGhpdHMgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBmaWxlLgorICAvLy8KKyAgLy8vIFRoaXMgZWl0aGVyIHJldHVybnMgdGhlIEVPRiB0b2tlbiBhbmQgcmV0dXJucyB0cnVlLCBvcgorICAvLy8gcG9wcyBhIGxldmVsIG9mZiB0aGUgaW5jbHVkZSBzdGFjayBhbmQgcmV0dXJucyBmYWxzZSwgYXQgd2hpY2ggcG9pbnQgdGhlCisgIC8vLyBjbGllbnQgc2hvdWxkIGNhbGwgbGV4IGFnYWluLgorICBib29sIEhhbmRsZUVuZE9mRmlsZShUb2tlbiAmUmVzdWx0LCBib29sIGlzRW5kT2ZNYWNybyA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIENhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgY3VycmVudCBUb2tlbkxleGVyIGhpdHMgdGhlIGVuZCBvZiBpdHMKKyAgLy8vIHRva2VuIHN0cmVhbS4KKyAgYm9vbCBIYW5kbGVFbmRPZlRva2VuTGV4ZXIoVG9rZW4gJlJlc3VsdCk7CisKKyAgLy8vIFxicmllZiBDYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIGxleGVyIHNlZXMgYSAjIHRva2VuIGF0IHRoZSBzdGFydCBvZiBhCisgIC8vLyBsaW5lLgorICAvLy8KKyAgLy8vIFRoaXMgY29uc3VtZXMgdGhlIGRpcmVjdGl2ZSwgbW9kaWZpZXMgdGhlIGxleGVyL3ByZXByb2Nlc3NvciBzdGF0ZSwgYW5kCisgIC8vLyBhZHZhbmNlcyB0aGUgbGV4ZXIocykgc28gdGhhdCB0aGUgbmV4dCB0b2tlbiByZWFkIGlzIHRoZSBjb3JyZWN0IG9uZS4KKyAgdm9pZCBIYW5kbGVEaXJlY3RpdmUoVG9rZW4gJlJlc3VsdCk7CisKKyAgLy8vIFxicmllZiBFbnN1cmUgdGhhdCB0aGUgbmV4dCB0b2tlbiBpcyBhIHRvazo6ZW9kIHRva2VuLgorICAvLy8KKyAgLy8vIElmIG5vdCwgZW1pdCBhIGRpYWdub3N0aWMgYW5kIGNvbnN1bWUgdXAgdW50aWwgdGhlIGVvZC4KKyAgLy8vIElmIFxwIEVuYWJsZU1hY3JvcyBpcyB0cnVlLCB0aGVuIHdlIGNvbnNpZGVyIG1hY3JvcyB0aGF0IGV4cGFuZCB0byB6ZXJvCisgIC8vLyB0b2tlbnMgYXMgYmVpbmcgb2suCisgIHZvaWQgQ2hlY2tFbmRPZkRpcmVjdGl2ZShjb25zdCBjaGFyICpEaXJlY3RpdmUsIGJvb2wgRW5hYmxlTWFjcm9zID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgUmVhZCBhbmQgZGlzY2FyZCBhbGwgdG9rZW5zIHJlbWFpbmluZyBvbiB0aGUgY3VycmVudCBsaW5lIHVudGlsCisgIC8vLyB0aGUgdG9rOjplb2QgdG9rZW4gaXMgZm91bmQuCisgIHZvaWQgRGlzY2FyZFVudGlsRW5kT2ZEaXJlY3RpdmUoKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJlcHJvY2Vzc29yIGhhcyBzZWVuIGEgdXNlIG9mCisgIC8vLyBfX0RBVEVfXyBvciBfX1RJTUVfXyBpbiB0aGUgZmlsZSBzbyBmYXIuCisgIGJvb2wgU2F3RGF0ZU9yVGltZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gREFURUxvYyAhPSBTb3VyY2VMb2NhdGlvbigpIHx8IFRJTUVMb2MgIT0gU291cmNlTG9jYXRpb24oKTsKKyAgfQorICB1bnNpZ25lZCBnZXRDb3VudGVyVmFsdWUoKSBjb25zdCB7IHJldHVybiBDb3VudGVyVmFsdWU7IH0KKyAgdm9pZCBzZXRDb3VudGVyVmFsdWUodW5zaWduZWQgVikgeyBDb3VudGVyVmFsdWUgPSBWOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZXMgdGhlIG1vZHVsZSB0aGF0IHdlJ3JlIGN1cnJlbnRseSBidWlsZGluZywgaWYgYW55LgorICBNb2R1bGUgKmdldEN1cnJlbnRNb2R1bGUoKTsKKyAgCisgIC8vLyBcYnJpZWYgQWxsb2NhdGUgYSBuZXcgTWFjcm9JbmZvIG9iamVjdCB3aXRoIHRoZSBwcm92aWRlZCBTb3VyY2VMb2NhdGlvbi4KKyAgTWFjcm9JbmZvICpBbGxvY2F0ZU1hY3JvSW5mbyhTb3VyY2VMb2NhdGlvbiBMKTsKKworICAvLy8gXGJyaWVmIFR1cm4gdGhlIHNwZWNpZmllZCBsZXhlciB0b2tlbiBpbnRvIGEgZnVsbHkgY2hlY2tlZCBhbmQgc3BlbGxlZAorICAvLy8gZmlsZW5hbWUsIGUuZy4gYXMgYW4gb3BlcmFuZCBvZiBcI2luY2x1ZGUuIAorICAvLy8KKyAgLy8vIFRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gcHJvdmlkZSBhIGJ1ZmZlciB0aGF0IGlzIGxhcmdlIGVub3VnaCB0byBob2xkCisgIC8vLyB0aGUgc3BlbGxpbmcgb2YgdGhlIGZpbGVuYW1lLCBidXQgaXMgYWxzbyBleHBlY3RlZCB0byBoYW5kbGUgdGhlIGNhc2UKKyAgLy8vIHdoZW4gdGhpcyBtZXRob2QgZGVjaWRlcyB0byB1c2UgYSBkaWZmZXJlbnQgYnVmZmVyLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlIGlucHV0IGZpbGVuYW1lIHdhcyBpbiA8PidzIG9yIGZhbHNlIGlmIGl0IHdhcworICAvLy8gaW4gIiIncy4KKyAgYm9vbCBHZXRJbmNsdWRlRmlsZW5hbWVTcGVsbGluZyhTb3VyY2VMb2NhdGlvbiBMb2MsU3RyaW5nUmVmICZGaWxlbmFtZSk7CisKKyAgLy8vIFxicmllZiBHaXZlbiBhICJmb28iIG9yIFw8Zm9vPiByZWZlcmVuY2UsIGxvb2sgdXAgdGhlIGluZGljYXRlZCBmaWxlLgorICAvLy8KKyAgLy8vIFJldHVybnMgbnVsbCBvbiBmYWlsdXJlLiAgXHAgaXNBbmdsZWQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpbGUKKyAgLy8vIHJlZmVyZW5jZSBpcyBmb3Igc3lzdGVtIFwjaW5jbHVkZSdzIG9yIG5vdCAoaS5lLiB1c2luZyA8PiBpbnN0ZWFkIG9mICIiKS4KKyAgY29uc3QgRmlsZUVudHJ5ICpMb29rdXBGaWxlKFNvdXJjZUxvY2F0aW9uIEZpbGVuYW1lTG9jLCBTdHJpbmdSZWYgRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQW5nbGVkLCBjb25zdCBEaXJlY3RvcnlMb29rdXAgKkZyb21EaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRW50cnkgKkZyb21GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlyZWN0b3J5TG9va3VwIComQ3VyRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICpTZWFyY2hQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICpSZWxhdGl2ZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVNYXA6Oktub3duSGVhZGVyICpTdWdnZXN0ZWRNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpJc01hcHBlZCwgYm9vbCBTa2lwQ2FjaGUgPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIERpcmVjdG9yeUxvb2t1cCBzdHJ1Y3R1cmUgdXNlZCB0byBmaW5kIHRoZSBjdXJyZW50CisgIC8vLyBGaWxlRW50cnksIGlmIEN1ckxleGVyIGlzIG5vbi1udWxsIGFuZCBpZiBhcHBsaWNhYmxlLiAKKyAgLy8vCisgIC8vLyBUaGlzIGFsbG93cyB1cyB0byBpbXBsZW1lbnQgXCNpbmNsdWRlX25leHQgYW5kIGZpbmQgZGlyZWN0b3J5LXNwZWNpZmljCisgIC8vLyBwcm9wZXJ0aWVzLgorICBjb25zdCBEaXJlY3RvcnlMb29rdXAgKkdldEN1ckRpckxvb2t1cCgpIHsgcmV0dXJuIEN1ckRpckxvb2t1cDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgd2UncmUgaW4gdGhlIHRvcC1sZXZlbCBmaWxlLCBub3QgaW4gYSBcI2luY2x1ZGUuCisgIGJvb2wgaXNJblByaW1hcnlGaWxlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBIYW5kbGUgY2FzZXMgd2hlcmUgdGhlIFwjaW5jbHVkZSBuYW1lIGlzIGV4cGFuZGVkCisgIC8vLyBmcm9tIGEgbWFjcm8gYXMgbXVsdGlwbGUgdG9rZW5zLCB3aGljaCBuZWVkIHRvIGJlIGdsdWVkIHRvZ2V0aGVyLiAKKyAgLy8vCisgIC8vLyBUaGlzIG9jY3VycyBmb3IgY29kZSBsaWtlOgorICAvLy8gXGNvZGUKKyAgLy8vICAgIFwjZGVmaW5lIEZPTyA8eC95Lmg+CisgIC8vLyAgICBcI2luY2x1ZGUgRk9PCisgIC8vLyBcZW5kY29kZQorICAvLy8gYmVjYXVzZSBpbiB0aGlzIGNhc2UsICI8eC95Lmg+IiBpcyByZXR1cm5lZCBhcyA3IHRva2Vucywgbm90IG9uZS4KKyAgLy8vCisgIC8vLyBUaGlzIGNvZGUgY29uY2F0ZW5hdGVzIGFuZCBjb25zdW1lcyB0b2tlbnMgdXAgdG8gdGhlICc+JyB0b2tlbi4gIEl0CisgIC8vLyByZXR1cm5zIGZhbHNlIGlmIHRoZSA+IHdhcyBmb3VuZCwgb3RoZXJ3aXNlIGl0IHJldHVybnMgdHJ1ZSBpZiBpdCBmaW5kcworICAvLy8gYW5kIGNvbnN1bWVzIHRoZSBFT0QgbWFya2VyLgorICBib29sIENvbmNhdGVuYXRlSW5jbHVkZU5hbWUoU21hbGxTdHJpbmc8MTI4PiAmRmlsZW5hbWVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAmRW5kKTsKKworICAvLy8gXGJyaWVmIExleCBhbiBvbi1vZmYtc3dpdGNoIChDOTkgNi4xMC42cDIpIGFuZCB2ZXJpZnkgdGhhdCBpdCBpcworICAvLy8gZm9sbG93ZWQgYnkgRU9ELiAgUmV0dXJuIHRydWUgaWYgdGhlIHRva2VuIGlzIG5vdCBhIHZhbGlkIG9uLW9mZi1zd2l0Y2guCisgIGJvb2wgTGV4T25PZmZTd2l0Y2godG9rOjpPbk9mZlN3aXRjaCAmT09TKTsKKworICBib29sIENoZWNrTWFjcm9OYW1lKFRva2VuICZNYWNyb05hbWVUb2ssIE1hY3JvVXNlIGlzRGVmaW5lVW5kZWYsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqU2hhZG93RmxhZyA9IG51bGxwdHIpOworCisgIHZvaWQgRW50ZXJTdWJtb2R1bGUoTW9kdWxlICpNLCBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MsIGJvb2wgRm9yUHJhZ21hKTsKKyAgTW9kdWxlICpMZWF2ZVN1Ym1vZHVsZShib29sIEZvclByYWdtYSk7CisKK3ByaXZhdGU6CisgIGZyaWVuZCB2b2lkIFRva2VuTGV4ZXI6OkV4cGFuZEZ1bmN0aW9uQXJndW1lbnRzKCk7CisKKyAgdm9pZCBQdXNoSW5jbHVkZU1hY3JvU3RhY2soKSB7CisgICAgYXNzZXJ0KEN1ckxleGVyS2luZCAhPSBDTEtfQ2FjaGluZ0xleGVyICYmICJjYW5ub3QgcHVzaCBhIGNhY2hpbmcgbGV4ZXIiKTsKKyAgICBJbmNsdWRlTWFjcm9TdGFjay5lbXBsYWNlX2JhY2soQ3VyTGV4ZXJLaW5kLCBDdXJMZXhlclN1Ym1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKEN1ckxleGVyKSwgc3RkOjptb3ZlKEN1clBUSExleGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyUFBMZXhlciwgc3RkOjptb3ZlKEN1clRva2VuTGV4ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEaXJMb29rdXApOworICAgIEN1clBQTGV4ZXIgPSBudWxscHRyOworICB9CisKKyAgdm9pZCBQb3BJbmNsdWRlTWFjcm9TdGFjaygpIHsKKyAgICBDdXJMZXhlciA9IHN0ZDo6bW92ZShJbmNsdWRlTWFjcm9TdGFjay5iYWNrKCkuVGhlTGV4ZXIpOworICAgIEN1clBUSExleGVyID0gc3RkOjptb3ZlKEluY2x1ZGVNYWNyb1N0YWNrLmJhY2soKS5UaGVQVEhMZXhlcik7CisgICAgQ3VyUFBMZXhlciA9IEluY2x1ZGVNYWNyb1N0YWNrLmJhY2soKS5UaGVQUExleGVyOworICAgIEN1clRva2VuTGV4ZXIgPSBzdGQ6Om1vdmUoSW5jbHVkZU1hY3JvU3RhY2suYmFjaygpLlRoZVRva2VuTGV4ZXIpOworICAgIEN1ckRpckxvb2t1cCAgPSBJbmNsdWRlTWFjcm9TdGFjay5iYWNrKCkuVGhlRGlyTG9va3VwOworICAgIEN1ckxleGVyU3VibW9kdWxlID0gSW5jbHVkZU1hY3JvU3RhY2suYmFjaygpLlRoZVN1Ym1vZHVsZTsKKyAgICBDdXJMZXhlcktpbmQgPSBJbmNsdWRlTWFjcm9TdGFjay5iYWNrKCkuQ3VyTGV4ZXJLaW5kOworICAgIEluY2x1ZGVNYWNyb1N0YWNrLnBvcF9iYWNrKCk7CisgIH0KKworICB2b2lkIFByb3BhZ2F0ZUxpbmVTdGFydExlYWRpbmdTcGFjZUluZm8oVG9rZW4gJlJlc3VsdCk7CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHdlIG5lZWQgdG8gY3JlYXRlIG1vZHVsZSBtYWNyb3MgZm9yICNkZWZpbmVzIGluIHRoZQorICAvLy8gY3VycmVudCBjb250ZXh0LgorICBib29sIG5lZWRNb2R1bGVNYWNyb3MoKSBjb25zdDsKKworICAvLy8gVXBkYXRlIHRoZSBzZXQgb2YgYWN0aXZlIG1vZHVsZSBtYWNyb3MgYW5kIGFtYmlndWl0eSBmbGFnIGZvciBhIG1vZHVsZQorICAvLy8gbWFjcm8gbmFtZS4KKyAgdm9pZCB1cGRhdGVNb2R1bGVNYWNyb0luZm8oY29uc3QgSWRlbnRpZmllckluZm8gKklJLCBNb2R1bGVNYWNyb0luZm8gJkluZm8pOworCisgIERlZk1hY3JvRGlyZWN0aXZlICpBbGxvY2F0ZURlZk1hY3JvRGlyZWN0aXZlKE1hY3JvSW5mbyAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYyk7CisgIFVuZGVmTWFjcm9EaXJlY3RpdmUgKkFsbG9jYXRlVW5kZWZNYWNyb0RpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBVbmRlZkxvYyk7CisgIFZpc2liaWxpdHlNYWNyb0RpcmVjdGl2ZSAqQWxsb2NhdGVWaXNpYmlsaXR5TWFjcm9EaXJlY3RpdmUoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMpOworCisgIC8vLyBcYnJpZWYgTGV4IGFuZCB2YWxpZGF0ZSBhIG1hY3JvIG5hbWUsIHdoaWNoIG9jY3VycyBhZnRlciBhCisgIC8vLyBcI2RlZmluZSBvciBcI3VuZGVmLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNYWNyb05hbWVUb2sgVG9rZW4gdGhhdCByZXByZXNlbnRzIHRoZSBuYW1lIGRlZmluZWQgb3IgdW5kZWZpbmVkLgorICAvLy8gXHBhcmFtIElzRGVmaW5lVW5kZWYgS2luZCBpZiBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIFNoYWRvd0ZsYWcgUG9pbnRzIHRvIGZsYWcgdGhhdCBpcyBzZXQgaWYgbWFjcm8gbmFtZSBzaGFkb3dzCisgIC8vLyAgICAgICAgICAgICAgICAgICBhIGtleXdvcmQuCisgIC8vLworICAvLy8gVGhpcyBlbWl0cyBhIGRpYWdub3N0aWMsIHNldHMgdGhlIHRva2VuIGtpbmQgdG8gZW9kLAorICAvLy8gYW5kIGRpc2NhcmRzIHRoZSByZXN0IG9mIHRoZSBtYWNybyBsaW5lIGlmIHRoZSBtYWNybyBuYW1lIGlzIGludmFsaWQuCisgIHZvaWQgUmVhZE1hY3JvTmFtZShUb2tlbiAmTWFjcm9OYW1lVG9rLCBNYWNyb1VzZSBJc0RlZmluZVVuZGVmID0gTVVfT3RoZXIsCisgICAgICAgICAgICAgICAgICAgICBib29sICpTaGFkb3dGbGFnID0gbnVsbHB0cik7CisKKyAgLy8vIFJlYWRPcHRpb25hbE1hY3JvUGFyYW1ldGVyTGlzdEFuZEJvZHkgLSBUaGlzIGNvbnN1bWVzIGFsbCAoaS5lLiB0aGUKKyAgLy8vIGVudGlyZSBsaW5lKSBvZiB0aGUgbWFjcm8ncyB0b2tlbnMgYW5kIGFkZHMgdGhlbSB0byBNYWNyb0luZm8sIGFuZCB3aGlsZQorICAvLy8gZG9pbmcgc28gcGVyZm9ybXMgY2VydGFpbiB2YWxpZGl0eSBjaGVja3MgaW5jbHVkaW5nIChidXQgbm90IGxpbWl0ZWQgdG8pOgorICAvLy8gICAtICMgKHN0cmluZ2l6YXRpb24pIGlzIGZvbGxvd2VkIGJ5IGEgbWFjcm8gcGFyYW1ldGVyCisgIC8vLyBccGFyYW0gTWFjcm9OYW1lVG9rIC0gVG9rZW4gdGhhdCByZXByZXNlbnRzIHRoZSBtYWNybyBuYW1lCisgIC8vLyBccGFyYW0gSW1tZWRpYXRlbHlBZnRlckhlYWRlckd1YXJkIC0gTWFjcm8gZm9sbG93cyBhbiAjaWZkZWYgaGVhZGVyIGd1YXJkCisgIC8vLyAKKyAgLy8vICBFaXRoZXIgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBNYWNyb0luZm8gb2JqZWN0IE9SIGVtaXRzIGEgZGlhZ25vc3RpYyBhbmQKKyAgLy8vICByZXR1cm5zIGEgbnVsbHB0ciBpZiBhbiBpbnZhbGlkIHNlcXVlbmNlIG9mIHRva2VucyBpcyBlbmNvdW50ZXJlZC4KKyAgTWFjcm9JbmZvICpSZWFkT3B0aW9uYWxNYWNyb1BhcmFtZXRlckxpc3RBbmRCb2R5KAorICAgICAgY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywgYm9vbCBJbW1lZGlhdGVseUFmdGVySGVhZGVyR3VhcmQpOworCisgIC8vLyBUaGUgKCBzdGFydGluZyBhbiBhcmd1bWVudCBsaXN0IG9mIGEgbWFjcm8gZGVmaW5pdGlvbiBoYXMganVzdCBiZWVuIHJlYWQuCisgIC8vLyBMZXggdGhlIHJlc3Qgb2YgdGhlIHBhcmFtZXRlcnMgYW5kIHRoZSBjbG9zaW5nICksIHVwZGF0aW5nIFxwIE1JIHdpdGgKKyAgLy8vIHdoYXQgd2UgbGVhcm4gYW5kIHNhdmluZyBpbiBccCBMYXN0VG9rIHRoZSBsYXN0IHRva2VuIHJlYWQuCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnMgcGFyc2luZyB0aGUgYXJnIGxpc3QuCisgIGJvb2wgUmVhZE1hY3JvUGFyYW1ldGVyTGlzdChNYWNyb0luZm8gKk1JLCBUb2tlbiYgTGFzdFRvayk7CisKKyAgLy8vIFdlIGp1c3QgcmVhZCBhIFwjaWYgb3IgcmVsYXRlZCBkaXJlY3RpdmUgYW5kIGRlY2lkZWQgdGhhdCB0aGUKKyAgLy8vIHN1YnNlcXVlbnQgdG9rZW5zIGFyZSBpbiB0aGUgXCNpZidkIG91dCBwb3J0aW9uIG9mIHRoZQorICAvLy8gZmlsZS4gIExleCB0aGUgcmVzdCBvZiB0aGUgZmlsZSwgdW50aWwgd2Ugc2VlIGFuIFwjZW5kaWYuICBJZiBccAorICAvLy8gRm91bmROb25Ta2lwUG9ydGlvbiBpcyB0cnVlLCB0aGVuIHdlIGhhdmUgYWxyZWFkeSBlbWl0dGVkIGNvZGUgZm9yIHBhcnQgb2YKKyAgLy8vIHRoaXMgXCNpZiBkaXJlY3RpdmUsIHNvIFwjZWxzZS9cI2VsaWYgYmxvY2tzIHNob3VsZCBuZXZlciBiZSBlbnRlcmVkLiBJZgorICAvLy8gXHAgRm91bmRFbHNlIGlzIGZhbHNlLCB0aGVuIFwjZWxzZSBkaXJlY3RpdmVzIGFyZSBvaywgaWYgbm90LCB0aGVuIHdlIGhhdmUKKyAgLy8vIGFscmVhZHkgc2VlbiBvbmUgc28gYSBcI2Vsc2UgZGlyZWN0aXZlIGlzIGEgZHVwbGljYXRlLiAgV2hlbiB0aGlzIHJldHVybnMsCisgIC8vLyB0aGUgY2FsbGVyIGNhbiBsZXggdGhlIGZpcnN0IHZhbGlkIHRva2VuLgorICB2b2lkIFNraXBFeGNsdWRlZENvbmRpdGlvbmFsQmxvY2soU291cmNlTG9jYXRpb24gSGFzaFRva2VuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWZUb2tlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRm91bmROb25Ta2lwUG9ydGlvbiwgYm9vbCBGb3VuZEVsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbHNlTG9jID0gU291cmNlTG9jYXRpb24oKSk7CisKKyAgLy8vIFxicmllZiBBIGZhc3QgUFRIIHZlcnNpb24gb2YgU2tpcEV4Y2x1ZGVkQ29uZGl0aW9uYWxCbG9jay4KKyAgdm9pZCBQVEhTa2lwRXhjbHVkZWRDb25kaXRpb25hbEJsb2NrKCk7CisKKyAgLy8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSByZXN1bHQgZm9yIGV2YWx1YXRpbmcgYW4gZXhwcmVzc2lvbiBmb3IgYQorICAvLy8gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZS4KKyAgc3RydWN0IERpcmVjdGl2ZUV2YWxSZXN1bHQgeworICAgIC8vLyBXaGV0aGVyIHRoZSBleHByZXNzaW9uIHdhcyBldmFsdWF0ZWQgYXMgdHJ1ZSBvciBub3QuCisgICAgYm9vbCBDb25kaXRpb25hbDsKKworICAgIC8vLyBUcnVlIGlmIHRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBpZGVudGlmaWVycyB0aGF0IHdlcmUgdW5kZWZpbmVkLgorICAgIGJvb2wgSW5jbHVkZWRVbmRlZmluZWRJZHM7CisgIH07CisKKyAgLy8vIFxicmllZiBFdmFsdWF0ZSBhbiBpbnRlZ2VyIGNvbnN0YW50IGV4cHJlc3Npb24gdGhhdCBtYXkgb2NjdXIgYWZ0ZXIgYQorICAvLy8gXCNpZiBvciBcI2VsaWYgZGlyZWN0aXZlIGFuZCByZXR1cm4gYSBccCBEaXJlY3RpdmVFdmFsUmVzdWx0IG9iamVjdC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgZXhwcmVzc2lvbiBpcyBlcXVpdmFsZW50IHRvICIhZGVmaW5lZChYKSIgcmV0dXJuIFggaW4gSWZORGVmTWFjcm8uCisgIERpcmVjdGl2ZUV2YWxSZXN1bHQgRXZhbHVhdGVEaXJlY3RpdmVFeHByZXNzaW9uKElkZW50aWZpZXJJbmZvIComSWZORGVmTWFjcm8pOworCisgIC8vLyBcYnJpZWYgSW5zdGFsbCB0aGUgc3RhbmRhcmQgcHJlcHJvY2Vzc29yIHByYWdtYXM6CisgIC8vLyBcI3ByYWdtYSBHQ0MgcG9pc29uL3N5c3RlbV9oZWFkZXIvZGVwZW5kZW5jeSBhbmQgXCNwcmFnbWEgb25jZS4KKyAgdm9pZCBSZWdpc3RlckJ1aWx0aW5QcmFnbWFzKCk7CisKKyAgLy8vIFxicmllZiBSZWdpc3RlciBidWlsdGluIG1hY3JvcyBzdWNoIGFzIF9fTElORV9fIHdpdGggdGhlIGlkZW50aWZpZXIgdGFibGUuCisgIHZvaWQgUmVnaXN0ZXJCdWlsdGluTWFjcm9zKCk7CisKKyAgLy8vIElmIGFuIGlkZW50aWZpZXIgdG9rZW4gaXMgcmVhZCB0aGF0IGlzIHRvIGJlIGV4cGFuZGVkIGFzIGEgbWFjcm8sIGhhbmRsZQorICAvLy8gaXQgYW5kIHJldHVybiB0aGUgbmV4dCB0b2tlbiBhcyAnVG9rJy4gIElmIHdlIGxleGVkIGEgdG9rZW4sIHJldHVybiB0cnVlOworICAvLy8gb3RoZXJ3aXNlIHRoZSBjYWxsZXIgc2hvdWxkIGxleCBhZ2Fpbi4KKyAgYm9vbCBIYW5kbGVNYWNyb0V4cGFuZGVkSWRlbnRpZmllcihUb2tlbiAmVG9rLCBjb25zdCBNYWNyb0RlZmluaXRpb24gJk1EKTsKKworICAvLy8gXGJyaWVmIENhY2hlIG1hY3JvIGV4cGFuZGVkIHRva2VucyBmb3IgVG9rZW5MZXhlcnMuCisgIC8vCisgIC8vLyBXb3JrcyBsaWtlIGEgc3RhY2s7IGEgVG9rZW5MZXhlciBhZGRzIHRoZSBtYWNybyBleHBhbmRlZCB0b2tlbnMgdGhhdCBpcworICAvLy8gZ29pbmcgdG8gbGV4IGluIHRoZSBjYWNoZSBhbmQgd2hlbiBpdCBmaW5pc2hlcyB0aGUgdG9rZW5zIGFyZSByZW1vdmVkCisgIC8vLyBmcm9tIHRoZSBlbmQgb2YgdGhlIGNhY2hlLgorICBUb2tlbiAqY2FjaGVNYWNyb0V4cGFuZGVkVG9rZW5zKFRva2VuTGV4ZXIgKnRva0xleGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFRva2VuPiB0b2tlbnMpOworCisgIHZvaWQgcmVtb3ZlQ2FjaGVkTWFjcm9FeHBhbmRlZFRva2Vuc09mTGFzdExleGVyKCk7CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBuZXh0IHByZXByb2Nlc3NvciB0b2tlbiB0byBiZQorICAvLy8gbGV4ZWQgaXMgYSAnKCcuICBJZiBzbywgY29uc3VtZSB0aGUgdG9rZW4gYW5kIHJldHVybiB0cnVlLCBpZiBub3QsIHRoaXMKKyAgLy8vIG1ldGhvZCBzaG91bGQgaGF2ZSBubyBvYnNlcnZhYmxlIHNpZGUtZWZmZWN0IG9uIHRoZSBsZXhlZCB0b2tlbnMuCisgIGJvb2wgaXNOZXh0UFBUb2tlbkxQYXJlbigpOworCisgIC8vLyBBZnRlciByZWFkaW5nICJNQUNSTygiLCB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIHRvIHJlYWQgYWxsIG9mIHRoZSBmb3JtYWwKKyAgLy8vIGFyZ3VtZW50cyBzcGVjaWZpZWQgZm9yIHRoZSBtYWNybyBpbnZvY2F0aW9uLiAgUmV0dXJucyBudWxsIG9uIGVycm9yLgorICBNYWNyb0FyZ3MgKlJlYWRNYWNyb0NhbGxBcmd1bWVudExpc3QoVG9rZW4gJk1hY3JvTmFtZSwgTWFjcm9JbmZvICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICZFeHBhbnNpb25FbmQpOworCisgIC8vLyBcYnJpZWYgSWYgYW4gaWRlbnRpZmllciB0b2tlbiBpcyByZWFkIHRoYXQgaXMgdG8gYmUgZXhwYW5kZWQKKyAgLy8vIGFzIGEgYnVpbHRpbiBtYWNybywgaGFuZGxlIGl0IGFuZCByZXR1cm4gdGhlIG5leHQgdG9rZW4gYXMgJ1RvaycuCisgIHZvaWQgRXhwYW5kQnVpbHRpbk1hY3JvKFRva2VuICZUb2spOworCisgIC8vLyBcYnJpZWYgUmVhZCBhIFxjIF9QcmFnbWEgZGlyZWN0aXZlLCBzbGljZSBpdCB1cCwgcHJvY2VzcyBpdCwgdGhlbgorICAvLy8gcmV0dXJuIHRoZSBmaXJzdCB0b2tlbiBhZnRlciB0aGUgZGlyZWN0aXZlLgorICAvLy8gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFxjIF9QcmFnbWEgdG9rZW4gaGFzIGp1c3QgYmVlbiByZWFkIGludG8gXHAgVG9rLgorICB2b2lkIEhhbmRsZV9QcmFnbWEoVG9rZW4gJlRvayk7CisKKyAgLy8vIFxicmllZiBMaWtlIEhhbmRsZV9QcmFnbWEgZXhjZXB0IHRoZSBwcmFnbWEgdGV4dCBpcyBub3QgZW5jbG9zZWQgd2l0aGluCisgIC8vLyBhIHN0cmluZyBsaXRlcmFsLgorICB2b2lkIEhhbmRsZU1pY3Jvc29mdF9fcHJhZ21hKFRva2VuICZUb2spOworCisgIC8vLyBcYnJpZWYgQWRkIGEgbGV4ZXIgdG8gdGhlIHRvcCBvZiB0aGUgaW5jbHVkZSBzdGFjayBhbmQKKyAgLy8vIHN0YXJ0IGxleGluZyB0b2tlbnMgZnJvbSBpdCBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IGJ1ZmZlci4KKyAgdm9pZCBFbnRlclNvdXJjZUZpbGVXaXRoTGV4ZXIoTGV4ZXIgKlRoZUxleGVyLCBjb25zdCBEaXJlY3RvcnlMb29rdXAgKkRpcik7CisKKyAgLy8vIFxicmllZiBBZGQgYSBsZXhlciB0byB0aGUgdG9wIG9mIHRoZSBpbmNsdWRlIHN0YWNrIGFuZAorICAvLy8gc3RhcnQgZ2V0dGluZyB0b2tlbnMgZnJvbSBpdCB1c2luZyB0aGUgUFRIIGNhY2hlLgorICB2b2lkIEVudGVyU291cmNlRmlsZVdpdGhQVEgoUFRITGV4ZXIgKlBMLCBjb25zdCBEaXJlY3RvcnlMb29rdXAgKkRpcik7CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIEZpbGVJRCBmb3IgdGhlIHByZXByb2Nlc3NvciBwcmVkZWZpbmVzLgorICB2b2lkIHNldFByZWRlZmluZXNGaWxlSUQoRmlsZUlEIEZJRCkgeworICAgIGFzc2VydChQcmVkZWZpbmVzRmlsZUlELmlzSW52YWxpZCgpICYmICJQcmVkZWZpbmVzRmlsZUlEIGFscmVhZHkgc2V0ISIpOworICAgIFByZWRlZmluZXNGaWxlSUQgPSBGSUQ7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB3ZSBhcmUgbGV4aW5nIGZyb20gYSBmaWxlIGFuZCBub3QgYQorICAvLy8gcHJhZ21hIG9yIGEgbWFjcm8uCisgIHN0YXRpYyBib29sIElzRmlsZUxleGVyKGNvbnN0IExleGVyKiBMLCBjb25zdCBQcmVwcm9jZXNzb3JMZXhlciogUCkgeworICAgIHJldHVybiBMID8gIUwtPmlzUHJhZ21hTGV4ZXIoKSA6IFAgIT0gbnVsbHB0cjsKKyAgfQorCisgIHN0YXRpYyBib29sIElzRmlsZUxleGVyKGNvbnN0IEluY2x1ZGVTdGFja0luZm8mIEkpIHsKKyAgICByZXR1cm4gSXNGaWxlTGV4ZXIoSS5UaGVMZXhlci5nZXQoKSwgSS5UaGVQUExleGVyKTsKKyAgfQorCisgIGJvb2wgSXNGaWxlTGV4ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIElzRmlsZUxleGVyKEN1ckxleGVyLmdldCgpLCBDdXJQUExleGVyKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDYWNoaW5nIHN0dWZmLgorICB2b2lkIENhY2hpbmdMZXgoVG9rZW4gJlJlc3VsdCk7CisKKyAgYm9vbCBJbkNhY2hpbmdMZXhNb2RlKCkgY29uc3QgeworICAgIC8vIElmIHRoZSBMZXhlciBwb2ludGVycyBhcmUgMCBhbmQgSW5jbHVkZU1hY3JvU3RhY2sgaXMgZW1wdHksIGl0IG1lYW5zCisgICAgLy8gdGhhdCB3ZSBhcmUgcGFzdCBFT0YsIG5vdCB0aGF0IHdlIGFyZSBpbiBDYWNoaW5nTGV4IG1vZGUuCisgICAgcmV0dXJuICFDdXJQUExleGVyICYmICFDdXJUb2tlbkxleGVyICYmICFDdXJQVEhMZXhlciAmJgorICAgICAgICAgICAhSW5jbHVkZU1hY3JvU3RhY2suZW1wdHkoKTsKKyAgfQorCisgIHZvaWQgRW50ZXJDYWNoaW5nTGV4TW9kZSgpOworCisgIHZvaWQgRXhpdENhY2hpbmdMZXhNb2RlKCkgeworICAgIGlmIChJbkNhY2hpbmdMZXhNb2RlKCkpCisgICAgICBSZW1vdmVUb3BPZkxleGVyU3RhY2soKTsKKyAgfQorCisgIGNvbnN0IFRva2VuICZQZWVrQWhlYWQodW5zaWduZWQgTik7CisgIHZvaWQgQW5ub3RhdGVQcmV2aW91c0NhY2hlZFRva2Vucyhjb25zdCBUb2tlbiAmVG9rKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIEhhbmRsZSpEaXJlY3RpdmUgLSBpbXBsZW1lbnQgdGhlIHZhcmlvdXMgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMuICBUaGVzZQorICAvLy8gc2hvdWxkIHNpZGUtZWZmZWN0IHRoZSBjdXJyZW50IHByZXByb2Nlc3NvciBvYmplY3Qgc28gdGhhdCB0aGUgbmV4dCBjYWxsCisgIC8vLyB0byBMZXgoKSB3aWxsIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgdG9rZW4gbmV4dC4KKyAgdm9pZCBIYW5kbGVMaW5lRGlyZWN0aXZlKCk7CisgIHZvaWQgSGFuZGxlRGlnaXREaXJlY3RpdmUoVG9rZW4gJlRvayk7CisgIHZvaWQgSGFuZGxlVXNlckRpYWdub3N0aWNEaXJlY3RpdmUoVG9rZW4gJlRvaywgYm9vbCBpc1dhcm5pbmcpOworICB2b2lkIEhhbmRsZUlkZW50U0NDU0RpcmVjdGl2ZShUb2tlbiAmVG9rKTsKKyAgdm9pZCBIYW5kbGVNYWNyb1B1YmxpY0RpcmVjdGl2ZShUb2tlbiAmVG9rKTsKKyAgdm9pZCBIYW5kbGVNYWNyb1ByaXZhdGVEaXJlY3RpdmUoKTsKKworICAvLyBGaWxlIGluY2x1c2lvbi4KKyAgdm9pZCBIYW5kbGVJbmNsdWRlRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIEhhc2hMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmVG9rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlyZWN0b3J5TG9va3VwICpMb29rdXBGcm9tID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVFbnRyeSAqTG9va3VwRnJvbUZpbGUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0ltcG9ydCA9IGZhbHNlKTsKKyAgdm9pZCBIYW5kbGVJbmNsdWRlTmV4dERpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBIYXNoTG9jLCBUb2tlbiAmVG9rKTsKKyAgdm9pZCBIYW5kbGVJbmNsdWRlTWFjcm9zRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIEhhc2hMb2MsIFRva2VuICZUb2spOworICB2b2lkIEhhbmRsZUltcG9ydERpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBIYXNoTG9jLCBUb2tlbiAmVG9rKTsKKyAgdm9pZCBIYW5kbGVNaWNyb3NvZnRJbXBvcnREaXJlY3RpdmUoVG9rZW4gJlRvayk7CisKK3B1YmxpYzoKKyAgLy8vIENoZWNrIHRoYXQgdGhlIGdpdmVuIG1vZHVsZSBpcyBhdmFpbGFibGUsIHByb2R1Y2luZyBhIGRpYWdub3N0aWMgaWYgbm90LgorICAvLy8gXHJldHVybiBcYyB0cnVlIGlmIHRoZSBjaGVjayBmYWlsZWQgKGJlY2F1c2UgdGhlIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlKS4KKyAgLy8vICAgICAgICAgXGMgZmFsc2UgaWYgdGhlIG1vZHVsZSBhcHBlYXJzIHRvIGJlIHVzYWJsZS4KKyAgc3RhdGljIGJvb2wgY2hlY2tNb2R1bGVJc0F2YWlsYWJsZShjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5mbyAmVGFyZ2V0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MsIE1vZHVsZSAqTSk7CisKKyAgLy8gTW9kdWxlIGluY2x1c2lvbiB0ZXN0aW5nLgorICAvLy8gXGJyaWVmIEZpbmQgdGhlIG1vZHVsZSB0aGF0IG93bnMgdGhlIHNvdXJjZSBvciBoZWFkZXIgZmlsZSB0aGF0CisgIC8vLyBccCBMb2MgcG9pbnRzIHRvLiBJZiB0aGUgbG9jYXRpb24gaXMgaW4gYSBmaWxlIHRoYXQgd2FzIGluY2x1ZGVkCisgIC8vLyBpbnRvIGEgbW9kdWxlLCBvciBpcyBvdXRzaWRlIGFueSBtb2R1bGUsIHJldHVybnMgbnVsbHB0ci4KKyAgTW9kdWxlICpnZXRNb2R1bGVGb3JMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBMb2MpOworCisgIC8vLyBcYnJpZWYgV2Ugd2FudCB0byBwcm9kdWNlIGEgZGlhZ25vc3RpYyBhdCBsb2NhdGlvbiBJbmNMb2MgY29uY2VybmluZyBhCisgIC8vLyBtaXNzaW5nIG1vZHVsZSBpbXBvcnQuCisgIC8vLworICAvLy8gXHBhcmFtIEluY0xvYyBUaGUgbG9jYXRpb24gYXQgd2hpY2ggdGhlIG1pc3NpbmcgaW1wb3J0IHdhcyBkZXRlY3RlZC4KKyAgLy8vIFxwYXJhbSBNIFRoZSBkZXNpcmVkIG1vZHVsZS4KKyAgLy8vIFxwYXJhbSBNTG9jIEEgbG9jYXRpb24gd2l0aGluIHRoZSBkZXNpcmVkIG1vZHVsZSBhdCB3aGljaCBzb21lIGRlc2lyZWQKKyAgLy8vICAgICAgICBlZmZlY3Qgb2NjdXJyZWQgKGVnLCB3aGVyZSBhIGRlc2lyZWQgZW50aXR5IHdhcyBkZWNsYXJlZCkuCisgIC8vLworICAvLy8gXHJldHVybiBBIGZpbGUgdGhhdCBjYW4gYmUgI2luY2x1ZGVkIHRvIGltcG9ydCBhIG1vZHVsZSBjb250YWluaW5nIE1Mb2MuCisgIC8vLyAgICAgICAgIE51bGwgaWYgbm8gc3VjaCBmaWxlIGNvdWxkIGJlIGRldGVybWluZWQgb3IgaWYgYSAjaW5jbHVkZSBpcyBub3QKKyAgLy8vICAgICAgICAgYXBwcm9wcmlhdGUuCisgIGNvbnN0IEZpbGVFbnRyeSAqZ2V0TW9kdWxlSGVhZGVyVG9JbmNsdWRlRm9yRGlhZ25vc3RpY3MoU291cmNlTG9jYXRpb24gSW5jTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBNTG9jKTsKKworICBib29sIGlzUmVjb3JkaW5nUHJlYW1ibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIFByZWFtYmxlQ29uZGl0aW9uYWxTdGFjay5pc1JlY29yZGluZygpOworICB9CisKKyAgYm9vbCBoYXNSZWNvcmRlZFByZWFtYmxlKCkgY29uc3QgeworICAgIHJldHVybiBQcmVhbWJsZUNvbmRpdGlvbmFsU3RhY2suaGFzUmVjb3JkZWRQcmVhbWJsZSgpOworICB9CisKKyAgQXJyYXlSZWY8UFBDb25kaXRpb25hbEluZm8+IGdldFByZWFtYmxlQ29uZGl0aW9uYWxTdGFjaygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBQcmVhbWJsZUNvbmRpdGlvbmFsU3RhY2suZ2V0U3RhY2soKTsKKyAgfQorCisgIHZvaWQgc2V0UmVjb3JkZWRQcmVhbWJsZUNvbmRpdGlvbmFsU3RhY2soQXJyYXlSZWY8UFBDb25kaXRpb25hbEluZm8+IHMpIHsKKyAgICBQcmVhbWJsZUNvbmRpdGlvbmFsU3RhY2suc2V0U3RhY2socyk7CisgIH0KKworICB2b2lkIHNldFJlcGxheWFibGVQcmVhbWJsZUNvbmRpdGlvbmFsU3RhY2soQXJyYXlSZWY8UFBDb25kaXRpb25hbEluZm8+IHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpPcHRpb25hbDxQcmVhbWJsZVNraXBJbmZvPiBTa2lwSW5mbykgeworICAgIFByZWFtYmxlQ29uZGl0aW9uYWxTdGFjay5zdGFydFJlcGxheWluZygpOworICAgIFByZWFtYmxlQ29uZGl0aW9uYWxTdGFjay5zZXRTdGFjayhzKTsKKyAgICBQcmVhbWJsZUNvbmRpdGlvbmFsU3RhY2suU2tpcEluZm8gPSBTa2lwSW5mbzsKKyAgfQorCisgIGxsdm06Ok9wdGlvbmFsPFByZWFtYmxlU2tpcEluZm8+IGdldFByZWFtYmxlU2tpcEluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIFByZWFtYmxlQ29uZGl0aW9uYWxTdGFjay5Ta2lwSW5mbzsKKyAgfQorCitwcml2YXRlOgorICAvLy8gXGJyaWVmIEFmdGVyIHByb2Nlc3NpbmcgcHJlZGVmaW5lZCBmaWxlLCBpbml0aWFsaXplIHRoZSBjb25kaXRpb25hbCBzdGFjayBmcm9tCisgIC8vLyB0aGUgcHJlYW1ibGUuCisgIHZvaWQgcmVwbGF5UHJlYW1ibGVDb25kaXRpb25hbFN0YWNrKCk7CisKKyAgLy8gTWFjcm8gaGFuZGxpbmcuCisgIHZvaWQgSGFuZGxlRGVmaW5lRGlyZWN0aXZlKFRva2VuICZUb2ssIGJvb2wgSW1tZWRpYXRlbHlBZnRlclRvcExldmVsSWZuZGVmKTsKKyAgdm9pZCBIYW5kbGVVbmRlZkRpcmVjdGl2ZSgpOworCisgIC8vIENvbmRpdGlvbmFsIEluY2x1c2lvbi4KKyAgdm9pZCBIYW5kbGVJZmRlZkRpcmVjdGl2ZShUb2tlbiAmVG9rLCBjb25zdCBUb2tlbiAmSGFzaFRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJZm5kZWYsIGJvb2wgUmVhZEFueVRva2Vuc0JlZm9yZURpcmVjdGl2ZSk7CisgIHZvaWQgSGFuZGxlSWZEaXJlY3RpdmUoVG9rZW4gJlRvaywgY29uc3QgVG9rZW4gJkhhc2hUb2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJlYWRBbnlUb2tlbnNCZWZvcmVEaXJlY3RpdmUpOworICB2b2lkIEhhbmRsZUVuZGlmRGlyZWN0aXZlKFRva2VuICZUb2spOworICB2b2lkIEhhbmRsZUVsc2VEaXJlY3RpdmUoVG9rZW4gJlRvaywgY29uc3QgVG9rZW4gJkhhc2hUb2tlbik7CisgIHZvaWQgSGFuZGxlRWxpZkRpcmVjdGl2ZShUb2tlbiAmVG9rLCBjb25zdCBUb2tlbiAmSGFzaFRva2VuKTsKKworICAvLyBQcmFnbWFzLgorICB2b2lkIEhhbmRsZVByYWdtYURpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBJbnRyb2R1Y2VyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyKTsKKworcHVibGljOgorICB2b2lkIEhhbmRsZVByYWdtYU9uY2UoVG9rZW4gJk9uY2VUb2spOworICB2b2lkIEhhbmRsZVByYWdtYU1hcmsoKTsKKyAgdm9pZCBIYW5kbGVQcmFnbWFQb2lzb24oKTsKKyAgdm9pZCBIYW5kbGVQcmFnbWFTeXN0ZW1IZWFkZXIoVG9rZW4gJlN5c0hlYWRlclRvayk7CisgIHZvaWQgSGFuZGxlUHJhZ21hRGVwZW5kZW5jeShUb2tlbiAmRGVwZW5kZW5jeVRvayk7CisgIHZvaWQgSGFuZGxlUHJhZ21hUHVzaE1hY3JvKFRva2VuICZUb2spOworICB2b2lkIEhhbmRsZVByYWdtYVBvcE1hY3JvKFRva2VuICZUb2spOworICB2b2lkIEhhbmRsZVByYWdtYUluY2x1ZGVBbGlhcyhUb2tlbiAmVG9rKTsKKyAgdm9pZCBIYW5kbGVQcmFnbWFNb2R1bGVCdWlsZChUb2tlbiAmVG9rKTsKKyAgSWRlbnRpZmllckluZm8gKlBhcnNlUHJhZ21hUHVzaE9yUG9wTWFjcm8oVG9rZW4gJlRvayk7CisKKyAgLy8gUmV0dXJuIHRydWUgYW5kIHN0b3JlIHRoZSBmaXJzdCB0b2tlbiBvbmx5IGlmIGFueSBDb21tZW50SGFuZGxlcgorICAvLyBoYXMgaW5zZXJ0ZWQgc29tZSB0b2tlbnMgYW5kIGdldENvbW1lbnRSZXRlbnRpb25TdGF0ZSgpIGlzIGZhbHNlLgorICBib29sIEhhbmRsZUNvbW1lbnQoVG9rZW4gJlRva2VuLCBTb3VyY2VSYW5nZSBDb21tZW50KTsKKworICAvLy8gXGJyaWVmIEEgbWFjcm8gaXMgdXNlZCwgdXBkYXRlIGluZm9ybWF0aW9uIGFib3V0IG1hY3JvcyB0aGF0IG5lZWQgdW51c2VkCisgIC8vLyB3YXJuaW5ncy4KKyAgdm9pZCBtYXJrTWFjcm9Bc1VzZWQoTWFjcm9JbmZvICpNSSk7Cit9OworCisvLy8gXGJyaWVmIEFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCBkZXNjcmliZXMgYSBoYW5kbGVyIHRoYXQgd2lsbCByZWNlaXZlCisvLy8gc291cmNlIHJhbmdlcyBmb3IgZWFjaCBvZiB0aGUgY29tbWVudHMgZW5jb3VudGVyZWQgaW4gdGhlIHNvdXJjZSBmaWxlLgorY2xhc3MgQ29tbWVudEhhbmRsZXIgeworcHVibGljOgorICB2aXJ0dWFsIH5Db21tZW50SGFuZGxlcigpOworCisgIC8vIFRoZSBoYW5kbGVyIHNoYWxsIHJldHVybiB0cnVlIGlmIGl0IGhhcyBwdXNoZWQgYW55IHRva2VucworICAvLyB0byBiZSByZWFkIHVzaW5nIGUuZy4gRW50ZXJUb2tlbiBvciBFbnRlclRva2VuU3RyZWFtLgorICB2aXJ0dWFsIGJvb2wgSGFuZGxlQ29tbWVudChQcmVwcm9jZXNzb3IgJlBQLCBTb3VyY2VSYW5nZSBDb21tZW50KSA9IDA7Cit9OworCisvLy8gXGJyaWVmIFJlZ2lzdHJ5IG9mIHByYWdtYSBoYW5kbGVycyBhZGRlZCBieSBwbHVnaW5zCit1c2luZyBQcmFnbWFIYW5kbGVyUmVnaXN0cnkgPSBsbHZtOjpSZWdpc3RyeTxQcmFnbWFIYW5kbGVyPjsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfTEVYX1BSRVBST0NFU1NPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvUHJlcHJvY2Vzc29yTGV4ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9QcmVwcm9jZXNzb3JMZXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNzFkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvUHJlcHJvY2Vzc29yTGV4ZXIuaApAQCAtMCwwICsxLDE4OCBAQAorLy89PT0tIFByZXByb2Nlc3NvckxleGVyLmggLSBDIExhbmd1YWdlIEZhbWlseSBMZXhlciAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgUHJlcHJvY2Vzc29yTGV4ZXIgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19MRVhfUFJFUFJPQ0VTU09STEVYRVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX0xFWF9QUkVQUk9DRVNTT1JMRVhFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9MZXgvTXVsdGlwbGVJbmNsdWRlT3B0LmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L1Rva2VuLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgRmlsZUVudHJ5OworY2xhc3MgUHJlcHJvY2Vzc29yOworCitjbGFzcyBQcmVwcm9jZXNzb3JMZXhlciB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgUHJlcHJvY2Vzc29yOworCisgIC8vIFByZXByb2Nlc3NvciBvYmplY3QgY29udHJvbGxpbmcgbGV4aW5nLgorICBQcmVwcm9jZXNzb3IgKlBQID0gbnVsbHB0cjsKKworICAvLy8gVGhlIFNvdXJjZU1hbmFnZXIgRmlsZUlEIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpbGUgYmVpbmcgbGV4ZWQuCisgIGNvbnN0IEZpbGVJRCBGSUQ7CisKKyAgLy8vIFxicmllZiBOdW1iZXIgb2YgU0xvY0VudHJpZXMgYmVmb3JlIGxleGluZyB0aGUgZmlsZS4KKyAgdW5zaWduZWQgSW5pdGlhbE51bVNMb2NFbnRyaWVzID0gMDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQ29udGV4dC1zcGVjaWZpYyBsZXhpbmcgZmxhZ3Mgc2V0IGJ5IHRoZSBwcmVwcm9jZXNzb3IuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgVHJ1ZSB3aGVuIHBhcnNpbmcgXCNYWFg7IHR1cm5zICdcXG4nIGludG8gYSB0b2s6OmVvZCB0b2tlbi4KKyAgYm9vbCBQYXJzaW5nUHJlcHJvY2Vzc29yRGlyZWN0aXZlID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBUcnVlIGFmdGVyIFwjaW5jbHVkZTsgdHVybnMgXDx4eD4gaW50byBhIHRvazo6YW5nbGVfc3RyaW5nX2xpdGVyYWwKKyAgLy8vIHRva2VuLgorICBib29sIFBhcnNpbmdGaWxlbmFtZSA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiBpbiByYXcgbW9kZS4KKyAgLy8vCisgIC8vLyBSYXcgbW9kZSBkaXNhYmxlcyBpbnRlcnByZXRhdGlvbiBvZiB0b2tlbnMgYW5kIGlzIGEgZmFyIGZhc3RlciBtb2RlIHRvCisgIC8vLyBsZXggaW4gdGhhbiBub24tcmF3LW1vZGUuICBUaGlzIGZsYWc6CisgIC8vLyAgMS4gSWYgRU9GIG9mIHRoZSBjdXJyZW50IGxleGVyIGlzIGZvdW5kLCB0aGUgaW5jbHVkZSBzdGFjayBpc24ndCBwb3BwZWQuCisgIC8vLyAgMi4gSWRlbnRpZmllciBpbmZvcm1hdGlvbiBpcyBub3QgbG9va2VkIHVwIGZvciBpZGVudGlmaWVyIHRva2Vucy4gIEFzIGFuCisgIC8vLyAgICAgZWZmZWN0IG9mIHRoaXMsIGltcGxpY2l0IG1hY3JvIGV4cGFuc2lvbiBpcyBuYXR1cmFsbHkgZGlzYWJsZWQuCisgIC8vLyAgMy4gIiMiIHRva2VucyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lIGFyZSB0cmVhdGVkIGFzIG5vcm1hbCB0b2tlbnMsIG5vdAorICAvLy8gICAgIGltcGxpY2l0bHkgdHJhbnNmb3JtZWQgYnkgdGhlIGxleGVyLgorICAvLy8gIDQuIEFsbCBkaWFnbm9zdGljIG1lc3NhZ2VzIGFyZSBkaXNhYmxlZC4KKyAgLy8vICA1LiBObyBjYWxsYmFja3MgYXJlIG1hZGUgaW50byB0aGUgcHJlcHJvY2Vzc29yLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBpbiByYXcgbW9kZSB0aGF0IHRoZSBQUCBwb2ludGVyIG1heSBiZSBudWxsLgorICBib29sIExleGluZ1Jhd01vZGUgPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIEEgc3RhdGUgbWFjaGluZSB0aGF0IGRldGVjdHMgdGhlIFwjaWZuZGVmLXdyYXBwaW5nIGEgZmlsZQorICAvLy8gaWRpb20gZm9yIHRoZSBtdWx0aXBsZS1pbmNsdWRlIG9wdGltaXphdGlvbi4KKyAgTXVsdGlwbGVJbmNsdWRlT3B0IE1JT3B0OworCisgIC8vLyBcYnJpZWYgSW5mb3JtYXRpb24gYWJvdXQgdGhlIHNldCBvZiBcI2lmL1wjaWZkZWYvXCNpZm5kZWYgYmxvY2tzCisgIC8vLyB3ZSBhcmUgY3VycmVudGx5IGluLgorICBTbWFsbFZlY3RvcjxQUENvbmRpdGlvbmFsSW5mbywgND4gQ29uZGl0aW9uYWxTdGFjazsKKworICBQcmVwcm9jZXNzb3JMZXhlcigpIDogRklEKCkge30KKyAgUHJlcHJvY2Vzc29yTGV4ZXIoUHJlcHJvY2Vzc29yICpwcCwgRmlsZUlEIGZpZCk7CisgIHZpcnR1YWwgflByZXByb2Nlc3NvckxleGVyKCkgPSBkZWZhdWx0OworCisgIHZpcnR1YWwgdm9pZCBJbmRpcmVjdExleChUb2tlbiYgUmVzdWx0KSA9IDA7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHNvdXJjZSBsb2NhdGlvbiBmb3IgdGhlIG5leHQgb2JzZXJ2YWJsZSBsb2NhdGlvbi4KKyAgdmlydHVhbCBTb3VyY2VMb2NhdGlvbiBnZXRTb3VyY2VMb2NhdGlvbigpID0gMDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gI2lmIGRpcmVjdGl2ZSBoYW5kbGluZy4KKworICAvLy8gcHVzaENvbmRpdGlvbmFsTGV2ZWwgLSBXaGVuIHdlIGVudGVyIGEgXCNpZiBkaXJlY3RpdmUsIHRoaXMga2VlcHMgdHJhY2sgb2YKKyAgLy8vIHdoYXQgd2UgYXJlIGN1cnJlbnRseSBpbiBmb3IgZGlhZ25vc3RpYyBlbWlzc2lvbiAoZS5nLiBcI2lmIHdpdGggbWlzc2luZworICAvLy8gXCNlbmRpZikuCisgIHZvaWQgcHVzaENvbmRpdGlvbmFsTGV2ZWwoU291cmNlTG9jYXRpb24gRGlyZWN0aXZlU3RhcnQsIGJvb2wgV2FzU2tpcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBGb3VuZE5vblNraXAsIGJvb2wgRm91bmRFbHNlKSB7CisgICAgUFBDb25kaXRpb25hbEluZm8gQ0k7CisgICAgQ0kuSWZMb2MgPSBEaXJlY3RpdmVTdGFydDsKKyAgICBDSS5XYXNTa2lwcGluZyA9IFdhc1NraXBwaW5nOworICAgIENJLkZvdW5kTm9uU2tpcCA9IEZvdW5kTm9uU2tpcDsKKyAgICBDSS5Gb3VuZEVsc2UgPSBGb3VuZEVsc2U7CisgICAgQ29uZGl0aW9uYWxTdGFjay5wdXNoX2JhY2soQ0kpOworICB9CisgIHZvaWQgcHVzaENvbmRpdGlvbmFsTGV2ZWwoY29uc3QgUFBDb25kaXRpb25hbEluZm8gJkNJKSB7CisgICAgQ29uZGl0aW9uYWxTdGFjay5wdXNoX2JhY2soQ0kpOworICB9CisKKyAgLy8vIHBvcENvbmRpdGlvbmFsTGV2ZWwgLSBSZW1vdmUgYW4gZW50cnkgb2ZmIHRoZSB0b3Agb2YgdGhlIGNvbmRpdGlvbmFsCisgIC8vLyBzdGFjaywgcmV0dXJuaW5nIGluZm9ybWF0aW9uIGFib3V0IGl0LiAgSWYgdGhlIGNvbmRpdGlvbmFsIHN0YWNrIGlzIGVtcHR5LAorICAvLy8gdGhpcyByZXR1cm5zIHRydWUgYW5kIGRvZXMgbm90IGZpbGwgaW4gdGhlIGFyZ3VtZW50cy4KKyAgYm9vbCBwb3BDb25kaXRpb25hbExldmVsKFBQQ29uZGl0aW9uYWxJbmZvICZDSSkgeworICAgIGlmIChDb25kaXRpb25hbFN0YWNrLmVtcHR5KCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBDSSA9IENvbmRpdGlvbmFsU3RhY2sucG9wX2JhY2tfdmFsKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHRvcCBvZiB0aGUgY29uZGl0aW9uYWwgc3RhY2suCisgIC8vLyBccHJlIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGVyZSBiZSBhIGNvbmRpdGlvbmFsIGFjdGl2ZS4KKyAgUFBDb25kaXRpb25hbEluZm8gJnBlZWtDb25kaXRpb25hbExldmVsKCkgeworICAgIGFzc2VydCghQ29uZGl0aW9uYWxTdGFjay5lbXB0eSgpICYmICJObyBjb25kaXRpb25hbHMgYWN0aXZlISIpOworICAgIHJldHVybiBDb25kaXRpb25hbFN0YWNrLmJhY2soKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldENvbmRpdGlvbmFsU3RhY2tEZXB0aCgpIGNvbnN0IHsgcmV0dXJuIENvbmRpdGlvbmFsU3RhY2suc2l6ZSgpOyB9CisKK3B1YmxpYzoKKyAgUHJlcHJvY2Vzc29yTGV4ZXIoY29uc3QgUHJlcHJvY2Vzc29yTGV4ZXIgJikgPSBkZWxldGU7CisgIFByZXByb2Nlc3NvckxleGVyICZvcGVyYXRvcj0oY29uc3QgUHJlcHJvY2Vzc29yTGV4ZXIgJikgPSBkZWxldGU7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE1pc2MuIGxleGluZyBtZXRob2RzLgorCisgIC8vLyBcYnJpZWYgQWZ0ZXIgdGhlIHByZXByb2Nlc3NvciBoYXMgcGFyc2VkIGEgXCNpbmNsdWRlLCBsZXggYW5kCisgIC8vLyAocG90ZW50aWFsbHkpIG1hY3JvIGV4cGFuZCB0aGUgZmlsZW5hbWUuCisgIC8vLworICAvLy8gSWYgdGhlIHNlcXVlbmNlIHBhcnNlZCBpcyBub3QgbGV4aWNhbGx5IGxlZ2FsLCBlbWl0IGEgZGlhZ25vc3RpYyBhbmQKKyAgLy8vIHJldHVybiBhIHJlc3VsdCBFT0QgdG9rZW4uCisgIHZvaWQgTGV4SW5jbHVkZUZpbGVuYW1lKFRva2VuICZSZXN1bHQpOworCisgIC8vLyBcYnJpZWYgSW5mb3JtIHRoZSBsZXhlciB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgY3VycmVudGx5IGxleGluZyBhCisgIC8vLyBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlLgorICB2b2lkIHNldFBhcnNpbmdQcmVwcm9jZXNzb3JEaXJlY3RpdmUoYm9vbCBmKSB7CisgICAgUGFyc2luZ1ByZXByb2Nlc3NvckRpcmVjdGl2ZSA9IGY7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgbGV4ZXIgaXMgaW4gcmF3IG1vZGUgb3Igbm90LgorICBib29sIGlzTGV4aW5nUmF3TW9kZSgpIGNvbnN0IHsgcmV0dXJuIExleGluZ1Jhd01vZGU7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgcHJlcHJvY2Vzc29yIG9iamVjdCBmb3IgdGhpcyBsZXhlci4KKyAgUHJlcHJvY2Vzc29yICpnZXRQUCgpIGNvbnN0IHsgcmV0dXJuIFBQOyB9CisKKyAgRmlsZUlEIGdldEZpbGVJRCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoUFAgJiYKKyAgICAgICJQcmVwcm9jZXNzb3JMZXhlcjo6Z2V0RmlsZUlEKCkgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIGEgUHJlcHJvY2Vzc29yIik7CisgICAgcmV0dXJuIEZJRDsKKyAgfQorCisgIC8vLyBcYnJpZWYgTnVtYmVyIG9mIFNMb2NFbnRyaWVzIGJlZm9yZSBsZXhpbmcgdGhlIGZpbGUuCisgIHVuc2lnbmVkIGdldEluaXRpYWxOdW1TTG9jRW50cmllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5pdGlhbE51bVNMb2NFbnRyaWVzOworICB9CisKKyAgLy8vIGdldEZpbGVFbnRyeSAtIFJldHVybiB0aGUgRmlsZUVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBGaWxlSUQuICBMaWtlCisgIC8vLyBnZXRGaWxlSUQoKSwgdGhpcyBvbmx5IHdvcmtzIGZvciBsZXhlcnMgd2l0aCBhdHRhY2hlZCBwcmVwcm9jZXNzb3JzLgorICBjb25zdCBGaWxlRW50cnkgKmdldEZpbGVFbnRyeSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgSXRlcmF0b3IgdGhhdCB0cmF2ZXJzZXMgdGhlIGN1cnJlbnQgc3RhY2sgb2YgcHJlcHJvY2Vzc29yCisgIC8vLyBjb25kaXRpb25hbCBkaXJlY3RpdmVzIChcI2lmL1wjaWZkZWYvXCNpZm5kZWYpLgorICB1c2luZyBjb25kaXRpb25hbF9pdGVyYXRvciA9CisgICAgICBTbWFsbFZlY3RvckltcGw8UFBDb25kaXRpb25hbEluZm8+Ojpjb25zdF9pdGVyYXRvcjsKKworICBjb25kaXRpb25hbF9pdGVyYXRvciBjb25kaXRpb25hbF9iZWdpbigpIGNvbnN0IHsgCisgICAgcmV0dXJuIENvbmRpdGlvbmFsU3RhY2suYmVnaW4oKTsgCisgIH0KKworICBjb25kaXRpb25hbF9pdGVyYXRvciBjb25kaXRpb25hbF9lbmQoKSBjb25zdCB7IAorICAgIHJldHVybiBDb25kaXRpb25hbFN0YWNrLmVuZCgpOyAKKyAgfQorCisgIHZvaWQgc2V0Q29uZGl0aW9uYWxMZXZlbHMoQXJyYXlSZWY8UFBDb25kaXRpb25hbEluZm8+IENMKSB7CisgICAgQ29uZGl0aW9uYWxTdGFjay5jbGVhcigpOworICAgIENvbmRpdGlvbmFsU3RhY2suYXBwZW5kKENMLmJlZ2luKCksIENMLmVuZCgpKTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfTEVYX1BSRVBST0NFU1NPUkxFWEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9QcmVwcm9jZXNzb3JPcHRpb25zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvUHJlcHJvY2Vzc29yT3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZmMzMDUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvUHJlcHJvY2Vzc29yT3B0aW9ucy5oCkBAIC0wLDAgKzEsMTk3IEBACisvLz09PS0gUHJlcHJvY2Vzc29yT3B0aW9ucy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfTEVYX1BSRVBST0NFU1NPUk9QVElPTlNfSF8KKyNkZWZpbmUgTExWTV9DTEFOR19MRVhfUFJFUFJPQ0VTU09ST1BUSU9OU19IXworCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorI2luY2x1ZGUgPG1lbW9yeT4gCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNZW1vcnlCdWZmZXI7CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBFbnVtZXJhdGUgdGhlIGtpbmRzIG9mIHN0YW5kYXJkIGxpYnJhcnkgdGhhdCAKK2VudW0gT2JqQ1hYQVJDU3RhbmRhcmRMaWJyYXJ5S2luZCB7CisgIEFSQ1hYX25vbGliLAorCisgIC8vLyBcYnJpZWYgbGliYysrCisgIEFSQ1hYX2xpYmN4eCwKKworICAvLy8gXGJyaWVmIGxpYnN0ZGMrKworICBBUkNYWF9saWJzdGRjeHgKK307CisgIAorLy8vIFByZXByb2Nlc3Nvck9wdGlvbnMgLSBUaGlzIGNsYXNzIGlzIHVzZWQgZm9yIHBhc3NpbmcgdGhlIHZhcmlvdXMgb3B0aW9ucworLy8vIHVzZWQgaW4gcHJlcHJvY2Vzc29yIGluaXRpYWxpemF0aW9uIHRvIEluaXRpYWxpemVQcmVwcm9jZXNzb3IoKS4KK2NsYXNzIFByZXByb2Nlc3Nvck9wdGlvbnMgeworcHVibGljOgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGJvb2wvKmlzVW5kZWYqLz4+IE1hY3JvczsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEluY2x1ZGVzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTWFjcm9JbmNsdWRlczsKKworICAvLy8gXGJyaWVmIEluaXRpYWxpemUgdGhlIHByZXByb2Nlc3NvciB3aXRoIHRoZSBjb21waWxlciBhbmQgdGFyZ2V0IHNwZWNpZmljCisgIC8vLyBwcmVkZWZpbmVzLgorICBib29sIFVzZVByZWRlZmluZXMgPSB0cnVlOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB3ZSBzaG91bGQgbWFpbnRhaW4gYSBkZXRhaWxlZCByZWNvcmQgb2YgYWxsIG1hY3JvCisgIC8vLyBkZWZpbml0aW9ucyBhbmQgZXhwYW5zaW9ucy4KKyAgYm9vbCBEZXRhaWxlZFJlY29yZCA9IGZhbHNlOworCisgIC8vLyBUaGUgaW1wbGljaXQgUENIIGluY2x1ZGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgdHJhbnNsYXRpb24gdW5pdCwgb3IgZW1wdHkuCisgIHN0ZDo6c3RyaW5nIEltcGxpY2l0UENISW5jbHVkZTsKKworICAvLy8gXGJyaWVmIEhlYWRlcnMgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBjaGFpbmVkIFBDSHMgaW4gbWVtb3J5LgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ2hhaW5lZEluY2x1ZGVzOworCisgIC8vLyBcYnJpZWYgV2hlbiB0cnVlLCBkaXNhYmxlcyBtb3N0IG9mIHRoZSBub3JtYWwgdmFsaWRhdGlvbiBwZXJmb3JtZWQgb24KKyAgLy8vIHByZWNvbXBpbGVkIGhlYWRlcnMuCisgIGJvb2wgRGlzYWJsZVBDSFZhbGlkYXRpb24gPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIFdoZW4gdHJ1ZSwgYSBQQ0ggd2l0aCBjb21waWxlciBlcnJvcnMgd2lsbCBub3QgYmUgcmVqZWN0ZWQuCisgIGJvb2wgQWxsb3dQQ0hXaXRoQ29tcGlsZXJFcnJvcnMgPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIER1bXAgZGVjbGFyYXRpb25zIHRoYXQgYXJlIGRlc2VyaWFsaXplZCBmcm9tIFBDSCwgZm9yIHRlc3RpbmcuCisgIGJvb2wgRHVtcERlc2VyaWFsaXplZFBDSERlY2xzID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBUaGlzIGlzIGEgc2V0IG9mIG5hbWVzIGZvciBkZWNscyB0aGF0IHdlIGRvIG5vdCB3YW50IHRvIGJlCisgIC8vLyBkZXNlcmlhbGl6ZWQsIGFuZCB3ZSBlbWl0IGFuIGVycm9yIGlmIHRoZXkgYXJlOyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IERlc2VyaWFsaXplZFBDSERlY2xzVG9FcnJvck9uOworCisgIC8vLyBcYnJpZWYgSWYgbm9uLXplcm8sIHRoZSBpbXBsaWNpdCBQQ0ggaW5jbHVkZSBpcyBhY3R1YWxseSBhIHByZWNvbXBpbGVkCisgIC8vLyBwcmVhbWJsZSB0aGF0IGNvdmVycyB0aGlzIG51bWJlciBvZiBieXRlcyBpbiB0aGUgbWFpbiBzb3VyY2UgZmlsZS4KKyAgLy8vCisgIC8vLyBUaGUgYm9vbGVhbiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJlYW1ibGUgZW5kcyBhdCB0aGUgc3RhcnQgb2YgYSBuZXcKKyAgLy8vIGxpbmUuCisgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgYm9vbD4gUHJlY29tcGlsZWRQcmVhbWJsZUJ5dGVzOworCisgIC8vLyBcYnJpZWYgVHJ1ZSBpbmRpY2F0ZXMgdGhhdCBhIHByZWFtYmxlIGlzIGJlaW5nIGdlbmVyYXRlZC4KKyAgLy8vCisgIC8vLyBXaGVuIHRoZSBsZXhlciBpcyBkb25lLCBvbmUgb2YgdGhlIHRoaW5ncyB0aGF0IG5lZWQgdG8gYmUgcHJlc2VydmVkIGlzIHRoZQorICAvLy8gY29uZGl0aW9uYWwgI2lmIHN0YWNrLCBzbyB0aGUgQVNUV3JpdGVyL0FTVFJlYWRlciBjYW4gc2F2ZS9yZXN0b3JlIGl0IHdoZW4KKyAgLy8vIHByb2Nlc3NpbmcgdGhlIHJlc3Qgb2YgdGhlIGZpbGUuCisgIGJvb2wgR2VuZXJhdGVQcmVhbWJsZSA9IGZhbHNlOworCisgIC8vLyBUaGUgaW1wbGljaXQgUFRIIGlucHV0IGluY2x1ZGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgdHJhbnNsYXRpb24gdW5pdCwgb3IKKyAgLy8vIGVtcHR5LgorICBzdGQ6OnN0cmluZyBJbXBsaWNpdFBUSEluY2x1ZGU7CisKKyAgLy8vIElmIGdpdmVuLCBhIFBUSCBjYWNoZSBmaWxlIHRvIHVzZSBmb3Igc3BlZWRpbmcgdXAgaGVhZGVyIHBhcnNpbmcuCisgIHN0ZDo6c3RyaW5nIFRva2VuQ2FjaGU7CisKKyAgLy8vIFdoZW4gZW5hYmxlZCwgcHJlcHJvY2Vzc29yIGlzIGluIGEgbW9kZSBmb3IgcGFyc2luZyBhIHNpbmdsZSBmaWxlIG9ubHkuCisgIC8vLworICAvLy8gRGlzYWJsZXMgI2luY2x1ZGVzIG9mIG90aGVyIGZpbGVzIGFuZCBpZiB0aGVyZSBhcmUgdW5yZXNvbHZlZCBpZGVudGlmaWVycworICAvLy8gaW4gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSBjb25kaXRpb25zIGl0IGNhdXNlcyBhbGwgYmxvY2tzIHRvIGJlIHBhcnNlZCBzbworICAvLy8gdGhhdCB0aGUgY2xpZW50IGNhbiBnZXQgdGhlIG1heGltdW0gYW1vdW50IG9mIGluZm9ybWF0aW9uIGZyb20gdGhlIHBhcnNlci4KKyAgYm9vbCBTaW5nbGVGaWxlUGFyc2VNb2RlID0gZmFsc2U7CisKKyAgLy8vIFdoZW4gZW5hYmxlZCwgdGhlIHByZXByb2Nlc3NvciB3aWxsIGNvbnN0cnVjdCBlZGl0b3IgcGxhY2Vob2xkZXIgdG9rZW5zLgorICBib29sIExleEVkaXRvclBsYWNlaG9sZGVycyA9IHRydWU7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoZSBTb3VyY2VNYW5hZ2VyIHNob3VsZCByZXBvcnQgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZSBmb3IKKyAgLy8vIGNvbnRlbnRzIG9mIGZpbGVzIHRoYXQgd2VyZSByZW1hcHBlZCB0byBvdGhlciBmaWxlcy4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgYm9vbCBSZW1hcHBlZEZpbGVzS2VlcE9yaWdpbmFsTmFtZSA9IHRydWU7CisKKyAgLy8vIFxicmllZiBUaGUgc2V0IG9mIGZpbGUgcmVtYXBwaW5ncywgd2hpY2ggdGFrZSBleGlzdGluZyBmaWxlcyBvbgorICAvLy8gdGhlIHN5c3RlbSAodGhlIGZpcnN0IHBhcnQgb2YgZWFjaCBwYWlyKSBhbmQgZ2l2ZXMgdGhlbSB0aGUKKyAgLy8vIGNvbnRlbnRzIG9mIG90aGVyIGZpbGVzIG9uIHRoZSBzeXN0ZW0gKHRoZSBzZWNvbmQgcGFydCBvZiBlYWNoCisgIC8vLyBwYWlyKS4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IFJlbWFwcGVkRmlsZXM7CisKKyAgLy8vIFxicmllZiBUaGUgc2V0IG9mIGZpbGUtdG8tYnVmZmVyIHJlbWFwcGluZ3MsIHdoaWNoIHRha2UgZXhpc3RpbmcgZmlsZXMKKyAgLy8vIG9uIHRoZSBzeXN0ZW0gKHRoZSBmaXJzdCBwYXJ0IG9mIGVhY2ggcGFpcikgYW5kIGdpdmVzIHRoZW0gdGhlIGNvbnRlbnRzCisgIC8vLyBvZiB0aGUgc3BlY2lmaWVkIG1lbW9yeSBidWZmZXIgKHRoZSBzZWNvbmQgcGFydCBvZiBlYWNoIHBhaXIpLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGxsdm06Ok1lbW9yeUJ1ZmZlciAqPj4gUmVtYXBwZWRGaWxlQnVmZmVyczsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhlIGNvbXBpbGVyIGluc3RhbmNlIHNob3VsZCByZXRhaW4gKGkuZS4sIG5vdCBmcmVlKQorICAvLy8gdGhlIGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoIHJlbWFwcGVkIGZpbGVzLgorICAvLy8KKyAgLy8vIFRoaXMgZmxhZyBkZWZhdWx0cyB0byBmYWxzZTsgaXQgY2FuIGJlIHNldCB0cnVlIG9ubHkgdGhyb3VnaCBkaXJlY3QKKyAgLy8vIG1hbmlwdWxhdGlvbiBvZiB0aGUgY29tcGlsZXIgaW52b2NhdGlvbiBvYmplY3QsIGluIGNhc2VzIHdoZXJlIHRoZSAKKyAgLy8vIGNvbXBpbGVyIGludm9jYXRpb24gYW5kIGl0cyBidWZmZXJzIHdpbGwgYmUgcmV1c2VkLgorICBib29sIFJldGFpblJlbWFwcGVkRmlsZUJ1ZmZlcnMgPSBmYWxzZTsKKyAgCisgIC8vLyBcYnJpZWYgVGhlIE9iamVjdGl2ZS1DKysgQVJDIHN0YW5kYXJkIGxpYnJhcnkgdGhhdCB3ZSBzaG91bGQgc3VwcG9ydCwKKyAgLy8vIGJ5IHByb3ZpZGluZyBhcHByb3ByaWF0ZSBkZWZpbml0aW9ucyB0byByZXRyb2ZpdCB0aGUgc3RhbmRhcmQgbGlicmFyeQorICAvLy8gd2l0aCBzdXBwb3J0IGZvciBsaWZldGltZS1xdWFsaWZpZWQgcG9pbnRlcnMuCisgIE9iakNYWEFSQ1N0YW5kYXJkTGlicmFyeUtpbmQgT2JqQ1hYQVJDU3RhbmRhcmRMaWJyYXJ5ID0gQVJDWFhfbm9saWI7CisgICAgCisgIC8vLyBcYnJpZWYgUmVjb3JkcyB0aGUgc2V0IG9mIG1vZHVsZXMKKyAgY2xhc3MgRmFpbGVkTW9kdWxlc1NldCB7CisgICAgbGx2bTo6U3RyaW5nU2V0PD4gRmFpbGVkOworCisgIHB1YmxpYzoKKyAgICBib29sIGhhc0FscmVhZHlGYWlsZWQoU3RyaW5nUmVmIG1vZHVsZSkgeworICAgICAgcmV0dXJuIEZhaWxlZC5jb3VudChtb2R1bGUpID4gMDsKKyAgICB9CisKKyAgICB2b2lkIGFkZEZhaWxlZChTdHJpbmdSZWYgbW9kdWxlKSB7CisgICAgICBGYWlsZWQuaW5zZXJ0KG1vZHVsZSk7CisgICAgfQorICB9OworICAKKyAgLy8vIFxicmllZiBUaGUgc2V0IG9mIG1vZHVsZXMgdGhhdCBmYWlsZWQgdG8gYnVpbGQuCisgIC8vLworICAvLy8gVGhpcyBwb2ludGVyIHdpbGwgYmUgc2hhcmVkIGFtb25nIGFsbCBvZiB0aGUgY29tcGlsZXIgaW5zdGFuY2VzIGNyZWF0ZWQKKyAgLy8vIHRvIChyZSlidWlsZCBtb2R1bGVzLCBzbyB0aGF0IG9uY2UgYSBtb2R1bGUgZmFpbHMgdG8gYnVpbGQgYW55d2hlcmUsCisgIC8vLyBvdGhlciBpbnN0YW5jZXMgd2lsbCBzZWUgdGhhdCB0aGUgbW9kdWxlIGhhcyBmYWlsZWQgYW5kIHdvbid0IHRyeSB0bworICAvLy8gYnVpbGQgaXQgYWdhaW4uCisgIHN0ZDo6c2hhcmVkX3B0cjxGYWlsZWRNb2R1bGVzU2V0PiBGYWlsZWRNb2R1bGVzOworCitwdWJsaWM6CisgIFByZXByb2Nlc3Nvck9wdGlvbnMoKSA6IFByZWNvbXBpbGVkUHJlYW1ibGVCeXRlcygwLCBmYWxzZSkge30KKworICB2b2lkIGFkZE1hY3JvRGVmKFN0cmluZ1JlZiBOYW1lKSB7IE1hY3Jvcy5lbXBsYWNlX2JhY2soTmFtZSwgZmFsc2UpOyB9CisgIHZvaWQgYWRkTWFjcm9VbmRlZihTdHJpbmdSZWYgTmFtZSkgeyBNYWNyb3MuZW1wbGFjZV9iYWNrKE5hbWUsIHRydWUpOyB9CisKKyAgdm9pZCBhZGRSZW1hcHBlZEZpbGUoU3RyaW5nUmVmIEZyb20sIFN0cmluZ1JlZiBUbykgeworICAgIFJlbWFwcGVkRmlsZXMuZW1wbGFjZV9iYWNrKEZyb20sIFRvKTsKKyAgfQorCisgIHZvaWQgYWRkUmVtYXBwZWRGaWxlKFN0cmluZ1JlZiBGcm9tLCBsbHZtOjpNZW1vcnlCdWZmZXIgKlRvKSB7CisgICAgUmVtYXBwZWRGaWxlQnVmZmVycy5lbXBsYWNlX2JhY2soRnJvbSwgVG8pOworICB9CisKKyAgdm9pZCBjbGVhclJlbWFwcGVkRmlsZXMoKSB7CisgICAgUmVtYXBwZWRGaWxlcy5jbGVhcigpOworICAgIFJlbWFwcGVkRmlsZUJ1ZmZlcnMuY2xlYXIoKTsKKyAgfQorICAKKyAgLy8vIFxicmllZiBSZXNldCBhbnkgb3B0aW9ucyB0aGF0IGFyZSBub3QgY29uc2lkZXJlZCB3aGVuIGJ1aWxkaW5nIGEKKyAgLy8vIG1vZHVsZS4KKyAgdm9pZCByZXNldE5vbk1vZHVsYXJPcHRpb25zKCkgeworICAgIEluY2x1ZGVzLmNsZWFyKCk7CisgICAgTWFjcm9JbmNsdWRlcy5jbGVhcigpOworICAgIENoYWluZWRJbmNsdWRlcy5jbGVhcigpOworICAgIER1bXBEZXNlcmlhbGl6ZWRQQ0hEZWNscyA9IGZhbHNlOworICAgIEltcGxpY2l0UENISW5jbHVkZS5jbGVhcigpOworICAgIEltcGxpY2l0UFRISW5jbHVkZS5jbGVhcigpOworICAgIFRva2VuQ2FjaGUuY2xlYXIoKTsKKyAgICBTaW5nbGVGaWxlUGFyc2VNb2RlID0gZmFsc2U7CisgICAgTGV4RWRpdG9yUGxhY2Vob2xkZXJzID0gdHJ1ZTsKKyAgICBSZXRhaW5SZW1hcHBlZEZpbGVCdWZmZXJzID0gdHJ1ZTsKKyAgICBQcmVjb21waWxlZFByZWFtYmxlQnl0ZXMuZmlyc3QgPSAwOworICAgIFByZWNvbXBpbGVkUHJlYW1ibGVCeXRlcy5zZWNvbmQgPSBmYWxzZTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfTEVYX1BSRVBST0NFU1NPUk9QVElPTlNfSF8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9TY3JhdGNoQnVmZmVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvU2NyYXRjaEJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZDYwOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvU2NyYXRjaEJ1ZmZlci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vPT09LS0tIFNjcmF0Y2hCdWZmZXIuaCAtIFNjcmF0Y2ggc3BhY2UgZm9yIGZvcm1pbmcgdG9rZW5zIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBTY3JhdGNoQnVmZmVyIGludGVyZmFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfTEVYX1NDUkFUQ0hCVUZGRVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX0xFWF9TQ1JBVENIQlVGRkVSX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisgIGNsYXNzIFNvdXJjZU1hbmFnZXI7CisKKy8vLyBTY3JhdGNoQnVmZmVyIC0gVGhpcyBjbGFzcyBleHBvc2VzIGEgc2ltcGxlIGludGVyZmFjZSBmb3IgdGhlIGR5bmFtaWMKKy8vLyBjb25zdHJ1Y3Rpb24gb2YgdG9rZW5zLiAgVGhpcyBpcyB1c2VkIGZvciBidWlsdGluIG1hY3JvcyAoZS5nLiBfX0xJTkVfXykgYXMKKy8vLyB3ZWxsIGFzIHRva2VuIHBhc3RpbmcsIGV0Yy4KK2NsYXNzIFNjcmF0Y2hCdWZmZXIgeworICBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3I7CisgIGNoYXIgKkN1ckJ1ZmZlcjsKKyAgU291cmNlTG9jYXRpb24gQnVmZmVyU3RhcnRMb2M7CisgIHVuc2lnbmVkIEJ5dGVzVXNlZDsKK3B1YmxpYzoKKyAgU2NyYXRjaEJ1ZmZlcihTb3VyY2VNYW5hZ2VyICZTTSk7CisKKyAgLy8vIGdldFRva2VuIC0gU3BsYXQgdGhlIHNwZWNpZmllZCB0ZXh0IGludG8gYSB0ZW1wb3JhcnkgTWVtb3J5QnVmZmVyIGFuZAorICAvLy8gcmV0dXJuIGEgU291cmNlTG9jYXRpb24gdGhhdCByZWZlcnMgdG8gdGhlIHRva2VuLiAgVGhpcyBpcyBqdXN0IGxpa2UgdGhlCisgIC8vLyBwcmV2aW91cyBtZXRob2QsIGJ1dCByZXR1cm5zIGEgbG9jYXRpb24gdGhhdCBpbmRpY2F0ZXMgdGhlIHBoeXNsb2Mgb2YgdGhlCisgIC8vLyB0b2tlbi4KKyAgU291cmNlTG9jYXRpb24gZ2V0VG9rZW4oY29uc3QgY2hhciAqQnVmLCB1bnNpZ25lZCBMZW4sIGNvbnN0IGNoYXIgKiZEZXN0UHRyKTsKKworcHJpdmF0ZToKKyAgdm9pZCBBbGxvY1NjcmF0Y2hCdWZmZXIodW5zaWduZWQgUmVxdWVzdExlbik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvVG9rZW4uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9Ub2tlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYTFmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvVG9rZW4uaApAQCAtMCwwICsxLDMzNyBAQAorLy89PT0tLS0gVG9rZW4uaCAtIFRva2VuIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIFRva2VuIGludGVyZmFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfTEVYX1RPS0VOX0gKKyNkZWZpbmUgTExWTV9DTEFOR19MRVhfVE9LRU5fSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Ub2tlbktpbmRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgSWRlbnRpZmllckluZm87CisKKy8vLyBUb2tlbiAtIFRoaXMgc3RydWN0dXJlIHByb3ZpZGVzIGZ1bGwgaW5mb3JtYXRpb24gYWJvdXQgYSBsZXhlZCB0b2tlbi4KKy8vLyBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3BhY2UgZWZmaWNpZW50LCBpdCBpcyBpbnRlbmRlZCB0byByZXR1cm4gYXMgbXVjaAorLy8vIGluZm9ybWF0aW9uIGFzIHBvc3NpYmxlIGFib3V0IGVhY2ggcmV0dXJuZWQgdG9rZW4uICBUaGlzIGlzIGV4cGVjdGVkIHRvIGJlCisvLy8gY29tcHJlc3NlZCBpbnRvIGEgc21hbGxlciBmb3JtIGlmIG1lbW9yeSBmb290cHJpbnQgaXMgaW1wb3J0YW50LgorLy8vCisvLy8gVGhlIHBhcnNlciBjYW4gY3JlYXRlIGEgc3BlY2lhbCAiYW5ub3RhdGlvbiB0b2tlbiIgcmVwcmVzZW50aW5nIGEgc3RyZWFtIG9mCisvLy8gdG9rZW5zIHRoYXQgd2VyZSBwYXJzZWQgYW5kIHNlbWFudGljYWxseSByZXNvbHZlZCwgZS5nLjogImZvbzo6TXlDbGFzczxpbnQ+IgorLy8vIGNhbiBiZSByZXByZXNlbnRlZCBieSBhIHNpbmdsZSB0eXBlbmFtZSBhbm5vdGF0aW9uIHRva2VuIHRoYXQgY2FycmllcworLy8vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBTb3VyY2VSYW5nZSBvZiB0aGUgdG9rZW5zIGFuZCB0aGUgdHlwZSBvYmplY3QuCitjbGFzcyBUb2tlbiB7CisgIC8vLyBUaGUgbG9jYXRpb24gb2YgdGhlIHRva2VuLiBUaGlzIGlzIGFjdHVhbGx5IGEgU291cmNlTG9jYXRpb24uCisgIHVuc2lnbmVkIExvYzsKKworICAvLyBDb25jZXB0dWFsbHkgdGhlc2UgbmV4dCB0d28gZmllbGRzIGNvdWxkIGJlIGluIGEgdW5pb24uICBIb3dldmVyLCB0aGlzCisgIC8vIGNhdXNlcyBnY2MgNC4yIHRvIHBlc3NpbWl6ZSBMZXhUb2tlbkludGVybmFsLCBhIHZlcnkgcGVyZm9ybWFuY2UgY3JpdGljYWwKKyAgLy8gcm91dGluZS4gS2VlcGluZyBhcyBzZXBhcmF0ZSBtZW1iZXJzIHdpdGggY2FzdHMgdW50aWwgYSBtb3JlIGJlYXV0aWZ1bCBmaXgKKyAgLy8gcHJlc2VudHMgaXRzZWxmLgorCisgIC8vLyBVaW50RGF0YSAtIFRoaXMgaG9sZHMgZWl0aGVyIHRoZSBsZW5ndGggb2YgdGhlIHRva2VuIHRleHQsIHdoZW4KKyAgLy8vIGEgbm9ybWFsIHRva2VuLCBvciB0aGUgZW5kIG9mIHRoZSBTb3VyY2VSYW5nZSB3aGVuIGFuIGFubm90YXRpb24KKyAgLy8vIHRva2VuLgorICB1bnNpZ25lZCBVaW50RGF0YTsKKworICAvLy8gUHRyRGF0YSAtIFRoaXMgaXMgYSB1bmlvbiBvZiBmb3VyIGRpZmZlcmVudCBwb2ludGVyIHR5cGVzLCB3aGljaCBkZXBlbmRzCisgIC8vLyBvbiB3aGF0IHR5cGUgb2YgdG9rZW4gdGhpcyBpczoKKyAgLy8vICBJZGVudGlmaWVycywga2V5d29yZHMsIGV0YzoKKyAgLy8vICAgIFRoaXMgaXMgYW4gSWRlbnRpZmllckluZm8qLCB3aGljaCBjb250YWlucyB0aGUgdW5pcXVlZCBpZGVudGlmaWVyCisgIC8vLyAgICBzcGVsbGluZy4KKyAgLy8vICBMaXRlcmFsczogIGlzTGl0ZXJhbCgpIHJldHVybnMgdHJ1ZS4KKyAgLy8vICAgIFRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgdG9rZW4gaW4gYSB0ZXh0IGJ1ZmZlciwgd2hpY2gKKyAgLy8vICAgIG1heSBiZSBkaXJ0eSAoaGF2ZSB0cmlncmFwaHMgLyBlc2NhcGVkIG5ld2xpbmVzKS4KKyAgLy8vICBBbm5vdGF0aW9ucyAocmVzb2x2ZWQgdHlwZSBuYW1lcywgQysrIHNjb3BlcywgZXRjKTogaXNBbm5vdGF0aW9uKCkuCisgIC8vLyAgICBUaGlzIGlzIGEgcG9pbnRlciB0byBzZW1hLXNwZWNpZmljIGRhdGEgZm9yIHRoZSBhbm5vdGF0aW9uIHRva2VuLgorICAvLy8gIEVvZjoKKyAgLy8gICAgIFRoaXMgaXMgYSBwb2ludGVyIHRvIGEgRGVjbC4KKyAgLy8vICBPdGhlcjoKKyAgLy8vICAgIFRoaXMgaXMgbnVsbC4KKyAgdm9pZCAqUHRyRGF0YTsKKworICAvLy8gS2luZCAtIFRoZSBhY3R1YWwgZmxhdm9yIG9mIHRva2VuIHRoaXMgaXMuCisgIHRvazo6VG9rZW5LaW5kIEtpbmQ7CisKKyAgLy8vIEZsYWdzIC0gQml0cyB3ZSB0cmFjayBhYm91dCB0aGlzIHRva2VuLCBtZW1iZXJzIG9mIHRoZSBUb2tlbkZsYWdzIGVudW0uCisgIHVuc2lnbmVkIHNob3J0IEZsYWdzOworCitwdWJsaWM6CisgIC8vIFZhcmlvdXMgZmxhZ3Mgc2V0IHBlciB0b2tlbjoKKyAgZW51bSBUb2tlbkZsYWdzIHsKKyAgICBTdGFydE9mTGluZSAgID0gMHgwMSwgIC8vIEF0IHN0YXJ0IG9mIGxpbmUgb3Igb25seSBhZnRlciB3aGl0ZXNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoY29uc2lkZXJpbmcgdGhlIGxpbmUgYWZ0ZXIgbWFjcm8gZXhwYW5zaW9uKS4KKyAgICBMZWFkaW5nU3BhY2UgID0gMHgwMiwgIC8vIFdoaXRlc3BhY2UgZXhpc3RzIGJlZm9yZSB0aGlzIHRva2VuIChjb25zaWRlcmluZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaXRlc3BhY2UgYWZ0ZXIgbWFjcm8gZXhwYW5zaW9uKS4KKyAgICBEaXNhYmxlRXhwYW5kID0gMHgwNCwgIC8vIFRoaXMgaWRlbnRpZmllciBtYXkgbmV2ZXIgYmUgbWFjcm8gZXhwYW5kZWQuCisgICAgTmVlZHNDbGVhbmluZyA9IDB4MDgsICAvLyBDb250YWluZWQgYW4gZXNjYXBlZCBuZXdsaW5lIG9yIHRyaWdyYXBoLgorICAgIExlYWRpbmdFbXB0eU1hY3JvID0gMHgxMCwgLy8gRW1wdHkgbWFjcm8gZXhpc3RzIGJlZm9yZSB0aGlzIHRva2VuLgorICAgIEhhc1VEU3VmZml4ID0gMHgyMCwgICAgLy8gVGhpcyBzdHJpbmcgb3IgY2hhcmFjdGVyIGxpdGVyYWwgaGFzIGEgdWQtc3VmZml4LgorICAgIEhhc1VDTiA9IDB4NDAsICAgICAgICAgLy8gVGhpcyBpZGVudGlmaWVyIGNvbnRhaW5zIGEgVUNOLgorICAgIElnbm9yZWRDb21tYSA9IDB4ODAsICAgLy8gVGhpcyBjb21tYSBpcyBub3QgYSBtYWNybyBhcmd1bWVudCBzZXBhcmF0b3IgKE1TKS4KKyAgICBTdHJpbmdpZmllZEluTWFjcm8gPSAweDEwMCwgLy8gVGhpcyBzdHJpbmcgb3IgY2hhcmFjdGVyIGxpdGVyYWwgaXMgZm9ybWVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hY3JvIHN0cmluZ2l6aW5nIG9yIGNoYXJpemluZyBvcGVyYXRvci4KKyAgICBDb21tYUFmdGVyRWxpZGVkID0gMHgyMDAsIC8vIFRoZSBjb21tYSBmb2xsb3dpbmcgdGhpcyB0b2tlbiB3YXMgZWxpZGVkIChNUykuCisgICAgSXNFZGl0b3JQbGFjZWhvbGRlciA9IDB4NDAwLCAvLyBUaGlzIGlkZW50aWZpZXIgaXMgYSBwbGFjZWhvbGRlci4KKyAgfTsKKworICB0b2s6OlRva2VuS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorICB2b2lkIHNldEtpbmQodG9rOjpUb2tlbktpbmQgSykgeyBLaW5kID0gSzsgfQorCisgIC8vLyBpcy9pc05vdCAtIFByZWRpY2F0ZXMgdG8gY2hlY2sgaWYgdGhpcyB0b2tlbiBpcyBhIHNwZWNpZmljIGtpbmQsIGFzIGluCisgIC8vLyAiaWYgKFRvay5pcyh0b2s6OmxfYnJhY2UpKSB7Li4ufSIuCisgIGJvb2wgaXModG9rOjpUb2tlbktpbmQgSykgY29uc3QgeyByZXR1cm4gS2luZCA9PSBLOyB9CisgIGJvb2wgaXNOb3QodG9rOjpUb2tlbktpbmQgSykgY29uc3QgeyByZXR1cm4gS2luZCAhPSBLOyB9CisgIGJvb2wgaXNPbmVPZih0b2s6OlRva2VuS2luZCBLMSwgdG9rOjpUb2tlbktpbmQgSzIpIGNvbnN0IHsKKyAgICByZXR1cm4gaXMoSzEpIHx8IGlzKEsyKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHM+CisgIGJvb2wgaXNPbmVPZih0b2s6OlRva2VuS2luZCBLMSwgdG9rOjpUb2tlbktpbmQgSzIsIFRzLi4uIEtzKSBjb25zdCB7CisgICAgcmV0dXJuIGlzKEsxKSB8fCBpc09uZU9mKEsyLCBLcy4uLik7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSByYXcgaWRlbnRpZmllciAod2hlbiBsZXhpbmcKKyAgLy8vIGluIHJhdyBtb2RlKSBvciBhIG5vbi1rZXl3b3JkIGlkZW50aWZpZXIgKHdoZW4gbGV4aW5nIGluIG5vbi1yYXcgbW9kZSkuCisgIGJvb2wgaXNBbnlJZGVudGlmaWVyKCkgY29uc3QgeworICAgIHJldHVybiB0b2s6OmlzQW55SWRlbnRpZmllcihnZXRLaW5kKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgImxpdGVyYWwiLCBsaWtlIGEgbnVtZXJpYworICAvLy8gY29uc3RhbnQsIHN0cmluZywgZXRjLgorICBib29sIGlzTGl0ZXJhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gdG9rOjppc0xpdGVyYWwoZ2V0S2luZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbnkgb2YgdG9rOjphbm5vdF8qIGtpbmQgdG9rZW5zLgorICBib29sIGlzQW5ub3RhdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gdG9rOjppc0Fubm90YXRpb24oZ2V0S2luZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgc291cmNlIGxvY2F0aW9uIGlkZW50aWZpZXIgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIG9mZnNldCBpbiB0aGUgY3VycmVudCBmaWxlLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NhdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZyhMb2MpOworICB9CisgIHVuc2lnbmVkIGdldExlbmd0aCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzQW5ub3RhdGlvbigpICYmICJBbm5vdGF0aW9uIHRva2VucyBoYXZlIG5vIGxlbmd0aCBmaWVsZCIpOworICAgIHJldHVybiBVaW50RGF0YTsKKyAgfQorCisgIHZvaWQgc2V0TG9jYXRpb24oU291cmNlTG9jYXRpb24gTCkgeyBMb2MgPSBMLmdldFJhd0VuY29kaW5nKCk7IH0KKyAgdm9pZCBzZXRMZW5ndGgodW5zaWduZWQgTGVuKSB7CisgICAgYXNzZXJ0KCFpc0Fubm90YXRpb24oKSAmJiAiQW5ub3RhdGlvbiB0b2tlbnMgaGF2ZSBubyBsZW5ndGggZmllbGQiKTsKKyAgICBVaW50RGF0YSA9IExlbjsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEFubm90YXRpb25FbmRMb2MoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQW5ub3RhdGlvbigpICYmICJVc2VkIEFubm90RW5kTG9jSUQgb24gbm9uLWFubm90YXRpb24gdG9rZW4iKTsKKyAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZyhVaW50RGF0YSA/IFVpbnREYXRhIDogTG9jKTsKKyAgfQorICB2b2lkIHNldEFubm90YXRpb25FbmRMb2MoU291cmNlTG9jYXRpb24gTCkgeworICAgIGFzc2VydChpc0Fubm90YXRpb24oKSAmJiAiVXNlZCBBbm5vdEVuZExvY0lEIG9uIG5vbi1hbm5vdGF0aW9uIHRva2VuIik7CisgICAgVWludERhdGEgPSBMLmdldFJhd0VuY29kaW5nKCk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMYXN0TG9jKCkgY29uc3QgeworICAgIHJldHVybiBpc0Fubm90YXRpb24oKSA/IGdldEFubm90YXRpb25FbmRMb2MoKSA6IGdldExvY2F0aW9uKCk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRFbmRMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQW5ub3RhdGlvbigpID8gZ2V0QW5ub3RhdGlvbkVuZExvYygpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0TG9jYXRpb24oKS5nZXRMb2NXaXRoT2Zmc2V0KGdldExlbmd0aCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU291cmNlUmFuZ2Ugb2YgdGhlIGdyb3VwIG9mIHRva2VucyB0aGF0IHRoaXMgYW5ub3RhdGlvbiB0b2tlbgorICAvLy8gcmVwcmVzZW50cy4KKyAgU291cmNlUmFuZ2UgZ2V0QW5ub3RhdGlvblJhbmdlKCkgY29uc3QgeworICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRMb2NhdGlvbigpLCBnZXRBbm5vdGF0aW9uRW5kTG9jKCkpOworICB9CisgIHZvaWQgc2V0QW5ub3RhdGlvblJhbmdlKFNvdXJjZVJhbmdlIFIpIHsKKyAgICBzZXRMb2NhdGlvbihSLmdldEJlZ2luKCkpOworICAgIHNldEFubm90YXRpb25FbmRMb2MoUi5nZXRFbmQoKSk7CisgIH0KKworICBjb25zdCBjaGFyICpnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gdG9rOjpnZXRUb2tlbk5hbWUoS2luZCk7IH0KKworICAvLy8gXGJyaWVmIFJlc2V0IGFsbCBmbGFncyB0byBjbGVhcmVkLgorICB2b2lkIHN0YXJ0VG9rZW4oKSB7CisgICAgS2luZCA9IHRvazo6dW5rbm93bjsKKyAgICBGbGFncyA9IDA7CisgICAgUHRyRGF0YSA9IG51bGxwdHI7CisgICAgVWludERhdGEgPSAwOworICAgIExvYyA9IFNvdXJjZUxvY2F0aW9uKCkuZ2V0UmF3RW5jb2RpbmcoKTsKKyAgfQorCisgIElkZW50aWZpZXJJbmZvICpnZXRJZGVudGlmaWVySW5mbygpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNOb3QodG9rOjpyYXdfaWRlbnRpZmllcikgJiYKKyAgICAgICAgICAgImdldElkZW50aWZpZXJJbmZvKCkgb24gYSB0b2s6OnJhd19pZGVudGlmaWVyIHRva2VuISIpOworICAgIGFzc2VydCghaXNBbm5vdGF0aW9uKCkgJiYKKyAgICAgICAgICAgImdldElkZW50aWZpZXJJbmZvKCkgb24gYW4gYW5ub3RhdGlvbiB0b2tlbiEiKTsKKyAgICBpZiAoaXNMaXRlcmFsKCkpIHJldHVybiBudWxscHRyOworICAgIGlmIChpcyh0b2s6OmVvZikpIHJldHVybiBudWxscHRyOworICAgIHJldHVybiAoSWRlbnRpZmllckluZm8qKSBQdHJEYXRhOworICB9CisgIHZvaWQgc2V0SWRlbnRpZmllckluZm8oSWRlbnRpZmllckluZm8gKklJKSB7CisgICAgUHRyRGF0YSA9ICh2b2lkKikgSUk7CisgIH0KKworICBjb25zdCB2b2lkICpnZXRFb2ZEYXRhKCkgY29uc3QgeworICAgIGFzc2VydChpcyh0b2s6OmVvZikpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQgKj4oUHRyRGF0YSk7CisgIH0KKyAgdm9pZCBzZXRFb2ZEYXRhKGNvbnN0IHZvaWQgKkQpIHsKKyAgICBhc3NlcnQoaXModG9rOjplb2YpKTsKKyAgICBhc3NlcnQoIVB0ckRhdGEpOworICAgIFB0ckRhdGEgPSBjb25zdF9jYXN0PHZvaWQgKj4oRCk7CisgIH0KKworICAvLy8gZ2V0UmF3SWRlbnRpZmllciAtIEZvciBhIHJhdyBpZGVudGlmaWVyIHRva2VuIChpLmUuLCBhbiBpZGVudGlmaWVyCisgIC8vLyBsZXhlZCBpbiByYXcgbW9kZSksIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHRleHQgc3Vic3RyaW5nIGluIHRoZQorICAvLy8gYnVmZmVyIGlmIGtub3duLgorICBTdHJpbmdSZWYgZ2V0UmF3SWRlbnRpZmllcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXModG9rOjpyYXdfaWRlbnRpZmllcikpOworICAgIHJldHVybiBTdHJpbmdSZWYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KFB0ckRhdGEpLCBnZXRMZW5ndGgoKSk7CisgIH0KKyAgdm9pZCBzZXRSYXdJZGVudGlmaWVyRGF0YShjb25zdCBjaGFyICpQdHIpIHsKKyAgICBhc3NlcnQoaXModG9rOjpyYXdfaWRlbnRpZmllcikpOworICAgIFB0ckRhdGEgPSBjb25zdF9jYXN0PGNoYXIqPihQdHIpOworICB9CisKKyAgLy8vIGdldExpdGVyYWxEYXRhIC0gRm9yIGEgbGl0ZXJhbCB0b2tlbiAobnVtZXJpYyBjb25zdGFudCwgc3RyaW5nLCBldGMpLCB0aGlzCisgIC8vLyByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgaXQgaW4gdGhlIHRleHQgYnVmZmVyIGlmIGtub3duLCBudWxsCisgIC8vLyBvdGhlcndpc2UuCisgIGNvbnN0IGNoYXIgKmdldExpdGVyYWxEYXRhKCkgY29uc3QgeworICAgIGFzc2VydChpc0xpdGVyYWwoKSAmJiAiQ2Fubm90IGdldCBsaXRlcmFsIGRhdGEgb2Ygbm9uLWxpdGVyYWwiKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oUHRyRGF0YSk7CisgIH0KKyAgdm9pZCBzZXRMaXRlcmFsRGF0YShjb25zdCBjaGFyICpQdHIpIHsKKyAgICBhc3NlcnQoaXNMaXRlcmFsKCkgJiYgIkNhbm5vdCBzZXQgbGl0ZXJhbCBkYXRhIG9mIG5vbi1saXRlcmFsIik7CisgICAgUHRyRGF0YSA9IGNvbnN0X2Nhc3Q8Y2hhcio+KFB0cik7CisgIH0KKworICB2b2lkICpnZXRBbm5vdGF0aW9uVmFsdWUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQW5ub3RhdGlvbigpICYmICJVc2VkIEFubm90VmFsIG9uIG5vbi1hbm5vdGF0aW9uIHRva2VuIik7CisgICAgcmV0dXJuIFB0ckRhdGE7CisgIH0KKyAgdm9pZCBzZXRBbm5vdGF0aW9uVmFsdWUodm9pZCAqdmFsKSB7CisgICAgYXNzZXJ0KGlzQW5ub3RhdGlvbigpICYmICJVc2VkIEFubm90VmFsIG9uIG5vbi1hbm5vdGF0aW9uIHRva2VuIik7CisgICAgUHRyRGF0YSA9IHZhbDsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBzcGVjaWZpZWQgZmxhZy4KKyAgdm9pZCBzZXRGbGFnKFRva2VuRmxhZ3MgRmxhZykgeworICAgIEZsYWdzIHw9IEZsYWc7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgc3BlY2lmaWVkIGZsYWcuCisgIGJvb2wgZ2V0RmxhZyhUb2tlbkZsYWdzIEZsYWcpIGNvbnN0IHsKKyAgICByZXR1cm4gKEZsYWdzICYgRmxhZykgIT0gMDsKKyAgfQorCisgIC8vLyBcYnJpZWYgVW5zZXQgdGhlIHNwZWNpZmllZCBmbGFnLgorICB2b2lkIGNsZWFyRmxhZyhUb2tlbkZsYWdzIEZsYWcpIHsKKyAgICBGbGFncyAmPSB+RmxhZzsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBpbnRlcm5hbCByZXByZXN0YXRpb24gb2YgdGhlIGZsYWdzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgb25seSBpbnRlbmRlZCBmb3IgbG93LWxldmVsIG9wZXJhdGlvbnMgc3VjaCBhcyB3cml0aW5nIHRva2VucyB0bworICAvLy8gZGlzay4KKyAgdW5zaWduZWQgZ2V0RmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIEZsYWdzOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgYSBmbGFnIHRvIGVpdGhlciB0cnVlIG9yIGZhbHNlLgorICB2b2lkIHNldEZsYWdWYWx1ZShUb2tlbkZsYWdzIEZsYWcsIGJvb2wgVmFsKSB7CisgICAgaWYgKFZhbCkKKyAgICAgIHNldEZsYWcoRmxhZyk7CisgICAgZWxzZQorICAgICAgY2xlYXJGbGFnKEZsYWcpOworICB9CisKKyAgLy8vIGlzQXRTdGFydE9mTGluZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgdG9rZW4gaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KKyAgLy8vCisgIGJvb2wgaXNBdFN0YXJ0T2ZMaW5lKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZyhTdGFydE9mTGluZSk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgdG9rZW4gaGFzIHdoaXRlc3BhY2UgYmVmb3JlIGl0LgorICAvLy8KKyAgYm9vbCBoYXNMZWFkaW5nU3BhY2UoKSBjb25zdCB7IHJldHVybiBnZXRGbGFnKExlYWRpbmdTcGFjZSk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaWRlbnRpZmllciB0b2tlbiBzaG91bGQgbmV2ZXIKKyAgLy8vIGJlIGV4cGFuZGVkIGluIHRoZSBmdXR1cmUsIGR1ZSB0byBDOTkgNi4xMC4zLjRwMi4KKyAgYm9vbCBpc0V4cGFuZERpc2FibGVkKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZyhEaXNhYmxlRXhwYW5kKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSBhbiBPYmpDIGtleXdvcmQgaWRlbnRpZmllci4KKyAgYm9vbCBpc09iakNBdEtleXdvcmQodG9rOjpPYmpDS2V5d29yZEtpbmQgb2JqY0tleSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIE9iakMga2V5d29yZCBraW5kLgorICB0b2s6Ok9iakNLZXl3b3JkS2luZCBnZXRPYmpDS2V5d29yZElEKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHRva2VuIGhhcyB0cmlncmFwaHMgb3IgZXNjYXBlZCBuZXdsaW5lcyBpbiBpdC4KKyAgYm9vbCBuZWVkc0NsZWFuaW5nKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZyhOZWVkc0NsZWFuaW5nKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyB0b2tlbiBoYXMgYW4gZW1wdHkgbWFjcm8gYmVmb3JlIGl0LgorICAvLy8KKyAgYm9vbCBoYXNMZWFkaW5nRW1wdHlNYWNybygpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWcoTGVhZGluZ0VtcHR5TWFjcm8pOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgc3RyaW5nIG9yIGNoYXJhY3RlciBsaXRlcmFsIHdoaWNoCisgIC8vLyBoYXMgYSB1ZC1zdWZmaXguCisgIGJvb2wgaGFzVURTdWZmaXgoKSBjb25zdCB7IHJldHVybiBnZXRGbGFnKEhhc1VEU3VmZml4KTsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyB0b2tlbiBjb250YWlucyBhIHVuaXZlcnNhbCBjaGFyYWN0ZXIgbmFtZS4KKyAgYm9vbCBoYXNVQ04oKSBjb25zdCB7IHJldHVybiBnZXRGbGFnKEhhc1VDTik7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdG9rZW4gaXMgZm9ybWVkIGJ5IG1hY3JvIGJ5IHN0cmluZ2l6aW5nIG9yIGNoYXJpemluZworICAvLy8gb3BlcmF0b3IuCisgIGJvb2wgc3RyaW5naWZpZWRJbk1hY3JvKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZyhTdHJpbmdpZmllZEluTWFjcm8pOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29tbWEgYWZ0ZXIgdGhpcyB0b2tlbiB3YXMgZWxpZGVkLgorICBib29sIGNvbW1hQWZ0ZXJFbGlkZWQoKSBjb25zdCB7IHJldHVybiBnZXRGbGFnKENvbW1hQWZ0ZXJFbGlkZWQpOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGFuIGVkaXRvciBwbGFjZWhvbGRlci4KKyAgLy8vCisgIC8vLyBFZGl0b3IgcGxhY2Vob2xkZXJzIGFyZSBwcm9kdWNlZCBieSB0aGUgY29kZS1jb21wbGV0aW9uIGVuZ2luZSBhbmQgYXJlCisgIC8vLyByZXByZXNlbnRlZCBhcyBjaGFyYWN0ZXJzIGJldHdlZW4gJzwjJyBhbmQgJyM+JyBpbiB0aGUgc291cmNlIGNvZGUuIFRoZQorICAvLy8gbGV4ZXIgdXNlcyBpZGVudGlmaWVyIHRva2VucyB0byByZXByZXNlbnQgcGxhY2Vob2xkZXJzLgorICBib29sIGlzRWRpdG9yUGxhY2Vob2xkZXIoKSBjb25zdCB7IHJldHVybiBnZXRGbGFnKElzRWRpdG9yUGxhY2Vob2xkZXIpOyB9Cit9OworCisvLy8gXGJyaWVmIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb25kaXRpb25hbCBzdGFjayAoXCNpZiBkaXJlY3RpdmVzKQorLy8vIGN1cnJlbnRseSBhY3RpdmUuCitzdHJ1Y3QgUFBDb25kaXRpb25hbEluZm8geworICAvLy8gXGJyaWVmIExvY2F0aW9uIHdoZXJlIHRoZSBjb25kaXRpb25hbCBzdGFydGVkLgorICBTb3VyY2VMb2NhdGlvbiBJZkxvYzsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyB3YXMgY29udGFpbmVkIGluIGEgc2tpcHBpbmcgZGlyZWN0aXZlLCBlLmcuLAorICAvLy8gaW4gYSAiXCNpZiAwIiBibG9jay4KKyAgYm9vbCBXYXNTa2lwcGluZzsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgd2UgaGF2ZSBlbWl0dGVkIHRva2VucyBhbHJlYWR5LCBhbmQgbm93IHdlJ3JlIGluCisgIC8vLyBhbiBcI2Vsc2UgYmxvY2sgb3Igc29tZXRoaW5nLiAgT25seSB1c2VmdWwgaW4gU2tpcHBpbmcgYmxvY2tzLgorICBib29sIEZvdW5kTm9uU2tpcDsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgd2UndmUgc2VlbiBhIFwjZWxzZSBpbiB0aGlzIGJsb2NrLiAgSWYgc28sCisgIC8vLyBcI2VsaWYvXCNlbHNlIGRpcmVjdGl2ZXMgYXJlIG5vdCBhbGxvd2VkLgorICBib29sIEZvdW5kRWxzZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCituYW1lc3BhY2UgbGx2bSB7CisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBpc1BvZExpa2U8Y2xhbmc6OlRva2VuPiB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0xFWF9UT0tFTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvVG9rZW5Db25jYXRlbmF0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvVG9rZW5Db25jYXRlbmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJkOThiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9Ub2tlbkNvbmNhdGVuYXRpb24uaApAQCAtMCwwICsxLDcyIEBACisvLz09PS0tLSBUb2tlbkNvbmNhdGVuYXRpb24uaCAtIFRva2VuIENvbmNhdGVuYXRpb24gQXZvaWRhbmNlIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBUb2tlbkNvbmNhdGVuYXRpb24gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0xFWF9UT0tFTkNPTkNBVEVOQVRJT05fSAorI2RlZmluZSBMTFZNX0NMQU5HX0xFWF9UT0tFTkNPTkNBVEVOQVRJT05fSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVG9rZW5LaW5kcy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworICBjbGFzcyBQcmVwcm9jZXNzb3I7CisgIGNsYXNzIFRva2VuOworCisgIC8vLyBUb2tlbkNvbmNhdGVuYXRpb24gY2xhc3MsIHdoaWNoIGFuc3dlcnMgdGhlIHF1ZXN0aW9uIG9mCisgIC8vLyAgICJJcyBpdCBzYWZlIHRvIGVtaXQgdHdvIHRva2VucyB3aXRob3V0IGEgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZW0sIG9yCisgIC8vLyAgICB3b3VsZCB0aGF0IGNhdXNlIGltcGxpY2l0IGNvbmNhdGVuYXRpb24gb2YgdGhlIHRva2Vucz8iCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsIGl0IGVtaXR0aW5nIHR3byBpZGVudGlmaWVycyAiZm9vIiBhbmQgImJhciIgbmV4dCB0byBlYWNoCisgIC8vLyBvdGhlciB3b3VsZCBjYXVzZSB0aGUgbGV4ZXIgdG8gcHJvZHVjZSBvbmUgImZvb2JhciIgdG9rZW4uICBFbWl0dGluZyAiMSIKKyAgLy8vIGFuZCAiKSIgbmV4dCB0byBlYWNoIG90aGVyIGlzIHNhZmUuCisgIC8vLworICBjbGFzcyBUb2tlbkNvbmNhdGVuYXRpb24geworICAgIFByZXByb2Nlc3NvciAmUFA7CisKKyAgICBlbnVtIEF2b2lkQ29uY2F0SW5mbyB7CisgICAgICAvLy8gQnkgZGVmYXVsdCwgYSB0b2tlbiBuZXZlciBuZWVkcyB0byBhdm9pZCBjb25jYXRlbmF0aW9uLiAgTW9zdCB0b2tlbnMKKyAgICAgIC8vLyAoZS5nLiAnLCcsICcpJywgZXRjKSBkb24ndCBjYXVzZSBhIHByb2JsZW0gd2hlbiBjb25jYXRlbmF0ZWQuCisgICAgICBhY2lfbmV2ZXJfYXZvaWRfY29uY2F0ID0gMCwKKworICAgICAgLy8vIGFjaV9jdXN0b21fZmlyc3RjaGFyIC0gQXZvaWRDb25jYXQgY29udGFpbnMgY3VzdG9tIGNvZGUgdG8gaGFuZGxlIHRoaXMKKyAgICAgIC8vLyB0b2tlbidzIHJlcXVpcmVtZW50cywgYW5kIGl0IG5lZWRzIHRvIGtub3cgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUKKyAgICAgIC8vLyB0b2tlbi4KKyAgICAgIGFjaV9jdXN0b21fZmlyc3RjaGFyID0gMSwKKworICAgICAgLy8vIGFjaV9jdXN0b20gLSBBdm9pZENvbmNhdCBjb250YWlucyBjdXN0b20gY29kZSB0byBoYW5kbGUgdGhpcyB0b2tlbidzCisgICAgICAvLy8gcmVxdWlyZW1lbnRzLCBidXQgaXQgZG9lc24ndCBuZWVkIHRvIGtub3cgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUKKyAgICAgIC8vLyB0b2tlbi4KKyAgICAgIGFjaV9jdXN0b20gPSAyLAorCisgICAgICAvLy8gYWNpX2F2b2lkX2VxdWFsIC0gTWFueSB0b2tlbnMgY2Fubm90IGJlIHNhZmVseSBmb2xsb3dlZCBieSBhbiAnPScKKyAgICAgIC8vLyBjaGFyYWN0ZXIuICBGb3IgZXhhbXBsZSwgIjw8IiB0dXJucyBpbnRvICI8PD0iIHdoZW4gZm9sbG93ZWQgYnkgYW4gPS4KKyAgICAgIGFjaV9hdm9pZF9lcXVhbCA9IDQKKyAgICB9OworCisgICAgLy8vIFRva2VuSW5mbyAtIFRoaXMgYXJyYXkgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIGVhY2ggdG9rZW4gb24gd2hhdAorICAgIC8vLyBhY3Rpb24gdG8gdGFrZSB3aGVuIGF2b2lkaW5nIGNvbmNhdGVuYXRpb24gb2YgdG9rZW5zIGluIHRoZSBBdm9pZENvbmNhdAorICAgIC8vLyBtZXRob2QuCisgICAgY2hhciBUb2tlbkluZm9bdG9rOjpOVU1fVE9LRU5TXTsKKyAgcHVibGljOgorICAgIFRva2VuQ29uY2F0ZW5hdGlvbihQcmVwcm9jZXNzb3IgJlBQKTsKKworICAgIGJvb2wgQXZvaWRDb25jYXQoY29uc3QgVG9rZW4gJlByZXZQcmV2VG9rLCAKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRva2VuICZQcmV2VG9rLCAKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRva2VuICZUb2spIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgLy8vIElzSWRlbnRpZmllclN0cmluZ1ByZWZpeCAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVsbGluZyBvZiB0aGUgdG9rZW4KKyAgICAvLy8gaXMgbGl0ZXJhbGx5ICdMJywgJ3UnLCAnVScsIG9yICd1OCcuCisgICAgYm9vbCBJc0lkZW50aWZpZXJTdHJpbmdQcmVmaXgoY29uc3QgVG9rZW4gJlRvaykgY29uc3Q7CisgIH07CisgIH0gLy8gZW5kIGNsYW5nIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9Ub2tlbkxleGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvVG9rZW5MZXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YjBiZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvVG9rZW5MZXhlci5oCkBAIC0wLDAgKzEsMjQ0IEBACisvLz09PS0gVG9rZW5MZXhlci5oIC0gTGV4IGZyb20gYSB0b2tlbiBidWZmZXIgLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBUb2tlbkxleGVyIGludGVyZmFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfTEVYX1RPS0VOTEVYRVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX0xFWF9UT0tFTkxFWEVSX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgTWFjcm9BcmdzOworY2xhc3MgTWFjcm9JbmZvOworY2xhc3MgUHJlcHJvY2Vzc29yOworY2xhc3MgVG9rZW47CitjbGFzcyBWQU9wdEV4cGFuc2lvbkNvbnRleHQ7CisKKy8vLyBUb2tlbkxleGVyIC0gVGhpcyBpbXBsZW1lbnRzIGEgbGV4ZXIgdGhhdCByZXR1cm5zIHRva2VucyBmcm9tIGEgbWFjcm8gYm9keQorLy8vIG9yIHRva2VuIHN0cmVhbSBpbnN0ZWFkIG9mIGxleGluZyBmcm9tIGEgY2hhcmFjdGVyIGJ1ZmZlci4gIFRoaXMgaXMgdXNlZCBmb3IKKy8vLyBtYWNybyBleHBhbnNpb24gYW5kIF9QcmFnbWEgaGFuZGxpbmcsIGZvciBleGFtcGxlLgorY2xhc3MgVG9rZW5MZXhlciB7CisgIGZyaWVuZCBjbGFzcyBQcmVwcm9jZXNzb3I7CisKKyAgLy8vIE1hY3JvIC0gVGhlIG1hY3JvIHdlIGFyZSBleHBhbmRpbmcgZnJvbS4gIFRoaXMgaXMgbnVsbCBpZiBleHBhbmRpbmcgYQorICAvLy8gdG9rZW4gc3RyZWFtLgorICBNYWNyb0luZm8gKk1hY3JvID0gbnVsbHB0cjsKKworICAvLy8gQWN0dWFsQXJncyAtIFRoZSBhY3R1YWwgYXJndW1lbnRzIHNwZWNpZmllZCBmb3IgYSBmdW5jdGlvbi1saWtlIG1hY3JvLCBvcgorICAvLy8gbnVsbC4gIFRoZSBUb2tlbkxleGVyIG93bnMgdGhlIHBvaW50ZWQtdG8gb2JqZWN0LgorICBNYWNyb0FyZ3MgKkFjdHVhbEFyZ3MgPSBudWxscHRyOworCisgIC8vLyBQUCAtIFRoZSBjdXJyZW50IHByZXByb2Nlc3NvciBvYmplY3Qgd2UgYXJlIGV4cGFuZGluZyBmb3IuCisgIFByZXByb2Nlc3NvciAmUFA7CisKKyAgLy8vIFRva2VucyAtIFRoaXMgaXMgdGhlIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdG9rZW5zIHRoYXQgdGhlIG1hY3JvIGlzCisgIC8vLyBkZWZpbmVkIHRvLCB3aXRoIGFyZ3VtZW50cyBleHBhbmRlZCBmb3IgZnVuY3Rpb24tbGlrZSBtYWNyb3MuICBJZiB0aGlzIGlzCisgIC8vLyBhIHRva2VuIHN0cmVhbSwgdGhlc2UgYXJlIHRoZSB0b2tlbnMgd2UgYXJlIHJldHVybmluZy4gIFRoaXMgcG9pbnRzIGludG8KKyAgLy8vIHRoZSBtYWNybyBkZWZpbml0aW9uIHdlIGFyZSBsZXhpbmcgZnJvbSwgYSBjYWNoZSBidWZmZXIgdGhhdCBpcyBvd25lZCBieQorICAvLy8gdGhlIHByZXByb2Nlc3Nvciwgb3Igc29tZSBvdGhlciBidWZmZXIgdGhhdCB3ZSBtYXkgb3IgbWF5IG5vdCBvd24KKyAgLy8vIChkZXBlbmRpbmcgb24gT3duc1Rva2VucykuCisgIC8vLyBOb3RlIHRoYXQgaWYgaXQgcG9pbnRzIGludG8gUHJlcHJvY2Vzc29yJ3MgY2FjaGUgYnVmZmVyLCB0aGUgUHJlcHJvY2Vzc29yCisgIC8vLyBtYXkgdXBkYXRlIHRoZSBwb2ludGVyIGFzIG5lZWRlZC4KKyAgY29uc3QgVG9rZW4gKlRva2VuczsKKworICAvLy8gTnVtVG9rZW5zIC0gVGhpcyBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBUb2tlbnMgYXJyYXkuCisgIHVuc2lnbmVkIE51bVRva2VuczsKKworICAvLy8gVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgdG9rZW4gdGhhdCBMZXggd2lsbCByZXR1cm4uCisgIHVuc2lnbmVkIEN1clRva2VuSWR4OworCisgIC8vLyBFeHBhbmRMb2NTdGFydC9FbmQgLSBUaGUgc291cmNlIGxvY2F0aW9uIHJhbmdlIHdoZXJlIHRoaXMgbWFjcm8gd2FzCisgIC8vLyBleHBhbmRlZC4KKyAgU291cmNlTG9jYXRpb24gRXhwYW5kTG9jU3RhcnQsIEV4cGFuZExvY0VuZDsKKworICAvLy8gXGJyaWVmIFNvdXJjZSBsb2NhdGlvbiBwb2ludGluZyBhdCB0aGUgc291cmNlIGxvY2F0aW9uIGVudHJ5IGNodW5rIHRoYXQKKyAgLy8vIHdhcyByZXNlcnZlZCBmb3IgdGhlIGN1cnJlbnQgbWFjcm8gZXhwYW5zaW9uLgorICBTb3VyY2VMb2NhdGlvbiBNYWNyb0V4cGFuc2lvblN0YXJ0OworICAKKyAgLy8vIFxicmllZiBUaGUgb2Zmc2V0IG9mIHRoZSBtYWNybyBleHBhbnNpb24gaW4gdGhlCisgIC8vLyAic291cmNlIGxvY2F0aW9uIGFkZHJlc3Mgc3BhY2UiLgorICB1bnNpZ25lZCBNYWNyb1N0YXJ0U0xvY09mZnNldDsKKworICAvLy8gXGJyaWVmIExvY2F0aW9uIG9mIHRoZSBtYWNybyBkZWZpbml0aW9uLgorICBTb3VyY2VMb2NhdGlvbiBNYWNyb0RlZlN0YXJ0OworCisgIC8vLyBcYnJpZWYgTGVuZ3RoIG9mIHRoZSBtYWNybyBkZWZpbml0aW9uLgorICB1bnNpZ25lZCBNYWNyb0RlZkxlbmd0aDsKKworICAvLy8gTGV4aWNhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhwYW5zaW9uIHBvaW50IG9mIHRoZSBtYWNybzogdGhlIGlkZW50aWZpZXIKKyAgLy8vIHRoYXQgdGhlIG1hY3JvIGV4cGFuZGVkIGZyb20gaGFkIHRoZXNlIHByb3BlcnRpZXMuCisgIGJvb2wgQXRTdGFydE9mTGluZSA6IDE7CisgIGJvb2wgSGFzTGVhZGluZ1NwYWNlIDogMTsKKworICAvLyBOZXh0VG9rR2V0c1NwYWNlIC0gV2hlbiB0aGlzIGlzIHRydWUsIHRoZSBuZXh0IHRva2VuIGFwcGVuZGVkIHRvIHRoZQorICAvLyBvdXRwdXQgbGlzdCBkdXJpbmcgZnVuY3Rpb24gYXJndW1lbnQgZXhwYW5zaW9uIHdpbGwgZ2V0IGEgbGVhZGluZyBzcGFjZSwKKyAgLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGhhZCBvbmUgdG8gYmVnaW4gd2l0aCBvciBub3QuIFRoaXMgaXMgdXNlZCBmb3IKKyAgLy8gcGxhY2VtYXJrZXIgc3VwcG9ydC4gSWYgc3RpbGwgdHJ1ZSBhZnRlciBmdW5jdGlvbiBhcmd1bWVudCBleHBhbnNpb24sIHRoZQorICAvLyBsZWFkaW5nIHNwYWNlIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZmlyc3QgdG9rZW4gZm9sbG93aW5nIHRoZSBtYWNybworICAvLyBleHBhbnNpb24uCisgIGJvb2wgTmV4dFRva0dldHNTcGFjZSA6IDE7CisKKyAgLy8vIE93bnNUb2tlbnMgLSBUaGlzIGlzIHRydWUgaWYgdGhpcyBUb2tlbkxleGVyIGFsbG9jYXRlZCB0aGUgVG9rZW5zCisgIC8vLyBhcnJheSwgYW5kIHRodXMgbmVlZHMgdG8gZnJlZSBpdCB3aGVuIGRlc3Ryb3llZC4gIEZvciBzaW1wbGUgb2JqZWN0LWxpa2UKKyAgLy8vIG1hY3JvcyAoZm9yIGV4YW1wbGUpIHdlIGp1c3QgcG9pbnQgaW50byB0aGUgdG9rZW4gYnVmZmVyIG9mIHRoZSBtYWNybworICAvLy8gZGVmaW5pdGlvbiwgd2UgZG9uJ3QgbWFrZSBhIGNvcHkgb2YgaXQuCisgIGJvb2wgT3duc1Rva2VucyA6IDE7CisKKyAgLy8vIERpc2FibGVNYWNyb0V4cGFuc2lvbiAtIFRoaXMgaXMgdHJ1ZSB3aGVuIHRva2VucyBsZXhlZCBmcm9tIHRoZSBUb2tlbkxleGVyCisgIC8vLyBzaG91bGQgbm90IGJlIHN1YmplY3QgdG8gZnVydGhlciBtYWNybyBleHBhbnNpb24uCisgIGJvb2wgRGlzYWJsZU1hY3JvRXhwYW5zaW9uIDogMTsKKworcHVibGljOgorICAvLy8gQ3JlYXRlIGEgVG9rZW5MZXhlciBmb3IgdGhlIHNwZWNpZmllZCBtYWNybyB3aXRoIHRoZSBzcGVjaWZpZWQgYWN0dWFsCisgIC8vLyBhcmd1bWVudHMuICBOb3RlIHRoYXQgdGhpcyBjdG9yIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgQWN0dWFsQXJncyBwb2ludGVyLgorICAvLy8gSUxFbmQgc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgJyknIGZvciBhIGZ1bmN0aW9uLWxpa2UgbWFjcm8gb3IgdGhlCisgIC8vLyBpZGVudGlmaWVyIGZvciBhbiBvYmplY3QtbGlrZSBtYWNyby4KKyAgVG9rZW5MZXhlcihUb2tlbiAmVG9rLCBTb3VyY2VMb2NhdGlvbiBJTEVuZCwgTWFjcm9JbmZvICpNSSwKKyAgICAgICAgICAgICBNYWNyb0FyZ3MgKkFjdHVhbEFyZ3MsIFByZXByb2Nlc3NvciAmcHApCisgICAgICA6IFBQKHBwKSwgT3duc1Rva2VucyhmYWxzZSkgeworICAgIEluaXQoVG9rLCBJTEVuZCwgTUksIEFjdHVhbEFyZ3MpOworICB9CisKKyAgLy8vIENyZWF0ZSBhIFRva2VuTGV4ZXIgZm9yIHRoZSBzcGVjaWZpZWQgdG9rZW4gc3RyZWFtLiAgSWYgJ093bnNUb2tlbnMnIGlzCisgIC8vLyBzcGVjaWZpZWQsIHRoaXMgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSB0b2tlbnMgYW5kIGRlbGV0ZVtdJ3MgdGhlbSB3aGVuCisgIC8vLyB0aGUgdG9rZW4gbGV4ZXIgaXMgZW1wdHkuCisgIFRva2VuTGV4ZXIoY29uc3QgVG9rZW4gKlRva0FycmF5LCB1bnNpZ25lZCBOdW1Ub2tzLCBib29sIERpc2FibGVFeHBhbnNpb24sCisgICAgICAgICAgICAgYm9vbCBvd25zVG9rZW5zLCBQcmVwcm9jZXNzb3IgJnBwKQorICAgICAgOiBQUChwcCksIE93bnNUb2tlbnMoZmFsc2UpIHsKKyAgICBJbml0KFRva0FycmF5LCBOdW1Ub2tzLCBEaXNhYmxlRXhwYW5zaW9uLCBvd25zVG9rZW5zKTsKKyAgfQorCisgIFRva2VuTGV4ZXIoY29uc3QgVG9rZW5MZXhlciAmKSA9IGRlbGV0ZTsKKyAgVG9rZW5MZXhlciAmb3BlcmF0b3I9KGNvbnN0IFRva2VuTGV4ZXIgJikgPSBkZWxldGU7CisgIH5Ub2tlbkxleGVyKCkgeyBkZXN0cm95KCk7IH0KKworICAvLy8gSW5pdCAtIEluaXRpYWxpemUgdGhpcyBUb2tlbkxleGVyIHRvIGV4cGFuZCBmcm9tIHRoZSBzcGVjaWZpZWQgbWFjcm8KKyAgLy8vIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudCBpbmZvcm1hdGlvbi4gIE5vdGUgdGhhdCB0aGlzIGN0b3IgdGFrZXMKKyAgLy8vIG93bmVyc2hpcCBvZiB0aGUgQWN0dWFsQXJncyBwb2ludGVyLiAgSUxFbmQgc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUKKyAgLy8vICcpJyBmb3IgYSBmdW5jdGlvbi1saWtlIG1hY3JvIG9yIHRoZSBpZGVudGlmaWVyIGZvciBhbiBvYmplY3QtbGlrZSBtYWNyby4KKyAgdm9pZCBJbml0KFRva2VuICZUb2ssIFNvdXJjZUxvY2F0aW9uIElMRW5kLCBNYWNyb0luZm8gKk1JLAorICAgICAgICAgICAgTWFjcm9BcmdzICpBY3R1YWxBcmdzKTsKKworICAvLy8gSW5pdCAtIEluaXRpYWxpemUgdGhpcyBUb2tlbkxleGVyIHdpdGggdGhlIHNwZWNpZmllZCB0b2tlbiBzdHJlYW0uCisgIC8vLyBUaGlzIGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZSBzcGVjaWZpZWQgdG9rZW4gdmVjdG9yLgorICAvLy8KKyAgLy8vIERpc2FibGVFeHBhbnNpb24gaXMgdHJ1ZSB3aGVuIG1hY3JvIGV4cGFuc2lvbiBvZiB0b2tlbnMgbGV4ZWQgZnJvbSB0aGlzCisgIC8vLyBzdHJlYW0gc2hvdWxkIGJlIGRpc2FibGVkLgorICB2b2lkIEluaXQoY29uc3QgVG9rZW4gKlRva0FycmF5LCB1bnNpZ25lZCBOdW1Ub2tzLAorICAgICAgICAgICAgYm9vbCBEaXNhYmxlTWFjcm9FeHBhbnNpb24sIGJvb2wgT3duc1Rva2Vucyk7CisKKyAgLy8vIGlzTmV4dFRva2VuTFBhcmVuIC0gSWYgdGhlIG5leHQgdG9rZW4gbGV4ZWQgd2lsbCBwb3AgdGhpcyBtYWNybyBvZmYgdGhlCisgIC8vLyBleHBhbnNpb24gc3RhY2ssIHJldHVybiAyLiAgSWYgdGhlIG5leHQgdW5leHBhbmRlZCB0b2tlbiBpcyBhICcoJywgcmV0dXJuCisgIC8vLyAxLCBvdGhlcndpc2UgcmV0dXJuIDAuCisgIHVuc2lnbmVkIGlzTmV4dFRva2VuTFBhcmVuKCkgY29uc3Q7CisKKyAgLy8vIExleCAtIExleCBhbmQgcmV0dXJuIGEgdG9rZW4gZnJvbSB0aGlzIG1hY3JvIHN0cmVhbS4KKyAgYm9vbCBMZXgoVG9rZW4gJlRvayk7CisKKyAgLy8vIGlzUGFyc2luZ1ByZXByb2Nlc3NvckRpcmVjdGl2ZSAtIFJldHVybiB0cnVlIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEKKyAgLy8vIHByZXByb2Nlc3NvciBkaXJlY3RpdmUuCisgIGJvb2wgaXNQYXJzaW5nUHJlcHJvY2Vzc29yRGlyZWN0aXZlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIHZvaWQgZGVzdHJveSgpOworCisgIC8vLyBpc0F0RW5kIC0gUmV0dXJuIHRydWUgaWYgdGhlIG5leHQgbGV4IGNhbGwgd2lsbCBwb3AgdGhpcyBtYWNybyBvZmYgdGhlCisgIC8vLyBpbmNsdWRlIHN0YWNrLgorICBib29sIGlzQXRFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIEN1clRva2VuSWR4ID09IE51bVRva2VuczsKKyAgfQorCisgIC8vLyBDb25jYXRlbmF0ZXMgdGhlIG5leHQgKHN1Yi0pc2VxdWVuY2Ugb2YgXHAgVG9rZW5zIHNlcGFyYXRlZCBieSAnIyMnCisgIC8vLyBzdGFydGluZyB3aXRoIExIU1RvayAtIHN0b3BwaW5nIHdoZW4gd2UgZW5jb3VudGVyIGEgdG9rZW4gdGhhdCBpcyBuZWl0aGVyCisgIC8vLyAnIyMnIG5vciBwcmVjZWRlZCBieSAnIyMnLiAgUGxhY2VzIHRoZSByZXN1bHQgYmFjayBpbnRvIFxwIExIU1RvayBhbmQgc2V0cworICAvLy8gXHAgQ3VySWR4IHRvIHBvaW50IHRvIHRoZSB0b2tlbiBmb2xsb3dpbmcgdGhlIGxhc3Qgb25lIHRoYXQgd2FzIHBhc3RlZC4KKyAgLy8vCisgIC8vLyBBbHNvIHBlcmZvcm1zIHRoZSBNU1ZDIGV4dGVuc2lvbiB3aWRlLWxpdGVyYWwgdG9rZW4gcGFzdGluZyBpbnZvbHZlZCB3aXRoOgorICAvLy8gICAgICAgXGNvZGUgTCAjbWFjcm8tYXJnLiBcZW5kY29kZQorICAvLy8KKyAgLy8vIFxwYXJhbVtpbixvdXRdIExIU1RvayAtIENvbnRhaW5zIHRoZSB0b2tlbiB0byB0aGUgbGVmdCBvZiAnIyMnIGluIFxwCisgIC8vLyBUb2tlbnMgdXBvbiBlbnRyeSBhbmQgd2lsbCBjb250YWluIHRoZSByZXN1bHRpbmcgY29uY2F0ZW5hdGVkIFRva2VuIHVwb24KKyAgLy8vIGV4aXQuCisgIC8vLworICAvLy8gXHBhcmFtW2luXSBUb2tlblN0cmVhbSAtIFRoZSBzdHJlYW0gb2YgVG9rZW5zIHdlIGFyZSBsZXhpbmcgZnJvbS4KKyAgLy8vCisgIC8vLyBccGFyYW1baW4sb3V0XSBDdXJJZHggLSBVcG9uIGVudHJ5LCBccFRva2Vuc1tccEN1cklkeF0gbXVzdCBlcXVhbCAnIyMnCisgIC8vLyAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBNU1ZDIGV4dGVuc2lvbiBtZW50aW9uZWQgYWJvdmUpLiAgVXBvbiBleGl0LCBpdAorICAvLy8gaXMgc2V0IHRvIHRoZSBpbmRleCBvZiB0aGUgdG9rZW4gZm9sbG93aW5nIHRoZSBsYXN0IHRva2VuIHRoYXQgd2FzCisgIC8vLyBjb25jYXRlbmF0ZWQgdG9nZXRoZXIuCisgIC8vLworICAvLy8gXHJldHVybnMgSWYgdGhpcyByZXR1cm5zIHRydWUsIHRoZSBjYWxsZXIgc2hvdWxkIGltbWVkaWF0ZWx5IHJldHVybiB0aGUKKyAgLy8vIHRva2VuLgorICBib29sIHBhc3RlVG9rZW5zKFRva2VuICZMSFNUb2ssIEFycmF5UmVmPFRva2VuPiBUb2tlblN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgJkN1cklkeCk7CisKKyAgLy8vIENhbGxzIHBhc3RlVG9rZW5zIGFib3ZlLCBwYXNzaW5nIGluIHRoZSAnKnRoaXMnIG9iamVjdCdzIFRva2VucyBhbmQKKyAgLy8vIEN1clRva2VuSWR4IGRhdGEgbWVtYmVycy4KKyAgYm9vbCBwYXN0ZVRva2VucyhUb2tlbiAmVG9rKTsKKworCisgIC8vLyBUYWtlcyB0aGUgdGFpbCBzZXF1ZW5jZSBvZiB0b2tlbnMgd2l0aGluIFJlcGxhY2VtZW50VG9rcyB0aGF0IHJlcHJlc2VudAorICAvLy8gdGhlIGp1c3QgZXhwYW5kZWQgX19WQV9PUFRfXyB0b2tlbnMgKHBvc3NpYmx5IHplcm8gdG9rZW5zKSBhbmQgdHJhbnNmb3JtcworICAvLy8gdGhlbSBpbnRvIGEgc3RyaW5nLiAgXHAgVkN0eCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCB0b2tlbiByZXByZXNlbnRzCisgIC8vLyB0aGUgZmlyc3QgX19WQV9PUFRfXyByZXBsYWNlbWVudCB0b2tlbi4KKyAgLy8vCisgIC8vLyBccGFyYW1baW4sb3V0XSBSZXBsYWNlbWVudFRva3MgLSBDb250YWlucyB0aGUgY3VycmVudCBSZXBsYWNlbWVudCBUb2tlbnMKKyAgLy8vIChwcmlvciB0byByZXNjYW5uaW5nIGFuZCB0b2tlbiBwYXN0aW5nKSwgdGhlIHRhaWwgZW5kIG9mIHdoaWNoIHJlcHJlc2VudHMKKyAgLy8vIHRoZSB0b2tlbnMganVzdCBleHBhbmRlZCB0aHJvdWdoIF9fVkFfT1BUX18gcHJvY2Vzc2luZy4gIFRoZXNlIChzdWIpCisgIC8vLyBzZXF1ZW5jZSBvZiB0b2tlbnMgYXJlIGZvbGRlZCBpbnRvIG9uZSBzdHJpbmdpZmllZCB0b2tlbi4KKyAgLy8vCisgIC8vLyBccGFyYW1baW5dIFZDdHggLSBjb250YWlucyByZWxldmVudCBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAvLy8gc3RhdGUgb2YgdGhlIHRva2VucyBhcm91bmQgYW5kIGluY2x1ZGluZyB0aGUgX19WQV9PUFRfXyB0b2tlbiwgbmVjZXNzYXJ5CisgIC8vLyBmb3Igc3RyaW5naWZpY2F0aW9uLgorICB2b2lkIHN0cmluZ2lmeVZBT1BUQ29udGVudHMoU21hbGxWZWN0b3JJbXBsPFRva2VuPiAmUmVwbGFjZW1lbnRUb2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVkFPcHRFeHBhbnNpb25Db250ZXh0ICZWQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVkFPUFRDbG9zaW5nUGFyZW5Mb2MpOworCisgIC8vLyBFeHBhbmQgdGhlIGFyZ3VtZW50cyBvZiBhIGZ1bmN0aW9uLWxpa2UgbWFjcm8gc28gdGhhdCB3ZSBjYW4gcXVpY2tseQorICAvLy8gcmV0dXJuIHByZWV4cGFuZGVkIHRva2VucyBmcm9tIFRva2Vucy4KKyAgdm9pZCBFeHBhbmRGdW5jdGlvbkFyZ3VtZW50cygpOworCisgIC8vLyBIYW5kbGVNaWNyb3NvZnRDb21tZW50UGFzdGUgLSBJbiBtaWNyb3NvZnQgY29tcGF0aWJpbGl0eSBtb2RlLCAvIyMvIHBhc3RlcworICAvLy8gdG9nZXRoZXIgdG8gZm9ybSBhIGNvbW1lbnQgdGhhdCBjb21tZW50cyBvdXQgZXZlcnl0aGluZyBpbiB0aGUgY3VycmVudAorICAvLy8gbWFjcm8sIG90aGVyIGFjdGl2ZSBtYWNyb3MsIGFuZCBhbnl0aGluZyBsZWZ0IG9uIHRoZSBjdXJyZW50IHBoeXNpY2FsCisgIC8vLyBzb3VyY2UgbGluZSBvZiB0aGUgZXhwYW5kZWQgYnVmZmVyLiAgSGFuZGxlIHRoaXMgYnkgcmV0dXJuaW5nIHRoZQorICAvLy8gZmlyc3QgdG9rZW4gb24gdGhlIG5leHQgbGluZS4KKyAgdm9pZCBIYW5kbGVNaWNyb3NvZnRDb21tZW50UGFzdGUoVG9rZW4gJlRvaywgU291cmNlTG9jYXRpb24gT3BMb2MpOworCisgIC8vLyBcYnJpZWYgSWYgXHAgbG9jIGlzIGEgRmlsZUlEIGFuZCBwb2ludHMgaW5zaWRlIHRoZSBjdXJyZW50IG1hY3JvCisgIC8vLyBkZWZpbml0aW9uLCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBzb3VyY2UgbG9jYXRpb24gcG9pbnRpbmcgYXQgdGhlCisgIC8vLyBtYWNybyBleHBhbnNpb24gc291cmNlIGxvY2F0aW9uIGVudHJ5LgorICBTb3VyY2VMb2NhdGlvbiBnZXRFeHBhbnNpb25Mb2NGb3JNYWNyb0RlZkxvYyhTb3VyY2VMb2NhdGlvbiBsb2MpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBTTG9jRW50cmllcyBhbmQgdXBkYXRlcyB0aGUgbG9jYXRpb25zIG9mIG1hY3JvIGFyZ3VtZW50CisgIC8vLyB0b2tlbnMgdG8gdGhlaXIgbmV3IGV4cGFuZGVkIGxvY2F0aW9ucy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQXJnSWRTcGVsbExvYyB0aGUgbG9jYXRpb24gb2YgdGhlIG1hY3JvIGFyZ3VtZW50IGlkIGluc2lkZSB0aGUKKyAgLy8vIG1hY3JvIGRlZmluaXRpb24uCisgIHZvaWQgdXBkYXRlTG9jRm9yTWFjcm9BcmdUb2tlbnMoU291cmNlTG9jYXRpb24gQXJnSWRTcGVsbExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAqYmVnaW5fdG9rZW5zLCBUb2tlbiAqZW5kX3Rva2Vucyk7CisKKyAgLy8vIFJlbW92ZSBjb21tYSBhaGVhZCBvZiBfX1ZBX0FSR1NfXywgaWYgcHJlc2VudCwgYWNjb3JkaW5nIHRvIGNvbXBpbGVyCisgIC8vLyBkaWFsZWN0IHNldHRpbmdzLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBjb21tYSBpcyByZW1vdmVkLgorICBib29sIE1heWJlUmVtb3ZlQ29tbWFCZWZvcmVWYUFyZ3MoU21hbGxWZWN0b3JJbXBsPFRva2VuPiAmUmVzdWx0VG9rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzUGFzdGVPcGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvSW5mbyAqTWFjcm8sIHVuc2lnbmVkIE1hY3JvQXJnTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVwcm9jZXNzb3IgJlBQKTsKKworICB2b2lkIFByb3BhZ2F0ZUxpbmVTdGFydExlYWRpbmdTcGFjZUluZm8oVG9rZW4gJlJlc3VsdCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19MRVhfVE9LRU5MRVhFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvVmFyaWFkaWNNYWNyb1N1cHBvcnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL0xleC9WYXJpYWRpY01hY3JvU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMWNlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9MZXgvVmFyaWFkaWNNYWNyb1N1cHBvcnQuaApAQCAtMCwwICsxLDIyNiBAQAorLy89PT0tIFZhcmlhZGljTWFjcm9TdXBwb3J0LmggLSBzdGF0ZSBtYWNoaW5lcyBhbmQgc2NvcGUgZ3VhcmRzIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBzdXBwb3J0IHR5cGVzIHRvIGhlbHAgd2l0aCBwcmVwcm9jZXNzaW5nIHZhcmlhZGljIG1hY3JvCisvLyAoaS5lLiBtYWNyb3MgdGhhdCB1c2U6IGVsbGlwc2VzIF9fVkFfQVJHU19fICkgZGVmaW5pdGlvbnMgYW5kCisvLyBleHBhbnNpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19MRVhfVkFSSUFESUNNQUNST1NVUFBPUlRfSAorI2RlZmluZSBMTFZNX0NMQU5HX0xFWF9WQVJJQURJQ01BQ1JPU1VQUE9SVF9ICisKKyNpbmNsdWRlICJjbGFuZy9MZXgvUHJlcHJvY2Vzc29yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgY2xhc3MgUHJlcHJvY2Vzc29yOworCisgIC8vLyBBbiBSQUlJIGNsYXNzIHRoYXQgdHJhY2tzIHdoZW4gdGhlIFByZXByb2Nlc3NvciBzdGFydHMgYW5kIHN0b3BzIGxleGluZworICAvLy8gdGhlIGRlZmluaXRpb24gb2YgYSAoSVNPIEMvQysrKSB2YXJpYWRpYyBtYWNyby4gIEFzIGFuIGV4YW1wbGUsIHRoaXMgaXMKKyAgLy8vIHVzZWZ1bCBmb3IgdW5wb2lzb25pbmcgYW5kIHJlcG9pc29uaW5nIGNlcnRhaW4gaWRlbnRpZmllcnMgKHN1Y2ggYXMKKyAgLy8vIF9fVkFfQVJHU19fKSB0aGF0IGFyZSBvbmx5IGFsbG93ZWQgaW4gdGhpcyBjb250ZXh0LiAgQWxzbywgYmVpbmcgYSBmcmllbmQKKyAgLy8vIG9mIHRoZSBQcmVwcm9jZXNzb3IgY2xhc3MgYWxsb3dzIGl0IHRvIGFjY2VzcyBQUCdzIGNhY2hlZCBpZGVudGlmaWVycworICAvLy8gZGlyZWN0bHkgKGFzIG9wcG9zZWQgdG8gcGVyZm9ybWluZyBhIGxvb2t1cCBlYWNoIHRpbWUpLgorICBjbGFzcyBWYXJpYWRpY01hY3JvU2NvcGVHdWFyZCB7CisgICAgY29uc3QgUHJlcHJvY2Vzc29yICZQUDsKKyAgICBJZGVudGlmaWVySW5mbyAqY29uc3QgSWRlbnRfX1ZBX0FSR1NfXzsKKyAgICBJZGVudGlmaWVySW5mbyAqY29uc3QgSWRlbnRfX1ZBX09QVF9fOworCisgIHB1YmxpYzoKKyAgICBWYXJpYWRpY01hY3JvU2NvcGVHdWFyZChjb25zdCBQcmVwcm9jZXNzb3IgJlApCisgICAgICAgIDogUFAoUCksIElkZW50X19WQV9BUkdTX18oUFAuSWRlbnRfX1ZBX0FSR1NfXyksCisgICAgICAgICAgSWRlbnRfX1ZBX09QVF9fKFBQLklkZW50X19WQV9PUFRfXykgeworICAgICAgYXNzZXJ0KElkZW50X19WQV9BUkdTX18tPmlzUG9pc29uZWQoKSAmJiAiX19WQV9BUkdTX18gc2hvdWxkIGJlIHBvaXNvbmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0c2lkZSBhbiBJU08gQy9DKysgdmFyaWFkaWMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWNybyBkZWZpbml0aW9uISIpOworICAgICAgYXNzZXJ0KAorICAgICAgICAgICFJZGVudF9fVkFfT1BUX18gfHwKKyAgICAgICAgICAoSWRlbnRfX1ZBX09QVF9fLT5pc1BvaXNvbmVkKCkgJiYgIl9fVkFfT1BUX18gc2hvdWxkIGJlIHBvaXNvbmVkISIpKTsKKyAgICB9CisKKyAgICAvLy8gQ2xpZW50IGNvZGUgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBqdXN0IGJlZm9yZSB0aGUgUHJlcHJvY2Vzc29yIGlzCisgICAgLy8vIGFib3V0IHRvIExleCB0b2tlbnMgZnJvbSB0aGUgZGVmaW5pdGlvbiBvZiBhIHZhcmlhZGljIChJU08gQy9DKyspIG1hY3JvLgorICAgIHZvaWQgZW50ZXJTY29wZSgpIHsKKyAgICAgIElkZW50X19WQV9BUkdTX18tPnNldElzUG9pc29uZWQoZmFsc2UpOworICAgICAgaWYgKElkZW50X19WQV9PUFRfXykKKyAgICAgICAgSWRlbnRfX1ZBX09QVF9fLT5zZXRJc1BvaXNvbmVkKGZhbHNlKTsKKyAgICB9CisKKyAgICAvLy8gQ2xpZW50IGNvZGUgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBhcyBzb29uIGFzIHRoZSBQcmVwcm9jZXNzb3IgaGFzCisgICAgLy8vIGVpdGhlciBjb21wbGV0ZWQgbGV4aW5nIHRoZSBtYWNybydzIGRlZmluaXRpb24gdG9rZW5zLCBvciBhbiBlcnJvcgorICAgIC8vLyBvY2N1cnJlZCBhbmQgdGhlIGNvbnRleHQgaXMgYmVpbmcgZXhpdGVkLiAgVGhpcyBmdW5jdGlvbiBpcyBpZGVtcG90ZW50CisgICAgLy8vIChtaWdodCBiZSBleHBsaWNpdGx5IGNhbGxlZCwgYW5kIHRoZW4gcmVpbnZva2VkIHZpYSB0aGUgZGVzdHJ1Y3RvcikuCisgICAgdm9pZCBleGl0U2NvcGUoKSB7CisgICAgICBJZGVudF9fVkFfQVJHU19fLT5zZXRJc1BvaXNvbmVkKHRydWUpOworICAgICAgaWYgKElkZW50X19WQV9PUFRfXykKKyAgICAgICAgSWRlbnRfX1ZBX09QVF9fLT5zZXRJc1BvaXNvbmVkKHRydWUpOworICAgIH0KKworICAgIH5WYXJpYWRpY01hY3JvU2NvcGVHdWFyZCgpIHsgZXhpdFNjb3BlKCk7IH0KKyAgfTsKKworICAvLy8gXGJyaWVmIEEgY2xhc3MgZm9yIHRyYWNraW5nIHdoZXRoZXIgd2UncmUgaW5zaWRlIGEgVkFfT1BUIGR1cmluZyBhCisgIC8vLyB0cmF2ZXJzYWwgb2YgdGhlIHRva2VucyBvZiBhIHZhcmlhZGljIG1hY3JvIGRlZmluaXRpb24uCisgIGNsYXNzIFZBT3B0RGVmaW5pdGlvbkNvbnRleHQgeworICAgIC8vLyBDb250YWlucyBhbGwgdGhlIGxvY2F0aW9ucyBvZiBzbyBmYXIgdW5tYXRjaGVkIGxwYXJlbnMuCisgICAgU21hbGxWZWN0b3I8U291cmNlTG9jYXRpb24sIDg+IFVubWF0Y2hlZE9wZW5pbmdQYXJlbnM7CisgICAgCisgICAgY29uc3QgSWRlbnRpZmllckluZm8gKmNvbnN0IElkZW50X19WQV9PUFRfXzsKKyAgICAKKyAgICAKKyAgcHVibGljOgorICAgIFZBT3B0RGVmaW5pdGlvbkNvbnRleHQoUHJlcHJvY2Vzc29yICZQUCkKKyAgICAgICAgOiBJZGVudF9fVkFfT1BUX18oUFAuSWRlbnRfX1ZBX09QVF9fKSB7fQorCisgICAgYm9vbCBpc1ZBT3B0VG9rZW4oY29uc3QgVG9rZW4gJlQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBJZGVudF9fVkFfT1BUX18gJiYgVC5nZXRJZGVudGlmaWVySW5mbygpID09IElkZW50X19WQV9PUFRfXzsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHdlIGhhdmUgc2VlbiB0aGUgX19WQV9PUFRfXyBhbmQgJygnIGJ1dCBiZWZvcmUgaGF2aW5nCisgICAgLy8vIHNlZW4gdGhlIG1hdGNoaW5nICcpJy4KKyAgICBib29sIGlzSW5WQU9wdCgpIGNvbnN0IHsgcmV0dXJuIFVubWF0Y2hlZE9wZW5pbmdQYXJlbnMuc2l6ZSgpOyB9CisgICAgCisgICAgLy8vIENhbGwgdGhpcyBmdW5jdGlvbiBhcyBzb29uIGFzIHlvdSBzZWUgX19WQV9PUFRfXyBhbmQgJygnLgorICAgIHZvaWQgc2F3VkFPcHRGb2xsb3dlZEJ5T3BlbmluZ1BhcmVucyhjb25zdCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MpIHsKKyAgICAgIGFzc2VydCghaXNJblZBT3B0KCkgJiYgIk11c3QgTk9UIGJlIHdpdGhpbiBWQU9QVCBjb250ZXh0IHRvIGNhbGwgdGhpcyIpOworICAgICAgVW5tYXRjaGVkT3BlbmluZ1BhcmVucy5wdXNoX2JhY2soTFBhcmVuTG9jKTsKKyAgICAgIAorICAgIH0KKworICAgIFNvdXJjZUxvY2F0aW9uIGdldFVubWF0Y2hlZE9wZW5pbmdQYXJlbkxvYygpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpc0luVkFPcHQoKSAmJiAiTXVzdCBiZSB3aXRoaW4gVkFPUFQgY29udGV4dCB0byBjYWxsIHRoaXMiKTsKKyAgICAgIHJldHVybiBVbm1hdGNoZWRPcGVuaW5nUGFyZW5zLmJhY2soKTsKKyAgICB9CisKKyAgICAvLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIGVhY2ggdGltZSBhbiBycGFyZW4gaXMgc2Vlbi4gIEl0IHJldHVybnMgdHJ1ZSBvbmx5IGlmCisgICAgLy8vIHRoZSBycGFyZW4gdGhhdCB3YXMganVzdCBzZWVuIHdhcyB0aGUgZXZlbnR1YWwgKG5vbi1uZXN0ZWQpIGNsb3NpbmcKKyAgICAvLy8gcGFyZW4gZm9yIFZBT1BULCBhbmQgZWplY3RzIHVzIG91dCBvZiB0aGUgVkFPUFQgY29udGV4dC4KKyAgICBib29sIHNhd0Nsb3NpbmdQYXJlbigpIHsKKyAgICAgIGFzc2VydChpc0luVkFPcHQoKSAmJiAiTXVzdCBiZSB3aXRoaW4gVkFPUFQgY29udGV4dCB0byBjYWxsIHRoaXMiKTsKKyAgICAgIFVubWF0Y2hlZE9wZW5pbmdQYXJlbnMucG9wX2JhY2soKTsKKyAgICAgIHJldHVybiAhVW5tYXRjaGVkT3BlbmluZ1BhcmVucy5zaXplKCk7CisgICAgfQorICAgIAorICAgIC8vLyBDYWxsIHRoaXMgZnVuY3Rpb24gZWFjaCB0aW1lIGFuIGxwYXJlbiBpcyBzZWVuLgorICAgIHZvaWQgc2F3T3BlbmluZ1BhcmVuKFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYykgeworICAgICAgYXNzZXJ0KGlzSW5WQU9wdCgpICYmICJNdXN0IGJlIHdpdGhpbiBWQU9QVCBjb250ZXh0IHRvIGNhbGwgdGhpcyIpOworICAgICAgVW5tYXRjaGVkT3BlbmluZ1BhcmVucy5wdXNoX2JhY2soTFBhcmVuTG9jKTsKKyAgICB9CisgICAgCisgIH07CisKKyAgLy8vIFxicmllZiBBIGNsYXNzIGZvciB0cmFja2luZyB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhIFZBX09QVCBkdXJpbmcgYQorICAvLy8gdHJhdmVyc2FsIG9mIHRoZSB0b2tlbnMgb2YgYSBtYWNybyBkdXJpbmcgbWFjcm8gZXhwYW5zaW9uLgorICBjbGFzcyBWQU9wdEV4cGFuc2lvbkNvbnRleHQgOiBWQU9wdERlZmluaXRpb25Db250ZXh0IHsKKworICAgIFRva2VuIFN5bnRoZXRpY0VPRlRva2VuOworCisgICAgLy8gVGhlIChzcGVsbGluZykgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgX19WQV9PUFRfXyBpbiB0aGUgcmVwbGFjZW1lbnQgbGlzdAorICAgIC8vIG9mIHRoZSBmdW5jdGlvbi1saWtlIG1hY3JvIGJlaW5nIGV4cGFuZGVkLgorICAgIFNvdXJjZUxvY2F0aW9uIFZBT3B0TG9jOworCisgICAgLy8gTnVtT2ZUb2tlbnNQcmlvclRvVkFPcHQgOiB3aGVuICE9IC0xLCBjb250YWlucyB0aGUgaW5kZXggKm9mKiB0aGUgZmlyc3QKKyAgICAvLyB0b2tlbiBvZiB0aGUgY3VycmVudCBWQU9QVCBjb250ZW50cyAoc28gd2Uga25vdyB3aGVyZSB0byBzdGFydCBlYWdlcgorICAgIC8vIHRva2VuLXBhc3RpbmcgYW5kIHN0cmluZ2lmaWNhdGlvbikgKndpdGhpbiogIHRoZSBzdWJzdGl0dXRlZCB0b2tlbnMgb2YKKyAgICAvLyB0aGUgZnVuY3Rpb24tbGlrZSBtYWNybydzIG5ldyByZXBsYWNlbWVudCBsaXN0LgorICAgIGludCBOdW1PZlRva2Vuc1ByaW9yVG9WQU9wdCA9IC0xOworCisgICAgdW5zaWduZWQgTGVhZGluZ1NwYWNlRm9yU3RyaW5naWZpZWRUb2tlbiA6IDE7CisgICAgCisgICAgdW5zaWduZWQgU3RyaW5naWZ5QmVmb3JlIDogMTsKKyAgICB1bnNpZ25lZCBDaGFyaWZ5QmVmb3JlIDogMTsKKyAgICAKKyAgICAKKyAgICBib29sIGhhc1N0cmluZ2lmeUJlZm9yZSgpIGNvbnN0IHsKKyAgICAgIGFzc2VydCghaXNSZXNldCgpICYmCisgICAgICAgICAgICAgIk11c3Qgb25seSBiZSBjYWxsZWQgaWYgdGhlIHN0YXRlIGhhcyBub3QgYmVlbiByZXNldCIpOworICAgICAgcmV0dXJuIFN0cmluZ2lmeUJlZm9yZTsKKyAgICB9CisKKyAgICBib29sIGlzUmVzZXQoKSBjb25zdCB7CisgICAgICByZXR1cm4gTnVtT2ZUb2tlbnNQcmlvclRvVkFPcHQgPT0gLTEgfHwKKyAgICAgICAgICAgICBWQU9wdExvYy5pc0ludmFsaWQoKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFZBT3B0RXhwYW5zaW9uQ29udGV4dChQcmVwcm9jZXNzb3IgJlBQKQorICAgICAgICA6IFZBT3B0RGVmaW5pdGlvbkNvbnRleHQoUFApLCBMZWFkaW5nU3BhY2VGb3JTdHJpbmdpZmllZFRva2VuKGZhbHNlKSwKKyAgICAgICAgICBTdHJpbmdpZnlCZWZvcmUoZmFsc2UpLCBDaGFyaWZ5QmVmb3JlKGZhbHNlKSB7CisgICAgICBTeW50aGV0aWNFT0ZUb2tlbi5zdGFydFRva2VuKCk7CisgICAgICBTeW50aGV0aWNFT0ZUb2tlbi5zZXRLaW5kKHRvazo6ZW9mKTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgVkFPcHRMb2MgPSBTb3VyY2VMb2NhdGlvbigpOworICAgICAgTnVtT2ZUb2tlbnNQcmlvclRvVkFPcHQgPSAtMTsKKyAgICAgIExlYWRpbmdTcGFjZUZvclN0cmluZ2lmaWVkVG9rZW4gPSBmYWxzZTsKKyAgICAgIFN0cmluZ2lmeUJlZm9yZSA9IGZhbHNlOworICAgICAgQ2hhcmlmeUJlZm9yZSA9IGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IFRva2VuICZnZXRFT0ZUb2soKSBjb25zdCB7IHJldHVybiBTeW50aGV0aWNFT0ZUb2tlbjsgfQorCisgICAgdm9pZCBzYXdIYXNoT3JIYXNoQXRCZWZvcmUoY29uc3QgYm9vbCBIYXNMZWFkaW5nU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBJc0hhc2hBdCkgeworICAgICAgCisgICAgICBTdHJpbmdpZnlCZWZvcmUgPSAhSXNIYXNoQXQ7CisgICAgICBDaGFyaWZ5QmVmb3JlID0gSXNIYXNoQXQ7CisgICAgICBMZWFkaW5nU3BhY2VGb3JTdHJpbmdpZmllZFRva2VuID0gSGFzTGVhZGluZ1NwYWNlOworICAgIH0KKworICAgIAorICAgIAorICAgIGJvb2wgaGFzQ2hhcmlmeUJlZm9yZSgpIGNvbnN0IHsKKyAgICAgIGFzc2VydCghaXNSZXNldCgpICYmCisgICAgICAgICAgICAgIk11c3Qgb25seSBiZSBjYWxsZWQgaWYgdGhlIHN0YXRlIGhhcyBub3QgYmVlbiByZXNldCIpOworICAgICAgcmV0dXJuIENoYXJpZnlCZWZvcmU7CisgICAgfQorICAgIGJvb2wgaGFzU3RyaW5naWZ5T3JDaGFyaWZ5QmVmb3JlKCkgY29uc3QgeworICAgICAgcmV0dXJuIGhhc1N0cmluZ2lmeUJlZm9yZSgpIHx8IGhhc0NoYXJpZnlCZWZvcmUoKTsKKyAgICB9CisgICAgCisgICAgdW5zaWduZWQgaW50IGdldE51bWJlck9mVG9rZW5zUHJpb3JUb1ZBT3B0KCkgY29uc3QgeworICAgICAgYXNzZXJ0KCFpc1Jlc2V0KCkgJiYKKyAgICAgICAgICAgICAiTXVzdCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgc3RhdGUgaGFzIG5vdCBiZWVuIHJlc2V0Iik7CisgICAgICByZXR1cm4gTnVtT2ZUb2tlbnNQcmlvclRvVkFPcHQ7CisgICAgfQorICAgIAorICAgIGJvb2wgZ2V0TGVhZGluZ1NwYWNlRm9yU3RyaW5naWZpZWRUb2tlbigpIGNvbnN0IHsKKyAgICAgIGFzc2VydChoYXNTdHJpbmdpZnlCZWZvcmUoKSAmJgorICAgICAgICAgICAgICJNdXN0IG9ubHkgYmUgY2FsbGVkIGlmIHRoaXMgaGFzIGJlZW4gbWFya2VkIGZvciBzdHJpbmdpZmljYXRpb24iKTsKKyAgICAgIHJldHVybiBMZWFkaW5nU3BhY2VGb3JTdHJpbmdpZmllZFRva2VuOworICAgIH0KKworICAgIHZvaWQgc2F3VkFPcHRGb2xsb3dlZEJ5T3BlbmluZ1BhcmVucyhjb25zdCBTb3VyY2VMb2NhdGlvbiBWQU9wdExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IE51bVByaW9yVG9rZW5zKSB7CisgICAgICBhc3NlcnQoVkFPcHRMb2MuaXNGaWxlSUQoKSAmJiAiTXVzdCBub3QgY29tZSBmcm9tIGEgbWFjcm8gZXhwYW5zaW9uIik7CisgICAgICBhc3NlcnQoaXNSZXNldCgpICYmICJNdXN0IG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBzdGF0ZSBoYXMgYmVlbiByZXNldCIpOworICAgICAgVkFPcHREZWZpbml0aW9uQ29udGV4dDo6c2F3VkFPcHRGb2xsb3dlZEJ5T3BlbmluZ1BhcmVucyhTb3VyY2VMb2NhdGlvbigpKTsKKyAgICAgIHRoaXMtPlZBT3B0TG9jID0gVkFPcHRMb2M7CisgICAgICBOdW1PZlRva2Vuc1ByaW9yVG9WQU9wdCA9IE51bVByaW9yVG9rZW5zOworICAgICAgYXNzZXJ0KE51bU9mVG9rZW5zUHJpb3JUb1ZBT3B0ID4gLTEgJiYKKyAgICAgICAgICAgICAiVG9vIG1hbnkgcHJpb3IgdG9rZW5zIik7CisgICAgfQorCisgICAgU291cmNlTG9jYXRpb24gZ2V0VkFPcHRMb2MoKSBjb25zdCB7CisgICAgICBhc3NlcnQoIWlzUmVzZXQoKSAmJgorICAgICAgICAgICAgICJNdXN0IG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBzdGF0ZSBoYXMgbm90IGJlZW4gcmVzZXQiKTsKKyAgICAgIGFzc2VydChWQU9wdExvYy5pc1ZhbGlkKCkgJiYgIl9fVkFfT1BUX18gbG9jYXRpb24gbXVzdCBiZSB2YWxpZCIpOworICAgICAgcmV0dXJuIFZBT3B0TG9jOworICAgIH0KKyAgICB1c2luZyBWQU9wdERlZmluaXRpb25Db250ZXh0Ojppc1ZBT3B0VG9rZW47CisgICAgdXNpbmcgVkFPcHREZWZpbml0aW9uQ29udGV4dDo6aXNJblZBT3B0OworICAgIHVzaW5nIFZBT3B0RGVmaW5pdGlvbkNvbnRleHQ6OnNhd0Nsb3NpbmdQYXJlbjsKKyAgICB1c2luZyBWQU9wdERlZmluaXRpb25Db250ZXh0OjpzYXdPcGVuaW5nUGFyZW47CisgICAgCisgIH07Cit9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUGFyc2UvQXR0clBhcnNlclN0cmluZ1N3aXRjaGVzLmluYyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1BhcnNlL0F0dHJQYXJzZXJTdHJpbmdTd2l0Y2hlcy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUzZTYwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1BhcnNlL0F0dHJQYXJzZXJTdHJpbmdTd2l0Y2hlcy5pbmMKQEAgLTAsMCArMSwxMDggQEAKKy8qPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogUGFyc2VyLXJlbGF0ZWQgbGx2bTo6U3RyaW5nU3dpdGNoIGNhc2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLCBkbyBub3QgZWRpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZiBkZWZpbmVkKENMQU5HX0FUVFJfQVJHX0NPTlRFWFRfTElTVCkKKy5DYXNlKCJhY3F1aXJlX2NhcGFiaWxpdHkiLCB0cnVlKQorLkNhc2UoImFjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkiLCB0cnVlKQorLkNhc2UoImV4Y2x1c2l2ZV9sb2NrX2Z1bmN0aW9uIiwgdHJ1ZSkKKy5DYXNlKCJzaGFyZWRfbG9ja19mdW5jdGlvbiIsIHRydWUpCisuQ2FzZSgiYWNxdWlyZWRfYWZ0ZXIiLCB0cnVlKQorLkNhc2UoImFjcXVpcmVkX2JlZm9yZSIsIHRydWUpCisuQ2FzZSgiYXNzZXJ0X2NhcGFiaWxpdHkiLCB0cnVlKQorLkNhc2UoImFzc2VydF9zaGFyZWRfY2FwYWJpbGl0eSIsIHRydWUpCisuQ2FzZSgiYXNzZXJ0X2V4Y2x1c2l2ZV9sb2NrIiwgdHJ1ZSkKKy5DYXNlKCJhc3NlcnRfc2hhcmVkX2xvY2siLCB0cnVlKQorLkNhc2UoImV4Y2x1c2l2ZV90cnlsb2NrX2Z1bmN0aW9uIiwgdHJ1ZSkKKy5DYXNlKCJndWFyZGVkX2J5IiwgdHJ1ZSkKKy5DYXNlKCJsb2NrX3JldHVybmVkIiwgdHJ1ZSkKKy5DYXNlKCJsb2Nrc19leGNsdWRlZCIsIHRydWUpCisuQ2FzZSgicHRfZ3VhcmRlZF9ieSIsIHRydWUpCisuQ2FzZSgicmVsZWFzZV9jYXBhYmlsaXR5IiwgdHJ1ZSkKKy5DYXNlKCJyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5IiwgdHJ1ZSkKKy5DYXNlKCJyZWxlYXNlX2dlbmVyaWNfY2FwYWJpbGl0eSIsIHRydWUpCisuQ2FzZSgidW5sb2NrX2Z1bmN0aW9uIiwgdHJ1ZSkKKy5DYXNlKCJyZXF1aXJlc19jYXBhYmlsaXR5IiwgdHJ1ZSkKKy5DYXNlKCJleGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQiLCB0cnVlKQorLkNhc2UoInJlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5IiwgdHJ1ZSkKKy5DYXNlKCJzaGFyZWRfbG9ja3NfcmVxdWlyZWQiLCB0cnVlKQorLkNhc2UoInNoYXJlZF90cnlsb2NrX2Z1bmN0aW9uIiwgdHJ1ZSkKKy5DYXNlKCJ0cnlfYWNxdWlyZV9jYXBhYmlsaXR5IiwgdHJ1ZSkKKy5DYXNlKCJ0cnlfYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSIsIHRydWUpCisjZW5kaWYgLy8gQ0xBTkdfQVRUUl9BUkdfQ09OVEVYVF9MSVNUCisKKyNpZiBkZWZpbmVkKENMQU5HX0FUVFJfSURFTlRJRklFUl9BUkdfTElTVCkKKy5DYXNlKCJpbnRlcnJ1cHQiLCB0cnVlKQorLkNhc2UoImFyZ3VtZW50X3dpdGhfdHlwZV90YWciLCB0cnVlKQorLkNhc2UoInBvaW50ZXJfd2l0aF90eXBlX3RhZyIsIHRydWUpCisuQ2FzZSgiYXZhaWxhYmlsaXR5IiwgdHJ1ZSkKKy5DYXNlKCJibG9ja3MiLCB0cnVlKQorLkNhc2UoImNhbGxhYmxlX3doZW4iLCB0cnVlKQorLkNhc2UoImNvbnN1bWFibGUiLCB0cnVlKQorLkNhc2UoImVudW1fZXh0ZW5zaWJpbGl0eSIsIHRydWUpCisuQ2FzZSgiZm9ybWF0IiwgdHJ1ZSkKKy5DYXNlKCJsb29wIiwgdHJ1ZSkKKy5DYXNlKCJ1bnJvbGwiLCB0cnVlKQorLkNhc2UoIm5vdW5yb2xsIiwgdHJ1ZSkKKy5DYXNlKCJpbnRlcnJ1cHQiLCB0cnVlKQorLkNhc2UoIm1vZGUiLCB0cnVlKQorLkNhc2UoImRlY2xhcmUgc2ltZCIsIHRydWUpCisuQ2FzZSgiZGVjbGFyZSB0YXJnZXQiLCB0cnVlKQorLkNhc2UoIm9iamNfYnJpZGdlIiwgdHJ1ZSkKKy5DYXNlKCJvYmpjX2JyaWRnZV9tdXRhYmxlIiwgdHJ1ZSkKKy5DYXNlKCJvYmpjX2JyaWRnZV9yZWxhdGVkIiwgdHJ1ZSkKKy5DYXNlKCJvYmpjX2djIiwgdHJ1ZSkKKy5DYXNlKCJvYmpjX21ldGhvZF9mYW1pbHkiLCB0cnVlKQorLkNhc2UoIm9iamNfb3duZXJzaGlwIiwgdHJ1ZSkKKy5DYXNlKCJvd25lcnNoaXBfaG9sZHMiLCB0cnVlKQorLkNhc2UoIm93bmVyc2hpcF9yZXR1cm5zIiwgdHJ1ZSkKKy5DYXNlKCJvd25lcnNoaXBfdGFrZXMiLCB0cnVlKQorLkNhc2UoInBhcmFtX3R5cGVzdGF0ZSIsIHRydWUpCisuQ2FzZSgicGNzIiwgdHJ1ZSkKKy5DYXNlKCJyZXR1cm5fdHlwZXN0YXRlIiwgdHJ1ZSkKKy5DYXNlKCJzZXRfdHlwZXN0YXRlIiwgdHJ1ZSkKKy5DYXNlKCJ0ZXN0X3R5cGVzdGF0ZSIsIHRydWUpCisuQ2FzZSgidHlwZV90YWdfZm9yX2RhdGF0eXBlIiwgdHJ1ZSkKKy5DYXNlKCJ0eXBlX3Zpc2liaWxpdHkiLCB0cnVlKQorLkNhc2UoInZpc2liaWxpdHkiLCB0cnVlKQorI2VuZGlmIC8vIENMQU5HX0FUVFJfSURFTlRJRklFUl9BUkdfTElTVAorCisjaWYgZGVmaW5lZChDTEFOR19BVFRSX1RZUEVfQVJHX0xJU1QpCisuQ2FzZSgiaWJvdXRsZXRjb2xsZWN0aW9uIiwgdHJ1ZSkKKy5DYXNlKCJ2ZWNfdHlwZV9oaW50IiwgdHJ1ZSkKKyNlbmRpZiAvLyBDTEFOR19BVFRSX1RZUEVfQVJHX0xJU1QKKworI2lmIGRlZmluZWQoQ0xBTkdfQVRUUl9MQVRFX1BBUlNFRF9MSVNUKQorLkNhc2UoImFjcXVpcmVfY2FwYWJpbGl0eSIsIDEpCisuQ2FzZSgiYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSIsIDEpCisuQ2FzZSgiZXhjbHVzaXZlX2xvY2tfZnVuY3Rpb24iLCAxKQorLkNhc2UoInNoYXJlZF9sb2NrX2Z1bmN0aW9uIiwgMSkKKy5DYXNlKCJhY3F1aXJlZF9hZnRlciIsIDEpCisuQ2FzZSgiYWNxdWlyZWRfYmVmb3JlIiwgMSkKKy5DYXNlKCJhc3NlcnRfY2FwYWJpbGl0eSIsIDEpCisuQ2FzZSgiYXNzZXJ0X3NoYXJlZF9jYXBhYmlsaXR5IiwgMSkKKy5DYXNlKCJhc3NlcnRfZXhjbHVzaXZlX2xvY2siLCAxKQorLkNhc2UoImFzc2VydF9zaGFyZWRfbG9jayIsIDEpCisuQ2FzZSgiZGlhZ25vc2VfaWYiLCAxKQorLkNhc2UoImV4Y2x1c2l2ZV90cnlsb2NrX2Z1bmN0aW9uIiwgMSkKKy5DYXNlKCJndWFyZGVkX2J5IiwgMSkKKy5DYXNlKCJsb2NrX3JldHVybmVkIiwgMSkKKy5DYXNlKCJsb2Nrc19leGNsdWRlZCIsIDEpCisuQ2FzZSgicHRfZ3VhcmRlZF9ieSIsIDEpCisuQ2FzZSgicmVsZWFzZV9jYXBhYmlsaXR5IiwgMSkKKy5DYXNlKCJyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5IiwgMSkKKy5DYXNlKCJyZWxlYXNlX2dlbmVyaWNfY2FwYWJpbGl0eSIsIDEpCisuQ2FzZSgidW5sb2NrX2Z1bmN0aW9uIiwgMSkKKy5DYXNlKCJyZXF1aXJlc19jYXBhYmlsaXR5IiwgMSkKKy5DYXNlKCJleGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQiLCAxKQorLkNhc2UoInJlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5IiwgMSkKKy5DYXNlKCJzaGFyZWRfbG9ja3NfcmVxdWlyZWQiLCAxKQorLkNhc2UoInNoYXJlZF90cnlsb2NrX2Z1bmN0aW9uIiwgMSkKKy5DYXNlKCJ0cnlfYWNxdWlyZV9jYXBhYmlsaXR5IiwgMSkKKy5DYXNlKCJ0cnlfYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSIsIDEpCisjZW5kaWYgLy8gQ0xBTkdfQVRUUl9MQVRFX1BBUlNFRF9MSVNUCisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1BhcnNlL0F0dHJTdWJNYXRjaFJ1bGVzUGFyc2VyU3RyaW5nU3dpdGNoZXMuaW5jIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUGFyc2UvQXR0clN1Yk1hdGNoUnVsZXNQYXJzZXJTdHJpbmdTd2l0Y2hlcy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkY2Y5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1BhcnNlL0F0dHJTdWJNYXRjaFJ1bGVzUGFyc2VyU3RyaW5nU3dpdGNoZXMuaW5jCkBAIC0wLDAgKzEsODggQEAKK09wdGlvbmFsPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGU+IGRlZmF1bHRJc0F0dHJpYnV0ZVN1YmplY3RNYXRjaFN1YlJ1bGVGb3IoU3RyaW5nUmVmLCBib29sKSB7CisgIHJldHVybiBOb25lOworfQorCitPcHRpb25hbDxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlPiBpc0F0dHJpYnV0ZVN1YmplY3RNYXRjaFN1YlJ1bGVGb3JfZnVuY3Rpb24oU3RyaW5nUmVmIE5hbWUsIGJvb2wgSXNVbmxlc3MpIHsKKyAgaWYgKElzVW5sZXNzKQorICAgIHJldHVybiBsbHZtOjpTdHJpbmdTd2l0Y2g8T3B0aW9uYWw8YXR0cjo6U3ViamVjdE1hdGNoUnVsZT4+KE5hbWUpLgorICAgIERlZmF1bHQoTm9uZSk7CisgIHJldHVybiBsbHZtOjpTdHJpbmdTd2l0Y2g8T3B0aW9uYWw8YXR0cjo6U3ViamVjdE1hdGNoUnVsZT4+KE5hbWUpLgorICBDYXNlKCJpc19tZW1iZXIiLCBhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2Z1bmN0aW9uX2lzX21lbWJlcikuCisgIERlZmF1bHQoTm9uZSk7Cit9CisKK09wdGlvbmFsPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGU+IGlzQXR0cmlidXRlU3ViamVjdE1hdGNoU3ViUnVsZUZvcl9oYXNUeXBlKFN0cmluZ1JlZiBOYW1lLCBib29sIElzVW5sZXNzKSB7CisgIGlmIChJc1VubGVzcykKKyAgICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPE9wdGlvbmFsPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGU+PihOYW1lKS4KKyAgICBEZWZhdWx0KE5vbmUpOworICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPE9wdGlvbmFsPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGU+PihOYW1lKS4KKyAgQ2FzZSgiZnVuY3Rpb25UeXBlIiwgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9oYXNUeXBlX2Z1bmN0aW9uVHlwZSkuCisgIERlZmF1bHQoTm9uZSk7Cit9CisKK09wdGlvbmFsPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGU+IGlzQXR0cmlidXRlU3ViamVjdE1hdGNoU3ViUnVsZUZvcl9yZWNvcmQoU3RyaW5nUmVmIE5hbWUsIGJvb2wgSXNVbmxlc3MpIHsKKyAgaWYgKElzVW5sZXNzKQorICAgIHJldHVybiBsbHZtOjpTdHJpbmdTd2l0Y2g8T3B0aW9uYWw8YXR0cjo6U3ViamVjdE1hdGNoUnVsZT4+KE5hbWUpLgorICAgIENhc2UoImlzX3VuaW9uIiwgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9yZWNvcmRfbm90X2lzX3VuaW9uKS4KKyAgICBEZWZhdWx0KE5vbmUpOworICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPE9wdGlvbmFsPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGU+PihOYW1lKS4KKyAgRGVmYXVsdChOb25lKTsKK30KKworT3B0aW9uYWw8YXR0cjo6U3ViamVjdE1hdGNoUnVsZT4gaXNBdHRyaWJ1dGVTdWJqZWN0TWF0Y2hTdWJSdWxlRm9yX3ZhcmlhYmxlKFN0cmluZ1JlZiBOYW1lLCBib29sIElzVW5sZXNzKSB7CisgIGlmIChJc1VubGVzcykKKyAgICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPE9wdGlvbmFsPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGU+PihOYW1lKS4KKyAgICBDYXNlKCJpc19wYXJhbWV0ZXIiLCBhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX3ZhcmlhYmxlX25vdF9pc19wYXJhbWV0ZXIpLgorICAgIERlZmF1bHQoTm9uZSk7CisgIHJldHVybiBsbHZtOjpTdHJpbmdTd2l0Y2g8T3B0aW9uYWw8YXR0cjo6U3ViamVjdE1hdGNoUnVsZT4+KE5hbWUpLgorICBDYXNlKCJpc190aHJlYWRfbG9jYWwiLCBhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX3ZhcmlhYmxlX2lzX3RocmVhZF9sb2NhbCkuCisgIENhc2UoImlzX2dsb2JhbCIsIGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGVfaXNfZ2xvYmFsKS4KKyAgQ2FzZSgiaXNfcGFyYW1ldGVyIiwgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV92YXJpYWJsZV9pc19wYXJhbWV0ZXIpLgorICBEZWZhdWx0KE5vbmUpOworfQorCitPcHRpb25hbDxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlPiBpc0F0dHJpYnV0ZVN1YmplY3RNYXRjaFN1YlJ1bGVGb3Jfb2JqY19tZXRob2QoU3RyaW5nUmVmIE5hbWUsIGJvb2wgSXNVbmxlc3MpIHsKKyAgaWYgKElzVW5sZXNzKQorICAgIHJldHVybiBsbHZtOjpTdHJpbmdTd2l0Y2g8T3B0aW9uYWw8YXR0cjo6U3ViamVjdE1hdGNoUnVsZT4+KE5hbWUpLgorICAgIERlZmF1bHQoTm9uZSk7CisgIHJldHVybiBsbHZtOjpTdHJpbmdTd2l0Y2g8T3B0aW9uYWw8YXR0cjo6U3ViamVjdE1hdGNoUnVsZT4+KE5hbWUpLgorICBDYXNlKCJpc19pbnN0YW5jZSIsIGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfb2JqY19tZXRob2RfaXNfaW5zdGFuY2UpLgorICBEZWZhdWx0KE5vbmUpOworfQorCitzdGQ6OnBhaXI8T3B0aW9uYWw8YXR0cjo6U3ViamVjdE1hdGNoUnVsZT4sIE9wdGlvbmFsPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGU+ICgqKShTdHJpbmdSZWYsIGJvb2wpPiBpc0F0dHJpYnV0ZVN1YmplY3RNYXRjaFJ1bGUoU3RyaW5nUmVmIE5hbWUpIHsKKyAgcmV0dXJuIGxsdm06OlN0cmluZ1N3aXRjaDxzdGQ6OnBhaXI8T3B0aW9uYWw8YXR0cjo6U3ViamVjdE1hdGNoUnVsZT4sIE9wdGlvbmFsPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGU+ICgqKSAoU3RyaW5nUmVmLCBib29sKT4+KE5hbWUpLgorICBDYXNlKCJibG9jayIsIHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfYmxvY2ssIGRlZmF1bHRJc0F0dHJpYnV0ZVN1YmplY3RNYXRjaFN1YlJ1bGVGb3IpKS4KKyAgQ2FzZSgiZW51bSIsIHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZW51bSwgZGVmYXVsdElzQXR0cmlidXRlU3ViamVjdE1hdGNoU3ViUnVsZUZvcikpLgorICBDYXNlKCJlbnVtX2NvbnN0YW50Iiwgc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9lbnVtX2NvbnN0YW50LCBkZWZhdWx0SXNBdHRyaWJ1dGVTdWJqZWN0TWF0Y2hTdWJSdWxlRm9yKSkuCisgIENhc2UoImZpZWxkIiwgc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9maWVsZCwgZGVmYXVsdElzQXR0cmlidXRlU3ViamVjdE1hdGNoU3ViUnVsZUZvcikpLgorICBDYXNlKCJmdW5jdGlvbiIsIHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIGlzQXR0cmlidXRlU3ViamVjdE1hdGNoU3ViUnVsZUZvcl9mdW5jdGlvbikpLgorICBDYXNlKCJuYW1lc3BhY2UiLCBzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX25hbWVzcGFjZSwgZGVmYXVsdElzQXR0cmlidXRlU3ViamVjdE1hdGNoU3ViUnVsZUZvcikpLgorICBDYXNlKCJvYmpjX2NhdGVnb3J5Iiwgc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9vYmpjX2NhdGVnb3J5LCBkZWZhdWx0SXNBdHRyaWJ1dGVTdWJqZWN0TWF0Y2hTdWJSdWxlRm9yKSkuCisgIENhc2UoIm9iamNfaW50ZXJmYWNlIiwgc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9vYmpjX2ludGVyZmFjZSwgZGVmYXVsdElzQXR0cmlidXRlU3ViamVjdE1hdGNoU3ViUnVsZUZvcikpLgorICBDYXNlKCJvYmpjX21ldGhvZCIsIHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfb2JqY19tZXRob2QsIGlzQXR0cmlidXRlU3ViamVjdE1hdGNoU3ViUnVsZUZvcl9vYmpjX21ldGhvZCkpLgorICBDYXNlKCJvYmpjX3Byb3BlcnR5Iiwgc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9vYmpjX3Byb3BlcnR5LCBkZWZhdWx0SXNBdHRyaWJ1dGVTdWJqZWN0TWF0Y2hTdWJSdWxlRm9yKSkuCisgIENhc2UoIm9iamNfcHJvdG9jb2wiLCBzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX29iamNfcHJvdG9jb2wsIGRlZmF1bHRJc0F0dHJpYnV0ZVN1YmplY3RNYXRjaFN1YlJ1bGVGb3IpKS4KKyAgQ2FzZSgicmVjb3JkIiwgc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9yZWNvcmQsIGlzQXR0cmlidXRlU3ViamVjdE1hdGNoU3ViUnVsZUZvcl9yZWNvcmQpKS4KKyAgQ2FzZSgiaGFzVHlwZSIsIHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfaGFzVHlwZV9hYnN0cmFjdCwgaXNBdHRyaWJ1dGVTdWJqZWN0TWF0Y2hTdWJSdWxlRm9yX2hhc1R5cGUpKS4KKyAgQ2FzZSgidHlwZV9hbGlhcyIsIHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdHlwZV9hbGlhcywgZGVmYXVsdElzQXR0cmlidXRlU3ViamVjdE1hdGNoU3ViUnVsZUZvcikpLgorICBDYXNlKCJ2YXJpYWJsZSIsIHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGUsIGlzQXR0cmlidXRlU3ViamVjdE1hdGNoU3ViUnVsZUZvcl92YXJpYWJsZSkpLgorICBEZWZhdWx0KHN0ZDo6bWFrZV9wYWlyKE5vbmUsIGRlZmF1bHRJc0F0dHJpYnV0ZVN1YmplY3RNYXRjaFN1YlJ1bGVGb3IpKTsKK30KKworY29uc3QgY2hhciAqdmFsaWRBdHRyaWJ1dGVTdWJqZWN0TWF0Y2hTdWJSdWxlcyhhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlIFJ1bGUpIHsKKyAgc3dpdGNoIChSdWxlKSB7CisgIGNhc2UgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9mdW5jdGlvbjoKKyAgcmV0dXJuICInaXNfbWVtYmVyJyI7CisgIGNhc2UgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9oYXNUeXBlX2Fic3RyYWN0OgorICByZXR1cm4gIidmdW5jdGlvblR5cGUnIjsKKyAgY2FzZSBhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX3JlY29yZDoKKyAgcmV0dXJuICIndW5sZXNzKGlzX3VuaW9uKSciOworICBjYXNlIGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGU6CisgIHJldHVybiAiJ2lzX3RocmVhZF9sb2NhbCcsICdpc19nbG9iYWwnLCAnaXNfcGFyYW1ldGVyJywgJ3VubGVzcyhpc19wYXJhbWV0ZXIpJyI7CisgIGNhc2UgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9vYmpjX21ldGhvZDoKKyAgcmV0dXJuICInaXNfaW5zdGFuY2UnIjsKKyAgZGVmYXVsdDogcmV0dXJuIG51bGxwdHI7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUGFyc2UvUGFyc2VBU1QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1BhcnNlL1BhcnNlQVNULmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRjOTY4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1BhcnNlL1BhcnNlQVNULmgKQEAgLTAsMCArMSw1MiBAQAorLy89PT0tLS0gUGFyc2VBU1QuaCAtIERlZmluZSB0aGUgUGFyc2VBU1QgbWV0aG9kIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGNsYW5nOjpQYXJzZUFTVCBtZXRob2QuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1BBUlNFX1BBUlNFQVNUX0gKKyNkZWZpbmUgTExWTV9DTEFOR19QQVJTRV9QQVJTRUFTVF9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MYW5nT3B0aW9ucy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworICBjbGFzcyBQcmVwcm9jZXNzb3I7CisgIGNsYXNzIEFTVENvbnN1bWVyOworICBjbGFzcyBBU1RDb250ZXh0OworICBjbGFzcyBDb2RlQ29tcGxldGVDb25zdW1lcjsKKyAgY2xhc3MgU2VtYTsKKworICAvLy8gXGJyaWVmIFBhcnNlIHRoZSBlbnRpcmUgZmlsZSBzcGVjaWZpZWQsIG5vdGlmeWluZyB0aGUgQVNUQ29uc3VtZXIgYXMKKyAgLy8vIHRoZSBmaWxlIGlzIHBhcnNlZC4KKyAgLy8vCisgIC8vLyBUaGlzIG9wZXJhdGlvbiBpbnNlcnRzIHRoZSBwYXJzZWQgZGVjbHMgaW50byB0aGUgdHJhbnNsYXRpb24KKyAgLy8vIHVuaXQgaGVsZCBieSBDdHguCisgIC8vLworICAvLy8gXHBhcmFtIFByaW50U3RhdHMgV2hldGhlciB0byBwcmludCBMTFZNIHN0YXRpc3RpY3MgcmVsYXRlZCB0byBwYXJzaW5nLgorICAvLy8gXHBhcmFtIFRVS2luZCBUaGUga2luZCBvZiB0cmFuc2xhdGlvbiB1bml0IGJlaW5nIHBhcnNlZC4KKyAgLy8vIFxwYXJhbSBDb21wbGV0aW9uQ29uc3VtZXIgSWYgZ2l2ZW4sIGFuIG9iamVjdCB0byBjb25zdW1lIGNvZGUgY29tcGxldGlvbgorICAvLy8gcmVzdWx0cy4KKyAgLy8vIFxwYXJhbSBTa2lwRnVuY3Rpb25Cb2RpZXMgV2hldGhlciB0byBza2lwIHBhcnNpbmcgb2YgZnVuY3Rpb24gYm9kaWVzLgorICAvLy8gVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBzcGVlZCB1cCBzZWFyY2hlcyBmb3IKKyAgLy8vIGRlY2xhcmF0aW9ucy9kZWZpbml0aW9ucyB3aGVuIGluZGV4aW5nLgorICB2b2lkIFBhcnNlQVNUKFByZXByb2Nlc3NvciAmcHAsIEFTVENvbnN1bWVyICpDLAorICAgICAgICAgICAgICAgIEFTVENvbnRleHQgJkN0eCwgYm9vbCBQcmludFN0YXRzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgVHJhbnNsYXRpb25Vbml0S2luZCBUVUtpbmQgPSBUVV9Db21wbGV0ZSwKKyAgICAgICAgICAgICAgICBDb2RlQ29tcGxldGVDb25zdW1lciAqQ29tcGxldGlvbkNvbnN1bWVyID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBib29sIFNraXBGdW5jdGlvbkJvZGllcyA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIFBhcnNlIHRoZSBtYWluIGZpbGUga25vd24gdG8gdGhlIHByZXByb2Nlc3NvciwgcHJvZHVjaW5nIGFuIAorICAvLy8gYWJzdHJhY3Qgc3ludGF4IHRyZWUuCisgIHZvaWQgUGFyc2VBU1QoU2VtYSAmUywgYm9vbCBQcmludFN0YXRzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgYm9vbCBTa2lwRnVuY3Rpb25Cb2RpZXMgPSBmYWxzZSk7CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9QYXJzZS9QYXJzZURpYWdub3N0aWMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1BhcnNlL1BhcnNlRGlhZ25vc3RpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYTdmM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9QYXJzZS9QYXJzZURpYWdub3N0aWMuaApAQCAtMCwwICsxLDI4IEBACisvLz09PS0tLSBEaWFnbm9zdGljUGFyc2UuaCAtIERpYWdub3N0aWNzIGZvciBsaWJwYXJzZSAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfUEFSU0VfUEFSU0VESUFHTk9TVElDX0gKKyNkZWZpbmUgTExWTV9DTEFOR19QQVJTRV9QQVJTRURJQUdOT1NUSUNfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworICBuYW1lc3BhY2UgZGlhZyB7CisgICAgZW51bSB7CisjZGVmaW5lIERJQUcoRU5VTSxGTEFHUyxERUZBVUxUX01BUFBJTkcsREVTQyxHUk9VUCxcCisgICAgICAgICAgICAgU0ZJTkFFLE5PV0VSUk9SLFNIT1dJTlNZU0hFQURFUixDQVRFR09SWSkgRU5VTSwKKyNkZWZpbmUgUEFSU0VTVEFSVAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWNQYXJzZUtpbmRzLmluYyIKKyN1bmRlZiBESUFHCisgICAgICBOVU1fQlVJTFRJTl9QQVJTRV9ESUFHTk9TVElDUworICAgIH07CisgIH0gIC8vIGVuZCBuYW1lc3BhY2UgZGlhZworfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1BhcnNlL1BhcnNlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUGFyc2UvUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmOWYzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1BhcnNlL1BhcnNlci5oCkBAIC0wLDAgKzEsMjg1NCBAQAorLy89PT0tLS0gUGFyc2VyLmggLSBDIExhbmd1YWdlIFBhcnNlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIFBhcnNlciBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1BBUlNFX1BBUlNFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfUEFSU0VfUEFSU0VSX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BdmFpbGFiaWxpdHkuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9PcGVuTVBLaW5kcy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZXJhdG9yUHJlY2VkZW5jZS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NwZWNpZmllcnMuaCIKKyNpbmNsdWRlICJjbGFuZy9MZXgvQ29kZUNvbXBsZXRpb25IYW5kbGVyLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L1ByZXByb2Nlc3Nvci5oIgorI2luY2x1ZGUgImNsYW5nL1NlbWEvRGVjbFNwZWMuaCIKKyNpbmNsdWRlICJjbGFuZy9TZW1hL0xvb3BIaW50LmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9TZW1hLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUHJldHR5U3RhY2tUcmFjZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TYXZlQW5kUmVzdG9yZS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGFjaz4KKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgY2xhc3MgUHJhZ21hSGFuZGxlcjsKKyAgY2xhc3MgU2NvcGU7CisgIGNsYXNzIEJhbGFuY2VkRGVsaW1pdGVyVHJhY2tlcjsKKyAgY2xhc3MgQ29ycmVjdGlvbkNhbmRpZGF0ZUNhbGxiYWNrOworICBjbGFzcyBEZWNsR3JvdXBSZWY7CisgIGNsYXNzIERpYWdub3N0aWNCdWlsZGVyOworICBjbGFzcyBQYXJzZXI7CisgIGNsYXNzIFBhcnNpbmdEZWNsUkFJSU9iamVjdDsKKyAgY2xhc3MgUGFyc2luZ0RlY2xTcGVjOworICBjbGFzcyBQYXJzaW5nRGVjbGFyYXRvcjsKKyAgY2xhc3MgUGFyc2luZ0ZpZWxkRGVjbGFyYXRvcjsKKyAgY2xhc3MgQ29sb25Qcm90ZWN0aW9uUkFJSU9iamVjdDsKKyAgY2xhc3MgSW5NZXNzYWdlRXhwcmVzc2lvblJBSUlPYmplY3Q7CisgIGNsYXNzIFBvaXNvblNFSElkZW50aWZpZXJzUkFJSU9iamVjdDsKKyAgY2xhc3MgVmVyc2lvblR1cGxlOworICBjbGFzcyBPTVBDbGF1c2U7CisgIGNsYXNzIE9iakNUeXBlUGFyYW1MaXN0OworICBjbGFzcyBPYmpDVHlwZVBhcmFtZXRlcjsKKworLy8vIFBhcnNlciAtIFRoaXMgaW1wbGVtZW50cyBhIHBhcnNlciBmb3IgdGhlIEMgZmFtaWx5IG9mIGxhbmd1YWdlcy4gIEFmdGVyCisvLy8gcGFyc2luZyB1bml0cyBvZiB0aGUgZ3JhbW1hciwgcHJvZHVjdGlvbnMgYXJlIGludm9rZWQgdG8gaGFuZGxlIHdoYXRldmVyIGhhcworLy8vIGJlZW4gcmVhZC4KKy8vLworY2xhc3MgUGFyc2VyIDogcHVibGljIENvZGVDb21wbGV0aW9uSGFuZGxlciB7CisgIGZyaWVuZCBjbGFzcyBDb2xvblByb3RlY3Rpb25SQUlJT2JqZWN0OworICBmcmllbmQgY2xhc3MgSW5NZXNzYWdlRXhwcmVzc2lvblJBSUlPYmplY3Q7CisgIGZyaWVuZCBjbGFzcyBQb2lzb25TRUhJZGVudGlmaWVyc1JBSUlPYmplY3Q7CisgIGZyaWVuZCBjbGFzcyBPYmpDRGVjbENvbnRleHRTd2l0Y2g7CisgIGZyaWVuZCBjbGFzcyBQYXJlbkJyYWNlQnJhY2tldEJhbGFuY2VyOworICBmcmllbmQgY2xhc3MgQmFsYW5jZWREZWxpbWl0ZXJUcmFja2VyOworCisgIFByZXByb2Nlc3NvciAmUFA7CisKKyAgLy8vIFRvayAtIFRoZSBjdXJyZW50IHRva2VuIHdlIGFyZSBwZWVraW5nIGFoZWFkLiAgQWxsIHBhcnNpbmcgbWV0aG9kcyBhc3N1bWUKKyAgLy8vIHRoYXQgdGhpcyBpcyB2YWxpZC4KKyAgVG9rZW4gVG9rOworCisgIC8vIFByZXZUb2tMb2NhdGlvbiAtIFRoZSBsb2NhdGlvbiBvZiB0aGUgdG9rZW4gd2UgcHJldmlvdXNseQorICAvLyBjb25zdW1lZC4gVGhpcyB0b2tlbiBpcyB1c2VkIGZvciBkaWFnbm9zdGljcyB3aGVyZSB3ZSBleHBlY3RlZCB0bworICAvLyBzZWUgYSB0b2tlbiBmb2xsb3dpbmcgYW5vdGhlciB0b2tlbiAoZS5nLiwgdGhlICc7JyBhdCB0aGUgZW5kIG9mCisgIC8vIGEgc3RhdGVtZW50KS4KKyAgU291cmNlTG9jYXRpb24gUHJldlRva0xvY2F0aW9uOworCisgIHVuc2lnbmVkIHNob3J0IFBhcmVuQ291bnQgPSAwLCBCcmFja2V0Q291bnQgPSAwLCBCcmFjZUNvdW50ID0gMDsKKyAgdW5zaWduZWQgc2hvcnQgTWlzcGxhY2VkTW9kdWxlQmVnaW5Db3VudCA9IDA7CisKKyAgLy8vIEFjdGlvbnMgLSBUaGVzZSBhcmUgdGhlIGNhbGxiYWNrcyB3ZSBpbnZva2UgYXMgd2UgcGFyc2UgdmFyaW91cyBjb25zdHJ1Y3RzCisgIC8vLyBpbiB0aGUgZmlsZS4KKyAgU2VtYSAmQWN0aW9uczsKKworICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3M7CisKKyAgLy8vIFNjb3BlQ2FjaGUgLSBDYWNoZSBzY29wZXMgdG8gcmVkdWNlIG1hbGxvYyB0cmFmZmljLgorICBlbnVtIHsgU2NvcGVDYWNoZVNpemUgPSAxNiB9OworICB1bnNpZ25lZCBOdW1DYWNoZWRTY29wZXM7CisgIFNjb3BlICpTY29wZUNhY2hlW1Njb3BlQ2FjaGVTaXplXTsKKworICAvLy8gSWRlbnRpZmllcnMgdXNlZCBmb3IgU0VIIGhhbmRsaW5nIGluIEJvcmxhbmQuIFRoZXNlIGFyZSBvbmx5CisgIC8vLyBhbGxvd2VkIGluIHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlcworICAvLyBfX2V4Y2VwdCBibG9jaworICBJZGVudGlmaWVySW5mbyAqSWRlbnRfX2V4Y2VwdGlvbl9jb2RlLAorICAgICAgICAgICAgICAgICAqSWRlbnRfX19leGNlcHRpb25fY29kZSwKKyAgICAgICAgICAgICAgICAgKklkZW50X0dldEV4Y2VwdGlvbkNvZGU7CisgIC8vIF9fZXhjZXB0IGZpbHRlciBleHByZXNzaW9uCisgIElkZW50aWZpZXJJbmZvICpJZGVudF9fZXhjZXB0aW9uX2luZm8sCisgICAgICAgICAgICAgICAgICpJZGVudF9fX2V4Y2VwdGlvbl9pbmZvLAorICAgICAgICAgICAgICAgICAqSWRlbnRfR2V0RXhjZXB0aW9uSW5mbzsKKyAgLy8gX19maW5hbGx5CisgIElkZW50aWZpZXJJbmZvICpJZGVudF9fYWJub3JtYWxfdGVybWluYXRpb24sCisgICAgICAgICAgICAgICAgICpJZGVudF9fX2Fibm9ybWFsX3Rlcm1pbmF0aW9uLAorICAgICAgICAgICAgICAgICAqSWRlbnRfQWJub3JtYWxUZXJtaW5hdGlvbjsKKworICAvLy8gQ29udGV4dHVhbCBrZXl3b3JkcyBmb3IgTWljcm9zb2Z0IGV4dGVuc2lvbnMuCisgIElkZW50aWZpZXJJbmZvICpJZGVudF9fZXhjZXB0OworICBtdXRhYmxlIElkZW50aWZpZXJJbmZvICpJZGVudF9zZWFsZWQ7CisKKyAgLy8vIElkZW50X3N1cGVyIC0gSWRlbnRpZmllckluZm8gZm9yICJzdXBlciIsIHRvIHN1cHBvcnQgZmFzdAorICAvLy8gY29tcGFyaXNvbi4KKyAgSWRlbnRpZmllckluZm8gKklkZW50X3N1cGVyOworICAvLy8gSWRlbnRfdmVjdG9yLCBJZGVudF9ib29sIC0gY2FjaGVkIElkZW50aWZpZXJJbmZvcyBmb3IgInZlY3RvciIgYW5kCisgIC8vLyAiYm9vbCIgZmFzdCBjb21wYXJpc29uLiAgT25seSBwcmVzZW50IGlmIEFsdGlWZWMgb3IgWlZlY3RvciBhcmUgZW5hYmxlZC4KKyAgSWRlbnRpZmllckluZm8gKklkZW50X3ZlY3RvcjsKKyAgSWRlbnRpZmllckluZm8gKklkZW50X2Jvb2w7CisgIC8vLyBJZGVudF9waXhlbCAtIGNhY2hlZCBJZGVudGlmaWVySW5mb3MgZm9yICJwaXhlbCIgZmFzdCBjb21wYXJpc29uLgorICAvLy8gT25seSBwcmVzZW50IGlmIEFsdGlWZWMgZW5hYmxlZC4KKyAgSWRlbnRpZmllckluZm8gKklkZW50X3BpeGVsOworCisgIC8vLyBPYmplY3RpdmUtQyBjb250ZXh0dWFsIGtleXdvcmRzLgorICBtdXRhYmxlIElkZW50aWZpZXJJbmZvICpJZGVudF9pbnN0YW5jZXR5cGU7CisKKyAgLy8vIFxicmllZiBJZGVudGlmaWVyIGZvciAiaW50cm9kdWNlZCIuCisgIElkZW50aWZpZXJJbmZvICpJZGVudF9pbnRyb2R1Y2VkOworCisgIC8vLyBcYnJpZWYgSWRlbnRpZmllciBmb3IgImRlcHJlY2F0ZWQiLgorICBJZGVudGlmaWVySW5mbyAqSWRlbnRfZGVwcmVjYXRlZDsKKworICAvLy8gXGJyaWVmIElkZW50aWZpZXIgZm9yICJvYnNvbGV0ZWQiLgorICBJZGVudGlmaWVySW5mbyAqSWRlbnRfb2Jzb2xldGVkOworCisgIC8vLyBcYnJpZWYgSWRlbnRpZmllciBmb3IgInVuYXZhaWxhYmxlIi4KKyAgSWRlbnRpZmllckluZm8gKklkZW50X3VuYXZhaWxhYmxlOworICAKKyAgLy8vIFxicmllZiBJZGVudGlmaWVyIGZvciAibWVzc2FnZSIuCisgIElkZW50aWZpZXJJbmZvICpJZGVudF9tZXNzYWdlOworCisgIC8vLyBcYnJpZWYgSWRlbnRpZmllciBmb3IgInN0cmljdCIuCisgIElkZW50aWZpZXJJbmZvICpJZGVudF9zdHJpY3Q7CisKKyAgLy8vIFxicmllZiBJZGVudGlmaWVyIGZvciAicmVwbGFjZW1lbnQiLgorICBJZGVudGlmaWVySW5mbyAqSWRlbnRfcmVwbGFjZW1lbnQ7CisKKyAgLy8vIElkZW50aWZpZXJzIHVzZWQgYnkgdGhlICdleHRlcm5hbF9zb3VyY2Vfc3ltYm9sJyBhdHRyaWJ1dGUuCisgIElkZW50aWZpZXJJbmZvICpJZGVudF9sYW5ndWFnZSwgKklkZW50X2RlZmluZWRfaW4sCisgICAgICAqSWRlbnRfZ2VuZXJhdGVkX2RlY2xhcmF0aW9uOworCisgIC8vLyBDKysweCBjb250ZXh0dWFsIGtleXdvcmRzLgorICBtdXRhYmxlIElkZW50aWZpZXJJbmZvICpJZGVudF9maW5hbDsKKyAgbXV0YWJsZSBJZGVudGlmaWVySW5mbyAqSWRlbnRfR05VX2ZpbmFsOworICBtdXRhYmxlIElkZW50aWZpZXJJbmZvICpJZGVudF9vdmVycmlkZTsKKworICAvLyBDKysgdHlwZSB0cmFpdCBrZXl3b3JkcyB0aGF0IGNhbiBiZSByZXZlcnRlZCB0byBpZGVudGlmaWVycyBhbmQgc3RpbGwgYmUKKyAgLy8gdXNlZCBhcyB0eXBlIHRyYWl0cy4KKyAgbGx2bTo6U21hbGxEZW5zZU1hcDxJZGVudGlmaWVySW5mbyAqLCB0b2s6OlRva2VuS2luZD4gUmV2ZXJ0aWJsZVR5cGVUcmFpdHM7CisKKyAgc3RkOjp1bmlxdWVfcHRyPFByYWdtYUhhbmRsZXI+IEFsaWduSGFuZGxlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPFByYWdtYUhhbmRsZXI+IEdDQ1Zpc2liaWxpdHlIYW5kbGVyOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJhZ21hSGFuZGxlcj4gT3B0aW9uc0hhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBQYWNrSGFuZGxlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPFByYWdtYUhhbmRsZXI+IE1TU3RydWN0SGFuZGxlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPFByYWdtYUhhbmRsZXI+IFVudXNlZEhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBXZWFrSGFuZGxlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPFByYWdtYUhhbmRsZXI+IFJlZGVmaW5lRXh0bmFtZUhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBGUENvbnRyYWN0SGFuZGxlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPFByYWdtYUhhbmRsZXI+IE9wZW5DTEV4dGVuc2lvbkhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBPcGVuTVBIYW5kbGVyOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJhZ21hSGFuZGxlcj4gUENTZWN0aW9uSGFuZGxlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPFByYWdtYUhhbmRsZXI+IE1TQ29tbWVudEhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBNU0RldGVjdE1pc21hdGNoSGFuZGxlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPFByYWdtYUhhbmRsZXI+IE1TUG9pbnRlcnNUb01lbWJlcnM7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBNU1Z0b3JEaXNwOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJhZ21hSGFuZGxlcj4gTVNJbml0U2VnOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJhZ21hSGFuZGxlcj4gTVNEYXRhU2VnOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJhZ21hSGFuZGxlcj4gTVNCU1NTZWc7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBNU0NvbnN0U2VnOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJhZ21hSGFuZGxlcj4gTVNDb2RlU2VnOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJhZ21hSGFuZGxlcj4gTVNTZWN0aW9uOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJhZ21hSGFuZGxlcj4gTVNSdW50aW1lQ2hlY2tzOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJhZ21hSGFuZGxlcj4gTVNJbnRyaW5zaWM7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBNU09wdGltaXplOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJhZ21hSGFuZGxlcj4gQ1VEQUZvcmNlSG9zdERldmljZUhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBPcHRpbWl6ZUhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBMb29wSGludEhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBVbnJvbGxIaW50SGFuZGxlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPFByYWdtYUhhbmRsZXI+IE5vVW5yb2xsSGludEhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBGUEhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBTVERDRkVOVkhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBTVERDQ1hMSU1JVEhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBTVERDVW5rbm93bkhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBBdHRyaWJ1dGVQcmFnbWFIYW5kbGVyOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDb21tZW50SGFuZGxlcj4gQ29tbWVudFNlbWFIYW5kbGVyOworCisgIC8vLyBXaGV0aGVyIHRoZSAnPicgdG9rZW4gYWN0cyBhcyBhbiBvcGVyYXRvciBvciBub3QuIFRoaXMgd2lsbCBiZQorICAvLy8gdHJ1ZSBleGNlcHQgd2hlbiB3ZSBhcmUgcGFyc2luZyBhbiBleHByZXNzaW9uIHdpdGhpbiBhIEMrKworICAvLy8gdGVtcGxhdGUgYXJndW1lbnQgbGlzdCwgd2hlcmUgdGhlICc+JyBjbG9zZXMgdGhlIHRlbXBsYXRlCisgIC8vLyBhcmd1bWVudCBsaXN0LgorICBib29sIEdyZWF0ZXJUaGFuSXNPcGVyYXRvcjsKKworICAvLy8gQ29sb25Jc1NhY3JlZCAtIFdoZW4gdGhpcyBpcyBmYWxzZSwgd2UgYWdncmVzc2l2ZWx5IHRyeSB0byByZWNvdmVyIGZyb20KKyAgLy8vIGNvZGUgbGlrZSAiZm9vIDogYmFyIiBhcyBpZiBpdCB3ZXJlIGEgdHlwbyBmb3IgImZvbyA6OiBiYXIiLiAgVGhpcyBpcyBub3QKKyAgLy8vIHNhZmUgaW4gY2FzZSBzdGF0ZW1lbnRzIGFuZCBhIGZldyBvdGhlciB0aGluZ3MuICBUaGlzIGlzIG1hbmFnZWQgYnkgdGhlCisgIC8vLyBDb2xvblByb3RlY3Rpb25SQUlJT2JqZWN0IFJBSUkgb2JqZWN0LgorICBib29sIENvbG9uSXNTYWNyZWQ7CisKKyAgLy8vIFxicmllZiBXaGVuIHRydWUsIHdlIGFyZSBkaXJlY3RseSBpbnNpZGUgYW4gT2JqZWN0aXZlLUMgbWVzc2FnZQorICAvLy8gc2VuZCBleHByZXNzaW9uLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgbWFuYWdlZCBieSB0aGUgXGMgSW5NZXNzYWdlRXhwcmVzc2lvblJBSUlPYmplY3QgY2xhc3MsIGFuZAorICAvLy8gc2hvdWxkIG5vdCBiZSBzZXQgZGlyZWN0bHkuCisgIGJvb2wgSW5NZXNzYWdlRXhwcmVzc2lvbjsKKworICAvLy8gVGhlICJkZXB0aCIgb2YgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgY3VycmVudGx5IGJlaW5nIHBhcnNlZC4KKyAgdW5zaWduZWQgVGVtcGxhdGVQYXJhbWV0ZXJEZXB0aDsKKworICAvLy8gXGJyaWVmIFJBSUkgY2xhc3MgdGhhdCBtYW5hZ2VzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVwdGguCisgIGNsYXNzIFRlbXBsYXRlUGFyYW1ldGVyRGVwdGhSQUlJIHsKKyAgICB1bnNpZ25lZCAmRGVwdGg7CisgICAgdW5zaWduZWQgQWRkZWRMZXZlbHM7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBUZW1wbGF0ZVBhcmFtZXRlckRlcHRoUkFJSSh1bnNpZ25lZCAmRGVwdGgpCisgICAgICA6IERlcHRoKERlcHRoKSwgQWRkZWRMZXZlbHMoMCkge30KKworICAgIH5UZW1wbGF0ZVBhcmFtZXRlckRlcHRoUkFJSSgpIHsKKyAgICAgIERlcHRoIC09IEFkZGVkTGV2ZWxzOworICAgIH0KKworICAgIHZvaWQgb3BlcmF0b3IrKygpIHsKKyAgICAgICsrRGVwdGg7CisgICAgICArK0FkZGVkTGV2ZWxzOworICAgIH0KKyAgICB2b2lkIGFkZERlcHRoKHVuc2lnbmVkIEQpIHsKKyAgICAgIERlcHRoICs9IEQ7CisgICAgICBBZGRlZExldmVscyArPSBEOworICAgIH0KKyAgICB1bnNpZ25lZCBnZXREZXB0aCgpIGNvbnN0IHsgcmV0dXJuIERlcHRoOyB9CisgIH07CisKKyAgLy8vIEZhY3Rvcnkgb2JqZWN0IGZvciBjcmVhdGluZyBBdHRyaWJ1dGVMaXN0IG9iamVjdHMuCisgIEF0dHJpYnV0ZUZhY3RvcnkgQXR0ckZhY3Rvcnk7CisKKyAgLy8vIFxicmllZiBHYXRoZXJzIGFuZCBjbGVhbnMgdXAgVGVtcGxhdGVJZEFubm90YXRpb25zIHdoZW4gcGFyc2luZyBvZiBhCisgIC8vLyB0b3AtbGV2ZWwgZGVjbGFyYXRpb24gaXMgZmluaXNoZWQuCisgIFNtYWxsVmVjdG9yPFRlbXBsYXRlSWRBbm5vdGF0aW9uICosIDE2PiBUZW1wbGF0ZUlkczsKKworICAvLy8gXGJyaWVmIElkZW50aWZpZXJzIHdoaWNoIGhhdmUgYmVlbiBkZWNsYXJlZCB3aXRoaW4gYSB0ZW50YXRpdmUgcGFyc2UuCisgIFNtYWxsVmVjdG9yPElkZW50aWZpZXJJbmZvICosIDg+IFRlbnRhdGl2ZWx5RGVjbGFyZWRJZGVudGlmaWVyczsKKworICBJZGVudGlmaWVySW5mbyAqZ2V0U0VIRXhjZXB0S2V5d29yZCgpOworCisgIC8vLyBUcnVlIGlmIHdlIGFyZSB3aXRoaW4gYW4gT2JqZWN0aXZlLUMgY29udGFpbmVyIHdoaWxlIHBhcnNpbmcgQy1saWtlIGRlY2xzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgU2VtYSB0aGlua3Mgd2UgaGF2ZSBsZWZ0IHRoZSBjb250YWluZXIKKyAgLy8vIHRvIHBhcnNlIHRoZSBDLWxpa2UgZGVjbHMsIG1lYW5pbmcgQWN0aW9ucy5nZXRPYmpDRGVjbENvbnRleHQoKSB3aWxsCisgIC8vLyBiZSBOVUxMLgorICBib29sIFBhcnNpbmdJbk9iakNDb250YWluZXI7CisKKyAgLy8vIFdoZXRoZXIgdG8gc2tpcCBwYXJzaW5nIG9mIGZ1bmN0aW9uIGJvZGllcy4KKyAgLy8vCisgIC8vLyBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHNwZWVkIHVwIHNlYXJjaGVzIGZvcgorICAvLy8gZGVjbGFyYXRpb25zL2RlZmluaXRpb25zIHdoZW4gaW5kZXhpbmcuCisgIGJvb2wgU2tpcEZ1bmN0aW9uQm9kaWVzOworCisgIC8vLyBUaGUgbG9jYXRpb24gb2YgdGhlIGV4cHJlc3Npb24gc3RhdGVtZW50IHRoYXQgaXMgYmVpbmcgcGFyc2VkIHJpZ2h0IG5vdy4KKyAgLy8vIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGV4cHJlc3Npb24gdGhhdCBpcyBiZWluZyBwYXJzZWQgaXMgYSBzdGF0ZW1lbnQgb3IKKyAgLy8vIGp1c3QgYSByZWd1bGFyIHN1Yi1leHByZXNzaW9uLgorICBTb3VyY2VMb2NhdGlvbiBFeHByU3RhdGVtZW50VG9rTG9jOworCitwdWJsaWM6CisgIFBhcnNlcihQcmVwcm9jZXNzb3IgJlBQLCBTZW1hICZBY3Rpb25zLCBib29sIFNraXBGdW5jdGlvbkJvZGllcyk7CisgIH5QYXJzZXIoKSBvdmVycmlkZTsKKworICBjb25zdCBMYW5nT3B0aW9ucyAmZ2V0TGFuZ09wdHMoKSBjb25zdCB7IHJldHVybiBQUC5nZXRMYW5nT3B0cygpOyB9CisgIGNvbnN0IFRhcmdldEluZm8gJmdldFRhcmdldEluZm8oKSBjb25zdCB7IHJldHVybiBQUC5nZXRUYXJnZXRJbmZvKCk7IH0KKyAgUHJlcHJvY2Vzc29yICZnZXRQcmVwcm9jZXNzb3IoKSBjb25zdCB7IHJldHVybiBQUDsgfQorICBTZW1hICZnZXRBY3Rpb25zKCkgY29uc3QgeyByZXR1cm4gQWN0aW9uczsgfQorICBBdHRyaWJ1dGVGYWN0b3J5ICZnZXRBdHRyRmFjdG9yeSgpIHsgcmV0dXJuIEF0dHJGYWN0b3J5OyB9CisKKyAgY29uc3QgVG9rZW4gJmdldEN1clRva2VuKCkgY29uc3QgeyByZXR1cm4gVG9rOyB9CisgIFNjb3BlICpnZXRDdXJTY29wZSgpIGNvbnN0IHsgcmV0dXJuIEFjdGlvbnMuZ2V0Q3VyU2NvcGUoKTsgfQorICB2b2lkIGluY3JlbWVudE1TTWFuZ2xpbmdOdW1iZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIEFjdGlvbnMuaW5jcmVtZW50TVNNYW5nbGluZ051bWJlcigpOworICB9CisKKyAgRGVjbCAgKmdldE9iakNEZWNsQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIEFjdGlvbnMuZ2V0T2JqQ0RlY2xDb250ZXh0KCk7IH0KKworICAvLyBUeXBlIGZvcndhcmRpbmcuICBBbGwgb2YgdGhlc2UgYXJlIHN0YXRpY2FsbHkgJ3ZvaWQqJywgYnV0IHRoZXkgbWF5IGFsbCBiZQorICAvLyBkaWZmZXJlbnQgYWN0dWFsIGNsYXNzZXMgYmFzZWQgb24gdGhlIGFjdGlvbnMgaW4gcGxhY2UuCisgIHR5cGVkZWYgT3BhcXVlUHRyPERlY2xHcm91cFJlZj4gRGVjbEdyb3VwUHRyVHk7CisgIHR5cGVkZWYgT3BhcXVlUHRyPFRlbXBsYXRlTmFtZT4gVGVtcGxhdGVUeTsKKworICB0eXBlZGVmIFNtYWxsVmVjdG9yPFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqLCA0PiBUZW1wbGF0ZVBhcmFtZXRlckxpc3RzOworCisgIHR5cGVkZWYgU2VtYTo6RnVsbEV4cHJBcmcgRnVsbEV4cHJBcmc7CisKKyAgLy8gUGFyc2luZyBtZXRob2RzLgorCisgIC8vLyBJbml0aWFsaXplIC0gV2FybSB1cCB0aGUgcGFyc2VyLgorICAvLy8KKyAgdm9pZCBJbml0aWFsaXplKCk7CisKKyAgLy8vIFBhcnNlIHRoZSBmaXJzdCB0b3AtbGV2ZWwgZGVjbGFyYXRpb24gaW4gYSB0cmFuc2xhdGlvbiB1bml0LgorICBib29sIFBhcnNlRmlyc3RUb3BMZXZlbERlY2woRGVjbEdyb3VwUHRyVHkgJlJlc3VsdCk7CisKKyAgLy8vIFBhcnNlVG9wTGV2ZWxEZWNsIC0gUGFyc2Ugb25lIHRvcC1sZXZlbCBkZWNsYXJhdGlvbi4gUmV0dXJucyB0cnVlIGlmCisgIC8vLyB0aGUgRU9GIHdhcyBlbmNvdW50ZXJlZC4KKyAgYm9vbCBQYXJzZVRvcExldmVsRGVjbChEZWNsR3JvdXBQdHJUeSAmUmVzdWx0KTsKKyAgYm9vbCBQYXJzZVRvcExldmVsRGVjbCgpIHsKKyAgICBEZWNsR3JvdXBQdHJUeSBSZXN1bHQ7CisgICAgcmV0dXJuIFBhcnNlVG9wTGV2ZWxEZWNsKFJlc3VsdCk7CisgIH0KKworICAvLy8gQ29uc3VtZVRva2VuIC0gQ29uc3VtZSB0aGUgY3VycmVudCAncGVlayB0b2tlbicgYW5kIGxleCB0aGUgbmV4dCBvbmUuCisgIC8vLyBUaGlzIGRvZXMgbm90IHdvcmsgd2l0aCBzcGVjaWFsIHRva2Vuczogc3RyaW5nIGxpdGVyYWxzLCBjb2RlIGNvbXBsZXRpb24sCisgIC8vLyBhbm5vdGF0aW9uIHRva2VucyBhbmQgYmFsYW5jZWQgdG9rZW5zIG11c3QgYmUgaGFuZGxlZCB1c2luZyB0aGUgc3BlY2lmaWMKKyAgLy8vIGNvbnN1bWUgbWV0aG9kcy4KKyAgLy8vIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb25zdW1lZCB0b2tlbi4KKyAgU291cmNlTG9jYXRpb24gQ29uc3VtZVRva2VuKCkgeworICAgIGFzc2VydCghaXNUb2tlblNwZWNpYWwoKSAmJgorICAgICAgICAgICAiU2hvdWxkIGNvbnN1bWUgc3BlY2lhbCB0b2tlbnMgd2l0aCBDb25zdW1lKlRva2VuIik7CisgICAgUHJldlRva0xvY2F0aW9uID0gVG9rLmdldExvY2F0aW9uKCk7CisgICAgUFAuTGV4KFRvayk7CisgICAgcmV0dXJuIFByZXZUb2tMb2NhdGlvbjsKKyAgfQorCisgIGJvb2wgVHJ5Q29uc3VtZVRva2VuKHRvazo6VG9rZW5LaW5kIEV4cGVjdGVkKSB7CisgICAgaWYgKFRvay5pc05vdChFeHBlY3RlZCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgYXNzZXJ0KCFpc1Rva2VuU3BlY2lhbCgpICYmCisgICAgICAgICAgICJTaG91bGQgY29uc3VtZSBzcGVjaWFsIHRva2VucyB3aXRoIENvbnN1bWUqVG9rZW4iKTsKKyAgICBQcmV2VG9rTG9jYXRpb24gPSBUb2suZ2V0TG9jYXRpb24oKTsKKyAgICBQUC5MZXgoVG9rKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgVHJ5Q29uc3VtZVRva2VuKHRvazo6VG9rZW5LaW5kIEV4cGVjdGVkLCBTb3VyY2VMb2NhdGlvbiAmTG9jKSB7CisgICAgaWYgKCFUcnlDb25zdW1lVG9rZW4oRXhwZWN0ZWQpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIExvYyA9IFByZXZUb2tMb2NhdGlvbjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBDb25zdW1lQW55VG9rZW4gLSBEaXNwYXRjaCB0byB0aGUgcmlnaHQgQ29uc3VtZSogbWV0aG9kIGJhc2VkIG9uIHRoZQorICAvLy8gY3VycmVudCB0b2tlbiB0eXBlLiAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGluIGNhc2VzIHdoZXJlIHRoZSB0eXBlIG9mCisgIC8vLyB0aGUgdG9rZW4gcmVhbGx5IGlzbid0IGtub3duLCBlLmcuIGluIGVycm9yIHJlY292ZXJ5LgorICBTb3VyY2VMb2NhdGlvbiBDb25zdW1lQW55VG9rZW4oYm9vbCBDb25zdW1lQ29kZUNvbXBsZXRpb25Ub2sgPSBmYWxzZSkgeworICAgIGlmIChpc1Rva2VuUGFyZW4oKSkKKyAgICAgIHJldHVybiBDb25zdW1lUGFyZW4oKTsKKyAgICBpZiAoaXNUb2tlbkJyYWNrZXQoKSkKKyAgICAgIHJldHVybiBDb25zdW1lQnJhY2tldCgpOworICAgIGlmIChpc1Rva2VuQnJhY2UoKSkKKyAgICAgIHJldHVybiBDb25zdW1lQnJhY2UoKTsKKyAgICBpZiAoaXNUb2tlblN0cmluZ0xpdGVyYWwoKSkKKyAgICAgIHJldHVybiBDb25zdW1lU3RyaW5nVG9rZW4oKTsKKyAgICBpZiAoVG9rLmlzKHRvazo6Y29kZV9jb21wbGV0aW9uKSkKKyAgICAgIHJldHVybiBDb25zdW1lQ29kZUNvbXBsZXRpb25Ub2sgPyBDb25zdW1lQ29kZUNvbXBsZXRpb25Ub2tlbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaGFuZGxlVW5leHBlY3RlZENvZGVDb21wbGV0aW9uVG9rZW4oKTsKKyAgICBpZiAoVG9rLmlzQW5ub3RhdGlvbigpKQorICAgICAgcmV0dXJuIENvbnN1bWVBbm5vdGF0aW9uVG9rZW4oKTsKKyAgICByZXR1cm4gQ29uc3VtZVRva2VuKCk7CisgIH0KKworCisgIFNvdXJjZUxvY2F0aW9uIGdldEVuZE9mUHJldmlvdXNUb2tlbigpIHsKKyAgICByZXR1cm4gUFAuZ2V0TG9jRm9yRW5kT2ZUb2tlbihQcmV2VG9rTG9jYXRpb24pOworICB9CisKKyAgLy8vIFJldHJpZXZlIHRoZSB1bmRlcnNjb3JlZCBrZXl3b3JkIChfTm9ubnVsbCwgX051bGxhYmxlKSB0aGF0IGNvcnJlc3BvbmRzCisgIC8vLyB0byB0aGUgZ2l2ZW4gbnVsbGFiaWxpdHkga2luZC4KKyAgSWRlbnRpZmllckluZm8gKmdldE51bGxhYmlsaXR5S2V5d29yZChOdWxsYWJpbGl0eUtpbmQgbnVsbGFiaWxpdHkpIHsKKyAgICByZXR1cm4gQWN0aW9ucy5nZXROdWxsYWJpbGl0eUtleXdvcmQobnVsbGFiaWxpdHkpOworICB9CisKK3ByaXZhdGU6CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBMb3ctTGV2ZWwgdG9rZW4gcGVla2luZyBhbmQgY29uc3VtcHRpb24gbWV0aG9kcy4KKyAgLy8KKworICAvLy8gaXNUb2tlblBhcmVuIC0gUmV0dXJuIHRydWUgaWYgdGhlIGN1ciB0b2tlbiBpcyAnKCcgb3IgJyknLgorICBib29sIGlzVG9rZW5QYXJlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gVG9rLmlzT25lT2YodG9rOjpsX3BhcmVuLCB0b2s6OnJfcGFyZW4pOworICB9CisgIC8vLyBpc1Rva2VuQnJhY2tldCAtIFJldHVybiB0cnVlIGlmIHRoZSBjdXIgdG9rZW4gaXMgJ1snIG9yICddJy4KKyAgYm9vbCBpc1Rva2VuQnJhY2tldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVG9rLmlzT25lT2YodG9rOjpsX3NxdWFyZSwgdG9rOjpyX3NxdWFyZSk7CisgIH0KKyAgLy8vIGlzVG9rZW5CcmFjZSAtIFJldHVybiB0cnVlIGlmIHRoZSBjdXIgdG9rZW4gaXMgJ3snIG9yICd9Jy4KKyAgYm9vbCBpc1Rva2VuQnJhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIFRvay5pc09uZU9mKHRvazo6bF9icmFjZSwgdG9rOjpyX2JyYWNlKTsKKyAgfQorICAvLy8gaXNUb2tlblN0cmluZ0xpdGVyYWwgLSBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBzdHJpbmctbGl0ZXJhbC4KKyAgYm9vbCBpc1Rva2VuU3RyaW5nTGl0ZXJhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gdG9rOjppc1N0cmluZ0xpdGVyYWwoVG9rLmdldEtpbmQoKSk7CisgIH0KKyAgLy8vIGlzVG9rZW5TcGVjaWFsIC0gVHJ1ZSBpZiB0aGlzIHRva2VuIHJlcXVpcmVzIHNwZWNpYWwgY29uc3VtcHRpb24gbWV0aG9kcy4KKyAgYm9vbCBpc1Rva2VuU3BlY2lhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNUb2tlblN0cmluZ0xpdGVyYWwoKSB8fCBpc1Rva2VuUGFyZW4oKSB8fCBpc1Rva2VuQnJhY2tldCgpIHx8CisgICAgICAgICAgIGlzVG9rZW5CcmFjZSgpIHx8IFRvay5pcyh0b2s6OmNvZGVfY29tcGxldGlvbikgfHwgVG9rLmlzQW5ub3RhdGlvbigpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgJz0nIG9yIGlzIGEgdHlwZSBvZiAnPScuCisgIC8vLyBGb3IgdHlwb3MsIGdpdmUgYSBmaXhpdCB0byAnPScKKyAgYm9vbCBpc1Rva2VuRXF1YWxPckVxdWFsVHlwbygpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBjdXJyZW50IHRva2VuIHRvIHRoZSB0b2tlbiBzdHJlYW0gYW5kIG1ha2UgdGhlIGdpdmVuCisgIC8vLyB0b2tlbiB0aGUgY3VycmVudCB0b2tlbi4KKyAgdm9pZCBVbmNvbnN1bWVUb2tlbihUb2tlbiAmQ29uc3VtZWQpIHsKKyAgICAgIFRva2VuIE5leHQgPSBUb2s7CisgICAgICBQUC5FbnRlclRva2VuKENvbnN1bWVkKTsKKyAgICAgIFBQLkxleChUb2spOworICAgICAgUFAuRW50ZXJUb2tlbihOZXh0KTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIENvbnN1bWVBbm5vdGF0aW9uVG9rZW4oKSB7CisgICAgYXNzZXJ0KFRvay5pc0Fubm90YXRpb24oKSAmJiAid3JvbmcgY29uc3VtZSBtZXRob2QiKTsKKyAgICBTb3VyY2VMb2NhdGlvbiBMb2MgPSBUb2suZ2V0TG9jYXRpb24oKTsKKyAgICBQcmV2VG9rTG9jYXRpb24gPSBUb2suZ2V0QW5ub3RhdGlvbkVuZExvYygpOworICAgIFBQLkxleChUb2spOworICAgIHJldHVybiBMb2M7CisgIH0KKworICAvLy8gQ29uc3VtZVBhcmVuIC0gVGhpcyBjb25zdW1lIG1ldGhvZCBrZWVwcyB0aGUgcGFyZW4gY291bnQgdXAtdG8tZGF0ZS4KKyAgLy8vCisgIFNvdXJjZUxvY2F0aW9uIENvbnN1bWVQYXJlbigpIHsKKyAgICBhc3NlcnQoaXNUb2tlblBhcmVuKCkgJiYgIndyb25nIGNvbnN1bWUgbWV0aG9kIik7CisgICAgaWYgKFRvay5nZXRLaW5kKCkgPT0gdG9rOjpsX3BhcmVuKQorICAgICAgKytQYXJlbkNvdW50OworICAgIGVsc2UgaWYgKFBhcmVuQ291bnQpCisgICAgICAtLVBhcmVuQ291bnQ7ICAgICAgIC8vIERvbid0IGxldCB1bmJhbGFuY2VkICkncyBkcml2ZSB0aGUgY291bnQgbmVnYXRpdmUuCisgICAgUHJldlRva0xvY2F0aW9uID0gVG9rLmdldExvY2F0aW9uKCk7CisgICAgUFAuTGV4KFRvayk7CisgICAgcmV0dXJuIFByZXZUb2tMb2NhdGlvbjsKKyAgfQorCisgIC8vLyBDb25zdW1lQnJhY2tldCAtIFRoaXMgY29uc3VtZSBtZXRob2Qga2VlcHMgdGhlIGJyYWNrZXQgY291bnQgdXAtdG8tZGF0ZS4KKyAgLy8vCisgIFNvdXJjZUxvY2F0aW9uIENvbnN1bWVCcmFja2V0KCkgeworICAgIGFzc2VydChpc1Rva2VuQnJhY2tldCgpICYmICJ3cm9uZyBjb25zdW1lIG1ldGhvZCIpOworICAgIGlmIChUb2suZ2V0S2luZCgpID09IHRvazo6bF9zcXVhcmUpCisgICAgICArK0JyYWNrZXRDb3VudDsKKyAgICBlbHNlIGlmIChCcmFja2V0Q291bnQpCisgICAgICAtLUJyYWNrZXRDb3VudDsgICAgIC8vIERvbid0IGxldCB1bmJhbGFuY2VkIF0ncyBkcml2ZSB0aGUgY291bnQgbmVnYXRpdmUuCisKKyAgICBQcmV2VG9rTG9jYXRpb24gPSBUb2suZ2V0TG9jYXRpb24oKTsKKyAgICBQUC5MZXgoVG9rKTsKKyAgICByZXR1cm4gUHJldlRva0xvY2F0aW9uOworICB9CisKKyAgLy8vIENvbnN1bWVCcmFjZSAtIFRoaXMgY29uc3VtZSBtZXRob2Qga2VlcHMgdGhlIGJyYWNlIGNvdW50IHVwLXRvLWRhdGUuCisgIC8vLworICBTb3VyY2VMb2NhdGlvbiBDb25zdW1lQnJhY2UoKSB7CisgICAgYXNzZXJ0KGlzVG9rZW5CcmFjZSgpICYmICJ3cm9uZyBjb25zdW1lIG1ldGhvZCIpOworICAgIGlmIChUb2suZ2V0S2luZCgpID09IHRvazo6bF9icmFjZSkKKyAgICAgICsrQnJhY2VDb3VudDsKKyAgICBlbHNlIGlmIChCcmFjZUNvdW50KQorICAgICAgLS1CcmFjZUNvdW50OyAgICAgLy8gRG9uJ3QgbGV0IHVuYmFsYW5jZWQgfSdzIGRyaXZlIHRoZSBjb3VudCBuZWdhdGl2ZS4KKworICAgIFByZXZUb2tMb2NhdGlvbiA9IFRvay5nZXRMb2NhdGlvbigpOworICAgIFBQLkxleChUb2spOworICAgIHJldHVybiBQcmV2VG9rTG9jYXRpb247CisgIH0KKworICAvLy8gQ29uc3VtZVN0cmluZ1Rva2VuIC0gQ29uc3VtZSB0aGUgY3VycmVudCAncGVlayB0b2tlbicsIGxleGluZyBhIG5ldyBvbmUKKyAgLy8vIGFuZCByZXR1cm5pbmcgdGhlIHRva2VuIGtpbmQuICBUaGlzIG1ldGhvZCBpcyBzcGVjaWZpYyB0byBzdHJpbmdzLCBhcyBpdAorICAvLy8gaGFuZGxlcyBzdHJpbmcgbGl0ZXJhbCBjb25jYXRlbmF0aW9uLCBhcyBwZXIgQzk5IDUuMS4xLjIsIHRyYW5zbGF0aW9uCisgIC8vLyBwaGFzZSAjNi4KKyAgU291cmNlTG9jYXRpb24gQ29uc3VtZVN0cmluZ1Rva2VuKCkgeworICAgIGFzc2VydChpc1Rva2VuU3RyaW5nTGl0ZXJhbCgpICYmCisgICAgICAgICAgICJTaG91bGQgb25seSBjb25zdW1lIHN0cmluZyBsaXRlcmFscyB3aXRoIHRoaXMgbWV0aG9kIik7CisgICAgUHJldlRva0xvY2F0aW9uID0gVG9rLmdldExvY2F0aW9uKCk7CisgICAgUFAuTGV4KFRvayk7CisgICAgcmV0dXJuIFByZXZUb2tMb2NhdGlvbjsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29uc3VtZSB0aGUgY3VycmVudCBjb2RlLWNvbXBsZXRpb24gdG9rZW4uCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgdG8gY29uc3VtZSB0aGUgY29kZS1jb21wbGV0aW9uIHRva2VuIGFuZAorICAvLy8gY29udGludWUgcHJvY2Vzc2luZyBpbiBzcGVjaWFsIGNhc2VzIHdoZXJlIFxjIGN1dE9mZlBhcnNpbmcoKSBpc24ndAorICAvLy8gZGVzaXJlZCwgc3VjaCBhcyB0b2tlbiBjYWNoaW5nIG9yIGNvbXBsZXRpb24gd2l0aCBsb29rYWhlYWQuCisgIFNvdXJjZUxvY2F0aW9uIENvbnN1bWVDb2RlQ29tcGxldGlvblRva2VuKCkgeworICAgIGFzc2VydChUb2suaXModG9rOjpjb2RlX2NvbXBsZXRpb24pKTsKKyAgICBQcmV2VG9rTG9jYXRpb24gPSBUb2suZ2V0TG9jYXRpb24oKTsKKyAgICBQUC5MZXgoVG9rKTsKKyAgICByZXR1cm4gUHJldlRva0xvY2F0aW9uOworICB9CisKKyAgLy8vXCBicmllZiBXaGVuIHdlIGFyZSBjb25zdW1pbmcgYSBjb2RlLWNvbXBsZXRpb24gdG9rZW4gd2l0aG91dCBoYXZpbmcKKyAgLy8vIG1hdGNoZWQgc3BlY2lmaWMgcG9zaXRpb24gaW4gdGhlIGdyYW1tYXIsIHByb3ZpZGUgY29kZS1jb21wbGV0aW9uIHJlc3VsdHMKKyAgLy8vIGJhc2VkIG9uIGNvbnRleHQuCisgIC8vLworICAvLy8gXHJldHVybnMgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY29kZS1jb21wbGV0aW9uIHRva2VuLgorICBTb3VyY2VMb2NhdGlvbiBoYW5kbGVVbmV4cGVjdGVkQ29kZUNvbXBsZXRpb25Ub2tlbigpOworCisgIC8vLyBcYnJpZWYgQWJydXB0bHkgY3V0IG9mZiBwYXJzaW5nOyBtYWlubHkgdXNlZCB3aGVuIHdlIGhhdmUgcmVhY2hlZCB0aGUKKyAgLy8vIGNvZGUtY29tcGxldGlvbiBwb2ludC4KKyAgdm9pZCBjdXRPZmZQYXJzaW5nKCkgeworICAgIGlmIChQUC5pc0NvZGVDb21wbGV0aW9uRW5hYmxlZCgpKQorICAgICAgUFAuc2V0Q29kZUNvbXBsZXRpb25SZWFjaGVkKCk7CisgICAgLy8gQ3V0IG9mZiBwYXJzaW5nIGJ5IGFjdGluZyBhcyBpZiB3ZSByZWFjaGVkIHRoZSBlbmQtb2YtZmlsZS4KKyAgICBUb2suc2V0S2luZCh0b2s6OmVvZik7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIG9yIGF0IGEgdHJhbnNpdGlvbgorICAvLy8gYmV0d2VlbiBtb2R1bGVzLgorICBib29sIGlzRW9mT3JFb20oKSB7CisgICAgdG9rOjpUb2tlbktpbmQgS2luZCA9IFRvay5nZXRLaW5kKCk7CisgICAgcmV0dXJuIEtpbmQgPT0gdG9rOjplb2YgfHwgS2luZCA9PSB0b2s6OmFubm90X21vZHVsZV9iZWdpbiB8fAorICAgICAgICAgICBLaW5kID09IHRvazo6YW5ub3RfbW9kdWxlX2VuZCB8fCBLaW5kID09IHRvazo6YW5ub3RfbW9kdWxlX2luY2x1ZGU7CisgIH0KKworICAvLy8gXGJyaWVmIENoZWNrcyBpZiB0aGUgXHAgTGV2ZWwgaXMgdmFsaWQgZm9yIHVzZSBpbiBhIGZvbGQgZXhwcmVzc2lvbi4KKyAgYm9vbCBpc0ZvbGRPcGVyYXRvcihwcmVjOjpMZXZlbCBMZXZlbCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDaGVja3MgaWYgdGhlIFxwIEtpbmQgaXMgYSB2YWxpZCBvcGVyYXRvciBmb3IgZm9sZCBleHByZXNzaW9ucy4KKyAgYm9vbCBpc0ZvbGRPcGVyYXRvcih0b2s6OlRva2VuS2luZCBLaW5kKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEluaXRpYWxpemUgYWxsIHByYWdtYSBoYW5kbGVycy4KKyAgdm9pZCBpbml0aWFsaXplUHJhZ21hSGFuZGxlcnMoKTsKKworICAvLy8gXGJyaWVmIERlc3Ryb3kgYW5kIHJlc2V0IGFsbCBwcmFnbWEgaGFuZGxlcnMuCisgIHZvaWQgcmVzZXRQcmFnbWFIYW5kbGVycygpOworCisgIC8vLyBcYnJpZWYgSGFuZGxlIHRoZSBhbm5vdGF0aW9uIHRva2VuIHByb2R1Y2VkIGZvciAjcHJhZ21hIHVudXNlZCguLi4pCisgIHZvaWQgSGFuZGxlUHJhZ21hVW51c2VkKCk7CisKKyAgLy8vIFxicmllZiBIYW5kbGUgdGhlIGFubm90YXRpb24gdG9rZW4gcHJvZHVjZWQgZm9yCisgIC8vLyAjcHJhZ21hIEdDQyB2aXNpYmlsaXR5Li4uCisgIHZvaWQgSGFuZGxlUHJhZ21hVmlzaWJpbGl0eSgpOworCisgIC8vLyBcYnJpZWYgSGFuZGxlIHRoZSBhbm5vdGF0aW9uIHRva2VuIHByb2R1Y2VkIGZvcgorICAvLy8gI3ByYWdtYSBwYWNrLi4uCisgIHZvaWQgSGFuZGxlUHJhZ21hUGFjaygpOworCisgIC8vLyBcYnJpZWYgSGFuZGxlIHRoZSBhbm5vdGF0aW9uIHRva2VuIHByb2R1Y2VkIGZvcgorICAvLy8gI3ByYWdtYSBtc19zdHJ1Y3QuLi4KKyAgdm9pZCBIYW5kbGVQcmFnbWFNU1N0cnVjdCgpOworCisgIC8vLyBcYnJpZWYgSGFuZGxlIHRoZSBhbm5vdGF0aW9uIHRva2VuIHByb2R1Y2VkIGZvcgorICAvLy8gI3ByYWdtYSBjb21tZW50Li4uCisgIHZvaWQgSGFuZGxlUHJhZ21hTVNDb21tZW50KCk7CisKKyAgdm9pZCBIYW5kbGVQcmFnbWFNU1BvaW50ZXJzVG9NZW1iZXJzKCk7CisKKyAgdm9pZCBIYW5kbGVQcmFnbWFNU1Z0b3JEaXNwKCk7CisKKyAgdm9pZCBIYW5kbGVQcmFnbWFNU1ByYWdtYSgpOworICBib29sIEhhbmRsZVByYWdtYU1TU2VjdGlvbihTdHJpbmdSZWYgUHJhZ21hTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUHJhZ21hTG9jYXRpb24pOworICBib29sIEhhbmRsZVByYWdtYU1TU2VnbWVudChTdHJpbmdSZWYgUHJhZ21hTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUHJhZ21hTG9jYXRpb24pOworICBib29sIEhhbmRsZVByYWdtYU1TSW5pdFNlZyhTdHJpbmdSZWYgUHJhZ21hTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUHJhZ21hTG9jYXRpb24pOworCisgIC8vLyBcYnJpZWYgSGFuZGxlIHRoZSBhbm5vdGF0aW9uIHRva2VuIHByb2R1Y2VkIGZvcgorICAvLy8gI3ByYWdtYSBhbGlnbi4uLgorICB2b2lkIEhhbmRsZVByYWdtYUFsaWduKCk7CisKKyAgLy8vIFxicmllZiBIYW5kbGUgdGhlIGFubm90YXRpb24gdG9rZW4gcHJvZHVjZWQgZm9yCisgIC8vLyAjcHJhZ21hIGNsYW5nIF9fZGVidWcgZHVtcC4uLgorICB2b2lkIEhhbmRsZVByYWdtYUR1bXAoKTsKKworICAvLy8gXGJyaWVmIEhhbmRsZSB0aGUgYW5ub3RhdGlvbiB0b2tlbiBwcm9kdWNlZCBmb3IKKyAgLy8vICNwcmFnbWEgd2VhayBpZC4uLgorICB2b2lkIEhhbmRsZVByYWdtYVdlYWsoKTsKKworICAvLy8gXGJyaWVmIEhhbmRsZSB0aGUgYW5ub3RhdGlvbiB0b2tlbiBwcm9kdWNlZCBmb3IKKyAgLy8vICNwcmFnbWEgd2VhayBpZCA9IGlkLi4uCisgIHZvaWQgSGFuZGxlUHJhZ21hV2Vha0FsaWFzKCk7CisKKyAgLy8vIFxicmllZiBIYW5kbGUgdGhlIGFubm90YXRpb24gdG9rZW4gcHJvZHVjZWQgZm9yCisgIC8vLyAjcHJhZ21hIHJlZGVmaW5lX2V4dG5hbWUuLi4KKyAgdm9pZCBIYW5kbGVQcmFnbWFSZWRlZmluZUV4dG5hbWUoKTsKKworICAvLy8gXGJyaWVmIEhhbmRsZSB0aGUgYW5ub3RhdGlvbiB0b2tlbiBwcm9kdWNlZCBmb3IKKyAgLy8vICNwcmFnbWEgU1REQyBGUF9DT05UUkFDVC4uLgorICB2b2lkIEhhbmRsZVByYWdtYUZQQ29udHJhY3QoKTsKKworICAvLy8gXGJyaWVmIEhhbmRsZSB0aGUgYW5ub3RhdGlvbiB0b2tlbiBwcm9kdWNlZCBmb3IKKyAgLy8vICNwcmFnbWEgY2xhbmcgZnAgLi4uCisgIHZvaWQgSGFuZGxlUHJhZ21hRlAoKTsKKworICAvLy8gXGJyaWVmIEhhbmRsZSB0aGUgYW5ub3RhdGlvbiB0b2tlbiBwcm9kdWNlZCBmb3IKKyAgLy8vICNwcmFnbWEgT1BFTkNMIEVYVEVOU0lPTi4uLgorICB2b2lkIEhhbmRsZVByYWdtYU9wZW5DTEV4dGVuc2lvbigpOworCisgIC8vLyBcYnJpZWYgSGFuZGxlIHRoZSBhbm5vdGF0aW9uIHRva2VuIHByb2R1Y2VkIGZvcgorICAvLy8gI3ByYWdtYSBjbGFuZyBfX2RlYnVnIGNhcHR1cmVkCisgIFN0bXRSZXN1bHQgSGFuZGxlUHJhZ21hQ2FwdHVyZWQoKTsKKworICAvLy8gXGJyaWVmIEhhbmRsZSB0aGUgYW5ub3RhdGlvbiB0b2tlbiBwcm9kdWNlZCBmb3IKKyAgLy8vICNwcmFnbWEgY2xhbmcgbG9vcCBhbmQgI3ByYWdtYSB1bnJvbGwuCisgIGJvb2wgSGFuZGxlUHJhZ21hTG9vcEhpbnQoTG9vcEhpbnQgJkhpbnQpOworCisgIGJvb2wgUGFyc2VQcmFnbWFBdHRyaWJ1dGVTdWJqZWN0TWF0Y2hSdWxlU2V0KAorICAgICAgYXR0cjo6UGFyc2VkU3ViamVjdE1hdGNoUnVsZVNldCAmU3ViamVjdE1hdGNoUnVsZXMsCisgICAgICBTb3VyY2VMb2NhdGlvbiAmQW55TG9jLCBTb3VyY2VMb2NhdGlvbiAmTGFzdE1hdGNoUnVsZUVuZExvYyk7CisKKyAgdm9pZCBIYW5kbGVQcmFnbWFBdHRyaWJ1dGUoKTsKKworICAvLy8gR2V0TG9va0FoZWFkVG9rZW4gLSBUaGlzIHBlZWtzIGFoZWFkIE4gdG9rZW5zIGFuZCByZXR1cm5zIHRoYXQgdG9rZW4KKyAgLy8vIHdpdGhvdXQgY29uc3VtaW5nIGFueSB0b2tlbnMuICBMb29rQWhlYWQoMCkgcmV0dXJucyAnVG9rJywgTG9va0FoZWFkKDEpCisgIC8vLyByZXR1cm5zIHRoZSB0b2tlbiBhZnRlciBUb2ssIGV0Yy4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBkaWZmZXJzIGZyb20gdGhlIFByZXByb2Nlc3NvcidzIExvb2tBaGVhZCBtZXRob2QsIGJlY2F1c2UKKyAgLy8vIHRoZSBQYXJzZXIgYWx3YXlzIGhhcyBvbmUgdG9rZW4gbGV4ZWQgdGhhdCB0aGUgcHJlcHJvY2Vzc29yIGRvZXNuJ3QuCisgIC8vLworICBjb25zdCBUb2tlbiAmR2V0TG9va0FoZWFkVG9rZW4odW5zaWduZWQgTikgeworICAgIGlmIChOID09IDAgfHwgVG9rLmlzKHRvazo6ZW9mKSkgcmV0dXJuIFRvazsKKyAgICByZXR1cm4gUFAuTG9va0FoZWFkKE4tMSk7CisgIH0KKworcHVibGljOgorICAvLy8gTmV4dFRva2VuIC0gVGhpcyBwZWVrcyBhaGVhZCBvbmUgdG9rZW4gYW5kIHJldHVybnMgaXQgd2l0aG91dAorICAvLy8gY29uc3VtaW5nIGl0LgorICBjb25zdCBUb2tlbiAmTmV4dFRva2VuKCkgeworICAgIHJldHVybiBQUC5Mb29rQWhlYWQoMCk7CisgIH0KKworICAvLy8gZ2V0VHlwZUFubm90YXRpb24gLSBSZWFkIGEgcGFyc2VkIHR5cGUgb3V0IG9mIGFuIGFubm90YXRpb24gdG9rZW4uCisgIHN0YXRpYyBQYXJzZWRUeXBlIGdldFR5cGVBbm5vdGF0aW9uKGNvbnN0IFRva2VuICZUb2spIHsKKyAgICByZXR1cm4gUGFyc2VkVHlwZTo6Z2V0RnJvbU9wYXF1ZVB0cihUb2suZ2V0QW5ub3RhdGlvblZhbHVlKCkpOworICB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyB2b2lkIHNldFR5cGVBbm5vdGF0aW9uKFRva2VuICZUb2ssIFBhcnNlZFR5cGUgVCkgeworICAgIFRvay5zZXRBbm5vdGF0aW9uVmFsdWUoVC5nZXRBc09wYXF1ZVB0cigpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVhZCBhbiBhbHJlYWR5LXRyYW5zbGF0ZWQgcHJpbWFyeSBleHByZXNzaW9uIG91dCBvZiBhbiBhbm5vdGF0aW9uCisgIC8vLyB0b2tlbi4KKyAgc3RhdGljIEV4cHJSZXN1bHQgZ2V0RXhwckFubm90YXRpb24oY29uc3QgVG9rZW4gJlRvaykgeworICAgIHJldHVybiBFeHByUmVzdWx0OjpnZXRGcm9tT3BhcXVlUG9pbnRlcihUb2suZ2V0QW5ub3RhdGlvblZhbHVlKCkpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIHByaW1hcnkgZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBhbm5vdGF0aW9uCisgIC8vLyB0b2tlbi4KKyAgc3RhdGljIHZvaWQgc2V0RXhwckFubm90YXRpb24oVG9rZW4gJlRvaywgRXhwclJlc3VsdCBFUikgeworICAgIFRvay5zZXRBbm5vdGF0aW9uVmFsdWUoRVIuZ2V0QXNPcGFxdWVQb2ludGVyKCkpOworICB9CisKK3B1YmxpYzoKKyAgLy8gSWYgTmVlZFR5cGUgaXMgdHJ1ZSwgdGhlbiBUcnlBbm5vdGF0ZVR5cGVPclNjb3BlVG9rZW4gd2lsbCB0cnkgaGFyZGVyIHRvCisgIC8vIGZpbmQgYSB0eXBlIG5hbWUgYnkgYXR0ZW1wdGluZyB0eXBvIGNvcnJlY3Rpb24uCisgIGJvb2wgVHJ5QW5ub3RhdGVUeXBlT3JTY29wZVRva2VuKCk7CisgIGJvb2wgVHJ5QW5ub3RhdGVUeXBlT3JTY29wZVRva2VuQWZ0ZXJTY29wZVNwZWMoQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzTmV3U2NvcGUpOworICBib29sIFRyeUFubm90YXRlQ1hYU2NvcGVUb2tlbihib29sIEVudGVyaW5nQ29udGV4dCA9IGZhbHNlKTsKKworcHJpdmF0ZToKKyAgZW51bSBBbm5vdGF0ZWROYW1lS2luZCB7CisgICAgLy8vIEFubm90YXRpb24gaGFzIGZhaWxlZCBhbmQgZW1pdHRlZCBhbiBlcnJvci4KKyAgICBBTktfRXJyb3IsCisgICAgLy8vIFRoZSBpZGVudGlmaWVyIGlzIGEgdGVudGF0aXZlbHktZGVjbGFyZWQgbmFtZS4KKyAgICBBTktfVGVudGF0aXZlRGVjbCwKKyAgICAvLy8gVGhlIGlkZW50aWZpZXIgaXMgYSB0ZW1wbGF0ZSBuYW1lLiBGSVhNRTogQWRkIGFuIGFubm90YXRpb24gZm9yIHRoYXQuCisgICAgQU5LX1RlbXBsYXRlTmFtZSwKKyAgICAvLy8gVGhlIGlkZW50aWZpZXIgY2FuJ3QgYmUgcmVzb2x2ZWQuCisgICAgQU5LX1VucmVzb2x2ZWQsCisgICAgLy8vIEFubm90YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgQU5LX1N1Y2Nlc3MKKyAgfTsKKyAgQW5ub3RhdGVkTmFtZUtpbmQKKyAgVHJ5QW5ub3RhdGVOYW1lKGJvb2wgSXNBZGRyZXNzT2ZPcGVyYW5kLAorICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENvcnJlY3Rpb25DYW5kaWRhdGVDYWxsYmFjaz4gQ0NDID0gbnVsbHB0cik7CisKKyAgLy8vIFB1c2ggYSB0b2s6OmFubm90X2N4eHNjb3BlIHRva2VuIG9udG8gdGhlIHRva2VuIHN0cmVhbS4KKyAgdm9pZCBBbm5vdGF0ZVNjb3BlVG9rZW4oQ1hYU2NvcGVTcGVjICZTUywgYm9vbCBJc05ld0Fubm90YXRpb24pOworCisgIC8vLyBUcnlBbHRpVmVjVG9rZW4gLSBDaGVjayBmb3IgY29udGV4dC1zZW5zaXRpdmUgQWx0aVZlYyBpZGVudGlmaWVyIHRva2VucywKKyAgLy8vIHJlcGxhY2luZyB0aGVtIHdpdGggdGhlIG5vbi1jb250ZXh0LXNlbnNpdGl2ZSBrZXl3b3Jkcy4gIFRoaXMgcmV0dXJucworICAvLy8gdHJ1ZSBpZiB0aGUgdG9rZW4gd2FzIHJlcGxhY2VkLgorICBib29sIFRyeUFsdGlWZWNUb2tlbihEZWNsU3BlYyAmRFMsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqJlByZXZTcGVjLCB1bnNpZ25lZCAmRGlhZ0lELAorICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc0ludmFsaWQpIHsKKyAgICBpZiAoIWdldExhbmdPcHRzKCkuQWx0aVZlYyAmJiAhZ2V0TGFuZ09wdHMoKS5aVmVjdG9yKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKFRvay5nZXRJZGVudGlmaWVySW5mbygpICE9IElkZW50X3ZlY3RvciAmJgorICAgICAgICBUb2suZ2V0SWRlbnRpZmllckluZm8oKSAhPSBJZGVudF9ib29sICYmCisgICAgICAgICghZ2V0TGFuZ09wdHMoKS5BbHRpVmVjIHx8IFRvay5nZXRJZGVudGlmaWVySW5mbygpICE9IElkZW50X3BpeGVsKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBUcnlBbHRpVmVjVG9rZW5PdXRPZkxpbmUoRFMsIExvYywgUHJldlNwZWMsIERpYWdJRCwgaXNJbnZhbGlkKTsKKyAgfQorCisgIC8vLyBUcnlBbHRpVmVjVmVjdG9yVG9rZW4gLSBDaGVjayBmb3IgY29udGV4dC1zZW5zaXRpdmUgQWx0aVZlYyB2ZWN0b3IKKyAgLy8vIGlkZW50aWZpZXIgdG9rZW4sIHJlcGxhY2luZyBpdCB3aXRoIHRoZSBub24tY29udGV4dC1zZW5zaXRpdmUgX192ZWN0b3IuCisgIC8vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgdG9rZW4gd2FzIHJlcGxhY2VkLgorICBib29sIFRyeUFsdGlWZWNWZWN0b3JUb2tlbigpIHsKKyAgICBpZiAoKCFnZXRMYW5nT3B0cygpLkFsdGlWZWMgJiYgIWdldExhbmdPcHRzKCkuWlZlY3RvcikgfHwKKyAgICAgICAgVG9rLmdldElkZW50aWZpZXJJbmZvKCkgIT0gSWRlbnRfdmVjdG9yKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIFRyeUFsdGlWZWNWZWN0b3JUb2tlbk91dE9mTGluZSgpOworICB9CisKKyAgYm9vbCBUcnlBbHRpVmVjVmVjdG9yVG9rZW5PdXRPZkxpbmUoKTsKKyAgYm9vbCBUcnlBbHRpVmVjVG9rZW5PdXRPZkxpbmUoRGVjbFNwZWMgJkRTLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywgdW5zaWduZWQgJkRpYWdJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNJbnZhbGlkKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIHRoZSBpZGVudGlmaWVyICdpbnN0YW5jZXR5cGUnLgorICAvLy8KKyAgLy8vIFNob3VsZCBvbmx5IGJlIHVzZWQgaW4gT2JqZWN0aXZlLUMgbGFuZ3VhZ2UgbW9kZXMuCisgIGJvb2wgaXNPYmpDSW5zdGFuY2V0eXBlKCkgeworICAgIGFzc2VydChnZXRMYW5nT3B0cygpLk9iakMxKTsKKyAgICBpZiAoVG9rLmlzQW5ub3RhdGlvbigpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghSWRlbnRfaW5zdGFuY2V0eXBlKQorICAgICAgSWRlbnRfaW5zdGFuY2V0eXBlID0gUFAuZ2V0SWRlbnRpZmllckluZm8oImluc3RhbmNldHlwZSIpOworICAgIHJldHVybiBUb2suZ2V0SWRlbnRpZmllckluZm8oKSA9PSBJZGVudF9pbnN0YW5jZXR5cGU7CisgIH0KKworICAvLy8gVHJ5S2V5d29yZElkZW50RmFsbGJhY2sgLSBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHN5c3RlbSBoZWFkZXJzIHVzaW5nCisgIC8vLyBrZXl3b3JkcyBhcyBpZGVudGlmaWVycywgYXR0ZW1wdCB0byBjb252ZXJ0IHRoZSBjdXJyZW50IHRva2VuIHRvIGFuCisgIC8vLyBpZGVudGlmaWVyIGFuZCBvcHRpb25hbGx5IGRpc2FibGUgdGhlIGtleXdvcmQgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlCisgIC8vLyB0cmFuc2xhdGlvbiB1bml0LiBUaGlzIHJldHVybnMgZmFsc2UgaWYgdGhlIHRva2VuIHdhcyBub3QgcmVwbGFjZWQsCisgIC8vLyBvdGhlcndpc2UgZW1pdHMgYSBkaWFnbm9zdGljIGFuZCByZXR1cm5zIHRydWUuCisgIGJvb2wgVHJ5S2V5d29yZElkZW50RmFsbGJhY2soYm9vbCBEaXNhYmxlS2V5d29yZCk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIFRlbXBsYXRlSWRBbm5vdGF0aW9uIGZyb20gdGhlIHRva2VuLgorICBUZW1wbGF0ZUlkQW5ub3RhdGlvbiAqdGFrZVRlbXBsYXRlSWRBbm5vdGF0aW9uKGNvbnN0IFRva2VuICZ0b2spOworCisgIC8vLyBUZW50YXRpdmVQYXJzaW5nQWN0aW9uIC0gQW4gb2JqZWN0IHRoYXQgaXMgdXNlZCBhcyBhIGtpbmQgb2YgInRlbnRhdGl2ZQorICAvLy8gcGFyc2luZyB0cmFuc2FjdGlvbiIuIEl0IGdldHMgaW5zdGFudGlhdGVkIHRvIG1hcmsgdGhlIHRva2VuIHBvc2l0aW9uIGFuZAorICAvLy8gYWZ0ZXIgdGhlIHRva2VuIGNvbnN1bXB0aW9uIGlzIGRvbmUsIENvbW1pdCgpIG9yIFJldmVydCgpIGlzIGNhbGxlZCB0bworICAvLy8gZWl0aGVyICJjb21taXQgdGhlIGNvbnN1bWVkIHRva2VucyIgb3IgcmV2ZXJ0IHRvIHRoZSBwcmV2aW91c2x5IG1hcmtlZAorICAvLy8gdG9rZW4gcG9zaXRpb24uIEV4YW1wbGU6CisgIC8vLworICAvLy8gICBUZW50YXRpdmVQYXJzaW5nQWN0aW9uIFRQQSgqdGhpcyk7CisgIC8vLyAgIENvbnN1bWVUb2tlbigpOworICAvLy8gICAuLi4uCisgIC8vLyAgIFRQQS5SZXZlcnQoKTsKKyAgLy8vCisgIGNsYXNzIFRlbnRhdGl2ZVBhcnNpbmdBY3Rpb24geworICAgIFBhcnNlciAmUDsKKyAgICBUb2tlbiBQcmV2VG9rOworICAgIHNpemVfdCBQcmV2VGVudGF0aXZlbHlEZWNsYXJlZElkZW50aWZpZXJDb3VudDsKKyAgICB1bnNpZ25lZCBzaG9ydCBQcmV2UGFyZW5Db3VudCwgUHJldkJyYWNrZXRDb3VudCwgUHJldkJyYWNlQ291bnQ7CisgICAgYm9vbCBpc0FjdGl2ZTsKKworICBwdWJsaWM6CisgICAgZXhwbGljaXQgVGVudGF0aXZlUGFyc2luZ0FjdGlvbihQYXJzZXImIHApIDogUChwKSB7CisgICAgICBQcmV2VG9rID0gUC5Ub2s7CisgICAgICBQcmV2VGVudGF0aXZlbHlEZWNsYXJlZElkZW50aWZpZXJDb3VudCA9CisgICAgICAgICAgUC5UZW50YXRpdmVseURlY2xhcmVkSWRlbnRpZmllcnMuc2l6ZSgpOworICAgICAgUHJldlBhcmVuQ291bnQgPSBQLlBhcmVuQ291bnQ7CisgICAgICBQcmV2QnJhY2tldENvdW50ID0gUC5CcmFja2V0Q291bnQ7CisgICAgICBQcmV2QnJhY2VDb3VudCA9IFAuQnJhY2VDb3VudDsKKyAgICAgIFAuUFAuRW5hYmxlQmFja3RyYWNrQXRUaGlzUG9zKCk7CisgICAgICBpc0FjdGl2ZSA9IHRydWU7CisgICAgfQorICAgIHZvaWQgQ29tbWl0KCkgeworICAgICAgYXNzZXJ0KGlzQWN0aXZlICYmICJQYXJzaW5nIGFjdGlvbiB3YXMgZmluaXNoZWQhIik7CisgICAgICBQLlRlbnRhdGl2ZWx5RGVjbGFyZWRJZGVudGlmaWVycy5yZXNpemUoCisgICAgICAgICAgUHJldlRlbnRhdGl2ZWx5RGVjbGFyZWRJZGVudGlmaWVyQ291bnQpOworICAgICAgUC5QUC5Db21taXRCYWNrdHJhY2tlZFRva2VucygpOworICAgICAgaXNBY3RpdmUgPSBmYWxzZTsKKyAgICB9CisgICAgdm9pZCBSZXZlcnQoKSB7CisgICAgICBhc3NlcnQoaXNBY3RpdmUgJiYgIlBhcnNpbmcgYWN0aW9uIHdhcyBmaW5pc2hlZCEiKTsKKyAgICAgIFAuUFAuQmFja3RyYWNrKCk7CisgICAgICBQLlRvayA9IFByZXZUb2s7CisgICAgICBQLlRlbnRhdGl2ZWx5RGVjbGFyZWRJZGVudGlmaWVycy5yZXNpemUoCisgICAgICAgICAgUHJldlRlbnRhdGl2ZWx5RGVjbGFyZWRJZGVudGlmaWVyQ291bnQpOworICAgICAgUC5QYXJlbkNvdW50ID0gUHJldlBhcmVuQ291bnQ7CisgICAgICBQLkJyYWNrZXRDb3VudCA9IFByZXZCcmFja2V0Q291bnQ7CisgICAgICBQLkJyYWNlQ291bnQgPSBQcmV2QnJhY2VDb3VudDsKKyAgICAgIGlzQWN0aXZlID0gZmFsc2U7CisgICAgfQorICAgIH5UZW50YXRpdmVQYXJzaW5nQWN0aW9uKCkgeworICAgICAgYXNzZXJ0KCFpc0FjdGl2ZSAmJiAiRm9yZ290IHRvIGNhbGwgQ29tbWl0IG9yIFJldmVydCEiKTsKKyAgICB9CisgIH07CisgIC8vLyBBIFRlbnRhdGl2ZVBhcnNpbmdBY3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IHJldmVydHMgaW4gaXRzIGRlc3RydWN0b3IuCisgIC8vLyBVc2VmdWwgZm9yIGRpc2FtYmlndWF0aW9uIHBhcnNlcyB0aGF0IHdpbGwgYWx3YXlzIGJlIHJldmVydGVkLgorICBjbGFzcyBSZXZlcnRpbmdUZW50YXRpdmVQYXJzaW5nQWN0aW9uCisgICAgICA6IHByaXZhdGUgUGFyc2VyOjpUZW50YXRpdmVQYXJzaW5nQWN0aW9uIHsKKyAgcHVibGljOgorICAgIFJldmVydGluZ1RlbnRhdGl2ZVBhcnNpbmdBY3Rpb24oUGFyc2VyICZQKQorICAgICAgICA6IFBhcnNlcjo6VGVudGF0aXZlUGFyc2luZ0FjdGlvbihQKSB7fQorICAgIH5SZXZlcnRpbmdUZW50YXRpdmVQYXJzaW5nQWN0aW9uKCkgeyBSZXZlcnQoKTsgfQorICB9OworCisgIGNsYXNzIFVuYW5ub3RhdGVkVGVudGF0aXZlUGFyc2luZ0FjdGlvbjsKKworICAvLy8gT2JqQ0RlY2xDb250ZXh0U3dpdGNoIC0gQW4gb2JqZWN0IHVzZWQgdG8gc3dpdGNoIGNvbnRleHQgZnJvbQorICAvLy8gYW4gb2JqZWN0aXZlLWMgZGVjbCBjb250ZXh0IHRvIGl0cyBlbmNsb3NpbmcgZGVjbCBjb250ZXh0IGFuZAorICAvLy8gYmFjay4KKyAgY2xhc3MgT2JqQ0RlY2xDb250ZXh0U3dpdGNoIHsKKyAgICBQYXJzZXIgJlA7CisgICAgRGVjbCAqREM7CisgICAgU2F2ZUFuZFJlc3RvcmU8Ym9vbD4gV2l0aGluT2JqQ0NvbnRhaW5lcjsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IE9iakNEZWNsQ29udGV4dFN3aXRjaChQYXJzZXIgJnApCisgICAgICA6IFAocCksIERDKHAuZ2V0T2JqQ0RlY2xDb250ZXh0KCkpLAorICAgICAgICBXaXRoaW5PYmpDQ29udGFpbmVyKFAuUGFyc2luZ0luT2JqQ0NvbnRhaW5lciwgREMgIT0gbnVsbHB0cikgeworICAgICAgaWYgKERDKQorICAgICAgICBQLkFjdGlvbnMuQWN0T25PYmpDVGVtcG9yYXJ5RXhpdENvbnRhaW5lckNvbnRleHQoY2FzdDxEZWNsQ29udGV4dD4oREMpKTsKKyAgICB9CisgICAgfk9iakNEZWNsQ29udGV4dFN3aXRjaCgpIHsKKyAgICAgIGlmIChEQykKKyAgICAgICAgUC5BY3Rpb25zLkFjdE9uT2JqQ1JlZW50ZXJDb250YWluZXJDb250ZXh0KGNhc3Q8RGVjbENvbnRleHQ+KERDKSk7CisgICAgfQorICB9OworCisgIC8vLyBFeHBlY3RBbmRDb25zdW1lIC0gVGhlIHBhcnNlciBleHBlY3RzIHRoYXQgJ0V4cGVjdGVkVG9rJyBpcyBuZXh0IGluIHRoZQorICAvLy8gaW5wdXQuICBJZiBzbywgaXQgaXMgY29uc3VtZWQgYW5kIGZhbHNlIGlzIHJldHVybmVkLgorICAvLy8KKyAgLy8vIElmIGEgdHJpdmlhbCBwdW5jdHVhdG9yIG1pc3NwZWxsaW5nIGlzIGVuY291bnRlcmVkLCBhIEZpeEl0IGVycm9yCisgIC8vLyBkaWFnbm9zdGljIGlzIGlzc3VlZCBhbmQgZmFsc2UgaXMgcmV0dXJuZWQgYWZ0ZXIgcmVjb3ZlcnkuCisgIC8vLworICAvLy8gSWYgdGhlIGlucHV0IGlzIG1hbGZvcm1lZCwgdGhpcyBlbWl0cyB0aGUgc3BlY2lmaWVkIGRpYWdub3N0aWMgYW5kIHRydWUgaXMKKyAgLy8vIHJldHVybmVkLgorICBib29sIEV4cGVjdEFuZENvbnN1bWUodG9rOjpUb2tlbktpbmQgRXhwZWN0ZWRUb2ssCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEaWFnID0gZGlhZzo6ZXJyX2V4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERpYWdNc2cgPSAiIik7CisKKyAgLy8vIFxicmllZiBUaGUgcGFyc2VyIGV4cGVjdHMgYSBzZW1pY29sb24gYW5kLCBpZiBwcmVzZW50LCB3aWxsIGNvbnN1bWUgaXQuCisgIC8vLworICAvLy8gSWYgdGhlIG5leHQgdG9rZW4gaXMgbm90IGEgc2VtaWNvbG9uLCB0aGlzIGVtaXRzIHRoZSBzcGVjaWZpZWQgZGlhZ25vc3RpYywKKyAgLy8vIG9yLCBpZiB0aGVyZSdzIGp1c3Qgc29tZSBjbG9zaW5nLWRlbGltaXRlciBub2lzZSAoZS5nLiwgJyknIG9yICddJykgcHJpb3IKKyAgLy8vIHRvIHRoZSBzZW1pY29sb24sIGNvbnN1bWVzIHRoYXQgZXh0cmEgdG9rZW4uCisgIGJvb2wgRXhwZWN0QW5kQ29uc3VtZVNlbWkodW5zaWduZWQgRGlhZ0lEKTsKKworICAvLy8gXGJyaWVmIFRoZSBraW5kIG9mIGV4dHJhIHNlbWkgZGlhZ25vc3RpYyB0byBlbWl0LgorICBlbnVtIEV4dHJhU2VtaUtpbmQgeworICAgIE91dHNpZGVGdW5jdGlvbiA9IDAsCisgICAgSW5zaWRlU3RydWN0ID0gMSwKKyAgICBJbnN0YW5jZVZhcmlhYmxlTGlzdCA9IDIsCisgICAgQWZ0ZXJNZW1iZXJGdW5jdGlvbkRlZmluaXRpb24gPSAzCisgIH07CisKKyAgLy8vIFxicmllZiBDb25zdW1lIGFueSBleHRyYSBzZW1pLWNvbG9ucyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5lLgorICB2b2lkIENvbnN1bWVFeHRyYVNlbWkoRXh0cmFTZW1pS2luZCBLaW5kLCB1bnNpZ25lZCBUU1QgPSBUU1RfdW5zcGVjaWZpZWQpOworCisgIC8vLyBSZXR1cm4gZmFsc2UgaWYgdGhlIG5leHQgdG9rZW4gaXMgYW4gaWRlbnRpZmllci4gQW4gJ2V4cGVjdGVkIGlkZW50aWZpZXInCisgIC8vLyBlcnJvciBpcyBlbWl0dGVkIG90aGVyd2lzZS4KKyAgLy8vCisgIC8vLyBUaGUgcGFyc2VyIHRyaWVzIHRvIHJlY292ZXIgZnJvbSB0aGUgZXJyb3IgYnkgY2hlY2tpbmcgaWYgdGhlIG5leHQgdG9rZW4KKyAgLy8vIGlzIGEgQysrIGtleXdvcmQgd2hlbiBwYXJzaW5nIE9iamVjdGl2ZS1DKysuIFJldHVybiBmYWxzZSBpZiB0aGUgcmVjb3ZlcnkKKyAgLy8vIHdhcyBzdWNjZXNzZnVsLgorICBib29sIGV4cGVjdElkZW50aWZpZXIoKTsKKworcHVibGljOgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gU2NvcGUgbWFuaXB1bGF0aW9uCisKKyAgLy8vIFBhcnNlU2NvcGUgLSBJbnRyb2R1Y2VzIGEgbmV3IHNjb3BlIGZvciBwYXJzaW5nLiBUaGUga2luZCBvZgorICAvLy8gc2NvcGUgaXMgZGV0ZXJtaW5lZCBieSBTY29wZUZsYWdzLiBPYmplY3RzIG9mIHRoaXMgdHlwZSBzaG91bGQKKyAgLy8vIGJlIGNyZWF0ZWQgb24gdGhlIHN0YWNrIHRvIGNvaW5jaWRlIHdpdGggdGhlIHBvc2l0aW9uIHdoZXJlIHRoZQorICAvLy8gcGFyc2VyIGVudGVycyB0aGUgbmV3IHNjb3BlLCBhbmQgdGhpcyBvYmplY3QncyBjb25zdHJ1Y3RvciB3aWxsCisgIC8vLyBjcmVhdGUgdGhhdCBuZXcgc2NvcGUuIFNpbWlsYXJseSwgb25jZSB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZAorICAvLy8gdGhlIHBhcnNlciB3aWxsIGV4aXQgdGhlIHNjb3BlLgorICBjbGFzcyBQYXJzZVNjb3BlIHsKKyAgICBQYXJzZXIgKlNlbGY7CisgICAgUGFyc2VTY29wZShjb25zdCBQYXJzZVNjb3BlICYpID0gZGVsZXRlOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFBhcnNlU2NvcGUgJikgPSBkZWxldGU7CisKKyAgcHVibGljOgorICAgIC8vIFBhcnNlU2NvcGUgLSBDb25zdHJ1Y3QgYSBuZXcgb2JqZWN0IHRvIG1hbmFnZSBhIHNjb3BlIGluIHRoZQorICAgIC8vIHBhcnNlciBTZWxmIHdoZXJlIHRoZSBuZXcgU2NvcGUgaXMgY3JlYXRlZCB3aXRoIHRoZSBmbGFncworICAgIC8vIFNjb3BlRmxhZ3MsIGJ1dCBvbmx5IHdoZW4gd2UgYXJlbid0IGFib3V0IHRvIGVudGVyIGEgY29tcG91bmQgc3RhdGVtZW50LgorICAgIFBhcnNlU2NvcGUoUGFyc2VyICpTZWxmLCB1bnNpZ25lZCBTY29wZUZsYWdzLCBib29sIEVudGVyZWRTY29wZSA9IHRydWUsCisgICAgICAgICAgICAgICBib29sIEJlZm9yZUNvbXBvdW5kU3RtdCA9IGZhbHNlKQorICAgICAgOiBTZWxmKFNlbGYpIHsKKyAgICAgIGlmIChFbnRlcmVkU2NvcGUgJiYgIUJlZm9yZUNvbXBvdW5kU3RtdCkKKyAgICAgICAgU2VsZi0+RW50ZXJTY29wZShTY29wZUZsYWdzKTsKKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoQmVmb3JlQ29tcG91bmRTdG10KQorICAgICAgICAgIFNlbGYtPmluY3JlbWVudE1TTWFuZ2xpbmdOdW1iZXIoKTsKKworICAgICAgICB0aGlzLT5TZWxmID0gbnVsbHB0cjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFeGl0IC0gRXhpdCB0aGUgc2NvcGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0IG5vdywgcmF0aGVyCisgICAgLy8gdGhhbiB3YWl0aW5nIHVudGlsIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkLgorICAgIHZvaWQgRXhpdCgpIHsKKyAgICAgIGlmIChTZWxmKSB7CisgICAgICAgIFNlbGYtPkV4aXRTY29wZSgpOworICAgICAgICBTZWxmID0gbnVsbHB0cjsKKyAgICAgIH0KKyAgICB9CisKKyAgICB+UGFyc2VTY29wZSgpIHsKKyAgICAgIEV4aXQoKTsKKyAgICB9CisgIH07CisKKyAgLy8vIEVudGVyU2NvcGUgLSBTdGFydCBhIG5ldyBzY29wZS4KKyAgdm9pZCBFbnRlclNjb3BlKHVuc2lnbmVkIFNjb3BlRmxhZ3MpOworCisgIC8vLyBFeGl0U2NvcGUgLSBQb3AgYSBzY29wZSBvZmYgdGhlIHNjb3BlIHN0YWNrLgorICB2b2lkIEV4aXRTY29wZSgpOworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIFJBSUkgb2JqZWN0IHVzZWQgdG8gbW9kaWZ5IHRoZSBzY29wZSBmbGFncyBmb3IgdGhlIGN1cnJlbnQgc2NvcGUuCisgIGNsYXNzIFBhcnNlU2NvcGVGbGFncyB7CisgICAgU2NvcGUgKkN1clNjb3BlOworICAgIHVuc2lnbmVkIE9sZEZsYWdzOworICAgIFBhcnNlU2NvcGVGbGFncyhjb25zdCBQYXJzZVNjb3BlRmxhZ3MgJikgPSBkZWxldGU7CisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgUGFyc2VTY29wZUZsYWdzICYpID0gZGVsZXRlOworCisgIHB1YmxpYzoKKyAgICBQYXJzZVNjb3BlRmxhZ3MoUGFyc2VyICpTZWxmLCB1bnNpZ25lZCBTY29wZUZsYWdzLCBib29sIE1hbmFnZUZsYWdzID0gdHJ1ZSk7CisgICAgflBhcnNlU2NvcGVGbGFncygpOworICB9OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBEaWFnbm9zdGljIEVtaXNzaW9uIGFuZCBFcnJvciByZWNvdmVyeS4KKworcHVibGljOgorICBEaWFnbm9zdGljQnVpbGRlciBEaWFnKFNvdXJjZUxvY2F0aW9uIExvYywgdW5zaWduZWQgRGlhZ0lEKTsKKyAgRGlhZ25vc3RpY0J1aWxkZXIgRGlhZyhjb25zdCBUb2tlbiAmVG9rLCB1bnNpZ25lZCBEaWFnSUQpOworICBEaWFnbm9zdGljQnVpbGRlciBEaWFnKHVuc2lnbmVkIERpYWdJRCkgeworICAgIHJldHVybiBEaWFnKFRvaywgRGlhZ0lEKTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIFN1Z2dlc3RQYXJlbnRoZXNlcyhTb3VyY2VMb2NhdGlvbiBMb2MsIHVuc2lnbmVkIERLLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBQYXJlblJhbmdlKTsKKyAgdm9pZCBDaGVja05lc3RlZE9iakNDb250ZXh0cyhTb3VyY2VMb2NhdGlvbiBBdExvYyk7CisKK3B1YmxpYzoKKworICAvLy8gXGJyaWVmIENvbnRyb2wgZmxhZ3MgZm9yIFNraXBVbnRpbCBmdW5jdGlvbnMuCisgIGVudW0gU2tpcFVudGlsRmxhZ3MgeworICAgIFN0b3BBdFNlbWkgPSAxIDw8IDAsICAvLy88IFN0b3Agc2tpcHBpbmcgYXQgc2VtaWNvbG9uCisgICAgLy8vIFxicmllZiBTdG9wIHNraXBwaW5nIGF0IHNwZWNpZmllZCB0b2tlbiwgYnV0IGRvbid0IHNraXAgdGhlIHRva2VuIGl0c2VsZgorICAgIFN0b3BCZWZvcmVNYXRjaCA9IDEgPDwgMSwKKyAgICBTdG9wQXRDb2RlQ29tcGxldGlvbiA9IDEgPDwgMiAvLy88IFN0b3AgYXQgY29kZSBjb21wbGV0aW9uCisgIH07CisKKyAgZnJpZW5kIGNvbnN0ZXhwciBTa2lwVW50aWxGbGFncyBvcGVyYXRvcnwoU2tpcFVudGlsRmxhZ3MgTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcFVudGlsRmxhZ3MgUikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTa2lwVW50aWxGbGFncz4oc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KEwpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPihSKSk7CisgIH0KKworICAvLy8gU2tpcFVudGlsIC0gUmVhZCB0b2tlbnMgdW50aWwgd2UgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgdG9rZW4sIHRoZW4gY29uc3VtZQorICAvLy8gaXQgKHVubGVzcyBTdG9wQmVmb3JlTWF0Y2ggaXMgc3BlY2lmaWVkKS4gIEJlY2F1c2Ugd2UgY2Fubm90IGd1YXJhbnRlZQorICAvLy8gdGhhdCB0aGUgdG9rZW4gd2lsbCBldmVyIG9jY3VyLCB0aGlzIHNraXBzIHRvIHRoZSBuZXh0IHRva2VuLCBvciB0byBzb21lCisgIC8vLyBsaWtlbHkgZ29vZCBzdG9wcGluZyBwb2ludC4gIElmIEZsYWdzIGhhcyBTdG9wQXRTZW1pIGZsYWcsIHNraXBwaW5nIHdpbGwKKyAgLy8vIHN0b3AgYXQgYSAnOycgY2hhcmFjdGVyLgorICAvLy8KKyAgLy8vIElmIFNraXBVbnRpbCBmaW5kcyB0aGUgc3BlY2lmaWVkIHRva2VuLCBpdCByZXR1cm5zIHRydWUsIG90aGVyd2lzZSBpdAorICAvLy8gcmV0dXJucyBmYWxzZS4KKyAgYm9vbCBTa2lwVW50aWwodG9rOjpUb2tlbktpbmQgVCwKKyAgICAgICAgICAgICAgICAgU2tpcFVudGlsRmxhZ3MgRmxhZ3MgPSBzdGF0aWNfY2FzdDxTa2lwVW50aWxGbGFncz4oMCkpIHsKKyAgICByZXR1cm4gU2tpcFVudGlsKGxsdm06Om1ha2VBcnJheVJlZihUKSwgRmxhZ3MpOworICB9CisgIGJvb2wgU2tpcFVudGlsKHRvazo6VG9rZW5LaW5kIFQxLCB0b2s6OlRva2VuS2luZCBUMiwKKyAgICAgICAgICAgICAgICAgU2tpcFVudGlsRmxhZ3MgRmxhZ3MgPSBzdGF0aWNfY2FzdDxTa2lwVW50aWxGbGFncz4oMCkpIHsKKyAgICB0b2s6OlRva2VuS2luZCBUb2tBcnJheVtdID0ge1QxLCBUMn07CisgICAgcmV0dXJuIFNraXBVbnRpbChUb2tBcnJheSwgRmxhZ3MpOworICB9CisgIGJvb2wgU2tpcFVudGlsKHRvazo6VG9rZW5LaW5kIFQxLCB0b2s6OlRva2VuS2luZCBUMiwgdG9rOjpUb2tlbktpbmQgVDMsCisgICAgICAgICAgICAgICAgIFNraXBVbnRpbEZsYWdzIEZsYWdzID0gc3RhdGljX2Nhc3Q8U2tpcFVudGlsRmxhZ3M+KDApKSB7CisgICAgdG9rOjpUb2tlbktpbmQgVG9rQXJyYXlbXSA9IHtUMSwgVDIsIFQzfTsKKyAgICByZXR1cm4gU2tpcFVudGlsKFRva0FycmF5LCBGbGFncyk7CisgIH0KKyAgYm9vbCBTa2lwVW50aWwoQXJyYXlSZWY8dG9rOjpUb2tlbktpbmQ+IFRva3MsCisgICAgICAgICAgICAgICAgIFNraXBVbnRpbEZsYWdzIEZsYWdzID0gc3RhdGljX2Nhc3Q8U2tpcFVudGlsRmxhZ3M+KDApKTsKKworICAvLy8gU2tpcE1hbGZvcm1lZERlY2wgLSBSZWFkIHRva2VucyB1bnRpbCB3ZSBnZXQgdG8gc29tZSBsaWtlbHkgZ29vZCBzdG9wcGluZworICAvLy8gcG9pbnQgZm9yIHNraXBwaW5nIHBhc3QgYSBzaW1wbGUtZGVjbGFyYXRpb24uCisgIHZvaWQgU2tpcE1hbGZvcm1lZERlY2woKTsKKworcHJpdmF0ZToKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIExleGluZyBhbmQgcGFyc2luZyBvZiBDKysgaW5saW5lIG1ldGhvZHMuCisKKyAgc3RydWN0IFBhcnNpbmdDbGFzczsKKworICAvLy8gW2NsYXNzLm1lbV1wMTogIi4uLiB0aGUgY2xhc3MgaXMgcmVnYXJkZWQgYXMgY29tcGxldGUgd2l0aGluCisgIC8vLyAtIGZ1bmN0aW9uIGJvZGllcworICAvLy8gLSBkZWZhdWx0IGFyZ3VtZW50cworICAvLy8gLSBleGNlcHRpb24tc3BlY2lmaWNhdGlvbnMgKFRPRE86IEMrKzB4KQorICAvLy8gLSBhbmQgYnJhY2Utb3ItZXF1YWwtaW5pdGlhbGl6ZXJzIGZvciBub24tc3RhdGljIGRhdGEgbWVtYmVycworICAvLy8gKGluY2x1ZGluZyBzdWNoIHRoaW5ncyBpbiBuZXN0ZWQgY2xhc3NlcykuIgorICAvLy8gTGF0ZVBhcnNlZERlY2xhcmF0aW9ucyBidWlsZCB0aGUgdHJlZSBvZiB0aG9zZSBlbGVtZW50cyBzbyB0aGV5IGNhbgorICAvLy8gYmUgcGFyc2VkIGFmdGVyIHBhcnNpbmcgdGhlIHRvcC1sZXZlbCBjbGFzcy4KKyAgY2xhc3MgTGF0ZVBhcnNlZERlY2xhcmF0aW9uIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgfkxhdGVQYXJzZWREZWNsYXJhdGlvbigpOworCisgICAgdmlydHVhbCB2b2lkIFBhcnNlTGV4ZWRNZXRob2REZWNsYXJhdGlvbnMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgUGFyc2VMZXhlZE1lbWJlckluaXRpYWxpemVycygpOworICAgIHZpcnR1YWwgdm9pZCBQYXJzZUxleGVkTWV0aG9kRGVmcygpOworICAgIHZpcnR1YWwgdm9pZCBQYXJzZUxleGVkQXR0cmlidXRlcygpOworICB9OworCisgIC8vLyBJbm5lciBub2RlIG9mIHRoZSBMYXRlUGFyc2VkRGVjbGFyYXRpb24gdHJlZSB0aGF0IHBhcnNlcworICAvLy8gYWxsIGl0cyBtZW1iZXJzIHJlY3Vyc2l2ZWx5LgorICBjbGFzcyBMYXRlUGFyc2VkQ2xhc3MgOiBwdWJsaWMgTGF0ZVBhcnNlZERlY2xhcmF0aW9uIHsKKyAgcHVibGljOgorICAgIExhdGVQYXJzZWRDbGFzcyhQYXJzZXIgKlAsIFBhcnNpbmdDbGFzcyAqQyk7CisgICAgfkxhdGVQYXJzZWRDbGFzcygpIG92ZXJyaWRlOworCisgICAgdm9pZCBQYXJzZUxleGVkTWV0aG9kRGVjbGFyYXRpb25zKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBQYXJzZUxleGVkTWVtYmVySW5pdGlhbGl6ZXJzKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBQYXJzZUxleGVkTWV0aG9kRGVmcygpIG92ZXJyaWRlOworICAgIHZvaWQgUGFyc2VMZXhlZEF0dHJpYnV0ZXMoKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIFBhcnNlciAqU2VsZjsKKyAgICBQYXJzaW5nQ2xhc3MgKkNsYXNzOworICB9OworCisgIC8vLyBDb250YWlucyB0aGUgbGV4ZWQgdG9rZW5zIG9mIGFuIGF0dHJpYnV0ZSB3aXRoIGFyZ3VtZW50cyB0aGF0CisgIC8vLyBtYXkgcmVmZXJlbmNlIG1lbWJlciB2YXJpYWJsZXMgYW5kIHNvIG5lZWQgdG8gYmUgcGFyc2VkIGF0IHRoZQorICAvLy8gZW5kIG9mIHRoZSBjbGFzcyBkZWNsYXJhdGlvbiBhZnRlciBwYXJzaW5nIGFsbCBvdGhlciBtZW1iZXIKKyAgLy8vIG1lbWJlciBkZWNsYXJhdGlvbnMuCisgIC8vLyBGSVhNRTogUGVyaGFwcyB3ZSBzaG91bGQgY2hhbmdlIHRoZSBuYW1lIG9mIExhdGVQYXJzZWREZWNsYXJhdGlvbiB0bworICAvLy8gTGF0ZVBhcnNlZFRva2Vucy4KKyAgc3RydWN0IExhdGVQYXJzZWRBdHRyaWJ1dGUgOiBwdWJsaWMgTGF0ZVBhcnNlZERlY2xhcmF0aW9uIHsKKyAgICBQYXJzZXIgKlNlbGY7CisgICAgQ2FjaGVkVG9rZW5zIFRva3M7CisgICAgSWRlbnRpZmllckluZm8gJkF0dHJOYW1lOworICAgIFNvdXJjZUxvY2F0aW9uIEF0dHJOYW1lTG9jOworICAgIFNtYWxsVmVjdG9yPERlY2wqLCAyPiBEZWNsczsKKworICAgIGV4cGxpY2l0IExhdGVQYXJzZWRBdHRyaWJ1dGUoUGFyc2VyICpQLCBJZGVudGlmaWVySW5mbyAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYykKKyAgICAgIDogU2VsZihQKSwgQXR0ck5hbWUoTmFtZSksIEF0dHJOYW1lTG9jKExvYykge30KKworICAgIHZvaWQgUGFyc2VMZXhlZEF0dHJpYnV0ZXMoKSBvdmVycmlkZTsKKworICAgIHZvaWQgYWRkRGVjbChEZWNsICpEKSB7IERlY2xzLnB1c2hfYmFjayhEKTsgfQorICB9OworCisgIC8vIEEgbGlzdCBvZiBsYXRlLXBhcnNlZCBhdHRyaWJ1dGVzLiAgVXNlZCBieSBQYXJzZUdOVUF0dHJpYnV0ZXMuCisgIGNsYXNzIExhdGVQYXJzZWRBdHRyTGlzdDogcHVibGljIFNtYWxsVmVjdG9yPExhdGVQYXJzZWRBdHRyaWJ1dGUgKiwgMj4geworICBwdWJsaWM6CisgICAgTGF0ZVBhcnNlZEF0dHJMaXN0KGJvb2wgUFNvb24gPSBmYWxzZSkgOiBQYXJzZVNvb24oUFNvb24pIHsgfQorCisgICAgYm9vbCBwYXJzZVNvb24oKSB7IHJldHVybiBQYXJzZVNvb247IH0KKworICBwcml2YXRlOgorICAgIGJvb2wgUGFyc2VTb29uOyAgLy8gQXJlIHdlIHBsYW5uaW5nIHRvIHBhcnNlIHRoZXNlIHNob3J0bHkgYWZ0ZXIgY3JlYXRpb24/CisgIH07CisKKyAgLy8vIENvbnRhaW5zIHRoZSBsZXhlZCB0b2tlbnMgb2YgYSBtZW1iZXIgZnVuY3Rpb24gZGVmaW5pdGlvbgorICAvLy8gd2hpY2ggbmVlZHMgdG8gYmUgcGFyc2VkIGF0IHRoZSBlbmQgb2YgdGhlIGNsYXNzIGRlY2xhcmF0aW9uCisgIC8vLyBhZnRlciBwYXJzaW5nIGFsbCBvdGhlciBtZW1iZXIgZGVjbGFyYXRpb25zLgorICBzdHJ1Y3QgTGV4ZWRNZXRob2QgOiBwdWJsaWMgTGF0ZVBhcnNlZERlY2xhcmF0aW9uIHsKKyAgICBQYXJzZXIgKlNlbGY7CisgICAgRGVjbCAqRDsKKyAgICBDYWNoZWRUb2tlbnMgVG9rczsKKworICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIG1lbWJlciBmdW5jdGlvbiBoYWQgYW4gYXNzb2NpYXRlZCB0ZW1wbGF0ZQorICAgIC8vLyBzY29wZS4gV2hlbiB0cnVlLCBEIGlzIGEgdGVtcGxhdGUgZGVjbGFyYXRpb24uCisgICAgLy8vIG90aGVyd2lzZSwgaXQgaXMgYSBtZW1iZXIgZnVuY3Rpb24gZGVjbGFyYXRpb24uCisgICAgYm9vbCBUZW1wbGF0ZVNjb3BlOworCisgICAgZXhwbGljaXQgTGV4ZWRNZXRob2QoUGFyc2VyKiBQLCBEZWNsICpNRCkKKyAgICAgIDogU2VsZihQKSwgRChNRCksIFRlbXBsYXRlU2NvcGUoZmFsc2UpIHt9CisKKyAgICB2b2lkIFBhcnNlTGV4ZWRNZXRob2REZWZzKCkgb3ZlcnJpZGU7CisgIH07CisKKyAgLy8vIExhdGVQYXJzZWREZWZhdWx0QXJndW1lbnQgLSBLZWVwcyB0cmFjayBvZiBhIHBhcmFtZXRlciB0aGF0IG1heQorICAvLy8gaGF2ZSBhIGRlZmF1bHQgYXJndW1lbnQgdGhhdCBjYW5ub3QgYmUgcGFyc2VkIHlldCBiZWNhdXNlIGl0CisgIC8vLyBvY2N1cnMgd2l0aGluIGEgbWVtYmVyIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGluc2lkZSB0aGUgY2xhc3MKKyAgLy8vIChDKysgW2NsYXNzLm1lbV1wMikuCisgIHN0cnVjdCBMYXRlUGFyc2VkRGVmYXVsdEFyZ3VtZW50IHsKKyAgICBleHBsaWNpdCBMYXRlUGFyc2VkRGVmYXVsdEFyZ3VtZW50KERlY2wgKlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q2FjaGVkVG9rZW5zPiBUb2tzID0gbnVsbHB0cikKKyAgICAgIDogUGFyYW0oUCksIFRva3Moc3RkOjptb3ZlKFRva3MpKSB7IH0KKworICAgIC8vLyBQYXJhbSAtIFRoZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb24gZm9yIHRoaXMgcGFyYW1ldGVyLgorICAgIERlY2wgKlBhcmFtOworCisgICAgLy8vIFRva3MgLSBUaGUgc2VxdWVuY2Ugb2YgdG9rZW5zIHRoYXQgY29tcHJpc2VzIHRoZSBkZWZhdWx0CisgICAgLy8vIGFyZ3VtZW50IGV4cHJlc3Npb24sIG5vdCBpbmNsdWRpbmcgdGhlICc9JyBvciB0aGUgdGVybWluYXRpbmcKKyAgICAvLy8gJyknIG9yICcsJy4gVGhpcyB3aWxsIGJlIE5VTEwgZm9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIG5vCisgICAgLy8vIGRlZmF1bHQgYXJndW1lbnQuCisgICAgc3RkOjp1bmlxdWVfcHRyPENhY2hlZFRva2Vucz4gVG9rczsKKyAgfTsKKworICAvLy8gTGF0ZVBhcnNlZE1ldGhvZERlY2xhcmF0aW9uIC0gQSBtZXRob2QgZGVjbGFyYXRpb24gaW5zaWRlIGEgY2xhc3MgdGhhdAorICAvLy8gY29udGFpbnMgYXQgbGVhc3Qgb25lIGVudGl0eSB3aG9zZSBwYXJzaW5nIG5lZWRzIHRvIGJlIGRlbGF5ZWQKKyAgLy8vIHVudGlsIHRoZSBjbGFzcyBpdHNlbGYgaXMgY29tcGxldGVseS1kZWZpbmVkLCBzdWNoIGFzIGEgZGVmYXVsdAorICAvLy8gYXJndW1lbnQgKEMrKyBbY2xhc3MubWVtXXAyKS4KKyAgc3RydWN0IExhdGVQYXJzZWRNZXRob2REZWNsYXJhdGlvbiA6IHB1YmxpYyBMYXRlUGFyc2VkRGVjbGFyYXRpb24geworICAgIGV4cGxpY2l0IExhdGVQYXJzZWRNZXRob2REZWNsYXJhdGlvbihQYXJzZXIgKlAsIERlY2wgKk0pCisgICAgICA6IFNlbGYoUCksIE1ldGhvZChNKSwgVGVtcGxhdGVTY29wZShmYWxzZSksCisgICAgICAgIEV4Y2VwdGlvblNwZWNUb2tlbnMobnVsbHB0cikge30KKworICAgIHZvaWQgUGFyc2VMZXhlZE1ldGhvZERlY2xhcmF0aW9ucygpIG92ZXJyaWRlOworCisgICAgUGFyc2VyKiBTZWxmOworCisgICAgLy8vIE1ldGhvZCAtIFRoZSBtZXRob2QgZGVjbGFyYXRpb24uCisgICAgRGVjbCAqTWV0aG9kOworCisgICAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIGhhZCBhbiBhc3NvY2lhdGVkIHRlbXBsYXRlCisgICAgLy8vIHNjb3BlLiBXaGVuIHRydWUsIEQgaXMgYSB0ZW1wbGF0ZSBkZWNsYXJhdGlvbi4KKyAgICAvLy8gb3RoZXdpc2UsIGl0IGlzIGEgbWVtYmVyIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgorICAgIGJvb2wgVGVtcGxhdGVTY29wZTsKKworICAgIC8vLyBEZWZhdWx0QXJncyAtIENvbnRhaW5zIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBmdW5jdGlvbiBhbmQKKyAgICAvLy8gdGhlaXIgZGVmYXVsdCBhcmd1bWVudHMuIEF0IGxlYXN0IG9uZSBvZiB0aGUgcGFyYW1ldGVycyB3aWxsCisgICAgLy8vIGhhdmUgYSBkZWZhdWx0IGFyZ3VtZW50LCBidXQgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZQorICAgIC8vLyBtZXRob2Qgd2lsbCBiZSBzdG9yZWQgc28gdGhhdCB0aGV5IGNhbiBiZSByZWludHJvZHVjZWQgaW50bworICAgIC8vLyBzY29wZSBhdCB0aGUgYXBwcm9wcmlhdGUgdGltZXMuCisgICAgU21hbGxWZWN0b3I8TGF0ZVBhcnNlZERlZmF1bHRBcmd1bWVudCwgOD4gRGVmYXVsdEFyZ3M7CisgIAorICAgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiB0b2tlbnMgdGhhdCBtYWtlIHVwIGFuIGV4Y2VwdGlvbi1zcGVjaWZpY2F0aW9uIHRoYXQKKyAgICAvLy8gaGFzIG5vdCB5ZXQgYmVlbiBwYXJzZWQuCisgICAgQ2FjaGVkVG9rZW5zICpFeGNlcHRpb25TcGVjVG9rZW5zOworICB9OworCisgIC8vLyBMYXRlUGFyc2VkTWVtYmVySW5pdGlhbGl6ZXIgLSBBbiBpbml0aWFsaXplciBmb3IgYSBub24tc3RhdGljIGNsYXNzIGRhdGEKKyAgLy8vIG1lbWJlciB3aG9zZSBwYXJzaW5nIG11c3QgdG8gYmUgZGVsYXllZCB1bnRpbCB0aGUgY2xhc3MgaXMgY29tcGxldGVseQorICAvLy8gZGVmaW5lZCAoQysrMTEgW2NsYXNzLm1lbV1wMikuCisgIHN0cnVjdCBMYXRlUGFyc2VkTWVtYmVySW5pdGlhbGl6ZXIgOiBwdWJsaWMgTGF0ZVBhcnNlZERlY2xhcmF0aW9uIHsKKyAgICBMYXRlUGFyc2VkTWVtYmVySW5pdGlhbGl6ZXIoUGFyc2VyICpQLCBEZWNsICpGRCkKKyAgICAgIDogU2VsZihQKSwgRmllbGQoRkQpIHsgfQorCisgICAgdm9pZCBQYXJzZUxleGVkTWVtYmVySW5pdGlhbGl6ZXJzKCkgb3ZlcnJpZGU7CisKKyAgICBQYXJzZXIgKlNlbGY7CisKKyAgICAvLy8gRmllbGQgLSBUaGUgZmllbGQgZGVjbGFyYXRpb24uCisgICAgRGVjbCAqRmllbGQ7CisKKyAgICAvLy8gQ2FjaGVkVG9rZW5zIC0gVGhlIHNlcXVlbmNlIG9mIHRva2VucyB0aGF0IGNvbXByaXNlcyB0aGUgaW5pdGlhbGl6ZXIsCisgICAgLy8vIGluY2x1ZGluZyBhbnkgbGVhZGluZyAnPScuCisgICAgQ2FjaGVkVG9rZW5zIFRva3M7CisgIH07CisKKyAgLy8vIExhdGVQYXJzZWREZWNsYXJhdGlvbnNDb250YWluZXIgLSBEdXJpbmcgcGFyc2luZyBvZiBhIHRvcCAobm9uLW5lc3RlZCkKKyAgLy8vIEMrKyBjbGFzcywgaXRzIG1ldGhvZCBkZWNsYXJhdGlvbnMgdGhhdCBjb250YWluIHBhcnRzIHRoYXQgd29uJ3QgYmUKKyAgLy8vIHBhcnNlZCB1bnRpbCBhZnRlciB0aGUgZGVmaW5pdGlvbiBpcyBjb21wbGV0ZWQgKEMrKyBbY2xhc3MubWVtXXAyKSwKKyAgLy8vIHRoZSBtZXRob2QgZGVjbGFyYXRpb25zIGFuZCBwb3NzaWJseSBhdHRhY2hlZCBpbmxpbmUgZGVmaW5pdGlvbnMKKyAgLy8vIHdpbGwgYmUgc3RvcmVkIGhlcmUgd2l0aCB0aGUgdG9rZW5zIHRoYXQgd2lsbCBiZSBwYXJzZWQgdG8gY3JlYXRlIHRob3NlIAorICAvLy8gZW50aXRpZXMuCisgIHR5cGVkZWYgU21hbGxWZWN0b3I8TGF0ZVBhcnNlZERlY2xhcmF0aW9uKiwyPiBMYXRlUGFyc2VkRGVjbGFyYXRpb25zQ29udGFpbmVyOworCisgIC8vLyBcYnJpZWYgUmVwcmVzZW50YXRpb24gb2YgYSBjbGFzcyB0aGF0IGhhcyBiZWVuIHBhcnNlZCwgaW5jbHVkaW5nCisgIC8vLyBhbnkgbWVtYmVyIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBvciBkZWZpbml0aW9ucyB0aGF0IG5lZWQgdG8gYmUKKyAgLy8vIHBhcnNlZCBhZnRlciB0aGUgY29ycmVzcG9uZGluZyB0b3AtbGV2ZWwgY2xhc3MgaXMgY29tcGxldGUuCisgIHN0cnVjdCBQYXJzaW5nQ2xhc3MgeworICAgIFBhcnNpbmdDbGFzcyhEZWNsICpUYWdPclRlbXBsYXRlLCBib29sIFRvcExldmVsQ2xhc3MsIGJvb2wgSXNJbnRlcmZhY2UpCisgICAgICA6IFRvcExldmVsQ2xhc3MoVG9wTGV2ZWxDbGFzcyksIFRlbXBsYXRlU2NvcGUoZmFsc2UpLAorICAgICAgICBJc0ludGVyZmFjZShJc0ludGVyZmFjZSksIFRhZ09yVGVtcGxhdGUoVGFnT3JUZW1wbGF0ZSkgeyB9CisKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBpcyBhICJ0b3AtbGV2ZWwiIGNsYXNzLCBtZWFuaW5nIHRoYXQgaXQgaXMKKyAgICAvLy8gbm90IG5lc3RlZCB3aXRoaW4gYW5vdGhlciBjbGFzcy4KKyAgICBib29sIFRvcExldmVsQ2xhc3MgOiAxOworCisgICAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgY2xhc3MgaGFkIGFuIGFzc29jaWF0ZWQgdGVtcGxhdGUKKyAgICAvLy8gc2NvcGUuIFdoZW4gdHJ1ZSwgVGFnT3JUZW1wbGF0ZSBpcyBhIHRlbXBsYXRlIGRlY2xhcmF0aW9uOworICAgIC8vLyBvdGhld2lzZSwgaXQgaXMgYSB0YWcgZGVjbGFyYXRpb24uCisgICAgYm9vbCBUZW1wbGF0ZVNjb3BlIDogMTsKKworICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGNsYXNzIGlzIGFuIF9faW50ZXJmYWNlLgorICAgIGJvb2wgSXNJbnRlcmZhY2UgOiAxOworCisgICAgLy8vIFxicmllZiBUaGUgY2xhc3Mgb3IgY2xhc3MgdGVtcGxhdGUgd2hvc2UgZGVmaW5pdGlvbiB3ZSBhcmUgcGFyc2luZy4KKyAgICBEZWNsICpUYWdPclRlbXBsYXRlOworCisgICAgLy8vIExhdGVQYXJzZWREZWNsYXJhdGlvbnMgLSBNZXRob2QgZGVjbGFyYXRpb25zLCBpbmxpbmUgZGVmaW5pdGlvbnMgYW5kCisgICAgLy8vIG5lc3RlZCBjbGFzc2VzIHRoYXQgY29udGFpbiBwaWVjZXMgd2hvc2UgcGFyc2luZyB3aWxsIGJlIGRlbGF5ZWQgdW50aWwKKyAgICAvLy8gdGhlIHRvcC1sZXZlbCBjbGFzcyBpcyBmdWxseSBkZWZpbmVkLgorICAgIExhdGVQYXJzZWREZWNsYXJhdGlvbnNDb250YWluZXIgTGF0ZVBhcnNlZERlY2xhcmF0aW9uczsKKyAgfTsKKworICAvLy8gXGJyaWVmIFRoZSBzdGFjayBvZiBjbGFzc2VzIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCisgIC8vLyBwYXJzZWQuIE5lc3RlZCBhbmQgbG9jYWwgY2xhc3NlcyB3aWxsIGJlIHB1c2hlZCBvbnRvIHRoaXMgc3RhY2sKKyAgLy8vIHdoZW4gdGhleSBhcmUgcGFyc2VkLCBhbmQgcmVtb3ZlZCBhZnRlcndhcmQuCisgIHN0ZDo6c3RhY2s8UGFyc2luZ0NsYXNzICo+IENsYXNzU3RhY2s7CisKKyAgUGFyc2luZ0NsYXNzICZnZXRDdXJyZW50Q2xhc3MoKSB7CisgICAgYXNzZXJ0KCFDbGFzc1N0YWNrLmVtcHR5KCkgJiYgIk5vIGxleGVkIG1ldGhvZCBzdGFja3MhIik7CisgICAgcmV0dXJuICpDbGFzc1N0YWNrLnRvcCgpOworICB9CisKKyAgLy8vIFxicmllZiBSQUlJIG9iamVjdCB1c2VkIHRvIG1hbmFnZSB0aGUgcGFyc2luZyBvZiBhIGNsYXNzIGRlZmluaXRpb24uCisgIGNsYXNzIFBhcnNpbmdDbGFzc0RlZmluaXRpb24geworICAgIFBhcnNlciAmUDsKKyAgICBib29sIFBvcHBlZDsKKyAgICBTZW1hOjpQYXJzaW5nQ2xhc3NTdGF0ZSBTdGF0ZTsKKworICBwdWJsaWM6CisgICAgUGFyc2luZ0NsYXNzRGVmaW5pdGlvbihQYXJzZXIgJlAsIERlY2wgKlRhZ09yVGVtcGxhdGUsIGJvb2wgVG9wTGV2ZWxDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbnRlcmZhY2UpCisgICAgICA6IFAoUCksIFBvcHBlZChmYWxzZSksCisgICAgICAgIFN0YXRlKFAuUHVzaFBhcnNpbmdDbGFzcyhUYWdPclRlbXBsYXRlLCBUb3BMZXZlbENsYXNzLCBJc0ludGVyZmFjZSkpIHsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFBvcCB0aGlzIGNsYXNzIG9mIHRoZSBzdGFjay4KKyAgICB2b2lkIFBvcCgpIHsKKyAgICAgIGFzc2VydCghUG9wcGVkICYmICJOZXN0ZWQgY2xhc3MgaGFzIGFscmVhZHkgYmVlbiBwb3BwZWQiKTsKKyAgICAgIFBvcHBlZCA9IHRydWU7CisgICAgICBQLlBvcFBhcnNpbmdDbGFzcyhTdGF0ZSk7CisgICAgfQorCisgICAgflBhcnNpbmdDbGFzc0RlZmluaXRpb24oKSB7CisgICAgICBpZiAoIVBvcHBlZCkKKyAgICAgICAgUC5Qb3BQYXJzaW5nQ2xhc3MoU3RhdGUpOworICAgIH0KKyAgfTsKKworICAvLy8gXGJyaWVmIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFueSB0ZW1wbGF0ZS1zcGVjaWZpYworICAvLy8gaW5mb3JtYXRpb24gdGhhdCBoYXMgYmVlbiBwYXJzZWQgcHJpb3IgdG8gcGFyc2luZyBkZWNsYXJhdGlvbgorICAvLy8gc3BlY2lmaWVycy4KKyAgc3RydWN0IFBhcnNlZFRlbXBsYXRlSW5mbyB7CisgICAgUGFyc2VkVGVtcGxhdGVJbmZvKCkKKyAgICAgIDogS2luZChOb25UZW1wbGF0ZSksIFRlbXBsYXRlUGFyYW1zKG51bGxwdHIpLCBUZW1wbGF0ZUxvYygpIHsgfQorCisgICAgUGFyc2VkVGVtcGxhdGVJbmZvKFRlbXBsYXRlUGFyYW1ldGVyTGlzdHMgKlRlbXBsYXRlUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3BlY2lhbGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGFzdFBhcmFtZXRlckxpc3RXYXNFbXB0eSA9IGZhbHNlKQorICAgICAgOiBLaW5kKGlzU3BlY2lhbGl6YXRpb24/IEV4cGxpY2l0U3BlY2lhbGl6YXRpb24gOiBUZW1wbGF0ZSksCisgICAgICAgIFRlbXBsYXRlUGFyYW1zKFRlbXBsYXRlUGFyYW1zKSwKKyAgICAgICAgTGFzdFBhcmFtZXRlckxpc3RXYXNFbXB0eShsYXN0UGFyYW1ldGVyTGlzdFdhc0VtcHR5KSB7IH0KKworICAgIGV4cGxpY2l0IFBhcnNlZFRlbXBsYXRlSW5mbyhTb3VyY2VMb2NhdGlvbiBFeHRlcm5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlTG9jKQorICAgICAgOiBLaW5kKEV4cGxpY2l0SW5zdGFudGlhdGlvbiksIFRlbXBsYXRlUGFyYW1zKG51bGxwdHIpLAorICAgICAgICBFeHRlcm5Mb2MoRXh0ZXJuTG9jKSwgVGVtcGxhdGVMb2MoVGVtcGxhdGVMb2MpLAorICAgICAgICBMYXN0UGFyYW1ldGVyTGlzdFdhc0VtcHR5KGZhbHNlKXsgfQorCisgICAgLy8vIFxicmllZiBUaGUga2luZCBvZiB0ZW1wbGF0ZSB3ZSBhcmUgcGFyc2luZy4KKyAgICBlbnVtIHsKKyAgICAgIC8vLyBcYnJpZWYgV2UgYXJlIG5vdCBwYXJzaW5nIGEgdGVtcGxhdGUgYXQgYWxsLgorICAgICAgTm9uVGVtcGxhdGUgPSAwLAorICAgICAgLy8vIFxicmllZiBXZSBhcmUgcGFyc2luZyBhIHRlbXBsYXRlIGRlY2xhcmF0aW9uLgorICAgICAgVGVtcGxhdGUsCisgICAgICAvLy8gXGJyaWVmIFdlIGFyZSBwYXJzaW5nIGFuIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uLgorICAgICAgRXhwbGljaXRTcGVjaWFsaXphdGlvbiwKKyAgICAgIC8vLyBcYnJpZWYgV2UgYXJlIHBhcnNpbmcgYW4gZXhwbGljaXQgaW5zdGFudGlhdGlvbi4KKyAgICAgIEV4cGxpY2l0SW5zdGFudGlhdGlvbgorICAgIH0gS2luZDsKKworICAgIC8vLyBcYnJpZWYgVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0cywgZm9yIHRlbXBsYXRlIGRlY2xhcmF0aW9ucworICAgIC8vLyBhbmQgZXhwbGljaXQgc3BlY2lhbGl6YXRpb25zLgorICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdHMgKlRlbXBsYXRlUGFyYW1zOworCisgICAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlICdleHRlcm4nIGtleXdvcmQsIGlmIGFueSwgZm9yIGFuIGV4cGxpY2l0CisgICAgLy8vIGluc3RhbnRpYXRpb24KKyAgICBTb3VyY2VMb2NhdGlvbiBFeHRlcm5Mb2M7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgJ3RlbXBsYXRlJyBrZXl3b3JkLCBmb3IgYW4gZXhwbGljaXQKKyAgICAvLy8gaW5zdGFudGlhdGlvbi4KKyAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUxvYzsKKworICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgbGFzdCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdCB3YXMgZW1wdHkuCisgICAgYm9vbCBMYXN0UGFyYW1ldGVyTGlzdFdhc0VtcHR5OworCisgICAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZOworICB9OworCisgIHZvaWQgTGV4VGVtcGxhdGVGdW5jdGlvbkZvckxhdGVQYXJzaW5nKENhY2hlZFRva2VucyAmVG9rcyk7CisgIHZvaWQgUGFyc2VMYXRlVGVtcGxhdGVkRnVuY0RlZihMYXRlUGFyc2VkVGVtcGxhdGUgJkxQVCk7CisKKyAgc3RhdGljIHZvaWQgTGF0ZVRlbXBsYXRlUGFyc2VyQ2FsbGJhY2sodm9pZCAqUCwgTGF0ZVBhcnNlZFRlbXBsYXRlICZMUFQpOworICBzdGF0aWMgdm9pZCBMYXRlVGVtcGxhdGVQYXJzZXJDbGVhbnVwQ2FsbGJhY2sodm9pZCAqUCk7CisKKyAgU2VtYTo6UGFyc2luZ0NsYXNzU3RhdGUKKyAgUHVzaFBhcnNpbmdDbGFzcyhEZWNsICpUYWdPclRlbXBsYXRlLCBib29sIFRvcExldmVsQ2xhc3MsIGJvb2wgSXNJbnRlcmZhY2UpOworICB2b2lkIERlYWxsb2NhdGVQYXJzZWRDbGFzc2VzKFBhcnNpbmdDbGFzcyAqQ2xhc3MpOworICB2b2lkIFBvcFBhcnNpbmdDbGFzcyhTZW1hOjpQYXJzaW5nQ2xhc3NTdGF0ZSk7CisKKyAgZW51bSBDYWNoZWRJbml0S2luZCB7CisgICAgQ0lLX0RlZmF1bHRBcmd1bWVudCwKKyAgICBDSUtfRGVmYXVsdEluaXRpYWxpemVyCisgIH07CisKKyAgTmFtZWREZWNsICpQYXJzZUNYWElubGluZU1ldGhvZERlZihBY2Nlc3NTcGVjaWZpZXIgQVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3QgKkFjY2Vzc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzaW5nRGVjbGFyYXRvciAmRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyc2VkVGVtcGxhdGVJbmZvICZUZW1wbGF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZpcnRTcGVjaWZpZXJzJiBWUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUHVyZVNwZWNMb2MpOworICB2b2lkIFBhcnNlQ1hYTm9uU3RhdGljTWVtYmVySW5pdGlhbGl6ZXIoRGVjbCAqVmFyRCk7CisgIHZvaWQgUGFyc2VMZXhlZEF0dHJpYnV0ZXMoUGFyc2luZ0NsYXNzICZDbGFzcyk7CisgIHZvaWQgUGFyc2VMZXhlZEF0dHJpYnV0ZUxpc3QoTGF0ZVBhcnNlZEF0dHJMaXN0ICZMQXMsIERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbnRlclNjb3BlLCBib29sIE9uRGVmaW5pdGlvbik7CisgIHZvaWQgUGFyc2VMZXhlZEF0dHJpYnV0ZShMYXRlUGFyc2VkQXR0cmlidXRlICZMQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRW50ZXJTY29wZSwgYm9vbCBPbkRlZmluaXRpb24pOworICB2b2lkIFBhcnNlTGV4ZWRNZXRob2REZWNsYXJhdGlvbnMoUGFyc2luZ0NsYXNzICZDbGFzcyk7CisgIHZvaWQgUGFyc2VMZXhlZE1ldGhvZERlY2xhcmF0aW9uKExhdGVQYXJzZWRNZXRob2REZWNsYXJhdGlvbiAmTE0pOworICB2b2lkIFBhcnNlTGV4ZWRNZXRob2REZWZzKFBhcnNpbmdDbGFzcyAmQ2xhc3MpOworICB2b2lkIFBhcnNlTGV4ZWRNZXRob2REZWYoTGV4ZWRNZXRob2QgJkxNKTsKKyAgdm9pZCBQYXJzZUxleGVkTWVtYmVySW5pdGlhbGl6ZXJzKFBhcnNpbmdDbGFzcyAmQ2xhc3MpOworICB2b2lkIFBhcnNlTGV4ZWRNZW1iZXJJbml0aWFsaXplcihMYXRlUGFyc2VkTWVtYmVySW5pdGlhbGl6ZXIgJk1JKTsKKyAgdm9pZCBQYXJzZUxleGVkT2JqQ01ldGhvZERlZnMoTGV4ZWRNZXRob2QgJkxNLCBib29sIHBhcnNlTWV0aG9kKTsKKyAgYm9vbCBDb25zdW1lQW5kU3RvcmVGdW5jdGlvblByb2xvZ3VlKENhY2hlZFRva2VucyAmVG9rcyk7CisgIGJvb2wgQ29uc3VtZUFuZFN0b3JlSW5pdGlhbGl6ZXIoQ2FjaGVkVG9rZW5zICZUb2tzLCBDYWNoZWRJbml0S2luZCBDSUspOworICBib29sIENvbnN1bWVBbmRTdG9yZUNvbmRpdGlvbmFsKENhY2hlZFRva2VucyAmVG9rcyk7CisgIGJvb2wgQ29uc3VtZUFuZFN0b3JlVW50aWwodG9rOjpUb2tlbktpbmQgVDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVkVG9rZW5zICZUb2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3RvcEF0U2VtaSA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb25zdW1lRmluYWxUb2tlbiA9IHRydWUpIHsKKyAgICByZXR1cm4gQ29uc3VtZUFuZFN0b3JlVW50aWwoVDEsIFQxLCBUb2tzLCBTdG9wQXRTZW1pLCBDb25zdW1lRmluYWxUb2tlbik7CisgIH0KKyAgYm9vbCBDb25zdW1lQW5kU3RvcmVVbnRpbCh0b2s6OlRva2VuS2luZCBUMSwgdG9rOjpUb2tlbktpbmQgVDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVkVG9rZW5zICZUb2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3RvcEF0U2VtaSA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb25zdW1lRmluYWxUb2tlbiA9IHRydWUpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDOTkgNi45OiBFeHRlcm5hbCBEZWZpbml0aW9ucy4KKyAgc3RydWN0IFBhcnNlZEF0dHJpYnV0ZXNXaXRoUmFuZ2UgOiBQYXJzZWRBdHRyaWJ1dGVzIHsKKyAgICBQYXJzZWRBdHRyaWJ1dGVzV2l0aFJhbmdlKEF0dHJpYnV0ZUZhY3RvcnkgJmZhY3RvcnkpCisgICAgICA6IFBhcnNlZEF0dHJpYnV0ZXMoZmFjdG9yeSkge30KKworICAgIHZvaWQgY2xlYXIoKSB7CisgICAgICBQYXJzZWRBdHRyaWJ1dGVzOjpjbGVhcigpOworICAgICAgUmFuZ2UgPSBTb3VyY2VSYW5nZSgpOworICAgIH0KKworICAgIFNvdXJjZVJhbmdlIFJhbmdlOworICB9OworCisgIERlY2xHcm91cFB0clR5IFBhcnNlRXh0ZXJuYWxEZWNsYXJhdGlvbihQYXJzZWRBdHRyaWJ1dGVzV2l0aFJhbmdlICZhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNpbmdEZWNsU3BlYyAqRFMgPSBudWxscHRyKTsKKyAgYm9vbCBpc0RlY2xhcmF0aW9uQWZ0ZXJEZWNsYXJhdG9yKCk7CisgIGJvb2wgaXNTdGFydE9mRnVuY3Rpb25EZWZpbml0aW9uKGNvbnN0IFBhcnNpbmdEZWNsYXJhdG9yICZEZWNsYXJhdG9yKTsKKyAgRGVjbEdyb3VwUHRyVHkgUGFyc2VEZWNsYXJhdGlvbk9yRnVuY3Rpb25EZWZpbml0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzV2l0aFJhbmdlICZhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2luZ0RlY2xTcGVjICpEUyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc1NwZWNpZmllciBBUyA9IEFTX25vbmUpOworICBEZWNsR3JvdXBQdHJUeSBQYXJzZURlY2xPckZ1bmN0aW9uRGVmSW50ZXJuYWwoUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSAmYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzaW5nRGVjbFNwZWMgJkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzU3BlY2lmaWVyIEFTKTsKKworICB2b2lkIFNraXBGdW5jdGlvbkJvZHkoKTsKKyAgRGVjbCAqUGFyc2VGdW5jdGlvbkRlZmluaXRpb24oUGFyc2luZ0RlY2xhcmF0b3IgJkQsCisgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnNlZFRlbXBsYXRlSW5mbyAmVGVtcGxhdGVJbmZvID0gUGFyc2VkVGVtcGxhdGVJbmZvKCksCisgICAgICAgICAgICAgICAgIExhdGVQYXJzZWRBdHRyTGlzdCAqTGF0ZVBhcnNlZEF0dHJzID0gbnVsbHB0cik7CisgIHZvaWQgUGFyc2VLTlJQYXJhbURlY2xhcmF0aW9ucyhEZWNsYXJhdG9yICZEKTsKKyAgLy8gRW5kTG9jLCBpZiBub24tTlVMTCwgaXMgZmlsbGVkIHdpdGggdGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IHRva2VuIG9mCisgIC8vIHRoZSBzaW1wbGUtYXNtLgorICBFeHByUmVzdWx0IFBhcnNlU2ltcGxlQXNtKFNvdXJjZUxvY2F0aW9uICpFbmRMb2MgPSBudWxscHRyKTsKKyAgRXhwclJlc3VsdCBQYXJzZUFzbVN0cmluZ0xpdGVyYWwoKTsKKworICAvLyBPYmplY3RpdmUtQyBFeHRlcm5hbCBEZWNsYXJhdGlvbnMKKyAgdm9pZCBNYXliZVNraXBBdHRyaWJ1dGVzKHRvazo6T2JqQ0tleXdvcmRLaW5kIEtpbmQpOworICBEZWNsR3JvdXBQdHJUeSBQYXJzZU9iakNBdERpcmVjdGl2ZXMoUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSAmQXR0cnMpOworICBEZWNsR3JvdXBQdHJUeSBQYXJzZU9iakNBdENsYXNzRGVjbGFyYXRpb24oU291cmNlTG9jYXRpb24gYXRMb2MpOworICBEZWNsICpQYXJzZU9iakNBdEludGVyZmFjZURlY2xhcmF0aW9uKFNvdXJjZUxvY2F0aW9uIEF0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZEF0dHJpYnV0ZXMgJnByZWZpeEF0dHJzKTsKKyAgY2xhc3MgT2JqQ1R5cGVQYXJhbUxpc3RTY29wZTsKKyAgT2JqQ1R5cGVQYXJhbUxpc3QgKnBhcnNlT2JqQ1R5cGVQYXJhbUxpc3QoKTsKKyAgT2JqQ1R5cGVQYXJhbUxpc3QgKnBhcnNlT2JqQ1R5cGVQYXJhbUxpc3RPclByb3RvY29sUmVmcygKKyAgICAgIE9iakNUeXBlUGFyYW1MaXN0U2NvcGUgJlNjb3BlLCBTb3VyY2VMb2NhdGlvbiAmbEFuZ2xlTG9jLAorICAgICAgU21hbGxWZWN0b3JJbXBsPElkZW50aWZpZXJMb2NQYWlyPiAmcHJvdG9jb2xJZGVudHMsCisgICAgICBTb3VyY2VMb2NhdGlvbiAmckFuZ2xlTG9jLCBib29sIG1heUJlUHJvdG9jb2xMaXN0ID0gdHJ1ZSk7CisKKyAgdm9pZCBIZWxwZXJBY3Rpb25zRm9ySXZhckRlY2xhcmF0aW9ucyhEZWNsICppbnRlcmZhY2VEZWNsLCBTb3VyY2VMb2NhdGlvbiBhdExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWxhbmNlZERlbGltaXRlclRyYWNrZXIgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPERlY2wgKj4gJkFsbEl2YXJEZWNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJCcmFjZU1pc3NpbmcpOworICB2b2lkIFBhcnNlT2JqQ0NsYXNzSW5zdGFuY2VWYXJpYWJsZXMoRGVjbCAqaW50ZXJmYWNlRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6T2JqQ0tleXdvcmRLaW5kIHZpc2liaWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBhdExvYyk7CisgIGJvb2wgUGFyc2VPYmpDUHJvdG9jb2xSZWZlcmVuY2VzKFNtYWxsVmVjdG9ySW1wbDxEZWNsICo+ICZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U291cmNlTG9jYXRpb24+ICZQTG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBXYXJuT25EZWNsYXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRm9yT2JqQ0NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gJkxBbmdsZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gJkVuZFByb3RvTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN1bWVMYXN0VG9rZW4pOworCisgIC8vLyBQYXJzZSB0aGUgZmlyc3QgYW5nbGUtYnJhY2tldC1kZWxpbWl0ZWQgY2xhdXNlIGZvciBhbgorICAvLy8gT2JqZWN0aXZlLUMgb2JqZWN0IG9yIG9iamVjdCBwb2ludGVyIHR5cGUsIHdoaWNoIG1heSBiZSBlaXRoZXIKKyAgLy8vIHR5cGUgYXJndW1lbnRzIG9yIHByb3RvY29sIHF1YWxpZmllcnMuCisgIHZvaWQgcGFyc2VPYmpDVHlwZUFyZ3NPclByb3RvY29sUXVhbGlmaWVycygKKyAgICAgICAgIFBhcnNlZFR5cGUgYmFzZVR5cGUsCisgICAgICAgICBTb3VyY2VMb2NhdGlvbiAmdHlwZUFyZ3NMQW5nbGVMb2MsCisgICAgICAgICBTbWFsbFZlY3RvckltcGw8UGFyc2VkVHlwZT4gJnR5cGVBcmdzLAorICAgICAgICAgU291cmNlTG9jYXRpb24gJnR5cGVBcmdzUkFuZ2xlTG9jLAorICAgICAgICAgU291cmNlTG9jYXRpb24gJnByb3RvY29sTEFuZ2xlTG9jLAorICAgICAgICAgU21hbGxWZWN0b3JJbXBsPERlY2wgKj4gJnByb3RvY29scywKKyAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTb3VyY2VMb2NhdGlvbj4gJnByb3RvY29sTG9jcywKKyAgICAgICAgIFNvdXJjZUxvY2F0aW9uICZwcm90b2NvbFJBbmdsZUxvYywKKyAgICAgICAgIGJvb2wgY29uc3VtZUxhc3RUb2tlbiwKKyAgICAgICAgIGJvb2wgd2Fybk9uSW5jb21wbGV0ZVByb3RvY29scyk7CisKKyAgLy8vIFBhcnNlIGVpdGhlciBPYmplY3RpdmUtQyB0eXBlIGFyZ3VtZW50cyBvciBwcm90b2NvbCBxdWFsaWZpZXJzOyBpZiB0aGUKKyAgLy8vIGZvcm1lciwgYWxzbyBwYXJzZSBwcm90b2NvbCBxdWFsaWZpZXJzIGFmdGVyd2FyZC4KKyAgdm9pZCBwYXJzZU9iakNUeXBlQXJnc0FuZFByb3RvY29sUXVhbGlmaWVycygKKyAgICAgICAgIFBhcnNlZFR5cGUgYmFzZVR5cGUsCisgICAgICAgICBTb3VyY2VMb2NhdGlvbiAmdHlwZUFyZ3NMQW5nbGVMb2MsCisgICAgICAgICBTbWFsbFZlY3RvckltcGw8UGFyc2VkVHlwZT4gJnR5cGVBcmdzLAorICAgICAgICAgU291cmNlTG9jYXRpb24gJnR5cGVBcmdzUkFuZ2xlTG9jLAorICAgICAgICAgU291cmNlTG9jYXRpb24gJnByb3RvY29sTEFuZ2xlTG9jLAorICAgICAgICAgU21hbGxWZWN0b3JJbXBsPERlY2wgKj4gJnByb3RvY29scywKKyAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTb3VyY2VMb2NhdGlvbj4gJnByb3RvY29sTG9jcywKKyAgICAgICAgIFNvdXJjZUxvY2F0aW9uICZwcm90b2NvbFJBbmdsZUxvYywKKyAgICAgICAgIGJvb2wgY29uc3VtZUxhc3RUb2tlbik7CisKKyAgLy8vIFBhcnNlIGEgcHJvdG9jb2wgcXVhbGlmaWVyIHR5cGUgc3VjaCBhcyAnPE5TQ29weWluZz4nLCB3aGljaCBpcworICAvLy8gYW4gYW5hY2hyb25pc3RpYyB3YXkgb2Ygd3JpdGluZyAnaWQ8TlNDb3B5aW5nPicuCisgIFR5cGVSZXN1bHQgcGFyc2VPYmpDUHJvdG9jb2xRdWFsaWZpZXJUeXBlKFNvdXJjZUxvY2F0aW9uICZyQW5nbGVMb2MpOworCisgIC8vLyBQYXJzZSBPYmplY3RpdmUtQyB0eXBlIGFyZ3VtZW50cyBhbmQgcHJvdG9jb2wgcXVhbGlmaWVycywgZXh0ZW5kaW5nIHRoZQorICAvLy8gY3VycmVudCB0eXBlIHdpdGggdGhlIHBhcnNlZCByZXN1bHQuCisgIFR5cGVSZXN1bHQgcGFyc2VPYmpDVHlwZUFyZ3NBbmRQcm90b2NvbFF1YWxpZmllcnMoU291cmNlTG9jYXRpb24gbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN1bWVMYXN0VG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gJmVuZExvYyk7CisKKyAgdm9pZCBQYXJzZU9iakNJbnRlcmZhY2VEZWNsTGlzdCh0b2s6Ok9iakNLZXl3b3JkS2luZCBjb250ZXh0S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2wgKkNEZWNsKTsKKyAgRGVjbEdyb3VwUHRyVHkgUGFyc2VPYmpDQXRQcm90b2NvbERlY2xhcmF0aW9uKFNvdXJjZUxvY2F0aW9uIGF0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkQXR0cmlidXRlcyAmcHJlZml4QXR0cnMpOworCisgIHN0cnVjdCBPYmpDSW1wbFBhcnNpbmdEYXRhUkFJSSB7CisgICAgUGFyc2VyICZQOworICAgIERlY2wgKkRjbDsKKyAgICBib29sIEhhc0NGdW5jdGlvbjsKKyAgICB0eXBlZGVmIFNtYWxsVmVjdG9yPExleGVkTWV0aG9kKiwgOD4gTGF0ZVBhcnNlZE9iakNNZXRob2RDb250YWluZXI7CisgICAgTGF0ZVBhcnNlZE9iakNNZXRob2RDb250YWluZXIgTGF0ZVBhcnNlZE9iakNNZXRob2RzOworCisgICAgT2JqQ0ltcGxQYXJzaW5nRGF0YVJBSUkoUGFyc2VyICZwYXJzZXIsIERlY2wgKkQpCisgICAgICA6IFAocGFyc2VyKSwgRGNsKEQpLCBIYXNDRnVuY3Rpb24oZmFsc2UpIHsKKyAgICAgIFAuQ3VyUGFyc2VkT2JqQ0ltcGwgPSB0aGlzOworICAgICAgRmluaXNoZWQgPSBmYWxzZTsKKyAgICB9CisgICAgfk9iakNJbXBsUGFyc2luZ0RhdGFSQUlJKCk7CisKKyAgICB2b2lkIGZpbmlzaChTb3VyY2VSYW5nZSBBdEVuZCk7CisgICAgYm9vbCBpc0ZpbmlzaGVkKCkgY29uc3QgeyByZXR1cm4gRmluaXNoZWQ7IH0KKworICBwcml2YXRlOgorICAgIGJvb2wgRmluaXNoZWQ7CisgIH07CisgIE9iakNJbXBsUGFyc2luZ0RhdGFSQUlJICpDdXJQYXJzZWRPYmpDSW1wbDsKKyAgdm9pZCBTdGFzaEF3YXlNZXRob2RPckZ1bmN0aW9uQm9keVRva2VucyhEZWNsICpNRGVjbCk7CisKKyAgRGVjbEdyb3VwUHRyVHkgUGFyc2VPYmpDQXRJbXBsZW1lbnRhdGlvbkRlY2xhcmF0aW9uKFNvdXJjZUxvY2F0aW9uIEF0TG9jKTsKKyAgRGVjbEdyb3VwUHRyVHkgUGFyc2VPYmpDQXRFbmREZWNsYXJhdGlvbihTb3VyY2VSYW5nZSBhdEVuZCk7CisgIERlY2wgKlBhcnNlT2JqQ0F0QWxpYXNEZWNsYXJhdGlvbihTb3VyY2VMb2NhdGlvbiBhdExvYyk7CisgIERlY2wgKlBhcnNlT2JqQ1Byb3BlcnR5U3ludGhlc2l6ZShTb3VyY2VMb2NhdGlvbiBhdExvYyk7CisgIERlY2wgKlBhcnNlT2JqQ1Byb3BlcnR5RHluYW1pYyhTb3VyY2VMb2NhdGlvbiBhdExvYyk7CisKKyAgSWRlbnRpZmllckluZm8gKlBhcnNlT2JqQ1NlbGVjdG9yUGllY2UoU291cmNlTG9jYXRpb24gJk1ldGhvZExvY2F0aW9uKTsKKyAgLy8gRGVmaW5pdGlvbnMgZm9yIE9iamVjdGl2ZS1jIGNvbnRleHQgc2Vuc2l0aXZlIGtleXdvcmRzIHJlY29nbml0aW9uLgorICBlbnVtIE9iakNUeXBlUXVhbCB7CisgICAgb2JqY19pbj0wLCBvYmpjX291dCwgb2JqY19pbm91dCwgb2JqY19vbmV3YXksIG9iamNfYnljb3B5LCBvYmpjX2J5cmVmLAorICAgIG9iamNfbm9ubnVsbCwgb2JqY19udWxsYWJsZSwgb2JqY19udWxsX3Vuc3BlY2lmaWVkLAorICAgIG9iamNfTnVtUXVhbHMKKyAgfTsKKyAgSWRlbnRpZmllckluZm8gKk9iakNUeXBlUXVhbHNbb2JqY19OdW1RdWFsc107CisKKyAgYm9vbCBpc1Rva0lkZW50aWZpZXJfaW4oKSBjb25zdDsKKworICBQYXJzZWRUeXBlIFBhcnNlT2JqQ1R5cGVOYW1lKE9iakNEZWNsU3BlYyAmRFMsIERlY2xhcmF0b3JDb250ZXh0IEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzICpQYXJhbUF0dHJzKTsKKyAgdm9pZCBQYXJzZU9iakNNZXRob2RSZXF1aXJlbWVudCgpOworICBEZWNsICpQYXJzZU9iakNNZXRob2RQcm90b3R5cGUoCisgICAgICAgICAgICB0b2s6Ok9iakNLZXl3b3JkS2luZCBNZXRob2RJbXBsS2luZCA9IHRvazo6b2JqY19ub3Rfa2V5d29yZCwKKyAgICAgICAgICAgIGJvb2wgTWV0aG9kRGVmaW5pdGlvbiA9IHRydWUpOworICBEZWNsICpQYXJzZU9iakNNZXRob2REZWNsKFNvdXJjZUxvY2F0aW9uIG1Mb2MsIHRvazo6VG9rZW5LaW5kIG1UeXBlLAorICAgICAgICAgICAgdG9rOjpPYmpDS2V5d29yZEtpbmQgTWV0aG9kSW1wbEtpbmQgPSB0b2s6Om9iamNfbm90X2tleXdvcmQsCisgICAgICAgICAgICBib29sIE1ldGhvZERlZmluaXRpb249dHJ1ZSk7CisgIHZvaWQgUGFyc2VPYmpDUHJvcGVydHlBdHRyaWJ1dGUoT2JqQ0RlY2xTcGVjICZEUyk7CisKKyAgRGVjbCAqUGFyc2VPYmpDTWV0aG9kRGVmaW5pdGlvbigpOworCitwdWJsaWM6CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDOTkgNi41OiBFeHByZXNzaW9ucy4KKworICAvLy8gVHlwZUNhc3RTdGF0ZSAtIFN0YXRlIHdoZXRoZXIgYW4gZXhwcmVzc2lvbiBpcyBvciBtYXkgYmUgYSB0eXBlIGNhc3QuCisgIGVudW0gVHlwZUNhc3RTdGF0ZSB7CisgICAgTm90VHlwZUNhc3QgPSAwLAorICAgIE1heWJlVHlwZUNhc3QsCisgICAgSXNUeXBlQ2FzdAorICB9OworCisgIEV4cHJSZXN1bHQgUGFyc2VFeHByZXNzaW9uKFR5cGVDYXN0U3RhdGUgaXNUeXBlQ2FzdCA9IE5vdFR5cGVDYXN0KTsKKyAgRXhwclJlc3VsdCBQYXJzZUNvbnN0YW50RXhwcmVzc2lvbkluRXhwckV2YWxDb250ZXh0KAorICAgICAgVHlwZUNhc3RTdGF0ZSBpc1R5cGVDYXN0ID0gTm90VHlwZUNhc3QpOworICBFeHByUmVzdWx0IFBhcnNlQ29uc3RhbnRFeHByZXNzaW9uKFR5cGVDYXN0U3RhdGUgaXNUeXBlQ2FzdCA9IE5vdFR5cGVDYXN0KTsKKyAgRXhwclJlc3VsdCBQYXJzZUNvbnN0cmFpbnRFeHByZXNzaW9uKCk7CisgIC8vIEV4cHIgdGhhdCBkb2Vzbid0IGluY2x1ZGUgY29tbWFzLgorICBFeHByUmVzdWx0IFBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oVHlwZUNhc3RTdGF0ZSBpc1R5cGVDYXN0ID0gTm90VHlwZUNhc3QpOworCisgIEV4cHJSZXN1bHQgUGFyc2VNU0FzbUlkZW50aWZpZXIobGx2bTo6U21hbGxWZWN0b3JJbXBsPFRva2VuPiAmTGluZVRva3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bUxpbmVUb2tzQ29uc3VtZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1VuZXZhbHVhdGVkKTsKKworcHJpdmF0ZToKKyAgRXhwclJlc3VsdCBQYXJzZUV4cHJlc3Npb25XaXRoTGVhZGluZ0F0KFNvdXJjZUxvY2F0aW9uIEF0TG9jKTsKKworICBFeHByUmVzdWx0IFBhcnNlRXhwcmVzc2lvbldpdGhMZWFkaW5nRXh0ZW5zaW9uKFNvdXJjZUxvY2F0aW9uIEV4dExvYyk7CisKKyAgRXhwclJlc3VsdCBQYXJzZVJIU09mQmluYXJ5RXhwcmVzc2lvbihFeHByUmVzdWx0IExIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjOjpMZXZlbCBNaW5QcmVjKTsKKyAgRXhwclJlc3VsdCBQYXJzZUNhc3RFeHByZXNzaW9uKGJvb2wgaXNVbmFyeUV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQWRkcmVzc09mT3BlcmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJk5vdENhc3RFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUNhc3RTdGF0ZSBpc1R5cGVDYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZlY3RvckxpdGVyYWwgPSBmYWxzZSk7CisgIEV4cHJSZXN1bHQgUGFyc2VDYXN0RXhwcmVzc2lvbihib29sIGlzVW5hcnlFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0FkZHJlc3NPZk9wZXJhbmQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVDYXN0U3RhdGUgaXNUeXBlQ2FzdCA9IE5vdFR5cGVDYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZlY3RvckxpdGVyYWwgPSBmYWxzZSk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbmV4dCB0b2tlbiBjYW5ub3Qgc3RhcnQgYW4gZXhwcmVzc2lvbi4KKyAgYm9vbCBpc05vdEV4cHJlc3Npb25TdGFydCgpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIG5leHQgdG9rZW4gd291bGQgc3RhcnQgYSBwb3N0Zml4LWV4cHJlc3Npb24KKyAgLy8vIHN1ZmZpeC4KKyAgYm9vbCBpc1Bvc3RmaXhFeHByZXNzaW9uU3VmZml4U3RhcnQoKSB7CisgICAgdG9rOjpUb2tlbktpbmQgSyA9IFRvay5nZXRLaW5kKCk7CisgICAgcmV0dXJuIChLID09IHRvazo6bF9zcXVhcmUgfHwgSyA9PSB0b2s6OmxfcGFyZW4gfHwKKyAgICAgICAgICAgIEsgPT0gdG9rOjpwZXJpb2QgfHwgSyA9PSB0b2s6OmFycm93IHx8CisgICAgICAgICAgICBLID09IHRvazo6cGx1c3BsdXMgfHwgSyA9PSB0b2s6Om1pbnVzbWludXMpOworICB9CisKKyAgYm9vbCBkaWFnbm9zZVVua25vd25UZW1wbGF0ZUlkKEV4cHJSZXN1bHQgVGVtcGxhdGVOYW1lLCBTb3VyY2VMb2NhdGlvbiBMZXNzKTsKKworICBFeHByUmVzdWx0IFBhcnNlUG9zdGZpeEV4cHJlc3Npb25TdWZmaXgoRXhwclJlc3VsdCBMSFMpOworICBFeHByUmVzdWx0IFBhcnNlVW5hcnlFeHByT3JUeXBlVHJhaXRFeHByZXNzaW9uKCk7CisgIEV4cHJSZXN1bHQgUGFyc2VCdWlsdGluUHJpbWFyeUV4cHJlc3Npb24oKTsKKworICBFeHByUmVzdWx0IFBhcnNlRXhwckFmdGVyVW5hcnlFeHByT3JUeXBlVHJhaXQoY29uc3QgVG9rZW4gJk9wVG9rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc0Nhc3RFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRUeXBlICZDYXN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlICZDYXN0UmFuZ2UpOworCisgIHR5cGVkZWYgU21hbGxWZWN0b3I8RXhwciosIDIwPiBFeHByTGlzdFR5OworICB0eXBlZGVmIFNtYWxsVmVjdG9yPFNvdXJjZUxvY2F0aW9uLCAyMD4gQ29tbWFMb2NzVHk7CisKKyAgLy8vIFBhcnNlRXhwcmVzc2lvbkxpc3QgLSBVc2VkIGZvciBDL0MrKyAoYXJndW1lbnQtKWV4cHJlc3Npb24tbGlzdC4KKyAgYm9vbCBQYXJzZUV4cHJlc3Npb25MaXN0KAorICAgICAgU21hbGxWZWN0b3JJbXBsPEV4cHIgKj4gJkV4cHJzLAorICAgICAgU21hbGxWZWN0b3JJbXBsPFNvdXJjZUxvY2F0aW9uPiAmQ29tbWFMb2NzLAorICAgICAgbGx2bTo6ZnVuY3Rpb25fcmVmPHZvaWQoKT4gQ29tcGxldGVyID0gbGx2bTo6ZnVuY3Rpb25fcmVmPHZvaWQoKT4oKSk7CisKKyAgLy8vIFBhcnNlU2ltcGxlRXhwcmVzc2lvbkxpc3QgLSBBIHNpbXBsZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucywKKyAgLy8vIHVzZWQgZm9yIG1pc2MgbGFuZ3VhZ2UgZXh0ZW5zaW9ucy4KKyAgYm9vbCBQYXJzZVNpbXBsZUV4cHJlc3Npb25MaXN0KFNtYWxsVmVjdG9ySW1wbDxFeHByKj4gJkV4cHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNvdXJjZUxvY2F0aW9uPiAmQ29tbWFMb2NzKTsKKworCisgIC8vLyBQYXJlblBhcnNlT3B0aW9uIC0gQ29udHJvbCB3aGF0IFBhcnNlUGFyZW5FeHByZXNzaW9uIHdpbGwgcGFyc2UuCisgIGVudW0gUGFyZW5QYXJzZU9wdGlvbiB7CisgICAgU2ltcGxlRXhwciwgICAgICAvLyBPbmx5IHBhcnNlICcoJyBleHByZXNzaW9uICcpJworICAgIENvbXBvdW5kU3RtdCwgICAgLy8gQWxzbyBhbGxvdyAnKCcgY29tcG91bmQtc3RhdGVtZW50ICcpJworICAgIENvbXBvdW5kTGl0ZXJhbCwgLy8gQWxzbyBhbGxvdyAnKCcgdHlwZS1uYW1lICcpJyAneycgLi4uICd9JworICAgIENhc3RFeHByICAgICAgICAgLy8gQWxzbyBhbGxvdyAnKCcgdHlwZS1uYW1lICcpJyA8YW55dGhpbmc+CisgIH07CisgIEV4cHJSZXN1bHQgUGFyc2VQYXJlbkV4cHJlc3Npb24oUGFyZW5QYXJzZU9wdGlvbiAmRXhwclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdG9wSWZDYXN0RXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVHlwZUNhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSAmQ2FzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICZSUGFyZW5Mb2MpOworCisgIEV4cHJSZXN1bHQgUGFyc2VDWFhBbWJpZ3VvdXNQYXJlbkV4cHJlc3Npb24oCisgICAgICBQYXJlblBhcnNlT3B0aW9uICZFeHByVHlwZSwgUGFyc2VkVHlwZSAmQ2FzdFR5LAorICAgICAgQmFsYW5jZWREZWxpbWl0ZXJUcmFja2VyICZUcmFja2VyLCBDb2xvblByb3RlY3Rpb25SQUlJT2JqZWN0ICZDb2xvblByb3QpOworICBFeHByUmVzdWx0IFBhcnNlQ29tcG91bmRMaXRlcmFsRXhwcmVzc2lvbihQYXJzZWRUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYyk7CisKKyAgRXhwclJlc3VsdCBQYXJzZVN0cmluZ0xpdGVyYWxFeHByZXNzaW9uKGJvb2wgQWxsb3dVc2VyRGVmaW5lZExpdGVyYWwgPSBmYWxzZSk7CisKKyAgRXhwclJlc3VsdCBQYXJzZUdlbmVyaWNTZWxlY3Rpb25FeHByZXNzaW9uKCk7CisgIAorICBFeHByUmVzdWx0IFBhcnNlT2JqQ0Jvb2xMaXRlcmFsKCk7CisKKyAgRXhwclJlc3VsdCBQYXJzZUZvbGRFeHByZXNzaW9uKEV4cHJSZXN1bHQgTEhTLCBCYWxhbmNlZERlbGltaXRlclRyYWNrZXIgJlQpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDKysgRXhwcmVzc2lvbnMKKyAgRXhwclJlc3VsdCB0cnlQYXJzZUNYWElkRXhwcmVzc2lvbihDWFhTY29wZVNwZWMgJlNTLCBib29sIGlzQWRkcmVzc09mT3BlcmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmUmVwbGFjZW1lbnQpOworICBFeHByUmVzdWx0IFBhcnNlQ1hYSWRFeHByZXNzaW9uKGJvb2wgaXNBZGRyZXNzT2ZPcGVyYW5kID0gZmFsc2UpOworCisgIGJvb2wgYXJlVG9rZW5zQWRqYWNlbnQoY29uc3QgVG9rZW4gJkEsIGNvbnN0IFRva2VuICZCKTsKKworICB2b2lkIENoZWNrRm9yVGVtcGxhdGVBbmREaWdyYXBoKFRva2VuICZOZXh0LCBQYXJzZWRUeXBlIE9iamVjdFR5cGVQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbnRlcmluZ0NvbnRleHQsIElkZW50aWZpZXJJbmZvICZJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhTY29wZVNwZWMgJlNTKTsKKworICBib29sIFBhcnNlT3B0aW9uYWxDWFhTY29wZVNwZWNpZmllcihDWFhTY29wZVNwZWMgJlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRUeXBlIE9iamVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRW50ZXJpbmdDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpNYXlCZVBzZXVkb0Rlc3RydWN0b3IgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzVHlwZW5hbWUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKipMYXN0SUkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9ubHlOYW1lc3BhY2UgPSBmYWxzZSk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEMrKzB4IDUuMS4yOiBMYW1iZGEgZXhwcmVzc2lvbnMKKworICAvLyBbLi4uXSAoKSAtPiB0eXBlIHsuLi59CisgIEV4cHJSZXN1bHQgUGFyc2VMYW1iZGFFeHByZXNzaW9uKCk7CisgIEV4cHJSZXN1bHQgVHJ5UGFyc2VMYW1iZGFFeHByZXNzaW9uKCk7CisgIE9wdGlvbmFsPHVuc2lnbmVkPiBQYXJzZUxhbWJkYUludHJvZHVjZXIoTGFtYmRhSW50cm9kdWNlciAmSW50cm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqU2tpcHBlZEluaXRzID0gbnVsbHB0cik7CisgIGJvb2wgVHJ5UGFyc2VMYW1iZGFJbnRyb2R1Y2VyKExhbWJkYUludHJvZHVjZXIgJkludHJvKTsKKyAgRXhwclJlc3VsdCBQYXJzZUxhbWJkYUV4cHJlc3Npb25BZnRlckludHJvZHVjZXIoCisgICAgICAgICAgICAgICBMYW1iZGFJbnRyb2R1Y2VyICZJbnRybyk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEMrKyA1LjJwMTogQysrIENhc3RzCisgIEV4cHJSZXN1bHQgUGFyc2VDWFhDYXN0cygpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDKysgNS4ycDE6IEMrKyBUeXBlIElkZW50aWZpY2F0aW9uCisgIEV4cHJSZXN1bHQgUGFyc2VDWFhUeXBlaWQoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gIEMrKyA6IE1pY3Jvc29mdCBfX3V1aWRvZiBFeHByZXNzaW9uCisgIEV4cHJSZXN1bHQgUGFyc2VDWFhVdWlkb2YoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQysrIDUuMi40OiBDKysgUHNldWRvLURlc3RydWN0b3IgRXhwcmVzc2lvbnMKKyAgRXhwclJlc3VsdCBQYXJzZUNYWFBzZXVkb0Rlc3RydWN0b3IoRXhwciAqQmFzZSwgU291cmNlTG9jYXRpb24gT3BMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6VG9rZW5LaW5kIE9wS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSBPYmplY3RUeXBlKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQysrIDkuMy4yOiBDKysgJ3RoaXMnIHBvaW50ZXIKKyAgRXhwclJlc3VsdCBQYXJzZUNYWFRoaXMoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQysrIDE1OiBDKysgVGhyb3cgRXhwcmVzc2lvbgorICBFeHByUmVzdWx0IFBhcnNlVGhyb3dFeHByZXNzaW9uKCk7CisKKyAgRXhjZXB0aW9uU3BlY2lmaWNhdGlvblR5cGUgdHJ5UGFyc2VFeGNlcHRpb25TcGVjaWZpY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICBib29sIERlbGF5ZWQsCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlICZTcGVjaWZpY2F0aW9uUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxQYXJzZWRUeXBlPiAmRHluYW1pY0V4Y2VwdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTb3VyY2VSYW5nZT4gJkR5bmFtaWNFeGNlcHRpb25SYW5nZXMsCisgICAgICAgICAgICAgICAgICAgIEV4cHJSZXN1bHQgJk5vZXhjZXB0RXhwciwKKyAgICAgICAgICAgICAgICAgICAgQ2FjaGVkVG9rZW5zIComRXhjZXB0aW9uU3BlY1Rva2Vucyk7CisKKyAgLy8gRW5kTG9jIGlzIGZpbGxlZCB3aXRoIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCB0b2tlbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4KKyAgRXhjZXB0aW9uU3BlY2lmaWNhdGlvblR5cGUgUGFyc2VEeW5hbWljRXhjZXB0aW9uU3BlY2lmaWNhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSAmU3BlY2lmaWNhdGlvblJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxQYXJzZWRUeXBlPiAmRXhjZXB0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U291cmNlUmFuZ2U+ICZSYW5nZXMpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDKysweCA4OiBGdW5jdGlvbiBkZWNsYXJhdGlvbiB0cmFpbGluZy1yZXR1cm4tdHlwZQorICBUeXBlUmVzdWx0IFBhcnNlVHJhaWxpbmdSZXR1cm5UeXBlKFNvdXJjZVJhbmdlICZSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE1heUJlRm9sbG93ZWRCeURpcmVjdEluaXQpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDKysgMi4xMy41OiBDKysgQm9vbGVhbiBMaXRlcmFscworICBFeHByUmVzdWx0IFBhcnNlQ1hYQm9vbExpdGVyYWwoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQysrIDUuMi4zOiBFeHBsaWNpdCB0eXBlIGNvbnZlcnNpb24gKGZ1bmN0aW9uYWwgbm90YXRpb24pCisgIEV4cHJSZXN1bHQgUGFyc2VDWFhUeXBlQ29uc3RydWN0RXhwcmVzc2lvbihjb25zdCBEZWNsU3BlYyAmRFMpOworCisgIC8vLyBQYXJzZUNYWFNpbXBsZVR5cGVTcGVjaWZpZXIgLSBbQysrIDcuMS41LjJdIFNpbXBsZSB0eXBlIHNwZWNpZmllcnMuCisgIC8vLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBjdXJyZW50IHRva2VuIGlzIGtub3duIHRvIGJlIHBhcnQgb2YKKyAgLy8vIHNpbXBsZS10eXBlLXNwZWNpZmllci4KKyAgdm9pZCBQYXJzZUNYWFNpbXBsZVR5cGVTcGVjaWZpZXIoRGVjbFNwZWMgJkRTKTsKKworICBib29sIFBhcnNlQ1hYVHlwZVNwZWNpZmllclNlcShEZWNsU3BlYyAmRFMpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDKysgNS4zLjQgYW5kIDUuMy41OiBDKysgbmV3IGFuZCBkZWxldGUKKyAgYm9vbCBQYXJzZUV4cHJlc3Npb25MaXN0T3JUeXBlSWQoU21hbGxWZWN0b3JJbXBsPEV4cHIqPiAmRXhwcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0b3IgJkQpOworICB2b2lkIFBhcnNlRGlyZWN0TmV3RGVjbGFyYXRvcihEZWNsYXJhdG9yICZEKTsKKyAgRXhwclJlc3VsdCBQYXJzZUNYWE5ld0V4cHJlc3Npb24oYm9vbCBVc2VHbG9iYWwsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0KTsKKyAgRXhwclJlc3VsdCBQYXJzZUNYWERlbGV0ZUV4cHJlc3Npb24oYm9vbCBVc2VHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0KTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQysrIGlmL3N3aXRjaC93aGlsZSBjb25kaXRpb24gZXhwcmVzc2lvbi4KKyAgU2VtYTo6Q29uZGl0aW9uUmVzdWx0IFBhcnNlQ1hYQ29uZGl0aW9uKFN0bXRSZXN1bHQgKkluaXRTdG10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYTo6Q29uZGl0aW9uS2luZCBDSyk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEMrKyBDb3JvdXRpbmVzCisKKyAgRXhwclJlc3VsdCBQYXJzZUNveWllbGRFeHByZXNzaW9uKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEM5OSA2LjcuODogSW5pdGlhbGl6YXRpb24uCisKKyAgLy8vIFBhcnNlSW5pdGlhbGl6ZXIKKyAgLy8vICAgICAgIGluaXRpYWxpemVyOiBbQzk5IDYuNy44XQorICAvLy8gICAgICAgICBhc3NpZ25tZW50LWV4cHJlc3Npb24KKyAgLy8vICAgICAgICAgJ3snIC4uLgorICBFeHByUmVzdWx0IFBhcnNlSW5pdGlhbGl6ZXIoKSB7CisgICAgaWYgKFRvay5pc05vdCh0b2s6OmxfYnJhY2UpKQorICAgICAgcmV0dXJuIFBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTsKKyAgICByZXR1cm4gUGFyc2VCcmFjZUluaXRpYWxpemVyKCk7CisgIH0KKyAgYm9vbCBNYXlCZURlc2lnbmF0aW9uU3RhcnQoKTsKKyAgRXhwclJlc3VsdCBQYXJzZUJyYWNlSW5pdGlhbGl6ZXIoKTsKKyAgRXhwclJlc3VsdCBQYXJzZUluaXRpYWxpemVyV2l0aFBvdGVudGlhbERlc2lnbmF0b3IoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gY2xhbmcgRXhwcmVzc2lvbnMKKworICBFeHByUmVzdWx0IFBhcnNlQmxvY2tMaXRlcmFsRXhwcmVzc2lvbigpOyAgLy8gXnsuLi59CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE9iamVjdGl2ZS1DIEV4cHJlc3Npb25zCisgIEV4cHJSZXN1bHQgUGFyc2VPYmpDQXRFeHByZXNzaW9uKFNvdXJjZUxvY2F0aW9uIEF0TG9jYXRpb24pOworICBFeHByUmVzdWx0IFBhcnNlT2JqQ1N0cmluZ0xpdGVyYWwoU291cmNlTG9jYXRpb24gQXRMb2MpOworICBFeHByUmVzdWx0IFBhcnNlT2JqQ0NoYXJhY3RlckxpdGVyYWwoU291cmNlTG9jYXRpb24gQXRMb2MpOworICBFeHByUmVzdWx0IFBhcnNlT2JqQ051bWVyaWNMaXRlcmFsKFNvdXJjZUxvY2F0aW9uIEF0TG9jKTsKKyAgRXhwclJlc3VsdCBQYXJzZU9iakNCb29sZWFuTGl0ZXJhbChTb3VyY2VMb2NhdGlvbiBBdExvYywgYm9vbCBBcmdWYWx1ZSk7CisgIEV4cHJSZXN1bHQgUGFyc2VPYmpDQXJyYXlMaXRlcmFsKFNvdXJjZUxvY2F0aW9uIEF0TG9jKTsKKyAgRXhwclJlc3VsdCBQYXJzZU9iakNEaWN0aW9uYXJ5TGl0ZXJhbChTb3VyY2VMb2NhdGlvbiBBdExvYyk7CisgIEV4cHJSZXN1bHQgUGFyc2VPYmpDQm94ZWRFeHByKFNvdXJjZUxvY2F0aW9uIEF0TG9jKTsKKyAgRXhwclJlc3VsdCBQYXJzZU9iakNFbmNvZGVFeHByZXNzaW9uKFNvdXJjZUxvY2F0aW9uIEF0TG9jKTsKKyAgRXhwclJlc3VsdCBQYXJzZU9iakNTZWxlY3RvckV4cHJlc3Npb24oU291cmNlTG9jYXRpb24gQXRMb2MpOworICBFeHByUmVzdWx0IFBhcnNlT2JqQ1Byb3RvY29sRXhwcmVzc2lvbihTb3VyY2VMb2NhdGlvbiBBdExvYyk7CisgIGJvb2wgaXNTaW1wbGVPYmpDTWVzc2FnZUV4cHJlc3Npb24oKTsKKyAgRXhwclJlc3VsdCBQYXJzZU9iakNNZXNzYWdlRXhwcmVzc2lvbigpOworICBFeHByUmVzdWx0IFBhcnNlT2JqQ01lc3NhZ2VFeHByZXNzaW9uQm9keShTb3VyY2VMb2NhdGlvbiBMQnJhY2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3VwZXJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgUmVjZWl2ZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpSZWNlaXZlckV4cHIpOworICBFeHByUmVzdWx0IFBhcnNlQXNzaWdubWVudEV4cHJXaXRoT2JqQ01lc3NhZ2VFeHByU3RhcnQoCisgICAgICBTb3VyY2VMb2NhdGlvbiBMQnJhY2xvYywgU291cmNlTG9jYXRpb24gU3VwZXJMb2MsCisgICAgICBQYXJzZWRUeXBlIFJlY2VpdmVyVHlwZSwgRXhwciAqUmVjZWl2ZXJFeHByKTsKKyAgYm9vbCBQYXJzZU9iakNYWE1lc3NhZ2VSZWNlaXZlcihib29sICZJc0V4cHIsIHZvaWQgKiZUeXBlT3JFeHByKTsKKyAgICAKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEM5OSA2Ljg6IFN0YXRlbWVudHMgYW5kIEJsb2Nrcy4KKworICAvLy8gQSBTbWFsbFZlY3RvciBvZiBzdGF0ZW1lbnRzLCB3aXRoIHN0YWNrIHNpemUgMzIgKGFzIHRoYXQgaXMgdGhlIG9ubHkgb25lCisgIC8vLyB1c2VkLikKKyAgdHlwZWRlZiBTbWFsbFZlY3RvcjxTdG10KiwgMzI+IFN0bXRWZWN0b3I7CisgIC8vLyBBIFNtYWxsVmVjdG9yIG9mIGV4cHJlc3Npb25zLCB3aXRoIHN0YWNrIHNpemUgMTIgKHRoZSBtYXhpbXVtIHVzZWQuKQorICB0eXBlZGVmIFNtYWxsVmVjdG9yPEV4cHIqLCAxMj4gRXhwclZlY3RvcjsKKyAgLy8vIEEgU21hbGxWZWN0b3Igb2YgdHlwZXMuCisgIHR5cGVkZWYgU21hbGxWZWN0b3I8UGFyc2VkVHlwZSwgMTI+IFR5cGVWZWN0b3I7CisKKyAgU3RtdFJlc3VsdCBQYXJzZVN0YXRlbWVudChTb3VyY2VMb2NhdGlvbiAqVHJhaWxpbmdFbHNlTG9jID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93T3Blbk1QU3RhbmRhbG9uZSA9IGZhbHNlKTsKKyAgZW51bSBBbGxvd2VkQ29uc3RydWN0c0tpbmQgeworICAgIC8vLyBcYnJpZWYgQWxsb3cgYW55IGRlY2xhcmF0aW9ucywgc3RhdGVtZW50cywgT3Blbk1QIGRpcmVjdGl2ZXMuCisgICAgQUNLX0FueSwKKyAgICAvLy8gXGJyaWVmIEFsbG93IG9ubHkgc3RhdGVtZW50cyBhbmQgbm9uLXN0YW5kYWxvbmUgT3Blbk1QIGRpcmVjdGl2ZXMuCisgICAgQUNLX1N0YXRlbWVudHNPcGVuTVBOb25TdGFuZGFsb25lLAorICAgIC8vLyBcYnJpZWYgQWxsb3cgc3RhdGVtZW50cyBhbmQgYWxsIGV4ZWN1dGFibGUgT3Blbk1QIGRpcmVjdGl2ZXMKKyAgICBBQ0tfU3RhdGVtZW50c09wZW5NUEFueUV4ZWN1dGFibGUKKyAgfTsKKyAgU3RtdFJlc3VsdAorICBQYXJzZVN0YXRlbWVudE9yRGVjbGFyYXRpb24oU3RtdFZlY3RvciAmU3RtdHMsIEFsbG93ZWRDb25zdHJ1Y3RzS2luZCBBbGxvd2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gKlRyYWlsaW5nRWxzZUxvYyA9IG51bGxwdHIpOworICBTdG10UmVzdWx0IFBhcnNlU3RhdGVtZW50T3JEZWNsYXJhdGlvbkFmdGVyQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdFZlY3RvciAmU3RtdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93ZWRDb25zdHJ1Y3RzS2luZCBBbGxvd2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqVHJhaWxpbmdFbHNlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzV2l0aFJhbmdlICZBdHRycyk7CisgIFN0bXRSZXN1bHQgUGFyc2VFeHByU3RhdGVtZW50KCk7CisgIFN0bXRSZXN1bHQgUGFyc2VMYWJlbGVkU3RhdGVtZW50KFBhcnNlZEF0dHJpYnV0ZXNXaXRoUmFuZ2UgJmF0dHJzKTsKKyAgU3RtdFJlc3VsdCBQYXJzZUNhc2VTdGF0ZW1lbnQoYm9vbCBNaXNzaW5nQ2FzZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByUmVzdWx0IEV4cHIgPSBFeHByUmVzdWx0KCkpOworICBTdG10UmVzdWx0IFBhcnNlRGVmYXVsdFN0YXRlbWVudCgpOworICBTdG10UmVzdWx0IFBhcnNlQ29tcG91bmRTdGF0ZW1lbnQoYm9vbCBpc1N0bXRFeHByID0gZmFsc2UpOworICBTdG10UmVzdWx0IFBhcnNlQ29tcG91bmRTdGF0ZW1lbnQoYm9vbCBpc1N0bXRFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2NvcGVGbGFncyk7CisgIHZvaWQgUGFyc2VDb21wb3VuZFN0YXRlbWVudExlYWRpbmdQcmFnbWFzKCk7CisgIFN0bXRSZXN1bHQgUGFyc2VDb21wb3VuZFN0YXRlbWVudEJvZHkoYm9vbCBpc1N0bXRFeHByID0gZmFsc2UpOworICBib29sIFBhcnNlUGFyZW5FeHByT3JDb25kaXRpb24oU3RtdFJlc3VsdCAqSW5pdFN0bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW1hOjpDb25kaXRpb25SZXN1bHQgJkNvbmRSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW1hOjpDb25kaXRpb25LaW5kIENLKTsKKyAgU3RtdFJlc3VsdCBQYXJzZUlmU3RhdGVtZW50KFNvdXJjZUxvY2F0aW9uICpUcmFpbGluZ0Vsc2VMb2MpOworICBTdG10UmVzdWx0IFBhcnNlU3dpdGNoU3RhdGVtZW50KFNvdXJjZUxvY2F0aW9uICpUcmFpbGluZ0Vsc2VMb2MpOworICBTdG10UmVzdWx0IFBhcnNlV2hpbGVTdGF0ZW1lbnQoU291cmNlTG9jYXRpb24gKlRyYWlsaW5nRWxzZUxvYyk7CisgIFN0bXRSZXN1bHQgUGFyc2VEb1N0YXRlbWVudCgpOworICBTdG10UmVzdWx0IFBhcnNlRm9yU3RhdGVtZW50KFNvdXJjZUxvY2F0aW9uICpUcmFpbGluZ0Vsc2VMb2MpOworICBTdG10UmVzdWx0IFBhcnNlR290b1N0YXRlbWVudCgpOworICBTdG10UmVzdWx0IFBhcnNlQ29udGludWVTdGF0ZW1lbnQoKTsKKyAgU3RtdFJlc3VsdCBQYXJzZUJyZWFrU3RhdGVtZW50KCk7CisgIFN0bXRSZXN1bHQgUGFyc2VSZXR1cm5TdGF0ZW1lbnQoKTsKKyAgU3RtdFJlc3VsdCBQYXJzZUFzbVN0YXRlbWVudChib29sICZtc0FzbSk7CisgIFN0bXRSZXN1bHQgUGFyc2VNaWNyb3NvZnRBc21TdGF0ZW1lbnQoU291cmNlTG9jYXRpb24gQXNtTG9jKTsKKyAgU3RtdFJlc3VsdCBQYXJzZVByYWdtYUxvb3BIaW50KFN0bXRWZWN0b3IgJlN0bXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3dlZENvbnN0cnVjdHNLaW5kIEFsbG93ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqVHJhaWxpbmdFbHNlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSAmQXR0cnMpOworCisgIC8vLyBcYnJpZWYgRGVzY3JpYmVzIHRoZSBiZWhhdmlvciB0aGF0IHNob3VsZCBiZSB0YWtlbiBmb3IgYW4gX19pZl9leGlzdHMKKyAgLy8vIGJsb2NrLgorICBlbnVtIElmRXhpc3RzQmVoYXZpb3IgeworICAgIC8vLyBcYnJpZWYgUGFyc2UgdGhlIGJsb2NrOyB0aGlzIGNvZGUgaXMgYWx3YXlzIHVzZWQuCisgICAgSUVCX1BhcnNlLAorICAgIC8vLyBcYnJpZWYgU2tpcCB0aGUgYmxvY2sgZW50aXJlbHk7IHRoaXMgY29kZSBpcyBuZXZlciB1c2VkLgorICAgIElFQl9Ta2lwLAorICAgIC8vLyBcYnJpZWYgUGFyc2UgdGhlIGJsb2NrIGFzIGEgZGVwZW5kZW50IGJsb2NrLCB3aGljaCBtYXkgYmUgdXNlZCBpbgorICAgIC8vLyBzb21lIHRlbXBsYXRlIGluc3RhbnRpYXRpb25zIGJ1dCBub3Qgb3RoZXJzLgorICAgIElFQl9EZXBlbmRlbnQKKyAgfTsKKworICAvLy8gXGJyaWVmIERlc2NyaWJlcyB0aGUgY29uZGl0aW9uIG9mIGEgTWljcm9zb2Z0IF9faWZfZXhpc3RzIG9yCisgIC8vLyBfX2lmX25vdF9leGlzdHMgYmxvY2suCisgIHN0cnVjdCBJZkV4aXN0c0NvbmRpdGlvbiB7CisgICAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIGluaXRpYWwga2V5d29yZC4KKyAgICBTb3VyY2VMb2NhdGlvbiBLZXl3b3JkTG9jOworICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGlzIGFuIF9faWZfZXhpc3RzIGJsb2NrIChyYXRoZXIgdGhhbiBhbgorICAgIC8vLyBfX2lmX25vdF9leGlzdHMgYmxvY2spLgorICAgIGJvb2wgSXNJZkV4aXN0czsKKworICAgIC8vLyBcYnJpZWYgTmVzdGVkLW5hbWUtc3BlY2lmaWVyIHByZWNlZGluZyB0aGUgbmFtZS4KKyAgICBDWFhTY29wZVNwZWMgU1M7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBuYW1lIHdlJ3JlIGxvb2tpbmcgZm9yLgorICAgIFVucXVhbGlmaWVkSWQgTmFtZTsKKworICAgIC8vLyBcYnJpZWYgVGhlIGJlaGF2aW9yIG9mIHRoaXMgX19pZl9leGlzdHMgb3IgX19pZl9ub3RfZXhpc3RzIGJsb2NrCisgICAgLy8vIHNob3VsZC4KKyAgICBJZkV4aXN0c0JlaGF2aW9yIEJlaGF2aW9yOworICB9OworCisgIGJvb2wgUGFyc2VNaWNyb3NvZnRJZkV4aXN0c0NvbmRpdGlvbihJZkV4aXN0c0NvbmRpdGlvbiYgUmVzdWx0KTsKKyAgdm9pZCBQYXJzZU1pY3Jvc29mdElmRXhpc3RzU3RhdGVtZW50KFN0bXRWZWN0b3IgJlN0bXRzKTsKKyAgdm9pZCBQYXJzZU1pY3Jvc29mdElmRXhpc3RzRXh0ZXJuYWxEZWNsYXJhdGlvbigpOworICB2b2lkIFBhcnNlTWljcm9zb2Z0SWZFeGlzdHNDbGFzc0RlY2xhcmF0aW9uKERlY2xTcGVjOjpUU1QgVGFnVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NTcGVjaWZpZXImIEN1ckFTKTsKKyAgYm9vbCBQYXJzZU1pY3Jvc29mdElmRXhpc3RzQnJhY2VJbml0aWFsaXplcihFeHByVmVjdG9yICZJbml0RXhwcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmSW5pdEV4cHJzT2spOworICBib29sIFBhcnNlQXNtT3BlcmFuZHNPcHQoU21hbGxWZWN0b3JJbXBsPElkZW50aWZpZXJJbmZvICo+ICZOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxFeHByICo+ICZDb25zdHJhaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxFeHByICo+ICZFeHBycyk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEMrKyA2OiBTdGF0ZW1lbnRzIGFuZCBCbG9ja3MKKworICBTdG10UmVzdWx0IFBhcnNlQ1hYVHJ5QmxvY2soKTsKKyAgU3RtdFJlc3VsdCBQYXJzZUNYWFRyeUJsb2NrQ29tbW9uKFNvdXJjZUxvY2F0aW9uIFRyeUxvYywgYm9vbCBGblRyeSA9IGZhbHNlKTsKKyAgU3RtdFJlc3VsdCBQYXJzZUNYWENhdGNoQmxvY2soYm9vbCBGbkNhdGNoID0gZmFsc2UpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBNUzogU0VIIFN0YXRlbWVudHMgYW5kIEJsb2NrcworCisgIFN0bXRSZXN1bHQgUGFyc2VTRUhUcnlCbG9jaygpOworICBTdG10UmVzdWx0IFBhcnNlU0VIRXhjZXB0QmxvY2soU291cmNlTG9jYXRpb24gTG9jKTsKKyAgU3RtdFJlc3VsdCBQYXJzZVNFSEZpbmFsbHlCbG9jayhTb3VyY2VMb2NhdGlvbiBMb2MpOworICBTdG10UmVzdWx0IFBhcnNlU0VITGVhdmVTdGF0ZW1lbnQoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gT2JqZWN0aXZlLUMgU3RhdGVtZW50cworCisgIFN0bXRSZXN1bHQgUGFyc2VPYmpDQXRTdGF0ZW1lbnQoU291cmNlTG9jYXRpb24gYXRMb2MpOworICBTdG10UmVzdWx0IFBhcnNlT2JqQ1RyeVN0bXQoU291cmNlTG9jYXRpb24gYXRMb2MpOworICBTdG10UmVzdWx0IFBhcnNlT2JqQ1Rocm93U3RtdChTb3VyY2VMb2NhdGlvbiBhdExvYyk7CisgIFN0bXRSZXN1bHQgUGFyc2VPYmpDU3luY2hyb25pemVkU3RtdChTb3VyY2VMb2NhdGlvbiBhdExvYyk7CisgIFN0bXRSZXN1bHQgUGFyc2VPYmpDQXV0b3JlbGVhc2VQb29sU3RtdChTb3VyY2VMb2NhdGlvbiBhdExvYyk7CisKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQzk5IDYuNzogRGVjbGFyYXRpb25zLgorCisgIC8vLyBBIGNvbnRleHQgZm9yIHBhcnNpbmcgZGVjbGFyYXRpb24gc3BlY2lmaWVycy4gIFRPRE86IGZsZXNoIHRoaXMKKyAgLy8vIG91dCwgdGhlcmUgYXJlIG90aGVyIHNpZ25pZmljYW50IHJlc3RyaWN0aW9ucyBvbiBzcGVjaWZpZXJzIHRoYW4KKyAgLy8vIHdvdWxkIGJlIGJlc3QgaW1wbGVtZW50ZWQgaW4gdGhlIHBhcnNlci4KKyAgZW51bSBjbGFzcyBEZWNsU3BlY0NvbnRleHQgeworICAgIERTQ19ub3JtYWwsIC8vIG5vcm1hbCBjb250ZXh0CisgICAgRFNDX2NsYXNzLCAgLy8gY2xhc3MgY29udGV4dCwgZW5hYmxlcyAnZnJpZW5kJworICAgIERTQ190eXBlX3NwZWNpZmllciwgLy8gQysrIHR5cGUtc3BlY2lmaWVyLXNlcSBvciBDIHNwZWNpZmllci1xdWFsaWZpZXItbGlzdAorICAgIERTQ190cmFpbGluZywgLy8gQysrMTEgdHJhaWxpbmctdHlwZS1zcGVjaWZpZXIgaW4gYSB0cmFpbGluZyByZXR1cm4gdHlwZQorICAgIERTQ19hbGlhc19kZWNsYXJhdGlvbiwgLy8gQysrMTEgdHlwZS1zcGVjaWZpZXItc2VxIGluIGFuIGFsaWFzLWRlY2xhcmF0aW9uCisgICAgRFNDX3RvcF9sZXZlbCwgLy8gdG9wLWxldmVsL25hbWVzcGFjZSBkZWNsYXJhdGlvbiBjb250ZXh0CisgICAgRFNDX3RlbXBsYXRlX3BhcmFtLCAvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgY29udGV4dAorICAgIERTQ190ZW1wbGF0ZV90eXBlX2FyZywgLy8gdGVtcGxhdGUgdHlwZSBhcmd1bWVudCBjb250ZXh0CisgICAgRFNDX29iamNfbWV0aG9kX3Jlc3VsdCwgLy8gT2JqQyBtZXRob2QgcmVzdWx0IGNvbnRleHQsIGVuYWJsZXMgJ2luc3RhbmNldHlwZScKKyAgICBEU0NfY29uZGl0aW9uIC8vIGNvbmRpdGlvbiBkZWNsYXJhdGlvbiBjb250ZXh0CisgIH07CisKKyAgLy8vIElzIHRoaXMgYSBjb250ZXh0IGluIHdoaWNoIHdlIGFyZSBwYXJzaW5nIGp1c3QgYSB0eXBlLXNwZWNpZmllciAob3IKKyAgLy8vIHRyYWlsaW5nLXR5cGUtc3BlY2lmaWVyKT8KKyAgc3RhdGljIGJvb2wgaXNUeXBlU3BlY2lmaWVyKERlY2xTcGVjQ29udGV4dCBEU0MpIHsKKyAgICBzd2l0Y2ggKERTQykgeworICAgIGNhc2UgRGVjbFNwZWNDb250ZXh0OjpEU0Nfbm9ybWFsOgorICAgIGNhc2UgRGVjbFNwZWNDb250ZXh0OjpEU0NfdGVtcGxhdGVfcGFyYW06CisgICAgY2FzZSBEZWNsU3BlY0NvbnRleHQ6OkRTQ19jbGFzczoKKyAgICBjYXNlIERlY2xTcGVjQ29udGV4dDo6RFNDX3RvcF9sZXZlbDoKKyAgICBjYXNlIERlY2xTcGVjQ29udGV4dDo6RFNDX29iamNfbWV0aG9kX3Jlc3VsdDoKKyAgICBjYXNlIERlY2xTcGVjQ29udGV4dDo6RFNDX2NvbmRpdGlvbjoKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNhc2UgRGVjbFNwZWNDb250ZXh0OjpEU0NfdGVtcGxhdGVfdHlwZV9hcmc6CisgICAgY2FzZSBEZWNsU3BlY0NvbnRleHQ6OkRTQ190eXBlX3NwZWNpZmllcjoKKyAgICBjYXNlIERlY2xTcGVjQ29udGV4dDo6RFNDX3RyYWlsaW5nOgorICAgIGNhc2UgRGVjbFNwZWNDb250ZXh0OjpEU0NfYWxpYXNfZGVjbGFyYXRpb246CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiTWlzc2luZyBEZWNsU3BlY0NvbnRleHQgY2FzZSIpOworICB9CisKKyAgLy8vIElzIHRoaXMgYSBjb250ZXh0IGluIHdoaWNoIHdlIGNhbiBwZXJmb3JtIGNsYXNzIHRlbXBsYXRlIGFyZ3VtZW50CisgIC8vLyBkZWR1Y3Rpb24/CisgIHN0YXRpYyBib29sIGlzQ2xhc3NUZW1wbGF0ZURlZHVjdGlvbkNvbnRleHQoRGVjbFNwZWNDb250ZXh0IERTQykgeworICAgIHN3aXRjaCAoRFNDKSB7CisgICAgY2FzZSBEZWNsU3BlY0NvbnRleHQ6OkRTQ19ub3JtYWw6CisgICAgY2FzZSBEZWNsU3BlY0NvbnRleHQ6OkRTQ190ZW1wbGF0ZV9wYXJhbToKKyAgICBjYXNlIERlY2xTcGVjQ29udGV4dDo6RFNDX2NsYXNzOgorICAgIGNhc2UgRGVjbFNwZWNDb250ZXh0OjpEU0NfdG9wX2xldmVsOgorICAgIGNhc2UgRGVjbFNwZWNDb250ZXh0OjpEU0NfY29uZGl0aW9uOgorICAgIGNhc2UgRGVjbFNwZWNDb250ZXh0OjpEU0NfdHlwZV9zcGVjaWZpZXI6CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgRGVjbFNwZWNDb250ZXh0OjpEU0Nfb2JqY19tZXRob2RfcmVzdWx0OgorICAgIGNhc2UgRGVjbFNwZWNDb250ZXh0OjpEU0NfdGVtcGxhdGVfdHlwZV9hcmc6CisgICAgY2FzZSBEZWNsU3BlY0NvbnRleHQ6OkRTQ190cmFpbGluZzoKKyAgICBjYXNlIERlY2xTcGVjQ29udGV4dDo6RFNDX2FsaWFzX2RlY2xhcmF0aW9uOgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJNaXNzaW5nIERlY2xTcGVjQ29udGV4dCBjYXNlIik7CisgIH0KKworICAvLy8gSW5mb3JtYXRpb24gb24gYSBDKysweCBmb3ItcmFuZ2UtaW5pdGlhbGl6ZXIgZm91bmQgd2hpbGUgcGFyc2luZyBhCisgIC8vLyBkZWNsYXJhdGlvbiB3aGljaCB0dXJucyBvdXQgdG8gYmUgYSBmb3ItcmFuZ2UtZGVjbGFyYXRpb24uCisgIHN0cnVjdCBGb3JSYW5nZUluaXQgeworICAgIFNvdXJjZUxvY2F0aW9uIENvbG9uTG9jOworICAgIEV4cHJSZXN1bHQgUmFuZ2VFeHByOworCisgICAgYm9vbCBQYXJzZWRGb3JSYW5nZURlY2woKSB7IHJldHVybiAhQ29sb25Mb2MuaXNJbnZhbGlkKCk7IH0KKyAgfTsKKworICBEZWNsR3JvdXBQdHJUeSBQYXJzZURlY2xhcmF0aW9uKERlY2xhcmF0b3JDb250ZXh0IENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gJkRlY2xFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSAmYXR0cnMpOworICBEZWNsR3JvdXBQdHJUeSBQYXJzZVNpbXBsZURlY2xhcmF0aW9uKERlY2xhcmF0b3JDb250ZXh0IENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gJkRlY2xFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSAmYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZXF1aXJlU2VtaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JSYW5nZUluaXQgKkZSSSA9IG51bGxwdHIpOworICBib29sIE1pZ2h0QmVEZWNsYXJhdG9yKERlY2xhcmF0b3JDb250ZXh0IENvbnRleHQpOworICBEZWNsR3JvdXBQdHJUeSBQYXJzZURlY2xHcm91cChQYXJzaW5nRGVjbFNwZWMgJkRTLCBEZWNsYXJhdG9yQ29udGV4dCBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqRGVjbEVuZCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvclJhbmdlSW5pdCAqRlJJID0gbnVsbHB0cik7CisgIERlY2wgKlBhcnNlRGVjbGFyYXRpb25BZnRlckRlY2xhcmF0b3IoRGVjbGFyYXRvciAmRCwKKyAgICAgICAgICAgICAgIGNvbnN0IFBhcnNlZFRlbXBsYXRlSW5mbyAmVGVtcGxhdGVJbmZvID0gUGFyc2VkVGVtcGxhdGVJbmZvKCkpOworICBib29sIFBhcnNlQXNtQXR0cmlidXRlc0FmdGVyRGVjbGFyYXRvcihEZWNsYXJhdG9yICZEKTsKKyAgRGVjbCAqUGFyc2VEZWNsYXJhdGlvbkFmdGVyRGVjbGFyYXRvckFuZEF0dHJpYnV0ZXMoCisgICAgICBEZWNsYXJhdG9yICZELAorICAgICAgY29uc3QgUGFyc2VkVGVtcGxhdGVJbmZvICZUZW1wbGF0ZUluZm8gPSBQYXJzZWRUZW1wbGF0ZUluZm8oKSwKKyAgICAgIEZvclJhbmdlSW5pdCAqRlJJID0gbnVsbHB0cik7CisgIERlY2wgKlBhcnNlRnVuY3Rpb25TdGF0ZW1lbnRCb2R5KERlY2wgKkRlY2wsIFBhcnNlU2NvcGUgJkJvZHlTY29wZSk7CisgIERlY2wgKlBhcnNlRnVuY3Rpb25UcnlCbG9jayhEZWNsICpEZWNsLCBQYXJzZVNjb3BlICZCb2R5U2NvcGUpOworCisgIC8vLyBcYnJpZWYgV2hlbiBpbiBjb2RlLWNvbXBsZXRpb24sIHNraXAgcGFyc2luZyBvZiB0aGUgZnVuY3Rpb24vbWV0aG9kIGJvZHkKKyAgLy8vIHVubGVzcyB0aGUgYm9keSBjb250YWlucyB0aGUgY29kZS1jb21wbGV0aW9uIHBvaW50LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGJvZHkgd2FzIHNraXBwZWQuCisgIGJvb2wgdHJ5U2tpcHBpbmdGdW5jdGlvbkJvZHkoKTsKKworICBib29sIFBhcnNlSW1wbGljaXRJbnQoRGVjbFNwZWMgJkRTLCBDWFhTY29wZVNwZWMgKlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyc2VkVGVtcGxhdGVJbmZvICZUZW1wbGF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NTcGVjaWZpZXIgQVMsIERlY2xTcGVjQ29udGV4dCBEU0MsIAorICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSAmQXR0cnMpOworICBEZWNsU3BlY0NvbnRleHQKKyAgZ2V0RGVjbFNwZWNDb250ZXh0RnJvbURlY2xhcmF0b3JDb250ZXh0KERlY2xhcmF0b3JDb250ZXh0IENvbnRleHQpOworICB2b2lkIFBhcnNlRGVjbGFyYXRpb25TcGVjaWZpZXJzKAorICAgICAgRGVjbFNwZWMgJkRTLAorICAgICAgY29uc3QgUGFyc2VkVGVtcGxhdGVJbmZvICZUZW1wbGF0ZUluZm8gPSBQYXJzZWRUZW1wbGF0ZUluZm8oKSwKKyAgICAgIEFjY2Vzc1NwZWNpZmllciBBUyA9IEFTX25vbmUsCisgICAgICBEZWNsU3BlY0NvbnRleHQgRFNDID0gRGVjbFNwZWNDb250ZXh0OjpEU0Nfbm9ybWFsLAorICAgICAgTGF0ZVBhcnNlZEF0dHJMaXN0ICpMYXRlQXR0cnMgPSBudWxscHRyKTsKKyAgYm9vbCBEaWFnbm9zZU1pc3NpbmdTZW1pQWZ0ZXJUYWdEZWZpbml0aW9uKAorICAgICAgRGVjbFNwZWMgJkRTLCBBY2Nlc3NTcGVjaWZpZXIgQVMsIERlY2xTcGVjQ29udGV4dCBEU0NvbnRleHQsCisgICAgICBMYXRlUGFyc2VkQXR0ckxpc3QgKkxhdGVBdHRycyA9IG51bGxwdHIpOworCisgIHZvaWQgUGFyc2VTcGVjaWZpZXJRdWFsaWZpZXJMaXN0KAorICAgICAgRGVjbFNwZWMgJkRTLCBBY2Nlc3NTcGVjaWZpZXIgQVMgPSBBU19ub25lLAorICAgICAgRGVjbFNwZWNDb250ZXh0IERTQyA9IERlY2xTcGVjQ29udGV4dDo6RFNDX25vcm1hbCk7CisKKyAgdm9pZCBQYXJzZU9iakNUeXBlUXVhbGlmaWVyTGlzdChPYmpDRGVjbFNwZWMgJkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0b3JDb250ZXh0IENvbnRleHQpOworCisgIHZvaWQgUGFyc2VFbnVtU3BlY2lmaWVyKFNvdXJjZUxvY2F0aW9uIFRhZ0xvYywgRGVjbFNwZWMgJkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJzZWRUZW1wbGF0ZUluZm8gJlRlbXBsYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzU3BlY2lmaWVyIEFTLCBEZWNsU3BlY0NvbnRleHQgRFNDKTsKKyAgdm9pZCBQYXJzZUVudW1Cb2R5KFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBEZWNsICpUYWdEZWNsKTsKKyAgdm9pZCBQYXJzZVN0cnVjdFVuaW9uQm9keShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgdW5zaWduZWQgVGFnVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsICpUYWdEZWNsKTsKKworICB2b2lkIFBhcnNlU3RydWN0RGVjbGFyYXRpb24oCisgICAgICBQYXJzaW5nRGVjbFNwZWMgJkRTLAorICAgICAgbGx2bTo6ZnVuY3Rpb25fcmVmPHZvaWQoUGFyc2luZ0ZpZWxkRGVjbGFyYXRvciAmKT4gRmllbGRzQ2FsbGJhY2spOworCisgIGJvb2wgaXNEZWNsYXJhdGlvblNwZWNpZmllcihib29sIERpc2FtYmlndWF0aW5nV2l0aEV4cHJlc3Npb24gPSBmYWxzZSk7CisgIGJvb2wgaXNUeXBlU3BlY2lmaWVyUXVhbGlmaWVyKCk7CisKKyAgLy8vIGlzS25vd25Ub0JlVHlwZVNwZWNpZmllciAtIFJldHVybiB0cnVlIGlmIHdlIGtub3cgdGhhdCB0aGUgc3BlY2lmaWVkIHRva2VuCisgIC8vLyBpcyBkZWZpbml0ZWx5IGEgdHlwZS1zcGVjaWZpZXIuICBSZXR1cm4gZmFsc2UgaWYgaXQgaXNuJ3QgcGFydCBvZiBhIHR5cGUKKyAgLy8vIHNwZWNpZmllciBvciBpZiB3ZSdyZSBub3Qgc3VyZS4KKyAgYm9vbCBpc0tub3duVG9CZVR5cGVTcGVjaWZpZXIoY29uc3QgVG9rZW4gJlRvaykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB3ZSBrbm93IHRoYXQgd2UgYXJlIGRlZmluaXRlbHkgbG9va2luZyBhdCBhCisgIC8vLyBkZWNsLXNwZWNpZmllciwgYW5kIGlzbid0IHBhcnQgb2YgYW4gZXhwcmVzc2lvbiBzdWNoIGFzIGEgZnVuY3Rpb24tc3R5bGUKKyAgLy8vIGNhc3QuIFJldHVybiBmYWxzZSBpZiBpdCdzIG5vIGEgZGVjbC1zcGVjaWZpZXIsIG9yIHdlJ3JlIG5vdCBzdXJlLgorICBib29sIGlzS25vd25Ub0JlRGVjbGFyYXRpb25TcGVjaWZpZXIoKSB7CisgICAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzKQorICAgICAgcmV0dXJuIGlzQ1hYRGVjbGFyYXRpb25TcGVjaWZpZXIoKSA9PSBUUFJlc3VsdDo6VHJ1ZTsKKyAgICByZXR1cm4gaXNEZWNsYXJhdGlvblNwZWNpZmllcih0cnVlKTsKKyAgfQorCisgIC8vLyBpc0RlY2xhcmF0aW9uU3RhdGVtZW50IC0gRGlzYW1iaWd1YXRlcyBiZXR3ZWVuIGEgZGVjbGFyYXRpb24gb3IgYW4KKyAgLy8vIGV4cHJlc3Npb24gc3RhdGVtZW50LCB3aGVuIHBhcnNpbmcgZnVuY3Rpb24gYm9kaWVzLgorICAvLy8gUmV0dXJucyB0cnVlIGZvciBkZWNsYXJhdGlvbiwgZmFsc2UgZm9yIGV4cHJlc3Npb24uCisgIGJvb2wgaXNEZWNsYXJhdGlvblN0YXRlbWVudCgpIHsKKyAgICBpZiAoZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMpCisgICAgICByZXR1cm4gaXNDWFhEZWNsYXJhdGlvblN0YXRlbWVudCgpOworICAgIHJldHVybiBpc0RlY2xhcmF0aW9uU3BlY2lmaWVyKHRydWUpOworICB9CisKKyAgLy8vIGlzRm9ySW5pdERlY2xhcmF0aW9uIC0gRGlzYW1iaWd1YXRlcyBiZXR3ZWVuIGEgZGVjbGFyYXRpb24gb3IgYW4KKyAgLy8vIGV4cHJlc3Npb24gaW4gdGhlIGNvbnRleHQgb2YgdGhlIEMgJ2NsYXVzZS0xJyBvciB0aGUgQysrCisgIC8vICdmb3ItaW5pdC1zdGF0ZW1lbnQnIHBhcnQgb2YgYSAnZm9yJyBzdGF0ZW1lbnQuCisgIC8vLyBSZXR1cm5zIHRydWUgZm9yIGRlY2xhcmF0aW9uLCBmYWxzZSBmb3IgZXhwcmVzc2lvbi4KKyAgYm9vbCBpc0ZvckluaXREZWNsYXJhdGlvbigpIHsKKyAgICBpZiAoZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMpCisgICAgICByZXR1cm4gaXNDWFhTaW1wbGVEZWNsYXJhdGlvbigvKkFsbG93Rm9yUmFuZ2VEZWNsPSovdHJ1ZSk7CisgICAgcmV0dXJuIGlzRGVjbGFyYXRpb25TcGVjaWZpZXIodHJ1ZSk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSBDKysxeiBmb3ItcmFuZ2UtaWRlbnRpZmllci4KKyAgYm9vbCBpc0ZvclJhbmdlSWRlbnRpZmllcigpOworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBhdCB0aGUgc3RhcnQgb2YgYW4gT2JqZWN0aXZlLUMKKyAgLy8vIGNsYXNzIG1lc3NhZ2UgdGhhdCBhcHBlYXJzIHRvIGJlIG1pc3NpbmcgdGhlIG9wZW4gYnJhY2tldCAnWycuCisgIGJvb2wgaXNTdGFydE9mT2JqQ0NsYXNzTWVzc2FnZU1pc3NpbmdPcGVuQnJhY2tldCgpOworCisgIC8vLyBcYnJpZWYgU3RhcnRpbmcgd2l0aCBhIHNjb3BlIHNwZWNpZmllciwgaWRlbnRpZmllciwgb3IKKyAgLy8vIHRlbXBsYXRlLWlkIHRoYXQgcmVmZXJzIHRvIHRoZSBjdXJyZW50IGNsYXNzLCBkZXRlcm1pbmUgd2hldGhlcgorICAvLy8gdGhpcyBpcyBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0b3IuCisgIGJvb2wgaXNDb25zdHJ1Y3RvckRlY2xhcmF0b3IoYm9vbCBVbnF1YWxpZmllZCwgYm9vbCBEZWR1Y3Rpb25HdWlkZSA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIFNwZWNpZmllcyB0aGUgY29udGV4dCBpbiB3aGljaCB0eXBlLWlkL2V4cHJlc3Npb24KKyAgLy8vIGRpc2FtYmlndWF0aW9uIHdpbGwgb2NjdXIuCisgIGVudW0gVGVudGF0aXZlQ1hYVHlwZUlkQ29udGV4dCB7CisgICAgVHlwZUlkSW5QYXJlbnMsCisgICAgVHlwZUlkVW5hbWJpZ3VvdXMsCisgICAgVHlwZUlkQXNUZW1wbGF0ZUFyZ3VtZW50CisgIH07CisKKworICAvLy8gaXNUeXBlSWRJblBhcmVucyAtIEFzc3VtZXMgdGhhdCBhICcoJyB3YXMgcGFyc2VkIGFuZCBub3cgd2Ugd2FudCB0byBrbm93CisgIC8vLyB3aGV0aGVyIHRoZSBwYXJlbnMgY29udGFpbiBhbiBleHByZXNzaW9uIG9yIGEgdHlwZS1pZC4KKyAgLy8vIFJldHVybnMgdHJ1ZSBmb3IgYSB0eXBlLWlkIGFuZCBmYWxzZSBmb3IgYW4gZXhwcmVzc2lvbi4KKyAgYm9vbCBpc1R5cGVJZEluUGFyZW5zKGJvb2wgJmlzQW1iaWd1b3VzKSB7CisgICAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzKQorICAgICAgcmV0dXJuIGlzQ1hYVHlwZUlkKFR5cGVJZEluUGFyZW5zLCBpc0FtYmlndW91cyk7CisgICAgaXNBbWJpZ3VvdXMgPSBmYWxzZTsKKyAgICByZXR1cm4gaXNUeXBlU3BlY2lmaWVyUXVhbGlmaWVyKCk7CisgIH0KKyAgYm9vbCBpc1R5cGVJZEluUGFyZW5zKCkgeworICAgIGJvb2wgaXNBbWJpZ3VvdXM7CisgICAgcmV0dXJuIGlzVHlwZUlkSW5QYXJlbnMoaXNBbWJpZ3VvdXMpOworICB9CisKKyAgLy8vIFxicmllZiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgdG9rZW5zIGZvcm0gdHlwZS1pZCBvciBleHByZXNzaW9uLgorICAvLy8gSXQgaXMgc2ltaWxhciB0byBpc1R5cGVJZEluUGFyZW5zIGJ1dCBkb2VzIG5vdCBzdXBwb3NlIHRoYXQgdHlwZS1pZAorICAvLy8gaXMgaW4gcGFyZW50aGVzaXMuCisgIGJvb2wgaXNUeXBlSWRVbmFtYmlndW91c2x5KCkgeworICAgIGJvb2wgSXNBbWJpZ3VvdXM7CisgICAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzKQorICAgICAgcmV0dXJuIGlzQ1hYVHlwZUlkKFR5cGVJZFVuYW1iaWd1b3VzLCBJc0FtYmlndW91cyk7CisgICAgcmV0dXJuIGlzVHlwZVNwZWNpZmllclF1YWxpZmllcigpOworICB9CisKKyAgLy8vIGlzQ1hYRGVjbGFyYXRpb25TdGF0ZW1lbnQgLSBDKystc3BlY2lhbGl6ZWQgZnVuY3Rpb24gdGhhdCBkaXNhbWJpZ3VhdGVzCisgIC8vLyBiZXR3ZWVuIGEgZGVjbGFyYXRpb24gb3IgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQsIHdoZW4gcGFyc2luZyBmdW5jdGlvbgorICAvLy8gYm9kaWVzLiBSZXR1cm5zIHRydWUgZm9yIGRlY2xhcmF0aW9uLCBmYWxzZSBmb3IgZXhwcmVzc2lvbi4KKyAgYm9vbCBpc0NYWERlY2xhcmF0aW9uU3RhdGVtZW50KCk7CisKKyAgLy8vIGlzQ1hYU2ltcGxlRGVjbGFyYXRpb24gLSBDKystc3BlY2lhbGl6ZWQgZnVuY3Rpb24gdGhhdCBkaXNhbWJpZ3VhdGVzCisgIC8vLyBiZXR3ZWVuIGEgc2ltcGxlLWRlY2xhcmF0aW9uIG9yIGFuIGV4cHJlc3Npb24tc3RhdGVtZW50LgorICAvLy8gSWYgZHVyaW5nIHRoZSBkaXNhbWJpZ3VhdGlvbiBwcm9jZXNzIGEgcGFyc2luZyBlcnJvciBpcyBlbmNvdW50ZXJlZCwKKyAgLy8vIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgdG8gbGV0IHRoZSBkZWNsYXJhdGlvbiBwYXJzaW5nIGNvZGUgaGFuZGxlIGl0LgorICAvLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUgc3RhdGVtZW50IGlzIGRpc2FtYmlndWF0ZWQgYXMgZXhwcmVzc2lvbi4KKyAgYm9vbCBpc0NYWFNpbXBsZURlY2xhcmF0aW9uKGJvb2wgQWxsb3dGb3JSYW5nZURlY2wpOworCisgIC8vLyBpc0NYWEZ1bmN0aW9uRGVjbGFyYXRvciAtIERpc2FtYmlndWF0ZXMgYmV0d2VlbiBhIGZ1bmN0aW9uIGRlY2xhcmF0b3Igb3IKKyAgLy8vIGEgY29uc3RydWN0b3Itc3R5bGUgaW5pdGlhbGl6ZXIsIHdoZW4gcGFyc2luZyBkZWNsYXJhdGlvbiBzdGF0ZW1lbnRzLgorICAvLy8gUmV0dXJucyB0cnVlIGZvciBmdW5jdGlvbiBkZWNsYXJhdG9yIGFuZCBmYWxzZSBmb3IgY29uc3RydWN0b3Itc3R5bGUKKyAgLy8vIGluaXRpYWxpemVyLiBTZXRzICdJc0FtYmlndW91cycgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgZGVjbGFyYXRpb24gCisgIC8vLyBtaWdodCBiZSBhIGNvbnN0cnVjdG9yLXN0eWxlIGluaXRpYWxpemVyLgorICAvLy8gSWYgZHVyaW5nIHRoZSBkaXNhbWJpZ3VhdGlvbiBwcm9jZXNzIGEgcGFyc2luZyBlcnJvciBpcyBlbmNvdW50ZXJlZCwKKyAgLy8vIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgdG8gbGV0IHRoZSBkZWNsYXJhdGlvbiBwYXJzaW5nIGNvZGUgaGFuZGxlIGl0LgorICBib29sIGlzQ1hYRnVuY3Rpb25EZWNsYXJhdG9yKGJvb2wgKklzQW1iaWd1b3VzID0gbnVsbHB0cik7CisKKyAgc3RydWN0IENvbmRpdGlvbkRlY2xhcmF0aW9uT3JJbml0U3RhdGVtZW50U3RhdGU7CisgIGVudW0gY2xhc3MgQ29uZGl0aW9uT3JJbml0U3RhdGVtZW50IHsKKyAgICBFeHByZXNzaW9uLCAgICAvLy88IERpc2FtYmlndWF0ZWQgYXMgYW4gZXhwcmVzc2lvbiAoZWl0aGVyIGtpbmQpLgorICAgIENvbmRpdGlvbkRlY2wsIC8vLzwgRGlzYW1iaWd1YXRlZCBhcyB0aGUgZGVjbGFyYXRpb24gZm9ybSBvZiBjb25kaXRpb24uCisgICAgSW5pdFN0bXREZWNsLCAgLy8vPCBEaXNhbWJpZ3VhdGVkIGFzIGEgc2ltcGxlLWRlY2xhcmF0aW9uIGluaXQtc3RhdGVtZW50LgorICAgIEVycm9yICAgICAgICAgIC8vLzwgQ2FuJ3QgYmUgYW55IG9mIHRoZSBhYm92ZSEKKyAgfTsKKyAgLy8vIFxicmllZiBEaXNhbWJpZ3VhdGVzIGJldHdlZW4gdGhlIGRpZmZlcmVudCBraW5kcyBvZiB0aGluZ3MgdGhhdCBjYW4gaGFwcGVuCisgIC8vLyBhZnRlciAnaWYgKCcgb3IgJ3N3aXRjaCAoJy4gVGhpcyBjb3VsZCBiZSBvbmUgb2YgdHdvIGRpZmZlcmVudCBraW5kcyBvZgorICAvLy8gZGVjbGFyYXRpb24gKGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZXJlIGlzIGEgJzsnIGxhdGVyKSBvciBhbiBleHByZXNzaW9uLgorICBDb25kaXRpb25PckluaXRTdGF0ZW1lbnQKKyAgaXNDWFhDb25kaXRpb25EZWNsYXJhdGlvbk9ySW5pdFN0YXRlbWVudChib29sIENhbkJlSW5pdFN0bXQpOworCisgIGJvb2wgaXNDWFhUeXBlSWQoVGVudGF0aXZlQ1hYVHlwZUlkQ29udGV4dCBDb250ZXh0LCBib29sICZpc0FtYmlndW91cyk7CisgIGJvb2wgaXNDWFhUeXBlSWQoVGVudGF0aXZlQ1hYVHlwZUlkQ29udGV4dCBDb250ZXh0KSB7CisgICAgYm9vbCBpc0FtYmlndW91czsKKyAgICByZXR1cm4gaXNDWFhUeXBlSWQoQ29udGV4dCwgaXNBbWJpZ3VvdXMpOworICB9CisKKyAgLy8vIFRQUmVzdWx0IC0gVXNlZCBhcyB0aGUgcmVzdWx0IHZhbHVlIGZvciBmdW5jdGlvbnMgd2hvc2UgcHVycG9zZSBpcyB0bworICAvLy8gZGlzYW1iaWd1YXRlIEMrKyBjb25zdHJ1Y3RzIGJ5ICJ0ZW50YXRpdmVseSBwYXJzaW5nIiB0aGVtLgorICBlbnVtIGNsYXNzIFRQUmVzdWx0IHsKKyAgICBUcnVlLCBGYWxzZSwgQW1iaWd1b3VzLCBFcnJvcgorICB9OworCisgIC8vLyBcYnJpZWYgQmFzZWQgb25seSBvbiB0aGUgZ2l2ZW4gdG9rZW4ga2luZCwgZGV0ZXJtaW5lIHdoZXRoZXIgd2Uga25vdyB0aGF0CisgIC8vLyB3ZSdyZSBhdCB0aGUgc3RhcnQgb2YgYW4gZXhwcmVzc2lvbiBvciBhIHR5cGUtc3BlY2lmaWVyLXNlcSAod2hpY2ggbWF5CisgIC8vLyBiZSBhbiBleHByZXNzaW9uLCBpbiBDKyspLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBkb2VzIG5vdCBhdHRlbXB0IHRvIHJlc29sdmUgYW55IG9mIHRoZSB0cmljayBjYXNlcywgZS5nLiwKKyAgLy8vIHRob3NlIGludm9sdmluZyBsb29rdXAgb2YgaWRlbnRpZmllcnMuCisgIC8vLworICAvLy8gXHJldHVybnMgXGMgVFBSX3RydWUgaWYgdGhpcyB0b2tlbiBzdGFydHMgYW4gZXhwcmVzc2lvbiwgXGMgVFBSX2ZhbHNlIGlmCisgIC8vLyB0aGlzIHRva2VuIHN0YXJ0cyBhIHR5cGUtc3BlY2lmaWVyLXNlcSwgb3IgXGMgVFBSX2FtYmlndW91cyBpZiBpdCBjYW5ub3QKKyAgLy8vIHRlbGwuCisgIFRQUmVzdWx0IGlzRXhwcmVzc2lvbk9yVHlwZVNwZWNpZmllclNpbXBsZSh0b2s6OlRva2VuS2luZCBLaW5kKTsKKworICAvLy8gaXNDWFhEZWNsYXJhdGlvblNwZWNpZmllciAtIFJldHVybnMgVFBSZXN1bHQ6OlRydWUgaWYgaXQgaXMgYQorICAvLy8gZGVjbGFyYXRpb24gc3BlY2lmaWVyLCBUUFJlc3VsdDo6RmFsc2UgaWYgaXQgaXMgbm90LAorICAvLy8gVFBSZXN1bHQ6OkFtYmlndW91cyBpZiBpdCBjb3VsZCBiZSBlaXRoZXIgYSBkZWNsLXNwZWNpZmllciBvciBhCisgIC8vLyBmdW5jdGlvbi1zdHlsZSBjYXN0LCBhbmQgVFBSZXN1bHQ6OkVycm9yIGlmIGEgcGFyc2luZyBlcnJvciB3YXMKKyAgLy8vIGVuY291bnRlcmVkLiBJZiBpdCBjb3VsZCBiZSBhIGJyYWNlZCBDKysxMSBmdW5jdGlvbi1zdHlsZSBjYXN0LCByZXR1cm5zCisgIC8vLyBCcmFjZWRDYXN0UmVzdWx0LgorICAvLy8gRG9lc24ndCBjb25zdW1lIHRva2Vucy4KKyAgVFBSZXN1bHQKKyAgaXNDWFhEZWNsYXJhdGlvblNwZWNpZmllcihUUFJlc3VsdCBCcmFjZWRDYXN0UmVzdWx0ID0gVFBSZXN1bHQ6OkZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKkhhc01pc3NpbmdUeXBlbmFtZSA9IG51bGxwdHIpOworCisgIC8vLyBHaXZlbiB0aGF0IGlzQ1hYRGVjbGFyYXRpb25TcGVjaWZpZXIgcmV0dXJucyBcYyBUUFJlc3VsdDo6VHJ1ZSBvcgorICAvLy8gXGMgVFBSZXN1bHQ6OkFtYmlndW91cywgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlY2wtc3BlY2lmaWVyIHdvdWxkIGJlCisgIC8vLyBhIHR5cGUtc3BlY2lmaWVyIG90aGVyIHRoYW4gYSBjdi1xdWFsaWZpZXIuCisgIGJvb2wgaXNDWFhEZWNsYXJhdGlvblNwZWNpZmllckFUeXBlKCk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciBhbiBpZGVudGlmaWVyIGhhcyBiZWVuIHRlbnRhdGl2ZWx5IGRlY2xhcmVkIGFzIGEKKyAgLy8vIG5vbi10eXBlLiBTdWNoIHRlbnRhdGl2ZSBkZWNsYXJhdGlvbnMgc2hvdWxkIG5vdCBiZSBmb3VuZCB0byBuYW1lIGEgdHlwZQorICAvLy8gZHVyaW5nIGEgdGVudGF0aXZlIHBhcnNlLCBidXQgYWxzbyBzaG91bGQgbm90IGJlIGFubm90YXRlZCBhcyBhIG5vbi10eXBlLgorICBib29sIGlzVGVudGF0aXZlbHlEZWNsYXJlZChJZGVudGlmaWVySW5mbyAqSUkpOworCisgIC8vICJUZW50YXRpdmUgcGFyc2luZyIgZnVuY3Rpb25zLCB1c2VkIGZvciBkaXNhbWJpZ3VhdGlvbi4gSWYgYSBwYXJzaW5nIGVycm9yCisgIC8vIGlzIGVuY291bnRlcmVkIHRoZXkgd2lsbCByZXR1cm4gVFBSZXN1bHQ6OkVycm9yLgorICAvLyBSZXR1cm5pbmcgVFBSZXN1bHQ6OlRydWUvRmFsc2UgaW5kaWNhdGVzIHRoYXQgdGhlIGFtYmlndWl0eSB3YXMKKyAgLy8gcmVzb2x2ZWQgYW5kIHRlbnRhdGl2ZSBwYXJzaW5nIG1heSBzdG9wLiBUUFJlc3VsdDo6QW1iaWd1b3VzIGluZGljYXRlcworICAvLyB0aGF0IG1vcmUgdGVudGF0aXZlIHBhcnNpbmcgaXMgbmVjZXNzYXJ5IGZvciBkaXNhbWJpZ3VhdGlvbi4KKyAgLy8gVGhleSBhbGwgY29uc3VtZSB0b2tlbnMsIHNvIGJhY2t0cmFja2luZyBzaG91bGQgYmUgdXNlZCBhZnRlciBjYWxsaW5nIHRoZW0uCisKKyAgVFBSZXN1bHQgVHJ5UGFyc2VTaW1wbGVEZWNsYXJhdGlvbihib29sIEFsbG93Rm9yUmFuZ2VEZWNsKTsKKyAgVFBSZXN1bHQgVHJ5UGFyc2VUeXBlb2ZTcGVjaWZpZXIoKTsKKyAgVFBSZXN1bHQgVHJ5UGFyc2VQcm90b2NvbFF1YWxpZmllcnMoKTsKKyAgVFBSZXN1bHQgVHJ5UGFyc2VQdHJPcGVyYXRvclNlcSgpOworICBUUFJlc3VsdCBUcnlQYXJzZU9wZXJhdG9ySWQoKTsKKyAgVFBSZXN1bHQgVHJ5UGFyc2VJbml0RGVjbGFyYXRvckxpc3QoKTsKKyAgVFBSZXN1bHQgVHJ5UGFyc2VEZWNsYXJhdG9yKGJvb2wgbWF5QmVBYnN0cmFjdCwgYm9vbCBtYXlIYXZlSWRlbnRpZmllciA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1heUhhdmVEaXJlY3RJbml0ID0gZmFsc2UpOworICBUUFJlc3VsdAorICBUcnlQYXJzZVBhcmFtZXRlckRlY2xhcmF0aW9uQ2xhdXNlKGJvb2wgKkludmFsaWRBc0RlY2xhcmF0aW9uID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFZlcnN1c1RlbXBsYXRlQXJnID0gZmFsc2UpOworICBUUFJlc3VsdCBUcnlQYXJzZUZ1bmN0aW9uRGVjbGFyYXRvcigpOworICBUUFJlc3VsdCBUcnlQYXJzZUJyYWNrZXREZWNsYXJhdG9yKCk7CisgIFRQUmVzdWx0IFRyeUNvbnN1bWVEZWNsYXJhdGlvblNwZWNpZmllcigpOworCitwdWJsaWM6CisgIFR5cGVSZXN1bHQgUGFyc2VUeXBlTmFtZShTb3VyY2VSYW5nZSAqUmFuZ2UgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRvckNvbnRleHQgQ29udGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IERlY2xhcmF0b3JDb250ZXh0OjpUeXBlTmFtZUNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NTcGVjaWZpZXIgQVMgPSBBU19ub25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbCAqKk93bmVkVHlwZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzICpBdHRycyA9IG51bGxwdHIpOworCitwcml2YXRlOgorICB2b2lkIFBhcnNlQmxvY2tJZChTb3VyY2VMb2NhdGlvbiBDYXJldExvYyk7CisKKyAgLy8vIEFyZSBbW11dIGF0dHJpYnV0ZXMgZW5hYmxlZD8KKyAgYm9vbCBzdGFuZGFyZEF0dHJpYnV0ZXNBbGxvd2VkKCkgY29uc3QgeworICAgIGNvbnN0IExhbmdPcHRpb25zICZMTyA9IGdldExhbmdPcHRzKCk7CisgICAgcmV0dXJuIExPLkRvdWJsZVNxdWFyZUJyYWNrZXRBdHRyaWJ1dGVzOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIHRoZSBzdGFydCBvZiBhbiBhdHRyaWJ1dGUtc3BlY2lmaWVyLXNlcSBpbiBhIGNvbnRleHQgd2hlcmUgYW4KKyAgLy8gYXR0cmlidXRlIGlzIG5vdCBhbGxvd2VkLgorICBib29sIENoZWNrUHJvaGliaXRlZENYWDExQXR0cmlidXRlKCkgeworICAgIGFzc2VydChUb2suaXModG9rOjpsX3NxdWFyZSkpOworICAgIGlmICghc3RhbmRhcmRBdHRyaWJ1dGVzQWxsb3dlZCgpIHx8IE5leHRUb2tlbigpLmlzTm90KHRvazo6bF9zcXVhcmUpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBEaWFnbm9zZVByb2hpYml0ZWRDWFgxMUF0dHJpYnV0ZSgpOworICB9CisKKyAgYm9vbCBEaWFnbm9zZVByb2hpYml0ZWRDWFgxMUF0dHJpYnV0ZSgpOworICB2b2lkIENoZWNrTWlzcGxhY2VkQ1hYMTFBdHRyaWJ1dGUoUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSAmQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb3JyZWN0TG9jYXRpb24pIHsKKyAgICBpZiAoIXN0YW5kYXJkQXR0cmlidXRlc0FsbG93ZWQoKSkKKyAgICAgIHJldHVybjsKKyAgICBpZiAoKFRvay5pc05vdCh0b2s6Omxfc3F1YXJlKSB8fCBOZXh0VG9rZW4oKS5pc05vdCh0b2s6Omxfc3F1YXJlKSkgJiYKKyAgICAgICAgVG9rLmlzTm90KHRvazo6a3dfYWxpZ25hcykpCisgICAgICByZXR1cm47CisgICAgRGlhZ25vc2VNaXNwbGFjZWRDWFgxMUF0dHJpYnV0ZShBdHRycywgQ29ycmVjdExvY2F0aW9uKTsKKyAgfQorICB2b2lkIERpYWdub3NlTWlzcGxhY2VkQ1hYMTFBdHRyaWJ1dGUoUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSAmQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb3JyZWN0TG9jYXRpb24pOworCisgIHZvaWQgc3RyaXBUeXBlQXR0cmlidXRlc09mZkRlY2xTcGVjKFBhcnNlZEF0dHJpYnV0ZXNXaXRoUmFuZ2UgJkF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsU3BlYyAmRFMsIFNlbWE6OlRhZ1VzZUtpbmQgVFVLKTsKKyAgCisgIC8vIEZpeEl0TG9jID0gcG9zc2libGUgY29ycmVjdCBsb2NhdGlvbiBmb3IgdGhlIGF0dHJpYnV0ZXMKKyAgdm9pZCBQcm9oaWJpdEF0dHJpYnV0ZXMoUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSAmYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEZpeEl0TG9jID0gU291cmNlTG9jYXRpb24oKSkgeworICAgIGlmICghYXR0cnMuUmFuZ2UuaXNWYWxpZCgpKSByZXR1cm47CisgICAgRGlhZ25vc2VQcm9oaWJpdGVkQXR0cmlidXRlcyhhdHRycywgRml4SXRMb2MpOworICAgIGF0dHJzLmNsZWFyKCk7CisgIH0KKyAgdm9pZCBEaWFnbm9zZVByb2hpYml0ZWRBdHRyaWJ1dGVzKFBhcnNlZEF0dHJpYnV0ZXNXaXRoUmFuZ2UgJmF0dHJzLCAKKyAgICBTb3VyY2VMb2NhdGlvbiBGaXhJdExvYyk7CisKKyAgLy8gRm9yYmlkIEMrKzExIGFuZCBDMnggYXR0cmlidXRlcyB0aGF0IGFwcGVhciBvbiBjZXJ0YWluIHN5bnRhY3RpYyBsb2NhdGlvbnMKKyAgLy8gd2hpY2ggc3RhbmRhcmQgcGVybWl0cyBidXQgd2UgZG9uJ3Qgc3VwcG9ydGVkIHlldCwgZm9yIGV4YW1wbGUsIGF0dHJpYnV0ZXMKKyAgLy8gYXBwZXJ0YWluIHRvIGRlY2wgc3BlY2lmaWVycy4KKyAgdm9pZCBQcm9oaWJpdENYWDExQXR0cmlidXRlcyhQYXJzZWRBdHRyaWJ1dGVzV2l0aFJhbmdlICZBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEaWFnSUQpOworCisgIC8vLyBcYnJpZWYgU2tpcCBDKysxMSBhbmQgQzJ4IGF0dHJpYnV0ZXMgYW5kIHJldHVybiB0aGUgZW5kIGxvY2F0aW9uIG9mIHRoZQorICAvLy8gbGFzdCBvbmUuCisgIC8vLyBccmV0dXJucyBTb3VyY2VMb2NhdGlvbigpIGlmIHRoZXJlIGFyZSBubyBhdHRyaWJ1dGVzLgorICBTb3VyY2VMb2NhdGlvbiBTa2lwQ1hYMTFBdHRyaWJ1dGVzKCk7CisKKyAgLy8vIFxicmllZiBEaWFnbm9zZSBhbmQgc2tpcCBDKysxMSBhbmQgQzJ4IGF0dHJpYnV0ZXMgdGhhdCBhcHBlYXIgaW4gc3ludGFjdGljCisgIC8vLyBsb2NhdGlvbnMgd2hlcmUgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQuCisgIHZvaWQgRGlhZ25vc2VBbmRTa2lwQ1hYMTFBdHRyaWJ1dGVzKCk7CisKKyAgLy8vIFxicmllZiBQYXJzZXMgc3ludGF4LWdlbmVyaWMgYXR0cmlidXRlIGFyZ3VtZW50cyBmb3IgYXR0cmlidXRlcyB3aGljaCBhcmUKKyAgLy8vIGtub3duIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiwgYW5kIGFkZHMgdGhlbSB0byB0aGUgZ2l2ZW4gUGFyc2VkQXR0cmlidXRlcworICAvLy8gbGlzdCB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGUgc3ludGF4LiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzCisgIC8vLyBwYXJzZWQgZm9yIHRoZSBhdHRyaWJ1dGUuCisgIHVuc2lnbmVkCisgIFBhcnNlQXR0cmlidXRlQXJnc0NvbW1vbihJZGVudGlmaWVySW5mbyAqQXR0ck5hbWUsIFNvdXJjZUxvY2F0aW9uIEF0dHJOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkQXR0cmlidXRlcyAmQXR0cnMsIFNvdXJjZUxvY2F0aW9uICpFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqU2NvcGVOYW1lLCBTb3VyY2VMb2NhdGlvbiBTY29wZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OlN5bnRheCBTeW50YXgpOworCisgIHZvaWQgTWF5YmVQYXJzZUdOVUF0dHJpYnV0ZXMoRGVjbGFyYXRvciAmRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXRlUGFyc2VkQXR0ckxpc3QgKkxhdGVBdHRycyA9IG51bGxwdHIpIHsKKyAgICBpZiAoVG9rLmlzKHRvazo6a3dfX19hdHRyaWJ1dGUpKSB7CisgICAgICBQYXJzZWRBdHRyaWJ1dGVzIGF0dHJzKEF0dHJGYWN0b3J5KTsKKyAgICAgIFNvdXJjZUxvY2F0aW9uIGVuZExvYzsKKyAgICAgIFBhcnNlR05VQXR0cmlidXRlcyhhdHRycywgJmVuZExvYywgTGF0ZUF0dHJzLCAmRCk7CisgICAgICBELnRha2VBdHRyaWJ1dGVzKGF0dHJzLCBlbmRMb2MpOworICAgIH0KKyAgfQorICB2b2lkIE1heWJlUGFyc2VHTlVBdHRyaWJ1dGVzKFBhcnNlZEF0dHJpYnV0ZXMgJmF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICplbmRMb2MgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhdGVQYXJzZWRBdHRyTGlzdCAqTGF0ZUF0dHJzID0gbnVsbHB0cikgeworICAgIGlmIChUb2suaXModG9rOjprd19fX2F0dHJpYnV0ZSkpCisgICAgICBQYXJzZUdOVUF0dHJpYnV0ZXMoYXR0cnMsIGVuZExvYywgTGF0ZUF0dHJzKTsKKyAgfQorICB2b2lkIFBhcnNlR05VQXR0cmlidXRlcyhQYXJzZWRBdHRyaWJ1dGVzICZhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gKmVuZExvYyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExhdGVQYXJzZWRBdHRyTGlzdCAqTGF0ZUF0dHJzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRvciAqRCA9IG51bGxwdHIpOworICB2b2lkIFBhcnNlR05VQXR0cmlidXRlQXJncyhJZGVudGlmaWVySW5mbyAqQXR0ck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEF0dHJOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzICZBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gKkVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKlNjb3BlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU2NvcGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OlN5bnRheCBTeW50YXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0b3IgKkQpOworICBJZGVudGlmaWVyTG9jICpQYXJzZUlkZW50aWZpZXJMb2MoKTsKKworICB1bnNpZ25lZAorICBQYXJzZUNsYW5nQXR0cmlidXRlQXJncyhJZGVudGlmaWVySW5mbyAqQXR0ck5hbWUsIFNvdXJjZUxvY2F0aW9uIEF0dHJOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzICZBdHRycywgU291cmNlTG9jYXRpb24gKkVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKlNjb3BlTmFtZSwgU291cmNlTG9jYXRpb24gU2NvcGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OlN5bnRheCBTeW50YXgpOworCisgIHZvaWQgTWF5YmVQYXJzZUNYWDExQXR0cmlidXRlcyhEZWNsYXJhdG9yICZEKSB7CisgICAgaWYgKHN0YW5kYXJkQXR0cmlidXRlc0FsbG93ZWQoKSAmJiBpc0NYWDExQXR0cmlidXRlU3BlY2lmaWVyKCkpIHsKKyAgICAgIFBhcnNlZEF0dHJpYnV0ZXNXaXRoUmFuZ2UgYXR0cnMoQXR0ckZhY3RvcnkpOworICAgICAgU291cmNlTG9jYXRpb24gZW5kTG9jOworICAgICAgUGFyc2VDWFgxMUF0dHJpYnV0ZXMoYXR0cnMsICZlbmRMb2MpOworICAgICAgRC50YWtlQXR0cmlidXRlcyhhdHRycywgZW5kTG9jKTsKKyAgICB9CisgIH0KKyAgdm9pZCBNYXliZVBhcnNlQ1hYMTFBdHRyaWJ1dGVzKFBhcnNlZEF0dHJpYnV0ZXMgJmF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gKmVuZExvYyA9IG51bGxwdHIpIHsKKyAgICBpZiAoc3RhbmRhcmRBdHRyaWJ1dGVzQWxsb3dlZCgpICYmIGlzQ1hYMTFBdHRyaWJ1dGVTcGVjaWZpZXIoKSkgeworICAgICAgUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSBhdHRyc1dpdGhSYW5nZShBdHRyRmFjdG9yeSk7CisgICAgICBQYXJzZUNYWDExQXR0cmlidXRlcyhhdHRyc1dpdGhSYW5nZSwgZW5kTG9jKTsKKyAgICAgIGF0dHJzLnRha2VBbGxGcm9tKGF0dHJzV2l0aFJhbmdlKTsKKyAgICB9CisgIH0KKyAgdm9pZCBNYXliZVBhcnNlQ1hYMTFBdHRyaWJ1dGVzKFBhcnNlZEF0dHJpYnV0ZXNXaXRoUmFuZ2UgJmF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gKmVuZExvYyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE91dGVyTWlnaHRCZU1lc3NhZ2VTZW5kID0gZmFsc2UpIHsKKyAgICBpZiAoc3RhbmRhcmRBdHRyaWJ1dGVzQWxsb3dlZCgpICYmCisgICAgICBpc0NYWDExQXR0cmlidXRlU3BlY2lmaWVyKGZhbHNlLCBPdXRlck1pZ2h0QmVNZXNzYWdlU2VuZCkpCisgICAgICBQYXJzZUNYWDExQXR0cmlidXRlcyhhdHRycywgZW5kTG9jKTsKKyAgfQorCisgIHZvaWQgUGFyc2VDWFgxMUF0dHJpYnV0ZVNwZWNpZmllcihQYXJzZWRBdHRyaWJ1dGVzICZhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICpFbmRMb2MgPSBudWxscHRyKTsKKyAgdm9pZCBQYXJzZUNYWDExQXR0cmlidXRlcyhQYXJzZWRBdHRyaWJ1dGVzV2l0aFJhbmdlICZhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqRW5kTG9jID0gbnVsbHB0cik7CisgIC8vLyBcYnJpZWYgUGFyc2VzIGEgQysrMTEgKG9yIEMyeCktc3R5bGUgYXR0cmlidXRlIGFyZ3VtZW50IGxpc3QuIFJldHVybnMgdHJ1ZQorICAvLy8gaWYgdGhpcyByZXN1bHRzIGluIGFkZGluZyBhbiBhdHRyaWJ1dGUgdG8gdGhlIFBhcnNlZEF0dHJpYnV0ZXMgbGlzdC4KKyAgYm9vbCBQYXJzZUNYWDExQXR0cmlidXRlQXJncyhJZGVudGlmaWVySW5mbyAqQXR0ck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXR0ck5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkQXR0cmlidXRlcyAmQXR0cnMsIFNvdXJjZUxvY2F0aW9uICpFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKlNjb3BlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTY29wZUxvYyk7CisKKyAgSWRlbnRpZmllckluZm8gKlRyeVBhcnNlQ1hYMTFBdHRyaWJ1dGVJZGVudGlmaWVyKFNvdXJjZUxvY2F0aW9uICZMb2MpOworCisgIHZvaWQgTWF5YmVQYXJzZU1pY3Jvc29mdEF0dHJpYnV0ZXMoUGFyc2VkQXR0cmlidXRlcyAmYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gKmVuZExvYyA9IG51bGxwdHIpIHsKKyAgICBpZiAoZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRFeHQgJiYgVG9rLmlzKHRvazo6bF9zcXVhcmUpKQorICAgICAgUGFyc2VNaWNyb3NvZnRBdHRyaWJ1dGVzKGF0dHJzLCBlbmRMb2MpOworICB9CisgIHZvaWQgUGFyc2VNaWNyb3NvZnRVdWlkQXR0cmlidXRlQXJncyhQYXJzZWRBdHRyaWJ1dGVzICZBdHRycyk7CisgIHZvaWQgUGFyc2VNaWNyb3NvZnRBdHRyaWJ1dGVzKFBhcnNlZEF0dHJpYnV0ZXMgJmF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqZW5kTG9jID0gbnVsbHB0cik7CisgIHZvaWQgTWF5YmVQYXJzZU1pY3Jvc29mdERlY2xTcGVjcyhQYXJzZWRBdHRyaWJ1dGVzICZBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICpFbmQgPSBudWxscHRyKSB7CisgICAgY29uc3QgYXV0byAmTE8gPSBnZXRMYW5nT3B0cygpOworICAgIGlmIChMTy5EZWNsU3BlY0tleXdvcmQgJiYgVG9rLmlzKHRvazo6a3dfX19kZWNsc3BlYykpCisgICAgICBQYXJzZU1pY3Jvc29mdERlY2xTcGVjcyhBdHRycywgRW5kKTsKKyAgfQorICB2b2lkIFBhcnNlTWljcm9zb2Z0RGVjbFNwZWNzKFBhcnNlZEF0dHJpYnV0ZXMgJkF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICpFbmQgPSBudWxscHRyKTsKKyAgYm9vbCBQYXJzZU1pY3Jvc29mdERlY2xTcGVjQXJncyhJZGVudGlmaWVySW5mbyAqQXR0ck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXR0ck5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkQXR0cmlidXRlcyAmQXR0cnMpOworICB2b2lkIFBhcnNlTWljcm9zb2Z0VHlwZUF0dHJpYnV0ZXMoUGFyc2VkQXR0cmlidXRlcyAmYXR0cnMpOworICB2b2lkIERpYWdub3NlQW5kU2tpcEV4dGVuZGVkTWljcm9zb2Z0VHlwZUF0dHJpYnV0ZXMoKTsKKyAgU291cmNlTG9jYXRpb24gU2tpcEV4dGVuZGVkTWljcm9zb2Z0VHlwZUF0dHJpYnV0ZXMoKTsKKyAgdm9pZCBQYXJzZU1pY3Jvc29mdEluaGVyaXRhbmNlQ2xhc3NBdHRyaWJ1dGVzKFBhcnNlZEF0dHJpYnV0ZXMgJmF0dHJzKTsKKyAgdm9pZCBQYXJzZUJvcmxhbmRUeXBlQXR0cmlidXRlcyhQYXJzZWRBdHRyaWJ1dGVzICZhdHRycyk7CisgIHZvaWQgUGFyc2VPcGVuQ0xLZXJuZWxBdHRyaWJ1dGVzKFBhcnNlZEF0dHJpYnV0ZXMgJmF0dHJzKTsKKyAgdm9pZCBQYXJzZU9wZW5DTFF1YWxpZmllcnMoUGFyc2VkQXR0cmlidXRlcyAmQXR0cnMpOworICAvLy8gXGJyaWVmIFBhcnNlcyBvcGVuY2xfdW5yb2xsX2hpbnQgYXR0cmlidXRlIGlmIGxhbmd1YWdlIGlzIE9wZW5DTCB2Mi4wCisgIC8vLyBvciBoaWdoZXIuCisgIC8vLyBccmV0dXJuIGZhbHNlIGlmIGVycm9yIGhhcHBlbnMuCisgIGJvb2wgTWF5YmVQYXJzZU9wZW5DTFVucm9sbEhpbnRBdHRyaWJ1dGUoUGFyc2VkQXR0cmlidXRlcyAmQXR0cnMpIHsKKyAgICBpZiAoZ2V0TGFuZ09wdHMoKS5PcGVuQ0wpCisgICAgICByZXR1cm4gUGFyc2VPcGVuQ0xVbnJvbGxIaW50QXR0cmlidXRlKEF0dHJzKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAvLy8gXGJyaWVmIFBhcnNlcyBvcGVuY2xfdW5yb2xsX2hpbnQgYXR0cmlidXRlLgorICAvLy8gXHJldHVybiBmYWxzZSBpZiBlcnJvciBoYXBwZW5zLgorICBib29sIFBhcnNlT3BlbkNMVW5yb2xsSGludEF0dHJpYnV0ZShQYXJzZWRBdHRyaWJ1dGVzICZBdHRycyk7CisgIHZvaWQgUGFyc2VOdWxsYWJpbGl0eVR5cGVTcGVjaWZpZXJzKFBhcnNlZEF0dHJpYnV0ZXMgJmF0dHJzKTsKKworICBWZXJzaW9uVHVwbGUgUGFyc2VWZXJzaW9uVHVwbGUoU291cmNlUmFuZ2UgJlJhbmdlKTsKKyAgdm9pZCBQYXJzZUF2YWlsYWJpbGl0eUF0dHJpYnV0ZShJZGVudGlmaWVySW5mbyAmQXZhaWxhYmlsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEF2YWlsYWJpbGl0eUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzICZhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqZW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpTY29wZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU2NvcGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdDo6U3ludGF4IFN5bnRheCk7CisKKyAgT3B0aW9uYWw8QXZhaWxhYmlsaXR5U3BlYz4gUGFyc2VBdmFpbGFiaWxpdHlTcGVjKCk7CisgIEV4cHJSZXN1bHQgUGFyc2VBdmFpbGFiaWxpdHlDaGVja0V4cHIoU291cmNlTG9jYXRpb24gU3RhcnRMb2MpOworCisgIHZvaWQgUGFyc2VFeHRlcm5hbFNvdXJjZVN5bWJvbEF0dHJpYnV0ZShJZGVudGlmaWVySW5mbyAmRXh0ZXJuYWxTb3VyY2VTeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzICZBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICpFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqU2NvcGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU2NvcGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0OjpTeW50YXggU3ludGF4KTsKKworICB2b2lkIFBhcnNlT2JqQ0JyaWRnZVJlbGF0ZWRBdHRyaWJ1dGUoSWRlbnRpZmllckluZm8gJk9iakNCcmlkZ2VSZWxhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gT2JqQ0JyaWRnZVJlbGF0ZWRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzICZhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICplbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqU2NvcGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU2NvcGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0OjpTeW50YXggU3ludGF4KTsKKworICB2b2lkIFBhcnNlVHlwZVRhZ0ZvckRhdGF0eXBlQXR0cmlidXRlKElkZW50aWZpZXJJbmZvICZBdHRyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdHRyTmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzICZBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpTY29wZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU2NvcGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdDo6U3ludGF4IFN5bnRheCk7CisKKyAgdm9pZCBQYXJzZUF0dHJpYnV0ZVdpdGhUeXBlQXJnKElkZW50aWZpZXJJbmZvICZBdHRyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEF0dHJOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkQXR0cmlidXRlcyAmQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKlNjb3BlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFNjb3BlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdDo6U3ludGF4IFN5bnRheCk7CisKKyAgdm9pZCBQYXJzZVR5cGVvZlNwZWNpZmllcihEZWNsU3BlYyAmRFMpOworICBTb3VyY2VMb2NhdGlvbiBQYXJzZURlY2x0eXBlU3BlY2lmaWVyKERlY2xTcGVjICZEUyk7CisgIHZvaWQgQW5ub3RhdGVFeGlzdGluZ0RlY2x0eXBlU3BlY2lmaWVyKGNvbnN0IERlY2xTcGVjICZEUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIHZvaWQgUGFyc2VVbmRlcmx5aW5nVHlwZVNwZWNpZmllcihEZWNsU3BlYyAmRFMpOworICB2b2lkIFBhcnNlQXRvbWljU3BlY2lmaWVyKERlY2xTcGVjICZEUyk7CisKKyAgRXhwclJlc3VsdCBQYXJzZUFsaWduQXJndW1lbnQoU291cmNlTG9jYXRpb24gU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICZFbGxpcHNpc0xvYyk7CisgIHZvaWQgUGFyc2VBbGlnbm1lbnRTcGVjaWZpZXIoUGFyc2VkQXR0cmlidXRlcyAmQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gKmVuZExvYyA9IG51bGxwdHIpOworCisgIFZpcnRTcGVjaWZpZXJzOjpTcGVjaWZpZXIgaXNDWFgxMVZpcnRTcGVjaWZpZXIoY29uc3QgVG9rZW4gJlRvaykgY29uc3Q7CisgIFZpcnRTcGVjaWZpZXJzOjpTcGVjaWZpZXIgaXNDWFgxMVZpcnRTcGVjaWZpZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQ1hYMTFWaXJ0U3BlY2lmaWVyKFRvayk7CisgIH0KKyAgdm9pZCBQYXJzZU9wdGlvbmFsQ1hYMTFWaXJ0U3BlY2lmaWVyU2VxKFZpcnRTcGVjaWZpZXJzICZWUywgYm9vbCBJc0ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEZyaWVuZExvYyk7CisKKyAgYm9vbCBpc0NYWDExRmluYWxLZXl3b3JkKCkgY29uc3Q7CisKKyAgLy8vIERlY2xhcmF0b3JTY29wZU9iaiAtIFJBSUkgb2JqZWN0IHVzZWQgaW4gUGFyc2VyOjpQYXJzZURpcmVjdERlY2xhcmF0b3IgdG8KKyAgLy8vIGVudGVyIGEgbmV3IEMrKyBkZWNsYXJhdG9yIHNjb3BlIGFuZCBleGl0IGl0IHdoZW4gdGhlIGZ1bmN0aW9uIGlzCisgIC8vLyBmaW5pc2hlZC4KKyAgY2xhc3MgRGVjbGFyYXRvclNjb3BlT2JqIHsKKyAgICBQYXJzZXIgJlA7CisgICAgQ1hYU2NvcGVTcGVjICZTUzsKKyAgICBib29sIEVudGVyZWRTY29wZTsKKyAgICBib29sIENyZWF0ZWRTY29wZTsKKyAgcHVibGljOgorICAgIERlY2xhcmF0b3JTY29wZU9iaihQYXJzZXIgJnAsIENYWFNjb3BlU3BlYyAmc3MpCisgICAgICA6IFAocCksIFNTKHNzKSwgRW50ZXJlZFNjb3BlKGZhbHNlKSwgQ3JlYXRlZFNjb3BlKGZhbHNlKSB7fQorCisgICAgdm9pZCBFbnRlckRlY2xhcmF0b3JTY29wZSgpIHsKKyAgICAgIGFzc2VydCghRW50ZXJlZFNjb3BlICYmICJBbHJlYWR5IGVudGVyZWQgdGhlIHNjb3BlISIpOworICAgICAgYXNzZXJ0KFNTLmlzU2V0KCkgJiYgIkMrKyBzY29wZSB3YXMgbm90IHNldCEiKTsKKworICAgICAgQ3JlYXRlZFNjb3BlID0gdHJ1ZTsKKyAgICAgIFAuRW50ZXJTY29wZSgwKTsgLy8gTm90IGEgZGVjbCBzY29wZS4KKworICAgICAgaWYgKCFQLkFjdGlvbnMuQWN0T25DWFhFbnRlckRlY2xhcmF0b3JTY29wZShQLmdldEN1clNjb3BlKCksIFNTKSkKKyAgICAgICAgRW50ZXJlZFNjb3BlID0gdHJ1ZTsKKyAgICB9CisKKyAgICB+RGVjbGFyYXRvclNjb3BlT2JqKCkgeworICAgICAgaWYgKEVudGVyZWRTY29wZSkgeworICAgICAgICBhc3NlcnQoU1MuaXNTZXQoKSAmJiAiQysrIHNjb3BlIHdhcyBjbGVhcmVkID8iKTsKKyAgICAgICAgUC5BY3Rpb25zLkFjdE9uQ1hYRXhpdERlY2xhcmF0b3JTY29wZShQLmdldEN1clNjb3BlKCksIFNTKTsKKyAgICAgIH0KKyAgICAgIGlmIChDcmVhdGVkU2NvcGUpCisgICAgICAgIFAuRXhpdFNjb3BlKCk7CisgICAgfQorICB9OworCisgIC8vLyBQYXJzZURlY2xhcmF0b3IgLSBQYXJzZSBhbmQgdmVyaWZ5IGEgbmV3bHktaW5pdGlhbGl6ZWQgZGVjbGFyYXRvci4KKyAgdm9pZCBQYXJzZURlY2xhcmF0b3IoRGVjbGFyYXRvciAmRCk7CisgIC8vLyBBIGZ1bmN0aW9uIHRoYXQgcGFyc2VzIGEgdmFyaWFudCBvZiBkaXJlY3QtZGVjbGFyYXRvci4KKyAgdHlwZWRlZiB2b2lkIChQYXJzZXI6OipEaXJlY3REZWNsUGFyc2VGdW5jdGlvbikoRGVjbGFyYXRvciYpOworICB2b2lkIFBhcnNlRGVjbGFyYXRvckludGVybmFsKERlY2xhcmF0b3IgJkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0RGVjbFBhcnNlRnVuY3Rpb24gRGlyZWN0RGVjbFBhcnNlcik7CisKKyAgZW51bSBBdHRyUmVxdWlyZW1lbnRzIHsKKyAgICBBUl9Ob0F0dHJpYnV0ZXNQYXJzZWQgPSAwLCAvLy88IE5vIGF0dHJpYnV0ZXMgYXJlIGRpYWdub3NlZC4KKyAgICBBUl9HTlVBdHRyaWJ1dGVzUGFyc2VkQW5kUmVqZWN0ZWQgPSAxIDw8IDAsIC8vLzwgRGlhZ25vc2UgR05VIGF0dHJpYnV0ZXMuCisgICAgQVJfR05VQXR0cmlidXRlc1BhcnNlZCA9IDEgPDwgMSwKKyAgICBBUl9DWFgxMUF0dHJpYnV0ZXNQYXJzZWQgPSAxIDw8IDIsCisgICAgQVJfRGVjbHNwZWNBdHRyaWJ1dGVzUGFyc2VkID0gMSA8PCAzLAorICAgIEFSX0FsbEF0dHJpYnV0ZXNQYXJzZWQgPSBBUl9HTlVBdHRyaWJ1dGVzUGFyc2VkIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJfQ1hYMTFBdHRyaWJ1dGVzUGFyc2VkIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJfRGVjbHNwZWNBdHRyaWJ1dGVzUGFyc2VkLAorICAgIEFSX1ZlbmRvckF0dHJpYnV0ZXNQYXJzZWQgPSBBUl9HTlVBdHRyaWJ1dGVzUGFyc2VkIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJfRGVjbHNwZWNBdHRyaWJ1dGVzUGFyc2VkCisgIH07CisKKyAgdm9pZCBQYXJzZVR5cGVRdWFsaWZpZXJMaXN0T3B0KAorICAgICAgRGVjbFNwZWMgJkRTLCB1bnNpZ25lZCBBdHRyUmVxcyA9IEFSX0FsbEF0dHJpYnV0ZXNQYXJzZWQsCisgICAgICBib29sIEF0b21pY0FsbG93ZWQgPSB0cnVlLCBib29sIElkZW50aWZpZXJSZXF1aXJlZCA9IGZhbHNlLAorICAgICAgT3B0aW9uYWw8bGx2bTo6ZnVuY3Rpb25fcmVmPHZvaWQoKT4+IENvZGVDb21wbGV0aW9uSGFuZGxlciA9IE5vbmUpOworICB2b2lkIFBhcnNlRGlyZWN0RGVjbGFyYXRvcihEZWNsYXJhdG9yICZEKTsKKyAgdm9pZCBQYXJzZURlY29tcG9zaXRpb25EZWNsYXJhdG9yKERlY2xhcmF0b3IgJkQpOworICB2b2lkIFBhcnNlUGFyZW5EZWNsYXJhdG9yKERlY2xhcmF0b3IgJkQpOworICB2b2lkIFBhcnNlRnVuY3Rpb25EZWNsYXJhdG9yKERlY2xhcmF0b3IgJkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkQXR0cmlidXRlcyAmYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFsYW5jZWREZWxpbWl0ZXJUcmFja2VyICZUcmFja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNBbWJpZ3VvdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZXF1aXJlc0FyZyA9IGZhbHNlKTsKKyAgYm9vbCBQYXJzZVJlZlF1YWxpZmllcihib29sICZSZWZRdWFsaWZpZXJJc0xWYWx1ZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAmUmVmUXVhbGlmaWVyTG9jKTsKKyAgYm9vbCBpc0Z1bmN0aW9uRGVjbGFyYXRvcklkZW50aWZpZXJMaXN0KCk7CisgIHZvaWQgUGFyc2VGdW5jdGlvbkRlY2xhcmF0b3JJZGVudGlmaWVyTGlzdCgKKyAgICAgICAgIERlY2xhcmF0b3IgJkQsCisgICAgICAgICBTbWFsbFZlY3RvckltcGw8RGVjbGFyYXRvckNodW5rOjpQYXJhbUluZm8+ICZQYXJhbUluZm8pOworICB2b2lkIFBhcnNlUGFyYW1ldGVyRGVjbGFyYXRpb25DbGF1c2UoCisgICAgICAgICBEZWNsYXJhdG9yICZELAorICAgICAgICAgUGFyc2VkQXR0cmlidXRlcyAmYXR0cnMsCisgICAgICAgICBTbWFsbFZlY3RvckltcGw8RGVjbGFyYXRvckNodW5rOjpQYXJhbUluZm8+ICZQYXJhbUluZm8sCisgICAgICAgICBTb3VyY2VMb2NhdGlvbiAmRWxsaXBzaXNMb2MpOworICB2b2lkIFBhcnNlQnJhY2tldERlY2xhcmF0b3IoRGVjbGFyYXRvciAmRCk7CisgIHZvaWQgUGFyc2VNaXNwbGFjZWRCcmFja2V0RGVjbGFyYXRvcihEZWNsYXJhdG9yICZEKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQysrIDc6IERlY2xhcmF0aW9ucyBbZGNsLmRjbF0KKworICAvLy8gVGhlIGtpbmQgb2YgYXR0cmlidXRlIHNwZWNpZmllciB3ZSBoYXZlIGZvdW5kLgorICBlbnVtIENYWDExQXR0cmlidXRlS2luZCB7CisgICAgLy8vIFRoaXMgaXMgbm90IGFuIGF0dHJpYnV0ZSBzcGVjaWZpZXIuCisgICAgQ0FLX05vdEF0dHJpYnV0ZVNwZWNpZmllciwKKyAgICAvLy8gVGhpcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBhbiBhdHRyaWJ1dGUtc3BlY2lmaWVyLgorICAgIENBS19BdHRyaWJ1dGVTcGVjaWZpZXIsCisgICAgLy8vIFRoZSBuZXh0IHRva2VucyBhcmUgJ1tbJywgYnV0IHRoaXMgaXMgbm90IGFuIGF0dHJpYnV0ZS1zcGVjaWZpZXIuIFRoaXMKKyAgICAvLy8gaXMgaWxsLWZvcm1lZCBieSBDKysxMSBbZGNsLmF0dHIuZ3JhbW1hcl1wNi4KKyAgICBDQUtfSW52YWxpZEF0dHJpYnV0ZVNwZWNpZmllcgorICB9OworICBDWFgxMUF0dHJpYnV0ZUtpbmQKKyAgaXNDWFgxMUF0dHJpYnV0ZVNwZWNpZmllcihib29sIERpc2FtYmlndWF0ZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT3V0ZXJNaWdodEJlTWVzc2FnZVNlbmQgPSBmYWxzZSk7CisKKyAgdm9pZCBEaWFnbm9zZVVuZXhwZWN0ZWROYW1lc3BhY2UoTmFtZWREZWNsICpDb250ZXh0KTsKKworICBEZWNsR3JvdXBQdHJUeSBQYXJzZU5hbWVzcGFjZShEZWNsYXJhdG9yQ29udGV4dCBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAmRGVjbEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSW5saW5lTG9jID0gU291cmNlTG9jYXRpb24oKSk7CisgIHZvaWQgUGFyc2VJbm5lck5hbWVzcGFjZShzdGQ6OnZlY3RvcjxTb3VyY2VMb2NhdGlvbj4gJklkZW50TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SWRlbnRpZmllckluZm8gKj4gJklkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U291cmNlTG9jYXRpb24+ICZOYW1lc3BhY2VMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXgsIFNvdXJjZUxvY2F0aW9uICZJbmxpbmVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzICZhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbGFuY2VkRGVsaW1pdGVyVHJhY2tlciAmVHJhY2tlcik7CisgIERlY2wgKlBhcnNlTGlua2FnZShQYXJzaW5nRGVjbFNwZWMgJkRTLCBEZWNsYXJhdG9yQ29udGV4dCBDb250ZXh0KTsKKyAgRGVjbCAqUGFyc2VFeHBvcnREZWNsYXJhdGlvbigpOworICBEZWNsR3JvdXBQdHJUeSBQYXJzZVVzaW5nRGlyZWN0aXZlT3JEZWNsYXJhdGlvbigKKyAgICAgIERlY2xhcmF0b3JDb250ZXh0IENvbnRleHQsIGNvbnN0IFBhcnNlZFRlbXBsYXRlSW5mbyAmVGVtcGxhdGVJbmZvLAorICAgICAgU291cmNlTG9jYXRpb24gJkRlY2xFbmQsIFBhcnNlZEF0dHJpYnV0ZXNXaXRoUmFuZ2UgJmF0dHJzKTsKKyAgRGVjbCAqUGFyc2VVc2luZ0RpcmVjdGl2ZShEZWNsYXJhdG9yQ29udGV4dCBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFVzaW5nTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICZEZWNsRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZEF0dHJpYnV0ZXMgJmF0dHJzKTsKKworICBzdHJ1Y3QgVXNpbmdEZWNsYXJhdG9yIHsKKyAgICBTb3VyY2VMb2NhdGlvbiBUeXBlbmFtZUxvYzsKKyAgICBDWFhTY29wZVNwZWMgU1M7CisgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYzsKKyAgICBVbnF1YWxpZmllZElkIE5hbWU7CisgICAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2M7CisKKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgVHlwZW5hbWVMb2MgPSBUZW1wbGF0ZUtXTG9jID0gRWxsaXBzaXNMb2MgPSBTb3VyY2VMb2NhdGlvbigpOworICAgICAgU1MuY2xlYXIoKTsKKyAgICAgIE5hbWUuY2xlYXIoKTsKKyAgICB9CisgIH07CisKKyAgYm9vbCBQYXJzZVVzaW5nRGVjbGFyYXRvcihEZWNsYXJhdG9yQ29udGV4dCBDb250ZXh0LCBVc2luZ0RlY2xhcmF0b3IgJkQpOworICBEZWNsR3JvdXBQdHJUeSBQYXJzZVVzaW5nRGVjbGFyYXRpb24oRGVjbGFyYXRvckNvbnRleHQgQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnNlZFRlbXBsYXRlSW5mbyAmVGVtcGxhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVXNpbmdMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAmRGVjbEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc1NwZWNpZmllciBBUyA9IEFTX25vbmUpOworICBEZWNsICpQYXJzZUFsaWFzRGVjbGFyYXRpb25BZnRlckRlY2xhcmF0b3IoCisgICAgICBjb25zdCBQYXJzZWRUZW1wbGF0ZUluZm8gJlRlbXBsYXRlSW5mbywgU291cmNlTG9jYXRpb24gVXNpbmdMb2MsCisgICAgICBVc2luZ0RlY2xhcmF0b3IgJkQsIFNvdXJjZUxvY2F0aW9uICZEZWNsRW5kLCBBY2Nlc3NTcGVjaWZpZXIgQVMsCisgICAgICBQYXJzZWRBdHRyaWJ1dGVzICZBdHRycywgRGVjbCAqKk93bmVkVHlwZSA9IG51bGxwdHIpOworCisgIERlY2wgKlBhcnNlU3RhdGljQXNzZXJ0RGVjbGFyYXRpb24oU291cmNlTG9jYXRpb24gJkRlY2xFbmQpOworICBEZWNsICpQYXJzZU5hbWVzcGFjZUFsaWFzKFNvdXJjZUxvY2F0aW9uIE5hbWVzcGFjZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBbGlhc0xvYywgSWRlbnRpZmllckluZm8gKkFsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICZEZWNsRW5kKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQysrIDk6IGNsYXNzZXMgW2NsYXNzXSBhbmQgQyBzdHJ1Y3RzL3VuaW9ucy4KKyAgYm9vbCBpc1ZhbGlkQWZ0ZXJUeXBlU3BlY2lmaWVyKGJvb2wgQ291bGRCZUJpdGZpZWxkKTsKKyAgdm9pZCBQYXJzZUNsYXNzU3BlY2lmaWVyKHRvazo6VG9rZW5LaW5kIFRhZ1Rva0tpbmQsIFNvdXJjZUxvY2F0aW9uIFRhZ0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xTcGVjICZEUywgY29uc3QgUGFyc2VkVGVtcGxhdGVJbmZvICZUZW1wbGF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NTcGVjaWZpZXIgQVMsIGJvb2wgRW50ZXJpbmdDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbFNwZWNDb250ZXh0IERTQywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzV2l0aFJhbmdlICZBdHRyaWJ1dGVzKTsKKyAgdm9pZCBTa2lwQ1hYTWVtYmVyU3BlY2lmaWNhdGlvbihTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdHRyRml4aXRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVGFnVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsICpUYWdEZWNsKTsKKyAgdm9pZCBQYXJzZUNYWE1lbWJlclNwZWNpZmljYXRpb24oU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEF0dHJGaXhpdExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSAmQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFRhZ1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2wgKlRhZ0RlY2wpOworICBFeHByUmVzdWx0IFBhcnNlQ1hYTWVtYmVySW5pdGlhbGl6ZXIoRGVjbCAqRCwgYm9vbCBJc0Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gJkVxdWFsTG9jKTsKKyAgYm9vbCBQYXJzZUNYWE1lbWJlckRlY2xhcmF0b3JCZWZvcmVJbml0aWFsaXplcihEZWNsYXJhdG9yICZEZWNsYXJhdG9ySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXJ0U3BlY2lmaWVycyAmVlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwclJlc3VsdCAmQml0ZmllbGRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhdGVQYXJzZWRBdHRyTGlzdCAmTGF0ZUF0dHJzKTsKKyAgdm9pZCBNYXliZVBhcnNlQW5kRGlhZ25vc2VEZWNsU3BlY0FmdGVyQ1hYMTFWaXJ0U3BlY2lmaWVyU2VxKERlY2xhcmF0b3IgJkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXJ0U3BlY2lmaWVycyAmVlMpOworICBEZWNsR3JvdXBQdHJUeSBQYXJzZUNYWENsYXNzTWVtYmVyRGVjbGFyYXRpb24oCisgICAgICBBY2Nlc3NTcGVjaWZpZXIgQVMsIEF0dHJpYnV0ZUxpc3QgKkF0dHIsCisgICAgICBjb25zdCBQYXJzZWRUZW1wbGF0ZUluZm8gJlRlbXBsYXRlSW5mbyA9IFBhcnNlZFRlbXBsYXRlSW5mbygpLAorICAgICAgUGFyc2luZ0RlY2xSQUlJT2JqZWN0ICpEaWFnc0Zyb21UUGFyYW1zID0gbnVsbHB0cik7CisgIERlY2xHcm91cFB0clR5IFBhcnNlQ1hYQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbldpdGhQcmFnbWFzKAorICAgICAgQWNjZXNzU3BlY2lmaWVyICZBUywgUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSAmQWNjZXNzQXR0cnMsCisgICAgICBEZWNsU3BlYzo6VFNUIFRhZ1R5cGUsIERlY2wgKlRhZyk7CisgIHZvaWQgUGFyc2VDb25zdHJ1Y3RvckluaXRpYWxpemVyKERlY2wgKkNvbnN0cnVjdG9yRGVjbCk7CisgIE1lbUluaXRSZXN1bHQgUGFyc2VNZW1Jbml0aWFsaXplcihEZWNsICpDb25zdHJ1Y3RvckRlY2wpOworICB2b2lkIEhhbmRsZU1lbWJlckZ1bmN0aW9uRGVjbERlbGF5cyhEZWNsYXJhdG9yJiBEZWNsYXJhdG9ySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbCAqVGhpc0RlY2wpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDKysgMTA6IERlcml2ZWQgY2xhc3NlcyBbY2xhc3MuZGVyaXZlZF0KKyAgVHlwZVJlc3VsdCBQYXJzZUJhc2VUeXBlU3BlY2lmaWVyKFNvdXJjZUxvY2F0aW9uICZCYXNlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gJkVuZExvY2F0aW9uKTsKKyAgdm9pZCBQYXJzZUJhc2VDbGF1c2UoRGVjbCAqQ2xhc3NEZWNsKTsKKyAgQmFzZVJlc3VsdCBQYXJzZUJhc2VTcGVjaWZpZXIoRGVjbCAqQ2xhc3NEZWNsKTsKKyAgQWNjZXNzU3BlY2lmaWVyIGdldEFjY2Vzc1NwZWNpZmllcklmUHJlc2VudCgpIGNvbnN0OworCisgIGJvb2wgUGFyc2VVbnF1YWxpZmllZElkVGVtcGxhdGVJZChDWFhTY29wZVNwZWMgJlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRW50ZXJpbmdDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSBPYmplY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5xdWFsaWZpZWRJZCAmSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFzc3VtZVRlbXBsYXRlSWQpOworICBib29sIFBhcnNlVW5xdWFsaWZpZWRJZE9wZXJhdG9yKENYWFNjb3BlU3BlYyAmU1MsIGJvb2wgRW50ZXJpbmdDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgT2JqZWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnF1YWxpZmllZElkICZSZXN1bHQpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBPcGVuTVA6IERpcmVjdGl2ZXMgYW5kIGNsYXVzZXMuCisgIC8vLyBQYXJzZSBjbGF1c2VzIGZvciAnI3ByYWdtYSBvbXAgZGVjbGFyZSBzaW1kJy4KKyAgRGVjbEdyb3VwUHRyVHkgUGFyc2VPTVBEZWNsYXJlU2ltZENsYXVzZXMoRGVjbEdyb3VwUHRyVHkgUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZWRUb2tlbnMgJlRva3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYyk7CisgIC8vLyBcYnJpZWYgUGFyc2VzIGRlY2xhcmF0aXZlIE9wZW5NUCBkaXJlY3RpdmVzLgorICBEZWNsR3JvdXBQdHJUeSBQYXJzZU9wZW5NUERlY2xhcmF0aXZlRGlyZWN0aXZlV2l0aEV4dERlY2woCisgICAgICBBY2Nlc3NTcGVjaWZpZXIgJkFTLCBQYXJzZWRBdHRyaWJ1dGVzV2l0aFJhbmdlICZBdHRycywKKyAgICAgIERlY2xTcGVjOjpUU1QgVGFnVHlwZSA9IERlY2xTcGVjOjpUU1RfdW5zcGVjaWZpZWQsCisgICAgICBEZWNsICpUYWdEZWNsID0gbnVsbHB0cik7CisgIC8vLyBcYnJpZWYgUGFyc2UgJ29tcCBkZWNsYXJlIHJlZHVjdGlvbicgY29uc3RydWN0LgorICBEZWNsR3JvdXBQdHJUeSBQYXJzZU9wZW5NUERlY2xhcmVSZWR1Y3Rpb25EaXJlY3RpdmUoQWNjZXNzU3BlY2lmaWVyIEFTKTsKKyAgLy8vIFBhcnNlcyBpbml0aWFsaXplciBmb3IgcHJvdmlkZWQgb21wX3ByaXYgZGVjbGFyYXRpb24gaW5zaWRlIHRoZSByZWR1Y3Rpb24KKyAgLy8vIGluaXRpYWxpemVyLgorICB2b2lkIFBhcnNlT3Blbk1QUmVkdWN0aW9uSW5pdGlhbGl6ZXJGb3JEZWNsKFZhckRlY2wgKk9tcFByaXZQYXJtKTsKKworICAvLy8gXGJyaWVmIFBhcnNlcyBzaW1wbGUgbGlzdCBvZiB2YXJpYWJsZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEtpbmQgS2luZCBvZiB0aGUgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIENhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBmb3IgdGhlIGxpc3QgZWxlbWVudHMuCisgIC8vLyBccGFyYW0gQWxsb3dTY29wZVNwZWNpZmllciB0cnVlLCBpZiB0aGUgdmFyaWFibGVzIGNhbiBoYXZlIGZ1bGx5CisgIC8vLyBxdWFsaWZpZWQgbmFtZXMuCisgIC8vLworICBib29sIFBhcnNlT3Blbk1QU2ltcGxlVmFyTGlzdCgKKyAgICAgIE9wZW5NUERpcmVjdGl2ZUtpbmQgS2luZCwKKyAgICAgIGNvbnN0IGxsdm06OmZ1bmN0aW9uX3JlZjx2b2lkKENYWFNjb3BlU3BlYyAmLCBEZWNsYXJhdGlvbk5hbWVJbmZvKT4gJgorICAgICAgICAgIENhbGxiYWNrLAorICAgICAgYm9vbCBBbGxvd1Njb3BlU3BlY2lmaWVyKTsKKyAgLy8vIFxicmllZiBQYXJzZXMgZGVjbGFyYXRpdmUgb3IgZXhlY3V0YWJsZSBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gXHBhcmFtIEFsbG93ZWQgQUNLX0FueSwgaWYgYW55IGRpcmVjdGl2ZXMgYXJlIGFsbG93ZWQsCisgIC8vLyBBQ0tfU3RhdGVtZW50c09wZW5NUEFueUV4ZWN1dGFibGUgLSBpZiBhbnkgZXhlY3V0YWJsZSBkaXJlY3RpdmVzIGFyZQorICAvLy8gYWxsb3dlZCwgQUNLX1N0YXRlbWVudHNPcGVuTVBOb25TdGFuZGFsb25lIC0gaWYgb25seSBub24tc3RhbmRhbG9uZQorICAvLy8gZXhlY3V0YWJsZSBkaXJlY3RpdmVzIGFyZSBhbGxvd2VkLgorICAvLy8KKyAgU3RtdFJlc3VsdAorICBQYXJzZU9wZW5NUERlY2xhcmF0aXZlT3JFeGVjdXRhYmxlRGlyZWN0aXZlKEFsbG93ZWRDb25zdHJ1Y3RzS2luZCBBbGxvd2VkKTsKKyAgLy8vIFxicmllZiBQYXJzZXMgY2xhdXNlIG9mIGtpbmQgXGEgQ0tpbmQgZm9yIGRpcmVjdGl2ZSBvZiBhIGtpbmQgXGEgS2luZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gREtpbmQgS2luZCBvZiBjdXJyZW50IGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBDS2luZCBLaW5kIG9mIGN1cnJlbnQgY2xhdXNlLgorICAvLy8gXHBhcmFtIEZpcnN0Q2xhdXNlIHRydWUsIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNsYXVzZSBvZiBhIGtpbmQgXGEgQ0tpbmQKKyAgLy8vIGluIGN1cnJlbnQgZGlyZWN0aXZlLgorICAvLy8KKyAgT01QQ2xhdXNlICpQYXJzZU9wZW5NUENsYXVzZShPcGVuTVBEaXJlY3RpdmVLaW5kIERLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5NUENsYXVzZUtpbmQgQ0tpbmQsIGJvb2wgRmlyc3RDbGF1c2UpOworICAvLy8gXGJyaWVmIFBhcnNlcyBjbGF1c2Ugd2l0aCBhIHNpbmdsZSBleHByZXNzaW9uIG9mIGEga2luZCBcYSBLaW5kLgorICAvLy8KKyAgLy8vIFxwYXJhbSBLaW5kIEtpbmQgb2YgY3VycmVudCBjbGF1c2UuCisgIC8vLyBccGFyYW0gUGFyc2VPbmx5IHRydWUgdG8gc2tpcCB0aGUgY2xhdXNlJ3Mgc2VtYW50aWMgYWN0aW9ucyBhbmQgcmV0dXJuCisgIC8vLyBudWxscHRyLgorICAvLy8KKyAgT01QQ2xhdXNlICpQYXJzZU9wZW5NUFNpbmdsZUV4cHJDbGF1c2UoT3Blbk1QQ2xhdXNlS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFBhcnNlT25seSk7CisgIC8vLyBcYnJpZWYgUGFyc2VzIHNpbXBsZSBjbGF1c2Ugb2YgYSBraW5kIFxhIEtpbmQuCisgIC8vLworICAvLy8gXHBhcmFtIEtpbmQgS2luZCBvZiBjdXJyZW50IGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBQYXJzZU9ubHkgdHJ1ZSB0byBza2lwIHRoZSBjbGF1c2UncyBzZW1hbnRpYyBhY3Rpb25zIGFuZCByZXR1cm4KKyAgLy8vIG51bGxwdHIuCisgIC8vLworICBPTVBDbGF1c2UgKlBhcnNlT3Blbk1QU2ltcGxlQ2xhdXNlKE9wZW5NUENsYXVzZUtpbmQgS2luZCwgYm9vbCBQYXJzZU9ubHkpOworICAvLy8gXGJyaWVmIFBhcnNlcyBjbGF1c2Ugd2l0aCBhIHNpbmdsZSBleHByZXNzaW9uIGFuZCBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50CisgIC8vLyBvZiBhIGtpbmQgXGEgS2luZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gS2luZCBLaW5kIG9mIGN1cnJlbnQgY2xhdXNlLgorICAvLy8gXHBhcmFtIFBhcnNlT25seSB0cnVlIHRvIHNraXAgdGhlIGNsYXVzZSdzIHNlbWFudGljIGFjdGlvbnMgYW5kIHJldHVybgorICAvLy8gbnVsbHB0ci4KKyAgLy8vCisgIE9NUENsYXVzZSAqUGFyc2VPcGVuTVBTaW5nbGVFeHByV2l0aEFyZ0NsYXVzZShPcGVuTVBDbGF1c2VLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFBhcnNlT25seSk7CisgIC8vLyBcYnJpZWYgUGFyc2VzIGNsYXVzZSB3aXRob3V0IGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cy4KKyAgLy8vCisgIC8vLyBccGFyYW0gS2luZCBLaW5kIG9mIGN1cnJlbnQgY2xhdXNlLgorICAvLy8gXHBhcmFtIFBhcnNlT25seSB0cnVlIHRvIHNraXAgdGhlIGNsYXVzZSdzIHNlbWFudGljIGFjdGlvbnMgYW5kIHJldHVybgorICAvLy8gbnVsbHB0ci4KKyAgLy8vCisgIE9NUENsYXVzZSAqUGFyc2VPcGVuTVBDbGF1c2UoT3Blbk1QQ2xhdXNlS2luZCBLaW5kLCBib29sIFBhcnNlT25seSA9IGZhbHNlKTsKKyAgLy8vIFxicmllZiBQYXJzZXMgY2xhdXNlIHdpdGggdGhlIGxpc3Qgb2YgdmFyaWFibGVzIG9mIGEga2luZCBcYSBLaW5kLgorICAvLy8KKyAgLy8vIFxwYXJhbSBLaW5kIEtpbmQgb2YgY3VycmVudCBjbGF1c2UuCisgIC8vLyBccGFyYW0gUGFyc2VPbmx5IHRydWUgdG8gc2tpcCB0aGUgY2xhdXNlJ3Mgc2VtYW50aWMgYWN0aW9ucyBhbmQgcmV0dXJuCisgIC8vLyBudWxscHRyLgorICAvLy8KKyAgT01QQ2xhdXNlICpQYXJzZU9wZW5NUFZhckxpc3RDbGF1c2UoT3Blbk1QRGlyZWN0aXZlS2luZCBES2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3Blbk1QQ2xhdXNlS2luZCBLaW5kLCBib29sIFBhcnNlT25seSk7CisKK3B1YmxpYzoKKyAgLy8vIFBhcnNlcyBzaW1wbGUgZXhwcmVzc2lvbiBpbiBwYXJlbnMgZm9yIHNpbmdsZS1leHByZXNzaW9uIGNsYXVzZXMgb2YgT3Blbk1QCisgIC8vLyBjb25zdHJ1Y3RzLgorICAvLy8gXHBhcmFtIFJMb2MgUmV0dXJuZWQgbG9jYXRpb24gb2YgcmlnaHQgcGFyZW4uCisgIEV4cHJSZXN1bHQgUGFyc2VPcGVuTVBQYXJlbnNFeHByKFN0cmluZ1JlZiBDbGF1c2VOYW1lLCBTb3VyY2VMb2NhdGlvbiAmUkxvYyk7CisKKyAgLy8vIERhdGEgdXNlZCBmb3IgcGFyc2luZyBsaXN0IG9mIHZhcmlhYmxlcyBpbiBPcGVuTVAgY2xhdXNlcy4KKyAgc3RydWN0IE9wZW5NUFZhckxpc3REYXRhVHkgeworICAgIEV4cHIgKlRhaWxFeHByID0gbnVsbHB0cjsKKyAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYzsKKyAgICBDWFhTY29wZVNwZWMgUmVkdWN0aW9uSWRTY29wZVNwZWM7CisgICAgRGVjbGFyYXRpb25OYW1lSW5mbyBSZWR1Y3Rpb25JZDsKKyAgICBPcGVuTVBEZXBlbmRDbGF1c2VLaW5kIERlcEtpbmQgPSBPTVBDX0RFUEVORF91bmtub3duOworICAgIE9wZW5NUExpbmVhckNsYXVzZUtpbmQgTGluS2luZCA9IE9NUENfTElORUFSX3ZhbDsKKyAgICBPcGVuTVBNYXBDbGF1c2VLaW5kIE1hcFR5cGVNb2RpZmllciA9IE9NUENfTUFQX3Vua25vd247CisgICAgT3Blbk1QTWFwQ2xhdXNlS2luZCBNYXBUeXBlID0gT01QQ19NQVBfdW5rbm93bjsKKyAgICBib29sIElzTWFwVHlwZUltcGxpY2l0ID0gZmFsc2U7CisgICAgU291cmNlTG9jYXRpb24gRGVwTGluTWFwTG9jOworICB9OworCisgIC8vLyBQYXJzZXMgY2xhdXNlcyB3aXRoIGxpc3QuCisgIGJvb2wgUGFyc2VPcGVuTVBWYXJMaXN0KE9wZW5NUERpcmVjdGl2ZUtpbmQgREtpbmQsIE9wZW5NUENsYXVzZUtpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEV4cHIgKj4gJlZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5NUFZhckxpc3REYXRhVHkgJkRhdGEpOworICBib29sIFBhcnNlVW5xdWFsaWZpZWRJZChDWFhTY29wZVNwZWMgJlNTLCBib29sIEVudGVyaW5nQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0Rlc3RydWN0b3JOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93Q29uc3RydWN0b3JOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93RGVkdWN0aW9uR3VpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgT2JqZWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24mIFRlbXBsYXRlS1dMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVucXVhbGlmaWVkSWQgJlJlc3VsdCk7CisKK3ByaXZhdGU6CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDKysgMTQ6IFRlbXBsYXRlcyBbdGVtcF0KKworICAvLyBDKysgMTQuMTogVGVtcGxhdGUgUGFyYW1ldGVycyBbdGVtcC5wYXJhbV0KKyAgRGVjbCAqUGFyc2VEZWNsYXJhdGlvblN0YXJ0aW5nV2l0aFRlbXBsYXRlKERlY2xhcmF0b3JDb250ZXh0IENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAmRGVjbEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc1NwZWNpZmllciBBUyA9IEFTX25vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0ICpBY2Nlc3NBdHRycyA9IG51bGxwdHIpOworICBEZWNsICpQYXJzZVRlbXBsYXRlRGVjbGFyYXRpb25PclNwZWNpYWxpemF0aW9uKERlY2xhcmF0b3JDb250ZXh0IENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gJkRlY2xFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzU3BlY2lmaWVyIEFTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3QgKkFjY2Vzc0F0dHJzKTsKKyAgRGVjbCAqUGFyc2VTaW5nbGVEZWNsYXJhdGlvbkFmdGVyVGVtcGxhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdG9yQ29udGV4dCBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyc2VkVGVtcGxhdGVJbmZvICZUZW1wbGF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzaW5nRGVjbFJBSUlPYmplY3QgJkRpYWdzRnJvbVBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICZEZWNsRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzU3BlY2lmaWVyIEFTPUFTX25vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0ICpBY2Nlc3NBdHRycyA9IG51bGxwdHIpOworICBib29sIFBhcnNlVGVtcGxhdGVQYXJhbWV0ZXJzKHVuc2lnbmVkIERlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxOYW1lZERlY2wgKj4gJlRlbXBsYXRlUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICZMQW5nbGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gJlJBbmdsZUxvYyk7CisgIGJvb2wgUGFyc2VUZW1wbGF0ZVBhcmFtZXRlckxpc3QodW5zaWduZWQgRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE5hbWVkRGVjbCo+ICZUZW1wbGF0ZVBhcmFtcyk7CisgIGJvb2wgaXNTdGFydE9mVGVtcGxhdGVUeXBlUGFyYW1ldGVyKCk7CisgIE5hbWVkRGVjbCAqUGFyc2VUZW1wbGF0ZVBhcmFtZXRlcih1bnNpZ25lZCBEZXB0aCwgdW5zaWduZWQgUG9zaXRpb24pOworICBOYW1lZERlY2wgKlBhcnNlVHlwZVBhcmFtZXRlcih1bnNpZ25lZCBEZXB0aCwgdW5zaWduZWQgUG9zaXRpb24pOworICBOYW1lZERlY2wgKlBhcnNlVGVtcGxhdGVUZW1wbGF0ZVBhcmFtZXRlcih1bnNpZ25lZCBEZXB0aCwgdW5zaWduZWQgUG9zaXRpb24pOworICBOYW1lZERlY2wgKlBhcnNlTm9uVHlwZVRlbXBsYXRlUGFyYW1ldGVyKHVuc2lnbmVkIERlcHRoLCB1bnNpZ25lZCBQb3NpdGlvbik7CisgIHZvaWQgRGlhZ25vc2VNaXNwbGFjZWRFbGxpcHNpcyhTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENvcnJlY3RMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFscmVhZHlIYXNFbGxpcHNpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSWRlbnRpZmllckhhc05hbWUpOworICB2b2lkIERpYWdub3NlTWlzcGxhY2VkRWxsaXBzaXNJbkRlY2xhcmF0b3IoU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdG9yICZEKTsKKyAgLy8gQysrIDE0LjM6IFRlbXBsYXRlIGFyZ3VtZW50cyBbdGVtcC5hcmddCisgIHR5cGVkZWYgU21hbGxWZWN0b3I8UGFyc2VkVGVtcGxhdGVBcmd1bWVudCwgMTY+IFRlbXBsYXRlQXJnTGlzdDsKKworICBib29sIFBhcnNlR3JlYXRlclRoYW5JblRlbXBsYXRlTGlzdChTb3VyY2VMb2NhdGlvbiAmUkFuZ2xlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbnN1bWVMYXN0VG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT2JqQ0dlbmVyaWNMaXN0KTsKKyAgYm9vbCBQYXJzZVRlbXBsYXRlSWRBZnRlclRlbXBsYXRlTmFtZShib29sIENvbnN1bWVMYXN0VG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gJkxBbmdsZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUFyZ0xpc3QgJlRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAmUkFuZ2xlTG9jKTsKKworICBib29sIEFubm90YXRlVGVtcGxhdGVJZFRva2VuKFRlbXBsYXRlVHkgVGVtcGxhdGUsIFRlbXBsYXRlTmFtZUtpbmQgVE5LLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnF1YWxpZmllZElkICZUZW1wbGF0ZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd1R5cGVBbm5vdGF0aW9uID0gdHJ1ZSk7CisgIHZvaWQgQW5ub3RhdGVUZW1wbGF0ZUlkVG9rZW5Bc1R5cGUoYm9vbCBJc0NsYXNzTmFtZSA9IGZhbHNlKTsKKyAgYm9vbCBJc1RlbXBsYXRlQXJndW1lbnRMaXN0KHVuc2lnbmVkIFNraXAgPSAwKTsKKyAgYm9vbCBQYXJzZVRlbXBsYXRlQXJndW1lbnRMaXN0KFRlbXBsYXRlQXJnTGlzdCAmVGVtcGxhdGVBcmdzKTsKKyAgUGFyc2VkVGVtcGxhdGVBcmd1bWVudCBQYXJzZVRlbXBsYXRlVGVtcGxhdGVBcmd1bWVudCgpOworICBQYXJzZWRUZW1wbGF0ZUFyZ3VtZW50IFBhcnNlVGVtcGxhdGVBcmd1bWVudCgpOworICBEZWNsICpQYXJzZUV4cGxpY2l0SW5zdGFudGlhdGlvbihEZWNsYXJhdG9yQ29udGV4dCBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFeHRlcm5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAmRGVjbEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzU3BlY2lmaWVyIEFTID0gQVNfbm9uZSk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE1vZHVsZXMKKyAgRGVjbEdyb3VwUHRyVHkgUGFyc2VNb2R1bGVEZWNsKCk7CisgIERlY2wgKlBhcnNlTW9kdWxlSW1wb3J0KFNvdXJjZUxvY2F0aW9uIEF0TG9jKTsKKyAgYm9vbCBwYXJzZU1pc3BsYWNlZE1vZHVsZUltcG9ydCgpOworICBib29sIHRyeVBhcnNlTWlzcGxhY2VkTW9kdWxlSW1wb3J0KCkgeworICAgIHRvazo6VG9rZW5LaW5kIEtpbmQgPSBUb2suZ2V0S2luZCgpOworICAgIGlmIChLaW5kID09IHRvazo6YW5ub3RfbW9kdWxlX2JlZ2luIHx8IEtpbmQgPT0gdG9rOjphbm5vdF9tb2R1bGVfZW5kIHx8CisgICAgICAgIEtpbmQgPT0gdG9rOjphbm5vdF9tb2R1bGVfaW5jbHVkZSkKKyAgICAgIHJldHVybiBwYXJzZU1pc3BsYWNlZE1vZHVsZUltcG9ydCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgUGFyc2VNb2R1bGVOYW1lKAorICAgICAgU291cmNlTG9jYXRpb24gVXNlTG9jLAorICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxJZGVudGlmaWVySW5mbyAqLCBTb3VyY2VMb2NhdGlvbj4+ICZQYXRoLAorICAgICAgYm9vbCBJc0ltcG9ydCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEMrKzExL0crKzogVHlwZSBUcmFpdHMgW1R5cGUtVHJhaXRzLmh0bWwgaW4gdGhlIEdDQyBtYW51YWxdCisgIEV4cHJSZXN1bHQgUGFyc2VUeXBlVHJhaXQoKTsKKyAgCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBFbWJhcmNhZGVybzogQXJhcnkgYW5kIEV4cHJlc3Npb24gVHJhaXRzCisgIEV4cHJSZXN1bHQgUGFyc2VBcnJheVR5cGVUcmFpdCgpOworICBFeHByUmVzdWx0IFBhcnNlRXhwcmVzc2lvblRyYWl0KCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFByZXByb2Nlc3NvciBjb2RlLWNvbXBsZXRpb24gcGFzcy10aHJvdWdoCisgIHZvaWQgQ29kZUNvbXBsZXRlRGlyZWN0aXZlKGJvb2wgSW5Db25kaXRpb25hbCkgb3ZlcnJpZGU7CisgIHZvaWQgQ29kZUNvbXBsZXRlSW5Db25kaXRpb25hbEV4Y2x1c2lvbigpIG92ZXJyaWRlOworICB2b2lkIENvZGVDb21wbGV0ZU1hY3JvTmFtZShib29sIElzRGVmaW5pdGlvbikgb3ZlcnJpZGU7CisgIHZvaWQgQ29kZUNvbXBsZXRlUHJlcHJvY2Vzc29yRXhwcmVzc2lvbigpIG92ZXJyaWRlOworICB2b2lkIENvZGVDb21wbGV0ZU1hY3JvQXJndW1lbnQoSWRlbnRpZmllckluZm8gKk1hY3JvLCBNYWNyb0luZm8gKk1hY3JvSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFyZ3VtZW50SW5kZXgpIG92ZXJyaWRlOworICB2b2lkIENvZGVDb21wbGV0ZU5hdHVyYWxMYW5ndWFnZSgpIG92ZXJyaWRlOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1BhcnNlL1JBSUlPYmplY3RzRm9yUGFyc2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9QYXJzZS9SQUlJT2JqZWN0c0ZvclBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOTQ1M2IKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9QYXJzZS9SQUlJT2JqZWN0c0ZvclBhcnNlci5oCkBAIC0wLDAgKzEsNDY1IEBACisvLz09PS0tLSBSQUlJT2JqZWN0c0ZvclBhcnNlci5oIC0gUkFJSSBoZWxwZXJzIGZvciB0aGUgcGFyc2VyIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFuZCBpbXBsZW1lbnRzIHRoZSBzb21lIHNpbXBsZSBSQUlJIG9iamVjdHMgdGhhdCBhcmUgdXNlZAorLy8gYnkgdGhlIHBhcnNlciB0byBtYW5hZ2UgYml0cyBpbiByZWN1cnNpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0xJQl9QQVJTRV9SQUlJT0JKRUNUU0ZPUlBBUlNFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfTElCX1BBUlNFX1JBSUlPQkpFQ1RTRk9SUEFSU0VSX0gKKworI2luY2x1ZGUgImNsYW5nL1BhcnNlL1BhcnNlRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL1BhcnNlL1BhcnNlci5oIgorI2luY2x1ZGUgImNsYW5nL1NlbWEvRGVsYXllZERpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJjbGFuZy9TZW1hL1BhcnNlZFRlbXBsYXRlLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9TZW1hLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisgIC8vIFRPRE86IG1vdmUgUGFyc2luZ0NsYXNzRGVmaW5pdGlvbiBoZXJlLgorICAvLyBUT0RPOiBtb3ZlIFRlbnRhdGl2ZVBhcnNpbmdBY3Rpb24gaGVyZS4KKworICAvLy8gXGJyaWVmIEEgUkFJSSBvYmplY3QgdXNlZCB0byB0ZW1wb3JhcmlseSBzdXBwcmVzcyBhY2Nlc3MtbGlrZQorICAvLy8gY2hlY2tpbmcuICBBY2Nlc3MtbGlrZSBjaGVja3MgYXJlIHRob3NlIGFzc29jaWF0ZWQgd2l0aAorICAvLy8gY29udHJvbGxpbmcgdGhlIHVzZSBvZiBhIGRlY2xhcmF0aW9uLCBsaWtlIEMrKyBhY2Nlc3MgY29udHJvbAorICAvLy8gZXJyb3JzIGFuZCBkZXByZWNhdGlvbiB3YXJuaW5ncy4gIFRoZXkgYXJlIGNvbnRleHR1YWxseQorICAvLy8gZGVwZW5kZW50LCBpbiB0aGF0IHRoZXkgY2FuIG9ubHkgYmUgcmVzb2x2ZWQgd2l0aCBmdWxsCisgIC8vLyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0J3MgYmVpbmcgZGVjbGFyZWQuICBUaGV5IGFyZSBhbHNvCisgIC8vLyBzdXBwcmVzc2VkIGluIGNlcnRhaW4gY29udGV4dHMsIGxpa2UgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBvZgorICAvLy8gYW4gZXhwbGljaXQgaW5zdGFudGlhdGlvbi4gIEhvd2V2ZXIsIHRob3NlIHN1cHByZXNzaW9uIGNvbnRleHRzCisgIC8vLyBjYW5ub3QgbmVjZXNzYXJpbHkgYmUgZnVsbHkgZGV0ZXJtaW5lZCBpbiBhZHZhbmNlOyAgZm9yCisgIC8vLyBleGFtcGxlLCBzb21ldGhpbmcgc3RhcnRpbmcgbGlrZSB0aGlzOgorICAvLy8gICB0ZW1wbGF0ZSA8PiBjbGFzcyBzdGQ6OnZlY3RvcjxBOjpQcml2YXRlVHlwZT4KKyAgLy8vIG1pZ2h0IGJlIHRoZSBlbnRpcmV0eSBvZiBhbiBleHBsaWNpdCBpbnN0YW50aWF0aW9uOgorICAvLy8gICB0ZW1wbGF0ZSA8PiBjbGFzcyBzdGQ6OnZlY3RvcjxBOjpQcml2YXRlVHlwZT47CisgIC8vLyBvciBqdXN0IGFuIGVsYWJvcmF0ZWQgdHlwZSBzcGVjaWZpZXI6CisgIC8vLyAgIHRlbXBsYXRlIDw+IGNsYXNzIHN0ZDo6dmVjdG9yPEE6OlByaXZhdGVUeXBlPiBtYWtlX3ZlY3Rvcjw+KCk7CisgIC8vLyBUaGVyZWZvcmUgdGhpcyBjbGFzcyBjb2xsZWN0cyBhbGwgdGhlIGRpYWdub3N0aWNzIGFuZCBwZXJtaXRzCisgIC8vLyB0aGVtIHRvIGJlIHJlLWRlbGF5ZWQgaW4gYSBuZXcgY29udGV4dC4KKyAgY2xhc3MgU3VwcHJlc3NBY2Nlc3NDaGVja3MgeworICAgIFNlbWEgJlM7CisgICAgc2VtYTo6RGVsYXllZERpYWdub3N0aWNQb29sIERpYWdub3N0aWNQb29sOworICAgIFNlbWE6OlBhcnNpbmdEZWNsU3RhdGUgU3RhdGU7CisgICAgYm9vbCBBY3RpdmU7CisKKyAgcHVibGljOgorICAgIC8vLyBCZWdpbiBzdXBwcmVzc2luZyBhY2Nlc3MtbGlrZSBjaGVja3MgCisgICAgU3VwcHJlc3NBY2Nlc3NDaGVja3MoUGFyc2VyICZQLCBib29sIGFjdGl2YXRlID0gdHJ1ZSkKKyAgICAgICAgOiBTKFAuZ2V0QWN0aW9ucygpKSwgRGlhZ25vc3RpY1Bvb2wobnVsbHB0cikgeworICAgICAgaWYgKGFjdGl2YXRlKSB7CisgICAgICAgIFN0YXRlID0gUy5QdXNoUGFyc2luZ0RlY2xhcmF0aW9uKERpYWdub3N0aWNQb29sKTsKKyAgICAgICAgQWN0aXZlID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFjdGl2ZSA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBTdXBwcmVzc0FjY2Vzc0NoZWNrcyhTdXBwcmVzc0FjY2Vzc0NoZWNrcyAmJk90aGVyKQorICAgICAgOiBTKE90aGVyLlMpLCBEaWFnbm9zdGljUG9vbChzdGQ6Om1vdmUoT3RoZXIuRGlhZ25vc3RpY1Bvb2wpKSwKKyAgICAgICAgU3RhdGUoT3RoZXIuU3RhdGUpLCBBY3RpdmUoT3RoZXIuQWN0aXZlKSB7CisgICAgICBPdGhlci5BY3RpdmUgPSBmYWxzZTsKKyAgICB9CisgICAgdm9pZCBvcGVyYXRvcj0oU3VwcHJlc3NBY2Nlc3NDaGVja3MgJiZPdGhlcikgPSBkZWxldGU7CisKKyAgICB2b2lkIGRvbmUoKSB7CisgICAgICBhc3NlcnQoQWN0aXZlICYmICJ0cnlpbmcgdG8gZW5kIGFuIGluYWN0aXZlIHN1cHByZXNzaW9uIik7CisgICAgICBTLlBvcFBhcnNpbmdEZWNsYXJhdGlvbihTdGF0ZSwgbnVsbHB0cik7CisgICAgICBBY3RpdmUgPSBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIHJlZGVsYXkoKSB7CisgICAgICBhc3NlcnQoIUFjdGl2ZSAmJiAicmVkZWxheWluZyB3aXRob3V0IGhhdmluZyBlbmRlZCBmaXJzdCIpOworICAgICAgaWYgKCFEaWFnbm9zdGljUG9vbC5wb29sX2VtcHR5KCkpCisgICAgICAgIFMucmVkZWxheURpYWdub3N0aWNzKERpYWdub3N0aWNQb29sKTsKKyAgICAgIGFzc2VydChEaWFnbm9zdGljUG9vbC5wb29sX2VtcHR5KCkpOworICAgIH0KKworICAgIH5TdXBwcmVzc0FjY2Vzc0NoZWNrcygpIHsKKyAgICAgIGlmIChBY3RpdmUpIGRvbmUoKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFxicmllZiBSQUlJIG9iamVjdCB1c2VkIHRvIGluZm9ybSB0aGUgYWN0aW9ucyB0aGF0IHdlJ3JlCisgIC8vLyBjdXJyZW50bHkgcGFyc2luZyBhIGRlY2xhcmF0aW9uLiAgVGhpcyBpcyBhY3RpdmUgd2hlbiBwYXJzaW5nIGEKKyAgLy8vIHZhcmlhYmxlJ3MgaW5pdGlhbGl6ZXIsIGJ1dCBub3Qgd2hlbiBwYXJzaW5nIHRoZSBib2R5IG9mIGEKKyAgLy8vIGNsYXNzIG9yIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgIGNsYXNzIFBhcnNpbmdEZWNsUkFJSU9iamVjdCB7CisgICAgU2VtYSAmQWN0aW9uczsKKyAgICBzZW1hOjpEZWxheWVkRGlhZ25vc3RpY1Bvb2wgRGlhZ25vc3RpY1Bvb2w7CisgICAgU2VtYTo6UGFyc2luZ0RlY2xTdGF0ZSBTdGF0ZTsKKyAgICBib29sIFBvcHBlZDsKKworICAgIFBhcnNpbmdEZWNsUkFJSU9iamVjdChjb25zdCBQYXJzaW5nRGVjbFJBSUlPYmplY3QgJikgPSBkZWxldGU7CisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgUGFyc2luZ0RlY2xSQUlJT2JqZWN0ICYpID0gZGVsZXRlOworCisgIHB1YmxpYzoKKyAgICBlbnVtIE5vUGFyZW50X3QgeyBOb1BhcmVudCB9OworICAgIFBhcnNpbmdEZWNsUkFJSU9iamVjdChQYXJzZXIgJlAsIE5vUGFyZW50X3QgXykKKyAgICAgICAgOiBBY3Rpb25zKFAuZ2V0QWN0aW9ucygpKSwgRGlhZ25vc3RpY1Bvb2wobnVsbHB0cikgeworICAgICAgcHVzaCgpOworICAgIH0KKworICAgIC8vLyBDcmVhdGVzIGEgUkFJSSBvYmplY3Qgd2hvc2UgcG9vbCBpcyBvcHRpb25hbGx5IHBhcmVudGVkIGJ5IGFub3RoZXIuCisgICAgUGFyc2luZ0RlY2xSQUlJT2JqZWN0KFBhcnNlciAmUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VtYTo6RGVsYXllZERpYWdub3N0aWNQb29sICpwYXJlbnRQb29sKQorICAgICAgICA6IEFjdGlvbnMoUC5nZXRBY3Rpb25zKCkpLCBEaWFnbm9zdGljUG9vbChwYXJlbnRQb29sKSB7CisgICAgICBwdXNoKCk7CisgICAgfQorCisgICAgLy8vIENyZWF0ZXMgYSBSQUlJIG9iamVjdCBhbmQsIG9wdGlvbmFsbHksIGluaXRpYWxpemUgaXRzCisgICAgLy8vIGRpYWdub3N0aWNzIHBvb2wgYnkgc3RlYWxpbmcgdGhlIGRpYWdub3N0aWNzIGZyb20gYW5vdGhlcgorICAgIC8vLyBSQUlJIG9iamVjdCAod2hpY2ggaXMgYXNzdW1lZCB0byBiZSB0aGUgY3VycmVudCB0b3AgcG9vbCkuCisgICAgUGFyc2luZ0RlY2xSQUlJT2JqZWN0KFBhcnNlciAmUCwgUGFyc2luZ0RlY2xSQUlJT2JqZWN0ICpvdGhlcikKKyAgICAgICAgOiBBY3Rpb25zKFAuZ2V0QWN0aW9ucygpKSwKKyAgICAgICAgICBEaWFnbm9zdGljUG9vbChvdGhlciA/IG90aGVyLT5EaWFnbm9zdGljUG9vbC5nZXRQYXJlbnQoKSA6IG51bGxwdHIpIHsKKyAgICAgIGlmIChvdGhlcikgeworICAgICAgICBEaWFnbm9zdGljUG9vbC5zdGVhbChvdGhlci0+RGlhZ25vc3RpY1Bvb2wpOworICAgICAgICBvdGhlci0+YWJvcnQoKTsKKyAgICAgIH0KKyAgICAgIHB1c2goKTsKKyAgICB9CisKKyAgICB+UGFyc2luZ0RlY2xSQUlJT2JqZWN0KCkgeworICAgICAgYWJvcnQoKTsKKyAgICB9CisKKyAgICBzZW1hOjpEZWxheWVkRGlhZ25vc3RpY1Bvb2wgJmdldERlbGF5ZWREaWFnbm9zdGljUG9vbCgpIHsKKyAgICAgIHJldHVybiBEaWFnbm9zdGljUG9vbDsKKyAgICB9CisgICAgY29uc3Qgc2VtYTo6RGVsYXllZERpYWdub3N0aWNQb29sICZnZXREZWxheWVkRGlhZ25vc3RpY1Bvb2woKSBjb25zdCB7CisgICAgICByZXR1cm4gRGlhZ25vc3RpY1Bvb2w7CisgICAgfQorCisgICAgLy8vIFJlc2V0cyB0aGUgUkFJSSBvYmplY3QgZm9yIGEgbmV3IGRlY2xhcmF0aW9uLgorICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICBhYm9ydCgpOworICAgICAgcHVzaCgpOworICAgIH0KKworICAgIC8vLyBTaWduYWxzIHRoYXQgdGhlIGNvbnRleHQgd2FzIGNvbXBsZXRlZCB3aXRob3V0IGFuIGFwcHJvcHJpYXRlCisgICAgLy8vIGRlY2xhcmF0aW9uIGJlaW5nIHBhcnNlZC4KKyAgICB2b2lkIGFib3J0KCkgeworICAgICAgcG9wKG51bGxwdHIpOworICAgIH0KKworICAgIHZvaWQgY29tcGxldGUoRGVjbCAqRCkgeworICAgICAgYXNzZXJ0KCFQb3BwZWQgJiYgIlBhcnNpbmdEZWNsYXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHBvcHBlZCEiKTsKKyAgICAgIHBvcChEKTsKKyAgICB9CisKKyAgICAvLy8gVW5yZWdpc3RlciB0aGlzIG9iamVjdCBmcm9tIFNlbWEsIGJ1dCByZW1lbWJlciBhbGwgdGhlCisgICAgLy8vIGRpYWdub3N0aWNzIHRoYXQgd2VyZSBlbWl0dGVkIGludG8gaXQuCisgICAgdm9pZCBhYm9ydEFuZFJlbWVtYmVyKCkgeworICAgICAgcG9wKG51bGxwdHIpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHZvaWQgcHVzaCgpIHsKKyAgICAgIFN0YXRlID0gQWN0aW9ucy5QdXNoUGFyc2luZ0RlY2xhcmF0aW9uKERpYWdub3N0aWNQb29sKTsKKyAgICAgIFBvcHBlZCA9IGZhbHNlOworICAgIH0KKworICAgIHZvaWQgcG9wKERlY2wgKkQpIHsKKyAgICAgIGlmICghUG9wcGVkKSB7CisgICAgICAgIEFjdGlvbnMuUG9wUGFyc2luZ0RlY2xhcmF0aW9uKFN0YXRlLCBEKTsKKyAgICAgICAgUG9wcGVkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgLy8vIEEgY2xhc3MgZm9yIHBhcnNpbmcgYSBEZWNsU3BlYy4KKyAgY2xhc3MgUGFyc2luZ0RlY2xTcGVjIDogcHVibGljIERlY2xTcGVjIHsKKyAgICBQYXJzaW5nRGVjbFJBSUlPYmplY3QgUGFyc2luZ1JBSUk7CisKKyAgcHVibGljOgorICAgIFBhcnNpbmdEZWNsU3BlYyhQYXJzZXIgJlApCisgICAgICA6IERlY2xTcGVjKFAuZ2V0QXR0ckZhY3RvcnkoKSksCisgICAgICAgIFBhcnNpbmdSQUlJKFAsIFBhcnNpbmdEZWNsUkFJSU9iamVjdDo6Tm9QYXJlbnQpIHt9CisgICAgUGFyc2luZ0RlY2xTcGVjKFBhcnNlciAmUCwgUGFyc2luZ0RlY2xSQUlJT2JqZWN0ICpSQUlJKQorICAgICAgOiBEZWNsU3BlYyhQLmdldEF0dHJGYWN0b3J5KCkpLAorICAgICAgICBQYXJzaW5nUkFJSShQLCBSQUlJKSB7fQorCisgICAgY29uc3Qgc2VtYTo6RGVsYXllZERpYWdub3N0aWNQb29sICZnZXREZWxheWVkRGlhZ25vc3RpY1Bvb2woKSBjb25zdCB7CisgICAgICByZXR1cm4gUGFyc2luZ1JBSUkuZ2V0RGVsYXllZERpYWdub3N0aWNQb29sKCk7CisgICAgfQorCisgICAgdm9pZCBjb21wbGV0ZShEZWNsICpEKSB7CisgICAgICBQYXJzaW5nUkFJSS5jb21wbGV0ZShEKTsKKyAgICB9CisKKyAgICB2b2lkIGFib3J0KCkgeworICAgICAgUGFyc2luZ1JBSUkuYWJvcnQoKTsKKyAgICB9CisgIH07CisKKyAgLy8vIEEgY2xhc3MgZm9yIHBhcnNpbmcgYSBkZWNsYXJhdG9yLgorICBjbGFzcyBQYXJzaW5nRGVjbGFyYXRvciA6IHB1YmxpYyBEZWNsYXJhdG9yIHsKKyAgICBQYXJzaW5nRGVjbFJBSUlPYmplY3QgUGFyc2luZ1JBSUk7CisKKyAgcHVibGljOgorICAgIFBhcnNpbmdEZWNsYXJhdG9yKFBhcnNlciAmUCwgY29uc3QgUGFyc2luZ0RlY2xTcGVjICZEUywgRGVjbGFyYXRvckNvbnRleHQgQykKKyAgICAgIDogRGVjbGFyYXRvcihEUywgQyksIFBhcnNpbmdSQUlJKFAsICZEUy5nZXREZWxheWVkRGlhZ25vc3RpY1Bvb2woKSkgeworICAgIH0KKworICAgIGNvbnN0IFBhcnNpbmdEZWNsU3BlYyAmZ2V0RGVjbFNwZWMoKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgUGFyc2luZ0RlY2xTcGVjJj4oRGVjbGFyYXRvcjo6Z2V0RGVjbFNwZWMoKSk7CisgICAgfQorCisgICAgUGFyc2luZ0RlY2xTcGVjICZnZXRNdXRhYmxlRGVjbFNwZWMoKSBjb25zdCB7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxQYXJzaW5nRGVjbFNwZWMmPihnZXREZWNsU3BlYygpKTsKKyAgICB9CisKKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgRGVjbGFyYXRvcjo6Y2xlYXIoKTsKKyAgICAgIFBhcnNpbmdSQUlJLnJlc2V0KCk7CisgICAgfQorCisgICAgdm9pZCBjb21wbGV0ZShEZWNsICpEKSB7CisgICAgICBQYXJzaW5nUkFJSS5jb21wbGV0ZShEKTsKKyAgICB9CisgIH07CisKKyAgLy8vIEEgY2xhc3MgZm9yIHBhcnNpbmcgYSBmaWVsZCBkZWNsYXJhdG9yLgorICBjbGFzcyBQYXJzaW5nRmllbGREZWNsYXJhdG9yIDogcHVibGljIEZpZWxkRGVjbGFyYXRvciB7CisgICAgUGFyc2luZ0RlY2xSQUlJT2JqZWN0IFBhcnNpbmdSQUlJOworCisgIHB1YmxpYzoKKyAgICBQYXJzaW5nRmllbGREZWNsYXJhdG9yKFBhcnNlciAmUCwgY29uc3QgUGFyc2luZ0RlY2xTcGVjICZEUykKKyAgICAgIDogRmllbGREZWNsYXJhdG9yKERTKSwgUGFyc2luZ1JBSUkoUCwgJkRTLmdldERlbGF5ZWREaWFnbm9zdGljUG9vbCgpKSB7CisgICAgfQorCisgICAgY29uc3QgUGFyc2luZ0RlY2xTcGVjICZnZXREZWNsU3BlYygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBQYXJzaW5nRGVjbFNwZWMmPihELmdldERlY2xTcGVjKCkpOworICAgIH0KKworICAgIFBhcnNpbmdEZWNsU3BlYyAmZ2V0TXV0YWJsZURlY2xTcGVjKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8UGFyc2luZ0RlY2xTcGVjJj4oZ2V0RGVjbFNwZWMoKSk7CisgICAgfQorCisgICAgdm9pZCBjb21wbGV0ZShEZWNsICpEKSB7CisgICAgICBQYXJzaW5nUkFJSS5jb21wbGV0ZShEKTsKKyAgICB9CisgIH07CisKKyAgLy8vIEV4dGVuc2lvblJBSUlPYmplY3QgLSBUaGlzIHNhdmVzIHRoZSBzdGF0ZSBvZiBleHRlbnNpb24gd2FybmluZ3Mgd2hlbgorICAvLy8gY29uc3RydWN0ZWQgYW5kIGRpc2FibGVzIHRoZW0uICBXaGVuIGRlc3RydWN0ZWQsIGl0IHJlc3RvcmVzIHRoZW0gYmFjayB0bworICAvLy8gdGhlIHdheSB0aGV5IHVzZWQgdG8gYmUuICBUaGlzIGlzIHVzZWQgdG8gaGFuZGxlIF9fZXh0ZW5zaW9uX18gaW4gdGhlCisgIC8vLyBwYXJzZXIuCisgIGNsYXNzIEV4dGVuc2lvblJBSUlPYmplY3QgeworICAgIEV4dGVuc2lvblJBSUlPYmplY3QoY29uc3QgRXh0ZW5zaW9uUkFJSU9iamVjdCAmKSA9IGRlbGV0ZTsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBFeHRlbnNpb25SQUlJT2JqZWN0ICYpID0gZGVsZXRlOworCisgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzOworICBwdWJsaWM6CisgICAgRXh0ZW5zaW9uUkFJSU9iamVjdChEaWFnbm9zdGljc0VuZ2luZSAmZGlhZ3MpIDogRGlhZ3MoZGlhZ3MpIHsKKyAgICAgIERpYWdzLkluY3JlbWVudEFsbEV4dGVuc2lvbnNTaWxlbmNlZCgpOworICAgIH0KKworICAgIH5FeHRlbnNpb25SQUlJT2JqZWN0KCkgeworICAgICAgRGlhZ3MuRGVjcmVtZW50QWxsRXh0ZW5zaW9uc1NpbGVuY2VkKCk7CisgICAgfQorICB9OworICAKKyAgLy8vIENvbG9uUHJvdGVjdGlvblJBSUlPYmplY3QgLSBUaGlzIHNldHMgdGhlIFBhcnNlcjo6Q29sb25Jc1NhY3JlZCBib29sIGFuZAorICAvLy8gcmVzdG9yZXMgaXQgd2hlbiBkZXN0cm95ZWQuICBUaGlzIHNheXMgdGhhdCAiZm9vOiIgc2hvdWxkIG5vdCBiZQorICAvLy8gY29uc2lkZXJlZCBhIHBvc3NpYmxlIHR5cG8gZm9yICJmb286OiIgZm9yIGVycm9yIHJlY292ZXJ5IHB1cnBvc2VzLgorICBjbGFzcyBDb2xvblByb3RlY3Rpb25SQUlJT2JqZWN0IHsKKyAgICBQYXJzZXIgJlA7CisgICAgYm9vbCBPbGRWYWw7CisgIHB1YmxpYzoKKyAgICBDb2xvblByb3RlY3Rpb25SQUlJT2JqZWN0KFBhcnNlciAmcCwgYm9vbCBWYWx1ZSA9IHRydWUpCisgICAgICA6IFAocCksIE9sZFZhbChQLkNvbG9uSXNTYWNyZWQpIHsKKyAgICAgIFAuQ29sb25Jc1NhY3JlZCA9IFZhbHVlOworICAgIH0KKyAgICAKKyAgICAvLy8gcmVzdG9yZSAtIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVzdG9yZSB0aGUgc3RhdGUgZWFybHksIGJlZm9yZSB0aGUgZHRvcgorICAgIC8vLyBpcyBydW4uCisgICAgdm9pZCByZXN0b3JlKCkgeworICAgICAgUC5Db2xvbklzU2FjcmVkID0gT2xkVmFsOworICAgIH0KKyAgICAKKyAgICB+Q29sb25Qcm90ZWN0aW9uUkFJSU9iamVjdCgpIHsKKyAgICAgIHJlc3RvcmUoKTsKKyAgICB9CisgIH07CisgIAorICAvLy8gXGJyaWVmIFJBSUkgb2JqZWN0IHRoYXQgbWFrZXMgJz4nIGJlaGF2ZSBlaXRoZXIgYXMgYW4gb3BlcmF0b3IKKyAgLy8vIG9yIGFzIHRoZSBjbG9zaW5nIGFuZ2xlIGJyYWNrZXQgZm9yIGEgdGVtcGxhdGUgYXJndW1lbnQgbGlzdC4KKyAgY2xhc3MgR3JlYXRlclRoYW5Jc09wZXJhdG9yU2NvcGUgeworICAgIGJvb2wgJkdyZWF0ZXJUaGFuSXNPcGVyYXRvcjsKKyAgICBib29sIE9sZEdyZWF0ZXJUaGFuSXNPcGVyYXRvcjsKKyAgcHVibGljOgorICAgIEdyZWF0ZXJUaGFuSXNPcGVyYXRvclNjb3BlKGJvb2wgJkdUSU8sIGJvb2wgVmFsKQorICAgIDogR3JlYXRlclRoYW5Jc09wZXJhdG9yKEdUSU8pLCBPbGRHcmVhdGVyVGhhbklzT3BlcmF0b3IoR1RJTykgeworICAgICAgR3JlYXRlclRoYW5Jc09wZXJhdG9yID0gVmFsOworICAgIH0KKyAgICAKKyAgICB+R3JlYXRlclRoYW5Jc09wZXJhdG9yU2NvcGUoKSB7CisgICAgICBHcmVhdGVyVGhhbklzT3BlcmF0b3IgPSBPbGRHcmVhdGVyVGhhbklzT3BlcmF0b3I7CisgICAgfQorICB9OworICAKKyAgY2xhc3MgSW5NZXNzYWdlRXhwcmVzc2lvblJBSUlPYmplY3QgeworICAgIGJvb2wgJkluTWVzc2FnZUV4cHJlc3Npb247CisgICAgYm9vbCBPbGRWYWx1ZTsKKyAgICAKKyAgcHVibGljOgorICAgIEluTWVzc2FnZUV4cHJlc3Npb25SQUlJT2JqZWN0KFBhcnNlciAmUCwgYm9vbCBWYWx1ZSkKKyAgICAgIDogSW5NZXNzYWdlRXhwcmVzc2lvbihQLkluTWVzc2FnZUV4cHJlc3Npb24pLCAKKyAgICAgICAgT2xkVmFsdWUoUC5Jbk1lc3NhZ2VFeHByZXNzaW9uKSB7CisgICAgICBJbk1lc3NhZ2VFeHByZXNzaW9uID0gVmFsdWU7CisgICAgfQorICAgIAorICAgIH5Jbk1lc3NhZ2VFeHByZXNzaW9uUkFJSU9iamVjdCgpIHsKKyAgICAgIEluTWVzc2FnZUV4cHJlc3Npb24gPSBPbGRWYWx1ZTsKKyAgICB9CisgIH07CisgIAorICAvLy8gXGJyaWVmIFJBSUkgb2JqZWN0IHRoYXQgbWFrZXMgc3VyZSBwYXJlbi9icmFja2V0L2JyYWNlIGNvdW50IGlzIGNvcnJlY3QKKyAgLy8vIGFmdGVyIGRlY2xhcmF0aW9uL3N0YXRlbWVudCBwYXJzaW5nLCBldmVuIHdoZW4gdGhlcmUncyBhIHBhcnNpbmcgZXJyb3IuCisgIGNsYXNzIFBhcmVuQnJhY2VCcmFja2V0QmFsYW5jZXIgeworICAgIFBhcnNlciAmUDsKKyAgICB1bnNpZ25lZCBzaG9ydCBQYXJlbkNvdW50LCBCcmFja2V0Q291bnQsIEJyYWNlQ291bnQ7CisgIHB1YmxpYzoKKyAgICBQYXJlbkJyYWNlQnJhY2tldEJhbGFuY2VyKFBhcnNlciAmcCkKKyAgICAgIDogUChwKSwgUGFyZW5Db3VudChwLlBhcmVuQ291bnQpLCBCcmFja2V0Q291bnQocC5CcmFja2V0Q291bnQpLAorICAgICAgICBCcmFjZUNvdW50KHAuQnJhY2VDb3VudCkgeyB9CisgICAgCisgICAgflBhcmVuQnJhY2VCcmFja2V0QmFsYW5jZXIoKSB7CisgICAgICBQLlBhcmVuQ291bnQgPSBQYXJlbkNvdW50OworICAgICAgUC5CcmFja2V0Q291bnQgPSBCcmFja2V0Q291bnQ7CisgICAgICBQLkJyYWNlQ291bnQgPSBCcmFjZUNvdW50OworICAgIH0KKyAgfTsKKworICBjbGFzcyBQb2lzb25TRUhJZGVudGlmaWVyc1JBSUlPYmplY3QgeworICAgIFBvaXNvbklkZW50aWZpZXJSQUlJT2JqZWN0IElkZW50X0Fibm9ybWFsVGVybWluYXRpb247CisgICAgUG9pc29uSWRlbnRpZmllclJBSUlPYmplY3QgSWRlbnRfR2V0RXhjZXB0aW9uQ29kZTsKKyAgICBQb2lzb25JZGVudGlmaWVyUkFJSU9iamVjdCBJZGVudF9HZXRFeGNlcHRpb25JbmZvOworICAgIFBvaXNvbklkZW50aWZpZXJSQUlJT2JqZWN0IElkZW50X19hYm5vcm1hbF90ZXJtaW5hdGlvbjsKKyAgICBQb2lzb25JZGVudGlmaWVyUkFJSU9iamVjdCBJZGVudF9fZXhjZXB0aW9uX2NvZGU7CisgICAgUG9pc29uSWRlbnRpZmllclJBSUlPYmplY3QgSWRlbnRfX2V4Y2VwdGlvbl9pbmZvOworICAgIFBvaXNvbklkZW50aWZpZXJSQUlJT2JqZWN0IElkZW50X19fYWJub3JtYWxfdGVybWluYXRpb247CisgICAgUG9pc29uSWRlbnRpZmllclJBSUlPYmplY3QgSWRlbnRfX19leGNlcHRpb25fY29kZTsKKyAgICBQb2lzb25JZGVudGlmaWVyUkFJSU9iamVjdCBJZGVudF9fX2V4Y2VwdGlvbl9pbmZvOworICBwdWJsaWM6CisgICAgUG9pc29uU0VISWRlbnRpZmllcnNSQUlJT2JqZWN0KFBhcnNlciAmU2VsZiwgYm9vbCBOZXdWYWx1ZSkKKyAgICAgIDogSWRlbnRfQWJub3JtYWxUZXJtaW5hdGlvbihTZWxmLklkZW50X0Fibm9ybWFsVGVybWluYXRpb24sIE5ld1ZhbHVlKSwKKyAgICAgICAgSWRlbnRfR2V0RXhjZXB0aW9uQ29kZShTZWxmLklkZW50X0dldEV4Y2VwdGlvbkNvZGUsIE5ld1ZhbHVlKSwKKyAgICAgICAgSWRlbnRfR2V0RXhjZXB0aW9uSW5mbyhTZWxmLklkZW50X0dldEV4Y2VwdGlvbkluZm8sIE5ld1ZhbHVlKSwKKyAgICAgICAgSWRlbnRfX2Fibm9ybWFsX3Rlcm1pbmF0aW9uKFNlbGYuSWRlbnRfX2Fibm9ybWFsX3Rlcm1pbmF0aW9uLCBOZXdWYWx1ZSksCisgICAgICAgIElkZW50X19leGNlcHRpb25fY29kZShTZWxmLklkZW50X19leGNlcHRpb25fY29kZSwgTmV3VmFsdWUpLAorICAgICAgICBJZGVudF9fZXhjZXB0aW9uX2luZm8oU2VsZi5JZGVudF9fZXhjZXB0aW9uX2luZm8sIE5ld1ZhbHVlKSwKKyAgICAgICAgSWRlbnRfX19hYm5vcm1hbF90ZXJtaW5hdGlvbihTZWxmLklkZW50X19fYWJub3JtYWxfdGVybWluYXRpb24sIE5ld1ZhbHVlKSwKKyAgICAgICAgSWRlbnRfX19leGNlcHRpb25fY29kZShTZWxmLklkZW50X19fZXhjZXB0aW9uX2NvZGUsIE5ld1ZhbHVlKSwKKyAgICAgICAgSWRlbnRfX19leGNlcHRpb25faW5mbyhTZWxmLklkZW50X19fZXhjZXB0aW9uX2luZm8sIE5ld1ZhbHVlKSB7CisgICAgfQorICB9OworCisgIC8vLyBcYnJpZWYgUkFJSSBjbGFzcyB0aGF0IGhlbHBzIGhhbmRsZSB0aGUgcGFyc2luZyBvZiBhbiBvcGVuL2Nsb3NlIGRlbGltaXRlcgorICAvLy8gcGFpciwgc3VjaCBhcyBicmFjZXMgeyAuLi4gfSBvciBwYXJlbnRoZXNlcyAoIC4uLiApLgorICBjbGFzcyBCYWxhbmNlZERlbGltaXRlclRyYWNrZXIgOiBwdWJsaWMgR3JlYXRlclRoYW5Jc09wZXJhdG9yU2NvcGUgeworICAgIFBhcnNlciYgUDsKKyAgICB0b2s6OlRva2VuS2luZCBLaW5kLCBDbG9zZSwgRmluYWxUb2tlbjsKKyAgICBTb3VyY2VMb2NhdGlvbiAoUGFyc2VyOjoqQ29uc3VtZXIpKCk7CisgICAgU291cmNlTG9jYXRpb24gTE9wZW4sIExDbG9zZTsKKyAgICAKKyAgICB1bnNpZ25lZCBzaG9ydCAmZ2V0RGVwdGgoKSB7CisgICAgICBzd2l0Y2ggKEtpbmQpIHsKKyAgICAgICAgY2FzZSB0b2s6OmxfYnJhY2U6IHJldHVybiBQLkJyYWNlQ291bnQ7CisgICAgICAgIGNhc2UgdG9rOjpsX3NxdWFyZTogcmV0dXJuIFAuQnJhY2tldENvdW50OworICAgICAgICBjYXNlIHRvazo6bF9wYXJlbjogcmV0dXJuIFAuUGFyZW5Db3VudDsKKyAgICAgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiV3JvbmcgdG9rZW4ga2luZCIpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBib29sIGRpYWdub3NlT3ZlcmZsb3coKTsKKyAgICBib29sIGRpYWdub3NlTWlzc2luZ0Nsb3NlKCk7CisgICAgCisgIHB1YmxpYzoKKyAgICBCYWxhbmNlZERlbGltaXRlclRyYWNrZXIoUGFyc2VyJiBwLCB0b2s6OlRva2VuS2luZCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6OlRva2VuS2luZCBGaW5hbFRva2VuID0gdG9rOjpzZW1pKQorICAgICAgOiBHcmVhdGVyVGhhbklzT3BlcmF0b3JTY29wZShwLkdyZWF0ZXJUaGFuSXNPcGVyYXRvciwgdHJ1ZSksCisgICAgICAgIFAocCksIEtpbmQoayksIEZpbmFsVG9rZW4oRmluYWxUb2tlbikKKyAgICB7CisgICAgICBzd2l0Y2ggKEtpbmQpIHsKKyAgICAgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBiYWxhbmNlZCB0b2tlbiIpOworICAgICAgICBjYXNlIHRvazo6bF9icmFjZToKKyAgICAgICAgICBDbG9zZSA9IHRvazo6cl9icmFjZTsgCisgICAgICAgICAgQ29uc3VtZXIgPSAmUGFyc2VyOjpDb25zdW1lQnJhY2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdG9rOjpsX3BhcmVuOgorICAgICAgICAgIENsb3NlID0gdG9rOjpyX3BhcmVuOyAKKyAgICAgICAgICBDb25zdW1lciA9ICZQYXJzZXI6OkNvbnN1bWVQYXJlbjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAKKyAgICAgICAgY2FzZSB0b2s6Omxfc3F1YXJlOgorICAgICAgICAgIENsb3NlID0gdG9rOjpyX3NxdWFyZTsgCisgICAgICAgICAgQ29uc3VtZXIgPSAmUGFyc2VyOjpDb25zdW1lQnJhY2tldDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0gICAgICAKKyAgICB9CisgICAgCisgICAgU291cmNlTG9jYXRpb24gZ2V0T3BlbkxvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gTE9wZW47IH0KKyAgICBTb3VyY2VMb2NhdGlvbiBnZXRDbG9zZUxvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gTENsb3NlOyB9CisgICAgU291cmNlUmFuZ2UgZ2V0UmFuZ2UoKSBjb25zdCB7IHJldHVybiBTb3VyY2VSYW5nZShMT3BlbiwgTENsb3NlKTsgfQorICAgIAorICAgIGJvb2wgY29uc3VtZU9wZW4oKSB7CisgICAgICBpZiAoIVAuVG9rLmlzKEtpbmQpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIAorICAgICAgaWYgKGdldERlcHRoKCkgPCBQLmdldExhbmdPcHRzKCkuQnJhY2tldERlcHRoKSB7CisgICAgICAgIExPcGVuID0gKFAuKkNvbnN1bWVyKSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAKKyAgICAgIHJldHVybiBkaWFnbm9zZU92ZXJmbG93KCk7CisgICAgfQorCisgICAgYm9vbCBleHBlY3RBbmRDb25zdW1lKHVuc2lnbmVkIERpYWdJRCA9IGRpYWc6OmVycl9leHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTXNnID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6VG9rZW5LaW5kIFNraXBUb1RvayA9IHRvazo6dW5rbm93bik7CisgICAgYm9vbCBjb25zdW1lQ2xvc2UoKSB7CisgICAgICBpZiAoUC5Ub2suaXMoQ2xvc2UpKSB7CisgICAgICAgIExDbG9zZSA9IChQLipDb25zdW1lcikoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIGlmIChQLlRvay5pcyh0b2s6OnNlbWkpICYmIFAuTmV4dFRva2VuKCkuaXMoQ2xvc2UpKSB7CisgICAgICAgIFNvdXJjZUxvY2F0aW9uIFNlbWlMb2MgPSBQLkNvbnN1bWVUb2tlbigpOworICAgICAgICBQLkRpYWcoU2VtaUxvYywgZGlhZzo6ZXJyX3VuZXhwZWN0ZWRfc2VtaSkKKyAgICAgICAgICAgIDw8IENsb3NlIDw8IEZpeEl0SGludDo6Q3JlYXRlUmVtb3ZhbChTb3VyY2VSYW5nZShTZW1pTG9jLCBTZW1pTG9jKSk7CisgICAgICAgIExDbG9zZSA9IChQLipDb25zdW1lcikoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gZGlhZ25vc2VNaXNzaW5nQ2xvc2UoKTsKKyAgICB9CisgICAgdm9pZCBza2lwVG9FbmQoKTsKKyAgfTsKKworICAvLy8gXGJyaWVmIFJBSUlPYmplY3QgdG8gZGVzdHJveSB0aGUgY29udGVudHMgb2YgYSBTbWFsbFZlY3RvciBvZgorICAvLy8gVGVtcGxhdGVJZEFubm90YXRpb24gcG9pbnRlcnMgYW5kIGNsZWFyIHRoZSB2ZWN0b3IuCisgIGNsYXNzIERlc3Ryb3lUZW1wbGF0ZUlkQW5ub3RhdGlvbnNSQUlJT2JqIHsKKyAgICBTbWFsbFZlY3RvckltcGw8VGVtcGxhdGVJZEFubm90YXRpb24gKj4gJkNvbnRhaW5lcjsKKworICBwdWJsaWM6CisgICAgRGVzdHJveVRlbXBsYXRlSWRBbm5vdGF0aW9uc1JBSUlPYmooCisgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxUZW1wbGF0ZUlkQW5ub3RhdGlvbiAqPiAmQ29udGFpbmVyKQorICAgICAgICA6IENvbnRhaW5lcihDb250YWluZXIpIHt9CisKKyAgICB+RGVzdHJveVRlbXBsYXRlSWRBbm5vdGF0aW9uc1JBSUlPYmooKSB7CisgICAgICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxUZW1wbGF0ZUlkQW5ub3RhdGlvbiAqPjo6aXRlcmF0b3IgSSA9CisgICAgICAgICAgICAgICBDb250YWluZXIuYmVnaW4oKSwKKyAgICAgICAgICAgICBFID0gQ29udGFpbmVyLmVuZCgpOworICAgICAgICAgICBJICE9IEU7ICsrSSkKKyAgICAgICAgKCpJKS0+RGVzdHJveSgpOworICAgICAgQ29udGFpbmVyLmNsZWFyKCk7CisgICAgfQorICB9OworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Db3JlL0RlbHRhVHJlZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Db3JlL0RlbHRhVHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OThlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9SZXdyaXRlL0NvcmUvRGVsdGFUcmVlLmgKQEAgLTAsMCArMSw1MSBAQAorLy89PT0tIERlbHRhVHJlZS5oIC0gQi1UcmVlIGZvciBSZXdyaXRlIERlbHRhIHRyYWNraW5nIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRGVsdGFUcmVlIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19SRVdSSVRFX0NPUkVfREVMVEFUUkVFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19SRVdSSVRFX0NPUkVfREVMVEFUUkVFX0gKKworbmFtZXNwYWNlIGNsYW5nIHsKKworICAvLy8gRGVsdGFUcmVlIC0gYSBtdWx0aXdheSBzZWFyY2ggdHJlZSAoQlRyZWUpIHN0cnVjdHVyZSB3aXRoIHNvbWUgZmFuY3kKKyAgLy8vIGZlYXR1cmVzLiAgQi1UcmVlcyBhcmUgZ2VuZXJhbGx5IG1vcmUgbWVtb3J5IGFuZCBjYWNoZSBlZmZpY2llbnQgdGhhbgorICAvLy8gYmluYXJ5IHRyZWVzLCBiZWNhdXNlIHRoZXkgc3RvcmUgbXVsdGlwbGUga2V5cy92YWx1ZXMgaW4gZWFjaCBub2RlLiAgVGhpcworICAvLy8gaW1wbGVtZW50cyBhIGtleS92YWx1ZSBtYXBwaW5nIGZyb20gaW5kZXggdG8gZGVsdGEsIGFuZCBhbGxvd3MgZmFzdCBsb29rdXAKKyAgLy8vIG9uIGluZGV4LiAgSG93ZXZlciwgYW4gYWRkZWQgKGltcG9ydGFudCkgYm9udXMgaXMgdGhhdCBpdCBjYW4gYWxzbworICAvLy8gZWZmaWNpZW50bHkgdGVsbCB1cyB0aGUgZnVsbCBhY2N1bXVsYXRlZCBkZWx0YSBmb3IgYSBzcGVjaWZpYyBmaWxlIG9mZnNldAorICAvLy8gYXMgd2VsbCwgd2l0aG91dCB0cmF2ZXJzaW5nIHRoZSB3aG9sZSB0cmVlLgorICBjbGFzcyBEZWx0YVRyZWUgeworICAgIHZvaWQgKlJvb3Q7ICAgIC8vICJEZWx0YVRyZWVOb2RlICoiCisKKyAgcHVibGljOgorICAgIERlbHRhVHJlZSgpOworCisgICAgLy8gTm90ZTogQ3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydCBjb3B5aW5nIHdoZW4gdGhlIFJIUyBpcyBlbXB0eS4KKyAgICBEZWx0YVRyZWUoY29uc3QgRGVsdGFUcmVlICZSSFMpOworCisgICAgRGVsdGFUcmVlICZvcGVyYXRvcj0oY29uc3QgRGVsdGFUcmVlICYpID0gZGVsZXRlOworICAgIH5EZWx0YVRyZWUoKTsKKworICAgIC8vLyBnZXREZWx0YUF0IC0gUmV0dXJuIHRoZSBhY2N1bXVsYXRlZCBkZWx0YSBhdCB0aGUgc3BlY2lmaWVkIGZpbGUgb2Zmc2V0LgorICAgIC8vLyBUaGlzIGluY2x1ZGVzIGFsbCBpbnNlcnRpb25zIG9yIGRlbGVjdGlvbnMgdGhhdCBvY2N1cnJlZCAqYmVmb3JlKiB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIGZpbGUgaW5kZXguCisgICAgaW50IGdldERlbHRhQXQodW5zaWduZWQgRmlsZUluZGV4KSBjb25zdDsKKworICAgIC8vLyBBZGREZWx0YSAtIFdoZW4gYSBjaGFuZ2UgaXMgbWFkZSB0aGF0IHNoaWZ0cyBhcm91bmQgdGhlIHRleHQgYnVmZmVyLAorICAgIC8vLyB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJlY29yZCB0aGF0IGluZm8uICBJdCBpbnNlcnRzIGEgZGVsdGEgb2YgJ0RlbHRhJworICAgIC8vLyBpbnRvIHRoZSBjdXJyZW50IERlbHRhVHJlZSBhdCBvZmZzZXQgRmlsZUluZGV4LgorICAgIHZvaWQgQWRkRGVsdGEodW5zaWduZWQgRmlsZUluZGV4LCBpbnQgRGVsdGEpOworICB9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19SRVdSSVRFX0NPUkVfREVMVEFUUkVFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Jld3JpdGUvQ29yZS9IVE1MUmV3cml0ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Db3JlL0hUTUxSZXdyaXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkN2M3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Jld3JpdGUvQ29yZS9IVE1MUmV3cml0ZS5oCkBAIC0wLDAgKzEsODEgQEAKKy8vPT0tIEhUTUxSZXdyaXRlLmggLSBUcmFuc2xhdGUgc291cmNlIGNvZGUgaW50byBwcmV0dGlmaWVkIEhUTUwgLS0tKi0gQysrIC0qLS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIGEgc2V0IG9mIGZ1bmN0aW9ucyB1c2VkIGZvciB0cmFuc2xhdGluZyBzb3VyY2UgY29kZQorLy8gIGludG8gYmVhdXRpZmllZCBIVE1MLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19SRVdSSVRFX0NPUkVfSFRNTFJFV1JJVEVfSAorI2RlZmluZSBMTFZNX0NMQU5HX1JFV1JJVEVfQ09SRV9IVE1MUkVXUklURV9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgUmV3cml0ZXI7CitjbGFzcyBSZXdyaXRlQnVmZmVyOworY2xhc3MgUHJlcHJvY2Vzc29yOworCituYW1lc3BhY2UgaHRtbCB7CisKKyAgLy8vIEhpZ2hsaWdodFJhbmdlIC0gSGlnaGxpZ2h0IGEgcmFuZ2UgaW4gdGhlIHNvdXJjZSBjb2RlIHdpdGggdGhlIHNwZWNpZmllZAorICAvLy8gc3RhcnQvZW5kIHRhZ3MuICBCL0UgbXVzdCBiZSBpbiB0aGUgc2FtZSBmaWxlLiAgVGhpcyBlbnN1cmVzIHRoYXQKKyAgLy8vIHN0YXJ0L2VuZCB0YWdzIGFyZSBwbGFjZWQgYXQgdGhlIHN0YXJ0L2VuZCBvZiBlYWNoIGxpbmUgaWYgdGhlIHJhbmdlIGlzCisgIC8vLyBtdWx0aWxpbmUuCisgIHZvaWQgSGlnaGxpZ2h0UmFuZ2UoUmV3cml0ZXIgJlIsIFNvdXJjZUxvY2F0aW9uIEIsIFNvdXJjZUxvY2F0aW9uIEUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqU3RhcnRUYWcsIGNvbnN0IGNoYXIgKkVuZFRhZyk7CisKKyAgLy8vIEhpZ2hsaWdodFJhbmdlIC0gSGlnaGxpZ2h0IGEgcmFuZ2UgaW4gdGhlIHNvdXJjZSBjb2RlIHdpdGggdGhlIHNwZWNpZmllZAorICAvLy8gc3RhcnQvZW5kIHRhZ3MuICBUaGUgU3RhcnQvZW5kIG9mIHRoZSByYW5nZSBtdXN0IGJlIGluIHRoZSBzYW1lIGZpbGUuCisgIC8vLyBUaGlzIGVuc3VyZXMgdGhhdCBzdGFydC9lbmQgdGFncyBhcmUgcGxhY2VkIGF0IHRoZSBzdGFydC9lbmQgb2YgZWFjaCBsaW5lCisgIC8vLyBpZiB0aGUgcmFuZ2UgaXMgbXVsdGlsaW5lLgorICBpbmxpbmUgdm9pZCBIaWdobGlnaHRSYW5nZShSZXdyaXRlciAmUiwgU291cmNlUmFuZ2UgUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlN0YXJ0VGFnLCBjb25zdCBjaGFyICpFbmRUYWcpIHsKKyAgICBIaWdobGlnaHRSYW5nZShSLCBSYW5nZS5nZXRCZWdpbigpLCBSYW5nZS5nZXRFbmQoKSwgU3RhcnRUYWcsIEVuZFRhZyk7CisgIH0KKworICAvLy8gSGlnaGxpZ2h0UmFuZ2UgLSBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBhYm92ZSBtZXRob2QsIGJ1dCB0YWtlcworICAvLy8gZGVjb21wb3NlZCBmaWxlIGxvY2F0aW9ucy4KKyAgdm9pZCBIaWdobGlnaHRSYW5nZShSZXdyaXRlQnVmZmVyICZSQiwgdW5zaWduZWQgQiwgdW5zaWduZWQgRSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpCdWZmZXJTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpTdGFydFRhZywgY29uc3QgY2hhciAqRW5kVGFnKTsKKworICAvLy8gRXNjYXBlVGV4dCAtIEhUTUxpemUgYSBzcGVjaWZpZWQgZmlsZSBzbyB0aGF0IHNwZWNpYWwgY2hhcmFjdGVycyBhcmUKKyAgLy8vIGFyZSB0cmFuc2xhdGVkIHNvIHRoYXQgdGhleSBhcmUgbm90IGludGVycHJldGVkIGFzIEhUTUwgdGFncy4KKyAgdm9pZCBFc2NhcGVUZXh0KFJld3JpdGVyJiBSLCBGaWxlSUQgRklELAorICAgICAgICAgICAgICAgICAgYm9vbCBFc2NhcGVTcGFjZXMgPSBmYWxzZSwgYm9vbCBSZXBsYWNlVGFicyA9IGZhbHNlKTsKKworICAvLy8gRXNjYXBlVGV4dCAtIEhUTUxpemVkIHRoZSBwcm92aWRlZCBzdHJpbmcgc28gdGhhdCBzcGVjaWFsIGNoYXJhY3RlcnMKKyAgLy8vICBpbiAncycgYXJlIG5vdCBpbnRlcnByZXRlZCBhcyBIVE1MIHRhZ3MuICBVbmxpa2UgdGhlIHZlcnNpb24gb2YKKyAgLy8vICBFc2NhcGVUZXh0IHRoYXQgcmV3cml0ZXMgYSBmaWxlLCB0aGlzIHZlcnNpb24gYnkgZGVmYXVsdCByZXBsYWNlcyB0YWJzCisgIC8vLyAgd2l0aCBzcGFjZXMuCisgIHN0ZDo6c3RyaW5nIEVzY2FwZVRleHQoU3RyaW5nUmVmIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFc2NhcGVTcGFjZXMgPSBmYWxzZSwgYm9vbCBSZXBsYWNlVGFicyA9IGZhbHNlKTsKKworICB2b2lkIEFkZExpbmVOdW1iZXJzKFJld3JpdGVyJiBSLCBGaWxlSUQgRklEKTsKKworICB2b2lkIEFkZEhlYWRlckZvb3RlckludGVybmFsQnVpbHRpbkNTUyhSZXdyaXRlciAmUiwgRmlsZUlEIEZJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIHRpdGxlKTsKKworICAvLy8gU3ludGF4SGlnaGxpZ2h0IC0gUmVsZXggdGhlIHNwZWNpZmllZCBGaWxlSUQgYW5kIGFubm90YXRlIHRoZSBIVE1MIHdpdGgKKyAgLy8vIGluZm9ybWF0aW9uIGFib3V0IGtleXdvcmRzLCBjb21tZW50cywgZXRjLgorICB2b2lkIFN5bnRheEhpZ2hsaWdodChSZXdyaXRlciAmUiwgRmlsZUlEIEZJRCwgY29uc3QgUHJlcHJvY2Vzc29yICZQUCk7CisKKyAgLy8vIEhpZ2hsaWdodE1hY3JvcyAtIFRoaXMgdXNlcyB0aGUgbWFjcm8gdGFibGUgc3RhdGUgZnJvbSB0aGUgZW5kIG9mIHRoZQorICAvLy8gZmlsZSwgdG8gcmVleHBhbmQgbWFjcm9zIGFuZCBpbnNlcnQgKGludG8gdGhlIEhUTUwpIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAvLy8gbWFjcm8gZXhwYW5zaW9ucy4gIFRoaXMgd29uJ3QgYmUgcGVyZmVjdGx5IHBlcmZlY3QsIGJ1dCBpdCB3aWxsIGJlCisgIC8vLyByZWFzb25hYmx5IGNsb3NlLgorICB2b2lkIEhpZ2hsaWdodE1hY3JvcyhSZXdyaXRlciAmUiwgRmlsZUlEIEZJRCwgY29uc3QgUHJlcHJvY2Vzc29yICZQUCk7CisKK30gLy8gZW5kIGh0bWwgbmFtZXNwYWNlCit9IC8vIGVuZCBjbGFuZyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9SZXdyaXRlL0NvcmUvUmV3cml0ZUJ1ZmZlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Db3JlL1Jld3JpdGVCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTY5MDU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Db3JlL1Jld3JpdGVCdWZmZXIuaApAQCAtMCwwICsxLDExOCBAQAorLy89PT0tIFJld3JpdGVCdWZmZXIuaCAtIEJ1ZmZlciByZXdyaXRpbmcgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1JFV1JJVEVfQ09SRV9SRVdSSVRFQlVGRkVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19SRVdSSVRFX0NPUkVfUkVXUklURUJVRkZFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvUmV3cml0ZS9Db3JlL0RlbHRhVHJlZS5oIgorI2luY2x1ZGUgImNsYW5nL1Jld3JpdGUvQ29yZS9SZXdyaXRlUm9wZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCisvLy8gUmV3cml0ZUJ1ZmZlciAtIEFzIGNvZGUgaXMgcmV3cml0dGVuLCBTb3VyY2VCdWZmZXIncyBmcm9tIHRoZSBvcmlnaW5hbAorLy8vIGlucHV0IHdpdGggbW9kaWZpY2F0aW9ucyBnZXQgYSBuZXcgUmV3cml0ZUJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlbS4gIFRoZQorLy8vIFJld3JpdGVCdWZmZXIgY2FwdHVyZXMgdGhlIG1vZGlmaWVkIHRleHQgaXRzZWxmIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gdXNlZAorLy8vIHRvIG1hcCBiZXR3ZWVuIFNvdXJjZUxvY2F0aW9uJ3MgaW4gdGhlIG9yaWdpbmFsIGlucHV0IGFuZCBvZmZzZXRzIGluIHRoZQorLy8vIFJld3JpdGVCdWZmZXIuICBGb3IgZXhhbXBsZSwgaWYgdGV4dCBpcyBpbnNlcnRlZCBpbnRvIHRoZSBidWZmZXIsIGFueQorLy8vIGxvY2F0aW9ucyBhZnRlciB0aGUgaW5zZXJ0aW9uIHBvaW50IGhhdmUgdG8gYmUgbWFwcGVkLgorY2xhc3MgUmV3cml0ZUJ1ZmZlciB7CisgIGZyaWVuZCBjbGFzcyBSZXdyaXRlcjsKKworICAvLy8gRGVsdGFzIC0gS2VlcCB0cmFjayBvZiBhbGwgdGhlIGRlbHRhcyBpbiB0aGUgc291cmNlIGNvZGUgZHVlIHRvIGluc2VydGlvbnMKKyAgLy8vIGFuZCBkZWxldGlvbnMuCisgIERlbHRhVHJlZSBEZWx0YXM7CisKKyAgUmV3cml0ZVJvcGUgQnVmZmVyOworCitwdWJsaWM6CisgIHVzaW5nIGl0ZXJhdG9yID0gUmV3cml0ZVJvcGU6OmNvbnN0X2l0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gQnVmZmVyLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gQnVmZmVyLmVuZCgpOyB9CisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBCdWZmZXIuc2l6ZSgpOyB9CisKKyAgLy8vIEluaXRpYWxpemUgLSBTdGFydCB0aGlzIHJld3JpdGUgYnVmZmVyIG91dCB3aXRoIGEgY29weSBvZiB0aGUgdW5tb2RpZmllZAorICAvLy8gaW5wdXQgYnVmZmVyLgorICB2b2lkIEluaXRpYWxpemUoY29uc3QgY2hhciAqQnVmU3RhcnQsIGNvbnN0IGNoYXIgKkJ1ZkVuZCkgeworICAgIEJ1ZmZlci5hc3NpZ24oQnVmU3RhcnQsIEJ1ZkVuZCk7CisgIH0KKyAgdm9pZCBJbml0aWFsaXplKFN0cmluZ1JlZiBJbnB1dCkgeworICAgIEluaXRpYWxpemUoSW5wdXQuYmVnaW4oKSwgSW5wdXQuZW5kKCkpOworICB9CisKKyAgLy8vIFxicmllZiBXcml0ZSB0byBccCBTdHJlYW0gdGhlIHJlc3VsdCBvZiBhcHBseWluZyBhbGwgY2hhbmdlcyB0byB0aGUKKyAgLy8vIG9yaWdpbmFsIGJ1ZmZlci4KKyAgLy8vIE5vdGUgdGhhdCBpdCBpc24ndCBzYWZlIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIG92ZXJ3cml0ZSBtZW1vcnkgbWFwcGVkCisgIC8vLyBmaWxlcyBpbi1wbGFjZSAoUFIxNzk2MCkuIENvbnNpZGVyIHVzaW5nIGEgaGlnaGVyLWxldmVsIHV0aWxpdHkgc3VjaCBhcworICAvLy8gUmV3cml0ZXI6Om92ZXJ3cml0ZUNoYW5nZWRGaWxlcygpIGluc3RlYWQuCisgIC8vLworICAvLy8gVGhlIG9yaWdpbmFsIGJ1ZmZlciBpcyBub3QgYWN0dWFsbHkgY2hhbmdlZC4KKyAgcmF3X29zdHJlYW0gJndyaXRlKHJhd19vc3RyZWFtICZTdHJlYW0pIGNvbnN0OworCisgIC8vLyBSZW1vdmVUZXh0IC0gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgdGV4dC4KKyAgdm9pZCBSZW1vdmVUZXh0KHVuc2lnbmVkIE9yaWdPZmZzZXQsIHVuc2lnbmVkIFNpemUsCisgICAgICAgICAgICAgICAgICBib29sIHJlbW92ZUxpbmVJZkVtcHR5ID0gZmFsc2UpOworCisgIC8vLyBJbnNlcnRUZXh0IC0gSW5zZXJ0IHNvbWUgdGV4dCBhdCB0aGUgc3BlY2lmaWVkIHBvaW50LCB3aGVyZSB0aGUgb2Zmc2V0IGluCisgIC8vLyB0aGUgYnVmZmVyIGlzIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwgU291cmNlQnVmZmVyLiAgVGhlCisgIC8vLyB0ZXh0IGlzIGluc2VydGVkIGFmdGVyIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCisgIHZvaWQgSW5zZXJ0VGV4dCh1bnNpZ25lZCBPcmlnT2Zmc2V0LCBTdHJpbmdSZWYgU3RyLAorICAgICAgICAgICAgICAgICAgYm9vbCBJbnNlcnRBZnRlciA9IHRydWUpOworCisKKyAgLy8vIEluc2VydFRleHRCZWZvcmUgLSBJbnNlcnQgc29tZSB0ZXh0IGJlZm9yZSB0aGUgc3BlY2lmaWVkIHBvaW50LCB3aGVyZSB0aGUKKyAgLy8vIG9mZnNldCBpbiB0aGUgYnVmZmVyIGlzIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwKKyAgLy8vIFNvdXJjZUJ1ZmZlci4gVGhlIHRleHQgaXMgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uICBUaGlzIGlzCisgIC8vLyBtZXRob2QgaXMgdGhlIHNhbWUgYXMgSW5zZXJ0VGV4dCB3aXRoICJJbnNlcnRBZnRlciA9PSBmYWxzZSIuCisgIHZvaWQgSW5zZXJ0VGV4dEJlZm9yZSh1bnNpZ25lZCBPcmlnT2Zmc2V0LCBTdHJpbmdSZWYgU3RyKSB7CisgICAgSW5zZXJ0VGV4dChPcmlnT2Zmc2V0LCBTdHIsIGZhbHNlKTsKKyAgfQorCisgIC8vLyBJbnNlcnRUZXh0QWZ0ZXIgLSBJbnNlcnQgc29tZSB0ZXh0IGF0IHRoZSBzcGVjaWZpZWQgcG9pbnQsIHdoZXJlIHRoZQorICAvLy8gb2Zmc2V0IGluIHRoZSBidWZmZXIgaXMgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbCBTb3VyY2VCdWZmZXIuCisgIC8vLyBUaGUgdGV4dCBpcyBpbnNlcnRlZCBhZnRlciB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgorICB2b2lkIEluc2VydFRleHRBZnRlcih1bnNpZ25lZCBPcmlnT2Zmc2V0LCBTdHJpbmdSZWYgU3RyKSB7CisgICAgSW5zZXJ0VGV4dChPcmlnT2Zmc2V0LCBTdHIpOworICB9CisKKyAgLy8vIFJlcGxhY2VUZXh0IC0gVGhpcyBtZXRob2QgcmVwbGFjZXMgYSByYW5nZSBvZiBjaGFyYWN0ZXJzIGluIHRoZSBpbnB1dAorICAvLy8gYnVmZmVyIHdpdGggYSBuZXcgc3RyaW5nLiAgVGhpcyBpcyBlZmZlY3RpdmVseSBhIGNvbWJpbmVkICJyZW1vdmUvaW5zZXJ0IgorICAvLy8gb3BlcmF0aW9uLgorICB2b2lkIFJlcGxhY2VUZXh0KHVuc2lnbmVkIE9yaWdPZmZzZXQsIHVuc2lnbmVkIE9yaWdMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5ld1N0cik7CisKK3ByaXZhdGU6CisgIC8vLyBnZXRNYXBwZWRPZmZzZXQgLSBHaXZlbiBhbiBvZmZzZXQgaW50byB0aGUgb3JpZ2luYWwgU291cmNlQnVmZmVyIHRoYXQgdGhpcworICAvLy8gUmV3cml0ZUJ1ZmZlciBpcyBiYXNlZCBvbiwgbWFwIGl0IGludG8gdGhlIG9mZnNldCBzcGFjZSBvZiB0aGUKKyAgLy8vIFJld3JpdGVCdWZmZXIuICBJZiBBZnRlckluc2VydHMgaXMgdHJ1ZSBhbmQgaWYgdGhlIE9yaWdPZmZzZXQgaW5kaWNhdGVzIGEKKyAgLy8vIHBvc2l0aW9uIHdoZXJlIHRleHQgaXMgaW5zZXJ0ZWQsIHRoZSBsb2NhdGlvbiByZXR1cm5lZCB3aWxsIGJlIGFmdGVyIGFueQorICAvLy8gaW5zZXJ0ZWQgdGV4dCBhdCB0aGUgcG9zaXRpb24uCisgIHVuc2lnbmVkIGdldE1hcHBlZE9mZnNldCh1bnNpZ25lZCBPcmlnT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBZnRlckluc2VydHMgPSBmYWxzZSkgY29uc3R7CisgICAgcmV0dXJuIERlbHRhcy5nZXREZWx0YUF0KDIqT3JpZ09mZnNldCtBZnRlckluc2VydHMpK09yaWdPZmZzZXQ7CisgIH0KKworICAvLy8gQWRkSW5zZXJ0RGVsdGEgLSBXaGVuIGFuIGluc2VydGlvbiBpcyBtYWRlIGF0IGEgcG9zaXRpb24sIHRoaXMKKyAgLy8vIG1ldGhvZCBpcyB1c2VkIHRvIHJlY29yZCB0aGF0IGluZm9ybWF0aW9uLgorICB2b2lkIEFkZEluc2VydERlbHRhKHVuc2lnbmVkIE9yaWdPZmZzZXQsIGludCBDaGFuZ2UpIHsKKyAgICByZXR1cm4gRGVsdGFzLkFkZERlbHRhKDIqT3JpZ09mZnNldCwgQ2hhbmdlKTsKKyAgfQorCisgIC8vLyBBZGRSZXBsYWNlRGVsdGEgLSBXaGVuIGEgcmVwbGFjZW1lbnQvZGVsZXRpb24gaXMgbWFkZSBhdCBhIHBvc2l0aW9uLCB0aGlzCisgIC8vLyBtZXRob2QgaXMgdXNlZCB0byByZWNvcmQgdGhhdCBpbmZvcm1hdGlvbi4KKyAgdm9pZCBBZGRSZXBsYWNlRGVsdGEodW5zaWduZWQgT3JpZ09mZnNldCwgaW50IENoYW5nZSkgeworICAgIHJldHVybiBEZWx0YXMuQWRkRGVsdGEoMipPcmlnT2Zmc2V0KzEsIENoYW5nZSk7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1JFV1JJVEVfQ09SRV9SRVdSSVRFQlVGRkVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Jld3JpdGUvQ29yZS9SZXdyaXRlUm9wZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Db3JlL1Jld3JpdGVSb3BlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEwZTBhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Jld3JpdGUvQ29yZS9SZXdyaXRlUm9wZS5oCkBAIC0wLDAgKzEsMjE1IEBACisvLz09PS0gUmV3cml0ZVJvcGUuaCAtIFJvcGUgc3BlY2lhbGl6ZWQgZm9yIHJld3JpdGVyIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUmV3cml0ZVJvcGUgY2xhc3MsIHdoaWNoIGlzIGEgcG93ZXJmdWwgc3RyaW5nIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19SRVdSSVRFX0NPUkVfUkVXUklURVJPUEVfSAorI2RlZmluZSBMTFZNX0NMQU5HX1JFV1JJVEVfQ09SRV9SRVdSSVRFUk9QRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUm9wZVJlZkNvdW50U3RyaW5nIENsYXNzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBSb3BlUmVmQ291bnRTdHJpbmcgLSBUaGlzIHN0cnVjdCBpcyBhbGxvY2F0ZWQgd2l0aCAnbmV3IGNoYXJbXScgZnJvbSB0aGUKKyAgLy8vIGhlYXAsIGFuZCByZXByZXNlbnRzIGEgcmVmZXJlbmNlIGNvdW50ZWQgY2h1bmsgb2Ygc3RyaW5nIGRhdGEuICBXaGVuIGl0cworICAvLy8gcmVmIGNvdW50IGRyb3BzIHRvIHplcm8sIGl0IGlzIGRlbGV0ZVtdJ2QuICBUaGlzIGlzIHByaW1hcmlseSBtYW5hZ2VkCisgIC8vLyB0aHJvdWdoIHRoZSBSb3BlUGllY2UgY2xhc3MgYmVsb3cuCisgIHN0cnVjdCBSb3BlUmVmQ291bnRTdHJpbmcgeworICAgIHVuc2lnbmVkIFJlZkNvdW50OworICAgIGNoYXIgRGF0YVsxXTsgIC8vICBWYXJpYWJsZSBzaXplZC4KKworICAgIHZvaWQgUmV0YWluKCkgeyArK1JlZkNvdW50OyB9CisKKyAgICB2b2lkIFJlbGVhc2UoKSB7CisgICAgICBhc3NlcnQoUmVmQ291bnQgPiAwICYmICJSZWZlcmVuY2UgY291bnQgaXMgYWxyZWFkeSB6ZXJvLiIpOworICAgICAgaWYgKC0tUmVmQ291bnQgPT0gMCkKKyAgICAgICAgZGVsZXRlIFtdIChjaGFyKil0aGlzOworICAgIH0KKyAgfTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUm9wZVBpZWNlIENsYXNzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBSb3BlUGllY2UgLSBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSB2aWV3IGludG8gYSBSb3BlUmVmQ291bnRTdHJpbmcgb2JqZWN0LgorICAvLy8gVGhpcyBhbGxvd3MgcmVmZXJlbmNlcyB0byBzdHJpbmcgZGF0YSB0byBiZSBlZmZpY2llbnRseSBjaG9wcGVkIHVwIGFuZAorICAvLy8gbW92ZWQgYXJvdW5kIHdpdGhvdXQgaGF2aW5nIHRvIHB1c2ggYXJvdW5kIHRoZSBzdHJpbmcgZGF0YSBpdHNlbGYuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsIHdlIGNvdWxkIGhhdmUgYSAxTSBSb3BlUGllY2UgYW5kIHdhbnQgdG8gaW5zZXJ0IHNvbWV0aGluZworICAvLy8gaW50byB0aGUgbWlkZGxlIG9mIGl0LiAgVG8gZG8gdGhpcywgd2Ugc3BsaXQgaXQgaW50byB0d28gUm9wZVBpZWNlIG9iamVjdHMKKyAgLy8vIHRoYXQgYm90aCByZWZlciB0byB0aGUgc2FtZSB1bmRlcmx5aW5nIFJvcGVSZWZDb3VudFN0cmluZyAoanVzdCB3aXRoCisgIC8vLyBkaWZmZXJlbnQgb2Zmc2V0cykgd2hpY2ggaXMgYSBuaWNlIGNvbnN0YW50IHRpbWUgb3BlcmF0aW9uLgorICBzdHJ1Y3QgUm9wZVBpZWNlIHsKKyAgICBsbHZtOjpJbnRydXNpdmVSZWZDbnRQdHI8Um9wZVJlZkNvdW50U3RyaW5nPiBTdHJEYXRhOworICAgIHVuc2lnbmVkIFN0YXJ0T2ZmcyA9IDA7CisgICAgdW5zaWduZWQgRW5kT2ZmcyA9IDA7CisKKyAgICBSb3BlUGllY2UoKSA9IGRlZmF1bHQ7CisgICAgUm9wZVBpZWNlKGxsdm06OkludHJ1c2l2ZVJlZkNudFB0cjxSb3BlUmVmQ291bnRTdHJpbmc+IFN0ciwgdW5zaWduZWQgU3RhcnQsCisgICAgICAgICAgICAgIHVuc2lnbmVkIEVuZCkKKyAgICAgICAgOiBTdHJEYXRhKHN0ZDo6bW92ZShTdHIpKSwgU3RhcnRPZmZzKFN0YXJ0KSwgRW5kT2ZmcyhFbmQpIHt9CisKKyAgICBjb25zdCBjaGFyICZvcGVyYXRvcltdKHVuc2lnbmVkIE9mZnNldCkgY29uc3QgeworICAgICAgcmV0dXJuIFN0ckRhdGEtPkRhdGFbT2Zmc2V0K1N0YXJ0T2Zmc107CisgICAgfQorICAgIGNoYXIgJm9wZXJhdG9yW10odW5zaWduZWQgT2Zmc2V0KSB7CisgICAgICByZXR1cm4gU3RyRGF0YS0+RGF0YVtPZmZzZXQrU3RhcnRPZmZzXTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gRW5kT2Zmcy1TdGFydE9mZnM7IH0KKyAgfTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUm9wZVBpZWNlQlRyZWVJdGVyYXRvciBDbGFzcworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gUm9wZVBpZWNlQlRyZWVJdGVyYXRvciAtIFRoaXMgY2xhc3MgcHJvdmlkZXMgcmVhZC1vbmx5IGZvcndhcmQgaXRlcmF0aW9uCisgIC8vLyBvdmVyIGJ5dGVzIHRoYXQgYXJlIGluIGEgUm9wZVBpZWNlQlRyZWUuICBUaGlzIGZpcnN0IGl0ZXJhdGVzIG92ZXIgYnl0ZXMKKyAgLy8vIGluIGEgUm9wZVBpZWNlLCB0aGVuIGl0ZXJhdGVzIG92ZXIgUm9wZVBpZWNlJ3MgaW4gYSBSb3BlUGllY2VCVHJlZUxlYWYsCisgIC8vLyB0aGVuIGl0ZXJhdGVzIG92ZXIgUm9wZVBpZWNlQlRyZWVMZWFmJ3MgaW4gYSBSb3BlUGllY2VCVHJlZS4KKyAgY2xhc3MgUm9wZVBpZWNlQlRyZWVJdGVyYXRvciA6CisgICAgICBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBjb25zdCBjaGFyLCBwdHJkaWZmX3Q+IHsKKyAgICAvLy8gQ3VyTm9kZSAtIFRoZSBjdXJyZW50IEIrVHJlZSBub2RlIHRoYXQgd2UgYXJlIGluc3BlY3RpbmcuCisgICAgY29uc3Qgdm9pZCAvKlJvcGVQaWVjZUJUcmVlTGVhZiovICpDdXJOb2RlID0gbnVsbHB0cjsKKworICAgIC8vLyBDdXJQaWVjZSAtIFRoZSBjdXJyZW50IFJvcGVQaWVjZSBpbiB0aGUgQitUcmVlIG5vZGUgdGhhdCB3ZSdyZQorICAgIC8vLyBpbnNwZWN0aW5nLgorICAgIGNvbnN0IFJvcGVQaWVjZSAqQ3VyUGllY2UgPSBudWxscHRyOworCisgICAgLy8vIEN1ckNoYXIgLSBUaGUgY3VycmVudCBieXRlIGluIHRoZSBSb3BlUGllY2Ugd2UgYXJlIHBvaW50aW5nIHRvLgorICAgIHVuc2lnbmVkIEN1ckNoYXIgPSAwOworCisgIHB1YmxpYzoKKyAgICBSb3BlUGllY2VCVHJlZUl0ZXJhdG9yKCkgPSBkZWZhdWx0OworICAgIFJvcGVQaWVjZUJUcmVlSXRlcmF0b3IoY29uc3Qgdm9pZCAvKlJvcGVQaWVjZUJUcmVlTm9kZSovICpOKTsKKworICAgIGNoYXIgb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgcmV0dXJuICgqQ3VyUGllY2UpW0N1ckNoYXJdOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSb3BlUGllY2VCVHJlZUl0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBDdXJQaWVjZSA9PSBSSFMuQ3VyUGllY2UgJiYgQ3VyQ2hhciA9PSBSSFMuQ3VyQ2hhcjsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJvcGVQaWVjZUJUcmVlSXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KFJIUyk7CisgICAgfQorCisgICAgUm9wZVBpZWNlQlRyZWVJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgICAvLyBQcmVpbmNyZW1lbnQKKyAgICAgIGlmIChDdXJDaGFyKzEgPCBDdXJQaWVjZS0+c2l6ZSgpKQorICAgICAgICArK0N1ckNoYXI7CisgICAgICBlbHNlCisgICAgICAgIE1vdmVUb05leHRQaWVjZSgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJvcGVQaWVjZUJUcmVlSXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgLy8gUG9zdGluY3JlbWVudAorICAgICAgUm9wZVBpZWNlQlRyZWVJdGVyYXRvciB0bXAgPSAqdGhpczsgKysqdGhpczsgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICBsbHZtOjpTdHJpbmdSZWYgcGllY2UoKSBjb25zdCB7CisgICAgICByZXR1cm4gbGx2bTo6U3RyaW5nUmVmKCYoKkN1clBpZWNlKVswXSwgQ3VyUGllY2UtPnNpemUoKSk7CisgICAgfQorCisgICAgdm9pZCBNb3ZlVG9OZXh0UGllY2UoKTsKKyAgfTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUm9wZVBpZWNlQlRyZWUgQ2xhc3MKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgY2xhc3MgUm9wZVBpZWNlQlRyZWUgeworICAgIHZvaWQgLypSb3BlUGllY2VCVHJlZU5vZGUqLyAqUm9vdDsKKworICBwdWJsaWM6CisgICAgUm9wZVBpZWNlQlRyZWUoKTsKKyAgICBSb3BlUGllY2VCVHJlZShjb25zdCBSb3BlUGllY2VCVHJlZSAmUkhTKTsKKyAgICBSb3BlUGllY2VCVHJlZSAmb3BlcmF0b3I9KGNvbnN0IFJvcGVQaWVjZUJUcmVlICYpID0gZGVsZXRlOworICAgIH5Sb3BlUGllY2VCVHJlZSgpOworCisgICAgdXNpbmcgaXRlcmF0b3IgPSBSb3BlUGllY2VCVHJlZUl0ZXJhdG9yOworCisgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihSb290KTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCk7IH0KKyAgICB1bnNpZ25lZCBzaXplKCkgY29uc3Q7CisgICAgdW5zaWduZWQgZW1wdHkoKSBjb25zdCB7IHJldHVybiBzaXplKCkgPT0gMDsgfQorCisgICAgdm9pZCBjbGVhcigpOworCisgICAgdm9pZCBpbnNlcnQodW5zaWduZWQgT2Zmc2V0LCBjb25zdCBSb3BlUGllY2UgJlIpOworCisgICAgdm9pZCBlcmFzZSh1bnNpZ25lZCBPZmZzZXQsIHVuc2lnbmVkIE51bUJ5dGVzKTsKKyAgfTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUmV3cml0ZVJvcGUgQ2xhc3MKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBSZXdyaXRlUm9wZSAtIEEgcG93ZXJmdWwgc3RyaW5nIGNsYXNzLiAgVGhpcyBjbGFzcyBzdXBwb3J0cyBleHRyZW1lbHkKKy8vLyBlZmZpY2llbnQgaW5zZXJ0aW9ucyBhbmQgZGVsZXRpb25zIGludG8gdGhlIG1pZGRsZSBvZiBpdCwgZXZlbiBmb3IKKy8vLyByaWRpY3Vsb3VzbHkgbG9uZyBzdHJpbmdzLgorY2xhc3MgUmV3cml0ZVJvcGUgeworICBSb3BlUGllY2VCVHJlZSBDaHVua3M7CisKKyAgLy8vIFdlIGFsbG9jYXRlIHNwYWNlIGZvciBzdHJpbmcgZGF0YSBvdXQgb2YgYSBidWZmZXIgb2Ygc2l6ZSBBbGxvY0NodW5rU2l6ZS4KKyAgLy8vIFRoaXMga2VlcHMgdHJhY2sgb2YgaG93IG11Y2ggc3BhY2UgaXMgbGVmdC4KKyAgbGx2bTo6SW50cnVzaXZlUmVmQ250UHRyPFJvcGVSZWZDb3VudFN0cmluZz4gQWxsb2NCdWZmZXI7CisgIGVudW0geyBBbGxvY0NodW5rU2l6ZSA9IDQwODAgfTsKKyAgdW5zaWduZWQgQWxsb2NPZmZzID0gQWxsb2NDaHVua1NpemU7CisKK3B1YmxpYzoKKyAgUmV3cml0ZVJvcGUoKSA9IGRlZmF1bHQ7CisgIFJld3JpdGVSb3BlKGNvbnN0IFJld3JpdGVSb3BlICZSSFMpIDogQ2h1bmtzKFJIUy5DaHVua3MpIHt9CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBSb3BlUGllY2VCVHJlZTo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gUm9wZVBpZWNlQlRyZWU6Oml0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gQ2h1bmtzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gQ2h1bmtzLmVuZCgpOyB9CisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBDaHVua3Muc2l6ZSgpOyB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBDaHVua3MuY2xlYXIoKTsKKyAgfQorCisgIHZvaWQgYXNzaWduKGNvbnN0IGNoYXIgKlN0YXJ0LCBjb25zdCBjaGFyICpFbmQpIHsKKyAgICBjbGVhcigpOworICAgIGlmIChTdGFydCAhPSBFbmQpCisgICAgICBDaHVua3MuaW5zZXJ0KDAsIE1ha2VSb3BlU3RyaW5nKFN0YXJ0LCBFbmQpKTsKKyAgfQorCisgIHZvaWQgaW5zZXJ0KHVuc2lnbmVkIE9mZnNldCwgY29uc3QgY2hhciAqU3RhcnQsIGNvbnN0IGNoYXIgKkVuZCkgeworICAgIGFzc2VydChPZmZzZXQgPD0gc2l6ZSgpICYmICJJbnZhbGlkIHBvc2l0aW9uIHRvIGluc2VydCEiKTsKKyAgICBpZiAoU3RhcnQgPT0gRW5kKSByZXR1cm47CisgICAgQ2h1bmtzLmluc2VydChPZmZzZXQsIE1ha2VSb3BlU3RyaW5nKFN0YXJ0LCBFbmQpKTsKKyAgfQorCisgIHZvaWQgZXJhc2UodW5zaWduZWQgT2Zmc2V0LCB1bnNpZ25lZCBOdW1CeXRlcykgeworICAgIGFzc2VydChPZmZzZXQrTnVtQnl0ZXMgPD0gc2l6ZSgpICYmICJJbnZhbGlkIHJlZ2lvbiB0byBlcmFzZSEiKTsKKyAgICBpZiAoTnVtQnl0ZXMgPT0gMCkgcmV0dXJuOworICAgIENodW5rcy5lcmFzZShPZmZzZXQsIE51bUJ5dGVzKTsKKyAgfQorCitwcml2YXRlOgorICBSb3BlUGllY2UgTWFrZVJvcGVTdHJpbmcoY29uc3QgY2hhciAqU3RhcnQsIGNvbnN0IGNoYXIgKkVuZCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19SRVdSSVRFX0NPUkVfUkVXUklURVJPUEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Db3JlL1Jld3JpdGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9SZXdyaXRlL0NvcmUvUmV3cml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjMzY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Db3JlL1Jld3JpdGVyLmgKQEAgLTAsMCArMSwxOTcgQEAKKy8vPT09LSBSZXdyaXRlci5oIC0gQ29kZSByZXdyaXRpbmcgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBSZXdyaXRlciBjbGFzcywgd2hpY2ggaXMgdXNlZCBmb3IgY29kZQorLy8gIHRyYW5zZm9ybWF0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfUkVXUklURV9DT1JFX1JFV1JJVEVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19SRVdSSVRFX0NPUkVfUkVXUklURVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvUmV3cml0ZS9Db3JlL1Jld3JpdGVCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBMYW5nT3B0aW9uczsKK2NsYXNzIFNvdXJjZU1hbmFnZXI7CisKKy8vLyBSZXdyaXRlciAtIFRoaXMgaXMgdGhlIG1haW4gaW50ZXJmYWNlIHRvIHRoZSByZXdyaXRlIGJ1ZmZlcnMuICBJdHMgcHJpbWFyeQorLy8vIGpvYiBpcyB0byBkaXNwYXRjaCBoaWdoLWxldmVsIHJlcXVlc3RzIHRvIHRoZSBsb3ctbGV2ZWwgUmV3cml0ZUJ1ZmZlcnMgdGhhdAorLy8vIGFyZSBpbnZvbHZlZC4KK2NsYXNzIFJld3JpdGVyIHsKKyAgU291cmNlTWFuYWdlciAqU291cmNlTWdyID0gbnVsbHB0cjsKKyAgY29uc3QgTGFuZ09wdGlvbnMgKkxhbmdPcHRzID0gbnVsbHB0cjsKKyAgc3RkOjptYXA8RmlsZUlELCBSZXdyaXRlQnVmZmVyPiBSZXdyaXRlQnVmZmVyczsKKworcHVibGljOgorICBzdHJ1Y3QgUmV3cml0ZU9wdGlvbnMgeworICAgIC8vLyBcYnJpZWYgR2l2ZW4gYSBzb3VyY2UgcmFuZ2UsIHRydWUgdG8gaW5jbHVkZSBwcmV2aW91cyBpbnNlcnRzIGF0IHRoZQorICAgIC8vLyBiZWdpbm5pbmcgb2YgdGhlIHJhbmdlIGFzIHBhcnQgb2YgdGhlIHJhbmdlIGl0c2VsZiAodHJ1ZSBieSBkZWZhdWx0KS4KKyAgICBib29sIEluY2x1ZGVJbnNlcnRzQXRCZWdpbk9mUmFuZ2UgPSB0cnVlOworCisgICAgLy8vIFxicmllZiBHaXZlbiBhIHNvdXJjZSByYW5nZSwgdHJ1ZSB0byBpbmNsdWRlIHByZXZpb3VzIGluc2VydHMgYXQgdGhlCisgICAgLy8vIGVuZCBvZiB0aGUgcmFuZ2UgYXMgcGFydCBvZiB0aGUgcmFuZ2UgaXRzZWxmICh0cnVlIGJ5IGRlZmF1bHQpLgorICAgIGJvb2wgSW5jbHVkZUluc2VydHNBdEVuZE9mUmFuZ2UgPSB0cnVlOworCisgICAgLy8vIFxicmllZiBJZiB0cnVlIGFuZCByZW1vdmluZyBzb21lIHRleHQgbGVhdmVzIGEgYmxhbmsgbGluZQorICAgIC8vLyBhbHNvIHJlbW92ZSB0aGUgZW1wdHkgbGluZSAoZmFsc2UgYnkgZGVmYXVsdCkuCisgICAgYm9vbCBSZW1vdmVMaW5lSWZFbXB0eSA9IGZhbHNlOworCisgICAgUmV3cml0ZU9wdGlvbnMoKSB7fQorICB9OworCisgIHVzaW5nIGJ1ZmZlcl9pdGVyYXRvciA9IHN0ZDo6bWFwPEZpbGVJRCwgUmV3cml0ZUJ1ZmZlcj46Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9idWZmZXJfaXRlcmF0b3IgPSBzdGQ6Om1hcDxGaWxlSUQsIFJld3JpdGVCdWZmZXI+Ojpjb25zdF9pdGVyYXRvcjsKKworICBleHBsaWNpdCBSZXdyaXRlcigpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgUmV3cml0ZXIoU291cmNlTWFuYWdlciAmU00sIGNvbnN0IExhbmdPcHRpb25zICZMTykKKyAgICAgIDogU291cmNlTWdyKCZTTSksIExhbmdPcHRzKCZMTykge30KKworICB2b2lkIHNldFNvdXJjZU1ncihTb3VyY2VNYW5hZ2VyICZTTSwgY29uc3QgTGFuZ09wdGlvbnMgJkxPKSB7CisgICAgU291cmNlTWdyID0gJlNNOworICAgIExhbmdPcHRzID0gJkxPOworICB9CisKKyAgU291cmNlTWFuYWdlciAmZ2V0U291cmNlTWdyKCkgY29uc3QgeyByZXR1cm4gKlNvdXJjZU1ncjsgfQorICBjb25zdCBMYW5nT3B0aW9ucyAmZ2V0TGFuZ09wdHMoKSBjb25zdCB7IHJldHVybiAqTGFuZ09wdHM7IH0KKworICAvLy8gaXNSZXdyaXRhYmxlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBsb2NhdGlvbiBpcyBhIHJhdyBmaWxlIGxvY2F0aW9uLCB3aGljaAorICAvLy8gaXMgcmV3cml0YWJsZS4gIExvY2F0aW9ucyBmcm9tIG1hY3JvcywgZXRjIGFyZSBub3QgcmV3cml0YWJsZS4KKyAgc3RhdGljIGJvb2wgaXNSZXdyaXRhYmxlKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIHJldHVybiBMb2MuaXNGaWxlSUQoKTsKKyAgfQorCisgIC8vLyBnZXRSYW5nZVNpemUgLSBSZXR1cm4gdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHNwZWNpZmllZCByYW5nZSBpZiB0aGV5CisgIC8vLyBhcmUgaW4gdGhlIHNhbWUgZmlsZS4gIElmIG5vdCwgdGhpcyByZXR1cm5zIC0xLgorICBpbnQgZ2V0UmFuZ2VTaXplKFNvdXJjZVJhbmdlIFJhbmdlLAorICAgICAgICAgICAgICAgICAgIFJld3JpdGVPcHRpb25zIG9wdHMgPSBSZXdyaXRlT3B0aW9ucygpKSBjb25zdDsKKyAgaW50IGdldFJhbmdlU2l6ZShjb25zdCBDaGFyU291cmNlUmFuZ2UgJlJhbmdlLAorICAgICAgICAgICAgICAgICAgIFJld3JpdGVPcHRpb25zIG9wdHMgPSBSZXdyaXRlT3B0aW9ucygpKSBjb25zdDsKKworICAvLy8gZ2V0UmV3cml0dGVuVGV4dCAtIFJldHVybiB0aGUgcmV3cml0dGVuIGZvcm0gb2YgdGhlIHRleHQgaW4gdGhlIHNwZWNpZmllZAorICAvLy8gcmFuZ2UuICBJZiB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSByYW5nZSB3YXMgdW5yZXdyaXRhYmxlIG9yIGlmIHRoZXkgYXJlCisgIC8vLyBpbiBkaWZmZXJlbnQgYnVmZmVycywgdGhpcyByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgbm90IHBhcnRpY3VsYXJseSBlZmZpY2llbnQuCisgIHN0ZDo6c3RyaW5nIGdldFJld3JpdHRlblRleHQoU291cmNlUmFuZ2UgUmFuZ2UpIGNvbnN0OworCisgIC8vLyBJbnNlcnRUZXh0IC0gSW5zZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhlCisgIC8vLyBvcmlnaW5hbCBidWZmZXIuICBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgKGFuZCBkb2VzIG5vdGhpbmcpIGlmIHRoZSBpbnB1dAorICAvLy8gbG9jYXRpb24gd2FzIG5vdCByZXdyaXRhYmxlLCBmYWxzZSBvdGhlcndpc2UuCisgIC8vLworICAvLy8gXHBhcmFtIGluZGVudE5ld0xpbmVzIGlmIHRydWUgbmV3IGxpbmVzIGluIHRoZSBzdHJpbmcgYXJlIGluZGVudGVkCisgIC8vLyB1c2luZyB0aGUgaW5kZW50YXRpb24gb2YgdGhlIHNvdXJjZSBsaW5lIGluIHBvc2l0aW9uIFxwIExvYy4KKyAgYm9vbCBJbnNlcnRUZXh0KFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIFN0ciwKKyAgICAgICAgICAgICAgICAgIGJvb2wgSW5zZXJ0QWZ0ZXIgPSB0cnVlLCBib29sIGluZGVudE5ld0xpbmVzID0gZmFsc2UpOworCisgIC8vLyBJbnNlcnRUZXh0QWZ0ZXIgLSBJbnNlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpbgorICAvLy8gIHRoZSBvcmlnaW5hbCBidWZmZXIuICBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgKGFuZCBkb2VzIG5vdGhpbmcpIGlmCisgIC8vLyAgdGhlIGlucHV0IGxvY2F0aW9uIHdhcyBub3QgcmV3cml0YWJsZSwgZmFsc2Ugb3RoZXJ3aXNlLiAgVGV4dCBpcworICAvLy8gIGluc2VydGVkIGFmdGVyIGFueSBvdGhlciB0ZXh0IHRoYXQgaGFzIGJlZW4gcHJldmlvdXNseSBpbnNlcnRlZAorICAvLy8gIGF0IHRoZSBzb21lIHBvaW50ICh0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgSW5zZXJ0VGV4dCkuCisgIGJvb2wgSW5zZXJ0VGV4dEFmdGVyKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIFN0cikgeworICAgIHJldHVybiBJbnNlcnRUZXh0KExvYywgU3RyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSW5zZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFmdGVyIHRoZSB0b2tlbiBpbiB0aGUKKyAgLy8vIHNwZWNpZmllZCBsb2NhdGlvbi4KKyAgYm9vbCBJbnNlcnRUZXh0QWZ0ZXJUb2tlbihTb3VyY2VMb2NhdGlvbiBMb2MsIFN0cmluZ1JlZiBTdHIpOworCisgIC8vLyBJbnNlcnRUZXh0IC0gSW5zZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhlCisgIC8vLyBvcmlnaW5hbCBidWZmZXIuICBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgKGFuZCBkb2VzIG5vdGhpbmcpIGlmIHRoZSBpbnB1dAorICAvLy8gbG9jYXRpb24gd2FzIG5vdCByZXdyaXRhYmxlLCBmYWxzZSBvdGhlcndpc2UuICBUZXh0IGlzCisgIC8vLyBpbnNlcnRlZCBiZWZvcmUgYW55IG90aGVyIHRleHQgdGhhdCBoYXMgYmVlbiBwcmV2aW91c2x5IGluc2VydGVkCisgIC8vLyBhdCB0aGUgc29tZSBwb2ludC4KKyAgYm9vbCBJbnNlcnRUZXh0QmVmb3JlKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIFN0cikgeworICAgIHJldHVybiBJbnNlcnRUZXh0KExvYywgU3RyLCBmYWxzZSk7CisgIH0KKworICAvLy8gUmVtb3ZlVGV4dCAtIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHRleHQgcmVnaW9uLgorICBib29sIFJlbW92ZVRleHQoU291cmNlTG9jYXRpb24gU3RhcnQsIHVuc2lnbmVkIExlbmd0aCwKKyAgICAgICAgICAgICAgICAgIFJld3JpdGVPcHRpb25zIG9wdHMgPSBSZXdyaXRlT3B0aW9ucygpKTsKKworICAvLy8gXGJyaWVmIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHRleHQgcmVnaW9uLgorICBib29sIFJlbW92ZVRleHQoQ2hhclNvdXJjZVJhbmdlIHJhbmdlLAorICAgICAgICAgICAgICAgICAgUmV3cml0ZU9wdGlvbnMgb3B0cyA9IFJld3JpdGVPcHRpb25zKCkpIHsKKyAgICByZXR1cm4gUmVtb3ZlVGV4dChyYW5nZS5nZXRCZWdpbigpLCBnZXRSYW5nZVNpemUocmFuZ2UsIG9wdHMpLCBvcHRzKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVtb3ZlIHRoZSBzcGVjaWZpZWQgdGV4dCByZWdpb24uCisgIGJvb2wgUmVtb3ZlVGV4dChTb3VyY2VSYW5nZSByYW5nZSwgUmV3cml0ZU9wdGlvbnMgb3B0cyA9IFJld3JpdGVPcHRpb25zKCkpIHsKKyAgICByZXR1cm4gUmVtb3ZlVGV4dChyYW5nZS5nZXRCZWdpbigpLCBnZXRSYW5nZVNpemUocmFuZ2UsIG9wdHMpLCBvcHRzKTsKKyAgfQorCisgIC8vLyBSZXBsYWNlVGV4dCAtIFRoaXMgbWV0aG9kIHJlcGxhY2VzIGEgcmFuZ2Ugb2YgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQKKyAgLy8vIGJ1ZmZlciB3aXRoIGEgbmV3IHN0cmluZy4gIFRoaXMgaXMgZWZmZWN0aXZlbHkgYSBjb21iaW5lZCAicmVtb3ZlL2luc2VydCIKKyAgLy8vIG9wZXJhdGlvbi4KKyAgYm9vbCBSZXBsYWNlVGV4dChTb3VyY2VMb2NhdGlvbiBTdGFydCwgdW5zaWduZWQgT3JpZ0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmV3U3RyKTsKKworICAvLy8gUmVwbGFjZVRleHQgLSBUaGlzIG1ldGhvZCByZXBsYWNlcyBhIHJhbmdlIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGlucHV0CisgIC8vLyBidWZmZXIgd2l0aCBhIG5ldyBzdHJpbmcuICBUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgY29tYmluZWQgInJlbW92ZS9pbnNlcnQiCisgIC8vLyBvcGVyYXRpb24uCisgIGJvb2wgUmVwbGFjZVRleHQoU291cmNlUmFuZ2UgcmFuZ2UsIFN0cmluZ1JlZiBOZXdTdHIpIHsKKyAgICByZXR1cm4gUmVwbGFjZVRleHQocmFuZ2UuZ2V0QmVnaW4oKSwgZ2V0UmFuZ2VTaXplKHJhbmdlKSwgTmV3U3RyKTsKKyAgfQorCisgIC8vLyBSZXBsYWNlVGV4dCAtIFRoaXMgbWV0aG9kIHJlcGxhY2VzIGEgcmFuZ2Ugb2YgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQKKyAgLy8vIGJ1ZmZlciB3aXRoIGEgbmV3IHN0cmluZy4gIFRoaXMgaXMgZWZmZWN0aXZlbHkgYSBjb21iaW5lZCAicmVtb3ZlL2luc2VydCIKKyAgLy8vIG9wZXJhdGlvbi4KKyAgYm9vbCBSZXBsYWNlVGV4dChTb3VyY2VSYW5nZSByYW5nZSwgU291cmNlUmFuZ2UgcmVwbGFjZW1lbnRSYW5nZSk7CisKKyAgLy8vIFxicmllZiBJbmNyZWFzZSBpbmRlbnRhdGlvbiBmb3IgdGhlIGxpbmVzIGJldHdlZW4gdGhlIGdpdmVuIHNvdXJjZSByYW5nZS4KKyAgLy8vIFRvIGRldGVybWluZSB3aGF0IHRoZSBpbmRlbnRhdGlvbiBzaG91bGQgYmUsICdwYXJlbnRJbmRlbnQnIGlzIHVzZWQKKyAgLy8vIHRoYXQgc2hvdWxkIGJlIGF0IGEgc291cmNlIGxvY2F0aW9uIHdpdGggYW4gaW5kZW50YXRpb24gb25lIGRlZ3JlZQorICAvLy8gbG93ZXIgdGhhbiB0aGUgZ2l2ZW4gcmFuZ2UuCisgIGJvb2wgSW5jcmVhc2VJbmRlbnRhdGlvbihDaGFyU291cmNlUmFuZ2UgcmFuZ2UsIFNvdXJjZUxvY2F0aW9uIHBhcmVudEluZGVudCk7CisgIGJvb2wgSW5jcmVhc2VJbmRlbnRhdGlvbihTb3VyY2VSYW5nZSByYW5nZSwgU291cmNlTG9jYXRpb24gcGFyZW50SW5kZW50KSB7CisgICAgcmV0dXJuIEluY3JlYXNlSW5kZW50YXRpb24oQ2hhclNvdXJjZVJhbmdlOjpnZXRUb2tlblJhbmdlKHJhbmdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJbmRlbnQpOworICB9CisKKyAgLy8vIGdldEVkaXRCdWZmZXIgLSBUaGlzIGlzIGxpa2UgZ2V0UmV3cml0ZUJ1ZmZlckZvciwgYnV0IGFsd2F5cyByZXR1cm5zIGEKKyAgLy8vIGJ1ZmZlciwgYW5kIGFsbG93cyB5b3UgdG8gd3JpdGUgb24gaXQgZGlyZWN0bHkuICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UKKyAgLy8vIHdhbnQgZWZmaWNpZW50IGxvdy1sZXZlbCBhY2Nlc3MgdG8gYXBpcyBmb3Igc2NyaWJibGluZyBvbiBvbmUgc3BlY2lmaWMKKyAgLy8vIEZpbGVJRCdzIGJ1ZmZlci4KKyAgUmV3cml0ZUJ1ZmZlciAmZ2V0RWRpdEJ1ZmZlcihGaWxlSUQgRklEKTsKKworICAvLy8gZ2V0UmV3cml0ZUJ1ZmZlckZvciAtIFJldHVybiB0aGUgcmV3cml0ZSBidWZmZXIgZm9yIHRoZSBzcGVjaWZpZWQgRmlsZUlELgorICAvLy8gSWYgbm8gbW9kaWZpY2F0aW9uIGhhcyBiZWVuIG1hZGUgdG8gaXQsIHJldHVybiBudWxsLgorICBjb25zdCBSZXdyaXRlQnVmZmVyICpnZXRSZXdyaXRlQnVmZmVyRm9yKEZpbGVJRCBGSUQpIGNvbnN0IHsKKyAgICBzdGQ6Om1hcDxGaWxlSUQsIFJld3JpdGVCdWZmZXI+Ojpjb25zdF9pdGVyYXRvciBJID0KKyAgICAgIFJld3JpdGVCdWZmZXJzLmZpbmQoRklEKTsKKyAgICByZXR1cm4gSSA9PSBSZXdyaXRlQnVmZmVycy5lbmQoKSA/IG51bGxwdHIgOiAmSS0+c2Vjb25kOworICB9CisKKyAgLy8gSXRlcmF0b3JzIG92ZXIgcmV3cml0ZSBidWZmZXJzLgorICBidWZmZXJfaXRlcmF0b3IgYnVmZmVyX2JlZ2luKCkgeyByZXR1cm4gUmV3cml0ZUJ1ZmZlcnMuYmVnaW4oKTsgfQorICBidWZmZXJfaXRlcmF0b3IgYnVmZmVyX2VuZCgpIHsgcmV0dXJuIFJld3JpdGVCdWZmZXJzLmVuZCgpOyB9CisgIGNvbnN0X2J1ZmZlcl9pdGVyYXRvciBidWZmZXJfYmVnaW4oKSBjb25zdCB7IHJldHVybiBSZXdyaXRlQnVmZmVycy5iZWdpbigpOyB9CisgIGNvbnN0X2J1ZmZlcl9pdGVyYXRvciBidWZmZXJfZW5kKCkgY29uc3QgeyByZXR1cm4gUmV3cml0ZUJ1ZmZlcnMuZW5kKCk7IH0KKworICAvLy8gb3ZlcndyaXRlQ2hhbmdlZEZpbGVzIC0gU2F2ZSBhbGwgY2hhbmdlZCBmaWxlcyB0byBkaXNrLgorICAvLy8KKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgZmlsZXMgd2VyZSBub3Qgc2F2ZWQgc3VjY2Vzc2Z1bGx5LgorICAvLy8gT3V0cHV0cyBkaWFnbm9zdGljcyB2aWEgdGhlIHNvdXJjZSBtYW5hZ2VyJ3MgZGlhZ25vc3RpYyBlbmdpbmUKKyAgLy8vIGluIGNhc2Ugb2YgYW4gZXJyb3IuCisgIGJvb2wgb3ZlcndyaXRlQ2hhbmdlZEZpbGVzKCk7CisKK3ByaXZhdGU6CisgIHVuc2lnbmVkIGdldExvY2F0aW9uT2Zmc2V0QW5kRmlsZUlEKFNvdXJjZUxvY2F0aW9uIExvYywgRmlsZUlEICZGSUQpIGNvbnN0OworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfUkVXUklURV9DT1JFX1JFV1JJVEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Jld3JpdGUvQ29yZS9Ub2tlblJld3JpdGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9SZXdyaXRlL0NvcmUvVG9rZW5SZXdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMmMyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9SZXdyaXRlL0NvcmUvVG9rZW5SZXdyaXRlci5oCkBAIC0wLDAgKzEsODEgQEAKKy8vPT09LSBUb2tlblJld3JpdGVyLmggLSBUb2tlbi1iYXNlZCBSZXdyaXRlciAtLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBUb2tlblJld3JpdGVyIGNsYXNzLCB3aGljaCBpcyB1c2VkIGZvciBjb2RlCisvLyAgdHJhbnNmb3JtYXRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19SRVdSSVRFX0NPUkVfVE9LRU5SRVdSSVRFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfUkVXUklURV9DT1JFX1RPS0VOUkVXUklURVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9MZXgvVG9rZW4uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgTGFuZ09wdGlvbnM7CitjbGFzcyBTY3JhdGNoQnVmZmVyOworY2xhc3MgU291cmNlTWFuYWdlcjsKKworICBjbGFzcyBUb2tlblJld3JpdGVyIHsKKyAgICAvLy8gVG9rZW5MaXN0IC0gVGhpcyBpcyB0aGUgbGlzdCBvZiByYXcgdG9rZW5zIHRoYXQgbWFrZSB1cCB0aGlzIGZpbGUuICBFYWNoCisgICAgLy8vIG9mIHRoZXNlIHRva2VucyBoYXMgYSB1bmlxdWUgU291cmNlTG9jYXRpb24sIHdoaWNoIGlzIGEgRmlsZUlELgorICAgIHN0ZDo6bGlzdDxUb2tlbj4gVG9rZW5MaXN0OworCisgICAgLy8vIFRva2VuUmVmVHkgLSBUaGlzIGlzIHRoZSB0eXBlIHVzZWQgdG8gcmVmZXIgdG8gYSB0b2tlbiBpbiB0aGUgVG9rZW5MaXN0LgorICAgIHVzaW5nIFRva2VuUmVmVHkgPSBzdGQ6Omxpc3Q8VG9rZW4+OjppdGVyYXRvcjsKKworICAgIC8vLyBUb2tlbkF0TG9jIC0gVGhpcyBtYXAgaW5kaWNhdGVzIHdoaWNoIHRva2VuIGV4aXN0cyBhdCBhIHNwZWNpZmljCisgICAgLy8vIFNvdXJjZUxvY2F0aW9uLiAgU2luY2UgZWFjaCB0b2tlbiBoYXMgYSB1bmlxdWUgU291cmNlTG9jYXRpb24sIHRoaXMgaXMgYQorICAgIC8vLyBvbmUgdG8gb25lIG1hcC4gIFRoZSB0b2tlbiBjYW4gcmV0dXJuIGl0cyBvd24gbG9jYXRpb24gZGlyZWN0bHksIHRvIG1hcAorICAgIC8vLyBiYWNrd2FyZHMuCisgICAgc3RkOjptYXA8U291cmNlTG9jYXRpb24sIFRva2VuUmVmVHk+IFRva2VuQXRMb2M7CisKKyAgICAvLy8gU2NyYXRjaEJ1ZiAtIFRoaXMgaXMgdGhlIGJ1ZmZlciB0aGF0IHdlIGNyZWF0ZSBzY3JhdGNoIHRva2VucyBmcm9tLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxTY3JhdGNoQnVmZmVyPiBTY3JhdGNoQnVmOworCisgIHB1YmxpYzoKKyAgICAvLy8gVG9rZW5SZXdyaXRlciAtIFRoaXMgY3JlYXRlcyBhIFRva2VuUmV3cml0ZXIgZm9yIHRoZSBmaWxlIHdpdGggdGhlCisgICAgLy8vIHNwZWNpZmllZCBGaWxlSUQuCisgICAgVG9rZW5SZXdyaXRlcihGaWxlSUQgRklELCBTb3VyY2VNYW5hZ2VyICZTTSwgY29uc3QgTGFuZ09wdGlvbnMgJkxPKTsKKworICAgIFRva2VuUmV3cml0ZXIoY29uc3QgVG9rZW5SZXdyaXRlciAmKSA9IGRlbGV0ZTsKKyAgICBUb2tlblJld3JpdGVyICZvcGVyYXRvcj0oY29uc3QgVG9rZW5SZXdyaXRlciAmKSA9IGRlbGV0ZTsKKyAgICB+VG9rZW5SZXdyaXRlcigpOworCisgICAgdXNpbmcgdG9rZW5faXRlcmF0b3IgPSBzdGQ6Omxpc3Q8VG9rZW4+Ojpjb25zdF9pdGVyYXRvcjsKKworICAgIHRva2VuX2l0ZXJhdG9yIHRva2VuX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gVG9rZW5MaXN0LmJlZ2luKCk7IH0KKyAgICB0b2tlbl9pdGVyYXRvciB0b2tlbl9lbmQoKSBjb25zdCB7IHJldHVybiBUb2tlbkxpc3QuZW5kKCk7IH0KKworICAgIHRva2VuX2l0ZXJhdG9yIEFkZFRva2VuQmVmb3JlKHRva2VuX2l0ZXJhdG9yIEksIGNvbnN0IGNoYXIgKlZhbCk7CisKKyAgICB0b2tlbl9pdGVyYXRvciBBZGRUb2tlbkFmdGVyKHRva2VuX2l0ZXJhdG9yIEksIGNvbnN0IGNoYXIgKlZhbCkgeworICAgICAgYXNzZXJ0KEkgIT0gdG9rZW5fZW5kKCkgJiYgIkNhbm5vdCBpbnNlcnQgYWZ0ZXIgdG9rZW5fZW5kKCkhIik7CisgICAgICByZXR1cm4gQWRkVG9rZW5CZWZvcmUoKytJLCBWYWwpOworICAgIH0KKworICBwcml2YXRlOgorICAgIC8vLyBSZW1hcEl0ZXJhdG9yIC0gQ29udmVydCBmcm9tIHRva2VuX2l0ZXJhdG9yIChhIGNvbnN0IGl0ZXJhdG9yKSB0bworICAgIC8vLyBUb2tlblJlZlR5IChhIG5vbi1jb25zdCBpdGVyYXRvcikuCisgICAgVG9rZW5SZWZUeSBSZW1hcEl0ZXJhdG9yKHRva2VuX2l0ZXJhdG9yIEkpOworCisgICAgLy8vIEFkZFRva2VuIC0gQWRkIHRoZSBzcGVjaWZpZWQgdG9rZW4gaW50byB0aGUgUmV3cml0ZXIgYmVmb3JlIHRoZSBvdGhlcgorICAgIC8vLyBwb3NpdGlvbi4KKyAgICBUb2tlblJlZlR5IEFkZFRva2VuKGNvbnN0IFRva2VuICZULCBUb2tlblJlZlR5IFdoZXJlKTsKKyAgfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfUkVXUklURV9DT1JFX1RPS0VOUkVXUklURVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Gcm9udGVuZC9BU1RDb25zdW1lcnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Jld3JpdGUvRnJvbnRlbmQvQVNUQ29uc3VtZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA1NGU3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Jld3JpdGUvRnJvbnRlbmQvQVNUQ29uc3VtZXJzLmgKQEAgLTAsMCArMSw0OSBAQAorLy89PT0tLS0gQVNUQ29uc3VtZXJzLmggLSBBU1RDb25zdW1lciBpbXBsZW1lbnRhdGlvbnMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBBU1QgQ29uc3VtZXJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19SRVdSSVRFX0ZST05URU5EX0FTVENPTlNVTUVSU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfUkVXUklURV9GUk9OVEVORF9BU1RDT05TVU1FUlNfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFTVENvbnN1bWVyOworY2xhc3MgRGlhZ25vc3RpY3NFbmdpbmU7CitjbGFzcyBMYW5nT3B0aW9uczsKK2NsYXNzIFByZXByb2Nlc3NvcjsKKworLy8gT2JqQyByZXdyaXRlcjogYXR0ZW1wdHMgdG8gcmV3cml0ZSBPYmpDIGNvbnN0cnVjdHMgaW50byBwdXJlIEMgY29kZS4KKy8vIFRoaXMgaXMgY29uc2lkZXJlZCBleHBlcmltZW50YWwsIGFuZCBvbmx5IHdvcmtzIHdpdGggQXBwbGUncyBPYmpDIHJ1bnRpbWUuCitzdGQ6OnVuaXF1ZV9wdHI8QVNUQ29uc3VtZXI+CitDcmVhdGVPYmpDUmV3cml0ZXIoY29uc3Qgc3RkOjpzdHJpbmcgJkluRmlsZSwgc3RkOjp1bmlxdWVfcHRyPHJhd19vc3RyZWFtPiBPUywKKyAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MsIGNvbnN0IExhbmdPcHRpb25zICZMT3B0cywKKyAgICAgICAgICAgICAgICAgICBib29sIFNpbGVuY2VSZXdyaXRlTWFjcm9XYXJuaW5nKTsKK3N0ZDo6dW5pcXVlX3B0cjxBU1RDb25zdW1lcj4KK0NyZWF0ZU1vZGVybk9iakNSZXdyaXRlcihjb25zdCBzdGQ6OnN0cmluZyAmSW5GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxyYXdfb3N0cmVhbT4gT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzLCBjb25zdCBMYW5nT3B0aW9ucyAmTE9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaWxlbmNlUmV3cml0ZU1hY3JvV2FybmluZywgYm9vbCBMaW5lSW5mbyk7CisKKy8vLyBDcmVhdGVIVE1MUHJpbnRlciAtIENyZWF0ZSBhbiBBU1QgY29uc3VtZXIgd2hpY2ggcmV3cml0ZXMgc291cmNlIGNvZGUgdG8KKy8vLyBIVE1MIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBzdWl0YWJsZSBmb3Igdmlld2luZyBpbiBhIHdlYi1icm93c2VyLgorc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPiBDcmVhdGVIVE1MUHJpbnRlcihzdGQ6OnVuaXF1ZV9wdHI8cmF3X29zdHJlYW0+IE9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVwcm9jZXNzb3IgJlBQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFN5bnRheEhpZ2hsaWdodCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGlnaGxpZ2h0TWFjcm9zID0gdHJ1ZSk7CisKK30gLy8gZW5kIGNsYW5nIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Jld3JpdGUvRnJvbnRlbmQvRml4SXRSZXdyaXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Gcm9udGVuZC9GaXhJdFJld3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhYjc3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Jld3JpdGUvRnJvbnRlbmQvRml4SXRSZXdyaXRlci5oCkBAIC0wLDAgKzEsMTM1IEBACisvLz09PS0gRml4SXRSZXdyaXRlci5oIC0gRml4LUl0IFJld3JpdGVyIERpYWdub3N0aWMgQ2xpZW50IC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaXMgYSBkaWFnbm9zdGljIGNsaWVudCBhZGFwdG9yIHRoYXQgcGVyZm9ybXMgcmV3cml0ZXMgYXMKKy8vIHN1Z2dlc3RlZCBieSBjb2RlIG1vZGlmaWNhdGlvbiBoaW50cyBhdHRhY2hlZCB0byBkaWFnbm9zdGljcy4gSXQKKy8vIHRoZW4gZm9yd2FyZHMgYW55IGRpYWdub3N0aWNzIHRvIHRoZSBhZGFwdGVkIGRpYWdub3N0aWMgY2xpZW50LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19SRVdSSVRFX0ZST05URU5EX0ZJWElUUkVXUklURVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX1JFV1JJVEVfRlJPTlRFTkRfRklYSVRSRVdSSVRFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvRWRpdC9FZGl0ZWRTb3VyY2UuaCIKKyNpbmNsdWRlICJjbGFuZy9SZXdyaXRlL0NvcmUvUmV3cml0ZXIuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBMYW5nT3B0aW9uczsKK2NsYXNzIFNvdXJjZU1hbmFnZXI7CisKK2NsYXNzIEZpeEl0T3B0aW9ucyB7CitwdWJsaWM6CisgIEZpeEl0T3B0aW9ucygpID0gZGVmYXVsdDsKKyAgdmlydHVhbCB+Rml4SXRPcHRpb25zKCk7CisKKyAgLy8vIFxicmllZiBUaGlzIGZpbGUgaXMgYWJvdXQgdG8gYmUgcmV3cml0dGVuLiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGZpbGUKKyAgLy8vIHRoYXQgaXMgb2theSB0byB3cml0ZSB0by4KKyAgLy8vCisgIC8vLyBccGFyYW0gZmQgb3V0IHBhcmFtZXRlciBmb3IgZmlsZSBkZXNjcmlwdG9yLiBBZnRlciB0aGUgY2FsbCBpdCBtYXkgYmUgc2V0CisgIC8vLyB0byBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIHJldHVybmVkIGZpbGVuYW1lLCBvciBpdCB3aWxsIGJlIC0xCisgIC8vLyBvdGhlcndpc2UuCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgUmV3cml0ZUZpbGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZGaWxlbmFtZSwgaW50ICZmZCkgPSAwOworCisgIC8vLyBUcnVlIGlmIGZpbGVzIHNob3VsZCBiZSB1cGRhdGVkIGluIHBsYWNlLiBSZXdyaXRlRmlsZW5hbWUgaXMgb25seSBjYWxsZWQKKyAgLy8vIGlmIHRoaXMgaXMgZmFsc2UuCisgIGJvb2wgSW5QbGFjZSA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0byBhYm9ydCBmaXhpbmcgYSBmaWxlIHdoZW4gbm90IGFsbCBlcnJvcnMgY291bGQgYmUgZml4ZWQuCisgIGJvb2wgRml4V2hhdFlvdUNhbiA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0byBvbmx5IGZpeCB3YXJuaW5ncyBhbmQgbm90IGVycm9ycy4KKyAgYm9vbCBGaXhPbmx5V2FybmluZ3MgPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIElmIHRydWUsIG9ubHkgcGFzcyB0aGUgZGlhZ25vc3RpYyB0byB0aGUgYWN0dWFsIGRpYWdub3N0aWMgY29uc3VtZXIKKyAgLy8vIGlmIGl0IGlzIGFuIGVycm9yIG9yIGEgZml4aXQgd2FzIGFwcGxpZWQgYXMgcGFydCBvZiB0aGUgZGlhZ25vc3RpYy4KKyAgLy8vIEl0IGJhc2ljYWxseSBzaWxlbmNlcyB3YXJuaW5ncyB3aXRob3V0IGFjY29tcGFueWluZyBmaXhpdHMuCisgIGJvb2wgU2lsZW50ID0gZmFsc2U7Cit9OworCitjbGFzcyBGaXhJdFJld3JpdGVyIDogcHVibGljIERpYWdub3N0aWNDb25zdW1lciB7CisgIC8vLyBcYnJpZWYgVGhlIGRpYWdub3N0aWNzIG1hY2hpbmVyeS4KKyAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzOworCisgIGVkaXQ6OkVkaXRlZFNvdXJjZSBFZGl0b3I7CisKKyAgLy8vIFxicmllZiBUaGUgcmV3cml0ZXIgdXNlZCB0byBwZXJmb3JtIHRoZSB2YXJpb3VzIGNvZGUKKyAgLy8vIG1vZGlmaWNhdGlvbnMuCisgIFJld3JpdGVyIFJld3JpdGU7CisKKyAgLy8vIFxicmllZiBUaGUgZGlhZ25vc3RpYyBjbGllbnQgdGhhdCBwZXJmb3JtcyB0aGUgYWN0dWFsIGZvcm1hdHRpbmcKKyAgLy8vIG9mIGVycm9yIG1lc3NhZ2VzLgorICBEaWFnbm9zdGljQ29uc3VtZXIgKkNsaWVudDsKKyAgc3RkOjp1bmlxdWVfcHRyPERpYWdub3N0aWNDb25zdW1lcj4gT3duZXI7CisKKyAgLy8vIFxicmllZiBUdXJuIGFuIGlucHV0IHBhdGggaW50byBhbiBvdXRwdXQgcGF0aC4gTlVMTCBpbXBsaWVzIG92ZXJ3cml0aW5nCisgIC8vLyB0aGUgb3JpZ2luYWwuCisgIEZpeEl0T3B0aW9ucyAqRml4SXRPcHRzOworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiByZXdyaXRlciBmYWlsdXJlcy4KKyAgdW5zaWduZWQgTnVtRmFpbHVyZXMgPSAwOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgcHJldmlvdXMgZGlhZ25vc3RpYyB3YXMgbm90IHBhc3NlZCB0byB0aGUgY29uc3VtZXIuCisgIGJvb2wgUHJldkRpYWdTaWxlbmNlZCA9IGZhbHNlOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgSW5pdGlhbGl6ZSBhIG5ldyBmaXgtaXQgcmV3cml0ZXIuCisgIEZpeEl0UmV3cml0ZXIoRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzLCBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3IsCisgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLCBGaXhJdE9wdGlvbnMgKkZpeEl0T3B0cyk7CisKKyAgLy8vIFxicmllZiBEZXN0cm95IHRoZSBmaXgtaXQgcmV3cml0ZXIuCisgIH5GaXhJdFJld3JpdGVyKCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBtb2RpZmljYXRpb25zIGZvciBhIGdpdmVuIGZpbGUuCisgIGJvb2wgSXNNb2RpZmllZChGaWxlSUQgSUQpIGNvbnN0IHsKKyAgICByZXR1cm4gUmV3cml0ZS5nZXRSZXdyaXRlQnVmZmVyRm9yKElEKSAhPSBudWxscHRyOworICB9CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBSZXdyaXRlcjo6YnVmZmVyX2l0ZXJhdG9yOworCisgIC8vIEl0ZXJhdGlvbiBvdmVyIGZpbGVzIHdpdGggY2hhbmdlcy4KKyAgaXRlcmF0b3IgYnVmZmVyX2JlZ2luKCkgeyByZXR1cm4gUmV3cml0ZS5idWZmZXJfYmVnaW4oKTsgfQorICBpdGVyYXRvciBidWZmZXJfZW5kKCkgeyByZXR1cm4gUmV3cml0ZS5idWZmZXJfZW5kKCk7IH0KKworICAvLy8gXGJyaWVmIFdyaXRlIGEgc2luZ2xlIG1vZGlmaWVkIHNvdXJjZSBmaWxlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlcmUgd2FzIGFuIGVycm9yLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgV3JpdGVGaXhlZEZpbGUoRmlsZUlEIElELCByYXdfb3N0cmVhbSAmT1MpOworCisgIC8vLyBcYnJpZWYgV3JpdGUgdGhlIG1vZGlmaWVkIHNvdXJjZSBmaWxlcy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIFdyaXRlRml4ZWRGaWxlcygKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gKlJld3JpdHRlbkZpbGVzID0gbnVsbHB0cik7CisKKyAgLy8vIEluY2x1ZGVJbkRpYWdub3N0aWNDb3VudHMgLSBUaGlzIG1ldGhvZCAod2hvc2UgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAvLy8gcmV0dXJucyB0cnVlKSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGlhZ25vc3RpY3MgaGFuZGxlZCBieSB0aGlzCisgIC8vLyBEaWFnbm9zdGljQ29uc3VtZXIgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBudW1iZXIgb2YgZGlhZ25vc3RpY3MKKyAgLy8vIHJlcG9ydGVkIGJ5IERpYWdub3N0aWNzRW5naW5lLgorICBib29sIEluY2x1ZGVJbkRpYWdub3N0aWNDb3VudHMoKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gSGFuZGxlRGlhZ25vc3RpYyAtIEhhbmRsZSB0aGlzIGRpYWdub3N0aWMsIHJlcG9ydGluZyBpdCB0byB0aGUgdXNlciBvcgorICAvLy8gY2FwdHVyaW5nIGl0IHRvIGEgbG9nIGFzIG5lZWRlZC4KKyAgdm9pZCBIYW5kbGVEaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBEaWFnTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljICZJbmZvKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIEVtaXQgYSBkaWFnbm9zdGljIHZpYSB0aGUgYWRhcHRlZCBkaWFnbm9zdGljIGNsaWVudC4KKyAgdm9pZCBEaWFnKFNvdXJjZUxvY2F0aW9uIExvYywgdW5zaWduZWQgRGlhZ0lEKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1JFV1JJVEVfRlJPTlRFTkRfRklYSVRSRVdSSVRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9SZXdyaXRlL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9ucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjgzYWMxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuaApAQCAtMCwwICsxLDg2IEBACisvLz09PS0tIEZyb250ZW5kQWN0aW9ucy5oIC0gVXNlZnVsIEZyb250ZW5kIEFjdGlvbnMgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfUkVXUklURV9GUk9OVEVORF9GUk9OVEVOREFDVElPTlNfSAorI2RlZmluZSBMTFZNX0NMQU5HX1JFV1JJVEVfRlJPTlRFTkRfRlJPTlRFTkRBQ1RJT05TX0gKKworI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CitjbGFzcyBGaXhJdFJld3JpdGVyOworY2xhc3MgRml4SXRPcHRpb25zOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQVNUIENvbnN1bWVyIEFjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIEhUTUxQcmludEFjdGlvbiA6IHB1YmxpYyBBU1RGcm9udGVuZEFjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RDb25zdW1lcj4gQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBGaXhJdEFjdGlvbiA6IHB1YmxpYyBBU1RGcm9udGVuZEFjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxGaXhJdFJld3JpdGVyPiBSZXdyaXRlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPEZpeEl0T3B0aW9ucz4gRml4SXRPcHRzOworCisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RDb25zdW1lcj4gQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7CisKKyAgYm9vbCBCZWdpblNvdXJjZUZpbGVBY3Rpb24oQ29tcGlsZXJJbnN0YW5jZSAmQ0kpIG92ZXJyaWRlOworCisgIHZvaWQgRW5kU291cmNlRmlsZUFjdGlvbigpIG92ZXJyaWRlOworCisgIGJvb2wgaGFzQVNURmlsZVN1cHBvcnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorCitwdWJsaWM6CisgIEZpeEl0QWN0aW9uKCk7CisgIH5GaXhJdEFjdGlvbigpIG92ZXJyaWRlOworfTsKKworLy8vIFxicmllZiBFbWl0cyBjaGFuZ2VzIHRvIHRlbXBvcmFyeSBmaWxlcyBhbmQgdXNlcyB0aGVtIGZvciB0aGUgb3JpZ2luYWwKKy8vLyBmcm9udGVuZCBhY3Rpb24uCitjbGFzcyBGaXhJdFJlY29tcGlsZSA6IHB1YmxpYyBXcmFwcGVyRnJvbnRlbmRBY3Rpb24geworcHVibGljOgorICBGaXhJdFJlY29tcGlsZShzdGQ6OnVuaXF1ZV9wdHI8RnJvbnRlbmRBY3Rpb24+IFdyYXBwZWRBY3Rpb24pCisgICAgOiBXcmFwcGVyRnJvbnRlbmRBY3Rpb24oc3RkOjptb3ZlKFdyYXBwZWRBY3Rpb24pKSB7fQorCitwcm90ZWN0ZWQ6CisgIGJvb2wgQmVnaW5JbnZvY2F0aW9uKENvbXBpbGVySW5zdGFuY2UgJkNJKSBvdmVycmlkZTsKK307CisKK2NsYXNzIFJld3JpdGVPYmpDQWN0aW9uIDogcHVibGljIEFTVEZyb250ZW5kQWN0aW9uIHsKK3Byb3RlY3RlZDoKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPiBDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKSBvdmVycmlkZTsKK307CisKK2NsYXNzIFJld3JpdGVNYWNyb3NBY3Rpb24gOiBwdWJsaWMgUHJlcHJvY2Vzc29yRnJvbnRlbmRBY3Rpb24geworcHJvdGVjdGVkOgorICB2b2lkIEV4ZWN1dGVBY3Rpb24oKSBvdmVycmlkZTsKK307CisKK2NsYXNzIFJld3JpdGVUZXN0QWN0aW9uIDogcHVibGljIFByZXByb2Nlc3NvckZyb250ZW5kQWN0aW9uIHsKK3Byb3RlY3RlZDoKKyAgdm9pZCBFeGVjdXRlQWN0aW9uKCkgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBSZXdyaXRlSW5jbHVkZXNBY3Rpb24gOiBwdWJsaWMgUHJlcHJvY2Vzc29yRnJvbnRlbmRBY3Rpb24geworICBzdGQ6OnNoYXJlZF9wdHI8cmF3X29zdHJlYW0+IE91dHB1dFN0cmVhbTsKKyAgY2xhc3MgUmV3cml0ZUltcG9ydHNMaXN0ZW5lcjsKK3Byb3RlY3RlZDoKKyAgYm9vbCBCZWdpblNvdXJjZUZpbGVBY3Rpb24oQ29tcGlsZXJJbnN0YW5jZSAmQ0kpIG92ZXJyaWRlOworICB2b2lkIEV4ZWN1dGVBY3Rpb24oKSBvdmVycmlkZTsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9SZXdyaXRlL0Zyb250ZW5kL1Jld3JpdGVycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Gcm9udGVuZC9SZXdyaXRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQ3NmRmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Gcm9udGVuZC9SZXdyaXRlcnMuaApAQCAtMCwwICsxLDM1IEBACisvLz09PS0tLSBSZXdyaXRlcnMuaCAtIFJld3JpdGVyIGltcGxlbWVudGF0aW9ucyAgICAgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGhlYWRlciBjb250YWlucyBtaXNjZWxsYW5lb3VzIHV0aWxpdGllcyBmb3IgdmFyaW91cyBmcm9udC1lbmQgYWN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfUkVXUklURV9GUk9OVEVORF9SRVdSSVRFUlNfSAorI2RlZmluZSBMTFZNX0NMQU5HX1JFV1JJVEVfRlJPTlRFTkRfUkVXUklURVJTX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK2NsYXNzIFByZXByb2Nlc3NvcjsKK2NsYXNzIFByZXByb2Nlc3Nvck91dHB1dE9wdGlvbnM7CisKKy8vLyBSZXdyaXRlTWFjcm9zSW5JbnB1dCAtIEltcGxlbWVudCAtcmV3cml0ZS1tYWNyb3MgbW9kZS4KK3ZvaWQgUmV3cml0ZU1hY3Jvc0luSW5wdXQoUHJlcHJvY2Vzc29yICZQUCwgcmF3X29zdHJlYW0gKk9TKTsKKworLy8vIERvUmV3cml0ZVRlc3QgLSBBIHNpbXBsZSB0ZXN0IGZvciB0aGUgVG9rZW5SZXdyaXRlciBjbGFzcy4KK3ZvaWQgRG9SZXdyaXRlVGVzdChQcmVwcm9jZXNzb3IgJlBQLCByYXdfb3N0cmVhbSAqT1MpOworCisvLy8gUmV3cml0ZUluY2x1ZGVzSW5JbnB1dCAtIEltcGxlbWVudCAtZnJld3JpdGUtaW5jbHVkZXMgbW9kZS4KK3ZvaWQgUmV3cml0ZUluY2x1ZGVzSW5JbnB1dChQcmVwcm9jZXNzb3IgJlBQLCByYXdfb3N0cmVhbSAqT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJlcHJvY2Vzc29yT3V0cHV0T3B0aW9ucyAmT3B0cyk7CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0FuYWx5c2lzQmFzZWRXYXJuaW5ncy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9BbmFseXNpc0Jhc2VkV2FybmluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGRkMmQzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9BbmFseXNpc0Jhc2VkV2FybmluZ3MuaApAQCAtMCwwICsxLDEwMyBAQAorLy89LSBBbmFseXNpc0Jhc2VkV2FybmluZ3MuaCAtIFNlbWEgd2FybmluZ3MgYmFzZWQgb24gbGliQW5hbHlzaXMgLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBBbmFseXNpc0Jhc2VkV2FybmluZ3MsIGEgd29ya2VyIG9iamVjdCB1c2VkIGJ5IFNlbWEKKy8vIHRoYXQgaXNzdWVzIHdhcm5pbmdzIGJhc2VkIG9uIGRhdGFmbG93LWFuYWx5c2lzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NFTUFfQU5BTFlTSVNCQVNFRFdBUk5JTkdTX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TRU1BX0FOQUxZU0lTQkFTRURXQVJOSU5HU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBCbG9ja0V4cHI7CitjbGFzcyBEZWNsOworY2xhc3MgRnVuY3Rpb25EZWNsOworY2xhc3MgT2JqQ01ldGhvZERlY2w7CitjbGFzcyBRdWFsVHlwZTsKK2NsYXNzIFNlbWE7CituYW1lc3BhY2Ugc2VtYSB7CisgIGNsYXNzIEZ1bmN0aW9uU2NvcGVJbmZvOworfQorCituYW1lc3BhY2Ugc2VtYSB7CisKK2NsYXNzIEFuYWx5c2lzQmFzZWRXYXJuaW5ncyB7CitwdWJsaWM6CisgIGNsYXNzIFBvbGljeSB7CisgICAgZnJpZW5kIGNsYXNzIEFuYWx5c2lzQmFzZWRXYXJuaW5nczsKKyAgICAvLyBUaGUgd2FybmluZ3MgdG8gcnVuLgorICAgIHVuc2lnbmVkIGVuYWJsZUNoZWNrRmFsbFRocm91Z2ggOiAxOworICAgIHVuc2lnbmVkIGVuYWJsZUNoZWNrVW5yZWFjaGFibGUgOiAxOworICAgIHVuc2lnbmVkIGVuYWJsZVRocmVhZFNhZmV0eUFuYWx5c2lzIDogMTsKKyAgICB1bnNpZ25lZCBlbmFibGVDb25zdW1lZEFuYWx5c2lzIDogMTsKKyAgcHVibGljOgorICAgIFBvbGljeSgpOworICAgIHZvaWQgZGlzYWJsZUNoZWNrRmFsbFRocm91Z2goKSB7IGVuYWJsZUNoZWNrRmFsbFRocm91Z2ggPSAwOyB9CisgIH07CisKK3ByaXZhdGU6CisgIFNlbWEgJlM7CisgIFBvbGljeSBEZWZhdWx0UG9saWN5OworCisgIGVudW0gVmlzaXRGbGFnIHsgTm90VmlzaXRlZCA9IDAsIFZpc2l0ZWQgPSAxLCBQZW5kaW5nID0gMiB9OworICBsbHZtOjpEZW5zZU1hcDxjb25zdCBGdW5jdGlvbkRlY2wqLCBWaXNpdEZsYWc+IFZpc2l0ZWRGRDsKKworICAvLy8gXG5hbWUgU3RhdGlzdGljcworICAvLy8gQHsKKworICAvLy8gXGJyaWVmIE51bWJlciBvZiBmdW5jdGlvbiBDRkdzIGJ1aWx0IGFuZCBhbmFseXplZC4KKyAgdW5zaWduZWQgTnVtRnVuY3Rpb25zQW5hbHl6ZWQ7CisKKyAgLy8vIFxicmllZiBOdW1iZXIgb2YgZnVuY3Rpb25zIGZvciB3aGljaCB0aGUgQ0ZHIGNvdWxkIG5vdCBiZSBzdWNjZXNzZnVsbHkKKyAgLy8vIGJ1aWx0LgorICB1bnNpZ25lZCBOdW1GdW5jdGlvbnNXaXRoQmFkQ0ZHczsKKworICAvLy8gXGJyaWVmIFRvdGFsIG51bWJlciBvZiBibG9ja3MgYWNyb3NzIGFsbCBDRkdzLgorICB1bnNpZ25lZCBOdW1DRkdCbG9ja3M7CisKKyAgLy8vIFxicmllZiBMYXJnZXN0IG51bWJlciBvZiBDRkcgYmxvY2tzIGZvciBhIHNpbmdsZSBmdW5jdGlvbiBhbmFseXplZC4KKyAgdW5zaWduZWQgTWF4Q0ZHQmxvY2tzUGVyRnVuY3Rpb247CisKKyAgLy8vIFxicmllZiBUb3RhbCBudW1iZXIgb2YgQ0ZHcyB3aXRoIHZhcmlhYmxlcyBhbmFseXplZCBmb3IgdW5pbml0aWFsaXplZAorICAvLy8gdXNlcy4KKyAgdW5zaWduZWQgTnVtVW5pbml0QW5hbHlzaXNGdW5jdGlvbnM7CisKKyAgLy8vIFxicmllZiBUb3RhbCBudW1iZXIgb2YgdmFyaWFibGVzIGFuYWx5emVkIGZvciB1bmluaXRpYWxpemVkIHVzZXMuCisgIHVuc2lnbmVkIE51bVVuaW5pdEFuYWx5c2lzVmFyaWFibGVzOworCisgIC8vLyBcYnJpZWYgTWF4IG51bWJlciBvZiB2YXJpYWJsZXMgYW5hbHl6ZWQgZm9yIHVuaW5pdGlhbGl6ZWQgdXNlcyBpbiBhIHNpbmdsZQorICAvLy8gZnVuY3Rpb24uCisgIHVuc2lnbmVkIE1heFVuaW5pdEFuYWx5c2lzVmFyaWFibGVzUGVyRnVuY3Rpb247CisKKyAgLy8vIFxicmllZiBUb3RhbCBudW1iZXIgb2YgYmxvY2sgdmlzaXRzIGR1cmluZyB1bmluaXRpYWxpemVkIHVzZSBhbmFseXNpcy4KKyAgdW5zaWduZWQgTnVtVW5pbml0QW5hbHlzaXNCbG9ja1Zpc2l0czsKKworICAvLy8gXGJyaWVmIE1heCBudW1iZXIgb2YgYmxvY2sgdmlzaXRzIGR1cmluZyB1bmluaXRpYWxpemVkIHVzZSBhbmFseXNpcyBvZgorICAvLy8gYSBzaW5nbGUgZnVuY3Rpb24uCisgIHVuc2lnbmVkIE1heFVuaW5pdEFuYWx5c2lzQmxvY2tWaXNpdHNQZXJGdW5jdGlvbjsKKworICAvLy8gQH0KKworcHVibGljOgorICBBbmFseXNpc0Jhc2VkV2FybmluZ3MoU2VtYSAmcyk7CisKKyAgdm9pZCBJc3N1ZVdhcm5pbmdzKFBvbGljeSBQLCBGdW5jdGlvblNjb3BlSW5mbyAqZnNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbCAqRCwgY29uc3QgQmxvY2tFeHByICpibGtFeHByKTsKKworICBQb2xpY3kgZ2V0RGVmYXVsdFBvbGljeSgpIHsgcmV0dXJuIERlZmF1bHRQb2xpY3k7IH0KKworICB2b2lkIFByaW50U3RhdHMoKSBjb25zdDsKK307CisKK319IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmc6OnNlbWEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0F0dHJQYXJzZWRBdHRySW1wbC5pbmMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0F0dHJQYXJzZWRBdHRySW1wbC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMwMTUzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvQXR0clBhcnNlZEF0dHJJbXBsLmluYwpAQCAtMCwwICsxLDI2OTkgQEAKKy8qPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogUGFyc2VkIGF0dHJpYnV0ZSBoZWxwZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLCBkbyBub3QgZWRpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKK3N0YXRpYyBib29sIGRlZmF1bHRBcHBlcnRhaW5zVG8oU2VtYSAmLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICYsY29uc3QgRGVjbCAqKSB7CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cyhTZW1hICYsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJikgeworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cyhjb25zdCBUYXJnZXRJbmZvICYpIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZyhjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisgIHJldHVybiBVSU5UX01BWDsKK30KKworc3RhdGljIGJvb2wgY2hlY2tBTURHUFVGbGF0V29ya0dyb3VwU2l6ZUFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImtlcm5lbCBmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0ZvckFNREdQVUZsYXRXb3JrR3JvdXBTaXplKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9mdW5jdGlvbiwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tBTURHUFVOdW1TR1BSQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAia2VybmVsIGZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yQU1ER1BVTnVtU0dQUihsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrQU1ER1BVTnVtVkdQUkFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImtlcm5lbCBmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0ZvckFNREdQVU51bVZHUFIobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2Z1bmN0aW9uLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja0FNREdQVVdhdmVzUGVyRVVBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJrZXJuZWwgZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JBTURHUFVXYXZlc1BlckVVKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9mdW5jdGlvbiwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgaXNUYXJnZXRhcm10aHVtYmFybWVidGh1bWJlYmF2cng4Nng4Nl82NG1zcDQzMG1pcHNtaXBzZWwoY29uc3QgVGFyZ2V0SW5mbyAmVGFyZ2V0KSB7CisgIGNvbnN0IGxsdm06OlRyaXBsZSAmVCA9IFRhcmdldC5nZXRUcmlwbGUoKTsKKyAgcmV0dXJuIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6dGh1bWIgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphcm1lYiB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OnRodW1iZWIgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphdnIgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODZfNjQgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptc3A0MzAgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwc2VsKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tBVlJTaWduYWxBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGlzVGFyZ2V0YXZyKGNvbnN0IFRhcmdldEluZm8gJlRhcmdldCkgeworICBjb25zdCBsbHZtOjpUcmlwbGUgJlQgPSBUYXJnZXQuZ2V0VHJpcGxlKCk7CisgIHJldHVybiB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmF2cik7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JBVlJTaWduYWwobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2Z1bmN0aW9uLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworfQorCitzdGF0aWMgYm9vbCBpc1N0cnVjdChjb25zdCBEZWNsICpEKSB7CisgIGlmIChjb25zdCBhdXRvICpTID0gZHluX2Nhc3Q8UmVjb3JkRGVjbD4oRCkpCisgICAgcmV0dXJuICFTLT5pc1VuaW9uKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tBYmlUYWdBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzU3RydWN0KEQpICYmICFpc2E8VmFyRGVjbD4oRCkgJiYgIWlzYTxGdW5jdGlvbkRlY2w+KEQpICYmICFpc2E8TmFtZXNwYWNlRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgInN0cnVjdHMsIHZhcmlhYmxlcywgZnVuY3Rpb25zLCBhbmQgbmFtZXNwYWNlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yQWJpVGFnKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9yZWNvcmRfbm90X2lzX3VuaW9uLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX3ZhcmlhYmxlLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2Z1bmN0aW9uLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX25hbWVzcGFjZSwgLypJc1N1cHBvcnRlZD0qL0xhbmdPcHRzLkNQbHVzUGx1cykpOworfQorCitzdGF0aWMgYm9vbCBjaGVja0FjcXVpcmVDYXBhYmlsaXR5QXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdW5zaWduZWQgQWNxdWlyZUNhcGFiaWxpdHlBdHRyU3BlbGxpbmdNYXAoY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBlbnVtIFNwZWxsaW5nIHsKKyAgICBHTlVfYWNxdWlyZV9jYXBhYmlsaXR5ID0gMCwKKyAgICBDWFgxMV9jbGFuZ19hY3F1aXJlX2NhcGFiaWxpdHkgPSAxLAorICAgIEdOVV9hY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5ID0gMiwKKyAgICBDWFgxMV9jbGFuZ19hY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5ID0gMywKKyAgICBHTlVfZXhjbHVzaXZlX2xvY2tfZnVuY3Rpb24gPSA0LAorICAgIEdOVV9zaGFyZWRfbG9ja19mdW5jdGlvbiA9IDUKKyAgfTsKKworICB1bnNpZ25lZCBJZHggPSBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCk7CisgIHN3aXRjaCAoSWR4KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzcGVsbGluZyBsaXN0IGluZGV4Iik7CisgICAgY2FzZSAwOiByZXR1cm4gR05VX2FjcXVpcmVfY2FwYWJpbGl0eTsKKyAgICBjYXNlIDE6IHJldHVybiBDWFgxMV9jbGFuZ19hY3F1aXJlX2NhcGFiaWxpdHk7CisgICAgY2FzZSAyOiByZXR1cm4gR05VX2FjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHk7CisgICAgY2FzZSAzOiByZXR1cm4gQ1hYMTFfY2xhbmdfYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eTsKKyAgICBjYXNlIDQ6IHJldHVybiBHTlVfZXhjbHVzaXZlX2xvY2tfZnVuY3Rpb247CisgICAgY2FzZSA1OiByZXR1cm4gR05VX3NoYXJlZF9sb2NrX2Z1bmN0aW9uOworICB9Cit9CisKK3N0YXRpYyBib29sIGlzU2hhcmVkVmFyKGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKGNvbnN0IGF1dG8gKlMgPSBkeW5fY2FzdDxWYXJEZWNsPihEKSkKKyAgICByZXR1cm4gUy0+aGFzR2xvYmFsU3RvcmFnZSgpICYmICFTLT5nZXRUTFNLaW5kKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tBY3F1aXJlZEFmdGVyQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RmllbGREZWNsPihEKSAmJiAhaXNTaGFyZWRWYXIoRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJub24tc3RhdGljIGRhdGEgbWVtYmVycyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0FjcXVpcmVkQmVmb3JlQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RmllbGREZWNsPihEKSAmJiAhaXNTaGFyZWRWYXIoRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJub24tc3RhdGljIGRhdGEgbWVtYmVycyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBpc0dsb2JhbFZhcihjb25zdCBEZWNsICpEKSB7CisgIGlmIChjb25zdCBhdXRvICpTID0gZHluX2Nhc3Q8VmFyRGVjbD4oRCkpCisgICAgcmV0dXJuIFMtPmhhc0dsb2JhbFN0b3JhZ2UoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0FsaWFzQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSAmJiAhaXNHbG9iYWxWYXIoRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0FsaWduVmFsdWVBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxWYXJEZWNsPihEKSAmJiAhaXNhPFR5cGVkZWZOYW1lRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJ2YXJpYWJsZXMgYW5kIHR5cGVkZWZzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JBbGlnblZhbHVlKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV92YXJpYWJsZSwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV90eXBlX2FsaWFzLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworfQorCitzdGF0aWMgdW5zaWduZWQgQWxpZ25lZEF0dHJTcGVsbGluZ01hcChjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisgIGVudW0gU3BlbGxpbmcgeworICAgIEdOVV9hbGlnbmVkID0gMCwKKyAgICBDWFgxMV9nbnVfYWxpZ25lZCA9IDEsCisgICAgRGVjbHNwZWNfYWxpZ24gPSAyLAorICAgIEtleXdvcmRfYWxpZ25hcyA9IDMsCisgICAgS2V5d29yZF9BbGlnbmFzID0gNAorICB9OworCisgIHVuc2lnbmVkIElkeCA9IEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKTsKKyAgc3dpdGNoIChJZHgpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHNwZWxsaW5nIGxpc3QgaW5kZXgiKTsKKyAgICBjYXNlIDA6IHJldHVybiBHTlVfYWxpZ25lZDsKKyAgICBjYXNlIDE6IHJldHVybiBDWFgxMV9nbnVfYWxpZ25lZDsKKyAgICBjYXNlIDI6IHJldHVybiBEZWNsc3BlY19hbGlnbjsKKyAgICBjYXNlIDM6IHJldHVybiBLZXl3b3JkX2FsaWduYXM7CisgICAgY2FzZSA0OiByZXR1cm4gS2V5d29yZF9BbGlnbmFzOworICB9Cit9CisKK3N0YXRpYyBib29sIGlzSGFzRnVuY3Rpb25Qcm90byhjb25zdCBEZWNsICpEKSB7CisgIGlmIChjb25zdCBhdXRvICpTID0gZHluX2Nhc3Q8RGVjbD4oRCkpCisgICAgcmV0dXJuIChTLT5nZXRGdW5jdGlvblR5cGUodHJ1ZSkgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNhPEZ1bmN0aW9uUHJvdG9UeXBlPihTLT5nZXRGdW5jdGlvblR5cGUoKSkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2E8T2JqQ01ldGhvZERlY2w+KFMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2E8QmxvY2tEZWNsPihTKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0FsbG9jQWxpZ25BcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzSGFzRnVuY3Rpb25Qcm90byhEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgIm5vbi1LJlItc3R5bGUgZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrQWxsb2NTaXplQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yQWxsb2NTaXplKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9mdW5jdGlvbiwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tBbHdheXNJbmxpbmVBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBBbHdheXNJbmxpbmVBdHRyU3BlbGxpbmdNYXAoY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBlbnVtIFNwZWxsaW5nIHsKKyAgICBHTlVfYWx3YXlzX2lubGluZSA9IDAsCisgICAgQ1hYMTFfZ251X2Fsd2F5c19pbmxpbmUgPSAxLAorICAgIEtleXdvcmRfZm9yY2VpbmxpbmUgPSAyCisgIH07CisKKyAgdW5zaWduZWQgSWR4ID0gQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpOworICBzd2l0Y2ggKElkeCkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc3BlbGxpbmcgbGlzdCBpbmRleCIpOworICAgIGNhc2UgMDogcmV0dXJuIEdOVV9hbHdheXNfaW5saW5lOworICAgIGNhc2UgMTogcmV0dXJuIENYWDExX2dudV9hbHdheXNfaW5saW5lOworICAgIGNhc2UgMjogcmV0dXJuIEtleXdvcmRfZm9yY2VpbmxpbmU7CisgIH0KK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0ZvckFubm90YXRlKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKK30KKworc3RhdGljIGJvb2wgaXNUYXJnZXR4ODZ4ODZfNjQoY29uc3QgVGFyZ2V0SW5mbyAmVGFyZ2V0KSB7CisgIGNvbnN0IGxsdm06OlRyaXBsZSAmVCA9IFRhcmdldC5nZXRUcmlwbGUoKTsKKyAgcmV0dXJuIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2IHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2XzY0KTsKK30KKworc3RhdGljIGJvb2wgaXNGdW5jdGlvbkxpa2UoY29uc3QgRGVjbCAqRCkgeworICBpZiAoY29uc3QgYXV0byAqUyA9IGR5bl9jYXN0PERlY2w+KEQpKQorICAgIHJldHVybiBTLT5nZXRGdW5jdGlvblR5cGUoZmFsc2UpICE9IG51bGxwdHI7CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tBbnlYODZOb0NmQ2hlY2tBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzRnVuY3Rpb25MaWtlKEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIGFuZCBmdW5jdGlvbiBwb2ludGVycyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yQW55WDg2Tm9DZkNoZWNrKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9oYXNUeXBlX2Z1bmN0aW9uVHlwZSwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tBcmNXZWFrcmVmVW5hdmFpbGFibGVBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxPYmpDSW50ZXJmYWNlRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgIk9iamVjdGl2ZS1DIGludGVyZmFjZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tBcmd1bWVudFdpdGhUeXBlVGFnQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc0hhc0Z1bmN0aW9uUHJvdG8oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgIm5vbi1LJlItc3R5bGUgZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBBcmd1bWVudFdpdGhUeXBlVGFnQXR0clNwZWxsaW5nTWFwKGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKKyAgZW51bSBTcGVsbGluZyB7CisgICAgR05VX2FyZ3VtZW50X3dpdGhfdHlwZV90YWcgPSAwLAorICAgIENYWDExX2NsYW5nX2FyZ3VtZW50X3dpdGhfdHlwZV90YWcgPSAxLAorICAgIEMyeF9jbGFuZ19hcmd1bWVudF93aXRoX3R5cGVfdGFnID0gMiwKKyAgICBHTlVfcG9pbnRlcl93aXRoX3R5cGVfdGFnID0gMywKKyAgICBDWFgxMV9jbGFuZ19wb2ludGVyX3dpdGhfdHlwZV90YWcgPSA0LAorICAgIEMyeF9jbGFuZ19wb2ludGVyX3dpdGhfdHlwZV90YWcgPSA1CisgIH07CisKKyAgdW5zaWduZWQgSWR4ID0gQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpOworICBzd2l0Y2ggKElkeCkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc3BlbGxpbmcgbGlzdCBpbmRleCIpOworICAgIGNhc2UgMDogcmV0dXJuIEdOVV9hcmd1bWVudF93aXRoX3R5cGVfdGFnOworICAgIGNhc2UgMTogcmV0dXJuIENYWDExX2NsYW5nX2FyZ3VtZW50X3dpdGhfdHlwZV90YWc7CisgICAgY2FzZSAyOiByZXR1cm4gQzJ4X2NsYW5nX2FyZ3VtZW50X3dpdGhfdHlwZV90YWc7CisgICAgY2FzZSAzOiByZXR1cm4gR05VX3BvaW50ZXJfd2l0aF90eXBlX3RhZzsKKyAgICBjYXNlIDQ6IHJldHVybiBDWFgxMV9jbGFuZ19wb2ludGVyX3dpdGhfdHlwZV90YWc7CisgICAgY2FzZSA1OiByZXR1cm4gQzJ4X2NsYW5nX3BvaW50ZXJfd2l0aF90eXBlX3RhZzsKKyAgfQorfQorCitzdGF0aWMgYm9vbCBpc0lubGluZUZ1bmN0aW9uKGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKGNvbnN0IGF1dG8gKlMgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KEQpKQorICAgIHJldHVybiBTLT5pc0lubGluZVNwZWNpZmllZCgpOworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrQXJ0aWZpY2lhbEFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNJbmxpbmVGdW5jdGlvbihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImlubGluZSBmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tBc3NlcnRDYXBhYmlsaXR5QXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdW5zaWduZWQgQXNzZXJ0Q2FwYWJpbGl0eUF0dHJTcGVsbGluZ01hcChjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisgIGVudW0gU3BlbGxpbmcgeworICAgIEdOVV9hc3NlcnRfY2FwYWJpbGl0eSA9IDAsCisgICAgQ1hYMTFfY2xhbmdfYXNzZXJ0X2NhcGFiaWxpdHkgPSAxLAorICAgIEdOVV9hc3NlcnRfc2hhcmVkX2NhcGFiaWxpdHkgPSAyLAorICAgIENYWDExX2NsYW5nX2Fzc2VydF9zaGFyZWRfY2FwYWJpbGl0eSA9IDMKKyAgfTsKKworICB1bnNpZ25lZCBJZHggPSBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCk7CisgIHN3aXRjaCAoSWR4KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzcGVsbGluZyBsaXN0IGluZGV4Iik7CisgICAgY2FzZSAwOiByZXR1cm4gR05VX2Fzc2VydF9jYXBhYmlsaXR5OworICAgIGNhc2UgMTogcmV0dXJuIENYWDExX2NsYW5nX2Fzc2VydF9jYXBhYmlsaXR5OworICAgIGNhc2UgMjogcmV0dXJuIEdOVV9hc3NlcnRfc2hhcmVkX2NhcGFiaWxpdHk7CisgICAgY2FzZSAzOiByZXR1cm4gQ1hYMTFfY2xhbmdfYXNzZXJ0X3NoYXJlZF9jYXBhYmlsaXR5OworICB9Cit9CisKK3N0YXRpYyBib29sIGNoZWNrQXNzZXJ0RXhjbHVzaXZlTG9ja0FwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tBc3NlcnRTaGFyZWRMb2NrQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0Fzc3VtZUFsaWduZWRBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxPYmpDTWV0aG9kRGVjbD4oRCkgJiYgIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiT2JqZWN0aXZlLUMgbWV0aG9kcyBhbmQgZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JBc3N1bWVBbGlnbmVkKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9vYmpjX21ldGhvZCwgLypJc1N1cHBvcnRlZD0qL0xhbmdPcHRzLk9iakMxKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrQXZhaWxhYmlsaXR5QXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8TmFtZWREZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgIm5hbWVkIGRlY2xhcmF0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yQXZhaWxhYmlsaXR5KGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9yZWNvcmQsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZW51bSwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9lbnVtX2NvbnN0YW50LCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2ZpZWxkLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2Z1bmN0aW9uLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX25hbWVzcGFjZSwgLypJc1N1cHBvcnRlZD0qL0xhbmdPcHRzLkNQbHVzUGx1cykpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX29iamNfY2F0ZWdvcnksIC8qSXNTdXBwb3J0ZWQ9Ki9MYW5nT3B0cy5PYmpDMSkpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX29iamNfaW50ZXJmYWNlLCAvKklzU3VwcG9ydGVkPSovTGFuZ09wdHMuT2JqQzEpKTsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9vYmpjX21ldGhvZCwgLypJc1N1cHBvcnRlZD0qL0xhbmdPcHRzLk9iakMxKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfb2JqY19wcm9wZXJ0eSwgLypJc1N1cHBvcnRlZD0qL0xhbmdPcHRzLk9iakMxKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfb2JqY19wcm90b2NvbCwgLypJc1N1cHBvcnRlZD0qL0xhbmdPcHRzLk9iakMxKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfcmVjb3JkLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX3R5cGVfYWxpYXMsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGUsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrQ0ZBdWRpdGVkVHJhbnNmZXJBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tDRkNvbnN1bWVkQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8UGFybVZhckRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAicGFyYW1ldGVycyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0NGVW5rbm93blRyYW5zZmVyQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrQ1VEQUNvbnN0YW50QXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8VmFyRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJ2YXJpYWJsZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tDVURBTGFuZ09wdHMoU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBpZiAoUy5MYW5nT3B0cy5DVURBKQorICAgIHJldHVybiB0cnVlOworCisgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9pZ25vcmVkKSA8PCBBdHRyLmdldE5hbWUoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0NVREFEZXZpY2VBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpICYmICFpc2E8VmFyRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0NVREFHbG9iYWxBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrQ1VEQUhvc3RBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrQ1VEQUludmFsaWRUYXJnZXRBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrQ1VEQUxhdW5jaEJvdW5kc0FwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPE9iakNNZXRob2REZWNsPihEKSAmJiAhaXNGdW5jdGlvbkxpa2UoRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJPYmplY3RpdmUtQyBtZXRob2RzLCBmdW5jdGlvbnMsIGFuZCBmdW5jdGlvbiBwb2ludGVycyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0NVREFTaGFyZWRBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxWYXJEZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgInZhcmlhYmxlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0NYWDExTm9SZXR1cm5BcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0ZvckNYWDExTm9SZXR1cm4obGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2Z1bmN0aW9uLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja0NhbGxhYmxlV2hlbkFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPENYWE1ldGhvZERlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JDYWxsYWJsZVdoZW4obGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2Z1bmN0aW9uX2lzX21lbWJlciwgLypJc1N1cHBvcnRlZD0qL0xhbmdPcHRzLkNQbHVzUGx1cykpOworfQorCitzdGF0aWMgYm9vbCBjaGVja0NhcGFiaWxpdHlBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxSZWNvcmREZWNsPihEKSAmJiAhaXNhPFR5cGVkZWZOYW1lRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgInN0cnVjdHMsIHVuaW9ucywgY2xhc3NlcywgYW5kIHR5cGVkZWZzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBDYXBhYmlsaXR5QXR0clNwZWxsaW5nTWFwKGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKKyAgZW51bSBTcGVsbGluZyB7CisgICAgR05VX2NhcGFiaWxpdHkgPSAwLAorICAgIENYWDExX2NsYW5nX2NhcGFiaWxpdHkgPSAxLAorICAgIEdOVV9zaGFyZWRfY2FwYWJpbGl0eSA9IDIsCisgICAgQ1hYMTFfY2xhbmdfc2hhcmVkX2NhcGFiaWxpdHkgPSAzCisgIH07CisKKyAgdW5zaWduZWQgSWR4ID0gQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpOworICBzd2l0Y2ggKElkeCkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc3BlbGxpbmcgbGlzdCBpbmRleCIpOworICAgIGNhc2UgMDogcmV0dXJuIEdOVV9jYXBhYmlsaXR5OworICAgIGNhc2UgMTogcmV0dXJuIENYWDExX2NsYW5nX2NhcGFiaWxpdHk7CisgICAgY2FzZSAyOiByZXR1cm4gR05VX3NoYXJlZF9jYXBhYmlsaXR5OworICAgIGNhc2UgMzogcmV0dXJuIENYWDExX2NsYW5nX3NoYXJlZF9jYXBhYmlsaXR5OworICB9Cit9CisKK3N0YXRpYyBib29sIGNoZWNrQ2Fycmllc0RlcGVuZGVuY3lBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxQYXJtVmFyRGVjbD4oRCkgJiYgIWlzYTxPYmpDTWV0aG9kRGVjbD4oRCkgJiYgIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJwYXJhbWV0ZXJzLCBPYmplY3RpdmUtQyBtZXRob2RzLCBhbmQgZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JDYXJyaWVzRGVwZW5kZW5jeShsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGVfaXNfcGFyYW1ldGVyLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX29iamNfbWV0aG9kLCAvKklzU3VwcG9ydGVkPSovTGFuZ09wdHMuT2JqQzEpKTsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9mdW5jdGlvbiwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgaXNMb2NhbFZhcihjb25zdCBEZWNsICpEKSB7CisgIGlmIChjb25zdCBhdXRvICpTID0gZHluX2Nhc3Q8VmFyRGVjbD4oRCkpCisgICAgcmV0dXJuIFMtPmhhc0xvY2FsU3RvcmFnZSgpICYmICFpc2E8UGFybVZhckRlY2w+KFMpOworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrQ2xlYW51cEFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNMb2NhbFZhcihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImxvY2FsIHZhcmlhYmxlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0NvbGRBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrQ29tbW9uQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8VmFyRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJ2YXJpYWJsZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tDb25zdHJ1Y3RvckFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tDb25zdW1hYmxlQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8Q1hYUmVjb3JkRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJjbGFzc2VzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JDb25zdW1hYmxlKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9yZWNvcmQsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrQ29uc3VtYWJsZUF1dG9DYXN0QXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8Q1hYUmVjb3JkRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJjbGFzc2VzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrQ29uc3VtYWJsZVNldE9uUmVhZEFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPENYWFJlY29yZERlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiY2xhc3NlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0NvbnZlcmdlbnRBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JDb252ZXJnZW50KGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9mdW5jdGlvbiwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tETExFeHBvcnRBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpICYmICFpc2E8VmFyRGVjbD4oRCkgJiYgIWlzYTxDWFhSZWNvcmREZWNsPihEKSAmJiAhaXNhPE9iakNJbnRlcmZhY2VEZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucywgdmFyaWFibGVzLCBjbGFzc2VzLCBhbmQgT2JqZWN0aXZlLUMgaW50ZXJmYWNlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBpc1RhcmdldHg4Nng4Nl82NGFybXRodW1iYWFyY2g2NFdpbjMyKGNvbnN0IFRhcmdldEluZm8gJlRhcmdldCkgeworICBjb25zdCBsbHZtOjpUcmlwbGUgJlQgPSBUYXJnZXQuZ2V0VHJpcGxlKCk7CisgIHJldHVybiB0cnVlICYmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4NiB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4Nl82NCB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybSB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OnRodW1iIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YWFyY2g2NCkgJiYgKFQuZ2V0T1MoKSA9PSBsbHZtOjpUcmlwbGU6OldpbjMyKTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0ZvckRMTEV4cG9ydChsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGUsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfcmVjb3JkLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX29iamNfaW50ZXJmYWNlLCAvKklzU3VwcG9ydGVkPSovTGFuZ09wdHMuT2JqQzEpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tETExJbXBvcnRBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpICYmICFpc2E8VmFyRGVjbD4oRCkgJiYgIWlzYTxDWFhSZWNvcmREZWNsPihEKSAmJiAhaXNhPE9iakNJbnRlcmZhY2VEZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucywgdmFyaWFibGVzLCBjbGFzc2VzLCBhbmQgT2JqZWN0aXZlLUMgaW50ZXJmYWNlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yRExMSW1wb3J0KGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9mdW5jdGlvbiwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV92YXJpYWJsZSwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9yZWNvcmQsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfb2JqY19pbnRlcmZhY2UsIC8qSXNTdXBwb3J0ZWQ9Ki9MYW5nT3B0cy5PYmpDMSkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja0Rlc3RydWN0b3JBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrRGlhZ25vc2VJZkFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkgJiYgIWlzYTxPYmpDTWV0aG9kRGVjbD4oRCkgJiYgIWlzYTxPYmpDUHJvcGVydHlEZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucywgT2JqZWN0aXZlLUMgbWV0aG9kcywgYW5kIE9iamVjdGl2ZS1DIHByb3BlcnRpZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tEaXNhYmxlVGFpbENhbGxzQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSAmJiAhaXNhPE9iakNNZXRob2REZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyBhbmQgT2JqZWN0aXZlLUMgbWV0aG9kcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yRGlzYWJsZVRhaWxDYWxscyhsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfb2JqY19tZXRob2QsIC8qSXNTdXBwb3J0ZWQ9Ki9MYW5nT3B0cy5PYmpDMSkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja0VtcHR5QmFzZXNBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxDWFhSZWNvcmREZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImNsYXNzZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgaXNUYXJnZXR4ODZ4ODZfNjRhcm10aHVtYmFhcmNoNjRNaWNyb3NvZnQoY29uc3QgVGFyZ2V0SW5mbyAmVGFyZ2V0KSB7CisgIGNvbnN0IGxsdm06OlRyaXBsZSAmVCA9IFRhcmdldC5nZXRUcmlwbGUoKTsKKyAgcmV0dXJuIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2IHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2XzY0IHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6dGh1bWIgfHwgVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphYXJjaDY0KSAmJiAoVGFyZ2V0LmdldENYWEFCSSgpLmdldEtpbmQoKSA9PSBUYXJnZXRDWFhBQkk6Ok1pY3Jvc29mdCk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrRW5hYmxlSWZBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JFbmFibGVJZihsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrRW51bUV4dGVuc2liaWxpdHlBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxFbnVtRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJlbnVtcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yRW51bUV4dGVuc2liaWxpdHkobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2VudW0sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrRXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0V4dFZlY3RvclR5cGVBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxUeXBlZGVmTmFtZURlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJ0eXBlZGVmcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0V4dGVybmFsU291cmNlU3ltYm9sQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8TmFtZWREZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgIm5hbWVkIGRlY2xhcmF0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yRXh0ZXJuYWxTb3VyY2VTeW1ib2wobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX3JlY29yZCwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9lbnVtLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2VudW1fY29uc3RhbnQsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZmllbGQsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfbmFtZXNwYWNlLCAvKklzU3VwcG9ydGVkPSovTGFuZ09wdHMuQ1BsdXNQbHVzKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfb2JqY19jYXRlZ29yeSwgLypJc1N1cHBvcnRlZD0qL0xhbmdPcHRzLk9iakMxKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfb2JqY19pbnRlcmZhY2UsIC8qSXNTdXBwb3J0ZWQ9Ki9MYW5nT3B0cy5PYmpDMSkpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX29iamNfbWV0aG9kLCAvKklzU3VwcG9ydGVkPSovTGFuZ09wdHMuT2JqQzEpKTsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9vYmpjX3Byb3BlcnR5LCAvKklzU3VwcG9ydGVkPSovTGFuZ09wdHMuT2JqQzEpKTsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9vYmpjX3Byb3RvY29sLCAvKklzU3VwcG9ydGVkPSovTGFuZ09wdHMuT2JqQzEpKTsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9yZWNvcmQsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdHlwZV9hbGlhcywgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV92YXJpYWJsZSwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tGbGFnRW51bUFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEVudW1EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImVudW1zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JGbGFnRW51bShsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZW51bSwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tGbGF0dGVuQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JGbGF0dGVuKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9mdW5jdGlvbiwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tGb3JtYXRBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxPYmpDTWV0aG9kRGVjbD4oRCkgJiYgIWlzYTxCbG9ja0RlY2w+KEQpICYmICFpc0hhc0Z1bmN0aW9uUHJvdG8oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJPYmplY3RpdmUtQyBtZXRob2RzLCBibG9ja3MsIGFuZCBub24tSyZSLXN0eWxlIGZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0Zvcm1hdEFyZ0FwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPE9iakNNZXRob2REZWNsPihEKSAmJiAhaXNIYXNGdW5jdGlvblByb3RvKEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiT2JqZWN0aXZlLUMgbWV0aG9kcyBhbmQgbm9uLUsmUi1zdHlsZSBmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tHTlVJbmxpbmVBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrR3VhcmRlZEJ5QXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RmllbGREZWNsPihEKSAmJiAhaXNTaGFyZWRWYXIoRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJub24tc3RhdGljIGRhdGEgbWVtYmVycyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0d1YXJkZWRWYXJBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGaWVsZERlY2w+KEQpICYmICFpc1NoYXJlZFZhcihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgIm5vbi1zdGF0aWMgZGF0YSBtZW1iZXJzIGFuZCBnbG9iYWwgdmFyaWFibGVzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrSG90QXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBpc09iakNJbnN0YW5jZU1ldGhvZChjb25zdCBEZWNsICpEKSB7CisgIGlmIChjb25zdCBhdXRvICpTID0gZHluX2Nhc3Q8T2JqQ01ldGhvZERlY2w+KEQpKQorICAgIHJldHVybiBTLT5pc0luc3RhbmNlTWV0aG9kKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tJQkFjdGlvbkFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNPYmpDSW5zdGFuY2VNZXRob2QoRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJPYmplY3RpdmUtQyBpbnN0YW5jZSBtZXRob2RzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrSUZ1bmNBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGlzVGFyZ2V0RUxGKGNvbnN0IFRhcmdldEluZm8gJlRhcmdldCkgeworICBjb25zdCBsbHZtOjpUcmlwbGUgJlQgPSBUYXJnZXQuZ2V0VHJpcGxlKCk7CisgIHJldHVybiB0cnVlICYmIChULmdldE9iamVjdEZvcm1hdCgpID09IGxsdm06OlRyaXBsZTo6RUxGKTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0ZvcklGdW5jKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9mdW5jdGlvbiwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tJbml0UHJpb3JpdHlBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxWYXJEZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAidmFyaWFibGVzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrSW50ZXJuYWxMaW5rYWdlQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8VmFyRGVjbD4oRCkgJiYgIWlzYTxGdW5jdGlvbkRlY2w+KEQpICYmICFpc2E8Q1hYUmVjb3JkRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJ2YXJpYWJsZXMsIGZ1bmN0aW9ucywgYW5kIGNsYXNzZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0ZvckludGVybmFsTGlua2FnZShsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGUsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfcmVjb3JkLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja0xUT1Zpc2liaWxpdHlQdWJsaWNBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxSZWNvcmREZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgInN0cnVjdHMsIHVuaW9ucywgYW5kIGNsYXNzZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0ZvckxUT1Zpc2liaWxpdHlQdWJsaWMobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX3JlY29yZCwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tMYXlvdXRWZXJzaW9uQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8Q1hYUmVjb3JkRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJjbGFzc2VzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrTG9ja1JldHVybmVkQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0xvY2thYmxlQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8UmVjb3JkRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJzdHJ1Y3RzLCB1bmlvbnMsIGFuZCBjbGFzc2VzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrTG9ja3NFeGNsdWRlZEFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHVuc2lnbmVkIExvb3BIaW50QXR0clNwZWxsaW5nTWFwKGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKKyAgZW51bSBTcGVsbGluZyB7CisgICAgUHJhZ21hX2NsYW5nX2xvb3AgPSAwLAorICAgIFByYWdtYV91bnJvbGwgPSAxLAorICAgIFByYWdtYV9ub3Vucm9sbCA9IDIKKyAgfTsKKworICB1bnNpZ25lZCBJZHggPSBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCk7CisgIHN3aXRjaCAoSWR4KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzcGVsbGluZyBsaXN0IGluZGV4Iik7CisgICAgY2FzZSAwOiByZXR1cm4gUHJhZ21hX2NsYW5nX2xvb3A7CisgICAgY2FzZSAxOiByZXR1cm4gUHJhZ21hX3Vucm9sbDsKKyAgICBjYXNlIDI6IHJldHVybiBQcmFnbWFfbm91bnJvbGw7CisgIH0KK30KKworc3RhdGljIGJvb2wgY2hlY2tNaWNyb3NvZnRFeHRMYW5nT3B0cyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisgIGlmIChTLkxhbmdPcHRzLk1pY3Jvc29mdEV4dCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfaWdub3JlZCkgPDwgQXR0ci5nZXROYW1lKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHVuc2lnbmVkIE1TSW5oZXJpdGFuY2VBdHRyU3BlbGxpbmdNYXAoY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBlbnVtIFNwZWxsaW5nIHsKKyAgICBLZXl3b3JkX3NpbmdsZV9pbmhlcml0YW5jZSA9IDAsCisgICAgS2V5d29yZF9tdWx0aXBsZV9pbmhlcml0YW5jZSA9IDEsCisgICAgS2V5d29yZF92aXJ0dWFsX2luaGVyaXRhbmNlID0gMiwKKyAgICBLZXl3b3JkX3Vuc3BlY2lmaWVkX2luaGVyaXRhbmNlID0gMworICB9OworCisgIHVuc2lnbmVkIElkeCA9IEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKTsKKyAgc3dpdGNoIChJZHgpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHNwZWxsaW5nIGxpc3QgaW5kZXgiKTsKKyAgICBjYXNlIDA6IHJldHVybiBLZXl3b3JkX3NpbmdsZV9pbmhlcml0YW5jZTsKKyAgICBjYXNlIDE6IHJldHVybiBLZXl3b3JkX211bHRpcGxlX2luaGVyaXRhbmNlOworICAgIGNhc2UgMjogcmV0dXJuIEtleXdvcmRfdmlydHVhbF9pbmhlcml0YW5jZTsKKyAgICBjYXNlIDM6IHJldHVybiBLZXl3b3JkX3Vuc3BlY2lmaWVkX2luaGVyaXRhbmNlOworICB9Cit9CisKK3N0YXRpYyBib29sIGNoZWNrTVNOb1ZUYWJsZUFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPENYWFJlY29yZERlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiY2xhc3NlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja01TU3RydWN0QXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8UmVjb3JkRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJzdHJ1Y3RzLCB1bmlvbnMsIGFuZCBjbGFzc2VzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrTWljcm9NaXBzQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGlzVGFyZ2V0bWlwc21pcHNlbChjb25zdCBUYXJnZXRJbmZvICZUYXJnZXQpIHsKKyAgY29uc3QgbGx2bTo6VHJpcGxlICZUID0gVGFyZ2V0LmdldFRyaXBsZSgpOworICByZXR1cm4gdHJ1ZSAmJiAoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzIHx8IFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwc2VsKTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0Zvck1pY3JvTWlwcyhsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrTWluU2l6ZUFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkgJiYgIWlzYTxPYmpDTWV0aG9kRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyBhbmQgT2JqZWN0aXZlLUMgbWV0aG9kcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja01pcHMxNkFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja01pcHNMb25nQ2FsbEFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgaXNUYXJnZXRtaXBzbWlwc2VsbWlwczY0bWlwczY0ZWwoY29uc3QgVGFyZ2V0SW5mbyAmVGFyZ2V0KSB7CisgIGNvbnN0IGxsdm06OlRyaXBsZSAmVCA9IFRhcmdldC5nZXRUcmlwbGUoKTsKKyAgcmV0dXJuIHRydWUgJiYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwcyB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHNlbCB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHM2NCB8fCBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHM2NGVsKTsKK30KKworc3RhdGljIHVuc2lnbmVkIE1pcHNMb25nQ2FsbEF0dHJTcGVsbGluZ01hcChjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisgIGVudW0gU3BlbGxpbmcgeworICAgIEdOVV9sb25nX2NhbGwgPSAwLAorICAgIENYWDExX2dudV9sb25nX2NhbGwgPSAxLAorICAgIEdOVV9mYXIgPSAyLAorICAgIENYWDExX2dudV9mYXIgPSAzCisgIH07CisKKyAgdW5zaWduZWQgSWR4ID0gQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpOworICBzd2l0Y2ggKElkeCkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc3BlbGxpbmcgbGlzdCBpbmRleCIpOworICAgIGNhc2UgMDogcmV0dXJuIEdOVV9sb25nX2NhbGw7CisgICAgY2FzZSAxOiByZXR1cm4gQ1hYMTFfZ251X2xvbmdfY2FsbDsKKyAgICBjYXNlIDI6IHJldHVybiBHTlVfZmFyOworICAgIGNhc2UgMzogcmV0dXJuIENYWDExX2dudV9mYXI7CisgIH0KK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0Zvck1pcHNMb25nQ2FsbChsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrTWlwc1Nob3J0Q2FsbEFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHVuc2lnbmVkIE1pcHNTaG9ydENhbGxBdHRyU3BlbGxpbmdNYXAoY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBlbnVtIFNwZWxsaW5nIHsKKyAgICBHTlVfc2hvcnRfY2FsbCA9IDAsCisgICAgQ1hYMTFfZ251X3Nob3J0X2NhbGwgPSAxLAorICAgIEdOVV9uZWFyID0gMiwKKyAgICBDWFgxMV9nbnVfbmVhciA9IDMKKyAgfTsKKworICB1bnNpZ25lZCBJZHggPSBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCk7CisgIHN3aXRjaCAoSWR4KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzcGVsbGluZyBsaXN0IGluZGV4Iik7CisgICAgY2FzZSAwOiByZXR1cm4gR05VX3Nob3J0X2NhbGw7CisgICAgY2FzZSAxOiByZXR1cm4gQ1hYMTFfZ251X3Nob3J0X2NhbGw7CisgICAgY2FzZSAyOiByZXR1cm4gR05VX25lYXI7CisgICAgY2FzZSAzOiByZXR1cm4gQ1hYMTFfZ251X25lYXI7CisgIH0KK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0Zvck1pcHNTaG9ydENhbGwobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2Z1bmN0aW9uLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja01vZGVBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxWYXJEZWNsPihEKSAmJiAhaXNhPEVudW1EZWNsPihEKSAmJiAhaXNhPFR5cGVkZWZOYW1lRGVjbD4oRCkgJiYgIWlzYTxGaWVsZERlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJ2YXJpYWJsZXMsIGVudW1zLCB0eXBlZGVmcywgYW5kIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXJzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrTlNDb25zdW1lZEFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPFBhcm1WYXJEZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgInBhcmFtZXRlcnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tOU0NvbnN1bWVzU2VsZkFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPE9iakNNZXRob2REZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgIk9iamVjdGl2ZS1DIG1ldGhvZHMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tOYWtlZEFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tOb0FsaWFzQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja05vQ29tbW9uQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8VmFyRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJ2YXJpYWJsZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgaXNOb25QYXJtVmFyKGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKGNvbnN0IGF1dG8gKlMgPSBkeW5fY2FzdDxWYXJEZWNsPihEKSkKKyAgICByZXR1cm4gUy0+Z2V0S2luZCgpICE9IERlY2w6OlBhcm1WYXI7CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tOb0RlYnVnQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc0Z1bmN0aW9uTGlrZShEKSAmJiAhaXNhPE9iakNNZXRob2REZWNsPihEKSAmJiAhaXNOb25QYXJtVmFyKEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zLCBmdW5jdGlvbiBwb2ludGVycywgT2JqZWN0aXZlLUMgbWV0aG9kcywgYW5kIHZhcmlhYmxlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yTm9EZWJ1ZyhsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfaGFzVHlwZV9mdW5jdGlvblR5cGUsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfb2JqY19tZXRob2QsIC8qSXNTdXBwb3J0ZWQ9Ki9MYW5nT3B0cy5PYmpDMSkpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX3ZhcmlhYmxlX25vdF9pc19wYXJhbWV0ZXIsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrTm9EdXBsaWNhdGVBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JOb0R1cGxpY2F0ZShsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrTm9Fc2NhcGVBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxQYXJtVmFyRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJwYXJhbWV0ZXJzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JOb0VzY2FwZShsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGVfaXNfcGFyYW1ldGVyLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja05vSW5saW5lQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja05vSW5zdHJ1bWVudEZ1bmN0aW9uQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja05vTWljcm9NaXBzQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JOb01pY3JvTWlwcyhsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrTm9NaXBzMTZBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tOb1Nhbml0aXplQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSAmJiAhaXNhPE9iakNNZXRob2REZWNsPihEKSAmJiAhaXNHbG9iYWxWYXIoRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucywgT2JqZWN0aXZlLUMgbWV0aG9kcywgYW5kIGdsb2JhbCB2YXJpYWJsZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0Zvck5vU2FuaXRpemUobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2Z1bmN0aW9uLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX29iamNfbWV0aG9kLCAvKklzU3VwcG9ydGVkPSovTGFuZ09wdHMuT2JqQzEpKTsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV92YXJpYWJsZV9pc19nbG9iYWwsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrTm9TYW5pdGl6ZVNwZWNpZmljQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSAmJiAhaXNHbG9iYWxWYXIoRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yTm9TYW5pdGl6ZVNwZWNpZmljKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9mdW5jdGlvbiwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV92YXJpYWJsZV9pc19nbG9iYWwsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrTm9TcGxpdFN0YWNrQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JOb1NwbGl0U3RhY2sobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2Z1bmN0aW9uLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja05vVGhyZWFkU2FmZXR5QW5hbHlzaXNBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrTm9UaHJvd0FwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0Zvck5vVGhyb3cobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2Z1bmN0aW9uLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja05vbk51bGxBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxPYmpDTWV0aG9kRGVjbD4oRCkgJiYgIWlzSGFzRnVuY3Rpb25Qcm90byhEKSAmJiAhaXNhPFBhcm1WYXJEZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucywgbWV0aG9kcywgYW5kIHBhcmFtZXRlcnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tOb3RUYWlsQ2FsbGVkQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yTm90VGFpbENhbGxlZChsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrT2JqQ0JveGFibGVBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxSZWNvcmREZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAic3RydWN0cywgdW5pb25zLCBhbmQgY2xhc3NlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yT2JqQ0JveGFibGUobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX3JlY29yZCwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tPYmpDQnJpZGdlQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8UmVjb3JkRGVjbD4oRCkgJiYgIWlzYTxUeXBlZGVmTmFtZURlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJzdHJ1Y3RzLCB1bmlvbnMsIGNsYXNzZXMsIGFuZCB0eXBlZGVmcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja09iakNCcmlkZ2VNdXRhYmxlQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8UmVjb3JkRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgInN0cnVjdHMsIHVuaW9ucywgYW5kIGNsYXNzZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tPYmpDQnJpZGdlUmVsYXRlZEFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPFJlY29yZERlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJzdHJ1Y3RzLCB1bmlvbnMsIGFuZCBjbGFzc2VzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGlzT2JqQ0ludGVyZmFjZURlY2xJbml0TWV0aG9kKGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKGNvbnN0IGF1dG8gKlMgPSBkeW5fY2FzdDxPYmpDTWV0aG9kRGVjbD4oRCkpCisgICAgcmV0dXJuIFMtPmdldE1ldGhvZEZhbWlseSgpID09IE9NRl9pbml0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNhPE9iakNJbnRlcmZhY2VEZWNsPihTLT5nZXREZWNsQ29udGV4dCgpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc2E8T2JqQ0NhdGVnb3J5RGVjbD4oUy0+Z2V0RGVjbENvbnRleHQoKSkgJiYKKyAgICAgICAgICAgIGNhc3Q8T2JqQ0NhdGVnb3J5RGVjbD4oUy0+Z2V0RGVjbENvbnRleHQoKSktPklzQ2xhc3NFeHRlbnNpb24oKSkpOworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrT2JqQ0Rlc2lnbmF0ZWRJbml0aWFsaXplckFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNPYmpDSW50ZXJmYWNlRGVjbEluaXRNZXRob2QoRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImluaXQgbWV0aG9kcyBvZiBpbnRlcmZhY2Ugb3IgY2xhc3MgZXh0ZW5zaW9uIGRlY2xhcmF0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja09iakNFeGNlcHRpb25BcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxPYmpDSW50ZXJmYWNlRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgIk9iamVjdGl2ZS1DIGludGVyZmFjZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tPYmpDRXhwbGljaXRQcm90b2NvbEltcGxBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxPYmpDUHJvdG9jb2xEZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiT2JqZWN0aXZlLUMgcHJvdG9jb2xzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrT2JqQ01ldGhvZEZhbWlseUFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPE9iakNNZXRob2REZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiT2JqZWN0aXZlLUMgbWV0aG9kcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yT2JqQ01ldGhvZEZhbWlseShsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfb2JqY19tZXRob2QsIC8qSXNTdXBwb3J0ZWQ9Ki9MYW5nT3B0cy5PYmpDMSkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja09iakNQcmVjaXNlTGlmZXRpbWVBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxWYXJEZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAidmFyaWFibGVzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrT2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8T2JqQ0ludGVyZmFjZURlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJPYmplY3RpdmUtQyBpbnRlcmZhY2VzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrT2JqQ1JlcXVpcmVzU3VwZXJBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxPYmpDTWV0aG9kRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgIk9iamVjdGl2ZS1DIG1ldGhvZHMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0Zvck9iakNSZXF1aXJlc1N1cGVyKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9vYmpjX21ldGhvZCwgLypJc1N1cHBvcnRlZD0qL0xhbmdPcHRzLk9iakMxKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrT2JqQ1JldHVybnNJbm5lclBvaW50ZXJBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxPYmpDTWV0aG9kRGVjbD4oRCkgJiYgIWlzYTxPYmpDUHJvcGVydHlEZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiT2JqZWN0aXZlLUMgbWV0aG9kcyBhbmQgT2JqZWN0aXZlLUMgcHJvcGVydGllcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja09iakNSb290Q2xhc3NBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxPYmpDSW50ZXJmYWNlRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgIk9iamVjdGl2ZS1DIGludGVyZmFjZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tPYmpDUnVudGltZU5hbWVBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxPYmpDSW50ZXJmYWNlRGVjbD4oRCkgJiYgIWlzYTxPYmpDUHJvdG9jb2xEZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiT2JqZWN0aXZlLUMgaW50ZXJmYWNlcyBhbmQgT2JqZWN0aXZlLUMgcHJvdG9jb2xzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JPYmpDUnVudGltZU5hbWUobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX29iamNfaW50ZXJmYWNlLCAvKklzU3VwcG9ydGVkPSovTGFuZ09wdHMuT2JqQzEpKTsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9vYmpjX3Byb3RvY29sLCAvKklzU3VwcG9ydGVkPSovTGFuZ09wdHMuT2JqQzEpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tPYmpDUnVudGltZVZpc2libGVBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxPYmpDSW50ZXJmYWNlRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgIk9iamVjdGl2ZS1DIGludGVyZmFjZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0Zvck9iakNSdW50aW1lVmlzaWJsZShsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfb2JqY19pbnRlcmZhY2UsIC8qSXNTdXBwb3J0ZWQ9Ki9MYW5nT3B0cy5PYmpDMSkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja09iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWRBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxPYmpDSW50ZXJmYWNlRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgIk9iamVjdGl2ZS1DIGludGVyZmFjZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0Zvck9iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWQobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX29iamNfaW50ZXJmYWNlLCAvKklzU3VwcG9ydGVkPSovTGFuZ09wdHMuT2JqQzEpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tPcGVuQ0xBY2Nlc3NBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxQYXJtVmFyRGVjbD4oRCkgJiYgIWlzYTxUeXBlZGVmTmFtZURlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJwYXJhbWV0ZXJzIGFuZCB0eXBlZGVmcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdW5zaWduZWQgT3BlbkNMQWNjZXNzQXR0clNwZWxsaW5nTWFwKGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKKyAgZW51bSBTcGVsbGluZyB7CisgICAgS2V5d29yZF9yZWFkX29ubHkgPSAwLAorICAgIEtleXdvcmRfd3JpdGVfb25seSA9IDIsCisgICAgS2V5d29yZF9yZWFkX3dyaXRlID0gNAorICB9OworCisgIHVuc2lnbmVkIElkeCA9IEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKTsKKyAgc3dpdGNoIChJZHgpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHNwZWxsaW5nIGxpc3QgaW5kZXgiKTsKKyAgICBjYXNlIDA6IHJldHVybiBLZXl3b3JkX3JlYWRfb25seTsKKyAgICBjYXNlIDE6IHJldHVybiBLZXl3b3JkX3JlYWRfb25seTsKKyAgICBjYXNlIDI6IHJldHVybiBLZXl3b3JkX3dyaXRlX29ubHk7CisgICAgY2FzZSAzOiByZXR1cm4gS2V5d29yZF93cml0ZV9vbmx5OworICAgIGNhc2UgNDogcmV0dXJuIEtleXdvcmRfcmVhZF93cml0ZTsKKyAgICBjYXNlIDU6IHJldHVybiBLZXl3b3JkX3JlYWRfd3JpdGU7CisgIH0KK30KKworc3RhdGljIGJvb2wgY2hlY2tPcGVuQ0xJbnRlbFJlcWRTdWJHcm91cFNpemVBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0Zvck9wZW5DTEludGVsUmVxZFN1Ykdyb3VwU2l6ZShsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrT3BlbkNMS2VybmVsQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrT3BlbkNMTm9TVk1BcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxWYXJEZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgInZhcmlhYmxlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja09wZW5DTExhbmdPcHRzKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKKyAgaWYgKFMuTGFuZ09wdHMuT3BlbkNMKQorICAgIHJldHVybiB0cnVlOworCisgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9pZ25vcmVkKSA8PCBBdHRyLmdldE5hbWUoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yT3BlbkNMTm9TVk0obGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX3ZhcmlhYmxlLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja09wdGltaXplTm9uZUFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkgJiYgIWlzYTxPYmpDTWV0aG9kRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJmdW5jdGlvbnMgYW5kIE9iamVjdGl2ZS1DIG1ldGhvZHMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0Zvck9wdGltaXplTm9uZShsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfb2JqY19tZXRob2QsIC8qSXNTdXBwb3J0ZWQ9Ki9MYW5nT3B0cy5PYmpDMSkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja092ZXJsb2FkYWJsZUFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yT3ZlcmxvYWRhYmxlKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9mdW5jdGlvbiwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tPd25lcnNoaXBBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzSGFzRnVuY3Rpb25Qcm90byhEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgIm5vbi1LJlItc3R5bGUgZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBPd25lcnNoaXBBdHRyU3BlbGxpbmdNYXAoY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBlbnVtIFNwZWxsaW5nIHsKKyAgICBHTlVfb3duZXJzaGlwX2hvbGRzID0gMCwKKyAgICBDWFgxMV9jbGFuZ19vd25lcnNoaXBfaG9sZHMgPSAxLAorICAgIEMyeF9jbGFuZ19vd25lcnNoaXBfaG9sZHMgPSAyLAorICAgIEdOVV9vd25lcnNoaXBfcmV0dXJucyA9IDMsCisgICAgQ1hYMTFfY2xhbmdfb3duZXJzaGlwX3JldHVybnMgPSA0LAorICAgIEMyeF9jbGFuZ19vd25lcnNoaXBfcmV0dXJucyA9IDUsCisgICAgR05VX293bmVyc2hpcF90YWtlcyA9IDYsCisgICAgQ1hYMTFfY2xhbmdfb3duZXJzaGlwX3Rha2VzID0gNywKKyAgICBDMnhfY2xhbmdfb3duZXJzaGlwX3Rha2VzID0gOAorICB9OworCisgIHVuc2lnbmVkIElkeCA9IEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKTsKKyAgc3dpdGNoIChJZHgpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHNwZWxsaW5nIGxpc3QgaW5kZXgiKTsKKyAgICBjYXNlIDA6IHJldHVybiBHTlVfb3duZXJzaGlwX2hvbGRzOworICAgIGNhc2UgMTogcmV0dXJuIENYWDExX2NsYW5nX293bmVyc2hpcF9ob2xkczsKKyAgICBjYXNlIDI6IHJldHVybiBDMnhfY2xhbmdfb3duZXJzaGlwX2hvbGRzOworICAgIGNhc2UgMzogcmV0dXJuIEdOVV9vd25lcnNoaXBfcmV0dXJuczsKKyAgICBjYXNlIDQ6IHJldHVybiBDWFgxMV9jbGFuZ19vd25lcnNoaXBfcmV0dXJuczsKKyAgICBjYXNlIDU6IHJldHVybiBDMnhfY2xhbmdfb3duZXJzaGlwX3JldHVybnM7CisgICAgY2FzZSA2OiByZXR1cm4gR05VX293bmVyc2hpcF90YWtlczsKKyAgICBjYXNlIDc6IHJldHVybiBDWFgxMV9jbGFuZ19vd25lcnNoaXBfdGFrZXM7CisgICAgY2FzZSA4OiByZXR1cm4gQzJ4X2NsYW5nX293bmVyc2hpcF90YWtlczsKKyAgfQorfQorCitzdGF0aWMgYm9vbCBjaGVja1BhcmFtVHlwZXN0YXRlQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8UGFybVZhckRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAicGFyYW1ldGVycyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yUGFyYW1UeXBlc3RhdGUobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX3ZhcmlhYmxlX2lzX3BhcmFtZXRlciwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tQYXNzT2JqZWN0U2l6ZUFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPFBhcm1WYXJEZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgInBhcmFtZXRlcnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0ZvclBhc3NPYmplY3RTaXplKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV92YXJpYWJsZV9pc19wYXJhbWV0ZXIsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrUHJhZ21hQ2xhbmdCU1NTZWN0aW9uQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc0dsb2JhbFZhcihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZ2xvYmFsIHZhcmlhYmxlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja1ByYWdtYUNsYW5nRGF0YVNlY3Rpb25BcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzR2xvYmFsVmFyKEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJnbG9iYWwgdmFyaWFibGVzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrUHJhZ21hQ2xhbmdSb2RhdGFTZWN0aW9uQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc0dsb2JhbFZhcihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZ2xvYmFsIHZhcmlhYmxlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja1ByYWdtYUNsYW5nVGV4dFNlY3Rpb25BcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tQdEd1YXJkZWRCeUFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZpZWxkRGVjbD4oRCkgJiYgIWlzU2hhcmVkVmFyKEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAibm9uLXN0YXRpYyBkYXRhIG1lbWJlcnMgYW5kIGdsb2JhbCB2YXJpYWJsZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tQdEd1YXJkZWRWYXJBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGaWVsZERlY2w+KEQpICYmICFpc1NoYXJlZFZhcihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgIm5vbi1zdGF0aWMgZGF0YSBtZW1iZXJzIGFuZCBnbG9iYWwgdmFyaWFibGVzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrUmVsZWFzZUNhcGFiaWxpdHlBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBSZWxlYXNlQ2FwYWJpbGl0eUF0dHJTcGVsbGluZ01hcChjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisgIGVudW0gU3BlbGxpbmcgeworICAgIEdOVV9yZWxlYXNlX2NhcGFiaWxpdHkgPSAwLAorICAgIENYWDExX2NsYW5nX3JlbGVhc2VfY2FwYWJpbGl0eSA9IDEsCisgICAgR05VX3JlbGVhc2Vfc2hhcmVkX2NhcGFiaWxpdHkgPSAyLAorICAgIENYWDExX2NsYW5nX3JlbGVhc2Vfc2hhcmVkX2NhcGFiaWxpdHkgPSAzLAorICAgIEdOVV9yZWxlYXNlX2dlbmVyaWNfY2FwYWJpbGl0eSA9IDQsCisgICAgQ1hYMTFfY2xhbmdfcmVsZWFzZV9nZW5lcmljX2NhcGFiaWxpdHkgPSA1LAorICAgIEdOVV91bmxvY2tfZnVuY3Rpb24gPSA2LAorICAgIENYWDExX2NsYW5nX3VubG9ja19mdW5jdGlvbiA9IDcKKyAgfTsKKworICB1bnNpZ25lZCBJZHggPSBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCk7CisgIHN3aXRjaCAoSWR4KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzcGVsbGluZyBsaXN0IGluZGV4Iik7CisgICAgY2FzZSAwOiByZXR1cm4gR05VX3JlbGVhc2VfY2FwYWJpbGl0eTsKKyAgICBjYXNlIDE6IHJldHVybiBDWFgxMV9jbGFuZ19yZWxlYXNlX2NhcGFiaWxpdHk7CisgICAgY2FzZSAyOiByZXR1cm4gR05VX3JlbGVhc2Vfc2hhcmVkX2NhcGFiaWxpdHk7CisgICAgY2FzZSAzOiByZXR1cm4gQ1hYMTFfY2xhbmdfcmVsZWFzZV9zaGFyZWRfY2FwYWJpbGl0eTsKKyAgICBjYXNlIDQ6IHJldHVybiBHTlVfcmVsZWFzZV9nZW5lcmljX2NhcGFiaWxpdHk7CisgICAgY2FzZSA1OiByZXR1cm4gQ1hYMTFfY2xhbmdfcmVsZWFzZV9nZW5lcmljX2NhcGFiaWxpdHk7CisgICAgY2FzZSA2OiByZXR1cm4gR05VX3VubG9ja19mdW5jdGlvbjsKKyAgICBjYXNlIDc6IHJldHVybiBDWFgxMV9jbGFuZ191bmxvY2tfZnVuY3Rpb247CisgIH0KK30KKworc3RhdGljIGJvb2wgY2hlY2tSZW5kZXJTY3JpcHRLZXJuZWxBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrUmVuZGVyU2NyaXB0TGFuZ09wdHMoU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBpZiAoUy5MYW5nT3B0cy5SZW5kZXJTY3JpcHQpCisgICAgcmV0dXJuIHRydWU7CisKKyAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX2lnbm9yZWQpIDw8IEF0dHIuZ2V0TmFtZSgpOworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JSZW5kZXJTY3JpcHRLZXJuZWwobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2Z1bmN0aW9uLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja1JlcWRXb3JrR3JvdXBTaXplQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrUmVxdWlyZUNvbnN0YW50SW5pdEFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNHbG9iYWxWYXIoRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImdsb2JhbCB2YXJpYWJsZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tDUGx1c1BsdXNMYW5nT3B0cyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisgIGlmIChTLkxhbmdPcHRzLkNQbHVzUGx1cykKKyAgICByZXR1cm4gdHJ1ZTsKKworICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfaWdub3JlZCkgPDwgQXR0ci5nZXROYW1lKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0ZvclJlcXVpcmVDb25zdGFudEluaXQobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX3ZhcmlhYmxlX2lzX2dsb2JhbCwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tSZXF1aXJlc0NhcGFiaWxpdHlBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBSZXF1aXJlc0NhcGFiaWxpdHlBdHRyU3BlbGxpbmdNYXAoY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBlbnVtIFNwZWxsaW5nIHsKKyAgICBHTlVfcmVxdWlyZXNfY2FwYWJpbGl0eSA9IDAsCisgICAgQ1hYMTFfY2xhbmdfcmVxdWlyZXNfY2FwYWJpbGl0eSA9IDEsCisgICAgR05VX2V4Y2x1c2l2ZV9sb2Nrc19yZXF1aXJlZCA9IDIsCisgICAgQ1hYMTFfY2xhbmdfZXhjbHVzaXZlX2xvY2tzX3JlcXVpcmVkID0gMywKKyAgICBHTlVfcmVxdWlyZXNfc2hhcmVkX2NhcGFiaWxpdHkgPSA0LAorICAgIENYWDExX2NsYW5nX3JlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5ID0gNSwKKyAgICBHTlVfc2hhcmVkX2xvY2tzX3JlcXVpcmVkID0gNiwKKyAgICBDWFgxMV9jbGFuZ19zaGFyZWRfbG9ja3NfcmVxdWlyZWQgPSA3CisgIH07CisKKyAgdW5zaWduZWQgSWR4ID0gQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpOworICBzd2l0Y2ggKElkeCkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc3BlbGxpbmcgbGlzdCBpbmRleCIpOworICAgIGNhc2UgMDogcmV0dXJuIEdOVV9yZXF1aXJlc19jYXBhYmlsaXR5OworICAgIGNhc2UgMTogcmV0dXJuIENYWDExX2NsYW5nX3JlcXVpcmVzX2NhcGFiaWxpdHk7CisgICAgY2FzZSAyOiByZXR1cm4gR05VX2V4Y2x1c2l2ZV9sb2Nrc19yZXF1aXJlZDsKKyAgICBjYXNlIDM6IHJldHVybiBDWFgxMV9jbGFuZ19leGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQ7CisgICAgY2FzZSA0OiByZXR1cm4gR05VX3JlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5OworICAgIGNhc2UgNTogcmV0dXJuIENYWDExX2NsYW5nX3JlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5OworICAgIGNhc2UgNjogcmV0dXJuIEdOVV9zaGFyZWRfbG9ja3NfcmVxdWlyZWQ7CisgICAgY2FzZSA3OiByZXR1cm4gQ1hYMTFfY2xhbmdfc2hhcmVkX2xvY2tzX3JlcXVpcmVkOworICB9Cit9CisKK3N0YXRpYyBib29sIGNoZWNrUmVzdHJpY3RBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBSZXN0cmljdEF0dHJTcGVsbGluZ01hcChjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisgIGVudW0gU3BlbGxpbmcgeworICAgIERlY2xzcGVjX3Jlc3RyaWN0ID0gMCwKKyAgICBHTlVfbWFsbG9jID0gMSwKKyAgICBDWFgxMV9nbnVfbWFsbG9jID0gMgorICB9OworCisgIHVuc2lnbmVkIElkeCA9IEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKTsKKyAgc3dpdGNoIChJZHgpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHNwZWxsaW5nIGxpc3QgaW5kZXgiKTsKKyAgICBjYXNlIDA6IHJldHVybiBEZWNsc3BlY19yZXN0cmljdDsKKyAgICBjYXNlIDE6IHJldHVybiBHTlVfbWFsbG9jOworICAgIGNhc2UgMjogcmV0dXJuIENYWDExX2dudV9tYWxsb2M7CisgIH0KK30KKworc3RhdGljIGJvb2wgY2hlY2tSZXR1cm5UeXBlc3RhdGVBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpICYmICFpc2E8UGFybVZhckRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIGFuZCBwYXJhbWV0ZXJzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JSZXR1cm5UeXBlc3RhdGUobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2Z1bmN0aW9uLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX3ZhcmlhYmxlX2lzX3BhcmFtZXRlciwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tSZXR1cm5zTm9uTnVsbEFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPE9iakNNZXRob2REZWNsPihEKSAmJiAhaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJPYmplY3RpdmUtQyBtZXRob2RzIGFuZCBmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0ZvclJldHVybnNOb25OdWxsKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9vYmpjX21ldGhvZCwgLypJc1N1cHBvcnRlZD0qL0xhbmdPcHRzLk9iakMxKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrUmV0dXJuc1R3aWNlQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja1Njb3BlZExvY2thYmxlQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8UmVjb3JkRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJzdHJ1Y3RzLCB1bmlvbnMsIGFuZCBjbGFzc2VzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrU2VjdGlvbkFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkgJiYgIWlzR2xvYmFsVmFyKEQpICYmICFpc2E8T2JqQ01ldGhvZERlY2w+KEQpICYmICFpc2E8T2JqQ1Byb3BlcnR5RGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucywgZ2xvYmFsIHZhcmlhYmxlcywgT2JqZWN0aXZlLUMgbWV0aG9kcywgYW5kIE9iamVjdGl2ZS1DIHByb3BlcnRpZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHVuc2lnbmVkIFNlY3Rpb25BdHRyU3BlbGxpbmdNYXAoY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBlbnVtIFNwZWxsaW5nIHsKKyAgICBHTlVfc2VjdGlvbiA9IDAsCisgICAgQ1hYMTFfZ251X3NlY3Rpb24gPSAxLAorICAgIERlY2xzcGVjX2FsbG9jYXRlID0gMgorICB9OworCisgIHVuc2lnbmVkIElkeCA9IEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKTsKKyAgc3dpdGNoIChJZHgpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHNwZWxsaW5nIGxpc3QgaW5kZXgiKTsKKyAgICBjYXNlIDA6IHJldHVybiBHTlVfc2VjdGlvbjsKKyAgICBjYXNlIDE6IHJldHVybiBDWFgxMV9nbnVfc2VjdGlvbjsKKyAgICBjYXNlIDI6IHJldHVybiBEZWNsc3BlY19hbGxvY2F0ZTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yU2VjdGlvbihsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGVfaXNfZ2xvYmFsLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX29iamNfbWV0aG9kLCAvKklzU3VwcG9ydGVkPSovTGFuZ09wdHMuT2JqQzEpKTsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9vYmpjX3Byb3BlcnR5LCAvKklzU3VwcG9ydGVkPSovTGFuZ09wdHMuT2JqQzEpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tTZXRUeXBlc3RhdGVBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxDWFhNZXRob2REZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yU2V0VHlwZXN0YXRlKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9mdW5jdGlvbl9pc19tZW1iZXIsIC8qSXNTdXBwb3J0ZWQ9Ki9MYW5nT3B0cy5DUGx1c1BsdXMpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tTaGFyZWRUcnlsb2NrRnVuY3Rpb25BcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrU3dpZnRDb250ZXh0QXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8UGFybVZhckRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAicGFyYW1ldGVycyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yU3dpZnRDb250ZXh0KGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV92YXJpYWJsZV9pc19wYXJhbWV0ZXIsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrU3dpZnRFcnJvclJlc3VsdEFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPFBhcm1WYXJEZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgInBhcmFtZXRlcnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0ZvclN3aWZ0RXJyb3JSZXN1bHQobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX3ZhcmlhYmxlX2lzX3BhcmFtZXRlciwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tTd2lmdEluZGlyZWN0UmVzdWx0QXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8UGFybVZhckRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAicGFyYW1ldGVycyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yU3dpZnRJbmRpcmVjdFJlc3VsdChsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGVfaXNfcGFyYW1ldGVyLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworfQorCitzdGF0aWMgYm9vbCBpc1RMU1Zhcihjb25zdCBEZWNsICpEKSB7CisgIGlmIChjb25zdCBhdXRvICpTID0gZHluX2Nhc3Q8VmFyRGVjbD4oRCkpCisgICAgcmV0dXJuIFMtPmdldFRMU0tpbmQoKSAhPSAwOworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrVExTTW9kZWxBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzVExTVmFyKEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJ0aHJlYWQtbG9jYWwgdmFyaWFibGVzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JUTFNNb2RlbChsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGVfaXNfdGhyZWFkX2xvY2FsLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja1RhcmdldEFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yVGFyZ2V0KGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9mdW5jdGlvbiwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tUZXN0VHlwZXN0YXRlQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8Q1hYTWV0aG9kRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0ZvclRlc3RUeXBlc3RhdGUobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2Z1bmN0aW9uX2lzX21lbWJlciwgLypJc1N1cHBvcnRlZD0qL0xhbmdPcHRzLkNQbHVzUGx1cykpOworfQorCitzdGF0aWMgYm9vbCBjaGVja1RocmVhZEFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPFZhckRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAidmFyaWFibGVzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrTm90Q1BsdXNQbHVzTGFuZ09wdHMoU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBpZiAoIVMuTGFuZ09wdHMuQ1BsdXNQbHVzKQorICAgIHJldHVybiB0cnVlOworCisgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9pZ25vcmVkKSA8PCBBdHRyLmdldE5hbWUoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBjaGVja1RyaXZpYWxBQklBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxDWFhSZWNvcmREZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImNsYXNzZXMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hSdWxlc0ZvclRyaXZpYWxBQkkobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX3JlY29yZCwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tUcnlBY3F1aXJlQ2FwYWJpbGl0eUFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdW5zaWduZWQgVHJ5QWNxdWlyZUNhcGFiaWxpdHlBdHRyU3BlbGxpbmdNYXAoY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBlbnVtIFNwZWxsaW5nIHsKKyAgICBHTlVfdHJ5X2FjcXVpcmVfY2FwYWJpbGl0eSA9IDAsCisgICAgQ1hYMTFfY2xhbmdfdHJ5X2FjcXVpcmVfY2FwYWJpbGl0eSA9IDEsCisgICAgR05VX3RyeV9hY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5ID0gMiwKKyAgICBDWFgxMV9jbGFuZ190cnlfYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSA9IDMKKyAgfTsKKworICB1bnNpZ25lZCBJZHggPSBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCk7CisgIHN3aXRjaCAoSWR4KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzcGVsbGluZyBsaXN0IGluZGV4Iik7CisgICAgY2FzZSAwOiByZXR1cm4gR05VX3RyeV9hY3F1aXJlX2NhcGFiaWxpdHk7CisgICAgY2FzZSAxOiByZXR1cm4gQ1hYMTFfY2xhbmdfdHJ5X2FjcXVpcmVfY2FwYWJpbGl0eTsKKyAgICBjYXNlIDI6IHJldHVybiBHTlVfdHJ5X2FjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHk7CisgICAgY2FzZSAzOiByZXR1cm4gQ1hYMTFfY2xhbmdfdHJ5X2FjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHk7CisgIH0KK30KKworc3RhdGljIGJvb2wgY2hlY2tVbnVzZWRBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxWYXJEZWNsPihEKSAmJiAhaXNhPE9iakNJdmFyRGVjbD4oRCkgJiYgIWlzYTxUeXBlRGVjbD4oRCkgJiYgIWlzYTxFbnVtRGVjbD4oRCkgJiYgIWlzYTxFbnVtQ29uc3RhbnREZWNsPihEKSAmJiAhaXNhPExhYmVsRGVjbD4oRCkgJiYgIWlzYTxGaWVsZERlY2w+KEQpICYmICFpc2E8T2JqQ01ldGhvZERlY2w+KEQpICYmICFpc0Z1bmN0aW9uTGlrZShEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgInZhcmlhYmxlcywgbm9uLXN0YXRpYyBkYXRhIG1lbWJlcnMsIHR5cGVzLCBlbnVtcywgZW51bWVyYXRvcnMsIGxhYmVscywgbm9uLXN0YXRpYyBkYXRhIG1lbWJlcnMsIE9iamVjdGl2ZS1DIG1ldGhvZHMsIGZ1bmN0aW9ucywgYW5kIGZ1bmN0aW9uIHBvaW50ZXJzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBVbnVzZWRBdHRyU3BlbGxpbmdNYXAoY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBlbnVtIFNwZWxsaW5nIHsKKyAgICBDWFgxMV9tYXliZV91bnVzZWQgPSAwLAorICAgIEdOVV91bnVzZWQgPSAxLAorICAgIENYWDExX2dudV91bnVzZWQgPSAyLAorICAgIEMyeF9tYXliZV91bnVzZWQgPSAzCisgIH07CisKKyAgdW5zaWduZWQgSWR4ID0gQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpOworICBzd2l0Y2ggKElkeCkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gc3BlbGxpbmcgbGlzdCBpbmRleCIpOworICAgIGNhc2UgMDogcmV0dXJuIENYWDExX21heWJlX3VudXNlZDsKKyAgICBjYXNlIDE6IHJldHVybiBHTlVfdW51c2VkOworICAgIGNhc2UgMjogcmV0dXJuIENYWDExX2dudV91bnVzZWQ7CisgICAgY2FzZSAzOiByZXR1cm4gQzJ4X21heWJlX3VudXNlZDsKKyAgfQorfQorCitzdGF0aWMgYm9vbCBpc05vbkxvY2FsVmFyKGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKGNvbnN0IGF1dG8gKlMgPSBkeW5fY2FzdDxWYXJEZWNsPihEKSkKKyAgICByZXR1cm4gIVMtPmhhc0xvY2FsU3RvcmFnZSgpOworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrVXNlZEFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNOb25Mb2NhbFZhcihEKSAmJiAhaXNhPEZ1bmN0aW9uRGVjbD4oRCkgJiYgIWlzYTxPYmpDTWV0aG9kRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJ2YXJpYWJsZXMgd2l0aCBub24tbG9jYWwgc3RvcmFnZSwgZnVuY3Rpb25zLCBhbmQgT2JqZWN0aXZlLUMgbWV0aG9kcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja1V1aWRBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxSZWNvcmREZWNsPihEKSAmJiAhaXNhPEVudW1EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgInN0cnVjdHMsIHVuaW9ucywgY2xhc3NlcywgYW5kIGVudW1zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrTWljcm9zb2Z0RXh0Qm9ybGFuZExhbmdPcHRzKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKKyAgaWYgKFMuTGFuZ09wdHMuTWljcm9zb2Z0RXh0IHx8IFMuTGFuZ09wdHMuQm9ybGFuZCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfaWdub3JlZCkgPDwgQXR0ci5nZXROYW1lKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tWZWNSZXR1cm5BcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxDWFhSZWNvcmREZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiY2xhc3NlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja1ZlY1R5cGVIaW50QXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiZnVuY3Rpb25zIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrV2FyblVudXNlZEFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPFJlY29yZERlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAic3RydWN0cywgdW5pb25zLCBhbmQgY2xhc3NlcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja1dhcm5VbnVzZWRSZXN1bHRBcHBlcnRhaW5zVG8oU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgY29uc3QgRGVjbCAqRCkgeworICBpZiAoIWlzYTxPYmpDTWV0aG9kRGVjbD4oRCkgJiYgIWlzYTxFbnVtRGVjbD4oRCkgJiYgIWlzYTxSZWNvcmREZWNsPihEKSAmJiAhaXNGdW5jdGlvbkxpa2UoRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlX3N0cikKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJPYmplY3RpdmUtQyBtZXRob2RzLCBlbnVtcywgc3RydWN0cywgdW5pb25zLCBjbGFzc2VzLCBmdW5jdGlvbnMsIGFuZCBmdW5jdGlvbiBwb2ludGVycyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdW5zaWduZWQgV2FyblVudXNlZFJlc3VsdEF0dHJTcGVsbGluZ01hcChjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisgIGVudW0gU3BlbGxpbmcgeworICAgIENYWDExX25vZGlzY2FyZCA9IDAsCisgICAgQzJ4X25vZGlzY2FyZCA9IDEsCisgICAgQ1hYMTFfY2xhbmdfd2Fybl91bnVzZWRfcmVzdWx0ID0gMiwKKyAgICBHTlVfd2Fybl91bnVzZWRfcmVzdWx0ID0gMywKKyAgICBDWFgxMV9nbnVfd2Fybl91bnVzZWRfcmVzdWx0ID0gNAorICB9OworCisgIHVuc2lnbmVkIElkeCA9IEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKTsKKyAgc3dpdGNoIChJZHgpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHNwZWxsaW5nIGxpc3QgaW5kZXgiKTsKKyAgICBjYXNlIDA6IHJldHVybiBDWFgxMV9ub2Rpc2NhcmQ7CisgICAgY2FzZSAxOiByZXR1cm4gQzJ4X25vZGlzY2FyZDsKKyAgICBjYXNlIDI6IHJldHVybiBDWFgxMV9jbGFuZ193YXJuX3VudXNlZF9yZXN1bHQ7CisgICAgY2FzZSAzOiByZXR1cm4gR05VX3dhcm5fdW51c2VkX3Jlc3VsdDsKKyAgICBjYXNlIDQ6IHJldHVybiBDWFgxMV9nbnVfd2Fybl91bnVzZWRfcmVzdWx0OworICB9Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JXYXJuVW51c2VkUmVzdWx0KGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+ICZNYXRjaFJ1bGVzLCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9vYmpjX21ldGhvZCwgLypJc1N1cHBvcnRlZD0qL0xhbmdPcHRzLk9iakMxKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZW51bSwgLypJc1N1cHBvcnRlZD0qL3RydWUpKTsKKyAgTWF0Y2hSdWxlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9yZWNvcmQsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfaGFzVHlwZV9mdW5jdGlvblR5cGUsIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrV2Vha0FwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPFZhckRlY2w+KEQpICYmICFpc2E8RnVuY3Rpb25EZWNsPihEKSAmJiAhaXNhPENYWFJlY29yZERlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAidmFyaWFibGVzLCBmdW5jdGlvbnMsIGFuZCBjbGFzc2VzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrV2Vha1JlZkFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPFZhckRlY2w+KEQpICYmICFpc2E8RnVuY3Rpb25EZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZV9zdHIpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAidmFyaWFibGVzIGFuZCBmdW5jdGlvbnMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tXb3JrR3JvdXBTaXplSGludEFwcGVydGFpbnNUbyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBjb25zdCBEZWNsICpEKSB7CisgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja1hSYXlJbnN0cnVtZW50QXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSAmJiAhaXNhPE9iakNNZXRob2REZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyBhbmQgT2JqZWN0aXZlLUMgbWV0aG9kcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdW5zaWduZWQgWFJheUluc3RydW1lbnRBdHRyU3BlbGxpbmdNYXAoY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBlbnVtIFNwZWxsaW5nIHsKKyAgICBHTlVfeHJheV9hbHdheXNfaW5zdHJ1bWVudCA9IDAsCisgICAgQ1hYMTFfY2xhbmdfeHJheV9hbHdheXNfaW5zdHJ1bWVudCA9IDEsCisgICAgQzJ4X2NsYW5nX3hyYXlfYWx3YXlzX2luc3RydW1lbnQgPSAyLAorICAgIEdOVV94cmF5X25ldmVyX2luc3RydW1lbnQgPSAzLAorICAgIENYWDExX2NsYW5nX3hyYXlfbmV2ZXJfaW5zdHJ1bWVudCA9IDQsCisgICAgQzJ4X2NsYW5nX3hyYXlfbmV2ZXJfaW5zdHJ1bWVudCA9IDUKKyAgfTsKKworICB1bnNpZ25lZCBJZHggPSBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCk7CisgIHN3aXRjaCAoSWR4KSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzcGVsbGluZyBsaXN0IGluZGV4Iik7CisgICAgY2FzZSAwOiByZXR1cm4gR05VX3hyYXlfYWx3YXlzX2luc3RydW1lbnQ7CisgICAgY2FzZSAxOiByZXR1cm4gQ1hYMTFfY2xhbmdfeHJheV9hbHdheXNfaW5zdHJ1bWVudDsKKyAgICBjYXNlIDI6IHJldHVybiBDMnhfY2xhbmdfeHJheV9hbHdheXNfaW5zdHJ1bWVudDsKKyAgICBjYXNlIDM6IHJldHVybiBHTlVfeHJheV9uZXZlcl9pbnN0cnVtZW50OworICAgIGNhc2UgNDogcmV0dXJuIENYWDExX2NsYW5nX3hyYXlfbmV2ZXJfaW5zdHJ1bWVudDsKKyAgICBjYXNlIDU6IHJldHVybiBDMnhfY2xhbmdfeHJheV9uZXZlcl9pbnN0cnVtZW50OworICB9Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoUnVsZXNGb3JYUmF5SW5zdHJ1bWVudChsbHZtOjpTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIGJvb2w+PiAmTWF0Y2hSdWxlcywgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb24sIC8qSXNTdXBwb3J0ZWQ9Ki90cnVlKSk7CisgIE1hdGNoUnVsZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfb2JqY19tZXRob2QsIC8qSXNTdXBwb3J0ZWQ9Ki9MYW5nT3B0cy5PYmpDMSkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja1hSYXlMb2dBcmdzQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIGNvbnN0IERlY2wgKkQpIHsKKyAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSAmJiAhaXNhPE9iakNNZXRob2REZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVfc3RyKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgImZ1bmN0aW9ucyBhbmQgT2JqZWN0aXZlLUMgbWV0aG9kcyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBtYXRjaFJ1bGVzRm9yWFJheUxvZ0FyZ3MobGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlLCBib29sPj4gJk1hdGNoUnVsZXMsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2Z1bmN0aW9uLCAvKklzU3VwcG9ydGVkPSovdHJ1ZSkpOworICBNYXRjaFJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX29iamNfbWV0aG9kLCAvKklzU3VwcG9ydGVkPSovTGFuZ09wdHMuT2JqQzEpKTsKK30KKworc3RhdGljIGNvbnN0IFBhcnNlZEF0dHJJbmZvIEF0dHJJbmZvTWFwW0F0dHJpYnV0ZUxpc3Q6OlVua25vd25BdHRyaWJ1dGUgKyAxXSA9IHsKKyAgeyAyLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCBjaGVja0FNREdQVUZsYXRXb3JrR3JvdXBTaXplQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JBTURHUFVGbGF0V29ya0dyb3VwU2l6ZSB9LCAgLy8gQVRfQU1ER1BVRmxhdFdvcmtHcm91cFNpemUKKyAgeyAxLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCBjaGVja0FNREdQVU51bVNHUFJBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0ZvckFNREdQVU51bVNHUFIgfSwgIC8vIEFUX0FNREdQVU51bVNHUFIKKyAgeyAxLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCBjaGVja0FNREdQVU51bVZHUFJBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0ZvckFNREdQVU51bVZHUFIgfSwgIC8vIEFUX0FNREdQVU51bVZHUFIKKyAgeyAxLCAxLCAwLCAwLCAwLCAwLCAwLCAxLCBjaGVja0FNREdQVVdhdmVzUGVyRVVBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0ZvckFNREdQVVdhdmVzUGVyRVUgfSwgIC8vIEFUX0FNREdQVVdhdmVzUGVyRVUKKyAgeyAwLCAxLCAxLCAxLCAwLCAwLCAxLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgaXNUYXJnZXRhcm10aHVtYmFybWVidGh1bWJlYmF2cng4Nng4Nl82NG1zcDQzMG1pcHNtaXBzZWwsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9JbnRlcnJ1cHQKKyAgeyAwLCAwLCAwLCAxLCAwLCAwLCAxLCAxLCBjaGVja0FWUlNpZ25hbEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGlzVGFyZ2V0YXZyLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0ZvckFWUlNpZ25hbCB9LCAgLy8gQVRfQVZSU2lnbmFsCisgIHsgMCwgMTUsIDAsIDAsIDAsIDAsIDEsIDEsIGNoZWNrQWJpVGFnQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JBYmlUYWcgfSwgIC8vIEFUX0FiaVRhZworICB7IDAsIDE1LCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja0FjcXVpcmVDYXBhYmlsaXR5QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgQWNxdWlyZUNhcGFiaWxpdHlBdHRyU3BlbGxpbmdNYXAsIG51bGxwdHIgfSwgIC8vIEFUX0FjcXVpcmVDYXBhYmlsaXR5CisgIHsgMCwgMTUsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrQWNxdWlyZWRBZnRlckFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9BY3F1aXJlZEFmdGVyCisgIHsgMCwgMTUsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrQWNxdWlyZWRCZWZvcmVBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfQWNxdWlyZWRCZWZvcmUKKyAgeyAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0FkZHJlc3NTcGFjZQorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIGNoZWNrQWxpYXNBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfQWxpYXMKKyAgeyAxLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCBjaGVja0FsaWduVmFsdWVBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0ZvckFsaWduVmFsdWUgfSwgIC8vIEFUX0FsaWduVmFsdWUKKyAgeyAwLCAxLCAwLCAwLCAwLCAwLCAxLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgQWxpZ25lZEF0dHJTcGVsbGluZ01hcCwgbnVsbHB0ciB9LCAgLy8gQVRfQWxpZ25lZAorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIGNoZWNrQWxsb2NBbGlnbkFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9BbGxvY0FsaWduCisgIHsgMSwgMSwgMCwgMCwgMCwgMCwgMSwgMSwgY2hlY2tBbGxvY1NpemVBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0ZvckFsbG9jU2l6ZSB9LCAgLy8gQVRfQWxsb2NTaXplCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgY2hlY2tBbHdheXNJbmxpbmVBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBBbHdheXNJbmxpbmVBdHRyU3BlbGxpbmdNYXAsIG51bGxwdHIgfSwgIC8vIEFUX0Fsd2F5c0lubGluZQorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfQW5hbHl6ZXJOb1JldHVybgorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0ZvckFubm90YXRlIH0sICAvLyBBVF9Bbm5vdGF0ZQorICB7IDAsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBpc1RhcmdldHg4Nng4Nl82NCwgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0FueVg4Nk5vQ2FsbGVyU2F2ZWRSZWdpc3RlcnMKKyAgeyAwLCAwLCAwLCAxLCAwLCAwLCAxLCAxLCBjaGVja0FueVg4Nk5vQ2ZDaGVja0FwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGlzVGFyZ2V0eDg2eDg2XzY0LCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0ZvckFueVg4Nk5vQ2ZDaGVjayB9LCAgLy8gQVRfQW55WDg2Tm9DZkNoZWNrCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tBcmNXZWFrcmVmVW5hdmFpbGFibGVBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfQXJjV2Vha3JlZlVuYXZhaWxhYmxlCisgIHsgMywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tBcmd1bWVudFdpdGhUeXBlVGFnQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgQXJndW1lbnRXaXRoVHlwZVRhZ0F0dHJTcGVsbGluZ01hcCwgbnVsbHB0ciB9LCAgLy8gQVRfQXJndW1lbnRXaXRoVHlwZVRhZworICB7IDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIGNoZWNrQXJ0aWZpY2lhbEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9BcnRpZmljaWFsCisgIHsgMCwgMTUsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrQXNzZXJ0Q2FwYWJpbGl0eUFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIEFzc2VydENhcGFiaWxpdHlBdHRyU3BlbGxpbmdNYXAsIG51bGxwdHIgfSwgIC8vIEFUX0Fzc2VydENhcGFiaWxpdHkKKyAgeyAwLCAxNSwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tBc3NlcnRFeGNsdXNpdmVMb2NrQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0Fzc2VydEV4Y2x1c2l2ZUxvY2sKKyAgeyAwLCAxNSwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tBc3NlcnRTaGFyZWRMb2NrQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0Fzc2VydFNoYXJlZExvY2sKKyAgeyAxLCAxLCAwLCAwLCAwLCAwLCAxLCAxLCBjaGVja0Fzc3VtZUFsaWduZWRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0ZvckFzc3VtZUFsaWduZWQgfSwgIC8vIEFUX0Fzc3VtZUFsaWduZWQKKyAgeyA4LCAwLCAxLCAwLCAwLCAwLCAwLCAxLCBjaGVja0F2YWlsYWJpbGl0eUFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBtYXRjaFJ1bGVzRm9yQXZhaWxhYmlsaXR5IH0sICAvLyBBVF9BdmFpbGFiaWxpdHkKKyAgeyAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0Jsb2NrcworICB7IDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfQ0RlY2wKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja0NGQXVkaXRlZFRyYW5zZmVyQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0NGQXVkaXRlZFRyYW5zZmVyCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tDRkNvbnN1bWVkQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0NGQ29uc3VtZWQKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0NGUmV0dXJuc05vdFJldGFpbmVkCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgZGVmYXVsdEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9DRlJldHVybnNSZXRhaW5lZAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrQ0ZVbmtub3duVHJhbnNmZXJBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfQ0ZVbmtub3duVHJhbnNmZXIKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja0NVREFDb25zdGFudEFwcGVydGFpbnNUbywgY2hlY2tDVURBTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9DVURBQ29uc3RhbnQKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja0NVREFEZXZpY2VBcHBlcnRhaW5zVG8sIGNoZWNrQ1VEQUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfQ1VEQURldmljZQorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrQ1VEQUdsb2JhbEFwcGVydGFpbnNUbywgY2hlY2tDVURBTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9DVURBR2xvYmFsCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tDVURBSG9zdEFwcGVydGFpbnNUbywgY2hlY2tDVURBTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9DVURBSG9zdAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrQ1VEQUludmFsaWRUYXJnZXRBcHBlcnRhaW5zVG8sIGNoZWNrQ1VEQUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfQ1VEQUludmFsaWRUYXJnZXQKKyAgeyAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja0NVREFMYXVuY2hCb3VuZHNBcHBlcnRhaW5zVG8sIGNoZWNrQ1VEQUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfQ1VEQUxhdW5jaEJvdW5kcworICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrQ1VEQVNoYXJlZEFwcGVydGFpbnNUbywgY2hlY2tDVURBTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9DVURBU2hhcmVkCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgY2hlY2tDWFgxMU5vUmV0dXJuQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JDWFgxMU5vUmV0dXJuIH0sICAvLyBBVF9DWFgxMU5vUmV0dXJuCisgIHsgMCwgMTUsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrQ2FsbGFibGVXaGVuQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JDYWxsYWJsZVdoZW4gfSwgIC8vIEFUX0NhbGxhYmxlV2hlbgorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrQ2FwYWJpbGl0eUFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIENhcGFiaWxpdHlBdHRyU3BlbGxpbmdNYXAsIG51bGxwdHIgfSwgIC8vIEFUX0NhcGFiaWxpdHkKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCBjaGVja0NhcnJpZXNEZXBlbmRlbmN5QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JDYXJyaWVzRGVwZW5kZW5jeSB9LCAgLy8gQVRfQ2Fycmllc0RlcGVuZGVuY3kKKyAgeyAxLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCBjaGVja0NsZWFudXBBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfQ2xlYW51cAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIGNoZWNrQ29sZEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9Db2xkCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgY2hlY2tDb21tb25BcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfQ29tbW9uCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgZGVmYXVsdEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9Db25zdAorICB7IDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIGNoZWNrQ29uc3RydWN0b3JBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfQ29uc3RydWN0b3IKKyAgeyAxLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCBjaGVja0NvbnN1bWFibGVBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0ZvckNvbnN1bWFibGUgfSwgIC8vIEFUX0NvbnN1bWFibGUKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja0NvbnN1bWFibGVBdXRvQ2FzdEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9Db25zdW1hYmxlQXV0b0Nhc3QKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja0NvbnN1bWFibGVTZXRPblJlYWRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfQ29uc3VtYWJsZVNldE9uUmVhZAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrQ29udmVyZ2VudEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBtYXRjaFJ1bGVzRm9yQ29udmVyZ2VudCB9LCAgLy8gQVRfQ29udmVyZ2VudAorICB7IDAsIDAsIDAsIDEsIDAsIDAsIDEsIDEsIGNoZWNrRExMRXhwb3J0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgaXNUYXJnZXR4ODZ4ODZfNjRhcm10aHVtYmFhcmNoNjRXaW4zMiwgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JETExFeHBvcnQgfSwgIC8vIEFUX0RMTEV4cG9ydAorICB7IDAsIDAsIDAsIDEsIDAsIDAsIDEsIDEsIGNoZWNrRExMSW1wb3J0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgaXNUYXJnZXR4ODZ4ODZfNjRhcm10aHVtYmFhcmNoNjRXaW4zMiwgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JETExJbXBvcnQgfSwgIC8vIEFUX0RMTEltcG9ydAorICB7IDAsIDIsIDAsIDAsIDAsIDAsIDEsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfRGVwcmVjYXRlZAorICB7IDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIGNoZWNrRGVzdHJ1Y3RvckFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9EZXN0cnVjdG9yCisgIHsgMywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tEaWFnbm9zZUlmQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0RpYWdub3NlSWYKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCBjaGVja0Rpc2FibGVUYWlsQ2FsbHNBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0ZvckRpc2FibGVUYWlsQ2FsbHMgfSwgIC8vIEFUX0Rpc2FibGVUYWlsQ2FsbHMKKyAgeyAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCBjaGVja0VtcHR5QmFzZXNBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBpc1RhcmdldHg4Nng4Nl82NGFybXRodW1iYWFyY2g2NE1pY3Jvc29mdCwgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0VtcHR5QmFzZXMKKyAgeyAyLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCBjaGVja0VuYWJsZUlmQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JFbmFibGVJZiB9LCAgLy8gQVRfRW5hYmxlSWYKKyAgeyAxLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCBjaGVja0VudW1FeHRlbnNpYmlsaXR5QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JFbnVtRXh0ZW5zaWJpbGl0eSB9LCAgLy8gQVRfRW51bUV4dGVuc2liaWxpdHkKKyAgeyAxLCAxNSwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb25BcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfRXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uCisgIHsgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tFeHRWZWN0b3JUeXBlQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0V4dFZlY3RvclR5cGUKKyAgeyAwLCAzLCAxLCAwLCAwLCAwLCAwLCAxLCBjaGVja0V4dGVybmFsU291cmNlU3ltYm9sQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JFeHRlcm5hbFNvdXJjZVN5bWJvbCB9LCAgLy8gQVRfRXh0ZXJuYWxTb3VyY2VTeW1ib2wKKyAgeyAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0ZhbGxUaHJvdWdoCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgZGVmYXVsdEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9GYXN0Q2FsbAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrRmxhZ0VudW1BcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0ZvckZsYWdFbnVtIH0sICAvLyBBVF9GbGFnRW51bQorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIGNoZWNrRmxhdHRlbkFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBtYXRjaFJ1bGVzRm9yRmxhdHRlbiB9LCAgLy8gQVRfRmxhdHRlbgorICB7IDMsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIGNoZWNrRm9ybWF0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0Zvcm1hdAorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIGNoZWNrRm9ybWF0QXJnQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0Zvcm1hdEFyZworICB7IDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIGNoZWNrR05VSW5saW5lQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0dOVUlubGluZQorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrR3VhcmRlZEJ5QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0d1YXJkZWRCeQorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrR3VhcmRlZFZhckFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9HdWFyZGVkVmFyCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgY2hlY2tIb3RBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfSG90CisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tJQkFjdGlvbkFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9JQkFjdGlvbgorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfSUJPdXRsZXQKKyAgeyAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0lCT3V0bGV0Q29sbGVjdGlvbgorICB7IDEsIDAsIDAsIDEsIDAsIDAsIDEsIDEsIGNoZWNrSUZ1bmNBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBpc1RhcmdldEVMRiwgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JJRnVuYyB9LCAgLy8gQVRfSUZ1bmMKKyAgeyAxLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCBjaGVja0luaXRQcmlvcml0eUFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9Jbml0UHJpb3JpdHkKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0ludGVsT2NsQmljYworICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrSW50ZXJuYWxMaW5rYWdlQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JJbnRlcm5hbExpbmthZ2UgfSwgIC8vIEFUX0ludGVybmFsTGlua2FnZQorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrTFRPVmlzaWJpbGl0eVB1YmxpY0FwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBtYXRjaFJ1bGVzRm9yTFRPVmlzaWJpbGl0eVB1YmxpYyB9LCAgLy8gQVRfTFRPVmlzaWJpbGl0eVB1YmxpYworICB7IDEsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIGNoZWNrTGF5b3V0VmVyc2lvbkFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGlzVGFyZ2V0eDg2eDg2XzY0YXJtdGh1bWJhYXJjaDY0TWljcm9zb2Z0LCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfTGF5b3V0VmVyc2lvbgorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrTG9ja1JldHVybmVkQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0xvY2tSZXR1cm5lZAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrTG9ja2FibGVBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfTG9ja2FibGUKKyAgeyAwLCAxNSwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tMb2Nrc0V4Y2x1ZGVkQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX0xvY2tzRXhjbHVkZWQKKyAgeyAzLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgTG9vcEhpbnRBdHRyU3BlbGxpbmdNYXAsIG51bGxwdHIgfSwgIC8vIEFUX0xvb3BIaW50CisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgZGVmYXVsdEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9NU0FCSQorICB7IDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGNoZWNrTWljcm9zb2Z0RXh0TGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIE1TSW5oZXJpdGFuY2VBdHRyU3BlbGxpbmdNYXAsIG51bGxwdHIgfSwgIC8vIEFUX01TSW5oZXJpdGFuY2UKKyAgeyAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCBjaGVja01TTm9WVGFibGVBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBpc1RhcmdldHg4Nng4Nl82NGFybXRodW1iYWFyY2g2NE1pY3Jvc29mdCwgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX01TTm9WVGFibGUKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCBjaGVja01TU3RydWN0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX01TU3RydWN0CisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgZGVmYXVsdEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9NYXlBbGlhcworICB7IDAsIDAsIDAsIDEsIDAsIDAsIDEsIDEsIGNoZWNrTWljcm9NaXBzQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgaXNUYXJnZXRtaXBzbWlwc2VsLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0Zvck1pY3JvTWlwcyB9LCAgLy8gQVRfTWljcm9NaXBzCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tNaW5TaXplQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX01pblNpemUKKyAgeyAwLCAwLCAwLCAxLCAwLCAwLCAxLCAwLCBjaGVja01pcHMxNkFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGlzVGFyZ2V0bWlwc21pcHNlbCwgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX01pcHMxNgorICB7IDAsIDAsIDAsIDEsIDAsIDAsIDEsIDEsIGNoZWNrTWlwc0xvbmdDYWxsQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgaXNUYXJnZXRtaXBzbWlwc2VsbWlwczY0bWlwczY0ZWwsIE1pcHNMb25nQ2FsbEF0dHJTcGVsbGluZ01hcCwgbWF0Y2hSdWxlc0Zvck1pcHNMb25nQ2FsbCB9LCAgLy8gQVRfTWlwc0xvbmdDYWxsCisgIHsgMCwgMCwgMCwgMSwgMCwgMCwgMSwgMSwgY2hlY2tNaXBzU2hvcnRDYWxsQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgaXNUYXJnZXRtaXBzbWlwc2VsbWlwczY0bWlwczY0ZWwsIE1pcHNTaG9ydENhbGxBdHRyU3BlbGxpbmdNYXAsIG1hdGNoUnVsZXNGb3JNaXBzU2hvcnRDYWxsIH0sICAvLyBBVF9NaXBzU2hvcnRDYWxsCisgIHsgMSwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgY2hlY2tNb2RlQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX01vZGUKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja05TQ29uc3VtZWRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfTlNDb25zdW1lZAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrTlNDb25zdW1lc1NlbGZBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfTlNDb25zdW1lc1NlbGYKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX05TUmV0dXJuc0F1dG9yZWxlYXNlZAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfTlNSZXR1cm5zTm90UmV0YWluZWQKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX05TUmV0dXJuc1JldGFpbmVkCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgY2hlY2tOYWtlZEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9OYWtlZAorICB7IDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfTmVvblBvbHlWZWN0b3JUeXBlCisgIHsgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgZGVmYXVsdEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9OZW9uVmVjdG9yVHlwZQorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrTm9BbGlhc0FwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9Ob0FsaWFzCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgY2hlY2tOb0NvbW1vbkFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9Ob0NvbW1vbgorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIGNoZWNrTm9EZWJ1Z0FwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBtYXRjaFJ1bGVzRm9yTm9EZWJ1ZyB9LCAgLy8gQVRfTm9EZWJ1ZworICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrTm9EdXBsaWNhdGVBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0Zvck5vRHVwbGljYXRlIH0sICAvLyBBVF9Ob0R1cGxpY2F0ZQorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrTm9Fc2NhcGVBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0Zvck5vRXNjYXBlIH0sICAvLyBBVF9Ob0VzY2FwZQorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIGNoZWNrTm9JbmxpbmVBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfTm9JbmxpbmUKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCBjaGVja05vSW5zdHJ1bWVudEZ1bmN0aW9uQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX05vSW5zdHJ1bWVudEZ1bmN0aW9uCisgIHsgMCwgMCwgMCwgMSwgMCwgMCwgMSwgMSwgY2hlY2tOb01pY3JvTWlwc0FwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGlzVGFyZ2V0bWlwc21pcHNlbCwgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JOb01pY3JvTWlwcyB9LCAgLy8gQVRfTm9NaWNyb01pcHMKKyAgeyAwLCAwLCAwLCAxLCAwLCAwLCAxLCAwLCBjaGVja05vTWlwczE2QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgaXNUYXJnZXRtaXBzbWlwc2VsLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfTm9NaXBzMTYKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX05vUmV0dXJuCisgIHsgMCwgMTUsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrTm9TYW5pdGl6ZUFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBtYXRjaFJ1bGVzRm9yTm9TYW5pdGl6ZSB9LCAgLy8gQVRfTm9TYW5pdGl6ZQorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIGNoZWNrTm9TYW5pdGl6ZVNwZWNpZmljQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JOb1Nhbml0aXplU3BlY2lmaWMgfSwgIC8vIEFUX05vU2FuaXRpemVTcGVjaWZpYworICB7IDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIGNoZWNrTm9TcGxpdFN0YWNrQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JOb1NwbGl0U3RhY2sgfSwgIC8vIEFUX05vU3BsaXRTdGFjaworICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrTm9UaHJlYWRTYWZldHlBbmFseXNpc0FwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9Ob1RocmVhZFNhZmV0eUFuYWx5c2lzCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgY2hlY2tOb1Rocm93QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JOb1Rocm93IH0sICAvLyBBVF9Ob1Rocm93CisgIHsgMCwgMTUsIDAsIDAsIDAsIDAsIDEsIDAsIGNoZWNrTm9uTnVsbEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9Ob25OdWxsCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgY2hlY2tOb3RUYWlsQ2FsbGVkQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JOb3RUYWlsQ2FsbGVkIH0sICAvLyBBVF9Ob3RUYWlsQ2FsbGVkCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgY2hlY2tPYmpDQm94YWJsZUFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBtYXRjaFJ1bGVzRm9yT2JqQ0JveGFibGUgfSwgIC8vIEFUX09iakNCb3hhYmxlCisgIHsgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tPYmpDQnJpZGdlQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX09iakNCcmlkZ2UKKyAgeyAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja09iakNCcmlkZ2VNdXRhYmxlQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX09iakNCcmlkZ2VNdXRhYmxlCisgIHsgMywgMCwgMSwgMCwgMCwgMCwgMCwgMCwgY2hlY2tPYmpDQnJpZGdlUmVsYXRlZEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9PYmpDQnJpZGdlUmVsYXRlZAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrT2JqQ0Rlc2lnbmF0ZWRJbml0aWFsaXplckFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9PYmpDRGVzaWduYXRlZEluaXRpYWxpemVyCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tPYmpDRXhjZXB0aW9uQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX09iakNFeGNlcHRpb24KKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja09iakNFeHBsaWNpdFByb3RvY29sSW1wbEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9PYmpDRXhwbGljaXRQcm90b2NvbEltcGwKKyAgeyAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX09iakNHQworICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfT2JqQ0luZGVwZW5kZW50Q2xhc3MKKyAgeyAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX09iakNLaW5kT2YKKyAgeyAxLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCBjaGVja09iakNNZXRob2RGYW1pbHlBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0Zvck9iakNNZXRob2RGYW1pbHkgfSwgIC8vIEFUX09iakNNZXRob2RGYW1pbHkKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX09iakNOU09iamVjdAorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfT2JqQ093bmVyc2hpcAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrT2JqQ1ByZWNpc2VMaWZldGltZUFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9PYmpDUHJlY2lzZUxpZmV0aW1lCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tPYmpDUmVxdWlyZXNQcm9wZXJ0eURlZnNBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfT2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgY2hlY2tPYmpDUmVxdWlyZXNTdXBlckFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBtYXRjaFJ1bGVzRm9yT2JqQ1JlcXVpcmVzU3VwZXIgfSwgIC8vIEFUX09iakNSZXF1aXJlc1N1cGVyCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tPYmpDUmV0dXJuc0lubmVyUG9pbnRlckFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9PYmpDUmV0dXJuc0lubmVyUG9pbnRlcgorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrT2JqQ1Jvb3RDbGFzc0FwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9PYmpDUm9vdENsYXNzCisgIHsgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgY2hlY2tPYmpDUnVudGltZU5hbWVBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0Zvck9iakNSdW50aW1lTmFtZSB9LCAgLy8gQVRfT2JqQ1J1bnRpbWVOYW1lCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgY2hlY2tPYmpDUnVudGltZVZpc2libGVBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0Zvck9iakNSdW50aW1lVmlzaWJsZSB9LCAgLy8gQVRfT2JqQ1J1bnRpbWVWaXNpYmxlCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgY2hlY2tPYmpDU3ViY2xhc3NpbmdSZXN0cmljdGVkQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JPYmpDU3ViY2xhc3NpbmdSZXN0cmljdGVkIH0sICAvLyBBVF9PYmpDU3ViY2xhc3NpbmdSZXN0cmljdGVkCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tPcGVuQ0xBY2Nlc3NBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBPcGVuQ0xBY2Nlc3NBdHRyU3BlbGxpbmdNYXAsIG51bGxwdHIgfSwgIC8vIEFUX09wZW5DTEFjY2VzcworICB7IDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfT3BlbkNMQ29uc3RhbnRBZGRyZXNzU3BhY2UKKyAgeyAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX09wZW5DTEdlbmVyaWNBZGRyZXNzU3BhY2UKKyAgeyAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX09wZW5DTEdsb2JhbEFkZHJlc3NTcGFjZQorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrT3BlbkNMSW50ZWxSZXFkU3ViR3JvdXBTaXplQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JPcGVuQ0xJbnRlbFJlcWRTdWJHcm91cFNpemUgfSwgIC8vIEFUX09wZW5DTEludGVsUmVxZFN1Ykdyb3VwU2l6ZQorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrT3BlbkNMS2VybmVsQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX09wZW5DTEtlcm5lbAorICB7IDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfT3BlbkNMTG9jYWxBZGRyZXNzU3BhY2UKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCBjaGVja09wZW5DTE5vU1ZNQXBwZXJ0YWluc1RvLCBjaGVja09wZW5DTExhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0Zvck9wZW5DTE5vU1ZNIH0sICAvLyBBVF9PcGVuQ0xOb1NWTQorICB7IDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfT3BlbkNMUHJpdmF0ZUFkZHJlc3NTcGFjZQorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfT3BlbkNMVW5yb2xsSGludAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrT3B0aW1pemVOb25lQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JPcHRpbWl6ZU5vbmUgfSwgIC8vIEFUX09wdGltaXplTm9uZQorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrT3ZlcmxvYWRhYmxlQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JPdmVybG9hZGFibGUgfSwgIC8vIEFUX092ZXJsb2FkYWJsZQorICB7IDEsIDE1LCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja093bmVyc2hpcEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIE93bmVyc2hpcEF0dHJTcGVsbGluZ01hcCwgbnVsbHB0ciB9LCAgLy8gQVRfT3duZXJzaGlwCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgZGVmYXVsdEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9QYWNrZWQKKyAgeyAxLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCBjaGVja1BhcmFtVHlwZXN0YXRlQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JQYXJhbVR5cGVzdGF0ZSB9LCAgLy8gQVRfUGFyYW1UeXBlc3RhdGUKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1Bhc2NhbAorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrUGFzc09iamVjdFNpemVBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0ZvclBhc3NPYmplY3RTaXplIH0sICAvLyBBVF9QYXNzT2JqZWN0U2l6ZQorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfUGNzCisgIHsgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tQcmFnbWFDbGFuZ0JTU1NlY3Rpb25BcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfUHJhZ21hQ2xhbmdCU1NTZWN0aW9uCisgIHsgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tQcmFnbWFDbGFuZ0RhdGFTZWN0aW9uQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1ByYWdtYUNsYW5nRGF0YVNlY3Rpb24KKyAgeyAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja1ByYWdtYUNsYW5nUm9kYXRhU2VjdGlvbkFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9QcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb24KKyAgeyAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja1ByYWdtYUNsYW5nVGV4dFNlY3Rpb25BcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfUHJhZ21hQ2xhbmdUZXh0U2VjdGlvbgorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfUHJlc2VydmVBbGwKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1ByZXNlcnZlTW9zdAorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrUHRHdWFyZGVkQnlBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfUHRHdWFyZGVkQnkKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja1B0R3VhcmRlZFZhckFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9QdEd1YXJkZWRWYXIKKyAgeyAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1B0cjMyCisgIHsgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgZGVmYXVsdEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9QdHI2NAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfUHVyZQorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfUmVnQ2FsbAorICB7IDEsIDAsIDAsIDAsIDEsIDAsIDEsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfUmVncGFybQorICB7IDAsIDE1LCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja1JlbGVhc2VDYXBhYmlsaXR5QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgUmVsZWFzZUNhcGFiaWxpdHlBdHRyU3BlbGxpbmdNYXAsIG51bGxwdHIgfSwgIC8vIEFUX1JlbGVhc2VDYXBhYmlsaXR5CisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgY2hlY2tSZW5kZXJTY3JpcHRLZXJuZWxBcHBlcnRhaW5zVG8sIGNoZWNrUmVuZGVyU2NyaXB0TGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBtYXRjaFJ1bGVzRm9yUmVuZGVyU2NyaXB0S2VybmVsIH0sICAvLyBBVF9SZW5kZXJTY3JpcHRLZXJuZWwKKyAgeyAzLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja1JlcWRXb3JrR3JvdXBTaXplQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1JlcWRXb3JrR3JvdXBTaXplCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgY2hlY2tSZXF1aXJlQ29uc3RhbnRJbml0QXBwZXJ0YWluc1RvLCBjaGVja0NQbHVzUGx1c0xhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0ZvclJlcXVpcmVDb25zdGFudEluaXQgfSwgIC8vIEFUX1JlcXVpcmVDb25zdGFudEluaXQKKyAgeyAwLCAxNSwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tSZXF1aXJlc0NhcGFiaWxpdHlBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBSZXF1aXJlc0NhcGFiaWxpdHlBdHRyU3BlbGxpbmdNYXAsIG51bGxwdHIgfSwgIC8vIEFUX1JlcXVpcmVzQ2FwYWJpbGl0eQorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIGNoZWNrUmVzdHJpY3RBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBSZXN0cmljdEF0dHJTcGVsbGluZ01hcCwgbnVsbHB0ciB9LCAgLy8gQVRfUmVzdHJpY3QKKyAgeyAxLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCBjaGVja1JldHVyblR5cGVzdGF0ZUFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBtYXRjaFJ1bGVzRm9yUmV0dXJuVHlwZXN0YXRlIH0sICAvLyBBVF9SZXR1cm5UeXBlc3RhdGUKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCBjaGVja1JldHVybnNOb25OdWxsQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JSZXR1cm5zTm9uTnVsbCB9LCAgLy8gQVRfUmV0dXJuc05vbk51bGwKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCBjaGVja1JldHVybnNUd2ljZUFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9SZXR1cm5zVHdpY2UKKyAgeyAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1NQdHIKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja1Njb3BlZExvY2thYmxlQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1Njb3BlZExvY2thYmxlCisgIHsgMSwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgY2hlY2tTZWN0aW9uQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgU2VjdGlvbkF0dHJTcGVsbGluZ01hcCwgbWF0Y2hSdWxlc0ZvclNlY3Rpb24gfSwgIC8vIEFUX1NlY3Rpb24KKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1NlbGVjdEFueQorICB7IDAsIDIsIDAsIDAsIDAsIDAsIDEsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfU2VudGluZWwKKyAgeyAxLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCBjaGVja1NldFR5cGVzdGF0ZUFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBtYXRjaFJ1bGVzRm9yU2V0VHlwZXN0YXRlIH0sICAvLyBBVF9TZXRUeXBlc3RhdGUKKyAgeyAxLCAxNSwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tTaGFyZWRUcnlsb2NrRnVuY3Rpb25BcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfU2hhcmVkVHJ5bG9ja0Z1bmN0aW9uCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgZGVmYXVsdEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9TdGRDYWxsCisgIHsgMCwgMTUsIDAsIDAsIDAsIDEsIDAsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfU3VwcHJlc3MKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1N3aWZ0Q2FsbAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrU3dpZnRDb250ZXh0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JTd2lmdENvbnRleHQgfSwgIC8vIEFUX1N3aWZ0Q29udGV4dAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrU3dpZnRFcnJvclJlc3VsdEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBtYXRjaFJ1bGVzRm9yU3dpZnRFcnJvclJlc3VsdCB9LCAgLy8gQVRfU3dpZnRFcnJvclJlc3VsdAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrU3dpZnRJbmRpcmVjdFJlc3VsdEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBtYXRjaFJ1bGVzRm9yU3dpZnRJbmRpcmVjdFJlc3VsdCB9LCAgLy8gQVRfU3dpZnRJbmRpcmVjdFJlc3VsdAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfU3lzVkFCSQorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIGNoZWNrVExTTW9kZWxBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0ZvclRMU01vZGVsIH0sICAvLyBBVF9UTFNNb2RlbAorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIGNoZWNrVGFyZ2V0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG1hdGNoUnVsZXNGb3JUYXJnZXQgfSwgIC8vIEFUX1RhcmdldAorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrVGVzdFR5cGVzdGF0ZUFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBtYXRjaFJ1bGVzRm9yVGVzdFR5cGVzdGF0ZSB9LCAgLy8gQVRfVGVzdFR5cGVzdGF0ZQorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfVGhpc0NhbGwKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja1RocmVhZEFwcGVydGFpbnNUbywgY2hlY2tNaWNyb3NvZnRFeHRMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1RocmVhZAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGNoZWNrTm90Q1BsdXNQbHVzTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9UcmFuc3BhcmVudFVuaW9uCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgY2hlY2tUcml2aWFsQUJJQXBwZXJ0YWluc1RvLCBjaGVja0NQbHVzUGx1c0xhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0ZvclRyaXZpYWxBQkkgfSwgIC8vIEFUX1RyaXZpYWxBQkkKKyAgeyAxLCAxNSwgMCwgMCwgMCwgMCwgMCwgMCwgY2hlY2tUcnlBY3F1aXJlQ2FwYWJpbGl0eUFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIFRyeUFjcXVpcmVDYXBhYmlsaXR5QXR0clNwZWxsaW5nTWFwLCBudWxscHRyIH0sICAvLyBBVF9UcnlBY3F1aXJlQ2FwYWJpbGl0eQorICB7IDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfVHlwZU5vbk51bGwKKyAgeyAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1R5cGVOdWxsVW5zcGVjaWZpZWQKKyAgeyAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1R5cGVOdWxsYWJsZQorICB7IDQsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfVHlwZVRhZ0ZvckRhdGF0eXBlCisgIHsgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgZGVmYXVsdEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9UeXBlVmlzaWJpbGl0eQorICB7IDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfVVB0cgorICB7IDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIGRlZmF1bHRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfVW5hdmFpbGFibGUKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCBjaGVja1VudXNlZEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIFVudXNlZEF0dHJTcGVsbGluZ01hcCwgbnVsbHB0ciB9LCAgLy8gQVRfVW51c2VkCisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgY2hlY2tVc2VkQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1VzZWQKKyAgeyAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBjaGVja1V1aWRBcHBlcnRhaW5zVG8sIGNoZWNrTWljcm9zb2Z0RXh0Qm9ybGFuZExhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfVXVpZAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrVmVjUmV0dXJuQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1ZlY1JldHVybgorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrVmVjVHlwZUhpbnRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfVmVjVHlwZUhpbnQKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1ZlY3RvckNhbGwKKyAgeyAxLCAwLCAwLCAwLCAxLCAwLCAxLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1ZlY3RvclNpemUKKyAgeyAxLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1Zpc2liaWxpdHkKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCBjaGVja1dhcm5VbnVzZWRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfV2FyblVudXNlZAorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIGNoZWNrV2FyblVudXNlZFJlc3VsdEFwcGVydGFpbnNUbywgZGVmYXVsdERpYWdub3NlTGFuZ09wdHMsIGRlZmF1bHRUYXJnZXRSZXF1aXJlbWVudHMsIFdhcm5VbnVzZWRSZXN1bHRBdHRyU3BlbGxpbmdNYXAsIG1hdGNoUnVsZXNGb3JXYXJuVW51c2VkUmVzdWx0IH0sICAvLyBBVF9XYXJuVW51c2VkUmVzdWx0CisgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgY2hlY2tXZWFrQXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1dlYWsKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cywgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcsIG51bGxwdHIgfSwgIC8vIEFUX1dlYWtJbXBvcnQKKyAgeyAwLCAxLCAwLCAwLCAwLCAwLCAxLCAwLCBjaGVja1dlYWtSZWZBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfV2Vha1JlZgorICB7IDMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGNoZWNrV29ya0dyb3VwU2l6ZUhpbnRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbnVsbHB0ciB9LCAgLy8gQVRfV29ya0dyb3VwU2l6ZUhpbnQKKyAgeyAwLCAwLCAwLCAxLCAwLCAwLCAxLCAwLCBkZWZhdWx0QXBwZXJ0YWluc1RvLCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cywgaXNUYXJnZXR4ODZ4ODZfNjQsIGRlZmF1bHRTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nLCBudWxscHRyIH0sICAvLyBBVF9YODZGb3JjZUFsaWduQXJnUG9pbnRlcgorICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrWFJheUluc3RydW1lbnRBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBYUmF5SW5zdHJ1bWVudEF0dHJTcGVsbGluZ01hcCwgbWF0Y2hSdWxlc0ZvclhSYXlJbnN0cnVtZW50IH0sICAvLyBBVF9YUmF5SW5zdHJ1bWVudAorICB7IDEsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIGNoZWNrWFJheUxvZ0FyZ3NBcHBlcnRhaW5zVG8sIGRlZmF1bHREaWFnbm9zZUxhbmdPcHRzLCBkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzLCBkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZywgbWF0Y2hSdWxlc0ZvclhSYXlMb2dBcmdzIH0gIC8vIEFUX1hSYXlMb2dBcmdzCit9OworCitzdGF0aWMgYm9vbCBjaGVja0F0dHJpYnV0ZU1hdGNoUnVsZUFwcGxpZXNUbyhjb25zdCBEZWNsICpELCBhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlIHJ1bGUpIHsKKyAgc3dpdGNoIChydWxlKSB7CisgIGNhc2UgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9ibG9jazoKKyAgICByZXR1cm4gaXNhPEJsb2NrRGVjbD4oRCk7CisgIGNhc2UgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9lbnVtOgorICAgIHJldHVybiBpc2E8RW51bURlY2w+KEQpOworICBjYXNlIGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZW51bV9jb25zdGFudDoKKyAgICByZXR1cm4gaXNhPEVudW1Db25zdGFudERlY2w+KEQpOworICBjYXNlIGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZmllbGQ6CisgICAgcmV0dXJuIGlzYTxGaWVsZERlY2w+KEQpOworICBjYXNlIGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb246CisgICAgcmV0dXJuIGlzYTxGdW5jdGlvbkRlY2w+KEQpOworICBjYXNlIGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfZnVuY3Rpb25faXNfbWVtYmVyOgorICAgIHJldHVybiBpc2E8Q1hYTWV0aG9kRGVjbD4oRCk7CisgIGNhc2UgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9uYW1lc3BhY2U6CisgICAgcmV0dXJuIGlzYTxOYW1lc3BhY2VEZWNsPihEKTsKKyAgY2FzZSBhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX29iamNfY2F0ZWdvcnk6CisgICAgcmV0dXJuIGlzYTxPYmpDQ2F0ZWdvcnlEZWNsPihEKTsKKyAgY2FzZSBhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX29iamNfaW50ZXJmYWNlOgorICAgIHJldHVybiBpc2E8T2JqQ0ludGVyZmFjZURlY2w+KEQpOworICBjYXNlIGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfb2JqY19tZXRob2Q6CisgICAgcmV0dXJuIGlzYTxPYmpDTWV0aG9kRGVjbD4oRCk7CisgIGNhc2UgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9vYmpjX21ldGhvZF9pc19pbnN0YW5jZToKKyAgICByZXR1cm4gaXNPYmpDSW5zdGFuY2VNZXRob2QoRCk7CisgIGNhc2UgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9vYmpjX3Byb3BlcnR5OgorICAgIHJldHVybiBpc2E8T2JqQ1Byb3BlcnR5RGVjbD4oRCk7CisgIGNhc2UgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9vYmpjX3Byb3RvY29sOgorICAgIHJldHVybiBpc2E8T2JqQ1Byb3RvY29sRGVjbD4oRCk7CisgIGNhc2UgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9yZWNvcmQ6CisgICAgcmV0dXJuIGlzYTxSZWNvcmREZWNsPihEKSB8fCBpc2E8Q1hYUmVjb3JkRGVjbD4oRCk7CisgIGNhc2UgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV9yZWNvcmRfbm90X2lzX3VuaW9uOgorICAgIHJldHVybiBpc1N0cnVjdChEKTsKKyAgY2FzZSBhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2hhc1R5cGVfYWJzdHJhY3Q6CisgICAgYXNzZXJ0KGZhbHNlICYmICJBYnN0cmFjdCBtYXRjaGVyIHJ1bGUgaXNuJ3QgYWxsb3dlZCIpOworICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX2hhc1R5cGVfZnVuY3Rpb25UeXBlOgorICAgIHJldHVybiBpc0Z1bmN0aW9uTGlrZShEKTsKKyAgY2FzZSBhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX3R5cGVfYWxpYXM6CisgICAgcmV0dXJuIGlzYTxUeXBlZGVmTmFtZURlY2w+KEQpOworICBjYXNlIGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGU6CisgICAgcmV0dXJuIGlzYTxWYXJEZWNsPihEKTsKKyAgY2FzZSBhdHRyOjpTdWJqZWN0TWF0Y2hSdWxlX3ZhcmlhYmxlX2lzX3RocmVhZF9sb2NhbDoKKyAgICByZXR1cm4gaXNUTFNWYXIoRCk7CisgIGNhc2UgYXR0cjo6U3ViamVjdE1hdGNoUnVsZV92YXJpYWJsZV9pc19nbG9iYWw6CisgICAgcmV0dXJuIGlzR2xvYmFsVmFyKEQpOworICBjYXNlIGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGVfaXNfcGFyYW1ldGVyOgorICAgIHJldHVybiBpc2E8UGFybVZhckRlY2w+KEQpOworICBjYXNlIGF0dHI6OlN1YmplY3RNYXRjaFJ1bGVfdmFyaWFibGVfbm90X2lzX3BhcmFtZXRlcjoKKyAgICByZXR1cm4gaXNOb25QYXJtVmFyKEQpOworICB9CisgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgbWF0Y2ggcnVsZSIpOworcmV0dXJuIGZhbHNlOworfQorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0F0dHJQYXJzZWRBdHRyS2luZHMuaW5jIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9BdHRyUGFyc2VkQXR0cktpbmRzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWRmMThjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9BdHRyUGFyc2VkQXR0cktpbmRzLmluYwpAQCAtMCwwICsxLDM3NTcgQEAKKy8qPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogQXR0cmlidXRlIG5hbWUgbWF0Y2hlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLCBkbyBub3QgZWRpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKK3N0YXRpYyBBdHRyaWJ1dGVMaXN0OjpLaW5kIGdldEF0dHJLaW5kKFN0cmluZ1JlZiBOYW1lLCBBdHRyaWJ1dGVMaXN0OjpTeW50YXggU3ludGF4KSB7CisgIGlmIChBdHRyaWJ1dGVMaXN0OjpBU19HTlUgPT0gU3ludGF4KSB7CisgIHN3aXRjaCAoTmFtZS5zaXplKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgMzoJIC8vIDMgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdmJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiYXIiLCAyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9NaXBzTG9uZ0NhbGw7CSAvLyAiZmFyIgorICAgIGNhc2UgJ2gnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJvdCIsIDIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0hvdDsJIC8vICJob3QiCisgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImNzIiwgMikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfUGNzOwkgLy8gInBjcyIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgNDoJIC8vIDcgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdjJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAib2xkIiwgMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQ29sZDsJIC8vICJjb2xkIgorICAgIGNhc2UgJ2gnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJvc3QiLCAzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9DVURBSG9zdDsJIC8vICJob3N0IgorICAgIGNhc2UgJ20nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJvZGUiLCAzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Nb2RlOwkgLy8gIm1vZGUiCisgICAgY2FzZSAnbic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImVhciIsIDMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX01pcHNTaG9ydENhbGw7CSAvLyAibmVhciIKKyAgICBjYXNlICdwJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAidXJlIiwgMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfUHVyZTsJIC8vICJwdXJlIgorICAgIGNhc2UgJ3UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJzZWQiLCAzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Vc2VkOwkgLy8gInVzZWQiCisgICAgY2FzZSAndyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImVhayIsIDMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1dlYWs7CSAvLyAid2VhayIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgNToJIC8vIDYgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibGlhcyIsIDQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FsaWFzOwkgLy8gImFsaWFzIgorICAgIGNhc2UgJ2MnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImVjbCIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9DRGVjbDsJIC8vICJjZGVjbCIKKyAgICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgIm5zdCIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Db25zdDsJIC8vICJjb25zdCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJmdW5jIiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfSUZ1bmM7CSAvLyAiaWZ1bmMiCisgICAgY2FzZSAnbic6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAia2VkIiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05ha2VkOwkgLy8gIm5ha2VkIgorICAgICAgY2FzZSAnbyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAic3ZtIiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09wZW5DTE5vU1ZNOwkgLy8gIm5vc3ZtIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDY6CSAvLyAxNSBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJsb2NrcyIsIDUpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0Jsb2NrczsJIC8vICJibG9ja3MiCisgICAgY2FzZSAnYyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm9tbW9uIiwgNSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQ29tbW9uOwkgLy8gImNvbW1vbiIKKyAgICBjYXNlICdkJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZXZpY2UiLCA1KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9DVURBRGV2aWNlOwkgLy8gImRldmljZSIKKyAgICBjYXNlICdmJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAib3JtYXQiLCA1KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Gb3JtYXQ7CSAvLyAiZm9ybWF0IgorICAgIGNhc2UgJ2cnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJsb2JhbCIsIDUpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NVREFHbG9iYWw7CSAvLyAiZ2xvYmFsIgorICAgIGNhc2UgJ2snOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJlcm5lbCIsIDUpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1JlbmRlclNjcmlwdEtlcm5lbDsJIC8vICJrZXJuZWwiCisgICAgY2FzZSAnbSc6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAibGxvYyIsIDQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9SZXN0cmljdDsJIC8vICJtYWxsb2MiCisgICAgICBjYXNlICdpJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJwczE2IiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX01pcHMxNjsJIC8vICJtaXBzMTYiCisgICAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJfYWJpIiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX01TQUJJOwkgLy8gIm1zX2FiaSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3AnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKE5hbWVbMV0gIT0gJ2EnKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVsyXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdjJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJrZWQiLCAzKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfUGFja2VkOwkgLy8gInBhY2tlZCIKKyAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgImNhbCIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9QYXNjYWw7CSAvLyAicGFzY2FsIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnaCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiYXJlZCIsIDQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9DVURBU2hhcmVkOwkgLy8gInNoYXJlZCIKKyAgICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImduYWwiLCA0KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQVZSU2lnbmFsOwkgLy8gInNpZ25hbCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJhcmdldCIsIDUpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1RhcmdldDsJIC8vICJ0YXJnZXQiCisgICAgY2FzZSAndSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm51c2VkIiwgNSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfVW51c2VkOwkgLy8gInVudXNlZCIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgNzoJIC8vIDE4IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnXyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIl9jb25zdCIsIDYpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NvbnN0OwkgLy8gIl9fY29uc3QiCisgICAgY2FzZSAnYSc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiaV90YWciLCA1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQWJpVGFnOwkgLy8gImFiaV90YWciCisgICAgICBjYXNlICdsJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJpZ25lZCIsIDUpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9BbGlnbmVkOwkgLy8gImFsaWduZWQiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdiJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAib3VuZGVkIiwgNikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6SWdub3JlZEF0dHJpYnV0ZTsJIC8vICJib3VuZGVkIgorICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJsZWFudXAiLCA2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9DbGVhbnVwOwkgLy8gImNsZWFudXAiCisgICAgY2FzZSAnZic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImxhdHRlbiIsIDYpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0ZsYXR0ZW47CSAvLyAiZmxhdHRlbiIKKyAgICBjYXNlICdtJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiaW5zaXplIiwgNikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTWluU2l6ZTsJIC8vICJtaW5zaXplIgorICAgIGNhc2UgJ24nOgkgLy8gNCBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ28nOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgICBzd2l0Y2ggKE5hbWVbMl0pIHsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIGNhc2UgJ2QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAiZWJ1ZyIsIDQpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTm9EZWJ1ZzsJIC8vICJub2RlYnVnIgorICAgICAgICBjYXNlICduJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgIm51bGwiLCA0KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vbk51bGw7CSAvLyAibm9ubnVsbCIKKyAgICAgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJocm93IiwgNCkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Ob1Rocm93OwkgLy8gIm5vdGhyb3ciCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICd2JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJfd2VhayIsIDUpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpJZ25vcmVkQXR0cmlidXRlOwkgLy8gIm52X3dlYWsiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdvJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdiJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJqY19nYyIsIDUpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDR0M7CSAvLyAib2JqY19nYyIKKyAgICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgInRub25lIiwgNSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09wdGltaXplTm9uZTsJIC8vICJvcHRub25lIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncic6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJlZyIsIDIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgc3dpdGNoIChOYW1lWzNdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNCwgImFsbCIsIDMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9SZWdDYWxsOwkgLy8gInJlZ2NhbGwiCisgICAgICBjYXNlICdwJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzQsICJhcm0iLCAzKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfUmVncGFybTsJIC8vICJyZWdwYXJtIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnZSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiY3Rpb24iLCA1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU2VjdGlvbjsJIC8vICJzZWN0aW9uIgorICAgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiZGNhbGwiLCA1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU3RkQ2FsbDsJIC8vICJzdGRjYWxsIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAndyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImVha3JlZiIsIDYpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1dlYWtSZWY7CSAvLyAid2Vha3JlZiIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgODoJIC8vIDE1IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnTic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIlNPYmplY3QiLCA3KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDTlNPYmplY3Q7CSAvLyAiTlNPYmplY3QiCisgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm5ub3RhdGUiLCA3KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Bbm5vdGF0ZTsJIC8vICJhbm5vdGF0ZSIKKyAgICBjYXNlICdjJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAib25zdGFudCIsIDcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NVREFDb25zdGFudDsJIC8vICJjb25zdGFudCIKKyAgICBjYXNlICdmJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiYXN0Y2FsbCIsIDcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0Zhc3RDYWxsOwkgLy8gImZhc3RjYWxsIgorICAgIGNhc2UgJ2knOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKE5hbWVbMV0gIT0gJ2InKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVsyXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJjdGlvbiIsIDUpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9JQkFjdGlvbjsJIC8vICJpYmFjdGlvbiIKKyAgICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgInV0bGV0IiwgNSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0lCT3V0bGV0OwkgLy8gImlib3V0bGV0IgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnbCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm9ja2FibGUiLCA3KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Mb2NrYWJsZTsJIC8vICJsb2NrYWJsZSIKKyAgICBjYXNlICduJzoJIC8vIDUgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChOYW1lWzFdICE9ICdvJykKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbMl0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAib21tb24iLCA1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTm9Db21tb247CSAvLyAibm9jb21tb24iCisgICAgICBjYXNlICdlJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJzY2FwZSIsIDUpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Ob0VzY2FwZTsJIC8vICJub2VzY2FwZSIKKyAgICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgIm5saW5lIiwgNSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vSW5saW5lOwkgLy8gIm5vaW5saW5lIgorICAgICAgY2FzZSAnbSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAiaXBzMTYiLCA1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTm9NaXBzMTY7CSAvLyAibm9taXBzMTYiCisgICAgICBjYXNlICdyJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJldHVybiIsIDUpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Ob1JldHVybjsJIC8vICJub3JldHVybiIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgIm50aW5lbCIsIDYpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9TZW50aW5lbDsJIC8vICJzZW50aW5lbCIKKyAgICAgIGNhc2UgJ3knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgInN2X2FiaSIsIDYpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9TeXNWQUJJOwkgLy8gInN5c3ZfYWJpIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImhpc2NhbGwiLCA3KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9UaGlzQ2FsbDsJIC8vICJ0aGlzY2FsbCIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgOToJIC8vIDEzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnZCc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJsbCIsIDIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgc3dpdGNoIChOYW1lWzNdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNCwgInhwb3J0IiwgNSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0RMTEV4cG9ydDsJIC8vICJkbGxleHBvcnQiCisgICAgICBjYXNlICdpJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzQsICJtcG9ydCIsIDUpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9ETExJbXBvcnQ7CSAvLyAiZGxsaW1wb3J0IgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnZSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm5hYmxlX2lmIiwgOCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRW5hYmxlSWY7CSAvLyAiZW5hYmxlX2lmIgorICAgIGNhc2UgJ2YnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJsYWdfZW51bSIsIDgpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0ZsYWdFbnVtOwkgLy8gImZsYWdfZW51bSIKKyAgICBjYXNlICdpJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibnRlcnJ1cHQiLCA4KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9JbnRlcnJ1cHQ7CSAvLyAiaW50ZXJydXB0IgorICAgIGNhc2UgJ2wnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJvbmdfY2FsbCIsIDgpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX01pcHNMb25nQ2FsbDsJIC8vICJsb25nX2NhbGwiCisgICAgY2FzZSAnbSc6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAieV9hbGlhcyIsIDcpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9NYXlBbGlhczsJIC8vICJtYXlfYWxpYXMiCisgICAgICBjYXNlICdpJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJjcm9taXBzIiwgNykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX01pY3JvTWlwczsJIC8vICJtaWNyb21pcHMiCisgICAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJfc3RydWN0IiwgNykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX01TU3RydWN0OwkgLy8gIm1zX3N0cnVjdCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImxlY3RhbnkiLCA3KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU2VsZWN0QW55OwkgLy8gInNlbGVjdGFueSIKKyAgICAgIGNhc2UgJ3cnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImlmdGNhbGwiLCA3KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU3dpZnRDYWxsOwkgLy8gInN3aWZ0Y2FsbCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJsc19tb2RlbCIsIDgpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1RMU01vZGVsOwkgLy8gInRsc19tb2RlbCIKKyAgICBjYXNlICd2JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZWNyZXR1cm4iLCA4KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9WZWNSZXR1cm47CSAvLyAidmVjcmV0dXJuIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAxMDoJIC8vIDE0IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYSc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnbCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAibG9jX3NpemUiLCA4KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQWxsb2NTaXplOwkgLy8gImFsbG9jX3NpemUiCisgICAgICBjYXNlICdyJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJ0aWZpY2lhbCIsIDgpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9BcnRpZmljaWFsOwkgLy8gImFydGlmaWNpYWwiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdjJzoJIC8vIDMgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJwYWJpbGl0eSIsIDgpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9DYXBhYmlsaXR5OwkgLy8gImNhcGFiaWxpdHkiCisgICAgICBjYXNlICdvJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgaWYgKE5hbWVbMl0gIT0gJ24nKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBzd2l0Y2ggKE5hbWVbM10pIHsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs0LCAidW1hYmxlIiwgNikgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Db25zdW1hYmxlOwkgLy8gImNvbnN1bWFibGUiCisgICAgICAgIGNhc2UgJ3YnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs0LCAiZXJnZW50IiwgNikgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Db252ZXJnZW50OwkgLy8gImNvbnZlcmdlbnQiCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdkJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChOYW1lWzFdICE9ICdlJykKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbMl0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAicmVjYXRlZCIsIDcpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9EZXByZWNhdGVkOwkgLy8gImRlcHJlY2F0ZWQiCisgICAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJ0cnVjdG9yIiwgNykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0Rlc3RydWN0b3I7CSAvLyAiZGVzdHJ1Y3RvciIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2YnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJvcm1hdF9hcmciLCA5KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Gb3JtYXRBcmc7CSAvLyAiZm9ybWF0X2FyZyIKKyAgICBjYXNlICdnJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICduJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJ1X2lubGluZSIsIDgpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9HTlVJbmxpbmU7CSAvLyAiZ251X2lubGluZSIKKyAgICAgIGNhc2UgJ3UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImFyZGVkX2J5IiwgOCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0d1YXJkZWRCeTsJIC8vICJndWFyZGVkX2J5IgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnbic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm9jZl9jaGVjayIsIDkpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FueVg4Nk5vQ2ZDaGVjazsJIC8vICJub2NmX2NoZWNrIgorICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJob3J0X2NhbGwiLCA5KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9NaXBzU2hvcnRDYWxsOwkgLy8gInNob3J0X2NhbGwiCisgICAgY2FzZSAndic6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnZSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiY3RvcmNhbGwiLCA4KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfVmVjdG9yQ2FsbDsJIC8vICJ2ZWN0b3JjYWxsIgorICAgICAgY2FzZSAnaSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAic2liaWxpdHkiLCA4KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfVmlzaWJpbGl0eTsJIC8vICJ2aXNpYmlsaXR5IgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDExOgkgLy8gMTYgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdhJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChOYW1lWzFdICE9ICdsJykKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbMl0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnaSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAiZ25fdmFsdWUiLCA4KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQWxpZ25WYWx1ZTsJIC8vICJhbGlnbl92YWx1ZSIKKyAgICAgIGNhc2UgJ2wnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgIm9jX2FsaWduIiwgOCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FsbG9jQWxpZ247CSAvLyAiYWxsb2NfYWxpZ24iCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdjJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdmJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJfY29uc3VtZWQiLCA5KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQ0ZDb25zdW1lZDsJIC8vICJjZl9jb25zdW1lZCIKKyAgICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgIm5zdHJ1Y3RvciIsIDkpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Db25zdHJ1Y3RvcjsJIC8vICJjb25zdHJ1Y3RvciIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJpYWdub3NlX2lmIiwgMTApICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0RpYWdub3NlSWY7CSAvLyAiZGlhZ25vc2VfaWYiCisgICAgY2FzZSAnZyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInVhcmRlZF92YXIiLCAxMCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfR3VhcmRlZFZhcjsJIC8vICJndWFyZGVkX3ZhciIKKyAgICBjYXNlICduJzoJIC8vIDQgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdvJzoJIC8vIDMgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgc3dpdGNoIChOYW1lWzJdKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICBjYXNlICdfJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgInNhbml0aXplIiwgOCkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Ob1Nhbml0aXplOwkgLy8gIm5vX3Nhbml0aXplIgorICAgICAgICBjYXNlICdkJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgInVwbGljYXRlIiwgOCkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Ob0R1cGxpY2F0ZTsJIC8vICJub2R1cGxpY2F0ZSIKKyAgICAgICAgY2FzZSAnbSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJpY3JvbWlwcyIsIDgpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTm9NaWNyb01pcHM7CSAvLyAibm9taWNyb21pcHMiCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJfY29uc3VtZWQiLCA5KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTlNDb25zdW1lZDsJIC8vICJuc19jb25zdW1lZCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJiamNfYnJpZGdlIiwgMTApICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNCcmlkZ2U7CSAvLyAib2JqY19icmlkZ2UiCisgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInJpdmlhbF9hYmkiLCAxMCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfVHJpdmlhbEFCSTsJIC8vICJ0cml2aWFsX2FiaSIKKyAgICBjYXNlICd1JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibmF2YWlsYWJsZSIsIDEwKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9VbmF2YWlsYWJsZTsJIC8vICJ1bmF2YWlsYWJsZSIKKyAgICBjYXNlICd2JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZWN0b3Jfc2l6ZSIsIDEwKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9WZWN0b3JTaXplOwkgLy8gInZlY3Rvcl9zaXplIgorICAgIGNhc2UgJ3cnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgInJuX3VudXNlZCIsIDkpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9XYXJuVW51c2VkOwkgLy8gIndhcm5fdW51c2VkIgorICAgICAgY2FzZSAnZSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiYWtfaW1wb3J0IiwgOSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1dlYWtJbXBvcnQ7CSAvLyAid2Vha19pbXBvcnQiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMTI6CSAvLyA0IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInZhaWxhYmlsaXR5IiwgMTEpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0F2YWlsYWJpbGl0eTsJIC8vICJhdmFpbGFiaWxpdHkiCisgICAgY2FzZSAnbyc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiamNfYm94YWJsZSIsIDEwKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT2JqQ0JveGFibGU7CSAvLyAib2JqY19ib3hhYmxlIgorICAgICAgY2FzZSAndic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiZXJsb2FkYWJsZSIsIDEwKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT3ZlcmxvYWRhYmxlOwkgLy8gIm92ZXJsb2FkYWJsZSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJyZXNlcnZlX2FsbCIsIDExKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9QcmVzZXJ2ZUFsbDsJIC8vICJwcmVzZXJ2ZV9hbGwiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDEzOgkgLy8gMTMgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdhJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdkJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJkcmVzc19zcGFjZSIsIDExKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQWRkcmVzc1NwYWNlOwkgLy8gImFkZHJlc3Nfc3BhY2UiCisgICAgICBjYXNlICdsJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJ3YXlzX2lubGluZSIsIDExKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQWx3YXlzSW5saW5lOwkgLy8gImFsd2F5c19pbmxpbmUiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdjJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiYWxsYWJsZV93aGVuIiwgMTIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NhbGxhYmxlV2hlbjsJIC8vICJjYWxsYWJsZV93aGVuIgorICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJuaXRfcHJpb3JpdHkiLCAxMikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfSW5pdFByaW9yaXR5OwkgLy8gImluaXRfcHJpb3JpdHkiCisgICAgY2FzZSAnbCc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAidW5jaF9ib3VuZHMiLCAxMSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NVREFMYXVuY2hCb3VuZHM7CSAvLyAibGF1bmNoX2JvdW5kcyIKKyAgICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImNrX3JldHVybmVkIiwgMTEpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Mb2NrUmV0dXJuZWQ7CSAvLyAibG9ja19yZXR1cm5lZCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3AnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ3InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImVzZXJ2ZV9tb3N0IiwgMTEpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9QcmVzZXJ2ZU1vc3Q7CSAvLyAicHJlc2VydmVfbW9zdCIKKyAgICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgIl9ndWFyZGVkX2J5IiwgMTEpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9QdEd1YXJkZWRCeTsJIC8vICJwdF9ndWFyZGVkX2J5IgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImV0dXJuc190d2ljZSIsIDEyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9SZXR1cm5zVHdpY2U7CSAvLyAicmV0dXJuc190d2ljZSIKKyAgICBjYXNlICdzJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdlJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJ0X3R5cGVzdGF0ZSIsIDExKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU2V0VHlwZXN0YXRlOwkgLy8gInNldF90eXBlc3RhdGUiCisgICAgICBjYXNlICd3JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJpZnRfY29udGV4dCIsIDExKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU3dpZnRDb250ZXh0OwkgLy8gInN3aWZ0X2NvbnRleHQiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICd2JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZWNfdHlwZV9oaW50IiwgMTIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1ZlY1R5cGVIaW50OwkgLy8gInZlY190eXBlX2hpbnQiCisgICAgY2FzZSAneCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInJheV9sb2dfYXJncyIsIDEyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9YUmF5TG9nQXJnczsJIC8vICJ4cmF5X2xvZ19hcmdzIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAxNDoJIC8vIDExIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYSc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAicXVpcmVkX2FmdGVyIiwgMTIpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9BY3F1aXJlZEFmdGVyOwkgLy8gImFjcXVpcmVkX2FmdGVyIgorICAgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAic3VtZV9hbGlnbmVkIiwgMTIpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Bc3N1bWVBbGlnbmVkOwkgLy8gImFzc3VtZV9hbGlnbmVkIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnYyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInVkYXJ0X2J1aWx0aW4iLCAxMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6SWdub3JlZEF0dHJpYnV0ZTsJIC8vICJjdWRhcnRfYnVpbHRpbiIKKyAgICBjYXNlICdkJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZXZpY2VfYnVpbHRpbiIsIDEzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpJZ25vcmVkQXR0cmlidXRlOwkgLy8gImRldmljZV9idWlsdGluIgorICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJudGVsX29jbF9iaWNjIiwgMTMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0ludGVsT2NsQmljYzsJIC8vICJpbnRlbF9vY2xfYmljYyIKKyAgICBjYXNlICdsJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAib2Nrc19leGNsdWRlZCIsIDEzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Mb2Nrc0V4Y2x1ZGVkOwkgLy8gImxvY2tzX2V4Y2x1ZGVkIgorICAgIGNhc2UgJ24nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJvX3NwbGl0X3N0YWNrIiwgMTMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vU3BsaXRTdGFjazsJIC8vICJub19zcGxpdF9zdGFjayIKKyAgICBjYXNlICdvJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImJqY18iLCA0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVs1XSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdlJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzYsICJ4Y2VwdGlvbiIsIDgpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDRXhjZXB0aW9uOwkgLy8gIm9iamNfZXhjZXB0aW9uIgorICAgICAgY2FzZSAnbyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAid25lcnNoaXAiLCA4KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT2JqQ093bmVyc2hpcDsJIC8vICJvYmpjX293bmVyc2hpcCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ0X2d1YXJkZWRfdmFyIiwgMTMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1B0R3VhcmRlZFZhcjsJIC8vICJwdF9ndWFyZGVkX3ZhciIKKyAgICBjYXNlICd0JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZXN0X3R5cGVzdGF0ZSIsIDEzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9UZXN0VHlwZXN0YXRlOwkgLy8gInRlc3RfdHlwZXN0YXRlIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAxNToJIC8vIDEzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYSc6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAicXVpcmVkX2JlZm9yZSIsIDEzKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQWNxdWlyZWRCZWZvcmU7CSAvLyAiYWNxdWlyZWRfYmVmb3JlIgorICAgICAgY2FzZSAnbSc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImRncHVfbnVtXyIsIDkpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN3aXRjaCAoTmFtZVsxMV0pIHsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxMiwgImdwciIsIDMpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQU1ER1BVTnVtU0dQUjsJIC8vICJhbWRncHVfbnVtX3NncHIiCisgICAgICAgIGNhc2UgJ3YnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxMiwgImdwciIsIDMpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQU1ER1BVTnVtVkdQUjsJIC8vICJhbWRncHVfbnVtX3ZncHIiCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdlJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAieHRfdmVjdG9yX3R5cGUiLCAxNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRXh0VmVjdG9yVHlwZTsJIC8vICJleHRfdmVjdG9yX3R5cGUiCisgICAgY2FzZSAnbic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm90X3RhaWxfY2FsbGVkIiwgMTQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vdFRhaWxDYWxsZWQ7CSAvLyAibm90X3RhaWxfY2FsbGVkIgorICAgIGNhc2UgJ28nOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImpjX3Jvb3RfY2xhc3MiLCAxMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNSb290Q2xhc3M7CSAvLyAib2JqY19yb290X2NsYXNzIgorICAgICAgY2FzZSAndyc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgIm5lcnNoaXBfIiwgOCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgc3dpdGNoIChOYW1lWzEwXSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSAnaCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzExLCAib2xkcyIsIDQpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT3duZXJzaGlwOwkgLy8gIm93bmVyc2hpcF9ob2xkcyIKKyAgICAgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzExLCAiYWtlcyIsIDQpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT3duZXJzaGlwOwkgLy8gIm93bmVyc2hpcF90YWtlcyIKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJhcmFtX3R5cGVzdGF0ZSIsIDE0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9QYXJhbVR5cGVzdGF0ZTsJIC8vICJwYXJhbV90eXBlc3RhdGUiCisgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImV0dXJuc19ub25udWxsIiwgMTQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1JldHVybnNOb25OdWxsOwkgLy8gInJldHVybnNfbm9ubnVsbCIKKyAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiY29wZWRfbG9ja2FibGUiLCAxNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU2NvcGVkTG9ja2FibGU7CSAvLyAic2NvcGVkX2xvY2thYmxlIgorICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ5cGVfdmlzaWJpbGl0eSIsIDE0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9UeXBlVmlzaWJpbGl0eTsJIC8vICJ0eXBlX3Zpc2liaWxpdHkiCisgICAgY2FzZSAndSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm5sb2NrX2Z1bmN0aW9uIiwgMTQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1JlbGVhc2VDYXBhYmlsaXR5OwkgLy8gInVubG9ja19mdW5jdGlvbiIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMTY6CSAvLyA1IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnaSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm50ZXJuYWxfbGlua2FnZSIsIDE1KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9JbnRlcm5hbExpbmthZ2U7CSAvLyAiaW50ZXJuYWxfbGlua2FnZSIKKyAgICBjYXNlICduJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdlJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJvbl92ZWN0b3JfdHlwZSIsIDE0KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTmVvblZlY3RvclR5cGU7CSAvLyAibmVvbl92ZWN0b3JfdHlwZSIKKyAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgIl9jb25zdW1lc19zZWxmIiwgMTQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9OU0NvbnN1bWVzU2VsZjsJIC8vICJuc19jb25zdW1lc19zZWxmIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImFzc19vYmplY3Rfc2l6ZSIsIDE1KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9QYXNzT2JqZWN0U2l6ZTsJIC8vICJwYXNzX29iamVjdF9zaXplIgorICAgIGNhc2UgJ3InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJldHVybl90eXBlc3RhdGUiLCAxNSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfUmV0dXJuVHlwZXN0YXRlOwkgLy8gInJldHVybl90eXBlc3RhdGUiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDE3OgkgLy8gNiBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2EnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ24nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImFseXplcl9ub3JldHVybiIsIDE1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQW5hbHl6ZXJOb1JldHVybjsJIC8vICJhbmFseXplcl9ub3JldHVybiIKKyAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgInNlcnRfY2FwYWJpbGl0eSIsIDE1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQXNzZXJ0Q2FwYWJpbGl0eTsJIC8vICJhc3NlcnRfY2FwYWJpbGl0eSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ28nOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImpjX3J1bnRpbWVfbmFtZSIsIDE1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT2JqQ1J1bnRpbWVOYW1lOwkgLy8gIm9iamNfcnVudGltZV9uYW1lIgorICAgICAgY2FzZSAndyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAibmVyc2hpcF9yZXR1cm5zIiwgMTUpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Pd25lcnNoaXA7CSAvLyAib3duZXJzaGlwX3JldHVybnMiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiaGFyZWRfY2FwYWJpbGl0eSIsIDE2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9DYXBhYmlsaXR5OwkgLy8gInNoYXJlZF9jYXBhYmlsaXR5IgorICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJyYW5zcGFyZW50X3VuaW9uIiwgMTYpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1RyYW5zcGFyZW50VW5pb247CSAvLyAidHJhbnNwYXJlbnRfdW5pb24iCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDE4OgkgLy8gMTMgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdhJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdjJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJxdWlyZV9jYXBhYmlsaXR5IiwgMTYpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9BY3F1aXJlQ2FwYWJpbGl0eTsJIC8vICJhY3F1aXJlX2NhcGFiaWxpdHkiCisgICAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJzZXJ0X3NoYXJlZF9sb2NrIiwgMTYpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Bc3NlcnRTaGFyZWRMb2NrOwkgLy8gImFzc2VydF9zaGFyZWRfbG9jayIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJhcnJpZXNfZGVwZW5kZW5jeSIsIDE3KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9DYXJyaWVzRGVwZW5kZW5jeTsJIC8vICJjYXJyaWVzX2RlcGVuZGVuY3kiCisgICAgY2FzZSAnZCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImlzYWJsZV90YWlsX2NhbGxzIiwgMTcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0Rpc2FibGVUYWlsQ2FsbHM7CSAvLyAiZGlzYWJsZV90YWlsX2NhbGxzIgorICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJudW1fZXh0ZW5zaWJpbGl0eSIsIDE3KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9FbnVtRXh0ZW5zaWJpbGl0eTsJIC8vICJlbnVtX2V4dGVuc2liaWxpdHkiCisgICAgY2FzZSAnaSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImJvdXRsZXRjb2xsZWN0aW9uIiwgMTcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0lCT3V0bGV0Q29sbGVjdGlvbjsJIC8vICJpYm91dGxldGNvbGxlY3Rpb24iCisgICAgY2FzZSAnbic6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJvX3Nhbml0aXplXyIsIDExKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVsxMl0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnbSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxMywgImVtb3J5IiwgNSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vU2FuaXRpemVTcGVjaWZpYzsJIC8vICJub19zYW5pdGl6ZV9tZW1vcnkiCisgICAgICBjYXNlICd0JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEzLCAiaHJlYWQiLCA1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTm9TYW5pdGl6ZVNwZWNpZmljOwkgLy8gIm5vX3Nhbml0aXplX3RocmVhZCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ28nOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImpjX21ldGhvZF9mYW1pbHkiLCAxNikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNNZXRob2RGYW1pbHk7CSAvLyAib2JqY19tZXRob2RfZmFtaWx5IgorICAgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiZW5jbF91bnJvbGxfaGludCIsIDE2KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT3BlbkNMVW5yb2xsSGludDsJIC8vICJvcGVuY2xfdW5yb2xsX2hpbnQiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdyJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZWxlYXNlX2NhcGFiaWxpdHkiLCAxNykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfUmVsZWFzZUNhcGFiaWxpdHk7CSAvLyAicmVsZWFzZV9jYXBhYmlsaXR5IgorICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ3aWZ0X2Vycm9yX3Jlc3VsdCIsIDE3KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Td2lmdEVycm9yUmVzdWx0OwkgLy8gInN3aWZ0X2Vycm9yX3Jlc3VsdCIKKyAgICBjYXNlICd3JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiYXJuX3VudXNlZF9yZXN1bHQiLCAxNykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfV2FyblVudXNlZFJlc3VsdDsJIC8vICJ3YXJuX3VudXNlZF9yZXN1bHQiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDE5OgkgLy8gMTAgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibWRncHVfd2F2ZXNfcGVyX2V1IiwgMTgpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FNREdQVVdhdmVzUGVyRVU7CSAvLyAiYW1kZ3B1X3dhdmVzX3Blcl9ldSIKKyAgICBjYXNlICdjJzoJIC8vIDMgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImZfIiwgMikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbM10pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs0LCAidWRpdGVkX3RyYW5zZmVyIiwgMTUpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9DRkF1ZGl0ZWRUcmFuc2ZlcjsJIC8vICJjZl9hdWRpdGVkX3RyYW5zZmVyIgorICAgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs0LCAiZXR1cm5zX3JldGFpbmVkIiwgMTUpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9DRlJldHVybnNSZXRhaW5lZDsJIC8vICJjZl9yZXR1cm5zX3JldGFpbmVkIgorICAgICAgY2FzZSAndSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs0LCAibmtub3duX3RyYW5zZmVyIiwgMTUpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9DRlVua25vd25UcmFuc2ZlcjsJIC8vICJjZl91bmtub3duX3RyYW5zZmVyIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnbic6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnbyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiX3Nhbml0aXplX2FkZHJlc3MiLCAxNykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vU2FuaXRpemVTcGVjaWZpYzsJIC8vICJub19zYW5pdGl6ZV9hZGRyZXNzIgorICAgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAiX3JldHVybnNfcmV0YWluZWQiLCAxNykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05TUmV0dXJuc1JldGFpbmVkOwkgLy8gIm5zX3JldHVybnNfcmV0YWluZWQiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdvJzoJIC8vIDMgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImJqY18iLCA0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVs1XSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdiJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAicmlkZ2VfIiwgNikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgc3dpdGNoIChOYW1lWzEyXSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSAnbSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEzLCAidXRhYmxlIiwgNikgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDQnJpZGdlTXV0YWJsZTsJIC8vICJvYmpjX2JyaWRnZV9tdXRhYmxlIgorICAgICAgICBjYXNlICdyJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTMsICJlbGF0ZWQiLCA2KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNCcmlkZ2VSZWxhdGVkOwkgLy8gIm9iamNfYnJpZGdlX3JlbGF0ZWQiCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdyJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzYsICJlcXVpcmVzX3N1cGVyIiwgMTMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDUmVxdWlyZXNTdXBlcjsJIC8vICJvYmpjX3JlcXVpcmVzX3N1cGVyIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImVxdWlyZXNfY2FwYWJpbGl0eSIsIDE4KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9SZXF1aXJlc0NhcGFiaWxpdHk7CSAvLyAicmVxdWlyZXNfY2FwYWJpbGl0eSIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjA6CSAvLyA1IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnbic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImVvbl9wb2x5dmVjdG9yX3R5cGUiLCAxOSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTmVvblBvbHlWZWN0b3JUeXBlOwkgLy8gIm5lb25fcG9seXZlY3Rvcl90eXBlIgorICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJiamNfcnVudGltZV92aXNpYmxlIiwgMTkpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNSdW50aW1lVmlzaWJsZTsJIC8vICJvYmpjX3J1bnRpbWVfdmlzaWJsZSIKKyAgICBjYXNlICdyJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZXFkX3dvcmtfZ3JvdXBfc2l6ZSIsIDE5KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9SZXFkV29ya0dyb3VwU2l6ZTsJIC8vICJyZXFkX3dvcmtfZ3JvdXBfc2l6ZSIKKyAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiaGFyZWRfbG9ja19mdW5jdGlvbiIsIDE5KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9BY3F1aXJlQ2FwYWJpbGl0eTsJIC8vICJzaGFyZWRfbG9ja19mdW5jdGlvbiIKKyAgICBjYXNlICd3JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAib3JrX2dyb3VwX3NpemVfaGludCIsIDE5KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Xb3JrR3JvdXBTaXplSGludDsJIC8vICJ3b3JrX2dyb3VwX3NpemVfaGludCIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjE6CSAvLyA4IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInNzZXJ0X2V4Y2x1c2l2ZV9sb2NrIiwgMjApICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0Fzc2VydEV4Y2x1c2l2ZUxvY2s7CSAvLyAiYXNzZXJ0X2V4Y2x1c2l2ZV9sb2NrIgorICAgIGNhc2UgJ2wnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ0b192aXNpYmlsaXR5X3B1YmxpYyIsIDIwKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9MVE9WaXNpYmlsaXR5UHVibGljOwkgLy8gImx0b192aXNpYmlsaXR5X3B1YmxpYyIKKyAgICBjYXNlICdvJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiYmpjX3ByZWNpc2VfbGlmZXRpbWUiLCAyMCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT2JqQ1ByZWNpc2VMaWZldGltZTsJIC8vICJvYmpjX3ByZWNpc2VfbGlmZXRpbWUiCisgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm9pbnRlcl93aXRoX3R5cGVfdGFnIiwgMjApICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FyZ3VtZW50V2l0aFR5cGVUYWc7CSAvLyAicG9pbnRlcl93aXRoX3R5cGVfdGFnIgorICAgIGNhc2UgJ3MnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzFdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2gnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImFyZWRfbG9ja3NfcmVxdWlyZWQiLCAxOSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1JlcXVpcmVzQ2FwYWJpbGl0eTsJIC8vICJzaGFyZWRfbG9ja3NfcmVxdWlyZWQiCisgICAgICBjYXNlICd3JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJpZnRfaW5kaXJlY3RfcmVzdWx0IiwgMTkpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Td2lmdEluZGlyZWN0UmVzdWx0OwkgLy8gInN3aWZ0X2luZGlyZWN0X3Jlc3VsdCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ5cGVfdGFnX2Zvcl9kYXRhdHlwZSIsIDIwKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9UeXBlVGFnRm9yRGF0YXR5cGU7CSAvLyAidHlwZV90YWdfZm9yX2RhdGF0eXBlIgorICAgIGNhc2UgJ3gnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJyYXlfbmV2ZXJfaW5zdHJ1bWVudCIsIDIwKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9YUmF5SW5zdHJ1bWVudDsJIC8vICJ4cmF5X25ldmVyX2luc3RydW1lbnQiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDIyOgkgLy8gNiBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJyZ3VtZW50X3dpdGhfdHlwZV90YWciLCAyMSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQXJndW1lbnRXaXRoVHlwZVRhZzsJIC8vICJhcmd1bWVudF93aXRoX3R5cGVfdGFnIgorICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ4dGVybmFsX3NvdXJjZV9zeW1ib2wiLCAyMSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRXh0ZXJuYWxTb3VyY2VTeW1ib2w7CSAvLyAiZXh0ZXJuYWxfc291cmNlX3N5bWJvbCIKKyAgICBjYXNlICduJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAib19pbnN0cnVtZW50X2Z1bmN0aW9uIiwgMjEpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vSW5zdHJ1bWVudEZ1bmN0aW9uOwkgLy8gIm5vX2luc3RydW1lbnRfZnVuY3Rpb24iCisgICAgY2FzZSAnbyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImJqY19pbmRlcGVuZGVudF9jbGFzcyIsIDIxKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDSW5kZXBlbmRlbnRDbGFzczsJIC8vICJvYmpjX2luZGVwZW5kZW50X2NsYXNzIgorICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJyeV9hY3F1aXJlX2NhcGFiaWxpdHkiLCAyMSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfVHJ5QWNxdWlyZUNhcGFiaWxpdHk7CSAvLyAidHJ5X2FjcXVpcmVfY2FwYWJpbGl0eSIKKyAgICBjYXNlICd4JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAicmF5X2Fsd2F5c19pbnN0cnVtZW50IiwgMjEpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1hSYXlJbnN0cnVtZW50OwkgLy8gInhyYXlfYWx3YXlzX2luc3RydW1lbnQiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDIzOgkgLy8gNiBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJmX3JldHVybnNfbm90X3JldGFpbmVkIiwgMjIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NGUmV0dXJuc05vdFJldGFpbmVkOwkgLy8gImNmX3JldHVybnNfbm90X3JldGFpbmVkIgorICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJ4Y2x1c2l2ZV9sb2NrX2Z1bmN0aW9uIiwgMjIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FjcXVpcmVDYXBhYmlsaXR5OwkgLy8gImV4Y2x1c2l2ZV9sb2NrX2Z1bmN0aW9uIgorICAgIGNhc2UgJ2YnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJvcmNlX2FsaWduX2FyZ19wb2ludGVyIiwgMjIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1g4NkZvcmNlQWxpZ25BcmdQb2ludGVyOwkgLy8gImZvcmNlX2FsaWduX2FyZ19wb2ludGVyIgorICAgIGNhc2UgJ24nOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAic19yZXR1cm5zXyIsIDEwKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVsxMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxMiwgInV0b3JlbGVhc2VkIiwgMTEpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9OU1JldHVybnNBdXRvcmVsZWFzZWQ7CSAvLyAibnNfcmV0dXJuc19hdXRvcmVsZWFzZWQiCisgICAgICBjYXNlICduJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEyLCAib3RfcmV0YWluZWQiLCAxMSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05TUmV0dXJuc05vdFJldGFpbmVkOwkgLy8gIm5zX3JldHVybnNfbm90X3JldGFpbmVkIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImhhcmVkX3RyeWxvY2tfZnVuY3Rpb24iLCAyMikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU2hhcmVkVHJ5bG9ja0Z1bmN0aW9uOwkgLy8gInNoYXJlZF90cnlsb2NrX2Z1bmN0aW9uIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAyNDoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAic3NlcnRfc2hhcmVkX2NhcGFiaWxpdHkiLCAyMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQXNzZXJ0Q2FwYWJpbGl0eTsJIC8vICJhc3NlcnRfc2hhcmVkX2NhcGFiaWxpdHkiCisgICAgY2FzZSAnZSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInhjbHVzaXZlX2xvY2tzX3JlcXVpcmVkIiwgMjMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1JlcXVpcmVzQ2FwYWJpbGl0eTsJIC8vICJleGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDI1OgkgLy8gNSBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkiLCAyNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQWNxdWlyZUNhcGFiaWxpdHk7CSAvLyAiYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSIKKyAgICBjYXNlICdpJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibnRlbF9yZXFkX3N1Yl9ncm91cF9zaXplIiwgMjQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09wZW5DTEludGVsUmVxZFN1Ykdyb3VwU2l6ZTsJIC8vICJpbnRlbF9yZXFkX3N1Yl9ncm91cF9zaXplIgorICAgIGNhc2UgJ24nOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAib18iLCAyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVszXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdjJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzQsICJhbGxlcl9zYXZlZF9yZWdpc3RlcnMiLCAyMSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FueVg4Nk5vQ2FsbGVyU2F2ZWRSZWdpc3RlcnM7CSAvLyAibm9fY2FsbGVyX3NhdmVkX3JlZ2lzdGVycyIKKyAgICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNCwgImhyZWFkX3NhZmV0eV9hbmFseXNpcyIsIDIxKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTm9UaHJlYWRTYWZldHlBbmFseXNpczsJIC8vICJub190aHJlYWRfc2FmZXR5X2FuYWx5c2lzIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImVsZWFzZV9zaGFyZWRfY2FwYWJpbGl0eSIsIDI0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9SZWxlYXNlQ2FwYWJpbGl0eTsJIC8vICJyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5IgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAyNjoJIC8vIDYgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdjJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAib25zdW1hYmxlX2F1dG9fY2FzdF9zdGF0ZSIsIDI1KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Db25zdW1hYmxlQXV0b0Nhc3Q7CSAvLyAiY29uc3VtYWJsZV9hdXRvX2Nhc3Rfc3RhdGUiCisgICAgY2FzZSAnZSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgInhjbHVzaXZlX3RyeWxvY2tfZnVuY3Rpb24iLCAyNSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uOwkgLy8gImV4Y2x1c2l2ZV90cnlsb2NrX2Z1bmN0aW9uIgorICAgIGNhc2UgJ24nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJvX2FkZHJlc3Nfc2FmZXR5X2FuYWx5c2lzIiwgMjUpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vU2FuaXRpemVTcGVjaWZpYzsJIC8vICJub19hZGRyZXNzX3NhZmV0eV9hbmFseXNpcyIKKyAgICBjYXNlICdvJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiYmpjX3JldHVybnNfaW5uZXJfcG9pbnRlciIsIDI1KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDUmV0dXJuc0lubmVyUG9pbnRlcjsJIC8vICJvYmpjX3JldHVybnNfaW5uZXJfcG9pbnRlciIKKyAgICBjYXNlICdyJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChOYW1lWzFdICE9ICdlJykKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbMl0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnbCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAiZWFzZV9nZW5lcmljX2NhcGFiaWxpdHkiLCAyMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1JlbGVhc2VDYXBhYmlsaXR5OwkgLy8gInJlbGVhc2VfZ2VuZXJpY19jYXBhYmlsaXR5IgorICAgICAgY2FzZSAncSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAidWlyZXNfc2hhcmVkX2NhcGFiaWxpdHkiLCAyMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1JlcXVpcmVzQ2FwYWJpbGl0eTsJIC8vICJyZXF1aXJlc19zaGFyZWRfY2FwYWJpbGl0eSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAyNzoJIC8vIDUgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibWRncHVfZmxhdF93b3JrX2dyb3VwX3NpemUiLCAyNikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQU1ER1BVRmxhdFdvcmtHcm91cFNpemU7CSAvLyAiYW1kZ3B1X2ZsYXRfd29ya19ncm91cF9zaXplIgorICAgIGNhc2UgJ2QnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZXZpY2VfYnVpbHRpbl8iLCAxNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbMTVdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTYsICJ1cmZhY2VfdHlwZSIsIDExKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6SWdub3JlZEF0dHJpYnV0ZTsJIC8vICJkZXZpY2VfYnVpbHRpbl9zdXJmYWNlX3R5cGUiCisgICAgICBjYXNlICd0JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzE2LCAiZXh0dXJlX3R5cGUiLCAxMSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6Oklnbm9yZWRBdHRyaWJ1dGU7CSAvLyAiZGV2aWNlX2J1aWx0aW5fdGV4dHVyZV90eXBlIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnbyc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJiamNfIiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbNV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnZCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAiZXNpZ25hdGVkX2luaXRpYWxpemVyIiwgMjEpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDRGVzaWduYXRlZEluaXRpYWxpemVyOwkgLy8gIm9iamNfZGVzaWduYXRlZF9pbml0aWFsaXplciIKKyAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNiwgInViY2xhc3NpbmdfcmVzdHJpY3RlZCIsIDIxKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT2JqQ1N1YmNsYXNzaW5nUmVzdHJpY3RlZDsJIC8vICJvYmpjX3N1YmNsYXNzaW5nX3Jlc3RyaWN0ZWQiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjg6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjb25zdW1hYmxlX3NldF9zdGF0ZV9vbl9yZWFkIiwgMjgpICE9IDApCisgICAgICBicmVhazsKKyAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQ29uc3VtYWJsZVNldE9uUmVhZDsJIC8vICJjb25zdW1hYmxlX3NldF9zdGF0ZV9vbl9yZWFkIgorICBjYXNlIDI5OgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSswLCAidHJ5X2FjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkiLCAyOSkgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9UcnlBY3F1aXJlQ2FwYWJpbGl0eTsJIC8vICJ0cnlfYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSIKKyAgY2FzZSAzMToJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgInJlcXVpcmVfY29uc3RhbnRfaW5pdGlhbGl6YXRpb24iLCAzMSkgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9SZXF1aXJlQ29uc3RhbnRJbml0OwkgLy8gInJlcXVpcmVfY29uc3RhbnRfaW5pdGlhbGl6YXRpb24iCisgIGNhc2UgMzQ6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJvYmpjX3JlcXVpcmVzX3Byb3BlcnR5X2RlZmluaXRpb25zIiwgMzQpICE9IDApCisgICAgICBicmVhazsKKyAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzOwkgLy8gIm9iamNfcmVxdWlyZXNfcHJvcGVydHlfZGVmaW5pdGlvbnMiCisgIGNhc2UgMzU6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJvYmpjX2FyY193ZWFrX3JlZmVyZW5jZV91bmF2YWlsYWJsZSIsIDM1KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FyY1dlYWtyZWZVbmF2YWlsYWJsZTsJIC8vICJvYmpjX2FyY193ZWFrX3JlZmVyZW5jZV91bmF2YWlsYWJsZSIKKyAgY2FzZSA0NjoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgIm9iamNfcHJvdG9jb2xfcmVxdWlyZXNfZXhwbGljaXRfaW1wbGVtZW50YXRpb24iLCA0NikgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDRXhwbGljaXRQcm90b2NvbEltcGw7CSAvLyAib2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbiIKKyAgfQorICB9IGVsc2UgaWYgKEF0dHJpYnV0ZUxpc3Q6OkFTX0RlY2xzcGVjID09IFN5bnRheCkgeworICBzd2l0Y2ggKE5hbWUuc2l6ZSgpKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIDQ6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJ1dWlkIiwgNCkgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9VdWlkOwkgLy8gInV1aWQiCisgIGNhc2UgNToJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibGlnbiIsIDQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FsaWduZWQ7CSAvLyAiYWxpZ24iCisgICAgY2FzZSAnbic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImFrZWQiLCA0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9OYWtlZDsJIC8vICJuYWtlZCIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgNjoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgInRocmVhZCIsIDYpICE9IDApCisgICAgICBicmVhazsKKyAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfVGhyZWFkOwkgLy8gInRocmVhZCIKKyAgY2FzZSA3OgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgIm5vIiwgMikgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHN3aXRjaCAoTmFtZVsyXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJsaWFzIiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTm9BbGlhczsJIC8vICJub2FsaWFzIgorICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJocm93IiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTm9UaHJvdzsJIC8vICJub3Rocm93IgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA4OgkgLy8gNyBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ18nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJfaG9zdF9fIiwgNykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQ1VEQUhvc3Q7CSAvLyAiX19ob3N0X18iCisgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImxsb2NhdGUiLCA3KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9TZWN0aW9uOwkgLy8gImFsbG9jYXRlIgorICAgIGNhc2UgJ24nOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKE5hbWVbMV0gIT0gJ28nKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVsyXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdpJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJubGluZSIsIDUpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Ob0lubGluZTsJIC8vICJub2lubGluZSIKKyAgICAgIGNhc2UgJ3InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgImV0dXJuIiwgNSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vUmV0dXJuOwkgLy8gIm5vcmV0dXJuIgorICAgICAgY2FzZSAndic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAidGFibGUiLCA1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTVNOb1ZUYWJsZTsJIC8vICJub3Z0YWJsZSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJyb3BlcnR5IiwgNykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6SWdub3JlZEF0dHJpYnV0ZTsJIC8vICJwcm9wZXJ0eSIKKyAgICBjYXNlICdyJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZXN0cmljdCIsIDcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1Jlc3RyaWN0OwkgLy8gInJlc3RyaWN0IgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA5OgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2QnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibGwiLCAyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVszXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdlJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzQsICJ4cG9ydCIsIDUpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9ETExFeHBvcnQ7CSAvLyAiZGxsZXhwb3J0IgorICAgICAgY2FzZSAnaSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs0LCAibXBvcnQiLCA1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRExMSW1wb3J0OwkgLy8gImRsbGltcG9ydCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJlbGVjdGFueSIsIDgpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1NlbGVjdEFueTsJIC8vICJzZWxlY3RhbnkiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDEwOgkgLy8gNCBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ18nOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKE5hbWVbMV0gIT0gJ18nKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVsyXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdkJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJldmljZV9fIiwgNykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NVREFEZXZpY2U7CSAvLyAiX19kZXZpY2VfXyIKKyAgICAgIGNhc2UgJ2cnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgImxvYmFsX18iLCA3KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQ1VEQUdsb2JhbDsJIC8vICJfX2dsb2JhbF9fIgorICAgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAiaGFyZWRfXyIsIDcpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9DVURBU2hhcmVkOwkgLy8gIl9fc2hhcmVkX18iCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdkJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZXByZWNhdGVkIiwgOSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRGVwcmVjYXRlZDsJIC8vICJkZXByZWNhdGVkIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAxMToJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgImVtcHR5X2Jhc2VzIiwgMTEpICE9IDApCisgICAgICBicmVhazsKKyAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRW1wdHlCYXNlczsJIC8vICJlbXB0eV9iYXNlcyIKKyAgY2FzZSAxMjoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgIl9fY29uc3RhbnRfXyIsIDEyKSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NVREFDb25zdGFudDsJIC8vICJfX2NvbnN0YW50X18iCisgIGNhc2UgMTQ6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJsYXlvdXRfdmVyc2lvbiIsIDE0KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0xheW91dFZlcnNpb247CSAvLyAibGF5b3V0X3ZlcnNpb24iCisgIGNhc2UgMTc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJfX2xhdW5jaF9ib3VuZHNfXyIsIDE3KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NVREFMYXVuY2hCb3VuZHM7CSAvLyAiX19sYXVuY2hfYm91bmRzX18iCisgIGNhc2UgMTg6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSswLCAiX18iLCAyKSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgc3dpdGNoIChOYW1lWzJdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgInVkYXJ0X2J1aWx0aW5fXyIsIDE1KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpJZ25vcmVkQXR0cmlidXRlOwkgLy8gIl9fY3VkYXJ0X2J1aWx0aW5fXyIKKyAgICBjYXNlICdkJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAiZXZpY2VfYnVpbHRpbl9fIiwgMTUpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6Oklnbm9yZWRBdHRyaWJ1dGU7CSAvLyAiX19kZXZpY2VfYnVpbHRpbl9fIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAzMToJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJfX2RldmljZV9idWlsdGluXyIsIDE3KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgc3dpdGNoIChOYW1lWzE3XSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzE4LCAidXJmYWNlX3R5cGVfXyIsIDEzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpJZ25vcmVkQXR0cmlidXRlOwkgLy8gIl9fZGV2aWNlX2J1aWx0aW5fc3VyZmFjZV90eXBlX18iCisgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTgsICJleHR1cmVfdHlwZV9fIiwgMTMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6Oklnbm9yZWRBdHRyaWJ1dGU7CSAvLyAiX19kZXZpY2VfYnVpbHRpbl90ZXh0dXJlX3R5cGVfXyIKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgfSBlbHNlIGlmIChBdHRyaWJ1dGVMaXN0OjpBU19NaWNyb3NvZnQgPT0gU3ludGF4KSB7CisgIHN3aXRjaCAoTmFtZS5zaXplKCkpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgNDoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgInV1aWQiLCA0KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1V1aWQ7CSAvLyAidXVpZCIKKyAgfQorICB9IGVsc2UgaWYgKEF0dHJpYnV0ZUxpc3Q6OkFTX0NYWDExID09IFN5bnRheCkgeworICBzd2l0Y2ggKE5hbWUuc2l6ZSgpKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIDg6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSswLCAiZ251OjoiLCA1KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgc3dpdGNoIChOYW1lWzVdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnZic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNiwgImFyIiwgMikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTWlwc0xvbmdDYWxsOwkgLy8gImdudTo6ZmFyIgorICAgIGNhc2UgJ2gnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzYsICJvdCIsIDIpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0hvdDsJIC8vICJnbnU6OmhvdCIKKyAgICBjYXNlICdwJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAiY3MiLCAyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9QY3M7CSAvLyAiZ251OjpwY3MiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDk6CSAvLyA2IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSswLCAiZ251OjoiLCA1KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgc3dpdGNoIChOYW1lWzVdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNiwgIm9sZCIsIDMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NvbGQ7CSAvLyAiZ251Ojpjb2xkIgorICAgIGNhc2UgJ20nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzYsICJvZGUiLCAzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Nb2RlOwkgLy8gImdudTo6bW9kZSIKKyAgICBjYXNlICduJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAiZWFyIiwgMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTWlwc1Nob3J0Q2FsbDsJIC8vICJnbnU6Om5lYXIiCisgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNiwgInVyZSIsIDMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1B1cmU7CSAvLyAiZ251OjpwdXJlIgorICAgIGNhc2UgJ3UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzYsICJzZWQiLCAzKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Vc2VkOwkgLy8gImdudTo6dXNlZCIKKyAgICBjYXNlICd3JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAiZWFrIiwgMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfV2VhazsJIC8vICJnbnU6OndlYWsiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDEwOgkgLy8gNiBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJzonOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICI6bm9yZXR1cm4iLCA5KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9DWFgxMU5vUmV0dXJuOwkgLy8gIjo6bm9yZXR1cm4iCisgICAgY2FzZSAnZyc6CSAvLyA1IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJudTo6IiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbNV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAibGlhcyIsIDQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9BbGlhczsJIC8vICJnbnU6OmFsaWFzIgorICAgICAgY2FzZSAnYyc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICAgIHN3aXRjaCAoTmFtZVs2XSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSAnZCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzcsICJlY2wiLCAzKSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NEZWNsOwkgLy8gImdudTo6Y2RlY2wiCisgICAgICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs3LCAibnN0IiwgMykgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Db25zdDsJIC8vICJnbnU6OmNvbnN0IgorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnaSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAiZnVuYyIsIDQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9JRnVuYzsJIC8vICJnbnU6OmlmdW5jIgorICAgICAgY2FzZSAnbic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAiYWtlZCIsIDQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9OYWtlZDsJIC8vICJnbnU6Om5ha2VkIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDExOgkgLy8gMTAgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICc6JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiOm5vZGlzY2FyZCIsIDEwKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9XYXJuVW51c2VkUmVzdWx0OwkgLy8gIjo6bm9kaXNjYXJkIgorICAgIGNhc2UgJ2cnOgkgLy8gOSBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibnU6OiIsIDQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgc3dpdGNoIChOYW1lWzVdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNiwgIm9tbW9uIiwgNSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NvbW1vbjsJIC8vICJnbnU6OmNvbW1vbiIKKyAgICAgIGNhc2UgJ2YnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNiwgIm9ybWF0IiwgNSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0Zvcm1hdDsJIC8vICJnbnU6OmZvcm1hdCIKKyAgICAgIGNhc2UgJ20nOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgICBzd2l0Y2ggKE5hbWVbNl0pIHsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs3LCAibGxvYyIsIDQpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfUmVzdHJpY3Q7CSAvLyAiZ251OjptYWxsb2MiCisgICAgICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs3LCAicHMxNiIsIDQpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTWlwczE2OwkgLy8gImdudTo6bWlwczE2IgorICAgICAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNywgIl9hYmkiLCA0KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX01TQUJJOwkgLy8gImdudTo6bXNfYWJpIgorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAiYWNrZWQiLCA1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfUGFja2VkOwkgLy8gImdudTo6cGFja2VkIgorICAgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAiaWduYWwiLCA1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQVZSU2lnbmFsOwkgLy8gImdudTo6c2lnbmFsIgorICAgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAiYXJnZXQiLCA1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfVGFyZ2V0OwkgLy8gImdudTo6dGFyZ2V0IgorICAgICAgY2FzZSAndSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAibnVzZWQiLCA1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfVW51c2VkOwkgLy8gImdudTo6dW51c2VkIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDEyOgkgLy8gMTQgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICc6JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiOmRlcHJlY2F0ZWQiLCAxMSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRGVwcmVjYXRlZDsJIC8vICI6OmRlcHJlY2F0ZWQiCisgICAgY2FzZSAnZyc6CSAvLyAxMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibnU6OiIsIDQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgc3dpdGNoIChOYW1lWzVdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ18nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNiwgIl9jb25zdCIsIDYpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Db25zdDsJIC8vICJnbnU6Ol9fY29uc3QiCisgICAgICBjYXNlICdhJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgc3dpdGNoIChOYW1lWzZdKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICBjYXNlICdiJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNywgImlfdGFnIiwgNSkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9BYmlUYWc7CSAvLyAiZ251OjphYmlfdGFnIgorICAgICAgICBjYXNlICdsJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNywgImlnbmVkIiwgNSkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9BbGlnbmVkOwkgLy8gImdudTo6YWxpZ25lZCIKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNiwgImxlYW51cCIsIDYpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9DbGVhbnVwOwkgLy8gImdudTo6Y2xlYW51cCIKKyAgICAgIGNhc2UgJ2YnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNiwgImxhdHRlbiIsIDYpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9GbGF0dGVuOwkgLy8gImdudTo6ZmxhdHRlbiIKKyAgICAgIGNhc2UgJ24nOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgICBpZiAoTmFtZVs2XSAhPSAnbycpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSAnZCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJlYnVnIiwgNCkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Ob0RlYnVnOwkgLy8gImdudTo6bm9kZWJ1ZyIKKyAgICAgICAgY2FzZSAnbic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJudWxsIiwgNCkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Ob25OdWxsOwkgLy8gImdudTo6bm9ubnVsbCIKKyAgICAgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJocm93IiwgNCkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Ob1Rocm93OwkgLy8gImdudTo6bm90aHJvdyIKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3InOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzYsICJlZyIsIDIpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN3aXRjaCAoTmFtZVs4XSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSAnYyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzksICJhbGwiLCAzKSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1JlZ0NhbGw7CSAvLyAiZ251OjpyZWdjYWxsIgorICAgICAgICBjYXNlICdwJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOSwgImFybSIsIDMpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfUmVncGFybTsJIC8vICJnbnU6OnJlZ3Bhcm0iCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdzJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgc3dpdGNoIChOYW1lWzZdKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICBjYXNlICdlJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNywgImN0aW9uIiwgNSkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9TZWN0aW9uOwkgLy8gImdudTo6c2VjdGlvbiIKKyAgICAgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzcsICJkY2FsbCIsIDUpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU3RkQ2FsbDsJIC8vICJnbnU6OnN0ZGNhbGwiCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICd3JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzYsICJlYWtyZWYiLCA2KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfV2Vha1JlZjsJIC8vICJnbnU6OndlYWtyZWYiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMTM6CSAvLyAxMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJzonOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICI6ZmFsbHRocm91Z2giLCAxMikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRmFsbFRocm91Z2g7CSAvLyAiOjpmYWxsdGhyb3VnaCIKKyAgICBjYXNlICdjJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImxhbmc6OiIsIDYpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgc3dpdGNoIChOYW1lWzddKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImxvY2tzIiwgNSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0Jsb2NrczsJIC8vICJjbGFuZzo6YmxvY2tzIgorICAgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAiYXNjYWwiLCA1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfUGFzY2FsOwkgLy8gImNsYW5nOjpwYXNjYWwiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdnJzoJIC8vIDkgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICduJzoJIC8vIDggc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAidTo6IiwgMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgc3dpdGNoIChOYW1lWzVdKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICBjYXNlICdmJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNiwgImFzdGNhbGwiLCA3KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0Zhc3RDYWxsOwkgLy8gImdudTo6ZmFzdGNhbGwiCisgICAgICAgIGNhc2UgJ24nOgkgLy8gNCBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChOYW1lWzZdICE9ICdvJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJvbW1vbiIsIDUpICE9IDApCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vQ29tbW9uOwkgLy8gImdudTo6bm9jb21tb24iCisgICAgICAgICAgY2FzZSAnaSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgIm5saW5lIiwgNSkgIT0gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTm9JbmxpbmU7CSAvLyAiZ251Ojpub2lubGluZSIKKyAgICAgICAgICBjYXNlICdtJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAiaXBzMTYiLCA1KSAhPSAwKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Ob01pcHMxNjsJIC8vICJnbnU6Om5vbWlwczE2IgorICAgICAgICAgIGNhc2UgJ3InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJldHVybiIsIDUpICE9IDApCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vUmV0dXJuOwkgLy8gImdudTo6bm9yZXR1cm4iCisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdzJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgICBzd2l0Y2ggKE5hbWVbNl0pIHsKKyAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICBjYXNlICdlJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs3LCAibnRpbmVsIiwgNikgIT0gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU2VudGluZWw7CSAvLyAiZ251OjpzZW50aW5lbCIKKyAgICAgICAgICBjYXNlICd5JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs3LCAic3ZfYWJpIiwgNikgIT0gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU3lzVkFCSTsJIC8vICJnbnU6OnN5c3ZfYWJpIgorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzYsICJoaXNjYWxsIiwgNykgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9UaGlzQ2FsbDsJIC8vICJnbnU6OnRoaXNjYWxsIgorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAibDo6c3VwcHJlc3MiLCAxMSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1N1cHByZXNzOwkgLy8gImdzbDo6c3VwcHJlc3MiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMTQ6CSAvLyAxMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJzonOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICI6bWF5YmVfdW51c2VkIiwgMTMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1VudXNlZDsJIC8vICI6Om1heWJlX3VudXNlZCIKKyAgICBjYXNlICdjJzoJIC8vIDMgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImxhbmc6OiIsIDYpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgc3dpdGNoIChOYW1lWzddKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ20nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImluc2l6ZSIsIDYpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9NaW5TaXplOwkgLy8gImNsYW5nOjptaW5zaXplIgorICAgICAgY2FzZSAnbyc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICAgIHN3aXRjaCAoTmFtZVs4XSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSAnYic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzksICJqY19nYyIsIDUpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT2JqQ0dDOwkgLy8gImNsYW5nOjpvYmpjX2djIgorICAgICAgICBjYXNlICdwJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOSwgInRub25lIiwgNSkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PcHRpbWl6ZU5vbmU7CSAvLyAiY2xhbmc6Om9wdG5vbmUiCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdnJzoJIC8vIDkgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm51OjoiLCA0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVs1XSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdkJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAibGwiLCAyKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBzd2l0Y2ggKE5hbWVbOF0pIHsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs5LCAieHBvcnQiLCA1KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0RMTEV4cG9ydDsJIC8vICJnbnU6OmRsbGV4cG9ydCIKKyAgICAgICAgY2FzZSAnaSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzksICJtcG9ydCIsIDUpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRExMSW1wb3J0OwkgLy8gImdudTo6ZGxsaW1wb3J0IgorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnaSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAibnRlcnJ1cHQiLCA4KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfSW50ZXJydXB0OwkgLy8gImdudTo6aW50ZXJydXB0IgorICAgICAgY2FzZSAnbCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAib25nX2NhbGwiLCA4KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTWlwc0xvbmdDYWxsOwkgLy8gImdudTo6bG9uZ19jYWxsIgorICAgICAgY2FzZSAnbSc6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICAgIHN3aXRjaCAoTmFtZVs2XSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzcsICJ5X2FsaWFzIiwgNykgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9NYXlBbGlhczsJIC8vICJnbnU6Om1heV9hbGlhcyIKKyAgICAgICAgY2FzZSAnaSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzcsICJjcm9taXBzIiwgNykgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9NaWNyb01pcHM7CSAvLyAiZ251OjptaWNyb21pcHMiCisgICAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs3LCAiX3N0cnVjdCIsIDcpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTVNTdHJ1Y3Q7CSAvLyAiZ251Ojptc19zdHJ1Y3QiCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzYsICJlbGVjdGFueSIsIDgpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9TZWxlY3RBbnk7CSAvLyAiZ251OjpzZWxlY3RhbnkiCisgICAgICBjYXNlICd0JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzYsICJsc19tb2RlbCIsIDgpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9UTFNNb2RlbDsJIC8vICJnbnU6OnRsc19tb2RlbCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAxNToJIC8vIDE0IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYyc6CSAvLyA1IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJsYW5nOjoiLCA2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdOJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJTT2JqZWN0IiwgNykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNOU09iamVjdDsJIC8vICJjbGFuZzo6TlNPYmplY3QiCisgICAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJubm90YXRlIiwgNykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0Fubm90YXRlOwkgLy8gImNsYW5nOjphbm5vdGF0ZSIKKyAgICAgIGNhc2UgJ2knOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgICBpZiAoTmFtZVs4XSAhPSAnYicpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN3aXRjaCAoTmFtZVs5XSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEwLCAiY3Rpb24iLCA1KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0lCQWN0aW9uOwkgLy8gImNsYW5nOjppYmFjdGlvbiIKKyAgICAgICAgY2FzZSAnbyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEwLCAidXRsZXQiLCA1KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0lCT3V0bGV0OwkgLy8gImNsYW5nOjppYm91dGxldCIKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ24nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgIm9lc2NhcGUiLCA3KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTm9Fc2NhcGU7CSAvLyAiY2xhbmc6Om5vZXNjYXBlIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnZyc6CSAvLyA5IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJudTo6IiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbNV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICAgIHN3aXRjaCAoTmFtZVs2XSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSAnbCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzcsICJsb2Nfc2l6ZSIsIDgpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQWxsb2NTaXplOwkgLy8gImdudTo6YWxsb2Nfc2l6ZSIKKyAgICAgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzcsICJ0aWZpY2lhbCIsIDgpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQXJ0aWZpY2lhbDsJIC8vICJnbnU6OmFydGlmaWNpYWwiCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdkJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgaWYgKE5hbWVbNl0gIT0gJ2UnKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBzd2l0Y2ggKE5hbWVbN10pIHsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAicmVjYXRlZCIsIDcpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRGVwcmVjYXRlZDsJIC8vICJnbnU6OmRlcHJlY2F0ZWQiCisgICAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAidHJ1Y3RvciIsIDcpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRGVzdHJ1Y3RvcjsJIC8vICJnbnU6OmRlc3RydWN0b3IiCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdmJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzYsICJvcm1hdF9hcmciLCA5KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRm9ybWF0QXJnOwkgLy8gImdudTo6Zm9ybWF0X2FyZyIKKyAgICAgIGNhc2UgJ2cnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNiwgIm51X2lubGluZSIsIDkpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9HTlVJbmxpbmU7CSAvLyAiZ251OjpnbnVfaW5saW5lIgorICAgICAgY2FzZSAnbic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAib2NmX2NoZWNrIiwgOSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FueVg4Nk5vQ2ZDaGVjazsJIC8vICJnbnU6Om5vY2ZfY2hlY2siCisgICAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzYsICJob3J0X2NhbGwiLCA5KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTWlwc1Nob3J0Q2FsbDsJIC8vICJnbnU6OnNob3J0X2NhbGwiCisgICAgICBjYXNlICd2JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzYsICJpc2liaWxpdHkiLCA5KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfVmlzaWJpbGl0eTsJIC8vICJnbnU6OnZpc2liaWxpdHkiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMTY6CSAvLyA4IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYyc6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJsYW5nOjoiLCA2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdmJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJsYWdfZW51bSIsIDgpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9GbGFnRW51bTsJIC8vICJjbGFuZzo6ZmxhZ19lbnVtIgorICAgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAid2lmdGNhbGwiLCA4KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU3dpZnRDYWxsOwkgLy8gImNsYW5nOjpzd2lmdGNhbGwiCisgICAgICBjYXNlICd2JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJlY3JldHVybiIsIDgpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9WZWNSZXR1cm47CSAvLyAiY2xhbmc6OnZlY3JldHVybiIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2cnOgkgLy8gNSBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibnU6OiIsIDQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgc3dpdGNoIChOYW1lWzVdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNiwgImxsb2NfYWxpZ24iLCAxMCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FsbG9jQWxpZ247CSAvLyAiZ251OjphbGxvY19hbGlnbiIKKyAgICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNiwgIm9uc3RydWN0b3IiLCAxMCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NvbnN0cnVjdG9yOwkgLy8gImdudTo6Y29uc3RydWN0b3IiCisgICAgICBjYXNlICduJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzYsICJvbWljcm9taXBzIiwgMTApICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Ob01pY3JvTWlwczsJIC8vICJnbnU6Om5vbWljcm9taXBzIgorICAgICAgY2FzZSAndic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAiZWN0b3Jfc2l6ZSIsIDEwKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfVmVjdG9yU2l6ZTsJIC8vICJnbnU6OnZlY3Rvcl9zaXplIgorICAgICAgY2FzZSAndyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAiYXJuX3VudXNlZCIsIDEwKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfV2FyblVudXNlZDsJIC8vICJnbnU6Ondhcm5fdW51c2VkIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDE3OgkgLy8gNCBzdHJpbmdzIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgImNsYW5nOjoiLCA3KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgc3dpdGNoIChOYW1lWzddKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYyc6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbOF0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs5LCAicGFiaWxpdHkiLCA4KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQ2FwYWJpbGl0eTsJIC8vICJjbGFuZzo6Y2FwYWJpbGl0eSIKKyAgICAgIGNhc2UgJ28nOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgICBpZiAoTmFtZVs5XSAhPSAnbicpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN3aXRjaCAoTmFtZVsxMF0pIHsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxMSwgInVtYWJsZSIsIDYpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQ29uc3VtYWJsZTsJIC8vICJjbGFuZzo6Y29uc3VtYWJsZSIKKyAgICAgICAgY2FzZSAndic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzExLCAiZXJnZW50IiwgNikgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Db252ZXJnZW50OwkgLy8gImNsYW5nOjpjb252ZXJnZW50IgorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAndic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImVjdG9yY2FsbCIsIDkpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1ZlY3RvckNhbGw7CSAvLyAiY2xhbmc6OnZlY3RvcmNhbGwiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDE4OgkgLy8gMTMgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdjJzoJIC8vIDEwIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJsYW5nOjoiLCA2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdjJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJmX2NvbnN1bWVkIiwgMTApICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9DRkNvbnN1bWVkOwkgLy8gImNsYW5nOjpjZl9jb25zdW1lZCIKKyAgICAgIGNhc2UgJ2YnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImFsbHRocm91Z2giLCAxMCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0ZhbGxUaHJvdWdoOwkgLy8gImNsYW5nOjpmYWxsdGhyb3VnaCIKKyAgICAgIGNhc2UgJ2cnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgInVhcmRlZF92YXIiLCAxMCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0d1YXJkZWRWYXI7CSAvLyAiY2xhbmc6Omd1YXJkZWRfdmFyIgorICAgICAgY2FzZSAnbic6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICAgIHN3aXRjaCAoTmFtZVs4XSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSAnbyc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICAgICAgc3dpdGNoIChOYW1lWzldKSB7CisgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICAgY2FzZSAnXyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTAsICJzYW5pdGl6ZSIsIDgpICE9IDApCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vU2FuaXRpemU7CSAvLyAiY2xhbmc6Om5vX3Nhbml0aXplIgorICAgICAgICAgIGNhc2UgJ2QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEwLCAidXBsaWNhdGUiLCA4KSAhPSAwKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Ob0R1cGxpY2F0ZTsJIC8vICJjbGFuZzo6bm9kdXBsaWNhdGUiCisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOSwgIl9jb25zdW1lZCIsIDkpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTlNDb25zdW1lZDsJIC8vICJjbGFuZzo6bnNfY29uc3VtZWQiCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdvJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJiamNfYnJpZGdlIiwgMTApICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDQnJpZGdlOwkgLy8gImNsYW5nOjpvYmpjX2JyaWRnZSIKKyAgICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgInJpdmlhbF9hYmkiLCAxMCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1RyaXZpYWxBQkk7CSAvLyAiY2xhbmc6OnRyaXZpYWxfYWJpIgorICAgICAgY2FzZSAndSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAibmF2YWlsYWJsZSIsIDEwKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfVW5hdmFpbGFibGU7CSAvLyAiY2xhbmc6OnVuYXZhaWxhYmxlIgorICAgICAgY2FzZSAndyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAiZWFrX2ltcG9ydCIsIDEwKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfV2Vha0ltcG9ydDsJIC8vICJjbGFuZzo6d2Vha19pbXBvcnQiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdnJzoJIC8vIDMgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm51OjoiLCA0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVs1XSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzYsICJsd2F5c19pbmxpbmUiLCAxMikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0Fsd2F5c0lubGluZTsJIC8vICJnbnU6OmFsd2F5c19pbmxpbmUiCisgICAgICBjYXNlICdpJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzYsICJuaXRfcHJpb3JpdHkiLCAxMikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0luaXRQcmlvcml0eTsJIC8vICJnbnU6OmluaXRfcHJpb3JpdHkiCisgICAgICBjYXNlICdyJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzYsICJldHVybnNfdHdpY2UiLCAxMikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1JldHVybnNUd2ljZTsJIC8vICJnbnU6OnJldHVybnNfdHdpY2UiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMTk6CSAvLyA2IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYyc6CSAvLyA0IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJsYW5nOjoiLCA2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJ2YWlsYWJpbGl0eSIsIDExKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQXZhaWxhYmlsaXR5OwkgLy8gImNsYW5nOjphdmFpbGFiaWxpdHkiCisgICAgICBjYXNlICdvJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgc3dpdGNoIChOYW1lWzhdKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICBjYXNlICdiJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOSwgImpjX2JveGFibGUiLCAxMCkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDQm94YWJsZTsJIC8vICJjbGFuZzo6b2JqY19ib3hhYmxlIgorICAgICAgICBjYXNlICd2JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOSwgImVybG9hZGFibGUiLCAxMCkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PdmVybG9hZGFibGU7CSAvLyAiY2xhbmc6Om92ZXJsb2FkYWJsZSIKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgInJlc2VydmVfYWxsIiwgMTEpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9QcmVzZXJ2ZUFsbDsJIC8vICJjbGFuZzo6cHJlc2VydmVfYWxsIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnZyc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJudTo6IiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbNV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAic3N1bWVfYWxpZ25lZCIsIDEzKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQXNzdW1lQWxpZ25lZDsJIC8vICJnbnU6OmFzc3VtZV9hbGlnbmVkIgorICAgICAgY2FzZSAnbic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAib19zcGxpdF9zdGFjayIsIDEzKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTm9TcGxpdFN0YWNrOwkgLy8gImdudTo6bm9fc3BsaXRfc3RhY2siCisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjA6CSAvLyA4IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnOic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIjpjYXJyaWVzX2RlcGVuZGVuY3kiLCAxOSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQ2Fycmllc0RlcGVuZGVuY3k7CSAvLyAiOjpjYXJyaWVzX2RlcGVuZGVuY3kiCisgICAgY2FzZSAnYyc6CSAvLyA2IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJsYW5nOjoiLCA2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJkZHJlc3Nfc3BhY2UiLCAxMikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FkZHJlc3NTcGFjZTsJIC8vICJjbGFuZzo6YWRkcmVzc19zcGFjZSIKKyAgICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImFsbGFibGVfd2hlbiIsIDEyKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQ2FsbGFibGVXaGVuOwkgLy8gImNsYW5nOjpjYWxsYWJsZV93aGVuIgorICAgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAicmVzZXJ2ZV9tb3N0IiwgMTIpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9QcmVzZXJ2ZU1vc3Q7CSAvLyAiY2xhbmc6OnByZXNlcnZlX21vc3QiCisgICAgICBjYXNlICdzJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgc3dpdGNoIChOYW1lWzhdKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICBjYXNlICdlJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOSwgInRfdHlwZXN0YXRlIiwgMTEpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU2V0VHlwZXN0YXRlOwkgLy8gImNsYW5nOjpzZXRfdHlwZXN0YXRlIgorICAgICAgICBjYXNlICd3JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOSwgImlmdF9jb250ZXh0IiwgMTEpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU3dpZnRDb250ZXh0OwkgLy8gImNsYW5nOjpzd2lmdF9jb250ZXh0IgorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAneCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAicmF5X2xvZ19hcmdzIiwgMTIpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9YUmF5TG9nQXJnczsJIC8vICJjbGFuZzo6eHJheV9sb2dfYXJncyIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2cnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJudTo6cmV0dXJuc19ub25udWxsIiwgMTkpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1JldHVybnNOb25OdWxsOwkgLy8gImdudTo6cmV0dXJuc19ub25udWxsIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAyMToJIC8vIDUgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6IiwgNykgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJudGVsX29jbF9iaWNjIiwgMTMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0ludGVsT2NsQmljYzsJIC8vICJjbGFuZzo6aW50ZWxfb2NsX2JpY2MiCisgICAgY2FzZSAnbyc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJiamNfIiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbMTJdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTMsICJ4Y2VwdGlvbiIsIDgpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDRXhjZXB0aW9uOwkgLy8gImNsYW5nOjpvYmpjX2V4Y2VwdGlvbiIKKyAgICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTMsICJ3bmVyc2hpcCIsIDgpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDT3duZXJzaGlwOwkgLy8gImNsYW5nOjpvYmpjX293bmVyc2hpcCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJ0X2d1YXJkZWRfdmFyIiwgMTMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1B0R3VhcmRlZFZhcjsJIC8vICJjbGFuZzo6cHRfZ3VhcmRlZF92YXIiCisgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImVzdF90eXBlc3RhdGUiLCAxMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfVGVzdFR5cGVzdGF0ZTsJIC8vICJjbGFuZzo6dGVzdF90eXBlc3RhdGUiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDIyOgkgLy8gMTEgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdjJzoJIC8vIDEwIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJsYW5nOjoiLCA2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdhJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAibWRncHVfbnVtXyIsIDEwKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBzd2l0Y2ggKE5hbWVbMThdKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTksICJncHIiLCAzKSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FNREdQVU51bVNHUFI7CSAvLyAiY2xhbmc6OmFtZGdwdV9udW1fc2dwciIKKyAgICAgICAgY2FzZSAndic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzE5LCAiZ3ByIiwgMykgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9BTURHUFVOdW1WR1BSOwkgLy8gImNsYW5nOjphbWRncHVfbnVtX3ZncHIiCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICduJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJvdF90YWlsX2NhbGxlZCIsIDE0KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTm90VGFpbENhbGxlZDsJIC8vICJjbGFuZzo6bm90X3RhaWxfY2FsbGVkIgorICAgICAgY2FzZSAnbyc6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICAgIHN3aXRjaCAoTmFtZVs4XSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSAnYic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzksICJqY19yb290X2NsYXNzIiwgMTMpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT2JqQ1Jvb3RDbGFzczsJIC8vICJjbGFuZzo6b2JqY19yb290X2NsYXNzIgorICAgICAgICBjYXNlICd3JzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzksICJuZXJzaGlwXyIsIDgpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBzd2l0Y2ggKE5hbWVbMTddKSB7CisgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICAgY2FzZSAnaCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTgsICJvbGRzIiwgNCkgIT0gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT3duZXJzaGlwOwkgLy8gImNsYW5nOjpvd25lcnNoaXBfaG9sZHMiCisgICAgICAgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTgsICJha2VzIiwgNCkgIT0gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT3duZXJzaGlwOwkgLy8gImNsYW5nOjpvd25lcnNoaXBfdGFrZXMiCisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAiYXJhbV90eXBlc3RhdGUiLCAxNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1BhcmFtVHlwZXN0YXRlOwkgLy8gImNsYW5nOjpwYXJhbV90eXBlc3RhdGUiCisgICAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJjb3BlZF9sb2NrYWJsZSIsIDE0KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU2NvcGVkTG9ja2FibGU7CSAvLyAiY2xhbmc6OnNjb3BlZF9sb2NrYWJsZSIKKyAgICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgInlwZV92aXNpYmlsaXR5IiwgMTQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9UeXBlVmlzaWJpbGl0eTsJIC8vICJjbGFuZzo6dHlwZV92aXNpYmlsaXR5IgorICAgICAgY2FzZSAndSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAibmxvY2tfZnVuY3Rpb24iLCAxNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1JlbGVhc2VDYXBhYmlsaXR5OwkgLy8gImNsYW5nOjp1bmxvY2tfZnVuY3Rpb24iCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdnJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibnU6OnRyYW5zcGFyZW50X3VuaW9uIiwgMjEpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1RyYW5zcGFyZW50VW5pb247CSAvLyAiZ251Ojp0cmFuc3BhcmVudF91bmlvbiIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjM6CSAvLyA3IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYyc6CSAvLyA1IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJsYW5nOjoiLCA2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdpJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJudGVybmFsX2xpbmthZ2UiLCAxNSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0ludGVybmFsTGlua2FnZTsJIC8vICJjbGFuZzo6aW50ZXJuYWxfbGlua2FnZSIKKyAgICAgIGNhc2UgJ24nOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgICBzd2l0Y2ggKE5hbWVbOF0pIHsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs5LCAib25fdmVjdG9yX3R5cGUiLCAxNCkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9OZW9uVmVjdG9yVHlwZTsJIC8vICJjbGFuZzo6bmVvbl92ZWN0b3JfdHlwZSIKKyAgICAgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzksICJfY29uc3VtZXNfc2VsZiIsIDE0KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05TQ29uc3VtZXNTZWxmOwkgLy8gImNsYW5nOjpuc19jb25zdW1lc19zZWxmIgorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAiYXNzX29iamVjdF9zaXplIiwgMTUpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9QYXNzT2JqZWN0U2l6ZTsJIC8vICJjbGFuZzo6cGFzc19vYmplY3Rfc2l6ZSIKKyAgICAgIGNhc2UgJ3InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImV0dXJuX3R5cGVzdGF0ZSIsIDE1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfUmV0dXJuVHlwZXN0YXRlOwkgLy8gImNsYW5nOjpyZXR1cm5fdHlwZXN0YXRlIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnZyc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJudTo6IiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbNV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnbic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs2LCAib19zYW5pdGl6ZV90aHJlYWQiLCAxNykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vU2FuaXRpemVTcGVjaWZpYzsJIC8vICJnbnU6Om5vX3Nhbml0aXplX3RocmVhZCIKKyAgICAgIGNhc2UgJ3cnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrNiwgImFybl91bnVzZWRfcmVzdWx0IiwgMTcpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9XYXJuVW51c2VkUmVzdWx0OwkgLy8gImdudTo6d2Fybl91bnVzZWRfcmVzdWx0IgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDI0OgkgLy8gNSBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2MnOgkgLy8gNCBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibGFuZzo6IiwgNikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbN10pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAic3NlcnRfY2FwYWJpbGl0eSIsIDE2KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQXNzZXJ0Q2FwYWJpbGl0eTsJIC8vICJjbGFuZzo6YXNzZXJ0X2NhcGFiaWxpdHkiCisgICAgICBjYXNlICdvJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgc3dpdGNoIChOYW1lWzhdKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICBjYXNlICdiJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOSwgImpjX3J1bnRpbWVfbmFtZSIsIDE1KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNSdW50aW1lTmFtZTsJIC8vICJjbGFuZzo6b2JqY19ydW50aW1lX25hbWUiCisgICAgICAgIGNhc2UgJ3cnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs5LCAibmVyc2hpcF9yZXR1cm5zIiwgMTUpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT3duZXJzaGlwOwkgLy8gImNsYW5nOjpvd25lcnNoaXBfcmV0dXJucyIKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImhhcmVkX2NhcGFiaWxpdHkiLCAxNikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NhcGFiaWxpdHk7CSAvLyAiY2xhbmc6OnNoYXJlZF9jYXBhYmlsaXR5IgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnZyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm51Ojpub19zYW5pdGl6ZV9hZGRyZXNzIiwgMjMpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vU2FuaXRpemVTcGVjaWZpYzsJIC8vICJnbnU6Om5vX3Nhbml0aXplX2FkZHJlc3MiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDI1OgkgLy8gOSBzdHJpbmdzIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgImNsYW5nOjoiLCA3KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgc3dpdGNoIChOYW1lWzddKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImNxdWlyZV9jYXBhYmlsaXR5IiwgMTcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FjcXVpcmVDYXBhYmlsaXR5OwkgLy8gImNsYW5nOjphY3F1aXJlX2NhcGFiaWxpdHkiCisgICAgY2FzZSAnZCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImlzYWJsZV90YWlsX2NhbGxzIiwgMTcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0Rpc2FibGVUYWlsQ2FsbHM7CSAvLyAiY2xhbmc6OmRpc2FibGVfdGFpbF9jYWxscyIKKyAgICBjYXNlICdlJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAibnVtX2V4dGVuc2liaWxpdHkiLCAxNykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRW51bUV4dGVuc2liaWxpdHk7CSAvLyAiY2xhbmc6OmVudW1fZXh0ZW5zaWJpbGl0eSIKKyAgICBjYXNlICdpJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAiYm91dGxldGNvbGxlY3Rpb24iLCAxNykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfSUJPdXRsZXRDb2xsZWN0aW9uOwkgLy8gImNsYW5nOjppYm91dGxldGNvbGxlY3Rpb24iCisgICAgY2FzZSAnbic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgIm9fc2FuaXRpemVfbWVtb3J5IiwgMTcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vU2FuaXRpemVTcGVjaWZpYzsJIC8vICJjbGFuZzo6bm9fc2FuaXRpemVfbWVtb3J5IgorICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJiamNfbWV0aG9kX2ZhbWlseSIsIDE3KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDTWV0aG9kRmFtaWx5OwkgLy8gImNsYW5nOjpvYmpjX21ldGhvZF9mYW1pbHkiCisgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImVsZWFzZV9jYXBhYmlsaXR5IiwgMTcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1JlbGVhc2VDYXBhYmlsaXR5OwkgLy8gImNsYW5nOjpyZWxlYXNlX2NhcGFiaWxpdHkiCisgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgIndpZnRfZXJyb3JfcmVzdWx0IiwgMTcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1N3aWZ0RXJyb3JSZXN1bHQ7CSAvLyAiY2xhbmc6OnN3aWZ0X2Vycm9yX3Jlc3VsdCIKKyAgICBjYXNlICd3JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAiYXJuX3VudXNlZF9yZXN1bHQiLCAxNykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfV2FyblVudXNlZFJlc3VsdDsJIC8vICJjbGFuZzo6d2Fybl91bnVzZWRfcmVzdWx0IgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAyNjoJIC8vIDkgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6IiwgNykgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJtZGdwdV93YXZlc19wZXJfZXUiLCAxOCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQU1ER1BVV2F2ZXNQZXJFVTsJIC8vICJjbGFuZzo6YW1kZ3B1X3dhdmVzX3Blcl9ldSIKKyAgICBjYXNlICdjJzoJIC8vIDMgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImZfIiwgMikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbMTBdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTEsICJ1ZGl0ZWRfdHJhbnNmZXIiLCAxNSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NGQXVkaXRlZFRyYW5zZmVyOwkgLy8gImNsYW5nOjpjZl9hdWRpdGVkX3RyYW5zZmVyIgorICAgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxMSwgImV0dXJuc19yZXRhaW5lZCIsIDE1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQ0ZSZXR1cm5zUmV0YWluZWQ7CSAvLyAiY2xhbmc6OmNmX3JldHVybnNfcmV0YWluZWQiCisgICAgICBjYXNlICd1JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzExLCAibmtub3duX3RyYW5zZmVyIiwgMTUpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9DRlVua25vd25UcmFuc2ZlcjsJIC8vICJjbGFuZzo6Y2ZfdW5rbm93bl90cmFuc2ZlciIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ24nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJzX3JldHVybnNfcmV0YWluZWQiLCAxOCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTlNSZXR1cm5zUmV0YWluZWQ7CSAvLyAiY2xhbmc6Om5zX3JldHVybnNfcmV0YWluZWQiCisgICAgY2FzZSAnbyc6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJiamNfIiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbMTJdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2InOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEzLCAicmlkZ2VfIiwgNikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgc3dpdGNoIChOYW1lWzE5XSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSAnbSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIwLCAidXRhYmxlIiwgNikgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDQnJpZGdlTXV0YWJsZTsJIC8vICJjbGFuZzo6b2JqY19icmlkZ2VfbXV0YWJsZSIKKyAgICAgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIwLCAiZWxhdGVkIiwgNikgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDQnJpZGdlUmVsYXRlZDsJIC8vICJjbGFuZzo6b2JqY19icmlkZ2VfcmVsYXRlZCIKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTMsICJlcXVpcmVzX3N1cGVyIiwgMTMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDUmVxdWlyZXNTdXBlcjsJIC8vICJjbGFuZzo6b2JqY19yZXF1aXJlc19zdXBlciIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJlcXVpcmVzX2NhcGFiaWxpdHkiLCAxOCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfUmVxdWlyZXNDYXBhYmlsaXR5OwkgLy8gImNsYW5nOjpyZXF1aXJlc19jYXBhYmlsaXR5IgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAyNzoJIC8vIDMgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdjJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImxhbmc6OiIsIDYpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgc3dpdGNoIChOYW1lWzddKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ24nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImVvbl9wb2x5dmVjdG9yX3R5cGUiLCAxOSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05lb25Qb2x5VmVjdG9yVHlwZTsJIC8vICJjbGFuZzo6bmVvbl9wb2x5dmVjdG9yX3R5cGUiCisgICAgICBjYXNlICdvJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJiamNfcnVudGltZV92aXNpYmxlIiwgMTkpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDUnVudGltZVZpc2libGU7CSAvLyAiY2xhbmc6Om9iamNfcnVudGltZV92aXNpYmxlIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnZyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm51Ojpub19pbnN0cnVtZW50X2Z1bmN0aW9uIiwgMjYpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vSW5zdHJ1bWVudEZ1bmN0aW9uOwkgLy8gImdudTo6bm9faW5zdHJ1bWVudF9mdW5jdGlvbiIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjg6CSAvLyA4IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYyc6CSAvLyA3IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJsYW5nOjoiLCA2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdsJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJ0b192aXNpYmlsaXR5X3B1YmxpYyIsIDIwKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTFRPVmlzaWJpbGl0eVB1YmxpYzsJIC8vICJjbGFuZzo6bHRvX3Zpc2liaWxpdHlfcHVibGljIgorICAgICAgY2FzZSAnbyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAiYmpjX3ByZWNpc2VfbGlmZXRpbWUiLCAyMCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNQcmVjaXNlTGlmZXRpbWU7CSAvLyAiY2xhbmc6Om9iamNfcHJlY2lzZV9saWZldGltZSIKKyAgICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgIm9pbnRlcl93aXRoX3R5cGVfdGFnIiwgMjApICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Bcmd1bWVudFdpdGhUeXBlVGFnOwkgLy8gImNsYW5nOjpwb2ludGVyX3dpdGhfdHlwZV90YWciCisgICAgICBjYXNlICdzJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgc3dpdGNoIChOYW1lWzhdKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICBjYXNlICdoJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOSwgImFyZWRfbG9ja3NfcmVxdWlyZWQiLCAxOSkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9SZXF1aXJlc0NhcGFiaWxpdHk7CSAvLyAiY2xhbmc6OnNoYXJlZF9sb2Nrc19yZXF1aXJlZCIKKyAgICAgICAgY2FzZSAndyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzksICJpZnRfaW5kaXJlY3RfcmVzdWx0IiwgMTkpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU3dpZnRJbmRpcmVjdFJlc3VsdDsJIC8vICJjbGFuZzo6c3dpZnRfaW5kaXJlY3RfcmVzdWx0IgorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAndCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAieXBlX3RhZ19mb3JfZGF0YXR5cGUiLCAyMCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1R5cGVUYWdGb3JEYXRhdHlwZTsJIC8vICJjbGFuZzo6dHlwZV90YWdfZm9yX2RhdGF0eXBlIgorICAgICAgY2FzZSAneCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAicmF5X25ldmVyX2luc3RydW1lbnQiLCAyMCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1hSYXlJbnN0cnVtZW50OwkgLy8gImNsYW5nOjp4cmF5X25ldmVyX2luc3RydW1lbnQiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdnJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibnU6OmZvcmNlX2FsaWduX2FyZ19wb2ludGVyIiwgMjcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1g4NkZvcmNlQWxpZ25BcmdQb2ludGVyOwkgLy8gImdudTo6Zm9yY2VfYWxpZ25fYXJnX3BvaW50ZXIiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDI5OgkgLy8gNSBzdHJpbmdzIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgImNsYW5nOjoiLCA3KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgc3dpdGNoIChOYW1lWzddKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgInJndW1lbnRfd2l0aF90eXBlX3RhZyIsIDIxKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Bcmd1bWVudFdpdGhUeXBlVGFnOwkgLy8gImNsYW5nOjphcmd1bWVudF93aXRoX3R5cGVfdGFnIgorICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJ4dGVybmFsX3NvdXJjZV9zeW1ib2wiLCAyMSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRXh0ZXJuYWxTb3VyY2VTeW1ib2w7CSAvLyAiY2xhbmc6OmV4dGVybmFsX3NvdXJjZV9zeW1ib2wiCisgICAgY2FzZSAnbyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImJqY19pbmRlcGVuZGVudF9jbGFzcyIsIDIxKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDSW5kZXBlbmRlbnRDbGFzczsJIC8vICJjbGFuZzo6b2JqY19pbmRlcGVuZGVudF9jbGFzcyIKKyAgICBjYXNlICd0JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAicnlfYWNxdWlyZV9jYXBhYmlsaXR5IiwgMjEpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1RyeUFjcXVpcmVDYXBhYmlsaXR5OwkgLy8gImNsYW5nOjp0cnlfYWNxdWlyZV9jYXBhYmlsaXR5IgorICAgIGNhc2UgJ3gnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJyYXlfYWx3YXlzX2luc3RydW1lbnQiLCAyMSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfWFJheUluc3RydW1lbnQ7CSAvLyAiY2xhbmc6OnhyYXlfYWx3YXlzX2luc3RydW1lbnQiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDMwOgkgLy8gNCBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2MnOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibGFuZzo6IiwgNikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbN10pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAiZl9yZXR1cm5zX25vdF9yZXRhaW5lZCIsIDIyKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQ0ZSZXR1cm5zTm90UmV0YWluZWQ7CSAvLyAiY2xhbmc6OmNmX3JldHVybnNfbm90X3JldGFpbmVkIgorICAgICAgY2FzZSAnbic6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgInNfcmV0dXJuc18iLCAxMCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgc3dpdGNoIChOYW1lWzE4XSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzE5LCAidXRvcmVsZWFzZWQiLCAxMSkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9OU1JldHVybnNBdXRvcmVsZWFzZWQ7CSAvLyAiY2xhbmc6Om5zX3JldHVybnNfYXV0b3JlbGVhc2VkIgorICAgICAgICBjYXNlICduJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTksICJvdF9yZXRhaW5lZCIsIDExKSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05TUmV0dXJuc05vdFJldGFpbmVkOwkgLy8gImNsYW5nOjpuc19yZXR1cm5zX25vdF9yZXRhaW5lZCIKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2cnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJudTo6bm9fY2FsbGVyX3NhdmVkX3JlZ2lzdGVycyIsIDI5KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9BbnlYODZOb0NhbGxlclNhdmVkUmVnaXN0ZXJzOwkgLy8gImdudTo6bm9fY2FsbGVyX3NhdmVkX3JlZ2lzdGVycyIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMzE6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYyc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJsYW5nOjoiLCA2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJzc2VydF9zaGFyZWRfY2FwYWJpbGl0eSIsIDIzKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQXNzZXJ0Q2FwYWJpbGl0eTsJIC8vICJjbGFuZzo6YXNzZXJ0X3NoYXJlZF9jYXBhYmlsaXR5IgorICAgICAgY2FzZSAnZSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAieGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQiLCAyMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1JlcXVpcmVzQ2FwYWJpbGl0eTsJIC8vICJjbGFuZzo6ZXhjbHVzaXZlX2xvY2tzX3JlcXVpcmVkIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnZyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm51Ojpub19hZGRyZXNzX3NhZmV0eV9hbmFseXNpcyIsIDMwKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Ob1Nhbml0aXplU3BlY2lmaWM7CSAvLyAiZ251Ojpub19hZGRyZXNzX3NhZmV0eV9hbmFseXNpcyIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMzI6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSswLCAiY2xhbmc6OiIsIDcpICE9IDApCisgICAgICBicmVhazsKKyAgICBzd2l0Y2ggKE5hbWVbN10pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAiY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5IiwgMjQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FjcXVpcmVDYXBhYmlsaXR5OwkgLy8gImNsYW5nOjphY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5IgorICAgIGNhc2UgJ24nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJvX3RocmVhZF9zYWZldHlfYW5hbHlzaXMiLCAyNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTm9UaHJlYWRTYWZldHlBbmFseXNpczsJIC8vICJjbGFuZzo6bm9fdGhyZWFkX3NhZmV0eV9hbmFseXNpcyIKKyAgICBjYXNlICdyJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAiZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5IiwgMjQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1JlbGVhc2VDYXBhYmlsaXR5OwkgLy8gImNsYW5nOjpyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5IgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAzMzoJIC8vIDQgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6IiwgNykgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJvbnN1bWFibGVfYXV0b19jYXN0X3N0YXRlIiwgMjUpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NvbnN1bWFibGVBdXRvQ2FzdDsJIC8vICJjbGFuZzo6Y29uc3VtYWJsZV9hdXRvX2Nhc3Rfc3RhdGUiCisgICAgY2FzZSAnbyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImJqY19yZXR1cm5zX2lubmVyX3BvaW50ZXIiLCAyNSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT2JqQ1JldHVybnNJbm5lclBvaW50ZXI7CSAvLyAiY2xhbmc6Om9iamNfcmV0dXJuc19pbm5lcl9wb2ludGVyIgorICAgIGNhc2UgJ3InOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKE5hbWVbOF0gIT0gJ2UnKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVs5XSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdsJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEwLCAiZWFzZV9nZW5lcmljX2NhcGFiaWxpdHkiLCAyMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1JlbGVhc2VDYXBhYmlsaXR5OwkgLy8gImNsYW5nOjpyZWxlYXNlX2dlbmVyaWNfY2FwYWJpbGl0eSIKKyAgICAgIGNhc2UgJ3EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTAsICJ1aXJlc19zaGFyZWRfY2FwYWJpbGl0eSIsIDIzKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfUmVxdWlyZXNDYXBhYmlsaXR5OwkgLy8gImNsYW5nOjpyZXF1aXJlc19zaGFyZWRfY2FwYWJpbGl0eSIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAzNDoJIC8vIDMgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6IiwgNykgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJtZGdwdV9mbGF0X3dvcmtfZ3JvdXBfc2l6ZSIsIDI2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9BTURHUFVGbGF0V29ya0dyb3VwU2l6ZTsJIC8vICJjbGFuZzo6YW1kZ3B1X2ZsYXRfd29ya19ncm91cF9zaXplIgorICAgIGNhc2UgJ28nOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAiYmpjXyIsIDQpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgc3dpdGNoIChOYW1lWzEyXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdkJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEzLCAiZXNpZ25hdGVkX2luaXRpYWxpemVyIiwgMjEpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDRGVzaWduYXRlZEluaXRpYWxpemVyOwkgLy8gImNsYW5nOjpvYmpjX2Rlc2lnbmF0ZWRfaW5pdGlhbGl6ZXIiCisgICAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEzLCAidWJjbGFzc2luZ19yZXN0cmljdGVkIiwgMjEpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDU3ViY2xhc3NpbmdSZXN0cmljdGVkOwkgLy8gImNsYW5nOjpvYmpjX3N1YmNsYXNzaW5nX3Jlc3RyaWN0ZWQiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMzU6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6Y29uc3VtYWJsZV9zZXRfc3RhdGVfb25fcmVhZCIsIDM1KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NvbnN1bWFibGVTZXRPblJlYWQ7CSAvLyAiY2xhbmc6OmNvbnN1bWFibGVfc2V0X3N0YXRlX29uX3JlYWQiCisgIGNhc2UgMzY6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6dHJ5X2FjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkiLCAzNikgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9UcnlBY3F1aXJlQ2FwYWJpbGl0eTsJIC8vICJjbGFuZzo6dHJ5X2FjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkiCisgIGNhc2UgMzg6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6cmVxdWlyZV9jb25zdGFudF9pbml0aWFsaXphdGlvbiIsIDM4KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1JlcXVpcmVDb25zdGFudEluaXQ7CSAvLyAiY2xhbmc6OnJlcXVpcmVfY29uc3RhbnRfaW5pdGlhbGl6YXRpb24iCisgIGNhc2UgNDE6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6b2JqY19yZXF1aXJlc19wcm9wZXJ0eV9kZWZpbml0aW9ucyIsIDQxKSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNSZXF1aXJlc1Byb3BlcnR5RGVmczsJIC8vICJjbGFuZzo6b2JqY19yZXF1aXJlc19wcm9wZXJ0eV9kZWZpbml0aW9ucyIKKyAgY2FzZSA0MjoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgImNsYW5nOjpvYmpjX2FyY193ZWFrX3JlZmVyZW5jZV91bmF2YWlsYWJsZSIsIDQyKSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FyY1dlYWtyZWZVbmF2YWlsYWJsZTsJIC8vICJjbGFuZzo6b2JqY19hcmNfd2Vha19yZWZlcmVuY2VfdW5hdmFpbGFibGUiCisgIGNhc2UgNTM6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6b2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbiIsIDUzKSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNFeHBsaWNpdFByb3RvY29sSW1wbDsJIC8vICJjbGFuZzo6b2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbiIKKyAgfQorICB9IGVsc2UgaWYgKEF0dHJpYnV0ZUxpc3Q6OkFTX0MyeCA9PSBTeW50YXgpIHsKKyAgc3dpdGNoIChOYW1lLnNpemUoKSkgeworICBkZWZhdWx0OiBicmVhazsKKyAgY2FzZSAxMToJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgIjo6bm9kaXNjYXJkIiwgMTEpICE9IDApCisgICAgICBicmVhazsKKyAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfV2FyblVudXNlZFJlc3VsdDsJIC8vICI6Om5vZGlzY2FyZCIKKyAgY2FzZSAxMjoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgIjo6ZGVwcmVjYXRlZCIsIDEyKSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0RlcHJlY2F0ZWQ7CSAvLyAiOjpkZXByZWNhdGVkIgorICBjYXNlIDEzOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgIHN3aXRjaCAoTmFtZVswXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJzonOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICI6ZmFsbHRocm91Z2giLCAxMikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRmFsbFRocm91Z2g7CSAvLyAiOjpmYWxsdGhyb3VnaCIKKyAgICBjYXNlICdjJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImxhbmc6OiIsIDYpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgc3dpdGNoIChOYW1lWzddKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImxvY2tzIiwgNSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0Jsb2NrczsJIC8vICJjbGFuZzo6YmxvY2tzIgorICAgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAiYXNjYWwiLCA1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfUGFzY2FsOwkgLy8gImNsYW5nOjpwYXNjYWwiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMTQ6CSAvLyA0IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnOic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIjptYXliZV91bnVzZWQiLCAxMykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfVW51c2VkOwkgLy8gIjo6bWF5YmVfdW51c2VkIgorICAgIGNhc2UgJ2MnOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAibGFuZzo6IiwgNikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbN10pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnbSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAiaW5zaXplIiwgNikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX01pblNpemU7CSAvLyAiY2xhbmc6Om1pbnNpemUiCisgICAgICBjYXNlICdvJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgc3dpdGNoIChOYW1lWzhdKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICBjYXNlICdiJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOSwgImpjX2djIiwgNSkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDR0M7CSAvLyAiY2xhbmc6Om9iamNfZ2MiCisgICAgICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs5LCAidG5vbmUiLCA1KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09wdGltaXplTm9uZTsJIC8vICJjbGFuZzo6b3B0bm9uZSIKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAxNToJIC8vIDUgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6IiwgNykgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ04nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJTT2JqZWN0IiwgNykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT2JqQ05TT2JqZWN0OwkgLy8gImNsYW5nOjpOU09iamVjdCIKKyAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAibm5vdGF0ZSIsIDcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0Fubm90YXRlOwkgLy8gImNsYW5nOjphbm5vdGF0ZSIKKyAgICBjYXNlICdpJzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChOYW1lWzhdICE9ICdiJykKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbOV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxMCwgImN0aW9uIiwgNSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0lCQWN0aW9uOwkgLy8gImNsYW5nOjppYmFjdGlvbiIKKyAgICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTAsICJ1dGxldCIsIDUpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9JQk91dGxldDsJIC8vICJjbGFuZzo6aWJvdXRsZXQiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICduJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAib2VzY2FwZSIsIDcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vRXNjYXBlOwkgLy8gImNsYW5nOjpub2VzY2FwZSIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMTY6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSswLCAiY2xhbmc6OiIsIDcpICE9IDApCisgICAgICBicmVhazsKKyAgICBzd2l0Y2ggKE5hbWVbN10pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdmJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAibGFnX2VudW0iLCA4KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9GbGFnRW51bTsJIC8vICJjbGFuZzo6ZmxhZ19lbnVtIgorICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJ3aWZ0Y2FsbCIsIDgpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1N3aWZ0Q2FsbDsJIC8vICJjbGFuZzo6c3dpZnRjYWxsIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAxNzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6IiwgNykgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJvbnZlcmdlbnQiLCA5KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Db252ZXJnZW50OwkgLy8gImNsYW5nOjpjb252ZXJnZW50IgorICAgIGNhc2UgJ3YnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJlY3RvcmNhbGwiLCA5KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9WZWN0b3JDYWxsOwkgLy8gImNsYW5nOjp2ZWN0b3JjYWxsIgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAxODoJIC8vIDcgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6IiwgNykgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJmX2NvbnN1bWVkIiwgMTApICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NGQ29uc3VtZWQ7CSAvLyAiY2xhbmc6OmNmX2NvbnN1bWVkIgorICAgIGNhc2UgJ24nOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzhdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ28nOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgICBzd2l0Y2ggKE5hbWVbOV0pIHsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIGNhc2UgJ18nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxMCwgInNhbml0aXplIiwgOCkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Ob1Nhbml0aXplOwkgLy8gImNsYW5nOjpub19zYW5pdGl6ZSIKKyAgICAgICAgY2FzZSAnZCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEwLCAidXBsaWNhdGUiLCA4KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vRHVwbGljYXRlOwkgLy8gImNsYW5nOjpub2R1cGxpY2F0ZSIKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOSwgIl9jb25zdW1lZCIsIDkpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9OU0NvbnN1bWVkOwkgLy8gImNsYW5nOjpuc19jb25zdW1lZCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJiamNfYnJpZGdlIiwgMTApICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNCcmlkZ2U7CSAvLyAiY2xhbmc6Om9iamNfYnJpZGdlIgorICAgIGNhc2UgJ3UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJuYXZhaWxhYmxlIiwgMTApICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1VuYXZhaWxhYmxlOwkgLy8gImNsYW5nOjp1bmF2YWlsYWJsZSIKKyAgICBjYXNlICd3JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAiZWFrX2ltcG9ydCIsIDEwKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9XZWFrSW1wb3J0OwkgLy8gImNsYW5nOjp3ZWFrX2ltcG9ydCIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMTk6CSAvLyA0IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSswLCAiY2xhbmc6OiIsIDcpICE9IDApCisgICAgICBicmVhazsKKyAgICBzd2l0Y2ggKE5hbWVbN10pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAidmFpbGFiaWxpdHkiLCAxMSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQXZhaWxhYmlsaXR5OwkgLy8gImNsYW5nOjphdmFpbGFiaWxpdHkiCisgICAgY2FzZSAnbyc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbOF0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs5LCAiamNfYm94YWJsZSIsIDEwKSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT2JqQ0JveGFibGU7CSAvLyAiY2xhbmc6Om9iamNfYm94YWJsZSIKKyAgICAgIGNhc2UgJ3YnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOSwgImVybG9hZGFibGUiLCAxMCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX092ZXJsb2FkYWJsZTsJIC8vICJjbGFuZzo6b3ZlcmxvYWRhYmxlIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgInJlc2VydmVfYWxsIiwgMTEpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1ByZXNlcnZlQWxsOwkgLy8gImNsYW5nOjpwcmVzZXJ2ZV9hbGwiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDIwOgkgLy8gNCBzdHJpbmdzIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgImNsYW5nOjoiLCA3KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgc3dpdGNoIChOYW1lWzddKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImRkcmVzc19zcGFjZSIsIDEyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9BZGRyZXNzU3BhY2U7CSAvLyAiY2xhbmc6OmFkZHJlc3Nfc3BhY2UiCisgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgInJlc2VydmVfbW9zdCIsIDEyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9QcmVzZXJ2ZU1vc3Q7CSAvLyAiY2xhbmc6OnByZXNlcnZlX21vc3QiCisgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgIndpZnRfY29udGV4dCIsIDEyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Td2lmdENvbnRleHQ7CSAvLyAiY2xhbmc6OnN3aWZ0X2NvbnRleHQiCisgICAgY2FzZSAneCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgInJheV9sb2dfYXJncyIsIDEyKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9YUmF5TG9nQXJnczsJIC8vICJjbGFuZzo6eHJheV9sb2dfYXJncyIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjE6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSswLCAiY2xhbmc6Om9iamNfIiwgMTIpICE9IDApCisgICAgICBicmVhazsKKyAgICBzd2l0Y2ggKE5hbWVbMTJdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnZSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTMsICJ4Y2VwdGlvbiIsIDgpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNFeGNlcHRpb247CSAvLyAiY2xhbmc6Om9iamNfZXhjZXB0aW9uIgorICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEzLCAid25lcnNoaXAiLCA4KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDT3duZXJzaGlwOwkgLy8gImNsYW5nOjpvYmpjX293bmVyc2hpcCIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjI6CSAvLyA1IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSswLCAiY2xhbmc6OiIsIDcpICE9IDApCisgICAgICBicmVhazsKKyAgICBzd2l0Y2ggKE5hbWVbN10pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICduJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAib3RfdGFpbF9jYWxsZWQiLCAxNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTm90VGFpbENhbGxlZDsJIC8vICJjbGFuZzo6bm90X3RhaWxfY2FsbGVkIgorICAgIGNhc2UgJ28nOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzhdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOSwgImpjX3Jvb3RfY2xhc3MiLCAxMykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNSb290Q2xhc3M7CSAvLyAiY2xhbmc6Om9iamNfcm9vdF9jbGFzcyIKKyAgICAgIGNhc2UgJ3cnOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzksICJuZXJzaGlwXyIsIDgpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN3aXRjaCAoTmFtZVsxN10pIHsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIGNhc2UgJ2gnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxOCwgIm9sZHMiLCA0KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX093bmVyc2hpcDsJIC8vICJjbGFuZzo6b3duZXJzaGlwX2hvbGRzIgorICAgICAgICBjYXNlICd0JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTgsICJha2VzIiwgNCkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Pd25lcnNoaXA7CSAvLyAiY2xhbmc6Om93bmVyc2hpcF90YWtlcyIKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJ5cGVfdmlzaWJpbGl0eSIsIDE0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9UeXBlVmlzaWJpbGl0eTsJIC8vICJjbGFuZzo6dHlwZV92aXNpYmlsaXR5IgorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAyMzoJIC8vIDQgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6IiwgNykgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJudGVybmFsX2xpbmthZ2UiLCAxNSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfSW50ZXJuYWxMaW5rYWdlOwkgLy8gImNsYW5nOjppbnRlcm5hbF9saW5rYWdlIgorICAgIGNhc2UgJ24nOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgc3dpdGNoIChOYW1lWzhdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOSwgIm9uX3ZlY3Rvcl90eXBlIiwgMTQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9OZW9uVmVjdG9yVHlwZTsJIC8vICJjbGFuZzo6bmVvbl92ZWN0b3JfdHlwZSIKKyAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOSwgIl9jb25zdW1lc19zZWxmIiwgMTQpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9OU0NvbnN1bWVzU2VsZjsJIC8vICJjbGFuZzo6bnNfY29uc3VtZXNfc2VsZiIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJhc3Nfb2JqZWN0X3NpemUiLCAxNSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfUGFzc09iamVjdFNpemU7CSAvLyAiY2xhbmc6OnBhc3Nfb2JqZWN0X3NpemUiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDI0OgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgImNsYW5nOjpvIiwgOCkgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHN3aXRjaCAoTmFtZVs4XSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ2InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzksICJqY19ydW50aW1lX25hbWUiLCAxNSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT2JqQ1J1bnRpbWVOYW1lOwkgLy8gImNsYW5nOjpvYmpjX3J1bnRpbWVfbmFtZSIKKyAgICBjYXNlICd3JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs5LCAibmVyc2hpcF9yZXR1cm5zIiwgMTUpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX093bmVyc2hpcDsJIC8vICJjbGFuZzo6b3duZXJzaGlwX3JldHVybnMiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDI1OgkgLy8gNiBzdHJpbmdzIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgImNsYW5nOjoiLCA3KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgc3dpdGNoIChOYW1lWzddKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnZCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImlzYWJsZV90YWlsX2NhbGxzIiwgMTcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0Rpc2FibGVUYWlsQ2FsbHM7CSAvLyAiY2xhbmc6OmRpc2FibGVfdGFpbF9jYWxscyIKKyAgICBjYXNlICdlJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAibnVtX2V4dGVuc2liaWxpdHkiLCAxNykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRW51bUV4dGVuc2liaWxpdHk7CSAvLyAiY2xhbmc6OmVudW1fZXh0ZW5zaWJpbGl0eSIKKyAgICBjYXNlICdpJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAiYm91dGxldGNvbGxlY3Rpb24iLCAxNykgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfSUJPdXRsZXRDb2xsZWN0aW9uOwkgLy8gImNsYW5nOjppYm91dGxldGNvbGxlY3Rpb24iCisgICAgY2FzZSAnbic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgIm9fc2FuaXRpemVfbWVtb3J5IiwgMTcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vU2FuaXRpemVTcGVjaWZpYzsJIC8vICJjbGFuZzo6bm9fc2FuaXRpemVfbWVtb3J5IgorICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJiamNfbWV0aG9kX2ZhbWlseSIsIDE3KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDTWV0aG9kRmFtaWx5OwkgLy8gImNsYW5nOjpvYmpjX21ldGhvZF9mYW1pbHkiCisgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgIndpZnRfZXJyb3JfcmVzdWx0IiwgMTcpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1N3aWZ0RXJyb3JSZXN1bHQ7CSAvLyAiY2xhbmc6OnN3aWZ0X2Vycm9yX3Jlc3VsdCIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjY6CSAvLyA3IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSswLCAiY2xhbmc6OiIsIDcpICE9IDApCisgICAgICBicmVhazsKKyAgICBzd2l0Y2ggKE5hbWVbN10pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdjJzoJIC8vIDMgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImZfIiwgMikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbMTBdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2EnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTEsICJ1ZGl0ZWRfdHJhbnNmZXIiLCAxNSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NGQXVkaXRlZFRyYW5zZmVyOwkgLy8gImNsYW5nOjpjZl9hdWRpdGVkX3RyYW5zZmVyIgorICAgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxMSwgImV0dXJuc19yZXRhaW5lZCIsIDE1KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQ0ZSZXR1cm5zUmV0YWluZWQ7CSAvLyAiY2xhbmc6OmNmX3JldHVybnNfcmV0YWluZWQiCisgICAgICBjYXNlICd1JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzExLCAibmtub3duX3RyYW5zZmVyIiwgMTUpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9DRlVua25vd25UcmFuc2ZlcjsJIC8vICJjbGFuZzo6Y2ZfdW5rbm93bl90cmFuc2ZlciIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ24nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJzX3JldHVybnNfcmV0YWluZWQiLCAxOCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTlNSZXR1cm5zUmV0YWluZWQ7CSAvLyAiY2xhbmc6Om5zX3JldHVybnNfcmV0YWluZWQiCisgICAgY2FzZSAnbyc6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJiamNfIiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKE5hbWVbMTJdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2InOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEzLCAicmlkZ2VfIiwgNikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgc3dpdGNoIChOYW1lWzE5XSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSAnbSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIwLCAidXRhYmxlIiwgNikgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDQnJpZGdlTXV0YWJsZTsJIC8vICJjbGFuZzo6b2JqY19icmlkZ2VfbXV0YWJsZSIKKyAgICAgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIwLCAiZWxhdGVkIiwgNikgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDQnJpZGdlUmVsYXRlZDsJIC8vICJjbGFuZzo6b2JqY19icmlkZ2VfcmVsYXRlZCIKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTMsICJlcXVpcmVzX3N1cGVyIiwgMTMpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDUmVxdWlyZXNTdXBlcjsJIC8vICJjbGFuZzo6b2JqY19yZXF1aXJlc19zdXBlciIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAyNzoJIC8vIDIgc3RyaW5ncyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6IiwgNykgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHN3aXRjaCAoTmFtZVs3XSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ24nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJlb25fcG9seXZlY3Rvcl90eXBlIiwgMTkpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05lb25Qb2x5VmVjdG9yVHlwZTsJIC8vICJjbGFuZzo6bmVvbl9wb2x5dmVjdG9yX3R5cGUiCisgICAgY2FzZSAnbyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImJqY19ydW50aW1lX3Zpc2libGUiLCAxOSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT2JqQ1J1bnRpbWVWaXNpYmxlOwkgLy8gImNsYW5nOjpvYmpjX3J1bnRpbWVfdmlzaWJsZSIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjg6CSAvLyA2IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSswLCAiY2xhbmc6OiIsIDcpICE9IDApCisgICAgICBicmVhazsKKyAgICBzd2l0Y2ggKE5hbWVbN10pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdsJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAidG9fdmlzaWJpbGl0eV9wdWJsaWMiLCAyMCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTFRPVmlzaWJpbGl0eVB1YmxpYzsJIC8vICJjbGFuZzo6bHRvX3Zpc2liaWxpdHlfcHVibGljIgorICAgIGNhc2UgJ28nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJiamNfcHJlY2lzZV9saWZldGltZSIsIDIwKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDUHJlY2lzZUxpZmV0aW1lOwkgLy8gImNsYW5nOjpvYmpjX3ByZWNpc2VfbGlmZXRpbWUiCisgICAgY2FzZSAncCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgIm9pbnRlcl93aXRoX3R5cGVfdGFnIiwgMjApICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FyZ3VtZW50V2l0aFR5cGVUYWc7CSAvLyAiY2xhbmc6OnBvaW50ZXJfd2l0aF90eXBlX3RhZyIKKyAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAid2lmdF9pbmRpcmVjdF9yZXN1bHQiLCAyMCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU3dpZnRJbmRpcmVjdFJlc3VsdDsJIC8vICJjbGFuZzo6c3dpZnRfaW5kaXJlY3RfcmVzdWx0IgorICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJ5cGVfdGFnX2Zvcl9kYXRhdHlwZSIsIDIwKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9UeXBlVGFnRm9yRGF0YXR5cGU7CSAvLyAiY2xhbmc6OnR5cGVfdGFnX2Zvcl9kYXRhdHlwZSIKKyAgICBjYXNlICd4JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAicmF5X25ldmVyX2luc3RydW1lbnQiLCAyMCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfWFJheUluc3RydW1lbnQ7CSAvLyAiY2xhbmc6OnhyYXlfbmV2ZXJfaW5zdHJ1bWVudCIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMjk6CSAvLyA0IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSswLCAiY2xhbmc6OiIsIDcpICE9IDApCisgICAgICBicmVhazsKKyAgICBzd2l0Y2ggKE5hbWVbN10pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdhJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAicmd1bWVudF93aXRoX3R5cGVfdGFnIiwgMjEpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FyZ3VtZW50V2l0aFR5cGVUYWc7CSAvLyAiY2xhbmc6OmFyZ3VtZW50X3dpdGhfdHlwZV90YWciCisgICAgY2FzZSAnZSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgInh0ZXJuYWxfc291cmNlX3N5bWJvbCIsIDIxKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9FeHRlcm5hbFNvdXJjZVN5bWJvbDsJIC8vICJjbGFuZzo6ZXh0ZXJuYWxfc291cmNlX3N5bWJvbCIKKyAgICBjYXNlICdvJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAiYmpjX2luZGVwZW5kZW50X2NsYXNzIiwgMjEpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNJbmRlcGVuZGVudENsYXNzOwkgLy8gImNsYW5nOjpvYmpjX2luZGVwZW5kZW50X2NsYXNzIgorICAgIGNhc2UgJ3gnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzgsICJyYXlfYWx3YXlzX2luc3RydW1lbnQiLCAyMSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfWFJheUluc3RydW1lbnQ7CSAvLyAiY2xhbmc6OnhyYXlfYWx3YXlzX2luc3RydW1lbnQiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDMwOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgImNsYW5nOjoiLCA3KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgc3dpdGNoIChOYW1lWzddKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnYyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrOCwgImZfcmV0dXJuc19ub3RfcmV0YWluZWQiLCAyMikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQ0ZSZXR1cm5zTm90UmV0YWluZWQ7CSAvLyAiY2xhbmc6OmNmX3JldHVybnNfbm90X3JldGFpbmVkIgorICAgIGNhc2UgJ24nOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSs4LCAic19yZXR1cm5zXyIsIDEwKSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoTmFtZVsxOF0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxOSwgInV0b3JlbGVhc2VkIiwgMTEpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9OU1JldHVybnNBdXRvcmVsZWFzZWQ7CSAvLyAiY2xhbmc6Om5zX3JldHVybnNfYXV0b3JlbGVhc2VkIgorICAgICAgY2FzZSAnbic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxOSwgIm90X3JldGFpbmVkIiwgMTEpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9OU1JldHVybnNOb3RSZXRhaW5lZDsJIC8vICJjbGFuZzo6bnNfcmV0dXJuc19ub3RfcmV0YWluZWQiCisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMzI6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6bm9fdGhyZWFkX3NhZmV0eV9hbmFseXNpcyIsIDMyKSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX05vVGhyZWFkU2FmZXR5QW5hbHlzaXM7CSAvLyAiY2xhbmc6Om5vX3RocmVhZF9zYWZldHlfYW5hbHlzaXMiCisgIGNhc2UgMzM6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6b2JqY19yZXR1cm5zX2lubmVyX3BvaW50ZXIiLCAzMykgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDUmV0dXJuc0lubmVyUG9pbnRlcjsJIC8vICJjbGFuZzo6b2JqY19yZXR1cm5zX2lubmVyX3BvaW50ZXIiCisgIGNhc2UgMzQ6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSswLCAiY2xhbmc6Om9iamNfIiwgMTIpICE9IDApCisgICAgICBicmVhazsKKyAgICBzd2l0Y2ggKE5hbWVbMTJdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnZCc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMTMsICJlc2lnbmF0ZWRfaW5pdGlhbGl6ZXIiLCAyMSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT2JqQ0Rlc2lnbmF0ZWRJbml0aWFsaXplcjsJIC8vICJjbGFuZzo6b2JqY19kZXNpZ25hdGVkX2luaXRpYWxpemVyIgorICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEzLCAidWJjbGFzc2luZ19yZXN0cmljdGVkIiwgMjEpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWQ7CSAvLyAiY2xhbmc6Om9iamNfc3ViY2xhc3NpbmdfcmVzdHJpY3RlZCIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgNDE6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6b2JqY19yZXF1aXJlc19wcm9wZXJ0eV9kZWZpbml0aW9ucyIsIDQxKSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNSZXF1aXJlc1Byb3BlcnR5RGVmczsJIC8vICJjbGFuZzo6b2JqY19yZXF1aXJlc19wcm9wZXJ0eV9kZWZpbml0aW9ucyIKKyAgY2FzZSA0MjoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgImNsYW5nOjpvYmpjX2FyY193ZWFrX3JlZmVyZW5jZV91bmF2YWlsYWJsZSIsIDQyKSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FyY1dlYWtyZWZVbmF2YWlsYWJsZTsJIC8vICJjbGFuZzo6b2JqY19hcmNfd2Vha19yZWZlcmVuY2VfdW5hdmFpbGFibGUiCisgIGNhc2UgNTM6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJjbGFuZzo6b2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbiIsIDUzKSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNFeHBsaWNpdFByb3RvY29sSW1wbDsJIC8vICJjbGFuZzo6b2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbiIKKyAgfQorICB9IGVsc2UgaWYgKEF0dHJpYnV0ZUxpc3Q6OkFTX0tleXdvcmQgPT0gU3ludGF4IHx8IEF0dHJpYnV0ZUxpc3Q6OkFTX0NvbnRleHRTZW5zaXRpdmVLZXl3b3JkID09IFN5bnRheCkgeworICBzd2l0Y2ggKE5hbWUuc2l6ZSgpKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIDU6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnXyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIl93NjQiLCA0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpJZ25vcmVkQXR0cmlidXRlOwkgLy8gIl9fdzY0IgorICAgIGNhc2UgJ2wnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJvY2FsIiwgNCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT3BlbkNMTG9jYWxBZGRyZXNzU3BhY2U7CSAvLyAibG9jYWwiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDY6CSAvLyA1IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnXyc6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnXyc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICAgIHN3aXRjaCAoTmFtZVsyXSkgeworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgY2FzZSAncyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJwdHIiLCAzKSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1NQdHI7CSAvLyAiX19zcHRyIgorICAgICAgICBjYXNlICd1JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgInB0ciIsIDMpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfVVB0cjsJIC8vICJfX3VwdHIiCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdjJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJkZWNsIiwgNCkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NEZWNsOwkgLy8gIl9jZGVjbCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2cnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJsb2JhbCIsIDUpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX09wZW5DTEdsb2JhbEFkZHJlc3NTcGFjZTsJIC8vICJnbG9iYWwiCisgICAgY2FzZSAnayc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImVybmVsIiwgNSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT3BlbkNMS2VybmVsOwkgLy8gImtlcm5lbCIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgNzoJIC8vIDggc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdfJzoJIC8vIDUgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdfJzoJIC8vIDQgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgc3dpdGNoIChOYW1lWzJdKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICBjYXNlICdjJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgImRlY2wiLCA0KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0NEZWNsOwkgLy8gIl9fY2RlY2wiCisgICAgICAgIGNhc2UgJ2wnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAib2NhbCIsIDQpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT3BlbkNMTG9jYWxBZGRyZXNzU3BhY2U7CSAvLyAiX19sb2NhbCIKKyAgICAgICAgY2FzZSAncCc6CSAvLyAyIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAidHIiLCAyKSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgc3dpdGNoIChOYW1lWzVdKSB7CisgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICAgY2FzZSAnMyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICAgIGlmIChOYW1lWzZdICE9ICcyJykKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfUHRyMzI7CSAvLyAiX19wdHIzMiIKKyAgICAgICAgICBjYXNlICc2JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgICAgaWYgKE5hbWVbNl0gIT0gJzQnKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9QdHI2NDsJIC8vICJfX3B0cjY0IgorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImFzY2FsIiwgNSkgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1Bhc2NhbDsJIC8vICJfcGFzY2FsIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnYSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImxpZ25hcyIsIDYpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FsaWduZWQ7CSAvLyAiYWxpZ25hcyIKKyAgICBjYXNlICdnJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAiZW5lcmljIiwgNikgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT3BlbkNMR2VuZXJpY0FkZHJlc3NTcGFjZTsJIC8vICJnZW5lcmljIgorICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJyaXZhdGUiLCA2KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PcGVuQ0xQcml2YXRlQWRkcmVzc1NwYWNlOwkgLy8gInByaXZhdGUiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDg6CSAvLyA4IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnXyc6CSAvLyA3IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBzd2l0Y2ggKE5hbWVbMV0pIHsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgY2FzZSAnQSc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsyLCAibGlnbmFzIiwgNikgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0FsaWduZWQ7CSAvLyAiX0FsaWduYXMiCisgICAgICBjYXNlICdOJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJvbm51bGwiLCA2KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfVHlwZU5vbk51bGw7CSAvLyAiX05vbm51bGwiCisgICAgICBjYXNlICdfJzoJIC8vIDQgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgc3dpdGNoIChOYW1lWzJdKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICBjYXNlICdnJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgImxvYmFsIiwgNSkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PcGVuQ0xHbG9iYWxBZGRyZXNzU3BhY2U7CSAvLyAiX19nbG9iYWwiCisgICAgICAgIGNhc2UgJ2snOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgICAgICAgIHN3aXRjaCAoTmFtZVszXSkgeworICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgIGNhc2UgJ2UnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzQsICJybmVsIiwgNCkgIT0gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT3BlbkNMS2VybmVsOwkgLy8gIl9fa2VybmVsIgorICAgICAgICAgIGNhc2UgJ2knOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzQsICJuZG9mIiwgNCkgIT0gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT2JqQ0tpbmRPZjsJIC8vICJfX2tpbmRvZiIKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAiYXNjYWwiLCA1KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1Bhc2NhbDsJIC8vICJfX3Bhc2NhbCIKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgInRkY2FsbCIsIDYpICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9TdGRDYWxsOwkgLy8gIl9zdGRjYWxsIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnYyc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgIm9uc3RhbnQiLCA3KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PcGVuQ0xDb25zdGFudEFkZHJlc3NTcGFjZTsJIC8vICJjb25zdGFudCIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgOToJIC8vIDggc3RyaW5ncyB0byBtYXRjaC4KKyAgICBzd2l0Y2ggKE5hbWVbMF0pIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlICdfJzoJIC8vIDcgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICBjYXNlICdOJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJ1bGxhYmxlIiwgNykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1R5cGVOdWxsYWJsZTsJIC8vICJfTnVsbGFibGUiCisgICAgICBjYXNlICdfJzoJIC8vIDQgc3RyaW5ncyB0byBtYXRjaC4KKyAgICAgICAgc3dpdGNoIChOYW1lWzJdKSB7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICBjYXNlICdnJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgImVuZXJpYyIsIDYpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT3BlbkNMR2VuZXJpY0FkZHJlc3NTcGFjZTsJIC8vICJfX2dlbmVyaWMiCisgICAgICAgIGNhc2UgJ3AnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAicml2YXRlIiwgNikgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PcGVuQ0xQcml2YXRlQWRkcmVzc1NwYWNlOwkgLy8gIl9fcHJpdmF0ZSIKKyAgICAgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJlZ2NhbGwiLCA2KSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1JlZ0NhbGw7CSAvLyAiX19yZWdjYWxsIgorICAgICAgICBjYXNlICdzJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgInRkY2FsbCIsIDYpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfU3RkQ2FsbDsJIC8vICJfX3N0ZGNhbGwiCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdmJzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJhc3RjYWxsIiwgNykgIT0gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0Zhc3RDYWxsOwkgLy8gIl9mYXN0Y2FsbCIKKyAgICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImhpc2NhbGwiLCA3KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfVGhpc0NhbGw7CSAvLyAiX3RoaXNjYWxsIgorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMSwgImVhZF9vbmx5IiwgOCkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT3BlbkNMQWNjZXNzOwkgLy8gInJlYWRfb25seSIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMTA6CSAvLyA1IHN0cmluZ3MgdG8gbWF0Y2guCisgICAgc3dpdGNoIChOYW1lWzBdKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSAnXyc6CSAvLyAzIHN0cmluZ3MgdG8gbWF0Y2guCisgICAgICBpZiAoTmFtZVsxXSAhPSAnXycpCisgICAgICAgIGJyZWFrOworICAgICAgc3dpdGNoIChOYW1lWzJdKSB7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIGNhc2UgJ2MnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgIm9uc3RhbnQiLCA3KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT3BlbkNMQ29uc3RhbnRBZGRyZXNzU3BhY2U7CSAvLyAiX19jb25zdGFudCIKKyAgICAgIGNhc2UgJ2YnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgImFzdGNhbGwiLCA3KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfRmFzdENhbGw7CSAvLyAiX19mYXN0Y2FsbCIKKyAgICAgIGNhc2UgJ3QnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMywgImhpc2NhbGwiLCA3KSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfVGhpc0NhbGw7CSAvLyAiX190aGlzY2FsbCIKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzEsICJlYWRfd3JpdGUiLCA5KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PcGVuQ0xBY2Nlc3M7CSAvLyAicmVhZF93cml0ZSIKKyAgICBjYXNlICd3JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSsxLCAicml0ZV9vbmx5IiwgOSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT3BlbkNMQWNjZXNzOwkgLy8gIndyaXRlX29ubHkiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDExOgkgLy8gMiBzdHJpbmdzIHRvIG1hdGNoLgorICAgIGlmIChOYW1lWzBdICE9ICdfJykKKyAgICAgIGJyZWFrOworICAgIHN3aXRjaCAoTmFtZVsxXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ18nOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzIsICJyZWFkX29ubHkiLCA5KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PcGVuQ0xBY2Nlc3M7CSAvLyAiX19yZWFkX29ubHkiCisgICAgY2FzZSAndic6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMiwgImVjdG9yY2FsbCIsIDkpICE9IDApCisgICAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1ZlY3RvckNhbGw7CSAvLyAiX3ZlY3RvcmNhbGwiCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDEyOgkgLy8gMyBzdHJpbmdzIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgIl9fIiwgMikgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHN3aXRjaCAoTmFtZVsyXSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgJ3InOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJlYWRfd3JpdGUiLCA5KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9PcGVuQ0xBY2Nlc3M7CSAvLyAiX19yZWFkX3dyaXRlIgorICAgIGNhc2UgJ3YnOgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzMsICJlY3RvcmNhbGwiLCA5KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9WZWN0b3JDYWxsOwkgLy8gIl9fdmVjdG9yY2FsbCIKKyAgICBjYXNlICd3JzoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSszLCAicml0ZV9vbmx5IiwgOSkgIT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfT3BlbkNMQWNjZXNzOwkgLy8gIl9fd3JpdGVfb25seSIKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgMTM6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJfX2ZvcmNlaW5saW5lIiwgMTMpICE9IDApCisgICAgICBicmVhazsKKyAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfQWx3YXlzSW5saW5lOwkgLy8gIl9fZm9yY2VpbmxpbmUiCisgIGNhc2UgMTc6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJfTnVsbF91bnNwZWNpZmllZCIsIDE3KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX1R5cGVOdWxsVW5zcGVjaWZpZWQ7CSAvLyAiX051bGxfdW5zcGVjaWZpZWQiCisgIGNhc2UgMjA6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJfX3NpbmdsZV9pbmhlcml0YW5jZSIsIDIwKSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX01TSW5oZXJpdGFuY2U7CSAvLyAiX19zaW5nbGVfaW5oZXJpdGFuY2UiCisgIGNhc2UgMjE6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJfX3ZpcnR1YWxfaW5oZXJpdGFuY2UiLCAyMSkgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9NU0luaGVyaXRhbmNlOwkgLy8gIl9fdmlydHVhbF9pbmhlcml0YW5jZSIKKyAgY2FzZSAyMjoJIC8vIDEgc3RyaW5nIHRvIG1hdGNoLgorICAgIGlmIChtZW1jbXAoTmFtZS5kYXRhKCkrMCwgIl9fbXVsdGlwbGVfaW5oZXJpdGFuY2UiLCAyMikgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9NU0luaGVyaXRhbmNlOwkgLy8gIl9fbXVsdGlwbGVfaW5oZXJpdGFuY2UiCisgIGNhc2UgMjU6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJfX3Vuc3BlY2lmaWVkX2luaGVyaXRhbmNlIiwgMjUpICE9IDApCisgICAgICBicmVhazsKKyAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfTVNJbmhlcml0YW5jZTsJIC8vICJfX3Vuc3BlY2lmaWVkX2luaGVyaXRhbmNlIgorICB9CisgIH0gZWxzZSBpZiAoQXR0cmlidXRlTGlzdDo6QVNfUHJhZ21hID09IFN5bnRheCkgeworICBzd2l0Y2ggKE5hbWUuc2l6ZSgpKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIDQ6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJsb29wIiwgNCkgIT0gMCkKKyAgICAgIGJyZWFrOworICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF9Mb29wSGludDsJIC8vICJsb29wIgorICBjYXNlIDY6CSAvLyAxIHN0cmluZyB0byBtYXRjaC4KKyAgICBpZiAobWVtY21wKE5hbWUuZGF0YSgpKzAsICJ1bnJvbGwiLCA2KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0xvb3BIaW50OwkgLy8gInVucm9sbCIKKyAgY2FzZSA4OgkgLy8gMSBzdHJpbmcgdG8gbWF0Y2guCisgICAgaWYgKG1lbWNtcChOYW1lLmRhdGEoKSswLCAibm91bnJvbGwiLCA4KSAhPSAwKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkFUX0xvb3BIaW50OwkgLy8gIm5vdW5yb2xsIgorICB9CisgIH0KKyAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OlVua25vd25BdHRyaWJ1dGU7Cit9CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0F0dHJQYXJzZWRBdHRyTGlzdC5pbmMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0F0dHJQYXJzZWRBdHRyTGlzdC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiNjZlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvQXR0clBhcnNlZEF0dHJMaXN0LmluYwpAQCAtMCwwICsxLDI0NiBAQAorLyo9PT0tIFRhYmxlR2VuJ2VyYXRlZCBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBMaXN0IG9mIGFsbCBhdHRyaWJ1dGVzIHRoYXQgQ2xhbmcgcmVjb2duaXplcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGUsIGRvIG5vdCBlZGl0ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBQQVJTRURfQVRUUgorI2RlZmluZSBQQVJTRURfQVRUUihOQU1FKSBOQU1FCisjZW5kaWYKKworUEFSU0VEX0FUVFIoQU1ER1BVRmxhdFdvcmtHcm91cFNpemUpCitQQVJTRURfQVRUUihBTURHUFVOdW1TR1BSKQorUEFSU0VEX0FUVFIoQU1ER1BVTnVtVkdQUikKK1BBUlNFRF9BVFRSKEFNREdQVVdhdmVzUGVyRVUpCitQQVJTRURfQVRUUihJbnRlcnJ1cHQpCitQQVJTRURfQVRUUihBVlJTaWduYWwpCitQQVJTRURfQVRUUihBYmlUYWcpCitQQVJTRURfQVRUUihBY3F1aXJlQ2FwYWJpbGl0eSkKK1BBUlNFRF9BVFRSKEFjcXVpcmVkQWZ0ZXIpCitQQVJTRURfQVRUUihBY3F1aXJlZEJlZm9yZSkKK1BBUlNFRF9BVFRSKEFkZHJlc3NTcGFjZSkKK1BBUlNFRF9BVFRSKEFsaWFzKQorUEFSU0VEX0FUVFIoQWxpZ25WYWx1ZSkKK1BBUlNFRF9BVFRSKEFsaWduZWQpCitQQVJTRURfQVRUUihBbGxvY0FsaWduKQorUEFSU0VEX0FUVFIoQWxsb2NTaXplKQorUEFSU0VEX0FUVFIoQWx3YXlzSW5saW5lKQorUEFSU0VEX0FUVFIoQW5hbHl6ZXJOb1JldHVybikKK1BBUlNFRF9BVFRSKEFubm90YXRlKQorUEFSU0VEX0FUVFIoQW55WDg2Tm9DYWxsZXJTYXZlZFJlZ2lzdGVycykKK1BBUlNFRF9BVFRSKEFueVg4Nk5vQ2ZDaGVjaykKK1BBUlNFRF9BVFRSKEFyY1dlYWtyZWZVbmF2YWlsYWJsZSkKK1BBUlNFRF9BVFRSKEFyZ3VtZW50V2l0aFR5cGVUYWcpCitQQVJTRURfQVRUUihBcnRpZmljaWFsKQorUEFSU0VEX0FUVFIoQXNzZXJ0Q2FwYWJpbGl0eSkKK1BBUlNFRF9BVFRSKEFzc2VydEV4Y2x1c2l2ZUxvY2spCitQQVJTRURfQVRUUihBc3NlcnRTaGFyZWRMb2NrKQorUEFSU0VEX0FUVFIoQXNzdW1lQWxpZ25lZCkKK1BBUlNFRF9BVFRSKEF2YWlsYWJpbGl0eSkKK1BBUlNFRF9BVFRSKEJsb2NrcykKK1BBUlNFRF9BVFRSKENEZWNsKQorUEFSU0VEX0FUVFIoQ0ZBdWRpdGVkVHJhbnNmZXIpCitQQVJTRURfQVRUUihDRkNvbnN1bWVkKQorUEFSU0VEX0FUVFIoQ0ZSZXR1cm5zTm90UmV0YWluZWQpCitQQVJTRURfQVRUUihDRlJldHVybnNSZXRhaW5lZCkKK1BBUlNFRF9BVFRSKENGVW5rbm93blRyYW5zZmVyKQorUEFSU0VEX0FUVFIoQ1VEQUNvbnN0YW50KQorUEFSU0VEX0FUVFIoQ1VEQURldmljZSkKK1BBUlNFRF9BVFRSKENVREFHbG9iYWwpCitQQVJTRURfQVRUUihDVURBSG9zdCkKK1BBUlNFRF9BVFRSKENVREFJbnZhbGlkVGFyZ2V0KQorUEFSU0VEX0FUVFIoQ1VEQUxhdW5jaEJvdW5kcykKK1BBUlNFRF9BVFRSKENVREFTaGFyZWQpCitQQVJTRURfQVRUUihDWFgxMU5vUmV0dXJuKQorUEFSU0VEX0FUVFIoQ2FsbGFibGVXaGVuKQorUEFSU0VEX0FUVFIoQ2FwYWJpbGl0eSkKK1BBUlNFRF9BVFRSKENhcnJpZXNEZXBlbmRlbmN5KQorUEFSU0VEX0FUVFIoQ2xlYW51cCkKK1BBUlNFRF9BVFRSKENvbGQpCitQQVJTRURfQVRUUihDb21tb24pCitQQVJTRURfQVRUUihDb25zdCkKK1BBUlNFRF9BVFRSKENvbnN0cnVjdG9yKQorUEFSU0VEX0FUVFIoQ29uc3VtYWJsZSkKK1BBUlNFRF9BVFRSKENvbnN1bWFibGVBdXRvQ2FzdCkKK1BBUlNFRF9BVFRSKENvbnN1bWFibGVTZXRPblJlYWQpCitQQVJTRURfQVRUUihDb252ZXJnZW50KQorUEFSU0VEX0FUVFIoRExMRXhwb3J0KQorUEFSU0VEX0FUVFIoRExMSW1wb3J0KQorUEFSU0VEX0FUVFIoRGVwcmVjYXRlZCkKK1BBUlNFRF9BVFRSKERlc3RydWN0b3IpCitQQVJTRURfQVRUUihEaWFnbm9zZUlmKQorUEFSU0VEX0FUVFIoRGlzYWJsZVRhaWxDYWxscykKK1BBUlNFRF9BVFRSKEVtcHR5QmFzZXMpCitQQVJTRURfQVRUUihFbmFibGVJZikKK1BBUlNFRF9BVFRSKEVudW1FeHRlbnNpYmlsaXR5KQorUEFSU0VEX0FUVFIoRXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uKQorUEFSU0VEX0FUVFIoRXh0VmVjdG9yVHlwZSkKK1BBUlNFRF9BVFRSKEV4dGVybmFsU291cmNlU3ltYm9sKQorUEFSU0VEX0FUVFIoRmFsbFRocm91Z2gpCitQQVJTRURfQVRUUihGYXN0Q2FsbCkKK1BBUlNFRF9BVFRSKEZsYWdFbnVtKQorUEFSU0VEX0FUVFIoRmxhdHRlbikKK1BBUlNFRF9BVFRSKEZvcm1hdCkKK1BBUlNFRF9BVFRSKEZvcm1hdEFyZykKK1BBUlNFRF9BVFRSKEdOVUlubGluZSkKK1BBUlNFRF9BVFRSKEd1YXJkZWRCeSkKK1BBUlNFRF9BVFRSKEd1YXJkZWRWYXIpCitQQVJTRURfQVRUUihIb3QpCitQQVJTRURfQVRUUihJQkFjdGlvbikKK1BBUlNFRF9BVFRSKElCT3V0bGV0KQorUEFSU0VEX0FUVFIoSUJPdXRsZXRDb2xsZWN0aW9uKQorUEFSU0VEX0FUVFIoSUZ1bmMpCitQQVJTRURfQVRUUihJbml0UHJpb3JpdHkpCitQQVJTRURfQVRUUihJbnRlbE9jbEJpY2MpCitQQVJTRURfQVRUUihJbnRlcm5hbExpbmthZ2UpCitQQVJTRURfQVRUUihMVE9WaXNpYmlsaXR5UHVibGljKQorUEFSU0VEX0FUVFIoTGF5b3V0VmVyc2lvbikKK1BBUlNFRF9BVFRSKExvY2tSZXR1cm5lZCkKK1BBUlNFRF9BVFRSKExvY2thYmxlKQorUEFSU0VEX0FUVFIoTG9ja3NFeGNsdWRlZCkKK1BBUlNFRF9BVFRSKExvb3BIaW50KQorUEFSU0VEX0FUVFIoTVNBQkkpCitQQVJTRURfQVRUUihNU0luaGVyaXRhbmNlKQorUEFSU0VEX0FUVFIoTVNOb1ZUYWJsZSkKK1BBUlNFRF9BVFRSKE1TU3RydWN0KQorUEFSU0VEX0FUVFIoTWF5QWxpYXMpCitQQVJTRURfQVRUUihNaWNyb01pcHMpCitQQVJTRURfQVRUUihNaW5TaXplKQorUEFSU0VEX0FUVFIoTWlwczE2KQorUEFSU0VEX0FUVFIoTWlwc0xvbmdDYWxsKQorUEFSU0VEX0FUVFIoTWlwc1Nob3J0Q2FsbCkKK1BBUlNFRF9BVFRSKE1vZGUpCitQQVJTRURfQVRUUihOU0NvbnN1bWVkKQorUEFSU0VEX0FUVFIoTlNDb25zdW1lc1NlbGYpCitQQVJTRURfQVRUUihOU1JldHVybnNBdXRvcmVsZWFzZWQpCitQQVJTRURfQVRUUihOU1JldHVybnNOb3RSZXRhaW5lZCkKK1BBUlNFRF9BVFRSKE5TUmV0dXJuc1JldGFpbmVkKQorUEFSU0VEX0FUVFIoTmFrZWQpCitQQVJTRURfQVRUUihOZW9uUG9seVZlY3RvclR5cGUpCitQQVJTRURfQVRUUihOZW9uVmVjdG9yVHlwZSkKK1BBUlNFRF9BVFRSKE5vQWxpYXMpCitQQVJTRURfQVRUUihOb0NvbW1vbikKK1BBUlNFRF9BVFRSKE5vRGVidWcpCitQQVJTRURfQVRUUihOb0R1cGxpY2F0ZSkKK1BBUlNFRF9BVFRSKE5vRXNjYXBlKQorUEFSU0VEX0FUVFIoTm9JbmxpbmUpCitQQVJTRURfQVRUUihOb0luc3RydW1lbnRGdW5jdGlvbikKK1BBUlNFRF9BVFRSKE5vTWljcm9NaXBzKQorUEFSU0VEX0FUVFIoTm9NaXBzMTYpCitQQVJTRURfQVRUUihOb1JldHVybikKK1BBUlNFRF9BVFRSKE5vU2FuaXRpemUpCitQQVJTRURfQVRUUihOb1Nhbml0aXplU3BlY2lmaWMpCitQQVJTRURfQVRUUihOb1NwbGl0U3RhY2spCitQQVJTRURfQVRUUihOb1RocmVhZFNhZmV0eUFuYWx5c2lzKQorUEFSU0VEX0FUVFIoTm9UaHJvdykKK1BBUlNFRF9BVFRSKE5vbk51bGwpCitQQVJTRURfQVRUUihOb3RUYWlsQ2FsbGVkKQorUEFSU0VEX0FUVFIoT2JqQ0JveGFibGUpCitQQVJTRURfQVRUUihPYmpDQnJpZGdlKQorUEFSU0VEX0FUVFIoT2JqQ0JyaWRnZU11dGFibGUpCitQQVJTRURfQVRUUihPYmpDQnJpZGdlUmVsYXRlZCkKK1BBUlNFRF9BVFRSKE9iakNEZXNpZ25hdGVkSW5pdGlhbGl6ZXIpCitQQVJTRURfQVRUUihPYmpDRXhjZXB0aW9uKQorUEFSU0VEX0FUVFIoT2JqQ0V4cGxpY2l0UHJvdG9jb2xJbXBsKQorUEFSU0VEX0FUVFIoT2JqQ0dDKQorUEFSU0VEX0FUVFIoT2JqQ0luZGVwZW5kZW50Q2xhc3MpCitQQVJTRURfQVRUUihPYmpDS2luZE9mKQorUEFSU0VEX0FUVFIoT2JqQ01ldGhvZEZhbWlseSkKK1BBUlNFRF9BVFRSKE9iakNOU09iamVjdCkKK1BBUlNFRF9BVFRSKE9iakNPd25lcnNoaXApCitQQVJTRURfQVRUUihPYmpDUHJlY2lzZUxpZmV0aW1lKQorUEFSU0VEX0FUVFIoT2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzKQorUEFSU0VEX0FUVFIoT2JqQ1JlcXVpcmVzU3VwZXIpCitQQVJTRURfQVRUUihPYmpDUmV0dXJuc0lubmVyUG9pbnRlcikKK1BBUlNFRF9BVFRSKE9iakNSb290Q2xhc3MpCitQQVJTRURfQVRUUihPYmpDUnVudGltZU5hbWUpCitQQVJTRURfQVRUUihPYmpDUnVudGltZVZpc2libGUpCitQQVJTRURfQVRUUihPYmpDU3ViY2xhc3NpbmdSZXN0cmljdGVkKQorUEFSU0VEX0FUVFIoT3BlbkNMQWNjZXNzKQorUEFSU0VEX0FUVFIoT3BlbkNMQ29uc3RhbnRBZGRyZXNzU3BhY2UpCitQQVJTRURfQVRUUihPcGVuQ0xHZW5lcmljQWRkcmVzc1NwYWNlKQorUEFSU0VEX0FUVFIoT3BlbkNMR2xvYmFsQWRkcmVzc1NwYWNlKQorUEFSU0VEX0FUVFIoT3BlbkNMSW50ZWxSZXFkU3ViR3JvdXBTaXplKQorUEFSU0VEX0FUVFIoT3BlbkNMS2VybmVsKQorUEFSU0VEX0FUVFIoT3BlbkNMTG9jYWxBZGRyZXNzU3BhY2UpCitQQVJTRURfQVRUUihPcGVuQ0xOb1NWTSkKK1BBUlNFRF9BVFRSKE9wZW5DTFByaXZhdGVBZGRyZXNzU3BhY2UpCitQQVJTRURfQVRUUihPcGVuQ0xVbnJvbGxIaW50KQorUEFSU0VEX0FUVFIoT3B0aW1pemVOb25lKQorUEFSU0VEX0FUVFIoT3ZlcmxvYWRhYmxlKQorUEFSU0VEX0FUVFIoT3duZXJzaGlwKQorUEFSU0VEX0FUVFIoUGFja2VkKQorUEFSU0VEX0FUVFIoUGFyYW1UeXBlc3RhdGUpCitQQVJTRURfQVRUUihQYXNjYWwpCitQQVJTRURfQVRUUihQYXNzT2JqZWN0U2l6ZSkKK1BBUlNFRF9BVFRSKFBjcykKK1BBUlNFRF9BVFRSKFByYWdtYUNsYW5nQlNTU2VjdGlvbikKK1BBUlNFRF9BVFRSKFByYWdtYUNsYW5nRGF0YVNlY3Rpb24pCitQQVJTRURfQVRUUihQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb24pCitQQVJTRURfQVRUUihQcmFnbWFDbGFuZ1RleHRTZWN0aW9uKQorUEFSU0VEX0FUVFIoUHJlc2VydmVBbGwpCitQQVJTRURfQVRUUihQcmVzZXJ2ZU1vc3QpCitQQVJTRURfQVRUUihQdEd1YXJkZWRCeSkKK1BBUlNFRF9BVFRSKFB0R3VhcmRlZFZhcikKK1BBUlNFRF9BVFRSKFB0cjMyKQorUEFSU0VEX0FUVFIoUHRyNjQpCitQQVJTRURfQVRUUihQdXJlKQorUEFSU0VEX0FUVFIoUmVnQ2FsbCkKK1BBUlNFRF9BVFRSKFJlZ3Bhcm0pCitQQVJTRURfQVRUUihSZWxlYXNlQ2FwYWJpbGl0eSkKK1BBUlNFRF9BVFRSKFJlbmRlclNjcmlwdEtlcm5lbCkKK1BBUlNFRF9BVFRSKFJlcWRXb3JrR3JvdXBTaXplKQorUEFSU0VEX0FUVFIoUmVxdWlyZUNvbnN0YW50SW5pdCkKK1BBUlNFRF9BVFRSKFJlcXVpcmVzQ2FwYWJpbGl0eSkKK1BBUlNFRF9BVFRSKFJlc3RyaWN0KQorUEFSU0VEX0FUVFIoUmV0dXJuVHlwZXN0YXRlKQorUEFSU0VEX0FUVFIoUmV0dXJuc05vbk51bGwpCitQQVJTRURfQVRUUihSZXR1cm5zVHdpY2UpCitQQVJTRURfQVRUUihTUHRyKQorUEFSU0VEX0FUVFIoU2NvcGVkTG9ja2FibGUpCitQQVJTRURfQVRUUihTZWN0aW9uKQorUEFSU0VEX0FUVFIoU2VsZWN0QW55KQorUEFSU0VEX0FUVFIoU2VudGluZWwpCitQQVJTRURfQVRUUihTZXRUeXBlc3RhdGUpCitQQVJTRURfQVRUUihTaGFyZWRUcnlsb2NrRnVuY3Rpb24pCitQQVJTRURfQVRUUihTdGRDYWxsKQorUEFSU0VEX0FUVFIoU3VwcHJlc3MpCitQQVJTRURfQVRUUihTd2lmdENhbGwpCitQQVJTRURfQVRUUihTd2lmdENvbnRleHQpCitQQVJTRURfQVRUUihTd2lmdEVycm9yUmVzdWx0KQorUEFSU0VEX0FUVFIoU3dpZnRJbmRpcmVjdFJlc3VsdCkKK1BBUlNFRF9BVFRSKFN5c1ZBQkkpCitQQVJTRURfQVRUUihUTFNNb2RlbCkKK1BBUlNFRF9BVFRSKFRhcmdldCkKK1BBUlNFRF9BVFRSKFRlc3RUeXBlc3RhdGUpCitQQVJTRURfQVRUUihUaGlzQ2FsbCkKK1BBUlNFRF9BVFRSKFRocmVhZCkKK1BBUlNFRF9BVFRSKFRyYW5zcGFyZW50VW5pb24pCitQQVJTRURfQVRUUihUcml2aWFsQUJJKQorUEFSU0VEX0FUVFIoVHJ5QWNxdWlyZUNhcGFiaWxpdHkpCitQQVJTRURfQVRUUihUeXBlTm9uTnVsbCkKK1BBUlNFRF9BVFRSKFR5cGVOdWxsVW5zcGVjaWZpZWQpCitQQVJTRURfQVRUUihUeXBlTnVsbGFibGUpCitQQVJTRURfQVRUUihUeXBlVGFnRm9yRGF0YXR5cGUpCitQQVJTRURfQVRUUihUeXBlVmlzaWJpbGl0eSkKK1BBUlNFRF9BVFRSKFVQdHIpCitQQVJTRURfQVRUUihVbmF2YWlsYWJsZSkKK1BBUlNFRF9BVFRSKFVudXNlZCkKK1BBUlNFRF9BVFRSKFVzZWQpCitQQVJTRURfQVRUUihVdWlkKQorUEFSU0VEX0FUVFIoVmVjUmV0dXJuKQorUEFSU0VEX0FUVFIoVmVjVHlwZUhpbnQpCitQQVJTRURfQVRUUihWZWN0b3JDYWxsKQorUEFSU0VEX0FUVFIoVmVjdG9yU2l6ZSkKK1BBUlNFRF9BVFRSKFZpc2liaWxpdHkpCitQQVJTRURfQVRUUihXYXJuVW51c2VkKQorUEFSU0VEX0FUVFIoV2FyblVudXNlZFJlc3VsdCkKK1BBUlNFRF9BVFRSKFdlYWspCitQQVJTRURfQVRUUihXZWFrSW1wb3J0KQorUEFSU0VEX0FUVFIoV2Vha1JlZikKK1BBUlNFRF9BVFRSKFdvcmtHcm91cFNpemVIaW50KQorUEFSU0VEX0FUVFIoWDg2Rm9yY2VBbGlnbkFyZ1BvaW50ZXIpCitQQVJTRURfQVRUUihYUmF5SW5zdHJ1bWVudCkKK1BBUlNFRF9BVFRSKFhSYXlMb2dBcmdzKQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9BdHRyU3BlbGxpbmdMaXN0SW5kZXguaW5jIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9BdHRyU3BlbGxpbmdMaXN0SW5kZXguaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YzI4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0F0dHJTcGVsbGluZ0xpc3RJbmRleC5pbmMKQEAgLTAsMCArMSwxODc1IEBACisvKj09PS0gVGFibGVHZW4nZXJhdGVkIGZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIENvZGUgdG8gdHJhbnNsYXRlIGRpZmZlcmVudCBhdHRyaWJ1dGUgc3BlbGxpbmdzIGludG8gaW50ZXJuYWwgaWRlbnRpZmllcnMgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZSwgZG8gbm90IGVkaXQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisgIHN3aXRjaCAoQXR0cktpbmQpIHsKKyAgY2FzZSBBVF9BTURHUFVGbGF0V29ya0dyb3VwU2l6ZTogeworICAgIGlmIChOYW1lID09ICJhbWRncHVfZmxhdF93b3JrX2dyb3VwX3NpemUiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImFtZGdwdV9mbGF0X3dvcmtfZ3JvdXBfc2l6ZSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQU1ER1BVTnVtU0dQUjogeworICAgIGlmIChOYW1lID09ICJhbWRncHVfbnVtX3NncHIiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImFtZGdwdV9udW1fc2dwciIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQU1ER1BVTnVtVkdQUjogeworICAgIGlmIChOYW1lID09ICJhbWRncHVfbnVtX3ZncHIiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImFtZGdwdV9udW1fdmdwciIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQU1ER1BVV2F2ZXNQZXJFVTogeworICAgIGlmIChOYW1lID09ICJhbWRncHVfd2F2ZXNfcGVyX2V1IiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJhbWRncHVfd2F2ZXNfcGVyX2V1IiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9JbnRlcnJ1cHQ6IHsKKyAgICBpZiAoTmFtZSA9PSAiaW50ZXJydXB0IiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJpbnRlcnJ1cHQiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9BVlJTaWduYWw6IHsKKyAgICBpZiAoTmFtZSA9PSAic2lnbmFsIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJzaWduYWwiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9BYmlUYWc6IHsKKyAgICBpZiAoTmFtZSA9PSAiYWJpX3RhZyIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiYWJpX3RhZyIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0FjcXVpcmVDYXBhYmlsaXR5OiB7CisgICAgaWYgKE5hbWUgPT0gImFjcXVpcmVfY2FwYWJpbGl0eSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiYWNxdWlyZV9jYXBhYmlsaXR5IiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gImFjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgaWYgKE5hbWUgPT0gImFjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMzsKKyAgICBpZiAoTmFtZSA9PSAiZXhjbHVzaXZlX2xvY2tfZnVuY3Rpb24iICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgaWYgKE5hbWUgPT0gInNoYXJlZF9sb2NrX2Z1bmN0aW9uIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiA1OworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQWNxdWlyZWRBZnRlcjogeworICAgIGlmIChOYW1lID09ICJhY3F1aXJlZF9hZnRlciIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0FjcXVpcmVkQmVmb3JlOiB7CisgICAgaWYgKE5hbWUgPT0gImFjcXVpcmVkX2JlZm9yZSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0FkZHJlc3NTcGFjZTogeworICAgIGlmIChOYW1lID09ICJhZGRyZXNzX3NwYWNlIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJhZGRyZXNzX3NwYWNlIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gImFkZHJlc3Nfc3BhY2UiICYmIFN5bnRheFVzZWQgPT0gMiAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0FsaWFzOiB7CisgICAgaWYgKE5hbWUgPT0gImFsaWFzIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJhbGlhcyIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0FsaWduVmFsdWU6IHsKKyAgICBpZiAoTmFtZSA9PSAiYWxpZ25fdmFsdWUiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9BbGlnbmVkOiB7CisgICAgaWYgKE5hbWUgPT0gImFsaWduZWQiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImFsaWduZWQiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gImFsaWduIiAmJiBTeW50YXhVc2VkID09IDMgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAyOworICAgIGlmIChOYW1lID09ICJhbGlnbmFzIiAmJiBTeW50YXhVc2VkID09IDUgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAzOworICAgIGlmIChOYW1lID09ICJfQWxpZ25hcyIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gNDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0FsbG9jQWxpZ246IHsKKyAgICBpZiAoTmFtZSA9PSAiYWxsb2NfYWxpZ24iICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImFsbG9jX2FsaWduIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQWxsb2NTaXplOiB7CisgICAgaWYgKE5hbWUgPT0gImFsbG9jX3NpemUiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImFsbG9jX3NpemUiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9BbHdheXNJbmxpbmU6IHsKKyAgICBpZiAoTmFtZSA9PSAiYWx3YXlzX2lubGluZSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiYWx3YXlzX2lubGluZSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAiX19mb3JjZWlubGluZSIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0FuYWx5emVyTm9SZXR1cm46IHsKKyAgICBpZiAoTmFtZSA9PSAiYW5hbHl6ZXJfbm9yZXR1cm4iICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9Bbm5vdGF0ZTogeworICAgIGlmIChOYW1lID09ICJhbm5vdGF0ZSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiYW5ub3RhdGUiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAiYW5ub3RhdGUiICYmIFN5bnRheFVzZWQgPT0gMiAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0FueVg4Nk5vQ2FsbGVyU2F2ZWRSZWdpc3RlcnM6IHsKKyAgICBpZiAoTmFtZSA9PSAibm9fY2FsbGVyX3NhdmVkX3JlZ2lzdGVycyIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAibm9fY2FsbGVyX3NhdmVkX3JlZ2lzdGVycyIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0FueVg4Nk5vQ2ZDaGVjazogeworICAgIGlmIChOYW1lID09ICJub2NmX2NoZWNrIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJub2NmX2NoZWNrIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQXJjV2Vha3JlZlVuYXZhaWxhYmxlOiB7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfYXJjX3dlYWtfcmVmZXJlbmNlX3VuYXZhaWxhYmxlIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJvYmpjX2FyY193ZWFrX3JlZmVyZW5jZV91bmF2YWlsYWJsZSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJvYmpjX2FyY193ZWFrX3JlZmVyZW5jZV91bmF2YWlsYWJsZSIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQXJndW1lbnRXaXRoVHlwZVRhZzogeworICAgIGlmIChOYW1lID09ICJhcmd1bWVudF93aXRoX3R5cGVfdGFnIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJhcmd1bWVudF93aXRoX3R5cGVfdGFnIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gImFyZ3VtZW50X3dpdGhfdHlwZV90YWciICYmIFN5bnRheFVzZWQgPT0gMiAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMjsKKyAgICBpZiAoTmFtZSA9PSAicG9pbnRlcl93aXRoX3R5cGVfdGFnIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAzOworICAgIGlmIChOYW1lID09ICJwb2ludGVyX3dpdGhfdHlwZV90YWciICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gNDsKKyAgICBpZiAoTmFtZSA9PSAicG9pbnRlcl93aXRoX3R5cGVfdGFnIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDU7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9BcnRpZmljaWFsOiB7CisgICAgaWYgKE5hbWUgPT0gImFydGlmaWNpYWwiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImFydGlmaWNpYWwiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9Bc3NlcnRDYXBhYmlsaXR5OiB7CisgICAgaWYgKE5hbWUgPT0gImFzc2VydF9jYXBhYmlsaXR5IiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJhc3NlcnRfY2FwYWJpbGl0eSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJhc3NlcnRfc2hhcmVkX2NhcGFiaWxpdHkiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgaWYgKE5hbWUgPT0gImFzc2VydF9zaGFyZWRfY2FwYWJpbGl0eSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAzOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQXNzZXJ0RXhjbHVzaXZlTG9jazogeworICAgIGlmIChOYW1lID09ICJhc3NlcnRfZXhjbHVzaXZlX2xvY2siICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9Bc3NlcnRTaGFyZWRMb2NrOiB7CisgICAgaWYgKE5hbWUgPT0gImFzc2VydF9zaGFyZWRfbG9jayIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0Fzc3VtZUFsaWduZWQ6IHsKKyAgICBpZiAoTmFtZSA9PSAiYXNzdW1lX2FsaWduZWQiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImFzc3VtZV9hbGlnbmVkIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQXZhaWxhYmlsaXR5OiB7CisgICAgaWYgKE5hbWUgPT0gImF2YWlsYWJpbGl0eSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiYXZhaWxhYmlsaXR5IiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gImF2YWlsYWJpbGl0eSIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQmxvY2tzOiB7CisgICAgaWYgKE5hbWUgPT0gImJsb2NrcyIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiYmxvY2tzIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gImJsb2NrcyIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQ0RlY2w6IHsKKyAgICBpZiAoTmFtZSA9PSAiY2RlY2wiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImNkZWNsIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJfX2NkZWNsIiAmJiBTeW50YXhVc2VkID09IDUgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAyOworICAgIGlmIChOYW1lID09ICJfY2RlY2wiICYmIFN5bnRheFVzZWQgPT0gNSAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDM7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9DRkF1ZGl0ZWRUcmFuc2ZlcjogeworICAgIGlmIChOYW1lID09ICJjZl9hdWRpdGVkX3RyYW5zZmVyIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJjZl9hdWRpdGVkX3RyYW5zZmVyIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gImNmX2F1ZGl0ZWRfdHJhbnNmZXIiICYmIFN5bnRheFVzZWQgPT0gMiAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0NGQ29uc3VtZWQ6IHsKKyAgICBpZiAoTmFtZSA9PSAiY2ZfY29uc3VtZWQiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImNmX2NvbnN1bWVkIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gImNmX2NvbnN1bWVkIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9DRlJldHVybnNOb3RSZXRhaW5lZDogeworICAgIGlmIChOYW1lID09ICJjZl9yZXR1cm5zX25vdF9yZXRhaW5lZCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiY2ZfcmV0dXJuc19ub3RfcmV0YWluZWQiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAiY2ZfcmV0dXJuc19ub3RfcmV0YWluZWQiICYmIFN5bnRheFVzZWQgPT0gMiAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0NGUmV0dXJuc1JldGFpbmVkOiB7CisgICAgaWYgKE5hbWUgPT0gImNmX3JldHVybnNfcmV0YWluZWQiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImNmX3JldHVybnNfcmV0YWluZWQiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAiY2ZfcmV0dXJuc19yZXRhaW5lZCIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQ0ZVbmtub3duVHJhbnNmZXI6IHsKKyAgICBpZiAoTmFtZSA9PSAiY2ZfdW5rbm93bl90cmFuc2ZlciIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiY2ZfdW5rbm93bl90cmFuc2ZlciIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJjZl91bmtub3duX3RyYW5zZmVyIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9DVURBQ29uc3RhbnQ6IHsKKyAgICBpZiAoTmFtZSA9PSAiY29uc3RhbnQiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIl9fY29uc3RhbnRfXyIgJiYgU3ludGF4VXNlZCA9PSAzICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0NVREFEZXZpY2U6IHsKKyAgICBpZiAoTmFtZSA9PSAiZGV2aWNlIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJfX2RldmljZV9fIiAmJiBTeW50YXhVc2VkID09IDMgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQ1VEQUdsb2JhbDogeworICAgIGlmIChOYW1lID09ICJnbG9iYWwiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIl9fZ2xvYmFsX18iICYmIFN5bnRheFVzZWQgPT0gMyAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9DVURBSG9zdDogeworICAgIGlmIChOYW1lID09ICJob3N0IiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJfX2hvc3RfXyIgJiYgU3ludGF4VXNlZCA9PSAzICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0NVREFJbnZhbGlkVGFyZ2V0OiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9DVURBTGF1bmNoQm91bmRzOiB7CisgICAgaWYgKE5hbWUgPT0gImxhdW5jaF9ib3VuZHMiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIl9fbGF1bmNoX2JvdW5kc19fIiAmJiBTeW50YXhVc2VkID09IDMgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQ1VEQVNoYXJlZDogeworICAgIGlmIChOYW1lID09ICJzaGFyZWQiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIl9fc2hhcmVkX18iICYmIFN5bnRheFVzZWQgPT0gMyAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9DWFgxMU5vUmV0dXJuOiB7CisgICAgaWYgKE5hbWUgPT0gIm5vcmV0dXJuIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQ2FsbGFibGVXaGVuOiB7CisgICAgaWYgKE5hbWUgPT0gImNhbGxhYmxlX3doZW4iICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImNhbGxhYmxlX3doZW4iICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0NhcGFiaWxpdHk6IHsKKyAgICBpZiAoTmFtZSA9PSAiY2FwYWJpbGl0eSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiY2FwYWJpbGl0eSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJzaGFyZWRfY2FwYWJpbGl0eSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMjsKKyAgICBpZiAoTmFtZSA9PSAic2hhcmVkX2NhcGFiaWxpdHkiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMzsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0NhcnJpZXNEZXBlbmRlbmN5OiB7CisgICAgaWYgKE5hbWUgPT0gImNhcnJpZXNfZGVwZW5kZW5jeSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiY2Fycmllc19kZXBlbmRlbmN5IiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQ2xlYW51cDogeworICAgIGlmIChOYW1lID09ICJjbGVhbnVwIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJjbGVhbnVwIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQ29sZDogeworICAgIGlmIChOYW1lID09ICJjb2xkIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJjb2xkIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQ29tbW9uOiB7CisgICAgaWYgKE5hbWUgPT0gImNvbW1vbiIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiY29tbW9uIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQ29uc3Q6IHsKKyAgICBpZiAoTmFtZSA9PSAiY29uc3QiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImNvbnN0IiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJfX2NvbnN0IiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAyOworICAgIGlmIChOYW1lID09ICJfX2NvbnN0IiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAzOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQ29uc3RydWN0b3I6IHsKKyAgICBpZiAoTmFtZSA9PSAiY29uc3RydWN0b3IiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImNvbnN0cnVjdG9yIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfQ29uc3VtYWJsZTogeworICAgIGlmIChOYW1lID09ICJjb25zdW1hYmxlIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJjb25zdW1hYmxlIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9Db25zdW1hYmxlQXV0b0Nhc3Q6IHsKKyAgICBpZiAoTmFtZSA9PSAiY29uc3VtYWJsZV9hdXRvX2Nhc3Rfc3RhdGUiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImNvbnN1bWFibGVfYXV0b19jYXN0X3N0YXRlIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9Db25zdW1hYmxlU2V0T25SZWFkOiB7CisgICAgaWYgKE5hbWUgPT0gImNvbnN1bWFibGVfc2V0X3N0YXRlX29uX3JlYWQiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImNvbnN1bWFibGVfc2V0X3N0YXRlX29uX3JlYWQiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0NvbnZlcmdlbnQ6IHsKKyAgICBpZiAoTmFtZSA9PSAiY29udmVyZ2VudCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiY29udmVyZ2VudCIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJjb252ZXJnZW50IiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9ETExFeHBvcnQ6IHsKKyAgICBpZiAoTmFtZSA9PSAiZGxsZXhwb3J0IiAmJiBTeW50YXhVc2VkID09IDMgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJkbGxleHBvcnQiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gImRsbGV4cG9ydCIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0RMTEltcG9ydDogeworICAgIGlmIChOYW1lID09ICJkbGxpbXBvcnQiICYmIFN5bnRheFVzZWQgPT0gMyAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImRsbGltcG9ydCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAiZGxsaW1wb3J0IiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfRGVwcmVjYXRlZDogeworICAgIGlmIChOYW1lID09ICJkZXByZWNhdGVkIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJkZXByZWNhdGVkIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJkZXByZWNhdGVkIiAmJiBTeW50YXhVc2VkID09IDMgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAyOworICAgIGlmIChOYW1lID09ICJkZXByZWNhdGVkIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAzOworICAgIGlmIChOYW1lID09ICJkZXByZWNhdGVkIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiA0OworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfRGVzdHJ1Y3RvcjogeworICAgIGlmIChOYW1lID09ICJkZXN0cnVjdG9yIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJkZXN0cnVjdG9yIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfRGlhZ25vc2VJZjogeworICAgIGlmIChOYW1lID09ICJkaWFnbm9zZV9pZiIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0Rpc2FibGVUYWlsQ2FsbHM6IHsKKyAgICBpZiAoTmFtZSA9PSAiZGlzYWJsZV90YWlsX2NhbGxzIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJkaXNhYmxlX3RhaWxfY2FsbHMiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAiZGlzYWJsZV90YWlsX2NhbGxzIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9FbXB0eUJhc2VzOiB7CisgICAgaWYgKE5hbWUgPT0gImVtcHR5X2Jhc2VzIiAmJiBTeW50YXhVc2VkID09IDMgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfRW5hYmxlSWY6IHsKKyAgICBpZiAoTmFtZSA9PSAiZW5hYmxlX2lmIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfRW51bUV4dGVuc2liaWxpdHk6IHsKKyAgICBpZiAoTmFtZSA9PSAiZW51bV9leHRlbnNpYmlsaXR5IiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJlbnVtX2V4dGVuc2liaWxpdHkiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAiZW51bV9leHRlbnNpYmlsaXR5IiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9FeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb246IHsKKyAgICBpZiAoTmFtZSA9PSAiZXhjbHVzaXZlX3RyeWxvY2tfZnVuY3Rpb24iICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9FeHRWZWN0b3JUeXBlOiB7CisgICAgaWYgKE5hbWUgPT0gImV4dF92ZWN0b3JfdHlwZSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0V4dGVybmFsU291cmNlU3ltYm9sOiB7CisgICAgaWYgKE5hbWUgPT0gImV4dGVybmFsX3NvdXJjZV9zeW1ib2wiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImV4dGVybmFsX3NvdXJjZV9zeW1ib2wiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAiZXh0ZXJuYWxfc291cmNlX3N5bWJvbCIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfRmFsbFRocm91Z2g6IHsKKyAgICBpZiAoTmFtZSA9PSAiZmFsbHRocm91Z2giICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImZhbGx0aHJvdWdoIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJmYWxsdGhyb3VnaCIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfRmFzdENhbGw6IHsKKyAgICBpZiAoTmFtZSA9PSAiZmFzdGNhbGwiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImZhc3RjYWxsIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJfX2Zhc3RjYWxsIiAmJiBTeW50YXhVc2VkID09IDUgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAyOworICAgIGlmIChOYW1lID09ICJfZmFzdGNhbGwiICYmIFN5bnRheFVzZWQgPT0gNSAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDM7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9GbGFnRW51bTogeworICAgIGlmIChOYW1lID09ICJmbGFnX2VudW0iICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImZsYWdfZW51bSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJmbGFnX2VudW0iICYmIFN5bnRheFVzZWQgPT0gMiAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0ZsYXR0ZW46IHsKKyAgICBpZiAoTmFtZSA9PSAiZmxhdHRlbiIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiZmxhdHRlbiIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0Zvcm1hdDogeworICAgIGlmIChOYW1lID09ICJmb3JtYXQiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImZvcm1hdCIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0Zvcm1hdEFyZzogeworICAgIGlmIChOYW1lID09ICJmb3JtYXRfYXJnIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJmb3JtYXRfYXJnIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfR05VSW5saW5lOiB7CisgICAgaWYgKE5hbWUgPT0gImdudV9pbmxpbmUiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImdudV9pbmxpbmUiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9HdWFyZGVkQnk6IHsKKyAgICBpZiAoTmFtZSA9PSAiZ3VhcmRlZF9ieSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0d1YXJkZWRWYXI6IHsKKyAgICBpZiAoTmFtZSA9PSAiZ3VhcmRlZF92YXIiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImd1YXJkZWRfdmFyIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9Ib3Q6IHsKKyAgICBpZiAoTmFtZSA9PSAiaG90IiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJob3QiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9JQkFjdGlvbjogeworICAgIGlmIChOYW1lID09ICJpYmFjdGlvbiIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiaWJhY3Rpb24iICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAiaWJhY3Rpb24iICYmIFN5bnRheFVzZWQgPT0gMiAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0lCT3V0bGV0OiB7CisgICAgaWYgKE5hbWUgPT0gImlib3V0bGV0IiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJpYm91dGxldCIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJpYm91dGxldCIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfSUJPdXRsZXRDb2xsZWN0aW9uOiB7CisgICAgaWYgKE5hbWUgPT0gImlib3V0bGV0Y29sbGVjdGlvbiIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiaWJvdXRsZXRjb2xsZWN0aW9uIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gImlib3V0bGV0Y29sbGVjdGlvbiIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfSUZ1bmM6IHsKKyAgICBpZiAoTmFtZSA9PSAiaWZ1bmMiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImlmdW5jIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfSW5pdFByaW9yaXR5OiB7CisgICAgaWYgKE5hbWUgPT0gImluaXRfcHJpb3JpdHkiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImluaXRfcHJpb3JpdHkiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9JbnRlbE9jbEJpY2M6IHsKKyAgICBpZiAoTmFtZSA9PSAiaW50ZWxfb2NsX2JpY2MiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImludGVsX29jbF9iaWNjIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9JbnRlcm5hbExpbmthZ2U6IHsKKyAgICBpZiAoTmFtZSA9PSAiaW50ZXJuYWxfbGlua2FnZSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiaW50ZXJuYWxfbGlua2FnZSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJpbnRlcm5hbF9saW5rYWdlIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9MVE9WaXNpYmlsaXR5UHVibGljOiB7CisgICAgaWYgKE5hbWUgPT0gImx0b192aXNpYmlsaXR5X3B1YmxpYyIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAibHRvX3Zpc2liaWxpdHlfcHVibGljIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gImx0b192aXNpYmlsaXR5X3B1YmxpYyIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfTGF5b3V0VmVyc2lvbjogeworICAgIGlmIChOYW1lID09ICJsYXlvdXRfdmVyc2lvbiIgJiYgU3ludGF4VXNlZCA9PSAzICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX0xvY2tSZXR1cm5lZDogeworICAgIGlmIChOYW1lID09ICJsb2NrX3JldHVybmVkIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfTG9ja2FibGU6IHsKKyAgICBpZiAoTmFtZSA9PSAibG9ja2FibGUiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9Mb2Nrc0V4Y2x1ZGVkOiB7CisgICAgaWYgKE5hbWUgPT0gImxvY2tzX2V4Y2x1ZGVkIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfTG9vcEhpbnQ6IHsKKyAgICBpZiAoTmFtZSA9PSAibG9vcCIgJiYgU3ludGF4VXNlZCA9PSA2ICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJ1bnJvbGwiICYmIFN5bnRheFVzZWQgPT0gNiAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm5vdW5yb2xsIiAmJiBTeW50YXhVc2VkID09IDYgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfTVNBQkk6IHsKKyAgICBpZiAoTmFtZSA9PSAibXNfYWJpIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJtc19hYmkiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9NU0luaGVyaXRhbmNlOiB7CisgICAgaWYgKE5hbWUgPT0gIl9fc2luZ2xlX2luaGVyaXRhbmNlIiAmJiBTeW50YXhVc2VkID09IDUgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJfX211bHRpcGxlX2luaGVyaXRhbmNlIiAmJiBTeW50YXhVc2VkID09IDUgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJfX3ZpcnR1YWxfaW5oZXJpdGFuY2UiICYmIFN5bnRheFVzZWQgPT0gNSAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgaWYgKE5hbWUgPT0gIl9fdW5zcGVjaWZpZWRfaW5oZXJpdGFuY2UiICYmIFN5bnRheFVzZWQgPT0gNSAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDM7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9NU05vVlRhYmxlOiB7CisgICAgaWYgKE5hbWUgPT0gIm5vdnRhYmxlIiAmJiBTeW50YXhVc2VkID09IDMgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfTVNTdHJ1Y3Q6IHsKKyAgICBpZiAoTmFtZSA9PSAibXNfc3RydWN0IiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJtc19zdHJ1Y3QiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9NYXlBbGlhczogeworICAgIGlmIChOYW1lID09ICJtYXlfYWxpYXMiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIm1heV9hbGlhcyIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX01pY3JvTWlwczogeworICAgIGlmIChOYW1lID09ICJtaWNyb21pcHMiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIm1pY3JvbWlwcyIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX01pblNpemU6IHsKKyAgICBpZiAoTmFtZSA9PSAibWluc2l6ZSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAibWluc2l6ZSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJtaW5zaXplIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9NaXBzMTY6IHsKKyAgICBpZiAoTmFtZSA9PSAibWlwczE2IiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJtaXBzMTYiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9NaXBzTG9uZ0NhbGw6IHsKKyAgICBpZiAoTmFtZSA9PSAibG9uZ19jYWxsIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJsb25nX2NhbGwiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gImZhciIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMjsKKyAgICBpZiAoTmFtZSA9PSAiZmFyIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAzOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfTWlwc1Nob3J0Q2FsbDogeworICAgIGlmIChOYW1lID09ICJzaG9ydF9jYWxsIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJzaG9ydF9jYWxsIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJuZWFyIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAyOworICAgIGlmIChOYW1lID09ICJuZWFyIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAzOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfTW9kZTogeworICAgIGlmIChOYW1lID09ICJtb2RlIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJtb2RlIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfTlNDb25zdW1lZDogeworICAgIGlmIChOYW1lID09ICJuc19jb25zdW1lZCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAibnNfY29uc3VtZWQiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAibnNfY29uc3VtZWQiICYmIFN5bnRheFVzZWQgPT0gMiAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX05TQ29uc3VtZXNTZWxmOiB7CisgICAgaWYgKE5hbWUgPT0gIm5zX2NvbnN1bWVzX3NlbGYiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIm5zX2NvbnN1bWVzX3NlbGYiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAibnNfY29uc3VtZXNfc2VsZiIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfTlNSZXR1cm5zQXV0b3JlbGVhc2VkOiB7CisgICAgaWYgKE5hbWUgPT0gIm5zX3JldHVybnNfYXV0b3JlbGVhc2VkIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJuc19yZXR1cm5zX2F1dG9yZWxlYXNlZCIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJuc19yZXR1cm5zX2F1dG9yZWxlYXNlZCIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfTlNSZXR1cm5zTm90UmV0YWluZWQ6IHsKKyAgICBpZiAoTmFtZSA9PSAibnNfcmV0dXJuc19ub3RfcmV0YWluZWQiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIm5zX3JldHVybnNfbm90X3JldGFpbmVkIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm5zX3JldHVybnNfbm90X3JldGFpbmVkIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9OU1JldHVybnNSZXRhaW5lZDogeworICAgIGlmIChOYW1lID09ICJuc19yZXR1cm5zX3JldGFpbmVkIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJuc19yZXR1cm5zX3JldGFpbmVkIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm5zX3JldHVybnNfcmV0YWluZWQiICYmIFN5bnRheFVzZWQgPT0gMiAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX05ha2VkOiB7CisgICAgaWYgKE5hbWUgPT0gIm5ha2VkIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJuYWtlZCIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAibmFrZWQiICYmIFN5bnRheFVzZWQgPT0gMyAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9OZW9uUG9seVZlY3RvclR5cGU6IHsKKyAgICBpZiAoTmFtZSA9PSAibmVvbl9wb2x5dmVjdG9yX3R5cGUiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIm5lb25fcG9seXZlY3Rvcl90eXBlIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm5lb25fcG9seXZlY3Rvcl90eXBlIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9OZW9uVmVjdG9yVHlwZTogeworICAgIGlmIChOYW1lID09ICJuZW9uX3ZlY3Rvcl90eXBlIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJuZW9uX3ZlY3Rvcl90eXBlIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm5lb25fdmVjdG9yX3R5cGUiICYmIFN5bnRheFVzZWQgPT0gMiAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX05vQWxpYXM6IHsKKyAgICBpZiAoTmFtZSA9PSAibm9hbGlhcyIgJiYgU3ludGF4VXNlZCA9PSAzICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX05vQ29tbW9uOiB7CisgICAgaWYgKE5hbWUgPT0gIm5vY29tbW9uIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJub2NvbW1vbiIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX05vRGVidWc6IHsKKyAgICBpZiAoTmFtZSA9PSAibm9kZWJ1ZyIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAibm9kZWJ1ZyIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX05vRHVwbGljYXRlOiB7CisgICAgaWYgKE5hbWUgPT0gIm5vZHVwbGljYXRlIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJub2R1cGxpY2F0ZSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJub2R1cGxpY2F0ZSIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfTm9Fc2NhcGU6IHsKKyAgICBpZiAoTmFtZSA9PSAibm9lc2NhcGUiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIm5vZXNjYXBlIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm5vZXNjYXBlIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9Ob0lubGluZTogeworICAgIGlmIChOYW1lID09ICJub2lubGluZSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAibm9pbmxpbmUiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm5vaW5saW5lIiAmJiBTeW50YXhVc2VkID09IDMgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfTm9JbnN0cnVtZW50RnVuY3Rpb246IHsKKyAgICBpZiAoTmFtZSA9PSAibm9faW5zdHJ1bWVudF9mdW5jdGlvbiIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAibm9faW5zdHJ1bWVudF9mdW5jdGlvbiIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX05vTWljcm9NaXBzOiB7CisgICAgaWYgKE5hbWUgPT0gIm5vbWljcm9taXBzIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJub21pY3JvbWlwcyIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX05vTWlwczE2OiB7CisgICAgaWYgKE5hbWUgPT0gIm5vbWlwczE2IiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJub21pcHMxNiIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX05vUmV0dXJuOiB7CisgICAgaWYgKE5hbWUgPT0gIm5vcmV0dXJuIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJub3JldHVybiIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAibm9yZXR1cm4iICYmIFN5bnRheFVzZWQgPT0gMyAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9Ob1Nhbml0aXplOiB7CisgICAgaWYgKE5hbWUgPT0gIm5vX3Nhbml0aXplIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJub19zYW5pdGl6ZSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJub19zYW5pdGl6ZSIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfTm9TYW5pdGl6ZVNwZWNpZmljOiB7CisgICAgaWYgKE5hbWUgPT0gIm5vX2FkZHJlc3Nfc2FmZXR5X2FuYWx5c2lzIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJub19hZGRyZXNzX3NhZmV0eV9hbmFseXNpcyIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAibm9fc2FuaXRpemVfYWRkcmVzcyIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMjsKKyAgICBpZiAoTmFtZSA9PSAibm9fc2FuaXRpemVfYWRkcmVzcyIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMzsKKyAgICBpZiAoTmFtZSA9PSAibm9fc2FuaXRpemVfdGhyZWFkIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiA0OworICAgIGlmIChOYW1lID09ICJub19zYW5pdGl6ZV90aHJlYWQiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDU7CisgICAgaWYgKE5hbWUgPT0gIm5vX3Nhbml0aXplX21lbW9yeSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gNjsKKyAgICBpZiAoTmFtZSA9PSAibm9fc2FuaXRpemVfbWVtb3J5IiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDc7CisgICAgaWYgKE5hbWUgPT0gIm5vX3Nhbml0aXplX21lbW9yeSIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiA4OworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfTm9TcGxpdFN0YWNrOiB7CisgICAgaWYgKE5hbWUgPT0gIm5vX3NwbGl0X3N0YWNrIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJub19zcGxpdF9zdGFjayIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX05vVGhyZWFkU2FmZXR5QW5hbHlzaXM6IHsKKyAgICBpZiAoTmFtZSA9PSAibm9fdGhyZWFkX3NhZmV0eV9hbmFseXNpcyIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAibm9fdGhyZWFkX3NhZmV0eV9hbmFseXNpcyIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJub190aHJlYWRfc2FmZXR5X2FuYWx5c2lzIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9Ob1Rocm93OiB7CisgICAgaWYgKE5hbWUgPT0gIm5vdGhyb3ciICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIm5vdGhyb3ciICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm5vdGhyb3ciICYmIFN5bnRheFVzZWQgPT0gMyAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9Ob25OdWxsOiB7CisgICAgaWYgKE5hbWUgPT0gIm5vbm51bGwiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIm5vbm51bGwiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9Ob3RUYWlsQ2FsbGVkOiB7CisgICAgaWYgKE5hbWUgPT0gIm5vdF90YWlsX2NhbGxlZCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAibm90X3RhaWxfY2FsbGVkIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm5vdF90YWlsX2NhbGxlZCIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfT2JqQ0JveGFibGU6IHsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19ib3hhYmxlIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJvYmpjX2JveGFibGUiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19ib3hhYmxlIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9PYmpDQnJpZGdlOiB7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfYnJpZGdlIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJvYmpjX2JyaWRnZSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJvYmpjX2JyaWRnZSIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfT2JqQ0JyaWRnZU11dGFibGU6IHsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19icmlkZ2VfbXV0YWJsZSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19icmlkZ2VfbXV0YWJsZSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJvYmpjX2JyaWRnZV9tdXRhYmxlIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9PYmpDQnJpZGdlUmVsYXRlZDogeworICAgIGlmIChOYW1lID09ICJvYmpjX2JyaWRnZV9yZWxhdGVkIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJvYmpjX2JyaWRnZV9yZWxhdGVkIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfYnJpZGdlX3JlbGF0ZWQiICYmIFN5bnRheFVzZWQgPT0gMiAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX09iakNEZXNpZ25hdGVkSW5pdGlhbGl6ZXI6IHsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19kZXNpZ25hdGVkX2luaXRpYWxpemVyIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJvYmpjX2Rlc2lnbmF0ZWRfaW5pdGlhbGl6ZXIiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19kZXNpZ25hdGVkX2luaXRpYWxpemVyIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9PYmpDRXhjZXB0aW9uOiB7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfZXhjZXB0aW9uIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJvYmpjX2V4Y2VwdGlvbiIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJvYmpjX2V4Y2VwdGlvbiIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfT2JqQ0V4cGxpY2l0UHJvdG9jb2xJbXBsOiB7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfcHJvdG9jb2xfcmVxdWlyZXNfZXhwbGljaXRfaW1wbGVtZW50YXRpb24iICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfcHJvdG9jb2xfcmVxdWlyZXNfZXhwbGljaXRfaW1wbGVtZW50YXRpb24iICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbiIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfT2JqQ0dDOiB7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfZ2MiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfZ2MiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19nYyIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfT2JqQ0luZGVwZW5kZW50Q2xhc3M6IHsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19pbmRlcGVuZGVudF9jbGFzcyIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19pbmRlcGVuZGVudF9jbGFzcyIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJvYmpjX2luZGVwZW5kZW50X2NsYXNzIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9PYmpDS2luZE9mOiB7CisgICAgaWYgKE5hbWUgPT0gIl9fa2luZG9mIiAmJiBTeW50YXhVc2VkID09IDUgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfT2JqQ01ldGhvZEZhbWlseTogeworICAgIGlmIChOYW1lID09ICJvYmpjX21ldGhvZF9mYW1pbHkiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfbWV0aG9kX2ZhbWlseSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJvYmpjX21ldGhvZF9mYW1pbHkiICYmIFN5bnRheFVzZWQgPT0gMiAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX09iakNOU09iamVjdDogeworICAgIGlmIChOYW1lID09ICJOU09iamVjdCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiTlNPYmplY3QiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAiTlNPYmplY3QiICYmIFN5bnRheFVzZWQgPT0gMiAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX09iakNPd25lcnNoaXA6IHsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19vd25lcnNoaXAiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfb3duZXJzaGlwIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfb3duZXJzaGlwIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9PYmpDUHJlY2lzZUxpZmV0aW1lOiB7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfcHJlY2lzZV9saWZldGltZSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19wcmVjaXNlX2xpZmV0aW1lIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfcHJlY2lzZV9saWZldGltZSIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfT2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzOiB7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfcmVxdWlyZXNfcHJvcGVydHlfZGVmaW5pdGlvbnMiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfcmVxdWlyZXNfcHJvcGVydHlfZGVmaW5pdGlvbnMiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19yZXF1aXJlc19wcm9wZXJ0eV9kZWZpbml0aW9ucyIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfT2JqQ1JlcXVpcmVzU3VwZXI6IHsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19yZXF1aXJlc19zdXBlciIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19yZXF1aXJlc19zdXBlciIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJvYmpjX3JlcXVpcmVzX3N1cGVyIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9PYmpDUmV0dXJuc0lubmVyUG9pbnRlcjogeworICAgIGlmIChOYW1lID09ICJvYmpjX3JldHVybnNfaW5uZXJfcG9pbnRlciIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19yZXR1cm5zX2lubmVyX3BvaW50ZXIiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19yZXR1cm5zX2lubmVyX3BvaW50ZXIiICYmIFN5bnRheFVzZWQgPT0gMiAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX09iakNSb290Q2xhc3M6IHsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19yb290X2NsYXNzIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJvYmpjX3Jvb3RfY2xhc3MiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19yb290X2NsYXNzIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9PYmpDUnVudGltZU5hbWU6IHsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19ydW50aW1lX25hbWUiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfcnVudGltZV9uYW1lIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfcnVudGltZV9uYW1lIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9PYmpDUnVudGltZVZpc2libGU6IHsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19ydW50aW1lX3Zpc2libGUiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfcnVudGltZV92aXNpYmxlIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfcnVudGltZV92aXNpYmxlIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9PYmpDU3ViY2xhc3NpbmdSZXN0cmljdGVkOiB7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfc3ViY2xhc3NpbmdfcmVzdHJpY3RlZCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAib2JqY19zdWJjbGFzc2luZ19yZXN0cmljdGVkIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm9iamNfc3ViY2xhc3NpbmdfcmVzdHJpY3RlZCIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfT3BlbkNMQWNjZXNzOiB7CisgICAgaWYgKE5hbWUgPT0gIl9fcmVhZF9vbmx5IiAmJiBTeW50YXhVc2VkID09IDUgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJyZWFkX29ubHkiICYmIFN5bnRheFVzZWQgPT0gNSAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIl9fd3JpdGVfb25seSIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMjsKKyAgICBpZiAoTmFtZSA9PSAid3JpdGVfb25seSIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMzsKKyAgICBpZiAoTmFtZSA9PSAiX19yZWFkX3dyaXRlIiAmJiBTeW50YXhVc2VkID09IDUgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiA0OworICAgIGlmIChOYW1lID09ICJyZWFkX3dyaXRlIiAmJiBTeW50YXhVc2VkID09IDUgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiA1OworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfT3BlbkNMQ29uc3RhbnRBZGRyZXNzU3BhY2U6IHsKKyAgICBpZiAoTmFtZSA9PSAiX19jb25zdGFudCIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiY29uc3RhbnQiICYmIFN5bnRheFVzZWQgPT0gNSAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9PcGVuQ0xHZW5lcmljQWRkcmVzc1NwYWNlOiB7CisgICAgaWYgKE5hbWUgPT0gIl9fZ2VuZXJpYyIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiZ2VuZXJpYyIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX09wZW5DTEdsb2JhbEFkZHJlc3NTcGFjZTogeworICAgIGlmIChOYW1lID09ICJfX2dsb2JhbCIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAiZ2xvYmFsIiAmJiBTeW50YXhVc2VkID09IDUgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfT3BlbkNMSW50ZWxSZXFkU3ViR3JvdXBTaXplOiB7CisgICAgaWYgKE5hbWUgPT0gImludGVsX3JlcWRfc3ViX2dyb3VwX3NpemUiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9PcGVuQ0xLZXJuZWw6IHsKKyAgICBpZiAoTmFtZSA9PSAiX19rZXJuZWwiICYmIFN5bnRheFVzZWQgPT0gNSAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImtlcm5lbCIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX09wZW5DTExvY2FsQWRkcmVzc1NwYWNlOiB7CisgICAgaWYgKE5hbWUgPT0gIl9fbG9jYWwiICYmIFN5bnRheFVzZWQgPT0gNSAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImxvY2FsIiAmJiBTeW50YXhVc2VkID09IDUgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfT3BlbkNMTm9TVk06IHsKKyAgICBpZiAoTmFtZSA9PSAibm9zdm0iICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9PcGVuQ0xQcml2YXRlQWRkcmVzc1NwYWNlOiB7CisgICAgaWYgKE5hbWUgPT0gIl9fcHJpdmF0ZSIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAicHJpdmF0ZSIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX09wZW5DTFVucm9sbEhpbnQ6IHsKKyAgICBpZiAoTmFtZSA9PSAib3BlbmNsX3Vucm9sbF9oaW50IiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfT3B0aW1pemVOb25lOiB7CisgICAgaWYgKE5hbWUgPT0gIm9wdG5vbmUiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIm9wdG5vbmUiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAib3B0bm9uZSIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfT3ZlcmxvYWRhYmxlOiB7CisgICAgaWYgKE5hbWUgPT0gIm92ZXJsb2FkYWJsZSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAib3ZlcmxvYWRhYmxlIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm92ZXJsb2FkYWJsZSIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfT3duZXJzaGlwOiB7CisgICAgaWYgKE5hbWUgPT0gIm93bmVyc2hpcF9ob2xkcyIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAib3duZXJzaGlwX2hvbGRzIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm93bmVyc2hpcF9ob2xkcyIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGlmIChOYW1lID09ICJvd25lcnNoaXBfcmV0dXJucyIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMzsKKyAgICBpZiAoTmFtZSA9PSAib3duZXJzaGlwX3JldHVybnMiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gNDsKKyAgICBpZiAoTmFtZSA9PSAib3duZXJzaGlwX3JldHVybnMiICYmIFN5bnRheFVzZWQgPT0gMiAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gNTsKKyAgICBpZiAoTmFtZSA9PSAib3duZXJzaGlwX3Rha2VzIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiA2OworICAgIGlmIChOYW1lID09ICJvd25lcnNoaXBfdGFrZXMiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gNzsKKyAgICBpZiAoTmFtZSA9PSAib3duZXJzaGlwX3Rha2VzIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDg7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9QYWNrZWQ6IHsKKyAgICBpZiAoTmFtZSA9PSAicGFja2VkIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJwYWNrZWQiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9QYXJhbVR5cGVzdGF0ZTogeworICAgIGlmIChOYW1lID09ICJwYXJhbV90eXBlc3RhdGUiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gInBhcmFtX3R5cGVzdGF0ZSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfUGFzY2FsOiB7CisgICAgaWYgKE5hbWUgPT0gInBhc2NhbCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAicGFzY2FsIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gInBhc2NhbCIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGlmIChOYW1lID09ICJfX3Bhc2NhbCIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMzsKKyAgICBpZiAoTmFtZSA9PSAiX3Bhc2NhbCIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gNDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1Bhc3NPYmplY3RTaXplOiB7CisgICAgaWYgKE5hbWUgPT0gInBhc3Nfb2JqZWN0X3NpemUiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gInBhc3Nfb2JqZWN0X3NpemUiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAicGFzc19vYmplY3Rfc2l6ZSIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfUGNzOiB7CisgICAgaWYgKE5hbWUgPT0gInBjcyIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAicGNzIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfUHJhZ21hQ2xhbmdCU1NTZWN0aW9uOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9QcmFnbWFDbGFuZ0RhdGFTZWN0aW9uOiB7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9QcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb246IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1ByYWdtYUNsYW5nVGV4dFNlY3Rpb246IHsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1ByZXNlcnZlQWxsOiB7CisgICAgaWYgKE5hbWUgPT0gInByZXNlcnZlX2FsbCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAicHJlc2VydmVfYWxsIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gInByZXNlcnZlX2FsbCIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfUHJlc2VydmVNb3N0OiB7CisgICAgaWYgKE5hbWUgPT0gInByZXNlcnZlX21vc3QiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gInByZXNlcnZlX21vc3QiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAicHJlc2VydmVfbW9zdCIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfUHRHdWFyZGVkQnk6IHsKKyAgICBpZiAoTmFtZSA9PSAicHRfZ3VhcmRlZF9ieSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1B0R3VhcmRlZFZhcjogeworICAgIGlmIChOYW1lID09ICJwdF9ndWFyZGVkX3ZhciIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAicHRfZ3VhcmRlZF92YXIiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1B0cjMyOiB7CisgICAgaWYgKE5hbWUgPT0gIl9fcHRyMzIiICYmIFN5bnRheFVzZWQgPT0gNSAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9QdHI2NDogeworICAgIGlmIChOYW1lID09ICJfX3B0cjY0IiAmJiBTeW50YXhVc2VkID09IDUgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfUHVyZTogeworICAgIGlmIChOYW1lID09ICJwdXJlIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJwdXJlIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfUmVnQ2FsbDogeworICAgIGlmIChOYW1lID09ICJyZWdjYWxsIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJyZWdjYWxsIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJfX3JlZ2NhbGwiICYmIFN5bnRheFVzZWQgPT0gNSAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9SZWdwYXJtOiB7CisgICAgaWYgKE5hbWUgPT0gInJlZ3Bhcm0iICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gInJlZ3Bhcm0iICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9SZWxlYXNlQ2FwYWJpbGl0eTogeworICAgIGlmIChOYW1lID09ICJyZWxlYXNlX2NhcGFiaWxpdHkiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gInJlbGVhc2VfY2FwYWJpbGl0eSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5IiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAyOworICAgIGlmIChOYW1lID09ICJyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5IiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDM7CisgICAgaWYgKE5hbWUgPT0gInJlbGVhc2VfZ2VuZXJpY19jYXBhYmlsaXR5IiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiA0OworICAgIGlmIChOYW1lID09ICJyZWxlYXNlX2dlbmVyaWNfY2FwYWJpbGl0eSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiA1OworICAgIGlmIChOYW1lID09ICJ1bmxvY2tfZnVuY3Rpb24iICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDY7CisgICAgaWYgKE5hbWUgPT0gInVubG9ja19mdW5jdGlvbiIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiA3OworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfUmVuZGVyU2NyaXB0S2VybmVsOiB7CisgICAgaWYgKE5hbWUgPT0gImtlcm5lbCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1JlcWRXb3JrR3JvdXBTaXplOiB7CisgICAgaWYgKE5hbWUgPT0gInJlcWRfd29ya19ncm91cF9zaXplIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfUmVxdWlyZUNvbnN0YW50SW5pdDogeworICAgIGlmIChOYW1lID09ICJyZXF1aXJlX2NvbnN0YW50X2luaXRpYWxpemF0aW9uIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJyZXF1aXJlX2NvbnN0YW50X2luaXRpYWxpemF0aW9uIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9SZXF1aXJlc0NhcGFiaWxpdHk6IHsKKyAgICBpZiAoTmFtZSA9PSAicmVxdWlyZXNfY2FwYWJpbGl0eSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAicmVxdWlyZXNfY2FwYWJpbGl0eSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJleGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgaWYgKE5hbWUgPT0gImV4Y2x1c2l2ZV9sb2Nrc19yZXF1aXJlZCIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAzOworICAgIGlmIChOYW1lID09ICJyZXF1aXJlc19zaGFyZWRfY2FwYWJpbGl0eSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gNDsKKyAgICBpZiAoTmFtZSA9PSAicmVxdWlyZXNfc2hhcmVkX2NhcGFiaWxpdHkiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gNTsKKyAgICBpZiAoTmFtZSA9PSAic2hhcmVkX2xvY2tzX3JlcXVpcmVkIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiA2OworICAgIGlmIChOYW1lID09ICJzaGFyZWRfbG9ja3NfcmVxdWlyZWQiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gNzsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1Jlc3RyaWN0OiB7CisgICAgaWYgKE5hbWUgPT0gInJlc3RyaWN0IiAmJiBTeW50YXhVc2VkID09IDMgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJtYWxsb2MiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gIm1hbGxvYyIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1JldHVyblR5cGVzdGF0ZTogeworICAgIGlmIChOYW1lID09ICJyZXR1cm5fdHlwZXN0YXRlIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJyZXR1cm5fdHlwZXN0YXRlIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9SZXR1cm5zTm9uTnVsbDogeworICAgIGlmIChOYW1lID09ICJyZXR1cm5zX25vbm51bGwiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gInJldHVybnNfbm9ubnVsbCIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1JldHVybnNUd2ljZTogeworICAgIGlmIChOYW1lID09ICJyZXR1cm5zX3R3aWNlIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJyZXR1cm5zX3R3aWNlIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfU1B0cjogeworICAgIGlmIChOYW1lID09ICJfX3NwdHIiICYmIFN5bnRheFVzZWQgPT0gNSAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9TY29wZWRMb2NrYWJsZTogeworICAgIGlmIChOYW1lID09ICJzY29wZWRfbG9ja2FibGUiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gInNjb3BlZF9sb2NrYWJsZSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfU2VjdGlvbjogeworICAgIGlmIChOYW1lID09ICJzZWN0aW9uIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJzZWN0aW9uIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJhbGxvY2F0ZSIgJiYgU3ludGF4VXNlZCA9PSAzICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1NlbGVjdEFueTogeworICAgIGlmIChOYW1lID09ICJzZWxlY3RhbnkiICYmIFN5bnRheFVzZWQgPT0gMyAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gInNlbGVjdGFueSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAic2VsZWN0YW55IiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfU2VudGluZWw6IHsKKyAgICBpZiAoTmFtZSA9PSAic2VudGluZWwiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gInNlbnRpbmVsIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfU2V0VHlwZXN0YXRlOiB7CisgICAgaWYgKE5hbWUgPT0gInNldF90eXBlc3RhdGUiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gInNldF90eXBlc3RhdGUiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1NoYXJlZFRyeWxvY2tGdW5jdGlvbjogeworICAgIGlmIChOYW1lID09ICJzaGFyZWRfdHJ5bG9ja19mdW5jdGlvbiIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1N0ZENhbGw6IHsKKyAgICBpZiAoTmFtZSA9PSAic3RkY2FsbCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAic3RkY2FsbCIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAiX19zdGRjYWxsIiAmJiBTeW50YXhVc2VkID09IDUgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAyOworICAgIGlmIChOYW1lID09ICJfc3RkY2FsbCIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMzsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1N1cHByZXNzOiB7CisgICAgaWYgKE5hbWUgPT0gInN1cHByZXNzIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdzbCIpCisgICAgICAgIHJldHVybiAwOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfU3dpZnRDYWxsOiB7CisgICAgaWYgKE5hbWUgPT0gInN3aWZ0Y2FsbCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAic3dpZnRjYWxsIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gInN3aWZ0Y2FsbCIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfU3dpZnRDb250ZXh0OiB7CisgICAgaWYgKE5hbWUgPT0gInN3aWZ0X2NvbnRleHQiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gInN3aWZ0X2NvbnRleHQiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAic3dpZnRfY29udGV4dCIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfU3dpZnRFcnJvclJlc3VsdDogeworICAgIGlmIChOYW1lID09ICJzd2lmdF9lcnJvcl9yZXN1bHQiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gInN3aWZ0X2Vycm9yX3Jlc3VsdCIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJzd2lmdF9lcnJvcl9yZXN1bHQiICYmIFN5bnRheFVzZWQgPT0gMiAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1N3aWZ0SW5kaXJlY3RSZXN1bHQ6IHsKKyAgICBpZiAoTmFtZSA9PSAic3dpZnRfaW5kaXJlY3RfcmVzdWx0IiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJzd2lmdF9pbmRpcmVjdF9yZXN1bHQiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAic3dpZnRfaW5kaXJlY3RfcmVzdWx0IiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9TeXNWQUJJOiB7CisgICAgaWYgKE5hbWUgPT0gInN5c3ZfYWJpIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJzeXN2X2FiaSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1RMU01vZGVsOiB7CisgICAgaWYgKE5hbWUgPT0gInRsc19tb2RlbCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAidGxzX21vZGVsIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfVGFyZ2V0OiB7CisgICAgaWYgKE5hbWUgPT0gInRhcmdldCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAidGFyZ2V0IiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfVGVzdFR5cGVzdGF0ZTogeworICAgIGlmIChOYW1lID09ICJ0ZXN0X3R5cGVzdGF0ZSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAidGVzdF90eXBlc3RhdGUiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1RoaXNDYWxsOiB7CisgICAgaWYgKE5hbWUgPT0gInRoaXNjYWxsIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJ0aGlzY2FsbCIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAiX190aGlzY2FsbCIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMjsKKyAgICBpZiAoTmFtZSA9PSAiX3RoaXNjYWxsIiAmJiBTeW50YXhVc2VkID09IDUgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAzOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfVGhyZWFkOiB7CisgICAgaWYgKE5hbWUgPT0gInRocmVhZCIgJiYgU3ludGF4VXNlZCA9PSAzICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1RyYW5zcGFyZW50VW5pb246IHsKKyAgICBpZiAoTmFtZSA9PSAidHJhbnNwYXJlbnRfdW5pb24iICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gInRyYW5zcGFyZW50X3VuaW9uIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfVHJpdmlhbEFCSTogeworICAgIGlmIChOYW1lID09ICJ0cml2aWFsX2FiaSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAidHJpdmlhbF9hYmkiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1RyeUFjcXVpcmVDYXBhYmlsaXR5OiB7CisgICAgaWYgKE5hbWUgPT0gInRyeV9hY3F1aXJlX2NhcGFiaWxpdHkiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gInRyeV9hY3F1aXJlX2NhcGFiaWxpdHkiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAidHJ5X2FjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgaWYgKE5hbWUgPT0gInRyeV9hY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5IiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDM7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9UeXBlTm9uTnVsbDogeworICAgIGlmIChOYW1lID09ICJfTm9ubnVsbCIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1R5cGVOdWxsVW5zcGVjaWZpZWQ6IHsKKyAgICBpZiAoTmFtZSA9PSAiX051bGxfdW5zcGVjaWZpZWQiICYmIFN5bnRheFVzZWQgPT0gNSAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9UeXBlTnVsbGFibGU6IHsKKyAgICBpZiAoTmFtZSA9PSAiX051bGxhYmxlIiAmJiBTeW50YXhVc2VkID09IDUgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfVHlwZVRhZ0ZvckRhdGF0eXBlOiB7CisgICAgaWYgKE5hbWUgPT0gInR5cGVfdGFnX2Zvcl9kYXRhdHlwZSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAidHlwZV90YWdfZm9yX2RhdGF0eXBlIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKE5hbWUgPT0gInR5cGVfdGFnX2Zvcl9kYXRhdHlwZSIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfVHlwZVZpc2liaWxpdHk6IHsKKyAgICBpZiAoTmFtZSA9PSAidHlwZV92aXNpYmlsaXR5IiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJ0eXBlX3Zpc2liaWxpdHkiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAidHlwZV92aXNpYmlsaXR5IiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9VUHRyOiB7CisgICAgaWYgKE5hbWUgPT0gIl9fdXB0ciIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1VuYXZhaWxhYmxlOiB7CisgICAgaWYgKE5hbWUgPT0gInVuYXZhaWxhYmxlIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJ1bmF2YWlsYWJsZSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJ1bmF2YWlsYWJsZSIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAyOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfVW51c2VkOiB7CisgICAgaWYgKE5hbWUgPT0gIm1heWJlX3VudXNlZCIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAidW51c2VkIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJ1bnVzZWQiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiZ251IikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgaWYgKE5hbWUgPT0gIm1heWJlX3VudXNlZCIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMzsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1VzZWQ6IHsKKyAgICBpZiAoTmFtZSA9PSAidXNlZCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAidXNlZCIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1V1aWQ6IHsKKyAgICBpZiAoTmFtZSA9PSAidXVpZCIgJiYgU3ludGF4VXNlZCA9PSAzICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAidXVpZCIgJiYgU3ludGF4VXNlZCA9PSA0ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1ZlY1JldHVybjogeworICAgIGlmIChOYW1lID09ICJ2ZWNyZXR1cm4iICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gInZlY3JldHVybiIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfVmVjVHlwZUhpbnQ6IHsKKyAgICBpZiAoTmFtZSA9PSAidmVjX3R5cGVfaGludCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1ZlY3RvckNhbGw6IHsKKyAgICBpZiAoTmFtZSA9PSAidmVjdG9yY2FsbCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAidmVjdG9yY2FsbCIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJ2ZWN0b3JjYWxsIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgaWYgKE5hbWUgPT0gIl9fdmVjdG9yY2FsbCIgJiYgU3ludGF4VXNlZCA9PSA1ICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMzsKKyAgICBpZiAoTmFtZSA9PSAiX3ZlY3RvcmNhbGwiICYmIFN5bnRheFVzZWQgPT0gNSAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBBVF9WZWN0b3JTaXplOiB7CisgICAgaWYgKE5hbWUgPT0gInZlY3Rvcl9zaXplIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJ2ZWN0b3Jfc2l6ZSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1Zpc2liaWxpdHk6IHsKKyAgICBpZiAoTmFtZSA9PSAidmlzaWJpbGl0eSIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAidmlzaWJpbGl0eSIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1dhcm5VbnVzZWQ6IHsKKyAgICBpZiAoTmFtZSA9PSAid2Fybl91bnVzZWQiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIndhcm5fdW51c2VkIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfV2FyblVudXNlZFJlc3VsdDogeworICAgIGlmIChOYW1lID09ICJub2Rpc2NhcmQiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gIm5vZGlzY2FyZCIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAid2Fybl91bnVzZWRfcmVzdWx0IiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgaWYgKE5hbWUgPT0gIndhcm5fdW51c2VkX3Jlc3VsdCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMzsKKyAgICBpZiAoTmFtZSA9PSAid2Fybl91bnVzZWRfcmVzdWx0IiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiA0OworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfV2VhazogeworICAgIGlmIChOYW1lID09ICJ3ZWFrIiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChOYW1lID09ICJ3ZWFrIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfV2Vha0ltcG9ydDogeworICAgIGlmIChOYW1lID09ICJ3ZWFrX2ltcG9ydCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAid2Vha19pbXBvcnQiICYmIFN5bnRheFVzZWQgPT0gMSAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoTmFtZSA9PSAid2Vha19pbXBvcnQiICYmIFN5bnRheFVzZWQgPT0gMiAmJiBTY29wZSA9PSAiY2xhbmciKQorICAgICAgICByZXR1cm4gMjsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1dlYWtSZWY6IHsKKyAgICBpZiAoTmFtZSA9PSAid2Vha3JlZiIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAid2Vha3JlZiIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJnbnUiKQorICAgICAgICByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIEFUX1dvcmtHcm91cFNpemVIaW50OiB7CisgICAgaWYgKE5hbWUgPT0gIndvcmtfZ3JvdXBfc2l6ZV9oaW50IiAmJiBTeW50YXhVc2VkID09IDAgJiYgU2NvcGUgPT0gIiIpCisgICAgICAgIHJldHVybiAwOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfWDg2Rm9yY2VBbGlnbkFyZ1BvaW50ZXI6IHsKKyAgICBpZiAoTmFtZSA9PSAiZm9yY2VfYWxpZ25fYXJnX3BvaW50ZXIiICYmIFN5bnRheFVzZWQgPT0gMCAmJiBTY29wZSA9PSAiIikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKE5hbWUgPT0gImZvcmNlX2FsaWduX2FyZ19wb2ludGVyIiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImdudSIpCisgICAgICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfWFJheUluc3RydW1lbnQ6IHsKKyAgICBpZiAoTmFtZSA9PSAieHJheV9hbHdheXNfaW5zdHJ1bWVudCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAieHJheV9hbHdheXNfaW5zdHJ1bWVudCIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJ4cmF5X2Fsd2F5c19pbnN0cnVtZW50IiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgaWYgKE5hbWUgPT0gInhyYXlfbmV2ZXJfaW5zdHJ1bWVudCIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMzsKKyAgICBpZiAoTmFtZSA9PSAieHJheV9uZXZlcl9pbnN0cnVtZW50IiAmJiBTeW50YXhVc2VkID09IDEgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgaWYgKE5hbWUgPT0gInhyYXlfbmV2ZXJfaW5zdHJ1bWVudCIgJiYgU3ludGF4VXNlZCA9PSAyICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiA1OworICAgIGJyZWFrOworICB9CisgIGNhc2UgQVRfWFJheUxvZ0FyZ3M6IHsKKyAgICBpZiAoTmFtZSA9PSAieHJheV9sb2dfYXJncyIgJiYgU3ludGF4VXNlZCA9PSAwICYmIFNjb3BlID09ICIiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTmFtZSA9PSAieHJheV9sb2dfYXJncyIgJiYgU3ludGF4VXNlZCA9PSAxICYmIFNjb3BlID09ICJjbGFuZyIpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChOYW1lID09ICJ4cmF5X2xvZ19hcmdzIiAmJiBTeW50YXhVc2VkID09IDIgJiYgU2NvcGUgPT0gImNsYW5nIikKKyAgICAgICAgcmV0dXJuIDI7CisgICAgYnJlYWs7CisgIH0KKyAgfQorICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvQXR0clRlbXBsYXRlSW5zdGFudGlhdGUuaW5jIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9BdHRyVGVtcGxhdGVJbnN0YW50aWF0ZS5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkMDJjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvQXR0clRlbXBsYXRlSW5zdGFudGlhdGUuaW5jCkBAIC0wLDAgKzEsMTgxMyBAQAorLyo9PT0tIFRhYmxlR2VuJ2VyYXRlZCBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGNvZGUgZm9yIGF0dHJpYnV0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGUsIGRvIG5vdCBlZGl0ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBzZW1hIHsKKworQXR0ciAqaW5zdGFudGlhdGVUZW1wbGF0ZUF0dHJpYnV0ZShjb25zdCBBdHRyICpBdCwgQVNUQ29udGV4dCAmQywgU2VtYSAmUywKKyAgICAgICAgY29uc3QgTXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MpIHsKKyAgc3dpdGNoIChBdC0+Z2V0S2luZCgpKSB7CisgICAgY2FzZSBhdHRyOjpBTURHUFVGbGF0V29ya0dyb3VwU2l6ZTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8QU1ER1BVRmxhdFdvcmtHcm91cFNpemVBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QU1ER1BVTnVtU0dQUjogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8QU1ER1BVTnVtU0dQUkF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBTURHUFVOdW1WR1BSOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxBTURHUFVOdW1WR1BSQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFNREdQVVdhdmVzUGVyRVU6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PEFNREdQVVdhdmVzUGVyRVVBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QVJNSW50ZXJydXB0OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxBUk1JbnRlcnJ1cHRBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QVZSSW50ZXJydXB0OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxBVlJJbnRlcnJ1cHRBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QVZSU2lnbmFsOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxBVlJTaWduYWxBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QWJpVGFnOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxBYmlUYWdBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QWNxdWlyZUNhcGFiaWxpdHk6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PEFjcXVpcmVDYXBhYmlsaXR5QXR0cj4oQXQpOworICAgICAgYXV0byAqdGVtcEluc3RBcmdzID0gbmV3IChDLCAxNikgRXhwciAqW0EtPmFyZ3Nfc2l6ZSgpXTsKKyAgICAgIHsKKyAgICAgICAgRW50ZXJFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQgVW5ldmFsdWF0ZWQoUywgU2VtYTo6RXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0OjpVbmV2YWx1YXRlZCk7CisgICAgICAgIEV4cHIgKiAqVEkgPSB0ZW1wSW5zdEFyZ3M7CisgICAgICAgIEV4cHIgKiAqSSA9IEEtPmFyZ3NfYmVnaW4oKTsKKyAgICAgICAgRXhwciAqICpFID0gQS0+YXJnc19lbmQoKTsKKyAgICAgICAgZm9yICg7IEkgIT0gRTsgKytJLCArK1RJKSB7CisgICAgICAgICAgRXhwclJlc3VsdCBSZXN1bHQgPSBTLlN1YnN0RXhwcigqSSwgVGVtcGxhdGVBcmdzKTsKKyAgICAgICAgICAqVEkgPSBSZXN1bHQuZ2V0QXM8RXhwcj4oKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG5ldyAoQykgQWNxdWlyZUNhcGFiaWxpdHlBdHRyKEEtPmdldExvY2F0aW9uKCksIEMsIHRlbXBJbnN0QXJncywgQS0+YXJnc19zaXplKCksIEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFjcXVpcmVkQWZ0ZXI6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PEFjcXVpcmVkQWZ0ZXJBdHRyPihBdCk7CisgICAgICBhdXRvICp0ZW1wSW5zdEFyZ3MgPSBuZXcgKEMsIDE2KSBFeHByICpbQS0+YXJnc19zaXplKCldOworICAgICAgeworICAgICAgICBFbnRlckV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dCBVbmV2YWx1YXRlZChTLCBTZW1hOjpFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQ6OlVuZXZhbHVhdGVkKTsKKyAgICAgICAgRXhwciAqICpUSSA9IHRlbXBJbnN0QXJnczsKKyAgICAgICAgRXhwciAqICpJID0gQS0+YXJnc19iZWdpbigpOworICAgICAgICBFeHByICogKkUgPSBBLT5hcmdzX2VuZCgpOworICAgICAgICBmb3IgKDsgSSAhPSBFOyArK0ksICsrVEkpIHsKKyAgICAgICAgICBFeHByUmVzdWx0IFJlc3VsdCA9IFMuU3Vic3RFeHByKCpJLCBUZW1wbGF0ZUFyZ3MpOworICAgICAgICAgICpUSSA9IFJlc3VsdC5nZXRBczxFeHByPigpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IChDKSBBY3F1aXJlZEFmdGVyQXR0cihBLT5nZXRMb2NhdGlvbigpLCBDLCB0ZW1wSW5zdEFyZ3MsIEEtPmFyZ3Nfc2l6ZSgpLCBBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBY3F1aXJlZEJlZm9yZTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8QWNxdWlyZWRCZWZvcmVBdHRyPihBdCk7CisgICAgICBhdXRvICp0ZW1wSW5zdEFyZ3MgPSBuZXcgKEMsIDE2KSBFeHByICpbQS0+YXJnc19zaXplKCldOworICAgICAgeworICAgICAgICBFbnRlckV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dCBVbmV2YWx1YXRlZChTLCBTZW1hOjpFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQ6OlVuZXZhbHVhdGVkKTsKKyAgICAgICAgRXhwciAqICpUSSA9IHRlbXBJbnN0QXJnczsKKyAgICAgICAgRXhwciAqICpJID0gQS0+YXJnc19iZWdpbigpOworICAgICAgICBFeHByICogKkUgPSBBLT5hcmdzX2VuZCgpOworICAgICAgICBmb3IgKDsgSSAhPSBFOyArK0ksICsrVEkpIHsKKyAgICAgICAgICBFeHByUmVzdWx0IFJlc3VsdCA9IFMuU3Vic3RFeHByKCpJLCBUZW1wbGF0ZUFyZ3MpOworICAgICAgICAgICpUSSA9IFJlc3VsdC5nZXRBczxFeHByPigpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IChDKSBBY3F1aXJlZEJlZm9yZUF0dHIoQS0+Z2V0TG9jYXRpb24oKSwgQywgdGVtcEluc3RBcmdzLCBBLT5hcmdzX3NpemUoKSwgQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QWxpYXM6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PEFsaWFzQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFsaWduTWFjNjhrOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxBbGlnbk1hYzY4a0F0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBbGlnblZhbHVlOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxBbGlnblZhbHVlQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFsaWduZWQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PEFsaWduZWRBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QWxsb2NBbGlnbjogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8QWxsb2NBbGlnbkF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBbGxvY1NpemU6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PEFsbG9jU2l6ZUF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBuZXcgKEMpIEFsbG9jU2l6ZUF0dHIoQS0+Z2V0TG9jYXRpb24oKSwgQywgQS0+Z2V0RWxlbVNpemVQYXJhbSgpLCBBLT5nZXROdW1FbGVtc1BhcmFtKCksIEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFsd2F5c0lubGluZTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8QWx3YXlzSW5saW5lQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFuYWx5emVyTm9SZXR1cm46IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PEFuYWx5emVyTm9SZXR1cm5BdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QW5ub3RhdGU6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PEFubm90YXRlQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFueVg4NkludGVycnVwdDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8QW55WDg2SW50ZXJydXB0QXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFueVg4Nk5vQ2FsbGVyU2F2ZWRSZWdpc3RlcnM6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PEFueVg4Nk5vQ2FsbGVyU2F2ZWRSZWdpc3RlcnNBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QW55WDg2Tm9DZkNoZWNrOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxBbnlYODZOb0NmQ2hlY2tBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QXJjV2Vha3JlZlVuYXZhaWxhYmxlOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxBcmNXZWFrcmVmVW5hdmFpbGFibGVBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QXJndW1lbnRXaXRoVHlwZVRhZzogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8QXJndW1lbnRXaXRoVHlwZVRhZ0F0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBcnRpZmljaWFsOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxBcnRpZmljaWFsQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFzbUxhYmVsOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxBc21MYWJlbEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBc3NlcnRDYXBhYmlsaXR5OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxBc3NlcnRDYXBhYmlsaXR5QXR0cj4oQXQpOworICAgICAgYXV0byAqdGVtcEluc3RBcmdzID0gbmV3IChDLCAxNikgRXhwciAqW0EtPmFyZ3Nfc2l6ZSgpXTsKKyAgICAgIHsKKyAgICAgICAgRW50ZXJFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQgVW5ldmFsdWF0ZWQoUywgU2VtYTo6RXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0OjpVbmV2YWx1YXRlZCk7CisgICAgICAgIEV4cHIgKiAqVEkgPSB0ZW1wSW5zdEFyZ3M7CisgICAgICAgIEV4cHIgKiAqSSA9IEEtPmFyZ3NfYmVnaW4oKTsKKyAgICAgICAgRXhwciAqICpFID0gQS0+YXJnc19lbmQoKTsKKyAgICAgICAgZm9yICg7IEkgIT0gRTsgKytJLCArK1RJKSB7CisgICAgICAgICAgRXhwclJlc3VsdCBSZXN1bHQgPSBTLlN1YnN0RXhwcigqSSwgVGVtcGxhdGVBcmdzKTsKKyAgICAgICAgICAqVEkgPSBSZXN1bHQuZ2V0QXM8RXhwcj4oKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG5ldyAoQykgQXNzZXJ0Q2FwYWJpbGl0eUF0dHIoQS0+Z2V0TG9jYXRpb24oKSwgQywgdGVtcEluc3RBcmdzLCBBLT5hcmdzX3NpemUoKSwgQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QXNzZXJ0RXhjbHVzaXZlTG9jazogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8QXNzZXJ0RXhjbHVzaXZlTG9ja0F0dHI+KEF0KTsKKyAgICAgIGF1dG8gKnRlbXBJbnN0QXJncyA9IG5ldyAoQywgMTYpIEV4cHIgKltBLT5hcmdzX3NpemUoKV07CisgICAgICB7CisgICAgICAgIEVudGVyRXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0IFVuZXZhbHVhdGVkKFMsIFNlbWE6OkV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dDo6VW5ldmFsdWF0ZWQpOworICAgICAgICBFeHByICogKlRJID0gdGVtcEluc3RBcmdzOworICAgICAgICBFeHByICogKkkgPSBBLT5hcmdzX2JlZ2luKCk7CisgICAgICAgIEV4cHIgKiAqRSA9IEEtPmFyZ3NfZW5kKCk7CisgICAgICAgIGZvciAoOyBJICE9IEU7ICsrSSwgKytUSSkgeworICAgICAgICAgIEV4cHJSZXN1bHQgUmVzdWx0ID0gUy5TdWJzdEV4cHIoKkksIFRlbXBsYXRlQXJncyk7CisgICAgICAgICAgKlRJID0gUmVzdWx0LmdldEFzPEV4cHI+KCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXcgKEMpIEFzc2VydEV4Y2x1c2l2ZUxvY2tBdHRyKEEtPmdldExvY2F0aW9uKCksIEMsIHRlbXBJbnN0QXJncywgQS0+YXJnc19zaXplKCksIEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFzc2VydFNoYXJlZExvY2s6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PEFzc2VydFNoYXJlZExvY2tBdHRyPihBdCk7CisgICAgICBhdXRvICp0ZW1wSW5zdEFyZ3MgPSBuZXcgKEMsIDE2KSBFeHByICpbQS0+YXJnc19zaXplKCldOworICAgICAgeworICAgICAgICBFbnRlckV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dCBVbmV2YWx1YXRlZChTLCBTZW1hOjpFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQ6OlVuZXZhbHVhdGVkKTsKKyAgICAgICAgRXhwciAqICpUSSA9IHRlbXBJbnN0QXJnczsKKyAgICAgICAgRXhwciAqICpJID0gQS0+YXJnc19iZWdpbigpOworICAgICAgICBFeHByICogKkUgPSBBLT5hcmdzX2VuZCgpOworICAgICAgICBmb3IgKDsgSSAhPSBFOyArK0ksICsrVEkpIHsKKyAgICAgICAgICBFeHByUmVzdWx0IFJlc3VsdCA9IFMuU3Vic3RFeHByKCpJLCBUZW1wbGF0ZUFyZ3MpOworICAgICAgICAgICpUSSA9IFJlc3VsdC5nZXRBczxFeHByPigpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IChDKSBBc3NlcnRTaGFyZWRMb2NrQXR0cihBLT5nZXRMb2NhdGlvbigpLCBDLCB0ZW1wSW5zdEFyZ3MsIEEtPmFyZ3Nfc2l6ZSgpLCBBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBc3N1bWVBbGlnbmVkOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxBc3N1bWVBbGlnbmVkQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkF2YWlsYWJpbGl0eTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8QXZhaWxhYmlsaXR5QXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkJsb2NrczogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8QmxvY2tzQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkMxMU5vUmV0dXJuOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxDMTFOb1JldHVybkF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDRGVjbDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8Q0RlY2xBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q0ZBdWRpdGVkVHJhbnNmZXI6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PENGQXVkaXRlZFRyYW5zZmVyQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkNGQ29uc3VtZWQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PENGQ29uc3VtZWRBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q0ZSZXR1cm5zTm90UmV0YWluZWQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PENGUmV0dXJuc05vdFJldGFpbmVkQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkNGUmV0dXJuc1JldGFpbmVkOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxDRlJldHVybnNSZXRhaW5lZEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDRlVua25vd25UcmFuc2ZlcjogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8Q0ZVbmtub3duVHJhbnNmZXJBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q1VEQUNvbnN0YW50OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxDVURBQ29uc3RhbnRBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q1VEQURldmljZTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8Q1VEQURldmljZUF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDVURBR2xvYmFsOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxDVURBR2xvYmFsQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkNVREFIb3N0OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxDVURBSG9zdEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDVURBSW52YWxpZFRhcmdldDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8Q1VEQUludmFsaWRUYXJnZXRBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q1VEQUxhdW5jaEJvdW5kczogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8Q1VEQUxhdW5jaEJvdW5kc0F0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDVURBU2hhcmVkOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxDVURBU2hhcmVkQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkNYWDExTm9SZXR1cm46IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PENYWDExTm9SZXR1cm5BdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q2FsbGFibGVXaGVuOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxDYWxsYWJsZVdoZW5BdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q2FwYWJpbGl0eTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8Q2FwYWJpbGl0eUF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDYXB0dXJlZFJlY29yZDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8Q2FwdHVyZWRSZWNvcmRBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q2Fycmllc0RlcGVuZGVuY3k6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PENhcnJpZXNEZXBlbmRlbmN5QXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkNsZWFudXA6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PENsZWFudXBBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q29sZDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8Q29sZEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDb21tb246IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PENvbW1vbkF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDb25zdDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8Q29uc3RBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q29uc3RydWN0b3I6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PENvbnN0cnVjdG9yQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkNvbnN1bWFibGU6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PENvbnN1bWFibGVBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q29uc3VtYWJsZUF1dG9DYXN0OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxDb25zdW1hYmxlQXV0b0Nhc3RBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q29uc3VtYWJsZVNldE9uUmVhZDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8Q29uc3VtYWJsZVNldE9uUmVhZEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDb252ZXJnZW50OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxDb252ZXJnZW50QXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkRMTEV4cG9ydDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8RExMRXhwb3J0QXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkRMTEltcG9ydDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8RExMSW1wb3J0QXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkRlcHJlY2F0ZWQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PERlcHJlY2F0ZWRBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6RGVzdHJ1Y3RvcjogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8RGVzdHJ1Y3RvckF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpEaWFnbm9zZUlmOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxEaWFnbm9zZUlmQXR0cj4oQXQpOworICAgICAgRXhwciAqIHRlbXBJbnN0Q29uZDsKKyAgICAgIHsKKyAgICAgICAgRW50ZXJFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQgVW5ldmFsdWF0ZWQoUywgU2VtYTo6RXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0OjpVbmV2YWx1YXRlZCk7CisgICAgICAgIEV4cHJSZXN1bHQgUmVzdWx0ID0gUy5TdWJzdEV4cHIoQS0+Z2V0Q29uZCgpLCBUZW1wbGF0ZUFyZ3MpOworICAgICAgICB0ZW1wSW5zdENvbmQgPSBSZXN1bHQuZ2V0QXM8RXhwcj4oKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXcgKEMpIERpYWdub3NlSWZBdHRyKEEtPmdldExvY2F0aW9uKCksIEMsIHRlbXBJbnN0Q29uZCwgQS0+Z2V0TWVzc2FnZSgpLCBBLT5nZXREaWFnbm9zdGljVHlwZSgpLCBBLT5nZXRBcmdEZXBlbmRlbnQoKSwgQS0+Z2V0UGFyZW50KCksIEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkRpc2FibGVUYWlsQ2FsbHM6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PERpc2FibGVUYWlsQ2FsbHNBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6RW1wdHlCYXNlczogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8RW1wdHlCYXNlc0F0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpFbmFibGVJZjogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8RW5hYmxlSWZBdHRyPihBdCk7CisgICAgICBFeHByICogdGVtcEluc3RDb25kOworICAgICAgeworICAgICAgICBFbnRlckV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dCBVbmV2YWx1YXRlZChTLCBTZW1hOjpFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQ6OlVuZXZhbHVhdGVkKTsKKyAgICAgICAgRXhwclJlc3VsdCBSZXN1bHQgPSBTLlN1YnN0RXhwcihBLT5nZXRDb25kKCksIFRlbXBsYXRlQXJncyk7CisgICAgICAgIHRlbXBJbnN0Q29uZCA9IFJlc3VsdC5nZXRBczxFeHByPigpOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyAoQykgRW5hYmxlSWZBdHRyKEEtPmdldExvY2F0aW9uKCksIEMsIHRlbXBJbnN0Q29uZCwgQS0+Z2V0TWVzc2FnZSgpLCBBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpFbnVtRXh0ZW5zaWJpbGl0eTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8RW51bUV4dGVuc2liaWxpdHlBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6RXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb25BdHRyPihBdCk7CisgICAgICBFeHByICogdGVtcEluc3RTdWNjZXNzVmFsdWU7CisgICAgICB7CisgICAgICAgIEVudGVyRXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0IFVuZXZhbHVhdGVkKFMsIFNlbWE6OkV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dDo6VW5ldmFsdWF0ZWQpOworICAgICAgICBFeHByUmVzdWx0IFJlc3VsdCA9IFMuU3Vic3RFeHByKEEtPmdldFN1Y2Nlc3NWYWx1ZSgpLCBUZW1wbGF0ZUFyZ3MpOworICAgICAgICB0ZW1wSW5zdFN1Y2Nlc3NWYWx1ZSA9IFJlc3VsdC5nZXRBczxFeHByPigpOworICAgICAgfQorICAgICAgYXV0byAqdGVtcEluc3RBcmdzID0gbmV3IChDLCAxNikgRXhwciAqW0EtPmFyZ3Nfc2l6ZSgpXTsKKyAgICAgIHsKKyAgICAgICAgRW50ZXJFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQgVW5ldmFsdWF0ZWQoUywgU2VtYTo6RXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0OjpVbmV2YWx1YXRlZCk7CisgICAgICAgIEV4cHIgKiAqVEkgPSB0ZW1wSW5zdEFyZ3M7CisgICAgICAgIEV4cHIgKiAqSSA9IEEtPmFyZ3NfYmVnaW4oKTsKKyAgICAgICAgRXhwciAqICpFID0gQS0+YXJnc19lbmQoKTsKKyAgICAgICAgZm9yICg7IEkgIT0gRTsgKytJLCArK1RJKSB7CisgICAgICAgICAgRXhwclJlc3VsdCBSZXN1bHQgPSBTLlN1YnN0RXhwcigqSSwgVGVtcGxhdGVBcmdzKTsKKyAgICAgICAgICAqVEkgPSBSZXN1bHQuZ2V0QXM8RXhwcj4oKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG5ldyAoQykgRXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uQXR0cihBLT5nZXRMb2NhdGlvbigpLCBDLCB0ZW1wSW5zdFN1Y2Nlc3NWYWx1ZSwgdGVtcEluc3RBcmdzLCBBLT5hcmdzX3NpemUoKSwgQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6RXh0ZXJuYWxTb3VyY2VTeW1ib2w6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PEV4dGVybmFsU291cmNlU3ltYm9sQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkZhbGxUaHJvdWdoOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxGYWxsVGhyb3VnaEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpGYXN0Q2FsbDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8RmFzdENhbGxBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6RmluYWw6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PEZpbmFsQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkZsYWdFbnVtOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxGbGFnRW51bUF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpGbGF0dGVuOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxGbGF0dGVuQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkZvcm1hdDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8Rm9ybWF0QXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkZvcm1hdEFyZzogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8Rm9ybWF0QXJnQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkdOVUlubGluZTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8R05VSW5saW5lQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Okd1YXJkZWRCeTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8R3VhcmRlZEJ5QXR0cj4oQXQpOworICAgICAgRXhwciAqIHRlbXBJbnN0QXJnOworICAgICAgeworICAgICAgICBFbnRlckV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dCBVbmV2YWx1YXRlZChTLCBTZW1hOjpFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQ6OlVuZXZhbHVhdGVkKTsKKyAgICAgICAgRXhwclJlc3VsdCBSZXN1bHQgPSBTLlN1YnN0RXhwcihBLT5nZXRBcmcoKSwgVGVtcGxhdGVBcmdzKTsKKyAgICAgICAgdGVtcEluc3RBcmcgPSBSZXN1bHQuZ2V0QXM8RXhwcj4oKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXcgKEMpIEd1YXJkZWRCeUF0dHIoQS0+Z2V0TG9jYXRpb24oKSwgQywgdGVtcEluc3RBcmcsIEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Okd1YXJkZWRWYXI6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PEd1YXJkZWRWYXJBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6SG90OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxIb3RBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6SUJBY3Rpb246IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PElCQWN0aW9uQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OklCT3V0bGV0OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxJQk91dGxldEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpJQk91dGxldENvbGxlY3Rpb246IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PElCT3V0bGV0Q29sbGVjdGlvbkF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpJRnVuYzogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8SUZ1bmNBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6SW5pdFByaW9yaXR5OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxJbml0UHJpb3JpdHlBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6SW5pdFNlZzogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8SW5pdFNlZ0F0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpJbnRlbE9jbEJpY2M6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PEludGVsT2NsQmljY0F0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpJbnRlcm5hbExpbmthZ2U6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PEludGVybmFsTGlua2FnZUF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpMVE9WaXNpYmlsaXR5UHVibGljOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxMVE9WaXNpYmlsaXR5UHVibGljQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkxheW91dFZlcnNpb246IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PExheW91dFZlcnNpb25BdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6TG9ja1JldHVybmVkOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxMb2NrUmV0dXJuZWRBdHRyPihBdCk7CisgICAgICBFeHByICogdGVtcEluc3RBcmc7CisgICAgICB7CisgICAgICAgIEVudGVyRXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0IFVuZXZhbHVhdGVkKFMsIFNlbWE6OkV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dDo6VW5ldmFsdWF0ZWQpOworICAgICAgICBFeHByUmVzdWx0IFJlc3VsdCA9IFMuU3Vic3RFeHByKEEtPmdldEFyZygpLCBUZW1wbGF0ZUFyZ3MpOworICAgICAgICB0ZW1wSW5zdEFyZyA9IFJlc3VsdC5nZXRBczxFeHByPigpOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyAoQykgTG9ja1JldHVybmVkQXR0cihBLT5nZXRMb2NhdGlvbigpLCBDLCB0ZW1wSW5zdEFyZywgQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6TG9ja3NFeGNsdWRlZDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8TG9ja3NFeGNsdWRlZEF0dHI+KEF0KTsKKyAgICAgIGF1dG8gKnRlbXBJbnN0QXJncyA9IG5ldyAoQywgMTYpIEV4cHIgKltBLT5hcmdzX3NpemUoKV07CisgICAgICB7CisgICAgICAgIEVudGVyRXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0IFVuZXZhbHVhdGVkKFMsIFNlbWE6OkV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dDo6VW5ldmFsdWF0ZWQpOworICAgICAgICBFeHByICogKlRJID0gdGVtcEluc3RBcmdzOworICAgICAgICBFeHByICogKkkgPSBBLT5hcmdzX2JlZ2luKCk7CisgICAgICAgIEV4cHIgKiAqRSA9IEEtPmFyZ3NfZW5kKCk7CisgICAgICAgIGZvciAoOyBJICE9IEU7ICsrSSwgKytUSSkgeworICAgICAgICAgIEV4cHJSZXN1bHQgUmVzdWx0ID0gUy5TdWJzdEV4cHIoKkksIFRlbXBsYXRlQXJncyk7CisgICAgICAgICAgKlRJID0gUmVzdWx0LmdldEFzPEV4cHI+KCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXcgKEMpIExvY2tzRXhjbHVkZWRBdHRyKEEtPmdldExvY2F0aW9uKCksIEMsIHRlbXBJbnN0QXJncywgQS0+YXJnc19zaXplKCksIEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Okxvb3BIaW50OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxMb29wSGludEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpNU0FCSTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8TVNBQklBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6TVNJbmhlcml0YW5jZTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8TVNJbmhlcml0YW5jZUF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpNU05vVlRhYmxlOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxNU05vVlRhYmxlQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok1TUDQzMEludGVycnVwdDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8TVNQNDMwSW50ZXJydXB0QXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok1TU3RydWN0OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxNU1N0cnVjdEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpNU1Z0b3JEaXNwOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxNU1Z0b3JEaXNwQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok1heEZpZWxkQWxpZ25tZW50OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxNYXhGaWVsZEFsaWdubWVudEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpNYXlBbGlhczogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8TWF5QWxpYXNBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6TWljcm9NaXBzOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxNaWNyb01pcHNBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6TWluU2l6ZTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8TWluU2l6ZUF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpNaXBzMTY6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE1pcHMxNkF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpNaXBzSW50ZXJydXB0OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxNaXBzSW50ZXJydXB0QXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok1pcHNMb25nQ2FsbDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8TWlwc0xvbmdDYWxsQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok1pcHNTaG9ydENhbGw6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE1pcHNTaG9ydENhbGxBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6TW9kZTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8TW9kZUF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpOU0NvbnN1bWVkOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxOU0NvbnN1bWVkQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok5TQ29uc3VtZXNTZWxmOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxOU0NvbnN1bWVzU2VsZkF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpOU1JldHVybnNBdXRvcmVsZWFzZWQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE5TUmV0dXJuc0F1dG9yZWxlYXNlZEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpOU1JldHVybnNOb3RSZXRhaW5lZDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8TlNSZXR1cm5zTm90UmV0YWluZWRBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6TlNSZXR1cm5zUmV0YWluZWQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE5TUmV0dXJuc1JldGFpbmVkQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok5ha2VkOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxOYWtlZEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpOb0FsaWFzOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxOb0FsaWFzQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok5vQ29tbW9uOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxOb0NvbW1vbkF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpOb0RlYnVnOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxOb0RlYnVnQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok5vRHVwbGljYXRlOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxOb0R1cGxpY2F0ZUF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpOb0VzY2FwZTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8Tm9Fc2NhcGVBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Tm9JbmxpbmU6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE5vSW5saW5lQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok5vSW5zdHJ1bWVudEZ1bmN0aW9uOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxOb0luc3RydW1lbnRGdW5jdGlvbkF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpOb01pY3JvTWlwczogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8Tm9NaWNyb01pcHNBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Tm9NaXBzMTY6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE5vTWlwczE2QXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok5vUmV0dXJuOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxOb1JldHVybkF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpOb1Nhbml0aXplOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxOb1Nhbml0aXplQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok5vU3BsaXRTdGFjazogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8Tm9TcGxpdFN0YWNrQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok5vVGhyZWFkU2FmZXR5QW5hbHlzaXM6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE5vVGhyZWFkU2FmZXR5QW5hbHlzaXNBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Tm9UaHJvdzogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8Tm9UaHJvd0F0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpOb25OdWxsOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxOb25OdWxsQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok5vdFRhaWxDYWxsZWQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE5vdFRhaWxDYWxsZWRBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T01QQ2FwdHVyZUtpbmQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE9NUENhcHR1cmVLaW5kQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9NUENhcHR1cmVOb0luaXQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE9NUENhcHR1cmVOb0luaXRBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T01QRGVjbGFyZVNpbWREZWNsOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxPTVBEZWNsYXJlU2ltZERlY2xBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T01QRGVjbGFyZVRhcmdldERlY2w6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE9NUERlY2xhcmVUYXJnZXREZWNsQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9NUFJlZmVyZW5jZWRWYXI6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE9NUFJlZmVyZW5jZWRWYXJBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T01QVGhyZWFkUHJpdmF0ZURlY2w6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE9NUFRocmVhZFByaXZhdGVEZWNsQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9iakNCb3hhYmxlOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxPYmpDQm94YWJsZUF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPYmpDQnJpZGdlOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxPYmpDQnJpZGdlQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9iakNCcmlkZ2VNdXRhYmxlOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxPYmpDQnJpZGdlTXV0YWJsZUF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPYmpDQnJpZGdlUmVsYXRlZDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8T2JqQ0JyaWRnZVJlbGF0ZWRBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T2JqQ0Rlc2lnbmF0ZWRJbml0aWFsaXplcjogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8T2JqQ0Rlc2lnbmF0ZWRJbml0aWFsaXplckF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPYmpDRXhjZXB0aW9uOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxPYmpDRXhjZXB0aW9uQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9iakNFeHBsaWNpdFByb3RvY29sSW1wbDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8T2JqQ0V4cGxpY2l0UHJvdG9jb2xJbXBsQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9iakNJbmRlcGVuZGVudENsYXNzOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxPYmpDSW5kZXBlbmRlbnRDbGFzc0F0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPYmpDTWV0aG9kRmFtaWx5OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxPYmpDTWV0aG9kRmFtaWx5QXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9iakNOU09iamVjdDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8T2JqQ05TT2JqZWN0QXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9iakNQcmVjaXNlTGlmZXRpbWU6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE9iakNQcmVjaXNlTGlmZXRpbWVBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxPYmpDUmVxdWlyZXNQcm9wZXJ0eURlZnNBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T2JqQ1JlcXVpcmVzU3VwZXI6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE9iakNSZXF1aXJlc1N1cGVyQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9iakNSZXR1cm5zSW5uZXJQb2ludGVyOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxPYmpDUmV0dXJuc0lubmVyUG9pbnRlckF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPYmpDUm9vdENsYXNzOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxPYmpDUm9vdENsYXNzQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9iakNSdW50aW1lTmFtZTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8T2JqQ1J1bnRpbWVOYW1lQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9iakNSdW50aW1lVmlzaWJsZTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8T2JqQ1J1bnRpbWVWaXNpYmxlQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE9iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWRBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T3BlbkNMQWNjZXNzOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxPcGVuQ0xBY2Nlc3NBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T3BlbkNMSW50ZWxSZXFkU3ViR3JvdXBTaXplOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxPcGVuQ0xJbnRlbFJlcWRTdWJHcm91cFNpemVBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T3BlbkNMS2VybmVsOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxPcGVuQ0xLZXJuZWxBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T3BlbkNMVW5yb2xsSGludDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8T3BlbkNMVW5yb2xsSGludEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPcHRpbWl6ZU5vbmU6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE9wdGltaXplTm9uZUF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPdmVybG9hZGFibGU6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PE92ZXJsb2FkYWJsZUF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPdmVycmlkZTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8T3ZlcnJpZGVBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T3duZXJzaGlwOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxPd25lcnNoaXBBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6UGFja2VkOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxQYWNrZWRBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6UGFyYW1UeXBlc3RhdGU6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFBhcmFtVHlwZXN0YXRlQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlBhc2NhbDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8UGFzY2FsQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlBhc3NPYmplY3RTaXplOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxQYXNzT2JqZWN0U2l6ZUF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpQY3M6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFBjc0F0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpQcmFnbWFDbGFuZ0JTU1NlY3Rpb246IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFByYWdtYUNsYW5nQlNTU2VjdGlvbkF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpQcmFnbWFDbGFuZ0RhdGFTZWN0aW9uOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxQcmFnbWFDbGFuZ0RhdGFTZWN0aW9uQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlByYWdtYUNsYW5nUm9kYXRhU2VjdGlvbjogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8UHJhZ21hQ2xhbmdSb2RhdGFTZWN0aW9uQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlByYWdtYUNsYW5nVGV4dFNlY3Rpb246IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFByYWdtYUNsYW5nVGV4dFNlY3Rpb25BdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6UHJlc2VydmVBbGw6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFByZXNlcnZlQWxsQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlByZXNlcnZlTW9zdDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8UHJlc2VydmVNb3N0QXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlB0R3VhcmRlZEJ5OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxQdEd1YXJkZWRCeUF0dHI+KEF0KTsKKyAgICAgIEV4cHIgKiB0ZW1wSW5zdEFyZzsKKyAgICAgIHsKKyAgICAgICAgRW50ZXJFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQgVW5ldmFsdWF0ZWQoUywgU2VtYTo6RXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0OjpVbmV2YWx1YXRlZCk7CisgICAgICAgIEV4cHJSZXN1bHQgUmVzdWx0ID0gUy5TdWJzdEV4cHIoQS0+Z2V0QXJnKCksIFRlbXBsYXRlQXJncyk7CisgICAgICAgIHRlbXBJbnN0QXJnID0gUmVzdWx0LmdldEFzPEV4cHI+KCk7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IChDKSBQdEd1YXJkZWRCeUF0dHIoQS0+Z2V0TG9jYXRpb24oKSwgQywgdGVtcEluc3RBcmcsIEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlB0R3VhcmRlZFZhcjogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8UHRHdWFyZGVkVmFyQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlB1cmU6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFB1cmVBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6UmVnQ2FsbDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8UmVnQ2FsbEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpSZWxlYXNlQ2FwYWJpbGl0eTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8UmVsZWFzZUNhcGFiaWxpdHlBdHRyPihBdCk7CisgICAgICBhdXRvICp0ZW1wSW5zdEFyZ3MgPSBuZXcgKEMsIDE2KSBFeHByICpbQS0+YXJnc19zaXplKCldOworICAgICAgeworICAgICAgICBFbnRlckV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dCBVbmV2YWx1YXRlZChTLCBTZW1hOjpFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQ6OlVuZXZhbHVhdGVkKTsKKyAgICAgICAgRXhwciAqICpUSSA9IHRlbXBJbnN0QXJnczsKKyAgICAgICAgRXhwciAqICpJID0gQS0+YXJnc19iZWdpbigpOworICAgICAgICBFeHByICogKkUgPSBBLT5hcmdzX2VuZCgpOworICAgICAgICBmb3IgKDsgSSAhPSBFOyArK0ksICsrVEkpIHsKKyAgICAgICAgICBFeHByUmVzdWx0IFJlc3VsdCA9IFMuU3Vic3RFeHByKCpJLCBUZW1wbGF0ZUFyZ3MpOworICAgICAgICAgICpUSSA9IFJlc3VsdC5nZXRBczxFeHByPigpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IChDKSBSZWxlYXNlQ2FwYWJpbGl0eUF0dHIoQS0+Z2V0TG9jYXRpb24oKSwgQywgdGVtcEluc3RBcmdzLCBBLT5hcmdzX3NpemUoKSwgQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6UmVuZGVyU2NyaXB0S2VybmVsOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxSZW5kZXJTY3JpcHRLZXJuZWxBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6UmVxZFdvcmtHcm91cFNpemU6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFJlcWRXb3JrR3JvdXBTaXplQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlJlcXVpcmVDb25zdGFudEluaXQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFJlcXVpcmVDb25zdGFudEluaXRBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6UmVxdWlyZXNDYXBhYmlsaXR5OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxSZXF1aXJlc0NhcGFiaWxpdHlBdHRyPihBdCk7CisgICAgICBhdXRvICp0ZW1wSW5zdEFyZ3MgPSBuZXcgKEMsIDE2KSBFeHByICpbQS0+YXJnc19zaXplKCldOworICAgICAgeworICAgICAgICBFbnRlckV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dCBVbmV2YWx1YXRlZChTLCBTZW1hOjpFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQ6OlVuZXZhbHVhdGVkKTsKKyAgICAgICAgRXhwciAqICpUSSA9IHRlbXBJbnN0QXJnczsKKyAgICAgICAgRXhwciAqICpJID0gQS0+YXJnc19iZWdpbigpOworICAgICAgICBFeHByICogKkUgPSBBLT5hcmdzX2VuZCgpOworICAgICAgICBmb3IgKDsgSSAhPSBFOyArK0ksICsrVEkpIHsKKyAgICAgICAgICBFeHByUmVzdWx0IFJlc3VsdCA9IFMuU3Vic3RFeHByKCpJLCBUZW1wbGF0ZUFyZ3MpOworICAgICAgICAgICpUSSA9IFJlc3VsdC5nZXRBczxFeHByPigpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IChDKSBSZXF1aXJlc0NhcGFiaWxpdHlBdHRyKEEtPmdldExvY2F0aW9uKCksIEMsIHRlbXBJbnN0QXJncywgQS0+YXJnc19zaXplKCksIEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlJlc3RyaWN0OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxSZXN0cmljdEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpSZXR1cm5UeXBlc3RhdGU6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFJldHVyblR5cGVzdGF0ZUF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpSZXR1cm5zTm9uTnVsbDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8UmV0dXJuc05vbk51bGxBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6UmV0dXJuc1R3aWNlOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxSZXR1cm5zVHdpY2VBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6U2NvcGVkTG9ja2FibGU6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFNjb3BlZExvY2thYmxlQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlNlY3Rpb246IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFNlY3Rpb25BdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6U2VsZWN0QW55OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxTZWxlY3RBbnlBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6U2VudGluZWw6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFNlbnRpbmVsQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlNldFR5cGVzdGF0ZTogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8U2V0VHlwZXN0YXRlQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlNoYXJlZFRyeWxvY2tGdW5jdGlvbjogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8U2hhcmVkVHJ5bG9ja0Z1bmN0aW9uQXR0cj4oQXQpOworICAgICAgRXhwciAqIHRlbXBJbnN0U3VjY2Vzc1ZhbHVlOworICAgICAgeworICAgICAgICBFbnRlckV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dCBVbmV2YWx1YXRlZChTLCBTZW1hOjpFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQ6OlVuZXZhbHVhdGVkKTsKKyAgICAgICAgRXhwclJlc3VsdCBSZXN1bHQgPSBTLlN1YnN0RXhwcihBLT5nZXRTdWNjZXNzVmFsdWUoKSwgVGVtcGxhdGVBcmdzKTsKKyAgICAgICAgdGVtcEluc3RTdWNjZXNzVmFsdWUgPSBSZXN1bHQuZ2V0QXM8RXhwcj4oKTsKKyAgICAgIH0KKyAgICAgIGF1dG8gKnRlbXBJbnN0QXJncyA9IG5ldyAoQywgMTYpIEV4cHIgKltBLT5hcmdzX3NpemUoKV07CisgICAgICB7CisgICAgICAgIEVudGVyRXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0IFVuZXZhbHVhdGVkKFMsIFNlbWE6OkV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dDo6VW5ldmFsdWF0ZWQpOworICAgICAgICBFeHByICogKlRJID0gdGVtcEluc3RBcmdzOworICAgICAgICBFeHByICogKkkgPSBBLT5hcmdzX2JlZ2luKCk7CisgICAgICAgIEV4cHIgKiAqRSA9IEEtPmFyZ3NfZW5kKCk7CisgICAgICAgIGZvciAoOyBJICE9IEU7ICsrSSwgKytUSSkgeworICAgICAgICAgIEV4cHJSZXN1bHQgUmVzdWx0ID0gUy5TdWJzdEV4cHIoKkksIFRlbXBsYXRlQXJncyk7CisgICAgICAgICAgKlRJID0gUmVzdWx0LmdldEFzPEV4cHI+KCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXcgKEMpIFNoYXJlZFRyeWxvY2tGdW5jdGlvbkF0dHIoQS0+Z2V0TG9jYXRpb24oKSwgQywgdGVtcEluc3RTdWNjZXNzVmFsdWUsIHRlbXBJbnN0QXJncywgQS0+YXJnc19zaXplKCksIEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlN0ZENhbGw6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFN0ZENhbGxBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6U3VwcHJlc3M6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFN1cHByZXNzQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlN3aWZ0Q2FsbDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8U3dpZnRDYWxsQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlN3aWZ0Q29udGV4dDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8U3dpZnRDb250ZXh0QXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlN3aWZ0RXJyb3JSZXN1bHQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFN3aWZ0RXJyb3JSZXN1bHRBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6U3dpZnRJbmRpcmVjdFJlc3VsdDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8U3dpZnRJbmRpcmVjdFJlc3VsdEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpTeXNWQUJJOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxTeXNWQUJJQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlRMU01vZGVsOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxUTFNNb2RlbEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpUYXJnZXQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFRhcmdldEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpUZXN0VHlwZXN0YXRlOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxUZXN0VHlwZXN0YXRlQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlRoaXNDYWxsOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxUaGlzQ2FsbEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpUaHJlYWQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFRocmVhZEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpUcmFuc3BhcmVudFVuaW9uOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxUcmFuc3BhcmVudFVuaW9uQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlRyaXZpYWxBQkk6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFRyaXZpYWxBQklBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6VHJ5QWNxdWlyZUNhcGFiaWxpdHk6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFRyeUFjcXVpcmVDYXBhYmlsaXR5QXR0cj4oQXQpOworICAgICAgRXhwciAqIHRlbXBJbnN0U3VjY2Vzc1ZhbHVlOworICAgICAgeworICAgICAgICBFbnRlckV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dCBVbmV2YWx1YXRlZChTLCBTZW1hOjpFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQ6OlVuZXZhbHVhdGVkKTsKKyAgICAgICAgRXhwclJlc3VsdCBSZXN1bHQgPSBTLlN1YnN0RXhwcihBLT5nZXRTdWNjZXNzVmFsdWUoKSwgVGVtcGxhdGVBcmdzKTsKKyAgICAgICAgdGVtcEluc3RTdWNjZXNzVmFsdWUgPSBSZXN1bHQuZ2V0QXM8RXhwcj4oKTsKKyAgICAgIH0KKyAgICAgIGF1dG8gKnRlbXBJbnN0QXJncyA9IG5ldyAoQywgMTYpIEV4cHIgKltBLT5hcmdzX3NpemUoKV07CisgICAgICB7CisgICAgICAgIEVudGVyRXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0IFVuZXZhbHVhdGVkKFMsIFNlbWE6OkV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dDo6VW5ldmFsdWF0ZWQpOworICAgICAgICBFeHByICogKlRJID0gdGVtcEluc3RBcmdzOworICAgICAgICBFeHByICogKkkgPSBBLT5hcmdzX2JlZ2luKCk7CisgICAgICAgIEV4cHIgKiAqRSA9IEEtPmFyZ3NfZW5kKCk7CisgICAgICAgIGZvciAoOyBJICE9IEU7ICsrSSwgKytUSSkgeworICAgICAgICAgIEV4cHJSZXN1bHQgUmVzdWx0ID0gUy5TdWJzdEV4cHIoKkksIFRlbXBsYXRlQXJncyk7CisgICAgICAgICAgKlRJID0gUmVzdWx0LmdldEFzPEV4cHI+KCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXcgKEMpIFRyeUFjcXVpcmVDYXBhYmlsaXR5QXR0cihBLT5nZXRMb2NhdGlvbigpLCBDLCB0ZW1wSW5zdFN1Y2Nlc3NWYWx1ZSwgdGVtcEluc3RBcmdzLCBBLT5hcmdzX3NpemUoKSwgQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6VHlwZVRhZ0ZvckRhdGF0eXBlOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxUeXBlVGFnRm9yRGF0YXR5cGVBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6VHlwZVZpc2liaWxpdHk6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlVuYXZhaWxhYmxlOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxVbmF2YWlsYWJsZUF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpVbnVzZWQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFVudXNlZEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpVc2VkOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxVc2VkQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlV1aWQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFV1aWRBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6VmVjUmV0dXJuOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxWZWNSZXR1cm5BdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6VmVjVHlwZUhpbnQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFZlY1R5cGVIaW50QXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlZlY3RvckNhbGw6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFZlY3RvckNhbGxBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6VmlzaWJpbGl0eTogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6V2FyblVudXNlZDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8V2FyblVudXNlZEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpXYXJuVW51c2VkUmVzdWx0OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxXYXJuVW51c2VkUmVzdWx0QXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OldlYWs6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFdlYWtBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6V2Vha0ltcG9ydDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8V2Vha0ltcG9ydEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpXZWFrUmVmOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxXZWFrUmVmQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OldvcmtHcm91cFNpemVIaW50OiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxXb3JrR3JvdXBTaXplSGludEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpYODZGb3JjZUFsaWduQXJnUG9pbnRlcjogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8WDg2Rm9yY2VBbGlnbkFyZ1BvaW50ZXJBdHRyPihBdCk7CisgICAgICByZXR1cm4gQS0+Y2xvbmUoQyk7CisgICAgfQorICAgIGNhc2UgYXR0cjo6WFJheUluc3RydW1lbnQ6IHsKKyAgICAgIGNvbnN0IGF1dG8gKkEgPSBjYXN0PFhSYXlJbnN0cnVtZW50QXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlhSYXlMb2dBcmdzOiB7CisgICAgICBjb25zdCBhdXRvICpBID0gY2FzdDxYUmF5TG9nQXJnc0F0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgIH0gLy8gZW5kIHN3aXRjaAorICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGF0dHJpYnV0ZSEiKTsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK0F0dHIgKmluc3RhbnRpYXRlVGVtcGxhdGVBdHRyaWJ1dGVGb3JEZWNsKGNvbnN0IEF0dHIgKkF0LAorIEFTVENvbnRleHQgJkMsIFNlbWEgJlMsCisgICAgICAgIGNvbnN0IE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmVGVtcGxhdGVBcmdzKSB7CisgIHN3aXRjaCAoQXQtPmdldEtpbmQoKSkgeworICAgIGNhc2UgYXR0cjo6QU1ER1BVRmxhdFdvcmtHcm91cFNpemU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFNREdQVU51bVNHUFI6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFNREdQVU51bVZHUFI6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFNREdQVVdhdmVzUGVyRVU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFSTUludGVycnVwdDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QVZSSW50ZXJydXB0OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBVlJTaWduYWw6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFiaVRhZzogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8QWJpVGFnQXR0cj4oQXQpOworICAgICAgcmV0dXJuIEEtPmNsb25lKEMpOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFjcXVpcmVDYXBhYmlsaXR5OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBY3F1aXJlZEFmdGVyOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBY3F1aXJlZEJlZm9yZTogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QWxpYXM6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFsaWduTWFjNjhrOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBbGlnblZhbHVlOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBbGlnbmVkOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBbGxvY0FsaWduOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBbGxvY1NpemU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFsd2F5c0lubGluZTogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QW5hbHl6ZXJOb1JldHVybjogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QW5ub3RhdGU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFueVg4NkludGVycnVwdDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QW55WDg2Tm9DYWxsZXJTYXZlZFJlZ2lzdGVyczogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QW55WDg2Tm9DZkNoZWNrOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBcmNXZWFrcmVmVW5hdmFpbGFibGU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFyZ3VtZW50V2l0aFR5cGVUYWc6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFydGlmaWNpYWw6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkFzbUxhYmVsOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBc3NlcnRDYXBhYmlsaXR5OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBc3NlcnRFeGNsdXNpdmVMb2NrOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBc3NlcnRTaGFyZWRMb2NrOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBc3N1bWVBbGlnbmVkOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpBdmFpbGFiaWxpdHk6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkJsb2NrczogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6QzExTm9SZXR1cm46IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkNEZWNsOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDRkF1ZGl0ZWRUcmFuc2ZlcjogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q0ZDb25zdW1lZDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q0ZSZXR1cm5zTm90UmV0YWluZWQ6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkNGUmV0dXJuc1JldGFpbmVkOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDRlVua25vd25UcmFuc2ZlcjogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q1VEQUNvbnN0YW50OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDVURBRGV2aWNlOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDVURBR2xvYmFsOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDVURBSG9zdDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q1VEQUludmFsaWRUYXJnZXQ6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkNVREFMYXVuY2hCb3VuZHM6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkNVREFTaGFyZWQ6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkNYWDExTm9SZXR1cm46IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkNhbGxhYmxlV2hlbjogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q2FwYWJpbGl0eTogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q2FwdHVyZWRSZWNvcmQ6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkNhcnJpZXNEZXBlbmRlbmN5OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDbGVhbnVwOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDb2xkOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDb21tb246IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkNvbnN0OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDb25zdHJ1Y3RvcjogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q29uc3VtYWJsZTogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Q29uc3VtYWJsZUF1dG9DYXN0OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDb25zdW1hYmxlU2V0T25SZWFkOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpDb252ZXJnZW50OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpETExFeHBvcnQ6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkRMTEltcG9ydDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6RGVwcmVjYXRlZDogeworICAgICAgY29uc3QgYXV0byAqQSA9IGNhc3Q8RGVwcmVjYXRlZEF0dHI+KEF0KTsKKyAgICAgIHJldHVybiBBLT5jbG9uZShDKTsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpEZXN0cnVjdG9yOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpEaWFnbm9zZUlmOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpEaXNhYmxlVGFpbENhbGxzOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpFbXB0eUJhc2VzOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpFbmFibGVJZjogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6RW51bUV4dGVuc2liaWxpdHk6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkV4Y2x1c2l2ZVRyeWxvY2tGdW5jdGlvbjogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6RXh0ZXJuYWxTb3VyY2VTeW1ib2w6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkZhbGxUaHJvdWdoOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpGYXN0Q2FsbDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6RmluYWw6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkZsYWdFbnVtOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpGbGF0dGVuOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpGb3JtYXQ6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkZvcm1hdEFyZzogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6R05VSW5saW5lOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpHdWFyZGVkQnk6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Okd1YXJkZWRWYXI6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkhvdDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6SUJBY3Rpb246IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OklCT3V0bGV0OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpJQk91dGxldENvbGxlY3Rpb246IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OklGdW5jOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpJbml0UHJpb3JpdHk6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkluaXRTZWc6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkludGVsT2NsQmljYzogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6SW50ZXJuYWxMaW5rYWdlOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpMVE9WaXNpYmlsaXR5UHVibGljOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpMYXlvdXRWZXJzaW9uOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpMb2NrUmV0dXJuZWQ6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OkxvY2tzRXhjbHVkZWQ6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Okxvb3BIaW50OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpNU0FCSTogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6TVNJbmhlcml0YW5jZTogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6TVNOb1ZUYWJsZTogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6TVNQNDMwSW50ZXJydXB0OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpNU1N0cnVjdDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6TVNWdG9yRGlzcDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6TWF4RmllbGRBbGlnbm1lbnQ6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok1heUFsaWFzOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpNaWNyb01pcHM6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok1pblNpemU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok1pcHMxNjogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6TWlwc0ludGVycnVwdDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6TWlwc0xvbmdDYWxsOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpNaXBzU2hvcnRDYWxsOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpNb2RlOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpOU0NvbnN1bWVkOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpOU0NvbnN1bWVzU2VsZjogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6TlNSZXR1cm5zQXV0b3JlbGVhc2VkOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpOU1JldHVybnNOb3RSZXRhaW5lZDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6TlNSZXR1cm5zUmV0YWluZWQ6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok5ha2VkOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpOb0FsaWFzOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpOb0NvbW1vbjogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Tm9EZWJ1ZzogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Tm9EdXBsaWNhdGU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok5vRXNjYXBlOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpOb0lubGluZTogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Tm9JbnN0cnVtZW50RnVuY3Rpb246IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok5vTWljcm9NaXBzOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpOb01pcHMxNjogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Tm9SZXR1cm46IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok5vU2FuaXRpemU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok5vU3BsaXRTdGFjazogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Tm9UaHJlYWRTYWZldHlBbmFseXNpczogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Tm9UaHJvdzogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Tm9uTnVsbDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6Tm90VGFpbENhbGxlZDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T01QQ2FwdHVyZUtpbmQ6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9NUENhcHR1cmVOb0luaXQ6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9NUERlY2xhcmVTaW1kRGVjbDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T01QRGVjbGFyZVRhcmdldERlY2w6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9NUFJlZmVyZW5jZWRWYXI6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9NUFRocmVhZFByaXZhdGVEZWNsOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPYmpDQm94YWJsZTogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T2JqQ0JyaWRnZTogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T2JqQ0JyaWRnZU11dGFibGU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9iakNCcmlkZ2VSZWxhdGVkOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPYmpDRGVzaWduYXRlZEluaXRpYWxpemVyOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPYmpDRXhjZXB0aW9uOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPYmpDRXhwbGljaXRQcm90b2NvbEltcGw6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9iakNJbmRlcGVuZGVudENsYXNzOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPYmpDTWV0aG9kRmFtaWx5OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPYmpDTlNPYmplY3Q6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9iakNQcmVjaXNlTGlmZXRpbWU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9iakNSZXF1aXJlc1Byb3BlcnR5RGVmczogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T2JqQ1JlcXVpcmVzU3VwZXI6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9iakNSZXR1cm5zSW5uZXJQb2ludGVyOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPYmpDUm9vdENsYXNzOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPYmpDUnVudGltZU5hbWU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9iakNSdW50aW1lVmlzaWJsZTogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T2JqQ1N1YmNsYXNzaW5nUmVzdHJpY3RlZDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T3BlbkNMQWNjZXNzOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPcGVuQ0xJbnRlbFJlcWRTdWJHcm91cFNpemU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok9wZW5DTEtlcm5lbDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T3BlbkNMVW5yb2xsSGludDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6T3B0aW1pemVOb25lOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPdmVybG9hZGFibGU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Ok92ZXJyaWRlOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpPd25lcnNoaXA6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlBhY2tlZDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6UGFyYW1UeXBlc3RhdGU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlBhc2NhbDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6UGFzc09iamVjdFNpemU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlBjczogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6UHJhZ21hQ2xhbmdCU1NTZWN0aW9uOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpQcmFnbWFDbGFuZ0RhdGFTZWN0aW9uOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb246IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlByYWdtYUNsYW5nVGV4dFNlY3Rpb246IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlByZXNlcnZlQWxsOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpQcmVzZXJ2ZU1vc3Q6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlB0R3VhcmRlZEJ5OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpQdEd1YXJkZWRWYXI6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlB1cmU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlJlZ0NhbGw6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlJlbGVhc2VDYXBhYmlsaXR5OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpSZW5kZXJTY3JpcHRLZXJuZWw6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlJlcWRXb3JrR3JvdXBTaXplOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpSZXF1aXJlQ29uc3RhbnRJbml0OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpSZXF1aXJlc0NhcGFiaWxpdHk6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlJlc3RyaWN0OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpSZXR1cm5UeXBlc3RhdGU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlJldHVybnNOb25OdWxsOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpSZXR1cm5zVHdpY2U6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlNjb3BlZExvY2thYmxlOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpTZWN0aW9uOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpTZWxlY3RBbnk6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlNlbnRpbmVsOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpTZXRUeXBlc3RhdGU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlNoYXJlZFRyeWxvY2tGdW5jdGlvbjogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6U3RkQ2FsbDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6U3VwcHJlc3M6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlN3aWZ0Q2FsbDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6U3dpZnRDb250ZXh0OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpTd2lmdEVycm9yUmVzdWx0OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpTd2lmdEluZGlyZWN0UmVzdWx0OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpTeXNWQUJJOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpUTFNNb2RlbDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6VGFyZ2V0OiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpUZXN0VHlwZXN0YXRlOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpUaGlzQ2FsbDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6VGhyZWFkOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpUcmFuc3BhcmVudFVuaW9uOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpUcml2aWFsQUJJOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpUcnlBY3F1aXJlQ2FwYWJpbGl0eTogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6VHlwZVRhZ0ZvckRhdGF0eXBlOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpUeXBlVmlzaWJpbGl0eTogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6VW5hdmFpbGFibGU6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6OlVudXNlZDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6VXNlZDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6VXVpZDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6VmVjUmV0dXJuOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpWZWNUeXBlSGludDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6VmVjdG9yQ2FsbDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6VmlzaWJpbGl0eTogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6V2FyblVudXNlZDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6V2FyblVudXNlZFJlc3VsdDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6V2VhazogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6V2Vha0ltcG9ydDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6V2Vha1JlZjogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6V29ya0dyb3VwU2l6ZUhpbnQ6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjYXNlIGF0dHI6Olg4NkZvcmNlQWxpZ25BcmdQb2ludGVyOiB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY2FzZSBhdHRyOjpYUmF5SW5zdHJ1bWVudDogeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgYXR0cjo6WFJheUxvZ0FyZ3M6IHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgfSAvLyBlbmQgc3dpdGNoCisgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gYXR0cmlidXRlISIpOworICByZXR1cm4gbnVsbHB0cjsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIHNlbWEKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9BdHRyaWJ1dGVMaXN0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0F0dHJpYnV0ZUxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjViYjFmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9BdHRyaWJ1dGVMaXN0LmgKQEAgLTAsMCArMSw5MzYgQEAKKy8vPT09LSBBdHRyaWJ1dGVMaXN0LmggLSBQYXJzZWQgYXR0cmlidXRlIHNldHMgLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEF0dHJpYnV0ZUxpc3QgY2xhc3MsIHdoaWNoIGlzIHVzZWQgdG8gY29sbGVjdAorLy8gcGFyc2VkIGF0dHJpYnV0ZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NFTUFfQVRUUklCVVRFTElTVF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU0VNQV9BVFRSSUJVVEVMSVNUX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0F0dHJTdWJqZWN0TWF0Y2hSdWxlcy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVGFyZ2V0SW5mby5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1ZlcnNpb25UdXBsZS5oIgorI2luY2x1ZGUgImNsYW5nL1NlbWEvT3duZXJzaGlwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlclVuaW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQVNUQ29udGV4dDsKK2NsYXNzIERlY2w7CitjbGFzcyBFeHByOworY2xhc3MgSWRlbnRpZmllckluZm87CitjbGFzcyBMYW5nT3B0aW9uczsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGluZm9ybWF0aW9uIGFib3V0IGEgY2hhbmdlIGluIGF2YWlsYWJpbGl0eSBmb3IKKy8vLyBhbiBlbnRpdHksIHdoaWNoIGlzIHBhcnQgb2YgdGhlIGVuY29kaW5nIG9mIHRoZSAnYXZhaWxhYmlsaXR5JworLy8vIGF0dHJpYnV0ZS4KK3N0cnVjdCBBdmFpbGFiaWxpdHlDaGFuZ2UgeworICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUga2V5d29yZCBpbmRpY2F0aW5nIHRoZSBraW5kIG9mIGNoYW5nZS4KKyAgU291cmNlTG9jYXRpb24gS2V5d29yZExvYzsKKworICAvLy8gXGJyaWVmIFRoZSB2ZXJzaW9uIG51bWJlciBhdCB3aGljaCB0aGUgY2hhbmdlIG9jY3VycmVkLgorICBWZXJzaW9uVHVwbGUgVmVyc2lvbjsKKworICAvLy8gXGJyaWVmIFRoZSBzb3VyY2UgcmFuZ2UgY292ZXJpbmcgdGhlIHZlcnNpb24gbnVtYmVyLgorICBTb3VyY2VSYW5nZSBWZXJzaW9uUmFuZ2U7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGF2YWlsYWJpbGl0eSBjaGFuZ2UgaXMgdmFsaWQuCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuICFWZXJzaW9uLmVtcHR5KCk7IH0KK307CisKK25hbWVzcGFjZSB7CisKK2VudW0gQXZhaWxhYmlsaXR5U2xvdCB7CisgIEludHJvZHVjZWRTbG90LCBEZXByZWNhdGVkU2xvdCwgT2Jzb2xldGVkU2xvdCwgTnVtQXZhaWxhYmlsaXR5U2xvdHMKK307CisKKy8vLyBEZXNjcmliZXMgdGhlIHRyYWlsaW5nIG9iamVjdCBmb3IgQXZhaWxhYmlsaXR5IGF0dHJpYnV0ZSBpbiBBdHRyaWJ1dGVMaXN0Lgorc3RydWN0IEF2YWlsYWJpbGl0eURhdGEgeworICBBdmFpbGFiaWxpdHlDaGFuZ2UgQ2hhbmdlc1tOdW1BdmFpbGFiaWxpdHlTbG90c107CisgIFNvdXJjZUxvY2F0aW9uIFN0cmljdExvYzsKKyAgY29uc3QgRXhwciAqUmVwbGFjZW1lbnQ7CisKKyAgQXZhaWxhYmlsaXR5RGF0YShjb25zdCBBdmFpbGFiaWxpdHlDaGFuZ2UgJkludHJvZHVjZWQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQXZhaWxhYmlsaXR5Q2hhbmdlICZEZXByZWNhdGVkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEF2YWlsYWJpbGl0eUNoYW5nZSAmT2Jzb2xldGVkLAorICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0cmljdCwgY29uc3QgRXhwciAqUmVwbGFjZUV4cHIpCisgICAgOiBTdHJpY3RMb2MoU3RyaWN0KSwgUmVwbGFjZW1lbnQoUmVwbGFjZUV4cHIpIHsKKyAgICBDaGFuZ2VzW0ludHJvZHVjZWRTbG90XSA9IEludHJvZHVjZWQ7CisgICAgQ2hhbmdlc1tEZXByZWNhdGVkU2xvdF0gPSBEZXByZWNhdGVkOworICAgIENoYW5nZXNbT2Jzb2xldGVkU2xvdF0gPSBPYnNvbGV0ZWQ7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlCisKKy8vLyBcYnJpZWYgV3JhcHMgYW4gaWRlbnRpZmllciBhbmQgb3B0aW9uYWwgc291cmNlIGxvY2F0aW9uIGZvciB0aGUgaWRlbnRpZmllci4KK3N0cnVjdCBJZGVudGlmaWVyTG9jIHsKKyAgU291cmNlTG9jYXRpb24gTG9jOworICBJZGVudGlmaWVySW5mbyAqSWRlbnQ7CisKKyAgc3RhdGljIElkZW50aWZpZXJMb2MgKmNyZWF0ZShBU1RDb250ZXh0ICZDdHgsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWRlbnQpOworfTsKKworLy8vIFxicmllZiBBIHVuaW9uIG9mIHRoZSB2YXJpb3VzIHBvaW50ZXIgdHlwZXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIGFuCisvLy8gQXR0cmlidXRlTGlzdCBhcyBhbiBhcmd1bWVudC4KK3VzaW5nIEFyZ3NVbmlvbiA9IGxsdm06OlBvaW50ZXJVbmlvbjxFeHByICosIElkZW50aWZpZXJMb2MgKj47Cit1c2luZyBBcmdzVmVjdG9yID0gbGx2bTo6U21hbGxWZWN0b3I8QXJnc1VuaW9uLCAxMlU+OworCisvLy8gQXR0cmlidXRlTGlzdCAtIFJlcHJlc2VudHMgYSBzeW50YWN0aWMgYXR0cmlidXRlLgorLy8vCisvLy8gRm9yIGEgR05VIGF0dHJpYnV0ZSwgdGhlcmUgYXJlIGZvdXIgZm9ybXMgb2YgdGhpcyBjb25zdHJ1Y3Q6CisvLy8KKy8vLyAxOiBfX2F0dHJpYnV0ZV9fKCggY29uc3QgKSkuIFBhcm1OYW1lL0FyZ3MvTnVtQXJncyB3aWxsIGFsbCBiZSB1bnVzZWQuCisvLy8gMjogX19hdHRyaWJ1dGVfXygoIG1vZGUoYnl0ZSkgKSkuIFBhcm1OYW1lIHVzZWQsIEFyZ3MvTnVtQXJncyB1bnVzZWQuCisvLy8gMzogX19hdHRyaWJ1dGVfXygoIGZvcm1hdChwcmludGYsIDEsIDIpICkpLiBQYXJtTmFtZS9BcmdzL051bUFyZ3MgYWxsIHVzZWQuCisvLy8gNDogX19hdHRyaWJ1dGVfXygoIGFsaWduZWQoMTYpICkpLiBQYXJtTmFtZSBpcyB1bnVzZWQsIEFyZ3MvTnVtIHVzZWQuCisvLy8KK2NsYXNzIEF0dHJpYnV0ZUxpc3QgeyAvLyBUT0RPOiBUaGlzIHNob3VsZCByZWFsbHkgYmUgY2FsbGVkIFBhcnNlZEF0dHJpYnV0ZQorcHVibGljOgorICAvLy8gVGhlIHN0eWxlIHVzZWQgdG8gc3BlY2lmeSBhbiBhdHRyaWJ1dGUuCisgIGVudW0gU3ludGF4IHsKKyAgICAvLy8gX19hdHRyaWJ1dGVfXygoLi4uKSkKKyAgICBBU19HTlUsCisKKyAgICAvLy8gW1suLi5dXQorICAgIEFTX0NYWDExLAorCisgICAgLy8vIFtbLi4uXV0KKyAgICBBU19DMngsCisKKyAgICAvLy8gX19kZWNsc3BlYyguLi4pCisgICAgQVNfRGVjbHNwZWMsCisKKyAgICAvLy8gW3V1aWQoIi4uLiIpXSBjbGFzcyBGb28KKyAgICBBU19NaWNyb3NvZnQsCisKKyAgICAvLy8gX19wdHIxNiwgYWxpZ25hcyguLi4pLCBldGMuCisgICAgQVNfS2V5d29yZCwKKworICAgIC8vLyAjcHJhZ21hIC4uLgorICAgIEFTX1ByYWdtYSwKKworICAgIC8vIE5vdGUgVGFibGVHZW4gZGVwZW5kcyBvbiB0aGUgb3JkZXIgYWJvdmUuICBEbyBub3QgYWRkIG9yIGNoYW5nZSB0aGUgb3JkZXIKKyAgICAvLyB3aXRob3V0IGFkZGluZyByZWxhdGVkIGNvZGUgdG8gVGFibGVHZW4vQ2xhbmdBdHRyRW1pdHRlci5jcHAuCisgICAgLy8vIENvbnRleHQtc2Vuc2l0aXZlIHZlcnNpb24gb2YgYSBrZXl3b3JkIGF0dHJpYnV0ZS4KKyAgICBBU19Db250ZXh0U2Vuc2l0aXZlS2V5d29yZCwKKyAgfTsKKworcHJpdmF0ZToKKyAgSWRlbnRpZmllckluZm8gKkF0dHJOYW1lOworICBJZGVudGlmaWVySW5mbyAqU2NvcGVOYW1lOworICBTb3VyY2VSYW5nZSBBdHRyUmFuZ2U7CisgIFNvdXJjZUxvY2F0aW9uIFNjb3BlTG9jOworICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYzsKKworICB1bnNpZ25lZCBBdHRyS2luZCA6IDE2OworCisgIC8vLyBUaGUgbnVtYmVyIG9mIGV4cHJlc3Npb24gYXJndW1lbnRzIHRoaXMgYXR0cmlidXRlIGhhcy4KKyAgLy8vIFRoZSBleHByZXNzaW9ucyB0aGVtc2VsdmVzIGFyZSBzdG9yZWQgYWZ0ZXIgdGhlIG9iamVjdC4KKyAgdW5zaWduZWQgTnVtQXJncyA6IDE2OworCisgIC8vLyBDb3JyZXNwb25kcyB0byB0aGUgU3ludGF4IGVudW0uCisgIHVuc2lnbmVkIFN5bnRheFVzZWQgOiAzOworCisgIC8vLyBUcnVlIGlmIGFscmVhZHkgZGlhZ25vc2VkIGFzIGludmFsaWQuCisgIG11dGFibGUgdW5zaWduZWQgSW52YWxpZCA6IDE7CisKKyAgLy8vIFRydWUgaWYgdGhpcyBhdHRyaWJ1dGUgd2FzIHVzZWQgYXMgYSB0eXBlIGF0dHJpYnV0ZS4KKyAgbXV0YWJsZSB1bnNpZ25lZCBVc2VkQXNUeXBlQXR0ciA6IDE7CisKKyAgLy8vIFRydWUgaWYgdGhpcyBoYXMgdGhlIGV4dHJhIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhbgorICAvLy8gYXZhaWxhYmlsaXR5IGF0dHJpYnV0ZS4KKyAgdW5zaWduZWQgSXNBdmFpbGFiaWxpdHkgOiAxOworCisgIC8vLyBUcnVlIGlmIHRoaXMgaGFzIGV4dHJhIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhCisgIC8vLyB0eXBlX3RhZ19mb3JfZGF0YXR5cGUgYXR0cmlidXRlLgorICB1bnNpZ25lZCBJc1R5cGVUYWdGb3JEYXRhdHlwZSA6IDE7CisKKyAgLy8vIFRydWUgaWYgdGhpcyBoYXMgZXh0cmEgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEKKyAgLy8vIE1pY3Jvc29mdCBfX2RlbGNzcGVjKHByb3BlcnR5KSBhdHRyaWJ1dGUuCisgIHVuc2lnbmVkIElzUHJvcGVydHkgOiAxOworCisgIC8vLyBUcnVlIGlmIHRoaXMgaGFzIGEgUGFyc2VkVHlwZQorICB1bnNpZ25lZCBIYXNQYXJzZWRUeXBlIDogMTsKKworICAvLy8gVHJ1ZSBpZiB0aGUgcHJvY2Vzc2luZyBjYWNoZSBpcyB2YWxpZC4KKyAgbXV0YWJsZSB1bnNpZ25lZCBIYXNQcm9jZXNzaW5nQ2FjaGUgOiAxOworCisgIC8vLyBBIGNhY2hlZCB2YWx1ZS4KKyAgbXV0YWJsZSB1bnNpZ25lZCBQcm9jZXNzaW5nQ2FjaGUgOiA4OworCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSAndW5hdmFpbGFibGUnIGtleXdvcmQgaW4gYW4KKyAgLy8vIGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGUuCisgIFNvdXJjZUxvY2F0aW9uIFVuYXZhaWxhYmxlTG9jOworICAKKyAgY29uc3QgRXhwciAqTWVzc2FnZUV4cHI7CisKKyAgLy8vIFRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgQXR0cmlidXRlTGlzdCAqTmV4dEluUG9zaXRpb24gPSBudWxscHRyOworCisgIC8vLyBUaGUgbmV4dCBhdHRyaWJ1dGUgYWxsb2NhdGVkIGluIHRoZSBjdXJyZW50IFBvb2wuCisgIEF0dHJpYnV0ZUxpc3QgKk5leHRJblBvb2wgPSBudWxscHRyOworCisgIC8vLyBBcmd1bWVudHMsIGlmIGFueSwgYXJlIHN0b3JlZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIG9iamVjdC4KKyAgQXJnc1VuaW9uICpnZXRBcmdzQnVmZmVyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxBcmdzVW5pb24gKj4odGhpcyArIDEpOyB9CisgIEFyZ3NVbmlvbiBjb25zdCAqZ2V0QXJnc0J1ZmZlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxBcmdzVW5pb24gY29uc3QgKj4odGhpcyArIDEpOworICB9CisKKyAgLy8vIEF2YWlsYWJpbGl0eSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBhcmd1bWVudHMsCisgIC8vLyBpZiBhbnksIGF0IHRoZSBlbmQgb2YgdGhlIG9iamVjdC4KKyAgQXZhaWxhYmlsaXR5RGF0YSAqZ2V0QXZhaWxhYmlsaXR5RGF0YSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxBdmFpbGFiaWxpdHlEYXRhKj4oZ2V0QXJnc0J1ZmZlcigpICsgTnVtQXJncyk7CisgIH0KKyAgY29uc3QgQXZhaWxhYmlsaXR5RGF0YSAqZ2V0QXZhaWxhYmlsaXR5RGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBBdmFpbGFiaWxpdHlEYXRhKj4oZ2V0QXJnc0J1ZmZlcigpICsgTnVtQXJncyk7CisgIH0KKworcHVibGljOgorICBzdHJ1Y3QgVHlwZVRhZ0ZvckRhdGF0eXBlRGF0YSB7CisgICAgUGFyc2VkVHlwZSAqTWF0Y2hpbmdDVHlwZTsKKyAgICB1bnNpZ25lZCBMYXlvdXRDb21wYXRpYmxlIDogMTsKKyAgICB1bnNpZ25lZCBNdXN0QmVOdWxsIDogMTsKKyAgfTsKKyAgc3RydWN0IFByb3BlcnR5RGF0YSB7CisgICAgSWRlbnRpZmllckluZm8gKkdldHRlcklkLCAqU2V0dGVySWQ7CisKKyAgICBQcm9wZXJ0eURhdGEoSWRlbnRpZmllckluZm8gKmdldHRlcklkLCBJZGVudGlmaWVySW5mbyAqc2V0dGVySWQpCisgICAgICAgIDogR2V0dGVySWQoZ2V0dGVySWQpLCBTZXR0ZXJJZChzZXR0ZXJJZCkge30KKyAgfTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEF0dHJpYnV0ZUZhY3Rvcnk7CisgIGZyaWVuZCBjbGFzcyBBdHRyaWJ1dGVQb29sOworCisgIC8vLyBDb25zdHJ1Y3RvciBmb3IgYXR0cmlidXRlcyB3aXRoIGV4cHJlc3Npb24gYXJndW1lbnRzLgorICBBdHRyaWJ1dGVMaXN0KElkZW50aWZpZXJJbmZvICphdHRyTmFtZSwgU291cmNlUmFuZ2UgYXR0clJhbmdlLAorICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpzY29wZU5hbWUsIFNvdXJjZUxvY2F0aW9uIHNjb3BlTG9jLAorICAgICAgICAgICAgICAgIEFyZ3NVbmlvbiAqYXJncywgdW5zaWduZWQgbnVtQXJncywKKyAgICAgICAgICAgICAgICBTeW50YXggc3ludGF4VXNlZCwgU291cmNlTG9jYXRpb24gZWxsaXBzaXNMb2MpCisgICAgICA6IEF0dHJOYW1lKGF0dHJOYW1lKSwgU2NvcGVOYW1lKHNjb3BlTmFtZSksIEF0dHJSYW5nZShhdHRyUmFuZ2UpLAorICAgICAgICBTY29wZUxvYyhzY29wZUxvYyksIEVsbGlwc2lzTG9jKGVsbGlwc2lzTG9jKSwgTnVtQXJncyhudW1BcmdzKSwKKyAgICAgICAgU3ludGF4VXNlZChzeW50YXhVc2VkKSwgSW52YWxpZChmYWxzZSksIFVzZWRBc1R5cGVBdHRyKGZhbHNlKSwKKyAgICAgICAgSXNBdmFpbGFiaWxpdHkoZmFsc2UpLCBJc1R5cGVUYWdGb3JEYXRhdHlwZShmYWxzZSksIElzUHJvcGVydHkoZmFsc2UpLAorICAgICAgICBIYXNQYXJzZWRUeXBlKGZhbHNlKSwgSGFzUHJvY2Vzc2luZ0NhY2hlKGZhbHNlKSB7CisgICAgaWYgKG51bUFyZ3MpIG1lbWNweShnZXRBcmdzQnVmZmVyKCksIGFyZ3MsIG51bUFyZ3MgKiBzaXplb2YoQXJnc1VuaW9uKSk7CisgICAgQXR0cktpbmQgPSBnZXRLaW5kKGdldE5hbWUoKSwgZ2V0U2NvcGVOYW1lKCksIHN5bnRheFVzZWQpOworICB9CisKKyAgLy8vIENvbnN0cnVjdG9yIGZvciBhdmFpbGFiaWxpdHkgYXR0cmlidXRlcy4KKyAgQXR0cmlidXRlTGlzdChJZGVudGlmaWVySW5mbyAqYXR0ck5hbWUsIFNvdXJjZVJhbmdlIGF0dHJSYW5nZSwKKyAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqc2NvcGVOYW1lLCBTb3VyY2VMb2NhdGlvbiBzY29wZUxvYywKKyAgICAgICAgICAgICAgICBJZGVudGlmaWVyTG9jICpQYXJtLCBjb25zdCBBdmFpbGFiaWxpdHlDaGFuZ2UgJmludHJvZHVjZWQsCisgICAgICAgICAgICAgICAgY29uc3QgQXZhaWxhYmlsaXR5Q2hhbmdlICZkZXByZWNhdGVkLAorICAgICAgICAgICAgICAgIGNvbnN0IEF2YWlsYWJpbGl0eUNoYW5nZSAmb2Jzb2xldGVkLAorICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIHVuYXZhaWxhYmxlLCAKKyAgICAgICAgICAgICAgICBjb25zdCBFeHByICptZXNzYWdlRXhwciwKKyAgICAgICAgICAgICAgICBTeW50YXggc3ludGF4VXNlZCwgU291cmNlTG9jYXRpb24gc3RyaWN0LAorICAgICAgICAgICAgICAgIGNvbnN0IEV4cHIgKnJlcGxhY2VtZW50RXhwcikKKyAgICAgIDogQXR0ck5hbWUoYXR0ck5hbWUpLCBTY29wZU5hbWUoc2NvcGVOYW1lKSwgQXR0clJhbmdlKGF0dHJSYW5nZSksCisgICAgICAgIFNjb3BlTG9jKHNjb3BlTG9jKSwgTnVtQXJncygxKSwgU3ludGF4VXNlZChzeW50YXhVc2VkKSwgSW52YWxpZChmYWxzZSksCisgICAgICAgIFVzZWRBc1R5cGVBdHRyKGZhbHNlKSwgSXNBdmFpbGFiaWxpdHkodHJ1ZSksCisgICAgICAgIElzVHlwZVRhZ0ZvckRhdGF0eXBlKGZhbHNlKSwgSXNQcm9wZXJ0eShmYWxzZSksIEhhc1BhcnNlZFR5cGUoZmFsc2UpLAorICAgICAgICBIYXNQcm9jZXNzaW5nQ2FjaGUoZmFsc2UpLCBVbmF2YWlsYWJsZUxvYyh1bmF2YWlsYWJsZSksCisgICAgICAgIE1lc3NhZ2VFeHByKG1lc3NhZ2VFeHByKSB7CisgICAgQXJnc1VuaW9uIFBWYWwoUGFybSk7CisgICAgbWVtY3B5KGdldEFyZ3NCdWZmZXIoKSwgJlBWYWwsIHNpemVvZihBcmdzVW5pb24pKTsKKyAgICBuZXcgKGdldEF2YWlsYWJpbGl0eURhdGEoKSkgQXZhaWxhYmlsaXR5RGF0YSgKKyAgICAgICAgaW50cm9kdWNlZCwgZGVwcmVjYXRlZCwgb2Jzb2xldGVkLCBzdHJpY3QsIHJlcGxhY2VtZW50RXhwcik7CisgICAgQXR0cktpbmQgPSBnZXRLaW5kKGdldE5hbWUoKSwgZ2V0U2NvcGVOYW1lKCksIHN5bnRheFVzZWQpOworICB9CisKKyAgLy8vIENvbnN0cnVjdG9yIGZvciBvYmpjX2JyaWRnZV9yZWxhdGVkIGF0dHJpYnV0ZXMuCisgIEF0dHJpYnV0ZUxpc3QoSWRlbnRpZmllckluZm8gKmF0dHJOYW1lLCBTb3VyY2VSYW5nZSBhdHRyUmFuZ2UsCisgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKnNjb3BlTmFtZSwgU291cmNlTG9jYXRpb24gc2NvcGVMb2MsCisgICAgICAgICAgICAgICAgSWRlbnRpZmllckxvYyAqUGFybTEsCisgICAgICAgICAgICAgICAgSWRlbnRpZmllckxvYyAqUGFybTIsCisgICAgICAgICAgICAgICAgSWRlbnRpZmllckxvYyAqUGFybTMsCisgICAgICAgICAgICAgICAgU3ludGF4IHN5bnRheFVzZWQpCisgICAgICA6IEF0dHJOYW1lKGF0dHJOYW1lKSwgU2NvcGVOYW1lKHNjb3BlTmFtZSksIEF0dHJSYW5nZShhdHRyUmFuZ2UpLAorICAgICAgICBTY29wZUxvYyhzY29wZUxvYyksIE51bUFyZ3MoMyksIFN5bnRheFVzZWQoc3ludGF4VXNlZCksIEludmFsaWQoZmFsc2UpLAorICAgICAgICBVc2VkQXNUeXBlQXR0cihmYWxzZSksIElzQXZhaWxhYmlsaXR5KGZhbHNlKSwKKyAgICAgICAgSXNUeXBlVGFnRm9yRGF0YXR5cGUoZmFsc2UpLCBJc1Byb3BlcnR5KGZhbHNlKSwgSGFzUGFyc2VkVHlwZShmYWxzZSksCisgICAgICAgIEhhc1Byb2Nlc3NpbmdDYWNoZShmYWxzZSkgeworICAgIEFyZ3NVbmlvbiAqQXJncyA9IGdldEFyZ3NCdWZmZXIoKTsKKyAgICBBcmdzWzBdID0gUGFybTE7CisgICAgQXJnc1sxXSA9IFBhcm0yOworICAgIEFyZ3NbMl0gPSBQYXJtMzsKKyAgICBBdHRyS2luZCA9IGdldEtpbmQoZ2V0TmFtZSgpLCBnZXRTY29wZU5hbWUoKSwgc3ludGF4VXNlZCk7CisgIH0KKyAgCisgIC8vLyBDb25zdHJ1Y3RvciBmb3IgdHlwZV90YWdfZm9yX2RhdGF0eXBlIGF0dHJpYnV0ZS4KKyAgQXR0cmlidXRlTGlzdChJZGVudGlmaWVySW5mbyAqYXR0ck5hbWUsIFNvdXJjZVJhbmdlIGF0dHJSYW5nZSwKKyAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqc2NvcGVOYW1lLCBTb3VyY2VMb2NhdGlvbiBzY29wZUxvYywKKyAgICAgICAgICAgICAgICBJZGVudGlmaWVyTG9jICpBcmdLaW5kLCBQYXJzZWRUeXBlIG1hdGNoaW5nQ1R5cGUsCisgICAgICAgICAgICAgICAgYm9vbCBsYXlvdXRDb21wYXRpYmxlLCBib29sIG11c3RCZU51bGwsIFN5bnRheCBzeW50YXhVc2VkKQorICAgICAgOiBBdHRyTmFtZShhdHRyTmFtZSksIFNjb3BlTmFtZShzY29wZU5hbWUpLCBBdHRyUmFuZ2UoYXR0clJhbmdlKSwKKyAgICAgICAgU2NvcGVMb2Moc2NvcGVMb2MpLCBOdW1BcmdzKDEpLCBTeW50YXhVc2VkKHN5bnRheFVzZWQpLCBJbnZhbGlkKGZhbHNlKSwKKyAgICAgICAgVXNlZEFzVHlwZUF0dHIoZmFsc2UpLCBJc0F2YWlsYWJpbGl0eShmYWxzZSksCisgICAgICAgIElzVHlwZVRhZ0ZvckRhdGF0eXBlKHRydWUpLCBJc1Byb3BlcnR5KGZhbHNlKSwgSGFzUGFyc2VkVHlwZShmYWxzZSksCisgICAgICAgIEhhc1Byb2Nlc3NpbmdDYWNoZShmYWxzZSkgeworICAgIEFyZ3NVbmlvbiBQVmFsKEFyZ0tpbmQpOworICAgIG1lbWNweShnZXRBcmdzQnVmZmVyKCksICZQVmFsLCBzaXplb2YoQXJnc1VuaW9uKSk7CisgICAgVHlwZVRhZ0ZvckRhdGF0eXBlRGF0YSAmRXh0cmFEYXRhID0gZ2V0VHlwZVRhZ0ZvckRhdGF0eXBlRGF0YVNsb3QoKTsKKyAgICBuZXcgKCZFeHRyYURhdGEuTWF0Y2hpbmdDVHlwZSkgUGFyc2VkVHlwZShtYXRjaGluZ0NUeXBlKTsKKyAgICBFeHRyYURhdGEuTGF5b3V0Q29tcGF0aWJsZSA9IGxheW91dENvbXBhdGlibGU7CisgICAgRXh0cmFEYXRhLk11c3RCZU51bGwgPSBtdXN0QmVOdWxsOworICAgIEF0dHJLaW5kID0gZ2V0S2luZChnZXROYW1lKCksIGdldFNjb3BlTmFtZSgpLCBzeW50YXhVc2VkKTsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3RvciBmb3IgYXR0cmlidXRlcyB3aXRoIGEgc2luZ2xlIHR5cGUgYXJndW1lbnQuCisgIEF0dHJpYnV0ZUxpc3QoSWRlbnRpZmllckluZm8gKmF0dHJOYW1lLCBTb3VyY2VSYW5nZSBhdHRyUmFuZ2UsCisgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKnNjb3BlTmFtZSwgU291cmNlTG9jYXRpb24gc2NvcGVMb2MsCisgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSB0eXBlQXJnLCBTeW50YXggc3ludGF4VXNlZCkKKyAgICAgIDogQXR0ck5hbWUoYXR0ck5hbWUpLCBTY29wZU5hbWUoc2NvcGVOYW1lKSwgQXR0clJhbmdlKGF0dHJSYW5nZSksCisgICAgICAgIFNjb3BlTG9jKHNjb3BlTG9jKSwgTnVtQXJncygwKSwgU3ludGF4VXNlZChzeW50YXhVc2VkKSwgSW52YWxpZChmYWxzZSksCisgICAgICAgIFVzZWRBc1R5cGVBdHRyKGZhbHNlKSwgSXNBdmFpbGFiaWxpdHkoZmFsc2UpLAorICAgICAgICBJc1R5cGVUYWdGb3JEYXRhdHlwZShmYWxzZSksIElzUHJvcGVydHkoZmFsc2UpLCBIYXNQYXJzZWRUeXBlKHRydWUpLAorICAgICAgICBIYXNQcm9jZXNzaW5nQ2FjaGUoZmFsc2UpIHsKKyAgICBuZXcgKCZnZXRUeXBlQnVmZmVyKCkpIFBhcnNlZFR5cGUodHlwZUFyZyk7CisgICAgQXR0cktpbmQgPSBnZXRLaW5kKGdldE5hbWUoKSwgZ2V0U2NvcGVOYW1lKCksIHN5bnRheFVzZWQpOworICB9CisKKyAgLy8vIENvbnN0cnVjdG9yIGZvciBtaWNyb3NvZnQgX19kZWNsc3BlYyhwcm9wZXJ0eSkgYXR0cmlidXRlLgorICBBdHRyaWJ1dGVMaXN0KElkZW50aWZpZXJJbmZvICphdHRyTmFtZSwgU291cmNlUmFuZ2UgYXR0clJhbmdlLAorICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpzY29wZU5hbWUsIFNvdXJjZUxvY2F0aW9uIHNjb3BlTG9jLAorICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpnZXR0ZXJJZCwgSWRlbnRpZmllckluZm8gKnNldHRlcklkLAorICAgICAgICAgICAgICAgIFN5bnRheCBzeW50YXhVc2VkKQorICAgICAgOiBBdHRyTmFtZShhdHRyTmFtZSksIFNjb3BlTmFtZShzY29wZU5hbWUpLCBBdHRyUmFuZ2UoYXR0clJhbmdlKSwKKyAgICAgICAgU2NvcGVMb2Moc2NvcGVMb2MpLCBOdW1BcmdzKDApLCBTeW50YXhVc2VkKHN5bnRheFVzZWQpLAorICAgICAgICBJbnZhbGlkKGZhbHNlKSwgVXNlZEFzVHlwZUF0dHIoZmFsc2UpLCBJc0F2YWlsYWJpbGl0eShmYWxzZSksCisgICAgICAgIElzVHlwZVRhZ0ZvckRhdGF0eXBlKGZhbHNlKSwgSXNQcm9wZXJ0eSh0cnVlKSwgSGFzUGFyc2VkVHlwZShmYWxzZSksCisgICAgICAgIEhhc1Byb2Nlc3NpbmdDYWNoZShmYWxzZSkgeworICAgIG5ldyAoJmdldFByb3BlcnR5RGF0YUJ1ZmZlcigpKSBQcm9wZXJ0eURhdGEoZ2V0dGVySWQsIHNldHRlcklkKTsKKyAgICBBdHRyS2luZCA9IGdldEtpbmQoZ2V0TmFtZSgpLCBnZXRTY29wZU5hbWUoKSwgc3ludGF4VXNlZCk7CisgIH0KKworICAvLy8gVHlwZSB0YWcgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgYXJndW1lbnRzLCBpZgorICAvLy8gYW55LCBhdCB0aGUgZW5kIG9mIHRoZSBvYmplY3QuICBUaGV5IGFyZSBtdXR1YWxseSBleGx1c2l2ZSB3aXRoCisgIC8vLyBhdmFpbGFiaWxpdHkgc2xvdHMuCisgIFR5cGVUYWdGb3JEYXRhdHlwZURhdGEgJmdldFR5cGVUYWdGb3JEYXRhdHlwZURhdGFTbG90KCkgeworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxUeXBlVGFnRm9yRGF0YXR5cGVEYXRhKj4oZ2V0QXJnc0J1ZmZlcigpK051bUFyZ3MpOworICB9CisgIGNvbnN0IFR5cGVUYWdGb3JEYXRhdHlwZURhdGEgJmdldFR5cGVUYWdGb3JEYXRhdHlwZURhdGFTbG90KCkgY29uc3QgeworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUeXBlVGFnRm9yRGF0YXR5cGVEYXRhKj4oZ2V0QXJnc0J1ZmZlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE51bUFyZ3MpOworICB9CisKKyAgLy8vIFRoZSB0eXBlIGJ1ZmZlciBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBvYmplY3QgYW5kIGFyZSBtdXR1YWxseSBleGNsdXNpdmUKKyAgLy8vIHdpdGggYXJndW1lbnRzLgorICBQYXJzZWRUeXBlICZnZXRUeXBlQnVmZmVyKCkgeworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxQYXJzZWRUeXBlICo+KHRoaXMgKyAxKTsKKyAgfQorICBjb25zdCBQYXJzZWRUeXBlICZnZXRUeXBlQnVmZmVyKCkgY29uc3QgeworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBQYXJzZWRUeXBlICo+KHRoaXMgKyAxKTsKKyAgfQorCisgIC8vLyBUaGUgcHJvcGVydHkgZGF0YSBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBvYmplY3QgaXMgaXMgbXV0dWFsbHkgZXhjbHVzaXZlCisgIC8vLyB3aXRoIGFyZ3VtZW50cy4KKyAgUHJvcGVydHlEYXRhICZnZXRQcm9wZXJ0eURhdGFCdWZmZXIoKSB7CisgICAgYXNzZXJ0KElzUHJvcGVydHkpOworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxQcm9wZXJ0eURhdGEqPih0aGlzICsgMSk7CisgIH0KKyAgY29uc3QgUHJvcGVydHlEYXRhICZnZXRQcm9wZXJ0eURhdGFCdWZmZXIoKSBjb25zdCB7CisgICAgYXNzZXJ0KElzUHJvcGVydHkpOworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBQcm9wZXJ0eURhdGEqPih0aGlzICsgMSk7CisgIH0KKworICBzaXplX3QgYWxsb2NhdGVkX3NpemUoKSBjb25zdDsKKworcHVibGljOgorICBBdHRyaWJ1dGVMaXN0KGNvbnN0IEF0dHJpYnV0ZUxpc3QgJikgPSBkZWxldGU7CisgIEF0dHJpYnV0ZUxpc3QgJm9wZXJhdG9yPShjb25zdCBBdHRyaWJ1dGVMaXN0ICYpID0gZGVsZXRlOworICB+QXR0cmlidXRlTGlzdCgpID0gZGVsZXRlOworCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgPSBkZWxldGU7CisKKyAgZW51bSBLaW5kIHsgICAgICAgICAgIAorICAgICNkZWZpbmUgUEFSU0VEX0FUVFIoTkFNRSkgQVRfIyNOQU1FLAorICAgICNpbmNsdWRlICJjbGFuZy9TZW1hL0F0dHJQYXJzZWRBdHRyTGlzdC5pbmMiCisgICAgI3VuZGVmIFBBUlNFRF9BVFRSCisgICAgSWdub3JlZEF0dHJpYnV0ZSwKKyAgICBVbmtub3duQXR0cmlidXRlCisgIH07CisKKyAgSWRlbnRpZmllckluZm8gKmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBBdHRyTmFtZTsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2MoKSBjb25zdCB7IHJldHVybiBBdHRyUmFuZ2UuZ2V0QmVnaW4oKTsgfQorICBTb3VyY2VSYW5nZSBnZXRSYW5nZSgpIGNvbnN0IHsgcmV0dXJuIEF0dHJSYW5nZTsgfQorICAKKyAgYm9vbCBoYXNTY29wZSgpIGNvbnN0IHsgcmV0dXJuIFNjb3BlTmFtZTsgfQorICBJZGVudGlmaWVySW5mbyAqZ2V0U2NvcGVOYW1lKCkgY29uc3QgeyByZXR1cm4gU2NvcGVOYW1lOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldFNjb3BlTG9jKCkgY29uc3QgeyByZXR1cm4gU2NvcGVMb2M7IH0KKyAgCisgIGJvb2wgaGFzUGFyc2VkVHlwZSgpIGNvbnN0IHsgcmV0dXJuIEhhc1BhcnNlZFR5cGU7IH0KKworICAvLy8gSXMgdGhpcyB0aGUgTWljcm9zb2Z0IF9fZGVjbHNwZWMocHJvcGVydHkpIGF0dHJpYnV0ZT8KKyAgYm9vbCBpc0RlY2xzcGVjUHJvcGVydHlBdHRyaWJ1dGUoKSBjb25zdCAgeworICAgIHJldHVybiBJc1Byb3BlcnR5OworICB9CisKKyAgYm9vbCBpc0FsaWduYXNBdHRyaWJ1dGUoKSBjb25zdCB7CisgICAgLy8gRklYTUU6IFVzZSBhIGJldHRlciBtZWNoYW5pc20gdG8gZGV0ZXJtaW5lIHRoaXMuCisgICAgcmV0dXJuIGdldEtpbmQoKSA9PSBBVF9BbGlnbmVkICYmIGlzS2V5d29yZEF0dHJpYnV0ZSgpOworICB9CisKKyAgYm9vbCBpc0RlY2xzcGVjQXR0cmlidXRlKCkgY29uc3QgeyByZXR1cm4gU3ludGF4VXNlZCA9PSBBU19EZWNsc3BlYzsgfQorICBib29sIGlzTWljcm9zb2Z0QXR0cmlidXRlKCkgY29uc3QgeyByZXR1cm4gU3ludGF4VXNlZCA9PSBBU19NaWNyb3NvZnQ7IH0KKworICBib29sIGlzQ1hYMTFBdHRyaWJ1dGUoKSBjb25zdCB7CisgICAgcmV0dXJuIFN5bnRheFVzZWQgPT0gQVNfQ1hYMTEgfHwgaXNBbGlnbmFzQXR0cmlidXRlKCk7CisgIH0KKworICBib29sIGlzQzJ4QXR0cmlidXRlKCkgY29uc3QgeworICAgIHJldHVybiBTeW50YXhVc2VkID09IEFTX0MyeDsKKyAgfQorCisgIGJvb2wgaXNLZXl3b3JkQXR0cmlidXRlKCkgY29uc3QgeworICAgIHJldHVybiBTeW50YXhVc2VkID09IEFTX0tleXdvcmQgfHwgU3ludGF4VXNlZCA9PSBBU19Db250ZXh0U2Vuc2l0aXZlS2V5d29yZDsKKyAgfQorCisgIGJvb2wgaXNDb250ZXh0U2Vuc2l0aXZlS2V5d29yZEF0dHJpYnV0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3ludGF4VXNlZCA9PSBBU19Db250ZXh0U2Vuc2l0aXZlS2V5d29yZDsKKyAgfQorCisgIGJvb2wgaXNJbnZhbGlkKCkgY29uc3QgeyByZXR1cm4gSW52YWxpZDsgfQorICB2b2lkIHNldEludmFsaWQoYm9vbCBiID0gdHJ1ZSkgY29uc3QgeyBJbnZhbGlkID0gYjsgfQorCisgIGJvb2wgaGFzUHJvY2Vzc2luZ0NhY2hlKCkgY29uc3QgeyByZXR1cm4gSGFzUHJvY2Vzc2luZ0NhY2hlOyB9CisKKyAgdW5zaWduZWQgZ2V0UHJvY2Vzc2luZ0NhY2hlKCkgY29uc3QgeworICAgIGFzc2VydChoYXNQcm9jZXNzaW5nQ2FjaGUoKSk7CisgICAgcmV0dXJuIFByb2Nlc3NpbmdDYWNoZTsKKyAgfQorCisgIHZvaWQgc2V0UHJvY2Vzc2luZ0NhY2hlKHVuc2lnbmVkIHZhbHVlKSBjb25zdCB7CisgICAgUHJvY2Vzc2luZ0NhY2hlID0gdmFsdWU7CisgICAgSGFzUHJvY2Vzc2luZ0NhY2hlID0gdHJ1ZTsKKyAgfQorCisgIGJvb2wgaXNVc2VkQXNUeXBlQXR0cigpIGNvbnN0IHsgcmV0dXJuIFVzZWRBc1R5cGVBdHRyOyB9CisgIHZvaWQgc2V0VXNlZEFzVHlwZUF0dHIoKSB7IFVzZWRBc1R5cGVBdHRyID0gdHJ1ZTsgfQorCisgIGJvb2wgaXNQYWNrRXhwYW5zaW9uKCkgY29uc3QgeyByZXR1cm4gRWxsaXBzaXNMb2MuaXNWYWxpZCgpOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldEVsbGlwc2lzTG9jKCkgY29uc3QgeyByZXR1cm4gRWxsaXBzaXNMb2M7IH0KKworICBLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kKEF0dHJLaW5kKTsgfQorICBzdGF0aWMgS2luZCBnZXRLaW5kKGNvbnN0IElkZW50aWZpZXJJbmZvICpOYW1lLCBjb25zdCBJZGVudGlmaWVySW5mbyAqU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgU3ludGF4IFN5bnRheFVzZWQpOworCisgIEF0dHJpYnV0ZUxpc3QgKmdldE5leHQoKSBjb25zdCB7IHJldHVybiBOZXh0SW5Qb3NpdGlvbjsgfQorICB2b2lkIHNldE5leHQoQXR0cmlidXRlTGlzdCAqTikgeyBOZXh0SW5Qb3NpdGlvbiA9IE47IH0KKworICAvLy8gZ2V0TnVtQXJncyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIGFjdHVhbCBhcmd1bWVudHMgdG8gdGhpcyBhdHRyaWJ1dGUuCisgIHVuc2lnbmVkIGdldE51bUFyZ3MoKSBjb25zdCB7IHJldHVybiBOdW1BcmdzOyB9CisKKyAgLy8vIGdldEFyZyAtIFJldHVybiB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50LgorICBBcmdzVW5pb24gZ2V0QXJnKHVuc2lnbmVkIEFyZykgY29uc3QgeworICAgIGFzc2VydChBcmcgPCBOdW1BcmdzICYmICJBcmcgYWNjZXNzIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gZ2V0QXJnc0J1ZmZlcigpW0FyZ107CisgIH0KKworICBib29sIGlzQXJnRXhwcih1bnNpZ25lZCBBcmcpIGNvbnN0IHsKKyAgICByZXR1cm4gQXJnIDwgTnVtQXJncyAmJiBnZXRBcmcoQXJnKS5pczxFeHByKj4oKTsKKyAgfQorCisgIEV4cHIgKmdldEFyZ0FzRXhwcih1bnNpZ25lZCBBcmcpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QXJnKEFyZykuZ2V0PEV4cHIqPigpOworICB9CisKKyAgYm9vbCBpc0FyZ0lkZW50KHVuc2lnbmVkIEFyZykgY29uc3QgeworICAgIHJldHVybiBBcmcgPCBOdW1BcmdzICYmIGdldEFyZyhBcmcpLmlzPElkZW50aWZpZXJMb2MqPigpOworICB9CisKKyAgSWRlbnRpZmllckxvYyAqZ2V0QXJnQXNJZGVudCh1bnNpZ25lZCBBcmcpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QXJnKEFyZykuZ2V0PElkZW50aWZpZXJMb2MqPigpOworICB9CisKKyAgY29uc3QgQXZhaWxhYmlsaXR5Q2hhbmdlICZnZXRBdmFpbGFiaWxpdHlJbnRyb2R1Y2VkKCkgY29uc3QgeworICAgIGFzc2VydChnZXRLaW5kKCkgPT0gQVRfQXZhaWxhYmlsaXR5ICYmICJOb3QgYW4gYXZhaWxhYmlsaXR5IGF0dHJpYnV0ZSIpOworICAgIHJldHVybiBnZXRBdmFpbGFiaWxpdHlEYXRhKCktPkNoYW5nZXNbSW50cm9kdWNlZFNsb3RdOworICB9CisKKyAgY29uc3QgQXZhaWxhYmlsaXR5Q2hhbmdlICZnZXRBdmFpbGFiaWxpdHlEZXByZWNhdGVkKCkgY29uc3QgeworICAgIGFzc2VydChnZXRLaW5kKCkgPT0gQVRfQXZhaWxhYmlsaXR5ICYmICJOb3QgYW4gYXZhaWxhYmlsaXR5IGF0dHJpYnV0ZSIpOworICAgIHJldHVybiBnZXRBdmFpbGFiaWxpdHlEYXRhKCktPkNoYW5nZXNbRGVwcmVjYXRlZFNsb3RdOworICB9CisKKyAgY29uc3QgQXZhaWxhYmlsaXR5Q2hhbmdlICZnZXRBdmFpbGFiaWxpdHlPYnNvbGV0ZWQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEtpbmQoKSA9PSBBVF9BdmFpbGFiaWxpdHkgJiYgIk5vdCBhbiBhdmFpbGFiaWxpdHkgYXR0cmlidXRlIik7CisgICAgcmV0dXJuIGdldEF2YWlsYWJpbGl0eURhdGEoKS0+Q2hhbmdlc1tPYnNvbGV0ZWRTbG90XTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldFN0cmljdExvYygpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0S2luZCgpID09IEFUX0F2YWlsYWJpbGl0eSAmJiAiTm90IGFuIGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGUiKTsKKyAgICByZXR1cm4gZ2V0QXZhaWxhYmlsaXR5RGF0YSgpLT5TdHJpY3RMb2M7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRVbmF2YWlsYWJsZUxvYygpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0S2luZCgpID09IEFUX0F2YWlsYWJpbGl0eSAmJiAiTm90IGFuIGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGUiKTsKKyAgICByZXR1cm4gVW5hdmFpbGFibGVMb2M7CisgIH0KKyAgCisgIGNvbnN0IEV4cHIgKiBnZXRNZXNzYWdlRXhwcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0S2luZCgpID09IEFUX0F2YWlsYWJpbGl0eSAmJiAiTm90IGFuIGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGUiKTsKKyAgICByZXR1cm4gTWVzc2FnZUV4cHI7CisgIH0KKworICBjb25zdCBFeHByICpnZXRSZXBsYWNlbWVudEV4cHIoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEtpbmQoKSA9PSBBVF9BdmFpbGFiaWxpdHkgJiYgIk5vdCBhbiBhdmFpbGFiaWxpdHkgYXR0cmlidXRlIik7CisgICAgcmV0dXJuIGdldEF2YWlsYWJpbGl0eURhdGEoKS0+UmVwbGFjZW1lbnQ7CisgIH0KKworICBjb25zdCBQYXJzZWRUeXBlICZnZXRNYXRjaGluZ0NUeXBlKCkgY29uc3QgeworICAgIGFzc2VydChnZXRLaW5kKCkgPT0gQVRfVHlwZVRhZ0ZvckRhdGF0eXBlICYmCisgICAgICAgICAgICJOb3QgYSB0eXBlX3RhZ19mb3JfZGF0YXR5cGUgYXR0cmlidXRlIik7CisgICAgcmV0dXJuICpnZXRUeXBlVGFnRm9yRGF0YXR5cGVEYXRhU2xvdCgpLk1hdGNoaW5nQ1R5cGU7CisgIH0KKworICBib29sIGdldExheW91dENvbXBhdGlibGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEtpbmQoKSA9PSBBVF9UeXBlVGFnRm9yRGF0YXR5cGUgJiYKKyAgICAgICAgICAgIk5vdCBhIHR5cGVfdGFnX2Zvcl9kYXRhdHlwZSBhdHRyaWJ1dGUiKTsKKyAgICByZXR1cm4gZ2V0VHlwZVRhZ0ZvckRhdGF0eXBlRGF0YVNsb3QoKS5MYXlvdXRDb21wYXRpYmxlOworICB9CisKKyAgYm9vbCBnZXRNdXN0QmVOdWxsKCkgY29uc3QgeworICAgIGFzc2VydChnZXRLaW5kKCkgPT0gQVRfVHlwZVRhZ0ZvckRhdGF0eXBlICYmCisgICAgICAgICAgICJOb3QgYSB0eXBlX3RhZ19mb3JfZGF0YXR5cGUgYXR0cmlidXRlIik7CisgICAgcmV0dXJuIGdldFR5cGVUYWdGb3JEYXRhdHlwZURhdGFTbG90KCkuTXVzdEJlTnVsbDsKKyAgfQorCisgIGNvbnN0IFBhcnNlZFR5cGUgJmdldFR5cGVBcmcoKSBjb25zdCB7CisgICAgYXNzZXJ0KEhhc1BhcnNlZFR5cGUgJiYgIk5vdCBhIHR5cGUgYXR0cmlidXRlIik7CisgICAgcmV0dXJuIGdldFR5cGVCdWZmZXIoKTsKKyAgfQorCisgIGNvbnN0IFByb3BlcnR5RGF0YSAmZ2V0UHJvcGVydHlEYXRhKCkgY29uc3QgeworICAgIGFzc2VydChpc0RlY2xzcGVjUHJvcGVydHlBdHRyaWJ1dGUoKSAmJiAiTm90IGEgX19kZWxjc3BlYyhwcm9wZXJ0eSkgYXR0cmlidXRlIik7CisgICAgcmV0dXJuIGdldFByb3BlcnR5RGF0YUJ1ZmZlcigpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYW4gaW5kZXggaW50byB0aGUgYXR0cmlidXRlIHNwZWxsaW5nIGxpc3QKKyAgLy8vIGRlZmluZWQgaW4gQXR0ci50ZC4gVGhpcyBpbmRleCBpcyB1c2VkIGJ5IGFuIGF0dHJpYnV0ZQorICAvLy8gdG8gcHJldHR5IHByaW50IGl0c2VsZi4KKyAgdW5zaWduZWQgZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSBjb25zdDsKKworICBib29sIGlzVGFyZ2V0U3BlY2lmaWNBdHRyKCkgY29uc3Q7CisgIGJvb2wgaXNUeXBlQXR0cigpIGNvbnN0OworICBib29sIGlzU3RtdEF0dHIoKSBjb25zdDsKKworICBib29sIGhhc0N1c3RvbVBhcnNpbmcoKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0TWluQXJncygpIGNvbnN0OworICB1bnNpZ25lZCBnZXRNYXhBcmdzKCkgY29uc3Q7CisgIGJvb2wgaGFzVmFyaWFkaWNBcmcoKSBjb25zdDsKKyAgYm9vbCBkaWFnbm9zZUFwcGVydGFpbnNUbyhjbGFzcyBTZW1hICZTLCBjb25zdCBEZWNsICpEKSBjb25zdDsKKyAgYm9vbCBhcHBsaWVzVG9EZWNsKGNvbnN0IERlY2wgKkQsIGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUgTWF0Y2hSdWxlKSBjb25zdDsKKyAgdm9pZCBnZXRNYXRjaFJ1bGVzKGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKKyAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8YXR0cjo6U3ViamVjdE1hdGNoUnVsZSwgYm9vbD4+CisgICAgICAgICAgICAgICAgICAgICAgICAgJk1hdGNoUnVsZXMpIGNvbnN0OworICBib29sIGRpYWdub3NlTGFuZ09wdHMoY2xhc3MgU2VtYSAmUykgY29uc3Q7CisgIGJvb2wgZXhpc3RzSW5UYXJnZXQoY29uc3QgVGFyZ2V0SW5mbyAmVGFyZ2V0KSBjb25zdDsKKyAgYm9vbCBpc0tub3duVG9HQ0MoKSBjb25zdDsKKyAgYm9vbCBpc1N1cHBvcnRlZEJ5UHJhZ21hQXR0cmlidXRlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJZiB0aGUgcGFyc2VkIGF0dHJpYnV0ZSBoYXMgYSBzZW1hbnRpYyBlcXVpdmFsZW50LCBhbmQgaXQgd291bGQKKyAgLy8vIGhhdmUgYSBzZW1hbnRpYyBTcGVsbGluZyBlbnVtZXJhdGlvbiAoZHVlIHRvIGhhdmluZyBzZW1hbnRpY2FsbHktZGlzdGluY3QKKyAgLy8vIHNwZWxsaW5nIHZhcmlhdGlvbnMpLCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoYXQgc2VtYW50aWMgc3BlbGxpbmcuIElmIHRoZQorICAvLy8gcGFyc2VkIGF0dHJpYnV0ZSBkb2VzIG5vdCBoYXZlIGEgc2VtYW50aWMgZXF1aXZhbGVudCwgb3Igd291bGQgbm90IGhhdmUKKyAgLy8vIGEgU3BlbGxpbmcgZW51bWVyYXRpb24sIHRoZSB2YWx1ZSBVSU5UX01BWCBpcyByZXR1cm5lZC4KKyAgdW5zaWduZWQgZ2V0U2VtYW50aWNTcGVsbGluZygpIGNvbnN0OworfTsKKworLy8vIEEgZmFjdG9yeSwgZnJvbSB3aGljaCBvbmUgbWFrZXMgcG9vbHMsIGZyb20gd2hpY2ggb25lIGNyZWF0ZXMKKy8vLyBpbmRpdmlkdWFsIGF0dHJpYnV0ZXMgd2hpY2ggYXJlIGRlYWxsb2NhdGVkIHdpdGggdGhlIHBvb2wuCisvLy8KKy8vLyBOb3RlIHRoYXQgaXQncyB0b2xlcmFibHkgY2hlYXAgdG8gY3JlYXRlIGFuZCBkZXN0cm95IG9uZSBvZgorLy8vIHRoZXNlIGFzIGxvbmcgYXMgeW91IGRvbid0IGFjdHVhbGx5IGFsbG9jYXRlIGFueXRoaW5nIGluIGl0LgorY2xhc3MgQXR0cmlidXRlRmFjdG9yeSB7CitwdWJsaWM6CisgIGVudW0geworICAgIC8vLyBUaGUgcmVxdWlyZWQgYWxsb2NhdGlvbiBzaXplIG9mIGFuIGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGUsCisgICAgLy8vIHdoaWNoIHdlIHdhbnQgdG8gZW5zdXJlIGlzIGEgbXVsdGlwbGUgb2Ygc2l6ZW9mKHZvaWQqKS4KKyAgICBBdmFpbGFiaWxpdHlBbGxvY1NpemUgPQorICAgICAgc2l6ZW9mKEF0dHJpYnV0ZUxpc3QpCisgICAgICArICgoc2l6ZW9mKEF2YWlsYWJpbGl0eURhdGEpICsgc2l6ZW9mKHZvaWQqKSArIHNpemVvZihBcmdzVW5pb24pIC0gMSkKKyAgICAgICAgIC8gc2l6ZW9mKHZvaWQqKSAqIHNpemVvZih2b2lkKikpLAorICAgIFR5cGVUYWdGb3JEYXRhdHlwZUFsbG9jU2l6ZSA9CisgICAgICBzaXplb2YoQXR0cmlidXRlTGlzdCkKKyAgICAgICsgKHNpemVvZihBdHRyaWJ1dGVMaXN0OjpUeXBlVGFnRm9yRGF0YXR5cGVEYXRhKSArIHNpemVvZih2b2lkICopICsKKyAgICAgICAgIHNpemVvZihBcmdzVW5pb24pIC0gMSkKKyAgICAgICAgLyBzaXplb2Yodm9pZCopICogc2l6ZW9mKHZvaWQqKSwKKyAgICBQcm9wZXJ0eUFsbG9jU2l6ZSA9CisgICAgICBzaXplb2YoQXR0cmlidXRlTGlzdCkKKyAgICAgICsgKHNpemVvZihBdHRyaWJ1dGVMaXN0OjpQcm9wZXJ0eURhdGEpICsgc2l6ZW9mKHZvaWQgKikgLSAxKQorICAgICAgICAvIHNpemVvZih2b2lkKikgKiBzaXplb2Yodm9pZCopCisgIH07CisKK3ByaXZhdGU6CisgIGVudW0geworICAgIC8vLyBUaGUgbnVtYmVyIG9mIGZyZWUgbGlzdHMgd2Ugd2FudCB0byBiZSBzdXJlIHRvIHN1cHBvcnQKKyAgICAvLy8gaW5saW5lLiAgVGhpcyBpcyBqdXN0IGVub3VnaCB0aGF0IGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGVzCisgICAgLy8vIGRvbid0IHN1cnBhc3MgaXQuICBJdCdzIGFjdHVhbGx5IHZlcnkgdW5saWtlbHkgd2UnbGwgc2VlIGFuCisgICAgLy8vIGF0dHJpYnV0ZSB0aGF0IG5lZWRzIG1vcmUgdGhhbiB0aGF0OyBvbiB4ODYtNjQgeW91J2QgbmVlZCAxMAorICAgIC8vLyBleHByZXNzaW9uIGFyZ3VtZW50cywgYW5kIG9uIGkzODYgeW91J2QgbmVlZCAxOS4KKyAgICBJbmxpbmVGcmVlTGlzdHNDYXBhY2l0eSA9CisgICAgICAxICsgKEF2YWlsYWJpbGl0eUFsbG9jU2l6ZSAtIHNpemVvZihBdHRyaWJ1dGVMaXN0KSkgLyBzaXplb2Yodm9pZCopCisgIH07CisKKyAgbGx2bTo6QnVtcFB0ckFsbG9jYXRvciBBbGxvYzsKKworICAvLy8gRnJlZSBsaXN0cy4gIFRoZSBpbmRleCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBmb2xsb3dpbmcgZm9ybXVsYToKKyAgLy8vICAgKHNpemUgLSBzaXplb2YoQXR0cmlidXRlTGlzdCkpIC8gc2l6ZW9mKHZvaWQqKQorICBTbWFsbFZlY3RvcjxBdHRyaWJ1dGVMaXN0KiwgSW5saW5lRnJlZUxpc3RzQ2FwYWNpdHk+IEZyZWVMaXN0czsKKworICAvLyBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcHJpdmF0ZSBpbnRlcmZhY2UgdXNlZCBieSBBdHRyaWJ1dGVQb29sLgorICBmcmllbmQgY2xhc3MgQXR0cmlidXRlUG9vbDsKKworICAvLy8gQWxsb2NhdGUgYW4gYXR0cmlidXRlIG9mIHRoZSBnaXZlbiBzaXplLgorICB2b2lkICphbGxvY2F0ZShzaXplX3Qgc2l6ZSk7CisKKyAgLy8vIFJlY2xhaW0gYWxsIHRoZSBhdHRyaWJ1dGVzIGluIHRoZSBnaXZlbiBwb29sIGNoYWluLCB3aGljaCBpcworICAvLy8gbm9uLWVtcHR5LiAgTm90ZSB0aGF0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIHNhZmUKKyAgLy8vIGFnYWluc3QgcmVjbGFpbWluZyB0aGluZ3Mgd2hpY2ggd2VyZSBub3QgYWN0dWFsbHkgYWxsb2NhdGVkCisgIC8vLyB3aXRoIHRoZSBhbGxvY2F0b3IsIGFsdGhvdWdoIG9mIGNvdXJzZSBpdCdzIGltcG9ydGFudCB0byBtYWtlCisgIC8vLyBzdXJlIHRoYXQgdGhlaXIgYWxsb2NhdG9yIGxpdmVzIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhpcyBvbmUuCisgIHZvaWQgcmVjbGFpbVBvb2woQXR0cmlidXRlTGlzdCAqaGVhZCk7CisKK3B1YmxpYzoKKyAgQXR0cmlidXRlRmFjdG9yeSgpOworICB+QXR0cmlidXRlRmFjdG9yeSgpOworfTsKKworY2xhc3MgQXR0cmlidXRlUG9vbCB7CisgIEF0dHJpYnV0ZUZhY3RvcnkgJkZhY3Rvcnk7CisgIEF0dHJpYnV0ZUxpc3QgKkhlYWQgPSBudWxscHRyOworCisgIHZvaWQgKmFsbG9jYXRlKHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIEZhY3RvcnkuYWxsb2NhdGUoc2l6ZSk7CisgIH0KKworICBBdHRyaWJ1dGVMaXN0ICphZGQoQXR0cmlidXRlTGlzdCAqYXR0cikgeworICAgIC8vIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIG9yZGVyIG9mIHRoZSBwb29sLgorICAgIGF0dHItPk5leHRJblBvb2wgPSBIZWFkOworICAgIEhlYWQgPSBhdHRyOworICAgIHJldHVybiBhdHRyOworICB9CisKKyAgdm9pZCB0YWtlUG9vbChBdHRyaWJ1dGVMaXN0ICpwb29sKTsKKworcHVibGljOgorICAvLy8gQ3JlYXRlIGEgbmV3IHBvb2wgZm9yIGEgZmFjdG9yeS4KKyAgQXR0cmlidXRlUG9vbChBdHRyaWJ1dGVGYWN0b3J5ICZmYWN0b3J5KSA6IEZhY3RvcnkoZmFjdG9yeSkge30KKworICBBdHRyaWJ1dGVQb29sKGNvbnN0IEF0dHJpYnV0ZVBvb2wgJikgPSBkZWxldGU7CisKKyAgfkF0dHJpYnV0ZVBvb2woKSB7CisgICAgaWYgKEhlYWQpIEZhY3RvcnkucmVjbGFpbVBvb2woSGVhZCk7CisgIH0KKworICAvLy8gTW92ZSB0aGUgZ2l2ZW4gcG9vbCdzIGFsbG9jYXRpb25zIHRvIHRoaXMgcG9vbC4KKyAgQXR0cmlidXRlUG9vbChBdHRyaWJ1dGVQb29sICYmcG9vbCkgOiBGYWN0b3J5KHBvb2wuRmFjdG9yeSksIEhlYWQocG9vbC5IZWFkKSB7CisgICAgcG9vbC5IZWFkID0gbnVsbHB0cjsKKyAgfQorCisgIEF0dHJpYnV0ZUZhY3RvcnkgJmdldEZhY3RvcnkoKSBjb25zdCB7IHJldHVybiBGYWN0b3J5OyB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBpZiAoSGVhZCkgeworICAgICAgRmFjdG9yeS5yZWNsYWltUG9vbChIZWFkKTsKKyAgICAgIEhlYWQgPSBudWxscHRyOworICAgIH0KKyAgfQorCisgIC8vLyBUYWtlIHRoZSBnaXZlbiBwb29sJ3MgYWxsb2NhdGlvbnMgYW5kIGFkZCB0aGVtIHRvIHRoaXMgcG9vbC4KKyAgdm9pZCB0YWtlQWxsRnJvbShBdHRyaWJ1dGVQb29sICZwb29sKSB7CisgICAgaWYgKHBvb2wuSGVhZCkgeworICAgICAgdGFrZVBvb2wocG9vbC5IZWFkKTsKKyAgICAgIHBvb2wuSGVhZCA9IG51bGxwdHI7CisgICAgfQorICB9CisKKyAgQXR0cmlidXRlTGlzdCAqY3JlYXRlKElkZW50aWZpZXJJbmZvICphdHRyTmFtZSwgU291cmNlUmFuZ2UgYXR0clJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKnNjb3BlTmFtZSwgU291cmNlTG9jYXRpb24gc2NvcGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBBcmdzVW5pb24gKmFyZ3MsIHVuc2lnbmVkIG51bUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0OjpTeW50YXggc3ludGF4LAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gZWxsaXBzaXNMb2MgPSBTb3VyY2VMb2NhdGlvbigpKSB7CisgICAgdm9pZCAqbWVtb3J5ID0gYWxsb2NhdGUoc2l6ZW9mKEF0dHJpYnV0ZUxpc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBudW1BcmdzICogc2l6ZW9mKEFyZ3NVbmlvbikpOworICAgIHJldHVybiBhZGQobmV3IChtZW1vcnkpIEF0dHJpYnV0ZUxpc3QoYXR0ck5hbWUsIGF0dHJSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlTmFtZSwgc2NvcGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLCBudW1BcmdzLCBzeW50YXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGxpcHNpc0xvYykpOworICB9CisKKyAgQXR0cmlidXRlTGlzdCAqY3JlYXRlKElkZW50aWZpZXJJbmZvICphdHRyTmFtZSwgU291cmNlUmFuZ2UgYXR0clJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKnNjb3BlTmFtZSwgU291cmNlTG9jYXRpb24gc2NvcGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyTG9jICpQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF2YWlsYWJpbGl0eUNoYW5nZSAmaW50cm9kdWNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF2YWlsYWJpbGl0eUNoYW5nZSAmZGVwcmVjYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF2YWlsYWJpbGl0eUNoYW5nZSAmb2Jzb2xldGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gdW5hdmFpbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpNZXNzYWdlRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OlN5bnRheCBzeW50YXgsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBzdHJpY3QsIGNvbnN0IEV4cHIgKlJlcGxhY2VtZW50RXhwcikgeworICAgIHZvaWQgKm1lbW9yeSA9IGFsbG9jYXRlKEF0dHJpYnV0ZUZhY3Rvcnk6OkF2YWlsYWJpbGl0eUFsbG9jU2l6ZSk7CisgICAgcmV0dXJuIGFkZChuZXcgKG1lbW9yeSkgQXR0cmlidXRlTGlzdChhdHRyTmFtZSwgYXR0clJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVOYW1lLCBzY29wZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtLCBpbnRyb2R1Y2VkLCBkZXByZWNhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Jzb2xldGVkLCB1bmF2YWlsYWJsZSwgTWVzc2FnZUV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXgsIHN0cmljdCwgUmVwbGFjZW1lbnRFeHByKSk7CisgIH0KKworICBBdHRyaWJ1dGVMaXN0ICpjcmVhdGUoSWRlbnRpZmllckluZm8gKmF0dHJOYW1lLCBTb3VyY2VSYW5nZSBhdHRyUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqc2NvcGVOYW1lLCBTb3VyY2VMb2NhdGlvbiBzY29wZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJMb2MgKlBhcmFtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJMb2MgKlBhcmFtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJMb2MgKlBhcmFtMywKKyAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OlN5bnRheCBzeW50YXgpIHsKKyAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihBdHRyaWJ1dGVMaXN0KSArIDMgKiBzaXplb2YoQXJnc1VuaW9uKTsKKyAgICB2b2lkICptZW1vcnkgPSBhbGxvY2F0ZShzaXplKTsKKyAgICByZXR1cm4gYWRkKG5ldyAobWVtb3J5KSBBdHRyaWJ1dGVMaXN0KGF0dHJOYW1lLCBhdHRyUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZU5hbWUsIHNjb3BlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW0xLCBQYXJhbTIsIFBhcmFtMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheCkpOworICB9CisKKyAgQXR0cmlidXRlTGlzdCAqY3JlYXRlVHlwZVRhZ0ZvckRhdGF0eXBlKAorICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqYXR0ck5hbWUsIFNvdXJjZVJhbmdlIGF0dHJSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKnNjb3BlTmFtZSwgU291cmNlTG9jYXRpb24gc2NvcGVMb2MsCisgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJMb2MgKmFyZ3VtZW50S2luZCwgUGFyc2VkVHlwZSBtYXRjaGluZ0NUeXBlLAorICAgICAgICAgICAgICAgICAgICBib29sIGxheW91dENvbXBhdGlibGUsIGJvb2wgbXVzdEJlTnVsbCwKKyAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdDo6U3ludGF4IHN5bnRheCkgeworICAgIHZvaWQgKm1lbW9yeSA9IGFsbG9jYXRlKEF0dHJpYnV0ZUZhY3Rvcnk6OlR5cGVUYWdGb3JEYXRhdHlwZUFsbG9jU2l6ZSk7CisgICAgcmV0dXJuIGFkZChuZXcgKG1lbW9yeSkgQXR0cmlidXRlTGlzdChhdHRyTmFtZSwgYXR0clJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVOYW1lLCBzY29wZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50S2luZCwgbWF0Y2hpbmdDVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dENvbXBhdGlibGUsIG11c3RCZU51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXgpKTsKKyAgfQorCisgIEF0dHJpYnV0ZUxpc3QgKmNyZWF0ZVR5cGVBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICphdHRyTmFtZSwgU291cmNlUmFuZ2UgYXR0clJhbmdlLAorICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqc2NvcGVOYW1lLCBTb3VyY2VMb2NhdGlvbiBzY29wZUxvYywKKyAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSB0eXBlQXJnLCBBdHRyaWJ1dGVMaXN0OjpTeW50YXggc3ludGF4VXNlZCkgeworICAgIHZvaWQgKm1lbW9yeSA9IGFsbG9jYXRlKHNpemVvZihBdHRyaWJ1dGVMaXN0KSArIHNpemVvZih2b2lkICopKTsKKyAgICByZXR1cm4gYWRkKG5ldyAobWVtb3J5KSBBdHRyaWJ1dGVMaXN0KGF0dHJOYW1lLCBhdHRyUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZU5hbWUsIHNjb3BlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFyZywgc3ludGF4VXNlZCkpOworICB9CisKKyAgQXR0cmlidXRlTGlzdCAqY3JlYXRlUHJvcGVydHlBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICphdHRyTmFtZSwgU291cmNlUmFuZ2UgYXR0clJhbmdlLAorICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqc2NvcGVOYW1lLCBTb3VyY2VMb2NhdGlvbiBzY29wZUxvYywKKyAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKmdldHRlcklkLCBJZGVudGlmaWVySW5mbyAqc2V0dGVySWQsCisgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OlN5bnRheCBzeW50YXhVc2VkKSB7CisgICAgdm9pZCAqbWVtb3J5ID0gYWxsb2NhdGUoQXR0cmlidXRlRmFjdG9yeTo6UHJvcGVydHlBbGxvY1NpemUpOworICAgIHJldHVybiBhZGQobmV3IChtZW1vcnkpIEF0dHJpYnV0ZUxpc3QoYXR0ck5hbWUsIGF0dHJSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlTmFtZSwgc2NvcGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXR0ZXJJZCwgc2V0dGVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhVc2VkKSk7CisgIH0KK307CisKKy8vLyBQYXJzZWRBdHRyaWJ1dGVzIC0gQSBjb2xsZWN0aW9uIG9mIHBhcnNlZCBhdHRyaWJ1dGVzLiAgQ3VycmVudGx5CisvLy8gd2UgZG9uJ3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSB2YXJpb3VzIGF0dHJpYnV0ZSBzeW50YXhlcywKKy8vLyB3aGljaCBpcyBiYXNpY2FsbHkgc2lsbHkuCisvLy8KKy8vLyBSaWdodCBub3cgdGhpcyBpcyBhIHZlcnkgbGlnaHR3ZWlnaHQgY29udGFpbmVyLCBidXQgdGhlIGV4cGVjdGF0aW9uCisvLy8gaXMgdGhhdCB0aGlzIHdpbGwgYmVjb21lIHNpZ25pZmljYW50bHkgbW9yZSBzZXJpb3VzLgorY2xhc3MgUGFyc2VkQXR0cmlidXRlcyB7CitwdWJsaWM6CisgIFBhcnNlZEF0dHJpYnV0ZXMoQXR0cmlidXRlRmFjdG9yeSAmZmFjdG9yeSkgOiBwb29sKGZhY3RvcnkpIHt9CisgIFBhcnNlZEF0dHJpYnV0ZXMoY29uc3QgUGFyc2VkQXR0cmlidXRlcyAmKSA9IGRlbGV0ZTsKKworICBBdHRyaWJ1dGVQb29sICZnZXRQb29sKCkgY29uc3QgeyByZXR1cm4gcG9vbDsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBsaXN0ID09IG51bGxwdHI7IH0KKworICB2b2lkIGFkZChBdHRyaWJ1dGVMaXN0ICpuZXdBdHRyKSB7CisgICAgYXNzZXJ0KG5ld0F0dHIpOworICAgIGFzc2VydChuZXdBdHRyLT5nZXROZXh0KCkgPT0gbnVsbHB0cik7CisgICAgbmV3QXR0ci0+c2V0TmV4dChsaXN0KTsKKyAgICBsaXN0ID0gbmV3QXR0cjsKKyAgfQorCisgIHZvaWQgYWRkQWxsKEF0dHJpYnV0ZUxpc3QgKm5ld0xpc3QpIHsKKyAgICBpZiAoIW5ld0xpc3QpIHJldHVybjsKKworICAgIEF0dHJpYnV0ZUxpc3QgKmxhc3RJbk5ld0xpc3QgPSBuZXdMaXN0OworICAgIHdoaWxlIChBdHRyaWJ1dGVMaXN0ICpuZXh0ID0gbGFzdEluTmV3TGlzdC0+Z2V0TmV4dCgpKQorICAgICAgbGFzdEluTmV3TGlzdCA9IG5leHQ7CisKKyAgICBsYXN0SW5OZXdMaXN0LT5zZXROZXh0KGxpc3QpOworICAgIGxpc3QgPSBuZXdMaXN0OworICB9CisKKyAgdm9pZCBhZGRBbGxBdEVuZChBdHRyaWJ1dGVMaXN0ICpuZXdMaXN0KSB7CisgICAgaWYgKCFsaXN0KSB7CisgICAgICBsaXN0ID0gbmV3TGlzdDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBdHRyaWJ1dGVMaXN0ICpsYXN0SW5MaXN0ID0gbGlzdDsKKyAgICB3aGlsZSAoQXR0cmlidXRlTGlzdCAqbmV4dCA9IGxhc3RJbkxpc3QtPmdldE5leHQoKSkKKyAgICAgIGxhc3RJbkxpc3QgPSBuZXh0OworCisgICAgbGFzdEluTGlzdC0+c2V0TmV4dChuZXdMaXN0KTsKKyAgfQorCisgIHZvaWQgc2V0KEF0dHJpYnV0ZUxpc3QgKm5ld0xpc3QpIHsKKyAgICBsaXN0ID0gbmV3TGlzdDsKKyAgfQorCisgIHZvaWQgdGFrZUFsbEZyb20oUGFyc2VkQXR0cmlidXRlcyAmYXR0cnMpIHsKKyAgICBhZGRBbGwoYXR0cnMubGlzdCk7CisgICAgYXR0cnMubGlzdCA9IG51bGxwdHI7CisgICAgcG9vbC50YWtlQWxsRnJvbShhdHRycy5wb29sKTsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7IGxpc3QgPSBudWxscHRyOyBwb29sLmNsZWFyKCk7IH0KKyAgQXR0cmlidXRlTGlzdCAqZ2V0TGlzdCgpIGNvbnN0IHsgcmV0dXJuIGxpc3Q7IH0KKworICB2b2lkIGNsZWFyTGlzdE9ubHkoKSB7IGxpc3QgPSBudWxscHRyOyB9CisKKyAgLy8vIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGF0dHJpYnV0ZSBsaXN0LiAgVHJ5IG5vdCB0byBpbnRyb2R1Y2UKKyAgLy8vIGRlcGVuZGVuY2llcyBvbiB0aGlzIG1ldGhvZCwgaXQgbWF5IG5vdCBiZSBsb25nLWxpdmVkLgorICBBdHRyaWJ1dGVMaXN0IComZ2V0TGlzdFJlZigpIHsgcmV0dXJuIGxpc3Q7IH0KKworICAvLy8gQWRkIGF0dHJpYnV0ZSB3aXRoIGV4cHJlc3Npb24gYXJndW1lbnRzLgorICBBdHRyaWJ1dGVMaXN0ICphZGROZXcoSWRlbnRpZmllckluZm8gKmF0dHJOYW1lLCBTb3VyY2VSYW5nZSBhdHRyUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqc2NvcGVOYW1lLCBTb3VyY2VMb2NhdGlvbiBzY29wZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3NVbmlvbiAqYXJncywgdW5zaWduZWQgbnVtQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OlN5bnRheCBzeW50YXgsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBlbGxpcHNpc0xvYyA9IFNvdXJjZUxvY2F0aW9uKCkpIHsKKyAgICBBdHRyaWJ1dGVMaXN0ICphdHRyID0KKyAgICAgIHBvb2wuY3JlYXRlKGF0dHJOYW1lLCBhdHRyUmFuZ2UsIHNjb3BlTmFtZSwgc2NvcGVMb2MsIGFyZ3MsIG51bUFyZ3MsCisgICAgICAgICAgICAgICAgICBzeW50YXgsIGVsbGlwc2lzTG9jKTsKKyAgICBhZGQoYXR0cik7CisgICAgcmV0dXJuIGF0dHI7CisgIH0KKworICAvLy8gQWRkIGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGUuCisgIEF0dHJpYnV0ZUxpc3QgKmFkZE5ldyhJZGVudGlmaWVySW5mbyAqYXR0ck5hbWUsIFNvdXJjZVJhbmdlIGF0dHJSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpzY29wZU5hbWUsIFNvdXJjZUxvY2F0aW9uIHNjb3BlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckxvYyAqUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdmFpbGFiaWxpdHlDaGFuZ2UgJmludHJvZHVjZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdmFpbGFiaWxpdHlDaGFuZ2UgJmRlcHJlY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdmFpbGFiaWxpdHlDaGFuZ2UgJm9ic29sZXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIHVuYXZhaWxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqTWVzc2FnZUV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0OjpTeW50YXggc3ludGF4LAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gc3RyaWN0LCBjb25zdCBFeHByICpSZXBsYWNlbWVudEV4cHIpIHsKKyAgICBBdHRyaWJ1dGVMaXN0ICphdHRyID0KKyAgICAgIHBvb2wuY3JlYXRlKGF0dHJOYW1lLCBhdHRyUmFuZ2UsIHNjb3BlTmFtZSwgc2NvcGVMb2MsIFBhcmFtLCBpbnRyb2R1Y2VkLAorICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCwgb2Jzb2xldGVkLCB1bmF2YWlsYWJsZSwgTWVzc2FnZUV4cHIsIHN5bnRheCwKKyAgICAgICAgICAgICAgICAgIHN0cmljdCwgUmVwbGFjZW1lbnRFeHByKTsKKyAgICBhZGQoYXR0cik7CisgICAgcmV0dXJuIGF0dHI7CisgIH0KKworICAvLy8gQWRkIG9iamNfYnJpZGdlX3JlbGF0ZWQgYXR0cmlidXRlLgorICBBdHRyaWJ1dGVMaXN0ICphZGROZXcoSWRlbnRpZmllckluZm8gKmF0dHJOYW1lLCBTb3VyY2VSYW5nZSBhdHRyUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqc2NvcGVOYW1lLCBTb3VyY2VMb2NhdGlvbiBzY29wZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJMb2MgKlBhcmFtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJMb2MgKlBhcmFtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJMb2MgKlBhcmFtMywKKyAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OlN5bnRheCBzeW50YXgpIHsKKyAgICBBdHRyaWJ1dGVMaXN0ICphdHRyID0KKyAgICAgIHBvb2wuY3JlYXRlKGF0dHJOYW1lLCBhdHRyUmFuZ2UsIHNjb3BlTmFtZSwgc2NvcGVMb2MsCisgICAgICAgICAgICAgICAgICBQYXJhbTEsIFBhcmFtMiwgUGFyYW0zLCBzeW50YXgpOworICAgIGFkZChhdHRyKTsKKyAgICByZXR1cm4gYXR0cjsKKyAgfQorCisgIC8vLyBBZGQgdHlwZV90YWdfZm9yX2RhdGF0eXBlIGF0dHJpYnV0ZS4KKyAgQXR0cmlidXRlTGlzdCAqYWRkTmV3VHlwZVRhZ0ZvckRhdGF0eXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKmF0dHJOYW1lLCBTb3VyY2VSYW5nZSBhdHRyUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqc2NvcGVOYW1lLCBTb3VyY2VMb2NhdGlvbiBzY29wZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJMb2MgKmFyZ3VtZW50S2luZCwgUGFyc2VkVHlwZSBtYXRjaGluZ0NUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsYXlvdXRDb21wYXRpYmxlLCBib29sIG11c3RCZU51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0OjpTeW50YXggc3ludGF4KSB7CisgICAgQXR0cmlidXRlTGlzdCAqYXR0ciA9CisgICAgICBwb29sLmNyZWF0ZVR5cGVUYWdGb3JEYXRhdHlwZShhdHRyTmFtZSwgYXR0clJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVOYW1lLCBzY29wZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50S2luZCwgbWF0Y2hpbmdDVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dENvbXBhdGlibGUsIG11c3RCZU51bGwsIHN5bnRheCk7CisgICAgYWRkKGF0dHIpOworICAgIHJldHVybiBhdHRyOworICB9CisKKyAgLy8vIEFkZCBhbiBhdHRyaWJ1dGUgd2l0aCBhIHNpbmdsZSB0eXBlIGFyZ3VtZW50LgorICBBdHRyaWJ1dGVMaXN0ICoKKyAgYWRkTmV3VHlwZUF0dHIoSWRlbnRpZmllckluZm8gKmF0dHJOYW1lLCBTb3VyY2VSYW5nZSBhdHRyUmFuZ2UsCisgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpzY29wZU5hbWUsIFNvdXJjZUxvY2F0aW9uIHNjb3BlTG9jLAorICAgICAgICAgICAgICAgICBQYXJzZWRUeXBlIHR5cGVBcmcsIEF0dHJpYnV0ZUxpc3Q6OlN5bnRheCBzeW50YXhVc2VkKSB7CisgICAgQXR0cmlidXRlTGlzdCAqYXR0ciA9CisgICAgICAgIHBvb2wuY3JlYXRlVHlwZUF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clJhbmdlLCBzY29wZU5hbWUsIHNjb3BlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFyZywgc3ludGF4VXNlZCk7CisgICAgYWRkKGF0dHIpOworICAgIHJldHVybiBhdHRyOworICB9CisKKyAgLy8vIEFkZCBtaWNyb3NvZnQgX19kZWxzcGVjKHByb3BlcnR5KSBhdHRyaWJ1dGUuCisgIEF0dHJpYnV0ZUxpc3QgKgorICBhZGROZXdQcm9wZXJ0eUF0dHIoSWRlbnRpZmllckluZm8gKmF0dHJOYW1lLCBTb3VyY2VSYW5nZSBhdHRyUmFuZ2UsCisgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpzY29wZU5hbWUsIFNvdXJjZUxvY2F0aW9uIHNjb3BlTG9jLAorICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqZ2V0dGVySWQsIElkZW50aWZpZXJJbmZvICpzZXR0ZXJJZCwKKyAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdDo6U3ludGF4IHN5bnRheFVzZWQpIHsKKyAgICBBdHRyaWJ1dGVMaXN0ICphdHRyID0KKyAgICAgICAgcG9vbC5jcmVhdGVQcm9wZXJ0eUF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clJhbmdlLCBzY29wZU5hbWUsIHNjb3BlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRlcklkLCBzZXR0ZXJJZCwgc3ludGF4VXNlZCk7CisgICAgYWRkKGF0dHIpOworICAgIHJldHVybiBhdHRyOworICB9CisKK3ByaXZhdGU6CisgIG11dGFibGUgQXR0cmlidXRlUG9vbCBwb29sOworICBBdHRyaWJ1dGVMaXN0ICpsaXN0ID0gbnVsbHB0cjsKK307CisKKy8vLyBUaGVzZSBjb25zdGFudHMgbWF0Y2ggdGhlIGVudW1lcmF0ZWQgY2hvaWNlcyBvZgorLy8vIGVycl9hdHRyaWJ1dGVfYXJndW1lbnRfbl90eXBlIGFuZCBlcnJfYXR0cmlidXRlX2FyZ3VtZW50X3R5cGUuCitlbnVtIEF0dHJpYnV0ZUFyZ3VtZW50TlR5cGUgeworICBBQU5UX0FyZ3VtZW50SW50T3JCb29sLAorICBBQU5UX0FyZ3VtZW50SW50ZWdlckNvbnN0YW50LAorICBBQU5UX0FyZ3VtZW50U3RyaW5nLAorICBBQU5UX0FyZ3VtZW50SWRlbnRpZmllcgorfTsKKworLy8vIFRoZXNlIGNvbnN0YW50cyBtYXRjaCB0aGUgZW51bWVyYXRlZCBjaG9pY2VzIG9mCisvLy8gd2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlIGFuZCBlcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZS4KK2VudW0gQXR0cmlidXRlRGVjbEtpbmQgeworICBFeHBlY3RlZEZ1bmN0aW9uLAorICBFeHBlY3RlZFVuaW9uLAorICBFeHBlY3RlZFZhcmlhYmxlT3JGdW5jdGlvbiwKKyAgRXhwZWN0ZWRGdW5jdGlvbk9yTWV0aG9kLAorICBFeHBlY3RlZEZ1bmN0aW9uTWV0aG9kT3JCbG9jaywKKyAgRXhwZWN0ZWRGdW5jdGlvbk1ldGhvZE9yUGFyYW1ldGVyLAorICBFeHBlY3RlZFZhcmlhYmxlLAorICBFeHBlY3RlZFZhcmlhYmxlT3JGaWVsZCwKKyAgRXhwZWN0ZWRWYXJpYWJsZUZpZWxkT3JUYWcsCisgIEV4cGVjdGVkVHlwZU9yTmFtZXNwYWNlLAorICBFeHBlY3RlZEZ1bmN0aW9uVmFyaWFibGVPckNsYXNzLAorICBFeHBlY3RlZEtlcm5lbEZ1bmN0aW9uLAorICBFeHBlY3RlZEZ1bmN0aW9uV2l0aFByb3RvVHlwZSwKKyAgRXhwZWN0ZWRGb3JNYXliZVVudXNlZCwKK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1NFTUFfQVRUUklCVVRFTElTVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0NYWEZpZWxkQ29sbGVjdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0NYWEZpZWxkQ29sbGVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4NTc1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvQ1hYRmllbGRDb2xsZWN0b3IuaApAQCAtMCwwICsxLDgwIEBACisvLz09PS0gQ1hYRmllbGRDb2xsZWN0b3IuaCAtIFV0aWxpdHkgY2xhc3MgZm9yIEMrKyBjbGFzcyBzZW1hbnRpYyBhbmFseXNpcyA9PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgcHJvdmlkZXMgQ1hYRmllbGRDb2xsZWN0b3IgdGhhdCBpcyB1c2VkIGR1cmluZyBwYXJzaW5nICYgc2VtYW50aWMKKy8vICBhbmFseXNpcyBvZiBDKysgY2xhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU0VNQV9DWFhGSUVMRENPTExFQ1RPUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU0VNQV9DWFhGSUVMRENPTExFQ1RPUl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgY2xhc3MgRmllbGREZWNsOworCisvLy8gQ1hYRmllbGRDb2xsZWN0b3IgLSBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgQ1hYRmllbGREZWNscyBkdXJpbmcgcGFyc2luZyBvZgorLy8vIEMrKyBjbGFzc2VzLgorY2xhc3MgQ1hYRmllbGRDb2xsZWN0b3IgeworICAvLy8gRmllbGRzIC0gQ29udGFpbnMgYWxsIEZpZWxkRGVjbHMgY29sbGVjdGVkIGR1cmluZyBwYXJzaW5nIG9mIGEgQysrCisgIC8vLyBjbGFzcy4gV2hlbiBhIG5lc3RlZCBjbGFzcyBpcyBlbnRlcmVkLCBpdHMgZmllbGRzIGFyZSBhcHBlbmRlZCB0byB0aGUKKyAgLy8vIGZpZWxkcyBvZiBpdHMgcGFyZW50IGNsYXNzLCB3aGVuIGl0IGlzIGV4aXRlZCBpdHMgZmllbGRzIGFyZSByZW1vdmVkLgorICBTbWFsbFZlY3RvcjxGaWVsZERlY2wqLCAzMj4gRmllbGRzOworCisgIC8vLyBGaWVsZENvdW50IC0gRWFjaCBlbnRyeSByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZmllbGRzIGNvbGxlY3RlZCBkdXJpbmcKKyAgLy8vIHRoZSBwYXJzaW5nIG9mIGEgQysrIGNsYXNzLiBXaGVuIGEgbmVzdGVkIGNsYXNzIGlzIGVudGVyZWQsIGEgbmV3IGZpZWxkCisgIC8vLyBjb3VudCBpcyBwdXNoZWQsIHdoZW4gaXQgaXMgZXhpdGVkLCB0aGUgZmllbGQgY291bnQgaXMgcG9wcGVkLgorICBTbWFsbFZlY3RvcjxzaXplX3QsIDQ+IEZpZWxkQ291bnQ7CisKKyAgLy8gRXhhbXBsZToKKyAgLy8KKyAgLy8gY2xhc3MgQyB7CisgIC8vICAgaW50IHgseTsKKyAgLy8gICBjbGFzcyBOQyB7CisgIC8vICAgICBpbnQgcTsKKyAgLy8gICAgIC8vIEF0IHRoaXMgcG9pbnQsIEZpZWxkcyBjb250YWlucyBbeCx5LHFdIGRlY2xzIGFuZCBGaWVsZENvdW50IGNvbnRhaW5zCisgIC8vICAgICAvLyBbMiwxXS4KKyAgLy8gICB9OworICAvLyAgIGludCB6OworICAvLyAgIC8vIEF0IHRoaXMgcG9pbnQsIEZpZWxkcyBjb250YWlucyBbeCx5LHpdIGRlY2xzIGFuZCBGaWVsZENvdW50IGNvbnRhaW5zCisgIC8vICAgLy8gWzNdLgorICAvLyB9OworCitwdWJsaWM6CisgIC8vLyBTdGFydENsYXNzIC0gQ2FsbGVkIGJ5IFNlbWE6OkFjdE9uU3RhcnRDWFhDbGFzc0RlZi4KKyAgdm9pZCBTdGFydENsYXNzKCkgeyBGaWVsZENvdW50LnB1c2hfYmFjaygwKTsgfQorCisgIC8vLyBBZGQgLSBDYWxsZWQgYnkgU2VtYTo6QWN0T25DWFhNZW1iZXJEZWNsYXJhdG9yLgorICB2b2lkIEFkZChGaWVsZERlY2wgKkQpIHsKKyAgICBGaWVsZHMucHVzaF9iYWNrKEQpOworICAgICsrRmllbGRDb3VudC5iYWNrKCk7CisgIH0KKworICAvLy8gZ2V0Q3VyTnVtRmllbGQgLSBUaGUgbnVtYmVyIG9mIGZpZWxkcyBhZGRlZCB0byB0aGUgY3VycmVudGx5IHBhcnNlZCBjbGFzcy4KKyAgc2l6ZV90IGdldEN1ck51bUZpZWxkcygpIGNvbnN0IHsKKyAgICBhc3NlcnQoIUZpZWxkQ291bnQuZW1wdHkoKSAmJiAibm8gY3VycmVudGx5LXBhcnNlZCBjbGFzcyIpOworICAgIHJldHVybiBGaWVsZENvdW50LmJhY2soKTsKKyAgfQorCisgIC8vLyBnZXRDdXJGaWVsZHMgLSBQb2ludGVyIHRvIGFycmF5IG9mIGZpZWxkcyBhZGRlZCB0byB0aGUgY3VycmVudGx5IHBhcnNlZAorICAvLy8gY2xhc3MuCisgIEZpZWxkRGVjbCAqKmdldEN1ckZpZWxkcygpIHsgcmV0dXJuICYqKEZpZWxkcy5lbmQoKSAtIGdldEN1ck51bUZpZWxkcygpKTsgfQorCisgIC8vLyBGaW5pc2hDbGFzcyAtIENhbGxlZCBieSBTZW1hOjpBY3RPbkZpbmlzaENYWENsYXNzRGVmLgorICB2b2lkIEZpbmlzaENsYXNzKCkgeworICAgIEZpZWxkcy5yZXNpemUoRmllbGRzLnNpemUoKSAtIGdldEN1ck51bUZpZWxkcygpKTsKKyAgICBGaWVsZENvdW50LnBvcF9iYWNrKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvQ2xlYW51cEluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvQ2xlYW51cEluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTFiZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9DbGVhbnVwSW5mby5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vPT09LS0tIENsZWFudXBJbmZvLmNwcCAtIENsZWFudXAgQ29udHJvbCBpbiBTZW1hIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgc2V0IG9mIG9wZXJhdGlvbnMgb24gd2hldGhlciBnZW5lcmF0aW5nIGFuCisvLyAgRXhwcldpdGhDbGVhbnVwcyBpbiBhIGZ1bGwgZXhwcmVzc2lvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU0VNQV9DTEVBTlVQX0lORk9fSAorI2RlZmluZSBMTFZNX0NMQU5HX1NFTUFfQ0xFQU5VUF9JTkZPX0gKKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQ2xlYW51cEluZm8geworICBib29sIEV4cHJOZWVkc0NsZWFudXBzID0gZmFsc2U7CisgIGJvb2wgQ2xlYW51cHNIYXZlU2lkZUVmZmVjdHMgPSBmYWxzZTsKKworcHVibGljOgorICBib29sIGV4cHJOZWVkc0NsZWFudXBzKCkgY29uc3QgeyByZXR1cm4gRXhwck5lZWRzQ2xlYW51cHM7IH0KKworICBib29sIGNsZWFudXBzSGF2ZVNpZGVFZmZlY3RzKCkgY29uc3QgeyByZXR1cm4gQ2xlYW51cHNIYXZlU2lkZUVmZmVjdHM7IH0KKworICB2b2lkIHNldEV4cHJOZWVkc0NsZWFudXBzKGJvb2wgU2lkZUVmZmVjdHMpIHsKKyAgICBFeHByTmVlZHNDbGVhbnVwcyA9IHRydWU7CisgICAgQ2xlYW51cHNIYXZlU2lkZUVmZmVjdHMgfD0gU2lkZUVmZmVjdHM7CisgIH0KKworICB2b2lkIHJlc2V0KCkgeworICAgIEV4cHJOZWVkc0NsZWFudXBzID0gZmFsc2U7CisgICAgQ2xlYW51cHNIYXZlU2lkZUVmZmVjdHMgPSBmYWxzZTsKKyAgfQorCisgIHZvaWQgbWVyZ2VGcm9tKENsZWFudXBJbmZvIFJocykgeworICAgIEV4cHJOZWVkc0NsZWFudXBzIHw9IFJocy5FeHByTmVlZHNDbGVhbnVwczsKKyAgICBDbGVhbnVwc0hhdmVTaWRlRWZmZWN0cyB8PSBSaHMuQ2xlYW51cHNIYXZlU2lkZUVmZmVjdHM7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvQ29kZUNvbXBsZXRlQ29uc3VtZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvQ29kZUNvbXBsZXRlQ29uc3VtZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGU4MTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9Db2RlQ29tcGxldGVDb25zdW1lci5oCkBAIC0wLDAgKzEsMTExMiBAQAorLy89PT0tIENvZGVDb21wbGV0ZUNvbnN1bWVyLmggLSBDb2RlIENvbXBsZXRpb24gSW50ZXJmYWNlIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIENvZGVDb21wbGV0ZUNvbnN1bWVyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TRU1BX0NPREVDT01QTEVURUNPTlNVTUVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TRU1BX0NPREVDT01QTEVURUNPTlNVTUVSX0gKKworI2luY2x1ZGUgImNsYW5nLWMvSW5kZXguaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9TZW1hL0NvZGVDb21wbGV0ZU9wdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9TZW1hL0RlY2xTcGVjLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBEZWNsOworY2xhc3MgRGVjbENvbnRleHQ7CitjbGFzcyBGdW5jdGlvbkRlY2w7CitjbGFzcyBGdW5jdGlvblRlbXBsYXRlRGVjbDsKK2NsYXNzIElkZW50aWZpZXJJbmZvOworY2xhc3MgTGFuZ09wdGlvbnM7CitjbGFzcyBOYW1lZERlY2w7CitjbGFzcyBOZXN0ZWROYW1lU3BlY2lmaWVyOworY2xhc3MgUHJlcHJvY2Vzc29yOworY2xhc3MgU2VtYTsKKworLy8vIFxicmllZiBEZWZhdWx0IHByaW9yaXR5IHZhbHVlcyBmb3IgY29kZS1jb21wbGV0aW9uIHJlc3VsdHMgYmFzZWQKKy8vLyBvbiB0aGVpciBraW5kLgorZW51bSB7CisgIC8vLyBcYnJpZWYgUHJpb3JpdHkgZm9yIHRoZSBuZXh0IGluaXRpYWxpemF0aW9uIGluIGEgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXIKKyAgLy8vIGxpc3QuCisgIENDUF9OZXh0SW5pdGlhbGl6ZXIgPSA3LAorCisgIC8vLyBcYnJpZWYgUHJpb3JpdHkgZm9yIGFuIGVudW1lcmF0aW9uIGNvbnN0YW50IGluc2lkZSBhIHN3aXRjaCB3aG9zZQorICAvLy8gY29uZGl0aW9uIGlzIG9mIHRoZSBlbnVtZXJhdGlvbiB0eXBlLgorICBDQ1BfRW51bUluQ2FzZSA9IDcsCisKKyAgLy8vIFxicmllZiBQcmlvcml0eSBmb3IgYSBzZW5kLXRvLXN1cGVyIGNvbXBsZXRpb24uCisgIENDUF9TdXBlckNvbXBsZXRpb24gPSAyMCwKKworICAvLy8gXGJyaWVmIFByaW9yaXR5IGZvciBhIGRlY2xhcmF0aW9uIHRoYXQgaXMgaW4gdGhlIGxvY2FsIHNjb3BlLgorICBDQ1BfTG9jYWxEZWNsYXJhdGlvbiA9IDM0LAorCisgIC8vLyBcYnJpZWYgUHJpb3JpdHkgZm9yIGEgbWVtYmVyIGRlY2xhcmF0aW9uIGZvdW5kIGZyb20gdGhlIGN1cnJlbnQKKyAgLy8vIG1ldGhvZCBvciBtZW1iZXIgZnVuY3Rpb24uCisgIENDUF9NZW1iZXJEZWNsYXJhdGlvbiA9IDM1LAorCisgIC8vLyBcYnJpZWYgUHJpb3JpdHkgZm9yIGEgbGFuZ3VhZ2Uga2V5d29yZCAodGhhdCBpc24ndCBhbnkgb2YgdGhlIG90aGVyCisgIC8vLyBjYXRlZ29yaWVzKS4KKyAgQ0NQX0tleXdvcmQgPSA0MCwKKworICAvLy8gXGJyaWVmIFByaW9yaXR5IGZvciBhIGNvZGUgcGF0dGVybi4KKyAgQ0NQX0NvZGVQYXR0ZXJuID0gNDAsCisKKyAgLy8vIFxicmllZiBQcmlvcml0eSBmb3IgYSBub24tdHlwZSBkZWNsYXJhdGlvbi4KKyAgQ0NQX0RlY2xhcmF0aW9uID0gNTAsCisKKyAgLy8vIFxicmllZiBQcmlvcml0eSBmb3IgYSB0eXBlLgorICBDQ1BfVHlwZSA9IENDUF9EZWNsYXJhdGlvbiwKKworICAvLy8gXGJyaWVmIFByaW9yaXR5IGZvciBhIGNvbnN0YW50IHZhbHVlIChlLmcuLCBlbnVtZXJhdG9yKS4KKyAgQ0NQX0NvbnN0YW50ID0gNjUsCisKKyAgLy8vIFxicmllZiBQcmlvcml0eSBmb3IgYSBwcmVwcm9jZXNzb3IgbWFjcm8uCisgIENDUF9NYWNybyA9IDcwLAorCisgIC8vLyBcYnJpZWYgUHJpb3JpdHkgZm9yIGEgbmVzdGVkLW5hbWUtc3BlY2lmaWVyLgorICBDQ1BfTmVzdGVkTmFtZVNwZWNpZmllciA9IDc1LAorCisgIC8vLyBcYnJpZWYgUHJpb3JpdHkgZm9yIGEgcmVzdWx0IHRoYXQgaXNuJ3QgbGlrZWx5IHRvIGJlIHdoYXQgdGhlIHVzZXIgd2FudHMsCisgIC8vLyBidXQgaXMgaW5jbHVkZWQgZm9yIGNvbXBsZXRlbmVzcy4KKyAgQ0NQX1VubGlrZWx5ID0gODAsCisKKyAgLy8vIFxicmllZiBQcmlvcml0eSBmb3IgdGhlIE9iamVjdGl2ZS1DICJfY21kIiBpbXBsaWNpdCBwYXJhbWV0ZXIuCisgIENDUF9PYmpDX2NtZCA9IENDUF9Vbmxpa2VseQorfTsKKworLy8vIFxicmllZiBQcmlvcml0eSB2YWx1ZSBkZWx0YXMgdGhhdCBhcmUgYWRkZWQgdG8gY29kZS1jb21wbGV0aW9uIHJlc3VsdHMKKy8vLyBiYXNlZCBvbiB0aGUgY29udGV4dCBvZiB0aGUgcmVzdWx0LgorZW51bSB7CisgIC8vLyBcYnJpZWYgVGhlIHJlc3VsdCBpcyBpbiBhIGJhc2UgY2xhc3MuCisgIENDRF9JbkJhc2VDbGFzcyA9IDIsCisKKyAgLy8vIFxicmllZiBUaGUgcmVzdWx0IGlzIGEgQysrIG5vbi1zdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIHdob3NlIHF1YWxpZmllcnMKKyAgLy8vIGV4YWN0bHkgbWF0Y2ggdGhlIG9iamVjdCB0eXBlIG9uIHdoaWNoIHRoZSBtZW1iZXIgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KKyAgQ0NEX09iamVjdFF1YWxpZmllck1hdGNoID0gLTEsCisKKyAgLy8vIFxicmllZiBUaGUgc2VsZWN0b3Igb2YgdGhlIGdpdmVuIG1lc3NhZ2UgZXhhY3RseSBtYXRjaGVzIHRoZSBzZWxlY3RvcgorICAvLy8gb2YgdGhlIGN1cnJlbnQgbWV0aG9kLCB3aGljaCBtaWdodCBpbXBseSB0aGF0IHNvbWUga2luZCBvZiBkZWxlZ2F0aW9uCisgIC8vLyBpcyBvY2N1cnJpbmcuCisgIENDRF9TZWxlY3Rvck1hdGNoID0gLTMsCisKKyAgLy8vIFxicmllZiBBZGp1c3RtZW50IHRvIHRoZSAiYm9vbCIgdHlwZSBpbiBPYmplY3RpdmUtQywgd2hlcmUgdGhlIHR5cGVkZWYKKyAgLy8vICJCT09MIiBpcyBwcmVmZXJyZWQuCisgIENDRF9ib29sX2luX09iakMgPSAxLAorCisgIC8vLyBcYnJpZWYgQWRqdXN0bWVudCBmb3IgS1ZDIGNvZGUgcGF0dGVybiBwcmlvcml0aWVzIHdoZW4gaXQgZG9lc24ndCBsb29rCisgIC8vLyBsaWtlIHRoZQorICBDQ0RfUHJvYmFibHlOb3RPYmpDQ29sbGVjdGlvbiA9IDE1LAorCisgIC8vLyBcYnJpZWYgQW4gT2JqZWN0aXZlLUMgbWV0aG9kIGJlaW5nIHVzZWQgYXMgYSBwcm9wZXJ0eS4KKyAgQ0NEX01ldGhvZEFzUHJvcGVydHkgPSAyLAorCisgIC8vLyBcYnJpZWYgQW4gT2JqZWN0aXZlLUMgYmxvY2sgcHJvcGVydHkgY29tcGxldGVkIGFzIGEgc2V0dGVyIHdpdGggYQorICAvLy8gYmxvY2sgcGxhY2Vob2xkZXIuCisgIENDRF9CbG9ja1Byb3BlcnR5U2V0dGVyID0gMworfTsKKworLy8vIFxicmllZiBQcmlvcml0eSB2YWx1ZSBmYWN0b3JzIGJ5IHdoaWNoIHdlIHdpbGwgZGl2aWRlIG9yIG11bHRpcGx5IHRoZQorLy8vIHByaW9yaXR5IG9mIGEgY29kZS1jb21wbGV0aW9uIHJlc3VsdC4KK2VudW0geworICAvLy8gXGJyaWVmIERpdmlkZSBieSB0aGlzIGZhY3RvciB3aGVuIGEgY29kZS1jb21wbGV0aW9uIHJlc3VsdCdzIHR5cGUgZXhhY3RseQorICAvLy8gbWF0Y2hlcyB0aGUgdHlwZSB3ZSBleHBlY3QuCisgIENDRl9FeGFjdFR5cGVNYXRjaCA9IDQsCisKKyAgLy8vIFxicmllZiBEaXZpZGUgYnkgdGhpcyBmYWN0b3Igd2hlbiBhIGNvZGUtY29tcGxldGlvbiByZXN1bHQncyB0eXBlIGlzCisgIC8vLyBzaW1pbGFyIHRvIHRoZSB0eXBlIHdlIGV4cGVjdCAoZS5nLiwgYm90aCBhcml0aG1ldGljIHR5cGVzLCBib3RoCisgIC8vLyBPYmplY3RpdmUtQyBvYmplY3QgcG9pbnRlciB0eXBlcykuCisgIENDRl9TaW1pbGFyVHlwZU1hdGNoID0gMgorfTsKKworLy8vIFxicmllZiBBIHNpbXBsaWZpZWQgY2xhc3NpZmljYXRpb24gb2YgdHlwZXMgdXNlZCB3aGVuIGRldGVybWluaW5nCisvLy8gInNpbWlsYXIiIHR5cGVzIGZvciBjb2RlIGNvbXBsZXRpb24uCitlbnVtIFNpbXBsaWZpZWRUeXBlQ2xhc3MgeworICBTVENfQXJpdGhtZXRpYywKKyAgU1RDX0FycmF5LAorICBTVENfQmxvY2ssCisgIFNUQ19GdW5jdGlvbiwKKyAgU1RDX09iamVjdGl2ZUMsCisgIFNUQ19PdGhlciwKKyAgU1RDX1BvaW50ZXIsCisgIFNUQ19SZWNvcmQsCisgIFNUQ19Wb2lkCit9OworCisvLy8gXGJyaWVmIERldGVybWluZSB0aGUgc2ltcGxpZmllZCB0eXBlIGNsYXNzIG9mIHRoZSBnaXZlbiBjYW5vbmljYWwgdHlwZS4KK1NpbXBsaWZpZWRUeXBlQ2xhc3MgZ2V0U2ltcGxpZmllZFR5cGVDbGFzcyhDYW5RdWFsVHlwZSBUKTsKKworLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIHR5cGUgdGhhdCB0aGlzIGRlY2xhcmF0aW9uIHdpbGwgaGF2ZSBpZiBpdCBpcyB1c2VkCisvLy8gYXMgYSB0eXBlIG9yIGluIGFuIGV4cHJlc3Npb24uCitRdWFsVHlwZSBnZXREZWNsVXNhZ2VUeXBlKEFTVENvbnRleHQgJkMsIGNvbnN0IE5hbWVkRGVjbCAqTkQpOworCisvLy8gXGJyaWVmIERldGVybWluZSB0aGUgcHJpb3JpdHkgdG8gYmUgZ2l2ZW4gdG8gYSBtYWNybyBjb2RlIGNvbXBsZXRpb24gcmVzdWx0CisvLy8gd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKy8vLworLy8vIFxwYXJhbSBNYWNyb05hbWUgVGhlIG5hbWUgb2YgdGhlIG1hY3JvLgorLy8vCisvLy8gXHBhcmFtIExhbmdPcHRzIE9wdGlvbnMgZGVzY3JpYmluZyB0aGUgY3VycmVudCBsYW5ndWFnZSBkaWFsZWN0LgorLy8vCisvLy8gXHBhcmFtIFByZWZlcnJlZFR5cGVJc1BvaW50ZXIgV2hldGhlciB0aGUgcHJlZmVycmVkIHR5cGUgZm9yIHRoZSBjb250ZXh0CisvLy8gb2YgdGhpcyBtYWNybyBpcyBhIHBvaW50ZXIgdHlwZS4KK3Vuc2lnbmVkIGdldE1hY3JvVXNhZ2VQcmlvcml0eShTdHJpbmdSZWYgTWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFByZWZlcnJlZFR5cGVJc1BvaW50ZXIgPSBmYWxzZSk7CisKKy8vLyBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBsaWJjbGFuZyBjdXJzb3Iga2luZCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuCisvLy8gZGVjbGFyYXRpb24uCitDWEN1cnNvcktpbmQgZ2V0Q3Vyc29yS2luZEZvckRlY2woY29uc3QgRGVjbCAqRCk7CisKKy8vLyBcYnJpZWYgVGhlIGNvbnRleHQgaW4gd2hpY2ggY29kZSBjb21wbGV0aW9uIG9jY3VycmVkLCBzbyB0aGF0IHRoZQorLy8vIGNvZGUtY29tcGxldGlvbiBjb25zdW1lciBjYW4gcHJvY2VzcyB0aGUgcmVzdWx0cyBhY2NvcmRpbmdseS4KK2NsYXNzIENvZGVDb21wbGV0aW9uQ29udGV4dCB7CitwdWJsaWM6CisgIGVudW0gS2luZCB7CisgICAgLy8vIFxicmllZiBBbiB1bnNwZWNpZmllZCBjb2RlLWNvbXBsZXRpb24gY29udGV4dC4KKyAgICBDQ0NfT3RoZXIsCisKKyAgICAvLy8gXGJyaWVmIEFuIHVuc3BlY2lmaWVkIGNvZGUtY29tcGxldGlvbiBjb250ZXh0IHdoZXJlIHdlIHNob3VsZCBhbHNvIGFkZAorICAgIC8vLyBtYWNybyBjb21wbGV0aW9ucy4KKyAgICBDQ0NfT3RoZXJXaXRoTWFjcm9zLAorCisgICAgLy8vIFxicmllZiBDb2RlIGNvbXBsZXRpb24gb2NjdXJyZWQgd2l0aGluIGEgInRvcC1sZXZlbCIgY29tcGxldGlvbiBjb250ZXh0LAorICAgIC8vLyBlLmcuLCBhdCBuYW1lc3BhY2Ugb3IgZ2xvYmFsIHNjb3BlLgorICAgIENDQ19Ub3BMZXZlbCwKKworICAgIC8vLyBcYnJpZWYgQ29kZSBjb21wbGV0aW9uIG9jY3VycmVkIHdpdGhpbiBhbiBPYmplY3RpdmUtQyBpbnRlcmZhY2UsCisgICAgLy8vIHByb3RvY29sLCBvciBjYXRlZ29yeSBpbnRlcmZhY2UuCisgICAgQ0NDX09iakNJbnRlcmZhY2UsCisKKyAgICAvLy8gXGJyaWVmIENvZGUgY29tcGxldGlvbiBvY2N1cnJlZCB3aXRoaW4gYW4gT2JqZWN0aXZlLUMgaW1wbGVtZW50YXRpb24KKyAgICAvLy8gb3IgY2F0ZWdvcnkgaW1wbGVtZW50YXRpb24uCisgICAgQ0NDX09iakNJbXBsZW1lbnRhdGlvbiwKKworICAgIC8vLyBcYnJpZWYgQ29kZSBjb21wbGV0aW9uIG9jY3VycmVkIHdpdGhpbiB0aGUgaW5zdGFuY2UgdmFyaWFibGUgbGlzdCBvZgorICAgIC8vLyBhbiBPYmplY3RpdmUtQyBpbnRlcmZhY2UsIGltcGxlbWVudGF0aW9uLCBvciBjYXRlZ29yeSBpbXBsZW1lbnRhdGlvbi4KKyAgICBDQ0NfT2JqQ0l2YXJMaXN0LAorCisgICAgLy8vIFxicmllZiBDb2RlIGNvbXBsZXRpb24gb2NjdXJyZWQgd2l0aGluIGEgY2xhc3MsIHN0cnVjdCwgb3IgdW5pb24uCisgICAgQ0NDX0NsYXNzU3RydWN0VW5pb24sCisKKyAgICAvLy8gXGJyaWVmIENvZGUgY29tcGxldGlvbiBvY2N1cnJlZCB3aGVyZSBhIHN0YXRlbWVudCAob3IgZGVjbGFyYXRpb24pIGlzCisgICAgLy8vIGV4cGVjdGVkIGluIGEgZnVuY3Rpb24sIG1ldGhvZCwgb3IgYmxvY2suCisgICAgQ0NDX1N0YXRlbWVudCwKKworICAgIC8vLyBcYnJpZWYgQ29kZSBjb21wbGV0aW9uIG9jY3VycmVkIHdoZXJlIGFuIGV4cHJlc3Npb24gaXMgZXhwZWN0ZWQuCisgICAgQ0NDX0V4cHJlc3Npb24sCisKKyAgICAvLy8gXGJyaWVmIENvZGUgY29tcGxldGlvbiBvY2N1cnJlZCB3aGVyZSBhbiBPYmplY3RpdmUtQyBtZXNzYWdlIHJlY2VpdmVyCisgICAgLy8vIGlzIGV4cGVjdGVkLgorICAgIENDQ19PYmpDTWVzc2FnZVJlY2VpdmVyLAorCisgICAgLy8vIFxicmllZiBDb2RlIGNvbXBsZXRpb24gb2NjdXJyZWQgb24gdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiBhIG1lbWJlcgorICAgIC8vLyBhY2Nlc3MgZXhwcmVzc2lvbiB1c2luZyB0aGUgZG90IG9wZXJhdG9yLgorICAgIC8vLworICAgIC8vLyBUaGUgcmVzdWx0cyBvZiB0aGlzIGNvbXBsZXRpb24gYXJlIHRoZSBtZW1iZXJzIG9mIHRoZSB0eXBlIGJlaW5nCisgICAgLy8vIGFjY2Vzc2VkLiBUaGUgdHlwZSBpdHNlbGYgaXMgYXZhaWxhYmxlIHZpYQorICAgIC8vLyBcYyBDb2RlQ29tcGxldGlvbkNvbnRleHQ6OmdldFR5cGUoKS4KKyAgICBDQ0NfRG90TWVtYmVyQWNjZXNzLAorCisgICAgLy8vIFxicmllZiBDb2RlIGNvbXBsZXRpb24gb2NjdXJyZWQgb24gdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiBhIG1lbWJlcgorICAgIC8vLyBhY2Nlc3MgZXhwcmVzc2lvbiB1c2luZyB0aGUgYXJyb3cgb3BlcmF0b3IuCisgICAgLy8vCisgICAgLy8vIFRoZSByZXN1bHRzIG9mIHRoaXMgY29tcGxldGlvbiBhcmUgdGhlIG1lbWJlcnMgb2YgdGhlIHR5cGUgYmVpbmcKKyAgICAvLy8gYWNjZXNzZWQuIFRoZSB0eXBlIGl0c2VsZiBpcyBhdmFpbGFibGUgdmlhCisgICAgLy8vIFxjIENvZGVDb21wbGV0aW9uQ29udGV4dDo6Z2V0VHlwZSgpLgorICAgIENDQ19BcnJvd01lbWJlckFjY2VzcywKKworICAgIC8vLyBcYnJpZWYgQ29kZSBjb21wbGV0aW9uIG9jY3VycmVkIG9uIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgYW4gT2JqZWN0aXZlLUMKKyAgICAvLy8gcHJvcGVydHkgYWNjZXNzIGV4cHJlc3Npb24uCisgICAgLy8vCisgICAgLy8vIFRoZSByZXN1bHRzIG9mIHRoaXMgY29tcGxldGlvbiBhcmUgdGhlIG1lbWJlcnMgb2YgdGhlIHR5cGUgYmVpbmcKKyAgICAvLy8gYWNjZXNzZWQuIFRoZSB0eXBlIGl0c2VsZiBpcyBhdmFpbGFibGUgdmlhCisgICAgLy8vIFxjIENvZGVDb21wbGV0aW9uQ29udGV4dDo6Z2V0VHlwZSgpLgorICAgIENDQ19PYmpDUHJvcGVydHlBY2Nlc3MsCisKKyAgICAvLy8gXGJyaWVmIENvZGUgY29tcGxldGlvbiBvY2N1cnJlZCBhZnRlciB0aGUgImVudW0iIGtleXdvcmQsIHRvIGluZGljYXRlCisgICAgLy8vIGFuIGVudW1lcmF0aW9uIG5hbWUuCisgICAgQ0NDX0VudW1UYWcsCisKKyAgICAvLy8gXGJyaWVmIENvZGUgY29tcGxldGlvbiBvY2N1cnJlZCBhZnRlciB0aGUgInVuaW9uIiBrZXl3b3JkLCB0byBpbmRpY2F0ZQorICAgIC8vLyBhIHVuaW9uIG5hbWUuCisgICAgQ0NDX1VuaW9uVGFnLAorCisgICAgLy8vIFxicmllZiBDb2RlIGNvbXBsZXRpb24gb2NjdXJyZWQgYWZ0ZXIgdGhlICJzdHJ1Y3QiIG9yICJjbGFzcyIga2V5d29yZCwKKyAgICAvLy8gdG8gaW5kaWNhdGUgYSBzdHJ1Y3Qgb3IgY2xhc3MgbmFtZS4KKyAgICBDQ0NfQ2xhc3NPclN0cnVjdFRhZywKKworICAgIC8vLyBcYnJpZWYgQ29kZSBjb21wbGV0aW9uIG9jY3VycmVkIHdoZXJlIGEgcHJvdG9jb2wgbmFtZSBpcyBleHBlY3RlZC4KKyAgICBDQ0NfT2JqQ1Byb3RvY29sTmFtZSwKKworICAgIC8vLyBcYnJpZWYgQ29kZSBjb21wbGV0aW9uIG9jY3VycmVkIHdoZXJlIGEgbmFtZXNwYWNlIG9yIG5hbWVzcGFjZSBhbGlhcworICAgIC8vLyBpcyBleHBlY3RlZC4KKyAgICBDQ0NfTmFtZXNwYWNlLAorCisgICAgLy8vIFxicmllZiBDb2RlIGNvbXBsZXRpb24gb2NjdXJyZWQgd2hlcmUgYSB0eXBlIG5hbWUgaXMgZXhwZWN0ZWQuCisgICAgQ0NDX1R5cGUsCisKKyAgICAvLy8gXGJyaWVmIENvZGUgY29tcGxldGlvbiBvY2N1cnJlZCB3aGVyZSBhIG5ldyBuYW1lIGlzIGV4cGVjdGVkLgorICAgIENDQ19OYW1lLAorCisgICAgLy8vIFxicmllZiBDb2RlIGNvbXBsZXRpb24gb2NjdXJyZWQgd2hlcmUgYSBuZXcgbmFtZSBpcyBleHBlY3RlZCBhbmQgYQorICAgIC8vLyBxdWFsaWZpZWQgbmFtZSBpcyBwZXJtaXNzaWJsZS4KKyAgICBDQ0NfUG90ZW50aWFsbHlRdWFsaWZpZWROYW1lLAorCisgICAgLy8vIFxicmllZiBDb2RlIGNvbXBsZXRpb24gb2NjdXJyZWQgd2hlcmUgYW4gbWFjcm8gaXMgYmVpbmcgZGVmaW5lZC4KKyAgICBDQ0NfTWFjcm9OYW1lLAorCisgICAgLy8vIFxicmllZiBDb2RlIGNvbXBsZXRpb24gb2NjdXJyZWQgd2hlcmUgYSBtYWNybyBuYW1lIGlzIGV4cGVjdGVkCisgICAgLy8vICh3aXRob3V0IGFueSBhcmd1bWVudHMsIGluIHRoZSBjYXNlIG9mIGEgZnVuY3Rpb24tbGlrZSBtYWNybykuCisgICAgQ0NDX01hY3JvTmFtZVVzZSwKKworICAgIC8vLyBcYnJpZWYgQ29kZSBjb21wbGV0aW9uIG9jY3VycmVkIHdpdGhpbiBhIHByZXByb2Nlc3NvciBleHByZXNzaW9uLgorICAgIENDQ19QcmVwcm9jZXNzb3JFeHByZXNzaW9uLAorCisgICAgLy8vIFxicmllZiBDb2RlIGNvbXBsZXRpb24gb2NjdXJyZWQgd2hlcmUgYSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIGlzCisgICAgLy8vIGV4cGVjdGVkLgorICAgIENDQ19QcmVwcm9jZXNzb3JEaXJlY3RpdmUsCisKKyAgICAvLy8gXGJyaWVmIENvZGUgY29tcGxldGlvbiBvY2N1cnJlZCBpbiBhIGNvbnRleHQgd2hlcmUgbmF0dXJhbCBsYW5ndWFnZSBpcworICAgIC8vLyBleHBlY3RlZCwgZS5nLiwgYSBjb21tZW50IG9yIHN0cmluZyBsaXRlcmFsLgorICAgIC8vLworICAgIC8vLyBUaGlzIGNvbnRleHQgdXN1YWxseSBpbXBsaWVzIHRoYXQgbm8gY29tcGxldGlvbnMgc2hvdWxkIGJlIGFkZGVkLAorICAgIC8vLyB1bmxlc3MgdGhleSBjb21lIGZyb20gYW4gYXBwcm9wcmlhdGUgbmF0dXJhbC1sYW5ndWFnZSBkaWN0aW9uYXJ5LgorICAgIENDQ19OYXR1cmFsTGFuZ3VhZ2UsCisKKyAgICAvLy8gXGJyaWVmIENvZGUgY29tcGxldGlvbiBmb3IgYSBzZWxlY3RvciwgYXMgaW4gYW4gXEBzZWxlY3RvciBleHByZXNzaW9uLgorICAgIENDQ19TZWxlY3Rvck5hbWUsCisKKyAgICAvLy8gXGJyaWVmIENvZGUgY29tcGxldGlvbiB3aXRoaW4gYSB0eXBlLXF1YWxpZmllciBsaXN0LgorICAgIENDQ19UeXBlUXVhbGlmaWVycywKKworICAgIC8vLyBcYnJpZWYgQ29kZSBjb21wbGV0aW9uIGluIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLCB3aGljaCBtZWFucyB0aGF0CisgICAgLy8vIHdlIG1heSBhbHNvIGhhdmUgdHlwZXMgaGVyZSBpbiBDIGFuZCBPYmplY3RpdmUtQyAoYXMgd2VsbCBhcyBpbiBDKyspLgorICAgIENDQ19QYXJlbnRoZXNpemVkRXhwcmVzc2lvbiwKKworICAgIC8vLyBcYnJpZWYgQ29kZSBjb21wbGV0aW9uIHdoZXJlIGFuIE9iamVjdGl2ZS1DIGluc3RhbmNlIG1lc3NhZ2UgaXMKKyAgICAvLy8gZXhwZWN0ZWQuCisgICAgQ0NDX09iakNJbnN0YW5jZU1lc3NhZ2UsCisKKyAgICAvLy8gXGJyaWVmIENvZGUgY29tcGxldGlvbiB3aGVyZSBhbiBPYmplY3RpdmUtQyBjbGFzcyBtZXNzYWdlIGlzIGV4cGVjdGVkLgorICAgIENDQ19PYmpDQ2xhc3NNZXNzYWdlLAorCisgICAgLy8vIFxicmllZiBDb2RlIGNvbXBsZXRpb24gd2hlcmUgdGhlIG5hbWUgb2YgYW4gT2JqZWN0aXZlLUMgY2xhc3MgaXMKKyAgICAvLy8gZXhwZWN0ZWQuCisgICAgQ0NDX09iakNJbnRlcmZhY2VOYW1lLAorCisgICAgLy8vIFxicmllZiBDb2RlIGNvbXBsZXRpb24gd2hlcmUgYW4gT2JqZWN0aXZlLUMgY2F0ZWdvcnkgbmFtZSBpcyBleHBlY3RlZC4KKyAgICBDQ0NfT2JqQ0NhdGVnb3J5TmFtZSwKKworICAgIC8vLyBcYnJpZWYgQW4gdW5rbm93biBjb250ZXh0LCBpbiB3aGljaCB3ZSBhcmUgcmVjb3ZlcmluZyBmcm9tIGEgcGFyc2luZworICAgIC8vLyBlcnJvciBhbmQgZG9uJ3Qga25vdyB3aGljaCBjb21wbGV0aW9ucyB3ZSBzaG91bGQgZ2l2ZS4KKyAgICBDQ0NfUmVjb3ZlcnkKKyAgfTsKKworICB1c2luZyBWaXNpdGVkQ29udGV4dFNldCA9IGxsdm06OlNtYWxsUHRyU2V0PERlY2xDb250ZXh0ICosIDg+OworCitwcml2YXRlOgorICBLaW5kIENDS2luZDsKKworICAvLy8gXGJyaWVmIFRoZSB0eXBlIHRoYXQgd291bGQgcHJlZmVyIHRvIHNlZSBhdCB0aGlzIHBvaW50IChlLmcuLCB0aGUgdHlwZQorICAvLy8gb2YgYW4gaW5pdGlhbGl6ZXIgb3IgZnVuY3Rpb24gcGFyYW1ldGVyKS4KKyAgUXVhbFR5cGUgUHJlZmVycmVkVHlwZTsKKworICAvLy8gXGJyaWVmIFRoZSB0eXBlIG9mIHRoZSBiYXNlIG9iamVjdCBpbiBhIG1lbWJlciBhY2Nlc3MgZXhwcmVzc2lvbi4KKyAgUXVhbFR5cGUgQmFzZVR5cGU7CisKKyAgLy8vIFxicmllZiBUaGUgaWRlbnRpZmllcnMgZm9yIE9iamVjdGl2ZS1DIHNlbGVjdG9yIHBhcnRzLgorICBBcnJheVJlZjxJZGVudGlmaWVySW5mbyAqPiBTZWxJZGVudHM7CisKKyAgLy8vIFxicmllZiBUaGUgc2NvcGUgc3BlY2lmaWVyIHRoYXQgY29tZXMgYmVmb3JlIHRoZSBjb21wbGV0aW9uIHRva2VuIGUuZy4KKyAgLy8vICJhOjpiOjoiCisgIGxsdm06Ok9wdGlvbmFsPENYWFNjb3BlU3BlYz4gU2NvcGVTcGVjaWZpZXI7CisKKyAgLy8vIFxicmllZiBBIHNldCBvZiBkZWNsYXJhdGlvbiBjb250ZXh0cyB2aXNpdGVkIGJ5IFNlbWEgd2hlbiBkb2luZyBsb29rdXAgZm9yCisgIC8vLyBjb2RlIGNvbXBsZXRpb24uCisgIFZpc2l0ZWRDb250ZXh0U2V0IFZpc2l0ZWRDb250ZXh0czsKKworcHVibGljOgorICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIG5ldyBjb2RlLWNvbXBsZXRpb24gY29udGV4dCBvZiB0aGUgZ2l2ZW4ga2luZC4KKyAgQ29kZUNvbXBsZXRpb25Db250ZXh0KEtpbmQgQ0NLaW5kKSA6IENDS2luZChDQ0tpbmQpLCBTZWxJZGVudHMoTm9uZSkge30KKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIG5ldyBjb2RlLWNvbXBsZXRpb24gY29udGV4dCBvZiB0aGUgZ2l2ZW4ga2luZC4KKyAgQ29kZUNvbXBsZXRpb25Db250ZXh0KEtpbmQgQ0NLaW5kLCBRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8SWRlbnRpZmllckluZm8gKj4gU2VsSWRlbnRzID0gTm9uZSkKKyAgICAgIDogQ0NLaW5kKENDS2luZCksIFNlbElkZW50cyhTZWxJZGVudHMpIHsKKyAgICBpZiAoQ0NLaW5kID09IENDQ19Eb3RNZW1iZXJBY2Nlc3MgfHwgQ0NLaW5kID09IENDQ19BcnJvd01lbWJlckFjY2VzcyB8fAorICAgICAgICBDQ0tpbmQgPT0gQ0NDX09iakNQcm9wZXJ0eUFjY2VzcyB8fCBDQ0tpbmQgPT0gQ0NDX09iakNDbGFzc01lc3NhZ2UgfHwKKyAgICAgICAgQ0NLaW5kID09IENDQ19PYmpDSW5zdGFuY2VNZXNzYWdlKQorICAgICAgQmFzZVR5cGUgPSBUOworICAgIGVsc2UKKyAgICAgIFByZWZlcnJlZFR5cGUgPSBUOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUga2luZCBvZiBjb2RlLWNvbXBsZXRpb24gY29udGV4dC4KKyAgS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gQ0NLaW5kOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdHlwZSB0aGF0IHRoaXMgZXhwcmVzc2lvbiB3b3VsZCBwcmVmZXIgdG8gaGF2ZSwgZS5nLiwKKyAgLy8vIGlmIHRoZSBleHByZXNzaW9uIGlzIGEgdmFyaWFibGUgaW5pdGlhbGl6ZXIgb3IgYSBmdW5jdGlvbiBhcmd1bWVudCwgdGhlCisgIC8vLyB0eXBlIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlIG9yIGZ1bmN0aW9uIHBhcmFtZXRlci4KKyAgUXVhbFR5cGUgZ2V0UHJlZmVycmVkVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFByZWZlcnJlZFR5cGU7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0eXBlIG9mIHRoZSBiYXNlIG9iamVjdCBpbiBhIG1lbWJlci1hY2Nlc3MKKyAgLy8vIGV4cHJlc3Npb24uCisgIFF1YWxUeXBlIGdldEJhc2VUeXBlKCkgY29uc3QgeyByZXR1cm4gQmFzZVR5cGU7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBPYmplY3RpdmUtQyBzZWxlY3RvciBpZGVudGlmaWVycy4KKyAgQXJyYXlSZWY8SWRlbnRpZmllckluZm8gKj4gZ2V0U2VsSWRlbnRzKCkgY29uc3QgeyByZXR1cm4gU2VsSWRlbnRzOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgd2Ugd2FudCBDKysgY29uc3RydWN0b3JzIGFzIHJlc3VsdHMgd2l0aGluIHRoaXMKKyAgLy8vIGNvbnRleHQuCisgIGJvb2wgd2FudENvbnN0cnVjdG9yUmVzdWx0cygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgc2NvcGUgc3BlY2lmaWVyIHRoYXQgY29tZXMgYmVmb3JlIHRoZSBjb21wbGV0aW9uIHRva2VuLgorICAvLy8gVGhpcyBpcyBleHBlY3RlZCB0byBiZSBzZXQgaW4gY29kZSBjb21wbGV0aW9ucyBvbiBxdWFsZmllZCBzcGVjaWZpZXJzCisgIC8vLyAoZS5nLiAiYTo6Yjo6IikuCisgIHZvaWQgc2V0Q1hYU2NvcGVTcGVjaWZpZXIoQ1hYU2NvcGVTcGVjIFNTKSB7CisgICAgdGhpcy0+U2NvcGVTcGVjaWZpZXIgPSBzdGQ6Om1vdmUoU1MpOworICB9CisKKyAgLy8vIFxicmllZiBBZGRzIGEgdmlzaXRlZCBjb250ZXh0LgorICB2b2lkIGFkZFZpc2l0ZWRDb250ZXh0KERlY2xDb250ZXh0ICpDdHgpIHsKKyAgICBWaXNpdGVkQ29udGV4dHMuaW5zZXJ0KEN0eCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlcyBhbGwgdmlzaXRlZCBjb250ZXh0cy4KKyAgY29uc3QgVmlzaXRlZENvbnRleHRTZXQgJmdldFZpc2l0ZWRDb250ZXh0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gVmlzaXRlZENvbnRleHRzOworICB9CisKKyAgbGx2bTo6T3B0aW9uYWw8Y29uc3QgQ1hYU2NvcGVTcGVjICo+IGdldENYWFNjb3BlU3BlY2lmaWVyKCkgeworICAgIGlmIChTY29wZVNwZWNpZmllcikKKyAgICAgIHJldHVybiBTY29wZVNwZWNpZmllci5nZXRQb2ludGVyKCk7CisgICAgcmV0dXJuIGxsdm06Ok5vbmU7CisgIH0KK307CisKKy8vLyBcYnJpZWYgR2V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBccCBLaW5kLCB1c2VmdWwgZm9yIGZvciBkZWJ1Z2dpbmcuCitsbHZtOjpTdHJpbmdSZWYgZ2V0Q29tcGxldGlvbktpbmRTdHJpbmcoQ29kZUNvbXBsZXRpb25Db250ZXh0OjpLaW5kIEtpbmQpOworCisvLy8gXGJyaWVmIEEgInN0cmluZyIgdXNlZCB0byBkZXNjcmliZSBob3cgY29kZSBjb21wbGV0aW9uIGNhbgorLy8vIGJlIHBlcmZvcm1lZCBmb3IgYW4gZW50aXR5LgorLy8vCisvLy8gQSBjb2RlIGNvbXBsZXRpb24gc3RyaW5nIHR5cGljYWxseSBzaG93cyBob3cgYSBwYXJ0aWN1bGFyIGVudGl0eSBjYW4gYmUKKy8vLyB1c2VkLiBGb3IgZXhhbXBsZSwgdGhlIGNvZGUgY29tcGxldGlvbiBzdHJpbmcgZm9yIGEgZnVuY3Rpb24gd291bGQgc2hvdworLy8vIHRoZSBzeW50YXggdG8gY2FsbCBpdCwgaW5jbHVkaW5nIHRoZSBwYXJlbnRoZXNlcywgcGxhY2Vob2xkZXJzIGZvciB0aGUKKy8vLyBhcmd1bWVudHMsIGV0Yy4KK2NsYXNzIENvZGVDb21wbGV0aW9uU3RyaW5nIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBUaGUgZGlmZmVyZW50IGtpbmRzIG9mICJjaHVua3MiIHRoYXQgY2FuIG9jY3VyIHdpdGhpbiBhIGNvZGUKKyAgLy8vIGNvbXBsZXRpb24gc3RyaW5nLgorICBlbnVtIENodW5rS2luZCB7CisgICAgLy8vIFxicmllZiBUaGUgcGllY2Ugb2YgdGV4dCB0aGF0IHRoZSB1c2VyIGlzIGV4cGVjdGVkIHRvIHR5cGUgdG8KKyAgICAvLy8gbWF0Y2ggdGhlIGNvZGUtY29tcGxldGlvbiBzdHJpbmcsIHR5cGljYWxseSBhIGtleXdvcmQgb3IgdGhlIG5hbWUgb2YgYQorICAgIC8vLyBkZWNsYXJhdG9yIG9yIG1hY3JvLgorICAgIENLX1R5cGVkVGV4dCwKKworICAgIC8vLyBcYnJpZWYgQSBwaWVjZSBvZiB0ZXh0IHRoYXQgc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGUgYnVmZmVyLCBlLmcuLAorICAgIC8vLyBwYXJlbnRoZXNlcyBvciBhIGNvbW1hIGluIGEgZnVuY3Rpb24gY2FsbC4KKyAgICBDS19UZXh0LAorCisgICAgLy8vIFxicmllZiBBIGNvZGUgY29tcGxldGlvbiBzdHJpbmcgdGhhdCBpcyBlbnRpcmVseSBvcHRpb25hbC4gRm9yIGV4YW1wbGUsCisgICAgLy8vIGFuIG9wdGlvbmFsIGNvZGUgY29tcGxldGlvbiBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhlIGRlZmF1bHQgYXJndW1lbnRzCisgICAgLy8vIGluIGEgZnVuY3Rpb24gY2FsbC4KKyAgICBDS19PcHRpb25hbCwKKworICAgIC8vLyBcYnJpZWYgQSBzdHJpbmcgdGhhdCBhY3RzIGFzIGEgcGxhY2Vob2xkZXIgZm9yLCBlLmcuLCBhIGZ1bmN0aW9uCisgICAgLy8vIGNhbGwgYXJndW1lbnQuCisgICAgQ0tfUGxhY2Vob2xkZXIsCisKKyAgICAvLy8gXGJyaWVmIEEgcGllY2Ugb2YgdGV4dCB0aGF0IGRlc2NyaWJlcyBzb21ldGhpbmcgYWJvdXQgdGhlIHJlc3VsdCBidXQKKyAgICAvLy8gc2hvdWxkIG5vdCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBidWZmZXIuCisgICAgQ0tfSW5mb3JtYXRpdmUsCisgICAgLy8vIFxicmllZiBBIHBpZWNlIG9mIHRleHQgdGhhdCBkZXNjcmliZXMgdGhlIHR5cGUgb2YgYW4gZW50aXR5IG9yLCBmb3IKKyAgICAvLy8gZnVuY3Rpb25zIGFuZCBtZXRob2RzLCB0aGUgcmV0dXJuIHR5cGUuCisgICAgQ0tfUmVzdWx0VHlwZSwKKworICAgIC8vLyBcYnJpZWYgQSBwaWVjZSBvZiB0ZXh0IHRoYXQgZGVzY3JpYmVzIHRoZSBwYXJhbWV0ZXIgdGhhdCBjb3JyZXNwb25kcworICAgIC8vLyB0byB0aGUgY29kZS1jb21wbGV0aW9uIGxvY2F0aW9uIHdpdGhpbiBhIGZ1bmN0aW9uIGNhbGwsIG1lc3NhZ2Ugc2VuZCwKKyAgICAvLy8gbWFjcm8gaW52b2NhdGlvbiwgZXRjLgorICAgIENLX0N1cnJlbnRQYXJhbWV0ZXIsCisKKyAgICAvLy8gXGJyaWVmIEEgbGVmdCBwYXJlbnRoZXNpcyAoJygnKS4KKyAgICBDS19MZWZ0UGFyZW4sCisKKyAgICAvLy8gXGJyaWVmIEEgcmlnaHQgcGFyZW50aGVzaXMgKCcpJykuCisgICAgQ0tfUmlnaHRQYXJlbiwKKworICAgIC8vLyBcYnJpZWYgQSBsZWZ0IGJyYWNrZXQgKCdbJykuCisgICAgQ0tfTGVmdEJyYWNrZXQsCisKKyAgICAvLy8gXGJyaWVmIEEgcmlnaHQgYnJhY2tldCAoJ10nKS4KKyAgICBDS19SaWdodEJyYWNrZXQsCisKKyAgICAvLy8gXGJyaWVmIEEgbGVmdCBicmFjZSAoJ3snKS4KKyAgICBDS19MZWZ0QnJhY2UsCisKKyAgICAvLy8gXGJyaWVmIEEgcmlnaHQgYnJhY2UgKCd9JykuCisgICAgQ0tfUmlnaHRCcmFjZSwKKworICAgIC8vLyBcYnJpZWYgQSBsZWZ0IGFuZ2xlIGJyYWNrZXQgKCc8JykuCisgICAgQ0tfTGVmdEFuZ2xlLAorCisgICAgLy8vIFxicmllZiBBIHJpZ2h0IGFuZ2xlIGJyYWNrZXQgKCc+JykuCisgICAgQ0tfUmlnaHRBbmdsZSwKKworICAgIC8vLyBcYnJpZWYgQSBjb21tYSBzZXBhcmF0b3IgKCcsJykuCisgICAgQ0tfQ29tbWEsCisKKyAgICAvLy8gXGJyaWVmIEEgY29sb24gKCc6JykuCisgICAgQ0tfQ29sb24sCisKKyAgICAvLy8gXGJyaWVmIEEgc2VtaWNvbG9uICgnOycpLgorICAgIENLX1NlbWlDb2xvbiwKKworICAgIC8vLyBcYnJpZWYgQW4gJz0nIHNpZ24uCisgICAgQ0tfRXF1YWwsCisKKyAgICAvLy8gXGJyaWVmIEhvcml6b250YWwgd2hpdGVzcGFjZSAoJyAnKS4KKyAgICBDS19Ib3Jpem9udGFsU3BhY2UsCisKKyAgICAvLy8gXGJyaWVmIFZlcnRpY2FsIHdoaXRlc3BhY2UgKCdcXG4nIG9yICdcXHJcXG4nLCBkZXBlbmRpbmcgb24gdGhlCisgICAgLy8vIHBsYXRmb3JtKS4KKyAgICBDS19WZXJ0aWNhbFNwYWNlCisgIH07CisKKyAgLy8vIFxicmllZiBPbmUgcGllY2Ugb2YgdGhlIGNvZGUgY29tcGxldGlvbiBzdHJpbmcuCisgIHN0cnVjdCBDaHVuayB7CisgICAgLy8vIFxicmllZiBUaGUga2luZCBvZiBkYXRhIHN0b3JlZCBpbiB0aGlzIHBpZWNlIG9mIHRoZSBjb2RlIGNvbXBsZXRpb24KKyAgICAvLy8gc3RyaW5nLgorICAgIENodW5rS2luZCBLaW5kID0gQ0tfVGV4dDsKKworICAgIHVuaW9uIHsKKyAgICAgIC8vLyBcYnJpZWYgVGhlIHRleHQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIENLX1RleHQsIENLX1BsYWNlaG9sZGVyLAorICAgICAgLy8vIENLX0luZm9ybWF0aXZlLCBvciBDS19Db21tYSBjaHVuay4KKyAgICAgIC8vLyBUaGUgc3RyaW5nIGlzIG93bmVkIGJ5IHRoZSBjaHVuayBhbmQgd2lsbCBiZSBkZWFsbG9jYXRlZAorICAgICAgLy8vICh3aXRoIGRlbGV0ZVtdKSB3aGVuIHRoZSBjaHVuayBpcyBkZXN0cm95ZWQuCisgICAgICBjb25zdCBjaGFyICpUZXh0OworCisgICAgICAvLy8gXGJyaWVmIFRoZSBjb2RlIGNvbXBsZXRpb24gc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIENLX09wdGlvbmFsIGNodW5rLgorICAgICAgLy8vIFRoZSBvcHRpb25hbCBjb2RlIGNvbXBsZXRpb24gc3RyaW5nIGlzIG93bmVkIGJ5IHRoZSBjaHVuaywgYW5kIHdpbGwKKyAgICAgIC8vLyBiZSBkZWFsbG9jYXRlZCAod2l0aCBkZWxldGUpIHdoZW4gdGhlIGNodW5rIGlzIGRlc3Ryb3llZC4KKyAgICAgIENvZGVDb21wbGV0aW9uU3RyaW5nICpPcHRpb25hbDsKKyAgICB9OworCisgICAgQ2h1bmsoKSA6IFRleHQobnVsbHB0cikge30KKworICAgIGV4cGxpY2l0IENodW5rKENodW5rS2luZCBLaW5kLCBjb25zdCBjaGFyICpUZXh0ID0gIiIpOworCisgICAgLy8vIFxicmllZiBDcmVhdGUgYSBuZXcgdGV4dCBjaHVuay4KKyAgICBzdGF0aWMgQ2h1bmsgQ3JlYXRlVGV4dChjb25zdCBjaGFyICpUZXh0KTsKKworICAgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbmV3IG9wdGlvbmFsIGNodW5rLgorICAgIHN0YXRpYyBDaHVuayBDcmVhdGVPcHRpb25hbChDb2RlQ29tcGxldGlvblN0cmluZyAqT3B0aW9uYWwpOworCisgICAgLy8vIFxicmllZiBDcmVhdGUgYSBuZXcgcGxhY2Vob2xkZXIgY2h1bmsuCisgICAgc3RhdGljIENodW5rIENyZWF0ZVBsYWNlaG9sZGVyKGNvbnN0IGNoYXIgKlBsYWNlaG9sZGVyKTsKKworICAgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbmV3IGluZm9ybWF0aXZlIGNodW5rLgorICAgIHN0YXRpYyBDaHVuayBDcmVhdGVJbmZvcm1hdGl2ZShjb25zdCBjaGFyICpJbmZvcm1hdGl2ZSk7CisKKyAgICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyByZXN1bHQgdHlwZSBjaHVuay4KKyAgICBzdGF0aWMgQ2h1bmsgQ3JlYXRlUmVzdWx0VHlwZShjb25zdCBjaGFyICpSZXN1bHRUeXBlKTsKKworICAgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbmV3IGN1cnJlbnQtcGFyYW1ldGVyIGNodW5rLgorICAgIHN0YXRpYyBDaHVuayBDcmVhdGVDdXJyZW50UGFyYW1ldGVyKGNvbnN0IGNoYXIgKkN1cnJlbnRQYXJhbWV0ZXIpOworICB9OworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQ29kZUNvbXBsZXRpb25CdWlsZGVyOworICBmcmllbmQgY2xhc3MgQ29kZUNvbXBsZXRpb25SZXN1bHQ7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGNodW5rcyBzdG9yZWQgaW4gdGhpcyBzdHJpbmcuCisgIHVuc2lnbmVkIE51bUNodW5rcyA6IDE2OworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBhbm5vdGF0aW9ucyBmb3IgdGhpcyBjb2RlLWNvbXBsZXRpb24gcmVzdWx0LgorICB1bnNpZ25lZCBOdW1Bbm5vdGF0aW9ucyA6IDE2OworCisgIC8vLyBcYnJpZWYgVGhlIHByaW9yaXR5IG9mIHRoaXMgY29kZS1jb21wbGV0aW9uIHN0cmluZy4KKyAgdW5zaWduZWQgUHJpb3JpdHkgOiAxNjsKKworICAvLy8gXGJyaWVmIFRoZSBhdmFpbGFiaWxpdHkgb2YgdGhpcyBjb2RlLWNvbXBsZXRpb24gcmVzdWx0LgorICB1bnNpZ25lZCBBdmFpbGFiaWxpdHkgOiAyOworICAKKyAgLy8vIFxicmllZiBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IGNvbnRleHQuCisgIFN0cmluZ1JlZiBQYXJlbnROYW1lOworCisgIC8vLyBcYnJpZWYgQSBicmllZiBkb2N1bWVudGF0aW9uIGNvbW1lbnQgYXR0YWNoZWQgdG8gdGhlIGRlY2xhcmF0aW9uIG9mCisgIC8vLyBlbnRpdHkgYmVpbmcgY29tcGxldGVkIGJ5IHRoaXMgcmVzdWx0LgorICBjb25zdCBjaGFyICpCcmllZkNvbW1lbnQ7CisgIAorICBDb2RlQ29tcGxldGlvblN0cmluZyhjb25zdCBDaHVuayAqQ2h1bmtzLCB1bnNpZ25lZCBOdW1DaHVua3MsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFByaW9yaXR5LCBDWEF2YWlsYWJpbGl0eUtpbmQgQXZhaWxhYmlsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqQW5ub3RhdGlvbnMsIHVuc2lnbmVkIE51bUFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgUGFyZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqQnJpZWZDb21tZW50KTsKKyAgfkNvZGVDb21wbGV0aW9uU3RyaW5nKCkgPSBkZWZhdWx0OworCitwdWJsaWM6CisgIENvZGVDb21wbGV0aW9uU3RyaW5nKGNvbnN0IENvZGVDb21wbGV0aW9uU3RyaW5nICYpID0gZGVsZXRlOworICBDb2RlQ29tcGxldGlvblN0cmluZyAmb3BlcmF0b3I9KGNvbnN0IENvZGVDb21wbGV0aW9uU3RyaW5nICYpID0gZGVsZXRlOworCisgIHVzaW5nIGl0ZXJhdG9yID0gY29uc3QgQ2h1bmsgKjsKKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ2h1bmsgKj4odGhpcyArIDEpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGJlZ2luKCkgKyBOdW1DaHVua3M7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIE51bUNodW5rcyA9PSAwOyB9CisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBOdW1DaHVua3M7IH0KKworICBjb25zdCBDaHVuayAmb3BlcmF0b3JbXSh1bnNpZ25lZCBJKSBjb25zdCB7CisgICAgYXNzZXJ0KEkgPCBzaXplKCkgJiYgIkNodW5rIGluZGV4IG91dC1vZi1yYW5nZSIpOworICAgIHJldHVybiBiZWdpbigpW0ldOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSB0ZXh0IGluIHRoZSBUeXBlZFRleHQgY2h1bmsuCisgIGNvbnN0IGNoYXIgKmdldFR5cGVkVGV4dCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHByaW9yaXR5IG9mIHRoaXMgY29kZSBjb21wbGV0aW9uIHJlc3VsdC4KKyAgdW5zaWduZWQgZ2V0UHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiBQcmlvcml0eTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGlzIGNvZGUgY29tcGxldGlvbiByZXN1bHQuCisgIHVuc2lnbmVkIGdldEF2YWlsYWJpbGl0eSgpIGNvbnN0IHsgcmV0dXJuIEF2YWlsYWJpbGl0eTsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG51bWJlciBvZiBhbm5vdGF0aW9ucyBmb3IgdGhpcyBjb2RlIGNvbXBsZXRpb24gcmVzdWx0LgorICB1bnNpZ25lZCBnZXRBbm5vdGF0aW9uQ291bnQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBhbm5vdGF0aW9uIHN0cmluZyBzcGVjaWZpZWQgYnkgXGMgQW5ub3RhdGlvbk5yLgorICBjb25zdCBjaGFyICpnZXRBbm5vdGF0aW9uKHVuc2lnbmVkIEFubm90YXRpb25OcikgY29uc3Q7CisgIAorICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgY29udGV4dC4KKyAgU3RyaW5nUmVmIGdldFBhcmVudENvbnRleHROYW1lKCkgY29uc3QgeworICAgIHJldHVybiBQYXJlbnROYW1lOworICB9CisKKyAgY29uc3QgY2hhciAqZ2V0QnJpZWZDb21tZW50KCkgY29uc3QgeworICAgIHJldHVybiBCcmllZkNvbW1lbnQ7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvZGUgY29tcGxldGlvbiBzdHJpbmcsCisgIC8vLyB3aGljaCBpcyBtYWlubHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Q7Cit9OworCisvLy8gXGJyaWVmIEFuIGFsbG9jYXRvciB1c2VkIHNwZWNpZmljYWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgY29kZSBjb21wbGV0aW9uLgorY2xhc3MgQ29kZUNvbXBsZXRpb25BbGxvY2F0b3IgOiBwdWJsaWMgbGx2bTo6QnVtcFB0ckFsbG9jYXRvciB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ29weSB0aGUgZ2l2ZW4gc3RyaW5nIGludG8gdGhpcyBhbGxvY2F0b3IuCisgIGNvbnN0IGNoYXIgKkNvcHlTdHJpbmcoY29uc3QgVHdpbmUgJlN0cmluZyk7Cit9OworCisvLy8gXGJyaWVmIEFsbG9jYXRvciBmb3IgYSBjYWNoZWQgc2V0IG9mIGdsb2JhbCBjb2RlIGNvbXBsZXRpb25zLgorY2xhc3MgR2xvYmFsQ29kZUNvbXBsZXRpb25BbGxvY2F0b3IgOiBwdWJsaWMgQ29kZUNvbXBsZXRpb25BbGxvY2F0b3Ige307CisKK2NsYXNzIENvZGVDb21wbGV0aW9uVFVJbmZvIHsKKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgRGVjbENvbnRleHQgKiwgU3RyaW5nUmVmPiBQYXJlbnROYW1lczsKKyAgc3RkOjpzaGFyZWRfcHRyPEdsb2JhbENvZGVDb21wbGV0aW9uQWxsb2NhdG9yPiBBbGxvY2F0b3JSZWY7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ29kZUNvbXBsZXRpb25UVUluZm8oCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8R2xvYmFsQ29kZUNvbXBsZXRpb25BbGxvY2F0b3I+IEFsbG9jYXRvcikKKyAgICAgIDogQWxsb2NhdG9yUmVmKHN0ZDo6bW92ZShBbGxvY2F0b3IpKSB7fQorCisgIHN0ZDo6c2hhcmVkX3B0cjxHbG9iYWxDb2RlQ29tcGxldGlvbkFsbG9jYXRvcj4gZ2V0QWxsb2NhdG9yUmVmKCkgY29uc3QgeworICAgIHJldHVybiBBbGxvY2F0b3JSZWY7CisgIH0KKworICBDb2RlQ29tcGxldGlvbkFsbG9jYXRvciAmZ2V0QWxsb2NhdG9yKCkgY29uc3QgeworICAgIGFzc2VydChBbGxvY2F0b3JSZWYpOworICAgIHJldHVybiAqQWxsb2NhdG9yUmVmOworICB9CisKKyAgU3RyaW5nUmVmIGdldFBhcmVudE5hbWUoY29uc3QgRGVjbENvbnRleHQgKkRDKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzUG9kTGlrZTxjbGFuZzo6Q29kZUNvbXBsZXRpb25TdHJpbmc6OkNodW5rPiB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBBIGJ1aWxkZXIgY2xhc3MgdXNlZCB0byBjb25zdHJ1Y3QgbmV3IGNvZGUtY29tcGxldGlvbiBzdHJpbmdzLgorY2xhc3MgQ29kZUNvbXBsZXRpb25CdWlsZGVyIHsKK3B1YmxpYzoKKyAgdXNpbmcgQ2h1bmsgPSBDb2RlQ29tcGxldGlvblN0cmluZzo6Q2h1bms7CisKK3ByaXZhdGU6CisgIENvZGVDb21wbGV0aW9uQWxsb2NhdG9yICZBbGxvY2F0b3I7CisgIENvZGVDb21wbGV0aW9uVFVJbmZvICZDQ1RVSW5mbzsKKyAgdW5zaWduZWQgUHJpb3JpdHkgPSAwOworICBDWEF2YWlsYWJpbGl0eUtpbmQgQXZhaWxhYmlsaXR5ID0gQ1hBdmFpbGFiaWxpdHlfQXZhaWxhYmxlOworICBTdHJpbmdSZWYgUGFyZW50TmFtZTsKKyAgY29uc3QgY2hhciAqQnJpZWZDb21tZW50ID0gbnVsbHB0cjsKKyAgCisgIC8vLyBcYnJpZWYgVGhlIGNodW5rcyBzdG9yZWQgaW4gdGhpcyBzdHJpbmcuCisgIFNtYWxsVmVjdG9yPENodW5rLCA0PiBDaHVua3M7CisKKyAgU21hbGxWZWN0b3I8Y29uc3QgY2hhciAqLCAyPiBBbm5vdGF0aW9uczsKKworcHVibGljOgorICBDb2RlQ29tcGxldGlvbkJ1aWxkZXIoQ29kZUNvbXBsZXRpb25BbGxvY2F0b3IgJkFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvZGVDb21wbGV0aW9uVFVJbmZvICZDQ1RVSW5mbykKKyAgICAgIDogQWxsb2NhdG9yKEFsbG9jYXRvciksIENDVFVJbmZvKENDVFVJbmZvKSB7fQorCisgIENvZGVDb21wbGV0aW9uQnVpbGRlcihDb2RlQ29tcGxldGlvbkFsbG9jYXRvciAmQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUNvbXBsZXRpb25UVUluZm8gJkNDVFVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUHJpb3JpdHksIENYQXZhaWxhYmlsaXR5S2luZCBBdmFpbGFiaWxpdHkpCisgICAgICA6IEFsbG9jYXRvcihBbGxvY2F0b3IpLCBDQ1RVSW5mbyhDQ1RVSW5mbyksIFByaW9yaXR5KFByaW9yaXR5KSwKKyAgICAgICAgQXZhaWxhYmlsaXR5KEF2YWlsYWJpbGl0eSkge30KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBhbGxvY2F0b3IgaW50byB3aGljaCB0aGUgY29kZSBjb21wbGV0aW9uCisgIC8vLyBzdHJpbmdzIHNob3VsZCBiZSBhbGxvY2F0ZWQuCisgIENvZGVDb21wbGV0aW9uQWxsb2NhdG9yICZnZXRBbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBBbGxvY2F0b3I7IH0KKworICBDb2RlQ29tcGxldGlvblRVSW5mbyAmZ2V0Q29kZUNvbXBsZXRpb25UVUluZm8oKSBjb25zdCB7IHJldHVybiBDQ1RVSW5mbzsgfQorCisgIC8vLyBcYnJpZWYgVGFrZSB0aGUgcmVzdWx0aW5nIGNvbXBsZXRpb24gc3RyaW5nLgorICAvLy8KKyAgLy8vIFRoaXMgb3BlcmF0aW9uIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCBvbmNlLgorICBDb2RlQ29tcGxldGlvblN0cmluZyAqVGFrZVN0cmluZygpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IHR5cGVkLXRleHQgY2h1bmsuCisgIHZvaWQgQWRkVHlwZWRUZXh0Q2h1bmsoY29uc3QgY2hhciAqVGV4dCk7CisKKyAgLy8vIFxicmllZiBBZGQgYSBuZXcgdGV4dCBjaHVuay4KKyAgdm9pZCBBZGRUZXh0Q2h1bmsoY29uc3QgY2hhciAqVGV4dCk7CisKKyAgLy8vIFxicmllZiBBZGQgYSBuZXcgb3B0aW9uYWwgY2h1bmsuCisgIHZvaWQgQWRkT3B0aW9uYWxDaHVuayhDb2RlQ29tcGxldGlvblN0cmluZyAqT3B0aW9uYWwpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IHBsYWNlaG9sZGVyIGNodW5rLgorICB2b2lkIEFkZFBsYWNlaG9sZGVyQ2h1bmsoY29uc3QgY2hhciAqUGxhY2Vob2xkZXIpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IGluZm9ybWF0aXZlIGNodW5rLgorICB2b2lkIEFkZEluZm9ybWF0aXZlQ2h1bmsoY29uc3QgY2hhciAqVGV4dCk7CisKKyAgLy8vIFxicmllZiBBZGQgYSBuZXcgcmVzdWx0LXR5cGUgY2h1bmsuCisgIHZvaWQgQWRkUmVzdWx0VHlwZUNodW5rKGNvbnN0IGNoYXIgKlJlc3VsdFR5cGUpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IGN1cnJlbnQtcGFyYW1ldGVyIGNodW5rLgorICB2b2lkIEFkZEN1cnJlbnRQYXJhbWV0ZXJDaHVuayhjb25zdCBjaGFyICpDdXJyZW50UGFyYW1ldGVyKTsKKworICAvLy8gXGJyaWVmIEFkZCBhIG5ldyBjaHVuay4KKyAgdm9pZCBBZGRDaHVuayhDb2RlQ29tcGxldGlvblN0cmluZzo6Q2h1bmtLaW5kIENLLCBjb25zdCBjaGFyICpUZXh0ID0gIiIpOworCisgIHZvaWQgQWRkQW5ub3RhdGlvbihjb25zdCBjaGFyICpBKSB7IEFubm90YXRpb25zLnB1c2hfYmFjayhBKTsgfQorCisgIC8vLyBcYnJpZWYgQWRkIHRoZSBwYXJlbnQgY29udGV4dCBpbmZvcm1hdGlvbiB0byB0aGlzIGNvZGUgY29tcGxldGlvbi4KKyAgdm9pZCBhZGRQYXJlbnRDb250ZXh0KGNvbnN0IERlY2xDb250ZXh0ICpEQyk7CisKKyAgY29uc3QgY2hhciAqZ2V0QnJpZWZDb21tZW50KCkgY29uc3QgeyByZXR1cm4gQnJpZWZDb21tZW50OyB9CisgIHZvaWQgYWRkQnJpZWZDb21tZW50KFN0cmluZ1JlZiBDb21tZW50KTsKKyAgCisgIFN0cmluZ1JlZiBnZXRQYXJlbnROYW1lKCkgY29uc3QgeyByZXR1cm4gUGFyZW50TmFtZTsgfQorfTsKKworLy8vIFxicmllZiBDYXB0dXJlcyBhIHJlc3VsdCBvZiBjb2RlIGNvbXBsZXRpb24uCitjbGFzcyBDb2RlQ29tcGxldGlvblJlc3VsdCB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgRGVzY3JpYmVzIHRoZSBraW5kIG9mIHJlc3VsdCBnZW5lcmF0ZWQuCisgIGVudW0gUmVzdWx0S2luZCB7CisgICAgLy8vIFJlZmVycyB0byBhIGRlY2xhcmF0aW9uLgorICAgIFJLX0RlY2xhcmF0aW9uID0gMCwKKworICAgIC8vLyBSZWZlcnMgdG8gYSBrZXl3b3JkIG9yIHN5bWJvbC4KKyAgICBSS19LZXl3b3JkLAorCisgICAgLy8vIFJlZmVycyB0byBhIG1hY3JvLgorICAgIFJLX01hY3JvLAorCisgICAgLy8vIFJlZmVycyB0byBhIHByZWNvbXB1dGVkIHBhdHRlcm4uCisgICAgUktfUGF0dGVybgorICB9OworCisgIC8vLyBcYnJpZWYgV2hlbiBLaW5kID09IFJLX0RlY2xhcmF0aW9uIG9yIFJLX1BhdHRlcm4sIHRoZSBkZWNsYXJhdGlvbiB3ZSBhcmUKKyAgLy8vIHJlZmVycmluZyB0by4gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgZGVjbGFyYXRpb24gbWlnaHQgYmUgTlVMTC4KKyAgY29uc3QgTmFtZWREZWNsICpEZWNsYXJhdGlvbiA9IG51bGxwdHI7CisKKyAgdW5pb24geworICAgIC8vLyBcYnJpZWYgV2hlbiBLaW5kID09IFJLX0tleXdvcmQsIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBrZXl3b3JkCisgICAgLy8vIG9yIHN5bWJvbCdzIHNwZWxsaW5nLgorICAgIGNvbnN0IGNoYXIgKktleXdvcmQ7CisKKyAgICAvLy8gXGJyaWVmIFdoZW4gS2luZCA9PSBSS19QYXR0ZXJuLCB0aGUgY29kZS1jb21wbGV0aW9uIHN0cmluZyB0aGF0CisgICAgLy8vIGRlc2NyaWJlcyB0aGUgY29tcGxldGlvbiB0ZXh0IHRvIGluc2VydC4KKyAgICBDb2RlQ29tcGxldGlvblN0cmluZyAqUGF0dGVybjsKKworICAgIC8vLyBcYnJpZWYgV2hlbiBLaW5kID09IFJLX01hY3JvLCB0aGUgaWRlbnRpZmllciB0aGF0IHJlZmVycyB0byBhIG1hY3JvLgorICAgIGNvbnN0IElkZW50aWZpZXJJbmZvICpNYWNybzsKKyAgfTsKKworICAvLy8gXGJyaWVmIFRoZSBwcmlvcml0eSBvZiB0aGlzIHBhcnRpY3VsYXIgY29kZS1jb21wbGV0aW9uIHJlc3VsdC4KKyAgdW5zaWduZWQgUHJpb3JpdHk7CisKKyAgLy8vIFxicmllZiBTcGVjaWZpZXMgd2hpY2ggcGFyYW1ldGVyIChvZiBhIGZ1bmN0aW9uLCBPYmplY3RpdmUtQyBtZXRob2QsCisgIC8vLyBtYWNybywgZXRjLikgd2Ugc2hvdWxkIHN0YXJ0IHdpdGggd2hlbiBmb3JtYXR0aW5nIHRoZSByZXN1bHQuCisgIHVuc2lnbmVkIFN0YXJ0UGFyYW1ldGVyID0gMDsKKworICAvLy8gXGJyaWVmIFRoZSBraW5kIG9mIHJlc3VsdCBzdG9yZWQgaGVyZS4KKyAgUmVzdWx0S2luZCBLaW5kOworCisgIC8vLyBcYnJpZWYgVGhlIGN1cnNvciBraW5kIHRoYXQgZGVzY3JpYmVzIHRoaXMgcmVzdWx0LgorICBDWEN1cnNvcktpbmQgQ3Vyc29yS2luZDsKKworICAvLy8gXGJyaWVmIFRoZSBhdmFpbGFiaWxpdHkgb2YgdGhpcyByZXN1bHQuCisgIENYQXZhaWxhYmlsaXR5S2luZCBBdmFpbGFiaWxpdHkgPSBDWEF2YWlsYWJpbGl0eV9BdmFpbGFibGU7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgcmVzdWx0IGlzIGhpZGRlbiBieSBhbm90aGVyIG5hbWUuCisgIGJvb2wgSGlkZGVuIDogMTsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyByZXN1bHQgd2FzIGZvdW5kIHZpYSBsb29rdXAgaW50byBhIGJhc2UgY2xhc3MuCisgIGJvb2wgUXVhbGlmaWVySXNJbmZvcm1hdGl2ZSA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gaXMgdGhlIGJlZ2lubmluZyBvZiBhCisgIC8vLyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgYW5kLCB0aGVyZWZvcmUsIHNob3VsZCBiZSBmb2xsb3dlZCBieSAnOjonLgorICBib29sIFN0YXJ0c05lc3RlZE5hbWVTcGVjaWZpZXIgOiAxOworCisgIC8vLyBcYnJpZWYgV2hldGhlciBhbGwgcGFyYW1ldGVycyAob2YgYSBmdW5jdGlvbiwgT2JqZWN0aXZlLUMKKyAgLy8vIG1ldGhvZCwgZXRjLikgc2hvdWxkIGJlIGNvbnNpZGVyZWQgImluZm9ybWF0aXZlIi4KKyAgYm9vbCBBbGxQYXJhbWV0ZXJzQXJlSW5mb3JtYXRpdmUgOiAxOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB3ZSdyZSBjb21wbGV0aW5nIGEgZGVjbGFyYXRpb24gb2YgdGhlIGdpdmVuIGVudGl0eSwKKyAgLy8vIHJhdGhlciB0aGFuIGEgdXNlIG9mIHRoYXQgZW50aXR5LgorICBib29sIERlY2xhcmluZ0VudGl0eSA6IDE7CisKKyAgLy8vIFxicmllZiBJZiB0aGUgcmVzdWx0IHNob3VsZCBoYXZlIGEgbmVzdGVkLW5hbWUtc3BlY2lmaWVyLCB0aGlzIGlzIGl0LgorICAvLy8gV2hlbiBcYyBRdWFsaWZpZXJJc0luZm9ybWF0aXZlLCB0aGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIGlzCisgIC8vLyBpbmZvcm1hdGl2ZSByYXRoZXIgdGhhbiByZXF1aXJlZC4KKyAgTmVzdGVkTmFtZVNwZWNpZmllciAqUXVhbGlmaWVyID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIEJ1aWxkIGEgcmVzdWx0IHRoYXQgcmVmZXJzIHRvIGEgZGVjbGFyYXRpb24uCisgIENvZGVDb21wbGV0aW9uUmVzdWx0KGNvbnN0IE5hbWVkRGVjbCAqRGVjbGFyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyICpRdWFsaWZpZXIgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIFF1YWxpZmllcklzSW5mb3JtYXRpdmUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBY2Nlc3NpYmxlID0gdHJ1ZSkKKyAgICAgIDogRGVjbGFyYXRpb24oRGVjbGFyYXRpb24pLCBQcmlvcml0eShQcmlvcml0eSksIEtpbmQoUktfRGVjbGFyYXRpb24pLAorICAgICAgICBIaWRkZW4oZmFsc2UpLCBRdWFsaWZpZXJJc0luZm9ybWF0aXZlKFF1YWxpZmllcklzSW5mb3JtYXRpdmUpLAorICAgICAgICBTdGFydHNOZXN0ZWROYW1lU3BlY2lmaWVyKGZhbHNlKSwgQWxsUGFyYW1ldGVyc0FyZUluZm9ybWF0aXZlKGZhbHNlKSwKKyAgICAgICAgRGVjbGFyaW5nRW50aXR5KGZhbHNlKSwgUXVhbGlmaWVyKFF1YWxpZmllcikgeworICAgIGNvbXB1dGVDdXJzb3JLaW5kQW5kQXZhaWxhYmlsaXR5KEFjY2Vzc2libGUpOworICB9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhIHJlc3VsdCB0aGF0IHJlZmVycyB0byBhIGtleXdvcmQgb3Igc3ltYm9sLgorICBDb2RlQ29tcGxldGlvblJlc3VsdChjb25zdCBjaGFyICpLZXl3b3JkLCB1bnNpZ25lZCBQcmlvcml0eSA9IENDUF9LZXl3b3JkKQorICAgICAgOiBLZXl3b3JkKEtleXdvcmQpLCBQcmlvcml0eShQcmlvcml0eSksIEtpbmQoUktfS2V5d29yZCksCisgICAgICAgIEN1cnNvcktpbmQoQ1hDdXJzb3JfTm90SW1wbGVtZW50ZWQpLCBIaWRkZW4oZmFsc2UpLAorICAgICAgICBRdWFsaWZpZXJJc0luZm9ybWF0aXZlKGZhbHNlKSwgU3RhcnRzTmVzdGVkTmFtZVNwZWNpZmllcihmYWxzZSksCisgICAgICAgIEFsbFBhcmFtZXRlcnNBcmVJbmZvcm1hdGl2ZShmYWxzZSksIERlY2xhcmluZ0VudGl0eShmYWxzZSkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGEgcmVzdWx0IHRoYXQgcmVmZXJzIHRvIGEgbWFjcm8uCisgIENvZGVDb21wbGV0aW9uUmVzdWx0KGNvbnN0IElkZW50aWZpZXJJbmZvICpNYWNybywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUHJpb3JpdHkgPSBDQ1BfTWFjcm8pCisgICAgICA6IE1hY3JvKE1hY3JvKSwgUHJpb3JpdHkoUHJpb3JpdHkpLCBLaW5kKFJLX01hY3JvKSwKKyAgICAgICAgQ3Vyc29yS2luZChDWEN1cnNvcl9NYWNyb0RlZmluaXRpb24pLCBIaWRkZW4oZmFsc2UpLAorICAgICAgICBRdWFsaWZpZXJJc0luZm9ybWF0aXZlKGZhbHNlKSwgU3RhcnRzTmVzdGVkTmFtZVNwZWNpZmllcihmYWxzZSksCisgICAgICAgIEFsbFBhcmFtZXRlcnNBcmVJbmZvcm1hdGl2ZShmYWxzZSksIERlY2xhcmluZ0VudGl0eShmYWxzZSkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGEgcmVzdWx0IHRoYXQgcmVmZXJzIHRvIGEgcGF0dGVybi4KKyAgQ29kZUNvbXBsZXRpb25SZXN1bHQoQ29kZUNvbXBsZXRpb25TdHJpbmcgKlBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFByaW9yaXR5ID0gQ0NQX0NvZGVQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICBDWEN1cnNvcktpbmQgQ3Vyc29yS2luZCA9IENYQ3Vyc29yX05vdEltcGxlbWVudGVkLAorICAgICAgICAgICAgICAgICAgIENYQXZhaWxhYmlsaXR5S2luZCBBdmFpbGFiaWxpdHkgPSBDWEF2YWlsYWJpbGl0eV9BdmFpbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWVkRGVjbCAqRCA9IG51bGxwdHIpCisgICAgICA6IERlY2xhcmF0aW9uKEQpLCBQYXR0ZXJuKFBhdHRlcm4pLCBQcmlvcml0eShQcmlvcml0eSksIEtpbmQoUktfUGF0dGVybiksCisgICAgICAgIEN1cnNvcktpbmQoQ3Vyc29yS2luZCksIEF2YWlsYWJpbGl0eShBdmFpbGFiaWxpdHkpLCBIaWRkZW4oZmFsc2UpLAorICAgICAgICBRdWFsaWZpZXJJc0luZm9ybWF0aXZlKGZhbHNlKSwgU3RhcnRzTmVzdGVkTmFtZVNwZWNpZmllcihmYWxzZSksCisgICAgICAgIEFsbFBhcmFtZXRlcnNBcmVJbmZvcm1hdGl2ZShmYWxzZSksIERlY2xhcmluZ0VudGl0eShmYWxzZSkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGEgcmVzdWx0IHRoYXQgcmVmZXJzIHRvIGEgcGF0dGVybiB3aXRoIGFuIGFzc29jaWF0ZWQKKyAgLy8vIGRlY2xhcmF0aW9uLgorICBDb2RlQ29tcGxldGlvblJlc3VsdChDb2RlQ29tcGxldGlvblN0cmluZyAqUGF0dGVybiwgY29uc3QgTmFtZWREZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQcmlvcml0eSkKKyAgICAgIDogRGVjbGFyYXRpb24oRCksIFBhdHRlcm4oUGF0dGVybiksIFByaW9yaXR5KFByaW9yaXR5KSwgS2luZChSS19QYXR0ZXJuKSwKKyAgICAgICAgSGlkZGVuKGZhbHNlKSwgUXVhbGlmaWVySXNJbmZvcm1hdGl2ZShmYWxzZSksCisgICAgICAgIFN0YXJ0c05lc3RlZE5hbWVTcGVjaWZpZXIoZmFsc2UpLCBBbGxQYXJhbWV0ZXJzQXJlSW5mb3JtYXRpdmUoZmFsc2UpLAorICAgICAgICBEZWNsYXJpbmdFbnRpdHkoZmFsc2UpIHsKKyAgICBjb21wdXRlQ3Vyc29yS2luZEFuZEF2YWlsYWJpbGl0eSgpOworICB9ICAKKyAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGRlY2xhcmF0aW9uIHN0b3JlZCBpbiB0aGlzIHJlc3VsdC4KKyAgY29uc3QgTmFtZWREZWNsICpnZXREZWNsYXJhdGlvbigpIGNvbnN0IHsKKyAgICBhc3NlcnQoS2luZCA9PSBSS19EZWNsYXJhdGlvbiAmJiAiTm90IGEgZGVjbGFyYXRpb24gcmVzdWx0Iik7CisgICAgcmV0dXJuIERlY2xhcmF0aW9uOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUga2V5d29yZCBzdG9yZWQgaW4gdGhpcyByZXN1bHQuCisgIGNvbnN0IGNoYXIgKmdldEtleXdvcmQoKSBjb25zdCB7CisgICAgYXNzZXJ0KEtpbmQgPT0gUktfS2V5d29yZCAmJiAiTm90IGEga2V5d29yZCByZXN1bHQiKTsKKyAgICByZXR1cm4gS2V5d29yZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbmV3IGNvZGUtY29tcGxldGlvbiBzdHJpbmcgdGhhdCBkZXNjcmliZXMgaG93IHRvIGluc2VydAorICAvLy8gdGhpcyByZXN1bHQgaW50byBhIHByb2dyYW0uCisgIC8vLworICAvLy8gXHBhcmFtIFMgVGhlIHNlbWFudGljIGFuYWx5c2lzIHRoYXQgY3JlYXRlZCB0aGUgcmVzdWx0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBBbGxvY2F0b3IgVGhlIGFsbG9jYXRvciB0aGF0IHdpbGwgYmUgdXNlZCB0byBhbGxvY2F0ZSB0aGUKKyAgLy8vIHN0cmluZyBpdHNlbGYuCisgIENvZGVDb21wbGV0aW9uU3RyaW5nICpDcmVhdGVDb2RlQ29tcGxldGlvblN0cmluZyhTZW1hICZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlQ29tcGxldGlvbkNvbnRleHQgJkNDQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlQ29tcGxldGlvbkFsbG9jYXRvciAmQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVDb21wbGV0aW9uVFVJbmZvICZDQ1RVSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluY2x1ZGVCcmllZkNvbW1lbnRzKTsKKyAgQ29kZUNvbXBsZXRpb25TdHJpbmcgKkNyZWF0ZUNvZGVDb21wbGV0aW9uU3RyaW5nKEFTVENvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXByb2Nlc3NvciAmUFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvZGVDb21wbGV0aW9uQ29udGV4dCAmQ0NDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVDb21wbGV0aW9uQWxsb2NhdG9yICZBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUNvbXBsZXRpb25UVUluZm8gJkNDVFVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5jbHVkZUJyaWVmQ29tbWVudHMpOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBvcmRlciBhIHJlc3VsdC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgbmFtZSBuZWVkcyB0byBiZSBjb25zdHJ1Y3RlZCBhcyBhIHN0cmluZywgdGhhdCBzdHJpbmcgd2lsbCBiZQorICAvLy8gc2F2ZWQgaW50byBTYXZlZCBhbmQgdGhlIHJldHVybmVkIFN0cmluZ1JlZiB3aWxsIHJlZmVyIHRvIGl0LgorICBTdHJpbmdSZWYgZ2V0T3JkZXJlZE5hbWUoc3RkOjpzdHJpbmcgJlNhdmVkKSBjb25zdDsKKworcHJpdmF0ZToKKyAgdm9pZCBjb21wdXRlQ3Vyc29yS2luZEFuZEF2YWlsYWJpbGl0eShib29sIEFjY2Vzc2libGUgPSB0cnVlKTsKK307CisKK2Jvb2wgb3BlcmF0b3I8KGNvbnN0IENvZGVDb21wbGV0aW9uUmVzdWx0ICZYLCBjb25zdCBDb2RlQ29tcGxldGlvblJlc3VsdCAmWSk7CisKK2lubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBDb2RlQ29tcGxldGlvblJlc3VsdCAmWCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlQ29tcGxldGlvblJlc3VsdCAmWSkgeworICByZXR1cm4gWSA8IFg7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgQ29kZUNvbXBsZXRpb25SZXN1bHQgJlgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZUNvbXBsZXRpb25SZXN1bHQgJlkpIHsKKyAgcmV0dXJuICEoWSA8IFgpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IENvZGVDb21wbGV0aW9uUmVzdWx0ICZYLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlQ29tcGxldGlvblJlc3VsdCAmWSkgeworICByZXR1cm4gIShYIDwgWSk7Cit9CisKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvZGVDb21wbGV0aW9uU3RyaW5nICZDQ1MpOworCisvLy8gXGJyaWVmIEFic3RyYWN0IGludGVyZmFjZSBmb3IgYSBjb25zdW1lciBvZiBjb2RlLWNvbXBsZXRpb24KKy8vLyBpbmZvcm1hdGlvbi4KK2NsYXNzIENvZGVDb21wbGV0ZUNvbnN1bWVyIHsKK3Byb3RlY3RlZDoKKyAgY29uc3QgQ29kZUNvbXBsZXRlT3B0aW9ucyBDb2RlQ29tcGxldGVPcHRzOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgb3V0cHV0IGZvcm1hdCBmb3IgdGhlIGNvZGUtY29tcGxldGlvbiBjb25zdW1lciBpcworICAvLy8gYmluYXJ5LgorICBib29sIE91dHB1dElzQmluYXJ5OworCitwdWJsaWM6CisgIGNsYXNzIE92ZXJsb2FkQ2FuZGlkYXRlIHsKKyAgcHVibGljOgorICAgIC8vLyBcYnJpZWYgRGVzY3JpYmVzIHRoZSB0eXBlIG9mIG92ZXJsb2FkIGNhbmRpZGF0ZS4KKyAgICBlbnVtIENhbmRpZGF0ZUtpbmQgeworICAgICAgLy8vIFxicmllZiBUaGUgY2FuZGlkYXRlIGlzIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24uCisgICAgICBDS19GdW5jdGlvbiwKKworICAgICAgLy8vIFxicmllZiBUaGUgY2FuZGlkYXRlIGlzIGEgZnVuY3Rpb24gdGVtcGxhdGUuCisgICAgICBDS19GdW5jdGlvblRlbXBsYXRlLAorCisgICAgICAvLy8gXGJyaWVmIFRoZSAiY2FuZGlkYXRlIiBpcyBhY3R1YWxseSBhIHZhcmlhYmxlLCBleHByZXNzaW9uLCBvciBibG9jaworICAgICAgLy8vIGZvciB3aGljaCB3ZSBvbmx5IGhhdmUgYSBmdW5jdGlvbiBwcm90b3R5cGUuCisgICAgICBDS19GdW5jdGlvblR5cGUKKyAgICB9OworCisgIHByaXZhdGU6CisgICAgLy8vIFxicmllZiBUaGUga2luZCBvZiBvdmVybG9hZCBjYW5kaWRhdGUuCisgICAgQ2FuZGlkYXRlS2luZCBLaW5kOworCisgICAgdW5pb24geworICAgICAgLy8vIFxicmllZiBUaGUgZnVuY3Rpb24gb3ZlcmxvYWQgY2FuZGlkYXRlLCBhdmFpbGFibGUgd2hlbgorICAgICAgLy8vIEtpbmQgPT0gQ0tfRnVuY3Rpb24uCisgICAgICBGdW5jdGlvbkRlY2wgKkZ1bmN0aW9uOworCisgICAgICAvLy8gXGJyaWVmIFRoZSBmdW5jdGlvbiB0ZW1wbGF0ZSBvdmVybG9hZCBjYW5kaWRhdGUsIGF2YWlsYWJsZSB3aGVuCisgICAgICAvLy8gS2luZCA9PSBDS19GdW5jdGlvblRlbXBsYXRlLgorICAgICAgRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkZ1bmN0aW9uVGVtcGxhdGU7CisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIGZ1bmN0aW9uIHR5cGUgdGhhdCBkZXNjcmliZXMgdGhlIGVudGl0eSBiZWluZyBjYWxsZWQsCisgICAgICAvLy8gd2hlbiBLaW5kID09IENLX0Z1bmN0aW9uVHlwZS4KKyAgICAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqVHlwZTsKKyAgICB9OworCisgIHB1YmxpYzoKKyAgICBPdmVybG9hZENhbmRpZGF0ZShGdW5jdGlvbkRlY2wgKkZ1bmN0aW9uKQorICAgICAgICA6IEtpbmQoQ0tfRnVuY3Rpb24pLCBGdW5jdGlvbihGdW5jdGlvbikge30KKworICAgIE92ZXJsb2FkQ2FuZGlkYXRlKEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpGdW5jdGlvblRlbXBsYXRlRGVjbCkKKyAgICAgICAgOiBLaW5kKENLX0Z1bmN0aW9uVGVtcGxhdGUpLCBGdW5jdGlvblRlbXBsYXRlKEZ1bmN0aW9uVGVtcGxhdGVEZWNsKSB7fQorCisgICAgT3ZlcmxvYWRDYW5kaWRhdGUoY29uc3QgRnVuY3Rpb25UeXBlICpUeXBlKQorICAgICAgICA6IEtpbmQoQ0tfRnVuY3Rpb25UeXBlKSwgVHlwZShUeXBlKSB7fQorCisgICAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIGtpbmQgb2Ygb3ZlcmxvYWQgY2FuZGlkYXRlLgorICAgIENhbmRpZGF0ZUtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGZ1bmN0aW9uIG92ZXJsb2FkIGNhbmRpZGF0ZSBvciB0aGUgdGVtcGxhdGVkCisgICAgLy8vIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGZvciBhIGZ1bmN0aW9uIHRlbXBsYXRlLgorICAgIEZ1bmN0aW9uRGVjbCAqZ2V0RnVuY3Rpb24oKSBjb25zdDsKKworICAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGZ1bmN0aW9uIHRlbXBsYXRlIG92ZXJsb2FkIGNhbmRpZGF0ZS4KKyAgICBGdW5jdGlvblRlbXBsYXRlRGVjbCAqZ2V0RnVuY3Rpb25UZW1wbGF0ZSgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChnZXRLaW5kKCkgPT0gQ0tfRnVuY3Rpb25UZW1wbGF0ZSAmJiAiTm90IGEgZnVuY3Rpb24gdGVtcGxhdGUiKTsKKyAgICAgIHJldHVybiBGdW5jdGlvblRlbXBsYXRlOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGZ1bmN0aW9uIHR5cGUgb2YgdGhlIGVudGl0eSwgcmVnYXJkbGVzcyBvZiBob3cgdGhlCisgICAgLy8vIGZ1bmN0aW9uIGlzIHN0b3JlZC4KKyAgICBjb25zdCBGdW5jdGlvblR5cGUgKmdldEZ1bmN0aW9uVHlwZSgpIGNvbnN0OworCisgICAgLy8vIFxicmllZiBDcmVhdGUgYSBuZXcgY29kZS1jb21wbGV0aW9uIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgZnVuY3Rpb24KKyAgICAvLy8gc2lnbmF0dXJlIG9mIHRoaXMgb3ZlcmxvYWQgY2FuZGlkYXRlLgorICAgIENvZGVDb21wbGV0aW9uU3RyaW5nICpDcmVhdGVTaWduYXR1cmVTdHJpbmcodW5zaWduZWQgQ3VycmVudEFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWEgJlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVDb21wbGV0aW9uQWxsb2NhdG9yICZBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVDb21wbGV0aW9uVFVJbmZvICZDQ1RVSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlQnJpZWZDb21tZW50cykgY29uc3Q7CisgIH07CisKKyAgQ29kZUNvbXBsZXRlQ29uc3VtZXIoY29uc3QgQ29kZUNvbXBsZXRlT3B0aW9ucyAmQ29kZUNvbXBsZXRlT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPdXRwdXRJc0JpbmFyeSkKKyAgICAgIDogQ29kZUNvbXBsZXRlT3B0cyhDb2RlQ29tcGxldGVPcHRzKSwgT3V0cHV0SXNCaW5hcnkoT3V0cHV0SXNCaW5hcnkpIHt9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoZSBjb2RlLWNvbXBsZXRpb24gY29uc3VtZXIgd2FudHMgdG8gc2VlIG1hY3Jvcy4KKyAgYm9vbCBpbmNsdWRlTWFjcm9zKCkgY29uc3QgeworICAgIHJldHVybiBDb2RlQ29tcGxldGVPcHRzLkluY2x1ZGVNYWNyb3M7CisgIH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhlIGNvZGUtY29tcGxldGlvbiBjb25zdW1lciB3YW50cyB0byBzZWUgY29kZSBwYXR0ZXJucy4KKyAgYm9vbCBpbmNsdWRlQ29kZVBhdHRlcm5zKCkgY29uc3QgeworICAgIHJldHVybiBDb2RlQ29tcGxldGVPcHRzLkluY2x1ZGVDb2RlUGF0dGVybnM7CisgIH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdG8gaW5jbHVkZSBnbG9iYWwgKHRvcC1sZXZlbCkgZGVjbGFyYXRpb24gcmVzdWx0cy4KKyAgYm9vbCBpbmNsdWRlR2xvYmFscygpIGNvbnN0IHsgcmV0dXJuIENvZGVDb21wbGV0ZU9wdHMuSW5jbHVkZUdsb2JhbHM7IH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdG8gaW5jbHVkZSBkZWNsYXJhdGlvbnMgaW4gbmFtZXNwYWNlIGNvbnRleHRzIChpbmNsdWRpbmcKKyAgLy8vIHRoZSBnbG9iYWwgbmFtZXNwYWNlKS4gSWYgdGhpcyBpcyBmYWxzZSwgYGluY2x1ZGVHbG9iYWxzKClgIHdpbGwgYmUKKyAgLy8vIGlnbm9yZWQuCisgIGJvb2wgaW5jbHVkZU5hbWVzcGFjZUxldmVsRGVjbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIENvZGVDb21wbGV0ZU9wdHMuSW5jbHVkZU5hbWVzcGFjZUxldmVsRGVjbHM7CisgIH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdG8gaW5jbHVkZSBicmllZiBkb2N1bWVudGF0aW9uIGNvbW1lbnRzIHdpdGhpbiB0aGUgc2V0IG9mCisgIC8vLyBjb2RlIGNvbXBsZXRpb25zIHJldHVybmVkLgorICBib29sIGluY2x1ZGVCcmllZkNvbW1lbnRzKCkgY29uc3QgeworICAgIHJldHVybiBDb2RlQ29tcGxldGVPcHRzLkluY2x1ZGVCcmllZkNvbW1lbnRzOworICB9CisKKyAgLy8vIFxicmllZiBIaW50IHdoZXRoZXIgdG8gbG9hZCBkYXRhIGZyb20gdGhlIGV4dGVybmFsIEFTVCBpbiBvcmRlciB0byBwcm92aWRlCisgIC8vLyBmdWxsIHJlc3VsdHMuIElmIGZhbHNlLCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgcHJlYW1ibGUgbWF5IGJlIG9taXR0ZWQuCisgIGJvb2wgbG9hZEV4dGVybmFsKCkgY29uc3QgeworICAgIHJldHVybiBDb2RlQ29tcGxldGVPcHRzLkxvYWRFeHRlcm5hbDsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG91dHB1dCBvZiB0aGlzIGNvbnN1bWVyIGlzIGJpbmFyeS4KKyAgYm9vbCBpc091dHB1dEJpbmFyeSgpIGNvbnN0IHsgcmV0dXJuIE91dHB1dElzQmluYXJ5OyB9CisKKyAgLy8vIFxicmllZiBEZXJlZ2lzdGVycyBhbmQgZGVzdHJveXMgdGhpcyBjb2RlLWNvbXBsZXRpb24gY29uc3VtZXIuCisgIHZpcnR1YWwgfkNvZGVDb21wbGV0ZUNvbnN1bWVyKCk7CisKKyAgLy8vIFxuYW1lIENvZGUtY29tcGxldGlvbiBmaWx0ZXJpbmcKKyAgLy8vIFxicmllZiBDaGVjayBpZiB0aGUgcmVzdWx0IHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQuCisgIHZpcnR1YWwgYm9vbCBpc1Jlc3VsdEZpbHRlcmVkT3V0KFN0cmluZ1JlZiBGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVDb21wbGV0aW9uUmVzdWx0IFJlc3VsdHMpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gXG5hbWUgQ29kZS1jb21wbGV0aW9uIGNhbGxiYWNrcworICAvL0B7CisgIC8vLyBcYnJpZWYgUHJvY2VzcyB0aGUgZmluYWxpemVkIGNvZGUtY29tcGxldGlvbiByZXN1bHRzLgorICB2aXJ0dWFsIHZvaWQgUHJvY2Vzc0NvZGVDb21wbGV0ZVJlc3VsdHMoU2VtYSAmUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVDb21wbGV0aW9uQ29udGV4dCBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUNvbXBsZXRpb25SZXN1bHQgKlJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1SZXN1bHRzKSB7fQorCisgIC8vLyBccGFyYW0gUyB0aGUgc2VtYW50aWMtYW5hbHl6ZXIgb2JqZWN0IGZvciB3aGljaCBjb2RlLWNvbXBsZXRpb24gaXMgYmVpbmcKKyAgLy8vIGRvbmUuCisgIC8vLworICAvLy8gXHBhcmFtIEN1cnJlbnRBcmcgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGFyZ3VtZW50LgorICAvLy8KKyAgLy8vIFxwYXJhbSBDYW5kaWRhdGVzIGFuIGFycmF5IG9mIG92ZXJsb2FkIGNhbmRpZGF0ZXMuCisgIC8vLworICAvLy8gXHBhcmFtIE51bUNhbmRpZGF0ZXMgdGhlIG51bWJlciBvZiBvdmVybG9hZCBjYW5kaWRhdGVzCisgIHZpcnR1YWwgdm9pZCBQcm9jZXNzT3ZlcmxvYWRDYW5kaWRhdGVzKFNlbWEgJlMsIHVuc2lnbmVkIEN1cnJlbnRBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJsb2FkQ2FuZGlkYXRlICpDYW5kaWRhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DYW5kaWRhdGVzKSB7fQorICAvL0B9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgYWxsb2NhdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGFsbG9jYXRlCisgIC8vLyBjb2RlIGNvbXBsZXRpb24gc3RyaW5ncy4KKyAgdmlydHVhbCBDb2RlQ29tcGxldGlvbkFsbG9jYXRvciAmZ2V0QWxsb2NhdG9yKCkgPSAwOworCisgIHZpcnR1YWwgQ29kZUNvbXBsZXRpb25UVUluZm8gJmdldENvZGVDb21wbGV0aW9uVFVJbmZvKCkgPSAwOworfTsKKworLy8vIFxicmllZiBBIHNpbXBsZSBjb2RlLWNvbXBsZXRpb24gY29uc3VtZXIgdGhhdCBwcmludHMgdGhlIHJlc3VsdHMgaXQKKy8vLyByZWNlaXZlcyBpbiBhIHNpbXBsZSBmb3JtYXQuCitjbGFzcyBQcmludGluZ0NvZGVDb21wbGV0ZUNvbnN1bWVyIDogcHVibGljIENvZGVDb21wbGV0ZUNvbnN1bWVyIHsKKyAgLy8vIFxicmllZiBUaGUgcmF3IG91dHB1dCBzdHJlYW0uCisgIHJhd19vc3RyZWFtICZPUzsKKworICBDb2RlQ29tcGxldGlvblRVSW5mbyBDQ1RVSW5mbzsKKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyBwcmludGluZyBjb2RlLWNvbXBsZXRpb24gY29uc3VtZXIgdGhhdCBwcmludHMgaXRzCisgIC8vLyByZXN1bHRzIHRvIHRoZSBnaXZlbiByYXcgb3V0cHV0IHN0cmVhbS4KKyAgUHJpbnRpbmdDb2RlQ29tcGxldGVDb25zdW1lcihjb25zdCBDb2RlQ29tcGxldGVPcHRpb25zICZDb2RlQ29tcGxldGVPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUykKKyAgICAgIDogQ29kZUNvbXBsZXRlQ29uc3VtZXIoQ29kZUNvbXBsZXRlT3B0cywgZmFsc2UpLCBPUyhPUyksCisgICAgICAgIENDVFVJbmZvKHN0ZDo6bWFrZV9zaGFyZWQ8R2xvYmFsQ29kZUNvbXBsZXRpb25BbGxvY2F0b3I+KCkpIHt9CisKKyAgLy8vIFxicmllZiBQcmludHMgdGhlIGZpbmFsaXplZCBjb2RlLWNvbXBsZXRpb24gcmVzdWx0cy4KKyAgdm9pZCBQcm9jZXNzQ29kZUNvbXBsZXRlUmVzdWx0cyhTZW1hICZTLCBDb2RlQ29tcGxldGlvbkNvbnRleHQgQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlQ29tcGxldGlvblJlc3VsdCAqUmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1SZXN1bHRzKSBvdmVycmlkZTsKKworICB2b2lkIFByb2Nlc3NPdmVybG9hZENhbmRpZGF0ZXMoU2VtYSAmUywgdW5zaWduZWQgQ3VycmVudEFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJsb2FkQ2FuZGlkYXRlICpDYW5kaWRhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2FuZGlkYXRlcykgb3ZlcnJpZGU7CisKKyAgYm9vbCBpc1Jlc3VsdEZpbHRlcmVkT3V0KFN0cmluZ1JlZiBGaWx0ZXIsIENvZGVDb21wbGV0aW9uUmVzdWx0IFJlc3VsdHMpIG92ZXJyaWRlOworCisgIENvZGVDb21wbGV0aW9uQWxsb2NhdG9yICZnZXRBbGxvY2F0b3IoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIENDVFVJbmZvLmdldEFsbG9jYXRvcigpOworICB9CisKKyAgQ29kZUNvbXBsZXRpb25UVUluZm8gJmdldENvZGVDb21wbGV0aW9uVFVJbmZvKCkgb3ZlcnJpZGUgeyByZXR1cm4gQ0NUVUluZm87IH0KK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1NFTUFfQ09ERUNPTVBMRVRFQ09OU1VNRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9Db2RlQ29tcGxldGVPcHRpb25zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0NvZGVDb21wbGV0ZU9wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGQ0NzMyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9Db2RlQ29tcGxldGVPcHRpb25zLmgKQEAgLTAsMCArMSw1MSBAQAorLy89PT0tLS0tIENvZGVDb21wbGV0ZU9wdGlvbnMuaCAtIENvZGUgQ29tcGxldGlvbiBPcHRpb25zIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NFTUFfQ09ERUNPTVBMRVRFT1BUSU9OU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfU0VNQV9DT0RFQ09NUExFVEVPUFRJT05TX0gKKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIE9wdGlvbnMgY29udHJvbGxpbmcgdGhlIGJlaGF2aW9yIG9mIGNvZGUgY29tcGxldGlvbi4KK2NsYXNzIENvZGVDb21wbGV0ZU9wdGlvbnMgeworcHVibGljOgorICAvLy8gU2hvdyBtYWNyb3MgaW4gY29kZSBjb21wbGV0aW9uIHJlc3VsdHMuCisgIHVuc2lnbmVkIEluY2x1ZGVNYWNyb3MgOiAxOworCisgIC8vLyBTaG93IGNvZGUgcGF0dGVybnMgaW4gY29kZSBjb21wbGV0aW9uIHJlc3VsdHMuCisgIHVuc2lnbmVkIEluY2x1ZGVDb2RlUGF0dGVybnMgOiAxOworCisgIC8vLyBTaG93IHRvcC1sZXZlbCBkZWNscyBpbiBjb2RlIGNvbXBsZXRpb24gcmVzdWx0cy4KKyAgdW5zaWduZWQgSW5jbHVkZUdsb2JhbHMgOiAxOworCisgIC8vLyBTaG93IGRlY2xzIGluIG5hbWVzcGFjZSAoaW5jbHVkaW5nIHRoZSBnbG9iYWwgbmFtZXNwYWNlKSBpbiBjb2RlCisgIC8vLyBjb21wbGV0aW9uIHJlc3VsdHMuIElmIHRoaXMgaXMgMCwgYEluY2x1ZGVHbG9iYWxzYCB3aWxsIGJlIGlnbm9yZWQuCisgIC8vLworICAvLy8gQ3VycmVudGx5LCB0aGlzIG9ubHkgd29ya3Mgd2hlbiBjb21wbGV0aW5nIHF1YWxpZmllZCBJRHMgKGkuZS4KKyAgLy8vIGBTZW1hOjpDb2RlQ29tcGxldGVRdWFsaWZpZWRJZGApLgorICAvLy8gRklYTUU6IGNvbnNpZGVyIHN1cHBvcnRpbmcgbW9yZSBjb21wbGV0aW9uIGNhc2VzIHdpdGggdGhpcyBvcHRpb24uCisgIHVuc2lnbmVkIEluY2x1ZGVOYW1lc3BhY2VMZXZlbERlY2xzIDogMTsKKworICAvLy8gU2hvdyBicmllZiBkb2N1bWVudGF0aW9uIGNvbW1lbnRzIGluIGNvZGUgY29tcGxldGlvbiByZXN1bHRzLgorICB1bnNpZ25lZCBJbmNsdWRlQnJpZWZDb21tZW50cyA6IDE7CisKKyAgLy8vIEhpbnQgd2hldGhlciB0byBsb2FkIGRhdGEgZnJvbSB0aGUgZXh0ZXJuYWwgQVNUIHRvIHByb3ZpZGUgZnVsbCByZXN1bHRzLgorICAvLy8gSWYgZmFsc2UsIG5hbWVzcGFjZS1sZXZlbCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgcHJlYW1ibGUgbWF5IGJlIG9taXR0ZWQuCisgIHVuc2lnbmVkIExvYWRFeHRlcm5hbCA6IDE7CisKKyAgQ29kZUNvbXBsZXRlT3B0aW9ucygpCisgICAgICA6IEluY2x1ZGVNYWNyb3MoMCksIEluY2x1ZGVDb2RlUGF0dGVybnMoMCksIEluY2x1ZGVHbG9iYWxzKDEpLAorICAgICAgICBJbmNsdWRlTmFtZXNwYWNlTGV2ZWxEZWNscygxKSwgSW5jbHVkZUJyaWVmQ29tbWVudHMoMCksCisgICAgICAgIExvYWRFeHRlcm5hbCgxKSB7fQorfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvRGVjbFNwZWMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvRGVjbFNwZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWIxMTZmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9EZWNsU3BlYy5oCkBAIC0wLDAgKzEsMjU3NCBAQAorLy89PT0tLS0gRGVjbFNwZWMuaCAtIFBhcnNlZCBkZWNsYXJhdGlvbiBzcGVjaWZpZXJzIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBjbGFzc2VzIHVzZWQgdG8gc3RvcmUgcGFyc2VkIGluZm9ybWF0aW9uIGFib3V0CisvLy8gZGVjbGFyYXRpb24tc3BlY2lmaWVycyBhbmQgZGVjbGFyYXRvcnMuCisvLy8KKy8vLyBcdmVyYmF0aW0KKy8vLyAgIHN0YXRpYyBjb25zdCBpbnQgdm9sYXRpbGUgeCwgKnksICooKigqeilbMTBdKShjb25zdCB2b2lkICp4KTsKKy8vLyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLSAgLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vICAgICBkZWNsYXJhdGlvbi1zcGVjaWZpZXJzICBcICB8ICAgLworLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0b3JzCisvLy8gXGVuZHZlcmJhdGltCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TRU1BX0RFQ0xTUEVDX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TRU1BX0RFQ0xTUEVDX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9OZXN0ZWROYW1lU3BlY2lmaWVyLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRXhjZXB0aW9uU3BlY2lmaWNhdGlvblR5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MYW1iZGEuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9PcGVyYXRvcktpbmRzLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU3BlY2lmaWVycy5oIgorI2luY2x1ZGUgImNsYW5nL0xleC9Ub2tlbi5oIgorI2luY2x1ZGUgImNsYW5nL1NlbWEvQXR0cmlidXRlTGlzdC5oIgorI2luY2x1ZGUgImNsYW5nL1NlbWEvT3duZXJzaGlwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworICBjbGFzcyBBU1RDb250ZXh0OworICBjbGFzcyBDWFhSZWNvcmREZWNsOworICBjbGFzcyBUeXBlTG9jOworICBjbGFzcyBMYW5nT3B0aW9uczsKKyAgY2xhc3MgSWRlbnRpZmllckluZm87CisgIGNsYXNzIE5hbWVzcGFjZUFsaWFzRGVjbDsKKyAgY2xhc3MgTmFtZXNwYWNlRGVjbDsKKyAgY2xhc3MgT2JqQ0RlY2xTcGVjOworICBjbGFzcyBTZW1hOworICBjbGFzcyBEZWNsYXJhdG9yOworICBzdHJ1Y3QgVGVtcGxhdGVJZEFubm90YXRpb247CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIEMrKyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgb3IgYSBnbG9iYWwgc2NvcGUgc3BlY2lmaWVyLgorLy8vCisvLy8gVGhlc2UgY2FuIGJlIGluIDMgc3RhdGVzOgorLy8vICAgMSkgTm90IHByZXNlbnQsIGlkZW50aWZpZWQgYnkgaXNFbXB0eSgpCisvLy8gICAyKSBQcmVzZW50LCBpZGVudGlmaWVkIGJ5IGlzTm90RW1wdHkoKQorLy8vICAgICAgMi5hKSBWYWxpZCwgaWRlbnRpZmllZCBieSBpc1ZhbGlkKCkKKy8vLyAgICAgIDIuYikgSW52YWxpZCwgaWRlbnRpZmllZCBieSBpc0ludmFsaWQoKS4KKy8vLworLy8vIGlzU2V0KCkgaXMgZGVwcmVjYXRlZCBiZWNhdXNlIGl0IG1vc3RseSBjb3JyZXNwb25kZWQgdG8gInZhbGlkIiBidXQgd2FzCisvLy8gb2Z0ZW4gdXNlZCBhcyBpZiBpdCBtZWFudCAicHJlc2VudCIuCisvLy8KKy8vLyBUaGUgYWN0dWFsIHNjb3BlIGlzIGRlc2NyaWJlZCBieSBnZXRTY29wZVJlcCgpLgorY2xhc3MgQ1hYU2NvcGVTcGVjIHsKKyAgU291cmNlUmFuZ2UgUmFuZ2U7ICAKKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvY0J1aWxkZXIgQnVpbGRlcjsKKworcHVibGljOgorICBTb3VyY2VSYW5nZSBnZXRSYW5nZSgpIGNvbnN0IHsgcmV0dXJuIFJhbmdlOyB9CisgIHZvaWQgc2V0UmFuZ2UoU291cmNlUmFuZ2UgUikgeyBSYW5nZSA9IFI7IH0KKyAgdm9pZCBzZXRCZWdpbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgUmFuZ2Uuc2V0QmVnaW4oTG9jKTsgfQorICB2b2lkIHNldEVuZExvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgUmFuZ2Uuc2V0RW5kKExvYyk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0QmVnaW5Mb2MoKSBjb25zdCB7IHJldHVybiBSYW5nZS5nZXRCZWdpbigpOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldEVuZExvYygpIGNvbnN0IHsgcmV0dXJuIFJhbmdlLmdldEVuZCgpOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllci4KKyAgTmVzdGVkTmFtZVNwZWNpZmllciAqZ2V0U2NvcGVSZXAoKSBjb25zdCB7IAorICAgIHJldHVybiBCdWlsZGVyLmdldFJlcHJlc2VudGF0aW9uKCk7IAorICB9CisKKyAgLy8vIFxicmllZiBFeHRlbmQgdGhlIGN1cnJlbnQgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIGJ5IGFub3RoZXIKKyAgLy8vIG5lc3RlZC1uYW1lLXNwZWNpZmllciBjb21wb25lbnQgb2YgdGhlIGZvcm0gJ3R5cGU6OicuCisgIC8vLworICAvLy8gXHBhcmFtIENvbnRleHQgVGhlIEFTVCBjb250ZXh0IGluIHdoaWNoIHRoaXMgbmVzdGVkLW5hbWUtc3BlY2lmaWVyCisgIC8vLyByZXNpZGVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUZW1wbGF0ZUtXTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgJ3RlbXBsYXRlJyBrZXl3b3JkLCBpZiBwcmVzZW50LgorICAvLy8KKyAgLy8vIFxwYXJhbSBUTCBUaGUgVHlwZUxvYyB0aGF0IGRlc2NyaWJlcyB0aGUgdHlwZSBwcmVjZWRpbmcgdGhlICc6OicuCisgIC8vLworICAvLy8gXHBhcmFtIENvbG9uQ29sb25Mb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSB0cmFpbGluZyAnOjonLgorICB2b2lkIEV4dGVuZChBU1RDb250ZXh0ICZDb250ZXh0LCBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUtXTG9jLCBUeXBlTG9jIFRMLAorICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkNvbG9uTG9jKTsKKworICAvLy8gXGJyaWVmIEV4dGVuZCB0aGUgY3VycmVudCBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgYnkgYW5vdGhlciAKKyAgLy8vIG5lc3RlZC1uYW1lLXNwZWNpZmllciBjb21wb25lbnQgb2YgdGhlIGZvcm0gJ2lkZW50aWZpZXI6OicuCisgIC8vLworICAvLy8gXHBhcmFtIENvbnRleHQgVGhlIEFTVCBjb250ZXh0IGluIHdoaWNoIHRoaXMgbmVzdGVkLW5hbWUtc3BlY2lmaWVyCisgIC8vLyByZXNpZGVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJZGVudGlmaWVyTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgaWRlbnRpZmllci4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29sb25Db2xvbkxvYyBUaGUgbG9jYXRpb24gb2YgdGhlIHRyYWlsaW5nICc6OicuCisgIHZvaWQgRXh0ZW5kKEFTVENvbnRleHQgJkNvbnRleHQsIElkZW50aWZpZXJJbmZvICpJZGVudGlmaWVyLAorICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJZGVudGlmaWVyTG9jLCBTb3VyY2VMb2NhdGlvbiBDb2xvbkNvbG9uTG9jKTsKKworICAvLy8gXGJyaWVmIEV4dGVuZCB0aGUgY3VycmVudCBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgYnkgYW5vdGhlciAKKyAgLy8vIG5lc3RlZC1uYW1lLXNwZWNpZmllciBjb21wb25lbnQgb2YgdGhlIGZvcm0gJ25hbWVzcGFjZTo6Jy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29udGV4dCBUaGUgQVNUIGNvbnRleHQgaW4gd2hpY2ggdGhpcyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIKKyAgLy8vIHJlc2lkZXMuCisgIC8vLworICAvLy8gXHBhcmFtIE5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOYW1lc3BhY2VMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBuYW1lc3BhY2UgbmFtZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29sb25Db2xvbkxvYyBUaGUgbG9jYXRpb24gb2YgdGhlIHRyYWlsaW5nICc6OicuCisgIHZvaWQgRXh0ZW5kKEFTVENvbnRleHQgJkNvbnRleHQsIE5hbWVzcGFjZURlY2wgKk5hbWVzcGFjZSwKKyAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTmFtZXNwYWNlTG9jLCBTb3VyY2VMb2NhdGlvbiBDb2xvbkNvbG9uTG9jKTsKKworICAvLy8gXGJyaWVmIEV4dGVuZCB0aGUgY3VycmVudCBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgYnkgYW5vdGhlciAKKyAgLy8vIG5lc3RlZC1uYW1lLXNwZWNpZmllciBjb21wb25lbnQgb2YgdGhlIGZvcm0gJ25hbWVzcGFjZS1hbGlhczo6Jy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29udGV4dCBUaGUgQVNUIGNvbnRleHQgaW4gd2hpY2ggdGhpcyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIKKyAgLy8vIHJlc2lkZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEFsaWFzIFRoZSBuYW1lc3BhY2UgYWxpYXMuCisgIC8vLworICAvLy8gXHBhcmFtIEFsaWFzTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgbmFtZXNwYWNlIGFsaWFzIAorICAvLy8gbmFtZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29sb25Db2xvbkxvYyBUaGUgbG9jYXRpb24gb2YgdGhlIHRyYWlsaW5nICc6OicuCisgIHZvaWQgRXh0ZW5kKEFTVENvbnRleHQgJkNvbnRleHQsIE5hbWVzcGFjZUFsaWFzRGVjbCAqQWxpYXMsCisgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEFsaWFzTG9jLCBTb3VyY2VMb2NhdGlvbiBDb2xvbkNvbG9uTG9jKTsKKworICAvLy8gXGJyaWVmIFR1cm4gdGhpcyAoZW1wdHkpIG5lc3RlZC1uYW1lLXNwZWNpZmllciBpbnRvIHRoZSBnbG9iYWwKKyAgLy8vIG5lc3RlZC1uYW1lLXNwZWNpZmllciAnOjonLgorICB2b2lkIE1ha2VHbG9iYWwoQVNUQ29udGV4dCAmQ29udGV4dCwgU291cmNlTG9jYXRpb24gQ29sb25Db2xvbkxvYyk7CisgIAorICAvLy8gXGJyaWVmIFR1cm5zIHRoaXMgKGVtcHR5KSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgaW50byAnX19zdXBlcicKKyAgLy8vIG5lc3RlZC1uYW1lLXNwZWNpZmllci4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29udGV4dCBUaGUgQVNUIGNvbnRleHQgaW4gd2hpY2ggdGhpcyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIKKyAgLy8vIHJlc2lkZXMuCisgIC8vLworICAvLy8gXHBhcmFtIFJEIFRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgY2xhc3MgaW4gd2hpY2ggbmVzdGVkLW5hbWUtc3BlY2lmaWVyCisgIC8vLyBhcHBlYXJlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3VwZXJMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSAnX19zdXBlcicga2V5d29yZC4KKyAgLy8vIG5hbWUuCisgIC8vLworICAvLy8gXHBhcmFtIENvbG9uQ29sb25Mb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSB0cmFpbGluZyAnOjonLgorICB2b2lkIE1ha2VTdXBlcihBU1RDb250ZXh0ICZDb250ZXh0LCBDWFhSZWNvcmREZWNsICpSRCwKKyAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3VwZXJMb2MsIFNvdXJjZUxvY2F0aW9uIENvbG9uQ29sb25Mb2MpOworCisgIC8vLyBcYnJpZWYgTWFrZSBhIG5ldyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgZnJvbSBpbmNvbXBsZXRlIHNvdXJjZS1sb2NhdGlvbgorICAvLy8gaW5mb3JtYXRpb24uCisgIC8vLworICAvLy8gRklYTUU6IFRoaXMgcm91dGluZSBzaG91bGQgYmUgdXNlZCB2ZXJ5LCB2ZXJ5IHJhcmVseSwgaW4gY2FzZXMgd2hlcmUgd2UKKyAgLy8vIG5lZWQgdG8gc3ludGhlc2l6ZSBhIG5lc3RlZC1uYW1lLXNwZWNpZmllci4gTW9zdCBjb2RlIHNob3VsZCBpbnN0ZWFkIHVzZQorICAvLy8gXGMgQWRvcHQoKSB3aXRoIGEgcHJvcGVyIFxjIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MuCisgIHZvaWQgTWFrZVRyaXZpYWwoQVNUQ29udGV4dCAmQ29udGV4dCwgTmVzdGVkTmFtZVNwZWNpZmllciAqUXVhbGlmaWVyLCAKKyAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSKTsKKyAgCisgIC8vLyBcYnJpZWYgQWRvcHQgYW4gZXhpc3RpbmcgbmVzdGVkLW5hbWUtc3BlY2lmaWVyICh3aXRoIHNvdXJjZS1yYW5nZSAKKyAgLy8vIGluZm9ybWF0aW9uKS4KKyAgdm9pZCBBZG9wdChOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIE90aGVyKTsKKyAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgd2l0aCBsb2NhdGlvbiBpbmZvcm1hdGlvbiwgY29waWVkCisgIC8vLyBpbnRvIHRoZSBnaXZlbiBBU1QgY29udGV4dC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29udGV4dCBUaGUgY29udGV4dCBpbnRvIHdoaWNoIHRoaXMgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHdpbGwgYmUKKyAgLy8vIGNvcGllZC4KKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBnZXRXaXRoTG9jSW5Db250ZXh0KEFTVENvbnRleHQgJkNvbnRleHQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBuYW1lIGluIHRoZSBsYXN0IHF1YWxpZmllcgorICAvLy8gaW4gdGhpcyBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsIHRoZSBsb2NhdGlvbiBvZiBcYyBiYXIKKyAgLy8vIGluCisgIC8vLyBcdmVyYmF0aW0KKyAgLy8vICAgXDo6Zm9vOjpiYXI8MD46OgorICAvLy8gICAgICAgICAgIF5+fgorICAvLy8gXGVuZHZlcmJhdGltCisgIFNvdXJjZUxvY2F0aW9uIGdldExhc3RRdWFsaWZpZXJOYW1lTG9jKCkgY29uc3Q7CisKKyAgLy8vIE5vIHNjb3BlIHNwZWNpZmllci4KKyAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIVJhbmdlLmlzVmFsaWQoKTsgfQorICAvLy8gQSBzY29wZSBzcGVjaWZpZXIgaXMgcHJlc2VudCwgYnV0IG1heSBiZSB2YWxpZCBvciBpbnZhbGlkLgorICBib29sIGlzTm90RW1wdHkoKSBjb25zdCB7IHJldHVybiAhaXNFbXB0eSgpOyB9CisKKyAgLy8vIEFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBwYXJzaW5nIG9mIHRoZSBzY29wZSBzcGVjaWZpZXIuCisgIGJvb2wgaXNJbnZhbGlkKCkgY29uc3QgeyByZXR1cm4gaXNOb3RFbXB0eSgpICYmIGdldFNjb3BlUmVwKCkgPT0gbnVsbHB0cjsgfQorICAvLy8gQSBzY29wZSBzcGVjaWZpZXIgaXMgcHJlc2VudCwgYW5kIGl0IHJlZmVycyB0byBhIHJlYWwgc2NvcGUuCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIGlzTm90RW1wdHkoKSAmJiBnZXRTY29wZVJlcCgpICE9IG51bGxwdHI7IH0KKworICAvLy8gXGJyaWVmIEluZGljYXRlIHRoYXQgdGhpcyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgaXMgaW52YWxpZC4KKyAgdm9pZCBTZXRJbnZhbGlkKFNvdXJjZVJhbmdlIFIpIHsgCisgICAgYXNzZXJ0KFIuaXNWYWxpZCgpICYmICJNdXN0IGhhdmUgYSB2YWxpZCBzb3VyY2UgcmFuZ2UiKTsKKyAgICBpZiAoUmFuZ2UuZ2V0QmVnaW4oKS5pc0ludmFsaWQoKSkKKyAgICAgIFJhbmdlLnNldEJlZ2luKFIuZ2V0QmVnaW4oKSk7CisgICAgUmFuZ2Uuc2V0RW5kKFIuZ2V0RW5kKCkpOworICAgIEJ1aWxkZXIuQ2xlYXIoKTsKKyAgfQorICAKKyAgLy8vIERlcHJlY2F0ZWQuICBTb21lIGNhbGwgc2l0ZXMgaW50ZW5kIGlzTm90RW1wdHkoKSB3aGlsZSBvdGhlcnMgaW50ZW5kCisgIC8vLyBpc1ZhbGlkKCkuCisgIGJvb2wgaXNTZXQoKSBjb25zdCB7IHJldHVybiBnZXRTY29wZVJlcCgpICE9IG51bGxwdHI7IH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIFJhbmdlID0gU291cmNlUmFuZ2UoKTsKKyAgICBCdWlsZGVyLkNsZWFyKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgc291cmNlLWxvY2F0aW9uIGluZm9ybWF0aW9uLgorICBjaGFyICpsb2NhdGlvbl9kYXRhKCkgY29uc3QgeyByZXR1cm4gQnVpbGRlci5nZXRCdWZmZXIoKS5maXJzdDsgfQorICAKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggc291cmNlLWxvY2F0aW9uIAorICAvLy8gaW5mb3JtYXRpb24uCisgIHVuc2lnbmVkIGxvY2F0aW9uX3NpemUoKSBjb25zdCB7IHJldHVybiBCdWlsZGVyLmdldEJ1ZmZlcigpLnNlY29uZDsgfQorfTsKKworLy8vIFxicmllZiBDYXB0dXJlcyBpbmZvcm1hdGlvbiBhYm91dCAiZGVjbGFyYXRpb24gc3BlY2lmaWVycyIuCisvLy8KKy8vLyAiRGVjbGFyYXRpb24gc3BlY2lmaWVycyIgZW5jb21wYXNzZXMgc3RvcmFnZS1jbGFzcy1zcGVjaWZpZXJzLAorLy8vIHR5cGUtc3BlY2lmaWVycywgdHlwZS1xdWFsaWZpZXJzLCBhbmQgZnVuY3Rpb24tc3BlY2lmaWVycy4KK2NsYXNzIERlY2xTcGVjIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBzdG9yYWdlLWNsYXNzLXNwZWNpZmllcgorICAvLy8gXG5vdGUgVGhlIG9yZGVyIG9mIHRoZXNlIGVudW1lcmF0b3JzIGlzIGltcG9ydGFudCBmb3IgZGlhZ25vc3RpY3MuCisgIGVudW0gU0NTIHsKKyAgICBTQ1NfdW5zcGVjaWZpZWQgPSAwLAorICAgIFNDU190eXBlZGVmLAorICAgIFNDU19leHRlcm4sCisgICAgU0NTX3N0YXRpYywKKyAgICBTQ1NfYXV0bywKKyAgICBTQ1NfcmVnaXN0ZXIsCisgICAgU0NTX3ByaXZhdGVfZXh0ZXJuLAorICAgIFNDU19tdXRhYmxlCisgIH07CisKKyAgLy8gSW1wb3J0IHRocmVhZCBzdG9yYWdlIGNsYXNzIHNwZWNpZmllciBlbnVtZXJhdGlvbiBhbmQgY29uc3RhbnRzLgorICAvLyBUaGVzZSBjYW4gYmUgY29tYmluZWQgd2l0aCBTQ1NfZXh0ZXJuIGFuZCBTQ1Nfc3RhdGljLgorICB0eXBlZGVmIFRocmVhZFN0b3JhZ2VDbGFzc1NwZWNpZmllciBUU0NTOworICBzdGF0aWMgY29uc3QgVFNDUyBUU0NTX3Vuc3BlY2lmaWVkID0gY2xhbmc6OlRTQ1NfdW5zcGVjaWZpZWQ7CisgIHN0YXRpYyBjb25zdCBUU0NTIFRTQ1NfX190aHJlYWQgPSBjbGFuZzo6VFNDU19fX3RocmVhZDsKKyAgc3RhdGljIGNvbnN0IFRTQ1MgVFNDU190aHJlYWRfbG9jYWwgPSBjbGFuZzo6VFNDU190aHJlYWRfbG9jYWw7CisgIHN0YXRpYyBjb25zdCBUU0NTIFRTQ1NfX1RocmVhZF9sb2NhbCA9IGNsYW5nOjpUU0NTX19UaHJlYWRfbG9jYWw7CisKKyAgLy8gSW1wb3J0IHR5cGUgc3BlY2lmaWVyIHdpZHRoIGVudW1lcmF0aW9uIGFuZCBjb25zdGFudHMuCisgIHR5cGVkZWYgVHlwZVNwZWNpZmllcldpZHRoIFRTVzsKKyAgc3RhdGljIGNvbnN0IFRTVyBUU1dfdW5zcGVjaWZpZWQgPSBjbGFuZzo6VFNXX3Vuc3BlY2lmaWVkOworICBzdGF0aWMgY29uc3QgVFNXIFRTV19zaG9ydCA9IGNsYW5nOjpUU1dfc2hvcnQ7CisgIHN0YXRpYyBjb25zdCBUU1cgVFNXX2xvbmcgPSBjbGFuZzo6VFNXX2xvbmc7CisgIHN0YXRpYyBjb25zdCBUU1cgVFNXX2xvbmdsb25nID0gY2xhbmc6OlRTV19sb25nbG9uZzsKKyAgCisgIGVudW0gVFNDIHsKKyAgICBUU0NfdW5zcGVjaWZpZWQsCisgICAgVFNDX2ltYWdpbmFyeSwKKyAgICBUU0NfY29tcGxleAorICB9OworCisgIC8vIEltcG9ydCB0eXBlIHNwZWNpZmllciBzaWduIGVudW1lcmF0aW9uIGFuZCBjb25zdGFudHMuCisgIHR5cGVkZWYgVHlwZVNwZWNpZmllclNpZ24gVFNTOworICBzdGF0aWMgY29uc3QgVFNTIFRTU191bnNwZWNpZmllZCA9IGNsYW5nOjpUU1NfdW5zcGVjaWZpZWQ7CisgIHN0YXRpYyBjb25zdCBUU1MgVFNTX3NpZ25lZCA9IGNsYW5nOjpUU1Nfc2lnbmVkOworICBzdGF0aWMgY29uc3QgVFNTIFRTU191bnNpZ25lZCA9IGNsYW5nOjpUU1NfdW5zaWduZWQ7CisKKyAgLy8gSW1wb3J0IHR5cGUgc3BlY2lmaWVyIHR5cGUgZW51bWVyYXRpb24gYW5kIGNvbnN0YW50cy4KKyAgdHlwZWRlZiBUeXBlU3BlY2lmaWVyVHlwZSBUU1Q7CisgIHN0YXRpYyBjb25zdCBUU1QgVFNUX3Vuc3BlY2lmaWVkID0gY2xhbmc6OlRTVF91bnNwZWNpZmllZDsKKyAgc3RhdGljIGNvbnN0IFRTVCBUU1Rfdm9pZCA9IGNsYW5nOjpUU1Rfdm9pZDsKKyAgc3RhdGljIGNvbnN0IFRTVCBUU1RfY2hhciA9IGNsYW5nOjpUU1RfY2hhcjsKKyAgc3RhdGljIGNvbnN0IFRTVCBUU1Rfd2NoYXIgPSBjbGFuZzo6VFNUX3djaGFyOworICBzdGF0aWMgY29uc3QgVFNUIFRTVF9jaGFyMTYgPSBjbGFuZzo6VFNUX2NoYXIxNjsKKyAgc3RhdGljIGNvbnN0IFRTVCBUU1RfY2hhcjMyID0gY2xhbmc6OlRTVF9jaGFyMzI7CisgIHN0YXRpYyBjb25zdCBUU1QgVFNUX2ludCA9IGNsYW5nOjpUU1RfaW50OworICBzdGF0aWMgY29uc3QgVFNUIFRTVF9pbnQxMjggPSBjbGFuZzo6VFNUX2ludDEyODsKKyAgc3RhdGljIGNvbnN0IFRTVCBUU1RfaGFsZiA9IGNsYW5nOjpUU1RfaGFsZjsKKyAgc3RhdGljIGNvbnN0IFRTVCBUU1RfZmxvYXQgPSBjbGFuZzo6VFNUX2Zsb2F0OworICBzdGF0aWMgY29uc3QgVFNUIFRTVF9kb3VibGUgPSBjbGFuZzo6VFNUX2RvdWJsZTsKKyAgc3RhdGljIGNvbnN0IFRTVCBUU1RfZmxvYXQxNiA9IGNsYW5nOjpUU1RfRmxvYXQxNjsKKyAgc3RhdGljIGNvbnN0IFRTVCBUU1RfZmxvYXQxMjggPSBjbGFuZzo6VFNUX2Zsb2F0MTI4OworICBzdGF0aWMgY29uc3QgVFNUIFRTVF9ib29sID0gY2xhbmc6OlRTVF9ib29sOworICBzdGF0aWMgY29uc3QgVFNUIFRTVF9kZWNpbWFsMzIgPSBjbGFuZzo6VFNUX2RlY2ltYWwzMjsKKyAgc3RhdGljIGNvbnN0IFRTVCBUU1RfZGVjaW1hbDY0ID0gY2xhbmc6OlRTVF9kZWNpbWFsNjQ7CisgIHN0YXRpYyBjb25zdCBUU1QgVFNUX2RlY2ltYWwxMjggPSBjbGFuZzo6VFNUX2RlY2ltYWwxMjg7CisgIHN0YXRpYyBjb25zdCBUU1QgVFNUX2VudW0gPSBjbGFuZzo6VFNUX2VudW07CisgIHN0YXRpYyBjb25zdCBUU1QgVFNUX3VuaW9uID0gY2xhbmc6OlRTVF91bmlvbjsKKyAgc3RhdGljIGNvbnN0IFRTVCBUU1Rfc3RydWN0ID0gY2xhbmc6OlRTVF9zdHJ1Y3Q7CisgIHN0YXRpYyBjb25zdCBUU1QgVFNUX2ludGVyZmFjZSA9IGNsYW5nOjpUU1RfaW50ZXJmYWNlOworICBzdGF0aWMgY29uc3QgVFNUIFRTVF9jbGFzcyA9IGNsYW5nOjpUU1RfY2xhc3M7CisgIHN0YXRpYyBjb25zdCBUU1QgVFNUX3R5cGVuYW1lID0gY2xhbmc6OlRTVF90eXBlbmFtZTsKKyAgc3RhdGljIGNvbnN0IFRTVCBUU1RfdHlwZW9mVHlwZSA9IGNsYW5nOjpUU1RfdHlwZW9mVHlwZTsKKyAgc3RhdGljIGNvbnN0IFRTVCBUU1RfdHlwZW9mRXhwciA9IGNsYW5nOjpUU1RfdHlwZW9mRXhwcjsKKyAgc3RhdGljIGNvbnN0IFRTVCBUU1RfZGVjbHR5cGUgPSBjbGFuZzo6VFNUX2RlY2x0eXBlOworICBzdGF0aWMgY29uc3QgVFNUIFRTVF9kZWNsdHlwZV9hdXRvID0gY2xhbmc6OlRTVF9kZWNsdHlwZV9hdXRvOworICBzdGF0aWMgY29uc3QgVFNUIFRTVF91bmRlcmx5aW5nVHlwZSA9IGNsYW5nOjpUU1RfdW5kZXJseWluZ1R5cGU7CisgIHN0YXRpYyBjb25zdCBUU1QgVFNUX2F1dG8gPSBjbGFuZzo6VFNUX2F1dG87CisgIHN0YXRpYyBjb25zdCBUU1QgVFNUX2F1dG9fdHlwZSA9IGNsYW5nOjpUU1RfYXV0b190eXBlOworICBzdGF0aWMgY29uc3QgVFNUIFRTVF91bmtub3duX2FueXR5cGUgPSBjbGFuZzo6VFNUX3Vua25vd25fYW55dHlwZTsKKyAgc3RhdGljIGNvbnN0IFRTVCBUU1RfYXRvbWljID0gY2xhbmc6OlRTVF9hdG9taWM7CisjZGVmaW5lIEdFTkVSSUNfSU1BR0VfVFlQRShJbWdUeXBlLCBJZCkgXAorICBzdGF0aWMgY29uc3QgVFNUIFRTVF8jI0ltZ1R5cGUjI190ID0gY2xhbmc6OlRTVF8jI0ltZ1R5cGUjI190OworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZW5DTEltYWdlVHlwZXMuZGVmIgorICBzdGF0aWMgY29uc3QgVFNUIFRTVF9lcnJvciA9IGNsYW5nOjpUU1RfZXJyb3I7CisKKyAgLy8gdHlwZS1xdWFsaWZpZXJzCisgIGVudW0gVFEgeyAgIC8vIE5PVEU6IFRoZXNlIGZsYWdzIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggUXVhbGlmaWVyczo6VFEuCisgICAgVFFfdW5zcGVjaWZpZWQgPSAwLAorICAgIFRRX2NvbnN0ICAgICAgID0gMSwKKyAgICBUUV9yZXN0cmljdCAgICA9IDIsCisgICAgVFFfdm9sYXRpbGUgICAgPSA0LAorICAgIFRRX3VuYWxpZ25lZCAgID0gOCwKKyAgICAvLyBUaGlzIGhhcyBubyBjb3JyZXNwb25kaW5nIFF1YWxpZmllcnM6OlRRIHZhbHVlLCBiZWNhdXNlIGl0J3Mgbm90IHRyZWF0ZWQKKyAgICAvLyBhcyBhIHF1YWxpZmllciBpbiBvdXIgdHlwZSBzeXN0ZW0uCisgICAgVFFfYXRvbWljICAgICAgPSAxNgorICB9OworCisgIC8vLyBQYXJzZWRTcGVjaWZpZXJzIC0gRmxhZ3MgdG8gcXVlcnkgd2hpY2ggc3BlY2lmaWVycyB3ZXJlIGFwcGxpZWQuICBUaGlzIGlzCisgIC8vLyByZXR1cm5lZCBieSBnZXRQYXJzZWRTcGVjaWZpZXJzLgorICBlbnVtIFBhcnNlZFNwZWNpZmllcnMgeworICAgIFBRX05vbmUgICAgICAgICAgICAgICAgICA9IDAsCisgICAgUFFfU3RvcmFnZUNsYXNzU3BlY2lmaWVyID0gMSwKKyAgICBQUV9UeXBlU3BlY2lmaWVyICAgICAgICAgPSAyLAorICAgIFBRX1R5cGVRdWFsaWZpZXIgICAgICAgICA9IDQsCisgICAgUFFfRnVuY3Rpb25TcGVjaWZpZXIgICAgID0gOAorICAgIC8vIEZJWE1FOiBBdHRyaWJ1dGVzIHNob3VsZCBiZSBpbmNsdWRlZCBoZXJlLgorICB9OworCitwcml2YXRlOgorICAvLyBzdG9yYWdlLWNsYXNzLXNwZWNpZmllcgorICAvKlNDUyovdW5zaWduZWQgU3RvcmFnZUNsYXNzU3BlYyA6IDM7CisgIC8qVFNDUyovdW5zaWduZWQgVGhyZWFkU3RvcmFnZUNsYXNzU3BlYyA6IDI7CisgIHVuc2lnbmVkIFNDU19leHRlcm5faW5fbGlua2FnZV9zcGVjIDogMTsKKworICAvLyB0eXBlLXNwZWNpZmllcgorICAvKlRTVyovdW5zaWduZWQgVHlwZVNwZWNXaWR0aCA6IDI7CisgIC8qVFNDKi91bnNpZ25lZCBUeXBlU3BlY0NvbXBsZXggOiAyOworICAvKlRTUyovdW5zaWduZWQgVHlwZVNwZWNTaWduIDogMjsKKyAgLypUU1QqL3Vuc2lnbmVkIFR5cGVTcGVjVHlwZSA6IDY7CisgIHVuc2lnbmVkIFR5cGVBbHRpVmVjVmVjdG9yIDogMTsKKyAgdW5zaWduZWQgVHlwZUFsdGlWZWNQaXhlbCA6IDE7CisgIHVuc2lnbmVkIFR5cGVBbHRpVmVjQm9vbCA6IDE7CisgIHVuc2lnbmVkIFR5cGVTcGVjT3duZWQgOiAxOworICB1bnNpZ25lZCBUeXBlU3BlY1BpcGUgOiAxOworCisgIC8vIHR5cGUtcXVhbGlmaWVycworICB1bnNpZ25lZCBUeXBlUXVhbGlmaWVycyA6IDU7ICAvLyBCaXR3aXNlIE9SIG9mIFRRLgorCisgIC8vIGZ1bmN0aW9uLXNwZWNpZmllcgorICB1bnNpZ25lZCBGU19pbmxpbmVfc3BlY2lmaWVkIDogMTsKKyAgdW5zaWduZWQgRlNfZm9yY2VpbmxpbmVfc3BlY2lmaWVkOiAxOworICB1bnNpZ25lZCBGU192aXJ0dWFsX3NwZWNpZmllZCA6IDE7CisgIHVuc2lnbmVkIEZTX2V4cGxpY2l0X3NwZWNpZmllZCA6IDE7CisgIHVuc2lnbmVkIEZTX25vcmV0dXJuX3NwZWNpZmllZCA6IDE7CisKKyAgLy8gZnJpZW5kLXNwZWNpZmllcgorICB1bnNpZ25lZCBGcmllbmRfc3BlY2lmaWVkIDogMTsKKworICAvLyBjb25zdGV4cHItc3BlY2lmaWVyCisgIHVuc2lnbmVkIENvbnN0ZXhwcl9zcGVjaWZpZWQgOiAxOworCisgIHVuaW9uIHsKKyAgICBVbmlvblBhcnNlZFR5cGUgVHlwZVJlcDsKKyAgICBEZWNsICpEZWNsUmVwOworICAgIEV4cHIgKkV4cHJSZXA7CisgIH07CisKKyAgLy8gYXR0cmlidXRlcy4KKyAgUGFyc2VkQXR0cmlidXRlcyBBdHRyczsKKworICAvLyBTY29wZSBzcGVjaWZpZXIgZm9yIHRoZSB0eXBlIHNwZWMsIGlmIGFwcGxpY2FibGUuCisgIENYWFNjb3BlU3BlYyBUeXBlU2NvcGU7CisKKyAgLy8gU291cmNlTG9jYXRpb24gaW5mby4gIFRoZXNlIGFyZSBudWxsIGlmIHRoZSBpdGVtIHdhc24ndCBzcGVjaWZpZWQgb3IgaWYKKyAgLy8gdGhlIHNldHRpbmcgd2FzIHN5bnRoZXNpemVkLgorICBTb3VyY2VSYW5nZSBSYW5nZTsKKworICBTb3VyY2VMb2NhdGlvbiBTdG9yYWdlQ2xhc3NTcGVjTG9jLCBUaHJlYWRTdG9yYWdlQ2xhc3NTcGVjTG9jOworICBTb3VyY2VSYW5nZSBUU1dSYW5nZTsKKyAgU291cmNlTG9jYXRpb24gVFNDTG9jLCBUU1NMb2MsIFRTVExvYywgQWx0aVZlY0xvYzsKKyAgLy8vIFRTVE5hbWVMb2MgLSBJZiBUeXBlU3BlY1R5cGUgaXMgYW55IG9mIGNsYXNzLCBlbnVtLCBzdHJ1Y3QsIHVuaW9uLAorICAvLy8gdHlwZW5hbWUsIHRoZW4gdGhpcyBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIG5hbWVkIHR5cGUgKGlmIHByZXNlbnQpOworICAvLy8gb3RoZXJ3aXNlLCBpdCBpcyB0aGUgc2FtZSBhcyBUU1RMb2MuIEhlbmNlLCB0aGUgcGFpciBUU1RMb2MgYW5kCisgIC8vLyBUU1ROYW1lTG9jIHByb3ZpZGVzIHNvdXJjZSByYW5nZSBpbmZvIGZvciB0YWcgdHlwZXMuCisgIFNvdXJjZUxvY2F0aW9uIFRTVE5hbWVMb2M7CisgIFNvdXJjZVJhbmdlIFR5cGVvZlBhcmVuc1JhbmdlOworICBTb3VyY2VMb2NhdGlvbiBUUV9jb25zdExvYywgVFFfcmVzdHJpY3RMb2MsIFRRX3ZvbGF0aWxlTG9jLCBUUV9hdG9taWNMb2MsCisgICAgICBUUV91bmFsaWduZWRMb2M7CisgIFNvdXJjZUxvY2F0aW9uIEZTX2lubGluZUxvYywgRlNfdmlydHVhbExvYywgRlNfZXhwbGljaXRMb2MsIEZTX25vcmV0dXJuTG9jOworICBTb3VyY2VMb2NhdGlvbiBGU19mb3JjZWlubGluZUxvYzsKKyAgU291cmNlTG9jYXRpb24gRnJpZW5kTG9jLCBNb2R1bGVQcml2YXRlTG9jLCBDb25zdGV4cHJMb2M7CisgIFNvdXJjZUxvY2F0aW9uIFRRX3BpcGVMb2M7CisKKyAgV3JpdHRlbkJ1aWx0aW5TcGVjcyB3cml0dGVuQlM7CisgIHZvaWQgU2F2ZVdyaXR0ZW5CdWlsdGluU3BlY3MoKTsKKworICBPYmpDRGVjbFNwZWMgKk9iakNRdWFsaWZpZXJzOworCisgIHN0YXRpYyBib29sIGlzVHlwZVJlcChUU1QgVCkgeworICAgIHJldHVybiAoVCA9PSBUU1RfdHlwZW5hbWUgfHwgVCA9PSBUU1RfdHlwZW9mVHlwZSB8fAorICAgICAgICAgICAgVCA9PSBUU1RfdW5kZXJseWluZ1R5cGUgfHwgVCA9PSBUU1RfYXRvbWljKTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0V4cHJSZXAoVFNUIFQpIHsKKyAgICByZXR1cm4gKFQgPT0gVFNUX3R5cGVvZkV4cHIgfHwgVCA9PSBUU1RfZGVjbHR5cGUpOworICB9CisKKyAgRGVjbFNwZWMoY29uc3QgRGVjbFNwZWMgJikgPSBkZWxldGU7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IERlY2xTcGVjICYpID0gZGVsZXRlOworcHVibGljOgorICBzdGF0aWMgYm9vbCBpc0RlY2xSZXAoVFNUIFQpIHsKKyAgICByZXR1cm4gKFQgPT0gVFNUX2VudW0gfHwgVCA9PSBUU1Rfc3RydWN0IHx8CisgICAgICAgICAgICBUID09IFRTVF9pbnRlcmZhY2UgfHwgVCA9PSBUU1RfdW5pb24gfHwKKyAgICAgICAgICAgIFQgPT0gVFNUX2NsYXNzKTsKKyAgfQorCisgIERlY2xTcGVjKEF0dHJpYnV0ZUZhY3RvcnkgJmF0dHJGYWN0b3J5KQorICAgIDogU3RvcmFnZUNsYXNzU3BlYyhTQ1NfdW5zcGVjaWZpZWQpLAorICAgICAgVGhyZWFkU3RvcmFnZUNsYXNzU3BlYyhUU0NTX3Vuc3BlY2lmaWVkKSwKKyAgICAgIFNDU19leHRlcm5faW5fbGlua2FnZV9zcGVjKGZhbHNlKSwKKyAgICAgIFR5cGVTcGVjV2lkdGgoVFNXX3Vuc3BlY2lmaWVkKSwKKyAgICAgIFR5cGVTcGVjQ29tcGxleChUU0NfdW5zcGVjaWZpZWQpLAorICAgICAgVHlwZVNwZWNTaWduKFRTU191bnNwZWNpZmllZCksCisgICAgICBUeXBlU3BlY1R5cGUoVFNUX3Vuc3BlY2lmaWVkKSwKKyAgICAgIFR5cGVBbHRpVmVjVmVjdG9yKGZhbHNlKSwKKyAgICAgIFR5cGVBbHRpVmVjUGl4ZWwoZmFsc2UpLAorICAgICAgVHlwZUFsdGlWZWNCb29sKGZhbHNlKSwKKyAgICAgIFR5cGVTcGVjT3duZWQoZmFsc2UpLAorICAgICAgVHlwZVNwZWNQaXBlKGZhbHNlKSwKKyAgICAgIFR5cGVRdWFsaWZpZXJzKFRRX3Vuc3BlY2lmaWVkKSwKKyAgICAgIEZTX2lubGluZV9zcGVjaWZpZWQoZmFsc2UpLAorICAgICAgRlNfZm9yY2VpbmxpbmVfc3BlY2lmaWVkKGZhbHNlKSwKKyAgICAgIEZTX3ZpcnR1YWxfc3BlY2lmaWVkKGZhbHNlKSwKKyAgICAgIEZTX2V4cGxpY2l0X3NwZWNpZmllZChmYWxzZSksCisgICAgICBGU19ub3JldHVybl9zcGVjaWZpZWQoZmFsc2UpLAorICAgICAgRnJpZW5kX3NwZWNpZmllZChmYWxzZSksCisgICAgICBDb25zdGV4cHJfc3BlY2lmaWVkKGZhbHNlKSwKKyAgICAgIEF0dHJzKGF0dHJGYWN0b3J5KSwKKyAgICAgIHdyaXR0ZW5CUygpLAorICAgICAgT2JqQ1F1YWxpZmllcnMobnVsbHB0cikgeworICB9CisKKyAgLy8gc3RvcmFnZS1jbGFzcy1zcGVjaWZpZXIKKyAgU0NTIGdldFN0b3JhZ2VDbGFzc1NwZWMoKSBjb25zdCB7IHJldHVybiAoU0NTKVN0b3JhZ2VDbGFzc1NwZWM7IH0KKyAgVFNDUyBnZXRUaHJlYWRTdG9yYWdlQ2xhc3NTcGVjKCkgY29uc3QgeworICAgIHJldHVybiAoVFNDUylUaHJlYWRTdG9yYWdlQ2xhc3NTcGVjOworICB9CisgIGJvb2wgaXNFeHRlcm5JbkxpbmthZ2VTcGVjKCkgY29uc3QgeyByZXR1cm4gU0NTX2V4dGVybl9pbl9saW5rYWdlX3NwZWM7IH0KKyAgdm9pZCBzZXRFeHRlcm5JbkxpbmthZ2VTcGVjKGJvb2wgVmFsdWUpIHsKKyAgICBTQ1NfZXh0ZXJuX2luX2xpbmthZ2Vfc3BlYyA9IFZhbHVlOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0U3RvcmFnZUNsYXNzU3BlY0xvYygpIGNvbnN0IHsgcmV0dXJuIFN0b3JhZ2VDbGFzc1NwZWNMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0VGhyZWFkU3RvcmFnZUNsYXNzU3BlY0xvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gVGhyZWFkU3RvcmFnZUNsYXNzU3BlY0xvYzsKKyAgfQorCisgIHZvaWQgQ2xlYXJTdG9yYWdlQ2xhc3NTcGVjcygpIHsKKyAgICBTdG9yYWdlQ2xhc3NTcGVjICAgICAgICAgICA9IERlY2xTcGVjOjpTQ1NfdW5zcGVjaWZpZWQ7CisgICAgVGhyZWFkU3RvcmFnZUNsYXNzU3BlYyAgICAgPSBEZWNsU3BlYzo6VFNDU191bnNwZWNpZmllZDsKKyAgICBTQ1NfZXh0ZXJuX2luX2xpbmthZ2Vfc3BlYyA9IGZhbHNlOworICAgIFN0b3JhZ2VDbGFzc1NwZWNMb2MgICAgICAgID0gU291cmNlTG9jYXRpb24oKTsKKyAgICBUaHJlYWRTdG9yYWdlQ2xhc3NTcGVjTG9jICA9IFNvdXJjZUxvY2F0aW9uKCk7CisgIH0KKworICB2b2lkIENsZWFyVHlwZVNwZWNUeXBlKCkgeworICAgIFR5cGVTcGVjVHlwZSA9IERlY2xTcGVjOjpUU1RfdW5zcGVjaWZpZWQ7CisgICAgVHlwZVNwZWNPd25lZCA9IGZhbHNlOworICAgIFRTVExvYyA9IFNvdXJjZUxvY2F0aW9uKCk7CisgIH0KKworICAvLyB0eXBlLXNwZWNpZmllcgorICBUU1cgZ2V0VHlwZVNwZWNXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIChUU1cpVHlwZVNwZWNXaWR0aDsgfQorICBUU0MgZ2V0VHlwZVNwZWNDb21wbGV4KCkgY29uc3QgeyByZXR1cm4gKFRTQylUeXBlU3BlY0NvbXBsZXg7IH0KKyAgVFNTIGdldFR5cGVTcGVjU2lnbigpIGNvbnN0IHsgcmV0dXJuIChUU1MpVHlwZVNwZWNTaWduOyB9CisgIFRTVCBnZXRUeXBlU3BlY1R5cGUoKSBjb25zdCB7IHJldHVybiAoVFNUKVR5cGVTcGVjVHlwZTsgfQorICBib29sIGlzVHlwZUFsdGlWZWNWZWN0b3IoKSBjb25zdCB7IHJldHVybiBUeXBlQWx0aVZlY1ZlY3RvcjsgfQorICBib29sIGlzVHlwZUFsdGlWZWNQaXhlbCgpIGNvbnN0IHsgcmV0dXJuIFR5cGVBbHRpVmVjUGl4ZWw7IH0KKyAgYm9vbCBpc1R5cGVBbHRpVmVjQm9vbCgpIGNvbnN0IHsgcmV0dXJuIFR5cGVBbHRpVmVjQm9vbDsgfQorICBib29sIGlzVHlwZVNwZWNPd25lZCgpIGNvbnN0IHsgcmV0dXJuIFR5cGVTcGVjT3duZWQ7IH0KKyAgYm9vbCBpc1R5cGVSZXAoKSBjb25zdCB7IHJldHVybiBpc1R5cGVSZXAoKFRTVCkgVHlwZVNwZWNUeXBlKTsgfQorICBib29sIGlzVHlwZVNwZWNQaXBlKCkgY29uc3QgeyByZXR1cm4gVHlwZVNwZWNQaXBlOyB9CisKKyAgUGFyc2VkVHlwZSBnZXRSZXBBc1R5cGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzVHlwZVJlcCgoVFNUKSBUeXBlU3BlY1R5cGUpICYmICJEZWNsU3BlYyBkb2VzIG5vdCBzdG9yZSBhIHR5cGUiKTsKKyAgICByZXR1cm4gVHlwZVJlcDsKKyAgfQorICBEZWNsICpnZXRSZXBBc0RlY2woKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzRGVjbFJlcCgoVFNUKSBUeXBlU3BlY1R5cGUpICYmICJEZWNsU3BlYyBkb2VzIG5vdCBzdG9yZSBhIGRlY2wiKTsKKyAgICByZXR1cm4gRGVjbFJlcDsKKyAgfQorICBFeHByICpnZXRSZXBBc0V4cHIoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzRXhwclJlcCgoVFNUKSBUeXBlU3BlY1R5cGUpICYmICJEZWNsU3BlYyBkb2VzIG5vdCBzdG9yZSBhbiBleHByIik7CisgICAgcmV0dXJuIEV4cHJSZXA7CisgIH0KKyAgQ1hYU2NvcGVTcGVjICZnZXRUeXBlU3BlY1Njb3BlKCkgeyByZXR1cm4gVHlwZVNjb3BlOyB9CisgIGNvbnN0IENYWFNjb3BlU3BlYyAmZ2V0VHlwZVNwZWNTY29wZSgpIGNvbnN0IHsgcmV0dXJuIFR5cGVTY29wZTsgfQorCisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSYW5nZTsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUmFuZ2UuZ2V0QmVnaW4oKTsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJhbmdlLmdldEVuZCgpOyB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0VHlwZVNwZWNXaWR0aExvYygpIGNvbnN0IHsgcmV0dXJuIFRTV1JhbmdlLmdldEJlZ2luKCk7IH0KKyAgU291cmNlUmFuZ2UgZ2V0VHlwZVNwZWNXaWR0aFJhbmdlKCkgY29uc3QgeyByZXR1cm4gVFNXUmFuZ2U7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0VHlwZVNwZWNDb21wbGV4TG9jKCkgY29uc3QgeyByZXR1cm4gVFNDTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldFR5cGVTcGVjU2lnbkxvYygpIGNvbnN0IHsgcmV0dXJuIFRTU0xvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRUeXBlU3BlY1R5cGVMb2MoKSBjb25zdCB7IHJldHVybiBUU1RMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0QWx0aVZlY0xvYygpIGNvbnN0IHsgcmV0dXJuIEFsdGlWZWNMb2M7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRUeXBlU3BlY1R5cGVOYW1lTG9jKCkgY29uc3QgeworICAgIGFzc2VydChpc0RlY2xSZXAoKFRTVCkgVHlwZVNwZWNUeXBlKSB8fCBUeXBlU3BlY1R5cGUgPT0gVFNUX3R5cGVuYW1lKTsKKyAgICByZXR1cm4gVFNUTmFtZUxvYzsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldFR5cGVvZlBhcmVuc1JhbmdlKCkgY29uc3QgeyByZXR1cm4gVHlwZW9mUGFyZW5zUmFuZ2U7IH0KKyAgdm9pZCBzZXRUeXBlb2ZQYXJlbnNSYW5nZShTb3VyY2VSYW5nZSByYW5nZSkgeyBUeXBlb2ZQYXJlbnNSYW5nZSA9IHJhbmdlOyB9CisKKyAgYm9vbCBoYXNBdXRvVHlwZVNwZWMoKSBjb25zdCB7CisgICAgcmV0dXJuIChUeXBlU3BlY1R5cGUgPT0gVFNUX2F1dG8gfHwgVHlwZVNwZWNUeXBlID09IFRTVF9hdXRvX3R5cGUgfHwKKyAgICAgICAgICAgIFR5cGVTcGVjVHlwZSA9PSBUU1RfZGVjbHR5cGVfYXV0byk7CisgIH0KKworICBib29sIGhhc1RhZ0RlZmluaXRpb24oKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFR1cm4gYSB0eXBlLXNwZWNpZmllci10eXBlIGludG8gYSBzdHJpbmcgbGlrZSAiX0Jvb2wiIG9yICJ1bmlvbiIuCisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRTcGVjaWZpZXJOYW1lKERlY2xTcGVjOjpUU1QgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSk7CisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRTcGVjaWZpZXJOYW1lKERlY2xTcGVjOjpUUSBRKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmdldFNwZWNpZmllck5hbWUoRGVjbFNwZWM6OlRTUyBTKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmdldFNwZWNpZmllck5hbWUoRGVjbFNwZWM6OlRTQyBDKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmdldFNwZWNpZmllck5hbWUoRGVjbFNwZWM6OlRTVyBXKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmdldFNwZWNpZmllck5hbWUoRGVjbFNwZWM6OlNDUyBTKTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmdldFNwZWNpZmllck5hbWUoRGVjbFNwZWM6OlRTQ1MgUyk7CisKKyAgLy8gdHlwZS1xdWFsaWZpZXJzCisKKyAgLy8vIGdldFR5cGVRdWFsaWZpZXJzIC0gUmV0dXJuIGEgc2V0IG9mIFRRcy4KKyAgdW5zaWduZWQgZ2V0VHlwZVF1YWxpZmllcnMoKSBjb25zdCB7IHJldHVybiBUeXBlUXVhbGlmaWVyczsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRDb25zdFNwZWNMb2MoKSBjb25zdCB7IHJldHVybiBUUV9jb25zdExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRSZXN0cmljdFNwZWNMb2MoKSBjb25zdCB7IHJldHVybiBUUV9yZXN0cmljdExvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRWb2xhdGlsZVNwZWNMb2MoKSBjb25zdCB7IHJldHVybiBUUV92b2xhdGlsZUxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRBdG9taWNTcGVjTG9jKCkgY29uc3QgeyByZXR1cm4gVFFfYXRvbWljTG9jOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldFVuYWxpZ25lZFNwZWNMb2MoKSBjb25zdCB7IHJldHVybiBUUV91bmFsaWduZWRMb2M7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0UGlwZUxvYygpIGNvbnN0IHsgcmV0dXJuIFRRX3BpcGVMb2M7IH0KKworICAvLy8gXGJyaWVmIENsZWFyIG91dCBhbGwgb2YgdGhlIHR5cGUgcXVhbGlmaWVycy4KKyAgdm9pZCBDbGVhclR5cGVRdWFsaWZpZXJzKCkgeworICAgIFR5cGVRdWFsaWZpZXJzID0gMDsKKyAgICBUUV9jb25zdExvYyA9IFNvdXJjZUxvY2F0aW9uKCk7CisgICAgVFFfcmVzdHJpY3RMb2MgPSBTb3VyY2VMb2NhdGlvbigpOworICAgIFRRX3ZvbGF0aWxlTG9jID0gU291cmNlTG9jYXRpb24oKTsKKyAgICBUUV9hdG9taWNMb2MgPSBTb3VyY2VMb2NhdGlvbigpOworICAgIFRRX3VuYWxpZ25lZExvYyA9IFNvdXJjZUxvY2F0aW9uKCk7CisgICAgVFFfcGlwZUxvYyA9IFNvdXJjZUxvY2F0aW9uKCk7CisgIH0KKworICAvLyBmdW5jdGlvbi1zcGVjaWZpZXIKKyAgYm9vbCBpc0lubGluZVNwZWNpZmllZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRlNfaW5saW5lX3NwZWNpZmllZCB8IEZTX2ZvcmNlaW5saW5lX3NwZWNpZmllZDsKKyAgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRJbmxpbmVTcGVjTG9jKCkgY29uc3QgeworICAgIHJldHVybiBGU19pbmxpbmVfc3BlY2lmaWVkID8gRlNfaW5saW5lTG9jIDogRlNfZm9yY2VpbmxpbmVMb2M7CisgIH0KKworICBib29sIGlzVmlydHVhbFNwZWNpZmllZCgpIGNvbnN0IHsgcmV0dXJuIEZTX3ZpcnR1YWxfc3BlY2lmaWVkOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldFZpcnR1YWxTcGVjTG9jKCkgY29uc3QgeyByZXR1cm4gRlNfdmlydHVhbExvYzsgfQorCisgIGJvb2wgaXNFeHBsaWNpdFNwZWNpZmllZCgpIGNvbnN0IHsgcmV0dXJuIEZTX2V4cGxpY2l0X3NwZWNpZmllZDsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRFeHBsaWNpdFNwZWNMb2MoKSBjb25zdCB7IHJldHVybiBGU19leHBsaWNpdExvYzsgfQorCisgIGJvb2wgaXNOb3JldHVyblNwZWNpZmllZCgpIGNvbnN0IHsgcmV0dXJuIEZTX25vcmV0dXJuX3NwZWNpZmllZDsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXROb3JldHVyblNwZWNMb2MoKSBjb25zdCB7IHJldHVybiBGU19ub3JldHVybkxvYzsgfQorCisgIHZvaWQgQ2xlYXJGdW5jdGlvblNwZWNzKCkgeworICAgIEZTX2lubGluZV9zcGVjaWZpZWQgPSBmYWxzZTsKKyAgICBGU19pbmxpbmVMb2MgPSBTb3VyY2VMb2NhdGlvbigpOworICAgIEZTX2ZvcmNlaW5saW5lX3NwZWNpZmllZCA9IGZhbHNlOworICAgIEZTX2ZvcmNlaW5saW5lTG9jID0gU291cmNlTG9jYXRpb24oKTsKKyAgICBGU192aXJ0dWFsX3NwZWNpZmllZCA9IGZhbHNlOworICAgIEZTX3ZpcnR1YWxMb2MgPSBTb3VyY2VMb2NhdGlvbigpOworICAgIEZTX2V4cGxpY2l0X3NwZWNpZmllZCA9IGZhbHNlOworICAgIEZTX2V4cGxpY2l0TG9jID0gU291cmNlTG9jYXRpb24oKTsKKyAgICBGU19ub3JldHVybl9zcGVjaWZpZWQgPSBmYWxzZTsKKyAgICBGU19ub3JldHVybkxvYyA9IFNvdXJjZUxvY2F0aW9uKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIGFueSB0eXBlLXNwZWNpZmllciBoYXMgYmVlbiBmb3VuZC4KKyAgYm9vbCBoYXNUeXBlU3BlY2lmaWVyKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUeXBlU3BlY1R5cGUoKSAhPSBEZWNsU3BlYzo6VFNUX3Vuc3BlY2lmaWVkIHx8CisgICAgICAgICAgIGdldFR5cGVTcGVjV2lkdGgoKSAhPSBEZWNsU3BlYzo6VFNXX3Vuc3BlY2lmaWVkIHx8CisgICAgICAgICAgIGdldFR5cGVTcGVjQ29tcGxleCgpICE9IERlY2xTcGVjOjpUU0NfdW5zcGVjaWZpZWQgfHwKKyAgICAgICAgICAgZ2V0VHlwZVNwZWNTaWduKCkgIT0gRGVjbFNwZWM6OlRTU191bnNwZWNpZmllZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgYml0bWFzayBvZiB3aGljaCBmbGF2b3JzIG9mIHNwZWNpZmllcnMgdGhpcworICAvLy8gRGVjbFNwZWMgaW5jbHVkZXMuCisgIHVuc2lnbmVkIGdldFBhcnNlZFNwZWNpZmllcnMoKSBjb25zdDsKKworICAvLy8gaXNFbXB0eSAtIFJldHVybiB0cnVlIGlmIHRoaXMgZGVjbGFyYXRpb24gc3BlY2lmaWVyIGlzIGNvbXBsZXRlbHkgZW1wdHk6CisgIC8vLyBubyB0b2tlbnMgd2VyZSBwYXJzZWQgaW4gdGhlIHByb2R1Y3Rpb24gb2YgaXQuCisgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UGFyc2VkU3BlY2lmaWVycygpID09IERlY2xTcGVjOjpQUV9Ob25lOworICB9CisKKyAgdm9pZCBTZXRSYW5nZVN0YXJ0KFNvdXJjZUxvY2F0aW9uIExvYykgeyBSYW5nZS5zZXRCZWdpbihMb2MpOyB9CisgIHZvaWQgU2V0UmFuZ2VFbmQoU291cmNlTG9jYXRpb24gTG9jKSB7IFJhbmdlLnNldEVuZChMb2MpOyB9CisKKyAgLy8vIFRoZXNlIG1ldGhvZHMgc2V0IHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIG9mIHRoZSBEZWNsU3BlYyBhbmQKKyAgLy8vIHJldHVybiBmYWxzZSBpZiB0aGVyZSB3YXMgbm8gZXJyb3IuICBJZiBhbiBlcnJvciBvY2N1cnMgKGZvcgorICAvLy8gZXhhbXBsZSwgaWYgd2UgdHJpZWQgdG8gc2V0ICJhdXRvIiBvbiBhIHNwZWMgd2l0aCAiZXh0ZXJuIgorICAvLy8gYWxyZWFkeSBzZXQpLCB0aGV5IHJldHVybiB0cnVlIGFuZCBzZXQgUHJldlNwZWMgYW5kIERpYWdJRAorICAvLy8gc3VjaCB0aGF0CisgIC8vLyAgIERpYWcoTG9jLCBEaWFnSUQpIDw8IFByZXZTcGVjOworICAvLy8gd2lsbCB5aWVsZCBhIHVzZWZ1bCByZXN1bHQuCisgIC8vLworICAvLy8gVE9ETzogdXNlIGEgbW9yZSBnZW5lcmFsIGFwcHJvYWNoIHRoYXQgc3RpbGwgYWxsb3dzIHRoZXNlCisgIC8vLyBkaWFnbm9zdGljcyB0byBiZSBpZ25vcmVkIHdoZW4gZGVzaXJlZC4KKyAgYm9vbCBTZXRTdG9yYWdlQ2xhc3NTcGVjKFNlbWEgJlMsIFNDUyBTQywgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqJlByZXZTcGVjLCB1bnNpZ25lZCAmRGlhZ0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSk7CisgIGJvb2wgU2V0U3RvcmFnZUNsYXNzU3BlY1RocmVhZChUU0NTIFRTQywgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqJlByZXZTcGVjLCB1bnNpZ25lZCAmRGlhZ0lEKTsKKyAgYm9vbCBTZXRUeXBlU3BlY1dpZHRoKFRTVyBXLCBTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpOworICBib29sIFNldFR5cGVTcGVjQ29tcGxleChUU0MgQywgU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBjaGFyIComUHJldlNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQpOworICBib29sIFNldFR5cGVTcGVjU2lnbihUU1MgUywgU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBjaGFyIComUHJldlNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQpOworICBib29sIFNldFR5cGVTcGVjVHlwZShUU1QgVCwgU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBjaGFyIComUHJldlNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpOworICBib29sIFNldFR5cGVTcGVjVHlwZShUU1QgVCwgU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBjaGFyIComUHJldlNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQsIFBhcnNlZFR5cGUgUmVwLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KTsKKyAgYm9vbCBTZXRUeXBlU3BlY1R5cGUoVFNUIFQsIFNvdXJjZUxvY2F0aW9uIExvYywgY29uc3QgY2hhciAqJlByZXZTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRGlhZ0lELCBEZWNsICpSZXAsIGJvb2wgT3duZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpOworICBib29sIFNldFR5cGVTcGVjVHlwZShUU1QgVCwgU291cmNlTG9jYXRpb24gVGFnS3dMb2MsCisgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRhZ05hbWVMb2MsIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkRpYWdJRCwgUGFyc2VkVHlwZSBSZXAsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpOworICBib29sIFNldFR5cGVTcGVjVHlwZShUU1QgVCwgU291cmNlTG9jYXRpb24gVGFnS3dMb2MsCisgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRhZ05hbWVMb2MsIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkRpYWdJRCwgRGVjbCAqUmVwLCBib29sIE93bmVkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KTsKKworICBib29sIFNldFR5cGVTcGVjVHlwZShUU1QgVCwgU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBjaGFyIComUHJldlNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQsIEV4cHIgKlJlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJnBvbGljeSk7CisgIGJvb2wgU2V0VHlwZUFsdGlWZWNWZWN0b3IoYm9vbCBpc0FsdGlWZWNWZWN0b3IsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqJlByZXZTcGVjLCB1bnNpZ25lZCAmRGlhZ0lELAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KTsKKyAgYm9vbCBTZXRUeXBlQWx0aVZlY1BpeGVsKGJvb2wgaXNBbHRpVmVjUGl4ZWwsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqJlByZXZTcGVjLCB1bnNpZ25lZCAmRGlhZ0lELAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KTsKKyAgYm9vbCBTZXRUeXBlQWx0aVZlY0Jvb2woYm9vbCBpc0FsdGlWZWNCb29sLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywgdW5zaWduZWQgJkRpYWdJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSk7CisgIGJvb2wgU2V0VHlwZVBpcGUoYm9vbCBpc1BpcGUsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqJlByZXZTcGVjLCB1bnNpZ25lZCAmRGlhZ0lELAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KTsKKyAgYm9vbCBTZXRUeXBlU3BlY0Vycm9yKCk7CisgIHZvaWQgVXBkYXRlRGVjbFJlcChEZWNsICpSZXApIHsKKyAgICBhc3NlcnQoaXNEZWNsUmVwKChUU1QpIFR5cGVTcGVjVHlwZSkpOworICAgIERlY2xSZXAgPSBSZXA7CisgIH0KKyAgdm9pZCBVcGRhdGVUeXBlUmVwKFBhcnNlZFR5cGUgUmVwKSB7CisgICAgYXNzZXJ0KGlzVHlwZVJlcCgoVFNUKSBUeXBlU3BlY1R5cGUpKTsKKyAgICBUeXBlUmVwID0gUmVwOworICB9CisgIHZvaWQgVXBkYXRlRXhwclJlcChFeHByICpSZXApIHsKKyAgICBhc3NlcnQoaXNFeHByUmVwKChUU1QpIFR5cGVTcGVjVHlwZSkpOworICAgIEV4cHJSZXAgPSBSZXA7CisgIH0KKworICBib29sIFNldFR5cGVRdWFsKFRRIFQsIFNvdXJjZUxvY2F0aW9uIExvYywgY29uc3QgY2hhciAqJlByZXZTcGVjLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nKTsKKworICBib29sIHNldEZ1bmN0aW9uU3BlY0lubGluZShTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkRpYWdJRCk7CisgIGJvb2wgc2V0RnVuY3Rpb25TcGVjRm9yY2VJbmxpbmUoU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBjaGFyIComUHJldlNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkRpYWdJRCk7CisgIGJvb2wgc2V0RnVuY3Rpb25TcGVjVmlydHVhbChTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQpOworICBib29sIHNldEZ1bmN0aW9uU3BlY0V4cGxpY2l0KFNvdXJjZUxvY2F0aW9uIExvYywgY29uc3QgY2hhciAqJlByZXZTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQpOworICBib29sIHNldEZ1bmN0aW9uU3BlY05vcmV0dXJuKFNvdXJjZUxvY2F0aW9uIExvYywgY29uc3QgY2hhciAqJlByZXZTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQpOworCisgIGJvb2wgU2V0RnJpZW5kU3BlYyhTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQpOworICBib29sIHNldE1vZHVsZVByaXZhdGVTcGVjKFNvdXJjZUxvY2F0aW9uIExvYywgY29uc3QgY2hhciAqJlByZXZTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQpOworICBib29sIFNldENvbnN0ZXhwclNwZWMoU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBjaGFyIComUHJldlNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRGlhZ0lEKTsKKworICBib29sIGlzRnJpZW5kU3BlY2lmaWVkKCkgY29uc3QgeyByZXR1cm4gRnJpZW5kX3NwZWNpZmllZDsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRGcmllbmRTcGVjTG9jKCkgY29uc3QgeyByZXR1cm4gRnJpZW5kTG9jOyB9CisKKyAgYm9vbCBpc01vZHVsZVByaXZhdGVTcGVjaWZpZWQoKSBjb25zdCB7IHJldHVybiBNb2R1bGVQcml2YXRlTG9jLmlzVmFsaWQoKTsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRNb2R1bGVQcml2YXRlU3BlY0xvYygpIGNvbnN0IHsgcmV0dXJuIE1vZHVsZVByaXZhdGVMb2M7IH0KKyAgCisgIGJvb2wgaXNDb25zdGV4cHJTcGVjaWZpZWQoKSBjb25zdCB7IHJldHVybiBDb25zdGV4cHJfc3BlY2lmaWVkOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldENvbnN0ZXhwclNwZWNMb2MoKSBjb25zdCB7IHJldHVybiBDb25zdGV4cHJMb2M7IH0KKworICB2b2lkIENsZWFyQ29uc3RleHByU3BlYygpIHsKKyAgICBDb25zdGV4cHJfc3BlY2lmaWVkID0gZmFsc2U7CisgICAgQ29uc3RleHByTG9jID0gU291cmNlTG9jYXRpb24oKTsKKyAgfQorCisgIEF0dHJpYnV0ZVBvb2wgJmdldEF0dHJpYnV0ZVBvb2woKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJzLmdldFBvb2woKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29uY2F0ZW5hdGVzIHR3byBhdHRyaWJ1dGUgbGlzdHMuCisgIC8vLworICAvLy8gVGhlIEdDQyBhdHRyaWJ1dGUgc3ludGF4IGFsbG93cyBmb3IgdGhlIGZvbGxvd2luZzoKKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gc2hvcnQgX19hdHRyaWJ1dGVfXygoIHVudXNlZCwgZGVwcmVjYXRlZCApKQorICAvLy8gaW50IF9fYXR0cmlidXRlX18oKCBtYXlfYWxpYXMsIGFsaWduZWQoMTYpICkpIHZhcjsKKyAgLy8vIFxlbmRjb2RlCisgIC8vLworICAvLy8gVGhpcyBkZWNsYXJlcyA0IGF0dHJpYnV0ZXMgdXNpbmcgMiBsaXN0cy4gVGhlIGZvbGxvd2luZyBzeW50YXggaXMKKyAgLy8vIGFsc28gYWxsb3dlZCBhbmQgZXF1aXZhbGVudCB0byB0aGUgcHJldmlvdXMgZGVjbGFyYXRpb24uCisgIC8vLworICAvLy8gXGNvZGUKKyAgLy8vIHNob3J0IF9fYXR0cmlidXRlX18oKHVudXNlZCkpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKQorICAvLy8gaW50IF9fYXR0cmlidXRlX18oKG1heV9hbGlhcykpIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkgdmFyOworICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIHZvaWQgYWRkQXR0cmlidXRlcyhBdHRyaWJ1dGVMaXN0ICpBTCkgeworICAgIEF0dHJzLmFkZEFsbChBTCk7CisgIH0KKworICBib29sIGhhc0F0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiAhQXR0cnMuZW1wdHkoKTsgfQorCisgIFBhcnNlZEF0dHJpYnV0ZXMgJmdldEF0dHJpYnV0ZXMoKSB7IHJldHVybiBBdHRyczsgfQorICBjb25zdCBQYXJzZWRBdHRyaWJ1dGVzICZnZXRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gQXR0cnM7IH0KKworICB2b2lkIHRha2VBdHRyaWJ1dGVzRnJvbShQYXJzZWRBdHRyaWJ1dGVzICZhdHRycykgeworICAgIEF0dHJzLnRha2VBbGxGcm9tKGF0dHJzKTsKKyAgfQorCisgIC8vLyBGaW5pc2ggLSBUaGlzIGRvZXMgZmluYWwgYW5hbHlzaXMgb2YgdGhlIGRlY2xzcGVjLCBpc3N1aW5nIGRpYWdub3N0aWNzIGZvcgorICAvLy8gdGhpbmdzIGxpa2UgIl9JbWFnaW5hcnkiIChsYWNraW5nIGFuIEZQIHR5cGUpLiAgQWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwKKyAgLy8vIERlY2xTcGVjIGlzIGd1YXJhbnRlZWQgc2VsZi1jb25zaXN0ZW50LCBldmVuIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICB2b2lkIEZpbmlzaChTZW1hICZTLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KTsKKworICBjb25zdCBXcml0dGVuQnVpbHRpblNwZWNzJiBnZXRXcml0dGVuQnVpbHRpblNwZWNzKCkgY29uc3QgeworICAgIHJldHVybiB3cml0dGVuQlM7CisgIH0KKworICBPYmpDRGVjbFNwZWMgKmdldE9iakNRdWFsaWZpZXJzKCkgY29uc3QgeyByZXR1cm4gT2JqQ1F1YWxpZmllcnM7IH0KKyAgdm9pZCBzZXRPYmpDUXVhbGlmaWVycyhPYmpDRGVjbFNwZWMgKnF1YWxzKSB7IE9iakNRdWFsaWZpZXJzID0gcXVhbHM7IH0KKworICAvLy8gXGJyaWVmIENoZWNrcyBpZiB0aGlzIERlY2xTcGVjIGNhbiBzdGFuZCBhbG9uZSwgd2l0aG91dCBhIERlY2xhcmF0b3IuCisgIC8vLworICAvLy8gT25seSB0YWcgZGVjbHNwZWNzIGNhbiBzdGFuZCBhbG9uZS4KKyAgYm9vbCBpc01pc3NpbmdEZWNsYXJhdG9yT2soKTsKK307CisKKy8vLyBcYnJpZWYgQ2FwdHVyZXMgaW5mb3JtYXRpb24gYWJvdXQgImRlY2xhcmF0aW9uIHNwZWNpZmllcnMiIHNwZWNpZmljIHRvCisvLy8gT2JqZWN0aXZlLUMuCitjbGFzcyBPYmpDRGVjbFNwZWMgeworcHVibGljOgorICAvLy8gT2JqQ0RlY2xRdWFsaWZpZXIgLSBRdWFsaWZpZXIgdXNlZCBvbiB0eXBlcyBpbiBtZXRob2QKKyAgLy8vIGRlY2xhcmF0aW9ucy4gIE5vdCBhbGwgY29tYmluYXRpb25zIGFyZSBzZW5zaWJsZS4gIFBhcmFtZXRlcnMKKyAgLy8vIGNhbiBiZSBvbmUgb2YgeyBpbiwgb3V0LCBpbm91dCB9IHdpdGggb25lIG9mIHsgYnljb3B5LCBieXJlZiB9LgorICAvLy8gUmV0dXJucyBjYW4gZWl0aGVyIGJlIHsgb25ld2F5IH0gb3Igbm90LgorICAvLy8KKyAgLy8vIFRoaXMgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIERlY2w6Ok9iakNEZWNsUXVhbGlmaWVyLgorICBlbnVtIE9iakNEZWNsUXVhbGlmaWVyIHsKKyAgICBEUV9Ob25lID0gMHgwLAorICAgIERRX0luID0gMHgxLAorICAgIERRX0lub3V0ID0gMHgyLAorICAgIERRX091dCA9IDB4NCwKKyAgICBEUV9CeWNvcHkgPSAweDgsCisgICAgRFFfQnlyZWYgPSAweDEwLAorICAgIERRX09uZXdheSA9IDB4MjAsCisgICAgRFFfQ1NOdWxsYWJpbGl0eSA9IDB4NDAKKyAgfTsKKworICAvLy8gUHJvcGVydHlBdHRyaWJ1dGVLaW5kIC0gbGlzdCBvZiBwcm9wZXJ0eSBhdHRyaWJ1dGVzLgorICAvLy8gS2VlcCB0aGlzIGxpc3QgaW4gc3luYyB3aXRoIExMVk0ncyBEd2FyZi5oIEFwcGxlUHJvcGVydHlBdHRyaWJ1dGVzLgorICBlbnVtIE9iakNQcm9wZXJ0eUF0dHJpYnV0ZUtpbmQgeworICAgIERRX1BSX25vYXR0ciA9IDB4MCwKKyAgICBEUV9QUl9yZWFkb25seSA9IDB4MDEsCisgICAgRFFfUFJfZ2V0dGVyID0gMHgwMiwKKyAgICBEUV9QUl9hc3NpZ24gPSAweDA0LAorICAgIERRX1BSX3JlYWR3cml0ZSA9IDB4MDgsCisgICAgRFFfUFJfcmV0YWluID0gMHgxMCwKKyAgICBEUV9QUl9jb3B5ID0gMHgyMCwKKyAgICBEUV9QUl9ub25hdG9taWMgPSAweDQwLAorICAgIERRX1BSX3NldHRlciA9IDB4ODAsCisgICAgRFFfUFJfYXRvbWljID0gMHgxMDAsCisgICAgRFFfUFJfd2VhayA9ICAgMHgyMDAsCisgICAgRFFfUFJfc3Ryb25nID0gMHg0MDAsCisgICAgRFFfUFJfdW5zYWZlX3VucmV0YWluZWQgPSAweDgwMCwKKyAgICBEUV9QUl9udWxsYWJpbGl0eSA9IDB4MTAwMCwKKyAgICBEUV9QUl9udWxsX3Jlc2V0dGFibGUgPSAweDIwMDAsCisgICAgRFFfUFJfY2xhc3MgPSAweDQwMDAKKyAgfTsKKworICBPYmpDRGVjbFNwZWMoKQorICAgIDogb2JqY0RlY2xRdWFsaWZpZXIoRFFfTm9uZSksIFByb3BlcnR5QXR0cmlidXRlcyhEUV9QUl9ub2F0dHIpLAorICAgICAgTnVsbGFiaWxpdHkoMCksIEdldHRlck5hbWUobnVsbHB0ciksIFNldHRlck5hbWUobnVsbHB0cikgeyB9CisKKyAgT2JqQ0RlY2xRdWFsaWZpZXIgZ2V0T2JqQ0RlY2xRdWFsaWZpZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIChPYmpDRGVjbFF1YWxpZmllcilvYmpjRGVjbFF1YWxpZmllcjsKKyAgfQorICB2b2lkIHNldE9iakNEZWNsUXVhbGlmaWVyKE9iakNEZWNsUXVhbGlmaWVyIERRVmFsKSB7CisgICAgb2JqY0RlY2xRdWFsaWZpZXIgPSAoT2JqQ0RlY2xRdWFsaWZpZXIpIChvYmpjRGVjbFF1YWxpZmllciB8IERRVmFsKTsKKyAgfQorICB2b2lkIGNsZWFyT2JqQ0RlY2xRdWFsaWZpZXIoT2JqQ0RlY2xRdWFsaWZpZXIgRFFWYWwpIHsKKyAgICBvYmpjRGVjbFF1YWxpZmllciA9IChPYmpDRGVjbFF1YWxpZmllcikgKG9iamNEZWNsUXVhbGlmaWVyICYgfkRRVmFsKTsKKyAgfQorCisgIE9iakNQcm9wZXJ0eUF0dHJpYnV0ZUtpbmQgZ2V0UHJvcGVydHlBdHRyaWJ1dGVzKCkgY29uc3QgeworICAgIHJldHVybiBPYmpDUHJvcGVydHlBdHRyaWJ1dGVLaW5kKFByb3BlcnR5QXR0cmlidXRlcyk7CisgIH0KKyAgdm9pZCBzZXRQcm9wZXJ0eUF0dHJpYnV0ZXMoT2JqQ1Byb3BlcnR5QXR0cmlidXRlS2luZCBQUlZhbCkgeworICAgIFByb3BlcnR5QXR0cmlidXRlcyA9CisgICAgICAoT2JqQ1Byb3BlcnR5QXR0cmlidXRlS2luZCkoUHJvcGVydHlBdHRyaWJ1dGVzIHwgUFJWYWwpOworICB9CisKKyAgTnVsbGFiaWxpdHlLaW5kIGdldE51bGxhYmlsaXR5KCkgY29uc3QgeworICAgIGFzc2VydCgoKGdldE9iakNEZWNsUXVhbGlmaWVyKCkgJiBEUV9DU051bGxhYmlsaXR5KSB8fAorICAgICAgICAgICAgKGdldFByb3BlcnR5QXR0cmlidXRlcygpICYgRFFfUFJfbnVsbGFiaWxpdHkpKSAmJgorICAgICAgICAgICAiT2JqZWN0aXZlLUMgZGVjbHNwZWMgZG9lc24ndCBoYXZlIG51bGxhYmlsaXR5Iik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE51bGxhYmlsaXR5S2luZD4oTnVsbGFiaWxpdHkpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TnVsbGFiaWxpdHlMb2MoKSBjb25zdCB7CisgICAgYXNzZXJ0KCgoZ2V0T2JqQ0RlY2xRdWFsaWZpZXIoKSAmIERRX0NTTnVsbGFiaWxpdHkpIHx8CisgICAgICAgICAgICAoZ2V0UHJvcGVydHlBdHRyaWJ1dGVzKCkgJiBEUV9QUl9udWxsYWJpbGl0eSkpICYmCisgICAgICAgICAgICJPYmplY3RpdmUtQyBkZWNsc3BlYyBkb2Vzbid0IGhhdmUgbnVsbGFiaWxpdHkiKTsKKyAgICByZXR1cm4gTnVsbGFiaWxpdHlMb2M7CisgIH0KKworICB2b2lkIHNldE51bGxhYmlsaXR5KFNvdXJjZUxvY2F0aW9uIGxvYywgTnVsbGFiaWxpdHlLaW5kIGtpbmQpIHsKKyAgICBhc3NlcnQoKChnZXRPYmpDRGVjbFF1YWxpZmllcigpICYgRFFfQ1NOdWxsYWJpbGl0eSkgfHwKKyAgICAgICAgICAgIChnZXRQcm9wZXJ0eUF0dHJpYnV0ZXMoKSAmIERRX1BSX251bGxhYmlsaXR5KSkgJiYKKyAgICAgICAgICAgIlNldCB0aGUgbnVsbGFiaWxpdHkgZGVjbHNwZWMgb3IgcHJvcGVydHkgYXR0cmlidXRlIGZpcnN0Iik7CisgICAgTnVsbGFiaWxpdHkgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oa2luZCk7CisgICAgTnVsbGFiaWxpdHlMb2MgPSBsb2M7CisgIH0KKworICBjb25zdCBJZGVudGlmaWVySW5mbyAqZ2V0R2V0dGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuIEdldHRlck5hbWU7IH0KKyAgSWRlbnRpZmllckluZm8gKmdldEdldHRlck5hbWUoKSB7IHJldHVybiBHZXR0ZXJOYW1lOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldEdldHRlck5hbWVMb2MoKSBjb25zdCB7IHJldHVybiBHZXR0ZXJOYW1lTG9jOyB9CisgIHZvaWQgc2V0R2V0dGVyTmFtZShJZGVudGlmaWVySW5mbyAqbmFtZSwgU291cmNlTG9jYXRpb24gbG9jKSB7CisgICAgR2V0dGVyTmFtZSA9IG5hbWU7CisgICAgR2V0dGVyTmFtZUxvYyA9IGxvYzsKKyAgfQorCisgIGNvbnN0IElkZW50aWZpZXJJbmZvICpnZXRTZXR0ZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gU2V0dGVyTmFtZTsgfQorICBJZGVudGlmaWVySW5mbyAqZ2V0U2V0dGVyTmFtZSgpIHsgcmV0dXJuIFNldHRlck5hbWU7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0U2V0dGVyTmFtZUxvYygpIGNvbnN0IHsgcmV0dXJuIFNldHRlck5hbWVMb2M7IH0KKyAgdm9pZCBzZXRTZXR0ZXJOYW1lKElkZW50aWZpZXJJbmZvICpuYW1lLCBTb3VyY2VMb2NhdGlvbiBsb2MpIHsKKyAgICBTZXR0ZXJOYW1lID0gbmFtZTsKKyAgICBTZXR0ZXJOYW1lTG9jID0gbG9jOworICB9CisKK3ByaXZhdGU6CisgIC8vIEZJWE1FOiBUaGVzZSB0d28gYXJlIHVucmVsYXRlZCBhbmQgbXV0dWFsbHkgZXhjbHVzaXZlLiBTbyBwZXJoYXBzCisgIC8vIHdlIGNhbiBwdXQgdGhlbSBpbiBhIHVuaW9uIHRvIHJlZmxlY3QgdGhlaXIgbXV0dWFsIGV4Y2x1c2l2aXR5CisgIC8vIChzcGFjZSBzYXZpbmcgaXMgbmVnbGlnaWJsZSkuCisgIHVuc2lnbmVkIG9iamNEZWNsUXVhbGlmaWVyIDogNzsKKworICAvLyBOT1RFOiBWQysrIHRyZWF0cyBlbnVtcyBhcyBzaWduZWQsIGF2b2lkIHVzaW5nIE9iakNQcm9wZXJ0eUF0dHJpYnV0ZUtpbmQKKyAgdW5zaWduZWQgUHJvcGVydHlBdHRyaWJ1dGVzIDogMTU7CisKKyAgdW5zaWduZWQgTnVsbGFiaWxpdHkgOiAyOworCisgIFNvdXJjZUxvY2F0aW9uIE51bGxhYmlsaXR5TG9jOworCisgIElkZW50aWZpZXJJbmZvICpHZXR0ZXJOYW1lOyAgICAvLyBnZXR0ZXIgbmFtZSBvciBOVUxMIGlmIG5vIGdldHRlcgorICBJZGVudGlmaWVySW5mbyAqU2V0dGVyTmFtZTsgICAgLy8gc2V0dGVyIG5hbWUgb3IgTlVMTCBpZiBubyBzZXR0ZXIKKyAgU291cmNlTG9jYXRpb24gR2V0dGVyTmFtZUxvYzsgLy8gbG9jYXRpb24gb2YgdGhlIGdldHRlciBhdHRyaWJ1dGUncyB2YWx1ZQorICBTb3VyY2VMb2NhdGlvbiBTZXR0ZXJOYW1lTG9jOyAvLyBsb2NhdGlvbiBvZiB0aGUgc2V0dGVyIGF0dHJpYnV0ZSdzIHZhbHVlCisKK307CisKKy8vLyBcYnJpZWYgRGVzY3JpYmVzIHRoZSBraW5kIG9mIHVucXVhbGlmaWVkLWlkIHBhcnNlZC4KK2VudW0gY2xhc3MgVW5xdWFsaWZpZWRJZEtpbmQgeworICAvLy8gXGJyaWVmIEFuIGlkZW50aWZpZXIuCisgIElLX0lkZW50aWZpZXIsCisgIC8vLyBcYnJpZWYgQW4gb3ZlcmxvYWRlZCBvcGVyYXRvciBuYW1lLCBlLmcuLCBvcGVyYXRvcisuCisgIElLX09wZXJhdG9yRnVuY3Rpb25JZCwKKyAgLy8vIFxicmllZiBBIGNvbnZlcnNpb24gZnVuY3Rpb24gbmFtZSwgZS5nLiwgb3BlcmF0b3IgaW50LgorICBJS19Db252ZXJzaW9uRnVuY3Rpb25JZCwKKyAgLy8vIFxicmllZiBBIHVzZXItZGVmaW5lZCBsaXRlcmFsIG5hbWUsIGUuZy4sIG9wZXJhdG9yICIiIF9pLgorICBJS19MaXRlcmFsT3BlcmF0b3JJZCwKKyAgLy8vIFxicmllZiBBIGNvbnN0cnVjdG9yIG5hbWUuCisgIElLX0NvbnN0cnVjdG9yTmFtZSwKKyAgLy8vIFxicmllZiBBIGNvbnN0cnVjdG9yIG5hbWVkIHZpYSBhIHRlbXBsYXRlLWlkLgorICBJS19Db25zdHJ1Y3RvclRlbXBsYXRlSWQsCisgIC8vLyBcYnJpZWYgQSBkZXN0cnVjdG9yIG5hbWUuCisgIElLX0Rlc3RydWN0b3JOYW1lLAorICAvLy8gXGJyaWVmIEEgdGVtcGxhdGUtaWQsIGUuZy4sIGY8aW50Pi4KKyAgSUtfVGVtcGxhdGVJZCwKKyAgLy8vIFxicmllZiBBbiBpbXBsaWNpdCAnc2VsZicgcGFyYW1ldGVyCisgIElLX0ltcGxpY2l0U2VsZlBhcmFtLAorICAvLy8gXGJyaWVmIEEgZGVkdWN0aW9uLWd1aWRlIG5hbWUgKGEgdGVtcGxhdGUtbmFtZSkKKyAgSUtfRGVkdWN0aW9uR3VpZGVOYW1lCit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBDKysgdW5xdWFsaWZpZWQtaWQgdGhhdCBoYXMgYmVlbiBwYXJzZWQuIAorY2xhc3MgVW5xdWFsaWZpZWRJZCB7Citwcml2YXRlOgorICBVbnF1YWxpZmllZElkKGNvbnN0IFVucXVhbGlmaWVkSWQgJk90aGVyKSA9IGRlbGV0ZTsKKyAgY29uc3QgVW5xdWFsaWZpZWRJZCAmb3BlcmF0b3I9KGNvbnN0IFVucXVhbGlmaWVkSWQgJikgPSBkZWxldGU7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIGtpbmQgb2YgdW5xdWFsaWZpZWQtaWQgcGFyc2VkLgorICBVbnF1YWxpZmllZElkS2luZCBLaW5kOworCisgIHN0cnVjdCBPRkkgeworICAgIC8vLyBcYnJpZWYgVGhlIGtpbmQgb2Ygb3ZlcmxvYWRlZCBvcGVyYXRvci4KKyAgICBPdmVybG9hZGVkT3BlcmF0b3JLaW5kIE9wZXJhdG9yOworCisgICAgLy8vIFxicmllZiBUaGUgc291cmNlIGxvY2F0aW9ucyBvZiB0aGUgaW5kaXZpZHVhbCB0b2tlbnMgdGhhdCBuYW1lCisgICAgLy8vIHRoZSBvcGVyYXRvciwgZS5nLiwgdGhlICJuZXciLCAiWyIsIGFuZCAiXSIgdG9rZW5zIGluIAorICAgIC8vLyBvcGVyYXRvciBuZXcgW10uIAorICAgIC8vLworICAgIC8vLyBEaWZmZXJlbnQgb3BlcmF0b3JzIGhhdmUgZGlmZmVyZW50IG51bWJlcnMgb2YgdG9rZW5zIGluIHRoZWlyIG5hbWUsCisgICAgLy8vIHVwIHRvIHRocmVlLiBBbnkgcmVtYWluaW5nIHNvdXJjZSBsb2NhdGlvbnMgaW4gdGhpcyBhcnJheSB3aWxsIGJlCisgICAgLy8vIHNldCB0byBhbiBpbnZhbGlkIHZhbHVlIGZvciBvcGVyYXRvcnMgd2l0aCBmZXdlciB0aGFuIHRocmVlIHRva2Vucy4KKyAgICB1bnNpZ25lZCBTeW1ib2xMb2NhdGlvbnNbM107CisgIH07CisKKyAgLy8vIFxicmllZiBBbm9ueW1vdXMgdW5pb24gdGhhdCBob2xkcyBleHRyYSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgLy8vIHBhcnNlZCB1bnF1YWxpZmllZC1pZC4KKyAgdW5pb24geworICAgIC8vLyBcYnJpZWYgV2hlbiBLaW5kID09IElLX0lkZW50aWZpZXIsIHRoZSBwYXJzZWQgaWRlbnRpZmllciwgb3Igd2hlbgorICAgIC8vLyBLaW5kID09IElLX1VzZXJMaXRlcmFsSWQsIHRoZSBpZGVudGlmaWVyIHN1ZmZpeC4KKyAgICBJZGVudGlmaWVySW5mbyAqSWRlbnRpZmllcjsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFdoZW4gS2luZCA9PSBJS19PcGVyYXRvckZ1bmN0aW9uSWQsIHRoZSBvdmVybG9hZGVkIG9wZXJhdG9yCisgICAgLy8vIHRoYXQgd2UgcGFyc2VkLgorICAgIHN0cnVjdCBPRkkgT3BlcmF0b3JGdW5jdGlvbklkOworICAgIAorICAgIC8vLyBcYnJpZWYgV2hlbiBLaW5kID09IElLX0NvbnZlcnNpb25GdW5jdGlvbklkLCB0aGUgdHlwZSB0aGF0IHRoZSAKKyAgICAvLy8gY29udmVyc2lvbiBmdW5jdGlvbiBuYW1lcy4KKyAgICBVbmlvblBhcnNlZFR5cGUgQ29udmVyc2lvbkZ1bmN0aW9uSWQ7CisKKyAgICAvLy8gXGJyaWVmIFdoZW4gS2luZCA9PSBJS19Db25zdHJ1Y3Rvck5hbWUsIHRoZSBjbGFzcy1uYW1lIG9mIHRoZSB0eXBlCisgICAgLy8vIHdob3NlIGNvbnN0cnVjdG9yIGlzIGJlaW5nIHJlZmVyZW5jZWQuCisgICAgVW5pb25QYXJzZWRUeXBlIENvbnN0cnVjdG9yTmFtZTsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFdoZW4gS2luZCA9PSBJS19EZXN0cnVjdG9yTmFtZSwgdGhlIHR5cGUgcmVmZXJyZWQgdG8gYnkgdGhlCisgICAgLy8vIGNsYXNzLW5hbWUuCisgICAgVW5pb25QYXJzZWRUeXBlIERlc3RydWN0b3JOYW1lOworCisgICAgLy8vIFxicmllZiBXaGVuIEtpbmQgPT0gSUtfRGVkdWN0aW9uR3VpZGVOYW1lLCB0aGUgcGFyc2VkIHRlbXBsYXRlLW5hbWUuCisgICAgVW5pb25QYXJzZWRUZW1wbGF0ZVR5IFRlbXBsYXRlTmFtZTsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFdoZW4gS2luZCA9PSBJS19UZW1wbGF0ZUlkIG9yIElLX0NvbnN0cnVjdG9yVGVtcGxhdGVJZCwKKyAgICAvLy8gdGhlIHRlbXBsYXRlLWlkIGFubm90YXRpb24gdGhhdCBjb250YWlucyB0aGUgdGVtcGxhdGUgbmFtZSBhbmQKKyAgICAvLy8gdGVtcGxhdGUgYXJndW1lbnRzLgorICAgIFRlbXBsYXRlSWRBbm5vdGF0aW9uICpUZW1wbGF0ZUlkOworICB9OworICAKKyAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IHRva2VuIHRoYXQgZGVzY3JpYmVzIHRoaXMgdW5xdWFsaWZpZWQtaWQsCisgIC8vLyB3aGljaCB3aWxsIGJlIHRoZSBsb2NhdGlvbiBvZiB0aGUgaWRlbnRpZmllciwgIm9wZXJhdG9yIiBrZXl3b3JkLAorICAvLy8gdGlsZGUgKGZvciBhIGRlc3RydWN0b3IpLCBvciB0aGUgdGVtcGxhdGUgbmFtZSBvZiBhIHRlbXBsYXRlLWlkLgorICBTb3VyY2VMb2NhdGlvbiBTdGFydExvY2F0aW9uOworICAKKyAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgdG9rZW4gdGhhdCBkZXNjcmliZXMgdGhpcyB1bnF1YWxpZmllZC1pZC4KKyAgU291cmNlTG9jYXRpb24gRW5kTG9jYXRpb247CisKKyAgVW5xdWFsaWZpZWRJZCgpCisgICAgICA6IEtpbmQoVW5xdWFsaWZpZWRJZEtpbmQ6OklLX0lkZW50aWZpZXIpLCBJZGVudGlmaWVyKG51bGxwdHIpIHt9CisKKyAgLy8vIFxicmllZiBDbGVhciBvdXQgdGhpcyB1bnF1YWxpZmllZC1pZCwgc2V0dGluZyBpdCB0byBkZWZhdWx0IChpbnZhbGlkKSAKKyAgLy8vIHN0YXRlLgorICB2b2lkIGNsZWFyKCkgeworICAgIEtpbmQgPSBVbnF1YWxpZmllZElkS2luZDo6SUtfSWRlbnRpZmllcjsKKyAgICBJZGVudGlmaWVyID0gbnVsbHB0cjsKKyAgICBTdGFydExvY2F0aW9uID0gU291cmNlTG9jYXRpb24oKTsKKyAgICBFbmRMb2NhdGlvbiA9IFNvdXJjZUxvY2F0aW9uKCk7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB1bnF1YWxpZmllZC1pZCByZWZlcnMgdG8gYSB2YWxpZCBuYW1lLgorICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBTdGFydExvY2F0aW9uLmlzVmFsaWQoKTsgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB1bnF1YWxpZmllZC1pZCByZWZlcnMgdG8gYW4gaW52YWxpZCBuYW1lLgorICBib29sIGlzSW52YWxpZCgpIGNvbnN0IHsgcmV0dXJuICFpc1ZhbGlkKCk7IH0KKyAgCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoYXQga2luZCBvZiBuYW1lIHdlIGhhdmUuCisgIFVucXVhbGlmaWVkSWRLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisgIHZvaWQgc2V0S2luZChVbnF1YWxpZmllZElkS2luZCBraW5kKSB7IEtpbmQgPSBraW5kOyB9IAorICAKKyAgLy8vIFxicmllZiBTcGVjaWZ5IHRoYXQgdGhpcyB1bnF1YWxpZmllZC1pZCB3YXMgcGFyc2VkIGFzIGFuIGlkZW50aWZpZXIuCisgIC8vLworICAvLy8gXHBhcmFtIElkIHRoZSBwYXJzZWQgaWRlbnRpZmllci4KKyAgLy8vIFxwYXJhbSBJZExvYyB0aGUgbG9jYXRpb24gb2YgdGhlIHBhcnNlZCBpZGVudGlmaWVyLgorICB2b2lkIHNldElkZW50aWZpZXIoY29uc3QgSWRlbnRpZmllckluZm8gKklkLCBTb3VyY2VMb2NhdGlvbiBJZExvYykgeworICAgIEtpbmQgPSBVbnF1YWxpZmllZElkS2luZDo6SUtfSWRlbnRpZmllcjsKKyAgICBJZGVudGlmaWVyID0gY29uc3RfY2FzdDxJZGVudGlmaWVySW5mbyAqPihJZCk7CisgICAgU3RhcnRMb2NhdGlvbiA9IEVuZExvY2F0aW9uID0gSWRMb2M7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgU3BlY2lmeSB0aGF0IHRoaXMgdW5xdWFsaWZpZWQtaWQgd2FzIHBhcnNlZCBhcyBhbiAKKyAgLy8vIG9wZXJhdG9yLWZ1bmN0aW9uLWlkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBPcGVyYXRvckxvYyB0aGUgbG9jYXRpb24gb2YgdGhlICdvcGVyYXRvcicga2V5d29yZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gT3AgdGhlIG92ZXJsb2FkZWQgb3BlcmF0b3IuCisgIC8vLworICAvLy8gXHBhcmFtIFN5bWJvbExvY2F0aW9ucyB0aGUgbG9jYXRpb25zIG9mIHRoZSBpbmRpdmlkdWFsIG9wZXJhdG9yIHN5bWJvbHMKKyAgLy8vIGluIHRoZSBvcGVyYXRvci4KKyAgdm9pZCBzZXRPcGVyYXRvckZ1bmN0aW9uSWQoU291cmNlTG9jYXRpb24gT3BlcmF0b3JMb2MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVybG9hZGVkT3BlcmF0b3JLaW5kIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTeW1ib2xMb2NhdGlvbnNbM10pOworICAKKyAgLy8vIFxicmllZiBTcGVjaWZ5IHRoYXQgdGhpcyB1bnF1YWxpZmllZC1pZCB3YXMgcGFyc2VkIGFzIGEgCisgIC8vLyBjb252ZXJzaW9uLWZ1bmN0aW9uLWlkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBPcGVyYXRvckxvYyB0aGUgbG9jYXRpb24gb2YgdGhlICdvcGVyYXRvcicga2V5d29yZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gVHkgdGhlIHR5cGUgdG8gd2hpY2ggdGhpcyBjb252ZXJzaW9uIGZ1bmN0aW9uIGlzIGNvbnZlcnRpbmcuCisgIC8vLworICAvLy8gXHBhcmFtIEVuZExvYyB0aGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgdG9rZW4gdGhhdCBtYWtlcyB1cCB0aGUgdHlwZSBuYW1lLgorICB2b2lkIHNldENvbnZlcnNpb25GdW5jdGlvbklkKFNvdXJjZUxvY2F0aW9uIE9wZXJhdG9yTG9jLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYykgeworICAgIEtpbmQgPSBVbnF1YWxpZmllZElkS2luZDo6SUtfQ29udmVyc2lvbkZ1bmN0aW9uSWQ7CisgICAgU3RhcnRMb2NhdGlvbiA9IE9wZXJhdG9yTG9jOworICAgIEVuZExvY2F0aW9uID0gRW5kTG9jOworICAgIENvbnZlcnNpb25GdW5jdGlvbklkID0gVHk7CisgIH0KKworICAvLy8gXGJyaWVmIFNwZWNpZmljIHRoYXQgdGhpcyB1bnF1YWxpZmllZC1pZCB3YXMgcGFyc2VkIGFzIGEKKyAgLy8vIGxpdGVyYWwtb3BlcmF0b3ItaWQuCisgIC8vLworICAvLy8gXHBhcmFtIElkIHRoZSBwYXJzZWQgaWRlbnRpZmllci4KKyAgLy8vCisgIC8vLyBccGFyYW0gT3BMb2MgdGhlIGxvY2F0aW9uIG9mIHRoZSAnb3BlcmF0b3InIGtleXdvcmQuCisgIC8vLworICAvLy8gXHBhcmFtIElkTG9jIHRoZSBsb2NhdGlvbiBvZiB0aGUgaWRlbnRpZmllci4KKyAgdm9pZCBzZXRMaXRlcmFsT3BlcmF0b3JJZChjb25zdCBJZGVudGlmaWVySW5mbyAqSWQsIFNvdXJjZUxvY2F0aW9uIE9wTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRMb2MpIHsKKyAgICBLaW5kID0gVW5xdWFsaWZpZWRJZEtpbmQ6OklLX0xpdGVyYWxPcGVyYXRvcklkOworICAgIElkZW50aWZpZXIgPSBjb25zdF9jYXN0PElkZW50aWZpZXJJbmZvICo+KElkKTsKKyAgICBTdGFydExvY2F0aW9uID0gT3BMb2M7CisgICAgRW5kTG9jYXRpb24gPSBJZExvYzsKKyAgfQorICAKKyAgLy8vIFxicmllZiBTcGVjaWZ5IHRoYXQgdGhpcyB1bnF1YWxpZmllZC1pZCB3YXMgcGFyc2VkIGFzIGEgY29uc3RydWN0b3IgbmFtZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ2xhc3NUeXBlIHRoZSBjbGFzcyB0eXBlIHJlZmVycmVkIHRvIGJ5IHRoZSBjb25zdHJ1Y3RvciBuYW1lLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDbGFzc05hbWVMb2MgdGhlIGxvY2F0aW9uIG9mIHRoZSBjbGFzcyBuYW1lLgorICAvLy8KKyAgLy8vIFxwYXJhbSBFbmRMb2MgdGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IHRva2VuIHRoYXQgbWFrZXMgdXAgdGhlIHR5cGUgbmFtZS4KKyAgdm9pZCBzZXRDb25zdHJ1Y3Rvck5hbWUoUGFyc2VkVHlwZSBDbGFzc1R5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDbGFzc05hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYykgeworICAgIEtpbmQgPSBVbnF1YWxpZmllZElkS2luZDo6SUtfQ29uc3RydWN0b3JOYW1lOworICAgIFN0YXJ0TG9jYXRpb24gPSBDbGFzc05hbWVMb2M7CisgICAgRW5kTG9jYXRpb24gPSBFbmRMb2M7CisgICAgQ29uc3RydWN0b3JOYW1lID0gQ2xhc3NUeXBlOworICB9CisKKyAgLy8vIFxicmllZiBTcGVjaWZ5IHRoYXQgdGhpcyB1bnF1YWxpZmllZC1pZCB3YXMgcGFyc2VkIGFzIGEKKyAgLy8vIHRlbXBsYXRlLWlkIHRoYXQgbmFtZXMgYSBjb25zdHJ1Y3Rvci4KKyAgLy8vCisgIC8vLyBccGFyYW0gVGVtcGxhdGVJZCB0aGUgdGVtcGxhdGUtaWQgYW5ub3RhdGlvbiB0aGF0IGRlc2NyaWJlcyB0aGUgcGFyc2VkCisgIC8vLyB0ZW1wbGF0ZS1pZC4gVGhpcyBVbnF1YWxpZmllZElkIGluc3RhbmNlIHdpbGwgdGFrZSBvd25lcnNoaXAgb2YgdGhlCisgIC8vLyBccCBUZW1wbGF0ZUlkIGFuZCB3aWxsIGZyZWUgaXQgb24gZGVzdHJ1Y3Rpb24uCisgIHZvaWQgc2V0Q29uc3RydWN0b3JUZW1wbGF0ZUlkKFRlbXBsYXRlSWRBbm5vdGF0aW9uICpUZW1wbGF0ZUlkKTsKKworICAvLy8gXGJyaWVmIFNwZWNpZnkgdGhhdCB0aGlzIHVucXVhbGlmaWVkLWlkIHdhcyBwYXJzZWQgYXMgYSBkZXN0cnVjdG9yIG5hbWUuCisgIC8vLworICAvLy8gXHBhcmFtIFRpbGRlTG9jIHRoZSBsb2NhdGlvbiBvZiB0aGUgJ34nIHRoYXQgaW50cm9kdWNlcyB0aGUgZGVzdHJ1Y3RvcgorICAvLy8gbmFtZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ2xhc3NUeXBlIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyByZWZlcnJlZCB0byBieSB0aGUgZGVzdHJ1Y3RvciBuYW1lLgorICB2b2lkIHNldERlc3RydWN0b3JOYW1lKFNvdXJjZUxvY2F0aW9uIFRpbGRlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgQ2xhc3NUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYykgeworICAgIEtpbmQgPSBVbnF1YWxpZmllZElkS2luZDo6SUtfRGVzdHJ1Y3Rvck5hbWU7CisgICAgU3RhcnRMb2NhdGlvbiA9IFRpbGRlTG9jOworICAgIEVuZExvY2F0aW9uID0gRW5kTG9jOworICAgIERlc3RydWN0b3JOYW1lID0gQ2xhc3NUeXBlOworICB9CisgIAorICAvLy8gXGJyaWVmIFNwZWNpZnkgdGhhdCB0aGlzIHVucXVhbGlmaWVkLWlkIHdhcyBwYXJzZWQgYXMgYSB0ZW1wbGF0ZS1pZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gVGVtcGxhdGVJZCB0aGUgdGVtcGxhdGUtaWQgYW5ub3RhdGlvbiB0aGF0IGRlc2NyaWJlcyB0aGUgcGFyc2VkCisgIC8vLyB0ZW1wbGF0ZS1pZC4gVGhpcyBVbnF1YWxpZmllZElkIGluc3RhbmNlIHdpbGwgdGFrZSBvd25lcnNoaXAgb2YgdGhlCisgIC8vLyBccCBUZW1wbGF0ZUlkIGFuZCB3aWxsIGZyZWUgaXQgb24gZGVzdHJ1Y3Rpb24uCisgIHZvaWQgc2V0VGVtcGxhdGVJZChUZW1wbGF0ZUlkQW5ub3RhdGlvbiAqVGVtcGxhdGVJZCk7CisKKyAgLy8vIFxicmllZiBTcGVjaWZ5IHRoYXQgdGhpcyB1bnF1YWxpZmllZC1pZCB3YXMgcGFyc2VkIGFzIGEgdGVtcGxhdGUtbmFtZSBmb3IKKyAgLy8vIGEgZGVkdWN0aW9uLWd1aWRlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUZW1wbGF0ZSBUaGUgcGFyc2VkIHRlbXBsYXRlLW5hbWUuCisgIC8vLyBccGFyYW0gVGVtcGxhdGVMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBwYXJzZWQgdGVtcGxhdGUtbmFtZS4KKyAgdm9pZCBzZXREZWR1Y3Rpb25HdWlkZU5hbWUoUGFyc2VkVGVtcGxhdGVUeSBUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVMb2MpIHsKKyAgICBLaW5kID0gVW5xdWFsaWZpZWRJZEtpbmQ6OklLX0RlZHVjdGlvbkd1aWRlTmFtZTsKKyAgICBUZW1wbGF0ZU5hbWUgPSBUZW1wbGF0ZTsKKyAgICBTdGFydExvY2F0aW9uID0gRW5kTG9jYXRpb24gPSBUZW1wbGF0ZUxvYzsKKyAgfQorICAKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHNvdXJjZSByYW5nZSB0aGF0IGNvdmVycyB0aGlzIHVucXVhbGlmaWVkLWlkLgorICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyAKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoU3RhcnRMb2NhdGlvbiwgRW5kTG9jYXRpb24pOyAKKyAgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gU3RhcnRMb2NhdGlvbjsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIEVuZExvY2F0aW9uOyB9Cit9OworCisvLy8gXGJyaWVmIEEgc2V0IG9mIHRva2VucyB0aGF0IGhhcyBiZWVuIGNhY2hlZCBmb3IgbGF0ZXIgcGFyc2luZy4KK3R5cGVkZWYgU21hbGxWZWN0b3I8VG9rZW4sIDQ+IENhY2hlZFRva2VuczsKKworLy8vIFxicmllZiBPbmUgaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3QgaXMgdXNlZCBmb3IgZWFjaCB0eXBlIGluIGEKKy8vLyBkZWNsYXJhdG9yIHRoYXQgaXMgcGFyc2VkLgorLy8vCisvLy8gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBhIHNtYWxsIHZhbHVlIG9iamVjdC4KK3N0cnVjdCBEZWNsYXJhdG9yQ2h1bmsgeworICBlbnVtIHsKKyAgICBQb2ludGVyLCBSZWZlcmVuY2UsIEFycmF5LCBGdW5jdGlvbiwgQmxvY2tQb2ludGVyLCBNZW1iZXJQb2ludGVyLCBQYXJlbiwgUGlwZQorICB9IEtpbmQ7CisKKyAgLy8vIExvYyAtIFRoZSBwbGFjZSB3aGVyZSB0aGlzIHR5cGUgd2FzIGRlZmluZWQuCisgIFNvdXJjZUxvY2F0aW9uIExvYzsKKyAgLy8vIEVuZExvYyAtIElmIHZhbGlkLCB0aGUgcGxhY2Ugd2hlcmUgdGhpcyBjaHVuY2sgZW5kcy4KKyAgU291cmNlTG9jYXRpb24gRW5kTG9jOworCisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgeworICAgIGlmIChFbmRMb2MuaXNJbnZhbGlkKCkpCisgICAgICByZXR1cm4gU291cmNlUmFuZ2UoTG9jLCBMb2MpOworICAgIHJldHVybiBTb3VyY2VSYW5nZShMb2MsIEVuZExvYyk7CisgIH0KKworICBzdHJ1Y3QgVHlwZUluZm9Db21tb24geworICAgIEF0dHJpYnV0ZUxpc3QgKkF0dHJMaXN0OworICB9OworCisgIHN0cnVjdCBQb2ludGVyVHlwZUluZm8gOiBUeXBlSW5mb0NvbW1vbiB7CisgICAgLy8vIFRoZSB0eXBlIHF1YWxpZmllcnM6IGNvbnN0L3ZvbGF0aWxlL3Jlc3RyaWN0L3VuYWxpZ25lZC9hdG9taWMuCisgICAgdW5zaWduZWQgVHlwZVF1YWxzIDogNTsKKworICAgIC8vLyBUaGUgbG9jYXRpb24gb2YgdGhlIGNvbnN0LXF1YWxpZmllciwgaWYgYW55LgorICAgIHVuc2lnbmVkIENvbnN0UXVhbExvYzsKKworICAgIC8vLyBUaGUgbG9jYXRpb24gb2YgdGhlIHZvbGF0aWxlLXF1YWxpZmllciwgaWYgYW55LgorICAgIHVuc2lnbmVkIFZvbGF0aWxlUXVhbExvYzsKKworICAgIC8vLyBUaGUgbG9jYXRpb24gb2YgdGhlIHJlc3RyaWN0LXF1YWxpZmllciwgaWYgYW55LgorICAgIHVuc2lnbmVkIFJlc3RyaWN0UXVhbExvYzsKKworICAgIC8vLyBUaGUgbG9jYXRpb24gb2YgdGhlIF9BdG9taWMtcXVhbGlmaWVyLCBpZiBhbnkuCisgICAgdW5zaWduZWQgQXRvbWljUXVhbExvYzsKKworICAgIC8vLyBUaGUgbG9jYXRpb24gb2YgdGhlIF9fdW5hbGlnbmVkLXF1YWxpZmllciwgaWYgYW55LgorICAgIHVuc2lnbmVkIFVuYWxpZ25lZFF1YWxMb2M7CisKKyAgICB2b2lkIGRlc3Ryb3koKSB7CisgICAgfQorICB9OworCisgIHN0cnVjdCBSZWZlcmVuY2VUeXBlSW5mbyA6IFR5cGVJbmZvQ29tbW9uIHsKKyAgICAvLy8gVGhlIHR5cGUgcXVhbGlmaWVyOiByZXN0cmljdC4gW0dOVV0gQysrIGV4dGVuc2lvbgorICAgIGJvb2wgSGFzUmVzdHJpY3QgOiAxOworICAgIC8vLyBUcnVlIGlmIHRoaXMgaXMgYW4gbHZhbHVlIHJlZmVyZW5jZSwgZmFsc2UgaWYgaXQncyBhbiBydmFsdWUgcmVmZXJlbmNlLgorICAgIGJvb2wgTFZhbHVlUmVmIDogMTsKKyAgICB2b2lkIGRlc3Ryb3koKSB7CisgICAgfQorICB9OworCisgIHN0cnVjdCBBcnJheVR5cGVJbmZvIDogVHlwZUluZm9Db21tb24geworICAgIC8vLyBUaGUgdHlwZSBxdWFsaWZpZXJzIGZvciB0aGUgYXJyYXk6CisgICAgLy8vIGNvbnN0L3ZvbGF0aWxlL3Jlc3RyaWN0L19fdW5hbGlnbmVkL19BdG9taWMuCisgICAgdW5zaWduZWQgVHlwZVF1YWxzIDogNTsKKworICAgIC8vLyBUcnVlIGlmIHRoaXMgZGltZW5zaW9uIGluY2x1ZGVkIHRoZSAnc3RhdGljJyBrZXl3b3JkLgorICAgIHVuc2lnbmVkIGhhc1N0YXRpYyA6IDE7CisKKyAgICAvLy8gVHJ1ZSBpZiB0aGlzIGRpbWVuc2lvbiB3YXMgWypdLiAgSW4gdGhpcyBjYXNlLCBOdW1FbHRzIGlzIG51bGwuCisgICAgdW5zaWduZWQgaXNTdGFyIDogMTsKKworICAgIC8vLyBUaGlzIGlzIHRoZSBzaXplIG9mIHRoZSBhcnJheSwgb3IgbnVsbCBpZiBbXSBvciBbKl0gd2FzIHNwZWNpZmllZC4KKyAgICAvLy8gU2luY2UgdGhlIHBhcnNlciBpcyBtdWx0aS1wdXJwb3NlLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBpbXBvc2UgYSByb290CisgICAgLy8vIGV4cHJlc3Npb24gY2xhc3Mgb24gYWxsIGNsaWVudHMsIE51bUVsdHMgaXMgdW50eXBlZC4KKyAgICBFeHByICpOdW1FbHRzOworCisgICAgdm9pZCBkZXN0cm95KCkge30KKyAgfTsKKworICAvLy8gUGFyYW1JbmZvIC0gQW4gYXJyYXkgb2YgcGFyYW1pbmZvIG9iamVjdHMgaXMgYWxsb2NhdGVkIHdoZW5ldmVyIGEgZnVuY3Rpb24KKyAgLy8vIGRlY2xhcmF0b3IgaXMgcGFyc2VkLiAgVGhlcmUgYXJlIHR3byBpbnRlcmVzdGluZyBzdHlsZXMgb2YgcGFyYW1ldGVycworICAvLy8gaGVyZToKKyAgLy8vIEsmUi1zdHlsZSBpZGVudGlmaWVyIGxpc3RzIGFuZCBwYXJhbWV0ZXIgdHlwZSBsaXN0cy4gIEsmUi1zdHlsZSBpZGVudGlmaWVyCisgIC8vLyBsaXN0cyB3aWxsIGhhdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGlkZW50aWZpZXIsIGJ1dCBubyB0eXBlIGluZm9ybWF0aW9uLgorICAvLy8gUGFyYW1ldGVyIHR5cGUgbGlzdHMgd2lsbCBoYXZlIHR5cGUgaW5mbyAoaWYgdGhlIGFjdGlvbnMgbW9kdWxlIHByb3ZpZGVzCisgIC8vLyBpdCksIGJ1dCBtYXkgaGF2ZSBudWxsIGlkZW50aWZpZXIgaW5mbzogZS5nLiBmb3IgJ3ZvaWQgZm9vKGludCBYLCBpbnQpJy4KKyAgc3RydWN0IFBhcmFtSW5mbyB7CisgICAgSWRlbnRpZmllckluZm8gKklkZW50OworICAgIFNvdXJjZUxvY2F0aW9uIElkZW50TG9jOworICAgIERlY2wgKlBhcmFtOworCisgICAgLy8vIERlZmF1bHRBcmdUb2tlbnMgLSBXaGVuIHRoZSBwYXJhbWV0ZXIncyBkZWZhdWx0IGFyZ3VtZW50CisgICAgLy8vIGNhbm5vdCBiZSBwYXJzZWQgaW1tZWRpYXRlbHkgKGJlY2F1c2UgaXQgb2NjdXJzIHdpdGhpbiB0aGUKKyAgICAvLy8gZGVjbGFyYXRpb24gb2YgYSBtZW1iZXIgZnVuY3Rpb24pLCBpdCB3aWxsIGJlIHN0b3JlZCBoZXJlIGFzIGEKKyAgICAvLy8gc2VxdWVuY2Ugb2YgdG9rZW5zIHRvIGJlIHBhcnNlZCBvbmNlIHRoZSBjbGFzcyBkZWZpbml0aW9uIGlzCisgICAgLy8vIGNvbXBsZXRlLiBOb24tTlVMTCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGRlZmF1bHQgYXJndW1lbnQuCisgICAgc3RkOjp1bmlxdWVfcHRyPENhY2hlZFRva2Vucz4gRGVmYXVsdEFyZ1Rva2VuczsKKworICAgIFBhcmFtSW5mbygpID0gZGVmYXVsdDsKKyAgICBQYXJhbUluZm8oSWRlbnRpZmllckluZm8gKmlkZW50LCBTb3VyY2VMb2NhdGlvbiBpbG9jLAorICAgICAgICAgICAgICBEZWNsICpwYXJhbSwKKyAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENhY2hlZFRva2Vucz4gRGVmQXJnVG9rZW5zID0gbnVsbHB0cikKKyAgICAgIDogSWRlbnQoaWRlbnQpLCBJZGVudExvYyhpbG9jKSwgUGFyYW0ocGFyYW0pLAorICAgICAgICBEZWZhdWx0QXJnVG9rZW5zKHN0ZDo6bW92ZShEZWZBcmdUb2tlbnMpKSB7fQorICB9OworCisgIHN0cnVjdCBUeXBlQW5kUmFuZ2UgeworICAgIFBhcnNlZFR5cGUgVHk7CisgICAgU291cmNlUmFuZ2UgUmFuZ2U7CisgIH07CisKKyAgc3RydWN0IEZ1bmN0aW9uVHlwZUluZm8gOiBUeXBlSW5mb0NvbW1vbiB7CisgICAgLy8vIGhhc1Byb3RvdHlwZSAtIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gaGFkIGF0IGxlYXN0IG9uZSB0eXBlZAorICAgIC8vLyBwYXJhbWV0ZXIuICBJZiB0aGUgZnVuY3Rpb24gaXMgKCkgb3IgKGEsYixjKSwgdGhlbiBpdCBoYXMgbm8gcHJvdG90eXBlLAorICAgIC8vLyBhbmQgaXMgdHJlYXRlZCBhcyBhIEsmUi1zdHlsZSBmdW5jdGlvbi4KKyAgICB1bnNpZ25lZCBoYXNQcm90b3R5cGUgOiAxOworCisgICAgLy8vIGlzVmFyaWFkaWMgLSBJZiB0aGlzIGZ1bmN0aW9uIGhhcyBhIHByb3RvdHlwZSwgYW5kIGlmIHRoYXQKKyAgICAvLy8gcHJvdG8gZW5kcyB3aXRoICcsLi4uKScsIHRoaXMgaXMgdHJ1ZS4gV2hlbiB0cnVlLCBFbGxpcHNpc0xvYworICAgIC8vLyBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIGVsbGlwc2lzLgorICAgIHVuc2lnbmVkIGlzVmFyaWFkaWMgOiAxOworCisgICAgLy8vIENhbiB0aGlzIGRlY2xhcmF0aW9uIGJlIGEgY29uc3RydWN0b3Itc3R5bGUgaW5pdGlhbGl6ZXI/CisgICAgdW5zaWduZWQgaXNBbWJpZ3VvdXMgOiAxOworCisgICAgLy8vIFxicmllZiBXaGV0aGVyIHRoZSByZWYtcXVhbGlmaWVyIChpZiBhbnkpIGlzIGFuIGx2YWx1ZSByZWZlcmVuY2UuCisgICAgLy8vIE90aGVyd2lzZSwgaXQncyBhbiBydmFsdWUgcmVmZXJlbmNlLgorICAgIHVuc2lnbmVkIFJlZlF1YWxpZmllcklzTFZhbHVlUmVmIDogMTsKKworICAgIC8vLyBUaGUgdHlwZSBxdWFsaWZpZXJzOiBjb25zdC92b2xhdGlsZS9yZXN0cmljdC9fX3VuYWxpZ25lZAorICAgIC8vLyBUaGUgcXVhbGlmaWVyIGJpdG1hc2sgdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyBpbiBRdWFsVHlwZS4KKyAgICB1bnNpZ25lZCBUeXBlUXVhbHMgOiA0OworCisgICAgLy8vIEV4Y2VwdGlvblNwZWNUeXBlIC0gQW4gRXhjZXB0aW9uU3BlY2lmaWNhdGlvblR5cGUgdmFsdWUuCisgICAgdW5zaWduZWQgRXhjZXB0aW9uU3BlY1R5cGUgOiA0OworCisgICAgLy8vIERlbGV0ZVBhcmFtcyAtIElmIHRoaXMgaXMgdHJ1ZSwgd2UgbmVlZCB0byBkZWxldGVbXSBQYXJhbXMuCisgICAgdW5zaWduZWQgRGVsZXRlUGFyYW1zIDogMTsKKworICAgIC8vLyBIYXNUcmFpbGluZ1JldHVyblR5cGUgLSBJZiB0aGlzIGlzIHRydWUsIGEgdHJhaWxpbmcgcmV0dXJuIHR5cGUgd2FzCisgICAgLy8vIHNwZWNpZmllZC4KKyAgICB1bnNpZ25lZCBIYXNUcmFpbGluZ1JldHVyblR5cGUgOiAxOworCisgICAgLy8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgbGVmdCBwYXJlbnRoZXNpcyBpbiB0aGUgc291cmNlLgorICAgIHVuc2lnbmVkIExQYXJlbkxvYzsKKworICAgIC8vLyBXaGVuIGlzVmFyaWFkaWMgaXMgdHJ1ZSwgdGhlIGxvY2F0aW9uIG9mIHRoZSBlbGxpcHNpcyBpbiB0aGUgc291cmNlLgorICAgIHVuc2lnbmVkIEVsbGlwc2lzTG9jOworCisgICAgLy8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmlnaHQgcGFyZW50aGVzaXMgaW4gdGhlIHNvdXJjZS4KKyAgICB1bnNpZ25lZCBSUGFyZW5Mb2M7CisKKyAgICAvLy8gTnVtUGFyYW1zIC0gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGZvcm1hbCBwYXJhbWV0ZXJzIHNwZWNpZmllZCBieSB0aGUKKyAgICAvLy8gZGVjbGFyYXRvci4KKyAgICB1bnNpZ25lZCBOdW1QYXJhbXM7CisKKyAgICAvLy8gTnVtRXhjZXB0aW9uc09yRGVjbHMgLSBUaGlzIGlzIHRoZSBudW1iZXIgb2YgdHlwZXMgaW4gdGhlCisgICAgLy8vIGR5bmFtaWMtZXhjZXB0aW9uLWRlY2wsIGlmIHRoZSBmdW5jdGlvbiBoYXMgb25lLiBJbiBDLCB0aGlzIGlzIHRoZQorICAgIC8vLyBudW1iZXIgb2YgZGVjbGFyYXRpb25zIGluIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUuCisgICAgdW5zaWduZWQgTnVtRXhjZXB0aW9uc09yRGVjbHM7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVmLXF1YWxpZmllciwgaWYgYW55LgorICAgIC8vLworICAgIC8vLyBJZiB0aGlzIGlzIGFuIGludmFsaWQgbG9jYXRpb24sIHRoZXJlIGlzIG5vIHJlZi1xdWFsaWZpZXIuCisgICAgdW5zaWduZWQgUmVmUXVhbGlmaWVyTG9jOworCisgICAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIGNvbnN0LXF1YWxpZmllciwgaWYgYW55LgorICAgIC8vLworICAgIC8vLyBJZiB0aGlzIGlzIGFuIGludmFsaWQgbG9jYXRpb24sIHRoZXJlIGlzIG5vIGNvbnN0LXF1YWxpZmllci4KKyAgICB1bnNpZ25lZCBDb25zdFF1YWxpZmllckxvYzsKKworICAgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSB2b2xhdGlsZS1xdWFsaWZpZXIsIGlmIGFueS4KKyAgICAvLy8KKyAgICAvLy8gSWYgdGhpcyBpcyBhbiBpbnZhbGlkIGxvY2F0aW9uLCB0aGVyZSBpcyBubyB2b2xhdGlsZS1xdWFsaWZpZXIuCisgICAgdW5zaWduZWQgVm9sYXRpbGVRdWFsaWZpZXJMb2M7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzdHJpY3QtcXVhbGlmaWVyLCBpZiBhbnkuCisgICAgLy8vCisgICAgLy8vIElmIHRoaXMgaXMgYW4gaW52YWxpZCBsb2NhdGlvbiwgdGhlcmUgaXMgbm8gcmVzdHJpY3QtcXVhbGlmaWVyLgorICAgIHVuc2lnbmVkIFJlc3RyaWN0UXVhbGlmaWVyTG9jOworCisgICAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlICdtdXRhYmxlJyBxdWFsaWZlciBpbiBhIGxhbWJkYS1kZWNsYXJhdG9yLCBpZgorICAgIC8vLyBhbnkuCisgICAgdW5zaWduZWQgTXV0YWJsZUxvYzsKKworICAgIC8vLyBcYnJpZWYgVGhlIGJlZ2lubmluZyBsb2NhdGlvbiBvZiB0aGUgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24sIGlmIGFueS4KKyAgICB1bnNpZ25lZCBFeGNlcHRpb25TcGVjTG9jQmVnOworCisgICAgLy8vIFxicmllZiBUaGUgZW5kIGxvY2F0aW9uIG9mIHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiwgaWYgYW55LgorICAgIHVuc2lnbmVkIEV4Y2VwdGlvblNwZWNMb2NFbmQ7CisKKyAgICAvLy8gUGFyYW1zIC0gVGhpcyBpcyBhIHBvaW50ZXIgdG8gYSBuZXdbXSdkIGFycmF5IG9mIFBhcmFtSW5mbyBvYmplY3RzIHRoYXQKKyAgICAvLy8gZGVzY3JpYmUgdGhlIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGJ5IHRoaXMgZnVuY3Rpb24gZGVjbGFyYXRvci4gIG51bGwgaWYKKyAgICAvLy8gdGhlcmUgYXJlIG5vIHBhcmFtZXRlcnMgc3BlY2lmaWVkLgorICAgIFBhcmFtSW5mbyAqUGFyYW1zOworCisgICAgdW5pb24geworICAgICAgLy8vIFxicmllZiBQb2ludGVyIHRvIGEgbmV3W10nZCBhcnJheSBvZiBUeXBlQW5kUmFuZ2Ugb2JqZWN0cyB0aGF0CisgICAgICAvLy8gY29udGFpbiB0aGUgdHlwZXMgaW4gdGhlIGZ1bmN0aW9uJ3MgZHluYW1pYyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbgorICAgICAgLy8vIGFuZCB0aGVpciBsb2NhdGlvbnMsIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgIFR5cGVBbmRSYW5nZSAqRXhjZXB0aW9uczsKKworICAgICAgLy8vIFxicmllZiBQb2ludGVyIHRvIHRoZSBleHByZXNzaW9uIGluIHRoZSBub2V4Y2VwdC1zcGVjaWZpZXIgb2YgdGhpcworICAgICAgLy8vIGZ1bmN0aW9uLCBpZiBpdCBoYXMgb25lLgorICAgICAgRXhwciAqTm9leGNlcHRFeHByOworICAKKyAgICAgIC8vLyBcYnJpZWYgUG9pbnRlciB0byB0aGUgY2FjaGVkIHRva2VucyBmb3IgYW4gZXhjZXB0aW9uLXNwZWNpZmljYXRpb24KKyAgICAgIC8vLyB0aGF0IGhhcyBub3QgeWV0IGJlZW4gcGFyc2VkLgorICAgICAgQ2FjaGVkVG9rZW5zICpFeGNlcHRpb25TcGVjVG9rZW5zOworCisgICAgICAvLy8gUG9pbnRlciB0byBhIG5ld1tdJ2QgYXJyYXkgb2YgZGVjbGFyYXRpb25zIHRoYXQgbmVlZCB0byBiZSBhdmFpbGFibGUKKyAgICAgIC8vLyBmb3IgbG9va3VwIGluc2lkZSB0aGUgZnVuY3Rpb24gYm9keSwgaWYgb25lIGV4aXN0cy4gRG9lcyBub3QgZXhpc3QgaW4KKyAgICAgIC8vLyBDKysuCisgICAgICBOYW1lZERlY2wgKipEZWNsc0luUHJvdG90eXBlOworICAgIH07CisKKyAgICAvLy8gXGJyaWVmIElmIEhhc1RyYWlsaW5nUmV0dXJuVHlwZSBpcyB0cnVlLCB0aGlzIGlzIHRoZSB0cmFpbGluZyByZXR1cm4KKyAgICAvLy8gdHlwZSBzcGVjaWZpZWQuCisgICAgVW5pb25QYXJzZWRUeXBlIFRyYWlsaW5nUmV0dXJuVHlwZTsKKworICAgIC8vLyBcYnJpZWYgUmVzZXQgdGhlIHBhcmFtZXRlciBsaXN0IHRvIGhhdmluZyB6ZXJvIHBhcmFtZXRlcnMuCisgICAgLy8vCisgICAgLy8vIFRoaXMgaXMgdXNlZCBpbiB2YXJpb3VzIHBsYWNlcyBmb3IgZXJyb3IgcmVjb3ZlcnkuCisgICAgdm9pZCBmcmVlUGFyYW1zKCkgeworICAgICAgZm9yICh1bnNpZ25lZCBJID0gMDsgSSA8IE51bVBhcmFtczsgKytJKQorICAgICAgICBQYXJhbXNbSV0uRGVmYXVsdEFyZ1Rva2Vucy5yZXNldCgpOworICAgICAgaWYgKERlbGV0ZVBhcmFtcykgeworICAgICAgICBkZWxldGVbXSBQYXJhbXM7CisgICAgICAgIERlbGV0ZVBhcmFtcyA9IGZhbHNlOworICAgICAgfQorICAgICAgTnVtUGFyYW1zID0gMDsKKyAgICB9CisKKyAgICB2b2lkIGRlc3Ryb3koKSB7CisgICAgICBpZiAoRGVsZXRlUGFyYW1zKQorICAgICAgICBkZWxldGVbXSBQYXJhbXM7CisgICAgICBzd2l0Y2ggKGdldEV4Y2VwdGlvblNwZWNUeXBlKCkpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFU1RfRHluYW1pYzoKKyAgICAgICAgZGVsZXRlW10gRXhjZXB0aW9uczsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVTVF9VbnBhcnNlZDoKKyAgICAgICAgZGVsZXRlIEV4Y2VwdGlvblNwZWNUb2tlbnM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFU1RfTm9uZToKKyAgICAgICAgaWYgKE51bUV4Y2VwdGlvbnNPckRlY2xzICE9IDApCisgICAgICAgICAgZGVsZXRlW10gRGVjbHNJblByb3RvdHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIGlzS05SUHJvdG90eXBlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIEsmUiBzdHlsZSBpZGVudGlmaWVyIGxpc3QsCisgICAgLy8vIGxpa2UgInZvaWQgZm9vKGEsYixjKSIuICBJbiBhIGZ1bmN0aW9uIGRlZmluaXRpb24sIHRoaXMgd2lsbCBiZSBmb2xsb3dlZAorICAgIC8vLyBieSB0aGUgcGFyYW1ldGVyIHR5cGUgZGVmaW5pdGlvbnMuCisgICAgYm9vbCBpc0tOUlByb3RvdHlwZSgpIGNvbnN0IHsgcmV0dXJuICFoYXNQcm90b3R5cGUgJiYgTnVtUGFyYW1zICE9IDA7IH0KKworICAgIFNvdXJjZUxvY2F0aW9uIGdldExQYXJlbkxvYygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKExQYXJlbkxvYyk7CisgICAgfQorCisgICAgU291cmNlTG9jYXRpb24gZ2V0RWxsaXBzaXNMb2MoKSBjb25zdCB7CisgICAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZyhFbGxpcHNpc0xvYyk7CisgICAgfQorCisgICAgU291cmNlTG9jYXRpb24gZ2V0UlBhcmVuTG9jKCkgY29uc3QgeworICAgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoUlBhcmVuTG9jKTsKKyAgICB9CisKKyAgICBTb3VyY2VMb2NhdGlvbiBnZXRFeGNlcHRpb25TcGVjTG9jQmVnKCkgY29uc3QgeworICAgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoRXhjZXB0aW9uU3BlY0xvY0JlZyk7CisgICAgfQorCisgICAgU291cmNlTG9jYXRpb24gZ2V0RXhjZXB0aW9uU3BlY0xvY0VuZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKEV4Y2VwdGlvblNwZWNMb2NFbmQpOworICAgIH0KKworICAgIFNvdXJjZVJhbmdlIGdldEV4Y2VwdGlvblNwZWNSYW5nZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRFeGNlcHRpb25TcGVjTG9jQmVnKCksIGdldEV4Y2VwdGlvblNwZWNMb2NFbmQoKSk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIHJlZi1xdWFsaWZpZXIsIGlmIGFueS4KKyAgICBTb3VyY2VMb2NhdGlvbiBnZXRSZWZRdWFsaWZpZXJMb2MoKSBjb25zdCB7CisgICAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZyhSZWZRdWFsaWZpZXJMb2MpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSAnY29uc3QnIHF1YWxpZmllciwgaWYgYW55LgorICAgIFNvdXJjZUxvY2F0aW9uIGdldENvbnN0UXVhbGlmaWVyTG9jKCkgY29uc3QgeworICAgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoQ29uc3RRdWFsaWZpZXJMb2MpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSAndm9sYXRpbGUnIHF1YWxpZmllciwgaWYgYW55LgorICAgIFNvdXJjZUxvY2F0aW9uIGdldFZvbGF0aWxlUXVhbGlmaWVyTG9jKCkgY29uc3QgeworICAgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoVm9sYXRpbGVRdWFsaWZpZXJMb2MpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSAncmVzdHJpY3QnIHF1YWxpZmllciwgaWYgYW55LgorICAgIFNvdXJjZUxvY2F0aW9uIGdldFJlc3RyaWN0UXVhbGlmaWVyTG9jKCkgY29uc3QgeworICAgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoUmVzdHJpY3RRdWFsaWZpZXJMb2MpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSAnbXV0YWJsZScgcXVhbGlmaWVyLCBpZiBhbnkuCisgICAgU291cmNlTG9jYXRpb24gZ2V0TXV0YWJsZUxvYygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKE11dGFibGVMb2MpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBmdW5jdGlvbiBkZWNsYXJhdGlvbiBjb250YWlucyBhIAorICAgIC8vLyByZWYtcXVhbGlmaWVyLgorICAgIGJvb2wgaGFzUmVmUXVhbGlmaWVyKCkgY29uc3QgeyByZXR1cm4gZ2V0UmVmUXVhbGlmaWVyTG9jKCkuaXNWYWxpZCgpOyB9CisKKyAgICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgbGFtYmRhLWRlY2xhcmF0b3IgY29udGFpbnMgYSAnbXV0YWJsZScKKyAgICAvLy8gcXVhbGlmaWVyLgorICAgIGJvb2wgaGFzTXV0YWJsZVF1YWxpZmllcigpIGNvbnN0IHsgcmV0dXJuIGdldE11dGFibGVMb2MoKS5pc1ZhbGlkKCk7IH0KKworICAgIC8vLyBcYnJpZWYgR2V0IHRoZSB0eXBlIG9mIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIHRoaXMgZnVuY3Rpb24gaGFzLgorICAgIEV4Y2VwdGlvblNwZWNpZmljYXRpb25UeXBlIGdldEV4Y2VwdGlvblNwZWNUeXBlKCkgY29uc3QgeworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEV4Y2VwdGlvblNwZWNpZmljYXRpb25UeXBlPihFeGNlcHRpb25TcGVjVHlwZSk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBHZXQgdGhlIG51bWJlciBvZiBkeW5hbWljIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucy4KKyAgICB1bnNpZ25lZCBnZXROdW1FeGNlcHRpb25zKCkgY29uc3QgeworICAgICAgYXNzZXJ0KEV4Y2VwdGlvblNwZWNUeXBlICE9IEVTVF9Ob25lKTsKKyAgICAgIHJldHVybiBOdW1FeGNlcHRpb25zT3JEZWNsczsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIEdldCB0aGUgbm9uLXBhcmFtZXRlciBkZWNscyBkZWZpbmVkIHdpdGhpbiB0aGlzIGZ1bmN0aW9uCisgICAgLy8vIHByb3RvdHlwZS4gVHlwaWNhbGx5IHRoZXNlIGFyZSB0YWcgZGVjbGFyYXRpb25zLgorICAgIEFycmF5UmVmPE5hbWVkRGVjbCAqPiBnZXREZWNsc0luUHJvdG90eXBlKCkgY29uc3QgeworICAgICAgYXNzZXJ0KEV4Y2VwdGlvblNwZWNUeXBlID09IEVTVF9Ob25lKTsKKyAgICAgIHJldHVybiBsbHZtOjptYWtlQXJyYXlSZWYoRGVjbHNJblByb3RvdHlwZSwgTnVtRXhjZXB0aW9uc09yRGVjbHMpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBmdW5jdGlvbiBkZWNsYXJhdG9yIGhhZCBhCisgICAgLy8vIHRyYWlsaW5nLXJldHVybi10eXBlLgorICAgIGJvb2wgaGFzVHJhaWxpbmdSZXR1cm5UeXBlKCkgY29uc3QgeyByZXR1cm4gSGFzVHJhaWxpbmdSZXR1cm5UeXBlOyB9CisKKyAgICAvLy8gXGJyaWVmIEdldCB0aGUgdHJhaWxpbmctcmV0dXJuLXR5cGUgZm9yIHRoaXMgZnVuY3Rpb24gZGVjbGFyYXRvci4KKyAgICBQYXJzZWRUeXBlIGdldFRyYWlsaW5nUmV0dXJuVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFRyYWlsaW5nUmV0dXJuVHlwZTsgfQorICB9OworCisgIHN0cnVjdCBCbG9ja1BvaW50ZXJUeXBlSW5mbyA6IFR5cGVJbmZvQ29tbW9uIHsKKyAgICAvLy8gRm9yIG5vdywgc2VtYSB3aWxsIGNhdGNoIHRoZXNlIGFzIGludmFsaWQuCisgICAgLy8vIFRoZSB0eXBlIHF1YWxpZmllcnM6IGNvbnN0L3ZvbGF0aWxlL3Jlc3RyaWN0L19fdW5hbGlnbmVkL19BdG9taWMuCisgICAgdW5zaWduZWQgVHlwZVF1YWxzIDogNTsKKworICAgIHZvaWQgZGVzdHJveSgpIHsKKyAgICB9CisgIH07CisKKyAgc3RydWN0IE1lbWJlclBvaW50ZXJUeXBlSW5mbyA6IFR5cGVJbmZvQ29tbW9uIHsKKyAgICAvLy8gVGhlIHR5cGUgcXVhbGlmaWVyczogY29uc3Qvdm9sYXRpbGUvcmVzdHJpY3QvX191bmFsaWduZWQvX0F0b21pYy4KKyAgICB1bnNpZ25lZCBUeXBlUXVhbHMgOiA1OworICAgIC8vIENYWFNjb3BlU3BlYyBoYXMgYSBjb25zdHJ1Y3Rvciwgc28gaXQgY2FuJ3QgYmUgYSBkaXJlY3QgbWVtYmVyLgorICAgIC8vIFNvIHdlIG5lZWQgc29tZSBwb2ludGVyLWFsaWduZWQgc3RvcmFnZSBhbmQgYSBiaXQgb2YgdHJpY2tlcnkuCisgICAgYWxpZ25hcyhDWFhTY29wZVNwZWMpIGNoYXIgU2NvcGVNZW1bc2l6ZW9mKENYWFNjb3BlU3BlYyldOworICAgIENYWFNjb3BlU3BlYyAmU2NvcGUoKSB7CisgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Q1hYU2NvcGVTcGVjICo+KFNjb3BlTWVtKTsKKyAgICB9CisgICAgY29uc3QgQ1hYU2NvcGVTcGVjICZTY29wZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDWFhTY29wZVNwZWMgKj4oU2NvcGVNZW0pOworICAgIH0KKyAgICB2b2lkIGRlc3Ryb3koKSB7CisgICAgICBTY29wZSgpLn5DWFhTY29wZVNwZWMoKTsKKyAgICB9CisgIH07CisKKyAgc3RydWN0IFBpcGVUeXBlSW5mbyA6IFR5cGVJbmZvQ29tbW9uIHsKKyAgLy8vIFRoZSBhY2Nlc3Mgd3JpdGVzLgorICB1bnNpZ25lZCBBY2Nlc3NXcml0ZXMgOiAzOworCisgIHZvaWQgZGVzdHJveSgpIHt9CisgIH07CisKKyAgdW5pb24geworICAgIFR5cGVJbmZvQ29tbW9uICAgICAgICBDb21tb247CisgICAgUG9pbnRlclR5cGVJbmZvICAgICAgIFB0cjsKKyAgICBSZWZlcmVuY2VUeXBlSW5mbyAgICAgUmVmOworICAgIEFycmF5VHlwZUluZm8gICAgICAgICBBcnI7CisgICAgRnVuY3Rpb25UeXBlSW5mbyAgICAgIEZ1bjsKKyAgICBCbG9ja1BvaW50ZXJUeXBlSW5mbyAgQ2xzOworICAgIE1lbWJlclBvaW50ZXJUeXBlSW5mbyBNZW07CisgICAgUGlwZVR5cGVJbmZvICAgICAgICAgIFBpcGVJbmZvOworICB9OworCisgIHZvaWQgZGVzdHJveSgpIHsKKyAgICBzd2l0Y2ggKEtpbmQpIHsKKyAgICBjYXNlIERlY2xhcmF0b3JDaHVuazo6RnVuY3Rpb246ICAgICAgcmV0dXJuIEZ1bi5kZXN0cm95KCk7CisgICAgY2FzZSBEZWNsYXJhdG9yQ2h1bms6OlBvaW50ZXI6ICAgICAgIHJldHVybiBQdHIuZGVzdHJveSgpOworICAgIGNhc2UgRGVjbGFyYXRvckNodW5rOjpCbG9ja1BvaW50ZXI6ICByZXR1cm4gQ2xzLmRlc3Ryb3koKTsKKyAgICBjYXNlIERlY2xhcmF0b3JDaHVuazo6UmVmZXJlbmNlOiAgICAgcmV0dXJuIFJlZi5kZXN0cm95KCk7CisgICAgY2FzZSBEZWNsYXJhdG9yQ2h1bms6OkFycmF5OiAgICAgICAgIHJldHVybiBBcnIuZGVzdHJveSgpOworICAgIGNhc2UgRGVjbGFyYXRvckNodW5rOjpNZW1iZXJQb2ludGVyOiByZXR1cm4gTWVtLmRlc3Ryb3koKTsKKyAgICBjYXNlIERlY2xhcmF0b3JDaHVuazo6UGFyZW46ICAgICAgICAgcmV0dXJuOworICAgIGNhc2UgRGVjbGFyYXRvckNodW5rOjpQaXBlOiAgICAgICAgICByZXR1cm4gUGlwZUluZm8uZGVzdHJveSgpOworICAgIH0KKyAgfQorCisgIC8vLyBcYnJpZWYgSWYgdGhlcmUgYXJlIGF0dHJpYnV0ZXMgYXBwbGllZCB0byB0aGlzIGRlY2xhcmF0b3JjaHVuaywgcmV0dXJuCisgIC8vLyB0aGVtLgorICBjb25zdCBBdHRyaWJ1dGVMaXN0ICpnZXRBdHRycygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29tbW9uLkF0dHJMaXN0OworICB9CisKKyAgQXR0cmlidXRlTGlzdCAqJmdldEF0dHJMaXN0UmVmKCkgeworICAgIHJldHVybiBDb21tb24uQXR0ckxpc3Q7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhIERlY2xhcmF0b3JDaHVuayBmb3IgYSBwb2ludGVyLgorICBzdGF0aWMgRGVjbGFyYXRvckNodW5rIGdldFBvaW50ZXIodW5zaWduZWQgVHlwZVF1YWxzLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb25zdFF1YWxMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBWb2xhdGlsZVF1YWxMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSZXN0cmljdFF1YWxMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdG9taWNRdWFsTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVW5hbGlnbmVkUXVhbExvYykgeworICAgIERlY2xhcmF0b3JDaHVuayBJOworICAgIEkuS2luZCAgICAgICAgICAgICAgICA9IFBvaW50ZXI7CisgICAgSS5Mb2MgICAgICAgICAgICAgICAgID0gTG9jOworICAgIEkuUHRyLlR5cGVRdWFscyAgICAgICA9IFR5cGVRdWFsczsKKyAgICBJLlB0ci5Db25zdFF1YWxMb2MgICAgPSBDb25zdFF1YWxMb2MuZ2V0UmF3RW5jb2RpbmcoKTsKKyAgICBJLlB0ci5Wb2xhdGlsZVF1YWxMb2MgPSBWb2xhdGlsZVF1YWxMb2MuZ2V0UmF3RW5jb2RpbmcoKTsKKyAgICBJLlB0ci5SZXN0cmljdFF1YWxMb2MgPSBSZXN0cmljdFF1YWxMb2MuZ2V0UmF3RW5jb2RpbmcoKTsKKyAgICBJLlB0ci5BdG9taWNRdWFsTG9jICAgPSBBdG9taWNRdWFsTG9jLmdldFJhd0VuY29kaW5nKCk7CisgICAgSS5QdHIuVW5hbGlnbmVkUXVhbExvYyA9IFVuYWxpZ25lZFF1YWxMb2MuZ2V0UmF3RW5jb2RpbmcoKTsKKyAgICBJLlB0ci5BdHRyTGlzdCAgICAgICAgPSBudWxscHRyOworICAgIHJldHVybiBJOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSBEZWNsYXJhdG9yQ2h1bmsgZm9yIGEgcmVmZXJlbmNlLgorICBzdGF0aWMgRGVjbGFyYXRvckNodW5rIGdldFJlZmVyZW5jZSh1bnNpZ25lZCBUeXBlUXVhbHMsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsdmFsdWUpIHsKKyAgICBEZWNsYXJhdG9yQ2h1bmsgSTsKKyAgICBJLktpbmQgICAgICAgICAgICA9IFJlZmVyZW5jZTsKKyAgICBJLkxvYyAgICAgICAgICAgICA9IExvYzsKKyAgICBJLlJlZi5IYXNSZXN0cmljdCA9IChUeXBlUXVhbHMgJiBEZWNsU3BlYzo6VFFfcmVzdHJpY3QpICE9IDA7CisgICAgSS5SZWYuTFZhbHVlUmVmICAgPSBsdmFsdWU7CisgICAgSS5SZWYuQXR0ckxpc3QgICAgPSBudWxscHRyOworICAgIHJldHVybiBJOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSBEZWNsYXJhdG9yQ2h1bmsgZm9yIGFuIGFycmF5LgorICBzdGF0aWMgRGVjbGFyYXRvckNodW5rIGdldEFycmF5KHVuc2lnbmVkIFR5cGVRdWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RhdGljLCBib29sIGlzU3RhciwgRXhwciAqTnVtRWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMQkxvYywgU291cmNlTG9jYXRpb24gUkJMb2MpIHsKKyAgICBEZWNsYXJhdG9yQ2h1bmsgSTsKKyAgICBJLktpbmQgICAgICAgICAgPSBBcnJheTsKKyAgICBJLkxvYyAgICAgICAgICAgPSBMQkxvYzsKKyAgICBJLkVuZExvYyAgICAgICAgPSBSQkxvYzsKKyAgICBJLkFyci5BdHRyTGlzdCAgPSBudWxscHRyOworICAgIEkuQXJyLlR5cGVRdWFscyA9IFR5cGVRdWFsczsKKyAgICBJLkFyci5oYXNTdGF0aWMgPSBpc1N0YXRpYzsKKyAgICBJLkFyci5pc1N0YXIgICAgPSBpc1N0YXI7CisgICAgSS5BcnIuTnVtRWx0cyAgID0gTnVtRWx0czsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIC8vLyBEZWNsYXJhdG9yQ2h1bms6OmdldEZ1bmN0aW9uIC0gUmV0dXJuIGEgRGVjbGFyYXRvckNodW5rIGZvciBhIGZ1bmN0aW9uLgorICAvLy8gIlRoZURlY2xhcmF0b3IiIGlzIHRoZSBkZWNsYXJhdG9yIHRoYXQgdGhpcyB3aWxsIGJlIGFkZGVkIHRvLgorICBzdGF0aWMgRGVjbGFyYXRvckNodW5rIGdldEZ1bmN0aW9uKGJvb2wgSGFzUHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0FtYmlndW91cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1JbmZvICpQYXJhbXMsIHVuc2lnbmVkIE51bVBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVHlwZVF1YWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVmUXVhbGlmaWVySXNMdmFsdWVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUmVmUXVhbGlmaWVyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENvbnN0UXVhbGlmaWVyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFZvbGF0aWxlUXVhbGlmaWVyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJlc3RyaWN0UXVhbGlmaWVyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE11dGFibGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uU3BlY2lmaWNhdGlvblR5cGUgRVNwZWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEVTcGVjUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSAqRXhjZXB0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSAqRXhjZXB0aW9uUmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUV4Y2VwdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqTm9leGNlcHRFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlZFRva2VucyAqRXhjZXB0aW9uU3BlY1Rva2VucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxOYW1lZERlY2wgKj4gRGVjbHNJblByb3RvdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2NhbFJhbmdlQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jYWxSYW5nZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdG9yICZUaGVEZWNsYXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVSZXN1bHQgVHJhaWxpbmdSZXR1cm5UeXBlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlUmVzdWx0KCkpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgRGVjbGFyYXRvckNodW5rIGZvciBhIGJsb2NrLgorICBzdGF0aWMgRGVjbGFyYXRvckNodW5rIGdldEJsb2NrUG9pbnRlcih1bnNpZ25lZCBUeXBlUXVhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIERlY2xhcmF0b3JDaHVuayBJOworICAgIEkuS2luZCAgICAgICAgICA9IEJsb2NrUG9pbnRlcjsKKyAgICBJLkxvYyAgICAgICAgICAgPSBMb2M7CisgICAgSS5DbHMuVHlwZVF1YWxzID0gVHlwZVF1YWxzOworICAgIEkuQ2xzLkF0dHJMaXN0ICA9IG51bGxwdHI7CisgICAgcmV0dXJuIEk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhIERlY2xhcmF0b3JDaHVuayBmb3IgYSBibG9jay4KKyAgc3RhdGljIERlY2xhcmF0b3JDaHVuayBnZXRQaXBlKHVuc2lnbmVkIFR5cGVRdWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIERlY2xhcmF0b3JDaHVuayBJOworICAgIEkuS2luZCAgICAgICAgICA9IFBpcGU7CisgICAgSS5Mb2MgICAgICAgICAgID0gTG9jOworICAgIEkuQ2xzLlR5cGVRdWFscyA9IFR5cGVRdWFsczsKKyAgICBJLkNscy5BdHRyTGlzdCAgPSBudWxscHRyOworICAgIHJldHVybiBJOworICB9CisKKyAgc3RhdGljIERlY2xhcmF0b3JDaHVuayBnZXRNZW1iZXJQb2ludGVyKGNvbnN0IENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUeXBlUXVhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBEZWNsYXJhdG9yQ2h1bmsgSTsKKyAgICBJLktpbmQgICAgICAgICAgPSBNZW1iZXJQb2ludGVyOworICAgIEkuTG9jICAgICAgICAgICA9IFNTLmdldEJlZ2luTG9jKCk7CisgICAgSS5FbmRMb2MgICAgICAgID0gTG9jOworICAgIEkuTWVtLlR5cGVRdWFscyA9IFR5cGVRdWFsczsKKyAgICBJLk1lbS5BdHRyTGlzdCAgPSBudWxscHRyOworICAgIG5ldyAoSS5NZW0uU2NvcGVNZW0pIENYWFNjb3BlU3BlYyhTUyk7CisgICAgcmV0dXJuIEk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhIERlY2xhcmF0b3JDaHVuayBmb3IgYSBwYXJlbi4KKyAgc3RhdGljIERlY2xhcmF0b3JDaHVuayBnZXRQYXJlbihTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKSB7CisgICAgRGVjbGFyYXRvckNodW5rIEk7CisgICAgSS5LaW5kICAgICAgICAgID0gUGFyZW47CisgICAgSS5Mb2MgICAgICAgICAgID0gTFBhcmVuTG9jOworICAgIEkuRW5kTG9jICAgICAgICA9IFJQYXJlbkxvYzsKKyAgICBJLkNvbW1vbi5BdHRyTGlzdCA9IG51bGxwdHI7CisgICAgcmV0dXJuIEk7CisgIH0KKworICBib29sIGlzUGFyZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIEtpbmQgPT0gUGFyZW47CisgIH0KK307CisKKy8vLyBBIHBhcnNlZCBDKysxNyBkZWNvbXBvc2l0aW9uIGRlY2xhcmF0b3Igb2YgdGhlIGZvcm0KKy8vLyAgICdbJyBpZGVudGlmaWVyLWxpc3QgJ10nCitjbGFzcyBEZWNvbXBvc2l0aW9uRGVjbGFyYXRvciB7CitwdWJsaWM6CisgIHN0cnVjdCBCaW5kaW5nIHsKKyAgICBJZGVudGlmaWVySW5mbyAqTmFtZTsKKyAgICBTb3VyY2VMb2NhdGlvbiBOYW1lTG9jOworICB9OworCitwcml2YXRlOgorICAvLy8gVGhlIGxvY2F0aW9ucyBvZiB0aGUgJ1snIGFuZCAnXScgdG9rZW5zLgorICBTb3VyY2VMb2NhdGlvbiBMU3F1YXJlTG9jLCBSU3F1YXJlTG9jOworCisgIC8vLyBUaGUgYmluZGluZ3MuCisgIEJpbmRpbmcgKkJpbmRpbmdzOworICB1bnNpZ25lZCBOdW1CaW5kaW5ncyA6IDMxOworICB1bnNpZ25lZCBEZWxldGVCaW5kaW5ncyA6IDE7CisKKyAgZnJpZW5kIGNsYXNzIERlY2xhcmF0b3I7CisKK3B1YmxpYzoKKyAgRGVjb21wb3NpdGlvbkRlY2xhcmF0b3IoKQorICAgICAgOiBCaW5kaW5ncyhudWxscHRyKSwgTnVtQmluZGluZ3MoMCksIERlbGV0ZUJpbmRpbmdzKGZhbHNlKSB7fQorICBEZWNvbXBvc2l0aW9uRGVjbGFyYXRvcihjb25zdCBEZWNvbXBvc2l0aW9uRGVjbGFyYXRvciAmRykgPSBkZWxldGU7CisgIERlY29tcG9zaXRpb25EZWNsYXJhdG9yICZvcGVyYXRvcj0oY29uc3QgRGVjb21wb3NpdGlvbkRlY2xhcmF0b3IgJkcpID0gZGVsZXRlOworICB+RGVjb21wb3NpdGlvbkRlY2xhcmF0b3IoKSB7CisgICAgaWYgKERlbGV0ZUJpbmRpbmdzKQorICAgICAgZGVsZXRlW10gQmluZGluZ3M7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIExTcXVhcmVMb2MgPSBSU3F1YXJlTG9jID0gU291cmNlTG9jYXRpb24oKTsKKyAgICBpZiAoRGVsZXRlQmluZGluZ3MpCisgICAgICBkZWxldGVbXSBCaW5kaW5nczsKKyAgICBCaW5kaW5ncyA9IG51bGxwdHI7CisgICAgTnVtQmluZGluZ3MgPSAwOworICAgIERlbGV0ZUJpbmRpbmdzID0gZmFsc2U7CisgIH0KKworICBBcnJheVJlZjxCaW5kaW5nPiBiaW5kaW5ncygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKEJpbmRpbmdzLCBOdW1CaW5kaW5ncyk7CisgIH0KKworICBib29sIGlzU2V0KCkgY29uc3QgeyByZXR1cm4gTFNxdWFyZUxvYy5pc1ZhbGlkKCk7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMU3F1YXJlTG9jKCkgY29uc3QgeyByZXR1cm4gTFNxdWFyZUxvYzsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRSU3F1YXJlTG9jKCkgY29uc3QgeyByZXR1cm4gUlNxdWFyZUxvYzsgfQorICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU291cmNlUmFuZ2UoTFNxdWFyZUxvYywgUlNxdWFyZUxvYyk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgRGVzY3JpYmVkIHRoZSBraW5kIG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gKGlmIGFueSkgcHJvdmlkZWQgZm9yCisvLy8gYSBmdW5jdGlvbi4KK2VudW0gRnVuY3Rpb25EZWZpbml0aW9uS2luZCB7CisgIEZES19EZWNsYXJhdGlvbiwKKyAgRkRLX0RlZmluaXRpb24sCisgIEZES19EZWZhdWx0ZWQsCisgIEZES19EZWxldGVkCit9OworCitlbnVtIGNsYXNzIERlY2xhcmF0b3JDb250ZXh0IHsKKyAgICBGaWxlQ29udGV4dCwgICAgICAgICAvLyBGaWxlIHNjb3BlIGRlY2xhcmF0aW9uLgorICAgIFByb3RvdHlwZUNvbnRleHQsICAgIC8vIFdpdGhpbiBhIGZ1bmN0aW9uIHByb3RvdHlwZS4KKyAgICBPYmpDUmVzdWx0Q29udGV4dCwgICAvLyBBbiBPYmpDIG1ldGhvZCByZXN1bHQgdHlwZS4KKyAgICBPYmpDUGFyYW1ldGVyQ29udGV4dCwvLyBBbiBPYmpDIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZS4KKyAgICBLTlJUeXBlTGlzdENvbnRleHQsICAvLyBLJlIgdHlwZSBkZWZpbml0aW9uIGxpc3QgZm9yIGZvcm1hbHMuCisgICAgVHlwZU5hbWVDb250ZXh0LCAgICAgLy8gQWJzdHJhY3QgZGVjbGFyYXRvciBmb3IgdHlwZXMuCisgICAgRnVuY3Rpb25hbENhc3RDb250ZXh0LCAvLyBUeXBlIGluIGEgQysrIGZ1bmN0aW9uYWwgY2FzdCBleHByZXNzaW9uLgorICAgIE1lbWJlckNvbnRleHQsICAgICAgIC8vIFN0cnVjdC9VbmlvbiBmaWVsZC4KKyAgICBCbG9ja0NvbnRleHQsICAgICAgICAvLyBEZWNsYXJhdGlvbiB3aXRoaW4gYSBibG9jayBpbiBhIGZ1bmN0aW9uLgorICAgIEZvckNvbnRleHQsICAgICAgICAgIC8vIERlY2xhcmF0aW9uIHdpdGhpbiBmaXJzdCBwYXJ0IG9mIGEgZm9yIGxvb3AuCisgICAgSW5pdFN0bXRDb250ZXh0LCAgICAgLy8gRGVjbGFyYXRpb24gd2l0aGluIG9wdGlvbmFsIGluaXQgc3RtdCBvZiBpZi9zd2l0Y2guCisgICAgQ29uZGl0aW9uQ29udGV4dCwgICAgLy8gQ29uZGl0aW9uIGRlY2xhcmF0aW9uIGluIGEgQysrIGlmL3N3aXRjaC93aGlsZS9mb3IuCisgICAgVGVtcGxhdGVQYXJhbUNvbnRleHQsLy8gV2l0aGluIGEgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3QuCisgICAgQ1hYTmV3Q29udGV4dCwgICAgICAgLy8gQysrIG5ldy1leHByZXNzaW9uLgorICAgIENYWENhdGNoQ29udGV4dCwgICAgIC8vIEMrKyBjYXRjaCBleGNlcHRpb24tZGVjbGFyYXRpb24KKyAgICBPYmpDQ2F0Y2hDb250ZXh0LCAgICAvLyBPYmplY3RpdmUtQyBjYXRjaCBleGNlcHRpb24tZGVjbGFyYXRpb24KKyAgICBCbG9ja0xpdGVyYWxDb250ZXh0LCAvLyBCbG9jayBsaXRlcmFsIGRlY2xhcmF0b3IuCisgICAgTGFtYmRhRXhwckNvbnRleHQsICAgLy8gTGFtYmRhLWV4cHJlc3Npb24gZGVjbGFyYXRvci4KKyAgICBMYW1iZGFFeHByUGFyYW1ldGVyQ29udGV4dCwgLy8gTGFtYmRhLWV4cHJlc3Npb24gcGFyYW1ldGVyIGRlY2xhcmF0b3IuCisgICAgQ29udmVyc2lvbklkQ29udGV4dCwgLy8gQysrIGNvbnZlcnNpb24tdHlwZS1pZC4KKyAgICBUcmFpbGluZ1JldHVybkNvbnRleHQsIC8vIEMrKzExIHRyYWlsaW5nLXR5cGUtc3BlY2lmaWVyLgorICAgIFRyYWlsaW5nUmV0dXJuVmFyQ29udGV4dCwgLy8gQysrMTEgdHJhaWxpbmctdHlwZS1zcGVjaWZpZXIgZm9yIHZhcmlhYmxlLgorICAgIFRlbXBsYXRlQXJnQ29udGV4dCwgIC8vIEFueSB0ZW1wbGF0ZSBhcmd1bWVudCAoaW4gdGVtcGxhdGUgYXJndW1lbnQgbGlzdCkuCisgICAgVGVtcGxhdGVUeXBlQXJnQ29udGV4dCwgLy8gVGVtcGxhdGUgdHlwZSBhcmd1bWVudCAoaW4gZGVmYXVsdCBhcmd1bWVudCkuCisgICAgQWxpYXNEZWNsQ29udGV4dCwgICAgLy8gQysrMTEgYWxpYXMtZGVjbGFyYXRpb24uCisgICAgQWxpYXNUZW1wbGF0ZUNvbnRleHQgLy8gQysrMTEgYWxpYXMtZGVjbGFyYXRpb24gdGVtcGxhdGUuCit9OworCisKKy8vLyBcYnJpZWYgSW5mb3JtYXRpb24gYWJvdXQgb25lIGRlY2xhcmF0b3IsIGluY2x1ZGluZyB0aGUgcGFyc2VkIHR5cGUKKy8vLyBpbmZvcm1hdGlvbiBhbmQgdGhlIGlkZW50aWZpZXIuCisvLy8KKy8vLyBXaGVuIHRoZSBkZWNsYXJhdG9yIGlzIGZ1bGx5IGZvcm1lZCwgdGhpcyBpcyB0dXJuZWQgaW50byB0aGUgYXBwcm9wcmlhdGUKKy8vLyBEZWNsIG9iamVjdC4KKy8vLworLy8vIERlY2xhcmF0b3JzIGNvbWUgaW4gdHdvIHR5cGVzOiBub3JtYWwgZGVjbGFyYXRvcnMgYW5kIGFic3RyYWN0IGRlY2xhcmF0b3JzLgorLy8vIEFic3RyYWN0IGRlY2xhcmF0b3JzIGFyZSB1c2VkIHdoZW4gcGFyc2luZyB0eXBlcywgYW5kIGRvbid0IGhhdmUgYW4KKy8vLyBpZGVudGlmaWVyLiAgTm9ybWFsIGRlY2xhcmF0b3JzIGRvIGhhdmUgSUQncy4KKy8vLworLy8vIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHNob3VsZCBiZSBhIHRyYW5zaWVudCBvYmplY3QgdGhhdCBsaXZlcyBvbiB0aGUKKy8vLyBzdGFjaywgbm90IG9iamVjdHMgdGhhdCBhcmUgYWxsb2NhdGVkIGluIGxhcmdlIHF1YW50aXRpZXMgb24gdGhlIGhlYXAuCitjbGFzcyBEZWNsYXJhdG9yIHsKKyAgCitwcml2YXRlOgorICBjb25zdCBEZWNsU3BlYyAmRFM7CisgIENYWFNjb3BlU3BlYyBTUzsKKyAgVW5xdWFsaWZpZWRJZCBOYW1lOworICBTb3VyY2VSYW5nZSBSYW5nZTsKKworICAvLy8gXGJyaWVmIFdoZXJlIHdlIGFyZSBwYXJzaW5nIHRoaXMgZGVjbGFyYXRvci4KKyAgRGVjbGFyYXRvckNvbnRleHQgQ29udGV4dDsKKworICAvLy8gVGhlIEMrKzE3IHN0cnVjdHVyZWQgYmluZGluZywgaWYgYW55LiBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIHRvIGEgTmFtZS4KKyAgRGVjb21wb3NpdGlvbkRlY2xhcmF0b3IgQmluZGluZ0dyb3VwOworCisgIC8vLyBEZWNsVHlwZUluZm8gLSBUaGlzIGhvbGRzIGVhY2ggdHlwZSB0aGF0IHRoZSBkZWNsYXJhdG9yIGluY2x1ZGVzIGFzIGl0IGlzCisgIC8vLyBwYXJzZWQuICBUaGlzIGlzIHB1c2hlZCBmcm9tIHRoZSBpZGVudGlmaWVyIG91dCwgd2hpY2ggbWVhbnMgdGhhdCBlbGVtZW50CisgIC8vLyAjMCB3aWxsIGJlIHRoZSBtb3N0IGNsb3NlbHkgYm91bmQgdG8gdGhlIGlkZW50aWZpZXIsIGFuZAorICAvLy8gRGVjbFR5cGVJbmZvLmJhY2soKSB3aWxsIGJlIHRoZSBsZWFzdCBjbG9zZWx5IGJvdW5kLgorICBTbWFsbFZlY3RvcjxEZWNsYXJhdG9yQ2h1bmssIDg+IERlY2xUeXBlSW5mbzsKKworICAvLy8gSW52YWxpZFR5cGUgLSBTZXQgYnkgU2VtYTo6R2V0VHlwZUZvckRlY2xhcmF0b3IoKS4KKyAgdW5zaWduZWQgSW52YWxpZFR5cGUgOiAxOworCisgIC8vLyBHcm91cGluZ1BhcmVucyAtIFNldCBieSBQYXJzZXI6OlBhcnNlUGFyZW5EZWNsYXJhdG9yKCkuCisgIHVuc2lnbmVkIEdyb3VwaW5nUGFyZW5zIDogMTsKKworICAvLy8gRnVuY3Rpb25EZWZpbml0aW9uIC0gSXMgdGhpcyBEZWNsYXJhdG9yIGZvciBhIGZ1bmN0aW9uIG9yIG1lbWJlciAKKyAgLy8vIGRlZmluaXRpb24gYW5kLCBpZiBzbywgd2hhdCBraW5kPworICAvLy8KKyAgLy8vIEFjdHVhbGx5IGEgRnVuY3Rpb25EZWZpbml0aW9uS2luZC4KKyAgdW5zaWduZWQgRnVuY3Rpb25EZWZpbml0aW9uIDogMjsKKworICAvLy8gXGJyaWVmIElzIHRoaXMgRGVjbGFyYXRvciBhIHJlZGVjbGFyYXRpb24/CisgIHVuc2lnbmVkIFJlZGVjbGFyYXRpb24gOiAxOworCisgIC8vLyBcYnJpZWYgdHJ1ZSBpZiB0aGUgZGVjbGFyYXRpb24gaXMgcHJlY2VkZWQgYnkgXGMgX19leHRlbnNpb25fXy4KKyAgdW5zaWduZWQgRXh0ZW5zaW9uIDogMTsKKworICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBPYmplY3RpdmUtQyBpbnN0YW5jZSB2YXJpYWJsZS4KKyAgdW5zaWduZWQgT2JqQ0l2YXIgOiAxOworICAgIAorICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBPYmplY3RpdmUtQyAnd2VhaycgcHJvcGVydHkuCisgIHVuc2lnbmVkIE9iakNXZWFrUHJvcGVydHkgOiAxOworCisgIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgSW5saW5lUGFyYW1zIC8gSW5saW5lQmluZGluZ3Mgc3RvcmFnZSBoYXMgYmVlbiB1c2VkLgorICB1bnNpZ25lZCBJbmxpbmVTdG9yYWdlVXNlZCA6IDE7CisKKyAgLy8vIEF0dHJzIC0gQXR0cmlidXRlcy4KKyAgUGFyc2VkQXR0cmlidXRlcyBBdHRyczsKKworICAvLy8gXGJyaWVmIFRoZSBhc20gbGFiZWwsIGlmIHNwZWNpZmllZC4KKyAgRXhwciAqQXNtTGFiZWw7CisKKyNpZm5kZWYgX01TQ19WRVIKKyAgdW5pb24geworI2VuZGlmCisgICAgLy8vIElubGluZVBhcmFtcyAtIFRoaXMgaXMgYSBsb2NhbCBhcnJheSB1c2VkIGZvciB0aGUgZmlyc3QgZnVuY3Rpb24gZGVjbAorICAgIC8vLyBjaHVuayB0byBhdm9pZCBnb2luZyB0byB0aGUgaGVhcCBmb3IgdGhlIGNvbW1vbiBjYXNlIHdoZW4gd2UgaGF2ZSBvbmUKKyAgICAvLy8gZnVuY3Rpb24gY2h1bmsgaW4gdGhlIGRlY2xhcmF0b3IuCisgICAgRGVjbGFyYXRvckNodW5rOjpQYXJhbUluZm8gSW5saW5lUGFyYW1zWzE2XTsKKyAgICBEZWNvbXBvc2l0aW9uRGVjbGFyYXRvcjo6QmluZGluZyBJbmxpbmVCaW5kaW5nc1sxNl07CisjaWZuZGVmIF9NU0NfVkVSCisgIH07CisjZW5kaWYKKworICAvLy8gXGJyaWVmIElmIHRoaXMgaXMgdGhlIHNlY29uZCBvciBzdWJzZXF1ZW50IGRlY2xhcmF0b3IgaW4gdGhpcyBkZWNsYXJhdGlvbiwKKyAgLy8vIHRoZSBsb2NhdGlvbiBvZiB0aGUgY29tbWEgYmVmb3JlIHRoaXMgZGVjbGFyYXRvci4KKyAgU291cmNlTG9jYXRpb24gQ29tbWFMb2M7CisKKyAgLy8vIFxicmllZiBJZiBwcm92aWRlZCwgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgZWxsaXBzaXMgdXNlZCB0byBkZXNjcmliZQorICAvLy8gdGhpcyBkZWNsYXJhdG9yIGFzIGEgcGFyYW1ldGVyIHBhY2suCisgIFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jOworICAKKyAgZnJpZW5kIHN0cnVjdCBEZWNsYXJhdG9yQ2h1bms7CisKK3B1YmxpYzoKKyAgRGVjbGFyYXRvcihjb25zdCBEZWNsU3BlYyAmZHMsIERlY2xhcmF0b3JDb250ZXh0IEMpCisgICAgICA6IERTKGRzKSwgUmFuZ2UoZHMuZ2V0U291cmNlUmFuZ2UoKSksIENvbnRleHQoQyksCisgICAgICAgIEludmFsaWRUeXBlKERTLmdldFR5cGVTcGVjVHlwZSgpID09IERlY2xTcGVjOjpUU1RfZXJyb3IpLAorICAgICAgICBHcm91cGluZ1BhcmVucyhmYWxzZSksIEZ1bmN0aW9uRGVmaW5pdGlvbihGREtfRGVjbGFyYXRpb24pLAorICAgICAgICBSZWRlY2xhcmF0aW9uKGZhbHNlKSwgRXh0ZW5zaW9uKGZhbHNlKSwgT2JqQ0l2YXIoZmFsc2UpLAorICAgICAgICBPYmpDV2Vha1Byb3BlcnR5KGZhbHNlKSwgSW5saW5lU3RvcmFnZVVzZWQoZmFsc2UpLAorICAgICAgICBBdHRycyhkcy5nZXRBdHRyaWJ1dGVQb29sKCkuZ2V0RmFjdG9yeSgpKSwgQXNtTGFiZWwobnVsbHB0cikge30KKworICB+RGVjbGFyYXRvcigpIHsKKyAgICBjbGVhcigpOworICB9CisgIC8vLyBnZXREZWNsU3BlYyAtIFJldHVybiB0aGUgZGVjbGFyYXRpb24tc3BlY2lmaWVyIHRoYXQgdGhpcyBkZWNsYXJhdG9yIHdhcworICAvLy8gZGVjbGFyZWQgd2l0aC4KKyAgY29uc3QgRGVjbFNwZWMgJmdldERlY2xTcGVjKCkgY29uc3QgeyByZXR1cm4gRFM7IH0KKworICAvLy8gZ2V0TXV0YWJsZURlY2xTcGVjIC0gUmV0dXJuIGEgbm9uLWNvbnN0IHZlcnNpb24gb2YgdGhlIERlY2xTcGVjLiAgVGhpcworICAvLy8gc2hvdWxkIGJlIHVzZWQgd2l0aCBleHRyZW1lIGNhcmU6IGRlY2xzcGVjcyBjYW4gb2Z0ZW4gYmUgc2hhcmVkIGJldHdlZW4KKyAgLy8vIG11bHRpcGxlIGRlY2xhcmF0b3JzLCBzbyBtdXRhdGluZyB0aGUgRGVjbFNwZWMgYWZmZWN0cyBhbGwgb2YgdGhlCisgIC8vLyBEZWNsYXJhdG9ycy4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGVuIHRoZSBkZWNsc3BlYyBpcyBrbm93biB0byBub3QKKyAgLy8vIGJlIHNoYXJlZCBvciB3aGVuIGluIGVycm9yIHJlY292ZXJ5IGV0Yy4KKyAgRGVjbFNwZWMgJmdldE11dGFibGVEZWNsU3BlYygpIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8RGVjbFNwZWMgJj4oRFMpOyB9CisKKyAgQXR0cmlidXRlUG9vbCAmZ2V0QXR0cmlidXRlUG9vbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0cnMuZ2V0UG9vbCgpOworICB9CisKKyAgLy8vIGdldENYWFNjb3BlU3BlYyAtIFJldHVybiB0aGUgQysrIHNjb3BlIHNwZWNpZmllciAoZ2xvYmFsIHNjb3BlIG9yCisgIC8vLyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIpIHRoYXQgaXMgcGFydCBvZiB0aGUgZGVjbGFyYXRvci1pZC4KKyAgY29uc3QgQ1hYU2NvcGVTcGVjICZnZXRDWFhTY29wZVNwZWMoKSBjb25zdCB7IHJldHVybiBTUzsgfQorICBDWFhTY29wZVNwZWMgJmdldENYWFNjb3BlU3BlYygpIHsgcmV0dXJuIFNTOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmFtZSBzcGVjaWZpZWQgYnkgdGhpcyBkZWNsYXJhdG9yLgorICBVbnF1YWxpZmllZElkICZnZXROYW1lKCkgeyByZXR1cm4gTmFtZTsgfQorCisgIGNvbnN0IERlY29tcG9zaXRpb25EZWNsYXJhdG9yICZnZXREZWNvbXBvc2l0aW9uRGVjbGFyYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluZGluZ0dyb3VwOworICB9CisgIAorICBEZWNsYXJhdG9yQ29udGV4dCBnZXRDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQ29udGV4dDsgfQorCisgIGJvb2wgaXNQcm90b3R5cGVDb250ZXh0KCkgY29uc3QgeworICAgIHJldHVybiAoQ29udGV4dCA9PSBEZWNsYXJhdG9yQ29udGV4dDo6UHJvdG90eXBlQ29udGV4dCB8fAorICAgICAgICAgICAgQ29udGV4dCA9PSBEZWNsYXJhdG9yQ29udGV4dDo6T2JqQ1BhcmFtZXRlckNvbnRleHQgfHwKKyAgICAgICAgICAgIENvbnRleHQgPT0gRGVjbGFyYXRvckNvbnRleHQ6Ok9iakNSZXN1bHRDb250ZXh0IHx8CisgICAgICAgICAgICBDb250ZXh0ID09IERlY2xhcmF0b3JDb250ZXh0OjpMYW1iZGFFeHByUGFyYW1ldGVyQ29udGV4dCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgc291cmNlIHJhbmdlIHRoYXQgc3BhbnMgdGhpcyBkZWNsYXJhdG9yLgorICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gUmFuZ2U7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIFJhbmdlLmdldEJlZ2luKCk7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSYW5nZS5nZXRFbmQoKTsgfQorCisgIHZvaWQgU2V0U291cmNlUmFuZ2UoU291cmNlUmFuZ2UgUikgeyBSYW5nZSA9IFI7IH0KKyAgLy8vIFNldFJhbmdlQmVnaW4gLSBTZXQgdGhlIHN0YXJ0IG9mIHRoZSBzb3VyY2UgcmFuZ2UgdG8gTG9jLCB1bmxlc3MgaXQncworICAvLy8gaW52YWxpZC4KKyAgdm9pZCBTZXRSYW5nZUJlZ2luKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIGlmICghTG9jLmlzSW52YWxpZCgpKQorICAgICAgUmFuZ2Uuc2V0QmVnaW4oTG9jKTsKKyAgfQorICAvLy8gU2V0UmFuZ2VFbmQgLSBTZXQgdGhlIGVuZCBvZiB0aGUgc291cmNlIHJhbmdlIHRvIExvYywgdW5sZXNzIGl0J3MgaW52YWxpZC4KKyAgdm9pZCBTZXRSYW5nZUVuZChTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICBpZiAoIUxvYy5pc0ludmFsaWQoKSkKKyAgICAgIFJhbmdlLnNldEVuZChMb2MpOworICB9CisgIC8vLyBFeHRlbmRXaXRoRGVjbFNwZWMgLSBFeHRlbmQgdGhlIGRlY2xhcmF0b3Igc291cmNlIHJhbmdlIHRvIGluY2x1ZGUgdGhlCisgIC8vLyBnaXZlbiBkZWNsc3BlYywgdW5sZXNzIGl0cyBsb2NhdGlvbiBpcyBpbnZhbGlkLiBBZG9wdHMgdGhlIHJhbmdlIHN0YXJ0IGlmCisgIC8vLyB0aGUgY3VycmVudCByYW5nZSBzdGFydCBpcyBpbnZhbGlkLgorICB2b2lkIEV4dGVuZFdpdGhEZWNsU3BlYyhjb25zdCBEZWNsU3BlYyAmRFMpIHsKKyAgICBTb3VyY2VSYW5nZSBTUiA9IERTLmdldFNvdXJjZVJhbmdlKCk7CisgICAgaWYgKFJhbmdlLmdldEJlZ2luKCkuaXNJbnZhbGlkKCkpCisgICAgICBSYW5nZS5zZXRCZWdpbihTUi5nZXRCZWdpbigpKTsKKyAgICBpZiAoIVNSLmdldEVuZCgpLmlzSW52YWxpZCgpKQorICAgICAgUmFuZ2Uuc2V0RW5kKFNSLmdldEVuZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVzZXQgdGhlIGNvbnRlbnRzIG9mIHRoaXMgRGVjbGFyYXRvci4KKyAgdm9pZCBjbGVhcigpIHsKKyAgICBTUy5jbGVhcigpOworICAgIE5hbWUuY2xlYXIoKTsKKyAgICBSYW5nZSA9IERTLmdldFNvdXJjZVJhbmdlKCk7CisgICAgQmluZGluZ0dyb3VwLmNsZWFyKCk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGVjbFR5cGVJbmZvLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBEZWNsVHlwZUluZm9baV0uZGVzdHJveSgpOworICAgIERlY2xUeXBlSW5mby5jbGVhcigpOworICAgIEF0dHJzLmNsZWFyKCk7CisgICAgQXNtTGFiZWwgPSBudWxscHRyOworICAgIElubGluZVN0b3JhZ2VVc2VkID0gZmFsc2U7CisgICAgT2JqQ0l2YXIgPSBmYWxzZTsKKyAgICBPYmpDV2Vha1Byb3BlcnR5ID0gZmFsc2U7CisgICAgQ29tbWFMb2MgPSBTb3VyY2VMb2NhdGlvbigpOworICAgIEVsbGlwc2lzTG9jID0gU291cmNlTG9jYXRpb24oKTsKKyAgfQorCisgIC8vLyBtYXlPbWl0SWRlbnRpZmllciAtIFJldHVybiB0cnVlIGlmIHRoZSBpZGVudGlmaWVyIGlzIGVpdGhlciBvcHRpb25hbCBvcgorICAvLy8gbm90IGFsbG93ZWQuICBUaGlzIGlzIHRydWUgZm9yIHR5cGVuYW1lcywgcHJvdG90eXBlcywgYW5kIHRlbXBsYXRlCisgIC8vLyBwYXJhbWV0ZXIgbGlzdHMuCisgIGJvb2wgbWF5T21pdElkZW50aWZpZXIoKSBjb25zdCB7CisgICAgc3dpdGNoIChDb250ZXh0KSB7CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6RmlsZUNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6S05SVHlwZUxpc3RDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6Ok1lbWJlckNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6QmxvY2tDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkZvckNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6SW5pdFN0bXRDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkNvbmRpdGlvbkNvbnRleHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpUeXBlTmFtZUNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6RnVuY3Rpb25hbENhc3RDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkFsaWFzRGVjbENvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6QWxpYXNUZW1wbGF0ZUNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6UHJvdG90eXBlQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpMYW1iZGFFeHByUGFyYW1ldGVyQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpPYmpDUGFyYW1ldGVyQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpPYmpDUmVzdWx0Q29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpUZW1wbGF0ZVBhcmFtQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpDWFhOZXdDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkNYWENhdGNoQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpPYmpDQ2F0Y2hDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkJsb2NrTGl0ZXJhbENvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6TGFtYmRhRXhwckNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6Q29udmVyc2lvbklkQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpUZW1wbGF0ZUFyZ0NvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6VGVtcGxhdGVUeXBlQXJnQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpUcmFpbGluZ1JldHVybkNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6VHJhaWxpbmdSZXR1cm5WYXJDb250ZXh0OgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoInVua25vd24gY29udGV4dCBraW5kISIpOworICB9CisKKyAgLy8vIG1heUhhdmVJZGVudGlmaWVyIC0gUmV0dXJuIHRydWUgaWYgdGhlIGlkZW50aWZpZXIgaXMgZWl0aGVyIG9wdGlvbmFsIG9yCisgIC8vLyByZXF1aXJlZC4gIFRoaXMgaXMgdHJ1ZSBmb3Igbm9ybWFsIGRlY2xhcmF0b3JzIGFuZCBwcm90b3R5cGVzLCBidXQgbm90CisgIC8vLyB0eXBlbmFtZXMuCisgIGJvb2wgbWF5SGF2ZUlkZW50aWZpZXIoKSBjb25zdCB7CisgICAgc3dpdGNoIChDb250ZXh0KSB7CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6RmlsZUNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6S05SVHlwZUxpc3RDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6Ok1lbWJlckNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6QmxvY2tDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkZvckNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6SW5pdFN0bXRDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkNvbmRpdGlvbkNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6UHJvdG90eXBlQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpMYW1iZGFFeHByUGFyYW1ldGVyQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpUZW1wbGF0ZVBhcmFtQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpDWFhDYXRjaENvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6T2JqQ0NhdGNoQ29udGV4dDoKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6VHlwZU5hbWVDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkZ1bmN0aW9uYWxDYXN0Q29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpDWFhOZXdDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkFsaWFzRGVjbENvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6QWxpYXNUZW1wbGF0ZUNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6T2JqQ1BhcmFtZXRlckNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6T2JqQ1Jlc3VsdENvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6QmxvY2tMaXRlcmFsQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpMYW1iZGFFeHByQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpDb252ZXJzaW9uSWRDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OlRlbXBsYXRlQXJnQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpUZW1wbGF0ZVR5cGVBcmdDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OlRyYWlsaW5nUmV0dXJuQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpUcmFpbGluZ1JldHVyblZhckNvbnRleHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoInVua25vd24gY29udGV4dCBraW5kISIpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBjb250ZXh0IHBlcm1pdHMgYSBDKysxNyBkZWNvbXBvc2l0aW9uIGRlY2xhcmF0b3IuCisgIGJvb2wgbWF5SGF2ZURlY29tcG9zaXRpb25EZWNsYXJhdG9yKCkgY29uc3QgeworICAgIHN3aXRjaCAoQ29udGV4dCkgeworICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkZpbGVDb250ZXh0OgorICAgICAgLy8gRklYTUU6IEl0J3Mgbm90IGNsZWFyIHRoYXQgdGhlIHByb3Bvc2FsIG1lYW50IHRvIGFsbG93IGZpbGUtc2NvcGUKKyAgICAgIC8vIHN0cnVjdHVyZWQgYmluZGluZ3MsIGJ1dCBpdCBkb2VzLgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkJsb2NrQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpGb3JDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkluaXRTdG10Q29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpDb25kaXRpb25Db250ZXh0OgorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpNZW1iZXJDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OlByb3RvdHlwZUNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6VGVtcGxhdGVQYXJhbUNvbnRleHQ6CisgICAgICAvLyBNYXliZSBvbmUgZGF5Li4uCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBUaGVzZSBjb250ZXh0cyBkb24ndCBhbGxvdyBhbnkga2luZCBvZiBub24tYWJzdHJhY3QgZGVjbGFyYXRvci4KKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpLTlJUeXBlTGlzdENvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6VHlwZU5hbWVDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkZ1bmN0aW9uYWxDYXN0Q29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpBbGlhc0RlY2xDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkFsaWFzVGVtcGxhdGVDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkxhbWJkYUV4cHJQYXJhbWV0ZXJDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6Ok9iakNQYXJhbWV0ZXJDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6Ok9iakNSZXN1bHRDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkNYWE5ld0NvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6Q1hYQ2F0Y2hDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6Ok9iakNDYXRjaENvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6QmxvY2tMaXRlcmFsQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpMYW1iZGFFeHByQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpDb252ZXJzaW9uSWRDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OlRlbXBsYXRlQXJnQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpUZW1wbGF0ZVR5cGVBcmdDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OlRyYWlsaW5nUmV0dXJuQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpUcmFpbGluZ1JldHVyblZhckNvbnRleHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoInVua25vd24gY29udGV4dCBraW5kISIpOworICB9CisKKyAgLy8vIG1heUJlRm9sbG93ZWRCeUNYWERpcmVjdEluaXQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgZGVjbGFyYXRvciBjYW4gYmUKKyAgLy8vIGZvbGxvd2VkIGJ5IGEgQysrIGRpcmVjdCBpbml0aWFsaXplciwgZS5nLiAiaW50IHgoMSk7Ii4KKyAgYm9vbCBtYXlCZUZvbGxvd2VkQnlDWFhEaXJlY3RJbml0KCkgY29uc3QgeworICAgIGlmIChoYXNHcm91cGluZ1BhcmVucygpKSByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoZ2V0RGVjbFNwZWMoKS5nZXRTdG9yYWdlQ2xhc3NTcGVjKCkgPT0gRGVjbFNwZWM6OlNDU190eXBlZGVmKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGdldERlY2xTcGVjKCkuZ2V0U3RvcmFnZUNsYXNzU3BlYygpID09IERlY2xTcGVjOjpTQ1NfZXh0ZXJuICYmCisgICAgICAgIENvbnRleHQgIT0gRGVjbGFyYXRvckNvbnRleHQ6OkZpbGVDb250ZXh0KQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gU3BlY2lhbCBuYW1lcyBjYW4ndCBoYXZlIGRpcmVjdCBpbml0aWFsaXplcnMuCisgICAgaWYgKE5hbWUuZ2V0S2luZCgpICE9IFVucXVhbGlmaWVkSWRLaW5kOjpJS19JZGVudGlmaWVyKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgc3dpdGNoIChDb250ZXh0KSB7CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6RmlsZUNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6QmxvY2tDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkZvckNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6SW5pdFN0bXRDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OlRyYWlsaW5nUmV0dXJuVmFyQ29udGV4dDoKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6Q29uZGl0aW9uQ29udGV4dDoKKyAgICAgIC8vIFRoaXMgbWF5IG5vdCBiZSBmb2xsb3dlZCBieSBhIGRpcmVjdCBpbml0aWFsaXplciwgYnV0IGl0IGNhbid0IGJlIGEKKyAgICAgIC8vIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGVpdGhlciwgYW5kIHdlJ2QgcHJlZmVyIHRvIHBlcmZvcm0gYSB0ZW50YXRpdmUKKyAgICAgIC8vIHBhcnNlIGluIG9yZGVyIHRvIHByb2R1Y2UgdGhlIHJpZ2h0IGRpYWdub3N0aWMuCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OktOUlR5cGVMaXN0Q29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpNZW1iZXJDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OlByb3RvdHlwZUNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6TGFtYmRhRXhwclBhcmFtZXRlckNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6T2JqQ1BhcmFtZXRlckNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6T2JqQ1Jlc3VsdENvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6VGVtcGxhdGVQYXJhbUNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6Q1hYQ2F0Y2hDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6Ok9iakNDYXRjaENvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6VHlwZU5hbWVDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkZ1bmN0aW9uYWxDYXN0Q29udGV4dDogLy8gRklYTUUKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpDWFhOZXdDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkFsaWFzRGVjbENvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6QWxpYXNUZW1wbGF0ZUNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6QmxvY2tMaXRlcmFsQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpMYW1iZGFFeHByQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpDb252ZXJzaW9uSWRDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OlRlbXBsYXRlQXJnQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpUZW1wbGF0ZVR5cGVBcmdDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OlRyYWlsaW5nUmV0dXJuQ29udGV4dDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgidW5rbm93biBjb250ZXh0IGtpbmQhIik7CisgIH0KKworICAvLy8gaXNQYXN0SWRlbnRpZmllciAtIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgcGFyc2VkIGJleW9uZCB0aGUgcG9pbnQgd2hlcmUKKyAgLy8vIHRoZSBuYW1lIHdvdWxkIGFwcGVhci4gKFRoaXMgbWF5IGhhcHBlbiBldmVuIGlmIHdlIGhhdmVuJ3QgYWN0dWFsbHkgcGFyc2VkCisgIC8vLyBhIG5hbWUsIHBlcmhhcHMgYmVjYXVzZSB0aGlzIGNvbnRleHQgZG9lc24ndCByZXF1aXJlIG9uZS4pCisgIGJvb2wgaXNQYXN0SWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIE5hbWUuaXNWYWxpZCgpOyB9CisKKyAgLy8vIGhhc05hbWUgLSBXaGV0aGVyIHRoaXMgZGVjbGFyYXRvciBoYXMgYSBuYW1lLCB3aGljaCBtaWdodCBiZSBhbgorICAvLy8gaWRlbnRpZmllciAoYWNjZXNzaWJsZSB2aWEgZ2V0SWRlbnRpZmllcigpKSBvciBzb21lIGtpbmQgb2YKKyAgLy8vIHNwZWNpYWwgQysrIG5hbWUgKGNvbnN0cnVjdG9yLCBkZXN0cnVjdG9yLCBldGMuKSwgb3IgYSBzdHJ1Y3R1cmVkCisgIC8vLyBiaW5kaW5nICh3aGljaCBpcyBub3QgZXhhY3RseSBhIG5hbWUsIGJ1dCBvY2N1cGllcyB0aGUgc2FtZSBwb3NpdGlvbikuCisgIGJvb2wgaGFzTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTmFtZS5nZXRLaW5kKCkgIT0gVW5xdWFsaWZpZWRJZEtpbmQ6OklLX0lkZW50aWZpZXIgfHwKKyAgICAgICAgICAgTmFtZS5JZGVudGlmaWVyIHx8IGlzRGVjb21wb3NpdGlvbkRlY2xhcmF0b3IoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gd2hldGhlciB0aGlzIGRlY2xhcmF0b3IgaXMgYSBkZWNvbXBvc2l0aW9uIGRlY2xhcmF0b3IuCisgIGJvb2wgaXNEZWNvbXBvc2l0aW9uRGVjbGFyYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluZGluZ0dyb3VwLmlzU2V0KCk7CisgIH0KKworICBJZGVudGlmaWVySW5mbyAqZ2V0SWRlbnRpZmllcigpIGNvbnN0IHsgCisgICAgaWYgKE5hbWUuZ2V0S2luZCgpID09IFVucXVhbGlmaWVkSWRLaW5kOjpJS19JZGVudGlmaWVyKQorICAgICAgcmV0dXJuIE5hbWUuSWRlbnRpZmllcjsKKyAgICAKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRJZGVudGlmaWVyTG9jKCkgY29uc3QgeyByZXR1cm4gTmFtZS5TdGFydExvY2F0aW9uOyB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIG5hbWUgb2YgdGhpcyBkZWNsYXJhdG9yIHRvIGJlIHRoZSBnaXZlbiBpZGVudGlmaWVyLgorICB2b2lkIFNldElkZW50aWZpZXIoSWRlbnRpZmllckluZm8gKklkLCBTb3VyY2VMb2NhdGlvbiBJZExvYykgeworICAgIE5hbWUuc2V0SWRlbnRpZmllcihJZCwgSWRMb2MpOworICB9CisKKyAgLy8vIFNldCB0aGUgZGVjb21wb3NpdGlvbiBiaW5kaW5ncyBmb3IgdGhpcyBkZWNsYXJhdG9yLgorICB2b2lkCisgIHNldERlY29tcG9zaXRpb25CaW5kaW5ncyhTb3VyY2VMb2NhdGlvbiBMU3F1YXJlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RGVjb21wb3NpdGlvbkRlY2xhcmF0b3I6OkJpbmRpbmc+IEJpbmRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlNxdWFyZUxvYyk7CisKKyAgLy8vIEFkZFR5cGVJbmZvIC0gQWRkIGEgY2h1bmsgdG8gdGhpcyBkZWNsYXJhdG9yLiBBbHNvIGV4dGVuZCB0aGUgcmFuZ2UgdG8KKyAgLy8vIEVuZExvYywgd2hpY2ggc2hvdWxkIGJlIHRoZSBsYXN0IHRva2VuIG9mIHRoZSBjaHVuay4KKyAgdm9pZCBBZGRUeXBlSW5mbyhjb25zdCBEZWNsYXJhdG9yQ2h1bmsgJlRJLAorICAgICAgICAgICAgICAgICAgIFBhcnNlZEF0dHJpYnV0ZXMgJmF0dHJzLAorICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYykgeworICAgIERlY2xUeXBlSW5mby5wdXNoX2JhY2soVEkpOworICAgIERlY2xUeXBlSW5mby5iYWNrKCkuZ2V0QXR0ckxpc3RSZWYoKSA9IGF0dHJzLmdldExpc3QoKTsKKyAgICBnZXRBdHRyaWJ1dGVQb29sKCkudGFrZUFsbEZyb20oYXR0cnMuZ2V0UG9vbCgpKTsKKworICAgIGlmICghRW5kTG9jLmlzSW52YWxpZCgpKQorICAgICAgU2V0UmFuZ2VFbmQoRW5kTG9jKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IGlubmVybW9zdCBjaHVuayB0byB0aGlzIGRlY2xhcmF0b3IuCisgIHZvaWQgQWRkSW5uZXJtb3N0VHlwZUluZm8oY29uc3QgRGVjbGFyYXRvckNodW5rICZUSSkgeworICAgIERlY2xUeXBlSW5mby5pbnNlcnQoRGVjbFR5cGVJbmZvLmJlZ2luKCksIFRJKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgdHlwZXMgYXBwbGllZCB0byB0aGlzIGRlY2xhcmF0b3IuCisgIHVuc2lnbmVkIGdldE51bVR5cGVPYmplY3RzKCkgY29uc3QgeyByZXR1cm4gRGVjbFR5cGVJbmZvLnNpemUoKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIHNwZWNpZmllZCBUeXBlSW5mbyBmcm9tIHRoaXMgZGVjbGFyYXRvci4gIFR5cGVJbmZvICMwIGlzCisgIC8vLyBjbG9zZXN0IHRvIHRoZSBpZGVudGlmaWVyLgorICBjb25zdCBEZWNsYXJhdG9yQ2h1bmsgJmdldFR5cGVPYmplY3QodW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgRGVjbFR5cGVJbmZvLnNpemUoKSAmJiAiSW52YWxpZCB0eXBlIGNodW5rIik7CisgICAgcmV0dXJuIERlY2xUeXBlSW5mb1tpXTsKKyAgfQorICBEZWNsYXJhdG9yQ2h1bmsgJmdldFR5cGVPYmplY3QodW5zaWduZWQgaSkgeworICAgIGFzc2VydChpIDwgRGVjbFR5cGVJbmZvLnNpemUoKSAmJiAiSW52YWxpZCB0eXBlIGNodW5rIik7CisgICAgcmV0dXJuIERlY2xUeXBlSW5mb1tpXTsKKyAgfQorCisgIHR5cGVkZWYgU21hbGxWZWN0b3JJbXBsPERlY2xhcmF0b3JDaHVuaz46OmNvbnN0X2l0ZXJhdG9yIHR5cGVfb2JqZWN0X2l0ZXJhdG9yOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHR5cGVfb2JqZWN0X2l0ZXJhdG9yPiB0eXBlX29iamVjdF9yYW5nZTsKKworICAvLy8gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgdHlwZSBvYmplY3RzLCBmcm9tIHRoZSBpZGVudGlmaWVyIG91dHdhcmRzLgorICB0eXBlX29iamVjdF9yYW5nZSB0eXBlX29iamVjdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGVfb2JqZWN0X3JhbmdlKERlY2xUeXBlSW5mby5iZWdpbigpLCBEZWNsVHlwZUluZm8uZW5kKCkpOworICB9CisKKyAgdm9pZCBEcm9wRmlyc3RUeXBlT2JqZWN0KCkgeworICAgIGFzc2VydCghRGVjbFR5cGVJbmZvLmVtcHR5KCkgJiYgIk5vIHR5cGUgY2h1bmtzIHRvIGRyb3AuIik7CisgICAgRGVjbFR5cGVJbmZvLmZyb250KCkuZGVzdHJveSgpOworICAgIERlY2xUeXBlSW5mby5lcmFzZShEZWNsVHlwZUluZm8uYmVnaW4oKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBpbm5lcm1vc3QgKGNsb3Nlc3QgdG8gdGhlIGRlY2xhcmF0b3IpIGNodW5rIG9mIHRoaXMKKyAgLy8vIGRlY2xhcmF0b3IgdGhhdCBpcyBub3QgYSBwYXJlbnMgY2h1bmssIG9yIG51bGwgaWYgdGhlcmUgYXJlIG5vCisgIC8vLyBub24tcGFyZW5zIGNodW5rcy4KKyAgY29uc3QgRGVjbGFyYXRvckNodW5rICpnZXRJbm5lcm1vc3ROb25QYXJlbkNodW5rKCkgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGlfZW5kID0gRGVjbFR5cGVJbmZvLnNpemUoKTsgaSA8IGlfZW5kOyArK2kpIHsKKyAgICAgIGlmICghRGVjbFR5cGVJbmZvW2ldLmlzUGFyZW4oKSkKKyAgICAgICAgcmV0dXJuICZEZWNsVHlwZUluZm9baV07CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgb3V0ZXJtb3N0IChmdXJ0aGVzdCBmcm9tIHRoZSBkZWNsYXJhdG9yKSBjaHVuayBvZgorICAvLy8gdGhpcyBkZWNsYXJhdG9yIHRoYXQgaXMgbm90IGEgcGFyZW5zIGNodW5rLCBvciBudWxsIGlmIHRoZXJlIGFyZQorICAvLy8gbm8gbm9uLXBhcmVucyBjaHVua3MuCisgIGNvbnN0IERlY2xhcmF0b3JDaHVuayAqZ2V0T3V0ZXJtb3N0Tm9uUGFyZW5DaHVuaygpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBEZWNsVHlwZUluZm8uc2l6ZSgpLCBpX2VuZCA9IDA7IGkgIT0gaV9lbmQ7IC0taSkgeworICAgICAgaWYgKCFEZWNsVHlwZUluZm9baS0xXS5pc1BhcmVuKCkpCisgICAgICAgIHJldHVybiAmRGVjbFR5cGVJbmZvW2ktMV07CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIGlzQXJyYXlPZlVua25vd25Cb3VuZCAtIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgZGVjbGFyYXRvcgorICAvLy8gaXMgYSBkZWNsYXJhdG9yIGZvciBhbiBhcnJheSBvZiB1bmtub3duIGJvdW5kIChsb29raW5nIHRocm91Z2gKKyAgLy8vIHBhcmVudGhlc2VzKS4KKyAgYm9vbCBpc0FycmF5T2ZVbmtub3duQm91bmQoKSBjb25zdCB7CisgICAgY29uc3QgRGVjbGFyYXRvckNodW5rICpjaHVuayA9IGdldElubmVybW9zdE5vblBhcmVuQ2h1bmsoKTsKKyAgICByZXR1cm4gKGNodW5rICYmIGNodW5rLT5LaW5kID09IERlY2xhcmF0b3JDaHVuazo6QXJyYXkgJiYKKyAgICAgICAgICAgICFjaHVuay0+QXJyLk51bUVsdHMpOworICB9CisKKyAgLy8vIGlzRnVuY3Rpb25EZWNsYXJhdG9yIC0gVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBkZWNsYXJhdG9yCisgIC8vLyBpcyBhIGZ1bmN0aW9uIGRlY2xhcmF0b3IgKGxvb2tpbmcgdGhyb3VnaCBwYXJlbnRoZXNlcykuCisgIC8vLyBJZiB0cnVlIGlzIHJldHVybmVkLCB0aGVuIHRoZSByZWZlcmVuY2UgdHlwZSBwYXJhbWV0ZXIgaWR4IGlzCisgIC8vLyBhc3NpZ25lZCB3aXRoIHRoZSBpbmRleCBvZiB0aGUgZGVjbGFyYXRpb24gY2h1bmsuCisgIGJvb2wgaXNGdW5jdGlvbkRlY2xhcmF0b3IodW5zaWduZWQmIGlkeCkgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGlfZW5kID0gRGVjbFR5cGVJbmZvLnNpemUoKTsgaSA8IGlfZW5kOyArK2kpIHsKKyAgICAgIHN3aXRjaCAoRGVjbFR5cGVJbmZvW2ldLktpbmQpIHsKKyAgICAgIGNhc2UgRGVjbGFyYXRvckNodW5rOjpGdW5jdGlvbjoKKyAgICAgICAgaWR4ID0gaTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBjYXNlIERlY2xhcmF0b3JDaHVuazo6UGFyZW46CisgICAgICAgIGNvbnRpbnVlOworICAgICAgY2FzZSBEZWNsYXJhdG9yQ2h1bms6OlBvaW50ZXI6CisgICAgICBjYXNlIERlY2xhcmF0b3JDaHVuazo6UmVmZXJlbmNlOgorICAgICAgY2FzZSBEZWNsYXJhdG9yQ2h1bms6OkFycmF5OgorICAgICAgY2FzZSBEZWNsYXJhdG9yQ2h1bms6OkJsb2NrUG9pbnRlcjoKKyAgICAgIGNhc2UgRGVjbGFyYXRvckNodW5rOjpNZW1iZXJQb2ludGVyOgorICAgICAgY2FzZSBEZWNsYXJhdG9yQ2h1bms6OlBpcGU6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgdHlwZSBjaHVuayIpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gaXNGdW5jdGlvbkRlY2xhcmF0b3IgLSBPbmNlIHRoaXMgZGVjbGFyYXRvciBpcyBmdWxseSBwYXJzZWQgYW5kIGZvcm1lZCwKKyAgLy8vIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgaWRlbnRpZmllciBpcyBhIGZ1bmN0aW9uIGRlY2xhcmF0b3IKKyAgLy8vIChsb29raW5nIHRocm91Z2ggcGFyZW50aGVzZXMpLgorICBib29sIGlzRnVuY3Rpb25EZWNsYXJhdG9yKCkgY29uc3QgeworICAgIHVuc2lnbmVkIGluZGV4OworICAgIHJldHVybiBpc0Z1bmN0aW9uRGVjbGFyYXRvcihpbmRleCk7CisgIH0KKworICAvLy8gZ2V0RnVuY3Rpb25UeXBlSW5mbyAtIFJldHJpZXZlcyB0aGUgZnVuY3Rpb24gdHlwZSBpbmZvIG9iamVjdAorICAvLy8gKGxvb2tpbmcgdGhyb3VnaCBwYXJlbnRoZXNlcykuCisgIERlY2xhcmF0b3JDaHVuazo6RnVuY3Rpb25UeXBlSW5mbyAmZ2V0RnVuY3Rpb25UeXBlSW5mbygpIHsKKyAgICBhc3NlcnQoaXNGdW5jdGlvbkRlY2xhcmF0b3IoKSAmJiAiTm90IGEgZnVuY3Rpb24gZGVjbGFyYXRvciEiKTsKKyAgICB1bnNpZ25lZCBpbmRleCA9IDA7CisgICAgaXNGdW5jdGlvbkRlY2xhcmF0b3IoaW5kZXgpOworICAgIHJldHVybiBEZWNsVHlwZUluZm9baW5kZXhdLkZ1bjsKKyAgfQorCisgIC8vLyBnZXRGdW5jdGlvblR5cGVJbmZvIC0gUmV0cmlldmVzIHRoZSBmdW5jdGlvbiB0eXBlIGluZm8gb2JqZWN0CisgIC8vLyAobG9va2luZyB0aHJvdWdoIHBhcmVudGhlc2VzKS4KKyAgY29uc3QgRGVjbGFyYXRvckNodW5rOjpGdW5jdGlvblR5cGVJbmZvICZnZXRGdW5jdGlvblR5cGVJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PERlY2xhcmF0b3IqPih0aGlzKS0+Z2V0RnVuY3Rpb25UeXBlSW5mbygpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVjbGFyYXRpb24gdGhhdCB3aWxsIGJlIHByb2R1Y2VkIGZyb20gCisgIC8vLyB0aGlzIGRlY2xhcmF0aW9uIHdpbGwgYmUgYSBmdW5jdGlvbi4KKyAgLy8vIAorICAvLy8gQSBkZWNsYXJhdGlvbiBjYW4gZGVjbGFyZSBhIGZ1bmN0aW9uIGV2ZW4gaWYgdGhlIGRlY2xhcmF0b3IgaXRzZWxmCisgIC8vLyBpc24ndCBhIGZ1bmN0aW9uIGRlY2xhcmF0b3IsIGlmIHRoZSB0eXBlIHNwZWNpZmllciByZWZlcnMgdG8gYSBmdW5jdGlvbgorICAvLy8gdHlwZS4gVGhpcyByb3V0aW5lIGNoZWNrcyBmb3IgYm90aCBjYXNlcy4KKyAgYm9vbCBpc0RlY2xhcmF0aW9uT2ZGdW5jdGlvbigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBkZWNsYXJhdGlvbiBhcHBlYXJzIGluIGEgY29udGV4dCB3aGVyZSBhCisgIC8vLyBmdW5jdGlvbiBkZWNsYXJhdG9yIHdvdWxkIGJlIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24uCisgIGJvb2wgaXNGdW5jdGlvbkRlY2xhcmF0aW9uQ29udGV4dCgpIGNvbnN0IHsKKyAgICBpZiAoZ2V0RGVjbFNwZWMoKS5nZXRTdG9yYWdlQ2xhc3NTcGVjKCkgPT0gRGVjbFNwZWM6OlNDU190eXBlZGVmKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgc3dpdGNoIChDb250ZXh0KSB7CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6RmlsZUNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6TWVtYmVyQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpCbG9ja0NvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6Rm9yQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpJbml0U3RtdENvbnRleHQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkNvbmRpdGlvbkNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6S05SVHlwZUxpc3RDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OlR5cGVOYW1lQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpGdW5jdGlvbmFsQ2FzdENvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6QWxpYXNEZWNsQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpBbGlhc1RlbXBsYXRlQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpQcm90b3R5cGVDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkxhbWJkYUV4cHJQYXJhbWV0ZXJDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6Ok9iakNQYXJhbWV0ZXJDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6Ok9iakNSZXN1bHRDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OlRlbXBsYXRlUGFyYW1Db250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkNYWE5ld0NvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6Q1hYQ2F0Y2hDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6Ok9iakNDYXRjaENvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6QmxvY2tMaXRlcmFsQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpMYW1iZGFFeHByQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpDb252ZXJzaW9uSWRDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OlRlbXBsYXRlQXJnQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpUZW1wbGF0ZVR5cGVBcmdDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OlRyYWlsaW5nUmV0dXJuQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpUcmFpbGluZ1JldHVyblZhckNvbnRleHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoInVua25vd24gY29udGV4dCBraW5kISIpOworICB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gYXBwZWFycyBpbiBhIGNvbnRleHQgd2hlcmUgYW4KKyAgLy8vIGV4cHJlc3Npb24gY291bGQgYXBwZWFyLgorICBib29sIGlzRXhwcmVzc2lvbkNvbnRleHQoKSBjb25zdCB7CisgICAgc3dpdGNoIChDb250ZXh0KSB7CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6RmlsZUNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6S05SVHlwZUxpc3RDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6Ok1lbWJlckNvbnRleHQ6CisKKyAgICAvLyBGSVhNRTogc2l6ZW9mKC4uLikgcGVybWl0cyBhbiBleHByZXNzaW9uLgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OlR5cGVOYW1lQ29udGV4dDogCisgICAgCisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6RnVuY3Rpb25hbENhc3RDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkFsaWFzRGVjbENvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6QWxpYXNUZW1wbGF0ZUNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6UHJvdG90eXBlQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpMYW1iZGFFeHByUGFyYW1ldGVyQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpPYmpDUGFyYW1ldGVyQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpPYmpDUmVzdWx0Q29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpUZW1wbGF0ZVBhcmFtQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpDWFhOZXdDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkNYWENhdGNoQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpPYmpDQ2F0Y2hDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OkJsb2NrTGl0ZXJhbENvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6TGFtYmRhRXhwckNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6Q29udmVyc2lvbklkQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpUcmFpbGluZ1JldHVybkNvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6VHJhaWxpbmdSZXR1cm5WYXJDb250ZXh0OgorICAgIGNhc2UgRGVjbGFyYXRvckNvbnRleHQ6OlRlbXBsYXRlVHlwZUFyZ0NvbnRleHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpCbG9ja0NvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6Rm9yQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpJbml0U3RtdENvbnRleHQ6CisgICAgY2FzZSBEZWNsYXJhdG9yQ29udGV4dDo6Q29uZGl0aW9uQ29udGV4dDoKKyAgICBjYXNlIERlY2xhcmF0b3JDb250ZXh0OjpUZW1wbGF0ZUFyZ0NvbnRleHQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJ1bmtub3duIGNvbnRleHQga2luZCEiKTsKKyAgfQorICAKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBhIGZ1bmN0aW9uIGRlY2xhcmF0b3IgYXQgdGhpcyBwb3NpdGlvbiB3b3VsZCBiZSBhCisgIC8vLyBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KKyAgYm9vbCBpc0Z1bmN0aW9uRGVjbGFyYXRvckFGdW5jdGlvbkRlY2xhcmF0aW9uKCkgY29uc3QgeworICAgIGlmICghaXNGdW5jdGlvbkRlY2xhcmF0aW9uQ29udGV4dCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IGdldE51bVR5cGVPYmplY3RzKCk7IEkgIT0gTjsgKytJKQorICAgICAgaWYgKGdldFR5cGVPYmplY3QoSSkuS2luZCAhPSBEZWNsYXJhdG9yQ2h1bms6OlBhcmVuKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgYSB0cmFpbGluZyByZXR1cm4gdHlwZSB3YXMgd3JpdHRlbiAoYXQgYW55CisgIC8vLyBsZXZlbCkgd2l0aGluIHRoaXMgZGVjbGFyYXRvci4KKyAgYm9vbCBoYXNUcmFpbGluZ1JldHVyblR5cGUoKSBjb25zdCB7CisgICAgZm9yIChjb25zdCBhdXRvICZDaHVuayA6IHR5cGVfb2JqZWN0cygpKQorICAgICAgaWYgKENodW5rLktpbmQgPT0gRGVjbGFyYXRvckNodW5rOjpGdW5jdGlvbiAmJgorICAgICAgICAgIENodW5rLkZ1bi5oYXNUcmFpbGluZ1JldHVyblR5cGUoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIHRha2VBdHRyaWJ1dGVzIC0gVGFrZXMgYXR0cmlidXRlcyBmcm9tIHRoZSBnaXZlbiBwYXJzZWQtYXR0cmlidXRlcworICAvLy8gc2V0IGFuZCBhZGQgdGhlbSB0byB0aGlzIGRlY2xhcmF0b3IuCisgIC8vLworICAvLy8gVGhlc2UgZXhhbXBsZXMgYm90aCBhZGQgMyBhdHRyaWJ1dGVzIHRvICJ2YXIiOgorICAvLy8gIHNob3J0IGludCB2YXIgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNiksY29tbW9uLGRlcHJlY2F0ZWQpKTsKKyAgLy8vICBzaG9ydCBpbnQgeCwgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpIHZhcgorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChjb21tb24sZGVwcmVjYXRlZCkpOworICAvLy8KKyAgLy8vIEFsc28gZXh0ZW5kcyB0aGUgcmFuZ2Ugb2YgdGhlIGRlY2xhcmF0b3IuCisgIHZvaWQgdGFrZUF0dHJpYnV0ZXMoUGFyc2VkQXR0cmlidXRlcyAmYXR0cnMsIFNvdXJjZUxvY2F0aW9uIGxhc3RMb2MpIHsKKyAgICBBdHRycy50YWtlQWxsRnJvbShhdHRycyk7CisKKyAgICBpZiAoIWxhc3RMb2MuaXNJbnZhbGlkKCkpCisgICAgICBTZXRSYW5nZUVuZChsYXN0TG9jKTsKKyAgfQorCisgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgKmdldEF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBBdHRycy5nZXRMaXN0KCk7IH0KKyAgQXR0cmlidXRlTGlzdCAqZ2V0QXR0cmlidXRlcygpIHsgcmV0dXJuIEF0dHJzLmdldExpc3QoKTsgfQorCisgIEF0dHJpYnV0ZUxpc3QgKiZnZXRBdHRyTGlzdFJlZigpIHsgcmV0dXJuIEF0dHJzLmdldExpc3RSZWYoKTsgfQorCisgIC8vLyBoYXNBdHRyaWJ1dGVzIC0gZG8gd2UgY29udGFpbiBhbnkgYXR0cmlidXRlcz8KKyAgYm9vbCBoYXNBdHRyaWJ1dGVzKCkgY29uc3QgeworICAgIGlmIChnZXRBdHRyaWJ1dGVzKCkgfHwgZ2V0RGVjbFNwZWMoKS5oYXNBdHRyaWJ1dGVzKCkpIHJldHVybiB0cnVlOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1UeXBlT2JqZWN0cygpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChnZXRUeXBlT2JqZWN0KGkpLmdldEF0dHJzKCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgc291cmNlIHJhbmdlIGxpc3Qgb2YgQysrMTEgYXR0cmlidXRlcyBhc3NvY2lhdGVkCisgIC8vLyB3aXRoIHRoZSBkZWNsYXJhdG9yLgorICB2b2lkIGdldENYWDExQXR0cmlidXRlUmFuZ2VzKFNtYWxsVmVjdG9ySW1wbDxTb3VyY2VSYW5nZT4gJlJhbmdlcykgeworICAgIEF0dHJpYnV0ZUxpc3QgKkF0dHJMaXN0ID0gQXR0cnMuZ2V0TGlzdCgpOworICAgIHdoaWxlIChBdHRyTGlzdCkgeworICAgICAgaWYgKEF0dHJMaXN0LT5pc0NYWDExQXR0cmlidXRlKCkpCisgICAgICAgIFJhbmdlcy5wdXNoX2JhY2soQXR0ckxpc3QtPmdldFJhbmdlKCkpOworICAgICAgQXR0ckxpc3QgPSBBdHRyTGlzdC0+Z2V0TmV4dCgpOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0QXNtTGFiZWwoRXhwciAqRSkgeyBBc21MYWJlbCA9IEU7IH0KKyAgRXhwciAqZ2V0QXNtTGFiZWwoKSBjb25zdCB7IHJldHVybiBBc21MYWJlbDsgfQorCisgIHZvaWQgc2V0RXh0ZW5zaW9uKGJvb2wgVmFsID0gdHJ1ZSkgeyBFeHRlbnNpb24gPSBWYWw7IH0KKyAgYm9vbCBnZXRFeHRlbnNpb24oKSBjb25zdCB7IHJldHVybiBFeHRlbnNpb247IH0KKworICB2b2lkIHNldE9iakNJdmFyKGJvb2wgVmFsID0gdHJ1ZSkgeyBPYmpDSXZhciA9IFZhbDsgfQorICBib29sIGlzT2JqQ0l2YXIoKSBjb25zdCB7IHJldHVybiBPYmpDSXZhcjsgfQorICAgIAorICB2b2lkIHNldE9iakNXZWFrUHJvcGVydHkoYm9vbCBWYWwgPSB0cnVlKSB7IE9iakNXZWFrUHJvcGVydHkgPSBWYWw7IH0KKyAgYm9vbCBpc09iakNXZWFrUHJvcGVydHkoKSBjb25zdCB7IHJldHVybiBPYmpDV2Vha1Byb3BlcnR5OyB9CisKKyAgdm9pZCBzZXRJbnZhbGlkVHlwZShib29sIFZhbCA9IHRydWUpIHsgSW52YWxpZFR5cGUgPSBWYWw7IH0KKyAgYm9vbCBpc0ludmFsaWRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBJbnZhbGlkVHlwZSB8fCBEUy5nZXRUeXBlU3BlY1R5cGUoKSA9PSBEZWNsU3BlYzo6VFNUX2Vycm9yOworICB9CisKKyAgdm9pZCBzZXRHcm91cGluZ1BhcmVucyhib29sIGZsYWcpIHsgR3JvdXBpbmdQYXJlbnMgPSBmbGFnOyB9CisgIGJvb2wgaGFzR3JvdXBpbmdQYXJlbnMoKSBjb25zdCB7IHJldHVybiBHcm91cGluZ1BhcmVuczsgfQorCisgIGJvb2wgaXNGaXJzdERlY2xhcmF0b3IoKSBjb25zdCB7IHJldHVybiAhQ29tbWFMb2MuaXNWYWxpZCgpOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldENvbW1hTG9jKCkgY29uc3QgeyByZXR1cm4gQ29tbWFMb2M7IH0KKyAgdm9pZCBzZXRDb21tYUxvYyhTb3VyY2VMb2NhdGlvbiBDTCkgeyBDb21tYUxvYyA9IENMOyB9CisKKyAgYm9vbCBoYXNFbGxpcHNpcygpIGNvbnN0IHsgcmV0dXJuIEVsbGlwc2lzTG9jLmlzVmFsaWQoKTsgfQorICBTb3VyY2VMb2NhdGlvbiBnZXRFbGxpcHNpc0xvYygpIGNvbnN0IHsgcmV0dXJuIEVsbGlwc2lzTG9jOyB9CisgIHZvaWQgc2V0RWxsaXBzaXNMb2MoU291cmNlTG9jYXRpb24gRUwpIHsgRWxsaXBzaXNMb2MgPSBFTDsgfQorCisgIHZvaWQgc2V0RnVuY3Rpb25EZWZpbml0aW9uS2luZChGdW5jdGlvbkRlZmluaXRpb25LaW5kIFZhbCkgeyAKKyAgICBGdW5jdGlvbkRlZmluaXRpb24gPSBWYWw7IAorICB9CisgIAorICBib29sIGlzRnVuY3Rpb25EZWZpbml0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBnZXRGdW5jdGlvbkRlZmluaXRpb25LaW5kKCkgIT0gRkRLX0RlY2xhcmF0aW9uOworICB9CisgIAorICBGdW5jdGlvbkRlZmluaXRpb25LaW5kIGdldEZ1bmN0aW9uRGVmaW5pdGlvbktpbmQoKSBjb25zdCB7IAorICAgIHJldHVybiAoRnVuY3Rpb25EZWZpbml0aW9uS2luZClGdW5jdGlvbkRlZmluaXRpb247IAorICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRlY2xhcmVzIGEgcmVhbCBtZW1iZXIgYW5kIG5vdCBhIGZyaWVuZC4KKyAgYm9vbCBpc0ZpcnN0RGVjbGFyYXRpb25PZk1lbWJlcigpIHsKKyAgICByZXR1cm4gZ2V0Q29udGV4dCgpID09IERlY2xhcmF0b3JDb250ZXh0OjpNZW1iZXJDb250ZXh0ICYmCisgICAgICAgICAgICFnZXREZWNsU3BlYygpLmlzRnJpZW5kU3BlY2lmaWVkKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgZGVjbGFyZXMgYSBzdGF0aWMgbWVtYmVyLiAgVGhpcyBjYW5ub3QgYmUgY2FsbGVkIG9uIGEKKyAgLy8vIGRlY2xhcmF0b3Igb3V0c2lkZSBvZiBhIE1lbWJlckNvbnRleHQgYmVjYXVzZSB3ZSB3b24ndCBrbm93IHVudGlsCisgIC8vLyByZWRlY2xhcmF0aW9uIHRpbWUgaWYgdGhlIGRlY2wgaXMgc3RhdGljLgorICBib29sIGlzU3RhdGljTWVtYmVyKCk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRlY2xhcmVzIGEgY29uc3RydWN0b3Igb3IgYSBkZXN0cnVjdG9yLgorICBib29sIGlzQ3Rvck9yRHRvcigpOworCisgIHZvaWQgc2V0UmVkZWNsYXJhdGlvbihib29sIFZhbCkgeyBSZWRlY2xhcmF0aW9uID0gVmFsOyB9CisgIGJvb2wgaXNSZWRlY2xhcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gUmVkZWNsYXJhdGlvbjsgfQorfTsKKworLy8vIFxicmllZiBUaGlzIGxpdHRsZSBzdHJ1Y3QgaXMgdXNlZCB0byBjYXB0dXJlIGluZm9ybWF0aW9uIGFib3V0CisvLy8gc3RydWN0dXJlIGZpZWxkIGRlY2xhcmF0b3JzLCB3aGljaCBpcyBiYXNpY2FsbHkganVzdCBhIGJpdGZpZWxkIHNpemUuCitzdHJ1Y3QgRmllbGREZWNsYXJhdG9yIHsKKyAgRGVjbGFyYXRvciBEOworICBFeHByICpCaXRmaWVsZFNpemU7CisgIGV4cGxpY2l0IEZpZWxkRGVjbGFyYXRvcihjb25zdCBEZWNsU3BlYyAmRFMpCisgICAgICA6IEQoRFMsIERlY2xhcmF0b3JDb250ZXh0OjpNZW1iZXJDb250ZXh0KSwKKyAgICAgICAgQml0ZmllbGRTaXplKG51bGxwdHIpIHt9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBDKysxMSB2aXJ0LXNwZWNpZmllci1zZXEuCitjbGFzcyBWaXJ0U3BlY2lmaWVycyB7CitwdWJsaWM6CisgIGVudW0gU3BlY2lmaWVyIHsKKyAgICBWU19Ob25lID0gMCwKKyAgICBWU19PdmVycmlkZSA9IDEsCisgICAgVlNfRmluYWwgPSAyLAorICAgIFZTX1NlYWxlZCA9IDQsCisgICAgLy8gUmVwcmVzZW50cyB0aGUgX19maW5hbCBrZXl3b3JkLCB3aGljaCBpcyBsZWdhbCBmb3IgZ2NjIGluIHByZS1DKysxMSBtb2RlLgorICAgIFZTX0dOVV9GaW5hbCA9IDgKKyAgfTsKKworICBWaXJ0U3BlY2lmaWVycygpIDogU3BlY2lmaWVycygwKSwgTGFzdFNwZWNpZmllcihWU19Ob25lKSB7IH0KKworICBib29sIFNldFNwZWNpZmllcihTcGVjaWZpZXIgVlMsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqJlByZXZTcGVjKTsKKworICBib29sIGlzVW5zZXQoKSBjb25zdCB7IHJldHVybiBTcGVjaWZpZXJzID09IDA7IH0KKworICBib29sIGlzT3ZlcnJpZGVTcGVjaWZpZWQoKSBjb25zdCB7IHJldHVybiBTcGVjaWZpZXJzICYgVlNfT3ZlcnJpZGU7IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0T3ZlcnJpZGVMb2MoKSBjb25zdCB7IHJldHVybiBWU19vdmVycmlkZUxvYzsgfQorCisgIGJvb2wgaXNGaW5hbFNwZWNpZmllZCgpIGNvbnN0IHsgcmV0dXJuIFNwZWNpZmllcnMgJiAoVlNfRmluYWwgfCBWU19TZWFsZWQgfCBWU19HTlVfRmluYWwpOyB9CisgIGJvb2wgaXNGaW5hbFNwZWxsZWRTZWFsZWQoKSBjb25zdCB7IHJldHVybiBTcGVjaWZpZXJzICYgVlNfU2VhbGVkOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldEZpbmFsTG9jKCkgY29uc3QgeyByZXR1cm4gVlNfZmluYWxMb2M7IH0KKworICB2b2lkIGNsZWFyKCkgeyBTcGVjaWZpZXJzID0gMDsgfQorCisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRTcGVjaWZpZXJOYW1lKFNwZWNpZmllciBWUyk7CisKKyAgU291cmNlTG9jYXRpb24gZ2V0Rmlyc3RMb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIEZpcnN0TG9jYXRpb247IH0KKyAgU291cmNlTG9jYXRpb24gZ2V0TGFzdExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gTGFzdExvY2F0aW9uOyB9CisgIFNwZWNpZmllciBnZXRMYXN0U3BlY2lmaWVyKCkgY29uc3QgeyByZXR1cm4gTGFzdFNwZWNpZmllcjsgfQorICAKK3ByaXZhdGU6CisgIHVuc2lnbmVkIFNwZWNpZmllcnM7CisgIFNwZWNpZmllciBMYXN0U3BlY2lmaWVyOworCisgIFNvdXJjZUxvY2F0aW9uIFZTX292ZXJyaWRlTG9jLCBWU19maW5hbExvYzsKKyAgU291cmNlTG9jYXRpb24gRmlyc3RMb2NhdGlvbjsKKyAgU291cmNlTG9jYXRpb24gTGFzdExvY2F0aW9uOworfTsKKworZW51bSBjbGFzcyBMYW1iZGFDYXB0dXJlSW5pdEtpbmQgeworICBOb0luaXQsICAgICAvLyE8IFthXQorICBDb3B5SW5pdCwgICAvLyE8IFthID0gYl0sIFthID0ge2J9XQorICBEaXJlY3RJbml0LCAvLyE8IFthKGIpXQorICBMaXN0SW5pdCAgICAvLyE8IFthe2J9XQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgY29tcGxldGUgbGFtYmRhIGludHJvZHVjZXIuCitzdHJ1Y3QgTGFtYmRhSW50cm9kdWNlciB7CisgIC8vLyBcYnJpZWYgQW4gaW5kaXZpZHVhbCBjYXB0dXJlIGluIGEgbGFtYmRhIGludHJvZHVjZXIuCisgIHN0cnVjdCBMYW1iZGFDYXB0dXJlIHsKKyAgICBMYW1iZGFDYXB0dXJlS2luZCBLaW5kOworICAgIFNvdXJjZUxvY2F0aW9uIExvYzsKKyAgICBJZGVudGlmaWVySW5mbyAqSWQ7CisgICAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2M7CisgICAgTGFtYmRhQ2FwdHVyZUluaXRLaW5kIEluaXRLaW5kOworICAgIEV4cHJSZXN1bHQgSW5pdDsKKyAgICBQYXJzZWRUeXBlIEluaXRDYXB0dXJlVHlwZTsKKyAgICBMYW1iZGFDYXB0dXJlKExhbWJkYUNhcHR1cmVLaW5kIEtpbmQsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpJZCwgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MsCisgICAgICAgICAgICAgICAgICBMYW1iZGFDYXB0dXJlSW5pdEtpbmQgSW5pdEtpbmQsIEV4cHJSZXN1bHQgSW5pdCwKKyAgICAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgSW5pdENhcHR1cmVUeXBlKQorICAgICAgICA6IEtpbmQoS2luZCksIExvYyhMb2MpLCBJZChJZCksIEVsbGlwc2lzTG9jKEVsbGlwc2lzTG9jKSwKKyAgICAgICAgICBJbml0S2luZChJbml0S2luZCksIEluaXQoSW5pdCksIEluaXRDYXB0dXJlVHlwZShJbml0Q2FwdHVyZVR5cGUpIHt9CisgIH07CisKKyAgU291cmNlUmFuZ2UgUmFuZ2U7CisgIFNvdXJjZUxvY2F0aW9uIERlZmF1bHRMb2M7CisgIExhbWJkYUNhcHR1cmVEZWZhdWx0IERlZmF1bHQ7CisgIFNtYWxsVmVjdG9yPExhbWJkYUNhcHR1cmUsIDQ+IENhcHR1cmVzOworCisgIExhbWJkYUludHJvZHVjZXIoKQorICAgIDogRGVmYXVsdChMQ0RfTm9uZSkge30KKworICAvLy8gXGJyaWVmIEFwcGVuZCBhIGNhcHR1cmUgaW4gYSBsYW1iZGEgaW50cm9kdWNlci4KKyAgdm9pZCBhZGRDYXB0dXJlKExhbWJkYUNhcHR1cmVLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyogSWQsCisgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYywKKyAgICAgICAgICAgICAgICAgIExhbWJkYUNhcHR1cmVJbml0S2luZCBJbml0S2luZCwKKyAgICAgICAgICAgICAgICAgIEV4cHJSZXN1bHQgSW5pdCwgCisgICAgICAgICAgICAgICAgICBQYXJzZWRUeXBlIEluaXRDYXB0dXJlVHlwZSkgeworICAgIENhcHR1cmVzLnB1c2hfYmFjayhMYW1iZGFDYXB0dXJlKEtpbmQsIExvYywgSWQsIEVsbGlwc2lzTG9jLCBJbml0S2luZCwgSW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0Q2FwdHVyZVR5cGUpKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1NFTUFfREVDTFNQRUNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9EZWxheWVkRGlhZ25vc3RpYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9EZWxheWVkRGlhZ25vc3RpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMmE5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0RlbGF5ZWREaWFnbm9zdGljLmgKQEAgLTAsMCArMSwzMzggQEAKKy8vPT09LSBEZWxheWVkRGlhZ25vc3RpYy5oIC0gRGVsYXllZCBkZWNsYXJhdG9yIGRpYWdub3N0aWNzIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgdGhlIGNsYXNzZXMgY2xhbmc6OkRlbGF5ZWREaWFnbm9zdGljIGFuZCAKKy8vLyBjbGFuZzo6QWNjZXNzZWRFbnRpdHkuCisvLy8KKy8vLyBEZWxheWVkRGlhbmdvc3RpYyBpcyB1c2VkIHRvIHJlY29yZCBkaWFnbm9zdGljcyB0aGF0IGFyZSBiZWluZworLy8vIGNvbmRpdGlvbmFsbHkgcHJvZHVjZWQgZHVyaW5nIGRlY2xhcmF0b3IgcGFyc2luZy4gIENlcnRhaW4ga2luZHMgb2YKKy8vLyBkaWFnbm9zdGljcyAtLSBub3RhYmx5IGRlcHJlY2F0aW9uIGFuZCBhY2Nlc3MgY29udHJvbCAtLSBhcmUgc3VwcHJlc3NlZAorLy8vIGJhc2VkIG9uIHNlbWFudGljIHByb3BlcnRpZXMgb2YgdGhlIHBhcnNlZCBkZWNsYXJhdGlvbiB0aGF0IGFyZW4ndCBrbm93bgorLy8vIHVudGlsIGl0IGlzIGZ1bGx5IHBhcnNlZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU0VNQV9ERUxBWUVERElBR05PU1RJQ19ICisjZGVmaW5lIExMVk1fQ0xBTkdfU0VNQV9ERUxBWUVERElBR05PU1RJQ19ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbEFjY2Vzc1BhaXIuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbEJhc2UuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbENYWC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1BhcnRpYWxEaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9TcGVjaWZpZXJzLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9TZW1hLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIE9iakNJbnRlcmZhY2VEZWNsOworY2xhc3MgT2JqQ1Byb3BlcnR5RGVjbDsKKworbmFtZXNwYWNlIHNlbWEgeworCisvLy8gQSBkZWNsYXJhdGlvbiBiZWluZyBhY2Nlc3NlZCwgdG9nZXRoZXIgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBob3cKKy8vLyBpdCB3YXMgYWNjZXNzZWQuCitjbGFzcyBBY2Nlc3NlZEVudGl0eSB7CitwdWJsaWM6CisgIC8vLyBBIG1lbWJlciBkZWNsYXJhdGlvbiBmb3VuZCB0aHJvdWdoIGxvb2t1cC4gIFRoZSB0YXJnZXQgaXMgdGhlCisgIC8vLyBtZW1iZXIuCisgIGVudW0gTWVtYmVyTm9uY2UgeyBNZW1iZXIgfTsKKworICAvLy8gQSBoaWVyYXJjaHkgKGJhc2UtdG8tZGVyaXZlZCBvciBkZXJpdmVkLXRvLWJhc2UpIGNvbnZlcnNpb24uCisgIC8vLyBUaGUgdGFyZ2V0IGlzIHRoZSBiYXNlIGNsYXNzLgorICBlbnVtIEJhc2VOb25jZSB7IEJhc2UgfTsKKworICBBY2Nlc3NlZEVudGl0eShQYXJ0aWFsRGlhZ25vc3RpYzo6U3RvcmFnZUFsbG9jYXRvciAmQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICBNZW1iZXJOb25jZSBfLAorICAgICAgICAgICAgICAgICBDWFhSZWNvcmREZWNsICpOYW1pbmdDbGFzcywKKyAgICAgICAgICAgICAgICAgRGVjbEFjY2Vzc1BhaXIgRm91bmREZWNsLAorICAgICAgICAgICAgICAgICBRdWFsVHlwZSBCYXNlT2JqZWN0VHlwZSkKKyAgICAgIDogQWNjZXNzKEZvdW5kRGVjbC5nZXRBY2Nlc3MoKSksIElzTWVtYmVyKHRydWUpLAorICAgICAgICBUYXJnZXQoRm91bmREZWNsLmdldERlY2woKSksIE5hbWluZ0NsYXNzKE5hbWluZ0NsYXNzKSwKKyAgICAgICAgQmFzZU9iamVjdFR5cGUoQmFzZU9iamVjdFR5cGUpLCBEaWFnKDAsIEFsbG9jYXRvcikgeworICB9CisKKyAgQWNjZXNzZWRFbnRpdHkoUGFydGlhbERpYWdub3N0aWM6OlN0b3JhZ2VBbGxvY2F0b3IgJkFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgQmFzZU5vbmNlIF8sCisgICAgICAgICAgICAgICAgIENYWFJlY29yZERlY2wgKkJhc2VDbGFzcywKKyAgICAgICAgICAgICAgICAgQ1hYUmVjb3JkRGVjbCAqRGVyaXZlZENsYXNzLAorICAgICAgICAgICAgICAgICBBY2Nlc3NTcGVjaWZpZXIgQWNjZXNzKQorICAgICAgOiBBY2Nlc3MoQWNjZXNzKSwgSXNNZW1iZXIoZmFsc2UpLCBUYXJnZXQoQmFzZUNsYXNzKSwKKyAgICAgICAgTmFtaW5nQ2xhc3MoRGVyaXZlZENsYXNzKSwgRGlhZygwLCBBbGxvY2F0b3IpIHt9CisKKyAgYm9vbCBpc01lbWJlckFjY2VzcygpIGNvbnN0IHsgcmV0dXJuIElzTWVtYmVyOyB9CisKKyAgYm9vbCBpc1F1aWV0KCkgY29uc3QgeyByZXR1cm4gRGlhZy5nZXREaWFnSUQoKSA9PSAwOyB9CisKKyAgQWNjZXNzU3BlY2lmaWVyIGdldEFjY2VzcygpIGNvbnN0IHsgcmV0dXJuIEFjY2Vzc1NwZWNpZmllcihBY2Nlc3MpOyB9CisKKyAgLy8gVGhlc2UgYXBwbHkgdG8gbWVtYmVyIGRlY2xzLi4uCisgIE5hbWVkRGVjbCAqZ2V0VGFyZ2V0RGVjbCgpIGNvbnN0IHsgcmV0dXJuIFRhcmdldDsgfQorICBDWFhSZWNvcmREZWNsICpnZXROYW1pbmdDbGFzcygpIGNvbnN0IHsgcmV0dXJuIE5hbWluZ0NsYXNzOyB9CisKKyAgLy8gLi4uYW5kIHRoZXNlIGFwcGx5IHRvIGhpZXJhcmNoeSBjb252ZXJzaW9ucy4KKyAgQ1hYUmVjb3JkRGVjbCAqZ2V0QmFzZUNsYXNzKCkgY29uc3QgeworICAgIGFzc2VydCghSXNNZW1iZXIpOyByZXR1cm4gY2FzdDxDWFhSZWNvcmREZWNsPihUYXJnZXQpOworICB9CisgIENYWFJlY29yZERlY2wgKmdldERlcml2ZWRDbGFzcygpIGNvbnN0IHsgcmV0dXJuIE5hbWluZ0NsYXNzOyB9CisKKyAgLy8vIFJldHJpZXZlcyB0aGUgYmFzZSBvYmplY3QgdHlwZSwgaW1wb3J0YW50IHdoZW4gYWNjZXNzaW5nCisgIC8vLyBhbiBpbnN0YW5jZSBtZW1iZXIuCisgIFF1YWxUeXBlIGdldEJhc2VPYmplY3RUeXBlKCkgY29uc3QgeyByZXR1cm4gQmFzZU9iamVjdFR5cGU7IH0KKworICAvLy8gU2V0cyBhIGRpYWdub3N0aWMgdG8gYmUgcGVyZm9ybWVkLiAgVGhlIGRpYWdub3N0aWMgaXMgZ2l2ZW4KKyAgLy8vIGZvdXIgKGFkZGl0aW9uYWwpIGFyZ3VtZW50czoKKyAgLy8vICAgJTAgLSAwIGlmIHRoZSBlbnRpdHkgd2FzIHByaXZhdGUsIDEgaWYgcHJvdGVjdGVkCisgIC8vLyAgICUxIC0gdGhlIERlY2xhcmF0aW9uTmFtZSBvZiB0aGUgZW50aXR5CisgIC8vLyAgICUyIC0gdGhlIFR5cGVEZWNsIHR5cGUgb2YgdGhlIG5hbWluZyBjbGFzcworICAvLy8gICAlMyAtIHRoZSBUeXBlRGVjbCB0eXBlIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3MKKyAgdm9pZCBzZXREaWFnKGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZQRGlhZykgeworICAgIGFzc2VydChpc1F1aWV0KCkgJiYgInBhcnRpYWwgZGlhZ25vc3RpYyBhbHJlYWR5IGRlZmluZWQiKTsKKyAgICBEaWFnID0gUERpYWc7CisgIH0KKyAgUGFydGlhbERpYWdub3N0aWMgJnNldERpYWcodW5zaWduZWQgRGlhZ0lEKSB7CisgICAgYXNzZXJ0KGlzUXVpZXQoKSAmJiAicGFydGlhbCBkaWFnbm9zdGljIGFscmVhZHkgZGVmaW5lZCIpOworICAgIGFzc2VydChEaWFnSUQgJiYgImNyZWF0aW5nIG51bGwgZGlhZ25vc3RpYyIpOworICAgIERpYWcuUmVzZXQoRGlhZ0lEKTsKKyAgICByZXR1cm4gRGlhZzsKKyAgfQorICBjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmZ2V0RGlhZygpIGNvbnN0IHsKKyAgICByZXR1cm4gRGlhZzsKKyAgfQorCitwcml2YXRlOgorICB1bnNpZ25lZCBBY2Nlc3MgOiAyOworICB1bnNpZ25lZCBJc01lbWJlciA6IDE7CisgIE5hbWVkRGVjbCAqVGFyZ2V0OworICBDWFhSZWNvcmREZWNsICpOYW1pbmdDbGFzczsKKyAgUXVhbFR5cGUgQmFzZU9iamVjdFR5cGU7CisgIFBhcnRpYWxEaWFnbm9zdGljIERpYWc7Cit9OworCisvLy8gQSBkaWFnbm9zdGljIG1lc3NhZ2Ugd2hpY2ggaGFzIGJlZW4gY29uZGl0aW9uYWxseSBlbWl0dGVkIHBlbmRpbmcKKy8vLyB0aGUgY29tcGxldGUgcGFyc2luZyBvZiB0aGUgY3VycmVudCBkZWNsYXJhdGlvbi4KK2NsYXNzIERlbGF5ZWREaWFnbm9zdGljIHsKK3B1YmxpYzoKKyAgZW51bSBEREtpbmQgOiB1bnNpZ25lZCBjaGFyIHsgQXZhaWxhYmlsaXR5LCBBY2Nlc3MsIEZvcmJpZGRlblR5cGUgfTsKKworICBEREtpbmQgS2luZDsKKyAgYm9vbCBUcmlnZ2VyZWQ7CisKKyAgU291cmNlTG9jYXRpb24gTG9jOworCisgIHZvaWQgRGVzdHJveSgpOworCisgIHN0YXRpYyBEZWxheWVkRGlhZ25vc3RpYyBtYWtlQXZhaWxhYmlsaXR5KEF2YWlsYWJpbGl0eVJlc3VsdCBBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U291cmNlTG9jYXRpb24+IExvY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWVkRGVjbCAqUmVmZXJyaW5nRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZWREZWNsICpPZmZlbmRpbmdEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqVW5rbm93bk9iakNDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ1Byb3BlcnR5RGVjbCAgKk9iakNQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPYmpDUHJvcGVydHlBY2Nlc3MpOworCisgIHN0YXRpYyBEZWxheWVkRGlhZ25vc3RpYyBtYWtlQWNjZXNzKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWNjZXNzZWRFbnRpdHkgJkVudGl0eSkgeworICAgIERlbGF5ZWREaWFnbm9zdGljIEREOworICAgIERELktpbmQgPSBBY2Nlc3M7CisgICAgREQuVHJpZ2dlcmVkID0gZmFsc2U7CisgICAgREQuTG9jID0gTG9jOworICAgIG5ldyAoJkRELmdldEFjY2Vzc0RhdGEoKSkgQWNjZXNzZWRFbnRpdHkoRW50aXR5KTsKKyAgICByZXR1cm4gREQ7CisgIH0KKworICBzdGF0aWMgRGVsYXllZERpYWdub3N0aWMgbWFrZUZvcmJpZGRlblR5cGUoU291cmNlTG9jYXRpb24gbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZGlhZ25vc3RpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBhcmd1bWVudCkgeworICAgIERlbGF5ZWREaWFnbm9zdGljIEREOworICAgIERELktpbmQgPSBGb3JiaWRkZW5UeXBlOworICAgIERELlRyaWdnZXJlZCA9IGZhbHNlOworICAgIERELkxvYyA9IGxvYzsKKyAgICBERC5Gb3JiaWRkZW5UeXBlRGF0YS5EaWFnbm9zdGljID0gZGlhZ25vc3RpYzsKKyAgICBERC5Gb3JiaWRkZW5UeXBlRGF0YS5PcGVyYW5kVHlwZSA9IHR5cGUuZ2V0QXNPcGFxdWVQdHIoKTsKKyAgICBERC5Gb3JiaWRkZW5UeXBlRGF0YS5Bcmd1bWVudCA9IGFyZ3VtZW50OworICAgIHJldHVybiBERDsKKyAgfQorCisgIEFjY2Vzc2VkRW50aXR5ICZnZXRBY2Nlc3NEYXRhKCkgeworICAgIGFzc2VydChLaW5kID09IEFjY2VzcyAmJiAiTm90IGFuIGFjY2VzcyBkaWFnbm9zdGljLiIpOworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxBY2Nlc3NlZEVudGl0eSo+KEFjY2Vzc0RhdGEpOworICB9CisgIGNvbnN0IEFjY2Vzc2VkRW50aXR5ICZnZXRBY2Nlc3NEYXRhKCkgY29uc3QgeworICAgIGFzc2VydChLaW5kID09IEFjY2VzcyAmJiAiTm90IGFuIGFjY2VzcyBkaWFnbm9zdGljLiIpOworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBBY2Nlc3NlZEVudGl0eSo+KEFjY2Vzc0RhdGEpOworICB9CisKKyAgY29uc3QgTmFtZWREZWNsICpnZXRBdmFpbGFiaWxpdHlSZWZlcnJpbmdEZWNsKCkgY29uc3QgeworICAgIGFzc2VydChLaW5kID09IEF2YWlsYWJpbGl0eSAmJiAiTm90IGFuIGF2YWlsYWJpbGl0eSBkaWFnbm9zdGljLiIpOworICAgIHJldHVybiBBdmFpbGFiaWxpdHlEYXRhLlJlZmVycmluZ0RlY2w7CisgIH0KKworICBjb25zdCBOYW1lZERlY2wgKmdldEF2YWlsYWJpbGl0eU9mZmVuZGluZ0RlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIEF2YWlsYWJpbGl0eURhdGEuT2ZmZW5kaW5nRGVjbDsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRBdmFpbGFiaWxpdHlNZXNzYWdlKCkgY29uc3QgeworICAgIGFzc2VydChLaW5kID09IEF2YWlsYWJpbGl0eSAmJiAiTm90IGFuIGF2YWlsYWJpbGl0eSBkaWFnbm9zdGljLiIpOworICAgIHJldHVybiBTdHJpbmdSZWYoQXZhaWxhYmlsaXR5RGF0YS5NZXNzYWdlLCBBdmFpbGFiaWxpdHlEYXRhLk1lc3NhZ2VMZW4pOworICB9CisKKyAgQXJyYXlSZWY8U291cmNlTG9jYXRpb24+IGdldEF2YWlsYWJpbGl0eVNlbGVjdG9yTG9jcygpIGNvbnN0IHsKKyAgICBhc3NlcnQoS2luZCA9PSBBdmFpbGFiaWxpdHkgJiYgIk5vdCBhbiBhdmFpbGFiaWxpdHkgZGlhZ25vc3RpYy4iKTsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKEF2YWlsYWJpbGl0eURhdGEuU2VsZWN0b3JMb2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZhaWxhYmlsaXR5RGF0YS5OdW1TZWxlY3RvckxvY3MpOworICB9CisKKyAgQXZhaWxhYmlsaXR5UmVzdWx0IGdldEF2YWlsYWJpbGl0eVJlc3VsdCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoS2luZCA9PSBBdmFpbGFiaWxpdHkgJiYgIk5vdCBhbiBhdmFpbGFiaWxpdHkgZGlhZ25vc3RpYy4iKTsKKyAgICByZXR1cm4gQXZhaWxhYmlsaXR5RGF0YS5BUjsKKyAgfQorCisgIC8vLyBUaGUgZGlhZ25vc3RpYyBJRCB0byBlbWl0LiAgVXNlZCBsaWtlIHNvOgorICAvLy8gICBEaWFnKGRpYWcuTG9jLCBkaWFnLmdldEZvcmJpZGRlblR5cGVEaWFnbm9zdGljKCkpCisgIC8vLyAgICAgPDwgZGlhZy5nZXRGb3JiaWRkZW5UeXBlT3BlcmFuZCgpCisgIC8vLyAgICAgPDwgZGlhZy5nZXRGb3JiaWRkZW5UeXBlQXJndW1lbnQoKTsKKyAgdW5zaWduZWQgZ2V0Rm9yYmlkZGVuVHlwZURpYWdub3N0aWMoKSBjb25zdCB7CisgICAgYXNzZXJ0KEtpbmQgPT0gRm9yYmlkZGVuVHlwZSAmJiAibm90IGEgZm9yYmlkZGVuLXR5cGUgZGlhZ25vc3RpYyIpOworICAgIHJldHVybiBGb3JiaWRkZW5UeXBlRGF0YS5EaWFnbm9zdGljOworICB9CisKKyAgdW5zaWduZWQgZ2V0Rm9yYmlkZGVuVHlwZUFyZ3VtZW50KCkgY29uc3QgeworICAgIGFzc2VydChLaW5kID09IEZvcmJpZGRlblR5cGUgJiYgIm5vdCBhIGZvcmJpZGRlbi10eXBlIGRpYWdub3N0aWMiKTsKKyAgICByZXR1cm4gRm9yYmlkZGVuVHlwZURhdGEuQXJndW1lbnQ7CisgIH0KKworICBRdWFsVHlwZSBnZXRGb3JiaWRkZW5UeXBlT3BlcmFuZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoS2luZCA9PSBGb3JiaWRkZW5UeXBlICYmICJub3QgYSBmb3JiaWRkZW4tdHlwZSBkaWFnbm9zdGljIik7CisgICAgcmV0dXJuIFF1YWxUeXBlOjpnZXRGcm9tT3BhcXVlUHRyKEZvcmJpZGRlblR5cGVEYXRhLk9wZXJhbmRUeXBlKTsKKyAgfQorCisgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpnZXRVbmtub3duT2JqQ0NsYXNzKCkgY29uc3QgeworICAgIHJldHVybiBBdmFpbGFiaWxpdHlEYXRhLlVua25vd25PYmpDQ2xhc3M7CisgIH0KKworICBjb25zdCBPYmpDUHJvcGVydHlEZWNsICpnZXRPYmpDUHJvcGVydHkoKSBjb25zdCB7CisgICAgcmV0dXJuIEF2YWlsYWJpbGl0eURhdGEuT2JqQ1Byb3BlcnR5OworICB9CisKKyAgYm9vbCBnZXRPYmpDUHJvcGVydHlBY2Nlc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIEF2YWlsYWJpbGl0eURhdGEuT2JqQ1Byb3BlcnR5QWNjZXNzOworICB9CisKK3ByaXZhdGU6CisgIHN0cnVjdCBBRCB7CisgICAgY29uc3QgTmFtZWREZWNsICpSZWZlcnJpbmdEZWNsOworICAgIGNvbnN0IE5hbWVkRGVjbCAqT2ZmZW5kaW5nRGVjbDsKKyAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqVW5rbm93bk9iakNDbGFzczsKKyAgICBjb25zdCBPYmpDUHJvcGVydHlEZWNsICAqT2JqQ1Byb3BlcnR5OworICAgIGNvbnN0IGNoYXIgKk1lc3NhZ2U7CisgICAgc2l6ZV90IE1lc3NhZ2VMZW47CisgICAgU291cmNlTG9jYXRpb24gKlNlbGVjdG9yTG9jczsKKyAgICBzaXplX3QgTnVtU2VsZWN0b3JMb2NzOworICAgIEF2YWlsYWJpbGl0eVJlc3VsdCBBUjsKKyAgICBib29sIE9iakNQcm9wZXJ0eUFjY2VzczsKKyAgfTsKKworICBzdHJ1Y3QgRlREIHsKKyAgICB1bnNpZ25lZCBEaWFnbm9zdGljOworICAgIHVuc2lnbmVkIEFyZ3VtZW50OworICAgIHZvaWQgKk9wZXJhbmRUeXBlOworICB9OworCisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgQUQgQXZhaWxhYmlsaXR5RGF0YTsKKyAgICBzdHJ1Y3QgRlREIEZvcmJpZGRlblR5cGVEYXRhOworCisgICAgLy8vIEFjY2VzcyBjb250cm9sLgorICAgIGNoYXIgQWNjZXNzRGF0YVtzaXplb2YoQWNjZXNzZWRFbnRpdHkpXTsKKyAgfTsKK307CisKKy8vLyBcYnJpZWYgQSBjb2xsZWN0aW9uIG9mIGRpYWdub3N0aWNzIHdoaWNoIHdlcmUgZGVsYXllZC4KK2NsYXNzIERlbGF5ZWREaWFnbm9zdGljUG9vbCB7CisgIGNvbnN0IERlbGF5ZWREaWFnbm9zdGljUG9vbCAqUGFyZW50OworICBTbWFsbFZlY3RvcjxEZWxheWVkRGlhZ25vc3RpYywgND4gRGlhZ25vc3RpY3M7CisKK3B1YmxpYzoKKyAgRGVsYXllZERpYWdub3N0aWNQb29sKGNvbnN0IERlbGF5ZWREaWFnbm9zdGljUG9vbCAqcGFyZW50KSA6IFBhcmVudChwYXJlbnQpIHt9CisKKyAgRGVsYXllZERpYWdub3N0aWNQb29sKGNvbnN0IERlbGF5ZWREaWFnbm9zdGljUG9vbCAmKSA9IGRlbGV0ZTsKKyAgRGVsYXllZERpYWdub3N0aWNQb29sICZvcGVyYXRvcj0oY29uc3QgRGVsYXllZERpYWdub3N0aWNQb29sICYpID0gZGVsZXRlOworCisgIERlbGF5ZWREaWFnbm9zdGljUG9vbChEZWxheWVkRGlhZ25vc3RpY1Bvb2wgJiZPdGhlcikKKyAgICAgIDogUGFyZW50KE90aGVyLlBhcmVudCksIERpYWdub3N0aWNzKHN0ZDo6bW92ZShPdGhlci5EaWFnbm9zdGljcykpIHsKKyAgICBPdGhlci5EaWFnbm9zdGljcy5jbGVhcigpOworICB9CisKKyAgRGVsYXllZERpYWdub3N0aWNQb29sICZvcGVyYXRvcj0oRGVsYXllZERpYWdub3N0aWNQb29sICYmT3RoZXIpIHsKKyAgICBQYXJlbnQgPSBPdGhlci5QYXJlbnQ7CisgICAgRGlhZ25vc3RpY3MgPSBzdGQ6Om1vdmUoT3RoZXIuRGlhZ25vc3RpY3MpOworICAgIE90aGVyLkRpYWdub3N0aWNzLmNsZWFyKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgfkRlbGF5ZWREaWFnbm9zdGljUG9vbCgpIHsKKyAgICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxEZWxheWVkRGlhZ25vc3RpYz46Oml0ZXJhdG9yCisgICAgICAgICAgIGkgPSBEaWFnbm9zdGljcy5iZWdpbigpLCBlID0gRGlhZ25vc3RpY3MuZW5kKCk7IGkgIT0gZTsgKytpKQorICAgICAgaS0+RGVzdHJveSgpOworICB9CisKKyAgY29uc3QgRGVsYXllZERpYWdub3N0aWNQb29sICpnZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBQYXJlbnQ7IH0KKworICAvLy8gRG9lcyB0aGlzIHBvb2wsIG9yIGFueSBvZiBpdHMgYW5jZXN0b3JzLCBjb250YWluIGFueSBkaWFnbm9zdGljcz8KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKERpYWdub3N0aWNzLmVtcHR5KCkgJiYgKCFQYXJlbnQgfHwgUGFyZW50LT5lbXB0eSgpKSk7CisgIH0KKworICAvLy8gQWRkIGEgZGlhZ25vc3RpYyB0byB0aGlzIHBvb2wuCisgIHZvaWQgYWRkKGNvbnN0IERlbGF5ZWREaWFnbm9zdGljICZkaWFnKSB7CisgICAgRGlhZ25vc3RpY3MucHVzaF9iYWNrKGRpYWcpOworICB9CisKKyAgLy8vIFN0ZWFsIHRoZSBkaWFnbm9zdGljcyBmcm9tIHRoZSBnaXZlbiBwb29sLgorICB2b2lkIHN0ZWFsKERlbGF5ZWREaWFnbm9zdGljUG9vbCAmcG9vbCkgeworICAgIGlmIChwb29sLkRpYWdub3N0aWNzLmVtcHR5KCkpIHJldHVybjsKKworICAgIGlmIChEaWFnbm9zdGljcy5lbXB0eSgpKSB7CisgICAgICBEaWFnbm9zdGljcyA9IHN0ZDo6bW92ZShwb29sLkRpYWdub3N0aWNzKTsKKyAgICB9IGVsc2UgeworICAgICAgRGlhZ25vc3RpY3MuYXBwZW5kKHBvb2wucG9vbF9iZWdpbigpLCBwb29sLnBvb2xfZW5kKCkpOworICAgIH0KKyAgICBwb29sLkRpYWdub3N0aWNzLmNsZWFyKCk7CisgIH0KKworICB1c2luZyBwb29sX2l0ZXJhdG9yID0gU21hbGxWZWN0b3JJbXBsPERlbGF5ZWREaWFnbm9zdGljPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgcG9vbF9pdGVyYXRvciBwb29sX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gRGlhZ25vc3RpY3MuYmVnaW4oKTsgfQorICBwb29sX2l0ZXJhdG9yIHBvb2xfZW5kKCkgY29uc3QgeyByZXR1cm4gRGlhZ25vc3RpY3MuZW5kKCk7IH0KKyAgYm9vbCBwb29sX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gRGlhZ25vc3RpY3MuZW1wdHkoKTsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworLy8vIEFkZCBhIGRpYWdub3N0aWMgdG8gdGhlIGN1cnJlbnQgZGVsYXkgcG9vbC4KK2lubGluZSB2b2lkIFNlbWE6OkRlbGF5ZWREaWFnbm9zdGljczo6YWRkKGNvbnN0IHNlbWE6OkRlbGF5ZWREaWFnbm9zdGljICZkaWFnKSB7CisgIGFzc2VydChzaG91bGREZWxheURpYWdub3N0aWNzKCkgJiYgInRyeWluZyB0byBkZWxheSB3aXRob3V0IHBvb2wiKTsKKyAgQ3VyUG9vbC0+YWRkKGRpYWcpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19TRU1BX0RFTEFZRURESUFHTk9TVElDX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvRGVzaWduYXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9EZXNpZ25hdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2MDNmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvRGVzaWduYXRvci5oCkBAIC0wLDAgKzEsMjEwIEBACisvLz09PS0tLSBEZXNpZ25hdG9yLmggLSBJbml0aWFsaXphdGlvbiBEZXNpZ25hdG9yIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGludGVyZmFjZXMgdXNlZCB0byByZXByZXNlbnQgZGVzaWduYXRvcnMgKGEgbGEKKy8vIEM5OSBkZXNpZ25hdGVkIGluaXRpYWxpemVycykgZHVyaW5nIHBhcnNpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NFTUFfREVTSUdOQVRPUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU0VNQV9ERVNJR05BVE9SX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgRXhwcjsKK2NsYXNzIElkZW50aWZpZXJJbmZvOworY2xhc3MgU2VtYTsKKworLy8vIERlc2lnbmF0b3IgLSBBIGRlc2lnbmF0b3IgaW4gYSBDOTkgZGVzaWduYXRlZCBpbml0aWFsaXplci4KKy8vLworLy8vIFRoaXMgY2xhc3MgaXMgYSBkaXNjcmltaW5hdGVkIHVuaW9uIHdoaWNoIGhvbGRzIHRoZSB2YXJpb3VzCisvLy8gZGlmZmVyZW50IHNvcnRzIG9mIGRlc2lnbmF0b3JzIHBvc3NpYmxlLiAgQSBEZXNpZ25hdGlvbiBpcyBhbiBhcnJheSBvZgorLy8vIHRoZXNlLiAgQW4gZXhhbXBsZSBvZiBhIGRlc2lnbmF0b3IgYXJlIHRoaW5ncyBsaWtlIHRoaXM6CisvLy8gICAgIFs4XSAuZmllbGQgWzQ3XSAgICAgICAgLy8gQzk5IGRlc2lnbmF0aW9uOiAzIGRlc2lnbmF0b3JzCisvLy8gICAgIFs4IC4uLiA0N10gIGZpZWxkOiAgICAgLy8gR05VIGV4dGVuc2lvbnM6IDIgZGVzaWduYXRvcnMKKy8vLyBUaGVzZSBvY2N1ciBpbiBpbml0aWFsaXplcnMsIGUuZy46CisvLy8gIGludCBhWzEwXSA9IHsyLCA0LCBbOF09OSwgMTB9OworLy8vCitjbGFzcyBEZXNpZ25hdG9yIHsKK3B1YmxpYzoKKyAgZW51bSBEZXNpZ25hdG9yS2luZCB7CisgICAgRmllbGREZXNpZ25hdG9yLCBBcnJheURlc2lnbmF0b3IsIEFycmF5UmFuZ2VEZXNpZ25hdG9yCisgIH07Citwcml2YXRlOgorICBEZXNpZ25hdG9yS2luZCBLaW5kOworCisgIHN0cnVjdCBGaWVsZERlc2lnbmF0b3JJbmZvIHsKKyAgICBjb25zdCBJZGVudGlmaWVySW5mbyAqSUk7CisgICAgdW5zaWduZWQgRG90TG9jOworICAgIHVuc2lnbmVkIE5hbWVMb2M7CisgIH07CisgIHN0cnVjdCBBcnJheURlc2lnbmF0b3JJbmZvIHsKKyAgICBFeHByICpJbmRleDsKKyAgICB1bnNpZ25lZCBMQnJhY2tldExvYzsKKyAgICBtdXRhYmxlIHVuc2lnbmVkICBSQnJhY2tldExvYzsKKyAgfTsKKyAgc3RydWN0IEFycmF5UmFuZ2VEZXNpZ25hdG9ySW5mbyB7CisgICAgRXhwciAqU3RhcnQsICpFbmQ7CisgICAgdW5zaWduZWQgTEJyYWNrZXRMb2MsIEVsbGlwc2lzTG9jOworICAgIG11dGFibGUgdW5zaWduZWQgUkJyYWNrZXRMb2M7CisgIH07CisKKyAgdW5pb24geworICAgIEZpZWxkRGVzaWduYXRvckluZm8gRmllbGRJbmZvOworICAgIEFycmF5RGVzaWduYXRvckluZm8gQXJyYXlJbmZvOworICAgIEFycmF5UmFuZ2VEZXNpZ25hdG9ySW5mbyBBcnJheVJhbmdlSW5mbzsKKyAgfTsKKworcHVibGljOgorCisgIERlc2lnbmF0b3JLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisgIGJvb2wgaXNGaWVsZERlc2lnbmF0b3IoKSBjb25zdCB7IHJldHVybiBLaW5kID09IEZpZWxkRGVzaWduYXRvcjsgfQorICBib29sIGlzQXJyYXlEZXNpZ25hdG9yKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBBcnJheURlc2lnbmF0b3I7IH0KKyAgYm9vbCBpc0FycmF5UmFuZ2VEZXNpZ25hdG9yKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBBcnJheVJhbmdlRGVzaWduYXRvcjsgfQorCisgIGNvbnN0IElkZW50aWZpZXJJbmZvICpnZXRGaWVsZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNGaWVsZERlc2lnbmF0b3IoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBGaWVsZEluZm8uSUk7CisgIH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXREb3RMb2MoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzRmllbGREZXNpZ25hdG9yKCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZyhGaWVsZEluZm8uRG90TG9jKTsKKyAgfQorCisgIFNvdXJjZUxvY2F0aW9uIGdldEZpZWxkTG9jKCkgY29uc3QgeworICAgIGFzc2VydChpc0ZpZWxkRGVzaWduYXRvcigpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoRmllbGRJbmZvLk5hbWVMb2MpOworICB9CisKKyAgRXhwciAqZ2V0QXJyYXlJbmRleCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNBcnJheURlc2lnbmF0b3IoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBBcnJheUluZm8uSW5kZXg7CisgIH0KKworICBFeHByICpnZXRBcnJheVJhbmdlU3RhcnQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQXJyYXlSYW5nZURlc2lnbmF0b3IoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBBcnJheVJhbmdlSW5mby5TdGFydDsKKyAgfQorICBFeHByICpnZXRBcnJheVJhbmdlRW5kKCkgY29uc3QgeworICAgIGFzc2VydChpc0FycmF5UmFuZ2VEZXNpZ25hdG9yKCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gQXJyYXlSYW5nZUluZm8uRW5kOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0TEJyYWNrZXRMb2MoKSBjb25zdCB7CisgICAgYXNzZXJ0KChpc0FycmF5RGVzaWduYXRvcigpIHx8IGlzQXJyYXlSYW5nZURlc2lnbmF0b3IoKSkgJiYKKyAgICAgICAgICAgIkludmFsaWQgYWNjZXNzb3IiKTsKKyAgICBpZiAoaXNBcnJheURlc2lnbmF0b3IoKSkKKyAgICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKEFycmF5SW5mby5MQnJhY2tldExvYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoQXJyYXlSYW5nZUluZm8uTEJyYWNrZXRMb2MpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0UkJyYWNrZXRMb2MoKSBjb25zdCB7CisgICAgYXNzZXJ0KChpc0FycmF5RGVzaWduYXRvcigpIHx8IGlzQXJyYXlSYW5nZURlc2lnbmF0b3IoKSkgJiYKKyAgICAgICAgICAgIkludmFsaWQgYWNjZXNzb3IiKTsKKyAgICBpZiAoaXNBcnJheURlc2lnbmF0b3IoKSkKKyAgICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKEFycmF5SW5mby5SQnJhY2tldExvYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoQXJyYXlSYW5nZUluZm8uUkJyYWNrZXRMb2MpOworICB9CisKKyAgU291cmNlTG9jYXRpb24gZ2V0RWxsaXBzaXNMb2MoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQXJyYXlSYW5nZURlc2lnbmF0b3IoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKEFycmF5UmFuZ2VJbmZvLkVsbGlwc2lzTG9jKTsKKyAgfQorCisgIHN0YXRpYyBEZXNpZ25hdG9yIGdldEZpZWxkKGNvbnN0IElkZW50aWZpZXJJbmZvICpJSSwgU291cmNlTG9jYXRpb24gRG90TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBOYW1lTG9jKSB7CisgICAgRGVzaWduYXRvciBEOworICAgIEQuS2luZCA9IEZpZWxkRGVzaWduYXRvcjsKKyAgICBELkZpZWxkSW5mby5JSSA9IElJOworICAgIEQuRmllbGRJbmZvLkRvdExvYyA9IERvdExvYy5nZXRSYXdFbmNvZGluZygpOworICAgIEQuRmllbGRJbmZvLk5hbWVMb2MgPSBOYW1lTG9jLmdldFJhd0VuY29kaW5nKCk7CisgICAgcmV0dXJuIEQ7CisgIH0KKworICBzdGF0aWMgRGVzaWduYXRvciBnZXRBcnJheShFeHByICpJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTEJyYWNrZXRMb2MpIHsKKyAgICBEZXNpZ25hdG9yIEQ7CisgICAgRC5LaW5kID0gQXJyYXlEZXNpZ25hdG9yOworICAgIEQuQXJyYXlJbmZvLkluZGV4ID0gSW5kZXg7CisgICAgRC5BcnJheUluZm8uTEJyYWNrZXRMb2MgPSBMQnJhY2tldExvYy5nZXRSYXdFbmNvZGluZygpOworICAgIEQuQXJyYXlJbmZvLlJCcmFja2V0TG9jID0gMDsKKyAgICByZXR1cm4gRDsKKyAgfQorCisgIHN0YXRpYyBEZXNpZ25hdG9yIGdldEFycmF5UmFuZ2UoRXhwciAqU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExCcmFja2V0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jKSB7CisgICAgRGVzaWduYXRvciBEOworICAgIEQuS2luZCA9IEFycmF5UmFuZ2VEZXNpZ25hdG9yOworICAgIEQuQXJyYXlSYW5nZUluZm8uU3RhcnQgPSBTdGFydDsKKyAgICBELkFycmF5UmFuZ2VJbmZvLkVuZCA9IEVuZDsKKyAgICBELkFycmF5UmFuZ2VJbmZvLkxCcmFja2V0TG9jID0gTEJyYWNrZXRMb2MuZ2V0UmF3RW5jb2RpbmcoKTsKKyAgICBELkFycmF5UmFuZ2VJbmZvLkVsbGlwc2lzTG9jID0gRWxsaXBzaXNMb2MuZ2V0UmF3RW5jb2RpbmcoKTsKKyAgICBELkFycmF5UmFuZ2VJbmZvLlJCcmFja2V0TG9jID0gMDsKKyAgICByZXR1cm4gRDsKKyAgfQorCisgIHZvaWQgc2V0UkJyYWNrZXRMb2MoU291cmNlTG9jYXRpb24gUkJyYWNrZXRMb2MpIGNvbnN0IHsKKyAgICBhc3NlcnQoKGlzQXJyYXlEZXNpZ25hdG9yKCkgfHwgaXNBcnJheVJhbmdlRGVzaWduYXRvcigpKSAmJgorICAgICAgICAgICAiSW52YWxpZCBhY2Nlc3NvciIpOworICAgIGlmIChpc0FycmF5RGVzaWduYXRvcigpKQorICAgICAgQXJyYXlJbmZvLlJCcmFja2V0TG9jID0gUkJyYWNrZXRMb2MuZ2V0UmF3RW5jb2RpbmcoKTsKKyAgICBlbHNlCisgICAgICBBcnJheVJhbmdlSW5mby5SQnJhY2tldExvYyA9IFJCcmFja2V0TG9jLmdldFJhd0VuY29kaW5nKCk7CisgIH0KKworICAvLy8gQ2xlYXJFeHBycyAtIE51bGwgb3V0IGFueSBleHByZXNzaW9uIHJlZmVyZW5jZXMsIHdoaWNoIHByZXZlbnRzCisgIC8vLyB0aGVtIGZyb20gYmVpbmcgJ2RlbGV0ZSdkIGxhdGVyLgorICB2b2lkIENsZWFyRXhwcnMoU2VtYSAmQWN0aW9ucykge30KKworICAvLy8gRnJlZUV4cHJzIC0gUmVsZWFzZSBhbnkgdW5jbGFpbWVkIG1lbW9yeSBmb3IgdGhlIGV4cHJlc3Npb25zIGluCisgIC8vLyB0aGlzIGRlc2lnbmF0b3IuCisgIHZvaWQgRnJlZUV4cHJzKFNlbWEgJkFjdGlvbnMpIHt9Cit9OworCisKKy8vLyBEZXNpZ25hdGlvbiAtIFJlcHJlc2VudCBhIGZ1bGwgZGVzaWduYXRpb24sIHdoaWNoIGlzIGEgc2VxdWVuY2Ugb2YKKy8vLyBkZXNpZ25hdG9ycy4gIFRoaXMgY2xhc3MgaXMgbW9zdGx5IGEgaGVscGVyIGZvciBJbml0TGlzdERlc2lnbmF0aW9ucy4KK2NsYXNzIERlc2lnbmF0aW9uIHsKKyAgLy8vIERlc2lnbmF0b3JzIC0gVGhlIGFjdHVhbCBkZXNpZ25hdG9ycyBmb3IgdGhpcyBpbml0aWFsaXplci4KKyAgU21hbGxWZWN0b3I8RGVzaWduYXRvciwgMj4gRGVzaWduYXRvcnM7CisKK3B1YmxpYzoKKyAgLy8vIEFkZERlc2lnbmF0b3IgLSBBZGQgYSBkZXNpZ25hdG9yIHRvIHRoZSBlbmQgb2YgdGhpcyBsaXN0LgorICB2b2lkIEFkZERlc2lnbmF0b3IoRGVzaWduYXRvciBEKSB7CisgICAgRGVzaWduYXRvcnMucHVzaF9iYWNrKEQpOworICB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIERlc2lnbmF0b3JzLmVtcHR5KCk7IH0KKworICB1bnNpZ25lZCBnZXROdW1EZXNpZ25hdG9ycygpIGNvbnN0IHsgcmV0dXJuIERlc2lnbmF0b3JzLnNpemUoKTsgfQorICBjb25zdCBEZXNpZ25hdG9yICZnZXREZXNpZ25hdG9yKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGFzc2VydChJZHggPCBEZXNpZ25hdG9ycy5zaXplKCkpOworICAgIHJldHVybiBEZXNpZ25hdG9yc1tJZHhdOworICB9CisKKyAgLy8vIENsZWFyRXhwcnMgLSBOdWxsIG91dCBhbnkgZXhwcmVzc2lvbiByZWZlcmVuY2VzLCB3aGljaCBwcmV2ZW50cyB0aGVtIGZyb20KKyAgLy8vIGJlaW5nICdkZWxldGUnZCBsYXRlci4KKyAgdm9pZCBDbGVhckV4cHJzKFNlbWEgJkFjdGlvbnMpIHt9CisKKyAgLy8vIEZyZWVFeHBycyAtIFJlbGVhc2UgYW55IHVuY2xhaW1lZCBtZW1vcnkgZm9yIHRoZSBleHByZXNzaW9ucyBpbiB0aGlzCisgIC8vLyBkZXNpZ25hdGlvbi4KKyAgdm9pZCBGcmVlRXhwcnMoU2VtYSAmQWN0aW9ucykge30KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvRXh0ZXJuYWxTZW1hU291cmNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0V4dGVybmFsU2VtYVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Y2I3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0V4dGVybmFsU2VtYVNvdXJjZS5oCkBAIC0wLDAgKzEsMjM0IEBACisvLz09PS0tLSBFeHRlcm5hbFNlbWFTb3VyY2UuaCAtIEV4dGVybmFsIFNlbWEgSW50ZXJmYWNlIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRXh0ZXJuYWxTZW1hU291cmNlIGludGVyZmFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX0NMQU5HX1NFTUFfRVhURVJOQUxTRU1BU09VUkNFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TRU1BX0VYVEVSTkFMU0VNQVNPVVJDRV9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXh0ZXJuYWxBU1RTb3VyY2UuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgorI2luY2x1ZGUgImNsYW5nL1NlbWEvVHlwb0NvcnJlY3Rpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9TZW1hL1dlYWsuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9NYXBWZWN0b3IuaCIKKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgdW5zaWduZWQgbj4gY2xhc3MgU21hbGxTZXRWZWN0b3I7Cit9CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIENYWENvbnN0cnVjdG9yRGVjbDsKK2NsYXNzIENYWERlbGV0ZUV4cHI7CitjbGFzcyBDWFhSZWNvcmREZWNsOworY2xhc3MgRGVjbGFyYXRvckRlY2w7CitjbGFzcyBMb29rdXBSZXN1bHQ7CitzdHJ1Y3QgT2JqQ01ldGhvZExpc3Q7CitjbGFzcyBTY29wZTsKK2NsYXNzIFNlbWE7CitjbGFzcyBUeXBlZGVmTmFtZURlY2w7CitjbGFzcyBWYWx1ZURlY2w7CitjbGFzcyBWYXJEZWNsOworc3RydWN0IExhdGVQYXJzZWRUZW1wbGF0ZTsKKworLy8vIFxicmllZiBBIHNpbXBsZSBzdHJ1Y3R1cmUgdGhhdCBjYXB0dXJlcyBhIHZ0YWJsZSB1c2UgZm9yIHRoZSBwdXJwb3NlcyBvZgorLy8vIHRoZSBcYyBFeHRlcm5hbFNlbWFTb3VyY2UuCitzdHJ1Y3QgRXh0ZXJuYWxWVGFibGVVc2UgeworICBDWFhSZWNvcmREZWNsICpSZWNvcmQ7CisgIFNvdXJjZUxvY2F0aW9uIExvY2F0aW9uOworICBib29sIERlZmluaXRpb25SZXF1aXJlZDsKK307CisgIAorLy8vIFxicmllZiBBbiBhYnN0cmFjdCBpbnRlcmZhY2UgdGhhdCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkKKy8vLyBleHRlcm5hbCBBU1Qgc291cmNlcyB0aGF0IGFsc28gcHJvdmlkZSBpbmZvcm1hdGlvbiBmb3Igc2VtYW50aWMKKy8vLyBhbmFseXNpcy4KK2NsYXNzIEV4dGVybmFsU2VtYVNvdXJjZSA6IHB1YmxpYyBFeHRlcm5hbEFTVFNvdXJjZSB7CitwdWJsaWM6CisgIEV4dGVybmFsU2VtYVNvdXJjZSgpIHsKKyAgICBFeHRlcm5hbEFTVFNvdXJjZTo6U2VtYVNvdXJjZSA9IHRydWU7CisgIH0KKworICB+RXh0ZXJuYWxTZW1hU291cmNlKCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBJbml0aWFsaXplIHRoZSBzZW1hbnRpYyBzb3VyY2Ugd2l0aCB0aGUgU2VtYSBpbnN0YW5jZQorICAvLy8gYmVpbmcgdXNlZCB0byBwZXJmb3JtIHNlbWFudGljIGFuYWx5c2lzIG9uIHRoZSBhYnN0cmFjdCBzeW50YXgKKyAgLy8vIHRyZWUuCisgIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplU2VtYShTZW1hICZTKSB7fQorCisgIC8vLyBcYnJpZWYgSW5mb3JtIHRoZSBzZW1hbnRpYyBjb25zdW1lciB0aGF0IFNlbWEgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4KKyAgdmlydHVhbCB2b2lkIEZvcmdldFNlbWEoKSB7fQorCisgIC8vLyBcYnJpZWYgTG9hZCB0aGUgY29udGVudHMgb2YgdGhlIGdsb2JhbCBtZXRob2QgcG9vbCBmb3IgYSBnaXZlbgorICAvLy8gc2VsZWN0b3IuCisgIHZpcnR1YWwgdm9pZCBSZWFkTWV0aG9kUG9vbChTZWxlY3RvciBTZWwpOworCisgIC8vLyBMb2FkIHRoZSBjb250ZW50cyBvZiB0aGUgZ2xvYmFsIG1ldGhvZCBwb29sIGZvciBhIGdpdmVuCisgIC8vLyBzZWxlY3RvciBpZiBuZWNlc3NhcnkuCisgIHZpcnR1YWwgdm9pZCB1cGRhdGVPdXRPZkRhdGVTZWxlY3RvcihTZWxlY3RvciBTZWwpOworCisgIC8vLyBcYnJpZWYgTG9hZCB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCBhcmUga25vd24gdG8gdGhlIGV4dGVybmFsIHNvdXJjZSwKKyAgLy8vIHdoaWNoIHdpbGwgYmUgdXNlZCBkdXJpbmcgdHlwbyBjb3JyZWN0aW9uLgorICB2aXJ0dWFsIHZvaWQgUmVhZEtub3duTmFtZXNwYWNlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxOYW1lc3BhY2VEZWNsICo+ICZOYW1lc3BhY2VzKTsKKworICAvLy8gXGJyaWVmIExvYWQgdGhlIHNldCBvZiB1c2VkIGJ1dCBub3QgZGVmaW5lZCBmdW5jdGlvbnMgb3IgdmFyaWFibGVzIHdpdGgKKyAgLy8vIGludGVybmFsIGxpbmthZ2UsIG9yIHVzZWQgYnV0IG5vdCBkZWZpbmVkIGludGVybmFsIGZ1bmN0aW9ucy4KKyAgdmlydHVhbCB2b2lkCisgIFJlYWRVbmRlZmluZWRCdXRVc2VkKGxsdm06Ok1hcFZlY3RvcjxOYW1lZERlY2wgKiwgU291cmNlTG9jYXRpb24+ICZVbmRlZmluZWQpOworCisgIHZpcnR1YWwgdm9pZCBSZWFkTWlzbWF0Y2hpbmdEZWxldGVFeHByZXNzaW9ucyhsbHZtOjpNYXBWZWN0b3I8CisgICAgICBGaWVsZERlY2wgKiwgbGx2bTo6U21hbGxWZWN0b3I8c3RkOjpwYWlyPFNvdXJjZUxvY2F0aW9uLCBib29sPiwgND4+ICYpOworCisgIC8vLyBcYnJpZWYgRG8gbGFzdCByZXNvcnQsIHVucXVhbGlmaWVkIGxvb2t1cCBvbiBhIExvb2t1cFJlc3VsdCB0aGF0CisgIC8vLyBTZW1hIGNhbm5vdCBmaW5kLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSIGEgTG9va3VwUmVzdWx0IHRoYXQgaXMgYmVpbmcgcmVjb3ZlcmVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTIHRoZSBTY29wZSBvZiB0aGUgaWRlbnRpZmllciBvY2N1cnJlbmNlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gdHJ1ZSB0byB0ZWxsIFNlbWEgdG8gcmVjb3ZlciB1c2luZyB0aGUgTG9va3VwUmVzdWx0LgorICB2aXJ0dWFsIGJvb2wgTG9va3VwVW5xdWFsaWZpZWQoTG9va3VwUmVzdWx0ICZSLCBTY29wZSAqUykgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gXGJyaWVmIFJlYWQgdGhlIHNldCBvZiB0ZW50YXRpdmUgZGVmaW5pdGlvbnMga25vd24gdG8gdGhlIGV4dGVybmFsIFNlbWEKKyAgLy8vIHNvdXJjZS4KKyAgLy8vCisgIC8vLyBUaGUgZXh0ZXJuYWwgc291cmNlIHNob3VsZCBhcHBlbmQgaXRzIG93biB0ZW50YXRpdmUgZGVmaW5pdGlvbnMgdG8gdGhlCisgIC8vLyBnaXZlbiB2ZWN0b3Igb2YgdGVudGF0aXZlIGRlZmluaXRpb25zLiBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIG1heSBiZQorICAvLy8gaW52b2tlZCBtdWx0aXBsZSB0aW1lczsgdGhlIGV4dGVybmFsIHNvdXJjZSBzaG91bGQgdGFrZSBjYXJlIG5vdCB0bworICAvLy8gaW50cm9kdWNlIHRoZSBzYW1lIGRlY2xhcmF0aW9ucyByZXBlYXRlZGx5LgorICB2aXJ0dWFsIHZvaWQgUmVhZFRlbnRhdGl2ZURlZmluaXRpb25zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxWYXJEZWNsICo+ICZUZW50YXRpdmVEZWZzKSB7fQorICAKKyAgLy8vIFxicmllZiBSZWFkIHRoZSBzZXQgb2YgdW51c2VkIGZpbGUtc2NvcGUgZGVjbGFyYXRpb25zIGtub3duIHRvIHRoZQorICAvLy8gZXh0ZXJuYWwgU2VtYSBzb3VyY2UuCisgIC8vLworICAvLy8gVGhlIGV4dGVybmFsIHNvdXJjZSBzaG91bGQgYXBwZW5kIGl0cyBvd24gdW51c2VkLCBmaWxlZC1zY29wZSB0byB0aGUKKyAgLy8vIGdpdmVuIHZlY3RvciBvZiBkZWNsYXJhdGlvbnMuIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgbWF5IGJlCisgIC8vLyBpbnZva2VkIG11bHRpcGxlIHRpbWVzOyB0aGUgZXh0ZXJuYWwgc291cmNlIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvCisgIC8vLyBpbnRyb2R1Y2UgdGhlIHNhbWUgZGVjbGFyYXRpb25zIHJlcGVhdGVkbHkuCisgIHZpcnR1YWwgdm9pZCBSZWFkVW51c2VkRmlsZVNjb3BlZERlY2xzKAorICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgRGVjbGFyYXRvckRlY2wgKj4gJkRlY2xzKSB7fQorICAKKyAgLy8vIFxicmllZiBSZWFkIHRoZSBzZXQgb2YgZGVsZWdhdGluZyBjb25zdHJ1Y3RvcnMga25vd24gdG8gdGhlCisgIC8vLyBleHRlcm5hbCBTZW1hIHNvdXJjZS4KKyAgLy8vCisgIC8vLyBUaGUgZXh0ZXJuYWwgc291cmNlIHNob3VsZCBhcHBlbmQgaXRzIG93biBkZWxlZ2F0aW5nIGNvbnN0cnVjdG9ycyB0byB0aGUKKyAgLy8vIGdpdmVuIHZlY3RvciBvZiBkZWNsYXJhdGlvbnMuIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgbWF5IGJlCisgIC8vLyBpbnZva2VkIG11bHRpcGxlIHRpbWVzOyB0aGUgZXh0ZXJuYWwgc291cmNlIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvCisgIC8vLyBpbnRyb2R1Y2UgdGhlIHNhbWUgZGVjbGFyYXRpb25zIHJlcGVhdGVkbHkuCisgIHZpcnR1YWwgdm9pZCBSZWFkRGVsZWdhdGluZ0NvbnN0cnVjdG9ycygKKyAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPENYWENvbnN0cnVjdG9yRGVjbCAqPiAmRGVjbHMpIHt9CisKKyAgLy8vIFxicmllZiBSZWFkIHRoZSBzZXQgb2YgZXh0X3ZlY3RvciB0eXBlIGRlY2xhcmF0aW9ucyBrbm93biB0byB0aGUKKyAgLy8vIGV4dGVybmFsIFNlbWEgc291cmNlLgorICAvLy8KKyAgLy8vIFRoZSBleHRlcm5hbCBzb3VyY2Ugc2hvdWxkIGFwcGVuZCBpdHMgb3duIGV4dF92ZWN0b3IgdHlwZSBkZWNsYXJhdGlvbnMgdG8KKyAgLy8vIHRoZSBnaXZlbiB2ZWN0b3Igb2YgZGVjbGFyYXRpb25zLiBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIG1heSBiZQorICAvLy8gaW52b2tlZCBtdWx0aXBsZSB0aW1lczsgdGhlIGV4dGVybmFsIHNvdXJjZSBzaG91bGQgdGFrZSBjYXJlIG5vdCB0bworICAvLy8gaW50cm9kdWNlIHRoZSBzYW1lIGRlY2xhcmF0aW9ucyByZXBlYXRlZGx5LgorICB2aXJ0dWFsIHZvaWQgUmVhZEV4dFZlY3RvckRlY2xzKFNtYWxsVmVjdG9ySW1wbDxUeXBlZGVmTmFtZURlY2wgKj4gJkRlY2xzKSB7fQorCisgIC8vLyBcYnJpZWYgUmVhZCB0aGUgc2V0IG9mIHBvdGVudGlhbGx5IHVudXNlZCB0eXBlZGVmcyBrbm93biB0byB0aGUgc291cmNlLgorICAvLy8KKyAgLy8vIFRoZSBleHRlcm5hbCBzb3VyY2Ugc2hvdWxkIGFwcGVuZCBpdHMgb3duIHBvdGVudGlhbGx5IHVudXNlZCBsb2NhbAorICAvLy8gdHlwZWRlZnMgdG8gdGhlIGdpdmVuIHZlY3RvciBvZiBkZWNsYXJhdGlvbnMuIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgbWF5CisgIC8vLyBiZSBpbnZva2VkIG11bHRpcGxlIHRpbWVzOyB0aGUgZXh0ZXJuYWwgc291cmNlIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvCisgIC8vLyBpbnRyb2R1Y2UgdGhlIHNhbWUgZGVjbGFyYXRpb25zIHJlcGVhdGVkbHkuCisgIHZpcnR1YWwgdm9pZCBSZWFkVW51c2VkTG9jYWxUeXBlZGVmTmFtZUNhbmRpZGF0ZXMoCisgICAgICBsbHZtOjpTbWFsbFNldFZlY3Rvcjxjb25zdCBUeXBlZGVmTmFtZURlY2wgKiwgND4gJkRlY2xzKSB7fQorCisgIC8vLyBcYnJpZWYgUmVhZCB0aGUgc2V0IG9mIHJlZmVyZW5jZWQgc2VsZWN0b3JzIGtub3duIHRvIHRoZQorICAvLy8gZXh0ZXJuYWwgU2VtYSBzb3VyY2UuCisgIC8vLworICAvLy8gVGhlIGV4dGVybmFsIHNvdXJjZSBzaG91bGQgYXBwZW5kIGl0cyBvd24gcmVmZXJlbmNlZCBzZWxlY3RvcnMgdG8gdGhlIAorICAvLy8gZ2l2ZW4gdmVjdG9yIG9mIHNlbGVjdG9ycy4gTm90ZSB0aGF0IHRoaXMgcm91dGluZSAKKyAgLy8vIG1heSBiZSBpbnZva2VkIG11bHRpcGxlIHRpbWVzOyB0aGUgZXh0ZXJuYWwgc291cmNlIHNob3VsZCB0YWtlIGNhcmUgbm90IAorICAvLy8gdG8gaW50cm9kdWNlIHRoZSBzYW1lIHNlbGVjdG9ycyByZXBlYXRlZGx5LgorICB2aXJ0dWFsIHZvaWQgUmVhZFJlZmVyZW5jZWRTZWxlY3RvcnMoCisgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8U2VsZWN0b3IsIFNvdXJjZUxvY2F0aW9uPiA+ICZTZWxzKSB7fQorCisgIC8vLyBcYnJpZWYgUmVhZCB0aGUgc2V0IG9mIHdlYWssIHVuZGVjbGFyZWQgaWRlbnRpZmllcnMga25vd24gdG8gdGhlCisgIC8vLyBleHRlcm5hbCBTZW1hIHNvdXJjZS4KKyAgLy8vCisgIC8vLyBUaGUgZXh0ZXJuYWwgc291cmNlIHNob3VsZCBhcHBlbmQgaXRzIG93biB3ZWFrLCB1bmRlY2xhcmVkIGlkZW50aWZpZXJzIHRvCisgIC8vLyB0aGUgZ2l2ZW4gdmVjdG9yLiBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIG1heSBiZSBpbnZva2VkIG11bHRpcGxlIHRpbWVzOyAKKyAgLy8vIHRoZSBleHRlcm5hbCBzb3VyY2Ugc2hvdWxkIHRha2UgY2FyZSBub3QgdG8gaW50cm9kdWNlIHRoZSBzYW1lIGlkZW50aWZpZXJzCisgIC8vLyByZXBlYXRlZGx5LgorICB2aXJ0dWFsIHZvaWQgUmVhZFdlYWtVbmRlY2xhcmVkSWRlbnRpZmllcnMoCisgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8SWRlbnRpZmllckluZm8gKiwgV2Vha0luZm8+ID4gJldJKSB7fQorCisgIC8vLyBcYnJpZWYgUmVhZCB0aGUgc2V0IG9mIHVzZWQgdnRhYmxlcyBrbm93biB0byB0aGUgZXh0ZXJuYWwgU2VtYSBzb3VyY2UuCisgIC8vLworICAvLy8gVGhlIGV4dGVybmFsIHNvdXJjZSBzaG91bGQgYXBwZW5kIGl0cyBvd24gdXNlZCB2dGFibGVzIHRvIHRoZSBnaXZlbgorICAvLy8gdmVjdG9yLiBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIG1heSBiZSBpbnZva2VkIG11bHRpcGxlIHRpbWVzOyB0aGUgZXh0ZXJuYWwKKyAgLy8vIHNvdXJjZSBzaG91bGQgdGFrZSBjYXJlIG5vdCB0byBpbnRyb2R1Y2UgdGhlIHNhbWUgdnRhYmxlcyByZXBlYXRlZGx5LgorICB2aXJ0dWFsIHZvaWQgUmVhZFVzZWRWVGFibGVzKFNtYWxsVmVjdG9ySW1wbDxFeHRlcm5hbFZUYWJsZVVzZT4gJlZUYWJsZXMpIHt9CisKKyAgLy8vIFxicmllZiBSZWFkIHRoZSBzZXQgb2YgcGVuZGluZyBpbnN0YW50aWF0aW9ucyBrbm93biB0byB0aGUgZXh0ZXJuYWwKKyAgLy8vIFNlbWEgc291cmNlLgorICAvLy8KKyAgLy8vIFRoZSBleHRlcm5hbCBzb3VyY2Ugc2hvdWxkIGFwcGVuZCBpdHMgb3duIHBlbmRpbmcgaW5zdGFudGlhdGlvbnMgdG8gdGhlCisgIC8vLyBnaXZlbiB2ZWN0b3IuIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgbWF5IGJlIGludm9rZWQgbXVsdGlwbGUgdGltZXM7IHRoZQorICAvLy8gZXh0ZXJuYWwgc291cmNlIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvIGludHJvZHVjZSB0aGUgc2FtZSBpbnN0YW50aWF0aW9ucworICAvLy8gcmVwZWF0ZWRseS4KKyAgdmlydHVhbCB2b2lkIFJlYWRQZW5kaW5nSW5zdGFudGlhdGlvbnMoCisgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8VmFsdWVEZWNsICosIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uPiA+ICZQZW5kaW5nKSB7fQorCisgIC8vLyBcYnJpZWYgUmVhZCB0aGUgc2V0IG9mIGxhdGUgcGFyc2VkIHRlbXBsYXRlIGZ1bmN0aW9ucyBmb3IgdGhpcyBzb3VyY2UuCisgIC8vLworICAvLy8gVGhlIGV4dGVybmFsIHNvdXJjZSBzaG91bGQgaW5zZXJ0IGl0cyBvd24gbGF0ZSBwYXJzZWQgdGVtcGxhdGUgZnVuY3Rpb25zCisgIC8vLyBpbnRvIHRoZSBtYXAuIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgbWF5IGJlIGludm9rZWQgbXVsdGlwbGUgdGltZXM7IHRoZQorICAvLy8gZXh0ZXJuYWwgc291cmNlIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvIGludHJvZHVjZSB0aGUgc2FtZSBtYXAgZW50cmllcworICAvLy8gcmVwZWF0ZWRseS4KKyAgdmlydHVhbCB2b2lkIFJlYWRMYXRlUGFyc2VkVGVtcGxhdGVzKAorICAgICAgbGx2bTo6TWFwVmVjdG9yPGNvbnN0IEZ1bmN0aW9uRGVjbCAqLCBzdGQ6OnVuaXF1ZV9wdHI8TGF0ZVBhcnNlZFRlbXBsYXRlPj4KKyAgICAgICAgICAmTFBUTWFwKSB7fQorCisgIC8vLyBcY29weWRvYyBTZW1hOjpDb3JyZWN0VHlwbworICAvLy8gXG5vdGUgTG9va3VwS2luZCBtdXN0IGNvcnJlc3BvbmQgdG8gYSB2YWxpZCBTZW1hOjpMb29rdXBOYW1lS2luZAorICAvLy8KKyAgLy8vIEV4dGVybmFsU2VtYVNvdXJjZTo6Q29ycmVjdFR5cG8gaXMgYWx3YXlzIGdpdmVuIHRoZSBmaXJzdCBjaGFuY2UgdG8KKyAgLy8vIGNvcnJlY3QgYSB0eXBvIChyZWFsbHksIHRvIG9mZmVyIHN1Z2dlc3Rpb25zIHRvIHJlcGFpciBhIGZhaWxlZCBsb29rdXApLgorICAvLy8gSXQgd2lsbCBldmVuIGJlIGNhbGxlZCB3aGVuIFNwZWxsQ2hlY2tpbmcgaXMgdHVybmVkIG9mZiBvciBhZnRlciBhCisgIC8vLyBmYXRhbCBlcnJvciBoYXMgYWxyZWFkeSBiZWVuIGRldGVjdGVkLgorICB2aXJ0dWFsIFR5cG9Db3JyZWN0aW9uIENvcnJlY3RUeXBvKGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJlR5cG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IExvb2t1cEtpbmQsIFNjb3BlICpTLCBDWFhTY29wZVNwZWMgKlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcnJlY3Rpb25DYW5kaWRhdGVDYWxsYmFjayAmQ0NDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpNZW1iZXJDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRW50ZXJpbmdDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNPYmplY3RQb2ludGVyVHlwZSAqT1BUKSB7CisgICAgcmV0dXJuIFR5cG9Db3JyZWN0aW9uKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFByb2R1Y2VzIGEgZGlhZ25vc3RpYyBub3RlIGlmIHRoZSBleHRlcm5hbCBzb3VyY2UgY29udGFpbnMgYQorICAvLy8gY29tcGxldGUgZGVmaW5pdGlvbiBmb3IgXHAgVC4KKyAgLy8vCisgIC8vLyBccGFyYW0gTG9jIHRoZSBsb2NhdGlvbiBhdCB3aGljaCBhIGNvbXBsZXRlIHR5cGUgd2FzIHJlcXVpcmVkIGJ1dCBub3QKKyAgLy8vIHByb3ZpZGVkCisgIC8vLworICAvLy8gXHBhcmFtIFQgdGhlIFxjIFF1YWxUeXBlIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBjb21wbGV0ZSBhdCBccCBMb2MKKyAgLy8vCisgIC8vLyBccmV0dXJuIHRydWUgaWYgYSBkaWFnbm9zdGljIHdhcyBwcm9kdWNlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICB2aXJ0dWFsIGJvb2wgTWF5YmVEaWFnbm9zZU1pc3NpbmdDb21wbGV0ZVR5cGUoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIGlzYS9jYXN0L2R5bl9jYXN0IHN1cHBvcnQKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBFeHRlcm5hbEFTVFNvdXJjZSAqU291cmNlKSB7CisgICAgcmV0dXJuIFNvdXJjZS0+U2VtYVNvdXJjZTsKKyAgfQorfTsgCisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvSWRlbnRpZmllclJlc29sdmVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0lkZW50aWZpZXJSZXNvbHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDc3NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0lkZW50aWZpZXJSZXNvbHZlci5oCkBAIC0wLDAgKzEsMjA2IEBACisvLz09PS0gSWRlbnRpZmllclJlc29sdmVyLmggLSBMZXhpY2FsIFNjb3BlIE5hbWUgbG9va3VwIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBJZGVudGlmaWVyUmVzb2x2ZXIgY2xhc3MsIHdoaWNoIGlzIHVzZWQgZm9yIGxleGljYWwKKy8vIHNjb3BlZCBsb29rdXAsIGJhc2VkIG9uIGRlY2xhcmF0aW9uIG5hbWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TRU1BX0lERU5USUZJRVJSRVNPTFZFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU0VNQV9JREVOVElGSUVSUkVTT0xWRVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIERlY2w7CitjbGFzcyBEZWNsYXJhdGlvbk5hbWU7CitjbGFzcyBEZWNsQ29udGV4dDsKK2NsYXNzIElkZW50aWZpZXJJbmZvOworY2xhc3MgTGFuZ09wdGlvbnM7CitjbGFzcyBOYW1lZERlY2w7CitjbGFzcyBQcmVwcm9jZXNzb3I7CitjbGFzcyBTY29wZTsKKyAgCisvLy8gSWRlbnRpZmllclJlc29sdmVyIC0gS2VlcHMgdHJhY2sgb2Ygc2hhZG93ZWQgZGVjbHMgb24gZW5jbG9zaW5nCisvLy8gc2NvcGVzLiAgSXQgbWFuYWdlcyB0aGUgc2hhZG93aW5nIGNoYWlucyBvZiBkZWNsYXJhdGlvbiBuYW1lcyBhbmQKKy8vLyBpbXBsZW1lbnRzIGVmZmljaWVudCBkZWNsIGxvb2t1cCBiYXNlZCBvbiBhIGRlY2xhcmF0aW9uIG5hbWUuCitjbGFzcyBJZGVudGlmaWVyUmVzb2x2ZXIgeworICAvLy8gSWREZWNsSW5mbyAtIEtlZXBzIHRyYWNrIG9mIGluZm9ybWF0aW9uIGFib3V0IGRlY2xzIGFzc29jaWF0ZWQKKyAgLy8vIHRvIGEgcGFydGljdWxhciBkZWNsYXJhdGlvbiBuYW1lLiBJZERlY2xJbmZvcyBhcmUgbGF6aWx5CisgIC8vLyBjb25zdHJ1Y3RlZCBhbmQgYXNzaWduZWQgdG8gYSBkZWNsYXJhdGlvbiBuYW1lIHRoZSBmaXJzdCB0aW1lIGEKKyAgLy8vIGRlY2wgd2l0aCB0aGF0IGRlY2xhcmF0aW9uIG5hbWUgaXMgc2hhZG93ZWQgaW4gc29tZSBzY29wZS4KKyAgY2xhc3MgSWREZWNsSW5mbyB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBEZWNsc1R5ID0gU21hbGxWZWN0b3I8TmFtZWREZWNsICosIDI+OworCisgICAgRGVjbHNUeTo6aXRlcmF0b3IgZGVjbHNfYmVnaW4oKSB7IHJldHVybiBEZWNscy5iZWdpbigpOyB9CisgICAgRGVjbHNUeTo6aXRlcmF0b3IgZGVjbHNfZW5kKCkgeyByZXR1cm4gRGVjbHMuZW5kKCk7IH0KKworICAgIHZvaWQgQWRkRGVjbChOYW1lZERlY2wgKkQpIHsgRGVjbHMucHVzaF9iYWNrKEQpOyB9CisKKyAgICAvLy8gUmVtb3ZlRGVjbCAtIFJlbW92ZSB0aGUgZGVjbCBmcm9tIHRoZSBzY29wZSBjaGFpbi4KKyAgICAvLy8gVGhlIGRlY2wgbXVzdCBhbHJlYWR5IGJlIHBhcnQgb2YgdGhlIGRlY2wgY2hhaW4uCisgICAgdm9pZCBSZW1vdmVEZWNsKE5hbWVkRGVjbCAqRCk7CisKKyAgICAvLy8gXGJyaWVmIEluc2VydCB0aGUgZ2l2ZW4gZGVjbGFyYXRpb24gYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBsaXN0LgorICAgIHZvaWQgSW5zZXJ0RGVjbChEZWNsc1R5OjppdGVyYXRvciBQb3MsIE5hbWVkRGVjbCAqRCkgeworICAgICAgRGVjbHMuaW5zZXJ0KFBvcywgRCk7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgcHJpdmF0ZToKKyAgICBEZWNsc1R5IERlY2xzOworICB9OworCitwdWJsaWM6CisgIC8vLyBpdGVyYXRvciAtIEl0ZXJhdGUgb3ZlciB0aGUgZGVjbHMgb2YgYSBzcGVjaWZpZWQgZGVjbGFyYXRpb24gbmFtZS4KKyAgLy8vIEl0IHdpbGwgd2FsayBvciBub3QgdGhlIHBhcmVudCBkZWNsYXJhdGlvbiBjb250ZXh0cyBkZXBlbmRpbmcgb24gaG93CisgIC8vLyBpdCB3YXMgaW5zdGFudGlhdGVkLgorICBjbGFzcyBpdGVyYXRvciB7CisgIHB1YmxpYzoKKyAgICBmcmllbmQgY2xhc3MgSWRlbnRpZmllclJlc29sdmVyOworCisgICAgdXNpbmcgdmFsdWVfdHlwZSA9IE5hbWVkRGVjbCAqOworICAgIHVzaW5nIHJlZmVyZW5jZSA9IE5hbWVkRGVjbCAqOworICAgIHVzaW5nIHBvaW50ZXIgPSBOYW1lZERlY2wgKjsKKyAgICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnOworICAgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHN0ZDo6cHRyZGlmZl90OworCisgICAgLy8vIFB0ciAtIFRoZXJlIGFyZSAyIGZvcm1zIHRoYXQgJ1B0cicgcmVwcmVzZW50czoKKyAgICAvLy8gMSkgQSBzaW5nbGUgTmFtZWREZWNsLiAoUHRyICYgMHgxID09IDApCisgICAgLy8vIDIpIEEgSWREZWNsSW5mbzo6RGVjbHNUeTo6aXRlcmF0b3IgdGhhdCB0cmF2ZXJzZXMgb25seSB0aGUgZGVjbHMgb2YgdGhlCisgICAgLy8vICAgIHNhbWUgZGVjbGFyYXRpb24gY29udGV4dC4gKFB0ciAmIDB4MSA9PSAweDEpCisgICAgdWludHB0cl90IFB0ciA9IDA7CisgICAgdXNpbmcgQmFzZUl0ZXIgPSBJZERlY2xJbmZvOjpEZWNsc1R5OjppdGVyYXRvcjsKKworICAgIC8vLyBBIHNpbmdsZSBOYW1lZERlY2wuIChQdHIgJiAweDEgPT0gMCkKKyAgICBpdGVyYXRvcihOYW1lZERlY2wgKkQpIHsKKyAgICAgIFB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihEKTsKKyAgICAgIGFzc2VydCgoUHRyICYgMHgxKSA9PSAwICYmICJJbnZhbGlkIFB0ciEiKTsKKyAgICB9CisKKyAgICAvLy8gQSBJZERlY2xJbmZvOjpEZWNsc1R5OjppdGVyYXRvciB0aGF0IHdhbGtzIG9yIG5vdCB0aGUgcGFyZW50IGRlY2xhcmF0aW9uCisgICAgLy8vIGNvbnRleHRzIGRlcGVuZGluZyBvbiAnTG9va0luUGFyZW50Q3R4Jy4KKyAgICBpdGVyYXRvcihCYXNlSXRlciBJKSB7CisgICAgICBQdHIgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oSSkgfCAweDE7CisgICAgfQorCisgICAgYm9vbCBpc0l0ZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gKFB0ciAmIDB4MSk7IH0KKworICAgIEJhc2VJdGVyIGdldEl0ZXJhdG9yKCkgY29uc3QgeworICAgICAgYXNzZXJ0KGlzSXRlcmF0b3IoKSAmJiAiUHRyIG5vdCBhbiBpdGVyYXRvciEiKTsKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEJhc2VJdGVyPihQdHIgJiB+MHgxKTsKKyAgICB9CisKKyAgICB2b2lkIGluY3JlbWVudFNsb3dDYXNlKCk7CisKKyAgcHVibGljOgorICAgIGl0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgICAgTmFtZWREZWNsICpvcGVyYXRvciooKSBjb25zdCB7CisgICAgICBpZiAoaXNJdGVyYXRvcigpKQorICAgICAgICByZXR1cm4gKmdldEl0ZXJhdG9yKCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PE5hbWVkRGVjbCo+KFB0cik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBQdHIgPT0gUkhTLlB0cjsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBQdHIgIT0gUkhTLlB0cjsKKyAgICB9CisKKyAgICAvLyBQcmVpbmNyZW1lbnQuCisgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgICBpZiAoIWlzSXRlcmF0b3IoKSkgLy8gY29tbW9uIGNhc2UuCisgICAgICAgIFB0ciA9IDA7CisgICAgICBlbHNlCisgICAgICAgIGluY3JlbWVudFNsb3dDYXNlKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICB9OworCisgIGV4cGxpY2l0IElkZW50aWZpZXJSZXNvbHZlcihQcmVwcm9jZXNzb3IgJlBQKTsKKyAgfklkZW50aWZpZXJSZXNvbHZlcigpOworCisgIC8vLyBiZWdpbiAtIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGRlY2xzIHdpdGggdGhlIG5hbWUgJ05hbWUnLgorICBpdGVyYXRvciBiZWdpbihEZWNsYXJhdGlvbk5hbWUgTmFtZSk7CisKKyAgLy8vIGVuZCAtIFJldHVybnMgYW4gaXRlcmF0b3IgdGhhdCBoYXMgJ2ZpbmlzaGVkJy4KKyAgaXRlcmF0b3IgZW5kKCkgeworICAgIHJldHVybiBpdGVyYXRvcigpOworICB9CisKKyAgLy8vIGlzRGVjbEluU2NvcGUgLSBJZiAnQ3R4JyBpcyBhIGZ1bmN0aW9uL21ldGhvZCwgaXNEZWNsSW5TY29wZSByZXR1cm5zIHRydWUKKyAgLy8vIGlmICdEJyBpcyBpbiBTY29wZSAnUycsIG90aGVyd2lzZSAnUycgaXMgaWdub3JlZCBhbmQgaXNEZWNsSW5TY29wZSByZXR1cm5zCisgIC8vLyB0cnVlIGlmICdEJyBiZWxvbmdzIHRvIHRoZSBnaXZlbiBkZWNsYXJhdGlvbiBjb250ZXh0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBBbGxvd0lubGluZU5hbWVzcGFjZSBJZiBcYyB0cnVlLCB3ZSBhcmUgY2hlY2tpbmcgd2hldGhlciBhIHByaW9yCisgIC8vLyAgICAgICAgZGVjbGFyYXRpb24gaXMgaW4gc2NvcGUgaW4gYSBkZWNsYXJhdGlvbiB0aGF0IHJlcXVpcmVzIGEgcHJpb3IKKyAgLy8vICAgICAgICBkZWNsYXJhdGlvbiAoYmVjYXVzZSBpdCBpcyBlaXRoZXIgZXhwbGljaXRseSBxdWFsaWZpZWQgb3IgaXMgYQorICAvLy8gICAgICAgIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gb3Igc3BlY2lhbGl6YXRpb24pLiBJbiB0aGlzIGNhc2UsIGEKKyAgLy8vICAgICAgICBkZWNsYXJhdGlvbiBpcyBpbiBzY29wZSBpZiBpdCdzIGluIHRoZSBpbmxpbmUgbmFtZXNwYWNlIHNldCBvZiB0aGUKKyAgLy8vICAgICAgICBjb250ZXh0LgorICBib29sIGlzRGVjbEluU2NvcGUoRGVjbCAqRCwgRGVjbENvbnRleHQgKkN0eCwgU2NvcGUgKlMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0lubGluZU5hbWVzcGFjZSA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gQWRkRGVjbCAtIExpbmsgdGhlIGRlY2wgdG8gaXRzIHNoYWRvd2VkIGRlY2wgY2hhaW4uCisgIHZvaWQgQWRkRGVjbChOYW1lZERlY2wgKkQpOworCisgIC8vLyBSZW1vdmVEZWNsIC0gVW5saW5rIHRoZSBkZWNsIGZyb20gaXRzIHNoYWRvd2VkIGRlY2wgY2hhaW4uCisgIC8vLyBUaGUgZGVjbCBtdXN0IGFscmVhZHkgYmUgcGFydCBvZiB0aGUgZGVjbCBjaGFpbi4KKyAgdm9pZCBSZW1vdmVEZWNsKE5hbWVkRGVjbCAqRCk7CisKKyAgLy8vIFxicmllZiBJbnNlcnQgdGhlIGdpdmVuIGRlY2xhcmF0aW9uIGFmdGVyIHRoZSBnaXZlbiBpdGVyYXRvcgorICAvLy8gcG9zaXRpb24uCisgIHZvaWQgSW5zZXJ0RGVjbEFmdGVyKGl0ZXJhdG9yIFBvcywgTmFtZWREZWNsICpEKTsKKworICAvLy8gXGJyaWVmIFRyeSB0byBhZGQgdGhlIGdpdmVuIGRlY2xhcmF0aW9uIHRvIHRoZSB0b3AgbGV2ZWwgc2NvcGUsIGlmIGl0CisgIC8vLyAob3IgYSByZWRlY2xhcmF0aW9uIG9mIGl0KSBoYXNuJ3QgYWxyZWFkeSBiZWVuIGFkZGVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBEIFRoZSBleHRlcm5hbGx5LXByb2R1Y2VkIGRlY2xhcmF0aW9uIHRvIGFkZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gTmFtZSBUaGUgbmFtZSBvZiB0aGUgZXh0ZXJuYWxseS1wcm9kdWNlZCBkZWNsYXJhdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZSBkZWNsYXJhdGlvbiB3YXMgYWRkZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCB0cnlBZGRUb3BMZXZlbERlY2woTmFtZWREZWNsICpELCBEZWNsYXJhdGlvbk5hbWUgTmFtZSk7CisgIAorcHJpdmF0ZToKKyAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHQ7CisgIFByZXByb2Nlc3NvciAmUFA7CisgIAorICBjbGFzcyBJZERlY2xJbmZvTWFwOworICBJZERlY2xJbmZvTWFwICpJZERlY2xJbmZvczsKKworICB2b2lkIHVwZGF0aW5nSWRlbnRpZmllcihJZGVudGlmaWVySW5mbyAmSUkpOworICB2b2lkIHJlYWRpbmdJZGVudGlmaWVyKElkZW50aWZpZXJJbmZvICZJSSk7CisgIAorICAvLy8gRkVUb2tlbkluZm8gY29udGFpbnMgYSBEZWNsIHBvaW50ZXIgaWYgbG93ZXIgYml0ID09IDAuCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0RlY2xQdHIodm9pZCAqUHRyKSB7CisgICAgcmV0dXJuIChyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oUHRyKSAmIDB4MSkgPT0gMDsKKyAgfQorCisgIC8vLyBGRVRva2VuSW5mbyBjb250YWlucyBhIElkRGVjbEluZm8gcG9pbnRlciBpZiBsb3dlciBiaXQgPT0gMS4KKyAgc3RhdGljIGlubGluZSBJZERlY2xJbmZvICp0b0lkRGVjbEluZm8odm9pZCAqUHRyKSB7CisgICAgYXNzZXJ0KChyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oUHRyKSAmIDB4MSkgPT0gMQorICAgICAgICAgICYmICJQdHIgbm90IGEgSWREZWNsSW5mbyogISIpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PElkRGVjbEluZm8qPigKKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFB0cikgJiB+MHgxKTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfU0VNQV9JREVOVElGSUVSUkVTT0xWRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9Jbml0aWFsaXphdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9Jbml0aWFsaXphdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMWMxZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0luaXRpYWxpemF0aW9uLmgKQEAgLTAsMCArMSwxMzY1IEBACisvLz09PS0gSW5pdGlhbGl6YXRpb24uaCAtIFNlbWFudGljIEFuYWx5c2lzIGZvciBJbml0aWFsaXplcnMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyBzdXBwb3J0aW5nIGRhdGEgdHlwZXMgZm9yIGluaXRpYWxpemF0aW9uIG9mIG9iamVjdHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NFTUFfSU5JVElBTElaQVRJT05fSAorI2RlZmluZSBMTFZNX0NMQU5HX1NFTUFfSU5JVElBTElaQVRJT05fSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVENvbnRleHQuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvQXR0ci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xBY2Nlc3NQYWlyLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xhcmF0aW9uTmFtZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NwZWNpZmllcnMuaCIKKyNpbmNsdWRlICJjbGFuZy9TZW1hL092ZXJsb2FkLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9Pd25lcnNoaXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFQVmFsdWU7CitjbGFzcyBDWFhCYXNlU3BlY2lmaWVyOworY2xhc3MgQ1hYQ29uc3RydWN0b3JEZWNsOworY2xhc3MgT2JqQ01ldGhvZERlY2w7CitjbGFzcyBTZW1hOworCisvLy8gXGJyaWVmIERlc2NyaWJlcyBhbiBlbnRpdHkgdGhhdCBpcyBiZWluZyBpbml0aWFsaXplZC4KK2NsYXNzIEluaXRpYWxpemVkRW50aXR5IHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBTcGVjaWZpZXMgdGhlIGtpbmQgb2YgZW50aXR5IGJlaW5nIGluaXRpYWxpemVkLgorICBlbnVtIEVudGl0eUtpbmQgeworICAgIC8vLyBcYnJpZWYgVGhlIGVudGl0eSBiZWluZyBpbml0aWFsaXplZCBpcyBhIHZhcmlhYmxlLgorICAgIEVLX1ZhcmlhYmxlLAorCisgICAgLy8vIFxicmllZiBUaGUgZW50aXR5IGJlaW5nIGluaXRpYWxpemVkIGlzIGEgZnVuY3Rpb24gcGFyYW1ldGVyLgorICAgIEVLX1BhcmFtZXRlciwKKworICAgIC8vLyBcYnJpZWYgVGhlIGVudGl0eSBiZWluZyBpbml0aWFsaXplZCBpcyB0aGUgcmVzdWx0IG9mIGEgZnVuY3Rpb24gY2FsbC4KKyAgICBFS19SZXN1bHQsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBlbnRpdHkgYmVpbmcgaW5pdGlhbGl6ZWQgaXMgYW4gZXhjZXB0aW9uIG9iamVjdCB0aGF0CisgICAgLy8vIGlzIGJlaW5nIHRocm93bi4KKyAgICBFS19FeGNlcHRpb24sCisKKyAgICAvLy8gXGJyaWVmIFRoZSBlbnRpdHkgYmVpbmcgaW5pdGlhbGl6ZWQgaXMgYSBub24tc3RhdGljIGRhdGEgbWVtYmVyIAorICAgIC8vLyBzdWJvYmplY3QuCisgICAgRUtfTWVtYmVyLAorCisgICAgLy8vIFxicmllZiBUaGUgZW50aXR5IGJlaW5nIGluaXRpYWxpemVkIGlzIGFuIGVsZW1lbnQgb2YgYW4gYXJyYXkuCisgICAgRUtfQXJyYXlFbGVtZW50LAorCisgICAgLy8vIFxicmllZiBUaGUgZW50aXR5IGJlaW5nIGluaXRpYWxpemVkIGlzIGFuIG9iamVjdCAob3IgYXJyYXkgb2YKKyAgICAvLy8gb2JqZWN0cykgYWxsb2NhdGVkIHZpYSBuZXcuCisgICAgRUtfTmV3LAorCisgICAgLy8vIFxicmllZiBUaGUgZW50aXR5IGJlaW5nIGluaXRpYWxpemVkIGlzIGEgdGVtcG9yYXJ5IG9iamVjdC4KKyAgICBFS19UZW1wb3JhcnksCisKKyAgICAvLy8gXGJyaWVmIFRoZSBlbnRpdHkgYmVpbmcgaW5pdGlhbGl6ZWQgaXMgYSBiYXNlIG1lbWJlciBzdWJvYmplY3QuCisgICAgRUtfQmFzZSwKKworICAgIC8vLyBcYnJpZWYgVGhlIGluaXRpYWxpemF0aW9uIGlzIGJlaW5nIGRvbmUgYnkgYSBkZWxlZ2F0aW5nIGNvbnN0cnVjdG9yLgorICAgIEVLX0RlbGVnYXRpbmcsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBlbnRpdHkgYmVpbmcgaW5pdGlhbGl6ZWQgaXMgYW4gZWxlbWVudCBvZiBhIHZlY3Rvci4KKyAgICAvLy8gb3IgdmVjdG9yLgorICAgIEVLX1ZlY3RvckVsZW1lbnQsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBlbnRpdHkgYmVpbmcgaW5pdGlhbGl6ZWQgaXMgYSBmaWVsZCBvZiBibG9jayBkZXNjcmlwdG9yIGZvcgorICAgIC8vLyB0aGUgY29waWVkLWluIGMrKyBvYmplY3QuCisgICAgRUtfQmxvY2tFbGVtZW50LAorCisgICAgLy8vIFRoZSBlbnRpdHkgYmVpbmcgaW5pdGlhbGl6ZWQgaXMgYSBmaWVsZCBvZiBibG9jayBkZXNjcmlwdG9yIGZvciB0aGUKKyAgICAvLy8gY29waWVkLWluIGxhbWJkYSBvYmplY3QgdGhhdCdzIHVzZWQgaW4gdGhlIGxhbWJkYSB0byBibG9jayBjb252ZXJzaW9uLgorICAgIEVLX0xhbWJkYVRvQmxvY2tDb252ZXJzaW9uQmxvY2tFbGVtZW50LAorCisgICAgLy8vIFxicmllZiBUaGUgZW50aXR5IGJlaW5nIGluaXRpYWxpemVkIGlzIHRoZSByZWFsIG9yIGltYWdpbmFyeSBwYXJ0IG9mIGEKKyAgICAvLy8gY29tcGxleCBudW1iZXIuCisgICAgRUtfQ29tcGxleEVsZW1lbnQsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBlbnRpdHkgYmVpbmcgaW5pdGlhbGl6ZWQgaXMgdGhlIGZpZWxkIHRoYXQgY2FwdHVyZXMgYSAKKyAgICAvLy8gdmFyaWFibGUgaW4gYSBsYW1iZGEuCisgICAgRUtfTGFtYmRhQ2FwdHVyZSwKKworICAgIC8vLyBcYnJpZWYgVGhlIGVudGl0eSBiZWluZyBpbml0aWFsaXplZCBpcyB0aGUgaW5pdGlhbGl6ZXIgZm9yIGEgY29tcG91bmQKKyAgICAvLy8gbGl0ZXJhbC4KKyAgICBFS19Db21wb3VuZExpdGVyYWxJbml0LAorCisgICAgLy8vIFxicmllZiBUaGUgZW50aXR5IGJlaW5nIGltcGxpY2l0bHkgaW5pdGlhbGl6ZWQgYmFjayB0byB0aGUgZm9ybWFsCisgICAgLy8vIHJlc3VsdCB0eXBlLgorICAgIEVLX1JlbGF0ZWRSZXN1bHQsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBlbnRpdHkgYmVpbmcgaW5pdGlhbGl6ZWQgaXMgYSBmdW5jdGlvbiBwYXJhbWV0ZXI7IGZ1bmN0aW9uCisgICAgLy8vIGlzIG1lbWJlciBvZiBncm91cCBvZiBhdWRpdGVkIENGIEFQSXMuCisgICAgRUtfUGFyYW1ldGVyX0NGX0F1ZGl0ZWQsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBlbnRpdHkgYmVpbmcgaW5pdGlhbGl6ZWQgaXMgYSBzdHJ1Y3R1cmVkIGJpbmRpbmcgb2YgYQorICAgIC8vLyBkZWNvbXBvc2l0aW9uIGRlY2xhcmF0aW9uLgorICAgIEVLX0JpbmRpbmcsCisKKyAgICAvLyBOb3RlOiBlcnJfaW5pdF9jb252ZXJzaW9uX2ZhaWxlZCBpbiBEaWFnbm9zdGljU2VtYUtpbmRzLnRkIHVzZXMgdGhpcworICAgIC8vIGVudW0gYXMgYW4gaW5kZXggZm9yIGl0cyBmaXJzdCAlc2VsZWN0LiAgV2hlbiBtb2RpZnlpbmcgdGhpcyBsaXN0LAorICAgIC8vIHRoYXQgZGlhZ25vc3RpYyB0ZXh0IG5lZWRzIHRvIGJlIHVwZGF0ZWQgYXMgd2VsbC4KKyAgfTsKKyAgCitwcml2YXRlOgorICAvLy8gXGJyaWVmIFRoZSBraW5kIG9mIGVudGl0eSBiZWluZyBpbml0aWFsaXplZC4KKyAgRW50aXR5S2luZCBLaW5kOworCisgIC8vLyBcYnJpZWYgSWYgbm9uLU5VTEwsIHRoZSBwYXJlbnQgZW50aXR5IGluIHdoaWNoIHRoaXMKKyAgLy8vIGluaXRpYWxpemF0aW9uIG9jY3Vycy4KKyAgY29uc3QgSW5pdGlhbGl6ZWRFbnRpdHkgKlBhcmVudCA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0IG9yIHJlZmVyZW5jZSBiZWluZyBpbml0aWFsaXplZC4KKyAgUXVhbFR5cGUgVHlwZTsKKworICAvLy8gXGJyaWVmIFRoZSBtYW5nbGluZyBudW1iZXIgZm9yIHRoZSBuZXh0IHJlZmVyZW5jZSB0ZW1wb3JhcnkgdG8gYmUgY3JlYXRlZC4KKyAgbXV0YWJsZSB1bnNpZ25lZCBNYW5nbGluZ051bWJlciA9IDA7CisKKyAgc3RydWN0IExOIHsKKyAgICAvLy8gXGJyaWVmIFdoZW4gS2luZCA9PSBFS19SZXN1bHQsIEVLX0V4Y2VwdGlvbiwgRUtfTmV3LCB0aGUKKyAgICAvLy8gbG9jYXRpb24gb2YgdGhlICdyZXR1cm4nLCAndGhyb3cnLCBvciAnbmV3JyBrZXl3b3JkLAorICAgIC8vLyByZXNwZWN0aXZlbHkuIFdoZW4gS2luZCA9PSBFS19UZW1wb3JhcnksIHRoZSBsb2NhdGlvbiB3aGVyZQorICAgIC8vLyB0aGUgdGVtcG9yYXJ5IGlzIGJlaW5nIGNyZWF0ZWQuCisgICAgdW5zaWduZWQgTG9jYXRpb247CisKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhlIGVudGl0eSBiZWluZyBpbml0aWFsaXplZCBtYXkgZW5kIHVwIHVzaW5nIHRoZQorICAgIC8vLyBuYW1lZCByZXR1cm4gdmFsdWUgb3B0aW1pemF0aW9uIChOUlZPKS4KKyAgICBib29sIE5SVk87CisgIH07CisKKyAgc3RydWN0IFZEIHsKKyAgICAvLy8gXGJyaWVmIFRoZSBWYXJEZWNsLCBGaWVsZERlY2wsIG9yIEJpbmRpbmdEZWNsIGJlaW5nIGluaXRpYWxpemVkLgorICAgIFZhbHVlRGVjbCAqVmFyaWFibGVPck1lbWJlcjsKKworICAgIC8vLyBcYnJpZWYgV2hlbiBLaW5kID09IEVLX01lbWJlciwgd2hldGhlciB0aGlzIGlzIGFuIGltcGxpY2l0IG1lbWJlcgorICAgIC8vLyBpbml0aWFsaXphdGlvbiBpbiBhIGNvcHkgb3IgbW92ZSBjb25zdHJ1Y3Rvci4gVGhlc2UgY2FuIHBlcmZvcm0gYXJyYXkKKyAgICAvLy8gY29waWVzLgorICAgIGJvb2wgSXNJbXBsaWNpdEZpZWxkSW5pdDsKKyAgfTsKKworICBzdHJ1Y3QgQyB7CisgICAgLy8vIFxicmllZiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgYmVpbmcgY2FwdHVyZWQgYnkgYW4gRUtfTGFtYmRhQ2FwdHVyZS4KKyAgICBJZGVudGlmaWVySW5mbyAqVmFySUQ7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBzb3VyY2UgbG9jYXRpb24gYXQgd2hpY2ggdGhlIGNhcHR1cmUgb2NjdXJzLgorICAgIHVuc2lnbmVkIExvY2F0aW9uOworICB9OworCisgIHVuaW9uIHsKKyAgICAvLy8gXGJyaWVmIFdoZW4gS2luZCA9PSBFS19WYXJpYWJsZSwgRUtfTWVtYmVyIG9yIEVLX0JpbmRpbmcsIHRoZSB2YXJpYWJsZS4KKyAgICBWRCBWYXJpYWJsZTsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFdoZW4gS2luZCA9PSBFS19SZWxhdGVkUmVzdWx0LCB0aGUgT2JqZWN0aXZlQyBtZXRob2Qgd2hlcmUKKyAgICAvLy8gcmVzdWx0IHR5cGUgd2FzIGltcGxpY2l0bHkgY2hhbmdlZCB0byBhY2NvbW1vZGF0ZSBBUkMgc2VtYW50aWNzLgorICAgIE9iakNNZXRob2REZWNsICpNZXRob2REZWNsOworCisgICAgLy8vIFxicmllZiBXaGVuIEtpbmQgPT0gRUtfUGFyYW1ldGVyLCB0aGUgUGFybVZhckRlY2wsIHdpdGggdGhlCisgICAgLy8vIGxvdyBiaXQgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwYXJhbWV0ZXIgaXMgImNvbnN1bWVkIi4KKyAgICB1aW50cHRyX3QgUGFyYW1ldGVyOworICAgIAorICAgIC8vLyBcYnJpZWYgV2hlbiBLaW5kID09IEVLX1RlbXBvcmFyeSBvciBFS19Db21wb3VuZExpdGVyYWxJbml0LCB0aGUgdHlwZQorICAgIC8vLyBzb3VyY2UgaW5mb3JtYXRpb24gZm9yIHRoZSB0ZW1wb3JhcnkuCisgICAgVHlwZVNvdXJjZUluZm8gKlR5cGVJbmZvOworCisgICAgc3RydWN0IExOIExvY0FuZE5SVk87CisgICAgCisgICAgLy8vIFxicmllZiBXaGVuIEtpbmQgPT0gRUtfQmFzZSwgdGhlIGJhc2Ugc3BlY2lmaWVyIHRoYXQgcHJvdmlkZXMgdGhlIAorICAgIC8vLyBiYXNlIGNsYXNzLiBUaGUgbG93ZXIgYml0IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBiYXNlIGlzIGFuIGluaGVyaXRlZAorICAgIC8vLyB2aXJ0dWFsIGJhc2UuCisgICAgdWludHB0cl90IEJhc2U7CisKKyAgICAvLy8gXGJyaWVmIFdoZW4gS2luZCA9PSBFS19BcnJheUVsZW1lbnQsIEVLX1ZlY3RvckVsZW1lbnQsIG9yCisgICAgLy8vIEVLX0NvbXBsZXhFbGVtZW50LCB0aGUgaW5kZXggb2YgdGhlIGFycmF5IG9yIHZlY3RvciBlbGVtZW50IGJlaW5nCisgICAgLy8vIGluaXRpYWxpemVkLiAKKyAgICB1bnNpZ25lZCBJbmRleDsKKworICAgIHN0cnVjdCBDIENhcHR1cmU7CisgIH07CisKKyAgSW5pdGlhbGl6ZWRFbnRpdHkoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgdGhlIGluaXRpYWxpemF0aW9uIGVudGl0eSBmb3IgYSB2YXJpYWJsZS4KKyAgSW5pdGlhbGl6ZWRFbnRpdHkoVmFyRGVjbCAqVmFyLCBFbnRpdHlLaW5kIEVLID0gRUtfVmFyaWFibGUpCisgICAgICA6IEtpbmQoRUspLCBUeXBlKFZhci0+Z2V0VHlwZSgpKSwgVmFyaWFibGV7VmFyLCBmYWxzZX0ge30KKyAgCisgIC8vLyBcYnJpZWYgQ3JlYXRlIHRoZSBpbml0aWFsaXphdGlvbiBlbnRpdHkgZm9yIHRoZSByZXN1bHQgb2YgYQorICAvLy8gZnVuY3Rpb24sIHRocm93aW5nIGFuIG9iamVjdCwgcGVyZm9ybWluZyBhbiBleHBsaWNpdCBjYXN0LCBvcgorICAvLy8gaW5pdGlhbGl6aW5nIGEgcGFyYW1ldGVyIGZvciB3aGljaCB0aGVyZSBpcyBubyBkZWNsYXJhdGlvbi4KKyAgSW5pdGlhbGl6ZWRFbnRpdHkoRW50aXR5S2luZCBLaW5kLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFR5cGUsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgTlJWTyA9IGZhbHNlKQorICAgICAgOiBLaW5kKEtpbmQpLCBUeXBlKFR5cGUpIHsKKyAgICBMb2NBbmROUlZPLkxvY2F0aW9uID0gTG9jLmdldFJhd0VuY29kaW5nKCk7CisgICAgTG9jQW5kTlJWTy5OUlZPID0gTlJWTzsKKyAgfQorICAKKyAgLy8vIFxicmllZiBDcmVhdGUgdGhlIGluaXRpYWxpemF0aW9uIGVudGl0eSBmb3IgYSBtZW1iZXIgc3Vib2JqZWN0LgorICBJbml0aWFsaXplZEVudGl0eShGaWVsZERlY2wgKk1lbWJlciwgY29uc3QgSW5pdGlhbGl6ZWRFbnRpdHkgKlBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBJbXBsaWNpdCkgCisgICAgICA6IEtpbmQoRUtfTWVtYmVyKSwgUGFyZW50KFBhcmVudCksIFR5cGUoTWVtYmVyLT5nZXRUeXBlKCkpLAorICAgICAgICBWYXJpYWJsZXtNZW1iZXIsIEltcGxpY2l0fSB7fQorICAKKyAgLy8vIFxicmllZiBDcmVhdGUgdGhlIGluaXRpYWxpemF0aW9uIGVudGl0eSBmb3IgYW4gYXJyYXkgZWxlbWVudC4KKyAgSW5pdGlhbGl6ZWRFbnRpdHkoQVNUQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgSW5kZXgsIAorICAgICAgICAgICAgICAgICAgICBjb25zdCBJbml0aWFsaXplZEVudGl0eSAmUGFyZW50KTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSB0aGUgaW5pdGlhbGl6YXRpb24gZW50aXR5IGZvciBhIGxhbWJkYSBjYXB0dXJlLgorICBJbml0aWFsaXplZEVudGl0eShJZGVudGlmaWVySW5mbyAqVmFySUQsIFF1YWxUeXBlIEZpZWxkVHlwZSwgU291cmNlTG9jYXRpb24gTG9jKQorICAgICAgOiBLaW5kKEVLX0xhbWJkYUNhcHR1cmUpLCBUeXBlKEZpZWxkVHlwZSkgeworICAgIENhcHR1cmUuVmFySUQgPSBWYXJJRDsKKyAgICBDYXB0dXJlLkxvY2F0aW9uID0gTG9jLmdldFJhd0VuY29kaW5nKCk7CisgIH0KKyAgCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlIHRoZSBpbml0aWFsaXphdGlvbiBlbnRpdHkgZm9yIGEgdmFyaWFibGUuCisgIHN0YXRpYyBJbml0aWFsaXplZEVudGl0eSBJbml0aWFsaXplVmFyaWFibGUoVmFyRGVjbCAqVmFyKSB7CisgICAgcmV0dXJuIEluaXRpYWxpemVkRW50aXR5KFZhcik7CisgIH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSB0aGUgaW5pdGlhbGl6YXRpb24gZW50aXR5IGZvciBhIHBhcmFtZXRlci4KKyAgc3RhdGljIEluaXRpYWxpemVkRW50aXR5IEluaXRpYWxpemVQYXJhbWV0ZXIoQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFybVZhckRlY2wgKlBhcm0pIHsKKyAgICByZXR1cm4gSW5pdGlhbGl6ZVBhcmFtZXRlcihDb250ZXh0LCBQYXJtLCBQYXJtLT5nZXRUeXBlKCkpOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgdGhlIGluaXRpYWxpemF0aW9uIGVudGl0eSBmb3IgYSBwYXJhbWV0ZXIsIGJ1dCB1c2UKKyAgLy8vIGFub3RoZXIgdHlwZS4KKyAgc3RhdGljIEluaXRpYWxpemVkRW50aXR5IEluaXRpYWxpemVQYXJhbWV0ZXIoQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFybVZhckRlY2wgKlBhcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFR5cGUpIHsKKyAgICBib29sIENvbnN1bWVkID0gKENvbnRleHQuZ2V0TGFuZ09wdHMoKS5PYmpDQXV0b1JlZkNvdW50ICYmCisgICAgICAgICAgICAgICAgICAgICBQYXJtLT5oYXNBdHRyPE5TQ29uc3VtZWRBdHRyPigpKTsKKworICAgIEluaXRpYWxpemVkRW50aXR5IEVudGl0eTsKKyAgICBFbnRpdHkuS2luZCA9IEVLX1BhcmFtZXRlcjsKKyAgICBFbnRpdHkuVHlwZSA9CisgICAgICBDb250ZXh0LmdldFZhcmlhYmxlQXJyYXlEZWNheWVkVHlwZShUeXBlLmdldFVucXVhbGlmaWVkVHlwZSgpKTsKKyAgICBFbnRpdHkuUGFyZW50ID0gbnVsbHB0cjsKKyAgICBFbnRpdHkuUGFyYW1ldGVyCisgICAgICA9IChzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KENvbnN1bWVkKSB8IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihQYXJtKSk7CisgICAgcmV0dXJuIEVudGl0eTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIHRoZSBpbml0aWFsaXphdGlvbiBlbnRpdHkgZm9yIGEgcGFyYW1ldGVyIHRoYXQgaXMKKyAgLy8vIG9ubHkga25vd24gYnkgaXRzIHR5cGUuCisgIHN0YXRpYyBJbml0aWFsaXplZEVudGl0eSBJbml0aWFsaXplUGFyYW1ldGVyKEFTVENvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29uc3VtZWQpIHsKKyAgICBJbml0aWFsaXplZEVudGl0eSBFbnRpdHk7CisgICAgRW50aXR5LktpbmQgPSBFS19QYXJhbWV0ZXI7CisgICAgRW50aXR5LlR5cGUgPSBDb250ZXh0LmdldFZhcmlhYmxlQXJyYXlEZWNheWVkVHlwZShUeXBlKTsKKyAgICBFbnRpdHkuUGFyZW50ID0gbnVsbHB0cjsKKyAgICBFbnRpdHkuUGFyYW1ldGVyID0gKENvbnN1bWVkKTsKKyAgICByZXR1cm4gRW50aXR5OworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgdGhlIGluaXRpYWxpemF0aW9uIGVudGl0eSBmb3IgdGhlIHJlc3VsdCBvZiBhIGZ1bmN0aW9uLgorICBzdGF0aWMgSW5pdGlhbGl6ZWRFbnRpdHkgSW5pdGlhbGl6ZVJlc3VsdChTb3VyY2VMb2NhdGlvbiBSZXR1cm5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFR5cGUsIGJvb2wgTlJWTykgeworICAgIHJldHVybiBJbml0aWFsaXplZEVudGl0eShFS19SZXN1bHQsIFJldHVybkxvYywgVHlwZSwgTlJWTyk7CisgIH0KKworICBzdGF0aWMgSW5pdGlhbGl6ZWRFbnRpdHkgSW5pdGlhbGl6ZUJsb2NrKFNvdXJjZUxvY2F0aW9uIEJsb2NrVmFyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFR5cGUsIGJvb2wgTlJWTykgeworICAgIHJldHVybiBJbml0aWFsaXplZEVudGl0eShFS19CbG9ja0VsZW1lbnQsIEJsb2NrVmFyTG9jLCBUeXBlLCBOUlZPKTsKKyAgfQorCisgIHN0YXRpYyBJbml0aWFsaXplZEVudGl0eSBJbml0aWFsaXplTGFtYmRhVG9CbG9jayhTb3VyY2VMb2NhdGlvbiBCbG9ja1ZhckxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFR5cGUsIGJvb2wgTlJWTykgeworICAgIHJldHVybiBJbml0aWFsaXplZEVudGl0eShFS19MYW1iZGFUb0Jsb2NrQ29udmVyc2lvbkJsb2NrRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tWYXJMb2MsIFR5cGUsIE5SVk8pOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgdGhlIGluaXRpYWxpemF0aW9uIGVudGl0eSBmb3IgYW4gZXhjZXB0aW9uIG9iamVjdC4KKyAgc3RhdGljIEluaXRpYWxpemVkRW50aXR5IEluaXRpYWxpemVFeGNlcHRpb24oU291cmNlTG9jYXRpb24gVGhyb3dMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFR5cGUsIGJvb2wgTlJWTykgeworICAgIHJldHVybiBJbml0aWFsaXplZEVudGl0eShFS19FeGNlcHRpb24sIFRocm93TG9jLCBUeXBlLCBOUlZPKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIHRoZSBpbml0aWFsaXphdGlvbiBlbnRpdHkgZm9yIGFuIG9iamVjdCBhbGxvY2F0ZWQgdmlhIG5ldy4KKyAgc3RhdGljIEluaXRpYWxpemVkRW50aXR5IEluaXRpYWxpemVOZXcoU291cmNlTG9jYXRpb24gTmV3TG9jLCBRdWFsVHlwZSBUeXBlKSB7CisgICAgcmV0dXJuIEluaXRpYWxpemVkRW50aXR5KEVLX05ldywgTmV3TG9jLCBUeXBlKTsKKyAgfQorICAKKyAgLy8vIFxicmllZiBDcmVhdGUgdGhlIGluaXRpYWxpemF0aW9uIGVudGl0eSBmb3IgYSB0ZW1wb3JhcnkuCisgIHN0YXRpYyBJbml0aWFsaXplZEVudGl0eSBJbml0aWFsaXplVGVtcG9yYXJ5KFF1YWxUeXBlIFR5cGUpIHsKKyAgICByZXR1cm4gSW5pdGlhbGl6ZVRlbXBvcmFyeShudWxscHRyLCBUeXBlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIHRoZSBpbml0aWFsaXphdGlvbiBlbnRpdHkgZm9yIGEgdGVtcG9yYXJ5LgorICBzdGF0aWMgSW5pdGlhbGl6ZWRFbnRpdHkgSW5pdGlhbGl6ZVRlbXBvcmFyeShUeXBlU291cmNlSW5mbyAqVHlwZUluZm8pIHsKKyAgICByZXR1cm4gSW5pdGlhbGl6ZVRlbXBvcmFyeShUeXBlSW5mbywgVHlwZUluZm8tPmdldFR5cGUoKSk7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgQ3JlYXRlIHRoZSBpbml0aWFsaXphdGlvbiBlbnRpdHkgZm9yIGEgdGVtcG9yYXJ5LgorICBzdGF0aWMgSW5pdGlhbGl6ZWRFbnRpdHkgSW5pdGlhbGl6ZVRlbXBvcmFyeShUeXBlU291cmNlSW5mbyAqVHlwZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFR5cGUpIHsKKyAgICBJbml0aWFsaXplZEVudGl0eSBSZXN1bHQoRUtfVGVtcG9yYXJ5LCBTb3VyY2VMb2NhdGlvbigpLCBUeXBlKTsKKyAgICBSZXN1bHQuVHlwZUluZm8gPSBUeXBlSW5mbzsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisgIAorICAvLy8gXGJyaWVmIENyZWF0ZSB0aGUgaW5pdGlhbGl6YXRpb24gZW50aXR5IGZvciBhIHJlbGF0ZWQgcmVzdWx0LgorICBzdGF0aWMgSW5pdGlhbGl6ZWRFbnRpdHkgSW5pdGlhbGl6ZVJlbGF0ZWRSZXN1bHQoT2JqQ01ldGhvZERlY2wgKk1ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVHlwZSkgeworICAgIEluaXRpYWxpemVkRW50aXR5IFJlc3VsdChFS19SZWxhdGVkUmVzdWx0LCBTb3VyY2VMb2NhdGlvbigpLCBUeXBlKTsKKyAgICBSZXN1bHQuTWV0aG9kRGVjbCA9IE1EOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSB0aGUgaW5pdGlhbGl6YXRpb24gZW50aXR5IGZvciBhIGJhc2UgY2xhc3Mgc3Vib2JqZWN0LgorICBzdGF0aWMgSW5pdGlhbGl6ZWRFbnRpdHkKKyAgSW5pdGlhbGl6ZUJhc2UoQVNUQ29udGV4dCAmQ29udGV4dCwgY29uc3QgQ1hYQmFzZVNwZWNpZmllciAqQmFzZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBJc0luaGVyaXRlZFZpcnR1YWxCYXNlLAorICAgICAgICAgICAgICAgICBjb25zdCBJbml0aWFsaXplZEVudGl0eSAqUGFyZW50ID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgdGhlIGluaXRpYWxpemF0aW9uIGVudGl0eSBmb3IgYSBkZWxlZ2F0ZWQgY29uc3RydWN0b3IuCisgIHN0YXRpYyBJbml0aWFsaXplZEVudGl0eSBJbml0aWFsaXplRGVsZWdhdGlvbihRdWFsVHlwZSBUeXBlKSB7CisgICAgcmV0dXJuIEluaXRpYWxpemVkRW50aXR5KEVLX0RlbGVnYXRpbmcsIFNvdXJjZUxvY2F0aW9uKCksIFR5cGUpOworICB9CisgIAorICAvLy8gXGJyaWVmIENyZWF0ZSB0aGUgaW5pdGlhbGl6YXRpb24gZW50aXR5IGZvciBhIG1lbWJlciBzdWJvYmplY3QuCisgIHN0YXRpYyBJbml0aWFsaXplZEVudGl0eQorICBJbml0aWFsaXplTWVtYmVyKEZpZWxkRGVjbCAqTWVtYmVyLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEluaXRpYWxpemVkRW50aXR5ICpQYXJlbnQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgIGJvb2wgSW1wbGljaXQgPSBmYWxzZSkgeworICAgIHJldHVybiBJbml0aWFsaXplZEVudGl0eShNZW1iZXIsIFBhcmVudCwgSW1wbGljaXQpOworICB9CisgIAorICAvLy8gXGJyaWVmIENyZWF0ZSB0aGUgaW5pdGlhbGl6YXRpb24gZW50aXR5IGZvciBhIG1lbWJlciBzdWJvYmplY3QuCisgIHN0YXRpYyBJbml0aWFsaXplZEVudGl0eQorICBJbml0aWFsaXplTWVtYmVyKEluZGlyZWN0RmllbGREZWNsICpNZW1iZXIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgSW5pdGlhbGl6ZWRFbnRpdHkgKlBhcmVudCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgYm9vbCBJbXBsaWNpdCA9IGZhbHNlKSB7CisgICAgcmV0dXJuIEluaXRpYWxpemVkRW50aXR5KE1lbWJlci0+Z2V0QW5vbkZpZWxkKCksIFBhcmVudCwgSW1wbGljaXQpOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgdGhlIGluaXRpYWxpemF0aW9uIGVudGl0eSBmb3IgYW4gYXJyYXkgZWxlbWVudC4KKyAgc3RhdGljIEluaXRpYWxpemVkRW50aXR5IEluaXRpYWxpemVFbGVtZW50KEFTVENvbnRleHQgJkNvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZXgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5pdGlhbGl6ZWRFbnRpdHkgJlBhcmVudCkgeworICAgIHJldHVybiBJbml0aWFsaXplZEVudGl0eShDb250ZXh0LCBJbmRleCwgUGFyZW50KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIHRoZSBpbml0aWFsaXphdGlvbiBlbnRpdHkgZm9yIGEgc3RydWN0dXJlZCBiaW5kaW5nLgorICBzdGF0aWMgSW5pdGlhbGl6ZWRFbnRpdHkgSW5pdGlhbGl6ZUJpbmRpbmcoVmFyRGVjbCAqQmluZGluZykgeworICAgIHJldHVybiBJbml0aWFsaXplZEVudGl0eShCaW5kaW5nLCBFS19CaW5kaW5nKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIHRoZSBpbml0aWFsaXphdGlvbiBlbnRpdHkgZm9yIGEgbGFtYmRhIGNhcHR1cmUuCisgIHN0YXRpYyBJbml0aWFsaXplZEVudGl0eSBJbml0aWFsaXplTGFtYmRhQ2FwdHVyZShJZGVudGlmaWVySW5mbyAqVmFySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBGaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICByZXR1cm4gSW5pdGlhbGl6ZWRFbnRpdHkoVmFySUQsIEZpZWxkVHlwZSwgTG9jKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIHRoZSBlbnRpdHkgZm9yIGEgY29tcG91bmQgbGl0ZXJhbCBpbml0aWFsaXplci4KKyAgc3RhdGljIEluaXRpYWxpemVkRW50aXR5IEluaXRpYWxpemVDb21wb3VuZExpdGVyYWxJbml0KFR5cGVTb3VyY2VJbmZvICpUU0kpIHsKKyAgICBJbml0aWFsaXplZEVudGl0eSBSZXN1bHQoRUtfQ29tcG91bmRMaXRlcmFsSW5pdCwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNJLT5nZXRUeXBlKCkpOworICAgIFJlc3VsdC5UeXBlSW5mbyA9IFRTSTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIGtpbmQgb2YgaW5pdGlhbGl6YXRpb24uCisgIEVudGl0eUtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKyAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHBhcmVudCBvZiB0aGUgZW50aXR5IGJlaW5nIGluaXRpYWxpemVkLCB3aGVuCisgIC8vLyB0aGUgaW5pdGlhbGl6YXRpb24gaXRzZWxmIGlzIG9jY3VycmluZyB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYQorICAvLy8gbGFyZ2VyIGluaXRpYWxpemF0aW9uLgorICBjb25zdCBJbml0aWFsaXplZEVudGl0eSAqZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gUGFyZW50OyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0eXBlIGJlaW5nIGluaXRpYWxpemVkLgorICBRdWFsVHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVHlwZTsgfQorICAKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBjb21wbGV0ZSB0eXBlLXNvdXJjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIG9iamVjdCBiZWluZyAKKyAgLy8vIGNvbnN0cnVjdGVkLCBpZiBrbm93bi4KKyAgVHlwZVNvdXJjZUluZm8gKmdldFR5cGVTb3VyY2VJbmZvKCkgY29uc3QgeworICAgIGlmIChLaW5kID09IEVLX1RlbXBvcmFyeSB8fCBLaW5kID09IEVLX0NvbXBvdW5kTGl0ZXJhbEluaXQpCisgICAgICByZXR1cm4gVHlwZUluZm87CisgICAgCisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIGVudGl0eSBiZWluZyBpbml0aWFsaXplZC4KKyAgRGVjbGFyYXRpb25OYW1lIGdldE5hbWUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB2YXJpYWJsZSwgcGFyYW1ldGVyLCBvciBmaWVsZCBiZWluZworICAvLy8gaW5pdGlhbGl6ZWQuCisgIFZhbHVlRGVjbCAqZ2V0RGVjbCgpIGNvbnN0OworICAKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgT2JqZWN0aXZlQyBtZXRob2QgYmVpbmcgaW5pdGlhbGl6ZWQuCisgIE9iakNNZXRob2REZWNsICpnZXRNZXRob2REZWNsKCkgY29uc3QgeyByZXR1cm4gTWV0aG9kRGVjbDsgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpbml0aWFsaXphdGlvbiBhbGxvd3MgdGhlIG5hbWVkIHJldHVybiAKKyAgLy8vIHZhbHVlIG9wdGltaXphdGlvbiwgd2hpY2ggYWxzbyBhcHBsaWVzIHRvIHRocm93biBvYmplY3RzLgorICBib29sIGFsbG93c05SVk8oKSBjb25zdDsKKworICBib29sIGlzUGFyYW1ldGVyS2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldEtpbmQoKSA9PSBFS19QYXJhbWV0ZXIgIHx8CisgICAgICAgICAgICBnZXRLaW5kKCkgPT0gRUtfUGFyYW1ldGVyX0NGX0F1ZGl0ZWQpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGluaXRpYWxpemF0aW9uIGNvbnN1bWVzIHRoZQorICAvLy8gcGFyYW1ldGVyLgorICBib29sIGlzUGFyYW1ldGVyQ29uc3VtZWQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzUGFyYW1ldGVyS2luZCgpICYmICJOb3QgYSBwYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gKFBhcmFtZXRlciAmIDEpOworICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGJhc2Ugc3BlY2lmaWVyLgorICBjb25zdCBDWFhCYXNlU3BlY2lmaWVyICpnZXRCYXNlU3BlY2lmaWVyKCkgY29uc3QgeworICAgIGFzc2VydChnZXRLaW5kKCkgPT0gRUtfQmFzZSAmJiAiTm90IGEgYmFzZSBzcGVjaWZpZXIiKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDWFhCYXNlU3BlY2lmaWVyICo+KEJhc2UgJiB+MHgxKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHdoZXRoZXIgdGhlIGJhc2UgaXMgYW4gaW5oZXJpdGVkIHZpcnR1YWwgYmFzZS4KKyAgYm9vbCBpc0luaGVyaXRlZFZpcnR1YWxCYXNlKCkgY29uc3QgeworICAgIGFzc2VydChnZXRLaW5kKCkgPT0gRUtfQmFzZSAmJiAiTm90IGEgYmFzZSBzcGVjaWZpZXIiKTsKKyAgICByZXR1cm4gQmFzZSAmIDB4MTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhbiBhcnJheSBuZXcgd2l0aCBhbiB1bmtub3duIGJvdW5kLgorICBib29sIGlzVmFyaWFibGVMZW5ndGhBcnJheU5ldygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0S2luZCgpID09IEVLX05ldyAmJiBkeW5fY2FzdF9vcl9udWxsPEluY29tcGxldGVBcnJheVR5cGU+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUeXBlKCktPmdldEFzQXJyYXlUeXBlVW5zYWZlKCkpOworICB9CisKKyAgLy8vIFxicmllZiBJcyB0aGlzIHRoZSBpbXBsaWNpdCBpbml0aWFsaXphdGlvbiBvZiBhIG1lbWJlciBvZiBhIGNsYXNzIGZyb20KKyAgLy8vIGEgZGVmYXVsdGVkIGNvbnN0cnVjdG9yPworICBib29sIGlzSW1wbGljaXRNZW1iZXJJbml0aWFsaXplcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0S2luZCgpID09IEVLX01lbWJlciAmJiBWYXJpYWJsZS5Jc0ltcGxpY2l0RmllbGRJbml0OworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIGxvY2F0aW9uIG9mIHRoZSAncmV0dXJuJyBrZXl3b3JkIHdoZW4gaW5pdGlhbGl6aW5nCisgIC8vLyB0aGUgcmVzdWx0IG9mIGEgZnVuY3Rpb24gY2FsbC4KKyAgU291cmNlTG9jYXRpb24gZ2V0UmV0dXJuTG9jKCkgY29uc3QgeworICAgIGFzc2VydChnZXRLaW5kKCkgPT0gRUtfUmVzdWx0ICYmICJObyAncmV0dXJuJyBsb2NhdGlvbiEiKTsKKyAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZyhMb2NBbmROUlZPLkxvY2F0aW9uKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBsb2NhdGlvbiBvZiB0aGUgJ3Rocm93JyBrZXl3b3JkIHdoZW4gaW5pdGlhbGl6aW5nCisgIC8vLyBhbiBleGNlcHRpb24gb2JqZWN0LgorICBTb3VyY2VMb2NhdGlvbiBnZXRUaHJvd0xvYygpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0S2luZCgpID09IEVLX0V4Y2VwdGlvbiAmJiAiTm8gJ3Rocm93JyBsb2NhdGlvbiEiKTsKKyAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZyhMb2NBbmROUlZPLkxvY2F0aW9uKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSWYgdGhpcyBpcyBhbiBhcnJheSwgdmVjdG9yLCBvciBjb21wbGV4IG51bWJlciBlbGVtZW50LCBnZXQgdGhlCisgIC8vLyBlbGVtZW50J3MgaW5kZXguCisgIHVuc2lnbmVkIGdldEVsZW1lbnRJbmRleCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0S2luZCgpID09IEVLX0FycmF5RWxlbWVudCB8fCBnZXRLaW5kKCkgPT0gRUtfVmVjdG9yRWxlbWVudCB8fAorICAgICAgICAgICBnZXRLaW5kKCkgPT0gRUtfQ29tcGxleEVsZW1lbnQpOworICAgIHJldHVybiBJbmRleDsKKyAgfQorCisgIC8vLyBcYnJpZWYgSWYgdGhpcyBpcyBhbHJlYWR5IHRoZSBpbml0aWFsaXplciBmb3IgYW4gYXJyYXkgb3IgdmVjdG9yCisgIC8vLyBlbGVtZW50LCBzZXRzIHRoZSBlbGVtZW50IGluZGV4LgorICB2b2lkIHNldEVsZW1lbnRJbmRleCh1bnNpZ25lZCBJbmRleCkgeworICAgIGFzc2VydChnZXRLaW5kKCkgPT0gRUtfQXJyYXlFbGVtZW50IHx8IGdldEtpbmQoKSA9PSBFS19WZWN0b3JFbGVtZW50IHx8CisgICAgICAgICAgIGdldEtpbmQoKSA9PSBFS19Db21wbGV4RWxlbWVudCk7CisgICAgdGhpcy0+SW5kZXggPSBJbmRleDsKKyAgfQorCisgIC8vLyBcYnJpZWYgRm9yIGEgbGFtYmRhIGNhcHR1cmUsIHJldHVybiB0aGUgY2FwdHVyZSdzIG5hbWUuCisgIFN0cmluZ1JlZiBnZXRDYXB0dXJlZFZhck5hbWUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEtpbmQoKSA9PSBFS19MYW1iZGFDYXB0dXJlICYmICJOb3QgYSBsYW1iZGEgY2FwdHVyZSEiKTsKKyAgICByZXR1cm4gQ2FwdHVyZS5WYXJJRC0+Z2V0TmFtZSgpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBjYXB0dXJlIHdoZW4gaW5pdGlhbGl6aW5nCisgIC8vLyBmaWVsZCBmcm9tIGEgY2FwdHVyZWQgdmFyaWFibGUgaW4gYSBsYW1iZGEuCisgIFNvdXJjZUxvY2F0aW9uIGdldENhcHR1cmVMb2MoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEtpbmQoKSA9PSBFS19MYW1iZGFDYXB0dXJlICYmICJOb3QgYSBsYW1iZGEgY2FwdHVyZSEiKTsKKyAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZyhDYXB0dXJlLkxvY2F0aW9uKTsKKyAgfQorICAKKyAgdm9pZCBzZXRQYXJhbWV0ZXJDRkF1ZGl0ZWQoKSB7CisgICAgS2luZCA9IEVLX1BhcmFtZXRlcl9DRl9BdWRpdGVkOworICB9CisKKyAgdW5zaWduZWQgYWxsb2NhdGVNYW5nbGluZ051bWJlcigpIGNvbnN0IHsgcmV0dXJuICsrTWFuZ2xpbmdOdW1iZXI7IH0KKworICAvLy8gRHVtcCBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbml0aWFsaXplZCBlbnRpdHkgdG8gc3RhbmRhcmQgZXJyb3IsCisgIC8vLyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICB2b2lkIGR1bXAoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgdW5zaWduZWQgZHVtcEltcGwocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKK307CisgIAorLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIGtpbmQgb2YgaW5pdGlhbGl6YXRpb24gYmVpbmcgcGVyZm9ybWVkLCBhbG9uZyB3aXRoIAorLy8vIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0b2tlbnMgcmVsYXRlZCB0byB0aGUgaW5pdGlhbGl6YXRpb24gKGVxdWFsIHNpZ24sCisvLy8gcGFyZW50aGVzZXMpLgorY2xhc3MgSW5pdGlhbGl6YXRpb25LaW5kIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBUaGUga2luZCBvZiBpbml0aWFsaXphdGlvbiBiZWluZyBwZXJmb3JtZWQuCisgIGVudW0gSW5pdEtpbmQgeworICAgIC8vLyBEaXJlY3QgaW5pdGlhbGl6YXRpb24KKyAgICBJS19EaXJlY3QsCisKKyAgICAvLy8gRGlyZWN0IGxpc3QtaW5pdGlhbGl6YXRpb24KKyAgICBJS19EaXJlY3RMaXN0LAorCisgICAgLy8vIENvcHkgaW5pdGlhbGl6YXRpb24KKyAgICBJS19Db3B5LAorCisgICAgLy8vIERlZmF1bHQgaW5pdGlhbGl6YXRpb24KKyAgICBJS19EZWZhdWx0LAorCisgICAgLy8vIFZhbHVlIGluaXRpYWxpemF0aW9uCisgICAgSUtfVmFsdWUKKyAgfTsKKyAgCitwcml2YXRlOgorICAvLy8gXGJyaWVmIFRoZSBjb250ZXh0IG9mIHRoZSBpbml0aWFsaXphdGlvbi4KKyAgZW51bSBJbml0Q29udGV4dCB7CisgICAgLy8vIE5vcm1hbCBjb250ZXh0CisgICAgSUNfTm9ybWFsLAorCisgICAgLy8vIE5vcm1hbCBjb250ZXh0LCBidXQgYWxsb3dzIGV4cGxpY2l0IGNvbnZlcnNpb24gZnVuY3Rpb25zcworICAgIElDX0V4cGxpY2l0Q29udnMsCisKKyAgICAvLy8gSW1wbGljaXQgY29udGV4dCAodmFsdWUgaW5pdGlhbGl6YXRpb24pCisgICAgSUNfSW1wbGljaXQsCisKKyAgICAvLy8gU3RhdGljIGNhc3QgY29udGV4dAorICAgIElDX1N0YXRpY0Nhc3QsCisKKyAgICAvLy8gQy1zdHlsZSBjYXN0IGNvbnRleHQKKyAgICBJQ19DU3R5bGVDYXN0LAorCisgICAgLy8vIEZ1bmN0aW9uYWwgY2FzdCBjb250ZXh0CisgICAgSUNfRnVuY3Rpb25hbENhc3QKKyAgfTsKKyAgCisgIC8vLyBcYnJpZWYgVGhlIGtpbmQgb2YgaW5pdGlhbGl6YXRpb24gYmVpbmcgcGVyZm9ybWVkLgorICBJbml0S2luZCBLaW5kIDogODsKKworICAvLy8gXGJyaWVmIFRoZSBjb250ZXh0IG9mIHRoZSBpbml0aWFsaXphdGlvbi4KKyAgSW5pdENvbnRleHQgQ29udGV4dCA6IDg7CisgIAorICAvLy8gXGJyaWVmIFRoZSBzb3VyY2UgbG9jYXRpb25zIGludm9sdmVkIGluIHRoZSBpbml0aWFsaXphdGlvbi4KKyAgU291cmNlTG9jYXRpb24gTG9jYXRpb25zWzNdOworICAKKyAgSW5pdGlhbGl6YXRpb25LaW5kKEluaXRLaW5kIEtpbmQsIEluaXRDb250ZXh0IENvbnRleHQsIFNvdXJjZUxvY2F0aW9uIExvYzEsIAorICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jMiwgU291cmNlTG9jYXRpb24gTG9jMykKKyAgICAgIDogS2luZChLaW5kKSwgQ29udGV4dChDb250ZXh0KSB7CisgICAgTG9jYXRpb25zWzBdID0gTG9jMTsKKyAgICBMb2NhdGlvbnNbMV0gPSBMb2MyOworICAgIExvY2F0aW9uc1syXSA9IExvYzM7CisgIH0KKyAgCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgZGlyZWN0IGluaXRpYWxpemF0aW9uLgorICBzdGF0aWMgSW5pdGlhbGl6YXRpb25LaW5kIENyZWF0ZURpcmVjdChTb3VyY2VMb2NhdGlvbiBJbml0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYykgeworICAgIHJldHVybiBJbml0aWFsaXphdGlvbktpbmQoSUtfRGlyZWN0LCBJQ19Ob3JtYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0TG9jLCBMUGFyZW5Mb2MsIFJQYXJlbkxvYyk7CisgIH0KKworICBzdGF0aWMgSW5pdGlhbGl6YXRpb25LaW5kIENyZWF0ZURpcmVjdExpc3QoU291cmNlTG9jYXRpb24gSW5pdExvYykgeworICAgIHJldHVybiBJbml0aWFsaXphdGlvbktpbmQoSUtfRGlyZWN0TGlzdCwgSUNfTm9ybWFsLCBJbml0TG9jLCBJbml0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdExvYyk7CisgIH0KKworICBzdGF0aWMgSW5pdGlhbGl6YXRpb25LaW5kIENyZWF0ZURpcmVjdExpc3QoU291cmNlTG9jYXRpb24gSW5pdExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExCcmFjZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJCcmFjZUxvYykgeworICAgIHJldHVybiBJbml0aWFsaXphdGlvbktpbmQoSUtfRGlyZWN0TGlzdCwgSUNfTm9ybWFsLCBJbml0TG9jLCBMQnJhY2VMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQnJhY2VMb2MpOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBkaXJlY3QgaW5pdGlhbGl6YXRpb24gZHVlIHRvIGEgY2FzdCB0aGF0IGlzbid0IGEgQy1zdHlsZSAKKyAgLy8vIG9yIGZ1bmN0aW9uYWwgY2FzdC4KKyAgc3RhdGljIEluaXRpYWxpemF0aW9uS2luZCBDcmVhdGVDYXN0KFNvdXJjZVJhbmdlIFR5cGVSYW5nZSkgeworICAgIHJldHVybiBJbml0aWFsaXphdGlvbktpbmQoSUtfRGlyZWN0LCBJQ19TdGF0aWNDYXN0LCBUeXBlUmFuZ2UuZ2V0QmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVSYW5nZS5nZXRCZWdpbigpLCBUeXBlUmFuZ2UuZ2V0RW5kKCkpOworICB9CisgIAorICAvLy8gXGJyaWVmIENyZWF0ZSBhIGRpcmVjdCBpbml0aWFsaXphdGlvbiBmb3IgYSBDLXN0eWxlIGNhc3QuCisgIHN0YXRpYyBJbml0aWFsaXphdGlvbktpbmQgQ3JlYXRlQ1N0eWxlQ2FzdChTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFR5cGVSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5pdExpc3QpIHsKKyAgICAvLyBDKysgY2FzdCBzeW50YXggZG9lc24ndCBwZXJtaXQgaW5pdCBsaXN0cywgYnV0IEMgY29tcG91bmQgbGl0ZXJhbHMgYXJlCisgICAgLy8gZXhhY3RseSB0aGF0LgorICAgIHJldHVybiBJbml0aWFsaXphdGlvbktpbmQoSW5pdExpc3QgPyBJS19EaXJlY3RMaXN0IDogSUtfRGlyZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNfQ1N0eWxlQ2FzdCwgU3RhcnRMb2MsIFR5cGVSYW5nZS5nZXRCZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVJhbmdlLmdldEVuZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgZGlyZWN0IGluaXRpYWxpemF0aW9uIGZvciBhIGZ1bmN0aW9uYWwgY2FzdC4KKyAgc3RhdGljIEluaXRpYWxpemF0aW9uS2luZCBDcmVhdGVGdW5jdGlvbmFsQ2FzdChTb3VyY2VSYW5nZSBUeXBlUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbml0TGlzdCkgeworICAgIHJldHVybiBJbml0aWFsaXphdGlvbktpbmQoSW5pdExpc3QgPyBJS19EaXJlY3RMaXN0IDogSUtfRGlyZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNfRnVuY3Rpb25hbENhc3QsIFR5cGVSYW5nZS5nZXRCZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVJhbmdlLmdldEJlZ2luKCksIFR5cGVSYW5nZS5nZXRFbmQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIGNvcHkgaW5pdGlhbGl6YXRpb24uCisgIHN0YXRpYyBJbml0aWFsaXphdGlvbktpbmQgQ3JlYXRlQ29weShTb3VyY2VMb2NhdGlvbiBJbml0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRXF1YWxMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93RXhwbGljaXRDb252cyA9IGZhbHNlKSB7CisgICAgcmV0dXJuIEluaXRpYWxpemF0aW9uS2luZChJS19Db3B5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93RXhwbGljaXRDb252cz8gSUNfRXhwbGljaXRDb252cyA6IElDX05vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRMb2MsIEVxdWFsTG9jLCBFcXVhbExvYyk7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgZGVmYXVsdCBpbml0aWFsaXphdGlvbi4KKyAgc3RhdGljIEluaXRpYWxpemF0aW9uS2luZCBDcmVhdGVEZWZhdWx0KFNvdXJjZUxvY2F0aW9uIEluaXRMb2MpIHsKKyAgICByZXR1cm4gSW5pdGlhbGl6YXRpb25LaW5kKElLX0RlZmF1bHQsIElDX05vcm1hbCwgSW5pdExvYywgSW5pdExvYywgSW5pdExvYyk7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgdmFsdWUgaW5pdGlhbGl6YXRpb24uCisgIHN0YXRpYyBJbml0aWFsaXphdGlvbktpbmQgQ3JlYXRlVmFsdWUoU291cmNlTG9jYXRpb24gSW5pdExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbXBsaWNpdCA9IGZhbHNlKSB7CisgICAgcmV0dXJuIEluaXRpYWxpemF0aW9uS2luZChJS19WYWx1ZSwgaXNJbXBsaWNpdCA/IElDX0ltcGxpY2l0IDogSUNfTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdExvYywgTFBhcmVuTG9jLCBSUGFyZW5Mb2MpOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gaW5pdGlhbGl6YXRpb24gZnJvbSBhbiBpbml0aWFsaXplciAod2hpY2gsIGZvciBkaXJlY3QKKyAgLy8vIGluaXRpYWxpemF0aW9uIGZyb20gYSBwYXJlbnRoZXNpemVkIGxpc3QsIHdpbGwgYmUgYSBQYXJlbkxpc3RFeHByKS4KKyAgc3RhdGljIEluaXRpYWxpemF0aW9uS2luZCBDcmVhdGVGb3JJbml0KFNvdXJjZUxvY2F0aW9uIExvYywgYm9vbCBEaXJlY3RJbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqSW5pdCkgeworICAgIGlmICghSW5pdCkgcmV0dXJuIENyZWF0ZURlZmF1bHQoTG9jKTsKKyAgICBpZiAoIURpcmVjdEluaXQpIHJldHVybiBDcmVhdGVDb3B5KExvYywgSW5pdC0+Z2V0TG9jU3RhcnQoKSk7CisgICAgaWYgKGlzYTxJbml0TGlzdEV4cHI+KEluaXQpKQorICAgICAgcmV0dXJuIENyZWF0ZURpcmVjdExpc3QoTG9jLCBJbml0LT5nZXRMb2NTdGFydCgpLCBJbml0LT5nZXRMb2NFbmQoKSk7CisgICAgcmV0dXJuIENyZWF0ZURpcmVjdChMb2MsIEluaXQtPmdldExvY1N0YXJ0KCksIEluaXQtPmdldExvY0VuZCgpKTsKKyAgfQorICAKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIGluaXRpYWxpemF0aW9uIGtpbmQuCisgIEluaXRLaW5kIGdldEtpbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIEtpbmQ7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpbml0aWFsaXphdGlvbiBpcyBhbiBleHBsaWNpdCBjYXN0LgorICBib29sIGlzRXhwbGljaXRDYXN0KCkgY29uc3QgeworICAgIHJldHVybiBDb250ZXh0ID49IElDX1N0YXRpY0Nhc3Q7CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpbml0aWFsaXphdGlvbiBpcyBhIEMtc3R5bGUgY2FzdC4KKyAgYm9vbCBpc0NTdHlsZU9yRnVuY3Rpb25hbENhc3QoKSBjb25zdCB7IAorICAgIHJldHVybiBDb250ZXh0ID49IElDX0NTdHlsZUNhc3Q7IAorICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgQy1zdHlsZSBjYXN0LgorICBib29sIGlzQ1N0eWxlQ2FzdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29udGV4dCA9PSBJQ19DU3R5bGVDYXN0OworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgZnVuY3Rpb25hbC1zdHlsZSBjYXN0LgorICBib29sIGlzRnVuY3Rpb25hbENhc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnRleHQgPT0gSUNfRnVuY3Rpb25hbENhc3Q7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgaW5pdGlhbGl6YXRpb24gaXMgYW4gaW1wbGljaXQKKyAgLy8vIHZhbHVlLWluaXRpYWxpemF0aW9uLCBlLmcuLCBhcyBvY2N1cnMgZHVyaW5nIGFnZ3JlZ2F0ZQorICAvLy8gaW5pdGlhbGl6YXRpb24uCisgIGJvb2wgaXNJbXBsaWNpdFZhbHVlSW5pdCgpIGNvbnN0IHsgcmV0dXJuIENvbnRleHQgPT0gSUNfSW1wbGljaXQ7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBhdCB3aGljaCBpbml0aWFsaXphdGlvbiBpcyBvY2N1cnJpbmcuCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gTG9jYXRpb25zWzBdOyB9CisgIAorICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzb3VyY2UgcmFuZ2UgdGhhdCBjb3ZlcnMgdGhlIGluaXRpYWxpemF0aW9uLgorICBTb3VyY2VSYW5nZSBnZXRSYW5nZSgpIGNvbnN0IHsgCisgICAgcmV0dXJuIFNvdXJjZVJhbmdlKExvY2F0aW9uc1swXSwgTG9jYXRpb25zWzJdKTsKKyAgfQorICAKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGVxdWFsIHNpZ24gZm9yIGNvcHkgaW5pdGlhbGl6YXRpb24KKyAgLy8vIChpZiBwcmVzZW50KS4KKyAgU291cmNlTG9jYXRpb24gZ2V0RXF1YWxMb2MoKSBjb25zdCB7CisgICAgYXNzZXJ0KEtpbmQgPT0gSUtfQ29weSAmJiAiT25seSBjb3B5IGluaXRpYWxpemF0aW9uIGhhcyBhbiAnPSciKTsKKyAgICByZXR1cm4gTG9jYXRpb25zWzFdOworICB9CisKKyAgYm9vbCBpc0NvcHlJbml0KCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBJS19Db3B5OyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB3aGV0aGVyIHRoaXMgaW5pdGlhbGl6YXRpb24gYWxsb3dzIHRoZSB1c2Ugb2YgZXhwbGljaXQKKyAgLy8vICAgICAgICBjb25zdHJ1Y3RvcnMuCisgIGJvb2wgQWxsb3dFeHBsaWNpdCgpIGNvbnN0IHsgcmV0dXJuICFpc0NvcHlJbml0KCk7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHdoZXRoZXIgdGhpcyBpbml0aWFsaXphdGlvbiBhbGxvd3MgdGhlIHVzZSBvZiBleHBsaWNpdAorICAvLy8gY29udmVyc2lvbiBmdW5jdGlvbnMgd2hlbiBiaW5kaW5nIGEgcmVmZXJlbmNlLiBJZiB0aGUgcmVmZXJlbmNlIGlzIHRoZQorICAvLy8gZmlyc3QgcGFyYW1ldGVyIGluIGEgY29weSBvciBtb3ZlIGNvbnN0cnVjdG9yLCBzdWNoIGNvbnZlcnNpb25zIGFyZQorICAvLy8gcGVybWl0dGVkIGV2ZW4gdGhvdWdoIHdlIGFyZSBwZXJmb3JtaW5nIGNvcHktaW5pdGlhbGl6YXRpb24uCisgIGJvb2wgYWxsb3dFeHBsaWNpdENvbnZlcnNpb25GdW5jdGlvbnNJblJlZkJpbmRpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuICFpc0NvcHlJbml0KCkgfHwgQ29udGV4dCA9PSBJQ19FeHBsaWNpdENvbnZzOworICB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgaW5pdGlhbGl6YXRpb24gaGFzIGEgc291cmNlIHJhbmdlIGNvbnRhaW5pbmcgdGhlCisgIC8vLyBsb2NhdGlvbnMgb2Ygb3BlbiBhbmQgY2xvc2luZyBwYXJlbnRoZXNlcyBvciBicmFjZXMuCisgIGJvb2wgaGFzUGFyZW5PckJyYWNlUmFuZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIEtpbmQgPT0gSUtfRGlyZWN0IHx8IEtpbmQgPT0gSUtfVmFsdWUgfHwgS2luZCA9PSBJS19EaXJlY3RMaXN0OworICB9CisgIAorICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzb3VyY2UgcmFuZ2UgY29udGFpbmluZyB0aGUgbG9jYXRpb25zIG9mIHRoZSBvcGVuCisgIC8vLyBhbmQgY2xvc2luZyBwYXJlbnRoZXNlcyBvciBicmFjZXMgZm9yIHZhbHVlLCBkaXJlY3QsIGFuZCBkaXJlY3QgbGlzdAorICAvLy8gaW5pdGlhbGl6YXRpb25zLgorICBTb3VyY2VSYW5nZSBnZXRQYXJlbk9yQnJhY2VSYW5nZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaGFzUGFyZW5PckJyYWNlUmFuZ2UoKSAmJiAiT25seSBkaXJlY3QsIHZhbHVlLCBhbmQgZGlyZWN0LWxpc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0aWFsaXphdGlvbiBoYXZlIHBhcmVudGhlc2VzIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnJhY2VzIik7CisgICAgcmV0dXJuIFNvdXJjZVJhbmdlKExvY2F0aW9uc1sxXSwgTG9jYXRpb25zWzJdKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIHNlcXVlbmNlIG9mIGluaXRpYWxpemF0aW9ucyByZXF1aXJlZCB0byBpbml0aWFsaXplCisvLy8gYSBnaXZlbiBvYmplY3Qgb3IgcmVmZXJlbmNlIHdpdGggYSBzZXQgb2YgYXJndW1lbnRzLgorY2xhc3MgSW5pdGlhbGl6YXRpb25TZXF1ZW5jZSB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgRGVzY3JpYmVzIHRoZSBraW5kIG9mIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGNvbXB1dGVkLgorICBlbnVtIFNlcXVlbmNlS2luZCB7CisgICAgLy8vIFxicmllZiBBIGZhaWxlZCBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZS4gVGhlIGZhaWx1cmUga2luZCB0ZWxscyB3aGF0CisgICAgLy8vIGhhcHBlbmVkLgorICAgIEZhaWxlZFNlcXVlbmNlID0gMCwKKworICAgIC8vLyBcYnJpZWYgQSBkZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24sIHdoaWNoIGNvdWxkIG5vdCBiZQorICAgIC8vLyB0eXBlLWNoZWNrZWQgZHVlIHRvIHRoZSBwcmVzZW5jZSBvZiBkZXBlbmRlbnQgdHlwZXMgb3IKKyAgICAvLy8gZGVwZW5kZW50bHktdHlwZWQgZXhwcmVzc2lvbnMuCisgICAgRGVwZW5kZW50U2VxdWVuY2UsCisKKyAgICAvLy8gXGJyaWVmIEEgbm9ybWFsIHNlcXVlbmNlLgorICAgIE5vcm1hbFNlcXVlbmNlCisgIH07CisgIAorICAvLy8gXGJyaWVmIERlc2NyaWJlcyB0aGUga2luZCBvZiBhIHBhcnRpY3VsYXIgc3RlcCBpbiBhbiBpbml0aWFsaXphdGlvbgorICAvLy8gc2VxdWVuY2UuCisgIGVudW0gU3RlcEtpbmQgeworICAgIC8vLyBcYnJpZWYgUmVzb2x2ZSB0aGUgYWRkcmVzcyBvZiBhbiBvdmVybG9hZGVkIGZ1bmN0aW9uIHRvIGEgc3BlY2lmaWMKKyAgICAvLy8gZnVuY3Rpb24gZGVjbGFyYXRpb24uCisgICAgU0tfUmVzb2x2ZUFkZHJlc3NPZk92ZXJsb2FkZWRGdW5jdGlvbiwKKworICAgIC8vLyBcYnJpZWYgUGVyZm9ybSBhIGRlcml2ZWQtdG8tYmFzZSBjYXN0LCBwcm9kdWNpbmcgYW4gcnZhbHVlLgorICAgIFNLX0Nhc3REZXJpdmVkVG9CYXNlUlZhbHVlLAorCisgICAgLy8vIFxicmllZiBQZXJmb3JtIGEgZGVyaXZlZC10by1iYXNlIGNhc3QsIHByb2R1Y2luZyBhbiB4dmFsdWUuCisgICAgU0tfQ2FzdERlcml2ZWRUb0Jhc2VYVmFsdWUsCisKKyAgICAvLy8gXGJyaWVmIFBlcmZvcm0gYSBkZXJpdmVkLXRvLWJhc2UgY2FzdCwgcHJvZHVjaW5nIGFuIGx2YWx1ZS4KKyAgICBTS19DYXN0RGVyaXZlZFRvQmFzZUxWYWx1ZSwKKworICAgIC8vLyBcYnJpZWYgUmVmZXJlbmNlIGJpbmRpbmcgdG8gYW4gbHZhbHVlLgorICAgIFNLX0JpbmRSZWZlcmVuY2UsCisKKyAgICAvLy8gXGJyaWVmIFJlZmVyZW5jZSBiaW5kaW5nIHRvIGEgdGVtcG9yYXJ5LgorICAgIFNLX0JpbmRSZWZlcmVuY2VUb1RlbXBvcmFyeSwKKworICAgIC8vLyBcYnJpZWYgQW4gb3B0aW9uYWwgY29weSBvZiBhIHRlbXBvcmFyeSBvYmplY3QgdG8gYW5vdGhlcgorICAgIC8vLyB0ZW1wb3Jhcnkgb2JqZWN0LCB3aGljaCBpcyBwZXJtaXR0ZWQgKGJ1dCBub3QgcmVxdWlyZWQpIGJ5CisgICAgLy8vIEMrKzk4LzAzIGJ1dCBub3QgQysrMHguCisgICAgU0tfRXh0cmFuZW91c0NvcHlUb1RlbXBvcmFyeSwKKworICAgIC8vLyBcYnJpZWYgRGlyZWN0LWluaXRpYWxpemF0aW9uIGZyb20gYSByZWZlcmVuY2UtcmVsYXRlZCBvYmplY3QgaW4gdGhlCisgICAgLy8vIGZpbmFsIHN0YWdlIG9mIGNsYXNzIGNvcHktaW5pdGlhbGl6YXRpb24uCisgICAgU0tfRmluYWxDb3B5LAorCisgICAgLy8vIFxicmllZiBQZXJmb3JtIGEgdXNlci1kZWZpbmVkIGNvbnZlcnNpb24sIGVpdGhlciB2aWEgYSBjb252ZXJzaW9uCisgICAgLy8vIGZ1bmN0aW9uIG9yIHZpYSBhIGNvbnN0cnVjdG9yLgorICAgIFNLX1VzZXJDb252ZXJzaW9uLAorCisgICAgLy8vIFxicmllZiBQZXJmb3JtIGEgcXVhbGlmaWNhdGlvbiBjb252ZXJzaW9uLCBwcm9kdWNpbmcgYW4gcnZhbHVlLgorICAgIFNLX1F1YWxpZmljYXRpb25Db252ZXJzaW9uUlZhbHVlLAorCisgICAgLy8vIFxicmllZiBQZXJmb3JtIGEgcXVhbGlmaWNhdGlvbiBjb252ZXJzaW9uLCBwcm9kdWNpbmcgYW4geHZhbHVlLgorICAgIFNLX1F1YWxpZmljYXRpb25Db252ZXJzaW9uWFZhbHVlLAorCisgICAgLy8vIFxicmllZiBQZXJmb3JtIGEgcXVhbGlmaWNhdGlvbiBjb252ZXJzaW9uLCBwcm9kdWNpbmcgYW4gbHZhbHVlLgorICAgIFNLX1F1YWxpZmljYXRpb25Db252ZXJzaW9uTFZhbHVlLAorCisgICAgLy8vIFxicmllZiBQZXJmb3JtIGEgY29udmVyc2lvbiBhZGRpbmcgX0F0b21pYyB0byBhIHR5cGUuCisgICAgU0tfQXRvbWljQ29udmVyc2lvbiwKKworICAgIC8vLyBcYnJpZWYgUGVyZm9ybSBhIGxvYWQgZnJvbSBhIGdsdmFsdWUsIHByb2R1Y2luZyBhbiBydmFsdWUuCisgICAgU0tfTFZhbHVlVG9SVmFsdWUsCisKKyAgICAvLy8gXGJyaWVmIFBlcmZvcm0gYW4gaW1wbGljaXQgY29udmVyc2lvbiBzZXF1ZW5jZS4KKyAgICBTS19Db252ZXJzaW9uU2VxdWVuY2UsCisKKyAgICAvLy8gXGJyaWVmIFBlcmZvcm0gYW4gaW1wbGljaXQgY29udmVyc2lvbiBzZXF1ZW5jZSB3aXRob3V0IG5hcnJvd2luZy4KKyAgICBTS19Db252ZXJzaW9uU2VxdWVuY2VOb05hcnJvd2luZywKKworICAgIC8vLyBcYnJpZWYgUGVyZm9ybSBsaXN0LWluaXRpYWxpemF0aW9uIHdpdGhvdXQgYSBjb25zdHJ1Y3Rvci4KKyAgICBTS19MaXN0SW5pdGlhbGl6YXRpb24sCisKKyAgICAvLy8gXGJyaWVmIFVud3JhcCB0aGUgc2luZ2xlLWVsZW1lbnQgaW5pdGlhbGl6ZXIgbGlzdCBmb3IgYSByZWZlcmVuY2UuCisgICAgU0tfVW53cmFwSW5pdExpc3QsCisKKyAgICAvLy8gXGJyaWVmIFJld3JhcCB0aGUgc2luZ2xlLWVsZW1lbnQgaW5pdGlhbGl6ZXIgbGlzdCBmb3IgYSByZWZlcmVuY2UuCisgICAgU0tfUmV3cmFwSW5pdExpc3QsCisKKyAgICAvLy8gXGJyaWVmIFBlcmZvcm0gaW5pdGlhbGl6YXRpb24gdmlhIGEgY29uc3RydWN0b3IuCisgICAgU0tfQ29uc3RydWN0b3JJbml0aWFsaXphdGlvbiwKKworICAgIC8vLyBcYnJpZWYgUGVyZm9ybSBpbml0aWFsaXphdGlvbiB2aWEgYSBjb25zdHJ1Y3RvciwgdGFraW5nIGFyZ3VtZW50cyBmcm9tCisgICAgLy8vIGEgc2luZ2xlIEluaXRMaXN0RXhwci4KKyAgICBTS19Db25zdHJ1Y3RvckluaXRpYWxpemF0aW9uRnJvbUxpc3QsCisKKyAgICAvLy8gXGJyaWVmIFplcm8taW5pdGlhbGl6ZSB0aGUgb2JqZWN0CisgICAgU0tfWmVyb0luaXRpYWxpemF0aW9uLAorCisgICAgLy8vIFxicmllZiBDIGFzc2lnbm1lbnQKKyAgICBTS19DQXNzaWdubWVudCwKKworICAgIC8vLyBcYnJpZWYgSW5pdGlhbGl6YXRpb24gYnkgc3RyaW5nCisgICAgU0tfU3RyaW5nSW5pdCwKKworICAgIC8vLyBcYnJpZWYgQW4gaW5pdGlhbGl6YXRpb24gdGhhdCAiY29udmVydHMiIGFuIE9iamVjdGl2ZS1DIG9iamVjdAorICAgIC8vLyAobm90IGEgcG9pbnQgdG8gYW4gb2JqZWN0KSB0byBhbm90aGVyIE9iamVjdGl2ZS1DIG9iamVjdCB0eXBlLgorICAgIFNLX09iakNPYmplY3RDb252ZXJzaW9uLAorCisgICAgLy8vIFxicmllZiBBcnJheSBpbmRleGluZyBmb3IgaW5pdGlhbGl6YXRpb24gYnkgZWxlbWVudHdpc2UgY29weS4KKyAgICBTS19BcnJheUxvb3BJbmRleCwKKworICAgIC8vLyBcYnJpZWYgQXJyYXkgaW5pdGlhbGl6YXRpb24gYnkgZWxlbWVudHdpc2UgY29weS4KKyAgICBTS19BcnJheUxvb3BJbml0LAorCisgICAgLy8vIFxicmllZiBBcnJheSBpbml0aWFsaXphdGlvbiAoZnJvbSBhbiBhcnJheSBydmFsdWUpLgorICAgIFNLX0FycmF5SW5pdCwKKworICAgIC8vLyBcYnJpZWYgQXJyYXkgaW5pdGlhbGl6YXRpb24gKGZyb20gYW4gYXJyYXkgcnZhbHVlKSBhcyBhIEdOVSBleHRlbnNpb24uCisgICAgU0tfR05VQXJyYXlJbml0LAorCisgICAgLy8vIFxicmllZiBBcnJheSBpbml0aWFsaXphdGlvbiBmcm9tIGEgcGFyZW50aGVzaXplZCBpbml0aWFsaXplciBsaXN0LgorICAgIC8vLyBUaGlzIGlzIGEgR05VIEMrKyBleHRlbnNpb24uCisgICAgU0tfUGFyZW50aGVzaXplZEFycmF5SW5pdCwKKworICAgIC8vLyBcYnJpZWYgUGFzcyBhbiBvYmplY3QgYnkgaW5kaXJlY3QgY29weS1hbmQtcmVzdG9yZS4KKyAgICBTS19QYXNzQnlJbmRpcmVjdENvcHlSZXN0b3JlLAorCisgICAgLy8vIFxicmllZiBQYXNzIGFuIG9iamVjdCBieSBpbmRpcmVjdCByZXN0b3JlLgorICAgIFNLX1Bhc3NCeUluZGlyZWN0UmVzdG9yZSwKKworICAgIC8vLyBcYnJpZWYgUHJvZHVjZSBhbiBPYmplY3RpdmUtQyBvYmplY3QgcG9pbnRlci4KKyAgICBTS19Qcm9kdWNlT2JqQ09iamVjdCwKKworICAgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgc3RkOjppbml0aWFsaXplcl9saXN0IGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICBTS19TdGRJbml0aWFsaXplckxpc3QsCisKKyAgICAvLy8gXGJyaWVmIFBlcmZvcm0gaW5pdGlhbGl6YXRpb24gdmlhIGEgY29uc3RydWN0b3IgdGFraW5nIGEgc2luZ2xlCisgICAgLy8vIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdCBhcmd1bWVudC4KKyAgICBTS19TdGRJbml0aWFsaXplckxpc3RDb25zdHJ1Y3RvckNhbGwsCisKKyAgICAvLy8gXGJyaWVmIEluaXRpYWxpemUgYW4gT3BlbkNMIHNhbXBsZXIgZnJvbSBhbiBpbnRlZ2VyLgorICAgIFNLX09DTFNhbXBsZXJJbml0LAorCisgICAgLy8vIFxicmllZiBJbml0aWFsaXplIHF1ZXVlX3QgZnJvbSAwLgorICAgIFNLX09DTFplcm9RdWV1ZSwKKworICAgIC8vLyBcYnJpZWYgUGFzc2luZyB6ZXJvIHRvIGEgZnVuY3Rpb24gd2hlcmUgT3BlbkNMIGV2ZW50X3QgaXMgZXhwZWN0ZWQuCisgICAgU0tfT0NMWmVyb0V2ZW50CisgIH07CisgIAorICAvLy8gXGJyaWVmIEEgc2luZ2xlIHN0ZXAgaW4gdGhlIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLgorICBjbGFzcyBTdGVwIHsKKyAgcHVibGljOgorICAgIC8vLyBcYnJpZWYgVGhlIGtpbmQgb2YgY29udmVyc2lvbiBvciBpbml0aWFsaXphdGlvbiBzdGVwIHdlIGFyZSB0YWtpbmcuCisgICAgU3RlcEtpbmQgS2luZDsKKyAgICAKKyAgICAvLyBcYnJpZWYgVGhlIHR5cGUgdGhhdCByZXN1bHRzIGZyb20gdGhpcyBpbml0aWFsaXphdGlvbi4KKyAgICBRdWFsVHlwZSBUeXBlOworCisgICAgc3RydWN0IEYgeworICAgICAgYm9vbCBIYWRNdWx0aXBsZUNhbmRpZGF0ZXM7CisgICAgICBGdW5jdGlvbkRlY2wgKkZ1bmN0aW9uOworICAgICAgRGVjbEFjY2Vzc1BhaXIgRm91bmREZWNsOworICAgIH07CisKKyAgICB1bmlvbiB7CisgICAgICAvLy8gXGJyaWVmIFdoZW4gS2luZCA9PSBTS19SZXNvbHZlZE92ZXJsb2FkZWRGdW5jdGlvbiBvciBLaW5kID09CisgICAgICAvLy8gU0tfVXNlckNvbnZlcnNpb24sIHRoZSBmdW5jdGlvbiB0aGF0IHRoZSBleHByZXNzaW9uIHNob3VsZCBiZSAKKyAgICAgIC8vLyByZXNvbHZlZCB0byBvciB0aGUgY29udmVyc2lvbiBmdW5jdGlvbiB0byBjYWxsLCByZXNwZWN0aXZlbHkuCisgICAgICAvLy8gV2hlbiBLaW5kID09IFNLX0NvbnN0cnVjdG9ySW5pdGlhbGl6YXRpb24gb3IgU0tfTGlzdENvbnN0cnVjdGlvbiwKKyAgICAgIC8vLyB0aGUgY29uc3RydWN0b3IgdG8gYmUgY2FsbGVkLgorICAgICAgLy8vCisgICAgICAvLy8gQWx3YXlzIGEgRnVuY3Rpb25EZWNsLCBwbHVzIGEgQm9vbGVhbiBmbGFnIHRlbGxpbmcgaWYgaXQgd2FzCisgICAgICAvLy8gc2VsZWN0ZWQgZnJvbSBhbiBvdmVybG9hZGVkIHNldCBoYXZpbmcgc2l6ZSBncmVhdGVyIHRoYW4gMS4KKyAgICAgIC8vLyBGb3IgY29udmVyc2lvbiBkZWNscywgdGhlIG5hbWluZyBjbGFzcyBpcyB0aGUgc291cmNlIHR5cGUuCisgICAgICAvLy8gRm9yIGNvbnN0cnVjdCBkZWNscywgdGhlIG5hbWluZyBjbGFzcyBpcyB0aGUgdGFyZ2V0IHR5cGUuCisgICAgICBzdHJ1Y3QgRiBGdW5jdGlvbjsKKworICAgICAgLy8vIFxicmllZiBXaGVuIEtpbmQgPSBTS19Db252ZXJzaW9uU2VxdWVuY2UsIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uCisgICAgICAvLy8gc2VxdWVuY2UuCisgICAgICBJbXBsaWNpdENvbnZlcnNpb25TZXF1ZW5jZSAqSUNTOworCisgICAgICAvLy8gXGJyaWVmIFdoZW4gS2luZCA9IFNLX1Jld3JhcEluaXRMaXN0LCB0aGUgc3ludGFjdGljIGZvcm0gb2YgdGhlCisgICAgICAvLy8gd3JhcHBpbmcgbGlzdC4KKyAgICAgIEluaXRMaXN0RXhwciAqV3JhcHBpbmdTeW50YWN0aWNMaXN0OworICAgIH07CisKKyAgICB2b2lkIERlc3Ryb3koKTsKKyAgfTsKKyAgCitwcml2YXRlOgorICAvLy8gXGJyaWVmIFRoZSBraW5kIG9mIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGNvbXB1dGVkLgorICBlbnVtIFNlcXVlbmNlS2luZCBTZXF1ZW5jZUtpbmQ7CisgIAorICAvLy8gXGJyaWVmIFN0ZXBzIHRha2VuIGJ5IHRoaXMgaW5pdGlhbGl6YXRpb24uCisgIFNtYWxsVmVjdG9yPFN0ZXAsIDQ+IFN0ZXBzOworICAKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBEZXNjcmliZXMgd2h5IGluaXRpYWxpemF0aW9uIGZhaWxlZC4KKyAgZW51bSBGYWlsdXJlS2luZCB7CisgICAgLy8vIFxicmllZiBUb28gbWFueSBpbml0aWFsaXplcnMgcHJvdmlkZWQgZm9yIGEgcmVmZXJlbmNlLgorICAgIEZLX1Rvb01hbnlJbml0c0ZvclJlZmVyZW5jZSwKKworICAgIC8vLyBcYnJpZWYgUmVmZXJlbmNlIGluaXRpYWxpemVkIGZyb20gYSBwYXJlbnRoZXNpemVkIGluaXRpYWxpemVyIGxpc3QuCisgICAgRktfUGFyZW50aGVzaXplZExpc3RJbml0Rm9yUmVmZXJlbmNlLAorCisgICAgLy8vIFxicmllZiBBcnJheSBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICBGS19BcnJheU5lZWRzSW5pdExpc3QsCisKKyAgICAvLy8gXGJyaWVmIEFycmF5IG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhbiBpbml0aWFsaXplciBsaXN0IG9yIGEgCisgICAgLy8vIHN0cmluZyBsaXRlcmFsLgorICAgIEZLX0FycmF5TmVlZHNJbml0TGlzdE9yU3RyaW5nTGl0ZXJhbCwKKworICAgIC8vLyBcYnJpZWYgQXJyYXkgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGFuIGluaXRpYWxpemVyIGxpc3Qgb3IgYQorICAgIC8vLyB3aWRlIHN0cmluZyBsaXRlcmFsLgorICAgIEZLX0FycmF5TmVlZHNJbml0TGlzdE9yV2lkZVN0cmluZ0xpdGVyYWwsCisKKyAgICAvLy8gXGJyaWVmIEluaXRpYWxpemluZyBhIHdpZGUgY2hhciBhcnJheSB3aXRoIG5hcnJvdyBzdHJpbmcgbGl0ZXJhbC4KKyAgICBGS19OYXJyb3dTdHJpbmdJbnRvV2lkZUNoYXJBcnJheSwKKworICAgIC8vLyBcYnJpZWYgSW5pdGlhbGl6aW5nIGNoYXIgYXJyYXkgd2l0aCB3aWRlIHN0cmluZyBsaXRlcmFsLgorICAgIEZLX1dpZGVTdHJpbmdJbnRvQ2hhckFycmF5LAorCisgICAgLy8vIFxicmllZiBJbml0aWFsaXppbmcgd2lkZSBjaGFyIGFycmF5IHdpdGggaW5jb21wYXRpYmxlIHdpZGUgc3RyaW5nCisgICAgLy8vIGxpdGVyYWwuCisgICAgRktfSW5jb21wYXRXaWRlU3RyaW5nSW50b1dpZGVDaGFyLAorCisgICAgLy8vIFxicmllZiBBcnJheSB0eXBlIG1pc21hdGNoLgorICAgIEZLX0FycmF5VHlwZU1pc21hdGNoLAorCisgICAgLy8vIFxicmllZiBOb24tY29uc3RhbnQgYXJyYXkgaW5pdGlhbGl6ZXIKKyAgICBGS19Ob25Db25zdGFudEFycmF5SW5pdCwKKworICAgIC8vLyBcYnJpZWYgQ2Fubm90IHJlc29sdmUgdGhlIGFkZHJlc3Mgb2YgYW4gb3ZlcmxvYWRlZCBmdW5jdGlvbi4KKyAgICBGS19BZGRyZXNzT2ZPdmVybG9hZEZhaWxlZCwKKworICAgIC8vLyBcYnJpZWYgT3ZlcmxvYWRpbmcgZHVlIHRvIHJlZmVyZW5jZSBpbml0aWFsaXphdGlvbiBmYWlsZWQuCisgICAgRktfUmVmZXJlbmNlSW5pdE92ZXJsb2FkRmFpbGVkLAorCisgICAgLy8vIFxicmllZiBOb24tY29uc3QgbHZhbHVlIHJlZmVyZW5jZSBiaW5kaW5nIHRvIGEgdGVtcG9yYXJ5LgorICAgIEZLX05vbkNvbnN0TFZhbHVlUmVmZXJlbmNlQmluZGluZ1RvVGVtcG9yYXJ5LAorCisgICAgLy8vIFxicmllZiBOb24tY29uc3QgbHZhbHVlIHJlZmVyZW5jZSBiaW5kaW5nIHRvIGEgYml0LWZpZWxkLgorICAgIEZLX05vbkNvbnN0TFZhbHVlUmVmZXJlbmNlQmluZGluZ1RvQml0ZmllbGQsCisKKyAgICAvLy8gXGJyaWVmIE5vbi1jb25zdCBsdmFsdWUgcmVmZXJlbmNlIGJpbmRpbmcgdG8gYSB2ZWN0b3IgZWxlbWVudC4KKyAgICBGS19Ob25Db25zdExWYWx1ZVJlZmVyZW5jZUJpbmRpbmdUb1ZlY3RvckVsZW1lbnQsCisKKyAgICAvLy8gXGJyaWVmIE5vbi1jb25zdCBsdmFsdWUgcmVmZXJlbmNlIGJpbmRpbmcgdG8gYW4gbHZhbHVlIG9mIHVucmVsYXRlZAorICAgIC8vLyB0eXBlLgorICAgIEZLX05vbkNvbnN0TFZhbHVlUmVmZXJlbmNlQmluZGluZ1RvVW5yZWxhdGVkLAorCisgICAgLy8vIFxicmllZiBSdmFsdWUgcmVmZXJlbmNlIGJpbmRpbmcgdG8gYW4gbHZhbHVlLgorICAgIEZLX1JWYWx1ZVJlZmVyZW5jZUJpbmRpbmdUb0xWYWx1ZSwKKworICAgIC8vLyBcYnJpZWYgUmVmZXJlbmNlIGJpbmRpbmcgZHJvcHMgcXVhbGlmaWVycy4KKyAgICBGS19SZWZlcmVuY2VJbml0RHJvcHNRdWFsaWZpZXJzLAorCisgICAgLy8vIFxicmllZiBSZWZlcmVuY2UgYmluZGluZyBmYWlsZWQuCisgICAgRktfUmVmZXJlbmNlSW5pdEZhaWxlZCwKKworICAgIC8vLyBcYnJpZWYgSW1wbGljaXQgY29udmVyc2lvbiBmYWlsZWQuCisgICAgRktfQ29udmVyc2lvbkZhaWxlZCwKKworICAgIC8vLyBcYnJpZWYgSW1wbGljaXQgY29udmVyc2lvbiBmYWlsZWQuCisgICAgRktfQ29udmVyc2lvbkZyb21Qcm9wZXJ0eUZhaWxlZCwKKworICAgIC8vLyBcYnJpZWYgVG9vIG1hbnkgaW5pdGlhbGl6ZXJzIGZvciBzY2FsYXIKKyAgICBGS19Ub29NYW55SW5pdHNGb3JTY2FsYXIsCisKKyAgICAvLy8gXGJyaWVmIFNjYWxhciBpbml0aWFsaXplZCBmcm9tIGEgcGFyZW50aGVzaXplZCBpbml0aWFsaXplciBsaXN0LgorICAgIEZLX1BhcmVudGhlc2l6ZWRMaXN0SW5pdEZvclNjYWxhciwKKworICAgIC8vLyBcYnJpZWYgUmVmZXJlbmNlIGluaXRpYWxpemF0aW9uIGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdAorICAgIEZLX1JlZmVyZW5jZUJpbmRpbmdUb0luaXRMaXN0LAorCisgICAgLy8vIFxicmllZiBJbml0aWFsaXphdGlvbiBvZiBzb21lIHVudXNlZCBkZXN0aW5hdGlvbiB0eXBlIHdpdGggYW4KKyAgICAvLy8gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICBGS19Jbml0TGlzdEJhZERlc3RpbmF0aW9uVHlwZSwKKworICAgIC8vLyBcYnJpZWYgT3ZlcmxvYWRpbmcgZm9yIGEgdXNlci1kZWZpbmVkIGNvbnZlcnNpb24gZmFpbGVkLgorICAgIEZLX1VzZXJDb252ZXJzaW9uT3ZlcmxvYWRGYWlsZWQsCisKKyAgICAvLy8gXGJyaWVmIE92ZXJsb2FkaW5nIGZvciBpbml0aWFsaXphdGlvbiBieSBjb25zdHJ1Y3RvciBmYWlsZWQuCisgICAgRktfQ29uc3RydWN0b3JPdmVybG9hZEZhaWxlZCwKKworICAgIC8vLyBcYnJpZWYgT3ZlcmxvYWRpbmcgZm9yIGxpc3QtaW5pdGlhbGl6YXRpb24gYnkgY29uc3RydWN0b3IgZmFpbGVkLgorICAgIEZLX0xpc3RDb25zdHJ1Y3Rvck92ZXJsb2FkRmFpbGVkLAorCisgICAgLy8vIFxicmllZiBEZWZhdWx0LWluaXRpYWxpemF0aW9uIG9mIGEgJ2NvbnN0JyBvYmplY3QuCisgICAgRktfRGVmYXVsdEluaXRPZkNvbnN0LAorCisgICAgLy8vIFxicmllZiBJbml0aWFsaXphdGlvbiBvZiBhbiBpbmNvbXBsZXRlIHR5cGUuCisgICAgRktfSW5jb21wbGV0ZSwKKworICAgIC8vLyBcYnJpZWYgVmFyaWFibGUtbGVuZ3RoIGFycmF5IG11c3Qgbm90IGhhdmUgYW4gaW5pdGlhbGl6ZXIuCisgICAgRktfVmFyaWFibGVMZW5ndGhBcnJheUhhc0luaXRpYWxpemVyLAorCisgICAgLy8vIFxicmllZiBMaXN0IGluaXRpYWxpemF0aW9uIGZhaWxlZCBhdCBzb21lIHBvaW50LgorICAgIEZLX0xpc3RJbml0aWFsaXphdGlvbkZhaWxlZCwKKworICAgIC8vLyBcYnJpZWYgSW5pdGlhbGl6ZXIgaGFzIGEgcGxhY2Vob2xkZXIgdHlwZSB3aGljaCBjYW5ub3QgYmUKKyAgICAvLy8gcmVzb2x2ZWQgYnkgaW5pdGlhbGl6YXRpb24uCisgICAgRktfUGxhY2Vob2xkZXJUeXBlLAorCisgICAgLy8vIFxicmllZiBUcnlpbmcgdG8gdGFrZSB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIHRoYXQgZG9lc24ndCBzdXBwb3J0CisgICAgLy8vIGhhdmluZyBpdHMgYWRkcmVzcyB0YWtlbi4KKyAgICBGS19BZGRyZXNzT2ZVbmFkZHJlc3NhYmxlRnVuY3Rpb24sCisKKyAgICAvLy8gXGJyaWVmIExpc3QtY29weS1pbml0aWFsaXphdGlvbiBjaG9zZSBhbiBleHBsaWNpdCBjb25zdHJ1Y3Rvci4KKyAgICBGS19FeHBsaWNpdENvbnN0cnVjdG9yLAorICB9OworICAKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgVGhlIHJlYXNvbiB3aHkgaW5pdGlhbGl6YXRpb24gZmFpbGVkLgorICBGYWlsdXJlS2luZCBGYWlsdXJlOworCisgIC8vLyBcYnJpZWYgVGhlIGZhaWxlZCByZXN1bHQgb2Ygb3ZlcmxvYWQgcmVzb2x1dGlvbi4KKyAgT3ZlcmxvYWRpbmdSZXN1bHQgRmFpbGVkT3ZlcmxvYWRSZXN1bHQ7CisgIAorICAvLy8gXGJyaWVmIFRoZSBjYW5kaWRhdGUgc2V0IGNyZWF0ZWQgd2hlbiBpbml0aWFsaXphdGlvbiBmYWlsZWQuCisgIE92ZXJsb2FkQ2FuZGlkYXRlU2V0IEZhaWxlZENhbmRpZGF0ZVNldDsKKworICAvLy8gXGJyaWVmIFRoZSBpbmNvbXBsZXRlIHR5cGUgdGhhdCBjYXVzZWQgYSBmYWlsdXJlLgorICBRdWFsVHlwZSBGYWlsZWRJbmNvbXBsZXRlVHlwZTsKKworICAvLy8gXGJyaWVmIFRoZSBmaXhpdCB0aGF0IG5lZWRzIHRvIGJlIGFwcGxpZWQgdG8gbWFrZSB0aGlzIGluaXRpYWxpemF0aW9uCisgIC8vLyBzdWNjZWVkLgorICBzdGQ6OnN0cmluZyBaZXJvSW5pdGlhbGl6YXRpb25GaXhpdDsKKyAgU291cmNlTG9jYXRpb24gWmVyb0luaXRpYWxpemF0aW9uRml4aXRMb2M7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDYWxsIGZvciBpbml0aWFsaXphdGlvbnMgYXJlIGludmFsaWQgYnV0IHRoYXQgd291bGQgYmUgdmFsaWQKKyAgLy8vIHplcm8gaW5pdGlhbHphdGlvbnMgaWYgRml4aXQgd2FzIGFwcGxpZWQuCisgIHZvaWQgU2V0WmVyb0luaXRpYWxpemF0aW9uRml4aXQoY29uc3Qgc3RkOjpzdHJpbmcmIEZpeGl0LCBTb3VyY2VMb2NhdGlvbiBMKSB7CisgICAgWmVyb0luaXRpYWxpemF0aW9uRml4aXQgPSBGaXhpdDsKKyAgICBaZXJvSW5pdGlhbGl6YXRpb25GaXhpdExvYyA9IEw7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBQcmludHMgYSBmb2xsb3ctdXAgbm90ZSB0aGF0IGhpZ2hsaWdodHMgdGhlIGxvY2F0aW9uIG9mCisgIC8vLyB0aGUgaW5pdGlhbGl6ZWQgZW50aXR5LCBpZiBpdCdzIHJlbW90ZS4KKyAgdm9pZCBQcmludEluaXRMb2NhdGlvbk5vdGUoU2VtYSAmUywgY29uc3QgSW5pdGlhbGl6ZWRFbnRpdHkgJkVudGl0eSk7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBUcnkgdG8gcGVyZm9ybSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZ2l2ZW4gZW50aXR5LCBjcmVhdGluZyBhIAorICAvLy8gcmVjb3JkIG9mIHRoZSBzdGVwcyByZXF1aXJlZCB0byBwZXJmb3JtIHRoZSBpbml0aWFsaXphdGlvbi4KKyAgLy8vCisgIC8vLyBUaGUgZ2VuZXJhdGVkIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIHdpbGwgZWl0aGVyIGNvbnRhaW4gZW5vdWdoCisgIC8vLyBpbmZvcm1hdGlvbiB0byBkaWFnbm9zZSAKKyAgLy8vCisgIC8vLyBccGFyYW0gUyB0aGUgc2VtYW50aWMgYW5hbHlzaXMgb2JqZWN0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBFbnRpdHkgdGhlIGVudGl0eSBiZWluZyBpbml0aWFsaXplZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gS2luZCB0aGUga2luZCBvZiBpbml0aWFsaXphdGlvbiBiZWluZyBwZXJmb3JtZWQuCisgIC8vLworICAvLy8gXHBhcmFtIEFyZ3MgdGhlIGFyZ3VtZW50KHMpIHByb3ZpZGVkIGZvciBpbml0aWFsaXphdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gVG9wTGV2ZWxPZkluaXRMaXN0IHRydWUgaWYgd2UgYXJlIGluaXRpYWxpemluZyBmcm9tIGFuIGV4cHJlc3Npb24KKyAgLy8vICAgICAgICBhdCB0aGUgdG9wIGxldmVsIGluc2lkZSBhbiBpbml0aWFsaXplciBsaXN0LiBUaGlzIGRpc2FsbG93cworICAvLy8gICAgICAgIG5hcnJvd2luZyBjb252ZXJzaW9ucyBpbiBDKysxMSBvbndhcmRzLgorICAvLy8gXHBhcmFtIFRyZWF0VW5hdmFpbGFibGVBc0ludmFsaWQgdHJ1ZSBpZiB3ZSB3YW50IHRvIHRyZWF0IHVuYXZhaWxhYmxlCisgIC8vLyAgICAgICAgYXMgaW52YWxpZC4KKyAgSW5pdGlhbGl6YXRpb25TZXF1ZW5jZShTZW1hICZTLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbml0aWFsaXplZEVudGl0eSAmRW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluaXRpYWxpemF0aW9uS2luZCAmS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aUV4cHJBcmcgQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFRvcExldmVsT2ZJbml0TGlzdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVHJlYXRVbmF2YWlsYWJsZUFzSW52YWxpZCA9IHRydWUpOworICB2b2lkIEluaXRpYWxpemVGcm9tKFNlbWEgJlMsIGNvbnN0IEluaXRpYWxpemVkRW50aXR5ICZFbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5pdGlhbGl6YXRpb25LaW5kICZLaW5kLCBNdWx0aUV4cHJBcmcgQXJncywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIFRvcExldmVsT2ZJbml0TGlzdCwgYm9vbCBUcmVhdFVuYXZhaWxhYmxlQXNJbnZhbGlkKTsKKworICB+SW5pdGlhbGl6YXRpb25TZXF1ZW5jZSgpOworICAKKyAgLy8vIFxicmllZiBQZXJmb3JtIHRoZSBhY3R1YWwgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGdpdmVuIGVudGl0eSBiYXNlZCBvbgorICAvLy8gdGhlIGNvbXB1dGVkIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTIHRoZSBzZW1hbnRpYyBhbmFseXNpcyBvYmplY3QuCisgIC8vLworICAvLy8gXHBhcmFtIEVudGl0eSB0aGUgZW50aXR5IGJlaW5nIGluaXRpYWxpemVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBLaW5kIHRoZSBraW5kIG9mIGluaXRpYWxpemF0aW9uIGJlaW5nIHBlcmZvcm1lZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQXJncyB0aGUgYXJndW1lbnQocykgcHJvdmlkZWQgZm9yIGluaXRpYWxpemF0aW9uLCBvd25lcnNoaXAgb2YKKyAgLy8vIHdoaWNoIGlzIHRyYW5zZmVycmVkIGludG8gdGhlIHJvdXRpbmUuCisgIC8vLworICAvLy8gXHBhcmFtIFJlc3VsdFR5cGUgaWYgbm9uLU5VTEwsIHdpbGwgYmUgc2V0IHRvIHRoZSB0eXBlIG9mIHRoZQorICAvLy8gaW5pdGlhbGl6ZWQgb2JqZWN0LCB3aGljaCBpcyB0aGUgdHlwZSBvZiB0aGUgZGVjbGFyYXRpb24gaW4gbW9zdAorICAvLy8gY2FzZXMuIEhvd2V2ZXIsIHdoZW4gdGhlIGluaXRpYWxpemVkIG9iamVjdCBpcyBhIHZhcmlhYmxlIG9mCisgIC8vLyBpbmNvbXBsZXRlIGFycmF5IHR5cGUgYW5kIHRoZSBpbml0aWFsaXplciBpcyBhbiBpbml0aWFsaXplcgorICAvLy8gbGlzdCwgdGhpcyB0eXBlIHdpbGwgYmUgc2V0IHRvIHRoZSBjb21wbGV0ZWQgYXJyYXkgdHlwZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhbiBleHByZXNzaW9uIHRoYXQgcGVyZm9ybXMgdGhlIGFjdHVhbCBvYmplY3QgaW5pdGlhbGl6YXRpb24sIGlmCisgIC8vLyB0aGUgaW5pdGlhbGl6YXRpb24gaXMgd2VsbC1mb3JtZWQuIE90aGVyd2lzZSwgZW1pdHMgZGlhZ25vc3RpY3MKKyAgLy8vIGFuZCByZXR1cm5zIGFuIGludmFsaWQgZXhwcmVzc2lvbi4KKyAgRXhwclJlc3VsdCBQZXJmb3JtKFNlbWEgJlMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbml0aWFsaXplZEVudGl0eSAmRW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5pdGlhbGl6YXRpb25LaW5kICZLaW5kLAorICAgICAgICAgICAgICAgICAgICAgTXVsdGlFeHByQXJnIEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSAqUmVzdWx0VHlwZSA9IG51bGxwdHIpOworICAKKyAgLy8vIFxicmllZiBEaWFnbm9zZSBhbiBwb3RlbnRpYWxseS1pbnZhbGlkIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIHdhcyBpbGwtZm9ybWVkLCAKKyAgLy8vIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBEaWFnbm9zZShTZW1hICZTLCAKKyAgICAgICAgICAgICAgICBjb25zdCBJbml0aWFsaXplZEVudGl0eSAmRW50aXR5LAorICAgICAgICAgICAgICAgIGNvbnN0IEluaXRpYWxpemF0aW9uS2luZCAmS2luZCwKKyAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IEFyZ3MpOworICAKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIGtpbmQgb2YgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgY29tcHV0ZWQuCisgIGVudW0gU2VxdWVuY2VLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBTZXF1ZW5jZUtpbmQ7IH0KKyAgCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBraW5kIG9mIHNlcXVlbmNlIGNvbXB1dGVkLgorICB2b2lkIHNldFNlcXVlbmNlS2luZChlbnVtIFNlcXVlbmNlS2luZCBTSykgeyBTZXF1ZW5jZUtpbmQgPSBTSzsgfQorICAKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgaXMgdmFsaWQuCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAhRmFpbGVkKCk7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBpcyBpbnZhbGlkLgorICBib29sIEZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIFNlcXVlbmNlS2luZCA9PSBGYWlsZWRTZXF1ZW5jZTsgfQorCisgIHVzaW5nIHN0ZXBfaXRlcmF0b3IgPSBTbWFsbFZlY3RvckltcGw8U3RlcD46OmNvbnN0X2l0ZXJhdG9yOworCisgIHN0ZXBfaXRlcmF0b3Igc3RlcF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIFN0ZXBzLmJlZ2luKCk7IH0KKyAgc3RlcF9pdGVyYXRvciBzdGVwX2VuZCgpICAgY29uc3QgeyByZXR1cm4gU3RlcHMuZW5kKCk7IH0KKworICB1c2luZyBzdGVwX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c3RlcF9pdGVyYXRvcj47CisKKyAgc3RlcF9yYW5nZSBzdGVwcygpIGNvbnN0IHsgcmV0dXJuIHtzdGVwX2JlZ2luKCksIHN0ZXBfZW5kKCl9OyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGluaXRpYWxpemF0aW9uIGlzIGEgZGlyZWN0IHJlZmVyZW5jZSAKKyAgLy8vIGJpbmRpbmcgKEMrKyBbZGNsLmluaXQucmVmXSkuCisgIGJvb2wgaXNEaXJlY3RSZWZlcmVuY2VCaW5kaW5nKCkgY29uc3Q7CisgIAorICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgaW5pdGlhbGl6YXRpb24gZmFpbGVkIGR1ZSB0byBhbiBhbWJpZ3VpdHkuCisgIGJvb2wgaXNBbWJpZ3VvdXMoKSBjb25zdDsKKyAgCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpbml0aWFsaXphdGlvbiBpcyBkaXJlY3QgY2FsbCB0byBhIAorICAvLy8gY29uc3RydWN0b3IuCisgIGJvb2wgaXNDb25zdHJ1Y3RvckluaXRpYWxpemF0aW9uKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxhc3Qgc3RlcCBpbiB0aGlzIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGlzIGEKKyAgLy8vIG5hcnJvd2luZyBjb252ZXJzaW9uLCBkZWZpbmVkIGJ5IEMrKzB4IFtkY2wuaW5pdC5saXN0XXA3LgorICAvLy8KKyAgLy8vIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCAqaXNJbml0aWFsaXplckNvbnN0YW50IHdpbGwgYmUgc2V0IHRvCisgIC8vLyBkZXNjcmliZSB3aGV0aGVyICpJbml0aWFsaXplciB3YXMgYSBjb25zdGFudCBleHByZXNzaW9uLiAgSWYKKyAgLy8vICppc0luaXRpYWxpemVyQ29uc3RhbnQgaXMgc2V0IHRvIHRydWUsICpDb25zdGFudFZhbHVlIHdpbGwgYmUgc2V0IHRvIHRoZQorICAvLy8gZXZhbHVhdGVkIHZhbHVlIG9mICpJbml0aWFsaXplci4KKyAgYm9vbCBlbmRzV2l0aE5hcnJvd2luZyhBU1RDb250ZXh0ICZDdHgsIGNvbnN0IEV4cHIgKkluaXRpYWxpemVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmlzSW5pdGlhbGl6ZXJDb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBUFZhbHVlICpDb25zdGFudFZhbHVlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEFkZCBhIG5ldyBzdGVwIGluIHRoZSBpbml0aWFsaXphdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBhZGRyZXNzCisgIC8vLyBvZiBhbiBvdmVybG9hZGVkIGZ1bmN0aW9uIHRvIGEgc3BlY2lmaWMgZnVuY3Rpb24gZGVjbGFyYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIEZ1bmN0aW9uIHRoZSBmdW5jdGlvbiB0byB3aGljaCB0aGUgb3ZlcmxvYWRlZCBmdW5jdGlvbiByZWZlcmVuY2UKKyAgLy8vIHJlc29sdmVzLgorICB2b2lkIEFkZEFkZHJlc3NPdmVybG9hZFJlc29sdXRpb25TdGVwKEZ1bmN0aW9uRGVjbCAqRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbEFjY2Vzc1BhaXIgRm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYWRNdWx0aXBsZUNhbmRpZGF0ZXMpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IHN0ZXAgaW4gdGhlIGluaXRpYWxpemF0aW9uIHRoYXQgcGVyZm9ybXMgYSBkZXJpdmVkLXRvLQorICAvLy8gYmFzZSBjYXN0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBCYXNlVHlwZSB0aGUgYmFzZSB0eXBlIHRvIHdoaWNoIHdlIHdpbGwgYmUgY2FzdGluZy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ2F0ZWdvcnkgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlc3VsdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4KKyAgLy8vIHJ2YWx1ZSwgYW4geHZhbHVlLCBvciBhbiBsdmFsdWUuCisgIHZvaWQgQWRkRGVyaXZlZFRvQmFzZUNhc3RTdGVwKFF1YWxUeXBlIEJhc2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByVmFsdWVLaW5kIENhdGVnb3J5KTsKKyAgICAgCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IHN0ZXAgYmluZGluZyBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3QuCisgIC8vLworICAvLy8gXHBhcmFtIEJpbmRpbmdUZW1wb3JhcnkgVHJ1ZSBpZiB3ZSBhcmUgYmluZGluZyBhIHJlZmVyZW5jZSB0byBhIHRlbXBvcmFyeQorICAvLy8gb2JqZWN0ICh0aGVyZWJ5IGV4dGVuZGluZyBpdHMgbGlmZXRpbWUpOyBmYWxzZSBpZiB3ZSBhcmUgYmluZGluZyB0byBhbgorICAvLy8gbHZhbHVlIG9yIGFuIGx2YWx1ZSB0cmVhdGVkIGFzIGFuIHJ2YWx1ZS4KKyAgdm9pZCBBZGRSZWZlcmVuY2VCaW5kaW5nU3RlcChRdWFsVHlwZSBULCBib29sIEJpbmRpbmdUZW1wb3JhcnkpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IHN0ZXAgdGhhdCBtYWtlcyBhbiBleHRyYW5lb3VzIGNvcHkgb2YgdGhlIGlucHV0CisgIC8vLyB0byBhIHRlbXBvcmFyeSBvZiB0aGUgc2FtZSBjbGFzcyB0eXBlLgorICAvLy8KKyAgLy8vIFRoaXMgZXh0cmFuZW91cyBjb3B5IG9ubHkgb2NjdXJzIGR1cmluZyByZWZlcmVuY2UgYmluZGluZyBpbgorICAvLy8gQysrOTgvMDMsIHdoZXJlIHdlIGFyZSBwZXJtaXR0ZWQgKGJ1dCBub3QgcmVxdWlyZWQpIHRvIGludHJvZHVjZQorICAvLy8gYW4gZXh0cmEgY29weS4gQXQgYSBiYXJlIG1pbmltdW0sIHdlIG11c3QgY2hlY2sgdGhhdCB3ZSBjb3VsZAorICAvLy8gY2FsbCB0aGUgY29weSBjb25zdHJ1Y3RvciwgYW5kIHByb2R1Y2UgYSBkaWFnbm9zdGljIGlmIHRoZSBjb3B5CisgIC8vLyBjb25zdHJ1Y3RvciBpcyBpbmFjY2Vzc2libGUgb3Igbm8gY29weSBjb25zdHJ1Y3RvciBtYXRjaGVzLgorICAvLworICAvLy8gXHBhcmFtIFQgVGhlIHR5cGUgb2YgdGhlIHRlbXBvcmFyeSBiZWluZyBjcmVhdGVkLgorICB2b2lkIEFkZEV4dHJhbmVvdXNDb3B5VG9UZW1wb3JhcnkoUXVhbFR5cGUgVCk7CisKKyAgLy8vIFxicmllZiBBZGQgYSBuZXcgc3RlcCB0aGF0IG1ha2VzIGEgY29weSBvZiB0aGUgaW5wdXQgdG8gYW4gb2JqZWN0IG9mCisgIC8vLyB0aGUgZ2l2ZW4gdHlwZSwgYXMgdGhlIGZpbmFsIHN0ZXAgaW4gY2xhc3MgY29weS1pbml0aWFsaXphdGlvbi4KKyAgdm9pZCBBZGRGaW5hbENvcHkoUXVhbFR5cGUgVCk7CisKKyAgLy8vIFxicmllZiBBZGQgYSBuZXcgc3RlcCBpbnZva2luZyBhIGNvbnZlcnNpb24gZnVuY3Rpb24sIHdoaWNoIGlzIGVpdGhlcgorICAvLy8gYSBjb25zdHJ1Y3RvciBvciBhIGNvbnZlcnNpb24gZnVuY3Rpb24uCisgIHZvaWQgQWRkVXNlckNvbnZlcnNpb25TdGVwKEZ1bmN0aW9uRGVjbCAqRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xBY2Nlc3NQYWlyIEZvdW5kRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYWRNdWx0aXBsZUNhbmRpZGF0ZXMpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IHN0ZXAgdGhhdCBwZXJmb3JtcyBhIHF1YWxpZmljYXRpb24gY29udmVyc2lvbiB0byB0aGUKKyAgLy8vIGdpdmVuIHR5cGUuCisgIHZvaWQgQWRkUXVhbGlmaWNhdGlvbkNvbnZlcnNpb25TdGVwKFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJWYWx1ZUtpbmQgQ2F0ZWdvcnkpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IHN0ZXAgdGhhdCBwZXJmb3JtcyBjb252ZXJzaW9uIGZyb20gbm9uLWF0b21pYyB0byBhdG9taWMKKyAgLy8vIHR5cGUuCisgIHZvaWQgQWRkQXRvbWljQ29udmVyc2lvblN0ZXAoUXVhbFR5cGUgVHkpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IHN0ZXAgdGhhdCBwZXJmb3JtcyBhIGxvYWQgb2YgdGhlIGdpdmVuIHR5cGUuCisgIC8vLworICAvLy8gQWx0aG91Z2ggdGhlIHRlcm0gIkxWYWx1ZVRvUlZhbHVlIiBpcyBjb252ZW50aW9uYWwsIHRoaXMgYXBwbGllcyB0byBib3RoCisgIC8vLyBsdmFsdWVzIGFuZCB4dmFsdWVzLgorICB2b2lkIEFkZExWYWx1ZVRvUlZhbHVlU3RlcChRdWFsVHlwZSBUeSk7CisKKyAgLy8vIFxicmllZiBBZGQgYSBuZXcgc3RlcCB0aGF0IGFwcGxpZXMgYW4gaW1wbGljaXQgY29udmVyc2lvbiBzZXF1ZW5jZS4KKyAgdm9pZCBBZGRDb252ZXJzaW9uU2VxdWVuY2VTdGVwKGNvbnN0IEltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlICZJQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULCBib29sIFRvcExldmVsT2ZJbml0TGlzdCA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIEFkZCBhIGxpc3QtaW5pdGlhbGl6YXRpb24gc3RlcC4KKyAgdm9pZCBBZGRMaXN0SW5pdGlhbGl6YXRpb25TdGVwKFF1YWxUeXBlIFQpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgY29uc3RydWN0b3ItaW5pdGlhbGl6YXRpb24gc3RlcC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRnJvbUluaXRMaXN0IFRoZSBjb25zdHJ1Y3RvciBjYWxsIGlzIHN5bnRhY3RpY2FsbHkgYW4gaW5pdGlhbGl6ZXIKKyAgLy8vIGxpc3QuCisgIC8vLyBccGFyYW0gQXNJbml0TGlzdCBUaGUgY29uc3RydWN0b3IgaXMgY2FsbGVkIGFzIGFuIGluaXQgbGlzdCBjb25zdHJ1Y3Rvci4KKyAgdm9pZCBBZGRDb25zdHJ1Y3RvckluaXRpYWxpemF0aW9uU3RlcChEZWNsQWNjZXNzUGFpciBGb3VuZERlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ29uc3RydWN0b3JEZWNsICpDb25zdHJ1Y3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFkTXVsdGlwbGVDYW5kaWRhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRnJvbUluaXRMaXN0LCBib29sIEFzSW5pdExpc3QpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgemVyby1pbml0aWFsaXphdGlvbiBzdGVwLgorICB2b2lkIEFkZFplcm9Jbml0aWFsaXphdGlvblN0ZXAoUXVhbFR5cGUgVCk7CisKKyAgLy8vIFxicmllZiBBZGQgYSBDIGFzc2lnbm1lbnQgc3RlcC4KKyAgLy8KKyAgLy8gRklYTUU6IEl0IGlzbid0IGNsZWFyIHdoZXRoZXIgdGhpcyBzaG91bGQgZXZlciBiZSBuZWVkZWQ7CisgIC8vIGlkZWFsbHksIHdlIHdvdWxkIGhhbmRsZSBldmVyeXRoaW5nIG5lZWRlZCBpbiBDIGluIHRoZSBjb21tb24KKyAgLy8gcGF0aC4gSG93ZXZlciwgdGhhdCBpc24ndCB0aGUgY2FzZSB5ZXQuCisgIHZvaWQgQWRkQ0Fzc2lnbm1lbnRTdGVwKFF1YWxUeXBlIFQpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgc3RyaW5nIGluaXQgc3RlcC4KKyAgdm9pZCBBZGRTdHJpbmdJbml0U3RlcChRdWFsVHlwZSBUKTsKKworICAvLy8gXGJyaWVmIEFkZCBhbiBPYmplY3RpdmUtQyBvYmplY3QgY29udmVyc2lvbiBzdGVwLCB3aGljaCBpcworICAvLy8gYWx3YXlzIGEgbm8tb3AuCisgIHZvaWQgQWRkT2JqQ09iamVjdENvbnZlcnNpb25TdGVwKFF1YWxUeXBlIFQpOworCisgIC8vLyBcYnJpZWYgQWRkIGFuIGFycmF5IGluaXRpYWxpemF0aW9uIGxvb3Agc3RlcC4KKyAgdm9pZCBBZGRBcnJheUluaXRMb29wU3RlcChRdWFsVHlwZSBULCBRdWFsVHlwZSBFbHRUeSk7CisKKyAgLy8vIFxicmllZiBBZGQgYW4gYXJyYXkgaW5pdGlhbGl6YXRpb24gc3RlcC4KKyAgdm9pZCBBZGRBcnJheUluaXRTdGVwKFF1YWxUeXBlIFQsIGJvb2wgSXNHTlVFeHRlbnNpb24pOworCisgIC8vLyBcYnJpZWYgQWRkIGEgcGFyZW50aGVzaXplZCBhcnJheSBpbml0aWFsaXphdGlvbiBzdGVwLgorICB2b2lkIEFkZFBhcmVudGhlc2l6ZWRBcnJheUluaXRTdGVwKFF1YWxUeXBlIFQpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgc3RlcCB0byBwYXNzIGFuIG9iamVjdCBieSBpbmRpcmVjdCBjb3B5LXJlc3RvcmUuCisgIHZvaWQgQWRkUGFzc0J5SW5kaXJlY3RDb3B5UmVzdG9yZVN0ZXAoUXVhbFR5cGUgVCwgYm9vbCBzaG91bGRDb3B5KTsKKworICAvLy8gXGJyaWVmIEFkZCBhIHN0ZXAgdG8gInByb2R1Y2UiIGFuIE9iamVjdGl2ZS1DIG9iamVjdCAoYnkKKyAgLy8vIHJldGFpbmluZyBpdCkuCisgIHZvaWQgQWRkUHJvZHVjZU9iakNPYmplY3RTdGVwKFF1YWxUeXBlIFQpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgc3RlcCB0byBjb25zdHJ1Y3QgYSBzdGQ6OmluaXRpYWxpemVyX2xpc3Qgb2JqZWN0IGZyb20gYW4KKyAgLy8vIGluaXRpYWxpemVyIGxpc3QuCisgIHZvaWQgQWRkU3RkSW5pdGlhbGl6ZXJMaXN0Q29uc3RydWN0aW9uU3RlcChRdWFsVHlwZSBUKTsKKworICAvLy8gXGJyaWVmIEFkZCBhIHN0ZXAgdG8gaW5pdGlhbGl6ZSBhbiBPcGVuQ0wgc2FtcGxlciBmcm9tIGFuIGludGVnZXIKKyAgLy8vIGNvbnN0YW50LgorICB2b2lkIEFkZE9DTFNhbXBsZXJJbml0U3RlcChRdWFsVHlwZSBUKTsKKworICAvLy8gXGJyaWVmIEFkZCBhIHN0ZXAgdG8gaW5pdGlhbGl6ZSBhbiBPcGVuQ0wgZXZlbnRfdCBmcm9tIGEgTlVMTAorICAvLy8gY29uc3RhbnQuCisgIHZvaWQgQWRkT0NMWmVyb0V2ZW50U3RlcChRdWFsVHlwZSBUKTsKKworICAvLy8gXGJyaWVmIEFkZCBhIHN0ZXAgdG8gaW5pdGlhbGl6ZSBhbiBPcGVuQ0wgcXVldWVfdCBmcm9tIDAuCisgIHZvaWQgQWRkT0NMWmVyb1F1ZXVlU3RlcChRdWFsVHlwZSBUKTsKKworICAvLy8gXGJyaWVmIEFkZCBzdGVwcyB0byB1bndyYXAgYSBpbml0aWFsaXplciBsaXN0IGZvciBhIHJlZmVyZW5jZSBhcm91bmQgYQorICAvLy8gc2luZ2xlIGVsZW1lbnQgYW5kIHJld3JhcCBpdCBhdCB0aGUgZW5kLgorICB2b2lkIFJld3JhcFJlZmVyZW5jZUluaXRMaXN0KFF1YWxUeXBlIFQsIEluaXRMaXN0RXhwciAqU3ludGFjdGljKTsKKworICAvLy8gXGJyaWVmIE5vdGUgdGhhdCB0aGlzIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGZhaWxlZC4KKyAgdm9pZCBTZXRGYWlsZWQoRmFpbHVyZUtpbmQgRmFpbHVyZSkgeworICAgIFNlcXVlbmNlS2luZCA9IEZhaWxlZFNlcXVlbmNlOworICAgIHRoaXMtPkZhaWx1cmUgPSBGYWlsdXJlOworICAgIGFzc2VydCgoRmFpbHVyZSAhPSBGS19JbmNvbXBsZXRlIHx8ICFGYWlsZWRJbmNvbXBsZXRlVHlwZS5pc051bGwoKSkgJiYKKyAgICAgICAgICAgIkluY29tcGxldGUgdHlwZSBmYWlsdXJlIHJlcXVpcmVzIGEgdHlwZSEiKTsKKyAgfQorICAKKyAgLy8vIFxicmllZiBOb3RlIHRoYXQgdGhpcyBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBmYWlsZWQgZHVlIHRvIGZhaWxlZAorICAvLy8gb3ZlcmxvYWQgcmVzb2x1dGlvbi4KKyAgdm9pZCBTZXRPdmVybG9hZEZhaWx1cmUoRmFpbHVyZUtpbmQgRmFpbHVyZSwgT3ZlcmxvYWRpbmdSZXN1bHQgUmVzdWx0KTsKKyAgCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYSByZWZlcmVuY2UgdG8gdGhlIGNhbmRpZGF0ZSBzZXQgd2hlbiBvdmVybG9hZAorICAvLy8gcmVzb2x1dGlvbiBmYWlscy4KKyAgT3ZlcmxvYWRDYW5kaWRhdGVTZXQgJmdldEZhaWxlZENhbmRpZGF0ZVNldCgpIHsKKyAgICByZXR1cm4gRmFpbGVkQ2FuZGlkYXRlU2V0OworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG92ZXJsb2FkaW5nIHJlc3VsdCwgZm9yIHdoZW4gdGhlIGluaXRpYWxpemF0aW9uCisgIC8vLyBzZXF1ZW5jZSBmYWlsZWQgZHVlIHRvIGEgYmFkIG92ZXJsb2FkLgorICBPdmVybG9hZGluZ1Jlc3VsdCBnZXRGYWlsZWRPdmVybG9hZFJlc3VsdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRmFpbGVkT3ZlcmxvYWRSZXN1bHQ7CisgIH0KKworICAvLy8gXGJyaWVmIE5vdGUgdGhhdCB0aGlzIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGZhaWxlZCBkdWUgdG8gYW4KKyAgLy8vIGluY29tcGxldGUgdHlwZS4KKyAgdm9pZCBzZXRJbmNvbXBsZXRlVHlwZUZhaWx1cmUoUXVhbFR5cGUgSW5jb21wbGV0ZVR5cGUpIHsKKyAgICBGYWlsZWRJbmNvbXBsZXRlVHlwZSA9IEluY29tcGxldGVUeXBlOworICAgIFNldEZhaWxlZChGS19JbmNvbXBsZXRlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoeSBpbml0aWFsaXphdGlvbiBmYWlsZWQuCisgIEZhaWx1cmVLaW5kIGdldEZhaWx1cmVLaW5kKCkgY29uc3QgeworICAgIGFzc2VydChGYWlsZWQoKSAmJiAiTm90IGFuIGluaXRpYWxpemF0aW9uIGZhaWx1cmUhIik7CisgICAgcmV0dXJuIEZhaWx1cmU7CisgIH0KKworICAvLy8gXGJyaWVmIER1bXAgYSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIHRvIAorICAvLy8gdGhlIGdpdmVuIHN0cmVhbSwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIAorICAvLy8gXGJyaWVmIER1bXAgYSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIHRvIAorICAvLy8gc3RhbmRhcmQgZXJyb3IsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKyAgCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19TRU1BX0lOSVRJQUxJWkFUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvTG9va3VwLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0xvb2t1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNTFiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0xvb2t1cC5oCkBAIC0wLDAgKzEsODExIEBACisvLz09PS0gTG9va3VwLmggLSBDbGFzc2VzIGZvciBuYW1lIGxvb2t1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBMb29rdXBSZXN1bHQgY2xhc3MsIHdoaWNoIGlzIGludGVncmFsIHRvCisvLyBTZW1hJ3MgbmFtZS1sb29rdXAgc3Vic3lzdGVtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TRU1BX0xPT0tVUF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU0VNQV9MT09LVVBfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2wuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbEJhc2UuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbENYWC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsYXJhdGlvbk5hbWUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9VbnJlc29sdmVkU2V0LmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xhbmdPcHRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9TcGVjaWZpZXJzLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9TZW1hLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTWFwVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQ1hYQmFzZVBhdGhzOworCisvLy8gQGJyaWVmIFJlcHJlc2VudHMgdGhlIHJlc3VsdHMgb2YgbmFtZSBsb29rdXAuCisvLy8KKy8vLyBBbiBpbnN0YW5jZSBvZiB0aGUgTG9va3VwUmVzdWx0IGNsYXNzIGNhcHR1cmVzIHRoZSByZXN1bHRzIG9mIGEKKy8vLyBzaW5nbGUgbmFtZSBsb29rdXAsIHdoaWNoIGNhbiByZXR1cm4gbm8gcmVzdWx0IChub3RoaW5nIGZvdW5kKSwKKy8vLyBhIHNpbmdsZSBkZWNsYXJhdGlvbiwgYSBzZXQgb2Ygb3ZlcmxvYWRlZCBmdW5jdGlvbnMsIG9yIGFuCisvLy8gYW1iaWd1aXR5LiBVc2UgdGhlIGdldEtpbmQoKSBtZXRob2QgdG8gZGV0ZXJtaW5lIHdoaWNoIG9mIHRoZXNlCisvLy8gcmVzdWx0cyBvY2N1cnJlZCBmb3IgYSBnaXZlbiBsb29rdXAuCitjbGFzcyBMb29rdXBSZXN1bHQgeworcHVibGljOgorICBlbnVtIExvb2t1cFJlc3VsdEtpbmQgeworICAgIC8vLyBAYnJpZWYgTm8gZW50aXR5IGZvdW5kIG1ldCB0aGUgY3JpdGVyaWEuCisgICAgTm90Rm91bmQgPSAwLAorCisgICAgLy8vIEBicmllZiBObyBlbnRpdHkgZm91bmQgbWV0IHRoZSBjcml0ZXJpYSB3aXRoaW4gdGhlIGN1cnJlbnQgCisgICAgLy8vIGluc3RhbnRpYXRpb24sLCBidXQgdGhlcmUgd2VyZSBkZXBlbmRlbnQgYmFzZSBjbGFzc2VzIG9mIHRoZSAKKyAgICAvLy8gY3VycmVudCBpbnN0YW50aWF0aW9uIHRoYXQgY291bGQgbm90IGJlIHNlYXJjaGVkLgorICAgIE5vdEZvdW5kSW5DdXJyZW50SW5zdGFudGlhdGlvbiwKKyAgICAKKyAgICAvLy8gQGJyaWVmIE5hbWUgbG9va3VwIGZvdW5kIGEgc2luZ2xlIGRlY2xhcmF0aW9uIHRoYXQgbWV0IHRoZQorICAgIC8vLyBjcml0ZXJpYS4gIGdldEZvdW5kRGVjbCgpIHdpbGwgcmV0dXJuIHRoaXMgZGVjbGFyYXRpb24uCisgICAgRm91bmQsCisKKyAgICAvLy8gQGJyaWVmIE5hbWUgbG9va3VwIGZvdW5kIGEgc2V0IG9mIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHRoYXQKKyAgICAvLy8gbWV0IHRoZSBjcml0ZXJpYS4KKyAgICBGb3VuZE92ZXJsb2FkZWQsCisKKyAgICAvLy8gQGJyaWVmIE5hbWUgbG9va3VwIGZvdW5kIGFuIHVucmVzb2x2YWJsZSB2YWx1ZSBkZWNsYXJhdGlvbgorICAgIC8vLyBhbmQgY2Fubm90IHlldCBjb21wbGV0ZS4gIFRoaXMgb25seSBoYXBwZW5zIGluIEMrKyBkZXBlbmRlbnQKKyAgICAvLy8gY29udGV4dHMgd2l0aCBkZXBlbmRlbnQgdXNpbmcgZGVjbGFyYXRpb25zLgorICAgIEZvdW5kVW5yZXNvbHZlZFZhbHVlLAorCisgICAgLy8vIEBicmllZiBOYW1lIGxvb2t1cCByZXN1bHRzIGluIGFuIGFtYmlndWl0eTsgdXNlCisgICAgLy8vIGdldEFtYmlndWl0eUtpbmQgdG8gZmlndXJlIG91dCB3aGF0IGtpbmQgb2YgYW1iaWd1aXR5CisgICAgLy8vIHdlIGhhdmUuCisgICAgQW1iaWd1b3VzCisgIH07CisKKyAgZW51bSBBbWJpZ3VpdHlLaW5kIHsKKyAgICAvLy8gTmFtZSBsb29rdXAgcmVzdWx0cyBpbiBhbiBhbWJpZ3VpdHkgYmVjYXVzZSBtdWx0aXBsZQorICAgIC8vLyBlbnRpdGllcyB0aGF0IG1lZXQgdGhlIGxvb2t1cCBjcml0ZXJpYSB3ZXJlIGZvdW5kIGluCisgICAgLy8vIHN1Ym9iamVjdHMgb2YgZGlmZmVyZW50IHR5cGVzLiBGb3IgZXhhbXBsZToKKyAgICAvLy8gQGNvZGUKKyAgICAvLy8gc3RydWN0IEEgeyB2b2lkIGYoaW50KTsgfQorICAgIC8vLyBzdHJ1Y3QgQiB7IHZvaWQgZihkb3VibGUpOyB9CisgICAgLy8vIHN0cnVjdCBDIDogQSwgQiB7IH07CisgICAgLy8vIHZvaWQgdGVzdChDIGMpIHsKKyAgICAvLy8gICBjLmYoMCk7IC8vIGVycm9yOiBBOjpmIGFuZCBCOjpmIGNvbWUgZnJvbSBzdWJvYmplY3RzIG9mIGRpZmZlcmVudAorICAgIC8vLyAgICAgICAgICAgLy8gdHlwZXMuIG92ZXJsb2FkIHJlc29sdXRpb24gaXMgbm90IHBlcmZvcm1lZC4KKyAgICAvLy8gfQorICAgIC8vLyBAZW5kY29kZQorICAgIEFtYmlndW91c0Jhc2VTdWJvYmplY3RUeXBlcywKKworICAgIC8vLyBOYW1lIGxvb2t1cCByZXN1bHRzIGluIGFuIGFtYmlndWl0eSBiZWNhdXNlIG11bHRpcGxlCisgICAgLy8vIG5vbnN0YXRpYyBlbnRpdGllcyB0aGF0IG1lZXQgdGhlIGxvb2t1cCBjcml0ZXJpYSB3ZXJlIGZvdW5kCisgICAgLy8vIGluIGRpZmZlcmVudCBzdWJvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUuIEZvciBleGFtcGxlOgorICAgIC8vLyBAY29kZQorICAgIC8vLyBzdHJ1Y3QgQSB7IGludCB4OyB9OworICAgIC8vLyBzdHJ1Y3QgQiA6IEEgeyB9OworICAgIC8vLyBzdHJ1Y3QgQyA6IEEgeyB9OworICAgIC8vLyBzdHJ1Y3QgRCA6IEIsIEMgeyB9OworICAgIC8vLyBpbnQgdGVzdChEIGQpIHsKKyAgICAvLy8gICByZXR1cm4gZC54OyAvLyBlcnJvcjogJ3gnIGlzIGZvdW5kIGluIHR3byBBIHN1Ym9iamVjdHMgKG9mIEIgYW5kIEMpCisgICAgLy8vIH0KKyAgICAvLy8gQGVuZGNvZGUKKyAgICBBbWJpZ3VvdXNCYXNlU3Vib2JqZWN0cywKKworICAgIC8vLyBOYW1lIGxvb2t1cCByZXN1bHRzIGluIGFuIGFtYmlndWl0eSBiZWNhdXNlIG11bHRpcGxlIGRlZmluaXRpb25zCisgICAgLy8vIG9mIGVudGl0eSB0aGF0IG1lZXQgdGhlIGxvb2t1cCBjcml0ZXJpYSB3ZXJlIGZvdW5kIGluIGRpZmZlcmVudAorICAgIC8vLyBkZWNsYXJhdGlvbiBjb250ZXh0cy4KKyAgICAvLy8gQGNvZGUKKyAgICAvLy8gbmFtZXNwYWNlIEEgeworICAgIC8vLyAgIGludCBpOworICAgIC8vLyAgIG5hbWVzcGFjZSBCIHsgaW50IGk7IH0KKyAgICAvLy8gICBpbnQgdGVzdCgpIHsKKyAgICAvLy8gICAgIHVzaW5nIG5hbWVzcGFjZSBCOworICAgIC8vLyAgICAgcmV0dXJuIGk7IC8vIGVycm9yICdpJyBpcyBmb3VuZCBpbiBuYW1lc3BhY2UgQSBhbmQgQTo6QgorICAgIC8vLyAgICB9CisgICAgLy8vIH0KKyAgICAvLy8gQGVuZGNvZGUKKyAgICBBbWJpZ3VvdXNSZWZlcmVuY2UsCisKKyAgICAvLy8gTmFtZSBsb29rdXAgcmVzdWx0cyBpbiBhbiBhbWJpZ3VpdHkgYmVjYXVzZSBhbiBlbnRpdHkgd2l0aCBhCisgICAgLy8vIHRhZyBuYW1lIHdhcyBoaWRkZW4gYnkgYW4gZW50aXR5IHdpdGggYW4gb3JkaW5hcnkgbmFtZSBmcm9tCisgICAgLy8vIGEgZGlmZmVyZW50IGNvbnRleHQuCisgICAgLy8vIEBjb2RlCisgICAgLy8vIG5hbWVzcGFjZSBBIHsgc3RydWN0IEZvbyB7fTsgfQorICAgIC8vLyBuYW1lc3BhY2UgQiB7IHZvaWQgRm9vKCk7IH0KKyAgICAvLy8gbmFtZXNwYWNlIEMgeworICAgIC8vLyAgIHVzaW5nIG5hbWVzcGFjZSBBOworICAgIC8vLyAgIHVzaW5nIG5hbWVzcGFjZSBCOworICAgIC8vLyB9CisgICAgLy8vIHZvaWQgdGVzdCgpIHsKKyAgICAvLy8gICBDOjpGb28oKTsgLy8gZXJyb3I6IHRhZyAnQTo6Rm9vJyBpcyBoaWRkZW4gYnkgYW4gb2JqZWN0IGluIGEKKyAgICAvLy8gICAgICAgICAgICAgLy8gZGlmZmVyZW50IG5hbWVzcGFjZQorICAgIC8vLyB9CisgICAgLy8vIEBlbmRjb2RlCisgICAgQW1iaWd1b3VzVGFnSGlkaW5nCisgIH07CisKKyAgLy8vIEEgbGl0dGxlIGlkZW50aWZpZXIgZm9yIGZsYWdnaW5nIHRlbXBvcmFyeSBsb29rdXAgcmVzdWx0cy4KKyAgZW51bSBUZW1wb3JhcnlUb2tlbiB7CisgICAgVGVtcG9yYXJ5CisgIH07CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBVbnJlc29sdmVkU2V0SW1wbDo6aXRlcmF0b3I7CisKKyAgTG9va3VwUmVzdWx0KFNlbWEgJlNlbWFSZWYsIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAorICAgICAgICAgICAgICAgU2VtYTo6TG9va3VwTmFtZUtpbmQgTG9va3VwS2luZCwKKyAgICAgICAgICAgICAgIFNlbWE6OlJlZGVjbGFyYXRpb25LaW5kIFJlZGVjbCA9IFNlbWE6Ok5vdEZvclJlZGVjbGFyYXRpb24pCisgICAgICA6IFNlbWFQdHIoJlNlbWFSZWYpLCBOYW1lSW5mbyhOYW1lSW5mbyksIExvb2t1cEtpbmQoTG9va3VwS2luZCksCisgICAgICAgIFJlZGVjbChSZWRlY2wgIT0gU2VtYTo6Tm90Rm9yUmVkZWNsYXJhdGlvbiksCisgICAgICAgIEV4dGVybmFsUmVkZWNsKFJlZGVjbCA9PSBTZW1hOjpGb3JFeHRlcm5hbFJlZGVjbGFyYXRpb24pLAorICAgICAgICBEaWFnbm9zZShSZWRlY2wgPT0gU2VtYTo6Tm90Rm9yUmVkZWNsYXJhdGlvbikgeworICAgIGNvbmZpZ3VyZSgpOworICB9CisKKyAgLy8gVE9ETzogY29uc2lkZXIgd2hldGhlciB0aGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSByZXN0cmljdGVkIHRvIHRha2UKKyAgLy8gYXMgaW5wdXQgYSBjb25zdCBJZGVudGlmaWVySW5mbyogKGluc3RlYWQgb2YgTmFtZSksCisgIC8vIGZvcmNpbmcgb3RoZXIgY2FzZXMgdG93YXJkcyB0aGUgY29uc3RydWN0b3IgdGFraW5nIGEgRE5JbmZvLgorICBMb29rdXBSZXN1bHQoU2VtYSAmU2VtYVJlZiwgRGVjbGFyYXRpb25OYW1lIE5hbWUsCisgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBOYW1lTG9jLCBTZW1hOjpMb29rdXBOYW1lS2luZCBMb29rdXBLaW5kLAorICAgICAgICAgICAgICAgU2VtYTo6UmVkZWNsYXJhdGlvbktpbmQgUmVkZWNsID0gU2VtYTo6Tm90Rm9yUmVkZWNsYXJhdGlvbikKKyAgICAgIDogU2VtYVB0cigmU2VtYVJlZiksIE5hbWVJbmZvKE5hbWUsIE5hbWVMb2MpLCBMb29rdXBLaW5kKExvb2t1cEtpbmQpLAorICAgICAgICBSZWRlY2woUmVkZWNsICE9IFNlbWE6Ok5vdEZvclJlZGVjbGFyYXRpb24pLAorICAgICAgICBFeHRlcm5hbFJlZGVjbChSZWRlY2wgPT0gU2VtYTo6Rm9yRXh0ZXJuYWxSZWRlY2xhcmF0aW9uKSwKKyAgICAgICAgRGlhZ25vc2UoUmVkZWNsID09IFNlbWE6Ok5vdEZvclJlZGVjbGFyYXRpb24pIHsKKyAgICBjb25maWd1cmUoKTsKKyAgfQorCisgIC8vLyBDcmVhdGVzIGEgdGVtcG9yYXJ5IGxvb2t1cCByZXN1bHQsIGluaXRpYWxpemluZyBpdHMgY29yZSBkYXRhCisgIC8vLyB1c2luZyB0aGUgaW5mb3JtYXRpb24gZnJvbSBhbm90aGVyIHJlc3VsdC4gIERpYWdub3N0aWNzIGFyZSBhbHdheXMKKyAgLy8vIGRpc2FibGVkLgorICBMb29rdXBSZXN1bHQoVGVtcG9yYXJ5VG9rZW4gXywgY29uc3QgTG9va3VwUmVzdWx0ICZPdGhlcikKKyAgICAgIDogU2VtYVB0cihPdGhlci5TZW1hUHRyKSwgTmFtZUluZm8oT3RoZXIuTmFtZUluZm8pLAorICAgICAgICBMb29rdXBLaW5kKE90aGVyLkxvb2t1cEtpbmQpLCBJRE5TKE90aGVyLklETlMpLCBSZWRlY2woT3RoZXIuUmVkZWNsKSwKKyAgICAgICAgRXh0ZXJuYWxSZWRlY2woT3RoZXIuRXh0ZXJuYWxSZWRlY2wpLCBIaWRlVGFncyhPdGhlci5IaWRlVGFncyksCisgICAgICAgIEFsbG93SGlkZGVuKE90aGVyLkFsbG93SGlkZGVuKSB7fQorCisgIC8vIEZJWE1FOiBSZW1vdmUgdGhlc2UgZGVsZXRlZCBtZXRob2RzIG9uY2UgdGhlIGRlZmF1bHQgYnVpbGQgaW5jbHVkZXMKKyAgLy8gLVdkZXByZWNhdGVkLgorICBMb29rdXBSZXN1bHQoY29uc3QgTG9va3VwUmVzdWx0ICYpID0gZGVsZXRlOworICBMb29rdXBSZXN1bHQgJm9wZXJhdG9yPShjb25zdCBMb29rdXBSZXN1bHQgJikgPSBkZWxldGU7CisKKyAgTG9va3VwUmVzdWx0KExvb2t1cFJlc3VsdCAmJk90aGVyKQorICAgICAgOiBSZXN1bHRLaW5kKHN0ZDo6bW92ZShPdGhlci5SZXN1bHRLaW5kKSksCisgICAgICAgIEFtYmlndWl0eShzdGQ6Om1vdmUoT3RoZXIuQW1iaWd1aXR5KSksIERlY2xzKHN0ZDo6bW92ZShPdGhlci5EZWNscykpLAorICAgICAgICBQYXRocyhzdGQ6Om1vdmUoT3RoZXIuUGF0aHMpKSwKKyAgICAgICAgTmFtaW5nQ2xhc3Moc3RkOjptb3ZlKE90aGVyLk5hbWluZ0NsYXNzKSksCisgICAgICAgIEJhc2VPYmplY3RUeXBlKHN0ZDo6bW92ZShPdGhlci5CYXNlT2JqZWN0VHlwZSkpLAorICAgICAgICBTZW1hUHRyKHN0ZDo6bW92ZShPdGhlci5TZW1hUHRyKSksIE5hbWVJbmZvKHN0ZDo6bW92ZShPdGhlci5OYW1lSW5mbykpLAorICAgICAgICBOYW1lQ29udGV4dFJhbmdlKHN0ZDo6bW92ZShPdGhlci5OYW1lQ29udGV4dFJhbmdlKSksCisgICAgICAgIExvb2t1cEtpbmQoc3RkOjptb3ZlKE90aGVyLkxvb2t1cEtpbmQpKSwgSUROUyhzdGQ6Om1vdmUoT3RoZXIuSUROUykpLAorICAgICAgICBSZWRlY2woc3RkOjptb3ZlKE90aGVyLlJlZGVjbCkpLAorICAgICAgICBFeHRlcm5hbFJlZGVjbChzdGQ6Om1vdmUoT3RoZXIuRXh0ZXJuYWxSZWRlY2wpKSwKKyAgICAgICAgSGlkZVRhZ3Moc3RkOjptb3ZlKE90aGVyLkhpZGVUYWdzKSksCisgICAgICAgIERpYWdub3NlKHN0ZDo6bW92ZShPdGhlci5EaWFnbm9zZSkpLAorICAgICAgICBBbGxvd0hpZGRlbihzdGQ6Om1vdmUoT3RoZXIuQWxsb3dIaWRkZW4pKSwKKyAgICAgICAgU2hhZG93ZWQoc3RkOjptb3ZlKE90aGVyLlNoYWRvd2VkKSkgeworICAgIE90aGVyLlBhdGhzID0gbnVsbHB0cjsKKyAgICBPdGhlci5EaWFnbm9zZSA9IGZhbHNlOworICB9CisKKyAgTG9va3VwUmVzdWx0ICZvcGVyYXRvcj0oTG9va3VwUmVzdWx0ICYmT3RoZXIpIHsKKyAgICBSZXN1bHRLaW5kID0gc3RkOjptb3ZlKE90aGVyLlJlc3VsdEtpbmQpOworICAgIEFtYmlndWl0eSA9IHN0ZDo6bW92ZShPdGhlci5BbWJpZ3VpdHkpOworICAgIERlY2xzID0gc3RkOjptb3ZlKE90aGVyLkRlY2xzKTsKKyAgICBQYXRocyA9IHN0ZDo6bW92ZShPdGhlci5QYXRocyk7CisgICAgTmFtaW5nQ2xhc3MgPSBzdGQ6Om1vdmUoT3RoZXIuTmFtaW5nQ2xhc3MpOworICAgIEJhc2VPYmplY3RUeXBlID0gc3RkOjptb3ZlKE90aGVyLkJhc2VPYmplY3RUeXBlKTsKKyAgICBTZW1hUHRyID0gc3RkOjptb3ZlKE90aGVyLlNlbWFQdHIpOworICAgIE5hbWVJbmZvID0gc3RkOjptb3ZlKE90aGVyLk5hbWVJbmZvKTsKKyAgICBOYW1lQ29udGV4dFJhbmdlID0gc3RkOjptb3ZlKE90aGVyLk5hbWVDb250ZXh0UmFuZ2UpOworICAgIExvb2t1cEtpbmQgPSBzdGQ6Om1vdmUoT3RoZXIuTG9va3VwS2luZCk7CisgICAgSUROUyA9IHN0ZDo6bW92ZShPdGhlci5JRE5TKTsKKyAgICBSZWRlY2wgPSBzdGQ6Om1vdmUoT3RoZXIuUmVkZWNsKTsKKyAgICBFeHRlcm5hbFJlZGVjbCA9IHN0ZDo6bW92ZShPdGhlci5FeHRlcm5hbFJlZGVjbCk7CisgICAgSGlkZVRhZ3MgPSBzdGQ6Om1vdmUoT3RoZXIuSGlkZVRhZ3MpOworICAgIERpYWdub3NlID0gc3RkOjptb3ZlKE90aGVyLkRpYWdub3NlKTsKKyAgICBBbGxvd0hpZGRlbiA9IHN0ZDo6bW92ZShPdGhlci5BbGxvd0hpZGRlbik7CisgICAgU2hhZG93ZWQgPSBzdGQ6Om1vdmUoT3RoZXIuU2hhZG93ZWQpOworICAgIE90aGVyLlBhdGhzID0gbnVsbHB0cjsKKyAgICBPdGhlci5EaWFnbm9zZSA9IGZhbHNlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIH5Mb29rdXBSZXN1bHQoKSB7CisgICAgaWYgKERpYWdub3NlKSBkaWFnbm9zZSgpOworICAgIGlmIChQYXRocykgZGVsZXRlUGF0aHMoUGF0aHMpOworICB9CisKKyAgLy8vIEdldHMgdGhlIG5hbWUgaW5mbyB0byBsb29rIHVwLgorICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZnZXRMb29rdXBOYW1lSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gTmFtZUluZm87CisgIH0KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIG5hbWUgaW5mbyB0byBsb29rIHVwLgorICB2b2lkIHNldExvb2t1cE5hbWVJbmZvKGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvKSB7CisgICAgdGhpcy0+TmFtZUluZm8gPSBOYW1lSW5mbzsKKyAgfQorCisgIC8vLyBHZXRzIHRoZSBuYW1lIHRvIGxvb2sgdXAuCisgIERlY2xhcmF0aW9uTmFtZSBnZXRMb29rdXBOYW1lKCkgY29uc3QgeworICAgIHJldHVybiBOYW1lSW5mby5nZXROYW1lKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIG5hbWUgdG8gbG9vayB1cC4KKyAgdm9pZCBzZXRMb29rdXBOYW1lKERlY2xhcmF0aW9uTmFtZSBOYW1lKSB7CisgICAgTmFtZUluZm8uc2V0TmFtZShOYW1lKTsKKyAgfQorCisgIC8vLyBHZXRzIHRoZSBraW5kIG9mIGxvb2t1cCB0byBwZXJmb3JtLgorICBTZW1hOjpMb29rdXBOYW1lS2luZCBnZXRMb29rdXBLaW5kKCkgY29uc3QgeworICAgIHJldHVybiBMb29rdXBLaW5kOworICB9CisKKyAgLy8vIFRydWUgaWYgdGhpcyBsb29rdXAgaXMganVzdCBsb29raW5nIGZvciBhbiBleGlzdGluZyBkZWNsYXJhdGlvbi4KKyAgYm9vbCBpc0ZvclJlZGVjbGFyYXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIFJlZGVjbDsKKyAgfQorCisgIC8vLyBUcnVlIGlmIHRoaXMgbG9va3VwIGlzIGp1c3QgbG9va2luZyBmb3IgYW4gZXhpc3RpbmcgZGVjbGFyYXRpb24gdG8gbGluaworICAvLy8gYWdhaW5zdCBhIGRlY2xhcmF0aW9uIHdpdGggZXh0ZXJuYWwgbGlua2FnZS4KKyAgYm9vbCBpc0ZvckV4dGVybmFsUmVkZWNsYXJhdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gRXh0ZXJuYWxSZWRlY2w7CisgIH0KKworICBTZW1hOjpSZWRlY2xhcmF0aW9uS2luZCByZWRlY2xhcmF0aW9uS2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRXh0ZXJuYWxSZWRlY2wgPyBTZW1hOjpGb3JFeHRlcm5hbFJlZGVjbGFyYXRpb24gOgorICAgICAgICAgICBSZWRlY2wgPyBTZW1hOjpGb3JWaXNpYmxlUmVkZWNsYXJhdGlvbiA6IFNlbWE6Ok5vdEZvclJlZGVjbGFyYXRpb247CisgIH0KKworICAvLy8gXGJyaWVmIFNwZWNpZnkgd2hldGhlciBoaWRkZW4gZGVjbGFyYXRpb25zIGFyZSB2aXNpYmxlLCBlLmcuLAorICAvLy8gZm9yIHJlY292ZXJ5IHJlYXNvbnMuCisgIHZvaWQgc2V0QWxsb3dIaWRkZW4oYm9vbCBBSCkgeworICAgIEFsbG93SGlkZGVuID0gQUg7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgbG9va3VwIGlzIHBlcm1pdHRlZCB0byBzZWUgaGlkZGVuCisgIC8vLyBkZWNsYXJhdGlvbnMsIHN1Y2ggYXMgdGhvc2UgaW4gbW9kdWxlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGltcG9ydGVkLgorICBib29sIGlzSGlkZGVuRGVjbGFyYXRpb25WaXNpYmxlKE5hbWVkRGVjbCAqTkQpIGNvbnN0IHsKKyAgICByZXR1cm4gQWxsb3dIaWRkZW4gfHwKKyAgICAgICAgICAgKGlzRm9yRXh0ZXJuYWxSZWRlY2xhcmF0aW9uKCkgJiYgTkQtPmlzRXh0ZXJuYWxseURlY2xhcmFibGUoKSk7CisgIH0KKworICAvLy8gU2V0cyB3aGV0aGVyIHRhZyBkZWNsYXJhdGlvbnMgc2hvdWxkIGJlIGhpZGRlbiBieSBub24tdGFnCisgIC8vLyBkZWNsYXJhdGlvbnMgZHVyaW5nIHJlc29sdXRpb24uICBUaGUgZGVmYXVsdCBpcyB0cnVlLgorICB2b2lkIHNldEhpZGVUYWdzKGJvb2wgSGlkZSkgeworICAgIEhpZGVUYWdzID0gSGlkZTsKKyAgfQorCisgIGJvb2wgaXNBbWJpZ3VvdXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFJlc3VsdEtpbmQoKSA9PSBBbWJpZ3VvdXM7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lcyBpZiB0aGlzIG5hbWVzIGEgc2luZ2xlIHJlc3VsdCB3aGljaCBpcyBub3QgYW4KKyAgLy8vIHVucmVzb2x2ZWQgdmFsdWUgdXNpbmcgZGVjbC4gIElmIHNvLCBpdCBpcyBzYWZlIHRvIGNhbGwKKyAgLy8vIGdldEZvdW5kRGVjbCgpLgorICBib29sIGlzU2luZ2xlUmVzdWx0KCkgY29uc3QgeworICAgIHJldHVybiBnZXRSZXN1bHRLaW5kKCkgPT0gRm91bmQ7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lcyBpZiB0aGUgcmVzdWx0cyBhcmUgb3ZlcmxvYWRlZC4KKyAgYm9vbCBpc092ZXJsb2FkZWRSZXN1bHQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFJlc3VsdEtpbmQoKSA9PSBGb3VuZE92ZXJsb2FkZWQ7CisgIH0KKworICBib29sIGlzVW5yZXNvbHZhYmxlUmVzdWx0KCkgY29uc3QgeworICAgIHJldHVybiBnZXRSZXN1bHRLaW5kKCkgPT0gRm91bmRVbnJlc29sdmVkVmFsdWU7CisgIH0KKworICBMb29rdXBSZXN1bHRLaW5kIGdldFJlc3VsdEtpbmQoKSBjb25zdCB7CisgICAgYXNzZXJ0KHNhbml0eSgpKTsKKyAgICByZXR1cm4gUmVzdWx0S2luZDsKKyAgfQorCisgIEFtYmlndWl0eUtpbmQgZ2V0QW1iaWd1aXR5S2luZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNBbWJpZ3VvdXMoKSk7CisgICAgcmV0dXJuIEFtYmlndWl0eTsKKyAgfQorCisgIGNvbnN0IFVucmVzb2x2ZWRTZXRJbXBsICZhc1VucmVzb2x2ZWRTZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIERlY2xzOworICB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihEZWNscy5iZWdpbigpKTsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihEZWNscy5lbmQoKSk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIG5vIGRlY2xzIHdlcmUgZm91bmQKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIERlY2xzLmVtcHR5KCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgYmFzZSBwYXRocyBzdHJ1Y3R1cmUgdGhhdCdzIGFzc29jaWF0ZWQgd2l0aAorICAvLy8gdGhlc2UgcmVzdWx0cywgb3IgbnVsbCBpZiBub25lIGlzLgorICBDWFhCYXNlUGF0aHMgKmdldEJhc2VQYXRocygpIGNvbnN0IHsKKyAgICByZXR1cm4gUGF0aHM7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBkZWNsYXJhdGlvbiBpcyB2aXNpYmxlIHRvIHRoZQorICAvLy8gcHJvZ3JhbS4KKyAgc3RhdGljIGJvb2wgaXNWaXNpYmxlKFNlbWEgJlNlbWFSZWYsIE5hbWVkRGVjbCAqRCkgeworICAgIC8vIElmIHRoaXMgZGVjbGFyYXRpb24gaXMgbm90IGhpZGRlbiwgaXQncyB2aXNpYmxlLgorICAgIGlmICghRC0+aXNIaWRkZW4oKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gRHVyaW5nIHRlbXBsYXRlIGluc3RhbnRpYXRpb24sIHdlIGNhbiByZWZlciB0byBoaWRkZW4gZGVjbGFyYXRpb25zLCBpZgorICAgIC8vIHRoZXkgd2VyZSB2aXNpYmxlIGluIGFueSBtb2R1bGUgYWxvbmcgdGhlIHBhdGggb2YgaW5zdGFudGlhdGlvbi4KKyAgICByZXR1cm4gaXNWaXNpYmxlU2xvdyhTZW1hUmVmLCBEKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGFjY2VwdGVkIChyZSlkZWNsYXJhdGlvbiBvZiB0aGUgZ2l2ZW4gZGVjbGFyYXRpb24sCisgIC8vLyBpZiB0aGVyZSBpcyBvbmUuCisgIE5hbWVkRGVjbCAqZ2V0QWNjZXB0YWJsZURlY2woTmFtZWREZWNsICpEKSBjb25zdCB7CisgICAgaWYgKCFELT5pc0luSWRlbnRpZmllck5hbWVzcGFjZShJRE5TKSkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgaWYgKGlzVmlzaWJsZShnZXRTZW1hKCksIEQpIHx8IGlzSGlkZGVuRGVjbGFyYXRpb25WaXNpYmxlKEQpKQorICAgICAgcmV0dXJuIEQ7CisKKyAgICByZXR1cm4gZ2V0QWNjZXB0YWJsZURlY2xTbG93KEQpOworICB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyBib29sIGlzVmlzaWJsZVNsb3coU2VtYSAmU2VtYVJlZiwgTmFtZWREZWNsICpEKTsKKyAgTmFtZWREZWNsICpnZXRBY2NlcHRhYmxlRGVjbFNsb3coTmFtZWREZWNsICpEKSBjb25zdDsKKworcHVibGljOgorICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGlkZW50aWZpZXIgbmFtZXNwYWNlIG1hc2sgZm9yIHRoaXMgbG9va3VwLgorICB1bnNpZ25lZCBnZXRJZGVudGlmaWVyTmFtZXNwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBJRE5TOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHdoZXRoZXIgdGhlc2UgcmVzdWx0cyBhcm9zZSBmcm9tIHBlcmZvcm1pbmcgYQorICAvLy8gbG9va3VwIGludG8gYSBjbGFzcy4KKyAgYm9vbCBpc0NsYXNzTG9va3VwKCkgY29uc3QgeworICAgIHJldHVybiBOYW1pbmdDbGFzcyAhPSBudWxscHRyOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSAnbmFtaW5nIGNsYXNzJyBmb3IgdGhpcyBsb29rdXAsIGkuZS4gdGhlCisgIC8vLyBjbGFzcyB3aGljaCB3YXMgbG9va2VkIGludG8gdG8gZmluZCB0aGVzZSByZXN1bHRzLgorICAvLy8KKyAgLy8vIEMrKzB4IFtjbGFzcy5hY2Nlc3MuYmFzZV1wNToKKyAgLy8vICAgVGhlIGFjY2VzcyB0byBhIG1lbWJlciBpcyBhZmZlY3RlZCBieSB0aGUgY2xhc3MgaW4gd2hpY2ggdGhlCisgIC8vLyAgIG1lbWJlciBpcyBuYW1lZC4gVGhpcyBuYW1pbmcgY2xhc3MgaXMgdGhlIGNsYXNzIGluIHdoaWNoIHRoZQorICAvLy8gICBtZW1iZXIgbmFtZSB3YXMgbG9va2VkIHVwIGFuZCBmb3VuZC4gW05vdGU6IHRoaXMgY2xhc3MgY2FuIGJlCisgIC8vLyAgIGV4cGxpY2l0LCBlLmcuLCB3aGVuIGEgcXVhbGlmaWVkLWlkIGlzIHVzZWQsIG9yIGltcGxpY2l0LAorICAvLy8gICBlLmcuLCB3aGVuIGEgY2xhc3MgbWVtYmVyIGFjY2VzcyBvcGVyYXRvciAoNS4yLjUpIGlzIHVzZWQKKyAgLy8vICAgKGluY2x1ZGluZyBjYXNlcyB3aGVyZSBhbiBpbXBsaWNpdCAidGhpcy0+IiBpcyBhZGRlZCkuIElmIGJvdGgKKyAgLy8vICAgYSBjbGFzcyBtZW1iZXIgYWNjZXNzIG9wZXJhdG9yIGFuZCBhIHF1YWxpZmllZC1pZCBhcmUgdXNlZCB0bworICAvLy8gICBuYW1lIHRoZSBtZW1iZXIgKGFzIGluIHAtPlQ6Om0pLCB0aGUgY2xhc3MgbmFtaW5nIHRoZSBtZW1iZXIKKyAgLy8vICAgaXMgdGhlIGNsYXNzIG5hbWVkIGJ5IHRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgb2YgdGhlCisgIC8vLyAgIHF1YWxpZmllZC1pZCAodGhhdCBpcywgVCkuIC0tIGVuZCBub3RlIF0KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHNldCBieSB0aGUgbG9va3VwIHJvdXRpbmVzIHdoZW4gdGhleSBmaW5kIHJlc3VsdHMgaW4gYSBjbGFzcy4KKyAgQ1hYUmVjb3JkRGVjbCAqZ2V0TmFtaW5nQ2xhc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIE5hbWluZ0NsYXNzOworICB9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSAnbmFtaW5nIGNsYXNzJyBmb3IgdGhpcyBsb29rdXAuCisgIHZvaWQgc2V0TmFtaW5nQ2xhc3MoQ1hYUmVjb3JkRGVjbCAqUmVjb3JkKSB7CisgICAgTmFtaW5nQ2xhc3MgPSBSZWNvcmQ7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGJhc2Ugb2JqZWN0IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbG9va3VwOworICAvLy8gaW1wb3J0YW50IGZvciBbY2xhc3MucHJvdGVjdGVkXS4gIE1vc3QgbG9va3VwcyBkbyBub3QgaGF2ZSBhbgorICAvLy8gYXNzb2NpYXRlZCBiYXNlIG9iamVjdC4KKyAgUXVhbFR5cGUgZ2V0QmFzZU9iamVjdFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIEJhc2VPYmplY3RUeXBlOworICB9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBiYXNlIG9iamVjdCB0eXBlIGZvciB0aGlzIGxvb2t1cC4KKyAgdm9pZCBzZXRCYXNlT2JqZWN0VHlwZShRdWFsVHlwZSBUKSB7CisgICAgQmFzZU9iamVjdFR5cGUgPSBUOworICB9CisKKyAgLy8vIFxicmllZiBBZGQgYSBkZWNsYXJhdGlvbiB0byB0aGVzZSByZXN1bHRzIHdpdGggaXRzIG5hdHVyYWwgYWNjZXNzLgorICAvLy8gRG9lcyBub3QgdGVzdCB0aGUgYWNjZXB0YW5jZSBjcml0ZXJpYS4KKyAgdm9pZCBhZGREZWNsKE5hbWVkRGVjbCAqRCkgeworICAgIGFkZERlY2woRCwgRC0+Z2V0QWNjZXNzKCkpOworICB9CisKKyAgLy8vIFxicmllZiBBZGQgYSBkZWNsYXJhdGlvbiB0byB0aGVzZSByZXN1bHRzIHdpdGggdGhlIGdpdmVuIGFjY2Vzcy4KKyAgLy8vIERvZXMgbm90IHRlc3QgdGhlIGFjY2VwdGFuY2UgY3JpdGVyaWEuCisgIHZvaWQgYWRkRGVjbChOYW1lZERlY2wgKkQsIEFjY2Vzc1NwZWNpZmllciBBUykgeworICAgIERlY2xzLmFkZERlY2woRCwgQVMpOworICAgIFJlc3VsdEtpbmQgPSBGb3VuZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWRkIGFsbCB0aGUgZGVjbGFyYXRpb25zIGZyb20gYW5vdGhlciBzZXQgb2YgbG9va3VwCisgIC8vLyByZXN1bHRzLgorICB2b2lkIGFkZEFsbERlY2xzKGNvbnN0IExvb2t1cFJlc3VsdCAmT3RoZXIpIHsKKyAgICBEZWNscy5hcHBlbmQoT3RoZXIuRGVjbHMuYmVnaW4oKSwgT3RoZXIuRGVjbHMuZW5kKCkpOworICAgIFJlc3VsdEtpbmQgPSBGb3VuZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgbm8gcmVzdWx0IHdhcyBmb3VuZCBiZWNhdXNlIHdlIGNvdWxkIG5vdAorICAvLy8gc2VhcmNoIGludG8gZGVwZW5kZW50IGJhc2UgY2xhc3NlcyBvZiB0aGUgY3VycmVudCBpbnN0YW50aWF0aW9uLgorICBib29sIHdhc05vdEZvdW5kSW5DdXJyZW50SW5zdGFudGlhdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVzdWx0S2luZCA9PSBOb3RGb3VuZEluQ3VycmVudEluc3RhbnRpYXRpb247CisgIH0KKyAgCisgIC8vLyBcYnJpZWYgTm90ZSB0aGF0IHdoaWxlIG5vIHJlc3VsdCB3YXMgZm91bmQgaW4gdGhlIGN1cnJlbnQgaW5zdGFudGlhdGlvbiwKKyAgLy8vIHRoZXJlIHdlcmUgZGVwZW5kZW50IGJhc2UgY2xhc3NlcyB0aGF0IGNvdWxkIG5vdCBiZSBzZWFyY2hlZC4KKyAgdm9pZCBzZXROb3RGb3VuZEluQ3VycmVudEluc3RhbnRpYXRpb24oKSB7CisgICAgYXNzZXJ0KFJlc3VsdEtpbmQgPT0gTm90Rm91bmQgJiYgRGVjbHMuZW1wdHkoKSk7CisgICAgUmVzdWx0S2luZCA9IE5vdEZvdW5kSW5DdXJyZW50SW5zdGFudGlhdGlvbjsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGxvb2t1cCByZXN1bHQgd2FzIHNoYWRvd2VkIGJ5IHNvbWUgb3RoZXIKKyAgLy8vIGRlY2xhcmF0aW9uIHRoYXQgbG9va3VwIGlnbm9yZWQuCisgIGJvb2wgaXNTaGFkb3dlZCgpIGNvbnN0IHsgcmV0dXJuIFNoYWRvd2VkOyB9CisKKyAgLy8vIFxicmllZiBOb3RlIHRoYXQgd2UgZm91bmQgYW5kIGlnbm9yZWQgYSBkZWNsYXJhdGlvbiB3aGlsZSBwZXJmb3JtaW5nCisgIC8vLyBsb29rdXAuCisgIHZvaWQgc2V0U2hhZG93ZWQoKSB7IFNoYWRvd2VkID0gdHJ1ZTsgfQorCisgIC8vLyBcYnJpZWYgUmVzb2x2ZXMgdGhlIHJlc3VsdCBraW5kIG9mIHRoZSBsb29rdXAsIHBvc3NpYmx5IGhpZGluZworICAvLy8gZGVjbHMuCisgIC8vLworICAvLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGluIGFueSBlbnZpcm9ubWVudCB3aGVyZSBsb29rdXAgbWlnaHQKKyAgLy8vIGdlbmVyYXRlIG11bHRpcGxlIGxvb2t1cCByZXN1bHRzLgorICB2b2lkIHJlc29sdmVLaW5kKCk7CisKKyAgLy8vIFxicmllZiBSZS1yZXNvbHZlcyB0aGUgcmVzdWx0IGtpbmQgb2YgdGhlIGxvb2t1cCBhZnRlciBhIHNldCBvZgorICAvLy8gcmVtb3ZhbHMgaGFzIGJlZW4gcGVyZm9ybWVkLgorICB2b2lkIHJlc29sdmVLaW5kQWZ0ZXJGaWx0ZXIoKSB7CisgICAgaWYgKERlY2xzLmVtcHR5KCkpIHsKKyAgICAgIGlmIChSZXN1bHRLaW5kICE9IE5vdEZvdW5kSW5DdXJyZW50SW5zdGFudGlhdGlvbikKKyAgICAgICAgUmVzdWx0S2luZCA9IE5vdEZvdW5kOworCisgICAgICBpZiAoUGF0aHMpIHsKKyAgICAgICAgZGVsZXRlUGF0aHMoUGF0aHMpOworICAgICAgICBQYXRocyA9IG51bGxwdHI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGxsdm06Ok9wdGlvbmFsPEFtYmlndWl0eUtpbmQ+IFNhdmVkQUs7CisgICAgICBib29sIFdhc0FtYmlndW91cyA9IGZhbHNlOworICAgICAgaWYgKFJlc3VsdEtpbmQgPT0gQW1iaWd1b3VzKSB7CisgICAgICAgIFNhdmVkQUsgPSBBbWJpZ3VpdHk7CisgICAgICAgIFdhc0FtYmlndW91cyA9IHRydWU7CisgICAgICB9CisgICAgICBSZXN1bHRLaW5kID0gRm91bmQ7CisgICAgICByZXNvbHZlS2luZCgpOworCisgICAgICAvLyBJZiB3ZSBkaWRuJ3QgbWFrZSB0aGUgbG9va3VwIHVuYW1iaWd1b3VzLCByZXN0b3JlIHRoZSBvbGQKKyAgICAgIC8vIGFtYmlndWl0eSBraW5kLgorICAgICAgaWYgKFJlc3VsdEtpbmQgPT0gQW1iaWd1b3VzKSB7CisgICAgICAgICh2b2lkKVdhc0FtYmlndW91czsKKyAgICAgICAgYXNzZXJ0KFdhc0FtYmlndW91cyk7CisgICAgICAgIEFtYmlndWl0eSA9IFNhdmVkQUsuZ2V0VmFsdWUoKTsKKyAgICAgIH0gZWxzZSBpZiAoUGF0aHMpIHsKKyAgICAgICAgZGVsZXRlUGF0aHMoUGF0aHMpOworICAgICAgICBQYXRocyA9IG51bGxwdHI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIERlY2xDbGFzcz4KKyAgRGVjbENsYXNzICpnZXRBc1NpbmdsZSgpIGNvbnN0IHsKKyAgICBpZiAoZ2V0UmVzdWx0S2luZCgpICE9IEZvdW5kKSByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gZHluX2Nhc3Q8RGVjbENsYXNzPihnZXRGb3VuZERlY2woKSk7CisgIH0KKworICAvLy8gXGJyaWVmIEZldGNoIHRoZSB1bmlxdWUgZGVjbCBmb3VuZCBieSB0aGlzIGxvb2t1cC4gIEFzc2VydHMKKyAgLy8vIHRoYXQgb25lIHdhcyBmb3VuZC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGludGVuZGVkIGZvciB1c2VycyB3aG8gaGF2ZSBleGFtaW5lZCB0aGUgcmVzdWx0IGtpbmQKKyAgLy8vIGFuZCBhcmUgY2VydGFpbiB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIHJlc3VsdC4KKyAgTmFtZWREZWNsICpnZXRGb3VuZERlY2woKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldFJlc3VsdEtpbmQoKSA9PSBGb3VuZAorICAgICAgICAgICAmJiAiZ2V0Rm91bmREZWNsIGNhbGxlZCBvbiBub24tdW5pcXVlIHJlc3VsdCIpOworICAgIHJldHVybiAoKmJlZ2luKCkpLT5nZXRVbmRlcmx5aW5nRGVjbCgpOworICB9CisKKyAgLy8vIEZldGNoZXMgYSByZXByZXNlbnRhdGl2ZSBkZWNsLiAgVXNlZnVsIGZvciBsYXp5IGRpYWdub3N0aWNzLgorICBOYW1lZERlY2wgKmdldFJlcHJlc2VudGF0aXZlRGVjbCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIURlY2xzLmVtcHR5KCkgJiYgImNhbm5vdCBnZXQgcmVwcmVzZW50YXRpdmUgb2YgZW1wdHkgc2V0Iik7CisgICAgcmV0dXJuICpiZWdpbigpOworICB9CisKKyAgLy8vIFxicmllZiBBc2tzIGlmIHRoZSByZXN1bHQgaXMgYSBzaW5nbGUgdGFnIGRlY2wuCisgIGJvb2wgaXNTaW5nbGVUYWdEZWNsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRSZXN1bHRLaW5kKCkgPT0gRm91bmQgJiYgaXNhPFRhZ0RlY2w+KGdldEZvdW5kRGVjbCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTWFrZSB0aGVzZSByZXN1bHRzIHNob3cgdGhhdCB0aGUgbmFtZSB3YXMgZm91bmQgaW4KKyAgLy8vIGJhc2UgY2xhc3NlcyBvZiBkaWZmZXJlbnQgdHlwZXMuCisgIC8vLworICAvLy8gVGhlIGdpdmVuIHBhdGhzIG9iamVjdCBpcyBjb3BpZWQgYW5kIGludmFsaWRhdGVkLgorICB2b2lkIHNldEFtYmlndW91c0Jhc2VTdWJvYmplY3RUeXBlcyhDWFhCYXNlUGF0aHMgJlApOworCisgIC8vLyBcYnJpZWYgTWFrZSB0aGVzZSByZXN1bHRzIHNob3cgdGhhdCB0aGUgbmFtZSB3YXMgZm91bmQgaW4KKyAgLy8vIGRpc3RpbmN0IGJhc2UgY2xhc3NlcyBvZiB0aGUgc2FtZSB0eXBlLgorICAvLy8KKyAgLy8vIFRoZSBnaXZlbiBwYXRocyBvYmplY3QgaXMgY29waWVkIGFuZCBpbnZhbGlkYXRlZC4KKyAgdm9pZCBzZXRBbWJpZ3VvdXNCYXNlU3Vib2JqZWN0cyhDWFhCYXNlUGF0aHMgJlApOworCisgIC8vLyBcYnJpZWYgTWFrZSB0aGVzZSByZXN1bHRzIHNob3cgdGhhdCB0aGUgbmFtZSB3YXMgZm91bmQgaW4KKyAgLy8vIGRpZmZlcmVudCBjb250ZXh0cyBhbmQgYSB0YWcgZGVjbCB3YXMgaGlkZGVuIGJ5IGFuIG9yZGluYXJ5CisgIC8vLyBkZWNsIGluIGEgZGlmZmVyZW50IGNvbnRleHQuCisgIHZvaWQgc2V0QW1iaWd1b3VzUXVhbGlmaWVkVGFnSGlkaW5nKCkgeworICAgIHNldEFtYmlndW91cyhBbWJpZ3VvdXNUYWdIaWRpbmcpOworICB9CisKKyAgLy8vIFxicmllZiBDbGVhcnMgb3V0IGFueSBjdXJyZW50IHN0YXRlLgorICB2b2lkIGNsZWFyKCkgeworICAgIFJlc3VsdEtpbmQgPSBOb3RGb3VuZDsKKyAgICBEZWNscy5jbGVhcigpOworICAgIGlmIChQYXRocykgZGVsZXRlUGF0aHMoUGF0aHMpOworICAgIFBhdGhzID0gbnVsbHB0cjsKKyAgICBOYW1pbmdDbGFzcyA9IG51bGxwdHI7CisgICAgU2hhZG93ZWQgPSBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2xlYXJzIG91dCBhbnkgY3VycmVudCBzdGF0ZSBhbmQgcmUtaW5pdGlhbGl6ZXMgZm9yIGEKKyAgLy8vIGRpZmZlcmVudCBraW5kIG9mIGxvb2t1cC4KKyAgdm9pZCBjbGVhcihTZW1hOjpMb29rdXBOYW1lS2luZCBLaW5kKSB7CisgICAgY2xlYXIoKTsKKyAgICBMb29rdXBLaW5kID0gS2luZDsKKyAgICBjb25maWd1cmUoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2hhbmdlIHRoaXMgbG9va3VwJ3MgcmVkZWNsYXJhdGlvbiBraW5kLgorICB2b2lkIHNldFJlZGVjbGFyYXRpb25LaW5kKFNlbWE6OlJlZGVjbGFyYXRpb25LaW5kIFJLKSB7CisgICAgUmVkZWNsID0gKFJLICE9IFNlbWE6Ok5vdEZvclJlZGVjbGFyYXRpb24pOworICAgIEV4dGVybmFsUmVkZWNsID0gKFJLID09IFNlbWE6OkZvckV4dGVybmFsUmVkZWNsYXJhdGlvbik7CisgICAgY29uZmlndXJlKCk7CisgIH0KKworICB2b2lkIGR1bXAoKTsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmKTsKKworICAvLy8gU3VwcHJlc3MgdGhlIGRpYWdub3N0aWNzIHRoYXQgd291bGQgbm9ybWFsbHkgZmlyZSBiZWNhdXNlIG9mIHRoaXMKKyAgLy8vIGxvb2t1cC4gIFRoaXMgaGFwcGVucyBkdXJpbmcgKGUuZy4pIHJlZGVjbGFyYXRpb24gbG9va3Vwcy4KKyAgdm9pZCBzdXBwcmVzc0RpYWdub3N0aWNzKCkgeworICAgIERpYWdub3NlID0gZmFsc2U7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgbG9va3VwIGlzIHN1cHByZXNzaW5nIGRpYWdub3N0aWNzLgorICBib29sIGlzU3VwcHJlc3NpbmdEaWFnbm9zdGljcygpIGNvbnN0IHsKKyAgICByZXR1cm4gIURpYWdub3NlOworICB9CisKKyAgLy8vIFNldHMgYSAnY29udGV4dCcgc291cmNlIHJhbmdlLgorICB2b2lkIHNldENvbnRleHRSYW5nZShTb3VyY2VSYW5nZSBTUikgeworICAgIE5hbWVDb250ZXh0UmFuZ2UgPSBTUjsKKyAgfQorCisgIC8vLyBHZXRzIHRoZSBzb3VyY2UgcmFuZ2Ugb2YgdGhlIGNvbnRleHQgb2YgdGhpcyBuYW1lOyBmb3IgQysrCisgIC8vLyBxdWFsaWZpZWQgbG9va3VwcywgdGhpcyBpcyB0aGUgc291cmNlIHJhbmdlIG9mIHRoZSBzY29wZQorICAvLy8gc3BlY2lmaWVyLgorICBTb3VyY2VSYW5nZSBnZXRDb250ZXh0UmFuZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIE5hbWVDb250ZXh0UmFuZ2U7CisgIH0KKworICAvLy8gR2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIGlkZW50aWZpZXIuICBUaGlzIGlzbid0IGFsd2F5cyBkZWZpbmVkOgorICAvLy8gc29tZXRpbWVzIHdlJ3JlIGRvaW5nIGxvb2t1cHMgb24gc3ludGhlc2l6ZWQgbmFtZXMuCisgIFNvdXJjZUxvY2F0aW9uIGdldE5hbWVMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIE5hbWVJbmZvLmdldExvYygpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIFNlbWEgb2JqZWN0IHRoYXQgdGhpcyBsb29rdXAgcmVzdWx0IGlzIHNlYXJjaGluZworICAvLy8gd2l0aC4KKyAgU2VtYSAmZ2V0U2VtYSgpIGNvbnN0IHsgcmV0dXJuICpTZW1hUHRyOyB9CisKKyAgLy8vIEEgY2xhc3MgZm9yIGl0ZXJhdGluZyB0aHJvdWdoIGEgcmVzdWx0IHNldCBhbmQgcG9zc2libHkKKyAgLy8vIGZpbHRlcmluZyBvdXQgcmVzdWx0cy4gIFRoZSByZXN1bHRzIHJldHVybmVkIGFyZSBwb3NzaWJseQorICAvLy8gc3VnYXJlZC4KKyAgY2xhc3MgRmlsdGVyIHsKKyAgICBmcmllbmQgY2xhc3MgTG9va3VwUmVzdWx0OworCisgICAgTG9va3VwUmVzdWx0ICZSZXN1bHRzOworICAgIExvb2t1cFJlc3VsdDo6aXRlcmF0b3IgSTsKKyAgICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgICBib29sIENhbGxlZERvbmUgPSBmYWxzZTsKKyAgICAKKyAgICBGaWx0ZXIoTG9va3VwUmVzdWx0ICZSZXN1bHRzKSA6IFJlc3VsdHMoUmVzdWx0cyksIEkoUmVzdWx0cy5iZWdpbigpKSB7fQorCisgIHB1YmxpYzoKKyAgICBGaWx0ZXIoRmlsdGVyICYmRikKKyAgICAgICAgOiBSZXN1bHRzKEYuUmVzdWx0cyksIEkoRi5JKSwgQ2hhbmdlZChGLkNoYW5nZWQpLAorICAgICAgICAgIENhbGxlZERvbmUoRi5DYWxsZWREb25lKSB7CisgICAgICBGLkNhbGxlZERvbmUgPSB0cnVlOworICAgIH0KKworICAgIH5GaWx0ZXIoKSB7CisgICAgICBhc3NlcnQoQ2FsbGVkRG9uZSAmJgorICAgICAgICAgICAgICJMb29rdXBSZXN1bHQ6OkZpbHRlciBkZXN0cm95ZWQgd2l0aG91dCBkb25lKCkgY2FsbCIpOworICAgIH0KKworICAgIGJvb2wgaGFzTmV4dCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBJICE9IFJlc3VsdHMuZW5kKCk7CisgICAgfQorCisgICAgTmFtZWREZWNsICpuZXh0KCkgeworICAgICAgYXNzZXJ0KEkgIT0gUmVzdWx0cy5lbmQoKSAmJiAibmV4dCgpIGNhbGxlZCBvbiBlbXB0eSBmaWx0ZXIiKTsKKyAgICAgIHJldHVybiAqSSsrOworICAgIH0KKworICAgIC8vLyBSZXN0YXJ0IHRoZSBpdGVyYXRpb24uCisgICAgdm9pZCByZXN0YXJ0KCkgeworICAgICAgSSA9IFJlc3VsdHMuYmVnaW4oKTsKKyAgICB9CisKKyAgICAvLy8gRXJhc2UgdGhlIGxhc3QgZWxlbWVudCByZXR1cm5lZCBmcm9tIHRoaXMgaXRlcmF0b3IuCisgICAgdm9pZCBlcmFzZSgpIHsKKyAgICAgIFJlc3VsdHMuRGVjbHMuZXJhc2UoLS1JKTsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vLyBSZXBsYWNlcyB0aGUgY3VycmVudCBlbnRyeSB3aXRoIHRoZSBnaXZlbiBvbmUsIHByZXNlcnZpbmcgdGhlCisgICAgLy8vIGFjY2VzcyBiaXRzLgorICAgIHZvaWQgcmVwbGFjZShOYW1lZERlY2wgKkQpIHsKKyAgICAgIFJlc3VsdHMuRGVjbHMucmVwbGFjZShJLTEsIEQpOworICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgfQorCisgICAgLy8vIFJlcGxhY2VzIHRoZSBjdXJyZW50IGVudHJ5IHdpdGggdGhlIGdpdmVuIG9uZS4KKyAgICB2b2lkIHJlcGxhY2UoTmFtZWREZWNsICpELCBBY2Nlc3NTcGVjaWZpZXIgQVMpIHsKKyAgICAgIFJlc3VsdHMuRGVjbHMucmVwbGFjZShJLTEsIEQsIEFTKTsKKyAgICAgIENoYW5nZWQgPSB0cnVlOworICAgIH0KKworICAgIHZvaWQgZG9uZSgpIHsKKyAgICAgIGFzc2VydCghQ2FsbGVkRG9uZSAmJiAiZG9uZSgpIGNhbGxlZCB0d2ljZSIpOworICAgICAgQ2FsbGVkRG9uZSA9IHRydWU7CisKKyAgICAgIGlmIChDaGFuZ2VkKQorICAgICAgICBSZXN1bHRzLnJlc29sdmVLaW5kQWZ0ZXJGaWx0ZXIoKTsKKyAgICB9CisgIH07CisKKyAgLy8vIENyZWF0ZSBhIGZpbHRlciBmb3IgdGhpcyByZXN1bHQgc2V0LgorICBGaWx0ZXIgbWFrZUZpbHRlcigpIHsKKyAgICByZXR1cm4gRmlsdGVyKCp0aGlzKTsKKyAgfQorCisgIHZvaWQgc2V0RmluZExvY2FsRXh0ZXJuKGJvb2wgRmluZExvY2FsRXh0ZXJuKSB7CisgICAgaWYgKEZpbmRMb2NhbEV4dGVybikKKyAgICAgIElETlMgfD0gRGVjbDo6SUROU19Mb2NhbEV4dGVybjsKKyAgICBlbHNlCisgICAgICBJRE5TICY9IH5EZWNsOjpJRE5TX0xvY2FsRXh0ZXJuOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgZGlhZ25vc2UoKSB7CisgICAgaWYgKGlzQW1iaWd1b3VzKCkpCisgICAgICBnZXRTZW1hKCkuRGlhZ25vc2VBbWJpZ3VvdXNMb29rdXAoKnRoaXMpOworICAgIGVsc2UgaWYgKGlzQ2xhc3NMb29rdXAoKSAmJiBnZXRTZW1hKCkuZ2V0TGFuZ09wdHMoKS5BY2Nlc3NDb250cm9sKQorICAgICAgZ2V0U2VtYSgpLkNoZWNrTG9va3VwQWNjZXNzKCp0aGlzKTsKKyAgfQorCisgIHZvaWQgc2V0QW1iaWd1b3VzKEFtYmlndWl0eUtpbmQgQUspIHsKKyAgICBSZXN1bHRLaW5kID0gQW1iaWd1b3VzOworICAgIEFtYmlndWl0eSA9IEFLOworICB9CisKKyAgdm9pZCBhZGREZWNsc0Zyb21CYXNlUGF0aHMoY29uc3QgQ1hYQmFzZVBhdGhzICZQKTsKKyAgdm9pZCBjb25maWd1cmUoKTsKKworICAvLyBTYW5pdHkgY2hlY2tzLgorICBib29sIHNhbml0eSgpIGNvbnN0OworCisgIGJvb2wgc2FuaXR5Q2hlY2tVbnJlc29sdmVkKCkgY29uc3QgeworICAgIGZvciAoaXRlcmF0b3IgSSA9IGJlZ2luKCksIEUgPSBlbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBpZiAoaXNhPFVucmVzb2x2ZWRVc2luZ1ZhbHVlRGVjbD4oKCpJKS0+Z2V0VW5kZXJseWluZ0RlY2woKSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIGRlbGV0ZVBhdGhzKENYWEJhc2VQYXRocyAqKTsKKworICAvLyBSZXN1bHRzLgorICBMb29rdXBSZXN1bHRLaW5kIFJlc3VsdEtpbmQgPSBOb3RGb3VuZDsKKyAgQW1iaWd1aXR5S2luZCBBbWJpZ3VpdHk7IC8vIGlsbC1kZWZpbmVkIHVubGVzcyBhbWJpZ3VvdXMKKyAgVW5yZXNvbHZlZFNldDw4PiBEZWNsczsKKyAgQ1hYQmFzZVBhdGhzICpQYXRocyA9IG51bGxwdHI7CisgIENYWFJlY29yZERlY2wgKk5hbWluZ0NsYXNzID0gbnVsbHB0cjsKKyAgUXVhbFR5cGUgQmFzZU9iamVjdFR5cGU7CisKKyAgLy8gUGFyYW1ldGVycy4KKyAgU2VtYSAqU2VtYVB0cjsKKyAgRGVjbGFyYXRpb25OYW1lSW5mbyBOYW1lSW5mbzsKKyAgU291cmNlUmFuZ2UgTmFtZUNvbnRleHRSYW5nZTsKKyAgU2VtYTo6TG9va3VwTmFtZUtpbmQgTG9va3VwS2luZDsKKyAgdW5zaWduZWQgSUROUyA9IDA7IC8vIHNldCBieSBjb25maWd1cmUoKQorCisgIGJvb2wgUmVkZWNsOworICBib29sIEV4dGVybmFsUmVkZWNsOworCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0YWcgZGVjbGFyYXRpb25zIHNob3VsZCBiZSBoaWRkZW4gaWYgbm9uLXRhZ3MKKyAgLy8vICAgYXJlIHByZXNlbnQKKyAgYm9vbCBIaWRlVGFncyA9IHRydWU7CisKKyAgYm9vbCBEaWFnbm9zZSA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB3ZSBzaG91bGQgYWxsb3cgaGlkZGVuIGRlY2xhcmF0aW9ucyB0byBiZSAndmlzaWJsZScuCisgIGJvb2wgQWxsb3dIaWRkZW4gPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhlIGZvdW5kIGRlY2xhcmF0aW9ucyB3ZXJlIHNoYWRvd2VkIGJ5IHNvbWUgb3RoZXIKKyAgLy8vIGRlY2xhcmF0aW9uIHRoYXQgd2Ugc2tpcHBlZC4gVGhpcyBvbmx5IGhhcHBlbnMgd2hlbiBcYyBMb29rdXBLaW5kCisgIC8vLyBpcyBcYyBMb29rdXBSZWRlY2xhcmF0aW9uV2l0aExpbmthZ2UuCisgIGJvb2wgU2hhZG93ZWQgPSBmYWxzZTsKK307CisKKy8vLyBcYnJpZWYgQ29uc3VtZXMgdmlzaWJsZSBkZWNsYXJhdGlvbnMgZm91bmQgd2hlbiBzZWFyY2hpbmcgZm9yCisvLy8gYWxsIHZpc2libGUgbmFtZXMgd2l0aGluIGEgZ2l2ZW4gc2NvcGUgb3IgY29udGV4dC4KKy8vLworLy8vIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzIG9mIFxjCisvLy8gU2VtYTo6TG9va3VwVmlzaWJsZURlY2xzKCksIGVhY2ggb2Ygd2hpY2ggc2hvdWxkIG92ZXJyaWRlIHRoZSBcYworLy8vIEZvdW5kRGVjbCgpIGZ1bmN0aW9uIHRvIHByb2Nlc3MgZGVjbGFyYXRpb25zIGFzIHRoZXkgYXJlIGZvdW5kLgorY2xhc3MgVmlzaWJsZURlY2xDb25zdW1lciB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgRGVzdHJveXMgdGhlIHZpc2libGUgZGVjbGFyYXRpb24gY29uc3VtZXIuCisgIHZpcnR1YWwgflZpc2libGVEZWNsQ29uc3VtZXIoKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIGhpZGRlbiBkZWNsYXJhdGlvbnMgKGZyb20gdW5pbXBvcnRlZAorICAvLy8gbW9kdWxlcykgc2hvdWxkIGJlIGdpdmVuIHRvIHRoaXMgY29uc3VtZXIuIEJ5IGRlZmF1bHQsIHRoZXkKKyAgLy8vIGFyZSBub3QgaW5jbHVkZWQuCisgIHZpcnR1YWwgYm9vbCBpbmNsdWRlSGlkZGVuRGVjbHMoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEludm9rZWQgZWFjaCB0aW1lIFxwIFNlbWE6Okxvb2t1cFZpc2libGVEZWNscygpIGZpbmRzIGEKKyAgLy8vIGRlY2xhcmF0aW9uIHZpc2libGUgZnJvbSB0aGUgY3VycmVudCBzY29wZSBvciBjb250ZXh0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBORCB0aGUgZGVjbGFyYXRpb24gZm91bmQuCisgIC8vLworICAvLy8gXHBhcmFtIEhpZGluZyBhIGRlY2xhcmF0aW9uIHRoYXQgaGlkZXMgdGhlIGRlY2xhcmF0aW9uIFxwIE5ELAorICAvLy8gb3IgTlVMTCBpZiBubyBzdWNoIGRlY2xhcmF0aW9uIGV4aXN0cy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ3R4IHRoZSBvcmlnaW5hbCBjb250ZXh0IGZyb20gd2hpY2ggdGhlIGxvb2t1cCBzdGFydGVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJbkJhc2VDbGFzcyB3aGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gd2FzIGZvdW5kIGluIGJhc2UKKyAgLy8vIGNsYXNzIG9mIHRoZSBjb250ZXh0IHdlIHNlYXJjaGVkLgorICB2aXJ0dWFsIHZvaWQgRm91bmREZWNsKE5hbWVkRGVjbCAqTkQsIE5hbWVkRGVjbCAqSGlkaW5nLCBEZWNsQ29udGV4dCAqQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5CYXNlQ2xhc3MpID0gMDsKKworICAvLy8gXGJyaWVmIENhbGxiYWNrIHRvIGluZm9ybSB0aGUgY2xpZW50IHRoYXQgU2VtYSBlbnRlcmVkIGludG8gYSBuZXcgY29udGV4dAorICAvLy8gdG8gZmluZCBhIHZpc2libGUgZGVjbGFyYXRpb24uCisgIC8vCisgIC8vLyBccGFyYW0gQ3R4IHRoZSBjb250ZXh0IHdoaWNoIFNlbWEgZW50ZXJlZC4KKyAgdmlydHVhbCB2b2lkIEVudGVyZWRDb250ZXh0KERlY2xDb250ZXh0ICpDdHgpIHt9Cit9OworCisvLy8gXGJyaWVmIEEgY2xhc3MgZm9yIHN0b3JpbmcgcmVzdWx0cyBmcm9tIGFyZ3VtZW50LWRlcGVuZGVudCBsb29rdXAuCitjbGFzcyBBRExSZXN1bHQgeworcHJpdmF0ZToKKyAgLy8vIEEgbWFwIGZyb20gY2Fub25pY2FsIGRlY2xzIHRvIHRoZSAnbW9zdCByZWNlbnQnIGRlY2wuCisgIGxsdm06Ok1hcFZlY3RvcjxOYW1lZERlY2wqLCBOYW1lZERlY2wqPiBEZWNsczsKKworICBzdHJ1Y3Qgc2VsZWN0X3NlY29uZCB7CisgICAgTmFtZWREZWNsICpvcGVyYXRvcigpKHN0ZDo6cGFpcjxOYW1lZERlY2wqLCBOYW1lZERlY2wqPiBQKSBjb25zdCB7CisgICAgICByZXR1cm4gUC5zZWNvbmQ7CisgICAgfQorICB9OworCitwdWJsaWM6CisgIC8vLyBBZGRzIGEgbmV3IEFETCBjYW5kaWRhdGUgdG8gdGhpcyBtYXAuCisgIHZvaWQgaW5zZXJ0KE5hbWVkRGVjbCAqRCk7CisKKyAgLy8vIFJlbW92ZXMgYW55IGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZGVjbC4KKyAgdm9pZCBlcmFzZShOYW1lZERlY2wgKkQpIHsKKyAgICBEZWNscy5lcmFzZShjYXN0PE5hbWVkRGVjbD4oRC0+Z2V0Q2Fub25pY2FsRGVjbCgpKSk7CisgIH0KKworICB1c2luZyBpdGVyYXRvciA9CisgICAgICBsbHZtOjptYXBwZWRfaXRlcmF0b3I8ZGVjbHR5cGUoRGVjbHMpOjppdGVyYXRvciwgc2VsZWN0X3NlY29uZD47CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBpdGVyYXRvcihEZWNscy5iZWdpbigpLCBzZWxlY3Rfc2Vjb25kKCkpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGl0ZXJhdG9yKERlY2xzLmVuZCgpLCBzZWxlY3Rfc2Vjb25kKCkpOyB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19TRU1BX0xPT0tVUF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0xvb3BIaW50LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL0xvb3BIaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiMmVlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvTG9vcEhpbnQuaApAQCAtMCwwICsxLDQ1IEBACisvLz09PS0tLSBMb29wSGludC5oIC0gVHlwZXMgZm9yIExvb3BIaW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU0VNQV9MT09QSElOVF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU0VNQV9MT09QSElOVF9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL1NlbWEvQXR0cmlidXRlTGlzdC5oIgorI2luY2x1ZGUgImNsYW5nL1NlbWEvT3duZXJzaGlwLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKKy8vLyBcYnJpZWYgTG9vcCBvcHRpbWl6YXRpb24gaGludCBmb3IgbG9vcCBhbmQgdW5yb2xsIHByYWdtYXMuCitzdHJ1Y3QgTG9vcEhpbnQgeworICAvLyBTb3VyY2UgcmFuZ2Ugb2YgdGhlIGRpcmVjdGl2ZS4KKyAgU291cmNlUmFuZ2UgUmFuZ2U7CisgIC8vIElkZW50aWZpZXIgY29ycmVzcG9uZGluZyB0byB0aGUgbmFtZSBvZiB0aGUgcHJhZ21hLiAgImxvb3AiIGZvcgorICAvLyAiI3ByYWdtYSBjbGFuZyBsb29wIiBkaXJlY3RpdmVzIGFuZCAidW5yb2xsIiBmb3IgIiNwcmFnbWEgdW5yb2xsIgorICAvLyBoaW50cy4KKyAgSWRlbnRpZmllckxvYyAqUHJhZ21hTmFtZUxvYzsKKyAgLy8gTmFtZSBvZiB0aGUgbG9vcCBoaW50LiAgRXhhbXBsZXM6ICJ1bnJvbGwiLCAidmVjdG9yaXplIi4gIEluIHRoZQorICAvLyAiI3ByYWdtYSB1bnJvbGwiIGFuZCAiI3ByYWdtYSBub3Vucm9sbCIgY2FzZXMsIHRoaXMgaXMgaWRlbnRpY2FsIHRvCisgIC8vIFByYWdtYU5hbWVMb2MuCisgIElkZW50aWZpZXJMb2MgKk9wdGlvbkxvYzsKKyAgLy8gSWRlbnRpZmllciBmb3IgdGhlIGhpbnQgc3RhdGUgYXJndW1lbnQuICBJZiBudWxsLCB0aGVuIHRoZSBzdGF0ZSBpcworICAvLyBkZWZhdWx0IHZhbHVlIHN1Y2ggYXMgZm9yICIjcHJhZ21hIHVucm9sbCIuCisgIElkZW50aWZpZXJMb2MgKlN0YXRlTG9jOworICAvLyBFeHByZXNzaW9uIGZvciB0aGUgaGludCBhcmd1bWVudCBpZiBpdCBleGlzdHMsIG51bGwgb3RoZXJ3aXNlLgorICBFeHByICpWYWx1ZUV4cHI7CisKKyAgTG9vcEhpbnQoKQorICAgICAgOiBQcmFnbWFOYW1lTG9jKG51bGxwdHIpLCBPcHRpb25Mb2MobnVsbHB0ciksIFN0YXRlTG9jKG51bGxwdHIpLAorICAgICAgICBWYWx1ZUV4cHIobnVsbHB0cikge30KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19TRU1BX0xPT1BISU5UX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvTXVsdGlwbGV4RXh0ZXJuYWxTZW1hU291cmNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL011bHRpcGxleEV4dGVybmFsU2VtYVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZTM2YWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL011bHRpcGxleEV4dGVybmFsU2VtYVNvdXJjZS5oCkBAIC0wLDAgKzEsMzYxIEBACisvLz09PS0tLSBNdWx0aXBsZXhFeHRlcm5hbFNlbWFTb3VyY2UuaCAtIEV4dGVybmFsIFNlbWEgSW50ZXJmYWNlLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyBFeHRlcm5hbFNlbWFTb3VyY2UgaW50ZXJmYWNlLCBkaXNwYXRjaGluZyB0byBhbGwgY2xpZW50cworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fQ0xBTkdfU0VNQV9NVUxUSVBMRVhFWFRFUk5BTFNFTUFTT1VSQ0VfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NFTUFfTVVMVElQTEVYRVhURVJOQUxTRU1BU09VUkNFX0gKKworI2luY2x1ZGUgImNsYW5nL1NlbWEvRXh0ZXJuYWxTZW1hU291cmNlLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9XZWFrLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgY2xhbmcgeworCisgIGNsYXNzIENYWENvbnN0cnVjdG9yRGVjbDsKKyAgY2xhc3MgQ1hYUmVjb3JkRGVjbDsKKyAgY2xhc3MgRGVjbGFyYXRvckRlY2w7CisgIHN0cnVjdCBFeHRlcm5hbFZUYWJsZVVzZTsKKyAgY2xhc3MgTG9va3VwUmVzdWx0OworICBjbGFzcyBOYW1lc3BhY2VEZWNsOworICBjbGFzcyBTY29wZTsKKyAgY2xhc3MgU2VtYTsKKyAgY2xhc3MgVHlwZWRlZk5hbWVEZWNsOworICBjbGFzcyBWYWx1ZURlY2w7CisgIGNsYXNzIFZhckRlY2w7CisKKworLy8vIFxicmllZiBBbiBhYnN0cmFjdCBpbnRlcmZhY2UgdGhhdCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkKKy8vLyBleHRlcm5hbCBBU1Qgc291cmNlcyB0aGF0IGFsc28gcHJvdmlkZSBpbmZvcm1hdGlvbiBmb3Igc2VtYW50aWMKKy8vLyBhbmFseXNpcy4KK2NsYXNzIE11bHRpcGxleEV4dGVybmFsU2VtYVNvdXJjZSA6IHB1YmxpYyBFeHRlcm5hbFNlbWFTb3VyY2UgeworCitwcml2YXRlOgorICBTbWFsbFZlY3RvcjxFeHRlcm5hbFNlbWFTb3VyY2UgKiwgMj4gU291cmNlczsgLy8gZG9lc24ndCBvd24gdGhlbS4KKworcHVibGljOgorICAKKyAgLy8vXGJyaWVmIENvbnN0cnVjdHMgYSBuZXcgbXVsdGlwbGV4aW5nIGV4dGVybmFsIHNlbWEgc291cmNlIGFuZCBhcHBlbmRzIHRoZQorICAvLy8gZ2l2ZW4gZWxlbWVudCB0byBpdC4KKyAgLy8vCisgIC8vL1xwYXJhbVtpbl0gczEgLSBBIG5vbi1udWxsIChvbGQpIEV4dGVybmFsU2VtYVNvdXJjZS4KKyAgLy8vXHBhcmFtW2luXSBzMiAtIEEgbm9uLW51bGwgKG5ldykgRXh0ZXJuYWxTZW1hU291cmNlLgorICAvLy8KKyAgTXVsdGlwbGV4RXh0ZXJuYWxTZW1hU291cmNlKEV4dGVybmFsU2VtYVNvdXJjZSYgczEsIEV4dGVybmFsU2VtYVNvdXJjZSYgczIpOworCisgIH5NdWx0aXBsZXhFeHRlcm5hbFNlbWFTb3VyY2UoKSBvdmVycmlkZTsKKworICAvLy9cYnJpZWYgQXBwZW5kcyBuZXcgc291cmNlIHRvIHRoZSBzb3VyY2UgbGlzdC4KKyAgLy8vCisgIC8vL1xwYXJhbVtpbl0gc291cmNlIC0gQW4gRXh0ZXJuYWxTZW1hU291cmNlLgorICAvLy8KKyAgdm9pZCBhZGRTb3VyY2UoRXh0ZXJuYWxTZW1hU291cmNlICZzb3VyY2UpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBFeHRlcm5hbEFTVFNvdXJjZS4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFxicmllZiBSZXNvbHZlIGEgZGVjbGFyYXRpb24gSUQgaW50byBhIGRlY2xhcmF0aW9uLCBwb3RlbnRpYWxseQorICAvLy8gYnVpbGRpbmcgYSBuZXcgZGVjbGFyYXRpb24uCisgIERlY2wgKkdldEV4dGVybmFsRGVjbCh1aW50MzJfdCBJRCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBDb21wbGV0ZSB0aGUgcmVkZWNsYXJhdGlvbiBjaGFpbiBpZiBpdCdzIGJlZW4gZXh0ZW5kZWQgc2luY2UgdGhlCisgIC8vLyBwcmV2aW91cyBnZW5lcmF0aW9uIG9mIHRoZSBBU1Qgc291cmNlLgorICB2b2lkIENvbXBsZXRlUmVkZWNsQ2hhaW4oY29uc3QgRGVjbCAqRCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBSZXNvbHZlIGEgc2VsZWN0b3IgSUQgaW50byBhIHNlbGVjdG9yLgorICBTZWxlY3RvciBHZXRFeHRlcm5hbFNlbGVjdG9yKHVpbnQzMl90IElEKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMga25vd24gdG8gdGhlIGV4dGVybmFsIEFTVAorICAvLy8gc291cmNlLgorICB1aW50MzJfdCBHZXROdW1FeHRlcm5hbFNlbGVjdG9ycygpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmVzb2x2ZSB0aGUgb2Zmc2V0IG9mIGEgc3RhdGVtZW50IGluIHRoZSBkZWNsIHN0cmVhbSBpbnRvCisgIC8vLyBhIHN0YXRlbWVudC4KKyAgU3RtdCAqR2V0RXh0ZXJuYWxEZWNsU3RtdCh1aW50NjRfdCBPZmZzZXQpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmVzb2x2ZSB0aGUgb2Zmc2V0IG9mIGEgc2V0IG9mIEMrKyBiYXNlIHNwZWNpZmllcnMgaW4gdGhlIGRlY2wKKyAgLy8vIHN0cmVhbSBpbnRvIGFuIGFycmF5IG9mIHNwZWNpZmllcnMuCisgIENYWEJhc2VTcGVjaWZpZXIgKkdldEV4dGVybmFsQ1hYQmFzZVNwZWNpZmllcnModWludDY0X3QgT2Zmc2V0KSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFJlc29sdmUgYSBoYW5kbGUgdG8gYSBsaXN0IG9mIGN0b3IgaW5pdGlhbGl6ZXJzIGludG8gdGhlIGxpc3Qgb2YKKyAgLy8vIGluaXRpYWxpemVycyB0aGVtc2VsdmVzLgorICBDWFhDdG9ySW5pdGlhbGl6ZXIgKipHZXRFeHRlcm5hbENYWEN0b3JJbml0aWFsaXplcnModWludDY0X3QgT2Zmc2V0KSBvdmVycmlkZTsKKworICBFeHRLaW5kIGhhc0V4dGVybmFsRGVmaW5pdGlvbnMoY29uc3QgRGVjbCAqRCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBGaW5kIGFsbCBkZWNsYXJhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUKKyAgLy8vIGdpdmVuIGNvbnRleHQuCisgIGJvb2wgRmluZEV4dGVybmFsVmlzaWJsZURlY2xzQnlOYW1lKGNvbnN0IERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lIE5hbWUpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgRW5zdXJlcyB0aGF0IHRoZSB0YWJsZSBvZiBhbGwgdmlzaWJsZSBkZWNsYXJhdGlvbnMgaW5zaWRlIHRoaXMKKyAgLy8vIGNvbnRleHQgaXMgdXAgdG8gZGF0ZS4KKyAgdm9pZCBjb21wbGV0ZVZpc2libGVEZWNsc01hcChjb25zdCBEZWNsQ29udGV4dCAqREMpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgRmluZHMgYWxsIGRlY2xhcmF0aW9ucyBsZXhpY2FsbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgZ2l2ZW4KKyAgLy8vIERlY2xDb250ZXh0LCBhZnRlciBhcHBseWluZyBhbiBvcHRpb25hbCBmaWx0ZXIgcHJlZGljYXRlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJc0tpbmRXZVdhbnQgYSBwcmVkaWNhdGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIHBhc3NlZAorICAvLy8gZGVjbGFyYXRpb24ga2luZCBpcyBvbmUgd2UgYXJlIGxvb2tpbmcgZm9yLgorICB2b2lkCisgIEZpbmRFeHRlcm5hbExleGljYWxEZWNscyhjb25zdCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpmdW5jdGlvbl9yZWY8Ym9vbChEZWNsOjpLaW5kKT4gSXNLaW5kV2VXYW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPERlY2wgKj4gJlJlc3VsdCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGRlY2xzIHRoYXQgYXJlIGNvbnRhaW5lZCBpbiBhIGZpbGUgaW4gdGhlIE9mZnNldC9MZW5ndGgKKyAgLy8vIHJhbmdlLiBccCBMZW5ndGggY2FuIGJlIDAgdG8gaW5kaWNhdGUgYSBwb2ludCBhdCBccCBPZmZzZXQgaW5zdGVhZCBvZgorICAvLy8gYSByYW5nZS4gCisgIHZvaWQgRmluZEZpbGVSZWdpb25EZWNscyhGaWxlSUQgRmlsZSwgdW5zaWduZWQgT2Zmc2V0LHVuc2lnbmVkIExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxEZWNsICo+ICZEZWNscykgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBHaXZlcyB0aGUgZXh0ZXJuYWwgQVNUIHNvdXJjZSBhbiBvcHBvcnR1bml0eSB0byBjb21wbGV0ZQorICAvLy8gYW4gaW5jb21wbGV0ZSB0eXBlLgorICB2b2lkIENvbXBsZXRlVHlwZShUYWdEZWNsICpUYWcpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgR2l2ZXMgdGhlIGV4dGVybmFsIEFTVCBzb3VyY2UgYW4gb3Bwb3J0dW5pdHkgdG8gY29tcGxldGUgYW4KKyAgLy8vIGluY29tcGxldGUgT2JqZWN0aXZlLUMgY2xhc3MuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIHdpbGwgb25seSBiZSBpbnZva2VkIGlmIHRoZSAiZXh0ZXJuYWxseSBjb21wbGV0ZWQiIGJpdCBpcworICAvLy8gc2V0IG9uIHRoZSBPYmpDSW50ZXJmYWNlRGVjbCB2aWEgdGhlIGZ1bmN0aW9uIAorICAvLy8gXGMgT2JqQ0ludGVyZmFjZURlY2w6OnNldEV4dGVybmFsbHlDb21wbGV0ZWQoKS4KKyAgdm9pZCBDb21wbGV0ZVR5cGUoT2JqQ0ludGVyZmFjZURlY2wgKkNsYXNzKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIExvYWRzIGNvbW1lbnQgcmFuZ2VzLgorICB2b2lkIFJlYWRDb21tZW50cygpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgTm90aWZ5IEV4dGVybmFsQVNUU291cmNlIHRoYXQgd2Ugc3RhcnRlZCBkZXNlcmlhbGl6YXRpb24gb2YKKyAgLy8vIGEgZGVjbCBvciB0eXBlIHNvIHVudGlsIEZpbmlzaGVkRGVzZXJpYWxpemluZyBpcyBjYWxsZWQgdGhlcmUgbWF5IGJlCisgIC8vLyBkZWNscyB0aGF0IGFyZSBpbml0aWFsaXppbmcuIE11c3QgYmUgcGFpcmVkIHdpdGggRmluaXNoZWREZXNlcmlhbGl6aW5nLgorICB2b2lkIFN0YXJ0ZWREZXNlcmlhbGl6aW5nKCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBOb3RpZnkgRXh0ZXJuYWxBU1RTb3VyY2UgdGhhdCB3ZSBmaW5pc2hlZCB0aGUgZGVzZXJpYWxpemF0aW9uIG9mCisgIC8vLyBhIGRlY2wgb3IgdHlwZS4gTXVzdCBiZSBwYWlyZWQgd2l0aCBTdGFydGVkRGVzZXJpYWxpemluZy4KKyAgdm9pZCBGaW5pc2hlZERlc2VyaWFsaXppbmcoKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4gd2UgYmVnaW4gcGFyc2luZyBhIG5ldworICAvLy8gdHJhbnNsYXRpb24gdW5pdCBpbnZvbHZpbmcgdGhpcyBleHRlcm5hbCBBU1Qgc291cmNlLgorICB2b2lkIFN0YXJ0VHJhbnNsYXRpb25Vbml0KEFTVENvbnN1bWVyICpDb25zdW1lcikgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBQcmludCBhbnkgc3RhdGlzdGljcyB0aGF0IGhhdmUgYmVlbiBnYXRoZXJlZCByZWdhcmRpbmcKKyAgLy8vIHRoZSBleHRlcm5hbCBBU1Qgc291cmNlLgorICB2b2lkIFByaW50U3RhdHMoKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtb2R1bGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gbW9kdWxlIElELgorICBNb2R1bGUgKmdldE1vZHVsZSh1bnNpZ25lZCBJRCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBQZXJmb3JtIGxheW91dCBvbiB0aGUgZ2l2ZW4gcmVjb3JkLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBhbGxvd3MgdGhlIGV4dGVybmFsIEFTVCBzb3VyY2UgdG8gcHJvdmlkZSBhbiBzcGVjaWZpYyAKKyAgLy8vIGxheW91dCBmb3IgYSByZWNvcmQsIG92ZXJyaWRpbmcgdGhlIGxheW91dCB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlCisgIC8vLyBjb25zdHJ1Y3RlZC4gSXQgaXMgaW50ZW5kZWQgZm9yIGNsaWVudHMgd2hvIHJlY2VpdmUgc3BlY2lmaWMgbGF5b3V0CisgIC8vLyBkZXRhaWxzIHJhdGhlciB0aGFuIHNvdXJjZSBjb2RlIChzdWNoIGFzIExMREIpLiBUaGUgY2xpZW50IGlzIGV4cGVjdGVkCisgIC8vLyB0byBmaWxsIGluIHRoZSBmaWVsZCBvZmZzZXRzLCBiYXNlIG9mZnNldHMsIHZpcnR1YWwgYmFzZSBvZmZzZXRzLCBhbmQKKyAgLy8vIGNvbXBsZXRlIG9iamVjdCBzaXplLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSZWNvcmQgVGhlIHJlY29yZCB3aG9zZSBsYXlvdXQgaXMgYmVpbmcgcmVxdWVzdGVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTaXplIFRoZSBmaW5hbCBzaXplIG9mIHRoZSByZWNvcmQsIGluIGJpdHMuCisgIC8vLworICAvLy8gXHBhcmFtIEFsaWdubWVudCBUaGUgZmluYWwgYWxpZ25tZW50IG9mIHRoZSByZWNvcmQsIGluIGJpdHMuCisgIC8vLworICAvLy8gXHBhcmFtIEZpZWxkT2Zmc2V0cyBUaGUgb2Zmc2V0IG9mIGVhY2ggb2YgdGhlIGZpZWxkcyB3aXRoaW4gdGhlIHJlY29yZCwKKyAgLy8vIGV4cHJlc3NlZCBpbiBiaXRzLiBBbGwgb2YgdGhlIGZpZWxkcyBtdXN0IGJlIHByb3ZpZGVkIHdpdGggb2Zmc2V0cy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQmFzZU9mZnNldHMgVGhlIG9mZnNldCBvZiBlYWNoIG9mIHRoZSBkaXJlY3QsIG5vbi12aXJ0dWFsIGJhc2UKKyAgLy8vIGNsYXNzZXMuIElmIGFueSBiYXNlcyBhcmUgbm90IGdpdmVuIG9mZnNldHMsIHRoZSBiYXNlcyB3aWxsIGJlIGxhaWQgCisgIC8vLyBvdXQgYWNjb3JkaW5nIHRvIHRoZSBBQkkuCisgIC8vLworICAvLy8gXHBhcmFtIFZpcnR1YWxCYXNlT2Zmc2V0cyBUaGUgb2Zmc2V0IG9mIGVhY2ggb2YgdGhlIHZpcnR1YWwgYmFzZSBjbGFzc2VzCisgIC8vLyAoZWl0aGVyIGRpcmVjdCBvciBub3QpLiBJZiBhbnkgYmFzZXMgYXJlIG5vdCBnaXZlbiBvZmZzZXRzLCB0aGUgYmFzZXMgd2lsbCAKKyAgLy8vIGJlIGxhaWQgb3V0IGFjY29yZGluZyB0byB0aGUgQUJJLgorICAvLy8gCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZSByZWNvcmQgbGF5b3V0IHdhcyBwcm92aWRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sCisgIGxheW91dFJlY29yZFR5cGUoY29uc3QgUmVjb3JkRGVjbCAqUmVjb3JkLAorICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICZTaXplLCB1aW50NjRfdCAmQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IEZpZWxkRGVjbCAqLCB1aW50NjRfdD4gJkZpZWxkT2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLCBDaGFyVW5pdHM+ICZCYXNlT2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVW5pdHM+ICZWaXJ0dWFsQmFzZU9mZnNldHMpIG92ZXJyaWRlOworCisgIC8vLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBieSBtZW1vcnkgYnVmZmVycywgYnJlYWtpbmcgZG93bgorICAvLy8gYnkgaGVhcC1iYWNrZWQgdmVyc3VzIG1tYXAnZWQgbWVtb3J5LgorICB2b2lkIGdldE1lbW9yeUJ1ZmZlclNpemVzKE1lbW9yeUJ1ZmZlclNpemVzICZzaXplcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEV4dGVybmFsU2VtYVNvdXJjZS4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFxicmllZiBJbml0aWFsaXplIHRoZSBzZW1hbnRpYyBzb3VyY2Ugd2l0aCB0aGUgU2VtYSBpbnN0YW5jZQorICAvLy8gYmVpbmcgdXNlZCB0byBwZXJmb3JtIHNlbWFudGljIGFuYWx5c2lzIG9uIHRoZSBhYnN0cmFjdCBzeW50YXgKKyAgLy8vIHRyZWUuCisgIHZvaWQgSW5pdGlhbGl6ZVNlbWEoU2VtYSAmUykgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBJbmZvcm0gdGhlIHNlbWFudGljIGNvbnN1bWVyIHRoYXQgU2VtYSBpcyBubyBsb25nZXIgYXZhaWxhYmxlLgorICB2b2lkIEZvcmdldFNlbWEoKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIExvYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBnbG9iYWwgbWV0aG9kIHBvb2wgZm9yIGEgZ2l2ZW4KKyAgLy8vIHNlbGVjdG9yLgorICB2b2lkIFJlYWRNZXRob2RQb29sKFNlbGVjdG9yIFNlbCkgb3ZlcnJpZGU7CisKKyAgLy8vIExvYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBnbG9iYWwgbWV0aG9kIHBvb2wgZm9yIGEgZ2l2ZW4KKyAgLy8vIHNlbGVjdG9yIGlmIG5lY2Vzc2FyeS4KKyAgdm9pZCB1cGRhdGVPdXRPZkRhdGVTZWxlY3RvcihTZWxlY3RvciBTZWwpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgTG9hZCB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCBhcmUga25vd24gdG8gdGhlIGV4dGVybmFsIHNvdXJjZSwKKyAgLy8vIHdoaWNoIHdpbGwgYmUgdXNlZCBkdXJpbmcgdHlwbyBjb3JyZWN0aW9uLgorICB2b2lkCisgIFJlYWRLbm93bk5hbWVzcGFjZXMoU21hbGxWZWN0b3JJbXBsPE5hbWVzcGFjZURlY2wqPiAmTmFtZXNwYWNlcykgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBMb2FkIHRoZSBzZXQgb2YgdXNlZCBidXQgbm90IGRlZmluZWQgZnVuY3Rpb25zIG9yIHZhcmlhYmxlcyB3aXRoCisgIC8vLyBpbnRlcm5hbCBsaW5rYWdlLCBvciB1c2VkIGJ1dCBub3QgZGVmaW5lZCBpbmxpbmUgZnVuY3Rpb25zLgorICB2b2lkIFJlYWRVbmRlZmluZWRCdXRVc2VkKAorICAgICAgbGx2bTo6TWFwVmVjdG9yPE5hbWVkRGVjbCAqLCBTb3VyY2VMb2NhdGlvbj4gJlVuZGVmaW5lZCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBSZWFkTWlzbWF0Y2hpbmdEZWxldGVFeHByZXNzaW9ucyhsbHZtOjpNYXBWZWN0b3I8CisgICAgICBGaWVsZERlY2wgKiwgbGx2bTo6U21hbGxWZWN0b3I8c3RkOjpwYWlyPFNvdXJjZUxvY2F0aW9uLCBib29sPiwgND4+ICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwcnMpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgRG8gbGFzdCByZXNvcnQsIHVucXVhbGlmaWVkIGxvb2t1cCBvbiBhIExvb2t1cFJlc3VsdCB0aGF0CisgIC8vLyBTZW1hIGNhbm5vdCBmaW5kLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSIGEgTG9va3VwUmVzdWx0IHRoYXQgaXMgYmVpbmcgcmVjb3ZlcmVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTIHRoZSBTY29wZSBvZiB0aGUgaWRlbnRpZmllciBvY2N1cnJlbmNlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gdHJ1ZSB0byB0ZWxsIFNlbWEgdG8gcmVjb3ZlciB1c2luZyB0aGUgTG9va3VwUmVzdWx0LgorICBib29sIExvb2t1cFVucXVhbGlmaWVkKExvb2t1cFJlc3VsdCAmUiwgU2NvcGUgKlMpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmVhZCB0aGUgc2V0IG9mIHRlbnRhdGl2ZSBkZWZpbml0aW9ucyBrbm93biB0byB0aGUgZXh0ZXJuYWwgU2VtYQorICAvLy8gc291cmNlLgorICAvLy8KKyAgLy8vIFRoZSBleHRlcm5hbCBzb3VyY2Ugc2hvdWxkIGFwcGVuZCBpdHMgb3duIHRlbnRhdGl2ZSBkZWZpbml0aW9ucyB0byB0aGUKKyAgLy8vIGdpdmVuIHZlY3RvciBvZiB0ZW50YXRpdmUgZGVmaW5pdGlvbnMuIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgbWF5IGJlCisgIC8vLyBpbnZva2VkIG11bHRpcGxlIHRpbWVzOyB0aGUgZXh0ZXJuYWwgc291cmNlIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvCisgIC8vLyBpbnRyb2R1Y2UgdGhlIHNhbWUgZGVjbGFyYXRpb25zIHJlcGVhdGVkbHkuCisgIHZvaWQgUmVhZFRlbnRhdGl2ZURlZmluaXRpb25zKFNtYWxsVmVjdG9ySW1wbDxWYXJEZWNsKj4gJkRlZnMpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmVhZCB0aGUgc2V0IG9mIHVudXNlZCBmaWxlLXNjb3BlIGRlY2xhcmF0aW9ucyBrbm93biB0byB0aGUKKyAgLy8vIGV4dGVybmFsIFNlbWEgc291cmNlLgorICAvLy8KKyAgLy8vIFRoZSBleHRlcm5hbCBzb3VyY2Ugc2hvdWxkIGFwcGVuZCBpdHMgb3duIHVudXNlZCwgZmlsZWQtc2NvcGUgdG8gdGhlCisgIC8vLyBnaXZlbiB2ZWN0b3Igb2YgZGVjbGFyYXRpb25zLiBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIG1heSBiZQorICAvLy8gaW52b2tlZCBtdWx0aXBsZSB0aW1lczsgdGhlIGV4dGVybmFsIHNvdXJjZSBzaG91bGQgdGFrZSBjYXJlIG5vdCB0bworICAvLy8gaW50cm9kdWNlIHRoZSBzYW1lIGRlY2xhcmF0aW9ucyByZXBlYXRlZGx5LgorICB2b2lkIFJlYWRVbnVzZWRGaWxlU2NvcGVkRGVjbHMoCisgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgRGVjbGFyYXRvckRlY2wqPiAmRGVjbHMpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmVhZCB0aGUgc2V0IG9mIGRlbGVnYXRpbmcgY29uc3RydWN0b3JzIGtub3duIHRvIHRoZQorICAvLy8gZXh0ZXJuYWwgU2VtYSBzb3VyY2UuCisgIC8vLworICAvLy8gVGhlIGV4dGVybmFsIHNvdXJjZSBzaG91bGQgYXBwZW5kIGl0cyBvd24gZGVsZWdhdGluZyBjb25zdHJ1Y3RvcnMgdG8gdGhlCisgIC8vLyBnaXZlbiB2ZWN0b3Igb2YgZGVjbGFyYXRpb25zLiBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIG1heSBiZQorICAvLy8gaW52b2tlZCBtdWx0aXBsZSB0aW1lczsgdGhlIGV4dGVybmFsIHNvdXJjZSBzaG91bGQgdGFrZSBjYXJlIG5vdCB0bworICAvLy8gaW50cm9kdWNlIHRoZSBzYW1lIGRlY2xhcmF0aW9ucyByZXBlYXRlZGx5LgorICB2b2lkIFJlYWREZWxlZ2F0aW5nQ29uc3RydWN0b3JzKAorICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q1hYQ29uc3RydWN0b3JEZWNsKj4gJkRlY2xzKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFJlYWQgdGhlIHNldCBvZiBleHRfdmVjdG9yIHR5cGUgZGVjbGFyYXRpb25zIGtub3duIHRvIHRoZQorICAvLy8gZXh0ZXJuYWwgU2VtYSBzb3VyY2UuCisgIC8vLworICAvLy8gVGhlIGV4dGVybmFsIHNvdXJjZSBzaG91bGQgYXBwZW5kIGl0cyBvd24gZXh0X3ZlY3RvciB0eXBlIGRlY2xhcmF0aW9ucyB0bworICAvLy8gdGhlIGdpdmVuIHZlY3RvciBvZiBkZWNsYXJhdGlvbnMuIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgbWF5IGJlCisgIC8vLyBpbnZva2VkIG11bHRpcGxlIHRpbWVzOyB0aGUgZXh0ZXJuYWwgc291cmNlIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvCisgIC8vLyBpbnRyb2R1Y2UgdGhlIHNhbWUgZGVjbGFyYXRpb25zIHJlcGVhdGVkbHkuCisgIHZvaWQgUmVhZEV4dFZlY3RvckRlY2xzKFNtYWxsVmVjdG9ySW1wbDxUeXBlZGVmTmFtZURlY2wqPiAmRGVjbHMpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmVhZCB0aGUgc2V0IG9mIHBvdGVudGlhbGx5IHVudXNlZCB0eXBlZGVmcyBrbm93biB0byB0aGUgc291cmNlLgorICAvLy8KKyAgLy8vIFRoZSBleHRlcm5hbCBzb3VyY2Ugc2hvdWxkIGFwcGVuZCBpdHMgb3duIHBvdGVudGlhbGx5IHVudXNlZCBsb2NhbAorICAvLy8gdHlwZWRlZnMgdG8gdGhlIGdpdmVuIHZlY3RvciBvZiBkZWNsYXJhdGlvbnMuIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgbWF5CisgIC8vLyBiZSBpbnZva2VkIG11bHRpcGxlIHRpbWVzOyB0aGUgZXh0ZXJuYWwgc291cmNlIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvCisgIC8vLyBpbnRyb2R1Y2UgdGhlIHNhbWUgZGVjbGFyYXRpb25zIHJlcGVhdGVkbHkuCisgIHZvaWQgUmVhZFVudXNlZExvY2FsVHlwZWRlZk5hbWVDYW5kaWRhdGVzKAorICAgICAgbGx2bTo6U21hbGxTZXRWZWN0b3I8Y29uc3QgVHlwZWRlZk5hbWVEZWNsICosIDQ+ICZEZWNscykgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBSZWFkIHRoZSBzZXQgb2YgcmVmZXJlbmNlZCBzZWxlY3RvcnMga25vd24gdG8gdGhlCisgIC8vLyBleHRlcm5hbCBTZW1hIHNvdXJjZS4KKyAgLy8vCisgIC8vLyBUaGUgZXh0ZXJuYWwgc291cmNlIHNob3VsZCBhcHBlbmQgaXRzIG93biByZWZlcmVuY2VkIHNlbGVjdG9ycyB0byB0aGUgCisgIC8vLyBnaXZlbiB2ZWN0b3Igb2Ygc2VsZWN0b3JzLiBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIAorICAvLy8gbWF5IGJlIGludm9rZWQgbXVsdGlwbGUgdGltZXM7IHRoZSBleHRlcm5hbCBzb3VyY2Ugc2hvdWxkIHRha2UgY2FyZSBub3QgCisgIC8vLyB0byBpbnRyb2R1Y2UgdGhlIHNhbWUgc2VsZWN0b3JzIHJlcGVhdGVkbHkuCisgIHZvaWQgUmVhZFJlZmVyZW5jZWRTZWxlY3RvcnMoU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxTZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbj4gPiAmU2Vscykgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBSZWFkIHRoZSBzZXQgb2Ygd2VhaywgdW5kZWNsYXJlZCBpZGVudGlmaWVycyBrbm93biB0byB0aGUKKyAgLy8vIGV4dGVybmFsIFNlbWEgc291cmNlLgorICAvLy8KKyAgLy8vIFRoZSBleHRlcm5hbCBzb3VyY2Ugc2hvdWxkIGFwcGVuZCBpdHMgb3duIHdlYWssIHVuZGVjbGFyZWQgaWRlbnRpZmllcnMgdG8KKyAgLy8vIHRoZSBnaXZlbiB2ZWN0b3IuIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgbWF5IGJlIGludm9rZWQgbXVsdGlwbGUgdGltZXM7IAorICAvLy8gdGhlIGV4dGVybmFsIHNvdXJjZSBzaG91bGQgdGFrZSBjYXJlIG5vdCB0byBpbnRyb2R1Y2UgdGhlIHNhbWUgaWRlbnRpZmllcnMKKyAgLy8vIHJlcGVhdGVkbHkuCisgIHZvaWQgUmVhZFdlYWtVbmRlY2xhcmVkSWRlbnRpZmllcnMoCisgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8SWRlbnRpZmllckluZm8qLCBXZWFrSW5mbz4gPiAmV0kpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmVhZCB0aGUgc2V0IG9mIHVzZWQgdnRhYmxlcyBrbm93biB0byB0aGUgZXh0ZXJuYWwgU2VtYSBzb3VyY2UuCisgIC8vLworICAvLy8gVGhlIGV4dGVybmFsIHNvdXJjZSBzaG91bGQgYXBwZW5kIGl0cyBvd24gdXNlZCB2dGFibGVzIHRvIHRoZSBnaXZlbgorICAvLy8gdmVjdG9yLiBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIG1heSBiZSBpbnZva2VkIG11bHRpcGxlIHRpbWVzOyB0aGUgZXh0ZXJuYWwKKyAgLy8vIHNvdXJjZSBzaG91bGQgdGFrZSBjYXJlIG5vdCB0byBpbnRyb2R1Y2UgdGhlIHNhbWUgdnRhYmxlcyByZXBlYXRlZGx5LgorICB2b2lkIFJlYWRVc2VkVlRhYmxlcyhTbWFsbFZlY3RvckltcGw8RXh0ZXJuYWxWVGFibGVVc2U+ICZWVGFibGVzKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFJlYWQgdGhlIHNldCBvZiBwZW5kaW5nIGluc3RhbnRpYXRpb25zIGtub3duIHRvIHRoZSBleHRlcm5hbAorICAvLy8gU2VtYSBzb3VyY2UuCisgIC8vLworICAvLy8gVGhlIGV4dGVybmFsIHNvdXJjZSBzaG91bGQgYXBwZW5kIGl0cyBvd24gcGVuZGluZyBpbnN0YW50aWF0aW9ucyB0byB0aGUKKyAgLy8vIGdpdmVuIHZlY3Rvci4gTm90ZSB0aGF0IHRoaXMgcm91dGluZSBtYXkgYmUgaW52b2tlZCBtdWx0aXBsZSB0aW1lczsgdGhlCisgIC8vLyBleHRlcm5hbCBzb3VyY2Ugc2hvdWxkIHRha2UgY2FyZSBub3QgdG8gaW50cm9kdWNlIHRoZSBzYW1lIGluc3RhbnRpYXRpb25zCisgIC8vLyByZXBlYXRlZGx5LgorICB2b2lkIFJlYWRQZW5kaW5nSW5zdGFudGlhdGlvbnMoCisgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8VmFsdWVEZWNsKiwgU291cmNlTG9jYXRpb24+ID4mIFBlbmRpbmcpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmVhZCB0aGUgc2V0IG9mIGxhdGUgcGFyc2VkIHRlbXBsYXRlIGZ1bmN0aW9ucyBmb3IgdGhpcyBzb3VyY2UuCisgIC8vLworICAvLy8gVGhlIGV4dGVybmFsIHNvdXJjZSBzaG91bGQgaW5zZXJ0IGl0cyBvd24gbGF0ZSBwYXJzZWQgdGVtcGxhdGUgZnVuY3Rpb25zCisgIC8vLyBpbnRvIHRoZSBtYXAuIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgbWF5IGJlIGludm9rZWQgbXVsdGlwbGUgdGltZXM7IHRoZQorICAvLy8gZXh0ZXJuYWwgc291cmNlIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvIGludHJvZHVjZSB0aGUgc2FtZSBtYXAgZW50cmllcworICAvLy8gcmVwZWF0ZWRseS4KKyAgdm9pZCBSZWFkTGF0ZVBhcnNlZFRlbXBsYXRlcygKKyAgICAgIGxsdm06Ok1hcFZlY3Rvcjxjb25zdCBGdW5jdGlvbkRlY2wgKiwgc3RkOjp1bmlxdWVfcHRyPExhdGVQYXJzZWRUZW1wbGF0ZT4+CisgICAgICAgICAgJkxQVE1hcCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxjb3B5ZG9jIEV4dGVybmFsU2VtYVNvdXJjZTo6Q29ycmVjdFR5cG8KKyAgLy8vIFxub3RlIFJldHVybnMgdGhlIGZpcnN0IG5vbmVtcHR5IGNvcnJlY3Rpb24uCisgIFR5cG9Db3JyZWN0aW9uIENvcnJlY3RUeXBvKGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJlR5cG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMb29rdXBLaW5kLCBTY29wZSAqUywgQ1hYU2NvcGVTcGVjICpTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ycmVjdGlvbkNhbmRpZGF0ZUNhbGxiYWNrICZDQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpNZW1iZXJDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEVudGVyaW5nQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ09iamVjdFBvaW50ZXJUeXBlICpPUFQpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUHJvZHVjZXMgYSBkaWFnbm9zdGljIG5vdGUgaWYgb25lIG9mIHRoZSBhdHRhY2hlZCBzb3VyY2VzCisgIC8vLyBjb250YWlucyBhIGNvbXBsZXRlIGRlZmluaXRpb24gZm9yIFxwIFQuIFF1ZXJpZXMgdGhlIHNvdXJjZXMgaW4gbGlzdAorICAvLy8gb3JkZXIgdW50aWwgdGhlIGZpcnN0IG9uZSBjbGFpbXMgdGhhdCBhIGRpYWdub3N0aWMgd2FzIHByb2R1Y2VkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBMb2MgdGhlIGxvY2F0aW9uIGF0IHdoaWNoIGEgY29tcGxldGUgdHlwZSB3YXMgcmVxdWlyZWQgYnV0IG5vdAorICAvLy8gcHJvdmlkZWQKKyAgLy8vCisgIC8vLyBccGFyYW0gVCB0aGUgXGMgUXVhbFR5cGUgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIGNvbXBsZXRlIGF0IFxwIExvYworICAvLy8KKyAgLy8vIFxyZXR1cm4gdHJ1ZSBpZiBhIGRpYWdub3N0aWMgd2FzIHByb2R1Y2VkLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgTWF5YmVEaWFnbm9zZU1pc3NpbmdDb21wbGV0ZVR5cGUoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQpIG92ZXJyaWRlOworCisgIC8vIGlzYS9jYXN0L2R5bl9jYXN0IHN1cHBvcnQKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNdWx0aXBsZXhFeHRlcm5hbFNlbWFTb3VyY2UqKSB7IHJldHVybiB0cnVlOyB9CisgIC8vc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBFeHRlcm5hbFNlbWFTb3VyY2UqKSB7IHJldHVybiB0cnVlOyB9Cit9OyAKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9PYmpDTWV0aG9kTGlzdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9PYmpDTWV0aG9kTGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwY2NkMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL09iakNNZXRob2RMaXN0LmgKQEAgLTAsMCArMSw2MiBAQAorLy89PT0tLS0gT2JqQ01ldGhvZExpc3QuaCAtIEEgc2luZ2x5IGxpbmtlZCBsaXN0IG9mIG1ldGhvZHMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBPYmpDTWV0aG9kTGlzdCwgYSBzaW5nbHktbGlua2VkIGxpc3Qgb2YgbWV0aG9kcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU0VNQV9PQkpDTUVUSE9ETElTVF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU0VNQV9PQkpDTUVUSE9ETElTVF9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbE9iakMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBPYmpDTWV0aG9kRGVjbDsKKworLy8vIFxicmllZiBhIGxpbmtlZCBsaXN0IG9mIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBzZWxlY3RvciBuYW1lIGJ1dCBkaWZmZXJlbnQKKy8vLyBzaWduYXR1cmVzLgorc3RydWN0IE9iakNNZXRob2RMaXN0IHsKKyAgLy8gTk9URTogSWYgeW91IGFkZCBhbnkgbWVtYmVycyB0byB0aGlzIHN0cnVjdCwgbWFrZSBzdXJlIHRvIHNlcmlhbGl6ZSB0aGVtLgorICAvLy8gXGJyaWVmIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZGVjbCB3aXRoIHRoaXMgc2lnbmF0dXJlLgorICBsbHZtOjpQb2ludGVySW50UGFpcjxPYmpDTWV0aG9kRGVjbCAqLCAxPiBNZXRob2RBbmRIYXNNb3JlVGhhbk9uZURlY2w7CisgIC8vLyBcYnJpZWYgVGhlIG5leHQgbGlzdCBvYmplY3QgYW5kIDIgYml0cyBmb3IgZXh0cmEgaW5mby4KKyAgbGx2bTo6UG9pbnRlckludFBhaXI8T2JqQ01ldGhvZExpc3QgKiwgMj4gTmV4dEFuZEV4dHJhQml0czsKKworICBPYmpDTWV0aG9kTGlzdCgpIHsgfQorICBPYmpDTWV0aG9kTGlzdChPYmpDTWV0aG9kRGVjbCAqTSkKKyAgICAgIDogTWV0aG9kQW5kSGFzTW9yZVRoYW5PbmVEZWNsKE0sIDApIHt9CisgIE9iakNNZXRob2RMaXN0KGNvbnN0IE9iakNNZXRob2RMaXN0ICZMKQorICAgICAgOiBNZXRob2RBbmRIYXNNb3JlVGhhbk9uZURlY2woTC5NZXRob2RBbmRIYXNNb3JlVGhhbk9uZURlY2wpLAorICAgICAgICBOZXh0QW5kRXh0cmFCaXRzKEwuTmV4dEFuZEV4dHJhQml0cykge30KKworICBPYmpDTWV0aG9kTGlzdCAqZ2V0TmV4dCgpIGNvbnN0IHsgcmV0dXJuIE5leHRBbmRFeHRyYUJpdHMuZ2V0UG9pbnRlcigpOyB9CisgIHVuc2lnbmVkIGdldEJpdHMoKSBjb25zdCB7IHJldHVybiBOZXh0QW5kRXh0cmFCaXRzLmdldEludCgpOyB9CisgIHZvaWQgc2V0TmV4dChPYmpDTWV0aG9kTGlzdCAqTCkgeyBOZXh0QW5kRXh0cmFCaXRzLnNldFBvaW50ZXIoTCk7IH0KKyAgdm9pZCBzZXRCaXRzKHVuc2lnbmVkIEIpIHsgTmV4dEFuZEV4dHJhQml0cy5zZXRJbnQoQik7IH0KKworICBPYmpDTWV0aG9kRGVjbCAqZ2V0TWV0aG9kKCkgY29uc3QgeworICAgIHJldHVybiBNZXRob2RBbmRIYXNNb3JlVGhhbk9uZURlY2wuZ2V0UG9pbnRlcigpOworICB9CisgIHZvaWQgc2V0TWV0aG9kKE9iakNNZXRob2REZWNsICpNKSB7CisgICAgcmV0dXJuIE1ldGhvZEFuZEhhc01vcmVUaGFuT25lRGVjbC5zZXRQb2ludGVyKE0pOworICB9CisKKyAgYm9vbCBoYXNNb3JlVGhhbk9uZURlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIE1ldGhvZEFuZEhhc01vcmVUaGFuT25lRGVjbC5nZXRJbnQoKTsKKyAgfQorICB2b2lkIHNldEhhc01vcmVUaGFuT25lRGVjbChib29sIEIpIHsKKyAgICByZXR1cm4gTWV0aG9kQW5kSGFzTW9yZVRoYW5PbmVEZWNsLnNldEludChCKTsKKyAgfQorfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvT3ZlcmxvYWQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvT3ZlcmxvYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTQ5ODgxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9PdmVybG9hZC5oCkBAIC0wLDAgKzEsMTAwMCBAQAorLy89PT0tIE92ZXJsb2FkLmggLSBDKysgT3ZlcmxvYWRpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCB0eXBlcyB1c2VkIGluIEMrKworLy8gb3ZlcmxvYWQgcmVzb2x1dGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU0VNQV9PVkVSTE9BRF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU0VNQV9PVkVSTE9BRF9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQWNjZXNzUGFpci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQmFzZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQ1hYLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xUZW1wbGF0ZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9TZW1hL1NlbWFGaXhJdFV0aWxzLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9UZW1wbGF0ZURlZHVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxpZ25PZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQVBWYWx1ZTsKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBTZW1hOworCisgIC8vLyBPdmVybG9hZGluZ1Jlc3VsdCAtIENhcHR1cmUgdGhlIHJlc3VsdCBvZiBwZXJmb3JtaW5nIG92ZXJsb2FkCisgIC8vLyByZXNvbHV0aW9uLgorICBlbnVtIE92ZXJsb2FkaW5nUmVzdWx0IHsKKyAgICAvLy8gT3ZlcmxvYWQgcmVzb2x1dGlvbiBzdWNjZWVkZWQuCisgICAgT1JfU3VjY2VzcywKKworICAgIC8vLyBObyB2aWFibGUgZnVuY3Rpb24gZm91bmQuCisgICAgT1JfTm9fVmlhYmxlX0Z1bmN0aW9uLAorCisgICAgLy8vIEFtYmlndW91cyBjYW5kaWRhdGVzIGZvdW5kLgorICAgIE9SX0FtYmlndW91cywKKworICAgIC8vLyBTdWNjZWVkZWQsIGJ1dCByZWZlcnMgdG8gYSBkZWxldGVkIGZ1bmN0aW9uLgorICAgIE9SX0RlbGV0ZWQKKyAgfTsKKyAgCisgIGVudW0gT3ZlcmxvYWRDYW5kaWRhdGVEaXNwbGF5S2luZCB7CisgICAgLy8vIFJlcXVlc3RzIHRoYXQgYWxsIGNhbmRpZGF0ZXMgYmUgc2hvd24uICBWaWFibGUgY2FuZGlkYXRlcyB3aWxsCisgICAgLy8vIGJlIHByaW50ZWQgZmlyc3QuCisgICAgT0NEX0FsbENhbmRpZGF0ZXMsCisKKyAgICAvLy8gUmVxdWVzdHMgdGhhdCBvbmx5IHZpYWJsZSBjYW5kaWRhdGVzIGJlIHNob3duLgorICAgIE9DRF9WaWFibGVDYW5kaWRhdGVzCisgIH07CisKKyAgLy8vIEltcGxpY2l0Q29udmVyc2lvbktpbmQgLSBUaGUga2luZCBvZiBpbXBsaWNpdCBjb252ZXJzaW9uIHVzZWQgdG8KKyAgLy8vIGNvbnZlcnQgYW4gYXJndW1lbnQgdG8gYSBwYXJhbWV0ZXIncyB0eXBlLiBUaGUgZW51bWVyYXRvciB2YWx1ZXMKKyAgLy8vIG1hdGNoIHdpdGggdGhlIHRhYmxlIHRpdGxlZCAnQ29udmVyc2lvbnMnIGluIFtvdmVyLmljcy5zY3NdIGFuZCBhcmUgbGlzdGVkCisgIC8vLyBzdWNoIHRoYXQgYmV0dGVyIGNvbnZlcnNpb24ga2luZHMgaGF2ZSBzbWFsbGVyIHZhbHVlcy4KKyAgZW51bSBJbXBsaWNpdENvbnZlcnNpb25LaW5kIHsKKyAgICAvLy8gSWRlbnRpdHkgY29udmVyc2lvbiAobm8gY29udmVyc2lvbikKKyAgICBJQ0tfSWRlbnRpdHkgPSAwLAorCisgICAgLy8vIEx2YWx1ZS10by1ydmFsdWUgY29udmVyc2lvbiAoQysrIFtjb252Lmx2YWxdKQorICAgIElDS19MdmFsdWVfVG9fUnZhbHVlLAorCisgICAgLy8vIEFycmF5LXRvLXBvaW50ZXIgY29udmVyc2lvbiAoQysrIFtjb252LmFycmF5XSkKKyAgICBJQ0tfQXJyYXlfVG9fUG9pbnRlciwKKworICAgIC8vLyBGdW5jdGlvbi10by1wb2ludGVyIChDKysgW2NvbnYuYXJyYXldKQorICAgIElDS19GdW5jdGlvbl9Ub19Qb2ludGVyLAorCisgICAgLy8vIEZ1bmN0aW9uIHBvaW50ZXIgY29udmVyc2lvbiAoQysrMTcgW2NvbnYuZmN0cHRyXSkKKyAgICBJQ0tfRnVuY3Rpb25fQ29udmVyc2lvbiwKKworICAgIC8vLyBRdWFsaWZpY2F0aW9uIGNvbnZlcnNpb25zIChDKysgW2NvbnYucXVhbF0pCisgICAgSUNLX1F1YWxpZmljYXRpb24sCisKKyAgICAvLy8gSW50ZWdyYWwgcHJvbW90aW9ucyAoQysrIFtjb252LnByb21dKQorICAgIElDS19JbnRlZ3JhbF9Qcm9tb3Rpb24sCisKKyAgICAvLy8gRmxvYXRpbmcgcG9pbnQgcHJvbW90aW9ucyAoQysrIFtjb252LmZwcHJvbV0pCisgICAgSUNLX0Zsb2F0aW5nX1Byb21vdGlvbiwKKworICAgIC8vLyBDb21wbGV4IHByb21vdGlvbnMgKENsYW5nIGV4dGVuc2lvbikKKyAgICBJQ0tfQ29tcGxleF9Qcm9tb3Rpb24sCisKKyAgICAvLy8gSW50ZWdyYWwgY29udmVyc2lvbnMgKEMrKyBbY29udi5pbnRlZ3JhbF0pCisgICAgSUNLX0ludGVncmFsX0NvbnZlcnNpb24sCisKKyAgICAvLy8gRmxvYXRpbmcgcG9pbnQgY29udmVyc2lvbnMgKEMrKyBbY29udi5kb3VibGVdIAorICAgIElDS19GbG9hdGluZ19Db252ZXJzaW9uLAorCisgICAgLy8vIENvbXBsZXggY29udmVyc2lvbnMgKEM5OSA2LjMuMS42KQorICAgIElDS19Db21wbGV4X0NvbnZlcnNpb24sCisKKyAgICAvLy8gRmxvYXRpbmctaW50ZWdyYWwgY29udmVyc2lvbnMgKEMrKyBbY29udi5mcGludF0pCisgICAgSUNLX0Zsb2F0aW5nX0ludGVncmFsLAorCisgICAgLy8vIFBvaW50ZXIgY29udmVyc2lvbnMgKEMrKyBbY29udi5wdHJdKQorICAgIElDS19Qb2ludGVyX0NvbnZlcnNpb24sCisKKyAgICAvLy8gUG9pbnRlci10by1tZW1iZXIgY29udmVyc2lvbnMgKEMrKyBbY29udi5tZW1dKQorICAgIElDS19Qb2ludGVyX01lbWJlciwKKworICAgIC8vLyBCb29sZWFuIGNvbnZlcnNpb25zIChDKysgW2NvbnYuYm9vbF0pCisgICAgSUNLX0Jvb2xlYW5fQ29udmVyc2lvbiwKKworICAgIC8vLyBDb252ZXJzaW9ucyBiZXR3ZWVuIGNvbXBhdGlibGUgdHlwZXMgaW4gQzk5CisgICAgSUNLX0NvbXBhdGlibGVfQ29udmVyc2lvbiwKKworICAgIC8vLyBEZXJpdmVkLXRvLWJhc2UgKEMrKyBbb3Zlci5iZXN0Lmljc10pCisgICAgSUNLX0Rlcml2ZWRfVG9fQmFzZSwKKworICAgIC8vLyBWZWN0b3IgY29udmVyc2lvbnMKKyAgICBJQ0tfVmVjdG9yX0NvbnZlcnNpb24sCisKKyAgICAvLy8gQSB2ZWN0b3Igc3BsYXQgZnJvbSBhbiBhcml0aG1ldGljIHR5cGUKKyAgICBJQ0tfVmVjdG9yX1NwbGF0LAorCisgICAgLy8vIENvbXBsZXgtcmVhbCBjb252ZXJzaW9ucyAoQzk5IDYuMy4xLjcpCisgICAgSUNLX0NvbXBsZXhfUmVhbCwKKworICAgIC8vLyBCbG9jayBQb2ludGVyIGNvbnZlcnNpb25zCisgICAgSUNLX0Jsb2NrX1BvaW50ZXJfQ29udmVyc2lvbiwKKworICAgIC8vLyBUcmFuc3BhcmVudCBVbmlvbiBDb252ZXJzaW9ucworICAgIElDS19UcmFuc3BhcmVudFVuaW9uQ29udmVyc2lvbiwKKworICAgIC8vLyBPYmplY3RpdmUtQyBBUkMgd3JpdGViYWNrIGNvbnZlcnNpb24KKyAgICBJQ0tfV3JpdGViYWNrX0NvbnZlcnNpb24sCisKKyAgICAvLy8gWmVybyBjb25zdGFudCB0byBldmVudCAoT3BlbkNMMS4yIDYuMTIuMTApCisgICAgSUNLX1plcm9fRXZlbnRfQ29udmVyc2lvbiwKKworICAgIC8vLyBaZXJvIGNvbnN0YW50IHRvIHF1ZXVlCisgICAgSUNLX1plcm9fUXVldWVfQ29udmVyc2lvbiwKKworICAgIC8vLyBDb252ZXJzaW9ucyBhbGxvd2VkIGluIEMsIGJ1dCBub3QgQysrCisgICAgSUNLX0NfT25seV9Db252ZXJzaW9uLAorCisgICAgLy8vIEMtb25seSBjb252ZXJzaW9uIGJldHdlZW4gcG9pbnRlcnMgd2l0aCBpbmNvbXBhdGlibGUgdHlwZXMKKyAgICBJQ0tfSW5jb21wYXRpYmxlX1BvaW50ZXJfQ29udmVyc2lvbiwKKworICAgIC8vLyBUaGUgbnVtYmVyIG9mIGNvbnZlcnNpb24ga2luZHMKKyAgICBJQ0tfTnVtX0NvbnZlcnNpb25fS2luZHMsCisgIH07CisKKyAgLy8vIEltcGxpY2l0Q29udmVyc2lvblJhbmsgLSBUaGUgcmFuayBvZiBhbiBpbXBsaWNpdCBjb252ZXJzaW9uCisgIC8vLyBraW5kLiBUaGUgZW51bWVyYXRvciB2YWx1ZXMgbWF0Y2ggd2l0aCBUYWJsZSA5IG9mIChDKysKKyAgLy8vIDEzLjMuMy4xLjEpIGFuZCBhcmUgbGlzdGVkIHN1Y2ggdGhhdCBiZXR0ZXIgY29udmVyc2lvbiByYW5rcworICAvLy8gaGF2ZSBzbWFsbGVyIHZhbHVlcy4KKyAgZW51bSBJbXBsaWNpdENvbnZlcnNpb25SYW5rIHsKKyAgICAvLy8gRXhhY3QgTWF0Y2gKKyAgICBJQ1JfRXhhY3RfTWF0Y2ggPSAwLAorCisgICAgLy8vIFByb21vdGlvbgorICAgIElDUl9Qcm9tb3Rpb24sCisKKyAgICAvLy8gQ29udmVyc2lvbgorICAgIElDUl9Db252ZXJzaW9uLAorCisgICAgLy8vIE9wZW5DTCBTY2FsYXIgV2lkZW5pbmcKKyAgICBJQ1JfT0NMX1NjYWxhcl9XaWRlbmluZywKKworICAgIC8vLyBDb21wbGV4IDwtPiBSZWFsIGNvbnZlcnNpb24KKyAgICBJQ1JfQ29tcGxleF9SZWFsX0NvbnZlcnNpb24sCisKKyAgICAvLy8gT2JqQyBBUkMgd3JpdGViYWNrIGNvbnZlcnNpb24KKyAgICBJQ1JfV3JpdGViYWNrX0NvbnZlcnNpb24sCisKKyAgICAvLy8gQ29udmVyc2lvbiBvbmx5IGFsbG93ZWQgaW4gdGhlIEMgc3RhbmRhcmQgKGUuZy4gdm9pZCogdG8gY2hhciopLgorICAgIElDUl9DX0NvbnZlcnNpb24sCisKKyAgICAvLy8gQ29udmVyc2lvbiBub3QgYWxsb3dlZCBieSB0aGUgQyBzdGFuZGFyZCwgYnV0IHRoYXQgd2UgYWNjZXB0IGFzIGFuCisgICAgLy8vIGV4dGVuc2lvbiBhbnl3YXkuCisgICAgSUNSX0NfQ29udmVyc2lvbl9FeHRlbnNpb24KKyAgfTsKKworICBJbXBsaWNpdENvbnZlcnNpb25SYW5rIEdldENvbnZlcnNpb25SYW5rKEltcGxpY2l0Q29udmVyc2lvbktpbmQgS2luZCk7CisKKyAgLy8vIE5hcnJvd2luZ0tpbmQgLSBUaGUga2luZCBvZiBuYXJyb3dpbmcgY29udmVyc2lvbiBiZWluZyBwZXJmb3JtZWQgYnkgYQorICAvLy8gc3RhbmRhcmQgY29udmVyc2lvbiBzZXF1ZW5jZSBhY2NvcmRpbmcgdG8gQysrMTEgW2RjbC5pbml0Lmxpc3RdcDcuCisgIGVudW0gTmFycm93aW5nS2luZCB7CisgICAgLy8vIE5vdCBhIG5hcnJvd2luZyBjb252ZXJzaW9uLgorICAgIE5LX05vdF9OYXJyb3dpbmcsCisKKyAgICAvLy8gQSBuYXJyb3dpbmcgY29udmVyc2lvbiBieSB2aXJ0dWUgb2YgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gdHlwZXMuCisgICAgTktfVHlwZV9OYXJyb3dpbmcsCisKKyAgICAvLy8gQSBuYXJyb3dpbmcgY29udmVyc2lvbiwgYmVjYXVzZSBhIGNvbnN0YW50IGV4cHJlc3Npb24gZ290IG5hcnJvd2VkLgorICAgIE5LX0NvbnN0YW50X05hcnJvd2luZywKKworICAgIC8vLyBBIG5hcnJvd2luZyBjb252ZXJzaW9uLCBiZWNhdXNlIGEgbm9uLWNvbnN0YW50LWV4cHJlc3Npb24gdmFyaWFibGUgbWlnaHQKKyAgICAvLy8gaGF2ZSBnb3QgbmFycm93ZWQuCisgICAgTktfVmFyaWFibGVfTmFycm93aW5nLAorCisgICAgLy8vIENhbm5vdCB0ZWxsIHdoZXRoZXIgdGhpcyBpcyBhIG5hcnJvd2luZyBjb252ZXJzaW9uIGJlY2F1c2UgdGhlCisgICAgLy8vIGV4cHJlc3Npb24gaXMgdmFsdWUtZGVwZW5kZW50LgorICAgIE5LX0RlcGVuZGVudF9OYXJyb3dpbmcsCisgIH07CisKKyAgLy8vIFN0YW5kYXJkQ29udmVyc2lvblNlcXVlbmNlIC0gcmVwcmVzZW50cyBhIHN0YW5kYXJkIGNvbnZlcnNpb24KKyAgLy8vIHNlcXVlbmNlIChDKysgMTMuMy4zLjEuMSkuIEEgc3RhbmRhcmQgY29udmVyc2lvbiBzZXF1ZW5jZQorICAvLy8gY29udGFpbnMgYmV0d2VlbiB6ZXJvIGFuZCB0aHJlZSBjb252ZXJzaW9ucy4gSWYgYSBwYXJ0aWN1bGFyCisgIC8vLyBjb252ZXJzaW9uIGlzIG5vdCBuZWVkZWQsIGl0IHdpbGwgYmUgc2V0IHRvIHRoZSBpZGVudGl0eSBjb252ZXJzaW9uCisgIC8vLyAoSUNLX0lkZW50aXR5KS4gTm90ZSB0aGF0IHRoZSB0aHJlZSBjb252ZXJzaW9ucyBhcmUKKyAgLy8vIHNwZWNpZmllZCBhcyBzZXBhcmF0ZSBtZW1iZXJzIChyYXRoZXIgdGhhbiBpbiBhbiBhcnJheSkgc28gdGhhdAorICAvLy8gd2UgY2FuIGtlZXAgdGhlIHNpemUgb2YgYSBzdGFuZGFyZCBjb252ZXJzaW9uIHNlcXVlbmNlIHRvIGEKKyAgLy8vIHNpbmdsZSB3b3JkLgorICBjbGFzcyBTdGFuZGFyZENvbnZlcnNpb25TZXF1ZW5jZSB7CisgIHB1YmxpYzoKKyAgICAvLy8gRmlyc3QgLS0gVGhlIGZpcnN0IGNvbnZlcnNpb24gY2FuIGJlIGFuIGx2YWx1ZS10by1ydmFsdWUKKyAgICAvLy8gY29udmVyc2lvbiwgYXJyYXktdG8tcG9pbnRlciBjb252ZXJzaW9uLCBvcgorICAgIC8vLyBmdW5jdGlvbi10by1wb2ludGVyIGNvbnZlcnNpb24uCisgICAgSW1wbGljaXRDb252ZXJzaW9uS2luZCBGaXJzdCA6IDg7CisKKyAgICAvLy8gU2Vjb25kIC0gVGhlIHNlY29uZCBjb252ZXJzaW9uIGNhbiBiZSBhbiBpbnRlZ3JhbCBwcm9tb3Rpb24sCisgICAgLy8vIGZsb2F0aW5nIHBvaW50IHByb21vdGlvbiwgaW50ZWdyYWwgY29udmVyc2lvbiwgZmxvYXRpbmcgcG9pbnQKKyAgICAvLy8gY29udmVyc2lvbiwgZmxvYXRpbmctaW50ZWdyYWwgY29udmVyc2lvbiwgcG9pbnRlciBjb252ZXJzaW9uLAorICAgIC8vLyBwb2ludGVyLXRvLW1lbWJlciBjb252ZXJzaW9uLCBvciBib29sZWFuIGNvbnZlcnNpb24uCisgICAgSW1wbGljaXRDb252ZXJzaW9uS2luZCBTZWNvbmQgOiA4OworCisgICAgLy8vIFRoaXJkIC0gVGhlIHRoaXJkIGNvbnZlcnNpb24gY2FuIGJlIGEgcXVhbGlmaWNhdGlvbiBjb252ZXJzaW9uCisgICAgLy8vIG9yIGEgZnVuY3Rpb24gY29udmVyc2lvbi4KKyAgICBJbXBsaWNpdENvbnZlcnNpb25LaW5kIFRoaXJkIDogODsKKworICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGlzIHRoZSBkZXByZWNhdGVkIGNvbnZlcnNpb24gb2YgYQorICAgIC8vLyBzdHJpbmcgbGl0ZXJhbCB0byBhIHBvaW50ZXIgdG8gbm9uLWNvbnN0IGNoYXJhY3RlciBkYXRhCisgICAgLy8vIChDKysgNC4ycDIpLgorICAgIHVuc2lnbmVkIERlcHJlY2F0ZWRTdHJpbmdMaXRlcmFsVG9DaGFyUHRyIDogMTsKKworICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgcXVhbGlmaWNhdGlvbiBjb252ZXJzaW9uIGludm9sdmVzIGEgY2hhbmdlIGluIHRoZQorICAgIC8vLyBPYmplY3RpdmUtQyBsaWZldGltZSAoZm9yIGF1dG9tYXRpYyByZWZlcmVuY2UgY291bnRpbmcpLgorICAgIHVuc2lnbmVkIFF1YWxpZmljYXRpb25JbmNsdWRlc09iakNMaWZldGltZSA6IDE7CisgICAgCisgICAgLy8vIEluY29tcGF0aWJsZU9iakMgLSBXaGV0aGVyIHRoaXMgaXMgYW4gT2JqZWN0aXZlLUMgY29udmVyc2lvbgorICAgIC8vLyB0aGF0IHdlIHNob3VsZCB3YXJuIGFib3V0IChpZiB3ZSBhY3R1YWxseSB1c2UgaXQpLgorICAgIHVuc2lnbmVkIEluY29tcGF0aWJsZU9iakMgOiAxOworCisgICAgLy8vIFJlZmVyZW5jZUJpbmRpbmcgLSBUcnVlIHdoZW4gdGhpcyBpcyBhIHJlZmVyZW5jZSBiaW5kaW5nCisgICAgLy8vIChDKysgW292ZXIuaWNzLnJlZl0pLgorICAgIHVuc2lnbmVkIFJlZmVyZW5jZUJpbmRpbmcgOiAxOworCisgICAgLy8vIERpcmVjdEJpbmRpbmcgLSBUcnVlIHdoZW4gdGhpcyBpcyBhIHJlZmVyZW5jZSBiaW5kaW5nIHRoYXQgaXMgYQorICAgIC8vLyBkaXJlY3QgYmluZGluZyAoQysrIFtkY2wuaW5pdC5yZWZdKS4KKyAgICB1bnNpZ25lZCBEaXJlY3RCaW5kaW5nIDogMTsKKworICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGlzIGFuIGx2YWx1ZSByZWZlcmVuY2UgYmluZGluZyAob3RoZXJ3aXNlLCBpdCdzCisgICAgLy8vIGFuIHJ2YWx1ZSByZWZlcmVuY2UgYmluZGluZykuCisgICAgdW5zaWduZWQgSXNMdmFsdWVSZWZlcmVuY2UgOiAxOworICAgIAorICAgIC8vLyBcYnJpZWYgV2hldGhlciB3ZSdyZSBiaW5kaW5nIHRvIGEgZnVuY3Rpb24gbHZhbHVlLgorICAgIHVuc2lnbmVkIEJpbmRzVG9GdW5jdGlvbkx2YWx1ZSA6IDE7CisgICAgCisgICAgLy8vIFxicmllZiBXaGV0aGVyIHdlJ3JlIGJpbmRpbmcgdG8gYW4gcnZhbHVlLgorICAgIHVuc2lnbmVkIEJpbmRzVG9SdmFsdWUgOiAxOworICAgIAorICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGJpbmRzIGFuIGltcGxpY2l0IG9iamVjdCBhcmd1bWVudCB0byBhIAorICAgIC8vLyBub24tc3RhdGljIG1lbWJlciBmdW5jdGlvbiB3aXRob3V0IGEgcmVmLXF1YWxpZmllci4KKyAgICB1bnNpZ25lZCBCaW5kc0ltcGxpY2l0T2JqZWN0QXJndW1lbnRXaXRob3V0UmVmUXVhbGlmaWVyIDogMTsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBiaW5kcyBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3Qgd2l0aCBhIGRpZmZlcmVudAorICAgIC8vLyBPYmplY3RpdmUtQyBsaWZldGltZSBxdWFsaWZpZXIuCisgICAgdW5zaWduZWQgT2JqQ0xpZmV0aW1lQ29udmVyc2lvbkJpbmRpbmcgOiAxOworICAgIAorICAgIC8vLyBGcm9tVHlwZSAtIFRoZSB0eXBlIHRoYXQgdGhpcyBjb252ZXJzaW9uIGlzIGNvbnZlcnRpbmcKKyAgICAvLy8gZnJvbS4gVGhpcyBpcyBhbiBvcGFxdWUgcG9pbnRlciB0aGF0IGNhbiBiZSB0cmFuc2xhdGVkIGludG8gYQorICAgIC8vLyBRdWFsVHlwZS4KKyAgICB2b2lkICpGcm9tVHlwZVB0cjsKKworICAgIC8vLyBUb1R5cGUgLSBUaGUgdHlwZXMgdGhhdCB0aGlzIGNvbnZlcnNpb24gaXMgY29udmVydGluZyB0byBpbgorICAgIC8vLyBlYWNoIHN0ZXAuIFRoaXMgaXMgYW4gb3BhcXVlIHBvaW50ZXIgdGhhdCBjYW4gYmUgdHJhbnNsYXRlZAorICAgIC8vLyBpbnRvIGEgUXVhbFR5cGUuCisgICAgdm9pZCAqVG9UeXBlUHRyc1szXTsKKworICAgIC8vLyBDb3B5Q29uc3RydWN0b3IgLSBUaGUgY29weSBjb25zdHJ1Y3RvciB0aGF0IGlzIHVzZWQgdG8gcGVyZm9ybQorICAgIC8vLyB0aGlzIGNvbnZlcnNpb24sIHdoZW4gdGhlIGNvbnZlcnNpb24gaXMgYWN0dWFsbHkganVzdCB0aGUKKyAgICAvLy8gaW5pdGlhbGl6YXRpb24gb2YgYW4gb2JqZWN0IHZpYSBjb3B5IGNvbnN0cnVjdG9yLiBTdWNoCisgICAgLy8vIGNvbnZlcnNpb25zIGFyZSBlaXRoZXIgaWRlbnRpdHkgY29udmVyc2lvbnMgb3IgZGVyaXZlZC10by1iYXNlCisgICAgLy8vIGNvbnZlcnNpb25zLgorICAgIENYWENvbnN0cnVjdG9yRGVjbCAqQ29weUNvbnN0cnVjdG9yOworICAgIERlY2xBY2Nlc3NQYWlyIEZvdW5kQ29weUNvbnN0cnVjdG9yOworCisgICAgdm9pZCBzZXRGcm9tVHlwZShRdWFsVHlwZSBUKSB7IEZyb21UeXBlUHRyID0gVC5nZXRBc09wYXF1ZVB0cigpOyB9CisKKyAgICB2b2lkIHNldFRvVHlwZSh1bnNpZ25lZCBJZHgsIFF1YWxUeXBlIFQpIHsgCisgICAgICBhc3NlcnQoSWR4IDwgMyAmJiAiVG8gdHlwZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgIFRvVHlwZVB0cnNbSWR4XSA9IFQuZ2V0QXNPcGFxdWVQdHIoKTsgCisgICAgfQorCisgICAgdm9pZCBzZXRBbGxUb1R5cGVzKFF1YWxUeXBlIFQpIHsKKyAgICAgIFRvVHlwZVB0cnNbMF0gPSBULmdldEFzT3BhcXVlUHRyKCk7IAorICAgICAgVG9UeXBlUHRyc1sxXSA9IFRvVHlwZVB0cnNbMF07CisgICAgICBUb1R5cGVQdHJzWzJdID0gVG9UeXBlUHRyc1swXTsKKyAgICB9CisKKyAgICBRdWFsVHlwZSBnZXRGcm9tVHlwZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBRdWFsVHlwZTo6Z2V0RnJvbU9wYXF1ZVB0cihGcm9tVHlwZVB0cik7CisgICAgfQorCisgICAgUXVhbFR5cGUgZ2V0VG9UeXBlKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgICAgYXNzZXJ0KElkeCA8IDMgJiYgIlRvIHR5cGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlIik7CisgICAgICByZXR1cm4gUXVhbFR5cGU6OmdldEZyb21PcGFxdWVQdHIoVG9UeXBlUHRyc1tJZHhdKTsKKyAgICB9CisKKyAgICB2b2lkIHNldEFzSWRlbnRpdHlDb252ZXJzaW9uKCk7CisgICAgCisgICAgYm9vbCBpc0lkZW50aXR5Q29udmVyc2lvbigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTZWNvbmQgPT0gSUNLX0lkZW50aXR5ICYmIFRoaXJkID09IElDS19JZGVudGl0eTsKKyAgICB9CisgICAgCisgICAgSW1wbGljaXRDb252ZXJzaW9uUmFuayBnZXRSYW5rKCkgY29uc3Q7CisgICAgTmFycm93aW5nS2luZCBnZXROYXJyb3dpbmdLaW5kKEFTVENvbnRleHQgJkNvbnRleHQsIGNvbnN0IEV4cHIgKkNvbnZlcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBWYWx1ZSAmQ29uc3RhbnRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgJkNvbnN0YW50VHlwZSkgY29uc3Q7CisgICAgYm9vbCBpc1BvaW50ZXJDb252ZXJzaW9uVG9Cb29sKCkgY29uc3Q7CisgICAgYm9vbCBpc1BvaW50ZXJDb252ZXJzaW9uVG9Wb2lkUG9pbnRlcihBU1RDb250ZXh0JiBDb250ZXh0KSBjb25zdDsKKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgfTsKKworICAvLy8gVXNlckRlZmluZWRDb252ZXJzaW9uU2VxdWVuY2UgLSBSZXByZXNlbnRzIGEgdXNlci1kZWZpbmVkCisgIC8vLyBjb252ZXJzaW9uIHNlcXVlbmNlIChDKysgMTMuMy4zLjEuMikuCisgIHN0cnVjdCBVc2VyRGVmaW5lZENvbnZlcnNpb25TZXF1ZW5jZSB7CisgICAgLy8vIFxicmllZiBSZXByZXNlbnRzIHRoZSBzdGFuZGFyZCBjb252ZXJzaW9uIHRoYXQgb2NjdXJzIGJlZm9yZQorICAgIC8vLyB0aGUgYWN0dWFsIHVzZXItZGVmaW5lZCBjb252ZXJzaW9uLgorICAgIC8vLworICAgIC8vLyBDKysxMSAxMy4zLjMuMS4ycDE6CisgICAgLy8vICAgSWYgdGhlIHVzZXItZGVmaW5lZCBjb252ZXJzaW9uIGlzIHNwZWNpZmllZCBieSBhIGNvbnN0cnVjdG9yCisgICAgLy8vICAgKDEyLjMuMSksIHRoZSBpbml0aWFsIHN0YW5kYXJkIGNvbnZlcnNpb24gc2VxdWVuY2UgY29udmVydHMKKyAgICAvLy8gICB0aGUgc291cmNlIHR5cGUgdG8gdGhlIHR5cGUgcmVxdWlyZWQgYnkgdGhlIGFyZ3VtZW50IG9mIHRoZQorICAgIC8vLyAgIGNvbnN0cnVjdG9yLiBJZiB0aGUgdXNlci1kZWZpbmVkIGNvbnZlcnNpb24gaXMgc3BlY2lmaWVkIGJ5CisgICAgLy8vICAgYSBjb252ZXJzaW9uIGZ1bmN0aW9uICgxMi4zLjIpLCB0aGUgaW5pdGlhbCBzdGFuZGFyZAorICAgIC8vLyAgIGNvbnZlcnNpb24gc2VxdWVuY2UgY29udmVydHMgdGhlIHNvdXJjZSB0eXBlIHRvIHRoZSBpbXBsaWNpdAorICAgIC8vLyAgIG9iamVjdCBwYXJhbWV0ZXIgb2YgdGhlIGNvbnZlcnNpb24gZnVuY3Rpb24uCisgICAgU3RhbmRhcmRDb252ZXJzaW9uU2VxdWVuY2UgQmVmb3JlOworCisgICAgLy8vIEVsbGlwc2lzQ29udmVyc2lvbiAtIFdoZW4gdGhpcyBpcyB0cnVlLCBpdCBtZWFucyB1c2VyLWRlZmluZWQKKyAgICAvLy8gY29udmVyc2lvbiBzZXF1ZW5jZSBzdGFydHMgd2l0aCBhIC4uLiAoZWxsaXBzaXMpIGNvbnZlcnNpb24sIGluc3RlYWQgb2YKKyAgICAvLy8gYSBzdGFuZGFyZCBjb252ZXJzaW9uLiBJbiB0aGlzIGNhc2UsICdCZWZvcmUnIGZpZWxkIG11c3QgYmUgaWdub3JlZC4KKyAgICAvLyBGSVhNRS4gSSBtdWNoIHJhdGhlciBwdXQgdGhpcyBhcyB0aGUgZmlyc3QgZmllbGQuIEJ1dCB0aGVyZSBzZWVtcyB0byBiZQorICAgIC8vIGEgZ2NjIGNvZGUgZ2VuLiBidWcgd2hpY2ggY2F1c2VzIGEgY3Jhc2ggaW4gYSB0ZXN0LiBQdXR0aW5nIGl0IGhlcmUgc2VlbXMKKyAgICAvLyB0byB3b3JrIGFyb3VuZCB0aGUgY3Jhc2guCisgICAgYm9vbCBFbGxpcHNpc0NvbnZlcnNpb24gOiAxOworCisgICAgLy8vIEhhZE11bHRpcGxlQ2FuZGlkYXRlcyAtIFdoZW4gdGhpcyBpcyB0cnVlLCBpdCBtZWFucyB0aGF0IHRoZQorICAgIC8vLyBjb252ZXJzaW9uIGZ1bmN0aW9uIHdhcyByZXNvbHZlZCBmcm9tIGFuIG92ZXJsb2FkZWQgc2V0IGhhdmluZworICAgIC8vLyBzaXplIGdyZWF0ZXIgdGhhbiAxLgorICAgIGJvb2wgSGFkTXVsdGlwbGVDYW5kaWRhdGVzIDogMTsKKworICAgIC8vLyBBZnRlciAtIFJlcHJlc2VudHMgdGhlIHN0YW5kYXJkIGNvbnZlcnNpb24gdGhhdCBvY2N1cnMgYWZ0ZXIKKyAgICAvLy8gdGhlIGFjdHVhbCB1c2VyLWRlZmluZWQgY29udmVyc2lvbi4KKyAgICBTdGFuZGFyZENvbnZlcnNpb25TZXF1ZW5jZSBBZnRlcjsKKworICAgIC8vLyBDb252ZXJzaW9uRnVuY3Rpb24gLSBUaGUgZnVuY3Rpb24gdGhhdCB3aWxsIHBlcmZvcm0gdGhlCisgICAgLy8vIHVzZXItZGVmaW5lZCBjb252ZXJzaW9uLiBOdWxsIGlmIHRoZSBjb252ZXJzaW9uIGlzIGFuCisgICAgLy8vIGFnZ3JlZ2F0ZSBpbml0aWFsaXphdGlvbiBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgRnVuY3Rpb25EZWNsKiBDb252ZXJzaW9uRnVuY3Rpb247CisKKyAgICAvLy8gXGJyaWVmIFRoZSBkZWNsYXJhdGlvbiB0aGF0IHdlIGZvdW5kIHZpYSBuYW1lIGxvb2t1cCwgd2hpY2ggbWlnaHQgYmUKKyAgICAvLy8gdGhlIHNhbWUgYXMgXGMgQ29udmVyc2lvbkZ1bmN0aW9uIG9yIGl0IG1pZ2h0IGJlIGEgdXNpbmcgZGVjbGFyYXRpb24KKyAgICAvLy8gdGhhdCByZWZlcnMgdG8gXGMgQ29udmVyc2lvbkZ1bmN0aW9uLgorICAgIERlY2xBY2Nlc3NQYWlyIEZvdW5kQ29udmVyc2lvbkZ1bmN0aW9uOworCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisgIH07CisKKyAgLy8vIFJlcHJlc2VudHMgYW4gYW1iaWd1b3VzIHVzZXItZGVmaW5lZCBjb252ZXJzaW9uIHNlcXVlbmNlLgorICBzdHJ1Y3QgQW1iaWd1b3VzQ29udmVyc2lvblNlcXVlbmNlIHsKKyAgICB1c2luZyBDb252ZXJzaW9uU2V0ID0KKyAgICAgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPE5hbWVkRGVjbCAqLCBGdW5jdGlvbkRlY2wgKj4sIDQ+OworCisgICAgdm9pZCAqRnJvbVR5cGVQdHI7CisgICAgdm9pZCAqVG9UeXBlUHRyOworICAgIGNoYXIgQnVmZmVyW3NpemVvZihDb252ZXJzaW9uU2V0KV07CisKKyAgICBRdWFsVHlwZSBnZXRGcm9tVHlwZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBRdWFsVHlwZTo6Z2V0RnJvbU9wYXF1ZVB0cihGcm9tVHlwZVB0cik7CisgICAgfQorCisgICAgUXVhbFR5cGUgZ2V0VG9UeXBlKCkgY29uc3QgeworICAgICAgcmV0dXJuIFF1YWxUeXBlOjpnZXRGcm9tT3BhcXVlUHRyKFRvVHlwZVB0cik7CisgICAgfQorCisgICAgdm9pZCBzZXRGcm9tVHlwZShRdWFsVHlwZSBUKSB7IEZyb21UeXBlUHRyID0gVC5nZXRBc09wYXF1ZVB0cigpOyB9CisgICAgdm9pZCBzZXRUb1R5cGUoUXVhbFR5cGUgVCkgeyBUb1R5cGVQdHIgPSBULmdldEFzT3BhcXVlUHRyKCk7IH0KKworICAgIENvbnZlcnNpb25TZXQgJmNvbnZlcnNpb25zKCkgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PENvbnZlcnNpb25TZXQqPihCdWZmZXIpOworICAgIH0KKworICAgIGNvbnN0IENvbnZlcnNpb25TZXQgJmNvbnZlcnNpb25zKCkgY29uc3QgeworICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IENvbnZlcnNpb25TZXQqPihCdWZmZXIpOworICAgIH0KKworICAgIHZvaWQgYWRkQ29udmVyc2lvbihOYW1lZERlY2wgKkZvdW5kLCBGdW5jdGlvbkRlY2wgKkQpIHsKKyAgICAgIGNvbnZlcnNpb25zKCkucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEZvdW5kLCBEKSk7CisgICAgfQorCisgICAgdXNpbmcgaXRlcmF0b3IgPSBDb252ZXJzaW9uU2V0OjppdGVyYXRvcjsKKworICAgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gY29udmVyc2lvbnMoKS5iZWdpbigpOyB9CisgICAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gY29udmVyc2lvbnMoKS5lbmQoKTsgfQorCisgICAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBDb252ZXJzaW9uU2V0Ojpjb25zdF9pdGVyYXRvcjsKKworICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29udmVyc2lvbnMoKS5iZWdpbigpOyB9CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY29udmVyc2lvbnMoKS5lbmQoKTsgfQorCisgICAgdm9pZCBjb25zdHJ1Y3QoKTsKKyAgICB2b2lkIGRlc3RydWN0KCk7CisgICAgdm9pZCBjb3B5RnJvbShjb25zdCBBbWJpZ3VvdXNDb252ZXJzaW9uU2VxdWVuY2UgJik7CisgIH07CisKKyAgLy8vIEJhZENvbnZlcnNpb25TZXF1ZW5jZSAtIFJlY29yZHMgaW5mb3JtYXRpb24gYWJvdXQgYW4gaW52YWxpZAorICAvLy8gY29udmVyc2lvbiBzZXF1ZW5jZS4KKyAgc3RydWN0IEJhZENvbnZlcnNpb25TZXF1ZW5jZSB7CisgICAgZW51bSBGYWlsdXJlS2luZCB7CisgICAgICBub19jb252ZXJzaW9uLAorICAgICAgdW5yZWxhdGVkX2NsYXNzLAorICAgICAgYmFkX3F1YWxpZmllcnMsCisgICAgICBsdmFsdWVfcmVmX3RvX3J2YWx1ZSwKKyAgICAgIHJ2YWx1ZV9yZWZfdG9fbHZhbHVlCisgICAgfTsKKworICAgIC8vIFRoaXMgY2FuIGJlIG51bGwsIGUuZy4gZm9yIGltcGxpY2l0IG9iamVjdCBhcmd1bWVudHMuCisgICAgRXhwciAqRnJvbUV4cHI7CisKKyAgICBGYWlsdXJlS2luZCBLaW5kOworCisgIHByaXZhdGU6CisgICAgLy8gVGhlIHR5cGUgd2UncmUgY29udmVydGluZyBmcm9tIChhbiBvcGFxdWUgUXVhbFR5cGUpLgorICAgIHZvaWQgKkZyb21UeTsKKworICAgIC8vIFRoZSB0eXBlIHdlJ3JlIGNvbnZlcnRpbmcgdG8gKGFuIG9wYXF1ZSBRdWFsVHlwZSkuCisgICAgdm9pZCAqVG9UeTsKKworICBwdWJsaWM6CisgICAgdm9pZCBpbml0KEZhaWx1cmVLaW5kIEssIEV4cHIgKkZyb20sIFF1YWxUeXBlIFRvKSB7CisgICAgICBpbml0KEssIEZyb20tPmdldFR5cGUoKSwgVG8pOworICAgICAgRnJvbUV4cHIgPSBGcm9tOworICAgIH0KKworICAgIHZvaWQgaW5pdChGYWlsdXJlS2luZCBLLCBRdWFsVHlwZSBGcm9tLCBRdWFsVHlwZSBUbykgeworICAgICAgS2luZCA9IEs7CisgICAgICBGcm9tRXhwciA9IG51bGxwdHI7CisgICAgICBzZXRGcm9tVHlwZShGcm9tKTsKKyAgICAgIHNldFRvVHlwZShUbyk7CisgICAgfQorCisgICAgUXVhbFR5cGUgZ2V0RnJvbVR5cGUoKSBjb25zdCB7IHJldHVybiBRdWFsVHlwZTo6Z2V0RnJvbU9wYXF1ZVB0cihGcm9tVHkpOyB9CisgICAgUXVhbFR5cGUgZ2V0VG9UeXBlKCkgY29uc3QgeyByZXR1cm4gUXVhbFR5cGU6OmdldEZyb21PcGFxdWVQdHIoVG9UeSk7IH0KKworICAgIHZvaWQgc2V0RnJvbUV4cHIoRXhwciAqRSkgeworICAgICAgRnJvbUV4cHIgPSBFOworICAgICAgc2V0RnJvbVR5cGUoRS0+Z2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICB2b2lkIHNldEZyb21UeXBlKFF1YWxUeXBlIFQpIHsgRnJvbVR5ID0gVC5nZXRBc09wYXF1ZVB0cigpOyB9CisgICAgdm9pZCBzZXRUb1R5cGUoUXVhbFR5cGUgVCkgeyBUb1R5ID0gVC5nZXRBc09wYXF1ZVB0cigpOyB9CisgIH07CisKKyAgLy8vIEltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlIC0gUmVwcmVzZW50cyBhbiBpbXBsaWNpdCBjb252ZXJzaW9uCisgIC8vLyBzZXF1ZW5jZSwgd2hpY2ggbWF5IGJlIGEgc3RhbmRhcmQgY29udmVyc2lvbiBzZXF1ZW5jZQorICAvLy8gKEMrKyAxMy4zLjMuMS4xKSwgdXNlci1kZWZpbmVkIGNvbnZlcnNpb24gc2VxdWVuY2UgKEMrKyAxMy4zLjMuMS4yKSwKKyAgLy8vIG9yIGFuIGVsbGlwc2lzIGNvbnZlcnNpb24gc2VxdWVuY2UgKEMrKyAxMy4zLjMuMS4zKS4KKyAgY2xhc3MgSW1wbGljaXRDb252ZXJzaW9uU2VxdWVuY2UgeworICBwdWJsaWM6CisgICAgLy8vIEtpbmQgLSBUaGUga2luZCBvZiBpbXBsaWNpdCBjb252ZXJzaW9uIHNlcXVlbmNlLiBCYWRDb252ZXJzaW9uCisgICAgLy8vIHNwZWNpZmllcyB0aGF0IHRoZXJlIGlzIG5vIGNvbnZlcnNpb24gZnJvbSB0aGUgc291cmNlIHR5cGUgdG8KKyAgICAvLy8gdGhlIHRhcmdldCB0eXBlLiAgQW1iaWd1b3VzQ29udmVyc2lvbiByZXByZXNlbnRzIHRoZSB1bmlxdWUKKyAgICAvLy8gYW1iaWd1b3VzIGNvbnZlcnNpb24gKEMrKzB4IFtvdmVyLmJlc3QuaWNzXXAxMCkuCisgICAgZW51bSBLaW5kIHsKKyAgICAgIFN0YW5kYXJkQ29udmVyc2lvbiA9IDAsCisgICAgICBVc2VyRGVmaW5lZENvbnZlcnNpb24sCisgICAgICBBbWJpZ3VvdXNDb252ZXJzaW9uLAorICAgICAgRWxsaXBzaXNDb252ZXJzaW9uLAorICAgICAgQmFkQ29udmVyc2lvbgorICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgIFVuaW5pdGlhbGl6ZWQgPSBCYWRDb252ZXJzaW9uICsgMQorICAgIH07CisKKyAgICAvLy8gQ29udmVyc2lvbktpbmQgLSBUaGUga2luZCBvZiBpbXBsaWNpdCBjb252ZXJzaW9uIHNlcXVlbmNlLgorICAgIHVuc2lnbmVkIENvbnZlcnNpb25LaW5kIDogMzA7CisKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhlIHRhcmdldCBpcyByZWFsbHkgYSBzdGQ6OmluaXRpYWxpemVyX2xpc3QsIGFuZCB0aGUKKyAgICAvLy8gc2VxdWVuY2Ugb25seSByZXByZXNlbnRzIHRoZSB3b3JzdCBlbGVtZW50IGNvbnZlcnNpb24uCisgICAgdW5zaWduZWQgU3RkSW5pdGlhbGl6ZXJMaXN0RWxlbWVudCA6IDE7CisKKyAgICB2b2lkIHNldEtpbmQoS2luZCBLKSB7CisgICAgICBkZXN0cnVjdCgpOworICAgICAgQ29udmVyc2lvbktpbmQgPSBLOworICAgIH0KKworICAgIHZvaWQgZGVzdHJ1Y3QoKSB7CisgICAgICBpZiAoQ29udmVyc2lvbktpbmQgPT0gQW1iaWd1b3VzQ29udmVyc2lvbikgQW1iaWd1b3VzLmRlc3RydWN0KCk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICB1bmlvbiB7CisgICAgICAvLy8gV2hlbiBDb252ZXJzaW9uS2luZCA9PSBTdGFuZGFyZENvbnZlcnNpb24sIHByb3ZpZGVzIHRoZQorICAgICAgLy8vIGRldGFpbHMgb2YgdGhlIHN0YW5kYXJkIGNvbnZlcnNpb24gc2VxdWVuY2UuCisgICAgICBTdGFuZGFyZENvbnZlcnNpb25TZXF1ZW5jZSBTdGFuZGFyZDsKKworICAgICAgLy8vIFdoZW4gQ29udmVyc2lvbktpbmQgPT0gVXNlckRlZmluZWRDb252ZXJzaW9uLCBwcm92aWRlcyB0aGUKKyAgICAgIC8vLyBkZXRhaWxzIG9mIHRoZSB1c2VyLWRlZmluZWQgY29udmVyc2lvbiBzZXF1ZW5jZS4KKyAgICAgIFVzZXJEZWZpbmVkQ29udmVyc2lvblNlcXVlbmNlIFVzZXJEZWZpbmVkOworCisgICAgICAvLy8gV2hlbiBDb252ZXJzaW9uS2luZCA9PSBBbWJpZ3VvdXNDb252ZXJzaW9uLCBwcm92aWRlcyB0aGUKKyAgICAgIC8vLyBkZXRhaWxzIG9mIHRoZSBhbWJpZ3VvdXMgY29udmVyc2lvbi4KKyAgICAgIEFtYmlndW91c0NvbnZlcnNpb25TZXF1ZW5jZSBBbWJpZ3VvdXM7CisKKyAgICAgIC8vLyBXaGVuIENvbnZlcnNpb25LaW5kID09IEJhZENvbnZlcnNpb24sIHByb3ZpZGVzIHRoZSBkZXRhaWxzCisgICAgICAvLy8gb2YgdGhlIGJhZCBjb252ZXJzaW9uLgorICAgICAgQmFkQ29udmVyc2lvblNlcXVlbmNlIEJhZDsKKyAgICB9OworCisgICAgSW1wbGljaXRDb252ZXJzaW9uU2VxdWVuY2UoKQorICAgICAgICA6IENvbnZlcnNpb25LaW5kKFVuaW5pdGlhbGl6ZWQpLCBTdGRJbml0aWFsaXplckxpc3RFbGVtZW50KGZhbHNlKSB7CisgICAgICBTdGFuZGFyZC5zZXRBc0lkZW50aXR5Q29udmVyc2lvbigpOworICAgIH0KKworICAgIEltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlKGNvbnN0IEltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlICZPdGhlcikKKyAgICAgICAgOiBDb252ZXJzaW9uS2luZChPdGhlci5Db252ZXJzaW9uS2luZCksCisgICAgICAgICAgU3RkSW5pdGlhbGl6ZXJMaXN0RWxlbWVudChPdGhlci5TdGRJbml0aWFsaXplckxpc3RFbGVtZW50KSB7CisgICAgICBzd2l0Y2ggKENvbnZlcnNpb25LaW5kKSB7CisgICAgICBjYXNlIFVuaW5pdGlhbGl6ZWQ6IGJyZWFrOworICAgICAgY2FzZSBTdGFuZGFyZENvbnZlcnNpb246IFN0YW5kYXJkID0gT3RoZXIuU3RhbmRhcmQ7IGJyZWFrOworICAgICAgY2FzZSBVc2VyRGVmaW5lZENvbnZlcnNpb246IFVzZXJEZWZpbmVkID0gT3RoZXIuVXNlckRlZmluZWQ7IGJyZWFrOworICAgICAgY2FzZSBBbWJpZ3VvdXNDb252ZXJzaW9uOiBBbWJpZ3VvdXMuY29weUZyb20oT3RoZXIuQW1iaWd1b3VzKTsgYnJlYWs7CisgICAgICBjYXNlIEVsbGlwc2lzQ29udmVyc2lvbjogYnJlYWs7CisgICAgICBjYXNlIEJhZENvbnZlcnNpb246IEJhZCA9IE90aGVyLkJhZDsgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgSW1wbGljaXRDb252ZXJzaW9uU2VxdWVuY2UgJgorICAgIG9wZXJhdG9yPShjb25zdCBJbXBsaWNpdENvbnZlcnNpb25TZXF1ZW5jZSAmT3RoZXIpIHsKKyAgICAgIGRlc3RydWN0KCk7CisgICAgICBuZXcgKHRoaXMpIEltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlKE90aGVyKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgCisgICAgfkltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlKCkgeworICAgICAgZGVzdHJ1Y3QoKTsKKyAgICB9CisKKyAgICBLaW5kIGdldEtpbmQoKSBjb25zdCB7CisgICAgICBhc3NlcnQoaXNJbml0aWFsaXplZCgpICYmICJxdWVyeWluZyB1bmluaXRpYWxpemVkIGNvbnZlcnNpb24iKTsKKyAgICAgIHJldHVybiBLaW5kKENvbnZlcnNpb25LaW5kKTsKKyAgICB9CisgICAgCisgICAgLy8vIFxicmllZiBSZXR1cm4gYSByYW5raW5nIG9mIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIHNlcXVlbmNlCisgICAgLy8vIGtpbmQsIHdoZXJlIHNtYWxsZXIgcmFua3MgcmVwcmVzZW50IGJldHRlciBjb252ZXJzaW9uCisgICAgLy8vIHNlcXVlbmNlcy4KKyAgICAvLy8KKyAgICAvLy8gSW4gcGFydGljdWxhciwgdGhpcyByb3V0aW5lIGdpdmVzIHVzZXItZGVmaW5lZCBjb252ZXJzaW9uCisgICAgLy8vIHNlcXVlbmNlcyBhbmQgYW1iaWd1b3VzIGNvbnZlcnNpb24gc2VxdWVuY2VzIHRoZSBzYW1lIHJhbmssCisgICAgLy8vIHBlciBDKysgW292ZXIuYmVzdC5pY3NdcDEwLgorICAgIHVuc2lnbmVkIGdldEtpbmRSYW5rKCkgY29uc3QgeworICAgICAgc3dpdGNoIChnZXRLaW5kKCkpIHsKKyAgICAgIGNhc2UgU3RhbmRhcmRDb252ZXJzaW9uOiAKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgIGNhc2UgVXNlckRlZmluZWRDb252ZXJzaW9uOgorICAgICAgY2FzZSBBbWJpZ3VvdXNDb252ZXJzaW9uOiAKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgIGNhc2UgRWxsaXBzaXNDb252ZXJzaW9uOgorICAgICAgICByZXR1cm4gMjsKKworICAgICAgY2FzZSBCYWRDb252ZXJzaW9uOgorICAgICAgICByZXR1cm4gMzsKKyAgICAgIH0KKworICAgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBJbXBsaWNpdENvbnZlcnNpb25TZXF1ZW5jZTo6S2luZCEiKTsKKyAgICB9CisKKyAgICBib29sIGlzQmFkKCkgY29uc3QgeyByZXR1cm4gZ2V0S2luZCgpID09IEJhZENvbnZlcnNpb247IH0KKyAgICBib29sIGlzU3RhbmRhcmQoKSBjb25zdCB7IHJldHVybiBnZXRLaW5kKCkgPT0gU3RhbmRhcmRDb252ZXJzaW9uOyB9CisgICAgYm9vbCBpc0VsbGlwc2lzKCkgY29uc3QgeyByZXR1cm4gZ2V0S2luZCgpID09IEVsbGlwc2lzQ29udmVyc2lvbjsgfQorICAgIGJvb2wgaXNBbWJpZ3VvdXMoKSBjb25zdCB7IHJldHVybiBnZXRLaW5kKCkgPT0gQW1iaWd1b3VzQ29udmVyc2lvbjsgfQorICAgIGJvb2wgaXNVc2VyRGVmaW5lZCgpIGNvbnN0IHsgcmV0dXJuIGdldEtpbmQoKSA9PSBVc2VyRGVmaW5lZENvbnZlcnNpb247IH0KKyAgICBib29sIGlzRmFpbHVyZSgpIGNvbnN0IHsgcmV0dXJuIGlzQmFkKCkgfHwgaXNBbWJpZ3VvdXMoKTsgfQorCisgICAgLy8vIERldGVybWluZXMgd2hldGhlciB0aGlzIGNvbnZlcnNpb24gc2VxdWVuY2UgaGFzIGJlZW4KKyAgICAvLy8gaW5pdGlhbGl6ZWQuICBNb3N0IG9wZXJhdGlvbnMgc2hvdWxkIG5ldmVyIG5lZWQgdG8gcXVlcnkKKyAgICAvLy8gdW5pbml0aWFsaXplZCBjb252ZXJzaW9ucyBhbmQgc2hvdWxkIGFzc2VydCBhcyBhYm92ZS4KKyAgICBib29sIGlzSW5pdGlhbGl6ZWQoKSBjb25zdCB7IHJldHVybiBDb252ZXJzaW9uS2luZCAhPSBVbmluaXRpYWxpemVkOyB9CisKKyAgICAvLy8gU2V0cyB0aGlzIHNlcXVlbmNlIGFzIGEgYmFkIGNvbnZlcnNpb24gZm9yIGFuIGV4cGxpY2l0IGFyZ3VtZW50LgorICAgIHZvaWQgc2V0QmFkKEJhZENvbnZlcnNpb25TZXF1ZW5jZTo6RmFpbHVyZUtpbmQgRmFpbHVyZSwKKyAgICAgICAgICAgICAgICBFeHByICpGcm9tRXhwciwgUXVhbFR5cGUgVG9UeXBlKSB7CisgICAgICBzZXRLaW5kKEJhZENvbnZlcnNpb24pOworICAgICAgQmFkLmluaXQoRmFpbHVyZSwgRnJvbUV4cHIsIFRvVHlwZSk7CisgICAgfQorCisgICAgLy8vIFNldHMgdGhpcyBzZXF1ZW5jZSBhcyBhIGJhZCBjb252ZXJzaW9uIGZvciBhbiBpbXBsaWNpdCBhcmd1bWVudC4KKyAgICB2b2lkIHNldEJhZChCYWRDb252ZXJzaW9uU2VxdWVuY2U6OkZhaWx1cmVLaW5kIEZhaWx1cmUsCisgICAgICAgICAgICAgICAgUXVhbFR5cGUgRnJvbVR5cGUsIFF1YWxUeXBlIFRvVHlwZSkgeworICAgICAgc2V0S2luZChCYWRDb252ZXJzaW9uKTsKKyAgICAgIEJhZC5pbml0KEZhaWx1cmUsIEZyb21UeXBlLCBUb1R5cGUpOworICAgIH0KKworICAgIHZvaWQgc2V0U3RhbmRhcmQoKSB7IHNldEtpbmQoU3RhbmRhcmRDb252ZXJzaW9uKTsgfQorICAgIHZvaWQgc2V0RWxsaXBzaXMoKSB7IHNldEtpbmQoRWxsaXBzaXNDb252ZXJzaW9uKTsgfQorICAgIHZvaWQgc2V0VXNlckRlZmluZWQoKSB7IHNldEtpbmQoVXNlckRlZmluZWRDb252ZXJzaW9uKTsgfQorCisgICAgdm9pZCBzZXRBbWJpZ3VvdXMoKSB7CisgICAgICBpZiAoQ29udmVyc2lvbktpbmQgPT0gQW1iaWd1b3VzQ29udmVyc2lvbikgcmV0dXJuOworICAgICAgQ29udmVyc2lvbktpbmQgPSBBbWJpZ3VvdXNDb252ZXJzaW9uOworICAgICAgQW1iaWd1b3VzLmNvbnN0cnVjdCgpOworICAgIH0KKworICAgIHZvaWQgc2V0QXNJZGVudGl0eUNvbnZlcnNpb24oUXVhbFR5cGUgVCkgeworICAgICAgc2V0U3RhbmRhcmQoKTsKKyAgICAgIFN0YW5kYXJkLnNldEFzSWRlbnRpdHlDb252ZXJzaW9uKCk7CisgICAgICBTdGFuZGFyZC5zZXRGcm9tVHlwZShUKTsKKyAgICAgIFN0YW5kYXJkLnNldEFsbFRvVHlwZXMoVCk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBXaGV0aGVyIHRoZSB0YXJnZXQgaXMgcmVhbGx5IGEgc3RkOjppbml0aWFsaXplcl9saXN0LCBhbmQgdGhlCisgICAgLy8vIHNlcXVlbmNlIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yc3QgZWxlbWVudCBjb252ZXJzaW9uLgorICAgIGJvb2wgaXNTdGRJbml0aWFsaXplckxpc3RFbGVtZW50KCkgY29uc3QgeworICAgICAgcmV0dXJuIFN0ZEluaXRpYWxpemVyTGlzdEVsZW1lbnQ7CisgICAgfQorCisgICAgdm9pZCBzZXRTdGRJbml0aWFsaXplckxpc3RFbGVtZW50KGJvb2wgViA9IHRydWUpIHsKKyAgICAgIFN0ZEluaXRpYWxpemVyTGlzdEVsZW1lbnQgPSBWOworICAgIH0KKworICAgIC8vIFRoZSByZXN1bHQgb2YgYSBjb21wYXJpc29uIGJldHdlZW4gaW1wbGljaXQgY29udmVyc2lvbgorICAgIC8vIHNlcXVlbmNlcy4gVXNlIFNlbWE6OkNvbXBhcmVJbXBsaWNpdENvbnZlcnNpb25TZXF1ZW5jZXMgdG8KKyAgICAvLyBhY3R1YWxseSBwZXJmb3JtIHRoZSBjb21wYXJpc29uLgorICAgIGVudW0gQ29tcGFyZUtpbmQgeworICAgICAgQmV0dGVyID0gLTEsCisgICAgICBJbmRpc3Rpbmd1aXNoYWJsZSA9IDAsCisgICAgICBXb3JzZSA9IDEKKyAgICB9OworCisgICAgdm9pZCBEaWFnbm9zZUFtYmlndW91c0NvbnZlcnNpb24oU2VtYSAmUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDYXJldExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmUERpYWcpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisgIH07CisKKyAgZW51bSBPdmVybG9hZEZhaWx1cmVLaW5kIHsKKyAgICBvdmxfZmFpbF90b29fbWFueV9hcmd1bWVudHMsCisgICAgb3ZsX2ZhaWxfdG9vX2Zld19hcmd1bWVudHMsCisgICAgb3ZsX2ZhaWxfYmFkX2NvbnZlcnNpb24sCisgICAgb3ZsX2ZhaWxfYmFkX2RlZHVjdGlvbiwKKworICAgIC8vLyBUaGlzIGNvbnZlcnNpb24gY2FuZGlkYXRlIHdhcyBub3QgY29uc2lkZXJlZCBiZWNhdXNlIGl0CisgICAgLy8vIGR1cGxpY2F0ZXMgdGhlIHdvcmsgb2YgYSB0cml2aWFsIG9yIGRlcml2ZWQtdG8tYmFzZQorICAgIC8vLyBjb252ZXJzaW9uLgorICAgIG92bF9mYWlsX3RyaXZpYWxfY29udmVyc2lvbiwKKworICAgIC8vLyBUaGlzIGNvbnZlcnNpb24gY2FuZGlkYXRlIHdhcyBub3QgY29uc2lkZXJlZCBiZWNhdXNlIGl0IGlzCisgICAgLy8vIGFuIGlsbGVnYWwgaW5zdGFudGlhdGlvbiBvZiBhIGNvbnN0cnVjdG9yIHRlbXBsb2lkOiBpdCBpcworICAgIC8vLyBjYWxsYWJsZSB3aXRoIG9uZSBhcmd1bWVudCwgd2Ugb25seSBoYXZlIG9uZSBhcmd1bWVudCwgYW5kCisgICAgLy8vIGl0cyBmaXJzdCBwYXJhbWV0ZXIgdHlwZSBpcyBleGFjdGx5IHRoZSB0eXBlIG9mIHRoZSBjbGFzcy4KKyAgICAvLy8KKyAgICAvLy8gRGVmaW5pbmcgc3VjaCBhIGNvbnN0cnVjdG9yIGRpcmVjdGx5IGlzIGlsbGVnYWwsIGFuZAorICAgIC8vLyB0ZW1wbGF0ZS1hcmd1bWVudCBkZWR1Y3Rpb24gaXMgc3VwcG9zZWQgdG8gaWdub3JlIHN1Y2gKKyAgICAvLy8gaW5zdGFudGlhdGlvbnMsIGJ1dCB3ZSBjYW4gc3RpbGwgZ2V0IG9uZSB3aXRoIHRoZSByaWdodAorICAgIC8vLyBraW5kIG9mIGltcGxpY2l0IGluc3RhbnRpYXRpb24uCisgICAgb3ZsX2ZhaWxfaWxsZWdhbF9jb25zdHJ1Y3RvciwKKworICAgIC8vLyBUaGlzIGNvbnZlcnNpb24gY2FuZGlkYXRlIGlzIG5vdCB2aWFibGUgYmVjYXVzZSBpdHMgcmVzdWx0CisgICAgLy8vIHR5cGUgaXMgbm90IGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gdGhlIGRlc2lyZWQgdHlwZS4KKyAgICBvdmxfZmFpbF9iYWRfZmluYWxfY29udmVyc2lvbiwKKworICAgIC8vLyBUaGlzIGNvbnZlcnNpb24gZnVuY3Rpb24gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gY2FuZGlkYXRlIGlzIG5vdAorICAgIC8vLyB2aWFibGUgYmVjYXVzZSB0aGUgZmluYWwgY29udmVyc2lvbiB3YXMgbm90IGFuIGV4YWN0IG1hdGNoLgorICAgIG92bF9mYWlsX2ZpbmFsX2NvbnZlcnNpb25fbm90X2V4YWN0LAorCisgICAgLy8vIChDVURBKSBUaGlzIGNhbmRpZGF0ZSB3YXMgbm90IHZpYWJsZSBiZWNhdXNlIHRoZSBjYWxsZWUKKyAgICAvLy8gd2FzIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIGNhbGxlcidzIHRhcmdldCAoaS5lLiBob3N0LT5kZXZpY2UsCisgICAgLy8vIGdsb2JhbC0+aG9zdCwgZGV2aWNlLT5ob3N0KS4KKyAgICBvdmxfZmFpbF9iYWRfdGFyZ2V0LAorCisgICAgLy8vIFRoaXMgY2FuZGlkYXRlIGZ1bmN0aW9uIHdhcyBub3QgdmlhYmxlIGJlY2F1c2UgYW4gZW5hYmxlX2lmCisgICAgLy8vIGF0dHJpYnV0ZSBkaXNhYmxlZCBpdC4KKyAgICBvdmxfZmFpbF9lbmFibGVfaWYsCisKKyAgICAvLy8gVGhpcyBjYW5kaWRhdGUgd2FzIG5vdCB2aWFibGUgYmVjYXVzZSBpdHMgYWRkcmVzcyBjb3VsZCBub3QgYmUgdGFrZW4uCisgICAgb3ZsX2ZhaWxfYWRkcl9ub3RfYXZhaWxhYmxlLAorCisgICAgLy8vIFRoaXMgY2FuZGlkYXRlIHdhcyBub3QgdmlhYmxlIGJlY2F1c2UgaXRzIE9wZW5DTCBleHRlbnNpb24gaXMgZGlzYWJsZWQuCisgICAgb3ZsX2ZhaWxfZXh0X2Rpc2FibGVkLAorCisgICAgLy8vIFRoaXMgaW5oZXJpdGVkIGNvbnN0cnVjdG9yIGlzIG5vdCB2aWFibGUgYmVjYXVzZSBpdCB3b3VsZCBzbGljZSB0aGUKKyAgICAvLy8gYXJndW1lbnQuCisgICAgb3ZsX2ZhaWxfaW5oY3Rvcl9zbGljZSwKKworICAgIC8vLyBUaGlzIGNhbmRpZGF0ZSB3YXMgbm90IHZpYWJsZSBiZWNhdXNlIGl0IGlzIGEgbm9uLWRlZmF1bHQgbXVsdGl2ZXJzaW9uZWQKKyAgICAvLy8gZnVuY3Rpb24uCisgICAgb3ZsX25vbl9kZWZhdWx0X211bHRpdmVyc2lvbl9mdW5jdGlvbiwKKyAgfTsKKworICAvLy8gQSBsaXN0IG9mIGltcGxpY2l0IGNvbnZlcnNpb24gc2VxdWVuY2VzIGZvciB0aGUgYXJndW1lbnRzIG9mIGFuCisgIC8vLyBPdmVybG9hZENhbmRpZGF0ZS4KKyAgdXNpbmcgQ29udmVyc2lvblNlcXVlbmNlTGlzdCA9CisgICAgICBsbHZtOjpNdXRhYmxlQXJyYXlSZWY8SW1wbGljaXRDb252ZXJzaW9uU2VxdWVuY2U+OworCisgIC8vLyBPdmVybG9hZENhbmRpZGF0ZSAtIEEgc2luZ2xlIGNhbmRpZGF0ZSBpbiBhbiBvdmVybG9hZCBzZXQgKEMrKyAxMy4zKS4KKyAgc3RydWN0IE92ZXJsb2FkQ2FuZGlkYXRlIHsKKyAgICAvLy8gRnVuY3Rpb24gLSBUaGUgYWN0dWFsIGZ1bmN0aW9uIHRoYXQgdGhpcyBjYW5kaWRhdGUKKyAgICAvLy8gcmVwcmVzZW50cy4gV2hlbiBOVUxMLCB0aGlzIGlzIGEgYnVpbHQtaW4gY2FuZGlkYXRlCisgICAgLy8vIChDKysgW292ZXIub3Blcl0pIG9yIGEgc3Vycm9nYXRlIGZvciBhIGNvbnZlcnNpb24gdG8gYQorICAgIC8vLyBmdW5jdGlvbiBwb2ludGVyIG9yIHJlZmVyZW5jZSAoQysrIFtvdmVyLmNhbGwub2JqZWN0XSkuCisgICAgRnVuY3Rpb25EZWNsICpGdW5jdGlvbjsKKworICAgIC8vLyBGb3VuZERlY2wgLSBUaGUgb3JpZ2luYWwgZGVjbGFyYXRpb24gdGhhdCB3YXMgbG9va2VkIHVwIC8KKyAgICAvLy8gaW52ZW50ZWQgLyBvdGhlcndpc2UgZm91bmQsIHRvZ2V0aGVyIHdpdGggaXRzIGFjY2Vzcy4KKyAgICAvLy8gTWlnaHQgYmUgYSBVc2luZ1NoYWRvd0RlY2wgb3IgYSBGdW5jdGlvblRlbXBsYXRlRGVjbC4KKyAgICBEZWNsQWNjZXNzUGFpciBGb3VuZERlY2w7CisKKyAgICAvLy8gQnVpbHRpblBhcmFtVHlwZXMgLSBQcm92aWRlcyB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIGEgYnVpbHQtaW4gb3ZlcmxvYWQKKyAgICAvLy8gY2FuZGlkYXRlLiBPbmx5IHZhbGlkIHdoZW4gRnVuY3Rpb24gaXMgTlVMTC4KKyAgICBRdWFsVHlwZSBCdWlsdGluUGFyYW1UeXBlc1szXTsKKworICAgIC8vLyBTdXJyb2dhdGUgLSBUaGUgY29udmVyc2lvbiBmdW5jdGlvbiBmb3Igd2hpY2ggdGhpcyBjYW5kaWRhdGUKKyAgICAvLy8gaXMgYSBzdXJyb2dhdGUsIGJ1dCBvbmx5IGlmIElzU3Vycm9nYXRlIGlzIHRydWUuCisgICAgQ1hYQ29udmVyc2lvbkRlY2wgKlN1cnJvZ2F0ZTsKKworICAgIC8vLyBUaGUgY29udmVyc2lvbiBzZXF1ZW5jZXMgdXNlZCB0byBjb252ZXJ0IHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICAvLy8gdG8gdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCisgICAgQ29udmVyc2lvblNlcXVlbmNlTGlzdCBDb252ZXJzaW9uczsKKworICAgIC8vLyBUaGUgRml4SXQgaGludHMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZml4IHRoZSBCYWQgY2FuZGlkYXRlLgorICAgIENvbnZlcnNpb25GaXhJdEdlbmVyYXRvciBGaXg7CisKKyAgICAvLy8gVmlhYmxlIC0gVHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgb3ZlcmxvYWQgY2FuZGlkYXRlIGlzIHZpYWJsZS4KKyAgICBib29sIFZpYWJsZTsKKworICAgIC8vLyBJc1N1cnJvZ2F0ZSAtIFRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGNhbmRpZGF0ZSBpcyBhCisgICAgLy8vIHN1cnJvZ2F0ZSBmb3IgYSBjb252ZXJzaW9uIHRvIGEgZnVuY3Rpb24gcG9pbnRlciBvciByZWZlcmVuY2UKKyAgICAvLy8gKEMrKyBbb3Zlci5jYWxsLm9iamVjdF0pLgorICAgIGJvb2wgSXNTdXJyb2dhdGU7CisKKyAgICAvLy8gSWdub3JlT2JqZWN0QXJndW1lbnQgLSBUcnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIGZpcnN0CisgICAgLy8vIGFyZ3VtZW50J3MgY29udmVyc2lvbiwgd2hpY2ggZm9yIHRoaXMgZnVuY3Rpb24gcmVwcmVzZW50cyB0aGUKKyAgICAvLy8gaW1wbGljaXQgb2JqZWN0IGFyZ3VtZW50LCBzaG91bGQgYmUgaWdub3JlZC4gVGhpcyB3aWxsIGJlIHRydWUKKyAgICAvLy8gd2hlbiB0aGUgY2FuZGlkYXRlIGlzIGEgc3RhdGljIG1lbWJlciBmdW5jdGlvbiAod2hlcmUgdGhlCisgICAgLy8vIGltcGxpY2l0IG9iamVjdCBhcmd1bWVudCBpcyBqdXN0IGEgcGxhY2Vob2xkZXIpIG9yIGEKKyAgICAvLy8gbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gd2hlbiB0aGUgY2FsbCBkb2Vzbid0IGhhdmUgYW4KKyAgICAvLy8gb2JqZWN0IGFyZ3VtZW50LgorICAgIGJvb2wgSWdub3JlT2JqZWN0QXJndW1lbnQ7CisKKyAgICAvLy8gRmFpbHVyZUtpbmQgLSBUaGUgcmVhc29uIHdoeSB0aGlzIGNhbmRpZGF0ZSBpcyBub3QgdmlhYmxlLgorICAgIC8vLyBBY3R1YWxseSBhbiBPdmVybG9hZEZhaWx1cmVLaW5kLgorICAgIHVuc2lnbmVkIGNoYXIgRmFpbHVyZUtpbmQ7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgY2FsbCBhcmd1bWVudHMgdGhhdCB3ZXJlIGV4cGxpY2l0bHkgcHJvdmlkZWQsCisgICAgLy8vIHRvIGJlIHVzZWQgd2hpbGUgcGVyZm9ybWluZyBwYXJ0aWFsIG9yZGVyaW5nIG9mIGZ1bmN0aW9uIHRlbXBsYXRlcy4KKyAgICB1bnNpZ25lZCBFeHBsaWNpdENhbGxBcmd1bWVudHM7CisKKyAgICB1bmlvbiB7CisgICAgICBEZWR1Y3Rpb25GYWlsdXJlSW5mbyBEZWR1Y3Rpb25GYWlsdXJlOworICAgICAgCisgICAgICAvLy8gRmluYWxDb252ZXJzaW9uIC0gRm9yIGEgY29udmVyc2lvbiBmdW5jdGlvbiAod2hlcmUgRnVuY3Rpb24gaXMKKyAgICAgIC8vLyBhIENYWENvbnZlcnNpb25EZWNsKSwgdGhlIHN0YW5kYXJkIGNvbnZlcnNpb24gdGhhdCBvY2N1cnMKKyAgICAgIC8vLyBhZnRlciB0aGUgY2FsbCB0byB0aGUgb3ZlcmxvYWQgY2FuZGlkYXRlIHRvIGNvbnZlcnQgdGhlIHJlc3VsdAorICAgICAgLy8vIG9mIGNhbGxpbmcgdGhlIGNvbnZlcnNpb24gZnVuY3Rpb24gdG8gdGhlIHJlcXVpcmVkIHR5cGUuCisgICAgICBTdGFuZGFyZENvbnZlcnNpb25TZXF1ZW5jZSBGaW5hbENvbnZlcnNpb247CisgICAgfTsKKworICAgIC8vLyBoYXNBbWJpZ3VvdXNDb252ZXJzaW9uIC0gUmV0dXJucyB3aGV0aGVyIHRoaXMgb3ZlcmxvYWQKKyAgICAvLy8gY2FuZGlkYXRlIHJlcXVpcmVzIGFuIGFtYmlndW91cyBjb252ZXJzaW9uIG9yIG5vdC4KKyAgICBib29sIGhhc0FtYmlndW91c0NvbnZlcnNpb24oKSBjb25zdCB7CisgICAgICBmb3IgKGF1dG8gJkMgOiBDb252ZXJzaW9ucykgeworICAgICAgICBpZiAoIUMuaXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChDLmlzQW1iaWd1b3VzKCkpIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgVHJ5VG9GaXhCYWRDb252ZXJzaW9uKHVuc2lnbmVkIElkeCwgU2VtYSAmUykgeworICAgICAgYm9vbCBDYW5GaXggPSBGaXgudHJ5VG9GaXhDb252ZXJzaW9uKAorICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnNpb25zW0lkeF0uQmFkLkZyb21FeHByLAorICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnNpb25zW0lkeF0uQmFkLmdldEZyb21UeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbnNbSWR4XS5CYWQuZ2V0VG9UeXBlKCksIFMpOworCisgICAgICAvLyBJZiBhdCBsZWFzdCBvbmUgY29udmVyc2lvbiBmYWlscywgdGhlIGNhbmRpZGF0ZSBjYW5ub3QgYmUgZml4ZWQuCisgICAgICBpZiAoIUNhbkZpeCkKKyAgICAgICAgRml4LmNsZWFyKCk7CisKKyAgICAgIHJldHVybiBDYW5GaXg7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0TnVtUGFyYW1zKCkgY29uc3QgeworICAgICAgaWYgKElzU3Vycm9nYXRlKSB7CisgICAgICAgIGF1dG8gU1R5ID0gU3Vycm9nYXRlLT5nZXRDb252ZXJzaW9uVHlwZSgpOworICAgICAgICB3aGlsZSAoU1R5LT5pc1BvaW50ZXJUeXBlKCkgfHwgU1R5LT5pc1JlZmVyZW5jZVR5cGUoKSkKKyAgICAgICAgICBTVHkgPSBTVHktPmdldFBvaW50ZWVUeXBlKCk7CisgICAgICAgIHJldHVybiBTVHktPmdldEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpLT5nZXROdW1QYXJhbXMoKTsKKyAgICAgIH0KKyAgICAgIGlmIChGdW5jdGlvbikKKyAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLT5nZXROdW1QYXJhbXMoKTsKKyAgICAgIHJldHVybiBFeHBsaWNpdENhbGxBcmd1bWVudHM7CisgICAgfQorICB9OworCisgIC8vLyBPdmVybG9hZENhbmRpZGF0ZVNldCAtIEEgc2V0IG9mIG92ZXJsb2FkIGNhbmRpZGF0ZXMsIHVzZWQgaW4gQysrCisgIC8vLyBvdmVybG9hZCByZXNvbHV0aW9uIChDKysgMTMuMykuCisgIGNsYXNzIE92ZXJsb2FkQ2FuZGlkYXRlU2V0IHsKKyAgcHVibGljOgorICAgIGVudW0gQ2FuZGlkYXRlU2V0S2luZCB7CisgICAgICAvLy8gTm9ybWFsIGxvb2t1cC4KKyAgICAgIENTS19Ob3JtYWwsCisKKyAgICAgIC8vLyBDKysgW292ZXIubWF0Y2gub3Blcl06CisgICAgICAvLy8gTG9va3VwIG9mIG9wZXJhdG9yIGZ1bmN0aW9uIGNhbmRpZGF0ZXMgaW4gYSBjYWxsIHVzaW5nIG9wZXJhdG9yCisgICAgICAvLy8gc3ludGF4LiBDYW5kaWRhdGVzIHRoYXQgaGF2ZSBubyBwYXJhbWV0ZXJzIG9mIGNsYXNzIHR5cGUgd2lsbCBiZQorICAgICAgLy8vIHNraXBwZWQgdW5sZXNzIHRoZXJlIGlzIGEgcGFyYW1ldGVyIG9mIChyZWZlcmVuY2UgdG8pIGVudW0gdHlwZSBhbmQKKyAgICAgIC8vLyB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudCBpcyBvZiB0aGUgc2FtZSBlbnVtIHR5cGUuCisgICAgICBDU0tfT3BlcmF0b3IsCisKKyAgICAgIC8vLyBDKysgW292ZXIubWF0Y2guY29weV06CisgICAgICAvLy8gQ29weS1pbml0aWFsaXphdGlvbiBvZiBhbiBvYmplY3Qgb2YgY2xhc3MgdHlwZSBieSB1c2VyLWRlZmluZWQKKyAgICAgIC8vLyBjb252ZXJzaW9uLgorICAgICAgQ1NLX0luaXRCeVVzZXJEZWZpbmVkQ29udmVyc2lvbiwKKworICAgICAgLy8vIEMrKyBbb3Zlci5tYXRjaC5jdG9yXSwgW292ZXIubWF0Y2gubGlzdF0KKyAgICAgIC8vLyBJbml0aWFsaXphdGlvbiBvZiBhbiBvYmplY3Qgb2YgY2xhc3MgdHlwZSBieSBjb25zdHJ1Y3RvciwKKyAgICAgIC8vLyB1c2luZyBlaXRoZXIgYSBwYXJlbnRoZXNpemVkIG9yIGJyYWNlZCBsaXN0IG9mIGFyZ3VtZW50cy4KKyAgICAgIENTS19Jbml0QnlDb25zdHJ1Y3RvciwKKyAgICB9OworCisgIHByaXZhdGU6CisgICAgU21hbGxWZWN0b3I8T3ZlcmxvYWRDYW5kaWRhdGUsIDE2PiBDYW5kaWRhdGVzOworICAgIGxsdm06OlNtYWxsUHRyU2V0PERlY2wgKiwgMTY+IEZ1bmN0aW9uczsKKworICAgIC8vIEFsbG9jYXRvciBmb3IgQ29udmVyc2lvblNlcXVlbmNlTGlzdHMuIFdlIHN0b3JlIHRoZSBmaXJzdCBmZXcgb2YgdGhlc2UKKyAgICAvLyBpbmxpbmUgdG8gYXZvaWQgYWxsb2NhdGlvbiBmb3Igc21hbGwgc2V0cy4KKyAgICBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yIFNsYWJBbGxvY2F0b3I7CisKKyAgICBTb3VyY2VMb2NhdGlvbiBMb2M7CisgICAgQ2FuZGlkYXRlU2V0S2luZCBLaW5kOworCisgICAgY29uc3RleHByIHN0YXRpYyB1bnNpZ25lZCBOdW1JbmxpbmVCeXRlcyA9CisgICAgICAgIDI0ICogc2l6ZW9mKEltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlKTsKKyAgICB1bnNpZ25lZCBOdW1JbmxpbmVCeXRlc1VzZWQgPSAwOworICAgIGxsdm06OkFsaWduZWRDaGFyQXJyYXk8YWxpZ25vZih2b2lkICopLCBOdW1JbmxpbmVCeXRlcz4gSW5saW5lU3BhY2U7CisKKyAgICAvLy8gSWYgd2UgaGF2ZSBzcGFjZSwgYWxsb2NhdGVzIGZyb20gaW5saW5lIHN0b3JhZ2UuIE90aGVyd2lzZSwgYWxsb2NhdGVzCisgICAgLy8vIGZyb20gdGhlIHNsYWIgYWxsb2NhdG9yLgorICAgIC8vLyBGSVhNRTogSXQgd291bGQgcHJvYmFibHkgYmUgbmljZSB0byBoYXZlIGEgU21hbGxCdW1wUHRyQWxsb2NhdG9yCisgICAgLy8vIGluc3RlYWQuCisgICAgLy8vIEZJWE1FOiBOb3cgdGhhdCB0aGlzIG9ubHkgYWxsb2NhdGVzIEltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlcywgZG8gd2UKKyAgICAvLy8gd2FudCB0byB1bi1nZW5lcmFsaXplIHRoaXM/CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgVCAqc2xhYkFsbG9jYXRlKHVuc2lnbmVkIE4pIHsKKyAgICAgIC8vIEl0J3Mgc2ltcGxlciBpZiB0aGlzIGRvZXNuJ3QgbmVlZCB0byBjb25zaWRlciBhbGlnbm1lbnQuCisgICAgICBzdGF0aWNfYXNzZXJ0KGFsaWdub2YoVCkgPT0gYWxpZ25vZih2b2lkICopLAorICAgICAgICAgICAgICAgICAgICAiT25seSB3b3JrcyBmb3IgcG9pbnRlci1hbGlnbmVkIHR5cGVzLiIpOworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3RyaXZpYWw8VD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8SW1wbGljaXRDb252ZXJzaW9uU2VxdWVuY2UsIFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIkFkZCBkZXN0cnVjdGlvbiBsb2dpYyB0byBPdmVybG9hZENhbmRpZGF0ZVNldDo6Y2xlYXIoKS4iKTsKKworICAgICAgdW5zaWduZWQgTkJ5dGVzID0gc2l6ZW9mKFQpICogTjsKKyAgICAgIGlmIChOQnl0ZXMgPiBOdW1JbmxpbmVCeXRlcyAtIE51bUlubGluZUJ5dGVzVXNlZCkKKyAgICAgICAgcmV0dXJuIFNsYWJBbGxvY2F0b3IuQWxsb2NhdGU8VD4oTik7CisgICAgICBjaGFyICpGcmVlU3BhY2VTdGFydCA9IElubGluZVNwYWNlLmJ1ZmZlciArIE51bUlubGluZUJ5dGVzVXNlZDsKKyAgICAgIGFzc2VydCh1aW50cHRyX3QoRnJlZVNwYWNlU3RhcnQpICUgYWxpZ25vZih2b2lkICopID09IDAgJiYKKyAgICAgICAgICAgICAiTWlzYWxpZ25lZCBzdG9yYWdlISIpOworCisgICAgICBOdW1JbmxpbmVCeXRlc1VzZWQgKz0gTkJ5dGVzOworICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCAqPihGcmVlU3BhY2VTdGFydCk7CisgICAgfQorCisgICAgdm9pZCBkZXN0cm95Q2FuZGlkYXRlcygpOworCisgIHB1YmxpYzoKKyAgICBPdmVybG9hZENhbmRpZGF0ZVNldChTb3VyY2VMb2NhdGlvbiBMb2MsIENhbmRpZGF0ZVNldEtpbmQgQ1NLKQorICAgICAgICA6IExvYyhMb2MpLCBLaW5kKENTSykge30KKyAgICBPdmVybG9hZENhbmRpZGF0ZVNldChjb25zdCBPdmVybG9hZENhbmRpZGF0ZVNldCAmKSA9IGRlbGV0ZTsKKyAgICBPdmVybG9hZENhbmRpZGF0ZVNldCAmb3BlcmF0b3I9KGNvbnN0IE92ZXJsb2FkQ2FuZGlkYXRlU2V0ICYpID0gZGVsZXRlOworICAgIH5PdmVybG9hZENhbmRpZGF0ZVNldCgpIHsgZGVzdHJveUNhbmRpZGF0ZXMoKTsgfQorCisgICAgU291cmNlTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKyAgICBDYW5kaWRhdGVTZXRLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgICAvLy8gXGJyaWVmIERldGVybWluZSB3aGVuIHRoaXMgb3ZlcmxvYWQgY2FuZGlkYXRlIHdpbGwgYmUgbmV3IHRvIHRoZQorICAgIC8vLyBvdmVybG9hZCBzZXQuCisgICAgYm9vbCBpc05ld0NhbmRpZGF0ZShEZWNsICpGKSB7CisgICAgICByZXR1cm4gRnVuY3Rpb25zLmluc2VydChGLT5nZXRDYW5vbmljYWxEZWNsKCkpLnNlY29uZDsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIENsZWFyIG91dCBhbGwgb2YgdGhlIGNhbmRpZGF0ZXMuCisgICAgdm9pZCBjbGVhcihDYW5kaWRhdGVTZXRLaW5kIENTSyk7CisKKyAgICB1c2luZyBpdGVyYXRvciA9IFNtYWxsVmVjdG9ySW1wbDxPdmVybG9hZENhbmRpZGF0ZT46Oml0ZXJhdG9yOworCisgICAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBDYW5kaWRhdGVzLmJlZ2luKCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBDYW5kaWRhdGVzLmVuZCgpOyB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIENhbmRpZGF0ZXMuc2l6ZSgpOyB9CisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIENhbmRpZGF0ZXMuZW1wdHkoKTsgfQorCisgICAgLy8vIFxicmllZiBBbGxvY2F0ZSBzdG9yYWdlIGZvciBjb252ZXJzaW9uIHNlcXVlbmNlcyBmb3IgTnVtQ29udmVyc2lvbnMKKyAgICAvLy8gY29udmVyc2lvbnMuCisgICAgQ29udmVyc2lvblNlcXVlbmNlTGlzdAorICAgIGFsbG9jYXRlQ29udmVyc2lvblNlcXVlbmNlcyh1bnNpZ25lZCBOdW1Db252ZXJzaW9ucykgeworICAgICAgSW1wbGljaXRDb252ZXJzaW9uU2VxdWVuY2UgKkNvbnZlcnNpb25zID0KKyAgICAgICAgICBzbGFiQWxsb2NhdGU8SW1wbGljaXRDb252ZXJzaW9uU2VxdWVuY2U+KE51bUNvbnZlcnNpb25zKTsKKworICAgICAgLy8gQ29uc3RydWN0IHRoZSBuZXcgb2JqZWN0cy4KKyAgICAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgIT0gTnVtQ29udmVyc2lvbnM7ICsrSSkKKyAgICAgICAgbmV3ICgmQ29udmVyc2lvbnNbSV0pIEltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlKCk7CisKKyAgICAgIHJldHVybiBDb252ZXJzaW9uU2VxdWVuY2VMaXN0KENvbnZlcnNpb25zLCBOdW1Db252ZXJzaW9ucyk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBBZGQgYSBuZXcgY2FuZGlkYXRlIHdpdGggTnVtQ29udmVyc2lvbnMgY29udmVyc2lvbiBzZXF1ZW5jZSBzbG90cworICAgIC8vLyB0byB0aGUgb3ZlcmxvYWQgc2V0LgorICAgIE92ZXJsb2FkQ2FuZGlkYXRlICZhZGRDYW5kaWRhdGUodW5zaWduZWQgTnVtQ29udmVyc2lvbnMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvblNlcXVlbmNlTGlzdCBDb252ZXJzaW9ucyA9IE5vbmUpIHsKKyAgICAgIGFzc2VydCgoQ29udmVyc2lvbnMuZW1wdHkoKSB8fCBDb252ZXJzaW9ucy5zaXplKCkgPT0gTnVtQ29udmVyc2lvbnMpICYmCisgICAgICAgICAgICAgInByZWFsbG9jYXRlZCBjb252ZXJzaW9uIHNlcXVlbmNlIGhhcyB3cm9uZyBsZW5ndGgiKTsKKworICAgICAgQ2FuZGlkYXRlcy5wdXNoX2JhY2soT3ZlcmxvYWRDYW5kaWRhdGUoKSk7CisgICAgICBPdmVybG9hZENhbmRpZGF0ZSAmQyA9IENhbmRpZGF0ZXMuYmFjaygpOworICAgICAgQy5Db252ZXJzaW9ucyA9IENvbnZlcnNpb25zLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhbGxvY2F0ZUNvbnZlcnNpb25TZXF1ZW5jZXMoTnVtQ29udmVyc2lvbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ29udmVyc2lvbnM7CisgICAgICByZXR1cm4gQzsKKyAgICB9CisKKyAgICAvLy8gRmluZCB0aGUgYmVzdCB2aWFibGUgZnVuY3Rpb24gb24gdGhpcyBvdmVybG9hZCBzZXQsIGlmIGl0IGV4aXN0cy4KKyAgICBPdmVybG9hZGluZ1Jlc3VsdCBCZXN0VmlhYmxlRnVuY3Rpb24oU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVybG9hZENhbmRpZGF0ZVNldDo6aXRlcmF0b3ImIEJlc3QpOworCisgICAgdm9pZCBOb3RlQ2FuZGlkYXRlcyhTZW1hICZTLAorICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmxvYWRDYW5kaWRhdGVEaXNwbGF5S2luZCBPQ0QsCisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgT3BjID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MgPSBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6ZnVuY3Rpb25fcmVmPGJvb2woT3ZlcmxvYWRDYW5kaWRhdGUmKT4gRmlsdGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgW10oT3ZlcmxvYWRDYW5kaWRhdGUmKSB7IHJldHVybiB0cnVlOyB9KTsKKyAgfTsKKworICBib29sIGlzQmV0dGVyT3ZlcmxvYWRDYW5kaWRhdGUoU2VtYSAmUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE92ZXJsb2FkQ2FuZGlkYXRlICZDYW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE92ZXJsb2FkQ2FuZGlkYXRlICZDYW5kMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJsb2FkQ2FuZGlkYXRlU2V0OjpDYW5kaWRhdGVTZXRLaW5kIEtpbmQpOworCisgIHN0cnVjdCBDb25zdHJ1Y3RvckluZm8geworICAgIERlY2xBY2Nlc3NQYWlyIEZvdW5kRGVjbDsKKyAgICBDWFhDb25zdHJ1Y3RvckRlY2wgKkNvbnN0cnVjdG9yOworICAgIEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpDb25zdHJ1Y3RvclRtcGw7CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gQ29uc3RydWN0b3I7IH0KKyAgfTsKKworICAvLyBGSVhNRTogQWRkIGFuIEFkZE92ZXJsb2FkQ2FuZGlkYXRlIC8gQWRkVGVtcGxhdGVPdmVybG9hZENhbmRpZGF0ZSBvdmVybG9hZAorICAvLyB0aGF0IHRha2VzIG9uZSBvZiB0aGVzZS4KKyAgaW5saW5lIENvbnN0cnVjdG9ySW5mbyBnZXRDb25zdHJ1Y3RvckluZm8oTmFtZWREZWNsICpORCkgeworICAgIGlmIChpc2E8VXNpbmdEZWNsPihORCkpCisgICAgICByZXR1cm4gQ29uc3RydWN0b3JJbmZve307CisKKyAgICAvLyBGb3IgY29uc3RydWN0b3JzLCB0aGUgYWNjZXNzIGNoZWNrIGlzIHBlcmZvcm1lZCBhZ2FpbnN0IHRoZSB1bmRlcmx5aW5nCisgICAgLy8gZGVjbGFyYXRpb24sIG5vdCB0aGUgZm91bmQgZGVjbGFyYXRpb24uCisgICAgYXV0byAqRCA9IE5ELT5nZXRVbmRlcmx5aW5nRGVjbCgpOworICAgIENvbnN0cnVjdG9ySW5mbyBJbmZvID0ge0RlY2xBY2Nlc3NQYWlyOjptYWtlKE5ELCBELT5nZXRBY2Nlc3MoKSksIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cn07CisgICAgSW5mby5Db25zdHJ1Y3RvclRtcGwgPSBkeW5fY2FzdDxGdW5jdGlvblRlbXBsYXRlRGVjbD4oRCk7CisgICAgaWYgKEluZm8uQ29uc3RydWN0b3JUbXBsKQorICAgICAgRCA9IEluZm8uQ29uc3RydWN0b3JUbXBsLT5nZXRUZW1wbGF0ZWREZWNsKCk7CisgICAgSW5mby5Db25zdHJ1Y3RvciA9IGR5bl9jYXN0PENYWENvbnN0cnVjdG9yRGVjbD4oRCk7CisgICAgcmV0dXJuIEluZm87CisgIH0KKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfU0VNQV9PVkVSTE9BRF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL093bmVyc2hpcC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9Pd25lcnNoaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTM4MmMzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9Pd25lcnNoaXAuaApAQCAtMCwwICsxLDMwNCBAQAorLy89PT0tIE93bmVyc2hpcC5oIC0gUGFyc2VyIG93bmVyc2hpcCBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGNvbnRhaW5zIGNsYXNzZXMgZm9yIG1hbmFnaW5nIG93bmVyc2hpcCBvZiBTdG10IGFuZCBFeHByIG5vZGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TRU1BX09XTkVSU0hJUF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU0VNQV9PV05FUlNISVBfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHIuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBPcGFxdWVQdHIKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIENYWEJhc2VTcGVjaWZpZXI7CitjbGFzcyBDWFhDdG9ySW5pdGlhbGl6ZXI7CitjbGFzcyBEZWNsOworY2xhc3MgRXhwcjsKK2NsYXNzIFBhcnNlZFRlbXBsYXRlQXJndW1lbnQ7CitjbGFzcyBRdWFsVHlwZTsKK2NsYXNzIFN0bXQ7CitjbGFzcyBUZW1wbGF0ZU5hbWU7CitjbGFzcyBUZW1wbGF0ZVBhcmFtZXRlckxpc3Q7CisKKyAgLy8vIFxicmllZiBXcmFwcGVyIGZvciB2b2lkKiBwb2ludGVyLgorICAvLy8gXHRwYXJhbSBQdHJUeSBFaXRoZXIgYSBwb2ludGVyIHR5cGUgbGlrZSAnVConIG9yIGEgdHlwZSB0aGF0IGJlaGF2ZXMgbGlrZQorICAvLy8gICAgICAgICAgICAgICBhIHBvaW50ZXIuCisgIC8vLworICAvLy8gVGhpcyBpcyBhIHZlcnkgc2ltcGxlIFBPRCB0eXBlIHRoYXQgd3JhcHMgYSBwb2ludGVyIHRoYXQgdGhlIFBhcnNlcgorICAvLy8gZG9lc24ndCBrbm93IGFib3V0IGJ1dCB0aGF0IFNlbWEgb3IgYW5vdGhlciBjbGllbnQgZG9lcy4gIFRoZSBQdHJUeQorICAvLy8gdGVtcGxhdGUgYXJndW1lbnQgaXMgdXNlZCB0byBtYWtlIHN1cmUgdGhhdCAiRGVjbCIgcG9pbnRlcnMgYXJlIG5vdAorICAvLy8gY29tcGF0aWJsZSB3aXRoICJUeXBlIiBwb2ludGVycyBmb3IgZXhhbXBsZS4KKyAgdGVtcGxhdGUgPGNsYXNzIFB0clR5PgorICBjbGFzcyBPcGFxdWVQdHIgeworICAgIHZvaWQgKlB0ciA9IG51bGxwdHI7CisKKyAgICBleHBsaWNpdCBPcGFxdWVQdHIodm9pZCAqUHRyKSA6IFB0cihQdHIpIHt9CisKKyAgICB1c2luZyBUcmFpdHMgPSBsbHZtOjpQb2ludGVyTGlrZVR5cGVUcmFpdHM8UHRyVHk+OworCisgIHB1YmxpYzoKKyAgICBPcGFxdWVQdHIoc3RkOjpudWxscHRyX3QgPSBudWxscHRyKSB7fQorCisgICAgc3RhdGljIE9wYXF1ZVB0ciBtYWtlKFB0clR5IFApIHsgT3BhcXVlUHRyIE9QOyBPUC5zZXQoUCk7IHJldHVybiBPUDsgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm5zIHBsYWluIHBvaW50ZXIgdG8gdGhlIGVudGl0eSBwb2ludGVkIGJ5IHRoaXMgd3JhcHBlci4KKyAgICAvLy8gXHRwYXJhbSBQb2ludGVlVCBUeXBlIG9mIHBvaW50ZWQgZW50aXR5LgorICAgIC8vLworICAgIC8vLyBJdCBpcyBpZGVudGljYWwgdG8gZ2V0UHRyQXM8UG9pbnRlZVQqPi4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlZVQ+IFBvaW50ZWVUKiBnZXRQdHJUbygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXQoKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJldHVybnMgcG9pbnRlciBjb252ZXJ0ZWQgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgorICAgIC8vLyBcdHBhcmFtIFB0clQgUmVzdWx0IHBvaW50ZXIgdHlwZS4gIFRoZXJlIG11c3QgYmUgaW1wbGljaXQgY29udmVyc2lvbgorICAgIC8vLyAgICAgICAgICAgICAgZnJvbSBQdHJUeSB0byBQdHJULgorICAgIC8vLworICAgIC8vLyBJbiBjb250cmFzdCB0byBnZXRQdHJUbywgdGhpcyBtZXRob2QgYWxsb3dzIHRoZSByZXR1cm4gdHlwZSB0byBiZQorICAgIC8vLyBhIHNtYXJ0IHBvaW50ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFB0clQ+IFB0clQgZ2V0UHRyQXMoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0KCk7CisgICAgfQorCisgICAgUHRyVHkgZ2V0KCkgY29uc3QgeworICAgICAgcmV0dXJuIFRyYWl0czo6Z2V0RnJvbVZvaWRQb2ludGVyKFB0cik7CisgICAgfQorCisgICAgdm9pZCBzZXQoUHRyVHkgUCkgeworICAgICAgUHRyID0gVHJhaXRzOjpnZXRBc1ZvaWRQb2ludGVyKFApOworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBQdHIgIT0gbnVsbHB0cjsgfQorCisgICAgdm9pZCAqZ2V0QXNPcGFxdWVQdHIoKSBjb25zdCB7IHJldHVybiBQdHI7IH0KKyAgICBzdGF0aWMgT3BhcXVlUHRyIGdldEZyb21PcGFxdWVQdHIodm9pZCAqUCkgeyByZXR1cm4gT3BhcXVlUHRyKFApOyB9CisgIH07CisKKyAgLy8vIFVuaW9uT3BhcXVlUHRyIC0gQSB2ZXJzaW9uIG9mIE9wYXF1ZVB0ciBzdWl0YWJsZSBmb3IgbWVtYmVyc2hpcAorICAvLy8gaW4gYSB1bmlvbi4KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBVbmlvbk9wYXF1ZVB0ciB7CisgICAgdm9pZCAqUHRyOworCisgICAgc3RhdGljIFVuaW9uT3BhcXVlUHRyIG1ha2UoT3BhcXVlUHRyPFQ+IFApIHsKKyAgICAgIFVuaW9uT3BhcXVlUHRyIE9QID0geyBQLmdldEFzT3BhcXVlUHRyKCkgfTsKKyAgICAgIHJldHVybiBPUDsKKyAgICB9CisKKyAgICBPcGFxdWVQdHI8VD4gZ2V0KCkgY29uc3QgeyByZXR1cm4gT3BhcXVlUHRyPFQ+OjpnZXRGcm9tT3BhcXVlUHRyKFB0cik7IH0KKyAgICBvcGVyYXRvciBPcGFxdWVQdHI8VD4oKSBjb25zdCB7IHJldHVybiBnZXQoKTsgfQorCisgICAgVW5pb25PcGFxdWVQdHIgJm9wZXJhdG9yPShPcGFxdWVQdHI8VD4gUCkgeworICAgICAgUHRyID0gUC5nZXRBc09wYXF1ZVB0cigpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworbmFtZXNwYWNlIGxsdm0geworCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICBzdHJ1Y3QgUG9pbnRlckxpa2VUeXBlVHJhaXRzPGNsYW5nOjpPcGFxdWVQdHI8VD4+IHsKKyAgICBlbnVtIHsgTnVtTG93Qml0c0F2YWlsYWJsZSA9IDAgfTsKKworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0QXNWb2lkUG9pbnRlcihjbGFuZzo6T3BhcXVlUHRyPFQ+IFApIHsKKyAgICAgIC8vIEZJWE1FOiBEb2Vzbid0IHdvcms/IHJldHVybiBQLmdldEFzPCB2b2lkID4oKTsKKyAgICAgIHJldHVybiBQLmdldEFzT3BhcXVlUHRyKCk7CisgICAgfQorCisgICAgc3RhdGljIGlubGluZSBjbGFuZzo6T3BhcXVlUHRyPFQ+IGdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7CisgICAgICByZXR1cm4gY2xhbmc6Ok9wYXF1ZVB0cjxUPjo6Z2V0RnJvbU9wYXF1ZVB0cihQKTsKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHN0cnVjdCBpc1BvZExpa2U8Y2xhbmc6Ok9wYXF1ZVB0cjxUPj4geyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworbmFtZXNwYWNlIGNsYW5nIHsKKworICAvLyBCYXNpYworICBjbGFzcyBEaWFnbm9zdGljQnVpbGRlcjsKKworICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGxvdyBiaXQgb2YgdGhlIHJlc3VsdCBwb2ludGVyIGZvciB0aGUKKyAgLy8gZ2l2ZW4gVUlEIGlzIGFsd2F5cyB6ZXJvLiBJZiBzbywgQWN0aW9uUmVzdWx0IHdpbGwgdXNlIHRoYXQgYml0CisgIC8vIGZvciBpdCdzICJpbnZhbGlkIiBmbGFnLgorICB0ZW1wbGF0ZTxjbGFzcyBQdHI+CisgIHN0cnVjdCBJc1Jlc3VsdFB0ckxvd0JpdEZyZWUgeworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7CisgIH07CisKKyAgLy8vIEFjdGlvblJlc3VsdCAtIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgd2hpbGUgcGFyc2luZy9hY3Rpbmcgb24KKyAgLy8vIGV4cHJlc3Npb25zLCBzdG10cywgZXRjLiAgSXQgZW5jYXBzdWxhdGVzIGJvdGggdGhlIG9iamVjdCByZXR1cm5lZCBieQorICAvLy8gdGhlIGFjdGlvbiwgcGx1cyBhIHNlbnNlIG9mIHdoZXRoZXIgb3Igbm90IGl0IGlzIHZhbGlkLgorICAvLy8gV2hlbiBDb21wcmVzc0ludmFsaWQgaXMgdHJ1ZSwgdGhlICJpbnZhbGlkIiBmbGFnIHdpbGwgYmUKKyAgLy8vIHN0b3JlZCBpbiB0aGUgbG93IGJpdCBvZiB0aGUgVmFsIHBvaW50ZXIuCisgIHRlbXBsYXRlPGNsYXNzIFB0clR5LAorICAgICAgICAgICBib29sIENvbXByZXNzSW52YWxpZCA9IElzUmVzdWx0UHRyTG93Qml0RnJlZTxQdHJUeT46OnZhbHVlPgorICBjbGFzcyBBY3Rpb25SZXN1bHQgeworICAgIFB0clR5IFZhbDsKKyAgICBib29sIEludmFsaWQ7CisKKyAgcHVibGljOgorICAgIEFjdGlvblJlc3VsdChib29sIEludmFsaWQgPSBmYWxzZSkgOiBWYWwoUHRyVHkoKSksIEludmFsaWQoSW52YWxpZCkge30KKyAgICBBY3Rpb25SZXN1bHQoUHRyVHkgdmFsKSA6IFZhbCh2YWwpLCBJbnZhbGlkKGZhbHNlKSB7fQorICAgIEFjdGlvblJlc3VsdChjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmKSA6IFZhbChQdHJUeSgpKSwgSW52YWxpZCh0cnVlKSB7fQorCisgICAgLy8gVGhlc2UgdHdvIG92ZXJsb2FkcyBwcmV2ZW50IHZvaWQqIC0+IGJvb2wgY29udmVyc2lvbnMuCisgICAgQWN0aW9uUmVzdWx0KGNvbnN0IHZvaWQgKikgPSBkZWxldGU7CisgICAgQWN0aW9uUmVzdWx0KHZvbGF0aWxlIHZvaWQgKikgPSBkZWxldGU7CisKKyAgICBib29sIGlzSW52YWxpZCgpIGNvbnN0IHsgcmV0dXJuIEludmFsaWQ7IH0KKyAgICBib29sIGlzVXNhYmxlKCkgY29uc3QgeyByZXR1cm4gIUludmFsaWQgJiYgVmFsOyB9CisgICAgYm9vbCBpc1Vuc2V0KCkgY29uc3QgeyByZXR1cm4gIUludmFsaWQgJiYgIVZhbDsgfQorCisgICAgUHRyVHkgZ2V0KCkgY29uc3QgeyByZXR1cm4gVmFsOyB9CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgKmdldEFzKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KGdldCgpKTsgfQorCisgICAgdm9pZCBzZXQoUHRyVHkgVikgeyBWYWwgPSBWOyB9CisKKyAgICBjb25zdCBBY3Rpb25SZXN1bHQgJm9wZXJhdG9yPShQdHJUeSBSSFMpIHsKKyAgICAgIFZhbCA9IFJIUzsKKyAgICAgIEludmFsaWQgPSBmYWxzZTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgIH07CisKKyAgLy8gVGhpcyBBY3Rpb25SZXN1bHQgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBwbGFjZXMgdGhlICJpbnZhbGlkIgorICAvLyBmbGFnIGludG8gdGhlIGxvdyBiaXQgb2YgdGhlIHBvaW50ZXIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFB0clR5PgorICBjbGFzcyBBY3Rpb25SZXN1bHQ8UHRyVHksIHRydWU+IHsKKyAgICAvLyBBIHBvaW50ZXIgd2hvc2UgbG93IGJpdCBpcyAxIGlmIHRoaXMgcmVzdWx0IGlzIGludmFsaWQsIDAKKyAgICAvLyBvdGhlcndpc2UuCisgICAgdWludHB0cl90IFB0cldpdGhJbnZhbGlkOworCisgICAgdXNpbmcgUHRyVHJhaXRzID0gbGx2bTo6UG9pbnRlckxpa2VUeXBlVHJhaXRzPFB0clR5PjsKKworICBwdWJsaWM6CisgICAgQWN0aW9uUmVzdWx0KGJvb2wgSW52YWxpZCA9IGZhbHNlKQorICAgICAgICA6IFB0cldpdGhJbnZhbGlkKHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oSW52YWxpZCkpIHt9CisKKyAgICBBY3Rpb25SZXN1bHQoUHRyVHkgVikgeworICAgICAgdm9pZCAqVlAgPSBQdHJUcmFpdHM6OmdldEFzVm9pZFBvaW50ZXIoVik7CisgICAgICBQdHJXaXRoSW52YWxpZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihWUCk7CisgICAgICBhc3NlcnQoKFB0cldpdGhJbnZhbGlkICYgMHgwMSkgPT0gMCAmJiAiQmFkbHkgYWxpZ25lZCBwb2ludGVyIik7CisgICAgfQorCisgICAgQWN0aW9uUmVzdWx0KGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICYpIDogUHRyV2l0aEludmFsaWQoMHgwMSkge30KKworICAgIC8vIFRoZXNlIHR3byBvdmVybG9hZHMgcHJldmVudCB2b2lkKiAtPiBib29sIGNvbnZlcnNpb25zLgorICAgIEFjdGlvblJlc3VsdChjb25zdCB2b2lkICopID0gZGVsZXRlOworICAgIEFjdGlvblJlc3VsdCh2b2xhdGlsZSB2b2lkICopID0gZGVsZXRlOworCisgICAgYm9vbCBpc0ludmFsaWQoKSBjb25zdCB7IHJldHVybiBQdHJXaXRoSW52YWxpZCAmIDB4MDE7IH0KKyAgICBib29sIGlzVXNhYmxlKCkgY29uc3QgeyByZXR1cm4gUHRyV2l0aEludmFsaWQgPiAweDAxOyB9CisgICAgYm9vbCBpc1Vuc2V0KCkgY29uc3QgeyByZXR1cm4gUHRyV2l0aEludmFsaWQgPT0gMDsgfQorCisgICAgUHRyVHkgZ2V0KCkgY29uc3QgeworICAgICAgdm9pZCAqVlAgPSByZWludGVycHJldF9jYXN0PHZvaWQgKj4oUHRyV2l0aEludmFsaWQgJiB+MHgwMSk7CisgICAgICByZXR1cm4gUHRyVHJhaXRzOjpnZXRGcm9tVm9pZFBvaW50ZXIoVlApOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUICpnZXRBcygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihnZXQoKSk7IH0KKworICAgIHZvaWQgc2V0KFB0clR5IFYpIHsKKyAgICAgIHZvaWQgKlZQID0gUHRyVHJhaXRzOjpnZXRBc1ZvaWRQb2ludGVyKFYpOworICAgICAgUHRyV2l0aEludmFsaWQgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oVlApOworICAgICAgYXNzZXJ0KChQdHJXaXRoSW52YWxpZCAmIDB4MDEpID09IDAgJiYgIkJhZGx5IGFsaWduZWQgcG9pbnRlciIpOworICAgIH0KKworICAgIGNvbnN0IEFjdGlvblJlc3VsdCAmb3BlcmF0b3I9KFB0clR5IFJIUykgeworICAgICAgdm9pZCAqVlAgPSBQdHJUcmFpdHM6OmdldEFzVm9pZFBvaW50ZXIoUkhTKTsKKyAgICAgIFB0cldpdGhJbnZhbGlkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFZQKTsKKyAgICAgIGFzc2VydCgoUHRyV2l0aEludmFsaWQgJiAweDAxKSA9PSAwICYmICJCYWRseSBhbGlnbmVkIHBvaW50ZXIiKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLyBGb3IgdHlwZXMgd2hlcmUgd2UgY2FuIGZpdCBhIGZsYWcgaW4gd2l0aCB0aGUgcG9pbnRlciwgcHJvdmlkZQorICAgIC8vIGNvbnZlcnNpb25zIHRvL2Zyb20gcG9pbnRlciB0eXBlLgorICAgIHN0YXRpYyBBY3Rpb25SZXN1bHQgZ2V0RnJvbU9wYXF1ZVBvaW50ZXIodm9pZCAqUCkgeworICAgICAgQWN0aW9uUmVzdWx0IFJlc3VsdDsKKyAgICAgIFJlc3VsdC5QdHJXaXRoSW52YWxpZCA9ICh1aW50cHRyX3QpUDsKKyAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorICAgIHZvaWQgKmdldEFzT3BhcXVlUG9pbnRlcigpIGNvbnN0IHsgcmV0dXJuICh2b2lkKilQdHJXaXRoSW52YWxpZDsgfQorICB9OworCisgIC8vLyBBbiBvcGFxdWUgdHlwZSBmb3IgdGhyZWFkaW5nIHBhcnNlZCB0eXBlIGluZm9ybWF0aW9uIHRocm91Z2ggdGhlCisgIC8vLyBwYXJzZXIuCisgIHVzaW5nIFBhcnNlZFR5cGUgPSBPcGFxdWVQdHI8UXVhbFR5cGU+OworICB1c2luZyBVbmlvblBhcnNlZFR5cGUgPSBVbmlvbk9wYXF1ZVB0cjxRdWFsVHlwZT47CisKKyAgLy8gV2UgY2FuIHJlLXVzZSB0aGUgbG93IGJpdCBvZiBleHByZXNzaW9uLCBzdGF0ZW1lbnQsIGJhc2UsIGFuZAorICAvLyBtZW1iZXItaW5pdGlhbGl6ZXIgcG9pbnRlcnMgZm9yIHRoZSAiaW52YWxpZCIgZmxhZyBvZgorICAvLyBBY3Rpb25SZXN1bHQuCisgIHRlbXBsYXRlPD4gc3RydWN0IElzUmVzdWx0UHRyTG93Qml0RnJlZTxFeHByKj4geworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKKyAgfTsKKyAgdGVtcGxhdGU8PiBzdHJ1Y3QgSXNSZXN1bHRQdHJMb3dCaXRGcmVlPFN0bXQqPiB7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworICB9OworICB0ZW1wbGF0ZTw+IHN0cnVjdCBJc1Jlc3VsdFB0ckxvd0JpdEZyZWU8Q1hYQmFzZVNwZWNpZmllcio+IHsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7CisgIH07CisgIHRlbXBsYXRlPD4gc3RydWN0IElzUmVzdWx0UHRyTG93Qml0RnJlZTxDWFhDdG9ySW5pdGlhbGl6ZXIqPiB7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworICB9OworCisgIHVzaW5nIEV4cHJSZXN1bHQgPSBBY3Rpb25SZXN1bHQ8RXhwciAqPjsKKyAgdXNpbmcgU3RtdFJlc3VsdCA9IEFjdGlvblJlc3VsdDxTdG10ICo+OworICB1c2luZyBUeXBlUmVzdWx0ID0gQWN0aW9uUmVzdWx0PFBhcnNlZFR5cGU+OworICB1c2luZyBCYXNlUmVzdWx0ID0gQWN0aW9uUmVzdWx0PENYWEJhc2VTcGVjaWZpZXIgKj47CisgIHVzaW5nIE1lbUluaXRSZXN1bHQgPSBBY3Rpb25SZXN1bHQ8Q1hYQ3RvckluaXRpYWxpemVyICo+OworCisgIHVzaW5nIERlY2xSZXN1bHQgPSBBY3Rpb25SZXN1bHQ8RGVjbCAqPjsKKyAgdXNpbmcgUGFyc2VkVGVtcGxhdGVUeSA9IE9wYXF1ZVB0cjxUZW1wbGF0ZU5hbWU+OworICB1c2luZyBVbmlvblBhcnNlZFRlbXBsYXRlVHkgPSBVbmlvbk9wYXF1ZVB0cjxUZW1wbGF0ZU5hbWU+OworCisgIHVzaW5nIE11bHRpRXhwckFyZyA9IE11dGFibGVBcnJheVJlZjxFeHByICo+OworICB1c2luZyBNdWx0aVN0bXRBcmcgPSBNdXRhYmxlQXJyYXlSZWY8U3RtdCAqPjsKKyAgdXNpbmcgQVNUVGVtcGxhdGVBcmdzUHRyID0gTXV0YWJsZUFycmF5UmVmPFBhcnNlZFRlbXBsYXRlQXJndW1lbnQ+OworICB1c2luZyBNdWx0aVR5cGVBcmcgPSBNdXRhYmxlQXJyYXlSZWY8UGFyc2VkVHlwZT47CisgIHVzaW5nIE11bHRpVGVtcGxhdGVQYXJhbXNBcmcgPSBNdXRhYmxlQXJyYXlSZWY8VGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICo+OworCisgIGlubGluZSBFeHByUmVzdWx0IEV4cHJFcnJvcigpIHsgcmV0dXJuIEV4cHJSZXN1bHQodHJ1ZSk7IH0KKyAgaW5saW5lIFN0bXRSZXN1bHQgU3RtdEVycm9yKCkgeyByZXR1cm4gU3RtdFJlc3VsdCh0cnVlKTsgfQorCisgIGlubGluZSBFeHByUmVzdWx0IEV4cHJFcnJvcihjb25zdCBEaWFnbm9zdGljQnVpbGRlciYpIHsgcmV0dXJuIEV4cHJFcnJvcigpOyB9CisgIGlubGluZSBTdG10UmVzdWx0IFN0bXRFcnJvcihjb25zdCBEaWFnbm9zdGljQnVpbGRlciYpIHsgcmV0dXJuIFN0bXRFcnJvcigpOyB9CisKKyAgaW5saW5lIEV4cHJSZXN1bHQgRXhwckVtcHR5KCkgeyByZXR1cm4gRXhwclJlc3VsdChmYWxzZSk7IH0KKyAgaW5saW5lIFN0bXRSZXN1bHQgU3RtdEVtcHR5KCkgeyByZXR1cm4gU3RtdFJlc3VsdChmYWxzZSk7IH0KKworICBpbmxpbmUgRXhwciAqQXNzZXJ0U3VjY2VzcyhFeHByUmVzdWx0IFIpIHsKKyAgICBhc3NlcnQoIVIuaXNJbnZhbGlkKCkgJiYgIm9wZXJhdGlvbiB3YXMgYXNzZXJ0ZWQgdG8gbmV2ZXIgZmFpbCEiKTsKKyAgICByZXR1cm4gUi5nZXQoKTsKKyAgfQorCisgIGlubGluZSBTdG10ICpBc3NlcnRTdWNjZXNzKFN0bXRSZXN1bHQgUikgeworICAgIGFzc2VydCghUi5pc0ludmFsaWQoKSAmJiAib3BlcmF0aW9uIHdhcyBhc3NlcnRlZCB0byBuZXZlciBmYWlsISIpOworICAgIHJldHVybiBSLmdldCgpOworICB9CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1NFTUFfT1dORVJTSElQX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvUGFyc2VkVGVtcGxhdGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvUGFyc2VkVGVtcGxhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTgwZTRkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9QYXJzZWRUZW1wbGF0ZS5oCkBAIC0wLDAgKzEsMjQ1IEBACisvLz09PS0tLSBQYXJzZWRUZW1wbGF0ZS5oIC0gVGVtcGxhdGUgUGFyc2luZyBEYXRhIFR5cGVzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgcHJvdmlkZXMgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgc3RvcmUgdGhlIHBhcnNlZCByZXByZXNlbnRhdGlvbiBvZgorLy8gIHRlbXBsYXRlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU0VNQV9QQVJTRURURU1QTEFURV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU0VNQV9QQVJTRURURU1QTEFURV9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9PcGVyYXRvcktpbmRzLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9UZW1wbGF0ZUtpbmRzLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9EZWNsU3BlYy5oIgorI2luY2x1ZGUgImNsYW5nL1NlbWEvT3duZXJzaGlwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8bmV3PgorCituYW1lc3BhY2UgY2xhbmcgeyAgCisgIC8vLyBcYnJpZWYgUmVwcmVzZW50cyB0aGUgcGFyc2VkIGZvcm0gb2YgYSBDKysgdGVtcGxhdGUgYXJndW1lbnQuCisgIGNsYXNzIFBhcnNlZFRlbXBsYXRlQXJndW1lbnQgeworICBwdWJsaWM6CisgICAgLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIGtpbmQgb2YgdGVtcGxhdGUgYXJndW1lbnQgdGhhdCB3YXMgcGFyc2VkLgorICAgIGVudW0gS2luZFR5cGUgeworICAgICAgLy8vIFxicmllZiBBIHRlbXBsYXRlIHR5cGUgcGFyYW1ldGVyLCBzdG9yZWQgYXMgYSB0eXBlLgorICAgICAgVHlwZSwKKyAgICAgIC8vLyBcYnJpZWYgQSBub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIHN0b3JlZCBhcyBhbiBleHByZXNzaW9uLgorICAgICAgTm9uVHlwZSwKKyAgICAgIC8vLyBcYnJpZWYgQSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBhcmd1bWVudCwgc3RvcmVkIGFzIGEgdGVtcGxhdGUgbmFtZS4KKyAgICAgIFRlbXBsYXRlCisgICAgfTsKKworICAgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgdGVtcGxhdGUgYXJndW1lbnQuIAorICAgIC8vLworICAgIC8vLyBUaGlzIHRlbXBsYXRlIGFyZ3VtZW50IGlzIGludmFsaWQuCisgICAgUGFyc2VkVGVtcGxhdGVBcmd1bWVudCgpIDogS2luZChUeXBlKSwgQXJnKG51bGxwdHIpIHsgfQorICAgIAorICAgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgdGVtcGxhdGUgdHlwZSBhcmd1bWVudCBvciBub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudC4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIEFyZyB0aGUgdGVtcGxhdGUgdHlwZSBhcmd1bWVudCBvciBub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudC4KKyAgICAvLy8gXHBhcmFtIExvYyB0aGUgbG9jYXRpb24gb2YgdGhlIHR5cGUuCisgICAgUGFyc2VkVGVtcGxhdGVBcmd1bWVudChLaW5kVHlwZSBLaW5kLCB2b2lkICpBcmcsIFNvdXJjZUxvY2F0aW9uIExvYykKKyAgICAgIDogS2luZChLaW5kKSwgQXJnKEFyZyksIExvYyhMb2MpIHsgfQorICAgIAorICAgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgdGVtcGxhdGUgdGVtcGxhdGUgYXJndW1lbnQuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBTUyB0aGUgQysrIHNjb3BlIHNwZWNpZmllciB0aGF0IHByZWNlZGVzIHRoZSB0ZW1wbGF0ZSBuYW1lLCBpZgorICAgIC8vLyBhbnkuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBUZW1wbGF0ZSB0aGUgdGVtcGxhdGUgdG8gd2hpY2ggdGhpcyB0ZW1wbGF0ZSB0ZW1wbGF0ZSAKKyAgICAvLy8gYXJndW1lbnQgcmVmZXJzLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gVGVtcGxhdGVMb2MgdGhlIGxvY2F0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBuYW1lLgorICAgIFBhcnNlZFRlbXBsYXRlQXJndW1lbnQoY29uc3QgQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZFRlbXBsYXRlVHkgVGVtcGxhdGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVMb2MpIAorICAgICAgOiBLaW5kKFBhcnNlZFRlbXBsYXRlQXJndW1lbnQ6OlRlbXBsYXRlKSwKKyAgICAgICAgQXJnKFRlbXBsYXRlLmdldEFzT3BhcXVlUHRyKCkpLCAKKyAgICAgICAgU1MoU1MpLCBMb2MoVGVtcGxhdGVMb2MpLCBFbGxpcHNpc0xvYygpIHsgfQorICAgIAorICAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIHRlbXBsYXRlIGFyZ3VtZW50IGlzIGludmFsaWQuCisgICAgYm9vbCBpc0ludmFsaWQoKSBjb25zdCB7IHJldHVybiBBcmcgPT0gbnVsbHB0cjsgfQorICAgIAorICAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoYXQga2luZCBvZiB0ZW1wbGF0ZSBhcmd1bWVudCB3ZSBoYXZlLgorICAgIEtpbmRUeXBlIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisgICAgCisgICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdGVtcGxhdGUgdHlwZSBhcmd1bWVudCdzIHR5cGUuCisgICAgUGFyc2VkVHlwZSBnZXRBc1R5cGUoKSBjb25zdCB7CisgICAgICBhc3NlcnQoS2luZCA9PSBUeXBlICYmICJOb3QgYSB0ZW1wbGF0ZSB0eXBlIGFyZ3VtZW50Iik7CisgICAgICByZXR1cm4gUGFyc2VkVHlwZTo6Z2V0RnJvbU9wYXF1ZVB0cihBcmcpOworICAgIH0KKyAgICAKKyAgICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCdzIGV4cHJlc3Npb24uCisgICAgRXhwciAqZ2V0QXNFeHByKCkgY29uc3QgeworICAgICAgYXNzZXJ0KEtpbmQgPT0gTm9uVHlwZSAmJiAiTm90IGEgbm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnQiKTsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxFeHByKj4oQXJnKTsKKyAgICB9CisgICAgCisgICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdGVtcGxhdGUgdGVtcGxhdGUgYXJndW1lbnQncyB0ZW1wbGF0ZSBuYW1lLgorICAgIFBhcnNlZFRlbXBsYXRlVHkgZ2V0QXNUZW1wbGF0ZSgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChLaW5kID09IFRlbXBsYXRlICYmICJOb3QgYSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBhcmd1bWVudCIpOworICAgICAgcmV0dXJuIFBhcnNlZFRlbXBsYXRlVHk6OmdldEZyb21PcGFxdWVQdHIoQXJnKTsKKyAgICB9CisgICAgCisgICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIHRlbXBsYXRlIGFyZ3VtZW50LgorICAgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9CisgICAgCisgICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHRoYXQgcHJlY2VkZXMgdGhlIHRlbXBsYXRlCisgICAgLy8vIG5hbWUgaW4gYSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBhcmd1bWVudC4KKyAgICBjb25zdCBDWFhTY29wZVNwZWMgJmdldFNjb3BlU3BlYygpIGNvbnN0IHsKKyAgICAgIGFzc2VydChLaW5kID09IFRlbXBsYXRlICYmIAorICAgICAgICAgICAgICJPbmx5IHRlbXBsYXRlIHRlbXBsYXRlIGFyZ3VtZW50cyBjYW4gaGF2ZSBhIHNjb3BlIHNwZWNpZmllciIpOworICAgICAgcmV0dXJuIFNTOworICAgIH0KKyAgICAKKyAgICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZWxsaXBzaXMgdGhhdCBtYWtlcyBhIHRlbXBsYXRlCisgICAgLy8vIHRlbXBsYXRlIGFyZ3VtZW50IGludG8gYSBwYWNrIGV4cGFuc2lvbi4KKyAgICBTb3VyY2VMb2NhdGlvbiBnZXRFbGxpcHNpc0xvYygpIGNvbnN0IHsKKyAgICAgIGFzc2VydChLaW5kID09IFRlbXBsYXRlICYmIAorICAgICAgICAgICAgICJPbmx5IHRlbXBsYXRlIHRlbXBsYXRlIGFyZ3VtZW50cyBjYW4gaGF2ZSBhbiBlbGxpcHNpcyIpOworICAgICAgcmV0dXJuIEVsbGlwc2lzTG9jOworICAgIH0KKyAgICAKKyAgICAvLy8gXGJyaWVmIFJldHJpZXZlIGEgcGFjayBleHBhbnNpb24gb2YgdGhlIGdpdmVuIHRlbXBsYXRlIHRlbXBsYXRlCisgICAgLy8vIGFyZ3VtZW50LgorICAgIC8vLworICAgIC8vLyBccGFyYW0gRWxsaXBzaXNMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBlbGxpcHNpcy4KKyAgICBQYXJzZWRUZW1wbGF0ZUFyZ3VtZW50IGdldFRlbXBsYXRlUGFja0V4cGFuc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYykgY29uc3Q7CisgICAgCisgIHByaXZhdGU6CisgICAgS2luZFR5cGUgS2luZDsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFRoZSBhY3R1YWwgdGVtcGxhdGUgYXJndW1lbnQgcmVwcmVzZW50YXRpb24sIHdoaWNoIG1heSBiZQorICAgIC8vLyBhbiBcYyBTZW1hOjpUeXBlVHkqIChmb3IgYSB0eXBlKSwgYW4gRXhwciogKGZvciBhbgorICAgIC8vLyBleHByZXNzaW9uKSwgb3IgYW4gU2VtYTo6VGVtcGxhdGVUeSAoZm9yIGEgdGVtcGxhdGUpLgorICAgIHZvaWQgKkFyZzsKKworICAgIC8vLyBcYnJpZWYgVGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciB0aGF0IGNhbiBhY2NvbXBhbnkgYSB0ZW1wbGF0ZSB0ZW1wbGF0ZQorICAgIC8vLyBhcmd1bWVudC4KKyAgICBDWFhTY29wZVNwZWMgU1M7CisKKyAgICAvLy8gXGJyaWVmIHRoZSBsb2NhdGlvbiBvZiB0aGUgdGVtcGxhdGUgYXJndW1lbnQuCisgICAgU291cmNlTG9jYXRpb24gTG9jOworCisgICAgLy8vIFxicmllZiBUaGUgZWxsaXBzaXMgbG9jYXRpb24gdGhhdCBjYW4gYWNjb21wYW55IGEgdGVtcGxhdGUgdGVtcGxhdGUKKyAgICAvLy8gYXJndW1lbnQgKHR1cm5pbmcgaXQgaW50byBhIHRlbXBsYXRlIHRlbXBsYXRlIGFyZ3VtZW50IGV4cGFuc2lvbikuCisgICAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2M7CisgIH07CisgIAorICAvLy8gXGJyaWVmIEluZm9ybWF0aW9uIGFib3V0IGEgdGVtcGxhdGUtaWQgYW5ub3RhdGlvbgorICAvLy8gdG9rZW4uCisgIC8vLworICAvLy8gQSB0ZW1wbGF0ZS1pZCBhbm5vdGF0aW9uIHRva2VuIGNvbnRhaW5zIHRoZSB0ZW1wbGF0ZSBkZWNsYXJhdGlvbiwgCisgIC8vLyB0ZW1wbGF0ZSBhcmd1bWVudHMsIHdoZXRoZXIgdGhvc2UgdGVtcGxhdGUgYXJndW1lbnRzIHdlcmUgdHlwZXMsIAorICAvLy8gZXhwcmVzc2lvbnMsIG9yIHRlbXBsYXRlIG5hbWVzLCBhbmQgdGhlIHNvdXJjZSBsb2NhdGlvbnMgZm9yIGltcG9ydGFudCAKKyAgLy8vIHRva2Vucy4gQWxsIG9mIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0ZW1wbGF0ZSBhcmd1bWVudHMgaXMgYWxsb2NhdGVkIAorICAvLy8gZGlyZWN0bHkgYWZ0ZXIgdGhpcyBzdHJ1Y3R1cmUuCisgIHN0cnVjdCBUZW1wbGF0ZUlkQW5ub3RhdGlvbiBmaW5hbAorICAgICAgOiBwcml2YXRlIGxsdm06OlRyYWlsaW5nT2JqZWN0czxUZW1wbGF0ZUlkQW5ub3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVGVtcGxhdGVBcmd1bWVudD4geworICAgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisgICAgLy8vIFxicmllZiBUaGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHRoYXQgcHJlY2VkZXMgdGhlIHRlbXBsYXRlIG5hbWUuCisgICAgQ1hYU2NvcGVTcGVjIFNTOworCisgICAgLy8vIFRlbXBsYXRlS1dMb2MgLSBUaGUgbG9jYXRpb24gb2YgdGhlIHRlbXBsYXRlIGtleXdvcmQuCisgICAgLy8vIEZvciBlLmcuIHR5cGVuYW1lIFQ6OnRlbXBsYXRlIFk8VT4KKyAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUtXTG9jOworCisgICAgLy8vIFRlbXBsYXRlTmFtZUxvYyAtIFRoZSBsb2NhdGlvbiBvZiB0aGUgdGVtcGxhdGUgbmFtZSB3aXRoaW4gdGhlCisgICAgLy8vIHNvdXJjZS4KKyAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZU5hbWVMb2M7CisgICAgCisgICAgLy8vIEZJWE1FOiBUZW1wb3JhcmlseSBzdG9yZXMgdGhlIG5hbWUgb2YgYSBzcGVjaWFsaXphdGlvbgorICAgIElkZW50aWZpZXJJbmZvICpOYW1lOworICAgIAorICAgIC8vLyBGSVhNRTogVGVtcG9yYXJpbHkgc3RvcmVzIHRoZSBvdmVybG9hZGVkIG9wZXJhdG9yIGtpbmQuCisgICAgT3ZlcmxvYWRlZE9wZXJhdG9yS2luZCBPcGVyYXRvcjsKKyAgICAKKyAgICAvLy8gVGhlIGRlY2xhcmF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgIC8vLyB0ZW1wbGF0ZS1uYW1lLgorICAgIFBhcnNlZFRlbXBsYXRlVHkgVGVtcGxhdGU7CisgICAgCisgICAgLy8vIFRoZSBraW5kIG9mIHRlbXBsYXRlIHRoYXQgVGVtcGxhdGUgcmVmZXJzIHRvLgorICAgIFRlbXBsYXRlTmFtZUtpbmQgS2luZDsKKyAgICAKKyAgICAvLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSAnPCcgYmVmb3JlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudAorICAgIC8vLyBsaXN0LgorICAgIFNvdXJjZUxvY2F0aW9uIExBbmdsZUxvYzsKKyAgICAKKyAgICAvLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSAnPicgYWZ0ZXIgdGhlIHRlbXBsYXRlIGFyZ3VtZW50CisgICAgLy8vIGxpc3QuCisgICAgU291cmNlTG9jYXRpb24gUkFuZ2xlTG9jOworICAgIAorICAgIC8vLyBOdW1BcmdzIC0gVGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMuCisgICAgdW5zaWduZWQgTnVtQXJnczsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFJldHJpZXZlcyBhIHBvaW50ZXIgdG8gdGhlIHRlbXBsYXRlIGFyZ3VtZW50cworICAgIFBhcnNlZFRlbXBsYXRlQXJndW1lbnQgKmdldFRlbXBsYXRlQXJncygpIHsgCisgICAgICByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPFBhcnNlZFRlbXBsYXRlQXJndW1lbnQ+KCk7IAorICAgIH0KKworICAgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhIG5ldyBUZW1wbGF0ZUlkQW5ub3RhdGlvbiB3aXRoIE51bUFyZ3MgYXJndW1lbnRzIGFuZAorICAgIC8vLyBhcHBlbmRzIGl0IHRvIExpc3QuCisgICAgc3RhdGljIFRlbXBsYXRlSWRBbm5vdGF0aW9uICoKKyAgICBDcmVhdGUoQ1hYU2NvcGVTcGVjIFNTLCBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUtXTG9jLAorICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZU5hbWVMb2MsIElkZW50aWZpZXJJbmZvICpOYW1lLAorICAgICAgICAgICBPdmVybG9hZGVkT3BlcmF0b3JLaW5kIE9wZXJhdG9yS2luZCwKKyAgICAgICAgICAgUGFyc2VkVGVtcGxhdGVUeSBPcGFxdWVUZW1wbGF0ZU5hbWUsIFRlbXBsYXRlTmFtZUtpbmQgVGVtcGxhdGVLaW5kLAorICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMQW5nbGVMb2MsIFNvdXJjZUxvY2F0aW9uIFJBbmdsZUxvYywKKyAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VkVGVtcGxhdGVBcmd1bWVudD4gVGVtcGxhdGVBcmdzLAorICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VGVtcGxhdGVJZEFubm90YXRpb24gKj4gJkNsZWFudXBMaXN0KSB7CisgICAgICBUZW1wbGF0ZUlkQW5ub3RhdGlvbiAqVGVtcGxhdGVJZCA9IG5ldyAobGx2bTo6c2FmZV9tYWxsb2MoCisgICAgICAgICAgdG90YWxTaXplVG9BbGxvYzxQYXJzZWRUZW1wbGF0ZUFyZ3VtZW50PihUZW1wbGF0ZUFyZ3Muc2l6ZSgpKSkpCisgICAgICAgICAgVGVtcGxhdGVJZEFubm90YXRpb24oU1MsIFRlbXBsYXRlS1dMb2MsIFRlbXBsYXRlTmFtZUxvYywgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRvcktpbmQsIE9wYXF1ZVRlbXBsYXRlTmFtZSwgVGVtcGxhdGVLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExBbmdsZUxvYywgUkFuZ2xlTG9jLCBUZW1wbGF0ZUFyZ3MpOworICAgICAgQ2xlYW51cExpc3QucHVzaF9iYWNrKFRlbXBsYXRlSWQpOworICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ7CisgICAgfQorCisgICAgdm9pZCBEZXN0cm95KCkgeworICAgICAgc3RkOjpmb3JfZWFjaCgKKyAgICAgICAgICBnZXRUZW1wbGF0ZUFyZ3MoKSwgZ2V0VGVtcGxhdGVBcmdzKCkgKyBOdW1BcmdzLAorICAgICAgICAgIFtdKFBhcnNlZFRlbXBsYXRlQXJndW1lbnQgJkEpIHsgQS5+UGFyc2VkVGVtcGxhdGVBcmd1bWVudCgpOyB9KTsKKyAgICAgIHRoaXMtPn5UZW1wbGF0ZUlkQW5ub3RhdGlvbigpOworICAgICAgZnJlZSh0aGlzKTsgCisgICAgfQorICBwcml2YXRlOgorICAgIFRlbXBsYXRlSWRBbm5vdGF0aW9uKGNvbnN0IFRlbXBsYXRlSWRBbm5vdGF0aW9uICYpID0gZGVsZXRlOworCisgICAgVGVtcGxhdGVJZEFubm90YXRpb24oQ1hYU2NvcGVTcGVjIFNTLCBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUtXTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlTmFtZUxvYywgSWRlbnRpZmllckluZm8gKk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE9wZXJhdG9yS2luZCBPcGVyYXRvcktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVGVtcGxhdGVUeSBPcGFxdWVUZW1wbGF0ZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVOYW1lS2luZCBUZW1wbGF0ZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTEFuZ2xlTG9jLCBTb3VyY2VMb2NhdGlvbiBSQW5nbGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VkVGVtcGxhdGVBcmd1bWVudD4gVGVtcGxhdGVBcmdzKSBub2V4Y2VwdAorICAgICAgICA6IFNTKFNTKSwgVGVtcGxhdGVLV0xvYyhUZW1wbGF0ZUtXTG9jKSwKKyAgICAgICAgICBUZW1wbGF0ZU5hbWVMb2MoVGVtcGxhdGVOYW1lTG9jKSwgTmFtZShOYW1lKSwgT3BlcmF0b3IoT3BlcmF0b3JLaW5kKSwKKyAgICAgICAgICBUZW1wbGF0ZShPcGFxdWVUZW1wbGF0ZU5hbWUpLCBLaW5kKFRlbXBsYXRlS2luZCksCisgICAgICAgICAgTEFuZ2xlTG9jKExBbmdsZUxvYyksIFJBbmdsZUxvYyhSQW5nbGVMb2MpLAorICAgICAgICAgIE51bUFyZ3MoVGVtcGxhdGVBcmdzLnNpemUoKSkgeworCisgICAgICBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weShUZW1wbGF0ZUFyZ3MuYmVnaW4oKSwgVGVtcGxhdGVBcmdzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGVtcGxhdGVBcmdzKCkpOworICAgIH0KKyAgICB+VGVtcGxhdGVJZEFubm90YXRpb24oKSA9IGRlZmF1bHQ7CisgIH07CisKKyAgLy8vIFJldHJpZXZlcyB0aGUgcmFuZ2Ugb2YgdGhlIGdpdmVuIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0cy4KKyAgU291cmNlUmFuZ2UgZ2V0VGVtcGxhdGVQYXJhbXNSYW5nZShUZW1wbGF0ZVBhcmFtZXRlckxpc3QgY29uc3QgKmNvbnN0ICpQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUGFyYW1zKTsgIAorfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1NFTUFfUEFSU0VEVEVNUExBVEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9TY29wZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9TY29wZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzI3ODQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL1Njb3BlLmgKQEAgLTAsMCArMSw1MDAgQEAKKy8vPT09LSBTY29wZS5oIC0gU2NvcGUgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBTY29wZSBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NFTUFfU0NPUEVfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NFTUFfU0NPUEVfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBEZWNsOworY2xhc3MgRGVjbENvbnRleHQ7CitjbGFzcyBVc2luZ0RpcmVjdGl2ZURlY2w7CitjbGFzcyBWYXJEZWNsOworCisvLy8gU2NvcGUgLSBBIHNjb3BlIGlzIGEgdHJhbnNpZW50IGRhdGEgc3RydWN0dXJlIHRoYXQgaXMgdXNlZCB3aGlsZSBwYXJzaW5nIHRoZQorLy8vIHByb2dyYW0uICBJdCBhc3Npc3RzIHdpdGggcmVzb2x2aW5nIGlkZW50aWZpZXJzIHRvIHRoZSBhcHByb3ByaWF0ZQorLy8vIGRlY2xhcmF0aW9uLgorY2xhc3MgU2NvcGUgeworcHVibGljOgorICAvLy8gU2NvcGVGbGFncyAtIFRoZXNlIGFyZSBiaXRmaWVsZHMgdGhhdCBhcmUgb3InZCB0b2dldGhlciB3aGVuIGNyZWF0aW5nIGEKKyAgLy8vIHNjb3BlLCB3aGljaCBkZWZpbmVzIHRoZSBzb3J0cyBvZiB0aGluZ3MgdGhlIHNjb3BlIGNvbnRhaW5zLgorICBlbnVtIFNjb3BlRmxhZ3MgeworICAgIC8vLyBcYnJpZWYgVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgc2NvcGUgY29ycmVzcG9uZHMgdG8gYSBmdW5jdGlvbiwgd2hpY2gKKyAgICAvLy8gbWVhbnMgdGhhdCBsYWJlbHMgYXJlIHNldCBoZXJlLgorICAgIEZuU2NvcGUgICAgICAgPSAweDAxLAorCisgICAgLy8vIFxicmllZiBUaGlzIGlzIGEgd2hpbGUsIGRvLCBzd2l0Y2gsIGZvciwgZXRjIHRoYXQgY2FuIGhhdmUgYnJlYWsKKyAgICAvLy8gc3RhdGVtZW50cyBlbWJlZGRlZCBpbnRvIGl0LgorICAgIEJyZWFrU2NvcGUgICAgPSAweDAyLAorCisgICAgLy8vIFxicmllZiBUaGlzIGlzIGEgd2hpbGUsIGRvLCBmb3IsIHdoaWNoIGNhbiBoYXZlIGNvbnRpbnVlIHN0YXRlbWVudHMKKyAgICAvLy8gZW1iZWRkZWQgaW50byBpdC4KKyAgICBDb250aW51ZVNjb3BlID0gMHgwNCwKKworICAgIC8vLyBcYnJpZWYgVGhpcyBpcyBhIHNjb3BlIHRoYXQgY2FuIGNvbnRhaW4gYSBkZWNsYXJhdGlvbi4gIFNvbWUgc2NvcGVzCisgICAgLy8vIGp1c3QgY29udGFpbiBsb29wIGNvbnN0cnVjdHMgYnV0IGRvbid0IGNvbnRhaW4gZGVjbHMuCisgICAgRGVjbFNjb3BlID0gMHgwOCwKKworICAgIC8vLyBcYnJpZWYgVGhlIGNvbnRyb2xsaW5nIHNjb3BlIGluIGEgaWYvc3dpdGNoL3doaWxlL2ZvciBzdGF0ZW1lbnQuCisgICAgQ29udHJvbFNjb3BlID0gMHgxMCwKKworICAgIC8vLyBcYnJpZWYgVGhlIHNjb3BlIG9mIGEgc3RydWN0L3VuaW9uL2NsYXNzIGRlZmluaXRpb24uCisgICAgQ2xhc3NTY29wZSA9IDB4MjAsCisKKyAgICAvLy8gXGJyaWVmIFRoaXMgaXMgYSBzY29wZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgYmxvY2svY2xvc3VyZSBvYmplY3QuCisgICAgLy8vIEJsb2NrcyBzZXJ2ZSBhcyB0b3AtbGV2ZWwgc2NvcGVzIGZvciBzb21lIG9iamVjdHMgbGlrZSBsYWJlbHMsIHRoZXkKKyAgICAvLy8gYWxzbyBwcmV2ZW50IHRoaW5ncyBsaWtlIGJyZWFrIGFuZCBjb250aW51ZS4gIEJsb2NrU2NvcGVzIGFsd2F5cyBoYXZlCisgICAgLy8vIHRoZSBGblNjb3BlIGFuZCBEZWNsU2NvcGUgZmxhZ3Mgc2V0IGFzIHdlbGwuCisgICAgQmxvY2tTY29wZSA9IDB4NDAsCisKKyAgICAvLy8gXGJyaWVmIFRoaXMgaXMgYSBzY29wZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQorICAgIC8vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIG9mIGEgQysrIHRlbXBsYXRlLiBUZW1wbGF0ZSBwYXJhbWV0ZXIKKyAgICAvLy8gc2NvcGUgc3RhcnRzIGF0IHRoZSAndGVtcGxhdGUnIGtleXdvcmQgYW5kIGVuZHMgd2hlbiB0aGUKKyAgICAvLy8gdGVtcGxhdGUgZGVjbGFyYXRpb24gZW5kcy4KKyAgICBUZW1wbGF0ZVBhcmFtU2NvcGUgPSAweDgwLAorCisgICAgLy8vIFxicmllZiBUaGlzIGlzIGEgc2NvcGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAvLy8gcGFyYW1ldGVycyB3aXRoaW4gYSBmdW5jdGlvbiBwcm90b3R5cGUuCisgICAgRnVuY3Rpb25Qcm90b3R5cGVTY29wZSA9IDB4MTAwLAorCisgICAgLy8vIFxicmllZiBUaGlzIGlzIGEgc2NvcGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcGFyYW1ldGVycyB3aXRoaW4KKyAgICAvLy8gYSBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gKGFzIG9wcG9zZWQgdG8gYW55CisgICAgLy8vIG90aGVyIGtpbmQgb2YgZnVuY3Rpb24gZGVjbGFyYXRvcikuIEFsd2F5cyBoYXMgRnVuY3Rpb25Qcm90b3R5cGVTY29wZQorICAgIC8vLyBzZXQgYXMgd2VsbC4KKyAgICBGdW5jdGlvbkRlY2xhcmF0aW9uU2NvcGUgPSAweDIwMCwKKworICAgIC8vLyBcYnJpZWYgVGhpcyBpcyBhIHNjb3BlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIE9iamVjdGl2ZS1DCisgICAgLy8vIFxAY2F0Y2ggc3RhdGVtZW50LgorICAgIEF0Q2F0Y2hTY29wZSA9IDB4NDAwLAorICAgIAorICAgIC8vLyBcYnJpZWYgVGhpcyBzY29wZSBjb3JyZXNwb25kcyB0byBhbiBPYmplY3RpdmUtQyBtZXRob2QgYm9keS4KKyAgICAvLy8gSXQgYWx3YXlzIGhhcyBGblNjb3BlIGFuZCBEZWNsU2NvcGUgc2V0IGFzIHdlbGwuCisgICAgT2JqQ01ldGhvZFNjb3BlID0gMHg4MDAsCisKKyAgICAvLy8gXGJyaWVmIFRoaXMgaXMgYSBzY29wZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgc3dpdGNoIHN0YXRlbWVudC4KKyAgICBTd2l0Y2hTY29wZSA9IDB4MTAwMCwKKworICAgIC8vLyBcYnJpZWYgVGhpcyBpcyB0aGUgc2NvcGUgb2YgYSBDKysgdHJ5IHN0YXRlbWVudC4KKyAgICBUcnlTY29wZSA9IDB4MjAwMCwKKworICAgIC8vLyBcYnJpZWYgVGhpcyBpcyB0aGUgc2NvcGUgZm9yIGEgZnVuY3Rpb24tbGV2ZWwgQysrIHRyeSBvciBjYXRjaCBzY29wZS4KKyAgICBGblRyeUNhdGNoU2NvcGUgPSAweDQwMDAsCisKKyAgICAvLy8gXGJyaWVmIFRoaXMgaXMgdGhlIHNjb3BlIG9mIE9wZW5NUCBleGVjdXRhYmxlIGRpcmVjdGl2ZS4KKyAgICBPcGVuTVBEaXJlY3RpdmVTY29wZSA9IDB4ODAwMCwKKworICAgIC8vLyBcYnJpZWYgVGhpcyBpcyB0aGUgc2NvcGUgb2Ygc29tZSBPcGVuTVAgbG9vcCBkaXJlY3RpdmUuCisgICAgT3Blbk1QTG9vcERpcmVjdGl2ZVNjb3BlID0gMHgxMDAwMCwKKworICAgIC8vLyBcYnJpZWYgVGhpcyBpcyB0aGUgc2NvcGUgb2Ygc29tZSBPcGVuTVAgc2ltZCBkaXJlY3RpdmUuCisgICAgLy8vIEZvciBleGFtcGxlLCBpdCBpcyB1c2VkIGZvciAnb21wIHNpbWQnLCAnb21wIGZvciBzaW1kJy4KKyAgICAvLy8gVGhpcyBmbGFnIGlzIHByb3BhZ2F0ZWQgdG8gY2hpbGRyZW4gc2NvcGVzLgorICAgIE9wZW5NUFNpbWREaXJlY3RpdmVTY29wZSA9IDB4MjAwMDAsCisKKyAgICAvLy8gVGhpcyBzY29wZSBjb3JyZXNwb25kcyB0byBhbiBlbnVtLgorICAgIEVudW1TY29wZSA9IDB4NDAwMDAsCisKKyAgICAvLy8gVGhpcyBzY29wZSBjb3JyZXNwb25kcyB0byBhbiBTRUggdHJ5LgorICAgIFNFSFRyeVNjb3BlID0gMHg4MDAwMCwKKworICAgIC8vLyBUaGlzIHNjb3BlIGNvcnJlc3BvbmRzIHRvIGFuIFNFSCBleGNlcHQuCisgICAgU0VIRXhjZXB0U2NvcGUgPSAweDEwMDAwMCwKKworICAgIC8vLyBXZSBhcmUgY3VycmVudGx5IGluIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbiBvZiBhbiBTRUggZXhjZXB0IGJsb2NrLgorICAgIFNFSEZpbHRlclNjb3BlID0gMHgyMDAwMDAsCisKKyAgICAvLy8gVGhpcyBpcyBhIGNvbXBvdW5kIHN0YXRlbWVudCBzY29wZS4KKyAgICBDb21wb3VuZFN0bXRTY29wZSA9IDB4NDAwMDAwLAorCisgICAgLy8vIFdlIGFyZSBiZXR3ZWVuIGluaGVyaXRhbmNlIGNvbG9uIGFuZCB0aGUgcmVhbCBjbGFzcy9zdHJ1Y3QgZGVmaW5pdGlvbiBzY29wZS4KKyAgICBDbGFzc0luaGVyaXRhbmNlU2NvcGUgPSAweDgwMDAwMCwKKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIFRoZSBwYXJlbnQgc2NvcGUgZm9yIHRoaXMgc2NvcGUuICBUaGlzIGlzIG51bGwgZm9yIHRoZSB0cmFuc2xhdGlvbi11bml0CisgIC8vLyBzY29wZS4KKyAgU2NvcGUgKkFueVBhcmVudDsKKworICAvLy8gRmxhZ3MgLSBUaGlzIGNvbnRhaW5zIGEgc2V0IG9mIFNjb3BlRmxhZ3MsIHdoaWNoIGluZGljYXRlcyBob3cgdGhlIHNjb3BlCisgIC8vLyBpbnRlcnJlbGF0ZXMgd2l0aCBvdGhlciBjb250cm9sIGZsb3cgc3RhdGVtZW50cy4KKyAgdW5zaWduZWQgRmxhZ3M7CisKKyAgLy8vIERlcHRoIC0gVGhpcyBpcyB0aGUgZGVwdGggb2YgdGhpcyBzY29wZS4gIFRoZSB0cmFuc2xhdGlvbi11bml0IHNjb3BlIGhhcworICAvLy8gZGVwdGggMC4KKyAgdW5zaWduZWQgc2hvcnQgRGVwdGg7CisKKyAgLy8vIFxicmllZiBEZWNsYXJhdGlvbnMgd2l0aCBzdGF0aWMgbGlua2FnZSBhcmUgbWFuZ2xlZCB3aXRoIHRoZSBudW1iZXIgb2YKKyAgLy8vIHNjb3BlcyBzZWVuIGFzIGEgY29tcG9uZW50LgorICB1bnNpZ25lZCBzaG9ydCBNU0xhc3RNYW5nbGluZ051bWJlcjsKKworICB1bnNpZ25lZCBzaG9ydCBNU0N1ck1hbmdsaW5nTnVtYmVyOworCisgIC8vLyBQcm90b3R5cGVEZXB0aCAtIFRoaXMgaXMgdGhlIG51bWJlciBvZiBmdW5jdGlvbiBwcm90b3R5cGUgc2NvcGVzCisgIC8vLyBlbmNsb3NpbmcgdGhpcyBzY29wZSwgaW5jbHVkaW5nIHRoaXMgc2NvcGUuCisgIHVuc2lnbmVkIHNob3J0IFByb3RvdHlwZURlcHRoOworCisgIC8vLyBQcm90b3R5cGVJbmRleCAtIFRoaXMgaXMgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGN1cnJlbnRseQorICAvLy8gZGVjbGFyZWQgaW4gdGhpcyBzY29wZS4KKyAgdW5zaWduZWQgc2hvcnQgUHJvdG90eXBlSW5kZXg7CisKKyAgLy8vIEZuUGFyZW50IC0gSWYgdGhpcyBzY29wZSBoYXMgYSBwYXJlbnQgc2NvcGUgdGhhdCBpcyBhIGZ1bmN0aW9uIGJvZHksIHRoaXMKKyAgLy8vIHBvaW50ZXIgaXMgbm9uLW51bGwgYW5kIHBvaW50cyB0byBpdC4gIFRoaXMgaXMgdXNlZCBmb3IgbGFiZWwgcHJvY2Vzc2luZy4KKyAgU2NvcGUgKkZuUGFyZW50OworICBTY29wZSAqTVNMYXN0TWFuZ2xpbmdQYXJlbnQ7CisKKyAgLy8vIEJyZWFrUGFyZW50L0NvbnRpbnVlUGFyZW50IC0gVGhpcyBpcyBhIGRpcmVjdCBsaW5rIHRvIHRoZSBpbm5lcm1vc3QKKyAgLy8vIEJyZWFrU2NvcGUvQ29udGludWVTY29wZSB3aGljaCBjb250YWlucyB0aGUgY29udGVudHMgb2YgdGhpcyBzY29wZQorICAvLy8gZm9yIGNvbnRyb2wgZmxvdyBwdXJwb3NlcyAoYW5kIG1pZ2h0IGJlIHRoaXMgc2NvcGUgaXRzZWxmKSwgb3IgbnVsbAorICAvLy8gaWYgdGhlcmUgaXMgbm8gc3VjaCBzY29wZS4KKyAgU2NvcGUgKkJyZWFrUGFyZW50LCAqQ29udGludWVQYXJlbnQ7CisKKyAgLy8vIEJsb2NrUGFyZW50IC0gVGhpcyBpcyBhIGRpcmVjdCBsaW5rIHRvIHRoZSBpbW1lZGlhdGVseSBjb250YWluaW5nCisgIC8vLyBCbG9ja1Njb3BlIGlmIHRoaXMgc2NvcGUgaXMgbm90IG9uZSwgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lLgorICBTY29wZSAqQmxvY2tQYXJlbnQ7CisKKyAgLy8vIFRlbXBsYXRlUGFyYW1QYXJlbnQgLSBUaGlzIGlzIGEgZGlyZWN0IGxpbmsgdG8gdGhlCisgIC8vLyBpbW1lZGlhdGVseSBjb250YWluaW5nIHRlbXBsYXRlIHBhcmFtZXRlciBzY29wZS4gSW4gdGhlCisgIC8vLyBjYXNlIG9mIG5lc3RlZCB0ZW1wbGF0ZXMsIHRlbXBsYXRlIHBhcmFtZXRlciBzY29wZXMgY2FuIGhhdmUKKyAgLy8vIG90aGVyIHRlbXBsYXRlIHBhcmFtZXRlciBzY29wZXMgYXMgcGFyZW50cy4KKyAgU2NvcGUgKlRlbXBsYXRlUGFyYW1QYXJlbnQ7CisKKyAgLy8vIERlY2xzSW5TY29wZSAtIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIGRlY2xhcmF0aW9ucyBpbiB0aGlzIHNjb3BlLiAgV2hlbgorICAvLy8gdGhlIGRlY2xhcmF0aW9uIGlzIGFkZGVkIHRvIHRoZSBzY29wZSwgaXQgaXMgc2V0IGFzIHRoZSBjdXJyZW50CisgIC8vLyBkZWNsYXJhdGlvbiBmb3IgdGhlIGlkZW50aWZpZXIgaW4gdGhlIElkZW50aWZpZXJUYWJsZS4gIFdoZW4gdGhlIHNjb3BlIGlzCisgIC8vLyBwb3BwZWQsIHRoZXNlIGRlY2xhcmF0aW9ucyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBJZGVudGlmaWVyVGFibGUncyBub3Rpb24KKyAgLy8vIG9mIGN1cnJlbnQgZGVjbGFyYXRpb24uICBJdCBpcyB1cCB0byB0aGUgY3VycmVudCBBY3Rpb24gaW1wbGVtZW50YXRpb24gdG8KKyAgLy8vIGltcGxlbWVudCB0aGVzZSBzZW1hbnRpY3MuCisgIHVzaW5nIERlY2xTZXRUeSA9IGxsdm06OlNtYWxsUHRyU2V0PERlY2wgKiwgMzI+OworICBEZWNsU2V0VHkgRGVjbHNJblNjb3BlOworCisgIC8vLyBUaGUgRGVjbENvbnRleHQgd2l0aCB3aGljaCB0aGlzIHNjb3BlIGlzIGFzc29jaWF0ZWQuIEZvcgorICAvLy8gZXhhbXBsZSwgdGhlIGVudGl0eSBvZiBhIGNsYXNzIHNjb3BlIGlzIHRoZSBjbGFzcyBpdHNlbGYsIHRoZQorICAvLy8gZW50aXR5IG9mIGEgZnVuY3Rpb24gc2NvcGUgaXMgYSBmdW5jdGlvbiwgZXRjLgorICBEZWNsQ29udGV4dCAqRW50aXR5OworCisgIHVzaW5nIFVzaW5nRGlyZWN0aXZlc1R5ID0gU21hbGxWZWN0b3I8VXNpbmdEaXJlY3RpdmVEZWNsICosIDI+OworICBVc2luZ0RpcmVjdGl2ZXNUeSBVc2luZ0RpcmVjdGl2ZXM7CisKKyAgLy8vIFxicmllZiBVc2VkIHRvIGRldGVybWluZSBpZiBlcnJvcnMgb2NjdXJyZWQgaW4gdGhpcyBzY29wZS4KKyAgRGlhZ25vc3RpY0Vycm9yVHJhcCBFcnJvclRyYXA7CisKKyAgLy8vIEEgbGF0dGljZSBjb25zaXN0aW5nIG9mIHVuZGVmaW5lZCwgYSBzaW5nbGUgTlJWTyBjYW5kaWRhdGUgdmFyaWFibGUgaW4KKyAgLy8vIHRoaXMgc2NvcGUsIG9yIG92ZXItZGVmaW5lZC4gVGhlIGJpdCBpcyB0cnVlIHdoZW4gb3Zlci1kZWZpbmVkLgorICBsbHZtOjpQb2ludGVySW50UGFpcjxWYXJEZWNsICosIDEsIGJvb2w+IE5SVk87CisKKyAgdm9pZCBzZXRGbGFncyhTY29wZSAqUGFyZW50LCB1bnNpZ25lZCBGKTsKKworcHVibGljOgorICBTY29wZShTY29wZSAqUGFyZW50LCB1bnNpZ25lZCBTY29wZUZsYWdzLCBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZykKKyAgICAgIDogRXJyb3JUcmFwKERpYWcpIHsKKyAgICBJbml0KFBhcmVudCwgU2NvcGVGbGFncyk7CisgIH0KKworICAvLy8gZ2V0RmxhZ3MgLSBSZXR1cm4gdGhlIGZsYWdzIGZvciB0aGlzIHNjb3BlLgorICB1bnNpZ25lZCBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIEZsYWdzOyB9CisKKyAgdm9pZCBzZXRGbGFncyh1bnNpZ25lZCBGKSB7IHNldEZsYWdzKGdldFBhcmVudCgpLCBGKTsgfQorCisgIC8vLyBpc0Jsb2NrU2NvcGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNjb3BlIGNvcnJlc3BvbmQgdG8gYSBjbG9zdXJlLgorICBib29sIGlzQmxvY2tTY29wZSgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgQmxvY2tTY29wZTsgfQorCisgIC8vLyBnZXRQYXJlbnQgLSBSZXR1cm4gdGhlIHNjb3BlIHRoYXQgdGhpcyBpcyBuZXN0ZWQgaW4uCisgIGNvbnN0IFNjb3BlICpnZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBBbnlQYXJlbnQ7IH0KKyAgU2NvcGUgKmdldFBhcmVudCgpIHsgcmV0dXJuIEFueVBhcmVudDsgfQorCisgIC8vLyBnZXRGblBhcmVudCAtIFJldHVybiB0aGUgY2xvc2VzdCBzY29wZSB0aGF0IGlzIGEgZnVuY3Rpb24gYm9keS4KKyAgY29uc3QgU2NvcGUgKmdldEZuUGFyZW50KCkgY29uc3QgeyByZXR1cm4gRm5QYXJlbnQ7IH0KKyAgU2NvcGUgKmdldEZuUGFyZW50KCkgeyByZXR1cm4gRm5QYXJlbnQ7IH0KKworICBjb25zdCBTY29wZSAqZ2V0TVNMYXN0TWFuZ2xpbmdQYXJlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIE1TTGFzdE1hbmdsaW5nUGFyZW50OworICB9CisgIFNjb3BlICpnZXRNU0xhc3RNYW5nbGluZ1BhcmVudCgpIHsgcmV0dXJuIE1TTGFzdE1hbmdsaW5nUGFyZW50OyB9CisKKyAgLy8vIGdldENvbnRpbnVlUGFyZW50IC0gUmV0dXJuIHRoZSBjbG9zZXN0IHNjb3BlIHRoYXQgYSBjb250aW51ZSBzdGF0ZW1lbnQKKyAgLy8vIHdvdWxkIGJlIGFmZmVjdGVkIGJ5LgorICBTY29wZSAqZ2V0Q29udGludWVQYXJlbnQoKSB7CisgICAgcmV0dXJuIENvbnRpbnVlUGFyZW50OworICB9CisKKyAgY29uc3QgU2NvcGUgKmdldENvbnRpbnVlUGFyZW50KCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PFNjb3BlKj4odGhpcyktPmdldENvbnRpbnVlUGFyZW50KCk7CisgIH0KKworICAvLy8gZ2V0QnJlYWtQYXJlbnQgLSBSZXR1cm4gdGhlIGNsb3Nlc3Qgc2NvcGUgdGhhdCBhIGJyZWFrIHN0YXRlbWVudAorICAvLy8gd291bGQgYmUgYWZmZWN0ZWQgYnkuCisgIFNjb3BlICpnZXRCcmVha1BhcmVudCgpIHsKKyAgICByZXR1cm4gQnJlYWtQYXJlbnQ7CisgIH0KKyAgY29uc3QgU2NvcGUgKmdldEJyZWFrUGFyZW50KCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PFNjb3BlKj4odGhpcyktPmdldEJyZWFrUGFyZW50KCk7CisgIH0KKworICBTY29wZSAqZ2V0QmxvY2tQYXJlbnQoKSB7IHJldHVybiBCbG9ja1BhcmVudDsgfQorICBjb25zdCBTY29wZSAqZ2V0QmxvY2tQYXJlbnQoKSBjb25zdCB7IHJldHVybiBCbG9ja1BhcmVudDsgfQorCisgIFNjb3BlICpnZXRUZW1wbGF0ZVBhcmFtUGFyZW50KCkgeyByZXR1cm4gVGVtcGxhdGVQYXJhbVBhcmVudDsgfQorICBjb25zdCBTY29wZSAqZ2V0VGVtcGxhdGVQYXJhbVBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIFRlbXBsYXRlUGFyYW1QYXJlbnQ7IH0KKworICAvLy8gUmV0dXJucyB0aGUgZGVwdGggb2YgdGhpcyBzY29wZS4gVGhlIHRyYW5zbGF0aW9uLXVuaXQgaGFzIHNjb3BlIGRlcHRoIDAuCisgIHVuc2lnbmVkIGdldERlcHRoKCkgY29uc3QgeyByZXR1cm4gRGVwdGg7IH0KKworICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZ1bmN0aW9uIHByb3RvdHlwZSBzY29wZXMgaW4gdGhpcyBzY29wZQorICAvLy8gY2hhaW4uCisgIHVuc2lnbmVkIGdldEZ1bmN0aW9uUHJvdG90eXBlRGVwdGgoKSBjb25zdCB7CisgICAgcmV0dXJuIFByb3RvdHlwZURlcHRoOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgZGVjbGFyZWQgaW4gdGhpcyBmdW5jdGlvbgorICAvLy8gcHJvdG90eXBlLCBpbmNyZWFzaW5nIGl0IGJ5IG9uZSBmb3IgdGhlIG5leHQgY2FsbC4KKyAgdW5zaWduZWQgZ2V0TmV4dEZ1bmN0aW9uUHJvdG90eXBlSW5kZXgoKSB7CisgICAgYXNzZXJ0KGlzRnVuY3Rpb25Qcm90b3R5cGVTY29wZSgpKTsKKyAgICByZXR1cm4gUHJvdG90eXBlSW5kZXgrKzsKKyAgfQorCisgIHVzaW5nIGRlY2xfcmFuZ2UgPSBsbHZtOjppdGVyYXRvcl9yYW5nZTxEZWNsU2V0VHk6Oml0ZXJhdG9yPjsKKworICBkZWNsX3JhbmdlIGRlY2xzKCkgY29uc3QgeworICAgIHJldHVybiBkZWNsX3JhbmdlKERlY2xzSW5TY29wZS5iZWdpbigpLCBEZWNsc0luU2NvcGUuZW5kKCkpOworICB9CisKKyAgYm9vbCBkZWNsX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gRGVjbHNJblNjb3BlLmVtcHR5KCk7IH0KKworICB2b2lkIEFkZERlY2woRGVjbCAqRCkgeworICAgIERlY2xzSW5TY29wZS5pbnNlcnQoRCk7CisgIH0KKworICB2b2lkIFJlbW92ZURlY2woRGVjbCAqRCkgeworICAgIERlY2xzSW5TY29wZS5lcmFzZShEKTsKKyAgfQorCisgIHZvaWQgaW5jcmVtZW50TVNNYW5nbGluZ051bWJlcigpIHsKKyAgICBpZiAoU2NvcGUgKk1TTE1QID0gZ2V0TVNMYXN0TWFuZ2xpbmdQYXJlbnQoKSkgeworICAgICAgTVNMTVAtPk1TTGFzdE1hbmdsaW5nTnVtYmVyICs9IDE7CisgICAgICBNU0N1ck1hbmdsaW5nTnVtYmVyICs9IDE7CisgICAgfQorICB9CisKKyAgdm9pZCBkZWNyZW1lbnRNU01hbmdsaW5nTnVtYmVyKCkgeworICAgIGlmIChTY29wZSAqTVNMTVAgPSBnZXRNU0xhc3RNYW5nbGluZ1BhcmVudCgpKSB7CisgICAgICBNU0xNUC0+TVNMYXN0TWFuZ2xpbmdOdW1iZXIgLT0gMTsKKyAgICAgIE1TQ3VyTWFuZ2xpbmdOdW1iZXIgLT0gMTsKKyAgICB9CisgIH0KKworICB1bnNpZ25lZCBnZXRNU0xhc3RNYW5nbGluZ051bWJlcigpIGNvbnN0IHsKKyAgICBpZiAoY29uc3QgU2NvcGUgKk1TTE1QID0gZ2V0TVNMYXN0TWFuZ2xpbmdQYXJlbnQoKSkKKyAgICAgIHJldHVybiBNU0xNUC0+TVNMYXN0TWFuZ2xpbmdOdW1iZXI7CisgICAgcmV0dXJuIDE7CisgIH0KKworICB1bnNpZ25lZCBnZXRNU0N1ck1hbmdsaW5nTnVtYmVyKCkgY29uc3QgeworICAgIHJldHVybiBNU0N1ck1hbmdsaW5nTnVtYmVyOworICB9CisKKyAgLy8vIGlzRGVjbFNjb3BlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgc2NvcGUgdGhhdCB0aGUgc3BlY2lmaWVkIGRlY2wgaXMKKyAgLy8vIGRlY2xhcmVkIGluLgorICBib29sIGlzRGVjbFNjb3BlKERlY2wgKkQpIHsKKyAgICByZXR1cm4gRGVjbHNJblNjb3BlLmNvdW50KEQpICE9IDA7CisgIH0KKworICBEZWNsQ29udGV4dCAqZ2V0RW50aXR5KCkgY29uc3QgeyByZXR1cm4gRW50aXR5OyB9CisgIHZvaWQgc2V0RW50aXR5KERlY2xDb250ZXh0ICpFKSB7IEVudGl0eSA9IEU7IH0KKworICBib29sIGhhc0Vycm9yT2NjdXJyZWQoKSBjb25zdCB7IHJldHVybiBFcnJvclRyYXAuaGFzRXJyb3JPY2N1cnJlZCgpOyB9CisKKyAgYm9vbCBoYXNVbnJlY292ZXJhYmxlRXJyb3JPY2N1cnJlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRXJyb3JUcmFwLmhhc1VucmVjb3ZlcmFibGVFcnJvck9jY3VycmVkKCk7CisgIH0KKworICAvLy8gaXNGdW5jdGlvblNjb3BlKCkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNjb3BlIGlzIGEgZnVuY3Rpb24gc2NvcGUuCisgIGJvb2wgaXNGdW5jdGlvblNjb3BlKCkgY29uc3QgeyByZXR1cm4gKGdldEZsYWdzKCkgJiBTY29wZTo6Rm5TY29wZSk7IH0KKworICAvLy8gaXNDbGFzc1Njb3BlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBzY29wZSBpcyBhIGNsYXNzL3N0cnVjdC91bmlvbiBzY29wZS4KKyAgYm9vbCBpc0NsYXNzU2NvcGUoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRGbGFncygpICYgU2NvcGU6OkNsYXNzU2NvcGUpOworICB9CisKKyAgLy8vIGlzSW5DWFhJbmxpbmVNZXRob2RTY29wZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgc2NvcGUgaXMgYSBDKysgaW5saW5lCisgIC8vLyBtZXRob2Qgc2NvcGUgb3IgaXMgaW5zaWRlIG9uZS4KKyAgYm9vbCBpc0luQ1hYSW5saW5lTWV0aG9kU2NvcGUoKSBjb25zdCB7CisgICAgaWYgKGNvbnN0IFNjb3BlICpGblMgPSBnZXRGblBhcmVudCgpKSB7CisgICAgICBhc3NlcnQoRm5TLT5nZXRQYXJlbnQoKSAmJiAiVFVTY29wZSBub3QgY3JlYXRlZD8iKTsKKyAgICAgIHJldHVybiBGblMtPmdldFBhcmVudCgpLT5pc0NsYXNzU2NvcGUoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICAvLy8gaXNJbk9iamNNZXRob2RTY29wZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgc2NvcGUgaXMsIG9yIGlzIGNvbnRhaW5lZCBpbiwgYW4KKyAgLy8vIE9iamVjdGl2ZS1DIG1ldGhvZCBib2R5LiAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIG5vdCBjb25zdGFudCB0aW1lLgorICBib29sIGlzSW5PYmpjTWV0aG9kU2NvcGUoKSBjb25zdCB7CisgICAgZm9yIChjb25zdCBTY29wZSAqUyA9IHRoaXM7IFM7IFMgPSBTLT5nZXRQYXJlbnQoKSkgeworICAgICAgLy8gSWYgdGhpcyBzY29wZSBpcyBhbiBvYmpjIG1ldGhvZCBzY29wZSwgdGhlbiB3ZSBzdWNjZWVkLgorICAgICAgaWYgKFMtPmdldEZsYWdzKCkgJiBPYmpDTWV0aG9kU2NvcGUpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gaXNJbk9iamNNZXRob2RPdXRlclNjb3BlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBzY29wZSBpcyBhbgorICAvLy8gT2JqZWN0aXZlLUMgbWV0aG9kIG91dGVyIG1vc3QgYm9keS4KKyAgYm9vbCBpc0luT2JqY01ldGhvZE91dGVyU2NvcGUoKSBjb25zdCB7CisgICAgaWYgKGNvbnN0IFNjb3BlICpTID0gdGhpcykgeworICAgICAgLy8gSWYgdGhpcyBzY29wZSBpcyBhbiBvYmpjIG1ldGhvZCBzY29wZSwgdGhlbiB3ZSBzdWNjZWVkLgorICAgICAgaWYgKFMtPmdldEZsYWdzKCkgJiBPYmpDTWV0aG9kU2NvcGUpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gaXNUZW1wbGF0ZVBhcmFtU2NvcGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNjb3BlIGlzIGEgQysrCisgIC8vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgc2NvcGUuCisgIGJvb2wgaXNUZW1wbGF0ZVBhcmFtU2NvcGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEZsYWdzKCkgJiBTY29wZTo6VGVtcGxhdGVQYXJhbVNjb3BlOworICB9CisKKyAgLy8vIGlzRnVuY3Rpb25Qcm90b3R5cGVTY29wZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgc2NvcGUgaXMgYQorICAvLy8gZnVuY3Rpb24gcHJvdG90eXBlIHNjb3BlLgorICBib29sIGlzRnVuY3Rpb25Qcm90b3R5cGVTY29wZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RmxhZ3MoKSAmIFNjb3BlOjpGdW5jdGlvblByb3RvdHlwZVNjb3BlOworICB9CisKKyAgLy8vIGlzQXRDYXRjaFNjb3BlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBzY29wZSBpcyBcQGNhdGNoLgorICBib29sIGlzQXRDYXRjaFNjb3BlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRGbGFncygpICYgU2NvcGU6OkF0Q2F0Y2hTY29wZTsKKyAgfQorCisgIC8vLyBpc1N3aXRjaFNjb3BlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBzY29wZSBpcyBhIHN3aXRjaCBzY29wZS4KKyAgYm9vbCBpc1N3aXRjaFNjb3BlKCkgY29uc3QgeworICAgIGZvciAoY29uc3QgU2NvcGUgKlMgPSB0aGlzOyBTOyBTID0gUy0+Z2V0UGFyZW50KCkpIHsKKyAgICAgIGlmIChTLT5nZXRGbGFncygpICYgU2NvcGU6OlN3aXRjaFNjb3BlKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGVsc2UgaWYgKFMtPmdldEZsYWdzKCkgJiAoU2NvcGU6OkZuU2NvcGUgfCBTY29wZTo6Q2xhc3NTY29wZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlOjpCbG9ja1Njb3BlIHwgU2NvcGU6OlRlbXBsYXRlUGFyYW1TY29wZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlOjpGdW5jdGlvblByb3RvdHlwZVNjb3BlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NvcGU6OkF0Q2F0Y2hTY29wZSB8IFNjb3BlOjpPYmpDTWV0aG9kU2NvcGUpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgc2NvcGUgaXMgdGhlIE9wZW5NUCBkaXJlY3RpdmUgc2NvcGUKKyAgYm9vbCBpc09wZW5NUERpcmVjdGl2ZVNjb3BlKCkgY29uc3QgeworICAgIHJldHVybiAoZ2V0RmxhZ3MoKSAmIFNjb3BlOjpPcGVuTVBEaXJlY3RpdmVTY29wZSk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgc2NvcGUgaXMgc29tZSBPcGVuTVAgbG9vcCBkaXJlY3RpdmUgc2NvcGUKKyAgLy8vIChmb3IgZXhhbXBsZSwgJ29tcCBmb3InLCAnb21wIHNpbWQnKS4KKyAgYm9vbCBpc09wZW5NUExvb3BEaXJlY3RpdmVTY29wZSgpIGNvbnN0IHsKKyAgICBpZiAoZ2V0RmxhZ3MoKSAmIFNjb3BlOjpPcGVuTVBMb29wRGlyZWN0aXZlU2NvcGUpIHsKKyAgICAgIGFzc2VydChpc09wZW5NUERpcmVjdGl2ZVNjb3BlKCkgJiYKKyAgICAgICAgICAgICAiT3Blbk1QIGxvb3AgZGlyZWN0aXZlIHNjb3BlIGlzIG5vdCBhIGRpcmVjdGl2ZSBzY29wZSIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBzY29wZSBpcyAob3IgaXMgbmVzdGVkIGludG8pIHNvbWUgT3Blbk1QCisgIC8vLyBsb29wIHNpbWQgZGlyZWN0aXZlIHNjb3BlIChmb3IgZXhhbXBsZSwgJ29tcCBzaW1kJywgJ29tcCBmb3Igc2ltZCcpLgorICBib29sIGlzT3Blbk1QU2ltZERpcmVjdGl2ZVNjb3BlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRGbGFncygpICYgU2NvcGU6Ok9wZW5NUFNpbWREaXJlY3RpdmVTY29wZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBzY29wZSBpcyBhIGxvb3AgaGF2aW5nIE9wZW5NUCBsb29wCisgIC8vLyBkaXJlY3RpdmUgYXR0YWNoZWQuCisgIGJvb2wgaXNPcGVuTVBMb29wU2NvcGUoKSBjb25zdCB7CisgICAgY29uc3QgU2NvcGUgKlAgPSBnZXRQYXJlbnQoKTsKKyAgICByZXR1cm4gUCAmJiBQLT5pc09wZW5NUExvb3BEaXJlY3RpdmVTY29wZSgpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHNjb3BlIGlzIGEgQysrICd0cnknIGJsb2NrLgorICBib29sIGlzVHJ5U2NvcGUoKSBjb25zdCB7IHJldHVybiBnZXRGbGFncygpICYgU2NvcGU6OlRyeVNjb3BlOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHNjb3BlIGlzIGEgU0VIICdfX3RyeScgYmxvY2suCisgIGJvb2wgaXNTRUhUcnlTY29wZSgpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWdzKCkgJiBTY29wZTo6U0VIVHJ5U2NvcGU7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgc2NvcGUgaXMgYSBTRUggJ19fZXhjZXB0JyBibG9jay4KKyAgYm9vbCBpc1NFSEV4Y2VwdFNjb3BlKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIFNjb3BlOjpTRUhFeGNlcHRTY29wZTsgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBzY29wZSBpcyBhIGNvbXBvdW5kIHN0YXRlbWVudCBzY29wZS4KKyAgYm9vbCBpc0NvbXBvdW5kU3RtdFNjb3BlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRGbGFncygpICYgU2NvcGU6OkNvbXBvdW5kU3RtdFNjb3BlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGlmIHJocyBoYXMgYSBoaWdoZXIgc2NvcGUgZGVwdGggdGhhbiB0aGlzLgorICAvLy8KKyAgLy8vIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgdGhpcyBvbmx5IGlmIG9uZSBvZiB0aGUgdHdvIHNjb3BlcworICAvLy8gaXMgYW4gYW5jZXN0b3Igb2YgdGhlIG90aGVyLgorICBib29sIENvbnRhaW5zKGNvbnN0IFNjb3BlJiByaHMpIGNvbnN0IHsgcmV0dXJuIERlcHRoIDwgcmhzLkRlcHRoOyB9CisKKyAgLy8vIGNvbnRhaW5lZEluUHJvdG90eXBlU2NvcGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG9yIGEgcGFyZW50IHNjb3BlCisgIC8vLyBpcyBhIEZ1bmN0aW9uUHJvdG90eXBlU2NvcGUuCisgIGJvb2wgY29udGFpbmVkSW5Qcm90b3R5cGVTY29wZSgpIGNvbnN0OworCisgIHZvaWQgUHVzaFVzaW5nRGlyZWN0aXZlKFVzaW5nRGlyZWN0aXZlRGVjbCAqVURpcikgeworICAgIFVzaW5nRGlyZWN0aXZlcy5wdXNoX2JhY2soVURpcik7CisgIH0KKworICB1c2luZyB1c2luZ19kaXJlY3RpdmVzX3JhbmdlID0KKyAgICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPFVzaW5nRGlyZWN0aXZlc1R5OjppdGVyYXRvcj47CisKKyAgdXNpbmdfZGlyZWN0aXZlc19yYW5nZSB1c2luZ19kaXJlY3RpdmVzKCkgeworICAgIHJldHVybiB1c2luZ19kaXJlY3RpdmVzX3JhbmdlKFVzaW5nRGlyZWN0aXZlcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzaW5nRGlyZWN0aXZlcy5lbmQoKSk7CisgIH0KKworICB2b2lkIGFkZE5SVk9DYW5kaWRhdGUoVmFyRGVjbCAqVkQpIHsKKyAgICBpZiAoTlJWTy5nZXRJbnQoKSkKKyAgICAgIHJldHVybjsKKyAgICBpZiAoTlJWTy5nZXRQb2ludGVyKCkgPT0gbnVsbHB0cikgeworICAgICAgTlJWTy5zZXRQb2ludGVyKFZEKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKE5SVk8uZ2V0UG9pbnRlcigpICE9IFZEKQorICAgICAgc2V0Tm9OUlZPKCk7CisgIH0KKworICB2b2lkIHNldE5vTlJWTygpIHsKKyAgICBOUlZPLnNldEludCh0cnVlKTsKKyAgICBOUlZPLnNldFBvaW50ZXIobnVsbHB0cik7CisgIH0KKworICB2b2lkIG1lcmdlTlJWT0ludG9QYXJlbnQoKTsKKworICAvLy8gSW5pdCAtIFRoaXMgaXMgdXNlZCBieSB0aGUgcGFyc2VyIHRvIGltcGxlbWVudCBzY29wZSBjYWNoaW5nLgorICB2b2lkIEluaXQoU2NvcGUgKnBhcmVudCwgdW5zaWduZWQgZmxhZ3MpOworCisgIC8vLyBcYnJpZWYgU2V0cyB1cCB0aGUgc3BlY2lmaWVkIHNjb3BlIGZsYWdzIGFuZCBhZGp1c3RzIHRoZSBzY29wZSBzdGF0ZQorICAvLy8gdmFyaWFibGVzIGFjY29yZGluZ2x5LgorICB2b2lkIEFkZEZsYWdzKHVuc2lnbmVkIEZsYWdzKTsKKworICB2b2lkIGR1bXBJbXBsKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfU0VNQV9TQ09QRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL1Njb3BlSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9TY29wZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDRiZTdlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9TY29wZUluZm8uaApAQCAtMCwwICsxLDk5NCBAQAorLy89PT0tIFNjb3BlSW5mby5oIC0gSW5mb3JtYXRpb24gYWJvdXQgYSBzZW1hbnRpYyBjb250ZXh0IC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBGdW5jdGlvblNjb3BlSW5mbyBhbmQgaXRzIHN1YmNsYXNzZXMsIHdoaWNoIGNvbnRhaW4KKy8vIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGZ1bmN0aW9uLCBibG9jaywgbGFtYmRhLCBvciBtZXRob2QgYm9keS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU0VNQV9TQ09QRUlORk9fSAorI2RlZmluZSBMTFZNX0NMQU5HX1NFTUFfU0NPUEVJTkZPX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9DYXB0dXJlZFN0bXQuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvUGFydGlhbERpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL1NlbWEvQ2xlYW51cEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL01hcFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU3dpdGNoLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEJsb2NrRGVjbDsKK2NsYXNzIENhcHR1cmVkRGVjbDsKK2NsYXNzIENYWE1ldGhvZERlY2w7CitjbGFzcyBDWFhSZWNvcmREZWNsOworY2xhc3MgSW1wbGljaXRQYXJhbURlY2w7CitjbGFzcyBOYW1lZERlY2w7CitjbGFzcyBPYmpDSXZhclJlZkV4cHI7CitjbGFzcyBPYmpDTWVzc2FnZUV4cHI7CitjbGFzcyBPYmpDUHJvcGVydHlEZWNsOworY2xhc3MgT2JqQ1Byb3BlcnR5UmVmRXhwcjsKK2NsYXNzIFBhcm1WYXJEZWNsOworY2xhc3MgUmVjb3JkRGVjbDsKK2NsYXNzIFJldHVyblN0bXQ7CitjbGFzcyBTY29wZTsKK2NsYXNzIFN0bXQ7CitjbGFzcyBTd2l0Y2hTdG10OworY2xhc3MgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0OworY2xhc3MgVGVtcGxhdGVUeXBlUGFybURlY2w7CitjbGFzcyBWYXJEZWNsOworCituYW1lc3BhY2Ugc2VtYSB7CisKKy8vLyBcYnJpZWYgQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBvdW5kIHN0YXRlbWVudCBjdXJyZW50bHkgYmVpbmcKKy8vLyBwYXJzZWQuCitjbGFzcyBDb21wb3VuZFNjb3BlSW5mbyB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGNvbXBvdW5kIHN0YW1lbWVudCBjb250YWlucyBgZm9yJyBvciBgd2hpbGUnIGxvb3BzCisgIC8vLyB3aXRoIGVtcHR5IGJvZGllcy4KKyAgYm9vbCBIYXNFbXB0eUxvb3BCb2RpZXMgPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBjb21wb3VuZCBzdGF0ZW1lbnQgY29ycmVzcG9uZHMgdG8gYSBHTlUgc3RhdGVtZW50CisgIC8vLyBleHByZXNzaW9uLgorICBib29sIElzU3RtdEV4cHI7CisKKyAgQ29tcG91bmRTY29wZUluZm8oYm9vbCBJc1N0bXRFeHByKSA6IElzU3RtdEV4cHIoSXNTdG10RXhwcikge30KKworICB2b2lkIHNldEhhc0VtcHR5TG9vcEJvZGllcygpIHsKKyAgICBIYXNFbXB0eUxvb3BCb2RpZXMgPSB0cnVlOworICB9Cit9OworCitjbGFzcyBQb3NzaWJseVVucmVhY2hhYmxlRGlhZyB7CitwdWJsaWM6CisgIFBhcnRpYWxEaWFnbm9zdGljIFBEOworICBTb3VyY2VMb2NhdGlvbiBMb2M7CisgIGNvbnN0IFN0bXQgKnN0bXQ7CisgIAorICBQb3NzaWJseVVucmVhY2hhYmxlRGlhZyhjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmUEQsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RtdCAqc3RtdCkKKyAgICAgIDogUEQoUEQpLCBMb2MoTG9jKSwgc3RtdChzdG10KSB7fQorfTsKKyAgICAKKy8vLyBcYnJpZWYgUmV0YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZ1bmN0aW9uLCBtZXRob2QsIG9yIGJsb2NrIHRoYXQgaXMKKy8vLyBjdXJyZW50bHkgYmVpbmcgcGFyc2VkLgorY2xhc3MgRnVuY3Rpb25TY29wZUluZm8geworcHJvdGVjdGVkOgorICBlbnVtIFNjb3BlS2luZCB7CisgICAgU0tfRnVuY3Rpb24sCisgICAgU0tfQmxvY2ssCisgICAgU0tfTGFtYmRhLAorICAgIFNLX0NhcHR1cmVkUmVnaW9uCisgIH07CisgIAorcHVibGljOgorICAvLy8gXGJyaWVmIFdoYXQga2luZCBvZiBzY29wZSB3ZSBhcmUgZGVzY3JpYmluZy4KKyAgU2NvcGVLaW5kIEtpbmQgOiAzOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGZ1bmN0aW9uIGNvbnRhaW5zIGEgVkxBLCBcQHRyeSwgdHJ5LCBDKysKKyAgLy8vIGluaXRpYWxpemVyLCBvciBhbnl0aGluZyBlbHNlIHRoYXQgY2FuJ3QgYmUganVtcGVkIHBhc3QuCisgIGJvb2wgSGFzQnJhbmNoUHJvdGVjdGVkU2NvcGUgOiAxOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGZ1bmN0aW9uIGNvbnRhaW5zIGFueSBzd2l0Y2hlcyBvciBkaXJlY3QgZ290b3MuCisgIGJvb2wgSGFzQnJhbmNoSW50b1Njb3BlIDogMTsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBmdW5jdGlvbiBjb250YWlucyBhbnkgaW5kaXJlY3QgZ290b3MuCisgIGJvb2wgSGFzSW5kaXJlY3RHb3RvIDogMTsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgYSBzdGF0ZW1lbnQgd2FzIGRyb3BwZWQgYmVjYXVzZSBpdCB3YXMgaW52YWxpZC4KKyAgYm9vbCBIYXNEcm9wcGVkU3RtdCA6IDE7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIGN1cnJlbnQgc2NvcGUgaXMgZm9yIE9wZW5NUCBkZWNsYXJlIHJlZHVjdGlvbiBjb21iaW5lci4KKyAgYm9vbCBIYXNPTVBEZWNsYXJlUmVkdWN0aW9uQ29tYmluZXIgOiAxOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGVyZSBpcyBhIGZhbGx0aHJvdWdoIHN0YXRlbWVudCBpbiB0aGlzIGZ1bmN0aW9uLgorICBib29sIEhhc0ZhbGx0aHJvdWdoU3RtdCA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHdlIG1ha2UgcmVmZXJlbmNlIHRvIGEgZGVjbGFyYXRpb24gdGhhdCBjb3VsZCBiZQorICAvLy8gdW5hdmFpbGFibGUuCisgIGJvb2wgSGFzUG90ZW50aWFsQXZhaWxhYmlsaXR5VmlvbGF0aW9ucyA6IDE7CisKKyAgLy8vIEEgZmxhZyB0aGF0IGlzIHNldCB3aGVuIHBhcnNpbmcgYSBtZXRob2QgdGhhdCBtdXN0IGNhbGwgc3VwZXIncworICAvLy8gaW1wbGVtZW50YXRpb24sIHN1Y2ggYXMgXGMgLWRlYWxsb2MsIFxjIC1maW5hbGl6ZSwgb3IgYW55IG1ldGhvZCBtYXJrZWQKKyAgLy8vIHdpdGggXGMgX19hdHRyaWJ1dGVfXygob2JqY19yZXF1aXJlc19zdXBlcikpLgorICBib29sIE9iakNTaG91bGRDYWxsU3VwZXIgOiAxOworCisgIC8vLyBUcnVlIHdoZW4gdGhpcyBpcyBhIG1ldGhvZCBtYXJrZWQgYXMgYSBkZXNpZ25hdGVkIGluaXRpYWxpemVyLgorICBib29sIE9iakNJc0Rlc2lnbmF0ZWRJbml0IDogMTsKKworICAvLy8gVGhpcyBzdGFydHMgdHJ1ZSBmb3IgYSBtZXRob2QgbWFya2VkIGFzIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgYW5kIHdpbGwKKyAgLy8vIGJlIHNldCB0byBmYWxzZSBpZiB0aGVyZSBpcyBhbiBpbnZvY2F0aW9uIHRvIGEgZGVzaWduYXRlZCBpbml0aWFsaXplciBvZgorICAvLy8gdGhlIHN1cGVyIGNsYXNzLgorICBib29sIE9iakNXYXJuRm9yTm9EZXNpZ25hdGVkSW5pdENoYWluIDogMTsKKworICAvLy8gVHJ1ZSB3aGVuIHRoaXMgaXMgYW4gaW5pdGlhbGl6ZXIgbWV0aG9kIG5vdCBtYXJrZWQgYXMgYSBkZXNpZ25hdGVkCisgIC8vLyBpbml0aWFsaXplciB3aXRoaW4gYSBjbGFzcyB0aGF0IGhhcyBhdCBsZWFzdCBvbmUgaW5pdGlhbGl6ZXIgbWFya2VkIGFzIGEKKyAgLy8vIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIuCisgIGJvb2wgT2JqQ0lzU2Vjb25kYXJ5SW5pdCA6IDE7CisKKyAgLy8vIFRoaXMgc3RhcnRzIHRydWUgZm9yIGEgc2Vjb25kYXJ5IGluaXRpYWxpemVyIG1ldGhvZCBhbmQgd2lsbCBiZSBzZXQgdG8KKyAgLy8vIGZhbHNlIGlmIHRoZXJlIGlzIGFuIGludm9jYXRpb24gb2YgYW4gaW5pdGlhbGl6ZXIgb24gJ3NlbGYnLgorICBib29sIE9iakNXYXJuRm9yTm9Jbml0RGVsZWdhdGlvbiA6IDE7CisKKyAgLy8vIFxicmllZiBUcnVlIG9ubHkgd2hlbiB0aGlzIGZ1bmN0aW9uIGhhcyBub3QgYWxyZWFkeSBidWlsdCwgb3IgYXR0ZW1wdGVkCisgIC8vLyB0byBidWlsZCwgdGhlIGluaXRpYWwgYW5kIGZpbmFsIGNvcm91dGluZSBzdXNwZW5kIHBvaW50cworICBib29sIE5lZWRzQ29yb3V0aW5lU3VzcGVuZHMgOiAxOworCisgIC8vLyBcYnJpZWYgQW4gZW51bWVyYXRpb24gcmVwcmVzZXRpbmcgdGhlIGtpbmQgb2YgdGhlIGZpcnN0IGNvcm91dGluZSBzdGF0ZW1lbnQKKyAgLy8vIGluIHRoZSBmdW5jdGlvbi4gT25lIG9mIGNvX3JldHVybiwgY29fYXdhaXQsIG9yIGNvX3lpZWxkLgorICB1bnNpZ25lZCBjaGFyIEZpcnN0Q29yb3V0aW5lU3RtdEtpbmQgOiAyOworCisgIC8vLyBGaXJzdCBjb3JvdXRpbmUgc3RhdGVtZW50IGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICAvLy8gKGV4IGNvX3JldHVybiwgY29fYXdhaXQsIGNvX3lpZWxkKQorICBTb3VyY2VMb2NhdGlvbiBGaXJzdENvcm91dGluZVN0bXRMb2M7CisKKyAgLy8vIEZpcnN0ICdyZXR1cm4nIHN0YXRlbWVudCBpbiB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgU291cmNlTG9jYXRpb24gRmlyc3RSZXR1cm5Mb2M7CisKKyAgLy8vIEZpcnN0IEMrKyAndHJ5JyBzdGF0ZW1lbnQgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIFNvdXJjZUxvY2F0aW9uIEZpcnN0Q1hYVHJ5TG9jOworCisgIC8vLyBGaXJzdCBTRUggJ19fdHJ5JyBzdGF0ZW1lbnQgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIFNvdXJjZUxvY2F0aW9uIEZpcnN0U0VIVHJ5TG9jOworCisgIC8vLyBcYnJpZWYgVXNlZCB0byBkZXRlcm1pbmUgaWYgZXJyb3JzIG9jY3VycmVkIGluIHRoaXMgZnVuY3Rpb24gb3IgYmxvY2suCisgIERpYWdub3N0aWNFcnJvclRyYXAgRXJyb3JUcmFwOworCisgIC8vLyBTd2l0Y2hTdGFjayAtIFRoaXMgaXMgdGhlIGN1cnJlbnQgc2V0IG9mIGFjdGl2ZSBzd2l0Y2ggc3RhdGVtZW50cyBpbiB0aGUKKyAgLy8vIGJsb2NrLgorICBTbWFsbFZlY3RvcjxTd2l0Y2hTdG10KiwgOD4gU3dpdGNoU3RhY2s7CisKKyAgLy8vIFxicmllZiBUaGUgbGlzdCBvZiByZXR1cm4gc3RhdGVtZW50cyB0aGF0IG9jY3VyIHdpdGhpbiB0aGUgZnVuY3Rpb24gb3IKKyAgLy8vIGJsb2NrLCBpZiB0aGVyZSBpcyBhbnkgY2hhbmNlIG9mIGFwcGx5aW5nIHRoZSBuYW1lZCByZXR1cm4gdmFsdWUKKyAgLy8vIG9wdGltaXphdGlvbiwgb3IgaWYgd2UgbmVlZCB0byBpbmZlciBhIHJldHVybiB0eXBlLgorICBTbWFsbFZlY3RvcjxSZXR1cm5TdG10KiwgND4gUmV0dXJuczsKKworICAvLy8gXGJyaWVmIFRoZSBwcm9taXNlIG9iamVjdCBmb3IgdGhpcyBjb3JvdXRpbmUsIGlmIGFueS4KKyAgVmFyRGVjbCAqQ29yb3V0aW5lUHJvbWlzZSA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBBIG1hcHBpbmcgYmV0d2VlbiB0aGUgY29yb3V0aW5lIGZ1bmN0aW9uIHBhcmFtZXRlcnMgdGhhdCB3ZXJlIG1vdmVkCisgIC8vLyB0byB0aGUgY29yb3V0aW5lIGZyYW1lLCBhbmQgdGhlaXIgbW92ZSBzdGF0ZW1lbnRzLgorICBsbHZtOjpTbWFsbE1hcFZlY3RvcjxQYXJtVmFyRGVjbCAqLCBTdG10ICosIDQ+IENvcm91dGluZVBhcmFtZXRlck1vdmVzOworCisgIC8vLyBcYnJpZWYgVGhlIGluaXRpYWwgYW5kIGZpbmFsIGNvcm91dGluZSBzdXNwZW5kIHBvaW50cy4KKyAgc3RkOjpwYWlyPFN0bXQgKiwgU3RtdCAqPiBDb3JvdXRpbmVTdXNwZW5kczsKKworICAvLy8gXGJyaWVmIFRoZSBzdGFjayBvZiBjdXJyZW50bHkgYWN0aXZlIGNvbXBvdW5kIHN0YW1lbWVudCBzY29wZXMgaW4gdGhlCisgIC8vLyBmdW5jdGlvbi4KKyAgU21hbGxWZWN0b3I8Q29tcG91bmRTY29wZUluZm8sIDQ+IENvbXBvdW5kU2NvcGVzOworCisgIC8vLyBcYnJpZWYgQSBsaXN0IG9mIFBhcnRpYWxEaWFnbm9zdGljcyBjcmVhdGVkIGJ1dCBkZWxheWVkIHdpdGhpbiB0aGUKKyAgLy8vIGN1cnJlbnQgZnVuY3Rpb24gc2NvcGUuICBUaGVzZSBkaWFnbm9zdGljcyBhcmUgdmV0dGVkIGZvciByZWFjaGFiaWxpdHkKKyAgLy8vIHByaW9yIHRvIGJlaW5nIGVtaXR0ZWQuCisgIFNtYWxsVmVjdG9yPFBvc3NpYmx5VW5yZWFjaGFibGVEaWFnLCA0PiBQb3NzaWJseVVucmVhY2hhYmxlRGlhZ3M7CisgIAorICAvLy8gXGJyaWVmIEEgbGlzdCBvZiBwYXJhbWV0ZXJzIHdoaWNoIGhhdmUgdGhlIG5vbm51bGwgYXR0cmlidXRlIGFuZCBhcmUKKyAgLy8vIG1vZGlmaWVkIGluIHRoZSBmdW5jdGlvbi4KKyAgbGx2bTo6U21hbGxQdHJTZXQ8Y29uc3QgUGFybVZhckRlY2wgKiwgOD4gTW9kaWZpZWROb25OdWxsUGFyYW1zOworCitwdWJsaWM6CisgIC8vLyBSZXByZXNlbnRzIGEgc2ltcGxlIGlkZW50aWZpY2F0aW9uIG9mIGEgd2VhayBvYmplY3QuCisgIC8vLworICAvLy8gUGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgLVdyZXBlYXRlZC11c2Utb2Ytd2Vhay4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHR3byB3ZWFrIGFjY2Vzc2VzIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdC4KKyAgLy8vIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgaG93IHZhcmlvdXMgYWNjZXNzZXMgYXJlICJwcm9maWxlZCI6CisgIC8vLworICAvLy8gQWNjZXNzIEV4cHJlc3Npb24gfCAgICAgIkJhc2UiIERlY2wgICAgIHwgICAgICAgICAgIlByb3BlcnR5IiBEZWNsCisgIC8vLyA6LS0tLS0tLS0tLS0tLS0tOiB8IDotLS0tLS0tLS0tLS0tLS0tLTogfCA6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tOgorICAvLy8gc2VsZi5wcm9wZXJ0eSAgICAgfCBzZWxmIChWYXJEZWNsKSAgICAgIHwgcHJvcGVydHkgKE9iakNQcm9wZXJ0eURlY2wpCisgIC8vLyBzZWxmLmltcGxpY2l0UHJvcCB8IHNlbGYgKFZhckRlY2wpICAgICAgfCAtaW1wbGljaXRQcm9wIChPYmpDTWV0aG9kRGVjbCkKKyAgLy8vIHNlbGYtPml2YXIucHJvcCAgIHwgaXZhciAoT2JqQ0l2YXJEZWNsKSB8IHByb3AgKE9iakNQcm9wZXJ0eURlY2wpCisgIC8vLyBjeHhPYmoub2JqLnByb3AgICB8IG9iaiAoRmllbGREZWNsKSAgICAgfCBwcm9wIChPYmpDUHJvcGVydHlEZWNsKQorICAvLy8gW3NlbGYgZm9vXS5wcm9wICAgfCAwICh1bmtub3duKSAgICAgICAgIHwgcHJvcCAoT2JqQ1Byb3BlcnR5RGVjbCkKKyAgLy8vIHNlbGYucHJvcDEucHJvcDIgIHwgcHJvcDEgKE9iakNQcm9wZXJ0eURlY2wpICAgIHwgcHJvcDIgKE9iakNQcm9wZXJ0eURlY2wpCisgIC8vLyBNeUNsYXNzLnByb3AgICAgICB8IE15Q2xhc3MgKE9iakNJbnRlcmZhY2VEZWNsKSB8IC1wcm9wIChPYmpDTWV0aG9kRGVjbCkKKyAgLy8vIE15Q2xhc3MuZm9vLnByb3AgIHwgK2ZvbyAoT2JqQ01ldGhvZERlY2wpICAgICAgIHwgLXByb3AgKE9iakNQcm9wZXJ0eURlY2wpCisgIC8vLyB3ZWFrVmFyICAgICAgICAgICB8IDAgKGtub3duKSAgICAgICAgICAgfCB3ZWFrVmFyIChWYXJEZWNsKQorICAvLy8gc2VsZi0+d2Vha0l2YXIgICAgfCBzZWxmIChWYXJEZWNsKSAgICAgIHwgd2Vha0l2YXIgKE9iakNJdmFyRGVjbCkKKyAgLy8vCisgIC8vLyBPYmplY3RzIGFyZSBpZGVudGlmaWVkIHdpdGggb25seSB0d28gRGVjbHMgdG8gbWFrZSBpdCByZWFzb25hYmx5IGZhc3QgdG8KKyAgLy8vIGNvbXBhcmUgdGhlbS4KKyAgY2xhc3MgV2Vha09iamVjdFByb2ZpbGVUeSB7CisgICAgLy8vIFRoZSBiYXNlIG9iamVjdCBkZWNsLCBhcyBkZXNjcmliZWQgaW4gdGhlIGNsYXNzIGRvY3VtZW50YXRpb24uCisgICAgLy8vCisgICAgLy8vIFRoZSBleHRyYSBmbGFnIGlzICJ0cnVlIiBpZiB0aGUgQmFzZSBhbmQgUHJvcGVydHkgYXJlIGVub3VnaCB0byB1bmlxdWVseQorICAgIC8vLyBpZGVudGlmeSB0aGUgb2JqZWN0IGluIG1lbW9yeS4KKyAgICAvLy8KKyAgICAvLy8gXHNhIGlzRXhhY3RQcm9maWxlKCkKKyAgICB1c2luZyBCYXNlSW5mb1R5ID0gbGx2bTo6UG9pbnRlckludFBhaXI8Y29uc3QgTmFtZWREZWNsICosIDEsIGJvb2w+OworICAgIEJhc2VJbmZvVHkgQmFzZTsKKworICAgIC8vLyBUaGUgInByb3BlcnR5IiBkZWNsLCBhcyBkZXNjcmliZWQgaW4gdGhlIGNsYXNzIGRvY3VtZW50YXRpb24uCisgICAgLy8vCisgICAgLy8vIE5vdGUgdGhhdCB0aGlzIG1heSBub3QgYWN0dWFsbHkgYmUgYW4gT2JqQ1Byb3BlcnR5RGVjbCwgZS5nLiBpbiB0aGUKKyAgICAvLy8gY2FzZSBvZiAiaW1wbGljaXQiIHByb3BlcnRpZXMgKHJlZ3VsYXIgbWV0aG9kcyBhY2Nlc3NlZCB2aWEgZG90IHN5bnRheCkuCisgICAgY29uc3QgTmFtZWREZWNsICpQcm9wZXJ0eSA9IG51bGxwdHI7CisKKyAgICAvLy8gVXNlZCB0byBmaW5kIHRoZSBwcm9wZXIgYmFzZSBwcm9maWxlIGZvciBhIGdpdmVuIGJhc2UgZXhwcmVzc2lvbi4KKyAgICBzdGF0aWMgQmFzZUluZm9UeSBnZXRCYXNlSW5mbyhjb25zdCBFeHByICpCYXNlRSk7CisKKyAgICBpbmxpbmUgV2Vha09iamVjdFByb2ZpbGVUeSgpOworICAgIHN0YXRpYyBpbmxpbmUgV2Vha09iamVjdFByb2ZpbGVUeSBnZXRTZW50aW5lbCgpOworCisgIHB1YmxpYzoKKyAgICBXZWFrT2JqZWN0UHJvZmlsZVR5KGNvbnN0IE9iakNQcm9wZXJ0eVJlZkV4cHIgKlJFKTsKKyAgICBXZWFrT2JqZWN0UHJvZmlsZVR5KGNvbnN0IEV4cHIgKkJhc2UsIGNvbnN0IE9iakNQcm9wZXJ0eURlY2wgKlByb3BlcnR5KTsKKyAgICBXZWFrT2JqZWN0UHJvZmlsZVR5KGNvbnN0IERlY2xSZWZFeHByICpSRSk7CisgICAgV2Vha09iamVjdFByb2ZpbGVUeShjb25zdCBPYmpDSXZhclJlZkV4cHIgKlJFKTsKKworICAgIGNvbnN0IE5hbWVkRGVjbCAqZ2V0QmFzZSgpIGNvbnN0IHsgcmV0dXJuIEJhc2UuZ2V0UG9pbnRlcigpOyB9CisgICAgY29uc3QgTmFtZWREZWNsICpnZXRQcm9wZXJ0eSgpIGNvbnN0IHsgcmV0dXJuIFByb3BlcnR5OyB9CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgYmFzZSBzcGVjaWZpZXMgYSBrbm93biBvYmplY3QgaW4gbWVtb3J5LAorICAgIC8vLyByYXRoZXIgdGhhbiwgc2F5LCBhbiBpbnN0YW5jZSB2YXJpYWJsZSBvciBwcm9wZXJ0eSBvZiBhbm90aGVyIG9iamVjdC4KKyAgICAvLy8KKyAgICAvLy8gTm90ZSB0aGF0IHRoaXMgaWdub3JlcyB0aGUgZWZmZWN0cyBvZiBhbGlhc2luZzsgdGhhdCBpcywgXGMgZm9vLmJhciBpcworICAgIC8vLyBjb25zaWRlcmVkIGFuIGV4YWN0IHByb2ZpbGUgaWYgXGMgZm9vIGlzIGEgbG9jYWwgdmFyaWFibGUsIGV2ZW4gaWYKKyAgICAvLy8gYW5vdGhlciB2YXJpYWJsZSBcYyBmb28yIHJlZmVycyB0byB0aGUgc2FtZSBvYmplY3QgYXMgXGMgZm9vLgorICAgIC8vLworICAgIC8vLyBGb3IgaW5jcmVhc2VkIHByZWNpc2lvbiwgYWNjZXNzZXMgd2l0aCBiYXNlIHZhcmlhYmxlcyB0aGF0IGFyZQorICAgIC8vLyBwcm9wZXJ0aWVzIG9yIGl2YXJzIG9mICdzZWxmJyAoZS5nLiBzZWxmLnByb3AxLnByb3AyKSBhcmUgY29uc2lkZXJlZCB0bworICAgIC8vLyBiZSBleGFjdCwgdGhvdWdoIHRoaXMgaXMgbm90IHRydWUgZm9yIGFyYml0cmFyeSB2YXJpYWJsZXMKKyAgICAvLy8gKGZvby5wcm9wMS5wcm9wMikuCisgICAgYm9vbCBpc0V4YWN0UHJvZmlsZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBCYXNlLmdldEludCgpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBXZWFrT2JqZWN0UHJvZmlsZVR5ICZPdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIEJhc2UgPT0gT3RoZXIuQmFzZSAmJiBQcm9wZXJ0eSA9PSBPdGhlci5Qcm9wZXJ0eTsKKyAgICB9CisKKyAgICAvLyBGb3IgdXNlIGluIERlbnNlTWFwLgorICAgIC8vIFdlIGNhbid0IHNwZWNpYWxpemUgdGhlIHVzdWFsIGxsdm06OkRlbnNlTWFwSW5mbyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCisgICAgLy8gYmVjYXVzZSBieSB0aGF0IHBvaW50IHRoZSBEZW5zZU1hcCBpbiBGdW5jdGlvblNjb3BlSW5mbyBoYXMgYWxyZWFkeSBiZWVuCisgICAgLy8gaW5zdGFudGlhdGVkLgorICAgIGNsYXNzIERlbnNlTWFwSW5mbyB7CisgICAgcHVibGljOgorICAgICAgc3RhdGljIGlubGluZSBXZWFrT2JqZWN0UHJvZmlsZVR5IGdldEVtcHR5S2V5KCkgeworICAgICAgICByZXR1cm4gV2Vha09iamVjdFByb2ZpbGVUeSgpOworICAgICAgfQorCisgICAgICBzdGF0aWMgaW5saW5lIFdlYWtPYmplY3RQcm9maWxlVHkgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgICAgICByZXR1cm4gV2Vha09iamVjdFByb2ZpbGVUeTo6Z2V0U2VudGluZWwoKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBXZWFrT2JqZWN0UHJvZmlsZVR5ICZWYWwpIHsKKyAgICAgICAgdXNpbmcgUGFpciA9IHN0ZDo6cGFpcjxCYXNlSW5mb1R5LCBjb25zdCBOYW1lZERlY2wgKj47CisKKyAgICAgICAgcmV0dXJuIGxsdm06OkRlbnNlTWFwSW5mbzxQYWlyPjo6Z2V0SGFzaFZhbHVlKFBhaXIoVmFsLkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbC5Qcm9wZXJ0eSkpOworICAgICAgfQorCisgICAgICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IFdlYWtPYmplY3RQcm9maWxlVHkgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2Vha09iamVjdFByb2ZpbGVUeSAmUkhTKSB7CisgICAgICAgIHJldHVybiBMSFMgPT0gUkhTOworICAgICAgfQorICAgIH07CisgIH07CisKKyAgLy8vIFJlcHJlc2VudHMgYSBzaW5nbGUgdXNlIG9mIGEgd2VhayBvYmplY3QuCisgIC8vLworICAvLy8gU3RvcmVzIGJvdGggdGhlIGV4cHJlc3Npb24gYW5kIHdoZXRoZXIgdGhlIGFjY2VzcyBpcyBwb3RlbnRpYWxseSB1bnNhZmUKKyAgLy8vIChpLmUuIGl0IGNvdWxkIHBvdGVudGlhbGx5IGJlIHdhcm5lZCBhYm91dCkuCisgIC8vLworICAvLy8gUGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgLVdyZXBlYXRlZC11c2Utb2Ytd2Vhay4KKyAgY2xhc3MgV2Vha1VzZVR5IHsKKyAgICBsbHZtOjpQb2ludGVySW50UGFpcjxjb25zdCBFeHByICosIDEsIGJvb2w+IFJlcDsKKworICBwdWJsaWM6CisgICAgV2Vha1VzZVR5KGNvbnN0IEV4cHIgKlVzZSwgYm9vbCBJc1JlYWQpIDogUmVwKFVzZSwgSXNSZWFkKSB7fQorCisgICAgY29uc3QgRXhwciAqZ2V0VXNlRXhwcigpIGNvbnN0IHsgcmV0dXJuIFJlcC5nZXRQb2ludGVyKCk7IH0KKyAgICBib29sIGlzVW5zYWZlKCkgY29uc3QgeyByZXR1cm4gUmVwLmdldEludCgpOyB9CisgICAgdm9pZCBtYXJrU2FmZSgpIHsgUmVwLnNldEludChmYWxzZSk7IH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBXZWFrVXNlVHkgJk90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gUmVwID09IE90aGVyLlJlcDsKKyAgICB9CisgIH07CisKKyAgLy8vIFVzZWQgdG8gY29sbGVjdCB1c2VzIG9mIGEgcGFydGljdWxhciB3ZWFrIG9iamVjdCBpbiBhIGZ1bmN0aW9uIGJvZHkuCisgIC8vLworICAvLy8gUGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgLVdyZXBlYXRlZC11c2Utb2Ytd2Vhay4KKyAgdXNpbmcgV2Vha1VzZVZlY3RvciA9IFNtYWxsVmVjdG9yPFdlYWtVc2VUeSwgND47CisKKyAgLy8vIFVzZWQgdG8gY29sbGVjdCBhbGwgdXNlcyBvZiB3ZWFrIG9iamVjdHMgaW4gYSBmdW5jdGlvbiBib2R5LgorICAvLy8KKyAgLy8vIFBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIC1XcmVwZWF0ZWQtdXNlLW9mLXdlYWsuCisgIHVzaW5nIFdlYWtPYmplY3RVc2VNYXAgPQorICAgICAgbGx2bTo6U21hbGxEZW5zZU1hcDxXZWFrT2JqZWN0UHJvZmlsZVR5LCBXZWFrVXNlVmVjdG9yLCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBXZWFrT2JqZWN0UHJvZmlsZVR5OjpEZW5zZU1hcEluZm8+OworCitwcml2YXRlOgorICAvLy8gVXNlZCB0byBjb2xsZWN0IGFsbCB1c2VzIG9mIHdlYWsgb2JqZWN0cyBpbiB0aGlzIGZ1bmN0aW9uIGJvZHkuCisgIC8vLworICAvLy8gUGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgLVdyZXBlYXRlZC11c2Utb2Ytd2Vhay4KKyAgV2Vha09iamVjdFVzZU1hcCBXZWFrT2JqZWN0VXNlczsKKworcHJvdGVjdGVkOgorICBGdW5jdGlvblNjb3BlSW5mbyhjb25zdCBGdW5jdGlvblNjb3BlSW5mbyYpID0gZGVmYXVsdDsKKworcHVibGljOgorICBGdW5jdGlvblNjb3BlSW5mbyhEaWFnbm9zdGljc0VuZ2luZSAmRGlhZykKKyAgICAgIDogS2luZChTS19GdW5jdGlvbiksIEhhc0JyYW5jaFByb3RlY3RlZFNjb3BlKGZhbHNlKSwKKyAgICAgICAgSGFzQnJhbmNoSW50b1Njb3BlKGZhbHNlKSwgSGFzSW5kaXJlY3RHb3RvKGZhbHNlKSwKKyAgICAgICAgSGFzRHJvcHBlZFN0bXQoZmFsc2UpLCBIYXNPTVBEZWNsYXJlUmVkdWN0aW9uQ29tYmluZXIoZmFsc2UpLAorICAgICAgICBIYXNGYWxsdGhyb3VnaFN0bXQoZmFsc2UpLCBIYXNQb3RlbnRpYWxBdmFpbGFiaWxpdHlWaW9sYXRpb25zKGZhbHNlKSwKKyAgICAgICAgT2JqQ1Nob3VsZENhbGxTdXBlcihmYWxzZSksIE9iakNJc0Rlc2lnbmF0ZWRJbml0KGZhbHNlKSwKKyAgICAgICAgT2JqQ1dhcm5Gb3JOb0Rlc2lnbmF0ZWRJbml0Q2hhaW4oZmFsc2UpLCBPYmpDSXNTZWNvbmRhcnlJbml0KGZhbHNlKSwKKyAgICAgICAgT2JqQ1dhcm5Gb3JOb0luaXREZWxlZ2F0aW9uKGZhbHNlKSwgTmVlZHNDb3JvdXRpbmVTdXNwZW5kcyh0cnVlKSwKKyAgICAgICAgRXJyb3JUcmFwKERpYWcpIHt9CisKKyAgdmlydHVhbCB+RnVuY3Rpb25TY29wZUluZm8oKTsKKworICAvLy8gUmVjb3JkIHRoYXQgYSB3ZWFrIG9iamVjdCB3YXMgYWNjZXNzZWQuCisgIC8vLworICAvLy8gUGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgLVdyZXBlYXRlZC11c2Utb2Ytd2Vhay4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEV4cHJUPgorICBpbmxpbmUgdm9pZCByZWNvcmRVc2VPZldlYWsoY29uc3QgRXhwclQgKkUsIGJvb2wgSXNSZWFkID0gdHJ1ZSk7CisKKyAgdm9pZCByZWNvcmRVc2VPZldlYWsoY29uc3QgT2JqQ01lc3NhZ2VFeHByICpNc2csCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNQcm9wZXJ0eURlY2wgKlByb3ApOworCisgIC8vLyBSZWNvcmQgdGhhdCBhIGdpdmVuIGV4cHJlc3Npb24gaXMgYSAic2FmZSIgYWNjZXNzIG9mIGEgd2VhayBvYmplY3QgKGUuZy4KKyAgLy8vIGFzc2lnbmluZyBpdCB0byBhIHN0cm9uZyB2YXJpYWJsZS4pCisgIC8vLworICAvLy8gUGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgLVdyZXBlYXRlZC11c2Utb2Ytd2Vhay4KKyAgdm9pZCBtYXJrU2FmZVdlYWtVc2UoY29uc3QgRXhwciAqRSk7CisKKyAgY29uc3QgV2Vha09iamVjdFVzZU1hcCAmZ2V0V2Vha09iamVjdFVzZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIFdlYWtPYmplY3RVc2VzOworICB9CisKKyAgdm9pZCBzZXRIYXNCcmFuY2hJbnRvU2NvcGUoKSB7CisgICAgSGFzQnJhbmNoSW50b1Njb3BlID0gdHJ1ZTsKKyAgfQorCisgIHZvaWQgc2V0SGFzQnJhbmNoUHJvdGVjdGVkU2NvcGUoKSB7CisgICAgSGFzQnJhbmNoUHJvdGVjdGVkU2NvcGUgPSB0cnVlOworICB9CisKKyAgdm9pZCBzZXRIYXNJbmRpcmVjdEdvdG8oKSB7CisgICAgSGFzSW5kaXJlY3RHb3RvID0gdHJ1ZTsKKyAgfQorCisgIHZvaWQgc2V0SGFzRHJvcHBlZFN0bXQoKSB7CisgICAgSGFzRHJvcHBlZFN0bXQgPSB0cnVlOworICB9CisKKyAgdm9pZCBzZXRIYXNPTVBEZWNsYXJlUmVkdWN0aW9uQ29tYmluZXIoKSB7CisgICAgSGFzT01QRGVjbGFyZVJlZHVjdGlvbkNvbWJpbmVyID0gdHJ1ZTsKKyAgfQorCisgIHZvaWQgc2V0SGFzRmFsbHRocm91Z2hTdG10KCkgeworICAgIEhhc0ZhbGx0aHJvdWdoU3RtdCA9IHRydWU7CisgIH0KKworICB2b2lkIHNldEhhc0NYWFRyeShTb3VyY2VMb2NhdGlvbiBUcnlMb2MpIHsKKyAgICBzZXRIYXNCcmFuY2hQcm90ZWN0ZWRTY29wZSgpOworICAgIEZpcnN0Q1hYVHJ5TG9jID0gVHJ5TG9jOworICB9CisKKyAgdm9pZCBzZXRIYXNTRUhUcnkoU291cmNlTG9jYXRpb24gVHJ5TG9jKSB7CisgICAgc2V0SGFzQnJhbmNoUHJvdGVjdGVkU2NvcGUoKTsKKyAgICBGaXJzdFNFSFRyeUxvYyA9IFRyeUxvYzsKKyAgfQorCisgIGJvb2wgTmVlZHNTY29wZUNoZWNraW5nKCkgY29uc3QgeworICAgIHJldHVybiAhSGFzRHJvcHBlZFN0bXQgJiYKKyAgICAgICAgKEhhc0luZGlyZWN0R290byB8fAorICAgICAgICAgIChIYXNCcmFuY2hQcm90ZWN0ZWRTY29wZSAmJiBIYXNCcmFuY2hJbnRvU2NvcGUpKTsKKyAgfQorCisgIGJvb2wgaXNDb3JvdXRpbmUoKSBjb25zdCB7IHJldHVybiAhRmlyc3RDb3JvdXRpbmVTdG10TG9jLmlzSW52YWxpZCgpOyB9CisKKyAgdm9pZCBzZXRGaXJzdENvcm91dGluZVN0bXQoU291cmNlTG9jYXRpb24gTG9jLCBTdHJpbmdSZWYgS2V5d29yZCkgeworICAgIGFzc2VydChGaXJzdENvcm91dGluZVN0bXRMb2MuaXNJbnZhbGlkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAiZmlyc3QgY29yb3V0aW5lIHN0YXRlbWVudCBsb2NhdGlvbiBhbHJlYWR5IHNldCIpOworICAgIEZpcnN0Q29yb3V0aW5lU3RtdExvYyA9IExvYzsKKyAgICBGaXJzdENvcm91dGluZVN0bXRLaW5kID0gbGx2bTo6U3RyaW5nU3dpdGNoPHVuc2lnbmVkIGNoYXI+KEtleXdvcmQpCisgICAgICAgICAgICAuQ2FzZSgiY29fcmV0dXJuIiwgMCkKKyAgICAgICAgICAgIC5DYXNlKCJjb19hd2FpdCIsIDEpCisgICAgICAgICAgICAuQ2FzZSgiY29feWllbGQiLCAyKTsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRGaXJzdENvcm91dGluZVN0bXRLZXl3b3JkKCkgY29uc3QgeworICAgIGFzc2VydChGaXJzdENvcm91dGluZVN0bXRMb2MuaXNWYWxpZCgpCisgICAgICAgICAgICAgICAgICAgJiYgIm5vIGNvcm91dGluZSBzdGF0ZW1lbnQgYXZhaWxhYmxlIik7CisgICAgc3dpdGNoIChGaXJzdENvcm91dGluZVN0bXRLaW5kKSB7CisgICAgY2FzZSAwOiByZXR1cm4gImNvX3JldHVybiI7CisgICAgY2FzZSAxOiByZXR1cm4gImNvX2F3YWl0IjsKKyAgICBjYXNlIDI6IHJldHVybiAiY29feWllbGQiOworICAgIGRlZmF1bHQ6CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJGaXJzdENvcm91dGluZVN0bXRLaW5kIGhhcyBhbiBpbnZhbGlkIHZhbHVlIik7CisgICAgfTsKKyAgfQorCisgIHZvaWQgc2V0TmVlZHNDb3JvdXRpbmVTdXNwZW5kcyhib29sIHZhbHVlID0gdHJ1ZSkgeworICAgIGFzc2VydCgoIXZhbHVlIHx8IENvcm91dGluZVN1c3BlbmRzLmZpcnN0ID09IG51bGxwdHIpICYmCisgICAgICAgICAgICAid2UgYWxyZWFkeSBoYXZlIHZhbGlkIHN1c3BlbmQgcG9pbnRzIik7CisgICAgTmVlZHNDb3JvdXRpbmVTdXNwZW5kcyA9IHZhbHVlOworICB9CisKKyAgYm9vbCBoYXNJbnZhbGlkQ29yb3V0aW5lU3VzcGVuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuICFOZWVkc0Nvcm91dGluZVN1c3BlbmRzICYmIENvcm91dGluZVN1c3BlbmRzLmZpcnN0ID09IG51bGxwdHI7CisgIH0KKworICB2b2lkIHNldENvcm91dGluZVN1c3BlbmRzKFN0bXQgKkluaXRpYWwsIFN0bXQgKkZpbmFsKSB7CisgICAgYXNzZXJ0KEluaXRpYWwgJiYgRmluYWwgJiYgInN1c3BlbmQgcG9pbnRzIGNhbm5vdCBiZSBudWxsIik7CisgICAgYXNzZXJ0KENvcm91dGluZVN1c3BlbmRzLmZpcnN0ID09IG51bGxwdHIgJiYgInN1c3BlbmQgcG9pbnRzIGFscmVhZHkgc2V0Iik7CisgICAgTmVlZHNDb3JvdXRpbmVTdXNwZW5kcyA9IGZhbHNlOworICAgIENvcm91dGluZVN1c3BlbmRzLmZpcnN0ID0gSW5pdGlhbDsKKyAgICBDb3JvdXRpbmVTdXNwZW5kcy5zZWNvbmQgPSBGaW5hbDsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2xlYXIgb3V0IHRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZ1bmN0aW9uIHNjb3BlLCBtYWtpbmcgaXQKKyAgLy8vIHN1aXRhYmxlIGZvciByZXVzZS4KKyAgdm9pZCBDbGVhcigpOworfTsKKworY2xhc3MgQ2FwdHVyZSB7CisgIC8vIFRoZXJlIGFyZSB0aHJlZSBjYXRlZ29yaWVzIG9mIGNhcHR1cmU6IGNhcHR1cmluZyAndGhpcycsIGNhcHR1cmluZworICAvLyBsb2NhbCB2YXJpYWJsZXMsIGFuZCBDKysxeSBpbml0aWFsaXplZCBjYXB0dXJlcyAod2hpY2ggY2FuIGhhdmUgYW4KKyAgLy8gYXJiaXRyYXJ5IGluaXRpYWxpemVyLCBhbmQgZG9uJ3QgcmVhbGx5IGNhcHR1cmUgaW4gdGhlIHRyYWRpdGlvbmFsCisgIC8vIHNlbnNlIGF0IGFsbCkuCisgIC8vCisgIC8vIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGNhcHR1cmUgYSBsb2NhbCB2YXJpYWJsZToKKyAgLy8gIC0gY2FwdHVyZSBieSBjb3B5IGluIHRoZSBDKysxMSBzZW5zZSwKKyAgLy8gIC0gY2FwdHVyZSBieSByZWZlcmVuY2UgaW4gdGhlIEMrKzExIHNlbnNlLCBhbmQKKyAgLy8gIC0gX19ibG9jayBjYXB0dXJlLgorICAvLyBMYW1iZGFzIGV4cGxpY2l0bHkgc3BlY2lmeSBjYXB0dXJlIGJ5IGNvcHkgb3IgY2FwdHVyZSBieSByZWZlcmVuY2UuCisgIC8vIEZvciBibG9ja3MsIF9fYmxvY2sgY2FwdHVyZSBhcHBsaWVzIHRvIHZhcmlhYmxlcyB3aXRoIHRoYXQgYW5ub3RhdGlvbiwKKyAgLy8gdmFyaWFibGVzIG9mIHJlZmVyZW5jZSB0eXBlIGFyZSBjYXB0dXJlZCBieSByZWZlcmVuY2UsIGFuZCBvdGhlcgorICAvLyB2YXJpYWJsZXMgYXJlIGNhcHR1cmVkIGJ5IGNvcHkuCisgIGVudW0gQ2FwdHVyZUtpbmQgeworICAgIENhcF9CeUNvcHksIENhcF9CeVJlZiwgQ2FwX0Jsb2NrLCBDYXBfVkxBCisgIH07CisgIGVudW0geworICAgIElzTmVzdGVkQ2FwdHVyZSA9IDB4MSwKKyAgICBJc1RoaXNDYXB0dXJlZCA9IDB4MgorICB9OworCisgIC8vLyBUaGUgdmFyaWFibGUgYmVpbmcgY2FwdHVyZWQgKGlmIHdlIGFyZSBub3QgY2FwdHVyaW5nICd0aGlzJykgYW5kIHdoZXRoZXIKKyAgLy8vIHRoaXMgaXMgYSBuZXN0ZWQgY2FwdHVyZSwgYW5kIHdoZXRoZXIgd2UgYXJlIGNhcHR1cmluZyAndGhpcycKKyAgbGx2bTo6UG9pbnRlckludFBhaXI8VmFyRGVjbCosIDI+IFZhckFuZE5lc3RlZEFuZFRoaXM7CisKKyAgLy8vIEV4cHJlc3Npb24gdG8gaW5pdGlhbGl6ZSBhIGZpZWxkIG9mIHRoZSBnaXZlbiB0eXBlLCBhbmQgdGhlIGtpbmQgb2YKKyAgLy8vIGNhcHR1cmUgKGlmIHRoaXMgaXMgYSBjYXB0dXJlIGFuZCBub3QgYW4gaW5pdC1jYXB0dXJlKS4gVGhlIGV4cHJlc3Npb24KKyAgLy8vIGlzIG9ubHkgcmVxdWlyZWQgaWYgd2UgYXJlIGNhcHR1cmluZyBCeVZhbCBhbmQgdGhlIHZhcmlhYmxlJ3MgdHlwZSBoYXMKKyAgLy8vIGEgbm9uLXRyaXZpYWwgY29weSBjb25zdHJ1Y3Rvci4KKyAgbGx2bTo6UG9pbnRlckludFBhaXI8dm9pZCAqLCAyLCBDYXB0dXJlS2luZD4gSW5pdEV4cHJBbmRDYXB0dXJlS2luZDsKKworICAvLy8gXGJyaWVmIFRoZSBzb3VyY2UgbG9jYXRpb24gYXQgd2hpY2ggdGhlIGZpcnN0IGNhcHR1cmUgb2NjdXJyZWQuCisgIFNvdXJjZUxvY2F0aW9uIExvYzsKKworICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgZWxsaXBzaXMgdGhhdCBleHBhbmRzIGEgcGFyYW1ldGVyIHBhY2suCisgIFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jOworCisgIC8vLyBcYnJpZWYgVGhlIHR5cGUgYXMgaXQgd2FzIGNhcHR1cmVkLCB3aGljaCBpcyBpbiBlZmZlY3QgdGhlIHR5cGUgb2YgdGhlCisgIC8vLyBub24tc3RhdGljIGRhdGEgbWVtYmVyIHRoYXQgd291bGQgaG9sZCB0aGUgY2FwdHVyZS4KKyAgUXVhbFR5cGUgQ2FwdHVyZVR5cGU7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIGFuIGV4cGxpY2l0IGNhcHR1cmUgaGFzIGJlZW4gb2RyLXVzZWQgaW4gdGhlIGJvZHkgb2YgdGhlCisgIC8vLyBsYW1iZGEuCisgIGJvb2wgT0RSVXNlZCA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgV2hldGhlciBhbiBleHBsaWNpdCBjYXB0dXJlIGhhcyBiZWVuIG5vbi1vZHItdXNlZCBpbiB0aGUgYm9keSBvZgorICAvLy8gdGhlIGxhbWJkYS4KKyAgYm9vbCBOb25PRFJVc2VkID0gZmFsc2U7CisKK3B1YmxpYzoKKyAgQ2FwdHVyZShWYXJEZWNsICpWYXIsIGJvb2wgQmxvY2ssIGJvb2wgQnlSZWYsIGJvb2wgSXNOZXN0ZWQsCisgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYywKKyAgICAgICAgICBRdWFsVHlwZSBDYXB0dXJlVHlwZSwgRXhwciAqQ3B5KQorICAgICAgOiBWYXJBbmROZXN0ZWRBbmRUaGlzKFZhciwgSXNOZXN0ZWQgPyBJc05lc3RlZENhcHR1cmUgOiAwKSwKKyAgICAgICAgSW5pdEV4cHJBbmRDYXB0dXJlS2luZCgKKyAgICAgICAgICAgIENweSwgIVZhciA/IENhcF9WTEEgOiBCbG9jayA/IENhcF9CbG9jayA6IEJ5UmVmID8gQ2FwX0J5UmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENhcF9CeUNvcHkpLAorICAgICAgICBMb2MoTG9jKSwgRWxsaXBzaXNMb2MoRWxsaXBzaXNMb2MpLCBDYXB0dXJlVHlwZShDYXB0dXJlVHlwZSkge30KKworICBlbnVtIElzVGhpc0NhcHR1cmUgeyBUaGlzQ2FwdHVyZSB9OworICBDYXB0dXJlKElzVGhpc0NhcHR1cmUsIGJvb2wgSXNOZXN0ZWQsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICBRdWFsVHlwZSBDYXB0dXJlVHlwZSwgRXhwciAqQ3B5LCBjb25zdCBib29sIEJ5Q29weSkKKyAgICAgIDogVmFyQW5kTmVzdGVkQW5kVGhpcygKKyAgICAgICAgICAgIG51bGxwdHIsIChJc1RoaXNDYXB0dXJlZCB8IChJc05lc3RlZCA/IElzTmVzdGVkQ2FwdHVyZSA6IDApKSksCisgICAgICAgIEluaXRFeHByQW5kQ2FwdHVyZUtpbmQoQ3B5LCBCeUNvcHkgPyBDYXBfQnlDb3B5IDogQ2FwX0J5UmVmKSwKKyAgICAgICAgTG9jKExvYyksIENhcHR1cmVUeXBlKENhcHR1cmVUeXBlKSB7fQorCisgIGJvb2wgaXNUaGlzQ2FwdHVyZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFyQW5kTmVzdGVkQW5kVGhpcy5nZXRJbnQoKSAmIElzVGhpc0NhcHR1cmVkOworICB9CisKKyAgYm9vbCBpc1ZhcmlhYmxlQ2FwdHVyZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIWlzVGhpc0NhcHR1cmUoKSAmJiAhaXNWTEFUeXBlQ2FwdHVyZSgpOworICB9CisKKyAgYm9vbCBpc0NvcHlDYXB0dXJlKCkgY29uc3QgeworICAgIHJldHVybiBJbml0RXhwckFuZENhcHR1cmVLaW5kLmdldEludCgpID09IENhcF9CeUNvcHk7CisgIH0KKworICBib29sIGlzUmVmZXJlbmNlQ2FwdHVyZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5pdEV4cHJBbmRDYXB0dXJlS2luZC5nZXRJbnQoKSA9PSBDYXBfQnlSZWY7CisgIH0KKworICBib29sIGlzQmxvY2tDYXB0dXJlKCkgY29uc3QgeworICAgIHJldHVybiBJbml0RXhwckFuZENhcHR1cmVLaW5kLmdldEludCgpID09IENhcF9CbG9jazsKKyAgfQorCisgIGJvb2wgaXNWTEFUeXBlQ2FwdHVyZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5pdEV4cHJBbmRDYXB0dXJlS2luZC5nZXRJbnQoKSA9PSBDYXBfVkxBOworICB9CisKKyAgYm9vbCBpc05lc3RlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFyQW5kTmVzdGVkQW5kVGhpcy5nZXRJbnQoKSAmIElzTmVzdGVkQ2FwdHVyZTsKKyAgfQorCisgIGJvb2wgaXNPRFJVc2VkKCkgY29uc3QgeyByZXR1cm4gT0RSVXNlZDsgfQorICBib29sIGlzTm9uT0RSVXNlZCgpIGNvbnN0IHsgcmV0dXJuIE5vbk9EUlVzZWQ7IH0KKyAgdm9pZCBtYXJrVXNlZChib29sIElzT0RSVXNlKSB7IChJc09EUlVzZSA/IE9EUlVzZWQgOiBOb25PRFJVc2VkKSA9IHRydWU7IH0KKworICBWYXJEZWNsICpnZXRWYXJpYWJsZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNWYXJpYWJsZUNhcHR1cmUoKSk7CisgICAgcmV0dXJuIFZhckFuZE5lc3RlZEFuZFRoaXMuZ2V0UG9pbnRlcigpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbG9jYXRpb24gYXQgd2hpY2ggdGhpcyB2YXJpYWJsZSB3YXMgY2FwdHVyZWQuCisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBlbGxpcHNpcywgd2hvc2UgcHJlc2VuY2UKKyAgLy8vIGluZGljYXRlcyB0aGF0IHRoZSBjYXB0dXJlIGlzIGEgcGFjayBleHBhbnNpb24uCisgIFNvdXJjZUxvY2F0aW9uIGdldEVsbGlwc2lzTG9jKCkgY29uc3QgeyByZXR1cm4gRWxsaXBzaXNMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBjYXB0dXJlIHR5cGUgZm9yIHRoaXMgY2FwdHVyZSwgd2hpY2ggaXMgZWZmZWN0aXZlbHkKKyAgLy8vIHRoZSB0eXBlIG9mIHRoZSBub24tc3RhdGljIGRhdGEgbWVtYmVyIGluIHRoZSBsYW1iZGEvYmxvY2sgc3RydWN0dXJlCisgIC8vLyB0aGF0IHdvdWxkIHN0b3JlIHRoaXMgY2FwdHVyZS4KKyAgUXVhbFR5cGUgZ2V0Q2FwdHVyZVR5cGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpc1RoaXNDYXB0dXJlKCkpOworICAgIHJldHVybiBDYXB0dXJlVHlwZTsKKyAgfQorCisgIEV4cHIgKmdldEluaXRFeHByKCkgY29uc3QgeworICAgIGFzc2VydCghaXNWTEFUeXBlQ2FwdHVyZSgpICYmICJubyBpbml0IGV4cHJlc3Npb24gZm9yIHR5cGUgY2FwdHVyZSIpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxFeHByICo+KEluaXRFeHByQW5kQ2FwdHVyZUtpbmQuZ2V0UG9pbnRlcigpKTsKKyAgfQorfTsKKworY2xhc3MgQ2FwdHVyaW5nU2NvcGVJbmZvIDogcHVibGljIEZ1bmN0aW9uU2NvcGVJbmZvIHsKK3Byb3RlY3RlZDoKKyAgQ2FwdHVyaW5nU2NvcGVJbmZvKGNvbnN0IENhcHR1cmluZ1Njb3BlSW5mbyYpID0gZGVmYXVsdDsKKworcHVibGljOgorICBlbnVtIEltcGxpY2l0Q2FwdHVyZVN0eWxlIHsKKyAgICBJbXBDYXBfTm9uZSwgSW1wQ2FwX0xhbWJkYUJ5dmFsLCBJbXBDYXBfTGFtYmRhQnlyZWYsIEltcENhcF9CbG9jaywKKyAgICBJbXBDYXBfQ2FwdHVyZWRSZWdpb24KKyAgfTsKKworICBJbXBsaWNpdENhcHR1cmVTdHlsZSBJbXBDYXB0dXJlU3R5bGU7CisKKyAgQ2FwdHVyaW5nU2NvcGVJbmZvKERpYWdub3N0aWNzRW5naW5lICZEaWFnLCBJbXBsaWNpdENhcHR1cmVTdHlsZSBTdHlsZSkKKyAgICAgIDogRnVuY3Rpb25TY29wZUluZm8oRGlhZyksIEltcENhcHR1cmVTdHlsZShTdHlsZSkge30KKworICAvLy8gQ2FwdHVyZU1hcCAtIEEgbWFwIG9mIGNhcHR1cmVkIHZhcmlhYmxlcyB0byAoaW5kZXgrMSkgaW50byBDYXB0dXJlcy4KKyAgbGx2bTo6RGVuc2VNYXA8VmFyRGVjbCosIHVuc2lnbmVkPiBDYXB0dXJlTWFwOworCisgIC8vLyBDWFhUaGlzQ2FwdHVyZUluZGV4IC0gVGhlIChpbmRleCsxKSBvZiB0aGUgY2FwdHVyZSBvZiAndGhpcyc7CisgIC8vLyB6ZXJvIGlmICd0aGlzJyBpcyBub3QgY2FwdHVyZWQuCisgIHVuc2lnbmVkIENYWFRoaXNDYXB0dXJlSW5kZXggPSAwOworCisgIC8vLyBDYXB0dXJlcyAtIFRoZSBjYXB0dXJlcy4KKyAgU21hbGxWZWN0b3I8Q2FwdHVyZSwgND4gQ2FwdHVyZXM7CisKKyAgLy8vIFxicmllZiAtIFdoZXRoZXIgdGhlIHRhcmdldCB0eXBlIG9mIHJldHVybiBzdGF0ZW1lbnRzIGluIHRoaXMgY29udGV4dAorICAvLy8gaXMgZGVkdWNlZCAoZS5nLiBhIGxhbWJkYSBvciBibG9jayB3aXRoIG9taXR0ZWQgcmV0dXJuIHR5cGUpLgorICBib29sIEhhc0ltcGxpY2l0UmV0dXJuVHlwZSA9IGZhbHNlOworCisgIC8vLyBSZXR1cm5UeXBlIC0gVGhlIHRhcmdldCB0eXBlIG9mIHJldHVybiBzdGF0ZW1lbnRzIGluIHRoaXMgY29udGV4dCwKKyAgLy8vIG9yIG51bGwgaWYgdW5rbm93bi4KKyAgUXVhbFR5cGUgUmV0dXJuVHlwZTsKKworICB2b2lkIGFkZENhcHR1cmUoVmFyRGVjbCAqVmFyLCBib29sIGlzQmxvY2ssIGJvb2wgaXNCeXJlZiwgYm9vbCBpc05lc3RlZCwKKyAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MsIAorICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgQ2FwdHVyZVR5cGUsIEV4cHIgKkNweSkgeworICAgIENhcHR1cmVzLnB1c2hfYmFjayhDYXB0dXJlKFZhciwgaXNCbG9jaywgaXNCeXJlZiwgaXNOZXN0ZWQsIExvYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxsaXBzaXNMb2MsIENhcHR1cmVUeXBlLCBDcHkpKTsKKyAgICBDYXB0dXJlTWFwW1Zhcl0gPSBDYXB0dXJlcy5zaXplKCk7CisgIH0KKworICB2b2lkIGFkZFZMQVR5cGVDYXB0dXJlKFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgQ2FwdHVyZVR5cGUpIHsKKyAgICBDYXB0dXJlcy5wdXNoX2JhY2soQ2FwdHVyZSgvKlZhciovIG51bGxwdHIsIC8qaXNCbG9jayovIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNCeXJlZiovIGZhbHNlLCAvKmlzTmVzdGVkKi8gZmFsc2UsIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkVsbGlwc2lzTG9jKi8gU291cmNlTG9jYXRpb24oKSwgQ2FwdHVyZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypDcHkqLyBudWxscHRyKSk7CisgIH0KKworICAvLyBOb3RlLCB3ZSBkbyBub3QgbmVlZCB0byBhZGQgdGhlIHR5cGUgb2YgJ3RoaXMnIHNpbmNlIHRoYXQgaXMgYWx3YXlzCisgIC8vIHJldHJpZXZhYmxlIGZyb20gU2VtYTo6Z2V0Q3VycmVudFRoaXNUeXBlIC0gYW5kIGlzIGFsc28gZW5jb2RlZCB3aXRoaW4gdGhlCisgIC8vIHR5cGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgRmllbGREZWNsLgorICB2b2lkIGFkZFRoaXNDYXB0dXJlKGJvb2wgaXNOZXN0ZWQsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICBFeHByICpDcHksIGJvb2wgQnlDb3B5KTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBDKysgJ3RoaXMnIGlzIGNhcHR1cmVkLgorICBib29sIGlzQ1hYVGhpc0NhcHR1cmVkKCkgY29uc3QgeyByZXR1cm4gQ1hYVGhpc0NhcHR1cmVJbmRleCAhPSAwOyB9CisgIAorICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBjYXB0dXJlIG9mIEMrKyAndGhpcycsIGlmIGl0IGhhcyBiZWVuIGNhcHR1cmVkLgorICBDYXB0dXJlICZnZXRDWFhUaGlzQ2FwdHVyZSgpIHsKKyAgICBhc3NlcnQoaXNDWFhUaGlzQ2FwdHVyZWQoKSAmJiAidGhpcyBoYXMgbm90IGJlZW4gY2FwdHVyZWQiKTsKKyAgICByZXR1cm4gQ2FwdHVyZXNbQ1hYVGhpc0NhcHR1cmVJbmRleCAtIDFdOworICB9CisgIAorICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiB2YXJpYWJsZSBoYXMgYmVlbiBjYXB0dXJlZC4KKyAgYm9vbCBpc0NhcHR1cmVkKFZhckRlY2wgKlZhcikgY29uc3QgeworICAgIHJldHVybiBDYXB0dXJlTWFwLmNvdW50KFZhcik7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiB2YXJpYWJsZS1hcnJheSB0eXBlIGhhcyBiZWVuIGNhcHR1cmVkLgorICBib29sIGlzVkxBVHlwZUNhcHR1cmVkKGNvbnN0IFZhcmlhYmxlQXJyYXlUeXBlICpWQVQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGNhcHR1cmUgb2YgdGhlIGdpdmVuIHZhcmlhYmxlLCBpZiBpdCBoYXMgYmVlbgorICAvLy8gY2FwdHVyZWQgYWxyZWFkeS4KKyAgQ2FwdHVyZSAmZ2V0Q2FwdHVyZShWYXJEZWNsICpWYXIpIHsKKyAgICBhc3NlcnQoaXNDYXB0dXJlZChWYXIpICYmICJWYXJpYWJsZSBoYXMgbm90IGJlZW4gY2FwdHVyZWQiKTsKKyAgICByZXR1cm4gQ2FwdHVyZXNbQ2FwdHVyZU1hcFtWYXJdIC0gMV07CisgIH0KKworICBjb25zdCBDYXB0dXJlICZnZXRDYXB0dXJlKFZhckRlY2wgKlZhcikgY29uc3QgeworICAgIGxsdm06OkRlbnNlTWFwPFZhckRlY2wqLCB1bnNpZ25lZD46OmNvbnN0X2l0ZXJhdG9yIEtub3duCisgICAgICA9IENhcHR1cmVNYXAuZmluZChWYXIpOworICAgIGFzc2VydChLbm93biAhPSBDYXB0dXJlTWFwLmVuZCgpICYmICJWYXJpYWJsZSBoYXMgbm90IGJlZW4gY2FwdHVyZWQiKTsKKyAgICByZXR1cm4gQ2FwdHVyZXNbS25vd24tPnNlY29uZCAtIDFdOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBGdW5jdGlvblNjb3BlSW5mbyAqRlNJKSB7IAorICAgIHJldHVybiBGU0ktPktpbmQgPT0gU0tfQmxvY2sgfHwgRlNJLT5LaW5kID09IFNLX0xhbWJkYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRlNJLT5LaW5kID09IFNLX0NhcHR1cmVkUmVnaW9uOworICB9Cit9OworCisvLy8gXGJyaWVmIFJldGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBibG9jayB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBwYXJzZWQuCitjbGFzcyBCbG9ja1Njb3BlSW5mbyBmaW5hbCA6IHB1YmxpYyBDYXB0dXJpbmdTY29wZUluZm8geworcHVibGljOgorICBCbG9ja0RlY2wgKlRoZURlY2w7CisgIAorICAvLy8gVGhlU2NvcGUgLSBUaGlzIGlzIHRoZSBzY29wZSBmb3IgdGhlIGJsb2NrIGl0c2VsZiwgd2hpY2ggY29udGFpbnMKKyAgLy8vIGFyZ3VtZW50cyBldGMuCisgIFNjb3BlICpUaGVTY29wZTsKKworICAvLy8gQmxvY2tUeXBlIC0gVGhlIGZ1bmN0aW9uIHR5cGUgb2YgdGhlIGJsb2NrLCBpZiBvbmUgd2FzIGdpdmVuLgorICAvLy8gSXRzIHJldHVybiB0eXBlIG1heSBiZSBCdWlsdGluVHlwZTo6RGVwZW5kZW50LgorICBRdWFsVHlwZSBGdW5jdGlvblR5cGU7CisKKyAgQmxvY2tTY29wZUluZm8oRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWcsIFNjb3BlICpCbG9ja1Njb3BlLCBCbG9ja0RlY2wgKkJsb2NrKQorICAgICAgOiBDYXB0dXJpbmdTY29wZUluZm8oRGlhZywgSW1wQ2FwX0Jsb2NrKSwgVGhlRGVjbChCbG9jayksCisgICAgICAgIFRoZVNjb3BlKEJsb2NrU2NvcGUpIHsKKyAgICBLaW5kID0gU0tfQmxvY2s7CisgIH0KKworICB+QmxvY2tTY29wZUluZm8oKSBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEZ1bmN0aW9uU2NvcGVJbmZvICpGU0kpIHsgCisgICAgcmV0dXJuIEZTSS0+S2luZCA9PSBTS19CbG9jazsgCisgIH0KK307CisKKy8vLyBcYnJpZWYgUmV0YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGNhcHR1cmVkIHJlZ2lvbi4KK2NsYXNzIENhcHR1cmVkUmVnaW9uU2NvcGVJbmZvIGZpbmFsIDogcHVibGljIENhcHR1cmluZ1Njb3BlSW5mbyB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgVGhlIENhcHR1cmVkRGVjbCBmb3IgdGhpcyBzdGF0ZW1lbnQuCisgIENhcHR1cmVkRGVjbCAqVGhlQ2FwdHVyZWREZWNsOworCisgIC8vLyBcYnJpZWYgVGhlIGNhcHR1cmVkIHJlY29yZCB0eXBlLgorICBSZWNvcmREZWNsICpUaGVSZWNvcmREZWNsOworCisgIC8vLyBcYnJpZWYgVGhpcyBpcyB0aGUgZW5jbG9zaW5nIHNjb3BlIG9mIHRoZSBjYXB0dXJlZCByZWdpb24uCisgIFNjb3BlICpUaGVTY29wZTsKKworICAvLy8gXGJyaWVmIFRoZSBpbXBsaWNpdCBwYXJhbWV0ZXIgZm9yIHRoZSBjYXB0dXJlZCB2YXJpYWJsZXMuCisgIEltcGxpY2l0UGFyYW1EZWNsICpDb250ZXh0UGFyYW07CisKKyAgLy8vIFxicmllZiBUaGUga2luZCBvZiBjYXB0dXJlZCByZWdpb24uCisgIHVuc2lnbmVkIHNob3J0IENhcFJlZ2lvbktpbmQ7CisKKyAgdW5zaWduZWQgc2hvcnQgT3Blbk1QTGV2ZWw7CisKKyAgQ2FwdHVyZWRSZWdpb25TY29wZUluZm8oRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWcsIFNjb3BlICpTLCBDYXB0dXJlZERlY2wgKkNELAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmREZWNsICpSRCwgSW1wbGljaXRQYXJhbURlY2wgKkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVkUmVnaW9uS2luZCBLLCB1bnNpZ25lZCBPcGVuTVBMZXZlbCkKKyAgICAgIDogQ2FwdHVyaW5nU2NvcGVJbmZvKERpYWcsIEltcENhcF9DYXB0dXJlZFJlZ2lvbiksCisgICAgICAgIFRoZUNhcHR1cmVkRGVjbChDRCksIFRoZVJlY29yZERlY2woUkQpLCBUaGVTY29wZShTKSwKKyAgICAgICAgQ29udGV4dFBhcmFtKENvbnRleHQpLCBDYXBSZWdpb25LaW5kKEspLCBPcGVuTVBMZXZlbChPcGVuTVBMZXZlbCkgeworICAgIEtpbmQgPSBTS19DYXB0dXJlZFJlZ2lvbjsKKyAgfQorCisgIH5DYXB0dXJlZFJlZ2lvblNjb3BlSW5mbygpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgQSBkZXNjcmlwdGl2ZSBuYW1lIGZvciB0aGUga2luZCBvZiBjYXB0dXJlZCByZWdpb24gdGhpcyBpcy4KKyAgU3RyaW5nUmVmIGdldFJlZ2lvbk5hbWUoKSBjb25zdCB7CisgICAgc3dpdGNoIChDYXBSZWdpb25LaW5kKSB7CisgICAgY2FzZSBDUl9EZWZhdWx0OgorICAgICAgcmV0dXJuICJkZWZhdWx0IGNhcHR1cmVkIHN0YXRlbWVudCI7CisgICAgY2FzZSBDUl9PcGVuTVA6CisgICAgICByZXR1cm4gIk9wZW5NUCByZWdpb24iOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIGNhcHR1cmVkIHJlZ2lvbiBraW5kISIpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBGdW5jdGlvblNjb3BlSW5mbyAqRlNJKSB7CisgICAgcmV0dXJuIEZTSS0+S2luZCA9PSBTS19DYXB0dXJlZFJlZ2lvbjsKKyAgfQorfTsKKworY2xhc3MgTGFtYmRhU2NvcGVJbmZvIGZpbmFsIDogcHVibGljIENhcHR1cmluZ1Njb3BlSW5mbyB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgVGhlIGNsYXNzIHRoYXQgZGVzY3JpYmVzIHRoZSBsYW1iZGEuCisgIENYWFJlY29yZERlY2wgKkxhbWJkYSA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBUaGUgbGFtYmRhJ3MgY29tcGlsZXItZ2VuZXJhdGVkIFxjIG9wZXJhdG9yKCkuCisgIENYWE1ldGhvZERlY2wgKkNhbGxPcGVyYXRvciA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBTb3VyY2UgcmFuZ2UgY292ZXJpbmcgdGhlIGxhbWJkYSBpbnRyb2R1Y2VyIFsuLi5dLgorICBTb3VyY2VSYW5nZSBJbnRyb2R1Y2VyUmFuZ2U7CisKKyAgLy8vIFxicmllZiBTb3VyY2UgbG9jYXRpb24gb2YgdGhlICcmJyBvciAnPScgc3BlY2lmeWluZyB0aGUgZGVmYXVsdCBjYXB0dXJlCisgIC8vLyB0eXBlLCBpZiBhbnkuCisgIFNvdXJjZUxvY2F0aW9uIENhcHR1cmVEZWZhdWx0TG9jOworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBjYXB0dXJlcyBpbiB0aGUgXGMgQ2FwdHVyZXMgbGlzdCB0aGF0IGFyZQorICAvLy8gZXhwbGljaXQgY2FwdHVyZXMuCisgIHVuc2lnbmVkIE51bUV4cGxpY2l0Q2FwdHVyZXMgPSAwOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGlzIGEgbXV0YWJsZSBsYW1iZGEuCisgIGJvb2wgTXV0YWJsZSA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgKGVtcHR5KSBwYXJhbWV0ZXIgbGlzdCBpcyBleHBsaWNpdC4KKyAgYm9vbCBFeHBsaWNpdFBhcmFtcyA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgV2hldGhlciBhbnkgb2YgdGhlIGNhcHR1cmUgZXhwcmVzc2lvbnMgcmVxdWlyZXMgY2xlYW51cHMuCisgIENsZWFudXBJbmZvIENsZWFudXA7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoZSBsYW1iZGEgY29udGFpbnMgYW4gdW5leHBhbmRlZCBwYXJhbWV0ZXIgcGFjay4KKyAgYm9vbCBDb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBJZiB0aGlzIGlzIGEgZ2VuZXJpYyBsYW1iZGEsIHVzZSB0aGlzIGFzIHRoZSBkZXB0aCBvZiAKKyAgLy8vIGVhY2ggJ2F1dG8nIHBhcmFtZXRlciwgZHVyaW5nIGluaXRpYWwgQVNUIGNvbnN0cnVjdGlvbi4KKyAgdW5zaWduZWQgQXV0b1RlbXBsYXRlUGFyYW1ldGVyRGVwdGggPSAwOworCisgIC8vLyBcYnJpZWYgU3RvcmUgdGhlIGxpc3Qgb2YgdGhlIGF1dG8gcGFyYW1ldGVycyBmb3IgYSBnZW5lcmljIGxhbWJkYS4KKyAgLy8vIElmIHRoaXMgaXMgYSBnZW5lcmljIGxhbWJkYSwgc3RvcmUgdGhlIGxpc3Qgb2YgdGhlIGF1dG8gCisgIC8vLyBwYXJhbWV0ZXJzIGNvbnZlcnRlZCBpbnRvIFRlbXBsYXRlVHlwZVBhcm1EZWNscyBpbnRvIGEgdmVjdG9yCisgIC8vLyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgZ2VuZXJpYyBsYW1iZGEncyB0ZW1wbGF0ZQorICAvLy8gcGFyYW1ldGVyIGxpc3QsIGR1cmluZyBpbml0aWFsIEFTVCBjb25zdHJ1Y3Rpb24uCisgIFNtYWxsVmVjdG9yPFRlbXBsYXRlVHlwZVBhcm1EZWNsKiwgND4gQXV0b1RlbXBsYXRlUGFyYW1zOworCisgIC8vLyBJZiB0aGlzIGlzIGEgZ2VuZXJpYyBsYW1iZGEsIGFuZCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyCisgIC8vLyBsaXN0IGhhcyBiZWVuIGNyZWF0ZWQgKGZyb20gdGhlIEF1dG9UZW1wbGF0ZVBhcmFtcykgdGhlbgorICAvLy8gc3RvcmUgYSByZWZlcmVuY2UgdG8gaXQgKGNhY2hlIGl0IHRvIGF2b2lkIHJlY29uc3RydWN0aW5nIGl0KS4KKyAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpHTFRlbXBsYXRlUGFyYW1ldGVyTGlzdCA9IG51bGxwdHI7CisgIAorICAvLy8gXGJyaWVmIENvbnRhaW5zIGFsbCB2YXJpYWJsZS1yZWZlcnJpbmctZXhwcmVzc2lvbnMgKGkuZS4gRGVjbFJlZkV4cHJzCisgIC8vLyAgb3IgTWVtYmVyRXhwcnMpIHRoYXQgcmVmZXIgdG8gbG9jYWwgdmFyaWFibGVzIGluIGEgZ2VuZXJpYyBsYW1iZGEKKyAgLy8vICBvciBhIGxhbWJkYSBpbiBhIHBvdGVudGlhbGx5LWV2YWx1YXRlZC1pZi11c2VkIGNvbnRleHQuCisgIC8vLyAgCisgIC8vLyAgUG90ZW50aWFsbHkgY2FwdHVyYWJsZSB2YXJpYWJsZXMgb2YgYSBuZXN0ZWQgbGFtYmRhIHRoYXQgbWlnaHQgbmVlZCAKKyAgLy8vICAgdG8gYmUgY2FwdHVyZWQgYnkgdGhlIGxhbWJkYSBhcmUgaG91c2VkIGhlcmUuICAKKyAgLy8vICBUaGlzIGlzIHNwZWNpZmljYWxseSB1c2VmdWwgZm9yIGdlbmVyaWMgbGFtYmRhcyBvcgorICAvLy8gIGxhbWJkYXMgd2l0aGluIGEgcG90ZW50aWFsbHkgZXZhbHVhdGVkLWlmLXVzZWQgY29udGV4dC4KKyAgLy8vICBJZiBhbiBlbmNsb3NpbmcgdmFyaWFibGUgaXMgbmFtZWQgaW4gYW4gZXhwcmVzc2lvbiBvZiBhIGxhbWJkYSBuZXN0ZWQKKyAgLy8vICB3aXRoaW4gYSBnZW5lcmljIGxhbWJkYSwgd2UgZG9uJ3QgYWx3YXlzIGtub3cga25vdyB3aGV0aGVyIHRoZSB2YXJpYWJsZSAKKyAgLy8vICB3aWxsIHRydWx5IGJlIG9kci11c2VkIChpLmUuIG5lZWQgdG8gYmUgY2FwdHVyZWQpIGJ5IHRoYXQgbmVzdGVkIGxhbWJkYSwKKyAgLy8vICB1bnRpbCBpdHMgaW5zdGFudGlhdGlvbi4gQnV0IHdlIHN0aWxsIG5lZWQgdG8gY2FwdHVyZSBpdCBpbiB0aGUgCisgIC8vLyAgZW5jbG9zaW5nIGxhbWJkYSBpZiBhbGwgaW50ZXJ2ZW5pbmcgbGFtYmRhcyBjYW4gY2FwdHVyZSB0aGUgdmFyaWFibGUuCisgIGxsdm06OlNtYWxsVmVjdG9yPEV4cHIqLCA0PiBQb3RlbnRpYWxseUNhcHR1cmluZ0V4cHJzOworCisgIC8vLyBcYnJpZWYgQ29udGFpbnMgYWxsIHZhcmlhYmxlLXJlZmVycmluZy1leHByZXNzaW9ucyB0aGF0IHJlZmVyCisgIC8vLyAgdG8gbG9jYWwgdmFyaWFibGVzIHRoYXQgYXJlIHVzYWJsZSBhcyBjb25zdGFudCBleHByZXNzaW9ucyBhbmQKKyAgLy8vICBkbyBub3QgaW52b2x2ZSBhbiBvZHItdXNlICh0aGV5IG1heSBzdGlsbCBuZWVkIHRvIGJlIGNhcHR1cmVkCisgIC8vLyAgaWYgdGhlIGVuY2xvc2luZyBmdWxsLWV4cHJlc3Npb24gaXMgaW5zdGFudGlhdGlvbiBkZXBlbmRlbnQpLgorICBsbHZtOjpTbWFsbFNldDxFeHByICosIDg+IE5vbk9EUlVzZWRDYXB0dXJpbmdFeHByczsKKworICAvLy8gQ29udGFpbnMgYWxsIG9mIHRoZSB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGlzIGxhbWJkYSB0aGF0IHNoYWRvdyB2YXJpYWJsZXMKKyAgLy8vIHRoYXQgd2VyZSBkZWZpbmVkIGluIHBhcmVudCBjb250ZXh0cy4gVXNlZCB0byBhdm9pZCB3YXJuaW5ncyB3aGVuIHRoZQorICAvLy8gc2hhZG93ZWQgdmFyaWFibGVzIGFyZSB1bmNhcHR1cmVkIGJ5IHRoaXMgbGFtYmRhLgorICBzdHJ1Y3QgU2hhZG93ZWRPdXRlckRlY2wgeworICAgIGNvbnN0IFZhckRlY2wgKlZEOworICAgIGNvbnN0IFZhckRlY2wgKlNoYWRvd2VkRGVjbDsKKyAgfTsKKyAgbGx2bTo6U21hbGxWZWN0b3I8U2hhZG93ZWRPdXRlckRlY2wsIDQ+IFNoYWRvd2luZ0RlY2xzOworCisgIFNvdXJjZUxvY2F0aW9uIFBvdGVudGlhbFRoaXNDYXB0dXJlTG9jYXRpb247CisKKyAgTGFtYmRhU2NvcGVJbmZvKERpYWdub3N0aWNzRW5naW5lICZEaWFnKQorICAgICAgOiBDYXB0dXJpbmdTY29wZUluZm8oRGlhZywgSW1wQ2FwX05vbmUpIHsKKyAgICBLaW5kID0gU0tfTGFtYmRhOworICB9CisKKyAgLy8vIFxicmllZiBOb3RlIHdoZW4gYWxsIGV4cGxpY2l0IGNhcHR1cmVzIGhhdmUgYmVlbiBhZGRlZC4KKyAgdm9pZCBmaW5pc2hlZEV4cGxpY2l0Q2FwdHVyZXMoKSB7CisgICAgTnVtRXhwbGljaXRDYXB0dXJlcyA9IENhcHR1cmVzLnNpemUoKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRnVuY3Rpb25TY29wZUluZm8gKkZTSSkgeworICAgIHJldHVybiBGU0ktPktpbmQgPT0gU0tfTGFtYmRhOworICB9CisKKyAgLy8vIElzIHRoaXMgc2NvcGUga25vd24gdG8gYmUgZm9yIGEgZ2VuZXJpYyBsYW1iZGE/IChUaGlzIHdpbGwgYmUgZmFsc2UgdW50aWwKKyAgLy8vIHdlIHBhcnNlIHRoZSBmaXJzdCAnYXV0byctdHlwZWQgcGFyYW1ldGVyLgorICBib29sIGlzR2VuZXJpY0xhbWJkYSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIUF1dG9UZW1wbGF0ZVBhcmFtcy5lbXB0eSgpIHx8IEdMVGVtcGxhdGVQYXJhbWV0ZXJMaXN0OworICB9CisKKyAgLy8vIFxicmllZiBBZGQgYSB2YXJpYWJsZSB0aGF0IG1pZ2h0IHBvdGVudGlhbGx5IGJlIGNhcHR1cmVkIGJ5IHRoZSAKKyAgLy8vIGxhbWJkYSBhbmQgdGhlcmVmb3JlIHRoZSBlbmNsb3NpbmcgbGFtYmRhcy4gCisgIC8vLyAKKyAgLy8vIFRoaXMgaXMgYWxzbyB1c2VkIGJ5IGVuY2xvc2luZyBsYW1iZGEncyB0byBzcGVjdWxhdGl2ZWx5IGNhcHR1cmUgCisgIC8vLyB2YXJpYWJsZXMgdGhhdCBuZXN0ZWQgbGFtYmRhJ3MgLSBkZXBlbmRpbmcgb24gdGhlaXIgZW5jbG9zaW5nCisgIC8vLyBzcGVjaWFsaXphdGlvbiAtIG1pZ2h0IG5lZWQgdG8gY2FwdHVyZS4KKyAgLy8vIENvbnNpZGVyOgorICAvLy8gdm9pZCBmKGludCwgaW50KTsgPC0tIGRvbid0IGNhcHR1cmUKKyAgLy8vIHZvaWQgZihjb25zdCBpbnQmLCBkb3VibGUpOyA8LS0gY2FwdHVyZQorICAvLy8gdm9pZCBmb28oKSB7CisgIC8vLyAgIGNvbnN0IGludCB4ID0gMTA7CisgIC8vLyAgIGF1dG8gTCA9IFs9XShhdXRvIGEpIHsgLy8gY2FwdHVyZSAneCcKKyAgLy8vICAgICAgcmV0dXJuIFs9XShhdXRvIGIpIHsgCisgIC8vLyAgICAgICAgZih4LCBhKTsgIC8vIHdlIG1heSBvciBtYXkgbm90IG5lZWQgdG8gY2FwdHVyZSAneCcKKyAgLy8vICAgICAgfTsKKyAgLy8vICAgfTsKKyAgLy8vIH0KKyAgdm9pZCBhZGRQb3RlbnRpYWxDYXB0dXJlKEV4cHIgKlZhckV4cHIpIHsKKyAgICBhc3NlcnQoaXNhPERlY2xSZWZFeHByPihWYXJFeHByKSB8fCBpc2E8TWVtYmVyRXhwcj4oVmFyRXhwcikpOworICAgIFBvdGVudGlhbGx5Q2FwdHVyaW5nRXhwcnMucHVzaF9iYWNrKFZhckV4cHIpOworICB9CisgIAorICB2b2lkIGFkZFBvdGVudGlhbFRoaXNDYXB0dXJlKFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIFBvdGVudGlhbFRoaXNDYXB0dXJlTG9jYXRpb24gPSBMb2M7CisgIH0KKworICBib29sIGhhc1BvdGVudGlhbFRoaXNDYXB0dXJlKCkgY29uc3QgeyAKKyAgICByZXR1cm4gUG90ZW50aWFsVGhpc0NhcHR1cmVMb2NhdGlvbi5pc1ZhbGlkKCk7IAorICB9CisKKyAgLy8vIFxicmllZiBNYXJrIGEgdmFyaWFibGUncyByZWZlcmVuY2UgaW4gYSBsYW1iZGEgYXMgbm9uLW9kciB1c2luZy4KKyAgLy8vCisgIC8vLyBGb3IgZ2VuZXJpYyBsYW1iZGFzLCBpZiBhIHZhcmlhYmxlIGlzIG5hbWVkIGluIGEgcG90ZW50aWFsbHkgZXZhbHVhdGVkIAorICAvLy8gZXhwcmVzc2lvbiwgd2hlcmUgdGhlIGVuY2xvc2luZyBmdWxsIGV4cHJlc3Npb24gaXMgZGVwZW5kZW50IHRoZW4gd2UgCisgIC8vLyBtdXN0IGNhcHR1cmUgdGhlIHZhcmlhYmxlIChnaXZlbiBhIGRlZmF1bHQgY2FwdHVyZSkuCisgIC8vLyBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSByZWNvcmRpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdmFyaWFibGVzIAorICAvLy8gKERlY2xSZWZFeHBycyBvciBNZW1iZXJFeHBycykgd2l0aGluIHNhaWQgbmVzdGVkIGxhbWJkYSBpbiBpdHMgYXJyYXkgb2YgCisgIC8vLyBQb3RlbnRpYWxDYXB0dXJlcy4gQWxsIHN1Y2ggdmFyaWFibGVzIGhhdmUgdG8gYmUgY2FwdHVyZWQgYnkgdGhhdCBsYW1iZGEsCisgIC8vLyBleGNlcHQgZm9yIGFzIGRlc2NyaWJlZCBiZWxvdy4KKyAgLy8vIElmIHRoYXQgdmFyaWFibGUgaXMgdXNhYmxlIGFzIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBhbmQgaXMgbmFtZWQgaW4gYSAKKyAgLy8vIG1hbm5lciB0aGF0IGRvZXMgbm90IGludm9sdmUgaXRzIG9kci11c2UgKGUuZy4gdW5kZXJnb2VzIAorICAvLy8gbHZhbHVlLXRvLXJ2YWx1ZSBjb252ZXJzaW9uLCBvciBkaXNjYXJkZWQpIHJlY29yZCB0aGF0IGl0IGlzIHNvLiBVcG9uIHRoZQorICAvLy8gYWN0IG9mIGFuYWx5emluZyB0aGUgZW5jbG9zaW5nIGZ1bGwgZXhwcmVzc2lvbiAoQWN0T25GaW5pc2hGdWxsRXhwcikKKyAgLy8vIGlmIHdlIGNhbiBkZXRlcm1pbmUgdGhhdCB0aGUgZnVsbCBleHByZXNzaW9uIGlzIG5vdCBpbnN0YW50aWF0aW9uLQorICAvLy8gZGVwZW5kZW50LCB0aGVuIHdlIGNhbiBlbnRpcmVseSBhdm9pZCBpdHMgY2FwdHVyZS4gCisgIC8vLworICAvLy8gICBjb25zdCBpbnQgbiA9IDA7CisgIC8vLyAgIFsmXSAoYXV0byB4KSB7CisgIC8vLyAgICAgKHZvaWQpK24gKyB4OworICAvLy8gICB9OworICAvLy8gSW50ZXJlc3RpbmdseSwgdGhpcyBzdHJhdGVneSB3b3VsZCBpbnZvbHZlIGEgY2FwdHVyZSBvZiBuLCBldmVuIHRob3VnaCAKKyAgLy8vIGl0J3Mgb2J2aW91c2x5IG5vdCBvZHItdXNlZCBoZXJlLCBiZWNhdXNlIHRoZSBmdWxsLWV4cHJlc3Npb24gaXMgCisgIC8vLyBpbnN0YW50aWF0aW9uLWRlcGVuZGVudC4gIEl0IGNvdWxkIGJlIHVzZWZ1bCB0byBhdm9pZCBjYXB0dXJpbmcgc3VjaAorICAvLy8gdmFyaWFibGVzLCBldmVuIHdoZW4gdGhleSBhcmUgcmVmZXJyZWQgdG8gaW4gYW4gaW5zdGFudGlhdGlvbi1kZXBlbmRlbnQKKyAgLy8vIGV4cHJlc3Npb24sIGlmIHdlIGNhbiB1bmFtYmlndW91c2x5IGRldGVybWluZSB0aGF0IHRoZXkgc2hhbGwgbmV2ZXIgYmUKKyAgLy8vIG9kci11c2VkLiAgVGhpcyB3b3VsZCBpbnZvbHZlIHJlbW92YWwgb2YgdGhlIHZhcmlhYmxlLXJlZmVycmluZy1leHByZXNzaW9uCisgIC8vLyBmcm9tIHRoZSBhcnJheSBvZiBQb3RlbnRpYWxDYXB0dXJlcyBkdXJpbmcgdGhlIGx2YWx1ZS10by1ydmFsdWUgCisgIC8vLyBjb252ZXJzaW9ucy4gIEJ1dCBwZXIgdGhlIHdvcmtpbmcgZHJhZnQgTjM3OTcsIChwb3N0LWNoaWNhZ28gMjAxMykgd2UgbXVzdAorICAvLy8gY2FwdHVyZSBzdWNoIHZhcmlhYmxlcy4gCisgIC8vLyBCZWZvcmUgYW55b25lIGlzIHRlbXB0ZWQgdG8gaW1wbGVtZW50IGEgc3RyYXRlZ3kgZm9yIG5vdC1jYXB0dXJpbmcgJ24nLAorICAvLy8gY29uc2lkZXIgdGhlIGluc2lnaHRmdWwgd2FybmluZyBpbjogCisgIC8vLyAgICAvY2ZlLWNvbW1pdHMvV2Vlay1vZi1Nb24tMjAxMzExMDQvMDkyNTk2Lmh0bWwKKyAgLy8vICJUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBzZXQgb2YgY2FwdHVyZXMgZm9yIGEgbGFtYmRhIGlzIHBhcnQgb2YgdGhlIEFCSQorICAvLy8gIChzaW5jZSBsYW1iZGEgbGF5b3V0IGNhbiBiZSBtYWRlIHZpc2libGUgdGhyb3VnaCBpbmxpbmUgZnVuY3Rpb25zIGFuZCB0aGUKKyAgLy8vICBsaWtlKSwgYW5kIHRoZXJlIGFyZSBubyBndWFyYW50ZWVzIGFzIHRvIHdoaWNoIGNhc2VzIHdlJ2xsIG1hbmFnZSB0byBidWlsZAorICAvLy8gIGFuIGx2YWx1ZS10by1ydmFsdWUgY29udmVyc2lvbiBpbiwgd2hlbiBwYXJzaW5nIGEgdGVtcGxhdGUgLS0gc29tZQorICAvLy8gIHNlZW1pbmdseSBoYXJtbGVzcyBjaGFuZ2UgZWxzZXdoZXJlIGluIFNlbWEgY291bGQgY2F1c2UgdXMgdG8gc3RhcnQgb3Igc3RvcAorICAvLy8gIGJ1aWxkaW5nIHN1Y2ggYSBub2RlLiBTbyB3ZSBuZWVkIGEgcnVsZSB0aGF0IGFueW9uZSBjYW4gaW1wbGVtZW50IGFuZCBnZXQKKyAgLy8vICBleGFjdGx5IHRoZSBzYW1lIHJlc3VsdCIuCisgIHZvaWQgbWFya1ZhcmlhYmxlRXhwckFzTm9uT0RSVXNlZChFeHByICpDYXB0dXJpbmdWYXJFeHByKSB7CisgICAgYXNzZXJ0KGlzYTxEZWNsUmVmRXhwcj4oQ2FwdHVyaW5nVmFyRXhwcikgCisgICAgICAgIHx8IGlzYTxNZW1iZXJFeHByPihDYXB0dXJpbmdWYXJFeHByKSk7CisgICAgTm9uT0RSVXNlZENhcHR1cmluZ0V4cHJzLmluc2VydChDYXB0dXJpbmdWYXJFeHByKTsKKyAgfQorICBib29sIGlzVmFyaWFibGVFeHByTWFya2VkQXNOb25PRFJVc2VkKEV4cHIgKkNhcHR1cmluZ1ZhckV4cHIpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNhPERlY2xSZWZFeHByPihDYXB0dXJpbmdWYXJFeHByKSAKKyAgICAgIHx8IGlzYTxNZW1iZXJFeHByPihDYXB0dXJpbmdWYXJFeHByKSk7CisgICAgcmV0dXJuIE5vbk9EUlVzZWRDYXB0dXJpbmdFeHBycy5jb3VudChDYXB0dXJpbmdWYXJFeHByKTsKKyAgfQorICB2b2lkIHJlbW92ZVBvdGVudGlhbENhcHR1cmUoRXhwciAqRSkgeworICAgIFBvdGVudGlhbGx5Q2FwdHVyaW5nRXhwcnMuZXJhc2UoCisgICAgICAgIHN0ZDo6cmVtb3ZlKFBvdGVudGlhbGx5Q2FwdHVyaW5nRXhwcnMuYmVnaW4oKSwgCisgICAgICAgICAgICBQb3RlbnRpYWxseUNhcHR1cmluZ0V4cHJzLmVuZCgpLCBFKSwgCisgICAgICAgIFBvdGVudGlhbGx5Q2FwdHVyaW5nRXhwcnMuZW5kKCkpOworICB9CisgIHZvaWQgY2xlYXJQb3RlbnRpYWxDYXB0dXJlcygpIHsKKyAgICBQb3RlbnRpYWxseUNhcHR1cmluZ0V4cHJzLmNsZWFyKCk7CisgICAgUG90ZW50aWFsVGhpc0NhcHR1cmVMb2NhdGlvbiA9IFNvdXJjZUxvY2F0aW9uKCk7CisgIH0KKyAgdW5zaWduZWQgZ2V0TnVtUG90ZW50aWFsVmFyaWFibGVDYXB0dXJlcygpIGNvbnN0IHsgCisgICAgcmV0dXJuIFBvdGVudGlhbGx5Q2FwdHVyaW5nRXhwcnMuc2l6ZSgpOyAKKyAgfQorCisgIGJvb2wgaGFzUG90ZW50aWFsQ2FwdHVyZXMoKSBjb25zdCB7IAorICAgIHJldHVybiBnZXROdW1Qb3RlbnRpYWxWYXJpYWJsZUNhcHR1cmVzKCkgfHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG90ZW50aWFsVGhpc0NhcHR1cmVMb2NhdGlvbi5pc1ZhbGlkKCk7IAorICB9CisKKyAgLy8gV2hlbiBwYXNzZWQgdGhlIGluZGV4LCByZXR1cm5zIHRoZSBWYXJEZWNsIGFuZCBFeHByIGFzc29jaWF0ZWQKKyAgLy8gd2l0aCB0aGUgaW5kZXguCisgIHZvaWQgZ2V0UG90ZW50aWFsVmFyaWFibGVDYXB0dXJlKHVuc2lnbmVkIElkeCwgVmFyRGVjbCAqJlZELCBFeHByIComRSkgY29uc3Q7Cit9OworCitGdW5jdGlvblNjb3BlSW5mbzo6V2Vha09iamVjdFByb2ZpbGVUeTo6V2Vha09iamVjdFByb2ZpbGVUeSgpCisgICAgOiBCYXNlKG51bGxwdHIsIGZhbHNlKSB7fQorCitGdW5jdGlvblNjb3BlSW5mbzo6V2Vha09iamVjdFByb2ZpbGVUeQorRnVuY3Rpb25TY29wZUluZm86OldlYWtPYmplY3RQcm9maWxlVHk6OmdldFNlbnRpbmVsKCkgeworICBGdW5jdGlvblNjb3BlSW5mbzo6V2Vha09iamVjdFByb2ZpbGVUeSBSZXN1bHQ7CisgIFJlc3VsdC5CYXNlLnNldEludCh0cnVlKTsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEV4cHJUPgordm9pZCBGdW5jdGlvblNjb3BlSW5mbzo6cmVjb3JkVXNlT2ZXZWFrKGNvbnN0IEV4cHJUICpFLCBib29sIElzUmVhZCkgeworICBhc3NlcnQoRSk7CisgIFdlYWtVc2VWZWN0b3IgJlVzZXMgPSBXZWFrT2JqZWN0VXNlc1tXZWFrT2JqZWN0UHJvZmlsZVR5KEUpXTsKKyAgVXNlcy5wdXNoX2JhY2soV2Vha1VzZVR5KEUsIElzUmVhZCkpOworfQorCitpbmxpbmUgdm9pZAorQ2FwdHVyaW5nU2NvcGVJbmZvOjphZGRUaGlzQ2FwdHVyZShib29sIGlzTmVzdGVkLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkNweSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBCeUNvcHkpIHsKKyAgQ2FwdHVyZXMucHVzaF9iYWNrKENhcHR1cmUoQ2FwdHVyZTo6VGhpc0NhcHR1cmUsIGlzTmVzdGVkLCBMb2MsIFF1YWxUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENweSwgQnlDb3B5KSk7CisgIENYWFRoaXNDYXB0dXJlSW5kZXggPSBDYXB0dXJlcy5zaXplKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIHNlbWEKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfU0VNQV9TQ09QRUlORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9TZW1hLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL1NlbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjY4MjUzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9TZW1hLmgKQEAgLTAsMCArMSwxMDc3MyBAQAorLy89PT0tLS0gU2VtYS5oIC0gU2VtYW50aWMgQW5hbHlzaXMgJiBBU1QgQnVpbGRpbmcgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgU2VtYSBjbGFzcywgd2hpY2ggcGVyZm9ybXMgc2VtYW50aWMgYW5hbHlzaXMgYW5kCisvLyBidWlsZHMgQVNUcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU0VNQV9TRU1BX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TRU1BX1NFTUFfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0F0dHIuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvQXZhaWxhYmlsaXR5LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xhcmF0aW9uTmFtZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsVGVtcGxhdGUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXhwci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByT2JqQy5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHRlcm5hbEFTVFNvdXJjZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9Mb2NJbmZvVHlwZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9NYW5nbGVOdW1iZXJpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL05TQVBJLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1ByZXR0eVByaW50ZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdENYWC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTG9jLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGVPcmRlcmluZy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0V4cHJlc3Npb25UcmFpdHMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Nb2R1bGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9PcGVuTVBLaW5kcy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1ByYWdtYUtpbmRzLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU3BlY2lmaWVycy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1RlbXBsYXRlS2luZHMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9UeXBlVHJhaXRzLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9BbmFseXNpc0Jhc2VkV2FybmluZ3MuaCIKKyNpbmNsdWRlICJjbGFuZy9TZW1hL0NsZWFudXBJbmZvLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9EZWNsU3BlYy5oIgorI2luY2x1ZGUgImNsYW5nL1NlbWEvRXh0ZXJuYWxTZW1hU291cmNlLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9JZGVudGlmaWVyUmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9TZW1hL09iakNNZXRob2RMaXN0LmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9Pd25lcnNoaXAuaCIKKyNpbmNsdWRlICJjbGFuZy9TZW1hL1Njb3BlLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9UeXBvQ29ycmVjdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL1NlbWEvV2Vhay5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVGlueVB0clZlY3Rvci5oIgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEFQU0ludDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVD4gc3RydWN0IERlbnNlTWFwSW5mbzsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUgVmFsdWVJbmZvVD4gY2xhc3MgRGVuc2VTZXQ7CisgIGNsYXNzIFNtYWxsQml0VmVjdG9yOworICBzdHJ1Y3QgSW5saW5lQXNtSWRlbnRpZmllckluZm87Cit9CisKK25hbWVzcGFjZSBjbGFuZyB7CisgIGNsYXNzIEFETFJlc3VsdDsKKyAgY2xhc3MgQVNUQ29uc3VtZXI7CisgIGNsYXNzIEFTVENvbnRleHQ7CisgIGNsYXNzIEFTVE11dGF0aW9uTGlzdGVuZXI7CisgIGNsYXNzIEFTVFJlYWRlcjsKKyAgY2xhc3MgQVNUV3JpdGVyOworICBjbGFzcyBBcnJheVR5cGU7CisgIGNsYXNzIEF0dHJpYnV0ZUxpc3Q7CisgIGNsYXNzIEJpbmRpbmdEZWNsOworICBjbGFzcyBCbG9ja0RlY2w7CisgIGNsYXNzIENhcHR1cmVkRGVjbDsKKyAgY2xhc3MgQ1hYQmFzZVBhdGg7CisgIGNsYXNzIENYWEJhc2VQYXRoczsKKyAgY2xhc3MgQ1hYQmluZFRlbXBvcmFyeUV4cHI7CisgIHR5cGVkZWYgU21hbGxWZWN0b3I8Q1hYQmFzZVNwZWNpZmllciosIDQ+IENYWENhc3RQYXRoOworICBjbGFzcyBDWFhDb25zdHJ1Y3RvckRlY2w7CisgIGNsYXNzIENYWENvbnZlcnNpb25EZWNsOworICBjbGFzcyBDWFhEZWxldGVFeHByOworICBjbGFzcyBDWFhEZXN0cnVjdG9yRGVjbDsKKyAgY2xhc3MgQ1hYRmllbGRDb2xsZWN0b3I7CisgIGNsYXNzIENYWE1lbWJlckNhbGxFeHByOworICBjbGFzcyBDWFhNZXRob2REZWNsOworICBjbGFzcyBDWFhTY29wZVNwZWM7CisgIGNsYXNzIENYWFRlbXBvcmFyeTsKKyAgY2xhc3MgQ1hYVHJ5U3RtdDsKKyAgY2xhc3MgQ2FsbEV4cHI7CisgIGNsYXNzIENsYXNzVGVtcGxhdGVEZWNsOworICBjbGFzcyBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbDsKKyAgY2xhc3MgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbDsKKyAgY2xhc3MgVmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsOworICBjbGFzcyBDb2RlQ29tcGxldGVDb25zdW1lcjsKKyAgY2xhc3MgQ29kZUNvbXBsZXRpb25BbGxvY2F0b3I7CisgIGNsYXNzIENvZGVDb21wbGV0aW9uVFVJbmZvOworICBjbGFzcyBDb2RlQ29tcGxldGlvblJlc3VsdDsKKyAgY2xhc3MgQ29yb3V0aW5lQm9keVN0bXQ7CisgIGNsYXNzIERlY2w7CisgIGNsYXNzIERlY2xBY2Nlc3NQYWlyOworICBjbGFzcyBEZWNsQ29udGV4dDsKKyAgY2xhc3MgRGVjbFJlZkV4cHI7CisgIGNsYXNzIERlY2xhcmF0b3JEZWNsOworICBjbGFzcyBEZWR1Y2VkVGVtcGxhdGVBcmd1bWVudDsKKyAgY2xhc3MgRGVwZW5kZW50RGlhZ25vc3RpYzsKKyAgY2xhc3MgRGVzaWduYXRlZEluaXRFeHByOworICBjbGFzcyBEZXNpZ25hdGlvbjsKKyAgY2xhc3MgRW5hYmxlSWZBdHRyOworICBjbGFzcyBFbnVtQ29uc3RhbnREZWNsOworICBjbGFzcyBFeHByOworICBjbGFzcyBFeHRWZWN0b3JUeXBlOworICBjbGFzcyBGb3JtYXRBdHRyOworICBjbGFzcyBGcmllbmREZWNsOworICBjbGFzcyBGdW5jdGlvbkRlY2w7CisgIGNsYXNzIEZ1bmN0aW9uUHJvdG9UeXBlOworICBjbGFzcyBGdW5jdGlvblRlbXBsYXRlRGVjbDsKKyAgY2xhc3MgSW1wbGljaXRDb252ZXJzaW9uU2VxdWVuY2U7CisgIHR5cGVkZWYgTXV0YWJsZUFycmF5UmVmPEltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlPiBDb252ZXJzaW9uU2VxdWVuY2VMaXN0OworICBjbGFzcyBJbml0TGlzdEV4cHI7CisgIGNsYXNzIEluaXRpYWxpemF0aW9uS2luZDsKKyAgY2xhc3MgSW5pdGlhbGl6YXRpb25TZXF1ZW5jZTsKKyAgY2xhc3MgSW5pdGlhbGl6ZWRFbnRpdHk7CisgIGNsYXNzIEludGVnZXJMaXRlcmFsOworICBjbGFzcyBMYWJlbFN0bXQ7CisgIGNsYXNzIExhbWJkYUV4cHI7CisgIGNsYXNzIExhbmdPcHRpb25zOworICBjbGFzcyBMb2NhbEluc3RhbnRpYXRpb25TY29wZTsKKyAgY2xhc3MgTG9va3VwUmVzdWx0OworICBjbGFzcyBNYWNyb0luZm87CisgIHR5cGVkZWYgQXJyYXlSZWY8c3RkOjpwYWlyPElkZW50aWZpZXJJbmZvICosIFNvdXJjZUxvY2F0aW9uPj4gTW9kdWxlSWRQYXRoOworICBjbGFzcyBNb2R1bGVMb2FkZXI7CisgIGNsYXNzIE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdDsKKyAgY2xhc3MgTmFtZWREZWNsOworICBjbGFzcyBPYmpDQ2F0ZWdvcnlEZWNsOworICBjbGFzcyBPYmpDQ2F0ZWdvcnlJbXBsRGVjbDsKKyAgY2xhc3MgT2JqQ0NvbXBhdGlibGVBbGlhc0RlY2w7CisgIGNsYXNzIE9iakNDb250YWluZXJEZWNsOworICBjbGFzcyBPYmpDSW1wbERlY2w7CisgIGNsYXNzIE9iakNJbXBsZW1lbnRhdGlvbkRlY2w7CisgIGNsYXNzIE9iakNJbnRlcmZhY2VEZWNsOworICBjbGFzcyBPYmpDSXZhckRlY2w7CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBPYmpDTGlzdDsKKyAgY2xhc3MgT2JqQ01lc3NhZ2VFeHByOworICBjbGFzcyBPYmpDTWV0aG9kRGVjbDsKKyAgY2xhc3MgT2JqQ1Byb3BlcnR5RGVjbDsKKyAgY2xhc3MgT2JqQ1Byb3RvY29sRGVjbDsKKyAgY2xhc3MgT01QVGhyZWFkUHJpdmF0ZURlY2w7CisgIGNsYXNzIE9NUERlY2xhcmVSZWR1Y3Rpb25EZWNsOworICBjbGFzcyBPTVBEZWNsYXJlU2ltZERlY2w7CisgIGNsYXNzIE9NUENsYXVzZTsKKyAgc3RydWN0IE92ZXJsb2FkQ2FuZGlkYXRlOworICBjbGFzcyBPdmVybG9hZENhbmRpZGF0ZVNldDsKKyAgY2xhc3MgT3ZlcmxvYWRFeHByOworICBjbGFzcyBQYXJlbkxpc3RFeHByOworICBjbGFzcyBQYXJtVmFyRGVjbDsKKyAgY2xhc3MgUHJlcHJvY2Vzc29yOworICBjbGFzcyBQc2V1ZG9EZXN0cnVjdG9yVHlwZVN0b3JhZ2U7CisgIGNsYXNzIFBzZXVkb09iamVjdEV4cHI7CisgIGNsYXNzIFF1YWxUeXBlOworICBjbGFzcyBTdGFuZGFyZENvbnZlcnNpb25TZXF1ZW5jZTsKKyAgY2xhc3MgU3RtdDsKKyAgY2xhc3MgU3RyaW5nTGl0ZXJhbDsKKyAgY2xhc3MgU3dpdGNoU3RtdDsKKyAgY2xhc3MgVGVtcGxhdGVBcmd1bWVudDsKKyAgY2xhc3MgVGVtcGxhdGVBcmd1bWVudExpc3Q7CisgIGNsYXNzIFRlbXBsYXRlQXJndW1lbnRMb2M7CisgIGNsYXNzIFRlbXBsYXRlRGVjbDsKKyAgY2xhc3MgVGVtcGxhdGVJbnN0YW50aWF0aW9uQ2FsbGJhY2s7CisgIGNsYXNzIFRlbXBsYXRlUGFyYW1ldGVyTGlzdDsKKyAgY2xhc3MgVGVtcGxhdGVQYXJ0aWFsT3JkZXJpbmdDb250ZXh0OworICBjbGFzcyBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2w7CisgIGNsYXNzIFRva2VuOworICBjbGFzcyBUeXBlQWxpYXNEZWNsOworICBjbGFzcyBUeXBlZGVmRGVjbDsKKyAgY2xhc3MgVHlwZWRlZk5hbWVEZWNsOworICBjbGFzcyBUeXBlTG9jOworICBjbGFzcyBUeXBvQ29ycmVjdGlvbkNvbnN1bWVyOworICBjbGFzcyBVbnF1YWxpZmllZElkOworICBjbGFzcyBVbnJlc29sdmVkTG9va3VwRXhwcjsKKyAgY2xhc3MgVW5yZXNvbHZlZE1lbWJlckV4cHI7CisgIGNsYXNzIFVucmVzb2x2ZWRTZXRJbXBsOworICBjbGFzcyBVbnJlc29sdmVkU2V0SXRlcmF0b3I7CisgIGNsYXNzIFVzaW5nRGVjbDsKKyAgY2xhc3MgVXNpbmdTaGFkb3dEZWNsOworICBjbGFzcyBWYWx1ZURlY2w7CisgIGNsYXNzIFZhckRlY2w7CisgIGNsYXNzIFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsOworICBjbGFzcyBWaXNpYmlsaXR5QXR0cjsKKyAgY2xhc3MgVmlzaWJsZURlY2xDb25zdW1lcjsKKyAgY2xhc3MgSW5kaXJlY3RGaWVsZERlY2w7CisgIHN0cnVjdCBEZWR1Y3Rpb25GYWlsdXJlSW5mbzsKKyAgY2xhc3MgVGVtcGxhdGVTcGVjQ2FuZGlkYXRlU2V0OworCituYW1lc3BhY2Ugc2VtYSB7CisgIGNsYXNzIEFjY2Vzc2VkRW50aXR5OworICBjbGFzcyBCbG9ja1Njb3BlSW5mbzsKKyAgY2xhc3MgQ2FwdHVyZTsKKyAgY2xhc3MgQ2FwdHVyZWRSZWdpb25TY29wZUluZm87CisgIGNsYXNzIENhcHR1cmluZ1Njb3BlSW5mbzsKKyAgY2xhc3MgQ29tcG91bmRTY29wZUluZm87CisgIGNsYXNzIERlbGF5ZWREaWFnbm9zdGljOworICBjbGFzcyBEZWxheWVkRGlhZ25vc3RpY1Bvb2w7CisgIGNsYXNzIEZ1bmN0aW9uU2NvcGVJbmZvOworICBjbGFzcyBMYW1iZGFTY29wZUluZm87CisgIGNsYXNzIFBvc3NpYmx5VW5yZWFjaGFibGVEaWFnOworICBjbGFzcyBTZW1hUFBDYWxsYmFja3M7CisgIGNsYXNzIFRlbXBsYXRlRGVkdWN0aW9uSW5mbzsKK30KKworbmFtZXNwYWNlIHRocmVhZFNhZmV0eSB7CisgIGNsYXNzIEJlZm9yZVNldDsKKyAgdm9pZCB0aHJlYWRTYWZldHlDbGVhbnVwKEJlZm9yZVNldCogQ2FjaGUpOworfQorCisvLyBGSVhNRTogTm8gd2F5IHRvIGVhc2lseSBtYXAgZnJvbSBUZW1wbGF0ZVR5cGVQYXJtVHlwZXMgdG8KKy8vIFRlbXBsYXRlVHlwZVBhcm1EZWNscywgc28gd2UgaGF2ZSB0aGlzIGhvcnJpYmxlIFBvaW50ZXJVbmlvbi4KK3R5cGVkZWYgc3RkOjpwYWlyPGxsdm06OlBvaW50ZXJVbmlvbjxjb25zdCBUZW1wbGF0ZVR5cGVQYXJtVHlwZSosIE5hbWVkRGVjbCo+LAorICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24+IFVuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrOworCisvLy8gRGVzY3JpYmVzIHdoZXRoZXIgd2UndmUgc2VlbiBhbnkgbnVsbGFiaWxpdHkgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbgorLy8vIGZpbGUuCitzdHJ1Y3QgRmlsZU51bGxhYmlsaXR5IHsKKyAgLy8vIFRoZSBmaXJzdCBwb2ludGVyIGRlY2xhcmF0b3IgKG9mIGFueSBwb2ludGVyIGtpbmQpIGluIHRoZSBmaWxlIHRoYXQgZG9lcworICAvLy8gbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIG51bGxhYmlsaXR5IGFubm90YXRpb24uCisgIFNvdXJjZUxvY2F0aW9uIFBvaW50ZXJMb2M7CisKKyAgLy8vIFRoZSBlbmQgbG9jYXRpb24gZm9yIHRoZSBmaXJzdCBwb2ludGVyIGRlY2xhcmF0b3IgaW4gdGhlIGZpbGUuIFVzZWQgZm9yCisgIC8vLyBwbGFjaW5nIGZpeC1pdHMuCisgIFNvdXJjZUxvY2F0aW9uIFBvaW50ZXJFbmRMb2M7CisKKyAgLy8vIFdoaWNoIGtpbmQgb2YgcG9pbnRlciBkZWNsYXJhdG9yIHdlIHNhdy4KKyAgdWludDhfdCBQb2ludGVyS2luZDsKKworICAvLy8gV2hldGhlciB3ZSBzYXcgYW55IHR5cGUgbnVsbGFiaWxpdHkgYW5ub3RhdGlvbnMgaW4gdGhlIGdpdmVuIGZpbGUuCisgIGJvb2wgU2F3VHlwZU51bGxhYmlsaXR5ID0gZmFsc2U7Cit9OworCisvLy8gQSBtYXBwaW5nIGZyb20gZmlsZSBJRHMgdG8gYSByZWNvcmQgb2Ygd2hldGhlciB3ZSd2ZSBzZWVuIG51bGxhYmlsaXR5CisvLy8gaW5mb3JtYXRpb24gaW4gdGhhdCBmaWxlLgorY2xhc3MgRmlsZU51bGxhYmlsaXR5TWFwIHsKKyAgLy8vIEEgbWFwcGluZyBmcm9tIGZpbGUgSURzIHRvIHRoZSBudWxsYWJpbGl0eSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBmaWxlIElELgorICBsbHZtOjpEZW5zZU1hcDxGaWxlSUQsIEZpbGVOdWxsYWJpbGl0eT4gTWFwOworCisgIC8vLyBBIHNpbmdsZS1lbGVtZW50IGNhY2hlIGJhc2VkIG9uIHRoZSBmaWxlIElELgorICBzdHJ1Y3QgeworICAgIEZpbGVJRCBGaWxlOworICAgIEZpbGVOdWxsYWJpbGl0eSBOdWxsYWJpbGl0eTsKKyAgfSBDYWNoZTsKKworcHVibGljOgorICBGaWxlTnVsbGFiaWxpdHkgJm9wZXJhdG9yW10oRmlsZUlEIGZpbGUpIHsKKyAgICAvLyBDaGVjayB0aGUgc2luZ2xlLWVsZW1lbnQgY2FjaGUuCisgICAgaWYgKGZpbGUgPT0gQ2FjaGUuRmlsZSkKKyAgICAgIHJldHVybiBDYWNoZS5OdWxsYWJpbGl0eTsKKworICAgIC8vIEl0J3Mgbm90IGluIHRoZSBzaW5nbGUtZWxlbWVudCBjYWNoZTsgZmx1c2ggdGhlIGNhY2hlIGlmIHdlIGhhdmUgb25lLgorICAgIGlmICghQ2FjaGUuRmlsZS5pc0ludmFsaWQoKSkgeworICAgICAgTWFwW0NhY2hlLkZpbGVdID0gQ2FjaGUuTnVsbGFiaWxpdHk7CisgICAgfQorCisgICAgLy8gUHVsbCB0aGlzIGVudHJ5IGludG8gdGhlIGNhY2hlLgorICAgIENhY2hlLkZpbGUgPSBmaWxlOworICAgIENhY2hlLk51bGxhYmlsaXR5ID0gTWFwW2ZpbGVdOworICAgIHJldHVybiBDYWNoZS5OdWxsYWJpbGl0eTsKKyAgfQorfTsKKworLy8vIFNlbWEgLSBUaGlzIGltcGxlbWVudHMgc2VtYW50aWMgYW5hbHlzaXMgYW5kIEFTVCBidWlsZGluZyBmb3IgQy4KK2NsYXNzIFNlbWEgeworICBTZW1hKGNvbnN0IFNlbWEgJikgPSBkZWxldGU7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFNlbWEgJikgPSBkZWxldGU7CisKKyAgLy8vXGJyaWVmIFNvdXJjZSBvZiBhZGRpdGlvbmFsIHNlbWFudGljIGluZm9ybWF0aW9uLgorICBFeHRlcm5hbFNlbWFTb3VyY2UgKkV4dGVybmFsU291cmNlOworCisgIC8vL1xicmllZiBXaGV0aGVyIFNlbWEgaGFzIGdlbmVyYXRlZCBhIG11bHRpcGxleGVyIGFuZCBoYXMgdG8gZGVsZXRlIGl0LgorICBib29sIGlzTXVsdGlwbGV4RXh0ZXJuYWxTb3VyY2U7CisKKyAgc3RhdGljIGJvb2wgbWlnaHRIYXZlTm9uRXh0ZXJuYWxMaW5rYWdlKGNvbnN0IERlY2xhcmF0b3JEZWNsICpGRCk7CisKKyAgYm9vbCBpc1Zpc2libGVTbG93KGNvbnN0IE5hbWVkRGVjbCAqRCk7CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHR3byBkZWNsYXJhdGlvbnMgc2hvdWxkIGJlIGxpbmtlZCB0b2dldGhlciwgZ2l2ZW4gdGhhdAorICAvLy8gdGhlIG9sZCBkZWNsYXJhdGlvbiBtaWdodCBub3QgYmUgdmlzaWJsZSBhbmQgdGhlIG5ldyBkZWNsYXJhdGlvbiBtaWdodAorICAvLy8gbm90IGhhdmUgZXh0ZXJuYWwgbGlua2FnZS4KKyAgYm9vbCBzaG91bGRMaW5rUG9zc2libHlIaWRkZW5EZWNsKGNvbnN0IE5hbWVkRGVjbCAqT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZWREZWNsICpOZXcpIHsKKyAgICBpZiAoaXNWaXNpYmxlKE9sZCkpCisgICAgIHJldHVybiB0cnVlOworICAgIC8vIFNlZSBjb21tZW50IGluIGJlbG93IG92ZXJsb2FkIGZvciB3aHkgaXQncyBzYWZlIHRvIGNvbXB1dGUgdGhlIGxpbmthZ2UKKyAgICAvLyBvZiB0aGUgbmV3IGRlY2xhcmF0aW9uIGhlcmUuCisgICAgaWYgKE5ldy0+aXNFeHRlcm5hbGx5RGVjbGFyYWJsZSgpKSB7CisgICAgICBhc3NlcnQoT2xkLT5pc0V4dGVybmFsbHlEZWNsYXJhYmxlKCkgJiYKKyAgICAgICAgICAgICAic2hvdWxkIG5vdCBoYXZlIGZvdW5kIGEgbm9uLWV4dGVybmFsbHktZGVjbGFyYWJsZSBwcmV2aW91cyBkZWNsIik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGJvb2wgc2hvdWxkTGlua1Bvc3NpYmx5SGlkZGVuRGVjbChMb29rdXBSZXN1bHQgJk9sZCwgY29uc3QgTmFtZWREZWNsICpOZXcpOworCitwdWJsaWM6CisgIHR5cGVkZWYgT3BhcXVlUHRyPERlY2xHcm91cFJlZj4gRGVjbEdyb3VwUHRyVHk7CisgIHR5cGVkZWYgT3BhcXVlUHRyPFRlbXBsYXRlTmFtZT4gVGVtcGxhdGVUeTsKKyAgdHlwZWRlZiBPcGFxdWVQdHI8UXVhbFR5cGU+IFR5cGVUeTsKKworICBPcGVuQ0xPcHRpb25zIE9wZW5DTEZlYXR1cmVzOworICBGUE9wdGlvbnMgRlBGZWF0dXJlczsKKworICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHM7CisgIFByZXByb2Nlc3NvciAmUFA7CisgIEFTVENvbnRleHQgJkNvbnRleHQ7CisgIEFTVENvbnN1bWVyICZDb25zdW1lcjsKKyAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzOworICBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3I7CisKKyAgLy8vIFxicmllZiBGbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdG8gY29sbGVjdCBkZXRhaWxlZCBzdGF0aXN0aWNzLgorICBib29sIENvbGxlY3RTdGF0czsKKworICAvLy8gXGJyaWVmIENvZGUtY29tcGxldGlvbiBjb25zdW1lci4KKyAgQ29kZUNvbXBsZXRlQ29uc3VtZXIgKkNvZGVDb21wbGV0ZXI7CisKKyAgLy8vIEN1ckNvbnRleHQgLSBUaGlzIGlzIHRoZSBjdXJyZW50IGRlY2xhcmF0aW9uIGNvbnRleHQgb2YgcGFyc2luZy4KKyAgRGVjbENvbnRleHQgKkN1ckNvbnRleHQ7CisKKyAgLy8vIFxicmllZiBHZW5lcmFsbHkgbnVsbCBleGNlcHQgd2hlbiB3ZSB0ZW1wb3JhcmlseSBzd2l0Y2ggZGVjbCBjb250ZXh0cywKKyAgLy8vIGxpa2UgaW4gXHNlZSBBY3RPbk9iakNUZW1wb3JhcnlFeGl0Q29udGFpbmVyQ29udGV4dC4KKyAgRGVjbENvbnRleHQgKk9yaWdpbmFsTGV4aWNhbENvbnRleHQ7CisKKyAgLy8vIFZBTGlzdFRhZ05hbWUgLSBUaGUgZGVjbGFyYXRpb24gbmFtZSBjb3JyZXNwb25kaW5nIHRvIF9fdmFfbGlzdF90YWcuCisgIC8vLyBUaGlzIGlzIHVzZWQgYXMgcGFydCBvZiBhIGhhY2sgdG8gb21pdCB0aGF0IGNsYXNzIGZyb20gQURMIHJlc3VsdHMuCisgIERlY2xhcmF0aW9uTmFtZSBWQUxpc3RUYWdOYW1lOworCisgIGJvb2wgTVNTdHJ1Y3RQcmFnbWFPbjsgLy8gVHJ1ZSB3aGVuIFwjcHJhZ21hIG1zX3N0cnVjdCBvbgorCisgIC8vLyBcYnJpZWYgQ29udHJvbHMgbWVtYmVyIHBvaW50ZXIgcmVwcmVzZW50YXRpb24gZm9ybWF0IHVuZGVyIHRoZSBNUyBBQkkuCisgIExhbmdPcHRpb25zOjpQcmFnbWFNU1BvaW50ZXJzVG9NZW1iZXJzS2luZAorICAgICAgTVNQb2ludGVyVG9NZW1iZXJSZXByZXNlbnRhdGlvbk1ldGhvZDsKKworICAvLy8gU3RhY2sgb2YgYWN0aXZlIFNFSCBfX2ZpbmFsbHkgc2NvcGVzLiAgQ2FuIGJlIGVtcHR5LgorICBTbWFsbFZlY3RvcjxTY29wZSosIDI+IEN1cnJlbnRTRUhGaW5hbGx5OworCisgIC8vLyBcYnJpZWYgU291cmNlIGxvY2F0aW9uIGZvciBuZXdseSBjcmVhdGVkIGltcGxpY2l0IE1TSW5oZXJpdGFuY2VBdHRycworICBTb3VyY2VMb2NhdGlvbiBJbXBsaWNpdE1TSW5oZXJpdGFuY2VBdHRyTG9jOworCisgIC8vLyBcYnJpZWYgcHJhZ21hIGNsYW5nIHNlY3Rpb24ga2luZAorICBlbnVtIFByYWdtYUNsYW5nU2VjdGlvbktpbmQgeworICAgIFBDU0tfSW52YWxpZCAgICAgID0gMCwKKyAgICBQQ1NLX0JTUyAgICAgICAgICA9IDEsCisgICAgUENTS19EYXRhICAgICAgICAgPSAyLAorICAgIFBDU0tfUm9kYXRhICAgICAgID0gMywKKyAgICBQQ1NLX1RleHQgICAgICAgICA9IDQKKyAgIH07CisKKyAgZW51bSBQcmFnbWFDbGFuZ1NlY3Rpb25BY3Rpb24geworICAgIFBDU0FfU2V0ICAgICA9IDAsCisgICAgUENTQV9DbGVhciAgID0gMQorICB9OworCisgIHN0cnVjdCBQcmFnbWFDbGFuZ1NlY3Rpb24geworICAgIHN0ZDo6c3RyaW5nIFNlY3Rpb25OYW1lOworICAgIGJvb2wgVmFsaWQgPSBmYWxzZTsKKyAgICBTb3VyY2VMb2NhdGlvbiBQcmFnbWFMb2NhdGlvbjsKKworICAgIHZvaWQgQWN0KFNvdXJjZUxvY2F0aW9uIFByYWdtYUxvY2F0aW9uLAorICAgICAgICAgICAgIFByYWdtYUNsYW5nU2VjdGlvbkFjdGlvbiBBY3Rpb24sCisgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCogTmFtZSk7CisgICB9OworCisgICBQcmFnbWFDbGFuZ1NlY3Rpb24gUHJhZ21hQ2xhbmdCU1NTZWN0aW9uOworICAgUHJhZ21hQ2xhbmdTZWN0aW9uIFByYWdtYUNsYW5nRGF0YVNlY3Rpb247CisgICBQcmFnbWFDbGFuZ1NlY3Rpb24gUHJhZ21hQ2xhbmdSb2RhdGFTZWN0aW9uOworICAgUHJhZ21hQ2xhbmdTZWN0aW9uIFByYWdtYUNsYW5nVGV4dFNlY3Rpb247CisKKyAgZW51bSBQcmFnbWFNc1N0YWNrQWN0aW9uIHsKKyAgICBQU0tfUmVzZXQgICAgID0gMHgwLCAgICAgICAgICAgICAgICAvLyAjcHJhZ21hICgpCisgICAgUFNLX1NldCAgICAgICA9IDB4MSwgICAgICAgICAgICAgICAgLy8gI3ByYWdtYSAodmFsdWUpCisgICAgUFNLX1B1c2ggICAgICA9IDB4MiwgICAgICAgICAgICAgICAgLy8gI3ByYWdtYSAocHVzaFssIGlkXSkKKyAgICBQU0tfUG9wICAgICAgID0gMHg0LCAgICAgICAgICAgICAgICAvLyAjcHJhZ21hIChwb3BbLCBpZF0pCisgICAgUFNLX1Nob3cgICAgICA9IDB4OCwgICAgICAgICAgICAgICAgLy8gI3ByYWdtYSAoc2hvdykgLS0gb25seSBmb3IgInBhY2siIQorICAgIFBTS19QdXNoX1NldCAgPSBQU0tfUHVzaCB8IFBTS19TZXQsIC8vICNwcmFnbWEgKHB1c2hbLCBpZF0sIHZhbHVlKQorICAgIFBTS19Qb3BfU2V0ICAgPSBQU0tfUG9wIHwgUFNLX1NldCwgIC8vICNwcmFnbWEgKHBvcFssIGlkXSwgdmFsdWUpCisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeXBlPgorICBzdHJ1Y3QgUHJhZ21hU3RhY2sgeworICAgIHN0cnVjdCBTbG90IHsKKyAgICAgIGxsdm06OlN0cmluZ1JlZiBTdGFja1Nsb3RMYWJlbDsKKyAgICAgIFZhbHVlVHlwZSBWYWx1ZTsKKyAgICAgIFNvdXJjZUxvY2F0aW9uIFByYWdtYUxvY2F0aW9uOworICAgICAgU291cmNlTG9jYXRpb24gUHJhZ21hUHVzaExvY2F0aW9uOworICAgICAgU2xvdChsbHZtOjpTdHJpbmdSZWYgU3RhY2tTbG90TGFiZWwsIFZhbHVlVHlwZSBWYWx1ZSwKKyAgICAgICAgICAgU291cmNlTG9jYXRpb24gUHJhZ21hTG9jYXRpb24sIFNvdXJjZUxvY2F0aW9uIFByYWdtYVB1c2hMb2NhdGlvbikKKyAgICAgICAgICA6IFN0YWNrU2xvdExhYmVsKFN0YWNrU2xvdExhYmVsKSwgVmFsdWUoVmFsdWUpLAorICAgICAgICAgICAgUHJhZ21hTG9jYXRpb24oUHJhZ21hTG9jYXRpb24pLAorICAgICAgICAgICAgUHJhZ21hUHVzaExvY2F0aW9uKFByYWdtYVB1c2hMb2NhdGlvbikge30KKyAgICB9OworICAgIHZvaWQgQWN0KFNvdXJjZUxvY2F0aW9uIFByYWdtYUxvY2F0aW9uLAorICAgICAgICAgICAgIFByYWdtYU1zU3RhY2tBY3Rpb24gQWN0aW9uLAorICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBTdGFja1Nsb3RMYWJlbCwKKyAgICAgICAgICAgICBWYWx1ZVR5cGUgVmFsdWUpOworCisgICAgLy8gTVNWQyBzZWVtcyB0byBhZGQgYXJ0aWZpY2lhbCBzbG90cyB0byAjcHJhZ21hIHN0YWNrcyBvbiBlbnRlcmluZyBhIEMrKworICAgIC8vIG1ldGhvZCBib2R5IHRvIHJlc3RvcmUgdGhlIHN0YWNrcyBvbiBleGl0LCBzbyBpdCB3b3JrcyBsaWtlIHRoaXM6CisgICAgLy8KKyAgICAvLyAgIHN0cnVjdCBTIHsKKyAgICAvLyAgICAgI3ByYWdtYSA8bmFtZT4ocHVzaCwgSW50ZXJuYWxQcmFnbWFTbG90LCA8Y3VycmVudF9wcmFnbWFfdmFsdWU+KQorICAgIC8vICAgICB2b2lkIE1ldGhvZCB7fQorICAgIC8vICAgICAjcHJhZ21hIDxuYW1lPihwb3AsIEludGVybmFsUHJhZ21hU2xvdCkKKyAgICAvLyAgIH07CisgICAgLy8KKyAgICAvLyBJdCB3b3JrcyBldmVuIHdpdGggI3ByYWdtYSB2dG9yZGlzcCwgYWx0aG91Z2ggTVNWQyBkb2Vzbid0IHN1cHBvcnQKKyAgICAvLyAgICNwcmFnbWEgdnRvcmRpc3AocHVzaCBbLCBpZF0sIG4pCisgICAgLy8gc3ludGF4LgorICAgIC8vCisgICAgLy8gUHVzaCAvIHBvcCBhIG5hbWVkIHNlbnRpbmVsIHNsb3QuCisgICAgdm9pZCBTZW50aW5lbEFjdGlvbihQcmFnbWFNc1N0YWNrQWN0aW9uIEFjdGlvbiwgU3RyaW5nUmVmIExhYmVsKSB7CisgICAgICBhc3NlcnQoKEFjdGlvbiA9PSBQU0tfUHVzaCB8fCBBY3Rpb24gPT0gUFNLX1BvcCkgJiYKKyAgICAgICAgICAgICAiQ2FuIG9ubHkgcHVzaCAvIHBvcCAjcHJhZ21hIHN0YWNrIHNlbnRpbmVscyEiKTsKKyAgICAgIEFjdChDdXJyZW50UHJhZ21hTG9jYXRpb24sIEFjdGlvbiwgTGFiZWwsIEN1cnJlbnRWYWx1ZSk7CisgICAgfQorCisgICAgLy8gQ29uc3RydWN0b3JzLgorICAgIGV4cGxpY2l0IFByYWdtYVN0YWNrKGNvbnN0IFZhbHVlVHlwZSAmRGVmYXVsdCkKKyAgICAgICAgOiBEZWZhdWx0VmFsdWUoRGVmYXVsdCksIEN1cnJlbnRWYWx1ZShEZWZhdWx0KSB7fQorCisgICAgYm9vbCBoYXNWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIEN1cnJlbnRWYWx1ZSAhPSBEZWZhdWx0VmFsdWU7IH0KKworICAgIFNtYWxsVmVjdG9yPFNsb3QsIDI+IFN0YWNrOworICAgIFZhbHVlVHlwZSBEZWZhdWx0VmFsdWU7IC8vIFZhbHVlIHVzZWQgZm9yIFBTS19SZXNldCBhY3Rpb24uCisgICAgVmFsdWVUeXBlIEN1cnJlbnRWYWx1ZTsKKyAgICBTb3VyY2VMb2NhdGlvbiBDdXJyZW50UHJhZ21hTG9jYXRpb247CisgIH07CisgIC8vIEZJWE1FOiBXZSBzaG91bGQgc2VyaWFsaXplIC8gZGVzZXJpYWxpemUgdGhlc2UgaWYgdGhleSBvY2N1ciBpbiBhIFBDSCAoYnV0CisgIC8vIHdlIHNob3VsZG4ndCBkbyBzbyBpZiB0aGV5J3JlIGluIGEgbW9kdWxlKS4KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdG8gaW5zZXJ0IHZ0b3JkaXNwcyBwcmlvciB0byB2aXJ0dWFsIGJhc2VzIGluIHRoZSBNaWNyb3NvZnQKKyAgLy8vIEMrKyBBQkkuICBQb3NzaWJsZSB2YWx1ZXMgYXJlIDAsIDEsIGFuZCAyLCB3aGljaCBtZWFuOgorICAvLy8KKyAgLy8vIDA6IFN1cHByZXNzIGFsbCB2dG9yZGlzcHMKKyAgLy8vIDE6IEluc2VydCB2dG9yZGlzcHMgaW4gdGhlIHByZXNlbmNlIG9mIHZiYXNlIG92ZXJyaWRlcyBhbmQgbm9uLXRyaXZpYWwKKyAgLy8vICAgIHN0cnVjdG9ycworICAvLy8gMjogQWx3YXlzIGluc2VydCB2dG9yZGlzcHMgdG8gc3VwcG9ydCBSVFRJIG9uIHBhcnRpYWxseSBjb25zdHJ1Y3RlZAorICAvLy8gICAgb2JqZWN0cworICBQcmFnbWFTdGFjazxNU1Z0b3JEaXNwQXR0cjo6TW9kZT4gVnRvckRpc3BTdGFjazsKKyAgLy8gI3ByYWdtYSBwYWNrLgorICAvLyBTZW50aW5lbCB0byByZXByZXNlbnQgd2hlbiB0aGUgc3RhY2sgaXMgc2V0IHRvIG1hYzY4ayBhbGlnbm1lbnQuCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrTWFjNjhrQWxpZ25tZW50U2VudGluZWwgPSB+MFU7CisgIFByYWdtYVN0YWNrPHVuc2lnbmVkPiBQYWNrU3RhY2s7CisgIC8vIFRoZSBjdXJyZW50ICNwcmFnbWEgcGFjayB2YWx1ZXMgYW5kIGxvY2F0aW9ucyBhdCBlYWNoICNpbmNsdWRlLgorICBzdHJ1Y3QgUGFja0luY2x1ZGVTdGF0ZSB7CisgICAgdW5zaWduZWQgQ3VycmVudFZhbHVlOworICAgIFNvdXJjZUxvY2F0aW9uIEN1cnJlbnRQcmFnbWFMb2NhdGlvbjsKKyAgICBib29sIEhhc05vbkRlZmF1bHRWYWx1ZSwgU2hvdWxkV2Fybk9uSW5jbHVkZTsKKyAgfTsKKyAgU21hbGxWZWN0b3I8UGFja0luY2x1ZGVTdGF0ZSwgOD4gUGFja0luY2x1ZGVTdGFjazsKKyAgLy8gU2VnbWVudCAjcHJhZ21hcy4KKyAgUHJhZ21hU3RhY2s8U3RyaW5nTGl0ZXJhbCAqPiBEYXRhU2VnU3RhY2s7CisgIFByYWdtYVN0YWNrPFN0cmluZ0xpdGVyYWwgKj4gQlNTU2VnU3RhY2s7CisgIFByYWdtYVN0YWNrPFN0cmluZ0xpdGVyYWwgKj4gQ29uc3RTZWdTdGFjazsKKyAgUHJhZ21hU3RhY2s8U3RyaW5nTGl0ZXJhbCAqPiBDb2RlU2VnU3RhY2s7CisKKyAgLy8gUkFJSSBvYmplY3QgdG8gcHVzaCAvIHBvcCBzZW50aW5lbCBzbG90cyBmb3IgYWxsIE1TICNwcmFnbWEgc3RhY2tzLgorICAvLyBBY3Rpb25zIHNob3VsZCBiZSBwZXJmb3JtZWQgb25seSBpZiB3ZSBlbnRlciAvIGV4aXQgYSBDKysgbWV0aG9kIGJvZHkuCisgIGNsYXNzIFByYWdtYVN0YWNrU2VudGluZWxSQUlJIHsKKyAgcHVibGljOgorICAgIFByYWdtYVN0YWNrU2VudGluZWxSQUlJKFNlbWEgJlMsIFN0cmluZ1JlZiBTbG90TGFiZWwsIGJvb2wgU2hvdWxkQWN0KTsKKyAgICB+UHJhZ21hU3RhY2tTZW50aW5lbFJBSUkoKTsKKworICBwcml2YXRlOgorICAgIFNlbWEgJlM7CisgICAgU3RyaW5nUmVmIFNsb3RMYWJlbDsKKyAgICBib29sIFNob3VsZEFjdDsKKyAgfTsKKworICAvLy8gQSBtYXBwaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBudWxsYWJpbGl0eSB3ZSd2ZSBzZWVuIGluIGVhY2ggaGVhZGVyIGZpbGUuCisgIEZpbGVOdWxsYWJpbGl0eU1hcCBOdWxsYWJpbGl0eU1hcDsKKworICAvLy8gTGFzdCBzZWN0aW9uIHVzZWQgd2l0aCAjcHJhZ21hIGluaXRfc2VnLgorICBTdHJpbmdMaXRlcmFsICpDdXJJbml0U2VnOworICBTb3VyY2VMb2NhdGlvbiBDdXJJbml0U2VnTG9jOworCisgIC8vLyBWaXNDb250ZXh0IC0gTWFuYWdlcyB0aGUgc3RhY2sgZm9yIFwjcHJhZ21hIEdDQyB2aXNpYmlsaXR5LgorICB2b2lkICpWaXNDb250ZXh0OyAvLyBSZWFsbHkgYSAiUHJhZ21hVmlzU3RhY2sqIgorCisgIC8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzIHRoZSBzdGFjayBvZiBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBwdXNoZWQgYnkKKyAgLy8vIFwjcHJhZ21hIGNsYW5nIGF0dHJpYnV0ZS4KKyAgc3RydWN0IFByYWdtYUF0dHJpYnV0ZUVudHJ5IHsKKyAgICBTb3VyY2VMb2NhdGlvbiBMb2M7CisgICAgQXR0cmlidXRlTGlzdCAqQXR0cmlidXRlOworICAgIFNtYWxsVmVjdG9yPGF0dHI6OlN1YmplY3RNYXRjaFJ1bGUsIDQ+IE1hdGNoUnVsZXM7CisgICAgYm9vbCBJc1VzZWQ7CisgIH07CisgIFNtYWxsVmVjdG9yPFByYWdtYUF0dHJpYnV0ZUVudHJ5LCAyPiBQcmFnbWFBdHRyaWJ1dGVTdGFjazsKKworICAvLy8gXGJyaWVmIFRoZSBkZWNsYXJhdGlvbiB0aGF0IGlzIGN1cnJlbnRseSByZWNlaXZpbmcgYW4gYXR0cmlidXRlIGZyb20gdGhlCisgIC8vLyAjcHJhZ21hIGF0dHJpYnV0ZSBzdGFjay4KKyAgY29uc3QgRGVjbCAqUHJhZ21hQXR0cmlidXRlQ3VycmVudFRhcmdldERlY2w7CisKKyAgLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgdGhlIGxhc3QgbG9jYXRpb24gb2YgYSAiI3ByYWdtYSBjbGFuZyBvcHRpbWl6ZSBvZmYiCisgIC8vLyBkaXJlY3RpdmUgaWYgc3VjaCBhIGRpcmVjdGl2ZSBoYXMgbm90IGJlZW4gY2xvc2VkIGJ5IGFuICJvbiIgeWV0LiBJZgorICAvLy8gb3B0aW1pemF0aW9ucyBhcmUgY3VycmVudGx5ICJvbiIsIHRoaXMgaXMgc2V0IHRvIGFuIGludmFsaWQgbG9jYXRpb24uCisgIFNvdXJjZUxvY2F0aW9uIE9wdGltaXplT2ZmUHJhZ21hTG9jYXRpb247CisKKyAgLy8vIFxicmllZiBGbGFnIGluZGljYXRpbmcgaWYgU2VtYSBpcyBidWlsZGluZyBhIHJlY292ZXJ5IGNhbGwgZXhwcmVzc2lvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGZsYWcgaXMgdXNlZCB0byBhdm9pZCBidWlsZGluZyByZWNvdmVyeSBjYWxsIGV4cHJlc3Npb25zCisgIC8vLyBpZiBTZW1hIGlzIGFscmVhZHkgZG9pbmcgc28sIHdoaWNoIHdvdWxkIGNhdXNlIGluZmluaXRlIHJlY3Vyc2lvbnMuCisgIGJvb2wgSXNCdWlsZGluZ1JlY292ZXJ5Q2FsbEV4cHI7CisKKyAgLy8vIFVzZWQgdG8gY29udHJvbCB0aGUgZ2VuZXJhdGlvbiBvZiBFeHByV2l0aENsZWFudXBzLgorICBDbGVhbnVwSW5mbyBDbGVhbnVwOworCisgIC8vLyBFeHByQ2xlYW51cE9iamVjdHMgLSBUaGlzIGlzIHRoZSBzdGFjayBvZiBvYmplY3RzIHJlcXVpcmluZworICAvLy8gY2xlYW51cCB0aGF0IGFyZSBjcmVhdGVkIGJ5IHRoZSBjdXJyZW50IGZ1bGwgZXhwcmVzc2lvbi4gIFRoZQorICAvLy8gZWxlbWVudCB0eXBlIGhlcmUgaXMgRXhwcldpdGhDbGVhbnVwczo6T2JqZWN0LgorICBTbWFsbFZlY3RvcjxCbG9ja0RlY2wqLCA4PiBFeHByQ2xlYW51cE9iamVjdHM7CisKKyAgLy8vIFxicmllZiBTdG9yZSBhIGxpc3Qgb2YgZWl0aGVyIERlY2xSZWZFeHBycyBvciBNZW1iZXJFeHBycworICAvLy8gIHRoYXQgY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIHZhcmlhYmxlIChjb25zdGFudCkgdGhhdCBtYXkgb3IgbWF5IG5vdAorICAvLy8gIGJlIG9kci11c2VkIGluIHRoaXMgRXhwciwgYW5kIHdlIHdvbid0IGtub3cgdW50aWwgYWxsIGx2YWx1ZS10by1ydmFsdWUKKyAgLy8vICBhbmQgZGlzY2FyZGVkIHZhbHVlIGNvbnZlcnNpb25zIGhhdmUgYmVlbiBhcHBsaWVkIHRvIGFsbCBzdWJleHByZXNzaW9ucworICAvLy8gIG9mIHRoZSBlbmNsb3NpbmcgZnVsbCBleHByZXNzaW9uLiAgVGhpcyBpcyBjbGVhcmVkIGF0IHRoZSBlbmQgb2YgZWFjaAorICAvLy8gIGZ1bGwgZXhwcmVzc2lvbi4KKyAgbGx2bTo6U21hbGxQdHJTZXQ8RXhwciosIDI+IE1heWJlT0RSVXNlRXhwcnM7CisKKyAgc3RkOjp1bmlxdWVfcHRyPHNlbWE6OkZ1bmN0aW9uU2NvcGVJbmZvPiBQcmVhbGxvY2F0ZWRGdW5jdGlvblNjb3BlOworCisgIC8vLyBcYnJpZWYgU3RhY2sgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIG9mIHRoZSBuZXN0ZWQKKyAgLy8vIGZ1bmN0aW9uLCBibG9jaywgYW5kIG1ldGhvZCBzY29wZXMgdGhhdCBhcmUgY3VycmVudGx5IGFjdGl2ZS4KKyAgU21hbGxWZWN0b3I8c2VtYTo6RnVuY3Rpb25TY29wZUluZm8gKiwgND4gRnVuY3Rpb25TY29wZXM7CisKKyAgdHlwZWRlZiBMYXp5VmVjdG9yPFR5cGVkZWZOYW1lRGVjbCAqLCBFeHRlcm5hbFNlbWFTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAmRXh0ZXJuYWxTZW1hU291cmNlOjpSZWFkRXh0VmVjdG9yRGVjbHMsIDIsIDI+CisgICAgRXh0VmVjdG9yRGVjbHNUeXBlOworCisgIC8vLyBFeHRWZWN0b3JEZWNscyAtIFRoaXMgaXMgYSBsaXN0IGFsbCB0aGUgZXh0ZW5kZWQgdmVjdG9yIHR5cGVzLiBUaGlzIGFsbG93cworICAvLy8gdXMgdG8gYXNzb2NpYXRlIGEgcmF3IHZlY3RvciB0eXBlIHdpdGggb25lIG9mIHRoZSBleHRfdmVjdG9yIHR5cGUgbmFtZXMuCisgIC8vLyBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGZvciBpc3N1aW5nIHByZXR0eSBkaWFnbm9zdGljcy4KKyAgRXh0VmVjdG9yRGVjbHNUeXBlIEV4dFZlY3RvckRlY2xzOworCisgIC8vLyBGaWVsZENvbGxlY3RvciAtIENvbGxlY3RzIENYWEZpZWxkRGVjbHMgZHVyaW5nIHBhcnNpbmcgb2YgQysrIGNsYXNzZXMuCisgIHN0ZDo6dW5pcXVlX3B0cjxDWFhGaWVsZENvbGxlY3Rvcj4gRmllbGRDb2xsZWN0b3I7CisKKyAgdHlwZWRlZiBsbHZtOjpTbWFsbFNldFZlY3RvcjxOYW1lZERlY2wgKiwgMTY+IE5hbWVkRGVjbFNldFR5cGU7CisKKyAgLy8vIFxicmllZiBTZXQgY29udGFpbmluZyBhbGwgZGVjbGFyZWQgcHJpdmF0ZSBmaWVsZHMgdGhhdCBhcmUgbm90IHVzZWQuCisgIE5hbWVkRGVjbFNldFR5cGUgVW51c2VkUHJpdmF0ZUZpZWxkczsKKworICAvLy8gXGJyaWVmIFNldCBjb250YWluaW5nIGFsbCB0eXBlZGVmcyB0aGF0IGFyZSBsaWtlbHkgdW51c2VkLgorICBsbHZtOjpTbWFsbFNldFZlY3Rvcjxjb25zdCBUeXBlZGVmTmFtZURlY2wgKiwgND4KKyAgICAgIFVudXNlZExvY2FsVHlwZWRlZk5hbWVDYW5kaWRhdGVzOworCisgIC8vLyBcYnJpZWYgRGVsZXRlLWV4cHJlc3Npb25zIHRvIGJlIGFuYWx5emVkIGF0IHRoZSBlbmQgb2YgdHJhbnNsYXRpb24gdW5pdAorICAvLy8KKyAgLy8vIFRoaXMgbGlzdCBjb250YWlucyBjbGFzcyBtZW1iZXJzLCBhbmQgbG9jYXRpb25zIG9mIGRlbGV0ZS1leHByZXNzaW9ucworICAvLy8gdGhhdCBjb3VsZCBub3QgYmUgcHJvdmVuIGFzIHRvIHdoZXRoZXIgdGhleSBtaXNtYXRjaCB3aXRoIG5ldy1leHByZXNzaW9uCisgIC8vLyB1c2VkIGluIGluaXRpYWxpemVyIG9mIHRoZSBmaWVsZC4KKyAgdHlwZWRlZiBzdGQ6OnBhaXI8U291cmNlTG9jYXRpb24sIGJvb2w+IERlbGV0ZUV4cHJMb2M7CisgIHR5cGVkZWYgbGx2bTo6U21hbGxWZWN0b3I8RGVsZXRlRXhwckxvYywgND4gRGVsZXRlTG9jczsKKyAgbGx2bTo6TWFwVmVjdG9yPEZpZWxkRGVjbCAqLCBEZWxldGVMb2NzPiBEZWxldGVFeHByczsKKworICB0eXBlZGVmIGxsdm06OlNtYWxsUHRyU2V0PGNvbnN0IENYWFJlY29yZERlY2wqLCA4PiBSZWNvcmREZWNsU2V0VHk7CisKKyAgLy8vIFB1cmVWaXJ0dWFsQ2xhc3NEaWFnU2V0IC0gYSBzZXQgb2YgY2xhc3MgZGVjbGFyYXRpb25zIHdoaWNoIHdlIGhhdmUKKyAgLy8vIGVtaXR0ZWQgYSBsaXN0IG9mIHB1cmUgdmlydHVhbCBmdW5jdGlvbnMuIFVzZWQgdG8gcHJldmVudCBlbWl0dGluZyB0aGUKKyAgLy8vIHNhbWUgbGlzdCBtb3JlIHRoYW4gb25jZS4KKyAgc3RkOjp1bmlxdWVfcHRyPFJlY29yZERlY2xTZXRUeT4gUHVyZVZpcnR1YWxDbGFzc0RpYWdTZXQ7CisKKyAgLy8vIFBhcnNpbmdJbml0Rm9yQXV0b1ZhcnMgLSBhIHNldCBvZiBkZWNsYXJhdGlvbnMgd2l0aCBhdXRvIHR5cGVzIGZvciB3aGljaAorICAvLy8gd2UgYXJlIGN1cnJlbnRseSBwYXJzaW5nIHRoZSBpbml0aWFsaXplci4KKyAgbGx2bTo6U21hbGxQdHJTZXQ8Y29uc3QgRGVjbCosIDQ+IFBhcnNpbmdJbml0Rm9yQXV0b1ZhcnM7CisKKyAgLy8vIFxicmllZiBMb29rIGZvciBhIGxvY2FsbHkgc2NvcGVkIGV4dGVybiAiQyIgZGVjbGFyYXRpb24gYnkgdGhlIGdpdmVuIG5hbWUuCisgIE5hbWVkRGVjbCAqZmluZExvY2FsbHlTY29wZWRFeHRlcm5DRGVjbChEZWNsYXJhdGlvbk5hbWUgTmFtZSk7CisKKyAgdHlwZWRlZiBMYXp5VmVjdG9yPFZhckRlY2wgKiwgRXh0ZXJuYWxTZW1hU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgJkV4dGVybmFsU2VtYVNvdXJjZTo6UmVhZFRlbnRhdGl2ZURlZmluaXRpb25zLCAyLCAyPgorICAgIFRlbnRhdGl2ZURlZmluaXRpb25zVHlwZTsKKworICAvLy8gXGJyaWVmIEFsbCB0aGUgdGVudGF0aXZlIGRlZmluaXRpb25zIGVuY291bnRlcmVkIGluIHRoZSBUVS4KKyAgVGVudGF0aXZlRGVmaW5pdGlvbnNUeXBlIFRlbnRhdGl2ZURlZmluaXRpb25zOworCisgIHR5cGVkZWYgTGF6eVZlY3Rvcjxjb25zdCBEZWNsYXJhdG9yRGVjbCAqLCBFeHRlcm5hbFNlbWFTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAmRXh0ZXJuYWxTZW1hU291cmNlOjpSZWFkVW51c2VkRmlsZVNjb3BlZERlY2xzLCAyLCAyPgorICAgIFVudXNlZEZpbGVTY29wZWREZWNsc1R5cGU7CisKKyAgLy8vIFxicmllZiBUaGUgc2V0IG9mIGZpbGUgc2NvcGVkIGRlY2xzIHNlZW4gc28gZmFyIHRoYXQgaGF2ZSBub3QgYmVlbiB1c2VkCisgIC8vLyBhbmQgbXVzdCB3YXJuIGlmIG5vdCB1c2VkLiBPbmx5IGNvbnRhaW5zIHRoZSBmaXJzdCBkZWNsYXJhdGlvbi4KKyAgVW51c2VkRmlsZVNjb3BlZERlY2xzVHlwZSBVbnVzZWRGaWxlU2NvcGVkRGVjbHM7CisKKyAgdHlwZWRlZiBMYXp5VmVjdG9yPENYWENvbnN0cnVjdG9yRGVjbCAqLCBFeHRlcm5hbFNlbWFTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAmRXh0ZXJuYWxTZW1hU291cmNlOjpSZWFkRGVsZWdhdGluZ0NvbnN0cnVjdG9ycywgMiwgMj4KKyAgICBEZWxlZ2F0aW5nQ3RvckRlY2xzVHlwZTsKKworICAvLy8gXGJyaWVmIEFsbCB0aGUgZGVsZWdhdGluZyBjb25zdHJ1Y3RvcnMgc2VlbiBzbyBmYXIgaW4gdGhlIGZpbGUsIHVzZWQgZm9yCisgIC8vLyBjeWNsZSBkZXRlY3Rpb24gYXQgdGhlIGVuZCBvZiB0aGUgVFUuCisgIERlbGVnYXRpbmdDdG9yRGVjbHNUeXBlIERlbGVnYXRpbmdDdG9yRGVjbHM7CisKKyAgLy8vIFxicmllZiBBbGwgdGhlIG92ZXJyaWRpbmcgZnVuY3Rpb25zIHNlZW4gZHVyaW5nIGEgY2xhc3MgZGVmaW5pdGlvbgorICAvLy8gdGhhdCBoYWQgdGhlaXIgZXhjZXB0aW9uIHNwZWMgY2hlY2tzIGRlbGF5ZWQsIHBsdXMgdGhlIG92ZXJyaWRkZW4KKyAgLy8vIGZ1bmN0aW9uLgorICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgQ1hYTWV0aG9kRGVjbCosIGNvbnN0IENYWE1ldGhvZERlY2wqPiwgMj4KKyAgICBEZWxheWVkRXhjZXB0aW9uU3BlY0NoZWNrczsKKworICAvLy8gXGJyaWVmIEFsbCB0aGUgbWVtYmVycyBzZWVuIGR1cmluZyBhIGNsYXNzIGRlZmluaXRpb24gd2hpY2ggd2VyZSBib3RoCisgIC8vLyBleHBsaWNpdGx5IGRlZmF1bHRlZCBhbmQgaGFkIGV4cGxpY2l0bHktc3BlY2lmaWVkIGV4Y2VwdGlvbgorICAvLy8gc3BlY2lmaWNhdGlvbnMsIGFsb25nIHdpdGggdGhlIGZ1bmN0aW9uIHR5cGUgY29udGFpbmluZyB0aGVpcgorICAvLy8gdXNlci1zcGVjaWZpZWQgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uIFRob3NlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucworICAvLy8gd2VyZSBvdmVycmlkZGVuIHdpdGggdGhlIGRlZmF1bHQgc3BlY2lmaWNhdGlvbnMsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvCisgIC8vLyBjaGVjayB3aGV0aGVyIHRoZXkgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgZGVmYXVsdCBzcGVjaWZpY2F0aW9uLCBhbmQKKyAgLy8vIHdlIGNhbid0IGRvIHRoYXQgdW50aWwgdGhlIG5lc3Rpbmcgc2V0IG9mIGNsYXNzIGRlZmluaXRpb25zIGlzIGNvbXBsZXRlLgorICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8Q1hYTWV0aG9kRGVjbCosIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlKj4sIDI+CisgICAgRGVsYXllZERlZmF1bHRlZE1lbWJlckV4Y2VwdGlvblNwZWNzOworCisgIHR5cGVkZWYgbGx2bTo6TWFwVmVjdG9yPGNvbnN0IEZ1bmN0aW9uRGVjbCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TGF0ZVBhcnNlZFRlbXBsYXRlPj4KKyAgICAgIExhdGVQYXJzZWRUZW1wbGF0ZU1hcFQ7CisgIExhdGVQYXJzZWRUZW1wbGF0ZU1hcFQgTGF0ZVBhcnNlZFRlbXBsYXRlTWFwOworCisgIC8vLyBcYnJpZWYgQ2FsbGJhY2sgdG8gdGhlIHBhcnNlciB0byBwYXJzZSB0ZW1wbGF0ZWQgZnVuY3Rpb25zIHdoZW4gbmVlZGVkLgorICB0eXBlZGVmIHZvaWQgTGF0ZVRlbXBsYXRlUGFyc2VyQ0Iodm9pZCAqUCwgTGF0ZVBhcnNlZFRlbXBsYXRlICZMUFQpOworICB0eXBlZGVmIHZvaWQgTGF0ZVRlbXBsYXRlUGFyc2VyQ2xlYW51cENCKHZvaWQgKlApOworICBMYXRlVGVtcGxhdGVQYXJzZXJDQiAqTGF0ZVRlbXBsYXRlUGFyc2VyOworICBMYXRlVGVtcGxhdGVQYXJzZXJDbGVhbnVwQ0IgKkxhdGVUZW1wbGF0ZVBhcnNlckNsZWFudXA7CisgIHZvaWQgKk9wYXF1ZVBhcnNlcjsKKworICB2b2lkIFNldExhdGVUZW1wbGF0ZVBhcnNlcihMYXRlVGVtcGxhdGVQYXJzZXJDQiAqTFRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXRlVGVtcGxhdGVQYXJzZXJDbGVhbnVwQ0IgKkxUUENsZWFudXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKlApIHsKKyAgICBMYXRlVGVtcGxhdGVQYXJzZXIgPSBMVFA7CisgICAgTGF0ZVRlbXBsYXRlUGFyc2VyQ2xlYW51cCA9IExUUENsZWFudXA7CisgICAgT3BhcXVlUGFyc2VyID0gUDsKKyAgfQorCisgIGNsYXNzIERlbGF5ZWREaWFnbm9zdGljczsKKworICBjbGFzcyBEZWxheWVkRGlhZ25vc3RpY3NTdGF0ZSB7CisgICAgc2VtYTo6RGVsYXllZERpYWdub3N0aWNQb29sICpTYXZlZFBvb2w7CisgICAgZnJpZW5kIGNsYXNzIFNlbWE6OkRlbGF5ZWREaWFnbm9zdGljczsKKyAgfTsKKyAgdHlwZWRlZiBEZWxheWVkRGlhZ25vc3RpY3NTdGF0ZSBQYXJzaW5nRGVjbFN0YXRlOworICB0eXBlZGVmIERlbGF5ZWREaWFnbm9zdGljc1N0YXRlIFByb2Nlc3NpbmdDb250ZXh0U3RhdGU7CisKKyAgLy8vIEEgY2xhc3Mgd2hpY2ggZW5jYXBzdWxhdGVzIHRoZSBsb2dpYyBmb3IgZGVsYXlpbmcgZGlhZ25vc3RpY3MKKyAgLy8vIGR1cmluZyBwYXJzaW5nIGFuZCBvdGhlciBwcm9jZXNzaW5nLgorICBjbGFzcyBEZWxheWVkRGlhZ25vc3RpY3MgeworICAgIC8vLyBcYnJpZWYgVGhlIGN1cnJlbnQgcG9vbCBvZiBkaWFnbm9zdGljcyBpbnRvIHdoaWNoIGRlbGF5ZWQKKyAgICAvLy8gZGlhZ25vc3RpY3Mgc2hvdWxkIGdvLgorICAgIHNlbWE6OkRlbGF5ZWREaWFnbm9zdGljUG9vbCAqQ3VyUG9vbDsKKworICBwdWJsaWM6CisgICAgRGVsYXllZERpYWdub3N0aWNzKCkgOiBDdXJQb29sKG51bGxwdHIpIHt9CisKKyAgICAvLy8gQWRkcyBhIGRlbGF5ZWQgZGlhZ25vc3RpYy4KKyAgICB2b2lkIGFkZChjb25zdCBzZW1hOjpEZWxheWVkRGlhZ25vc3RpYyAmZGlhZyk7IC8vIGluIERlbGF5ZWREaWFnbm9zdGljLmgKKworICAgIC8vLyBEZXRlcm1pbmVzIHdoZXRoZXIgZGlhZ25vc3RpY3Mgc2hvdWxkIGJlIGRlbGF5ZWQuCisgICAgYm9vbCBzaG91bGREZWxheURpYWdub3N0aWNzKCkgeyByZXR1cm4gQ3VyUG9vbCAhPSBudWxscHRyOyB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCBkZWxheWVkLWRpYWdub3N0aWNzIHBvb2wuCisgICAgc2VtYTo6RGVsYXllZERpYWdub3N0aWNQb29sICpnZXRDdXJyZW50UG9vbCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBDdXJQb29sOworICAgIH0KKworICAgIC8vLyBFbnRlciBhIG5ldyBzY29wZS4gIEFjY2VzcyBhbmQgZGVwcmVjYXRpb24gZGlhZ25vc3RpY3Mgd2lsbCBiZQorICAgIC8vLyBjb2xsZWN0ZWQgaW4gdGhpcyBwb29sLgorICAgIERlbGF5ZWREaWFnbm9zdGljc1N0YXRlIHB1c2goc2VtYTo6RGVsYXllZERpYWdub3N0aWNQb29sICZwb29sKSB7CisgICAgICBEZWxheWVkRGlhZ25vc3RpY3NTdGF0ZSBzdGF0ZTsKKyAgICAgIHN0YXRlLlNhdmVkUG9vbCA9IEN1clBvb2w7CisgICAgICBDdXJQb29sID0gJnBvb2w7CisgICAgICByZXR1cm4gc3RhdGU7CisgICAgfQorCisgICAgLy8vIExlYXZlIGEgZGVsYXllZC1kaWFnbm9zdGljIHN0YXRlIHRoYXQgd2FzIHByZXZpb3VzbHkgcHVzaGVkLgorICAgIC8vLyBEbyBub3QgZW1pdCBhbnkgb2YgdGhlIGRpYWdub3N0aWNzLiAgVGhpcyBpcyBwZXJmb3JtZWQgYXMgcGFydAorICAgIC8vLyBvZiB0aGUgYm9va2tlZXBpbmcgb2YgcG9wcGluZyBhIHBvb2wgInByb3Blcmx5Ii4KKyAgICB2b2lkIHBvcFdpdGhvdXRFbWl0dGluZyhEZWxheWVkRGlhZ25vc3RpY3NTdGF0ZSBzdGF0ZSkgeworICAgICAgQ3VyUG9vbCA9IHN0YXRlLlNhdmVkUG9vbDsKKyAgICB9CisKKyAgICAvLy8gRW50ZXIgYSBuZXcgc2NvcGUgd2hlcmUgYWNjZXNzIGFuZCBkZXByZWNhdGlvbiBkaWFnbm9zdGljcyBhcmUKKyAgICAvLy8gbm90IGRlbGF5ZWQuCisgICAgRGVsYXllZERpYWdub3N0aWNzU3RhdGUgcHVzaFVuZGVsYXllZCgpIHsKKyAgICAgIERlbGF5ZWREaWFnbm9zdGljc1N0YXRlIHN0YXRlOworICAgICAgc3RhdGUuU2F2ZWRQb29sID0gQ3VyUG9vbDsKKyAgICAgIEN1clBvb2wgPSBudWxscHRyOworICAgICAgcmV0dXJuIHN0YXRlOworICAgIH0KKworICAgIC8vLyBVbmRvIGEgcHJldmlvdXMgcHVzaFVuZGVsYXllZCgpLgorICAgIHZvaWQgcG9wVW5kZWxheWVkKERlbGF5ZWREaWFnbm9zdGljc1N0YXRlIHN0YXRlKSB7CisgICAgICBhc3NlcnQoQ3VyUG9vbCA9PSBudWxscHRyKTsKKyAgICAgIEN1clBvb2wgPSBzdGF0ZS5TYXZlZFBvb2w7CisgICAgfQorICB9IERlbGF5ZWREaWFnbm9zdGljczsKKworICAvLy8gQSBSQUlJIG9iamVjdCB0byB0ZW1wb3JhcmlseSBwdXNoIGEgZGVjbGFyYXRpb24gY29udGV4dC4KKyAgY2xhc3MgQ29udGV4dFJBSUkgeworICBwcml2YXRlOgorICAgIFNlbWEgJlM7CisgICAgRGVjbENvbnRleHQgKlNhdmVkQ29udGV4dDsKKyAgICBQcm9jZXNzaW5nQ29udGV4dFN0YXRlIFNhdmVkQ29udGV4dFN0YXRlOworICAgIFF1YWxUeXBlIFNhdmVkQ1hYVGhpc1R5cGVPdmVycmlkZTsKKworICBwdWJsaWM6CisgICAgQ29udGV4dFJBSUkoU2VtYSAmUywgRGVjbENvbnRleHQgKkNvbnRleHRUb1B1c2gsIGJvb2wgTmV3VGhpc0NvbnRleHQgPSB0cnVlKQorICAgICAgOiBTKFMpLCBTYXZlZENvbnRleHQoUy5DdXJDb250ZXh0KSwKKyAgICAgICAgU2F2ZWRDb250ZXh0U3RhdGUoUy5EZWxheWVkRGlhZ25vc3RpY3MucHVzaFVuZGVsYXllZCgpKSwKKyAgICAgICAgU2F2ZWRDWFhUaGlzVHlwZU92ZXJyaWRlKFMuQ1hYVGhpc1R5cGVPdmVycmlkZSkKKyAgICB7CisgICAgICBhc3NlcnQoQ29udGV4dFRvUHVzaCAmJiAicHVzaGluZyBudWxsIGNvbnRleHQiKTsKKyAgICAgIFMuQ3VyQ29udGV4dCA9IENvbnRleHRUb1B1c2g7CisgICAgICBpZiAoTmV3VGhpc0NvbnRleHQpCisgICAgICAgIFMuQ1hYVGhpc1R5cGVPdmVycmlkZSA9IFF1YWxUeXBlKCk7CisgICAgfQorCisgICAgdm9pZCBwb3AoKSB7CisgICAgICBpZiAoIVNhdmVkQ29udGV4dCkgcmV0dXJuOworICAgICAgUy5DdXJDb250ZXh0ID0gU2F2ZWRDb250ZXh0OworICAgICAgUy5EZWxheWVkRGlhZ25vc3RpY3MucG9wVW5kZWxheWVkKFNhdmVkQ29udGV4dFN0YXRlKTsKKyAgICAgIFMuQ1hYVGhpc1R5cGVPdmVycmlkZSA9IFNhdmVkQ1hYVGhpc1R5cGVPdmVycmlkZTsKKyAgICAgIFNhdmVkQ29udGV4dCA9IG51bGxwdHI7CisgICAgfQorCisgICAgfkNvbnRleHRSQUlJKCkgeworICAgICAgcG9wKCk7CisgICAgfQorICB9OworCisgIC8vLyBcYnJpZWYgUkFJSSBvYmplY3QgdG8gaGFuZGxlIHRoZSBzdGF0ZSBjaGFuZ2VzIHJlcXVpcmVkIHRvIHN5bnRoZXNpemUKKyAgLy8vIGEgZnVuY3Rpb24gYm9keS4KKyAgY2xhc3MgU3ludGhlc2l6ZWRGdW5jdGlvblNjb3BlIHsKKyAgICBTZW1hICZTOworICAgIFNlbWE6OkNvbnRleHRSQUlJIFNhdmVkQ29udGV4dDsKKyAgICBib29sIFB1c2hlZENvZGVTeW50aGVzaXNDb250ZXh0ID0gZmFsc2U7CisKKyAgcHVibGljOgorICAgIFN5bnRoZXNpemVkRnVuY3Rpb25TY29wZShTZW1hICZTLCBEZWNsQ29udGV4dCAqREMpCisgICAgICAgIDogUyhTKSwgU2F2ZWRDb250ZXh0KFMsIERDKSB7CisgICAgICBTLlB1c2hGdW5jdGlvblNjb3BlKCk7CisgICAgICBTLlB1c2hFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQoCisgICAgICAgICAgU2VtYTo6RXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0OjpQb3RlbnRpYWxseUV2YWx1YXRlZCk7CisgICAgICBpZiAoYXV0byAqRkQgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KERDKSkKKyAgICAgICAgRkQtPnNldFdpbGxIYXZlQm9keSh0cnVlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYXNzZXJ0KGlzYTxPYmpDTWV0aG9kRGVjbD4oREMpKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZENvbnRleHROb3RlKFNvdXJjZUxvY2F0aW9uIFVzZUxvYykgeworICAgICAgYXNzZXJ0KCFQdXNoZWRDb2RlU3ludGhlc2lzQ29udGV4dCk7CisKKyAgICAgIFNlbWE6OkNvZGVTeW50aGVzaXNDb250ZXh0IEN0eDsKKyAgICAgIEN0eC5LaW5kID0gU2VtYTo6Q29kZVN5bnRoZXNpc0NvbnRleHQ6OkRlZmluaW5nU3ludGhlc2l6ZWRGdW5jdGlvbjsKKyAgICAgIEN0eC5Qb2ludE9mSW5zdGFudGlhdGlvbiA9IFVzZUxvYzsKKyAgICAgIEN0eC5FbnRpdHkgPSBjYXN0PERlY2w+KFMuQ3VyQ29udGV4dCk7CisgICAgICBTLnB1c2hDb2RlU3ludGhlc2lzQ29udGV4dChDdHgpOworCisgICAgICBQdXNoZWRDb2RlU3ludGhlc2lzQ29udGV4dCA9IHRydWU7CisgICAgfQorCisgICAgflN5bnRoZXNpemVkRnVuY3Rpb25TY29wZSgpIHsKKyAgICAgIGlmIChQdXNoZWRDb2RlU3ludGhlc2lzQ29udGV4dCkKKyAgICAgICAgUy5wb3BDb2RlU3ludGhlc2lzQ29udGV4dCgpOworICAgICAgaWYgKGF1dG8gKkZEID0gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPihTLkN1ckNvbnRleHQpKQorICAgICAgICBGRC0+c2V0V2lsbEhhdmVCb2R5KGZhbHNlKTsKKyAgICAgIFMuUG9wRXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0KCk7CisgICAgICBTLlBvcEZ1bmN0aW9uU2NvcGVJbmZvKCk7CisgICAgfQorICB9OworCisgIC8vLyBXZWFrVW5kZWNsYXJlZElkZW50aWZpZXJzIC0gSWRlbnRpZmllcnMgY29udGFpbmVkIGluCisgIC8vLyBcI3ByYWdtYSB3ZWFrIGJlZm9yZSBkZWNsYXJlZC4gcmFyZS4gbWF5IGFsaWFzIGFub3RoZXIKKyAgLy8vIGlkZW50aWZpZXIsIGRlY2xhcmVkIG9yIHVuZGVjbGFyZWQKKyAgbGx2bTo6TWFwVmVjdG9yPElkZW50aWZpZXJJbmZvICosIFdlYWtJbmZvPiBXZWFrVW5kZWNsYXJlZElkZW50aWZpZXJzOworCisgIC8vLyBFeHRuYW1lVW5kZWNsYXJlZElkZW50aWZpZXJzIC0gSWRlbnRpZmllcnMgY29udGFpbmVkIGluCisgIC8vLyBcI3ByYWdtYSByZWRlZmluZV9leHRuYW1lIGJlZm9yZSBkZWNsYXJlZC4gIFVzZWQgaW4gU29sYXJpcyBzeXN0ZW0gaGVhZGVycworICAvLy8gdG8gZGVmaW5lIGZ1bmN0aW9ucyB0aGF0IG9jY3VyIGluIG11bHRpcGxlIHN0YW5kYXJkcyB0byBjYWxsIHRoZSB2ZXJzaW9uCisgIC8vLyBpbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHN0YW5kYXJkLgorICBsbHZtOjpEZW5zZU1hcDxJZGVudGlmaWVySW5mbyosQXNtTGFiZWxBdHRyKj4gRXh0bmFtZVVuZGVjbGFyZWRJZGVudGlmaWVyczsKKworCisgIC8vLyBcYnJpZWYgTG9hZCB3ZWFrIHVuZGVjbGFyZWQgaWRlbnRpZmllcnMgZnJvbSB0aGUgZXh0ZXJuYWwgc291cmNlLgorICB2b2lkIExvYWRFeHRlcm5hbFdlYWtVbmRlY2xhcmVkSWRlbnRpZmllcnMoKTsKKworICAvLy8gV2Vha1RvcExldmVsRGVjbCAtIFRyYW5zbGF0aW9uLXVuaXQgc2NvcGVkIGRlY2xhcmF0aW9ucyBnZW5lcmF0ZWQgYnkKKyAgLy8vIFwjcHJhZ21hIHdlYWsgZHVyaW5nIHByb2Nlc3Npbmcgb2Ygb3RoZXIgRGVjbHMuCisgIC8vLyBJIGNvdWxkbid0IGZpZ3VyZSBvdXQgYSBjbGVhbiB3YXkgdG8gZ2VuZXJhdGUgdGhlc2UgaW4tbGluZSwgc28KKyAgLy8vIHdlIHN0b3JlIHRoZW0gaGVyZSBhbmQgaGFuZGxlIHNlcGFyYXRlbHkgLS0gd2hpY2ggaXMgYSBoYWNrLgorICAvLy8gSXQgd291bGQgYmUgYmVzdCB0byByZWZhY3RvciB0aGlzLgorICBTbWFsbFZlY3RvcjxEZWNsKiwyPiBXZWFrVG9wTGV2ZWxEZWNsOworCisgIElkZW50aWZpZXJSZXNvbHZlciBJZFJlc29sdmVyOworCisgIC8vLyBUcmFuc2xhdGlvbiBVbml0IFNjb3BlIC0gdXNlZnVsIHRvIE9iamVjdGl2ZS1DIGFjdGlvbnMgdGhhdCBuZWVkCisgIC8vLyB0byBsb29rdXAgZmlsZSBzY29wZSBkZWNsYXJhdGlvbnMgaW4gdGhlICJvcmRpbmFyeSIgQyBkZWNsIG5hbWVzcGFjZS4KKyAgLy8vIEZvciBleGFtcGxlLCB1c2VyLWRlZmluZWQgY2xhc3NlcywgYnVpbHQtaW4gImlkIiB0eXBlLCBldGMuCisgIFNjb3BlICpUVVNjb3BlOworCisgIC8vLyBcYnJpZWYgVGhlIEMrKyAic3RkIiBuYW1lc3BhY2UsIHdoZXJlIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IHJlc2lkZXMuCisgIExhenlEZWNsUHRyIFN0ZE5hbWVzcGFjZTsKKworICAvLy8gXGJyaWVmIFRoZSBDKysgInN0ZDo6YmFkX2FsbG9jIiBjbGFzcywgd2hpY2ggaXMgZGVmaW5lZCBieSB0aGUgQysrCisgIC8vLyBzdGFuZGFyZCBsaWJyYXJ5LgorICBMYXp5RGVjbFB0ciBTdGRCYWRBbGxvYzsKKworICAvLy8gXGJyaWVmIFRoZSBDKysgInN0ZDo6YWxpZ25fdmFsX3QiIGVudW0gY2xhc3MsIHdoaWNoIGlzIGRlZmluZWQgYnkgdGhlIEMrKworICAvLy8gc3RhbmRhcmQgbGlicmFyeS4KKyAgTGF6eURlY2xQdHIgU3RkQWxpZ25WYWxUOworCisgIC8vLyBcYnJpZWYgVGhlIEMrKyAic3RkOjpleHBlcmltZW50YWwiIG5hbWVzcGFjZSwgd2hlcmUgdGhlIGV4cGVyaW1lbnRhbCBwYXJ0cworICAvLy8gb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgcmVzaWRlcy4KKyAgTmFtZXNwYWNlRGVjbCAqU3RkRXhwZXJpbWVudGFsTmFtZXNwYWNlQ2FjaGU7CisKKyAgLy8vIFxicmllZiBUaGUgQysrICJzdGQ6OmluaXRpYWxpemVyX2xpc3QiIHRlbXBsYXRlLCB3aGljaCBpcyBkZWZpbmVkIGluCisgIC8vLyBcPGluaXRpYWxpemVyX2xpc3Q+LgorICBDbGFzc1RlbXBsYXRlRGVjbCAqU3RkSW5pdGlhbGl6ZXJMaXN0OworCisgIC8vLyBcYnJpZWYgVGhlIEMrKyAidHlwZV9pbmZvIiBkZWNsYXJhdGlvbiwgd2hpY2ggaXMgZGVmaW5lZCBpbiBcPHR5cGVpbmZvPi4KKyAgUmVjb3JkRGVjbCAqQ1hYVHlwZUluZm9EZWNsOworCisgIC8vLyBcYnJpZWYgVGhlIE1TVkMgIl9HVUlEIiBzdHJ1Y3QsIHdoaWNoIGlzIGRlZmluZWQgaW4gTVNWQyBoZWFkZXIgZmlsZXMuCisgIFJlY29yZERlY2wgKk1TVkNHdWlkRGVjbDsKKworICAvLy8gXGJyaWVmIENhY2hlcyBpZGVudGlmaWVycy9zZWxlY3RvcnMgZm9yIE5TRm91bmRhdGlvbiBBUElzLgorICBzdGQ6OnVuaXF1ZV9wdHI8TlNBUEk+IE5TQVBJT2JqOworCisgIC8vLyBcYnJpZWYgVGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBPYmplY3RpdmUtQyBOU051bWJlciBjbGFzcy4KKyAgT2JqQ0ludGVyZmFjZURlY2wgKk5TTnVtYmVyRGVjbDsKKworICAvLy8gXGJyaWVmIFRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgT2JqZWN0aXZlLUMgTlNWYWx1ZSBjbGFzcy4KKyAgT2JqQ0ludGVyZmFjZURlY2wgKk5TVmFsdWVEZWNsOworCisgIC8vLyBcYnJpZWYgUG9pbnRlciB0byBOU051bWJlciB0eXBlIChOU051bWJlciAqKS4KKyAgUXVhbFR5cGUgTlNOdW1iZXJQb2ludGVyOworCisgIC8vLyBcYnJpZWYgUG9pbnRlciB0byBOU1ZhbHVlIHR5cGUgKE5TVmFsdWUgKikuCisgIFF1YWxUeXBlIE5TVmFsdWVQb2ludGVyOworCisgIC8vLyBcYnJpZWYgVGhlIE9iamVjdGl2ZS1DIE5TTnVtYmVyIG1ldGhvZHMgdXNlZCB0byBjcmVhdGUgTlNOdW1iZXIgbGl0ZXJhbHMuCisgIE9iakNNZXRob2REZWNsICpOU051bWJlckxpdGVyYWxNZXRob2RzW05TQVBJOjpOdW1OU051bWJlckxpdGVyYWxNZXRob2RzXTsKKworICAvLy8gXGJyaWVmIFRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgT2JqZWN0aXZlLUMgTlNTdHJpbmcgY2xhc3MuCisgIE9iakNJbnRlcmZhY2VEZWNsICpOU1N0cmluZ0RlY2w7CisKKyAgLy8vIFxicmllZiBQb2ludGVyIHRvIE5TU3RyaW5nIHR5cGUgKE5TU3RyaW5nICopLgorICBRdWFsVHlwZSBOU1N0cmluZ1BvaW50ZXI7CisKKyAgLy8vIFxicmllZiBUaGUgZGVjbGFyYXRpb24gb2YgdGhlIHN0cmluZ1dpdGhVVEY4U3RyaW5nOiBtZXRob2QuCisgIE9iakNNZXRob2REZWNsICpTdHJpbmdXaXRoVVRGOFN0cmluZ01ldGhvZDsKKworICAvLy8gXGJyaWVmIFRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgdmFsdWVXaXRoQnl0ZXM6b2JqQ1R5cGU6IG1ldGhvZC4KKyAgT2JqQ01ldGhvZERlY2wgKlZhbHVlV2l0aEJ5dGVzT2JqQ1R5cGVNZXRob2Q7CisKKyAgLy8vIFxicmllZiBUaGUgZGVjbGFyYXRpb24gb2YgdGhlIE9iamVjdGl2ZS1DIE5TQXJyYXkgY2xhc3MuCisgIE9iakNJbnRlcmZhY2VEZWNsICpOU0FycmF5RGVjbDsKKworICAvLy8gXGJyaWVmIFRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgYXJyYXlXaXRoT2JqZWN0czpjb3VudDogbWV0aG9kLgorICBPYmpDTWV0aG9kRGVjbCAqQXJyYXlXaXRoT2JqZWN0c01ldGhvZDsKKworICAvLy8gXGJyaWVmIFRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgT2JqZWN0aXZlLUMgTlNEaWN0aW9uYXJ5IGNsYXNzLgorICBPYmpDSW50ZXJmYWNlRGVjbCAqTlNEaWN0aW9uYXJ5RGVjbDsKKworICAvLy8gXGJyaWVmIFRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgZGljdGlvbmFyeVdpdGhPYmplY3RzOmZvcktleXM6Y291bnQ6IG1ldGhvZC4KKyAgT2JqQ01ldGhvZERlY2wgKkRpY3Rpb25hcnlXaXRoT2JqZWN0c01ldGhvZDsKKworICAvLy8gXGJyaWVmIGlkPE5TQ29weWluZz4gdHlwZS4KKyAgUXVhbFR5cGUgUUlETlNDb3B5aW5nOworCisgIC8vLyBcYnJpZWYgd2lsbCBob2xkICdyZXNwb25kc1RvU2VsZWN0b3I6JworICBTZWxlY3RvciBSZXNwb25kc1RvU2VsZWN0b3JTZWw7CisKKyAgLy8vIEEgZmxhZyB0byByZW1lbWJlciB3aGV0aGVyIHRoZSBpbXBsaWNpdCBmb3JtcyBvZiBvcGVyYXRvciBuZXcgYW5kIGRlbGV0ZQorICAvLy8gaGF2ZSBiZWVuIGRlY2xhcmVkLgorICBib29sIEdsb2JhbE5ld0RlbGV0ZURlY2xhcmVkOworCisgIC8vLyBBIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSdyZSBpbiBhIGNvbnRleHQgdGhhdCBwZXJtaXRzIGFic3RyYWN0CisgIC8vLyByZWZlcmVuY2VzIHRvIGZpZWxkcy4gIFRoaXMgaXMgcmVhbGx5IGEKKyAgYm9vbCBBbGxvd0Fic3RyYWN0RmllbGRSZWZlcmVuY2U7CisKKyAgLy8vIFxicmllZiBEZXNjcmliZXMgaG93IHRoZSBleHByZXNzaW9ucyBjdXJyZW50bHkgYmVpbmcgcGFyc2VkIGFyZQorICAvLy8gZXZhbHVhdGVkIGF0IHJ1bi10aW1lLCBpZiBhdCBhbGwuCisgIGVudW0gY2xhc3MgRXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0IHsKKyAgICAvLy8gXGJyaWVmIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gYW5kIGl0cyBzdWJleHByZXNzaW9ucyBvY2N1ciB3aXRoaW4gYW4KKyAgICAvLy8gdW5ldmFsdWF0ZWQgb3BlcmFuZCAoQysrMTEgW2V4cHJdcDcpLCBzdWNoIGFzIHRoZSBzdWJleHByZXNzaW9uIG9mCisgICAgLy8vIFxjIHNpemVvZiwgd2hlcmUgdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gbWF5IGJlIHNpZ25pZmljYW50IGJ1dAorICAgIC8vLyBubyBjb2RlIHdpbGwgYmUgZ2VuZXJhdGVkIHRvIGV2YWx1YXRlIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBhdAorICAgIC8vLyBydW4gdGltZS4KKyAgICBVbmV2YWx1YXRlZCwKKworICAgIC8vLyBcYnJpZWYgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBvY2N1cnMgd2l0aGluIGEgYnJhY2VkLWluaXQtbGlzdCB3aXRoaW4KKyAgICAvLy8gYW4gdW5ldmFsdWF0ZWQgb3BlcmFuZC4gVGhpcyBpcyBtb3N0bHkgbGlrZSBhIHJlZ3VsYXIgdW5ldmFsdWF0ZWQKKyAgICAvLy8gY29udGV4dCwgZXhjZXB0IHRoYXQgd2Ugc3RpbGwgaW5zdGFudGlhdGUgY29uc3RleHByIGZ1bmN0aW9ucyB0aGF0IGFyZQorICAgIC8vLyByZWZlcmVuY2VkIGhlcmUgc28gdGhhdCB3ZSBjYW4gcGVyZm9ybSBuYXJyb3dpbmcgY2hlY2tzIGNvcnJlY3RseS4KKyAgICBVbmV2YWx1YXRlZExpc3QsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gb2NjdXJzIHdpdGhpbiBhIGRpc2NhcmRlZCBzdGF0ZW1lbnQuCisgICAgLy8vIFRoaXMgYmVoYXZlcyBsYXJnZWx5IHNpbWlsYXJseSB0byBhbiB1bmV2YWx1YXRlZCBvcGVyYW5kIGluIHByZXZlbnRpbmcKKyAgICAvLy8gZGVmaW5pdGlvbnMgZnJvbSBiZWluZyByZXF1aXJlZCwgYnV0IG5vdCBpbiBvdGhlciB3YXlzLgorICAgIERpc2NhcmRlZFN0YXRlbWVudCwKKworICAgIC8vLyBcYnJpZWYgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBvY2N1cnMgd2l0aGluIGFuIHVuZXZhbHVhdGVkCisgICAgLy8vIG9wZXJhbmQgdGhhdCB1bmNvbmRpdGlvbmFsbHkgcGVybWl0cyBhYnN0cmFjdCByZWZlcmVuY2VzIHRvCisgICAgLy8vIGZpZWxkcywgc3VjaCBhcyBhIFNJWkUgb3BlcmF0b3IgaW4gTVMtc3R5bGUgaW5saW5lIGFzc2VtYmx5LgorICAgIFVuZXZhbHVhdGVkQWJzdHJhY3QsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBjdXJyZW50IGNvbnRleHQgaXMgInBvdGVudGlhbGx5IGV2YWx1YXRlZCIgaW4gQysrMTEgdGVybXMsCisgICAgLy8vIGJ1dCB0aGUgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYXQgY29tcGlsZS10aW1lIChsaWtlIHRoZSB2YWx1ZXMgb2YKKyAgICAvLy8gY2FzZXMgaW4gYSBzd2l0Y2ggc3RhdGVtZW50KS4KKyAgICBDb25zdGFudEV2YWx1YXRlZCwKKworICAgIC8vLyBcYnJpZWYgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBpcyBwb3RlbnRpYWxseSBldmFsdWF0ZWQgYXQgcnVuIHRpbWUsCisgICAgLy8vIHdoaWNoIG1lYW5zIHRoYXQgY29kZSBtYXkgYmUgZ2VuZXJhdGVkIHRvIGV2YWx1YXRlIHRoZSB2YWx1ZSBvZiB0aGUKKyAgICAvLy8gZXhwcmVzc2lvbiBhdCBydW4gdGltZS4KKyAgICBQb3RlbnRpYWxseUV2YWx1YXRlZCwKKworICAgIC8vLyBcYnJpZWYgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBpcyBwb3RlbnRpYWxseSBldmFsdWF0ZWQsIGJ1dCBhbnkKKyAgICAvLy8gZGVjbGFyYXRpb25zIHJlZmVyZW5jZWQgaW5zaWRlIHRoYXQgZXhwcmVzc2lvbiBhcmUgb25seSB1c2VkIGlmCisgICAgLy8vIGluIGZhY3QgdGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBpcyB1c2VkLgorICAgIC8vLworICAgIC8vLyBUaGlzIHZhbHVlIGlzIHVzZWQgd2hlbiBwYXJzaW5nIGRlZmF1bHQgZnVuY3Rpb24gYXJndW1lbnRzLCBmb3Igd2hpY2gKKyAgICAvLy8gd2Ugd291bGQgbGlrZSB0byBwcm92aWRlIGRpYWdub3N0aWNzIChlLmcuLCBwYXNzaW5nIG5vbi1QT0QgYXJndW1lbnRzCisgICAgLy8vIHRocm91Z2ggdmFyYXJncykgYnV0IGRvIG5vdCB3YW50IHRvIG1hcmsgZGVjbGFyYXRpb25zIGFzICJyZWZlcmVuY2VkIgorICAgIC8vLyB1bnRpbCB0aGUgZGVmYXVsdCBhcmd1bWVudCBpcyB1c2VkLgorICAgIFBvdGVudGlhbGx5RXZhbHVhdGVkSWZVc2VkCisgIH07CisKKyAgLy8vIFxicmllZiBEYXRhIHN0cnVjdHVyZSB1c2VkIHRvIHJlY29yZCBjdXJyZW50IG9yIG5lc3RlZAorICAvLy8gZXhwcmVzc2lvbiBldmFsdWF0aW9uIGNvbnRleHRzLgorICBzdHJ1Y3QgRXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0UmVjb3JkIHsKKyAgICAvLy8gXGJyaWVmIFRoZSBleHByZXNzaW9uIGV2YWx1YXRpb24gY29udGV4dC4KKyAgICBFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQgQ29udGV4dDsKKworICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgZW5jbG9zaW5nIGNvbnRleHQgbmVlZGVkIGEgY2xlYW51cC4KKyAgICBDbGVhbnVwSW5mbyBQYXJlbnRDbGVhbnVwOworCisgICAgLy8vIFxicmllZiBXaGV0aGVyIHdlIGFyZSBpbiBhIGRlY2x0eXBlIGV4cHJlc3Npb24uCisgICAgYm9vbCBJc0RlY2x0eXBlOworCisgICAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGFjdGl2ZSBjbGVhbnVwIG9iamVjdHMgd2hlbiB3ZSBlbnRlcmVkCisgICAgLy8vIHRoaXMgZXhwcmVzc2lvbiBldmFsdWF0aW9uIGNvbnRleHQuCisgICAgdW5zaWduZWQgTnVtQ2xlYW51cE9iamVjdHM7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgdHlwb3MgZW5jb3VudGVyZWQgZHVyaW5nIHRoaXMgZXhwcmVzc2lvbiBldmFsdWF0aW9uCisgICAgLy8vIGNvbnRleHQgKGkuZS4gdGhlIG51bWJlciBvZiBUeXBvRXhwcnMgY3JlYXRlZCkuCisgICAgdW5zaWduZWQgTnVtVHlwb3M7CisKKyAgICBsbHZtOjpTbWFsbFB0clNldDxFeHByKiwgMj4gU2F2ZWRNYXliZU9EUlVzZUV4cHJzOworCisgICAgLy8vIFxicmllZiBUaGUgbGFtYmRhcyB0aGF0IGFyZSBwcmVzZW50IHdpdGhpbiB0aGlzIGNvbnRleHQsIGlmIGl0CisgICAgLy8vIGlzIGluZGVlZCBhbiB1bmV2YWx1YXRlZCBjb250ZXh0LgorICAgIFNtYWxsVmVjdG9yPExhbWJkYUV4cHIgKiwgMj4gTGFtYmRhczsKKworICAgIC8vLyBcYnJpZWYgVGhlIGRlY2xhcmF0aW9uIHRoYXQgcHJvdmlkZXMgY29udGV4dCBmb3IgbGFtYmRhIGV4cHJlc3Npb25zCisgICAgLy8vIGFuZCBibG9jayBsaXRlcmFscyBpZiB0aGUgbm9ybWFsIGRlY2xhcmF0aW9uIGNvbnRleHQgZG9lcyBub3QKKyAgICAvLy8gc3VmZmljZSwgZS5nLiwgaW4gYSBkZWZhdWx0IGZ1bmN0aW9uIGFyZ3VtZW50LgorICAgIERlY2wgKk1hbmdsaW5nQ29udGV4dERlY2w7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBjb250ZXh0IGluZm9ybWF0aW9uIHVzZWQgdG8gbWFuZ2xlIGxhbWJkYSBleHByZXNzaW9ucworICAgIC8vLyBhbmQgYmxvY2sgbGl0ZXJhbHMgd2l0aGluIHRoaXMgY29udGV4dC4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBtYW5nbGluZyBpbmZvcm1hdGlvbiBpcyBhbGxvY2F0ZWQgbGF6aWx5LCBzaW5jZSBtb3N0IGNvbnRleHRzCisgICAgLy8vIGRvIG5vdCBoYXZlIGxhbWJkYSBleHByZXNzaW9ucyBvciBibG9jayBsaXRlcmFscy4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWFuZ2xlTnVtYmVyaW5nQ29udGV4dD4gTWFuZ2xlTnVtYmVyaW5nOworCisgICAgLy8vIFxicmllZiBJZiB3ZSBhcmUgcHJvY2Vzc2luZyBhIGRlY2x0eXBlIHR5cGUsIGEgc2V0IG9mIGNhbGwgZXhwcmVzc2lvbnMKKyAgICAvLy8gZm9yIHdoaWNoIHdlIGhhdmUgZGVmZXJyZWQgY2hlY2tpbmcgdGhlIGNvbXBsZXRlbmVzcyBvZiB0aGUgcmV0dXJuIHR5cGUuCisgICAgU21hbGxWZWN0b3I8Q2FsbEV4cHIgKiwgOD4gRGVsYXllZERlY2x0eXBlQ2FsbHM7CisKKyAgICAvLy8gXGJyaWVmIElmIHdlIGFyZSBwcm9jZXNzaW5nIGEgZGVjbHR5cGUgdHlwZSwgYSBzZXQgb2YgdGVtcG9yYXJ5IGJpbmRpbmcKKyAgICAvLy8gZXhwcmVzc2lvbnMgZm9yIHdoaWNoIHdlIGhhdmUgZGVmZXJyZWQgY2hlY2tpbmcgdGhlIGRlc3RydWN0b3IuCisgICAgU21hbGxWZWN0b3I8Q1hYQmluZFRlbXBvcmFyeUV4cHIgKiwgOD4gRGVsYXllZERlY2x0eXBlQmluZHM7CisKKyAgICBFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHRSZWNvcmQoRXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0IENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsZWFudXBPYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGVhbnVwSW5mbyBQYXJlbnRDbGVhbnVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsICpNYW5nbGluZ0NvbnRleHREZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRGVjbHR5cGUpCisgICAgICA6IENvbnRleHQoQ29udGV4dCksIFBhcmVudENsZWFudXAoUGFyZW50Q2xlYW51cCksCisgICAgICAgIElzRGVjbHR5cGUoSXNEZWNsdHlwZSksIE51bUNsZWFudXBPYmplY3RzKE51bUNsZWFudXBPYmplY3RzKSwKKyAgICAgICAgTnVtVHlwb3MoMCksCisgICAgICAgIE1hbmdsaW5nQ29udGV4dERlY2woTWFuZ2xpbmdDb250ZXh0RGVjbCksIE1hbmdsZU51bWJlcmluZygpIHsgfQorCisgICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbWFuZ2xpbmcgbnVtYmVyaW5nIGNvbnRleHQsIHVzZWQgdG8gY29uc2lzdGVudGx5CisgICAgLy8vIG51bWJlciBjb25zdHJ1Y3RzIGxpa2UgbGFtYmRhcyBmb3IgbWFuZ2xpbmcuCisgICAgTWFuZ2xlTnVtYmVyaW5nQ29udGV4dCAmZ2V0TWFuZ2xlTnVtYmVyaW5nQ29udGV4dChBU1RDb250ZXh0ICZDdHgpOworCisgICAgYm9vbCBpc1VuZXZhbHVhdGVkKCkgY29uc3QgeworICAgICAgcmV0dXJuIENvbnRleHQgPT0gRXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0OjpVbmV2YWx1YXRlZCB8fAorICAgICAgICAgICAgIENvbnRleHQgPT0gRXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0OjpVbmV2YWx1YXRlZEFic3RyYWN0IHx8CisgICAgICAgICAgICAgQ29udGV4dCA9PSBFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQ6OlVuZXZhbHVhdGVkTGlzdDsKKyAgICB9CisgICAgYm9vbCBpc0NvbnN0YW50RXZhbHVhdGVkKCkgY29uc3QgeworICAgICAgcmV0dXJuIENvbnRleHQgPT0gRXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0OjpDb25zdGFudEV2YWx1YXRlZDsKKyAgICB9CisgIH07CisKKyAgLy8vIEEgc3RhY2sgb2YgZXhwcmVzc2lvbiBldmFsdWF0aW9uIGNvbnRleHRzLgorICBTbWFsbFZlY3RvcjxFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHRSZWNvcmQsIDg+IEV4cHJFdmFsQ29udGV4dHM7CisKKyAgLy8vIFxicmllZiBDb21wdXRlIHRoZSBtYW5nbGluZyBudW1iZXIgY29udGV4dCBmb3IgYSBsYW1iZGEgZXhwcmVzc2lvbiBvcgorICAvLy8gYmxvY2sgbGl0ZXJhbC4KKyAgLy8vCisgIC8vLyBccGFyYW0gREMgLSBUaGUgRGVjbENvbnRleHQgY29udGFpbmluZyB0aGUgbGFtYmRhIGV4cHJlc3Npb24gb3IKKyAgLy8vIGJsb2NrIGxpdGVyYWwuCisgIC8vLyBccGFyYW1bb3V0XSBNYW5nbGluZ0NvbnRleHREZWNsIC0gUmV0dXJucyB0aGUgTWFuZ2xpbmdDb250ZXh0RGVjbAorICAvLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0LCBpZiByZWxldmFudC4KKyAgTWFuZ2xlTnVtYmVyaW5nQ29udGV4dCAqZ2V0Q3VycmVudE1hbmdsZU51bWJlckNvbnRleHQoCisgICAgY29uc3QgRGVjbENvbnRleHQgKkRDLAorICAgIERlY2wgKiZNYW5nbGluZ0NvbnRleHREZWNsKTsKKworCisgIC8vLyBTcGVjaWFsTWVtYmVyT3ZlcmxvYWRSZXN1bHQgLSBUaGUgb3ZlcmxvYWRpbmcgcmVzdWx0IGZvciBhIHNwZWNpYWwgbWVtYmVyCisgIC8vLyBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGJhc2ljYWxseSBhIHdyYXBwZXIgYXJvdW5kIFBvaW50ZXJJbnRQYWlyLiBUaGUgbG93ZXN0IGJpdHMgb2YgdGhlCisgIC8vLyBpbnRlZ2VyIGFyZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIG92ZXJsb2FkIHJlc29sdXRpb24gc3VjY2VlZGVkLgorICBjbGFzcyBTcGVjaWFsTWVtYmVyT3ZlcmxvYWRSZXN1bHQgeworICBwdWJsaWM6CisgICAgZW51bSBLaW5kIHsKKyAgICAgIE5vTWVtYmVyT3JEZWxldGVkLAorICAgICAgQW1iaWd1b3VzLAorICAgICAgU3VjY2VzcworICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICBsbHZtOjpQb2ludGVySW50UGFpcjxDWFhNZXRob2REZWNsKiwgMj4gUGFpcjsKKworICBwdWJsaWM6CisgICAgU3BlY2lhbE1lbWJlck92ZXJsb2FkUmVzdWx0KCkgOiBQYWlyKCkge30KKyAgICBTcGVjaWFsTWVtYmVyT3ZlcmxvYWRSZXN1bHQoQ1hYTWV0aG9kRGVjbCAqTUQpCisgICAgICAgIDogUGFpcihNRCwgTUQtPmlzRGVsZXRlZCgpID8gTm9NZW1iZXJPckRlbGV0ZWQgOiBTdWNjZXNzKSB7fQorCisgICAgQ1hYTWV0aG9kRGVjbCAqZ2V0TWV0aG9kKCkgY29uc3QgeyByZXR1cm4gUGFpci5nZXRQb2ludGVyKCk7IH0KKyAgICB2b2lkIHNldE1ldGhvZChDWFhNZXRob2REZWNsICpNRCkgeyBQYWlyLnNldFBvaW50ZXIoTUQpOyB9CisKKyAgICBLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxLaW5kPihQYWlyLmdldEludCgpKTsgfQorICAgIHZvaWQgc2V0S2luZChLaW5kIEspIHsgUGFpci5zZXRJbnQoSyk7IH0KKyAgfTsKKworICBjbGFzcyBTcGVjaWFsTWVtYmVyT3ZlcmxvYWRSZXN1bHRFbnRyeQorICAgICAgOiBwdWJsaWMgbGx2bTo6RmFzdEZvbGRpbmdTZXROb2RlLAorICAgICAgICBwdWJsaWMgU3BlY2lhbE1lbWJlck92ZXJsb2FkUmVzdWx0IHsKKyAgcHVibGljOgorICAgIFNwZWNpYWxNZW1iZXJPdmVybG9hZFJlc3VsdEVudHJ5KGNvbnN0IGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKQorICAgICAgOiBGYXN0Rm9sZGluZ1NldE5vZGUoSUQpCisgICAge30KKyAgfTsKKworICAvLy8gXGJyaWVmIEEgY2FjaGUgb2Ygc3BlY2lhbCBtZW1iZXIgZnVuY3Rpb24gb3ZlcmxvYWQgcmVzb2x1dGlvbiByZXN1bHRzCisgIC8vLyBmb3IgQysrIHJlY29yZHMuCisgIGxsdm06OkZvbGRpbmdTZXQ8U3BlY2lhbE1lbWJlck92ZXJsb2FkUmVzdWx0RW50cnk+IFNwZWNpYWxNZW1iZXJDYWNoZTsKKworICAvLy8gXGJyaWVmIEEgY2FjaGUgb2YgdGhlIGZsYWdzIGF2YWlsYWJsZSBpbiBlbnVtZXJhdGlvbnMgd2l0aCB0aGUgZmxhZ19iaXRzCisgIC8vLyBhdHRyaWJ1dGUuCisgIG11dGFibGUgbGx2bTo6RGVuc2VNYXA8Y29uc3QgRW51bURlY2wqLCBsbHZtOjpBUEludD4gRmxhZ0JpdHNDYWNoZTsKKworICAvLy8gXGJyaWVmIFRoZSBraW5kIG9mIHRyYW5zbGF0aW9uIHVuaXQgd2UgYXJlIHByb2Nlc3NpbmcuCisgIC8vLworICAvLy8gV2hlbiB3ZSdyZSBwcm9jZXNzaW5nIGEgY29tcGxldGUgdHJhbnNsYXRpb24gdW5pdCwgU2VtYSB3aWxsIHBlcmZvcm0KKyAgLy8vIGVuZC1vZi10cmFuc2xhdGlvbi11bml0IHNlbWFudGljIHRhc2tzIChzdWNoIGFzIGNyZWF0aW5nCisgIC8vLyBpbml0aWFsaXplcnMgZm9yIHRlbnRhdGl2ZSBkZWZpbml0aW9ucyBpbiBDKSBvbmNlIHBhcnNpbmcgaGFzCisgIC8vLyBjb21wbGV0ZWQuIE1vZHVsZXMgYW5kIHByZWNvbXBpbGVkIGhlYWRlcnMgcGVyZm9ybSBkaWZmZXJlbnQga2luZHMgb2YKKyAgLy8vIGNoZWNrcy4KKyAgVHJhbnNsYXRpb25Vbml0S2luZCBUVUtpbmQ7CisKKyAgbGx2bTo6QnVtcFB0ckFsbG9jYXRvciBCdW1wQWxsb2M7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIFNGSU5BRSBkaWFnbm9zdGljcyB0aGF0IGhhdmUgYmVlbiB0cmFwcGVkLgorICB1bnNpZ25lZCBOdW1TRklOQUVFcnJvcnM7CisKKyAgdHlwZWRlZiBsbHZtOjpEZW5zZU1hcDxQYXJtVmFyRGVjbCAqLCBsbHZtOjpUaW55UHRyVmVjdG9yPFBhcm1WYXJEZWNsICo+PgorICAgIFVucGFyc2VkRGVmYXVsdEFyZ0luc3RhbnRpYXRpb25zTWFwOworCisgIC8vLyBcYnJpZWYgQSBtYXBwaW5nIGZyb20gcGFyYW1ldGVycyB3aXRoIHVucGFyc2VkIGRlZmF1bHQgYXJndW1lbnRzIHRvIHRoZQorICAvLy8gc2V0IG9mIGluc3RhbnRpYXRpb25zIG9mIGVhY2ggcGFyYW1ldGVyLgorICAvLy8KKyAgLy8vIFRoaXMgbWFwcGluZyBpcyBhIHRlbXBvcmFyeSBkYXRhIHN0cnVjdHVyZSB1c2VkIHdoZW4gcGFyc2luZworICAvLy8gbmVzdGVkIGNsYXNzIHRlbXBsYXRlcyBvciBuZXN0ZWQgY2xhc3NlcyBvZiBjbGFzcyB0ZW1wbGF0ZXMsCisgIC8vLyB3aGVyZSB3ZSBtaWdodCBlbmQgdXAgaW5zdGFudGlhdGluZyBhbiBpbm5lciBjbGFzcyBiZWZvcmUgdGhlCisgIC8vLyBkZWZhdWx0IGFyZ3VtZW50cyBvZiBpdHMgbWV0aG9kcyBoYXZlIGJlZW4gcGFyc2VkLgorICBVbnBhcnNlZERlZmF1bHRBcmdJbnN0YW50aWF0aW9uc01hcCBVbnBhcnNlZERlZmF1bHRBcmdJbnN0YW50aWF0aW9uczsKKworICAvLyBDb250YWlucyB0aGUgbG9jYXRpb25zIG9mIHRoZSBiZWdpbm5pbmcgb2YgdW5wYXJzZWQgZGVmYXVsdAorICAvLyBhcmd1bWVudCBsb2NhdGlvbnMuCisgIGxsdm06OkRlbnNlTWFwPFBhcm1WYXJEZWNsICosIFNvdXJjZUxvY2F0aW9uPiBVbnBhcnNlZERlZmF1bHRBcmdMb2NzOworCisgIC8vLyBVbmRlZmluZWRJbnRlcm5hbHMgLSBhbGwgdGhlIHVzZWQsIHVuZGVmaW5lZCBvYmplY3RzIHdoaWNoIHJlcXVpcmUgYQorICAvLy8gZGVmaW5pdGlvbiBpbiB0aGlzIHRyYW5zbGF0aW9uIHVuaXQuCisgIGxsdm06Ok1hcFZlY3RvcjxOYW1lZERlY2wgKiwgU291cmNlTG9jYXRpb24+IFVuZGVmaW5lZEJ1dFVzZWQ7CisKKyAgLy8vIERldGVybWluZSBpZiBWRCwgd2hpY2ggbXVzdCBiZSBhIHZhcmlhYmxlIG9yIGZ1bmN0aW9uLCBpcyBhbiBleHRlcm5hbAorICAvLy8gc3ltYm9sIHRoYXQgbm9uZXRoZWxlc3MgY2FuJ3QgYmUgcmVmZXJlbmNlZCBmcm9tIG91dHNpZGUgdGhpcyB0cmFuc2xhdGlvbgorICAvLy8gdW5pdCBiZWNhdXNlIGl0cyB0eXBlIGhhcyBubyBsaW5rYWdlIGFuZCBpdCdzIG5vdCBleHRlcm4gIkMiLgorICBib29sIGlzRXh0ZXJuYWxXaXRoTm9MaW5rYWdlVHlwZShWYWx1ZURlY2wgKlZEKTsKKworICAvLy8gT2J0YWluIGEgc29ydGVkIGxpc3Qgb2YgZnVuY3Rpb25zIHRoYXQgYXJlIHVuZGVmaW5lZCBidXQgT0RSLXVzZWQuCisgIHZvaWQgZ2V0VW5kZWZpbmVkQnV0VXNlZCgKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8TmFtZWREZWNsICosIFNvdXJjZUxvY2F0aW9uPiA+ICZVbmRlZmluZWQpOworCisgIC8vLyBSZXRyaWV2ZXMgbGlzdCBvZiBzdXNwaWNpb3VzIGRlbGV0ZS1leHByZXNzaW9ucyB0aGF0IHdpbGwgYmUgY2hlY2tlZCBhdAorICAvLy8gdGhlIGVuZCBvZiB0cmFuc2xhdGlvbiB1bml0LgorICBjb25zdCBsbHZtOjpNYXBWZWN0b3I8RmllbGREZWNsICosIERlbGV0ZUxvY3M+ICYKKyAgZ2V0TWlzbWF0Y2hpbmdEZWxldGVFeHByZXNzaW9ucygpIGNvbnN0OworCisgIHR5cGVkZWYgc3RkOjpwYWlyPE9iakNNZXRob2RMaXN0LCBPYmpDTWV0aG9kTGlzdD4gR2xvYmFsTWV0aG9kczsKKyAgdHlwZWRlZiBsbHZtOjpEZW5zZU1hcDxTZWxlY3RvciwgR2xvYmFsTWV0aG9kcz4gR2xvYmFsTWV0aG9kUG9vbDsKKworICAvLy8gTWV0aG9kIFBvb2wgLSBhbGxvd3MgZWZmaWNpZW50IGxvb2t1cCB3aGVuIHR5cGVjaGVja2luZyBtZXNzYWdlcyB0byAiaWQiLgorICAvLy8gV2UgbmVlZCB0byBtYWludGFpbiBhIGxpc3QsIHNpbmNlIHNlbGVjdG9ycyBjYW4gaGF2ZSBkaWZmZXJpbmcgc2lnbmF0dXJlcworICAvLy8gYWNyb3NzIGNsYXNzZXMuIEluIENvY29hLCB0aGlzIGhhcHBlbnMgdG8gYmUgZXh0cmVtZWx5IHVuY29tbW9uIChvbmx5IDElCisgIC8vLyBvZiBzZWxlY3RvcnMgYXJlICJvdmVybG9hZGVkIikuCisgIC8vLyBBdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCBpdCBpcyByZWNvcmRlZCB3aGV0aGVyIHRoZXJlIHdlcmUgMCwgMSwgb3IgPj0gMgorICAvLy8gbWV0aG9kcyBpbnNpZGUgY2F0ZWdvcmllcyB3aXRoIGEgcGFydGljdWxhciBzZWxlY3Rvci4KKyAgR2xvYmFsTWV0aG9kUG9vbCBNZXRob2RQb29sOworCisgIC8vLyBNZXRob2Qgc2VsZWN0b3JzIHVzZWQgaW4gYSBcQHNlbGVjdG9yIGV4cHJlc3Npb24uIFVzZWQgZm9yIGltcGxlbWVudGF0aW9uCisgIC8vLyBvZiAtV3NlbGVjdG9yLgorICBsbHZtOjpNYXBWZWN0b3I8U2VsZWN0b3IsIFNvdXJjZUxvY2F0aW9uPiBSZWZlcmVuY2VkU2VsZWN0b3JzOworCisgIC8vLyBLaW5kcyBvZiBDKysgc3BlY2lhbCBtZW1iZXJzLgorICBlbnVtIENYWFNwZWNpYWxNZW1iZXIgeworICAgIENYWERlZmF1bHRDb25zdHJ1Y3RvciwKKyAgICBDWFhDb3B5Q29uc3RydWN0b3IsCisgICAgQ1hYTW92ZUNvbnN0cnVjdG9yLAorICAgIENYWENvcHlBc3NpZ25tZW50LAorICAgIENYWE1vdmVBc3NpZ25tZW50LAorICAgIENYWERlc3RydWN0b3IsCisgICAgQ1hYSW52YWxpZAorICB9OworCisgIHR5cGVkZWYgbGx2bTo6UG9pbnRlckludFBhaXI8Q1hYUmVjb3JkRGVjbCAqLCAzLCBDWFhTcGVjaWFsTWVtYmVyPgorICAgICAgU3BlY2lhbE1lbWJlckRlY2w7CisKKyAgLy8vIFRoZSBDKysgc3BlY2lhbCBtZW1iZXJzIHdoaWNoIHdlIGFyZSBjdXJyZW50bHkgaW4gdGhlIHByb2Nlc3Mgb2YKKyAgLy8vIGRlY2xhcmluZy4gSWYgdGhpcyBwcm9jZXNzIHJlY3Vyc2l2ZWx5IHRyaWdnZXJzIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUKKyAgLy8vIHNhbWUgc3BlY2lhbCBtZW1iZXIsIHdlIHNob3VsZCBhY3QgYXMgaWYgaXQgaXMgbm90IHlldCBkZWNsYXJlZC4KKyAgbGx2bTo6U21hbGxQdHJTZXQ8U3BlY2lhbE1lbWJlckRlY2wsIDQ+IFNwZWNpYWxNZW1iZXJzQmVpbmdEZWNsYXJlZDsKKworICAvLy8gVGhlIGZ1bmN0aW9uIGRlZmluaXRpb25zIHdoaWNoIHdlcmUgcmVuYW1lZCBhcyBwYXJ0IG9mIHR5cG8tY29ycmVjdGlvbgorICAvLy8gdG8gbWF0Y2ggdGhlaXIgcmVzcGVjdGl2ZSBkZWNsYXJhdGlvbnMuIFdlIHdhbnQgdG8ga2VlcCB0cmFjayBvZiB0aGVtCisgIC8vLyB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBlbWl0IGEgInJlZGVmaW5pdGlvbiIgZXJyb3IgaWYgd2UgZW5jb3VudGVyIGEKKyAgLy8vIGNvcnJlY3RseSBuYW1lZCBkZWZpbml0aW9uIGFmdGVyIHRoZSByZW5hbWVkIGRlZmluaXRpb24uCisgIGxsdm06OlNtYWxsUHRyU2V0PGNvbnN0IE5hbWVkRGVjbCAqLCA0PiBUeXBvQ29ycmVjdGVkRnVuY3Rpb25EZWZpbml0aW9uczsKKworICAvLy8gU3RhY2sgb2YgdHlwZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBwYXJhbWV0ZXIgZW50aXRpZXMgdGhhdCBhcmUKKyAgLy8vIGN1cnJlbnRseSBiZWluZyBjb3B5LWluaXRpYWxpemVkLiBDYW4gYmUgZW1wdHkuCisgIGxsdm06OlNtYWxsVmVjdG9yPFF1YWxUeXBlLCA0PiBDdXJyZW50UGFyYW1ldGVyQ29weVR5cGVzOworCisgIHZvaWQgUmVhZE1ldGhvZFBvb2woU2VsZWN0b3IgU2VsKTsKKyAgdm9pZCB1cGRhdGVPdXRPZkRhdGVTZWxlY3RvcihTZWxlY3RvciBTZWwpOworCisgIC8vLyBQcml2YXRlIEhlbHBlciBwcmVkaWNhdGUgdG8gY2hlY2sgZm9yICdzZWxmJy4KKyAgYm9vbCBpc1NlbGZFeHByKEV4cHIgKlJFeHByKTsKKyAgYm9vbCBpc1NlbGZFeHByKEV4cHIgKlJFeHByLCBjb25zdCBPYmpDTWV0aG9kRGVjbCAqTWV0aG9kKTsKKworICAvLy8gXGJyaWVmIENhdXNlIHRoZSBhY3RpdmUgZGlhZ25vc3RpYyBvbiB0aGUgRGlhZ29zdGljc0VuZ2luZSB0byBiZQorICAvLy8gZW1pdHRlZC4gVGhpcyBpcyBjbG9zZWx5IGNvdXBsZWQgdG8gdGhlIFNlbWFEaWFnbm9zdGljQnVpbGRlciBjbGFzcyBhbmQKKyAgLy8vIHNob3VsZCBub3QgYmUgdXNlZCBlbHNld2hlcmUuCisgIHZvaWQgRW1pdEN1cnJlbnREaWFnbm9zdGljKHVuc2lnbmVkIERpYWdJRCk7CisKKyAgLy8vIFJlY29yZHMgYW5kIHJlc3RvcmVzIHRoZSBGUF9DT05UUkFDVCBzdGF0ZSBvbiBlbnRyeS9leGl0IG9mIGNvbXBvdW5kCisgIC8vLyBzdGF0ZW1lbnRzLgorICBjbGFzcyBGUENvbnRyYWN0U3RhdGVSQUlJIHsKKyAgcHVibGljOgorICAgIEZQQ29udHJhY3RTdGF0ZVJBSUkoU2VtYSAmUykgOiBTKFMpLCBPbGRGUEZlYXR1cmVzU3RhdGUoUy5GUEZlYXR1cmVzKSB7fQorICAgIH5GUENvbnRyYWN0U3RhdGVSQUlJKCkgeyBTLkZQRmVhdHVyZXMgPSBPbGRGUEZlYXR1cmVzU3RhdGU7IH0KKworICBwcml2YXRlOgorICAgIFNlbWEmIFM7CisgICAgRlBPcHRpb25zIE9sZEZQRmVhdHVyZXNTdGF0ZTsKKyAgfTsKKworICB2b2lkIGFkZEltcGxpY2l0VHlwZWRlZihTdHJpbmdSZWYgTmFtZSwgUXVhbFR5cGUgVCk7CisKK3B1YmxpYzoKKyAgU2VtYShQcmVwcm9jZXNzb3IgJnBwLCBBU1RDb250ZXh0ICZjdHh0LCBBU1RDb25zdW1lciAmY29uc3VtZXIsCisgICAgICAgVHJhbnNsYXRpb25Vbml0S2luZCBUVUtpbmQgPSBUVV9Db21wbGV0ZSwKKyAgICAgICBDb2RlQ29tcGxldGVDb25zdW1lciAqQ29tcGxldGlvbkNvbnN1bWVyID0gbnVsbHB0cik7CisgIH5TZW1hKCk7CisKKyAgLy8vIFxicmllZiBQZXJmb3JtIGluaXRpYWxpemF0aW9uIHRoYXQgb2NjdXJzIGFmdGVyIHRoZSBwYXJzZXIgaGFzIGJlZW4KKyAgLy8vIGluaXRpYWxpemVkIGJ1dCBiZWZvcmUgaXQgcGFyc2VzIGFueXRoaW5nLgorICB2b2lkIEluaXRpYWxpemUoKTsKKworICBjb25zdCBMYW5nT3B0aW9ucyAmZ2V0TGFuZ09wdHMoKSBjb25zdCB7IHJldHVybiBMYW5nT3B0czsgfQorICBPcGVuQ0xPcHRpb25zICZnZXRPcGVuQ0xPcHRpb25zKCkgeyByZXR1cm4gT3BlbkNMRmVhdHVyZXM7IH0KKyAgRlBPcHRpb25zICAgICAmZ2V0RlBPcHRpb25zKCkgeyByZXR1cm4gRlBGZWF0dXJlczsgfQorCisgIERpYWdub3N0aWNzRW5naW5lICZnZXREaWFnbm9zdGljcygpIGNvbnN0IHsgcmV0dXJuIERpYWdzOyB9CisgIFNvdXJjZU1hbmFnZXIgJmdldFNvdXJjZU1hbmFnZXIoKSBjb25zdCB7IHJldHVybiBTb3VyY2VNZ3I7IH0KKyAgUHJlcHJvY2Vzc29yICZnZXRQcmVwcm9jZXNzb3IoKSBjb25zdCB7IHJldHVybiBQUDsgfQorICBBU1RDb250ZXh0ICZnZXRBU1RDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQ29udGV4dDsgfQorICBBU1RDb25zdW1lciAmZ2V0QVNUQ29uc3VtZXIoKSBjb25zdCB7IHJldHVybiBDb25zdW1lcjsgfQorICBBU1RNdXRhdGlvbkxpc3RlbmVyICpnZXRBU1RNdXRhdGlvbkxpc3RlbmVyKCkgY29uc3Q7CisgIEV4dGVybmFsU2VtYVNvdXJjZSogZ2V0RXh0ZXJuYWxTb3VyY2UoKSBjb25zdCB7IHJldHVybiBFeHRlcm5hbFNvdXJjZTsgfQorCisgIC8vL1xicmllZiBSZWdpc3RlcnMgYW4gZXh0ZXJuYWwgc291cmNlLiBJZiBhbiBleHRlcm5hbCBzb3VyY2UgYWxyZWFkeSBleGlzdHMsCisgIC8vLyBjcmVhdGVzIGEgbXVsdGlwbGV4IGV4dGVybmFsIHNvdXJjZSBhbmQgYXBwZW5kcyB0byBpdC4KKyAgLy8vCisgIC8vL1xwYXJhbVtpbl0gRSAtIEEgbm9uLW51bGwgZXh0ZXJuYWwgc2VtYSBzb3VyY2UuCisgIC8vLworICB2b2lkIGFkZEV4dGVybmFsU291cmNlKEV4dGVybmFsU2VtYVNvdXJjZSAqRSk7CisKKyAgdm9pZCBQcmludFN0YXRzKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBIZWxwZXIgY2xhc3MgdGhhdCBjcmVhdGVzIGRpYWdub3N0aWNzIHdpdGggb3B0aW9uYWwKKyAgLy8vIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gc3RhY2tzLgorICAvLy8KKyAgLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgYmFzaWMgRGlhZ25vc3RpY0J1aWxkZXIKKyAgLy8vIGNsYXNzIHRoYXQgZW1pdHMgZGlhZ25vc3RpY3MuIFNlbWFEaWFnbm9zdGljQnVpbGRlciBpcworICAvLy8gcmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIHRoZSBkaWFnbm9zdGljIChhcyBEaWFnbm9zdGljQnVpbGRlcgorICAvLy8gZG9lcykgYW5kLCBpZiB0aGUgZGlhZ25vc3RpYyBjb21lcyBmcm9tIGluc2lkZSBhIHRlbXBsYXRlCisgIC8vLyBpbnN0YW50aWF0aW9uLCBwcmludGluZyB0aGUgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBzdGFjayBhcworICAvLy8gd2VsbC4KKyAgY2xhc3MgU2VtYURpYWdub3N0aWNCdWlsZGVyIDogcHVibGljIERpYWdub3N0aWNCdWlsZGVyIHsKKyAgICBTZW1hICZTZW1hUmVmOworICAgIHVuc2lnbmVkIERpYWdJRDsKKworICBwdWJsaWM6CisgICAgU2VtYURpYWdub3N0aWNCdWlsZGVyKERpYWdub3N0aWNCdWlsZGVyICZEQiwgU2VtYSAmU2VtYVJlZiwgdW5zaWduZWQgRGlhZ0lEKQorICAgICAgOiBEaWFnbm9zdGljQnVpbGRlcihEQiksIFNlbWFSZWYoU2VtYVJlZiksIERpYWdJRChEaWFnSUQpIHsgfQorCisgICAgLy8gVGhpcyBpcyBhIGN1bm5pbmcgbGllLiBEaWFnbm9zdGljQnVpbGRlciBhY3R1YWxseSBwZXJmb3JtcyBtb3ZlCisgICAgLy8gY29uc3RydWN0aW9uIGluIGl0cyBjb3B5IGNvbnN0cnVjdG9yIChidXQgZHVlIHRvIHZhcmllZCB1c2VzLCBpdCdzIG5vdAorICAgIC8vIHBvc3NpYmxlIHRvIGNvbnZlbmllbnRseSBleHByZXNzIHRoaXMgYXMgYWN0dWFsIG1vdmUgY29uc3RydWN0aW9uKS4gU28KKyAgICAvLyB0aGUgZGVmYXVsdCBjb3B5IGN0b3IgaGVyZSBpcyBmaW5lLCBiZWNhdXNlIHRoZSBiYXNlIGNsYXNzIGRpc2FibGVzIHRoZQorICAgIC8vIHNvdXJjZSBhbnl3YXksIHNvIHRoZSB1c2VyLWRlZmluZWQgflNlbWFEaWFnbm9zdGljQnVpbGRlciBpcyBhIHNhZmUgbm8tb3AKKyAgICAvLyBpbiB0aGF0IGNhc2UgYW53eWF5LgorICAgIFNlbWFEaWFnbm9zdGljQnVpbGRlcihjb25zdCBTZW1hRGlhZ25vc3RpY0J1aWxkZXImKSA9IGRlZmF1bHQ7CisKKyAgICB+U2VtYURpYWdub3N0aWNCdWlsZGVyKCkgeworICAgICAgLy8gSWYgd2UgYXJlbid0IGFjdGl2ZSwgdGhlcmUgaXMgbm90aGluZyB0byBkby4KKyAgICAgIGlmICghaXNBY3RpdmUoKSkgcmV0dXJuOworCisgICAgICAvLyBPdGhlcndpc2UsIHdlIG5lZWQgdG8gZW1pdCB0aGUgZGlhZ25vc3RpYy4gRmlyc3QgZmx1c2ggdGhlIHVuZGVybHlpbmcKKyAgICAgIC8vIERpYWdub3N0aWNCdWlsZGVyIGRhdGEsIGFuZCBjbGVhciB0aGUgZGlhZ25vc3RpYyBidWlsZGVyIGl0c2VsZiBzbyBpdAorICAgICAgLy8gd29uJ3QgZW1pdCB0aGUgZGlhZ25vc3RpYyBpbiBpdHMgb3duIGRlc3RydWN0b3IuCisgICAgICAvLworICAgICAgLy8gVGhpcyBzZWVtcyB3YXN0ZWZ1bCwgaW4gdGhhdCBhcyB3cml0dGVuIHRoZSBEaWFnbm9zdGljQnVpbGRlciBkdG9yIHdpbGwKKyAgICAgIC8vIGRvIGl0cyBvd24gbmVlZGxlc3MgY2hlY2tzIHRvIHNlZSBpZiB0aGUgZGlhZ25vc3RpYyBuZWVkcyB0byBiZQorICAgICAgLy8gZW1pdHRlZC4gSG93ZXZlciwgYmVjYXVzZSB3ZSB0YWtlIGNhcmUgdG8gZW5zdXJlIHRoYXQgdGhlIGJ1aWxkZXIKKyAgICAgIC8vIG9iamVjdHMgbmV2ZXIgZXNjYXBlLCBhIHN1ZmZpY2llbnRseSBzbWFydCBjb21waWxlciB3aWxsIGJlIGFibGUgdG8KKyAgICAgIC8vIGVsaW1pbmF0ZSB0aGF0IGNvZGUuCisgICAgICBGbHVzaENvdW50cygpOworICAgICAgQ2xlYXIoKTsKKworICAgICAgLy8gRGlzcGF0Y2ggdG8gU2VtYSB0byBlbWl0IHRoZSBkaWFnbm9zdGljLgorICAgICAgU2VtYVJlZi5FbWl0Q3VycmVudERpYWdub3N0aWMoRGlhZ0lEKTsKKyAgICB9CisKKyAgICAvLy8gVGVhY2ggb3BlcmF0b3I8PCB0byBwcm9kdWNlIGFuIG9iamVjdCBvZiB0aGUgY29ycmVjdCB0eXBlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgZnJpZW5kIGNvbnN0IFNlbWFEaWFnbm9zdGljQnVpbGRlciAmb3BlcmF0b3I8PCgKKyAgICAgICAgY29uc3QgU2VtYURpYWdub3N0aWNCdWlsZGVyICZEaWFnLCBjb25zdCBUICZWYWx1ZSkgeworICAgICAgY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJkJhc2VEaWFnID0gRGlhZzsKKyAgICAgIEJhc2VEaWFnIDw8IFZhbHVlOworICAgICAgcmV0dXJuIERpYWc7CisgICAgfQorICB9OworCisgIC8vLyBcYnJpZWYgRW1pdCBhIGRpYWdub3N0aWMuCisgIFNlbWFEaWFnbm9zdGljQnVpbGRlciBEaWFnKFNvdXJjZUxvY2F0aW9uIExvYywgdW5zaWduZWQgRGlhZ0lEKSB7CisgICAgRGlhZ25vc3RpY0J1aWxkZXIgREIgPSBEaWFncy5SZXBvcnQoTG9jLCBEaWFnSUQpOworICAgIHJldHVybiBTZW1hRGlhZ25vc3RpY0J1aWxkZXIoREIsICp0aGlzLCBEaWFnSUQpOworICB9CisKKyAgLy8vIFxicmllZiBFbWl0IGEgcGFydGlhbCBkaWFnbm9zdGljLgorICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgRGlhZyhTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljJiBQRCk7CisKKyAgLy8vIFxicmllZiBCdWlsZCBhIHBhcnRpYWwgZGlhZ25vc3RpYy4KKyAgUGFydGlhbERpYWdub3N0aWMgUERpYWcodW5zaWduZWQgRGlhZ0lEID0gMCk7IC8vIGluIFNlbWFJbnRlcm5hbC5oCisKKyAgYm9vbCBmaW5kTWFjcm9TcGVsbGluZyhTb3VyY2VMb2NhdGlvbiAmbG9jLCBTdHJpbmdSZWYgbmFtZSk7CisKKyAgLy8vIFxicmllZiBHZXQgYSBzdHJpbmcgdG8gc3VnZ2VzdCBmb3IgemVyby1pbml0aWFsaXphdGlvbiBvZiBhIHR5cGUuCisgIHN0ZDo6c3RyaW5nCisgIGdldEZpeEl0WmVyb0luaXRpYWxpemVyRm9yVHlwZShRdWFsVHlwZSBULCBTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0OworICBzdGQ6OnN0cmluZyBnZXRGaXhJdFplcm9MaXRlcmFsRm9yVHlwZShRdWFsVHlwZSBULCBTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQ2FsbHMgXGMgTGV4ZXI6OmdldExvY0ZvckVuZE9mVG9rZW4oKQorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NGb3JFbmRPZlRva2VuKFNvdXJjZUxvY2F0aW9uIExvYywgdW5zaWduZWQgT2Zmc2V0ID0gMCk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbW9kdWxlIGxvYWRlciBhc3NvY2lhdGVkIHdpdGggdGhlIHByZXByb2Nlc3Nvci4KKyAgTW9kdWxlTG9hZGVyICZnZXRNb2R1bGVMb2FkZXIoKSBjb25zdDsKKworICB2b2lkIGVtaXRBbmRDbGVhclVudXNlZExvY2FsVHlwZWRlZldhcm5pbmdzKCk7CisKKyAgdm9pZCBBY3RPblN0YXJ0T2ZUcmFuc2xhdGlvblVuaXQoKTsKKyAgdm9pZCBBY3RPbkVuZE9mVHJhbnNsYXRpb25Vbml0KCk7CisKKyAgdm9pZCBDaGVja0RlbGVnYXRpbmdDdG9yQ3ljbGVzKCk7CisKKyAgU2NvcGUgKmdldFNjb3BlRm9yQ29udGV4dChEZWNsQ29udGV4dCAqQ3R4KTsKKworICB2b2lkIFB1c2hGdW5jdGlvblNjb3BlKCk7CisgIHZvaWQgUHVzaEJsb2NrU2NvcGUoU2NvcGUgKkJsb2NrU2NvcGUsIEJsb2NrRGVjbCAqQmxvY2spOworICBzZW1hOjpMYW1iZGFTY29wZUluZm8gKlB1c2hMYW1iZGFTY29wZSgpOworCisgIC8vLyBcYnJpZWYgVGhpcyBpcyB1c2VkIHRvIGluZm9ybSBTZW1hIHdoYXQgdGhlIGN1cnJlbnQgVGVtcGxhdGVQYXJhbWV0ZXJEZXB0aAorICAvLy8gaXMgZHVyaW5nIFBhcnNpbmcuICBDdXJyZW50bHkgaXQgaXMgdXNlZCB0byBwYXNzIG9uIHRoZSBkZXB0aAorICAvLy8gd2hlbiBwYXJzaW5nIGdlbmVyaWMgbGFtYmRhICdhdXRvJyBwYXJhbWV0ZXJzLgorICB2b2lkIFJlY29yZFBhcnNpbmdUZW1wbGF0ZVBhcmFtZXRlckRlcHRoKHVuc2lnbmVkIERlcHRoKTsKKworICB2b2lkIFB1c2hDYXB0dXJlZFJlZ2lvblNjb3BlKFNjb3BlICpSZWdpb25TY29wZSwgQ2FwdHVyZWREZWNsICpDRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmREZWNsICpSRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlZFJlZ2lvbktpbmQgSyk7CisgIHZvaWQKKyAgUG9wRnVuY3Rpb25TY29wZUluZm8oY29uc3Qgc2VtYTo6QW5hbHlzaXNCYXNlZFdhcm5pbmdzOjpQb2xpY3kgKldQID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbCAqRCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJsb2NrRXhwciAqYmxrRXhwciA9IG51bGxwdHIpOworCisgIHNlbWE6OkZ1bmN0aW9uU2NvcGVJbmZvICpnZXRDdXJGdW5jdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gRnVuY3Rpb25TY29wZXMuZW1wdHkoKSA/IG51bGxwdHIgOiBGdW5jdGlvblNjb3Blcy5iYWNrKCk7CisgIH0KKworICBzZW1hOjpGdW5jdGlvblNjb3BlSW5mbyAqZ2V0RW5jbG9zaW5nRnVuY3Rpb24oKSBjb25zdDsKKworICB2b2lkIHNldEZ1bmN0aW9uSGFzQnJhbmNoSW50b1Njb3BlKCk7CisgIHZvaWQgc2V0RnVuY3Rpb25IYXNCcmFuY2hQcm90ZWN0ZWRTY29wZSgpOworICB2b2lkIHNldEZ1bmN0aW9uSGFzSW5kaXJlY3RHb3RvKCk7CisKKyAgdm9pZCBQdXNoQ29tcG91bmRTY29wZShib29sIElzU3RtdEV4cHIpOworICB2b2lkIFBvcENvbXBvdW5kU2NvcGUoKTsKKworICBzZW1hOjpDb21wb3VuZFNjb3BlSW5mbyAmZ2V0Q3VyQ29tcG91bmRTY29wZSgpIGNvbnN0OworCisgIGJvb2wgaGFzQW55VW5yZWNvdmVyYWJsZUVycm9yc0luVGhpc0Z1bmN0aW9uKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgY3VycmVudCBibG9jaywgaWYgYW55LgorICBzZW1hOjpCbG9ja1Njb3BlSW5mbyAqZ2V0Q3VyQmxvY2soKTsKKworICAvLy8gUmV0cmlldmUgdGhlIGN1cnJlbnQgbGFtYmRhIHNjb3BlIGluZm8sIGlmIGFueS4KKyAgLy8vIFxwYXJhbSBJZ25vcmVOb25MYW1iZGFDYXB0dXJpbmdTY29wZSB0cnVlIGlmIHNob3VsZCBmaW5kIHRoZSB0b3AtbW9zdAorICAvLy8gbGFtYmRhIHNjb3BlIGluZm8gaWdub3JpbmcgYWxsIGlubmVyIGNhcHR1cmluZyBzY29wZXMgdGhhdCBhcmUgbm90CisgIC8vLyBsYW1iZGEgc2NvcGVzLgorICBzZW1hOjpMYW1iZGFTY29wZUluZm8gKgorICBnZXRDdXJMYW1iZGEoYm9vbCBJZ25vcmVOb25MYW1iZGFDYXB0dXJpbmdTY29wZSA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBjdXJyZW50IGdlbmVyaWMgbGFtYmRhIGluZm8sIGlmIGFueS4KKyAgc2VtYTo6TGFtYmRhU2NvcGVJbmZvICpnZXRDdXJHZW5lcmljTGFtYmRhKCk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgY3VycmVudCBjYXB0dXJlZCByZWdpb24sIGlmIGFueS4KKyAgc2VtYTo6Q2FwdHVyZWRSZWdpb25TY29wZUluZm8gKmdldEN1ckNhcHR1cmVkUmVnaW9uKCk7CisKKyAgLy8vIFdlYWtUb3BMZXZlbERlY2xEZWNscyAtIGFjY2VzcyB0byBcI3ByYWdtYSB3ZWFrLWdlbmVyYXRlZCBEZWNscworICBTbWFsbFZlY3RvckltcGw8RGVjbCAqPiAmV2Vha1RvcExldmVsRGVjbHMoKSB7IHJldHVybiBXZWFrVG9wTGV2ZWxEZWNsOyB9CisKKyAgdm9pZCBBY3RPbkNvbW1lbnQoU291cmNlUmFuZ2UgQ29tbWVudCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFR5cGUgQW5hbHlzaXMgLyBQcm9jZXNzaW5nOiBTZW1hVHlwZS5jcHAuCisgIC8vCisKKyAgUXVhbFR5cGUgQnVpbGRRdWFsaWZpZWRUeXBlKFF1YWxUeXBlIFQsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbGlmaWVycyBRcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xTcGVjICpEUyA9IG51bGxwdHIpOworICBRdWFsVHlwZSBCdWlsZFF1YWxpZmllZFR5cGUoUXVhbFR5cGUgVCwgU291cmNlTG9jYXRpb24gTG9jLCB1bnNpZ25lZCBDVlJBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbFNwZWMgKkRTID0gbnVsbHB0cik7CisgIFF1YWxUeXBlIEJ1aWxkUG9pbnRlclR5cGUoUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsIERlY2xhcmF0aW9uTmFtZSBFbnRpdHkpOworICBRdWFsVHlwZSBCdWlsZFJlZmVyZW5jZVR5cGUoUXVhbFR5cGUgVCwgYm9vbCBMVmFsdWVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsIERlY2xhcmF0aW9uTmFtZSBFbnRpdHkpOworICBRdWFsVHlwZSBCdWlsZEFycmF5VHlwZShRdWFsVHlwZSBULCBBcnJheVR5cGU6OkFycmF5U2l6ZU1vZGlmaWVyIEFTTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqQXJyYXlTaXplLCB1bnNpZ25lZCBRdWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgQnJhY2tldHMsIERlY2xhcmF0aW9uTmFtZSBFbnRpdHkpOworICBRdWFsVHlwZSBCdWlsZEV4dFZlY3RvclR5cGUoUXVhbFR5cGUgVCwgRXhwciAqQXJyYXlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXR0ckxvYyk7CisgIFF1YWxUeXBlIEJ1aWxkQWRkcmVzc1NwYWNlQXR0cihRdWFsVHlwZSAmVCwgRXhwciAqQWRkclNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXR0ckxvYyk7CisKKyAgYm9vbCBDaGVja0Z1bmN0aW9uUmV0dXJuVHlwZShRdWFsVHlwZSBULCBTb3VyY2VMb2NhdGlvbiBMb2MpOworCisgIC8vLyBcYnJpZWYgQnVpbGQgYSBmdW5jdGlvbiB0eXBlLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBjaGVja3MgdGhlIGZ1bmN0aW9uIHR5cGUgYWNjb3JkaW5nIHRvIEMrKyBydWxlcyBhbmQKKyAgLy8vIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHJlc3VsdCB0eXBlIGFuZCBwYXJhbWV0ZXIgdHlwZXMgaGF2ZQorICAvLy8ganVzdCBiZWVuIGluc3RhbnRpYXRlZCBmcm9tIGEgdGVtcGxhdGUuIEl0IHRoZXJlZm9yZSBkdXBsaWNhdGVzCisgIC8vLyBzb21lIG9mIHRoZSBiZWhhdmlvciBvZiBHZXRUeXBlRm9yRGVjbGFyYXRvciwgYnV0IGluIGEgbXVjaAorICAvLy8gc2ltcGxlciBmb3JtIHRoYXQgaXMgb25seSBzdWl0YWJsZSBmb3IgdGhpcyBuYXJyb3cgdXNlIGNhc2UuCisgIC8vLworICAvLy8gXHBhcmFtIFQgVGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gUGFyYW1UeXBlcyBUaGUgcGFyYW1ldGVyIHR5cGVzIG9mIHRoZSBmdW5jdGlvbi4gVGhpcyBhcnJheQorICAvLy8gd2lsbCBiZSBtb2RpZmllZCB0byBhY2NvdW50IGZvciBhZGp1c3RtZW50cyB0byB0aGUgdHlwZXMgb2YgdGhlCisgIC8vLyBmdW5jdGlvbiBwYXJhbWV0ZXJzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBlbnRpdHkgd2hvc2UgdHlwZSBpbnZvbHZlcyB0aGlzCisgIC8vLyBmdW5jdGlvbiB0eXBlIG9yLCBpZiB0aGVyZSBpcyBubyBzdWNoIGVudGl0eSwgdGhlIGxvY2F0aW9uIG9mIHRoZQorICAvLy8gdHlwZSB0aGF0IHdpbGwgaGF2ZSBmdW5jdGlvbiB0eXBlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBFbnRpdHkgVGhlIG5hbWUgb2YgdGhlIGVudGl0eSB0aGF0IGludm9sdmVzIHRoZSBmdW5jdGlvbgorICAvLy8gdHlwZSwgaWYga25vd24uCisgIC8vLworICAvLy8gXHBhcmFtIEVQSSBFeHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZnVuY3Rpb24gdHlwZS4gVXN1YWxseSB0aGlzIHdpbGwKKyAgLy8vIGJlIHRha2VuIGZyb20gYW4gZXhpc3RpbmcgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBwcm90b3R5cGUuCisgIC8vLworICAvLy8gXHJldHVybnMgQSBzdWl0YWJsZSBmdW5jdGlvbiB0eXBlLCBpZiB0aGVyZSBhcmUgbm8gZXJyb3JzLiBUaGUKKyAgLy8vIHVucXVhbGlmaWVkIHR5cGUgd2lsbCBhbHdheXMgYmUgYSBGdW5jdGlvblByb3RvVHlwZS4KKyAgLy8vIE90aGVyd2lzZSwgcmV0dXJucyBhIE5VTEwgdHlwZS4KKyAgUXVhbFR5cGUgQnVpbGRGdW5jdGlvblR5cGUoUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0YWJsZUFycmF5UmVmPFF1YWxUeXBlPiBQYXJhbVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsIERlY2xhcmF0aW9uTmFtZSBFbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlOjpFeHRQcm90b0luZm8gJkVQSSk7CisKKyAgUXVhbFR5cGUgQnVpbGRNZW1iZXJQb2ludGVyVHlwZShRdWFsVHlwZSBULCBRdWFsVHlwZSBDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lIEVudGl0eSk7CisgIFF1YWxUeXBlIEJ1aWxkQmxvY2tQb2ludGVyVHlwZShRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLCBEZWNsYXJhdGlvbk5hbWUgRW50aXR5KTsKKyAgUXVhbFR5cGUgQnVpbGRQYXJlblR5cGUoUXVhbFR5cGUgVCk7CisgIFF1YWxUeXBlIEJ1aWxkQXRvbWljVHlwZShRdWFsVHlwZSBULCBTb3VyY2VMb2NhdGlvbiBMb2MpOworICBRdWFsVHlwZSBCdWlsZFJlYWRQaXBlVHlwZShRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYyk7CisgIFF1YWxUeXBlIEJ1aWxkV3JpdGVQaXBlVHlwZShRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYyk7CisKKyAgVHlwZVNvdXJjZUluZm8gKkdldFR5cGVGb3JEZWNsYXJhdG9yKERlY2xhcmF0b3IgJkQsIFNjb3BlICpTKTsKKyAgVHlwZVNvdXJjZUluZm8gKkdldFR5cGVGb3JEZWNsYXJhdG9yQ2FzdChEZWNsYXJhdG9yICZELCBRdWFsVHlwZSBGcm9tVHkpOworICBUeXBlU291cmNlSW5mbyAqR2V0VHlwZVNvdXJjZUluZm9Gb3JEZWNsYXJhdG9yKERlY2xhcmF0b3IgJkQsIFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpSZXR1cm5UeXBlSW5mbyk7CisKKyAgLy8vIFxicmllZiBQYWNrYWdlIHRoZSBnaXZlbiB0eXBlIGFuZCBUU0kgaW50byBhIFBhcnNlZFR5cGUuCisgIFBhcnNlZFR5cGUgQ3JlYXRlUGFyc2VkVHlwZShRdWFsVHlwZSBULCBUeXBlU291cmNlSW5mbyAqVEluZm8pOworICBEZWNsYXJhdGlvbk5hbWVJbmZvIEdldE5hbWVGb3JEZWNsYXJhdG9yKERlY2xhcmF0b3IgJkQpOworICBEZWNsYXJhdGlvbk5hbWVJbmZvIEdldE5hbWVGcm9tVW5xdWFsaWZpZWRJZChjb25zdCBVbnF1YWxpZmllZElkICZOYW1lKTsKKyAgc3RhdGljIFF1YWxUeXBlIEdldFR5cGVGcm9tUGFyc2VyKFBhcnNlZFR5cGUgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqKlRJbmZvID0gbnVsbHB0cik7CisgIENhblRocm93UmVzdWx0IGNhblRocm93KGNvbnN0IEV4cHIgKkUpOworICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqUmVzb2x2ZUV4Y2VwdGlvblNwZWMoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZQVCk7CisgIHZvaWQgVXBkYXRlRXhjZXB0aW9uU3BlYyhGdW5jdGlvbkRlY2wgKkZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGU6OkV4Y2VwdGlvblNwZWNJbmZvICZFU0kpOworICBib29sIENoZWNrU3BlY2lmaWVkRXhjZXB0aW9uVHlwZShRdWFsVHlwZSAmVCwgU291cmNlUmFuZ2UgUmFuZ2UpOworICBib29sIENoZWNrRGlzdGFudEV4Y2VwdGlvblNwZWMoUXVhbFR5cGUgVCk7CisgIGJvb2wgQ2hlY2tFcXVpdmFsZW50RXhjZXB0aW9uU3BlYyhGdW5jdGlvbkRlY2wgKk9sZCwgRnVuY3Rpb25EZWNsICpOZXcpOworICBib29sIENoZWNrRXF1aXZhbGVudEV4Y2VwdGlvblNwZWMoCisgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqT2xkLCBTb3VyY2VMb2NhdGlvbiBPbGRMb2MsCisgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqTmV3LCBTb3VyY2VMb2NhdGlvbiBOZXdMb2MpOworICBib29sIENoZWNrRXF1aXZhbGVudEV4Y2VwdGlvblNwZWMoCisgICAgICBjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmRGlhZ0lELCBjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmIE5vdGVJRCwKKyAgICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpPbGQsIFNvdXJjZUxvY2F0aW9uIE9sZExvYywKKyAgICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpOZXcsIFNvdXJjZUxvY2F0aW9uIE5ld0xvYyk7CisgIGJvb2wgaGFuZGxlckNhbkNhdGNoKFF1YWxUeXBlIEhhbmRsZXJUeXBlLCBRdWFsVHlwZSBFeGNlcHRpb25UeXBlKTsKKyAgYm9vbCBDaGVja0V4Y2VwdGlvblNwZWNTdWJzZXQoY29uc3QgUGFydGlhbERpYWdub3N0aWMgJkRpYWdJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFydGlhbERpYWdub3N0aWMgJk5lc3RlZERpYWdJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFydGlhbERpYWdub3N0aWMgJk5vdGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlN1cGVyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdXBlckxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlN1YnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3ViTG9jKTsKKyAgYm9vbCBDaGVja1BhcmFtRXhjZXB0aW9uU3BlYyhjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmTmVzdGVkRGlhZ0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZOb3RlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUYXJnZXRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTb3VyY2VMb2MpOworCisgIFR5cGVSZXN1bHQgQWN0T25UeXBlTmFtZShTY29wZSAqUywgRGVjbGFyYXRvciAmRCk7CisKKyAgLy8vIFxicmllZiBUaGUgcGFyc2VyIGhhcyBwYXJzZWQgdGhlIGNvbnRleHQtc2Vuc2l0aXZlIHR5cGUgJ2luc3RhbmNldHlwZScKKyAgLy8vIGluIGFuIE9iamVjdGl2ZS1DIG1lc3NhZ2UgZGVjbGFyYXRpb24uIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KKyAgUGFyc2VkVHlwZSBBY3RPbk9iakNJbnN0YW5jZVR5cGUoU291cmNlTG9jYXRpb24gTG9jKTsKKworICAvLy8gXGJyaWVmIEFic3RyYWN0IGNsYXNzIHVzZWQgdG8gZGlhZ25vc2UgaW5jb21wbGV0ZSB0eXBlcy4KKyAgc3RydWN0IFR5cGVEaWFnbm9zZXIgeworICAgIFR5cGVEaWFnbm9zZXIoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGRpYWdub3NlKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCkgPSAwOworICAgIHZpcnR1YWwgflR5cGVEaWFnbm9zZXIoKSB7fQorICB9OworCisgIHN0YXRpYyBpbnQgZ2V0UHJpbnRhYmxlKGludCBJKSB7IHJldHVybiBJOyB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRQcmludGFibGUodW5zaWduZWQgSSkgeyByZXR1cm4gSTsgfQorICBzdGF0aWMgYm9vbCBnZXRQcmludGFibGUoYm9vbCBCKSB7IHJldHVybiBCOyB9CisgIHN0YXRpYyBjb25zdCBjaGFyICogZ2V0UHJpbnRhYmxlKGNvbnN0IGNoYXIgKlMpIHsgcmV0dXJuIFM7IH0KKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRQcmludGFibGUoU3RyaW5nUmVmIFMpIHsgcmV0dXJuIFM7IH0KKyAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRQcmludGFibGUoY29uc3Qgc3RkOjpzdHJpbmcgJlMpIHsgcmV0dXJuIFM7IH0KKyAgc3RhdGljIGNvbnN0IElkZW50aWZpZXJJbmZvICpnZXRQcmludGFibGUoY29uc3QgSWRlbnRpZmllckluZm8gKklJKSB7CisgICAgcmV0dXJuIElJOworICB9CisgIHN0YXRpYyBEZWNsYXJhdGlvbk5hbWUgZ2V0UHJpbnRhYmxlKERlY2xhcmF0aW9uTmFtZSBOKSB7IHJldHVybiBOOyB9CisgIHN0YXRpYyBRdWFsVHlwZSBnZXRQcmludGFibGUoUXVhbFR5cGUgVCkgeyByZXR1cm4gVDsgfQorICBzdGF0aWMgU291cmNlUmFuZ2UgZ2V0UHJpbnRhYmxlKFNvdXJjZVJhbmdlIFIpIHsgcmV0dXJuIFI7IH0KKyAgc3RhdGljIFNvdXJjZVJhbmdlIGdldFByaW50YWJsZShTb3VyY2VMb2NhdGlvbiBMKSB7IHJldHVybiBMOyB9CisgIHN0YXRpYyBTb3VyY2VSYW5nZSBnZXRQcmludGFibGUoY29uc3QgRXhwciAqRSkgeyByZXR1cm4gRS0+Z2V0U291cmNlUmFuZ2UoKTsgfQorICBzdGF0aWMgU291cmNlUmFuZ2UgZ2V0UHJpbnRhYmxlKFR5cGVMb2MgVEwpIHsgcmV0dXJuIFRMLmdldFNvdXJjZVJhbmdlKCk7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUcz4gY2xhc3MgQm91bmRUeXBlRGlhZ25vc2VyIDogcHVibGljIFR5cGVEaWFnbm9zZXIgeworICAgIHVuc2lnbmVkIERpYWdJRDsKKyAgICBzdGQ6OnR1cGxlPGNvbnN0IFRzICYuLi4+IEFyZ3M7CisKKyAgICB0ZW1wbGF0ZSA8c3RkOjpzaXplX3QuLi4gSXM+CisgICAgdm9pZCBlbWl0KGNvbnN0IFNlbWFEaWFnbm9zdGljQnVpbGRlciAmREIsCisgICAgICAgICAgICAgIGxsdm06OmluZGV4X3NlcXVlbmNlPElzLi4uPikgY29uc3QgeworICAgICAgLy8gQXBwbHkgYWxsIHR1cGxlIGVsZW1lbnRzIHRvIHRoZSBidWlsZGVyIGluIG9yZGVyLgorICAgICAgYm9vbCBEdW1teVtdID0ge2ZhbHNlLCAoREIgPDwgZ2V0UHJpbnRhYmxlKHN0ZDo6Z2V0PElzPihBcmdzKSkpLi4ufTsKKyAgICAgICh2b2lkKUR1bW15OworICAgIH0KKworICBwdWJsaWM6CisgICAgQm91bmRUeXBlRGlhZ25vc2VyKHVuc2lnbmVkIERpYWdJRCwgY29uc3QgVHMgJi4uLkFyZ3MpCisgICAgICAgIDogVHlwZURpYWdub3NlcigpLCBEaWFnSUQoRGlhZ0lEKSwgQXJncyhBcmdzLi4uKSB7CisgICAgICBhc3NlcnQoRGlhZ0lEICE9IDAgJiYgIm5vIGRpYWdub3N0aWMgZm9yIHR5cGUgZGlhZ25vc2VyIik7CisgICAgfQorCisgICAgdm9pZCBkaWFnbm9zZShTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQpIG92ZXJyaWRlIHsKKyAgICAgIGNvbnN0IFNlbWFEaWFnbm9zdGljQnVpbGRlciAmREIgPSBTLkRpYWcoTG9jLCBEaWFnSUQpOworICAgICAgZW1pdChEQiwgbGx2bTo6aW5kZXhfc2VxdWVuY2VfZm9yPFRzLi4uPigpKTsKKyAgICAgIERCIDw8IFQ7CisgICAgfQorICB9OworCitwcml2YXRlOgorICBib29sIFJlcXVpcmVDb21wbGV0ZVR5cGVJbXBsKFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlRGlhZ25vc2VyICpEaWFnbm9zZXIpOworCisgIHN0cnVjdCBNb2R1bGVTY29wZSB7CisgICAgY2xhbmc6Ok1vZHVsZSAqTW9kdWxlID0gbnVsbHB0cjsKKyAgICBib29sIE1vZHVsZUludGVyZmFjZSA9IGZhbHNlOworICAgIFZpc2libGVNb2R1bGVTZXQgT3V0ZXJWaXNpYmxlTW9kdWxlczsKKyAgfTsKKyAgLy8vIFRoZSBtb2R1bGVzIHdlJ3JlIGN1cnJlbnRseSBwYXJzaW5nLgorICBsbHZtOjpTbWFsbFZlY3RvcjxNb2R1bGVTY29wZSwgMTY+IE1vZHVsZVNjb3BlczsKKworICAvLy8gR2V0IHRoZSBtb2R1bGUgd2hvc2Ugc2NvcGUgd2UgYXJlIGN1cnJlbnRseSB3aXRoaW4uCisgIE1vZHVsZSAqZ2V0Q3VycmVudE1vZHVsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTW9kdWxlU2NvcGVzLmVtcHR5KCkgPyBudWxscHRyIDogTW9kdWxlU2NvcGVzLmJhY2soKS5Nb2R1bGU7CisgIH0KKworICBWaXNpYmxlTW9kdWxlU2V0IFZpc2libGVNb2R1bGVzOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgR2V0IHRoZSBtb2R1bGUgb3duaW5nIGFuIGVudGl0eS4KKyAgTW9kdWxlICpnZXRPd25pbmdNb2R1bGUoRGVjbCAqRW50aXR5KSB7IHJldHVybiBFbnRpdHktPmdldE93bmluZ01vZHVsZSgpOyB9CisKKyAgLy8vIFxicmllZiBNYWtlIGEgbWVyZ2VkIGRlZmluaXRpb24gb2YgYW4gZXhpc3RpbmcgaGlkZGVuIGRlZmluaXRpb24gXHAgTkQKKyAgLy8vIHZpc2libGUgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KKyAgdm9pZCBtYWtlTWVyZ2VkRGVmaW5pdGlvblZpc2libGUoTmFtZWREZWNsICpORCk7CisKKyAgYm9vbCBpc01vZHVsZVZpc2libGUoY29uc3QgTW9kdWxlICpNKSB7IHJldHVybiBWaXNpYmxlTW9kdWxlcy5pc1Zpc2libGUoTSk7IH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYSBkZWNsYXJhdGlvbiBpcyB2aXNpYmxlIHRvIG5hbWUgbG9va3VwLgorICBib29sIGlzVmlzaWJsZShjb25zdCBOYW1lZERlY2wgKkQpIHsKKyAgICByZXR1cm4gIUQtPmlzSGlkZGVuKCkgfHwgaXNWaXNpYmxlU2xvdyhEKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciBhbnkgZGVjbGFyYXRpb24gb2YgYW4gZW50aXR5IGlzIHZpc2libGUuCisgIGJvb2wKKyAgaGFzVmlzaWJsZURlY2xhcmF0aW9uKGNvbnN0IE5hbWVkRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxNb2R1bGUgKj4gKk1vZHVsZXMgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIGlzVmlzaWJsZShEKSB8fCBoYXNWaXNpYmxlRGVjbGFyYXRpb25TbG93KEQsIE1vZHVsZXMpOworICB9CisgIGJvb2wgaGFzVmlzaWJsZURlY2xhcmF0aW9uU2xvdyhjb25zdCBOYW1lZERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTbWFsbFZlY3RvckltcGw8TW9kdWxlICo+ICpNb2R1bGVzKTsKKworICBib29sIGhhc1Zpc2libGVNZXJnZWREZWZpbml0aW9uKE5hbWVkRGVjbCAqRGVmKTsKKyAgYm9vbCBoYXNNZXJnZWREZWZpbml0aW9uSW5DdXJyZW50TW9kdWxlKE5hbWVkRGVjbCAqRGVmKTsKKworICAvLy8gRGV0ZXJtaW5lIGlmIFxwIEQgYW5kIFxwIFN1Z2dlc3RlZCBoYXZlIGEgc3RydWN0dXJhbGx5IGNvbXBhdGlibGUKKyAgLy8vIGxheW91dCBhcyBkZXNjcmliZWQgaW4gQzExIDYuMi43LzEuCisgIGJvb2wgaGFzU3RydWN0dXJhbENvbXBhdExheW91dChEZWNsICpELCBEZWNsICpTdWdnZXN0ZWQpOworCisgIC8vLyBEZXRlcm1pbmUgaWYgXHAgRCBoYXMgYSB2aXNpYmxlIGRlZmluaXRpb24uIElmIG5vdCwgc3VnZ2VzdCBhIGRlY2xhcmF0aW9uCisgIC8vLyB0aGF0IHNob3VsZCBiZSBtYWRlIHZpc2libGUgdG8gZXhwb3NlIHRoZSBkZWZpbml0aW9uLgorICBib29sIGhhc1Zpc2libGVEZWZpbml0aW9uKE5hbWVkRGVjbCAqRCwgTmFtZWREZWNsICoqU3VnZ2VzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT25seU5lZWRDb21wbGV0ZSA9IGZhbHNlKTsKKyAgYm9vbCBoYXNWaXNpYmxlRGVmaW5pdGlvbihjb25zdCBOYW1lZERlY2wgKkQpIHsKKyAgICBOYW1lZERlY2wgKkhpZGRlbjsKKyAgICByZXR1cm4gaGFzVmlzaWJsZURlZmluaXRpb24oY29uc3RfY2FzdDxOYW1lZERlY2wqPihEKSwgJkhpZGRlbik7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXHAgRCBoYXMgYSB2aXNpYmxlIGRlZmF1bHQgYXJndW1lbnQuCisgIGJvb2wKKyAgaGFzVmlzaWJsZURlZmF1bHRBcmd1bWVudChjb25zdCBOYW1lZERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxWZWN0b3JJbXBsPE1vZHVsZSAqPiAqTW9kdWxlcyA9IG51bGxwdHIpOworCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSB2aXNpYmxlIGRlY2xhcmF0aW9uIG9mIFxwIEQgdGhhdCBpcyBhbiBleHBsaWNpdAorICAvLy8gc3BlY2lhbGl6YXRpb24gZGVjbGFyYXRpb24gZm9yIGEgc3BlY2lhbGl6YXRpb24gb2YgYSB0ZW1wbGF0ZS4gKEZvciBhCisgIC8vLyBtZW1iZXIgc3BlY2lhbGl6YXRpb24sIHVzZSBoYXNWaXNpYmxlTWVtYmVyU3BlY2lhbGl6YXRpb24uKQorICBib29sIGhhc1Zpc2libGVFeHBsaWNpdFNwZWNpYWxpemF0aW9uKAorICAgICAgY29uc3QgTmFtZWREZWNsICpELCBsbHZtOjpTbWFsbFZlY3RvckltcGw8TW9kdWxlICo+ICpNb2R1bGVzID0gbnVsbHB0cik7CisKKyAgLy8vIERldGVybWluZSBpZiB0aGVyZSBpcyBhIHZpc2libGUgZGVjbGFyYXRpb24gb2YgXHAgRCB0aGF0IGlzIGEgbWVtYmVyCisgIC8vLyBzcGVjaWFsaXphdGlvbiBkZWNsYXJhdGlvbiAoYXMgb3Bwb3NlZCB0byBhbiBpbnN0YW50aWF0ZWQgZGVjbGFyYXRpb24pLgorICBib29sIGhhc1Zpc2libGVNZW1iZXJTcGVjaWFsaXphdGlvbigKKyAgICAgIGNvbnN0IE5hbWVkRGVjbCAqRCwgbGx2bTo6U21hbGxWZWN0b3JJbXBsPE1vZHVsZSAqPiAqTW9kdWxlcyA9IG51bGxwdHIpOworCisgIC8vLyBEZXRlcm1pbmUgaWYgXHAgQSBhbmQgXHAgQiBhcmUgZXF1aXZhbGVudCBpbnRlcm5hbCBsaW5rYWdlIGRlY2xhcmF0aW9ucworICAvLy8gZnJvbSBkaWZmZXJlbnQgbW9kdWxlcywgYW5kIHRodXMgYW4gYW1iaWd1aXR5IGVycm9yIGNhbiBiZSBkb3duZ3JhZGVkIHRvCisgIC8vLyBhbiBleHRlbnNpb24gd2FybmluZy4KKyAgYm9vbCBpc0VxdWl2YWxlbnRJbnRlcm5hbExpbmthZ2VEZWNsYXJhdGlvbihjb25zdCBOYW1lZERlY2wgKkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZWREZWNsICpCKTsKKyAgdm9pZCBkaWFnbm9zZUVxdWl2YWxlbnRJbnRlcm5hbExpbmthZ2VEZWNsYXJhdGlvbnMoCisgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IE5hbWVkRGVjbCAqRCwKKyAgICAgIEFycmF5UmVmPGNvbnN0IE5hbWVkRGVjbCAqPiBFcXVpdik7CisKKyAgYm9vbCBpc0NvbXBsZXRlVHlwZShTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQpIHsKKyAgICByZXR1cm4gIVJlcXVpcmVDb21wbGV0ZVR5cGVJbXBsKExvYywgVCwgbnVsbHB0cik7CisgIH0KKyAgYm9vbCBSZXF1aXJlQ29tcGxldGVUeXBlKFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVEaWFnbm9zZXIgJkRpYWdub3Nlcik7CisgIGJvb2wgUmVxdWlyZUNvbXBsZXRlVHlwZShTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEaWFnSUQpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUcz4KKyAgYm9vbCBSZXF1aXJlQ29tcGxldGVUeXBlKFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCwgdW5zaWduZWQgRGlhZ0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHMgJi4uLkFyZ3MpIHsKKyAgICBCb3VuZFR5cGVEaWFnbm9zZXI8VHMuLi4+IERpYWdub3NlcihEaWFnSUQsIEFyZ3MuLi4pOworICAgIHJldHVybiBSZXF1aXJlQ29tcGxldGVUeXBlKExvYywgVCwgRGlhZ25vc2VyKTsKKyAgfQorCisgIHZvaWQgY29tcGxldGVFeHByQXJyYXlCb3VuZChFeHByICpFKTsKKyAgYm9vbCBSZXF1aXJlQ29tcGxldGVFeHByVHlwZShFeHByICpFLCBUeXBlRGlhZ25vc2VyICZEaWFnbm9zZXIpOworICBib29sIFJlcXVpcmVDb21wbGV0ZUV4cHJUeXBlKEV4cHIgKkUsIHVuc2lnbmVkIERpYWdJRCk7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFRzPgorICBib29sIFJlcXVpcmVDb21wbGV0ZUV4cHJUeXBlKEV4cHIgKkUsIHVuc2lnbmVkIERpYWdJRCwgY29uc3QgVHMgJi4uLkFyZ3MpIHsKKyAgICBCb3VuZFR5cGVEaWFnbm9zZXI8VHMuLi4+IERpYWdub3NlcihEaWFnSUQsIEFyZ3MuLi4pOworICAgIHJldHVybiBSZXF1aXJlQ29tcGxldGVFeHByVHlwZShFLCBEaWFnbm9zZXIpOworICB9CisKKyAgYm9vbCBSZXF1aXJlTGl0ZXJhbFR5cGUoU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlRGlhZ25vc2VyICZEaWFnbm9zZXIpOworICBib29sIFJlcXVpcmVMaXRlcmFsVHlwZShTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQsIHVuc2lnbmVkIERpYWdJRCk7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFRzPgorICBib29sIFJlcXVpcmVMaXRlcmFsVHlwZShTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQsIHVuc2lnbmVkIERpYWdJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHMgJi4uLkFyZ3MpIHsKKyAgICBCb3VuZFR5cGVEaWFnbm9zZXI8VHMuLi4+IERpYWdub3NlcihEaWFnSUQsIEFyZ3MuLi4pOworICAgIHJldHVybiBSZXF1aXJlTGl0ZXJhbFR5cGUoTG9jLCBULCBEaWFnbm9zZXIpOworICB9CisKKyAgUXVhbFR5cGUgZ2V0RWxhYm9yYXRlZFR5cGUoRWxhYm9yYXRlZFR5cGVLZXl3b3JkIEtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFNjb3BlU3BlYyAmU1MsIFF1YWxUeXBlIFQpOworCisgIFF1YWxUeXBlIEJ1aWxkVHlwZW9mRXhwclR5cGUoRXhwciAqRSwgU291cmNlTG9jYXRpb24gTG9jKTsKKyAgLy8vIElmIEFzVW5ldmFsdWF0ZWQgaXMgZmFsc2UsIEUgaXMgdHJlYXRlZCBhcyB0aG91Z2ggaXQgd2VyZSBhbiBldmFsdWF0ZWQKKyAgLy8vIGNvbnRleHQsIHN1Y2ggYXMgd2hlbiBidWlsZGluZyBhIHR5cGUgZm9yIGRlY2x0eXBlKGF1dG8pLgorICBRdWFsVHlwZSBCdWlsZERlY2x0eXBlVHlwZShFeHByICpFLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQXNVbmV2YWx1YXRlZCA9IHRydWUpOworICBRdWFsVHlwZSBCdWlsZFVuYXJ5VHJhbnNmb3JtVHlwZShRdWFsVHlwZSBCYXNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5hcnlUcmFuc2Zvcm1UeXBlOjpVVFRLaW5kIFVLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBTeW1ib2wgdGFibGUgLyBEZWNsIHRyYWNraW5nIGNhbGxiYWNrczogU2VtYURlY2wuY3BwLgorICAvLworCisgIHN0cnVjdCBTa2lwQm9keUluZm8geworICAgIFNraXBCb2R5SW5mbygpCisgICAgICAgIDogU2hvdWxkU2tpcChmYWxzZSksIENoZWNrU2FtZUFzUHJldmlvdXMoZmFsc2UpLCBQcmV2aW91cyhudWxscHRyKSwKKyAgICAgICAgICBOZXcobnVsbHB0cikge30KKyAgICBib29sIFNob3VsZFNraXA7CisgICAgYm9vbCBDaGVja1NhbWVBc1ByZXZpb3VzOworICAgIE5hbWVkRGVjbCAqUHJldmlvdXM7CisgICAgTmFtZWREZWNsICpOZXc7CisgIH07CisKKyAgRGVjbEdyb3VwUHRyVHkgQ29udmVydERlY2xUb0RlY2xHcm91cChEZWNsICpQdHIsIERlY2wgKk93bmVkVHlwZSA9IG51bGxwdHIpOworCisgIHZvaWQgRGlhZ25vc2VVc2VPZlVuaW1wbGVtZW50ZWRTZWxlY3RvcnMoKTsKKworICBib29sIGlzU2ltcGxlVHlwZVNwZWNpZmllcih0b2s6OlRva2VuS2luZCBLaW5kKSBjb25zdDsKKworICBQYXJzZWRUeXBlIGdldFR5cGVOYW1lKGNvbnN0IElkZW50aWZpZXJJbmZvICZJSSwgU291cmNlTG9jYXRpb24gTmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTY29wZSAqUywgQ1hYU2NvcGVTcGVjICpTUyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0NsYXNzTmFtZSA9IGZhbHNlLCBib29sIEhhc1RyYWlsaW5nRG90ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSBPYmplY3RUeXBlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQ3Rvck9yRHRvck5hbWUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFdhbnROb250cml2aWFsVHlwZVNvdXJjZUluZm8gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQ2xhc3NUZW1wbGF0ZURlZHVjdGlvbkNvbnRleHQgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICoqQ29ycmVjdGVkSUkgPSBudWxscHRyKTsKKyAgVHlwZVNwZWNpZmllclR5cGUgaXNUYWdOYW1lKElkZW50aWZpZXJJbmZvICZJSSwgU2NvcGUgKlMpOworICBib29sIGlzTWljcm9zb2Z0TWlzc2luZ1R5cGVuYW1lKGNvbnN0IENYWFNjb3BlU3BlYyAqU1MsIFNjb3BlICpTKTsKKyAgdm9pZCBEaWFnbm9zZVVua25vd25UeXBlTmFtZShJZGVudGlmaWVySW5mbyAqJklJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElJTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAqU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSAmU3VnZ2VzdGVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzVGVtcGxhdGVOYW1lID0gZmFsc2UpOworCisgIC8vLyBBdHRlbXB0IHRvIGJlaGF2ZSBsaWtlIE1TVkMgaW4gc2l0dWF0aW9ucyB3aGVyZSBsb29rdXAgb2YgYW4gdW5xdWFsaWZpZWQKKyAgLy8vIHR5cGUgbmFtZSBoYXMgZmFpbGVkIGluIGEgZGVwZW5kZW50IGNvbnRleHQuIEluIHRoZXNlIHNpdHVhdGlvbnMsIHdlCisgIC8vLyBhdXRvbWF0aWNhbGx5IGZvcm0gYSBEZXBlbmRlbnRUeXBlTmFtZSB0aGF0IHdpbGwgcmV0cnkgbG9va3VwIGluIGEgcmVsYXRlZAorICAvLy8gc2NvcGUgZHVyaW5nIGluc3RhbnRpYXRpb24uCisgIFBhcnNlZFR5cGUgQWN0T25NU1ZDVW5rbm93blR5cGVOYW1lKGNvbnN0IElkZW50aWZpZXJJbmZvICZJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1RlbXBsYXRlVHlwZUFyZyk7CisKKyAgLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIHJlc3VsdCBvZiB0aGUgbmFtZSBsb29rdXAgYW5kIHJlc29sdXRpb24gcGVyZm9ybWVkCisgIC8vLyBieSBcYyBDbGFzc2lmeU5hbWUoKS4KKyAgZW51bSBOYW1lQ2xhc3NpZmljYXRpb25LaW5kIHsKKyAgICBOQ19Vbmtub3duLAorICAgIE5DX0Vycm9yLAorICAgIE5DX0tleXdvcmQsCisgICAgTkNfVHlwZSwKKyAgICBOQ19FeHByZXNzaW9uLAorICAgIE5DX05lc3RlZE5hbWVTcGVjaWZpZXIsCisgICAgTkNfVHlwZVRlbXBsYXRlLAorICAgIE5DX1ZhclRlbXBsYXRlLAorICAgIE5DX0Z1bmN0aW9uVGVtcGxhdGUKKyAgfTsKKworICBjbGFzcyBOYW1lQ2xhc3NpZmljYXRpb24geworICAgIE5hbWVDbGFzc2lmaWNhdGlvbktpbmQgS2luZDsKKyAgICBFeHByUmVzdWx0IEV4cHI7CisgICAgVGVtcGxhdGVOYW1lIFRlbXBsYXRlOworICAgIFBhcnNlZFR5cGUgVHlwZTsKKworICAgIGV4cGxpY2l0IE5hbWVDbGFzc2lmaWNhdGlvbihOYW1lQ2xhc3NpZmljYXRpb25LaW5kIEtpbmQpIDogS2luZChLaW5kKSB7fQorCisgIHB1YmxpYzoKKyAgICBOYW1lQ2xhc3NpZmljYXRpb24oRXhwclJlc3VsdCBFeHByKSA6IEtpbmQoTkNfRXhwcmVzc2lvbiksIEV4cHIoRXhwcikge30KKworICAgIE5hbWVDbGFzc2lmaWNhdGlvbihQYXJzZWRUeXBlIFR5cGUpIDogS2luZChOQ19UeXBlKSwgVHlwZShUeXBlKSB7fQorCisgICAgTmFtZUNsYXNzaWZpY2F0aW9uKGNvbnN0IElkZW50aWZpZXJJbmZvICpLZXl3b3JkKSA6IEtpbmQoTkNfS2V5d29yZCkge30KKworICAgIHN0YXRpYyBOYW1lQ2xhc3NpZmljYXRpb24gRXJyb3IoKSB7CisgICAgICByZXR1cm4gTmFtZUNsYXNzaWZpY2F0aW9uKE5DX0Vycm9yKTsKKyAgICB9CisKKyAgICBzdGF0aWMgTmFtZUNsYXNzaWZpY2F0aW9uIFVua25vd24oKSB7CisgICAgICByZXR1cm4gTmFtZUNsYXNzaWZpY2F0aW9uKE5DX1Vua25vd24pOworICAgIH0KKworICAgIHN0YXRpYyBOYW1lQ2xhc3NpZmljYXRpb24gTmVzdGVkTmFtZVNwZWNpZmllcigpIHsKKyAgICAgIHJldHVybiBOYW1lQ2xhc3NpZmljYXRpb24oTkNfTmVzdGVkTmFtZVNwZWNpZmllcik7CisgICAgfQorCisgICAgc3RhdGljIE5hbWVDbGFzc2lmaWNhdGlvbiBUeXBlVGVtcGxhdGUoVGVtcGxhdGVOYW1lIE5hbWUpIHsKKyAgICAgIE5hbWVDbGFzc2lmaWNhdGlvbiBSZXN1bHQoTkNfVHlwZVRlbXBsYXRlKTsKKyAgICAgIFJlc3VsdC5UZW1wbGF0ZSA9IE5hbWU7CisgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBOYW1lQ2xhc3NpZmljYXRpb24gVmFyVGVtcGxhdGUoVGVtcGxhdGVOYW1lIE5hbWUpIHsKKyAgICAgIE5hbWVDbGFzc2lmaWNhdGlvbiBSZXN1bHQoTkNfVmFyVGVtcGxhdGUpOworICAgICAgUmVzdWx0LlRlbXBsYXRlID0gTmFtZTsKKyAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIE5hbWVDbGFzc2lmaWNhdGlvbiBGdW5jdGlvblRlbXBsYXRlKFRlbXBsYXRlTmFtZSBOYW1lKSB7CisgICAgICBOYW1lQ2xhc3NpZmljYXRpb24gUmVzdWx0KE5DX0Z1bmN0aW9uVGVtcGxhdGUpOworICAgICAgUmVzdWx0LlRlbXBsYXRlID0gTmFtZTsKKyAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorCisgICAgTmFtZUNsYXNzaWZpY2F0aW9uS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorCisgICAgUGFyc2VkVHlwZSBnZXRUeXBlKCkgY29uc3QgeworICAgICAgYXNzZXJ0KEtpbmQgPT0gTkNfVHlwZSk7CisgICAgICByZXR1cm4gVHlwZTsKKyAgICB9CisKKyAgICBFeHByUmVzdWx0IGdldEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICBhc3NlcnQoS2luZCA9PSBOQ19FeHByZXNzaW9uKTsKKyAgICAgIHJldHVybiBFeHByOworICAgIH0KKworICAgIFRlbXBsYXRlTmFtZSBnZXRUZW1wbGF0ZU5hbWUoKSBjb25zdCB7CisgICAgICBhc3NlcnQoS2luZCA9PSBOQ19UeXBlVGVtcGxhdGUgfHwgS2luZCA9PSBOQ19GdW5jdGlvblRlbXBsYXRlIHx8CisgICAgICAgICAgICAgS2luZCA9PSBOQ19WYXJUZW1wbGF0ZSk7CisgICAgICByZXR1cm4gVGVtcGxhdGU7CisgICAgfQorCisgICAgVGVtcGxhdGVOYW1lS2luZCBnZXRUZW1wbGF0ZU5hbWVLaW5kKCkgY29uc3QgeworICAgICAgc3dpdGNoIChLaW5kKSB7CisgICAgICBjYXNlIE5DX1R5cGVUZW1wbGF0ZToKKyAgICAgICAgcmV0dXJuIFROS19UeXBlX3RlbXBsYXRlOworICAgICAgY2FzZSBOQ19GdW5jdGlvblRlbXBsYXRlOgorICAgICAgICByZXR1cm4gVE5LX0Z1bmN0aW9uX3RlbXBsYXRlOworICAgICAgY2FzZSBOQ19WYXJUZW1wbGF0ZToKKyAgICAgICAgcmV0dXJuIFROS19WYXJfdGVtcGxhdGU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJ1bnN1cHBvcnRlZCBuYW1lIGNsYXNzaWZpY2F0aW9uLiIpOworICAgICAgfQorICAgIH0KKyAgfTsKKworICAvLy8gXGJyaWVmIFBlcmZvcm0gbmFtZSBsb29rdXAgb24gdGhlIGdpdmVuIG5hbWUsIGNsYXNzaWZ5aW5nIGl0IGJhc2VkIG9uCisgIC8vLyB0aGUgcmVzdWx0cyBvZiBuYW1lIGxvb2t1cCBhbmQgdGhlIGZvbGxvd2luZyB0b2tlbi4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgaXMgdXNlZCBieSB0aGUgcGFyc2VyIHRvIHJlc29sdmUgaWRlbnRpZmllcnMgYW5kIGhlbHAgZGlyZWN0CisgIC8vLyBwYXJzaW5nLiBXaGVuIHRoZSBpZGVudGlmaWVyIGNhbm5vdCBiZSBmb3VuZCwgdGhpcyByb3V0aW5lIHdpbGwgYXR0ZW1wdAorICAvLy8gdG8gY29ycmVjdCB0aGUgdHlwbyBhbmQgY2xhc3NpZnkgYmFzZWQgb24gdGhlIHJlc3VsdGluZyBuYW1lLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTIFRoZSBzY29wZSBpbiB3aGljaCB3ZSdyZSBwZXJmb3JtaW5nIG5hbWUgbG9va3VwLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTUyBUaGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHRoYXQgcHJlY2VkZXMgdGhlIG5hbWUuCisgIC8vLworICAvLy8gXHBhcmFtIE5hbWUgVGhlIGlkZW50aWZpZXIuIElmIHR5cG8gY29ycmVjdGlvbiBmaW5kcyBhbiBhbHRlcm5hdGl2ZSBuYW1lLAorICAvLy8gdGhpcyBwb2ludGVyIHBhcmFtZXRlciB3aWxsIGJlIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCisgIC8vLworICAvLy8gXHBhcmFtIE5hbWVMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBpZGVudGlmaWVyLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOZXh0VG9rZW4gVGhlIHRva2VuIGZvbGxvd2luZyB0aGUgaWRlbnRpZmllci4gVXNlZCB0byBoZWxwCisgIC8vLyBkaXNhbWJpZ3VhdGUgdGhlIG5hbWUuCisgIC8vLworICAvLy8gXHBhcmFtIElzQWRkcmVzc09mT3BlcmFuZCBUcnVlIGlmIHRoaXMgbmFtZSBpcyB0aGUgb3BlcmFuZCBvZiBhIHVuYXJ5CisgIC8vLyAgICAgICAgYWRkcmVzcyBvZiAoJyYnKSBleHByZXNzaW9uLCBhc3N1bWluZyBpdCBpcyBjbGFzc2lmaWVkIGFzIGFuCisgIC8vLyAgICAgICAgZXhwcmVzc2lvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ0NDIFRoZSBjb3JyZWN0aW9uIGNhbGxiYWNrLCBpZiB0eXBvIGNvcnJlY3Rpb24gaXMgZGVzaXJlZC4KKyAgTmFtZUNsYXNzaWZpY2F0aW9uCisgIENsYXNzaWZ5TmFtZShTY29wZSAqUywgQ1hYU2NvcGVTcGVjICZTUywgSWRlbnRpZmllckluZm8gKiZOYW1lLAorICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTmFtZUxvYywgY29uc3QgVG9rZW4gJk5leHRUb2tlbiwKKyAgICAgICAgICAgICAgIGJvb2wgSXNBZGRyZXNzT2ZPcGVyYW5kLAorICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENvcnJlY3Rpb25DYW5kaWRhdGVDYWxsYmFjaz4gQ0NDID0gbnVsbHB0cik7CisKKyAgLy8vIERlc2NyaWJlcyB0aGUgZGV0YWlsZWQga2luZCBvZiBhIHRlbXBsYXRlIG5hbWUuIFVzZWQgaW4gZGlhZ25vc3RpY3MuCisgIGVudW0gY2xhc3MgVGVtcGxhdGVOYW1lS2luZEZvckRpYWdub3N0aWNzIHsKKyAgICBDbGFzc1RlbXBsYXRlLAorICAgIEZ1bmN0aW9uVGVtcGxhdGUsCisgICAgVmFyVGVtcGxhdGUsCisgICAgQWxpYXNUZW1wbGF0ZSwKKyAgICBUZW1wbGF0ZVRlbXBsYXRlUGFyYW0sCisgICAgRGVwZW5kZW50VGVtcGxhdGUKKyAgfTsKKyAgVGVtcGxhdGVOYW1lS2luZEZvckRpYWdub3N0aWNzCisgIGdldFRlbXBsYXRlTmFtZUtpbmRGb3JEaWFnbm9zdGljcyhUZW1wbGF0ZU5hbWUgTmFtZSk7CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIGl0J3MgcGxhdXNpYmxlIHRoYXQgRSB3YXMgaW50ZW5kZWQgdG8gYmUgYQorICAvLy8gdGVtcGxhdGUtbmFtZS4KKyAgYm9vbCBtaWdodEJlSW50ZW5kZWRUb0JlVGVtcGxhdGVOYW1lKEV4cHJSZXN1bHQgRSkgeworICAgIGlmICghZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMgfHwgRS5pc0ludmFsaWQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoYXV0byAqRFJFID0gZHluX2Nhc3Q8RGVjbFJlZkV4cHI+KEUuZ2V0KCkpKQorICAgICAgcmV0dXJuICFEUkUtPmhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzKCk7CisgICAgaWYgKGF1dG8gKk1FID0gZHluX2Nhc3Q8TWVtYmVyRXhwcj4oRS5nZXQoKSkpCisgICAgICByZXR1cm4gIU1FLT5oYXNFeHBsaWNpdFRlbXBsYXRlQXJncygpOworICAgIC8vIEFueSBhZGRpdGlvbmFsIGNhc2VzIHJlY29nbml6ZWQgaGVyZSBzaG91bGQgYWxzbyBiZSBoYW5kbGVkIGJ5CisgICAgLy8gZGlhZ25vc2VFeHBySW50ZW5kZWRBc1RlbXBsYXRlTmFtZS4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdm9pZCBkaWFnbm9zZUV4cHJJbnRlbmRlZEFzVGVtcGxhdGVOYW1lKFNjb3BlICpTLCBFeHByUmVzdWx0IFRlbXBsYXRlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBHcmVhdGVyKTsKKworICBEZWNsICpBY3RPbkRlY2xhcmF0b3IoU2NvcGUgKlMsIERlY2xhcmF0b3IgJkQpOworCisgIE5hbWVkRGVjbCAqSGFuZGxlRGVjbGFyYXRvcihTY29wZSAqUywgRGVjbGFyYXRvciAmRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpVGVtcGxhdGVQYXJhbXNBcmcgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0cyk7CisgIHZvaWQgUmVnaXN0ZXJMb2NhbGx5U2NvcGVkRXh0ZXJuQ0RlY2woTmFtZWREZWNsICpORCwgU2NvcGUgKlMpOworICBib29sIERpYWdub3NlQ2xhc3NOYW1lU2hhZG93KERlY2xDb250ZXh0ICpEQywgRGVjbGFyYXRpb25OYW1lSW5mbyBJbmZvKTsKKyAgYm9vbCBkaWFnbm9zZVF1YWxpZmllZERlY2xhcmF0aW9uKENYWFNjb3BlU3BlYyAmU1MsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBOYW1lLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzVGVtcGxhdGVJZCk7CisgIHZvaWQKKyAgZGlhZ25vc2VJZ25vcmVkUXVhbGlmaWVycyh1bnNpZ25lZCBEaWFnSUQsIHVuc2lnbmVkIFF1YWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEZhbGxiYWNrTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENvbnN0UXVhbExvYyA9IFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVm9sYXRpbGVRdWFsTG9jID0gU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSZXN0cmljdFF1YWxMb2MgPSBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEF0b21pY1F1YWxMb2MgPSBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFVuYWxpZ25lZFF1YWxMb2MgPSBTb3VyY2VMb2NhdGlvbigpKTsKKworICBzdGF0aWMgYm9vbCBhZGp1c3RDb250ZXh0Rm9yTG9jYWxFeHRlcm5EZWNsKERlY2xDb250ZXh0IComREMpOworICB2b2lkIERpYWdub3NlRnVuY3Rpb25TcGVjaWZpZXJzKGNvbnN0IERlY2xTcGVjICZEUyk7CisgIE5hbWVkRGVjbCAqZ2V0U2hhZG93ZWREZWNsYXJhdGlvbihjb25zdCBUeXBlZGVmTmFtZURlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29rdXBSZXN1bHQgJlIpOworICBOYW1lZERlY2wgKmdldFNoYWRvd2VkRGVjbGFyYXRpb24oY29uc3QgVmFyRGVjbCAqRCwgY29uc3QgTG9va3VwUmVzdWx0ICZSKTsKKyAgdm9pZCBDaGVja1NoYWRvdyhOYW1lZERlY2wgKkQsIE5hbWVkRGVjbCAqU2hhZG93ZWREZWNsLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb2t1cFJlc3VsdCAmUik7CisgIHZvaWQgQ2hlY2tTaGFkb3coU2NvcGUgKlMsIFZhckRlY2wgKkQpOworCisgIC8vLyBXYXJuIGlmICdFJywgd2hpY2ggaXMgYW4gZXhwcmVzc2lvbiB0aGF0IGlzIGFib3V0IHRvIGJlIG1vZGlmaWVkLCByZWZlcnMKKyAgLy8vIHRvIGEgc2hhZG93aW5nIGRlY2xhcmF0aW9uLgorICB2b2lkIENoZWNrU2hhZG93aW5nRGVjbE1vZGlmaWNhdGlvbihFeHByICpFLCBTb3VyY2VMb2NhdGlvbiBMb2MpOworCisgIHZvaWQgRGlhZ25vc2VTaGFkb3dpbmdMYW1iZGFEZWNscyhjb25zdCBzZW1hOjpMYW1iZGFTY29wZUluZm8gKkxTSSk7CisKK3ByaXZhdGU6CisgIC8vLyBNYXAgb2YgY3VycmVudCBzaGFkb3dpbmcgZGVjbGFyYXRpb25zIHRvIHNoYWRvd2VkIGRlY2xhcmF0aW9ucy4gV2FybiBpZgorICAvLy8gaXQgbG9va3MgbGlrZSB0aGUgdXNlciBpcyB0cnlpbmcgdG8gbW9kaWZ5IHRoZSBzaGFkb3dpbmcgZGVjbGFyYXRpb24uCisgIGxsdm06OkRlbnNlTWFwPGNvbnN0IE5hbWVkRGVjbCAqLCBjb25zdCBOYW1lZERlY2wgKj4gU2hhZG93aW5nRGVjbHM7CisKK3B1YmxpYzoKKyAgdm9pZCBDaGVja0Nhc3RBbGlnbihFeHByICpPcCwgUXVhbFR5cGUgVCwgU291cmNlUmFuZ2UgVFJhbmdlKTsKKyAgdm9pZCBoYW5kbGVUYWdOdW1iZXJpbmcoY29uc3QgVGFnRGVjbCAqVGFnLCBTY29wZSAqVGFnU2NvcGUpOworICB2b2lkIHNldFRhZ05hbWVGb3JMaW5rYWdlUHVycG9zZXMoVGFnRGVjbCAqVGFnRnJvbURlY2xTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZWRlZk5hbWVEZWNsICpOZXdURCk7CisgIHZvaWQgQ2hlY2tUeXBlZGVmRm9yVmFyaWFibHlNb2RpZmllZFR5cGUoU2NvcGUgKlMsIFR5cGVkZWZOYW1lRGVjbCAqRCk7CisgIE5hbWVkRGVjbCogQWN0T25UeXBlZGVmRGVjbGFyYXRvcihTY29wZSogUywgRGVjbGFyYXRvciYgRCwgRGVjbENvbnRleHQqIERDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKlRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9va3VwUmVzdWx0ICZQcmV2aW91cyk7CisgIE5hbWVkRGVjbCogQWN0T25UeXBlZGVmTmFtZURlY2woU2NvcGUqIFMsIERlY2xDb250ZXh0KiBEQywgVHlwZWRlZk5hbWVEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb2t1cFJlc3VsdCAmUHJldmlvdXMsIGJvb2wgJlJlZGVjbGFyYXRpb24pOworICBOYW1lZERlY2wgKkFjdE9uVmFyaWFibGVEZWNsYXJhdG9yKFNjb3BlICpTLCBEZWNsYXJhdG9yICZELCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKlRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb2t1cFJlc3VsdCAmUHJldmlvdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlUZW1wbGF0ZVBhcmFtc0FyZyBUZW1wbGF0ZVBhcmFtTGlzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmQWRkVG9TY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxCaW5kaW5nRGVjbCAqPiBCaW5kaW5ncyA9IE5vbmUpOworICBOYW1lZERlY2wgKgorICBBY3RPbkRlY29tcG9zaXRpb25EZWNsYXJhdG9yKFNjb3BlICpTLCBEZWNsYXJhdG9yICZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpVGVtcGxhdGVQYXJhbXNBcmcgVGVtcGxhdGVQYXJhbUxpc3RzKTsKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBpcyBhIHJlZGVjbGFyYXRpb24KKyAgYm9vbCBDaGVja1ZhcmlhYmxlRGVjbGFyYXRpb24oVmFyRGVjbCAqTmV3VkQsIExvb2t1cFJlc3VsdCAmUHJldmlvdXMpOworICB2b2lkIENoZWNrVmFyaWFibGVEZWNsYXJhdGlvblR5cGUoVmFyRGVjbCAqTmV3VkQpOworICBib29sIERlZHVjZVZhcmlhYmxlRGVjbGFyYXRpb25UeXBlKFZhckRlY2wgKlZEZWNsLCBib29sIERpcmVjdEluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqSW5pdCk7CisgIHZvaWQgQ2hlY2tDb21wbGV0ZVZhcmlhYmxlRGVjbGFyYXRpb24oVmFyRGVjbCAqVkQpOworICB2b2lkIENoZWNrQ29tcGxldGVEZWNvbXBvc2l0aW9uRGVjbGFyYXRpb24oRGVjb21wb3NpdGlvbkRlY2wgKkREKTsKKyAgdm9pZCBNYXliZVN1Z2dlc3RBZGRpbmdTdGF0aWNUb0RlY2woY29uc3QgRnVuY3Rpb25EZWNsICpEKTsKKworICBOYW1lZERlY2wqIEFjdE9uRnVuY3Rpb25EZWNsYXJhdG9yKFNjb3BlKiBTLCBEZWNsYXJhdG9yJiBELCBEZWNsQ29udGV4dCogREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKlRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb2t1cFJlc3VsdCAmUHJldmlvdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlUZW1wbGF0ZVBhcmFtc0FyZyBUZW1wbGF0ZVBhcmFtTGlzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmQWRkVG9TY29wZSk7CisgIGJvb2wgQWRkT3ZlcnJpZGRlbk1ldGhvZHMoQ1hYUmVjb3JkRGVjbCAqREMsIENYWE1ldGhvZERlY2wgKk1EKTsKKworICBib29sIENoZWNrQ29uc3RleHByRnVuY3Rpb25EZWNsKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQpOworICBib29sIENoZWNrQ29uc3RleHByRnVuY3Rpb25Cb2R5KGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQsIFN0bXQgKkJvZHkpOworCisgIHZvaWQgRGlhZ25vc2VIaWRkZW5WaXJ0dWFsTWV0aG9kcyhDWFhNZXRob2REZWNsICpNRCk7CisgIHZvaWQgRmluZEhpZGRlblZpcnR1YWxNZXRob2RzKENYWE1ldGhvZERlY2wgKk1ELAorICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q1hYTWV0aG9kRGVjbCo+ICZPdmVybG9hZGVkTWV0aG9kcyk7CisgIHZvaWQgTm90ZUhpZGRlblZpcnR1YWxNZXRob2RzKENYWE1ldGhvZERlY2wgKk1ELAorICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q1hYTWV0aG9kRGVjbCo+ICZPdmVybG9hZGVkTWV0aG9kcyk7CisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gaXMgYSByZWRlY2xhcmF0aW9uCisgIGJvb2wgQ2hlY2tGdW5jdGlvbkRlY2xhcmF0aW9uKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkRlY2wgKk5ld0ZELCBMb29rdXBSZXN1bHQgJlByZXZpb3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzTWVtYmVyU3BlY2lhbGl6YXRpb24pOworICBib29sIHNob3VsZExpbmtEZXBlbmRlbnREZWNsV2l0aFByZXZpb3VzKERlY2wgKkQsIERlY2wgKk9sZERlY2wpOworICB2b2lkIENoZWNrTWFpbihGdW5jdGlvbkRlY2wgKkZELCBjb25zdCBEZWNsU3BlYyAmRCk7CisgIHZvaWQgQ2hlY2tNU1ZDUlRFbnRyeVBvaW50KEZ1bmN0aW9uRGVjbCAqRkQpOworICBEZWNsICpBY3RPblBhcmFtRGVjbGFyYXRvcihTY29wZSAqUywgRGVjbGFyYXRvciAmRCk7CisgIFBhcm1WYXJEZWNsICpCdWlsZFBhcm1WYXJEZWNsRm9yVHlwZWRlZihEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBUKTsKKyAgUGFybVZhckRlY2wgKkNoZWNrUGFyYW1ldGVyKERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBOYW1lTG9jLCBJZGVudGlmaWVySW5mbyAqTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIFR5cGVTb3VyY2VJbmZvICpUU0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlQ2xhc3MgU0MpOworICB2b2lkIEFjdE9uUGFyYW1EZWZhdWx0QXJndW1lbnQoRGVjbCAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFcXVhbExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKmRlZmFyZyk7CisgIHZvaWQgQWN0T25QYXJhbVVucGFyc2VkRGVmYXVsdEFyZ3VtZW50KERlY2wgKnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFcXVhbExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXJnTG9jKTsKKyAgdm9pZCBBY3RPblBhcmFtRGVmYXVsdEFyZ3VtZW50RXJyb3IoRGVjbCAqcGFyYW0sIFNvdXJjZUxvY2F0aW9uIEVxdWFsTG9jKTsKKyAgYm9vbCBTZXRQYXJhbURlZmF1bHRBcmd1bWVudChQYXJtVmFyRGVjbCAqUGFyYW0sIEV4cHIgKkRlZmF1bHRBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRXF1YWxMb2MpOworCisgIHZvaWQgQWRkSW5pdGlhbGl6ZXJUb0RlY2woRGVjbCAqZGNsLCBFeHByICppbml0LCBib29sIERpcmVjdEluaXQpOworICB2b2lkIEFjdE9uVW5pbml0aWFsaXplZERlY2woRGVjbCAqZGNsKTsKKyAgdm9pZCBBY3RPbkluaXRpYWxpemVyRXJyb3IoRGVjbCAqRGNsKTsKKworICB2b2lkIEFjdE9uUHVyZVNwZWNpZmllcihEZWNsICpELCBTb3VyY2VMb2NhdGlvbiBQdXJlU3BlY0xvYyk7CisgIHZvaWQgQWN0T25DWFhGb3JSYW5nZURlY2woRGVjbCAqRCk7CisgIFN0bXRSZXN1bHQgQWN0T25DWFhGb3JSYW5nZUlkZW50aWZpZXIoU2NvcGUgKlMsIFNvdXJjZUxvY2F0aW9uIElkZW50TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpJZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzICZBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdHRyRW5kKTsKKyAgdm9pZCBTZXREZWNsRGVsZXRlZChEZWNsICpkY2wsIFNvdXJjZUxvY2F0aW9uIERlbExvYyk7CisgIHZvaWQgU2V0RGVjbERlZmF1bHRlZChEZWNsICpkY2wsIFNvdXJjZUxvY2F0aW9uIERlZmF1bHRMb2MpOworICB2b2lkIEZpbmFsaXplRGVjbGFyYXRpb24oRGVjbCAqRCk7CisgIERlY2xHcm91cFB0clR5IEZpbmFsaXplRGVjbGFyYXRvckdyb3VwKFNjb3BlICpTLCBjb25zdCBEZWNsU3BlYyAmRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPERlY2wgKj4gR3JvdXApOworICBEZWNsR3JvdXBQdHJUeSBCdWlsZERlY2xhcmF0b3JHcm91cChNdXRhYmxlQXJyYXlSZWY8RGVjbCAqPiBHcm91cCk7CisKKyAgLy8vIFNob3VsZCBiZSBjYWxsZWQgb24gYWxsIGRlY2xhcmF0aW9ucyB0aGF0IG1pZ2h0IGhhdmUgYXR0YWNoZWQKKyAgLy8vIGRvY3VtZW50YXRpb24gY29tbWVudHMuCisgIHZvaWQgQWN0T25Eb2N1bWVudGFibGVEZWNsKERlY2wgKkQpOworICB2b2lkIEFjdE9uRG9jdW1lbnRhYmxlRGVjbHMoQXJyYXlSZWY8RGVjbCAqPiBHcm91cCk7CisKKyAgdm9pZCBBY3RPbkZpbmlzaEtOUlBhcmFtRGVjbGFyYXRpb25zKFNjb3BlICpTLCBEZWNsYXJhdG9yICZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jQWZ0ZXJEZWNscyk7CisgIHZvaWQgQ2hlY2tGb3JGdW5jdGlvblJlZGVmaW5pdGlvbigKKyAgICAgIEZ1bmN0aW9uRGVjbCAqRkQsIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRWZmZWN0aXZlRGVmaW5pdGlvbiA9IG51bGxwdHIsCisgICAgICBTa2lwQm9keUluZm8gKlNraXBCb2R5ID0gbnVsbHB0cik7CisgIERlY2wgKkFjdE9uU3RhcnRPZkZ1bmN0aW9uRGVmKFNjb3BlICpTLCBEZWNsYXJhdG9yICZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aVRlbXBsYXRlUGFyYW1zQXJnIFRlbXBsYXRlUGFyYW1MaXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcEJvZHlJbmZvICpTa2lwQm9keSA9IG51bGxwdHIpOworICBEZWNsICpBY3RPblN0YXJ0T2ZGdW5jdGlvbkRlZihTY29wZSAqUywgRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcEJvZHlJbmZvICpTa2lwQm9keSA9IG51bGxwdHIpOworICB2b2lkIEFjdE9uU3RhcnRPZk9iakNNZXRob2REZWYoU2NvcGUgKlMsIERlY2wgKkQpOworICBib29sIGlzT2JqQ01ldGhvZERlY2woRGVjbCAqRCkgeworICAgIHJldHVybiBEICYmIGlzYTxPYmpDTWV0aG9kRGVjbD4oRCk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHdlIGNhbiBkZWxheSBwYXJzaW5nIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gb3IKKyAgLy8vIGZ1bmN0aW9uIHRlbXBsYXRlIHVudGlsIGl0IGlzIHVzZWQsIGFzc3VtaW5nIHdlIGRvbid0IGNhcmUgYWJvdXQgZW1pdHRpbmcKKyAgLy8vIGNvZGUgZm9yIHRoYXQgZnVuY3Rpb24uCisgIC8vLworICAvLy8gVGhpcyB3aWxsIGJlIFxjIGZhbHNlIGlmIHdlIG1heSBuZWVkIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUKKyAgLy8vIG1pZGRsZSBvZiBwYXJzaW5nIGFuIGV4cHJlc3Npb24gKHdoZXJlIGl0J3MgaW1wcmFjdGljYWwgdG8gc3dpdGNoIHRvCisgIC8vLyBwYXJzaW5nIGEgZGlmZmVyZW50IGZ1bmN0aW9uKSwgZm9yIGluc3RhbmNlLCBpZiBpdCdzIGNvbnN0ZXhwciBpbiBDKysxMQorICAvLy8gb3IgaGFzIGFuICdhdXRvJyByZXR1cm4gdHlwZSBpbiBDKysxNC4gVGhlc2UgY2FzZXMgYXJlIGVzc2VudGlhbGx5IGJ1Z3MuCisgIGJvb2wgY2FuRGVsYXlGdW5jdGlvbkJvZHkoY29uc3QgRGVjbGFyYXRvciAmRCk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB3ZSBjYW4gc2tpcCBwYXJzaW5nIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24KKyAgLy8vIGRlZmluaXRpb24sIGFzc3VtaW5nIHdlIGRvbid0IGNhcmUgYWJvdXQgYW5hbHl6aW5nIGl0cyBib2R5IG9yIGVtaXR0aW5nCisgIC8vLyBjb2RlIGZvciB0aGF0IGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgd2lsbCBiZSBcYyBmYWxzZSBvbmx5IGlmIHdlIG1heSBuZWVkIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiBpbgorICAvLy8gb3JkZXIgdG8gcGFyc2UgdGhlIHJlc3Qgb2YgdGhlIHByb2dyYW0gKGZvciBpbnN0YW5jZSwgaWYgaXQgaXMKKyAgLy8vIFxjIGNvbnN0ZXhwciBpbiBDKysxMSBvciBoYXMgYW4gJ2F1dG8nIHJldHVybiB0eXBlIGluIEMrKzE0KS4KKyAgYm9vbCBjYW5Ta2lwRnVuY3Rpb25Cb2R5KERlY2wgKkQpOworCisgIHZvaWQgY29tcHV0ZU5SVk8oU3RtdCAqQm9keSwgc2VtYTo6RnVuY3Rpb25TY29wZUluZm8gKlNjb3BlKTsKKyAgRGVjbCAqQWN0T25GaW5pc2hGdW5jdGlvbkJvZHkoRGVjbCAqRGVjbCwgU3RtdCAqQm9keSk7CisgIERlY2wgKkFjdE9uRmluaXNoRnVuY3Rpb25Cb2R5KERlY2wgKkRlY2wsIFN0bXQgKkJvZHksIGJvb2wgSXNJbnN0YW50aWF0aW9uKTsKKyAgRGVjbCAqQWN0T25Ta2lwcGVkRnVuY3Rpb25Cb2R5KERlY2wgKkRlY2wpOworICB2b2lkIEFjdE9uRmluaXNoSW5saW5lRnVuY3Rpb25EZWYoRnVuY3Rpb25EZWNsICpEKTsKKworICAvLy8gQWN0T25GaW5pc2hEZWxheWVkQXR0cmlidXRlIC0gSW52b2tlZCB3aGVuIHdlIGhhdmUgZmluaXNoZWQgcGFyc2luZyBhbgorICAvLy8gYXR0cmlidXRlIGZvciB3aGljaCBwYXJzaW5nIGlzIGRlbGF5ZWQuCisgIHZvaWQgQWN0T25GaW5pc2hEZWxheWVkQXR0cmlidXRlKFNjb3BlICpTLCBEZWNsICpELCBQYXJzZWRBdHRyaWJ1dGVzICZBdHRycyk7CisKKyAgLy8vIFxicmllZiBEaWFnbm9zZSBhbnkgdW51c2VkIHBhcmFtZXRlcnMgaW4gdGhlIGdpdmVuIHNlcXVlbmNlIG9mCisgIC8vLyBQYXJtVmFyRGVjbCBwb2ludGVycy4KKyAgdm9pZCBEaWFnbm9zZVVudXNlZFBhcmFtZXRlcnMoQXJyYXlSZWY8UGFybVZhckRlY2wgKj4gUGFyYW1ldGVycyk7CisKKyAgLy8vIFxicmllZiBEaWFnbm9zZSB3aGV0aGVyIHRoZSBzaXplIG9mIHBhcmFtZXRlcnMgb3IgcmV0dXJuIHZhbHVlIG9mIGEKKyAgLy8vIGZ1bmN0aW9uIG9yIG9iai1jIG1ldGhvZCBkZWZpbml0aW9uIGlzIHBhc3MtYnktdmFsdWUgYW5kIGxhcmdlciB0aGFuIGEKKyAgLy8vIHNwZWNpZmllZCB0aHJlc2hvbGQuCisgIHZvaWQKKyAgRGlhZ25vc2VTaXplT2ZQYXJhbWV0ZXJzQW5kUmV0dXJuVmFsdWUoQXJyYXlSZWY8UGFybVZhckRlY2wgKj4gUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgUmV0dXJuVHksIE5hbWVkRGVjbCAqRCk7CisKKyAgdm9pZCBEaWFnbm9zZUludmFsaWRKdW1wcyhTdG10ICpCb2R5KTsKKyAgRGVjbCAqQWN0T25GaWxlU2NvcGVBc21EZWNsKEV4cHIgKmV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBc21Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MpOworCisgIC8vLyBcYnJpZWYgSGFuZGxlIGEgQysrMTEgZW1wdHktZGVjbGFyYXRpb24gYW5kIGF0dHJpYnV0ZS1kZWNsYXJhdGlvbi4KKyAgRGVjbCAqQWN0T25FbXB0eURlY2xhcmF0aW9uKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdCAqQXR0ckxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTZW1pTG9jKTsKKworICBlbnVtIGNsYXNzIE1vZHVsZURlY2xLaW5kIHsKKyAgICBJbnRlcmZhY2UsICAgICAgLy8vPCAnZXhwb3J0IG1vZHVsZSBYOycKKyAgICBJbXBsZW1lbnRhdGlvbiwgLy8vPCAnbW9kdWxlIFg7JworICAgIFBhcnRpdGlvbiwgICAgICAvLy88ICdtb2R1bGUgcGFydGl0aW9uIFg7JworICB9OworCisgIC8vLyBUaGUgcGFyc2VyIGhhcyBwcm9jZXNzZWQgYSBtb2R1bGUtZGVjbGFyYXRpb24gdGhhdCBiZWdpbnMgdGhlIGRlZmluaXRpb24KKyAgLy8vIG9mIGEgbW9kdWxlIGludGVyZmFjZSBvciBpbXBsZW1lbnRhdGlvbi4KKyAgRGVjbEdyb3VwUHRyVHkgQWN0T25Nb2R1bGVEZWNsKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTW9kdWxlTG9jLCBNb2R1bGVEZWNsS2luZCBNREssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVJZFBhdGggUGF0aCk7CisKKyAgLy8vIFxicmllZiBUaGUgcGFyc2VyIGhhcyBwcm9jZXNzZWQgYSBtb2R1bGUgaW1wb3J0IGRlY2xhcmF0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBBdExvYyBUaGUgbG9jYXRpb24gb2YgdGhlICdAJyBzeW1ib2wsIGlmIGFueS4KKyAgLy8vCisgIC8vLyBccGFyYW0gSW1wb3J0TG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgJ2ltcG9ydCcga2V5d29yZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gUGF0aCBUaGUgbW9kdWxlIGFjY2VzcyBwYXRoLgorICBEZWNsUmVzdWx0IEFjdE9uTW9kdWxlSW1wb3J0KFNvdXJjZUxvY2F0aW9uIEF0TG9jLCBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlSWRQYXRoIFBhdGgpOworCisgIC8vLyBcYnJpZWYgVGhlIHBhcnNlciBoYXMgcHJvY2Vzc2VkIGEgbW9kdWxlIGltcG9ydCB0cmFuc2xhdGVkIGZyb20gYQorICAvLy8gI2luY2x1ZGUgb3Igc2ltaWxhciBwcmVwcm9jZXNzaW5nIGRpcmVjdGl2ZS4KKyAgdm9pZCBBY3RPbk1vZHVsZUluY2x1ZGUoU291cmNlTG9jYXRpb24gRGlyZWN0aXZlTG9jLCBNb2R1bGUgKk1vZCk7CisgIHZvaWQgQnVpbGRNb2R1bGVJbmNsdWRlKFNvdXJjZUxvY2F0aW9uIERpcmVjdGl2ZUxvYywgTW9kdWxlICpNb2QpOworCisgIC8vLyBcYnJpZWYgVGhlIHBhcnNlZCBoYXMgZW50ZXJlZCBhIHN1Ym1vZHVsZS4KKyAgdm9pZCBBY3RPbk1vZHVsZUJlZ2luKFNvdXJjZUxvY2F0aW9uIERpcmVjdGl2ZUxvYywgTW9kdWxlICpNb2QpOworICAvLy8gXGJyaWVmIFRoZSBwYXJzZXIgaGFzIGxlZnQgYSBzdWJtb2R1bGUuCisgIHZvaWQgQWN0T25Nb2R1bGVFbmQoU291cmNlTG9jYXRpb24gRGlyZWN0aXZlTG9jLCBNb2R1bGUgKk1vZCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gaW1wbGljaXQgaW1wb3J0IG9mIHRoZSBnaXZlbiBtb2R1bGUgYXQgdGhlIGdpdmVuCisgIC8vLyBzb3VyY2UgbG9jYXRpb24sIGZvciBlcnJvciByZWNvdmVyeSwgaWYgcG9zc2libGUuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gYW4gZW50aXR5IGZvdW5kIGJ5IG5hbWUgbG9va3VwCisgIC8vLyBpcyBhY3R1YWxseSBoaWRkZW4gd2l0aGluIGEgbW9kdWxlIHRoYXQgd2Uga25vdyBhYm91dCBidXQgdGhlIHVzZXIKKyAgLy8vIGhhcyBmb3Jnb3R0ZW4gdG8gaW1wb3J0LgorICB2b2lkIGNyZWF0ZUltcGxpY2l0TW9kdWxlSW1wb3J0Rm9yRXJyb3JSZWNvdmVyeShTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqTW9kKTsKKworICAvLy8gS2luZHMgb2YgbWlzc2luZyBpbXBvcnQuIE5vdGUsIHRoZSB2YWx1ZXMgb2YgdGhlc2UgZW51bWVyYXRvcnMgY29ycmVzcG9uZAorICAvLy8gdG8gJXNlbGVjdCB2YWx1ZXMgaW4gZGlhZ25vc3RpY3MuCisgIGVudW0gY2xhc3MgTWlzc2luZ0ltcG9ydEtpbmQgeworICAgIERlY2xhcmF0aW9uLAorICAgIERlZmluaXRpb24sCisgICAgRGVmYXVsdEFyZ3VtZW50LAorICAgIEV4cGxpY2l0U3BlY2lhbGl6YXRpb24sCisgICAgUGFydGlhbFNwZWNpYWxpemF0aW9uCisgIH07CisKKyAgLy8vIFxicmllZiBEaWFnbm9zZSB0aGF0IHRoZSBzcGVjaWZpZWQgZGVjbGFyYXRpb24gbmVlZHMgdG8gYmUgdmlzaWJsZSBidXQKKyAgLy8vIGlzbid0LCBhbmQgc3VnZ2VzdCBhIG1vZHVsZSBpbXBvcnQgdGhhdCB3b3VsZCByZXNvbHZlIHRoZSBwcm9ibGVtLgorICB2b2lkIGRpYWdub3NlTWlzc2luZ0ltcG9ydChTb3VyY2VMb2NhdGlvbiBMb2MsIE5hbWVkRGVjbCAqRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzc2luZ0ltcG9ydEtpbmQgTUlLLCBib29sIFJlY292ZXIgPSB0cnVlKTsKKyAgdm9pZCBkaWFnbm9zZU1pc3NpbmdJbXBvcnQoU291cmNlTG9jYXRpb24gTG9jLCBOYW1lZERlY2wgKkRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIERlY2xMb2MsIEFycmF5UmVmPE1vZHVsZSAqPiBNb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXNzaW5nSW1wb3J0S2luZCBNSUssIGJvb2wgUmVjb3Zlcik7CisKKyAgRGVjbCAqQWN0T25TdGFydEV4cG9ydERlY2woU2NvcGUgKlMsIFNvdXJjZUxvY2F0aW9uIEV4cG9ydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTEJyYWNlTG9jKTsKKyAgRGVjbCAqQWN0T25GaW5pc2hFeHBvcnREZWNsKFNjb3BlICpTLCBEZWNsICpFeHBvcnREZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUkJyYWNlTG9jKTsKKworICAvLy8gXGJyaWVmIFdlJ3ZlIGZvdW5kIGEgdXNlIG9mIGEgdGVtcGxhdGVkIGRlY2xhcmF0aW9uIHRoYXQgd291bGQgdHJpZ2dlciBhbgorICAvLy8gaW1wbGljaXQgaW5zdGFudGlhdGlvbi4gQ2hlY2sgdGhhdCBhbnkgcmVsZXZhbnQgZXhwbGljaXQgc3BlY2lhbGl6YXRpb25zCisgIC8vLyBhbmQgcGFydGlhbCBzcGVjaWFsaXphdGlvbnMgYXJlIHZpc2libGUsIGFuZCBkaWFnbm9zZSBpZiBub3QuCisgIHZvaWQgY2hlY2tTcGVjaWFsaXphdGlvblZpc2liaWxpdHkoU291cmNlTG9jYXRpb24gTG9jLCBOYW1lZERlY2wgKlNwZWMpOworCisgIC8vLyBcYnJpZWYgV2UndmUgZm91bmQgYSB1c2Ugb2YgYSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0aGF0IHdvdWxkIHNlbGVjdCBhCisgIC8vLyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLiBDaGVjayB0aGF0IHRoZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGlzIHZpc2libGUsCisgIC8vLyBhbmQgZGlhZ25vc2UgaWYgbm90LgorICB2b2lkIGNoZWNrUGFydGlhbFNwZWNpYWxpemF0aW9uVmlzaWJpbGl0eShTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkRGVjbCAqU3BlYyk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSBhIHN1aXRhYmxlIHByaW50aW5nIHBvbGljeS4KKyAgUHJpbnRpbmdQb2xpY3kgZ2V0UHJpbnRpbmdQb2xpY3koKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFByaW50aW5nUG9saWN5KENvbnRleHQsIFBQKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYSBzdWl0YWJsZSBwcmludGluZyBwb2xpY3kuCisgIHN0YXRpYyBQcmludGluZ1BvbGljeSBnZXRQcmludGluZ1BvbGljeShjb25zdCBBU1RDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVwcm9jZXNzb3IgJlBQKTsKKworICAvLy8gU2NvcGUgYWN0aW9ucy4KKyAgdm9pZCBBY3RPblBvcFNjb3BlKFNvdXJjZUxvY2F0aW9uIExvYywgU2NvcGUgKlMpOworICB2b2lkIEFjdE9uVHJhbnNsYXRpb25Vbml0U2NvcGUoU2NvcGUgKlMpOworCisgIERlY2wgKlBhcnNlZEZyZWVTdGFuZGluZ0RlY2xTcGVjKFNjb3BlICpTLCBBY2Nlc3NTcGVjaWZpZXIgQVMsIERlY2xTcGVjICZEUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkRGVjbCAqJkFub25SZWNvcmQpOworICBEZWNsICpQYXJzZWRGcmVlU3RhbmRpbmdEZWNsU3BlYyhTY29wZSAqUywgQWNjZXNzU3BlY2lmaWVyIEFTLCBEZWNsU3BlYyAmRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpVGVtcGxhdGVQYXJhbXNBcmcgVGVtcGxhdGVQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNFeHBsaWNpdEluc3RhbnRpYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZERlY2wgKiZBbm9uUmVjb3JkKTsKKworICBEZWNsICpCdWlsZEFub255bW91c1N0cnVjdE9yVW5pb24oU2NvcGUgKlMsIERlY2xTcGVjICZEUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc1NwZWNpZmllciBBUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZERlY2wgKlJlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpOworCisgIERlY2wgKkJ1aWxkTWljcm9zb2Z0Q0Fub255bW91c1N0cnVjdChTY29wZSAqUywgRGVjbFNwZWMgJkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkRGVjbCAqUmVjb3JkKTsKKworICAvLy8gQ29tbW9uIHdheXMgdG8gaW50cm9kdWNlIHR5cGUgbmFtZXMgd2l0aG91dCBhIHRhZyBmb3IgdXNlIGluIGRpYWdub3N0aWNzLgorICAvLy8gS2VlcCBpbiBzeW5jIHdpdGggZXJyX3RhZ19yZWZlcmVuY2Vfbm9uX3RhZy4KKyAgZW51bSBOb25UYWdLaW5kIHsKKyAgICBOVEtfTm9uU3RydWN0LAorICAgIE5US19Ob25DbGFzcywKKyAgICBOVEtfTm9uVW5pb24sCisgICAgTlRLX05vbkVudW0sCisgICAgTlRLX1R5cGVkZWYsCisgICAgTlRLX1R5cGVBbGlhcywKKyAgICBOVEtfVGVtcGxhdGUsCisgICAgTlRLX1R5cGVBbGlhc1RlbXBsYXRlLAorICAgIE5US19UZW1wbGF0ZVRlbXBsYXRlQXJndW1lbnQsCisgIH07CisKKyAgLy8vIEdpdmVuIGEgbm9uLXRhZyB0eXBlIGRlY2xhcmF0aW9uLCByZXR1cm5zIGFuIGVudW0gdXNlZnVsIGZvciBpbmRpY2F0aW5nCisgIC8vLyB3aGF0IGtpbmQgb2Ygbm9uLXRhZyB0eXBlIHRoaXMgaXMuCisgIE5vblRhZ0tpbmQgZ2V0Tm9uVGFnVHlwZURlY2xLaW5kKGNvbnN0IERlY2wgKkQsIFRhZ1R5cGVLaW5kIFRUSyk7CisKKyAgYm9vbCBpc0FjY2VwdGFibGVUYWdSZWRlY2xhcmF0aW9uKGNvbnN0IFRhZ0RlY2wgKlByZXZpb3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFnVHlwZUtpbmQgTmV3VGFnLCBib29sIGlzRGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE5ld1RhZ0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElkZW50aWZpZXJJbmZvICpOYW1lKTsKKworICBlbnVtIFRhZ1VzZUtpbmQgeworICAgIFRVS19SZWZlcmVuY2UsICAgLy8gUmVmZXJlbmNlIHRvIGEgdGFnOiAgJ3N0cnVjdCBmb28gKlg7JworICAgIFRVS19EZWNsYXJhdGlvbiwgLy8gRndkIGRlY2wgb2YgYSB0YWc6ICAgJ3N0cnVjdCBmb287JworICAgIFRVS19EZWZpbml0aW9uLCAgLy8gRGVmaW5pdGlvbiBvZiBhIHRhZzogJ3N0cnVjdCBmb28geyBpbnQgWDsgfSBZOycKKyAgICBUVUtfRnJpZW5kICAgICAgIC8vIEZyaWVuZCBkZWNsYXJhdGlvbjogICdmcmllbmQgc3RydWN0IGZvbzsnCisgIH07CisKKyAgRGVjbCAqQWN0T25UYWcoU2NvcGUgKlMsIHVuc2lnbmVkIFRhZ1NwZWMsIFRhZ1VzZUtpbmQgVFVLLAorICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBLV0xvYywgQ1hYU2NvcGVTcGVjICZTUywgSWRlbnRpZmllckluZm8gKk5hbWUsCisgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE5hbWVMb2MsIEF0dHJpYnV0ZUxpc3QgKkF0dHIsCisgICAgICAgICAgICAgICAgIEFjY2Vzc1NwZWNpZmllciBBUywgU291cmNlTG9jYXRpb24gTW9kdWxlUHJpdmF0ZUxvYywKKyAgICAgICAgICAgICAgICAgTXVsdGlUZW1wbGF0ZVBhcmFtc0FyZyBUZW1wbGF0ZVBhcmFtZXRlckxpc3RzLCBib29sICZPd25lZERlY2wsCisgICAgICAgICAgICAgICAgIGJvb2wgJklzRGVwZW5kZW50LCBTb3VyY2VMb2NhdGlvbiBTY29wZWRFbnVtS1dMb2MsCisgICAgICAgICAgICAgICAgIGJvb2wgU2NvcGVkRW51bVVzZXNDbGFzc1RhZywgVHlwZVJlc3VsdCBVbmRlcmx5aW5nVHlwZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBJc1R5cGVTcGVjaWZpZXIsIGJvb2wgSXNUZW1wbGF0ZVBhcmFtT3JBcmcsCisgICAgICAgICAgICAgICAgIFNraXBCb2R5SW5mbyAqU2tpcEJvZHkgPSBudWxscHRyKTsKKworICBEZWNsICpBY3RPblRlbXBsYXRlZEZyaWVuZFRhZyhTY29wZSAqUywgU291cmNlTG9jYXRpb24gRnJpZW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUYWdTcGVjLCBTb3VyY2VMb2NhdGlvbiBUYWdMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpOYW1lLCBTb3VyY2VMb2NhdGlvbiBOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0ICpBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aVRlbXBsYXRlUGFyYW1zQXJnIFRlbXBQYXJhbUxpc3RzKTsKKworICBUeXBlUmVzdWx0IEFjdE9uRGVwZW5kZW50VGFnKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFRhZ1NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFnVXNlS2luZCBUVUssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUYWdMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTmFtZUxvYyk7CisKKyAgdm9pZCBBY3RPbkRlZnMoU2NvcGUgKlMsIERlY2wgKlRhZ0QsIFNvdXJjZUxvY2F0aW9uIERlY2xTdGFydCwKKyAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKkNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPERlY2wgKj4gJkRlY2xzKTsKKyAgRGVjbCAqQWN0T25GaWVsZChTY29wZSAqUywgRGVjbCAqVGFnRCwgU291cmNlTG9jYXRpb24gRGVjbFN0YXJ0LAorICAgICAgICAgICAgICAgICAgIERlY2xhcmF0b3IgJkQsIEV4cHIgKkJpdGZpZWxkV2lkdGgpOworCisgIEZpZWxkRGVjbCAqSGFuZGxlRmllbGQoU2NvcGUgKlMsIFJlY29yZERlY2wgKlRhZ0QsIFNvdXJjZUxvY2F0aW9uIERlY2xTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdG9yICZELCBFeHByICpCaXRmaWVsZFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIEluQ2xhc3NJbml0U3R5bGUgSW5pdFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc1NwZWNpZmllciBBUyk7CisgIE1TUHJvcGVydHlEZWNsICpIYW5kbGVNU1Byb3BlcnR5KFNjb3BlICpTLCBSZWNvcmREZWNsICpUYWdELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBEZWNsU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0b3IgJkQsIEV4cHIgKkJpdGZpZWxkV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluQ2xhc3NJbml0U3R5bGUgSW5pdFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NTcGVjaWZpZXIgQVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3QgKk1TUHJvcGVydHlBdHRyKTsKKworICBGaWVsZERlY2wgKkNoZWNrRmllbGREZWNsKERlY2xhcmF0aW9uTmFtZSBOYW1lLCBRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmREZWNsICpSZWNvcmQsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE11dGFibGUsIEV4cHIgKkJpdGZpZWxkV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5DbGFzc0luaXRTdHlsZSBJbml0U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVFNTTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NTcGVjaWZpZXIgQVMsIE5hbWVkRGVjbCAqUHJldkRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRvciAqRCA9IG51bGxwdHIpOworCisgIGJvb2wgQ2hlY2tOb250cml2aWFsRmllbGQoRmllbGREZWNsICpGRCk7CisgIHZvaWQgRGlhZ25vc2VOb250cml2aWFsKGNvbnN0IENYWFJlY29yZERlY2wgKlJlY29yZCwgQ1hYU3BlY2lhbE1lbWJlciBDU00pOworCisgIGVudW0gVHJpdmlhbEFCSUhhbmRsaW5nIHsKKyAgICAvLy8gVGhlIHRyaXZpYWxpdHkgb2YgYSBtZXRob2QgdW5hZmZlY3RlZCBieSAidHJpdmlhbF9hYmkiLgorICAgIFRBSF9JZ25vcmVUcml2aWFsQUJJLAorCisgICAgLy8vIFRoZSB0cml2aWFsaXR5IG9mIGEgbWV0aG9kIGFmZmVjdGVkIGJ5ICJ0cml2aWFsX2FiaSIuCisgICAgVEFIX0NvbnNpZGVyVHJpdmlhbEFCSQorICB9OworCisgIGJvb2wgU3BlY2lhbE1lbWJlcklzVHJpdmlhbChDWFhNZXRob2REZWNsICpNRCwgQ1hYU3BlY2lhbE1lbWJlciBDU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcml2aWFsQUJJSGFuZGxpbmcgVEFIID0gVEFIX0lnbm9yZVRyaXZpYWxBQkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpYWdub3NlID0gZmFsc2UpOworICBDWFhTcGVjaWFsTWVtYmVyIGdldFNwZWNpYWxNZW1iZXIoY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQpOworICB2b2lkIEFjdE9uTGFzdEJpdGZpZWxkKFNvdXJjZUxvY2F0aW9uIERlY2xTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8RGVjbCAqPiAmQWxsSXZhckRlY2xzKTsKKyAgRGVjbCAqQWN0T25JdmFyKFNjb3BlICpTLCBTb3VyY2VMb2NhdGlvbiBEZWNsU3RhcnQsCisgICAgICAgICAgICAgICAgICBEZWNsYXJhdG9yICZELCBFeHByICpCaXRmaWVsZFdpZHRoLAorICAgICAgICAgICAgICAgICAgdG9rOjpPYmpDS2V5d29yZEtpbmQgdmlzaWJpbGl0eSk7CisKKyAgLy8gVGhpcyBpcyB1c2VkIGZvciBib3RoIHJlY29yZCBkZWZpbml0aW9ucyBhbmQgT2JqQyBpbnRlcmZhY2UgZGVjbGFyYXRpb25zLgorICB2b2lkIEFjdE9uRmllbGRzKFNjb3BlKiBTLCBTb3VyY2VMb2NhdGlvbiBSZWNMb2MsIERlY2wgKlRhZ0RlY2wsCisgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RGVjbCAqPiBGaWVsZHMsCisgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTEJyYWMsIFNvdXJjZUxvY2F0aW9uIFJCcmFjLAorICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3QgKkF0dHJMaXN0KTsKKworICAvLy8gQWN0T25UYWdTdGFydERlZmluaXRpb24gLSBJbnZva2VkIHdoZW4gd2UgaGF2ZSBlbnRlcmVkIHRoZQorICAvLy8gc2NvcGUgb2YgYSB0YWcncyBkZWZpbml0aW9uIChlLmcuLCBmb3IgYW4gZW51bWVyYXRpb24sIGNsYXNzLAorICAvLy8gc3RydWN0LCBvciB1bmlvbikuCisgIHZvaWQgQWN0T25UYWdTdGFydERlZmluaXRpb24oU2NvcGUgKlMsIERlY2wgKlRhZ0RlY2wpOworCisgIC8vLyBQZXJmb3JtIE9EUi1saWtlIGNoZWNrIGZvciBDL09iakMgd2hlbiBtZXJnaW5nIHRhZyB0eXBlcyBmcm9tIG1vZHVsZXMuCisgIC8vLyBEaWZmZXJlbnRseSBmcm9tIEMrKywgYWN0dWFsbHkgcGFyc2UgdGhlIGJvZHkgYW5kIHJlamVjdCAvIGVycm9yIG91dAorICAvLy8gaW4gY2FzZSBvZiBhIHN0cnVjdHVyYWwgbWlzbWF0Y2guCisgIGJvb2wgQWN0T25EdXBsaWNhdGVEZWZpbml0aW9uKERlY2xTcGVjICZEUywgRGVjbCAqUHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcEJvZHlJbmZvICZTa2lwQm9keSk7CisKKyAgdHlwZWRlZiB2b2lkICpTa2lwcGVkRGVmaW5pdGlvbkNvbnRleHQ7CisKKyAgLy8vIFxicmllZiBJbnZva2VkIHdoZW4gd2UgZW50ZXIgYSB0YWcgZGVmaW5pdGlvbiB0aGF0IHdlJ3JlIHNraXBwaW5nLgorICBTa2lwcGVkRGVmaW5pdGlvbkNvbnRleHQgQWN0T25UYWdTdGFydFNraXBwZWREZWZpbml0aW9uKFNjb3BlICpTLCBEZWNsICpURCk7CisKKyAgRGVjbCAqQWN0T25PYmpDQ29udGFpbmVyU3RhcnREZWZpbml0aW9uKERlY2wgKklEZWNsKTsKKworICAvLy8gQWN0T25TdGFydENYWE1lbWJlckRlY2xhcmF0aW9ucyAtIEludm9rZWQgd2hlbiB3ZSBoYXZlIHBhcnNlZCBhCisgIC8vLyBDKysgcmVjb3JkIGRlZmluaXRpb24ncyBiYXNlLXNwZWNpZmllcnMgY2xhdXNlIGFuZCBhcmUgc3RhcnRpbmcgaXRzCisgIC8vLyBtZW1iZXIgZGVjbGFyYXRpb25zLgorICB2b2lkIEFjdE9uU3RhcnRDWFhNZW1iZXJEZWNsYXJhdGlvbnMoU2NvcGUgKlMsIERlY2wgKlRhZ0RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBGaW5hbExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNGaW5hbFNwZWxsZWRTZWFsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMQnJhY2VMb2MpOworCisgIC8vLyBBY3RPblRhZ0ZpbmlzaERlZmluaXRpb24gLSBJbnZva2VkIG9uY2Ugd2UgaGF2ZSBmaW5pc2hlZCBwYXJzaW5nCisgIC8vLyB0aGUgZGVmaW5pdGlvbiBvZiBhIHRhZyAoZW51bWVyYXRpb24sIGNsYXNzLCBzdHJ1Y3QsIG9yIHVuaW9uKS4KKyAgdm9pZCBBY3RPblRhZ0ZpbmlzaERlZmluaXRpb24oU2NvcGUgKlMsIERlY2wgKlRhZ0RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEJyYWNlUmFuZ2UpOworCisgIHZvaWQgQWN0T25UYWdGaW5pc2hTa2lwcGVkRGVmaW5pdGlvbihTa2lwcGVkRGVmaW5pdGlvbkNvbnRleHQgQ29udGV4dCk7CisKKyAgdm9pZCBBY3RPbk9iakNDb250YWluZXJGaW5pc2hEZWZpbml0aW9uKCk7CisKKyAgLy8vIFxicmllZiBJbnZva2VkIHdoZW4gd2UgbXVzdCB0ZW1wb3JhcmlseSBleGl0IHRoZSBvYmplY3RpdmUtYyBjb250YWluZXIKKyAgLy8vIHNjb3BlIGZvciBwYXJzaW5nL2xvb2tpbmctdXAgQyBjb25zdHJ1Y3RzLgorICAvLy8KKyAgLy8vIE11c3QgYmUgZm9sbG93ZWQgYnkgYSBjYWxsIHRvIFxzZWUgQWN0T25PYmpDUmVlbnRlckNvbnRhaW5lckNvbnRleHQKKyAgdm9pZCBBY3RPbk9iakNUZW1wb3JhcnlFeGl0Q29udGFpbmVyQ29udGV4dChEZWNsQ29udGV4dCAqREMpOworICB2b2lkIEFjdE9uT2JqQ1JlZW50ZXJDb250YWluZXJDb250ZXh0KERlY2xDb250ZXh0ICpEQyk7CisKKyAgLy8vIEFjdE9uVGFnRGVmaW5pdGlvbkVycm9yIC0gSW52b2tlZCB3aGVuIHRoZXJlIHdhcyBhbiB1bnJlY292ZXJhYmxlCisgIC8vLyBlcnJvciBwYXJzaW5nIHRoZSBkZWZpbml0aW9uIG9mIGEgdGFnLgorICB2b2lkIEFjdE9uVGFnRGVmaW5pdGlvbkVycm9yKFNjb3BlICpTLCBEZWNsICpUYWdEZWNsKTsKKworICBFbnVtQ29uc3RhbnREZWNsICpDaGVja0VudW1Db25zdGFudChFbnVtRGVjbCAqRW51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bUNvbnN0YW50RGVjbCAqTGFzdEVudW1Db25zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqdmFsKTsKKyAgYm9vbCBDaGVja0VudW1VbmRlcmx5aW5nVHlwZShUeXBlU291cmNlSW5mbyAqVEkpOworICBib29sIENoZWNrRW51bVJlZGVjbGFyYXRpb24oU291cmNlTG9jYXRpb24gRW51bUxvYywgYm9vbCBJc1Njb3BlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIEVudW1VbmRlcmx5aW5nVHksIGJvb2wgSXNGaXhlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1EZWNsICpQcmV2KTsKKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGJvZHkgb2YgYW4gYW5vbnltb3VzIGVudW1lcmF0aW9uIHNob3VsZCBiZSBza2lwcGVkLgorICAvLy8gXHBhcmFtIElJIFRoZSBuYW1lIG9mIHRoZSBmaXJzdCBlbnVtZXJhdG9yLgorICBTa2lwQm9keUluZm8gc2hvdWxkU2tpcEFub25FbnVtQm9keShTY29wZSAqUywgSWRlbnRpZmllckluZm8gKklJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJSUxvYyk7CisKKyAgRGVjbCAqQWN0T25FbnVtQ29uc3RhbnQoU2NvcGUgKlMsIERlY2wgKkVudW1EZWNsLCBEZWNsICpMYXN0RW51bUNvbnN0YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJZExvYywgSWRlbnRpZmllckluZm8gKklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0ICpBdHRycywgU291cmNlTG9jYXRpb24gRXF1YWxMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKlZhbCk7CisgIHZvaWQgQWN0T25FbnVtQm9keShTb3VyY2VMb2NhdGlvbiBFbnVtTG9jLCBTb3VyY2VSYW5nZSBCcmFjZVJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgRGVjbCAqRW51bURlY2wsCisgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxEZWNsICo+IEVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgU2NvcGUgKlMsIEF0dHJpYnV0ZUxpc3QgKkF0dHIpOworCisgIERlY2xDb250ZXh0ICpnZXRDb250YWluaW5nREMoRGVjbENvbnRleHQgKkRDKTsKKworICAvLy8gU2V0IHRoZSBjdXJyZW50IGRlY2xhcmF0aW9uIGNvbnRleHQgdW50aWwgaXQgZ2V0cyBwb3BwZWQuCisgIHZvaWQgUHVzaERlY2xDb250ZXh0KFNjb3BlICpTLCBEZWNsQ29udGV4dCAqREMpOworICB2b2lkIFBvcERlY2xDb250ZXh0KCk7CisKKyAgLy8vIEVudGVyRGVjbGFyYXRvckNvbnRleHQgLSBVc2VkIHdoZW4gd2UgbXVzdCBsb29rdXAgbmFtZXMgaW4gdGhlIGNvbnRleHQKKyAgLy8vIG9mIGEgZGVjbGFyYXRvcidzIG5lc3RlZCBuYW1lIHNwZWNpZmllci4KKyAgdm9pZCBFbnRlckRlY2xhcmF0b3JDb250ZXh0KFNjb3BlICpTLCBEZWNsQ29udGV4dCAqREMpOworICB2b2lkIEV4aXREZWNsYXJhdG9yQ29udGV4dChTY29wZSAqUyk7CisKKyAgLy8vIFB1c2ggdGhlIHBhcmFtZXRlcnMgb2YgRCwgd2hpY2ggbXVzdCBiZSBhIGZ1bmN0aW9uLCBpbnRvIHNjb3BlLgorICB2b2lkIEFjdE9uUmVlbnRlckZ1bmN0aW9uQ29udGV4dChTY29wZSogUywgRGVjbCogRCk7CisgIHZvaWQgQWN0T25FeGl0RnVuY3Rpb25Db250ZXh0KCk7CisKKyAgRGVjbENvbnRleHQgKmdldEZ1bmN0aW9uTGV2ZWxEZWNsQ29udGV4dCgpOworCisgIC8vLyBnZXRDdXJGdW5jdGlvbkRlY2wgLSBJZiBpbnNpZGUgb2YgYSBmdW5jdGlvbiBib2R5LCB0aGlzIHJldHVybnMgYSBwb2ludGVyCisgIC8vLyB0byB0aGUgZnVuY3Rpb24gZGVjbCBmb3IgdGhlIGZ1bmN0aW9uIGJlaW5nIHBhcnNlZC4gIElmIHdlJ3JlIGN1cnJlbnRseQorICAvLy8gaW4gYSAnYmxvY2snLCB0aGlzIHJldHVybnMgdGhlIGNvbnRhaW5pbmcgY29udGV4dC4KKyAgRnVuY3Rpb25EZWNsICpnZXRDdXJGdW5jdGlvbkRlY2woKTsKKworICAvLy8gZ2V0Q3VyTWV0aG9kRGVjbCAtIElmIGluc2lkZSBvZiBhIG1ldGhvZCBib2R5LCB0aGlzIHJldHVybnMgYSBwb2ludGVyIHRvCisgIC8vLyB0aGUgbWV0aG9kIGRlY2wgZm9yIHRoZSBtZXRob2QgYmVpbmcgcGFyc2VkLiAgSWYgd2UncmUgY3VycmVudGx5CisgIC8vLyBpbiBhICdibG9jaycsIHRoaXMgcmV0dXJucyB0aGUgY29udGFpbmluZyBjb250ZXh0LgorICBPYmpDTWV0aG9kRGVjbCAqZ2V0Q3VyTWV0aG9kRGVjbCgpOworCisgIC8vLyBnZXRDdXJGdW5jdGlvbk9yTWV0aG9kRGVjbCAtIFJldHVybiB0aGUgRGVjbCBmb3IgdGhlIGN1cnJlbnQgT2JqQyBtZXRob2QKKyAgLy8vIG9yIEMgZnVuY3Rpb24gd2UncmUgaW4sIG90aGVyd2lzZSByZXR1cm4gbnVsbC4gIElmIHdlJ3JlIGN1cnJlbnRseQorICAvLy8gaW4gYSAnYmxvY2snLCB0aGlzIHJldHVybnMgdGhlIGNvbnRhaW5pbmcgY29udGV4dC4KKyAgTmFtZWREZWNsICpnZXRDdXJGdW5jdGlvbk9yTWV0aG9kRGVjbCgpOworCisgIC8vLyBBZGQgdGhpcyBkZWNsIHRvIHRoZSBzY29wZSBzaGFkb3dlZCBkZWNsIGNoYWlucy4KKyAgdm9pZCBQdXNoT25TY29wZUNoYWlucyhOYW1lZERlY2wgKkQsIFNjb3BlICpTLCBib29sIEFkZFRvQ29udGV4dCA9IHRydWUpOworCisgIC8vLyBcYnJpZWYgTWFrZSB0aGUgZ2l2ZW4gZXh0ZXJuYWxseS1wcm9kdWNlZCBkZWNsYXJhdGlvbiB2aXNpYmxlIGF0IHRoZQorICAvLy8gdG9wIGxldmVsIHNjb3BlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBEIFRoZSBleHRlcm5hbGx5LXByb2R1Y2VkIGRlY2xhcmF0aW9uIHRvIHB1c2guCisgIC8vLworICAvLy8gXHBhcmFtIE5hbWUgVGhlIG5hbWUgb2YgdGhlIGV4dGVybmFsbHktcHJvZHVjZWQgZGVjbGFyYXRpb24uCisgIHZvaWQgcHVzaEV4dGVybmFsRGVjbEludG9TY29wZShOYW1lZERlY2wgKkQsIERlY2xhcmF0aW9uTmFtZSBOYW1lKTsKKworICAvLy8gaXNEZWNsSW5TY29wZSAtIElmICdDdHgnIGlzIGEgZnVuY3Rpb24vbWV0aG9kLCBpc0RlY2xJblNjb3BlIHJldHVybnMgdHJ1ZQorICAvLy8gaWYgJ0QnIGlzIGluIFNjb3BlICdTJywgb3RoZXJ3aXNlICdTJyBpcyBpZ25vcmVkIGFuZCBpc0RlY2xJblNjb3BlIHJldHVybnMKKyAgLy8vIHRydWUgaWYgJ0QnIGJlbG9uZ3MgdG8gdGhlIGdpdmVuIGRlY2xhcmF0aW9uIGNvbnRleHQuCisgIC8vLworICAvLy8gXHBhcmFtIEFsbG93SW5saW5lTmFtZXNwYWNlIElmIFxjIHRydWUsIGFsbG93IHRoZSBkZWNsYXJhdGlvbiB0byBiZSBpbiB0aGUKKyAgLy8vICAgICAgICBlbmNsb3NpbmcgbmFtZXNwYWNlIHNldCBvZiB0aGUgY29udGV4dCwgcmF0aGVyIHRoYW4gY29udGFpbmVkCisgIC8vLyAgICAgICAgZGlyZWN0bHkgd2l0aGluIGl0LgorICBib29sIGlzRGVjbEluU2NvcGUoTmFtZWREZWNsICpELCBEZWNsQ29udGV4dCAqQ3R4LCBTY29wZSAqUyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93SW5saW5lTmFtZXNwYWNlID0gZmFsc2UpOworCisgIC8vLyBGaW5kcyB0aGUgc2NvcGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZGVjbCBjb250ZXh0LCBpZiBpdAorICAvLy8gaGFwcGVucyB0byBiZSBhbiBlbmNsb3Npbmcgc2NvcGUuICBPdGhlcndpc2UgcmV0dXJuIE5VTEwuCisgIHN0YXRpYyBTY29wZSAqZ2V0U2NvcGVGb3JEZWNsQ29udGV4dChTY29wZSAqUywgRGVjbENvbnRleHQgKkRDKTsKKworICAvLy8gU3Vicm91dGluZXMgb2YgQWN0T25EZWNsYXJhdG9yKCkuCisgIFR5cGVkZWZEZWNsICpQYXJzZVR5cGVkZWZEZWNsKFNjb3BlICpTLCBEZWNsYXJhdG9yICZELCBRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqVEluZm8pOworICBib29sIGlzSW5jb21wYXRpYmxlVHlwZWRlZihUeXBlRGVjbCAqT2xkLCBUeXBlZGVmTmFtZURlY2wgKk5ldyk7CisKKyAgLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIGtpbmQgb2YgbWVyZ2UgdG8gcGVyZm9ybSBmb3IgYXZhaWxhYmlsaXR5CisgIC8vLyBhdHRyaWJ1dGVzIChpbmNsdWRpbmcgImRlcHJlY2F0ZWQiLCAidW5hdmFpbGFibGUiLCBhbmQgImF2YWlsYWJpbGl0eSIpLgorICBlbnVtIEF2YWlsYWJpbGl0eU1lcmdlS2luZCB7CisgICAgLy8vIFxicmllZiBEb24ndCBtZXJnZSBhdmFpbGFiaWxpdHkgYXR0cmlidXRlcyBhdCBhbGwuCisgICAgQU1LX05vbmUsCisgICAgLy8vIFxicmllZiBNZXJnZSBhdmFpbGFiaWxpdHkgYXR0cmlidXRlcyBmb3IgYSByZWRlY2xhcmF0aW9uLCB3aGljaCByZXF1aXJlcworICAgIC8vLyBhbiBleGFjdCBtYXRjaC4KKyAgICBBTUtfUmVkZWNsYXJhdGlvbiwKKyAgICAvLy8gXGJyaWVmIE1lcmdlIGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGVzIGZvciBhbiBvdmVycmlkZSwgd2hpY2ggcmVxdWlyZXMKKyAgICAvLy8gYW4gZXhhY3QgbWF0Y2ggb3IgYSB3ZWFrZW5pbmcgb2YgY29uc3RyYWludHMuCisgICAgQU1LX092ZXJyaWRlLAorICAgIC8vLyBcYnJpZWYgTWVyZ2UgYXZhaWxhYmlsaXR5IGF0dHJpYnV0ZXMgZm9yIGFuIGltcGxlbWVudGF0aW9uIG9mCisgICAgLy8vIGEgcHJvdG9jb2wgcmVxdWlyZW1lbnQuCisgICAgQU1LX1Byb3RvY29sSW1wbGVtZW50YXRpb24sCisgIH07CisKKyAgLy8vIEF0dHJpYnV0ZSBtZXJnaW5nIG1ldGhvZHMuIFJldHVybiB0cnVlIGlmIGEgbmV3IGF0dHJpYnV0ZSB3YXMgYWRkZWQuCisgIEF2YWlsYWJpbGl0eUF0dHIgKm1lcmdlQXZhaWxhYmlsaXR5QXR0cihOYW1lZERlY2wgKkQsIFNvdXJjZVJhbmdlIFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKlBsYXRmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbXBsaWNpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25UdXBsZSBJbnRyb2R1Y2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvblR1cGxlIERlcHJlY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uVHVwbGUgT2Jzb2xldGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1VuYXZhaWxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzU3RyaWN0LCBTdHJpbmdSZWYgUmVwbGFjZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmFpbGFiaWxpdHlNZXJnZUtpbmQgQU1LLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXR0clNwZWxsaW5nTGlzdEluZGV4KTsKKyAgVHlwZVZpc2liaWxpdHlBdHRyICptZXJnZVR5cGVWaXNpYmlsaXR5QXR0cihEZWNsICpELCBTb3VyY2VSYW5nZSBSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVWaXNpYmlsaXR5QXR0cjo6VmlzaWJpbGl0eVR5cGUgVmlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEF0dHJTcGVsbGluZ0xpc3RJbmRleCk7CisgIFZpc2liaWxpdHlBdHRyICptZXJnZVZpc2liaWxpdHlBdHRyKERlY2wgKkQsIFNvdXJjZVJhbmdlIFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXNpYmlsaXR5QXR0cjo6VmlzaWJpbGl0eVR5cGUgVmlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBdHRyU3BlbGxpbmdMaXN0SW5kZXgpOworICBVdWlkQXR0ciAqbWVyZ2VVdWlkQXR0cihEZWNsICpELCBTb3VyY2VSYW5nZSBSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXR0clNwZWxsaW5nTGlzdEluZGV4LCBTdHJpbmdSZWYgVXVpZCk7CisgIERMTEltcG9ydEF0dHIgKm1lcmdlRExMSW1wb3J0QXR0cihEZWNsICpELCBTb3VyY2VSYW5nZSBSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEF0dHJTcGVsbGluZ0xpc3RJbmRleCk7CisgIERMTEV4cG9ydEF0dHIgKm1lcmdlRExMRXhwb3J0QXR0cihEZWNsICpELCBTb3VyY2VSYW5nZSBSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEF0dHJTcGVsbGluZ0xpc3RJbmRleCk7CisgIE1TSW5oZXJpdGFuY2VBdHRyICoKKyAgbWVyZ2VNU0luaGVyaXRhbmNlQXR0cihEZWNsICpELCBTb3VyY2VSYW5nZSBSYW5nZSwgYm9vbCBCZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBdHRyU3BlbGxpbmdMaXN0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgTVNJbmhlcml0YW5jZUF0dHI6OlNwZWxsaW5nIFNlbWFudGljU3BlbGxpbmcpOworICBGb3JtYXRBdHRyICptZXJnZUZvcm1hdEF0dHIoRGVjbCAqRCwgU291cmNlUmFuZ2UgUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqRm9ybWF0LCBpbnQgRm9ybWF0SWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEZpcnN0QXJnLCB1bnNpZ25lZCBBdHRyU3BlbGxpbmdMaXN0SW5kZXgpOworICBTZWN0aW9uQXR0ciAqbWVyZ2VTZWN0aW9uQXR0cihEZWNsICpELCBTb3VyY2VSYW5nZSBSYW5nZSwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEF0dHJTcGVsbGluZ0xpc3RJbmRleCk7CisgIEFsd2F5c0lubGluZUF0dHIgKm1lcmdlQWx3YXlzSW5saW5lQXR0cihEZWNsICpELCBTb3VyY2VSYW5nZSBSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpJZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEF0dHJTcGVsbGluZ0xpc3RJbmRleCk7CisgIE1pblNpemVBdHRyICptZXJnZU1pblNpemVBdHRyKERlY2wgKkQsIFNvdXJjZVJhbmdlIFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBdHRyU3BlbGxpbmdMaXN0SW5kZXgpOworICBPcHRpbWl6ZU5vbmVBdHRyICptZXJnZU9wdGltaXplTm9uZUF0dHIoRGVjbCAqRCwgU291cmNlUmFuZ2UgUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBdHRyU3BlbGxpbmdMaXN0SW5kZXgpOworICBJbnRlcm5hbExpbmthZ2VBdHRyICptZXJnZUludGVybmFsTGlua2FnZUF0dHIoRGVjbCAqRCwgU291cmNlUmFuZ2UgUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBdHRyU3BlbGxpbmdMaXN0SW5kZXgpOworICBDb21tb25BdHRyICptZXJnZUNvbW1vbkF0dHIoRGVjbCAqRCwgU291cmNlUmFuZ2UgUmFuZ2UsIElkZW50aWZpZXJJbmZvICpJZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEF0dHJTcGVsbGluZ0xpc3RJbmRleCk7CisKKyAgdm9pZCBtZXJnZURlY2xBdHRyaWJ1dGVzKE5hbWVkRGVjbCAqTmV3LCBEZWNsICpPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmFpbGFiaWxpdHlNZXJnZUtpbmQgQU1LID0gQU1LX1JlZGVjbGFyYXRpb24pOworICB2b2lkIE1lcmdlVHlwZWRlZk5hbWVEZWNsKFNjb3BlICpTLCBUeXBlZGVmTmFtZURlY2wgKk5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29rdXBSZXN1bHQgJk9sZERlY2xzKTsKKyAgYm9vbCBNZXJnZUZ1bmN0aW9uRGVjbChGdW5jdGlvbkRlY2wgKk5ldywgTmFtZWREZWNsIComT2xkLCBTY29wZSAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE1lcmdlVHlwZVdpdGhPbGQpOworICBib29sIE1lcmdlQ29tcGF0aWJsZUZ1bmN0aW9uRGVjbHMoRnVuY3Rpb25EZWNsICpOZXcsIEZ1bmN0aW9uRGVjbCAqT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NvcGUgKlMsIGJvb2wgTWVyZ2VUeXBlV2l0aE9sZCk7CisgIHZvaWQgbWVyZ2VPYmpDTWV0aG9kRGVjbHMoT2JqQ01ldGhvZERlY2wgKk5ldywgT2JqQ01ldGhvZERlY2wgKk9sZCk7CisgIHZvaWQgTWVyZ2VWYXJEZWNsKFZhckRlY2wgKk5ldywgTG9va3VwUmVzdWx0ICZQcmV2aW91cyk7CisgIHZvaWQgTWVyZ2VWYXJEZWNsVHlwZXMoVmFyRGVjbCAqTmV3LCBWYXJEZWNsICpPbGQsIGJvb2wgTWVyZ2VUeXBlV2l0aE9sZCk7CisgIHZvaWQgTWVyZ2VWYXJEZWNsRXhjZXB0aW9uU3BlY3MoVmFyRGVjbCAqTmV3LCBWYXJEZWNsICpPbGQpOworICBib29sIGNoZWNrVmFyRGVjbFJlZGVmaW5pdGlvbihWYXJEZWNsICpPbGREZWZuLCBWYXJEZWNsICpOZXdEZWZuKTsKKyAgdm9pZCBub3RlUHJldmlvdXNEZWZpbml0aW9uKGNvbnN0IE5hbWVkRGVjbCAqT2xkLCBTb3VyY2VMb2NhdGlvbiBOZXcpOworICBib29sIE1lcmdlQ1hYRnVuY3Rpb25EZWNsKEZ1bmN0aW9uRGVjbCAqTmV3LCBGdW5jdGlvbkRlY2wgKk9sZCwgU2NvcGUgKlMpOworCisgIC8vIEFzc2lnbm1lbnRBY3Rpb24gLSBUaGlzIGlzIHVzZWQgYnkgYWxsIHRoZSBhc3NpZ25tZW50IGRpYWdub3N0aWMgZnVuY3Rpb25zCisgIC8vIHRvIHJlcHJlc2VudCB3aGF0IGlzIGFjdHVhbGx5IGNhdXNpbmcgdGhlIG9wZXJhdGlvbgorICBlbnVtIEFzc2lnbm1lbnRBY3Rpb24geworICAgIEFBX0Fzc2lnbmluZywKKyAgICBBQV9QYXNzaW5nLAorICAgIEFBX1JldHVybmluZywKKyAgICBBQV9Db252ZXJ0aW5nLAorICAgIEFBX0luaXRpYWxpemluZywKKyAgICBBQV9TZW5kaW5nLAorICAgIEFBX0Nhc3RpbmcsCisgICAgQUFfUGFzc2luZ19DRkF1ZGl0ZWQKKyAgfTsKKworICAvLy8gQysrIE92ZXJsb2FkaW5nLgorICBlbnVtIE92ZXJsb2FkS2luZCB7CisgICAgLy8vIFRoaXMgaXMgYSBsZWdpdGltYXRlIG92ZXJsb2FkOiB0aGUgZXhpc3RpbmcgZGVjbGFyYXRpb25zIGFyZQorICAgIC8vLyBmdW5jdGlvbnMgb3IgZnVuY3Rpb24gdGVtcGxhdGVzIHdpdGggZGlmZmVyZW50IHNpZ25hdHVyZXMuCisgICAgT3ZsX092ZXJsb2FkLAorCisgICAgLy8vIFRoaXMgaXMgbm90IGFuIG92ZXJsb2FkIGJlY2F1c2UgdGhlIHNpZ25hdHVyZSBleGFjdGx5IG1hdGNoZXMKKyAgICAvLy8gYW4gZXhpc3RpbmcgZGVjbGFyYXRpb24uCisgICAgT3ZsX01hdGNoLAorCisgICAgLy8vIFRoaXMgaXMgbm90IGFuIG92ZXJsb2FkIGJlY2F1c2UgdGhlIGxvb2t1cCByZXN1bHRzIGNvbnRhaW4gYQorICAgIC8vLyBub24tZnVuY3Rpb24uCisgICAgT3ZsX05vbkZ1bmN0aW9uCisgIH07CisgIE92ZXJsb2FkS2luZCBDaGVja092ZXJsb2FkKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkRlY2wgKk5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9va3VwUmVzdWx0ICZPbGREZWNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsIComT2xkRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0ZvclVzaW5nRGVjbCk7CisgIGJvb2wgSXNPdmVybG9hZChGdW5jdGlvbkRlY2wgKk5ldywgRnVuY3Rpb25EZWNsICpPbGQsIGJvb2wgSXNGb3JVc2luZ0RlY2wsCisgICAgICAgICAgICAgICAgICBib29sIENvbnNpZGVyQ3VkYUF0dHJzID0gdHJ1ZSk7CisKKyAgLy8vIFxicmllZiBDaGVja3MgYXZhaWxhYmlsaXR5IG9mIHRoZSBmdW5jdGlvbiBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQKKyAgLy8vIGZ1bmN0aW9uIGNvbnRleHQuSW5zaWRlIGFuIHVuYXZhaWxhYmxlIGZ1bmN0aW9uLHVuYXZhaWxhYmlsaXR5IGlzIGlnbm9yZWQuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBccCBGRCBpcyB1bmF2YWlsYWJsZSBhbmQgY3VycmVudCBjb250ZXh0IGlzIGluc2lkZQorICAvLy8gYW4gYXZhaWxhYmxlIGZ1bmN0aW9uLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgaXNGdW5jdGlvbkNvbnNpZGVyZWRVbmF2YWlsYWJsZShGdW5jdGlvbkRlY2wgKkZEKTsKKworICBJbXBsaWNpdENvbnZlcnNpb25TZXF1ZW5jZQorICBUcnlJbXBsaWNpdENvbnZlcnNpb24oRXhwciAqRnJvbSwgUXVhbFR5cGUgVG9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTdXBwcmVzc1VzZXJDb252ZXJzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dFeHBsaWNpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5PdmVybG9hZFJlc29sdXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIENTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dPYmpDV3JpdGViYWNrQ29udmVyc2lvbik7CisKKyAgYm9vbCBJc0ludGVncmFsUHJvbW90aW9uKEV4cHIgKkZyb20sIFF1YWxUeXBlIEZyb21UeXBlLCBRdWFsVHlwZSBUb1R5cGUpOworICBib29sIElzRmxvYXRpbmdQb2ludFByb21vdGlvbihRdWFsVHlwZSBGcm9tVHlwZSwgUXVhbFR5cGUgVG9UeXBlKTsKKyAgYm9vbCBJc0NvbXBsZXhQcm9tb3Rpb24oUXVhbFR5cGUgRnJvbVR5cGUsIFF1YWxUeXBlIFRvVHlwZSk7CisgIGJvb2wgSXNQb2ludGVyQ29udmVyc2lvbihFeHByICpGcm9tLCBRdWFsVHlwZSBGcm9tVHlwZSwgUXVhbFR5cGUgVG9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbk92ZXJsb2FkUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlJiBDb252ZXJ0ZWRUeXBlLCBib29sICZJbmNvbXBhdGlibGVPYmpDKTsKKyAgYm9vbCBpc09iakNQb2ludGVyQ29udmVyc2lvbihRdWFsVHlwZSBGcm9tVHlwZSwgUXVhbFR5cGUgVG9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlJiBDb252ZXJ0ZWRUeXBlLCBib29sICZJbmNvbXBhdGlibGVPYmpDKTsKKyAgYm9vbCBpc09iakNXcml0ZWJhY2tDb252ZXJzaW9uKFF1YWxUeXBlIEZyb21UeXBlLCBRdWFsVHlwZSBUb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSAmQ29udmVydGVkVHlwZSk7CisgIGJvb2wgSXNCbG9ja1BvaW50ZXJDb252ZXJzaW9uKFF1YWxUeXBlIEZyb21UeXBlLCBRdWFsVHlwZSBUb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlJiBDb252ZXJ0ZWRUeXBlKTsKKyAgYm9vbCBGdW5jdGlvblBhcmFtVHlwZXNBcmVFcXVhbChjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqT2xkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqTmV3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqQXJnUG9zID0gbnVsbHB0cik7CisgIHZvaWQgSGFuZGxlRnVuY3Rpb25UeXBlTWlzbWF0Y2goUGFydGlhbERpYWdub3N0aWMgJlBEaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIEZyb21UeXBlLCBRdWFsVHlwZSBUb1R5cGUpOworCisgIHZvaWQgbWF5YmVFeHRlbmRCbG9ja09iamVjdChFeHByUmVzdWx0ICZFKTsKKyAgQ2FzdEtpbmQgUHJlcGFyZUNhc3RUb09iakNPYmplY3RQb2ludGVyKEV4cHJSZXN1bHQgJkUpOworICBib29sIENoZWNrUG9pbnRlckNvbnZlcnNpb24oRXhwciAqRnJvbSwgUXVhbFR5cGUgVG9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzdEtpbmQgJktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhDYXN0UGF0aCYgQmFzZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElnbm9yZUJhc2VBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpYWdub3NlID0gdHJ1ZSk7CisgIGJvb2wgSXNNZW1iZXJQb2ludGVyQ29udmVyc2lvbihFeHByICpGcm9tLCBRdWFsVHlwZSBGcm9tVHlwZSwgUXVhbFR5cGUgVG9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbk92ZXJsb2FkUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlICZDb252ZXJ0ZWRUeXBlKTsKKyAgYm9vbCBDaGVja01lbWJlclBvaW50ZXJDb252ZXJzaW9uKEV4cHIgKkZyb20sIFF1YWxUeXBlIFRvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3RLaW5kICZLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ2FzdFBhdGggJkJhc2VQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJZ25vcmVCYXNlQWNjZXNzKTsKKyAgYm9vbCBJc1F1YWxpZmljYXRpb25Db252ZXJzaW9uKFF1YWxUeXBlIEZyb21UeXBlLCBRdWFsVHlwZSBUb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENTdHlsZSwgYm9vbCAmT2JqQ0xpZmV0aW1lQ29udmVyc2lvbik7CisgIGJvb2wgSXNGdW5jdGlvbkNvbnZlcnNpb24oUXVhbFR5cGUgRnJvbVR5cGUsIFF1YWxUeXBlIFRvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSAmUmVzdWx0VHkpOworICBib29sIERpYWdub3NlTXVsdGlwbGVVc2VyRGVmaW5lZENvbnZlcnNpb24oRXhwciAqRnJvbSwgUXVhbFR5cGUgVG9UeXBlKTsKKyAgYm9vbCBpc1NhbWVPckNvbXBhdGlibGVGdW5jdGlvblR5cGUoQ2FuUXVhbFR5cGUgUGFyYW0sIENhblF1YWxUeXBlIEFyZyk7CisKKyAgRXhwclJlc3VsdCBQZXJmb3JtTW92ZU9yQ29weUluaXRpYWxpemF0aW9uKGNvbnN0IEluaXRpYWxpemVkRW50aXR5ICZFbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYXJEZWNsICpOUlZPQ2FuZGlkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgUmVzdWx0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKlZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd05SVk8gPSB0cnVlKTsKKworICBib29sIENhblBlcmZvcm1Db3B5SW5pdGlhbGl6YXRpb24oY29uc3QgSW5pdGlhbGl6ZWRFbnRpdHkgJkVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJSZXN1bHQgSW5pdCk7CisgIEV4cHJSZXN1bHQgUGVyZm9ybUNvcHlJbml0aWFsaXphdGlvbihjb25zdCBJbml0aWFsaXplZEVudGl0eSAmRW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRXF1YWxMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByUmVzdWx0IEluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFRvcExldmVsT2ZJbml0TGlzdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0V4cGxpY2l0ID0gZmFsc2UpOworICBFeHByUmVzdWx0IFBlcmZvcm1PYmplY3RBcmd1bWVudEluaXRpYWxpemF0aW9uKEV4cHIgKkZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllciAqUXVhbGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkRGVjbCAqRm91bmREZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWE1ldGhvZERlY2wgKk1ldGhvZCk7CisKKyAgRXhwclJlc3VsdCBQZXJmb3JtQ29udGV4dHVhbGx5Q29udmVydFRvQm9vbChFeHByICpGcm9tKTsKKyAgRXhwclJlc3VsdCBQZXJmb3JtQ29udGV4dHVhbGx5Q29udmVydFRvT2JqQ1BvaW50ZXIoRXhwciAqRnJvbSk7CisKKyAgLy8vIENvbnRleHRzIGluIHdoaWNoIGEgY29udmVydGVkIGNvbnN0YW50IGV4cHJlc3Npb24gaXMgcmVxdWlyZWQuCisgIGVudW0gQ0NFS2luZCB7CisgICAgQ0NFS19DYXNlVmFsdWUsICAgLy8vPCBFeHByZXNzaW9uIGluIGEgY2FzZSBsYWJlbC4KKyAgICBDQ0VLX0VudW1lcmF0b3IsICAvLy88IEVudW1lcmF0b3IgdmFsdWUgd2l0aCBmaXhlZCB1bmRlcmx5aW5nIHR5cGUuCisgICAgQ0NFS19UZW1wbGF0ZUFyZywgLy8vPCBWYWx1ZSBvZiBhIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlci4KKyAgICBDQ0VLX05ld0V4cHIsICAgICAvLy88IENvbnN0YW50IGV4cHJlc3Npb24gaW4gYSBub3B0ci1uZXctZGVjbGFyYXRvci4KKyAgICBDQ0VLX0NvbnN0ZXhwcklmICAvLy88IENvbmRpdGlvbiBpbiBhIGNvbnN0ZXhwciBpZiBzdGF0ZW1lbnQuCisgIH07CisgIEV4cHJSZXN1bHQgQ2hlY2tDb252ZXJ0ZWRDb25zdGFudEV4cHJlc3Npb24oRXhwciAqRnJvbSwgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBUFNJbnQgJlZhbHVlLCBDQ0VLaW5kIENDRSk7CisgIEV4cHJSZXN1bHQgQ2hlY2tDb252ZXJ0ZWRDb25zdGFudEV4cHJlc3Npb24oRXhwciAqRnJvbSwgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUFZhbHVlICZWYWx1ZSwgQ0NFS2luZCBDQ0UpOworCisgIC8vLyBcYnJpZWYgQWJzdHJhY3QgYmFzZSBjbGFzcyB1c2VkIHRvIHBlcmZvcm0gYSBjb250ZXh0dWFsIGltcGxpY2l0CisgIC8vLyBjb252ZXJzaW9uIGZyb20gYW4gZXhwcmVzc2lvbiB0byBhbnkgdHlwZSBwYXNzaW5nIGEgZmlsdGVyLgorICBjbGFzcyBDb250ZXh0dWFsSW1wbGljaXRDb252ZXJ0ZXIgeworICBwdWJsaWM6CisgICAgYm9vbCBTdXBwcmVzczsKKyAgICBib29sIFN1cHByZXNzQ29udmVyc2lvbjsKKworICAgIENvbnRleHR1YWxJbXBsaWNpdENvbnZlcnRlcihib29sIFN1cHByZXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3VwcHJlc3NDb252ZXJzaW9uID0gZmFsc2UpCisgICAgICAgIDogU3VwcHJlc3MoU3VwcHJlc3MpLCBTdXBwcmVzc0NvbnZlcnNpb24oU3VwcHJlc3NDb252ZXJzaW9uKSB7fQorCisgICAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgYSB2YWxpZCBkZXN0aW5hdGlvbiB0eXBlCisgICAgLy8vIGZvciB0aGlzIGNvbnZlcnNpb24uCisgICAgdmlydHVhbCBib29sIG1hdGNoKFF1YWxUeXBlIFQpID0gMDsKKworICAgIC8vLyBcYnJpZWYgRW1pdHMgYSBkaWFnbm9zdGljIGNvbXBsYWluaW5nIHRoYXQgdGhlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZQorICAgIC8vLyBpbnRlZ3JhbCBvciBlbnVtZXJhdGlvbiB0eXBlLgorICAgIHZpcnR1YWwgU2VtYURpYWdub3N0aWNCdWlsZGVyCisgICAgZGlhZ25vc2VOb01hdGNoKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCkgPSAwOworCisgICAgLy8vIFxicmllZiBFbWl0cyBhIGRpYWdub3N0aWMgd2hlbiB0aGUgZXhwcmVzc2lvbiBoYXMgaW5jb21wbGV0ZSBjbGFzcyB0eXBlLgorICAgIHZpcnR1YWwgU2VtYURpYWdub3N0aWNCdWlsZGVyCisgICAgZGlhZ25vc2VJbmNvbXBsZXRlKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCkgPSAwOworCisgICAgLy8vIFxicmllZiBFbWl0cyBhIGRpYWdub3N0aWMgd2hlbiB0aGUgb25seSBtYXRjaGluZyBjb252ZXJzaW9uIGZ1bmN0aW9uCisgICAgLy8vIGlzIGV4cGxpY2l0LgorICAgIHZpcnR1YWwgU2VtYURpYWdub3N0aWNCdWlsZGVyIGRpYWdub3NlRXhwbGljaXRDb252KAorICAgICAgICBTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQsIFF1YWxUeXBlIENvbnZUeSkgPSAwOworCisgICAgLy8vIFxicmllZiBFbWl0cyBhIG5vdGUgZm9yIHRoZSBleHBsaWNpdCBjb252ZXJzaW9uIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgU2VtYURpYWdub3N0aWNCdWlsZGVyCisgICAgbm90ZUV4cGxpY2l0Q29udihTZW1hICZTLCBDWFhDb252ZXJzaW9uRGVjbCAqQ29udiwgUXVhbFR5cGUgQ29udlR5KSA9IDA7CisKKyAgICAvLy8gXGJyaWVmIEVtaXRzIGEgZGlhZ25vc3RpYyB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBwb3NzaWJsZSBjb252ZXJzaW9uCisgICAgLy8vIGZ1bmN0aW9ucy4KKyAgICB2aXJ0dWFsIFNlbWFEaWFnbm9zdGljQnVpbGRlcgorICAgIGRpYWdub3NlQW1iaWd1b3VzKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCkgPSAwOworCisgICAgLy8vIFxicmllZiBFbWl0cyBhIG5vdGUgZm9yIG9uZSBvZiB0aGUgY2FuZGlkYXRlIGNvbnZlcnNpb25zLgorICAgIHZpcnR1YWwgU2VtYURpYWdub3N0aWNCdWlsZGVyCisgICAgbm90ZUFtYmlndW91cyhTZW1hICZTLCBDWFhDb252ZXJzaW9uRGVjbCAqQ29udiwgUXVhbFR5cGUgQ29udlR5KSA9IDA7CisKKyAgICAvLy8gXGJyaWVmIEVtaXRzIGEgZGlhZ25vc3RpYyB3aGVuIHdlIHBpY2tlZCBhIGNvbnZlcnNpb24gZnVuY3Rpb24KKyAgICAvLy8gKGZvciBjYXNlcyB3aGVuIHdlIGFyZSBub3QgYWxsb3dlZCB0byBwaWNrIGEgY29udmVyc2lvbiBmdW5jdGlvbikuCisgICAgdmlydHVhbCBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgZGlhZ25vc2VDb252ZXJzaW9uKAorICAgICAgICBTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQsIFF1YWxUeXBlIENvbnZUeSkgPSAwOworCisgICAgdmlydHVhbCB+Q29udGV4dHVhbEltcGxpY2l0Q29udmVydGVyKCkge30KKyAgfTsKKworICBjbGFzcyBJQ0VDb252ZXJ0RGlhZ25vc2VyIDogcHVibGljIENvbnRleHR1YWxJbXBsaWNpdENvbnZlcnRlciB7CisgICAgYm9vbCBBbGxvd1Njb3BlZEVudW1lcmF0aW9uczsKKworICBwdWJsaWM6CisgICAgSUNFQ29udmVydERpYWdub3Nlcihib29sIEFsbG93U2NvcGVkRW51bWVyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTdXBwcmVzcywgYm9vbCBTdXBwcmVzc0NvbnZlcnNpb24pCisgICAgICAgIDogQ29udGV4dHVhbEltcGxpY2l0Q29udmVydGVyKFN1cHByZXNzLCBTdXBwcmVzc0NvbnZlcnNpb24pLAorICAgICAgICAgIEFsbG93U2NvcGVkRW51bWVyYXRpb25zKEFsbG93U2NvcGVkRW51bWVyYXRpb25zKSB7fQorCisgICAgLy8vIE1hdGNoIGFuIGludGVncmFsIG9yIChwb3NzaWJseSBzY29wZWQpIGVudW1lcmF0aW9uIHR5cGUuCisgICAgYm9vbCBtYXRjaChRdWFsVHlwZSBUKSBvdmVycmlkZTsKKworICAgIFNlbWFEaWFnbm9zdGljQnVpbGRlcgorICAgIGRpYWdub3NlTm9NYXRjaChTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQpIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBkaWFnbm9zZU5vdEludChTLCBMb2MsIFQpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgRW1pdHMgYSBkaWFnbm9zdGljIGNvbXBsYWluaW5nIHRoYXQgdGhlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZQorICAgIC8vLyBpbnRlZ3JhbCBvciBlbnVtZXJhdGlvbiB0eXBlLgorICAgIHZpcnR1YWwgU2VtYURpYWdub3N0aWNCdWlsZGVyCisgICAgZGlhZ25vc2VOb3RJbnQoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBUKSA9IDA7CisgIH07CisKKyAgLy8vIFBlcmZvcm0gYSBjb250ZXh0dWFsIGltcGxpY2l0IGNvbnZlcnNpb24uCisgIEV4cHJSZXN1bHQgUGVyZm9ybUNvbnRleHR1YWxJbXBsaWNpdENvbnZlcnNpb24oCisgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsIEV4cHIgKkZyb21FLCBDb250ZXh0dWFsSW1wbGljaXRDb252ZXJ0ZXIgJkNvbnZlcnRlcik7CisKKworICBlbnVtIE9iakNTdWJzY3JpcHRLaW5kIHsKKyAgICBPU19BcnJheSwKKyAgICBPU19EaWN0aW9uYXJ5LAorICAgIE9TX0Vycm9yCisgIH07CisgIE9iakNTdWJzY3JpcHRLaW5kIENoZWNrU3Vic2NyaXB0aW5nS2luZChFeHByICpGcm9tRSk7CisKKyAgLy8gTm90ZSB0aGF0IExLX1N0cmluZyBpcyBpbnRlbnRpb25hbGx5IGFmdGVyIHRoZSBvdGhlciBsaXRlcmFscywgYXMKKyAgLy8gdGhpcyBpcyB1c2VkIGZvciBkaWFnbm9zdGljcyBsb2dpYy4KKyAgZW51bSBPYmpDTGl0ZXJhbEtpbmQgeworICAgIExLX0FycmF5LAorICAgIExLX0RpY3Rpb25hcnksCisgICAgTEtfTnVtZXJpYywKKyAgICBMS19Cb3hlZCwKKyAgICBMS19TdHJpbmcsCisgICAgTEtfQmxvY2ssCisgICAgTEtfTm9uZQorICB9OworICBPYmpDTGl0ZXJhbEtpbmQgQ2hlY2tMaXRlcmFsS2luZChFeHByICpGcm9tRSk7CisKKyAgRXhwclJlc3VsdCBQZXJmb3JtT2JqZWN0TWVtYmVyQ29udmVyc2lvbihFeHByICpGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKlF1YWxpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKkZvdW5kRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKk1lbWJlcik7CisKKyAgLy8gTWVtYmVycyBoYXZlIHRvIGJlIE5hbWVzcGFjZURlY2wqIG9yIFRyYW5zbGF0aW9uVW5pdERlY2wqLgorICAvLyBUT0RPOiBtYWtlIHRoaXMgaXMgYSB0eXBlc2FmZSB1bmlvbi4KKyAgdHlwZWRlZiBsbHZtOjpTbWFsbFNldFZlY3RvcjxEZWNsQ29udGV4dCAgICosIDE2PiBBc3NvY2lhdGVkTmFtZXNwYWNlU2V0OworICB0eXBlZGVmIGxsdm06OlNtYWxsU2V0VmVjdG9yPENYWFJlY29yZERlY2wgKiwgMTY+IEFzc29jaWF0ZWRDbGFzc1NldDsKKworICB2b2lkIEFkZE92ZXJsb2FkQ2FuZGlkYXRlKEZ1bmN0aW9uRGVjbCAqRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbEFjY2Vzc1BhaXIgRm91bmREZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVybG9hZENhbmRpZGF0ZVNldCAmQ2FuZGlkYXRlU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3VwcHJlc3NVc2VyQ29udmVyc2lvbnMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFBhcnRpYWxPdmVybG9hZGluZyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dFeHBsaWNpdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnNpb25TZXF1ZW5jZUxpc3QgRWFybHlDb252ZXJzaW9ucyA9IE5vbmUpOworICB2b2lkIEFkZEZ1bmN0aW9uQ2FuZGlkYXRlcyhjb25zdCBVbnJlc29sdmVkU2V0SW1wbCAmRnVuY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICBPdmVybG9hZENhbmRpZGF0ZVNldCAmQ2FuZGlkYXRlU2V0LAorICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqRXhwbGljaXRUZW1wbGF0ZUFyZ3MgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3VwcHJlc3NVc2VyQ29udmVyc2lvbnMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIFBhcnRpYWxPdmVybG9hZGluZyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRmlyc3RBcmd1bWVudElzQmFzZSA9IGZhbHNlKTsKKyAgdm9pZCBBZGRNZXRob2RDYW5kaWRhdGUoRGVjbEFjY2Vzc1BhaXIgRm91bmREZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBPYmplY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByOjpDbGFzc2lmaWNhdGlvbiBPYmplY3RDbGFzc2lmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVybG9hZENhbmRpZGF0ZVNldCYgQ2FuZGlkYXRlU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFN1cHByZXNzVXNlckNvbnZlcnNpb24gPSBmYWxzZSk7CisgIHZvaWQgQWRkTWV0aG9kQ2FuZGlkYXRlKENYWE1ldGhvZERlY2wgKk1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbEFjY2Vzc1BhaXIgRm91bmREZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhSZWNvcmREZWNsICpBY3RpbmdDb250ZXh0LCBRdWFsVHlwZSBPYmplY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByOjpDbGFzc2lmaWNhdGlvbiBPYmplY3RDbGFzc2lmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVybG9hZENhbmRpZGF0ZVNldCYgQ2FuZGlkYXRlU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFN1cHByZXNzVXNlckNvbnZlcnNpb25zID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUGFydGlhbE92ZXJsb2FkaW5nID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnNpb25TZXF1ZW5jZUxpc3QgRWFybHlDb252ZXJzaW9ucyA9IE5vbmUpOworICB2b2lkIEFkZE1ldGhvZFRlbXBsYXRlQ2FuZGlkYXRlKEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpNZXRob2RUbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xBY2Nlc3NQYWlyIEZvdW5kRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhSZWNvcmREZWNsICpBY3RpbmdDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICpFeHBsaWNpdFRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBPYmplY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHI6OkNsYXNzaWZpY2F0aW9uIE9iamVjdENsYXNzaWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVybG9hZENhbmRpZGF0ZVNldCYgQ2FuZGlkYXRlU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3VwcHJlc3NVc2VyQ29udmVyc2lvbnMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFBhcnRpYWxPdmVybG9hZGluZyA9IGZhbHNlKTsKKyAgdm9pZCBBZGRUZW1wbGF0ZU92ZXJsb2FkQ2FuZGlkYXRlKEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpGdW5jdGlvblRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbEFjY2Vzc1BhaXIgRm91bmREZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICpFeHBsaWNpdFRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJsb2FkQ2FuZGlkYXRlU2V0JiBDYW5kaWRhdGVTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFN1cHByZXNzVXNlckNvbnZlcnNpb25zID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFBhcnRpYWxPdmVybG9hZGluZyA9IGZhbHNlKTsKKyAgYm9vbCBDaGVja05vbkRlcGVuZGVudENvbnZlcnNpb25zKEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpGdW5jdGlvblRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UXVhbFR5cGU+IFBhcmFtVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVybG9hZENhbmRpZGF0ZVNldCAmQ2FuZGlkYXRlU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvblNlcXVlbmNlTGlzdCAmQ29udmVyc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFN1cHByZXNzVXNlckNvbnZlcnNpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYUmVjb3JkRGVjbCAqQWN0aW5nQ29udGV4dCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBPYmplY3RUeXBlID0gUXVhbFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHI6OkNsYXNzaWZpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0Q2xhc3NpZmljYXRpb24gPSB7fSk7CisgIHZvaWQgQWRkQ29udmVyc2lvbkNhbmRpZGF0ZShDWFhDb252ZXJzaW9uRGVjbCAqQ29udmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xBY2Nlc3NQYWlyIEZvdW5kRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFJlY29yZERlY2wgKkFjdGluZ0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpGcm9tLCBRdWFsVHlwZSBUb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVybG9hZENhbmRpZGF0ZVNldCYgQ2FuZGlkYXRlU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd09iakNDb252ZXJzaW9uT25FeHBsaWNpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dSZXN1bHRDb252ZXJzaW9uID0gdHJ1ZSk7CisgIHZvaWQgQWRkVGVtcGxhdGVDb252ZXJzaW9uQ2FuZGlkYXRlKEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpGdW5jdGlvblRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsQWNjZXNzUGFpciBGb3VuZERlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFJlY29yZERlY2wgKkFjdGluZ0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkZyb20sIFF1YWxUeXBlIFRvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmxvYWRDYW5kaWRhdGVTZXQgJkNhbmRpZGF0ZVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd09iakNDb252ZXJzaW9uT25FeHBsaWNpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd1Jlc3VsdENvbnZlcnNpb24gPSB0cnVlKTsKKyAgdm9pZCBBZGRTdXJyb2dhdGVDYW5kaWRhdGUoQ1hYQ29udmVyc2lvbkRlY2wgKkNvbnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xBY2Nlc3NQYWlyIEZvdW5kRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYUmVjb3JkRGVjbCAqQWN0aW5nQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpPYmplY3QsIEFycmF5UmVmPEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmxvYWRDYW5kaWRhdGVTZXQmIENhbmRpZGF0ZVNldCk7CisgIHZvaWQgQWRkTWVtYmVyT3BlcmF0b3JDYW5kaWRhdGVzKE92ZXJsb2FkZWRPcGVyYXRvcktpbmQgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE9wTG9jLCBBcnJheVJlZjxFeHByICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJsb2FkQ2FuZGlkYXRlU2V0JiBDYW5kaWRhdGVTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIE9wUmFuZ2UgPSBTb3VyY2VSYW5nZSgpKTsKKyAgdm9pZCBBZGRCdWlsdGluQ2FuZGlkYXRlKFF1YWxUeXBlICpQYXJhbVR5cywgQXJyYXlSZWY8RXhwciAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmxvYWRDYW5kaWRhdGVTZXQmIENhbmRpZGF0ZVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNBc3NpZ25tZW50T3BlcmF0b3IgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNvbnRleHR1YWxCb29sQXJndW1lbnRzID0gMCk7CisgIHZvaWQgQWRkQnVpbHRpbk9wZXJhdG9yQ2FuZGlkYXRlcyhPdmVybG9hZGVkT3BlcmF0b3JLaW5kIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gT3BMb2MsIEFycmF5UmVmPEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJsb2FkQ2FuZGlkYXRlU2V0JiBDYW5kaWRhdGVTZXQpOworICB2b2lkIEFkZEFyZ3VtZW50RGVwZW5kZW50TG9va3VwQ2FuZGlkYXRlcyhEZWNsYXJhdGlvbk5hbWUgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqRXhwbGljaXRUZW1wbGF0ZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJsb2FkQ2FuZGlkYXRlU2V0JiBDYW5kaWRhdGVTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUGFydGlhbE92ZXJsb2FkaW5nID0gZmFsc2UpOworCisgIC8vIEVtaXQgYXMgYSAnbm90ZScgdGhlIHNwZWNpZmljIG92ZXJsb2FkIGNhbmRpZGF0ZQorICB2b2lkIE5vdGVPdmVybG9hZENhbmRpZGF0ZShOYW1lZERlY2wgKkZvdW5kLCBGdW5jdGlvbkRlY2wgKkZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBEZXN0VHlwZSA9IFF1YWxUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVGFraW5nQWRkcmVzcyA9IGZhbHNlKTsKKworICAvLyBFbWl0IGFzIGEgc2VyaWVzIG9mICdub3RlJ3MgYWxsIHRlbXBsYXRlIGFuZCBub24tdGVtcGxhdGVzIGlkZW50aWZpZWQgYnkKKyAgLy8gdGhlIGV4cHJlc3Npb24gRXhwcgorICB2b2lkIE5vdGVBbGxPdmVybG9hZENhbmRpZGF0ZXMoRXhwciAqRSwgUXVhbFR5cGUgRGVzdFR5cGUgPSBRdWFsVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBUYWtpbmdBZGRyZXNzID0gZmFsc2UpOworCisgIC8vLyBDaGVjayB0aGUgZW5hYmxlX2lmIGV4cHJlc3Npb25zIG9uIHRoZSBnaXZlbiBmdW5jdGlvbi4gUmV0dXJucyB0aGUgZmlyc3QKKyAgLy8vIGZhaWxpbmcgYXR0cmlidXRlLCBvciBOVUxMIGlmIHRoZXkgd2VyZSBhbGwgc3VjY2Vzc2Z1bC4KKyAgRW5hYmxlSWZBdHRyICpDaGVja0VuYWJsZUlmKEZ1bmN0aW9uRGVjbCAqRnVuY3Rpb24sIEFycmF5UmVmPEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTWlzc2luZ0ltcGxpY2l0VGhpcyA9IGZhbHNlKTsKKworICAvLy8gRmluZCB0aGUgZmFpbGVkIEJvb2xlYW4gY29uZGl0aW9uIHdpdGhpbiBhIGdpdmVuIEJvb2xlYW4KKyAgLy8vIGNvbnN0YW50IGV4cHJlc3Npb24sIGFuZCBkZXNjcmliZSBpdCB3aXRoIGEgc3RyaW5nLgorICAvLy8KKyAgLy8vIFxwYXJhbSBBbGxvd1RvcExldmVsQ29uZCBXaGV0aGVyIHRvIGFsbG93IHRoZSByZXN1bHQgdG8gYmUgdGhlCisgIC8vLyBjb21wbGV0ZSB0b3AtbGV2ZWwgY29uZGl0aW9uLgorICBzdGQ6OnBhaXI8RXhwciAqLCBzdGQ6OnN0cmluZz4KKyAgZmluZEZhaWxlZEJvb2xlYW5Db25kaXRpb24oRXhwciAqQ29uZCwgYm9vbCBBbGxvd1RvcExldmVsQ29uZCk7CisKKyAgLy8vIEVtaXQgZGlhZ25vc3RpY3MgZm9yIHRoZSBkaWFnbm9zZV9pZiBhdHRyaWJ1dGVzIG9uIEZ1bmN0aW9uLCBpZ25vcmluZyBhbnkKKyAgLy8vIG5vbi1BcmdEZXBlbmRlbnQgRGlhZ25vc2VJZkF0dHJzLgorICAvLy8KKyAgLy8vIEFyZ3VtZW50LWRlcGVuZGVudCBkaWFnbm9zZV9pZiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBjaGVja2VkIGVhY2ggdGltZSBhCisgIC8vLyBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgZGlyZWN0IGNhbGxlZSBvZiBhIGZ1bmN0aW9uIGNhbGwuCisgIC8vLworICAvLy8gUmV0dXJucyB0cnVlIGlmIGFueSBlcnJvcnMgd2VyZSBlbWl0dGVkLgorICBib29sIGRpYWdub3NlQXJnRGVwZW5kZW50RGlhZ25vc2VJZkF0dHJzKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqVGhpc0FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBFeHByICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKTsKKworICAvLy8gRW1pdCBkaWFnbm9zdGljcyBmb3IgdGhlIGRpYWdub3NlX2lmIGF0dHJpYnV0ZXMgb24gRnVuY3Rpb24sIGlnbm9yaW5nIGFueQorICAvLy8gQXJnRGVwZW5kZW50IERpYWdub3NlSWZBdHRycy4KKyAgLy8vCisgIC8vLyBBcmd1bWVudC1pbmRlcGVuZGVudCBkaWFnbm9zZV9pZiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBjaGVja2VkIG9uIGV2ZXJ5IHVzZQorICAvLy8gb2YgYSBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW55IGVycm9ycyB3ZXJlIGVtaXR0ZWQuCisgIGJvb2wgZGlhZ25vc2VBcmdJbmRlcGVuZGVudERpYWdub3NlSWZBdHRycyhjb25zdCBOYW1lZERlY2wgKk5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKTsKKworICAvLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBmdW5jdGlvbidzIGFkZHJlc3MgY2FuIGJlIHRha2VuIG9yIG5vdCwKKyAgLy8vIG9wdGlvbmFsbHkgZW1pdHRpbmcgYSBkaWFnbm9zdGljIGlmIHRoZSBhZGRyZXNzIGNhbid0IGJlIHRha2VuLgorICAvLy8KKyAgLy8vIFJldHVybnMgZmFsc2UgaWYgdGFraW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiBpcyBpbGxlZ2FsLgorICBib29sIGNoZWNrQWRkcmVzc09mRnVuY3Rpb25Jc0F2YWlsYWJsZShjb25zdCBGdW5jdGlvbkRlY2wgKkZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYyA9IFNvdXJjZUxvY2F0aW9uKCkpOworCisgIC8vIFtQb3NzaWJseUFGdW5jdGlvblR5cGVdICAtLT4gICBbUmV0dXJuXQorICAvLyBOb25GdW5jdGlvblR5cGUgLS0+IE5vbkZ1bmN0aW9uVHlwZQorICAvLyBSIChBKSAtLT4gUihBKQorICAvLyBSICgqKShBKSAtLT4gUiAoQSkKKyAgLy8gUiAoJikoQSkgLS0+IFIgKEEpCisgIC8vIFIgKFM6OiopKEEpIC0tPiBSIChBKQorICBRdWFsVHlwZSBFeHRyYWN0VW5xdWFsaWZpZWRGdW5jdGlvblR5cGUoUXVhbFR5cGUgUG9zc2libHlBRnVuY3Rpb25UeXBlKTsKKworICBGdW5jdGlvbkRlY2wgKgorICBSZXNvbHZlQWRkcmVzc09mT3ZlcmxvYWRlZEZ1bmN0aW9uKEV4cHIgKkFkZHJlc3NPZkV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVGFyZ2V0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xBY2Nlc3NQYWlyICZGb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpwSGFkTXVsdGlwbGVDYW5kaWRhdGVzID0gbnVsbHB0cik7CisKKyAgRnVuY3Rpb25EZWNsICoKKyAgcmVzb2x2ZUFkZHJlc3NPZk9ubHlWaWFibGVPdmVybG9hZENhbmRpZGF0ZShFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xBY2Nlc3NQYWlyICZGb3VuZFJlc3VsdCk7CisKKyAgYm9vbCByZXNvbHZlQW5kRml4QWRkcmVzc09mT25seVZpYWJsZU92ZXJsb2FkQ2FuZGlkYXRlKAorICAgICAgRXhwclJlc3VsdCAmU3JjRXhwciwgYm9vbCBEb0Z1bmN0aW9uUG9pbnRlckNvbnZlcnNpb24gPSBmYWxzZSk7CisKKyAgRnVuY3Rpb25EZWNsICoKKyAgUmVzb2x2ZVNpbmdsZUZ1bmN0aW9uVGVtcGxhdGVTcGVjaWFsaXphdGlvbihPdmVybG9hZEV4cHIgKm92bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbEFjY2Vzc1BhaXIgKkZvdW5kID0gbnVsbHB0cik7CisKKyAgYm9vbCBSZXNvbHZlQW5kRml4U2luZ2xlRnVuY3Rpb25UZW1wbGF0ZVNwZWNpYWxpemF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgIEV4cHJSZXN1bHQgJlNyY0V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEb0Z1bmN0aW9uUG9pbnRlckNvbnZlcmlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBPcFJhbmdlRm9yQ29tcGxhaW5pbmcgPSBTb3VyY2VSYW5nZSgpLAorICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIERlc3RUeXBlRm9yQ29tcGxhaW5pbmcgPSBRdWFsVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERpYWdJREZvckNvbXBsYWluaW5nID0gMCk7CisKKworICBFeHByICpGaXhPdmVybG9hZGVkRnVuY3Rpb25SZWZlcmVuY2UoRXhwciAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xBY2Nlc3NQYWlyIEZvdW5kRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uRGVjbCAqRm4pOworICBFeHByUmVzdWx0IEZpeE92ZXJsb2FkZWRGdW5jdGlvblJlZmVyZW5jZShFeHByUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsQWNjZXNzUGFpciBGb3VuZERlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uRGVjbCAqRm4pOworCisgIHZvaWQgQWRkT3ZlcmxvYWRlZENhbGxDYW5kaWRhdGVzKFVucmVzb2x2ZWRMb29rdXBFeHByICpVTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmxvYWRDYW5kaWRhdGVTZXQgJkNhbmRpZGF0ZVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQYXJ0aWFsT3ZlcmxvYWRpbmcgPSBmYWxzZSk7CisKKyAgLy8gQW4gZW51bSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZGlmZmVyZW50IHBvc3NpYmxlIHJlc3VsdHMgb2YgYnVpbGRpbmcgYQorICAvLyByYW5nZS1iYXNlZCBmb3IgbG9vcC4KKyAgZW51bSBGb3JSYW5nZVN0YXR1cyB7CisgICAgRlJTX1N1Y2Nlc3MsCisgICAgRlJTX05vVmlhYmxlRnVuY3Rpb24sCisgICAgRlJTX0RpYWdub3N0aWNJc3N1ZWQKKyAgfTsKKworICBGb3JSYW5nZVN0YXR1cyBCdWlsZEZvclJhbmdlQmVnaW5FbmRDYWxsKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSYW5nZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZOYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29rdXBSZXN1bHQgJk1lbWJlckxvb2t1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVybG9hZENhbmRpZGF0ZVNldCAqQ2FuZGlkYXRlU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKlJhbmdlLCBFeHByUmVzdWx0ICpDYWxsRXhwcik7CisKKyAgRXhwclJlc3VsdCBCdWlsZE92ZXJsb2FkZWRDYWxsRXhwcihTY29wZSAqUywgRXhwciAqRm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXNvbHZlZExvb2t1cEV4cHIgKlVMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlFeHByQXJnIEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkV4ZWNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd1R5cG9Db3JyZWN0aW9uPXRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDYWxsZWVzQWRkcmVzc0lzVGFrZW49ZmFsc2UpOworCisgIGJvb2wgYnVpbGRPdmVybG9hZGVkQ2FsbFNldChTY29wZSAqUywgRXhwciAqRm4sIFVucmVzb2x2ZWRMb29rdXBFeHByICpVTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aUV4cHJBcmcgQXJncywgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmxvYWRDYW5kaWRhdGVTZXQgKkNhbmRpZGF0ZVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJSZXN1bHQgKlJlc3VsdCk7CisKKyAgRXhwclJlc3VsdCBDcmVhdGVPdmVybG9hZGVkVW5hcnlPcChTb3VyY2VMb2NhdGlvbiBPcExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmFyeU9wZXJhdG9yS2luZCBPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5yZXNvbHZlZFNldEltcGwgJkZucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICppbnB1dCwgYm9vbCBSZXF1aXJlc0FETCA9IHRydWUpOworCisgIEV4cHJSZXN1bHQgQ3JlYXRlT3ZlcmxvYWRlZEJpbk9wKFNvdXJjZUxvY2F0aW9uIE9wTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvcktpbmQgT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbnJlc29sdmVkU2V0SW1wbCAmRm5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpMSFMsIEV4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZXF1aXJlc0FETCA9IHRydWUpOworCisgIEV4cHJSZXN1bHQgQ3JlYXRlT3ZlcmxvYWRlZEFycmF5U3Vic2NyaXB0RXhwcihTb3VyY2VMb2NhdGlvbiBMTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkJhc2UsRXhwciAqSWR4KTsKKworICBFeHByUmVzdWx0CisgIEJ1aWxkQ2FsbFRvTWVtYmVyRnVuY3Rpb24oU2NvcGUgKlMsIEV4cHIgKk1lbUV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpRXhwckFyZyBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYyk7CisgIEV4cHJSZXN1bHQKKyAgQnVpbGRDYWxsVG9PYmplY3RPZkNsYXNzVHlwZShTY29wZSAqUywgRXhwciAqT2JqZWN0LCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlFeHByQXJnIEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKTsKKworICBFeHByUmVzdWx0IEJ1aWxkT3ZlcmxvYWRlZEFycm93RXhwcihTY29wZSAqUywgRXhwciAqQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gT3BMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKk5vQXJyb3dPcGVyYXRvckZvdW5kID0gbnVsbHB0cik7CisKKyAgLy8vIENoZWNrQ2FsbFJldHVyblR5cGUgLSBDaGVja3MgdGhhdCBhIGNhbGwgZXhwcmVzc2lvbidzIHJldHVybiB0eXBlIGlzCisgIC8vLyBjb21wbGV0ZS4gUmV0dXJucyB0cnVlIG9uIGZhaWx1cmUuIFRoZSBsb2NhdGlvbiBwYXNzZWQgaW4gaXMgdGhlIGxvY2F0aW9uCisgIC8vLyB0aGF0IGJlc3QgcmVwcmVzZW50cyB0aGUgY2FsbC4KKyAgYm9vbCBDaGVja0NhbGxSZXR1cm5UeXBlKFF1YWxUeXBlIFJldHVyblR5cGUsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxFeHByICpDRSwgRnVuY3Rpb25EZWNsICpGRCk7CisKKyAgLy8vIEhlbHBlcnMgZm9yIGRlYWxpbmcgd2l0aCBibG9ja3MgYW5kIGZ1bmN0aW9ucy4KKyAgYm9vbCBDaGVja1Bhcm1zRm9yRnVuY3Rpb25EZWYoQXJyYXlSZWY8UGFybVZhckRlY2wgKj4gUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDaGVja1BhcmFtZXRlck5hbWVzKTsKKyAgdm9pZCBDaGVja0NYWERlZmF1bHRBcmd1bWVudHMoRnVuY3Rpb25EZWNsICpGRCk7CisgIHZvaWQgQ2hlY2tFeHRyYUNYWERlZmF1bHRBcmd1bWVudHMoRGVjbGFyYXRvciAmRCk7CisgIFNjb3BlICpnZXROb25GaWVsZERlY2xTY29wZShTY29wZSAqUyk7CisKKyAgLy8vIFxuYW1lIE5hbWUgbG9va3VwCisgIC8vLworICAvLy8gVGhlc2Ugcm91dGluZXMgcHJvdmlkZSBuYW1lIGxvb2t1cCB0aGF0IGlzIHVzZWQgZHVyaW5nIHNlbWFudGljCisgIC8vLyBhbmFseXNpcyB0byByZXNvbHZlIHRoZSB2YXJpb3VzIGtpbmRzIG9mIG5hbWVzIChpZGVudGlmaWVycywKKyAgLy8vIG92ZXJsb2FkZWQgb3BlcmF0b3IgbmFtZXMsIGNvbnN0cnVjdG9yIG5hbWVzLCBldGMuKSBpbnRvIHplcm8gb3IKKyAgLy8vIG1vcmUgZGVjbGFyYXRpb25zIHdpdGhpbiBhIHBhcnRpY3VsYXIgc2NvcGUuIFRoZSBtYWpvciBlbnRyeQorICAvLy8gcG9pbnRzIGFyZSBMb29rdXBOYW1lLCB3aGljaCBwZXJmb3JtcyB1bnF1YWxpZmllZCBuYW1lIGxvb2t1cCwKKyAgLy8vIGFuZCBMb29rdXBRdWFsaWZpZWROYW1lLCB3aGljaCBwZXJmb3JtcyBxdWFsaWZpZWQgbmFtZSBsb29rdXAuCisgIC8vLworICAvLy8gQWxsIG5hbWUgbG9va3VwIGlzIHBlcmZvcm1lZCBiYXNlZCBvbiBzb21lIHNwZWNpZmljIGNyaXRlcmlhLAorICAvLy8gd2hpY2ggc3BlY2lmeSB3aGF0IG5hbWVzIHdpbGwgYmUgdmlzaWJsZSB0byBuYW1lIGxvb2t1cCBhbmQgaG93CisgIC8vLyBmYXIgbmFtZSBsb29rdXAgc2hvdWxkIHdvcmsuIFRoZXNlIGNyaXRlcmlhIGFyZSBpbXBvcnRhbnQgYm90aAorICAvLy8gZm9yIGNhcHR1cmluZyBsYW5ndWFnZSBzZW1hbnRpY3MgKGNlcnRhaW4gbG9va3VwcyB3aWxsIGlnbm9yZQorICAvLy8gY2VydGFpbiBuYW1lcywgZm9yIGV4YW1wbGUpIGFuZCBmb3IgcGVyZm9ybWFuY2UsIHNpbmNlIG5hbWUKKyAgLy8vIGxvb2t1cCBpcyBvZnRlbiBhIGJvdHRsZW5lY2sgaW4gdGhlIGNvbXBpbGF0aW9uIG9mIEMrKy4gTmFtZQorICAvLy8gbG9va3VwIGNyaXRlcmlhIGlzIHNwZWNpZmllZCB2aWEgdGhlIExvb2t1cENyaXRlcmlhIGVudW1lcmF0aW9uLgorICAvLy8KKyAgLy8vIFRoZSByZXN1bHRzIG9mIG5hbWUgbG9va3VwIGNhbiB2YXJ5IGJhc2VkIG9uIHRoZSBraW5kIG9mIG5hbWUKKyAgLy8vIGxvb2t1cCBwZXJmb3JtZWQsIHRoZSBjdXJyZW50IGxhbmd1YWdlLCBhbmQgdGhlIHRyYW5zbGF0aW9uCisgIC8vLyB1bml0LiBJbiBDLCBmb3IgZXhhbXBsZSwgbmFtZSBsb29rdXAgd2lsbCBlaXRoZXIgcmV0dXJuIG5vdGhpbmcKKyAgLy8vIChubyBlbnRpdHkgZm91bmQpIG9yIGEgc2luZ2xlIGRlY2xhcmF0aW9uLiBJbiBDKyssIG5hbWUgbG9va3VwCisgIC8vLyBjYW4gYWRkaXRpb25hbGx5IHJlZmVyIHRvIGEgc2V0IG9mIG92ZXJsb2FkZWQgZnVuY3Rpb25zIG9yCisgIC8vLyByZXN1bHQgaW4gYW4gYW1iaWd1aXR5LiBBbGwgb2YgdGhlIHBvc3NpYmxlIHJlc3VsdHMgb2YgbmFtZQorICAvLy8gbG9va3VwIGFyZSBjYXB0dXJlZCBieSB0aGUgTG9va3VwUmVzdWx0IGNsYXNzLCB3aGljaCBwcm92aWRlcworICAvLy8gdGhlIGFiaWxpdHkgdG8gZGlzdGluZ3Vpc2ggYW1vbmcgdGhlbS4KKyAgLy9AeworCisgIC8vLyBAYnJpZWYgRGVzY3JpYmVzIHRoZSBraW5kIG9mIG5hbWUgbG9va3VwIHRvIHBlcmZvcm0uCisgIGVudW0gTG9va3VwTmFtZUtpbmQgeworICAgIC8vLyBPcmRpbmFyeSBuYW1lIGxvb2t1cCwgd2hpY2ggZmluZHMgb3JkaW5hcnkgbmFtZXMgKGZ1bmN0aW9ucywKKyAgICAvLy8gdmFyaWFibGVzLCB0eXBlZGVmcywgZXRjLikgaW4gQyBhbmQgbW9zdCBraW5kcyBvZiBuYW1lcworICAgIC8vLyAoZnVuY3Rpb25zLCB2YXJpYWJsZXMsIG1lbWJlcnMsIHR5cGVzLCBldGMuKSBpbiBDKysuCisgICAgTG9va3VwT3JkaW5hcnlOYW1lID0gMCwKKyAgICAvLy8gVGFnIG5hbWUgbG9va3VwLCB3aGljaCBmaW5kcyB0aGUgbmFtZXMgb2YgZW51bXMsIGNsYXNzZXMsCisgICAgLy8vIHN0cnVjdHMsIGFuZCB1bmlvbnMuCisgICAgTG9va3VwVGFnTmFtZSwKKyAgICAvLy8gTGFiZWwgbmFtZSBsb29rdXAuCisgICAgTG9va3VwTGFiZWwsCisgICAgLy8vIE1lbWJlciBuYW1lIGxvb2t1cCwgd2hpY2ggZmluZHMgdGhlIG5hbWVzIG9mCisgICAgLy8vIGNsYXNzL3N0cnVjdC91bmlvbiBtZW1iZXJzLgorICAgIExvb2t1cE1lbWJlck5hbWUsCisgICAgLy8vIExvb2sgdXAgb2YgYW4gb3BlcmF0b3IgbmFtZSAoZS5nLiwgb3BlcmF0b3IrKSBmb3IgdXNlIHdpdGgKKyAgICAvLy8gb3BlcmF0b3Igb3ZlcmxvYWRpbmcuIFRoaXMgbG9va3VwIGlzIHNpbWlsYXIgdG8gb3JkaW5hcnkgbmFtZQorICAgIC8vLyBsb29rdXAsIGJ1dCB3aWxsIGlnbm9yZSBhbnkgZGVjbGFyYXRpb25zIHRoYXQgYXJlIGNsYXNzIG1lbWJlcnMuCisgICAgTG9va3VwT3BlcmF0b3JOYW1lLAorICAgIC8vLyBMb29rIHVwIG9mIGEgbmFtZSB0aGF0IHByZWNlZGVzIHRoZSAnOjonIHNjb3BlIHJlc29sdXRpb24KKyAgICAvLy8gb3BlcmF0b3IgaW4gQysrLiBUaGlzIGxvb2t1cCBjb21wbGV0ZWx5IGlnbm9yZXMgb3BlcmF0b3IsIG9iamVjdCwKKyAgICAvLy8gZnVuY3Rpb24sIGFuZCBlbnVtZXJhdG9yIG5hbWVzIChDKysgW2Jhc2ljLmxvb2t1cC5xdWFsXXAxKS4KKyAgICBMb29rdXBOZXN0ZWROYW1lU3BlY2lmaWVyTmFtZSwKKyAgICAvLy8gTG9vayB1cCBhIG5hbWVzcGFjZSBuYW1lIHdpdGhpbiBhIEMrKyB1c2luZyBkaXJlY3RpdmUgb3IKKyAgICAvLy8gbmFtZXNwYWNlIGFsaWFzIGRlZmluaXRpb24sIGlnbm9yaW5nIG5vbi1uYW1lc3BhY2UgbmFtZXMgKEMrKworICAgIC8vLyBbYmFzaWMubG9va3VwLnVkaXJdcDEpLgorICAgIExvb2t1cE5hbWVzcGFjZU5hbWUsCisgICAgLy8vIExvb2sgdXAgYWxsIGRlY2xhcmF0aW9ucyBpbiBhIHNjb3BlIHdpdGggdGhlIGdpdmVuIG5hbWUsCisgICAgLy8vIGluY2x1ZGluZyByZXNvbHZlZCB1c2luZyBkZWNsYXJhdGlvbnMuICBUaGlzIGlzIGFwcHJvcHJpYXRlCisgICAgLy8vIGZvciBjaGVja2luZyByZWRlY2xhcmF0aW9ucyBmb3IgYSB1c2luZyBkZWNsYXJhdGlvbi4KKyAgICBMb29rdXBVc2luZ0RlY2xOYW1lLAorICAgIC8vLyBMb29rIHVwIGFuIG9yZGluYXJ5IG5hbWUgdGhhdCBpcyBnb2luZyB0byBiZSByZWRlY2xhcmVkIGFzIGEKKyAgICAvLy8gbmFtZSB3aXRoIGxpbmthZ2UuIFRoaXMgbG9va3VwIGlnbm9yZXMgYW55IGRlY2xhcmF0aW9ucyB0aGF0CisgICAgLy8vIGFyZSBvdXRzaWRlIG9mIHRoZSBjdXJyZW50IHNjb3BlIHVubGVzcyB0aGV5IGhhdmUgbGlua2FnZS4gU2VlCisgICAgLy8vIEM5OSA2LjIuMnA0LTUgYW5kIEMrKyBbYmFzaWMubGlua11wNi4KKyAgICBMb29rdXBSZWRlY2xhcmF0aW9uV2l0aExpbmthZ2UsCisgICAgLy8vIExvb2sgdXAgYSBmcmllbmQgb2YgYSBsb2NhbCBjbGFzcy4gVGhpcyBsb29rdXAgZG9lcyBub3QgbG9vaworICAgIC8vLyBvdXRzaWRlIHRoZSBpbm5lcm1vc3Qgbm9uLWNsYXNzIHNjb3BlLiBTZWUgQysrMTEgW2NsYXNzLmZyaWVuZF1wMTEuCisgICAgTG9va3VwTG9jYWxGcmllbmROYW1lLAorICAgIC8vLyBMb29rIHVwIHRoZSBuYW1lIG9mIGFuIE9iamVjdGl2ZS1DIHByb3RvY29sLgorICAgIExvb2t1cE9iakNQcm90b2NvbE5hbWUsCisgICAgLy8vIExvb2sgdXAgaW1wbGljaXQgJ3NlbGYnIHBhcmFtZXRlciBvZiBhbiBvYmplY3RpdmUtYyBtZXRob2QuCisgICAgTG9va3VwT2JqQ0ltcGxpY2l0U2VsZlBhcmFtLAorICAgIC8vLyBcYnJpZWYgTG9vayB1cCB0aGUgbmFtZSBvZiBhbiBPcGVuTVAgdXNlci1kZWZpbmVkIHJlZHVjdGlvbiBvcGVyYXRpb24uCisgICAgTG9va3VwT01QUmVkdWN0aW9uTmFtZSwKKyAgICAvLy8gXGJyaWVmIExvb2sgdXAgYW55IGRlY2xhcmF0aW9uIHdpdGggYW55IG5hbWUuCisgICAgTG9va3VwQW55TmFtZQorICB9OworCisgIC8vLyBcYnJpZWYgU3BlY2lmaWVzIHdoZXRoZXIgKG9yIGhvdykgbmFtZSBsb29rdXAgaXMgYmVpbmcgcGVyZm9ybWVkIGZvciBhCisgIC8vLyByZWRlY2xhcmF0aW9uICh2cy4gYSByZWZlcmVuY2UpLgorICBlbnVtIFJlZGVjbGFyYXRpb25LaW5kIHsKKyAgICAvLy8gXGJyaWVmIFRoZSBsb29rdXAgaXMgYSByZWZlcmVuY2UgdG8gdGhpcyBuYW1lIHRoYXQgaXMgbm90IGZvciB0aGUKKyAgICAvLy8gcHVycG9zZSBvZiByZWRlY2xhcmluZyB0aGUgbmFtZS4KKyAgICBOb3RGb3JSZWRlY2xhcmF0aW9uID0gMCwKKyAgICAvLy8gXGJyaWVmIFRoZSBsb29rdXAgcmVzdWx0cyB3aWxsIGJlIHVzZWQgZm9yIHJlZGVjbGFyYXRpb24gb2YgYSBuYW1lLAorICAgIC8vLyBpZiBhbiBlbnRpdHkgYnkgdGhhdCBuYW1lIGFscmVhZHkgZXhpc3RzIGFuZCBpcyB2aXNpYmxlLgorICAgIEZvclZpc2libGVSZWRlY2xhcmF0aW9uLAorICAgIC8vLyBcYnJpZWYgVGhlIGxvb2t1cCByZXN1bHRzIHdpbGwgYmUgdXNlZCBmb3IgcmVkZWNsYXJhdGlvbiBvZiBhIG5hbWUKKyAgICAvLy8gd2l0aCBleHRlcm5hbCBsaW5rYWdlOyBub24tdmlzaWJsZSBsb29rdXAgcmVzdWx0cyB3aXRoIGV4dGVybmFsIGxpbmthZ2UKKyAgICAvLy8gbWF5IGFsc28gYmUgZm91bmQuCisgICAgRm9yRXh0ZXJuYWxSZWRlY2xhcmF0aW9uCisgIH07CisKKyAgUmVkZWNsYXJhdGlvbktpbmQgZm9yUmVkZWNsYXJhdGlvbkluQ3VyQ29udGV4dCgpIHsKKyAgICAvLyBBIGRlY2xhcmF0aW9uIHdpdGggYW4gb3duaW5nIG1vZHVsZSBmb3IgbGlua2FnZSBjYW4gbmV2ZXIgbGluayBhZ2FpbnN0CisgICAgLy8gYW55dGhpbmcgdGhhdCBpcyBub3QgdmlzaWJsZS4gV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBsaW5rYWdlIGhlcmU7IGlmCisgICAgLy8gdGhlIGNvbnRleHQgaGFzIGludGVybmFsIGxpbmthZ2UsIHJlZGVjbGFyYXRpb24gbG9va3VwIHdvbid0IGZpbmQgdGhpbmdzCisgICAgLy8gZnJvbSBvdGhlciBUVXMsIGFuZCB3ZSBjYW4ndCBzYWZlbHkgY29tcHV0ZSBsaW5rYWdlIHlldCBpbiBnZW5lcmFsLgorICAgIGlmIChjYXN0PERlY2w+KEN1ckNvbnRleHQpCisgICAgICAgICAgICAtPmdldE93bmluZ01vZHVsZUZvckxpbmthZ2UoLypJZ25vcmVMaW5rYWdlKi90cnVlKSkKKyAgICAgIHJldHVybiBGb3JWaXNpYmxlUmVkZWNsYXJhdGlvbjsKKyAgICByZXR1cm4gRm9yRXh0ZXJuYWxSZWRlY2xhcmF0aW9uOworICB9CisKKyAgLy8vIFxicmllZiBUaGUgcG9zc2libGUgb3V0Y29tZXMgb2YgbmFtZSBsb29rdXAgZm9yIGEgbGl0ZXJhbCBvcGVyYXRvci4KKyAgZW51bSBMaXRlcmFsT3BlcmF0b3JMb29rdXBSZXN1bHQgeworICAgIC8vLyBcYnJpZWYgVGhlIGxvb2t1cCByZXN1bHRlZCBpbiBhbiBlcnJvci4KKyAgICBMT0xSX0Vycm9yLAorICAgIC8vLyBcYnJpZWYgVGhlIGxvb2t1cCBmb3VuZCBubyBtYXRjaCBidXQgbm8gZGlhZ25vc3RpYyB3YXMgaXNzdWVkLgorICAgIExPTFJfRXJyb3JOb0RpYWdub3N0aWMsCisgICAgLy8vIFxicmllZiBUaGUgbG9va3VwIGZvdW5kIGEgc2luZ2xlICdjb29rZWQnIGxpdGVyYWwgb3BlcmF0b3IsIHdoaWNoCisgICAgLy8vIGV4cGVjdHMgYSBub3JtYWwgbGl0ZXJhbCB0byBiZSBidWlsdCBhbmQgcGFzc2VkIHRvIGl0LgorICAgIExPTFJfQ29va2VkLAorICAgIC8vLyBcYnJpZWYgVGhlIGxvb2t1cCBmb3VuZCBhIHNpbmdsZSAncmF3JyBsaXRlcmFsIG9wZXJhdG9yLCB3aGljaCBleHBlY3RzCisgICAgLy8vIGEgc3RyaW5nIGxpdGVyYWwgY29udGFpbmluZyB0aGUgc3BlbGxpbmcgb2YgdGhlIGxpdGVyYWwgdG9rZW4uCisgICAgTE9MUl9SYXcsCisgICAgLy8vIFxicmllZiBUaGUgbG9va3VwIGZvdW5kIGFuIG92ZXJsb2FkIHNldCBvZiBsaXRlcmFsIG9wZXJhdG9yIHRlbXBsYXRlcywKKyAgICAvLy8gd2hpY2ggZXhwZWN0IHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSBzcGVsbGluZyBvZiB0aGUgbGl0ZXJhbCB0b2tlbiB0byBiZQorICAgIC8vLyBwYXNzZWQgYXMgYSBub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCBwYWNrLgorICAgIExPTFJfVGVtcGxhdGUsCisgICAgLy8vIFxicmllZiBUaGUgbG9va3VwIGZvdW5kIGFuIG92ZXJsb2FkIHNldCBvZiBsaXRlcmFsIG9wZXJhdG9yIHRlbXBsYXRlcywKKyAgICAvLy8gd2hpY2ggZXhwZWN0IHRoZSBjaGFyYWN0ZXIgdHlwZSBhbmQgY2hhcmFjdGVycyBvZiB0aGUgc3BlbGxpbmcgb2YgdGhlCisgICAgLy8vIHN0cmluZyBsaXRlcmFsIHRva2VuIHRvIGJlIHBhc3NlZCBhcyB0ZW1wbGF0ZSBhcmd1bWVudHMuCisgICAgTE9MUl9TdHJpbmdUZW1wbGF0ZQorICB9OworCisgIFNwZWNpYWxNZW1iZXJPdmVybG9hZFJlc3VsdCBMb29rdXBTcGVjaWFsTWVtYmVyKENYWFJlY29yZERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNwZWNpYWxNZW1iZXIgU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29uc3RBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVm9sYXRpbGVBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUlZhbHVlVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb25zdFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVm9sYXRpbGVUaGlzKTsKKworICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBUeXBvQ29ycmVjdGlvbiAmKT4gVHlwb0RpYWdub3N0aWNHZW5lcmF0b3I7CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxFeHByUmVzdWx0KFNlbWEgJiwgVHlwb0V4cHIgKiwgVHlwb0NvcnJlY3Rpb24pPgorICAgICAgVHlwb1JlY292ZXJ5Q2FsbGJhY2s7CisKK3ByaXZhdGU6CisgIGJvb2wgQ3BwTG9va3VwTmFtZShMb29rdXBSZXN1bHQgJlIsIFNjb3BlICpTKTsKKworICBzdHJ1Y3QgVHlwb0V4cHJTdGF0ZSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFR5cG9Db3JyZWN0aW9uQ29uc3VtZXI+IENvbnN1bWVyOworICAgIFR5cG9EaWFnbm9zdGljR2VuZXJhdG9yIERpYWdIYW5kbGVyOworICAgIFR5cG9SZWNvdmVyeUNhbGxiYWNrIFJlY292ZXJ5SGFuZGxlcjsKKyAgICBUeXBvRXhwclN0YXRlKCk7CisgICAgVHlwb0V4cHJTdGF0ZShUeXBvRXhwclN0YXRlICYmb3RoZXIpIG5vZXhjZXB0OworICAgIFR5cG9FeHByU3RhdGUgJm9wZXJhdG9yPShUeXBvRXhwclN0YXRlICYmb3RoZXIpIG5vZXhjZXB0OworICB9OworCisgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiB1bmhhbmRsZWQgVHlwb0V4cHJzIGFuZCB0aGVpciBhc3NvY2lhdGVkIHN0YXRlLgorICBsbHZtOjpNYXBWZWN0b3I8VHlwb0V4cHIgKiwgVHlwb0V4cHJTdGF0ZT4gRGVsYXllZFR5cG9zOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhIG5ldyBUeXBvRXhwciBBU1Qgbm9kZS4KKyAgVHlwb0V4cHIgKmNyZWF0ZURlbGF5ZWRUeXBvKHN0ZDo6dW5pcXVlX3B0cjxUeXBvQ29ycmVjdGlvbkNvbnN1bWVyPiBUQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBvRGlhZ25vc3RpY0dlbmVyYXRvciBUREcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBvUmVjb3ZlcnlDYWxsYmFjayBUUkMpOworCisgIC8vIFxicmllZiBUaGUgc2V0IG9mIGtub3duL2VuY291bnRlcmVkICh1bmlxdWUsIGNhbm9uaWNhbGl6ZWQpIE5hbWVzcGFjZURlY2xzLgorICAvLworICAvLyBUaGUgYm9vbGVhbiB2YWx1ZSB3aWxsIGJlIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbmFtZXNwYWNlIHdhcyBsb2FkZWQKKyAgLy8gZnJvbSBhbiBBU1QvUENIIGZpbGUsIG9yIGZhbHNlIG90aGVyd2lzZS4KKyAgbGx2bTo6TWFwVmVjdG9yPE5hbWVzcGFjZURlY2wqLCBib29sPiBLbm93bk5hbWVzcGFjZXM7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHdlIGhhdmUgYWxyZWFkeSBsb2FkZWQga25vd24gbmFtZXNwYWNlcyBmcm9tIGFuIGV4dGVuYWwKKyAgLy8vIHNvdXJjZS4KKyAgYm9vbCBMb2FkZWRFeHRlcm5hbEtub3duTmFtZXNwYWNlczsKKworICAvLy8gXGJyaWVmIEhlbHBlciBmb3IgQ29ycmVjdFR5cG8gYW5kIENvcnJlY3RUeXBvRGVsYXllZCB1c2VkIHRvIGNyZWF0ZSBhbmQKKyAgLy8vIHBvcHVsYXRlIGEgbmV3IFR5cG9Db3JyZWN0aW9uQ29uc3VtZXIuIFJldHVybnMgbnVsbHB0ciBpZiB0eXBvIGNvcnJlY3Rpb24KKyAgLy8vIHNob3VsZCBiZSBza2lwcGVkIGVudGlyZWx5LgorICBzdGQ6OnVuaXF1ZV9wdHI8VHlwb0NvcnJlY3Rpb25Db25zdW1lcj4KKyAgbWFrZVR5cG9Db3JyZWN0aW9uQ29uc3VtZXIoY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmVHlwbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYTo6TG9va3VwTmFtZUtpbmQgTG9va3VwS2luZCwgU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAqU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDb3JyZWN0aW9uQ2FuZGlkYXRlQ2FsbGJhY2s+IENDQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbENvbnRleHQgKk1lbWJlckNvbnRleHQsIGJvb2wgRW50ZXJpbmdDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDT2JqZWN0UG9pbnRlclR5cGUgKk9QVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFcnJvclJlY292ZXJ5KTsKKworcHVibGljOgorICBjb25zdCBUeXBvRXhwclN0YXRlICZnZXRUeXBvRXhwclN0YXRlKFR5cG9FeHByICpURSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDbGVhcnMgdGhlIHN0YXRlIG9mIHRoZSBnaXZlbiBUeXBvRXhwci4KKyAgdm9pZCBjbGVhckRlbGF5ZWRUeXBvKFR5cG9FeHByICpURSk7CisKKyAgLy8vIFxicmllZiBMb29rIHVwIGEgbmFtZSwgbG9va2luZyBmb3IgYSBzaW5nbGUgZGVjbGFyYXRpb24uICBSZXR1cm4KKyAgLy8vIG51bGwgaWYgdGhlIHJlc3VsdHMgd2VyZSBhYnNlbnQsIGFtYmlndW91cywgb3Igb3ZlcmxvYWRlZC4KKyAgLy8vCisgIC8vLyBJdCBpcyBwcmVmZXJhYmxlIHRvIHVzZSB0aGUgZWxhYm9yYXRlZCBmb3JtIGFuZCBleHBsaWNpdGx5IGhhbmRsZQorICAvLy8gYW1iaWd1aXR5IGFuZCBvdmVybG9hZGVkLgorICBOYW1lZERlY2wgKkxvb2t1cFNpbmdsZU5hbWUoU2NvcGUgKlMsIERlY2xhcmF0aW9uTmFtZSBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9va3VwTmFtZUtpbmQgTmFtZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWRlY2xhcmF0aW9uS2luZCBSZWRlY2wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBOb3RGb3JSZWRlY2xhcmF0aW9uKTsKKyAgYm9vbCBMb29rdXBOYW1lKExvb2t1cFJlc3VsdCAmUiwgU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICBib29sIEFsbG93QnVpbHRpbkNyZWF0aW9uID0gZmFsc2UpOworICBib29sIExvb2t1cFF1YWxpZmllZE5hbWUoTG9va3VwUmVzdWx0ICZSLCBEZWNsQ29udGV4dCAqTG9va3VwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJblVucXVhbGlmaWVkTG9va3VwID0gZmFsc2UpOworICBib29sIExvb2t1cFF1YWxpZmllZE5hbWUoTG9va3VwUmVzdWx0ICZSLCBEZWNsQ29udGV4dCAqTG9va3VwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYU2NvcGVTcGVjICZTUyk7CisgIGJvb2wgTG9va3VwUGFyc2VkTmFtZShMb29rdXBSZXN1bHQgJlIsIFNjb3BlICpTLCBDWFhTY29wZVNwZWMgKlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0J1aWx0aW5DcmVhdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbnRlcmluZ0NvbnRleHQgPSBmYWxzZSk7CisgIE9iakNQcm90b2NvbERlY2wgKkxvb2t1cFByb3RvY29sKElkZW50aWZpZXJJbmZvICpJSSwgU291cmNlTG9jYXRpb24gSWRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZGVjbGFyYXRpb25LaW5kIFJlZGVjbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTm90Rm9yUmVkZWNsYXJhdGlvbik7CisgIGJvb2wgTG9va3VwSW5TdXBlcihMb29rdXBSZXN1bHQgJlIsIENYWFJlY29yZERlY2wgKkNsYXNzKTsKKworICB2b2lkIExvb2t1cE92ZXJsb2FkZWRPcGVyYXRvck5hbWUoT3ZlcmxvYWRlZE9wZXJhdG9yS2luZCBPcCwgU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBUMSwgUXVhbFR5cGUgVDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJlc29sdmVkU2V0SW1wbCAmRnVuY3Rpb25zKTsKKworICBMYWJlbERlY2wgKkxvb2t1cE9yQ3JlYXRlTGFiZWwoSWRlbnRpZmllckluZm8gKklJLCBTb3VyY2VMb2NhdGlvbiBJZGVudExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEdudUxhYmVsTG9jID0gU291cmNlTG9jYXRpb24oKSk7CisKKyAgRGVjbENvbnRleHRMb29rdXBSZXN1bHQgTG9va3VwQ29uc3RydWN0b3JzKENYWFJlY29yZERlY2wgKkNsYXNzKTsKKyAgQ1hYQ29uc3RydWN0b3JEZWNsICpMb29rdXBEZWZhdWx0Q29uc3RydWN0b3IoQ1hYUmVjb3JkRGVjbCAqQ2xhc3MpOworICBDWFhDb25zdHJ1Y3RvckRlY2wgKkxvb2t1cENvcHlpbmdDb25zdHJ1Y3RvcihDWFhSZWNvcmREZWNsICpDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUXVhbHMpOworICBDWFhNZXRob2REZWNsICpMb29rdXBDb3B5aW5nQXNzaWdubWVudChDWFhSZWNvcmREZWNsICpDbGFzcywgdW5zaWduZWQgUXVhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUlZhbHVlVGhpcywgdW5zaWduZWQgVGhpc1F1YWxzKTsKKyAgQ1hYQ29uc3RydWN0b3JEZWNsICpMb29rdXBNb3ZpbmdDb25zdHJ1Y3RvcihDWFhSZWNvcmREZWNsICpDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBRdWFscyk7CisgIENYWE1ldGhvZERlY2wgKkxvb2t1cE1vdmluZ0Fzc2lnbm1lbnQoQ1hYUmVjb3JkRGVjbCAqQ2xhc3MsIHVuc2lnbmVkIFF1YWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUlZhbHVlVGhpcywgdW5zaWduZWQgVGhpc1F1YWxzKTsKKyAgQ1hYRGVzdHJ1Y3RvckRlY2wgKkxvb2t1cERlc3RydWN0b3IoQ1hYUmVjb3JkRGVjbCAqQ2xhc3MpOworCisgIGJvb2wgY2hlY2tMaXRlcmFsT3BlcmF0b3JJZChjb25zdCBDWFhTY29wZVNwZWMgJlNTLCBjb25zdCBVbnF1YWxpZmllZElkICZJZCk7CisgIExpdGVyYWxPcGVyYXRvckxvb2t1cFJlc3VsdCBMb29rdXBMaXRlcmFsT3BlcmF0b3IoU2NvcGUgKlMsIExvb2t1cFJlc3VsdCAmUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxRdWFsVHlwZT4gQXJnVHlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dSYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd1RlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dTdHJpbmdUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpYWdub3NlTWlzc2luZyk7CisgIGJvb2wgaXNLbm93bk5hbWUoU3RyaW5nUmVmIG5hbWUpOworCisgIHZvaWQgQXJndW1lbnREZXBlbmRlbnRMb29rdXAoRGVjbGFyYXRpb25OYW1lIE5hbWUsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IEFyZ3MsIEFETFJlc3VsdCAmRnVuY3Rpb25zKTsKKworICB2b2lkIExvb2t1cFZpc2libGVEZWNscyhTY29wZSAqUywgTG9va3VwTmFtZUtpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzaWJsZURlY2xDb25zdW1lciAmQ29uc3VtZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5jbHVkZUdsb2JhbFNjb3BlID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBMb2FkRXh0ZXJuYWwgPSB0cnVlKTsKKyAgdm9pZCBMb29rdXBWaXNpYmxlRGVjbHMoRGVjbENvbnRleHQgKkN0eCwgTG9va3VwTmFtZUtpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzaWJsZURlY2xDb25zdW1lciAmQ29uc3VtZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5jbHVkZUdsb2JhbFNjb3BlID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlRGVwZW5kZW50QmFzZXMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBMb2FkRXh0ZXJuYWwgPSB0cnVlKTsKKworICBlbnVtIENvcnJlY3RUeXBvS2luZCB7CisgICAgQ1RLX05vbkVycm9yLCAgICAgLy8gQ29ycmVjdFR5cG8gdXNlZCBpbiBhIG5vbiBlcnJvciByZWNvdmVyeSBzaXR1YXRpb24uCisgICAgQ1RLX0Vycm9yUmVjb3ZlcnkgLy8gQ29ycmVjdFR5cG8gdXNlZCBpbiBub3JtYWwgZXJyb3IgcmVjb3ZlcnkuCisgIH07CisKKyAgVHlwb0NvcnJlY3Rpb24gQ29ycmVjdFR5cG8oY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmVHlwbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYTo6TG9va3VwTmFtZUtpbmQgTG9va3VwS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NvcGUgKlMsIENYWFNjb3BlU3BlYyAqU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDb3JyZWN0aW9uQ2FuZGlkYXRlQ2FsbGJhY2s+IENDQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ycmVjdFR5cG9LaW5kIE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpNZW1iZXJDb250ZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbnRlcmluZ0NvbnRleHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ09iamVjdFBvaW50ZXJUeXBlICpPUFQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJlY29yZEZhaWx1cmUgPSB0cnVlKTsKKworICBUeXBvRXhwciAqQ29ycmVjdFR5cG9EZWxheWVkKGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJlR5cG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYTo6TG9va3VwTmFtZUtpbmQgTG9va3VwS2luZCwgU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYU2NvcGVTcGVjICpTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29ycmVjdGlvbkNhbmRpZGF0ZUNhbGxiYWNrPiBDQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwb0RpYWdub3N0aWNHZW5lcmF0b3IgVERHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cG9SZWNvdmVyeUNhbGxiYWNrIFRSQywgQ29ycmVjdFR5cG9LaW5kIE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbENvbnRleHQgKk1lbWJlckNvbnRleHQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRW50ZXJpbmdDb250ZXh0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ09iamVjdFBvaW50ZXJUeXBlICpPUFQgPSBudWxscHRyKTsKKworICAvLy8gXGJyaWVmIFByb2Nlc3MgYW55IFR5cG9FeHBycyBpbiB0aGUgZ2l2ZW4gRXhwciBhbmQgaXRzIGNoaWxkcmVuLAorICAvLy8gZ2VuZXJhdGluZyBkaWFnbm9zdGljcyBhcyBhcHByb3ByaWF0ZSBhbmQgcmV0dXJuaW5nIGEgbmV3IEV4cHIgaWYgdGhlcmUKKyAgLy8vIHdlcmUgdHlwb3MgdGhhdCB3ZXJlIGFsbCBzdWNjZXNzZnVsbHkgY29ycmVjdGVkIGFuZCBFeHByRXJyb3IgaWYgb25lIG9yCisgIC8vLyBtb3JlIHR5cG9zIGNvdWxkIG5vdCBiZSBjb3JyZWN0ZWQuCisgIC8vLworICAvLy8gXHBhcmFtIEUgVGhlIEV4cHIgdG8gY2hlY2sgZm9yIFR5cG9FeHBycy4KKyAgLy8vCisgIC8vLyBccGFyYW0gSW5pdERlY2wgQSBWYXJEZWNsIHRvIGF2b2lkIGJlY2F1c2UgdGhlIEV4cHIgYmVpbmcgY29ycmVjdGVkIGlzIGl0cworICAvLy8gaW5pdGlhbGl6ZXIuCisgIC8vLworICAvLy8gXHBhcmFtIEZpbHRlciBBIGZ1bmN0aW9uIGFwcGxpZWQgdG8gYSBuZXdseSByZWJ1aWx0IEV4cHIgdG8gZGV0ZXJtaW5lIGlmCisgIC8vLyBpdCBpcyBhbiBhY2NlcHRhYmxlL3VzYWJsZSByZXN1bHQgZnJvbSBhIHNpbmdsZSBjb21iaW5hdGlvbiBvZiB0eXBvCisgIC8vLyBjb3JyZWN0aW9ucy4gQXMgbG9uZyBhcyB0aGUgZmlsdGVyIHJldHVybnMgRXhwckVycm9yLCBkaWZmZXJlbnQKKyAgLy8vIGNvbWJpbmF0aW9ucyBvZiBjb3JyZWN0aW9ucyB3aWxsIGJlIHRyaWVkIHVudGlsIGFsbCBhcmUgZXhoYXVzdGVkLgorICBFeHByUmVzdWx0CisgIENvcnJlY3REZWxheWVkVHlwb3NJbkV4cHIoRXhwciAqRSwgVmFyRGVjbCAqSW5pdERlY2wgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmZ1bmN0aW9uX3JlZjxFeHByUmVzdWx0KEV4cHIgKik+IEZpbHRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKEV4cHIgKkUpIC0+IEV4cHJSZXN1bHQgeyByZXR1cm4gRTsgfSk7CisKKyAgRXhwclJlc3VsdAorICBDb3JyZWN0RGVsYXllZFR5cG9zSW5FeHByKEV4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6ZnVuY3Rpb25fcmVmPEV4cHJSZXN1bHQoRXhwciAqKT4gRmlsdGVyKSB7CisgICAgcmV0dXJuIENvcnJlY3REZWxheWVkVHlwb3NJbkV4cHIoRSwgbnVsbHB0ciwgRmlsdGVyKTsKKyAgfQorCisgIEV4cHJSZXN1bHQKKyAgQ29ycmVjdERlbGF5ZWRUeXBvc0luRXhwcihFeHByUmVzdWx0IEVSLCBWYXJEZWNsICpJbml0RGVjbCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6ZnVuY3Rpb25fcmVmPEV4cHJSZXN1bHQoRXhwciAqKT4gRmlsdGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oRXhwciAqRSkgLT4gRXhwclJlc3VsdCB7IHJldHVybiBFOyB9KSB7CisgICAgcmV0dXJuIEVSLmlzSW52YWxpZCgpID8gRVIgOiBDb3JyZWN0RGVsYXllZFR5cG9zSW5FeHByKEVSLmdldCgpLCBGaWx0ZXIpOworICB9CisKKyAgRXhwclJlc3VsdAorICBDb3JyZWN0RGVsYXllZFR5cG9zSW5FeHByKEV4cHJSZXN1bHQgRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6ZnVuY3Rpb25fcmVmPEV4cHJSZXN1bHQoRXhwciAqKT4gRmlsdGVyKSB7CisgICAgcmV0dXJuIENvcnJlY3REZWxheWVkVHlwb3NJbkV4cHIoRVIsIG51bGxwdHIsIEZpbHRlcik7CisgIH0KKworICB2b2lkIGRpYWdub3NlVHlwbyhjb25zdCBUeXBvQ29ycmVjdGlvbiAmQ29ycmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFydGlhbERpYWdub3N0aWMgJlR5cG9EaWFnLAorICAgICAgICAgICAgICAgICAgICBib29sIEVycm9yUmVjb3ZlcnkgPSB0cnVlKTsKKworICB2b2lkIGRpYWdub3NlVHlwbyhjb25zdCBUeXBvQ29ycmVjdGlvbiAmQ29ycmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFydGlhbERpYWdub3N0aWMgJlR5cG9EaWFnLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmUHJldk5vdGUsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgRXJyb3JSZWNvdmVyeSA9IHRydWUpOworCisgIHZvaWQgTWFya1R5cG9Db3JyZWN0ZWRGdW5jdGlvbkRlZmluaXRpb24oY29uc3QgTmFtZWREZWNsICpGKTsKKworICB2b2lkIEZpbmRBc3NvY2lhdGVkQ2xhc3Nlc0FuZE5hbWVzcGFjZXMoU291cmNlTG9jYXRpb24gSW5zdGFudGlhdGlvbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzb2NpYXRlZE5hbWVzcGFjZVNldCAmQXNzb2NpYXRlZE5hbWVzcGFjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc29jaWF0ZWRDbGFzc1NldCAmQXNzb2NpYXRlZENsYXNzZXMpOworCisgIHZvaWQgRmlsdGVyTG9va3VwRm9yU2NvcGUoTG9va3VwUmVzdWx0ICZSLCBEZWNsQ29udGV4dCAqQ3R4LCBTY29wZSAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbnNpZGVyTGlua2FnZSwgYm9vbCBBbGxvd0lubGluZU5hbWVzcGFjZSk7CisKKyAgYm9vbCBDaGVja1JlZGVjbGFyYXRpb25Nb2R1bGVPd25lcnNoaXAoTmFtZWREZWNsICpOZXcsIE5hbWVkRGVjbCAqT2xkKTsKKworICB2b2lkIERpYWdub3NlQW1iaWd1b3VzTG9va3VwKExvb2t1cFJlc3VsdCAmUmVzdWx0KTsKKyAgLy9AfQorCisgIE9iakNJbnRlcmZhY2VEZWNsICpnZXRPYmpDSW50ZXJmYWNlRGVjbChJZGVudGlmaWVySW5mbyAqJklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFR5cG9Db3JyZWN0aW9uID0gZmFsc2UpOworICBOYW1lZERlY2wgKkxhemlseUNyZWF0ZUJ1aWx0aW4oSWRlbnRpZmllckluZm8gKklJLCB1bnNpZ25lZCBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlICpTLCBib29sIEZvclJlZGVjbGFyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpOworICBOYW1lZERlY2wgKkltcGxpY2l0bHlEZWZpbmVGdW5jdGlvbihTb3VyY2VMb2NhdGlvbiBMb2MsIElkZW50aWZpZXJJbmZvICZJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NvcGUgKlMpOworICB2b2lkIEFkZEtub3duRnVuY3Rpb25BdHRyaWJ1dGVzKEZ1bmN0aW9uRGVjbCAqRkQpOworCisgIC8vIE1vcmUgcGFyc2luZyBhbmQgc3ltYm9sIHRhYmxlIHN1YnJvdXRpbmVzLgorCisgIHZvaWQgUHJvY2Vzc1ByYWdtYVdlYWsoU2NvcGUgKlMsIERlY2wgKkQpOworICAvLyBEZWNsIGF0dHJpYnV0ZXMgLSB0aGlzIHJvdXRpbmUgaXMgdGhlIHRvcCBsZXZlbCBkaXNwYXRjaGVyLgorICB2b2lkIFByb2Nlc3NEZWNsQXR0cmlidXRlcyhTY29wZSAqUywgRGVjbCAqRCwgY29uc3QgRGVjbGFyYXRvciAmUEQpOworICAvLyBIZWxwZXIgZm9yIGRlbGF5ZWQgcHJvY2Vzc2luZyBvZiBhdHRyaWJ1dGVzLgorICB2b2lkIFByb2Nlc3NEZWNsQXR0cmlidXRlRGVsYXllZChEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICpBdHRyTGlzdCk7CisgIHZvaWQgUHJvY2Vzc0RlY2xBdHRyaWJ1dGVMaXN0KFNjb3BlICpTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICpBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlQ1hYMTFBdHRyaWJ1dGVzID0gdHJ1ZSk7CisgIGJvb2wgUHJvY2Vzc0FjY2Vzc0RlY2xBdHRyaWJ1dGVMaXN0KEFjY2Vzc1NwZWNEZWNsICpBU0RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgKkF0dHJMaXN0KTsKKworICB2b2lkIGNoZWNrVW51c2VkRGVjbEF0dHJpYnV0ZXMoRGVjbGFyYXRvciAmRCk7CisKKyAgLy8vIERldGVybWluZSBpZiB0eXBlIFQgaXMgYSB2YWxpZCBzdWJqZWN0IGZvciBhIG5vbm51bGwgYW5kIHNpbWlsYXIKKyAgLy8vIGF0dHJpYnV0ZXMuIEJ5IGRlZmF1bHQsIHdlIGxvb2sgdGhyb3VnaCByZWZlcmVuY2VzICh0aGUgYmVoYXZpb3IgdXNlZCBieQorICAvLy8gbm9ubnVsbCksIGJ1dCBpZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLCB0aGVuIHdlIHRyZWF0IGEgcmVmZXJlbmNlCisgIC8vLyB0eXBlIGFzIHZhbGlkLgorICBib29sIGlzVmFsaWRQb2ludGVyQXR0clR5cGUoUXVhbFR5cGUgVCwgYm9vbCBSZWZPa2F5ID0gZmFsc2UpOworCisgIGJvb2wgQ2hlY2tSZWdwYXJtQXR0cihjb25zdCBBdHRyaWJ1dGVMaXN0ICZhdHRyLCB1bnNpZ25lZCAmdmFsdWUpOworICBib29sIENoZWNrQ2FsbGluZ0NvbnZBdHRyKGNvbnN0IEF0dHJpYnV0ZUxpc3QgJmF0dHIsIENhbGxpbmdDb252ICZDQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkZEID0gbnVsbHB0cik7CisgIGJvb2wgQ2hlY2tBdHRyVGFyZ2V0KGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkN1cnJBdHRyKTsKKyAgYm9vbCBDaGVja0F0dHJOb0FyZ3MoY29uc3QgQXR0cmlidXRlTGlzdCAmQ3VyckF0dHIpOworICBib29sIGNoZWNrU3RyaW5nTGl0ZXJhbEFyZ3VtZW50QXR0cihjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBcmdOdW0sIFN0cmluZ1JlZiAmU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqQXJnTG9jYXRpb24gPSBudWxscHRyKTsKKyAgYm9vbCBjaGVja1NlY3Rpb25OYW1lKFNvdXJjZUxvY2F0aW9uIExpdGVyYWxMb2MsIFN0cmluZ1JlZiBTdHIpOworICBib29sIGNoZWNrVGFyZ2V0QXR0cihTb3VyY2VMb2NhdGlvbiBMaXRlcmFsTG9jLCBTdHJpbmdSZWYgU3RyKTsKKyAgYm9vbCBjaGVja01TSW5oZXJpdGFuY2VBdHRyT25EZWZpbml0aW9uKAorICAgICAgQ1hYUmVjb3JkRGVjbCAqUkQsIFNvdXJjZVJhbmdlIFJhbmdlLCBib29sIEJlc3RDYXNlLAorICAgICAgTVNJbmhlcml0YW5jZUF0dHI6OlNwZWxsaW5nIFNlbWFudGljU3BlbGxpbmcpOworCisgIHZvaWQgQ2hlY2tBbGlnbmFzVW5kZXJhbGlnbm1lbnQoRGVjbCAqRCk7CisKKyAgLy8vIEFkanVzdCB0aGUgY2FsbGluZyBjb252ZW50aW9uIG9mIGEgbWV0aG9kIHRvIGJlIHRoZSBBQkkgZGVmYXVsdCBpZiBpdAorICAvLy8gd2Fzbid0IHNwZWNpZmllZCBleHBsaWNpdGx5LiAgVGhpcyBoYW5kbGVzIG1ldGhvZCB0eXBlcyBmb3JtZWQgZnJvbQorICAvLy8gZnVuY3Rpb24gdHlwZSB0eXBlZGVmcyBhbmQgdHlwZW5hbWUgdGVtcGxhdGUgYXJndW1lbnRzLgorICB2b2lkIGFkanVzdE1lbWJlckZ1bmN0aW9uQ0MoUXVhbFR5cGUgJlQsIGJvb2wgSXNTdGF0aWMsIGJvb2wgSXNDdG9yT3JEdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKTsKKworICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbiBleHBsaWNpdCBhdHRyaWJ1dGUsIGJ1dCBvbmx5IGxvb2sgdGhyb3VnaCBwYXJlbnMuCisgIC8vIFRoZSBpbnRlbnQgaXMgdG8gbG9vayBmb3IgYW4gYXR0cmlidXRlIG9uIHRoZSBjdXJyZW50IGRlY2xhcmF0b3IsIGJ1dCBub3QKKyAgLy8gb25lIHRoYXQgY2FtZSBmcm9tIGEgdHlwZWRlZi4KKyAgYm9vbCBoYXNFeHBsaWNpdENhbGxpbmdDb252KFF1YWxUeXBlICZUKTsKKworICAvLy8gR2V0IHRoZSBvdXRlcm1vc3QgQXR0cmlidXRlZFR5cGUgbm9kZSB0aGF0IHNldHMgYSBjYWxsaW5nIGNvbnZlbnRpb24uCisgIC8vLyBWYWxpZCB0eXBlcyBzaG91bGQgbm90IGhhdmUgbXVsdGlwbGUgYXR0cmlidXRlcyB3aXRoIGRpZmZlcmVudCBDQ3MuCisgIGNvbnN0IEF0dHJpYnV0ZWRUeXBlICpnZXRDYWxsaW5nQ29udkF0dHJpYnV0ZWRUeXBlKFF1YWxUeXBlIFQpIGNvbnN0OworCisgIC8vLyBDaGVjayB3aGV0aGVyIGEgbnVsbGFiaWxpdHkgdHlwZSBzcGVjaWZpZXIgY2FuIGJlIGFkZGVkIHRvIHRoZSBnaXZlbgorICAvLy8gdHlwZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gdHlwZSBUaGUgdHlwZSB0byB3aGljaCB0aGUgbnVsbGFiaWxpdHkgc3BlY2lmaWVyIHdpbGwgYmUKKyAgLy8vIGFkZGVkLiBPbiBzdWNjZXNzLCB0aGlzIHR5cGUgd2lsbCBiZSB1cGRhdGVkIGFwcHJvcHJpYXRlbHkuCisgIC8vLworICAvLy8gXHBhcmFtIG51bGxhYmlsaXR5IFRoZSBudWxsYWJpbGl0eSBzcGVjaWZpZXIgdG8gYWRkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBudWxsYWJpbGl0eUxvYyBUaGUgbG9jYXRpb24gb2YgdGhlIG51bGxhYmlsaXR5IHNwZWNpZmllci4KKyAgLy8vCisgIC8vLyBccGFyYW0gaXNDb250ZXh0U2Vuc2l0aXZlIFdoZXRoZXIgdGhpcyBudWxsYWJpbGl0eSBzcGVjaWZpZXIgd2FzCisgIC8vLyB3cml0dGVuIGFzIGEgY29udGV4dC1zZW5zaXRpdmUga2V5d29yZCAoaW4gYW4gT2JqZWN0aXZlLUMKKyAgLy8vIG1ldGhvZCkgb3IgYW4gT2JqZWN0aXZlLUMgcHJvcGVydHkgYXR0cmlidXRlLCByYXRoZXIgdGhhbiBhcyBhbgorICAvLy8gdW5kZXJzY29yZWQgdHlwZSBzcGVjaWZpZXIuCisgIC8vLworICAvLy8gXHBhcmFtIGFsbG93QXJyYXlUeXBlcyBXaGV0aGVyIHRvIGFjY2VwdCBudWxsYWJpbGl0eSBzcGVjaWZpZXJzIG9uIGFuCisgIC8vLyBhcnJheSB0eXBlIChlLmcuLCBiZWNhdXNlIGl0IHdpbGwgZGVjYXkgdG8gYSBwb2ludGVyKS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIG51bGxhYmlsaXR5IGNhbm5vdCBiZSBhcHBsaWVkLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgY2hlY2tOdWxsYWJpbGl0eVR5cGVTcGVjaWZpZXIoUXVhbFR5cGUgJnR5cGUsIE51bGxhYmlsaXR5S2luZCBudWxsYWJpbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBudWxsYWJpbGl0eUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQ29udGV4dFNlbnNpdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93QXJyYXlUeXBlcyk7CisKKyAgLy8vIFxicmllZiBTdG10IGF0dHJpYnV0ZXMgLSB0aGlzIHJvdXRpbmUgaXMgdGhlIHRvcCBsZXZlbCBkaXNwYXRjaGVyLgorICBTdG10UmVzdWx0IFByb2Nlc3NTdG10QXR0cmlidXRlcyhTdG10ICpTdG10LCBBdHRyaWJ1dGVMaXN0ICpBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgUmFuZ2UpOworCisgIHZvaWQgV2FybkNvbmZsaWN0aW5nVHlwZWRNZXRob2RzKE9iakNNZXRob2REZWNsICpNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsICpNZXRob2REZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzUHJvdG9jb2xNZXRob2REZWNsKTsKKworICB2b2lkIENoZWNrQ29uZmxpY3RpbmdPdmVycmlkaW5nTWV0aG9kKE9iakNNZXRob2REZWNsICpNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsICpPdmVycmlkZGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzUHJvdG9jb2xNZXRob2REZWNsKTsKKworICAvLy8gV2FybkV4YWN0VHlwZWRNZXRob2RzIC0gVGhpcyByb3V0aW5lIGlzc3VlcyBhIHdhcm5pbmcgaWYgbWV0aG9kCisgIC8vLyBpbXBsZW1lbnRhdGlvbiBkZWNsYXJhdGlvbiBtYXRjaGVzIGV4YWN0bHkgdGhhdCBvZiBpdHMgZGVjbGFyYXRpb24uCisgIHZvaWQgV2FybkV4YWN0VHlwZWRNZXRob2RzKE9iakNNZXRob2REZWNsICpNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsICpNZXRob2REZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzUHJvdG9jb2xNZXRob2REZWNsKTsKKworICB0eXBlZGVmIGxsdm06OlNtYWxsUHRyU2V0PFNlbGVjdG9yLCA4PiBTZWxlY3RvclNldDsKKworICAvLy8gQ2hlY2tJbXBsZW1lbnRhdGlvbkl2YXJzIC0gVGhpcyByb3V0aW5lIGNoZWNrcyBpZiB0aGUgaW5zdGFuY2UgdmFyaWFibGVzCisgIC8vLyBsaXN0ZWQgaW4gdGhlIGltcGxlbGVtZW50YXRpb24gbWF0Y2ggdGhvc2UgbGlzdGVkIGluIHRoZSBpbnRlcmZhY2UuCisgIHZvaWQgQ2hlY2tJbXBsZW1lbnRhdGlvbkl2YXJzKE9iakNJbXBsZW1lbnRhdGlvbkRlY2wgKkltcERlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNJdmFyRGVjbCAqKkZpZWxkcywgdW5zaWduZWQgbkl2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpOworCisgIC8vLyBJbXBsTWV0aG9kc1ZzQ2xhc3NNZXRob2RzIC0gVGhpcyBpcyBtYWluIHJvdXRpbmUgdG8gd2FybiBpZiBhbnkgbWV0aG9kCisgIC8vLyByZW1haW5zIHVuaW1wbGVtZW50ZWQgaW4gdGhlIGNsYXNzIG9yIGNhdGVnb3J5IFxAaW1wbGVtZW50YXRpb24uCisgIHZvaWQgSW1wbE1ldGhvZHNWc0NsYXNzTWV0aG9kcyhTY29wZSAqUywgT2JqQ0ltcGxEZWNsKiBJTVBEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0NvbnRhaW5lckRlY2wqIElEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNvbXBsZXRlSW1wbCA9IGZhbHNlKTsKKworICAvLy8gRGlhZ25vc2VVbmltcGxlbWVudGVkUHJvcGVydGllcyAtIFRoaXMgcm91dGluZSB3YXJucyBvbiB0aG9zZSBwcm9wZXJ0aWVzCisgIC8vLyB3aGljaCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24uCisgIHZvaWQgRGlhZ25vc2VVbmltcGxlbWVudGVkUHJvcGVydGllcyhTY29wZSAqUywgT2JqQ0ltcGxEZWNsKiBJTVBEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0NvbnRhaW5lckRlY2wgKkNEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTeW50aGVzaXplUHJvcGVydGllcyk7CisKKyAgLy8vIERpYWdub3NlIGFueSBudWxsLXJlc2V0dGFibGUgc3ludGhlc2l6ZWQgc2V0dGVycy4KKyAgdm9pZCBkaWFnbm9zZU51bGxSZXNldHRhYmxlU3ludGhlc2l6ZWRTZXR0ZXJzKGNvbnN0IE9iakNJbXBsRGVjbCAqaW1wRGVjbCk7CisKKyAgLy8vIERlZmF1bHRTeW50aGVzaXplUHJvcGVydGllcyAtIFRoaXMgcm91dGluZSBkZWZhdWx0IHN5bnRoZXNpemVzIGFsbAorICAvLy8gcHJvcGVydGllcyB3aGljaCBtdXN0IGJlIHN5bnRoZXNpemVkIGluIHRoZSBjbGFzcydzIFxAaW1wbGVtZW50YXRpb24uCisgIHZvaWQgRGVmYXVsdFN5bnRoZXNpemVQcm9wZXJ0aWVzKFNjb3BlICpTLCBPYmpDSW1wbERlY2wgKklNUERlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNJbnRlcmZhY2VEZWNsICpJRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXRFbmQpOworICB2b2lkIERlZmF1bHRTeW50aGVzaXplUHJvcGVydGllcyhTY29wZSAqUywgRGVjbCAqRCwgU291cmNlTG9jYXRpb24gQXRFbmQpOworCisgIC8vLyBJdmFyQmFja3NDdXJyZW50TWV0aG9kQWNjZXNzb3IgLSBUaGlzIHJvdXRpbmUgcmV0dXJucyAndHJ1ZScgaWYgJ0lWJyBpcworICAvLy8gYW4gaXZhciBzeW50aGVzaXplZCBmb3IgJ01ldGhvZCcgYW5kICdNZXRob2QnIGlzIGEgcHJvcGVydHkgYWNjZXNzb3IKKyAgLy8vIGRlY2xhcmVkIGluIGNsYXNzICdJRmFjZScuCisgIGJvb2wgSXZhckJhY2tzQ3VycmVudE1ldGhvZEFjY2Vzc29yKE9iakNJbnRlcmZhY2VEZWNsICpJRmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ01ldGhvZERlY2wgKk1ldGhvZCwgT2JqQ0l2YXJEZWNsICpJVik7CisKKyAgLy8vIERpYWdub3NlVW51c2VkQmFja2luZ0l2YXJJbkFjY2Vzc29yIC0gSXNzdWUgYW4gJ3VudXNlZCcgd2FybmluZyBpZiBpdmFyIHdoaWNoCisgIC8vLyBiYWNrcyB0aGUgcHJvcGVydHkgaXMgbm90IHVzZWQgaW4gdGhlIHByb3BlcnR5J3MgYWNjZXNzb3IuCisgIHZvaWQgRGlhZ25vc2VVbnVzZWRCYWNraW5nSXZhckluQWNjZXNzb3IoU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqSW1wbEQpOworCisgIC8vLyBHZXRJdmFyQmFja2luZ1Byb3BlcnR5QWNjZXNzb3IgLSBJZiBtZXRob2QgaXMgYSBwcm9wZXJ0eSBzZXR0ZXIvZ2V0dGVyIGFuZAorICAvLy8gaXQgcHJvcGVydHkgaGFzIGEgYmFja2luZyBpdmFyLCByZXR1cm5zIHRoaXMgaXZhcjsgb3RoZXJ3aXNlLCByZXR1cm5zIE5VTEwuCisgIC8vLyBJdCBhbHNvIHJldHVybnMgaXZhcidzIHByb3BlcnR5IG9uIHN1Y2Nlc3MuCisgIE9iakNJdmFyRGVjbCAqR2V0SXZhckJhY2tpbmdQcm9wZXJ0eUFjY2Vzc29yKGNvbnN0IE9iakNNZXRob2REZWNsICpNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNQcm9wZXJ0eURlY2wgKiZQRGVjbCkgY29uc3Q7CisKKyAgLy8vIENhbGxlZCBieSBBY3RPblByb3BlcnR5IHRvIGhhbmRsZSBcQHByb3BlcnR5IGRlY2xhcmF0aW9ucyBpbgorICAvLy8gY2xhc3MgZXh0ZW5zaW9ucy4KKyAgT2JqQ1Byb3BlcnR5RGVjbCAqSGFuZGxlUHJvcGVydHlJbkNsYXNzRXh0ZW5zaW9uKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEF0TG9jLAorICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlY2xhcmF0b3IgJkZELAorICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIEdldHRlclNlbCwKKyAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBHZXR0ZXJOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIFNldHRlclNlbCwKKyAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTZXR0ZXJOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgaXNSZWFkV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgQXR0cmlidXRlc0FzV3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUU0ksCisgICAgICAgICAgICAgICAgICAgICAgdG9rOjpPYmpDS2V5d29yZEtpbmQgTWV0aG9kSW1wbEtpbmQpOworCisgIC8vLyBDYWxsZWQgYnkgQWN0T25Qcm9wZXJ0eSBhbmQgSGFuZGxlUHJvcGVydHlJbkNsYXNzRXh0ZW5zaW9uIHRvCisgIC8vLyBoYW5kbGUgY3JlYXRpbmcgdGhlIE9iamNQcm9wZXJ0eURlY2wgZm9yIGEgY2F0ZWdvcnkgb3IgXEBpbnRlcmZhY2UuCisgIE9iakNQcm9wZXJ0eURlY2wgKkNyZWF0ZVByb3BlcnR5RGVjbChTY29wZSAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNDb250YWluZXJEZWNsICpDRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEF0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZWNsYXJhdG9yICZGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIEdldHRlclNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEdldHRlck5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBTZXR0ZXJTZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTZXR0ZXJOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBpc1JlYWRXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIEF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBBdHRyaWJ1dGVzQXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6Ok9iakNLZXl3b3JkS2luZCBNZXRob2RJbXBsS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpsZXhpY2FsREMgPSBudWxscHRyKTsKKworICAvLy8gQXRvbWljUHJvcGVydHlTZXR0ZXJHZXR0ZXJSdWxlcyAtIFRoaXMgcm91dGluZSBlbmZvcmNlcyB0aGUgcnVsZSAodmlhCisgIC8vLyB3YXJuaW5nKSB3aGVuIGF0b21pYyBwcm9wZXJ0eSBoYXMgb25lIGJ1dCBub3QgdGhlIG90aGVyIHVzZXItZGVjbGFyZWQKKyAgLy8vIHNldHRlciBvciBnZXR0ZXIuCisgIHZvaWQgQXRvbWljUHJvcGVydHlTZXR0ZXJHZXR0ZXJSdWxlcyhPYmpDSW1wbERlY2wqIElNUERlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDSW50ZXJmYWNlRGVjbCogSURlY2wpOworCisgIHZvaWQgRGlhZ25vc2VPd25pbmdQcm9wZXJ0eUdldHRlclN5bnRoZXNpcyhjb25zdCBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpEKTsKKworICB2b2lkIERpYWdub3NlTWlzc2luZ0Rlc2lnbmF0ZWRJbml0T3ZlcnJpZGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqSW1wbEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqSUZEKTsKKworICB2b2lkIERpYWdub3NlRHVwbGljYXRlSXZhcnMoT2JqQ0ludGVyZmFjZURlY2wgKklELCBPYmpDSW50ZXJmYWNlRGVjbCAqU0lEKTsKKworICBlbnVtIE1ldGhvZE1hdGNoU3RyYXRlZ3kgeworICAgIE1NU19sb29zZSwKKyAgICBNTVNfc3RyaWN0CisgIH07CisKKyAgLy8vIE1hdGNoVHdvTWV0aG9kRGVjbGFyYXRpb25zIC0gQ2hlY2tzIGlmIHR3byBtZXRob2RzJyB0eXBlIG1hdGNoIGFuZCByZXR1cm5zCisgIC8vLyB0cnVlLCBvciBmYWxzZSwgYWNjb3JkaW5nbHkuCisgIGJvb2wgTWF0Y2hUd29NZXRob2REZWNsYXJhdGlvbnMoY29uc3QgT2JqQ01ldGhvZERlY2wgKk1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqUHJldk1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXRjaFN0cmF0ZWd5IHN0cmF0ZWd5ID0gTU1TX3N0cmljdCk7CisKKyAgLy8vIE1hdGNoQWxsTWV0aG9kRGVjbGFyYXRpb25zIC0gQ2hlY2sgbWV0aG9kcyBkZWNsYXJhZWQgaW4gaW50ZXJmYWNlIG9yCisgIC8vLyBvciBwcm90b2NvbCBhZ2FpbnN0IHRob3NlIGRlY2xhcmVkIGluIHRoZWlyIGltcGxlbWVudGF0aW9ucy4KKyAgdm9pZCBNYXRjaEFsbE1ldGhvZERlY2xhcmF0aW9ucyhjb25zdCBTZWxlY3RvclNldCAmSW5zTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbGVjdG9yU2V0ICZDbHNNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3JTZXQgJkluc01hcFNlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3JTZXQgJkNsc01hcFNlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ltcGxEZWNsKiBJTVBEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNDb250YWluZXJEZWNsKiBJRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZJbmNvbXBsZXRlSW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEltbWVkaWF0ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgV2FybkNhdGVnb3J5TWV0aG9kSW1wbD1mYWxzZSk7CisKKyAgLy8vIENoZWNrQ2F0ZWdvcnlWc0NsYXNzTWV0aG9kTWF0Y2hlcyAtIENoZWNrcyB0aGF0IG1ldGhvZHMgaW1wbGVtZW50ZWQgaW4KKyAgLy8vIGNhdGVnb3J5IG1hdGNoZXMgd2l0aCB0aG9zZSBpbXBsZW1lbnRlZCBpbiBpdHMgcHJpbWFyeSBjbGFzcyBhbmQKKyAgLy8vIHdhcm5zIGVhY2ggdGltZSBhbiBleGFjdCBtYXRjaCBpcyBmb3VuZC4KKyAgdm9pZCBDaGVja0NhdGVnb3J5VnNDbGFzc01ldGhvZE1hdGNoZXMoT2JqQ0NhdGVnb3J5SW1wbERlY2wgKkNhdElNUCk7CisKKyAgLy8vIFxicmllZiBBZGQgdGhlIGdpdmVuIG1ldGhvZCB0byB0aGUgbGlzdCBvZiBnbG9iYWxseS1rbm93biBtZXRob2RzLgorICB2b2lkIGFkZE1ldGhvZFRvR2xvYmFsTGlzdChPYmpDTWV0aG9kTGlzdCAqTGlzdCwgT2JqQ01ldGhvZERlY2wgKk1ldGhvZCk7CisKK3ByaXZhdGU6CisgIC8vLyBBZGRNZXRob2RUb0dsb2JhbFBvb2wgLSBBZGQgYW4gaW5zdGFuY2Ugb3IgZmFjdG9yeSBtZXRob2QgdG8gdGhlIGdsb2JhbAorICAvLy8gcG9vbC4gU2VlIGRlc2NyaXB0b2luIG9mIEFkZEluc3RhbmNlTWV0aG9kVG9HbG9iYWxQb29sLgorICB2b2lkIEFkZE1ldGhvZFRvR2xvYmFsUG9vbChPYmpDTWV0aG9kRGVjbCAqTWV0aG9kLCBib29sIGltcGwsIGJvb2wgaW5zdGFuY2UpOworCisgIC8vLyBMb29rdXBNZXRob2RJbkdsb2JhbFBvb2wgLSBSZXR1cm5zIHRoZSBpbnN0YW5jZSBvciBmYWN0b3J5IG1ldGhvZCBhbmQKKyAgLy8vIG9wdGlvbmFsbHkgd2FybnMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHNpZ25hdHVyZXMuCisgIE9iakNNZXRob2REZWNsICpMb29rdXBNZXRob2RJbkdsb2JhbFBvb2woU2VsZWN0b3IgU2VsLCBTb3VyY2VSYW5nZSBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVjZWl2ZXJJZE9yQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnN0YW5jZSk7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiAtIFJldHVybnMgaW5zdGFuY2Ugb3IgZmFjdG9yeSBtZXRob2RzIGluIGdsb2JhbCBtZXRob2QgcG9vbCBmb3IKKyAgLy8vIGdpdmVuIHNlbGVjdG9yLiBJdCBjaGVja3MgdGhlIGRlc2lyZWQga2luZCBmaXJzdCwgaWYgbm9uZSBpcyBmb3VuZCwgYW5kCisgIC8vLyBwYXJhbWV0ZXIgY2hlY2tUaGVPdGhlciBpcyBzZXQsIGl0IHRoZW4gY2hlY2tzIHRoZSBvdGhlciBraW5kLiBJZiBubyBzdWNoCisgIC8vLyBtZXRob2Qgb3Igb25seSBvbmUgbWV0aG9kIGlzIGZvdW5kLCBmdW5jdGlvbiByZXR1cm5zIGZhbHNlOyBvdGhlcndpc2UsIGl0CisgIC8vLyByZXR1cm5zIHRydWUuCisgIGJvb2wKKyAgQ29sbGVjdE11bHRpcGxlTWV0aG9kc0luR2xvYmFsUG9vbChTZWxlY3RvciBTZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE9iakNNZXRob2REZWNsKj4mIE1ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbnN0YW5jZUZpcnN0LCBib29sIENoZWNrVGhlT3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ09iamVjdFR5cGUgKlR5cGVCb3VuZCA9IG51bGxwdHIpOworCisgIGJvb2wKKyAgQXJlTXVsdGlwbGVNZXRob2RzSW5HbG9iYWxQb29sKFNlbGVjdG9yIFNlbCwgT2JqQ01ldGhvZERlY2wgKkJlc3RNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSLCBib29sIHJlY2VpdmVySWRPckNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE9iakNNZXRob2REZWNsKj4mIE1ldGhvZHMpOworCisgIHZvaWQKKyAgRGlhZ25vc2VNdWx0aXBsZU1ldGhvZEluR2xvYmFsUG9vbChTbWFsbFZlY3RvckltcGw8T2JqQ01ldGhvZERlY2wqPiAmTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBTZWwsIFNvdXJjZVJhbmdlIFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWNlaXZlcklkT3JDbGFzcyk7CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgLSBSZXR1cm5zIGEgc2VsZWN0b3Igd2hpY2ggYmVzdCBtYXRjaGVzIGdpdmVuIGFyZ3VtZW50IGxpc3Qgb3IKKyAgLy8vIG51bGxwdHIgaWYgbm9uZSBjb3VsZCBiZSBmb3VuZAorICBPYmpDTWV0aG9kRGVjbCAqU2VsZWN0QmVzdE1ldGhvZChTZWxlY3RvciBTZWwsIE11bHRpRXhwckFyZyBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxPYmpDTWV0aG9kRGVjbCo+JiBNZXRob2RzKTsKKworCisgIC8vLyBcYnJpZWYgUmVjb3JkIHRoZSB0eXBvIGNvcnJlY3Rpb24gZmFpbHVyZSBhbmQgcmV0dXJuIGFuIGVtcHR5IGNvcnJlY3Rpb24uCisgIFR5cG9Db3JyZWN0aW9uIEZhaWxlZENvcnJlY3Rpb24oSWRlbnRpZmllckluZm8gKlR5cG8sIFNvdXJjZUxvY2F0aW9uIFR5cG9Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZWNvcmRGYWlsdXJlID0gdHJ1ZSkgeworICAgIGlmIChSZWNvcmRGYWlsdXJlKQorICAgICAgVHlwb0NvcnJlY3Rpb25GYWlsdXJlc1tUeXBvXS5pbnNlcnQoVHlwb0xvYyk7CisgICAgcmV0dXJuIFR5cG9Db3JyZWN0aW9uKCk7CisgIH0KKworcHVibGljOgorICAvLy8gQWRkSW5zdGFuY2VNZXRob2RUb0dsb2JhbFBvb2wgLSBBbGwgaW5zdGFuY2UgbWV0aG9kcyBpbiBhIHRyYW5zbGF0aW9uCisgIC8vLyB1bml0IGFyZSBhZGRlZCB0byBhIGdsb2JhbCBwb29sLiBUaGlzIGFsbG93cyB1cyB0byBlZmZpY2llbnRseSBhc3NvY2lhdGUKKyAgLy8vIGEgc2VsZWN0b3Igd2l0aCBhIG1ldGhvZCBkZWNsYXJhYXRpb24gZm9yIHB1cnBvc2VzIG9mIHR5cGVjaGVja2luZworICAvLy8gbWVzc2FnZXMgc2VudCB0byAiaWQiICh3aGVyZSB0aGUgY2xhc3Mgb2YgdGhlIG9iamVjdCBpcyB1bmtub3duKS4KKyAgdm9pZCBBZGRJbnN0YW5jZU1ldGhvZFRvR2xvYmFsUG9vbChPYmpDTWV0aG9kRGVjbCAqTWV0aG9kLCBib29sIGltcGw9ZmFsc2UpIHsKKyAgICBBZGRNZXRob2RUb0dsb2JhbFBvb2woTWV0aG9kLCBpbXBsLCAvKmluc3RhbmNlKi90cnVlKTsKKyAgfQorCisgIC8vLyBBZGRGYWN0b3J5TWV0aG9kVG9HbG9iYWxQb29sIC0gU2FtZSBhcyBhYm92ZSwgYnV0IGZvciBmYWN0b3J5IG1ldGhvZHMuCisgIHZvaWQgQWRkRmFjdG9yeU1ldGhvZFRvR2xvYmFsUG9vbChPYmpDTWV0aG9kRGVjbCAqTWV0aG9kLCBib29sIGltcGw9ZmFsc2UpIHsKKyAgICBBZGRNZXRob2RUb0dsb2JhbFBvb2woTWV0aG9kLCBpbXBsLCAvKmluc3RhbmNlKi9mYWxzZSk7CisgIH0KKworICAvLy8gQWRkQW55TWV0aG9kVG9HbG9iYWxQb29sIC0gQWRkIGFueSBtZXRob2QsIGluc3RhbmNlIG9yIGZhY3RvcnkgdG8gZ2xvYmFsCisgIC8vLyBwb29sLgorICB2b2lkIEFkZEFueU1ldGhvZFRvR2xvYmFsUG9vbChEZWNsICpEKTsKKworICAvLy8gTG9va3VwSW5zdGFuY2VNZXRob2RJbkdsb2JhbFBvb2wgLSBSZXR1cm5zIHRoZSBtZXRob2QgYW5kIHdhcm5zIGlmCisgIC8vLyB0aGVyZSBhcmUgbXVsdGlwbGUgc2lnbmF0dXJlcy4KKyAgT2JqQ01ldGhvZERlY2wgKkxvb2t1cEluc3RhbmNlTWV0aG9kSW5HbG9iYWxQb29sKFNlbGVjdG9yIFNlbCwgU291cmNlUmFuZ2UgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVjZWl2ZXJJZE9yQ2xhc3M9ZmFsc2UpIHsKKyAgICByZXR1cm4gTG9va3VwTWV0aG9kSW5HbG9iYWxQb29sKFNlbCwgUiwgcmVjZWl2ZXJJZE9yQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmluc3RhbmNlKi90cnVlKTsKKyAgfQorCisgIC8vLyBMb29rdXBGYWN0b3J5TWV0aG9kSW5HbG9iYWxQb29sIC0gUmV0dXJucyB0aGUgbWV0aG9kIGFuZCB3YXJucyBpZgorICAvLy8gdGhlcmUgYXJlIG11bHRpcGxlIHNpZ25hdHVyZXMuCisgIE9iakNNZXRob2REZWNsICpMb29rdXBGYWN0b3J5TWV0aG9kSW5HbG9iYWxQb29sKFNlbGVjdG9yIFNlbCwgU291cmNlUmFuZ2UgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWNlaXZlcklkT3JDbGFzcz1mYWxzZSkgeworICAgIHJldHVybiBMb29rdXBNZXRob2RJbkdsb2JhbFBvb2woU2VsLCBSLCByZWNlaXZlcklkT3JDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaW5zdGFuY2UqL2ZhbHNlKTsKKyAgfQorCisgIGNvbnN0IE9iakNNZXRob2REZWNsICpTZWxlY3RvcnNGb3JUeXBvQ29ycmVjdGlvbihTZWxlY3RvciBTZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBPYmplY3RUeXBlPVF1YWxUeXBlKCkpOworICAvLy8gTG9va3VwSW1wbGVtZW50ZWRNZXRob2RJbkdsb2JhbFBvb2wgLSBSZXR1cm5zIHRoZSBtZXRob2Qgd2hpY2ggaGFzIGFuCisgIC8vLyBpbXBsZW1lbnRhdGlvbi4KKyAgT2JqQ01ldGhvZERlY2wgKkxvb2t1cEltcGxlbWVudGVkTWV0aG9kSW5HbG9iYWxQb29sKFNlbGVjdG9yIFNlbCk7CisKKyAgLy8vIENvbGxlY3RJdmFyc1RvQ29uc3RydWN0T3JEZXN0cnVjdCAtIENvbGxlY3QgdGhvc2UgaXZhcnMgd2hpY2ggcmVxdWlyZQorICAvLy8gaW5pdGlhbGl6YXRpb24uCisgIHZvaWQgQ29sbGVjdEl2YXJzVG9Db25zdHJ1Y3RPckRlc3RydWN0KE9iakNJbnRlcmZhY2VEZWNsICpPSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8T2JqQ0l2YXJEZWNsKj4gJkl2YXJzKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gU3RhdGVtZW50IFBhcnNpbmcgQ2FsbGJhY2tzOiBTZW1hU3RtdC5jcHAuCitwdWJsaWM6CisgIGNsYXNzIEZ1bGxFeHByQXJnIHsKKyAgcHVibGljOgorICAgIEZ1bGxFeHByQXJnKCkgOiBFKG51bGxwdHIpIHsgfQorICAgIEZ1bGxFeHByQXJnKFNlbWEgJmFjdGlvbnMpIDogRShudWxscHRyKSB7IH0KKworICAgIEV4cHJSZXN1bHQgcmVsZWFzZSgpIHsKKyAgICAgIHJldHVybiBFOworICAgIH0KKworICAgIEV4cHIgKmdldCgpIGNvbnN0IHsgcmV0dXJuIEU7IH0KKworICAgIEV4cHIgKm9wZXJhdG9yLT4oKSB7CisgICAgICByZXR1cm4gRTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICAvLyBGSVhNRTogTm8gbmVlZCB0byBtYWtlIHRoZSBlbnRpcmUgU2VtYSBjbGFzcyBhIGZyaWVuZCB3aGVuIGl0J3MganVzdAorICAgIC8vIFNlbWE6Ok1ha2VGdWxsRXhwciB0aGF0IG5lZWRzIGFjY2VzcyB0byB0aGUgY29uc3RydWN0b3IgYmVsb3cuCisgICAgZnJpZW5kIGNsYXNzIFNlbWE7CisKKyAgICBleHBsaWNpdCBGdWxsRXhwckFyZyhFeHByICpleHByKSA6IEUoZXhwcikge30KKworICAgIEV4cHIgKkU7CisgIH07CisKKyAgRnVsbEV4cHJBcmcgTWFrZUZ1bGxFeHByKEV4cHIgKkFyZykgeworICAgIHJldHVybiBNYWtlRnVsbEV4cHIoQXJnLCBBcmcgPyBBcmctPmdldEV4cHJMb2MoKSA6IFNvdXJjZUxvY2F0aW9uKCkpOworICB9CisgIEZ1bGxFeHByQXJnIE1ha2VGdWxsRXhwcihFeHByICpBcmcsIFNvdXJjZUxvY2F0aW9uIENDKSB7CisgICAgcmV0dXJuIEZ1bGxFeHByQXJnKEFjdE9uRmluaXNoRnVsbEV4cHIoQXJnLCBDQykuZ2V0KCkpOworICB9CisgIEZ1bGxFeHByQXJnIE1ha2VGdWxsRGlzY2FyZGVkVmFsdWVFeHByKEV4cHIgKkFyZykgeworICAgIEV4cHJSZXN1bHQgRkUgPQorICAgICAgQWN0T25GaW5pc2hGdWxsRXhwcihBcmcsIEFyZyA/IEFyZy0+Z2V0RXhwckxvYygpIDogU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLypEaXNjYXJkZWRWYWx1ZSovIHRydWUpOworICAgIHJldHVybiBGdWxsRXhwckFyZyhGRS5nZXQoKSk7CisgIH0KKworICBTdG10UmVzdWx0IEFjdE9uRXhwclN0bXQoRXhwclJlc3VsdCBBcmcpOworICBTdG10UmVzdWx0IEFjdE9uRXhwclN0bXRFcnJvcigpOworCisgIFN0bXRSZXN1bHQgQWN0T25OdWxsU3RtdChTb3VyY2VMb2NhdGlvbiBTZW1pTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNMZWFkaW5nRW1wdHlNYWNybyA9IGZhbHNlKTsKKworICB2b2lkIEFjdE9uU3RhcnRPZkNvbXBvdW5kU3RtdChib29sIElzU3RtdEV4cHIpOworICB2b2lkIEFjdE9uRmluaXNoT2ZDb21wb3VuZFN0bXQoKTsKKyAgU3RtdFJlc3VsdCBBY3RPbkNvbXBvdW5kU3RtdChTb3VyY2VMb2NhdGlvbiBMLCBTb3VyY2VMb2NhdGlvbiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFN0bXQgKj4gRWx0cywgYm9vbCBpc1N0bXRFeHByKTsKKworICAvLy8gXGJyaWVmIEEgUkFJSSBvYmplY3QgdG8gZW50ZXIgc2NvcGUgb2YgYSBjb21wb3VuZCBzdGF0ZW1lbnQuCisgIGNsYXNzIENvbXBvdW5kU2NvcGVSQUlJIHsKKyAgcHVibGljOgorICAgIENvbXBvdW5kU2NvcGVSQUlJKFNlbWEgJlMsIGJvb2wgSXNTdG10RXhwciA9IGZhbHNlKSA6IFMoUykgeworICAgICAgUy5BY3RPblN0YXJ0T2ZDb21wb3VuZFN0bXQoSXNTdG10RXhwcik7CisgICAgfQorCisgICAgfkNvbXBvdW5kU2NvcGVSQUlJKCkgeworICAgICAgUy5BY3RPbkZpbmlzaE9mQ29tcG91bmRTdG10KCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgU2VtYSAmUzsKKyAgfTsKKworICAvLy8gQW4gUkFJSSBoZWxwZXIgdGhhdCBwb3BzIGZ1bmN0aW9uIGEgZnVuY3Rpb24gc2NvcGUgb24gZXhpdC4KKyAgc3RydWN0IEZ1bmN0aW9uU2NvcGVSQUlJIHsKKyAgICBTZW1hICZTOworICAgIGJvb2wgQWN0aXZlOworICAgIEZ1bmN0aW9uU2NvcGVSQUlJKFNlbWEgJlMpIDogUyhTKSwgQWN0aXZlKHRydWUpIHt9CisgICAgfkZ1bmN0aW9uU2NvcGVSQUlJKCkgeworICAgICAgaWYgKEFjdGl2ZSkKKyAgICAgICAgUy5Qb3BGdW5jdGlvblNjb3BlSW5mbygpOworICAgIH0KKyAgICB2b2lkIGRpc2FibGUoKSB7IEFjdGl2ZSA9IGZhbHNlOyB9CisgIH07CisKKyAgU3RtdFJlc3VsdCBBY3RPbkRlY2xTdG10KERlY2xHcm91cFB0clR5IERlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICB2b2lkIEFjdE9uRm9yRWFjaERlY2xTdG10KERlY2xHcm91cFB0clR5IERlY2wpOworICBTdG10UmVzdWx0IEFjdE9uRm9yRWFjaExWYWx1ZUV4cHIoRXhwciAqRSk7CisgIFN0bXRSZXN1bHQgQWN0T25DYXNlU3RtdChTb3VyY2VMb2NhdGlvbiBDYXNlTG9jLCBFeHByICpMSFNWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIERvdERvdERvdExvYywgRXhwciAqUkhTVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYyk7CisgIHZvaWQgQWN0T25DYXNlU3RtdEJvZHkoU3RtdCAqQ2FzZVN0bXQsIFN0bXQgKlN1YlN0bXQpOworCisgIFN0bXRSZXN1bHQgQWN0T25EZWZhdWx0U3RtdChTb3VyY2VMb2NhdGlvbiBEZWZhdWx0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdCAqU3ViU3RtdCwgU2NvcGUgKkN1clNjb3BlKTsKKyAgU3RtdFJlc3VsdCBBY3RPbkxhYmVsU3RtdChTb3VyY2VMb2NhdGlvbiBJZGVudExvYywgTGFiZWxEZWNsICpUaGVEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENvbG9uTG9jLCBTdG10ICpTdWJTdG10KTsKKworICBTdG10UmVzdWx0IEFjdE9uQXR0cmlidXRlZFN0bXQoU291cmNlTG9jYXRpb24gQXR0ckxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IEF0dHIqPiBBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKlN1YlN0bXQpOworCisgIGNsYXNzIENvbmRpdGlvblJlc3VsdDsKKyAgU3RtdFJlc3VsdCBBY3RPbklmU3RtdChTb3VyY2VMb2NhdGlvbiBJZkxvYywgYm9vbCBJc0NvbnN0ZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpJbml0U3RtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb25SZXN1bHQgQ29uZCwgU3RtdCAqVGhlblZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbHNlTG9jLCBTdG10ICpFbHNlVmFsKTsKKyAgU3RtdFJlc3VsdCBCdWlsZElmU3RtdChTb3VyY2VMb2NhdGlvbiBJZkxvYywgYm9vbCBJc0NvbnN0ZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpJbml0U3RtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb25SZXN1bHQgQ29uZCwgU3RtdCAqVGhlblZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbHNlTG9jLCBTdG10ICpFbHNlVmFsKTsKKyAgU3RtdFJlc3VsdCBBY3RPblN0YXJ0T2ZTd2l0Y2hTdG10KFNvdXJjZUxvY2F0aW9uIFN3aXRjaExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKkluaXRTdG10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uUmVzdWx0IENvbmQpOworICBTdG10UmVzdWx0IEFjdE9uRmluaXNoU3dpdGNoU3RtdChTb3VyY2VMb2NhdGlvbiBTd2l0Y2hMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdCAqU3dpdGNoLCBTdG10ICpCb2R5KTsKKyAgU3RtdFJlc3VsdCBBY3RPbldoaWxlU3RtdChTb3VyY2VMb2NhdGlvbiBXaGlsZUxvYywgQ29uZGl0aW9uUmVzdWx0IENvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdCAqQm9keSk7CisgIFN0bXRSZXN1bHQgQWN0T25Eb1N0bXQoU291cmNlTG9jYXRpb24gRG9Mb2MsIFN0bXQgKkJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gV2hpbGVMb2MsIFNvdXJjZUxvY2F0aW9uIENvbmRMUGFyZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqQ29uZCwgU291cmNlTG9jYXRpb24gQ29uZFJQYXJlbik7CisKKyAgU3RtdFJlc3VsdCBBY3RPbkZvclN0bXQoU291cmNlTG9jYXRpb24gRm9yTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKkZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb25SZXN1bHQgU2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGdWxsRXhwckFyZyBUaGlyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpCb2R5KTsKKyAgRXhwclJlc3VsdCBDaGVja09iakNGb3JDb2xsZWN0aW9uT3BlcmFuZChTb3VyY2VMb2NhdGlvbiBmb3JMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqY29sbGVjdGlvbik7CisgIFN0bXRSZXN1bHQgQWN0T25PYmpDRm9yQ29sbGVjdGlvblN0bXQoU291cmNlTG9jYXRpb24gRm9yQ29sTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKkZpcnN0LCBFeHByICpjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYyk7CisgIFN0bXRSZXN1bHQgRmluaXNoT2JqQ0ZvckNvbGxlY3Rpb25TdG10KFN0bXQgKkZvckNvbGxlY3Rpb24sIFN0bXQgKkJvZHkpOworCisgIGVudW0gQnVpbGRGb3JSYW5nZUtpbmQgeworICAgIC8vLyBJbml0aWFsIGJ1aWxkaW5nIG9mIGEgZm9yLXJhbmdlIHN0YXRlbWVudC4KKyAgICBCRlJLX0J1aWxkLAorICAgIC8vLyBJbnN0YW50aWF0aW9uIG9yIHJlY292ZXJ5IHJlYnVpbGQgb2YgYSBmb3ItcmFuZ2Ugc3RhdGVtZW50LiBEb24ndAorICAgIC8vLyBhdHRlbXB0IGFueSB0eXBvLWNvcnJlY3Rpb24uCisgICAgQkZSS19SZWJ1aWxkLAorICAgIC8vLyBEZXRlcm1pbmluZyB3aGV0aGVyIGEgZm9yLXJhbmdlIHN0YXRlbWVudCBjb3VsZCBiZSBidWlsdC4gQXZvaWQgYW55CisgICAgLy8vIHVubmVjZXNzYXJ5IG9yIGlycmV2ZXJzaWJsZSBhY3Rpb25zLgorICAgIEJGUktfQ2hlY2sKKyAgfTsKKworICBTdG10UmVzdWx0IEFjdE9uQ1hYRm9yUmFuZ2VTdG10KFNjb3BlICpTLCBTb3VyY2VMb2NhdGlvbiBGb3JMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQ29hd2FpdExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpMb29wVmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENvbG9uTG9jLCBFeHByICpDb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZEZvclJhbmdlS2luZCBLaW5kKTsKKyAgU3RtdFJlc3VsdCBCdWlsZENYWEZvclJhbmdlU3RtdChTb3VyY2VMb2NhdGlvbiBGb3JMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQ29hd2FpdExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpSYW5nZURlY2wsIFN0bXQgKkJlZ2luLCBTdG10ICpFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqQ29uZCwgRXhwciAqSW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKkxvb3BWYXJEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZEZvclJhbmdlS2luZCBLaW5kKTsKKyAgU3RtdFJlc3VsdCBGaW5pc2hDWFhGb3JSYW5nZVN0bXQoU3RtdCAqRm9yUmFuZ2UsIFN0bXQgKkJvZHkpOworCisgIFN0bXRSZXN1bHQgQWN0T25Hb3RvU3RtdChTb3VyY2VMb2NhdGlvbiBHb3RvTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTGFiZWxMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbERlY2wgKlRoZURlY2wpOworICBTdG10UmVzdWx0IEFjdE9uSW5kaXJlY3RHb3RvU3RtdChTb3VyY2VMb2NhdGlvbiBHb3RvTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpEZXN0RXhwKTsKKyAgU3RtdFJlc3VsdCBBY3RPbkNvbnRpbnVlU3RtdChTb3VyY2VMb2NhdGlvbiBDb250aW51ZUxvYywgU2NvcGUgKkN1clNjb3BlKTsKKyAgU3RtdFJlc3VsdCBBY3RPbkJyZWFrU3RtdChTb3VyY2VMb2NhdGlvbiBCcmVha0xvYywgU2NvcGUgKkN1clNjb3BlKTsKKworICB2b2lkIEFjdE9uQ2FwdHVyZWRSZWdpb25TdGFydChTb3VyY2VMb2NhdGlvbiBMb2MsIFNjb3BlICpDdXJTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZWRSZWdpb25LaW5kIEtpbmQsIHVuc2lnbmVkIE51bVBhcmFtcyk7CisgIHR5cGVkZWYgc3RkOjpwYWlyPFN0cmluZ1JlZiwgUXVhbFR5cGU+IENhcHR1cmVkUGFyYW1OYW1lVHlwZTsKKyAgdm9pZCBBY3RPbkNhcHR1cmVkUmVnaW9uU3RhcnQoU291cmNlTG9jYXRpb24gTG9jLCBTY29wZSAqQ3VyU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVkUmVnaW9uS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDYXB0dXJlZFBhcmFtTmFtZVR5cGU+IFBhcmFtcyk7CisgIFN0bXRSZXN1bHQgQWN0T25DYXB0dXJlZFJlZ2lvbkVuZChTdG10ICpTKTsKKyAgdm9pZCBBY3RPbkNhcHR1cmVkUmVnaW9uRXJyb3IoKTsKKyAgUmVjb3JkRGVjbCAqQ3JlYXRlQ2FwdHVyZWRTdG10UmVjb3JkRGVjbChDYXB0dXJlZERlY2wgKiZDRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUGFyYW1zKTsKKworICBlbnVtIENvcHlFbGlzaW9uU2VtYW50aWNzS2luZCB7CisgICAgQ0VTX1N0cmljdCA9IDAsCisgICAgQ0VTX0FsbG93UGFyYW1ldGVycyA9IDEsCisgICAgQ0VTX0FsbG93RGlmZmVyZW50VHlwZXMgPSAyLAorICAgIENFU19EZWZhdWx0ID0gKENFU19BbGxvd1BhcmFtZXRlcnMgfCBDRVNfQWxsb3dEaWZmZXJlbnRUeXBlcyksCisgIH07CisKKyAgVmFyRGVjbCAqZ2V0Q29weUVsaXNpb25DYW5kaWRhdGUoUXVhbFR5cGUgUmV0dXJuVHlwZSwgRXhwciAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weUVsaXNpb25TZW1hbnRpY3NLaW5kIENFU0spOworICBib29sIGlzQ29weUVsaXNpb25DYW5kaWRhdGUoUXVhbFR5cGUgUmV0dXJuVHlwZSwgY29uc3QgVmFyRGVjbCAqVkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3B5RWxpc2lvblNlbWFudGljc0tpbmQgQ0VTSyk7CisKKyAgU3RtdFJlc3VsdCBBY3RPblJldHVyblN0bXQoU291cmNlTG9jYXRpb24gUmV0dXJuTG9jLCBFeHByICpSZXRWYWxFeHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlICpDdXJTY29wZSk7CisgIFN0bXRSZXN1bHQgQnVpbGRSZXR1cm5TdG10KFNvdXJjZUxvY2F0aW9uIFJldHVybkxvYywgRXhwciAqUmV0VmFsRXhwKTsKKyAgU3RtdFJlc3VsdCBBY3RPbkNhcFNjb3BlUmV0dXJuU3RtdChTb3VyY2VMb2NhdGlvbiBSZXR1cm5Mb2MsIEV4cHIgKlJldFZhbEV4cCk7CisKKyAgU3RtdFJlc3VsdCBBY3RPbkdDQ0FzbVN0bXQoU291cmNlTG9jYXRpb24gQXNtTG9jLCBib29sIElzU2ltcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzVm9sYXRpbGUsIHVuc2lnbmVkIE51bU91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUlucHV0cywgSWRlbnRpZmllckluZm8gKipOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlFeHByQXJnIENvbnN0cmFpbnRzLCBNdWx0aUV4cHJBcmcgRXhwcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkFzbVN0cmluZywgTXVsdGlFeHByQXJnIENsb2JiZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MpOworCisgIHZvaWQgRmlsbElubGluZUFzbUlkZW50aWZpZXJJbmZvKEV4cHIgKlJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6SW5saW5lQXNtSWRlbnRpZmllckluZm8gJkluZm8pOworICBFeHByUmVzdWx0IExvb2t1cElubGluZUFzbUlkZW50aWZpZXIoQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlS1dMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnF1YWxpZmllZElkICZJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNVbmV2YWx1YXRlZENvbnRleHQpOworICBib29sIExvb2t1cElubGluZUFzbUZpZWxkKFN0cmluZ1JlZiBCYXNlLCBTdHJpbmdSZWYgTWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZPZmZzZXQsIFNvdXJjZUxvY2F0aW9uIEFzbUxvYyk7CisgIEV4cHJSZXN1bHQgTG9va3VwSW5saW5lQXNtVmFyRGVjbEZpZWxkKEV4cHIgKlJlZkV4cHIsIFN0cmluZ1JlZiBNZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEFzbUxvYyk7CisgIFN0bXRSZXN1bHQgQWN0T25NU0FzbVN0bXQoU291cmNlTG9jYXRpb24gQXNtTG9jLCBTb3VyY2VMb2NhdGlvbiBMQnJhY2VMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VG9rZW4+IEFzbVRva3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEFzbVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1PdXRwdXRzLCB1bnNpZ25lZCBOdW1JbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U3RyaW5nUmVmPiBDb25zdHJhaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTdHJpbmdSZWY+IENsb2JiZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIqPiBFeHBycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICBMYWJlbERlY2wgKkdldE9yQ3JlYXRlTVNBc21MYWJlbChTdHJpbmdSZWYgRXh0ZXJuYWxMYWJlbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsd2F5c0NyZWF0ZSk7CisKKyAgVmFyRGVjbCAqQnVpbGRPYmpDRXhjZXB0aW9uRGVjbChUeXBlU291cmNlSW5mbyAqVEluZm8sIFF1YWxUeXBlIEV4Y2VwdGlvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRMb2MsIElkZW50aWZpZXJJbmZvICpJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEludmFsaWQgPSBmYWxzZSk7CisKKyAgRGVjbCAqQWN0T25PYmpDRXhjZXB0aW9uRGVjbChTY29wZSAqUywgRGVjbGFyYXRvciAmRCk7CisKKyAgU3RtdFJlc3VsdCBBY3RPbk9iakNBdENhdGNoU3RtdChTb3VyY2VMb2NhdGlvbiBBdExvYywgU291cmNlTG9jYXRpb24gUlBhcmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2wgKlBhcm0sIFN0bXQgKkJvZHkpOworCisgIFN0bXRSZXN1bHQgQWN0T25PYmpDQXRGaW5hbGx5U3RtdChTb3VyY2VMb2NhdGlvbiBBdExvYywgU3RtdCAqQm9keSk7CisKKyAgU3RtdFJlc3VsdCBBY3RPbk9iakNBdFRyeVN0bXQoU291cmNlTG9jYXRpb24gQXRMb2MsIFN0bXQgKlRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlTdG10QXJnIENhdGNoLCBTdG10ICpGaW5hbGx5KTsKKworICBTdG10UmVzdWx0IEJ1aWxkT2JqQ0F0VGhyb3dTdG10KFNvdXJjZUxvY2F0aW9uIEF0TG9jLCBFeHByICpUaHJvdyk7CisgIFN0bXRSZXN1bHQgQWN0T25PYmpDQXRUaHJvd1N0bXQoU291cmNlTG9jYXRpb24gQXRMb2MsIEV4cHIgKlRocm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlICpDdXJTY29wZSk7CisgIEV4cHJSZXN1bHQgQWN0T25PYmpDQXRTeW5jaHJvbml6ZWRPcGVyYW5kKFNvdXJjZUxvY2F0aW9uIGF0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpvcGVyYW5kKTsKKyAgU3RtdFJlc3VsdCBBY3RPbk9iakNBdFN5bmNocm9uaXplZFN0bXQoU291cmNlTG9jYXRpb24gQXRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKlN5bmNoRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdCAqU3luY2hCb2R5KTsKKworICBTdG10UmVzdWx0IEFjdE9uT2JqQ0F1dG9yZWxlYXNlUG9vbFN0bXQoU291cmNlTG9jYXRpb24gQXRMb2MsIFN0bXQgKkJvZHkpOworCisgIFZhckRlY2wgKkJ1aWxkRXhjZXB0aW9uRGVjbGFyYXRpb24oU2NvcGUgKlMsIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQpOworCisgIERlY2wgKkFjdE9uRXhjZXB0aW9uRGVjbGFyYXRvcihTY29wZSAqUywgRGVjbGFyYXRvciAmRCk7CisKKyAgU3RtdFJlc3VsdCBBY3RPbkNYWENhdGNoQmxvY2soU291cmNlTG9jYXRpb24gQ2F0Y2hMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2wgKkV4RGVjbCwgU3RtdCAqSGFuZGxlckJsb2NrKTsKKyAgU3RtdFJlc3VsdCBBY3RPbkNYWFRyeUJsb2NrKFNvdXJjZUxvY2F0aW9uIFRyeUxvYywgU3RtdCAqVHJ5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTdG10ICo+IEhhbmRsZXJzKTsKKworICBTdG10UmVzdWx0IEFjdE9uU0VIVHJ5QmxvY2soYm9vbCBJc0NYWFRyeSwgLy8gdHJ5ICh0cnVlKSBvciBfX3RyeSAoZmFsc2UpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRyeUxvYywgU3RtdCAqVHJ5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpIYW5kbGVyKTsKKyAgU3RtdFJlc3VsdCBBY3RPblNFSEV4Y2VwdEJsb2NrKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkZpbHRlckV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpCbG9jayk7CisgIHZvaWQgQWN0T25TdGFydFNFSEZpbmFsbHlCbG9jaygpOworICB2b2lkIEFjdE9uQWJvcnRTRUhGaW5hbGx5QmxvY2soKTsKKyAgU3RtdFJlc3VsdCBBY3RPbkZpbmlzaFNFSEZpbmFsbHlCbG9jayhTb3VyY2VMb2NhdGlvbiBMb2MsIFN0bXQgKkJsb2NrKTsKKyAgU3RtdFJlc3VsdCBBY3RPblNFSExlYXZlU3RtdChTb3VyY2VMb2NhdGlvbiBMb2MsIFNjb3BlICpDdXJTY29wZSk7CisKKyAgdm9pZCBEaWFnbm9zZVJldHVybkluQ29uc3RydWN0b3JFeGNlcHRpb25IYW5kbGVyKENYWFRyeVN0bXQgKlRyeUJsb2NrKTsKKworICBib29sIFNob3VsZFdhcm5JZlVudXNlZEZpbGVTY29wZWREZWNsKGNvbnN0IERlY2xhcmF0b3JEZWNsICpEKSBjb25zdDsKKworICAvLy8gXGJyaWVmIElmIGl0J3MgYSBmaWxlIHNjb3BlZCBkZWNsIHRoYXQgbXVzdCB3YXJuIGlmIG5vdCB1c2VkLCBrZWVwIHRyYWNrCisgIC8vLyBvZiBpdC4KKyAgdm9pZCBNYXJrVW51c2VkRmlsZVNjb3BlZERlY2woY29uc3QgRGVjbGFyYXRvckRlY2wgKkQpOworCisgIC8vLyBEaWFnbm9zZVVudXNlZEV4cHJSZXN1bHQgLSBJZiB0aGUgc3RhdGVtZW50IHBhc3NlZCBpbiBpcyBhbiBleHByZXNzaW9uCisgIC8vLyB3aG9zZSByZXN1bHQgaXMgdW51c2VkLCB3YXJuLgorICB2b2lkIERpYWdub3NlVW51c2VkRXhwclJlc3VsdChjb25zdCBTdG10ICpTKTsKKyAgdm9pZCBEaWFnbm9zZVVudXNlZE5lc3RlZFR5cGVkZWZzKGNvbnN0IFJlY29yZERlY2wgKkQpOworICB2b2lkIERpYWdub3NlVW51c2VkRGVjbChjb25zdCBOYW1lZERlY2wgKk5EKTsKKworICAvLy8gRW1pdCBccCBEaWFnSUQgaWYgc3RhdGVtZW50IGxvY2F0ZWQgb24gXHAgU3RtdExvYyBoYXMgYSBzdXNwaWNpb3VzIG51bGwKKyAgLy8vIHN0YXRlbWVudCBhcyBhIFxwIEJvZHksIGFuZCBpdCBpcyBsb2NhdGVkIG9uIHRoZSBzYW1lIGxpbmUuCisgIC8vLworICAvLy8gVGhpcyBoZWxwcyBwcmV2ZW50IGJ1Z3MgZHVlIHRvIHR5cG9zLCBzdWNoIGFzOgorICAvLy8gICAgIGlmIChjb25kaXRpb24pOworICAvLy8gICAgICAgZG9fc3R1ZmYoKTsKKyAgdm9pZCBEaWFnbm9zZUVtcHR5U3RtdEJvZHkoU291cmNlTG9jYXRpb24gU3RtdExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RtdCAqQm9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGlhZ0lEKTsKKworICAvLy8gV2FybiBpZiBhIGZvci93aGlsZSBsb29wIHN0YXRlbWVudCBccCBTLCB3aGljaCBpcyBmb2xsb3dlZCBieQorICAvLy8gXHAgUG9zc2libGVCb2R5LCBoYXMgYSBzdXNwaWNpb3VzIG51bGwgc3RhdGVtZW50IGFzIGEgYm9keS4KKyAgdm9pZCBEaWFnbm9zZUVtcHR5TG9vcEJvZHkoY29uc3QgU3RtdCAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RtdCAqUG9zc2libGVCb2R5KTsKKworICAvLy8gV2FybiBpZiBhIHZhbHVlIGlzIG1vdmVkIHRvIGl0c2VsZi4KKyAgdm9pZCBEaWFnbm9zZVNlbGZNb3ZlKGNvbnN0IEV4cHIgKkxIU0V4cHIsIGNvbnN0IEV4cHIgKlJIU0V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBPcExvYyk7CisKKyAgLy8vIFxicmllZiBXYXJuIGlmIHdlJ3JlIGltcGxpY2l0bHkgY2FzdGluZyBmcm9tIGEgX051bGxhYmxlIHBvaW50ZXIgdHlwZSB0byBhCisgIC8vLyBfTm9ubnVsbCBvbmUuCisgIHZvaWQgZGlhZ25vc2VOdWxsYWJsZVRvTm9ubnVsbENvbnZlcnNpb24oUXVhbFR5cGUgRHN0VHlwZSwgUXVhbFR5cGUgU3JjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpOworCisgIC8vLyBXYXJuIHdoZW4gaW1wbGljaXRseSBjYXN0aW5nIDAgdG8gbnVsbHB0ci4KKyAgdm9pZCBkaWFnbm9zZVplcm9Ub051bGxwdHJDb252ZXJzaW9uKENhc3RLaW5kIEtpbmQsIGNvbnN0IEV4cHIgKkUpOworCisgIFBhcnNpbmdEZWNsU3RhdGUgUHVzaFBhcnNpbmdEZWNsYXJhdGlvbihzZW1hOjpEZWxheWVkRGlhZ25vc3RpY1Bvb2wgJnBvb2wpIHsKKyAgICByZXR1cm4gRGVsYXllZERpYWdub3N0aWNzLnB1c2gocG9vbCk7CisgIH0KKyAgdm9pZCBQb3BQYXJzaW5nRGVjbGFyYXRpb24oUGFyc2luZ0RlY2xTdGF0ZSBzdGF0ZSwgRGVjbCAqZGVjbCk7CisKKyAgdHlwZWRlZiBQcm9jZXNzaW5nQ29udGV4dFN0YXRlIFBhcnNpbmdDbGFzc1N0YXRlOworICBQYXJzaW5nQ2xhc3NTdGF0ZSBQdXNoUGFyc2luZ0NsYXNzKCkgeworICAgIHJldHVybiBEZWxheWVkRGlhZ25vc3RpY3MucHVzaFVuZGVsYXllZCgpOworICB9CisgIHZvaWQgUG9wUGFyc2luZ0NsYXNzKFBhcnNpbmdDbGFzc1N0YXRlIHN0YXRlKSB7CisgICAgRGVsYXllZERpYWdub3N0aWNzLnBvcFVuZGVsYXllZChzdGF0ZSk7CisgIH0KKworICB2b2lkIHJlZGVsYXlEaWFnbm9zdGljcyhzZW1hOjpEZWxheWVkRGlhZ25vc3RpY1Bvb2wgJnBvb2wpOworCisgIHZvaWQgRGlhZ25vc2VBdmFpbGFiaWxpdHlPZkRlY2woTmFtZWREZWNsICpELCBBcnJheVJlZjxTb3VyY2VMb2NhdGlvbj4gTG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqVW5rbm93bk9iakNDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9iakNQcm9wZXJ0eUFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEF2b2lkUGFydGlhbEF2YWlsYWJpbGl0eUNoZWNrcyA9IGZhbHNlKTsKKworICBib29sIG1ha2VVbmF2YWlsYWJsZUluU3lzdGVtSGVhZGVyKFNvdXJjZUxvY2F0aW9uIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmF2YWlsYWJsZUF0dHI6OkltcGxpY2l0UmVhc29uIHJlYXNvbik7CisKKyAgLy8vIFxicmllZiBJc3N1ZSBhbnkgLVd1bmd1YXJkZWQtYXZhaWxhYmlsaXR5IHdhcm5pbmdzIGluIFxjIEZECisgIHZvaWQgRGlhZ25vc2VVbmd1YXJkZWRBdmFpbGFiaWxpdHlWaW9sYXRpb25zKERlY2wgKkZEKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gRXhwcmVzc2lvbiBQYXJzaW5nIENhbGxiYWNrczogU2VtYUV4cHIuY3BwLgorCisgIGJvb2wgQ2FuVXNlRGVjbChOYW1lZERlY2wgKkQsIGJvb2wgVHJlYXRVbmF2YWlsYWJsZUFzSW52YWxpZCk7CisgIGJvb2wgRGlhZ25vc2VVc2VPZkRlY2woTmFtZWREZWNsICpELCBBcnJheVJlZjxTb3VyY2VMb2NhdGlvbj4gTG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqVW5rbm93bk9iakNDbGFzcyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPYmpDUHJvcGVydHlBY2Nlc3MgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEF2b2lkUGFydGlhbEF2YWlsYWJpbGl0eUNoZWNrcyA9IGZhbHNlKTsKKyAgdm9pZCBOb3RlRGVsZXRlZEZ1bmN0aW9uKEZ1bmN0aW9uRGVjbCAqRkQpOworICB2b2lkIE5vdGVEZWxldGVkSW5oZXJpdGluZ0NvbnN0cnVjdG9yKENYWENvbnN0cnVjdG9yRGVjbCAqQ0QpOworICBzdGQ6OnN0cmluZyBnZXREZWxldGVkT3JVbmF2YWlsYWJsZVN1ZmZpeChjb25zdCBGdW5jdGlvbkRlY2wgKkZEKTsKKyAgYm9vbCBEaWFnbm9zZVByb3BlcnR5QWNjZXNzb3JNaXNtYXRjaChPYmpDUHJvcGVydHlEZWNsICpQRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDTWV0aG9kRGVjbCAqR2V0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYyk7CisgIHZvaWQgRGlhZ25vc2VTZW50aW5lbENhbGxzKE5hbWVkRGVjbCAqRCwgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IEFyZ3MpOworCisgIHZvaWQgUHVzaEV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dChFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQgTmV3Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2wgKkxhbWJkYUNvbnRleHREZWNsID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNEZWNsdHlwZSA9IGZhbHNlKTsKKyAgZW51bSBSZXVzZUxhbWJkYUNvbnRleHREZWNsX3QgeyBSZXVzZUxhbWJkYUNvbnRleHREZWNsIH07CisgIHZvaWQgUHVzaEV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dChFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQgTmV3Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldXNlTGFtYmRhQ29udGV4dERlY2xfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNEZWNsdHlwZSA9IGZhbHNlKTsKKyAgdm9pZCBQb3BFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQoKTsKKworICB2b2lkIERpc2NhcmRDbGVhbnVwc0luRXZhbHVhdGlvbkNvbnRleHQoKTsKKworICBFeHByUmVzdWx0IFRyYW5zZm9ybVRvUG90ZW50aWFsbHlFdmFsdWF0ZWQoRXhwciAqRSk7CisgIEV4cHJSZXN1bHQgSGFuZGxlRXhwckV2YWx1YXRpb25Db250ZXh0Rm9yVHlwZW9mKEV4cHIgKkUpOworCisgIEV4cHJSZXN1bHQgQWN0T25Db25zdGFudEV4cHJlc3Npb24oRXhwclJlc3VsdCBSZXMpOworCisgIC8vIEZ1bmN0aW9ucyBmb3IgbWFya2luZyBhIGRlY2xhcmF0aW9uIHJlZmVyZW5jZWQuICBUaGVzZSBmdW5jdGlvbnMgYWxzbworICAvLyBjb250YWluIHRoZSByZWxldmFudCBsb2dpYyBmb3IgbWFya2luZyBpZiBhIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uIG9yCisgIC8vIHZhcmlhYmxlIGlzIGFuIG9kci11c2UgKGluIHRoZSBDKysxMSBzZW5zZSkuICBUaGVyZSBhcmUgc2VwYXJhdGUgdmFyaWFudHMKKyAgLy8gZm9yIGV4cHJlc3Npb25zIHJlZmVycmluZyB0byBhIGRlY2w7IHRoZXNlIGV4aXN0IGJlY2F1c2Ugb2RyLXVzZSBtYXJraW5nCisgIC8vIG5lZWRzIHRvIGJlIGRlbGF5ZWQgZm9yIHNvbWUgY29uc3RhbnQgdmFyaWFibGVzIHdoZW4gd2UgYnVpbGQgb25lIG9mIHRoZQorICAvLyBuYW1lZCBleHByZXNzaW9ucy4KKyAgLy8KKyAgLy8gTWlnaHRCZU9kclVzZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdXNlIGNvdWxkIHBvc3NpYmx5IGJlIGFuIG9kci11c2UsIGFuZAorICAvLyBzaG91bGQgdXN1YWxseSBiZSB0cnVlLiBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgc2V0IHRvIGZhbHNlIGlmIHRoZSBsYWNrIG9mCisgIC8vIG9kci11c2UgY2Fubm90IGJlIGRldGVybWluZWQgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0IChmb3IgaW5zdGFuY2UsCisgIC8vIGJlY2F1c2UgdGhlIG5hbWUgZGVub3RlcyBhIHZpcnR1YWwgZnVuY3Rpb24gYW5kIHdhcyB3cml0dGVuIHdpdGhvdXQgYW4KKyAgLy8gZXhwbGljaXQgbmVzdGVkLW5hbWUtc3BlY2lmaWVyKS4KKyAgdm9pZCBNYXJrQW55RGVjbFJlZmVyZW5jZWQoU291cmNlTG9jYXRpb24gTG9jLCBEZWNsICpELCBib29sIE1pZ2h0QmVPZHJVc2UpOworICB2b2lkIE1hcmtGdW5jdGlvblJlZmVyZW5jZWQoU291cmNlTG9jYXRpb24gTG9jLCBGdW5jdGlvbkRlY2wgKkZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE1pZ2h0QmVPZHJVc2UgPSB0cnVlKTsKKyAgdm9pZCBNYXJrVmFyaWFibGVSZWZlcmVuY2VkKFNvdXJjZUxvY2F0aW9uIExvYywgVmFyRGVjbCAqVmFyKTsKKyAgdm9pZCBNYXJrRGVjbFJlZlJlZmVyZW5jZWQoRGVjbFJlZkV4cHIgKkUsIGNvbnN0IEV4cHIgKkJhc2UgPSBudWxscHRyKTsKKyAgdm9pZCBNYXJrTWVtYmVyUmVmZXJlbmNlZChNZW1iZXJFeHByICpFKTsKKworICB2b2lkIFVwZGF0ZU1hcmtpbmdGb3JMVmFsdWVUb1JWYWx1ZShFeHByICpFKTsKKyAgdm9pZCBDbGVhbnVwVmFyRGVjbE1hcmtpbmcoKTsKKworICBlbnVtIFRyeUNhcHR1cmVLaW5kIHsKKyAgICBUcnlDYXB0dXJlX0ltcGxpY2l0LCBUcnlDYXB0dXJlX0V4cGxpY2l0QnlWYWwsIFRyeUNhcHR1cmVfRXhwbGljaXRCeVJlZgorICB9OworCisgIC8vLyBcYnJpZWYgVHJ5IHRvIGNhcHR1cmUgdGhlIGdpdmVuIHZhcmlhYmxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBWYXIgVGhlIHZhcmlhYmxlIHRvIGNhcHR1cmUuCisgIC8vLworICAvLy8gXHBhcmFtIExvYyBUaGUgbG9jYXRpb24gYXQgd2hpY2ggdGhlIGNhcHR1cmUgb2NjdXJzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBLaW5kIFRoZSBraW5kIG9mIGNhcHR1cmUsIHdoaWNoIG1heSBiZSBpbXBsaWNpdCAoZm9yIGVpdGhlciBhCisgIC8vLyBibG9jayBvciBhIGxhbWJkYSksIG9yIGV4cGxpY2l0IGJ5LXZhbHVlIG9yIGJ5LXJlZmVyZW5jZSAoZm9yIGEgbGFtYmRhKS4KKyAgLy8vCisgIC8vLyBccGFyYW0gRWxsaXBzaXNMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBlbGxpcHNpcywgaWYgb25lIGlzIHByb3ZpZGVkIGluCisgIC8vLyBhbiBleHBsaWNpdCBsYW1iZGEgY2FwdHVyZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQnVpbGRBbmREaWFnbm9zZSBXaGV0aGVyIHdlIGFyZSBhY3R1YWxseSBzdXBwb3NlZCB0byBhZGQgdGhlCisgIC8vLyBjYXB0dXJlcyBvciBkaWFnbm9zZSBlcnJvcnMuIElmIGZhbHNlLCB0aGlzIHJvdXRpbmUgbWVyZWx5IGNoZWNrIHdoZXRoZXIKKyAgLy8vIHRoZSBjYXB0dXJlIGNhbiBvY2N1ciB3aXRob3V0IHBlcmZvcm1pbmcgdGhlIGNhcHR1cmUgaXRzZWxmIG9yIGNvbXBsYWluaW5nCisgIC8vLyBpZiB0aGUgdmFyaWFibGUgY2Fubm90IGJlIGNhcHR1cmVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDYXB0dXJlVHlwZSBXaWxsIGJlIHNldCB0byB0aGUgdHlwZSBvZiB0aGUgZmllbGQgdXNlZCB0byBjYXB0dXJlCisgIC8vLyB0aGlzIHZhcmlhYmxlIGluIHRoZSBpbm5lcm1vc3QgYmxvY2sgb3IgbGFtYmRhLiBPbmx5IHZhbGlkIHdoZW4gdGhlCisgIC8vLyB2YXJpYWJsZSBjYW4gYmUgY2FwdHVyZWQuCisgIC8vLworICAvLy8gXHBhcmFtIERlY2xSZWZUeXBlIFdpbGwgYmUgc2V0IHRvIHRoZSB0eXBlIG9mIGEgcmVmZXJlbmNlIHRvIHRoZSBjYXB0dXJlCisgIC8vLyBmcm9tIHdpdGhpbiB0aGUgY3VycmVudCBzY29wZS4gT25seSB2YWxpZCB3aGVuIHRoZSB2YXJpYWJsZSBjYW4gYmUKKyAgLy8vIGNhcHR1cmVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBGdW5jdGlvblNjb3BlSW5kZXhUb1N0b3BBdCBJZiBub24tbnVsbCwgaXQgcG9pbnRzIHRvIHRoZSBpbmRleAorICAvLy8gb2YgdGhlIEZ1bmN0aW9uU2NvcGVJbmZvIHN0YWNrIGJleW9uZCB3aGljaCB3ZSBkbyBub3QgYXR0ZW1wdCB0byBjYXB0dXJlLgorICAvLy8gVGhpcyBpcyB1c2VmdWwgd2hlbiBlbmNsb3NpbmcgbGFtYmRhcyBtdXN0IHNwZWN1bGF0aXZlbHkgY2FwdHVyZQorICAvLy8gdmFyaWFibGVzIHRoYXQgbWF5IG9yIG1heSBub3QgYmUgdXNlZCBpbiBjZXJ0YWluIHNwZWNpYWxpemF0aW9ucyBvZgorICAvLy8gYSBuZXN0ZWQgZ2VuZXJpYyBsYW1iZGEuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZCAoaS5lLiwgdGhlIHZhcmlhYmxlIGNhbm5vdCBiZQorICAvLy8gY2FwdHVyZWQpIGFuZCBmYWxzZSBpZiB0aGUgY2FwdHVyZSBzdWNjZWVkZWQuCisgIGJvb2wgdHJ5Q2FwdHVyZVZhcmlhYmxlKFZhckRlY2wgKlZhciwgU291cmNlTG9jYXRpb24gTG9jLCBUcnlDYXB0dXJlS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYywgYm9vbCBCdWlsZEFuZERpYWdub3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSAmQ2FwdHVyZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlICZEZWNsUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgKmNvbnN0IEZ1bmN0aW9uU2NvcGVJbmRleFRvU3RvcEF0KTsKKworICAvLy8gXGJyaWVmIFRyeSB0byBjYXB0dXJlIHRoZSBnaXZlbiB2YXJpYWJsZS4KKyAgYm9vbCB0cnlDYXB0dXJlVmFyaWFibGUoVmFyRGVjbCAqVmFyLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyeUNhcHR1cmVLaW5kIEtpbmQgPSBUcnlDYXB0dXJlX0ltcGxpY2l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYyA9IFNvdXJjZUxvY2F0aW9uKCkpOworCisgIC8vLyBcYnJpZWYgQ2hlY2tzIGlmIHRoZSB2YXJpYWJsZSBtdXN0IGJlIGNhcHR1cmVkLgorICBib29sIE5lZWRUb0NhcHR1cmVWYXJpYWJsZShWYXJEZWNsICpWYXIsIFNvdXJjZUxvY2F0aW9uIExvYyk7CisKKyAgLy8vIFxicmllZiBHaXZlbiBhIHZhcmlhYmxlLCBkZXRlcm1pbmUgdGhlIHR5cGUgdGhhdCBhIHJlZmVyZW5jZSB0byB0aGF0CisgIC8vLyB2YXJpYWJsZSB3aWxsIGhhdmUgaW4gdGhlIGdpdmVuIHNjb3BlLgorICBRdWFsVHlwZSBnZXRDYXB0dXJlZERlY2xSZWZUeXBlKFZhckRlY2wgKlZhciwgU291cmNlTG9jYXRpb24gTG9jKTsKKworICAvLy8gTWFyayBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyByZWZlcmVuY2VkIHdpdGhpbiBhIHBhcnRpY3VsYXIgQVNUIG5vZGUgYXMKKyAgLy8vIHJlZmVyZW5jZWQuIFVzZWQgd2hlbiB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGluc3RhbnRpYXRlcyBhIG5vbi1kZXBlbmRlbnQKKyAgLy8vIHR5cGUgLS0gZW50aXRpZXMgcmVmZXJlbmNlZCBieSB0aGUgdHlwZSBhcmUgbm93IHJlZmVyZW5jZWQuCisgIHZvaWQgTWFya0RlY2xhcmF0aW9uc1JlZmVyZW5jZWRJblR5cGUoU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBUKTsKKyAgdm9pZCBNYXJrRGVjbGFyYXRpb25zUmVmZXJlbmNlZEluRXhwcihFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2tpcExvY2FsVmFyaWFibGVzID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgVHJ5IHRvIHJlY292ZXIgYnkgdHVybmluZyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBpbnRvIGEKKyAgLy8vIGNhbGwuICBSZXR1cm5zIHRydWUgaWYgcmVjb3Zlcnkgd2FzIGF0dGVtcHRlZCBvciBhbiBlcnJvciB3YXMKKyAgLy8vIGVtaXR0ZWQ7IHRoaXMgbWF5IGFsc28gbGVhdmUgdGhlIEV4cHJSZXN1bHQgaW52YWxpZC4KKyAgYm9vbCB0cnlUb1JlY292ZXJXaXRoQ2FsbChFeHByUmVzdWx0ICZFLCBjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmUEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBGb3JjZUNvbXBsYWluID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAoKklzUGxhdXNpYmxlUmVzdWx0KShRdWFsVHlwZSkgPSBudWxscHRyKTsKKworICAvLy8gXGJyaWVmIEZpZ3VyZSBvdXQgaWYgYW4gZXhwcmVzc2lvbiBjb3VsZCBiZSB0dXJuZWQgaW50byBhIGNhbGwuCisgIGJvb2wgdHJ5RXhwckFzQ2FsbChFeHByICZFLCBRdWFsVHlwZSAmWmVyb0FyZ0NhbGxSZXR1cm5UeSwKKyAgICAgICAgICAgICAgICAgICAgIFVucmVzb2x2ZWRTZXRJbXBsICZOb25UZW1wbGF0ZU92ZXJsb2Fkcyk7CisKKyAgLy8vIFxicmllZiBDb25kaXRpb25hbGx5IGlzc3VlIGEgZGlhZ25vc3RpYyBiYXNlZCBvbiB0aGUgY3VycmVudAorICAvLy8gZXZhbHVhdGlvbiBjb250ZXh0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGF0ZW1lbnQgSWYgU3RhdGVtZW50IGlzIG5vbi1udWxsLCBkZWxheSByZXBvcnRpbmcgdGhlCisgIC8vLyBkaWFnbm9zdGljIHVudGlsIHRoZSBmdW5jdGlvbiBib2R5IGlzIHBhcnNlZCwgYW5kIHRoZW4gZG8gYSBiYXNpYworICAvLy8gcmVhY2hhYmlsaXR5IGFuYWx5c2lzIHRvIGRldGVybWluZSBpZiB0aGUgc3RhdGVtZW50IGlzIHJlYWNoYWJsZS4KKyAgLy8vIElmIGl0IGlzIHVucmVhY2hhYmxlLCB0aGUgZGlhZ25vc3RpYyB3aWxsIG5vdCBiZSBlbWl0dGVkLgorICBib29sIERpYWdSdW50aW1lQmVoYXZpb3IoU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBTdG10ICpTdGF0ZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmUEQpOworCisgIC8vIFByaW1hcnkgRXhwcmVzc2lvbnMuCisgIFNvdXJjZVJhbmdlIGdldEV4cHJSYW5nZShFeHByICpFKSBjb25zdDsKKworICBFeHByUmVzdWx0IEFjdE9uSWRFeHByZXNzaW9uKAorICAgICAgU2NvcGUgKlMsIENYWFNjb3BlU3BlYyAmU1MsIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlS1dMb2MsCisgICAgICBVbnF1YWxpZmllZElkICZJZCwgYm9vbCBIYXNUcmFpbGluZ0xQYXJlbiwgYm9vbCBJc0FkZHJlc3NPZk9wZXJhbmQsCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29ycmVjdGlvbkNhbmRpZGF0ZUNhbGxiYWNrPiBDQ0MgPSBudWxscHRyLAorICAgICAgYm9vbCBJc0lubGluZUFzbUlkZW50aWZpZXIgPSBmYWxzZSwgVG9rZW4gKktleXdvcmRSZXBsYWNlbWVudCA9IG51bGxwdHIpOworCisgIHZvaWQgRGVjb21wb3NlVW5xdWFsaWZpZWRJZChjb25zdCBVbnF1YWxpZmllZElkICZJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAmQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lSW5mbyAmTmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gKiZUZW1wbGF0ZUFyZ3MpOworCisgIGJvb2wKKyAgRGlhZ25vc2VFbXB0eUxvb2t1cChTY29wZSAqUywgQ1hYU2NvcGVTcGVjICZTUywgTG9va3VwUmVzdWx0ICZSLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDb3JyZWN0aW9uQ2FuZGlkYXRlQ2FsbGJhY2s+IENDQywKKyAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gKkV4cGxpY2l0VGVtcGxhdGVBcmdzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IEFyZ3MgPSBOb25lLCBUeXBvRXhwciAqKk91dCA9IG51bGxwdHIpOworCisgIEV4cHJSZXN1bHQgTG9va3VwSW5PYmpDTWV0aG9kKExvb2t1cFJlc3VsdCAmTG9va1VwLCBTY29wZSAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93QnVpbHRpbkNyZWF0aW9uPWZhbHNlKTsKKworICBFeHByUmVzdWx0IEFjdE9uRGVwZW5kZW50SWRFeHByZXNzaW9uKGNvbnN0IENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZOYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQWRkcmVzc09mT3BlcmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICpUZW1wbGF0ZUFyZ3MpOworCisgIEV4cHJSZXN1bHQgQnVpbGREZWNsUmVmRXhwcihWYWx1ZURlY2wgKkQsIFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwclZhbHVlS2luZCBWSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFNjb3BlU3BlYyAqU1MgPSBudWxscHRyKTsKKyAgRXhwclJlc3VsdAorICBCdWlsZERlY2xSZWZFeHByKFZhbHVlRGVjbCAqRCwgUXVhbFR5cGUgVHksIEV4cHJWYWx1ZUtpbmQgVkssCisgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmTmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYU2NvcGVTcGVjICpTUyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpGb3VuZEQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqVGVtcGxhdGVBcmdzID0gbnVsbHB0cik7CisgIEV4cHJSZXN1bHQKKyAgQnVpbGRBbm9ueW1vdXNTdHJ1Y3RVbmlvbk1lbWJlclJlZmVyZW5jZSgKKyAgICAgIGNvbnN0IENYWFNjb3BlU3BlYyAmU1MsCisgICAgICBTb3VyY2VMb2NhdGlvbiBuYW1lTG9jLAorICAgICAgSW5kaXJlY3RGaWVsZERlY2wgKmluZGlyZWN0RmllbGQsCisgICAgICBEZWNsQWNjZXNzUGFpciBGb3VuZERlY2wgPSBEZWNsQWNjZXNzUGFpcjo6bWFrZShudWxscHRyLCBBU19ub25lKSwKKyAgICAgIEV4cHIgKmJhc2VPYmplY3RFeHByID0gbnVsbHB0ciwKKyAgICAgIFNvdXJjZUxvY2F0aW9uIG9wTG9jID0gU291cmNlTG9jYXRpb24oKSk7CisKKyAgRXhwclJlc3VsdCBCdWlsZFBvc3NpYmxlSW1wbGljaXRNZW1iZXJFeHByKGNvbnN0IENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUtXTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9va3VwUmVzdWx0ICZSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gKlRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjb3BlICpTKTsKKyAgRXhwclJlc3VsdCBCdWlsZEltcGxpY2l0TWVtYmVyRXhwcihjb25zdCBDWFhTY29wZVNwZWMgJlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlS1dMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9va3VwUmVzdWx0ICZSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gKlRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRGVmaW5pdGVJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTY29wZSAqUyk7CisgIGJvb2wgVXNlQXJndW1lbnREZXBlbmRlbnRMb29rdXAoY29uc3QgQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29rdXBSZXN1bHQgJlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNUcmFpbGluZ0xQYXJlbik7CisKKyAgRXhwclJlc3VsdAorICBCdWlsZFF1YWxpZmllZERlY2xhcmF0aW9uTmFtZUV4cHIoQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0FkZHJlc3NPZk9wZXJhbmQsIGNvbnN0IFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKipSZWNvdmVyeVRTSSA9IG51bGxwdHIpOworCisgIEV4cHJSZXN1bHQgQnVpbGREZXBlbmRlbnREZWNsUmVmRXhwcihjb25zdCBDWFhTY29wZVNwZWMgJlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmTmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqVGVtcGxhdGVBcmdzKTsKKworICBFeHByUmVzdWx0IEJ1aWxkRGVjbGFyYXRpb25OYW1lRXhwcihjb25zdCBDWFhTY29wZVNwZWMgJlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29rdXBSZXN1bHQgJlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTmVlZHNBREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWNjZXB0SW52YWxpZERlY2wgPSBmYWxzZSk7CisgIEV4cHJSZXN1bHQgQnVpbGREZWNsYXJhdGlvbk5hbWVFeHByKAorICAgICAgY29uc3QgQ1hYU2NvcGVTcGVjICZTUywgY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmTmFtZUluZm8sIE5hbWVkRGVjbCAqRCwKKyAgICAgIE5hbWVkRGVjbCAqRm91bmREID0gbnVsbHB0ciwKKyAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqVGVtcGxhdGVBcmdzID0gbnVsbHB0ciwKKyAgICAgIGJvb2wgQWNjZXB0SW52YWxpZERlY2wgPSBmYWxzZSk7CisKKyAgRXhwclJlc3VsdCBCdWlsZExpdGVyYWxPcGVyYXRvckNhbGwoTG9va3VwUmVzdWx0ICZSLAorICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZUluZm8gJlN1ZmZpeEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExpdEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gKkV4cGxpY2l0VGVtcGxhdGVBcmdzID0gbnVsbHB0cik7CisKKyAgRXhwclJlc3VsdCBCdWlsZFByZWRlZmluZWRFeHByKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWRlZmluZWRFeHByOjpJZGVudFR5cGUgSVQpOworICBFeHByUmVzdWx0IEFjdE9uUHJlZGVmaW5lZEV4cHIoU291cmNlTG9jYXRpb24gTG9jLCB0b2s6OlRva2VuS2luZCBLaW5kKTsKKyAgRXhwclJlc3VsdCBBY3RPbkludGVnZXJDb25zdGFudChTb3VyY2VMb2NhdGlvbiBMb2MsIHVpbnQ2NF90IFZhbCk7CisKKyAgYm9vbCBDaGVja0xvb3BIaW50RXhwcihFeHByICpFLCBTb3VyY2VMb2NhdGlvbiBMb2MpOworCisgIEV4cHJSZXN1bHQgQWN0T25OdW1lcmljQ29uc3RhbnQoY29uc3QgVG9rZW4gJlRvaywgU2NvcGUgKlVETFNjb3BlID0gbnVsbHB0cik7CisgIEV4cHJSZXN1bHQgQWN0T25DaGFyYWN0ZXJDb25zdGFudChjb25zdCBUb2tlbiAmVG9rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NvcGUgKlVETFNjb3BlID0gbnVsbHB0cik7CisgIEV4cHJSZXN1bHQgQWN0T25QYXJlbkV4cHIoU291cmNlTG9jYXRpb24gTCwgU291cmNlTG9jYXRpb24gUiwgRXhwciAqRSk7CisgIEV4cHJSZXN1bHQgQWN0T25QYXJlbkxpc3RFeHByKFNvdXJjZUxvY2F0aW9uIEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpRXhwckFyZyBWYWwpOworCisgIC8vLyBBY3RPblN0cmluZ0xpdGVyYWwgLSBUaGUgc3BlY2lmaWVkIHRva2VucyB3ZXJlIGxleGVkIGFzIHBhc3RlZCBzdHJpbmcKKyAgLy8vIGZyYWdtZW50cyAoZS5nLiAiZm9vIiAiYmFyIiBMImJheiIpLgorICBFeHByUmVzdWx0IEFjdE9uU3RyaW5nTGl0ZXJhbChBcnJheVJlZjxUb2tlbj4gU3RyaW5nVG9rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NvcGUgKlVETFNjb3BlID0gbnVsbHB0cik7CisKKyAgRXhwclJlc3VsdCBBY3RPbkdlbmVyaWNTZWxlY3Rpb25FeHByKFNvdXJjZUxvY2F0aW9uIEtleUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIERlZmF1bHRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpDb250cm9sbGluZ0V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQYXJzZWRUeXBlPiBBcmdUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gQXJnRXhwcnMpOworICBFeHByUmVzdWx0IENyZWF0ZUdlbmVyaWNTZWxlY3Rpb25FeHByKFNvdXJjZUxvY2F0aW9uIEtleUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBEZWZhdWx0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpDb250cm9sbGluZ0V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZVNvdXJjZUluZm8gKj4gVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBFeHBycyk7CisKKyAgLy8gQmluYXJ5L1VuYXJ5IE9wZXJhdG9ycy4gICdUb2snIGlzIHRoZSB0b2tlbiBmb3IgdGhlIG9wZXJhdG9yLgorICBFeHByUmVzdWx0IENyZWF0ZUJ1aWx0aW5VbmFyeU9wKFNvdXJjZUxvY2F0aW9uIE9wTG9jLCBVbmFyeU9wZXJhdG9yS2luZCBPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqSW5wdXRFeHByKTsKKyAgRXhwclJlc3VsdCBCdWlsZFVuYXJ5T3AoU2NvcGUgKlMsIFNvdXJjZUxvY2F0aW9uIE9wTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBVbmFyeU9wZXJhdG9yS2luZCBPcGMsIEV4cHIgKklucHV0KTsKKyAgRXhwclJlc3VsdCBBY3RPblVuYXJ5T3AoU2NvcGUgKlMsIFNvdXJjZUxvY2F0aW9uIE9wTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6OlRva2VuS2luZCBPcCwgRXhwciAqSW5wdXQpOworCisgIFF1YWxUeXBlIENoZWNrQWRkcmVzc09mT3BlcmFuZChFeHByUmVzdWx0ICZPcGVyYW5kLCBTb3VyY2VMb2NhdGlvbiBPcExvYyk7CisKKyAgRXhwclJlc3VsdCBDcmVhdGVVbmFyeUV4cHJPclR5cGVUcmFpdEV4cHIoVHlwZVNvdXJjZUluZm8gKlRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBPcExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5hcnlFeHByT3JUeXBlVHJhaXQgRXhwcktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFIpOworICBFeHByUmVzdWx0IENyZWF0ZVVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwcihFeHByICpFLCBTb3VyY2VMb2NhdGlvbiBPcExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5hcnlFeHByT3JUeXBlVHJhaXQgRXhwcktpbmQpOworICBFeHByUmVzdWx0CisgICAgQWN0T25VbmFyeUV4cHJPclR5cGVUcmFpdEV4cHIoU291cmNlTG9jYXRpb24gT3BMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5hcnlFeHByT3JUeXBlVHJhaXQgRXhwcktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1R5cGUsIHZvaWQgKlR5T3JFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBBcmdSYW5nZSk7CisKKyAgRXhwclJlc3VsdCBDaGVja1BsYWNlaG9sZGVyRXhwcihFeHByICpFKTsKKyAgYm9vbCBDaGVja1ZlY1N0ZXBFeHByKEV4cHIgKkUpOworCisgIGJvb2wgQ2hlY2tVbmFyeUV4cHJPclR5cGVUcmFpdE9wZXJhbmQoRXhwciAqRSwgVW5hcnlFeHByT3JUeXBlVHJhaXQgRXhwcktpbmQpOworICBib29sIENoZWNrVW5hcnlFeHByT3JUeXBlVHJhaXRPcGVyYW5kKFF1YWxUeXBlIEV4cHJUeXBlLCBTb3VyY2VMb2NhdGlvbiBPcExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBFeHByUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5hcnlFeHByT3JUeXBlVHJhaXQgRXhwcktpbmQpOworICBFeHByUmVzdWx0IEFjdE9uU2l6ZW9mUGFyYW1ldGVyUGFja0V4cHIoU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBPcExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYyk7CisgIEV4cHJSZXN1bHQgQWN0T25Qb3N0Zml4VW5hcnlPcChTY29wZSAqUywgU291cmNlTG9jYXRpb24gT3BMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6OlRva2VuS2luZCBLaW5kLCBFeHByICpJbnB1dCk7CisKKyAgRXhwclJlc3VsdCBBY3RPbkFycmF5U3Vic2NyaXB0RXhwcihTY29wZSAqUywgRXhwciAqQmFzZSwgU291cmNlTG9jYXRpb24gTExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpJZHgsIFNvdXJjZUxvY2F0aW9uIFJMb2MpOworICBFeHByUmVzdWx0IENyZWF0ZUJ1aWx0aW5BcnJheVN1YnNjcmlwdEV4cHIoRXhwciAqQmFzZSwgU291cmNlTG9jYXRpb24gTExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKklkeCwgU291cmNlTG9jYXRpb24gUkxvYyk7CisgIEV4cHJSZXN1bHQgQWN0T25PTVBBcnJheVNlY3Rpb25FeHByKEV4cHIgKkJhc2UsIFNvdXJjZUxvY2F0aW9uIExCTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpMb3dlckJvdW5kLCBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqTGVuZ3RoLCBTb3VyY2VMb2NhdGlvbiBSQkxvYyk7CisKKyAgLy8gVGhpcyBzdHJ1Y3QgaXMgZm9yIHVzZSBieSBBY3RPbk1lbWJlckFjY2VzcyB0byBhbGxvdworICAvLyBCdWlsZE1lbWJlclJlZmVyZW5jZUV4cHIgdG8gYmUgYWJsZSB0byByZWludm9rZSBBY3RPbk1lbWJlckFjY2VzcyBhZnRlcgorICAvLyBjaGFuZ2luZyB0aGUgYWNjZXNzIG9wZXJhdG9yIGZyb20gYSAnLicgdG8gYSAnLT4nICh0byBzZWUgaWYgdGhhdCBpcyB0aGUKKyAgLy8gY2hhbmdlIG5lZWRlZCB0byBmaXggYW4gZXJyb3IgYWJvdXQgYW4gdW5rbm93biBtZW1iZXIsIGUuZy4gd2hlbiB0aGUgY2xhc3MKKyAgLy8gZGVmaW5lcyBhIGN1c3RvbSBvcGVyYXRvci0+KS4KKyAgc3RydWN0IEFjdE9uTWVtYmVyQWNjZXNzRXh0cmFBcmdzIHsKKyAgICBTY29wZSAqUzsKKyAgICBVbnF1YWxpZmllZElkICZJZDsKKyAgICBEZWNsICpPYmpDSW1wRGVjbDsKKyAgfTsKKworICBFeHByUmVzdWx0IEJ1aWxkTWVtYmVyUmVmZXJlbmNlRXhwcigKKyAgICAgIEV4cHIgKkJhc2UsIFF1YWxUeXBlIEJhc2VUeXBlLCBTb3VyY2VMb2NhdGlvbiBPcExvYywgYm9vbCBJc0Fycm93LAorICAgICAgQ1hYU2NvcGVTcGVjICZTUywgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYywKKyAgICAgIE5hbWVkRGVjbCAqRmlyc3RRdWFsaWZpZXJJblNjb3BlLCBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZOYW1lSW5mbywKKyAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqVGVtcGxhdGVBcmdzLAorICAgICAgY29uc3QgU2NvcGUgKlMsCisgICAgICBBY3RPbk1lbWJlckFjY2Vzc0V4dHJhQXJncyAqRXh0cmFBcmdzID0gbnVsbHB0cik7CisKKyAgRXhwclJlc3VsdAorICBCdWlsZE1lbWJlclJlZmVyZW5jZUV4cHIoRXhwciAqQmFzZSwgUXVhbFR5cGUgQmFzZVR5cGUsIFNvdXJjZUxvY2F0aW9uIE9wTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0Fycm93LCBjb25zdCBDWFhTY29wZVNwZWMgJlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkRGVjbCAqRmlyc3RRdWFsaWZpZXJJblNjb3BlLCBMb29rdXBSZXN1bHQgJlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gKlRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTdXBwcmVzc1F1YWxpZmllckNoZWNrID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3RPbk1lbWJlckFjY2Vzc0V4dHJhQXJncyAqRXh0cmFBcmdzID0gbnVsbHB0cik7CisKKyAgRXhwclJlc3VsdCBCdWlsZEZpZWxkUmVmZXJlbmNlRXhwcihFeHByICpCYXNlRXhwciwgYm9vbCBJc0Fycm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE9wTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFNjb3BlU3BlYyAmU1MsIEZpZWxkRGVjbCAqRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbEFjY2Vzc1BhaXIgRm91bmREZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk1lbWJlck5hbWVJbmZvKTsKKworICBFeHByUmVzdWx0IFBlcmZvcm1NZW1iZXJFeHByQmFzZUNvbnZlcnNpb24oRXhwciAqQmFzZSwgYm9vbCBJc0Fycm93KTsKKworICBib29sIENoZWNrUXVhbGlmaWVkTWVtYmVyUmVmZXJlbmNlKEV4cHIgKkJhc2VFeHByLCBRdWFsVHlwZSBCYXNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhTY29wZVNwZWMgJlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb2t1cFJlc3VsdCAmUik7CisKKyAgRXhwclJlc3VsdCBBY3RPbkRlcGVuZGVudE1lbWJlckV4cHIoRXhwciAqQmFzZSwgUXVhbFR5cGUgQmFzZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNBcnJvdywgU291cmNlTG9jYXRpb24gT3BMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlS1dMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkRGVjbCAqRmlyc3RRdWFsaWZpZXJJblNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqVGVtcGxhdGVBcmdzKTsKKworICBFeHByUmVzdWx0IEFjdE9uTWVtYmVyQWNjZXNzRXhwcihTY29wZSAqUywgRXhwciAqQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gT3BMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6VG9rZW5LaW5kIE9wS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5xdWFsaWZpZWRJZCAmTWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsICpPYmpDSW1wRGVjbCk7CisKKyAgdm9pZCBBY3RPbkRlZmF1bHRDdG9ySW5pdGlhbGl6ZXJzKERlY2wgKkNEdG9yRGVjbCk7CisgIGJvb2wgQ29udmVydEFyZ3VtZW50c0ZvckNhbGwoQ2FsbEV4cHIgKkNhbGwsIEV4cHIgKkZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uRGVjbCAqRkRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeGVjQ29uZmlnID0gZmFsc2UpOworICB2b2lkIENoZWNrU3RhdGljQXJyYXlBcmd1bWVudChTb3VyY2VMb2NhdGlvbiBDYWxsTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJtVmFyRGVjbCAqUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHIgKkFyZ0V4cHIpOworCisgIC8vLyBBY3RPbkNhbGxFeHByIC0gSGFuZGxlIGEgY2FsbCB0byBGbiB3aXRoIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgYXJndW1lbnRzLgorICAvLy8gVGhpcyBwcm92aWRlcyB0aGUgbG9jYXRpb24gb2YgdGhlIGxlZnQvcmlnaHQgcGFyZW5zIGFuZCBhIGxpc3Qgb2YgY29tbWEKKyAgLy8vIGxvY2F0aW9ucy4KKyAgRXhwclJlc3VsdCBBY3RPbkNhbGxFeHByKFNjb3BlICpTLCBFeHByICpGbiwgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlFeHByQXJnIEFyZ0V4cHJzLCBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpFeGVjQ29uZmlnID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNFeGVjQ29uZmlnID0gZmFsc2UpOworICBFeHByUmVzdWx0IEJ1aWxkUmVzb2x2ZWRDYWxsRXhwcihFeHByICpGbiwgTmFtZWREZWNsICpORGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IEFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpDb25maWcgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRXhlY0NvbmZpZyA9IGZhbHNlKTsKKworICBFeHByUmVzdWx0IEFjdE9uQ1VEQUV4ZWNDb25maWdFeHByKFNjb3BlICpTLCBTb3VyY2VMb2NhdGlvbiBMTExMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlFeHByQXJnIEV4ZWNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gR0dHTG9jKTsKKworICBFeHByUmVzdWx0IEFjdE9uQ2FzdEV4cHIoU2NvcGUgKlMsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0b3IgJkQsIFBhcnNlZFR5cGUgJlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jLCBFeHByICpDYXN0RXhwcik7CisgIEV4cHJSZXN1bHQgQnVpbGRDU3R5bGVDYXN0RXhwcihTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpPcCk7CisgIENhc3RLaW5kIFByZXBhcmVTY2FsYXJDYXN0KEV4cHJSZXN1bHQgJnNyYywgUXVhbFR5cGUgZGVzdFR5cGUpOworCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gYWx0aXZlYyBvciBPcGVuQ0wgbGl0ZXJhbC4KKyAgRXhwclJlc3VsdCBCdWlsZFZlY3RvckxpdGVyYWwoU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MsIEV4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUSW5mbyk7CisKKyAgRXhwclJlc3VsdCBNYXliZUNvbnZlcnRQYXJlbkxpc3RFeHByVG9QYXJlbkV4cHIoU2NvcGUgKlMsIEV4cHIgKk1FKTsKKworICBFeHByUmVzdWx0IEFjdE9uQ29tcG91bmRMaXRlcmFsKFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpJbml0RXhwcik7CisKKyAgRXhwclJlc3VsdCBCdWlsZENvbXBvdW5kTGl0ZXJhbEV4cHIoU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqVEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqTGl0ZXJhbEV4cHIpOworCisgIEV4cHJSZXN1bHQgQWN0T25Jbml0TGlzdChTb3VyY2VMb2NhdGlvbiBMQnJhY2VMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aUV4cHJBcmcgSW5pdEFyZ0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSQnJhY2VMb2MpOworCisgIEV4cHJSZXN1bHQgQWN0T25EZXNpZ25hdGVkSW5pdGlhbGl6ZXIoRGVzaWduYXRpb24gJkRlc2lnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEdOVVN5bnRheCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByUmVzdWx0IEluaXQpOworCitwcml2YXRlOgorICBzdGF0aWMgQmluYXJ5T3BlcmF0b3JLaW5kIENvbnZlcnRUb2tlbktpbmRUb0JpbmFyeU9wY29kZSh0b2s6OlRva2VuS2luZCBLaW5kKTsKKworcHVibGljOgorICBFeHByUmVzdWx0IEFjdE9uQmluT3AoU2NvcGUgKlMsIFNvdXJjZUxvY2F0aW9uIFRva0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6VG9rZW5LaW5kIEtpbmQsIEV4cHIgKkxIU0V4cHIsIEV4cHIgKlJIU0V4cHIpOworICBFeHByUmVzdWx0IEJ1aWxkQmluT3AoU2NvcGUgKlMsIFNvdXJjZUxvY2F0aW9uIE9wTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3JLaW5kIE9wYywgRXhwciAqTEhTRXhwciwgRXhwciAqUkhTRXhwcik7CisgIEV4cHJSZXN1bHQgQ3JlYXRlQnVpbHRpbkJpbk9wKFNvdXJjZUxvY2F0aW9uIE9wTG9jLCBCaW5hcnlPcGVyYXRvcktpbmQgT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpMSFNFeHByLCBFeHByICpSSFNFeHByKTsKKworICB2b2lkIERpYWdub3NlQ29tbWFPcGVyYXRvcihjb25zdCBFeHByICpMSFMsIFNvdXJjZUxvY2F0aW9uIExvYyk7CisKKyAgLy8vIEFjdE9uQ29uZGl0aW9uYWxPcCAtIFBhcnNlIGEgPzogb3BlcmF0aW9uLiAgTm90ZSB0aGF0ICdMSFMnIG1heSBiZSBudWxsCisgIC8vLyBpbiB0aGUgY2FzZSBvZiBhIHRoZSBHTlUgY29uZGl0aW9uYWwgZXhwciBleHRlbnNpb24uCisgIEV4cHJSZXN1bHQgQWN0T25Db25kaXRpb25hbE9wKFNvdXJjZUxvY2F0aW9uIFF1ZXN0aW9uTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqQ29uZEV4cHIsIEV4cHIgKkxIU0V4cHIsIEV4cHIgKlJIU0V4cHIpOworCisgIC8vLyBBY3RPbkFkZHJMYWJlbCAtIFBhcnNlIHRoZSBHTlUgYWRkcmVzcyBvZiBsYWJlbCBleHRlbnNpb246ICImJmZvbyIuCisgIEV4cHJSZXN1bHQgQWN0T25BZGRyTGFiZWwoU291cmNlTG9jYXRpb24gT3BMb2MsIFNvdXJjZUxvY2F0aW9uIExhYkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbERlY2wgKlRoZURlY2wpOworCisgIHZvaWQgQWN0T25TdGFydFN0bXRFeHByKCk7CisgIEV4cHJSZXN1bHQgQWN0T25TdG10RXhwcihTb3VyY2VMb2NhdGlvbiBMUExvYywgU3RtdCAqU3ViU3RtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQTG9jKTsgLy8gIih7Li59KSIKKyAgdm9pZCBBY3RPblN0bXRFeHByRXJyb3IoKTsKKworICAvLyBfX2J1aWx0aW5fb2Zmc2V0b2YodHlwZSwgaWRlbnRpZmllciguaWRlbnRpZmllcnxbZXhwcl0pKikKKyAgc3RydWN0IE9mZnNldE9mQ29tcG9uZW50IHsKKyAgICBTb3VyY2VMb2NhdGlvbiBMb2NTdGFydCwgTG9jRW5kOworICAgIGJvb2wgaXNCcmFja2V0czsgIC8vIHRydWUgaWYgW2V4cHJdLCBmYWxzZSBpZiAuaWRlbnQKKyAgICB1bmlvbiB7CisgICAgICBJZGVudGlmaWVySW5mbyAqSWRlbnRJbmZvOworICAgICAgRXhwciAqRTsKKyAgICB9IFU7CisgIH07CisKKyAgLy8vIF9fYnVpbHRpbl9vZmZzZXRvZih0eXBlLCBhLmJbMTIzXVs0NTZdLmMpCisgIEV4cHJSZXN1bHQgQnVpbGRCdWlsdGluT2Zmc2V0T2YoU291cmNlTG9jYXRpb24gQnVpbHRpbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqVEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T2Zmc2V0T2ZDb21wb25lbnQ+IENvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKTsKKyAgRXhwclJlc3VsdCBBY3RPbkJ1aWx0aW5PZmZzZXRPZihTY29wZSAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBCdWlsdGluTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFR5cGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSBQYXJzZWRBcmdUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPZmZzZXRPZkNvbXBvbmVudD4gQ29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MpOworCisgIC8vIF9fYnVpbHRpbl9jaG9vc2VfZXhwcihjb25zdEV4cHIsIGV4cHIxLCBleHByMikKKyAgRXhwclJlc3VsdCBBY3RPbkNob29zZUV4cHIoU291cmNlTG9jYXRpb24gQnVpbHRpbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqQ29uZEV4cHIsIEV4cHIgKkxIU0V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKlJIU0V4cHIsIFNvdXJjZUxvY2F0aW9uIFJQTG9jKTsKKworICAvLyBfX2J1aWx0aW5fdmFfYXJnKGV4cHIsIHR5cGUpCisgIEV4cHJSZXN1bHQgQWN0T25WQUFyZyhTb3VyY2VMb2NhdGlvbiBCdWlsdGluTG9jLCBFeHByICpFLCBQYXJzZWRUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBMb2MpOworICBFeHByUmVzdWx0IEJ1aWxkVkFBcmdFeHByKFNvdXJjZUxvY2F0aW9uIEJ1aWx0aW5Mb2MsIEV4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKlRJbmZvLCBTb3VyY2VMb2NhdGlvbiBSUExvYyk7CisKKyAgLy8gX19udWxsCisgIEV4cHJSZXN1bHQgQWN0T25HTlVOdWxsRXhwcihTb3VyY2VMb2NhdGlvbiBUb2tlbkxvYyk7CisKKyAgYm9vbCBDaGVja0Nhc2VFeHByZXNzaW9uKEV4cHIgKkUpOworCisgIC8vLyBcYnJpZWYgRGVzY3JpYmVzIHRoZSByZXN1bHQgb2YgYW4gImlmLWV4aXN0cyIgY29uZGl0aW9uIGNoZWNrLgorICBlbnVtIElmRXhpc3RzUmVzdWx0IHsKKyAgICAvLy8gXGJyaWVmIFRoZSBzeW1ib2wgZXhpc3RzLgorICAgIElFUl9FeGlzdHMsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBzeW1ib2wgZG9lcyBub3QgZXhpc3QuCisgICAgSUVSX0RvZXNOb3RFeGlzdCwKKworICAgIC8vLyBcYnJpZWYgVGhlIG5hbWUgaXMgYSBkZXBlbmRlbnQgbmFtZSwgc28gdGhlIHJlc3VsdHMgd2lsbCBkaWZmZXIKKyAgICAvLy8gZnJvbSBvbmUgaW5zdGFudGlhdGlvbiB0byB0aGUgbmV4dC4KKyAgICBJRVJfRGVwZW5kZW50LAorCisgICAgLy8vIFxicmllZiBBbiBlcnJvciBvY2N1cnJlZC4KKyAgICBJRVJfRXJyb3IKKyAgfTsKKworICBJZkV4aXN0c1Jlc3VsdAorICBDaGVja01pY3Jvc29mdElmRXhpc3RzU3ltYm9sKFNjb3BlICpTLCBDWFhTY29wZVNwZWMgJlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJlRhcmdldE5hbWVJbmZvKTsKKworICBJZkV4aXN0c1Jlc3VsdAorICBDaGVja01pY3Jvc29mdElmRXhpc3RzU3ltYm9sKFNjb3BlICpTLCBTb3VyY2VMb2NhdGlvbiBLZXl3b3JkTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJZkV4aXN0cywgQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnF1YWxpZmllZElkICZOYW1lKTsKKworICBTdG10UmVzdWx0IEJ1aWxkTVNEZXBlbmRlbnRFeGlzdHNTdG10KFNvdXJjZUxvY2F0aW9uIEtleXdvcmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0lmRXhpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgUXVhbGlmaWVyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZUluZm8gTmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdCAqTmVzdGVkKTsKKyAgU3RtdFJlc3VsdCBBY3RPbk1TRGVwZW5kZW50RXhpc3RzU3RtdChTb3VyY2VMb2NhdGlvbiBLZXl3b3JkTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJZkV4aXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhTY29wZVNwZWMgJlNTLCBVbnF1YWxpZmllZElkICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKk5lc3RlZCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICJCbG9jayIgRXh0ZW5zaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIEFjdE9uQmxvY2tTdGFydCAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgYmxvY2sgbGl0ZXJhbCBpcworICAvLy8gc3RhcnRlZC4KKyAgdm9pZCBBY3RPbkJsb2NrU3RhcnQoU291cmNlTG9jYXRpb24gQ2FyZXRMb2MsIFNjb3BlICpDdXJTY29wZSk7CisKKyAgLy8vIEFjdE9uQmxvY2tBcmd1bWVudHMgLSBUaGlzIGNhbGxiYWNrIGFsbG93cyBwcm9jZXNzaW5nIG9mIGJsb2NrIGFyZ3VtZW50cy4KKyAgLy8vIElmIHRoZXJlIGFyZSBubyBhcmd1bWVudHMsIHRoaXMgaXMgc3RpbGwgaW52b2tlZC4KKyAgdm9pZCBBY3RPbkJsb2NrQXJndW1lbnRzKFNvdXJjZUxvY2F0aW9uIENhcmV0TG9jLCBEZWNsYXJhdG9yICZQYXJhbUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTY29wZSAqQ3VyU2NvcGUpOworCisgIC8vLyBBY3RPbkJsb2NrRXJyb3IgLSBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIGEgYmxvY2ssIHRoaXMgY2FsbGJhY2sKKyAgLy8vIGlzIGludm9rZWQgdG8gcG9wIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmxvY2sgZnJvbSB0aGUgYWN0aW9uIGltcGwuCisgIHZvaWQgQWN0T25CbG9ja0Vycm9yKFNvdXJjZUxvY2F0aW9uIENhcmV0TG9jLCBTY29wZSAqQ3VyU2NvcGUpOworCisgIC8vLyBBY3RPbkJsb2NrU3RtdEV4cHIgLSBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBib2R5IG9mIGEgYmxvY2sgc3RhdGVtZW50CisgIC8vLyBsaXRlcmFsIHdhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiAgXihpbnQgeCl7Li4ufQorICBFeHByUmVzdWx0IEFjdE9uQmxvY2tTdG10RXhwcihTb3VyY2VMb2NhdGlvbiBDYXJldExvYywgU3RtdCAqQm9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NvcGUgKkN1clNjb3BlKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2xhbmcgRXh0ZW5zaW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gX19idWlsdGluX2NvbnZlcnR2ZWN0b3IoLi4uKQorICBFeHByUmVzdWx0IEFjdE9uQ29udmVydFZlY3RvckV4cHIoRXhwciAqRSwgUGFyc2VkVHlwZSBQYXJzZWREZXN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBCdWlsdGluTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3BlbkNMIEZlYXR1cmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gX19idWlsdGluX2FzdHlwZSguLi4pCisgIEV4cHJSZXN1bHQgQWN0T25Bc1R5cGVFeHByKEV4cHIgKkUsIFBhcnNlZFR5cGUgUGFyc2VkRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBCdWlsdGluTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDKysgRmVhdHVyZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vIEFjdCBvbiBDKysgbmFtZXNwYWNlcworICBEZWNsICpBY3RPblN0YXJ0TmFtZXNwYWNlRGVmKFNjb3BlICpTLCBTb3VyY2VMb2NhdGlvbiBJbmxpbmVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTmFtZXNwYWNlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkZW50TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpJZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMQnJhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdCAqQXR0ckxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNpbmdEaXJlY3RpdmVEZWNsICogJlVzaW5nRGVjbCk7CisgIHZvaWQgQWN0T25GaW5pc2hOYW1lc3BhY2VEZWYoRGVjbCAqRGNsLCBTb3VyY2VMb2NhdGlvbiBSQnJhY2UpOworCisgIE5hbWVzcGFjZURlY2wgKmdldFN0ZE5hbWVzcGFjZSgpIGNvbnN0OworICBOYW1lc3BhY2VEZWNsICpnZXRPckNyZWF0ZVN0ZE5hbWVzcGFjZSgpOworCisgIE5hbWVzcGFjZURlY2wgKmxvb2t1cFN0ZEV4cGVyaW1lbnRhbE5hbWVzcGFjZSgpOworCisgIENYWFJlY29yZERlY2wgKmdldFN0ZEJhZEFsbG9jKCkgY29uc3Q7CisgIEVudW1EZWNsICpnZXRTdGRBbGlnblZhbFQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFRlc3RzIHdoZXRoZXIgVHkgaXMgYW4gaW5zdGFuY2Ugb2Ygc3RkOjppbml0aWFsaXplcl9saXN0IGFuZCwgaWYKKyAgLy8vIGl0IGlzIGFuZCBFbGVtZW50IGlzIG5vdCBOVUxMLCBhc3NpZ25zIHRoZSBlbGVtZW50IHR5cGUgdG8gRWxlbWVudC4KKyAgYm9vbCBpc1N0ZEluaXRpYWxpemVyTGlzdChRdWFsVHlwZSBUeSwgUXVhbFR5cGUgKkVsZW1lbnQpOworCisgIC8vLyBcYnJpZWYgTG9va3MgZm9yIHRoZSBzdGQ6OmluaXRpYWxpemVyX2xpc3QgdGVtcGxhdGUgYW5kIGluc3RhbnRpYXRlcyBpdAorICAvLy8gd2l0aCBFbGVtZW50LCBvciBlbWl0cyBhbiBlcnJvciBpZiBpdCdzIG5vdCBmb3VuZC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBUaGUgaW5zdGFudGlhdGVkIHRlbXBsYXRlLCBvciBudWxsIG9uIGVycm9yLgorICBRdWFsVHlwZSBCdWlsZFN0ZEluaXRpYWxpemVyTGlzdChRdWFsVHlwZSBFbGVtZW50LCBTb3VyY2VMb2NhdGlvbiBMb2MpOworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgQ3RvciBpcyBhbiBpbml0aWFsaXplci1saXN0IGNvbnN0cnVjdG9yLCBhcworICAvLy8gZGVmaW5lZCBpbiBbZGNsLmluaXQubGlzdF1wMi4KKyAgYm9vbCBpc0luaXRMaXN0Q29uc3RydWN0b3IoY29uc3QgRnVuY3Rpb25EZWNsICpDdG9yKTsKKworICBEZWNsICpBY3RPblVzaW5nRGlyZWN0aXZlKFNjb3BlICpDdXJTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBVc2luZ0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBOYW1lc3BjTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRlbnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKk5hbWVzcGNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3QgKkF0dHJMaXN0KTsKKworICB2b2lkIFB1c2hVc2luZ0RpcmVjdGl2ZShTY29wZSAqUywgVXNpbmdEaXJlY3RpdmVEZWNsICpVRGlyKTsKKworICBEZWNsICpBY3RPbk5hbWVzcGFjZUFsaWFzRGVmKFNjb3BlICpDdXJTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBOYW1lc3BhY2VMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQWxpYXNMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKkFsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRlbnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklkZW50KTsKKworICB2b2lkIEhpZGVVc2luZ1NoYWRvd0RlY2woU2NvcGUgKlMsIFVzaW5nU2hhZG93RGVjbCAqU2hhZG93KTsKKyAgYm9vbCBDaGVja1VzaW5nU2hhZG93RGVjbChVc2luZ0RlY2wgKlVELCBOYW1lZERlY2wgKlRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29rdXBSZXN1bHQgJlByZXZpb3VzRGVjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNpbmdTaGFkb3dEZWNsIComUHJldlNoYWRvdyk7CisgIFVzaW5nU2hhZG93RGVjbCAqQnVpbGRVc2luZ1NoYWRvd0RlY2woU2NvcGUgKlMsIFVzaW5nRGVjbCAqVUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNpbmdTaGFkb3dEZWNsICpQcmV2RGVjbCk7CisKKyAgYm9vbCBDaGVja1VzaW5nRGVjbFJlZGVjbGFyYXRpb24oU291cmNlTG9jYXRpb24gVXNpbmdMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzVHlwZW5hbWVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhTY29wZVNwZWMgJlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29rdXBSZXN1bHQgJlByZXZpb3VzKTsKKyAgYm9vbCBDaGVja1VzaW5nRGVjbFF1YWxpZmllcihTb3VyY2VMb2NhdGlvbiBVc2luZ0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc1R5cGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmTmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTmFtZUxvYyk7CisKKyAgTmFtZWREZWNsICpCdWlsZFVzaW5nRGVjbGFyYXRpb24oU2NvcGUgKlMsIEFjY2Vzc1NwZWNpZmllciBBUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVXNpbmdMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzVHlwZW5hbWVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUeXBlbmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lSW5mbyBOYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3QgKkF0dHJMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzSW5zdGFudGlhdGlvbik7CisgIE5hbWVkRGVjbCAqQnVpbGRVc2luZ1BhY2tEZWNsKE5hbWVkRGVjbCAqSW5zdGFudGlhdGVkRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8TmFtZWREZWNsICo+IEV4cGFuc2lvbnMpOworCisgIGJvb2wgQ2hlY2tJbmhlcml0aW5nQ29uc3RydWN0b3JVc2luZ0RlY2woVXNpbmdEZWNsICpVRCk7CisKKyAgLy8vIEdpdmVuIGEgZGVyaXZlZC1jbGFzcyB1c2luZyBzaGFkb3cgZGVjbGFyYXRpb24gZm9yIGEgY29uc3RydWN0b3IgYW5kIHRoZQorICAvLy8gY29ycmVzcG5kaW5nIGJhc2UgY2xhc3MgY29uc3RydWN0b3IsIGZpbmQgb3IgY3JlYXRlIHRoZSBpbXBsaWNpdAorICAvLy8gc3ludGhlc2l6ZWQgZGVyaXZlZCBjbGFzcyBjb25zdHJ1Y3RvciB0byB1c2UgZm9yIHRoaXMgaW5pdGlhbGl6YXRpb24uCisgIENYWENvbnN0cnVjdG9yRGVjbCAqCisgIGZpbmRJbmhlcml0aW5nQ29uc3RydWN0b3IoU291cmNlTG9jYXRpb24gTG9jLCBDWFhDb25zdHJ1Y3RvckRlY2wgKkJhc2VDdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yVXNpbmdTaGFkb3dEZWNsICpEZXJpdmVkU2hhZG93KTsKKworICBEZWNsICpBY3RPblVzaW5nRGVjbGFyYXRpb24oU2NvcGUgKkN1clNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzU3BlY2lmaWVyIEFTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVXNpbmdMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUeXBlbmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnF1YWxpZmllZElkICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0ICpBdHRyTGlzdCk7CisgIERlY2wgKkFjdE9uQWxpYXNEZWNsYXJhdGlvbihTY29wZSAqQ3VyU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NTcGVjaWZpZXIgQVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aVRlbXBsYXRlUGFyYW1zQXJnIFRlbXBsYXRlUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVXNpbmdMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnF1YWxpZmllZElkICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdCAqQXR0ckxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlUmVzdWx0IFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsICpEZWNsRnJvbURlY2xTcGVjKTsKKworICAvLy8gQnVpbGRDWFhDb25zdHJ1Y3RFeHByIC0gQ3JlYXRlcyBhIGNvbXBsZXRlIGNhbGwgdG8gYSBjb25zdHJ1Y3RvciwKKyAgLy8vIGluY2x1ZGluZyBoYW5kbGluZyBvZiBpdHMgZGVmYXVsdCBhcmd1bWVudCBleHByZXNzaW9ucy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29uc3RydWN0S2luZCAtIGEgQ1hYQ29uc3RydWN0RXhwcjo6Q29uc3RydWN0aW9uS2luZAorICBFeHByUmVzdWx0CisgIEJ1aWxkQ1hYQ29uc3RydWN0RXhwcihTb3VyY2VMb2NhdGlvbiBDb25zdHJ1Y3RMb2MsIFF1YWxUeXBlIERlY2xJbml0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkRGVjbCAqRm91bmREZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ29uc3RydWN0b3JEZWNsICpDb25zdHJ1Y3RvciwgTXVsdGlFeHByQXJnIEV4cHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYWRNdWx0aXBsZUNhbmRpZGF0ZXMsIGJvb2wgSXNMaXN0SW5pdGlhbGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzU3RkSW5pdExpc3RJbml0aWFsaXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVxdWlyZXNaZXJvSW5pdCwgdW5zaWduZWQgQ29uc3RydWN0S2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFBhcmVuUmFuZ2UpOworCisgIC8vLyBCdWlsZCBhIENYWENvbnN0cnVjdEV4cHIgd2hvc2UgY29uc3RydWN0b3IgaGFzIGFscmVhZHkgYmVlbiByZXNvbHZlZCBpZgorICAvLy8gaXQgZGVub3RlcyBhbiBpbmhlcml0ZWQgY29uc3RydWN0b3IuCisgIEV4cHJSZXN1bHQKKyAgQnVpbGRDWFhDb25zdHJ1Y3RFeHByKFNvdXJjZUxvY2F0aW9uIENvbnN0cnVjdExvYywgUXVhbFR5cGUgRGVjbEluaXRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ29uc3RydWN0b3JEZWNsICpDb25zdHJ1Y3RvciwgYm9vbCBFbGlkYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpRXhwckFyZyBFeHBycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFkTXVsdGlwbGVDYW5kaWRhdGVzLCBib29sIElzTGlzdEluaXRpYWxpemF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1N0ZEluaXRMaXN0SW5pdGlhbGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJlcXVpcmVzWmVyb0luaXQsIHVuc2lnbmVkIENvbnN0cnVjdEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBQYXJlblJhbmdlKTsKKworICAvLyBGSVhNRTogQ2FuIHdlIHJlbW92ZSB0aGlzIGFuZCBoYXZlIHRoZSBhYm92ZSBCdWlsZENYWENvbnN0cnVjdEV4cHIgY2hlY2sgaWYKKyAgLy8gdGhlIGNvbnN0cnVjdG9yIGNhbiBiZSBlbGlkYWJsZT8KKyAgRXhwclJlc3VsdAorICBCdWlsZENYWENvbnN0cnVjdEV4cHIoU291cmNlTG9jYXRpb24gQ29uc3RydWN0TG9jLCBRdWFsVHlwZSBEZWNsSW5pdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKkZvdW5kRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENYWENvbnN0cnVjdG9yRGVjbCAqQ29uc3RydWN0b3IsIGJvb2wgRWxpZGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aUV4cHJBcmcgRXhwcnMsIGJvb2wgSGFkTXVsdGlwbGVDYW5kaWRhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0xpc3RJbml0aWFsaXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNTdGRJbml0TGlzdEluaXRpYWxpemF0aW9uLCBib29sIFJlcXVpcmVzWmVyb0luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb25zdHJ1Y3RLaW5kLCBTb3VyY2VSYW5nZSBQYXJlblJhbmdlKTsKKworICBFeHByUmVzdWx0IEJ1aWxkQ1hYRGVmYXVsdEluaXRFeHByKFNvdXJjZUxvY2F0aW9uIExvYywgRmllbGREZWNsICpGaWVsZCk7CisKKworICAvLy8gSW5zdGFudGlhdGUgb3IgcGFyc2UgYSBDKysgZGVmYXVsdCBhcmd1bWVudCBleHByZXNzaW9uIGFzIG5lY2Vzc2FyeS4KKyAgLy8vIFJldHVybiB0cnVlIG9uIGVycm9yLgorICBib29sIENoZWNrQ1hYRGVmYXVsdEFyZ0V4cHIoU291cmNlTG9jYXRpb24gQ2FsbExvYywgRnVuY3Rpb25EZWNsICpGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcm1WYXJEZWNsICpQYXJhbSk7CisKKyAgLy8vIEJ1aWxkQ1hYRGVmYXVsdEFyZ0V4cHIgLSBDcmVhdGVzIGEgQ1hYRGVmYXVsdEFyZ0V4cHIsIGluc3RhbnRpYXRpbmcKKyAgLy8vIHRoZSBkZWZhdWx0IGV4cHIgaWYgbmVlZGVkLgorICBFeHByUmVzdWx0IEJ1aWxkQ1hYRGVmYXVsdEFyZ0V4cHIoU291cmNlTG9jYXRpb24gQ2FsbExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uRGVjbCAqRkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJtVmFyRGVjbCAqUGFyYW0pOworCisgIC8vLyBGaW5hbGl6ZVZhcldpdGhEZXN0cnVjdG9yIC0gUHJlcGFyZSBmb3IgY2FsbGluZyBkZXN0cnVjdG9yIG9uIHRoZQorICAvLy8gY29uc3RydWN0ZWQgdmFyaWFibGUuCisgIHZvaWQgRmluYWxpemVWYXJXaXRoRGVzdHJ1Y3RvcihWYXJEZWNsICpWRCwgY29uc3QgUmVjb3JkVHlwZSAqRGVjbEluaXRUeXBlKTsKKworICAvLy8gXGJyaWVmIEhlbHBlciBjbGFzcyB0aGF0IGNvbGxlY3RzIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBmb3IKKyAgLy8vIGltcGxpY2l0bHktZGVjbGFyZWQgc3BlY2lhbCBtZW1iZXIgZnVuY3Rpb25zLgorICBjbGFzcyBJbXBsaWNpdEV4Y2VwdGlvblNwZWNpZmljYXRpb24geworICAgIC8vIFBvaW50ZXIgdG8gYWxsb3cgY29weWluZworICAgIFNlbWEgKlNlbGY7CisgICAgLy8gV2Ugb3JkZXIgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIHRodXM6CisgICAgLy8gbm9leGNlcHQgaXMgdGhlIG1vc3QgcmVzdHJpY3RpdmUsIGJ1dCBpcyBvbmx5IHVzZWQgaW4gQysrMTEuCisgICAgLy8gdGhyb3coKSBjb21lcyBuZXh0LgorICAgIC8vIFRoZW4gYSB0aHJvdyhjb2xsZWN0ZWQgZXhjZXB0aW9ucykKKyAgICAvLyBGaW5hbGx5IG5vIHNwZWNpZmljYXRpb24sIHdoaWNoIGlzIGV4cHJlc3NlZCBhcyBub2V4Y2VwdChmYWxzZSkuCisgICAgLy8gdGhyb3coLi4uKSBpcyB1c2VkIGluc3RlYWQgaWYgYW55IGNhbGxlZCBmdW5jdGlvbiB1c2VzIGl0LgorICAgIEV4Y2VwdGlvblNwZWNpZmljYXRpb25UeXBlIENvbXB1dGVkRVNUOworICAgIGxsdm06OlNtYWxsUHRyU2V0PENhblF1YWxUeXBlLCA0PiBFeGNlcHRpb25zU2VlbjsKKyAgICBTbWFsbFZlY3RvcjxRdWFsVHlwZSwgND4gRXhjZXB0aW9uczsKKworICAgIHZvaWQgQ2xlYXJFeGNlcHRpb25zKCkgeworICAgICAgRXhjZXB0aW9uc1NlZW4uY2xlYXIoKTsKKyAgICAgIEV4Y2VwdGlvbnMuY2xlYXIoKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEltcGxpY2l0RXhjZXB0aW9uU3BlY2lmaWNhdGlvbihTZW1hICZTZWxmKQorICAgICAgOiBTZWxmKCZTZWxmKSwgQ29tcHV0ZWRFU1QoRVNUX0Jhc2ljTm9leGNlcHQpIHsKKyAgICAgIGlmICghU2VsZi5nZXRMYW5nT3B0cygpLkNQbHVzUGx1czExKQorICAgICAgICBDb21wdXRlZEVTVCA9IEVTVF9EeW5hbWljTm9uZTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIEdldCB0aGUgY29tcHV0ZWQgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gdHlwZS4KKyAgICBFeGNlcHRpb25TcGVjaWZpY2F0aW9uVHlwZSBnZXRFeGNlcHRpb25TcGVjVHlwZSgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChDb21wdXRlZEVTVCAhPSBFU1RfQ29tcHV0ZWROb2V4Y2VwdCAmJgorICAgICAgICAgICAgICJub2V4Y2VwdChleHByKSBzaG91bGQgbm90IGJlIGEgcG9zc2libGUgcmVzdWx0Iik7CisgICAgICByZXR1cm4gQ29tcHV0ZWRFU1Q7CisgICAgfQorCisgICAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGV4Y2VwdGlvbnMgaW4gdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLgorICAgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBFeGNlcHRpb25zLnNpemUoKTsgfQorCisgICAgLy8vIFxicmllZiBUaGUgc2V0IG9mIGV4Y2VwdGlvbnMgaW4gdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLgorICAgIGNvbnN0IFF1YWxUeXBlICpkYXRhKCkgY29uc3QgeyByZXR1cm4gRXhjZXB0aW9ucy5kYXRhKCk7IH0KKworICAgIC8vLyBcYnJpZWYgSW50ZWdyYXRlIGFub3RoZXIgY2FsbGVkIG1ldGhvZCBpbnRvIHRoZSBjb2xsZWN0ZWQgZGF0YS4KKyAgICB2b2lkIENhbGxlZERlY2woU291cmNlTG9jYXRpb24gQ2FsbExvYywgY29uc3QgQ1hYTWV0aG9kRGVjbCAqTWV0aG9kKTsKKworICAgIC8vLyBcYnJpZWYgSW50ZWdyYXRlIGFuIGludm9rZWQgZXhwcmVzc2lvbiBpbnRvIHRoZSBjb2xsZWN0ZWQgZGF0YS4KKyAgICB2b2lkIENhbGxlZEV4cHIoRXhwciAqRSk7CisKKyAgICAvLy8gXGJyaWVmIE92ZXJ3cml0ZSBhbiBFUEkncyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiB3aXRoIHRoaXMKKyAgICAvLy8gY29tcHV0ZWQgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uCisgICAgRnVuY3Rpb25Qcm90b1R5cGU6OkV4Y2VwdGlvblNwZWNJbmZvIGdldEV4Y2VwdGlvblNwZWMoKSBjb25zdCB7CisgICAgICBGdW5jdGlvblByb3RvVHlwZTo6RXhjZXB0aW9uU3BlY0luZm8gRVNJOworICAgICAgRVNJLlR5cGUgPSBnZXRFeGNlcHRpb25TcGVjVHlwZSgpOworICAgICAgaWYgKEVTSS5UeXBlID09IEVTVF9EeW5hbWljKSB7CisgICAgICAgIEVTSS5FeGNlcHRpb25zID0gRXhjZXB0aW9uczsKKyAgICAgIH0gZWxzZSBpZiAoRVNJLlR5cGUgPT0gRVNUX05vbmUpIHsKKyAgICAgICAgLy8vIEMrKzExIFtleGNlcHQuc3BlY11wMTQ6CisgICAgICAgIC8vLyAgIFRoZSBleGNlcHRpb24tc3BlY2lmaWNhdGlvbiBpcyBub2V4Y2VwdChmYWxzZSkgaWYgdGhlIHNldCBvZgorICAgICAgICAvLy8gICBwb3RlbnRpYWwgZXhjZXB0aW9ucyBvZiB0aGUgc3BlY2lhbCBtZW1iZXIgZnVuY3Rpb24gY29udGFpbnMgImFueSIKKyAgICAgICAgRVNJLlR5cGUgPSBFU1RfQ29tcHV0ZWROb2V4Y2VwdDsKKyAgICAgICAgRVNJLk5vZXhjZXB0RXhwciA9IFNlbGYtPkFjdE9uQ1hYQm9vbExpdGVyYWwoU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rOjprd19mYWxzZSkuZ2V0KCk7CisgICAgICB9CisgICAgICByZXR1cm4gRVNJOworICAgIH0KKyAgfTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGF0IHNvcnQgb2YgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gYSBkZWZhdWx0ZWQKKyAgLy8vIGNvcHkgY29uc3RydWN0b3Igb2YgYSBjbGFzcyB3aWxsIGhhdmUuCisgIEltcGxpY2l0RXhjZXB0aW9uU3BlY2lmaWNhdGlvbgorICBDb21wdXRlRGVmYXVsdGVkRGVmYXVsdEN0b3JFeGNlcHRpb25TcGVjKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhNZXRob2REZWNsICpNRCk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hhdCBzb3J0IG9mIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGEgZGVmYXVsdGVkCisgIC8vLyBkZWZhdWx0IGNvbnN0cnVjdG9yIG9mIGEgY2xhc3Mgd2lsbCBoYXZlLCBhbmQgd2hldGhlciB0aGUgcGFyYW1ldGVyCisgIC8vLyB3aWxsIGJlIGNvbnN0LgorICBJbXBsaWNpdEV4Y2VwdGlvblNwZWNpZmljYXRpb24KKyAgQ29tcHV0ZURlZmF1bHRlZENvcHlDdG9yRXhjZXB0aW9uU3BlYyhDWFhNZXRob2REZWNsICpNRCk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hhdCBzb3J0IG9mIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGEgZGVmYXV0bGVkCisgIC8vLyBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3Igb2YgYSBjbGFzcyB3aWxsIGhhdmUsIGFuZCB3aGV0aGVyIHRoZQorICAvLy8gcGFyYW1ldGVyIHdpbGwgYmUgY29uc3QuCisgIEltcGxpY2l0RXhjZXB0aW9uU3BlY2lmaWNhdGlvbgorICBDb21wdXRlRGVmYXVsdGVkQ29weUFzc2lnbm1lbnRFeGNlcHRpb25TcGVjKENYWE1ldGhvZERlY2wgKk1EKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGF0IHNvcnQgb2YgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gYSBkZWZhdWx0ZWQgbW92ZQorICAvLy8gY29uc3RydWN0b3Igb2YgYSBjbGFzcyB3aWxsIGhhdmUuCisgIEltcGxpY2l0RXhjZXB0aW9uU3BlY2lmaWNhdGlvbgorICBDb21wdXRlRGVmYXVsdGVkTW92ZUN0b3JFeGNlcHRpb25TcGVjKENYWE1ldGhvZERlY2wgKk1EKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGF0IHNvcnQgb2YgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gYSBkZWZhdWx0ZWQgbW92ZQorICAvLy8gYXNzaWdubWVudCBvcGVyYXRvciBvZiBhIGNsYXNzIHdpbGwgaGF2ZS4KKyAgSW1wbGljaXRFeGNlcHRpb25TcGVjaWZpY2F0aW9uCisgIENvbXB1dGVEZWZhdWx0ZWRNb3ZlQXNzaWdubWVudEV4Y2VwdGlvblNwZWMoQ1hYTWV0aG9kRGVjbCAqTUQpOworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoYXQgc29ydCBvZiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBhIGRlZmF1bHRlZAorICAvLy8gZGVzdHJ1Y3RvciBvZiBhIGNsYXNzIHdpbGwgaGF2ZS4KKyAgSW1wbGljaXRFeGNlcHRpb25TcGVjaWZpY2F0aW9uCisgIENvbXB1dGVEZWZhdWx0ZWREdG9yRXhjZXB0aW9uU3BlYyhDWFhNZXRob2REZWNsICpNRCk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hhdCBzb3J0IG9mIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGFuIGluaGVyaXRpbmcKKyAgLy8vIGNvbnN0cnVjdG9yIG9mIGEgY2xhc3Mgd2lsbCBoYXZlLgorICBJbXBsaWNpdEV4Y2VwdGlvblNwZWNpZmljYXRpb24KKyAgQ29tcHV0ZUluaGVyaXRpbmdDdG9yRXhjZXB0aW9uU3BlYyhTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ29uc3RydWN0b3JEZWNsICpDRCk7CisKKyAgLy8vIFxicmllZiBFdmFsdWF0ZSB0aGUgaW1wbGljaXQgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gZm9yIGEgZGVmYXVsdGVkCisgIC8vLyBzcGVjaWFsIG1lbWJlciBmdW5jdGlvbi4KKyAgdm9pZCBFdmFsdWF0ZUltcGxpY2l0RXhjZXB0aW9uU3BlYyhTb3VyY2VMb2NhdGlvbiBMb2MsIENYWE1ldGhvZERlY2wgKk1EKTsKKworICAvLy8gXGJyaWVmIENoZWNrIHRoZSBnaXZlbiBleGNlcHRpb24tc3BlY2lmaWNhdGlvbiBhbmQgdXBkYXRlIHRoZQorICAvLy8gZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gaW5mb3JtYXRpb24gd2l0aCB0aGUgcmVzdWx0cy4KKyAgdm9pZCBjaGVja0V4Y2VwdGlvblNwZWNpZmljYXRpb24oYm9vbCBJc1RvcExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25TcGVjaWZpY2F0aW9uVHlwZSBFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlZFR5cGU+IER5bmFtaWNFeGNlcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTb3VyY2VSYW5nZT4gRHluYW1pY0V4Y2VwdGlvblJhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqTm9leGNlcHRFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8UXVhbFR5cGU+ICZFeGNlcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblByb3RvVHlwZTo6RXhjZXB0aW9uU3BlY0luZm8gJkVTSSk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgaWYgd2UncmUgaW4gYSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gKGluY29ycmVjdGx5KSBlYWdlcmx5CisgIC8vLyBwYXJzZSBhbiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiB0byB3b3JrIGFyb3VuZCBhIGxpYnN0ZGMrKyBidWcuCisgIGJvb2wgaXNMaWJzdGRjeHhFYWdlckV4Y2VwdGlvblNwZWNIYWNrKGNvbnN0IERlY2xhcmF0b3IgJkQpOworCisgIC8vLyBcYnJpZWYgQWRkIGFuIGV4Y2VwdGlvbi1zcGVjaWZpY2F0aW9uIHRvIHRoZSBnaXZlbiBtZW1iZXIgZnVuY3Rpb24KKyAgLy8vIChvciBtZW1iZXIgZnVuY3Rpb24gdGVtcGxhdGUpLiBUaGUgZXhjZXB0aW9uLXNwZWNpZmljYXRpb24gd2FzIHBhcnNlZAorICAvLy8gYWZ0ZXIgdGhlIG1ldGhvZCBpdHNlbGYgd2FzIGRlY2xhcmVkLgorICB2b2lkIGFjdE9uRGVsYXllZEV4Y2VwdGlvblNwZWNpZmljYXRpb24oRGVjbCAqTWV0aG9kLAorICAgICAgICAgRXhjZXB0aW9uU3BlY2lmaWNhdGlvblR5cGUgRVNULAorICAgICAgICAgU291cmNlUmFuZ2UgU3BlY2lmaWNhdGlvblJhbmdlLAorICAgICAgICAgQXJyYXlSZWY8UGFyc2VkVHlwZT4gRHluYW1pY0V4Y2VwdGlvbnMsCisgICAgICAgICBBcnJheVJlZjxTb3VyY2VSYW5nZT4gRHluYW1pY0V4Y2VwdGlvblJhbmdlcywKKyAgICAgICAgIEV4cHIgKk5vZXhjZXB0RXhwcik7CisKKyAgY2xhc3MgSW5oZXJpdGVkQ29uc3RydWN0b3JJbmZvOworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIGEgc3BlY2lhbCBtZW1iZXIgZnVuY3Rpb24gc2hvdWxkIGhhdmUgYSBkZWxldGVkCisgIC8vLyBkZWZpbml0aW9uIHdoZW4gaXQgaXMgZGVmYXVsdGVkLgorICBib29sIFNob3VsZERlbGV0ZVNwZWNpYWxNZW1iZXIoQ1hYTWV0aG9kRGVjbCAqTUQsIENYWFNwZWNpYWxNZW1iZXIgQ1NNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5oZXJpdGVkQ29uc3RydWN0b3JJbmZvICpJQ0kgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEaWFnbm9zZSA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIERlY2xhcmUgdGhlIGltcGxpY2l0IGRlZmF1bHQgY29uc3RydWN0b3IgZm9yIHRoZSBnaXZlbiBjbGFzcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ2xhc3NEZWNsIFRoZSBjbGFzcyBkZWNsYXJhdGlvbiBpbnRvIHdoaWNoIHRoZSBpbXBsaWNpdAorICAvLy8gZGVmYXVsdCBjb25zdHJ1Y3RvciB3aWxsIGJlIGFkZGVkLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSBpbXBsaWNpdGx5LWRlY2xhcmVkIGRlZmF1bHQgY29uc3RydWN0b3IuCisgIENYWENvbnN0cnVjdG9yRGVjbCAqRGVjbGFyZUltcGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhSZWNvcmREZWNsICpDbGFzc0RlY2wpOworCisgIC8vLyBEZWZpbmVJbXBsaWNpdERlZmF1bHRDb25zdHJ1Y3RvciAtIENoZWNrcyBmb3IgZmVhc2liaWxpdHkgb2YKKyAgLy8vIGRlZmluaW5nIHRoaXMgY29uc3RydWN0b3IgYXMgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCisgIHZvaWQgRGVmaW5lSW1wbGljaXREZWZhdWx0Q29uc3RydWN0b3IoU291cmNlTG9jYXRpb24gQ3VycmVudExvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWENvbnN0cnVjdG9yRGVjbCAqQ29uc3RydWN0b3IpOworCisgIC8vLyBcYnJpZWYgRGVjbGFyZSB0aGUgaW1wbGljaXQgZGVzdHJ1Y3RvciBmb3IgdGhlIGdpdmVuIGNsYXNzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDbGFzc0RlY2wgVGhlIGNsYXNzIGRlY2xhcmF0aW9uIGludG8gd2hpY2ggdGhlIGltcGxpY2l0CisgIC8vLyBkZXN0cnVjdG9yIHdpbGwgYmUgYWRkZWQuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIGltcGxpY2l0bHktZGVjbGFyZWQgZGVzdHJ1Y3Rvci4KKyAgQ1hYRGVzdHJ1Y3RvckRlY2wgKkRlY2xhcmVJbXBsaWNpdERlc3RydWN0b3IoQ1hYUmVjb3JkRGVjbCAqQ2xhc3NEZWNsKTsKKworICAvLy8gRGVmaW5lSW1wbGljaXREZXN0cnVjdG9yIC0gQ2hlY2tzIGZvciBmZWFzaWJpbGl0eSBvZgorICAvLy8gZGVmaW5pbmcgdGhpcyBkZXN0cnVjdG9yIGFzIHRoZSBkZWZhdWx0IGRlc3RydWN0b3IuCisgIHZvaWQgRGVmaW5lSW1wbGljaXREZXN0cnVjdG9yKFNvdXJjZUxvY2F0aW9uIEN1cnJlbnRMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYRGVzdHJ1Y3RvckRlY2wgKkRlc3RydWN0b3IpOworCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZXhjZXB0aW9uIHNwZWMgZm9yIGRlc3RydWN0b3JzIHRoYXQgZG9uJ3QgaGF2ZSBvbmUuCisgIC8vLworICAvLy8gQysrMTEgc2F5cyB0aGF0IHVzZXItZGVmaW5lZCBkZXN0cnVjdG9ycyB3aXRoIG5vIGV4Y2VwdGlvbiBzcGVjIGdldCBvbmUKKyAgLy8vIHRoYXQgbG9va3MgYXMgaWYgdGhlIGRlc3RydWN0b3Igd2FzIGltcGxpY2l0bHkgZGVjbGFyZWQuCisgIHZvaWQgQWRqdXN0RGVzdHJ1Y3RvckV4Y2VwdGlvblNwZWMoQ1hYUmVjb3JkRGVjbCAqQ2xhc3NEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWERlc3RydWN0b3JEZWNsICpEZXN0cnVjdG9yKTsKKworICAvLy8gXGJyaWVmIERlZmluZSB0aGUgc3BlY2lmaWVkIGluaGVyaXRpbmcgY29uc3RydWN0b3IuCisgIHZvaWQgRGVmaW5lSW5oZXJpdGluZ0NvbnN0cnVjdG9yKFNvdXJjZUxvY2F0aW9uIFVzZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ29uc3RydWN0b3JEZWNsICpDb25zdHJ1Y3Rvcik7CisKKyAgLy8vIFxicmllZiBEZWNsYXJlIHRoZSBpbXBsaWNpdCBjb3B5IGNvbnN0cnVjdG9yIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCisgIC8vLworICAvLy8gXHBhcmFtIENsYXNzRGVjbCBUaGUgY2xhc3MgZGVjbGFyYXRpb24gaW50byB3aGljaCB0aGUgaW1wbGljaXQKKyAgLy8vIGNvcHkgY29uc3RydWN0b3Igd2lsbCBiZSBhZGRlZC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBUaGUgaW1wbGljaXRseS1kZWNsYXJlZCBjb3B5IGNvbnN0cnVjdG9yLgorICBDWFhDb25zdHJ1Y3RvckRlY2wgKkRlY2xhcmVJbXBsaWNpdENvcHlDb25zdHJ1Y3RvcihDWFhSZWNvcmREZWNsICpDbGFzc0RlY2wpOworCisgIC8vLyBEZWZpbmVJbXBsaWNpdENvcHlDb25zdHJ1Y3RvciAtIENoZWNrcyBmb3IgZmVhc2liaWxpdHkgb2YKKyAgLy8vIGRlZmluaW5nIHRoaXMgY29uc3RydWN0b3IgYXMgdGhlIGNvcHkgY29uc3RydWN0b3IuCisgIHZvaWQgRGVmaW5lSW1wbGljaXRDb3B5Q29uc3RydWN0b3IoU291cmNlTG9jYXRpb24gQ3VycmVudExvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWENvbnN0cnVjdG9yRGVjbCAqQ29uc3RydWN0b3IpOworCisgIC8vLyBcYnJpZWYgRGVjbGFyZSB0aGUgaW1wbGljaXQgbW92ZSBjb25zdHJ1Y3RvciBmb3IgdGhlIGdpdmVuIGNsYXNzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDbGFzc0RlY2wgVGhlIENsYXNzIGRlY2xhcmF0aW9uIGludG8gd2hpY2ggdGhlIGltcGxpY2l0CisgIC8vLyBtb3ZlIGNvbnN0cnVjdG9yIHdpbGwgYmUgYWRkZWQuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIGltcGxpY2l0bHktZGVjbGFyZWQgbW92ZSBjb25zdHJ1Y3Rvciwgb3IgTlVMTCBpZiBpdCB3YXNuJ3QKKyAgLy8vIGRlY2xhcmVkLgorICBDWFhDb25zdHJ1Y3RvckRlY2wgKkRlY2xhcmVJbXBsaWNpdE1vdmVDb25zdHJ1Y3RvcihDWFhSZWNvcmREZWNsICpDbGFzc0RlY2wpOworCisgIC8vLyBEZWZpbmVJbXBsaWNpdE1vdmVDb25zdHJ1Y3RvciAtIENoZWNrcyBmb3IgZmVhc2liaWxpdHkgb2YKKyAgLy8vIGRlZmluaW5nIHRoaXMgY29uc3RydWN0b3IgYXMgdGhlIG1vdmUgY29uc3RydWN0b3IuCisgIHZvaWQgRGVmaW5lSW1wbGljaXRNb3ZlQ29uc3RydWN0b3IoU291cmNlTG9jYXRpb24gQ3VycmVudExvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWENvbnN0cnVjdG9yRGVjbCAqQ29uc3RydWN0b3IpOworCisgIC8vLyBcYnJpZWYgRGVjbGFyZSB0aGUgaW1wbGljaXQgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCisgIC8vLworICAvLy8gXHBhcmFtIENsYXNzRGVjbCBUaGUgY2xhc3MgZGVjbGFyYXRpb24gaW50byB3aGljaCB0aGUgaW1wbGljaXQKKyAgLy8vIGNvcHkgYXNzaWdubWVudCBvcGVyYXRvciB3aWxsIGJlIGFkZGVkLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSBpbXBsaWNpdGx5LWRlY2xhcmVkIGNvcHkgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgQ1hYTWV0aG9kRGVjbCAqRGVjbGFyZUltcGxpY2l0Q29weUFzc2lnbm1lbnQoQ1hYUmVjb3JkRGVjbCAqQ2xhc3NEZWNsKTsKKworICAvLy8gXGJyaWVmIERlZmluZXMgYW4gaW1wbGljaXRseS1kZWNsYXJlZCBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIHZvaWQgRGVmaW5lSW1wbGljaXRDb3B5QXNzaWdubWVudChTb3VyY2VMb2NhdGlvbiBDdXJyZW50TG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhNZXRob2REZWNsICpNZXRob2REZWNsKTsKKworICAvLy8gXGJyaWVmIERlY2xhcmUgdGhlIGltcGxpY2l0IG1vdmUgYXNzaWdubWVudCBvcGVyYXRvciBmb3IgdGhlIGdpdmVuIGNsYXNzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDbGFzc0RlY2wgVGhlIENsYXNzIGRlY2xhcmF0aW9uIGludG8gd2hpY2ggdGhlIGltcGxpY2l0CisgIC8vLyBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3Igd2lsbCBiZSBhZGRlZC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBUaGUgaW1wbGljaXRseS1kZWNsYXJlZCBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IsIG9yIE5VTEwgaWYgaXQKKyAgLy8vIHdhc24ndCBkZWNsYXJlZC4KKyAgQ1hYTWV0aG9kRGVjbCAqRGVjbGFyZUltcGxpY2l0TW92ZUFzc2lnbm1lbnQoQ1hYUmVjb3JkRGVjbCAqQ2xhc3NEZWNsKTsKKworICAvLy8gXGJyaWVmIERlZmluZXMgYW4gaW1wbGljaXRseS1kZWNsYXJlZCBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIHZvaWQgRGVmaW5lSW1wbGljaXRNb3ZlQXNzaWdubWVudChTb3VyY2VMb2NhdGlvbiBDdXJyZW50TG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhNZXRob2REZWNsICpNZXRob2REZWNsKTsKKworICAvLy8gXGJyaWVmIEZvcmNlIHRoZSBkZWNsYXJhdGlvbiBvZiBhbnkgaW1wbGljaXRseS1kZWNsYXJlZCBtZW1iZXJzIG9mIHRoaXMKKyAgLy8vIGNsYXNzLgorICB2b2lkIEZvcmNlRGVjbGFyYXRpb25PZkltcGxpY2l0TWVtYmVycyhDWFhSZWNvcmREZWNsICpDbGFzcyk7CisKKyAgLy8vIFxicmllZiBDaGVjayBhIGNvbXBsZXRlZCBkZWNsYXJhdGlvbiBvZiBhbiBpbXBsaWNpdCBzcGVjaWFsIG1lbWJlci4KKyAgdm9pZCBDaGVja0ltcGxpY2l0U3BlY2lhbE1lbWJlckRlY2xhcmF0aW9uKFNjb3BlICpTLCBGdW5jdGlvbkRlY2wgKkZEKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBhbiBpbXBsaWNpdGx5LWRlbGV0ZWQKKyAgLy8vIHNwZWNpYWwgbWVtYmVyIGZ1bmN0aW9uLgorICBib29sIGlzSW1wbGljaXRseURlbGV0ZWQoRnVuY3Rpb25EZWNsICpGRCk7CisKKyAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyICd0aGlzJyBzaG93cyB1cCBpbiB0aGUgdHlwZSBvZiBhIHN0YXRpYyBtZW1iZXIKKyAgLy8vIGZ1bmN0aW9uIGFmdGVyIHRoZSAobmF0dXJhbGx5IGVtcHR5KSBjdi1xdWFsaWZpZXItc2VxIHdvdWxkIGJlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgIGJvb2wgY2hlY2tUaGlzSW5TdGF0aWNNZW1iZXJGdW5jdGlvblR5cGUoQ1hYTWV0aG9kRGVjbCAqTWV0aG9kKTsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcycgc2hvd3MgdXAgaW4gdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIG9mIGEgc3RhdGljCisgIC8vLyBtZW1iZXIgZnVuY3Rpb24uCisgIGJvb2wgY2hlY2tUaGlzSW5TdGF0aWNNZW1iZXJGdW5jdGlvbkV4Y2VwdGlvblNwZWMoQ1hYTWV0aG9kRGVjbCAqTWV0aG9kKTsKKworICAvLy8gXGJyaWVmIENoZWNrIHdoZXRoZXIgJ3RoaXMnIHNob3dzIHVwIGluIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBnaXZlbgorICAvLy8gc3RhdGljIG1lbWJlciBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICBib29sIGNoZWNrVGhpc0luU3RhdGljTWVtYmVyRnVuY3Rpb25BdHRyaWJ1dGVzKENYWE1ldGhvZERlY2wgKk1ldGhvZCk7CisKKyAgLy8vIE1heWJlQmluZFRvVGVtcG9yYXJ5IC0gSWYgdGhlIHBhc3NlZCBpbiBleHByZXNzaW9uIGhhcyBhIHJlY29yZCB0eXBlIHdpdGgKKyAgLy8vIGEgbm9uLXRyaXZpYWwgZGVzdHJ1Y3RvciwgdGhpcyB3aWxsIHJldHVybiBDWFhCaW5kVGVtcG9yYXJ5RXhwci4gT3RoZXJ3aXNlCisgIC8vLyBpdCBzaW1wbHkgcmV0dXJucyB0aGUgcGFzc2VkIGluIGV4cHJlc3Npb24uCisgIEV4cHJSZXN1bHQgTWF5YmVCaW5kVG9UZW1wb3JhcnkoRXhwciAqRSk7CisKKyAgYm9vbCBDb21wbGV0ZUNvbnN0cnVjdG9yQ2FsbChDWFhDb25zdHJ1Y3RvckRlY2wgKkNvbnN0cnVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpRXhwckFyZyBBcmdzUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8RXhwcio+ICZDb252ZXJ0ZWRBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dFeHBsaWNpdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNMaXN0SW5pdGlhbGl6YXRpb24gPSBmYWxzZSk7CisKKyAgUGFyc2VkVHlwZSBnZXRJbmhlcml0aW5nQ29uc3RydWN0b3JOYW1lKENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gJk5hbWUpOworCisgIFBhcnNlZFR5cGUgZ2V0RGVzdHJ1Y3Rvck5hbWUoU291cmNlTG9jYXRpb24gVGlsZGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gJklJLCBTb3VyY2VMb2NhdGlvbiBOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlICpTLCBDWFhTY29wZVNwZWMgJlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgT2JqZWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEVudGVyaW5nQ29udGV4dCk7CisKKyAgUGFyc2VkVHlwZSBnZXREZXN0cnVjdG9yVHlwZUZvckRlY2x0eXBlKGNvbnN0IERlY2xTcGVjICZEUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgT2JqZWN0VHlwZSk7CisKKyAgLy8gQ2hlY2tzIHRoYXQgcmVpbnRlcnByZXQgY2FzdHMgZG9uJ3QgaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3IuCisgIHZvaWQgQ2hlY2tDb21wYXRpYmxlUmVpbnRlcnByZXRDYXN0KFF1YWxUeXBlIFNyY1R5cGUsIFF1YWxUeXBlIERlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRGVyZWZlcmVuY2UsIFNvdXJjZVJhbmdlIFJhbmdlKTsKKworICAvLy8gQWN0T25DWFhOYW1lZENhc3QgLSBQYXJzZSB7ZHluYW1pYyxzdGF0aWMscmVpbnRlcnByZXQsY29uc3R9X2Nhc3Qncy4KKyAgRXhwclJlc3VsdCBBY3RPbkNYWE5hbWVkQ2FzdChTb3VyY2VMb2NhdGlvbiBPcExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6OlRva2VuS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExBbmdsZUJyYWNrZXRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRvciAmRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSQW5nbGVCcmFja2V0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYyk7CisKKyAgRXhwclJlc3VsdCBCdWlsZENYWE5hbWVkQ2FzdChTb3VyY2VMb2NhdGlvbiBPcExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6OlRva2VuS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEFuZ2xlQnJhY2tldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgUGFyZW5zKTsKKworICBFeHByUmVzdWx0IEJ1aWxkQ1hYVHlwZUlkKFF1YWxUeXBlIFR5cGVJbmZvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUeXBlaWRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKk9wZXJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKTsKKyAgRXhwclJlc3VsdCBCdWlsZENYWFR5cGVJZChRdWFsVHlwZSBUeXBlSW5mb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVHlwZWlkTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKk9wZXJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKTsKKworICAvLy8gQWN0T25DWFhUeXBlaWQgLSBQYXJzZSB0eXBlaWQoIHNvbWV0aGluZyApLgorICBFeHByUmVzdWx0IEFjdE9uQ1hYVHlwZWlkKFNvdXJjZUxvY2F0aW9uIE9wTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywgYm9vbCBpc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqVHlPckV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKTsKKworICBFeHByUmVzdWx0IEJ1aWxkQ1hYVXVpZG9mKFF1YWxUeXBlIFR5cGVJbmZvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUeXBlaWRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKk9wZXJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKTsKKyAgRXhwclJlc3VsdCBCdWlsZENYWFV1aWRvZihRdWFsVHlwZSBUeXBlSW5mb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVHlwZWlkTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKk9wZXJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKTsKKworICAvLy8gQWN0T25DWFhVdWlkb2YgLSBQYXJzZSBfX3V1aWRvZiggc29tZXRoaW5nICkuCisgIEV4cHJSZXN1bHQgQWN0T25DWFhVdWlkb2YoU291cmNlTG9jYXRpb24gT3BMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLCBib29sIGlzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpUeU9yRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MpOworCisgIC8vLyBcYnJpZWYgSGFuZGxlIGEgQysrMXogZm9sZC1leHByZXNzaW9uOiAoIGV4cHIgb3AgLi4uIG9wIGV4cHIgKS4KKyAgRXhwclJlc3VsdCBBY3RPbkNYWEZvbGRFeHByKFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywgRXhwciAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rOjpUb2tlbktpbmQgT3BlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYywgRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKTsKKyAgRXhwclJlc3VsdCBCdWlsZENYWEZvbGRFeHByKFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywgRXhwciAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3JLaW5kIE9wZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MsIEV4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYyk7CisgIEV4cHJSZXN1bHQgQnVpbGRFbXB0eUNYWEZvbGRFeHByKFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvcktpbmQgT3BlcmF0b3IpOworCisgIC8vLy8gQWN0T25DWFhUaGlzIC0gIFBhcnNlICd0aGlzJyBwb2ludGVyLgorICBFeHByUmVzdWx0IEFjdE9uQ1hYVGhpcyhTb3VyY2VMb2NhdGlvbiBsb2MpOworCisgIC8vLyBcYnJpZWYgVHJ5IHRvIHJldHJpZXZlIHRoZSB0eXBlIG9mIHRoZSAndGhpcycgcG9pbnRlci4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBUaGUgdHlwZSBvZiAndGhpcycsIGlmIHBvc3NpYmxlLiBPdGhlcndpc2UsIHJldHVybnMgYSBOVUxMIHR5cGUuCisgIFF1YWxUeXBlIGdldEN1cnJlbnRUaGlzVHlwZSgpOworCisgIC8vLyBcYnJpZWYgV2hlbiBub24tTlVMTCwgdGhlIEMrKyAndGhpcycgZXhwcmVzc2lvbiBpcyBhbGxvd2VkIGRlc3BpdGUgdGhlCisgIC8vLyBjdXJyZW50IGNvbnRleHQgbm90IGJlaW5nIGEgbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb24uIEluIHN1Y2ggY2FzZXMsCisgIC8vLyB0aGlzIHByb3ZpZGVzIHRoZSB0eXBlIHVzZWQgZm9yICd0aGlzJy4KKyAgUXVhbFR5cGUgQ1hYVGhpc1R5cGVPdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFJBSUkgb2JqZWN0IHVzZWQgdG8gdGVtcG9yYXJpbHkgYWxsb3cgdGhlIEMrKyAndGhpcycgZXhwcmVzc2lvbgorICAvLy8gdG8gYmUgdXNlZCwgd2l0aCB0aGUgZ2l2ZW4gcXVhbGlmaWVycyBvbiB0aGUgY3VycmVudCBjbGFzcyB0eXBlLgorICBjbGFzcyBDWFhUaGlzU2NvcGVSQUlJIHsKKyAgICBTZW1hICZTOworICAgIFF1YWxUeXBlIE9sZENYWFRoaXNUeXBlT3ZlcnJpZGU7CisgICAgYm9vbCBFbmFibGVkOworCisgIHB1YmxpYzoKKyAgICAvLy8gXGJyaWVmIEludHJvZHVjZSBhIG5ldyBzY29wZSB3aGVyZSAndGhpcycgbWF5IGJlIGFsbG93ZWQgKHdoZW4gZW5hYmxlZCksCisgICAgLy8vIHVzaW5nIHRoZSBnaXZlbiBkZWNsYXJhdGlvbiAod2hpY2ggaXMgZWl0aGVyIGEgY2xhc3MgdGVtcGxhdGUgb3IgYQorICAgIC8vLyBjbGFzcykgYWxvbmcgd2l0aCB0aGUgZ2l2ZW4gcXVhbGlmaWVycy4KKyAgICAvLy8gYWxvbmcgd2l0aCB0aGUgcXVhbGlmaWVycyBwbGFjZWQgb24gJyp0aGlzJy4KKyAgICBDWFhUaGlzU2NvcGVSQUlJKFNlbWEgJlMsIERlY2wgKkNvbnRleHREZWNsLCB1bnNpZ25lZCBDWFhUaGlzVHlwZVF1YWxzLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbmFibGVkID0gdHJ1ZSk7CisKKyAgICB+Q1hYVGhpc1Njb3BlUkFJSSgpOworICB9OworCisgIC8vLyBcYnJpZWYgTWFrZSBzdXJlIHRoZSB2YWx1ZSBvZiAndGhpcycgaXMgYWN0dWFsbHkgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50CisgIC8vLyBjb250ZXh0LCBpZiBpdCBpcyBhIHBvdGVudGlhbGx5IGV2YWx1YXRlZCBjb250ZXh0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBMb2MgVGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRoZSBjYXB0dXJlIG9mICd0aGlzJyBvY2N1cnMuCisgIC8vLworICAvLy8gXHBhcmFtIEV4cGxpY2l0IFdoZXRoZXIgJ3RoaXMnIGlzIGV4cGxpY2l0bHkgY2FwdHVyZWQgaW4gYSBsYW1iZGEKKyAgLy8vIGNhcHR1cmUgbGlzdC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRnVuY3Rpb25TY29wZUluZGV4VG9TdG9wQXQgSWYgbm9uLW51bGwsIGl0IHBvaW50cyB0byB0aGUgaW5kZXgKKyAgLy8vIG9mIHRoZSBGdW5jdGlvblNjb3BlSW5mbyBzdGFjayBiZXlvbmQgd2hpY2ggd2UgZG8gbm90IGF0dGVtcHQgdG8gY2FwdHVyZS4KKyAgLy8vIFRoaXMgaXMgdXNlZnVsIHdoZW4gZW5jbG9zaW5nIGxhbWJkYXMgbXVzdCBzcGVjdWxhdGl2ZWx5IGNhcHR1cmUKKyAgLy8vICd0aGlzJyB0aGF0IG1heSBvciBtYXkgbm90IGJlIHVzZWQgaW4gY2VydGFpbiBzcGVjaWFsaXphdGlvbnMgb2YKKyAgLy8vIGEgbmVzdGVkIGdlbmVyaWMgbGFtYmRhIChkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbmFtZSByZXNvbHZlcyB0bworICAvLy8gYSBub24tc3RhdGljIG1lbWJlciBmdW5jdGlvbiBvciBhIHN0YXRpYyBmdW5jdGlvbikuCisgIC8vLyBccmV0dXJuIHJldHVybnMgJ3RydWUnIGlmIGZhaWxlZCwgJ2ZhbHNlJyBpZiBzdWNjZXNzLgorICBib29sIENoZWNrQ1hYVGhpc0NhcHR1cmUoU291cmNlTG9jYXRpb24gTG9jLCBib29sIEV4cGxpY2l0ID0gZmFsc2UsCisgICAgICBib29sIEJ1aWxkQW5kRGlhZ25vc2UgPSB0cnVlLAorICAgICAgY29uc3QgdW5zaWduZWQgKmNvbnN0IEZ1bmN0aW9uU2NvcGVJbmRleFRvU3RvcEF0ID0gbnVsbHB0ciwKKyAgICAgIGJvb2wgQnlDb3B5ID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgaXMgdGhlIHR5cGUgb2YgKnRoaXMgdGhhdCBpcyB1c2VkCisgIC8vLyBvdXRzaWRlIG9mIHRoZSBib2R5IG9mIGEgbWVtYmVyIGZ1bmN0aW9uIGZvciBhIHR5cGUgdGhhdCBpcyBjdXJyZW50bHkKKyAgLy8vIGJlaW5nIGRlZmluZWQuCisgIGJvb2wgaXNUaGlzT3V0c2lkZU1lbWJlckZ1bmN0aW9uQm9keShRdWFsVHlwZSBCYXNlVHlwZSk7CisKKyAgLy8vIEFjdE9uQ1hYQm9vbExpdGVyYWwgLSBQYXJzZSB7dHJ1ZSxmYWxzZX0gbGl0ZXJhbHMuCisgIEV4cHJSZXN1bHQgQWN0T25DWFhCb29sTGl0ZXJhbChTb3VyY2VMb2NhdGlvbiBPcExvYywgdG9rOjpUb2tlbktpbmQgS2luZCk7CisKKworICAvLy8gQWN0T25PYmpDQm9vbExpdGVyYWwgLSBQYXJzZSB7X19vYmpjX3llcyxfX29iamNfbm99IGxpdGVyYWxzLgorICBFeHByUmVzdWx0IEFjdE9uT2JqQ0Jvb2xMaXRlcmFsKFNvdXJjZUxvY2F0aW9uIE9wTG9jLCB0b2s6OlRva2VuS2luZCBLaW5kKTsKKworICBFeHByUmVzdWx0CisgIEFjdE9uT2JqQ0F2YWlsYWJpbGl0eUNoZWNrRXhwcihsbHZtOjpBcnJheVJlZjxBdmFpbGFiaWxpdHlTcGVjPiBBdmFpbFNwZWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXRMb2MsIFNvdXJjZUxvY2F0aW9uIFJQYXJlbik7CisKKyAgLy8vIEFjdE9uQ1hYTnVsbFB0ckxpdGVyYWwgLSBQYXJzZSAnbnVsbHB0cicuCisgIEV4cHJSZXN1bHQgQWN0T25DWFhOdWxsUHRyTGl0ZXJhbChTb3VyY2VMb2NhdGlvbiBMb2MpOworCisgIC8vLy8gQWN0T25DWFhUaHJvdyAtICBQYXJzZSB0aHJvdyBleHByZXNzaW9ucy4KKyAgRXhwclJlc3VsdCBBY3RPbkNYWFRocm93KFNjb3BlICpTLCBTb3VyY2VMb2NhdGlvbiBPcExvYywgRXhwciAqZXhwcik7CisgIEV4cHJSZXN1bHQgQnVpbGRDWFhUaHJvdyhTb3VyY2VMb2NhdGlvbiBPcExvYywgRXhwciAqRXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzVGhyb3duVmFySW5TY29wZSk7CisgIGJvb2wgQ2hlY2tDWFhUaHJvd09wZXJhbmQoU291cmNlTG9jYXRpb24gVGhyb3dMb2MsIFF1YWxUeXBlIFRocm93VHksIEV4cHIgKkUpOworCisgIC8vLyBBY3RPbkNYWFR5cGVDb25zdHJ1Y3RFeHByIC0gUGFyc2UgY29uc3RydWN0aW9uIG9mIGEgc3BlY2lmaWVkIHR5cGUuCisgIC8vLyBDYW4gYmUgaW50ZXJwcmV0ZWQgZWl0aGVyIGFzIGZ1bmN0aW9uLXN0eWxlIGNhc3RpbmcgKCJpbnQoeCkiKQorICAvLy8gb3IgY2xhc3MgdHlwZSBjb25zdHJ1Y3Rpb24gKCJDbGFzc1R5cGUoeCx5LHopIikKKyAgLy8vIG9yIGNyZWF0aW9uIG9mIGEgdmFsdWUtaW5pdGlhbGl6ZWQgdHlwZSAoImludCgpIikuCisgIEV4cHJSZXN1bHQgQWN0T25DWFhUeXBlQ29uc3RydWN0RXhwcihQYXJzZWRUeXBlIFR5cGVSZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5PckJyYWNlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlFeHByQXJnIEV4cHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuT3JCcmFjZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTGlzdEluaXRpYWxpemF0aW9uKTsKKworICBFeHByUmVzdWx0IEJ1aWxkQ1hYVHlwZUNvbnN0cnVjdEV4cHIoVHlwZVNvdXJjZUluZm8gKlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aUV4cHJBcmcgRXhwcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIExpc3RJbml0aWFsaXphdGlvbik7CisKKyAgLy8vIEFjdE9uQ1hYTmV3IC0gUGFyc2VkIGEgQysrICduZXcnIGV4cHJlc3Npb24uCisgIEV4cHJSZXN1bHQgQWN0T25DWFhOZXcoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIGJvb2wgVXNlR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFBsYWNlbWVudExQYXJlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aUV4cHJBcmcgUGxhY2VtZW50QXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQbGFjZW1lbnRSUGFyZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgVHlwZUlkUGFyZW5zLCBEZWNsYXJhdG9yICZELAorICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkluaXRpYWxpemVyKTsKKyAgRXhwclJlc3VsdCBCdWlsZENYWE5ldyhTb3VyY2VSYW5nZSBSYW5nZSwgYm9vbCBVc2VHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUGxhY2VtZW50TFBhcmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpRXhwckFyZyBQbGFjZW1lbnRBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFBsYWNlbWVudFJQYXJlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBUeXBlSWRQYXJlbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgQWxsb2NUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpBbGxvY1R5cGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkFycmF5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBEaXJlY3RJbml0UmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqSW5pdGlhbGl6ZXIpOworCisgIGJvb2wgQ2hlY2tBbGxvY2F0ZWRUeXBlKFF1YWxUeXBlIEFsbG9jVHlwZSwgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSKTsKKyAgYm9vbCBGaW5kQWxsb2NhdGlvbkZ1bmN0aW9ucyhTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlUmFuZ2UgUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVc2VHbG9iYWwsIFF1YWxUeXBlIEFsbG9jVHlwZSwgYm9vbCBJc0FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJlBhc3NBbGlnbm1lbnQsIE11bHRpRXhwckFyZyBQbGFjZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25EZWNsIComT3BlcmF0b3JOZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25EZWNsIComT3BlcmF0b3JEZWxldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEaWFnbm9zZSA9IHRydWUpOworICB2b2lkIERlY2xhcmVHbG9iYWxOZXdEZWxldGUoKTsKKyAgdm9pZCBEZWNsYXJlR2xvYmFsQWxsb2NhdGlvbkZ1bmN0aW9uKERlY2xhcmF0aW9uTmFtZSBOYW1lLCBRdWFsVHlwZSBSZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxRdWFsVHlwZT4gUGFyYW1zKTsKKworICBib29sIEZpbmREZWFsbG9jYXRpb25GdW5jdGlvbihTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgQ1hYUmVjb3JkRGVjbCAqUkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBOYW1lLCBGdW5jdGlvbkRlY2wqICZPcGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEaWFnbm9zZSA9IHRydWUpOworICBGdW5jdGlvbkRlY2wgKkZpbmRVc3VhbERlYWxsb2NhdGlvbkZ1bmN0aW9uKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ2FuUHJvdmlkZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPdmVyYWxpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbk5hbWUgTmFtZSk7CisgIEZ1bmN0aW9uRGVjbCAqRmluZERlYWxsb2NhdGlvbkZ1bmN0aW9uRm9yRGVzdHJ1Y3RvcihTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFJlY29yZERlY2wgKlJEKTsKKworICAvLy8gQWN0T25DWFhEZWxldGUgLSBQYXJzZWQgYSBDKysgJ2RlbGV0ZScgZXhwcmVzc2lvbgorICBFeHByUmVzdWx0IEFjdE9uQ1hYRGVsZXRlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVXNlR2xvYmFsLCBib29sIEFycmF5Rm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpPcGVyYW5kKTsKKyAgdm9pZCBDaGVja1ZpcnR1YWxEdG9yQ2FsbChDWFhEZXN0cnVjdG9yRGVjbCAqZHRvciwgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNEZWxldGUsIGJvb2wgQ2FsbENhbkJlVmlydHVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFdhcm5Pbk5vbkFic3RyYWN0VHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRHRvckxvYyk7CisKKyAgRXhwclJlc3VsdCBBY3RPbk5vZXhjZXB0RXhwcihTb3VyY2VMb2NhdGlvbiBLZXlMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpPcGVyYW5kLCBTb3VyY2VMb2NhdGlvbiBSUGFyZW4pOworICBFeHByUmVzdWx0IEJ1aWxkQ1hYTm9leGNlcHRFeHByKFNvdXJjZUxvY2F0aW9uIEtleUxvYywgRXhwciAqT3BlcmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW4pOworCisgIC8vLyBcYnJpZWYgUGFyc2VkIG9uZSBvZiB0aGUgdHlwZSB0cmFpdCBzdXBwb3J0IHBzZXVkby1mdW5jdGlvbnMuCisgIEV4cHJSZXN1bHQgQWN0T25UeXBlVHJhaXQoVHlwZVRyYWl0IEtpbmQsIFNvdXJjZUxvY2F0aW9uIEtXTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlZFR5cGU+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKTsKKyAgRXhwclJlc3VsdCBCdWlsZFR5cGVUcmFpdChUeXBlVHJhaXQgS2luZCwgU291cmNlTG9jYXRpb24gS1dMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZVNvdXJjZUluZm8gKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MpOworCisgIC8vLyBBY3RPbkFycmF5VHlwZVRyYWl0IC0gUGFyc2VkIG9uZSBvZiB0aGUgYmluYXJ5IHR5cGUgdHJhaXQgc3VwcG9ydAorICAvLy8gcHNldWRvLWZ1bmN0aW9ucy4KKyAgRXhwclJlc3VsdCBBY3RPbkFycmF5VHlwZVRyYWl0KEFycmF5VHlwZVRyYWl0IEFUVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEtXTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSBMaHNUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkRpbUV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW4pOworCisgIEV4cHJSZXN1bHQgQnVpbGRBcnJheVR5cGVUcmFpdChBcnJheVR5cGVUcmFpdCBBVFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBLV0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUU0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpEaW1FeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuKTsKKworICAvLy8gQWN0T25FeHByZXNzaW9uVHJhaXQgLSBQYXJzZWQgb25lIG9mIHRoZSB1bmFyeSB0eXBlIHRyYWl0IHN1cHBvcnQKKyAgLy8vIHBzZXVkby1mdW5jdGlvbnMuCisgIEV4cHJSZXN1bHQgQWN0T25FeHByZXNzaW9uVHJhaXQoRXhwcmVzc2lvblRyYWl0IE9FVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBLV0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpRdWVyaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbik7CisKKyAgRXhwclJlc3VsdCBCdWlsZEV4cHJlc3Npb25UcmFpdChFeHByZXNzaW9uVHJhaXQgT0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEtXTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKlF1ZXJpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuKTsKKworICBFeHByUmVzdWx0IEFjdE9uU3RhcnRDWFhNZW1iZXJSZWZlcmVuY2UoU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gT3BMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6OlRva2VuS2luZCBPcEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRUeXBlICZPYmplY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmTWF5QmVQc2V1ZG9EZXN0cnVjdG9yKTsKKworICBFeHByUmVzdWx0IEJ1aWxkUHNldWRvRGVzdHJ1Y3RvckV4cHIoRXhwciAqQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE9wTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rOjpUb2tlbktpbmQgT3BLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpTY29wZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDQ0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRpbGRlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb0Rlc3RydWN0b3JUeXBlU3RvcmFnZSBEZXN0cm95ZWRUeXBlKTsKKworICBFeHByUmVzdWx0IEFjdE9uUHNldWRvRGVzdHJ1Y3RvckV4cHIoU2NvcGUgKlMsIEV4cHIgKkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBPcExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6VG9rZW5LaW5kIE9wS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnF1YWxpZmllZElkICZGaXJzdFR5cGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQ0NMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUaWxkZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucXVhbGlmaWVkSWQgJlNlY29uZFR5cGVOYW1lKTsKKworICBFeHByUmVzdWx0IEFjdE9uUHNldWRvRGVzdHJ1Y3RvckV4cHIoU2NvcGUgKlMsIEV4cHIgKkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBPcExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6VG9rZW5LaW5kIE9wS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRpbGRlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbFNwZWMmIERTKTsKKworICAvLy8gTWF5YmVDcmVhdGVFeHByV2l0aENsZWFudXBzIC0gSWYgdGhlIGN1cnJlbnQgZnVsbC1leHByZXNzaW9uCisgIC8vLyByZXF1aXJlcyBhbnkgY2xlYW51cHMsIHN1cnJvdW5kIGl0IHdpdGggYSBFeHByV2l0aENsZWFudXBzIG5vZGUuCisgIC8vLyBPdGhlcndpc2UsIGp1c3QgcmV0dXJucyB0aGUgcGFzc2VkLWluIGV4cHJlc3Npb24uCisgIEV4cHIgKk1heWJlQ3JlYXRlRXhwcldpdGhDbGVhbnVwcyhFeHByICpTdWJFeHByKTsKKyAgU3RtdCAqTWF5YmVDcmVhdGVTdG10V2l0aENsZWFudXBzKFN0bXQgKlN1YlN0bXQpOworICBFeHByUmVzdWx0IE1heWJlQ3JlYXRlRXhwcldpdGhDbGVhbnVwcyhFeHByUmVzdWx0IFN1YkV4cHIpOworCisgIE1hdGVyaWFsaXplVGVtcG9yYXJ5RXhwciAqCisgIENyZWF0ZU1hdGVyaWFsaXplVGVtcG9yYXJ5RXhwcihRdWFsVHlwZSBULCBFeHByICpUZW1wb3JhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEJvdW5kVG9MdmFsdWVSZWZlcmVuY2UpOworCisgIEV4cHJSZXN1bHQgQWN0T25GaW5pc2hGdWxsRXhwcihFeHByICpFeHByKSB7CisgICAgcmV0dXJuIEFjdE9uRmluaXNoRnVsbEV4cHIoRXhwciwgRXhwciA/IEV4cHItPmdldEV4cHJMb2MoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTb3VyY2VMb2NhdGlvbigpKTsKKyAgfQorICBFeHByUmVzdWx0IEFjdE9uRmluaXNoRnVsbEV4cHIoRXhwciAqRXhwciwgU291cmNlTG9jYXRpb24gQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpc2NhcmRlZFZhbHVlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQ29uc3RleHByID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzTGFtYmRhSW5pdENhcHR1cmVJbml0aWFsaXplciA9IGZhbHNlKTsKKyAgU3RtdFJlc3VsdCBBY3RPbkZpbmlzaEZ1bGxTdG10KFN0bXQgKlN0bXQpOworCisgIC8vIE1hcmtzIFNTIGludmFsaWQgaWYgaXQgcmVwcmVzZW50cyBhbiBpbmNvbXBsZXRlIHR5cGUuCisgIGJvb2wgUmVxdWlyZUNvbXBsZXRlRGVjbENvbnRleHQoQ1hYU2NvcGVTcGVjICZTUywgRGVjbENvbnRleHQgKkRDKTsKKworICBEZWNsQ29udGV4dCAqY29tcHV0ZURlY2xDb250ZXh0KFF1YWxUeXBlIFQpOworICBEZWNsQ29udGV4dCAqY29tcHV0ZURlY2xDb250ZXh0KGNvbnN0IENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbnRlcmluZ0NvbnRleHQgPSBmYWxzZSk7CisgIGJvb2wgaXNEZXBlbmRlbnRTY29wZVNwZWNpZmllcihjb25zdCBDWFhTY29wZVNwZWMgJlNTKTsKKyAgQ1hYUmVjb3JkRGVjbCAqZ2V0Q3VycmVudEluc3RhbnRpYXRpb25PZihOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlMpOworCisgIC8vLyBcYnJpZWYgVGhlIHBhcnNlciBoYXMgcGFyc2VkIGEgZ2xvYmFsIG5lc3RlZC1uYW1lLXNwZWNpZmllciAnOjonLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDQ0xvYyBUaGUgbG9jYXRpb24gb2YgdGhlICc6OicuCisgIC8vLworICAvLy8gXHBhcmFtIFNTIFRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIsIHdoaWNoIHdpbGwgYmUgdXBkYXRlZCBpbi1wbGFjZQorICAvLy8gdG8gcmVmbGVjdCB0aGUgcGFyc2VkIG5lc3RlZC1uYW1lLXNwZWNpZmllci4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgQWN0T25DWFhHbG9iYWxTY29wZVNwZWNpZmllcihTb3VyY2VMb2NhdGlvbiBDQ0xvYywgQ1hYU2NvcGVTcGVjICZTUyk7CisKKyAgLy8vIFxicmllZiBUaGUgcGFyc2VyIGhhcyBwYXJzZWQgYSAnX19zdXBlcicgbmVzdGVkLW5hbWUtc3BlY2lmaWVyLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdXBlckxvYyBUaGUgbG9jYXRpb24gb2YgdGhlICdfX3N1cGVyJyBrZXl3b3JkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb2xvbkNvbG9uTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgJzo6Jy4KKyAgLy8vCisgIC8vLyBccGFyYW0gU1MgVGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciwgd2hpY2ggd2lsbCBiZSB1cGRhdGVkIGluLXBsYWNlCisgIC8vLyB0byByZWZsZWN0IHRoZSBwYXJzZWQgbmVzdGVkLW5hbWUtc3BlY2lmaWVyLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBBY3RPblN1cGVyU2NvcGVTcGVjaWZpZXIoU291cmNlTG9jYXRpb24gU3VwZXJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENvbG9uQ29sb25Mb2MsIENYWFNjb3BlU3BlYyAmU1MpOworCisgIGJvb2wgaXNBY2NlcHRhYmxlTmVzdGVkTmFtZVNwZWNpZmllcihjb25zdCBOYW1lZERlY2wgKlNELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqQ2FuQ29ycmVjdCA9IG51bGxwdHIpOworICBOYW1lZERlY2wgKkZpbmRGaXJzdFF1YWxpZmllckluU2NvcGUoU2NvcGUgKlMsIE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUyk7CisKKyAgLy8vIFxicmllZiBLZWVwcyBpbmZvcm1hdGlvbiBhYm91dCBhbiBpZGVudGlmaWVyIGluIGEgbmVzdGVkLW5hbWUtc3BlYy4KKyAgLy8vCisgIHN0cnVjdCBOZXN0ZWROYW1lU3BlY0luZm8geworICAgIC8vLyBcYnJpZWYgVGhlIHR5cGUgb2YgdGhlIG9iamVjdCwgaWYgd2UncmUgcGFyc2luZyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgaW4KKyAgICAvLy8gYSBtZW1iZXIgYWNjZXNzIGV4cHJlc3Npb24uCisgICAgUGFyc2VkVHlwZSBPYmplY3RUeXBlOworCisgICAgLy8vIFxicmllZiBUaGUgaWRlbnRpZmllciBwcmVjZWRpbmcgdGhlICc6OicuCisgICAgSWRlbnRpZmllckluZm8gKklkZW50aWZpZXI7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgaWRlbnRpZmllci4KKyAgICBTb3VyY2VMb2NhdGlvbiBJZGVudGlmaWVyTG9jOworCisgICAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlICc6OicuCisgICAgU291cmNlTG9jYXRpb24gQ0NMb2M7CisKKyAgICAvLy8gXGJyaWVmIENyZWF0ZXMgaW5mbyBvYmplY3QgZm9yIHRoZSBtb3N0IHR5cGljYWwgY2FzZS4KKyAgICBOZXN0ZWROYW1lU3BlY0luZm8oSWRlbnRpZmllckluZm8gKklJLCBTb3VyY2VMb2NhdGlvbiBJZExvYywKKyAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkNvbG9uTG9jLCBQYXJzZWRUeXBlIE9iamVjdFR5cGUgPSBQYXJzZWRUeXBlKCkpCisgICAgICA6IE9iamVjdFR5cGUoT2JqZWN0VHlwZSksIElkZW50aWZpZXIoSUkpLCBJZGVudGlmaWVyTG9jKElkTG9jKSwKKyAgICAgICAgQ0NMb2MoQ29sb25Db2xvbkxvYykgeworICAgIH0KKworICAgIE5lc3RlZE5hbWVTcGVjSW5mbyhJZGVudGlmaWVySW5mbyAqSUksIFNvdXJjZUxvY2F0aW9uIElkTG9jLAorICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkNvbG9uTG9jLCBRdWFsVHlwZSBPYmplY3RUeXBlKQorICAgICAgOiBPYmplY3RUeXBlKFBhcnNlZFR5cGU6Om1ha2UoT2JqZWN0VHlwZSkpLCBJZGVudGlmaWVyKElJKSwKKyAgICAgICAgSWRlbnRpZmllckxvYyhJZExvYyksIENDTG9jKENvbG9uQ29sb25Mb2MpIHsKKyAgICB9CisgIH07CisKKyAgYm9vbCBpc05vblR5cGVOZXN0ZWROYW1lU3BlY2lmaWVyKFNjb3BlICpTLCBDWFhTY29wZVNwZWMgJlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNJbmZvICZJZEluZm8pOworCisgIGJvb2wgQnVpbGRDWFhOZXN0ZWROYW1lU3BlY2lmaWVyKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY0luZm8gJklkSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbnRlcmluZ0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkRGVjbCAqU2NvcGVMb29rdXBSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXJyb3JSZWNvdmVyeUxvb2t1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqSXNDb3JyZWN0ZWRUb0NvbG9uID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPbmx5TmFtZXNwYWNlID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgVGhlIHBhcnNlciBoYXMgcGFyc2VkIGEgbmVzdGVkLW5hbWUtc3BlY2lmaWVyICdpZGVudGlmaWVyOjonLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTIFRoZSBzY29wZSBpbiB3aGljaCB0aGlzIG5lc3RlZC1uYW1lLXNwZWNpZmllciBvY2N1cnMuCisgIC8vLworICAvLy8gXHBhcmFtIElkSW5mbyBQYXJzZXIgaW5mb3JtYXRpb24gYWJvdXQgYW4gaWRlbnRpZmllciBpbiB0aGUKKyAgLy8vIG5lc3RlZC1uYW1lLXNwZWMuCisgIC8vLworICAvLy8gXHBhcmFtIEVudGVyaW5nQ29udGV4dCBXaGV0aGVyIHdlJ3JlIGVudGVyaW5nIHRoZSBjb250ZXh0IG5vbWluYXRlZCBieQorICAvLy8gdGhpcyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIuCisgIC8vLworICAvLy8gXHBhcmFtIFNTIFRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIsIHdoaWNoIGlzIGJvdGggYW4gaW5wdXQKKyAgLy8vIHBhcmFtZXRlciAodGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciBiZWZvcmUgdGhpcyB0eXBlKSBhbmQgYW4KKyAgLy8vIG91dHB1dCBwYXJhbWV0ZXIgKGNvbnRhaW5pbmcgdGhlIGZ1bGwgbmVzdGVkLW5hbWUtc3BlY2lmaWVyLAorICAvLy8gaW5jbHVkaW5nIHRoaXMgbmV3IHR5cGUpLgorICAvLy8KKyAgLy8vIFxwYXJhbSBFcnJvclJlY292ZXJ5TG9va3VwIElmIHRydWUsIHRoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGltcHJvdmUKKyAgLy8vIGVycm9yIHJlY292ZXJ5LiBJbiB0aGlzIGNhc2UgZG8gbm90IGVtaXQgZXJyb3IgbWVzc2FnZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gSXNDb3JyZWN0ZWRUb0NvbG9uIElmIG5vdCBudWxsLCBzdWdnZXN0aW9ucyB0byByZXBsYWNlICc6OicgLT4gJzonCisgIC8vLyBhcmUgYWxsb3dlZC4gIFRoZSBib29sIHZhbHVlIHBvaW50ZWQgYnkgdGhpcyBwYXJhbWV0ZXIgaXMgc2V0IHRvICd0cnVlJworICAvLy8gaWYgdGhlIGlkZW50aWZpZXIgaXMgdHJlYXRlZCBhcyBpZiBpdCB3YXMgZm9sbG93ZWQgYnkgJzonLCBub3QgJzo6Jy4KKyAgLy8vCisgIC8vLyBccGFyYW0gT25seU5hbWVzcGFjZSBJZiB0cnVlLCBvbmx5IGNvbnNpZGVycyBuYW1lc3BhY2VzIGluIGxvb2t1cC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgQWN0T25DWFhOZXN0ZWROYW1lU3BlY2lmaWVyKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY0luZm8gJklkSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbnRlcmluZ0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXJyb3JSZWNvdmVyeUxvb2t1cCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpJc0NvcnJlY3RlZFRvQ29sb24gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9ubHlOYW1lc3BhY2UgPSBmYWxzZSk7CisKKyAgRXhwclJlc3VsdCBBY3RPbkRlY2x0eXBlRXhwcmVzc2lvbihFeHByICpFKTsKKworICBib29sIEFjdE9uQ1hYTmVzdGVkTmFtZVNwZWNpZmllckRlY2x0eXBlKENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbFNwZWMgJkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENvbG9uQ29sb25Mb2MpOworCisgIGJvb2wgSXNJbnZhbGlkVW5sZXNzTmVzdGVkTmFtZShTY29wZSAqUywgQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjSW5mbyAmSWRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbnRlcmluZ0NvbnRleHQpOworCisgIC8vLyBcYnJpZWYgVGhlIHBhcnNlciBoYXMgcGFyc2VkIGEgbmVzdGVkLW5hbWUtc3BlY2lmaWVyCisgIC8vLyAndGVtcGxhdGVbb3B0XSB0ZW1wbGF0ZS1uYW1lIDwgdGVtcGxhdGUtYXJncyA+OjonLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTIFRoZSBzY29wZSBpbiB3aGljaCB0aGlzIG5lc3RlZC1uYW1lLXNwZWNpZmllciBvY2N1cnMuCisgIC8vLworICAvLy8gXHBhcmFtIFNTIFRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIsIHdoaWNoIGlzIGJvdGggYW4gaW5wdXQKKyAgLy8vIHBhcmFtZXRlciAodGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciBiZWZvcmUgdGhpcyB0eXBlKSBhbmQgYW4KKyAgLy8vIG91dHB1dCBwYXJhbWV0ZXIgKGNvbnRhaW5pbmcgdGhlIGZ1bGwgbmVzdGVkLW5hbWUtc3BlY2lmaWVyLAorICAvLy8gaW5jbHVkaW5nIHRoaXMgbmV3IHR5cGUpLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUZW1wbGF0ZUtXTG9jIHRoZSBsb2NhdGlvbiBvZiB0aGUgJ3RlbXBsYXRlJyBrZXl3b3JkLCBpZiBhbnkuCisgIC8vLyBccGFyYW0gVGVtcGxhdGVOYW1lIHRoZSB0ZW1wbGF0ZSBuYW1lLgorICAvLy8gXHBhcmFtIFRlbXBsYXRlTmFtZUxvYyBUaGUgbG9jYXRpb24gb2YgdGhlIHRlbXBsYXRlIG5hbWUuCisgIC8vLyBccGFyYW0gTEFuZ2xlTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgb3BlbmluZyBhbmdsZSBicmFja2V0ICAoJzwnKS4KKyAgLy8vIFxwYXJhbSBUZW1wbGF0ZUFyZ3MgVGhlIHRlbXBsYXRlIGFyZ3VtZW50cy4KKyAgLy8vIFxwYXJhbSBSQW5nbGVMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBjbG9zaW5nIGFuZ2xlIGJyYWNrZXQgICgnPicpLgorICAvLy8gXHBhcmFtIENDTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgJzo6Jy4KKyAgLy8vCisgIC8vLyBccGFyYW0gRW50ZXJpbmdDb250ZXh0IFdoZXRoZXIgd2UncmUgZW50ZXJpbmcgdGhlIGNvbnRleHQgb2YgdGhlCisgIC8vLyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIuCisgIC8vLworICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBBY3RPbkNYWE5lc3RlZE5hbWVTcGVjaWZpZXIoU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlS1dMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlVHkgVGVtcGxhdGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZU5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExBbmdsZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUVGVtcGxhdGVBcmdzUHRyIFRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUkFuZ2xlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDQ0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbnRlcmluZ0NvbnRleHQpOworCisgIC8vLyBcYnJpZWYgR2l2ZW4gYSBDKysgbmVzdGVkLW5hbWUtc3BlY2lmaWVyLCBwcm9kdWNlIGFuIGFubm90YXRpb24gdmFsdWUKKyAgLy8vIHRoYXQgdGhlIHBhcnNlciBjYW4gdXNlIGxhdGVyIHRvIHJlY29uc3RydWN0IHRoZSBnaXZlbgorICAvLy8gbmVzdGVkLW5hbWUtc3BlY2lmaWVyLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTUyBBIG5lc3RlZC1uYW1lLXNwZWNpZmllci4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBBIHBvaW50ZXIgY29udGFpbmluZyBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIGluIHRoZQorICAvLy8gbmVzdGVkLW5hbWUtc3BlY2lmaWVyIFxwIFNTLgorICB2b2lkICpTYXZlTmVzdGVkTmFtZVNwZWNpZmllckFubm90YXRpb24oQ1hYU2NvcGVTcGVjICZTUyk7CisKKyAgLy8vIFxicmllZiBHaXZlbiBhbiBhbm5vdGF0aW9uIHBvaW50ZXIgZm9yIGEgbmVzdGVkLW5hbWUtc3BlY2lmaWVyLCByZXN0b3JlCisgIC8vLyB0aGUgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHN0cnVjdHVyZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbiBwb2ludGVyLCBwcm9kdWNlZCBieQorICAvLy8gXGMgU2F2ZU5lc3RlZE5hbWVTcGVjaWZpZXJBbm5vdGF0aW9uKCkuCisgIC8vLworICAvLy8gXHBhcmFtIEFubm90YXRpb25SYW5nZSBUaGUgc291cmNlIHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFubm90YXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFNTIFRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgdGhhdCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgY29udGVudHMKKyAgLy8vIG9mIHRoZSBhbm5vdGF0aW9uIHBvaW50ZXIuCisgIHZvaWQgUmVzdG9yZU5lc3RlZE5hbWVTcGVjaWZpZXJBbm5vdGF0aW9uKHZvaWQgKkFubm90YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEFubm90YXRpb25SYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYU2NvcGVTcGVjICZTUyk7CisKKyAgYm9vbCBTaG91bGRFbnRlckRlY2xhcmF0b3JTY29wZShTY29wZSAqUywgY29uc3QgQ1hYU2NvcGVTcGVjICZTUyk7CisKKyAgLy8vIEFjdE9uQ1hYRW50ZXJEZWNsYXJhdG9yU2NvcGUgLSBDYWxsZWQgd2hlbiBhIEMrKyBzY29wZSBzcGVjaWZpZXIgKGdsb2JhbAorICAvLy8gc2NvcGUgb3IgbmVzdGVkLW5hbWUtc3BlY2lmaWVyKSBpcyBwYXJzZWQsIHBhcnQgb2YgYSBkZWNsYXJhdG9yLWlkLgorICAvLy8gQWZ0ZXIgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBhY2NvcmRpbmcgdG8gW0MrKyAzLjQuM3AzXSwgbmFtZXMgc2hvdWxkIGJlCisgIC8vLyBsb29rZWQgdXAgaW4gdGhlIGRlY2xhcmF0b3ItaWQncyBzY29wZSwgdW50aWwgdGhlIGRlY2xhcmF0b3IgaXMgcGFyc2VkIGFuZAorICAvLy8gQWN0T25DWFhFeGl0RGVjbGFyYXRvclNjb3BlIGlzIGNhbGxlZC4KKyAgLy8vIFRoZSAnU1MnIHNob3VsZCBiZSBhIG5vbi1lbXB0eSB2YWxpZCBDWFhTY29wZVNwZWMuCisgIGJvb2wgQWN0T25DWFhFbnRlckRlY2xhcmF0b3JTY29wZShTY29wZSAqUywgQ1hYU2NvcGVTcGVjICZTUyk7CisKKyAgLy8vIEFjdE9uQ1hYRXhpdERlY2xhcmF0b3JTY29wZSAtIENhbGxlZCB3aGVuIGEgZGVjbGFyYXRvciB0aGF0IHByZXZpb3VzbHkKKyAgLy8vIGludm9rZWQgQWN0T25DWFhFbnRlckRlY2xhcmF0b3JTY29wZSgpLCBpcyBmaW5pc2hlZC4gJ1NTJyBpcyB0aGUgc2FtZQorICAvLy8gQ1hYU2NvcGVTcGVjIHRoYXQgd2FzIHBhc3NlZCB0byBBY3RPbkNYWEVudGVyRGVjbGFyYXRvclNjb3BlIGFzIHdlbGwuCisgIC8vLyBVc2VkIHRvIGluZGljYXRlIHRoYXQgbmFtZXMgc2hvdWxkIHJldmVydCB0byBiZWluZyBsb29rZWQgdXAgaW4gdGhlCisgIC8vLyBkZWZpbmluZyBzY29wZS4KKyAgdm9pZCBBY3RPbkNYWEV4aXREZWNsYXJhdG9yU2NvcGUoU2NvcGUgKlMsIGNvbnN0IENYWFNjb3BlU3BlYyAmU1MpOworCisgIC8vLyBBY3RPbkNYWEVudGVyRGVjbEluaXRpYWxpemVyIC0gSW52b2tlZCB3aGVuIHdlIGFyZSBhYm91dCB0byBwYXJzZSBhbgorICAvLy8gaW5pdGlhbGl6ZXIgZm9yIHRoZSBkZWNsYXJhdGlvbiAnRGNsJy4KKyAgLy8vIEFmdGVyIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgYWNjb3JkaW5nIHRvIFtDKysgMy40LjFwMTNdLCBpZiAnRGNsJyBpcyBhCisgIC8vLyBzdGF0aWMgZGF0YSBtZW1iZXIgb2YgY2xhc3MgWCwgbmFtZXMgc2hvdWxkIGJlIGxvb2tlZCB1cCBpbiB0aGUgc2NvcGUgb2YKKyAgLy8vIGNsYXNzIFguCisgIHZvaWQgQWN0T25DWFhFbnRlckRlY2xJbml0aWFsaXplcihTY29wZSAqUywgRGVjbCAqRGNsKTsKKworICAvLy8gQWN0T25DWFhFeGl0RGVjbEluaXRpYWxpemVyIC0gSW52b2tlZCBhZnRlciB3ZSBhcmUgZmluaXNoZWQgcGFyc2luZyBhbgorICAvLy8gaW5pdGlhbGl6ZXIgZm9yIHRoZSBkZWNsYXJhdGlvbiAnRGNsJy4KKyAgdm9pZCBBY3RPbkNYWEV4aXREZWNsSW5pdGlhbGl6ZXIoU2NvcGUgKlMsIERlY2wgKkRjbCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBuZXcgbGFtYmRhIGNsb3N1cmUgdHlwZS4KKyAgQ1hYUmVjb3JkRGVjbCAqY3JlYXRlTGFtYmRhQ2xvc3VyZVR5cGUoU291cmNlUmFuZ2UgSW50cm9kdWNlclJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLbm93bkRlcGVuZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFtYmRhQ2FwdHVyZURlZmF1bHQgQ2FwdHVyZURlZmF1bHQpOworCisgIC8vLyBcYnJpZWYgU3RhcnQgdGhlIGRlZmluaXRpb24gb2YgYSBsYW1iZGEgZXhwcmVzc2lvbi4KKyAgQ1hYTWV0aG9kRGVjbCAqc3RhcnRMYW1iZGFEZWZpbml0aW9uKENYWFJlY29yZERlY2wgKkNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgSW50cm9kdWNlclJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKk1ldGhvZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQYXJtVmFyRGVjbCAqPiBQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQ29uc3RleHByU3BlY2lmaWVkKTsKKworICAvLy8gXGJyaWVmIEVuZG93IHRoZSBsYW1iZGEgc2NvcGUgaW5mbyB3aXRoIHRoZSByZWxldmFudCBwcm9wZXJ0aWVzLgorICB2b2lkIGJ1aWxkTGFtYmRhU2NvcGUoc2VtYTo6TGFtYmRhU2NvcGVJbmZvICpMU0ksCisgICAgICAgICAgICAgICAgICAgICAgICBDWFhNZXRob2REZWNsICpDYWxsT3BlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBJbnRyb2R1Y2VyUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBMYW1iZGFDYXB0dXJlRGVmYXVsdCBDYXB0dXJlRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENhcHR1cmVEZWZhdWx0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHBsaWNpdFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhwbGljaXRSZXN1bHRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNdXRhYmxlKTsKKworICAvLy8gXGJyaWVmIFBlcmZvcm0gaW5pdGlhbGl6YXRpb24gYW5hbHlzaXMgb2YgdGhlIGluaXQtY2FwdHVyZSBhbmQgcGVyZm9ybQorICAvLy8gYW55IGltcGxpY2l0IGNvbnZlcnNpb25zIHN1Y2ggYXMgYW4gbHZhbHVlLXRvLXJ2YWx1ZSBjb252ZXJzaW9uIGlmCisgIC8vLyBub3QgYmVpbmcgdXNlZCB0byBpbml0aWFsaXplIGEgcmVmZXJlbmNlLgorICBQYXJzZWRUeXBlIGFjdE9uTGFtYmRhSW5pdENhcHR1cmVJbml0aWFsaXphdGlvbigKKyAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywgYm9vbCBCeVJlZiwgSWRlbnRpZmllckluZm8gKklkLAorICAgICAgTGFtYmRhQ2FwdHVyZUluaXRLaW5kIEluaXRLaW5kLCBFeHByIComSW5pdCkgeworICAgIHJldHVybiBQYXJzZWRUeXBlOjptYWtlKGJ1aWxkTGFtYmRhSW5pdENhcHR1cmVJbml0aWFsaXphdGlvbigKKyAgICAgICAgTG9jLCBCeVJlZiwgSWQsIEluaXRLaW5kICE9IExhbWJkYUNhcHR1cmVJbml0S2luZDo6Q29weUluaXQsIEluaXQpKTsKKyAgfQorICBRdWFsVHlwZSBidWlsZExhbWJkYUluaXRDYXB0dXJlSW5pdGlhbGl6YXRpb24oU291cmNlTG9jYXRpb24gTG9jLCBib29sIEJ5UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEaXJlY3RJbml0LCBFeHByIComSW5pdCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBkdW1teSB2YXJpYWJsZSB3aXRoaW4gdGhlIGRlY2xjb250ZXh0IG9mIHRoZSBsYW1iZGEncworICAvLy8gIGNhbGwgb3BlcmF0b3IsIGZvciBuYW1lIGxvb2t1cCBwdXJwb3NlcyBmb3IgYSBsYW1iZGEgaW5pdCBjYXB0dXJlLgorICAvLy8KKyAgLy8vICBDb2RlR2VuIGhhbmRsZXMgZW1pc3Npb24gb2YgbGFtYmRhIGNhcHR1cmVzLCBpZ25vcmluZyB0aGVzZSBkdW1teQorICAvLy8gIHZhcmlhYmxlcyBhcHByb3ByaWF0ZWx5LgorICBWYXJEZWNsICpjcmVhdGVMYW1iZGFJbml0Q2FwdHVyZVZhckRlY2woU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgSW5pdENhcHR1cmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5pdFN0eWxlLCBFeHByICpJbml0KTsKKworICAvLy8gXGJyaWVmIEJ1aWxkIHRoZSBpbXBsaWNpdCBmaWVsZCBmb3IgYW4gaW5pdC1jYXB0dXJlLgorICBGaWVsZERlY2wgKmJ1aWxkSW5pdENhcHR1cmVGaWVsZChzZW1hOjpMYW1iZGFTY29wZUluZm8gKkxTSSwgVmFyRGVjbCAqVmFyKTsKKworICAvLy8gXGJyaWVmIE5vdGUgdGhhdCB3ZSBoYXZlIGZpbmlzaGVkIHRoZSBleHBsaWNpdCBjYXB0dXJlcyBmb3IgdGhlCisgIC8vLyBnaXZlbiBsYW1iZGEuCisgIHZvaWQgZmluaXNoTGFtYmRhRXhwbGljaXRDYXB0dXJlcyhzZW1hOjpMYW1iZGFTY29wZUluZm8gKkxTSSk7CisKKyAgLy8vIFxicmllZiBJbnRyb2R1Y2UgdGhlIGxhbWJkYSBwYXJhbWV0ZXJzIGludG8gc2NvcGUuCisgIHZvaWQgYWRkTGFtYmRhUGFyYW1ldGVycyhDWFhNZXRob2REZWNsICpDYWxsT3BlcmF0b3IsIFNjb3BlICpDdXJTY29wZSk7CisKKyAgLy8vIFxicmllZiBEZWR1Y2UgYSBibG9jayBvciBsYW1iZGEncyByZXR1cm4gdHlwZSBiYXNlZCBvbiB0aGUgcmV0dXJuCisgIC8vLyBzdGF0ZW1lbnRzIHByZXNlbnQgaW4gdGhlIGJvZHkuCisgIHZvaWQgZGVkdWNlQ2xvc3VyZVJldHVyblR5cGUoc2VtYTo6Q2FwdHVyaW5nU2NvcGVJbmZvICZDU0kpOworCisgIC8vLyBBY3RPblN0YXJ0T2ZMYW1iZGFEZWZpbml0aW9uIC0gVGhpcyBpcyBjYWxsZWQganVzdCBiZWZvcmUgd2Ugc3RhcnQKKyAgLy8vIHBhcnNpbmcgdGhlIGJvZHkgb2YgYSBsYW1iZGE7IGl0IGFuYWx5emVzIHRoZSBleHBsaWNpdCBjYXB0dXJlcyBhbmQKKyAgLy8vIGFyZ3VtZW50cywgYW5kIHNldHMgdXAgdmFyaW91cyBkYXRhLXN0cnVjdHVyZXMgZm9yIHRoZSBib2R5IG9mIHRoZQorICAvLy8gbGFtYmRhLgorICB2b2lkIEFjdE9uU3RhcnRPZkxhbWJkYURlZmluaXRpb24oTGFtYmRhSW50cm9kdWNlciAmSW50cm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdG9yICZQYXJhbUluZm8sIFNjb3BlICpDdXJTY29wZSk7CisKKyAgLy8vIEFjdE9uTGFtYmRhRXJyb3IgLSBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIGEgbGFtYmRhLCB0aGlzIGNhbGxiYWNrCisgIC8vLyBpcyBpbnZva2VkIHRvIHBvcCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhbWJkYS4KKyAgdm9pZCBBY3RPbkxhbWJkYUVycm9yKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTY29wZSAqQ3VyU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzSW5zdGFudGlhdGlvbiA9IGZhbHNlKTsKKworICAvLy8gQWN0T25MYW1iZGFFeHByIC0gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgYm9keSBvZiBhIGxhbWJkYSBleHByZXNzaW9uCisgIC8vLyB3YXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4KKyAgRXhwclJlc3VsdCBBY3RPbkxhbWJkYUV4cHIoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFN0bXQgKkJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlICpDdXJTY29wZSk7CisKKyAgLy8vIFxicmllZiBEb2VzIGNvcHlpbmcvZGVzdHJveWluZyB0aGUgY2FwdHVyZWQgdmFyaWFibGUgaGF2ZSBzaWRlIGVmZmVjdHM/CisgIGJvb2wgQ2FwdHVyZUhhc1NpZGVFZmZlY3RzKGNvbnN0IHNlbWE6OkNhcHR1cmUgJkZyb20pOworCisgIC8vLyBcYnJpZWYgRGlhZ25vc2UgaWYgYW4gZXhwbGljaXQgbGFtYmRhIGNhcHR1cmUgaXMgdW51c2VkLgorICB2b2lkIERpYWdub3NlVW51c2VkTGFtYmRhQ2FwdHVyZShjb25zdCBzZW1hOjpDYXB0dXJlICZGcm9tKTsKKworICAvLy8gXGJyaWVmIENvbXBsZXRlIGEgbGFtYmRhLWV4cHJlc3Npb24gaGF2aW5nIHByb2Nlc3NlZCBhbmQgYXR0YWNoZWQgdGhlCisgIC8vLyBsYW1iZGEgYm9keS4KKyAgRXhwclJlc3VsdCBCdWlsZExhbWJkYUV4cHIoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYTo6TGFtYmRhU2NvcGVJbmZvICpMU0kpOworCisgIC8vLyBHZXQgdGhlIHJldHVybiB0eXBlIHRvIHVzZSBmb3IgYSBsYW1iZGEncyBjb252ZXJzaW9uIGZ1bmN0aW9uKHMpIHRvCisgIC8vLyBmdW5jdGlvbiBwb2ludGVyIHR5cGUsIGdpdmVuIHRoZSB0eXBlIG9mIHRoZSBjYWxsIG9wZXJhdG9yLgorICBRdWFsVHlwZQorICBnZXRMYW1iZGFDb252ZXJzaW9uRnVuY3Rpb25SZXN1bHRUeXBlKGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpDYWxsT3BUeXBlKTsKKworICAvLy8gXGJyaWVmIERlZmluZSB0aGUgImJvZHkiIG9mIHRoZSBjb252ZXJzaW9uIGZyb20gYSBsYW1iZGEgb2JqZWN0IHRvIGEKKyAgLy8vIGZ1bmN0aW9uIHBvaW50ZXIuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIGRvZXNuJ3QgYWN0dWFsbHkgZGVmaW5lIGEgc2Vuc2libGUgYm9keTsgcmF0aGVyLCBpdCBmaWxscworICAvLy8gaW4gdGhlIGluaXRpYWxpemF0aW9uIGV4cHJlc3Npb24gbmVlZGVkIHRvIGNvcHkgdGhlIGxhbWJkYSBvYmplY3QgaW50bworICAvLy8gdGhlIGJsb2NrLCBhbmQgSVIgZ2VuZXJhdGlvbiBhY3R1YWxseSBnZW5lcmF0ZXMgdGhlIHJlYWwgYm9keSBvZiB0aGUKKyAgLy8vIGJsb2NrIHBvaW50ZXIgY29udmVyc2lvbi4KKyAgdm9pZCBEZWZpbmVJbXBsaWNpdExhbWJkYVRvRnVuY3Rpb25Qb2ludGVyQ29udmVyc2lvbigKKyAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEN1cnJlbnRMb2MsIENYWENvbnZlcnNpb25EZWNsICpDb252KTsKKworICAvLy8gXGJyaWVmIERlZmluZSB0aGUgImJvZHkiIG9mIHRoZSBjb252ZXJzaW9uIGZyb20gYSBsYW1iZGEgb2JqZWN0IHRvIGEKKyAgLy8vIGJsb2NrIHBvaW50ZXIuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIGRvZXNuJ3QgYWN0dWFsbHkgZGVmaW5lIGEgc2Vuc2libGUgYm9keTsgcmF0aGVyLCBpdCBmaWxscworICAvLy8gaW4gdGhlIGluaXRpYWxpemF0aW9uIGV4cHJlc3Npb24gbmVlZGVkIHRvIGNvcHkgdGhlIGxhbWJkYSBvYmplY3QgaW50bworICAvLy8gdGhlIGJsb2NrLCBhbmQgSVIgZ2VuZXJhdGlvbiBhY3R1YWxseSBnZW5lcmF0ZXMgdGhlIHJlYWwgYm9keSBvZiB0aGUKKyAgLy8vIGJsb2NrIHBvaW50ZXIgY29udmVyc2lvbi4KKyAgdm9pZCBEZWZpbmVJbXBsaWNpdExhbWJkYVRvQmxvY2tQb2ludGVyQ29udmVyc2lvbihTb3VyY2VMb2NhdGlvbiBDdXJyZW50TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWENvbnZlcnNpb25EZWNsICpDb252KTsKKworICBFeHByUmVzdWx0IEJ1aWxkQmxvY2tGb3JMYW1iZGFDb252ZXJzaW9uKFNvdXJjZUxvY2F0aW9uIEN1cnJlbnRMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb252TG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ29udmVyc2lvbkRlY2wgKkNvbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqU3JjKTsKKworICAvLyBQYXJzZU9iakNTdHJpbmdMaXRlcmFsIC0gUGFyc2UgT2JqZWN0aXZlLUMgc3RyaW5nIGxpdGVyYWxzLgorICBFeHByUmVzdWx0IFBhcnNlT2JqQ1N0cmluZ0xpdGVyYWwoU291cmNlTG9jYXRpb24gKkF0TG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gU3RyaW5ncyk7CisKKyAgRXhwclJlc3VsdCBCdWlsZE9iakNTdHJpbmdMaXRlcmFsKFNvdXJjZUxvY2F0aW9uIEF0TG9jLCBTdHJpbmdMaXRlcmFsICpTKTsKKworICAvLy8gQnVpbGRPYmpDTnVtZXJpY0xpdGVyYWwgLSBidWlsZHMgYW4gT2JqQ0JveGVkRXhwciBBU1Qgbm9kZSBmb3IgdGhlCisgIC8vLyBudW1lcmljIGxpdGVyYWwgZXhwcmVzc2lvbi4gVHlwZSBvZiB0aGUgZXhwcmVzc2lvbiB3aWxsIGJlICJOU051bWJlciAqIgorICAvLy8gb3IgImlkIiBpZiBOU051bWJlciBpcyB1bmF2YWlsYWJsZS4KKyAgRXhwclJlc3VsdCBCdWlsZE9iakNOdW1lcmljTGl0ZXJhbChTb3VyY2VMb2NhdGlvbiBBdExvYywgRXhwciAqTnVtYmVyKTsKKyAgRXhwclJlc3VsdCBBY3RPbk9iakNCb29sTGl0ZXJhbChTb3VyY2VMb2NhdGlvbiBBdExvYywgU291cmNlTG9jYXRpb24gVmFsdWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWYWx1ZSk7CisgIEV4cHJSZXN1bHQgQnVpbGRPYmpDQXJyYXlMaXRlcmFsKFNvdXJjZVJhbmdlIFNSLCBNdWx0aUV4cHJBcmcgRWxlbWVudHMpOworCisgIC8vLyBCdWlsZE9iakNCb3hlZEV4cHIgLSBidWlsZHMgYW4gT2JqQ0JveGVkRXhwciBBU1Qgbm9kZSBmb3IgdGhlCisgIC8vLyAnQCcgcHJlZml4ZWQgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLiBUaGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiB3aWxsCisgIC8vLyBlaXRoZXIgYmUgIk5TTnVtYmVyICoiLCAiTlNTdHJpbmcgKiIgb3IgIk5TVmFsdWUgKiIgZGVwZW5kaW5nIG9uIHRoZSB0eXBlCisgIC8vLyBvZiBWYWx1ZVR5cGUsIHdoaWNoIGlzIGFsbG93ZWQgdG8gYmUgYSBidWlsdC1pbiBudW1lcmljIHR5cGUsICJjaGFyICoiLAorICAvLy8gImNvbnN0IGNoYXIgKiIgb3IgQyBzdHJ1Y3R1cmUgd2l0aCBhdHRyaWJ1dGUgJ29iamNfYm94YWJsZScuCisgIEV4cHJSZXN1bHQgQnVpbGRPYmpDQm94ZWRFeHByKFNvdXJjZVJhbmdlIFNSLCBFeHByICpWYWx1ZUV4cHIpOworCisgIEV4cHJSZXN1bHQgQnVpbGRPYmpDU3Vic2NyaXB0RXhwcmVzc2lvbihTb3VyY2VMb2NhdGlvbiBSQiwgRXhwciAqQmFzZUV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpJbmRleEV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDTWV0aG9kRGVjbCAqZ2V0dGVyTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ01ldGhvZERlY2wgKnNldHRlck1ldGhvZCk7CisKKyAgRXhwclJlc3VsdCBCdWlsZE9iakNEaWN0aW9uYXJ5TGl0ZXJhbChTb3VyY2VSYW5nZSBTUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXRhYmxlQXJyYXlSZWY8T2JqQ0RpY3Rpb25hcnlFbGVtZW50PiBFbGVtZW50cyk7CisKKyAgRXhwclJlc3VsdCBCdWlsZE9iakNFbmNvZGVFeHByZXNzaW9uKFNvdXJjZUxvY2F0aW9uIEF0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpFbmNvZGVkVHlwZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKTsKKyAgRXhwclJlc3VsdCBCdWlsZENYWE1lbWJlckNhbGxFeHByKEV4cHIgKkV4cCwgTmFtZWREZWNsICpGb3VuZERlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhDb252ZXJzaW9uRGVjbCAqTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYWRNdWx0aXBsZUNhbmRpZGF0ZXMpOworCisgIEV4cHJSZXN1bHQgUGFyc2VPYmpDRW5jb2RlRXhwcmVzc2lvbihTb3VyY2VMb2NhdGlvbiBBdExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuY29kZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MpOworCisgIC8vLyBQYXJzZU9iakNTZWxlY3RvckV4cHJlc3Npb24gLSBCdWlsZCBzZWxlY3RvciBleHByZXNzaW9uIGZvciBcQHNlbGVjdG9yCisgIEV4cHJSZXN1bHQgUGFyc2VPYmpDU2VsZWN0b3JFeHByZXNzaW9uKFNlbGVjdG9yIFNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFNlbExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgV2Fybk11bHRpcGxlU2VsZWN0b3JzKTsKKworICAvLy8gUGFyc2VPYmpDUHJvdG9jb2xFeHByZXNzaW9uIC0gQnVpbGQgcHJvdG9jb2wgZXhwcmVzc2lvbiBmb3IgXEBwcm90b2NvbAorICBFeHByUmVzdWx0IFBhcnNlT2JqQ1Byb3RvY29sRXhwcmVzc2lvbihJZGVudGlmaWVySW5mbyAqIFByb3RvY29sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFByb3RvTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFByb3RvSWRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYyk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEMrKyBEZWNsYXJhdGlvbnMKKyAgLy8KKyAgRGVjbCAqQWN0T25TdGFydExpbmthZ2VTcGVjaWZpY2F0aW9uKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRXh0ZXJuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqTGFuZ1N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExCcmFjZUxvYyk7CisgIERlY2wgKkFjdE9uRmluaXNoTGlua2FnZVNwZWNpZmljYXRpb24oU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbCAqTGlua2FnZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUkJyYWNlTG9jKTsKKworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDKysgQ2xhc3NlcworICAvLworICBib29sIGlzQ3VycmVudENsYXNzTmFtZShjb25zdCBJZGVudGlmaWVySW5mbyAmSUksIFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhTY29wZVNwZWMgKlNTID0gbnVsbHB0cik7CisgIGJvb2wgaXNDdXJyZW50Q2xhc3NOYW1lVHlwbyhJZGVudGlmaWVySW5mbyAqJklJLCBjb25zdCBDWFhTY29wZVNwZWMgKlNTKTsKKworICBib29sIEFjdE9uQWNjZXNzU3BlY2lmaWVyKEFjY2Vzc1NwZWNpZmllciBBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQVNMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQ29sb25Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdCAqQXR0cnMgPSBudWxscHRyKTsKKworICBOYW1lZERlY2wgKkFjdE9uQ1hYTWVtYmVyRGVjbGFyYXRvcihTY29wZSAqUywgQWNjZXNzU3BlY2lmaWVyIEFTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRvciAmRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpVGVtcGxhdGVQYXJhbXNBcmcgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkJpdGZpZWxkV2lkdGgsIGNvbnN0IFZpcnRTcGVjaWZpZXJzICZWUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluQ2xhc3NJbml0U3R5bGUgSW5pdFN0eWxlKTsKKworICB2b2lkIEFjdE9uU3RhcnRDWFhJbkNsYXNzTWVtYmVySW5pdGlhbGl6ZXIoKTsKKyAgdm9pZCBBY3RPbkZpbmlzaENYWEluQ2xhc3NNZW1iZXJJbml0aWFsaXplcihEZWNsICpWYXJEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVxdWFsTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkluaXQpOworCisgIE1lbUluaXRSZXN1bHQgQWN0T25NZW1Jbml0aWFsaXplcihEZWNsICpDb25zdHJ1Y3RvckQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY29wZSAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqTWVtYmVyT3JCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSBUZW1wbGF0ZVR5cGVUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xTcGVjICZEUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MpOworCisgIE1lbUluaXRSZXN1bHQgQWN0T25NZW1Jbml0aWFsaXplcihEZWNsICpDb25zdHJ1Y3RvckQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY29wZSAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqTWVtYmVyT3JCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSBUZW1wbGF0ZVR5cGVUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xTcGVjICZEUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqSW5pdExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYyk7CisKKyAgTWVtSW5pdFJlc3VsdCBCdWlsZE1lbUluaXRpYWxpemVyKERlY2wgKkNvbnN0cnVjdG9yRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpNZW1iZXJPckJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRUeXBlIFRlbXBsYXRlVHlwZVR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbFNwZWMgJkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpJbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MpOworCisgIE1lbUluaXRSZXN1bHQgQnVpbGRNZW1iZXJJbml0aWFsaXplcihWYWx1ZURlY2wgKk1lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJZExvYyk7CisKKyAgTWVtSW5pdFJlc3VsdCBCdWlsZEJhc2VJbml0aWFsaXplcihRdWFsVHlwZSBCYXNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqQmFzZVRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYUmVjb3JkRGVjbCAqQ2xhc3NEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jKTsKKworICBNZW1Jbml0UmVzdWx0IEJ1aWxkRGVsZWdhdGluZ0luaXRpYWxpemVyKFR5cGVTb3VyY2VJbmZvICpUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpJbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFJlY29yZERlY2wgKkNsYXNzRGVjbCk7CisKKyAgYm9vbCBTZXREZWxlZ2F0aW5nSW5pdGlhbGl6ZXIoQ1hYQ29uc3RydWN0b3JEZWNsICpDb25zdHJ1Y3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ3RvckluaXRpYWxpemVyICpJbml0aWFsaXplcik7CisKKyAgYm9vbCBTZXRDdG9ySW5pdGlhbGl6ZXJzKENYWENvbnN0cnVjdG9yRGVjbCAqQ29uc3RydWN0b3IsIGJvb2wgQW55RXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q1hYQ3RvckluaXRpYWxpemVyICo+IEluaXRpYWxpemVycyA9IE5vbmUpOworCisgIHZvaWQgU2V0SXZhckluaXRpYWxpemVycyhPYmpDSW1wbGVtZW50YXRpb25EZWNsICpPYmpDSW1wbGVtZW50YXRpb24pOworCisKKyAgLy8vIE1hcmtCYXNlQW5kTWVtYmVyRGVzdHJ1Y3RvcnNSZWZlcmVuY2VkIC0gR2l2ZW4gYSByZWNvcmQgZGVjbCwKKyAgLy8vIG1hcmsgYWxsIHRoZSBub24tdHJpdmlhbCBkZXN0cnVjdG9ycyBvZiBpdHMgbWVtYmVycyBhbmQgYmFzZXMgYXMKKyAgLy8vIHJlZmVyZW5jZWQuCisgIHZvaWQgTWFya0Jhc2VBbmRNZW1iZXJEZXN0cnVjdG9yc1JlZmVyZW5jZWQoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFJlY29yZERlY2wgKlJlY29yZCk7CisKKyAgLy8vIFxicmllZiBUaGUgbGlzdCBvZiBjbGFzc2VzIHdob3NlIHZ0YWJsZXMgaGF2ZSBiZWVuIHVzZWQgd2l0aGluCisgIC8vLyB0aGlzIHRyYW5zbGF0aW9uIHVuaXQsIGFuZCB0aGUgc291cmNlIGxvY2F0aW9ucyBhdCB3aGljaCB0aGUKKyAgLy8vIGZpcnN0IHVzZSBvY2N1cnJlZC4KKyAgdHlwZWRlZiBzdGQ6OnBhaXI8Q1hYUmVjb3JkRGVjbCosIFNvdXJjZUxvY2F0aW9uPiBWVGFibGVVc2U7CisKKyAgLy8vIFxicmllZiBUaGUgbGlzdCBvZiB2dGFibGVzIHRoYXQgYXJlIHJlcXVpcmVkIGJ1dCBoYXZlIG5vdCB5ZXQgYmVlbgorICAvLy8gbWF0ZXJpYWxpemVkLgorICBTbWFsbFZlY3RvcjxWVGFibGVVc2UsIDE2PiBWVGFibGVVc2VzOworCisgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiBjbGFzc2VzIHdob3NlIHZ0YWJsZXMgaGF2ZSBiZWVuIHVzZWQgd2l0aGluCisgIC8vLyB0aGlzIHRyYW5zbGF0aW9uIHVuaXQsIGFuZCBhIGJpdCB0aGF0IHdpbGwgYmUgdHJ1ZSBpZiB0aGUgdnRhYmxlIGlzCisgIC8vLyByZXF1aXJlZCB0byBiZSBlbWl0dGVkIChvdGhlcndpc2UsIGl0IHNob3VsZCBiZSBlbWl0dGVkIG9ubHkgaWYgbmVlZGVkCisgIC8vLyBieSBjb2RlIGdlbmVyYXRpb24pLgorICBsbHZtOjpEZW5zZU1hcDxDWFhSZWNvcmREZWNsICosIGJvb2w+IFZUYWJsZXNVc2VkOworCisgIC8vLyBcYnJpZWYgTG9hZCBhbnkgZXh0ZXJuYWxseS1zdG9yZWQgdnRhYmxlIHVzZXMuCisgIHZvaWQgTG9hZEV4dGVybmFsVlRhYmxlVXNlcygpOworCisgIC8vLyBcYnJpZWYgTm90ZSB0aGF0IHRoZSB2dGFibGUgZm9yIHRoZSBnaXZlbiBjbGFzcyB3YXMgdXNlZCBhdCB0aGUKKyAgLy8vIGdpdmVuIGxvY2F0aW9uLgorICB2b2lkIE1hcmtWVGFibGVVc2VkKFNvdXJjZUxvY2F0aW9uIExvYywgQ1hYUmVjb3JkRGVjbCAqQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZWZpbml0aW9uUmVxdWlyZWQgPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBNYXJrIHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgb2YgYWxsIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9ucworICAvLy8gaW4gdGhlIGdpdmVuIGNsYXNzIGFzIG5lZWRlZC4KKyAgdm9pZCBNYXJrVmlydHVhbE1lbWJlckV4Y2VwdGlvblNwZWNzTmVlZGVkKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlJEKTsKKworICAvLy8gTWFya1ZpcnR1YWxNZW1iZXJzUmVmZXJlbmNlZCAtIFdpbGwgbWFyayBhbGwgbWVtYmVycyBvZiB0aGUgZ2l2ZW4KKyAgLy8vIENYWFJlY29yZERlY2wgcmVmZXJlbmNlZC4KKyAgdm9pZCBNYXJrVmlydHVhbE1lbWJlcnNSZWZlcmVuY2VkKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlJEKTsKKworICAvLy8gXGJyaWVmIERlZmluZSBhbGwgb2YgdGhlIHZ0YWJsZXMgdGhhdCBoYXZlIGJlZW4gdXNlZCBpbiB0aGlzCisgIC8vLyB0cmFuc2xhdGlvbiB1bml0IGFuZCByZWZlcmVuY2UgYW55IHZpcnR1YWwgbWVtYmVycyB1c2VkIGJ5IHRob3NlCisgIC8vLyB2dGFibGVzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgYW55IHdvcmsgd2FzIGRvbmUsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBEZWZpbmVVc2VkVlRhYmxlcygpOworCisgIHZvaWQgQWRkSW1wbGljaXRseURlY2xhcmVkTWVtYmVyc1RvQ2xhc3MoQ1hYUmVjb3JkRGVjbCAqQ2xhc3NEZWNsKTsKKworICB2b2lkIEFjdE9uTWVtSW5pdGlhbGl6ZXJzKERlY2wgKkNvbnN0cnVjdG9yRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDWFhDdG9ySW5pdGlhbGl6ZXIqPiBNZW1Jbml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFueUVycm9ycyk7CisKKyAgLy8vIFxicmllZiBDaGVjayBjbGFzcy1sZXZlbCBkbGxpbXBvcnQvZGxsZXhwb3J0IGF0dHJpYnV0ZS4gVGhlIGNhbGxlciBtdXN0CisgIC8vLyBlbnN1cmUgdGhhdCByZWZlcmVuY2VETExFeHBvcnRlZENsYXNzTWV0aG9kcyBpcyBjYWxsZWQgc29tZSBwb2ludCBsYXRlcgorICAvLy8gd2hlbiBhbGwgb3V0ZXIgY2xhc3NlcyBvZiBDbGFzcyBhcmUgY29tcGxldGUuCisgIHZvaWQgY2hlY2tDbGFzc0xldmVsRExMQXR0cmlidXRlKENYWFJlY29yZERlY2wgKkNsYXNzKTsKKworICB2b2lkIHJlZmVyZW5jZURMTEV4cG9ydGVkQ2xhc3NNZXRob2RzKCk7CisKKyAgdm9pZCBwcm9wYWdhdGVETExBdHRyVG9CYXNlQ2xhc3NUZW1wbGF0ZSgKKyAgICAgIENYWFJlY29yZERlY2wgKkNsYXNzLCBBdHRyICpDbGFzc0F0dHIsCisgICAgICBDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICpCYXNlVGVtcGxhdGVTcGVjLAorICAgICAgU291cmNlTG9jYXRpb24gQmFzZUxvYyk7CisKKyAgdm9pZCBDaGVja0NvbXBsZXRlZENYWENsYXNzKENYWFJlY29yZERlY2wgKlJlY29yZCk7CisKKyAgLy8vIENoZWNrIHRoYXQgdGhlIEMrKyBjbGFzcyBhbm5vYXRlZCB3aXRoICJ0cml2aWFsX2FiaSIgc2F0aXNmaWVzIGFsbCB0aGUKKyAgLy8vIGNvbmRpdGlvbnMgdGhhdCBhcmUgbmVlZGVkIGZvciB0aGUgYXR0cmlidXRlIHRvIGhhdmUgYW4gZWZmZWN0LgorICB2b2lkIGNoZWNrSWxsRm9ybWVkVHJpdmlhbEFCSVN0cnVjdChDWFhSZWNvcmREZWNsICZSRCk7CisKKyAgdm9pZCBBY3RPbkZpbmlzaENYWE1lbWJlclNwZWNpZmljYXRpb24oU2NvcGUqIFMsIFNvdXJjZUxvY2F0aW9uIFJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2wgKlRhZ0RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExCcmFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSQnJhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdCAqQXR0ckxpc3QpOworICB2b2lkIEFjdE9uRmluaXNoQ1hYTWVtYmVyRGVjbHMoKTsKKyAgdm9pZCBBY3RPbkZpbmlzaENYWE5vbk5lc3RlZENsYXNzKERlY2wgKkQpOworCisgIHZvaWQgQWN0T25SZWVudGVyQ1hYTWV0aG9kUGFyYW1ldGVyKFNjb3BlICpTLCBQYXJtVmFyRGVjbCAqUGFyYW0pOworICB1bnNpZ25lZCBBY3RPblJlZW50ZXJUZW1wbGF0ZVNjb3BlKFNjb3BlICpTLCBEZWNsICpUZW1wbGF0ZSk7CisgIHZvaWQgQWN0T25TdGFydERlbGF5ZWRNZW1iZXJEZWNsYXJhdGlvbnMoU2NvcGUgKlMsIERlY2wgKlJlY29yZCk7CisgIHZvaWQgQWN0T25TdGFydERlbGF5ZWRDWFhNZXRob2REZWNsYXJhdGlvbihTY29wZSAqUywgRGVjbCAqTWV0aG9kKTsKKyAgdm9pZCBBY3RPbkRlbGF5ZWRDWFhNZXRob2RQYXJhbWV0ZXIoU2NvcGUgKlMsIERlY2wgKlBhcmFtKTsKKyAgdm9pZCBBY3RPbkZpbmlzaERlbGF5ZWRNZW1iZXJEZWNsYXJhdGlvbnMoU2NvcGUgKlMsIERlY2wgKlJlY29yZCk7CisgIHZvaWQgQWN0T25GaW5pc2hEZWxheWVkQ1hYTWV0aG9kRGVjbGFyYXRpb24oU2NvcGUgKlMsIERlY2wgKk1ldGhvZCk7CisgIHZvaWQgQWN0T25GaW5pc2hEZWxheWVkTWVtYmVySW5pdGlhbGl6ZXJzKERlY2wgKlJlY29yZCk7CisgIHZvaWQgTWFya0FzTGF0ZVBhcnNlZFRlbXBsYXRlKEZ1bmN0aW9uRGVjbCAqRkQsIERlY2wgKkZuRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVkVG9rZW5zICZUb2tzKTsKKyAgdm9pZCBVbm1hcmtBc0xhdGVQYXJzZWRUZW1wbGF0ZShGdW5jdGlvbkRlY2wgKkZEKTsKKyAgYm9vbCBJc0luc2lkZUFMb2NhbENsYXNzV2l0aGluQVRlbXBsYXRlRnVuY3Rpb24oKTsKKworICBEZWNsICpBY3RPblN0YXRpY0Fzc2VydERlY2xhcmF0aW9uKFNvdXJjZUxvY2F0aW9uIFN0YXRpY0Fzc2VydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpBc3NlcnRFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkFzc2VydE1lc3NhZ2VFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYyk7CisgIERlY2wgKkJ1aWxkU3RhdGljQXNzZXJ0RGVjbGFyYXRpb24oU291cmNlTG9jYXRpb24gU3RhdGljQXNzZXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkFzc2VydEV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCAqQXNzZXJ0TWVzc2FnZUV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRmFpbGVkKTsKKworICBGcmllbmREZWNsICpDaGVja0ZyaWVuZFR5cGVEZWNsKFNvdXJjZUxvY2F0aW9uIExvY1N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEZyaWVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqVFNJbmZvKTsKKyAgRGVjbCAqQWN0T25GcmllbmRUeXBlRGVjbChTY29wZSAqUywgY29uc3QgRGVjbFNwZWMgJkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpVGVtcGxhdGVQYXJhbXNBcmcgVGVtcGxhdGVQYXJhbXMpOworICBOYW1lZERlY2wgKkFjdE9uRnJpZW5kRnVuY3Rpb25EZWNsKFNjb3BlICpTLCBEZWNsYXJhdG9yICZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpVGVtcGxhdGVQYXJhbXNBcmcgVGVtcGxhdGVQYXJhbXMpOworCisgIFF1YWxUeXBlIENoZWNrQ29uc3RydWN0b3JEZWNsYXJhdG9yKERlY2xhcmF0b3IgJkQsIFF1YWxUeXBlIFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VDbGFzcyYgU0MpOworICB2b2lkIENoZWNrQ29uc3RydWN0b3IoQ1hYQ29uc3RydWN0b3JEZWNsICpDb25zdHJ1Y3Rvcik7CisgIFF1YWxUeXBlIENoZWNrRGVzdHJ1Y3RvckRlY2xhcmF0b3IoRGVjbGFyYXRvciAmRCwgUXVhbFR5cGUgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlQ2xhc3MmIFNDKTsKKyAgYm9vbCBDaGVja0Rlc3RydWN0b3IoQ1hYRGVzdHJ1Y3RvckRlY2wgKkRlc3RydWN0b3IpOworICB2b2lkIENoZWNrQ29udmVyc2lvbkRlY2xhcmF0b3IoRGVjbGFyYXRvciAmRCwgUXVhbFR5cGUgJlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlQ2xhc3MmIFNDKTsKKyAgRGVjbCAqQWN0T25Db252ZXJzaW9uRGVjbGFyYXRvcihDWFhDb252ZXJzaW9uRGVjbCAqQ29udmVyc2lvbik7CisgIHZvaWQgQ2hlY2tEZWR1Y3Rpb25HdWlkZURlY2xhcmF0b3IoRGVjbGFyYXRvciAmRCwgUXVhbFR5cGUgJlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZUNsYXNzICZTQyk7CisgIHZvaWQgQ2hlY2tEZWR1Y3Rpb25HdWlkZVRlbXBsYXRlKEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpURCk7CisKKyAgdm9pZCBDaGVja0V4cGxpY2l0bHlEZWZhdWx0ZWRTcGVjaWFsTWVtYmVyKENYWE1ldGhvZERlY2wgKk1EKTsKKyAgdm9pZCBDaGVja0V4cGxpY2l0bHlEZWZhdWx0ZWRNZW1iZXJFeGNlcHRpb25TcGVjKENYWE1ldGhvZERlY2wgKk1ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlQpOworICB2b2lkIENoZWNrRGVsYXllZE1lbWJlckV4Y2VwdGlvblNwZWNzKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEMrKyBEZXJpdmVkIENsYXNzZXMKKyAgLy8KKworICAvLy8gQWN0T25CYXNlU3BlY2lmaWVyIC0gUGFyc2VkIGEgYmFzZSBzcGVjaWZpZXIKKyAgQ1hYQmFzZVNwZWNpZmllciAqQ2hlY2tCYXNlU3BlY2lmaWVyKENYWFJlY29yZERlY2wgKkNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgU3BlY2lmaWVyUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFZpcnR1YWwsIEFjY2Vzc1NwZWNpZmllciBBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqVEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYyk7CisKKyAgQmFzZVJlc3VsdCBBY3RPbkJhc2VTcGVjaWZpZXIoRGVjbCAqY2xhc3NkZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBTcGVjaWZpZXJSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkQXR0cmlidXRlcyAmQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVmlydHVhbCwgQWNjZXNzU3BlY2lmaWVyIEFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSBiYXNldHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQmFzZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MpOworCisgIGJvb2wgQXR0YWNoQmFzZVNwZWNpZmllcnMoQ1hYUmVjb3JkRGVjbCAqQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0YWJsZUFycmF5UmVmPENYWEJhc2VTcGVjaWZpZXIgKj4gQmFzZXMpOworICB2b2lkIEFjdE9uQmFzZVNwZWNpZmllcnMoRGVjbCAqQ2xhc3NEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0YWJsZUFycmF5UmVmPENYWEJhc2VTcGVjaWZpZXIgKj4gQmFzZXMpOworCisgIGJvb2wgSXNEZXJpdmVkRnJvbShTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIERlcml2ZWQsIFF1YWxUeXBlIEJhc2UpOworICBib29sIElzRGVyaXZlZEZyb20oU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBEZXJpdmVkLCBRdWFsVHlwZSBCYXNlLAorICAgICAgICAgICAgICAgICAgICAgQ1hYQmFzZVBhdGhzICZQYXRocyk7CisKKyAgLy8gRklYTUU6IEkgZG9uJ3QgbGlrZSB0aGlzIG5hbWUuCisgIHZvaWQgQnVpbGRCYXNlUGF0aEFycmF5KGNvbnN0IENYWEJhc2VQYXRocyAmUGF0aHMsIENYWENhc3RQYXRoICZCYXNlUGF0aCk7CisKKyAgYm9vbCBDaGVja0Rlcml2ZWRUb0Jhc2VDb252ZXJzaW9uKFF1YWxUeXBlIERlcml2ZWQsIFF1YWxUeXBlIEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZVJhbmdlIFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ2FzdFBhdGggKkJhc2VQYXRoID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSWdub3JlQWNjZXNzID0gZmFsc2UpOworICBib29sIENoZWNrRGVyaXZlZFRvQmFzZUNvbnZlcnNpb24oUXVhbFR5cGUgRGVyaXZlZCwgUXVhbFR5cGUgQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluYWNjZXNzaWJsZUJhc2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFtYmlnaW91c0Jhc2VDb252SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZVJhbmdlIFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhDYXN0UGF0aCAqQmFzZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElnbm9yZUFjY2VzcyA9IGZhbHNlKTsKKworICBzdGQ6OnN0cmluZyBnZXRBbWJpZ3VvdXNQYXRoc0Rpc3BsYXlTdHJpbmcoQ1hYQmFzZVBhdGhzICZQYXRocyk7CisKKyAgYm9vbCBDaGVja092ZXJyaWRpbmdGdW5jdGlvbkF0dHJpYnV0ZXMoY29uc3QgQ1hYTWV0aG9kRGVjbCAqTmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhNZXRob2REZWNsICpPbGQpOworCisgIC8vLyBDaGVja092ZXJyaWRpbmdGdW5jdGlvblJldHVyblR5cGUgLSBDaGVja3Mgd2hldGhlciB0aGUgcmV0dXJuIHR5cGVzIGFyZQorICAvLy8gY292YXJpYW50LCBhY2NvcmRpbmcgdG8gQysrIFtjbGFzcy52aXJ0dWFsXXA1LgorICBib29sIENoZWNrT3ZlcnJpZGluZ0Z1bmN0aW9uUmV0dXJuVHlwZShjb25zdCBDWFhNZXRob2REZWNsICpOZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWE1ldGhvZERlY2wgKk9sZCk7CisKKyAgLy8vIENoZWNrT3ZlcnJpZGluZ0Z1bmN0aW9uRXhjZXB0aW9uU3BlYyAtIENoZWNrcyB3aGV0aGVyIHRoZSBleGNlcHRpb24KKyAgLy8vIHNwZWMgaXMgYSBzdWJzZXQgb2YgYmFzZSBzcGVjLgorICBib29sIENoZWNrT3ZlcnJpZGluZ0Z1bmN0aW9uRXhjZXB0aW9uU3BlYyhjb25zdCBDWFhNZXRob2REZWNsICpOZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWE1ldGhvZERlY2wgKk9sZCk7CisKKyAgYm9vbCBDaGVja1B1cmVNZXRob2QoQ1hYTWV0aG9kRGVjbCAqTWV0aG9kLCBTb3VyY2VSYW5nZSBJbml0UmFuZ2UpOworCisgIC8vLyBDaGVja092ZXJyaWRlQ29udHJvbCAtIENoZWNrIEMrKzExIG92ZXJyaWRlIGNvbnRyb2wgc2VtYW50aWNzLgorICB2b2lkIENoZWNrT3ZlcnJpZGVDb250cm9sKE5hbWVkRGVjbCAqRCk7CisKKyAgLy8vIERpYWdub3NlQWJzZW5jZU9mT3ZlcnJpZGVDb250cm9sIC0gRGlhZ25vc2UgaWYgJ292ZXJyaWRlJyBrZXl3b3JkIHdhcworICAvLy8gbm90IHVzZWQgaW4gdGhlIGRlY2xhcmF0aW9uIG9mIGFuIG92ZXJyaWRpbmcgbWV0aG9kLgorICB2b2lkIERpYWdub3NlQWJzZW5jZU9mT3ZlcnJpZGVDb250cm9sKE5hbWVkRGVjbCAqRCk7CisKKyAgLy8vIENoZWNrRm9yRnVuY3Rpb25NYXJrZWRGaW5hbCAtIENoZWNrcyB3aGV0aGVyIGEgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb24KKyAgLy8vIG92ZXJyaWRlcyBhIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9uIG1hcmtlZCAnZmluYWwnLCBhY2NvcmRpbmcgdG8KKyAgLy8vIEMrKzExIFtjbGFzcy52aXJ0dWFsXXA0LgorICBib29sIENoZWNrSWZPdmVycmlkZGVuRnVuY3Rpb25Jc01hcmtlZEZpbmFsKGNvbnN0IENYWE1ldGhvZERlY2wgKk5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhNZXRob2REZWNsICpPbGQpOworCisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEMrKyBBY2Nlc3MgQ29udHJvbAorICAvLworCisgIGVudW0gQWNjZXNzUmVzdWx0IHsKKyAgICBBUl9hY2Nlc3NpYmxlLAorICAgIEFSX2luYWNjZXNzaWJsZSwKKyAgICBBUl9kZXBlbmRlbnQsCisgICAgQVJfZGVsYXllZAorICB9OworCisgIGJvb2wgU2V0TWVtYmVyQWNjZXNzU3BlY2lmaWVyKE5hbWVkRGVjbCAqTWVtYmVyRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpQcmV2TWVtYmVyRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzU3BlY2lmaWVyIExleGljYWxBUyk7CisKKyAgQWNjZXNzUmVzdWx0IENoZWNrVW5yZXNvbHZlZE1lbWJlckFjY2VzcyhVbnJlc29sdmVkTWVtYmVyRXhwciAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsQWNjZXNzUGFpciBGb3VuZERlY2wpOworICBBY2Nlc3NSZXN1bHQgQ2hlY2tVbnJlc29sdmVkTG9va3VwQWNjZXNzKFVucmVzb2x2ZWRMb29rdXBFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xBY2Nlc3NQYWlyIEZvdW5kRGVjbCk7CisgIEFjY2Vzc1Jlc3VsdCBDaGVja0FsbG9jYXRpb25BY2Nlc3MoU291cmNlTG9jYXRpb24gT3BlcmF0b3JMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgUGxhY2VtZW50UmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYUmVjb3JkRGVjbCAqTmFtaW5nQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbEFjY2Vzc1BhaXIgRm91bmREZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGlhZ25vc2UgPSB0cnVlKTsKKyAgQWNjZXNzUmVzdWx0IENoZWNrQ29uc3RydWN0b3JBY2Nlc3MoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhDb25zdHJ1Y3RvckRlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xBY2Nlc3NQYWlyIEZvdW5kRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5pdGlhbGl6ZWRFbnRpdHkgJkVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0NvcHlCaW5kaW5nUmVmVG9UZW1wID0gZmFsc2UpOworICBBY2Nlc3NSZXN1bHQgQ2hlY2tDb25zdHJ1Y3RvckFjY2VzcyhTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWENvbnN0cnVjdG9yRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbEFjY2Vzc1BhaXIgRm91bmREZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbml0aWFsaXplZEVudGl0eSAmRW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmUERpYWcpOworICBBY2Nlc3NSZXN1bHQgQ2hlY2tEZXN0cnVjdG9yQWNjZXNzKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhEZXN0cnVjdG9yRGVjbCAqRHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmUERpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgb2JqZWN0VHlwZSA9IFF1YWxUeXBlKCkpOworICBBY2Nlc3NSZXN1bHQgQ2hlY2tGcmllbmRBY2Nlc3MoTmFtZWREZWNsICpEKTsKKyAgQWNjZXNzUmVzdWx0IENoZWNrTWVtYmVyQWNjZXNzKFNvdXJjZUxvY2F0aW9uIFVzZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFJlY29yZERlY2wgKk5hbWluZ0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbEFjY2Vzc1BhaXIgRm91bmQpOworICBBY2Nlc3NSZXN1bHQgQ2hlY2tNZW1iZXJPcGVyYXRvckFjY2VzcyhTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKk9iamVjdEV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkFyZ0V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xBY2Nlc3NQYWlyIEZvdW5kRGVjbCk7CisgIEFjY2Vzc1Jlc3VsdCBDaGVja0FkZHJlc3NPZk1lbWJlckFjY2VzcyhFeHByICpPdmxFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbEFjY2Vzc1BhaXIgRm91bmREZWNsKTsKKyAgQWNjZXNzUmVzdWx0IENoZWNrQmFzZUNsYXNzQWNjZXNzKFNvdXJjZUxvY2F0aW9uIEFjY2Vzc0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIEJhc2UsIFF1YWxUeXBlIERlcml2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhCYXNlUGF0aCAmUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERpYWdJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRm9yY2VDaGVjayA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBGb3JjZVVucHJpdmlsZWdlZCA9IGZhbHNlKTsKKyAgdm9pZCBDaGVja0xvb2t1cEFjY2Vzcyhjb25zdCBMb29rdXBSZXN1bHQgJlIpOworICBib29sIElzU2ltcGx5QWNjZXNzaWJsZShOYW1lZERlY2wgKmRlY2wsIERlY2xDb250ZXh0ICpDdHgpOworICBib29sIGlzU3BlY2lhbE1lbWJlckFjY2Vzc2libGVGb3JEZWxldGlvbihDWFhNZXRob2REZWNsICpkZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NTcGVjaWZpZXIgYWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBvYmplY3RUeXBlKTsKKworICB2b2lkIEhhbmRsZURlcGVuZGVudEFjY2Vzc0NoZWNrKGNvbnN0IERlcGVuZGVudERpYWdub3N0aWMgJkRELAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmVGVtcGxhdGVBcmdzKTsKKyAgdm9pZCBQZXJmb3JtRGVwZW5kZW50RGlhZ25vc3RpY3MoY29uc3QgRGVjbENvbnRleHQgKlBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncyk7CisKKyAgdm9pZCBIYW5kbGVEZWxheWVkQWNjZXNzQ2hlY2soc2VtYTo6RGVsYXllZERpYWdub3N0aWMgJkRELCBEZWNsICpDdHgpOworCisgIC8vLyBcYnJpZWYgV2hlbiB0cnVlLCBhY2Nlc3MgY2hlY2tpbmcgdmlvbGF0aW9ucyBhcmUgdHJlYXRlZCBhcyBTRklOQUUKKyAgLy8vIGZhaWx1cmVzIHJhdGhlciB0aGFuIGhhcmQgZXJyb3JzLgorICBib29sIEFjY2Vzc0NoZWNraW5nU0ZJTkFFOworCisgIGVudW0gQWJzdHJhY3REaWFnU2VsSUQgeworICAgIEFic3RyYWN0Tm9uZSA9IC0xLAorICAgIEFic3RyYWN0UmV0dXJuVHlwZSwKKyAgICBBYnN0cmFjdFBhcmFtVHlwZSwKKyAgICBBYnN0cmFjdFZhcmlhYmxlVHlwZSwKKyAgICBBYnN0cmFjdEZpZWxkVHlwZSwKKyAgICBBYnN0cmFjdEl2YXJUeXBlLAorICAgIEFic3RyYWN0U3ludGhlc2l6ZWRJdmFyVHlwZSwKKyAgICBBYnN0cmFjdEFycmF5VHlwZQorICB9OworCisgIGJvb2wgaXNBYnN0cmFjdFR5cGUoU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBUKTsKKyAgYm9vbCBSZXF1aXJlTm9uQWJzdHJhY3RUeXBlKFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVEaWFnbm9zZXIgJkRpYWdub3Nlcik7CisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUcz4KKyAgYm9vbCBSZXF1aXJlTm9uQWJzdHJhY3RUeXBlKFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCwgdW5zaWduZWQgRGlhZ0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHMgJi4uLkFyZ3MpIHsKKyAgICBCb3VuZFR5cGVEaWFnbm9zZXI8VHMuLi4+IERpYWdub3NlcihEaWFnSUQsIEFyZ3MuLi4pOworICAgIHJldHVybiBSZXF1aXJlTm9uQWJzdHJhY3RUeXBlKExvYywgVCwgRGlhZ25vc2VyKTsKKyAgfQorCisgIHZvaWQgRGlhZ25vc2VBYnN0cmFjdFR5cGUoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDKysgT3ZlcmxvYWRlZCBPcGVyYXRvcnMgW0MrKyAxMy41XQorICAvLworCisgIGJvb2wgQ2hlY2tPdmVybG9hZGVkT3BlcmF0b3JEZWNsYXJhdGlvbihGdW5jdGlvbkRlY2wgKkZuRGVjbCk7CisKKyAgYm9vbCBDaGVja0xpdGVyYWxPcGVyYXRvckRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbCAqRm5EZWNsKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQysrIFRlbXBsYXRlcyBbQysrIDE0XQorICAvLworICB2b2lkIEZpbHRlckFjY2VwdGFibGVUZW1wbGF0ZU5hbWVzKExvb2t1cFJlc3VsdCAmUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93RnVuY3Rpb25UZW1wbGF0ZXMgPSB0cnVlKTsKKyAgYm9vbCBoYXNBbnlBY2NlcHRhYmxlVGVtcGxhdGVOYW1lcyhMb29rdXBSZXN1bHQgJlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0Z1bmN0aW9uVGVtcGxhdGVzID0gdHJ1ZSk7CisKKyAgdm9pZCBMb29rdXBUZW1wbGF0ZU5hbWUoTG9va3VwUmVzdWx0ICZSLCBTY29wZSAqUywgQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgT2JqZWN0VHlwZSwgYm9vbCBFbnRlcmluZ0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJk1lbWJlck9mVW5rbm93blNwZWNpYWxpemF0aW9uKTsKKworICBUZW1wbGF0ZU5hbWVLaW5kIGlzVGVtcGxhdGVOYW1lKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNUZW1wbGF0ZUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5xdWFsaWZpZWRJZCAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRUeXBlIE9iamVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbnRlcmluZ0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVUeSAmVGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmTWVtYmVyT2ZVbmtub3duU3BlY2lhbGl6YXRpb24pOworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciBhIHBhcnRpY3VsYXIgaWRlbnRpZmllciBtaWdodCBiZSB0aGUgbmFtZSBpbiBhIEMrKzF6CisgIC8vLyBkZWR1Y3Rpb24tZ3VpZGUgZGVjbGFyYXRpb24uCisgIGJvb2wgaXNEZWR1Y3Rpb25HdWlkZU5hbWUoU2NvcGUgKlMsIGNvbnN0IElkZW50aWZpZXJJbmZvICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVGVtcGxhdGVUeSAqVGVtcGxhdGUgPSBudWxscHRyKTsKKworICBib29sIERpYWdub3NlVW5rbm93blRlbXBsYXRlTmFtZShjb25zdCBJZGVudGlmaWVySW5mbyAmSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElJTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY29wZSAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYU2NvcGVTcGVjICpTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVUeSAmU3VnZ2VzdGVkVGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlTmFtZUtpbmQgJlN1Z2dlc3RlZEtpbmQpOworCisgIGJvb2wgRGlhZ25vc2VVbmluc3RhbnRpYWJsZVRlbXBsYXRlKFNvdXJjZUxvY2F0aW9uIFBvaW50T2ZJbnN0YW50aWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKkluc3RhbnRpYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5zdGFudGlhdGVkRnJvbU1lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZWREZWNsICpQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOYW1lZERlY2wgKlBhdHRlcm5EZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kIFRTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb21wbGFpbiA9IHRydWUpOworCisgIHZvaWQgRGlhZ25vc2VUZW1wbGF0ZVBhcmFtZXRlclNoYWRvdyhTb3VyY2VMb2NhdGlvbiBMb2MsIERlY2wgKlByZXZEZWNsKTsKKyAgVGVtcGxhdGVEZWNsICpBZGp1c3REZWNsSWZUZW1wbGF0ZShEZWNsIComRGVjbCk7CisKKyAgTmFtZWREZWNsICpBY3RPblR5cGVQYXJhbWV0ZXIoU2NvcGUgKlMsIGJvb2wgVHlwZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEtleUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpQYXJhbU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQYXJhbU5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCwgdW5zaWduZWQgUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFcXVhbExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgRGVmYXVsdEFyZyk7CisKKyAgUXVhbFR5cGUgQ2hlY2tOb25UeXBlVGVtcGxhdGVQYXJhbWV0ZXJUeXBlKFR5cGVTb3VyY2VJbmZvIComVFNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKTsKKyAgUXVhbFR5cGUgQ2hlY2tOb25UeXBlVGVtcGxhdGVQYXJhbWV0ZXJUeXBlKFF1YWxUeXBlIFQsIFNvdXJjZUxvY2F0aW9uIExvYyk7CisKKyAgTmFtZWREZWNsICpBY3RPbk5vblR5cGVUZW1wbGF0ZVBhcmFtZXRlcihTY29wZSAqUywgRGVjbGFyYXRvciAmRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFcXVhbExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqRGVmYXVsdEFyZyk7CisgIE5hbWVkRGVjbCAqQWN0T25UZW1wbGF0ZVRlbXBsYXRlUGFyYW1ldGVyKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVG1wTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpQYXJhbU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQYXJhbU5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRXF1YWxMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRUZW1wbGF0ZUFyZ3VtZW50IERlZmF1bHRBcmcpOworCisgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqCisgIEFjdE9uVGVtcGxhdGVQYXJhbWV0ZXJMaXN0KHVuc2lnbmVkIERlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFeHBvcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMQW5nbGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE5hbWVkRGVjbCAqPiBQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJBbmdsZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqUmVxdWlyZXNDbGF1c2UpOworCisgIC8vLyBcYnJpZWYgVGhlIGNvbnRleHQgaW4gd2hpY2ggd2UgYXJlIGNoZWNraW5nIGEgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3QuCisgIGVudW0gVGVtcGxhdGVQYXJhbUxpc3RDb250ZXh0IHsKKyAgICBUUENfQ2xhc3NUZW1wbGF0ZSwKKyAgICBUUENfVmFyVGVtcGxhdGUsCisgICAgVFBDX0Z1bmN0aW9uVGVtcGxhdGUsCisgICAgVFBDX0NsYXNzVGVtcGxhdGVNZW1iZXIsCisgICAgVFBDX0ZyaWVuZENsYXNzVGVtcGxhdGUsCisgICAgVFBDX0ZyaWVuZEZ1bmN0aW9uVGVtcGxhdGUsCisgICAgVFBDX0ZyaWVuZEZ1bmN0aW9uVGVtcGxhdGVEZWZpbml0aW9uLAorICAgIFRQQ19UeXBlQWxpYXNUZW1wbGF0ZQorICB9OworCisgIGJvb2wgQ2hlY2tUZW1wbGF0ZVBhcmFtZXRlckxpc3QoVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpOZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpPbGRQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbUxpc3RDb250ZXh0IFRQQyk7CisgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqTWF0Y2hUZW1wbGF0ZVBhcmFtZXRlcnNUb1Njb3BlU3BlY2lmaWVyKAorICAgICAgU291cmNlTG9jYXRpb24gRGVjbFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBEZWNsTG9jLAorICAgICAgY29uc3QgQ1hYU2NvcGVTcGVjICZTUywgVGVtcGxhdGVJZEFubm90YXRpb24gKlRlbXBsYXRlSWQsCisgICAgICBBcnJheVJlZjxUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKj4gUGFyYW1MaXN0cywKKyAgICAgIGJvb2wgSXNGcmllbmQsIGJvb2wgJklzTWVtYmVyU3BlY2lhbGl6YXRpb24sIGJvb2wgJkludmFsaWQpOworCisgIERlY2xSZXN1bHQgQ2hlY2tDbGFzc1RlbXBsYXRlKFNjb3BlICpTLCB1bnNpZ25lZCBUYWdTcGVjLCBUYWdVc2VLaW5kIFRVSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gS1dMb2MsIENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpOYW1lLCBTb3VyY2VMb2NhdGlvbiBOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0ICpBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlRlbXBsYXRlUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NTcGVjaWZpZXIgQVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE1vZHVsZVByaXZhdGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEZyaWVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtT3V0ZXJUZW1wbGF0ZVBhcmFtTGlzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICoqT3V0ZXJUZW1wbGF0ZVBhcmFtTGlzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXBCb2R5SW5mbyAqU2tpcEJvZHkgPSBudWxscHRyKTsKKworICBUZW1wbGF0ZUFyZ3VtZW50TG9jIGdldFRyaXZpYWxUZW1wbGF0ZUFyZ3VtZW50TG9jKGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJkFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBOVFRQVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpOworCisgIHZvaWQgdHJhbnNsYXRlVGVtcGxhdGVBcmd1bWVudHMoY29uc3QgQVNUVGVtcGxhdGVBcmdzUHRyICZJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gJk91dCk7CisKKyAgUGFyc2VkVGVtcGxhdGVBcmd1bWVudCBBY3RPblRlbXBsYXRlVHlwZUFyZ3VtZW50KFR5cGVSZXN1bHQgUGFyc2VkVHlwZSk7CisKKyAgdm9pZCBOb3RlQWxsRm91bmRUZW1wbGF0ZXMoVGVtcGxhdGVOYW1lIE5hbWUpOworCisgIFF1YWxUeXBlIENoZWNrVGVtcGxhdGVJZFR5cGUoVGVtcGxhdGVOYW1lIFRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICZUZW1wbGF0ZUFyZ3MpOworCisgIFR5cGVSZXN1bHQKKyAgQWN0T25UZW1wbGF0ZUlkVHlwZShDWFhTY29wZVNwZWMgJlNTLCBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUtXTG9jLAorICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlVHkgVGVtcGxhdGUsIElkZW50aWZpZXJJbmZvICpUZW1wbGF0ZUlJLAorICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlSUlMb2MsCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTEFuZ2xlTG9jLAorICAgICAgICAgICAgICAgICAgICAgIEFTVFRlbXBsYXRlQXJnc1B0ciBUZW1wbGF0ZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUkFuZ2xlTG9jLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNDdG9yT3JEdG9yTmFtZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNDbGFzc05hbWUgPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBQYXJzZWQgYW4gZWxhYm9yYXRlZC10eXBlLXNwZWNpZmllciB0aGF0IHJlZmVycyB0byBhIHRlbXBsYXRlLWlkLAorICAvLy8gc3VjaCBhcyBcYyBjbGFzcyBUOjp0ZW1wbGF0ZSBhcHBseTxVPi4KKyAgVHlwZVJlc3VsdCBBY3RPblRhZ1RlbXBsYXRlSWRUeXBlKFRhZ1VzZUtpbmQgVFVLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNwZWNpZmllclR5cGUgVGFnU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRhZ0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUtXTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVUeSBUZW1wbGF0ZUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExBbmdsZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVFRlbXBsYXRlQXJnc1B0ciBUZW1wbGF0ZUFyZ3NJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJBbmdsZUxvYyk7CisKKyAgRGVjbFJlc3VsdCBBY3RPblZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb24oCisgICAgICBTY29wZSAqUywgRGVjbGFyYXRvciAmRCwgVHlwZVNvdXJjZUluZm8gKkRJLAorICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYywgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpUZW1wbGF0ZVBhcmFtcywKKyAgICAgIFN0b3JhZ2VDbGFzcyBTQywgYm9vbCBJc1BhcnRpYWxTcGVjaWFsaXphdGlvbik7CisKKyAgRGVjbFJlc3VsdCBDaGVja1ZhclRlbXBsYXRlSWQoVmFyVGVtcGxhdGVEZWNsICpUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlTmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICZUZW1wbGF0ZUFyZ3MpOworCisgIEV4cHJSZXN1bHQgQ2hlY2tWYXJUZW1wbGF0ZUlkKGNvbnN0IENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJUZW1wbGF0ZURlY2wgKlRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICpUZW1wbGF0ZUFyZ3MpOworCisgIEV4cHJSZXN1bHQgQnVpbGRUZW1wbGF0ZUlkRXhwcihjb25zdCBDWFhTY29wZVNwZWMgJlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb2t1cFJlc3VsdCAmUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVxdWlyZXNBREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICpUZW1wbGF0ZUFyZ3MpOworCisgIEV4cHJSZXN1bHQgQnVpbGRRdWFsaWZpZWRUZW1wbGF0ZUlkRXhwcihDWFhTY29wZVNwZWMgJlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZOYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gKlRlbXBsYXRlQXJncyk7CisKKyAgVGVtcGxhdGVOYW1lS2luZCBBY3RPbkRlcGVuZGVudFRlbXBsYXRlTmFtZSgKKyAgICAgIFNjb3BlICpTLCBDWFhTY29wZVNwZWMgJlNTLCBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUtXTG9jLAorICAgICAgVW5xdWFsaWZpZWRJZCAmTmFtZSwgUGFyc2VkVHlwZSBPYmplY3RUeXBlLCBib29sIEVudGVyaW5nQ29udGV4dCwKKyAgICAgIFRlbXBsYXRlVHkgJlRlbXBsYXRlLCBib29sIEFsbG93SW5qZWN0ZWRDbGFzc05hbWUgPSBmYWxzZSk7CisKKyAgRGVjbFJlc3VsdAorICBBY3RPbkNsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbihTY29wZSAqUywgdW5zaWduZWQgVGFnU3BlYywgVGFnVXNlS2luZCBUVUssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEtXTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBNb2R1bGVQcml2YXRlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlkQW5ub3RhdGlvbiAmVGVtcGxhdGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdCAqQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpVGVtcGxhdGVQYXJhbXNBcmcgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcEJvZHlJbmZvICpTa2lwQm9keSA9IG51bGxwdHIpOworCisgIGJvb2wgQ2hlY2tUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkFyZ3MoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlRGVjbCAqUHJpbWFyeVRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUV4cGxpY2l0QXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBBcmdzKTsKKyAgdm9pZCBDaGVja1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uKAorICAgICAgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKlBhcnRpYWwpOworICB2b2lkIENoZWNrVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb24oCisgICAgICBWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKlBhcnRpYWwpOworCisgIERlY2wgKkFjdE9uVGVtcGxhdGVEZWNsYXJhdG9yKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aVRlbXBsYXRlUGFyYW1zQXJnIFRlbXBsYXRlUGFyYW1ldGVyTGlzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0b3IgJkQpOworCisgIGJvb2wKKyAgQ2hlY2tTcGVjaWFsaXphdGlvbkluc3RhbnRpYXRpb25SZWRlY2woU291cmNlTG9jYXRpb24gTmV3TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCBOZXdUU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkRGVjbCAqUHJldkRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kIFByZXZUU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFByZXZQdE9mSW5zdGFudGlhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmU3VwcHJlc3NOZXcpOworCisgIGJvb2wgQ2hlY2tEZXBlbmRlbnRGdW5jdGlvblRlbXBsYXRlU3BlY2lhbGl6YXRpb24oRnVuY3Rpb25EZWNsICpGRCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICZFeHBsaWNpdFRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29rdXBSZXN1bHQgJlByZXZpb3VzKTsKKworICBib29sIENoZWNrRnVuY3Rpb25UZW1wbGF0ZVNwZWNpYWxpemF0aW9uKEZ1bmN0aW9uRGVjbCAqRkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICpFeHBsaWNpdFRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29rdXBSZXN1bHQgJlByZXZpb3VzKTsKKyAgYm9vbCBDaGVja01lbWJlclNwZWNpYWxpemF0aW9uKE5hbWVkRGVjbCAqTWVtYmVyLCBMb29rdXBSZXN1bHQgJlByZXZpb3VzKTsKKyAgdm9pZCBDb21wbGV0ZU1lbWJlclNwZWNpYWxpemF0aW9uKE5hbWVkRGVjbCAqTWVtYmVyLCBMb29rdXBSZXN1bHQgJlByZXZpb3VzKTsKKworICBEZWNsUmVzdWx0CisgIEFjdE9uRXhwbGljaXRJbnN0YW50aWF0aW9uKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFeHRlcm5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUYWdTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBLV0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVUeSBUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMQW5nbGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVFRlbXBsYXRlQXJnc1B0ciBUZW1wbGF0ZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJBbmdsZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdCAqQXR0cik7CisKKyAgRGVjbFJlc3VsdAorICBBY3RPbkV4cGxpY2l0SW5zdGFudGlhdGlvbihTY29wZSAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRXh0ZXJuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVGFnU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gS1dMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0ICpBdHRyKTsKKworICBEZWNsUmVzdWx0IEFjdE9uRXhwbGljaXRJbnN0YW50aWF0aW9uKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEV4dGVybkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdG9yICZEKTsKKworICBUZW1wbGF0ZUFyZ3VtZW50TG9jCisgIFN1YnN0RGVmYXVsdFRlbXBsYXRlQXJndW1lbnRJZkF2YWlsYWJsZShUZW1wbGF0ZURlY2wgKlRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSQW5nbGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsICpQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxUZW1wbGF0ZUFyZ3VtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29udmVydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmSGFzRGVmYXVsdEFyZyk7CisKKyAgLy8vIFxicmllZiBTcGVjaWZpZXMgdGhlIGNvbnRleHQgaW4gd2hpY2ggYSBwYXJ0aWN1bGFyIHRlbXBsYXRlCisgIC8vLyBhcmd1bWVudCBpcyBiZWluZyBjaGVja2VkLgorICBlbnVtIENoZWNrVGVtcGxhdGVBcmd1bWVudEtpbmQgeworICAgIC8vLyBcYnJpZWYgVGhlIHRlbXBsYXRlIGFyZ3VtZW50IHdhcyBzcGVjaWZpZWQgaW4gdGhlIGNvZGUgb3Igd2FzCisgICAgLy8vIGluc3RhbnRpYXRlZCB3aXRoIHNvbWUgZGVkdWNlZCB0ZW1wbGF0ZSBhcmd1bWVudHMuCisgICAgQ1RBS19TcGVjaWZpZWQsCisKKyAgICAvLy8gXGJyaWVmIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCB3YXMgZGVkdWNlZCB2aWEgdGVtcGxhdGUgYXJndW1lbnQKKyAgICAvLy8gZGVkdWN0aW9uLgorICAgIENUQUtfRGVkdWNlZCwKKworICAgIC8vLyBcYnJpZWYgVGhlIHRlbXBsYXRlIGFyZ3VtZW50IHdhcyBkZWR1Y2VkIGZyb20gYW4gYXJyYXkgYm91bmQKKyAgICAvLy8gdmlhIHRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbi4KKyAgICBDVEFLX0RlZHVjZWRGcm9tQXJyYXlCb3VuZAorICB9OworCisgIGJvb2wgQ2hlY2tUZW1wbGF0ZUFyZ3VtZW50KE5hbWVkRGVjbCAqUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJndW1lbnRMb2MgJkFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJBbmdsZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXJndW1lbnRQYWNrSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VGVtcGxhdGVBcmd1bWVudD4gJkNvbnZlcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tUZW1wbGF0ZUFyZ3VtZW50S2luZCBDVEFLID0gQ1RBS19TcGVjaWZpZWQpOworCisgIC8vLyBcYnJpZWYgQ2hlY2sgdGhhdCB0aGUgZ2l2ZW4gdGVtcGxhdGUgYXJndW1lbnRzIGNhbiBiZSBiZSBwcm92aWRlZCB0bworICAvLy8gdGhlIGdpdmVuIHRlbXBsYXRlLCBjb252ZXJ0aW5nIHRoZSBhcmd1bWVudHMgYWxvbmcgdGhlIHdheS4KKyAgLy8vCisgIC8vLyBccGFyYW0gVGVtcGxhdGUgVGhlIHRlbXBsYXRlIHRvIHdoaWNoIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgYXJlIGJlaW5nCisgIC8vLyBwcm92aWRlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gVGVtcGxhdGVMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBuYW1lIGluIHRoZSBzb3VyY2UuCisgIC8vLworICAvLy8gXHBhcmFtIFRlbXBsYXRlQXJncyBUaGUgbGlzdCBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMuIElmIHRoZSB0ZW1wbGF0ZSBpcworICAvLy8gYSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIHRoaXMgZnVuY3Rpb24gbWF5IGV4dGVuZCB0aGUgc2V0IG9mCisgIC8vLyB0ZW1wbGF0ZSBhcmd1bWVudHMgdG8gYWxzbyBpbmNsdWRlIHN1YnN0aXR1dGVkLCBkZWZhdWx0ZWQgdGVtcGxhdGUKKyAgLy8vIGFyZ3VtZW50cy4KKyAgLy8vCisgIC8vLyBccGFyYW0gUGFydGlhbFRlbXBsYXRlQXJncyBUcnVlIGlmIHRoZSBsaXN0IG9mIHRlbXBsYXRlIGFyZ3VtZW50cyBpcworICAvLy8gaW50ZW50aW9uYWxseSBwYXJ0aWFsLCBlLmcuLCBiZWNhdXNlIHdlJ3JlIGNoZWNraW5nIGp1c3QgdGhlIGluaXRpYWwKKyAgLy8vIHNldCBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMuCisgIC8vLworICAvLy8gXHBhcmFtIENvbnZlcnRlZCBXaWxsIHJlY2VpdmUgdGhlIGNvbnZlcnRlZCwgY2Fub25pY2FsaXplZCB0ZW1wbGF0ZQorICAvLy8gYXJndW1lbnRzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBVcGRhdGVBcmdzV2l0aENvbnZlcnNpb25zIElmIFxjIHRydWUsIHVwZGF0ZSBccCBUZW1wbGF0ZUFyZ3MgdG8KKyAgLy8vIGNvbnRhaW4gdGhlIGNvbnZlcnRlZCBmb3JtcyBvZiB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGFzIHdyaXR0ZW4uCisgIC8vLyBPdGhlcndpc2UsIFxwIFRlbXBsYXRlQXJncyB3aWxsIG5vdCBiZSBtb2RpZmllZC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgQ2hlY2tUZW1wbGF0ZUFyZ3VtZW50TGlzdChUZW1wbGF0ZURlY2wgKlRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gJlRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUGFydGlhbFRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxUZW1wbGF0ZUFyZ3VtZW50PiAmQ29udmVydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVcGRhdGVBcmdzV2l0aENvbnZlcnNpb25zID0gdHJ1ZSk7CisKKyAgYm9vbCBDaGVja1RlbXBsYXRlVHlwZUFyZ3VtZW50KFRlbXBsYXRlVHlwZVBhcm1EZWNsICpQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJndW1lbnRMb2MgJkFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxUZW1wbGF0ZUFyZ3VtZW50PiAmQ29udmVydGVkKTsKKworICBib29sIENoZWNrVGVtcGxhdGVBcmd1bWVudChUZW1wbGF0ZVR5cGVQYXJtRGVjbCAqUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpBcmcpOworICBFeHByUmVzdWx0IENoZWNrVGVtcGxhdGVBcmd1bWVudChOb25UeXBlVGVtcGxhdGVQYXJtRGVjbCAqUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIEluc3RhbnRpYXRlZFBhcmFtVHlwZSwgRXhwciAqQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUFyZ3VtZW50ICZDb252ZXJ0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tUZW1wbGF0ZUFyZ3VtZW50S2luZCBDVEFLID0gQ1RBS19TcGVjaWZpZWQpOworICBib29sIENoZWNrVGVtcGxhdGVUZW1wbGF0ZUFyZ3VtZW50KFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJndW1lbnRMb2MgJkFyZyk7CisKKyAgRXhwclJlc3VsdAorICBCdWlsZEV4cHJlc3Npb25Gcm9tRGVjbFRlbXBsYXRlQXJndW1lbnQoY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgUGFyYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKTsKKyAgRXhwclJlc3VsdAorICBCdWlsZEV4cHJlc3Npb25Gcm9tSW50ZWdyYWxUZW1wbGF0ZUFyZ3VtZW50KGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJkFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpOworCisgIC8vLyBcYnJpZWYgRW51bWVyYXRpb24gZGVzY3JpYmluZyBob3cgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3RzIGFyZSBjb21wYXJlZAorICAvLy8gZm9yIGVxdWFsaXR5LgorICBlbnVtIFRlbXBsYXRlUGFyYW1ldGVyTGlzdEVxdWFsS2luZCB7CisgICAgLy8vIFxicmllZiBXZSBhcmUgbWF0Y2hpbmcgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0cyBvZiB0d28gdGVtcGxhdGVzCisgICAgLy8vIHRoYXQgbWlnaHQgYmUgcmVkZWNsYXJhdGlvbnMuCisgICAgLy8vCisgICAgLy8vIFxjb2RlCisgICAgLy8vIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBYOworICAgIC8vLyB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWDsKKyAgICAvLy8gXGVuZGNvZGUKKyAgICBUUExfVGVtcGxhdGVNYXRjaCwKKworICAgIC8vLyBcYnJpZWYgV2UgYXJlIG1hdGNoaW5nIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdHMgb2YgdHdvIHRlbXBsYXRlCisgICAgLy8vIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXMgcGFydCBvZiBtYXRjaGluZyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3RzCisgICAgLy8vIG9mIHR3byB0ZW1wbGF0ZXMgdGhhdCBtaWdodCBiZSByZWRlY2xhcmF0aW9ucy4KKyAgICAvLy8KKyAgICAvLy8gXGNvZGUKKyAgICAvLy8gdGVtcGxhdGU8dGVtcGxhdGU8aW50IEk+IGNsYXNzIFRUPiBzdHJ1Y3QgWDsKKyAgICAvLy8gdGVtcGxhdGU8dGVtcGxhdGU8aW50IFZhbHVlPiBjbGFzcyBPdGhlcj4gc3RydWN0IFg7CisgICAgLy8vIFxlbmRjb2RlCisgICAgVFBMX1RlbXBsYXRlVGVtcGxhdGVQYXJtTWF0Y2gsCisKKyAgICAvLy8gXGJyaWVmIFdlIGFyZSBtYXRjaGluZyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3RzIG9mIGEgdGVtcGxhdGUKKyAgICAvLy8gdGVtcGxhdGUgYXJndW1lbnQgYWdhaW5zdCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3RzIG9mIGEgdGVtcGxhdGUKKyAgICAvLy8gdGVtcGxhdGUgcGFyYW1ldGVyLgorICAgIC8vLworICAgIC8vLyBcY29kZQorICAgIC8vLyB0ZW1wbGF0ZTx0ZW1wbGF0ZTxpbnQgVmFsdWU+IGNsYXNzIE1ldGFmdW4+IHN0cnVjdCBYOworICAgIC8vLyB0ZW1wbGF0ZTxpbnQgVmFsdWU+IHN0cnVjdCBpbnRlZ2VyX2M7CisgICAgLy8vIFg8aW50ZWdlcl9jPiB4aWM7CisgICAgLy8vIFxlbmRjb2RlCisgICAgVFBMX1RlbXBsYXRlVGVtcGxhdGVBcmd1bWVudE1hdGNoCisgIH07CisKKyAgYm9vbCBUZW1wbGF0ZVBhcmFtZXRlckxpc3RzQXJlRXF1YWwoVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpOZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVBhcmFtZXRlckxpc3RFcXVhbEtpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVBcmdMb2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFNvdXJjZUxvY2F0aW9uKCkpOworCisgIGJvb2wgQ2hlY2tUZW1wbGF0ZURlY2xTY29wZShTY29wZSAqUywgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpUZW1wbGF0ZVBhcmFtcyk7CisKKyAgLy8vIFxicmllZiBDYWxsZWQgd2hlbiB0aGUgcGFyc2VyIGhhcyBwYXJzZWQgYSBDKysgdHlwZW5hbWUKKyAgLy8vIHNwZWNpZmllciwgZS5nLiwgInR5cGVuYW1lIFQ6OnR5cGUiLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTIFRoZSBzY29wZSBpbiB3aGljaCB0aGlzIHR5cGVuYW1lIHR5cGUgb2NjdXJzLgorICAvLy8gXHBhcmFtIFR5cGVuYW1lTG9jIHRoZSBsb2NhdGlvbiBvZiB0aGUgJ3R5cGVuYW1lJyBrZXl3b3JkCisgIC8vLyBccGFyYW0gU1MgdGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciBmb2xsb3dpbmcgdGhlIHR5cGVuYW1lIChlLmcuLCAnVDo6JykuCisgIC8vLyBccGFyYW0gSUkgdGhlIGlkZW50aWZpZXIgd2UncmUgcmV0cmlldmluZyAoZS5nLiwgJ3R5cGUnIGluIHRoZSBleGFtcGxlKS4KKyAgLy8vIFxwYXJhbSBJZExvYyB0aGUgbG9jYXRpb24gb2YgdGhlIGlkZW50aWZpZXIuCisgIFR5cGVSZXN1bHQKKyAgQWN0T25UeXBlbmFtZVR5cGUoU2NvcGUgKlMsIFNvdXJjZUxvY2F0aW9uIFR5cGVuYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhTY29wZVNwZWMgJlNTLCBjb25zdCBJZGVudGlmaWVySW5mbyAmSUksCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jKTsKKworICAvLy8gXGJyaWVmIENhbGxlZCB3aGVuIHRoZSBwYXJzZXIgaGFzIHBhcnNlZCBhIEMrKyB0eXBlbmFtZQorICAvLy8gc3BlY2lmaWVyIHRoYXQgZW5kcyBpbiBhIHRlbXBsYXRlLWlkLCBlLmcuLAorICAvLy8gInR5cGVuYW1lIE1ldGFGdW46OnRlbXBsYXRlIGFwcGx5PFQxLCBUMj4iLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTIFRoZSBzY29wZSBpbiB3aGljaCB0aGlzIHR5cGVuYW1lIHR5cGUgb2NjdXJzLgorICAvLy8gXHBhcmFtIFR5cGVuYW1lTG9jIHRoZSBsb2NhdGlvbiBvZiB0aGUgJ3R5cGVuYW1lJyBrZXl3b3JkCisgIC8vLyBccGFyYW0gU1MgdGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciBmb2xsb3dpbmcgdGhlIHR5cGVuYW1lIChlLmcuLCAnVDo6JykuCisgIC8vLyBccGFyYW0gVGVtcGxhdGVMb2MgdGhlIGxvY2F0aW9uIG9mIHRoZSAndGVtcGxhdGUnIGtleXdvcmQsIGlmIGFueS4KKyAgLy8vIFxwYXJhbSBUZW1wbGF0ZU5hbWUgVGhlIHRlbXBsYXRlIG5hbWUuCisgIC8vLyBccGFyYW0gVGVtcGxhdGVJSSBUaGUgaWRlbnRpZmllciB1c2VkIHRvIG5hbWUgdGhlIHRlbXBsYXRlLgorICAvLy8gXHBhcmFtIFRlbXBsYXRlSUlMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBuYW1lLgorICAvLy8gXHBhcmFtIExBbmdsZUxvYyBUaGUgbG9jYXRpb24gb2YgdGhlIG9wZW5pbmcgYW5nbGUgYnJhY2tldCAgKCc8JykuCisgIC8vLyBccGFyYW0gVGVtcGxhdGVBcmdzIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMuCisgIC8vLyBccGFyYW0gUkFuZ2xlTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgY2xvc2luZyBhbmdsZSBicmFja2V0ICAoJz4nKS4KKyAgVHlwZVJlc3VsdAorICBBY3RPblR5cGVuYW1lVHlwZShTY29wZSAqUywgU291cmNlTG9jYXRpb24gVHlwZW5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlTG9jLAorICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVR5IFRlbXBsYXRlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKlRlbXBsYXRlSUksCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlSUlMb2MsCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExBbmdsZUxvYywKKyAgICAgICAgICAgICAgICAgICAgQVNUVGVtcGxhdGVBcmdzUHRyIFRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUkFuZ2xlTG9jKTsKKworICBRdWFsVHlwZSBDaGVja1R5cGVuYW1lVHlwZShFbGFib3JhdGVkVHlwZUtleXdvcmQgS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gS2V5d29yZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElkZW50aWZpZXJJbmZvICZJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSUlMb2MpOworCisgIFR5cGVTb3VyY2VJbmZvICpSZWJ1aWxkVHlwZUluQ3VycmVudEluc3RhbnRpYXRpb24oVHlwZVNvdXJjZUluZm8gKlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBOYW1lKTsKKyAgYm9vbCBSZWJ1aWxkTmVzdGVkTmFtZVNwZWNpZmllckluQ3VycmVudEluc3RhbnRpYXRpb24oQ1hYU2NvcGVTcGVjICZTUyk7CisKKyAgRXhwclJlc3VsdCBSZWJ1aWxkRXhwckluQ3VycmVudEluc3RhbnRpYXRpb24oRXhwciAqRSk7CisgIGJvb2wgUmVidWlsZFRlbXBsYXRlUGFyYW1zSW5DdXJyZW50SW5zdGFudGlhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zKTsKKworICBzdGQ6OnN0cmluZworICBnZXRUZW1wbGF0ZUFyZ3VtZW50QmluZGluZ3NUZXh0KGNvbnN0IFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0ICZBcmdzKTsKKworICBzdGQ6OnN0cmluZworICBnZXRUZW1wbGF0ZUFyZ3VtZW50QmluZGluZ3NUZXh0KGNvbnN0IFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgKkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQXJncyk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEMrKyBWYXJpYWRpYyBUZW1wbGF0ZXMgKEMrKzB4IFt0ZW1wLnZhcmlhZGljXSkKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIGFuIHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2sgbWlnaHQgYmUgcGVybWl0dGVkIGluIHRoaXMKKyAgLy8vIGxvY2F0aW9uLiBVc2VmdWwgZm9yIGVycm9yIHJlY292ZXJ5LgorICBib29sIGlzVW5leHBhbmRlZFBhcmFtZXRlclBhY2tQZXJtaXR0ZWQoKTsKKworICAvLy8gXGJyaWVmIFRoZSBjb250ZXh0IGluIHdoaWNoIGFuIHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2sgaXMKKyAgLy8vIGJlaW5nIGRpYWdub3NlZC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhlIHZhbHVlcyBvZiB0aGlzIGVudW1lcmF0aW9uIGxpbmUgdXAgd2l0aCB0aGUgZmlyc3QKKyAgLy8vIGFyZ3VtZW50IHRvIHRoZSBcYyBlcnJfdW5leHBhbmRlZF9wYXJhbWV0ZXJfcGFjayBkaWFnbm9zdGljLgorICBlbnVtIFVuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrQ29udGV4dCB7CisgICAgLy8vIFxicmllZiBBbiBhcmJpdHJhcnkgZXhwcmVzc2lvbi4KKyAgICBVUFBDX0V4cHJlc3Npb24gPSAwLAorCisgICAgLy8vIFxicmllZiBUaGUgYmFzZSB0eXBlIG9mIGEgY2xhc3MgdHlwZS4KKyAgICBVUFBDX0Jhc2VUeXBlLAorCisgICAgLy8vIFxicmllZiBUaGUgdHlwZSBvZiBhbiBhcmJpdHJhcnkgZGVjbGFyYXRpb24uCisgICAgVVBQQ19EZWNsYXJhdGlvblR5cGUsCisKKyAgICAvLy8gXGJyaWVmIFRoZSB0eXBlIG9mIGEgZGF0YSBtZW1iZXIuCisgICAgVVBQQ19EYXRhTWVtYmVyVHlwZSwKKworICAgIC8vLyBcYnJpZWYgVGhlIHNpemUgb2YgYSBiaXQtZmllbGQuCisgICAgVVBQQ19CaXRGaWVsZFdpZHRoLAorCisgICAgLy8vIFxicmllZiBUaGUgZXhwcmVzc2lvbiBpbiBhIHN0YXRpYyBhc3NlcnRpb24uCisgICAgVVBQQ19TdGF0aWNBc3NlcnRFeHByZXNzaW9uLAorCisgICAgLy8vIFxicmllZiBUaGUgZml4ZWQgdW5kZXJseWluZyB0eXBlIG9mIGFuIGVudW1lcmF0aW9uLgorICAgIFVQUENfRml4ZWRVbmRlcmx5aW5nVHlwZSwKKworICAgIC8vLyBcYnJpZWYgVGhlIGVudW1lcmF0b3IgdmFsdWUuCisgICAgVVBQQ19FbnVtZXJhdG9yVmFsdWUsCisKKyAgICAvLy8gXGJyaWVmIEEgdXNpbmcgZGVjbGFyYXRpb24uCisgICAgVVBQQ19Vc2luZ0RlY2xhcmF0aW9uLAorCisgICAgLy8vIFxicmllZiBBIGZyaWVuZCBkZWNsYXJhdGlvbi4KKyAgICBVUFBDX0ZyaWVuZERlY2xhcmF0aW9uLAorCisgICAgLy8vIFxicmllZiBBIGRlY2xhcmF0aW9uIHF1YWxpZmllci4KKyAgICBVUFBDX0RlY2xhcmF0aW9uUXVhbGlmaWVyLAorCisgICAgLy8vIFxicmllZiBBbiBpbml0aWFsaXplci4KKyAgICBVUFBDX0luaXRpYWxpemVyLAorCisgICAgLy8vIFxicmllZiBBIGRlZmF1bHQgYXJndW1lbnQuCisgICAgVVBQQ19EZWZhdWx0QXJndW1lbnQsCisKKyAgICAvLy8gXGJyaWVmIFRoZSB0eXBlIG9mIGEgbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVyLgorICAgIFVQUENfTm9uVHlwZVRlbXBsYXRlUGFyYW1ldGVyVHlwZSwKKworICAgIC8vLyBcYnJpZWYgVGhlIHR5cGUgb2YgYW4gZXhjZXB0aW9uLgorICAgIFVQUENfRXhjZXB0aW9uVHlwZSwKKworICAgIC8vLyBcYnJpZWYgUGFydGlhbCBzcGVjaWFsaXphdGlvbi4KKyAgICBVUFBDX1BhcnRpYWxTcGVjaWFsaXphdGlvbiwKKworICAgIC8vLyBcYnJpZWYgTWljcm9zb2Z0IF9faWZfZXhpc3RzLgorICAgIFVQUENfSWZFeGlzdHMsCisKKyAgICAvLy8gXGJyaWVmIE1pY3Jvc29mdCBfX2lmX25vdF9leGlzdHMuCisgICAgVVBQQ19JZk5vdEV4aXN0cywKKworICAgIC8vLyBcYnJpZWYgTGFtYmRhIGV4cHJlc3Npb24uCisgICAgVVBQQ19MYW1iZGEsCisKKyAgICAvLy8gXGJyaWVmIEJsb2NrIGV4cHJlc3Npb24sCisgICAgVVBQQ19CbG9jaworICB9OworCisgIC8vLyBcYnJpZWYgRGlhZ25vc2UgdW5leHBhbmRlZCBwYXJhbWV0ZXIgcGFja3MuCisgIC8vLworICAvLy8gXHBhcmFtIExvYyBUaGUgbG9jYXRpb24gYXQgd2hpY2ggd2Ugc2hvdWxkIGVtaXQgdGhlIGRpYWdub3N0aWMuCisgIC8vLworICAvLy8gXHBhcmFtIFVQUEMgVGhlIGNvbnRleHQgaW4gd2hpY2ggd2UgYXJlIGRpYWdub3NpbmcgdW5leHBhbmRlZAorICAvLy8gcGFyYW1ldGVyIHBhY2tzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBVbmV4cGFuZGVkIHRoZSBzZXQgb2YgdW5leHBhbmRlZCBwYXJhbWV0ZXIgcGFja3MuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIERpYWdub3NlVW5leHBhbmRlZFBhcmFtZXRlclBhY2tzKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmV4cGFuZGVkUGFyYW1ldGVyUGFja0NvbnRleHQgVVBQQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaz4gVW5leHBhbmRlZCk7CisKKyAgLy8vIFxicmllZiBJZiB0aGUgZ2l2ZW4gdHlwZSBjb250YWlucyBhbiB1bmV4cGFuZGVkIHBhcmFtZXRlciBwYWNrLAorICAvLy8gZGlhZ25vc2UgdGhlIGVycm9yLgorICAvLy8KKyAgLy8vIFxwYXJhbSBMb2MgVGhlIHNvdXJjZSBsb2NhdGlvbiB3aGVyZSBhIGRpYWdub3N0YyBzaG91bGQgYmUgZW1pdHRlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gVCBUaGUgdHlwZSB0aGF0IGlzIGJlaW5nIGNoZWNrZWQgZm9yIHVuZXhwYW5kZWQgcGFyYW1ldGVyCisgIC8vLyBwYWNrcy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgRGlhZ25vc2VVbmV4cGFuZGVkUGFyYW1ldGVyUGFjayhTb3VyY2VMb2NhdGlvbiBMb2MsIFR5cGVTb3VyY2VJbmZvICpULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5leHBhbmRlZFBhcmFtZXRlclBhY2tDb250ZXh0IFVQUEMpOworCisgIC8vLyBcYnJpZWYgSWYgdGhlIGdpdmVuIGV4cHJlc3Npb24gY29udGFpbnMgYW4gdW5leHBhbmRlZCBwYXJhbWV0ZXIKKyAgLy8vIHBhY2ssIGRpYWdub3NlIHRoZSBlcnJvci4KKyAgLy8vCisgIC8vLyBccGFyYW0gRSBUaGUgZXhwcmVzc2lvbiB0aGF0IGlzIGJlaW5nIGNoZWNrZWQgZm9yIHVuZXhwYW5kZWQKKyAgLy8vIHBhcmFtZXRlciBwYWNrcy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgRGlhZ25vc2VVbmV4cGFuZGVkUGFyYW1ldGVyUGFjayhFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICBVbmV4cGFuZGVkUGFyYW1ldGVyUGFja0NvbnRleHQgVVBQQyA9IFVQUENfRXhwcmVzc2lvbik7CisKKyAgLy8vIFxicmllZiBJZiB0aGUgZ2l2ZW4gbmVzdGVkLW5hbWUtc3BlY2lmaWVyIGNvbnRhaW5zIGFuIHVuZXhwYW5kZWQKKyAgLy8vIHBhcmFtZXRlciBwYWNrLCBkaWFnbm9zZSB0aGUgZXJyb3IuCisgIC8vLworICAvLy8gXHBhcmFtIFNTIFRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgdGhhdCBpcyBiZWluZyBjaGVja2VkIGZvcgorICAvLy8gdW5leHBhbmRlZCBwYXJhbWV0ZXIgcGFja3MuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIERpYWdub3NlVW5leHBhbmRlZFBhcmFtZXRlclBhY2soY29uc3QgQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrQ29udGV4dCBVUFBDKTsKKworICAvLy8gXGJyaWVmIElmIHRoZSBnaXZlbiBuYW1lIGNvbnRhaW5zIGFuIHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2ssCisgIC8vLyBkaWFnbm9zZSB0aGUgZXJyb3IuCisgIC8vLworICAvLy8gXHBhcmFtIE5hbWVJbmZvIFRoZSBuYW1lICh3aXRoIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbikgdGhhdAorICAvLy8gaXMgYmVpbmcgY2hlY2tlZCBmb3IgdW5leHBhbmRlZCBwYXJhbWV0ZXIgcGFja3MuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIERpYWdub3NlVW5leHBhbmRlZFBhcmFtZXRlclBhY2soY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmTmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmV4cGFuZGVkUGFyYW1ldGVyUGFja0NvbnRleHQgVVBQQyk7CisKKyAgLy8vIFxicmllZiBJZiB0aGUgZ2l2ZW4gdGVtcGxhdGUgbmFtZSBjb250YWlucyBhbiB1bmV4cGFuZGVkIHBhcmFtZXRlciBwYWNrLAorICAvLy8gZGlhZ25vc2UgdGhlIGVycm9yLgorICAvLy8KKyAgLy8vIFxwYXJhbSBMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBuYW1lLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUZW1wbGF0ZSBUaGUgdGVtcGxhdGUgbmFtZSB0aGF0IGlzIGJlaW5nIGNoZWNrZWQgZm9yIHVuZXhwYW5kZWQKKyAgLy8vIHBhcmFtZXRlciBwYWNrcy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgRGlhZ25vc2VVbmV4cGFuZGVkUGFyYW1ldGVyUGFjayhTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZU5hbWUgVGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmV4cGFuZGVkUGFyYW1ldGVyUGFja0NvbnRleHQgVVBQQyk7CisKKyAgLy8vIFxicmllZiBJZiB0aGUgZ2l2ZW4gdGVtcGxhdGUgYXJndW1lbnQgY29udGFpbnMgYW4gdW5leHBhbmRlZCBwYXJhbWV0ZXIKKyAgLy8vIHBhY2ssIGRpYWdub3NlIHRoZSBlcnJvci4KKyAgLy8vCisgIC8vLyBccGFyYW0gQXJnIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCB0aGF0IGlzIGJlaW5nIGNoZWNrZWQgZm9yIHVuZXhwYW5kZWQKKyAgLy8vIHBhcmFtZXRlciBwYWNrcy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgRGlhZ25vc2VVbmV4cGFuZGVkUGFyYW1ldGVyUGFjayhUZW1wbGF0ZUFyZ3VtZW50TG9jIEFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrQ29udGV4dCBVUFBDKTsKKworICAvLy8gXGJyaWVmIENvbGxlY3QgdGhlIHNldCBvZiB1bmV4cGFuZGVkIHBhcmFtZXRlciBwYWNrcyB3aXRoaW4gdGhlIGdpdmVuCisgIC8vLyB0ZW1wbGF0ZSBhcmd1bWVudC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQXJnIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCB0aGF0IHdpbGwgYmUgdHJhdmVyc2VkIHRvIGZpbmQKKyAgLy8vIHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2tzLgorICB2b2lkIGNvbGxlY3RVbmV4cGFuZGVkUGFyYW1ldGVyUGFja3MoVGVtcGxhdGVBcmd1bWVudCBBcmcsCisgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFVuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrPiAmVW5leHBhbmRlZCk7CisKKyAgLy8vIFxicmllZiBDb2xsZWN0IHRoZSBzZXQgb2YgdW5leHBhbmRlZCBwYXJhbWV0ZXIgcGFja3Mgd2l0aGluIHRoZSBnaXZlbgorICAvLy8gdGVtcGxhdGUgYXJndW1lbnQuCisgIC8vLworICAvLy8gXHBhcmFtIEFyZyBUaGUgdGVtcGxhdGUgYXJndW1lbnQgdGhhdCB3aWxsIGJlIHRyYXZlcnNlZCB0byBmaW5kCisgIC8vLyB1bmV4cGFuZGVkIHBhcmFtZXRlciBwYWNrcy4KKyAgdm9pZCBjb2xsZWN0VW5leHBhbmRlZFBhcmFtZXRlclBhY2tzKFRlbXBsYXRlQXJndW1lbnRMb2MgQXJnLAorICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VW5leHBhbmRlZFBhcmFtZXRlclBhY2s+ICZVbmV4cGFuZGVkKTsKKworICAvLy8gXGJyaWVmIENvbGxlY3QgdGhlIHNldCBvZiB1bmV4cGFuZGVkIHBhcmFtZXRlciBwYWNrcyB3aXRoaW4gdGhlIGdpdmVuCisgIC8vLyB0eXBlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUIFRoZSB0eXBlIHRoYXQgd2lsbCBiZSB0cmF2ZXJzZWQgdG8gZmluZAorICAvLy8gdW5leHBhbmRlZCBwYXJhbWV0ZXIgcGFja3MuCisgIHZvaWQgY29sbGVjdFVuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrcyhRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaz4gJlVuZXhwYW5kZWQpOworCisgIC8vLyBcYnJpZWYgQ29sbGVjdCB0aGUgc2V0IG9mIHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2tzIHdpdGhpbiB0aGUgZ2l2ZW4KKyAgLy8vIHR5cGUuCisgIC8vLworICAvLy8gXHBhcmFtIFRMIFRoZSB0eXBlIHRoYXQgd2lsbCBiZSB0cmF2ZXJzZWQgdG8gZmluZAorICAvLy8gdW5leHBhbmRlZCBwYXJhbWV0ZXIgcGFja3MuCisgIHZvaWQgY29sbGVjdFVuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrcyhUeXBlTG9jIFRMLAorICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaz4gJlVuZXhwYW5kZWQpOworCisgIC8vLyBcYnJpZWYgQ29sbGVjdCB0aGUgc2V0IG9mIHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2tzIHdpdGhpbiB0aGUgZ2l2ZW4KKyAgLy8vIG5lc3RlZC1uYW1lLXNwZWNpZmllci4KKyAgLy8vCisgIC8vLyBccGFyYW0gTk5TIFRoZSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIgdGhhdCB3aWxsIGJlIHRyYXZlcnNlZCB0byBmaW5kCisgIC8vLyB1bmV4cGFuZGVkIHBhcmFtZXRlciBwYWNrcy4KKyAgdm9pZCBjb2xsZWN0VW5leHBhbmRlZFBhcmFtZXRlclBhY2tzKE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgTk5TLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaz4gJlVuZXhwYW5kZWQpOworCisgIC8vLyBcYnJpZWYgQ29sbGVjdCB0aGUgc2V0IG9mIHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2tzIHdpdGhpbiB0aGUgZ2l2ZW4KKyAgLy8vIG5hbWUuCisgIC8vLworICAvLy8gXHBhcmFtIE5hbWVJbmZvIFRoZSBuYW1lIHRoYXQgd2lsbCBiZSB0cmF2ZXJzZWQgdG8gZmluZAorICAvLy8gdW5leHBhbmRlZCBwYXJhbWV0ZXIgcGFja3MuCisgIHZvaWQgY29sbGVjdFVuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrcyhjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZOYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VW5leHBhbmRlZFBhcmFtZXRlclBhY2s+ICZVbmV4cGFuZGVkKTsKKworICAvLy8gXGJyaWVmIEludm9rZWQgd2hlbiBwYXJzaW5nIGEgdGVtcGxhdGUgYXJndW1lbnQgZm9sbG93ZWQgYnkgYW4KKyAgLy8vIGVsbGlwc2lzLCB3aGljaCBjcmVhdGVzIGEgcGFjayBleHBhbnNpb24uCisgIC8vLworICAvLy8gXHBhcmFtIEFyZyBUaGUgdGVtcGxhdGUgYXJndW1lbnQgcHJlY2VkaW5nIHRoZSBlbGxpcHNpcywgd2hpY2gKKyAgLy8vIG1heSBhbHJlYWR5IGJlIGludmFsaWQuCisgIC8vLworICAvLy8gXHBhcmFtIEVsbGlwc2lzTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgZWxsaXBzaXMuCisgIFBhcnNlZFRlbXBsYXRlQXJndW1lbnQgQWN0T25QYWNrRXhwYW5zaW9uKGNvbnN0IFBhcnNlZFRlbXBsYXRlQXJndW1lbnQgJkFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MpOworCisgIC8vLyBcYnJpZWYgSW52b2tlZCB3aGVuIHBhcnNpbmcgYSB0eXBlIGZvbGxvd2VkIGJ5IGFuIGVsbGlwc2lzLCB3aGljaAorICAvLy8gY3JlYXRlcyBhIHBhY2sgZXhwYW5zaW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUeXBlIFRoZSB0eXBlIHByZWNlZGluZyB0aGUgZWxsaXBzaXMsIHdoaWNoIHdpbGwgYmVjb21lCisgIC8vLyB0aGUgcGF0dGVybiBvZiB0aGUgcGFjayBleHBhbnNpb24uCisgIC8vLworICAvLy8gXHBhcmFtIEVsbGlwc2lzTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgZWxsaXBzaXMuCisgIFR5cGVSZXN1bHQgQWN0T25QYWNrRXhwYW5zaW9uKFBhcnNlZFR5cGUgVHlwZSwgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MpOworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgcGFjayBleHBhbnNpb24gdHlwZSBmcm9tIHRoZSBwYXR0ZXJuIG9mIHRoZSBwYWNrCisgIC8vLyBleHBhbnNpb24uCisgIFR5cGVTb3VyY2VJbmZvICpDaGVja1BhY2tFeHBhbnNpb24oVHlwZVNvdXJjZUluZm8gKlBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8dW5zaWduZWQ+IE51bUV4cGFuc2lvbnMpOworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgcGFjayBleHBhbnNpb24gdHlwZSBmcm9tIHRoZSBwYXR0ZXJuIG9mIHRoZSBwYWNrCisgIC8vLyBleHBhbnNpb24uCisgIFF1YWxUeXBlIENoZWNrUGFja0V4cGFuc2lvbihRdWFsVHlwZSBQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgUGF0dGVyblJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDx1bnNpZ25lZD4gTnVtRXhwYW5zaW9ucyk7CisKKyAgLy8vIFxicmllZiBJbnZva2VkIHdoZW4gcGFyc2luZyBhbiBleHByZXNzaW9uIGZvbGxvd2VkIGJ5IGFuIGVsbGlwc2lzLCB3aGljaAorICAvLy8gY3JlYXRlcyBhIHBhY2sgZXhwYW5zaW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBQYXR0ZXJuIFRoZSBleHByZXNzaW9uIHByZWNlZGluZyB0aGUgZWxsaXBzaXMsIHdoaWNoIHdpbGwgYmVjb21lCisgIC8vLyB0aGUgcGF0dGVybiBvZiB0aGUgcGFjayBleHBhbnNpb24uCisgIC8vLworICAvLy8gXHBhcmFtIEVsbGlwc2lzTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgZWxsaXBzaXMuCisgIEV4cHJSZXN1bHQgQWN0T25QYWNrRXhwYW5zaW9uKEV4cHIgKlBhdHRlcm4sIFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jKTsKKworICAvLy8gXGJyaWVmIEludm9rZWQgd2hlbiBwYXJzaW5nIGFuIGV4cHJlc3Npb24gZm9sbG93ZWQgYnkgYW4gZWxsaXBzaXMsIHdoaWNoCisgIC8vLyBjcmVhdGVzIGEgcGFjayBleHBhbnNpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFBhdHRlcm4gVGhlIGV4cHJlc3Npb24gcHJlY2VkaW5nIHRoZSBlbGxpcHNpcywgd2hpY2ggd2lsbCBiZWNvbWUKKyAgLy8vIHRoZSBwYXR0ZXJuIG9mIHRoZSBwYWNrIGV4cGFuc2lvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gRWxsaXBzaXNMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBlbGxpcHNpcy4KKyAgRXhwclJlc3VsdCBDaGVja1BhY2tFeHBhbnNpb24oRXhwciAqUGF0dGVybiwgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHVuc2lnbmVkPiBOdW1FeHBhbnNpb25zKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHdlIGNvdWxkIGV4cGFuZCBhIHBhY2sgZXhwYW5zaW9uIHdpdGggdGhlCisgIC8vLyBnaXZlbiBzZXQgb2YgcGFyYW1ldGVyIHBhY2tzIGludG8gc2VwYXJhdGUgYXJndW1lbnRzIGJ5IHJlcGVhdGVkbHkKKyAgLy8vIHRyYW5zZm9ybWluZyB0aGUgcGF0dGVybi4KKyAgLy8vCisgIC8vLyBccGFyYW0gRWxsaXBzaXNMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBlbGxpcHNpcyB0aGF0IGlkZW50aWZpZXMgdGhlCisgIC8vLyBwYWNrIGV4cGFuc2lvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gUGF0dGVyblJhbmdlIFRoZSBzb3VyY2UgcmFuZ2UgdGhhdCBjb3ZlcnMgdGhlIGVudGlyZSBwYXR0ZXJuIG9mCisgIC8vLyB0aGUgcGFjayBleHBhbnNpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFVuZXhwYW5kZWQgVGhlIHNldCBvZiB1bmV4cGFuZGVkIHBhcmFtZXRlciBwYWNrcyB3aXRoaW4gdGhlCisgIC8vLyBwYXR0ZXJuLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTaG91bGRFeHBhbmQgV2lsbCBiZSBzZXQgdG8gXGMgdHJ1ZSBpZiB0aGUgdHJhbnNmb3JtZXIgc2hvdWxkCisgIC8vLyBleHBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgcGFjayBleHBhbnNpb25zIGludG8gc2VwYXJhdGUgYXJndW1lbnRzLiBXaGVuCisgIC8vLyBzZXQsIFxjIE51bUV4cGFuc2lvbnMgbXVzdCBhbHNvIGJlIHNldC4KKyAgLy8vCisgIC8vLyBccGFyYW0gUmV0YWluRXhwYW5zaW9uIFdoZXRoZXIgdGhlIGNhbGxlciBzaG91bGQgYWRkIGFuIHVuZXhwYW5kZWQKKyAgLy8vIHBhY2sgZXhwYW5zaW9uIGFmdGVyIGFsbCBvZiB0aGUgZXhwYW5kZWQgYXJndW1lbnRzLiBUaGlzIGlzIHVzZWQKKyAgLy8vIHdoZW4gZXh0ZW5kaW5nIGV4cGxpY2l0bHktc3BlY2lmaWVkIHRlbXBsYXRlIGFyZ3VtZW50IHBhY2tzIHBlcgorICAvLy8gQysrMHggW3RlbXAuYXJnLmV4cGxpY2l0XXA5LgorICAvLy8KKyAgLy8vIFxwYXJhbSBOdW1FeHBhbnNpb25zIFRoZSBudW1iZXIgb2Ygc2VwYXJhdGUgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBpbgorICAvLy8gdGhlIGV4cGFuZGVkIGZvcm0gb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFjayBleHBhbnNpb24uIFRoaXMgaXMgYm90aCBhbgorICAvLy8gaW5wdXQgYW5kIGFuIG91dHB1dCBwYXJhbWV0ZXIsIHdoaWNoIGNhbiBiZSBzZXQgYnkgdGhlIGNhbGxlciBpZiB0aGUKKyAgLy8vIG51bWJlciBvZiBleHBhbnNpb25zIGlzIGtub3duIGEgcHJpb3JpIChlLmcuLCBkdWUgdG8gYSBwcmlvciBzdWJzdGl0dXRpb24pCisgIC8vLyBhbmQgd2lsbCBiZSBzZXQgYnkgdGhlIGNhbGxlZSB3aGVuIHRoZSBudW1iZXIgb2YgZXhwYW5zaW9ucyBpcyBrbm93bi4KKyAgLy8vIFRoZSBjYWxsZWUgbXVzdCBzZXQgdGhpcyB2YWx1ZSB3aGVuIFxjIFNob3VsZEV4cGFuZCBpcyBcYyB0cnVlOyBpdCBtYXkKKyAgLy8vIHNldCB0aGlzIHZhbHVlIGluIG90aGVyIGNhc2VzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQgKGUuZy4sIGJlY2F1c2UgdGhlIHBhcmFtZXRlciBwYWNrcworICAvLy8gYXJlIHRvIGJlIGluc3RhbnRpYXRlZCB3aXRoIGFyZ3VtZW50cyBvZiBkaWZmZXJlbnQgbGVuZ3RocyksIGZhbHNlCisgIC8vLyBvdGhlcndpc2UuIElmIGZhbHNlLCBcYyBTaG91bGRFeHBhbmQgKGFuZCBwb3NzaWJseSBcYyBOdW1FeHBhbnNpb25zKQorICAvLy8gbXVzdCBiZSBzZXQuCisgIGJvb2wgQ2hlY2tQYXJhbWV0ZXJQYWNrc0ZvckV4cGFuc2lvbihTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFBhdHRlcm5SYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VW5leHBhbmRlZFBhcmFtZXRlclBhY2s+IFVuZXhwYW5kZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmU2hvdWxkRXhwYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmUmV0YWluRXhwYW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8dW5zaWduZWQ+ICZOdW1FeHBhbnNpb25zKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiB0aGUgZ2l2ZW4gcGFjayBleHBhbnNpb24KKyAgLy8vIHR5cGUuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiB0aGUgZXhwYW5zaW9uIGlzCisgIC8vLyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgb2YgdGhlIHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2tzIGluIGl0cyBwYXR0ZXJuLgorICAvLy8KKyAgLy8vIFJldHVybnMgYW4gZW1wdHkgT3B0aW9uYWwgaWYgdGhlIHR5cGUgY2FuJ3QgYmUgZXhwYW5kZWQuCisgIE9wdGlvbmFsPHVuc2lnbmVkPiBnZXROdW1Bcmd1bWVudHNJbkV4cGFuc2lvbihRdWFsVHlwZSBULAorICAgICAgY29uc3QgTXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MpOworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGRlY2xhcmF0b3IgY29udGFpbnMgYW55IHVuZXhwYW5kZWQKKyAgLy8vIHBhcmFtZXRlciBwYWNrcy4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgaXMgdXNlZCBieSB0aGUgcGFyc2VyIHRvIGRpc2FtYmlndWF0ZSBmdW5jdGlvbiBkZWNsYXJhdG9ycworICAvLy8gd2l0aCBhbiBlbGxpcHNpcyBwcmlvciB0byB0aGUgJyknLCBlLmcuLAorICAvLy8KKyAgLy8vIFxjb2RlCisgIC8vLyAgIHZvaWQgZihULi4uKTsKKyAgLy8vIFxlbmRjb2RlCisgIC8vLworICAvLy8gVG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgaGF2ZSBhbiAodW5uYW1lZCkgZnVuY3Rpb24gcGFyYW1ldGVyIHBhY2sgb3IKKyAgLy8vIGEgdmFyaWFkaWMgZnVuY3Rpb24uCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGUgZGVjbGFyYXRvciBjb250YWlucyBhbnkgdW5leHBhbmRlZCBwYXJhbWV0ZXIgcGFja3MsCisgIC8vLyBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgY29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFja3MoRGVjbGFyYXRvciAmRCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBwYXR0ZXJuIG9mIHRoZSBwYWNrIGV4cGFuc2lvbiBmb3IgYSB0ZW1wbGF0ZSBhcmd1bWVudC4KKyAgLy8vCisgIC8vLyBccGFyYW0gT3JpZ0xvYyBUaGUgdGVtcGxhdGUgYXJndW1lbnQgdG8gZXhwYW5kLgorICAvLy8KKyAgLy8vIFxwYXJhbSBFbGxpcHNpcyBXaWxsIGJlIHNldCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGVsbGlwc2lzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOdW1FeHBhbnNpb25zIFdpbGwgYmUgc2V0IHRvIHRoZSBudW1iZXIgb2YgZXhwYW5zaW9ucyB0aGF0IHdpbGwKKyAgLy8vIGJlIGdlbmVyYXRlZCBmcm9tIHRoaXMgcGFjayBleHBhbnNpb24sIGlmIGtub3duIGEgcHJpb3JpLgorICBUZW1wbGF0ZUFyZ3VtZW50TG9jIGdldFRlbXBsYXRlQXJndW1lbnRQYWNrRXhwYW5zaW9uUGF0dGVybigKKyAgICAgIFRlbXBsYXRlQXJndW1lbnRMb2MgT3JpZ0xvYywKKyAgICAgIFNvdXJjZUxvY2F0aW9uICZFbGxpcHNpcywKKyAgICAgIE9wdGlvbmFsPHVuc2lnbmVkPiAmTnVtRXhwYW5zaW9ucykgY29uc3Q7CisKKyAgLy8vIEdpdmVuIGEgdGVtcGxhdGUgYXJndW1lbnQgdGhhdCBjb250YWlucyBhbiB1bmV4cGFuZGVkIHBhcmFtZXRlciBwYWNrLCBidXQKKyAgLy8vIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gc3Vic3RpdHV0ZWQsIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YKKyAgLy8vIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBwcm9kdWNlZCBvbmNlIHRoaXMgYXJndW1lbnQgaXMgZnVsbHktZXhwYW5kZWQuCisgIC8vLworICAvLy8gVGhpcyBpcyBpbnRlbmRlZCBmb3IgdXNlIHdoZW4gdHJhbnNmb3JtaW5nICdzaXplb2YuLi4oQXJnKScgaW4gb3JkZXIgdG8KKyAgLy8vIGF2b2lkIGFjdHVhbGx5IGV4cGFuZGluZyB0aGUgcGFjayB3aGVyZSBwb3NzaWJsZS4KKyAgT3B0aW9uYWw8dW5zaWduZWQ+IGdldEZ1bGx5UGFja0V4cGFuZGVkU2l6ZShUZW1wbGF0ZUFyZ3VtZW50IEFyZyk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEMrKyBUZW1wbGF0ZSBBcmd1bWVudCBEZWR1Y3Rpb24gKEMrKyBbdGVtcC5kZWR1Y3RdKQorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gQWRqdXN0IHRoZSB0eXBlIFxwIEFyZ0Z1bmN0aW9uVHlwZSB0byBtYXRjaCB0aGUgY2FsbGluZyBjb252ZW50aW9uLAorICAvLy8gbm9yZXR1cm4sIGFuZCBvcHRpb25hbGx5IHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBvZiBccCBGdW5jdGlvblR5cGUuCisgIC8vLyBEZWR1Y3Rpb24gb2Z0ZW4gd2FudHMgdG8gaWdub3JlIHRoZXNlIHByb3BlcnRpZXMgd2hlbiBtYXRjaGluZyBmdW5jdGlvbgorICAvLy8gdHlwZXMuCisgIFF1YWxUeXBlIGFkanVzdENDQW5kTm9SZXR1cm4oUXVhbFR5cGUgQXJnRnVuY3Rpb25UeXBlLCBRdWFsVHlwZSBGdW5jdGlvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBZGp1c3RFeGNlcHRpb25TcGVjID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgRGVzY3JpYmVzIHRoZSByZXN1bHQgb2YgdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uLgorICAvLy8KKyAgLy8vIFRoZSBUZW1wbGF0ZURlZHVjdGlvblJlc3VsdCBlbnVtZXJhdGlvbiBkZXNjcmliZXMgdGhlIHJlc3VsdCBvZgorICAvLy8gdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uLCBhcyByZXR1cm5lZCBmcm9tCisgIC8vLyBEZWR1Y2VUZW1wbGF0ZUFyZ3VtZW50cygpLiBUaGUgc2VwYXJhdGUgVGVtcGxhdGVEZWR1Y3Rpb25JbmZvCisgIC8vLyBzdHJ1Y3R1cmUgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVzdWx0cyBvZgorICAvLy8gdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uLCBlLmcuLCB0aGUgZGVkdWNlZCB0ZW1wbGF0ZSBhcmd1bWVudAorICAvLy8gbGlzdCAoaWYgc3VjY2Vzc2Z1bCkgb3IgdGhlIHNwZWNpZmljIHRlbXBsYXRlIHBhcmFtZXRlcnMgb3IKKyAgLy8vIGRlZHVjZWQgYXJndW1lbnRzIHRoYXQgd2VyZSBpbnZvbHZlZCBpbiB0aGUgZmFpbHVyZS4KKyAgZW51bSBUZW1wbGF0ZURlZHVjdGlvblJlc3VsdCB7CisgICAgLy8vIFxicmllZiBUZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgVERLX1N1Y2Nlc3MgPSAwLAorICAgIC8vLyBcYnJpZWYgVGhlIGRlY2xhcmF0aW9uIHdhcyBpbnZhbGlkOyBkbyBub3RoaW5nLgorICAgIFRES19JbnZhbGlkLAorICAgIC8vLyBcYnJpZWYgVGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uIGV4Y2VlZGVkIHRoZSBtYXhpbXVtIHRlbXBsYXRlCisgICAgLy8vIGluc3RhbnRpYXRpb24gZGVwdGggKHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gZGlhZ25vc2VkKS4KKyAgICBUREtfSW5zdGFudGlhdGlvbkRlcHRoLAorICAgIC8vLyBcYnJpZWYgVGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uIGRpZCBub3QgZGVkdWNlIGEgdmFsdWUKKyAgICAvLy8gZm9yIGV2ZXJ5IHRlbXBsYXRlIHBhcmFtZXRlci4KKyAgICBUREtfSW5jb21wbGV0ZSwKKyAgICAvLy8gXGJyaWVmIFRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbiBwcm9kdWNlZCBpbmNvbnNpc3RlbnQKKyAgICAvLy8gZGVkdWNlZCB2YWx1ZXMgZm9yIHRoZSBnaXZlbiB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCisgICAgVERLX0luY29uc2lzdGVudCwKKyAgICAvLy8gXGJyaWVmIFRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbiBmYWlsZWQgZHVlIHRvIGluY29uc2lzdGVudAorICAgIC8vLyBjdi1xdWFsaWZpZXJzIG9uIGEgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGUgdGhhdCB3b3VsZAorICAgIC8vLyBvdGhlcndpc2UgYmUgZGVkdWNlZCwgZS5nLiwgd2UgdHJpZWQgdG8gZGVkdWNlIFQgaW4gImNvbnN0IFQiCisgICAgLy8vIGJ1dCB3ZXJlIGdpdmVuIGEgbm9uLWNvbnN0ICJYIi4KKyAgICBUREtfVW5kZXJxdWFsaWZpZWQsCisgICAgLy8vIFxicmllZiBTdWJzdGl0dXRpb24gb2YgdGhlIGRlZHVjZWQgdGVtcGxhdGUgYXJndW1lbnQgdmFsdWVzCisgICAgLy8vIHJlc3VsdGVkIGluIGFuIGVycm9yLgorICAgIFRES19TdWJzdGl0dXRpb25GYWlsdXJlLAorICAgIC8vLyBcYnJpZWYgQWZ0ZXIgc3Vic3RpdHV0aW5nIGRlZHVjZWQgdGVtcGxhdGUgYXJndW1lbnRzLCBhIGRlcGVuZGVudAorICAgIC8vLyBwYXJhbWV0ZXIgdHlwZSBkaWQgbm90IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50LgorICAgIFRES19EZWR1Y2VkTWlzbWF0Y2gsCisgICAgLy8vIFxicmllZiBBZnRlciBzdWJzdGl0dXRpbmcgZGVkdWNlZCB0ZW1wbGF0ZSBhcmd1bWVudHMsIGFuIGVsZW1lbnQgb2YKKyAgICAvLy8gYSBkZXBlbmRlbnQgcGFyYW1ldGVyIHR5cGUgZGlkIG5vdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50CisgICAgLy8vIG9mIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50ICh3aGVuIGRlZHVjaW5nIGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdCkuCisgICAgVERLX0RlZHVjZWRNaXNtYXRjaE5lc3RlZCwKKyAgICAvLy8gXGJyaWVmIEEgbm9uLWRlcG5lZGVudCBjb21wb25lbnQgb2YgdGhlIHBhcmFtZXRlciBkaWQgbm90IG1hdGNoIHRoZQorICAgIC8vLyBjb3JyZXNwb25kaW5nIGNvbXBvbmVudCBvZiB0aGUgYXJndW1lbnQuCisgICAgVERLX05vbkRlZHVjZWRNaXNtYXRjaCwKKyAgICAvLy8gXGJyaWVmIFdoZW4gcGVyZm9ybWluZyB0ZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24gZm9yIGEgZnVuY3Rpb24KKyAgICAvLy8gdGVtcGxhdGUsIHRoZXJlIHdlcmUgdG9vIG1hbnkgY2FsbCBhcmd1bWVudHMuCisgICAgVERLX1Rvb01hbnlBcmd1bWVudHMsCisgICAgLy8vIFxicmllZiBXaGVuIHBlcmZvcm1pbmcgdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uIGZvciBhIGZ1bmN0aW9uCisgICAgLy8vIHRlbXBsYXRlLCB0aGVyZSB3ZXJlIHRvbyBmZXcgY2FsbCBhcmd1bWVudHMuCisgICAgVERLX1Rvb0Zld0FyZ3VtZW50cywKKyAgICAvLy8gXGJyaWVmIFRoZSBleHBsaWNpdGx5LXNwZWNpZmllZCB0ZW1wbGF0ZSBhcmd1bWVudHMgd2VyZSBub3QgdmFsaWQKKyAgICAvLy8gdGVtcGxhdGUgYXJndW1lbnRzIGZvciB0aGUgZ2l2ZW4gdGVtcGxhdGUuCisgICAgVERLX0ludmFsaWRFeHBsaWNpdEFyZ3VtZW50cywKKyAgICAvLy8gXGJyaWVmIENoZWNraW5nIG5vbi1kZXBlbmRlbnQgYXJndW1lbnQgY29udmVyc2lvbnMgZmFpbGVkLgorICAgIFRES19Ob25EZXBlbmRlbnRDb252ZXJzaW9uRmFpbHVyZSwKKyAgICAvLy8gXGJyaWVmIERlZHVjdGlvbiBmYWlsZWQ7IHRoYXQncyBhbGwgd2Uga25vdy4KKyAgICBUREtfTWlzY2VsbGFuZW91c0RlZHVjdGlvbkZhaWx1cmUsCisgICAgLy8vIFxicmllZiBDVURBIFRhcmdldCBhdHRyaWJ1dGVzIGRvIG5vdCBtYXRjaC4KKyAgICBUREtfQ1VEQVRhcmdldE1pc21hdGNoCisgIH07CisKKyAgVGVtcGxhdGVEZWR1Y3Rpb25SZXN1bHQKKyAgRGVkdWNlVGVtcGxhdGVBcmd1bWVudHMoQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKlBhcnRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWE6OlRlbXBsYXRlRGVkdWN0aW9uSW5mbyAmSW5mbyk7CisKKyAgVGVtcGxhdGVEZWR1Y3Rpb25SZXN1bHQKKyAgRGVkdWNlVGVtcGxhdGVBcmd1bWVudHMoVmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsICpQYXJ0aWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hOjpUZW1wbGF0ZURlZHVjdGlvbkluZm8gJkluZm8pOworCisgIFRlbXBsYXRlRGVkdWN0aW9uUmVzdWx0IFN1YnN0aXR1dGVFeHBsaWNpdFRlbXBsYXRlQXJndW1lbnRzKAorICAgICAgRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkZ1bmN0aW9uVGVtcGxhdGUsCisgICAgICBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gJkV4cGxpY2l0VGVtcGxhdGVBcmdzLAorICAgICAgU21hbGxWZWN0b3JJbXBsPERlZHVjZWRUZW1wbGF0ZUFyZ3VtZW50PiAmRGVkdWNlZCwKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxRdWFsVHlwZT4gJlBhcmFtVHlwZXMsIFF1YWxUeXBlICpGdW5jdGlvblR5cGUsCisgICAgICBzZW1hOjpUZW1wbGF0ZURlZHVjdGlvbkluZm8gJkluZm8pOworCisgIC8vLyBicmllZiBBIGZ1bmN0aW9uIGFyZ3VtZW50IGZyb20gd2hpY2ggd2UgcGVyZm9ybWVkIHRlbXBsYXRlIGFyZ3VtZW50CisgIC8vIGRlZHVjdGlvbiBmb3IgYSBjYWxsLgorICBzdHJ1Y3QgT3JpZ2luYWxDYWxsQXJnIHsKKyAgICBPcmlnaW5hbENhbGxBcmcoUXVhbFR5cGUgT3JpZ2luYWxQYXJhbVR5cGUsIGJvb2wgRGVjb21wb3NlZFBhcmFtLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBcmdJZHgsIFF1YWxUeXBlIE9yaWdpbmFsQXJnVHlwZSkKKyAgICAgICAgOiBPcmlnaW5hbFBhcmFtVHlwZShPcmlnaW5hbFBhcmFtVHlwZSksCisgICAgICAgICAgRGVjb21wb3NlZFBhcmFtKERlY29tcG9zZWRQYXJhbSksIEFyZ0lkeChBcmdJZHgpLAorICAgICAgICAgIE9yaWdpbmFsQXJnVHlwZShPcmlnaW5hbEFyZ1R5cGUpIHt9CisKKyAgICBRdWFsVHlwZSBPcmlnaW5hbFBhcmFtVHlwZTsKKyAgICBib29sIERlY29tcG9zZWRQYXJhbTsKKyAgICB1bnNpZ25lZCBBcmdJZHg7CisgICAgUXVhbFR5cGUgT3JpZ2luYWxBcmdUeXBlOworICB9OworCisgIFRlbXBsYXRlRGVkdWN0aW9uUmVzdWx0IEZpbmlzaFRlbXBsYXRlQXJndW1lbnREZWR1Y3Rpb24oCisgICAgICBGdW5jdGlvblRlbXBsYXRlRGVjbCAqRnVuY3Rpb25UZW1wbGF0ZSwKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxEZWR1Y2VkVGVtcGxhdGVBcmd1bWVudD4gJkRlZHVjZWQsCisgICAgICB1bnNpZ25lZCBOdW1FeHBsaWNpdGx5U3BlY2lmaWVkLCBGdW5jdGlvbkRlY2wgKiZTcGVjaWFsaXphdGlvbiwKKyAgICAgIHNlbWE6OlRlbXBsYXRlRGVkdWN0aW9uSW5mbyAmSW5mbywKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxPcmlnaW5hbENhbGxBcmc+IGNvbnN0ICpPcmlnaW5hbENhbGxBcmdzID0gbnVsbHB0ciwKKyAgICAgIGJvb2wgUGFydGlhbE92ZXJsb2FkaW5nID0gZmFsc2UsCisgICAgICBsbHZtOjpmdW5jdGlvbl9yZWY8Ym9vbCgpPiBDaGVja05vbkRlcGVuZGVudCA9IFtdeyByZXR1cm4gZmFsc2U7IH0pOworCisgIFRlbXBsYXRlRGVkdWN0aW9uUmVzdWx0IERlZHVjZVRlbXBsYXRlQXJndW1lbnRzKAorICAgICAgRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkZ1bmN0aW9uVGVtcGxhdGUsCisgICAgICBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gKkV4cGxpY2l0VGVtcGxhdGVBcmdzLCBBcnJheVJlZjxFeHByICo+IEFyZ3MsCisgICAgICBGdW5jdGlvbkRlY2wgKiZTcGVjaWFsaXphdGlvbiwgc2VtYTo6VGVtcGxhdGVEZWR1Y3Rpb25JbmZvICZJbmZvLAorICAgICAgYm9vbCBQYXJ0aWFsT3ZlcmxvYWRpbmcsCisgICAgICBsbHZtOjpmdW5jdGlvbl9yZWY8Ym9vbChBcnJheVJlZjxRdWFsVHlwZT4pPiBDaGVja05vbkRlcGVuZGVudCk7CisKKyAgVGVtcGxhdGVEZWR1Y3Rpb25SZXN1bHQKKyAgRGVkdWNlVGVtcGxhdGVBcmd1bWVudHMoRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkZ1bmN0aW9uVGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqRXhwbGljaXRUZW1wbGF0ZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIEFyZ0Z1bmN0aW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25EZWNsIComU3BlY2lhbGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWE6OlRlbXBsYXRlRGVkdWN0aW9uSW5mbyAmSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0FkZHJlc3NPZkZ1bmN0aW9uID0gZmFsc2UpOworCisgIFRlbXBsYXRlRGVkdWN0aW9uUmVzdWx0CisgIERlZHVjZVRlbXBsYXRlQXJndW1lbnRzKEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpGdW5jdGlvblRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBUb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENYWENvbnZlcnNpb25EZWNsIComU3BlY2lhbGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWE6OlRlbXBsYXRlRGVkdWN0aW9uSW5mbyAmSW5mbyk7CisKKyAgVGVtcGxhdGVEZWR1Y3Rpb25SZXN1bHQKKyAgRGVkdWNlVGVtcGxhdGVBcmd1bWVudHMoRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkZ1bmN0aW9uVGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqRXhwbGljaXRUZW1wbGF0ZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uRGVjbCAqJlNwZWNpYWxpemF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hOjpUZW1wbGF0ZURlZHVjdGlvbkluZm8gJkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNBZGRyZXNzT2ZGdW5jdGlvbiA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIFN1YnN0aXR1dGUgUmVwbGFjZW1lbnQgZm9yIFxwIGF1dG8gaW4gXHAgVHlwZVdpdGhBdXRvCisgIFF1YWxUeXBlIFN1YnN0QXV0b1R5cGUoUXVhbFR5cGUgVHlwZVdpdGhBdXRvLCBRdWFsVHlwZSBSZXBsYWNlbWVudCk7CisgIC8vLyBcYnJpZWYgU3Vic3RpdHV0ZSBSZXBsYWNlbWVudCBmb3IgYXV0byBpbiBUeXBlV2l0aEF1dG8KKyAgVHlwZVNvdXJjZUluZm8qIFN1YnN0QXV0b1R5cGVTb3VyY2VJbmZvKFR5cGVTb3VyY2VJbmZvICpUeXBlV2l0aEF1dG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBSZXBsYWNlbWVudCk7CisgIC8vLyBcYnJpZWYgQ29tcGxldGVseSByZXBsYWNlIHRoZSBcYyBhdXRvIGluIFxwIFR5cGVXaXRoQXV0byBieQorICAvLy8gXHAgUmVwbGFjZW1lbnQuIFRoaXMgZG9lcyBub3QgcmV0YWluIGFueSBcYyBhdXRvIHR5cGUgc3VnYXIuCisgIFF1YWxUeXBlIFJlcGxhY2VBdXRvVHlwZShRdWFsVHlwZSBUeXBlV2l0aEF1dG8sIFF1YWxUeXBlIFJlcGxhY2VtZW50KTsKKworICAvLy8gXGJyaWVmIFJlc3VsdCB0eXBlIG9mIERlZHVjZUF1dG9UeXBlLgorICBlbnVtIERlZHVjZUF1dG9SZXN1bHQgeworICAgIERBUl9TdWNjZWVkZWQsCisgICAgREFSX0ZhaWxlZCwKKyAgICBEQVJfRmFpbGVkQWxyZWFkeURpYWdub3NlZAorICB9OworCisgIERlZHVjZUF1dG9SZXN1bHQKKyAgRGVkdWNlQXV0b1R5cGUoVHlwZVNvdXJjZUluZm8gKkF1dG9UeXBlLCBFeHByIComSW5pdGlhbGl6ZXIsIFF1YWxUeXBlICZSZXN1bHQsCisgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHVuc2lnbmVkPiBEZXBlbmRlbnREZWR1Y3Rpb25EZXB0aCA9IE5vbmUpOworICBEZWR1Y2VBdXRvUmVzdWx0CisgIERlZHVjZUF1dG9UeXBlKFR5cGVMb2MgQXV0b1R5cGVMb2MsIEV4cHIgKiZJbml0aWFsaXplciwgUXVhbFR5cGUgJlJlc3VsdCwKKyAgICAgICAgICAgICAgICAgT3B0aW9uYWw8dW5zaWduZWQ+IERlcGVuZGVudERlZHVjdGlvbkRlcHRoID0gTm9uZSk7CisgIHZvaWQgRGlhZ25vc2VBdXRvRGVkdWN0aW9uRmFpbHVyZShWYXJEZWNsICpWRGVjbCwgRXhwciAqSW5pdCk7CisgIGJvb2wgRGVkdWNlUmV0dXJuVHlwZShGdW5jdGlvbkRlY2wgKkZELCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpYWdub3NlID0gdHJ1ZSk7CisKKyAgLy8vIFxicmllZiBEZWNsYXJlIGltcGxpY2l0IGRlZHVjdGlvbiBndWlkZXMgZm9yIGEgY2xhc3MgdGVtcGxhdGUgaWYgd2UndmUKKyAgLy8vIG5vdCBhbHJlYWR5IGRvbmUgc28uCisgIHZvaWQgRGVjbGFyZUltcGxpY2l0RGVkdWN0aW9uR3VpZGVzKFRlbXBsYXRlRGVjbCAqVGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYyk7CisKKyAgUXVhbFR5cGUgRGVkdWNlVGVtcGxhdGVTcGVjaWFsaXphdGlvbkZyb21Jbml0aWFsaXplcigKKyAgICAgIFR5cGVTb3VyY2VJbmZvICpUSW5mbywgY29uc3QgSW5pdGlhbGl6ZWRFbnRpdHkgJkVudGl0eSwKKyAgICAgIGNvbnN0IEluaXRpYWxpemF0aW9uS2luZCAmS2luZCwgTXVsdGlFeHByQXJnIEluaXQpOworCisgIFF1YWxUeXBlIGRlZHVjZVZhclR5cGVGcm9tSW5pdGlhbGl6ZXIoVmFyRGVjbCAqVkRlY2wsIERlY2xhcmF0aW9uTmFtZSBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFR5cGUsIFR5cGVTb3VyY2VJbmZvICpUU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgUmFuZ2UsIGJvb2wgRGlyZWN0SW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpJbml0KTsKKworICBUeXBlTG9jIGdldFJldHVyblR5cGVMb2MoRnVuY3Rpb25EZWNsICpGRCkgY29uc3Q7CisKKyAgYm9vbCBEZWR1Y2VGdW5jdGlvblR5cGVGcm9tUmV0dXJuRXhwcihGdW5jdGlvbkRlY2wgKkZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJldHVybkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByIComUmV0RXhwciwgQXV0b1R5cGUgKkFUKTsKKworICBGdW5jdGlvblRlbXBsYXRlRGVjbCAqZ2V0TW9yZVNwZWNpYWxpemVkVGVtcGxhdGUoRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkZUMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpGVDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJ0aWFsT3JkZXJpbmdDb250ZXh0IFRQT0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DYWxsQXJndW1lbnRzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNhbGxBcmd1bWVudHMyKTsKKyAgVW5yZXNvbHZlZFNldEl0ZXJhdG9yCisgIGdldE1vc3RTcGVjaWFsaXplZChVbnJlc29sdmVkU2V0SXRlcmF0b3IgU0JlZ2luLCBVbnJlc29sdmVkU2V0SXRlcmF0b3IgU0VuZCwKKyAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlU3BlY0NhbmRpZGF0ZVNldCAmRmFpbGVkQ2FuZGlkYXRlcywKKyAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZOb25lRGlhZywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZBbWJpZ0RpYWcsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmQ2FuZGlkYXRlRGlhZywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4gPSB0cnVlLCBRdWFsVHlwZSBUYXJnZXRUeXBlID0gUXVhbFR5cGUoKSk7CisKKyAgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKgorICBnZXRNb3JlU3BlY2lhbGl6ZWRQYXJ0aWFsU3BlY2lhbGl6YXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKlBTMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqUFMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYyk7CisKKyAgYm9vbCBpc01vcmVTcGVjaWFsaXplZFRoYW5QcmltYXJ5KENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsICpULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYTo6VGVtcGxhdGVEZWR1Y3Rpb25JbmZvICZJbmZvKTsKKworICBWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKmdldE1vcmVTcGVjaWFsaXplZFBhcnRpYWxTcGVjaWFsaXphdGlvbigKKyAgICAgIFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqUFMxLAorICAgICAgVmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsICpQUzIsIFNvdXJjZUxvY2F0aW9uIExvYyk7CisKKyAgYm9vbCBpc01vcmVTcGVjaWFsaXplZFRoYW5QcmltYXJ5KFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWE6OlRlbXBsYXRlRGVkdWN0aW9uSW5mbyAmSW5mbyk7CisKKyAgYm9vbCBpc1RlbXBsYXRlVGVtcGxhdGVQYXJhbWV0ZXJBdExlYXN0QXNTcGVjaWFsaXplZEFzKAorICAgICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpQLCBUZW1wbGF0ZURlY2wgKkFBcmcsIFNvdXJjZUxvY2F0aW9uIExvYyk7CisKKyAgdm9pZCBNYXJrVXNlZFRlbXBsYXRlUGFyYW1ldGVycyhjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT25seURlZHVjZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxCaXRWZWN0b3IgJlVzZWQpOworICB2b2lkIE1hcmtEZWR1Y2VkVGVtcGxhdGVQYXJhbWV0ZXJzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpGdW5jdGlvblRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsQml0VmVjdG9yICZEZWR1Y2VkKSB7CisgICAgcmV0dXJuIE1hcmtEZWR1Y2VkVGVtcGxhdGVQYXJhbWV0ZXJzKENvbnRleHQsIEZ1bmN0aW9uVGVtcGxhdGUsIERlZHVjZWQpOworICB9CisgIHN0YXRpYyB2b2lkIE1hcmtEZWR1Y2VkVGVtcGxhdGVQYXJhbWV0ZXJzKEFTVENvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvblRlbXBsYXRlRGVjbCAqRnVuY3Rpb25UZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTbWFsbEJpdFZlY3RvciAmRGVkdWNlZCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEMrKyBUZW1wbGF0ZSBJbnN0YW50aWF0aW9uCisgIC8vCisKKyAgTXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0CisgIGdldFRlbXBsYXRlSW5zdGFudGlhdGlvbkFyZ3MoTmFtZWREZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0ICpJbm5lcm1vc3QgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVsYXRpdmVUb1ByaW1hcnkgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkRlY2wgKlBhdHRlcm4gPSBudWxscHRyKTsKKworICAvLy8gQSBjb250ZXh0IGluIHdoaWNoIGNvZGUgaXMgYmVpbmcgc3ludGhlc2l6ZWQgKHdoZXJlIGEgc291cmNlIGxvY2F0aW9uCisgIC8vLyBhbG9uZSBpcyBub3Qgc3VmZmljaWVudCB0byBpZGVudGlmeSB0aGUgY29udGV4dCkuIFRoaXMgY292ZXJzIHRlbXBsYXRlCisgIC8vLyBpbnN0YW50aWF0aW9uIGFuZCB2YXJpb3VzIGZvcm1zIG9mIGltcGxpY2l0bHktZ2VuZXJhdGVkIGZ1bmN0aW9ucy4KKyAgc3RydWN0IENvZGVTeW50aGVzaXNDb250ZXh0IHsKKyAgICAvLy8gXGJyaWVmIFRoZSBraW5kIG9mIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gd2UgYXJlIHBlcmZvcm1pbmcKKyAgICBlbnVtIFN5bnRoZXNpc0tpbmQgeworICAgICAgLy8vIFdlIGFyZSBpbnN0YW50aWF0aW5nIGEgdGVtcGxhdGUgZGVjbGFyYXRpb24uIFRoZSBlbnRpdHkgaXMKKyAgICAgIC8vLyB0aGUgZGVjbGFyYXRpb24gd2UncmUgaW5zdGFudGlhdGluZyAoZS5nLiwgYSBDWFhSZWNvcmREZWNsKS4KKyAgICAgIFRlbXBsYXRlSW5zdGFudGlhdGlvbiwKKworICAgICAgLy8vIFdlIGFyZSBpbnN0YW50aWF0aW5nIGEgZGVmYXVsdCBhcmd1bWVudCBmb3IgYSB0ZW1wbGF0ZQorICAgICAgLy8vIHBhcmFtZXRlci4gVGhlIEVudGl0eSBpcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIHdob3NlIGFyZ3VtZW50IGlzCisgICAgICAvLy8gYmVpbmcgaW5zdGFudGlhdGVkLCB0aGUgVGVtcGxhdGUgaXMgdGhlIHRlbXBsYXRlLCBhbmQgdGhlCisgICAgICAvLy8gVGVtcGxhdGVBcmdzL051bVRlbXBsYXRlQXJndW1lbnRzIHByb3ZpZGUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBhcworICAgICAgLy8vIHNwZWNpZmllZC4KKyAgICAgIERlZmF1bHRUZW1wbGF0ZUFyZ3VtZW50SW5zdGFudGlhdGlvbiwKKworICAgICAgLy8vIFdlIGFyZSBpbnN0YW50aWF0aW5nIGEgZGVmYXVsdCBhcmd1bWVudCBmb3IgYSBmdW5jdGlvbi4KKyAgICAgIC8vLyBUaGUgRW50aXR5IGlzIHRoZSBQYXJtVmFyRGVjbCwgYW5kIFRlbXBsYXRlQXJncy9OdW1UZW1wbGF0ZUFyZ3MKKyAgICAgIC8vLyBwcm92aWRlcyB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGFzIHNwZWNpZmllZC4KKyAgICAgIERlZmF1bHRGdW5jdGlvbkFyZ3VtZW50SW5zdGFudGlhdGlvbiwKKworICAgICAgLy8vIFdlIGFyZSBzdWJzdGl0dXRpbmcgZXhwbGljaXQgdGVtcGxhdGUgYXJndW1lbnRzIHByb3ZpZGVkIGZvcgorICAgICAgLy8vIGEgZnVuY3Rpb24gdGVtcGxhdGUuIFRoZSBlbnRpdHkgaXMgYSBGdW5jdGlvblRlbXBsYXRlRGVjbC4KKyAgICAgIEV4cGxpY2l0VGVtcGxhdGVBcmd1bWVudFN1YnN0aXR1dGlvbiwKKworICAgICAgLy8vIFdlIGFyZSBzdWJzdGl0dXRpbmcgdGVtcGxhdGUgYXJndW1lbnQgZGV0ZXJtaW5lZCBhcyBwYXJ0IG9mCisgICAgICAvLy8gdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uIGZvciBlaXRoZXIgYSBjbGFzcyB0ZW1wbGF0ZQorICAgICAgLy8vIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gb3IgYSBmdW5jdGlvbiB0ZW1wbGF0ZS4gVGhlCisgICAgICAvLy8gRW50aXR5IGlzIGVpdGhlciBhIHtDbGFzc3xWYXJ9VGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsIG9yCisgICAgICAvLy8gYSBUZW1wbGF0ZURlY2wuCisgICAgICBEZWR1Y2VkVGVtcGxhdGVBcmd1bWVudFN1YnN0aXR1dGlvbiwKKworICAgICAgLy8vIFdlIGFyZSBzdWJzdGl0dXRpbmcgcHJpb3IgdGVtcGxhdGUgYXJndW1lbnRzIGludG8gYSBuZXcKKyAgICAgIC8vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIuIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaXRzZWxmIGlzIGVpdGhlciBhCisgICAgICAvLy8gTm9uVHlwZVRlbXBsYXRlUGFybURlY2wgb3IgYSBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2wuCisgICAgICBQcmlvclRlbXBsYXRlQXJndW1lbnRTdWJzdGl0dXRpb24sCisKKyAgICAgIC8vLyBXZSBhcmUgY2hlY2tpbmcgdGhlIHZhbGlkaXR5IG9mIGEgZGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudCB0aGF0CisgICAgICAvLy8gaGFzIGJlZW4gdXNlZCB3aGVuIG5hbWluZyBhIHRlbXBsYXRlLWlkLgorICAgICAgRGVmYXVsdFRlbXBsYXRlQXJndW1lbnRDaGVja2luZywKKworICAgICAgLy8vIFdlIGFyZSBpbnN0YW50aWF0aW5nIHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBmb3IgYSBmdW5jdGlvbgorICAgICAgLy8vIHRlbXBsYXRlIHdoaWNoIHdhcyBkZWZlcnJlZCB1bnRpbCBpdCB3YXMgbmVlZGVkLgorICAgICAgRXhjZXB0aW9uU3BlY0luc3RhbnRpYXRpb24sCisKKyAgICAgIC8vLyBXZSBhcmUgZGVjbGFyaW5nIGFuIGltcGxpY2l0IHNwZWNpYWwgbWVtYmVyIGZ1bmN0aW9uLgorICAgICAgRGVjbGFyaW5nU3BlY2lhbE1lbWJlciwKKworICAgICAgLy8vIFdlIGFyZSBkZWZpbmluZyBhIHN5bnRoZXNpemVkIGZ1bmN0aW9uIChzdWNoIGFzIGEgZGVmYXVsdGVkIHNwZWNpYWwKKyAgICAgIC8vLyBtZW1iZXIpLgorICAgICAgRGVmaW5pbmdTeW50aGVzaXplZEZ1bmN0aW9uLAorCisgICAgICAvLy8gQWRkZWQgZm9yIFRlbXBsYXRlIGluc3RhbnRpYXRpb24gb2JzZXJ2YXRpb24uCisgICAgICAvLy8gTWVtb2l6YXRpb24gbWVhbnMgd2UgYXJlIF9ub3RfIGluc3RhbnRpYXRpbmcgYSB0ZW1wbGF0ZSBiZWNhdXNlCisgICAgICAvLy8gaXQgaXMgYWxyZWFkeSBpbnN0YW50aWF0ZWQgKGJ1dCB3ZSBlbnRlcmVkIGEgY29udGV4dCB3aGVyZSB3ZQorICAgICAgLy8vIHdvdWxkIGhhdmUgaGFkIHRvIGlmIGl0IHdhcyBub3QgYWxyZWFkeSBpbnN0YW50aWF0ZWQpLgorICAgICAgTWVtb2l6YXRpb24KKyAgICB9IEtpbmQ7CisKKyAgICAvLy8gXGJyaWVmIFdhcyB0aGUgZW5jbG9zaW5nIGNvbnRleHQgYSBub24taW5zdGFudGlhdGlvbiBTRklOQUUgY29udGV4dD8KKyAgICBib29sIFNhdmVkSW5Ob25JbnN0YW50aWF0aW9uU0ZJTkFFQ29udGV4dDsKKworICAgIC8vLyBcYnJpZWYgVGhlIHBvaW50IG9mIGluc3RhbnRpYXRpb24gb3Igc3ludGhlc2lzIHdpdGhpbiB0aGUgc291cmNlIGNvZGUuCisgICAgU291cmNlTG9jYXRpb24gUG9pbnRPZkluc3RhbnRpYXRpb247CisKKyAgICAvLy8gXGJyaWVmIFRoZSBlbnRpdHkgdGhhdCBpcyBiZWluZyBzeW50aGVzaXplZC4KKyAgICBEZWNsICpFbnRpdHk7CisKKyAgICAvLy8gXGJyaWVmIFRoZSB0ZW1wbGF0ZSAob3IgcGFydGlhbCBzcGVjaWFsaXphdGlvbikgaW4gd2hpY2ggd2UgYXJlCisgICAgLy8vIHBlcmZvcm1pbmcgdGhlIGluc3RhbnRpYXRpb24sIGZvciBzdWJzdGl0dXRpb25zIG9mIHByaW9yIHRlbXBsYXRlCisgICAgLy8vIGFyZ3VtZW50cy4KKyAgICBOYW1lZERlY2wgKlRlbXBsYXRlOworCisgICAgLy8vIFxicmllZiBUaGUgbGlzdCBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMgd2UgYXJlIHN1YnN0aXR1dGluZywgaWYgdGhleQorICAgIC8vLyBhcmUgbm90IHBhcnQgb2YgdGhlIGVudGl0eS4KKyAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpUZW1wbGF0ZUFyZ3M7CisKKyAgICAvLyBGSVhNRTogV3JhcCB0aGlzIHVuaW9uIGFyb3VuZCBtb3JlIG1lbWJlcnMsIG9yIHBlcmhhcHMgc3RvcmUgdGhlCisgICAgLy8ga2luZC1zcGVjaWZpYyBtZW1iZXJzIGluIHRoZSBSQUlJIG9iamVjdCBvd25pbmcgdGhlIGNvbnRleHQuCisgICAgdW5pb24geworICAgICAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHRlbXBsYXRlIGFyZ3VtZW50cyBpbiBUZW1wbGF0ZUFyZ3MuCisgICAgICB1bnNpZ25lZCBOdW1UZW1wbGF0ZUFyZ3M7CisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIHNwZWNpYWwgbWVtYmVyIGJlaW5nIGRlY2xhcmVkIG9yIGRlZmluZWQuCisgICAgICBDWFhTcGVjaWFsTWVtYmVyIFNwZWNpYWxNZW1iZXI7CisgICAgfTsKKworICAgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IHRlbXBsYXRlX2FyZ3VtZW50cygpIGNvbnN0IHsKKyAgICAgIGFzc2VydChLaW5kICE9IERlY2xhcmluZ1NwZWNpYWxNZW1iZXIpOworICAgICAgcmV0dXJuIHtUZW1wbGF0ZUFyZ3MsIE51bVRlbXBsYXRlQXJnc307CisgICAgfQorCisgICAgLy8vIFxicmllZiBUaGUgdGVtcGxhdGUgZGVkdWN0aW9uIGluZm8gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAvLy8gc3Vic3RpdHV0aW9uIG9yIGNoZWNraW5nIG9mIGV4cGxpY2l0IG9yIGRlZHVjZWQgdGVtcGxhdGUgYXJndW1lbnRzLgorICAgIHNlbWE6OlRlbXBsYXRlRGVkdWN0aW9uSW5mbyAqRGVkdWN0aW9uSW5mbzsKKworICAgIC8vLyBcYnJpZWYgVGhlIHNvdXJjZSByYW5nZSB0aGF0IGNvdmVycyB0aGUgY29uc3RydWN0IHRoYXQgY2F1c2UKKyAgICAvLy8gdGhlIGluc3RhbnRpYXRpb24sIGUuZy4sIHRoZSB0ZW1wbGF0ZS1pZCB0aGF0IGNhdXNlcyBhIGNsYXNzCisgICAgLy8vIHRlbXBsYXRlIGluc3RhbnRpYXRpb24uCisgICAgU291cmNlUmFuZ2UgSW5zdGFudGlhdGlvblJhbmdlOworCisgICAgQ29kZVN5bnRoZXNpc0NvbnRleHQoKQorICAgICAgOiBLaW5kKFRlbXBsYXRlSW5zdGFudGlhdGlvbiksIEVudGl0eShudWxscHRyKSwgVGVtcGxhdGUobnVsbHB0ciksCisgICAgICAgIFRlbXBsYXRlQXJncyhudWxscHRyKSwgTnVtVGVtcGxhdGVBcmdzKDApLCBEZWR1Y3Rpb25JbmZvKG51bGxwdHIpIHt9CisKKyAgICAvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB0aGlzIHRlbXBsYXRlIGlzIGFuIGFjdHVhbCBpbnN0YW50aWF0aW9uCisgICAgLy8vIHRoYXQgc2hvdWxkIGJlIGNvdW50ZWQgdG93YXJkIHRoZSBtYXhpbXVtIGluc3RhbnRpYXRpb24gZGVwdGguCisgICAgYm9vbCBpc0luc3RhbnRpYXRpb25SZWNvcmQoKSBjb25zdDsKKyAgfTsKKworICAvLy8gXGJyaWVmIExpc3Qgb2YgYWN0aXZlIGNvZGUgc3ludGhlc2lzIGNvbnRleHRzLgorICAvLy8KKyAgLy8vIFRoaXMgdmVjdG9yIGlzIHRyZWF0ZWQgYXMgYSBzdGFjay4gQXMgc3ludGhlc2lzIG9mIG9uZSBlbnRpdHkgcmVxdWlyZXMKKyAgLy8vIHN5bnRoZXNpcyBvZiBhbm90aGVyLCBhZGRpdGlvbmFsIGNvbnRleHRzIGFyZSBwdXNoZWQgb250byB0aGUgc3RhY2suCisgIFNtYWxsVmVjdG9yPENvZGVTeW50aGVzaXNDb250ZXh0LCAxNj4gQ29kZVN5bnRoZXNpc0NvbnRleHRzOworCisgIC8vLyBTcGVjaWFsaXphdGlvbnMgd2hvc2UgZGVmaW5pdGlvbnMgYXJlIGN1cnJlbnRseSBiZWluZyBpbnN0YW50aWF0ZWQuCisgIGxsdm06OkRlbnNlU2V0PHN0ZDo6cGFpcjxEZWNsICosIHVuc2lnbmVkPj4gSW5zdGFudGlhdGluZ1NwZWNpYWxpemF0aW9uczsKKworICAvLy8gTm9uLWRlcGVuZGVudCB0eXBlcyB1c2VkIGluIHRlbXBsYXRlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGluc3RhbnRpYXRlZAorICAvLy8gYnkgc29tZSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uLgorICBsbHZtOjpEZW5zZVNldDxRdWFsVHlwZT4gSW5zdGFudGlhdGVkTm9uRGVwZW5kZW50VHlwZXM7CisKKyAgLy8vIFxicmllZiBFeHRyYSBtb2R1bGVzIGluc3BlY3RlZCB3aGVuIHBlcmZvcm1pbmcgYSBsb29rdXAgZHVyaW5nIGEgdGVtcGxhdGUKKyAgLy8vIGluc3RhbnRpYXRpb24uIENvbXB1dGVkIGxhemlseS4KKyAgU21hbGxWZWN0b3I8TW9kdWxlKiwgMTY+IENvZGVTeW50aGVzaXNDb250ZXh0TG9va3VwTW9kdWxlczsKKworICAvLy8gXGJyaWVmIENhY2hlIG9mIGFkZGl0aW9uYWwgbW9kdWxlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBuYW1lIGxvb2t1cAorICAvLy8gd2l0aGluIHRoZSBjdXJyZW50IHRlbXBsYXRlIGluc3RhbnRpYXRpb24uIENvbXB1dGVkIGxhemlseTsgdXNlCisgIC8vLyBnZXRMb29rdXBNb2R1bGVzKCkgdG8gZ2V0IGEgY29tcGxldGUgc2V0LgorICBsbHZtOjpEZW5zZVNldDxNb2R1bGUqPiBMb29rdXBNb2R1bGVzQ2FjaGU7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHNldCBvZiBhZGRpdGlvbmFsIG1vZHVsZXMgdGhhdCBzaG91bGQgYmUgY2hlY2tlZCBkdXJpbmcKKyAgLy8vIG5hbWUgbG9va3VwLiBBIG1vZHVsZSBhbmQgaXRzIGltcG9ydHMgYmVjb21lIHZpc2libGUgd2hlbiBpbnN0YW50aW5nIGEKKyAgLy8vIHRlbXBsYXRlIGRlZmluZWQgd2l0aGluIGl0LgorICBsbHZtOjpEZW5zZVNldDxNb2R1bGUqPiAmZ2V0TG9va3VwTW9kdWxlcygpOworCisgIC8vLyBcYnJpZWYgTWFwIGZyb20gdGhlIG1vc3QgcmVjZW50IGRlY2xhcmF0aW9uIG9mIGEgbmFtZXNwYWNlIHRvIHRoZSBtb3N0CisgIC8vLyByZWNlbnQgdmlzaWJsZSBkZWNsYXJhdGlvbiBvZiB0aGF0IG5hbWVzcGFjZS4KKyAgbGx2bTo6RGVuc2VNYXA8TmFtZWREZWNsKiwgTmFtZWREZWNsKj4gVmlzaWJsZU5hbWVzcGFjZUNhY2hlOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB3ZSBhcmUgaW4gYSBTRklOQUUgY29udGV4dCB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGgKKyAgLy8vIHRlbXBsYXRlIGluc3RhbnRpYXRpb24uCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHdoZW4gc2V0dGluZyB1cCBhIFNGSU5BRSB0cmFwIChcYyBzZWUgU0ZJTkFFVHJhcCkgb3V0c2lkZQorICAvLy8gb2YgYSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIG9yIHRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbi4KKyAgYm9vbCBJbk5vbkluc3RhbnRpYXRpb25TRklOQUVDb250ZXh0OworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBccCBDb2RlU3ludGhlc2lzQ29udGV4dHMgdGhhdCBhcmUgbm90IHRlbXBsYXRlCisgIC8vLyBpbnN0YW50aWF0aW9ucyBhbmQsIHRoZXJlZm9yZSwgc2hvdWxkIG5vdCBiZSBjb3VudGVkIGFzIHBhcnQgb2YgdGhlCisgIC8vLyBpbnN0YW50aWF0aW9uIGRlcHRoLgorICAvLy8KKyAgLy8vIFdoZW4gdGhlIGluc3RhbnRpYXRpb24gZGVwdGggcmVhY2hlcyB0aGUgdXNlci1jb25maWd1cmFibGUgbGltaXQKKyAgLy8vIFxwIExhbmdPcHRpb25zOjpJbnN0YW50aWF0aW9uRGVwdGggd2Ugd2lsbCBhYm9ydCBpbnN0YW50aWF0aW9uLgorICAvLyBGSVhNRTogU2hvdWxkIHdlIGhhdmUgYSBzaW1pbGFyIGxpbWl0IGZvciBvdGhlciBmb3JtcyBvZiBzeW50aGVzaXM/CisgIHVuc2lnbmVkIE5vbkluc3RhbnRpYXRpb25FbnRyaWVzOworCisgIC8vLyBcYnJpZWYgVGhlIGRlcHRoIG9mIHRoZSBjb250ZXh0IHN0YWNrIGF0IHRoZSBwb2ludCB3aGVuIHRoZSBtb3N0IHJlY2VudAorICAvLy8gZXJyb3Igb3Igd2FybmluZyB3YXMgcHJvZHVjZWQuCisgIC8vLworICAvLy8gVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIHN1cHByZXNzIHByaW50aW5nIG9mIHJlZHVuZGFudCBjb250ZXh0IHN0YWNrcworICAvLy8gd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZXJyb3JzIG9yIHdhcm5pbmdzIGluIHRoZSBzYW1lIGluc3RhbnRpYXRpb24uCisgIC8vIEZJWE1FOiBEb2VzIHRoaXMgYmVsb25nIGluIFNlbWE/IEl0J3MgdG91Z2ggdG8gaW1wbGVtZW50IGl0IGFueXdoZXJlIGVsc2UuCisgIHVuc2lnbmVkIExhc3RFbWl0dGVkQ29kZVN5bnRoZXNpc0NvbnRleHREZXB0aCA9IDA7CisKKyAgLy8vIFxicmllZiBUaGUgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBjYWxsYmFja3MgdG8gdHJhY2Ugb3IgdHJhY2sKKyAgLy8vIGluc3RhbnRpYXRpb25zIChvYmplY3RzIGNhbiBiZSBjaGFpbmVkKS4KKyAgLy8vCisgIC8vLyBUaGlzIGNhbGxiYWNrcyBpcyB1c2VkIHRvIHByaW50LCB0cmFjZSBvciB0cmFjayB0ZW1wbGF0ZQorICAvLy8gaW5zdGFudGlhdGlvbnMgYXMgdGhleSBhcmUgYmVpbmcgY29uc3RydWN0ZWQuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUZW1wbGF0ZUluc3RhbnRpYXRpb25DYWxsYmFjaz4+CisgICAgICBUZW1wbGF0ZUluc3RDYWxsYmFja3M7CisKKyAgLy8vIFxicmllZiBUaGUgY3VycmVudCBpbmRleCBpbnRvIHBhY2sgZXhwYW5zaW9uIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUKKyAgLy8vIHVzZWQgZm9yIHN1YnN0aXR1dGlvbiBvZiBwYXJhbWV0ZXIgcGFja3MuCisgIC8vLworICAvLy8gVGhlIHBhY2sgZXhwYW5zaW9uIGluZGV4IHdpbGwgYmUgLTEgdG8gaW5kaWNhdGUgdGhhdCBwYXJhbWV0ZXIgcGFja3MKKyAgLy8vIHNob3VsZCBiZSBpbnN0YW50aWF0ZWQgYXMgdGhlbXNlbHZlcy4gT3RoZXJ3aXNlLCB0aGUgaW5kZXggc3BlY2lmaWVzCisgIC8vLyB3aGljaCBhcmd1bWVudCB3aXRoaW4gdGhlIHBhcmFtZXRlciBwYWNrIHdpbGwgYmUgdXNlZCBmb3Igc3Vic3RpdHV0aW9uLgorICBpbnQgQXJndW1lbnRQYWNrU3Vic3RpdHV0aW9uSW5kZXg7CisKKyAgLy8vIFxicmllZiBSQUlJIG9iamVjdCB1c2VkIHRvIGNoYW5nZSB0aGUgYXJndW1lbnQgcGFjayBzdWJzdGl0dXRpb24gaW5kZXgKKyAgLy8vIHdpdGhpbiBhIFxjIFNlbWEgb2JqZWN0LgorICAvLy8KKyAgLy8vIFNlZSBcYyBBcmd1bWVudFBhY2tTdWJzdGl0dXRpb25JbmRleCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgY2xhc3MgQXJndW1lbnRQYWNrU3Vic3RpdHV0aW9uSW5kZXhSQUlJIHsKKyAgICBTZW1hICZTZWxmOworICAgIGludCBPbGRTdWJzdGl0dXRpb25JbmRleDsKKworICBwdWJsaWM6CisgICAgQXJndW1lbnRQYWNrU3Vic3RpdHV0aW9uSW5kZXhSQUlJKFNlbWEgJlNlbGYsIGludCBOZXdTdWJzdGl0dXRpb25JbmRleCkKKyAgICAgIDogU2VsZihTZWxmKSwgT2xkU3Vic3RpdHV0aW9uSW5kZXgoU2VsZi5Bcmd1bWVudFBhY2tTdWJzdGl0dXRpb25JbmRleCkgeworICAgICAgU2VsZi5Bcmd1bWVudFBhY2tTdWJzdGl0dXRpb25JbmRleCA9IE5ld1N1YnN0aXR1dGlvbkluZGV4OworICAgIH0KKworICAgIH5Bcmd1bWVudFBhY2tTdWJzdGl0dXRpb25JbmRleFJBSUkoKSB7CisgICAgICBTZWxmLkFyZ3VtZW50UGFja1N1YnN0aXR1dGlvbkluZGV4ID0gT2xkU3Vic3RpdHV0aW9uSW5kZXg7CisgICAgfQorICB9OworCisgIGZyaWVuZCBjbGFzcyBBcmd1bWVudFBhY2tTdWJzdGl0dXRpb25SQUlJOworCisgIC8vLyBcYnJpZWYgRm9yIGVhY2ggZGVjbGFyYXRpb24gdGhhdCBpbnZvbHZlZCB0ZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24sIHRoZQorICAvLy8gc2V0IG9mIGRpYWdub3N0aWNzIHRoYXQgd2VyZSBzdXBwcmVzc2VkIGR1cmluZyB0aGF0IHRlbXBsYXRlIGFyZ3VtZW50CisgIC8vLyBkZWR1Y3Rpb24uCisgIC8vLworICAvLy8gRklYTUU6IFNlcmlhbGl6ZSB0aGlzIHN0cnVjdHVyZSB0byB0aGUgQVNUIGZpbGUuCisgIHR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8RGVjbCAqLCBTbWFsbFZlY3RvcjxQYXJ0aWFsRGlhZ25vc3RpY0F0LCAxPiA+CisgICAgU3VwcHJlc3NlZERpYWdub3N0aWNzTWFwOworICBTdXBwcmVzc2VkRGlhZ25vc3RpY3NNYXAgU3VwcHJlc3NlZERpYWdub3N0aWNzOworCisgIC8vLyBcYnJpZWYgQSBzdGFjayBvYmplY3QgdG8gYmUgY3JlYXRlZCB3aGVuIHBlcmZvcm1pbmcgdGVtcGxhdGUKKyAgLy8vIGluc3RhbnRpYXRpb24uCisgIC8vLworICAvLy8gQ29uc3RydWN0aW9uIG9mIGFuIG9iamVjdCBvZiB0eXBlIFxjIEluc3RhbnRpYXRpbmdUZW1wbGF0ZQorICAvLy8gcHVzaGVzIHRoZSBjdXJyZW50IGluc3RhbnRpYXRpb24gb250byB0aGUgc3RhY2sgb2YgYWN0aXZlCisgIC8vLyBpbnN0YW50aWF0aW9ucy4gSWYgdGhlIHNpemUgb2YgdGhpcyBzdGFjayBleGNlZWRzIHRoZSBtYXhpbXVtCisgIC8vLyBudW1iZXIgb2YgcmVjdXJzaXZlIHRlbXBsYXRlIGluc3RhbnRpYXRpb25zLCBjb25zdHJ1Y3Rpb24KKyAgLy8vIHByb2R1Y2VzIGFuIGVycm9yIGFuZCBldmFsdWF0ZXMgdHJ1ZS4KKyAgLy8vCisgIC8vLyBEZXN0cnVjdGlvbiBvZiB0aGlzIG9iamVjdCB3aWxsIHBvcCB0aGUgbmFtZWQgaW5zdGFudGlhdGlvbiBvZmYKKyAgLy8vIHRoZSBzdGFjay4KKyAgc3RydWN0IEluc3RhbnRpYXRpbmdUZW1wbGF0ZSB7CisgICAgLy8vIFxicmllZiBOb3RlIHRoYXQgd2UgYXJlIGluc3RhbnRpYXRpbmcgYSBjbGFzcyB0ZW1wbGF0ZSwKKyAgICAvLy8gZnVuY3Rpb24gdGVtcGxhdGUsIHZhcmlhYmxlIHRlbXBsYXRlLCBhbGlhcyB0ZW1wbGF0ZSwKKyAgICAvLy8gb3IgYSBtZW1iZXIgdGhlcmVvZi4KKyAgICBJbnN0YW50aWF0aW5nVGVtcGxhdGUoU2VtYSAmU2VtYVJlZiwgU291cmNlTG9jYXRpb24gUG9pbnRPZkluc3RhbnRpYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2wgKkVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgSW5zdGFudGlhdGlvblJhbmdlID0gU291cmNlUmFuZ2UoKSk7CisKKyAgICBzdHJ1Y3QgRXhjZXB0aW9uU3BlY2lmaWNhdGlvbiB7fTsKKyAgICAvLy8gXGJyaWVmIE5vdGUgdGhhdCB3ZSBhcmUgaW5zdGFudGlhdGluZyBhbiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbgorICAgIC8vLyBvZiBhIGZ1bmN0aW9uIHRlbXBsYXRlLgorICAgIEluc3RhbnRpYXRpbmdUZW1wbGF0ZShTZW1hICZTZW1hUmVmLCBTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25EZWNsICpFbnRpdHksIEV4Y2VwdGlvblNwZWNpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEluc3RhbnRpYXRpb25SYW5nZSA9IFNvdXJjZVJhbmdlKCkpOworCisgICAgLy8vIFxicmllZiBOb3RlIHRoYXQgd2UgYXJlIGluc3RhbnRpYXRpbmcgYSBkZWZhdWx0IGFyZ3VtZW50IGluIGEKKyAgICAvLy8gdGVtcGxhdGUtaWQuCisgICAgSW5zdGFudGlhdGluZ1RlbXBsYXRlKFNlbWEgJlNlbWFSZWYsIFNvdXJjZUxvY2F0aW9uIFBvaW50T2ZJbnN0YW50aWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVBhcmFtZXRlciBQYXJhbSwgVGVtcGxhdGVEZWNsICpUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBJbnN0YW50aWF0aW9uUmFuZ2UgPSBTb3VyY2VSYW5nZSgpKTsKKworICAgIC8vLyBcYnJpZWYgTm90ZSB0aGF0IHdlIGFyZSBzdWJzdGl0dXRpbmcgZWl0aGVyIGV4cGxpY2l0bHktc3BlY2lmaWVkIG9yCisgICAgLy8vIGRlZHVjZWQgdGVtcGxhdGUgYXJndW1lbnRzIGR1cmluZyBmdW5jdGlvbiB0ZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24uCisgICAgSW5zdGFudGlhdGluZ1RlbXBsYXRlKFNlbWEgJlNlbWFSZWYsIFNvdXJjZUxvY2F0aW9uIFBvaW50T2ZJbnN0YW50aWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblRlbXBsYXRlRGVjbCAqRnVuY3Rpb25UZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlU3ludGhlc2lzQ29udGV4dDo6U3ludGhlc2lzS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hOjpUZW1wbGF0ZURlZHVjdGlvbkluZm8gJkRlZHVjdGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEluc3RhbnRpYXRpb25SYW5nZSA9IFNvdXJjZVJhbmdlKCkpOworCisgICAgLy8vIFxicmllZiBOb3RlIHRoYXQgd2UgYXJlIGluc3RhbnRpYXRpbmcgYXMgcGFydCBvZiB0ZW1wbGF0ZQorICAgIC8vLyBhcmd1bWVudCBkZWR1Y3Rpb24gZm9yIGEgY2xhc3MgdGVtcGxhdGUgZGVjbGFyYXRpb24uCisgICAgSW5zdGFudGlhdGluZ1RlbXBsYXRlKFNlbWEgJlNlbWFSZWYsIFNvdXJjZUxvY2F0aW9uIFBvaW50T2ZJbnN0YW50aWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZURlY2wgKlRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBUZW1wbGF0ZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWE6OlRlbXBsYXRlRGVkdWN0aW9uSW5mbyAmRGVkdWN0aW9uSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgSW5zdGFudGlhdGlvblJhbmdlID0gU291cmNlUmFuZ2UoKSk7CisKKyAgICAvLy8gXGJyaWVmIE5vdGUgdGhhdCB3ZSBhcmUgaW5zdGFudGlhdGluZyBhcyBwYXJ0IG9mIHRlbXBsYXRlCisgICAgLy8vIGFyZ3VtZW50IGRlZHVjdGlvbiBmb3IgYSBjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsCisgICAgLy8vIHNwZWNpYWxpemF0aW9uLgorICAgIEluc3RhbnRpYXRpbmdUZW1wbGF0ZShTZW1hICZTZW1hUmVmLCBTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKlBhcnRpYWxTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBUZW1wbGF0ZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWE6OlRlbXBsYXRlRGVkdWN0aW9uSW5mbyAmRGVkdWN0aW9uSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgSW5zdGFudGlhdGlvblJhbmdlID0gU291cmNlUmFuZ2UoKSk7CisKKyAgICAvLy8gXGJyaWVmIE5vdGUgdGhhdCB3ZSBhcmUgaW5zdGFudGlhdGluZyBhcyBwYXJ0IG9mIHRlbXBsYXRlCisgICAgLy8vIGFyZ3VtZW50IGRlZHVjdGlvbiBmb3IgYSB2YXJpYWJsZSB0ZW1wbGF0ZSBwYXJ0aWFsCisgICAgLy8vIHNwZWNpYWxpemF0aW9uLgorICAgIEluc3RhbnRpYXRpbmdUZW1wbGF0ZShTZW1hICZTZW1hUmVmLCBTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsICpQYXJ0aWFsU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hOjpUZW1wbGF0ZURlZHVjdGlvbkluZm8gJkRlZHVjdGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEluc3RhbnRpYXRpb25SYW5nZSA9IFNvdXJjZVJhbmdlKCkpOworCisgICAgLy8vIFxicmllZiBOb3RlIHRoYXQgd2UgYXJlIGluc3RhbnRpYXRpbmcgYSBkZWZhdWx0IGFyZ3VtZW50IGZvciBhIGZ1bmN0aW9uCisgICAgLy8vIHBhcmFtZXRlci4KKyAgICBJbnN0YW50aWF0aW5nVGVtcGxhdGUoU2VtYSAmU2VtYVJlZiwgU291cmNlTG9jYXRpb24gUG9pbnRPZkluc3RhbnRpYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcm1WYXJEZWNsICpQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBJbnN0YW50aWF0aW9uUmFuZ2UgPSBTb3VyY2VSYW5nZSgpKTsKKworICAgIC8vLyBcYnJpZWYgTm90ZSB0aGF0IHdlIGFyZSBzdWJzdGl0dXRpbmcgcHJpb3IgdGVtcGxhdGUgYXJndW1lbnRzIGludG8gYQorICAgIC8vLyBub24tdHlwZSBwYXJhbWV0ZXIuCisgICAgSW5zdGFudGlhdGluZ1RlbXBsYXRlKFNlbWEgJlNlbWFSZWYsIFNvdXJjZUxvY2F0aW9uIFBvaW50T2ZJbnN0YW50aWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKlRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOb25UeXBlVGVtcGxhdGVQYXJtRGVjbCAqUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IFRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgSW5zdGFudGlhdGlvblJhbmdlKTsKKworICAgIC8vLyBcYnJpZWYgTm90ZSB0aGF0IHdlIGFyZSBzdWJzdGl0dXRpbmcgcHJpb3IgdGVtcGxhdGUgYXJndW1lbnRzIGludG8gYQorICAgIC8vLyB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCisgICAgSW5zdGFudGlhdGluZ1RlbXBsYXRlKFNlbWEgJlNlbWFSZWYsIFNvdXJjZUxvY2F0aW9uIFBvaW50T2ZJbnN0YW50aWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKlRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2wgKlBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBUZW1wbGF0ZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEluc3RhbnRpYXRpb25SYW5nZSk7CisKKyAgICAvLy8gXGJyaWVmIE5vdGUgdGhhdCB3ZSBhcmUgY2hlY2tpbmcgdGhlIGRlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnQKKyAgICAvLy8gYWdhaW5zdCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIGZvciBhIGdpdmVuIHRlbXBsYXRlLWlkLgorICAgIEluc3RhbnRpYXRpbmdUZW1wbGF0ZShTZW1hICZTZW1hUmVmLCBTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVEZWNsICpUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBJbnN0YW50aWF0aW9uUmFuZ2UpOworCisKKyAgICAvLy8gXGJyaWVmIE5vdGUgdGhhdCB3ZSBoYXZlIGZpbmlzaGVkIGluc3RhbnRpYXRpbmcgdGhpcyB0ZW1wbGF0ZS4KKyAgICB2b2lkIENsZWFyKCk7CisKKyAgICB+SW5zdGFudGlhdGluZ1RlbXBsYXRlKCkgeyBDbGVhcigpOyB9CisKKyAgICAvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB3ZSBoYXZlIGV4Y2VlZGVkIHRoZSBtYXhpbXVtCisgICAgLy8vIHJlY3Vyc2l2ZSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9ucy4KKyAgICBib29sIGlzSW52YWxpZCgpIGNvbnN0IHsgcmV0dXJuIEludmFsaWQ7IH0KKworICAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgd2UgYXJlIGFscmVhZHkgaW5zdGFudGlhdGluZyB0aGlzCisgICAgLy8vIHNwZWNpYWxpemF0aW9uIGluIHNvbWUgc3Vycm91bmRpbmcgYWN0aXZlIGluc3RhbnRpYXRpb24uCisgICAgYm9vbCBpc0FscmVhZHlJbnN0YW50aWF0aW5nKCkgY29uc3QgeyByZXR1cm4gQWxyZWFkeUluc3RhbnRpYXRpbmc7IH0KKworICBwcml2YXRlOgorICAgIFNlbWEgJlNlbWFSZWY7CisgICAgYm9vbCBJbnZhbGlkOworICAgIGJvb2wgQWxyZWFkeUluc3RhbnRpYXRpbmc7CisgICAgYm9vbCBDaGVja0luc3RhbnRpYXRpb25EZXB0aChTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEluc3RhbnRpYXRpb25SYW5nZSk7CisKKyAgICBJbnN0YW50aWF0aW5nVGVtcGxhdGUoCisgICAgICAgIFNlbWEgJlNlbWFSZWYsIENvZGVTeW50aGVzaXNDb250ZXh0OjpTeW50aGVzaXNLaW5kIEtpbmQsCisgICAgICAgIFNvdXJjZUxvY2F0aW9uIFBvaW50T2ZJbnN0YW50aWF0aW9uLCBTb3VyY2VSYW5nZSBJbnN0YW50aWF0aW9uUmFuZ2UsCisgICAgICAgIERlY2wgKkVudGl0eSwgTmFtZWREZWNsICpUZW1wbGF0ZSA9IG51bGxwdHIsCisgICAgICAgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IFRlbXBsYXRlQXJncyA9IE5vbmUsCisgICAgICAgIHNlbWE6OlRlbXBsYXRlRGVkdWN0aW9uSW5mbyAqRGVkdWN0aW9uSW5mbyA9IG51bGxwdHIpOworCisgICAgSW5zdGFudGlhdGluZ1RlbXBsYXRlKGNvbnN0IEluc3RhbnRpYXRpbmdUZW1wbGF0ZSYpID0gZGVsZXRlOworCisgICAgSW5zdGFudGlhdGluZ1RlbXBsYXRlJgorICAgIG9wZXJhdG9yPShjb25zdCBJbnN0YW50aWF0aW5nVGVtcGxhdGUmKSA9IGRlbGV0ZTsKKyAgfTsKKworICB2b2lkIHB1c2hDb2RlU3ludGhlc2lzQ29udGV4dChDb2RlU3ludGhlc2lzQ29udGV4dCBDdHgpOworICB2b2lkIHBvcENvZGVTeW50aGVzaXNDb250ZXh0KCk7CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHdlIGFyZSBjdXJyZW50bHkgcGVyZm9ybWluZyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uLgorICBib29sIGluVGVtcGxhdGVJbnN0YW50aWF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBDb2RlU3ludGhlc2lzQ29udGV4dHMuc2l6ZSgpID4gTm9uSW5zdGFudGlhdGlvbkVudHJpZXM7CisgIH0KKworICB2b2lkIFByaW50Q29udGV4dFN0YWNrKCkgeworICAgIGlmICghQ29kZVN5bnRoZXNpc0NvbnRleHRzLmVtcHR5KCkgJiYKKyAgICAgICAgQ29kZVN5bnRoZXNpc0NvbnRleHRzLnNpemUoKSAhPSBMYXN0RW1pdHRlZENvZGVTeW50aGVzaXNDb250ZXh0RGVwdGgpIHsKKyAgICAgIFByaW50SW5zdGFudGlhdGlvblN0YWNrKCk7CisgICAgICBMYXN0RW1pdHRlZENvZGVTeW50aGVzaXNDb250ZXh0RGVwdGggPSBDb2RlU3ludGhlc2lzQ29udGV4dHMuc2l6ZSgpOworICAgIH0KKyAgICBpZiAoUHJhZ21hQXR0cmlidXRlQ3VycmVudFRhcmdldERlY2wpCisgICAgICBQcmludFByYWdtYUF0dHJpYnV0ZUluc3RhbnRpYXRpb25Qb2ludCgpOworICB9CisgIHZvaWQgUHJpbnRJbnN0YW50aWF0aW9uU3RhY2soKTsKKworICB2b2lkIFByaW50UHJhZ21hQXR0cmlidXRlSW5zdGFudGlhdGlvblBvaW50KCk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBpbiBhIGNvbnRleHQgd2hlcmUKKyAgLy8vIHRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGlvbiBmYWlsdXJlcyBhcmUgbm90IGNvbnNpZGVyZWQKKyAgLy8vIGVycm9ycy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBBbiBlbXB0eSBcYyBPcHRpb25hbCBpZiB3ZSdyZSBub3QgaW4gYSBTRklOQUUgY29udGV4dC4KKyAgLy8vIE90aGVyd2lzZSwgY29udGFpbnMgYSBwb2ludGVyIHRoYXQsIGlmIG5vbi1OVUxMLCBjb250YWlucyB0aGUgbmVhcmVzdAorICAvLy8gdGVtcGxhdGUtZGVkdWN0aW9uIGNvbnRleHQgb2JqZWN0LCB3aGljaCBjYW4gYmUgdXNlZCB0byBjYXB0dXJlCisgIC8vLyBkaWFnbm9zdGljcyB0aGF0IHdpbGwgYmUgc3VwcHJlc3NlZC4KKyAgT3B0aW9uYWw8c2VtYTo6VGVtcGxhdGVEZWR1Y3Rpb25JbmZvICo+IGlzU0ZJTkFFQ29udGV4dCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIHdlIGFyZSBjdXJyZW50bHkgaW4gYSBjb250ZXh0IHRoYXQKKyAgLy8vIGlzIG5vdCBldmFsdWF0ZWQgYXMgcGVyIEMrKyBbZXhwcl0gcDUuCisgIGJvb2wgaXNVbmV2YWx1YXRlZENvbnRleHQoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFFeHByRXZhbENvbnRleHRzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgIk11c3QgYmUgaW4gYW4gZXhwcmVzc2lvbiBldmFsdWF0aW9uIGNvbnRleHQiKTsKKyAgICByZXR1cm4gRXhwckV2YWxDb250ZXh0cy5iYWNrKCkuaXNVbmV2YWx1YXRlZCgpOworICB9CisKKyAgLy8vIFxicmllZiBSQUlJIGNsYXNzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgU0ZJTkFFIGhhcworICAvLy8gdHJhcHBlZCBhbnkgZXJyb3JzIHRoYXQgb2NjdXIgZHVyaW5nIHRlbXBsYXRlIGFyZ3VtZW50CisgIC8vLyBkZWR1Y3Rpb24uCisgIGNsYXNzIFNGSU5BRVRyYXAgeworICAgIFNlbWEgJlNlbWFSZWY7CisgICAgdW5zaWduZWQgUHJldlNGSU5BRUVycm9yczsKKyAgICBib29sIFByZXZJbk5vbkluc3RhbnRpYXRpb25TRklOQUVDb250ZXh0OworICAgIGJvb2wgUHJldkFjY2Vzc0NoZWNraW5nU0ZJTkFFOworICAgIGJvb2wgUHJldkxhc3REaWFnbm9zdGljSWdub3JlZDsKKworICBwdWJsaWM6CisgICAgZXhwbGljaXQgU0ZJTkFFVHJhcChTZW1hICZTZW1hUmVmLCBib29sIEFjY2Vzc0NoZWNraW5nU0ZJTkFFID0gZmFsc2UpCisgICAgICA6IFNlbWFSZWYoU2VtYVJlZiksIFByZXZTRklOQUVFcnJvcnMoU2VtYVJlZi5OdW1TRklOQUVFcnJvcnMpLAorICAgICAgICBQcmV2SW5Ob25JbnN0YW50aWF0aW9uU0ZJTkFFQ29udGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYVJlZi5Jbk5vbkluc3RhbnRpYXRpb25TRklOQUVDb250ZXh0KSwKKyAgICAgICAgUHJldkFjY2Vzc0NoZWNraW5nU0ZJTkFFKFNlbWFSZWYuQWNjZXNzQ2hlY2tpbmdTRklOQUUpLAorICAgICAgICBQcmV2TGFzdERpYWdub3N0aWNJZ25vcmVkKAorICAgICAgICAgICAgU2VtYVJlZi5nZXREaWFnbm9zdGljcygpLmlzTGFzdERpYWdub3N0aWNJZ25vcmVkKCkpCisgICAgeworICAgICAgaWYgKCFTZW1hUmVmLmlzU0ZJTkFFQ29udGV4dCgpKQorICAgICAgICBTZW1hUmVmLkluTm9uSW5zdGFudGlhdGlvblNGSU5BRUNvbnRleHQgPSB0cnVlOworICAgICAgU2VtYVJlZi5BY2Nlc3NDaGVja2luZ1NGSU5BRSA9IEFjY2Vzc0NoZWNraW5nU0ZJTkFFOworICAgIH0KKworICAgIH5TRklOQUVUcmFwKCkgeworICAgICAgU2VtYVJlZi5OdW1TRklOQUVFcnJvcnMgPSBQcmV2U0ZJTkFFRXJyb3JzOworICAgICAgU2VtYVJlZi5Jbk5vbkluc3RhbnRpYXRpb25TRklOQUVDb250ZXh0CisgICAgICAgID0gUHJldkluTm9uSW5zdGFudGlhdGlvblNGSU5BRUNvbnRleHQ7CisgICAgICBTZW1hUmVmLkFjY2Vzc0NoZWNraW5nU0ZJTkFFID0gUHJldkFjY2Vzc0NoZWNraW5nU0ZJTkFFOworICAgICAgU2VtYVJlZi5nZXREaWFnbm9zdGljcygpLnNldExhc3REaWFnbm9zdGljSWdub3JlZCgKKyAgICAgICAgICBQcmV2TGFzdERpYWdub3N0aWNJZ25vcmVkKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIGFueSBTRklOQUUgZXJyb3JzIGhhdmUgYmVlbiB0cmFwcGVkLgorICAgIGJvb2wgaGFzRXJyb3JPY2N1cnJlZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTZW1hUmVmLk51bVNGSU5BRUVycm9ycyA+IFByZXZTRklOQUVFcnJvcnM7CisgICAgfQorICB9OworCisgIC8vLyBcYnJpZWYgUkFJSSBjbGFzcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgd2UgYXJlIHBlcmZvcm1pbmcgcHJvdmlzaW9uYWwKKyAgLy8vIHNlbWFudGljIGFuYWx5c2lzIHRvIGRldGVybWluZSB0aGUgdmFsaWRpdHkgb2YgYSBjb25zdHJ1Y3QsIHNvCisgIC8vLyB0eXBvLWNvcnJlY3Rpb24gYW5kIGRpYWdub3N0aWNzIGluIHRoZSBpbW1lZGlhdGUgY29udGV4dCAobm90IHdpdGhpbgorICAvLy8gaW1wbGljaXRseS1pbnN0YW50aWF0ZWQgdGVtcGxhdGVzKSBzaG91bGQgYmUgc3VwcHJlc3NlZC4KKyAgY2xhc3MgVGVudGF0aXZlQW5hbHlzaXNTY29wZSB7CisgICAgU2VtYSAmU2VtYVJlZjsKKyAgICAvLyBGSVhNRTogVXNpbmcgYSBTRklOQUVUcmFwIGZvciB0aGlzIGlzIGEgaGFjay4KKyAgICBTRklOQUVUcmFwIFRyYXA7CisgICAgYm9vbCBQcmV2RGlzYWJsZVR5cG9Db3JyZWN0aW9uOworICBwdWJsaWM6CisgICAgZXhwbGljaXQgVGVudGF0aXZlQW5hbHlzaXNTY29wZShTZW1hICZTZW1hUmVmKQorICAgICAgICA6IFNlbWFSZWYoU2VtYVJlZiksIFRyYXAoU2VtYVJlZiwgdHJ1ZSksCisgICAgICAgICAgUHJldkRpc2FibGVUeXBvQ29ycmVjdGlvbihTZW1hUmVmLkRpc2FibGVUeXBvQ29ycmVjdGlvbikgeworICAgICAgU2VtYVJlZi5EaXNhYmxlVHlwb0NvcnJlY3Rpb24gPSB0cnVlOworICAgIH0KKyAgICB+VGVudGF0aXZlQW5hbHlzaXNTY29wZSgpIHsKKyAgICAgIFNlbWFSZWYuRGlzYWJsZVR5cG9Db3JyZWN0aW9uID0gUHJldkRpc2FibGVUeXBvQ29ycmVjdGlvbjsKKyAgICB9CisgIH07CisKKyAgLy8vIFxicmllZiBUaGUgY3VycmVudCBpbnN0YW50aWF0aW9uIHNjb3BlIHVzZWQgdG8gc3RvcmUgbG9jYWwKKyAgLy8vIHZhcmlhYmxlcy4KKyAgTG9jYWxJbnN0YW50aWF0aW9uU2NvcGUgKkN1cnJlbnRJbnN0YW50aWF0aW9uU2NvcGU7CisKKyAgLy8vIFxicmllZiBUcmFja3Mgd2hldGhlciB3ZSBhcmUgaW4gYSBjb250ZXh0IHdoZXJlIHR5cG8gY29ycmVjdGlvbiBpcworICAvLy8gZGlzYWJsZWQuCisgIGJvb2wgRGlzYWJsZVR5cG9Db3JyZWN0aW9uOworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiB0eXBvcyBjb3JyZWN0ZWQgYnkgQ29ycmVjdFR5cG8uCisgIHVuc2lnbmVkIFR5cG9zQ29ycmVjdGVkOworCisgIHR5cGVkZWYgbGx2bTo6U21hbGxTZXQ8U291cmNlTG9jYXRpb24sIDI+IFNyY0xvY1NldDsKKyAgdHlwZWRlZiBsbHZtOjpEZW5zZU1hcDxJZGVudGlmaWVySW5mbyAqLCBTcmNMb2NTZXQ+IElkZW50aWZpZXJTb3VyY2VMb2NhdGlvbnM7CisKKyAgLy8vIFxicmllZiBBIGNhY2hlIGNvbnRhaW5pbmcgaWRlbnRpZmllcnMgZm9yIHdoaWNoIHR5cG8gY29ycmVjdGlvbiBmYWlsZWQgYW5kCisgIC8vLyB0aGVpciBsb2NhdGlvbnMsIHNvIHRoYXQgcmVwZWF0ZWQgYXR0ZW1wdHMgdG8gY29ycmVjdCBhbiBpZGVudGlmaWVyIGluIGEKKyAgLy8vIGdpdmVuIGxvY2F0aW9uIGFyZSBpZ25vcmVkIGlmIHR5cG8gY29ycmVjdGlvbiBhbHJlYWR5IGZhaWxlZCBmb3IgaXQuCisgIElkZW50aWZpZXJTb3VyY2VMb2NhdGlvbnMgVHlwb0NvcnJlY3Rpb25GYWlsdXJlczsKKworICAvLy8gXGJyaWVmIFdvcmtlciBvYmplY3QgZm9yIHBlcmZvcm1pbmcgQ0ZHLWJhc2VkIHdhcm5pbmdzLgorICBzZW1hOjpBbmFseXNpc0Jhc2VkV2FybmluZ3MgQW5hbHlzaXNXYXJuaW5nczsKKyAgdGhyZWFkU2FmZXR5OjpCZWZvcmVTZXQgKlRocmVhZFNhZmV0eURlY2xDYWNoZTsKKworICAvLy8gXGJyaWVmIEFuIGVudGl0eSBmb3Igd2hpY2ggaW1wbGljaXQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBpcyByZXF1aXJlZC4KKyAgLy8vCisgIC8vLyBUaGUgc291cmNlIGxvY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVjbGFyYXRpb24gaXMgdGhlIGZpcnN0IHBsYWNlIGluCisgIC8vLyB0aGUgc291cmNlIGNvZGUgd2hlcmUgdGhlIGRlY2xhcmF0aW9uIHdhcyAidXNlZCIuIEl0IGlzIG5vdCBuZWNlc3NhcmlseQorICAvLy8gdGhlIHBvaW50IG9mIGluc3RhbnRpYXRpb24gKHdoaWNoIHdpbGwgYmUgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUKKyAgLy8vIG5hbWVzcGFjZS1zY29wZSBkZWNsYXJhdGlvbiB0aGF0IHRyaWdnZXJlZCB0aGlzIGltcGxpY2l0IGluc3RhbnRpYXRpb24pLAorICAvLy8gSG93ZXZlciwgaXQgaXMgdGhlIGxvY2F0aW9uIHRoYXQgZGlhZ25vc3RpY3Mgc2hvdWxkIGdlbmVyYWxseSByZWZlciB0bywKKyAgLy8vIGJlY2F1c2UgdXNlcnMgd2lsbCBuZWVkIHRvIGtub3cgd2hhdCBjb2RlIHRyaWdnZXJlZCB0aGUgaW5zdGFudGlhdGlvbi4KKyAgdHlwZWRlZiBzdGQ6OnBhaXI8VmFsdWVEZWNsICosIFNvdXJjZUxvY2F0aW9uPiBQZW5kaW5nSW1wbGljaXRJbnN0YW50aWF0aW9uOworCisgIC8vLyBcYnJpZWYgVGhlIHF1ZXVlIG9mIGltcGxpY2l0IHRlbXBsYXRlIGluc3RhbnRpYXRpb25zIHRoYXQgYXJlIHJlcXVpcmVkCisgIC8vLyBidXQgaGF2ZSBub3QgeWV0IGJlZW4gcGVyZm9ybWVkLgorICBzdGQ6OmRlcXVlPFBlbmRpbmdJbXBsaWNpdEluc3RhbnRpYXRpb24+IFBlbmRpbmdJbnN0YW50aWF0aW9uczsKKworICAvLy8gUXVldWUgb2YgaW1wbGljaXQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbnMgdGhhdCBjYW5ub3QgYmUgcGVyZm9ybWVkCisgIC8vLyBlYWdlcmx5LgorICBTbWFsbFZlY3RvcjxQZW5kaW5nSW1wbGljaXRJbnN0YW50aWF0aW9uLCAxPiBMYXRlUGFyc2VkSW5zdGFudGlhdGlvbnM7CisKKyAgY2xhc3MgR2xvYmFsRWFnZXJJbnN0YW50aWF0aW9uU2NvcGUgeworICBwdWJsaWM6CisgICAgR2xvYmFsRWFnZXJJbnN0YW50aWF0aW9uU2NvcGUoU2VtYSAmUywgYm9vbCBFbmFibGVkKQorICAgICAgICA6IFMoUyksIEVuYWJsZWQoRW5hYmxlZCkgeworICAgICAgaWYgKCFFbmFibGVkKSByZXR1cm47CisKKyAgICAgIFNhdmVkUGVuZGluZ0luc3RhbnRpYXRpb25zLnN3YXAoUy5QZW5kaW5nSW5zdGFudGlhdGlvbnMpOworICAgICAgU2F2ZWRWVGFibGVVc2VzLnN3YXAoUy5WVGFibGVVc2VzKTsKKyAgICB9CisKKyAgICB2b2lkIHBlcmZvcm0oKSB7CisgICAgICBpZiAoRW5hYmxlZCkgeworICAgICAgICBTLkRlZmluZVVzZWRWVGFibGVzKCk7CisgICAgICAgIFMuUGVyZm9ybVBlbmRpbmdJbnN0YW50aWF0aW9ucygpOworICAgICAgfQorICAgIH0KKworICAgIH5HbG9iYWxFYWdlckluc3RhbnRpYXRpb25TY29wZSgpIHsKKyAgICAgIGlmICghRW5hYmxlZCkgcmV0dXJuOworCisgICAgICAvLyBSZXN0b3JlIHRoZSBzZXQgb2YgcGVuZGluZyB2dGFibGVzLgorICAgICAgYXNzZXJ0KFMuVlRhYmxlVXNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgIlZUYWJsZVVzZXMgc2hvdWxkIGJlIGVtcHR5IGJlZm9yZSBpdCBpcyBkaXNjYXJkZWQuIik7CisgICAgICBTLlZUYWJsZVVzZXMuc3dhcChTYXZlZFZUYWJsZVVzZXMpOworCisgICAgICAvLyBSZXN0b3JlIHRoZSBzZXQgb2YgcGVuZGluZyBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucy4KKyAgICAgIGFzc2VydChTLlBlbmRpbmdJbnN0YW50aWF0aW9ucy5lbXB0eSgpICYmCisgICAgICAgICAgICAgIlBlbmRpbmdJbnN0YW50aWF0aW9ucyBzaG91bGQgYmUgZW1wdHkgYmVmb3JlIGl0IGlzIGRpc2NhcmRlZC4iKTsKKyAgICAgIFMuUGVuZGluZ0luc3RhbnRpYXRpb25zLnN3YXAoU2F2ZWRQZW5kaW5nSW5zdGFudGlhdGlvbnMpOworICAgIH0KKworICBwcml2YXRlOgorICAgIFNlbWEgJlM7CisgICAgU21hbGxWZWN0b3I8VlRhYmxlVXNlLCAxNj4gU2F2ZWRWVGFibGVVc2VzOworICAgIHN0ZDo6ZGVxdWU8UGVuZGluZ0ltcGxpY2l0SW5zdGFudGlhdGlvbj4gU2F2ZWRQZW5kaW5nSW5zdGFudGlhdGlvbnM7CisgICAgYm9vbCBFbmFibGVkOworICB9OworCisgIC8vLyBcYnJpZWYgVGhlIHF1ZXVlIG9mIGltcGxpY2l0IHRlbXBsYXRlIGluc3RhbnRpYXRpb25zIHRoYXQgYXJlIHJlcXVpcmVkCisgIC8vLyBhbmQgbXVzdCBiZSBwZXJmb3JtZWQgd2l0aGluIHRoZSBjdXJyZW50IGxvY2FsIHNjb3BlLgorICAvLy8KKyAgLy8vIFRoaXMgcXVldWUgaXMgb25seSB1c2VkIGZvciBtZW1iZXIgZnVuY3Rpb25zIG9mIGxvY2FsIGNsYXNzZXMgaW4KKyAgLy8vIHRlbXBsYXRlcywgd2hpY2ggbXVzdCBiZSBpbnN0YW50aWF0ZWQgaW4gdGhlIHNhbWUgc2NvcGUgYXMgdGhlaXIKKyAgLy8vIGVuY2xvc2luZyBmdW5jdGlvbiwgc28gdGhhdCB0aGV5IGNhbiByZWZlcmVuY2UgZnVuY3Rpb24tbG9jYWwKKyAgLy8vIHR5cGVzLCBzdGF0aWMgdmFyaWFibGVzLCBlbnVtZXJhdG9ycywgZXRjLgorICBzdGQ6OmRlcXVlPFBlbmRpbmdJbXBsaWNpdEluc3RhbnRpYXRpb24+IFBlbmRpbmdMb2NhbEltcGxpY2l0SW5zdGFudGlhdGlvbnM7CisKKyAgY2xhc3MgTG9jYWxFYWdlckluc3RhbnRpYXRpb25TY29wZSB7CisgIHB1YmxpYzoKKyAgICBMb2NhbEVhZ2VySW5zdGFudGlhdGlvblNjb3BlKFNlbWEgJlMpIDogUyhTKSB7CisgICAgICBTYXZlZFBlbmRpbmdMb2NhbEltcGxpY2l0SW5zdGFudGlhdGlvbnMuc3dhcCgKKyAgICAgICAgICBTLlBlbmRpbmdMb2NhbEltcGxpY2l0SW5zdGFudGlhdGlvbnMpOworICAgIH0KKworICAgIHZvaWQgcGVyZm9ybSgpIHsgUy5QZXJmb3JtUGVuZGluZ0luc3RhbnRpYXRpb25zKC8qTG9jYWxPbmx5PSovdHJ1ZSk7IH0KKworICAgIH5Mb2NhbEVhZ2VySW5zdGFudGlhdGlvblNjb3BlKCkgeworICAgICAgYXNzZXJ0KFMuUGVuZGluZ0xvY2FsSW1wbGljaXRJbnN0YW50aWF0aW9ucy5lbXB0eSgpICYmCisgICAgICAgICAgICAgInRoZXJlIHNob3VsZG4ndCBiZSBhbnkgcGVuZGluZyBsb2NhbCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyIpOworICAgICAgU2F2ZWRQZW5kaW5nTG9jYWxJbXBsaWNpdEluc3RhbnRpYXRpb25zLnN3YXAoCisgICAgICAgICAgUy5QZW5kaW5nTG9jYWxJbXBsaWNpdEluc3RhbnRpYXRpb25zKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBTZW1hICZTOworICAgIHN0ZDo6ZGVxdWU8UGVuZGluZ0ltcGxpY2l0SW5zdGFudGlhdGlvbj4KKyAgICAgICAgU2F2ZWRQZW5kaW5nTG9jYWxJbXBsaWNpdEluc3RhbnRpYXRpb25zOworICB9OworCisgIC8vLyBBIGhlbHBlciBjbGFzcyBmb3IgYnVpbGRpbmcgdXAgRXh0UGFyYW1ldGVySW5mb3MuCisgIGNsYXNzIEV4dFBhcmFtZXRlckluZm9CdWlsZGVyIHsKKyAgICBTbWFsbFZlY3RvcjxGdW5jdGlvblByb3RvVHlwZTo6RXh0UGFyYW1ldGVySW5mbywgMTY+IEluZm9zOworICAgIGJvb2wgSGFzSW50ZXJlc3RpbmcgPSBmYWxzZTsKKworICBwdWJsaWM6CisgICAgLy8vIFNldCB0aGUgRXh0UGFyYW1ldGVySW5mbyBmb3IgdGhlIHBhcmFtZXRlciBhdCB0aGUgZ2l2ZW4gaW5kZXgsCisgICAgLy8vCisgICAgdm9pZCBzZXQodW5zaWduZWQgaW5kZXgsIEZ1bmN0aW9uUHJvdG9UeXBlOjpFeHRQYXJhbWV0ZXJJbmZvIGluZm8pIHsKKyAgICAgIGFzc2VydChJbmZvcy5zaXplKCkgPD0gaW5kZXgpOworICAgICAgSW5mb3MucmVzaXplKGluZGV4KTsKKyAgICAgIEluZm9zLnB1c2hfYmFjayhpbmZvKTsKKworICAgICAgaWYgKCFIYXNJbnRlcmVzdGluZykKKyAgICAgICAgSGFzSW50ZXJlc3RpbmcgPSAoaW5mbyAhPSBGdW5jdGlvblByb3RvVHlwZTo6RXh0UGFyYW1ldGVySW5mbygpKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIGEgcG9pbnRlciAoc3VpdGFibGUgZm9yIHNldHRpbmcgaW4gYW4gRXh0UHJvdG9JbmZvKSB0byB0aGUKKyAgICAvLy8gRXh0UGFyYW1ldGVySW5mbyBhcnJheSB3ZSd2ZSBidWlsdCB1cC4KKyAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZTo6RXh0UGFyYW1ldGVySW5mbyAqCisgICAgZ2V0UG9pbnRlck9yTnVsbCh1bnNpZ25lZCBudW1QYXJhbXMpIHsKKyAgICAgIGlmICghSGFzSW50ZXJlc3RpbmcpIHJldHVybiBudWxscHRyOworICAgICAgSW5mb3MucmVzaXplKG51bVBhcmFtcyk7CisgICAgICByZXR1cm4gSW5mb3MuZGF0YSgpOworICAgIH0KKyAgfTsKKworICB2b2lkIFBlcmZvcm1QZW5kaW5nSW5zdGFudGlhdGlvbnMoYm9vbCBMb2NhbE9ubHkgPSBmYWxzZSk7CisKKyAgVHlwZVNvdXJjZUluZm8gKlN1YnN0VHlwZShUeXBlU291cmNlSW5mbyAqVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsIERlY2xhcmF0aW9uTmFtZSBFbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0RlZHVjZWRUU1QgPSBmYWxzZSk7CisKKyAgUXVhbFR5cGUgU3Vic3RUeXBlKFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywgRGVjbGFyYXRpb25OYW1lIEVudGl0eSk7CisKKyAgVHlwZVNvdXJjZUluZm8gKlN1YnN0VHlwZShUeXBlTG9jIFRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywgRGVjbGFyYXRpb25OYW1lIEVudGl0eSk7CisKKyAgVHlwZVNvdXJjZUluZm8gKlN1YnN0RnVuY3Rpb25EZWNsVHlwZShUeXBlU291cmNlSW5mbyAqVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lIEVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhSZWNvcmREZWNsICpUaGlzQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUaGlzVHlwZVF1YWxzKTsKKyAgdm9pZCBTdWJzdEV4Y2VwdGlvblNwZWMoRnVuY3Rpb25EZWNsICpOZXcsIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpQcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0ICZBcmdzKTsKKyAgYm9vbCBTdWJzdEV4Y2VwdGlvblNwZWMoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblByb3RvVHlwZTo6RXhjZXB0aW9uU3BlY0luZm8gJkVTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFF1YWxUeXBlPiAmRXhjZXB0aW9uU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0ICZBcmdzKTsKKyAgUGFybVZhckRlY2wgKlN1YnN0UGFybVZhckRlY2woUGFybVZhckRlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEFkanVzdG1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHVuc2lnbmVkPiBOdW1FeHBhbnNpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEV4cGVjdFBhcmFtZXRlclBhY2spOworICBib29sIFN1YnN0UGFybVR5cGVzKFNvdXJjZUxvY2F0aW9uIExvYywgQXJyYXlSZWY8UGFybVZhckRlY2wgKj4gUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlOjpFeHRQYXJhbWV0ZXJJbmZvICpFeHRQYXJhbUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxRdWFsVHlwZT4gJlBhcmFtVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFBhcm1WYXJEZWNsICo+ICpPdXRQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgRXh0UGFyYW1ldGVySW5mb0J1aWxkZXIgJlBhcmFtSW5mb3MpOworICBFeHByUmVzdWx0IFN1YnN0RXhwcihFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncyk7CisKKyAgLy8vIFxicmllZiBTdWJzdGl0dXRlIHRoZSBnaXZlbiB0ZW1wbGF0ZSBhcmd1bWVudHMgaW50byBhIGxpc3Qgb2YKKyAgLy8vIGV4cHJlc3Npb25zLCBleHBhbmRpbmcgcGFjayBleHBhbnNpb25zIGlmIHJlcXVpcmVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBFeHBycyBUaGUgbGlzdCBvZiBleHByZXNzaW9ucyB0byBzdWJzdGl0dXRlIGludG8uCisgIC8vLworICAvLy8gXHBhcmFtIElzQ2FsbCBXaGV0aGVyIHRoaXMgaXMgc29tZSBmb3JtIG9mIGNhbGwsIGluIHdoaWNoIGNhc2UKKyAgLy8vIGRlZmF1bHQgYXJndW1lbnRzIHdpbGwgYmUgZHJvcHBlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gVGVtcGxhdGVBcmdzIFRoZSBzZXQgb2YgdGVtcGxhdGUgYXJndW1lbnRzIHRvIHN1YnN0aXR1dGUuCisgIC8vLworICAvLy8gXHBhcmFtIE91dHB1dHMgV2lsbCByZWNlaXZlIGFsbCBvZiB0aGUgc3Vic3RpdHV0ZWQgYXJndW1lbnRzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBTdWJzdEV4cHJzKEFycmF5UmVmPEV4cHIgKj4gRXhwcnMsIGJvb2wgSXNDYWxsLAorICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MsCisgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8RXhwciAqPiAmT3V0cHV0cyk7CisKKyAgU3RtdFJlc3VsdCBTdWJzdFN0bXQoU3RtdCAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MpOworCisgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqCisgIFN1YnN0VGVtcGxhdGVQYXJhbXMoVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpQYXJhbXMsIERlY2xDb250ZXh0ICpPd25lciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncyk7CisKKyAgRGVjbCAqU3Vic3REZWNsKERlY2wgKkQsIERlY2xDb250ZXh0ICpPd25lciwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmVGVtcGxhdGVBcmdzKTsKKworICBFeHByUmVzdWx0IFN1YnN0SW5pdGlhbGl6ZXIoRXhwciAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ1hYRGlyZWN0SW5pdCk7CisKKyAgYm9vbAorICBTdWJzdEJhc2VTcGVjaWZpZXJzKENYWFJlY29yZERlY2wgKkluc3RhbnRpYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgQ1hYUmVjb3JkRGVjbCAqUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncyk7CisKKyAgYm9vbAorICBJbnN0YW50aWF0ZUNsYXNzKFNvdXJjZUxvY2F0aW9uIFBvaW50T2ZJbnN0YW50aWF0aW9uLAorICAgICAgICAgICAgICAgICAgIENYWFJlY29yZERlY2wgKkluc3RhbnRpYXRpb24sIENYWFJlY29yZERlY2wgKlBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQgVFNLLAorICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4gPSB0cnVlKTsKKworICBib29sIEluc3RhbnRpYXRlRW51bShTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgRW51bURlY2wgKkluc3RhbnRpYXRpb24sIEVudW1EZWNsICpQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQgVFNLKTsKKworICBib29sIEluc3RhbnRpYXRlSW5DbGFzc0luaXRpYWxpemVyKAorICAgICAgU291cmNlTG9jYXRpb24gUG9pbnRPZkluc3RhbnRpYXRpb24sIEZpZWxkRGVjbCAqSW5zdGFudGlhdGlvbiwKKyAgICAgIEZpZWxkRGVjbCAqUGF0dGVybiwgY29uc3QgTXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MpOworCisgIHN0cnVjdCBMYXRlSW5zdGFudGlhdGVkQXR0cmlidXRlIHsKKyAgICBjb25zdCBBdHRyICpUbXBsQXR0cjsKKyAgICBMb2NhbEluc3RhbnRpYXRpb25TY29wZSAqU2NvcGU7CisgICAgRGVjbCAqTmV3RGVjbDsKKworICAgIExhdGVJbnN0YW50aWF0ZWRBdHRyaWJ1dGUoY29uc3QgQXR0ciAqQSwgTG9jYWxJbnN0YW50aWF0aW9uU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsICpEKQorICAgICAgOiBUbXBsQXR0cihBKSwgU2NvcGUoUyksIE5ld0RlY2woRCkKKyAgICB7IH0KKyAgfTsKKyAgdHlwZWRlZiBTbWFsbFZlY3RvcjxMYXRlSW5zdGFudGlhdGVkQXR0cmlidXRlLCAxNj4gTGF0ZUluc3RhbnRpYXRlZEF0dHJWZWM7CisKKyAgdm9pZCBJbnN0YW50aWF0ZUF0dHJzKGNvbnN0IE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbCAqUGF0dGVybiwgRGVjbCAqSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExhdGVJbnN0YW50aWF0ZWRBdHRyVmVjICpMYXRlQXR0cnMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxJbnN0YW50aWF0aW9uU2NvcGUgKk91dGVyTW9zdFNjb3BlID0gbnVsbHB0cik7CisKKyAgdm9pZAorICBJbnN0YW50aWF0ZUF0dHJzRm9yRGVjbChjb25zdCBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbCAqUGF0dGVybiwgRGVjbCAqSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0ZUluc3RhbnRpYXRlZEF0dHJWZWMgKkxhdGVBdHRycyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsSW5zdGFudGlhdGlvblNjb3BlICpPdXRlck1vc3RTY29wZSA9IG51bGxwdHIpOworCisgIGJvb2wgdXNlc1BhcnRpYWxPckV4cGxpY2l0U3BlY2lhbGl6YXRpb24oCisgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsIENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKkNsYXNzVGVtcGxhdGVTcGVjKTsKKworICBib29sCisgIEluc3RhbnRpYXRlQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uKFNvdXJjZUxvY2F0aW9uIFBvaW50T2ZJbnN0YW50aWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAqQ2xhc3NUZW1wbGF0ZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCBUU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluID0gdHJ1ZSk7CisKKyAgdm9pZCBJbnN0YW50aWF0ZUNsYXNzTWVtYmVycyhTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhSZWNvcmREZWNsICpJbnN0YW50aWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kIFRTSyk7CisKKyAgdm9pZCBJbnN0YW50aWF0ZUNsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbk1lbWJlcnMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKkNsYXNzVGVtcGxhdGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQgVFNLKTsKKworICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jCisgIFN1YnN0TmVzdGVkTmFtZVNwZWNpZmllckxvYyhOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIE5OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmVGVtcGxhdGVBcmdzKTsKKworICBEZWNsYXJhdGlvbk5hbWVJbmZvCisgIFN1YnN0RGVjbGFyYXRpb25OYW1lSW5mbyhjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZOYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmVGVtcGxhdGVBcmdzKTsKKyAgVGVtcGxhdGVOYW1lCisgIFN1YnN0VGVtcGxhdGVOYW1lKE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgUXVhbGlmaWVyTG9jLCBUZW1wbGF0ZU5hbWUgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncyk7CisgIGJvb2wgU3Vic3QoY29uc3QgVGVtcGxhdGVBcmd1bWVudExvYyAqQXJncywgdW5zaWduZWQgTnVtQXJncywKKyAgICAgICAgICAgICBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gJlJlc3VsdCwKKyAgICAgICAgICAgICBjb25zdCBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncyk7CisKKyAgdm9pZCBJbnN0YW50aWF0ZUV4Y2VwdGlvblNwZWMoU291cmNlTG9jYXRpb24gUG9pbnRPZkluc3RhbnRpYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uRGVjbCAqRnVuY3Rpb24pOworICBGdW5jdGlvbkRlY2wgKkluc3RhbnRpYXRlRnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvblRlbXBsYXRlRGVjbCAqRlRELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdCAqQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKTsKKyAgdm9pZCBJbnN0YW50aWF0ZUZ1bmN0aW9uRGVmaW5pdGlvbihTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkRlY2wgKkZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVjdXJzaXZlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZWZpbml0aW9uUmVxdWlyZWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEF0RW5kT2ZUVSA9IGZhbHNlKTsKKyAgVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKkJ1aWxkVmFyVGVtcGxhdGVJbnN0YW50aWF0aW9uKAorICAgICAgVmFyVGVtcGxhdGVEZWNsICpWYXJUZW1wbGF0ZSwgVmFyRGVjbCAqRnJvbVZhciwKKyAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ0xpc3QsCisgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gJlRlbXBsYXRlQXJnc0luZm8sCisgICAgICBTbWFsbFZlY3RvckltcGw8VGVtcGxhdGVBcmd1bWVudD4gJkNvbnZlcnRlZCwKKyAgICAgIFNvdXJjZUxvY2F0aW9uIFBvaW50T2ZJbnN0YW50aWF0aW9uLCB2b2lkICpJbnNlcnRQb3MsCisgICAgICBMYXRlSW5zdGFudGlhdGVkQXR0clZlYyAqTGF0ZUF0dHJzID0gbnVsbHB0ciwKKyAgICAgIExvY2FsSW5zdGFudGlhdGlvblNjb3BlICpTdGFydGluZ1Njb3BlID0gbnVsbHB0cik7CisgIFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICpDb21wbGV0ZVZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsKAorICAgICAgVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKlZhclNwZWMsIFZhckRlY2wgKlBhdHRlcm5EZWNsLAorICAgICAgY29uc3QgTXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MpOworICB2b2lkCisgIEJ1aWxkVmFyaWFibGVJbnN0YW50aWF0aW9uKFZhckRlY2wgKk5ld1ZhciwgVmFyRGVjbCAqT2xkVmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0ZUluc3RhbnRpYXRlZEF0dHJWZWMgKkxhdGVBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbENvbnRleHQgKk93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEluc3RhbnRpYXRpb25TY29wZSAqU3RhcnRpbmdTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbnN0YW50aWF0aW5nVmFyVGVtcGxhdGUgPSBmYWxzZSk7CisgIHZvaWQgSW5zdGFudGlhdGVWYXJpYWJsZUluaXRpYWxpemVyKAorICAgICAgVmFyRGVjbCAqVmFyLCBWYXJEZWNsICpPbGRWYXIsCisgICAgICBjb25zdCBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncyk7CisgIHZvaWQgSW5zdGFudGlhdGVWYXJpYWJsZURlZmluaXRpb24oU291cmNlTG9jYXRpb24gUG9pbnRPZkluc3RhbnRpYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyRGVjbCAqVmFyLCBib29sIFJlY3Vyc2l2ZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVmaW5pdGlvblJlcXVpcmVkID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBdEVuZE9mVFUgPSBmYWxzZSk7CisKKyAgdm9pZCBJbnN0YW50aWF0ZU1lbUluaXRpYWxpemVycyhDWFhDb25zdHJ1Y3RvckRlY2wgKk5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKlRtcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MpOworCisgIE5hbWVkRGVjbCAqRmluZEluc3RhbnRpYXRlZERlY2woU291cmNlTG9jYXRpb24gTG9jLCBOYW1lZERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEZpbmRpbmdJbnN0YW50aWF0ZWRDb250ZXh0ID0gZmFsc2UpOworICBEZWNsQ29udGV4dCAqRmluZEluc3RhbnRpYXRlZENvbnRleHQoU291cmNlTG9jYXRpb24gTG9jLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmVGVtcGxhdGVBcmdzKTsKKworICAvLyBPYmplY3RpdmUtQyBkZWNsYXJhdGlvbnMuCisgIGVudW0gT2JqQ0NvbnRhaW5lcktpbmQgeworICAgIE9DS19Ob25lID0gLTEsCisgICAgT0NLX0ludGVyZmFjZSA9IDAsCisgICAgT0NLX1Byb3RvY29sLAorICAgIE9DS19DYXRlZ29yeSwKKyAgICBPQ0tfQ2xhc3NFeHRlbnNpb24sCisgICAgT0NLX0ltcGxlbWVudGF0aW9uLAorICAgIE9DS19DYXRlZ29yeUltcGxlbWVudGF0aW9uCisgIH07CisgIE9iakNDb250YWluZXJLaW5kIGdldE9iakNDb250YWluZXJLaW5kKCkgY29uc3Q7CisKKyAgRGVjbFJlc3VsdCBhY3RPbk9iakNUeXBlUGFyYW0oU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNUeXBlUGFyYW1WYXJpYW5jZSB2YXJpYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gdmFyaWFuY2VMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqcGFyYW1OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBwYXJhbUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gY29sb25Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgdHlwZUJvdW5kKTsKKworICBPYmpDVHlwZVBhcmFtTGlzdCAqYWN0T25PYmpDVHlwZVBhcmFtTGlzdChTY29wZSAqUywgU291cmNlTG9jYXRpb24gbEFuZ2xlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxEZWNsICo+IHR5cGVQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIHJBbmdsZUxvYyk7CisgIHZvaWQgcG9wT2JqQ1R5cGVQYXJhbUxpc3QoU2NvcGUgKlMsIE9iakNUeXBlUGFyYW1MaXN0ICp0eXBlUGFyYW1MaXN0KTsKKworICBEZWNsICpBY3RPblN0YXJ0Q2xhc3NJbnRlcmZhY2UoU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdEludGVyZmFjZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDbGFzc0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNUeXBlUGFyYW1MaXN0ICp0eXBlUGFyYW1MaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKlN1cGVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN1cGVyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VkVHlwZT4gU3VwZXJUeXBlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFN1cGVyVHlwZUFyZ3NSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2wgKiBjb25zdCAqUHJvdG9SZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUHJvdG9SZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTG9jYXRpb24gKlByb3RvTG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZFByb3RvTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdCAqQXR0ckxpc3QpOworCisgIHZvaWQgQWN0T25TdXBlckNsYXNzT2ZDbGFzc0ludGVyZmFjZShTY29wZSAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEF0SW50ZXJmYWNlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ludGVyZmFjZURlY2wgKklEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKkNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENsYXNzTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKlN1cGVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN1cGVyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VkVHlwZT4gU3VwZXJUeXBlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFN1cGVyVHlwZUFyZ3NSYW5nZSk7CisKKyAgdm9pZCBBY3RPblR5cGVkZWZlZFByb3RvY29scyhTbWFsbFZlY3RvckltcGw8RGVjbCAqPiAmUHJvdG9jb2xSZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTb3VyY2VMb2NhdGlvbj4gJlByb3RvY29sTG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqU3VwZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN1cGVyTG9jKTsKKworICBEZWNsICpBY3RPbkNvbXBhdGliaWxpdHlBbGlhcygKKyAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXRDb21wYXRpYmlsaXR5QWxpYXNMb2MsCisgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpBbGlhc05hbWUsICBTb3VyY2VMb2NhdGlvbiBBbGlhc0xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqQ2xhc3NOYW1lLCBTb3VyY2VMb2NhdGlvbiBDbGFzc0xvY2F0aW9uKTsKKworICBib29sIENoZWNrRm9yd2FyZFByb3RvY29sRGVjbGFyYXRpb25Gb3JDaXJjdWxhckRlcGVuZGVuY3koCisgICAgSWRlbnRpZmllckluZm8gKlBOYW1lLAorICAgIFNvdXJjZUxvY2F0aW9uICZQTG9jLCBTb3VyY2VMb2NhdGlvbiBQcmV2TG9jLAorICAgIGNvbnN0IE9iakNMaXN0PE9iakNQcm90b2NvbERlY2w+ICZQTGlzdCk7CisKKyAgRGVjbCAqQWN0T25TdGFydFByb3RvY29sSW50ZXJmYWNlKAorICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdFByb3RvSW50ZXJmYWNlTG9jLAorICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqUHJvdG9jb2xOYW1lLCBTb3VyY2VMb2NhdGlvbiBQcm90b2NvbExvYywKKyAgICAgICAgICAgICAgICAgICAgRGVjbCAqIGNvbnN0ICpQcm90b1JlZk5hbWVzLCB1bnNpZ25lZCBOdW1Qcm90b1JlZnMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZUxvY2F0aW9uICpQcm90b0xvY3MsCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZFByb3RvTG9jLAorICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0ICpBdHRyTGlzdCk7CisKKyAgRGVjbCAqQWN0T25TdGFydENhdGVnb3J5SW50ZXJmYWNlKFNvdXJjZUxvY2F0aW9uIEF0SW50ZXJmYWNlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKkNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENsYXNzTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ1R5cGVQYXJhbUxpc3QgKnR5cGVQYXJhbUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqQ2F0ZWdvcnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQ2F0ZWdvcnlMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsICogY29uc3QgKlByb3RvUmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVByb3RvUmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZUxvY2F0aW9uICpQcm90b0xvY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRQcm90b0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3QgKkF0dHJMaXN0KTsKKworICBEZWNsICpBY3RPblN0YXJ0Q2xhc3NJbXBsZW1lbnRhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXRDbGFzc0ltcGxMb2MsCisgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpDbGFzc05hbWUsIFNvdXJjZUxvY2F0aW9uIENsYXNzTG9jLAorICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqU3VwZXJDbGFzc25hbWUsCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN1cGVyQ2xhc3NMb2MpOworCisgIERlY2wgKkFjdE9uU3RhcnRDYXRlZ29yeUltcGxlbWVudGF0aW9uKFNvdXJjZUxvY2F0aW9uIEF0Q2F0SW1wbExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKkNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQ2xhc3NMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpDYXROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDYXRMb2MpOworCisgIERlY2xHcm91cFB0clR5IEFjdE9uRmluaXNoT2JqQ0ltcGxlbWVudGF0aW9uKERlY2wgKk9iakNJbXBEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxEZWNsICo+IERlY2xzKTsKKworICBEZWNsR3JvdXBQdHJUeSBBY3RPbkZvcndhcmRDbGFzc0RlY2xhcmF0aW9uKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqKklkZW50TGlzdCwKKyAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqSWRlbnRMb2NzLAorICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9iakNUeXBlUGFyYW1MaXN0ICo+IFR5cGVQYXJhbUxpc3RzLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUVsdHMpOworCisgIERlY2xHcm91cFB0clR5IEFjdE9uRm9yd2FyZFByb3RvY29sRGVjbGFyYXRpb24oU291cmNlTG9jYXRpb24gQXRQcm90b2NsTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPElkZW50aWZpZXJMb2NQYWlyPiBJZGVudExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdCAqYXR0ckxpc3QpOworCisgIHZvaWQgRmluZFByb3RvY29sRGVjbGFyYXRpb24oYm9vbCBXYXJuT25EZWNsYXJhdGlvbnMsIGJvb2wgRm9yT2JqQ0NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxJZGVudGlmaWVyTG9jUGFpcj4gUHJvdG9jb2xJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8RGVjbCAqPiAmUHJvdG9jb2xzKTsKKworICB2b2lkIERpYWdub3NlVHlwZUFyZ3NBbmRQcm90b2NvbHMoSWRlbnRpZmllckluZm8gKlByb3RvY29sSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQcm90b2NvbExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpUeXBlQXJnSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUeXBlQXJnTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTZWxlY3RQcm90b2NvbEZpcnN0ID0gZmFsc2UpOworCisgIC8vLyBHaXZlbiBhIGxpc3Qgb2YgaWRlbnRpZmllcnMgKGFuZCB0aGVpciBsb2NhdGlvbnMpLCByZXNvbHZlIHRoZQorICAvLy8gbmFtZXMgdG8gZWl0aGVyIE9iamVjdGl2ZS1DIHByb3RvY29sIHF1YWxpZmllcnMgb3IgdHlwZQorICAvLy8gYXJndW1lbnRzLCBhcyBhcHByb3ByaWF0ZS4KKyAgdm9pZCBhY3RPbk9iakNUeXBlQXJnc09yUHJvdG9jb2xRdWFsaWZpZXJzKAorICAgICAgICAgU2NvcGUgKlMsCisgICAgICAgICBQYXJzZWRUeXBlIGJhc2VUeXBlLAorICAgICAgICAgU291cmNlTG9jYXRpb24gbEFuZ2xlTG9jLAorICAgICAgICAgQXJyYXlSZWY8SWRlbnRpZmllckluZm8gKj4gaWRlbnRpZmllcnMsCisgICAgICAgICBBcnJheVJlZjxTb3VyY2VMb2NhdGlvbj4gaWRlbnRpZmllckxvY3MsCisgICAgICAgICBTb3VyY2VMb2NhdGlvbiByQW5nbGVMb2MsCisgICAgICAgICBTb3VyY2VMb2NhdGlvbiAmdHlwZUFyZ3NMQW5nbGVMb2MsCisgICAgICAgICBTbWFsbFZlY3RvckltcGw8UGFyc2VkVHlwZT4gJnR5cGVBcmdzLAorICAgICAgICAgU291cmNlTG9jYXRpb24gJnR5cGVBcmdzUkFuZ2xlTG9jLAorICAgICAgICAgU291cmNlTG9jYXRpb24gJnByb3RvY29sTEFuZ2xlTG9jLAorICAgICAgICAgU21hbGxWZWN0b3JJbXBsPERlY2wgKj4gJnByb3RvY29scywKKyAgICAgICAgIFNvdXJjZUxvY2F0aW9uICZwcm90b2NvbFJBbmdsZUxvYywKKyAgICAgICAgIGJvb2wgd2Fybk9uSW5jb21wbGV0ZVByb3RvY29scyk7CisKKyAgLy8vIEJ1aWxkIGEgYW4gT2JqZWN0aXZlLUMgcHJvdG9jb2wtcXVhbGlmaWVkICdpZCcgdHlwZSB3aGVyZSBubworICAvLy8gYmFzZSB0eXBlIHdhcyBzcGVjaWZpZWQuCisgIFR5cGVSZXN1bHQgYWN0T25PYmpDUHJvdG9jb2xRdWFsaWZpZXJUeXBlKAorICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gbEFuZ2xlTG9jLAorICAgICAgICAgICAgICAgQXJyYXlSZWY8RGVjbCAqPiBwcm90b2NvbHMsCisgICAgICAgICAgICAgICBBcnJheVJlZjxTb3VyY2VMb2NhdGlvbj4gcHJvdG9jb2xMb2NzLAorICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gckFuZ2xlTG9jKTsKKworICAvLy8gQnVpbGQgYSBzcGVjaWFsaXplZCBhbmQvb3IgcHJvdG9jb2wtcXVhbGlmaWVkIE9iamVjdGl2ZS1DIHR5cGUuCisgIFR5cGVSZXN1bHQgYWN0T25PYmpDVHlwZUFyZ3NBbmRQcm90b2NvbFF1YWxpZmllcnMoCisgICAgICAgICAgICAgICBTY29wZSAqUywKKyAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgQmFzZVR5cGUsCisgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUeXBlQXJnc0xBbmdsZUxvYywKKyAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlZFR5cGU+IFR5cGVBcmdzLAorICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVHlwZUFyZ3NSQW5nbGVMb2MsCisgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQcm90b2NvbExBbmdsZUxvYywKKyAgICAgICAgICAgICAgIEFycmF5UmVmPERlY2wgKj4gUHJvdG9jb2xzLAorICAgICAgICAgICAgICAgQXJyYXlSZWY8U291cmNlTG9jYXRpb24+IFByb3RvY29sTG9jcywKKyAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFByb3RvY29sUkFuZ2xlTG9jKTsKKworICAvLy8gQnVpbGQgYW4gT2JqZWN0aXZlLUMgdHlwZSBwYXJhbWV0ZXIgdHlwZS4KKyAgUXVhbFR5cGUgQnVpbGRPYmpDVHlwZVBhcmFtVHlwZShjb25zdCBPYmpDVHlwZVBhcmFtRGVjbCAqRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQcm90b2NvbExBbmdsZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPYmpDUHJvdG9jb2xEZWNsICo+IFByb3RvY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTb3VyY2VMb2NhdGlvbj4gUHJvdG9jb2xMb2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFByb3RvY29sUkFuZ2xlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRmFpbE9uRXJyb3IgPSBmYWxzZSk7CisKKyAgLy8vIEJ1aWxkIGFuIE9iamVjdGl2ZS1DIG9iamVjdCBwb2ludGVyIHR5cGUuCisgIFF1YWxUeXBlIEJ1aWxkT2JqQ09iamVjdFR5cGUoUXVhbFR5cGUgQmFzZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFR5cGVBcmdzTEFuZ2xlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFR5cGVTb3VyY2VJbmZvICo+IFR5cGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFR5cGVBcmdzUkFuZ2xlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFByb3RvY29sTEFuZ2xlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9iakNQcm90b2NvbERlY2wgKj4gUHJvdG9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNvdXJjZUxvY2F0aW9uPiBQcm90b2NvbExvY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUHJvdG9jb2xSQW5nbGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBGYWlsT25FcnJvciA9IGZhbHNlKTsKKworICAvLy8gQ2hlY2sgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBPYmplY3RpdmUtQyAnX19raW5kb2YnIHF1YWxpZmllciB0bworICAvLy8gdGhlIGdpdmVuIHR5cGUuCisgIGJvb2wgY2hlY2tPYmpDS2luZE9mVHlwZShRdWFsVHlwZSAmdHlwZSwgU291cmNlTG9jYXRpb24gbG9jKTsKKworICAvLy8gRW5zdXJlIGF0dHJpYnV0ZXMgYXJlIGNvbnNpc3RlbnQgd2l0aCB0eXBlLgorICAvLy8gXHBhcmFtIFtpbiwgb3V0XSBBdHRyaWJ1dGVzIFRoZSBhdHRyaWJ1dGVzIHRvIGNoZWNrOyB0aGV5IHdpbGwKKyAgLy8vIGJlIG1vZGlmaWVkIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBccCBQcm9wZXJ0eVR5LgorICB2b2lkIENoZWNrT2JqQ1Byb3BlcnR5QXR0cmlidXRlcyhEZWNsICpQcm9wZXJ0eVB0clR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByb3BlcnR5SW5QcmltYXJ5Q2xhc3MpOworCisgIC8vLyBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgZGVjbGFyYXRpb24gYW5kIGNyZWF0ZSBkZWNscyBmb3IgdGhlCisgIC8vLyBzZXR0ZXJzIGFuZCBnZXR0ZXJzIGFzIG5lZWRlZC4KKyAgLy8vIFxwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgZGVjbGFyYXRpb24gYmVpbmcgcHJvY2Vzc2VkCisgIHZvaWQgUHJvY2Vzc1Byb3BlcnR5RGVjbChPYmpDUHJvcGVydHlEZWNsICpwcm9wZXJ0eSk7CisKKworICB2b2lkIERpYWdub3NlUHJvcGVydHlNaXNtYXRjaChPYmpDUHJvcGVydHlEZWNsICpQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ1Byb3BlcnR5RGVjbCAqU3VwZXJQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSWRlbnRpZmllckluZm8gKk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT3ZlcnJpZGluZ1Byb3RvY29sUHJvcGVydHkpOworCisgIHZvaWQgRGlhZ25vc2VDbGFzc0V4dGVuc2lvbkR1cE1ldGhvZHMoT2JqQ0NhdGVnb3J5RGVjbCAqQ0FULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNJbnRlcmZhY2VEZWNsICpJRCk7CisKKyAgRGVjbCAqQWN0T25BdEVuZChTY29wZSAqUywgU291cmNlUmFuZ2UgQXRFbmQsCisgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RGVjbCAqPiBhbGxNZXRob2RzID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxEZWNsR3JvdXBQdHJUeT4gYWxsVFVWYXJzID0gTm9uZSk7CisKKyAgRGVjbCAqQWN0T25Qcm9wZXJ0eShTY29wZSAqUywgU291cmNlTG9jYXRpb24gQXRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVjbGFyYXRvciAmRkQsIE9iakNEZWNsU3BlYyAmT0RTLAorICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIEdldHRlclNlbCwgU2VsZWN0b3IgU2V0dGVyU2VsLAorICAgICAgICAgICAgICAgICAgICAgIHRvazo6T2JqQ0tleXdvcmRLaW5kIE1ldGhvZEltcGxLaW5kLAorICAgICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpsZXhpY2FsREMgPSBudWxscHRyKTsKKworICBEZWNsICpBY3RPblByb3BlcnR5SW1wbERlY2woU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFByb3BlcnR5TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbXBsS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpQcm9wZXJ0eUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKlByb3BlcnR5SXZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFByb3BlcnR5SXZhckxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNQcm9wZXJ0eVF1ZXJ5S2luZCBRdWVyeUtpbmQpOworCisgIGVudW0gT2JqQ1NwZWNpYWxNZXRob2RLaW5kIHsKKyAgICBPU01LX05vbmUsCisgICAgT1NNS19BbGxvYywKKyAgICBPU01LX05ldywKKyAgICBPU01LX0NvcHksCisgICAgT1NNS19SZXRhaW5pbmdJbml0LAorICAgIE9TTUtfTm9uUmV0YWluaW5nSW5pdAorICB9OworCisgIHN0cnVjdCBPYmpDQXJnSW5mbyB7CisgICAgSWRlbnRpZmllckluZm8gKk5hbWU7CisgICAgU291cmNlTG9jYXRpb24gTmFtZUxvYzsKKyAgICAvLyBUaGUgVHlwZSBpcyBudWxsIGlmIG5vIHR5cGUgd2FzIHNwZWNpZmllZCwgYW5kIHRoZSBEZWNsU3BlYyBpcyBpbnZhbGlkCisgICAgLy8gaW4gdGhpcyBjYXNlLgorICAgIFBhcnNlZFR5cGUgVHlwZTsKKyAgICBPYmpDRGVjbFNwZWMgRGVjbFNwZWM7CisKKyAgICAvLy8gQXJnQXR0cnMgLSBBdHRyaWJ1dGUgbGlzdCBmb3IgdGhpcyBhcmd1bWVudC4KKyAgICBBdHRyaWJ1dGVMaXN0ICpBcmdBdHRyczsKKyAgfTsKKworICBEZWNsICpBY3RPbk1ldGhvZERlY2xhcmF0aW9uKAorICAgIFNjb3BlICpTLAorICAgIFNvdXJjZUxvY2F0aW9uIEJlZ2luTG9jLCAvLyBsb2NhdGlvbiBvZiB0aGUgKyBvciAtLgorICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywgICAvLyBsb2NhdGlvbiBvZiB0aGUgOyBvciB7LgorICAgIHRvazo6VG9rZW5LaW5kIE1ldGhvZFR5cGUsCisgICAgT2JqQ0RlY2xTcGVjICZSZXR1cm5RVCwgUGFyc2VkVHlwZSBSZXR1cm5UeXBlLAorICAgIEFycmF5UmVmPFNvdXJjZUxvY2F0aW9uPiBTZWxlY3RvckxvY3MsIFNlbGVjdG9yIFNlbCwKKyAgICAvLyBvcHRpb25hbCBhcmd1bWVudHMuIFRoZSBudW1iZXIgb2YgdHlwZXMvYXJndW1lbnRzIGlzIG9idGFpbmVkCisgICAgLy8gZnJvbSB0aGUgU2VsLmdldE51bUFyZ3MoKS4KKyAgICBPYmpDQXJnSW5mbyAqQXJnSW5mbywKKyAgICBEZWNsYXJhdG9yQ2h1bms6OlBhcmFtSW5mbyAqQ1BhcmFtSW5mbywgdW5zaWduZWQgQ051bUFyZ3MsIC8vIGMtc3R5bGUgYXJncworICAgIEF0dHJpYnV0ZUxpc3QgKkF0dHJMaXN0LCB0b2s6Ok9iakNLZXl3b3JkS2luZCBNZXRob2RJbXBsS2luZCwKKyAgICBib29sIGlzVmFyaWFkaWMsIGJvb2wgTWV0aG9kRGVmaW5pdGlvbik7CisKKyAgT2JqQ01ldGhvZERlY2wgKkxvb2t1cE1ldGhvZEluUXVhbGlmaWVkVHlwZShTZWxlY3RvciBTZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ09iamVjdFBvaW50ZXJUeXBlICpPUFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0luc3RhbmNlKTsKKyAgT2JqQ01ldGhvZERlY2wgKkxvb2t1cE1ldGhvZEluT2JqZWN0VHlwZShTZWxlY3RvciBTZWwsIFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbnN0YW5jZSk7CisKKyAgYm9vbCBDaGVja0FSQ01ldGhvZERlY2woT2JqQ01ldGhvZERlY2wgKm1ldGhvZCk7CisgIGJvb2wgaW5mZXJPYmpDQVJDTGlmZXRpbWUoVmFsdWVEZWNsICpkZWNsKTsKKworICBFeHByUmVzdWx0CisgIEhhbmRsZUV4cHJQcm9wZXJ0eVJlZkV4cHIoY29uc3QgT2JqQ09iamVjdFBvaW50ZXJUeXBlICpPUFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqQmFzZUV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gT3BMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lIE1lbWJlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTWVtYmVyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN1cGVyTG9jLCBRdWFsVHlwZSBTdXBlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTdXBlcik7CisKKyAgRXhwclJlc3VsdAorICBBY3RPbkNsYXNzUHJvcGVydHlSZWZFeHByKElkZW50aWZpZXJJbmZvICZyZWNlaXZlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gJnByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiByZWNlaXZlck5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gcHJvcGVydHlOYW1lTG9jKTsKKworICBPYmpDTWV0aG9kRGVjbCAqdHJ5Q2FwdHVyZU9iakNTZWxmKFNvdXJjZUxvY2F0aW9uIExvYyk7CisKKyAgLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIGtpbmQgb2YgbWVzc2FnZSBleHByZXNzaW9uIGluZGljYXRlZCBieSBhIG1lc3NhZ2UKKyAgLy8vIHNlbmQgdGhhdCBzdGFydHMgd2l0aCBhbiBpZGVudGlmaWVyLgorICBlbnVtIE9iakNNZXNzYWdlS2luZCB7CisgICAgLy8vIFxicmllZiBUaGUgbWVzc2FnZSBpcyBzZW50IHRvICdzdXBlcicuCisgICAgT2JqQ1N1cGVyTWVzc2FnZSwKKyAgICAvLy8gXGJyaWVmIFRoZSBtZXNzYWdlIGlzIGFuIGluc3RhbmNlIG1lc3NhZ2UuCisgICAgT2JqQ0luc3RhbmNlTWVzc2FnZSwKKyAgICAvLy8gXGJyaWVmIFRoZSBtZXNzYWdlIGlzIGEgY2xhc3MgbWVzc2FnZSwgYW5kIHRoZSBpZGVudGlmaWVyIGlzIGEgdHlwZQorICAgIC8vLyBuYW1lLgorICAgIE9iakNDbGFzc01lc3NhZ2UKKyAgfTsKKworICBPYmpDTWVzc2FnZUtpbmQgZ2V0T2JqQ01lc3NhZ2VLaW5kKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1N1cGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzVHJhaWxpbmdEb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSAmUmVjZWl2ZXJUeXBlKTsKKworICBFeHByUmVzdWx0IEFjdE9uU3VwZXJNZXNzYWdlKFNjb3BlICpTLCBTb3VyY2VMb2NhdGlvbiBTdXBlckxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBTZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTEJyYWNMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U291cmNlTG9jYXRpb24+IFNlbGVjdG9yTG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSQnJhY0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aUV4cHJBcmcgQXJncyk7CisKKyAgRXhwclJlc3VsdCBCdWlsZENsYXNzTWVzc2FnZShUeXBlU291cmNlSW5mbyAqUmVjZWl2ZXJUeXBlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBSZWNlaXZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3VwZXJMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3IgU2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsICpNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTEJyYWNMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U291cmNlTG9jYXRpb24+IFNlbGVjdG9yTG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSQnJhY0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aUV4cHJBcmcgQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzSW1wbGljaXQgPSBmYWxzZSk7CisKKyAgRXhwclJlc3VsdCBCdWlsZENsYXNzTWVzc2FnZUltcGxpY2l0KFF1YWxUeXBlIFJlY2VpdmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdXBlclJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3IgU2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ01ldGhvZERlY2wgKk1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpRXhwckFyZyBBcmdzKTsKKworICBFeHByUmVzdWx0IEFjdE9uQ2xhc3NNZXNzYWdlKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgUmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3IgU2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExCcmFjTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNvdXJjZUxvY2F0aW9uPiBTZWxlY3RvckxvY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUkJyYWNMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlFeHByQXJnIEFyZ3MpOworCisgIEV4cHJSZXN1bHQgQnVpbGRJbnN0YW5jZU1lc3NhZ2UoRXhwciAqUmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgUmVjZWl2ZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN1cGVyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIFNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDTWV0aG9kRGVjbCAqTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExCcmFjTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNvdXJjZUxvY2F0aW9uPiBTZWxlY3RvckxvY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUkJyYWNMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlFeHByQXJnIEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0ltcGxpY2l0ID0gZmFsc2UpOworCisgIEV4cHJSZXN1bHQgQnVpbGRJbnN0YW5jZU1lc3NhZ2VJbXBsaWNpdChFeHByICpSZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFJlY2VpdmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIFNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsICpNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aUV4cHJBcmcgQXJncyk7CisKKyAgRXhwclJlc3VsdCBBY3RPbkluc3RhbmNlTWVzc2FnZShTY29wZSAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpSZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBTZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTEJyYWNMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U291cmNlTG9jYXRpb24+IFNlbGVjdG9yTG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSQnJhY0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aUV4cHJBcmcgQXJncyk7CisKKyAgRXhwclJlc3VsdCBCdWlsZE9iakNCcmlkZ2VkQ2FzdChTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0JyaWRnZUNhc3RLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQnJpZGdlS2V5d29yZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqVFNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKlN1YkV4cHIpOworCisgIEV4cHJSZXN1bHQgQWN0T25PYmpDQnJpZGdlZENhc3QoU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNCcmlkZ2VDYXN0S2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEJyaWRnZUtleXdvcmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpTdWJFeHByKTsKKworICB2b2lkIENoZWNrVG9sbEZyZWVCcmlkZ2VDYXN0KFF1YWxUeXBlIGNhc3RUeXBlLCBFeHByICpjYXN0RXhwcik7CisKKyAgdm9pZCBDaGVja09iakNCcmlkZ2VSZWxhdGVkQ2FzdChRdWFsVHlwZSBjYXN0VHlwZSwgRXhwciAqY2FzdEV4cHIpOworCisgIGJvb2wgQ2hlY2tUb2xsRnJlZUJyaWRnZVN0YXRpY0Nhc3QoUXVhbFR5cGUgY2FzdFR5cGUsIEV4cHIgKmNhc3RFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3RLaW5kICZLaW5kKTsKKworICBib29sIGNoZWNrT2JqQ0JyaWRnZVJlbGF0ZWRDb21wb25lbnRzKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBEZXN0VHlwZSwgUXVhbFR5cGUgU3JjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDSW50ZXJmYWNlRGVjbCAqJlJlbGF0ZWRDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDTWV0aG9kRGVjbCAqJkNsYXNzTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsIComSW5zdGFuY2VNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZWRlZk5hbWVEZWNsIComVERORGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENmVG9OcywgYm9vbCBEaWFnbm9zZSA9IHRydWUpOworCisgIGJvb2wgQ2hlY2tPYmpDQnJpZGdlUmVsYXRlZENvbnZlcnNpb25zKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgRGVzdFR5cGUsIFF1YWxUeXBlIFNyY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKiZTcmNFeHByLCBib29sIERpYWdub3NlID0gdHJ1ZSk7CisKKyAgYm9vbCBDb252ZXJzaW9uVG9PYmpDU3RyaW5nTGl0ZXJhbENoZWNrKFF1YWxUeXBlIERzdFR5cGUsIEV4cHIgKiZTcmNFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEaWFnbm9zZSA9IHRydWUpOworCisgIGJvb2wgY2hlY2tJbml0TWV0aG9kKE9iakNNZXRob2REZWNsICptZXRob2QsIFF1YWxUeXBlIHJlY2VpdmVyVHlwZUlmQ2FsbCk7CisKKyAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBuZXcgbWV0aG9kIGlzIGEgdmFsaWQgb3ZlcnJpZGUgb2YgdGhlCisgIC8vLyBnaXZlbiBvdmVycmlkZGVuIG1ldGhvZCwgYW5kIHNldCBhbnkgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSBpbmhlcml0ZWQuCisgIHZvaWQgQ2hlY2tPYmpDTWV0aG9kT3ZlcnJpZGUoT2JqQ01ldGhvZERlY2wgKk5ld01ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqT3ZlcnJpZGRlbik7CisKKyAgLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIGNvbXBhdGliaWxpdHkgb2YgYSByZXN1bHQgdHlwZSB3aXRoIGl0cyBtZXRob2QuCisgIGVudW0gUmVzdWx0VHlwZUNvbXBhdGliaWxpdHlLaW5kIHsKKyAgICBSVENfQ29tcGF0aWJsZSwKKyAgICBSVENfSW5jb21wYXRpYmxlLAorICAgIFJUQ19Vbmtub3duCisgIH07CisKKyAgdm9pZCBDaGVja09iakNNZXRob2RPdmVycmlkZXMoT2JqQ01ldGhvZERlY2wgKk9iakNNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNJbnRlcmZhY2VEZWNsICpDdXJyZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFR5cGVDb21wYXRpYmlsaXR5S2luZCBSVEMpOworCisgIGVudW0gUHJhZ21hT3B0aW9uc0FsaWduS2luZCB7CisgICAgUE9BS19OYXRpdmUsICAvLyAjcHJhZ21hIG9wdGlvbnMgYWxpZ249bmF0aXZlCisgICAgUE9BS19OYXR1cmFsLCAvLyAjcHJhZ21hIG9wdGlvbnMgYWxpZ249bmF0dXJhbAorICAgIFBPQUtfUGFja2VkLCAgLy8gI3ByYWdtYSBvcHRpb25zIGFsaWduPXBhY2tlZAorICAgIFBPQUtfUG93ZXIsICAgLy8gI3ByYWdtYSBvcHRpb25zIGFsaWduPXBvd2VyCisgICAgUE9BS19NYWM2OGssICAvLyAjcHJhZ21hIG9wdGlvbnMgYWxpZ249bWFjNjhrCisgICAgUE9BS19SZXNldCAgICAvLyAjcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQKKyAgfTsKKworICAvLy8gQWN0T25QcmFnbWFDbGFuZ1NlY3Rpb24gLSBDYWxsZWQgb24gd2VsbCBmb3JtZWQgXCNwcmFnbWEgY2xhbmcgc2VjdGlvbgorICB2b2lkIEFjdE9uUHJhZ21hQ2xhbmdTZWN0aW9uKFNvdXJjZUxvY2F0aW9uIFByYWdtYUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmFnbWFDbGFuZ1NlY3Rpb25BY3Rpb24gQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByYWdtYUNsYW5nU2VjdGlvbktpbmQgU2VjS2luZCwgU3RyaW5nUmVmIFNlY05hbWUpOworCisgIC8vLyBBY3RPblByYWdtYU9wdGlvbnNBbGlnbiAtIENhbGxlZCBvbiB3ZWxsIGZvcm1lZCBcI3ByYWdtYSBvcHRpb25zIGFsaWduLgorICB2b2lkIEFjdE9uUHJhZ21hT3B0aW9uc0FsaWduKFByYWdtYU9wdGlvbnNBbGlnbktpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQcmFnbWFMb2MpOworCisgIC8vLyBBY3RPblByYWdtYVBhY2sgLSBDYWxsZWQgb24gd2VsbCBmb3JtZWQgXCNwcmFnbWEgcGFjayguLi4pLgorICB2b2lkIEFjdE9uUHJhZ21hUGFjayhTb3VyY2VMb2NhdGlvbiBQcmFnbWFMb2MsIFByYWdtYU1zU3RhY2tBY3Rpb24gQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2xvdExhYmVsLCBFeHByICpBbGlnbm1lbnQpOworCisgIGVudW0gY2xhc3MgUHJhZ21hUGFja0RpYWdub3NlS2luZCB7CisgICAgTm9uRGVmYXVsdFN0YXRlQXRJbmNsdWRlLAorICAgIENoYW5nZWRTdGF0ZUF0RXhpdAorICB9OworCisgIHZvaWQgRGlhZ25vc2VOb25EZWZhdWx0UHJhZ21hUGFjayhQcmFnbWFQYWNrRGlhZ25vc2VLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJbmNsdWRlTG9jKTsKKyAgdm9pZCBEaWFnbm9zZVVudGVybWluYXRlZFByYWdtYVBhY2soKTsKKworICAvLy8gQWN0T25QcmFnbWFNU1N0cnVjdCAtIENhbGxlZCBvbiB3ZWxsIGZvcm1lZCBcI3ByYWdtYSBtc19zdHJ1Y3QgW29ufG9mZl0uCisgIHZvaWQgQWN0T25QcmFnbWFNU1N0cnVjdChQcmFnbWFNU1N0cnVjdEtpbmQgS2luZCk7CisKKyAgLy8vIEFjdE9uUHJhZ21hTVNDb21tZW50IC0gQ2FsbGVkIG9uIHdlbGwgZm9ybWVkCisgIC8vLyBcI3ByYWdtYSBjb21tZW50KGtpbmQsICJhcmciKS4KKyAgdm9pZCBBY3RPblByYWdtYU1TQ29tbWVudChTb3VyY2VMb2NhdGlvbiBDb21tZW50TG9jLCBQcmFnbWFNU0NvbW1lbnRLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEFyZyk7CisKKyAgLy8vIEFjdE9uUHJhZ21hTVNQb2ludGVyc1RvTWVtYmVycyAtIGNhbGxlZCBvbiB3ZWxsIGZvcm1lZCBcI3ByYWdtYQorICAvLy8gcG9pbnRlcnNfdG9fbWVtYmVycyhyZXByZXNlbnRhdGlvbiBtZXRob2RbLCBnZW5lcmFsIHB1cnBvc2UKKyAgLy8vIHJlcHJlc2VudGF0aW9uXSkuCisgIHZvaWQgQWN0T25QcmFnbWFNU1BvaW50ZXJzVG9NZW1iZXJzKAorICAgICAgTGFuZ09wdGlvbnM6OlByYWdtYU1TUG9pbnRlcnNUb01lbWJlcnNLaW5kIEtpbmQsCisgICAgICBTb3VyY2VMb2NhdGlvbiBQcmFnbWFMb2MpOworCisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwgZm9ybWVkIFwjcHJhZ21hIHZ0b3JkaXNwKCkuCisgIHZvaWQgQWN0T25QcmFnbWFNU1Z0b3JEaXNwKFByYWdtYU1zU3RhY2tBY3Rpb24gQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQcmFnbWFMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TVnRvckRpc3BBdHRyOjpNb2RlIFZhbHVlKTsKKworICBlbnVtIFByYWdtYVNlY3Rpb25LaW5kIHsKKyAgICBQU0tfRGF0YVNlZywKKyAgICBQU0tfQlNTU2VnLAorICAgIFBTS19Db25zdFNlZywKKyAgICBQU0tfQ29kZVNlZywKKyAgfTsKKworICBib29sIFVuaWZ5U2VjdGlvbihTdHJpbmdSZWYgU2VjdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgIGludCBTZWN0aW9uRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0b3JEZWNsICpUaGVEZWNsKTsKKyAgYm9vbCBVbmlmeVNlY3Rpb24oU3RyaW5nUmVmIFNlY3Rpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICBpbnQgU2VjdGlvbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQcmFnbWFTZWN0aW9uTG9jYXRpb24pOworCisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwgZm9ybWVkIFwjcHJhZ21hIGJzc19zZWcvZGF0YV9zZWcvY29uc3Rfc2VnL2NvZGVfc2VnLgorICB2b2lkIEFjdE9uUHJhZ21hTVNTZWcoU291cmNlTG9jYXRpb24gUHJhZ21hTG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBQcmFnbWFNc1N0YWNrQWN0aW9uIEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBTdGFja1Nsb3RMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgKlNlZ21lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIFByYWdtYU5hbWUpOworCisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwgZm9ybWVkIFwjcHJhZ21hIHNlY3Rpb24oKS4KKyAgdm9pZCBBY3RPblByYWdtYU1TU2VjdGlvbihTb3VyY2VMb2NhdGlvbiBQcmFnbWFMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgU2VjdGlvbkZsYWdzLCBTdHJpbmdMaXRlcmFsICpTZWdtZW50TmFtZSk7CisKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgXCNwcmFnbWEgaW5pdF9zZWcoKS4KKyAgdm9pZCBBY3RPblByYWdtYU1TSW5pdFNlZyhTb3VyY2VMb2NhdGlvbiBQcmFnbWFMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsICpTZWdtZW50TmFtZSk7CisKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gI3ByYWdtYSBjbGFuZyBfX2RlYnVnIGR1bXAgSUkKKyAgdm9pZCBBY3RPblByYWdtYUR1bXAoU2NvcGUgKlMsIFNvdXJjZUxvY2F0aW9uIExvYywgSWRlbnRpZmllckluZm8gKklJKTsKKworICAvLy8gQWN0T25QcmFnbWFEZXRlY3RNaXNtYXRjaCAtIENhbGwgb24gd2VsbC1mb3JtZWQgXCNwcmFnbWEgZGV0ZWN0X21pc21hdGNoCisgIHZvaWQgQWN0T25QcmFnbWFEZXRlY3RNaXNtYXRjaChTb3VyY2VMb2NhdGlvbiBMb2MsIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFZhbHVlKTsKKworICAvLy8gQWN0T25QcmFnbWFVbnVzZWQgLSBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ1wjcHJhZ21hIHVudXNlZCcuCisgIHZvaWQgQWN0T25QcmFnbWFVbnVzZWQoY29uc3QgVG9rZW4gJklkZW50aWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU2NvcGUgKmN1clNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFByYWdtYUxvYyk7CisKKyAgLy8vIEFjdE9uUHJhZ21hVmlzaWJpbGl0eSAtIENhbGxlZCBvbiB3ZWxsIGZvcm1lZCBcI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eS4uLiAuCisgIHZvaWQgQWN0T25QcmFnbWFWaXNpYmlsaXR5KGNvbnN0IElkZW50aWZpZXJJbmZvKiBWaXNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQcmFnbWFMb2MpOworCisgIE5hbWVkRGVjbCAqRGVjbENsb25lUHJhZ21hV2VhayhOYW1lZERlY2wgKk5ELCBJZGVudGlmaWVySW5mbyAqSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpOworICB2b2lkIERlY2xBcHBseVByYWdtYVdlYWsoU2NvcGUgKlMsIE5hbWVkRGVjbCAqTkQsIFdlYWtJbmZvICZXKTsKKworICAvLy8gQWN0T25QcmFnbWFXZWFrSUQgLSBDYWxsZWQgb24gd2VsbCBmb3JtZWQgXCNwcmFnbWEgd2VhayBpZGVudC4KKyAgdm9pZCBBY3RPblByYWdtYVdlYWtJRChJZGVudGlmaWVySW5mbyogV2Vha05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUHJhZ21hTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFdlYWtOYW1lTG9jKTsKKworICAvLy8gQWN0T25QcmFnbWFSZWRlZmluZUV4dG5hbWUgLSBDYWxsZWQgb24gd2VsbCBmb3JtZWQKKyAgLy8vIFwjcHJhZ21hIHJlZGVmaW5lX2V4dG5hbWUgb2xkbmFtZSBuZXduYW1lLgorICB2b2lkIEFjdE9uUHJhZ21hUmVkZWZpbmVFeHRuYW1lKElkZW50aWZpZXJJbmZvKiBXZWFrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyogQWxpYXNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFByYWdtYUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBXZWFrTmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBbGlhc05hbWVMb2MpOworCisgIC8vLyBBY3RPblByYWdtYVdlYWtBbGlhcyAtIENhbGxlZCBvbiB3ZWxsIGZvcm1lZCBcI3ByYWdtYSB3ZWFrIGlkZW50ID0gaWRlbnQuCisgIHZvaWQgQWN0T25QcmFnbWFXZWFrQWxpYXMoSWRlbnRpZmllckluZm8qIFdlYWtOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvKiBBbGlhc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUHJhZ21hTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFdlYWtOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEFsaWFzTmFtZUxvYyk7CisKKyAgLy8vIEFjdE9uUHJhZ21hRlBDb250cmFjdCAtIENhbGxlZCBvbiB3ZWxsIGZvcm1lZAorICAvLy8gXCNwcmFnbWEge1NUREMsT1BFTkNMfSBGUF9DT05UUkFDVCBhbmQKKyAgLy8vIFwjcHJhZ21hIGNsYW5nIGZwIGNvbnRyYWN0CisgIHZvaWQgQWN0T25QcmFnbWFGUENvbnRyYWN0KExhbmdPcHRpb25zOjpGUENvbnRyYWN0TW9kZUtpbmQgRlBDKTsKKworICAvLy8gQWRkQWxpZ25tZW50QXR0cmlidXRlc0ZvclJlY29yZCAtIEFkZHMgYW55IG5lZWRlZCBhbGlnbm1lbnQgYXR0cmlidXRlcyB0bworICAvLy8gYSB0aGUgcmVjb3JkIGRlY2wsIHRvIGhhbmRsZSAnXCNwcmFnbWEgcGFjaycgYW5kICdcI3ByYWdtYSBvcHRpb25zIGFsaWduJy4KKyAgdm9pZCBBZGRBbGlnbm1lbnRBdHRyaWJ1dGVzRm9yUmVjb3JkKFJlY29yZERlY2wgKlJEKTsKKworICAvLy8gQWRkTXNTdHJ1Y3RMYXlvdXRGb3JSZWNvcmQgLSBBZGRzIG1zX3N0cnVjdCBsYXlvdXQgYXR0cmlidXRlIHRvIHJlY29yZC4KKyAgdm9pZCBBZGRNc1N0cnVjdExheW91dEZvclJlY29yZChSZWNvcmREZWNsICpSRCk7CisKKyAgLy8vIEZyZWVQYWNrZWRDb250ZXh0IC0gRGVhbGxvY2F0ZSBhbmQgbnVsbCBvdXQgUGFja0NvbnRleHQuCisgIHZvaWQgRnJlZVBhY2tlZENvbnRleHQoKTsKKworICAvLy8gUHVzaE5hbWVzcGFjZVZpc2liaWxpdHlBdHRyIC0gTm90ZSB0aGF0IHdlJ3ZlIGVudGVyZWQgYQorICAvLy8gbmFtZXNwYWNlIHdpdGggYSB2aXNpYmlsaXR5IGF0dHJpYnV0ZS4KKyAgdm9pZCBQdXNoTmFtZXNwYWNlVmlzaWJpbGl0eUF0dHIoY29uc3QgVmlzaWJpbGl0eUF0dHIgKkF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYyk7CisKKyAgLy8vIEFkZFB1c2hlZFZpc2liaWxpdHlBdHRyaWJ1dGUgLSBJZiAnXCNwcmFnbWEgR0NDIHZpc2liaWxpdHknIHdhcyB1c2VkLAorICAvLy8gYWRkIGFuIGFwcHJvcHJpYXRlIHZpc2liaWxpdHkgYXR0cmlidXRlLgorICB2b2lkIEFkZFB1c2hlZFZpc2liaWxpdHlBdHRyaWJ1dGUoRGVjbCAqUkQpOworCisgIC8vLyBQb3BQcmFnbWFWaXNpYmlsaXR5IC0gUG9wIHRoZSB0b3AgZWxlbWVudCBvZiB0aGUgdmlzaWJpbGl0eSBzdGFjazsgdXNlZAorICAvLy8gZm9yICdcI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eScgYW5kIHZpc2liaWxpdHkgYXR0cmlidXRlcyBvbiBuYW1lc3BhY2VzLgorICB2b2lkIFBvcFByYWdtYVZpc2liaWxpdHkoYm9vbCBJc05hbWVzcGFjZUVuZCwgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKworICAvLy8gRnJlZVZpc0NvbnRleHQgLSBEZWFsbG9jYXRlIGFuZCBudWxsIG91dCBWaXNDb250ZXh0LgorICB2b2lkIEZyZWVWaXNDb250ZXh0KCk7CisKKyAgLy8vIEFkZENGQXVkaXRlZEF0dHJpYnV0ZSAtIENoZWNrIHdoZXRoZXIgd2UncmUgY3VycmVudGx5IHdpdGhpbgorICAvLy8gJ1wjcHJhZ21hIGNsYW5nIGFyY19jZl9jb2RlX2F1ZGl0ZWQnIGFuZCwgaWYgc28sIGNvbnNpZGVyIGFkZGluZworICAvLy8gdGhlIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZS4KKyAgdm9pZCBBZGRDRkF1ZGl0ZWRBdHRyaWJ1dGUoRGVjbCAqRCk7CisKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ1wjcHJhZ21hIGNsYW5nIGF0dHJpYnV0ZSBwdXNoJy4KKyAgdm9pZCBBY3RPblByYWdtYUF0dHJpYnV0ZVB1c2goQXR0cmlidXRlTGlzdCAmQXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQcmFnbWFMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHI6OlBhcnNlZFN1YmplY3RNYXRjaFJ1bGVTZXQgUnVsZXMpOworCisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBjbGFuZyBhdHRyaWJ1dGUgcG9wJy4KKyAgdm9pZCBBY3RPblByYWdtYUF0dHJpYnV0ZVBvcChTb3VyY2VMb2NhdGlvbiBQcmFnbWFMb2MpOworCisgIC8vLyBcYnJpZWYgQWRkcyB0aGUgYXR0cmlidXRlcyB0aGF0IGhhdmUgYmVlbiBzcGVjaWZpZWQgdXNpbmcgdGhlCisgIC8vLyAnXCNwcmFnbWEgY2xhbmcgYXR0cmlidXRlIHB1c2gnIGRpcmVjdGl2ZXMgdG8gdGhlIGdpdmVuIGRlY2xhcmF0aW9uLgorICB2b2lkIEFkZFByYWdtYUF0dHJpYnV0ZXMoU2NvcGUgKlMsIERlY2wgKkQpOworCisgIHZvaWQgRGlhZ25vc2VVbnRlcm1pbmF0ZWRQcmFnbWFBdHRyaWJ1dGUoKTsKKworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsIGZvcm1lZCBcI3ByYWdtYSBjbGFuZyBvcHRpbWl6ZS4KKyAgdm9pZCBBY3RPblByYWdtYU9wdGltaXplKGJvb2wgT24sIFNvdXJjZUxvY2F0aW9uIFByYWdtYUxvYyk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGxvY2F0aW9uIGZvciB0aGUgY3VycmVudGx5IGFjdGl2ZSAiXCNwcmFnbWEgY2xhbmcgb3B0aW1pemUKKyAgLy8vIG9mZiIuIElmIHRoaXMgbG9jYXRpb24gaXMgaW52YWxpZCwgdGhlbiB0aGUgc3RhdGUgb2YgdGhlIHByYWdtYSBpcyAib24iLgorICBTb3VyY2VMb2NhdGlvbiBnZXRPcHRpbWl6ZU9mZlByYWdtYUxvY2F0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBPcHRpbWl6ZU9mZlByYWdtYUxvY2F0aW9uOworICB9CisKKyAgLy8vIFxicmllZiBPbmx5IGNhbGxlZCBvbiBmdW5jdGlvbiBkZWZpbml0aW9uczsgaWYgdGhlcmUgaXMgYSBwcmFnbWEgaW4gc2NvcGUKKyAgLy8vIHdpdGggdGhlIGVmZmVjdCBvZiBhIHJhbmdlLWJhc2VkIG9wdG5vbmUsIGNvbnNpZGVyIG1hcmtpbmcgdGhlIGZ1bmN0aW9uCisgIC8vLyB3aXRoIGF0dHJpYnV0ZSBvcHRub25lLgorICB2b2lkIEFkZFJhbmdlQmFzZWRPcHRub25lKEZ1bmN0aW9uRGVjbCAqRkQpOworCisgIC8vLyBcYnJpZWYgQWRkcyB0aGUgJ29wdG5vbmUnIGF0dHJpYnV0ZSB0byB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gaWYgdGhlcmUKKyAgLy8vIGFyZSBubyBjb25mbGljdHM7IExvYyByZXByZXNlbnRzIHRoZSBsb2NhdGlvbiBjYXVzaW5nIHRoZSAnb3B0bm9uZScKKyAgLy8vIGF0dHJpYnV0ZSB0byBiZSBhZGRlZCAodXN1YWxseSBiZWNhdXNlIG9mIGEgcHJhZ21hKS4KKyAgdm9pZCBBZGRPcHRub25lQXR0cmlidXRlSWZOb0NvbmZsaWN0cyhGdW5jdGlvbkRlY2wgKkZELCBTb3VyY2VMb2NhdGlvbiBMb2MpOworCisgIC8vLyBBZGRBbGlnbmVkQXR0ciAtIEFkZHMgYW4gYWxpZ25lZCBhdHRyaWJ1dGUgdG8gYSBwYXJ0aWN1bGFyIGRlY2xhcmF0aW9uLgorICB2b2lkIEFkZEFsaWduZWRBdHRyKFNvdXJjZVJhbmdlIEF0dHJSYW5nZSwgRGVjbCAqRCwgRXhwciAqRSwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcGVsbGluZ0xpc3RJbmRleCwgYm9vbCBJc1BhY2tFeHBhbnNpb24pOworICB2b2lkIEFkZEFsaWduZWRBdHRyKFNvdXJjZVJhbmdlIEF0dHJSYW5nZSwgRGVjbCAqRCwgVHlwZVNvdXJjZUluZm8gKlQsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3BlbGxpbmdMaXN0SW5kZXgsIGJvb2wgSXNQYWNrRXhwYW5zaW9uKTsKKworICAvLy8gQWRkQXNzdW1lQWxpZ25lZEF0dHIgLSBBZGRzIGFuIGFzc3VtZV9hbGlnbmVkIGF0dHJpYnV0ZSB0byBhIHBhcnRpY3VsYXIKKyAgLy8vIGRlY2xhcmF0aW9uLgorICB2b2lkIEFkZEFzc3VtZUFsaWduZWRBdHRyKFNvdXJjZVJhbmdlIEF0dHJSYW5nZSwgRGVjbCAqRCwgRXhwciAqRSwgRXhwciAqT0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3BlbGxpbmdMaXN0SW5kZXgpOworCisgIC8vLyBBZGRBbGxvY0FsaWduQXR0ciAtIEFkZHMgYW4gYWxsb2NfYWxpZ24gYXR0cmlidXRlIHRvIGEgcGFydGljdWxhcgorICAvLy8gZGVjbGFyYXRpb24uCisgIHZvaWQgQWRkQWxsb2NBbGlnbkF0dHIoU291cmNlUmFuZ2UgQXR0clJhbmdlLCBEZWNsICpELCBFeHByICpQYXJhbUV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3BlbGxpbmdMaXN0SW5kZXgpOworCisgIC8vLyBBZGRBbGlnblZhbHVlQXR0ciAtIEFkZHMgYW4gYWxpZ25fdmFsdWUgYXR0cmlidXRlIHRvIGEgcGFydGljdWxhcgorICAvLy8gZGVjbGFyYXRpb24uCisgIHZvaWQgQWRkQWxpZ25WYWx1ZUF0dHIoU291cmNlUmFuZ2UgQXR0clJhbmdlLCBEZWNsICpELCBFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNwZWxsaW5nTGlzdEluZGV4KTsKKworICAvLy8gQWRkTGF1bmNoQm91bmRzQXR0ciAtIEFkZHMgYSBsYXVuY2hfYm91bmRzIGF0dHJpYnV0ZSB0byBhIHBhcnRpY3VsYXIKKyAgLy8vIGRlY2xhcmF0aW9uLgorICB2b2lkIEFkZExhdW5jaEJvdW5kc0F0dHIoU291cmNlUmFuZ2UgQXR0clJhbmdlLCBEZWNsICpELCBFeHByICpNYXhUaHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqTWluQmxvY2tzLCB1bnNpZ25lZCBTcGVsbGluZ0xpc3RJbmRleCk7CisKKyAgLy8vIEFkZE1vZGVBdHRyIC0gQWRkcyBhIG1vZGUgYXR0cmlidXRlIHRvIGEgcGFydGljdWxhciBkZWNsYXJhdGlvbi4KKyAgdm9pZCBBZGRNb2RlQXR0cihTb3VyY2VSYW5nZSBBdHRyUmFuZ2UsIERlY2wgKkQsIElkZW50aWZpZXJJbmZvICpOYW1lLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNwZWxsaW5nTGlzdEluZGV4LCBib29sIEluSW5zdGFudGlhdGlvbiA9IGZhbHNlKTsKKworICB2b2lkIEFkZFBhcmFtZXRlckFCSUF0dHIoU291cmNlUmFuZ2UgQXR0clJhbmdlLCBEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyQUJJIEFCSSwgdW5zaWduZWQgU3BlbGxpbmdMaXN0SW5kZXgpOworCisgIHZvaWQgQWRkTlNDb25zdW1lZEF0dHIoU291cmNlUmFuZ2UgQXR0clJhbmdlLCBEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNwZWxsaW5nTGlzdEluZGV4LCBib29sIGlzTlNDb25zdW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVGVtcGxhdGVJbnN0YW50aWF0aW9uKTsKKworICBib29sIGNoZWNrTlNSZXR1cm5zUmV0YWluZWRSZXR1cm5UeXBlKFNvdXJjZUxvY2F0aW9uIGxvYywgUXVhbFR5cGUgdHlwZSk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEMrKyBDb3JvdXRpbmVzIFRTCisgIC8vCisgIGJvb2wgQWN0T25Db3JvdXRpbmVCb2R5U3RhcnQoU2NvcGUgKlMsIFNvdXJjZUxvY2F0aW9uIEt3TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBLZXl3b3JkKTsKKyAgRXhwclJlc3VsdCBBY3RPbkNvYXdhaXRFeHByKFNjb3BlICpTLCBTb3VyY2VMb2NhdGlvbiBLd0xvYywgRXhwciAqRSk7CisgIEV4cHJSZXN1bHQgQWN0T25Db3lpZWxkRXhwcihTY29wZSAqUywgU291cmNlTG9jYXRpb24gS3dMb2MsIEV4cHIgKkUpOworICBTdG10UmVzdWx0IEFjdE9uQ29yZXR1cm5TdG10KFNjb3BlICpTLCBTb3VyY2VMb2NhdGlvbiBLd0xvYywgRXhwciAqRSk7CisKKyAgRXhwclJlc3VsdCBCdWlsZFJlc29sdmVkQ29hd2FpdEV4cHIoU291cmNlTG9jYXRpb24gS3dMb2MsIEV4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbXBsaWNpdCA9IGZhbHNlKTsKKyAgRXhwclJlc3VsdCBCdWlsZFVucmVzb2x2ZWRDb2F3YWl0RXhwcihTb3VyY2VMb2NhdGlvbiBLd0xvYywgRXhwciAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJlc29sdmVkTG9va3VwRXhwciogTG9va3VwKTsKKyAgRXhwclJlc3VsdCBCdWlsZENveWllbGRFeHByKFNvdXJjZUxvY2F0aW9uIEt3TG9jLCBFeHByICpFKTsKKyAgU3RtdFJlc3VsdCBCdWlsZENvcmV0dXJuU3RtdChTb3VyY2VMb2NhdGlvbiBLd0xvYywgRXhwciAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzSW1wbGljaXQgPSBmYWxzZSk7CisgIFN0bXRSZXN1bHQgQnVpbGRDb3JvdXRpbmVCb2R5U3RtdChDb3JvdXRpbmVCb2R5U3RtdDo6Q3RvckFyZ3MpOworICBib29sIGJ1aWxkQ29yb3V0aW5lUGFyYW1ldGVyTW92ZXMoU291cmNlTG9jYXRpb24gTG9jKTsKKyAgVmFyRGVjbCAqYnVpbGRDb3JvdXRpbmVQcm9taXNlKFNvdXJjZUxvY2F0aW9uIExvYyk7CisgIHZvaWQgQ2hlY2tDb21wbGV0ZWRDb3JvdXRpbmVCb2R5KEZ1bmN0aW9uRGVjbCAqRkQsIFN0bXQgKiZCb2R5KTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gT3BlbkNMIGV4dGVuc2lvbnMuCisgIC8vCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBDdXJyT3BlbkNMRXh0ZW5zaW9uOworICAvLy8gRXh0ZW5zaW9ucyByZXF1aXJlZCBieSBhbiBPcGVuQ0wgdHlwZS4KKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgVHlwZSosIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPj4gT3BlbkNMVHlwZUV4dE1hcDsKKyAgLy8vIEV4dGVuc2lvbnMgcmVxdWlyZWQgYnkgYW4gT3BlbkNMIGRlY2xhcmF0aW9uLgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBEZWNsKiwgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+PiBPcGVuQ0xEZWNsRXh0TWFwOworcHVibGljOgorICBsbHZtOjpTdHJpbmdSZWYgZ2V0Q3VycmVudE9wZW5DTEV4dGVuc2lvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3Vyck9wZW5DTEV4dGVuc2lvbjsKKyAgfQorICB2b2lkIHNldEN1cnJlbnRPcGVuQ0xFeHRlbnNpb24obGx2bTo6U3RyaW5nUmVmIEV4dCkgeworICAgIEN1cnJPcGVuQ0xFeHRlbnNpb24gPSBFeHQ7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCBPcGVuQ0wgZXh0ZW5zaW9ucyBmb3IgYSB0eXBlIHdoaWNoIGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGVzZQorICAvLy8gT3BlbkNMIGV4dGVuc2lvbnMgYXJlIGVuYWJsZWQuIElmIFxwIEV4dHMgaXMgZW1wdHksIGRvIG5vdGhpbmcuCisgIC8vLyBccGFyYW0gRXh0cyBBIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIE9wZW5DTCBleHRlbnNpb25zLgorICB2b2lkIHNldE9wZW5DTEV4dGVuc2lvbkZvclR5cGUoUXVhbFR5cGUgVCwgbGx2bTo6U3RyaW5nUmVmIEV4dHMpOworCisgIC8vLyBcYnJpZWYgU2V0IE9wZW5DTCBleHRlbnNpb25zIGZvciBhIGRlY2xhcmF0aW9uIHdoaWNoIGNhbiBvbmx5IGJlCisgIC8vLyB1c2VkIHdoZW4gdGhlc2UgT3BlbkNMIGV4dGVuc2lvbnMgYXJlIGVuYWJsZWQuIElmIFxwIEV4dHMgaXMgZW1wdHksIGRvCisgIC8vLyBub3RoaW5nLgorICAvLy8gXHBhcmFtIEV4dHMgQSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBPcGVuQ0wgZXh0ZW5zaW9ucy4KKyAgdm9pZCBzZXRPcGVuQ0xFeHRlbnNpb25Gb3JEZWNsKERlY2wgKkZELCBsbHZtOjpTdHJpbmdSZWYgRXh0cyk7CisKKyAgLy8vIFxicmllZiBTZXQgY3VycmVudCBPcGVuQ0wgZXh0ZW5zaW9ucyBmb3IgYSB0eXBlIHdoaWNoIGNhbiBvbmx5IGJlIHVzZWQKKyAgLy8vIHdoZW4gdGhlc2UgT3BlbkNMIGV4dGVuc2lvbnMgYXJlIGVuYWJsZWQuIElmIGN1cnJlbnQgT3BlbkNMIGV4dGVuc2lvbiBpcworICAvLy8gZW1wdHksIGRvIG5vdGhpbmcuCisgIHZvaWQgc2V0Q3VycmVudE9wZW5DTEV4dGVuc2lvbkZvclR5cGUoUXVhbFR5cGUgVCk7CisKKyAgLy8vIFxicmllZiBTZXQgY3VycmVudCBPcGVuQ0wgZXh0ZW5zaW9ucyBmb3IgYSBkZWNsYXJhdGlvbiB3aGljaAorICAvLy8gY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHRoZXNlIE9wZW5DTCBleHRlbnNpb25zIGFyZSBlbmFibGVkLiBJZiBjdXJyZW50CisgIC8vLyBPcGVuQ0wgZXh0ZW5zaW9uIGlzIGVtcHR5LCBkbyBub3RoaW5nLgorICB2b2lkIHNldEN1cnJlbnRPcGVuQ0xFeHRlbnNpb25Gb3JEZWNsKERlY2wgKkZEKTsKKworICBib29sIGlzT3BlbkNMRGlzYWJsZWREZWNsKERlY2wgKkZEKTsKKworICAvLy8gXGJyaWVmIENoZWNrIGlmIHR5cGUgXHAgVCBjb3JyZXNwb25kaW5nIHRvIGRlY2xhcmF0aW9uIHNwZWNpZmllciBccCBEUworICAvLy8gaXMgZGlzYWJsZWQgZHVlIHRvIHJlcXVpcmVkIE9wZW5DTCBleHRlbnNpb25zIGJlaW5nIGRpc2FibGVkLiBJZiBzbywKKyAgLy8vIGVtaXQgZGlhZ25vc3RpY3MuCisgIC8vLyBccmV0dXJuIHRydWUgaWYgdHlwZSBpcyBkaXNhYmxlZC4KKyAgYm9vbCBjaGVja09wZW5DTERpc2FibGVkVHlwZURlY2xTcGVjKGNvbnN0IERlY2xTcGVjICZEUywgUXVhbFR5cGUgVCk7CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiBkZWNsYXJhdGlvbiBccCBEIHVzZWQgYnkgZXhwcmVzc2lvbiBccCBFCisgIC8vLyBpcyBkaXNhYmxlZCBkdWUgdG8gcmVxdWlyZWQgT3BlbkNMIGV4dGVuc2lvbnMgYmVpbmcgZGlzYWJsZWQuIElmIHNvLAorICAvLy8gZW1pdCBkaWFnbm9zdGljcy4KKyAgLy8vIFxyZXR1cm4gdHJ1ZSBpZiB0eXBlIGlzIGRpc2FibGVkLgorICBib29sIGNoZWNrT3BlbkNMRGlzYWJsZWREZWNsKGNvbnN0IE5hbWVkRGVjbCAmRCwgY29uc3QgRXhwciAmRSk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE9wZW5NUCBkaXJlY3RpdmVzIGFuZCBjbGF1c2VzLgorICAvLworcHJpdmF0ZToKKyAgdm9pZCAqVmFyRGF0YVNoYXJpbmdBdHRyaWJ1dGVzU3RhY2s7CisgIC8vLyBTZXQgdG8gdHJ1ZSBpbnNpZGUgJyNwcmFnbWEgb21wIGRlY2xhcmUgdGFyZ2V0JyByZWdpb24uCisgIGJvb2wgSXNJbk9wZW5NUERlY2xhcmVUYXJnZXRDb250ZXh0ID0gZmFsc2U7CisgIC8vLyBcYnJpZWYgSW5pdGlhbGl6YXRpb24gb2YgZGF0YS1zaGFyaW5nIGF0dHJpYnV0ZXMgc3RhY2suCisgIHZvaWQgSW5pdERhdGFTaGFyaW5nQXR0cmlidXRlc1N0YWNrKCk7CisgIHZvaWQgRGVzdHJveURhdGFTaGFyaW5nQXR0cmlidXRlc1N0YWNrKCk7CisgIEV4cHJSZXN1bHQKKyAgVmVyaWZ5UG9zaXRpdmVJbnRlZ2VyQ29uc3RhbnRJbkNsYXVzZShFeHByICpPcCwgT3Blbk1QQ2xhdXNlS2luZCBDS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFN0cmljdGx5UG9zaXRpdmUgPSB0cnVlKTsKKyAgLy8vIFJldHVybnMgT3Blbk1QIG5lc3RpbmcgbGV2ZWwgZm9yIGN1cnJlbnQgZGlyZWN0aXZlLgorICB1bnNpZ25lZCBnZXRPcGVuTVBOZXN0aW5nTGV2ZWwoKSBjb25zdDsKKworICAvLy8gQWRqdXN0cyB0aGUgZnVuY3Rpb24gc2NvcGVzIGluZGV4IGZvciB0aGUgdGFyZ2V0LWJhc2VkIHJlZ2lvbnMuCisgIHZvaWQgYWRqdXN0T3Blbk1QVGFyZ2V0U2NvcGVJbmRleCh1bnNpZ25lZCAmRnVuY3Rpb25TY29wZXNJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExldmVsKSBjb25zdDsKKworICAvLy8gUHVzaCBuZXcgT3Blbk1QIGZ1bmN0aW9uIHJlZ2lvbiBmb3Igbm9uLWNhcHR1cmluZyBmdW5jdGlvbi4KKyAgdm9pZCBwdXNoT3Blbk1QRnVuY3Rpb25SZWdpb24oKTsKKworICAvLy8gUG9wIE9wZW5NUCBmdW5jdGlvbiByZWdpb24gZm9yIG5vbi1jYXB0dXJpbmcgZnVuY3Rpb24uCisgIHZvaWQgcG9wT3Blbk1QRnVuY3Rpb25SZWdpb24oY29uc3Qgc2VtYTo6RnVuY3Rpb25TY29wZUluZm8gKk9sZEZTSSk7CisKKyAgLy8vIENoZWNrcyBpZiBhIHR5cGUgb3IgYSBkZWNsYXJhdGlvbiBpcyBkaXNhYmxlZCBkdWUgdG8gdGhlIG93bmluZyBleHRlbnNpb24KKyAgLy8vIGJlaW5nIGRpc2FibGVkLCBhbmQgZW1pdHMgZGlhZ25vc3RpYyBtZXNzYWdlcyBpZiBpdCBpcyBkaXNhYmxlZC4KKyAgLy8vIFxwYXJhbSBEIHR5cGUgb3IgZGVjbGFyYXRpb24gdG8gYmUgY2hlY2tlZC4KKyAgLy8vIFxwYXJhbSBEaWFnTG9jIHNvdXJjZSBsb2NhdGlvbiBmb3IgdGhlIGRpYWdub3N0aWMgbWVzc2FnZS4KKyAgLy8vIFxwYXJhbSBEaWFnSW5mbyBpbmZvcm1hdGlvbiB0byBiZSBlbWl0dGVkIGZvciB0aGUgZGlhZ25vc3RpYyBtZXNzYWdlLgorICAvLy8gXHBhcmFtIFNyY1JhbmdlIHNvdXJjZSByYW5nZSBvZiB0aGUgZGVjbGFyYXRpb24uCisgIC8vLyBccGFyYW0gTWFwIG1hcHMgdHlwZSBvciBkZWNsYXJhdGlvbiB0byB0aGUgZXh0ZW5zaW9ucy4KKyAgLy8vIFxwYXJhbSBTZWxlY3RvciBzZWxlY3RzIGRpYWdub3N0aWMgbWVzc2FnZTogMCBmb3IgdHlwZSBhbmQgMSBmb3IKKyAgLy8vICAgICAgICBkZWNsYXJhdGlvbi4KKyAgLy8vIFxyZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBvciBkZWNsYXJhdGlvbiBpcyBkaXNhYmxlZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIERpYWdMb2NULCB0eXBlbmFtZSBEaWFnSW5mb1QsIHR5cGVuYW1lIE1hcFQ+CisgIGJvb2wgY2hlY2tPcGVuQ0xEaXNhYmxlZFR5cGVPckRlY2woVCBELCBEaWFnTG9jVCBEaWFnTG9jLCBEaWFnSW5mb1QgRGlhZ0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwVCAmTWFwLCB1bnNpZ25lZCBTZWxlY3RvciA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgU3JjUmFuZ2UgPSBTb3VyY2VSYW5nZSgpKTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBwcm92aWRlZCBkZWNsYXJhdGlvbiBcYSBWRCBzaG91bGQgYmUgY2FwdHVyZWQgYnkKKyAgLy8vIHJlZmVyZW5jZS4KKyAgLy8vIFxwYXJhbSBMZXZlbCBSZWxhdGl2ZSBsZXZlbCBvZiBuZXN0ZWQgT3Blbk1QIGNvbnN0cnVjdCBmb3IgdGhhdCB0aGUgY2hlY2sKKyAgLy8vIGlzIHBlcmZvcm1lZC4KKyAgYm9vbCBJc09wZW5NUENhcHR1cmVkQnlSZWYoVmFsdWVEZWNsICpELCB1bnNpZ25lZCBMZXZlbCk7CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiB0aGUgc3BlY2lmaWVkIHZhcmlhYmxlIGlzIHVzZWQgaW4gb25lIG9mIHRoZSBwcml2YXRlCisgIC8vLyBjbGF1c2VzIChwcml2YXRlLCBmaXJzdHByaXZhdGUsIGxhc3Rwcml2YXRlLCByZWR1Y3Rpb24gZXRjLikgaW4gT3Blbk1QCisgIC8vLyBjb25zdHJ1Y3RzLgorICBWYXJEZWNsICpJc09wZW5NUENhcHR1cmVkRGVjbChWYWx1ZURlY2wgKkQpOworICBFeHByUmVzdWx0IGdldE9wZW5NUENhcHR1cmVkRXhwcihWYXJEZWNsICpDYXB0dXJlLCBFeHByVmFsdWVLaW5kIFZLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByT2JqZWN0S2luZCBPSywgU291cmNlTG9jYXRpb24gTG9jKTsKKworICAvLy8gXGJyaWVmIENoZWNrIGlmIHRoZSBzcGVjaWZpZWQgdmFyaWFibGUgaXMgdXNlZCBpbiAncHJpdmF0ZScgY2xhdXNlLgorICAvLy8gXHBhcmFtIExldmVsIFJlbGF0aXZlIGxldmVsIG9mIG5lc3RlZCBPcGVuTVAgY29uc3RydWN0IGZvciB0aGF0IHRoZSBjaGVjaworICAvLy8gaXMgcGVyZm9ybWVkLgorICBib29sIGlzT3Blbk1QUHJpdmF0ZURlY2woVmFsdWVEZWNsICpELCB1bnNpZ25lZCBMZXZlbCk7CisKKyAgLy8vIFNldHMgT3Blbk1QIGNhcHR1cmUga2luZCAoT01QQ19wcml2YXRlLCBPTVBDX2ZpcnN0cHJpdmF0ZSwgT01QQ19tYXAgZXRjLikKKyAgLy8vIGZvciBccCBGRCBiYXNlZCBvbiBEU0EgZm9yIHRoZSBwcm92aWRlZCBjb3JyZXNwb25kaW5nIGNhcHR1cmVkIGRlY2xhcmF0aW9uCisgIC8vLyBccCBELgorICB2b2lkIHNldE9wZW5NUENhcHR1cmVLaW5kKEZpZWxkRGVjbCAqRkQsIFZhbHVlRGVjbCAqRCwgdW5zaWduZWQgTGV2ZWwpOworCisgIC8vLyBcYnJpZWYgQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCB2YXJpYWJsZSBpcyBjYXB0dXJlZCAgYnkgJ3RhcmdldCcgZGlyZWN0aXZlLgorICAvLy8gXHBhcmFtIExldmVsIFJlbGF0aXZlIGxldmVsIG9mIG5lc3RlZCBPcGVuTVAgY29uc3RydWN0IGZvciB0aGF0IHRoZSBjaGVjaworICAvLy8gaXMgcGVyZm9ybWVkLgorICBib29sIGlzT3Blbk1QVGFyZ2V0Q2FwdHVyZWREZWNsKFZhbHVlRGVjbCAqRCwgdW5zaWduZWQgTGV2ZWwpOworCisgIEV4cHJSZXN1bHQgUGVyZm9ybU9wZW5NUEltcGxpY2l0SW50ZWdlckNvbnZlcnNpb24oU291cmNlTG9jYXRpb24gT3BMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqT3ApOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiBzdGFydCBvZiBuZXcgZGF0YSBzaGFyaW5nIGF0dHJpYnV0ZSBibG9jay4KKyAgdm9pZCBTdGFydE9wZW5NUERTQUJsb2NrKE9wZW5NUERpcmVjdGl2ZUtpbmQgSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJkRpck5hbWUsIFNjb3BlICpDdXJTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYyk7CisgIC8vLyBcYnJpZWYgU3RhcnQgYW5hbHlzaXMgb2YgY2xhdXNlcy4KKyAgdm9pZCBTdGFydE9wZW5NUENsYXVzZShPcGVuTVBDbGF1c2VLaW5kIEspOworICAvLy8gXGJyaWVmIEVuZCBhbmFseXNpcyBvZiBjbGF1c2VzLgorICB2b2lkIEVuZE9wZW5NUENsYXVzZSgpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiBlbmQgb2YgZGF0YSBzaGFyaW5nIGF0dHJpYnV0ZSBibG9jay4KKyAgdm9pZCBFbmRPcGVuTVBEU0FCbG9jayhTdG10ICpDdXJEaXJlY3RpdmUpOworCisgIC8vLyBcYnJpZWYgQ2hlY2sgaWYgdGhlIGN1cnJlbnQgcmVnaW9uIGlzIGFuIE9wZW5NUCBsb29wIHJlZ2lvbiBhbmQgaWYgaXQgaXMsCisgIC8vLyBtYXJrIGxvb3AgY29udHJvbCB2YXJpYWJsZSwgdXNlZCBpbiBccCBJbml0IGZvciBsb29wIGluaXRpYWxpemF0aW9uLCBhcworICAvLy8gcHJpdmF0ZSBieSBkZWZhdWx0LgorICAvLy8gXHBhcmFtIEluaXQgRmlyc3QgcGFydCBvZiB0aGUgZm9yIGxvb3AuCisgIHZvaWQgQWN0T25PcGVuTVBMb29wSW5pdGlhbGl6YXRpb24oU291cmNlTG9jYXRpb24gRm9yTG9jLCBTdG10ICpJbml0KTsKKworICAvLyBPcGVuTVAgZGlyZWN0aXZlcyBhbmQgY2xhdXNlcy4KKyAgLy8vIFxicmllZiBDYWxsZWQgb24gY29ycmVjdCBpZC1leHByZXNzaW9uIGZyb20gdGhlICcjcHJhZ21hIG9tcAorICAvLy8gdGhyZWFkcHJpdmF0ZScuCisgIEV4cHJSZXN1bHQgQWN0T25PcGVuTVBJZEV4cHJlc3Npb24oU2NvcGUgKkN1clNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAmU2NvcGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJklkKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUnLgorICBEZWNsR3JvdXBQdHJUeSBBY3RPbk9wZW5NUFRocmVhZHByaXZhdGVEaXJlY3RpdmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gVmFyTGlzdCk7CisgIC8vLyBcYnJpZWYgQnVpbGRzIGEgbmV3IE9wZW5NUFRocmVhZFByaXZhdGVEZWNsIGFuZCBjaGVja3MgaXRzIGNvcnJlY3RuZXNzLgorICBPTVBUaHJlYWRQcml2YXRlRGVjbCAqQ2hlY2tPTVBUaHJlYWRQcml2YXRlRGVjbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBWYXJMaXN0KTsKKyAgLy8vIFxicmllZiBDaGVjayBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgYWxsb3dlZCB0byBiZSB1c2VkIGluICdvbXAgZGVjbGFyZQorICAvLy8gcmVkdWN0aW9uJyBjb25zdHJ1Y3QuCisgIFF1YWxUeXBlIEFjdE9uT3Blbk1QRGVjbGFyZVJlZHVjdGlvblR5cGUoU291cmNlTG9jYXRpb24gVHlMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVJlc3VsdCBQYXJzZWRUeXBlKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gc3RhcnQgb2YgJyNwcmFnbWEgb21wIGRlY2xhcmUgcmVkdWN0aW9uJy4KKyAgRGVjbEdyb3VwUHRyVHkgQWN0T25PcGVuTVBEZWNsYXJlUmVkdWN0aW9uRGlyZWN0aXZlU3RhcnQoCisgICAgICBTY29wZSAqUywgRGVjbENvbnRleHQgKkRDLCBEZWNsYXJhdGlvbk5hbWUgTmFtZSwKKyAgICAgIEFycmF5UmVmPHN0ZDo6cGFpcjxRdWFsVHlwZSwgU291cmNlTG9jYXRpb24+PiBSZWR1Y3Rpb25UeXBlcywKKyAgICAgIEFjY2Vzc1NwZWNpZmllciBBUywgRGVjbCAqUHJldkRlY2xJblNjb3BlID0gbnVsbHB0cik7CisgIC8vLyBcYnJpZWYgSW5pdGlhbGl6ZSBkZWNsYXJlIHJlZHVjdGlvbiBjb25zdHJ1Y3QgaW5pdGlhbGl6ZXIuCisgIHZvaWQgQWN0T25PcGVuTVBEZWNsYXJlUmVkdWN0aW9uQ29tYmluZXJTdGFydChTY29wZSAqUywgRGVjbCAqRCk7CisgIC8vLyBcYnJpZWYgRmluaXNoIGN1cnJlbnQgZGVjbGFyZSByZWR1Y3Rpb24gY29uc3RydWN0IGluaXRpYWxpemVyLgorICB2b2lkIEFjdE9uT3Blbk1QRGVjbGFyZVJlZHVjdGlvbkNvbWJpbmVyRW5kKERlY2wgKkQsIEV4cHIgKkNvbWJpbmVyKTsKKyAgLy8vIFxicmllZiBJbml0aWFsaXplIGRlY2xhcmUgcmVkdWN0aW9uIGNvbnN0cnVjdCBpbml0aWFsaXplci4KKyAgLy8vIFxyZXR1cm4gb21wX3ByaXYgdmFyaWFibGUuCisgIFZhckRlY2wgKkFjdE9uT3Blbk1QRGVjbGFyZVJlZHVjdGlvbkluaXRpYWxpemVyU3RhcnQoU2NvcGUgKlMsIERlY2wgKkQpOworICAvLy8gXGJyaWVmIEZpbmlzaCBjdXJyZW50IGRlY2xhcmUgcmVkdWN0aW9uIGNvbnN0cnVjdCBpbml0aWFsaXplci4KKyAgdm9pZCBBY3RPbk9wZW5NUERlY2xhcmVSZWR1Y3Rpb25Jbml0aWFsaXplckVuZChEZWNsICpELCBFeHByICpJbml0aWFsaXplciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJEZWNsICpPbXBQcml2UGFybSk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIGF0IHRoZSBlbmQgb2YgJyNwcmFnbWEgb21wIGRlY2xhcmUgcmVkdWN0aW9uJy4KKyAgRGVjbEdyb3VwUHRyVHkgQWN0T25PcGVuTVBEZWNsYXJlUmVkdWN0aW9uRGlyZWN0aXZlRW5kKAorICAgICAgU2NvcGUgKlMsIERlY2xHcm91cFB0clR5IERlY2xSZWR1Y3Rpb25zLCBib29sIElzVmFsaWQpOworCisgIC8vLyBDYWxsZWQgb24gdGhlIHN0YXJ0IG9mIHRhcmdldCByZWdpb24gaS5lLiAnI3ByYWdtYSBvbXAgZGVjbGFyZSB0YXJnZXQnLgorICBib29sIEFjdE9uU3RhcnRPcGVuTVBEZWNsYXJlVGFyZ2V0RGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIExvYyk7CisgIC8vLyBDYWxsZWQgYXQgdGhlIGVuZCBvZiB0YXJnZXQgcmVnaW9uIGkuZS4gJyNwcmFnbWUgb21wIGVuZCBkZWNsYXJlIHRhcmdldCcuCisgIHZvaWQgQWN0T25GaW5pc2hPcGVuTVBEZWNsYXJlVGFyZ2V0RGlyZWN0aXZlKCk7CisgIC8vLyBDYWxsZWQgb24gY29ycmVjdCBpZC1leHByZXNzaW9uIGZyb20gdGhlICcjcHJhZ21hIG9tcCBkZWNsYXJlIHRhcmdldCcuCisgIHZvaWQgQWN0T25PcGVuTVBEZWNsYXJlVGFyZ2V0TmFtZShTY29wZSAqQ3VyU2NvcGUsIENYWFNjb3BlU3BlYyAmU2NvcGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVBEZWNsYXJlVGFyZ2V0RGVjbEF0dHI6Ok1hcFR5cGVUeSBNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkRGVjbFNldFR5cGUgJlNhbWVEaXJlY3RpdmVEZWNscyk7CisgIC8vLyBDaGVjayBkZWNsYXJhdGlvbiBpbnNpZGUgdGFyZ2V0IHJlZ2lvbi4KKyAgdm9pZCBjaGVja0RlY2xJc0FsbG93ZWRJbk9wZW5NUFRhcmdldChFeHByICpFLCBEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jID0gU291cmNlTG9jYXRpb24oKSk7CisgIC8vLyBSZXR1cm4gdHJ1ZSBpbnNpZGUgT3Blbk1QIGRlY2xhcmUgdGFyZ2V0IHJlZ2lvbi4KKyAgYm9vbCBpc0luT3Blbk1QRGVjbGFyZVRhcmdldENvbnRleHQoKSBjb25zdCB7CisgICAgcmV0dXJuIElzSW5PcGVuTVBEZWNsYXJlVGFyZ2V0Q29udGV4dDsKKyAgfQorICAvLy8gUmV0dXJuIHRydWUgaW5zaWRlIE9wZW5NUCB0YXJnZXQgcmVnaW9uLgorICBib29sIGlzSW5PcGVuTVBUYXJnZXRFeGVjdXRpb25EaXJlY3RpdmUoKSBjb25zdDsKKyAgLy8vIFJldHVybiB0cnVlIGlmICh1bilzdXBwb3J0ZWQgZmVhdHVyZXMgZm9yIHRoZSBjdXJyZW50IHRhcmdldCBzaG91bGQgYmUKKyAgLy8vIGRpYWdub3NlZCBpZiBPcGVuTVAgKG9mZmxvYWRpbmcpIGlzIGVuYWJsZWQuCisgIGJvb2wgc2hvdWxkRGlhZ25vc2VUYXJnZXRTdXBwb3J0RnJvbU9wZW5NUCgpIGNvbnN0IHsKKyAgICByZXR1cm4gIWdldExhbmdPcHRzKCkuT3Blbk1QSXNEZXZpY2UgfHwgaXNJbk9wZW5NUERlY2xhcmVUYXJnZXRDb250ZXh0KCkgfHwKKyAgICAgIGlzSW5PcGVuTVBUYXJnZXRFeGVjdXRpb25EaXJlY3RpdmUoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBjYXB0dXJlZCByZWdpb25zIGNyZWF0ZWQgZm9yIGFuIE9wZW5NUCBkaXJlY3RpdmUuCisgIHN0YXRpYyBpbnQgZ2V0T3Blbk1QQ2FwdHVyZUxldmVscyhPcGVuTVBEaXJlY3RpdmVLaW5kIEtpbmQpOworCisgIC8vLyBcYnJpZWYgSW5pdGlhbGl6YXRpb24gb2YgY2FwdHVyZWQgcmVnaW9uIGZvciBPcGVuTVAgcmVnaW9uLgorICB2b2lkIEFjdE9uT3Blbk1QUmVnaW9uU3RhcnQoT3Blbk1QRGlyZWN0aXZlS2luZCBES2luZCwgU2NvcGUgKkN1clNjb3BlKTsKKyAgLy8vIFxicmllZiBFbmQgb2YgT3Blbk1QIHJlZ2lvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gUyBTdGF0ZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IE9wZW5NUCByZWdpb24uCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMgZm9yIHRoZSBjdXJyZW50IE9wZW5NUCByZWdpb24uCisgIC8vLworICAvLy8gXHJldHVybnMgU3RhdGVtZW50IGZvciBmaW5pc2hlZCBPcGVuTVAgcmVnaW9uLgorICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QUmVnaW9uRW5kKFN0bXRSZXN1bHQgUywgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMpOworICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QRXhlY3V0YWJsZURpcmVjdGl2ZSgKKyAgICAgIE9wZW5NUERpcmVjdGl2ZUtpbmQgS2luZCwgY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmRGlyTmFtZSwKKyAgICAgIE9wZW5NUERpcmVjdGl2ZUtpbmQgQ2FuY2VsUmVnaW9uLCBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgIFN0bXQgKkFTdG10LCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ1wjcHJhZ21hIG9tcCBwYXJhbGxlbCcgYWZ0ZXIgcGFyc2luZworICAvLy8gb2YgdGhlICBhc3NvY2lhdGVkIHN0YXRlbWVudC4KKyAgU3RtdFJlc3VsdCBBY3RPbk9wZW5NUFBhcmFsbGVsRGlyZWN0aXZlKEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdCAqQVN0bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBvbXAgc2ltZCcgYWZ0ZXIgcGFyc2luZworICAvLy8gb2YgdGhlIGFzc29jaWF0ZWQgc3RhdGVtZW50LgorICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QU2ltZERpcmVjdGl2ZSgKKyAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLCBTdG10ICpBU3RtdCwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICBsbHZtOjpEZW5zZU1hcDxWYWx1ZURlY2wgKiwgRXhwciAqPiAmVmFyc1dpdGhJbXBsaWNpdERTQSk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBvbXAgZm9yJyBhZnRlciBwYXJzaW5nCisgIC8vLyBvZiB0aGUgYXNzb2NpYXRlZCBzdGF0ZW1lbnQuCisgIFN0bXRSZXN1bHQgQWN0T25PcGVuTVBGb3JEaXJlY3RpdmUoCisgICAgICBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywgU3RtdCAqQVN0bXQsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgbGx2bTo6RGVuc2VNYXA8VmFsdWVEZWNsICosIEV4cHIgKj4gJlZhcnNXaXRoSW1wbGljaXREU0EpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIGZvciBzaW1kJyBhZnRlciBwYXJzaW5nCisgIC8vLyBvZiB0aGUgYXNzb2NpYXRlZCBzdGF0ZW1lbnQuCisgIFN0bXRSZXN1bHQgQWN0T25PcGVuTVBGb3JTaW1kRGlyZWN0aXZlKAorICAgICAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsIFN0bXQgKkFTdG10LCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgIGxsdm06OkRlbnNlTWFwPFZhbHVlRGVjbCAqLCBFeHByICo+ICZWYXJzV2l0aEltcGxpY2l0RFNBKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ1wjcHJhZ21hIG9tcCBzZWN0aW9ucycgYWZ0ZXIgcGFyc2luZworICAvLy8gb2YgdGhlIGFzc29jaWF0ZWQgc3RhdGVtZW50LgorICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QU2VjdGlvbnNEaXJlY3RpdmUoQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpBU3RtdCwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIHNlY3Rpb24nIGFmdGVyIHBhcnNpbmcgb2YgdGhlCisgIC8vLyBhc3NvY2lhdGVkIHN0YXRlbWVudC4KKyAgU3RtdFJlc3VsdCBBY3RPbk9wZW5NUFNlY3Rpb25EaXJlY3RpdmUoU3RtdCAqQVN0bXQsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIHNpbmdsZScgYWZ0ZXIgcGFyc2luZyBvZiB0aGUKKyAgLy8vIGFzc29jaWF0ZWQgc3RhdGVtZW50LgorICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QU2luZ2xlRGlyZWN0aXZlKEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKkFTdG10LCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIG1hc3RlcicgYWZ0ZXIgcGFyc2luZyBvZiB0aGUKKyAgLy8vIGFzc29jaWF0ZWQgc3RhdGVtZW50LgorICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QTWFzdGVyRGlyZWN0aXZlKFN0bXQgKkFTdG10LCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIGNyaXRpY2FsJyBhZnRlciBwYXJzaW5nIG9mIHRoZQorICAvLy8gYXNzb2NpYXRlZCBzdGF0ZW1lbnQuCisgIFN0bXRSZXN1bHQgQWN0T25PcGVuTVBDcml0aWNhbERpcmVjdGl2ZShjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZEaXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpBU3RtdCwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIHBhcmFsbGVsIGZvcicgYWZ0ZXIgcGFyc2luZworICAvLy8gb2YgdGhlICBhc3NvY2lhdGVkIHN0YXRlbWVudC4KKyAgU3RtdFJlc3VsdCBBY3RPbk9wZW5NUFBhcmFsbGVsRm9yRGlyZWN0aXZlKAorICAgICAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsIFN0bXQgKkFTdG10LCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgIGxsdm06OkRlbnNlTWFwPFZhbHVlRGVjbCAqLCBFeHByICo+ICZWYXJzV2l0aEltcGxpY2l0RFNBKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ1wjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2ltZCcgYWZ0ZXIKKyAgLy8vIHBhcnNpbmcgb2YgdGhlICBhc3NvY2lhdGVkIHN0YXRlbWVudC4KKyAgU3RtdFJlc3VsdCBBY3RPbk9wZW5NUFBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZSgKKyAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLCBTdG10ICpBU3RtdCwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICBsbHZtOjpEZW5zZU1hcDxWYWx1ZURlY2wgKiwgRXhwciAqPiAmVmFyc1dpdGhJbXBsaWNpdERTQSk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMnIGFmdGVyCisgIC8vLyBwYXJzaW5nIG9mIHRoZSAgYXNzb2NpYXRlZCBzdGF0ZW1lbnQuCisgIFN0bXRSZXN1bHQgQWN0T25PcGVuTVBQYXJhbGxlbFNlY3Rpb25zRGlyZWN0aXZlKEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpBU3RtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBvbXAgdGFzaycgYWZ0ZXIgcGFyc2luZyBvZiB0aGUKKyAgLy8vIGFzc29jaWF0ZWQgc3RhdGVtZW50LgorICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QVGFza0RpcmVjdGl2ZShBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdCAqQVN0bXQsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIHRhc2t5aWVsZCcuCisgIFN0bXRSZXN1bHQgQWN0T25PcGVuTVBUYXNreWllbGREaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ1wjcHJhZ21hIG9tcCBiYXJyaWVyJy4KKyAgU3RtdFJlc3VsdCBBY3RPbk9wZW5NUEJhcnJpZXJEaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBvbXAgdGFza3dhaXQnLgorICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QVGFza3dhaXREaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIHRhc2tncm91cCcuCisgIFN0bXRSZXN1bHQgQWN0T25PcGVuTVBUYXNrZ3JvdXBEaXJlY3RpdmUoQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdCAqQVN0bXQsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBvbXAgZmx1c2gnLgorICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QRmx1c2hEaXJlY3RpdmUoQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBvbXAgb3JkZXJlZCcgYWZ0ZXIgcGFyc2luZyBvZiB0aGUKKyAgLy8vIGFzc29jaWF0ZWQgc3RhdGVtZW50LgorICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QT3JkZXJlZERpcmVjdGl2ZShBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdCAqQVN0bXQsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIGF0b21pYycgYWZ0ZXIgcGFyc2luZyBvZiB0aGUKKyAgLy8vIGFzc29jaWF0ZWQgc3RhdGVtZW50LgorICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QQXRvbWljRGlyZWN0aXZlKEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKkFTdG10LCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIHRhcmdldCcgYWZ0ZXIgcGFyc2luZyBvZiB0aGUKKyAgLy8vIGFzc29jaWF0ZWQgc3RhdGVtZW50LgorICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QVGFyZ2V0RGlyZWN0aXZlKEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKkFTdG10LCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIHRhcmdldCBkYXRhJyBhZnRlciBwYXJzaW5nIG9mCisgIC8vLyB0aGUgYXNzb2NpYXRlZCBzdGF0ZW1lbnQuCisgIFN0bXRSZXN1bHQgQWN0T25PcGVuTVBUYXJnZXREYXRhRGlyZWN0aXZlKEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpBU3RtdCwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBvbXAgdGFyZ2V0IGVudGVyIGRhdGEnIGFmdGVyCisgIC8vLyBwYXJzaW5nIG9mIHRoZSBhc3NvY2lhdGVkIHN0YXRlbWVudC4KKyAgU3RtdFJlc3VsdCBBY3RPbk9wZW5NUFRhcmdldEVudGVyRGF0YURpcmVjdGl2ZShBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdCAqQVN0bXQpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIHRhcmdldCBleGl0IGRhdGEnIGFmdGVyCisgIC8vLyBwYXJzaW5nIG9mIHRoZSBhc3NvY2lhdGVkIHN0YXRlbWVudC4KKyAgU3RtdFJlc3VsdCBBY3RPbk9wZW5NUFRhcmdldEV4aXREYXRhRGlyZWN0aXZlKEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpBU3RtdCk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBvbXAgdGFyZ2V0IHBhcmFsbGVsJyBhZnRlcgorICAvLy8gcGFyc2luZyBvZiB0aGUgYXNzb2NpYXRlZCBzdGF0ZW1lbnQuCisgIFN0bXRSZXN1bHQgQWN0T25PcGVuTVBUYXJnZXRQYXJhbGxlbERpcmVjdGl2ZShBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKkFTdG10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIHRhcmdldCBwYXJhbGxlbCBmb3InIGFmdGVyCisgIC8vLyBwYXJzaW5nIG9mIHRoZSAgYXNzb2NpYXRlZCBzdGF0ZW1lbnQuCisgIFN0bXRSZXN1bHQgQWN0T25PcGVuTVBUYXJnZXRQYXJhbGxlbEZvckRpcmVjdGl2ZSgKKyAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLCBTdG10ICpBU3RtdCwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICBsbHZtOjpEZW5zZU1hcDxWYWx1ZURlY2wgKiwgRXhwciAqPiAmVmFyc1dpdGhJbXBsaWNpdERTQSk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBvbXAgdGVhbXMnIGFmdGVyIHBhcnNpbmcgb2YgdGhlCisgIC8vLyBhc3NvY2lhdGVkIHN0YXRlbWVudC4KKyAgU3RtdFJlc3VsdCBBY3RPbk9wZW5NUFRlYW1zRGlyZWN0aXZlKEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdCAqQVN0bXQsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ1wjcHJhZ21hIG9tcCBjYW5jZWxsYXRpb24gcG9pbnQnLgorICBTdG10UmVzdWx0CisgIEFjdE9uT3Blbk1QQ2FuY2VsbGF0aW9uUG9pbnREaXJlY3RpdmUoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5NUERpcmVjdGl2ZUtpbmQgQ2FuY2VsUmVnaW9uKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ1wjcHJhZ21hIG9tcCBjYW5jZWwnLgorICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QQ2FuY2VsRGlyZWN0aXZlKEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuTVBEaXJlY3RpdmVLaW5kIENhbmNlbFJlZ2lvbik7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBvbXAgdGFza2xvb3AnIGFmdGVyIHBhcnNpbmcgb2YgdGhlCisgIC8vLyBhc3NvY2lhdGVkIHN0YXRlbWVudC4KKyAgU3RtdFJlc3VsdCBBY3RPbk9wZW5NUFRhc2tMb29wRGlyZWN0aXZlKAorICAgICAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsIFN0bXQgKkFTdG10LCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgIGxsdm06OkRlbnNlTWFwPFZhbHVlRGVjbCAqLCBFeHByICo+ICZWYXJzV2l0aEltcGxpY2l0RFNBKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ1wjcHJhZ21hIG9tcCB0YXNrbG9vcCBzaW1kJyBhZnRlciBwYXJzaW5nIG9mCisgIC8vLyB0aGUgYXNzb2NpYXRlZCBzdGF0ZW1lbnQuCisgIFN0bXRSZXN1bHQgQWN0T25PcGVuTVBUYXNrTG9vcFNpbWREaXJlY3RpdmUoCisgICAgICBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywgU3RtdCAqQVN0bXQsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgbGx2bTo6RGVuc2VNYXA8VmFsdWVEZWNsICosIEV4cHIgKj4gJlZhcnNXaXRoSW1wbGljaXREU0EpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIGRpc3RyaWJ1dGUnIGFmdGVyIHBhcnNpbmcKKyAgLy8vIG9mIHRoZSBhc3NvY2lhdGVkIHN0YXRlbWVudC4KKyAgU3RtdFJlc3VsdCBBY3RPbk9wZW5NUERpc3RyaWJ1dGVEaXJlY3RpdmUoCisgICAgICBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywgU3RtdCAqQVN0bXQsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgbGx2bTo6RGVuc2VNYXA8VmFsdWVEZWNsICosIEV4cHIgKj4gJlZhcnNXaXRoSW1wbGljaXREU0EpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIHRhcmdldCB1cGRhdGUnLgorICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QVGFyZ2V0VXBkYXRlRGlyZWN0aXZlKEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpBU3RtdCk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBvbXAgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3InIGFmdGVyCisgIC8vLyBwYXJzaW5nIG9mIHRoZSBhc3NvY2lhdGVkIHN0YXRlbWVudC4KKyAgU3RtdFJlc3VsdCBBY3RPbk9wZW5NUERpc3RyaWJ1dGVQYXJhbGxlbEZvckRpcmVjdGl2ZSgKKyAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLCBTdG10ICpBU3RtdCwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICBsbHZtOjpEZW5zZU1hcDxWYWx1ZURlY2wgKiwgRXhwciAqPiAmVmFyc1dpdGhJbXBsaWNpdERTQSk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBvbXAgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3Igc2ltZCcKKyAgLy8vIGFmdGVyIHBhcnNpbmcgb2YgdGhlIGFzc29jaWF0ZWQgc3RhdGVtZW50LgorICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QRGlzdHJpYnV0ZVBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZSgKKyAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLCBTdG10ICpBU3RtdCwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICBsbHZtOjpEZW5zZU1hcDxWYWx1ZURlY2wgKiwgRXhwciAqPiAmVmFyc1dpdGhJbXBsaWNpdERTQSk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBvbXAgZGlzdHJpYnV0ZSBzaW1kJyBhZnRlcgorICAvLy8gcGFyc2luZyBvZiB0aGUgYXNzb2NpYXRlZCBzdGF0ZW1lbnQuCisgIFN0bXRSZXN1bHQgQWN0T25PcGVuTVBEaXN0cmlidXRlU2ltZERpcmVjdGl2ZSgKKyAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLCBTdG10ICpBU3RtdCwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICBsbHZtOjpEZW5zZU1hcDxWYWx1ZURlY2wgKiwgRXhwciAqPiAmVmFyc1dpdGhJbXBsaWNpdERTQSk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBvbXAgdGFyZ2V0IHBhcmFsbGVsIGZvciBzaW1kJyBhZnRlcgorICAvLy8gcGFyc2luZyBvZiB0aGUgYXNzb2NpYXRlZCBzdGF0ZW1lbnQuCisgIFN0bXRSZXN1bHQgQWN0T25PcGVuTVBUYXJnZXRQYXJhbGxlbEZvclNpbWREaXJlY3RpdmUoCisgICAgICBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywgU3RtdCAqQVN0bXQsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgbGx2bTo6RGVuc2VNYXA8VmFsdWVEZWNsICosIEV4cHIgKj4gJlZhcnNXaXRoSW1wbGljaXREU0EpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIHRhcmdldCBzaW1kJyBhZnRlciBwYXJzaW5nIG9mCisgIC8vLyB0aGUgYXNzb2NpYXRlZCBzdGF0ZW1lbnQuCisgIFN0bXRSZXN1bHQgQWN0T25PcGVuTVBUYXJnZXRTaW1kRGlyZWN0aXZlKAorICAgICAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsIFN0bXQgKkFTdG10LCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgIGxsdm06OkRlbnNlTWFwPFZhbHVlRGVjbCAqLCBFeHByICo+ICZWYXJzV2l0aEltcGxpY2l0RFNBKTsKKyAgLy8vIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIHRlYW1zIGRpc3RyaWJ1dGUnIGFmdGVyIHBhcnNpbmcgb2YKKyAgLy8vIHRoZSBhc3NvY2lhdGVkIHN0YXRlbWVudC4KKyAgU3RtdFJlc3VsdCBBY3RPbk9wZW5NUFRlYW1zRGlzdHJpYnV0ZURpcmVjdGl2ZSgKKyAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLCBTdG10ICpBU3RtdCwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICBsbHZtOjpEZW5zZU1hcDxWYWx1ZURlY2wgKiwgRXhwciAqPiAmVmFyc1dpdGhJbXBsaWNpdERTQSk7CisgIC8vLyBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ1wjcHJhZ21hIG9tcCB0ZWFtcyBkaXN0cmlidXRlIHNpbWQnIGFmdGVyIHBhcnNpbmcKKyAgLy8vIG9mIHRoZSBhc3NvY2lhdGVkIHN0YXRlbWVudC4KKyAgU3RtdFJlc3VsdCBBY3RPbk9wZW5NUFRlYW1zRGlzdHJpYnV0ZVNpbWREaXJlY3RpdmUoCisgICAgICBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywgU3RtdCAqQVN0bXQsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgbGx2bTo6RGVuc2VNYXA8VmFsdWVEZWNsICosIEV4cHIgKj4gJlZhcnNXaXRoSW1wbGljaXREU0EpOworICAvLy8gQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBvbXAgdGVhbXMgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3Igc2ltZCcKKyAgLy8vIGFmdGVyIHBhcnNpbmcgb2YgdGhlIGFzc29jaWF0ZWQgc3RhdGVtZW50LgorICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QVGVhbXNEaXN0cmlidXRlUGFyYWxsZWxGb3JTaW1kRGlyZWN0aXZlKAorICAgICAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsIFN0bXQgKkFTdG10LCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgIGxsdm06OkRlbnNlTWFwPFZhbHVlRGVjbCAqLCBFeHByICo+ICZWYXJzV2l0aEltcGxpY2l0RFNBKTsKKyAgLy8vIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIHRlYW1zIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yJworICAvLy8gYWZ0ZXIgcGFyc2luZyBvZiB0aGUgYXNzb2NpYXRlZCBzdGF0ZW1lbnQuCisgIFN0bXRSZXN1bHQgQWN0T25PcGVuTVBUZWFtc0Rpc3RyaWJ1dGVQYXJhbGxlbEZvckRpcmVjdGl2ZSgKKyAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLCBTdG10ICpBU3RtdCwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICBsbHZtOjpEZW5zZU1hcDxWYWx1ZURlY2wgKiwgRXhwciAqPiAmVmFyc1dpdGhJbXBsaWNpdERTQSk7CisgIC8vLyBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ1wjcHJhZ21hIG9tcCB0YXJnZXQgdGVhbXMnIGFmdGVyIHBhcnNpbmcgb2YgdGhlCisgIC8vLyBhc3NvY2lhdGVkIHN0YXRlbWVudC4KKyAgU3RtdFJlc3VsdCBBY3RPbk9wZW5NUFRhcmdldFRlYW1zRGlyZWN0aXZlKEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdCAqQVN0bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ1wjcHJhZ21hIG9tcCB0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZScgYWZ0ZXIgcGFyc2luZworICAvLy8gb2YgdGhlIGFzc29jaWF0ZWQgc3RhdGVtZW50LgorICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QVGFyZ2V0VGVhbXNEaXN0cmlidXRlRGlyZWN0aXZlKAorICAgICAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsIFN0bXQgKkFTdG10LCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgIGxsdm06OkRlbnNlTWFwPFZhbHVlRGVjbCAqLCBFeHByICo+ICZWYXJzV2l0aEltcGxpY2l0RFNBKTsKKyAgLy8vIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIHRhcmdldCB0ZWFtcyBkaXN0cmlidXRlIHBhcmFsbGVsIGZvcicKKyAgLy8vIGFmdGVyIHBhcnNpbmcgb2YgdGhlIGFzc29jaWF0ZWQgc3RhdGVtZW50LgorICBTdG10UmVzdWx0IEFjdE9uT3Blbk1QVGFyZ2V0VGVhbXNEaXN0cmlidXRlUGFyYWxsZWxGb3JEaXJlY3RpdmUoCisgICAgICBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywgU3RtdCAqQVN0bXQsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgbGx2bTo6RGVuc2VNYXA8VmFsdWVEZWNsICosIEV4cHIgKj4gJlZhcnNXaXRoSW1wbGljaXREU0EpOworICAvLy8gQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdcI3ByYWdtYSBvbXAgdGFyZ2V0IHRlYW1zIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yCisgIC8vLyBzaW1kJyBhZnRlciBwYXJzaW5nIG9mIHRoZSBhc3NvY2lhdGVkIHN0YXRlbWVudC4KKyAgU3RtdFJlc3VsdCBBY3RPbk9wZW5NUFRhcmdldFRlYW1zRGlzdHJpYnV0ZVBhcmFsbGVsRm9yU2ltZERpcmVjdGl2ZSgKKyAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLCBTdG10ICpBU3RtdCwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICBsbHZtOjpEZW5zZU1hcDxWYWx1ZURlY2wgKiwgRXhwciAqPiAmVmFyc1dpdGhJbXBsaWNpdERTQSk7CisgIC8vLyBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ1wjcHJhZ21hIG9tcCB0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSBzaW1kJyBhZnRlcgorICAvLy8gcGFyc2luZyBvZiB0aGUgYXNzb2NpYXRlZCBzdGF0ZW1lbnQuCisgIFN0bXRSZXN1bHQgQWN0T25PcGVuTVBUYXJnZXRUZWFtc0Rpc3RyaWJ1dGVTaW1kRGlyZWN0aXZlKAorICAgICAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsIFN0bXQgKkFTdG10LCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgIGxsdm06OkRlbnNlTWFwPFZhbHVlRGVjbCAqLCBFeHByICo+ICZWYXJzV2l0aEltcGxpY2l0RFNBKTsKKworICAvLy8gQ2hlY2tzIGNvcnJlY3RuZXNzIG9mIGxpbmVhciBtb2RpZmllcnMuCisgIGJvb2wgQ2hlY2tPcGVuTVBMaW5lYXJNb2RpZmllcihPcGVuTVBMaW5lYXJDbGF1c2VLaW5kIExpbktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMaW5Mb2MpOworICAvLy8gQ2hlY2tzIHRoYXQgdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbiBtYXRjaGVzIHJlcXVpcmVtZW50cyBmb3IgdGhlIGxpbmVhcgorICAvLy8gZGVjbHMuCisgIGJvb2wgQ2hlY2tPcGVuTVBMaW5lYXJEZWNsKFZhbHVlRGVjbCAqRCwgU291cmNlTG9jYXRpb24gRUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3Blbk1QTGluZWFyQ2xhdXNlS2luZCBMaW5LaW5kLCBRdWFsVHlwZSBUeXBlKTsKKworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIGRlY2xhcmUgc2ltZCcgYWZ0ZXIgcGFyc2luZyBvZgorICAvLy8gdGhlIGFzc29jaWF0ZWQgbWV0aG9kL2Z1bmN0aW9uLgorICBEZWNsR3JvdXBQdHJUeSBBY3RPbk9wZW5NUERlY2xhcmVTaW1kRGlyZWN0aXZlKAorICAgICAgRGVjbEdyb3VwUHRyVHkgREcsIE9NUERlY2xhcmVTaW1kRGVjbEF0dHI6OkJyYW5jaFN0YXRlVHkgQlMsCisgICAgICBFeHByICpTaW1kbGVuLCBBcnJheVJlZjxFeHByICo+IFVuaWZvcm1zLCBBcnJheVJlZjxFeHByICo+IEFsaWduZWRzLAorICAgICAgQXJyYXlSZWY8RXhwciAqPiBBbGlnbm1lbnRzLCBBcnJheVJlZjxFeHByICo+IExpbmVhcnMsCisgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gTGluTW9kaWZpZXJzLCBBcnJheVJlZjxFeHByICo+IFN0ZXBzLCBTb3VyY2VSYW5nZSBTUik7CisKKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUFNpbmdsZUV4cHJDbGF1c2UoT3Blbk1QQ2xhdXNlS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnaWYnIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUElmQ2xhdXNlKE9wZW5NUERpcmVjdGl2ZUtpbmQgTmFtZU1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqQ29uZGl0aW9uLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE5hbWVNb2RpZmllckxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENvbG9uTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ2ZpbmFsJyBjbGF1c2UuCisgIE9NUENsYXVzZSAqQWN0T25PcGVuTVBGaW5hbENsYXVzZShFeHByICpDb25kaXRpb24sIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ251bV90aHJlYWRzJyBjbGF1c2UuCisgIE9NUENsYXVzZSAqQWN0T25PcGVuTVBOdW1UaHJlYWRzQ2xhdXNlKEV4cHIgKk51bVRocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdzYWZlbGVuJyBjbGF1c2UuCisgIE9NUENsYXVzZSAqQWN0T25PcGVuTVBTYWZlbGVuQ2xhdXNlKEV4cHIgKkxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ3NpbWRsZW4nIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUFNpbWRsZW5DbGF1c2UoRXhwciAqTGVuZ3RoLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnY29sbGFwc2UnIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUENvbGxhcHNlQ2xhdXNlKEV4cHIgKk51bUZvckxvb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnb3JkZXJlZCcgY2xhdXNlLgorICBPTVBDbGF1c2UgKgorICBBY3RPbk9wZW5NUE9yZGVyZWRDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYyA9IFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpOdW1Gb3JMb29wcyA9IG51bGxwdHIpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnZ3JhaW5zaXplJyBjbGF1c2UuCisgIE9NUENsYXVzZSAqQWN0T25PcGVuTVBHcmFpbnNpemVDbGF1c2UoRXhwciAqU2l6ZSwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdudW1fdGFza3MnIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUE51bVRhc2tzQ2xhdXNlKEV4cHIgKk51bVRhc2tzLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdoaW50JyBjbGF1c2UuCisgIE9NUENsYXVzZSAqQWN0T25PcGVuTVBIaW50Q2xhdXNlKEV4cHIgKkhpbnQsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisKKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUFNpbXBsZUNsYXVzZShPcGVuTVBDbGF1c2VLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXJndW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXJndW1lbnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdkZWZhdWx0JyBjbGF1c2UuCisgIE9NUENsYXVzZSAqQWN0T25PcGVuTVBEZWZhdWx0Q2xhdXNlKE9wZW5NUERlZmF1bHRDbGF1c2VLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEtpbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdwcm9jX2JpbmQnIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUFByb2NCaW5kQ2xhdXNlKE9wZW5NUFByb2NCaW5kQ2xhdXNlS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gS2luZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKworICBPTVBDbGF1c2UgKkFjdE9uT3Blbk1QU2luZ2xlRXhwcldpdGhBcmdDbGF1c2UoCisgICAgICBPcGVuTVBDbGF1c2VLaW5kIEtpbmQsIEFycmF5UmVmPHVuc2lnbmVkPiBBcmd1bWVudHMsIEV4cHIgKkV4cHIsCisgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgQXJyYXlSZWY8U291cmNlTG9jYXRpb24+IEFyZ3VtZW50c0xvYywgU291cmNlTG9jYXRpb24gRGVsaW1Mb2MsCisgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnc2NoZWR1bGUnIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUFNjaGVkdWxlQ2xhdXNlKAorICAgICAgT3Blbk1QU2NoZWR1bGVDbGF1c2VNb2RpZmllciBNMSwgT3Blbk1QU2NoZWR1bGVDbGF1c2VNb2RpZmllciBNMiwKKyAgICAgIE9wZW5NUFNjaGVkdWxlQ2xhdXNlS2luZCBLaW5kLCBFeHByICpDaHVua1NpemUsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLCBTb3VyY2VMb2NhdGlvbiBNMUxvYywgU291cmNlTG9jYXRpb24gTTJMb2MsCisgICAgICBTb3VyY2VMb2NhdGlvbiBLaW5kTG9jLCBTb3VyY2VMb2NhdGlvbiBDb21tYUxvYywgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKworICBPTVBDbGF1c2UgKkFjdE9uT3Blbk1QQ2xhdXNlKE9wZW5NUENsYXVzZUtpbmQgS2luZCwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ25vd2FpdCcgY2xhdXNlLgorICBPTVBDbGF1c2UgKkFjdE9uT3Blbk1QTm93YWl0Q2xhdXNlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICd1bnRpZWQnIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUFVudGllZENsYXVzZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnbWVyZ2VhYmxlJyBjbGF1c2UuCisgIE9NUENsYXVzZSAqQWN0T25PcGVuTVBNZXJnZWFibGVDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ3JlYWQnIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUFJlYWRDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICd3cml0ZScgY2xhdXNlLgorICBPTVBDbGF1c2UgKkFjdE9uT3Blbk1QV3JpdGVDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAndXBkYXRlJyBjbGF1c2UuCisgIE9NUENsYXVzZSAqQWN0T25PcGVuTVBVcGRhdGVDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ2NhcHR1cmUnIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUENhcHR1cmVDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdzZXFfY3N0JyBjbGF1c2UuCisgIE9NUENsYXVzZSAqQWN0T25PcGVuTVBTZXFDc3RDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ3RocmVhZHMnIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUFRocmVhZHNDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdzaW1kJyBjbGF1c2UuCisgIE9NUENsYXVzZSAqQWN0T25PcGVuTVBTSU1EQ2xhdXNlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnbm9ncm91cCcgY2xhdXNlLgorICBPTVBDbGF1c2UgKkFjdE9uT3Blbk1QTm9ncm91cENsYXVzZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKworICBPTVBDbGF1c2UgKkFjdE9uT3Blbk1QVmFyTGlzdENsYXVzZSgKKyAgICAgIE9wZW5NUENsYXVzZUtpbmQgS2luZCwgQXJyYXlSZWY8RXhwciAqPiBWYXJzLCBFeHByICpUYWlsRXhwciwKKyAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgQ1hYU2NvcGVTcGVjICZSZWR1Y3Rpb25JZFNjb3BlU3BlYywKKyAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJlJlZHVjdGlvbklkLCBPcGVuTVBEZXBlbmRDbGF1c2VLaW5kIERlcEtpbmQsCisgICAgICBPcGVuTVBMaW5lYXJDbGF1c2VLaW5kIExpbktpbmQsIE9wZW5NUE1hcENsYXVzZUtpbmQgTWFwVHlwZU1vZGlmaWVyLAorICAgICAgT3Blbk1QTWFwQ2xhdXNlS2luZCBNYXBUeXBlLCBib29sIElzTWFwVHlwZUltcGxpY2l0LAorICAgICAgU291cmNlTG9jYXRpb24gRGVwTGluTWFwTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ3ByaXZhdGUnIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUFByaXZhdGVDbGF1c2UoQXJyYXlSZWY8RXhwciAqPiBWYXJMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnZmlyc3Rwcml2YXRlJyBjbGF1c2UuCisgIE9NUENsYXVzZSAqQWN0T25PcGVuTVBGaXJzdHByaXZhdGVDbGF1c2UoQXJyYXlSZWY8RXhwciAqPiBWYXJMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnbGFzdHByaXZhdGUnIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUExhc3Rwcml2YXRlQ2xhdXNlKEFycmF5UmVmPEV4cHIgKj4gVmFyTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ3NoYXJlZCcgY2xhdXNlLgorICBPTVBDbGF1c2UgKkFjdE9uT3Blbk1QU2hhcmVkQ2xhdXNlKEFycmF5UmVmPEV4cHIgKj4gVmFyTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ3JlZHVjdGlvbicgY2xhdXNlLgorICBPTVBDbGF1c2UgKkFjdE9uT3Blbk1QUmVkdWN0aW9uQ2xhdXNlKAorICAgICAgQXJyYXlSZWY8RXhwciAqPiBWYXJMaXN0LCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywgU291cmNlTG9jYXRpb24gQ29sb25Mb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgIENYWFNjb3BlU3BlYyAmUmVkdWN0aW9uSWRTY29wZVNwZWMsCisgICAgICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZSZWR1Y3Rpb25JZCwKKyAgICAgIEFycmF5UmVmPEV4cHIgKj4gVW5yZXNvbHZlZFJlZHVjdGlvbnMgPSBsbHZtOjpOb25lKTsKKyAgLy8vIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAndGFza19yZWR1Y3Rpb24nIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUFRhc2tSZWR1Y3Rpb25DbGF1c2UoCisgICAgICBBcnJheVJlZjxFeHByICo+IFZhckxpc3QsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLCBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYywgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgQ1hYU2NvcGVTcGVjICZSZWR1Y3Rpb25JZFNjb3BlU3BlYywKKyAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJlJlZHVjdGlvbklkLAorICAgICAgQXJyYXlSZWY8RXhwciAqPiBVbnJlc29sdmVkUmVkdWN0aW9ucyA9IGxsdm06Ok5vbmUpOworICAvLy8gQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdpbl9yZWR1Y3Rpb24nIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUEluUmVkdWN0aW9uQ2xhdXNlKAorICAgICAgQXJyYXlSZWY8RXhwciAqPiBWYXJMaXN0LCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywgU291cmNlTG9jYXRpb24gQ29sb25Mb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgIENYWFNjb3BlU3BlYyAmUmVkdWN0aW9uSWRTY29wZVNwZWMsCisgICAgICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZSZWR1Y3Rpb25JZCwKKyAgICAgIEFycmF5UmVmPEV4cHIgKj4gVW5yZXNvbHZlZFJlZHVjdGlvbnMgPSBsbHZtOjpOb25lKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ2xpbmVhcicgY2xhdXNlLgorICBPTVBDbGF1c2UgKgorICBBY3RPbk9wZW5NUExpbmVhckNsYXVzZShBcnJheVJlZjxFeHByICo+IFZhckxpc3QsIEV4cHIgKlN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5NUExpbmVhckNsYXVzZUtpbmQgTGluS2luZCwgU291cmNlTG9jYXRpb24gTGluTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYywgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ2FsaWduZWQnIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUEFsaWduZWRDbGF1c2UoQXJyYXlSZWY8RXhwciAqPiBWYXJMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENvbG9uTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnY29weWluJyBjbGF1c2UuCisgIE9NUENsYXVzZSAqQWN0T25PcGVuTVBDb3B5aW5DbGF1c2UoQXJyYXlSZWY8RXhwciAqPiBWYXJMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnY29weXByaXZhdGUnIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUENvcHlwcml2YXRlQ2xhdXNlKEFycmF5UmVmPEV4cHIgKj4gVmFyTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ2ZsdXNoJyBwc2V1ZG8gY2xhdXNlLgorICBPTVBDbGF1c2UgKkFjdE9uT3Blbk1QRmx1c2hDbGF1c2UoQXJyYXlSZWY8RXhwciAqPiBWYXJMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnZGVwZW5kJyBjbGF1c2UuCisgIE9NUENsYXVzZSAqCisgIEFjdE9uT3Blbk1QRGVwZW5kQ2xhdXNlKE9wZW5NUERlcGVuZENsYXVzZUtpbmQgRGVwS2luZCwgU291cmNlTG9jYXRpb24gRGVwTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYywgQXJyYXlSZWY8RXhwciAqPiBWYXJMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnZGV2aWNlJyBjbGF1c2UuCisgIE9NUENsYXVzZSAqQWN0T25PcGVuTVBEZXZpY2VDbGF1c2UoRXhwciAqRGV2aWNlLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ21hcCcgY2xhdXNlLgorICBPTVBDbGF1c2UgKgorICBBY3RPbk9wZW5NUE1hcENsYXVzZShPcGVuTVBNYXBDbGF1c2VLaW5kIE1hcFR5cGVNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgT3Blbk1QTWFwQ2xhdXNlS2luZCBNYXBUeXBlLCBib29sIElzTWFwVHlwZUltcGxpY2l0LAorICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBNYXBMb2MsIFNvdXJjZUxvY2F0aW9uIENvbG9uTG9jLAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IFZhckxpc3QsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdudW1fdGVhbXMnIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUE51bVRlYW1zQ2xhdXNlKEV4cHIgKk51bVRlYW1zLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICd0aHJlYWRfbGltaXQnIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUFRocmVhZExpbWl0Q2xhdXNlKEV4cHIgKlRocmVhZExpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAncHJpb3JpdHknIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUFByaW9yaXR5Q2xhdXNlKEV4cHIgKlByaW9yaXR5LCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdkaXN0X3NjaGVkdWxlJyBjbGF1c2UuCisgIE9NUENsYXVzZSAqQWN0T25PcGVuTVBEaXN0U2NoZWR1bGVDbGF1c2UoCisgICAgICBPcGVuTVBEaXN0U2NoZWR1bGVDbGF1c2VLaW5kIEtpbmQsIEV4cHIgKkNodW5rU2l6ZSwKKyAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsIFNvdXJjZUxvY2F0aW9uIEtpbmRMb2MsCisgICAgICBTb3VyY2VMb2NhdGlvbiBDb21tYUxvYywgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ2RlZmF1bHRtYXAnIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUERlZmF1bHRtYXBDbGF1c2UoCisgICAgICBPcGVuTVBEZWZhdWx0bWFwQ2xhdXNlTW9kaWZpZXIgTSwgT3Blbk1QRGVmYXVsdG1hcENsYXVzZUtpbmQgS2luZCwKKyAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsIFNvdXJjZUxvY2F0aW9uIE1Mb2MsCisgICAgICBTb3VyY2VMb2NhdGlvbiBLaW5kTG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAndG8nIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUFRvQ2xhdXNlKEFycmF5UmVmPEV4cHIgKj4gVmFyTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ2Zyb20nIGNsYXVzZS4KKyAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUEZyb21DbGF1c2UoQXJyYXlSZWY8RXhwciAqPiBWYXJMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICd1c2VfZGV2aWNlX3B0cicgY2xhdXNlLgorICBPTVBDbGF1c2UgKkFjdE9uT3Blbk1QVXNlRGV2aWNlUHRyQ2xhdXNlKEFycmF5UmVmPEV4cHIgKj4gVmFyTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnaXNfZGV2aWNlX3B0cicgY2xhdXNlLgorICBPTVBDbGF1c2UgKkFjdE9uT3Blbk1QSXNEZXZpY2VQdHJDbGF1c2UoQXJyYXlSZWY8RXhwciAqPiBWYXJMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworCisgIC8vLyBcYnJpZWYgVGhlIGtpbmQgb2YgY29udmVyc2lvbiBiZWluZyBwZXJmb3JtZWQuCisgIGVudW0gQ2hlY2tlZENvbnZlcnNpb25LaW5kIHsKKyAgICAvLy8gXGJyaWVmIEFuIGltcGxpY2l0IGNvbnZlcnNpb24uCisgICAgQ0NLX0ltcGxpY2l0Q29udmVyc2lvbiwKKyAgICAvLy8gXGJyaWVmIEEgQy1zdHlsZSBjYXN0LgorICAgIENDS19DU3R5bGVDYXN0LAorICAgIC8vLyBcYnJpZWYgQSBmdW5jdGlvbmFsLXN0eWxlIGNhc3QuCisgICAgQ0NLX0Z1bmN0aW9uYWxDYXN0LAorICAgIC8vLyBcYnJpZWYgQSBjYXN0IG90aGVyIHRoYW4gYSBDLXN0eWxlIGNhc3QuCisgICAgQ0NLX090aGVyQ2FzdAorICB9OworCisgIC8vLyBJbXBDYXN0RXhwclRvVHlwZSAtIElmIEV4cHIgaXMgbm90IG9mIHR5cGUgJ1R5cGUnLCBpbnNlcnQgYW4gaW1wbGljaXQKKyAgLy8vIGNhc3QuICBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGltcGxpY2l0IGNhc3QsIG1lcmdlIGludG8gdGhlIGV4aXN0aW5nIG9uZS4KKyAgLy8vIElmIGlzTHZhbHVlLCB0aGUgcmVzdWx0IG9mIHRoZSBjYXN0IGlzIGFuIGx2YWx1ZS4KKyAgRXhwclJlc3VsdCBJbXBDYXN0RXhwclRvVHlwZShFeHByICpFLCBRdWFsVHlwZSBUeXBlLCBDYXN0S2luZCBDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByVmFsdWVLaW5kIFZLID0gVktfUlZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWENhc3RQYXRoICpCYXNlUGF0aCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlZENvbnZlcnNpb25LaW5kIENDSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQ0NLX0ltcGxpY2l0Q29udmVyc2lvbik7CisKKyAgLy8vIFNjYWxhclR5cGVUb0Jvb2xlYW5DYXN0S2luZCAtIFJldHVybnMgdGhlIGNhc3Qga2luZCBjb3JyZXNwb25kaW5nCisgIC8vLyB0byB0aGUgY29udmVyc2lvbiBmcm9tIHNjYWxhciB0eXBlIFNjYWxhclR5IHRvIHRoZSBCb29sZWFuIHR5cGUuCisgIHN0YXRpYyBDYXN0S2luZCBTY2FsYXJUeXBlVG9Cb29sZWFuQ2FzdEtpbmQoUXVhbFR5cGUgU2NhbGFyVHkpOworCisgIC8vLyBJZ25vcmVkVmFsdWVDb252ZXJzaW9ucyAtIEdpdmVuIHRoYXQgYW4gZXhwcmVzc2lvbidzIHJlc3VsdCBpcworICAvLy8gc3ludGFjdGljYWxseSBpZ25vcmVkLCBwZXJmb3JtIGFueSBjb252ZXJzaW9ucyB0aGF0IGFyZQorICAvLy8gcmVxdWlyZWQuCisgIEV4cHJSZXN1bHQgSWdub3JlZFZhbHVlQ29udmVyc2lvbnMoRXhwciAqRSk7CisKKyAgLy8gVXN1YWxVbmFyeUNvbnZlcnNpb25zIC0gcHJvbW90ZXMgaW50ZWdlcnMgKEM5OSA2LjMuMS4xcDIpIGFuZCBjb252ZXJ0cworICAvLyBmdW5jdGlvbnMgYW5kIGFycmF5cyB0byB0aGVpciByZXNwZWN0aXZlIHBvaW50ZXJzIChDOTkgNi4zLjIuMSkuCisgIEV4cHJSZXN1bHQgVXN1YWxVbmFyeUNvbnZlcnNpb25zKEV4cHIgKkUpOworCisgIC8vLyBDYWxsRXhwclVuYXJ5Q29udmVyc2lvbnMgLSBhIHNwZWNpYWwgY2FzZSBvZiBhbiB1bmFyeSBjb252ZXJzaW9uCisgIC8vLyBwZXJmb3JtZWQgb24gYSBmdW5jdGlvbiBkZXNpZ25hdG9yIG9mIGEgY2FsbCBleHByZXNzaW9uLgorICBFeHByUmVzdWx0IENhbGxFeHByVW5hcnlDb252ZXJzaW9ucyhFeHByICpFKTsKKworICAvLyBEZWZhdWx0RnVuY3Rpb25BcnJheUNvbnZlcnNpb24gLSBjb252ZXJ0cyBmdW5jdGlvbnMgYW5kIGFycmF5cworICAvLyB0byB0aGVpciByZXNwZWN0aXZlIHBvaW50ZXJzIChDOTkgNi4zLjIuMSkuCisgIEV4cHJSZXN1bHQgRGVmYXVsdEZ1bmN0aW9uQXJyYXlDb252ZXJzaW9uKEV4cHIgKkUsIGJvb2wgRGlhZ25vc2UgPSB0cnVlKTsKKworICAvLyBEZWZhdWx0RnVuY3Rpb25BcnJheUx2YWx1ZUNvbnZlcnNpb24gLSBjb252ZXJ0cyBmdW5jdGlvbnMgYW5kCisgIC8vIGFycmF5cyB0byB0aGVpciByZXNwZWN0aXZlIHBvaW50ZXJzIGFuZCBwZXJmb3JtcyB0aGUKKyAgLy8gbHZhbHVlLXRvLXJ2YWx1ZSBjb252ZXJzaW9uLgorICBFeHByUmVzdWx0IERlZmF1bHRGdW5jdGlvbkFycmF5THZhbHVlQ29udmVyc2lvbihFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpYWdub3NlID0gdHJ1ZSk7CisKKyAgLy8gRGVmYXVsdEx2YWx1ZUNvbnZlcnNpb24gLSBwZXJmb3JtcyBsdmFsdWUtdG8tcnZhbHVlIGNvbnZlcnNpb24gb24KKyAgLy8gdGhlIG9wZXJhbmQuICBUaGlzIGlzIERlZmF1bHRGdW5jdGlvbkFycmF5THZhbHVlQ29udmVyc2lvbiwKKyAgLy8gZXhjZXB0IHRoYXQgaXQgYXNzdW1lcyB0aGUgb3BlcmFuZCBpc24ndCBvZiBmdW5jdGlvbiBvciBhcnJheQorICAvLyB0eXBlLgorICBFeHByUmVzdWx0IERlZmF1bHRMdmFsdWVDb252ZXJzaW9uKEV4cHIgKkUpOworCisgIC8vIERlZmF1bHRBcmd1bWVudFByb21vdGlvbiAoQzk5IDYuNS4yLjJwNikuIFVzZWQgZm9yIGZ1bmN0aW9uIGNhbGxzIHRoYXQKKyAgLy8gZG8gbm90IGhhdmUgYSBwcm90b3R5cGUuIEludGVnZXIgcHJvbW90aW9ucyBhcmUgcGVyZm9ybWVkIG9uIGVhY2gKKyAgLy8gYXJndW1lbnQsIGFuZCBhcmd1bWVudHMgdGhhdCBoYXZlIHR5cGUgZmxvYXQgYXJlIHByb21vdGVkIHRvIGRvdWJsZS4KKyAgRXhwclJlc3VsdCBEZWZhdWx0QXJndW1lbnRQcm9tb3Rpb24oRXhwciAqRSk7CisKKyAgLy8vIElmIFxwIEUgaXMgYSBwcnZhbHVlIGRlbm90aW5nIGFuIHVubWF0ZXJpYWxpemVkIHRlbXBvcmFyeSwgbWF0ZXJpYWxpemUKKyAgLy8vIGl0IGFzIGFuIHh2YWx1ZS4gSW4gQysrOTgsIHRoZSByZXN1bHQgd2lsbCBzdGlsbCBiZSBhIHBydmFsdWUsIGJlY2F1c2UKKyAgLy8vIHdlIGRvbid0IGhhdmUgeHZhbHVlcyB0aGVyZS4KKyAgRXhwclJlc3VsdCBUZW1wb3JhcnlNYXRlcmlhbGl6YXRpb25Db252ZXJzaW9uKEV4cHIgKkUpOworCisgIC8vIFVzZWQgZm9yIGVtaXR0aW5nIHRoZSByaWdodCB3YXJuaW5nIGJ5IERlZmF1bHRWYXJpYWRpY0FyZ3VtZW50UHJvbW90aW9uCisgIGVudW0gVmFyaWFkaWNDYWxsVHlwZSB7CisgICAgVmFyaWFkaWNGdW5jdGlvbiwKKyAgICBWYXJpYWRpY0Jsb2NrLAorICAgIFZhcmlhZGljTWV0aG9kLAorICAgIFZhcmlhZGljQ29uc3RydWN0b3IsCisgICAgVmFyaWFkaWNEb2VzTm90QXBwbHkKKyAgfTsKKworICBWYXJpYWRpY0NhbGxUeXBlIGdldFZhcmlhZGljQ2FsbFR5cGUoRnVuY3Rpb25EZWNsICpGRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpQcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkZuKTsKKworICAvLyBVc2VkIGZvciBkZXRlcm1pbmluZyBpbiB3aGljaCBjb250ZXh0IGEgdHlwZSBpcyBhbGxvd2VkIHRvIGJlIHBhc3NlZCB0byBhCisgIC8vIHZhcmFyZyBmdW5jdGlvbi4KKyAgZW51bSBWYXJBcmdLaW5kIHsKKyAgICBWQUtfVmFsaWQsCisgICAgVkFLX1ZhbGlkSW5DWFgxMSwKKyAgICBWQUtfVW5kZWZpbmVkLAorICAgIFZBS19NU1ZDVW5kZWZpbmVkLAorICAgIFZBS19JbnZhbGlkCisgIH07CisKKyAgLy8gRGV0ZXJtaW5lcyB3aGljaCBWYXJBcmdLaW5kIGZpdHMgYW4gZXhwcmVzc2lvbi4KKyAgVmFyQXJnS2luZCBpc1ZhbGlkVmFyQXJnVHlwZShjb25zdCBRdWFsVHlwZSAmVHkpOworCisgIC8vLyBDaGVjayB0byBzZWUgaWYgdGhlIGdpdmVuIGV4cHJlc3Npb24gaXMgYSB2YWxpZCBhcmd1bWVudCB0byBhIHZhcmlhZGljCisgIC8vLyBmdW5jdGlvbiwgaXNzdWluZyBhIGRpYWdub3N0aWMgaWYgbm90LgorICB2b2lkIGNoZWNrVmFyaWFkaWNBcmd1bWVudChjb25zdCBFeHByICpFLCBWYXJpYWRpY0NhbGxUeXBlIENUKTsKKworICAvLy8gQ2hlY2sgdG8gc2VlIGlmIGEgZ2l2ZW4gZXhwcmVzc2lvbiBjb3VsZCBoYXZlICcuY19zdHIoKScgY2FsbGVkIG9uIGl0LgorICBib29sIGhhc0NTdHJNZXRob2QoY29uc3QgRXhwciAqRSk7CisKKyAgLy8vIEdhdGhlckFyZ3VtZW50c0ZvckNhbGwgLSBDb2xsZWN0b3IgYXJndW1lbnQgZXhwcmVzc2lvbnMgZm9yIHZhcmlvdXMKKyAgLy8vIGZvcm0gb2YgY2FsbCBwcm90b3R5cGVzLgorICBib29sIEdhdGhlckFyZ3VtZW50c0ZvckNhbGwoU291cmNlTG9jYXRpb24gQ2FsbExvYywgRnVuY3Rpb25EZWNsICpGRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpQcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZpcnN0UGFyYW0sIEFycmF5UmVmPEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxFeHByICo+ICZBbGxBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFkaWNDYWxsVHlwZSBDYWxsVHlwZSA9IFZhcmlhZGljRG9lc05vdEFwcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0V4cGxpY2l0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzTGlzdEluaXRpYWxpemF0aW9uID0gZmFsc2UpOworCisgIC8vIERlZmF1bHRWYXJpYWRpY0FyZ3VtZW50UHJvbW90aW9uIC0gTGlrZSBEZWZhdWx0QXJndW1lbnRQcm9tb3Rpb24sIGJ1dAorICAvLyB3aWxsIGNyZWF0ZSBhIHJ1bnRpbWUgdHJhcCBpZiB0aGUgcmVzdWx0aW5nIHR5cGUgaXMgbm90IGEgUE9EIHR5cGUuCisgIEV4cHJSZXN1bHQgRGVmYXVsdFZhcmlhZGljQXJndW1lbnRQcm9tb3Rpb24oRXhwciAqRSwgVmFyaWFkaWNDYWxsVHlwZSBDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkRlY2wgKkZEZWNsKTsKKworICAvLyBVc3VhbEFyaXRobWV0aWNDb252ZXJzaW9ucyAtIHBlcmZvcm1zIHRoZSBVc3VhbFVuYXJ5Q29udmVyc2lvbnMgb24gaXQncworICAvLyBvcGVyYW5kcyBhbmQgdGhlbiBoYW5kbGVzIHZhcmlvdXMgY29udmVyc2lvbnMgdGhhdCBhcmUgY29tbW9uIHRvIGJpbmFyeQorICAvLyBvcGVyYXRvcnMgKEM5OSA2LjMuMS44KS4gSWYgYm90aCBvcGVyYW5kcyBhcmVuJ3QgYXJpdGhtZXRpYywgdGhpcworICAvLyByb3V0aW5lIHJldHVybnMgdGhlIGZpcnN0IG5vbi1hcml0aG1ldGljIHR5cGUgZm91bmQuIFRoZSBjbGllbnQgaXMKKyAgLy8gcmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIGFwcHJvcHJpYXRlIGVycm9yIGRpYWdub3N0aWNzLgorICBRdWFsVHlwZSBVc3VhbEFyaXRobWV0aWNDb252ZXJzaW9ucyhFeHByUmVzdWx0ICZMSFMsIEV4cHJSZXN1bHQgJlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0NvbXBBc3NpZ24gPSBmYWxzZSk7CisKKyAgLy8vIEFzc2lnbkNvbnZlcnRUeXBlIC0gQWxsIG9mIHRoZSAnYXNzaWdubWVudCcgc2VtYW50aWMgY2hlY2tzIHJldHVybiB0aGlzCisgIC8vLyBlbnVtIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGFzc2lnbm1lbnQgd2FzIGFsbG93ZWQuICBUaGVzZSBjaGVja3MgYXJlCisgIC8vLyBkb25lIGZvciBzaW1wbGUgYXNzaWdubWVudHMsIGFzIHdlbGwgYXMgaW5pdGlhbGl6YXRpb24sIHJldHVybiBmcm9tCisgIC8vLyBmdW5jdGlvbiwgYXJndW1lbnQgcGFzc2luZywgZXRjLiAgVGhlIHF1ZXJ5IGlzIHBocmFzZWQgaW4gdGVybXMgb2YgYQorICAvLy8gc291cmNlIGFuZCBkZXN0aW5hdGlvbiB0eXBlLgorICBlbnVtIEFzc2lnbkNvbnZlcnRUeXBlIHsKKyAgICAvLy8gQ29tcGF0aWJsZSAtIHRoZSB0eXBlcyBhcmUgY29tcGF0aWJsZSBhY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkLgorICAgIENvbXBhdGlibGUsCisKKyAgICAvLy8gUG9pbnRlclRvSW50IC0gVGhlIGFzc2lnbm1lbnQgY29udmVydHMgYSBwb2ludGVyIHRvIGFuIGludCwgd2hpY2ggd2UKKyAgICAvLy8gYWNjZXB0IGFzIGFuIGV4dGVuc2lvbi4KKyAgICBQb2ludGVyVG9JbnQsCisKKyAgICAvLy8gSW50VG9Qb2ludGVyIC0gVGhlIGFzc2lnbm1lbnQgY29udmVydHMgYW4gaW50IHRvIGEgcG9pbnRlciwgd2hpY2ggd2UKKyAgICAvLy8gYWNjZXB0IGFzIGFuIGV4dGVuc2lvbi4KKyAgICBJbnRUb1BvaW50ZXIsCisKKyAgICAvLy8gRnVuY3Rpb25Wb2lkUG9pbnRlciAtIFRoZSBhc3NpZ25tZW50IGlzIGJldHdlZW4gYSBmdW5jdGlvbiBwb2ludGVyIGFuZAorICAgIC8vLyB2b2lkKiwgd2hpY2ggdGhlIHN0YW5kYXJkIGRvZXNuJ3QgYWxsb3csIGJ1dCB3ZSBhY2NlcHQgYXMgYW4gZXh0ZW5zaW9uLgorICAgIEZ1bmN0aW9uVm9pZFBvaW50ZXIsCisKKyAgICAvLy8gSW5jb21wYXRpYmxlUG9pbnRlciAtIFRoZSBhc3NpZ25tZW50IGlzIGJldHdlZW4gdHdvIHBvaW50ZXJzIHR5cGVzIHRoYXQKKyAgICAvLy8gYXJlIG5vdCBjb21wYXRpYmxlLCBidXQgd2UgYWNjZXB0IHRoZW0gYXMgYW4gZXh0ZW5zaW9uLgorICAgIEluY29tcGF0aWJsZVBvaW50ZXIsCisKKyAgICAvLy8gSW5jb21wYXRpYmxlUG9pbnRlclNpZ24gLSBUaGUgYXNzaWdubWVudCBpcyBiZXR3ZWVuIHR3byBwb2ludGVycyB0eXBlcworICAgIC8vLyB3aGljaCBwb2ludCB0byBpbnRlZ2VycyB3aGljaCBoYXZlIGEgZGlmZmVyZW50IHNpZ24sIGJ1dCBhcmUgb3RoZXJ3aXNlCisgICAgLy8vIGlkZW50aWNhbC4gVGhpcyBpcyBhIHN1YnNldCBvZiB0aGUgYWJvdmUsIGJ1dCBicm9rZW4gb3V0IGJlY2F1c2UgaXQncyBieQorICAgIC8vLyBmYXIgdGhlIG1vc3QgY29tbW9uIGNhc2Ugb2YgaW5jb21wYXRpYmxlIHBvaW50ZXJzLgorICAgIEluY29tcGF0aWJsZVBvaW50ZXJTaWduLAorCisgICAgLy8vIENvbXBhdGlibGVQb2ludGVyRGlzY2FyZHNRdWFsaWZpZXJzIC0gVGhlIGFzc2lnbm1lbnQgZGlzY2FyZHMKKyAgICAvLy8gYy92L3IgcXVhbGlmaWVycywgd2hpY2ggd2UgYWNjZXB0IGFzIGFuIGV4dGVuc2lvbi4KKyAgICBDb21wYXRpYmxlUG9pbnRlckRpc2NhcmRzUXVhbGlmaWVycywKKworICAgIC8vLyBJbmNvbXBhdGlibGVQb2ludGVyRGlzY2FyZHNRdWFsaWZpZXJzIC0gVGhlIGFzc2lnbm1lbnQKKyAgICAvLy8gZGlzY2FyZHMgcXVhbGlmaWVycyB0aGF0IHdlIGRvbid0IHBlcm1pdCB0byBiZSBkaXNjYXJkZWQsCisgICAgLy8vIGxpa2UgYWRkcmVzcyBzcGFjZXMuCisgICAgSW5jb21wYXRpYmxlUG9pbnRlckRpc2NhcmRzUXVhbGlmaWVycywKKworICAgIC8vLyBJbmNvbXBhdGlibGVOZXN0ZWRQb2ludGVyUXVhbGlmaWVycyAtIFRoZSBhc3NpZ25tZW50IGlzIGJldHdlZW4gdHdvCisgICAgLy8vIG5lc3RlZCBwb2ludGVyIHR5cGVzLCBhbmQgdGhlIHF1YWxpZmllcnMgb3RoZXIgdGhhbiB0aGUgZmlyc3QgdHdvCisgICAgLy8vIGxldmVscyBkaWZmZXIgZS5nLiBjaGFyICoqIC0+IGNvbnN0IGNoYXIgKiosIGJ1dCB3ZSBhY2NlcHQgdGhlbSBhcyBhbgorICAgIC8vLyBleHRlbnNpb24uCisgICAgSW5jb21wYXRpYmxlTmVzdGVkUG9pbnRlclF1YWxpZmllcnMsCisKKyAgICAvLy8gSW5jb21wYXRpYmxlVmVjdG9ycyAtIFRoZSBhc3NpZ25tZW50IGlzIGJldHdlZW4gdHdvIHZlY3RvciB0eXBlcyB0aGF0CisgICAgLy8vIGhhdmUgdGhlIHNhbWUgc2l6ZSwgd2hpY2ggd2UgYWNjZXB0IGFzIGFuIGV4dGVuc2lvbi4KKyAgICBJbmNvbXBhdGlibGVWZWN0b3JzLAorCisgICAgLy8vIEludFRvQmxvY2tQb2ludGVyIC0gVGhlIGFzc2lnbm1lbnQgY29udmVydHMgYW4gaW50IHRvIGEgYmxvY2sKKyAgICAvLy8gcG9pbnRlci4gV2UgZGlzYWxsb3cgdGhpcy4KKyAgICBJbnRUb0Jsb2NrUG9pbnRlciwKKworICAgIC8vLyBJbmNvbXBhdGlibGVCbG9ja1BvaW50ZXIgLSBUaGUgYXNzaWdubWVudCBpcyBiZXR3ZWVuIHR3byBibG9jaworICAgIC8vLyBwb2ludGVycyB0eXBlcyB0aGF0IGFyZSBub3QgY29tcGF0aWJsZS4KKyAgICBJbmNvbXBhdGlibGVCbG9ja1BvaW50ZXIsCisKKyAgICAvLy8gSW5jb21wYXRpYmxlT2JqQ1F1YWxpZmllZElkIC0gVGhlIGFzc2lnbm1lbnQgaXMgYmV0d2VlbiBhIHF1YWxpZmllZAorICAgIC8vLyBpZCB0eXBlIGFuZCBzb21ldGhpbmcgZWxzZSAodGhhdCBpcyBpbmNvbXBhdGlibGUgd2l0aCBpdCkuIEZvciBleGFtcGxlLAorICAgIC8vLyAiaWQgPFhYWD4iID0gIkZvbyAqIiwgd2hlcmUgIkZvbyAqIiBkb2Vzbid0IGltcGxlbWVudCB0aGUgWFhYIHByb3RvY29sLgorICAgIEluY29tcGF0aWJsZU9iakNRdWFsaWZpZWRJZCwKKworICAgIC8vLyBJbmNvbXBhdGlibGVPYmpDV2Vha1JlZiAtIEFzc2lnbmluZyBhIHdlYWstdW5hdmFpbGFibGUgb2JqZWN0IHRvIGFuCisgICAgLy8vIG9iamVjdCB3aXRoIF9fd2VhayBxdWFsaWZpZXIuCisgICAgSW5jb21wYXRpYmxlT2JqQ1dlYWtSZWYsCisKKyAgICAvLy8gSW5jb21wYXRpYmxlIC0gV2UgcmVqZWN0IHRoaXMgY29udmVyc2lvbiBvdXRyaWdodCwgaXQgaXMgaW52YWxpZCB0bworICAgIC8vLyByZXByZXNlbnQgaXQgaW4gdGhlIEFTVC4KKyAgICBJbmNvbXBhdGlibGUKKyAgfTsKKworICAvLy8gRGlhZ25vc2VBc3NpZ25tZW50UmVzdWx0IC0gRW1pdCBhIGRpYWdub3N0aWMsIGlmIHJlcXVpcmVkLCBmb3IgdGhlCisgIC8vLyBhc3NpZ25tZW50IGNvbnZlcnNpb24gdHlwZSBzcGVjaWZpZWQgYnkgQ29udlR5LiAgVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlCisgIC8vLyBjb252ZXJzaW9uIHdhcyBpbnZhbGlkIG9yIGZhbHNlIGlmIHRoZSBjb252ZXJzaW9uIHdhcyBhY2NlcHRlZC4KKyAgYm9vbCBEaWFnbm9zZUFzc2lnbm1lbnRSZXN1bHQoQXNzaWduQ29udmVydFR5cGUgQ29udlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIERzdFR5cGUsIFF1YWxUeXBlIFNyY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKlNyY0V4cHIsIEFzc2lnbm1lbnRBY3Rpb24gQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpDb21wbGFpbmVkID0gbnVsbHB0cik7CisKKyAgLy8vIElzVmFsdWVJbkZsYWdFbnVtIC0gRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYWxsb3dlZCBhcyBwYXJ0IG9mIGEgZmxhZworICAvLy8gZW51bS4gSWYgQWxsb3dNYXNrIGlzIHRydWUsIHRoZW4gd2UgYWxzbyBhbGxvdyB0aGUgY29tcGxlbWVudCBvZiBhIHZhbGlkCisgIC8vLyB2YWx1ZSwgdG8gYmUgdXNlZCBhcyBhIG1hc2suCisgIGJvb2wgSXNWYWx1ZUluRmxhZ0VudW0oY29uc3QgRW51bURlY2wgKkVELCBjb25zdCBsbHZtOjpBUEludCAmVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dNYXNrKSBjb25zdDsKKworICAvLy8gRGlhZ25vc2VBc3NpZ25tZW50RW51bSAtIFdhcm4gaWYgYXNzaWdubWVudCB0byBlbnVtIGlzIGEgY29uc3RhbnQKKyAgLy8vIGludGVnZXIgbm90IGluIHRoZSByYW5nZSBvZiBlbnVtIHZhbHVlcy4KKyAgdm9pZCBEaWFnbm9zZUFzc2lnbm1lbnRFbnVtKFF1YWxUeXBlIERzdFR5cGUsIFF1YWxUeXBlIFNyY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpTcmNFeHByKTsKKworICAvLy8gQ2hlY2tBc3NpZ25tZW50Q29uc3RyYWludHMgLSBQZXJmb3JtIHR5cGUgY2hlY2tpbmcgZm9yIGFzc2lnbm1lbnQsCisgIC8vLyBhcmd1bWVudCBwYXNzaW5nLCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiwgYW5kIGZ1bmN0aW9uIHJldHVybiB2YWx1ZXMuCisgIC8vLyBDOTkgNi41LjE2LgorICBBc3NpZ25Db252ZXJ0VHlwZSBDaGVja0Fzc2lnbm1lbnRDb25zdHJhaW50cyhTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIExIU1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFJIU1R5cGUpOworCisgIC8vLyBDaGVjayBhc3NpZ25tZW50IGNvbnN0cmFpbnRzIGFuZCBvcHRpb25hbGx5IHByZXBhcmUgZm9yIGEgY29udmVyc2lvbiBvZgorICAvLy8gdGhlIFJIUyB0byB0aGUgTEhTIHR5cGUuIFRoZSBjb252ZXJzaW9uIGlzIHByZXBhcmVkIGZvciBpZiBDb252ZXJ0UkhTCisgIC8vLyBpcyB0cnVlLgorICBBc3NpZ25Db252ZXJ0VHlwZSBDaGVja0Fzc2lnbm1lbnRDb25zdHJhaW50cyhRdWFsVHlwZSBMSFNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByUmVzdWx0ICZSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3RLaW5kICZLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbnZlcnRSSFMgPSB0cnVlKTsKKworICAvLy8gQ2hlY2sgYXNzaWdubWVudCBjb25zdHJhaW50cyBmb3IgYW4gYXNzaWdubWVudCBvZiBSSFMgdG8gTEhTVHlwZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTEhTVHlwZSBUaGUgZGVzdGluYXRpb24gdHlwZSBmb3IgdGhlIGFzc2lnbm1lbnQuCisgIC8vLyBccGFyYW0gUkhTIFRoZSBzb3VyY2UgZXhwcmVzc2lvbiBmb3IgdGhlIGFzc2lnbm1lbnQuCisgIC8vLyBccGFyYW0gRGlhZ25vc2UgSWYgXGMgdHJ1ZSwgZGlhZ25vc3RpY3MgbWF5IGJlIHByb2R1Y2VkIHdoZW4gY2hlY2tpbmcKKyAgLy8vICAgICAgICBmb3IgYXNzaWduYWJpbGl0eS4gSWYgYSBkaWFnbm9zdGljIGlzIHByb2R1Y2VkLCBccCBSSFMgd2lsbCBiZQorICAvLy8gICAgICAgIHNldCB0byBFeHByRXJyb3IoKS4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gbWF5IHN0aWxsIHJldHVybgorICAvLy8gICAgICAgIHdpdGhvdXQgcHJvZHVjaW5nIGEgZGlhZ25vc3RpYywgZXZlbiBmb3IgYW4gaW52YWxpZCBhc3NpZ25tZW50LgorICAvLy8gXHBhcmFtIERpYWdub3NlQ0ZBdWRpdGVkIElmIFxjIHRydWUsIHRoZSB0YXJnZXQgaXMgYSBmdW5jdGlvbiBwYXJhbWV0ZXIKKyAgLy8vICAgICAgICBpbiBhbiBhdWRpdGVkIENvcmUgRm91bmRhdGlvbiBBUEkgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgY2hlY2tlZAorICAvLy8gICAgICAgIGZvciBBUkMgcmV0YWluIGlzc3Vlcy4KKyAgLy8vIFxwYXJhbSBDb252ZXJ0UkhTIElmIFxjIHRydWUsIFxwIFJIUyB3aWxsIGJlIHVwZGF0ZWQgdG8gbW9kZWwgdGhlCisgIC8vLyAgICAgICAgY29udmVyc2lvbnMgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQuIElmIFxjIGZhbHNlLAorICAvLy8gICAgICAgIFxwIERpYWdub3NlIG11c3QgYWxzbyBiZSBcYyBmYWxzZS4KKyAgQXNzaWduQ29udmVydFR5cGUgQ2hlY2tTaW5nbGVBc3NpZ25tZW50Q29uc3RyYWludHMoCisgICAgICBRdWFsVHlwZSBMSFNUeXBlLCBFeHByUmVzdWx0ICZSSFMsIGJvb2wgRGlhZ25vc2UgPSB0cnVlLAorICAgICAgYm9vbCBEaWFnbm9zZUNGQXVkaXRlZCA9IGZhbHNlLCBib29sIENvbnZlcnRSSFMgPSB0cnVlKTsKKworICAvLyBcYnJpZWYgSWYgdGhlIGxocyB0eXBlIGlzIGEgdHJhbnNwYXJlbnQgdW5pb24sIGNoZWNrIHdoZXRoZXIgd2UKKyAgLy8gY2FuIGluaXRpYWxpemUgdGhlIHRyYW5zcGFyZW50IHVuaW9uIHdpdGggdGhlIGdpdmVuIGV4cHJlc3Npb24uCisgIEFzc2lnbkNvbnZlcnRUeXBlIENoZWNrVHJhbnNwYXJlbnRVbmlvbkFyZ3VtZW50Q29uc3RyYWludHMoUXVhbFR5cGUgQXJnVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByUmVzdWx0ICZSSFMpOworCisgIGJvb2wgSXNTdHJpbmdMaXRlcmFsVG9Ob25Db25zdFBvaW50ZXJDb252ZXJzaW9uKEV4cHIgKkZyb20sIFF1YWxUeXBlIFRvVHlwZSk7CisKKyAgYm9vbCBDaGVja0V4Y2VwdGlvblNwZWNDb21wYXRpYmlsaXR5KEV4cHIgKkZyb20sIFF1YWxUeXBlIFRvVHlwZSk7CisKKyAgRXhwclJlc3VsdCBQZXJmb3JtSW1wbGljaXRDb252ZXJzaW9uKEV4cHIgKkZyb20sIFF1YWxUeXBlIFRvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2lnbm1lbnRBY3Rpb24gQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0V4cGxpY2l0ID0gZmFsc2UpOworICBFeHByUmVzdWx0IFBlcmZvcm1JbXBsaWNpdENvbnZlcnNpb24oRXhwciAqRnJvbSwgUXVhbFR5cGUgVG9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzaWdubWVudEFjdGlvbiBBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93RXhwbGljaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXBsaWNpdENvbnZlcnNpb25TZXF1ZW5jZSYgSUNTKTsKKyAgRXhwclJlc3VsdCBQZXJmb3JtSW1wbGljaXRDb252ZXJzaW9uKEV4cHIgKkZyb20sIFF1YWxUeXBlIFRvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlJiBJQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NpZ25tZW50QWN0aW9uIEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZWRDb252ZXJzaW9uS2luZCBDQ0sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQ0NLX0ltcGxpY2l0Q29udmVyc2lvbik7CisgIEV4cHJSZXN1bHQgUGVyZm9ybUltcGxpY2l0Q29udmVyc2lvbihFeHByICpGcm9tLCBRdWFsVHlwZSBUb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGFuZGFyZENvbnZlcnNpb25TZXF1ZW5jZSYgU0NTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzaWdubWVudEFjdGlvbiBBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VkQ29udmVyc2lvbktpbmQgQ0NLKTsKKworICAvLy8gdGhlIGZvbGxvd2luZyAiQ2hlY2siIG1ldGhvZHMgd2lsbCByZXR1cm4gYSB2YWxpZC9jb252ZXJ0ZWQgUXVhbFR5cGUKKyAgLy8vIG9yIGEgbnVsbCBRdWFsVHlwZSAoaW5kaWNhdGluZyBhbiBlcnJvciBkaWFnbm9zdGljIHdhcyBpc3N1ZWQpLgorCisgIC8vLyB0eXBlIGNoZWNraW5nIGJpbmFyeSBvcGVyYXRvcnMgKHN1YnJvdXRpbmVzIG9mIENyZWF0ZUJ1aWx0aW5CaW5PcCkuCisgIFF1YWxUeXBlIEludmFsaWRPcGVyYW5kcyhTb3VyY2VMb2NhdGlvbiBMb2MsIEV4cHJSZXN1bHQgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJSZXN1bHQgJlJIUyk7CisgIFF1YWxUeXBlIEludmFsaWRMb2dpY2FsVmVjdG9yT3BlcmFuZHMoU291cmNlTG9jYXRpb24gTG9jLCBFeHByUmVzdWx0ICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByUmVzdWx0ICZSSFMpOworICBRdWFsVHlwZSBDaGVja1BvaW50ZXJUb01lbWJlck9wZXJhbmRzKCAvLyBDKysgNS41CisgICAgRXhwclJlc3VsdCAmTEhTLCBFeHByUmVzdWx0ICZSSFMsIEV4cHJWYWx1ZUtpbmQgJlZLLAorICAgIFNvdXJjZUxvY2F0aW9uIE9wTG9jLCBib29sIGlzSW5kaXJlY3QpOworICBRdWFsVHlwZSBDaGVja011bHRpcGx5RGl2aWRlT3BlcmFuZHMoIC8vIEM5OSA2LjUuNQorICAgIEV4cHJSZXN1bHQgJkxIUywgRXhwclJlc3VsdCAmUkhTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIGJvb2wgSXNDb21wQXNzaWduLAorICAgIGJvb2wgSXNEaXZpZGUpOworICBRdWFsVHlwZSBDaGVja1JlbWFpbmRlck9wZXJhbmRzKCAvLyBDOTkgNi41LjUKKyAgICBFeHByUmVzdWx0ICZMSFMsIEV4cHJSZXN1bHQgJlJIUywgU291cmNlTG9jYXRpb24gTG9jLAorICAgIGJvb2wgSXNDb21wQXNzaWduID0gZmFsc2UpOworICBRdWFsVHlwZSBDaGVja0FkZGl0aW9uT3BlcmFuZHMoIC8vIEM5OSA2LjUuNgorICAgIEV4cHJSZXN1bHQgJkxIUywgRXhwclJlc3VsdCAmUkhTLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgQmluYXJ5T3BlcmF0b3JLaW5kIE9wYywgUXVhbFR5cGUqIENvbXBMSFNUeSA9IG51bGxwdHIpOworICBRdWFsVHlwZSBDaGVja1N1YnRyYWN0aW9uT3BlcmFuZHMoIC8vIEM5OSA2LjUuNgorICAgIEV4cHJSZXN1bHQgJkxIUywgRXhwclJlc3VsdCAmUkhTLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgUXVhbFR5cGUqIENvbXBMSFNUeSA9IG51bGxwdHIpOworICBRdWFsVHlwZSBDaGVja1NoaWZ0T3BlcmFuZHMoIC8vIEM5OSA2LjUuNworICAgIEV4cHJSZXN1bHQgJkxIUywgRXhwclJlc3VsdCAmUkhTLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgQmluYXJ5T3BlcmF0b3JLaW5kIE9wYywgYm9vbCBJc0NvbXBBc3NpZ24gPSBmYWxzZSk7CisgIFF1YWxUeXBlIENoZWNrQ29tcGFyZU9wZXJhbmRzKCAvLyBDOTkgNi41LjgvOQorICAgIEV4cHJSZXN1bHQgJkxIUywgRXhwclJlc3VsdCAmUkhTLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgQmluYXJ5T3BlcmF0b3JLaW5kIE9wYywgYm9vbCBpc1JlbGF0aW9uYWwpOworICBRdWFsVHlwZSBDaGVja0JpdHdpc2VPcGVyYW5kcyggLy8gQzk5IDYuNS5bMTAuLi4xMl0KKyAgICAgIEV4cHJSZXN1bHQgJkxIUywgRXhwclJlc3VsdCAmUkhTLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICBCaW5hcnlPcGVyYXRvcktpbmQgT3BjKTsKKyAgUXVhbFR5cGUgQ2hlY2tMb2dpY2FsT3BlcmFuZHMoIC8vIEM5OSA2LjUuWzEzLDE0XQorICAgIEV4cHJSZXN1bHQgJkxIUywgRXhwclJlc3VsdCAmUkhTLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgQmluYXJ5T3BlcmF0b3JLaW5kIE9wYyk7CisgIC8vIENoZWNrQXNzaWdubWVudE9wZXJhbmRzIGlzIHVzZWQgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wb3VuZCBhc3NpZ25tZW50LgorICAvLyBGb3Igc2ltcGxlIGFzc2lnbm1lbnQsIHBhc3MgYm90aCBleHByZXNzaW9ucyBhbmQgYSBudWxsIGNvbnZlcnRlZCB0eXBlLgorICAvLyBGb3IgY29tcG91bmQgYXNzaWdubWVudCwgcGFzcyBib3RoIGV4cHJlc3Npb25zIGFuZCB0aGUgY29udmVydGVkIHR5cGUuCisgIFF1YWxUeXBlIENoZWNrQXNzaWdubWVudE9wZXJhbmRzKCAvLyBDOTkgNi41LjE2LlsxLDJdCisgICAgRXhwciAqTEhTRXhwciwgRXhwclJlc3VsdCAmUkhTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIENvbXBvdW5kVHlwZSk7CisKKyAgRXhwclJlc3VsdCBjaGVja1BzZXVkb09iamVjdEluY0RlYyhTY29wZSAqUywgU291cmNlTG9jYXRpb24gT3BMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5hcnlPcGVyYXRvcktpbmQgT3Bjb2RlLCBFeHByICpPcCk7CisgIEV4cHJSZXN1bHQgY2hlY2tQc2V1ZG9PYmplY3RBc3NpZ25tZW50KFNjb3BlICpTLCBTb3VyY2VMb2NhdGlvbiBPcExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3JLaW5kIE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqTEhTLCBFeHByICpSSFMpOworICBFeHByUmVzdWx0IGNoZWNrUHNldWRvT2JqZWN0UlZhbHVlKEV4cHIgKkUpOworICBFeHByICpyZWNyZWF0ZVN5bnRhY3RpY0Zvcm0oUHNldWRvT2JqZWN0RXhwciAqRSk7CisKKyAgUXVhbFR5cGUgQ2hlY2tDb25kaXRpb25hbE9wZXJhbmRzKCAvLyBDOTkgNi41LjE1CisgICAgRXhwclJlc3VsdCAmQ29uZCwgRXhwclJlc3VsdCAmTEhTLCBFeHByUmVzdWx0ICZSSFMsCisgICAgRXhwclZhbHVlS2luZCAmVkssIEV4cHJPYmplY3RLaW5kICZPSywgU291cmNlTG9jYXRpb24gUXVlc3Rpb25Mb2MpOworICBRdWFsVHlwZSBDWFhDaGVja0NvbmRpdGlvbmFsT3BlcmFuZHMoIC8vIEMrKyA1LjE2CisgICAgRXhwclJlc3VsdCAmY29uZCwgRXhwclJlc3VsdCAmbGhzLCBFeHByUmVzdWx0ICZyaHMsCisgICAgRXhwclZhbHVlS2luZCAmVkssIEV4cHJPYmplY3RLaW5kICZPSywgU291cmNlTG9jYXRpb24gcXVlc3Rpb25Mb2MpOworICBRdWFsVHlwZSBGaW5kQ29tcG9zaXRlUG9pbnRlclR5cGUoU291cmNlTG9jYXRpb24gTG9jLCBFeHByIComRTEsIEV4cHIgKiZFMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29udmVydEFyZ3MgPSB0cnVlKTsKKyAgUXVhbFR5cGUgRmluZENvbXBvc2l0ZVBvaW50ZXJUeXBlKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJSZXN1bHQgJkUxLCBFeHByUmVzdWx0ICZFMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29udmVydEFyZ3MgPSB0cnVlKSB7CisgICAgRXhwciAqRTFUbXAgPSBFMS5nZXQoKSwgKkUyVG1wID0gRTIuZ2V0KCk7CisgICAgUXVhbFR5cGUgQ29tcG9zaXRlID0KKyAgICAgICAgRmluZENvbXBvc2l0ZVBvaW50ZXJUeXBlKExvYywgRTFUbXAsIEUyVG1wLCBDb252ZXJ0QXJncyk7CisgICAgRTEgPSBFMVRtcDsKKyAgICBFMiA9IEUyVG1wOworICAgIHJldHVybiBDb21wb3NpdGU7CisgIH0KKworICBRdWFsVHlwZSBGaW5kQ29tcG9zaXRlT2JqQ1BvaW50ZXJUeXBlKEV4cHJSZXN1bHQgJkxIUywgRXhwclJlc3VsdCAmUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFF1ZXN0aW9uTG9jKTsKKworICBib29sIERpYWdub3NlQ29uZGl0aW9uYWxGb3JOdWxsKEV4cHIgKkxIU0V4cHIsIEV4cHIgKlJIU0V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUXVlc3Rpb25Mb2MpOworCisgIHZvaWQgRGlhZ25vc2VBbHdheXNOb25OdWxsUG9pbnRlcihFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwcjo6TnVsbFBvaW50ZXJDb25zdGFudEtpbmQgTnVsbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRXF1YWwsIFNvdXJjZVJhbmdlIFJhbmdlKTsKKworICAvLy8gdHlwZSBjaGVja2luZyBmb3IgdmVjdG9yIGJpbmFyeSBvcGVyYXRvcnMuCisgIFF1YWxUeXBlIENoZWNrVmVjdG9yT3BlcmFuZHMoRXhwclJlc3VsdCAmTEhTLCBFeHByUmVzdWx0ICZSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLCBib29sIElzQ29tcEFzc2lnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93Qm90aEJvb2wsIGJvb2wgQWxsb3dCb29sQ29udmVyc2lvbik7CisgIFF1YWxUeXBlIEdldFNpZ25lZFZlY3RvclR5cGUoUXVhbFR5cGUgVik7CisgIFF1YWxUeXBlIENoZWNrVmVjdG9yQ29tcGFyZU9wZXJhbmRzKEV4cHJSZXN1bHQgJkxIUywgRXhwclJlc3VsdCAmUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yS2luZCBPcGMpOworICBRdWFsVHlwZSBDaGVja1ZlY3RvckxvZ2ljYWxPcGVyYW5kcyhFeHByUmVzdWx0ICZMSFMsIEV4cHJSZXN1bHQgJlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKTsKKworICBib29sIGFyZUxheENvbXBhdGlibGVWZWN0b3JUeXBlcyhRdWFsVHlwZSBzcmNUeXBlLCBRdWFsVHlwZSBkZXN0VHlwZSk7CisgIGJvb2wgaXNMYXhWZWN0b3JDb252ZXJzaW9uKFF1YWxUeXBlIHNyY1R5cGUsIFF1YWxUeXBlIGRlc3RUeXBlKTsKKworICAvLy8gdHlwZSBjaGVja2luZyBkZWNsYXJhdGlvbiBpbml0aWFsaXplcnMgKEM5OSA2LjcuOCkKKyAgYm9vbCBDaGVja0ZvckNvbnN0YW50SW5pdGlhbGl6ZXIoRXhwciAqZSwgUXVhbFR5cGUgdCk7CisKKyAgLy8gdHlwZSBjaGVja2luZyBDKysgZGVjbGFyYXRpb24gaW5pdGlhbGl6ZXJzIChDKysgW2RjbC5pbml0XSkuCisKKyAgLy8vIFJlZmVyZW5jZUNvbXBhcmVSZXN1bHQgLSBFeHByZXNzZXMgdGhlIHJlc3VsdCBvZiBjb21wYXJpbmcgdHdvCisgIC8vLyB0eXBlcyAoY3YxIFQxIGFuZCBjdjIgVDIpIHRvIGRldGVybWluZSB0aGVpciBjb21wYXRpYmlsaXR5IGZvciB0aGUKKyAgLy8vIHB1cnBvc2VzIG9mIGluaXRpYWxpemF0aW9uIGJ5IHJlZmVyZW5jZSAoQysrIFtkY2wuaW5pdC5yZWZdcDQpLgorICBlbnVtIFJlZmVyZW5jZUNvbXBhcmVSZXN1bHQgeworICAgIC8vLyBSZWZfSW5jb21wYXRpYmxlIC0gVGhlIHR3byB0eXBlcyBhcmUgaW5jb21wYXRpYmxlLCBzbyBkaXJlY3QKKyAgICAvLy8gcmVmZXJlbmNlIGJpbmRpbmcgaXMgbm90IHBvc3NpYmxlLgorICAgIFJlZl9JbmNvbXBhdGlibGUgPSAwLAorICAgIC8vLyBSZWZfUmVsYXRlZCAtIFRoZSB0d28gdHlwZXMgYXJlIHJlZmVyZW5jZS1yZWxhdGVkLCB3aGljaCBtZWFucworICAgIC8vLyB0aGF0IHRoZWlyIHVucXVhbGlmaWVkIGZvcm1zIChUMSBhbmQgVDIpIGFyZSBlaXRoZXIgdGhlIHNhbWUKKyAgICAvLy8gb3IgVDEgaXMgYSBiYXNlIGNsYXNzIG9mIFQyLgorICAgIFJlZl9SZWxhdGVkLAorICAgIC8vLyBSZWZfQ29tcGF0aWJsZSAtIFRoZSB0d28gdHlwZXMgYXJlIHJlZmVyZW5jZS1jb21wYXRpYmxlLgorICAgIFJlZl9Db21wYXRpYmxlCisgIH07CisKKyAgUmVmZXJlbmNlQ29tcGFyZVJlc3VsdCBDb21wYXJlUmVmZXJlbmNlUmVsYXRpb25zaGlwKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQxLCBRdWFsVHlwZSBUMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkRlcml2ZWRUb0Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZPYmpDQ29udmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJk9iakNMaWZldGltZUNvbnZlcnNpb24pOworCisgIEV4cHJSZXN1bHQgY2hlY2tVbmtub3duQW55Q2FzdChTb3VyY2VSYW5nZSBUeXBlUmFuZ2UsIFF1YWxUeXBlIENhc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqQ2FzdEV4cHIsIENhc3RLaW5kICZDYXN0S2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJWYWx1ZUtpbmQgJlZLLCBDWFhDYXN0UGF0aCAmUGF0aCk7CisKKyAgLy8vIFxicmllZiBGb3JjZSBhbiBleHByZXNzaW9uIHdpdGggdW5rbm93bi10eXBlIHRvIGFuIGV4cHJlc3Npb24gb2YgdGhlCisgIC8vLyBnaXZlbiB0eXBlLgorICBFeHByUmVzdWx0IGZvcmNlVW5rbm93bkFueVRvVHlwZShFeHByICpFLCBRdWFsVHlwZSBUb1R5cGUpOworCisgIC8vLyBcYnJpZWYgVHlwZS1jaGVjayBhbiBleHByZXNzaW9uIHRoYXQncyBiZWluZyBwYXNzZWQgdG8gYW4KKyAgLy8vIF9fdW5rbm93bl9hbnl0eXBlIHBhcmFtZXRlci4KKyAgRXhwclJlc3VsdCBjaGVja1Vua25vd25BbnlBcmcoU291cmNlTG9jYXRpb24gY2FsbExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqcmVzdWx0LCBRdWFsVHlwZSAmcGFyYW1UeXBlKTsKKworICAvLyBDaGVja1ZlY3RvckNhc3QgLSBjaGVjayB0eXBlIGNvbnN0cmFpbnRzIGZvciB2ZWN0b3JzLgorICAvLyBTaW5jZSB2ZWN0b3JzIGFyZSBhbiBleHRlbnNpb24sIHRoZXJlIGFyZSBubyBDIHN0YW5kYXJkIHJlZmVyZW5jZSBmb3IgdGhpcy4KKyAgLy8gV2UgYWxsb3cgY2FzdGluZyBiZXR3ZWVuIHZlY3RvcnMgYW5kIGludGVnZXIgZGF0YXR5cGVzIG9mIHRoZSBzYW1lIHNpemUuCisgIC8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2FzdCBpcyBpbnZhbGlkCisgIGJvb2wgQ2hlY2tWZWN0b3JDYXN0KFNvdXJjZVJhbmdlIFIsIFF1YWxUeXBlIFZlY3RvclR5LCBRdWFsVHlwZSBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ2FzdEtpbmQgJktpbmQpOworCisgIC8vLyBcYnJpZWYgUHJlcGFyZSBgU3BsYXR0ZWRFeHByYCBmb3IgYSB2ZWN0b3Igc3BsYXQgb3BlcmF0aW9uLCBhZGRpbmcKKyAgLy8vIGltcGxpY2l0IGNhc3RzIGlmIG5lY2Vzc2FyeS4KKyAgRXhwclJlc3VsdCBwcmVwYXJlVmVjdG9yU3BsYXQoUXVhbFR5cGUgVmVjdG9yVHksIEV4cHIgKlNwbGF0dGVkRXhwcik7CisKKyAgLy8gQ2hlY2tFeHRWZWN0b3JDYXN0IC0gY2hlY2sgdHlwZSBjb25zdHJhaW50cyBmb3IgZXh0ZW5kZWQgdmVjdG9ycy4KKyAgLy8gU2luY2UgdmVjdG9ycyBhcmUgYW4gZXh0ZW5zaW9uLCB0aGVyZSBhcmUgbm8gQyBzdGFuZGFyZCByZWZlcmVuY2UgZm9yIHRoaXMuCisgIC8vIFdlIGFsbG93IGNhc3RpbmcgYmV0d2VlbiB2ZWN0b3JzIGFuZCBpbnRlZ2VyIGRhdGF0eXBlcyBvZiB0aGUgc2FtZSBzaXplLAorICAvLyBvciB2ZWN0b3JzIGFuZCB0aGUgZWxlbWVudCB0eXBlIG9mIHRoYXQgdmVjdG9yLgorICAvLyByZXR1cm5zIHRoZSBjYXN0IGV4cHIKKyAgRXhwclJlc3VsdCBDaGVja0V4dFZlY3RvckNhc3QoU291cmNlUmFuZ2UgUiwgUXVhbFR5cGUgRGVzdFR5LCBFeHByICpDYXN0RXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzdEtpbmQgJktpbmQpOworCisgIEV4cHJSZXN1bHQgQnVpbGRDWFhGdW5jdGlvbmFsQ2FzdEV4cHIoVHlwZVNvdXJjZUluZm8gKlRJbmZvLCBRdWFsVHlwZSBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpDYXN0RXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MpOworCisgIGVudW0gQVJDQ29udmVyc2lvblJlc3VsdCB7IEFDUl9va2F5LCBBQ1JfdW5icmlkZ2VkLCBBQ1JfZXJyb3IgfTsKKworICAvLy8gXGJyaWVmIENoZWNrcyBmb3IgaW52YWxpZCBjb252ZXJzaW9ucyBhbmQgY2FzdHMgYmV0d2VlbgorICAvLy8gcmV0YWluYWJsZSBwb2ludGVycyBhbmQgb3RoZXIgcG9pbnRlciBraW5kcyBmb3IgQVJDIGFuZCBXZWFrLgorICBBUkNDb252ZXJzaW9uUmVzdWx0IENoZWNrT2JqQ0NvbnZlcnNpb24oU291cmNlUmFuZ2UgY2FzdFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgY2FzdFR5cGUsIEV4cHIgKiZvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZWRDb252ZXJzaW9uS2luZCBDQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpYWdub3NlID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGlhZ25vc2VDRkF1ZGl0ZWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yS2luZCBPcGMgPSBCT19QdHJNZW1ECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgIEV4cHIgKnN0cmlwQVJDVW5icmlkZ2VkQ2FzdChFeHByICplKTsKKyAgdm9pZCBkaWFnbm9zZUFSQ1VuYnJpZGdlZENhc3QoRXhwciAqZSk7CisKKyAgYm9vbCBDaGVja09iakNBUkNVbmF2YWlsYWJsZVdlYWtDb252ZXJzaW9uKFF1YWxUeXBlIGNhc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgRXhwclR5cGUpOworCisgIC8vLyBjaGVja1JldGFpbkN5Y2xlcyAtIENoZWNrIHdoZXRoZXIgYW4gT2JqZWN0aXZlLUMgbWVzc2FnZSBzZW5kCisgIC8vLyBtaWdodCBjcmVhdGUgYW4gb2J2aW91cyByZXRhaW4gY3ljbGUuCisgIHZvaWQgY2hlY2tSZXRhaW5DeWNsZXMoT2JqQ01lc3NhZ2VFeHByICptc2cpOworICB2b2lkIGNoZWNrUmV0YWluQ3ljbGVzKEV4cHIgKnJlY2VpdmVyLCBFeHByICphcmd1bWVudCk7CisgIHZvaWQgY2hlY2tSZXRhaW5DeWNsZXMoVmFyRGVjbCAqVmFyLCBFeHByICpJbml0KTsKKworICAvLy8gY2hlY2tVbnNhZmVBc3NpZ25zIC0gQ2hlY2sgd2hldGhlciArMSBleHByIGlzIGJlaW5nIGFzc2lnbmVkCisgIC8vLyB0byB3ZWFrL19fdW5zYWZlX3VucmV0YWluZWQgdHlwZS4KKyAgYm9vbCBjaGVja1Vuc2FmZUFzc2lnbnMoU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBMSFMsIEV4cHIgKlJIUyk7CisKKyAgLy8vIGNoZWNrVW5zYWZlRXhwckFzc2lnbnMgLSBDaGVjayB3aGV0aGVyICsxIGV4cHIgaXMgYmVpbmcgYXNzaWduZWQKKyAgLy8vIHRvIHdlYWsvX191bnNhZmVfdW5yZXRhaW5lZCBleHByZXNzaW9uLgorICB2b2lkIGNoZWNrVW5zYWZlRXhwckFzc2lnbnMoU291cmNlTG9jYXRpb24gTG9jLCBFeHByICpMSFMsIEV4cHIgKlJIUyk7CisKKyAgLy8vIENoZWNrTWVzc2FnZUFyZ3VtZW50VHlwZXMgLSBDaGVjayB0eXBlcyBpbiBhbiBPYmotQyBtZXNzYWdlIHNlbmQuCisgIC8vLyBccGFyYW0gTWV0aG9kIC0gTWF5IGJlIG51bGwuCisgIC8vLyBccGFyYW0gW291dF0gUmV0dXJuVHlwZSAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgc2VuZC4KKyAgLy8vIFxyZXR1cm4gdHJ1ZSBpZmYgdGhlcmUgd2VyZSBhbnkgaW5jb21wYXRpYmxlIHR5cGVzLgorICBib29sIENoZWNrTWVzc2FnZUFyZ3VtZW50VHlwZXMoUXVhbFR5cGUgUmVjZWl2ZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlFeHByQXJnIEFyZ3MsIFNlbGVjdG9yIFNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNvdXJjZUxvY2F0aW9uPiBTZWxlY3RvckxvY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDTWV0aG9kRGVjbCAqTWV0aG9kLCBib29sIGlzQ2xhc3NNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N1cGVyTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIGxicmFjLCBTb3VyY2VMb2NhdGlvbiByYnJhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFJlY1JhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgJlJldHVyblR5cGUsIEV4cHJWYWx1ZUtpbmQgJlZLKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgcmVzdWx0IG9mIGEgbWVzc2FnZSBzZW5kIGV4cHJlc3Npb24gYmFzZWQgb24KKyAgLy8vIHRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciwgdGhlIG1ldGhvZCBleHBlY3RlZCB0byByZWNlaXZlIHRoZSBtZXNzYWdlLAorICAvLy8gYW5kIHRoZSBmb3JtIG9mIHRoZSBtZXNzYWdlIHNlbmQuCisgIFF1YWxUeXBlIGdldE1lc3NhZ2VTZW5kUmVzdWx0VHlwZShRdWFsVHlwZSBSZWNlaXZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDTWV0aG9kRGVjbCAqTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0NsYXNzTWVzc2FnZSwgYm9vbCBpc1N1cGVyTWVzc2FnZSk7CisKKyAgLy8vIFxicmllZiBJZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBpbnZvbHZlcyBhIG1lc3NhZ2Ugc2VuZCB0byBhIG1ldGhvZAorICAvLy8gd2l0aCBhIHJlbGF0ZWQgcmVzdWx0IHR5cGUsIGVtaXQgYSBub3RlIGRlc2NyaWJpbmcgd2hhdCBoYXBwZW5lZC4KKyAgdm9pZCBFbWl0UmVsYXRlZFJlc3VsdFR5cGVOb3RlKGNvbnN0IEV4cHIgKkUpOworCisgIC8vLyBcYnJpZWYgR2l2ZW4gdGhhdCB3ZSBoYWQgaW5jb21wYXRpYmxlIHBvaW50ZXIgdHlwZXMgaW4gYSByZXR1cm4KKyAgLy8vIHN0YXRlbWVudCwgY2hlY2sgd2hldGhlciB3ZSdyZSBpbiBhIG1ldGhvZCB3aXRoIGEgcmVsYXRlZCByZXN1bHQKKyAgLy8vIHR5cGUsIGFuZCBpZiBzbywgZW1pdCBhIG5vdGUgZGVzY3JpYmluZyB3aGF0IGhhcHBlbmVkLgorICB2b2lkIEVtaXRSZWxhdGVkUmVzdWx0VHlwZU5vdGVGb3JSZXR1cm4oUXVhbFR5cGUgZGVzdFR5cGUpOworCisgIGNsYXNzIENvbmRpdGlvblJlc3VsdCB7CisgICAgRGVjbCAqQ29uZGl0aW9uVmFyOworICAgIEZ1bGxFeHByQXJnIENvbmRpdGlvbjsKKyAgICBib29sIEludmFsaWQ7CisgICAgYm9vbCBIYXNLbm93blZhbHVlOworICAgIGJvb2wgS25vd25WYWx1ZTsKKworICAgIGZyaWVuZCBjbGFzcyBTZW1hOworICAgIENvbmRpdGlvblJlc3VsdChTZW1hICZTLCBEZWNsICpDb25kaXRpb25WYXIsIEZ1bGxFeHByQXJnIENvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0NvbnN0ZXhwcikKKyAgICAgICAgOiBDb25kaXRpb25WYXIoQ29uZGl0aW9uVmFyKSwgQ29uZGl0aW9uKENvbmRpdGlvbiksIEludmFsaWQoZmFsc2UpLAorICAgICAgICAgIEhhc0tub3duVmFsdWUoSXNDb25zdGV4cHIgJiYgQ29uZGl0aW9uLmdldCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhQ29uZGl0aW9uLmdldCgpLT5pc1ZhbHVlRGVwZW5kZW50KCkpLAorICAgICAgICAgIEtub3duVmFsdWUoSGFzS25vd25WYWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgISFDb25kaXRpb24uZ2V0KCktPkV2YWx1YXRlS25vd25Db25zdEludChTLkNvbnRleHQpKSB7fQorICAgIGV4cGxpY2l0IENvbmRpdGlvblJlc3VsdChib29sIEludmFsaWQpCisgICAgICAgIDogQ29uZGl0aW9uVmFyKG51bGxwdHIpLCBDb25kaXRpb24obnVsbHB0ciksIEludmFsaWQoSW52YWxpZCksCisgICAgICAgICAgSGFzS25vd25WYWx1ZShmYWxzZSksIEtub3duVmFsdWUoZmFsc2UpIHt9CisKKyAgcHVibGljOgorICAgIENvbmRpdGlvblJlc3VsdCgpIDogQ29uZGl0aW9uUmVzdWx0KGZhbHNlKSB7fQorICAgIGJvb2wgaXNJbnZhbGlkKCkgY29uc3QgeyByZXR1cm4gSW52YWxpZDsgfQorICAgIHN0ZDo6cGFpcjxWYXJEZWNsICosIEV4cHIgKj4gZ2V0KCkgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGNhc3Rfb3JfbnVsbDxWYXJEZWNsPihDb25kaXRpb25WYXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbi5nZXQoKSk7CisgICAgfQorICAgIGxsdm06Ok9wdGlvbmFsPGJvb2w+IGdldEtub3duVmFsdWUoKSBjb25zdCB7CisgICAgICBpZiAoIUhhc0tub3duVmFsdWUpCisgICAgICAgIHJldHVybiBOb25lOworICAgICAgcmV0dXJuIEtub3duVmFsdWU7CisgICAgfQorICB9OworICBzdGF0aWMgQ29uZGl0aW9uUmVzdWx0IENvbmRpdGlvbkVycm9yKCkgeyByZXR1cm4gQ29uZGl0aW9uUmVzdWx0KHRydWUpOyB9CisKKyAgZW51bSBjbGFzcyBDb25kaXRpb25LaW5kIHsKKyAgICBCb29sZWFuLCAgICAgLy8vPCBBIGJvb2xlYW4gY29uZGl0aW9uLCBmcm9tICdpZicsICd3aGlsZScsICdmb3InLCBvciAnZG8nLgorICAgIENvbnN0ZXhwcklmLCAvLy88IEEgY29uc3RhbnQgYm9vbGVhbiBjb25kaXRpb24gZnJvbSAnaWYgY29uc3RleHByJy4KKyAgICBTd2l0Y2ggICAgICAgLy8vPCBBbiBpbnRlZ3JhbCBjb25kaXRpb24gZm9yIGEgJ3N3aXRjaCcgc3RhdGVtZW50LgorICB9OworCisgIENvbmRpdGlvblJlc3VsdCBBY3RPbkNvbmRpdGlvbihTY29wZSAqUywgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqU3ViRXhwciwgQ29uZGl0aW9uS2luZCBDSyk7CisKKyAgQ29uZGl0aW9uUmVzdWx0IEFjdE9uQ29uZGl0aW9uVmFyaWFibGUoRGVjbCAqQ29uZGl0aW9uVmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdG10TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb25LaW5kIENLKTsKKworICBEZWNsUmVzdWx0IEFjdE9uQ1hYQ29uZGl0aW9uRGVjbGFyYXRpb24oU2NvcGUgKlMsIERlY2xhcmF0b3IgJkQpOworCisgIEV4cHJSZXN1bHQgQ2hlY2tDb25kaXRpb25WYXJpYWJsZShWYXJEZWNsICpDb25kaXRpb25WYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdG10TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uS2luZCBDSyk7CisgIEV4cHJSZXN1bHQgQ2hlY2tTd2l0Y2hDb25kaXRpb24oU291cmNlTG9jYXRpb24gU3dpdGNoTG9jLCBFeHByICpDb25kKTsKKworICAvLy8gQ2hlY2tCb29sZWFuQ29uZGl0aW9uIC0gRGlhZ25vc2UgcHJvYmxlbXMgaW52b2x2aW5nIHRoZSB1c2Ugb2YKKyAgLy8vIHRoZSBnaXZlbiBleHByZXNzaW9uIGFzIGEgYm9vbGVhbiBjb25kaXRpb24gKGUuZy4gaW4gYW4gaWYKKyAgLy8vIHN0YXRlbWVudCkuICBBbHNvIHBlcmZvcm1zIHRoZSBzdGFuZGFyZCBmdW5jdGlvbiBhbmQgYXJyYXkKKyAgLy8vIGRlY2F5cywgcG9zc2libHkgY2hhbmdpbmcgdGhlIGlucHV0IHZhcmlhYmxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBMb2MgLSBBIGxvY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uZGl0aW9uLCBlLmcuIHRoZQorICAvLy8gJ2lmJyBrZXl3b3JkLgorICAvLy8gXHJldHVybiB0cnVlIGlmZiB0aGVyZSB3ZXJlIGFueSBlcnJvcnMKKyAgRXhwclJlc3VsdCBDaGVja0Jvb2xlYW5Db25kaXRpb24oU291cmNlTG9jYXRpb24gTG9jLCBFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQ29uc3RleHByID0gZmFsc2UpOworCisgIC8vLyBEaWFnbm9zZUFzc2lnbm1lbnRBc0NvbmRpdGlvbiAtIEdpdmVuIHRoYXQgYW4gZXhwcmVzc2lvbiBpcworICAvLy8gYmVpbmcgdXNlZCBhcyBhIGJvb2xlYW4gY29uZGl0aW9uLCB3YXJuIGlmIGl0J3MgYW4gYXNzaWdubWVudC4KKyAgdm9pZCBEaWFnbm9zZUFzc2lnbm1lbnRBc0NvbmRpdGlvbihFeHByICpFKTsKKworICAvLy8gXGJyaWVmIFJlZHVuZGFudCBwYXJlbnRoZXNlcyBvdmVyIGFuIGVxdWFsaXR5IGNvbXBhcmlzb24gY2FuIGluZGljYXRlCisgIC8vLyB0aGF0IHRoZSB1c2VyIGludGVuZGVkIGFuIGFzc2lnbm1lbnQgdXNlZCBhcyBjb25kaXRpb24uCisgIHZvaWQgRGlhZ25vc2VFcXVhbGl0eVdpdGhFeHRyYVBhcmVucyhQYXJlbkV4cHIgKlBhcmVuRSk7CisKKyAgLy8vIENoZWNrQ1hYQm9vbGVhbkNvbmRpdGlvbiAtIFJldHVybnMgdHJ1ZSBpZiBjb252ZXJzaW9uIHRvIGJvb2wgaXMgaW52YWxpZC4KKyAgRXhwclJlc3VsdCBDaGVja0NYWEJvb2xlYW5Db25kaXRpb24oRXhwciAqQ29uZEV4cHIsIGJvb2wgSXNDb25zdGV4cHIgPSBmYWxzZSk7CisKKyAgLy8vIENvbnZlcnRJbnRlZ2VyVG9UeXBlV2Fybk9uT3ZlcmZsb3cgLSBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgQVBJbnQgdG8gaGF2ZQorICAvLy8gdGhlIHNwZWNpZmllZCB3aWR0aCBhbmQgc2lnbi4gIElmIGFuIG92ZXJmbG93IG9jY3VycywgZGV0ZWN0IGl0IGFuZCBlbWl0CisgIC8vLyB0aGUgc3BlY2lmaWVkIGRpYWdub3N0aWMuCisgIHZvaWQgQ29udmVydEludGVnZXJUb1R5cGVXYXJuT25PdmVyZmxvdyhsbHZtOjpBUFNJbnQgJk9sZFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE5ld1dpZHRoLCBib29sIE5ld1NpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsIHVuc2lnbmVkIERpYWdJRCk7CisKKyAgLy8vIENoZWNrcyB0aGF0IHRoZSBPYmplY3RpdmUtQyBkZWNsYXJhdGlvbiBpcyBkZWNsYXJlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLgorICAvLy8gRW1pdHMgYW4gZXJyb3IgYW5kIG1hcmtzIHRoZSBkZWNsYXJhdGlvbiBhcyBpbnZhbGlkIGlmIGl0J3Mgbm90IGRlY2xhcmVkCisgIC8vLyBpbiB0aGUgZ2xvYmFsIHNjb3BlLgorICBib29sIENoZWNrT2JqQ0RlY2xTY29wZShEZWNsICpEKTsKKworICAvLy8gXGJyaWVmIEFic3RyYWN0IGJhc2UgY2xhc3MgdXNlZCBmb3IgZGlhZ25vc2luZyBpbnRlZ2VyIGNvbnN0YW50CisgIC8vLyBleHByZXNzaW9uIHZpb2xhdGlvbnMuCisgIGNsYXNzIFZlcmlmeUlDRURpYWdub3NlciB7CisgIHB1YmxpYzoKKyAgICBib29sIFN1cHByZXNzOworCisgICAgVmVyaWZ5SUNFRGlhZ25vc2VyKGJvb2wgU3VwcHJlc3MgPSBmYWxzZSkgOiBTdXBwcmVzcyhTdXBwcmVzcykgeyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlhZ25vc2VOb3RJQ0UoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VSYW5nZSBTUikgPTA7CisgICAgdmlydHVhbCB2b2lkIGRpYWdub3NlRm9sZChTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZVJhbmdlIFNSKTsKKyAgICB2aXJ0dWFsIH5WZXJpZnlJQ0VEaWFnbm9zZXIoKSB7IH0KKyAgfTsKKworICAvLy8gVmVyaWZ5SW50ZWdlckNvbnN0YW50RXhwcmVzc2lvbiAtIFZlcmlmaWVzIHRoYXQgYW4gZXhwcmVzc2lvbiBpcyBhbiBJQ0UsCisgIC8vLyBhbmQgcmVwb3J0cyB0aGUgYXBwcm9wcmlhdGUgZGlhZ25vc3RpY3MuIFJldHVybnMgZmFsc2Ugb24gc3VjY2Vzcy4KKyAgLy8vIENhbiBvcHRpb25hbGx5IHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uCisgIEV4cHJSZXN1bHQgVmVyaWZ5SW50ZWdlckNvbnN0YW50RXhwcmVzc2lvbihFeHByICpFLCBsbHZtOjpBUFNJbnQgKlJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcmlmeUlDRURpYWdub3NlciAmRGlhZ25vc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0ZvbGQgPSB0cnVlKTsKKyAgRXhwclJlc3VsdCBWZXJpZnlJbnRlZ2VyQ29uc3RhbnRFeHByZXNzaW9uKEV4cHIgKkUsIGxsdm06OkFQU0ludCAqUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGlhZ0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0ZvbGQgPSB0cnVlKTsKKyAgRXhwclJlc3VsdCBWZXJpZnlJbnRlZ2VyQ29uc3RhbnRFeHByZXNzaW9uKEV4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBUFNJbnQgKlJlc3VsdCA9IG51bGxwdHIpOworCisgIC8vLyBWZXJpZnlCaXRGaWVsZCAtIHZlcmlmaWVzIHRoYXQgYSBiaXQgZmllbGQgZXhwcmVzc2lvbiBpcyBhbiBJQ0UgYW5kIGhhcworICAvLy8gdGhlIGNvcnJlY3Qgd2lkdGgsIGFuZCB0aGF0IHRoZSBmaWVsZCB0eXBlIGlzIHZhbGlkLgorICAvLy8gUmV0dXJucyBmYWxzZSBvbiBzdWNjZXNzLgorICAvLy8gQ2FuIG9wdGlvbmFsbHkgcmV0dXJuIHdoZXRoZXIgdGhlIGJpdC1maWVsZCBpcyBvZiB3aWR0aCAwCisgIEV4cHJSZXN1bHQgVmVyaWZ5Qml0RmllbGQoU291cmNlTG9jYXRpb24gRmllbGRMb2MsIElkZW50aWZpZXJJbmZvICpGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgRmllbGRUeSwgYm9vbCBJc01zU3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkJpdFdpZHRoLCBib29sICpaZXJvV2lkdGggPSBudWxscHRyKTsKKworcHJpdmF0ZToKKyAgdW5zaWduZWQgRm9yY2VDVURBSG9zdERldmljZURlcHRoID0gMDsKKworcHVibGljOgorICAvLy8gSW5jcmVtZW50cyBvdXIgY291bnQgb2YgdGhlIG51bWJlciBvZiB0aW1lcyB3ZSd2ZSBzZWVuIGEgcHJhZ21hIGZvcmNpbmcKKyAgLy8vIGZ1bmN0aW9ucyB0byBiZSBfX2hvc3RfXyBfX2RldmljZV9fLiAgU28gbG9uZyBhcyB0aGlzIGNvdW50IGlzIGdyZWF0ZXIKKyAgLy8vIHRoYW4gemVybywgYWxsIGZ1bmN0aW9ucyBlbmNvdW50ZXJlZCB3aWxsIGJlIF9faG9zdF9fIF9fZGV2aWNlX18uCisgIHZvaWQgUHVzaEZvcmNlQ1VEQUhvc3REZXZpY2UoKTsKKworICAvLy8gRGVjcmVtZW50cyBvdXIgY291bnQgb2YgdGhlIG51bWJlciBvZiB0aW1lcyB3ZSd2ZSBzZWVuIGEgcHJhZ21hIGZvcmNpbmcKKyAgLy8vIGZ1bmN0aW9ucyB0byBiZSBfX2hvc3RfXyBfX2RldmljZV9fLiAgUmV0dXJucyBmYWxzZSBpZiB0aGUgY291bnQgaXMgMAorICAvLy8gYmVmb3JlIGluY3JlbWVudGluZywgc28geW91IGNhbiBlbWl0IGFuIGVycm9yLgorICBib29sIFBvcEZvcmNlQ1VEQUhvc3REZXZpY2UoKTsKKworICAvLy8gRGlhZ25vc3RpY3MgdGhhdCBhcmUgZW1pdHRlZCBvbmx5IGlmIHdlIGRpc2NvdmVyIHRoYXQgdGhlIGdpdmVuIGZ1bmN0aW9uCisgIC8vLyBtdXN0IGJlIGNvZGVnZW4nZWQuICBCZWNhdXNlIGhhbmRsaW5nIHRoZXNlIGNvcnJlY3RseSBhZGRzIG92ZXJoZWFkIHRvCisgIC8vLyBjb21waWxhdGlvbiwgdGhpcyBpcyBjdXJyZW50bHkgb25seSBlbmFibGVkIGZvciBDVURBIGNvbXBpbGF0aW9ucy4KKyAgbGx2bTo6RGVuc2VNYXA8Q2Fub25pY2FsRGVjbFB0cjxGdW5jdGlvbkRlY2w+LAorICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJ0aWFsRGlhZ25vc3RpY0F0Pj4KKyAgICAgIENVREFEZWZlcnJlZERpYWdzOworCisgIC8vLyBBIHBhaXIgb2YgYSBjYW5vbmljYWwgRnVuY3Rpb25EZWNsIGFuZCBhIFNvdXJjZUxvY2F0aW9uLiAgV2hlbiB1c2VkIGFzIHRoZQorICAvLy8ga2V5IGluIGEgaGFzaHRhYmxlLCBib3RoIHRoZSBGRCBhbmQgbG9jYXRpb24gYXJlIGhhc2hlZC4KKyAgc3RydWN0IEZ1bmN0aW9uRGVjbEFuZExvYyB7CisgICAgQ2Fub25pY2FsRGVjbFB0cjxGdW5jdGlvbkRlY2w+IEZEOworICAgIFNvdXJjZUxvY2F0aW9uIExvYzsKKyAgfTsKKworICAvLy8gRnVuY3Rpb25EZWNscyBhbmQgU291cmNlTG9jYXRpb25zIGZvciB3aGljaCBDaGVja0NVREFDYWxsIGhhcyBlbWl0dGVkIGEKKyAgLy8vIChtYXliZSBkZWZlcnJlZCkgImJhZCBjYWxsIiBkaWFnbm9zdGljLiAgV2UgdXNlIHRoaXMgdG8gYXZvaWQgZW1pdHRpbmcgdGhlCisgIC8vLyBzYW1lIGRlZmVycmVkIGRpYWcgdHdpY2UuCisgIGxsdm06OkRlbnNlU2V0PEZ1bmN0aW9uRGVjbEFuZExvYz4gTG9jc1dpdGhDVURBQ2FsbERpYWdzOworCisgIC8vLyBBbiBpbnZlcnNlIGNhbGwgZ3JhcGgsIG1hcHBpbmcga25vd24tZW1pdHRlZCBmdW5jdGlvbnMgdG8gb25lIG9mIHRoZWlyCisgIC8vLyBrbm93bi1lbWl0dGVkIGNhbGxlcnMgKHBsdXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjYWxsKS4KKyAgLy8vCisgIC8vLyBGdW5jdGlvbnMgdGhhdCB3ZSBjYW4gdGVsbCBhIHByaW9yaSBtdXN0IGJlIGVtaXR0ZWQgYXJlbid0IGFkZGVkIHRvIHRoaXMKKyAgLy8vIG1hcC4KKyAgbGx2bTo6RGVuc2VNYXA8LyogQ2FsbGVlID0gKi8gQ2Fub25pY2FsRGVjbFB0cjxGdW5jdGlvbkRlY2w+LAorICAgICAgICAgICAgICAgICAvKiBDYWxsZXIgPSAqLyBGdW5jdGlvbkRlY2xBbmRMb2M+CisgICAgICBDVURBS25vd25FbWl0dGVkRm5zOworCisgIC8vLyBBIHBhcnRpYWwgY2FsbCBncmFwaCBtYWludGFpbmVkIGR1cmluZyBDVURBIGNvbXBpbGF0aW9uIHRvIHN1cHBvcnQKKyAgLy8vIGRlZmVycmVkIGRpYWdub3N0aWNzLgorICAvLy8KKyAgLy8vIEZ1bmN0aW9ucyBhcmUgb25seSBhZGRlZCBoZXJlIGlmLCBhdCB0aGUgdGltZSB0aGV5J3JlIGNvbnNpZGVyZWQsIHRoZXkgYXJlCisgIC8vLyBub3Qga25vd24tZW1pdHRlZC4gIEFzIHNvb24gYXMgd2UgZGlzY292ZXIgdGhhdCBhIGZ1bmN0aW9uIGlzCisgIC8vLyBrbm93bi1lbWl0dGVkLCB3ZSByZW1vdmUgaXQgYW5kIGV2ZXJ5dGhpbmcgaXQgdHJhbnNpdGl2ZWx5IGNhbGxzIGZyb20gdGhpcworICAvLy8gc2V0IGFuZCBhZGQgdGhvc2UgZnVuY3Rpb25zIHRvIENVREFLbm93bkVtaXR0ZWRGbnMuCisgIGxsdm06OkRlbnNlTWFwPC8qIENhbGxlciA9ICovIENhbm9uaWNhbERlY2xQdHI8RnVuY3Rpb25EZWNsPiwKKyAgICAgICAgICAgICAgICAgLyogQ2FsbGVlcyA9ICovIGxsdm06Ok1hcFZlY3RvcjxDYW5vbmljYWxEZWNsUHRyPEZ1bmN0aW9uRGVjbD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24+PgorICAgICAgQ1VEQUNhbGxHcmFwaDsKKworICAvLy8gRGlhZ25vc3RpYyBidWlsZGVyIGZvciBDVURBIGVycm9ycyB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBkZWZlcnJlZC4KKyAgLy8vCisgIC8vLyBJbiBDVURBLCB0aGVyZSBleGlzdCBjb25zdHJ1Y3RzIChlLmcuIHZhcmlhYmxlLWxlbmd0aCBhcnJheXMsIHRyeS9jYXRjaCkKKyAgLy8vIHdoaWNoIGFyZSBub3QgYWxsb3dlZCB0byBhcHBlYXIgaW5zaWRlIF9fZGV2aWNlX18gZnVuY3Rpb25zIGFuZCBhcmUKKyAgLy8vIGFsbG93ZWQgdG8gYXBwZWFyIGluIF9faG9zdF9fIF9fZGV2aWNlX18gZnVuY3Rpb25zIG9ubHkgaWYgdGhlIGhvc3QrZGV2aWNlCisgIC8vLyBmdW5jdGlvbiBpcyBuZXZlciBjb2RlZ2VuJ2VkLgorICAvLy8KKyAgLy8vIFRvIGhhbmRsZSB0aGlzLCB3ZSB1c2UgdGhlIG5vdGlvbiBvZiAiZGVmZXJyZWQgZGlhZ25vc3RpY3MiLCB3aGVyZSB3ZQorICAvLy8gYXR0YWNoIGEgZGlhZ25vc3RpYyB0byBhIEZ1bmN0aW9uRGVjbCB0aGF0J3MgZW1pdHRlZCBpZmYgaXQncyBjb2RlZ2VuJ2VkLgorICAvLy8KKyAgLy8vIFRoaXMgY2xhc3MgbGV0cyB5b3UgZW1pdCBlaXRoZXIgYSByZWd1bGFyIGRpYWdub3N0aWMsIGEgZGVmZXJyZWQKKyAgLy8vIGRpYWdub3N0aWMsIG9yIG5vIGRpYWdub3N0aWMgYXQgYWxsLCBhY2NvcmRpbmcgdG8gYW4gYXJndW1lbnQgeW91IHBhc3MgdG8KKyAgLy8vIGl0cyBjb25zdHJ1Y3RvciwgdGh1cyBzaW1wbGlmeWluZyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyB0aGVzZSAibWF5YmUKKyAgLy8vIGRlZmVycmVkIiBkaWFnbm9zdGljcy4KKyAgY2xhc3MgQ1VEQURpYWdCdWlsZGVyIHsKKyAgcHVibGljOgorICAgIGVudW0gS2luZCB7CisgICAgICAvLy8gRW1pdCBubyBkaWFnbm9zdGljcy4KKyAgICAgIEtfTm9wLAorICAgICAgLy8vIEVtaXQgdGhlIGRpYWdub3N0aWMgaW1tZWRpYXRlbHkgKGkuZS4sIGJlaGF2ZSBsaWtlIFNlbWE6OkRpYWcoKSkuCisgICAgICBLX0ltbWVkaWF0ZSwKKyAgICAgIC8vLyBFbWl0IHRoZSBkaWFnbm9zdGljIGltbWVkaWF0ZWx5LCBhbmQsIGlmIGl0J3MgYSB3YXJuaW5nIG9yIGVycm9yLCBhbHNvCisgICAgICAvLy8gZW1pdCBhIGNhbGwgc3RhY2sgc2hvd2luZyBob3cgdGhpcyBmdW5jdGlvbiBjYW4gYmUgcmVhY2hlZCBieSBhbiBhCisgICAgICAvLy8gcHJpb3JpIGtub3duLWVtaXR0ZWQgZnVuY3Rpb24uCisgICAgICBLX0ltbWVkaWF0ZVdpdGhDYWxsU3RhY2ssCisgICAgICAvLy8gQ3JlYXRlIGEgZGVmZXJyZWQgZGlhZ25vc3RpYywgd2hpY2ggaXMgZW1pdHRlZCBvbmx5IGlmIHRoZSBmdW5jdGlvbgorICAgICAgLy8vIGl0J3MgYXR0YWNoZWQgdG8gaXMgY29kZWdlbidlZC4gIEFsc28gZW1pdCBhIGNhbGwgc3RhY2sgYXMgd2l0aAorICAgICAgLy8vIEtfSW1tZWRpYXRlV2l0aENhbGxTdGFjay4KKyAgICAgIEtfRGVmZXJyZWQKKyAgICB9OworCisgICAgQ1VEQURpYWdCdWlsZGVyKEtpbmQgSywgU291cmNlTG9jYXRpb24gTG9jLCB1bnNpZ25lZCBEaWFnSUQsCisgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uRGVjbCAqRm4sIFNlbWEgJlMpOworICAgIH5DVURBRGlhZ0J1aWxkZXIoKTsKKworICAgIC8vLyBDb252ZXJ0aWJsZSB0byBib29sOiBUcnVlIGlmIHdlIGltbWVkaWF0ZWx5IGVtaXR0ZWQgYW4gZXJyb3IsIGZhbHNlIGlmCisgICAgLy8vIHdlIGRpZG4ndCBlbWl0IGFuIGVycm9yIG9yIHdlIGNyZWF0ZWQgYSBkZWZlcnJlZCBlcnJvci4KKyAgICAvLy8KKyAgICAvLy8gRXhhbXBsZSB1c2FnZToKKyAgICAvLy8KKyAgICAvLy8gICBpZiAoQ1VEQURpYWdCdWlsZGVyKC4uLikgPDwgZm9vIDw8IGJhcikKKyAgICAvLy8gICAgIHJldHVybiBFeHByRXJyb3IoKTsKKyAgICAvLy8KKyAgICAvLy8gQnV0IHNlZSBDVURBRGlhZ0lmRGV2aWNlQ29kZSgpIGFuZCBDVURBRGlhZ0lmSG9zdENvZGUoKSAtLSB5b3UgcHJvYmFibHkKKyAgICAvLy8gd2FudCB0byB1c2UgdGhlc2UgaW5zdGVhZCBvZiBjcmVhdGluZyBhIENVREFEaWFnQnVpbGRlciB5b3Vyc2VsZi4KKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gSW1tZWRpYXRlRGlhZy5oYXNWYWx1ZSgpOyB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBmcmllbmQgY29uc3QgQ1VEQURpYWdCdWlsZGVyICZvcGVyYXRvcjw8KGNvbnN0IENVREFEaWFnQnVpbGRlciAmRGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQgJlZhbHVlKSB7CisgICAgICBpZiAoRGlhZy5JbW1lZGlhdGVEaWFnLmhhc1ZhbHVlKCkpCisgICAgICAgICpEaWFnLkltbWVkaWF0ZURpYWcgPDwgVmFsdWU7CisgICAgICBlbHNlIGlmIChEaWFnLlBhcnRpYWxEaWFnLmhhc1ZhbHVlKCkpCisgICAgICAgICpEaWFnLlBhcnRpYWxEaWFnIDw8IFZhbHVlOworICAgICAgcmV0dXJuIERpYWc7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgU2VtYSAmUzsKKyAgICBTb3VyY2VMb2NhdGlvbiBMb2M7CisgICAgdW5zaWduZWQgRGlhZ0lEOworICAgIEZ1bmN0aW9uRGVjbCAqRm47CisgICAgYm9vbCBTaG93Q2FsbFN0YWNrOworCisgICAgLy8gSW52YXJpYW50OiBBdCBtb3N0IG9uZSBvZiB0aGVzZSBPcHRpb25hbHMgaGFzIGEgdmFsdWUuCisgICAgLy8gRklYTUU6IFN3aXRjaCB0aGVzZSB0byBhIFZhcmlhbnQgb25jZSB0aGF0IGV4aXN0cy4KKyAgICBsbHZtOjpPcHRpb25hbDxTZW1hRGlhZ25vc3RpY0J1aWxkZXI+IEltbWVkaWF0ZURpYWc7CisgICAgbGx2bTo6T3B0aW9uYWw8UGFydGlhbERpYWdub3N0aWM+IFBhcnRpYWxEaWFnOworICB9OworCisgIC8vLyBDcmVhdGVzIGEgQ1VEQURpYWdCdWlsZGVyIHRoYXQgZW1pdHMgdGhlIGRpYWdub3N0aWMgaWYgdGhlIGN1cnJlbnQgY29udGV4dAorICAvLy8gaXMgInVzZWQgYXMgZGV2aWNlIGNvZGUiLgorICAvLy8KKyAgLy8vIC0gSWYgQ3VyQ29udGV4dCBpcyBhIF9faG9zdF9fIGZ1bmN0aW9uLCBkb2VzIG5vdCBlbWl0IGFueSBkaWFnbm9zdGljcy4KKyAgLy8vIC0gSWYgQ3VyQ29udGV4dCBpcyBhIF9fZGV2aWNlX18gb3IgX19nbG9iYWxfXyBmdW5jdGlvbiwgZW1pdHMgdGhlCisgIC8vLyAgIGRpYWdub3N0aWNzIGltbWVkaWF0ZWx5LgorICAvLy8gLSBJZiBDdXJDb250ZXh0IGlzIGEgX19ob3N0X18gX19kZXZpY2VfXyBmdW5jdGlvbiBhbmQgd2UgYXJlIGNvbXBpbGluZyBmb3IKKyAgLy8vICAgdGhlIGRldmljZSwgY3JlYXRlcyBhIGRpYWdub3N0aWMgd2hpY2ggaXMgZW1pdHRlZCBpZiBhbmQgd2hlbiB3ZSByZWFsaXplCisgIC8vLyAgIHRoYXQgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgY29kZWdlbidlZC4KKyAgLy8vCisgIC8vLyBFeGFtcGxlIHVzYWdlOgorICAvLy8KKyAgLy8vICAvLyBWYXJpYWJsZS1sZW5ndGggYXJyYXlzIGFyZSBub3QgYWxsb3dlZCBpbiBDVURBIGRldmljZSBjb2RlLgorICAvLy8gIGlmIChDVURBRGlhZ0lmRGV2aWNlQ29kZShMb2MsIGRpYWc6OmVycl9jdWRhX3ZsYSkgPDwgQ3VycmVudENVREFUYXJnZXQoKSkKKyAgLy8vICAgIHJldHVybiBFeHByRXJyb3IoKTsKKyAgLy8vICAvLyBPdGhlcndpc2UsIGNvbnRpbnVlIHBhcnNpbmcgYXMgbm9ybWFsLgorICBDVURBRGlhZ0J1aWxkZXIgQ1VEQURpYWdJZkRldmljZUNvZGUoU291cmNlTG9jYXRpb24gTG9jLCB1bnNpZ25lZCBEaWFnSUQpOworCisgIC8vLyBDcmVhdGVzIGEgQ1VEQURpYWdCdWlsZGVyIHRoYXQgZW1pdHMgdGhlIGRpYWdub3N0aWMgaWYgdGhlIGN1cnJlbnQgY29udGV4dAorICAvLy8gaXMgInVzZWQgYXMgaG9zdCBjb2RlIi4KKyAgLy8vCisgIC8vLyBTYW1lIGFzIENVREFEaWFnSWZEZXZpY2VDb2RlLCB3aXRoICJob3N0IiBhbmQgImRldmljZSIgc3dpdGNoZWQuCisgIENVREFEaWFnQnVpbGRlciBDVURBRGlhZ0lmSG9zdENvZGUoU291cmNlTG9jYXRpb24gTG9jLCB1bnNpZ25lZCBEaWFnSUQpOworCisgIGVudW0gQ1VEQUZ1bmN0aW9uVGFyZ2V0IHsKKyAgICBDRlRfRGV2aWNlLAorICAgIENGVF9HbG9iYWwsCisgICAgQ0ZUX0hvc3QsCisgICAgQ0ZUX0hvc3REZXZpY2UsCisgICAgQ0ZUX0ludmFsaWRUYXJnZXQKKyAgfTsKKworICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBhIENVREEgZGV2aWNlL2hvc3Qva2VybmVsL2V0Yy4KKyAgLy8vIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFVzZSB0aGlzIHJhdGhlciB0aGFuIGV4YW1pbmluZyB0aGUgZnVuY3Rpb24ncyBhdHRyaWJ1dGVzIHlvdXJzZWxmIC0tIHlvdQorICAvLy8gd2lsbCBnZXQgaXQgd3JvbmcuICBSZXR1cm5zIENGVF9Ib3N0IGlmIEQgaXMgbnVsbC4KKyAgQ1VEQUZ1bmN0aW9uVGFyZ2V0IElkZW50aWZ5Q1VEQVRhcmdldChjb25zdCBGdW5jdGlvbkRlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJZ25vcmVJbXBsaWNpdEhEQXR0ciA9IGZhbHNlKTsKKyAgQ1VEQUZ1bmN0aW9uVGFyZ2V0IElkZW50aWZ5Q1VEQVRhcmdldChjb25zdCBBdHRyaWJ1dGVMaXN0ICpBdHRyKTsKKworICAvLy8gR2V0cyB0aGUgQ1VEQSB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQuCisgIENVREFGdW5jdGlvblRhcmdldCBDdXJyZW50Q1VEQVRhcmdldCgpIHsKKyAgICByZXR1cm4gSWRlbnRpZnlDVURBVGFyZ2V0KGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oQ3VyQ29udGV4dCkpOworICB9CisKKyAgLy8gQ1VEQSBmdW5jdGlvbiBjYWxsIHByZWZlcmVuY2UuIE11c3QgYmUgb3JkZXJlZCBudW1lcmljYWxseSBmcm9tCisgIC8vIHdvcnN0IHRvIGJlc3QuCisgIGVudW0gQ1VEQUZ1bmN0aW9uUHJlZmVyZW5jZSB7CisgICAgQ0ZQX05ldmVyLCAgICAgIC8vIEludmFsaWQgY2FsbGVyL2NhbGxlZSBjb21iaW5hdGlvbi4KKyAgICBDRlBfV3JvbmdTaWRlLCAgLy8gQ2FsbHMgZnJvbSBob3N0LWRldmljZSB0byBob3N0IG9yIGRldmljZQorICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiB0aGF0IGRvIG5vdCBtYXRjaCBjdXJyZW50IGNvbXBpbGF0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vIG1vZGUuCisgICAgQ0ZQX0hvc3REZXZpY2UsIC8vIEFueSBjYWxscyB0byBob3N0L2RldmljZSBmdW5jdGlvbnMuCisgICAgQ0ZQX1NhbWVTaWRlLCAgIC8vIENhbGxzIGZyb20gaG9zdC1kZXZpY2UgdG8gaG9zdCBvciBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gbWF0Y2hpbmcgY3VycmVudCBjb21waWxhdGlvbiBtb2RlLgorICAgIENGUF9OYXRpdmUsICAgICAvLyBob3N0LXRvLWhvc3Qgb3IgZGV2aWNlLXRvLWRldmljZSBjYWxscy4KKyAgfTsKKworICAvLy8gSWRlbnRpZmllcyByZWxhdGl2ZSBwcmVmZXJlbmNlIG9mIGEgZ2l2ZW4gQ2FsbGVyL0NhbGxlZQorICAvLy8gY29tYmluYXRpb24sIGJhc2VkIG9uIHRoZWlyIGhvc3QvZGV2aWNlIGF0dHJpYnV0ZXMuCisgIC8vLyBccGFyYW0gQ2FsbGVyIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIGFkZHJlc3Mgb2YgXHAgQ2FsbGVlLgorICAvLy8gICAgICAgICAgICAgICBudWxscHRyIGluIGNhc2Ugb2YgZ2xvYmFsIGNvbnRleHQuCisgIC8vLyBccGFyYW0gQ2FsbGVlIHRhcmdldCBmdW5jdGlvbgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHByZWZlcmVuY2UgdmFsdWUgZm9yIHBhcnRpY3VsYXIgQ2FsbGVyL0NhbGxlZSBjb21iaW5hdGlvbi4KKyAgQ1VEQUZ1bmN0aW9uUHJlZmVyZW5jZSBJZGVudGlmeUNVREFQcmVmZXJlbmNlKGNvbnN0IEZ1bmN0aW9uRGVjbCAqQ2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpDYWxsZWUpOworCisgIC8vLyBEZXRlcm1pbmVzIHdoZXRoZXIgQ2FsbGVyIG1heSBpbnZva2UgQ2FsbGVlLCBiYXNlZCBvbiB0aGVpciBDVURBCisgIC8vLyBob3N0L2RldmljZSBhdHRyaWJ1dGVzLiAgUmV0dXJucyBmYWxzZSBpZiB0aGUgY2FsbCBpcyBub3QgYWxsb3dlZC4KKyAgLy8vCisgIC8vLyBOb3RlOiBXaWxsIHJldHVybiB0cnVlIGZvciBDRlBfV3JvbmdTaWRlIGNhbGxzLiAgVGhlc2UgbWF5IGFwcGVhciBpbgorICAvLy8gc2VtYW50aWNhbGx5IGNvcnJlY3QgQ1VEQSBwcm9ncmFtcywgYnV0IG9ubHkgaWYgdGhleSdyZSBuZXZlciBjb2RlZ2VuJ2VkLgorICBib29sIElzQWxsb3dlZENVREFDYWxsKGNvbnN0IEZ1bmN0aW9uRGVjbCAqQ2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqQ2FsbGVlKSB7CisgICAgcmV0dXJuIElkZW50aWZ5Q1VEQVByZWZlcmVuY2UoQ2FsbGVyLCBDYWxsZWUpICE9IENGUF9OZXZlcjsKKyAgfQorCisgIC8vLyBNYXkgYWRkIGltcGxpY2l0IENVREFIb3N0QXR0ciBhbmQgQ1VEQURldmljZUF0dHIgYXR0cmlidXRlcyB0byBGRCwKKyAgLy8vIGRlcGVuZGluZyBvbiBGRCBhbmQgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gc2V0dGluZ3MuCisgIHZvaWQgbWF5YmVBZGRDVURBSG9zdERldmljZUF0dHJzKEZ1bmN0aW9uRGVjbCAqRkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb2t1cFJlc3VsdCAmUHJldmlvdXMpOworCitwdWJsaWM6CisgIC8vLyBDaGVjayB3aGV0aGVyIHdlJ3JlIGFsbG93ZWQgdG8gY2FsbCBDYWxsZWUgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0LgorICAvLy8KKyAgLy8vIC0gSWYgdGhlIGNhbGwgaXMgbmV2ZXIgYWxsb3dlZCBpbiBhIHNlbWFudGljYWxseS1jb3JyZWN0IHByb2dyYW0KKyAgLy8vICAgKENGUF9OZXZlciksIGVtaXRzIGFuIGVycm9yIGFuZCByZXR1cm5zIGZhbHNlLgorICAvLy8KKyAgLy8vIC0gSWYgdGhlIGNhbGwgaXMgYWxsb3dlZCBpbiBzZW1hbnRpY2FsbHktY29ycmVjdCBwcm9ncmFtcywgYnV0IG9ubHkgaWYKKyAgLy8vICAgaXQncyBuZXZlciBjb2RlZ2VuJ2VkIChDRlBfV3JvbmdTaWRlKSwgY3JlYXRlcyBhIGRlZmVycmVkIGRpYWdub3N0aWMgdG8KKyAgLy8vICAgYmUgZW1pdHRlZCBpZiBhbmQgd2hlbiB0aGUgY2FsbGVyIGlzIGNvZGVnZW4nZWQsIGFuZCByZXR1cm5zIHRydWUuCisgIC8vLworICAvLy8gICBXaWxsIG9ubHkgY3JlYXRlIGRlZmVycmVkIGRpYWdub3N0aWNzIGZvciBhIGdpdmVuIFNvdXJjZUxvY2F0aW9uIG9uY2UsCisgIC8vLyAgIHNvIHlvdSBjYW4gc2FmZWx5IGNhbGwgdGhpcyBtdWx0aXBsZSB0aW1lcyB3aXRob3V0IGdlbmVyYXRpbmcgZHVwbGljYXRlCisgIC8vLyAgIGRlZmVycmVkIGVycm9ycy4KKyAgLy8vCisgIC8vLyAtIE90aGVyd2lzZSwgcmV0dXJucyB0cnVlIHdpdGhvdXQgZW1pdHRpbmcgYW55IGRpYWdub3N0aWNzLgorICBib29sIENoZWNrQ1VEQUNhbGwoU291cmNlTG9jYXRpb24gTG9jLCBGdW5jdGlvbkRlY2wgKkNhbGxlZSk7CisKKyAgLy8vIFNldCBfX2RldmljZV9fIG9yIF9faG9zdF9fIF9fZGV2aWNlX18gYXR0cmlidXRlcyBvbiB0aGUgZ2l2ZW4gbGFtYmRhCisgIC8vLyBvcGVyYXRvcigpIG1ldGhvZC4KKyAgLy8vCisgIC8vLyBDVURBIGxhbWJkYXMgZGVjbGFyZWQgaW5zaWRlIF9fZGV2aWNlX18gb3IgX19nbG9iYWxfXyBmdW5jdGlvbnMgaW5oZXJpdAorICAvLy8gdGhlIF9fZGV2aWNlX18gYXR0cmlidXRlLiAgU2ltaWxhcmx5LCBsYW1iZGFzIGluc2lkZSBfX2hvc3RfXyBfX2RldmljZV9fCisgIC8vLyBmdW5jdGlvbnMgYmVjb21lIF9faG9zdF9fIF9fZGV2aWNlX18gdGhlbXNlbHZlcy4KKyAgdm9pZCBDVURBU2V0TGFtYmRhQXR0cnMoQ1hYTWV0aG9kRGVjbCAqTWV0aG9kKTsKKworICAvLy8gRmluZHMgYSBmdW5jdGlvbiBpbiBccCBNYXRjaGVzIHdpdGggaGlnaGVzdCBjYWxsaW5nIHByaW9yaXR5CisgIC8vLyBmcm9tIFxwIENhbGxlciBjb250ZXh0IGFuZCBlcmFzZXMgYWxsIGZ1bmN0aW9ucyB3aXRoIGxvd2VyCisgIC8vLyBjYWxsaW5nIHByaW9yaXR5LgorICB2b2lkIEVyYXNlVW53YW50ZWRDVURBTWF0Y2hlcygKKyAgICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqQ2FsbGVyLAorICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxEZWNsQWNjZXNzUGFpciwgRnVuY3Rpb25EZWNsICo+PiAmTWF0Y2hlcyk7CisKKyAgLy8vIEdpdmVuIGEgaW1wbGljaXQgc3BlY2lhbCBtZW1iZXIsIGluZmVyIGl0cyBDVURBIHRhcmdldCBmcm9tIHRoZQorICAvLy8gY2FsbHMgaXQgbmVlZHMgdG8gbWFrZSB0byB1bmRlcmx5aW5nIGJhc2UvZmllbGQgc3BlY2lhbCBtZW1iZXJzLgorICAvLy8gXHBhcmFtIENsYXNzRGVjbCB0aGUgY2xhc3MgZm9yIHdoaWNoIHRoZSBtZW1iZXIgaXMgYmVpbmcgY3JlYXRlZC4KKyAgLy8vIFxwYXJhbSBDU00gdGhlIGtpbmQgb2Ygc3BlY2lhbCBtZW1iZXIuCisgIC8vLyBccGFyYW0gTWVtYmVyRGVjbCB0aGUgc3BlY2lhbCBtZW1iZXIgaXRzZWxmLgorICAvLy8gXHBhcmFtIENvbnN0UkhTIHRydWUgaWYgdGhpcyBpcyBhIGNvcHkgb3BlcmF0aW9uIHdpdGggYSBjb25zdCBvYmplY3Qgb24KKyAgLy8vICAgICAgICBpdHMgUkhTLgorICAvLy8gXHBhcmFtIERpYWdub3NlIHRydWUgaWYgdGhpcyBjYWxsIHNob3VsZCBlbWl0IGRpYWdub3N0aWNzLgorICAvLy8gXHJldHVybiB0cnVlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbmZlcnJpbmcuCisgIC8vLyBUaGUgcmVzdWx0IG9mIHRoaXMgY2FsbCBpcyBpbXBsaWNpdCBDVURBIHRhcmdldCBhdHRyaWJ1dGUocykgYXR0YWNoZWQgdG8KKyAgLy8vIHRoZSBtZW1iZXIgZGVjbGFyYXRpb24uCisgIGJvb2wgaW5mZXJDVURBVGFyZ2V0Rm9ySW1wbGljaXRTcGVjaWFsTWVtYmVyKENYWFJlY29yZERlY2wgKkNsYXNzRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYU3BlY2lhbE1lbWJlciBDU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWE1ldGhvZERlY2wgKk1lbWJlckRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29uc3RSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGlhZ25vc2UpOworCisgIC8vLyBccmV0dXJuIHRydWUgaWYgXHAgQ0QgY2FuIGJlIGNvbnNpZGVyZWQgZW1wdHkgYWNjb3JkaW5nIHRvIENVREEKKyAgLy8vIChFLjIuMy4xIGluIENVREEgNy41IFByb2dyYW1taW5nIGd1aWRlKS4KKyAgYm9vbCBpc0VtcHR5Q3VkYUNvbnN0cnVjdG9yKFNvdXJjZUxvY2F0aW9uIExvYywgQ1hYQ29uc3RydWN0b3JEZWNsICpDRCk7CisgIGJvb2wgaXNFbXB0eUN1ZGFEZXN0cnVjdG9yKFNvdXJjZUxvY2F0aW9uIExvYywgQ1hYRGVzdHJ1Y3RvckRlY2wgKkNEKTsKKworICAvLy8gQ2hlY2sgd2hldGhlciBOZXdGRCBpcyBhIHZhbGlkIG92ZXJsb2FkIGZvciBDVURBLiBFbWl0cworICAvLy8gZGlhZ25vc3RpY3MgYW5kIGludmFsaWRhdGVzIE5ld0ZEIGlmIG5vdC4KKyAgdm9pZCBjaGVja0NVREFUYXJnZXRPdmVybG9hZChGdW5jdGlvbkRlY2wgKk5ld0ZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb2t1cFJlc3VsdCAmUHJldmlvdXMpOworICAvLy8gQ29waWVzIHRhcmdldCBhdHRyaWJ1dGVzIGZyb20gdGhlIHRlbXBsYXRlIFREIHRvIHRoZSBmdW5jdGlvbiBGRC4KKyAgdm9pZCBpbmhlcml0Q1VEQVRhcmdldEF0dHJzKEZ1bmN0aW9uRGVjbCAqRkQsIGNvbnN0IEZ1bmN0aW9uVGVtcGxhdGVEZWNsICZURCk7CisKKyAgLy8vIFxuYW1lIENvZGUgY29tcGxldGlvbgorICAvL0B7CisgIC8vLyBcYnJpZWYgRGVzY3JpYmVzIHRoZSBjb250ZXh0IGluIHdoaWNoIGNvZGUgY29tcGxldGlvbiBvY2N1cnMuCisgIGVudW0gUGFyc2VyQ29tcGxldGlvbkNvbnRleHQgeworICAgIC8vLyBcYnJpZWYgQ29kZSBjb21wbGV0aW9uIG9jY3VycyBhdCB0b3AtbGV2ZWwgb3IgbmFtZXNwYWNlIGNvbnRleHQuCisgICAgUENDX05hbWVzcGFjZSwKKyAgICAvLy8gXGJyaWVmIENvZGUgY29tcGxldGlvbiBvY2N1cnMgd2l0aGluIGEgY2xhc3MsIHN0cnVjdCwgb3IgdW5pb24uCisgICAgUENDX0NsYXNzLAorICAgIC8vLyBcYnJpZWYgQ29kZSBjb21wbGV0aW9uIG9jY3VycyB3aXRoaW4gYW4gT2JqZWN0aXZlLUMgaW50ZXJmYWNlLCBwcm90b2NvbCwKKyAgICAvLy8gb3IgY2F0ZWdvcnkuCisgICAgUENDX09iakNJbnRlcmZhY2UsCisgICAgLy8vIFxicmllZiBDb2RlIGNvbXBsZXRpb24gb2NjdXJzIHdpdGhpbiBhbiBPYmplY3RpdmUtQyBpbXBsZW1lbnRhdGlvbiBvcgorICAgIC8vLyBjYXRlZ29yeSBpbXBsZW1lbnRhdGlvbgorICAgIFBDQ19PYmpDSW1wbGVtZW50YXRpb24sCisgICAgLy8vIFxicmllZiBDb2RlIGNvbXBsZXRpb24gb2NjdXJzIHdpdGhpbiB0aGUgbGlzdCBvZiBpbnN0YW5jZSB2YXJpYWJsZXMKKyAgICAvLy8gaW4gYW4gT2JqZWN0aXZlLUMgaW50ZXJmYWNlLCBwcm90b2NvbCwgY2F0ZWdvcnksIG9yIGltcGxlbWVudGF0aW9uLgorICAgIFBDQ19PYmpDSW5zdGFuY2VWYXJpYWJsZUxpc3QsCisgICAgLy8vIFxicmllZiBDb2RlIGNvbXBsZXRpb24gb2NjdXJzIGZvbGxvd2luZyBvbmUgb3IgbW9yZSB0ZW1wbGF0ZQorICAgIC8vLyBoZWFkZXJzLgorICAgIFBDQ19UZW1wbGF0ZSwKKyAgICAvLy8gXGJyaWVmIENvZGUgY29tcGxldGlvbiBvY2N1cnMgZm9sbG93aW5nIG9uZSBvciBtb3JlIHRlbXBsYXRlCisgICAgLy8vIGhlYWRlcnMgd2l0aGluIGEgY2xhc3MuCisgICAgUENDX01lbWJlclRlbXBsYXRlLAorICAgIC8vLyBcYnJpZWYgQ29kZSBjb21wbGV0aW9uIG9jY3VycyB3aXRoaW4gYW4gZXhwcmVzc2lvbi4KKyAgICBQQ0NfRXhwcmVzc2lvbiwKKyAgICAvLy8gXGJyaWVmIENvZGUgY29tcGxldGlvbiBvY2N1cnMgd2l0aGluIGEgc3RhdGVtZW50LCB3aGljaCBtYXkKKyAgICAvLy8gYWxzbyBiZSBhbiBleHByZXNzaW9uIG9yIGEgZGVjbGFyYXRpb24uCisgICAgUENDX1N0YXRlbWVudCwKKyAgICAvLy8gXGJyaWVmIENvZGUgY29tcGxldGlvbiBvY2N1cnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAvLy8gaW5pdGlhbGl6YXRpb24gc3RhdGVtZW50IChvciBleHByZXNzaW9uKSBpbiBhIGZvciBsb29wLgorICAgIFBDQ19Gb3JJbml0LAorICAgIC8vLyBcYnJpZWYgQ29kZSBjb21wbGV0aW9uIG9jY3VycyB3aXRoaW4gdGhlIGNvbmRpdGlvbiBvZiBhbiBpZiwKKyAgICAvLy8gd2hpbGUsIHN3aXRjaCwgb3IgZm9yIHN0YXRlbWVudC4KKyAgICBQQ0NfQ29uZGl0aW9uLAorICAgIC8vLyBcYnJpZWYgQ29kZSBjb21wbGV0aW9uIG9jY3VycyB3aXRoaW4gdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBvbiBhCisgICAgLy8vIHJlY292ZXJ5IHBhdGgsIHdoZXJlIHdlIGRvIG5vdCBoYXZlIGEgc3BlY2lmaWMgaGFuZGxlIG9uIG91ciBwb3NpdGlvbgorICAgIC8vLyBpbiB0aGUgZ3JhbW1hci4KKyAgICBQQ0NfUmVjb3ZlcnlJbkZ1bmN0aW9uLAorICAgIC8vLyBcYnJpZWYgQ29kZSBjb21wbGV0aW9uIG9jY3VycyB3aGVyZSBvbmx5IGEgdHlwZSBpcyBwZXJtaXR0ZWQuCisgICAgUENDX1R5cGUsCisgICAgLy8vIFxicmllZiBDb2RlIGNvbXBsZXRpb24gb2NjdXJzIGluIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLCB3aGljaAorICAgIC8vLyBtaWdodCBhbHNvIGJlIGEgdHlwZSBjYXN0LgorICAgIFBDQ19QYXJlbnRoZXNpemVkRXhwcmVzc2lvbiwKKyAgICAvLy8gXGJyaWVmIENvZGUgY29tcGxldGlvbiBvY2N1cnMgd2l0aGluIGEgc2VxdWVuY2Ugb2YgZGVjbGFyYXRpb24KKyAgICAvLy8gc3BlY2lmaWVycyB3aXRoaW4gYSBmdW5jdGlvbiwgbWV0aG9kLCBvciBibG9jay4KKyAgICBQQ0NfTG9jYWxEZWNsYXJhdGlvblNwZWNpZmllcnMKKyAgfTsKKworICB2b2lkIENvZGVDb21wbGV0ZU1vZHVsZUltcG9ydChTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MsIE1vZHVsZUlkUGF0aCBQYXRoKTsKKyAgdm9pZCBDb2RlQ29tcGxldGVPcmRpbmFyeU5hbWUoU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlckNvbXBsZXRpb25Db250ZXh0IENvbXBsZXRpb25Db250ZXh0KTsKKyAgdm9pZCBDb2RlQ29tcGxldGVEZWNsU3BlYyhTY29wZSAqUywgRGVjbFNwZWMgJkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dOb25JZGVudGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93TmVzdGVkTmFtZVNwZWNpZmllcnMpOworCisgIHN0cnVjdCBDb2RlQ29tcGxldGVFeHByZXNzaW9uRGF0YTsKKyAgdm9pZCBDb2RlQ29tcGxldGVFeHByZXNzaW9uKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZUNvbXBsZXRlRXhwcmVzc2lvbkRhdGEgJkRhdGEpOworICB2b2lkIENvZGVDb21wbGV0ZU1lbWJlclJlZmVyZW5jZUV4cHIoU2NvcGUgKlMsIEV4cHIgKkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBPcExvYywgYm9vbCBJc0Fycm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0Jhc2VFeHByU3RhdGVtZW50KTsKKyAgdm9pZCBDb2RlQ29tcGxldGVQb3N0Zml4RXhwcmVzc2lvbihTY29wZSAqUywgRXhwclJlc3VsdCBMSFMpOworICB2b2lkIENvZGVDb21wbGV0ZVRhZyhTY29wZSAqUywgdW5zaWduZWQgVGFnU3BlYyk7CisgIHZvaWQgQ29kZUNvbXBsZXRlVHlwZVF1YWxpZmllcnMoRGVjbFNwZWMgJkRTKTsKKyAgdm9pZCBDb2RlQ29tcGxldGVGdW5jdGlvblF1YWxpZmllcnMoRGVjbFNwZWMgJkRTLCBEZWNsYXJhdG9yICZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWaXJ0U3BlY2lmaWVycyAqVlMgPSBudWxscHRyKTsKKyAgdm9pZCBDb2RlQ29tcGxldGVCcmFja2V0RGVjbGFyYXRvcihTY29wZSAqUyk7CisgIHZvaWQgQ29kZUNvbXBsZXRlQ2FzZShTY29wZSAqUyk7CisgIHZvaWQgQ29kZUNvbXBsZXRlQ2FsbChTY29wZSAqUywgRXhwciAqRm4sIEFycmF5UmVmPEV4cHIgKj4gQXJncyk7CisgIHZvaWQgQ29kZUNvbXBsZXRlQ29uc3RydWN0b3IoU2NvcGUgKlMsIFF1YWxUeXBlIFR5cGUsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IEFyZ3MpOworICB2b2lkIENvZGVDb21wbGV0ZUluaXRpYWxpemVyKFNjb3BlICpTLCBEZWNsICpEKTsKKyAgdm9pZCBDb2RlQ29tcGxldGVSZXR1cm4oU2NvcGUgKlMpOworICB2b2lkIENvZGVDb21wbGV0ZUFmdGVySWYoU2NvcGUgKlMpOworICB2b2lkIENvZGVDb21wbGV0ZUFzc2lnbm1lbnRSSFMoU2NvcGUgKlMsIEV4cHIgKkxIUyk7CisKKyAgdm9pZCBDb2RlQ29tcGxldGVRdWFsaWZpZWRJZChTY29wZSAqUywgQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEVudGVyaW5nQ29udGV4dCk7CisgIHZvaWQgQ29kZUNvbXBsZXRlVXNpbmcoU2NvcGUgKlMpOworICB2b2lkIENvZGVDb21wbGV0ZVVzaW5nRGlyZWN0aXZlKFNjb3BlICpTKTsKKyAgdm9pZCBDb2RlQ29tcGxldGVOYW1lc3BhY2VEZWNsKFNjb3BlICpTKTsKKyAgdm9pZCBDb2RlQ29tcGxldGVOYW1lc3BhY2VBbGlhc0RlY2woU2NvcGUgKlMpOworICB2b2lkIENvZGVDb21wbGV0ZU9wZXJhdG9yTmFtZShTY29wZSAqUyk7CisgIHZvaWQgQ29kZUNvbXBsZXRlQ29uc3RydWN0b3JJbml0aWFsaXplcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbCAqQ29uc3RydWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENYWEN0b3JJbml0aWFsaXplciAqPiBJbml0aWFsaXplcnMpOworCisgIHZvaWQgQ29kZUNvbXBsZXRlTGFtYmRhSW50cm9kdWNlcihTY29wZSAqUywgTGFtYmRhSW50cm9kdWNlciAmSW50cm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFmdGVyQW1wZXJzYW5kKTsKKworICB2b2lkIENvZGVDb21wbGV0ZU9iakNBdERpcmVjdGl2ZShTY29wZSAqUyk7CisgIHZvaWQgQ29kZUNvbXBsZXRlT2JqQ0F0VmlzaWJpbGl0eShTY29wZSAqUyk7CisgIHZvaWQgQ29kZUNvbXBsZXRlT2JqQ0F0U3RhdGVtZW50KFNjb3BlICpTKTsKKyAgdm9pZCBDb2RlQ29tcGxldGVPYmpDQXRFeHByZXNzaW9uKFNjb3BlICpTKTsKKyAgdm9pZCBDb2RlQ29tcGxldGVPYmpDUHJvcGVydHlGbGFncyhTY29wZSAqUywgT2JqQ0RlY2xTcGVjICZPRFMpOworICB2b2lkIENvZGVDb21wbGV0ZU9iakNQcm9wZXJ0eUdldHRlcihTY29wZSAqUyk7CisgIHZvaWQgQ29kZUNvbXBsZXRlT2JqQ1Byb3BlcnR5U2V0dGVyKFNjb3BlICpTKTsKKyAgdm9pZCBDb2RlQ29tcGxldGVPYmpDUGFzc2luZ1R5cGUoU2NvcGUgKlMsIE9iakNEZWNsU3BlYyAmRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNQYXJhbWV0ZXIpOworICB2b2lkIENvZGVDb21wbGV0ZU9iakNNZXNzYWdlUmVjZWl2ZXIoU2NvcGUgKlMpOworICB2b2lkIENvZGVDb21wbGV0ZU9iakNTdXBlck1lc3NhZ2UoU2NvcGUgKlMsIFNvdXJjZUxvY2F0aW9uIFN1cGVyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8SWRlbnRpZmllckluZm8gKj4gU2VsSWRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBdEFyZ3VtZW50RXhwcmVzc2lvbik7CisgIHZvaWQgQ29kZUNvbXBsZXRlT2JqQ0NsYXNzTWVzc2FnZShTY29wZSAqUywgUGFyc2VkVHlwZSBSZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPElkZW50aWZpZXJJbmZvICo+IFNlbElkZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQXRBcmd1bWVudEV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzU3VwZXIgPSBmYWxzZSk7CisgIHZvaWQgQ29kZUNvbXBsZXRlT2JqQ0luc3RhbmNlTWVzc2FnZShTY29wZSAqUywgRXhwciAqUmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxJZGVudGlmaWVySW5mbyAqPiBTZWxJZGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEF0QXJndW1lbnRFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ludGVyZmFjZURlY2wgKlN1cGVyID0gbnVsbHB0cik7CisgIHZvaWQgQ29kZUNvbXBsZXRlT2JqQ0ZvckNvbGxlY3Rpb24oU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbEdyb3VwUHRyVHkgSXRlcmF0aW9uVmFyKTsKKyAgdm9pZCBDb2RlQ29tcGxldGVPYmpDU2VsZWN0b3IoU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPElkZW50aWZpZXJJbmZvICo+IFNlbElkZW50cyk7CisgIHZvaWQgQ29kZUNvbXBsZXRlT2JqQ1Byb3RvY29sUmVmZXJlbmNlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8SWRlbnRpZmllckxvY1BhaXI+IFByb3RvY29scyk7CisgIHZvaWQgQ29kZUNvbXBsZXRlT2JqQ1Byb3RvY29sRGVjbChTY29wZSAqUyk7CisgIHZvaWQgQ29kZUNvbXBsZXRlT2JqQ0ludGVyZmFjZURlY2woU2NvcGUgKlMpOworICB2b2lkIENvZGVDb21wbGV0ZU9iakNTdXBlcmNsYXNzKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQ2xhc3NOYW1lTG9jKTsKKyAgdm9pZCBDb2RlQ29tcGxldGVPYmpDSW1wbGVtZW50YXRpb25EZWNsKFNjb3BlICpTKTsKKyAgdm9pZCBDb2RlQ29tcGxldGVPYmpDSW50ZXJmYWNlQ2F0ZWdvcnkoU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENsYXNzTmFtZUxvYyk7CisgIHZvaWQgQ29kZUNvbXBsZXRlT2JqQ0ltcGxlbWVudGF0aW9uQ2F0ZWdvcnkoU2NvcGUgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKkNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDbGFzc05hbWVMb2MpOworICB2b2lkIENvZGVDb21wbGV0ZU9iakNQcm9wZXJ0eURlZmluaXRpb24oU2NvcGUgKlMpOworICB2b2lkIENvZGVDb21wbGV0ZU9iakNQcm9wZXJ0eVN5bnRoZXNpemVJdmFyKFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpQcm9wZXJ0eU5hbWUpOworICB2b2lkIENvZGVDb21wbGV0ZU9iakNNZXRob2REZWNsKFNjb3BlICpTLCBPcHRpb25hbDxib29sPiBJc0luc3RhbmNlTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgUmV0dXJuVHlwZSk7CisgIHZvaWQgQ29kZUNvbXBsZXRlT2JqQ01ldGhvZERlY2xTZWxlY3RvcihTY29wZSAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbnN0YW5jZU1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQXRQYXJhbWV0ZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSBSZXR1cm5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8SWRlbnRpZmllckluZm8gKj4gU2VsSWRlbnRzKTsKKyAgdm9pZCBDb2RlQ29tcGxldGVPYmpDQ2xhc3NQcm9wZXJ0eVJlZkV4cHIoU2NvcGUgKlMsIElkZW50aWZpZXJJbmZvICZDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENsYXNzTmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0Jhc2VFeHByU3RhdGVtZW50KTsKKyAgdm9pZCBDb2RlQ29tcGxldGVQcmVwcm9jZXNzb3JEaXJlY3RpdmUoYm9vbCBJbkNvbmRpdGlvbmFsKTsKKyAgdm9pZCBDb2RlQ29tcGxldGVJblByZXByb2Nlc3NvckNvbmRpdGlvbmFsRXhjbHVzaW9uKFNjb3BlICpTKTsKKyAgdm9pZCBDb2RlQ29tcGxldGVQcmVwcm9jZXNzb3JNYWNyb05hbWUoYm9vbCBJc0RlZmluaXRpb24pOworICB2b2lkIENvZGVDb21wbGV0ZVByZXByb2Nlc3NvckV4cHJlc3Npb24oKTsKKyAgdm9pZCBDb2RlQ29tcGxldGVQcmVwcm9jZXNzb3JNYWNyb0FyZ3VtZW50KFNjb3BlICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKk1hY3JvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9JbmZvICpNYWNyb0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBcmd1bWVudCk7CisgIHZvaWQgQ29kZUNvbXBsZXRlTmF0dXJhbExhbmd1YWdlKCk7CisgIHZvaWQgQ29kZUNvbXBsZXRlQXZhaWxhYmlsaXR5UGxhdGZvcm1OYW1lKCk7CisgIHZvaWQgR2F0aGVyR2xvYmFsQ29kZUNvbXBsZXRpb25zKENvZGVDb21wbGV0aW9uQWxsb2NhdG9yICZBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVDb21wbGV0aW9uVFVJbmZvICZDQ1RVSW5mbywKKyAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxDb2RlQ29tcGxldGlvblJlc3VsdD4gJlJlc3VsdHMpOworICAvL0B9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEV4dHJhIHNlbWFudGljIGFuYWx5c2lzIGJleW9uZCB0aGUgQyB0eXBlIHN5c3RlbQorCitwdWJsaWM6CisgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uT2ZTdHJpbmdMaXRlcmFsQnl0ZShjb25zdCBTdHJpbmdMaXRlcmFsICpTTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJ5dGVObykgY29uc3Q7CisKK3ByaXZhdGU6CisgIHZvaWQgQ2hlY2tBcnJheUFjY2Vzcyhjb25zdCBFeHByICpCYXNlRXhwciwgY29uc3QgRXhwciAqSW5kZXhFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJyYXlTdWJzY3JpcHRFeHByICpBU0U9bnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dPbmVQYXN0RW5kPXRydWUsIGJvb2wgSW5kZXhOZWdhdGVkPWZhbHNlKTsKKyAgdm9pZCBDaGVja0FycmF5QWNjZXNzKGNvbnN0IEV4cHIgKkUpOworICAvLyBVc2VkIHRvIGdyYWIgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIGZyb20gYSBGb3JtYXRBdHRyIGFuZCBhCisgIC8vIEZ1bmN0aW9uRGVjbGFyYXRpb24uCisgIHN0cnVjdCBGb3JtYXRTdHJpbmdJbmZvIHsKKyAgICB1bnNpZ25lZCBGb3JtYXRJZHg7CisgICAgdW5zaWduZWQgRmlyc3REYXRhQXJnOworICAgIGJvb2wgSGFzVkFMaXN0QXJnOworICB9OworCisgIHN0YXRpYyBib29sIGdldEZvcm1hdFN0cmluZ0luZm8oY29uc3QgRm9ybWF0QXR0ciAqRm9ybWF0LCBib29sIElzQ1hYTWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdFN0cmluZ0luZm8gKkZTSSk7CisgIGJvb2wgQ2hlY2tGdW5jdGlvbkNhbGwoRnVuY3Rpb25EZWNsICpGRGVjbCwgQ2FsbEV4cHIgKlRoZUNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlByb3RvKTsKKyAgYm9vbCBDaGVja09iakNNZXRob2RDYWxsKE9iakNNZXRob2REZWNsICpNZXRob2QsIFNvdXJjZUxvY2F0aW9uIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IEV4cHIgKj4gQXJncyk7CisgIGJvb2wgQ2hlY2tQb2ludGVyQ2FsbChOYW1lZERlY2wgKk5EZWNsLCBDYWxsRXhwciAqVGhlQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpQcm90byk7CisgIGJvb2wgQ2hlY2tPdGhlckNhbGwoQ2FsbEV4cHIgKlRoZUNhbGwsIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpQcm90byk7CisgIHZvaWQgQ2hlY2tDb25zdHJ1Y3RvckNhbGwoRnVuY3Rpb25EZWNsICpGRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBFeHByICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYyk7CisKKyAgdm9pZCBjaGVja0NhbGwoTmFtZWREZWNsICpGRGVjbCwgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlByb3RvLAorICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpUaGlzQXJnLCBBcnJheVJlZjxjb25zdCBFeHByICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgIGJvb2wgSXNNZW1iZXJGdW5jdGlvbiwgU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VSYW5nZSBSYW5nZSwKKyAgICAgICAgICAgICAgICAgVmFyaWFkaWNDYWxsVHlwZSBDYWxsVHlwZSk7CisKKyAgYm9vbCBDaGVja09iakNTdHJpbmcoRXhwciAqQXJnKTsKKyAgRXhwclJlc3VsdCBDaGVja09TTG9nRm9ybWF0U3RyaW5nQXJnKEV4cHIgKkFyZyk7CisKKyAgRXhwclJlc3VsdCBDaGVja0J1aWx0aW5GdW5jdGlvbkNhbGwoRnVuY3Rpb25EZWNsICpGRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQnVpbHRpbklELCBDYWxsRXhwciAqVGhlQ2FsbCk7CisKKyAgYm9vbCBDaGVja0FSTUJ1aWx0aW5FeGNsdXNpdmVDYWxsKHVuc2lnbmVkIEJ1aWx0aW5JRCwgQ2FsbEV4cHIgKlRoZUNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXhXaWR0aCk7CisgIGJvb2wgQ2hlY2tOZW9uQnVpbHRpbkZ1bmN0aW9uQ2FsbCh1bnNpZ25lZCBCdWlsdGluSUQsIENhbGxFeHByICpUaGVDYWxsKTsKKyAgYm9vbCBDaGVja0FSTUJ1aWx0aW5GdW5jdGlvbkNhbGwodW5zaWduZWQgQnVpbHRpbklELCBDYWxsRXhwciAqVGhlQ2FsbCk7CisKKyAgYm9vbCBDaGVja0FBcmNoNjRCdWlsdGluRnVuY3Rpb25DYWxsKHVuc2lnbmVkIEJ1aWx0aW5JRCwgQ2FsbEV4cHIgKlRoZUNhbGwpOworICBib29sIENoZWNrTWlwc0J1aWx0aW5GdW5jdGlvbkNhbGwodW5zaWduZWQgQnVpbHRpbklELCBDYWxsRXhwciAqVGhlQ2FsbCk7CisgIGJvb2wgQ2hlY2tTeXN0ZW1aQnVpbHRpbkZ1bmN0aW9uQ2FsbCh1bnNpZ25lZCBCdWlsdGluSUQsIENhbGxFeHByICpUaGVDYWxsKTsKKyAgYm9vbCBDaGVja1g4NkJ1aWx0aW5Sb3VuZGluZ09yU0FFKHVuc2lnbmVkIEJ1aWx0aW5JRCwgQ2FsbEV4cHIgKlRoZUNhbGwpOworICBib29sIENoZWNrWDg2QnVpbHRpbkdhdGhlclNjYXR0ZXJTY2FsZSh1bnNpZ25lZCBCdWlsdGluSUQsIENhbGxFeHByICpUaGVDYWxsKTsKKyAgYm9vbCBDaGVja1g4NkJ1aWx0aW5GdW5jdGlvbkNhbGwodW5zaWduZWQgQnVpbHRpbklELCBDYWxsRXhwciAqVGhlQ2FsbCk7CisgIGJvb2wgQ2hlY2tQUENCdWlsdGluRnVuY3Rpb25DYWxsKHVuc2lnbmVkIEJ1aWx0aW5JRCwgQ2FsbEV4cHIgKlRoZUNhbGwpOworCisgIGJvb2wgU2VtYUJ1aWx0aW5WQVN0YXJ0KHVuc2lnbmVkIEJ1aWx0aW5JRCwgQ2FsbEV4cHIgKlRoZUNhbGwpOworICBib29sIFNlbWFCdWlsdGluVkFTdGFydEFSTU1pY3Jvc29mdChDYWxsRXhwciAqQ2FsbCk7CisgIGJvb2wgU2VtYUJ1aWx0aW5Vbm9yZGVyZWRDb21wYXJlKENhbGxFeHByICpUaGVDYWxsKTsKKyAgYm9vbCBTZW1hQnVpbHRpbkZQQ2xhc3NpZmljYXRpb24oQ2FsbEV4cHIgKlRoZUNhbGwsIHVuc2lnbmVkIE51bUFyZ3MpOworICBib29sIFNlbWFCdWlsdGluVlNYKENhbGxFeHByICpUaGVDYWxsKTsKKyAgYm9vbCBTZW1hQnVpbHRpbk9TTG9nRm9ybWF0KENhbGxFeHByICpUaGVDYWxsKTsKKworcHVibGljOgorICAvLyBVc2VkIGJ5IEMrKyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uLgorICBFeHByUmVzdWx0IFNlbWFCdWlsdGluU2h1ZmZsZVZlY3RvcihDYWxsRXhwciAqVGhlQ2FsbCk7CisgIEV4cHJSZXN1bHQgU2VtYUNvbnZlcnRWZWN0b3JFeHByKEV4cHIgKkUsIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQnVpbHRpbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKTsKKworcHJpdmF0ZToKKyAgYm9vbCBTZW1hQnVpbHRpblByZWZldGNoKENhbGxFeHByICpUaGVDYWxsKTsKKyAgYm9vbCBTZW1hQnVpbHRpbkFsbG9jYVdpdGhBbGlnbihDYWxsRXhwciAqVGhlQ2FsbCk7CisgIGJvb2wgU2VtYUJ1aWx0aW5Bc3N1bWUoQ2FsbEV4cHIgKlRoZUNhbGwpOworICBib29sIFNlbWFCdWlsdGluQXNzdW1lQWxpZ25lZChDYWxsRXhwciAqVGhlQ2FsbCk7CisgIGJvb2wgU2VtYUJ1aWx0aW5Mb25nam1wKENhbGxFeHByICpUaGVDYWxsKTsKKyAgYm9vbCBTZW1hQnVpbHRpblNldGptcChDYWxsRXhwciAqVGhlQ2FsbCk7CisgIEV4cHJSZXN1bHQgU2VtYUJ1aWx0aW5BdG9taWNPdmVybG9hZGVkKEV4cHJSZXN1bHQgVGhlQ2FsbFJlc3VsdCk7CisgIEV4cHJSZXN1bHQgU2VtYUJ1aWx0aW5Ob250ZW1wb3JhbE92ZXJsb2FkZWQoRXhwclJlc3VsdCBUaGVDYWxsUmVzdWx0KTsKKyAgRXhwclJlc3VsdCBTZW1hQXRvbWljT3BzT3ZlcmxvYWRlZChFeHByUmVzdWx0IFRoZUNhbGxSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljRXhwcjo6QXRvbWljT3AgT3ApOworICBFeHByUmVzdWx0IFNlbWFCdWlsdGluT3BlcmF0b3JOZXdEZWxldGVPdmVybG9hZGVkKEV4cHJSZXN1bHQgVGhlQ2FsbFJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRGVsZXRlKTsKKyAgYm9vbCBTZW1hQnVpbHRpbkNvbnN0YW50QXJnKENhbGxFeHByICpUaGVDYWxsLCBpbnQgQXJnTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QVBTSW50ICZSZXN1bHQpOworICBib29sIFNlbWFCdWlsdGluQ29uc3RhbnRBcmdSYW5nZShDYWxsRXhwciAqVGhlQ2FsbCwgaW50IEFyZ051bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IExvdywgaW50IEhpZ2gpOworICBib29sIFNlbWFCdWlsdGluQ29uc3RhbnRBcmdNdWx0aXBsZShDYWxsRXhwciAqVGhlQ2FsbCwgaW50IEFyZ051bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTXVsdGlwbGUpOworICBib29sIFNlbWFCdWlsdGluQVJNU3BlY2lhbFJlZyh1bnNpZ25lZCBCdWlsdGluSUQsIENhbGxFeHByICpUaGVDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQXJnTnVtLCB1bnNpZ25lZCBFeHBlY3RlZEZpZWxkTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93TmFtZSk7CitwdWJsaWM6CisgIGVudW0gRm9ybWF0U3RyaW5nVHlwZSB7CisgICAgRlNUX1NjYW5mLAorICAgIEZTVF9QcmludGYsCisgICAgRlNUX05TU3RyaW5nLAorICAgIEZTVF9TdHJmdGltZSwKKyAgICBGU1RfU3RyZm1vbiwKKyAgICBGU1RfS3ByaW50ZiwKKyAgICBGU1RfRnJlZUJTREtQcmludGYsCisgICAgRlNUX09TVHJhY2UsCisgICAgRlNUX09TTG9nLAorICAgIEZTVF9Vbmtub3duCisgIH07CisgIHN0YXRpYyBGb3JtYXRTdHJpbmdUeXBlIEdldEZvcm1hdFN0cmluZ1R5cGUoY29uc3QgRm9ybWF0QXR0ciAqRm9ybWF0KTsKKworICBib29sIEZvcm1hdFN0cmluZ0hhc1NBcmcoY29uc3QgU3RyaW5nTGl0ZXJhbCAqRkV4cHIpOworCisgIHN0YXRpYyBib29sIEdldEZvcm1hdE5TU3RyaW5nSWR4KGNvbnN0IEZvcm1hdEF0dHIgKkZvcm1hdCwgdW5zaWduZWQgJklkeCk7CisKK3ByaXZhdGU6CisgIGJvb2wgQ2hlY2tGb3JtYXRBcmd1bWVudHMoY29uc3QgRm9ybWF0QXR0ciAqRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQ1hYTWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhZGljQ2FsbFR5cGUgQ2FsbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VSYW5nZSBSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTbWFsbEJpdFZlY3RvciAmQ2hlY2tlZFZhckFyZ3MpOworICBib29sIENoZWNrRm9ybWF0QXJndW1lbnRzKEFycmF5UmVmPGNvbnN0IEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc1ZBTGlzdEFyZywgdW5zaWduZWQgZm9ybWF0X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmaXJzdERhdGFBcmcsIEZvcm1hdFN0cmluZ1R5cGUgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWRpY0NhbGxUeXBlIENhbGxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywgU291cmNlUmFuZ2UgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxCaXRWZWN0b3IgJkNoZWNrZWRWYXJBcmdzKTsKKworICB2b2lkIENoZWNrQWJzb2x1dGVWYWx1ZUZ1bmN0aW9uKGNvbnN0IENhbGxFeHByICpDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkRlY2wpOworCisgIHZvaWQgQ2hlY2tNYXhVbnNpZ25lZFplcm8oY29uc3QgQ2FsbEV4cHIgKkNhbGwsIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkRlY2wpOworCisgIHZvaWQgQ2hlY2tNZW1hY2Nlc3NBcmd1bWVudHMoY29uc3QgQ2FsbEV4cHIgKkNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpGbk5hbWUpOworCisgIHZvaWQgQ2hlY2tTdHJsY3B5Y2F0QXJndW1lbnRzKGNvbnN0IENhbGxFeHByICpDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqRm5OYW1lKTsKKworICB2b2lkIENoZWNrU3RybmNhdEFyZ3VtZW50cyhjb25zdCBDYWxsRXhwciAqQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKkZuTmFtZSk7CisKKyAgdm9pZCBDaGVja1JldHVyblZhbEV4cHIoRXhwciAqUmV0VmFsRXhwLCBRdWFsVHlwZSBsaHNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSZXR1cm5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPYmpDTWV0aG9kID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJWZWMgKkF0dHJzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpGRCA9IG51bGxwdHIpOworCitwdWJsaWM6CisgIHZvaWQgQ2hlY2tGbG9hdENvbXBhcmlzb24oU291cmNlTG9jYXRpb24gTG9jLCBFeHByICpMSFMsIEV4cHIgKlJIUyk7CisKK3ByaXZhdGU6CisgIHZvaWQgQ2hlY2tJbXBsaWNpdENvbnZlcnNpb25zKEV4cHIgKkUsIFNvdXJjZUxvY2F0aW9uIENDID0gU291cmNlTG9jYXRpb24oKSk7CisgIHZvaWQgQ2hlY2tCb29sTGlrZUNvbnZlcnNpb24oRXhwciAqRSwgU291cmNlTG9jYXRpb24gQ0MpOworICB2b2lkIENoZWNrRm9ySW50T3ZlcmZsb3coRXhwciAqRSk7CisgIHZvaWQgQ2hlY2tVbnNlcXVlbmNlZE9wZXJhdGlvbnMoRXhwciAqRSk7CisKKyAgLy8vIFxicmllZiBQZXJmb3JtIHNlbWFudGljIGNoZWNrcyBvbiBhIGNvbXBsZXRlZCBleHByZXNzaW9uLiBUaGlzIHdpbGwgZWl0aGVyCisgIC8vLyBiZSBhIGZ1bGwtZXhwcmVzc2lvbiBvciBhIGRlZmF1bHQgYXJndW1lbnQgZXhwcmVzc2lvbi4KKyAgdm9pZCBDaGVja0NvbXBsZXRlZEV4cHIoRXhwciAqRSwgU291cmNlTG9jYXRpb24gQ2hlY2tMb2MgPSBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQ29uc3RleHByID0gZmFsc2UpOworCisgIHZvaWQgQ2hlY2tCaXRGaWVsZEluaXRpYWxpemF0aW9uKFNvdXJjZUxvY2F0aW9uIEluaXRMb2MsIEZpZWxkRGVjbCAqRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkluaXQpOworCisgIC8vLyBDaGVjayBpZiB0aGVyZSBpcyBhIGZpZWxkIHNoYWRvd2luZy4KKyAgdm9pZCBDaGVja1NoYWRvd0luaGVyaXRlZEZpZWxkcyhjb25zdCBTb3VyY2VMb2NhdGlvbiAmTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpOworCisgIC8vLyBcYnJpZWYgQ2hlY2sgaWYgdGhlIGdpdmVuIGV4cHJlc3Npb24gY29udGFpbnMgJ2JyZWFrJyBvciAnY29udGludWUnCisgIC8vLyBzdGF0ZW1lbnQgdGhhdCBwcm9kdWNlcyBjb250cm9sIGZsb3cgZGlmZmVyZW50IGZyb20gR0NDLgorICB2b2lkIENoZWNrQnJlYWtDb250aW51ZUJpbmRpbmcoRXhwciAqRSk7CisKKyAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIHJlY2VpdmVyIGlzIG11dGFibGUgT2JqQyBjb250YWluZXIgd2hpY2gKKyAgLy8vIGF0dGVtcHRzIHRvIGFkZCBpdHNlbGYgaW50byB0aGUgY29udGFpbmVyCisgIHZvaWQgQ2hlY2tPYmpDQ2lyY3VsYXJDb250YWluZXIoT2JqQ01lc3NhZ2VFeHByICpNZXNzYWdlKTsKKworICB2b2lkIEFuYWx5emVEZWxldGVFeHByTWlzbWF0Y2goY29uc3QgQ1hYRGVsZXRlRXhwciAqREUpOworICB2b2lkIEFuYWx5emVEZWxldGVFeHByTWlzbWF0Y2goRmllbGREZWNsICpGaWVsZCwgU291cmNlTG9jYXRpb24gRGVsZXRlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZWxldGVXYXNBcnJheUZvcm0pOworcHVibGljOgorICAvLy8gXGJyaWVmIFJlZ2lzdGVyIGEgbWFnaWMgaW50ZWdyYWwgY29uc3RhbnQgdG8gYmUgdXNlZCBhcyBhIHR5cGUgdGFnLgorICB2b2lkIFJlZ2lzdGVyVHlwZVRhZ0ZvckRhdGF0eXBlKGNvbnN0IElkZW50aWZpZXJJbmZvICpBcmd1bWVudEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgTWFnaWNWYWx1ZSwgUXVhbFR5cGUgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIExheW91dENvbXBhdGlibGUsIGJvb2wgTXVzdEJlTnVsbCk7CisKKyAgc3RydWN0IFR5cGVUYWdEYXRhIHsKKyAgICBUeXBlVGFnRGF0YSgpIHt9CisKKyAgICBUeXBlVGFnRGF0YShRdWFsVHlwZSBUeXBlLCBib29sIExheW91dENvbXBhdGlibGUsIGJvb2wgTXVzdEJlTnVsbCkgOgorICAgICAgICBUeXBlKFR5cGUpLCBMYXlvdXRDb21wYXRpYmxlKExheW91dENvbXBhdGlibGUpLAorICAgICAgICBNdXN0QmVOdWxsKE11c3RCZU51bGwpCisgICAge30KKworICAgIFF1YWxUeXBlIFR5cGU7CisKKyAgICAvLy8gSWYgdHJ1ZSwgXGMgVHlwZSBzaG91bGQgYmUgY29tcGFyZWQgd2l0aCBvdGhlciBleHByZXNzaW9uJ3MgdHlwZXMgZm9yCisgICAgLy8vIGxheW91dC1jb21wYXRpYmlsaXR5LgorICAgIHVuc2lnbmVkIExheW91dENvbXBhdGlibGUgOiAxOworICAgIHVuc2lnbmVkIE11c3RCZU51bGwgOiAxOworICB9OworCisgIC8vLyBBIHBhaXIgb2YgQXJndW1lbnRLaW5kIGlkZW50aWZpZXIgYW5kIG1hZ2ljIHZhbHVlLiAgVGhpcyB1bmlxdWVseQorICAvLy8gaWRlbnRpZmllcyB0aGUgbWFnaWMgdmFsdWUuCisgIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IElkZW50aWZpZXJJbmZvICosIHVpbnQ2NF90PiBUeXBlVGFnTWFnaWNWYWx1ZTsKKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBBIG1hcCBmcm9tIG1hZ2ljIHZhbHVlIHRvIHR5cGUgaW5mb3JtYXRpb24uCisgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpEZW5zZU1hcDxUeXBlVGFnTWFnaWNWYWx1ZSwgVHlwZVRhZ0RhdGE+PgorICAgICAgVHlwZVRhZ0ZvckRhdGF0eXBlTWFnaWNWYWx1ZXM7CisKKyAgLy8vIFxicmllZiBQZWZvcm0gY2hlY2tzIG9uIGEgY2FsbCBvZiBhIGZ1bmN0aW9uIHdpdGggYXJndW1lbnRfd2l0aF90eXBlX3RhZworICAvLy8gb3IgcG9pbnRlcl93aXRoX3R5cGVfdGFnIGF0dHJpYnV0ZXMuCisgIHZvaWQgQ2hlY2tBcmd1bWVudFdpdGhUeXBlVGFnKGNvbnN0IEFyZ3VtZW50V2l0aFR5cGVUYWdBdHRyICpBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcnJheVJlZjxjb25zdCBFeHByICo+IEV4cHJBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDYWxsU2l0ZUxvYyk7CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiB3ZSBhcmUgdGFraW5nIHRoZSBhZGRyZXNzIG9mIGEgcGFja2VkIGZpZWxkCisgIC8vLyBhcyB0aGlzIG1heSBiZSBhIHByb2JsZW0gaWYgdGhlIHBvaW50ZXIgdmFsdWUgaXMgZGVyZWZlcmVuY2VkLgorICB2b2lkIENoZWNrQWRkcmVzc09mUGFja2VkTWVtYmVyKEV4cHIgKnJocyk7CisKKyAgLy8vIFxicmllZiBUaGUgcGFyc2VyJ3MgY3VycmVudCBzY29wZS4KKyAgLy8vCisgIC8vLyBUaGUgcGFyc2VyIG1haW50YWlucyB0aGlzIHN0YXRlIGhlcmUuCisgIFNjb3BlICpDdXJTY29wZTsKKworICBtdXRhYmxlIElkZW50aWZpZXJJbmZvICpJZGVudF9zdXBlcjsKKyAgbXV0YWJsZSBJZGVudGlmaWVySW5mbyAqSWRlbnRfX19mbG9hdDEyODsKKworICAvLy8gTnVsbGFiaWxpdHkgdHlwZSBzcGVjaWZpZXJzLgorICBJZGVudGlmaWVySW5mbyAqSWRlbnRfX05vbm51bGwgPSBudWxscHRyOworICBJZGVudGlmaWVySW5mbyAqSWRlbnRfX051bGxhYmxlID0gbnVsbHB0cjsKKyAgSWRlbnRpZmllckluZm8gKklkZW50X19OdWxsX3Vuc3BlY2lmaWVkID0gbnVsbHB0cjsKKworICBJZGVudGlmaWVySW5mbyAqSWRlbnRfTlNFcnJvciA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBUaGUgaGFuZGxlciBmb3IgdGhlIEZpbGVDaGFuZ2VkIHByZXByb2Nlc3NvciBldmVudHMuCisgIC8vLworICAvLy8gVXNlZCBmb3IgZGlhZ25vc3RpY3MgdGhhdCBpbXBsZW1lbnQgY3VzdG9tIHNlbWFudGljIGFuYWx5c2lzIGZvciAjaW5jbHVkZQorICAvLy8gZGlyZWN0aXZlcywgbGlrZSAtV3ByYWdtYS1wYWNrLgorICBzZW1hOjpTZW1hUFBDYWxsYmFja3MgKlNlbWFQUENhbGxiYWNrSGFuZGxlcjsKKworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgUGFyc2VyOworICBmcmllbmQgY2xhc3MgSW5pdGlhbGl6YXRpb25TZXF1ZW5jZTsKKyAgZnJpZW5kIGNsYXNzIEFTVFJlYWRlcjsKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RXcml0ZXI7CisKK3B1YmxpYzoKKyAgLy8vIFJldHJpZXZlIHRoZSBrZXl3b3JkIGFzc29jaWF0ZWQKKyAgSWRlbnRpZmllckluZm8gKmdldE51bGxhYmlsaXR5S2V5d29yZChOdWxsYWJpbGl0eUtpbmQgbnVsbGFiaWxpdHkpOworCisgIC8vLyBUaGUgc3RydWN0IGJlaGluZCB0aGUgQ0ZFcnJvclJlZiBwb2ludGVyLgorICBSZWNvcmREZWNsICpDRkVycm9yID0gbnVsbHB0cjsKKworICAvLy8gUmV0cmlldmUgdGhlIGlkZW50aWZpZXIgIk5TRXJyb3IiLgorICBJZGVudGlmaWVySW5mbyAqZ2V0TlNFcnJvcklkZW50KCk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgcGFyc2VyJ3MgY3VycmVudCBzY29wZS4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgbXVzdCBvbmx5IGJlIHVzZWQgd2hlbiBpdCBpcyBjZXJ0YWluIHRoYXQgc2VtYW50aWMgYW5hbHlzaXMKKyAgLy8vIGFuZCB0aGUgcGFyc2VyIGFyZSBpbiBwcmVjaXNlbHkgdGhlIHNhbWUgY29udGV4dCwgd2hpY2ggaXMgbm90IHRoZSBjYXNlCisgIC8vLyB3aGVuLCBlLmcuLCB3ZSBhcmUgcGVyZm9ybWluZyBhbnkga2luZCBvZiB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uLgorICAvLy8gVGhlcmVmb3JlLCB0aGUgb25seSBzYWZlIHBsYWNlcyB0byB1c2UgdGhpcyBzY29wZSBhcmUgaW4gdGhlIHBhcnNlcgorICAvLy8gaXRzZWxmIGFuZCBpbiByb3V0aW5lcyBkaXJlY3RseSBpbnZva2VkIGZyb20gdGhlIHBhcnNlciBhbmQgKm5ldmVyKiBmcm9tCisgIC8vLyB0ZW1wbGF0ZSBzdWJzdGl0dXRpb24gb3IgaW5zdGFudGlhdGlvbi4KKyAgU2NvcGUgKmdldEN1clNjb3BlKCkgY29uc3QgeyByZXR1cm4gQ3VyU2NvcGU7IH0KKworICB2b2lkIGluY3JlbWVudE1TTWFuZ2xpbmdOdW1iZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIEN1clNjb3BlLT5pbmNyZW1lbnRNU01hbmdsaW5nTnVtYmVyKCk7CisgIH0KKworICBJZGVudGlmaWVySW5mbyAqZ2V0U3VwZXJJZGVudGlmaWVyKCkgY29uc3Q7CisgIElkZW50aWZpZXJJbmZvICpnZXRGbG9hdDEyOElkZW50aWZpZXIoKSBjb25zdDsKKworICBEZWNsICpnZXRPYmpDRGVjbENvbnRleHQoKSBjb25zdDsKKworICBEZWNsQ29udGV4dCAqZ2V0Q3VyTGV4aWNhbENvbnRleHQoKSBjb25zdCB7CisgICAgcmV0dXJuIE9yaWdpbmFsTGV4aWNhbENvbnRleHQgPyBPcmlnaW5hbExleGljYWxDb250ZXh0IDogQ3VyQ29udGV4dDsKKyAgfQorCisgIGNvbnN0IERlY2xDb250ZXh0ICpnZXRDdXJPYmpDTGV4aWNhbENvbnRleHQoKSBjb25zdCB7CisgICAgY29uc3QgRGVjbENvbnRleHQgKkRDID0gZ2V0Q3VyTGV4aWNhbENvbnRleHQoKTsKKyAgICAvLyBBIGNhdGVnb3J5IGltcGxpY2l0bHkgaGFzIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIGludGVyZmFjZS4KKyAgICBpZiAoY29uc3QgT2JqQ0NhdGVnb3J5RGVjbCAqQ2F0RCA9IGR5bl9jYXN0PE9iakNDYXRlZ29yeURlY2w+KERDKSkKKyAgICAgIERDID0gQ2F0RC0+Z2V0Q2xhc3NJbnRlcmZhY2UoKTsKKyAgICByZXR1cm4gREM7CisgIH0KKworICAvLy8gXGJyaWVmIFRvIGJlIHVzZWQgZm9yIGNoZWNraW5nIHdoZXRoZXIgdGhlIGFyZ3VtZW50cyBiZWluZyBwYXNzZWQgdG8KKyAgLy8vIGZ1bmN0aW9uIGV4Y2VlZHMgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGV4cGVjdGVkIGZvciBpdC4KKyAgc3RhdGljIGJvb2wgVG9vTWFueUFyZ3VtZW50cyhzaXplX3QgTnVtUGFyYW1zLCBzaXplX3QgTnVtQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFBhcnRpYWxPdmVybG9hZGluZyA9IGZhbHNlKSB7CisgICAgLy8gV2UgY2hlY2sgd2hldGhlciB3ZSdyZSBqdXN0IGFmdGVyIGEgY29tbWEgaW4gY29kZS1jb21wbGV0aW9uLgorICAgIGlmIChOdW1BcmdzID4gMCAmJiBQYXJ0aWFsT3ZlcmxvYWRpbmcpCisgICAgICByZXR1cm4gTnVtQXJncyArIDEgPiBOdW1QYXJhbXM7IC8vIElmIHNvLCB3ZSB2aWV3IGFzIGFuIGV4dHJhIGFyZ3VtZW50LgorICAgIHJldHVybiBOdW1BcmdzID4gTnVtUGFyYW1zOworICB9CisKKyAgLy8gRW1pdHRpbmcgbWVtYmVycyBvZiBkbGxleHBvcnRlZCBjbGFzc2VzIGlzIGRlbGF5ZWQgdW50aWwgdGhlIGNsYXNzCisgIC8vIChpbmNsdWRpbmcgZmllbGQgaW5pdGlhbGl6ZXJzKSBpcyBmdWxseSBwYXJzZWQuCisgIFNtYWxsVmVjdG9yPENYWFJlY29yZERlY2wqLCA0PiBEZWxheWVkRGxsRXhwb3J0Q2xhc3NlczsKKworcHJpdmF0ZToKKyAgY2xhc3MgU2F2ZVBlbmRpbmdQYXJzZWRDbGFzc1N0YXRlUkFJSSB7CisgIHB1YmxpYzoKKyAgICBTYXZlUGVuZGluZ1BhcnNlZENsYXNzU3RhdGVSQUlJKFNlbWEgJlMpIDogUyhTKSB7IHN3YXBTYXZlZFN0YXRlKCk7IH0KKworICAgIH5TYXZlUGVuZGluZ1BhcnNlZENsYXNzU3RhdGVSQUlJKCkgeworICAgICAgYXNzZXJ0KFMuRGVsYXllZEV4Y2VwdGlvblNwZWNDaGVja3MuZW1wdHkoKSAmJgorICAgICAgICAgICAgICJ0aGVyZSBzaG91bGRuJ3QgYmUgYW55IHBlbmRpbmcgZGVsYXllZCBleGNlcHRpb24gc3BlYyBjaGVja3MiKTsKKyAgICAgIGFzc2VydChTLkRlbGF5ZWREZWZhdWx0ZWRNZW1iZXJFeGNlcHRpb25TcGVjcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgInRoZXJlIHNob3VsZG4ndCBiZSBhbnkgcGVuZGluZyBkZWxheWVkIGRlZmF1bHRlZCBtZW1iZXIgIgorICAgICAgICAgICAgICJleGNlcHRpb24gc3BlY3MiKTsKKyAgICAgIGFzc2VydChTLkRlbGF5ZWREbGxFeHBvcnRDbGFzc2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAidGhlcmUgc2hvdWxkbid0IGJlIGFueSBwZW5kaW5nIGRlbGF5ZWQgRExMIGV4cG9ydCBjbGFzc2VzIik7CisgICAgICBzd2FwU2F2ZWRTdGF0ZSgpOworICAgIH0KKworICBwcml2YXRlOgorICAgIFNlbWEgJlM7CisgICAgZGVjbHR5cGUoRGVsYXllZEV4Y2VwdGlvblNwZWNDaGVja3MpIFNhdmVkRXhjZXB0aW9uU3BlY0NoZWNrczsKKyAgICBkZWNsdHlwZShEZWxheWVkRGVmYXVsdGVkTWVtYmVyRXhjZXB0aW9uU3BlY3MpCisgICAgICAgIFNhdmVkRGVmYXVsdGVkTWVtYmVyRXhjZXB0aW9uU3BlY3M7CisgICAgZGVjbHR5cGUoRGVsYXllZERsbEV4cG9ydENsYXNzZXMpIFNhdmVkRGxsRXhwb3J0Q2xhc3NlczsKKworICAgIHZvaWQgc3dhcFNhdmVkU3RhdGUoKSB7CisgICAgICBTYXZlZEV4Y2VwdGlvblNwZWNDaGVja3Muc3dhcChTLkRlbGF5ZWRFeGNlcHRpb25TcGVjQ2hlY2tzKTsKKyAgICAgIFNhdmVkRGVmYXVsdGVkTWVtYmVyRXhjZXB0aW9uU3BlY3Muc3dhcCgKKyAgICAgICAgICBTLkRlbGF5ZWREZWZhdWx0ZWRNZW1iZXJFeGNlcHRpb25TcGVjcyk7CisgICAgICBTYXZlZERsbEV4cG9ydENsYXNzZXMuc3dhcChTLkRlbGF5ZWREbGxFeHBvcnRDbGFzc2VzKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFxicmllZiBIZWxwZXIgY2xhc3MgdGhhdCBjb2xsZWN0cyBtaXNhbGlnbmVkIG1lbWJlciBkZXNpZ25hdGlvbnMgYW5kCisgIC8vLyB0aGVpciBsb2NhdGlvbiBpbmZvIGZvciBkZWxheWVkIGRpYWdub3N0aWNzLgorICBzdHJ1Y3QgTWlzYWxpZ25lZE1lbWJlciB7CisgICAgRXhwciAqRTsKKyAgICBSZWNvcmREZWNsICpSRDsKKyAgICBWYWx1ZURlY2wgKk1EOworICAgIENoYXJVbml0cyBBbGlnbm1lbnQ7CisKKyAgICBNaXNhbGlnbmVkTWVtYmVyKCkgOiBFKCksIFJEKCksIE1EKCksIEFsaWdubWVudCgpIHt9CisgICAgTWlzYWxpZ25lZE1lbWJlcihFeHByICpFLCBSZWNvcmREZWNsICpSRCwgVmFsdWVEZWNsICpNRCwKKyAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBBbGlnbm1lbnQpCisgICAgICAgIDogRShFKSwgUkQoUkQpLCBNRChNRCksIEFsaWdubWVudChBbGlnbm1lbnQpIHt9CisgICAgZXhwbGljaXQgTWlzYWxpZ25lZE1lbWJlcihFeHByICpFKQorICAgICAgICA6IE1pc2FsaWduZWRNZW1iZXIoRSwgbnVsbHB0ciwgbnVsbHB0ciwgQ2hhclVuaXRzKCkpIHt9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWlzYWxpZ25lZE1lbWJlciAmbSkgeyByZXR1cm4gdGhpcy0+RSA9PSBtLkU7IH0KKyAgfTsKKyAgLy8vIFxicmllZiBTbWFsbCBzZXQgb2YgZ2F0aGVyZWQgYWNjZXNzZXMgdG8gcG90ZW50aWFsbHkgbWlzYWxpZ25lZCBtZW1iZXJzCisgIC8vLyBkdWUgdG8gdGhlIHBhY2tlZCBhdHRyaWJ1dGUuCisgIFNtYWxsVmVjdG9yPE1pc2FsaWduZWRNZW1iZXIsIDQ+IE1pc2FsaWduZWRNZW1iZXJzOworCisgIC8vLyBcYnJpZWYgQWRkcyBhbiBleHByZXNzaW9uIHRvIHRoZSBzZXQgb2YgZ2F0aGVyZWQgbWlzYWxpZ25lZCBtZW1iZXJzLgorICB2b2lkIEFkZFBvdGVudGlhbE1pc2FsaWduZWRNZW1iZXJzKEV4cHIgKkUsIFJlY29yZERlY2wgKlJELCBWYWx1ZURlY2wgKk1ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBBbGlnbm1lbnQpOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgRGlhZ25vc2VzIHRoZSBjdXJyZW50IHNldCBvZiBnYXRoZXJlZCBhY2Nlc3Nlcy4gVGhpcyB0eXBpY2FsbHkKKyAgLy8vIGhhcHBlbnMgYXQgZnVsbCBleHByZXNzaW9uIGxldmVsLiBUaGUgc2V0IGlzIGNsZWFyZWQgYWZ0ZXIgZW1pdHRpbmcgdGhlCisgIC8vLyBkaWFnbm9zdGljcy4KKyAgdm9pZCBEaWFnbm9zZU1pc2FsaWduZWRNZW1iZXJzKCk7CisKKyAgLy8vIFxicmllZiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgZXhwcmVzc2lvbiBpcyBpbiB0aGUgc2VmIG9mIHBvdGVudGlhbGx5CisgIC8vLyBtaXNhbGlnbmVkIG1lbWJlcnMgYW5kIGl0IGlzIGNvbnZlcnRlZCB0byBzb21lIHBvaW50ZXIgdHlwZSBUIHdpdGggbG93ZXIKKyAgLy8vIG9yIGVxdWFsIGFsaWdubWVudCByZXF1aXJlbWVudHMuIElmIHNvIGl0IHJlbW92ZXMgaXQuIFRoaXMgaXMgdXNlZCB3aGVuCisgIC8vLyB3ZSBkbyBub3Qgd2FudCB0byBkaWFnbm9zZSBzdWNoIG1pc2FsaWduZWQgYWNjZXNzIChlLmcuIGluIGNvbnZlcnNpb25zIHRvCisgIC8vLyB2b2lkKikuCisgIHZvaWQgRGlzY2FyZE1pc2FsaWduZWRNZW1iZXJBZGRyZXNzKGNvbnN0IFR5cGUgKlQsIEV4cHIgKkUpOworCisgIC8vLyBcYnJpZWYgVGhpcyBmdW5jdGlvbiBjYWxscyBBY3Rpb24gd2hlbiBpdCBkZXRlcm1pbmVzIHRoYXQgRSBkZXNpZ25hdGVzIGEKKyAgLy8vIG1pc2FsaWduZWQgbWVtYmVyIGR1ZSB0byB0aGUgcGFja2VkIGF0dHJpYnV0ZS4gVGhpcyBpcyB1c2VkIHRvIGVtaXQKKyAgLy8vIGxvY2FsIGRpYWdub3N0aWNzIGxpa2UgaW4gcmVmZXJlbmNlIGJpbmRpbmcuCisgIHZvaWQgUmVmZXJzVG9NZW1iZXJXaXRoUmVkdWNlZEFsaWdubWVudCgKKyAgICAgIEV4cHIgKkUsCisgICAgICBsbHZtOjpmdW5jdGlvbl9yZWY8dm9pZChFeHByICosIFJlY29yZERlY2wgKiwgRmllbGREZWNsICosIENoYXJVbml0cyk+CisgICAgICAgICAgQWN0aW9uKTsKK307CisKKy8vLyBcYnJpZWYgUkFJSSBvYmplY3QgdGhhdCBlbnRlcnMgYSBuZXcgZXhwcmVzc2lvbiBldmFsdWF0aW9uIGNvbnRleHQuCitjbGFzcyBFbnRlckV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dCB7CisgIFNlbWEgJkFjdGlvbnM7CisgIGJvb2wgRW50ZXJlZCA9IHRydWU7CisKK3B1YmxpYzoKKworICBFbnRlckV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dChTZW1hICZBY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW1hOjpFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQgTmV3Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbCAqTGFtYmRhQ29udGV4dERlY2wgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRGVjbHR5cGUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRFbnRlciA9IHRydWUpCisgICAgICA6IEFjdGlvbnMoQWN0aW9ucyksIEVudGVyZWQoU2hvdWxkRW50ZXIpIHsKKyAgICBpZiAoRW50ZXJlZCkKKyAgICAgIEFjdGlvbnMuUHVzaEV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dChOZXdDb250ZXh0LCBMYW1iZGFDb250ZXh0RGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0RlY2x0eXBlKTsKKyAgfQorICBFbnRlckV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dChTZW1hICZBY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW1hOjpFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQgTmV3Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYTo6UmV1c2VMYW1iZGFDb250ZXh0RGVjbF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRGVjbHR5cGUgPSBmYWxzZSkKKyAgICA6IEFjdGlvbnMoQWN0aW9ucykgeworICAgIEFjdGlvbnMuUHVzaEV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dChOZXdDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW1hOjpSZXVzZUxhbWJkYUNvbnRleHREZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0RlY2x0eXBlKTsKKyAgfQorCisgIGVudW0gSW5pdExpc3RUYWcgeyBJbml0TGlzdCB9OworICBFbnRlckV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dChTZW1hICZBY3Rpb25zLCBJbml0TGlzdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRFbnRlciA9IHRydWUpCisgICAgICA6IEFjdGlvbnMoQWN0aW9ucyksIEVudGVyZWQoZmFsc2UpIHsKKyAgICAvLyBJbiBDKysxMSBvbndhcmRzLCBuYXJyb3dpbmcgY2hlY2tzIGFyZSBwZXJmb3JtZWQgb24gdGhlIGNvbnRlbnRzIG9mCisgICAgLy8gYnJhY2VkLWluaXQtbGlzdHMsIGV2ZW4gd2hlbiB0aGV5IG9jY3VyIHdpdGhpbiB1bmV2YWx1YXRlZCBvcGVyYW5kcy4KKyAgICAvLyBUaGVyZWZvcmUgd2Ugc3RpbGwgbmVlZCB0byBpbnN0YW50aWF0ZSBjb25zdGV4cHIgZnVuY3Rpb25zIHVzZWQgaW4gc3VjaAorICAgIC8vIGEgY29udGV4dC4KKyAgICBpZiAoU2hvdWxkRW50ZXIgJiYgQWN0aW9ucy5pc1VuZXZhbHVhdGVkQ29udGV4dCgpICYmCisgICAgICAgIEFjdGlvbnMuZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxMSkgeworICAgICAgQWN0aW9ucy5QdXNoRXhwcmVzc2lvbkV2YWx1YXRpb25Db250ZXh0KAorICAgICAgICAgIFNlbWE6OkV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dDo6VW5ldmFsdWF0ZWRMaXN0LCBudWxscHRyLCBmYWxzZSk7CisgICAgICBFbnRlcmVkID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICB+RW50ZXJFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQoKSB7CisgICAgaWYgKEVudGVyZWQpCisgICAgICBBY3Rpb25zLlBvcEV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dCgpOworICB9Cit9OworCitEZWR1Y3Rpb25GYWlsdXJlSW5mbworTWFrZURlZHVjdGlvbkZhaWx1cmVJbmZvKEFTVENvbnRleHQgJkNvbnRleHQsIFNlbWE6OlRlbXBsYXRlRGVkdWN0aW9uUmVzdWx0IFRESywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hOjpUZW1wbGF0ZURlZHVjdGlvbkluZm8gJkluZm8pOworCisvLy8gXGJyaWVmIENvbnRhaW5zIGEgbGF0ZSB0ZW1wbGF0ZWQgZnVuY3Rpb24uCisvLy8gV2lsbCBiZSBwYXJzZWQgYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNsYXRpb24gdW5pdCwgdXNlZCBieSBTZW1hICYgUGFyc2VyLgorc3RydWN0IExhdGVQYXJzZWRUZW1wbGF0ZSB7CisgIENhY2hlZFRva2VucyBUb2tzOworICAvLy8gXGJyaWVmIFRoZSB0ZW1wbGF0ZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiB0byBiZSBsYXRlIHBhcnNlZC4KKyAgRGVjbCAqRDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCituYW1lc3BhY2UgbGx2bSB7CisvLyBIYXNoIGEgRnVuY3Rpb25EZWNsQW5kTG9jIGJ5IGxvb2tpbmcgYXQgYm90aCBpdHMgRnVuY3Rpb25EZWNsIGFuZCBpdHMKKy8vIFNvdXJjZUxvY2F0aW9uLgordGVtcGxhdGUgPD4gc3RydWN0IERlbnNlTWFwSW5mbzxjbGFuZzo6U2VtYTo6RnVuY3Rpb25EZWNsQW5kTG9jPiB7CisgIHVzaW5nIEZ1bmN0aW9uRGVjbEFuZExvYyA9IGNsYW5nOjpTZW1hOjpGdW5jdGlvbkRlY2xBbmRMb2M7CisgIHVzaW5nIEZEQmFzZUluZm8gPSBEZW5zZU1hcEluZm88Y2xhbmc6OkNhbm9uaWNhbERlY2xQdHI8Y2xhbmc6OkZ1bmN0aW9uRGVjbD4+OworCisgIHN0YXRpYyBGdW5jdGlvbkRlY2xBbmRMb2MgZ2V0RW1wdHlLZXkoKSB7CisgICAgcmV0dXJuIHtGREJhc2VJbmZvOjpnZXRFbXB0eUtleSgpLCBjbGFuZzo6U291cmNlTG9jYXRpb24oKX07CisgIH0KKworICBzdGF0aWMgRnVuY3Rpb25EZWNsQW5kTG9jIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4ge0ZEQmFzZUluZm86OmdldFRvbWJzdG9uZUtleSgpLCBjbGFuZzo6U291cmNlTG9jYXRpb24oKX07CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IEZ1bmN0aW9uRGVjbEFuZExvYyAmRkRMKSB7CisgICAgcmV0dXJuIGhhc2hfY29tYmluZShGREJhc2VJbmZvOjpnZXRIYXNoVmFsdWUoRkRMLkZEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZETC5Mb2MuZ2V0UmF3RW5jb2RpbmcoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IEZ1bmN0aW9uRGVjbEFuZExvYyAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uRGVjbEFuZExvYyAmUkhTKSB7CisgICAgcmV0dXJuIExIUy5GRCA9PSBSSFMuRkQgJiYgTEhTLkxvYyA9PSBSSFMuTG9jOworICB9Cit9OworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvU2VtYUNvbnN1bWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL1NlbWFDb25zdW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NjY0NmEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL1NlbWFDb25zdW1lci5oCkBAIC0wLDAgKzEsNDggQEAKKy8vPT09LS0tIFNlbWFDb25zdW1lci5oIC0gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBBU1Qgc2VtYW50aWNzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBTZW1hQ29uc3VtZXIgY2xhc3MsIGEgc3ViY2xhc3Mgb2YKKy8vICBBU1RDb25zdW1lciB0aGF0IGlzIHVzZWQgYnkgQVNUIGNsaWVudHMgdGhhdCBhbHNvIHJlcXVpcmUKKy8vICBhZGRpdGlvbmFsIHNlbWFudGljIGFuYWx5c2lzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fQ0xBTkdfU0VNQV9TRU1BQ09OU1VNRVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NFTUFfU0VNQUNPTlNVTUVSX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb25zdW1lci5oIgorCituYW1lc3BhY2UgY2xhbmcgeworICBjbGFzcyBTZW1hOworCisgIC8vLyBcYnJpZWYgQW4gYWJzdHJhY3QgaW50ZXJmYWNlIHRoYXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5CisgIC8vLyBjbGllbnRzIHRoYXQgcmVhZCBBU1RzIGFuZCB0aGVuIHJlcXVpcmUgZnVydGhlciBzZW1hbnRpYworICAvLy8gYW5hbHlzaXMgb2YgdGhlIGVudGl0aWVzIGluIHRob3NlIEFTVHMuCisgIGNsYXNzIFNlbWFDb25zdW1lciA6IHB1YmxpYyBBU1RDb25zdW1lciB7CisgICAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICBwdWJsaWM6CisgICAgU2VtYUNvbnN1bWVyKCkgeworICAgICAgQVNUQ29uc3VtZXI6OlNlbWFDb25zdW1lciA9IHRydWU7CisgICAgfQorCisgICAgLy8vIFxicmllZiBJbml0aWFsaXplIHRoZSBzZW1hbnRpYyBjb25zdW1lciB3aXRoIHRoZSBTZW1hIGluc3RhbmNlCisgICAgLy8vIGJlaW5nIHVzZWQgdG8gcGVyZm9ybSBzZW1hbnRpYyBhbmFseXNpcyBvbiB0aGUgYWJzdHJhY3Qgc3ludGF4CisgICAgLy8vIHRyZWUuCisgICAgdmlydHVhbCB2b2lkIEluaXRpYWxpemVTZW1hKFNlbWEgJlMpIHt9CisKKyAgICAvLy8gXGJyaWVmIEluZm9ybSB0aGUgc2VtYW50aWMgY29uc3VtZXIgdGhhdCBTZW1hIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuCisgICAgdmlydHVhbCB2b2lkIEZvcmdldFNlbWEoKSB7fQorCisgICAgLy8gaXNhL2Nhc3QvZHluX2Nhc3Qgc3VwcG9ydAorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQVNUQ29uc3VtZXIgKkNvbnN1bWVyKSB7CisgICAgICByZXR1cm4gQ29uc3VtZXItPlNlbWFDb25zdW1lcjsKKyAgICB9CisgIH07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9TZW1hRGlhZ25vc3RpYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9TZW1hRGlhZ25vc3RpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NDBkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL1NlbWFEaWFnbm9zdGljLmgKQEAgLTAsMCArMSwyOCBAQAorLy89PT0tLS0gRGlhZ25vc3RpY1NlbWEuaCAtIERpYWdub3N0aWNzIGZvciBsaWJzZW1hIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NFTUFfU0VNQURJQUdOT1NUSUNfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NFTUFfU0VNQURJQUdOT1NUSUNfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworICBuYW1lc3BhY2UgZGlhZyB7CisgICAgZW51bSB7CisjZGVmaW5lIERJQUcoRU5VTSxGTEFHUyxERUZBVUxUX01BUFBJTkcsREVTQyxHUk9VUCxcCisgICAgICAgICAgICAgU0ZJTkFFLE5PV0VSUk9SLFNIT1dJTlNZU0hFQURFUixDQVRFR09SWSkgRU5VTSwKKyNkZWZpbmUgU0VNQVNUQVJUCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpY1NlbWFLaW5kcy5pbmMiCisjdW5kZWYgRElBRworICAgICAgTlVNX0JVSUxUSU5fU0VNQV9ESUFHTk9TVElDUworICAgIH07CisgIH0gIC8vIGVuZCBuYW1lc3BhY2UgZGlhZworfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvU2VtYUZpeEl0VXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvU2VtYUZpeEl0VXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDNjY2ZiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9TZW1hRml4SXRVdGlscy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8vPT09LS0tIFNlbWFGaXhJdFV0aWxzLmggLSBTZW1hIEZpeEl0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIGhlbHBlciBjbGFzc2VzIGZvciBnZW5lcmF0aW9uIG9mIFNlbWEgRml4SXRIaW50cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX0NMQU5HX1NFTUFfU0VNQUZJWElUVVRJTFNfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NFTUFfU0VNQUZJWElUVVRJTFNfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHIuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworZW51bSBPdmVybG9hZEZpeEl0S2luZCB7CisgIE9GSUtfVW5kZWZpbmVkID0gMCwKKyAgT0ZJS19EZXJlZmVyZW5jZSwKKyAgT0ZJS19UYWtlQWRkcmVzcywKKyAgT0ZJS19SZW1vdmVEZXJlZmVyZW5jZSwKKyAgT0ZJS19SZW1vdmVUYWtlQWRkcmVzcworfTsKKworY2xhc3MgU2VtYTsKKworLy8vIFRoZSBjbGFzcyBmYWNpbGl0aWVzIGdlbmVyYXRpb24gYW5kIHN0b3JhZ2Ugb2YgY29udmVyc2lvbiBGaXhJdHMuIEhpbnRzIGZvcgorLy8vIG5ldyBjb252ZXJzaW9ucyBhcmUgYWRkZWQgdXNpbmcgVHJ5VG9GaXhDb252ZXJzaW9uIG1ldGhvZC4gVGhlIGRlZmF1bHQgdHlwZQorLy8vIGNvbnZlcnNpb24gY2hlY2tlciBjYW4gYmUgcmVzZXQuCitzdHJ1Y3QgQ29udmVyc2lvbkZpeEl0R2VuZXJhdG9yIHsKKyAgLy8vIFBlcmZvcm1zIGEgc2ltcGxlIGNoZWNrIHRvIHNlZSBpZiBGcm9tIHR5cGUgY2FuIGJlIGNvbnZlcnRlZCB0byBUbyB0eXBlLgorICBzdGF0aWMgYm9vbCBjb21wYXJlVHlwZXNTaW1wbGUoQ2FuUXVhbFR5cGUgRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhblF1YWxUeXBlIFRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYSAmUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJWYWx1ZUtpbmQgRnJvbVZLKTsKKworICAvLy8gVGhlIGxpc3Qgb2YgSGludHMgZ2VuZXJhdGVkIHNvIGZhci4KKyAgc3RkOjp2ZWN0b3I8Rml4SXRIaW50PiBIaW50czsKKworICAvLy8gVGhlIG51bWJlciBvZiBDb252ZXJzaW9ucyBmaXhlZC4gVGhpcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gdGhlIHNpemUKKyAgLy8vIG9mIHRoZSBIaW50cyB2ZWN0b3Igc2luY2Ugd2UgYWxsb3cgbXVsdGlwbGUgRml4SXRzIHBlciBjb252ZXJzaW9uLgorICB1bnNpZ25lZCBOdW1Db252ZXJzaW9uc0ZpeGVkOworCisgIC8vLyBUaGUgdHlwZSBvZiBmaXggYXBwbGllZC4gSWYgbXVsdGlwbGUgY29udmVyc2lvbnMgYXJlIGZpeGVkLCBjb3JyZXNwb25kcworICAvLy8gdG8gdGhlIGtpZCBvZiB0aGUgdmVyeSBmaXJzdCBjb252ZXJzaW9uLgorICBPdmVybG9hZEZpeEl0S2luZCBLaW5kOworCisgIHR5cGVkZWYgYm9vbCAoKlR5cGVDb21wYXJpc29uRnVuY1R5KSAoY29uc3QgQ2FuUXVhbFR5cGUgRnJvbVR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhblF1YWxUeXBlIFRvVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYSAmUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwclZhbHVlS2luZCBGcm9tVkspOworICAvLy8gVGhlIHR5cGUgY29tcGFyaXNvbiBmdW5jdGlvbiB1c2VkIHRvIGRlY2lkZSBpZiBleHByZXNzaW9uIEZyb21FeHByIG9mCisgIC8vLyB0eXBlIEZyb21UeSBjYW4gYmUgY29udmVydGVkIHRvIFRvVHkuIEZvciBleGFtcGxlLCBvbmUgY291bGQgY2hlY2sgaWYKKyAgLy8vIGFuIGltcGxpY2l0IGNvbnZlcnNpb24gZXhpc3RzLiBSZXR1cm5zIHRydWUgaWYgY29tcGFyaXNvbiBleGlzdHMuCisgIFR5cGVDb21wYXJpc29uRnVuY1R5IENvbXBhcmVUeXBlczsKKworICBDb252ZXJzaW9uRml4SXRHZW5lcmF0b3IoVHlwZUNvbXBhcmlzb25GdW5jVHkgRm9vKTogTnVtQ29udmVyc2lvbnNGaXhlZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtpbmQoT0ZJS19VbmRlZmluZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFyZVR5cGVzKEZvbykge30KKworICBDb252ZXJzaW9uRml4SXRHZW5lcmF0b3IoKTogTnVtQ29udmVyc2lvbnNGaXhlZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtpbmQoT0ZJS19VbmRlZmluZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFyZVR5cGVzKGNvbXBhcmVUeXBlc1NpbXBsZSkge30KKworICAvLy8gUmVzZXRzIHRoZSBkZWZhdWx0IGNvbnZlcnNpb24gY2hlY2tlciBtZXRob2QuCisgIHZvaWQgc2V0Q29udmVyc2lvbkNoZWNrZXIoVHlwZUNvbXBhcmlzb25GdW5jVHkgRm9vKSB7CisgICAgQ29tcGFyZVR5cGVzID0gRm9vOworICB9CisKKyAgLy8vIElmIHBvc3NpYmxlLCBnZW5lcmF0ZXMgYW5kIHN0b3JlcyBhIGZpeCBmb3IgdGhlIGdpdmVuIGNvbnZlcnNpb24uCisgIGJvb2wgdHJ5VG9GaXhDb252ZXJzaW9uKGNvbnN0IEV4cHIgKkZyb21FeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRdWFsVHlwZSBGcm9tUVR5LCBjb25zdCBRdWFsVHlwZSBUb1FUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYSAmUyk7CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBIaW50cy5jbGVhcigpOworICAgIE51bUNvbnZlcnNpb25zRml4ZWQgPSAwOworICB9CisKKyAgYm9vbCBpc051bGwoKSB7CisgICAgcmV0dXJuIChOdW1Db252ZXJzaW9uc0ZpeGVkID09IDApOworICB9Cit9OworCit9IC8vIGVuZG9mIG5hbWVzcGFjZSBjbGFuZworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL1NlbWFJbnRlcm5hbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9TZW1hSW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGMyMTViCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9TZW1hSW50ZXJuYWwuaApAQCAtMCwwICsxLDM1MSBAQAorLy89PT0tLS0gU2VtYUludGVybmFsLmggLSBJbnRlcm5hbCBTZW1hIEludGVyZmFjZXMgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgY29tbW9uIEFQSSBhbmQgI2luY2x1ZGVzIGZvciB0aGUgaW50ZXJuYWwKKy8vIGltcGxlbWVudGF0aW9uIG9mIFNlbWEuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NFTUFfU0VNQUlOVEVSTkFMX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TRU1BX1NFTUFJTlRFUk5BTF9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgorI2luY2x1ZGUgImNsYW5nL1NlbWEvTG9va3VwLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9TZW1hLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9TZW1hRGlhZ25vc3RpYy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCitpbmxpbmUgUGFydGlhbERpYWdub3N0aWMgU2VtYTo6UERpYWcodW5zaWduZWQgRGlhZ0lEKSB7CisgIHJldHVybiBQYXJ0aWFsRGlhZ25vc3RpYyhEaWFnSUQsIENvbnRleHQuZ2V0RGlhZ0FsbG9jYXRvcigpKTsKK30KKworaW5saW5lIGJvb2wKK0ZUSUhhc1NpbmdsZVZvaWRQYXJhbWV0ZXIoY29uc3QgRGVjbGFyYXRvckNodW5rOjpGdW5jdGlvblR5cGVJbmZvICZGVEkpIHsKKyAgcmV0dXJuIEZUSS5OdW1QYXJhbXMgPT0gMSAmJiAhRlRJLmlzVmFyaWFkaWMgJiYKKyAgICAgICAgIEZUSS5QYXJhbXNbMF0uSWRlbnQgPT0gbnVsbHB0ciAmJiBGVEkuUGFyYW1zWzBdLlBhcmFtICYmCisgICAgICAgICBjYXN0PFBhcm1WYXJEZWNsPihGVEkuUGFyYW1zWzBdLlBhcmFtKS0+Z2V0VHlwZSgpLT5pc1ZvaWRUeXBlKCk7Cit9CisKK2lubGluZSBib29sCitGVElIYXNOb25Wb2lkUGFyYW1ldGVycyhjb25zdCBEZWNsYXJhdG9yQ2h1bms6OkZ1bmN0aW9uVHlwZUluZm8gJkZUSSkgeworICAvLyBBc3N1bWUgRlRJIGlzIHdlbGwtZm9ybWVkLgorICByZXR1cm4gRlRJLk51bVBhcmFtcyAmJiAhRlRJSGFzU2luZ2xlVm9pZFBhcmFtZXRlcihGVEkpOworfQorCisvLyBUaGlzIHJlcXVpcmVzIHRoZSB2YXJpYWJsZSB0byBiZSBub24tZGVwZW5kZW50IGFuZCB0aGUgaW5pdGlhbGl6ZXIKKy8vIHRvIG5vdCBiZSB2YWx1ZSBkZXBlbmRlbnQuCitpbmxpbmUgYm9vbCBJc1ZhcmlhYmxlQUNvbnN0YW50RXhwcmVzc2lvbihWYXJEZWNsICpWYXIsIEFTVENvbnRleHQgJkNvbnRleHQpIHsKKyAgY29uc3QgVmFyRGVjbCAqRGVmVkQgPSBudWxscHRyOworICByZXR1cm4gIWlzYTxQYXJtVmFyRGVjbD4oVmFyKSAmJgorICAgIFZhci0+aXNVc2FibGVJbkNvbnN0YW50RXhwcmVzc2lvbnMoQ29udGV4dCkgJiYKKyAgICBWYXItPmdldEFueUluaXRpYWxpemVyKERlZlZEKSAmJiBEZWZWRC0+Y2hlY2tJbml0SXNJQ0UoKTsgCit9CisKKy8vIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayB3aGV0aGVyIEQncyBhdHRyaWJ1dGVzIG1hdGNoIGN1cnJlbnQgQ1VEQSBtb2RlLgorLy8gRGVjbHMgd2l0aCBtaXNtYXRjaGVkIGF0dHJpYnV0ZXMgYW5kIHJlbGF0ZWQgZGlhZ25vc3RpY3MgbWF5IGhhdmUgdG8gYmUKKy8vIGlnbm9yZWQgZHVyaW5nIHRoaXMgQ1VEQSBjb21waWxhdGlvbiBwYXNzLgoraW5saW5lIGJvb2wgRGVjbEF0dHJzTWF0Y2hDVURBTW9kZShjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsIERlY2wgKkQpIHsKKyAgaWYgKCFMYW5nT3B0cy5DVURBIHx8ICFEKQorICAgIHJldHVybiB0cnVlOworICBib29sIGlzRGV2aWNlU2lkZURlY2wgPSBELT5oYXNBdHRyPENVREFEZXZpY2VBdHRyPigpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIEQtPmhhc0F0dHI8Q1VEQVNoYXJlZEF0dHI+KCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRC0+aGFzQXR0cjxDVURBR2xvYmFsQXR0cj4oKTsKKyAgcmV0dXJuIGlzRGV2aWNlU2lkZURlY2wgPT0gTGFuZ09wdHMuQ1VEQUlzRGV2aWNlOworfQorCisvLyBEaXJlY3RseSBtYXJrIGEgdmFyaWFibGUgb2RyLXVzZWQuIEdpdmVuIGEgY2hvaWNlLCBwcmVmZXIgdG8gdXNlIAorLy8gTWFya1ZhcmlhYmxlUmVmZXJlbmNlZCBzaW5jZSBpdCBkb2VzIGFkZGl0aW9uYWwgY2hlY2tzIGFuZCB0aGVuIAorLy8gY2FsbHMgTWFya1ZhckRlY2xPRFJVc2VkLgorLy8gSWYgdGhlIHZhcmlhYmxlIG11c3QgYmUgY2FwdHVyZWQ6CisvLyAgLSBpZiBGdW5jdGlvblNjb3BlSW5kZXhUb1N0b3BBdCBpcyBudWxsLCBjYXB0dXJlIGl0IGluIHRoZSBDdXJDb250ZXh0CisvLyAgLSBlbHNlIGNhcHR1cmUgaXQgaW4gdGhlIERlY2xDb250ZXh0IHRoYXQgbWFwcyB0byB0aGUgCisvLyAgICAqRnVuY3Rpb25TY29wZUluZGV4VG9TdG9wQXQgb24gdGhlIEZ1bmN0aW9uU2NvcGVJbmZvIHN0YWNrLiAgCitpbmxpbmUgdm9pZCBNYXJrVmFyRGVjbE9EUlVzZWQoVmFyRGVjbCAqVmFyLAorICAgIFNvdXJjZUxvY2F0aW9uIExvYywgU2VtYSAmU2VtYVJlZiwKKyAgICBjb25zdCB1bnNpZ25lZCAqY29uc3QgRnVuY3Rpb25TY29wZUluZGV4VG9TdG9wQXQpIHsKKyAgLy8gS2VlcCB0cmFjayBvZiB1c2VkIGJ1dCB1bmRlZmluZWQgdmFyaWFibGVzLgorICAvLyBGSVhNRTogV2Ugc2hvdWxkbid0IHN1cHByZXNzIHRoaXMgd2FybmluZyBmb3Igc3RhdGljIGRhdGEgbWVtYmVycy4KKyAgaWYgKFZhci0+aGFzRGVmaW5pdGlvbihTZW1hUmVmLkNvbnRleHQpID09IFZhckRlY2w6OkRlY2xhcmF0aW9uT25seSAmJgorICAgICAgKCFWYXItPmlzRXh0ZXJuYWxseVZpc2libGUoKSB8fCBWYXItPmlzSW5saW5lKCkgfHwKKyAgICAgICBTZW1hUmVmLmlzRXh0ZXJuYWxXaXRoTm9MaW5rYWdlVHlwZShWYXIpKSAmJgorICAgICAgIShWYXItPmlzU3RhdGljRGF0YU1lbWJlcigpICYmIFZhci0+aGFzSW5pdCgpKSkgeworICAgIFNvdXJjZUxvY2F0aW9uICZvbGQgPSBTZW1hUmVmLlVuZGVmaW5lZEJ1dFVzZWRbVmFyLT5nZXRDYW5vbmljYWxEZWNsKCldOworICAgIGlmIChvbGQuaXNJbnZhbGlkKCkpCisgICAgICBvbGQgPSBMb2M7CisgIH0KKyAgUXVhbFR5cGUgQ2FwdHVyZVR5cGUsIERlY2xSZWZUeXBlOworICBTZW1hUmVmLnRyeUNhcHR1cmVWYXJpYWJsZShWYXIsIExvYywgU2VtYTo6VHJ5Q2FwdHVyZV9JbXBsaWNpdCwgCisgICAgLypFbGxpcHNpc0xvYyovIFNvdXJjZUxvY2F0aW9uKCksCisgICAgLypCdWlsZEFuZERpYWdub3NlKi8gdHJ1ZSwgCisgICAgQ2FwdHVyZVR5cGUsIERlY2xSZWZUeXBlLCAKKyAgICBGdW5jdGlvblNjb3BlSW5kZXhUb1N0b3BBdCk7CisKKyAgVmFyLT5tYXJrVXNlZChTZW1hUmVmLkNvbnRleHQpOworfQorCisvLy8gUmV0dXJuIGEgRExMIGF0dHJpYnV0ZSBmcm9tIHRoZSBkZWNsYXJhdGlvbi4KK2lubGluZSBJbmhlcml0YWJsZUF0dHIgKmdldERMTEF0dHIoRGVjbCAqRCkgeworICBhc3NlcnQoIShELT5oYXNBdHRyPERMTEltcG9ydEF0dHI+KCkgJiYgRC0+aGFzQXR0cjxETExFeHBvcnRBdHRyPigpKSAmJgorICAgICAgICAgIkEgZGVjbGFyYXRpb24gY2Fubm90IGJlIGJvdGggZGxsaW1wb3J0IGFuZCBkbGxleHBvcnQuIik7CisgIGlmIChhdXRvICpJbXBvcnQgPSBELT5nZXRBdHRyPERMTEltcG9ydEF0dHI+KCkpCisgICAgcmV0dXJuIEltcG9ydDsKKyAgaWYgKGF1dG8gKkV4cG9ydCA9IEQtPmdldEF0dHI8RExMRXhwb3J0QXR0cj4oKSkKKyAgICByZXR1cm4gRXhwb3J0OworICByZXR1cm4gbnVsbHB0cjsKK30KKworY2xhc3MgVHlwb0NvcnJlY3Rpb25Db25zdW1lciA6IHB1YmxpYyBWaXNpYmxlRGVjbENvbnN1bWVyIHsKKyAgdHlwZWRlZiBTbWFsbFZlY3RvcjxUeXBvQ29ycmVjdGlvbiwgMT4gVHlwb1Jlc3VsdExpc3Q7CisgIHR5cGVkZWYgbGx2bTo6U3RyaW5nTWFwPFR5cG9SZXN1bHRMaXN0PiBUeXBvUmVzdWx0c01hcDsKKyAgdHlwZWRlZiBzdGQ6Om1hcDx1bnNpZ25lZCwgVHlwb1Jlc3VsdHNNYXA+IFR5cG9FZGl0RGlzdGFuY2VNYXA7CisKK3B1YmxpYzoKKyAgVHlwb0NvcnJlY3Rpb25Db25zdW1lcihTZW1hICZTZW1hUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJlR5cG9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWE6Okxvb2t1cE5hbWVLaW5kIExvb2t1cEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU2NvcGUgKlMsIENYWFNjb3BlU3BlYyAqU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENvcnJlY3Rpb25DYW5kaWRhdGVDYWxsYmFjaz4gQ0NDLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpNZW1iZXJDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRW50ZXJpbmdDb250ZXh0KQorICAgICAgOiBUeXBvKFR5cG9OYW1lLmdldE5hbWUoKS5nZXRBc0lkZW50aWZpZXJJbmZvKCkpLCBDdXJyZW50VENJbmRleCgwKSwKKyAgICAgICAgU2F2ZWRUQ0luZGV4KDApLCBTZW1hUmVmKFNlbWFSZWYpLCBTKFMpLAorICAgICAgICBTUyhTUyA/IGxsdm06Om1ha2VfdW5pcXVlPENYWFNjb3BlU3BlYz4oKlNTKSA6IG51bGxwdHIpLAorICAgICAgICBDb3JyZWN0aW9uVmFsaWRhdG9yKHN0ZDo6bW92ZShDQ0MpKSwgTWVtYmVyQ29udGV4dChNZW1iZXJDb250ZXh0KSwKKyAgICAgICAgUmVzdWx0KFNlbWFSZWYsIFR5cG9OYW1lLCBMb29rdXBLaW5kKSwKKyAgICAgICAgTmFtZXNwYWNlcyhTZW1hUmVmLkNvbnRleHQsIFNlbWFSZWYuQ3VyQ29udGV4dCwgU1MpLAorICAgICAgICBFbnRlcmluZ0NvbnRleHQoRW50ZXJpbmdDb250ZXh0KSwgU2VhcmNoTmFtZXNwYWNlcyhmYWxzZSkgeworICAgIFJlc3VsdC5zdXBwcmVzc0RpYWdub3N0aWNzKCk7CisgICAgLy8gQXJyYW5nZSBmb3IgVmFsaWRhdGVkQ29ycmVjdGlvbnNbMF0gdG8gYWx3YXlzIGJlIGFuIGVtcHR5IGNvcnJlY3Rpb24uCisgICAgVmFsaWRhdGVkQ29ycmVjdGlvbnMucHVzaF9iYWNrKFR5cG9Db3JyZWN0aW9uKCkpOworICB9CisKKyAgYm9vbCBpbmNsdWRlSGlkZGVuRGVjbHMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8gTWV0aG9kcyBmb3IgYWRkaW5nIHBvdGVudGlhbCBjb3JyZWN0aW9ucyB0byB0aGUgY29uc3VtZXIuCisgIHZvaWQgRm91bmREZWNsKE5hbWVkRGVjbCAqTkQsIE5hbWVkRGVjbCAqSGlkaW5nLCBEZWNsQ29udGV4dCAqQ3R4LAorICAgICAgICAgICAgICAgICBib29sIEluQmFzZUNsYXNzKSBvdmVycmlkZTsKKyAgdm9pZCBGb3VuZE5hbWUoU3RyaW5nUmVmIE5hbWUpOworICB2b2lkIGFkZEtleXdvcmRSZXN1bHQoU3RyaW5nUmVmIEtleXdvcmQpOworICB2b2lkIGFkZENvcnJlY3Rpb24oVHlwb0NvcnJlY3Rpb24gQ29ycmVjdGlvbik7CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29ycmVjdGlvblJlc3VsdHMuZW1wdHkoKSAmJiBWYWxpZGF0ZWRDb3JyZWN0aW9ucy5zaXplKCkgPT0gMTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBsaXN0IG9mIFR5cG9Db3JyZWN0aW9ucyBmb3IgdGhlIGdpdmVuIGlkZW50aWZpZXIgZnJvbQorICAvLy8gdGhlIHNldCBvZiBjb3JyZWN0aW9ucyB0aGF0IGhhdmUgdGhlIGNsb3Nlc3QgZWRpdCBkaXN0YW5jZSwgaWYgYW55LgorICBUeXBvUmVzdWx0TGlzdCAmb3BlcmF0b3JbXShTdHJpbmdSZWYgTmFtZSkgeworICAgIHJldHVybiBDb3JyZWN0aW9uUmVzdWx0cy5iZWdpbigpLT5zZWNvbmRbTmFtZV07CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZWRpdCBkaXN0YW5jZSBvZiB0aGUgY29ycmVjdGlvbnMgdGhhdCBoYXZlIHRoZQorICAvLy8gY2xvc2VzdC9iZXN0IGVkaXQgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luYWwgdHlwb3AuCisgIHVuc2lnbmVkIGdldEJlc3RFZGl0RGlzdGFuY2UoYm9vbCBOb3JtYWxpemVkKSB7CisgICAgaWYgKENvcnJlY3Rpb25SZXN1bHRzLmVtcHR5KCkpCisgICAgICByZXR1cm4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgpKCk7CisKKyAgICB1bnNpZ25lZCBCZXN0RUQgPSBDb3JyZWN0aW9uUmVzdWx0cy5iZWdpbigpLT5maXJzdDsKKyAgICByZXR1cm4gTm9ybWFsaXplZCA/IFR5cG9Db3JyZWN0aW9uOjpOb3JtYWxpemVFZGl0RGlzdGFuY2UoQmVzdEVEKSA6IEJlc3RFRDsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0LXVwIG1ldGhvZCB0byBhZGQgdG8gdGhlIGNvbnN1bWVyIHRoZSBzZXQgb2YgbmFtZXNwYWNlcyB0byB1c2UKKyAgLy8vIGluIHBlcmZvcm1pbmcgY29ycmVjdGlvbnMgdG8gbmVzdGVkIG5hbWUgc3BlY2lmaWVycy4gVGhpcyBtZXRob2QgYWxzbworICAvLy8gaW1wbGljaXRseSBhZGRzIGFsbCBvZiB0aGUga25vd24gY2xhc3NlcyBpbiB0aGUgY3VycmVudCBBU1QgY29udGV4dCB0byB0aGUKKyAgLy8vIHRvIHRoZSBjb25zdW1lciBmb3IgY29ycmVjdGluZyBuZXN0ZWQgbmFtZSBzcGVjaWZpZXJzLgorICB2b2lkCisgIGFkZE5hbWVzcGFjZXMoY29uc3QgbGx2bTo6TWFwVmVjdG9yPE5hbWVzcGFjZURlY2wgKiwgYm9vbD4gJktub3duTmFtZXNwYWNlcyk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG5leHQgdHlwbyBjb3JyZWN0aW9uIHRoYXQgcGFzc2VzIGFsbCBpbnRlcm5hbCBmaWx0ZXJzCisgIC8vLyBhbmQgaXMgZGVlbWVkIHZhbGlkIGJ5IHRoZSBjb25zdW1lcidzIENvcnJlY3Rpb25DYW5kaWRhdGVDYWxsYmFjaywKKyAgLy8vIHN0YXJ0aW5nIHdpdGggdGhlIGNvcnJlY3Rpb25zIHRoYXQgaGF2ZSB0aGUgY2xvc2VzdCBlZGl0IGRpc3RhbmNlLiBBbgorICAvLy8gZW1wdHkgVHlwb0NvcnJlY3Rpb24gaXMgcmV0dXJuZWQgb25jZSBubyBtb3JlIHZpYWJsZSBjb3JyZWN0aW9ucyByZW1haW4KKyAgLy8vIGluIHRoZSBjb25zdW1lci4KKyAgY29uc3QgVHlwb0NvcnJlY3Rpb24gJmdldE5leHRDb3JyZWN0aW9uKCk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGxhc3QgY29ycmVjdGlvbiByZXR1cm5lZCBieSBnZXROZXh0Q29ycmVjdGlvbigpLgorICBjb25zdCBUeXBvQ29ycmVjdGlvbiAmZ2V0Q3VycmVudENvcnJlY3Rpb24oKSB7CisgICAgcmV0dXJuIEN1cnJlbnRUQ0luZGV4IDwgVmFsaWRhdGVkQ29ycmVjdGlvbnMuc2l6ZSgpCisgICAgICAgICAgICAgICA/IFZhbGlkYXRlZENvcnJlY3Rpb25zW0N1cnJlbnRUQ0luZGV4XQorICAgICAgICAgICAgICAgOiBWYWxpZGF0ZWRDb3JyZWN0aW9uc1swXTsgIC8vIFRoZSBlbXB0eSBjb3JyZWN0aW9uLgorICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG5leHQgdHlwbyBjb3JyZWN0aW9uIGxpa2UgZ2V0TmV4dENvcnJlY3Rpb24sIGJ1dCBrZWVwCisgIC8vLyB0aGUgaW50ZXJuYWwgc3RhdGUgcG9pbnRlZCB0byB0aGUgY3VycmVudCBjb3JyZWN0aW9uIChpLmUuIHRoZSBuZXh0IHRpbWUKKyAgLy8vIGdldE5leHRDb3JyZWN0aW9uIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gdGhlIHNhbWUgY29ycmVjdGlvbiByZXR1cm5lZAorICAvLy8gYnkgcGVla05leHRjb3JyZWN0aW9uKS4KKyAgY29uc3QgVHlwb0NvcnJlY3Rpb24gJnBlZWtOZXh0Q29ycmVjdGlvbigpIHsKKyAgICBhdXRvIEN1cnJlbnQgPSBDdXJyZW50VENJbmRleDsKKyAgICBjb25zdCBUeXBvQ29ycmVjdGlvbiAmVEMgPSBnZXROZXh0Q29ycmVjdGlvbigpOworICAgIEN1cnJlbnRUQ0luZGV4ID0gQ3VycmVudDsKKyAgICByZXR1cm4gVEM7CisgIH0KKworICAvLy8gXGJyaWVmIFJlc2V0IHRoZSBjb25zdW1lcidzIHBvc2l0aW9uIGluIHRoZSBzdHJlYW0gb2YgdmlhYmxlIGNvcnJlY3Rpb25zCisgIC8vLyAoaS5lLiBnZXROZXh0Q29ycmVjdGlvbigpIHdpbGwgcmV0dXJuIGVhY2ggb2YgdGhlIHByZXZpb3VzbHkgcmV0dXJuZWQKKyAgLy8vIGNvcnJlY3Rpb25zIGluIG9yZGVyIGJlZm9yZSByZXR1cm5pbmcgYW55IG5ldyBjb3JyZWN0aW9ucykuCisgIHZvaWQgcmVzZXRDb3JyZWN0aW9uU3RyZWFtKCkgeworICAgIEN1cnJlbnRUQ0luZGV4ID0gMDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHdoZXRoZXIgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIG9mIGNvcnJlY3Rpb25zIGhhcyBiZWVuCisgIC8vLyByZWFjaGVkLgorICBib29sIGZpbmlzaGVkKCkgeworICAgIHJldHVybiBDb3JyZWN0aW9uUmVzdWx0cy5lbXB0eSgpICYmCisgICAgICAgICAgIEN1cnJlbnRUQ0luZGV4ID49IFZhbGlkYXRlZENvcnJlY3Rpb25zLnNpemUoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2F2ZSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgY29ycmVjdGlvbiBzdHJlYW0gKG92ZXJ3cml0aW5nIGFueQorICAvLy8gcHJldmlvdXNseSBzYXZlZCBwb3NpdGlvbikuCisgIHZvaWQgc2F2ZUN1cnJlbnRQb3NpdGlvbigpIHsKKyAgICBTYXZlZFRDSW5kZXggPSBDdXJyZW50VENJbmRleDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVzdG9yZSB0aGUgc2F2ZWQgcG9zaXRpb24gaW4gdGhlIGNvcnJlY3Rpb24gc3RyZWFtLgorICB2b2lkIHJlc3RvcmVTYXZlZFBvc2l0aW9uKCkgeworICAgIEN1cnJlbnRUQ0luZGV4ID0gU2F2ZWRUQ0luZGV4OworICB9CisKKyAgQVNUQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIFNlbWFSZWYuQ29udGV4dDsgfQorICBjb25zdCBMb29rdXBSZXN1bHQgJmdldExvb2t1cFJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuIFJlc3VsdDsgfQorCisgIGJvb2wgaXNBZGRyZXNzT2ZPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gQ29ycmVjdGlvblZhbGlkYXRvci0+SXNBZGRyZXNzT2ZPcGVyYW5kOyB9CisgIGNvbnN0IENYWFNjb3BlU3BlYyAqZ2V0U1MoKSBjb25zdCB7IHJldHVybiBTUy5nZXQoKTsgfQorICBTY29wZSAqZ2V0U2NvcGUoKSBjb25zdCB7IHJldHVybiBTOyB9CisgIENvcnJlY3Rpb25DYW5kaWRhdGVDYWxsYmFjayAqZ2V0Q29ycmVjdGlvblZhbGlkYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29ycmVjdGlvblZhbGlkYXRvci5nZXQoKTsKKyAgfQorCitwcml2YXRlOgorICBjbGFzcyBOYW1lc3BhY2VTcGVjaWZpZXJTZXQgeworICAgIHN0cnVjdCBTcGVjaWZpZXJJbmZvIHsKKyAgICAgIERlY2xDb250ZXh0KiBEZWNsQ3R4OworICAgICAgTmVzdGVkTmFtZVNwZWNpZmllciogTmFtZVNwZWNpZmllcjsKKyAgICAgIHVuc2lnbmVkIEVkaXREaXN0YW5jZTsKKyAgICB9OworCisgICAgdHlwZWRlZiBTbWFsbFZlY3RvcjxEZWNsQ29udGV4dCosIDQ+IERlY2xDb250ZXh0TGlzdDsKKyAgICB0eXBlZGVmIFNtYWxsVmVjdG9yPFNwZWNpZmllckluZm8sIDE2PiBTcGVjaWZpZXJJbmZvTGlzdDsKKworICAgIEFTVENvbnRleHQgJkNvbnRleHQ7CisgICAgRGVjbENvbnRleHRMaXN0IEN1ckNvbnRleHRDaGFpbjsKKyAgICBzdGQ6OnN0cmluZyBDdXJOYW1lU3BlY2lmaWVyOworICAgIFNtYWxsVmVjdG9yPGNvbnN0IElkZW50aWZpZXJJbmZvKiwgND4gQ3VyQ29udGV4dElkZW50aWZpZXJzOworICAgIFNtYWxsVmVjdG9yPGNvbnN0IElkZW50aWZpZXJJbmZvKiwgND4gQ3VyTmFtZVNwZWNpZmllcklkZW50aWZpZXJzOworCisgICAgc3RkOjptYXA8dW5zaWduZWQsIFNwZWNpZmllckluZm9MaXN0PiBEaXN0YW5jZU1hcDsKKworICAgIC8vLyBcYnJpZWYgSGVscGVyIGZvciBidWlsZGluZyB0aGUgbGlzdCBvZiBEZWNsQ29udGV4dHMgYmV0d2VlbiB0aGUgY3VycmVudAorICAgIC8vLyBjb250ZXh0IGFuZCB0aGUgdG9wIG9mIHRoZSB0cmFuc2xhdGlvbiB1bml0CisgICAgc3RhdGljIERlY2xDb250ZXh0TGlzdCBidWlsZENvbnRleHRDaGFpbihEZWNsQ29udGV4dCAqU3RhcnQpOworCisgICAgdW5zaWduZWQgYnVpbGROZXN0ZWROYW1lU3BlY2lmaWVyKERlY2xDb250ZXh0TGlzdCAmRGVjbENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyIComTk5TKTsKKworICAgcHVibGljOgorICAgIE5hbWVzcGFjZVNwZWNpZmllclNldChBU1RDb250ZXh0ICZDb250ZXh0LCBEZWNsQ29udGV4dCAqQ3VyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYU2NvcGVTcGVjICpDdXJTY29wZVNwZWMpOworCisgICAgLy8vIFxicmllZiBBZGQgdGhlIERlY2xDb250ZXh0IChhIG5hbWVzcGFjZSBvciByZWNvcmQpIHRvIHRoZSBzZXQsIGNvbXB1dGluZworICAgIC8vLyB0aGUgY29ycmVzcG9uZGluZyBOZXN0ZWROYW1lU3BlY2lmaWVyIGFuZCBpdHMgZGlzdGFuY2UgaW4gdGhlIHByb2Nlc3MuCisgICAgdm9pZCBhZGROYW1lU3BlY2lmaWVyKERlY2xDb250ZXh0ICpDdHgpOworCisgICAgLy8vIFxicmllZiBQcm92aWRlcyBmbGF0IGl0ZXJhdGlvbiBvdmVyIHNwZWNpZmllcnMsIHNvcnRlZCBieSBkaXN0YW5jZS4KKyAgICBjbGFzcyBpdGVyYXRvcgorICAgICAgICA6IHB1YmxpYyBsbHZtOjppdGVyYXRvcl9mYWNhZGVfYmFzZTxpdGVyYXRvciwgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVySW5mbz4geworICAgICAgLy8vIEFsd2F5cyBwb2ludHMgdG8gdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgZGlzdGFuY2UgbWFwLgorICAgICAgY29uc3Qgc3RkOjptYXA8dW5zaWduZWQsIFNwZWNpZmllckluZm9MaXN0Pjo6aXRlcmF0b3IgT3V0ZXJCYWNrOworICAgICAgLy8vIEl0ZXJhdG9yIG9uIHRoZSBkaXN0YW5jZSBtYXAuCisgICAgICBzdGQ6Om1hcDx1bnNpZ25lZCwgU3BlY2lmaWVySW5mb0xpc3Q+OjppdGVyYXRvciBPdXRlcjsKKyAgICAgIC8vLyBJdGVyYXRvciBvbiBhbiBlbGVtZW50IGluIHRoZSBkaXN0YW5jZSBtYXAuCisgICAgICBTcGVjaWZpZXJJbmZvTGlzdDo6aXRlcmF0b3IgSW5uZXI7CisKKyAgICBwdWJsaWM6CisgICAgICBpdGVyYXRvcihOYW1lc3BhY2VTcGVjaWZpZXJTZXQgJlNldCwgYm9vbCBJc0F0RW5kKQorICAgICAgICAgIDogT3V0ZXJCYWNrKHN0ZDo6cHJldihTZXQuRGlzdGFuY2VNYXAuZW5kKCkpKSwKKyAgICAgICAgICAgIE91dGVyKFNldC5EaXN0YW5jZU1hcC5iZWdpbigpKSwKKyAgICAgICAgICAgIElubmVyKCFJc0F0RW5kID8gT3V0ZXItPnNlY29uZC5iZWdpbigpIDogT3V0ZXJCYWNrLT5zZWNvbmQuZW5kKCkpIHsKKyAgICAgICAgYXNzZXJ0KCFTZXQuRGlzdGFuY2VNYXAuZW1wdHkoKSk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgICAgICArK0lubmVyOworICAgICAgICBpZiAoSW5uZXIgPT0gT3V0ZXItPnNlY29uZC5lbmQoKSAmJiBPdXRlciAhPSBPdXRlckJhY2spIHsKKyAgICAgICAgICArK091dGVyOworICAgICAgICAgIElubmVyID0gT3V0ZXItPnNlY29uZC5iZWdpbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgU3BlY2lmaWVySW5mbyAmb3BlcmF0b3IqKCkgeyByZXR1cm4gKklubmVyOyB9CisgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3IgJlJIUykgY29uc3QgeyByZXR1cm4gSW5uZXIgPT0gUkhTLklubmVyOyB9CisgICAgfTsKKworICAgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIC8qSXNBdEVuZD0qL2ZhbHNlKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCAvKklzQXRFbmQ9Ki90cnVlKTsgfQorICB9OworCisgIHZvaWQgYWRkTmFtZShTdHJpbmdSZWYgTmFtZSwgTmFtZWREZWNsICpORCwKKyAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUyA9IG51bGxwdHIsIGJvb2wgaXNLZXl3b3JkID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgRmluZCBhbnkgdmlzaWJsZSBkZWNscyBmb3IgdGhlIGdpdmVuIHR5cG8gY29ycmVjdGlvbiBjYW5kaWRhdGUuCisgIC8vLyBJZiBub25lIGFyZSBmb3VuZCwgaXQgdG8gdGhlIHNldCBvZiBjYW5kaWRhdGVzIGZvciB3aGljaCBxdWFsaWZpZWQgbG9va3VwcworICAvLy8gd2lsbCBiZSBwZXJmb3JtZWQgdG8gZmluZCBwb3NzaWJsZSBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIgY2hhbmdlcy4KKyAgYm9vbCByZXNvbHZlQ29ycmVjdGlvbihUeXBvQ29ycmVjdGlvbiAmQ2FuZGlkYXRlKTsKKworICAvLy8gXGJyaWVmIFBlcmZvcm0gcXVhbGlmaWVkIGxvb2t1cHMgb24gdGhlIHF1ZXVlZCBzZXQgb2YgdHlwbyBjb3JyZWN0aW9uCisgIC8vLyBjYW5kaWRhdGVzIGFuZCBhZGQgdGhlIG5lc3RlZCBuYW1lIHNwZWNpZmllciBjaGFuZ2VzIHRvIGVhY2ggY2FuZGlkYXRlIGlmCisgIC8vLyBhIGxvb2t1cCBzdWNjZWVkcyAoYXQgd2hpY2ggcG9pbnQgdGhlIGNhbmRpZGF0ZSB3aWxsIGJlIHJldHVybmVkIHRvIHRoZQorICAvLy8gbWFpbiBwb29sIG9mIHBvdGVudGlhbCBjb3JyZWN0aW9ucykuCisgIHZvaWQgcGVyZm9ybVF1YWxpZmllZExvb2t1cHMoKTsKKworICAvLy8gXGJyaWVmIFRoZSBuYW1lIHdyaXR0ZW4gdGhhdCBpcyBhIHR5cG8gaW4gdGhlIHNvdXJjZS4KKyAgSWRlbnRpZmllckluZm8gKlR5cG87CisKKyAgLy8vIFxicmllZiBUaGUgcmVzdWx0cyBmb3VuZCB0aGF0IGhhdmUgdGhlIHNtYWxsZXN0IGVkaXQgZGlzdGFuY2UKKyAgLy8vIGZvdW5kIChzbyBmYXIpIHdpdGggdGhlIHR5cG8gbmFtZS4KKyAgLy8vCisgIC8vLyBUaGUgcG9pbnRlciB2YWx1ZSBiZWluZyBzZXQgdG8gdGhlIGN1cnJlbnQgRGVjbENvbnRleHQgaW5kaWNhdGVzCisgIC8vLyB3aGV0aGVyIHRoZXJlIGlzIGEga2V5d29yZCB3aXRoIHRoaXMgbmFtZS4KKyAgVHlwb0VkaXREaXN0YW5jZU1hcCBDb3JyZWN0aW9uUmVzdWx0czsKKworICBTbWFsbFZlY3RvcjxUeXBvQ29ycmVjdGlvbiwgND4gVmFsaWRhdGVkQ29ycmVjdGlvbnM7CisgIHNpemVfdCBDdXJyZW50VENJbmRleDsKKyAgc2l6ZV90IFNhdmVkVENJbmRleDsKKworICBTZW1hICZTZW1hUmVmOworICBTY29wZSAqUzsKKyAgc3RkOjp1bmlxdWVfcHRyPENYWFNjb3BlU3BlYz4gU1M7CisgIHN0ZDo6dW5pcXVlX3B0cjxDb3JyZWN0aW9uQ2FuZGlkYXRlQ2FsbGJhY2s+IENvcnJlY3Rpb25WYWxpZGF0b3I7CisgIERlY2xDb250ZXh0ICpNZW1iZXJDb250ZXh0OworICBMb29rdXBSZXN1bHQgUmVzdWx0OworICBOYW1lc3BhY2VTcGVjaWZpZXJTZXQgTmFtZXNwYWNlczsKKyAgU21hbGxWZWN0b3I8VHlwb0NvcnJlY3Rpb24sIDI+IFF1YWxpZmllZFJlc3VsdHM7CisgIGJvb2wgRW50ZXJpbmdDb250ZXh0OworICBib29sIFNlYXJjaE5hbWVzcGFjZXM7Cit9OworCitpbmxpbmUgU2VtYTo6VHlwb0V4cHJTdGF0ZTo6VHlwb0V4cHJTdGF0ZSgpIHt9CisKK2lubGluZSBTZW1hOjpUeXBvRXhwclN0YXRlOjpUeXBvRXhwclN0YXRlKFR5cG9FeHByU3RhdGUgJiZvdGhlcikgbm9leGNlcHQgeworICAqdGhpcyA9IHN0ZDo6bW92ZShvdGhlcik7Cit9CisKK2lubGluZSBTZW1hOjpUeXBvRXhwclN0YXRlICZTZW1hOjpUeXBvRXhwclN0YXRlOjoKK29wZXJhdG9yPShTZW1hOjpUeXBvRXhwclN0YXRlICYmb3RoZXIpIG5vZXhjZXB0IHsKKyAgQ29uc3VtZXIgPSBzdGQ6Om1vdmUob3RoZXIuQ29uc3VtZXIpOworICBEaWFnSGFuZGxlciA9IHN0ZDo6bW92ZShvdGhlci5EaWFnSGFuZGxlcik7CisgIFJlY292ZXJ5SGFuZGxlciA9IHN0ZDo6bW92ZShvdGhlci5SZWNvdmVyeUhhbmRsZXIpOworICByZXR1cm4gKnRoaXM7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvU2VtYUxhbWJkYS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9TZW1hTGFtYmRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxNmRjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvU2VtYUxhbWJkYS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09LS0tIFNlbWFMYW1iZGEuaCAtIExhbWJkYSBIZWxwZXIgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBUaGlzIGZpbGUgcHJvdmlkZXMgc29tZSBjb21tb24gdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcKKy8vLyBMYW1iZGFzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU0VNQV9TRU1BTEFNQkRBX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TRU1BX1NFTUFMQU1CREFfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVExhbWJkYS5oIgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIHNlbWEgeworY2xhc3MgRnVuY3Rpb25TY29wZUluZm87Cit9CitjbGFzcyBTZW1hOworCisvLy8gXGJyaWVmIEV4YW1pbmVzIHRoZSBGdW5jdGlvblNjb3BlSW5mbyBzdGFjayB0byBkZXRlcm1pbmUgdGhlIG5lYXJlc3QKKy8vLyBlbmNsb3NpbmcgbGFtYmRhICh0byB0aGUgY3VycmVudCBsYW1iZGEpIHRoYXQgaXMgJ2NhcHR1cmUtY2FwYWJsZScgZm9yIAorLy8vIHRoZSB2YXJpYWJsZSByZWZlcmVuY2VkIGluIHRoZSBjdXJyZW50IGxhbWJkYSAoaS5lLiBccCBWYXJUb0NhcHR1cmUpLgorLy8vIElmIHN1Y2Nlc3NmdWwsIHJldHVybnMgdGhlIGluZGV4IGludG8gU2VtYSdzIEZ1bmN0aW9uU2NvcGVJbmZvIHN0YWNrCisvLy8gb2YgdGhlIGNhcHR1cmUtY2FwYWJsZSBsYW1iZGEncyBMYW1iZGFTY29wZUluZm8uIAorLy8vIFNlZSBJbXBsZW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxlZCBjb21tZW50cy4gCisKK09wdGlvbmFsPHVuc2lnbmVkPiBnZXRTdGFja0luZGV4T2ZOZWFyZXN0RW5jbG9zaW5nQ2FwdHVyZUNhcGFibGVMYW1iZGEoCisgICAgQXJyYXlSZWY8Y29uc3Qgc2VtYTo6RnVuY3Rpb25TY29wZUluZm8gKj4gRnVuY3Rpb25TY29wZXMsCisgICAgVmFyRGVjbCAqVmFyVG9DYXB0dXJlLCBTZW1hICZTKTsKKworfSAvLyBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvVGVtcGxhdGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvVGVtcGxhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGJiOTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9UZW1wbGF0ZS5oCkBAIC0wLDAgKzEsNTY5IEBACisvLz09PS0gU2VtYVRlbXBsYXRlLmggLSBDKysgVGVtcGxhdGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHR5cGVzIHVzZWQgaW4gdGhlIHNlbWFudGljIGFuYWx5c2lzIG9mIEMrKyB0ZW1wbGF0ZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NFTUFfVEVNUExBVEVfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NFTUFfVEVNUExBVEVfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xUZW1wbGF0ZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsVmlzaXRvci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UZW1wbGF0ZUJhc2UuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9TZW1hL1NlbWEuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlclVuaW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBCaW5kaW5nRGVjbDsKK2NsYXNzIENYWE1ldGhvZERlY2w7CitjbGFzcyBEZWNsOworY2xhc3MgRGVjbGFyYXRvckRlY2w7CitjbGFzcyBEZWNsQ29udGV4dDsKK2NsYXNzIEVudW1EZWNsOworY2xhc3MgRnVuY3Rpb25EZWNsOworY2xhc3MgTmFtZWREZWNsOworY2xhc3MgUGFybVZhckRlY2w7CitjbGFzcyBUYWdEZWNsOworY2xhc3MgVHlwZWRlZk5hbWVEZWNsOworY2xhc3MgVHlwZVNvdXJjZUluZm87CitjbGFzcyBWYXJEZWNsOworCisgIC8vLyBcYnJpZWYgRGF0YSBzdHJ1Y3R1cmUgdGhhdCBjYXB0dXJlcyBtdWx0aXBsZSBsZXZlbHMgb2YgdGVtcGxhdGUgYXJndW1lbnQKKyAgLy8vIGxpc3RzIGZvciB1c2UgaW4gdGVtcGxhdGUgaW5zdGFudGlhdGlvbi4KKyAgLy8vCisgIC8vLyBNdWx0aXBsZSBsZXZlbHMgb2YgdGVtcGxhdGUgYXJndW1lbnRzIG9jY3VyIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgCisgIC8vLyBkZWZpbml0aW9ucyBvZiBtZW1iZXIgdGVtcGxhdGVzLiBGb3IgZXhhbXBsZToKKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgLy8vIHN0cnVjdCBYIHsKKyAgLy8vICAgdGVtcGxhdGU8VCBWYWx1ZT4KKyAgLy8vICAgc3RydWN0IFkgeworICAvLy8gICAgIHZvaWQgZigpOworICAvLy8gICB9OworICAvLy8gfTsKKyAgLy8vIFxlbmRjb2RlCisgIC8vLworICAvLy8gV2hlbiBpbnN0YW50aWF0aW5nIFg8aW50Pjo6WTwxNz46OmYsIHRoZSBtdWx0aS1sZXZlbCB0ZW1wbGF0ZSBhcmd1bWVudAorICAvLy8gbGlzdCB3aWxsIGNvbnRhaW4gYSB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0IChpbnQpIGF0IGRlcHRoIDAgYW5kIGEKKyAgLy8vIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QgKDE3KSBhdCBkZXB0aCAxLgorICBjbGFzcyBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QgeworICAgIC8vLyBcYnJpZWYgVGhlIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QgYXQgYSBjZXJ0YWluIHRlbXBsYXRlIGRlcHRoIAorICAgIHVzaW5nIEFyZ0xpc3QgPSBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PjsKKworICAgIC8vLyBcYnJpZWYgVGhlIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3RzLCBzdG9yZWQgZnJvbSB0aGUgaW5uZXJtb3N0IHRlbXBsYXRlCisgICAgLy8vIGFyZ3VtZW50IGxpc3QgKGZpcnN0KSB0byB0aGUgb3V0ZXJtb3N0IHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QgKGxhc3QpLgorICAgIFNtYWxsVmVjdG9yPEFyZ0xpc3QsIDQ+IFRlbXBsYXRlQXJndW1lbnRMaXN0czsKKworICAgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBvdXRlciBsZXZlbHMgb2YgdGVtcGxhdGUgYXJndW1lbnRzIHRoYXQgYXJlIG5vdAorICAgIC8vLyBiZWluZyBzdWJzdGl0dXRlZC4KKyAgICB1bnNpZ25lZCBOdW1SZXRhaW5lZE91dGVyTGV2ZWxzID0gMDsKKyAgICAKKyAgcHVibGljOgorICAgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIGVtcHR5IHNldCBvZiB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0cy4KKyAgICBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QoKSA9IGRlZmF1bHQ7CisgICAgCisgICAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBzaW5nbGUtbGV2ZWwgdGVtcGxhdGUgYXJndW1lbnQgbGlzdC4KKyAgICBleHBsaWNpdCAKKyAgICBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QoY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncykgeworICAgICAgYWRkT3V0ZXJUZW1wbGF0ZUFyZ3VtZW50cygmVGVtcGxhdGVBcmdzKTsKKyAgICB9CisgICAgCisgICAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBsZXZlbHMgaW4gdGhpcyB0ZW1wbGF0ZSBhcmd1bWVudAorICAgIC8vLyBsaXN0LgorICAgIHVuc2lnbmVkIGdldE51bUxldmVscygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBUZW1wbGF0ZUFyZ3VtZW50TGlzdHMuc2l6ZSgpICsgTnVtUmV0YWluZWRPdXRlckxldmVsczsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHN1YnN0aXR1dGVkIGxldmVscyBpbiB0aGlzIHRlbXBsYXRlCisgICAgLy8vIGFyZ3VtZW50IGxpc3QuCisgICAgdW5zaWduZWQgZ2V0TnVtU3Vic3RpdHV0ZWRMZXZlbHMoKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVtcGxhdGVBcmd1bWVudExpc3RzLnNpemUoKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBhdCBhIGdpdmVuIGRlcHRoIGFuZCBpbmRleC4KKyAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICZvcGVyYXRvcigpKHVuc2lnbmVkIERlcHRoLCB1bnNpZ25lZCBJbmRleCkgY29uc3QgeworICAgICAgYXNzZXJ0KE51bVJldGFpbmVkT3V0ZXJMZXZlbHMgPD0gRGVwdGggJiYgRGVwdGggPCBnZXROdW1MZXZlbHMoKSk7CisgICAgICBhc3NlcnQoSW5kZXggPCBUZW1wbGF0ZUFyZ3VtZW50TGlzdHNbZ2V0TnVtTGV2ZWxzKCkgLSBEZXB0aCAtIDFdLnNpemUoKSk7CisgICAgICByZXR1cm4gVGVtcGxhdGVBcmd1bWVudExpc3RzW2dldE51bUxldmVscygpIC0gRGVwdGggLSAxXVtJbmRleF07CisgICAgfQorICAgIAorICAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgaXMgYSBub24tTlVMTCB0ZW1wbGF0ZSBhcmd1bWVudCBhdCB0aGUKKyAgICAvLy8gZ2l2ZW4gZGVwdGggYW5kIGluZGV4LgorICAgIC8vLworICAgIC8vLyBUaGVyZSBtdXN0IGV4aXN0IGEgdGVtcGxhdGUgYXJndW1lbnQgbGlzdCBhdCB0aGUgZ2l2ZW4gZGVwdGguCisgICAgYm9vbCBoYXNUZW1wbGF0ZUFyZ3VtZW50KHVuc2lnbmVkIERlcHRoLCB1bnNpZ25lZCBJbmRleCkgY29uc3QgeworICAgICAgYXNzZXJ0KERlcHRoIDwgZ2V0TnVtTGV2ZWxzKCkpOworCisgICAgICBpZiAoRGVwdGggPCBOdW1SZXRhaW5lZE91dGVyTGV2ZWxzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAKKyAgICAgIGlmIChJbmRleCA+PSBUZW1wbGF0ZUFyZ3VtZW50TGlzdHNbZ2V0TnVtTGV2ZWxzKCkgLSBEZXB0aCAtIDFdLnNpemUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgCisgICAgICByZXR1cm4gISgqdGhpcykoRGVwdGgsIEluZGV4KS5pc051bGwoKTsKKyAgICB9CisgICAgCisgICAgLy8vIFxicmllZiBDbGVhciBvdXQgYSBzcGVjaWZpYyB0ZW1wbGF0ZSBhcmd1bWVudC4KKyAgICB2b2lkIHNldEFyZ3VtZW50KHVuc2lnbmVkIERlcHRoLCB1bnNpZ25lZCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJndW1lbnQgQXJnKSB7CisgICAgICBhc3NlcnQoTnVtUmV0YWluZWRPdXRlckxldmVscyA8PSBEZXB0aCAmJiBEZXB0aCA8IGdldE51bUxldmVscygpKTsKKyAgICAgIGFzc2VydChJbmRleCA8IFRlbXBsYXRlQXJndW1lbnRMaXN0c1tnZXROdW1MZXZlbHMoKSAtIERlcHRoIC0gMV0uc2l6ZSgpKTsKKyAgICAgIGNvbnN0X2Nhc3Q8VGVtcGxhdGVBcmd1bWVudCY+KAorICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJndW1lbnRMaXN0c1tnZXROdW1MZXZlbHMoKSAtIERlcHRoIC0gMV1bSW5kZXhdKQorICAgICAgICA9IEFyZzsKKyAgICB9CisgICAgCisgICAgLy8vIFxicmllZiBBZGQgYSBuZXcgb3V0ZXJtb3N0IGxldmVsIHRvIHRoZSBtdWx0aS1sZXZlbCB0ZW1wbGF0ZSBhcmd1bWVudCAKKyAgICAvLy8gbGlzdC4KKyAgICB2b2lkIGFkZE91dGVyVGVtcGxhdGVBcmd1bWVudHMoY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3QgKlRlbXBsYXRlQXJncykgeworICAgICAgYWRkT3V0ZXJUZW1wbGF0ZUFyZ3VtZW50cyhBcmdMaXN0KFRlbXBsYXRlQXJncy0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJncy0+c2l6ZSgpKSk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBBZGQgYSBuZXcgb3V0bW9zdCBsZXZlbCB0byB0aGUgbXVsdGktbGV2ZWwgdGVtcGxhdGUgYXJndW1lbnQKKyAgICAvLy8gbGlzdC4KKyAgICB2b2lkIGFkZE91dGVyVGVtcGxhdGVBcmd1bWVudHMoQXJnTGlzdCBBcmdzKSB7CisgICAgICBhc3NlcnQoIU51bVJldGFpbmVkT3V0ZXJMZXZlbHMgJiYKKyAgICAgICAgICAgICAic3Vic3RpdHV0ZWQgYXJncyBvdXRzaWRlIHJldGFpbmVkIGFyZ3M/Iik7CisgICAgICBUZW1wbGF0ZUFyZ3VtZW50TGlzdHMucHVzaF9iYWNrKEFyZ3MpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgQWRkIGFuIG91dGVybW9zdCBsZXZlbCB0aGF0IHdlIGFyZSBub3Qgc3Vic3RpdHV0aW5nLiBXZSBoYXZlIG5vCisgICAgLy8vIGFyZ3VtZW50cyBhdCB0aGlzIGxldmVsLCBhbmQgZG8gbm90IHJlbW92ZSBpdCBmcm9tIHRoZSBkZXB0aCBvZiBpbm5lcgorICAgIC8vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHRoYXQgd2UgaW5zdGFudGlhdGUuCisgICAgdm9pZCBhZGRPdXRlclJldGFpbmVkTGV2ZWwoKSB7CisgICAgICArK051bVJldGFpbmVkT3V0ZXJMZXZlbHM7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgaW5uZXJtb3N0IHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QuCisgICAgY29uc3QgQXJnTGlzdCAmZ2V0SW5uZXJtb3N0KCkgY29uc3QgeworICAgICAgcmV0dXJuIFRlbXBsYXRlQXJndW1lbnRMaXN0cy5mcm9udCgpOyAKKyAgICB9CisgIH07CisgIAorICAvLy8gXGJyaWVmIFRoZSBjb250ZXh0IGluIHdoaWNoIHBhcnRpYWwgb3JkZXJpbmcgb2YgZnVuY3Rpb24gdGVtcGxhdGVzIG9jY3Vycy4KKyAgZW51bSBUUE9DIHsKKyAgICAvLy8gXGJyaWVmIFBhcnRpYWwgb3JkZXJpbmcgb2YgZnVuY3Rpb24gdGVtcGxhdGVzIGZvciBhIGZ1bmN0aW9uIGNhbGwuCisgICAgVFBPQ19DYWxsLAorCisgICAgLy8vIFxicmllZiBQYXJ0aWFsIG9yZGVyaW5nIG9mIGZ1bmN0aW9uIHRlbXBsYXRlcyBmb3IgYSBjYWxsIHRvIGEgCisgICAgLy8vIGNvbnZlcnNpb24gZnVuY3Rpb24uCisgICAgVFBPQ19Db252ZXJzaW9uLAorCisgICAgLy8vIFxicmllZiBQYXJ0aWFsIG9yZGVyaW5nIG9mIGZ1bmN0aW9uIHRlbXBsYXRlcyBpbiBvdGhlciBjb250ZXh0cywgZS5nLiwKKyAgICAvLy8gdGFraW5nIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gdGVtcGxhdGUgb3IgbWF0Y2hpbmcgYSBmdW5jdGlvbiAKKyAgICAvLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdG8gYSBmdW5jdGlvbiB0ZW1wbGF0ZS4KKyAgICBUUE9DX090aGVyCisgIH07CisKKyAgLy8gVGhpcyBpcyBsYW1lIGJ1dCB1bmF2b2lkYWJsZSBpbiBhIHdvcmxkIHdpdGhvdXQgZm9yd2FyZAorICAvLyBkZWNsYXJhdGlvbnMgb2YgZW51bXMuICBUaGUgYWx0ZXJuYXRpdmVzIGFyZSB0byBlaXRoZXIgcG9sbHV0ZQorICAvLyBTZW1hLmggKGJ5IGluY2x1ZGluZyB0aGlzIGZpbGUpIG9yIHNhY3JpZmljZSB0eXBlIHNhZmV0eSAoYnkKKyAgLy8gbWFraW5nIFNlbWEuaCBkZWNsYXJlIHRoaW5ncyBhcyBlbnVtcykuCisgIGNsYXNzIFRlbXBsYXRlUGFydGlhbE9yZGVyaW5nQ29udGV4dCB7CisgICAgVFBPQyBWYWx1ZTsKKworICBwdWJsaWM6CisgICAgVGVtcGxhdGVQYXJ0aWFsT3JkZXJpbmdDb250ZXh0KFRQT0MgVmFsdWUpIDogVmFsdWUoVmFsdWUpIHt9CisKKyAgICBvcGVyYXRvciBUUE9DKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKyAgfTsKKworICAvLy8gXGJyaWVmIENhcHR1cmVzIGEgdGVtcGxhdGUgYXJndW1lbnQgd2hvc2UgdmFsdWUgaGFzIGJlZW4gZGVkdWNlZAorICAvLy8gdmlhIGMrKyB0ZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24uCisgIGNsYXNzIERlZHVjZWRUZW1wbGF0ZUFyZ3VtZW50IDogcHVibGljIFRlbXBsYXRlQXJndW1lbnQgeworICAgIC8vLyBcYnJpZWYgRm9yIGEgbm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnQsIHdoZXRoZXIgdGhlIHZhbHVlIHdhcworICAgIC8vLyBkZWR1Y2VkIGZyb20gYW4gYXJyYXkgYm91bmQuCisgICAgYm9vbCBEZWR1Y2VkRnJvbUFycmF5Qm91bmQgPSBmYWxzZTsKKworICBwdWJsaWM6CisgICAgRGVkdWNlZFRlbXBsYXRlQXJndW1lbnQoKSA9IGRlZmF1bHQ7CisKKyAgICBEZWR1Y2VkVGVtcGxhdGVBcmd1bWVudChjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICZBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZWR1Y2VkRnJvbUFycmF5Qm91bmQgPSBmYWxzZSkKKyAgICAgICAgOiBUZW1wbGF0ZUFyZ3VtZW50KEFyZyksIERlZHVjZWRGcm9tQXJyYXlCb3VuZChEZWR1Y2VkRnJvbUFycmF5Qm91bmQpIHt9CisKKyAgICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBpbnRlZ3JhbCBub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCB0aGF0CisgICAgLy8vIGhhcyBiZWVuIGRlZHVjZWQsIHBvc3NpYmx5IGZyb20gYW4gYXJyYXkgYm91bmQuCisgICAgRGVkdWNlZFRlbXBsYXRlQXJndW1lbnQoQVNUQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCAmVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVmFsdWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVkdWNlZEZyb21BcnJheUJvdW5kKQorICAgICAgICA6IFRlbXBsYXRlQXJndW1lbnQoQ3R4LCBWYWx1ZSwgVmFsdWVUeXBlKSwKKyAgICAgICAgICBEZWR1Y2VkRnJvbUFycmF5Qm91bmQoRGVkdWNlZEZyb21BcnJheUJvdW5kKSB7fQorCisgICAgLy8vIFxicmllZiBGb3IgYSBub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCwgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCisgICAgLy8vIHRlbXBsYXRlIGFyZ3VtZW50IHdhcyBkZWR1Y2VkIGZyb20gYW4gYXJyYXkgYm91bmQuCisgICAgYm9vbCB3YXNEZWR1Y2VkRnJvbUFycmF5Qm91bmQoKSBjb25zdCB7IHJldHVybiBEZWR1Y2VkRnJvbUFycmF5Qm91bmQ7IH0KKworICAgIC8vLyBcYnJpZWYgU3BlY2lmeSB3aGV0aGVyIHRoZSBnaXZlbiBub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudAorICAgIC8vLyB3YXMgZGVkdWNlZCBmcm9tIGFuIGFycmF5IGJvdW5kLgorICAgIHZvaWQgc2V0RGVkdWNlZEZyb21BcnJheUJvdW5kKGJvb2wgRGVkdWNlZCkgeworICAgICAgRGVkdWNlZEZyb21BcnJheUJvdW5kID0gRGVkdWNlZDsKKyAgICB9CisgIH07CisKKyAgLy8vIFxicmllZiBBIHN0YWNrLWFsbG9jYXRlZCBjbGFzcyB0aGF0IGlkZW50aWZpZXMgd2hpY2ggbG9jYWwKKyAgLy8vIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGluc3RhbnRpYXRpb25zIGFyZSBwcmVzZW50IGluIHRoaXMgc2NvcGUuCisgIC8vLworICAvLy8gQSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB0eXBlIHdpbGwgYmUgY3JlYXRlZCB3aGVuZXZlciB3ZQorICAvLy8gaW5zdGFudGlhdGUgYSBuZXcgZnVuY3Rpb24gZGVjbGFyYXRpb24sIHdoaWNoIHdpbGwgaGF2ZSBpdHMgb3duCisgIC8vLyBzZXQgb2YgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucy4KKyAgY2xhc3MgTG9jYWxJbnN0YW50aWF0aW9uU2NvcGUgeworICBwdWJsaWM6CisgICAgLy8vIFxicmllZiBBIHNldCBvZiBkZWNsYXJhdGlvbnMuCisgICAgdXNpbmcgRGVjbEFyZ3VtZW50UGFjayA9IFNtYWxsVmVjdG9yPFBhcm1WYXJEZWNsICosIDQ+OworCisgIHByaXZhdGU6CisgICAgLy8vIFxicmllZiBSZWZlcmVuY2UgdG8gdGhlIHNlbWFudGljIGFuYWx5c2lzIHRoYXQgaXMgcGVyZm9ybWluZworICAgIC8vLyB0aGlzIHRlbXBsYXRlIGluc3RhbnRpYXRpb24uCisgICAgU2VtYSAmU2VtYVJlZjsKKworICAgIHVzaW5nIExvY2FsRGVjbHNNYXAgPQorICAgICAgICBsbHZtOjpTbWFsbERlbnNlTWFwPGNvbnN0IERlY2wgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpQb2ludGVyVW5pb248RGVjbCAqLCBEZWNsQXJndW1lbnRQYWNrICo+LCA0PjsKKworICAgIC8vLyBcYnJpZWYgQSBtYXBwaW5nIGZyb20gbG9jYWwgZGVjbGFyYXRpb25zIHRoYXQgb2NjdXIKKyAgICAvLy8gd2l0aGluIGEgdGVtcGxhdGUgdG8gdGhlaXIgaW5zdGFudGlhdGlvbnMuCisgICAgLy8vCisgICAgLy8vIFRoaXMgbWFwcGluZyBpcyB1c2VkIGR1cmluZyBpbnN0YW50aWF0aW9uIHRvIGtlZXAgdHJhY2sgb2YsCisgICAgLy8vIGUuZy4sIGZ1bmN0aW9uIHBhcmFtZXRlciBhbmQgdmFyaWFibGUgZGVjbGFyYXRpb25zLiBGb3IgZXhhbXBsZSwKKyAgICAvLy8gZ2l2ZW46CisgICAgLy8vCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gVCBhZGQoVCB4LCBUIHkpIHsgcmV0dXJuIHggKyB5OyB9CisgICAgLy8vIFxlbmRjb2RlCisgICAgLy8vCisgICAgLy8vIHdoZW4gd2UgaW5zdGFudGlhdGUgYWRkPGludD4sIHdlIHdpbGwgaW50cm9kdWNlIGEgbWFwcGluZyBmcm9tCisgICAgLy8vIHRoZSBQYXJtVmFyRGVjbCBmb3IgJ3gnIHRoYXQgb2NjdXJzIGluIHRoZSB0ZW1wbGF0ZSB0byB0aGUKKyAgICAvLy8gaW5zdGFudGlhdGVkIFBhcm1WYXJEZWNsIGZvciAneCcuCisgICAgLy8vCisgICAgLy8vIEZvciBhIHBhcmFtZXRlciBwYWNrLCB0aGUgbG9jYWwgaW5zdGFudGlhdGlvbiBzY29wZSBtYXkgY29udGFpbiBhCisgICAgLy8vIHNldCBvZiBpbnN0YW50aWF0ZWQgcGFyYW1ldGVycy4gVGhpcyBpcyBzdG9yZWQgYXMgYSBEZWNsQXJndW1lbnRQYWNrCisgICAgLy8vIHBvaW50ZXIuCisgICAgTG9jYWxEZWNsc01hcCBMb2NhbERlY2xzOworCisgICAgLy8vIFxicmllZiBUaGUgc2V0IG9mIGFyZ3VtZW50IHBhY2tzIHdlJ3ZlIGFsbG9jYXRlZC4KKyAgICBTbWFsbFZlY3RvcjxEZWNsQXJndW1lbnRQYWNrICosIDE+IEFyZ3VtZW50UGFja3M7CisgICAgCisgICAgLy8vIFxicmllZiBUaGUgb3V0ZXIgc2NvcGUsIHdoaWNoIGNvbnRhaW5zIGxvY2FsIHZhcmlhYmxlCisgICAgLy8vIGRlZmluaXRpb25zIGZyb20gc29tZSBvdGhlciBpbnN0YW50aWF0aW9uICh0aGF0IG1heSBub3QgYmUKKyAgICAvLy8gcmVsZXZhbnQgdG8gdGhpcyBwYXJ0aWN1bGFyIHNjb3BlKS4KKyAgICBMb2NhbEluc3RhbnRpYXRpb25TY29wZSAqT3V0ZXI7CisKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgd2UgaGF2ZSBhbHJlYWR5IGV4aXRlZCB0aGlzIHNjb3BlLgorICAgIGJvb2wgRXhpdGVkID0gZmFsc2U7CisKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdG8gY29tYmluZSB0aGlzIHNjb3BlIHdpdGggdGhlIG91dGVyIHNjb3BlLCBzdWNoIHRoYXQKKyAgICAvLy8gbG9va3VwIHdpbGwgc2VhcmNoIG91ciBvdXRlciBzY29wZS4KKyAgICBib29sIENvbWJpbmVXaXRoT3V0ZXJTY29wZTsKKyAgICAKKyAgICAvLy8gXGJyaWVmIElmIG5vbi1OVUxMLCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIHBhY2sgdGhhdCBoYXMgYmVlbgorICAgIC8vLyBwYXJ0aWFsbHkgc3Vic3RpdHV0ZWQgcGVyIEMrKzB4IFt0ZW1wLmFyZy5leHBsaWNpdF1wOS4KKyAgICBOYW1lZERlY2wgKlBhcnRpYWxseVN1YnN0aXR1dGVkUGFjayA9IG51bGxwdHI7CisgICAgCisgICAgLy8vIFxicmllZiBJZiBcYyBQYXJ0aWFsbHlTdWJzdGl0dXRlZFBhY2sgaXMgbm9uLW51bGwsIHRoZSBzZXQgb2YKKyAgICAvLy8gZXhwbGljaXRseS1zcGVjaWZpZWQgdGVtcGxhdGUgYXJndW1lbnRzIGluIHRoYXQgcGFjay4KKyAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpBcmdzSW5QYXJ0aWFsbHlTdWJzdGl0dXRlZFBhY2s7ICAgIAorICAgIAorICAgIC8vLyBcYnJpZWYgSWYgXGMgUGFydGlhbGx5U3Vic3RpdHV0ZWRQYWNrLCB0aGUgbnVtYmVyIG9mIAorICAgIC8vLyBleHBsaWNpdGx5LXNwZWNpZmllZCB0ZW1wbGF0ZSBhcmd1bWVudHMgaW4gCisgICAgLy8vIEFyZ3NJblBhcnRpYWxseVN1YnN0aXR1dGVkUGFjay4KKyAgICB1bnNpZ25lZCBOdW1BcmdzSW5QYXJ0aWFsbHlTdWJzdGl0dXRlZFBhY2s7CisKKyAgcHVibGljOgorICAgIExvY2FsSW5zdGFudGlhdGlvblNjb3BlKFNlbWEgJlNlbWFSZWYsIGJvb2wgQ29tYmluZVdpdGhPdXRlclNjb3BlID0gZmFsc2UpCisgICAgICAgIDogU2VtYVJlZihTZW1hUmVmKSwgT3V0ZXIoU2VtYVJlZi5DdXJyZW50SW5zdGFudGlhdGlvblNjb3BlKSwKKyAgICAgICAgICBDb21iaW5lV2l0aE91dGVyU2NvcGUoQ29tYmluZVdpdGhPdXRlclNjb3BlKSB7CisgICAgICBTZW1hUmVmLkN1cnJlbnRJbnN0YW50aWF0aW9uU2NvcGUgPSB0aGlzOworICAgIH0KKworICAgIExvY2FsSW5zdGFudGlhdGlvblNjb3BlKGNvbnN0IExvY2FsSW5zdGFudGlhdGlvblNjb3BlICYpID0gZGVsZXRlOworICAgIExvY2FsSW5zdGFudGlhdGlvblNjb3BlICYKKyAgICBvcGVyYXRvcj0oY29uc3QgTG9jYWxJbnN0YW50aWF0aW9uU2NvcGUgJikgPSBkZWxldGU7CisKKyAgICB+TG9jYWxJbnN0YW50aWF0aW9uU2NvcGUoKSB7CisgICAgICBFeGl0KCk7CisgICAgfQorICAgIAorICAgIGNvbnN0IFNlbWEgJmdldFNlbWEoKSBjb25zdCB7IHJldHVybiBTZW1hUmVmOyB9CisKKyAgICAvLy8gXGJyaWVmIEV4aXQgdGhpcyBsb2NhbCBpbnN0YW50aWF0aW9uIHNjb3BlIGVhcmx5LgorICAgIHZvaWQgRXhpdCgpIHsKKyAgICAgIGlmIChFeGl0ZWQpCisgICAgICAgIHJldHVybjsKKyAgICAgIAorICAgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IEFyZ3VtZW50UGFja3Muc2l6ZSgpOyBJICE9IE47ICsrSSkKKyAgICAgICAgZGVsZXRlIEFyZ3VtZW50UGFja3NbSV07CisgICAgICAgIAorICAgICAgU2VtYVJlZi5DdXJyZW50SW5zdGFudGlhdGlvblNjb3BlID0gT3V0ZXI7CisgICAgICBFeGl0ZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgQ2xvbmUgdGhpcyBzY29wZSwgYW5kIGFsbCBvdXRlciBzY29wZXMsIGRvd24gdG8gdGhlIGdpdmVuCisgICAgLy8vIG91dGVybW9zdCBzY29wZS4KKyAgICBMb2NhbEluc3RhbnRpYXRpb25TY29wZSAqY2xvbmVTY29wZXMoTG9jYWxJbnN0YW50aWF0aW9uU2NvcGUgKk91dGVybW9zdCkgeworICAgICAgaWYgKHRoaXMgPT0gT3V0ZXJtb3N0KSByZXR1cm4gdGhpczsKKworICAgICAgLy8gU2F2ZSB0aGUgY3VycmVudCBzY29wZSBmcm9tIFNlbWFSZWYgc2luY2UgdGhlIExvY2FsSW5zdGFudGlhdGlvblNjb3BlCisgICAgICAvLyB3aWxsIG92ZXJ3cml0ZSBpdCBvbiBjb25zdHJ1Y3Rpb24KKyAgICAgIExvY2FsSW5zdGFudGlhdGlvblNjb3BlICpvbGRTY29wZSA9IFNlbWFSZWYuQ3VycmVudEluc3RhbnRpYXRpb25TY29wZTsKKworICAgICAgTG9jYWxJbnN0YW50aWF0aW9uU2NvcGUgKm5ld1Njb3BlID0KKyAgICAgICAgbmV3IExvY2FsSW5zdGFudGlhdGlvblNjb3BlKFNlbWFSZWYsIENvbWJpbmVXaXRoT3V0ZXJTY29wZSk7CisKKyAgICAgIG5ld1Njb3BlLT5PdXRlciA9IG51bGxwdHI7CisgICAgICBpZiAoT3V0ZXIpCisgICAgICAgIG5ld1Njb3BlLT5PdXRlciA9IE91dGVyLT5jbG9uZVNjb3BlcyhPdXRlcm1vc3QpOworCisgICAgICBuZXdTY29wZS0+UGFydGlhbGx5U3Vic3RpdHV0ZWRQYWNrID0gUGFydGlhbGx5U3Vic3RpdHV0ZWRQYWNrOworICAgICAgbmV3U2NvcGUtPkFyZ3NJblBhcnRpYWxseVN1YnN0aXR1dGVkUGFjayA9IEFyZ3NJblBhcnRpYWxseVN1YnN0aXR1dGVkUGFjazsKKyAgICAgIG5ld1Njb3BlLT5OdW1BcmdzSW5QYXJ0aWFsbHlTdWJzdGl0dXRlZFBhY2sgPQorICAgICAgICBOdW1BcmdzSW5QYXJ0aWFsbHlTdWJzdGl0dXRlZFBhY2s7CisKKyAgICAgIGZvciAoTG9jYWxEZWNsc01hcDo6aXRlcmF0b3IgSSA9IExvY2FsRGVjbHMuYmVnaW4oKSwgRSA9IExvY2FsRGVjbHMuZW5kKCk7CisgICAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICAgIGNvbnN0IERlY2wgKkQgPSBJLT5maXJzdDsKKyAgICAgICAgbGx2bTo6UG9pbnRlclVuaW9uPERlY2wgKiwgRGVjbEFyZ3VtZW50UGFjayAqPiAmU3RvcmVkID0KKyAgICAgICAgICBuZXdTY29wZS0+TG9jYWxEZWNsc1tEXTsKKyAgICAgICAgaWYgKEktPnNlY29uZC5pczxEZWNsICo+KCkpIHsKKyAgICAgICAgICBTdG9yZWQgPSBJLT5zZWNvbmQuZ2V0PERlY2wgKj4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBEZWNsQXJndW1lbnRQYWNrICpPbGRQYWNrID0gSS0+c2Vjb25kLmdldDxEZWNsQXJndW1lbnRQYWNrICo+KCk7CisgICAgICAgICAgRGVjbEFyZ3VtZW50UGFjayAqTmV3UGFjayA9IG5ldyBEZWNsQXJndW1lbnRQYWNrKCpPbGRQYWNrKTsKKyAgICAgICAgICBTdG9yZWQgPSBOZXdQYWNrOworICAgICAgICAgIG5ld1Njb3BlLT5Bcmd1bWVudFBhY2tzLnB1c2hfYmFjayhOZXdQYWNrKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gUmVzdG9yZSB0aGUgc2F2ZWQgc2NvcGUgdG8gU2VtYVJlZgorICAgICAgU2VtYVJlZi5DdXJyZW50SW5zdGFudGlhdGlvblNjb3BlID0gb2xkU2NvcGU7CisgICAgICByZXR1cm4gbmV3U2NvcGU7CisgICAgfQorCisgICAgLy8vIFxicmllZiBkZWxldGVzIHRoZSBnaXZlbiBzY29wZSwgYW5kIGFsbCBvdHVlciBzY29wZXMsIGRvd24gdG8gdGhlCisgICAgLy8vIGdpdmVuIG91dGVybW9zdCBzY29wZS4KKyAgICBzdGF0aWMgdm9pZCBkZWxldGVTY29wZXMoTG9jYWxJbnN0YW50aWF0aW9uU2NvcGUgKlNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEluc3RhbnRpYXRpb25TY29wZSAqT3V0ZXJtb3N0KSB7CisgICAgICB3aGlsZSAoU2NvcGUgJiYgU2NvcGUgIT0gT3V0ZXJtb3N0KSB7CisgICAgICAgIExvY2FsSW5zdGFudGlhdGlvblNjb3BlICpPdXQgPSBTY29wZS0+T3V0ZXI7CisgICAgICAgIGRlbGV0ZSBTY29wZTsKKyAgICAgICAgU2NvcGUgPSBPdXQ7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIFxicmllZiBGaW5kIHRoZSBpbnN0YW50aWF0aW9uIG9mIHRoZSBkZWNsYXJhdGlvbiBEIHdpdGhpbiB0aGUgY3VycmVudAorICAgIC8vLyBpbnN0YW50aWF0aW9uIHNjb3BlLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gRCBUaGUgZGVjbGFyYXRpb24gd2hvc2UgaW5zdGFudGlhdGlvbiB3ZSBhcmUgc2VhcmNoaW5nIGZvci4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgQSBwb2ludGVyIHRvIHRoZSBkZWNsYXJhdGlvbiBvciBhcmd1bWVudCBwYWNrIG9mIGRlY2xhcmF0aW9ucworICAgIC8vLyB0byB3aGljaCB0aGUgZGVjbGFyYXRpb24gXGMgRCBpcyBpbnN0YW50aWF0ZWQsIGlmIGZvdW5kLiBPdGhlcndpc2UsCisgICAgLy8vIHJldHVybnMgTlVMTC4KKyAgICBsbHZtOjpQb2ludGVyVW5pb248RGVjbCAqLCBEZWNsQXJndW1lbnRQYWNrICo+ICoKKyAgICBmaW5kSW5zdGFudGlhdGlvbk9mKGNvbnN0IERlY2wgKkQpOworCisgICAgdm9pZCBJbnN0YW50aWF0ZWRMb2NhbChjb25zdCBEZWNsICpELCBEZWNsICpJbnN0KTsKKyAgICB2b2lkIEluc3RhbnRpYXRlZExvY2FsUGFja0FyZyhjb25zdCBEZWNsICpELCBQYXJtVmFyRGVjbCAqSW5zdCk7CisgICAgdm9pZCBNYWtlSW5zdGFudGlhdGVkTG9jYWxBcmdQYWNrKGNvbnN0IERlY2wgKkQpOworICAgIAorICAgIC8vLyBcYnJpZWYgTm90ZSB0aGF0IHRoZSBnaXZlbiBwYXJhbWV0ZXIgcGFjayBoYXMgYmVlbiBwYXJ0aWFsbHkgc3Vic3RpdHV0ZWQKKyAgICAvLy8gdmlhIGV4cGxpY2l0IHNwZWNpZmljYXRpb24gb2YgdGVtcGxhdGUgYXJndW1lbnRzIAorICAgIC8vLyAoQysrMHggW3RlbXAuYXJnLmV4cGxpY2l0XXA5KS4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIFBhY2sgVGhlIHBhcmFtZXRlciBwYWNrLCB3aGljaCB3aWxsIGFsd2F5cyBiZSBhIHRlbXBsYXRlCisgICAgLy8vIHBhcmFtZXRlciBwYWNrLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gRXhwbGljaXRBcmdzIFRoZSBleHBsaWNpdGx5LXNwZWNpZmllZCB0ZW1wbGF0ZSBhcmd1bWVudHMgcHJvdmlkZWQKKyAgICAvLy8gZm9yIHRoaXMgcGFyYW1ldGVyIHBhY2suCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBOdW1FeHBsaWNpdEFyZ3MgVGhlIG51bWJlciBvZiBleHBsaWNpdGx5LXNwZWNpZmllZCB0ZW1wbGF0ZQorICAgIC8vLyBhcmd1bWVudHMgcHJvdmlkZWQgZm9yIHRoaXMgcGFyYW1ldGVyIHBhY2suCisgICAgdm9pZCBTZXRQYXJ0aWFsbHlTdWJzdGl0dXRlZFBhY2soTmFtZWREZWNsICpQYWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpFeHBsaWNpdEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtRXhwbGljaXRBcmdzKTsKKworICAgIC8vLyBcYnJpZWYgUmVzZXQgdGhlIHBhcnRpYWxseS1zdWJzdGl0dXRlZCBwYWNrIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG9mCisgICAgLy8vIGludGVyZXN0LgorICAgIHZvaWQgUmVzZXRQYXJ0aWFsbHlTdWJzdGl0dXRlZFBhY2soKSB7CisgICAgICBhc3NlcnQoUGFydGlhbGx5U3Vic3RpdHV0ZWRQYWNrICYmICJObyBwYXJ0aWFsbHktc3Vic3RpdHV0ZWQgcGFjayIpOworICAgICAgUGFydGlhbGx5U3Vic3RpdHV0ZWRQYWNrID0gbnVsbHB0cjsKKyAgICAgIEFyZ3NJblBhcnRpYWxseVN1YnN0aXR1dGVkUGFjayA9IG51bGxwdHI7CisgICAgICBOdW1BcmdzSW5QYXJ0aWFsbHlTdWJzdGl0dXRlZFBhY2sgPSAwOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHBhcnRpYWxseS1zdWJzdGl0dWVkIHRlbXBsYXRlIHBhcmFtZXRlciBwYWNrLgorICAgIC8vLworICAgIC8vLyBJZiB0aGVyZSBpcyBubyBwYXJ0aWFsbHktc3Vic3RpdHV0ZWQgcGFyYW1ldGVyIHBhY2ssIHJldHVybnMgTlVMTC4KKyAgICBOYW1lZERlY2wgKgorICAgIGdldFBhcnRpYWxseVN1YnN0aXR1dGVkUGFjayhjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICoqRXhwbGljaXRBcmdzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKk51bUV4cGxpY2l0QXJncyA9IG51bGxwdHIpIGNvbnN0OworICB9OworCisgIGNsYXNzIFRlbXBsYXRlRGVjbEluc3RhbnRpYXRvcgorICAgIDogcHVibGljIERlY2xWaXNpdG9yPFRlbXBsYXRlRGVjbEluc3RhbnRpYXRvciwgRGVjbCAqPiAKKyAgeworICAgIFNlbWEgJlNlbWFSZWY7CisgICAgU2VtYTo6QXJndW1lbnRQYWNrU3Vic3RpdHV0aW9uSW5kZXhSQUlJIFN1YnN0SW5kZXg7CisgICAgRGVjbENvbnRleHQgKk93bmVyOworICAgIGNvbnN0IE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmVGVtcGxhdGVBcmdzOworICAgIFNlbWE6OkxhdGVJbnN0YW50aWF0ZWRBdHRyVmVjKiBMYXRlQXR0cnMgPSBudWxscHRyOworICAgIExvY2FsSW5zdGFudGlhdGlvblNjb3BlICpTdGFydGluZ1Njb3BlID0gbnVsbHB0cjsKKworICAgIC8vLyBcYnJpZWYgQSBsaXN0IG9mIG91dC1vZi1saW5lIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwKKyAgICAvLy8gc3BlY2lhbGl6YXRpb25zIHRoYXQgd2lsbCBuZWVkIHRvIGJlIGluc3RhbnRpYXRlZCBhZnRlciB0aGUKKyAgICAvLy8gZW5jbG9zaW5nIGNsYXNzJ3MgaW5zdGFudGlhdGlvbiBpcyBjb21wbGV0ZS4KKyAgICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8Q2xhc3NUZW1wbGF0ZURlY2wgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKj4sIDQ+CisgICAgICBPdXRPZkxpbmVQYXJ0aWFsU3BlY3M7CisKKyAgICAvLy8gXGJyaWVmIEEgbGlzdCBvZiBvdXQtb2YtbGluZSB2YXJpYWJsZSB0ZW1wbGF0ZSBwYXJ0aWFsCisgICAgLy8vIHNwZWNpYWxpemF0aW9ucyB0aGF0IHdpbGwgbmVlZCB0byBiZSBpbnN0YW50aWF0ZWQgYWZ0ZXIgdGhlCisgICAgLy8vIGVuY2xvc2luZyB2YXJpYWJsZSdzIGluc3RhbnRpYXRpb24gaXMgY29tcGxldGUuCisgICAgLy8vIEZJWE1FOiBWZXJpZnkgdGhhdCB0aGlzIGlzIG5lZWRlZC4KKyAgICBTbWFsbFZlY3RvcjwKKyAgICAgICAgc3RkOjpwYWlyPFZhclRlbXBsYXRlRGVjbCAqLCBWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKj4sIDQ+CisgICAgT3V0T2ZMaW5lVmFyUGFydGlhbFNwZWNzOworCisgIHB1YmxpYzoKKyAgICBUZW1wbGF0ZURlY2xJbnN0YW50aWF0b3IoU2VtYSAmU2VtYVJlZiwgRGVjbENvbnRleHQgKk93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncykKKyAgICAgICAgOiBTZW1hUmVmKFNlbWFSZWYpLAorICAgICAgICAgIFN1YnN0SW5kZXgoU2VtYVJlZiwgU2VtYVJlZi5Bcmd1bWVudFBhY2tTdWJzdGl0dXRpb25JbmRleCksCisgICAgICAgICAgT3duZXIoT3duZXIpLCBUZW1wbGF0ZUFyZ3MoVGVtcGxhdGVBcmdzKSB7fQorCisvLyBEZWZpbmUgYWxsIHRoZSBkZWNsIHZpc2l0b3JzIHVzaW5nIERlY2xOb2Rlcy5pbmMKKyNkZWZpbmUgREVDTChERVJJVkVELCBCQVNFKSBcCisgICAgRGVjbCAqVmlzaXQgIyMgREVSSVZFRCAjIyBEZWNsKERFUklWRUQgIyMgRGVjbCAqRCk7CisjZGVmaW5lIEFCU1RSQUNUX0RFQ0woREVDTCkKKworLy8gRGVjbHMgd2hpY2ggbmV2ZXIgYXBwZWFyIGluc2lkZSBhIGNsYXNzIG9yIGZ1bmN0aW9uLgorI2RlZmluZSBPQkpDQ09OVEFJTkVSKERFUklWRUQsIEJBU0UpCisjZGVmaW5lIEZJTEVTQ09QRUFTTShERVJJVkVELCBCQVNFKQorI2RlZmluZSBJTVBPUlQoREVSSVZFRCwgQkFTRSkKKyNkZWZpbmUgRVhQT1JUKERFUklWRUQsIEJBU0UpCisjZGVmaW5lIExJTktBR0VTUEVDKERFUklWRUQsIEJBU0UpCisjZGVmaW5lIE9CSkNDT01QQVRJQkxFQUxJQVMoREVSSVZFRCwgQkFTRSkKKyNkZWZpbmUgT0JKQ01FVEhPRChERVJJVkVELCBCQVNFKQorI2RlZmluZSBPQkpDVFlQRVBBUkFNKERFUklWRUQsIEJBU0UpCisjZGVmaW5lIE9CSkNJVkFSKERFUklWRUQsIEJBU0UpCisjZGVmaW5lIE9CSkNQUk9QRVJUWShERVJJVkVELCBCQVNFKQorI2RlZmluZSBPQkpDUFJPUEVSVFlJTVBMKERFUklWRUQsIEJBU0UpCisjZGVmaW5lIEVNUFRZKERFUklWRUQsIEJBU0UpCisKKy8vIERlY2xzIHdoaWNoIHVzZSBzcGVjaWFsLWNhc2UgaW5zdGFudGlhdGlvbiBjb2RlLgorI2RlZmluZSBCTE9DSyhERVJJVkVELCBCQVNFKQorI2RlZmluZSBDQVBUVVJFRChERVJJVkVELCBCQVNFKQorI2RlZmluZSBJTVBMSUNJVFBBUkFNKERFUklWRUQsIEJBU0UpCisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbE5vZGVzLmluYyIKKworICAgIC8vIEEgZmV3IHN1cHBsZW1lbnRhbCB2aXNpdG9yIGZ1bmN0aW9ucy4KKyAgICBEZWNsICpWaXNpdENYWE1ldGhvZERlY2woQ1hYTWV0aG9kRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpUZW1wbGF0ZVBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0NsYXNzU2NvcGVTcGVjaWFsaXphdGlvbiA9IGZhbHNlKTsKKyAgICBEZWNsICpWaXNpdEZ1bmN0aW9uRGVjbChGdW5jdGlvbkRlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpUZW1wbGF0ZVBhcmFtcyk7CisgICAgRGVjbCAqVmlzaXREZWNsKERlY2wgKkQpOworICAgIERlY2wgKlZpc2l0VmFyRGVjbChWYXJEZWNsICpELCBib29sIEluc3RhbnRpYXRpbmdWYXJUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8QmluZGluZ0RlY2wgKj4gKkJpbmRpbmdzID0gbnVsbHB0cik7CisKKyAgICAvLyBFbmFibGUgbGF0ZSBpbnN0YW50aWF0aW9uIG9mIGF0dHJpYnV0ZXMuICBMYXRlIGluc3RhbnRpYXRlZCBhdHRyaWJ1dGVzCisgICAgLy8gd2lsbCBiZSBzdG9yZWQgaW4gTEEuCisgICAgdm9pZCBlbmFibGVMYXRlQXR0cmlidXRlSW5zdGFudGlhdGlvbihTZW1hOjpMYXRlSW5zdGFudGlhdGVkQXR0clZlYyAqTEEpIHsKKyAgICAgIExhdGVBdHRycyA9IExBOworICAgICAgU3RhcnRpbmdTY29wZSA9IFNlbWFSZWYuQ3VycmVudEluc3RhbnRpYXRpb25TY29wZTsKKyAgICB9CisKKyAgICAvLyBEaXNhYmxlIGxhdGUgaW5zdGFudGlhdGlvbiBvZiBhdHRyaWJ1dGVzLgorICAgIHZvaWQgZGlzYWJsZUxhdGVBdHRyaWJ1dGVJbnN0YW50aWF0aW9uKCkgeworICAgICAgTGF0ZUF0dHJzID0gbnVsbHB0cjsKKyAgICAgIFN0YXJ0aW5nU2NvcGUgPSBudWxscHRyOworICAgIH0KKworICAgIExvY2FsSW5zdGFudGlhdGlvblNjb3BlICpnZXRTdGFydGluZ1Njb3BlKCkgY29uc3QgeyByZXR1cm4gU3RhcnRpbmdTY29wZTsgfQorCisgICAgdXNpbmcgZGVsYXllZF9wYXJ0aWFsX3NwZWNfaXRlcmF0b3IgPSBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPAorICAgICAgQ2xhc3NUZW1wbGF0ZURlY2wgKiwgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKj4+OjppdGVyYXRvcjsKKworICAgIHVzaW5nIGRlbGF5ZWRfdmFyX3BhcnRpYWxfc3BlY19pdGVyYXRvciA9IFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8CisgICAgICAgIFZhclRlbXBsYXRlRGVjbCAqLCBWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKj4+OjppdGVyYXRvcjsKKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNldCBvZgorICAgIC8vLyAiZGVsYXllZCIgcGFydGlhbCBzcGVjaWFsaXphdGlvbnMsIHdoaWNoIG11c3QgYmUgcGFzc2VkIHRvCisgICAgLy8vIEluc3RhbnRpYXRlQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbiBvbmNlIHRoZSBjbGFzcworICAgIC8vLyBkZWZpbml0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4KKyAgICBkZWxheWVkX3BhcnRpYWxfc3BlY19pdGVyYXRvciBkZWxheWVkX3BhcnRpYWxfc3BlY19iZWdpbigpIHsKKyAgICAgIHJldHVybiBPdXRPZkxpbmVQYXJ0aWFsU3BlY3MuYmVnaW4oKTsKKyAgICB9CisKKyAgICBkZWxheWVkX3Zhcl9wYXJ0aWFsX3NwZWNfaXRlcmF0b3IgZGVsYXllZF92YXJfcGFydGlhbF9zcGVjX2JlZ2luKCkgeworICAgICAgcmV0dXJuIE91dE9mTGluZVZhclBhcnRpYWxTcGVjcy5iZWdpbigpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIHNldCBvZgorICAgIC8vLyAiZGVsYXllZCIgcGFydGlhbCBzcGVjaWFsaXphdGlvbnMsIHdoaWNoIG11c3QgYmUgcGFzc2VkIHRvCisgICAgLy8vIEluc3RhbnRpYXRlQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbiBvbmNlIHRoZSBjbGFzcworICAgIC8vLyBkZWZpbml0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4KKyAgICBkZWxheWVkX3BhcnRpYWxfc3BlY19pdGVyYXRvciBkZWxheWVkX3BhcnRpYWxfc3BlY19lbmQoKSB7CisgICAgICByZXR1cm4gT3V0T2ZMaW5lUGFydGlhbFNwZWNzLmVuZCgpOworICAgIH0KKworICAgIGRlbGF5ZWRfdmFyX3BhcnRpYWxfc3BlY19pdGVyYXRvciBkZWxheWVkX3Zhcl9wYXJ0aWFsX3NwZWNfZW5kKCkgeworICAgICAgcmV0dXJuIE91dE9mTGluZVZhclBhcnRpYWxTcGVjcy5lbmQoKTsKKyAgICB9CisKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBpbnN0YW50aWF0aW5nIG1ldGhvZHMuCisgICAgVHlwZVNvdXJjZUluZm8gKlN1YnN0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFBhcm1WYXJEZWNsICo+ICZQYXJhbXMpOworICAgIGJvb2wgSW5pdEZ1bmN0aW9uSW5zdGFudGlhdGlvbihGdW5jdGlvbkRlY2wgKk5ldywgRnVuY3Rpb25EZWNsICpUbXBsKTsKKyAgICBib29sIEluaXRNZXRob2RJbnN0YW50aWF0aW9uKENYWE1ldGhvZERlY2wgKk5ldywgQ1hYTWV0aG9kRGVjbCAqVG1wbCk7CisKKyAgICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKgorICAgICAgU3Vic3RUZW1wbGF0ZVBhcmFtcyhUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKkxpc3QpOworCisgICAgYm9vbCBTdWJzdFF1YWxpZmllcihjb25zdCBEZWNsYXJhdG9yRGVjbCAqT2xkRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0b3JEZWNsICpOZXdEZWNsKTsKKyAgICBib29sIFN1YnN0UXVhbGlmaWVyKGNvbnN0IFRhZ0RlY2wgKk9sZERlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICBUYWdEZWNsICpOZXdEZWNsKTsKKworICAgIERlY2wgKlZpc2l0VmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2woCisgICAgICAgIFZhclRlbXBsYXRlRGVjbCAqVmFyVGVtcGxhdGUsIFZhckRlY2wgKkZyb21WYXIsIHZvaWQgKkluc2VydFBvcywKKyAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICZUZW1wbGF0ZUFyZ3NJbmZvLAorICAgICAgICBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBDb252ZXJ0ZWQpOworCisgICAgRGVjbCAqSW5zdGFudGlhdGVUeXBlZGVmTmFtZURlY2woVHlwZWRlZk5hbWVEZWNsICpELCBib29sIElzVHlwZUFsaWFzKTsKKyAgICBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqCisgICAgSW5zdGFudGlhdGVDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVGVtcGxhdGVEZWNsICpDbGFzc1RlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKlBhcnRpYWxTcGVjKTsKKyAgICBWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKgorICAgIEluc3RhbnRpYXRlVmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb24oCisgICAgICAgIFZhclRlbXBsYXRlRGVjbCAqVmFyVGVtcGxhdGUsCisgICAgICAgIFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqUGFydGlhbFNwZWMpOworICAgIHZvaWQgSW5zdGFudGlhdGVFbnVtRGVmaW5pdGlvbihFbnVtRGVjbCAqRW51bSwgRW51bURlY2wgKlBhdHRlcm4pOworCisgIHByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBEZWNsICppbnN0YW50aWF0ZVVucmVzb2x2ZWRVc2luZ0RlY2woVCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbnN0YW50aWF0aW5nUGFja0VsZW1lbnQgPSBmYWxzZSk7CisgIH07ICAKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfU0VNQV9URU1QTEFURV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL1RlbXBsYXRlRGVkdWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL1RlbXBsYXRlRGVkdWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFlMTc1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvVGVtcGxhdGVEZWR1Y3Rpb24uaApAQCAtMCwwICsxLDMzMCBAQAorLy89PT0tIFRlbXBsYXRlRGVkdWN0aW9uLmggLSBDKysgdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgdHlwZXMgdXNlZCB3aXRoIFNlbWEncyB0ZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24KKy8vIHJvdXRpbmVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TRU1BX1RFTVBMQVRFREVEVUNUSU9OX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TRU1BX1RFTVBMQVRFREVEVUNUSU9OX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQWNjZXNzUGFpci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsVGVtcGxhdGUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVGVtcGxhdGVCYXNlLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvUGFydGlhbERpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgRGVjbDsKK3N0cnVjdCBEZWR1Y2VkUGFjazsKK2NsYXNzIFNlbWE7CisKK25hbWVzcGFjZSBzZW1hIHsKKworLy8vIFxicmllZiBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhbiBhdHRlbXB0ZWQgdGVtcGxhdGUgYXJndW1lbnQKKy8vLyBkZWR1Y3Rpb24sIHdob3NlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSB3YXMgZGVzY3JpYmVkIGJ5IGEKKy8vLyBUZW1wbGF0ZURlZHVjdGlvblJlc3VsdCB2YWx1ZS4KK2NsYXNzIFRlbXBsYXRlRGVkdWN0aW9uSW5mbyB7CisgIC8vLyBcYnJpZWYgVGhlIGRlZHVjZWQgdGVtcGxhdGUgYXJndW1lbnQgbGlzdC4KKyAgVGVtcGxhdGVBcmd1bWVudExpc3QgKkRlZHVjZWQgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIHNvdXJjZSBsb2NhdGlvbiBhdCB3aGljaCB0ZW1wbGF0ZSBhcmd1bWVudAorICAvLy8gZGVkdWN0aW9uIGlzIG9jY3VycmluZy4KKyAgU291cmNlTG9jYXRpb24gTG9jOworCisgIC8vLyBcYnJpZWYgSGF2ZSB3ZSBzdXBwcmVzc2VkIGFuIGVycm9yIGR1cmluZyBkZWR1Y3Rpb24/CisgIGJvb2wgSGFzU0ZJTkFFRGlhZ25vc3RpYyA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBkZXB0aCBmb3Igd2hpY2ggd2UncmUgcGVyZm9ybWluZyBkZWR1Y3Rpb24uCisgIHVuc2lnbmVkIERlZHVjZWREZXB0aDsKKworICAvLy8gXGJyaWVmIFdhcm5pbmdzIChhbmQgZm9sbG93LW9uIG5vdGVzKSB0aGF0IHdlcmUgc3VwcHJlc3NlZCBkdWUgdG8KKyAgLy8vIFNGSU5BRSB3aGlsZSBwZXJmb3JtaW5nIHRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbi4KKyAgU21hbGxWZWN0b3I8UGFydGlhbERpYWdub3N0aWNBdCwgND4gU3VwcHJlc3NlZERpYWdub3N0aWNzOworCitwdWJsaWM6CisgIFRlbXBsYXRlRGVkdWN0aW9uSW5mbyhTb3VyY2VMb2NhdGlvbiBMb2MsIHVuc2lnbmVkIERlZHVjZWREZXB0aCA9IDApCisgICAgICA6IExvYyhMb2MpLCBEZWR1Y2VkRGVwdGgoRGVkdWNlZERlcHRoKSB7fQorICBUZW1wbGF0ZURlZHVjdGlvbkluZm8oY29uc3QgVGVtcGxhdGVEZWR1Y3Rpb25JbmZvICYpID0gZGVsZXRlOworICBUZW1wbGF0ZURlZHVjdGlvbkluZm8gJm9wZXJhdG9yPShjb25zdCBUZW1wbGF0ZURlZHVjdGlvbkluZm8gJikgPSBkZWxldGU7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBhdCB3aGljaCB0ZW1wbGF0ZSBhcmd1bWVudCBpcworICAvLy8gb2NjdXJyaW5nLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NhdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gTG9jOworICB9CisKKyAgLy8vIFxicmllZiBUaGUgZGVwdGggb2YgdGVtcGxhdGUgcGFyYW1ldGVycyBmb3Igd2hpY2ggZGVkdWN0aW9uIGlzIGJlaW5nCisgIC8vLyBwZXJmb3JtZWQuCisgIHVuc2lnbmVkIGdldERlZHVjZWREZXB0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRGVkdWNlZERlcHRoOworICB9CisKKyAgLy8vIFxicmllZiBUYWtlIG93bmVyc2hpcCBvZiB0aGUgZGVkdWNlZCB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0LgorICBUZW1wbGF0ZUFyZ3VtZW50TGlzdCAqdGFrZSgpIHsKKyAgICBUZW1wbGF0ZUFyZ3VtZW50TGlzdCAqUmVzdWx0ID0gRGVkdWNlZDsKKyAgICBEZWR1Y2VkID0gbnVsbHB0cjsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgLy8vIFxicmllZiBUYWtlIG93bmVyc2hpcCBvZiB0aGUgU0ZJTkFFIGRpYWdub3N0aWMuCisgIHZvaWQgdGFrZVNGSU5BRURpYWdub3N0aWMoUGFydGlhbERpYWdub3N0aWNBdCAmUEQpIHsKKyAgICBhc3NlcnQoSGFzU0ZJTkFFRGlhZ25vc3RpYyk7CisgICAgUEQuZmlyc3QgPSBTdXBwcmVzc2VkRGlhZ25vc3RpY3MuZnJvbnQoKS5maXJzdDsKKyAgICBQRC5zZWNvbmQuc3dhcChTdXBwcmVzc2VkRGlhZ25vc3RpY3MuZnJvbnQoKS5zZWNvbmQpOworICAgIGNsZWFyU0ZJTkFFRGlhZ25vc3RpYygpOworICB9CisKKyAgLy8vIFxicmllZiBEaXNjYXJkIGFueSBTRklOQUUgZGlhZ25vc3RpY3MuCisgIHZvaWQgY2xlYXJTRklOQUVEaWFnbm9zdGljKCkgeworICAgIFN1cHByZXNzZWREaWFnbm9zdGljcy5jbGVhcigpOworICAgIEhhc1NGSU5BRURpYWdub3N0aWMgPSBmYWxzZTsKKyAgfQorCisgIC8vLyBQZWVrIGF0IHRoZSBTRklOQUUgZGlhZ25vc3RpYy4KKyAgY29uc3QgUGFydGlhbERpYWdub3N0aWNBdCAmcGVla1NGSU5BRURpYWdub3N0aWMoKSBjb25zdCB7CisgICAgYXNzZXJ0KEhhc1NGSU5BRURpYWdub3N0aWMpOworICAgIHJldHVybiBTdXBwcmVzc2VkRGlhZ25vc3RpY3MuZnJvbnQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUHJvdmlkZSBhIG5ldyB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0IHRoYXQgY29udGFpbnMgdGhlCisgIC8vLyByZXN1bHRzIG9mIHRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbi4KKyAgdm9pZCByZXNldChUZW1wbGF0ZUFyZ3VtZW50TGlzdCAqTmV3RGVkdWNlZCkgeworICAgIERlZHVjZWQgPSBOZXdEZWR1Y2VkOworICB9CisKKyAgLy8vIFxicmllZiBJcyBhIFNGSU5BRSBkaWFnbm9zdGljIGF2YWlsYWJsZT8KKyAgYm9vbCBoYXNTRklOQUVEaWFnbm9zdGljKCkgY29uc3QgeworICAgIHJldHVybiBIYXNTRklOQUVEaWFnbm9zdGljOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGRpYWdub3N0aWMgd2hpY2ggY2F1c2VkIHRoZSBTRklOQUUgZmFpbHVyZS4KKyAgdm9pZCBhZGRTRklOQUVEaWFnbm9zdGljKFNvdXJjZUxvY2F0aW9uIExvYywgUGFydGlhbERpYWdub3N0aWMgUEQpIHsKKyAgICAvLyBPbmx5IGNvbGxlY3QgdGhlIGZpcnN0IGRpYWdub3N0aWMuCisgICAgaWYgKEhhc1NGSU5BRURpYWdub3N0aWMpCisgICAgICByZXR1cm47CisgICAgU3VwcHJlc3NlZERpYWdub3N0aWNzLmNsZWFyKCk7CisgICAgU3VwcHJlc3NlZERpYWdub3N0aWNzLmVtcGxhY2VfYmFjayhMb2MsIHN0ZDo6bW92ZShQRCkpOworICAgIEhhc1NGSU5BRURpYWdub3N0aWMgPSB0cnVlOworICB9CisKKyAgLy8vIFxicmllZiBBZGQgYSBuZXcgZGlhZ25vc3RpYyB0byB0aGUgc2V0IG9mIGRpYWdub3N0aWNzCisgIHZvaWQgYWRkU3VwcHJlc3NlZERpYWdub3N0aWMoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpYWxEaWFnbm9zdGljIFBEKSB7CisgICAgaWYgKEhhc1NGSU5BRURpYWdub3N0aWMpCisgICAgICByZXR1cm47CisgICAgU3VwcHJlc3NlZERpYWdub3N0aWNzLmVtcGxhY2VfYmFjayhMb2MsIHN0ZDo6bW92ZShQRCkpOworICB9CisKKyAgLy8vIFxicmllZiBJdGVyYXRvciBvdmVyIHRoZSBzZXQgb2Ygc3VwcHJlc3NlZCBkaWFnbm9zdGljcy4KKyAgdXNpbmcgZGlhZ19pdGVyYXRvciA9IFNtYWxsVmVjdG9ySW1wbDxQYXJ0aWFsRGlhZ25vc3RpY0F0Pjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlcXVlbmNlIG9mIHN1cHByZXNzZWQKKyAgLy8vIGRpYWdub3N0aWNzLgorICBkaWFnX2l0ZXJhdG9yIGRpYWdfYmVnaW4oKSBjb25zdCB7IHJldHVybiBTdXBwcmVzc2VkRGlhZ25vc3RpY3MuYmVnaW4oKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhbiBpdGVyYXRvciBhdCB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZSBvZiBzdXBwcmVzc2VkCisgIC8vLyBkaWFnbm9zdGljcy4KKyAgZGlhZ19pdGVyYXRvciBkaWFnX2VuZCgpIGNvbnN0IHsgcmV0dXJuIFN1cHByZXNzZWREaWFnbm9zdGljcy5lbmQoKTsgfQorCisgIC8vLyBcYnJpZWYgVGhlIHRlbXBsYXRlIHBhcmFtZXRlciB0byB3aGljaCBhIHRlbXBsYXRlIGFyZ3VtZW50CisgIC8vLyBkZWR1Y3Rpb24gZmFpbHVyZSByZWZlcnMuCisgIC8vLworICAvLy8gRGVwZW5kaW5nIG9uIHRoZSByZXN1bHQgb2YgdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uLCB0aGlzCisgIC8vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbWF5IGhhdmUgZGlmZmVyZW50IG1lYW5pbmdzOgorICAvLy8KKyAgLy8vICAgVERLX0luY29tcGxldGU6IHRoaXMgaXMgdGhlIGZpcnN0IHRlbXBsYXRlIHBhcmFtZXRlciB3aG9zZQorICAvLy8gICBjb3JyZXNwb25kaW5nIHRlbXBsYXRlIGFyZ3VtZW50IHdhcyBub3QgZGVkdWNlZC4KKyAgLy8vCisgIC8vLyAgIFRES19JbmNvbnNpc3RlbnQ6IHRoaXMgaXMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBmb3Igd2hpY2gKKyAgLy8vICAgdHdvIGRpZmZlcmVudCB0ZW1wbGF0ZSBhcmd1bWVudCB2YWx1ZXMgd2VyZSBkZWR1Y2VkLgorICBUZW1wbGF0ZVBhcmFtZXRlciBQYXJhbTsKKworICAvLy8gXGJyaWVmIFRoZSBmaXJzdCB0ZW1wbGF0ZSBhcmd1bWVudCB0byB3aGljaCB0aGUgdGVtcGxhdGUKKyAgLy8vIGFyZ3VtZW50IGRlZHVjdGlvbiBmYWlsdXJlIHJlZmVycy4KKyAgLy8vCisgIC8vLyBEZXBlbmRpbmcgb24gdGhlIHJlc3VsdCBvZiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uLAorICAvLy8gdGhpcyB0ZW1wbGF0ZSBhcmd1bWVudCBtYXkgaGF2ZSBkaWZmZXJlbnQgbWVhbmluZ3M6CisgIC8vLworICAvLy8gICBUREtfSW5jb25zaXN0ZW50OiB0aGlzIGFyZ3VtZW50IGlzIHRoZSBmaXJzdCB2YWx1ZSBkZWR1Y2VkCisgIC8vLyAgIGZvciB0aGUgY29ycmVzcG9uZGluZyB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCisgIC8vLworICAvLy8gICBUREtfU3Vic3RpdHV0aW9uRmFpbHVyZTogdGhpcyBhcmd1bWVudCBpcyB0aGUgdGVtcGxhdGUKKyAgLy8vICAgYXJndW1lbnQgd2Ugd2VyZSBpbnN0YW50aWF0aW5nIHdoZW4gd2UgZW5jb3VudGVyZWQgYW4gZXJyb3IuCisgIC8vLworICAvLy8gICBUREtfRGVkdWNlZE1pc21hdGNoOiB0aGlzIGlzIHRoZSBwYXJhbWV0ZXIgdHlwZSwgYWZ0ZXIgc3Vic3RpdHV0aW5nCisgIC8vLyAgIGRlZHVjZWQgYXJndW1lbnRzLgorICAvLy8KKyAgLy8vICAgVERLX05vbkRlZHVjZWRNaXNtYXRjaDogdGhpcyBpcyB0aGUgY29tcG9uZW50IG9mIHRoZSAncGFyYW1ldGVyJworICAvLy8gICBvZiB0aGUgZGVkdWN0aW9uLCBkaXJlY3RseSBwcm92aWRlZCBpbiB0aGUgc291cmNlIGNvZGUuCisgIFRlbXBsYXRlQXJndW1lbnQgRmlyc3RBcmc7CisKKyAgLy8vIFxicmllZiBUaGUgc2Vjb25kIHRlbXBsYXRlIGFyZ3VtZW50IHRvIHdoaWNoIHRoZSB0ZW1wbGF0ZQorICAvLy8gYXJndW1lbnQgZGVkdWN0aW9uIGZhaWx1cmUgcmVmZXJzLgorICAvLy8KKyAgLy8vICAgVERLX0luY29uc2lzdGVudDogdGhpcyBhcmd1bWVudCBpcyB0aGUgc2Vjb25kIHZhbHVlIGRlZHVjZWQKKyAgLy8vICAgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHRlbXBsYXRlIHBhcmFtZXRlci4KKyAgLy8vCisgIC8vLyAgIFRES19EZWR1Y2VkTWlzbWF0Y2g6IHRoaXMgaXMgdGhlIChhZGp1c3RlZCkgY2FsbCBhcmd1bWVudCB0eXBlLgorICAvLy8KKyAgLy8vICAgVERLX05vbkRlZHVjZWRNaXNtYXRjaDogdGhpcyBpcyB0aGUgbWlzbWF0Y2hpbmcgY29tcG9uZW50IG9mIHRoZQorICAvLy8gICAnYXJndW1lbnQnIG9mIHRoZSBkZWR1Y3Rpb24sIGZyb20gd2hpY2ggd2UgYXJlIGRlZHVjaW5nIGFyZ3VtZW50cy4KKyAgLy8vCisgIC8vLyBGSVhNRTogRmluaXNoIGRvY3VtZW50aW5nIHRoaXMuCisgIFRlbXBsYXRlQXJndW1lbnQgU2Vjb25kQXJnOworCisgIC8vLyBcYnJpZWYgVGhlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBhcmd1bWVudCB0aGF0IGNhdXNlZCBhIGRlZHVjdGlvbgorICAvLy8gZmFpbHVyZS4KKyAgLy8vCisgIC8vLyAgIFRES19EZWR1Y2VkTWlzbWF0Y2g6IHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBhcmd1bWVudCB0aGF0IGhhZCBhCisgIC8vLyAgIGRpZmZlcmVudCBhcmd1bWVudCB0eXBlIGZyb20gaXRzIHN1YnN0aXR1dGVkIHBhcmFtZXRlciB0eXBlLgorICB1bnNpZ25lZCBDYWxsQXJnSW5kZXggPSAwOworCisgIC8vLyBcYnJpZWYgSW5mb3JtYXRpb24gb24gcGFja3MgdGhhdCB3ZSdyZSBjdXJyZW50bHkgZXhwYW5kaW5nLgorICAvLy8KKyAgLy8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBrZXB0IGludGVybmFsIHRvIFNlbWFUZW1wbGF0ZURlZHVjdGlvbi4KKyAgU21hbGxWZWN0b3I8RGVkdWNlZFBhY2sgKiwgOD4gUGVuZGluZ0RlZHVjZWRQYWNrczsKK307CisKK30gLy8gbmFtZXNwYWNlIHNlbWEKKworLy8vIEEgc3RydWN0dXJlIHVzZWQgdG8gcmVjb3JkIGluZm9ybWF0aW9uIGFib3V0IGEgZmFpbGVkCisvLy8gdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uLCBmb3IgZGlhZ25vc2lzLgorc3RydWN0IERlZHVjdGlvbkZhaWx1cmVJbmZvIHsKKyAgLy8vIEEgU2VtYTo6VGVtcGxhdGVEZWR1Y3Rpb25SZXN1bHQuCisgIHVuc2lnbmVkIFJlc3VsdCA6IDg7CisKKyAgLy8vIFxicmllZiBJbmRpY2F0ZXMgd2hldGhlciBhIGRpYWdub3N0aWMgaXMgc3RvcmVkIGluIERpYWdub3N0aWMuCisgIHVuc2lnbmVkIEhhc0RpYWdub3N0aWMgOiAxOworCisgIC8vLyBcYnJpZWYgT3BhcXVlIHBvaW50ZXIgY29udGFpbmluZyBhZGRpdGlvbmFsIGRhdGEgYWJvdXQKKyAgLy8vIHRoaXMgZGVkdWN0aW9uIGZhaWx1cmUuCisgIHZvaWQgKkRhdGE7CisKKyAgLy8vIFxicmllZiBBIGRpYWdub3N0aWMgaW5kaWNhdGluZyB3aHkgZGVkdWN0aW9uIGZhaWxlZC4KKyAgYWxpZ25hcyhQYXJ0aWFsRGlhZ25vc3RpY0F0KSBjaGFyIERpYWdub3N0aWNbc2l6ZW9mKFBhcnRpYWxEaWFnbm9zdGljQXQpXTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBkaWFnbm9zdGljIHdoaWNoIGNhdXNlZCB0aGlzIGRlZHVjdGlvbiBmYWlsdXJlLAorICAvLy8gaWYgYW55LgorICBQYXJ0aWFsRGlhZ25vc3RpY0F0ICpnZXRTRklOQUVEaWFnbm9zdGljKCk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIHRoaXMgZGVkdWN0aW9uIGZhaWx1cmUKKyAgLy8vIHJlZmVycyB0bywgaWYgYW55LgorICBUZW1wbGF0ZVBhcmFtZXRlciBnZXRUZW1wbGF0ZVBhcmFtZXRlcigpOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgLy8vIGRlZHVjdGlvbiBmYWlsdXJlLCBpZiBhbnkuCisgIFRlbXBsYXRlQXJndW1lbnRMaXN0ICpnZXRUZW1wbGF0ZUFyZ3VtZW50TGlzdCgpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBmaXJzdCB0ZW1wbGF0ZSBhcmd1bWVudCB0aGlzIGRlZHVjdGlvbiBmYWlsdXJlCisgIC8vLyByZWZlcnMgdG8sIGlmIGFueS4KKyAgY29uc3QgVGVtcGxhdGVBcmd1bWVudCAqZ2V0Rmlyc3RBcmcoKTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgc2Vjb25kIHRlbXBsYXRlIGFyZ3VtZW50IHRoaXMgZGVkdWN0aW9uIGZhaWx1cmUKKyAgLy8vIHJlZmVycyB0bywgaWYgYW55LgorICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpnZXRTZWNvbmRBcmcoKTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGNhbGwgYXJndW1lbnQgdGhhdCB0aGlzIGRlZHVjdGlvbgorICAvLy8gZmFpbHVyZSByZWZlcnMgdG8sIGlmIGFueS4KKyAgbGx2bTo6T3B0aW9uYWw8dW5zaWduZWQ+IGdldENhbGxBcmdJbmRleCgpOworCisgIC8vLyBcYnJpZWYgRnJlZSBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRlZHVjdGlvbiBmYWlsdXJlLgorICB2b2lkIERlc3Ryb3koKTsKK307CisKKy8vLyBUZW1wbGF0ZVNwZWNDYW5kaWRhdGUgLSBUaGlzIGlzIGEgZ2VuZXJhbGl6YXRpb24gb2YgT3ZlcmxvYWRDYW5kaWRhdGUKKy8vLyB3aGljaCBrZWVwcyB0cmFjayBvZiB0ZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24gZmFpbHVyZSBpbmZvLCB3aGVuCisvLy8gaGFuZGxpbmcgZXhwbGljaXQgc3BlY2lhbGl6YXRpb25zIChhbmQgaW5zdGFudGlhdGlvbnMpIG9mIHRlbXBsYXRlcworLy8vIGJleW9uZCBmdW5jdGlvbiBvdmVybG9hZGluZy4KKy8vLyBGb3Igbm93LCBhc3N1bWUgdGhhdCB0aGUgY2FuZGlkYXRlcyBhcmUgbm9uLW1hdGNoaW5nIHNwZWNpYWxpemF0aW9ucy4KKy8vLyBUT0RPOiBJbiB0aGUgZnV0dXJlLCB3ZSBtYXkgbmVlZCB0byB1bmlmeS9nZW5lcmFsaXplIHRoaXMgd2l0aAorLy8vIE92ZXJsb2FkQ2FuZGlkYXRlLgorc3RydWN0IFRlbXBsYXRlU3BlY0NhbmRpZGF0ZSB7CisgIC8vLyBcYnJpZWYgVGhlIGRlY2xhcmF0aW9uIHRoYXQgd2FzIGxvb2tlZCB1cCwgdG9nZXRoZXIgd2l0aCBpdHMgYWNjZXNzLgorICAvLy8gTWlnaHQgYmUgYSBVc2luZ1NoYWRvd0RlY2wsIGJ1dCB1c3VhbGx5IGEgRnVuY3Rpb25UZW1wbGF0ZURlY2wuCisgIERlY2xBY2Nlc3NQYWlyIEZvdW5kRGVjbDsKKworICAvLy8gU3BlY2lhbGl6YXRpb24gLSBUaGUgYWN0dWFsIHNwZWNpYWxpemF0aW9uIHRoYXQgdGhpcyBjYW5kaWRhdGUKKyAgLy8vIHJlcHJlc2VudHMuIFdoZW4gTlVMTCwgdGhpcyBtYXkgYmUgYSBidWlsdC1pbiBjYW5kaWRhdGUuCisgIERlY2wgKlNwZWNpYWxpemF0aW9uOworCisgIC8vLyBUZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24gaW5mbworICBEZWR1Y3Rpb25GYWlsdXJlSW5mbyBEZWR1Y3Rpb25GYWlsdXJlOworCisgIHZvaWQgc2V0KERlY2xBY2Nlc3NQYWlyIEZvdW5kLCBEZWNsICpTcGVjLCBEZWR1Y3Rpb25GYWlsdXJlSW5mbyBJbmZvKSB7CisgICAgRm91bmREZWNsID0gRm91bmQ7CisgICAgU3BlY2lhbGl6YXRpb24gPSBTcGVjOworICAgIERlZHVjdGlvbkZhaWx1cmUgPSBJbmZvOworICB9CisKKyAgLy8vIERpYWdub3NlIGEgdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uIGZhaWx1cmUuCisgIHZvaWQgTm90ZURlZHVjdGlvbkZhaWx1cmUoU2VtYSAmUywgYm9vbCBGb3JUYWtpbmdBZGRyZXNzKTsKK307CisKKy8vLyBUZW1wbGF0ZVNwZWNDYW5kaWRhdGVTZXQgLSBBIHNldCBvZiBnZW5lcmFsaXplZCBvdmVybG9hZCBjYW5kaWRhdGVzLAorLy8vIHVzZWQgaW4gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zLgorLy8vIFRPRE86IEluIHRoZSBmdXR1cmUsIHdlIG1heSBuZWVkIHRvIHVuaWZ5L2dlbmVyYWxpemUgdGhpcyB3aXRoCisvLy8gT3ZlcmxvYWRDYW5kaWRhdGVTZXQuCitjbGFzcyBUZW1wbGF0ZVNwZWNDYW5kaWRhdGVTZXQgeworICBTbWFsbFZlY3RvcjxUZW1wbGF0ZVNwZWNDYW5kaWRhdGUsIDE2PiBDYW5kaWRhdGVzOworICBTb3VyY2VMb2NhdGlvbiBMb2M7CisKKyAgLy8gU3RvcmVzIHdoZXRoZXIgd2UncmUgdGFraW5nIHRoZSBhZGRyZXNzIG9mIHRoZXNlIGNhbmRpZGF0ZXMuIFRoaXMgaGVscHMgdXMKKyAgLy8gcHJvZHVjZSBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgd2hlbiBkZWFsaW5nIHdpdGggdGhlIHBhc3Nfb2JqZWN0X3NpemUKKyAgLy8gYXR0cmlidXRlIG9uIHBhcmFtZXRlcnMuCisgIGJvb2wgRm9yVGFraW5nQWRkcmVzczsKKworICB2b2lkIGRlc3Ryb3lDYW5kaWRhdGVzKCk7CisKK3B1YmxpYzoKKyAgVGVtcGxhdGVTcGVjQ2FuZGlkYXRlU2V0KFNvdXJjZUxvY2F0aW9uIExvYywgYm9vbCBGb3JUYWtpbmdBZGRyZXNzID0gZmFsc2UpCisgICAgICA6IExvYyhMb2MpLCBGb3JUYWtpbmdBZGRyZXNzKEZvclRha2luZ0FkZHJlc3MpIHt9CisgIFRlbXBsYXRlU3BlY0NhbmRpZGF0ZVNldChjb25zdCBUZW1wbGF0ZVNwZWNDYW5kaWRhdGVTZXQgJikgPSBkZWxldGU7CisgIFRlbXBsYXRlU3BlY0NhbmRpZGF0ZVNldCAmCisgIG9wZXJhdG9yPShjb25zdCBUZW1wbGF0ZVNwZWNDYW5kaWRhdGVTZXQgJikgPSBkZWxldGU7CisgIH5UZW1wbGF0ZVNwZWNDYW5kaWRhdGVTZXQoKSB7IGRlc3Ryb3lDYW5kaWRhdGVzKCk7IH0KKworICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIExvYzsgfQorCisgIC8vLyBcYnJpZWYgQ2xlYXIgb3V0IGFsbCBvZiB0aGUgY2FuZGlkYXRlcy4KKyAgLy8vIFRPRE86IFRoaXMgbWF5IGJlIHVubmVjZXNzYXJ5LgorICB2b2lkIGNsZWFyKCk7CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBTbWFsbFZlY3RvcjxUZW1wbGF0ZVNwZWNDYW5kaWRhdGUsIDE2Pjo6aXRlcmF0b3I7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBDYW5kaWRhdGVzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gQ2FuZGlkYXRlcy5lbmQoKTsgfQorCisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gQ2FuZGlkYXRlcy5zaXplKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIENhbmRpZGF0ZXMuZW1wdHkoKTsgfQorCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IGNhbmRpZGF0ZSB3aXRoIE51bUNvbnZlcnNpb25zIGNvbnZlcnNpb24gc2VxdWVuY2Ugc2xvdHMKKyAgLy8vIHRvIHRoZSBvdmVybG9hZCBzZXQuCisgIFRlbXBsYXRlU3BlY0NhbmRpZGF0ZSAmYWRkQ2FuZGlkYXRlKCkgeworICAgIENhbmRpZGF0ZXMuZW1wbGFjZV9iYWNrKCk7CisgICAgcmV0dXJuIENhbmRpZGF0ZXMuYmFjaygpOworICB9CisKKyAgdm9pZCBOb3RlQ2FuZGlkYXRlcyhTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MpOworCisgIHZvaWQgTm90ZUNhbmRpZGF0ZXMoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jKSBjb25zdCB7CisgICAgY29uc3RfY2FzdDxUZW1wbGF0ZVNwZWNDYW5kaWRhdGVTZXQgKj4odGhpcyktPk5vdGVDYW5kaWRhdGVzKFMsIExvYyk7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1NFTUFfVEVNUExBVEVERURVQ1RJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9UZW1wbGF0ZUluc3RDYWxsYmFjay5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9UZW1wbGF0ZUluc3RDYWxsYmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YTNkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL1RlbXBsYXRlSW5zdENhbGxiYWNrLmgKQEAgLTAsMCArMSw4MyBAQAorLy89PT0tIFRlbXBsYXRlSW5zdENhbGxiYWNrLmggLSBUZW1wbGF0ZSBJbnN0YW50aWF0aW9uIENhbGxiYWNrIC0gQysrIC0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBUZW1wbGF0ZUluc3RhbnRpYXRpb25DYWxsYmFjayBjbGFzcywgd2hpY2ggaXMgdGhlCisvLyBiYXNlIGNsYXNzIGZvciBjYWxsYmFja3MgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIGF0IHRlbXBsYXRlIGluc3RhbnRpYXRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RFTVBMQVRFX0lOU1RfQ0FMTEJBQ0tfSAorI2RlZmluZSBMTFZNX0NMQU5HX1RFTVBMQVRFX0lOU1RfQ0FMTEJBQ0tfSAorCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9TZW1hLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKKy8vLyBcYnJpZWYgVGhpcyBpcyBhIGJhc2UgY2xhc3MgZm9yIGNhbGxiYWNrcyB0aGF0IHdpbGwgYmUgbm90aWZpZWQgYXQgZXZlcnkKKy8vLyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uLgorY2xhc3MgVGVtcGxhdGVJbnN0YW50aWF0aW9uQ2FsbGJhY2sgeworcHVibGljOgorICB2aXJ0dWFsIH5UZW1wbGF0ZUluc3RhbnRpYXRpb25DYWxsYmFjaygpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIENhbGxlZCBiZWZvcmUgZG9pbmcgQVNULXBhcnNpbmcuCisgIHZpcnR1YWwgdm9pZCBpbml0aWFsaXplKGNvbnN0IFNlbWEgJlRoZVNlbWEpID0gMDsKKworICAvLy8gXGJyaWVmIENhbGxlZCBhZnRlciBBU1QtcGFyc2luZyBpcyBjb21wbGV0ZWQuCisgIHZpcnR1YWwgdm9pZCBmaW5hbGl6ZShjb25zdCBTZW1hICZUaGVTZW1hKSA9IDA7CisKKyAgLy8vIFxicmllZiBDYWxsZWQgd2hlbiBpbnN0YW50aWF0aW9uIG9mIGEgdGVtcGxhdGUganVzdCBiZWdhbi4KKyAgdmlydHVhbCB2b2lkIGF0VGVtcGxhdGVCZWdpbihjb25zdCBTZW1hICZUaGVTZW1hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbWE6OkNvZGVTeW50aGVzaXNDb250ZXh0ICZJbnN0KSA9IDA7CisKKyAgLy8vIFxicmllZiBDYWxsZWQgd2hlbiBpbnN0YW50aWF0aW9uIG9mIGEgdGVtcGxhdGUgaXMganVzdCBhYm91dCB0byBlbmQuCisgIHZpcnR1YWwgdm9pZCBhdFRlbXBsYXRlRW5kKGNvbnN0IFNlbWEgJlRoZVNlbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbWE6OkNvZGVTeW50aGVzaXNDb250ZXh0ICZJbnN0KSA9IDA7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVGVtcGxhdGVJbnN0YW50aWF0aW9uQ2FsbGJhY2tQdHJzPgordm9pZCBpbml0aWFsaXplKFRlbXBsYXRlSW5zdGFudGlhdGlvbkNhbGxiYWNrUHRycyAmQ2FsbGJhY2tzLAorICAgICAgICAgICAgICAgIGNvbnN0IFNlbWEgJlRoZVNlbWEpIHsKKyAgZm9yIChhdXRvICZDIDogQ2FsbGJhY2tzKSB7CisgICAgaWYgKEMpCisgICAgICBDLT5pbml0aWFsaXplKFRoZVNlbWEpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUZW1wbGF0ZUluc3RhbnRpYXRpb25DYWxsYmFja1B0cnM+Cit2b2lkIGZpbmFsaXplKFRlbXBsYXRlSW5zdGFudGlhdGlvbkNhbGxiYWNrUHRycyAmQ2FsbGJhY2tzLAorICAgICAgICAgICAgICBjb25zdCBTZW1hICZUaGVTZW1hKSB7CisgIGZvciAoYXV0byAmQyA6IENhbGxiYWNrcykgeworICAgIGlmIChDKQorICAgICAgQy0+ZmluYWxpemUoVGhlU2VtYSk7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIFRlbXBsYXRlSW5zdGFudGlhdGlvbkNhbGxiYWNrUHRycz4KK3ZvaWQgYXRUZW1wbGF0ZUJlZ2luKFRlbXBsYXRlSW5zdGFudGlhdGlvbkNhbGxiYWNrUHRycyAmQ2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VtYSAmVGhlU2VtYSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbWE6OkNvZGVTeW50aGVzaXNDb250ZXh0ICZJbnN0KSB7CisgIGZvciAoYXV0byAmQyA6IENhbGxiYWNrcykgeworICAgIGlmIChDKQorICAgICAgQy0+YXRUZW1wbGF0ZUJlZ2luKFRoZVNlbWEsIEluc3QpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUZW1wbGF0ZUluc3RhbnRpYXRpb25DYWxsYmFja1B0cnM+Cit2b2lkIGF0VGVtcGxhdGVFbmQoVGVtcGxhdGVJbnN0YW50aWF0aW9uQ2FsbGJhY2tQdHJzICZDYWxsYmFja3MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgU2VtYSAmVGhlU2VtYSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBTZW1hOjpDb2RlU3ludGhlc2lzQ29udGV4dCAmSW5zdCkgeworICBmb3IgKGF1dG8gJkMgOiBDYWxsYmFja3MpIHsKKyAgICBpZiAoQykKKyAgICAgIEMtPmF0VGVtcGxhdGVFbmQoVGhlU2VtYSwgSW5zdCk7CisgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL1R5cG9Db3JyZWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZW1hL1R5cG9Db3JyZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVjZDVmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvVHlwb0NvcnJlY3Rpb24uaApAQCAtMCwwICsxLDM5MiBAQAorLy89PT0tIFR5cG9Db3JyZWN0aW9uLmggLSBDbGFzcyBmb3IgdHlwbyBjb3JyZWN0aW9uIHJlc3VsdHMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgVHlwb0NvcnJlY3Rpb24gY2xhc3MsIHdoaWNoIHN0b3JlcyB0aGUgcmVzdWx0cyBvZgorLy8gU2VtYSdzIHR5cG8gY29ycmVjdGlvbiAoU2VtYTo6Q29ycmVjdFR5cG8pLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TRU1BX1RZUE9DT1JSRUNUSU9OX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TRU1BX1RZUE9DT1JSRUNUSU9OX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xhcmF0aW9uTmFtZS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9QYXJ0aWFsRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9EZWNsU3BlYy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgRGVjbENvbnRleHQ7CitjbGFzcyBJZGVudGlmaWVySW5mbzsKK2NsYXNzIExhbmdPcHRpb25zOworY2xhc3MgTWVtYmVyRXhwcjsKK2NsYXNzIE5lc3RlZE5hbWVTcGVjaWZpZXI7CitjbGFzcyBTZW1hOworCisvLy8gQGJyaWVmIFNpbXBsZSBjbGFzcyBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgU2VtYTo6Q29ycmVjdFR5cG8KK2NsYXNzIFR5cG9Db3JyZWN0aW9uIHsKK3B1YmxpYzoKKyAgLy8gIkRpc3RhbmNlIiBmb3IgdW51c2FibGUgY29ycmVjdGlvbnMKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEludmFsaWREaXN0YW5jZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKKworICAvLyBUaGUgbGFyZ2VzdCBkaXN0YW5jZSBzdGlsbCBjb25zaWRlcmVkIHZhbGlkIChsYXJnZXIgZWRpdCBkaXN0YW5jZXMgYXJlCisgIC8vIG1hcHBlZCB0byBJbnZhbGlkRGlzdGFuY2UgYnkgZ2V0RWRpdERpc3RhbmNlKS4KKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE1heGltdW1EaXN0YW5jZSA9IDEwMDAwVTsKKworICAvLyBSZWxhdGl2ZSB3ZWlnaHRpbmdzIG9mIHRoZSAiZWRpdCBkaXN0YW5jZSIgY29tcG9uZW50cy4gVGhlIGhpZ2hlciB0aGUKKyAgLy8gd2VpZ2h0LCB0aGUgbW9yZSBvZiBhIHBlbmFsdHkgdG8gZml0bmVzcyB0aGUgY29tcG9uZW50IHdpbGwgZ2l2ZSAoaGlnaGVyCisgIC8vIHdlaWdodHMgbWVhbiBncmVhdGVyIGNvbnRyaWJ1dGlvbiB0byB0aGUgdG90YWwgZWRpdCBkaXN0YW5jZSwgd2l0aCB0aGUKKyAgLy8gYmVzdCBjb3JyZWN0aW9uIGNhbmRpZGF0ZXMgaGF2aW5nIHRoZSBsb3dlc3QgZWRpdCBkaXN0YW5jZSkuCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBDaGFyRGlzdGFuY2VXZWlnaHQgPSAxMDBVOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUXVhbGlmaWVyRGlzdGFuY2VXZWlnaHQgPSAxMTBVOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQ2FsbGJhY2tEaXN0YW5jZVdlaWdodCA9IDE1MFU7CisKKyAgVHlwb0NvcnJlY3Rpb24oY29uc3QgRGVjbGFyYXRpb25OYW1lICZOYW1lLCBOYW1lZERlY2wgKk5hbWVEZWNsLAorICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlMgPSBudWxscHRyLCB1bnNpZ25lZCBDaGFyRGlzdGFuY2UgPSAwLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBRdWFsaWZpZXJEaXN0YW5jZSA9IDApCisgICAgICA6IENvcnJlY3Rpb25OYW1lKE5hbWUpLCBDb3JyZWN0aW9uTmFtZVNwZWMoTk5TKSwKKyAgICAgICAgQ2hhckRpc3RhbmNlKENoYXJEaXN0YW5jZSksIFF1YWxpZmllckRpc3RhbmNlKFF1YWxpZmllckRpc3RhbmNlKSB7CisgICAgaWYgKE5hbWVEZWNsKQorICAgICAgQ29ycmVjdGlvbkRlY2xzLnB1c2hfYmFjayhOYW1lRGVjbCk7CisgIH0KKworICBUeXBvQ29ycmVjdGlvbihOYW1lZERlY2wgKk5hbWUsIE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENoYXJEaXN0YW5jZSA9IDApCisgICAgICA6IENvcnJlY3Rpb25OYW1lKE5hbWUtPmdldERlY2xOYW1lKCkpLCBDb3JyZWN0aW9uTmFtZVNwZWMoTk5TKSwKKyAgICAgICAgQ2hhckRpc3RhbmNlKENoYXJEaXN0YW5jZSkgeworICAgIGlmIChOYW1lKQorICAgICAgQ29ycmVjdGlvbkRlY2xzLnB1c2hfYmFjayhOYW1lKTsKKyAgfQorCisgIFR5cG9Db3JyZWN0aW9uKERlY2xhcmF0aW9uTmFtZSBOYW1lLCBOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDaGFyRGlzdGFuY2UgPSAwKQorICAgICAgOiBDb3JyZWN0aW9uTmFtZShOYW1lKSwgQ29ycmVjdGlvbk5hbWVTcGVjKE5OUyksCisgICAgICAgIENoYXJEaXN0YW5jZShDaGFyRGlzdGFuY2UpIHt9CisKKyAgVHlwb0NvcnJlY3Rpb24oKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBHZXRzIHRoZSBEZWNsYXJhdGlvbk5hbWUgb2YgdGhlIHR5cG8gY29ycmVjdGlvbgorICBEZWNsYXJhdGlvbk5hbWUgZ2V0Q29ycmVjdGlvbigpIGNvbnN0IHsgcmV0dXJuIENvcnJlY3Rpb25OYW1lOyB9CisKKyAgSWRlbnRpZmllckluZm8gKmdldENvcnJlY3Rpb25Bc0lkZW50aWZpZXJJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBDb3JyZWN0aW9uTmFtZS5nZXRBc0lkZW50aWZpZXJJbmZvKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldHMgdGhlIE5lc3RlZE5hbWVTcGVjaWZpZXIgbmVlZGVkIHRvIHVzZSB0aGUgdHlwbyBjb3JyZWN0aW9uCisgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKmdldENvcnJlY3Rpb25TcGVjaWZpZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIENvcnJlY3Rpb25OYW1lU3BlYzsKKyAgfQorCisgIHZvaWQgc2V0Q29ycmVjdGlvblNwZWNpZmllcihOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlMpIHsKKyAgICBDb3JyZWN0aW9uTmFtZVNwZWMgPSBOTlM7CisgICAgRm9yY2VTcGVjaWZpZXJSZXBsYWNlbWVudCA9IChOTlMgIT0gbnVsbHB0cik7CisgIH0KKworICB2b2lkIFdpbGxSZXBsYWNlU3BlY2lmaWVyKGJvb2wgRm9yY2VSZXBsYWNlbWVudCkgeworICAgIEZvcmNlU3BlY2lmaWVyUmVwbGFjZW1lbnQgPSBGb3JjZVJlcGxhY2VtZW50OworICB9CisKKyAgYm9vbCBXaWxsUmVwbGFjZVNwZWNpZmllcigpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9yY2VTcGVjaWZpZXJSZXBsYWNlbWVudDsKKyAgfQorCisgIHZvaWQgc2V0UXVhbGlmaWVyRGlzdGFuY2UodW5zaWduZWQgRUQpIHsKKyAgICBRdWFsaWZpZXJEaXN0YW5jZSA9IEVEOworICB9CisKKyAgdm9pZCBzZXRDYWxsYmFja0Rpc3RhbmNlKHVuc2lnbmVkIEVEKSB7CisgICAgQ2FsbGJhY2tEaXN0YW5jZSA9IEVEOworICB9CisKKyAgLy8gQ29udmVydCB0aGUgZ2l2ZW4gd2VpZ2h0ZWQgZWRpdCBkaXN0YW5jZSB0byBhIHJvdWdobHkgZXF1aXZhbGVudCBudW1iZXIgb2YKKyAgLy8gc2luZ2xlLWNoYXJhY3RlciBlZGl0cyAodHlwaWNhbGx5IGZvciBjb21wYXJpc29uIHRvIHRoZSBsZW5ndGggb2YgdGhlCisgIC8vIHN0cmluZyBiZWluZyBlZGl0ZWQpLgorICBzdGF0aWMgdW5zaWduZWQgTm9ybWFsaXplRWRpdERpc3RhbmNlKHVuc2lnbmVkIEVEKSB7CisgICAgaWYgKEVEID4gTWF4aW11bURpc3RhbmNlKQorICAgICAgcmV0dXJuIEludmFsaWREaXN0YW5jZTsKKyAgICByZXR1cm4gKEVEICsgQ2hhckRpc3RhbmNlV2VpZ2h0IC8gMikgLyBDaGFyRGlzdGFuY2VXZWlnaHQ7CisgIH0KKworICAvLy8gXGJyaWVmIEdldHMgdGhlICJlZGl0IGRpc3RhbmNlIiBvZiB0aGUgdHlwbyBjb3JyZWN0aW9uIGZyb20gdGhlIHR5cG8uCisgIC8vLyBJZiBOb3JtYWxpemVkIGlzIHRydWUsIHNjYWxlIHRoZSBkaXN0YW5jZSBkb3duIGJ5IHRoZSBDaGFyRGlzdGFuY2VXZWlnaHQKKyAgLy8vIHRvIHJldHVybiB0aGUgZWRpdCBkaXN0YW5jZSBpbiB0ZXJtcyBvZiBzaW5nbGUtY2hhcmFjdGVyIGVkaXRzLgorICB1bnNpZ25lZCBnZXRFZGl0RGlzdGFuY2UoYm9vbCBOb3JtYWxpemVkID0gdHJ1ZSkgY29uc3QgeworICAgIGlmIChDaGFyRGlzdGFuY2UgPiBNYXhpbXVtRGlzdGFuY2UgfHwgUXVhbGlmaWVyRGlzdGFuY2UgPiBNYXhpbXVtRGlzdGFuY2UgfHwKKyAgICAgICAgQ2FsbGJhY2tEaXN0YW5jZSA+IE1heGltdW1EaXN0YW5jZSkKKyAgICAgIHJldHVybiBJbnZhbGlkRGlzdGFuY2U7CisgICAgdW5zaWduZWQgRUQgPQorICAgICAgICBDaGFyRGlzdGFuY2UgKiBDaGFyRGlzdGFuY2VXZWlnaHQgKworICAgICAgICBRdWFsaWZpZXJEaXN0YW5jZSAqIFF1YWxpZmllckRpc3RhbmNlV2VpZ2h0ICsKKyAgICAgICAgQ2FsbGJhY2tEaXN0YW5jZSAqIENhbGxiYWNrRGlzdGFuY2VXZWlnaHQ7CisgICAgaWYgKEVEID4gTWF4aW11bURpc3RhbmNlKQorICAgICAgcmV0dXJuIEludmFsaWREaXN0YW5jZTsKKyAgICAvLyBIYWxmIHRoZSBDaGFyRGlzdGFuY2VXZWlnaHQgaXMgYWRkZWQgdG8gRUQgdG8gc2ltdWxhdGUgcm91bmRpbmcgc2luY2UKKyAgICAvLyBpbnRlZ2VyIGRpdmlzaW9uIHRydW5jYXRlcyB0aGUgdmFsdWUgKGkuZS4gcm91bmQtdG8tbmVhcmVzdC1pbnQgaW5zdGVhZAorICAgIC8vIG9mIHJvdW5kLXRvLXplcm8pLgorICAgIHJldHVybiBOb3JtYWxpemVkID8gTm9ybWFsaXplRWRpdERpc3RhbmNlKEVEKSA6IEVEOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGNvcnJlY3Rpb24gZGVjbGFyYXRpb24gZm91bmQgYnkgbmFtZSBsb29rdXAgKGJlZm9yZSB3ZQorICAvLy8gbG9va2VkIHRocm91Z2ggdXNpbmcgc2hhZG93IGRlY2xhcmF0aW9ucyBhbmQgdGhlIGxpa2UpLgorICBOYW1lZERlY2wgKmdldEZvdW5kRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzQ29ycmVjdGlvbkRlY2woKSA/ICooQ29ycmVjdGlvbkRlY2xzLmJlZ2luKCkpIDogbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0cyB0aGUgcG9pbnRlciB0byB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIHR5cG8gY29ycmVjdGlvbgorICBOYW1lZERlY2wgKmdldENvcnJlY3Rpb25EZWNsKCkgY29uc3QgeworICAgIGF1dG8gKkQgPSBnZXRGb3VuZERlY2woKTsKKyAgICByZXR1cm4gRCA/IEQtPmdldFVuZGVybHlpbmdEZWNsKCkgOiBudWxscHRyOworICB9CisgIHRlbXBsYXRlIDxjbGFzcyBEZWNsQ2xhc3M+CisgIERlY2xDbGFzcyAqZ2V0Q29ycmVjdGlvbkRlY2xBcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZHluX2Nhc3Rfb3JfbnVsbDxEZWNsQ2xhc3M+KGdldENvcnJlY3Rpb25EZWNsKCkpOworICB9CisKKyAgLy8vIFxicmllZiBDbGVhcnMgdGhlIGxpc3Qgb2YgTmFtZWREZWNscy4KKyAgdm9pZCBDbGVhckNvcnJlY3Rpb25EZWNscygpIHsKKyAgICBDb3JyZWN0aW9uRGVjbHMuY2xlYXIoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2xlYXJzIHRoZSBsaXN0IG9mIE5hbWVkRGVjbHMgYmVmb3JlIGFkZGluZyB0aGUgbmV3IG9uZS4KKyAgdm9pZCBzZXRDb3JyZWN0aW9uRGVjbChOYW1lZERlY2wgKkNEZWNsKSB7CisgICAgQ29ycmVjdGlvbkRlY2xzLmNsZWFyKCk7CisgICAgYWRkQ29ycmVjdGlvbkRlY2woQ0RlY2wpOworICB9CisKKyAgLy8vIFxicmllZiBDbGVhcnMgdGhlIGxpc3Qgb2YgTmFtZWREZWNscyBhbmQgYWRkcyB0aGUgZ2l2ZW4gc2V0LgorICB2b2lkIHNldENvcnJlY3Rpb25EZWNscyhBcnJheVJlZjxOYW1lZERlY2wqPiBEZWNscykgeworICAgIENvcnJlY3Rpb25EZWNscy5jbGVhcigpOworICAgIENvcnJlY3Rpb25EZWNscy5pbnNlcnQoQ29ycmVjdGlvbkRlY2xzLmJlZ2luKCksIERlY2xzLmJlZ2luKCksIERlY2xzLmVuZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWRkIHRoZSBnaXZlbiBOYW1lZERlY2wgdG8gdGhlIGxpc3Qgb2YgTmFtZWREZWNscyB0aGF0IGFyZSB0aGUKKyAgLy8vIGRlY2xhcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIERlY2xhcmF0aW9uTmFtZSBvZiB0aGlzIFR5cG9Db3JyZWN0aW9uCisgIHZvaWQgYWRkQ29ycmVjdGlvbkRlY2woTmFtZWREZWNsICpDRGVjbCk7CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoY29uc3QgTGFuZ09wdGlvbnMgJkxPKSBjb25zdDsKKworICBzdGQ6OnN0cmluZyBnZXRRdW90ZWQoY29uc3QgTGFuZ09wdGlvbnMgJkxPKSBjb25zdCB7CisgICAgcmV0dXJuICInIiArIGdldEFzU3RyaW5nKExPKSArICInIjsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB3aGV0aGVyIHRoaXMgVHlwb0NvcnJlY3Rpb24gaGFzIGEgbm9uLWVtcHR5IERlY2xhcmF0aW9uTmFtZQorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gYm9vbChDb3JyZWN0aW9uTmFtZSk7IH0KKworICAvLy8gXGJyaWVmIE1hcmsgdGhpcyBUeXBvQ29ycmVjdGlvbiBhcyBiZWluZyBhIGtleXdvcmQuCisgIC8vLyBTaW5jZSBhZGRDb3JyZWN0aW9uRGVjbHNhbmQgc2V0Q29ycmVjdGlvbkRlY2wgZG9uJ3QgYWxsb3cgTlVMTCB0byBiZQorICAvLy8gYWRkZWQgdG8gdGhlIGxpc3Qgb2YgdGhlIGNvcnJlY3Rpb24ncyBOYW1lZERlY2wgcG9pbnRlcnMsIE5VTEwgaXMgYWRkZWQKKyAgLy8vIGFzIHRoZSBvbmx5IGVsZW1lbnQgaW4gdGhlIGxpc3QgdG8gbWFyayB0aGlzIFR5cG9Db3JyZWN0aW9uIGFzIGEga2V5d29yZC4KKyAgdm9pZCBtYWtlS2V5d29yZCgpIHsKKyAgICBDb3JyZWN0aW9uRGVjbHMuY2xlYXIoKTsKKyAgICBDb3JyZWN0aW9uRGVjbHMucHVzaF9iYWNrKG51bGxwdHIpOworICAgIEZvcmNlU3BlY2lmaWVyUmVwbGFjZW1lbnQgPSB0cnVlOworICB9CisKKyAgLy8gQ2hlY2sgaWYgdGhpcyBUeXBvQ29ycmVjdGlvbiBpcyBhIGtleXdvcmQgYnkgY2hlY2tpbmcgaWYgdGhlIGZpcnN0CisgIC8vIGl0ZW0gaW4gQ29ycmVjdGlvbkRlY2xzIGlzIE5VTEwuCisgIGJvb2wgaXNLZXl3b3JkKCkgY29uc3QgeworICAgIHJldHVybiAhQ29ycmVjdGlvbkRlY2xzLmVtcHR5KCkgJiYgQ29ycmVjdGlvbkRlY2xzLmZyb250KCkgPT0gbnVsbHB0cjsKKyAgfQorCisgIC8vIENoZWNrIGlmIHRoaXMgVHlwb0NvcnJlY3Rpb24gaXMgdGhlIGdpdmVuIGtleXdvcmQuCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IFN0ckxlbj4KKyAgYm9vbCBpc0tleXdvcmQoY29uc3QgY2hhciAoJlN0cilbU3RyTGVuXSkgY29uc3QgeworICAgIHJldHVybiBpc0tleXdvcmQoKSAmJiBnZXRDb3JyZWN0aW9uQXNJZGVudGlmaWVySW5mbygpLT5pc1N0cihTdHIpOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjb3JyZWN0aW9uIGVpdGhlciBpcyBhIGtleXdvcmQgb3IgaGFzIGEga25vd24gZGVjbC4KKyAgYm9vbCBpc1Jlc29sdmVkKCkgY29uc3QgeyByZXR1cm4gIUNvcnJlY3Rpb25EZWNscy5lbXB0eSgpOyB9CisKKyAgYm9vbCBpc092ZXJsb2FkZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIENvcnJlY3Rpb25EZWNscy5zaXplKCkgPiAxOworICB9CisKKyAgdm9pZCBzZXRDb3JyZWN0aW9uUmFuZ2UoQ1hYU2NvcGVTcGVjICpTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmVHlwb05hbWUpIHsKKyAgICBDb3JyZWN0aW9uUmFuZ2UgPSBUeXBvTmFtZS5nZXRTb3VyY2VSYW5nZSgpOworICAgIGlmIChGb3JjZVNwZWNpZmllclJlcGxhY2VtZW50ICYmIFNTICYmICFTUy0+aXNFbXB0eSgpKQorICAgICAgQ29ycmVjdGlvblJhbmdlLnNldEJlZ2luKFNTLT5nZXRCZWdpbkxvYygpKTsKKyAgfQorCisgIFNvdXJjZVJhbmdlIGdldENvcnJlY3Rpb25SYW5nZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29ycmVjdGlvblJhbmdlOworICB9CisKKyAgdXNpbmcgZGVjbF9pdGVyYXRvciA9IFNtYWxsVmVjdG9ySW1wbDxOYW1lZERlY2wgKj46Oml0ZXJhdG9yOworCisgIGRlY2xfaXRlcmF0b3IgYmVnaW4oKSB7CisgICAgcmV0dXJuIGlzS2V5d29yZCgpID8gQ29ycmVjdGlvbkRlY2xzLmVuZCgpIDogQ29ycmVjdGlvbkRlY2xzLmJlZ2luKCk7CisgIH0KKworICBkZWNsX2l0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIENvcnJlY3Rpb25EZWNscy5lbmQoKTsgfQorCisgIHVzaW5nIGNvbnN0X2RlY2xfaXRlcmF0b3IgPSBTbWFsbFZlY3RvckltcGw8TmFtZWREZWNsICo+Ojpjb25zdF9pdGVyYXRvcjsKKworICBjb25zdF9kZWNsX2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBpc0tleXdvcmQoKSA/IENvcnJlY3Rpb25EZWNscy5lbmQoKSA6IENvcnJlY3Rpb25EZWNscy5iZWdpbigpOworICB9CisKKyAgY29uc3RfZGVjbF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBDb3JyZWN0aW9uRGVjbHMuZW5kKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgd2hldGhlciB0aGlzIHR5cG8gY29ycmVjdGlvbiBpcyBjb3JyZWN0aW5nIHRvIGEKKyAgLy8vIGRlY2xhcmF0aW9uIHRoYXQgd2FzIGRlY2xhcmVkIGluIGEgbW9kdWxlIHRoYXQgaGFzIG5vdCBiZWVuIGltcG9ydGVkLgorICBib29sIHJlcXVpcmVzSW1wb3J0KCkgY29uc3QgeyByZXR1cm4gUmVxdWlyZXNJbXBvcnQ7IH0KKyAgdm9pZCBzZXRSZXF1aXJlc0ltcG9ydChib29sIFJlcSkgeyBSZXF1aXJlc0ltcG9ydCA9IFJlcTsgfQorCisgIC8vLyBFeHRyYSBkaWFnbm9zdGljcyBhcmUgcHJpbnRlZCBhZnRlciB0aGUgZmlyc3QgZGlhZ25vc3RpYyBmb3IgdGhlIHR5cG8uCisgIC8vLyBUaGlzIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBleHRlcm5hbCBub3RlcyB0byB0aGUgZGlhZy4KKyAgdm9pZCBhZGRFeHRyYURpYWdub3N0aWMoUGFydGlhbERpYWdub3N0aWMgUEQpIHsKKyAgICBFeHRyYURpYWdub3N0aWNzLnB1c2hfYmFjayhzdGQ6Om1vdmUoUEQpKTsKKyAgfQorICBBcnJheVJlZjxQYXJ0aWFsRGlhZ25vc3RpYz4gZ2V0RXh0cmFEaWFnbm9zdGljcygpIGNvbnN0IHsKKyAgICByZXR1cm4gRXh0cmFEaWFnbm9zdGljczsKKyAgfQorCitwcml2YXRlOgorICBib29sIGhhc0NvcnJlY3Rpb25EZWNsKCkgY29uc3QgeworICAgIHJldHVybiAoIWlzS2V5d29yZCgpICYmICFDb3JyZWN0aW9uRGVjbHMuZW1wdHkoKSk7CisgIH0KKworICAvLyBSZXN1bHRzLgorICBEZWNsYXJhdGlvbk5hbWUgQ29ycmVjdGlvbk5hbWU7CisgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKkNvcnJlY3Rpb25OYW1lU3BlYyA9IG51bGxwdHI7CisgIFNtYWxsVmVjdG9yPE5hbWVkRGVjbCAqLCAxPiBDb3JyZWN0aW9uRGVjbHM7CisgIHVuc2lnbmVkIENoYXJEaXN0YW5jZSA9IDA7CisgIHVuc2lnbmVkIFF1YWxpZmllckRpc3RhbmNlID0gMDsKKyAgdW5zaWduZWQgQ2FsbGJhY2tEaXN0YW5jZSA9IDA7CisgIFNvdXJjZVJhbmdlIENvcnJlY3Rpb25SYW5nZTsKKyAgYm9vbCBGb3JjZVNwZWNpZmllclJlcGxhY2VtZW50ID0gZmFsc2U7CisgIGJvb2wgUmVxdWlyZXNJbXBvcnQgPSBmYWxzZTsKKworICBzdGQ6OnZlY3RvcjxQYXJ0aWFsRGlhZ25vc3RpYz4gRXh0cmFEaWFnbm9zdGljczsKK307CisKKy8vLyBAYnJpZWYgQmFzZSBjbGFzcyBmb3IgY2FsbGJhY2sgb2JqZWN0cyB1c2VkIGJ5IFNlbWE6OkNvcnJlY3RUeXBvIHRvIGNoZWNrCisvLy8gdGhlIHZhbGlkaXR5IG9mIGEgcG90ZW50aWFsIHR5cG8gY29ycmVjdGlvbi4KK2NsYXNzIENvcnJlY3Rpb25DYW5kaWRhdGVDYWxsYmFjayB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBJbnZhbGlkRGlzdGFuY2UgPSBUeXBvQ29ycmVjdGlvbjo6SW52YWxpZERpc3RhbmNlOworCisgIGV4cGxpY2l0IENvcnJlY3Rpb25DYW5kaWRhdGVDYWxsYmFjayhJZGVudGlmaWVySW5mbyAqVHlwbyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyICpUeXBvTk5TID0gbnVsbHB0cikKKyAgICAgIDogVHlwbyhUeXBvKSwgVHlwb05OUyhUeXBvTk5TKSB7fQorCisgIHZpcnR1YWwgfkNvcnJlY3Rpb25DYW5kaWRhdGVDYWxsYmFjaygpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIFNpbXBsZSBwcmVkaWNhdGUgdXNlZCBieSB0aGUgZGVmYXVsdCBSYW5rQ2FuZGlkYXRlIHRvCisgIC8vLyBkZXRlcm1pbmUgd2hldGhlciB0byByZXR1cm4gYW4gZWRpdCBkaXN0YW5jZSBvZiAwIG9yIEludmFsaWREaXN0YW5jZS4KKyAgLy8vIFRoaXMgY2FuIGJlIG92ZXJyaWRlZCBieSB2YWxpZGF0b3JzIHRoYXQgb25seSBuZWVkIHRvIGRldGVybWluZSBpZiBhCisgIC8vLyBjYW5kaWRhdGUgaXMgdmlhYmxlLCB3aXRob3V0IHJhbmtpbmcgcG90ZW50aWFsbHkgdmlhYmxlIGNhbmRpZGF0ZXMuCisgIC8vLyBPbmx5IFZhbGlkYXRlQ2FuZGlkYXRlIG9yIFJhbmtDYW5kaWRhdGUgbmVlZCB0byBiZSBvdmVycmlkZW4gYnkgYQorICAvLy8gY2FsbGJhY2sgd2lzaGluZyB0byBjaGVjayB0aGUgdmlhYmlsaXR5IG9mIGNvcnJlY3Rpb24gY2FuZGlkYXRlcy4KKyAgLy8vIFRoZSBkZWZhdWx0IHByZWRpY2F0ZSBhbHdheXMgcmV0dXJucyB0cnVlIGlmIHRoZSBjYW5kaWRhdGUgaXMgbm90IGEgdHlwZQorICAvLy8gbmFtZSBvciBrZXl3b3JkLCB0cnVlIGZvciB0eXBlcyBpZiBXYW50VHlwZVNwZWNpZmllcnMgaXMgdHJ1ZSwgYW5kIHRydWUKKyAgLy8vIGZvciBrZXl3b3JkcyBpZiBXYW50VHlwZVNwZWNpZmllcnMsIFdhbnRFeHByZXNzaW9uS2V5d29yZHMsCisgIC8vLyBXYW50Q1hYTmFtZWRDYXN0cywgV2FudFJlbWFpbmluZ0tleXdvcmRzLCBvciBXYW50T2JqQ1N1cGVyIGlzIHRydWUuCisgIHZpcnR1YWwgYm9vbCBWYWxpZGF0ZUNhbmRpZGF0ZShjb25zdCBUeXBvQ29ycmVjdGlvbiAmY2FuZGlkYXRlKTsKKworICAvLy8gXGJyaWVmIE1ldGhvZCB1c2VkIGJ5IFNlbWE6OkNvcnJlY3RUeXBvIHRvIGFzc2lnbiBhbiAiZWRpdCBkaXN0YW5jZSIgcmFuaworICAvLy8gdG8gYSBjYW5kaWRhdGUgKHdoZXJlIGEgbG93ZXIgdmFsdWUgcmVwcmVzZW50cyBhIGJldHRlciBjYW5kaWRhdGUpLCBvcgorICAvLy8gcmV0dXJuaW5nIEludmFsaWREaXN0YW5jZSBpZiB0aGUgY2FuZGlkYXRlIGlzIG5vdCBhdCBhbGwgdmlhYmxlLiBGb3IKKyAgLy8vIHZhbGlkYXRpb24gY2FsbGJhY2tzIHRoYXQgb25seSBuZWVkIHRvIGRldGVybWluZSBpZiBhIGNhbmRpZGF0ZSBpcyB2aWFibGUsCisgIC8vLyB0aGUgZGVmYXVsdCBSYW5rQ2FuZGlkYXRlIHJldHVybnMgZWl0aGVyIDAgb3IgSW52YWxpZERpc3RhbmNlIGRlcGVuZGluZworICAvLy8gd2hldGhlciBWYWxpZGF0ZUNhbmRpZGF0ZSByZXR1cm5zIHRydWUgb3IgZmFsc2UuCisgIHZpcnR1YWwgdW5zaWduZWQgUmFua0NhbmRpZGF0ZShjb25zdCBUeXBvQ29ycmVjdGlvbiAmY2FuZGlkYXRlKSB7CisgICAgcmV0dXJuICghTWF0Y2hlc1R5cG8oY2FuZGlkYXRlKSAmJiBWYWxpZGF0ZUNhbmRpZGF0ZShjYW5kaWRhdGUpKQorICAgICAgICAgICAgICAgPyAwCisgICAgICAgICAgICAgICA6IEludmFsaWREaXN0YW5jZTsKKyAgfQorCisgIHZvaWQgc2V0VHlwb05hbWUoSWRlbnRpZmllckluZm8gKklJKSB7IFR5cG8gPSBJSTsgfQorICB2b2lkIHNldFR5cG9OTlMoTmVzdGVkTmFtZVNwZWNpZmllciAqTk5TKSB7IFR5cG9OTlMgPSBOTlM7IH0KKworICAvLyBGbGFncyBmb3IgY29udGV4dC1kZXBlbmRlbnQga2V5d29yZHMuIFdhbnRGdW5jdGlvbkxpa2VDYXN0cyBpcyBvbmx5CisgIC8vIHVzZWQvbWVhbmluZ2Z1bCB3aGVuIFdhbnRDWFhOYW1lZENhc3RzIGlzIGZhbHNlLgorICAvLyBUT0RPOiBFeHBhbmQgdGhlc2UgdG8gYXBwbHkgdG8gbm9uLWtleXdvcmRzIG9yIHBvc3NpYmx5IHJlbW92ZSB0aGVtLgorICBib29sIFdhbnRUeXBlU3BlY2lmaWVycyA9IHRydWU7CisgIGJvb2wgV2FudEV4cHJlc3Npb25LZXl3b3JkcyA9IHRydWU7CisgIGJvb2wgV2FudENYWE5hbWVkQ2FzdHMgPSB0cnVlOworICBib29sIFdhbnRGdW5jdGlvbkxpa2VDYXN0cyA9IHRydWU7CisgIGJvb2wgV2FudFJlbWFpbmluZ0tleXdvcmRzID0gdHJ1ZTsKKyAgYm9vbCBXYW50T2JqQ1N1cGVyID0gZmFsc2U7CisgIC8vIFRlbXBvcmFyeSBoYWNrIGZvciB0aGUgb25lIGNhc2Ugd2hlcmUgYSBDb3JyZWN0VHlwb0NvbnRleHQgZW51bSBpcyB1c2VkCisgIC8vIHdoZW4gbG9va2luZyB1cCByZXN1bHRzLgorICBib29sIElzT2JqQ0l2YXJMb29rdXAgPSBmYWxzZTsKKyAgYm9vbCBJc0FkZHJlc3NPZk9wZXJhbmQgPSBmYWxzZTsKKworcHJvdGVjdGVkOgorICBib29sIE1hdGNoZXNUeXBvKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZjYW5kaWRhdGUpIHsKKyAgICByZXR1cm4gVHlwbyAmJiBjYW5kaWRhdGUuaXNSZXNvbHZlZCgpICYmICFjYW5kaWRhdGUucmVxdWlyZXNJbXBvcnQoKSAmJgorICAgICAgICAgICBjYW5kaWRhdGUuZ2V0Q29ycmVjdGlvbkFzSWRlbnRpZmllckluZm8oKSA9PSBUeXBvICYmCisgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHByb2JhYmx5IGRvZXMgbm90IHJldHVybiB0cnVlIHdoZW4gYm90aAorICAgICAgICAgICAvLyBOZXN0ZWROYW1lU3BlY2lmaWVycyBoYXZlIHRoZSBzYW1lIHRleHR1YWwgcmVwcmVzZW50YXRpb24uCisgICAgICAgICAgIGNhbmRpZGF0ZS5nZXRDb3JyZWN0aW9uU3BlY2lmaWVyKCkgPT0gVHlwb05OUzsKKyAgfQorCisgIElkZW50aWZpZXJJbmZvICpUeXBvOworICBOZXN0ZWROYW1lU3BlY2lmaWVyICpUeXBvTk5TOworfTsKKworLy8vIEBicmllZiBTaW1wbGUgdGVtcGxhdGUgY2xhc3MgZm9yIHJlc3RyaWN0aW5nIHR5cG8gY29ycmVjdGlvbiBjYW5kaWRhdGVzCisvLy8gdG8gb25lcyBoYXZpbmcgYSBzaW5nbGUgRGVjbCogb2YgdGhlIGdpdmVuIHR5cGUuCit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK2NsYXNzIERlY2xGaWx0ZXJDQ0MgOiBwdWJsaWMgQ29ycmVjdGlvbkNhbmRpZGF0ZUNhbGxiYWNrIHsKK3B1YmxpYzoKKyAgYm9vbCBWYWxpZGF0ZUNhbmRpZGF0ZShjb25zdCBUeXBvQ29ycmVjdGlvbiAmY2FuZGlkYXRlKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIGNhbmRpZGF0ZS5nZXRDb3JyZWN0aW9uRGVjbEFzPEM+KCk7CisgIH0KK307CisKKy8vIEBicmllZiBDYWxsYmFjayBjbGFzcyB0byBsaW1pdCB0aGUgYWxsb3dlZCBrZXl3b3JkcyBhbmQgdG8gb25seSBhY2NlcHQgdHlwbworLy8gY29ycmVjdGlvbnMgdGhhdCBhcmUga2V5d29yZHMgb3Igd2hvc2UgZGVjbHMgcmVmZXIgdG8gZnVuY3Rpb25zIChvciB0ZW1wbGF0ZQorLy8gZnVuY3Rpb25zKSB0aGF0IGFjY2VwdCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cy4KK2NsYXNzIEZ1bmN0aW9uQ2FsbEZpbHRlckNDQyA6IHB1YmxpYyBDb3JyZWN0aW9uQ2FuZGlkYXRlQ2FsbGJhY2sgeworcHVibGljOgorICBGdW5jdGlvbkNhbGxGaWx0ZXJDQ0MoU2VtYSAmU2VtYVJlZiwgdW5zaWduZWQgTnVtQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJFeHByICpNRSA9IG51bGxwdHIpOworCisgIGJvb2wgVmFsaWRhdGVDYW5kaWRhdGUoY29uc3QgVHlwb0NvcnJlY3Rpb24gJmNhbmRpZGF0ZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIHVuc2lnbmVkIE51bUFyZ3M7CisgIGJvb2wgSGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3M7CisgIERlY2xDb250ZXh0ICpDdXJDb250ZXh0OworICBNZW1iZXJFeHByICpNZW1iZXJGbjsKK307CisKKy8vIEBicmllZiBDYWxsYmFjayBjbGFzcyB0aGF0IGVmZmVjdGl2ZWx5IGRpc2FibGVkIHR5cG8gY29ycmVjdGlvbgorY2xhc3MgTm9UeXBvQ29ycmVjdGlvbkNDQyA6IHB1YmxpYyBDb3JyZWN0aW9uQ2FuZGlkYXRlQ2FsbGJhY2sgeworcHVibGljOgorICBOb1R5cG9Db3JyZWN0aW9uQ0NDKCkgeworICAgIFdhbnRUeXBlU3BlY2lmaWVycyA9IGZhbHNlOworICAgIFdhbnRFeHByZXNzaW9uS2V5d29yZHMgPSBmYWxzZTsKKyAgICBXYW50Q1hYTmFtZWRDYXN0cyA9IGZhbHNlOworICAgIFdhbnRGdW5jdGlvbkxpa2VDYXN0cyA9IGZhbHNlOworICAgIFdhbnRSZW1haW5pbmdLZXl3b3JkcyA9IGZhbHNlOworICB9CisKKyAgYm9vbCBWYWxpZGF0ZUNhbmRpZGF0ZShjb25zdCBUeXBvQ29ycmVjdGlvbiAmY2FuZGlkYXRlKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19TRU1BX1RZUE9DT1JSRUNUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvV2Vhay5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VtYS9XZWFrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3MjEyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlbWEvV2Vhay5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vPT09LS0gVW5yZXNvbHZlZFNldC5oIC0gVW5yZXNvbHZlZCBzZXRzIG9mIGRlY2xhcmF0aW9ucyAgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBXZWFrSW5mbyBjbGFzcywgd2hpY2ggaXMgdXNlZCB0byBzdG9yZQorLy8gIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXJnZXQgb2YgYSAjcHJhZ21hIHdlYWsgZGlyZWN0aXZlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TRU1BX1dFQUtfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NFTUFfV0VBS19ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBJZGVudGlmaWVySW5mbzsKKworLy8vIFxicmllZiBDYXB0dXJlcyBpbmZvcm1hdGlvbiBhYm91dCBhIFwjcHJhZ21hIHdlYWsgZGlyZWN0aXZlLgorY2xhc3MgV2Vha0luZm8geworICBJZGVudGlmaWVySW5mbyAqYWxpYXM7ICAvLyBhbGlhcyAob3B0aW9uYWwpCisgIFNvdXJjZUxvY2F0aW9uIGxvYzsgICAgIC8vIGZvciBkaWFnbm9zdGljcworICBib29sIHVzZWQ7ICAgICAgICAgICAgICAvLyBpZGVudGlmaWVyIGxhdGVyIGRlY2xhcmVkPworcHVibGljOgorICBXZWFrSW5mbygpCisgICAgOiBhbGlhcyhudWxscHRyKSwgbG9jKFNvdXJjZUxvY2F0aW9uKCkpLCB1c2VkKGZhbHNlKSB7fQorICBXZWFrSW5mbyhJZGVudGlmaWVySW5mbyAqQWxpYXMsIFNvdXJjZUxvY2F0aW9uIExvYykKKyAgICA6IGFsaWFzKEFsaWFzKSwgbG9jKExvYyksIHVzZWQoZmFsc2UpIHt9CisgIGlubGluZSBJZGVudGlmaWVySW5mbyAqIGdldEFsaWFzKCkgY29uc3QgeyByZXR1cm4gYWxpYXM7IH0KKyAgaW5saW5lIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gbG9jOyB9CisgIHZvaWQgc2V0VXNlZChib29sIFVzZWQ9dHJ1ZSkgeyB1c2VkID0gVXNlZDsgfQorICBpbmxpbmUgYm9vbCBnZXRVc2VkKCkgeyByZXR1cm4gdXNlZDsgfQorICBib29sIG9wZXJhdG9yPT0oV2Vha0luZm8gUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIGFsaWFzID09IFJIUy5nZXRBbGlhcygpICYmIGxvYyA9PSBSSFMuZ2V0TG9jYXRpb24oKTsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oV2Vha0luZm8gUkhTKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IFJIUyk7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19TRU1BX1dFQUtfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9BU1RCaXRDb2Rlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9BU1RCaXRDb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNGUwMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL0FTVEJpdENvZGVzLmgKQEAgLTAsMCArMSwyMDUwIEBACisvLz09PS0gQVNUQml0Q29kZXMuaCAtIEVudW0gdmFsdWVzIGZvciB0aGUgUENIIGJpdGNvZGUgZm9ybWF0IC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgQml0Y29kZSBlbnVtIHZhbHVlcyBmb3IgQ2xhbmcgc2VyaWFsaXplZCBBU1QgZmlsZXMuCisvLworLy8gVGhlIGVudW0gdmFsdWVzIGRlZmluZWQgaW4gdGhpcyBmaWxlIHNob3VsZCBiZSBjb25zaWRlcmVkIHBlcm1hbmVudC4gIElmCisvLyBuZXcgZmVhdHVyZXMgYXJlIGFkZGVkLCB0aGV5IHNob3VsZCBoYXZlIHZhbHVlcyBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZQorLy8gcmVzcGVjdGl2ZSBsaXN0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU0VSSUFMSVpBVElPTl9BU1RCSVRDT0RFU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfU0VSSUFMSVpBVElPTl9BU1RCSVRDT0RFU19ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbGFyYXRpb25OYW1lLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9PcGVyYXRvcktpbmRzLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0JpdGNvZGUvQml0Q29kZXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2Ugc2VyaWFsaXphdGlvbiB7CisKKyAgICAvLy8gXGJyaWVmIEFTVCBmaWxlIG1ham9yIHZlcnNpb24gbnVtYmVyIHN1cHBvcnRlZCBieSB0aGlzIHZlcnNpb24gb2YKKyAgICAvLy8gQ2xhbmcuCisgICAgLy8vCisgICAgLy8vIFdoZW5ldmVyIHRoZSBBU1QgZmlsZSBmb3JtYXQgY2hhbmdlcyBpbiBhIHdheSB0aGF0IG1ha2VzIGl0CisgICAgLy8vIGluY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIHZlcnNpb25zIChzdWNoIHRoYXQgYSByZWFkZXIKKyAgICAvLy8gZGVzaWduZWQgZm9yIHRoZSBwcmV2aW91cyB2ZXJzaW9uIGNvdWxkIG5vdCBzdXBwb3J0IHJlYWRpbmcKKyAgICAvLy8gdGhlIG5ldyB2ZXJzaW9uKSwgdGhpcyBudW1iZXIgc2hvdWxkIGJlIGluY3JlYXNlZC4KKyAgICAvLy8KKyAgICAvLy8gVmVyc2lvbiA0IG9mIEFTVCBmaWxlcyBhbHNvIHJlcXVpcmVzIHRoYXQgdGhlIHZlcnNpb24gY29udHJvbCBicmFuY2ggYW5kCisgICAgLy8vIHJldmlzaW9uIG1hdGNoIGV4YWN0bHksIHNpbmNlIHRoZXJlIGlzIG5vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb2YKKyAgICAvLy8gQVNUIGZpbGVzIGF0IHRoaXMgdGltZS4KKyAgICBjb25zdCB1bnNpZ25lZCBWRVJTSU9OX01BSk9SID0gNjsKKworICAgIC8vLyBcYnJpZWYgQVNUIGZpbGUgbWlub3IgdmVyc2lvbiBudW1iZXIgc3VwcG9ydGVkIGJ5IHRoaXMgdmVyc2lvbiBvZgorICAgIC8vLyBDbGFuZy4KKyAgICAvLy8KKyAgICAvLy8gV2hlbmV2ZXIgdGhlIEFTVCBmb3JtYXQgY2hhbmdlcyBpbiBhIHdheSB0aGF0IGlzIHN0aWxsCisgICAgLy8vIGNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyAoc3VjaCB0aGF0IGEgcmVhZGVyIGRlc2lnbmVkCisgICAgLy8vIGZvciB0aGUgcHJldmlvdXMgdmVyc2lvbiBjb3VsZCBzdGlsbCBzdXBwb3J0IHJlYWRpbmcgdGhlIG5ldworICAgIC8vLyB2ZXJzaW9uIGJ5IGlnbm9yaW5nIG5ldyBraW5kcyBvZiBzdWJibG9ja3MpLCB0aGlzIG51bWJlcgorICAgIC8vLyBzaG91bGQgYmUgaW5jcmVhc2VkLgorICAgIGNvbnN0IHVuc2lnbmVkIFZFUlNJT05fTUlOT1IgPSAwOworCisgICAgLy8vIFxicmllZiBBbiBJRCBudW1iZXIgdGhhdCByZWZlcnMgdG8gYW4gaWRlbnRpZmllciBpbiBhbiBBU1QgZmlsZS4KKyAgICAvLy8gCisgICAgLy8vIFRoZSBJRCBudW1iZXJzIG9mIGlkZW50aWZpZXJzIGFyZSBjb25zZWN1dGl2ZSAoaW4gb3JkZXIgb2YgZGlzY292ZXJ5KQorICAgIC8vLyBhbmQgc3RhcnQgYXQgMS4gMCBpcyByZXNlcnZlZCBmb3IgTlVMTC4KKyAgICB1c2luZyBJZGVudGlmaWVySUQgPSB1aW50MzJfdDsKKyAgICAKKyAgICAvLy8gXGJyaWVmIEFuIElEIG51bWJlciB0aGF0IHJlZmVycyB0byBhIGRlY2xhcmF0aW9uIGluIGFuIEFTVCBmaWxlLgorICAgIC8vLworICAgIC8vLyBUaGUgSUQgbnVtYmVycyBvZiBkZWNsYXJhdGlvbnMgYXJlIGNvbnNlY3V0aXZlIChpbiBvcmRlciBvZgorICAgIC8vLyBkaXNjb3ZlcnkpLCB3aXRoIHZhbHVlcyBiZWxvdyBOVU1fUFJFREVGX0RFQ0xfSURTIGJlaW5nIHJlc2VydmVkLiAKKyAgICAvLy8gQXQgdGhlIHN0YXJ0IG9mIGEgY2hhaW4gb2YgcHJlY29tcGlsZWQgaGVhZGVycywgZGVjbGFyYXRpb24gSUQgMSBpcyAKKyAgICAvLy8gdXNlZCBmb3IgdGhlIHRyYW5zbGF0aW9uIHVuaXQgZGVjbGFyYXRpb24uCisgICAgdXNpbmcgRGVjbElEID0gdWludDMyX3Q7CisKKyAgICAvLyBGSVhNRTogVHVybiB0aGVzZSBpbnRvIGNsYXNzZXMgc28gd2UgY2FuIGhhdmUgc29tZSB0eXBlIHNhZmV0eSB3aGVuCisgICAgLy8gd2UgZ28gZnJvbSBsb2NhbCBJRCB0byBnbG9iYWwgYW5kIHZpY2UtdmVyc2EuCisgICAgdXNpbmcgTG9jYWxEZWNsSUQgPSBEZWNsSUQ7CisgICAgdXNpbmcgR2xvYmFsRGVjbElEID0gRGVjbElEOworCisgICAgLy8vIFxicmllZiBBbiBJRCBudW1iZXIgdGhhdCByZWZlcnMgdG8gYSB0eXBlIGluIGFuIEFTVCBmaWxlLgorICAgIC8vLworICAgIC8vLyBUaGUgSUQgb2YgYSB0eXBlIGlzIHBhcnRpdGlvbmVkIGludG8gdHdvIHBhcnRzOiB0aGUgbG93ZXIKKyAgICAvLy8gdGhyZWUgYml0cyBhcmUgdXNlZCB0byBzdG9yZSB0aGUgY29uc3Qvdm9sYXRpbGUvcmVzdHJpY3QKKyAgICAvLy8gcXVhbGlmaWVycyAoYXMgd2l0aCBRdWFsVHlwZSkgYW5kIHRoZSB1cHBlciBiaXRzIHByb3ZpZGUgYQorICAgIC8vLyB0eXBlIGluZGV4LiBUaGUgdHlwZSBpbmRleCB2YWx1ZXMgYXJlIHBhcnRpdGlvbmVkIGludG8gdHdvCisgICAgLy8vIHNldHMuIFRoZSB2YWx1ZXMgYmVsb3cgTlVNX1BSRURFRl9UWVBFX0lEcyBhcmUgcHJlZGVmaW5lZCB0eXBlCisgICAgLy8vIElEcyAoYmFzZWQgb24gdGhlIFBSRURFRl9UWVBFXypfSUQgY29uc3RhbnRzKSwgd2l0aCAwIGFzIGEKKyAgICAvLy8gcGxhY2Vob2xkZXIgZm9yICJubyB0eXBlIi4gVmFsdWVzIGZyb20gTlVNX1BSRURFRl9UWVBFX0lEcyBhcmUKKyAgICAvLy8gb3RoZXIgdHlwZXMgdGhhdCBoYXZlIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb25zLgorICAgIHVzaW5nIFR5cGVJRCA9IHVpbnQzMl90OworCisgICAgLy8vIFxicmllZiBBIHR5cGUgaW5kZXg7IHRoZSB0eXBlIElEIHdpdGggdGhlIHF1YWxpZmllciBiaXRzIHJlbW92ZWQuCisgICAgY2xhc3MgVHlwZUlkeCB7CisgICAgICB1aW50MzJfdCBJZHggPSAwOworCisgICAgcHVibGljOgorICAgICAgVHlwZUlkeCgpID0gZGVmYXVsdDsKKyAgICAgIGV4cGxpY2l0IFR5cGVJZHgodWludDMyX3QgaW5kZXgpIDogSWR4KGluZGV4KSB7fQorCisgICAgICB1aW50MzJfdCBnZXRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIElkeDsgfQorCisgICAgICBUeXBlSUQgYXNUeXBlSUQodW5zaWduZWQgRmFzdFF1YWxzKSBjb25zdCB7CisgICAgICAgIGlmIChJZHggPT0gdWludDMyX3QoLTEpKQorICAgICAgICAgIHJldHVybiBUeXBlSUQoLTEpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIChJZHggPDwgUXVhbGlmaWVyczo6RmFzdFdpZHRoKSB8IEZhc3RRdWFsczsKKyAgICAgIH0KKworICAgICAgc3RhdGljIFR5cGVJZHggZnJvbVR5cGVJRChUeXBlSUQgSUQpIHsKKyAgICAgICAgaWYgKElEID09IFR5cGVJRCgtMSkpCisgICAgICAgICAgcmV0dXJuIFR5cGVJZHgoLTEpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIFR5cGVJZHgoSUQgPj4gUXVhbGlmaWVyczo6RmFzdFdpZHRoKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgLy8vIEEgc3RydWN0dXJlIGZvciBwdXR0aW5nICJmYXN0Ii11bnF1YWxpZmllZCBRdWFsVHlwZXMgaW50byBhCisgICAgLy8vIERlbnNlTWFwLiAgVGhpcyB1c2VzIHRoZSBzdGFuZGFyZCBwb2ludGVyIGhhc2ggZnVuY3Rpb24uCisgICAgc3RydWN0IFVuc2FmZVF1YWxUeXBlRGVuc2VNYXBJbmZvIHsKKyAgICAgIHN0YXRpYyBib29sIGlzRXF1YWwoUXVhbFR5cGUgQSwgUXVhbFR5cGUgQikgeyByZXR1cm4gQSA9PSBCOyB9CisKKyAgICAgIHN0YXRpYyBRdWFsVHlwZSBnZXRFbXB0eUtleSgpIHsKKyAgICAgICAgcmV0dXJuIFF1YWxUeXBlOjpnZXRGcm9tT3BhcXVlUHRyKCh2b2lkKikgMSk7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBRdWFsVHlwZSBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgICAgIHJldHVybiBRdWFsVHlwZTo6Z2V0RnJvbU9wYXF1ZVB0cigodm9pZCopIDIpOworICAgICAgfQorCisgICAgICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKFF1YWxUeXBlIFQpIHsKKyAgICAgICAgYXNzZXJ0KCFULmdldExvY2FsRmFzdFF1YWxpZmllcnMoKSAmJiAKKyAgICAgICAgICAgICAgICJoYXNoIGludmFsaWQgZm9yIHR5cGVzIHdpdGggZmFzdCBxdWFscyIpOworICAgICAgICB1aW50cHRyX3QgdiA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihULmdldEFzT3BhcXVlUHRyKCkpOworICAgICAgICByZXR1cm4gKHVuc2lnbmVkKHYpID4+IDQpIF4gKHVuc2lnbmVkKHYpID4+IDkpOworICAgICAgfQorICAgIH07CisKKyAgICAvLy8gXGJyaWVmIEFuIElEIG51bWJlciB0aGF0IHJlZmVycyB0byBhbiBpZGVudGlmaWVyIGluIGFuIEFTVCBmaWxlLgorICAgIHVzaW5nIElkZW50SUQgPSB1aW50MzJfdDsKKworICAgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBwcmVkZWZpbmVkIGlkZW50aWZpZXIgSURzLgorICAgIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fUFJFREVGX0lERU5UX0lEUyA9IDE7CisKKyAgICAvLy8gXGJyaWVmIEFuIElEIG51bWJlciB0aGF0IHJlZmVycyB0byBhIG1hY3JvIGluIGFuIEFTVCBmaWxlLgorICAgIHVzaW5nIE1hY3JvSUQgPSB1aW50MzJfdDsKKworICAgIC8vLyBcYnJpZWYgQSBnbG9iYWwgSUQgbnVtYmVyIHRoYXQgcmVmZXJzIHRvIGEgbWFjcm8gaW4gYW4gQVNUIGZpbGUuCisgICAgdXNpbmcgR2xvYmFsTWFjcm9JRCA9IHVpbnQzMl90OworCisgICAgLy8vIFxicmllZiBBIGxvY2FsIHRvIGEgbW9kdWxlIElEIG51bWJlciB0aGF0IHJlZmVycyB0byBhIG1hY3JvIGluIGFuCisgICAgLy8vIEFTVCBmaWxlLgorICAgIHVzaW5nIExvY2FsTWFjcm9JRCA9IHVpbnQzMl90OworCisgICAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHByZWRlZmluZWQgbWFjcm8gSURzLgorICAgIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fUFJFREVGX01BQ1JPX0lEUyA9IDE7CisKKyAgICAvLy8gXGJyaWVmIEFuIElEIG51bWJlciB0aGF0IHJlZmVycyB0byBhbiBPYmpDIHNlbGVjdG9yIGluIGFuIEFTVCBmaWxlLgorICAgIHVzaW5nIFNlbGVjdG9ySUQgPSB1aW50MzJfdDsKKworICAgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBwcmVkZWZpbmVkIHNlbGVjdG9yIElEcy4KKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgTlVNX1BSRURFRl9TRUxFQ1RPUl9JRFMgPSAxOworICAgIAorICAgIC8vLyBcYnJpZWYgQW4gSUQgbnVtYmVyIHRoYXQgcmVmZXJzIHRvIGEgc2V0IG9mIENYWEJhc2VTcGVjaWZpZXJzIGluIGFuIAorICAgIC8vLyBBU1QgZmlsZS4KKyAgICB1c2luZyBDWFhCYXNlU3BlY2lmaWVyc0lEID0gdWludDMyX3Q7CisKKyAgICAvLy8gXGJyaWVmIEFuIElEIG51bWJlciB0aGF0IHJlZmVycyB0byBhIGxpc3Qgb2YgQ1hYQ3RvckluaXRpYWxpemVycyBpbiBhbgorICAgIC8vLyBBU1QgZmlsZS4KKyAgICB1c2luZyBDWFhDdG9ySW5pdGlhbGl6ZXJzSUQgPSB1aW50MzJfdDsKKworICAgIC8vLyBcYnJpZWYgQW4gSUQgbnVtYmVyIHRoYXQgcmVmZXJzIHRvIGFuIGVudGl0eSBpbiB0aGUgZGV0YWlsZWQKKyAgICAvLy8gcHJlcHJvY2Vzc2luZyByZWNvcmQuCisgICAgdXNpbmcgUHJlcHJvY2Vzc2VkRW50aXR5SUQgPSB1aW50MzJfdDsKKworICAgIC8vLyBcYnJpZWYgQW4gSUQgbnVtYmVyIHRoYXQgcmVmZXJzIHRvIGEgc3VibW9kdWxlIGluIGEgbW9kdWxlIGZpbGUuCisgICAgdXNpbmcgU3VibW9kdWxlSUQgPSB1aW50MzJfdDsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgcHJlZGVmaW5lZCBzdWJtb2R1bGUgSURzLgorICAgIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fUFJFREVGX1NVQk1PRFVMRV9JRFMgPSAxOworCisgICAgLy8vIFxicmllZiBTb3VyY2UgcmFuZ2Uvb2Zmc2V0IG9mIGEgcHJlcHJvY2Vzc2VkIGVudGl0eS4KKyAgICBzdHJ1Y3QgUFBFbnRpdHlPZmZzZXQgeworICAgICAgLy8vIFxicmllZiBSYXcgc291cmNlIGxvY2F0aW9uIG9mIGJlZ2lubmluZyBvZiByYW5nZS4KKyAgICAgIHVuc2lnbmVkIEJlZ2luOworCisgICAgICAvLy8gXGJyaWVmIFJhdyBzb3VyY2UgbG9jYXRpb24gb2YgZW5kIG9mIHJhbmdlLgorICAgICAgdW5zaWduZWQgRW5kOworCisgICAgICAvLy8gXGJyaWVmIE9mZnNldCBpbiB0aGUgQVNUIGZpbGUuCisgICAgICB1aW50MzJfdCBCaXRPZmZzZXQ7CisKKyAgICAgIFBQRW50aXR5T2Zmc2V0KFNvdXJjZVJhbmdlIFIsIHVpbnQzMl90IEJpdE9mZnNldCkKKyAgICAgICAgOiBCZWdpbihSLmdldEJlZ2luKCkuZ2V0UmF3RW5jb2RpbmcoKSksCisgICAgICAgICAgRW5kKFIuZ2V0RW5kKCkuZ2V0UmF3RW5jb2RpbmcoKSksIEJpdE9mZnNldChCaXRPZmZzZXQpIHt9CisKKyAgICAgIFNvdXJjZUxvY2F0aW9uIGdldEJlZ2luKCkgY29uc3QgeworICAgICAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZyhCZWdpbik7CisgICAgICB9CisKKyAgICAgIFNvdXJjZUxvY2F0aW9uIGdldEVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoRW5kKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgLy8vIFxicmllZiBTb3VyY2UgcmFuZ2Ugb2YgYSBza2lwcGVkIHByZXByb2Nlc3NvciByZWdpb24KKyAgICBzdHJ1Y3QgUFBTa2lwcGVkUmFuZ2UgeworICAgICAgLy8vIFxicmllZiBSYXcgc291cmNlIGxvY2F0aW9uIG9mIGJlZ2lubmluZyBvZiByYW5nZS4KKyAgICAgIHVuc2lnbmVkIEJlZ2luOworICAgICAgLy8vIFxicmllZiBSYXcgc291cmNlIGxvY2F0aW9uIG9mIGVuZCBvZiByYW5nZS4KKyAgICAgIHVuc2lnbmVkIEVuZDsKKworICAgICAgUFBTa2lwcGVkUmFuZ2UoU291cmNlUmFuZ2UgUikKKyAgICAgICAgOiBCZWdpbihSLmdldEJlZ2luKCkuZ2V0UmF3RW5jb2RpbmcoKSksCisgICAgICAgICAgRW5kKFIuZ2V0RW5kKCkuZ2V0UmF3RW5jb2RpbmcoKSkgeyB9CisKKyAgICAgIFNvdXJjZUxvY2F0aW9uIGdldEJlZ2luKCkgY29uc3QgeworICAgICAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZyhCZWdpbik7CisgICAgICB9CisgICAgICBTb3VyY2VMb2NhdGlvbiBnZXRFbmQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKEVuZCk7CisgICAgICB9CisgICAgfTsKKworICAgIC8vLyBcYnJpZWYgU291cmNlIHJhbmdlL29mZnNldCBvZiBhIHByZXByb2Nlc3NlZCBlbnRpdHkuCisgICAgc3RydWN0IERlY2xPZmZzZXQgeworICAgICAgLy8vIFxicmllZiBSYXcgc291cmNlIGxvY2F0aW9uLgorICAgICAgdW5zaWduZWQgTG9jID0gMDsKKworICAgICAgLy8vIFxicmllZiBPZmZzZXQgaW4gdGhlIEFTVCBmaWxlLgorICAgICAgdWludDMyX3QgQml0T2Zmc2V0ID0gMDsKKworICAgICAgRGVjbE9mZnNldCgpID0gZGVmYXVsdDsKKyAgICAgIERlY2xPZmZzZXQoU291cmNlTG9jYXRpb24gTG9jLCB1aW50MzJfdCBCaXRPZmZzZXQpCisgICAgICAgIDogTG9jKExvYy5nZXRSYXdFbmNvZGluZygpKSwgQml0T2Zmc2V0KEJpdE9mZnNldCkge30KKworICAgICAgdm9pZCBzZXRMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBMKSB7CisgICAgICAgIExvYyA9IEwuZ2V0UmF3RW5jb2RpbmcoKTsKKyAgICAgIH0KKworICAgICAgU291cmNlTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKExvYyk7CisgICAgICB9CisgICAgfTsKKworICAgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBwcmVkZWZpbmVkIHByZXByb2Nlc3NlZCBlbnRpdHkgSURzLgorICAgIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fUFJFREVGX1BQX0VOVElUWV9JRFMgPSAxOworCisgICAgLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIHZhcmlvdXMga2luZHMgb2YgYmxvY2tzIHRoYXQgb2NjdXIgd2l0aGluCisgICAgLy8vIGFuIEFTVCBmaWxlLgorICAgIGVudW0gQmxvY2tJRHMgeworICAgICAgLy8vIFxicmllZiBUaGUgQVNUIGJsb2NrLCB3aGljaCBhY3RzIGFzIGEgY29udGFpbmVyIGFyb3VuZCB0aGUKKyAgICAgIC8vLyBmdWxsIEFTVCBibG9jay4KKyAgICAgIEFTVF9CTE9DS19JRCA9IGxsdm06OmJpdGM6OkZJUlNUX0FQUExJQ0FUSU9OX0JMT0NLSUQsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIGJsb2NrIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNvdXJjZQorICAgICAgLy8vIG1hbmFnZXIuCisgICAgICBTT1VSQ0VfTUFOQUdFUl9CTE9DS19JRCwKKworICAgICAgLy8vIFxicmllZiBUaGUgYmxvY2sgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICAgIC8vLyBwcmVwcm9jZXNzb3IuCisgICAgICBQUkVQUk9DRVNTT1JfQkxPQ0tfSUQsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIGJsb2NrIGNvbnRhaW5pbmcgdGhlIGRlZmluaXRpb25zIG9mIGFsbCBvZiB0aGUKKyAgICAgIC8vLyB0eXBlcyBhbmQgZGVjbHMgdXNlZCB3aXRoaW4gdGhlIEFTVCBmaWxlLgorICAgICAgREVDTFRZUEVTX0JMT0NLX0lELAorCisgICAgICAvLy8gXGJyaWVmIFRoZSBibG9jayBjb250YWluaW5nIHRoZSBkZXRhaWxlZCBwcmVwcm9jZXNzaW5nIHJlY29yZC4KKyAgICAgIFBSRVBST0NFU1NPUl9ERVRBSUxfQkxPQ0tfSUQsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIGJsb2NrIGNvbnRhaW5pbmcgdGhlIHN1Ym1vZHVsZSBzdHJ1Y3R1cmUuCisgICAgICBTVUJNT0RVTEVfQkxPQ0tfSUQsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIGJsb2NrIGNvbnRhaW5pbmcgY29tbWVudHMuCisgICAgICBDT01NRU5UU19CTE9DS19JRCwKKworICAgICAgLy8vIFxicmllZiBUaGUgY29udHJvbCBibG9jaywgd2hpY2ggY29udGFpbnMgYWxsIG9mIHRoZQorICAgICAgLy8vIGluZm9ybWF0aW9uIHRoYXQgbmVlZHMgdG8gYmUgdmFsaWRhdGVkIHByaW9yIHRvIGNvbW1pdHRpbmcKKyAgICAgIC8vLyB0byBsb2FkaW5nIHRoZSBBU1QgZmlsZS4KKyAgICAgIENPTlRST0xfQkxPQ0tfSUQsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIGJsb2NrIG9mIGlucHV0IGZpbGVzLCB3aGljaCB3ZXJlIHVzZWQgYXMgaW5wdXRzCisgICAgICAvLy8gdG8gY3JlYXRlIHRoaXMgQVNUIGZpbGUuCisgICAgICAvLy8KKyAgICAgIC8vLyBUaGlzIGJsb2NrIGlzIHBhcnQgb2YgdGhlIGNvbnRyb2wgYmxvY2suCisgICAgICBJTlBVVF9GSUxFU19CTE9DS19JRCwKKworICAgICAgLy8vIFxicmllZiBUaGUgYmxvY2sgb2YgY29uZmlndXJhdGlvbiBvcHRpb25zLCB1c2VkIHRvIGNoZWNrIHRoYXQKKyAgICAgIC8vLyBhIG1vZHVsZSBpcyBiZWluZyB1c2VkIGluIGEgY29uZmlndXJhdGlvbiBjb21wYXRpYmxlIHdpdGggdGhlCisgICAgICAvLy8gY29uZmlndXJhdGlvbiBpbiB3aGljaCBpdCB3YXMgYnVpbHQuCisgICAgICAvLy8KKyAgICAgIC8vLyBUaGlzIGJsb2NrIGlzIHBhcnQgb2YgdGhlIGNvbnRyb2wgYmxvY2suCisgICAgICBPUFRJT05TX0JMT0NLX0lELAorCisgICAgICAvLy8gXGJyaWVmIEEgYmxvY2sgY29udGFpbmluZyBhIG1vZHVsZSBmaWxlIGV4dGVuc2lvbi4KKyAgICAgIEVYVEVOU0lPTl9CTE9DS19JRCwKKworICAgICAgLy8vIEEgYmxvY2sgd2l0aCB1bmhhc2hlZCBjb250ZW50LgorICAgICAgLy8vCisgICAgICAvLy8gVGhlc2UgcmVjb3JkcyBzaG91bGQgbm90IGNoYW5nZSB0aGUgXGEgQVNURmlsZVNpZ25hdHVyZS4gIFNlZSBcYQorICAgICAgLy8vIFVuaGFzaGVkQ29udHJvbEJsb2NrUmVjb3JkVHlwZXMgZm9yIHRoZSBsaXN0IG9mIHJlY29yZHMuCisgICAgICBVTkhBU0hFRF9DT05UUk9MX0JMT0NLX0lELAorICAgIH07CisKKyAgICAvLy8gXGJyaWVmIFJlY29yZCB0eXBlcyB0aGF0IG9jY3VyIHdpdGhpbiB0aGUgY29udHJvbCBibG9jay4KKyAgICBlbnVtIENvbnRyb2xSZWNvcmRUeXBlcyB7CisgICAgICAvLy8gXGJyaWVmIEFTVCBmaWxlIG1ldGFkYXRhLCBpbmNsdWRpbmcgdGhlIEFTVCBmaWxlIHZlcnNpb24gbnVtYmVyCisgICAgICAvLy8gYW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlciB1c2VkIHRvIGJ1aWxkIHRoaXMgQVNUIGZpbGUuCisgICAgICBNRVRBREFUQSA9IDEsCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIHRoZSBsaXN0IG9mIG90aGVyIEFTVCBmaWxlcyBpbXBvcnRlZCBieQorICAgICAgLy8vIHRoaXMgQVNUIGZpbGUuCisgICAgICBJTVBPUlRTLAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciB0aGUgb3JpZ2luYWwgZmlsZSB0aGF0IHdhcyB1c2VkIHRvCisgICAgICAvLy8gZ2VuZXJhdGUgdGhlIEFTVCBmaWxlLCBpbmNsdWRpbmcgYm90aCBpdHMgZmlsZSBJRCBhbmQgaXRzCisgICAgICAvLy8gbmFtZS4KKyAgICAgIE9SSUdJTkFMX0ZJTEUsCisgICAgICAKKyAgICAgIC8vLyBcYnJpZWYgVGhlIGRpcmVjdG9yeSB0aGF0IHRoZSBQQ0ggd2FzIG9yaWdpbmFsbHkgY3JlYXRlZCBpbi4KKyAgICAgIE9SSUdJTkFMX1BDSF9ESVIsCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIGZpbGUgSUQgb2YgdGhlIGZpbGUgb3IgYnVmZmVyIHRoYXQgd2FzIHVzZWQgdG8KKyAgICAgIC8vLyBnZW5lcmF0ZSB0aGUgQVNUIGZpbGUuCisgICAgICBPUklHSU5BTF9GSUxFX0lELAorCisgICAgICAvLy8gXGJyaWVmIE9mZnNldHMgaW50byB0aGUgaW5wdXQtZmlsZXMgYmxvY2sgd2hlcmUgaW5wdXQgZmlsZXMKKyAgICAgIC8vLyByZXNpZGUuCisgICAgICBJTlBVVF9GSUxFX09GRlNFVFMsCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIHRoZSBtb2R1bGUgbmFtZS4KKyAgICAgIE1PRFVMRV9OQU1FLAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciB0aGUgbW9kdWxlIG1hcCBmaWxlIHRoYXQgd2FzIHVzZWQgdG8gYnVpbGQgdGhpcworICAgICAgLy8vIEFTVCBmaWxlLgorICAgICAgTU9EVUxFX01BUF9GSUxFLAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciB0aGUgbW9kdWxlIGJ1aWxkIGRpcmVjdG9yeS4KKyAgICAgIE1PRFVMRV9ESVJFQ1RPUlksCisgICAgfTsKKworICAgIC8vLyBcYnJpZWYgUmVjb3JkIHR5cGVzIHRoYXQgb2NjdXIgd2l0aGluIHRoZSBvcHRpb25zIGJsb2NrIGluc2lkZQorICAgIC8vLyB0aGUgY29udHJvbCBibG9jay4KKyAgICBlbnVtIE9wdGlvbnNSZWNvcmRUeXBlcyB7CisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciB0aGUgbGFuZ3VhZ2Ugb3B0aW9ucyB0YWJsZS4KKyAgICAgIC8vLworICAgICAgLy8vIFRoZSByZWNvcmQgd2l0aCB0aGlzIGNvZGUgY29udGFpbnMgdGhlIGNvbnRlbnRzIG9mIHRoZQorICAgICAgLy8vIExhbmdPcHRpb25zIHN0cnVjdHVyZS4gV2Ugc2VyaWFsaXplIHRoZSBlbnRpcmUgY29udGVudHMgb2YKKyAgICAgIC8vLyB0aGUgc3RydWN0dXJlLCBhbmQgbGV0IHRoZSByZWFkZXIgZGVjaWRlIHdoaWNoIG9wdGlvbnMgYXJlCisgICAgICAvLy8gYWN0dWFsbHkgaW1wb3J0YW50IHRvIGNoZWNrLgorICAgICAgTEFOR1VBR0VfT1BUSU9OUyA9IDEsCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIHRoZSB0YXJnZXQgb3B0aW9ucyB0YWJsZS4KKyAgICAgIFRBUkdFVF9PUFRJT05TLAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciB0aGUgZmlsZXN5c3RlbSBvcHRpb25zIHRhYmxlLgorICAgICAgRklMRV9TWVNURU1fT1BUSU9OUywKKworICAgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZSBmb3IgdGhlIGhlYWRlcnMgc2VhcmNoIG9wdGlvbnMgdGFibGUuCisgICAgICBIRUFERVJfU0VBUkNIX09QVElPTlMsCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIHRoZSBwcmVwcm9jZXNzb3Igb3B0aW9ucyB0YWJsZS4KKyAgICAgIFBSRVBST0NFU1NPUl9PUFRJT05TLAorICAgIH07CisKKyAgICAvLy8gUmVjb3JkIGNvZGVzIGZvciB0aGUgdW5oYXNoZWQgY29udHJvbCBibG9jay4KKyAgICBlbnVtIFVuaGFzaGVkQ29udHJvbEJsb2NrUmVjb3JkVHlwZXMgeworICAgICAgLy8vIFJlY29yZCBjb2RlIGZvciB0aGUgc2lnbmF0dXJlIHRoYXQgaWRlbnRpZmllcnMgdGhpcyBBU1QgZmlsZS4KKyAgICAgIFNJR05BVFVSRSA9IDEsCisKKyAgICAgIC8vLyBSZWNvcmQgY29kZSBmb3IgdGhlIGRpYWdub3N0aWMgb3B0aW9ucyB0YWJsZS4KKyAgICAgIERJQUdOT1NUSUNfT1BUSU9OUywKKworICAgICAgLy8vIFJlY29yZCBjb2RlIGZvciBcI3ByYWdtYSBkaWFnbm9zdGljIG1hcHBpbmdzLgorICAgICAgRElBR19QUkFHTUFfTUFQUElOR1MsCisgICAgfTsKKworICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIGV4dGVuc2lvbiBibG9ja3MuCisgICAgZW51bSBFeHRlbnNpb25CbG9ja1JlY29yZFR5cGVzIHsKKyAgICAgIC8vLyBNZXRhZGF0YSBkZXNjcmliaW5nIHRoaXMgcGFydGljdWxhciBleHRlbnNpb24uCisgICAgICBFWFRFTlNJT05fTUVUQURBVEEgPSAxLAorCisgICAgICAvLy8gVGhlIGZpcnN0IHJlY29yZCBJRCBhbGxvY2F0ZWQgdG8gdGhlIGV4dGVuc2lvbnMgdGhlbXNlbHZlcy4KKyAgICAgIEZJUlNUX0VYVEVOU0lPTl9SRUNPUkRfSUQgPSA0CisgICAgfTsKKworICAgIC8vLyBcYnJpZWYgUmVjb3JkIHR5cGVzIHRoYXQgb2NjdXIgd2l0aGluIHRoZSBpbnB1dC1maWxlcyBibG9jaworICAgIC8vLyBpbnNpZGUgdGhlIGNvbnRyb2wgYmxvY2suCisgICAgZW51bSBJbnB1dEZpbGVSZWNvcmRUeXBlcyB7CisgICAgICAvLy8gXGJyaWVmIEFuIGlucHV0IGZpbGUuCisgICAgICBJTlBVVF9GSUxFID0gMQorICAgIH07CisKKyAgICAvLy8gXGJyaWVmIFJlY29yZCB0eXBlcyB0aGF0IG9jY3VyIHdpdGhpbiB0aGUgQVNUIGJsb2NrIGl0c2VsZi4KKyAgICBlbnVtIEFTVFJlY29yZFR5cGVzIHsKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIHRoZSBvZmZzZXRzIG9mIGVhY2ggdHlwZS4KKyAgICAgIC8vLworICAgICAgLy8vIFRoZSBUWVBFX09GRlNFVCBjb25zdGFudCBkZXNjcmliZXMgdGhlIHJlY29yZCB0aGF0IG9jY3VycworICAgICAgLy8vIHdpdGhpbiB0aGUgQVNUIGJsb2NrLiBUaGUgcmVjb3JkIGl0c2VsZiBpcyBhbiBhcnJheSBvZiBvZmZzZXRzIHRoYXQKKyAgICAgIC8vLyBwb2ludCBpbnRvIHRoZSBkZWNsYXJhdGlvbnMgYW5kIHR5cGVzIGJsb2NrIChpZGVudGlmaWVkIGJ5CisgICAgICAvLy8gREVDTFRZUEVTX0JMT0NLX0lEKS4gVGhlIGluZGV4IGludG8gdGhlIGFycmF5IGlzIGJhc2VkIG9uIHRoZSBJRAorICAgICAgLy8vIG9mIGEgdHlwZS4gRm9yIGEgZ2l2ZW4gdHlwZSBJRCBAYyBULCB0aGUgbG93ZXIgdGhyZWUgYml0cyBvZgorICAgICAgLy8vIEBjIFQgYXJlIGl0cyBxdWFsaWZpZXJzIChjb25zdCwgdm9sYXRpbGUsIHJlc3RyaWN0KSwgYXMgaW4KKyAgICAgIC8vLyB0aGUgUXVhbFR5cGUgY2xhc3MuIFRoZSB1cHBlciBiaXRzLCBhZnRlciBiZWluZyBzaGlmdGVkIGFuZAorICAgICAgLy8vIHN1YnRyYWN0aW5nIE5VTV9QUkVERUZfVFlQRV9JRFMsIGFyZSB1c2VkIHRvIGluZGV4IGludG8gdGhlCisgICAgICAvLy8gVFlQRV9PRkZTRVQgYmxvY2sgdG8gZGV0ZXJtaW5lIHRoZSBvZmZzZXQgb2YgdGhhdCB0eXBlJ3MKKyAgICAgIC8vLyBjb3JyZXNwb25kaW5nIHJlY29yZCB3aXRoaW4gdGhlIERFQ0xUWVBFU19CTE9DS19JRCBibG9jay4KKyAgICAgIFRZUEVfT0ZGU0VUID0gMSwKKworICAgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZSBmb3IgdGhlIG9mZnNldHMgb2YgZWFjaCBkZWNsLgorICAgICAgLy8vCisgICAgICAvLy8gVGhlIERFQ0xfT0ZGU0VUIGNvbnN0YW50IGRlc2NyaWJlcyB0aGUgcmVjb3JkIHRoYXQgb2NjdXJzCisgICAgICAvLy8gd2l0aGluIHRoZSBibG9jayBpZGVudGlmaWVkIGJ5IERFQ0xfT0ZGU0VUU19CTE9DS19JRCB3aXRoaW4KKyAgICAgIC8vLyB0aGUgQVNUIGJsb2NrLiBUaGUgcmVjb3JkIGl0c2VsZiBpcyBhbiBhcnJheSBvZiBvZmZzZXRzIHRoYXQKKyAgICAgIC8vLyBwb2ludCBpbnRvIHRoZSBkZWNsYXJhdGlvbnMgYW5kIHR5cGVzIGJsb2NrIChpZGVudGlmaWVkIGJ5CisgICAgICAvLy8gREVDTFRZUEVTX0JMT0NLX0lEKS4gVGhlIGRlY2xhcmF0aW9uIElEIGlzIGFuIGluZGV4IGludG8gdGhpcworICAgICAgLy8vIHJlY29yZCwgYWZ0ZXIgc3VidHJhY3Rpbmcgb25lIHRvIGFjY291bnQgZm9yIHRoZSB1c2Ugb2YKKyAgICAgIC8vLyBkZWNsYXJhdGlvbiBJRCAwIGZvciBhIE5VTEwgZGVjbGFyYXRpb24gcG9pbnRlci4gSW5kZXggMCBpcworICAgICAgLy8vIHJlc2VydmVkIGZvciB0aGUgdHJhbnNsYXRpb24gdW5pdCBkZWNsYXJhdGlvbi4KKyAgICAgIERFQ0xfT0ZGU0VUID0gMiwKKworICAgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZSBmb3IgdGhlIHRhYmxlIG9mIG9mZnNldHMgb2YgZWFjaAorICAgICAgLy8vIGlkZW50aWZpZXIgSUQuCisgICAgICAvLy8KKyAgICAgIC8vLyBUaGUgb2Zmc2V0IHRhYmxlIGNvbnRhaW5zIG9mZnNldHMgaW50byB0aGUgYmxvYiBzdG9yZWQgaW4KKyAgICAgIC8vLyB0aGUgSURFTlRJRklFUl9UQUJMRSByZWNvcmQuIEVhY2ggb2Zmc2V0IHBvaW50cyB0byB0aGUKKyAgICAgIC8vLyBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhhdCBpZGVudGlmaWVyLgorICAgICAgSURFTlRJRklFUl9PRkZTRVQgPSAzLAorCisgICAgICAvLy8gXGJyaWVmIFRoaXMgaXMgc28gdGhhdCBvbGRlciBjbGFuZyB2ZXJzaW9ucywgYmVmb3JlIHRoZSBpbnRyb2R1Y3Rpb24KKyAgICAgIC8vLyBvZiB0aGUgY29udHJvbCBibG9jaywgY2FuIHJlYWQgYW5kIHJlamVjdCB0aGUgbmV3ZXIgUENIIGZvcm1hdC4KKyAgICAgIC8vLyAqRE9OJ1QgQ0hBTkdFIFRISVMgTlVNQkVSKi4KKyAgICAgIE1FVEFEQVRBX09MRF9GT1JNQVQgPSA0LAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciB0aGUgaWRlbnRpZmllciB0YWJsZS4KKyAgICAgIC8vLworICAgICAgLy8vIFRoZSBpZGVudGlmaWVyIHRhYmxlIGlzIGEgc2ltcGxlIGJsb2IgdGhhdCBjb250YWlucworICAgICAgLy8vIE5VTEwtdGVybWluYXRlZCBzdHJpbmdzIGZvciBhbGwgb2YgdGhlIGlkZW50aWZpZXJzCisgICAgICAvLy8gcmVmZXJlbmNlZCBieSB0aGUgQVNUIGZpbGUuIFRoZSBJREVOVElGSUVSX09GRlNFVCB0YWJsZQorICAgICAgLy8vIGNvbnRhaW5zIHRoZSBtYXBwaW5nIGZyb20gaWRlbnRpZmllciBJRHMgdG8gdGhlIGNoYXJhY3RlcnMKKyAgICAgIC8vLyBpbiB0aGlzIGJsb2IuIE5vdGUgdGhhdCB0aGUgc3RhcnRpbmcgb2Zmc2V0cyBvZiBhbGwgb2YgdGhlCisgICAgICAvLy8gaWRlbnRpZmllcnMgYXJlIG9kZCwgc28gdGhhdCwgd2hlbiB0aGUgaWRlbnRpZmllciBvZmZzZXQKKyAgICAgIC8vLyB0YWJsZSBpcyBsb2FkZWQgaW4sIHdlIGNhbiB1c2UgdGhlIGxvdyBiaXQgdG8gZGlzdGluZ3Vpc2gKKyAgICAgIC8vLyBiZXR3ZWVuIG9mZnNldHMgKGZvciB1bnJlc29sdmVkIGlkZW50aWZpZXIgSURzKSBhbmQKKyAgICAgIC8vLyBJZGVudGlmaWVySW5mbyBwb2ludGVycyAoZm9yIGFscmVhZHktcmVzb2x2ZWQgaWRlbnRpZmllcgorICAgICAgLy8vIElEcykuCisgICAgICBJREVOVElGSUVSX1RBQkxFID0gNSwKKworICAgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZSBmb3IgdGhlIGFycmF5IG9mIGVhZ2VybHkgZGVzZXJpYWxpemVkIGRlY2xzLgorICAgICAgLy8vCisgICAgICAvLy8gVGhlIEFTVCBmaWxlIGNvbnRhaW5zIGEgbGlzdCBvZiBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyB0aGF0IHNob3VsZCBiZQorICAgICAgLy8vIGVhZ2VybHkgZGVzZXJpYWxpemVkIHByZXNlbnQgd2l0aGluIHRoZSBwYXJzZWQgaGVhZGVycywgc3RvcmVkIGFzIGFuCisgICAgICAvLy8gYXJyYXkgb2YgZGVjbGFyYXRpb24gSURzLiBUaGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZQorICAgICAgLy8vIHJlcG9ydGVkIHRvIHRoZSBBU1QgY29uc3VtZXIgYWZ0ZXIgdGhlIEFTVCBmaWxlIGhhcyBiZWVuCisgICAgICAvLy8gcmVhZCwgc2luY2UgdGhlaXIgcHJlc2VuY2UgY2FuIGFmZmVjdCB0aGUgc2VtYW50aWNzIG9mIHRoZQorICAgICAgLy8vIHByb2dyYW0gKGUuZy4sIGZvciBjb2RlIGdlbmVyYXRpb24pLgorICAgICAgRUFHRVJMWV9ERVNFUklBTElaRURfREVDTFMgPSA2LAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciB0aGUgc2V0IG9mIG5vbi1idWlsdGluLCBzcGVjaWFsCisgICAgICAvLy8gdHlwZXMuCisgICAgICAvLy8KKyAgICAgIC8vLyBUaGlzIHJlY29yZCBjb250YWlucyB0aGUgdHlwZSBJRHMgZm9yIHRoZSB2YXJpb3VzIHR5cGUgbm9kZXMKKyAgICAgIC8vLyB0aGF0IGFyZSBjb25zdHJ1Y3RlZCBkdXJpbmcgc2VtYW50aWMgYW5hbHlzaXMgKGUuZy4sCisgICAgICAvLy8gX19idWlsdGluX3ZhX2xpc3QpLiBUaGUgU1BFQ0lBTF9UWVBFXyogY29uc3RhbnRzIHByb3ZpZGUKKyAgICAgIC8vLyBvZmZzZXRzIGludG8gdGhpcyByZWNvcmQuCisgICAgICBTUEVDSUFMX1RZUEVTID0gNywKKworICAgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZSBmb3IgdGhlIGV4dHJhIHN0YXRpc3RpY3Mgd2UgZ2F0aGVyIHdoaWxlCisgICAgICAvLy8gZ2VuZXJhdGluZyBhbiBBU1QgZmlsZS4KKyAgICAgIFNUQVRJU1RJQ1MgPSA4LAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciB0aGUgYXJyYXkgb2YgdGVudGF0aXZlIGRlZmluaXRpb25zLgorICAgICAgVEVOVEFUSVZFX0RFRklOSVRJT05TID0gOSwKKworICAgICAgLy8gSUQgMTAgdXNlZCB0byBiZSBmb3IgYSBsaXN0IG9mIGV4dGVybiAiQyIgZGVjbGFyYXRpb25zLgorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciB0aGUgdGFibGUgb2Ygb2Zmc2V0cyBpbnRvIHRoZQorICAgICAgLy8vIE9iamVjdGl2ZS1DIG1ldGhvZCBwb29sLgorICAgICAgU0VMRUNUT1JfT0ZGU0VUUyA9IDExLAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciB0aGUgT2JqZWN0aXZlLUMgbWV0aG9kIHBvb2wsCisgICAgICBNRVRIT0RfUE9PTCA9IDEyLAorCisgICAgICAvLy8gXGJyaWVmIFRoZSB2YWx1ZSBvZiB0aGUgbmV4dCBfX0NPVU5URVJfXyB0byBkaXNwZW5zZS4KKyAgICAgIC8vLyBbUFBfQ09VTlRFUl9WQUxVRSwgVmFsXQorICAgICAgUFBfQ09VTlRFUl9WQUxVRSA9IDEzLAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciB0aGUgdGFibGUgb2Ygb2Zmc2V0cyBpbnRvIHRoZSBibG9jaworICAgICAgLy8vIG9mIHNvdXJjZS1sb2NhdGlvbiBpbmZvcm1hdGlvbi4KKyAgICAgIFNPVVJDRV9MT0NBVElPTl9PRkZTRVRTID0gMTQsCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIHRoZSBzZXQgb2Ygc291cmNlIGxvY2F0aW9uIGVudHJpZXMKKyAgICAgIC8vLyB0aGF0IG5lZWQgdG8gYmUgcHJlbG9hZGVkIGJ5IHRoZSBBU1QgcmVhZGVyLgorICAgICAgLy8vCisgICAgICAvLy8gVGhpcyBzZXQgY29udGFpbnMgdGhlIHNvdXJjZSBsb2NhdGlvbiBlbnRyeSBmb3IgdGhlCisgICAgICAvLy8gcHJlZGVmaW5lcyBidWZmZXIgYW5kIGZvciBhbnkgZmlsZSBlbnRyaWVzIHRoYXQgbmVlZCB0byBiZQorICAgICAgLy8vIHByZWxvYWRlZC4KKyAgICAgIFNPVVJDRV9MT0NBVElPTl9QUkVMT0FEUyA9IDE1LAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciB0aGUgc2V0IG9mIGV4dF92ZWN0b3IgdHlwZSBuYW1lcy4KKyAgICAgIEVYVF9WRUNUT1JfREVDTFMgPSAxNiwKKworICAgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZSBmb3IgdGhlIGFycmF5IG9mIHVudXNlZCBmaWxlIHNjb3BlZCBkZWNscy4KKyAgICAgIFVOVVNFRF9GSUxFU0NPUEVEX0RFQ0xTID0gMTcsCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIHRoZSB0YWJsZSBvZiBvZmZzZXRzIHRvIGVudHJpZXMgaW4gdGhlCisgICAgICAvLy8gcHJlcHJvY2Vzc2luZyByZWNvcmQuCisgICAgICBQUERfRU5USVRJRVNfT0ZGU0VUUyA9IDE4LAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciB0aGUgYXJyYXkgb2YgVlRhYmxlIHVzZXMuCisgICAgICBWVEFCTEVfVVNFUyA9IDE5LAorCisgICAgICAvLyBJRCAyMCB1c2VkIHRvIGJlIGZvciBhIGxpc3Qgb2YgZHluYW1pYyBjbGFzc2VzLgorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciByZWZlcmVuY2VkIHNlbGVjdG9yIHBvb2wuCisgICAgICBSRUZFUkVOQ0VEX1NFTEVDVE9SX1BPT0wgPSAyMSwKKworICAgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZSBmb3IgYW4gdXBkYXRlIHRvIHRoZSBUVSdzIGxleGljYWxseSBjb250YWluZWQKKyAgICAgIC8vLyBkZWNsYXJhdGlvbnMuCisgICAgICBUVV9VUERBVEVfTEVYSUNBTCA9IDIyLAorCisgICAgICAvLyBJRCAyMyB1c2VkIHRvIGJlIGZvciBhIGxpc3Qgb2YgbG9jYWwgcmVkZWNsYXJhdGlvbnMuCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIGRlY2xhcmF0aW9ucyB0aGF0IFNlbWEga2VlcHMgcmVmZXJlbmNlcyBvZi4KKyAgICAgIFNFTUFfREVDTF9SRUZTID0gMjQsCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIHdlYWsgdW5kZWNsYXJlZCBpZGVudGlmaWVycy4KKyAgICAgIFdFQUtfVU5ERUNMQVJFRF9JREVOVElGSUVSUyA9IDI1LAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciBwZW5kaW5nIGltcGxpY2l0IGluc3RhbnRpYXRpb25zLgorICAgICAgUEVORElOR19JTVBMSUNJVF9JTlNUQU5USUFUSU9OUyA9IDI2LAorCisgICAgICAvLyBJRCAyNyB1c2VkIHRvIGJlIGZvciBhIGxpc3Qgb2YgcmVwbGFjZW1lbnQgZGVjbHMuCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIGFuIHVwZGF0ZSB0byBhIGRlY2wgY29udGV4dCdzIGxvb2t1cCB0YWJsZS4KKyAgICAgIC8vLworICAgICAgLy8vIEluIHByYWN0aWNlLCB0aGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHRoZSBUVSBhbmQgbmFtZXNwYWNlcy4KKyAgICAgIFVQREFURV9WSVNJQkxFID0gMjgsCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGZvciBvZmZzZXRzIG9mIERFQ0xfVVBEQVRFUyByZWNvcmRzIGZvciBkZWNsYXJhdGlvbnMKKyAgICAgIC8vLyB0aGF0IHdlcmUgbW9kaWZpZWQgYWZ0ZXIgYmVpbmcgZGVzZXJpYWxpemVkIGFuZCBuZWVkIHVwZGF0ZXMuCisgICAgICBERUNMX1VQREFURV9PRkZTRVRTID0gMjksCisKKyAgICAgIC8vIElEIDMwIHVzZWQgdG8gYmUgYSBkZWNsIHVwZGF0ZSByZWNvcmQuIFRoZXNlIGFyZSBub3cgaW4gdGhlIERFQ0xUWVBFUworICAgICAgLy8gYmxvY2suCisKKyAgICAgIC8vIElEIDMxIHVzZWQgdG8gYmUgYSBsaXN0IG9mIG9mZnNldHMgdG8gREVDTF9DWFhfQkFTRV9TUEVDSUZJRVJTIHJlY29yZHMuCisKKyAgICAgIC8vIElEIDMyIHVzZWQgdG8gYmUgdGhlIGNvZGUgZm9yIFwjcHJhZ21hIGRpYWdub3N0aWMgbWFwcGluZ3MuCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIHNwZWNpYWwgQ1VEQSBkZWNsYXJhdGlvbnMuCisgICAgICBDVURBX1NQRUNJQUxfREVDTF9SRUZTID0gMzMsCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIGhlYWRlciBzZWFyY2ggaW5mb3JtYXRpb24uCisgICAgICBIRUFERVJfU0VBUkNIX1RBQkxFID0gMzQsCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIGZsb2F0aW5nIHBvaW50IFwjcHJhZ21hIG9wdGlvbnMuCisgICAgICBGUF9QUkFHTUFfT1BUSU9OUyA9IDM1LAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciBlbmFibGVkIE9wZW5DTCBleHRlbnNpb25zLgorICAgICAgT1BFTkNMX0VYVEVOU0lPTlMgPSAzNiwKKworICAgICAgLy8vIFxicmllZiBUaGUgbGlzdCBvZiBkZWxlZ2F0aW5nIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9ucy4KKyAgICAgIERFTEVHQVRJTkdfQ1RPUlMgPSAzNywKKworICAgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZSBmb3IgdGhlIHNldCBvZiBrbm93biBuYW1lc3BhY2VzLCB3aGljaCBhcmUgdXNlZAorICAgICAgLy8vIGZvciB0eXBvIGNvcnJlY3Rpb24uCisgICAgICBLTk9XTl9OQU1FU1BBQ0VTID0gMzgsCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIHRoZSByZW1hcHBpbmcgaW5mb3JtYXRpb24gdXNlZCB0byByZWxhdGUKKyAgICAgIC8vLyBsb2FkZWQgbW9kdWxlcyB0byB0aGUgdmFyaW91cyBvZmZzZXRzIGFuZCBJRHMoZS5nLiwgc291cmNlIGxvY2F0aW9uCisgICAgICAvLy8gb2ZmZXN0cywgZGVjbGFyYXRpb24gYW5kIHR5cGUgSURzKSB0aGF0IGFyZSB1c2VkIGluIHRoYXQgbW9kdWxlIHRvCisgICAgICAvLy8gcmVmZXIgdG8gb3RoZXIgbW9kdWxlcy4KKyAgICAgIE1PRFVMRV9PRkZTRVRfTUFQID0gMzksCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIHRoZSBzb3VyY2UgbWFuYWdlciBsaW5lIHRhYmxlIGluZm9ybWF0aW9uLAorICAgICAgLy8vIHdoaWNoIHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBcI2xpbmUgZGlyZWN0aXZlcy4KKyAgICAgIFNPVVJDRV9NQU5BR0VSX0xJTkVfVEFCTEUgPSA0MCwKKworICAgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZSBmb3IgbWFwIG9mIE9iamVjdGl2ZS1DIGNsYXNzIGRlZmluaXRpb24gSURzIHRvIHRoZQorICAgICAgLy8vIE9iakMgY2F0ZWdvcmllcyBpbiBhIG1vZHVsZSB0aGF0IGFyZSBhdHRhY2hlZCB0byB0aGF0IGNsYXNzLgorICAgICAgT0JKQ19DQVRFR09SSUVTX01BUCA9IDQxLAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciBhIGZpbGUgc29ydGVkIGFycmF5IG9mIERlY2xJRHMgaW4gYSBtb2R1bGUuCisgICAgICBGSUxFX1NPUlRFRF9ERUNMUyA9IDQyLAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciBhbiBhcnJheSBvZiBhbGwgb2YgdGhlIChzdWIpbW9kdWxlcyB0aGF0IHdlcmUKKyAgICAgIC8vLyBpbXBvcnRlZCBieSB0aGUgQVNUIGZpbGUuCisgICAgICBJTVBPUlRFRF9NT0RVTEVTID0gNDMsCisKKyAgICAgIC8vIElEIDQ0IHVzZWQgdG8gYmUgYSB0YWJsZSBvZiBtZXJnZWQgY2Fub25pY2FsIGRlY2xhcmF0aW9ucy4KKyAgICAgIC8vIElEIDQ1IHVzZWQgdG8gYmUgYSBsaXN0IG9mIGRlY2xhcmF0aW9uIElEcyBvZiBsb2NhbCByZWRlY2xhcmF0aW9ucy4KKworICAgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZSBmb3IgdGhlIGFycmF5IG9mIE9iamVjdGl2ZS1DIGNhdGVnb3JpZXMgKGluY2x1ZGluZworICAgICAgLy8vIGV4dGVuc2lvbnMpLgorICAgICAgLy8vCisgICAgICAvLy8gVGhpcyBhcnJheSBjYW4gb25seSBiZSBpbnRlcnByZXRlZCBwcm9wZXJseSB1c2luZyB0aGUgT2JqZWN0aXZlLUMKKyAgICAgIC8vLyBjYXRlZ29yaWVzIG1hcC4KKyAgICAgIE9CSkNfQ0FURUdPUklFUyA9IDQ2LAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciB0aGUgdGFibGUgb2Ygb2Zmc2V0cyBvZiBlYWNoIG1hY3JvIElELgorICAgICAgLy8vCisgICAgICAvLy8gVGhlIG9mZnNldCB0YWJsZSBjb250YWlucyBvZmZzZXRzIGludG8gdGhlIGJsb2Igc3RvcmVkIGluCisgICAgICAvLy8gdGhlIHByZXByb2Nlc3NvciBibG9jay4gRWFjaCBvZmZzZXQgcG9pbnRzIHRvIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAvLy8gbWFjcm8gZGVmaW5pdGlvbi4KKyAgICAgIE1BQ1JPX09GRlNFVCA9IDQ3LAorCisgICAgICAvLy8gXGJyaWVmIEEgbGlzdCBvZiAiaW50ZXJlc3RpbmciIGlkZW50aWZpZXJzLiBPbmx5IHVzZWQgaW4gQysrICh3aGVyZSB3ZQorICAgICAgLy8vIGRvbid0IG5vcm1hbGx5IGRvIGxvb2t1cHMgaW50byB0aGUgc2VyaWFsaXplZCBpZGVudGlmaWVyIHRhYmxlKS4gVGhlc2UKKyAgICAgIC8vLyBhcmUgZWFnZXJseSBkZXNlcmlhbGl6ZWQuCisgICAgICBJTlRFUkVTVElOR19JREVOVElGSUVSUyA9IDQ4LAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciB1bmRlZmluZWQgYnV0IHVzZWQgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgdGhhdAorICAgICAgLy8vIG5lZWQgYSBkZWZpbml0aW9uIGluIHRoaXMgVFUuCisgICAgICBVTkRFRklORURfQlVUX1VTRUQgPSA0OSwKKworICAgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZSBmb3IgbGF0ZSBwYXJzZWQgdGVtcGxhdGUgZnVuY3Rpb25zLgorICAgICAgTEFURV9QQVJTRURfVEVNUExBVEUgPSA1MCwKKworICAgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZSBmb3IgXCNwcmFnbWEgb3B0aW1pemUgb3B0aW9ucy4KKyAgICAgIE9QVElNSVpFX1BSQUdNQV9PUFRJT05TID0gNTEsCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIHBvdGVudGlhbGx5IHVudXNlZCBsb2NhbCB0eXBlZGVmIG5hbWVzLgorICAgICAgVU5VU0VEX0xPQ0FMX1RZUEVERUZfTkFNRV9DQU5ESURBVEVTID0gNTIsCisKKyAgICAgIC8vIElEIDUzIHVzZWQgdG8gYmUgYSB0YWJsZSBvZiBjb25zdHJ1Y3RvciBpbml0aWFsaXplciByZWNvcmRzLgorCisgICAgICAvLy8gXGJyaWVmIERlbGV0ZSBleHByZXNzaW9ucyB0aGF0IHdpbGwgYmUgYW5hbHl6ZWQgbGF0ZXIuCisgICAgICBERUxFVEVfRVhQUlNfVE9fQU5BTFlaRSA9IDU0LAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciBcI3ByYWdtYSBtc19zdHJ1Y3Qgb3B0aW9ucy4KKyAgICAgIE1TU1RSVUNUX1BSQUdNQV9PUFRJT05TID0gNTUsCisKKyAgICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGUgZm9yIFwjcHJhZ21hIG1zX3N0cnVjdCBvcHRpb25zLgorICAgICAgUE9JTlRFUlNfVE9fTUVNQkVSU19QUkFHTUFfT1BUSU9OUyA9IDU2LAorCisgICAgICAvLy8gXGJyaWVmIE51bWJlciBvZiB1bm1hdGNoZWQgI3ByYWdtYSBjbGFuZyBjdWRhX2ZvcmNlX2hvc3RfZGV2aWNlIGJlZ2luCisgICAgICAvLy8gZGlyZWN0aXZlcyB3ZSd2ZSBzZWVuLgorICAgICAgQ1VEQV9QUkFHTUFfRk9SQ0VfSE9TVF9ERVZJQ0VfREVQVEggPSA1NywKKworICAgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZSBmb3IgdHlwZXMgYXNzb2NpYXRlZCB3aXRoIE9wZW5DTCBleHRlbnNpb25zLgorICAgICAgT1BFTkNMX0VYVEVOU0lPTl9UWVBFUyA9IDU4LAorCisgICAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciBkZWNsYXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIE9wZW5DTCBleHRlbnNpb25zLgorICAgICAgT1BFTkNMX0VYVEVOU0lPTl9ERUNMUyA9IDU5LAorCisgICAgICBNT0RVTEFSX0NPREVHRU5fREVDTFMgPSA2MCwKKworICAgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZSBmb3IgXCNwcmFnbWEgcGFjayBvcHRpb25zLgorICAgICAgUEFDS19QUkFHTUFfT1BUSU9OUyA9IDYxLAorCisgICAgICAvLy8gXGJyaWVmIFRoZSBzdGFjayBvZiBvcGVuICNpZnMvI2lmZGVmcyByZWNvcmRlZCBpbiBhIHByZWFtYmxlLgorICAgICAgUFBfQ09ORElUSU9OQUxfU1RBQ0sgPSA2MiwKKworICAgICAgLy8vIFxicmllZiBBIHRhYmxlIG9mIHNraXBwZWQgcmFuZ2VzIHdpdGhpbiB0aGUgcHJlcHJvY2Vzc2luZyByZWNvcmQuCisgICAgICBQUERfU0tJUFBFRF9SQU5HRVMgPSA2MworICAgIH07CisKKyAgICAvLy8gXGJyaWVmIFJlY29yZCB0eXBlcyB1c2VkIHdpdGhpbiBhIHNvdXJjZSBtYW5hZ2VyIGJsb2NrLgorICAgIGVudW0gU291cmNlTWFuYWdlclJlY29yZFR5cGVzIHsKKyAgICAgIC8vLyBcYnJpZWYgRGVzY3JpYmVzIGEgc291cmNlIGxvY2F0aW9uIGVudHJ5IChTTG9jRW50cnkpIGZvciBhCisgICAgICAvLy8gZmlsZS4KKyAgICAgIFNNX1NMT0NfRklMRV9FTlRSWSA9IDEsCisKKyAgICAgIC8vLyBcYnJpZWYgRGVzY3JpYmVzIGEgc291cmNlIGxvY2F0aW9uIGVudHJ5IChTTG9jRW50cnkpIGZvciBhCisgICAgICAvLy8gYnVmZmVyLgorICAgICAgU01fU0xPQ19CVUZGRVJfRU5UUlkgPSAyLAorCisgICAgICAvLy8gXGJyaWVmIERlc2NyaWJlcyBhIGJsb2IgdGhhdCBjb250YWlucyB0aGUgZGF0YSBmb3IgYSBidWZmZXIKKyAgICAgIC8vLyBlbnRyeS4gVGhpcyBraW5kIG9mIHJlY29yZCBhbHdheXMgZGlyZWN0bHkgZm9sbG93cyBhCisgICAgICAvLy8gU01fU0xPQ19CVUZGRVJfRU5UUlkgcmVjb3JkIG9yIGEgU01fU0xPQ19GSUxFX0VOVFJZIHdpdGggYW4KKyAgICAgIC8vLyBvdmVycmlkZGVuIGJ1ZmZlci4KKyAgICAgIFNNX1NMT0NfQlVGRkVSX0JMT0IgPSAzLAorCisgICAgICAvLy8gXGJyaWVmIERlc2NyaWJlcyBhIHpsaWItY29tcHJlc3NlZCBibG9iIHRoYXQgY29udGFpbnMgdGhlIGRhdGEgZm9yCisgICAgICAvLy8gYSBidWZmZXIgZW50cnkuCisgICAgICBTTV9TTE9DX0JVRkZFUl9CTE9CX0NPTVBSRVNTRUQgPSA0LAorCisgICAgICAvLy8gXGJyaWVmIERlc2NyaWJlcyBhIHNvdXJjZSBsb2NhdGlvbiBlbnRyeSAoU0xvY0VudHJ5KSBmb3IgYQorICAgICAgLy8vIG1hY3JvIGV4cGFuc2lvbi4KKyAgICAgIFNNX1NMT0NfRVhQQU5TSU9OX0VOVFJZID0gNQorICAgIH07CisKKyAgICAvLy8gXGJyaWVmIFJlY29yZCB0eXBlcyB1c2VkIHdpdGhpbiBhIHByZXByb2Nlc3NvciBibG9jay4KKyAgICBlbnVtIFByZXByb2Nlc3NvclJlY29yZFR5cGVzIHsKKyAgICAgIC8vIFRoZSBtYWNyb3MgaW4gdGhlIFBQIHNlY3Rpb24gYXJlIGEgUFBfTUFDUk9fKiBpbnN0YW5jZSBmb2xsb3dlZCBieSBhCisgICAgICAvLyBsaXN0IG9mIFBQX1RPS0VOIGluc3RhbmNlcyBmb3IgZWFjaCB0b2tlbiBpbiB0aGUgZGVmaW5pdGlvbi4KKworICAgICAgLy8vIFxicmllZiBBbiBvYmplY3QtbGlrZSBtYWNybyBkZWZpbml0aW9uLgorICAgICAgLy8vIFtQUF9NQUNST19PQkpFQ1RfTElLRSwgSWRlbnRJbmZvSUQsIFNMb2MsIElzVXNlZF0KKyAgICAgIFBQX01BQ1JPX09CSkVDVF9MSUtFID0gMSwKKworICAgICAgLy8vIFxicmllZiBBIGZ1bmN0aW9uLWxpa2UgbWFjcm8gZGVmaW5pdGlvbi4KKyAgICAgIC8vLyBbUFBfTUFDUk9fRlVOQ1RJT05fTElLRSwgXDxPYmplY3RMaWtlU3R1ZmY+LCBJc0M5OVZhcmFyZ3MsCisgICAgICAvLy8gSXNHTlVWYXJhcnMsIE51bUFyZ3MsIEFyZ0lkZW50SW5mb0lEKiBdCisgICAgICBQUF9NQUNST19GVU5DVElPTl9MSUtFID0gMiwKKworICAgICAgLy8vIFxicmllZiBEZXNjcmliZXMgb25lIHRva2VuLgorICAgICAgLy8vIFtQUF9UT0tFTiwgU0xvYywgTGVuZ3RoLCBJZGVudEluZm9JRCwgS2luZCwgRmxhZ3NdCisgICAgICBQUF9UT0tFTiA9IDMsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIG1hY3JvIGRpcmVjdGl2ZXMgaGlzdG9yeSBmb3IgYSBwYXJ0aWN1bGFyIGlkZW50aWZpZXIuCisgICAgICBQUF9NQUNST19ESVJFQ1RJVkVfSElTVE9SWSA9IDQsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBtYWNybyBkaXJlY3RpdmUgZXhwb3J0ZWQgYnkgYSBtb2R1bGUuCisgICAgICAvLy8gW1BQX01PRFVMRV9NQUNSTywgU3VibW9kdWxlSUQsIE1hY3JvSUQsIChPdmVycmlkZGVuIFN1Ym1vZHVsZUlEKSpdCisgICAgICBQUF9NT0RVTEVfTUFDUk8gPSA1LAorICAgIH07CisKKyAgICAvLy8gXGJyaWVmIFJlY29yZCB0eXBlcyB1c2VkIHdpdGhpbiBhIHByZXByb2Nlc3NvciBkZXRhaWwgYmxvY2suCisgICAgZW51bSBQcmVwcm9jZXNzb3JEZXRhaWxSZWNvcmRUeXBlcyB7CisgICAgICAvLy8gXGJyaWVmIERlc2NyaWJlcyBhIG1hY3JvIGV4cGFuc2lvbiB3aXRoaW4gdGhlIHByZXByb2Nlc3NpbmcgcmVjb3JkLgorICAgICAgUFBEX01BQ1JPX0VYUEFOU0lPTiA9IDAsCisgICAgICAKKyAgICAgIC8vLyBcYnJpZWYgRGVzY3JpYmVzIGEgbWFjcm8gZGVmaW5pdGlvbiB3aXRoaW4gdGhlIHByZXByb2Nlc3NpbmcgcmVjb3JkLgorICAgICAgUFBEX01BQ1JPX0RFRklOSVRJT04gPSAxLAorICAgICAgCisgICAgICAvLy8gXGJyaWVmIERlc2NyaWJlcyBhbiBpbmNsdXNpb24gZGlyZWN0aXZlIHdpdGhpbiB0aGUgcHJlcHJvY2Vzc2luZworICAgICAgLy8vIHJlY29yZC4KKyAgICAgIFBQRF9JTkNMVVNJT05fRElSRUNUSVZFID0gMgorICAgIH07CisgICAgCisgICAgLy8vIFxicmllZiBSZWNvcmQgdHlwZXMgdXNlZCB3aXRoaW4gYSBzdWJtb2R1bGUgZGVzY3JpcHRpb24gYmxvY2suCisgICAgZW51bSBTdWJtb2R1bGVSZWNvcmRUeXBlcyB7CisgICAgICAvLy8gXGJyaWVmIE1ldGFkYXRhIGZvciBzdWJtb2R1bGVzIGFzIGEgd2hvbGUuCisgICAgICBTVUJNT0RVTEVfTUVUQURBVEEgPSAwLAorCisgICAgICAvLy8gXGJyaWVmIERlZmluZXMgdGhlIG1ham9yIGF0dHJpYnV0ZXMgb2YgYSBzdWJtb2R1bGUsIGluY2x1ZGluZyBpdHMKKyAgICAgIC8vLyBuYW1lIGFuZCBwYXJlbnQuCisgICAgICBTVUJNT0RVTEVfREVGSU5JVElPTiA9IDEsCisKKyAgICAgIC8vLyBcYnJpZWYgU3BlY2lmaWVzIHRoZSB1bWJyZWxsYSBoZWFkZXIgdXNlZCB0byBjcmVhdGUgdGhpcyBtb2R1bGUsCisgICAgICAvLy8gaWYgYW55LgorICAgICAgU1VCTU9EVUxFX1VNQlJFTExBX0hFQURFUiA9IDIsCisKKyAgICAgIC8vLyBcYnJpZWYgU3BlY2lmaWVzIGEgaGVhZGVyIHRoYXQgZmFsbHMgaW50byB0aGlzIChzdWIpbW9kdWxlLgorICAgICAgU1VCTU9EVUxFX0hFQURFUiA9IDMsCisKKyAgICAgIC8vLyBcYnJpZWYgU3BlY2lmaWVzIGEgdG9wLWxldmVsIGhlYWRlciB0aGF0IGZhbGxzIGludG8gdGhpcyAoc3ViKW1vZHVsZS4KKyAgICAgIFNVQk1PRFVMRV9UT1BIRUFERVIgPSA0LAorCisgICAgICAvLy8gXGJyaWVmIFNwZWNpZmllcyBhbiB1bWJyZWxsYSBkaXJlY3RvcnkuCisgICAgICBTVUJNT0RVTEVfVU1CUkVMTEFfRElSID0gNSwKKworICAgICAgLy8vIFxicmllZiBTcGVjaWZpZXMgdGhlIHN1Ym1vZHVsZXMgdGhhdCBhcmUgaW1wb3J0ZWQgYnkgdGhpcyAKKyAgICAgIC8vLyBzdWJtb2R1bGUuCisgICAgICBTVUJNT0RVTEVfSU1QT1JUUyA9IDYsCisKKyAgICAgIC8vLyBcYnJpZWYgU3BlY2lmaWVzIHRoZSBzdWJtb2R1bGVzIHRoYXQgYXJlIHJlLWV4cG9ydGVkIGZyb20gdGhpcyAKKyAgICAgIC8vLyBzdWJtb2R1bGUuCisgICAgICBTVUJNT0RVTEVfRVhQT1JUUyA9IDcsCisKKyAgICAgIC8vLyBcYnJpZWYgU3BlY2lmaWVzIGEgcmVxdWlyZWQgZmVhdHVyZS4KKyAgICAgIFNVQk1PRFVMRV9SRVFVSVJFUyA9IDgsCisKKyAgICAgIC8vLyBcYnJpZWYgU3BlY2lmaWVzIGEgaGVhZGVyIHRoYXQgaGFzIGJlZW4gZXhwbGljaXRseSBleGNsdWRlZAorICAgICAgLy8vIGZyb20gdGhpcyBzdWJtb2R1bGUuCisgICAgICBTVUJNT0RVTEVfRVhDTFVERURfSEVBREVSID0gOSwKKworICAgICAgLy8vIFxicmllZiBTcGVjaWZpZXMgYSBsaWJyYXJ5IG9yIGZyYW1ld29yayB0byBsaW5rIGFnYWluc3QuCisgICAgICBTVUJNT0RVTEVfTElOS19MSUJSQVJZID0gMTAsCisKKyAgICAgIC8vLyBcYnJpZWYgU3BlY2lmaWVzIGEgY29uZmlndXJhdGlvbiBtYWNybyBmb3IgdGhpcyBtb2R1bGUuCisgICAgICBTVUJNT0RVTEVfQ09ORklHX01BQ1JPID0gMTEsCisKKyAgICAgIC8vLyBcYnJpZWYgU3BlY2lmaWVzIGEgY29uZmxpY3Qgd2l0aCBhbm90aGVyIG1vZHVsZS4KKyAgICAgIFNVQk1PRFVMRV9DT05GTElDVCA9IDEyLAorCisgICAgICAvLy8gXGJyaWVmIFNwZWNpZmllcyBhIGhlYWRlciB0aGF0IGlzIHByaXZhdGUgdG8gdGhpcyBzdWJtb2R1bGUuCisgICAgICBTVUJNT0RVTEVfUFJJVkFURV9IRUFERVIgPSAxMywKKworICAgICAgLy8vIFxicmllZiBTcGVjaWZpZXMgYSBoZWFkZXIgdGhhdCBpcyBwYXJ0IG9mIHRoZSBtb2R1bGUgYnV0IG11c3QgYmUKKyAgICAgIC8vLyB0ZXh0dWFsbHkgaW5jbHVkZWQuCisgICAgICBTVUJNT0RVTEVfVEVYVFVBTF9IRUFERVIgPSAxNCwKKworICAgICAgLy8vIFxicmllZiBTcGVjaWZpZXMgYSBoZWFkZXIgdGhhdCBpcyBwcml2YXRlIHRvIHRoaXMgc3VibW9kdWxlIGJ1dAorICAgICAgLy8vIG11c3QgYmUgdGV4dHVhbGx5IGluY2x1ZGVkLgorICAgICAgU1VCTU9EVUxFX1BSSVZBVEVfVEVYVFVBTF9IRUFERVIgPSAxNSwKKworICAgICAgLy8vIFxicmllZiBTcGVjaWZpZXMgc29tZSBkZWNsYXJhdGlvbnMgd2l0aCBpbml0aWFsaXplcnMgdGhhdCBtdXN0IGJlCisgICAgICAvLy8gZW1pdHRlZCB0byBpbml0aWFsaXplIHRoZSBtb2R1bGUuCisgICAgICBTVUJNT0RVTEVfSU5JVElBTElaRVJTID0gMTYsCisKKyAgICAgIC8vLyBcYnJpZWYgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdGhhdCB3aWxsIGV2ZW50dWFsbHkKKyAgICAgIC8vLyByZS1leHBvcnQgdGhlIGVudGl0aWVzIGluIHRoaXMgbW9kdWxlLgorICAgICAgU1VCTU9EVUxFX0VYUE9SVF9BUyA9IDE3LAorICAgIH07CisKKyAgICAvLy8gXGJyaWVmIFJlY29yZCB0eXBlcyB1c2VkIHdpdGhpbiBhIGNvbW1lbnRzIGJsb2NrLgorICAgIGVudW0gQ29tbWVudFJlY29yZFR5cGVzIHsKKyAgICAgIENPTU1FTlRTX1JBV19DT01NRU5UID0gMAorICAgIH07CisKKyAgICAvLy8gXGRlZmdyb3VwIEFTVEFTVCBBU1QgZmlsZSBBU1QgY29uc3RhbnRzCisgICAgLy8vCisgICAgLy8vIFRoZSBjb25zdGFudHMgaW4gdGhpcyBncm91cCBkZXNjcmliZSB2YXJpb3VzIGNvbXBvbmVudHMgb2YgdGhlCisgICAgLy8vIGFic3RyYWN0IHN5bnRheCB0cmVlIHdpdGhpbiBhbiBBU1QgZmlsZS4KKyAgICAvLy8KKyAgICAvLy8gQHsKKworICAgIC8vLyBcYnJpZWYgUHJlZGVmaW5lZCB0eXBlIElEcy4KKyAgICAvLy8KKyAgICAvLy8gVGhlc2UgdHlwZSBJRHMgY29ycmVzcG9uZCB0byBwcmVkZWZpbmVkIHR5cGVzIGluIHRoZSBBU1QKKyAgICAvLy8gY29udGV4dCwgc3VjaCBhcyBidWlsdC1pbiB0eXBlcyAoaW50KSBhbmQgc3BlY2lhbCBwbGFjZS1ob2xkZXIKKyAgICAvLy8gdHlwZXMgKHRoZSBcPG92ZXJsb2FkPiBhbmQgXDxkZXBlbmRlbnQ+IHR5cGUgbWFya2VycykuIFN1Y2gKKyAgICAvLy8gdHlwZXMgYXJlIG5ldmVyIGFjdHVhbGx5IHNlcmlhbGl6ZWQsIHNpbmNlIHRoZXkgd2lsbCBiZSBidWlsdAorICAgIC8vLyBieSB0aGUgQVNUIGNvbnRleHQgd2hlbiBpdCBpcyBjcmVhdGVkLgorICAgIGVudW0gUHJlZGVmaW5lZFR5cGVJRHMgeworICAgICAgLy8vIFxicmllZiBUaGUgTlVMTCB0eXBlLgorICAgICAgUFJFREVGX1RZUEVfTlVMTF9JRCAgICAgICA9IDAsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIHZvaWQgdHlwZS4KKyAgICAgIFBSRURFRl9UWVBFX1ZPSURfSUQgICAgICAgPSAxLAorCisgICAgICAvLy8gXGJyaWVmIFRoZSAnYm9vbCcgb3IgJ19Cb29sJyB0eXBlLgorICAgICAgUFJFREVGX1RZUEVfQk9PTF9JRCAgICAgICA9IDIsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlICdjaGFyJyB0eXBlLCB3aGVuIGl0IGlzIHVuc2lnbmVkLgorICAgICAgUFJFREVGX1RZUEVfQ0hBUl9VX0lEICAgICA9IDMsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlICd1bnNpZ25lZCBjaGFyJyB0eXBlLgorICAgICAgUFJFREVGX1RZUEVfVUNIQVJfSUQgICAgICA9IDQsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlICd1bnNpZ25lZCBzaG9ydCcgdHlwZS4KKyAgICAgIFBSRURFRl9UWVBFX1VTSE9SVF9JRCAgICAgPSA1LAorCisgICAgICAvLy8gXGJyaWVmIFRoZSAndW5zaWduZWQgaW50JyB0eXBlLgorICAgICAgUFJFREVGX1RZUEVfVUlOVF9JRCAgICAgICA9IDYsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlICd1bnNpZ25lZCBsb25nJyB0eXBlLgorICAgICAgUFJFREVGX1RZUEVfVUxPTkdfSUQgICAgICA9IDcsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlICd1bnNpZ25lZCBsb25nIGxvbmcnIHR5cGUuCisgICAgICBQUkVERUZfVFlQRV9VTE9OR0xPTkdfSUQgID0gOCwKKworICAgICAgLy8vIFxicmllZiBUaGUgJ2NoYXInIHR5cGUsIHdoZW4gaXQgaXMgc2lnbmVkLgorICAgICAgUFJFREVGX1RZUEVfQ0hBUl9TX0lEICAgICA9IDksCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlICdzaWduZWQgY2hhcicgdHlwZS4KKyAgICAgIFBSRURFRl9UWVBFX1NDSEFSX0lEICAgICAgPSAxMCwKKworICAgICAgLy8vIFxicmllZiBUaGUgQysrICd3Y2hhcl90JyB0eXBlLgorICAgICAgUFJFREVGX1RZUEVfV0NIQVJfSUQgICAgICA9IDExLAorCisgICAgICAvLy8gXGJyaWVmIFRoZSAoc2lnbmVkKSAnc2hvcnQnIHR5cGUuCisgICAgICBQUkVERUZfVFlQRV9TSE9SVF9JRCAgICAgID0gMTIsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIChzaWduZWQpICdpbnQnIHR5cGUuCisgICAgICBQUkVERUZfVFlQRV9JTlRfSUQgICAgICAgID0gMTMsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIChzaWduZWQpICdsb25nJyB0eXBlLgorICAgICAgUFJFREVGX1RZUEVfTE9OR19JRCAgICAgICA9IDE0LAorCisgICAgICAvLy8gXGJyaWVmIFRoZSAoc2lnbmVkKSAnbG9uZyBsb25nJyB0eXBlLgorICAgICAgUFJFREVGX1RZUEVfTE9OR0xPTkdfSUQgICA9IDE1LAorCisgICAgICAvLy8gXGJyaWVmIFRoZSAnZmxvYXQnIHR5cGUuCisgICAgICBQUkVERUZfVFlQRV9GTE9BVF9JRCAgICAgID0gMTYsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlICdkb3VibGUnIHR5cGUuCisgICAgICBQUkVERUZfVFlQRV9ET1VCTEVfSUQgICAgID0gMTcsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlICdsb25nIGRvdWJsZScgdHlwZS4KKyAgICAgIFBSRURFRl9UWVBFX0xPTkdET1VCTEVfSUQgPSAxOCwKKworICAgICAgLy8vIFxicmllZiBUaGUgcGxhY2Vob2xkZXIgdHlwZSBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbiBzZXRzLgorICAgICAgUFJFREVGX1RZUEVfT1ZFUkxPQURfSUQgICA9IDE5LAorCisgICAgICAvLy8gXGJyaWVmIFRoZSBwbGFjZWhvbGRlciB0eXBlIGZvciBkZXBlbmRlbnQgdHlwZXMuCisgICAgICBQUkVERUZfVFlQRV9ERVBFTkRFTlRfSUQgID0gMjAsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlICdfX3VpbnQxMjhfdCcgdHlwZS4KKyAgICAgIFBSRURFRl9UWVBFX1VJTlQxMjhfSUQgICAgPSAyMSwKKworICAgICAgLy8vIFxicmllZiBUaGUgJ19faW50MTI4X3QnIHR5cGUuCisgICAgICBQUkVERUZfVFlQRV9JTlQxMjhfSUQgICAgID0gMjIsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIHR5cGUgb2YgJ251bGxwdHInLgorICAgICAgUFJFREVGX1RZUEVfTlVMTFBUUl9JRCAgICA9IDIzLAorCisgICAgICAvLy8gXGJyaWVmIFRoZSBDKysgJ2NoYXIxNl90JyB0eXBlLgorICAgICAgUFJFREVGX1RZUEVfQ0hBUjE2X0lEICAgICA9IDI0LAorCisgICAgICAvLy8gXGJyaWVmIFRoZSBDKysgJ2NoYXIzMl90JyB0eXBlLgorICAgICAgUFJFREVGX1RZUEVfQ0hBUjMyX0lEICAgICA9IDI1LAorCisgICAgICAvLy8gXGJyaWVmIFRoZSBPYmpDICdpZCcgdHlwZS4KKyAgICAgIFBSRURFRl9UWVBFX09CSkNfSUQgICAgICAgPSAyNiwKKworICAgICAgLy8vIFxicmllZiBUaGUgT2JqQyAnQ2xhc3MnIHR5cGUuCisgICAgICBQUkVERUZfVFlQRV9PQkpDX0NMQVNTICAgID0gMjcsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIE9iakMgJ1NFTCcgdHlwZS4KKyAgICAgIFBSRURFRl9UWVBFX09CSkNfU0VMICAgICAgPSAyOCwKKworICAgICAgLy8vIFxicmllZiBUaGUgJ3Vua25vd24gYW55JyBwbGFjZWhvbGRlciB0eXBlLgorICAgICAgUFJFREVGX1RZUEVfVU5LTk9XTl9BTlkgICA9IDI5LAorCisgICAgICAvLy8gXGJyaWVmIFRoZSBwbGFjZWhvbGRlciB0eXBlIGZvciBib3VuZCBtZW1iZXIgZnVuY3Rpb25zLgorICAgICAgUFJFREVGX1RZUEVfQk9VTkRfTUVNQkVSICA9IDMwLAorCisgICAgICAvLy8gXGJyaWVmIFRoZSAiYXV0byIgZGVkdWN0aW9uIHR5cGUuCisgICAgICBQUkVERUZfVFlQRV9BVVRPX0RFRFVDVCAgID0gMzEsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlICJhdXRvICYmIiBkZWR1Y3Rpb24gdHlwZS4KKyAgICAgIFBSRURFRl9UWVBFX0FVVE9fUlJFRl9ERURVQ1QgPSAzMiwKKworICAgICAgLy8vIFxicmllZiBUaGUgT3BlbkNMICdoYWxmJyAvIEFSTSBORU9OIF9fZnAxNiB0eXBlLgorICAgICAgUFJFREVGX1RZUEVfSEFMRl9JRCAgICAgICA9IDMzLAorCisgICAgICAvLy8gXGJyaWVmIEFSQydzIHVuYnJpZGdlZC1jYXN0IHBsYWNlaG9sZGVyIHR5cGUuCisgICAgICBQUkVERUZfVFlQRV9BUkNfVU5CUklER0VEX0NBU1QgPSAzNCwKKworICAgICAgLy8vIFxicmllZiBUaGUgcHNldWRvLW9iamVjdCBwbGFjZWhvbGRlciB0eXBlLgorICAgICAgUFJFREVGX1RZUEVfUFNFVURPX09CSkVDVCA9IDM1LAorCisgICAgICAvLy8gXGJyaWVmIFRoZSBwbGFjZWhvbGRlciB0eXBlIGZvciBidWlsdGluIGZ1bmN0aW9ucy4KKyAgICAgIFBSRURFRl9UWVBFX0JVSUxUSU5fRk4gPSAzNiwKKworICAgICAgLy8vIFxicmllZiBPcGVuQ0wgZXZlbnQgdHlwZS4KKyAgICAgIFBSRURFRl9UWVBFX0VWRU5UX0lEICAgICAgPSAzNywKKworICAgICAgLy8vIFxicmllZiBPcGVuQ0wgY2xrIGV2ZW50IHR5cGUuCisgICAgICBQUkVERUZfVFlQRV9DTEtfRVZFTlRfSUQgID0gMzgsCisKKyAgICAgIC8vLyBcYnJpZWYgT3BlbkNMIHNhbXBsZXIgdHlwZS4KKyAgICAgIFBSRURFRl9UWVBFX1NBTVBMRVJfSUQgICAgPSAzOSwKKworICAgICAgLy8vIFxicmllZiBPcGVuQ0wgcXVldWUgdHlwZS4KKyAgICAgIFBSRURFRl9UWVBFX1FVRVVFX0lEICAgICAgPSA0MCwKKworICAgICAgLy8vIFxicmllZiBPcGVuQ0wgcmVzZXJ2ZV9pZCB0eXBlLgorICAgICAgUFJFREVGX1RZUEVfUkVTRVJWRV9JRF9JRCA9IDQxLAorCisgICAgICAvLy8gXGJyaWVmIFRoZSBwbGFjZWhvbGRlciB0eXBlIGZvciBPcGVuTVAgYXJyYXkgc2VjdGlvbi4KKyAgICAgIFBSRURFRl9UWVBFX09NUF9BUlJBWV9TRUNUSU9OID0gNDIsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlICdfX2Zsb2F0MTI4JyB0eXBlCisgICAgICBQUkVERUZfVFlQRV9GTE9BVDEyOF9JRCA9IDQzLAorCisgICAgICAvLy8gXGJyaWVmIFRoZSAnX0Zsb2F0MTYnIHR5cGUKKyAgICAgIFBSRURFRl9UWVBFX0ZMT0FUMTZfSUQgPSA0NCwKKworICAgICAgLy8vIFxicmllZiBPcGVuQ0wgaW1hZ2UgdHlwZXMgd2l0aCBhdXRvIG51bWVyYXRpb24KKyNkZWZpbmUgSU1BR0VfVFlQRShJbWdUeXBlLCBJZCwgU2luZ2xldG9uSWQsIEFjY2VzcywgU3VmZml4KSBcCisgICAgICBQUkVERUZfVFlQRV8jI0lkIyNfSUQsCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3BlbkNMSW1hZ2VUeXBlcy5kZWYiCisgICAgfTsKKworICAgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBwcmVkZWZpbmVkIHR5cGUgSURzIHRoYXQgYXJlIHJlc2VydmVkIGZvcgorICAgIC8vLyB0aGUgUFJFREVGX1RZUEVfKiBjb25zdGFudHMuCisgICAgLy8vCisgICAgLy8vIFR5cGUgSURzIGZvciBub24tcHJlZGVmaW5lZCB0eXBlcyB3aWxsIHN0YXJ0IGF0CisgICAgLy8vIE5VTV9QUkVERUZfVFlQRV9JRHMuCisgICAgY29uc3QgdW5zaWduZWQgTlVNX1BSRURFRl9UWVBFX0lEUyA9IDEwMDsKKworICAgIC8vLyBcYnJpZWYgUmVjb3JkIGNvZGVzIGZvciBlYWNoIGtpbmQgb2YgdHlwZS4KKyAgICAvLy8KKyAgICAvLy8gVGhlc2UgY29uc3RhbnRzIGRlc2NyaWJlIHRoZSB0eXBlIHJlY29yZHMgdGhhdCBjYW4gb2NjdXIgd2l0aGluIGEKKyAgICAvLy8gYmxvY2sgaWRlbnRpZmllZCBieSBERUNMVFlQRVNfQkxPQ0tfSUQgaW4gdGhlIEFTVCBmaWxlLiBFYWNoCisgICAgLy8vIGNvbnN0YW50IGRlc2NyaWJlcyBhIHJlY29yZCBmb3IgYSBzcGVjaWZpYyB0eXBlIGNsYXNzIGluIHRoZQorICAgIC8vLyBBU1QuIE5vdGUgdGhhdCBEZWNsQ29kZSB2YWx1ZXMgc2hhcmUgdGhpcyBjb2RlIHNwYWNlLgorICAgIGVudW0gVHlwZUNvZGUgeworICAgICAgLy8vIFxicmllZiBBbiBFeHRRdWFsVHlwZSByZWNvcmQuCisgICAgICBUWVBFX0VYVF9RVUFMICAgICAgICAgICAgICAgICA9IDEsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBDb21wbGV4VHlwZSByZWNvcmQuCisgICAgICBUWVBFX0NPTVBMRVggICAgICAgICAgICAgICAgICA9IDMsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBQb2ludGVyVHlwZSByZWNvcmQuCisgICAgICBUWVBFX1BPSU5URVIgICAgICAgICAgICAgICAgICA9IDQsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBCbG9ja1BvaW50ZXJUeXBlIHJlY29yZC4KKyAgICAgIFRZUEVfQkxPQ0tfUE9JTlRFUiAgICAgICAgICAgID0gNSwKKworICAgICAgLy8vIFxicmllZiBBbiBMVmFsdWVSZWZlcmVuY2VUeXBlIHJlY29yZC4KKyAgICAgIFRZUEVfTFZBTFVFX1JFRkVSRU5DRSAgICAgICAgID0gNiwKKworICAgICAgLy8vIFxicmllZiBBbiBSVmFsdWVSZWZlcmVuY2VUeXBlIHJlY29yZC4KKyAgICAgIFRZUEVfUlZBTFVFX1JFRkVSRU5DRSAgICAgICAgID0gNywKKworICAgICAgLy8vIFxicmllZiBBIE1lbWJlclBvaW50ZXJUeXBlIHJlY29yZC4KKyAgICAgIFRZUEVfTUVNQkVSX1BPSU5URVIgICAgICAgICAgID0gOCwKKworICAgICAgLy8vIFxicmllZiBBIENvbnN0YW50QXJyYXlUeXBlIHJlY29yZC4KKyAgICAgIFRZUEVfQ09OU1RBTlRfQVJSQVkgICAgICAgICAgID0gOSwKKworICAgICAgLy8vIFxicmllZiBBbiBJbmNvbXBsZXRlQXJyYXlUeXBlIHJlY29yZC4KKyAgICAgIFRZUEVfSU5DT01QTEVURV9BUlJBWSAgICAgICAgID0gMTAsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBWYXJpYWJsZUFycmF5VHlwZSByZWNvcmQuCisgICAgICBUWVBFX1ZBUklBQkxFX0FSUkFZICAgICAgICAgICA9IDExLAorCisgICAgICAvLy8gXGJyaWVmIEEgVmVjdG9yVHlwZSByZWNvcmQuCisgICAgICBUWVBFX1ZFQ1RPUiAgICAgICAgICAgICAgICAgICA9IDEyLAorCisgICAgICAvLy8gXGJyaWVmIEFuIEV4dFZlY3RvclR5cGUgcmVjb3JkLgorICAgICAgVFlQRV9FWFRfVkVDVE9SICAgICAgICAgICAgICAgPSAxMywKKworICAgICAgLy8vIFxicmllZiBBIEZ1bmN0aW9uTm9Qcm90b1R5cGUgcmVjb3JkLgorICAgICAgVFlQRV9GVU5DVElPTl9OT19QUk9UTyAgICAgICAgPSAxNCwKKworICAgICAgLy8vIFxicmllZiBBIEZ1bmN0aW9uUHJvdG9UeXBlIHJlY29yZC4KKyAgICAgIFRZUEVfRlVOQ1RJT05fUFJPVE8gICAgICAgICAgID0gMTUsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBUeXBlZGVmVHlwZSByZWNvcmQuCisgICAgICBUWVBFX1RZUEVERUYgICAgICAgICAgICAgICAgICA9IDE2LAorCisgICAgICAvLy8gXGJyaWVmIEEgVHlwZU9mRXhwclR5cGUgcmVjb3JkLgorICAgICAgVFlQRV9UWVBFT0ZfRVhQUiAgICAgICAgICAgICAgPSAxNywKKworICAgICAgLy8vIFxicmllZiBBIFR5cGVPZlR5cGUgcmVjb3JkLgorICAgICAgVFlQRV9UWVBFT0YgICAgICAgICAgICAgICAgICAgPSAxOCwKKworICAgICAgLy8vIFxicmllZiBBIFJlY29yZFR5cGUgcmVjb3JkLgorICAgICAgVFlQRV9SRUNPUkQgICAgICAgICAgICAgICAgICAgPSAxOSwKKworICAgICAgLy8vIFxicmllZiBBbiBFbnVtVHlwZSByZWNvcmQuCisgICAgICBUWVBFX0VOVU0gICAgICAgICAgICAgICAgICAgICA9IDIwLAorCisgICAgICAvLy8gXGJyaWVmIEFuIE9iakNJbnRlcmZhY2VUeXBlIHJlY29yZC4KKyAgICAgIFRZUEVfT0JKQ19JTlRFUkZBQ0UgICAgICAgICAgID0gMjEsCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gT2JqQ09iamVjdFBvaW50ZXJUeXBlIHJlY29yZC4KKyAgICAgIFRZUEVfT0JKQ19PQkpFQ1RfUE9JTlRFUiAgICAgID0gMjIsCisKKyAgICAgIC8vLyBcYnJpZWYgYSBEZWNsdHlwZVR5cGUgcmVjb3JkLgorICAgICAgVFlQRV9ERUNMVFlQRSAgICAgICAgICAgICAgICAgPSAyMywKKworICAgICAgLy8vIFxicmllZiBBbiBFbGFib3JhdGVkVHlwZSByZWNvcmQuCisgICAgICBUWVBFX0VMQUJPUkFURUQgICAgICAgICAgICAgICA9IDI0LAorCisgICAgICAvLy8gXGJyaWVmIEEgU3Vic3RUZW1wbGF0ZVR5cGVQYXJtVHlwZSByZWNvcmQuCisgICAgICBUWVBFX1NVQlNUX1RFTVBMQVRFX1RZUEVfUEFSTSA9IDI1LAorCisgICAgICAvLy8gXGJyaWVmIEFuIFVucmVzb2x2ZWRVc2luZ1R5cGUgcmVjb3JkLgorICAgICAgVFlQRV9VTlJFU09MVkVEX1VTSU5HICAgICAgICAgPSAyNiwKKworICAgICAgLy8vIFxicmllZiBBbiBJbmplY3RlZENsYXNzTmFtZVR5cGUgcmVjb3JkLgorICAgICAgVFlQRV9JTkpFQ1RFRF9DTEFTU19OQU1FICAgICAgPSAyNywKKworICAgICAgLy8vIFxicmllZiBBbiBPYmpDT2JqZWN0VHlwZSByZWNvcmQuCisgICAgICBUWVBFX09CSkNfT0JKRUNUICAgICAgICAgICAgICA9IDI4LAorCisgICAgICAvLy8gXGJyaWVmIEFuIFRlbXBsYXRlVHlwZVBhcm1UeXBlIHJlY29yZC4KKyAgICAgIFRZUEVfVEVNUExBVEVfVFlQRV9QQVJNICAgICAgID0gMjksCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUgcmVjb3JkLgorICAgICAgVFlQRV9URU1QTEFURV9TUEVDSUFMSVpBVElPTiAgPSAzMCwKKworICAgICAgLy8vIFxicmllZiBBIERlcGVuZGVudE5hbWVUeXBlIHJlY29yZC4KKyAgICAgIFRZUEVfREVQRU5ERU5UX05BTUUgICAgICAgICAgID0gMzEsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBEZXBlbmRlbnRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZSByZWNvcmQuCisgICAgICBUWVBFX0RFUEVOREVOVF9URU1QTEFURV9TUEVDSUFMSVpBVElPTiA9IDMyLAorCisgICAgICAvLy8gXGJyaWVmIEEgRGVwZW5kZW50U2l6ZWRBcnJheVR5cGUgcmVjb3JkLgorICAgICAgVFlQRV9ERVBFTkRFTlRfU0laRURfQVJSQVkgICAgPSAzMywKKworICAgICAgLy8vIFxicmllZiBBIFBhcmVuVHlwZSByZWNvcmQuCisgICAgICBUWVBFX1BBUkVOICAgICAgICAgICAgICAgICAgICA9IDM0LAorCisgICAgICAvLy8gXGJyaWVmIEEgUGFja0V4cGFuc2lvblR5cGUgcmVjb3JkLgorICAgICAgVFlQRV9QQUNLX0VYUEFOU0lPTiAgICAgICAgICAgPSAzNSwKKworICAgICAgLy8vIFxicmllZiBBbiBBdHRyaWJ1dGVkVHlwZSByZWNvcmQuCisgICAgICBUWVBFX0FUVFJJQlVURUQgICAgICAgICAgICAgICA9IDM2LAorCisgICAgICAvLy8gXGJyaWVmIEEgU3Vic3RUZW1wbGF0ZVR5cGVQYXJtUGFja1R5cGUgcmVjb3JkLgorICAgICAgVFlQRV9TVUJTVF9URU1QTEFURV9UWVBFX1BBUk1fUEFDSyA9IDM3LAorCisgICAgICAvLy8gXGJyaWVmIEEgQXV0b1R5cGUgcmVjb3JkLgorICAgICAgVFlQRV9BVVRPICAgICAgICAgICAgICAgICAgPSAzOCwKKworICAgICAgLy8vIFxicmllZiBBIFVuYXJ5VHJhbnNmb3JtVHlwZSByZWNvcmQuCisgICAgICBUWVBFX1VOQVJZX1RSQU5TRk9STSAgICAgICA9IDM5LAorCisgICAgICAvLy8gXGJyaWVmIEFuIEF0b21pY1R5cGUgcmVjb3JkLgorICAgICAgVFlQRV9BVE9NSUMgICAgICAgICAgICAgICAgPSA0MCwKKworICAgICAgLy8vIFxicmllZiBBIERlY2F5ZWRUeXBlIHJlY29yZC4KKyAgICAgIFRZUEVfREVDQVlFRCAgICAgICAgICAgICAgID0gNDEsCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gQWRqdXN0ZWRUeXBlIHJlY29yZC4KKyAgICAgIFRZUEVfQURKVVNURUQgICAgICAgICAgICAgID0gNDIsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBQaXBlVHlwZSByZWNvcmQuCisgICAgICBUWVBFX1BJUEUgICAgICAgICAgICAgICAgICA9IDQzLAorCisgICAgICAvLy8gXGJyaWVmIEFuIE9iakNUeXBlUGFyYW1UeXBlIHJlY29yZC4KKyAgICAgIFRZUEVfT0JKQ19UWVBFX1BBUkFNICAgICAgID0gNDQsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBEZWR1Y2VkVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUgcmVjb3JkLgorICAgICAgVFlQRV9ERURVQ0VEX1RFTVBMQVRFX1NQRUNJQUxJWkFUSU9OID0gNDUsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBEZXBlbmRlbnRTaXplZEV4dFZlY3RvclR5cGUgcmVjb3JkLgorICAgICAgVFlQRV9ERVBFTkRFTlRfU0laRURfRVhUX1ZFQ1RPUiA9IDQ2LAorCisgICAgICAvLy8gXGJyaWVmIEEgRGVwZW5kZW50QWRkcmVzc1NwYWNlVHlwZSByZWNvcmQuCisgICAgICBUWVBFX0RFUEVOREVOVF9BRERSRVNTX1NQQUNFID0gNDcKKyAgICB9OworCisgICAgLy8vIFxicmllZiBUaGUgdHlwZSBJRHMgZm9yIHNwZWNpYWwgdHlwZXMgY29uc3RydWN0ZWQgYnkgc2VtYW50aWMKKyAgICAvLy8gYW5hbHlzaXMuCisgICAgLy8vCisgICAgLy8vIFRoZSBjb25zdGFudHMgaW4gdGhpcyBlbnVtZXJhdGlvbiBhcmUgaW5kaWNlcyBpbnRvIHRoZQorICAgIC8vLyBTUEVDSUFMX1RZUEVTIHJlY29yZC4KKyAgICBlbnVtIFNwZWNpYWxUeXBlSURzIHsKKyAgICAgIC8vLyBcYnJpZWYgQ0ZDb25zdGFudFN0cmluZyB0eXBlCisgICAgICBTUEVDSUFMX1RZUEVfQ0ZfQ09OU1RBTlRfU1RSSU5HICAgICAgICAgID0gMCwKKworICAgICAgLy8vIFxicmllZiBDIEZJTEUgdHlwZWRlZiB0eXBlCisgICAgICBTUEVDSUFMX1RZUEVfRklMRSAgICAgICAgICAgICAgICAgICAgICAgID0gMSwKKworICAgICAgLy8vIFxicmllZiBDIGptcF9idWYgdHlwZWRlZiB0eXBlCisgICAgICBTUEVDSUFMX1RZUEVfSk1QX0JVRiAgICAgICAgICAgICAgICAgICAgID0gMiwKKworICAgICAgLy8vIFxicmllZiBDIHNpZ2ptcF9idWYgdHlwZWRlZiB0eXBlCisgICAgICBTUEVDSUFMX1RZUEVfU0lHSk1QX0JVRiAgICAgICAgICAgICAgICAgID0gMywKKworICAgICAgLy8vIFxicmllZiBPYmplY3RpdmUtQyAiaWQiIHJlZGVmaW5pdGlvbiB0eXBlCisgICAgICBTUEVDSUFMX1RZUEVfT0JKQ19JRF9SRURFRklOSVRJT04gICAgICAgID0gNCwKKworICAgICAgLy8vIFxicmllZiBPYmplY3RpdmUtQyAiQ2xhc3MiIHJlZGVmaW5pdGlvbiB0eXBlCisgICAgICBTUEVDSUFMX1RZUEVfT0JKQ19DTEFTU19SRURFRklOSVRJT04gICAgID0gNSwKKworICAgICAgLy8vIFxicmllZiBPYmplY3RpdmUtQyAiU0VMIiByZWRlZmluaXRpb24gdHlwZQorICAgICAgU1BFQ0lBTF9UWVBFX09CSkNfU0VMX1JFREVGSU5JVElPTiAgICAgICA9IDYsCisKKyAgICAgIC8vLyBcYnJpZWYgQyB1Y29udGV4dF90IHR5cGVkZWYgdHlwZQorICAgICAgU1BFQ0lBTF9UWVBFX1VDT05URVhUX1QgICAgICAgICAgICAgICAgICA9IDcKKyAgICB9OworICAgIAorICAgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBzcGVjaWFsIHR5cGUgSURzLgorICAgIGNvbnN0IHVuc2lnbmVkIE51bVNwZWNpYWxUeXBlSURzID0gODsKKworICAgIC8vLyBcYnJpZWYgUHJlZGVmaW5lZCBkZWNsYXJhdGlvbiBJRHMuCisgICAgLy8vCisgICAgLy8vIFRoZXNlIGRlY2xhcmF0aW9uIElEcyBjb3JyZXNwb25kIHRvIHByZWRlZmluZWQgZGVjbGFyYXRpb25zIGluIHRoZSBBU1QKKyAgICAvLy8gY29udGV4dCwgc3VjaCBhcyB0aGUgTlVMTCBkZWNsYXJhdGlvbiBJRC4gU3VjaCBkZWNsYXJhdGlvbnMgYXJlIG5ldmVyCisgICAgLy8vIGFjdHVhbGx5IHNlcmlhbGl6ZWQsIHNpbmNlIHRoZXkgd2lsbCBiZSBidWlsdCBieSB0aGUgQVNUIGNvbnRleHQgd2hlbiAKKyAgICAvLy8gaXQgaXMgY3JlYXRlZC4KKyAgICBlbnVtIFByZWRlZmluZWREZWNsSURzIHsKKyAgICAgIC8vLyBcYnJpZWYgVGhlIE5VTEwgZGVjbGFyYXRpb24uCisgICAgICBQUkVERUZfREVDTF9OVUxMX0lEID0gMCwKKworICAgICAgLy8vIFxicmllZiBUaGUgdHJhbnNsYXRpb24gdW5pdC4KKyAgICAgIFBSRURFRl9ERUNMX1RSQU5TTEFUSU9OX1VOSVRfSUQgPSAxLAorCisgICAgICAvLy8gXGJyaWVmIFRoZSBPYmplY3RpdmUtQyAnaWQnIHR5cGUuCisgICAgICBQUkVERUZfREVDTF9PQkpDX0lEX0lEID0gMiwKKworICAgICAgLy8vIFxicmllZiBUaGUgT2JqZWN0aXZlLUMgJ1NFTCcgdHlwZS4KKyAgICAgIFBSRURFRl9ERUNMX09CSkNfU0VMX0lEID0gMywKKworICAgICAgLy8vIFxicmllZiBUaGUgT2JqZWN0aXZlLUMgJ0NsYXNzJyB0eXBlLgorICAgICAgUFJFREVGX0RFQ0xfT0JKQ19DTEFTU19JRCA9IDQsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIE9iamVjdGl2ZS1DICdQcm90b2NvbCcgdHlwZS4KKyAgICAgIFBSRURFRl9ERUNMX09CSkNfUFJPVE9DT0xfSUQgPSA1LAorCisgICAgICAvLy8gXGJyaWVmIFRoZSBzaWduZWQgMTI4LWJpdCBpbnRlZ2VyIHR5cGUuCisgICAgICBQUkVERUZfREVDTF9JTlRfMTI4X0lEID0gNiwKKworICAgICAgLy8vIFxicmllZiBUaGUgdW5zaWduZWQgMTI4LWJpdCBpbnRlZ2VyIHR5cGUuCisgICAgICBQUkVERUZfREVDTF9VTlNJR05FRF9JTlRfMTI4X0lEID0gNywKKworICAgICAgLy8vIFxicmllZiBUaGUgaW50ZXJuYWwgJ2luc3RhbmNldHlwZScgdHlwZWRlZi4KKyAgICAgIFBSRURFRl9ERUNMX09CSkNfSU5TVEFOQ0VUWVBFX0lEID0gOCwKKworICAgICAgLy8vIFxicmllZiBUaGUgaW50ZXJuYWwgJ19fYnVpbHRpbl92YV9saXN0JyB0eXBlZGVmLgorICAgICAgUFJFREVGX0RFQ0xfQlVJTFRJTl9WQV9MSVNUX0lEID0gOSwKKworICAgICAgLy8vIFxicmllZiBUaGUgaW50ZXJuYWwgJ19fdmFfbGlzdF90YWcnIHN0cnVjdCwgaWYgYW55LgorICAgICAgUFJFREVGX0RFQ0xfVkFfTElTVF9UQUcgPSAxMCwKKworICAgICAgLy8vIFxicmllZiBUaGUgaW50ZXJuYWwgJ19fYnVpbHRpbl9tc192YV9saXN0JyB0eXBlZGVmLgorICAgICAgUFJFREVGX0RFQ0xfQlVJTFRJTl9NU19WQV9MSVNUX0lEID0gMTEsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIGV4dGVybiAiQyIgY29udGV4dC4KKyAgICAgIFBSRURFRl9ERUNMX0VYVEVSTl9DX0NPTlRFWFRfSUQgPSAxMiwKKworICAgICAgLy8vIFxicmllZiBUaGUgaW50ZXJuYWwgJ19fbWFrZV9pbnRlZ2VyX3NlcScgdGVtcGxhdGUuCisgICAgICBQUkVERUZfREVDTF9NQUtFX0lOVEVHRVJfU0VRX0lEID0gMTMsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIGludGVybmFsICdfX05TQ29uc3RhbnRTdHJpbmcnIHR5cGVkZWYuCisgICAgICBQUkVERUZfREVDTF9DRl9DT05TVEFOVF9TVFJJTkdfSUQgPSAxNCwKKworICAgICAgLy8vIFxicmllZiBUaGUgaW50ZXJuYWwgJ19fTlNDb25zdGFudFN0cmluZycgdGFnIHR5cGUuCisgICAgICBQUkVERUZfREVDTF9DRl9DT05TVEFOVF9TVFJJTkdfVEFHX0lEID0gMTUsCisKKyAgICAgIC8vLyBcYnJpZWYgVGhlIGludGVybmFsICdfX3R5cGVfcGFja19lbGVtZW50JyB0ZW1wbGF0ZS4KKyAgICAgIFBSRURFRl9ERUNMX1RZUEVfUEFDS19FTEVNRU5UX0lEID0gMTYsCisgICAgfTsKKworICAgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBkZWNsYXJhdGlvbiBJRHMgdGhhdCBhcmUgcHJlZGVmaW5lZC4KKyAgICAvLy8KKyAgICAvLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCBkZWNsYXJhdGlvbnMsIHNlZSB0aGUKKyAgICAvLy8gXGMgUHJlZGVmaW5lZERlY2xJRHMgdHlwZSBhbmQgdGhlIFBSRURFRl9ERUNMXypfSUQgY29uc3RhbnRzLgorICAgIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fUFJFREVGX0RFQ0xfSURTID0gMTc7CisKKyAgICAvLy8gXGJyaWVmIFJlY29yZCBvZiB1cGRhdGVzIGZvciBhIGRlY2xhcmF0aW9uIHRoYXQgd2FzIG1vZGlmaWVkIGFmdGVyCisgICAgLy8vIGJlaW5nIGRlc2VyaWFsaXplZC4gVGhpcyBjYW4gb2NjdXIgd2l0aGluIERFQ0xUWVBFU19CTE9DS19JRC4KKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgREVDTF9VUERBVEVTID0gNDk7CisKKyAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlIGZvciBhIGxpc3Qgb2YgbG9jYWwgcmVkZWNsYXJhdGlvbnMgb2YgYSBkZWNsYXJhdGlvbi4KKyAgICAvLy8gVGhpcyBjYW4gb2NjdXIgd2l0aGluIERFQ0xUWVBFU19CTE9DS19JRC4KKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgTE9DQUxfUkVERUNMQVJBVElPTlMgPSA1MDsKKyAgICAKKyAgICAvLy8gXGJyaWVmIFJlY29yZCBjb2RlcyBmb3IgZWFjaCBraW5kIG9mIGRlY2xhcmF0aW9uLgorICAgIC8vLworICAgIC8vLyBUaGVzZSBjb25zdGFudHMgZGVzY3JpYmUgdGhlIGRlY2xhcmF0aW9uIHJlY29yZHMgdGhhdCBjYW4gb2NjdXIgd2l0aGluCisgICAgLy8vIGEgZGVjbGFyYXRpb25zIGJsb2NrIChpZGVudGlmaWVkIGJ5IERFQ0xUWVBFU19CTE9DS19JRCkuIEVhY2gKKyAgICAvLy8gY29uc3RhbnQgZGVzY3JpYmVzIGEgcmVjb3JkIGZvciBhIHNwZWNpZmljIGRlY2xhcmF0aW9uIGNsYXNzCisgICAgLy8vIGluIHRoZSBBU1QuIE5vdGUgdGhhdCBUeXBlQ29kZSB2YWx1ZXMgc2hhcmUgdGhpcyBjb2RlIHNwYWNlLgorICAgIGVudW0gRGVjbENvZGUgeworICAgICAgLy8vIFxicmllZiBBIFR5cGVkZWZEZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfVFlQRURFRiA9IDUxLAorICAgICAgLy8vIFxicmllZiBBIFR5cGVBbGlhc0RlY2wgcmVjb3JkLgorCisgICAgICBERUNMX1RZUEVBTElBUywKKworICAgICAgLy8vIFxicmllZiBBbiBFbnVtRGVjbCByZWNvcmQuCisgICAgICBERUNMX0VOVU0sCisKKyAgICAgIC8vLyBcYnJpZWYgQSBSZWNvcmREZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfUkVDT1JELAorCisgICAgICAvLy8gXGJyaWVmIEFuIEVudW1Db25zdGFudERlY2wgcmVjb3JkLgorICAgICAgREVDTF9FTlVNX0NPTlNUQU5ULAorCisgICAgICAvLy8gXGJyaWVmIEEgRnVuY3Rpb25EZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfRlVOQ1RJT04sCisKKyAgICAgIC8vLyBcYnJpZWYgQSBPYmpDTWV0aG9kRGVjbCByZWNvcmQuCisgICAgICBERUNMX09CSkNfTUVUSE9ELAorCisgICAgICAvLy8gXGJyaWVmIEEgT2JqQ0ludGVyZmFjZURlY2wgcmVjb3JkLgorICAgICAgREVDTF9PQkpDX0lOVEVSRkFDRSwKKworICAgICAgLy8vIFxicmllZiBBIE9iakNQcm90b2NvbERlY2wgcmVjb3JkLgorICAgICAgREVDTF9PQkpDX1BST1RPQ09MLAorCisgICAgICAvLy8gXGJyaWVmIEEgT2JqQ0l2YXJEZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfT0JKQ19JVkFSLAorCisgICAgICAvLy8gXGJyaWVmIEEgT2JqQ0F0RGVmc0ZpZWxkRGVjbCByZWNvcmQuCisgICAgICBERUNMX09CSkNfQVRfREVGU19GSUVMRCwKKworICAgICAgLy8vIFxicmllZiBBIE9iakNDYXRlZ29yeURlY2wgcmVjb3JkLgorICAgICAgREVDTF9PQkpDX0NBVEVHT1JZLAorCisgICAgICAvLy8gXGJyaWVmIEEgT2JqQ0NhdGVnb3J5SW1wbERlY2wgcmVjb3JkLgorICAgICAgREVDTF9PQkpDX0NBVEVHT1JZX0lNUEwsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBPYmpDSW1wbGVtZW50YXRpb25EZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfT0JKQ19JTVBMRU1FTlRBVElPTiwKKworICAgICAgLy8vIFxicmllZiBBIE9iakNDb21wYXRpYmxlQWxpYXNEZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfT0JKQ19DT01QQVRJQkxFX0FMSUFTLAorCisgICAgICAvLy8gXGJyaWVmIEEgT2JqQ1Byb3BlcnR5RGVjbCByZWNvcmQuCisgICAgICBERUNMX09CSkNfUFJPUEVSVFksCisKKyAgICAgIC8vLyBcYnJpZWYgQSBPYmpDUHJvcGVydHlJbXBsRGVjbCByZWNvcmQuCisgICAgICBERUNMX09CSkNfUFJPUEVSVFlfSU1QTCwKKworICAgICAgLy8vIFxicmllZiBBIEZpZWxkRGVjbCByZWNvcmQuCisgICAgICBERUNMX0ZJRUxELAorCisgICAgICAvLy8gXGJyaWVmIEEgTVNQcm9wZXJ0eURlY2wgcmVjb3JkLgorICAgICAgREVDTF9NU19QUk9QRVJUWSwKKworICAgICAgLy8vIFxicmllZiBBIFZhckRlY2wgcmVjb3JkLgorICAgICAgREVDTF9WQVIsCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gSW1wbGljaXRQYXJhbURlY2wgcmVjb3JkLgorICAgICAgREVDTF9JTVBMSUNJVF9QQVJBTSwKKworICAgICAgLy8vIFxicmllZiBBIFBhcm1WYXJEZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfUEFSTV9WQVIsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBEZWNvbXBvc2l0aW9uRGVjbCByZWNvcmQuCisgICAgICBERUNMX0RFQ09NUE9TSVRJT04sCisKKyAgICAgIC8vLyBcYnJpZWYgQSBCaW5kaW5nRGVjbCByZWNvcmQuCisgICAgICBERUNMX0JJTkRJTkcsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBGaWxlU2NvcGVBc21EZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfRklMRV9TQ09QRV9BU00sCisKKyAgICAgIC8vLyBcYnJpZWYgQSBCbG9ja0RlY2wgcmVjb3JkLgorICAgICAgREVDTF9CTE9DSywKKworICAgICAgLy8vIFxicmllZiBBIENhcHR1cmVkRGVjbCByZWNvcmQuCisgICAgICBERUNMX0NBUFRVUkVELAorCisgICAgICAvLy8gXGJyaWVmIEEgcmVjb3JkIHRoYXQgc3RvcmVzIHRoZSBzZXQgb2YgZGVjbGFyYXRpb25zIHRoYXQgYXJlCisgICAgICAvLy8gbGV4aWNhbGx5IHN0b3JlZCB3aXRoaW4gYSBnaXZlbiBEZWNsQ29udGV4dC4KKyAgICAgIC8vLworICAgICAgLy8vIFRoZSByZWNvcmQgaXRzZWxmIGlzIGEgYmxvYiB0aGF0IGlzIGFuIGFycmF5IG9mIGRlY2xhcmF0aW9uIElEcywKKyAgICAgIC8vLyBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhvc2UgZGVjbGFyYXRpb25zIHdlcmUgYWRkZWQgdG8gdGhlCisgICAgICAvLy8gZGVjbGFyYXRpb24gY29udGV4dC4gVGhpcyBkYXRhIGlzIHVzZWQgd2hlbiBpdGVyYXRpbmcgb3ZlcgorICAgICAgLy8vIHRoZSBjb250ZW50cyBvZiBhIERlY2xDb250ZXh0LCBlLmcuLCB2aWEKKyAgICAgIC8vLyBEZWNsQ29udGV4dDo6ZGVjbHNfYmVnaW4oKSBhbmQgRGVjbENvbnRleHQ6OmRlY2xzX2VuZCgpLgorICAgICAgREVDTF9DT05URVhUX0xFWElDQUwsCisKKyAgICAgIC8vLyBcYnJpZWYgQSByZWNvcmQgdGhhdCBzdG9yZXMgdGhlIHNldCBvZiBkZWNsYXJhdGlvbnMgdGhhdCBhcmUKKyAgICAgIC8vLyB2aXNpYmxlIGZyb20gYSBnaXZlbiBEZWNsQ29udGV4dC4KKyAgICAgIC8vLworICAgICAgLy8vIFRoZSByZWNvcmQgaXRzZWxmIHN0b3JlcyBhIHNldCBvZiBtYXBwaW5ncywgZWFjaCBvZiB3aGljaAorICAgICAgLy8vIGFzc29jaWF0ZXMgYSBkZWNsYXJhdGlvbiBuYW1lIHdpdGggb25lIG9yIG1vcmUgZGVjbGFyYXRpb24KKyAgICAgIC8vLyBJRHMuIFRoaXMgZGF0YSBpcyB1c2VkIHdoZW4gcGVyZm9ybWluZyBxdWFsaWZpZWQgbmFtZSBsb29rdXAKKyAgICAgIC8vLyBpbnRvIGEgRGVjbENvbnRleHQgdmlhIERlY2xDb250ZXh0Ojpsb29rdXAuCisgICAgICBERUNMX0NPTlRFWFRfVklTSUJMRSwKKworICAgICAgLy8vIFxicmllZiBBIExhYmVsRGVjbCByZWNvcmQuCisgICAgICBERUNMX0xBQkVMLAorCisgICAgICAvLy8gXGJyaWVmIEEgTmFtZXNwYWNlRGVjbCByZWNvcmQuCisgICAgICBERUNMX05BTUVTUEFDRSwKKworICAgICAgLy8vIFxicmllZiBBIE5hbWVzcGFjZUFsaWFzRGVjbCByZWNvcmQuCisgICAgICBERUNMX05BTUVTUEFDRV9BTElBUywKKworICAgICAgLy8vIFxicmllZiBBIFVzaW5nRGVjbCByZWNvcmQuCisgICAgICBERUNMX1VTSU5HLAorCisgICAgICAvLy8gXGJyaWVmIEEgVXNpbmdQYWNrRGVjbCByZWNvcmQuCisgICAgICBERUNMX1VTSU5HX1BBQ0ssCisKKyAgICAgIC8vLyBcYnJpZWYgQSBVc2luZ1NoYWRvd0RlY2wgcmVjb3JkLgorICAgICAgREVDTF9VU0lOR19TSEFET1csCisKKyAgICAgIC8vLyBcYnJpZWYgQSBDb25zdHJ1Y3RvclVzaW5nU2hhZG93RGVjbCByZWNvcmQuCisgICAgICBERUNMX0NPTlNUUlVDVE9SX1VTSU5HX1NIQURPVywKKworICAgICAgLy8vIFxicmllZiBBIFVzaW5nRGlyZWNpdHZlRGVjbCByZWNvcmQuCisgICAgICBERUNMX1VTSU5HX0RJUkVDVElWRSwKKworICAgICAgLy8vIFxicmllZiBBbiBVbnJlc29sdmVkVXNpbmdWYWx1ZURlY2wgcmVjb3JkLgorICAgICAgREVDTF9VTlJFU09MVkVEX1VTSU5HX1ZBTFVFLAorCisgICAgICAvLy8gXGJyaWVmIEFuIFVucmVzb2x2ZWRVc2luZ1R5cGVuYW1lRGVjbCByZWNvcmQuCisgICAgICBERUNMX1VOUkVTT0xWRURfVVNJTkdfVFlQRU5BTUUsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBMaW5rYWdlU3BlY0RlY2wgcmVjb3JkLgorICAgICAgREVDTF9MSU5LQUdFX1NQRUMsCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gRXhwb3J0RGVjbCByZWNvcmQuCisgICAgICBERUNMX0VYUE9SVCwKKworICAgICAgLy8vIFxicmllZiBBIENYWFJlY29yZERlY2wgcmVjb3JkLgorICAgICAgREVDTF9DWFhfUkVDT1JELAorCisgICAgICAvLy8gXGJyaWVmIEEgQ1hYRGVkdWN0aW9uR3VpZGVEZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfQ1hYX0RFRFVDVElPTl9HVUlERSwKKworICAgICAgLy8vIFxicmllZiBBIENYWE1ldGhvZERlY2wgcmVjb3JkLgorICAgICAgREVDTF9DWFhfTUVUSE9ELAorCisgICAgICAvLy8gXGJyaWVmIEEgQ1hYQ29uc3RydWN0b3JEZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfQ1hYX0NPTlNUUlVDVE9SLAorCisgICAgICAvLy8gXGJyaWVmIEEgQ1hYQ29uc3RydWN0b3JEZWNsIHJlY29yZCBmb3IgYW4gaW5oZXJpdGVkIGNvbnN0cnVjdG9yLgorICAgICAgREVDTF9DWFhfSU5IRVJJVEVEX0NPTlNUUlVDVE9SLAorCisgICAgICAvLy8gXGJyaWVmIEEgQ1hYRGVzdHJ1Y3RvckRlY2wgcmVjb3JkLgorICAgICAgREVDTF9DWFhfREVTVFJVQ1RPUiwKKworICAgICAgLy8vIFxicmllZiBBIENYWENvbnZlcnNpb25EZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfQ1hYX0NPTlZFUlNJT04sCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gQWNjZXNzU3BlY0RlY2wgcmVjb3JkLgorICAgICAgREVDTF9BQ0NFU1NfU1BFQywKKworICAgICAgLy8vIFxicmllZiBBIEZyaWVuZERlY2wgcmVjb3JkLgorICAgICAgREVDTF9GUklFTkQsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBGcmllbmRUZW1wbGF0ZURlY2wgcmVjb3JkLgorICAgICAgREVDTF9GUklFTkRfVEVNUExBVEUsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBDbGFzc1RlbXBsYXRlRGVjbCByZWNvcmQuCisgICAgICBERUNMX0NMQVNTX1RFTVBMQVRFLAorCisgICAgICAvLy8gXGJyaWVmIEEgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCByZWNvcmQuCisgICAgICBERUNMX0NMQVNTX1RFTVBMQVRFX1NQRUNJQUxJWkFUSU9OLAorCisgICAgICAvLy8gXGJyaWVmIEEgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgcmVjb3JkLgorICAgICAgREVDTF9DTEFTU19URU1QTEFURV9QQVJUSUFMX1NQRUNJQUxJWkFUSU9OLAorCisgICAgICAvLy8gXGJyaWVmIEEgVmFyVGVtcGxhdGVEZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfVkFSX1RFTVBMQVRFLAorCisgICAgICAvLy8gXGJyaWVmIEEgVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgcmVjb3JkLgorICAgICAgREVDTF9WQVJfVEVNUExBVEVfU1BFQ0lBTElaQVRJT04sCisKKyAgICAgIC8vLyBcYnJpZWYgQSBWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgcmVjb3JkLgorICAgICAgREVDTF9WQVJfVEVNUExBVEVfUEFSVElBTF9TUEVDSUFMSVpBVElPTiwKKworICAgICAgLy8vIFxicmllZiBBIEZ1bmN0aW9uVGVtcGxhdGVEZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfRlVOQ1RJT05fVEVNUExBVEUsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBUZW1wbGF0ZVR5cGVQYXJtRGVjbCByZWNvcmQuCisgICAgICBERUNMX1RFTVBMQVRFX1RZUEVfUEFSTSwKKworICAgICAgLy8vIFxicmllZiBBIE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfTk9OX1RZUEVfVEVNUExBVEVfUEFSTSwKKworICAgICAgLy8vIFxicmllZiBBIFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCByZWNvcmQuCisgICAgICBERUNMX1RFTVBMQVRFX1RFTVBMQVRFX1BBUk0sCisKKyAgICAgIC8vLyBcYnJpZWYgQSBUeXBlQWxpYXNUZW1wbGF0ZURlY2wgcmVjb3JkLgorICAgICAgREVDTF9UWVBFX0FMSUFTX1RFTVBMQVRFLAorCisgICAgICAvLy8gXGJyaWVmIEEgU3RhdGljQXNzZXJ0RGVjbCByZWNvcmQuCisgICAgICBERUNMX1NUQVRJQ19BU1NFUlQsCisKKyAgICAgIC8vLyBcYnJpZWYgQSByZWNvcmQgY29udGFpbmluZyBDWFhCYXNlU3BlY2lmaWVycy4KKyAgICAgIERFQ0xfQ1hYX0JBU0VfU1BFQ0lGSUVSUywKKworICAgICAgLy8vIFxicmllZiBBIHJlY29yZCBjb250YWluaW5nIENYWEN0b3JJbml0aWFsaXplcnMuCisgICAgICBERUNMX0NYWF9DVE9SX0lOSVRJQUxJWkVSUywKKworICAgICAgLy8vIFxicmllZiBBIEluZGlyZWN0RmllbGREZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfSU5ESVJFQ1RGSUVMRCwKKworICAgICAgLy8vIFxicmllZiBBIE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsIHJlY29yZCB0aGF0IHN0b3JlcyBhbiBleHBhbmRlZAorICAgICAgLy8vIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlciBwYWNrLgorICAgICAgREVDTF9FWFBBTkRFRF9OT05fVFlQRV9URU1QTEFURV9QQVJNX1BBQ0ssCisKKyAgICAgIC8vLyBcYnJpZWYgQSBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2wgcmVjb3JkIHRoYXQgc3RvcmVzIGFuIGV4cGFuZGVkCisgICAgICAvLy8gdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyIHBhY2suCisgICAgICBERUNMX0VYUEFOREVEX1RFTVBMQVRFX1RFTVBMQVRFX1BBUk1fUEFDSywKKworICAgICAgLy8vIFxicmllZiBBIENsYXNzU2NvcGVGdW5jdGlvblNwZWNpYWxpemF0aW9uRGVjbCByZWNvcmQgYSBjbGFzcyBzY29wZQorICAgICAgLy8vIGZ1bmN0aW9uIHNwZWNpYWxpemF0aW9uLiAoTWljcm9zb2Z0IGV4dGVuc2lvbikuCisgICAgICBERUNMX0NMQVNTX1NDT1BFX0ZVTkNUSU9OX1NQRUNJQUxJWkFUSU9OLAorCisgICAgICAvLy8gXGJyaWVmIEFuIEltcG9ydERlY2wgcmVjb3JkaW5nIGEgbW9kdWxlIGltcG9ydC4KKyAgICAgIERFQ0xfSU1QT1JULAorCisgICAgICAvLy8gXGJyaWVmIEFuIE9NUFRocmVhZFByaXZhdGVEZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfT01QX1RIUkVBRFBSSVZBVEUsCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gRW1wdHlEZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfRU1QVFksCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gT2JqQ1R5cGVQYXJhbURlY2wgcmVjb3JkLgorICAgICAgREVDTF9PQkpDX1RZUEVfUEFSQU0sCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gT01QQ2FwdHVyZWRFeHByRGVjbCByZWNvcmQuCisgICAgICBERUNMX09NUF9DQVBUVVJFREVYUFIsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBQcmFnbWFDb21tZW50RGVjbCByZWNvcmQuCisgICAgICBERUNMX1BSQUdNQV9DT01NRU5ULAorCisgICAgICAvLy8gXGJyaWVmIEEgUHJhZ21hRGV0ZWN0TWlzbWF0Y2hEZWNsIHJlY29yZC4KKyAgICAgIERFQ0xfUFJBR01BX0RFVEVDVF9NSVNNQVRDSCwKKworICAgICAgLy8vIFxicmllZiBBbiBPTVBEZWNsYXJlUmVkdWN0aW9uRGVjbCByZWNvcmQuCisgICAgICBERUNMX09NUF9ERUNMQVJFX1JFRFVDVElPTiwKKyAgICB9OworCisgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZXMgZm9yIGVhY2gga2luZCBvZiBzdGF0ZW1lbnQgb3IgZXhwcmVzc2lvbi4KKyAgICAvLy8KKyAgICAvLy8gVGhlc2UgY29uc3RhbnRzIGRlc2NyaWJlIHRoZSByZWNvcmRzIHRoYXQgZGVzY3JpYmUgc3RhdGVtZW50cworICAgIC8vLyBvciBleHByZXNzaW9ucy4gVGhlc2UgcmVjb3JkcyAgb2NjdXIgd2l0aGluIHR5cGUgYW5kIGRlY2xhcmF0aW9ucworICAgIC8vLyBibG9jaywgc28gdGhleSBiZWdpbiB3aXRoIHJlY29yZCB2YWx1ZXMgb2YgMTI4LiAgRWFjaCBjb25zdGFudCAKKyAgICAvLy8gZGVzY3JpYmVzIGEgcmVjb3JkIGZvciBhIHNwZWNpZmljIHN0YXRlbWVudCBvciBleHByZXNzaW9uIGNsYXNzIGluIHRoZQorICAgIC8vLyBBU1QuCisgICAgZW51bSBTdG10Q29kZSB7CisgICAgICAvLy8gXGJyaWVmIEEgbWFya2VyIHJlY29yZCB0aGF0IGluZGljYXRlcyB0aGF0IHdlIGFyZSBhdCB0aGUgZW5kCisgICAgICAvLy8gb2YgYW4gZXhwcmVzc2lvbi4KKyAgICAgIFNUTVRfU1RPUCA9IDEyOCwKKworICAgICAgLy8vIFxicmllZiBBIE5VTEwgZXhwcmVzc2lvbi4KKyAgICAgIFNUTVRfTlVMTF9QVFIsCisKKyAgICAgIC8vLyBcYnJpZWYgQSByZWZlcmVuY2UgdG8gYSBwcmV2aW91c2x5IFtkZV1zZXJpYWxpemVkIFN0bXQgcmVjb3JkLgorICAgICAgU1RNVF9SRUZfUFRSLAorCisgICAgICAvLy8gXGJyaWVmIEEgTnVsbFN0bXQgcmVjb3JkLgorICAgICAgU1RNVF9OVUxMLAorCisgICAgICAvLy8gXGJyaWVmIEEgQ29tcG91bmRTdG10IHJlY29yZC4KKyAgICAgIFNUTVRfQ09NUE9VTkQsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBDYXNlU3RtdCByZWNvcmQuCisgICAgICBTVE1UX0NBU0UsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBEZWZhdWx0U3RtdCByZWNvcmQuCisgICAgICBTVE1UX0RFRkFVTFQsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBMYWJlbFN0bXQgcmVjb3JkLgorICAgICAgU1RNVF9MQUJFTCwKKworICAgICAgLy8vIFxicmllZiBBbiBBdHRyaWJ1dGVkU3RtdCByZWNvcmQuCisgICAgICBTVE1UX0FUVFJJQlVURUQsCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gSWZTdG10IHJlY29yZC4KKyAgICAgIFNUTVRfSUYsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBTd2l0Y2hTdG10IHJlY29yZC4KKyAgICAgIFNUTVRfU1dJVENILAorCisgICAgICAvLy8gXGJyaWVmIEEgV2hpbGVTdG10IHJlY29yZC4KKyAgICAgIFNUTVRfV0hJTEUsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBEb1N0bXQgcmVjb3JkLgorICAgICAgU1RNVF9ETywKKworICAgICAgLy8vIFxicmllZiBBIEZvclN0bXQgcmVjb3JkLgorICAgICAgU1RNVF9GT1IsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBHb3RvU3RtdCByZWNvcmQuCisgICAgICBTVE1UX0dPVE8sCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gSW5kaXJlY3RHb3RvU3RtdCByZWNvcmQuCisgICAgICBTVE1UX0lORElSRUNUX0dPVE8sCisKKyAgICAgIC8vLyBcYnJpZWYgQSBDb250aW51ZVN0bXQgcmVjb3JkLgorICAgICAgU1RNVF9DT05USU5VRSwKKworICAgICAgLy8vIFxicmllZiBBIEJyZWFrU3RtdCByZWNvcmQuCisgICAgICBTVE1UX0JSRUFLLAorCisgICAgICAvLy8gXGJyaWVmIEEgUmV0dXJuU3RtdCByZWNvcmQuCisgICAgICBTVE1UX1JFVFVSTiwKKworICAgICAgLy8vIFxicmllZiBBIERlY2xTdG10IHJlY29yZC4KKyAgICAgIFNUTVRfREVDTCwKKworICAgICAgLy8vIFxicmllZiBBIENhcHR1cmVkU3RtdCByZWNvcmQuCisgICAgICBTVE1UX0NBUFRVUkVELAorCisgICAgICAvLy8gXGJyaWVmIEEgR0NDLXN0eWxlIEFzbVN0bXQgcmVjb3JkLgorICAgICAgU1RNVF9HQ0NBU00sCisKKyAgICAgIC8vLyBcYnJpZWYgQSBNUy1zdHlsZSBBc21TdG10IHJlY29yZC4KKyAgICAgIFNUTVRfTVNBU00sCisKKyAgICAgIC8vLyBcYnJpZWYgQSBQcmVkZWZpbmVkRXhwciByZWNvcmQuCisgICAgICBFWFBSX1BSRURFRklORUQsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBEZWNsUmVmRXhwciByZWNvcmQuCisgICAgICBFWFBSX0RFQ0xfUkVGLAorCisgICAgICAvLy8gXGJyaWVmIEFuIEludGVnZXJMaXRlcmFsIHJlY29yZC4KKyAgICAgIEVYUFJfSU5URUdFUl9MSVRFUkFMLAorCisgICAgICAvLy8gXGJyaWVmIEEgRmxvYXRpbmdMaXRlcmFsIHJlY29yZC4KKyAgICAgIEVYUFJfRkxPQVRJTkdfTElURVJBTCwKKworICAgICAgLy8vIFxicmllZiBBbiBJbWFnaW5hcnlMaXRlcmFsIHJlY29yZC4KKyAgICAgIEVYUFJfSU1BR0lOQVJZX0xJVEVSQUwsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBTdHJpbmdMaXRlcmFsIHJlY29yZC4KKyAgICAgIEVYUFJfU1RSSU5HX0xJVEVSQUwsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBDaGFyYWN0ZXJMaXRlcmFsIHJlY29yZC4KKyAgICAgIEVYUFJfQ0hBUkFDVEVSX0xJVEVSQUwsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBQYXJlbkV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9QQVJFTiwKKworICAgICAgLy8vIFxicmllZiBBIFBhcmVuTGlzdEV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9QQVJFTl9MSVNULAorCisgICAgICAvLy8gXGJyaWVmIEEgVW5hcnlPcGVyYXRvciByZWNvcmQuCisgICAgICBFWFBSX1VOQVJZX09QRVJBVE9SLAorCisgICAgICAvLy8gXGJyaWVmIEFuIE9mZnNldE9mRXhwciByZWNvcmQuCisgICAgICBFWFBSX09GRlNFVE9GLAorCisgICAgICAvLy8gXGJyaWVmIEEgU2l6ZWZBbGlnbk9mRXhwciByZWNvcmQuCisgICAgICBFWFBSX1NJWkVPRl9BTElHTl9PRiwKKworICAgICAgLy8vIFxicmllZiBBbiBBcnJheVN1YnNjcmlwdEV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9BUlJBWV9TVUJTQ1JJUFQsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBDYWxsRXhwciByZWNvcmQuCisgICAgICBFWFBSX0NBTEwsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBNZW1iZXJFeHByIHJlY29yZC4KKyAgICAgIEVYUFJfTUVNQkVSLAorCisgICAgICAvLy8gXGJyaWVmIEEgQmluYXJ5T3BlcmF0b3IgcmVjb3JkLgorICAgICAgRVhQUl9CSU5BUllfT1BFUkFUT1IsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBDb21wb3VuZEFzc2lnbk9wZXJhdG9yIHJlY29yZC4KKyAgICAgIEVYUFJfQ09NUE9VTkRfQVNTSUdOX09QRVJBVE9SLAorCisgICAgICAvLy8gXGJyaWVmIEEgQ29uZGl0aW9uT3BlcmF0b3IgcmVjb3JkLgorICAgICAgRVhQUl9DT05ESVRJT05BTF9PUEVSQVRPUiwKKworICAgICAgLy8vIFxicmllZiBBbiBJbXBsaWNpdENhc3RFeHByIHJlY29yZC4KKyAgICAgIEVYUFJfSU1QTElDSVRfQ0FTVCwKKworICAgICAgLy8vIFxicmllZiBBIENTdHlsZUNhc3RFeHByIHJlY29yZC4KKyAgICAgIEVYUFJfQ1NUWUxFX0NBU1QsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBDb21wb3VuZExpdGVyYWxFeHByIHJlY29yZC4KKyAgICAgIEVYUFJfQ09NUE9VTkRfTElURVJBTCwKKworICAgICAgLy8vIFxicmllZiBBbiBFeHRWZWN0b3JFbGVtZW50RXhwciByZWNvcmQuCisgICAgICBFWFBSX0VYVF9WRUNUT1JfRUxFTUVOVCwKKworICAgICAgLy8vIFxicmllZiBBbiBJbml0TGlzdEV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9JTklUX0xJU1QsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBEZXNpZ25hdGVkSW5pdEV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9ERVNJR05BVEVEX0lOSVQsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBEZXNpZ25hdGVkSW5pdFVwZGF0ZUV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9ERVNJR05BVEVEX0lOSVRfVVBEQVRFLAorCisgICAgICAvLy8gXGJyaWVmIEFuIE5vSW5pdEV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9OT19JTklULAorCisgICAgICAvLy8gXGJyaWVmIEFuIEFycmF5SW5pdExvb3BFeHByIHJlY29yZC4KKyAgICAgIEVYUFJfQVJSQVlfSU5JVF9MT09QLAorCisgICAgICAvLy8gXGJyaWVmIEFuIEFycmF5SW5pdEluZGV4RXhwciByZWNvcmQuCisgICAgICBFWFBSX0FSUkFZX0lOSVRfSU5ERVgsCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gSW1wbGljaXRWYWx1ZUluaXRFeHByIHJlY29yZC4KKyAgICAgIEVYUFJfSU1QTElDSVRfVkFMVUVfSU5JVCwKKworICAgICAgLy8vIFxicmllZiBBIFZBQXJnRXhwciByZWNvcmQuCisgICAgICBFWFBSX1ZBX0FSRywKKworICAgICAgLy8vIFxicmllZiBBbiBBZGRyTGFiZWxFeHByIHJlY29yZC4KKyAgICAgIEVYUFJfQUREUl9MQUJFTCwKKworICAgICAgLy8vIFxicmllZiBBIFN0bXRFeHByIHJlY29yZC4KKyAgICAgIEVYUFJfU1RNVCwKKworICAgICAgLy8vIFxicmllZiBBIENob29zZUV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9DSE9PU0UsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBHTlVOdWxsRXhwciByZWNvcmQuCisgICAgICBFWFBSX0dOVV9OVUxMLAorCisgICAgICAvLy8gXGJyaWVmIEEgU2h1ZmZsZVZlY3RvckV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9TSFVGRkxFX1ZFQ1RPUiwKKworICAgICAgLy8vIFxicmllZiBBIENvbnZlcnRWZWN0b3JFeHByIHJlY29yZC4KKyAgICAgIEVYUFJfQ09OVkVSVF9WRUNUT1IsCisKKyAgICAgIC8vLyBcYnJpZWYgQmxvY2tFeHByCisgICAgICBFWFBSX0JMT0NLLAorCisgICAgICAvLy8gXGJyaWVmIEEgR2VuZXJpY1NlbGVjdGlvbkV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9HRU5FUklDX1NFTEVDVElPTiwKKworICAgICAgLy8vIFxicmllZiBBIFBzZXVkb09iamVjdEV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9QU0VVRE9fT0JKRUNULAorCisgICAgICAvLy8gXGJyaWVmIEFuIEF0b21pY0V4cHIgcmVjb3JkLgorICAgICAgRVhQUl9BVE9NSUMsCisKKyAgICAgIC8vIE9iamVjdGl2ZS1DCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gT2JqQ1N0cmluZ0xpdGVyYWwgcmVjb3JkLgorICAgICAgRVhQUl9PQkpDX1NUUklOR19MSVRFUkFMLAorCisgICAgICBFWFBSX09CSkNfQk9YRURfRVhQUkVTU0lPTiwKKyAgICAgIEVYUFJfT0JKQ19BUlJBWV9MSVRFUkFMLAorICAgICAgRVhQUl9PQkpDX0RJQ1RJT05BUllfTElURVJBTCwKKyAgIAorICAgICAgLy8vIFxicmllZiBBbiBPYmpDRW5jb2RlRXhwciByZWNvcmQuCisgICAgICBFWFBSX09CSkNfRU5DT0RFLAorCisgICAgICAvLy8gXGJyaWVmIEFuIE9iakNTZWxlY3RvckV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9PQkpDX1NFTEVDVE9SX0VYUFIsCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gT2JqQ1Byb3RvY29sRXhwciByZWNvcmQuCisgICAgICBFWFBSX09CSkNfUFJPVE9DT0xfRVhQUiwKKworICAgICAgLy8vIFxicmllZiBBbiBPYmpDSXZhclJlZkV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9PQkpDX0lWQVJfUkVGX0VYUFIsCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gT2JqQ1Byb3BlcnR5UmVmRXhwciByZWNvcmQuCisgICAgICBFWFBSX09CSkNfUFJPUEVSVFlfUkVGX0VYUFIsCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gT2JqQ1N1YnNjcmlwdFJlZkV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9PQkpDX1NVQlNDUklQVF9SRUZfRVhQUiwKKworICAgICAgLy8vIFxicmllZiBVTlVTRUQKKyAgICAgIEVYUFJfT0JKQ19LVkNfUkVGX0VYUFIsCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gT2JqQ01lc3NhZ2VFeHByIHJlY29yZC4KKyAgICAgIEVYUFJfT0JKQ19NRVNTQUdFX0VYUFIsCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gT2JqQ0lzYSBFeHByIHJlY29yZC4KKyAgICAgIEVYUFJfT0JKQ19JU0EsCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gT2JqQ0luZGlyZWN0Q29weVJlc3RvcmVFeHByIHJlY29yZC4KKyAgICAgIEVYUFJfT0JKQ19JTkRJUkVDVF9DT1BZX1JFU1RPUkUsCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gT2JqQ0ZvckNvbGxlY3Rpb25TdG10IHJlY29yZC4KKyAgICAgIFNUTVRfT0JKQ19GT1JfQ09MTEVDVElPTiwKKworICAgICAgLy8vIFxicmllZiBBbiBPYmpDQXRDYXRjaFN0bXQgcmVjb3JkLgorICAgICAgU1RNVF9PQkpDX0NBVENILAorCisgICAgICAvLy8gXGJyaWVmIEFuIE9iakNBdEZpbmFsbHlTdG10IHJlY29yZC4KKyAgICAgIFNUTVRfT0JKQ19GSU5BTExZLAorCisgICAgICAvLy8gXGJyaWVmIEFuIE9iakNBdFRyeVN0bXQgcmVjb3JkLgorICAgICAgU1RNVF9PQkpDX0FUX1RSWSwKKworICAgICAgLy8vIFxicmllZiBBbiBPYmpDQXRTeW5jaHJvbml6ZWRTdG10IHJlY29yZC4KKyAgICAgIFNUTVRfT0JKQ19BVF9TWU5DSFJPTklaRUQsCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gT2JqQ0F0VGhyb3dTdG10IHJlY29yZC4KKyAgICAgIFNUTVRfT0JKQ19BVF9USFJPVywKKworICAgICAgLy8vIFxicmllZiBBbiBPYmpDQXV0b3JlbGVhc2VQb29sU3RtdCByZWNvcmQuCisgICAgICBTVE1UX09CSkNfQVVUT1JFTEVBU0VfUE9PTCwKKworICAgICAgLy8vIFxicmllZiBBbiBPYmpDQm9vbExpdGVyYWxFeHByIHJlY29yZC4KKyAgICAgIEVYUFJfT0JKQ19CT09MX0xJVEVSQUwsCisKKyAgICAgIC8vLyBcYnJpZWYgQW4gT2JqQ0F2YWlsYWJpbGl0eUNoZWNrRXhwciByZWNvcmQuCisgICAgICBFWFBSX09CSkNfQVZBSUxBQklMSVRZX0NIRUNLLAorCisgICAgICAvLyBDKysKKyAgICAgIAorICAgICAgLy8vIFxicmllZiBBIENYWENhdGNoU3RtdCByZWNvcmQuCisgICAgICBTVE1UX0NYWF9DQVRDSCwKKworICAgICAgLy8vIFxicmllZiBBIENYWFRyeVN0bXQgcmVjb3JkLgorICAgICAgU1RNVF9DWFhfVFJZLAorICAgICAgLy8vIFxicmllZiBBIENYWEZvclJhbmdlU3RtdCByZWNvcmQuCisKKyAgICAgIFNUTVRfQ1hYX0ZPUl9SQU5HRSwKKworICAgICAgLy8vIFxicmllZiBBIENYWE9wZXJhdG9yQ2FsbEV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9DWFhfT1BFUkFUT1JfQ0FMTCwKKworICAgICAgLy8vIFxicmllZiBBIENYWE1lbWJlckNhbGxFeHByIHJlY29yZC4KKyAgICAgIEVYUFJfQ1hYX01FTUJFUl9DQUxMLAorCisgICAgICAvLy8gXGJyaWVmIEEgQ1hYQ29uc3RydWN0RXhwciByZWNvcmQuCisgICAgICBFWFBSX0NYWF9DT05TVFJVQ1QsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBDWFhJbmhlcml0ZWRDdG9ySW5pdEV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9DWFhfSU5IRVJJVEVEX0NUT1JfSU5JVCwKKworICAgICAgLy8vIFxicmllZiBBIENYWFRlbXBvcmFyeU9iamVjdEV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9DWFhfVEVNUE9SQVJZX09CSkVDVCwKKworICAgICAgLy8vIFxicmllZiBBIENYWFN0YXRpY0Nhc3RFeHByIHJlY29yZC4KKyAgICAgIEVYUFJfQ1hYX1NUQVRJQ19DQVNULAorCisgICAgICAvLy8gXGJyaWVmIEEgQ1hYRHluYW1pY0Nhc3RFeHByIHJlY29yZC4KKyAgICAgIEVYUFJfQ1hYX0RZTkFNSUNfQ0FTVCwKKworICAgICAgLy8vIFxicmllZiBBIENYWFJlaW50ZXJwcmV0Q2FzdEV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9DWFhfUkVJTlRFUlBSRVRfQ0FTVCwKKworICAgICAgLy8vIFxicmllZiBBIENYWENvbnN0Q2FzdEV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9DWFhfQ09OU1RfQ0FTVCwKKworICAgICAgLy8vIFxicmllZiBBIENYWEZ1bmN0aW9uYWxDYXN0RXhwciByZWNvcmQuCisgICAgICBFWFBSX0NYWF9GVU5DVElPTkFMX0NBU1QsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBVc2VyRGVmaW5lZExpdGVyYWwgcmVjb3JkLgorICAgICAgRVhQUl9VU0VSX0RFRklORURfTElURVJBTCwKKworICAgICAgLy8vIFxicmllZiBBIENYWFN0ZEluaXRpYWxpemVyTGlzdEV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9DWFhfU1REX0lOSVRJQUxJWkVSX0xJU1QsCisKKyAgICAgIC8vLyBcYnJpZWYgQSBDWFhCb29sTGl0ZXJhbEV4cHIgcmVjb3JkLgorICAgICAgRVhQUl9DWFhfQk9PTF9MSVRFUkFMLAorCisgICAgICBFWFBSX0NYWF9OVUxMX1BUUl9MSVRFUkFMLCAgLy8gQ1hYTnVsbFB0ckxpdGVyYWxFeHByCisgICAgICBFWFBSX0NYWF9UWVBFSURfRVhQUiwgICAgICAgLy8gQ1hYVHlwZWlkRXhwciAob2YgZXhwcikuCisgICAgICBFWFBSX0NYWF9UWVBFSURfVFlQRSwgICAgICAgLy8gQ1hYVHlwZWlkRXhwciAob2YgdHlwZSkuCisgICAgICBFWFBSX0NYWF9USElTLCAgICAgICAgICAgICAgLy8gQ1hYVGhpc0V4cHIKKyAgICAgIEVYUFJfQ1hYX1RIUk9XLCAgICAgICAgICAgICAvLyBDWFhUaHJvd0V4cHIKKyAgICAgIEVYUFJfQ1hYX0RFRkFVTFRfQVJHLCAgICAgICAvLyBDWFhEZWZhdWx0QXJnRXhwcgorICAgICAgRVhQUl9DWFhfREVGQVVMVF9JTklULCAgICAgIC8vIENYWERlZmF1bHRJbml0RXhwcgorICAgICAgRVhQUl9DWFhfQklORF9URU1QT1JBUlksICAgIC8vIENYWEJpbmRUZW1wb3JhcnlFeHByCisKKyAgICAgIEVYUFJfQ1hYX1NDQUxBUl9WQUxVRV9JTklULCAvLyBDWFhTY2FsYXJWYWx1ZUluaXRFeHByCisgICAgICBFWFBSX0NYWF9ORVcsICAgICAgICAgICAgICAgLy8gQ1hYTmV3RXhwcgorICAgICAgRVhQUl9DWFhfREVMRVRFLCAgICAgICAgICAgIC8vIENYWERlbGV0ZUV4cHIKKyAgICAgIEVYUFJfQ1hYX1BTRVVET19ERVNUUlVDVE9SLCAvLyBDWFhQc2V1ZG9EZXN0cnVjdG9yRXhwcgorICAgICAgCisgICAgICBFWFBSX0VYUFJfV0lUSF9DTEVBTlVQUywgICAgLy8gRXhwcldpdGhDbGVhbnVwcworICAgICAgCisgICAgICBFWFBSX0NYWF9ERVBFTkRFTlRfU0NPUEVfTUVNQkVSLCAgIC8vIENYWERlcGVuZGVudFNjb3BlTWVtYmVyRXhwcgorICAgICAgRVhQUl9DWFhfREVQRU5ERU5UX1NDT1BFX0RFQ0xfUkVGLCAvLyBEZXBlbmRlbnRTY29wZURlY2xSZWZFeHByCisgICAgICBFWFBSX0NYWF9VTlJFU09MVkVEX0NPTlNUUlVDVCwgICAgIC8vIENYWFVucmVzb2x2ZWRDb25zdHJ1Y3RFeHByCisgICAgICBFWFBSX0NYWF9VTlJFU09MVkVEX01FTUJFUiwgICAgICAgIC8vIFVucmVzb2x2ZWRNZW1iZXJFeHByCisgICAgICBFWFBSX0NYWF9VTlJFU09MVkVEX0xPT0tVUCwgICAgICAgIC8vIFVucmVzb2x2ZWRMb29rdXBFeHByCisKKyAgICAgIEVYUFJfQ1hYX0VYUFJFU1NJT05fVFJBSVQsICAvLyBFeHByZXNzaW9uVHJhaXRFeHByCisgICAgICBFWFBSX0NYWF9OT0VYQ0VQVCwgICAgICAgICAgLy8gQ1hYTm9leGNlcHRFeHByCisKKyAgICAgIEVYUFJfT1BBUVVFX1ZBTFVFLCAgICAgICAgICAvLyBPcGFxdWVWYWx1ZUV4cHIKKyAgICAgIEVYUFJfQklOQVJZX0NPTkRJVElPTkFMX09QRVJBVE9SLCAgLy8gQmluYXJ5Q29uZGl0aW9uYWxPcGVyYXRvcgorICAgICAgRVhQUl9UWVBFX1RSQUlULCAgICAgICAgICAgIC8vIFR5cGVUcmFpdEV4cHIKKyAgICAgIEVYUFJfQVJSQVlfVFlQRV9UUkFJVCwgICAgICAvLyBBcnJheVR5cGVUcmFpdEludEV4cHIKKyAgICAgIAorICAgICAgRVhQUl9QQUNLX0VYUEFOU0lPTiwgICAgICAgIC8vIFBhY2tFeHBhbnNpb25FeHByCisgICAgICBFWFBSX1NJWkVPRl9QQUNLLCAgICAgICAgICAgLy8gU2l6ZU9mUGFja0V4cHIKKyAgICAgIEVYUFJfU1VCU1RfTk9OX1RZUEVfVEVNUExBVEVfUEFSTSwgLy8gU3Vic3ROb25UeXBlVGVtcGxhdGVQYXJtRXhwcgorICAgICAgRVhQUl9TVUJTVF9OT05fVFlQRV9URU1QTEFURV9QQVJNX1BBQ0ssLy8gU3Vic3ROb25UeXBlVGVtcGxhdGVQYXJtUGFja0V4cHIKKyAgICAgIEVYUFJfRlVOQ1RJT05fUEFSTV9QQUNLLCAgICAvLyBGdW5jdGlvblBhcm1QYWNrRXhwcgorICAgICAgRVhQUl9NQVRFUklBTElaRV9URU1QT1JBUlksIC8vIE1hdGVyaWFsaXplVGVtcG9yYXJ5RXhwcgorICAgICAgRVhQUl9DWFhfRk9MRCwgICAgICAgICAgICAgIC8vIENYWEZvbGRFeHByCisKKyAgICAgIC8vIENVREEKKyAgICAgIEVYUFJfQ1VEQV9LRVJORUxfQ0FMTCwgICAgICAgLy8gQ1VEQUtlcm5lbENhbGxFeHByICAgICAgCisKKyAgICAgIC8vIE9wZW5DTAorICAgICAgRVhQUl9BU1RZUEUsICAgICAgICAgICAgICAgICAvLyBBc1R5cGVFeHByCisKKyAgICAgIC8vIE1pY3Jvc29mdAorICAgICAgRVhQUl9DWFhfUFJPUEVSVFlfUkVGX0VYUFIsIC8vIE1TUHJvcGVydHlSZWZFeHByCisgICAgICBFWFBSX0NYWF9QUk9QRVJUWV9TVUJTQ1JJUFRfRVhQUiwgLy8gTVNQcm9wZXJ0eVN1YnNjcmlwdEV4cHIKKyAgICAgIEVYUFJfQ1hYX1VVSURPRl9FWFBSLCAgICAgICAvLyBDWFhVdWlkb2ZFeHByIChvZiBleHByKS4KKyAgICAgIEVYUFJfQ1hYX1VVSURPRl9UWVBFLCAgICAgICAvLyBDWFhVdWlkb2ZFeHByIChvZiB0eXBlKS4KKyAgICAgIFNUTVRfU0VIX0xFQVZFLCAgICAgICAgICAgICAvLyBTRUhMZWF2ZVN0bXQKKyAgICAgIFNUTVRfU0VIX0VYQ0VQVCwgICAgICAgICAgICAvLyBTRUhFeGNlcHRTdG10CisgICAgICBTVE1UX1NFSF9GSU5BTExZLCAgICAgICAgICAgLy8gU0VIRmluYWxseVN0bXQKKyAgICAgIFNUTVRfU0VIX1RSWSwgICAgICAgICAgICAgICAvLyBTRUhUcnlTdG10CisKKyAgICAgIC8vIE9wZW5NUCBkaXJlY3RpdmVzCisgICAgICBTVE1UX09NUF9QQVJBTExFTF9ESVJFQ1RJVkUsCisgICAgICBTVE1UX09NUF9TSU1EX0RJUkVDVElWRSwKKyAgICAgIFNUTVRfT01QX0ZPUl9ESVJFQ1RJVkUsCisgICAgICBTVE1UX09NUF9GT1JfU0lNRF9ESVJFQ1RJVkUsCisgICAgICBTVE1UX09NUF9TRUNUSU9OU19ESVJFQ1RJVkUsCisgICAgICBTVE1UX09NUF9TRUNUSU9OX0RJUkVDVElWRSwKKyAgICAgIFNUTVRfT01QX1NJTkdMRV9ESVJFQ1RJVkUsCisgICAgICBTVE1UX09NUF9NQVNURVJfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfQ1JJVElDQUxfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfUEFSQUxMRUxfRk9SX0RJUkVDVElWRSwKKyAgICAgIFNUTVRfT01QX1BBUkFMTEVMX0ZPUl9TSU1EX0RJUkVDVElWRSwKKyAgICAgIFNUTVRfT01QX1BBUkFMTEVMX1NFQ1RJT05TX0RJUkVDVElWRSwKKyAgICAgIFNUTVRfT01QX1RBU0tfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfVEFTS1lJRUxEX0RJUkVDVElWRSwKKyAgICAgIFNUTVRfT01QX0JBUlJJRVJfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfVEFTS1dBSVRfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfRkxVU0hfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfT1JERVJFRF9ESVJFQ1RJVkUsCisgICAgICBTVE1UX09NUF9BVE9NSUNfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfVEFSR0VUX0RJUkVDVElWRSwKKyAgICAgIFNUTVRfT01QX1RBUkdFVF9EQVRBX0RJUkVDVElWRSwKKyAgICAgIFNUTVRfT01QX1RBUkdFVF9FTlRFUl9EQVRBX0RJUkVDVElWRSwKKyAgICAgIFNUTVRfT01QX1RBUkdFVF9FWElUX0RBVEFfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfVEFSR0VUX1BBUkFMTEVMX0RJUkVDVElWRSwKKyAgICAgIFNUTVRfT01QX1RBUkdFVF9QQVJBTExFTF9GT1JfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfVEVBTVNfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfVEFTS0dST1VQX0RJUkVDVElWRSwKKyAgICAgIFNUTVRfT01QX0NBTkNFTExBVElPTl9QT0lOVF9ESVJFQ1RJVkUsCisgICAgICBTVE1UX09NUF9DQU5DRUxfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfVEFTS0xPT1BfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfVEFTS0xPT1BfU0lNRF9ESVJFQ1RJVkUsCisgICAgICBTVE1UX09NUF9ESVNUUklCVVRFX0RJUkVDVElWRSwKKyAgICAgIFNUTVRfT01QX1RBUkdFVF9VUERBVEVfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9ESVJFQ1RJVkUsCisgICAgICBTVE1UX09NUF9ESVNUUklCVVRFX1NJTURfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfVEFSR0VUX1BBUkFMTEVMX0ZPUl9TSU1EX0RJUkVDVElWRSwKKyAgICAgIFNUTVRfT01QX1RBUkdFVF9TSU1EX0RJUkVDVElWRSwKKyAgICAgIFNUTVRfT01QX1RFQU1TX0RJU1RSSUJVVEVfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfVEVBTVNfRElTVFJJQlVURV9TSU1EX0RJUkVDVElWRSwKKyAgICAgIFNUTVRfT01QX1RFQU1TX0RJU1RSSUJVVEVfUEFSQUxMRUxfRk9SX1NJTURfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfRElSRUNUSVZFLAorICAgICAgU1RNVF9PTVBfVEFSR0VUX1RFQU1TX0RJUkVDVElWRSwKKyAgICAgIFNUTVRfT01QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX0RJUkVDVElWRSwKKyAgICAgIFNUTVRfT01QX1RBUkdFVF9URUFNU19ESVNUUklCVVRFX1BBUkFMTEVMX0ZPUl9ESVJFQ1RJVkUsCisgICAgICBTVE1UX09NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9QQVJBTExFTF9GT1JfU0lNRF9ESVJFQ1RJVkUsCisgICAgICBTVE1UX09NUF9UQVJHRVRfVEVBTVNfRElTVFJJQlVURV9TSU1EX0RJUkVDVElWRSwKKyAgICAgIEVYUFJfT01QX0FSUkFZX1NFQ1RJT04sCisKKyAgICAgIC8vIEFSQworICAgICAgRVhQUl9PQkpDX0JSSURHRURfQ0FTVCwgICAgIC8vIE9iakNCcmlkZ2VkQ2FzdEV4cHIKKworICAgICAgU1RNVF9NU19ERVBFTkRFTlRfRVhJU1RTLCAgIC8vIE1TRGVwZW5kZW50RXhpc3RzU3RtdAorICAgICAgRVhQUl9MQU1CREEsICAgICAgICAgICAgICAgIC8vIExhbWJkYUV4cHIKKyAgICAgIFNUTVRfQ09ST1VUSU5FX0JPRFksCisgICAgICBTVE1UX0NPUkVUVVJOLAorICAgICAgRVhQUl9DT0FXQUlULAorICAgICAgRVhQUl9DT1lJRUxELAorICAgICAgRVhQUl9ERVBFTkRFTlRfQ09BV0FJVCwKKyAgICB9OworCisgICAgLy8vIFxicmllZiBUaGUga2luZHMgb2YgZGVzaWduYXRvcnMgdGhhdCBjYW4gb2NjdXIgaW4gYQorICAgIC8vLyBEZXNpZ25hdGVkSW5pdEV4cHIuCisgICAgZW51bSBEZXNpZ25hdG9yVHlwZXMgeworICAgICAgLy8vIFxicmllZiBGaWVsZCBkZXNpZ25hdG9yIHdoZXJlIG9ubHkgdGhlIGZpZWxkIG5hbWUgaXMga25vd24uCisgICAgICBERVNJR19GSUVMRF9OQU1FICA9IDAsCisKKyAgICAgIC8vLyBcYnJpZWYgRmllbGQgZGVzaWduYXRvciB3aGVyZSB0aGUgZmllbGQgaGFzIGJlZW4gcmVzb2x2ZWQgdG8KKyAgICAgIC8vLyBhIGRlY2xhcmF0aW9uLgorICAgICAgREVTSUdfRklFTERfREVDTCAgPSAxLAorCisgICAgICAvLy8gXGJyaWVmIEFycmF5IGRlc2lnbmF0b3IuCisgICAgICBERVNJR19BUlJBWSAgICAgICA9IDIsCisKKyAgICAgIC8vLyBcYnJpZWYgR05VIGFycmF5IHJhbmdlIGRlc2lnbmF0b3IuCisgICAgICBERVNJR19BUlJBWV9SQU5HRSA9IDMKKyAgICB9OworCisgICAgLy8vIFxicmllZiBUaGUgZGlmZmVyZW50IGtpbmRzIG9mIGRhdGEgdGhhdCBjYW4gb2NjdXIgaW4gYQorICAgIC8vLyBDdG9ySW5pdGlhbGl6ZXIuCisgICAgZW51bSBDdG9ySW5pdGlhbGl6ZXJUeXBlIHsKKyAgICAgIENUT1JfSU5JVElBTElaRVJfQkFTRSwKKyAgICAgIENUT1JfSU5JVElBTElaRVJfREVMRUdBVElORywKKyAgICAgIENUT1JfSU5JVElBTElaRVJfTUVNQkVSLAorICAgICAgQ1RPUl9JTklUSUFMSVpFUl9JTkRJUkVDVF9NRU1CRVIKKyAgICB9OworCisgICAgLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIHJlZGVjbGFyYXRpb25zIG9mIGEgZGVjbGFyYXRpb24uCisgICAgc3RydWN0IExvY2FsUmVkZWNsYXJhdGlvbnNJbmZvIHsKKyAgICAgIC8vIFRoZSBJRCBvZiB0aGUgZmlyc3QgZGVjbGFyYXRpb24KKyAgICAgIERlY2xJRCBGaXJzdElEOworCisgICAgICAvLyBPZmZzZXQgaW50byB0aGUgYXJyYXkgb2YgcmVkZWNsYXJhdGlvbiBjaGFpbnMuCisgICAgICB1bnNpZ25lZCBPZmZzZXQ7CisgICAgICAKKyAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPChjb25zdCBMb2NhbFJlZGVjbGFyYXRpb25zSW5mbyAmWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhbFJlZGVjbGFyYXRpb25zSW5mbyAmWSkgeworICAgICAgICByZXR1cm4gWC5GaXJzdElEIDwgWS5GaXJzdElEOworICAgICAgfQorICAgICAgCisgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj4oY29uc3QgTG9jYWxSZWRlY2xhcmF0aW9uc0luZm8gJlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYWxSZWRlY2xhcmF0aW9uc0luZm8gJlkpIHsKKyAgICAgICAgcmV0dXJuIFguRmlyc3RJRCA+IFkuRmlyc3RJRDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8PShjb25zdCBMb2NhbFJlZGVjbGFyYXRpb25zSW5mbyAmWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYWxSZWRlY2xhcmF0aW9uc0luZm8gJlkpIHsKKyAgICAgICAgcmV0dXJuIFguRmlyc3RJRCA8PSBZLkZpcnN0SUQ7CisgICAgICB9CisgICAgICAKKyAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPj0oY29uc3QgTG9jYWxSZWRlY2xhcmF0aW9uc0luZm8gJlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2FsUmVkZWNsYXJhdGlvbnNJbmZvICZZKSB7CisgICAgICAgIHJldHVybiBYLkZpcnN0SUQgPj0gWS5GaXJzdElEOworICAgICAgfQorICAgIH07CisKKyAgICAvLy8gXGJyaWVmIERlc2NyaWJlcyB0aGUgY2F0ZWdvcmllcyBvZiBhbiBPYmplY3RpdmUtQyBjbGFzcy4KKyAgICBzdHJ1Y3QgT2JqQ0NhdGVnb3JpZXNJbmZvIHsKKyAgICAgIC8vIFRoZSBJRCBvZiB0aGUgZGVmaW5pdGlvbgorICAgICAgRGVjbElEIERlZmluaXRpb25JRDsKKworICAgICAgLy8gT2Zmc2V0IGludG8gdGhlIGFycmF5IG9mIGNhdGVnb3J5IGxpc3RzLgorICAgICAgdW5zaWduZWQgT2Zmc2V0OworICAgICAgCisgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoY29uc3QgT2JqQ0NhdGVnb3JpZXNJbmZvICZYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNDYXRlZ29yaWVzSW5mbyAmWSkgeworICAgICAgICByZXR1cm4gWC5EZWZpbml0aW9uSUQgPCBZLkRlZmluaXRpb25JRDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE9iakNDYXRlZ29yaWVzSW5mbyAmWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDQ2F0ZWdvcmllc0luZm8gJlkpIHsKKyAgICAgICAgcmV0dXJuIFguRGVmaW5pdGlvbklEID4gWS5EZWZpbml0aW9uSUQ7CisgICAgICB9CisgICAgICAKKyAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPD0oY29uc3QgT2JqQ0NhdGVnb3JpZXNJbmZvICZYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDQ2F0ZWdvcmllc0luZm8gJlkpIHsKKyAgICAgICAgcmV0dXJuIFguRGVmaW5pdGlvbklEIDw9IFkuRGVmaW5pdGlvbklEOworICAgICAgfQorICAgICAgCisgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj49KGNvbnN0IE9iakNDYXRlZ29yaWVzSW5mbyAmWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0NhdGVnb3JpZXNJbmZvICZZKSB7CisgICAgICAgIHJldHVybiBYLkRlZmluaXRpb25JRCA+PSBZLkRlZmluaXRpb25JRDsKKyAgICAgIH0KKyAgICB9OworCisgICAgLy8vIFxicmllZiBBIGtleSB1c2VkIHdoZW4gbG9va2luZyB1cCBlbnRpdGllcyBieSBccmVmIERlY2xhcmF0aW9uTmFtZS4KKyAgICAvLy8KKyAgICAvLy8gRGlmZmVyZW50IFxyZWYgRGVjbGFyYXRpb25OYW1lcyBhcmUgbWFwcGVkIHRvIGRpZmZlcmVudCBrZXlzLCBidXQgdGhlCisgICAgLy8vIHNhbWUga2V5IGNhbiBvY2Nhc2lvbmFsbHkgcmVwcmVzZW50IG11bHRpcGxlIG5hbWVzIChmb3IgbmFtZXMgdGhhdAorICAgIC8vLyBjb250YWluIHR5cGVzLCBpbiBwYXJ0aWN1bGFyKS4KKyAgICBjbGFzcyBEZWNsYXJhdGlvbk5hbWVLZXkgeworICAgICAgdXNpbmcgTmFtZUtpbmQgPSB1bnNpZ25lZDsKKworICAgICAgTmFtZUtpbmQgS2luZCA9IDA7CisgICAgICB1aW50NjRfdCBEYXRhID0gMDsKKworICAgIHB1YmxpYzoKKyAgICAgIERlY2xhcmF0aW9uTmFtZUtleSgpID0gZGVmYXVsdDsKKyAgICAgIERlY2xhcmF0aW9uTmFtZUtleShEZWNsYXJhdGlvbk5hbWUgTmFtZSk7CisgICAgICBEZWNsYXJhdGlvbk5hbWVLZXkoTmFtZUtpbmQgS2luZCwgdWludDY0X3QgRGF0YSkKKyAgICAgICAgICA6IEtpbmQoS2luZCksIERhdGEoRGF0YSkge30KKworICAgICAgTmFtZUtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICAgICAgSWRlbnRpZmllckluZm8gKmdldElkZW50aWZpZXIoKSBjb25zdCB7CisgICAgICAgIGFzc2VydChLaW5kID09IERlY2xhcmF0aW9uTmFtZTo6SWRlbnRpZmllciB8fAorICAgICAgICAgICAgICAgS2luZCA9PSBEZWNsYXJhdGlvbk5hbWU6OkNYWExpdGVyYWxPcGVyYXRvck5hbWUgfHwKKyAgICAgICAgICAgICAgIEtpbmQgPT0gRGVjbGFyYXRpb25OYW1lOjpDWFhEZWR1Y3Rpb25HdWlkZU5hbWUpOworICAgICAgICByZXR1cm4gKElkZW50aWZpZXJJbmZvICopRGF0YTsKKyAgICAgIH0KKworICAgICAgU2VsZWN0b3IgZ2V0U2VsZWN0b3IoKSBjb25zdCB7CisgICAgICAgIGFzc2VydChLaW5kID09IERlY2xhcmF0aW9uTmFtZTo6T2JqQ1plcm9BcmdTZWxlY3RvciB8fAorICAgICAgICAgICAgICAgS2luZCA9PSBEZWNsYXJhdGlvbk5hbWU6Ok9iakNPbmVBcmdTZWxlY3RvciB8fAorICAgICAgICAgICAgICAgS2luZCA9PSBEZWNsYXJhdGlvbk5hbWU6Ok9iakNNdWx0aUFyZ1NlbGVjdG9yKTsKKyAgICAgICAgcmV0dXJuIFNlbGVjdG9yKERhdGEpOworICAgICAgfQorCisgICAgICBPdmVybG9hZGVkT3BlcmF0b3JLaW5kIGdldE9wZXJhdG9yS2luZCgpIGNvbnN0IHsKKyAgICAgICAgYXNzZXJ0KEtpbmQgPT0gRGVjbGFyYXRpb25OYW1lOjpDWFhPcGVyYXRvck5hbWUpOworICAgICAgICByZXR1cm4gKE92ZXJsb2FkZWRPcGVyYXRvcktpbmQpRGF0YTsKKyAgICAgIH0KKworICAgICAgLy8vIENvbXB1dGUgYSBmaW5nZXJwcmludCBvZiB0aGlzIGtleSBmb3IgdXNlIGluIG9uLWRpc2sgaGFzaCB0YWJsZS4KKyAgICAgIHVuc2lnbmVkIGdldEhhc2goKSBjb25zdDsKKworICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEZWNsYXJhdGlvbk5hbWVLZXkgJkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUtleSAmQikgeworICAgICAgICByZXR1cm4gQS5LaW5kID09IEIuS2luZCAmJiBBLkRhdGEgPT0gQi5EYXRhOworICAgICAgfQorICAgIH07CisKKyAgICAvLy8gQH0KKworfSAvLyBuYW1lc3BhY2Ugc2VyaWFsaXphdGlvbgorfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworbmFtZXNwYWNlIGxsdm0geworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88Y2xhbmc6OnNlcmlhbGl6YXRpb246OkRlY2xhcmF0aW9uTmFtZUtleT4geworICAgIHN0YXRpYyBjbGFuZzo6c2VyaWFsaXphdGlvbjo6RGVjbGFyYXRpb25OYW1lS2V5IGdldEVtcHR5S2V5KCkgeworICAgICAgcmV0dXJuIGNsYW5nOjpzZXJpYWxpemF0aW9uOjpEZWNsYXJhdGlvbk5hbWVLZXkoLTEsIDEpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFuZzo6c2VyaWFsaXphdGlvbjo6RGVjbGFyYXRpb25OYW1lS2V5IGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICAgIHJldHVybiBjbGFuZzo6c2VyaWFsaXphdGlvbjo6RGVjbGFyYXRpb25OYW1lS2V5KC0xLCAyKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdW5zaWduZWQKKyAgICBnZXRIYXNoVmFsdWUoY29uc3QgY2xhbmc6OnNlcmlhbGl6YXRpb246OkRlY2xhcmF0aW9uTmFtZUtleSAmS2V5KSB7CisgICAgICByZXR1cm4gS2V5LmdldEhhc2goKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IGNsYW5nOjpzZXJpYWxpemF0aW9uOjpEZWNsYXJhdGlvbk5hbWVLZXkgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGFuZzo6c2VyaWFsaXphdGlvbjo6RGVjbGFyYXRpb25OYW1lS2V5ICZSKSB7CisgICAgICByZXR1cm4gTCA9PSBSOworICAgIH0KKyAgfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DTEFOR19TRVJJQUxJWkFUSU9OX0FTVEJJVENPREVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vQVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vQVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjZmM2UwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9BU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lci5oCkBAIC0wLDAgKzEsNjIgQEAKKy8vPT09LSBBU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lci5oIC0gRGVjbC9UeXBlIFBDSCBSZWFkIEV2ZW50cyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBBU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lciBjbGFzcywgd2hpY2ggaXMgbm90aWZpZWQKKy8vICBieSB0aGUgQVNUUmVhZGVyIHdoZW5ldmVyIGEgdHlwZSBvciBkZWNsYXJhdGlvbiBpcyBkZXNlcmlhbGl6ZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NFUklBTElaQVRJT05fQVNUREVTRVJJQUxJWkFUSU9OTElTVEVORVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NFUklBTElaQVRJT05fQVNUREVTRVJJQUxJWkFUSU9OTElTVEVORVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvSWRlbnRpZmllclRhYmxlLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VyaWFsaXphdGlvbi9BU1RCaXRDb2Rlcy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBEZWNsOworY2xhc3MgQVNUUmVhZGVyOworY2xhc3MgUXVhbFR5cGU7CitjbGFzcyBNYWNyb0RlZmluaXRpb25SZWNvcmQ7CitjbGFzcyBNYWNyb0luZm87CitjbGFzcyBNb2R1bGU7CitjbGFzcyBTb3VyY2VMb2NhdGlvbjsKKworY2xhc3MgQVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXIgeworcHVibGljOgorICB2aXJ0dWFsIH5BU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lcigpOworCisgIC8vLyBcYnJpZWYgVGhlIEFTVFJlYWRlciB3YXMgaW5pdGlhbGl6ZWQuCisgIHZpcnR1YWwgdm9pZCBSZWFkZXJJbml0aWFsaXplZChBU1RSZWFkZXIgKlJlYWRlcikgeyB9CisKKyAgLy8vIFxicmllZiBBbiBpZGVudGlmaWVyIHdhcyBkZXNlcmlhbGl6ZWQgZnJvbSB0aGUgQVNUIGZpbGUuCisgIHZpcnR1YWwgdm9pZCBJZGVudGlmaWVyUmVhZChzZXJpYWxpemF0aW9uOjpJZGVudElEIElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklJKSB7IH0KKyAgLy8vIFxicmllZiBBIG1hY3JvIHdhcyByZWFkIGZyb20gdGhlIEFTVCBmaWxlLgorICB2aXJ0dWFsIHZvaWQgTWFjcm9SZWFkKHNlcmlhbGl6YXRpb246Ok1hY3JvSUQgSUQsIE1hY3JvSW5mbyAqTUkpIHsgfQorICAvLy8gXGJyaWVmIEEgdHlwZSB3YXMgZGVzZXJpYWxpemVkIGZyb20gdGhlIEFTVCBmaWxlLiBUaGUgSUQgaGVyZSBoYXMgdGhlCisgIC8vLyAgICAgICAgcXVhbGlmaWVyIGJpdHMgYWxyZWFkeSByZW1vdmVkLCBhbmQgVCBpcyBndWFyYW50ZWVkIHRvIGJlIGxvY2FsbHkKKyAgLy8vICAgICAgICB1bnF1YWxpZmllZC4KKyAgdmlydHVhbCB2b2lkIFR5cGVSZWFkKHNlcmlhbGl6YXRpb246OlR5cGVJZHggSWR4LCBRdWFsVHlwZSBUKSB7IH0KKyAgLy8vIFxicmllZiBBIGRlY2wgd2FzIGRlc2VyaWFsaXplZCBmcm9tIHRoZSBBU1QgZmlsZS4KKyAgdmlydHVhbCB2b2lkIERlY2xSZWFkKHNlcmlhbGl6YXRpb246OkRlY2xJRCBJRCwgY29uc3QgRGVjbCAqRCkgeyB9CisgIC8vLyBcYnJpZWYgQSBzZWxlY3RvciB3YXMgcmVhZCBmcm9tIHRoZSBBU1QgZmlsZS4KKyAgdmlydHVhbCB2b2lkIFNlbGVjdG9yUmVhZChzZXJpYWxpemF0aW9uOjpTZWxlY3RvcklEIGlELCBTZWxlY3RvciBTZWwpIHt9CisgIC8vLyBcYnJpZWYgQSBtYWNybyBkZWZpbml0aW9uIHdhcyByZWFkIGZyb20gdGhlIEFTVCBmaWxlLgorICB2aXJ0dWFsIHZvaWQgTWFjcm9EZWZpbml0aW9uUmVhZChzZXJpYWxpemF0aW9uOjpQcmVwcm9jZXNzZWRFbnRpdHlJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9EZWZpbml0aW9uUmVjb3JkICpNRCkge30KKyAgLy8vIFxicmllZiBBIG1vZHVsZSBkZWZpbml0aW9uIHdhcyByZWFkIGZyb20gdGhlIEFTVCBmaWxlLgorICB2aXJ0dWFsIHZvaWQgTW9kdWxlUmVhZChzZXJpYWxpemF0aW9uOjpTdWJtb2R1bGVJRCBJRCwgTW9kdWxlICpNb2QpIHt9CisgIC8vLyBcYnJpZWYgQSBtb2R1bGUgaW1wb3J0IHdhcyByZWFkIGZyb20gdGhlIEFTVCBmaWxlLgorICB2aXJ0dWFsIHZvaWQgTW9kdWxlSW1wb3J0UmVhZChzZXJpYWxpemF0aW9uOjpTdWJtb2R1bGVJRCBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSW1wb3J0TG9jKSB7fQorfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL0FTVFJlYWRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9BU1RSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWNkMDU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9BU1RSZWFkZXIuaApAQCAtMCwwICsxLDI2NDMgQEAKKy8vPT09LSBBU1RSZWFkZXIuaCAtIEFTVCBGaWxlIFJlYWRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBBU1RSZWFkZXIgY2xhc3MsIHdoaWNoIHJlYWRzIEFTVCBmaWxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU0VSSUFMSVpBVElPTl9BU1RSRUFERVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NFUklBTElaQVRJT05fQVNUUkVBREVSX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQ1hYLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xPYmpDLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xhcmF0aW9uTmFtZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9OZXN0ZWROYW1lU3BlY2lmaWVyLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1RlbXBsYXRlQmFzZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UZW1wbGF0ZU5hbWUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljT3B0aW9ucy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0lkZW50aWZpZXJUYWJsZS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL01vZHVsZS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZW5DTE9wdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1ZlcnNpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9WZXJzaW9uVHVwbGUuaCIKKyNpbmNsdWRlICJjbGFuZy9MZXgvRXh0ZXJuYWxQcmVwcm9jZXNzb3JTb3VyY2UuaCIKKyNpbmNsdWRlICJjbGFuZy9MZXgvSGVhZGVyU2VhcmNoLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L1ByZXByb2Nlc3NpbmdSZWNvcmQuaCIKKyNpbmNsdWRlICJjbGFuZy9MZXgvVG9rZW4uaCIKKyNpbmNsdWRlICJjbGFuZy9TZW1hL0V4dGVybmFsU2VtYVNvdXJjZS5oIgorI2luY2x1ZGUgImNsYW5nL1NlbWEvSWRlbnRpZmllclJlc29sdmVyLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VyaWFsaXphdGlvbi9BU1RCaXRDb2Rlcy5oIgorI2luY2x1ZGUgImNsYW5nL1NlcmlhbGl6YXRpb24vQ29udGludW91c1JhbmdlTWFwLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VyaWFsaXphdGlvbi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJjbGFuZy9TZXJpYWxpemF0aW9uL01vZHVsZUZpbGVFeHRlbnNpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9TZXJpYWxpemF0aW9uL01vZHVsZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEZsb2F0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BUFNJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9NYXBWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9CaXRjb2RlL0JpdHN0cmVhbVJlYWRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVGltZXIuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQVNUQ29uc3VtZXI7CitjbGFzcyBBU1RDb250ZXh0OworY2xhc3MgQVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXI7CitjbGFzcyBBU1RSZWFkZXI7CitjbGFzcyBBU1RSZWNvcmRSZWFkZXI7CitjbGFzcyBDWFhUZW1wb3Jhcnk7CitjbGFzcyBEZWNsOworY2xhc3MgRGVjbGFyYXRvckRlY2w7CitjbGFzcyBEZWNsQ29udGV4dDsKK2NsYXNzIEVudW1EZWNsOworY2xhc3MgRXhwcjsKK2NsYXNzIEZpZWxkRGVjbDsKK2NsYXNzIEZpbGVFbnRyeTsKK2NsYXNzIEZpbGVNYW5hZ2VyOworY2xhc3MgRmlsZVN5c3RlbU9wdGlvbnM7CitjbGFzcyBGdW5jdGlvbkRlY2w7CitjbGFzcyBHbG9iYWxNb2R1bGVJbmRleDsKK3N0cnVjdCBIZWFkZXJGaWxlSW5mbzsKK2NsYXNzIEhlYWRlclNlYXJjaE9wdGlvbnM7CitjbGFzcyBMYW5nT3B0aW9uczsKK2NsYXNzIExhenlBU1RVbnJlc29sdmVkU2V0OworY2xhc3MgTWFjcm9JbmZvOworY2xhc3MgTWVtb3J5QnVmZmVyQ2FjaGU7CitjbGFzcyBOYW1lZERlY2w7CitjbGFzcyBOYW1lc3BhY2VEZWNsOworY2xhc3MgT2JqQ0NhdGVnb3J5RGVjbDsKK2NsYXNzIE9iakNJbnRlcmZhY2VEZWNsOworY2xhc3MgUENIQ29udGFpbmVyUmVhZGVyOworY2xhc3MgUHJlcHJvY2Vzc29yOworY2xhc3MgUHJlcHJvY2Vzc29yT3B0aW9uczsKK3N0cnVjdCBRdWFsaWZpZXJJbmZvOworY2xhc3MgU2VtYTsKK2NsYXNzIFNvdXJjZU1hbmFnZXI7CitjbGFzcyBTdG10OworY2xhc3MgU3dpdGNoQ2FzZTsKK2NsYXNzIFRhcmdldE9wdGlvbnM7CitjbGFzcyBUZW1wbGF0ZVBhcmFtZXRlckxpc3Q7CitjbGFzcyBUeXBlZGVmTmFtZURlY2w7CitjbGFzcyBUeXBlU291cmNlSW5mbzsKK2NsYXNzIFZhbHVlRGVjbDsKK2NsYXNzIFZhckRlY2w7CisKKy8vLyBcYnJpZWYgQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBjYWxsYmFjayBpbnZvY2F0aW9ucyBieSB0aGUgQVNUUmVhZGVyLgorLy8vCisvLy8gV2hpbGUgcmVhZGluZyBhbiBBU1QgZmlsZSwgdGhlIEFTVFJlYWRlciB3aWxsIGNhbGwgdGhlIG1ldGhvZHMgb2YgdGhlCisvLy8gbGlzdGVuZXIgdG8gcGFzcyBvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gU29tZSBvZiB0aGUgbGlzdGVuZXIgbWV0aG9kcyBjYW4KKy8vLyByZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0byB0aGUgQVNUUmVhZGVyIHRoYXQgdGhlIGluZm9ybWF0aW9uIChhbmQKKy8vLyBjb25zZXF1ZW50bHkgdGhlIEFTVCBmaWxlKSBpcyBpbnZhbGlkLgorY2xhc3MgQVNUUmVhZGVyTGlzdGVuZXIgeworcHVibGljOgorICB2aXJ0dWFsIH5BU1RSZWFkZXJMaXN0ZW5lcigpOworCisgIC8vLyBcYnJpZWYgUmVjZWl2ZXMgdGhlIGZ1bGwgQ2xhbmcgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIHZlcnNpb24gaXMgaW52YWxpZC4gU3ViY2xhc3NlcyBzaG91bGQKKyAgLy8vIGdlbmVyYWxseSBkZWZlciB0byB0aGlzIGltcGxlbWVudGF0aW9uLgorICB2aXJ0dWFsIGJvb2wgUmVhZEZ1bGxWZXJzaW9uSW5mb3JtYXRpb24oU3RyaW5nUmVmIEZ1bGxWZXJzaW9uKSB7CisgICAgcmV0dXJuIEZ1bGxWZXJzaW9uICE9IGdldENsYW5nRnVsbFJlcG9zaXRvcnlWZXJzaW9uKCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgUmVhZE1vZHVsZU5hbWUoU3RyaW5nUmVmIE1vZHVsZU5hbWUpIHt9CisgIHZpcnR1YWwgdm9pZCBSZWFkTW9kdWxlTWFwRmlsZShTdHJpbmdSZWYgTW9kdWxlTWFwUGF0aCkge30KKworICAvLy8gXGJyaWVmIFJlY2VpdmVzIHRoZSBsYW5ndWFnZSBvcHRpb25zLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgdG8gaW5kaWNhdGUgdGhlIG9wdGlvbnMgYXJlIGludmFsaWQgb3IgZmFsc2Ugb3RoZXJ3aXNlLgorICB2aXJ0dWFsIGJvb2wgUmVhZExhbmd1YWdlT3B0aW9ucyhjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dDb21wYXRpYmxlRGlmZmVyZW5jZXMpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gXGJyaWVmIFJlY2VpdmVzIHRoZSB0YXJnZXQgb3B0aW9ucy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIHRvIGluZGljYXRlIHRoZSB0YXJnZXQgb3B0aW9ucyBhcmUgaW52YWxpZCwgb3IgZmFsc2UKKyAgLy8vIG90aGVyd2lzZS4KKyAgdmlydHVhbCBib29sIFJlYWRUYXJnZXRPcHRpb25zKGNvbnN0IFRhcmdldE9wdGlvbnMgJlRhcmdldE9wdHMsIGJvb2wgQ29tcGxhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93Q29tcGF0aWJsZURpZmZlcmVuY2VzKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBSZWNlaXZlcyB0aGUgZGlhZ25vc3RpYyBvcHRpb25zLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgdG8gaW5kaWNhdGUgdGhlIGRpYWdub3N0aWMgb3B0aW9ucyBhcmUgaW52YWxpZCwgb3IgZmFsc2UKKyAgLy8vIG90aGVyd2lzZS4KKyAgdmlydHVhbCBib29sCisgIFJlYWREaWFnbm9zdGljT3B0aW9ucyhJbnRydXNpdmVSZWZDbnRQdHI8RGlhZ25vc3RpY09wdGlvbnM+IERpYWdPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb21wbGFpbikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVjZWl2ZXMgdGhlIGZpbGUgc3lzdGVtIG9wdGlvbnMuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSB0byBpbmRpY2F0ZSB0aGUgZmlsZSBzeXN0ZW0gb3B0aW9ucyBhcmUgaW52YWxpZCwgb3IgZmFsc2UKKyAgLy8vIG90aGVyd2lzZS4KKyAgdmlydHVhbCBib29sIFJlYWRGaWxlU3lzdGVtT3B0aW9ucyhjb25zdCBGaWxlU3lzdGVtT3B0aW9ucyAmRlNPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gXGJyaWVmIFJlY2VpdmVzIHRoZSBoZWFkZXIgc2VhcmNoIG9wdGlvbnMuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSB0byBpbmRpY2F0ZSB0aGUgaGVhZGVyIHNlYXJjaCBvcHRpb25zIGFyZSBpbnZhbGlkLCBvciBmYWxzZQorICAvLy8gb3RoZXJ3aXNlLgorICB2aXJ0dWFsIGJvb2wgUmVhZEhlYWRlclNlYXJjaE9wdGlvbnMoY29uc3QgSGVhZGVyU2VhcmNoT3B0aW9ucyAmSFNPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNwZWNpZmljTW9kdWxlQ2FjaGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb21wbGFpbikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVjZWl2ZXMgdGhlIHByZXByb2Nlc3NvciBvcHRpb25zLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdWdnZXN0ZWRQcmVkZWZpbmVzIENhbiBiZSBmaWxsZWQgaW4gd2l0aCB0aGUgc2V0IG9mIHByZWRlZmluZXMKKyAgLy8vIHRoYXQgYXJlIHN1Z2dlc3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yIG9wdGlvbnMuIFR5cGljYWxseSBvbmx5IHVzZWQgd2hlbgorICAvLy8gbG9hZGluZyBhIHByZWNvbXBpbGVkIGhlYWRlci4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIHRvIGluZGljYXRlIHRoZSBwcmVwcm9jZXNzb3Igb3B0aW9ucyBhcmUgaW52YWxpZCwgb3IgZmFsc2UKKyAgLy8vIG90aGVyd2lzZS4KKyAgdmlydHVhbCBib29sIFJlYWRQcmVwcm9jZXNzb3JPcHRpb25zKGNvbnN0IFByZXByb2Nlc3Nvck9wdGlvbnMgJlBQT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmU3VnZ2VzdGVkUHJlZGVmaW5lcykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVjZWl2ZXMgX19DT1VOVEVSX18gdmFsdWUuCisgIHZpcnR1YWwgdm9pZCBSZWFkQ291bnRlcihjb25zdCBzZXJpYWxpemF0aW9uOjpNb2R1bGVGaWxlICZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmFsdWUpIHt9CisKKyAgLy8vIFRoaXMgaXMgY2FsbGVkIGZvciBlYWNoIEFTVCBmaWxlIGxvYWRlZC4KKyAgdmlydHVhbCB2b2lkIHZpc2l0TW9kdWxlRmlsZShTdHJpbmdSZWYgRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbjo6TW9kdWxlS2luZCBLaW5kKSB7fQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoaXMgXGMgQVNUUmVhZGVyTGlzdGVuZXIgd2FudHMgdG8gcmVjZWl2ZSB0aGUKKyAgLy8vIGlucHV0IGZpbGVzIG9mIHRoZSBBU1QgZmlsZSB2aWEgXGMgdmlzaXRJbnB1dEZpbGUsIGZhbHNlIG90aGVyd2lzZS4KKyAgdmlydHVhbCBib29sIG5lZWRzSW5wdXRGaWxlVmlzaXRhdGlvbigpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBcYyBBU1RSZWFkZXJMaXN0ZW5lciB3YW50cyB0byByZWNlaXZlIHRoZQorICAvLy8gc3lzdGVtIGlucHV0IGZpbGVzIG9mIHRoZSBBU1QgZmlsZSB2aWEgXGMgdmlzaXRJbnB1dEZpbGUsIGZhbHNlIG90aGVyd2lzZS4KKyAgdmlydHVhbCBib29sIG5lZWRzU3lzdGVtSW5wdXRGaWxlVmlzaXRhdGlvbigpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFxicmllZiBpZiBcYyBuZWVkc0lucHV0RmlsZVZpc2l0YXRpb24gcmV0dXJucyB0cnVlLCB0aGlzIGlzIGNhbGxlZCBmb3IKKyAgLy8vIGVhY2ggbm9uLXN5c3RlbSBpbnB1dCBmaWxlIG9mIHRoZSBBU1QgRmlsZS4gSWYKKyAgLy8vIFxjIG5lZWRzU3lzdGVtSW5wdXRGaWxlVmlzaXRhdGlvbiBpcyB0cnVlLCB0aGVuIGl0IGlzIGNhbGxlZCBmb3IgYWxsCisgIC8vLyBzeXN0ZW0gaW5wdXQgZmlsZXMgYXMgd2VsbC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIHRvIGNvbnRpbnVlIHJlY2VpdmluZyB0aGUgbmV4dCBpbnB1dCBmaWxlLCBmYWxzZSB0byBzdG9wLgorICB2aXJ0dWFsIGJvb2wgdmlzaXRJbnB1dEZpbGUoU3RyaW5nUmVmIEZpbGVuYW1lLCBib29sIGlzU3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc092ZXJyaWRkZW4sIGJvb2wgaXNFeHBsaWNpdE1vZHVsZSkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBcYyBBU1RSZWFkZXJMaXN0ZW5lciB3YW50cyB0byByZWNlaXZlIHRoZQorICAvLy8gaW1wb3J0cyBvZiB0aGUgQVNUIGZpbGUgdmlhIFxjIHZpc2l0SW1wb3J0LCBmYWxzZSBvdGhlcndpc2UuCisgIHZpcnR1YWwgYm9vbCBuZWVkc0ltcG9ydFZpc2l0YXRpb24oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBcYnJpZWYgSWYgbmVlZHNJbXBvcnRWaXNpdGF0aW9uIHJldHVybnMgXGMgdHJ1ZSwgdGhpcyBpcyBjYWxsZWQgZm9yIGVhY2gKKyAgLy8vIEFTVCBmaWxlIGltcG9ydGVkIGJ5IHRoaXMgQVNUIGZpbGUuCisgIHZpcnR1YWwgdm9pZCB2aXNpdEltcG9ydChTdHJpbmdSZWYgRmlsZW5hbWUpIHt9CisKKyAgLy8vIEluZGljYXRlcyB0aGF0IGEgcGFydGljdWxhciBtb2R1bGUgZmlsZSBleHRlbnNpb24gaGFzIGJlZW4gcmVhZC4KKyAgdmlydHVhbCB2b2lkIHJlYWRNb2R1bGVGaWxlRXh0ZW5zaW9uKAorICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGVGaWxlRXh0ZW5zaW9uTWV0YWRhdGEgJk1ldGFkYXRhKSB7fQorfTsKKworLy8vIFxicmllZiBTaW1wbGUgd3JhcHBlciBjbGFzcyBmb3IgY2hhaW5pbmcgbGlzdGVuZXJzLgorY2xhc3MgQ2hhaW5lZEFTVFJlYWRlckxpc3RlbmVyIDogcHVibGljIEFTVFJlYWRlckxpc3RlbmVyIHsKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVFJlYWRlckxpc3RlbmVyPiBGaXJzdDsKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVFJlYWRlckxpc3RlbmVyPiBTZWNvbmQ7CisKK3B1YmxpYzoKKyAgLy8vIFRha2VzIG93bmVyc2hpcCBvZiBccCBGaXJzdCBhbmQgXHAgU2Vjb25kLgorICBDaGFpbmVkQVNUUmVhZGVyTGlzdGVuZXIoc3RkOjp1bmlxdWVfcHRyPEFTVFJlYWRlckxpc3RlbmVyPiBGaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBU1RSZWFkZXJMaXN0ZW5lcj4gU2Vjb25kKQorICAgICAgOiBGaXJzdChzdGQ6Om1vdmUoRmlyc3QpKSwgU2Vjb25kKHN0ZDo6bW92ZShTZWNvbmQpKSB7fQorCisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RSZWFkZXJMaXN0ZW5lcj4gdGFrZUZpcnN0KCkgeyByZXR1cm4gc3RkOjptb3ZlKEZpcnN0KTsgfQorICBzdGQ6OnVuaXF1ZV9wdHI8QVNUUmVhZGVyTGlzdGVuZXI+IHRha2VTZWNvbmQoKSB7IHJldHVybiBzdGQ6Om1vdmUoU2Vjb25kKTsgfQorCisgIGJvb2wgUmVhZEZ1bGxWZXJzaW9uSW5mb3JtYXRpb24oU3RyaW5nUmVmIEZ1bGxWZXJzaW9uKSBvdmVycmlkZTsKKyAgdm9pZCBSZWFkTW9kdWxlTmFtZShTdHJpbmdSZWYgTW9kdWxlTmFtZSkgb3ZlcnJpZGU7CisgIHZvaWQgUmVhZE1vZHVsZU1hcEZpbGUoU3RyaW5nUmVmIE1vZHVsZU1hcFBhdGgpIG92ZXJyaWRlOworICBib29sIFJlYWRMYW5ndWFnZU9wdGlvbnMoY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLCBib29sIENvbXBsYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0NvbXBhdGlibGVEaWZmZXJlbmNlcykgb3ZlcnJpZGU7CisgIGJvb2wgUmVhZFRhcmdldE9wdGlvbnMoY29uc3QgVGFyZ2V0T3B0aW9ucyAmVGFyZ2V0T3B0cywgYm9vbCBDb21wbGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93Q29tcGF0aWJsZURpZmZlcmVuY2VzKSBvdmVycmlkZTsKKyAgYm9vbCBSZWFkRGlhZ25vc3RpY09wdGlvbnMoSW50cnVzaXZlUmVmQ250UHRyPERpYWdub3N0aWNPcHRpb25zPiBEaWFnT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb21wbGFpbikgb3ZlcnJpZGU7CisgIGJvb2wgUmVhZEZpbGVTeXN0ZW1PcHRpb25zKGNvbnN0IEZpbGVTeXN0ZW1PcHRpb25zICZGU09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4pIG92ZXJyaWRlOworCisgIGJvb2wgUmVhZEhlYWRlclNlYXJjaE9wdGlvbnMoY29uc3QgSGVhZGVyU2VhcmNoT3B0aW9ucyAmSFNPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTcGVjaWZpY01vZHVsZUNhY2hlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluKSBvdmVycmlkZTsKKyAgYm9vbCBSZWFkUHJlcHJvY2Vzc29yT3B0aW9ucyhjb25zdCBQcmVwcm9jZXNzb3JPcHRpb25zICZQUE9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb21wbGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmU3VnZ2VzdGVkUHJlZGVmaW5lcykgb3ZlcnJpZGU7CisKKyAgdm9pZCBSZWFkQ291bnRlcihjb25zdCBzZXJpYWxpemF0aW9uOjpNb2R1bGVGaWxlICZNLCB1bnNpZ25lZCBWYWx1ZSkgb3ZlcnJpZGU7CisgIGJvb2wgbmVlZHNJbnB1dEZpbGVWaXNpdGF0aW9uKCkgb3ZlcnJpZGU7CisgIGJvb2wgbmVlZHNTeXN0ZW1JbnB1dEZpbGVWaXNpdGF0aW9uKCkgb3ZlcnJpZGU7CisgIHZvaWQgdmlzaXRNb2R1bGVGaWxlKFN0cmluZ1JlZiBGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbjo6TW9kdWxlS2luZCBLaW5kKSBvdmVycmlkZTsKKyAgYm9vbCB2aXNpdElucHV0RmlsZShTdHJpbmdSZWYgRmlsZW5hbWUsIGJvb2wgaXNTeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc092ZXJyaWRkZW4sIGJvb2wgaXNFeHBsaWNpdE1vZHVsZSkgb3ZlcnJpZGU7CisgIHZvaWQgcmVhZE1vZHVsZUZpbGVFeHRlbnNpb24oCisgICAgICAgICBjb25zdCBNb2R1bGVGaWxlRXh0ZW5zaW9uTWV0YWRhdGEgJk1ldGFkYXRhKSBvdmVycmlkZTsKK307CisKKy8vLyBcYnJpZWYgQVNUUmVhZGVyTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gdG8gdmFsaWRhdGUgdGhlIGluZm9ybWF0aW9uIG9mCisvLy8gdGhlIFBDSCBmaWxlIGFnYWluc3QgYW4gaW5pdGlhbGl6ZWQgUHJlcHJvY2Vzc29yLgorY2xhc3MgUENIVmFsaWRhdG9yIDogcHVibGljIEFTVFJlYWRlckxpc3RlbmVyIHsKKyAgUHJlcHJvY2Vzc29yICZQUDsKKyAgQVNUUmVhZGVyICZSZWFkZXI7CisKK3B1YmxpYzoKKyAgUENIVmFsaWRhdG9yKFByZXByb2Nlc3NvciAmUFAsIEFTVFJlYWRlciAmUmVhZGVyKQorICAgICAgOiBQUChQUCksIFJlYWRlcihSZWFkZXIpIHt9CisKKyAgYm9vbCBSZWFkTGFuZ3VhZ2VPcHRpb25zKGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywgYm9vbCBDb21wbGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dDb21wYXRpYmxlRGlmZmVyZW5jZXMpIG92ZXJyaWRlOworICBib29sIFJlYWRUYXJnZXRPcHRpb25zKGNvbnN0IFRhcmdldE9wdGlvbnMgJlRhcmdldE9wdHMsIGJvb2wgQ29tcGxhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0NvbXBhdGlibGVEaWZmZXJlbmNlcykgb3ZlcnJpZGU7CisgIGJvb2wgUmVhZERpYWdub3N0aWNPcHRpb25zKEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljT3B0aW9ucz4gRGlhZ09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4pIG92ZXJyaWRlOworICBib29sIFJlYWRQcmVwcm9jZXNzb3JPcHRpb25zKGNvbnN0IFByZXByb2Nlc3Nvck9wdGlvbnMgJlBQT3B0cywgYm9vbCBDb21wbGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmU3VnZ2VzdGVkUHJlZGVmaW5lcykgb3ZlcnJpZGU7CisgIGJvb2wgUmVhZEhlYWRlclNlYXJjaE9wdGlvbnMoY29uc3QgSGVhZGVyU2VhcmNoT3B0aW9ucyAmSFNPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTcGVjaWZpY01vZHVsZUNhY2hlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluKSBvdmVycmlkZTsKKyAgdm9pZCBSZWFkQ291bnRlcihjb25zdCBzZXJpYWxpemF0aW9uOjpNb2R1bGVGaWxlICZNLCB1bnNpZ25lZCBWYWx1ZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIHZvaWQgRXJyb3IoY29uc3QgY2hhciAqTXNnKTsKK307CisKKy8vLyBcYnJpZWYgQVNUUmVhZGVyTGlzdGVudGVyIGltcGxlbWVudGF0aW9uIHRvIHNldCBTdWdnZXN0ZWRQcmVkZWZpbmVzIG9mCisvLy8gQVNUUmVhZGVyIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHVzZSBhIHBjaCBmaWxlLiBUaGlzIGlzIHRoZSByZXBsYWNlbWVudAorLy8vIG9mIFBDSFZhbGlkYXRvciBvciBTaW1wbGVQQ0hWYWxpZGF0b3Igd2hlbiB1c2luZyBhIHBjaCBmaWxlIHdpdGhvdXQKKy8vLyB2YWxpZGF0aW5nIGl0LgorY2xhc3MgU2ltcGxlQVNUUmVhZGVyTGlzdGVuZXIgOiBwdWJsaWMgQVNUUmVhZGVyTGlzdGVuZXIgeworICBQcmVwcm9jZXNzb3IgJlBQOworCitwdWJsaWM6CisgIFNpbXBsZUFTVFJlYWRlckxpc3RlbmVyKFByZXByb2Nlc3NvciAmUFApIDogUFAoUFApIHt9CisKKyAgYm9vbCBSZWFkUHJlcHJvY2Vzc29yT3B0aW9ucyhjb25zdCBQcmVwcm9jZXNzb3JPcHRpb25zICZQUE9wdHMsIGJvb2wgQ29tcGxhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJlN1Z2dlc3RlZFByZWRlZmluZXMpIG92ZXJyaWRlOworfTsKKworbmFtZXNwYWNlIHNlcmlhbGl6YXRpb24geworCitjbGFzcyBSZWFkTWV0aG9kUG9vbFZpc2l0b3I7CisKK25hbWVzcGFjZSByZWFkZXIgeworCitjbGFzcyBBU1RJZGVudGlmaWVyTG9va3VwVHJhaXQ7CisKKy8vLyBcYnJpZWYgVGhlIG9uLWRpc2sgaGFzaCB0YWJsZShzKSB1c2VkIGZvciBEZWNsQ29udGV4dCBuYW1lIGxvb2t1cC4KK3N0cnVjdCBEZWNsQ29udGV4dExvb2t1cFRhYmxlOworCit9IC8vIG5hbWVzcGFjZSByZWFkZXIKKworfSAvLyBuYW1lc3BhY2Ugc2VyaWFsaXphdGlvbgorCisvLy8gXGJyaWVmIFJlYWRzIGFuIEFTVCBmaWxlcyBjaGFpbiBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiBhIHRyYW5zbGF0aW9uCisvLy8gdW5pdC4KKy8vLworLy8vIFRoZSBBU1RSZWFkZXIgY2xhc3MgcmVhZHMgYml0c3RyZWFtcyAocHJvZHVjZWQgYnkgdGhlIEFTVFdyaXRlcgorLy8vIGNsYXNzKSBjb250YWluaW5nIHRoZSBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uIG9mIGEgZ2l2ZW4KKy8vLyBhYnN0cmFjdCBzeW50YXggdHJlZSBhbmQgaXRzIHN1cHBvcnRpbmcgZGF0YSBzdHJ1Y3R1cmVzLiBBbgorLy8vIGluc3RhbmNlIG9mIHRoZSBBU1RSZWFkZXIgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIEFTVENvbnRleHQgb2JqZWN0LAorLy8vIHdoaWNoIHdpbGwgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBBU1QgZmlsZXMuCisvLy8KKy8vLyBUaGUgQVNUIHJlYWRlciBwcm92aWRlcyBsYXp5IGRlLXNlcmlhbGl6YXRpb24gb2YgZGVjbGFyYXRpb25zLCBhcworLy8vIHJlcXVpcmVkIHdoZW4gdHJhdmVyc2luZyB0aGUgQVNULiBPbmx5IHRob3NlIEFTVCBub2RlcyB0aGF0IGFyZQorLy8vIGFjdHVhbGx5IHJlcXVpcmVkIHdpbGwgYmUgZGUtc2VyaWFsaXplZC4KK2NsYXNzIEFTVFJlYWRlcgorICA6IHB1YmxpYyBFeHRlcm5hbFByZXByb2Nlc3NvclNvdXJjZSwKKyAgICBwdWJsaWMgRXh0ZXJuYWxQcmVwcm9jZXNzaW5nUmVjb3JkU291cmNlLAorICAgIHB1YmxpYyBFeHRlcm5hbEhlYWRlckZpbGVJbmZvU291cmNlLAorICAgIHB1YmxpYyBFeHRlcm5hbFNlbWFTb3VyY2UsCisgICAgcHVibGljIElkZW50aWZpZXJJbmZvTG9va3VwLAorICAgIHB1YmxpYyBFeHRlcm5hbFNMb2NFbnRyeVNvdXJjZQoreworcHVibGljOgorICAvLy8gXGJyaWVmIFR5cGVzIG9mIEFTVCBmaWxlcy4KKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RJZGVudGlmaWVySXRlcmF0b3I7CisgIGZyaWVuZCBjbGFzcyBBU1RSZWNvcmRSZWFkZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICBmcmllbmQgY2xhc3MgQVNUVW5pdDsgLy8gQVNUVW5pdCBuZWVkcyB0byByZW1hcCBzb3VyY2UgbG9jYXRpb25zLgorICBmcmllbmQgY2xhc3MgQVNUV3JpdGVyOworICBmcmllbmQgY2xhc3MgUENIVmFsaWRhdG9yOworICBmcmllbmQgY2xhc3Mgc2VyaWFsaXphdGlvbjo6cmVhZGVyOjpBU1RJZGVudGlmaWVyTG9va3VwVHJhaXQ7CisgIGZyaWVuZCBjbGFzcyBzZXJpYWxpemF0aW9uOjpSZWFkTWV0aG9kUG9vbFZpc2l0b3I7CisgIGZyaWVuZCBjbGFzcyBUeXBlTG9jUmVhZGVyOworCisgIHVzaW5nIFJlY29yZERhdGEgPSBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgNjQ+OworICB1c2luZyBSZWNvcmREYXRhSW1wbCA9IFNtYWxsVmVjdG9ySW1wbDx1aW50NjRfdD47CisKKyAgLy8vIFxicmllZiBUaGUgcmVzdWx0IG9mIHJlYWRpbmcgdGhlIGNvbnRyb2wgYmxvY2sgb2YgYW4gQVNUIGZpbGUsIHdoaWNoCisgIC8vLyBjYW4gZmFpbCBmb3IgdmFyaW91cyByZWFzb25zLgorICBlbnVtIEFTVFJlYWRSZXN1bHQgeworICAgIC8vLyBcYnJpZWYgVGhlIGNvbnRyb2wgYmxvY2sgd2FzIHJlYWQgc3VjY2Vzc2Z1bGx5LiBBc2lkZSBmcm9tIGZhaWx1cmVzLAorICAgIC8vLyB0aGUgQVNUIGZpbGUgaXMgc2FmZSB0byByZWFkIGludG8gdGhlIGN1cnJlbnQgY29udGV4dC4KKyAgICBTdWNjZXNzLAorCisgICAgLy8vIFxicmllZiBUaGUgQVNUIGZpbGUgaXRzZWxmIGFwcGVhcnMgY29ycnVwdGVkLgorICAgIEZhaWx1cmUsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBBU1QgZmlsZSB3YXMgbWlzc2luZy4KKyAgICBNaXNzaW5nLAorCisgICAgLy8vIFxicmllZiBUaGUgQVNUIGZpbGUgaXMgb3V0LW9mLWRhdGUgcmVsYXRpdmUgdG8gaXRzIGlucHV0IGZpbGVzLAorICAgIC8vLyBhbmQgbmVlZHMgdG8gYmUgcmVnZW5lcmF0ZWQuCisgICAgT3V0T2ZEYXRlLAorCisgICAgLy8vIFxicmllZiBUaGUgQVNUIGZpbGUgd2FzIHdyaXR0ZW4gYnkgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiBDbGFuZy4KKyAgICBWZXJzaW9uTWlzbWF0Y2gsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBBU1QgZmlsZSB3YXMgd3JpdHR0ZW4gd2l0aCBhIGRpZmZlcmVudCBsYW5ndWFnZS90YXJnZXQKKyAgICAvLy8gY29uZmlndXJhdGlvbi4KKyAgICBDb25maWd1cmF0aW9uTWlzbWF0Y2gsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBBU1QgZmlsZSBoYXMgZXJyb3JzLgorICAgIEhhZEVycm9ycworICB9OworCisgIHVzaW5nIE1vZHVsZUZpbGUgPSBzZXJpYWxpemF0aW9uOjpNb2R1bGVGaWxlOworICB1c2luZyBNb2R1bGVLaW5kID0gc2VyaWFsaXphdGlvbjo6TW9kdWxlS2luZDsKKyAgdXNpbmcgTW9kdWxlTWFuYWdlciA9IHNlcmlhbGl6YXRpb246Ok1vZHVsZU1hbmFnZXI7CisgIHVzaW5nIE1vZHVsZUl0ZXJhdG9yID0gTW9kdWxlTWFuYWdlcjo6TW9kdWxlSXRlcmF0b3I7CisgIHVzaW5nIE1vZHVsZUNvbnN0SXRlcmF0b3IgPSBNb2R1bGVNYW5hZ2VyOjpNb2R1bGVDb25zdEl0ZXJhdG9yOworICB1c2luZyBNb2R1bGVSZXZlcnNlSXRlcmF0b3IgPSBNb2R1bGVNYW5hZ2VyOjpNb2R1bGVSZXZlcnNlSXRlcmF0b3I7CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgVGhlIHJlY2VpdmVyIG9mIHNvbWUgY2FsbGJhY2tzIGludm9rZWQgYnkgQVNUUmVhZGVyLgorICBzdGQ6OnVuaXF1ZV9wdHI8QVNUUmVhZGVyTGlzdGVuZXI+IExpc3RlbmVyOworCisgIC8vLyBcYnJpZWYgVGhlIHJlY2VpdmVyIG9mIGRlc2VyaWFsaXphdGlvbiBldmVudHMuCisgIEFTVERlc2VyaWFsaXphdGlvbkxpc3RlbmVyICpEZXNlcmlhbGl6YXRpb25MaXN0ZW5lciA9IG51bGxwdHI7CisKKyAgYm9vbCBPd25zRGVzZXJpYWxpemF0aW9uTGlzdGVuZXIgPSBmYWxzZTsKKworICBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3I7CisgIEZpbGVNYW5hZ2VyICZGaWxlTWdyOworICBjb25zdCBQQ0hDb250YWluZXJSZWFkZXIgJlBDSENvbnRhaW5lclJkcjsKKyAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzOworCisgIC8vLyBcYnJpZWYgVGhlIHNlbWFudGljIGFuYWx5c2lzIG9iamVjdCB0aGF0IHdpbGwgYmUgcHJvY2Vzc2luZyB0aGUKKyAgLy8vIEFTVCBmaWxlcyBhbmQgdGhlIHRyYW5zbGF0aW9uIHVuaXQgdGhhdCB1c2VzIGl0LgorICBTZW1hICpTZW1hT2JqID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFRoZSBwcmVwcm9jZXNzb3IgdGhhdCB3aWxsIGJlIGxvYWRpbmcgdGhlIHNvdXJjZSBmaWxlLgorICBQcmVwcm9jZXNzb3IgJlBQOworCisgIC8vLyBcYnJpZWYgVGhlIEFTVCBjb250ZXh0IGludG8gd2hpY2ggd2UnbGwgcmVhZCB0aGUgQVNUIGZpbGVzLgorICBBU1RDb250ZXh0ICpDb250ZXh0T2JqID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFRoZSBBU1QgY29uc3VtZXIuCisgIEFTVENvbnN1bWVyICpDb25zdW1lciA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBUaGUgbW9kdWxlIG1hbmFnZXIgd2hpY2ggbWFuYWdlcyBtb2R1bGVzIGFuZCB0aGVpciBkZXBlbmRlbmNpZXMKKyAgTW9kdWxlTWFuYWdlciBNb2R1bGVNZ3I7CisKKyAgLy8vIFRoZSBjYWNoZSB0aGF0IG1hbmFnZXMgbWVtb3J5IGJ1ZmZlcnMgZm9yIFBDTSBmaWxlcy4KKyAgTWVtb3J5QnVmZmVyQ2FjaGUgJlBDTUNhY2hlOworCisgIC8vLyBcYnJpZWYgQSBkdW1teSBpZGVudGlmaWVyIHJlc29sdmVyIHVzZWQgdG8gbWVyZ2UgVFUtc2NvcGUgZGVjbGFyYXRpb25zIGluCisgIC8vLyBDLCBmb3IgdGhlIGNhc2VzIHdoZXJlIHdlIGRvbid0IGhhdmUgYSBTZW1hIG9iamVjdCB0byBwcm92aWRlIGEgcmVhbAorICAvLy8gaWRlbnRpZmllciByZXNvbHZlci4KKyAgSWRlbnRpZmllclJlc29sdmVyIER1bW15SWRSZXNvbHZlcjsKKworICAvLy8gQSBtYXBwaW5nIGZyb20gZXh0ZW5zaW9uIGJsb2NrIG5hbWVzIHRvIG1vZHVsZSBmaWxlIGV4dGVuc2lvbnMuCisgIGxsdm06OlN0cmluZ01hcDxzdGQ6OnNoYXJlZF9wdHI8TW9kdWxlRmlsZUV4dGVuc2lvbj4+IE1vZHVsZUZpbGVFeHRlbnNpb25zOworCisgIC8vLyBcYnJpZWYgQSB0aW1lciB1c2VkIHRvIHRyYWNrIHRoZSB0aW1lIHNwZW50IGRlc2VyaWFsaXppbmcuCisgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpUaW1lcj4gUmVhZFRpbWVyOworCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBtb2R1bGUgZmlsZSB3aWxsIGJlIGNvbnNpZGVyZWQgYXMKKyAgLy8vIGltcG9ydGVkIGZyb20uIEZvciBub24tbW9kdWxlIEFTVCB0eXBlcyBpdCBzaG91bGQgYmUgaW52YWxpZC4KKyAgU291cmNlTG9jYXRpb24gQ3VycmVudEltcG9ydExvYzsKKworICAvLy8gXGJyaWVmIFRoZSBnbG9iYWwgbW9kdWxlIGluZGV4LCBpZiBsb2FkZWQuCisgIHN0ZDo6dW5pcXVlX3B0cjxHbG9iYWxNb2R1bGVJbmRleD4gR2xvYmFsSW5kZXg7CisKKyAgLy8vIFxicmllZiBBIG1hcCBvZiBnbG9iYWwgYml0IG9mZnNldHMgdG8gdGhlIG1vZHVsZSB0aGF0IHN0b3JlcyBlbnRpdGllcworICAvLy8gYXQgdGhvc2UgYml0IG9mZnNldHMuCisgIENvbnRpbnVvdXNSYW5nZU1hcDx1aW50NjRfdCwgTW9kdWxlRmlsZSosIDQ+IEdsb2JhbEJpdE9mZnNldHNNYXA7CisKKyAgLy8vIFxicmllZiBBIG1hcCBvZiBuZWdhdGVkIFNMb2NFbnRyeUlEcyB0byB0aGUgbW9kdWxlcyBjb250YWluaW5nIHRoZW0uCisgIENvbnRpbnVvdXNSYW5nZU1hcDx1bnNpZ25lZCwgTW9kdWxlRmlsZSosIDY0PiBHbG9iYWxTTG9jRW50cnlNYXA7CisKKyAgdXNpbmcgR2xvYmFsU0xvY09mZnNldE1hcFR5cGUgPQorICAgICAgQ29udGludW91c1JhbmdlTWFwPHVuc2lnbmVkLCBNb2R1bGVGaWxlICosIDY0PjsKKworICAvLy8gXGJyaWVmIEEgbWFwIG9mIHJldmVyc2VkIChTb3VyY2VNYW5hZ2VyOjpNYXhMb2FkZWRPZmZzZXQgLSBTTG9jT2Zmc2V0KQorICAvLy8gU291cmNlTG9jYXRpb24gb2Zmc2V0cyB0byB0aGUgbW9kdWxlcyBjb250YWluaW5nIHRoZW0uCisgIEdsb2JhbFNMb2NPZmZzZXRNYXBUeXBlIEdsb2JhbFNMb2NPZmZzZXRNYXA7CisKKyAgLy8vIFxicmllZiBUeXBlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGxvYWRlZCBmcm9tIHRoZSBjaGFpbi4KKyAgLy8vCisgIC8vLyBXaGVuIHRoZSBwb2ludGVyIGF0IGluZGV4IEkgaXMgbm9uLU5VTEwsIHRoZSB0eXBlIHdpdGgKKyAgLy8vIElEID0gKEkgKyAxKSA8PCBGYXN0UXVhbDo6V2lkdGggaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQKKyAgc3RkOjp2ZWN0b3I8UXVhbFR5cGU+IFR5cGVzTG9hZGVkOworCisgIHVzaW5nIEdsb2JhbFR5cGVNYXBUeXBlID0KKyAgICAgIENvbnRpbnVvdXNSYW5nZU1hcDxzZXJpYWxpemF0aW9uOjpUeXBlSUQsIE1vZHVsZUZpbGUgKiwgND47CisKKyAgLy8vIFxicmllZiBNYXBwaW5nIGZyb20gZ2xvYmFsIHR5cGUgSURzIHRvIHRoZSBtb2R1bGUgaW4gd2hpY2ggdGhlCisgIC8vLyB0eXBlIHJlc2lkZXMgYWxvbmcgd2l0aCB0aGUgb2Zmc2V0IHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZQorICAvLy8gZ2xvYmFsIHR5cGUgSUQgdG8gcHJvZHVjZSBhIGxvY2FsIElELgorICBHbG9iYWxUeXBlTWFwVHlwZSBHbG9iYWxUeXBlTWFwOworCisgIC8vLyBcYnJpZWYgRGVjbGFyYXRpb25zIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gbG9hZGVkIGZyb20gdGhlIGNoYWluLgorICAvLy8KKyAgLy8vIFdoZW4gdGhlIHBvaW50ZXIgYXQgaW5kZXggSSBpcyBub24tTlVMTCwgdGhlIGRlY2xhcmF0aW9uIHdpdGggSUQKKyAgLy8vID0gSSArIDEgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQuCisgIHN0ZDo6dmVjdG9yPERlY2wgKj4gRGVjbHNMb2FkZWQ7CisKKyAgdXNpbmcgR2xvYmFsRGVjbE1hcFR5cGUgPQorICAgICAgQ29udGludW91c1JhbmdlTWFwPHNlcmlhbGl6YXRpb246OkRlY2xJRCwgTW9kdWxlRmlsZSAqLCA0PjsKKworICAvLy8gXGJyaWVmIE1hcHBpbmcgZnJvbSBnbG9iYWwgZGVjbGFyYXRpb24gSURzIHRvIHRoZSBtb2R1bGUgaW4gd2hpY2ggdGhlCisgIC8vLyBkZWNsYXJhdGlvbiByZXNpZGVzLgorICBHbG9iYWxEZWNsTWFwVHlwZSBHbG9iYWxEZWNsTWFwOworCisgIHVzaW5nIEZpbGVPZmZzZXQgPSBzdGQ6OnBhaXI8TW9kdWxlRmlsZSAqLCB1aW50NjRfdD47CisgIHVzaW5nIEZpbGVPZmZzZXRzVHkgPSBTbWFsbFZlY3RvcjxGaWxlT2Zmc2V0LCAyPjsKKyAgdXNpbmcgRGVjbFVwZGF0ZU9mZnNldHNNYXAgPQorICAgICAgbGx2bTo6RGVuc2VNYXA8c2VyaWFsaXphdGlvbjo6RGVjbElELCBGaWxlT2Zmc2V0c1R5PjsKKworICAvLy8gXGJyaWVmIERlY2xhcmF0aW9ucyB0aGF0IGhhdmUgbW9kaWZpY2F0aW9ucyByZXNpZGluZyBpbiBhIGxhdGVyIGZpbGUKKyAgLy8vIGluIHRoZSBjaGFpbi4KKyAgRGVjbFVwZGF0ZU9mZnNldHNNYXAgRGVjbFVwZGF0ZU9mZnNldHM7CisKKyAgc3RydWN0IFBlbmRpbmdVcGRhdGVSZWNvcmQgeworICAgIERlY2wgKkQ7CisgICAgc2VyaWFsaXphdGlvbjo6R2xvYmFsRGVjbElEIElEOworCisgICAgLy8gV2hldGhlciB0aGUgZGVjbGFyYXRpb24gd2FzIGp1c3QgZGVzZXJpYWxpemVkLgorICAgIGJvb2wgSnVzdExvYWRlZDsKKworICAgIFBlbmRpbmdVcGRhdGVSZWNvcmQoc2VyaWFsaXphdGlvbjo6R2xvYmFsRGVjbElEIElELCBEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBKdXN0TG9hZGVkKQorICAgICAgICA6IEQoRCksIElEKElEKSwgSnVzdExvYWRlZChKdXN0TG9hZGVkKSB7fQorICB9OworCisgIC8vLyBcYnJpZWYgRGVjbGFyYXRpb24gdXBkYXRlcyBmb3IgYWxyZWFkeS1sb2FkZWQgZGVjbGFyYXRpb25zIHRoYXQgd2UgbmVlZAorICAvLy8gdG8gYXBwbHkgb25jZSB3ZSBmaW5pc2ggcHJvY2Vzc2luZyBhbiBpbXBvcnQuCisgIGxsdm06OlNtYWxsVmVjdG9yPFBlbmRpbmdVcGRhdGVSZWNvcmQsIDE2PiBQZW5kaW5nVXBkYXRlUmVjb3JkczsKKworICBlbnVtIGNsYXNzIFBlbmRpbmdGYWtlRGVmaW5pdGlvbktpbmQgeyBOb3RGYWtlLCBGYWtlLCBGYWtlTG9hZGVkIH07CisKKyAgLy8vIFxicmllZiBUaGUgRGVmaW5pdGlvbkRhdGEgcG9pbnRlcnMgdGhhdCB3ZSBmYWtlZCB1cCBmb3IgY2xhc3MgZGVmaW5pdGlvbnMKKyAgLy8vIHRoYXQgd2UgbmVlZGVkIGJ1dCBoYWRuJ3QgbG9hZGVkIHlldC4KKyAgbGx2bTo6RGVuc2VNYXA8dm9pZCAqLCBQZW5kaW5nRmFrZURlZmluaXRpb25LaW5kPiBQZW5kaW5nRmFrZURlZmluaXRpb25EYXRhOworCisgIC8vLyBcYnJpZWYgRXhjZXB0aW9uIHNwZWNpZmljYXRpb24gdXBkYXRlcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgYnV0IG5vdCB5ZXQKKyAgLy8vIHByb3BhZ2F0ZWQgYWNyb3NzIHRoZSByZWxldmFudCByZWRlY2xhcmF0aW9uIGNoYWluLiBUaGUgbWFwIGtleSBpcyB0aGUKKyAgLy8vIGNhbm9uaWNhbCBkZWNsYXJhdGlvbiAodXNlZCBvbmx5IGZvciBkZWR1cGxpY2F0aW9uKSBhbmQgdGhlIHZhbHVlIGlzIGEKKyAgLy8vIGRlY2xhcmF0aW9uIHRoYXQgaGFzIGFuIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLgorICBsbHZtOjpTbWFsbE1hcFZlY3RvcjxEZWNsICosIEZ1bmN0aW9uRGVjbCAqLCA0PiBQZW5kaW5nRXhjZXB0aW9uU3BlY1VwZGF0ZXM7CisKKyAgLy8vIFxicmllZiBEZWNsYXJhdGlvbnMgdGhhdCBoYXZlIGJlZW4gaW1wb3J0ZWQgYW5kIGhhdmUgdHlwZWRlZiBuYW1lcyBmb3IKKyAgLy8vIGxpbmthZ2UgcHVycG9zZXMuCisgIGxsdm06OkRlbnNlTWFwPHN0ZDo6cGFpcjxEZWNsQ29udGV4dCAqLCBJZGVudGlmaWVySW5mbyAqPiwgTmFtZWREZWNsICo+CisgICAgICBJbXBvcnRlZFR5cGVkZWZOYW1lc0ZvckxpbmthZ2U7CisKKyAgLy8vIFxicmllZiBNZXJnZWFibGUgZGVjbGFyYXRpb24gY29udGV4dHMgdGhhdCBoYXZlIGFub255bW91cyBkZWNsYXJhdGlvbnMKKyAgLy8vIHdpdGhpbiB0aGVtLCBhbmQgdGhvc2UgYW5vbnltb3VzIGRlY2xhcmF0aW9ucy4KKyAgbGx2bTo6RGVuc2VNYXA8RGVjbENvbnRleHQqLCBsbHZtOjpTbWFsbFZlY3RvcjxOYW1lZERlY2wqLCAyPj4KKyAgICBBbm9ueW1vdXNEZWNsYXJhdGlvbnNGb3JNZXJnaW5nOworCisgIHN0cnVjdCBGaWxlRGVjbHNJbmZvIHsKKyAgICBNb2R1bGVGaWxlICpNb2QgPSBudWxscHRyOworICAgIEFycmF5UmVmPHNlcmlhbGl6YXRpb246OkxvY2FsRGVjbElEPiBEZWNsczsKKworICAgIEZpbGVEZWNsc0luZm8oKSA9IGRlZmF1bHQ7CisgICAgRmlsZURlY2xzSW5mbyhNb2R1bGVGaWxlICpNb2QsIEFycmF5UmVmPHNlcmlhbGl6YXRpb246OkxvY2FsRGVjbElEPiBEZWNscykKKyAgICAgICAgOiBNb2QoTW9kKSwgRGVjbHMoRGVjbHMpIHt9CisgIH07CisKKyAgLy8vIFxicmllZiBNYXAgZnJvbSBhIEZpbGVJRCB0byB0aGUgZmlsZS1sZXZlbCBkZWNsYXJhdGlvbnMgdGhhdCBpdCBjb250YWlucy4KKyAgbGx2bTo6RGVuc2VNYXA8RmlsZUlELCBGaWxlRGVjbHNJbmZvPiBGaWxlRGVjbElEczsKKworICAvLy8gXGJyaWVmIEFuIGFycmF5IG9mIGxleGljYWwgY29udGVudHMgb2YgYSBkZWNsYXJhdGlvbiBjb250ZXh0LCBhcyBhIHNlcXVlbmNlIG9mCisgIC8vLyBEZWNsOjpLaW5kLCBEZWNsSUQgcGFpcnMuCisgIHVzaW5nIExleGljYWxDb250ZW50cyA9IEFycmF5UmVmPGxsdm06OnN1cHBvcnQ6OnVuYWxpZ25lZF91aW50MzJfdD47CisKKyAgLy8vIFxicmllZiBNYXAgZnJvbSBhIERlY2xDb250ZXh0IHRvIGl0cyBsZXhpY2FsIGNvbnRlbnRzLgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBEZWNsQ29udGV4dCosIHN0ZDo6cGFpcjxNb2R1bGVGaWxlKiwgTGV4aWNhbENvbnRlbnRzPj4KKyAgICAgIExleGljYWxEZWNsczsKKworICAvLy8gXGJyaWVmIE1hcCBmcm9tIHRoZSBUVSB0byBpdHMgbGV4aWNhbCBjb250ZW50cyBmcm9tIGVhY2ggbW9kdWxlIGZpbGUuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxNb2R1bGVGaWxlKiwgTGV4aWNhbENvbnRlbnRzPj4gVFVMZXhpY2FsRGVjbHM7CisKKyAgLy8vIFxicmllZiBNYXAgZnJvbSBhIERlY2xDb250ZXh0IHRvIGl0cyBsb29rdXAgdGFibGVzLgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBEZWNsQ29udGV4dCAqLAorICAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uOjpyZWFkZXI6OkRlY2xDb250ZXh0TG9va3VwVGFibGU+IExvb2t1cHM7CisKKyAgLy8gVXBkYXRlcyBmb3IgdmlzaWJsZSBkZWNscyBjYW4gb2NjdXIgZm9yIG90aGVyIGNvbnRleHRzIHRoYW4ganVzdCB0aGUKKyAgLy8gVFUsIGFuZCB3aGVuIHdlIHJlYWQgdGhvc2UgdXBkYXRlIHJlY29yZHMsIHRoZSBhY3R1YWwgY29udGV4dCBtYXkgbm90CisgIC8vIGJlIGF2YWlsYWJsZSB5ZXQsIHNvIGhhdmUgdGhpcyBwZW5kaW5nIG1hcCB1c2luZyB0aGUgSUQgYXMgYSBrZXkuIEl0CisgIC8vIHdpbGwgYmUgcmVhbGl6ZWQgd2hlbiB0aGUgY29udGV4dCBpcyBhY3R1YWxseSBsb2FkZWQuCisgIHN0cnVjdCBQZW5kaW5nVmlzaWJsZVVwZGF0ZSB7CisgICAgTW9kdWxlRmlsZSAqTW9kOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKkRhdGE7CisgIH07CisgIHVzaW5nIERlY2xDb250ZXh0VmlzaWJsZVVwZGF0ZXMgPSBTbWFsbFZlY3RvcjxQZW5kaW5nVmlzaWJsZVVwZGF0ZSwgMT47CisKKyAgLy8vIFxicmllZiBVcGRhdGVzIHRvIHRoZSB2aXNpYmxlIGRlY2xhcmF0aW9ucyBvZiBkZWNsYXJhdGlvbiBjb250ZXh0cyB0aGF0CisgIC8vLyBoYXZlbid0IGJlZW4gbG9hZGVkIHlldC4KKyAgbGx2bTo6RGVuc2VNYXA8c2VyaWFsaXphdGlvbjo6RGVjbElELCBEZWNsQ29udGV4dFZpc2libGVVcGRhdGVzPgorICAgICAgUGVuZGluZ1Zpc2libGVVcGRhdGVzOworCisgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiBDKysgb3IgT2JqZWN0aXZlLUMgY2xhc3NlcyB0aGF0IGhhdmUgZm9yd2FyZCAKKyAgLy8vIGRlY2xhcmF0aW9ucyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGxpbmtlZCB0byB0aGVpciBkZWZpbml0aW9ucy4KKyAgbGx2bTo6U21hbGxQdHJTZXQ8RGVjbCAqLCA0PiBQZW5kaW5nRGVmaW5pdGlvbnM7CisKKyAgdXNpbmcgUGVuZGluZ0JvZGllc01hcCA9CisgICAgICBsbHZtOjpNYXBWZWN0b3I8RGVjbCAqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTbWFsbERlbnNlTWFwPERlY2wgKiwgdW5zaWduZWQsIDQ+LAorICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxEZWNsICosIHVpbnQ2NF90PiwgND4+OworCisgIC8vLyBcYnJpZWYgRnVuY3Rpb25zIG9yIG1ldGhvZHMgdGhhdCBoYXZlIGJvZGllcyB0aGF0IHdpbGwgYmUgYXR0YWNoZWQuCisgIFBlbmRpbmdCb2RpZXNNYXAgUGVuZGluZ0JvZGllczsKKworICAvLy8gXGJyaWVmIERlZmluaXRpb25zIGZvciB3aGljaCB3ZSBoYXZlIGFkZGVkIG1lcmdlZCBkZWZpbml0aW9ucyBidXQgbm90IHlldAorICAvLy8gcGVyZm9ybWVkIGRlZHVwbGljYXRpb24uCisgIGxsdm06OlNldFZlY3RvcjxOYW1lZERlY2wgKj4gUGVuZGluZ01lcmdlZERlZmluaXRpb25zVG9EZWR1cGxpY2F0ZTsKKworICAvLy8gXGJyaWVmIFJlYWQgdGhlIHJlY29yZCB0aGF0IGRlc2NyaWJlcyB0aGUgbGV4aWNhbCBjb250ZW50cyBvZiBhIERDLgorICBib29sIFJlYWRMZXhpY2FsRGVjbENvbnRleHRTdG9yYWdlKE1vZHVsZUZpbGUgJk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6Qml0c3RyZWFtQ3Vyc29yICZDdXJzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0LCBEZWNsQ29udGV4dCAqREMpOworCisgIC8vLyBcYnJpZWYgUmVhZCB0aGUgcmVjb3JkIHRoYXQgZGVzY3JpYmVzIHRoZSB2aXNpYmxlIGNvbnRlbnRzIG9mIGEgREMuCisgIGJvb2wgUmVhZFZpc2libGVEZWNsQ29udGV4dFN0b3JhZ2UoTW9kdWxlRmlsZSAmTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpCaXRzdHJlYW1DdXJzb3IgJkN1cnNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXQsIHNlcmlhbGl6YXRpb246OkRlY2xJRCBJRCk7CisKKyAgLy8vIFxicmllZiBBIHZlY3RvciBjb250YWluaW5nIGlkZW50aWZpZXJzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4KKyAgLy8vIGxvYWRlZC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgcG9pbnRlciBhdCBpbmRleCBJIGlzIG5vbi1OVUxMLCB0aGVuIGl0IHJlZmVycyB0byB0aGUKKyAgLy8vIElkZW50aWZpZXJJbmZvIGZvciB0aGUgaWRlbnRpZmllciB3aXRoIElEPUkrMSB0aGF0IGhhcyBhbHJlYWR5CisgIC8vLyBiZWVuIGxvYWRlZC4KKyAgc3RkOjp2ZWN0b3I8SWRlbnRpZmllckluZm8gKj4gSWRlbnRpZmllcnNMb2FkZWQ7CisKKyAgdXNpbmcgR2xvYmFsSWRlbnRpZmllck1hcFR5cGUgPQorICAgICAgQ29udGludW91c1JhbmdlTWFwPHNlcmlhbGl6YXRpb246OklkZW50SUQsIE1vZHVsZUZpbGUgKiwgND47CisKKyAgLy8vIFxicmllZiBNYXBwaW5nIGZyb20gZ2xvYmFsIGlkZW50aWZpZXIgSURzIHRvIHRoZSBtb2R1bGUgaW4gd2hpY2ggdGhlCisgIC8vLyBpZGVudGlmaWVyIHJlc2lkZXMgYWxvbmcgd2l0aCB0aGUgb2Zmc2V0IHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZQorICAvLy8gZ2xvYmFsIGlkZW50aWZpZXIgSUQgdG8gcHJvZHVjZSBhIGxvY2FsIElELgorICBHbG9iYWxJZGVudGlmaWVyTWFwVHlwZSBHbG9iYWxJZGVudGlmaWVyTWFwOworCisgIC8vLyBcYnJpZWYgQSB2ZWN0b3IgY29udGFpbmluZyBtYWNyb3MgdGhhdCBoYXZlIGFscmVhZHkgYmVlbgorICAvLy8gbG9hZGVkLgorICAvLy8KKyAgLy8vIElmIHRoZSBwb2ludGVyIGF0IGluZGV4IEkgaXMgbm9uLU5VTEwsIHRoZW4gaXQgcmVmZXJzIHRvIHRoZQorICAvLy8gTWFjcm9JbmZvIGZvciB0aGUgaWRlbnRpZmllciB3aXRoIElEPUkrMSB0aGF0IGhhcyBhbHJlYWR5CisgIC8vLyBiZWVuIGxvYWRlZC4KKyAgc3RkOjp2ZWN0b3I8TWFjcm9JbmZvICo+IE1hY3Jvc0xvYWRlZDsKKworICB1c2luZyBMb2FkZWRNYWNyb0luZm8gPQorICAgICAgc3RkOjpwYWlyPElkZW50aWZpZXJJbmZvICosIHNlcmlhbGl6YXRpb246OlN1Ym1vZHVsZUlEPjsKKworICAvLy8gXGJyaWVmIEEgc2V0IG9mICN1bmRlZiBkaXJlY3RpdmVzIHRoYXQgd2UgaGF2ZSBsb2FkZWQ7IHVzZWQgdG8KKyAgLy8vIGRlZHVwbGljYXRlIHRoZSBzYW1lICN1bmRlZiBpbmZvcm1hdGlvbiBjb21pbmcgZnJvbSBtdWx0aXBsZSBtb2R1bGUKKyAgLy8vIGZpbGVzLgorICBsbHZtOjpEZW5zZVNldDxMb2FkZWRNYWNyb0luZm8+IExvYWRlZFVuZGVmczsKKworICB1c2luZyBHbG9iYWxNYWNyb01hcFR5cGUgPQorICAgICAgQ29udGludW91c1JhbmdlTWFwPHNlcmlhbGl6YXRpb246Ok1hY3JvSUQsIE1vZHVsZUZpbGUgKiwgND47CisKKyAgLy8vIFxicmllZiBNYXBwaW5nIGZyb20gZ2xvYmFsIG1hY3JvIElEcyB0byB0aGUgbW9kdWxlIGluIHdoaWNoIHRoZQorICAvLy8gbWFjcm8gcmVzaWRlcyBhbG9uZyB3aXRoIHRoZSBvZmZzZXQgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlCisgIC8vLyBnbG9iYWwgbWFjcm8gSUQgdG8gcHJvZHVjZSBhIGxvY2FsIElELgorICBHbG9iYWxNYWNyb01hcFR5cGUgR2xvYmFsTWFjcm9NYXA7CisKKyAgLy8vIFxicmllZiBBIHZlY3RvciBjb250YWluaW5nIHN1Ym1vZHVsZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQuCisgIC8vLworICAvLy8gVGhpcyB2ZWN0b3IgaXMgaW5kZXhlZCBieSB0aGUgU3VibW9kdWxlIElEICgtMSkuIE5VTEwgc3VibW9kdWxlIGVudHJpZXMKKyAgLy8vIGluZGljYXRlIHRoYXQgdGhlIHBhcnRpY3VsYXIgc3VibW9kdWxlIElEIGhhcyBub3QgeWV0IGJlZW4gbG9hZGVkLgorICBTbWFsbFZlY3RvcjxNb2R1bGUgKiwgMj4gU3VibW9kdWxlc0xvYWRlZDsKKyAgCisgIHVzaW5nIEdsb2JhbFN1Ym1vZHVsZU1hcFR5cGUgPQorICAgICAgQ29udGludW91c1JhbmdlTWFwPHNlcmlhbGl6YXRpb246OlN1Ym1vZHVsZUlELCBNb2R1bGVGaWxlICosIDQ+OworICAKKyAgLy8vIFxicmllZiBNYXBwaW5nIGZyb20gZ2xvYmFsIHN1Ym1vZHVsZSBJRHMgdG8gdGhlIG1vZHVsZSBmaWxlIGluIHdoaWNoIHRoZQorICAvLy8gc3VibW9kdWxlIHJlc2lkZXMgYWxvbmcgd2l0aCB0aGUgb2Zmc2V0IHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZQorICAvLy8gZ2xvYmFsIHN1Ym1vZHVsZSBJRCB0byBwcm9kdWNlIGEgbG9jYWwgSUQuCisgIEdsb2JhbFN1Ym1vZHVsZU1hcFR5cGUgR2xvYmFsU3VibW9kdWxlTWFwOworCisgIC8vLyBcYnJpZWYgQSBzZXQgb2YgaGlkZGVuIGRlY2xhcmF0aW9ucy4KKyAgdXNpbmcgSGlkZGVuTmFtZXMgPSBTbWFsbFZlY3RvcjxEZWNsICosIDI+OworICB1c2luZyBIaWRkZW5OYW1lc01hcFR5cGUgPSBsbHZtOjpEZW5zZU1hcDxNb2R1bGUgKiwgSGlkZGVuTmFtZXM+OworCisgIC8vLyBcYnJpZWYgQSBtYXBwaW5nIGZyb20gZWFjaCBvZiB0aGUgaGlkZGVuIHN1Ym1vZHVsZXMgdG8gdGhlIGRlc2VyaWFsaXplZAorICAvLy8gZGVjbGFyYXRpb25zIGluIHRoYXQgc3VibW9kdWxlIHRoYXQgY291bGQgYmUgbWFkZSB2aXNpYmxlLgorICBIaWRkZW5OYW1lc01hcFR5cGUgSGlkZGVuTmFtZXNNYXA7CisgIAorICAvLy8gXGJyaWVmIEEgbW9kdWxlIGltcG9ydCwgZXhwb3J0LCBvciBjb25mbGljdCB0aGF0IGhhc24ndCB5ZXQgYmVlbiByZXNvbHZlZC4KKyAgc3RydWN0IFVucmVzb2x2ZWRNb2R1bGVSZWYgeworICAgIC8vLyBcYnJpZWYgVGhlIGZpbGUgaW4gd2hpY2ggdGhpcyBtb2R1bGUgcmVzaWRlcy4KKyAgICBNb2R1bGVGaWxlICpGaWxlOworICAgIAorICAgIC8vLyBcYnJpZWYgVGhlIG1vZHVsZSB0aGF0IGlzIGltcG9ydGluZyBvciBleHBvcnRpbmcuCisgICAgTW9kdWxlICpNb2Q7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBraW5kIG9mIG1vZHVsZSByZWZlcmVuY2UuCisgICAgZW51bSB7IEltcG9ydCwgRXhwb3J0LCBDb25mbGljdCB9IEtpbmQ7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBsb2NhbCBJRCBvZiB0aGUgbW9kdWxlIHRoYXQgaXMgYmVpbmcgZXhwb3J0ZWQuCisgICAgdW5zaWduZWQgSUQ7CisKKyAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBpcyBhIHdpbGRjYXJkIGV4cG9ydC4KKyAgICB1bnNpZ25lZCBJc1dpbGRjYXJkIDogMTsKKworICAgIC8vLyBcYnJpZWYgU3RyaW5nIGRhdGEuCisgICAgU3RyaW5nUmVmIFN0cmluZzsKKyAgfTsKKyAgCisgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiBtb2R1bGUgaW1wb3J0cyBhbmQgZXhwb3J0cyB0aGF0IHN0aWxsIG5lZWQgdG8gYmUgCisgIC8vLyByZXNvbHZlZC4KKyAgU21hbGxWZWN0b3I8VW5yZXNvbHZlZE1vZHVsZVJlZiwgMj4gVW5yZXNvbHZlZE1vZHVsZVJlZnM7CisgIAorICAvLy8gXGJyaWVmIEEgdmVjdG9yIGNvbnRhaW5pbmcgc2VsZWN0b3JzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gbG9hZGVkLgorICAvLy8KKyAgLy8vIFRoaXMgdmVjdG9yIGlzIGluZGV4ZWQgYnkgdGhlIFNlbGVjdG9yIElEICgtMSkuIE5VTEwgc2VsZWN0b3IKKyAgLy8vIGVudHJpZXMgaW5kaWNhdGUgdGhhdCB0aGUgcGFydGljdWxhciBzZWxlY3RvciBJRCBoYXMgbm90IHlldAorICAvLy8gYmVlbiBsb2FkZWQuCisgIFNtYWxsVmVjdG9yPFNlbGVjdG9yLCAxNj4gU2VsZWN0b3JzTG9hZGVkOworCisgIHVzaW5nIEdsb2JhbFNlbGVjdG9yTWFwVHlwZSA9CisgICAgICBDb250aW51b3VzUmFuZ2VNYXA8c2VyaWFsaXphdGlvbjo6U2VsZWN0b3JJRCwgTW9kdWxlRmlsZSAqLCA0PjsKKworICAvLy8gXGJyaWVmIE1hcHBpbmcgZnJvbSBnbG9iYWwgc2VsZWN0b3IgSURzIHRvIHRoZSBtb2R1bGUgaW4gd2hpY2ggdGhlCisgIC8vLyBnbG9iYWwgc2VsZWN0b3IgSUQgdG8gcHJvZHVjZSBhIGxvY2FsIElELgorICBHbG9iYWxTZWxlY3Rvck1hcFR5cGUgR2xvYmFsU2VsZWN0b3JNYXA7CisKKyAgLy8vIFxicmllZiBUaGUgZ2VuZXJhdGlvbiBudW1iZXIgb2YgdGhlIGxhc3QgdGltZSB3ZSBsb2FkZWQgZGF0YSBmcm9tIHRoZQorICAvLy8gZ2xvYmFsIG1ldGhvZCBwb29sIGZvciB0aGlzIHNlbGVjdG9yLgorICBsbHZtOjpEZW5zZU1hcDxTZWxlY3RvciwgdW5zaWduZWQ+IFNlbGVjdG9yR2VuZXJhdGlvbjsKKworICAvLy8gV2hldGhlciBhIHNlbGVjdG9yIGlzIG91dCBvZiBkYXRlLiBXZSBtYXJrIGEgc2VsZWN0b3IgYXMgb3V0IG9mIGRhdGUKKyAgLy8vIGlmIHdlIGxvYWQgYW5vdGhlciBtb2R1bGUgYWZ0ZXIgdGhlIG1ldGhvZCBwb29sIGVudHJ5IHdhcyBwdWxsZWQgaW4uCisgIGxsdm06OkRlbnNlTWFwPFNlbGVjdG9yLCBib29sPiBTZWxlY3Rvck91dE9mRGF0ZTsKKworICBzdHJ1Y3QgUGVuZGluZ01hY3JvSW5mbyB7CisgICAgTW9kdWxlRmlsZSAqTTsKKyAgICB1aW50NjRfdCBNYWNyb0RpcmVjdGl2ZXNPZmZzZXQ7CisKKyAgICBQZW5kaW5nTWFjcm9JbmZvKE1vZHVsZUZpbGUgKk0sIHVpbnQ2NF90IE1hY3JvRGlyZWN0aXZlc09mZnNldCkKKyAgICAgICAgOiBNKE0pLCBNYWNyb0RpcmVjdGl2ZXNPZmZzZXQoTWFjcm9EaXJlY3RpdmVzT2Zmc2V0KSB7fQorICB9OworCisgIHVzaW5nIFBlbmRpbmdNYWNyb0lEc01hcCA9CisgICAgICBsbHZtOjpNYXBWZWN0b3I8SWRlbnRpZmllckluZm8gKiwgU21hbGxWZWN0b3I8UGVuZGluZ01hY3JvSW5mbywgMj4+OworCisgIC8vLyBcYnJpZWYgTWFwcGluZyBmcm9tIGlkZW50aWZpZXJzIHRoYXQgaGF2ZSBhIG1hY3JvIGhpc3RvcnkgdG8gdGhlIGdsb2JhbAorICAvLy8gSURzIGhhdmUgbm90IHlldCBiZWVuIGRlc2VyaWFsaXplZCB0byB0aGUgZ2xvYmFsIElEcyBvZiB0aG9zZSBtYWNyb3MuCisgIFBlbmRpbmdNYWNyb0lEc01hcCBQZW5kaW5nTWFjcm9JRHM7CisKKyAgdXNpbmcgR2xvYmFsUHJlcHJvY2Vzc2VkRW50aXR5TWFwVHlwZSA9CisgICAgICBDb250aW51b3VzUmFuZ2VNYXA8dW5zaWduZWQsIE1vZHVsZUZpbGUgKiwgND47CisKKyAgLy8vIFxicmllZiBNYXBwaW5nIGZyb20gZ2xvYmFsIHByZXByb2Nlc3NpbmcgZW50aXR5IElEcyB0byB0aGUgbW9kdWxlIGluCisgIC8vLyB3aGljaCB0aGUgcHJlcHJvY2Vzc2VkIGVudGl0eSByZXNpZGVzIGFsb25nIHdpdGggdGhlIG9mZnNldCB0aGF0IHNob3VsZCBiZQorICAvLy8gYWRkZWQgdG8gdGhlIGdsb2JhbCBwcmVwcm9jZXNzaW5nIGVudGl0eSBJRCB0byBwcm9kdWNlIGEgbG9jYWwgSUQuCisgIEdsb2JhbFByZXByb2Nlc3NlZEVudGl0eU1hcFR5cGUgR2xvYmFsUHJlcHJvY2Vzc2VkRW50aXR5TWFwOworCisgIHVzaW5nIEdsb2JhbFNraXBwZWRSYW5nZU1hcFR5cGUgPQorICAgICAgQ29udGludW91c1JhbmdlTWFwPHVuc2lnbmVkLCBNb2R1bGVGaWxlICosIDQ+OworCisgIC8vLyBcYnJpZWYgTWFwcGluZyBmcm9tIGdsb2JhbCBza2lwcGVkIHJhbmdlIGJhc2UgSURzIHRvIHRoZSBtb2R1bGUgaW4gd2hpY2gKKyAgLy8vIHRoZSBza2lwcGVkIHJhbmdlcyByZXNpZGUuCisgIEdsb2JhbFNraXBwZWRSYW5nZU1hcFR5cGUgR2xvYmFsU2tpcHBlZFJhbmdlTWFwOworCisgIC8vLyBcbmFtZSBDb2RlR2VuLXJlbGV2YW50IHNwZWNpYWwgZGF0YQorICAvLy8gXGJyaWVmIEZpZWxkcyBjb250YWluaW5nIGRhdGEgdGhhdCBpcyByZWxldmFudCB0byBDb2RlR2VuLgorICAvL0B7CisKKyAgLy8vIFxicmllZiBUaGUgSURzIG9mIGFsbCBkZWNsYXJhdGlvbnMgdGhhdCBmdWxmaWxsIHRoZSBjcml0ZXJpYSBvZgorICAvLy8gImludGVyZXN0aW5nIiBkZWNscy4KKyAgLy8vCisgIC8vLyBUaGlzIGNvbnRhaW5zIHRoZSBkYXRhIGxvYWRlZCBmcm9tIGFsbCBFQUdFUkxZX0RFU0VSSUFMSVpFRF9ERUNMUyBibG9ja3MKKyAgLy8vIGluIHRoZSBjaGFpbi4gVGhlIHJlZmVyZW5jZWQgZGVjbGFyYXRpb25zIGFyZSBkZXNlcmlhbGl6ZWQgYW5kIHBhc3NlZCB0bworICAvLy8gdGhlIGNvbnN1bWVyIGVhZ2VybHkuCisgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCAxNj4gRWFnZXJseURlc2VyaWFsaXplZERlY2xzOworCisgIC8vLyBcYnJpZWYgVGhlIElEcyBvZiBhbGwgdGVudGF0aXZlIGRlZmluaXRpb25zIHN0b3JlZCBpbiB0aGUgY2hhaW4uCisgIC8vLworICAvLy8gU2VtYSBrZWVwcyB0cmFjayBvZiBhbGwgdGVudGF0aXZlIGRlZmluaXRpb25zIGluIGEgVFUgYmVjYXVzZSBpdCBoYXMgdG8KKyAgLy8vIGNvbXBsZXRlIHRoZW0gYW5kIHBhc3MgdGhlbSBvbiB0byBDb2RlR2VuLiBUaHVzLCB0ZW50YXRpdmUgZGVmaW5pdGlvbnMgaW4KKyAgLy8vIHRoZSBQQ0ggY2hhaW4gbXVzdCBiZSBlYWdlcmx5IGRlc2VyaWFsaXplZC4KKyAgU21hbGxWZWN0b3I8dWludDY0X3QsIDE2PiBUZW50YXRpdmVEZWZpbml0aW9uczsKKworICAvLy8gXGJyaWVmIFRoZSBJRHMgb2YgYWxsIENYWFJlY29yZERlY2xzIHN0b3JlZCBpbiB0aGUgY2hhaW4gd2hvc2UgVlRhYmxlcyBhcmUKKyAgLy8vIHVzZWQuCisgIC8vLworICAvLy8gQ29kZUdlbiBoYXMgdG8gZW1pdCBWVGFibGVzIGZvciB0aGVzZSByZWNvcmRzLCBzbyB0aGV5IGhhdmUgdG8gYmUgZWFnZXJseQorICAvLy8gZGVzZXJpYWxpemVkLgorICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgNjQ+IFZUYWJsZVVzZXM7CisKKyAgLy8vIFxicmllZiBBIHNuYXBzaG90IG9mIHRoZSBwZW5kaW5nIGluc3RhbnRpYXRpb25zIGluIHRoZSBjaGFpbi4KKyAgLy8vCisgIC8vLyBUaGlzIHJlY29yZCB0cmFja3MgdGhlIGluc3RhbnRpYXRpb25zIHRoYXQgU2VtYSBoYXMgdG8gcGVyZm9ybSBhdCB0aGUKKyAgLy8vIGVuZCBvZiB0aGUgVFUuIEl0IGNvbnNpc3RzIG9mIGEgcGFpciBvZiB2YWx1ZXMgZm9yIGV2ZXJ5IHBlbmRpbmcKKyAgLy8vIGluc3RhbnRpYXRpb24gd2hlcmUgdGhlIGZpcnN0IHZhbHVlIGlzIHRoZSBJRCBvZiB0aGUgZGVjbCBhbmQgdGhlIHNlY29uZAorICAvLy8gaXMgdGhlIGluc3RhbnRpYXRpb24gbG9jYXRpb24uCisgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCA2ND4gUGVuZGluZ0luc3RhbnRpYXRpb25zOworCisgIC8vQH0KKworICAvLy8gXG5hbWUgRGlhZ25vc3RpY3NFbmdpbmUtcmVsZXZhbnQgc3BlY2lhbCBkYXRhCisgIC8vLyBcYnJpZWYgRmllbGRzIGNvbnRhaW5pbmcgZGF0YSB0aGF0IGlzIHVzZWQgZm9yIGdlbmVyYXRpbmcgZGlhZ25vc3RpY3MKKyAgLy9AeworCisgIC8vLyBcYnJpZWYgQSBzbmFwc2hvdCBvZiBTZW1hJ3MgdW51c2VkIGZpbGUtc2NvcGVkIHZhcmlhYmxlIHRyYWNraW5nLCBmb3IKKyAgLy8vIGdlbmVyYXRpbmcgd2FybmluZ3MuCisgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCAxNj4gVW51c2VkRmlsZVNjb3BlZERlY2xzOworCisgIC8vLyBcYnJpZWYgQSBsaXN0IG9mIGFsbCB0aGUgZGVsZWdhdGluZyBjb25zdHJ1Y3RvcnMgd2UndmUgc2VlbiwgdG8gZGlhZ25vc2UKKyAgLy8vIGN5Y2xlcy4KKyAgU21hbGxWZWN0b3I8dWludDY0X3QsIDQ+IERlbGVnYXRpbmdDdG9yRGVjbHM7CisKKyAgLy8vIFxicmllZiBNZXRob2Qgc2VsZWN0b3JzIHVzZWQgaW4gYSBAc2VsZWN0b3IgZXhwcmVzc2lvbi4gVXNlZCBmb3IKKyAgLy8vIGltcGxlbWVudGF0aW9uIG9mIC1Xc2VsZWN0b3IuCisgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCA2ND4gUmVmZXJlbmNlZFNlbGVjdG9yc0RhdGE7CisKKyAgLy8vIFxicmllZiBBIHNuYXBzaG90IG9mIFNlbWEncyB3ZWFrIHVuZGVjbGFyZWQgaWRlbnRpZmllciB0cmFja2luZywgZm9yCisgIC8vLyBnZW5lcmF0aW5nIHdhcm5pbmdzLgorICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgNjQ+IFdlYWtVbmRlY2xhcmVkSWRlbnRpZmllcnM7CisKKyAgLy8vIFxicmllZiBUaGUgSURzIG9mIHR5cGUgYWxpYXNlcyBmb3IgZXh0X3ZlY3RvcnMgdGhhdCBleGlzdCBpbiB0aGUgY2hhaW4uCisgIC8vLworICAvLy8gVXNlZCBieSBTZW1hIGZvciBmaW5kaW5nIHN1Z2FyZWQgbmFtZXMgZm9yIGV4dF92ZWN0b3JzIGluIGRpYWdub3N0aWNzLgorICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgND4gRXh0VmVjdG9yRGVjbHM7CisKKyAgLy9AfQorCisgIC8vLyBcbmFtZSBTZW1hLXJlbGV2YW50IHNwZWNpYWwgZGF0YQorICAvLy8gXGJyaWVmIEZpZWxkcyBjb250YWluaW5nIGRhdGEgdGhhdCBpcyB1c2VkIGZvciBzZW1hbnRpYyBhbmFseXNpcworICAvL0B7CisKKyAgLy8vIFxicmllZiBUaGUgSURzIG9mIGFsbCBwb3RlbnRpYWxseSB1bnVzZWQgdHlwZWRlZiBuYW1lcyBpbiB0aGUgY2hhaW4uCisgIC8vLworICAvLy8gU2VtYSB0cmFja3MgdGhlc2UgdG8gZW1pdCB3YXJuaW5ncy4KKyAgU21hbGxWZWN0b3I8dWludDY0X3QsIDE2PiBVbnVzZWRMb2NhbFR5cGVkZWZOYW1lQ2FuZGlkYXRlczsKKworICAvLy8gXGJyaWVmIE91ciBjdXJyZW50IGRlcHRoIGluICNwcmFnbWEgY3VkYSBmb3JjZV9ob3N0X2RldmljZSBiZWdpbi9lbmQKKyAgLy8vIG1hY3Jvcy4KKyAgdW5zaWduZWQgRm9yY2VDVURBSG9zdERldmljZURlcHRoID0gMDsKKworICAvLy8gXGJyaWVmIFRoZSBJRHMgb2YgdGhlIGRlY2xhcmF0aW9ucyBTZW1hIHN0b3JlcyBkaXJlY3RseS4KKyAgLy8vCisgIC8vLyBTZW1hIHRyYWNrcyBhIGZldyBpbXBvcnRhbnQgZGVjbHMsIHN1Y2ggYXMgbmFtZXNwYWNlIHN0ZCwgZGlyZWN0bHkuCisgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCA0PiBTZW1hRGVjbFJlZnM7CisKKyAgLy8vIFxicmllZiBUaGUgSURzIG9mIHRoZSB0eXBlcyBBU1RDb250ZXh0IHN0b3JlcyBkaXJlY3RseS4KKyAgLy8vCisgIC8vLyBUaGUgQVNUIGNvbnRleHQgdHJhY2tzIGEgZmV3IGltcG9ydGFudCB0eXBlcywgc3VjaCBhcyB2YV9saXN0LCBkaXJlY3RseS4KKyAgU21hbGxWZWN0b3I8dWludDY0X3QsIDE2PiBTcGVjaWFsVHlwZXM7CisKKyAgLy8vIFxicmllZiBUaGUgSURzIG9mIENVREEtc3BlY2lmaWMgZGVjbGFyYXRpb25zIEFTVENvbnRleHQgc3RvcmVzIGRpcmVjdGx5LgorICAvLy8KKyAgLy8vIFRoZSBBU1QgY29udGV4dCB0cmFja3MgYSBmZXcgaW1wb3J0YW50IGRlY2xzLCBjdXJyZW50bHkgY3VkYUNvbmZpZ3VyZUNhbGwsCisgIC8vLyBkaXJlY3RseS4KKyAgU21hbGxWZWN0b3I8dWludDY0X3QsIDI+IENVREFTcGVjaWFsRGVjbFJlZnM7CisKKyAgLy8vIFxicmllZiBUaGUgZmxvYXRpbmcgcG9pbnQgcHJhZ21hIG9wdGlvbiBzZXR0aW5ncy4KKyAgU21hbGxWZWN0b3I8dWludDY0X3QsIDE+IEZQUHJhZ21hT3B0aW9uczsKKworICAvLy8gXGJyaWVmIFRoZSBwcmFnbWEgY2xhbmcgb3B0aW1pemUgbG9jYXRpb24gKGlmIHRoZSBwcmFnbWEgc3RhdGUgaXMgIm9mZiIpLgorICBTb3VyY2VMb2NhdGlvbiBPcHRpbWl6ZU9mZlByYWdtYUxvY2F0aW9uOworCisgIC8vLyBcYnJpZWYgVGhlIFByYWdtYU1TU3RydWN0S2luZCBwcmFnbWEgbXNfc3RydWN0IHN0YXRlIGlmIHNldCwgb3IgLTEuCisgIGludCBQcmFnbWFNU1N0cnVjdFN0YXRlID0gLTE7CisKKyAgLy8vIFxicmllZiBUaGUgUHJhZ21hTVNQb2ludGVyc1RvTWVtYmVyc0tpbmQgcHJhZ21hIHBvaW50ZXJzX3RvX21lbWJlcnMgc3RhdGUuCisgIGludCBQcmFnbWFNU1BvaW50ZXJzVG9NZW1iZXJzU3RhdGUgPSAtMTsKKyAgU291cmNlTG9jYXRpb24gUG9pbnRlcnNUb01lbWJlcnNQcmFnbWFMb2NhdGlvbjsKKworICAvLy8gXGJyaWVmIFRoZSBwcmFnbWEgcGFjayBzdGF0ZS4KKyAgT3B0aW9uYWw8dW5zaWduZWQ+IFByYWdtYVBhY2tDdXJyZW50VmFsdWU7CisgIFNvdXJjZUxvY2F0aW9uIFByYWdtYVBhY2tDdXJyZW50TG9jYXRpb247CisgIHN0cnVjdCBQcmFnbWFQYWNrU3RhY2tFbnRyeSB7CisgICAgdW5zaWduZWQgVmFsdWU7CisgICAgU291cmNlTG9jYXRpb24gTG9jYXRpb247CisgICAgU291cmNlTG9jYXRpb24gUHVzaExvY2F0aW9uOworICAgIFN0cmluZ1JlZiBTbG90TGFiZWw7CisgIH07CisgIGxsdm06OlNtYWxsVmVjdG9yPFByYWdtYVBhY2tTdGFja0VudHJ5LCAyPiBQcmFnbWFQYWNrU3RhY2s7CisgIGxsdm06OlNtYWxsVmVjdG9yPHN0ZDo6c3RyaW5nLCAyPiBQcmFnbWFQYWNrU3RyaW5nczsKKworICAvLy8gXGJyaWVmIFRoZSBPcGVuQ0wgZXh0ZW5zaW9uIHNldHRpbmdzLgorICBPcGVuQ0xPcHRpb25zIE9wZW5DTEV4dGVuc2lvbnM7CisKKyAgLy8vIFxicmllZiBFeHRlbnNpb25zIHJlcXVpcmVkIGJ5IGFuIE9wZW5DTCB0eXBlLgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBUeXBlICosIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPj4gT3BlbkNMVHlwZUV4dE1hcDsKKworICAvLy8gXGJyaWVmIEV4dGVuc2lvbnMgcmVxdWlyZWQgYnkgYW4gT3BlbkNMIGRlY2xhcmF0aW9uLgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBEZWNsICosIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPj4gT3BlbkNMRGVjbEV4dE1hcDsKKworICAvLy8gXGJyaWVmIEEgbGlzdCBvZiB0aGUgbmFtZXNwYWNlcyB3ZSd2ZSBzZWVuLgorICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgND4gS25vd25OYW1lc3BhY2VzOworCisgIC8vLyBcYnJpZWYgQSBsaXN0IG9mIHVuZGVmaW5lZCBkZWNscyB3aXRoIGludGVybmFsIGxpbmthZ2UgZm9sbG93ZWQgYnkgdGhlCisgIC8vLyBTb3VyY2VMb2NhdGlvbiBvZiBhIG1hdGNoaW5nIE9EUi11c2UuCisgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCA4PiBVbmRlZmluZWRCdXRVc2VkOworCisgIC8vLyBcYnJpZWYgRGVsZXRlIGV4cHJlc3Npb25zIHRvIGFuYWx5emUgYXQgdGhlIGVuZCBvZiB0cmFuc2xhdGlvbiB1bml0LgorICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgOD4gRGVsYXllZERlbGV0ZUV4cHJzOworCisgIC8vIFxicmllZiBBIGxpc3Qgb2YgbGF0ZSBwYXJzZWQgdGVtcGxhdGUgZnVuY3Rpb24gZGF0YS4KKyAgU21hbGxWZWN0b3I8dWludDY0X3QsIDE+IExhdGVQYXJzZWRUZW1wbGF0ZXM7CisKK3B1YmxpYzoKKyAgc3RydWN0IEltcG9ydGVkU3VibW9kdWxlIHsKKyAgICBzZXJpYWxpemF0aW9uOjpTdWJtb2R1bGVJRCBJRDsKKyAgICBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2M7CisKKyAgICBJbXBvcnRlZFN1Ym1vZHVsZShzZXJpYWxpemF0aW9uOjpTdWJtb2R1bGVJRCBJRCwgU291cmNlTG9jYXRpb24gSW1wb3J0TG9jKQorICAgICAgICA6IElEKElEKSwgSW1wb3J0TG9jKEltcG9ydExvYykge30KKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBBIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IHdlcmUgaW1wb3J0ZWQgYnkgcHJlY29tcGlsZWQgaGVhZGVycyBvcgorICAvLy8gYW55IG90aGVyIG5vbi1tb2R1bGUgQVNUIGZpbGUuCisgIFNtYWxsVmVjdG9yPEltcG9ydGVkU3VibW9kdWxlLCAyPiBJbXBvcnRlZE1vZHVsZXM7CisgIC8vQH0KKworICAvLy8gXGJyaWVmIFRoZSBzeXN0ZW0gaW5jbHVkZSByb290IHRvIGJlIHVzZWQgd2hlbiBsb2FkaW5nIHRoZQorICAvLy8gcHJlY29tcGlsZWQgaGVhZGVyLgorICBzdGQ6OnN0cmluZyBpc3lzcm9vdDsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgbm9ybWFsIHZhbGlkYXRpb24gcGVyZm9ybWVkIG9uIHByZWNvbXBpbGVkCisgIC8vLyBoZWFkZXJzIHdoZW4gdGhleSBhcmUgbG9hZGVkLgorICBib29sIERpc2FibGVWYWxpZGF0aW9uOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0byBhY2NlcHQgYW4gQVNUIGZpbGUgd2l0aCBjb21waWxlciBlcnJvcnMuCisgIGJvb2wgQWxsb3dBU1RXaXRoQ29tcGlsZXJFcnJvcnM7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRvIGFjY2VwdCBhbiBBU1QgZmlsZSB0aGF0IGhhcyBhIGRpZmZlcmVudCBjb25maWd1cmF0aW9uCisgIC8vLyBmcm9tIHRoZSBjdXJyZW50IGNvbXBpbGVyIGluc3RhbmNlLgorICBib29sIEFsbG93Q29uZmlndXJhdGlvbk1pc21hdGNoOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB2YWxpZGF0ZSBzeXN0ZW0gaW5wdXQgZmlsZXMuCisgIGJvb2wgVmFsaWRhdGVTeXN0ZW1JbnB1dHM7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHdlIGFyZSBhbGxvd2VkIHRvIHVzZSB0aGUgZ2xvYmFsIG1vZHVsZSBpbmRleC4KKyAgYm9vbCBVc2VHbG9iYWxJbmRleDsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgd2UgaGF2ZSB0cmllZCBsb2FkaW5nIHRoZSBnbG9iYWwgbW9kdWxlIGluZGV4IHlldC4KKyAgYm9vbCBUcmllZExvYWRpbmdHbG9iYWxJbmRleCA9IGZhbHNlOworCisgIC8vL1xicmllZiBXaGV0aGVyIHdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZyB1cGRhdGUgcmVjb3Jkcy4KKyAgYm9vbCBQcm9jZXNzaW5nVXBkYXRlUmVjb3JkcyA9IGZhbHNlOworCisgIHVzaW5nIFN3aXRjaENhc2VNYXBUeSA9IGxsdm06OkRlbnNlTWFwPHVuc2lnbmVkLCBTd2l0Y2hDYXNlICo+OworCisgIC8vLyBcYnJpZWYgTWFwcGluZyBmcm9tIHN3aXRjaC1jYXNlIElEcyBpbiB0aGUgY2hhaW4gdG8gc3dpdGNoLWNhc2Ugc3RhdGVtZW50cworICAvLy8KKyAgLy8vIFN0YXRlbWVudHMgdXN1YWxseSBkb24ndCBoYXZlIElEcywgYnV0IHN3aXRjaCBjYXNlcyBuZWVkIHRoZW0sIHNvIHRoYXQgdGhlCisgIC8vLyBzd2l0Y2ggc3RhdGVtZW50IGNhbiByZWZlciB0byB0aGVtLgorICBTd2l0Y2hDYXNlTWFwVHkgU3dpdGNoQ2FzZVN0bXRzOworCisgIFN3aXRjaENhc2VNYXBUeSAqQ3VyclN3aXRjaENhc2VTdG10czsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2Ygc291cmNlIGxvY2F0aW9uIGVudHJpZXMgZGUtc2VyaWFsaXplZCBmcm9tCisgIC8vLyB0aGUgUENIIGZpbGUuCisgIHVuc2lnbmVkIE51bVNMb2NFbnRyaWVzUmVhZCA9IDA7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHNvdXJjZSBsb2NhdGlvbiBlbnRyaWVzIGluIHRoZSBjaGFpbi4KKyAgdW5zaWduZWQgVG90YWxOdW1TTG9jRW50cmllcyA9IDA7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHN0YXRlbWVudHMgKGFuZCBleHByZXNzaW9ucykgZGUtc2VyaWFsaXplZAorICAvLy8gZnJvbSB0aGUgY2hhaW4uCisgIHVuc2lnbmVkIE51bVN0YXRlbWVudHNSZWFkID0gMDsKKworICAvLy8gXGJyaWVmIFRoZSB0b3RhbCBudW1iZXIgb2Ygc3RhdGVtZW50cyAoYW5kIGV4cHJlc3Npb25zKSBzdG9yZWQKKyAgLy8vIGluIHRoZSBjaGFpbi4KKyAgdW5zaWduZWQgVG90YWxOdW1TdGF0ZW1lbnRzID0gMDsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgbWFjcm9zIGRlLXNlcmlhbGl6ZWQgZnJvbSB0aGUgY2hhaW4uCisgIHVuc2lnbmVkIE51bU1hY3Jvc1JlYWQgPSAwOworCisgIC8vLyBcYnJpZWYgVGhlIHRvdGFsIG51bWJlciBvZiBtYWNyb3Mgc3RvcmVkIGluIHRoZSBjaGFpbi4KKyAgdW5zaWduZWQgVG90YWxOdW1NYWNyb3MgPSAwOworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBsb29rdXBzIGludG8gaWRlbnRpZmllciB0YWJsZXMuCisgIHVuc2lnbmVkIE51bUlkZW50aWZpZXJMb29rdXBzID0gMDsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgbG9va3VwcyBpbnRvIGlkZW50aWZpZXIgdGFibGVzIHRoYXQgc3VjY2VlZC4KKyAgdW5zaWduZWQgTnVtSWRlbnRpZmllckxvb2t1cEhpdHMgPSAwOworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBzZWxlY3RvcnMgdGhhdCBoYXZlIGJlZW4gcmVhZC4KKyAgdW5zaWduZWQgTnVtU2VsZWN0b3JzUmVhZCA9IDA7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIG1ldGhvZCBwb29sIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gcmVhZC4KKyAgdW5zaWduZWQgTnVtTWV0aG9kUG9vbEVudHJpZXNSZWFkID0gMDsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgdGltZXMgd2UgaGF2ZSBsb29rZWQgdXAgYSBzZWxlY3RvciBpbiB0aGUgbWV0aG9kCisgIC8vLyBwb29sLgorICB1bnNpZ25lZCBOdW1NZXRob2RQb29sTG9va3VwcyA9IDA7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHRpbWVzIHdlIGhhdmUgbG9va2VkIHVwIGEgc2VsZWN0b3IgaW4gdGhlIG1ldGhvZAorICAvLy8gcG9vbCBhbmQgZm91bmQgc29tZXRoaW5nLgorICB1bnNpZ25lZCBOdW1NZXRob2RQb29sSGl0cyA9IDA7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHRpbWVzIHdlIGhhdmUgbG9va2VkIHVwIGEgc2VsZWN0b3IgaW4gdGhlIG1ldGhvZAorICAvLy8gcG9vbCB3aXRoaW4gYSBzcGVjaWZpYyBtb2R1bGUuCisgIHVuc2lnbmVkIE51bU1ldGhvZFBvb2xUYWJsZUxvb2t1cHMgPSAwOworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiB0aW1lcyB3ZSBoYXZlIGxvb2tlZCB1cCBhIHNlbGVjdG9yIGluIHRoZSBtZXRob2QKKyAgLy8vIHBvb2wgd2l0aGluIGEgc3BlY2lmaWMgbW9kdWxlIGFuZCBmb3VuZCBzb21ldGhpbmcuCisgIHVuc2lnbmVkIE51bU1ldGhvZFBvb2xUYWJsZUhpdHMgPSAwOworCisgIC8vLyBcYnJpZWYgVGhlIHRvdGFsIG51bWJlciBvZiBtZXRob2QgcG9vbCBlbnRyaWVzIGluIHRoZSBzZWxlY3RvciB0YWJsZS4KKyAgdW5zaWduZWQgVG90YWxOdW1NZXRob2RQb29sRW50cmllcyA9IDA7CisKKyAgLy8vIE51bWJlciBvZiBsZXhpY2FsIGRlY2wgY29udGV4dHMgcmVhZC90b3RhbC4KKyAgdW5zaWduZWQgTnVtTGV4aWNhbERlY2xDb250ZXh0c1JlYWQgPSAwLCBUb3RhbExleGljYWxEZWNsQ29udGV4dHMgPSAwOworCisgIC8vLyBOdW1iZXIgb2YgdmlzaWJsZSBkZWNsIGNvbnRleHRzIHJlYWQvdG90YWwuCisgIHVuc2lnbmVkIE51bVZpc2libGVEZWNsQ29udGV4dHNSZWFkID0gMCwgVG90YWxWaXNpYmxlRGVjbENvbnRleHRzID0gMDsKKworICAvLy8gVG90YWwgc2l6ZSBvZiBtb2R1bGVzLCBpbiBiaXRzLCBjdXJyZW50bHkgbG9hZGVkCisgIHVpbnQ2NF90IFRvdGFsTW9kdWxlc1NpemVJbkJpdHMgPSAwOworCisgIC8vLyBcYnJpZWYgTnVtYmVyIG9mIERlY2wvdHlwZXMgdGhhdCBhcmUgY3VycmVudGx5IGRlc2VyaWFsaXppbmcuCisgIHVuc2lnbmVkIE51bUN1cnJlbnRFbGVtZW50c0Rlc2VyaWFsaXppbmcgPSAwOworCisgIC8vLyBcYnJpZWYgU2V0IHRydWUgd2hpbGUgd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIHBhc3NpbmcgZGVzZXJpYWxpemVkCisgIC8vLyAiaW50ZXJlc3RpbmciIGRlY2xzIHRvIGNvbnN1bWVyIGluc2lkZSBGaW5pc2hlZERlc2VyaWFsaXppbmcoKS4KKyAgLy8vIFRoaXMgaXMgdXNlZCBhcyBhIGd1YXJkIHRvIGF2b2lkIHJlY3Vyc2l2ZWx5IHJlcGVhdGluZyB0aGUgcHJvY2VzcyBvZgorICAvLy8gcGFzc2luZyBkZWNscyB0byBjb25zdW1lci4KKyAgYm9vbCBQYXNzaW5nRGVjbHNUb0NvbnN1bWVyID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBUaGUgc2V0IG9mIGlkZW50aWZpZXJzIHRoYXQgd2VyZSByZWFkIHdoaWxlIHRoZSBBU1QgcmVhZGVyIHdhcworICAvLy8gKHJlY3Vyc2l2ZWx5KSBsb2FkaW5nIGRlY2xhcmF0aW9ucy4KKyAgLy8vCisgIC8vLyBUaGUgZGVjbGFyYXRpb25zIG9uIHRoZSBpZGVudGlmaWVyIGNoYWluIGZvciB0aGVzZSBpZGVudGlmaWVycyB3aWxsIGJlCisgIC8vLyBsb2FkZWQgb25jZSB0aGUgcmVjdXJzaXZlIGxvYWRpbmcgaGFzIGNvbXBsZXRlZC4KKyAgbGx2bTo6TWFwVmVjdG9yPElkZW50aWZpZXJJbmZvICosIFNtYWxsVmVjdG9yPHVpbnQzMl90LCA0Pj4KKyAgICBQZW5kaW5nSWRlbnRpZmllckluZm9zOworCisgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiBsb29rdXAgcmVzdWx0cyB0aGF0IHdlIGhhdmUgZmFrZWQgaW4gb3JkZXIgdG8gc3VwcG9ydAorICAvLy8gbWVyZ2luZyBvZiBwYXJ0aWFsbHkgZGVzZXJpYWxpemVkIGRlY2xzIGJ1dCB0aGF0IHdlIGhhdmUgbm90IHlldCByZW1vdmVkLgorICBsbHZtOjpTbWFsbE1hcFZlY3RvcjxJZGVudGlmaWVySW5mbyAqLCBTbWFsbFZlY3RvcjxOYW1lZERlY2wqLCAyPiwgMTY+CisgICAgUGVuZGluZ0Zha2VMb29rdXBSZXN1bHRzOworCisgIC8vLyBcYnJpZWYgVGhlIGdlbmVyYXRpb24gbnVtYmVyIG9mIGVhY2ggaWRlbnRpZmllciwgd2hpY2gga2VlcHMgdHJhY2sgb2YKKyAgLy8vIHRoZSBsYXN0IHRpbWUgd2UgbG9hZGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaWRlbnRpZmllci4KKyAgbGx2bTo6RGVuc2VNYXA8SWRlbnRpZmllckluZm8gKiwgdW5zaWduZWQ+IElkZW50aWZpZXJHZW5lcmF0aW9uOworCisgIGNsYXNzIEludGVyZXN0aW5nRGVjbCB7CisgICAgRGVjbCAqRDsKKyAgICBib29sIERlY2xIYXNQZW5kaW5nQm9keTsKKworICBwdWJsaWM6CisgICAgSW50ZXJlc3RpbmdEZWNsKERlY2wgKkQsIGJvb2wgSGFzQm9keSkKKyAgICAgICAgOiBEKEQpLCBEZWNsSGFzUGVuZGluZ0JvZHkoSGFzQm9keSkge30KKworICAgIERlY2wgKmdldERlY2woKSB7IHJldHVybiBEOyB9CisKKyAgICAvLy8gV2hldGhlciB0aGUgZGVjbGFyYXRpb24gaGFzIGEgcGVuZGluZyBib2R5LgorICAgIGJvb2wgaGFzUGVuZGluZ0JvZHkoKSB7IHJldHVybiBEZWNsSGFzUGVuZGluZ0JvZHk7IH0KKyAgfTsKKworICAvLy8gXGJyaWVmIENvbnRhaW5zIGRlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgdGhhdCBjb3VsZCBiZQorICAvLy8gImludGVyZXN0aW5nIiB0byB0aGUgQVNUQ29uc3VtZXIsIHdoZW4gd2UgZ2V0IHRoYXQgQVNUIGNvbnN1bWVyLgorICAvLy8KKyAgLy8vICJJbnRlcmVzdGluZyIgZGVjbGFyYXRpb25zIGFyZSB0aG9zZSB0aGF0IGhhdmUgZGF0YSB0aGF0IG1heQorICAvLy8gbmVlZCB0byBiZSBlbWl0dGVkLCBzdWNoIGFzIGlubGluZSBmdW5jdGlvbiBkZWZpbml0aW9ucyBvcgorICAvLy8gT2JqZWN0aXZlLUMgcHJvdG9jb2xzLgorICBzdGQ6OmRlcXVlPEludGVyZXN0aW5nRGVjbD4gUG90ZW50aWFsbHlJbnRlcmVzdGluZ0RlY2xzOworCisgIC8vLyBcYnJpZWYgVGhlIGxpc3Qgb2YgcmVkZWNsYXJhdGlvbiBjaGFpbnMgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIAorICAvLy8gcmVjb25zdHJ1Y3RlZCwgYW5kIHRoZSBsb2NhbCBvZmZzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbGlzdAorICAvLy8gb2YgcmVkZWNsYXJhdGlvbnMuCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxEZWNsICosIHVpbnQ2NF90PiwgMTY+IFBlbmRpbmdEZWNsQ2hhaW5zOworCisgIC8vLyBcYnJpZWYgVGhlIGxpc3Qgb2YgY2Fub25pY2FsIGRlY2xhcmF0aW9ucyB3aG9zZSByZWRlY2xhcmF0aW9uIGNoYWlucworICAvLy8gbmVlZCB0byBiZSBtYXJrZWQgYXMgaW5jb21wbGV0ZSBvbmNlIHdlJ3JlIGRvbmUgZGVzZXJpYWxpemluZyB0aGluZ3MuCisgIFNtYWxsVmVjdG9yPERlY2wgKiwgMTY+IFBlbmRpbmdJbmNvbXBsZXRlRGVjbENoYWluczsKKworICAvLy8gXGJyaWVmIFRoZSBEZWNsIElEcyBmb3IgdGhlIFNlbWEvTGV4aWNhbCBEZWNsQ29udGV4dCBvZiBhIERlY2wgdGhhdCBoYXMKKyAgLy8vIGJlZW4gbG9hZGVkIGJ1dCBpdHMgRGVjbENvbnRleHQgd2FzIG5vdCBzZXQgeWV0LgorICBzdHJ1Y3QgUGVuZGluZ0RlY2xDb250ZXh0SW5mbyB7CisgICAgRGVjbCAqRDsKKyAgICBzZXJpYWxpemF0aW9uOjpHbG9iYWxEZWNsSUQgU2VtYURDOworICAgIHNlcmlhbGl6YXRpb246Okdsb2JhbERlY2xJRCBMZXhpY2FsREM7CisgIH07CisKKyAgLy8vIFxicmllZiBUaGUgc2V0IG9mIERlY2xzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBidXQgdGhlaXIgRGVjbENvbnRleHRzIGFyZQorICAvLy8gbm90IHNldCB5ZXQuCisgIC8vLworICAvLy8gVGhlIERlY2xDb250ZXh0cyBmb3IgdGhlc2UgRGVjbHMgd2lsbCBiZSBzZXQgb25jZSByZWN1cnNpdmUgbG9hZGluZyBoYXMKKyAgLy8vIGJlZW4gY29tcGxldGVkLgorICBzdGQ6OmRlcXVlPFBlbmRpbmdEZWNsQ29udGV4dEluZm8+IFBlbmRpbmdEZWNsQ29udGV4dEluZm9zOworCisgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiBOYW1lZERlY2xzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCwgYnV0IGFyZSBtZW1iZXJzIG9mIGEKKyAgLy8vIGNvbnRleHQgdGhhdCBoYXMgYmVlbiBtZXJnZWQgaW50byBhbm90aGVyIGNvbnRleHQgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcKKyAgLy8vIGRlY2xhcmF0aW9uIGlzIGVpdGhlciBtaXNzaW5nIG9yIGhhcyBub3QgeWV0IGJlZW4gbG9hZGVkLgorICAvLy8KKyAgLy8vIFdlIHdpbGwgY2hlY2sgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBkZWNsYXJhdGlvbiBpcyBpbiBmYWN0IG1pc3NpbmcKKyAgLy8vIG9uY2UgcmVjdXJzaW5nIGxvYWRpbmcgaGFzIGJlZW4gY29tcGxldGVkLgorICBsbHZtOjpTbWFsbFZlY3RvcjxOYW1lZERlY2wgKiwgMTY+IFBlbmRpbmdPZHJNZXJnZUNoZWNrczsKKworICB1c2luZyBEYXRhUG9pbnRlcnMgPQorICAgICAgc3RkOjpwYWlyPENYWFJlY29yZERlY2wgKiwgc3RydWN0IENYWFJlY29yZERlY2w6OkRlZmluaXRpb25EYXRhICo+OworCisgIC8vLyBcYnJpZWYgUmVjb3JkIGRlZmluaXRpb25zIGluIHdoaWNoIHdlIGZvdW5kIGFuIE9EUiB2aW9sYXRpb24uCisgIGxsdm06OlNtYWxsRGVuc2VNYXA8Q1hYUmVjb3JkRGVjbCAqLCBsbHZtOjpTbWFsbFZlY3RvcjxEYXRhUG9pbnRlcnMsIDI+LCAyPgorICAgICAgUGVuZGluZ09kck1lcmdlRmFpbHVyZXM7CisKKyAgLy8vIFxicmllZiBGdW5jdGlvbiBkZWZpbml0aW9ucyBpbiB3aGljaCB3ZSBmb3VuZCBhbiBPRFIgdmlvbGF0aW9uLgorICBsbHZtOjpTbWFsbERlbnNlTWFwPEZ1bmN0aW9uRGVjbCAqLCBsbHZtOjpTbWFsbFZlY3RvcjxGdW5jdGlvbkRlY2wgKiwgMj4sIDI+CisgICAgICBQZW5kaW5nRnVuY3Rpb25PZHJNZXJnZUZhaWx1cmVzOworCisgIC8vLyBcYnJpZWYgRGVjbENvbnRleHRzIGluIHdoaWNoIHdlIGhhdmUgZGlhZ25vc2VkIGFuIE9EUiB2aW9sYXRpb24uCisgIGxsdm06OlNtYWxsUHRyU2V0PERlY2xDb250ZXh0KiwgMj4gRGlhZ25vc2VkT2RyTWVyZ2VGYWlsdXJlczsKKworICAvLy8gXGJyaWVmIFRoZSBzZXQgb2YgT2JqZWN0aXZlLUMgY2F0ZWdvcmllcyB0aGF0IGhhdmUgYmVlbiBkZXNlcmlhbGl6ZWQKKyAgLy8vIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlY2xhcmF0aW9uIGNoYWlucyB3ZXJlIGxpbmtlZC4KKyAgbGx2bTo6U21hbGxQdHJTZXQ8T2JqQ0NhdGVnb3J5RGVjbCAqLCAxNj4gQ2F0ZWdvcmllc0Rlc2VyaWFsaXplZDsKKworICAvLy8gXGJyaWVmIFRoZSBzZXQgb2YgT2JqZWN0aXZlLUMgY2xhc3MgZGVmaW5pdGlvbnMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbgorICAvLy8gbG9hZGVkLCBmb3Igd2hpY2ggd2Ugd2lsbCBuZWVkIHRvIGNoZWNrIGZvciBjYXRlZ29yaWVzIHdoZW5ldmVyIGEgbmV3CisgIC8vLyBtb2R1bGUgaXMgbG9hZGVkLgorICBTbWFsbFZlY3RvcjxPYmpDSW50ZXJmYWNlRGVjbCAqLCAxNj4gT2JqQ0NsYXNzZXNMb2FkZWQ7CisKKyAgdXNpbmcgS2V5RGVjbHNNYXAgPQorICAgICAgbGx2bTo6RGVuc2VNYXA8RGVjbCAqLCBTbWFsbFZlY3RvcjxzZXJpYWxpemF0aW9uOjpEZWNsSUQsIDI+PjsKKyAgICAKKyAgLy8vIFxicmllZiBBIG1hcHBpbmcgZnJvbSBjYW5vbmljYWwgZGVjbGFyYXRpb25zIHRvIHRoZSBzZXQgb2YgZ2xvYmFsCisgIC8vLyBkZWNsYXJhdGlvbiBJRHMgZm9yIGtleSBkZWNsYXJhdGlvbiB0aGF0IGhhdmUgYmVlbiBtZXJnZWQgd2l0aCB0aGF0CisgIC8vLyBjYW5vbmljYWwgZGVjbGFyYXRpb24uIEEga2V5IGRlY2xhcmF0aW9uIGlzIGEgZm9ybWVybHktY2Fub25pY2FsCisgIC8vLyBkZWNsYXJhdGlvbiB3aG9zZSBtb2R1bGUgZGlkIG5vdCBpbXBvcnQgYW55IG90aGVyIGtleSBkZWNsYXJhdGlvbiBmb3IgdGhhdAorICAvLy8gZW50aXR5LiBUaGVzZSBhcmUgdGhlIElEcyB0aGF0IHdlIHVzZSBhcyBrZXlzIHdoZW4gZmluZGluZyByZWRlY2wgY2hhaW5zLgorICBLZXlEZWNsc01hcCBLZXlEZWNsczsKKyAgCisgIC8vLyBcYnJpZWYgQSBtYXBwaW5nIGZyb20gRGVjbENvbnRleHRzIHRvIHRoZSBzZW1hbnRpYyBEZWNsQ29udGV4dCB0aGF0IHdlCisgIC8vLyBhcmUgdHJlYXRpbmcgYXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGVudGl0eS4gVGhpcyBpcyB1c2VkLCBmb3IgaW5zdGFuY2UsCisgIC8vLyB3aGVuIG1lcmdpbmcgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgb2YgY2xhc3MgdGVtcGxhdGVzIGFjcm9zcyBtb2R1bGVzLgorICBsbHZtOjpEZW5zZU1hcDxEZWNsQ29udGV4dCAqLCBEZWNsQ29udGV4dCAqPiBNZXJnZWREZWNsQ29udGV4dHM7CisKKyAgLy8vIFxicmllZiBBIG1hcHBpbmcgZnJvbSBjYW5vbmljYWwgZGVjbGFyYXRpb25zIG9mIGVudW1zIHRvIHRoZWlyIGNhbm9uaWNhbAorICAvLy8gZGVmaW5pdGlvbnMuIE9ubHkgcG9wdWxhdGVkIHdoZW4gdXNpbmcgbW9kdWxlcyBpbiBDKysuCisgIGxsdm06OkRlbnNlTWFwPEVudW1EZWNsICosIEVudW1EZWNsICo+IEVudW1EZWZpbml0aW9uczsKKworICAvLy8gXGJyaWVmIFdoZW4gcmVhZGluZyBhIFN0bXQgdHJlZSwgU3RtdCBvcGVyYW5kcyBhcmUgcGxhY2VkIGluIHRoaXMgc3RhY2suCisgIFNtYWxsVmVjdG9yPFN0bXQgKiwgMTY+IFN0bXRTdGFjazsKKworICAvLy8gXGJyaWVmIFdoYXQga2luZCBvZiByZWNvcmRzIHdlIGFyZSByZWFkaW5nLgorICBlbnVtIFJlYWRpbmdLaW5kIHsKKyAgICBSZWFkX05vbmUsIFJlYWRfRGVjbCwgUmVhZF9UeXBlLCBSZWFkX1N0bXQKKyAgfTsKKworICAvLy8gXGJyaWVmIFdoYXQga2luZCBvZiByZWNvcmRzIHdlIGFyZSByZWFkaW5nLgorICBSZWFkaW5nS2luZCBSZWFkaW5nS2luZCA9IFJlYWRfTm9uZTsKKworICAvLy8gXGJyaWVmIFJBSUkgb2JqZWN0IHRvIGNoYW5nZSB0aGUgcmVhZGluZyBraW5kLgorICBjbGFzcyBSZWFkaW5nS2luZFRyYWNrZXIgeworICAgIEFTVFJlYWRlciAmUmVhZGVyOworICAgIGVudW0gUmVhZGluZ0tpbmQgUHJldktpbmQ7CisKKyAgcHVibGljOgorICAgIFJlYWRpbmdLaW5kVHJhY2tlcihlbnVtIFJlYWRpbmdLaW5kIG5ld0tpbmQsIEFTVFJlYWRlciAmcmVhZGVyKQorICAgICAgICA6IFJlYWRlcihyZWFkZXIpLCBQcmV2S2luZChSZWFkZXIuUmVhZGluZ0tpbmQpIHsKKyAgICAgIFJlYWRlci5SZWFkaW5nS2luZCA9IG5ld0tpbmQ7CisgICAgfQorCisgICAgUmVhZGluZ0tpbmRUcmFja2VyKGNvbnN0IFJlYWRpbmdLaW5kVHJhY2tlciAmKSA9IGRlbGV0ZTsKKyAgICBSZWFkaW5nS2luZFRyYWNrZXIgJm9wZXJhdG9yPShjb25zdCBSZWFkaW5nS2luZFRyYWNrZXIgJikgPSBkZWxldGU7CisgICAgflJlYWRpbmdLaW5kVHJhY2tlcigpIHsgUmVhZGVyLlJlYWRpbmdLaW5kID0gUHJldktpbmQ7IH0KKyAgfTsKKworICAvLy8gXGJyaWVmIFJBSUkgb2JqZWN0IHRvIG1hcmsgdGhlIHN0YXJ0IG9mIHByb2Nlc3NpbmcgdXBkYXRlcy4KKyAgY2xhc3MgUHJvY2Vzc2luZ1VwZGF0ZXNSQUlJT2JqIHsKKyAgICBBU1RSZWFkZXIgJlJlYWRlcjsKKyAgICBib29sIFByZXZTdGF0ZTsKKworICBwdWJsaWM6CisgICAgUHJvY2Vzc2luZ1VwZGF0ZXNSQUlJT2JqKEFTVFJlYWRlciAmcmVhZGVyKQorICAgICAgICA6IFJlYWRlcihyZWFkZXIpLCBQcmV2U3RhdGUoUmVhZGVyLlByb2Nlc3NpbmdVcGRhdGVSZWNvcmRzKSB7CisgICAgICBSZWFkZXIuUHJvY2Vzc2luZ1VwZGF0ZVJlY29yZHMgPSB0cnVlOworICAgIH0KKworICAgIFByb2Nlc3NpbmdVcGRhdGVzUkFJSU9iaihjb25zdCBQcm9jZXNzaW5nVXBkYXRlc1JBSUlPYmogJikgPSBkZWxldGU7CisgICAgUHJvY2Vzc2luZ1VwZGF0ZXNSQUlJT2JqICYKKyAgICBvcGVyYXRvcj0oY29uc3QgUHJvY2Vzc2luZ1VwZGF0ZXNSQUlJT2JqICYpID0gZGVsZXRlOworICAgIH5Qcm9jZXNzaW5nVXBkYXRlc1JBSUlPYmooKSB7IFJlYWRlci5Qcm9jZXNzaW5nVXBkYXRlUmVjb3JkcyA9IFByZXZTdGF0ZTsgfQorICB9OworCisgIC8vLyBcYnJpZWYgU3VnZ2VzdGVkIGNvbnRlbnRzIG9mIHRoZSBwcmVkZWZpbmVzIGJ1ZmZlciwgYWZ0ZXIgdGhpcworICAvLy8gUENIIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkLgorICAvLy8KKyAgLy8vIEluIG1vc3QgY2FzZXMsIHRoaXMgc3RyaW5nIHdpbGwgYmUgZW1wdHksIGJlY2F1c2UgdGhlIHByZWRlZmluZXMKKyAgLy8vIGJ1ZmZlciBjb21wdXRlZCB0byBidWlsZCB0aGUgUENIIGZpbGUgd2lsbCBiZSBpZGVudGljYWwgdG8gdGhlCisgIC8vLyBwcmVkZWZpbmVzIGJ1ZmZlciBjb21wdXRlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUuIEhvd2V2ZXIsIHdoZW4KKyAgLy8vIHRoZXJlIGFyZSBkaWZmZXJlbmNlcyB0aGF0IHRoZSBQQ0ggcmVhZGVyIGNhbiB3b3JrIGFyb3VuZCwgdGhpcworICAvLy8gcHJlZGVmaW5lcyBidWZmZXIgbWF5IGNvbnRhaW4gYWRkaXRpb25hbCBkZWZpbml0aW9ucy4KKyAgc3RkOjpzdHJpbmcgU3VnZ2VzdGVkUHJlZGVmaW5lczsKKworICBsbHZtOjpEZW5zZU1hcDxjb25zdCBEZWNsICosIGJvb2w+IERlZmluaXRpb25Tb3VyY2U7CisKKyAgLy8vIFxicmllZiBSZWFkcyBhIHN0YXRlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgY3Vyc29yLgorICBTdG10ICpSZWFkU3RtdEZyb21TdHJlYW0oTW9kdWxlRmlsZSAmRik7CisKKyAgc3RydWN0IElucHV0RmlsZUluZm8geworICAgIHN0ZDo6c3RyaW5nIEZpbGVuYW1lOworICAgIG9mZl90IFN0b3JlZFNpemU7CisgICAgdGltZV90IFN0b3JlZFRpbWU7CisgICAgYm9vbCBPdmVycmlkZGVuOworICAgIGJvb2wgVHJhbnNpZW50OworICAgIGJvb2wgVG9wTGV2ZWxNb2R1bGVNYXA7CisgIH07CisKKyAgLy8vIFxicmllZiBSZWFkcyB0aGUgc3RvcmVkIGluZm9ybWF0aW9uIGFib3V0IGFuIGlucHV0IGZpbGUuCisgIElucHV0RmlsZUluZm8gcmVhZElucHV0RmlsZUluZm8oTW9kdWxlRmlsZSAmRiwgdW5zaWduZWQgSUQpOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGZpbGUgZW50cnkgYW5kICdvdmVycmlkZGVuJyBiaXQgZm9yIGFuIGlucHV0CisgIC8vLyBmaWxlIGluIHRoZSBnaXZlbiBtb2R1bGUgZmlsZS4KKyAgc2VyaWFsaXphdGlvbjo6SW5wdXRGaWxlIGdldElucHV0RmlsZShNb2R1bGVGaWxlICZGLCB1bnNpZ25lZCBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluID0gdHJ1ZSk7CisKK3B1YmxpYzoKKyAgdm9pZCBSZXNvbHZlSW1wb3J0ZWRQYXRoKE1vZHVsZUZpbGUgJk0sIHN0ZDo6c3RyaW5nICZGaWxlbmFtZSk7CisgIHN0YXRpYyB2b2lkIFJlc29sdmVJbXBvcnRlZFBhdGgoc3RkOjpzdHJpbmcgJkZpbGVuYW1lLCBTdHJpbmdSZWYgUHJlZml4KTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGZpcnN0IGtleSBkZWNsYXJhdGlvbiBmb3IgdGhlIGdpdmVuIGRlY2xhcmF0aW9uLiBUaGlzCisgIC8vLyBpcyBvbmUgdGhhdCBpcyBmb3JtZXJseS1jYW5vbmljYWwgKG9yIHN0aWxsIGNhbm9uaWNhbCkgYW5kIHdob3NlIG1vZHVsZQorICAvLy8gZGlkIG5vdCBpbXBvcnQgYW55IG90aGVyIGtleSBkZWNsYXJhdGlvbiBvZiB0aGUgZW50aXR5LgorICBEZWNsICpnZXRLZXlEZWNsYXJhdGlvbihEZWNsICpEKSB7CisgICAgRCA9IEQtPmdldENhbm9uaWNhbERlY2woKTsKKyAgICBpZiAoRC0+aXNGcm9tQVNURmlsZSgpKQorICAgICAgcmV0dXJuIEQ7CisKKyAgICBhdXRvIEkgPSBLZXlEZWNscy5maW5kKEQpOworICAgIGlmIChJID09IEtleURlY2xzLmVuZCgpIHx8IEktPnNlY29uZC5lbXB0eSgpKQorICAgICAgcmV0dXJuIEQ7CisgICAgcmV0dXJuIEdldEV4aXN0aW5nRGVjbChJLT5zZWNvbmRbMF0pOworICB9CisgIGNvbnN0IERlY2wgKmdldEtleURlY2xhcmF0aW9uKGNvbnN0IERlY2wgKkQpIHsKKyAgICByZXR1cm4gZ2V0S2V5RGVjbGFyYXRpb24oY29uc3RfY2FzdDxEZWNsKj4oRCkpOworICB9CisKKyAgLy8vIFxicmllZiBSdW4gYSBjYWxsYmFjayBvbiBlYWNoIGltcG9ydGVkIGtleSBkZWNsYXJhdGlvbiBvZiBccCBELgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRm4+CisgIHZvaWQgZm9yRWFjaEltcG9ydGVkS2V5RGVjbChjb25zdCBEZWNsICpELCBGbiBWaXNpdCkgeworICAgIEQgPSBELT5nZXRDYW5vbmljYWxEZWNsKCk7CisgICAgaWYgKEQtPmlzRnJvbUFTVEZpbGUoKSkKKyAgICAgIFZpc2l0KEQpOworCisgICAgYXV0byBJdCA9IEtleURlY2xzLmZpbmQoY29uc3RfY2FzdDxEZWNsKj4oRCkpOworICAgIGlmIChJdCAhPSBLZXlEZWNscy5lbmQoKSkKKyAgICAgIGZvciAoYXV0byBJRCA6IEl0LT5zZWNvbmQpCisgICAgICAgIFZpc2l0KEdldEV4aXN0aW5nRGVjbChJRCkpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGxvYWRlZCBsb29rdXAgdGFibGVzIGZvciBccCBQcmltYXJ5LCBpZiBhbnkuCisgIGNvbnN0IHNlcmlhbGl6YXRpb246OnJlYWRlcjo6RGVjbENvbnRleHRMb29rdXBUYWJsZSAqCisgIGdldExvYWRlZExvb2t1cFRhYmxlcyhEZWNsQ29udGV4dCAqUHJpbWFyeSkgY29uc3Q7CisKK3ByaXZhdGU6CisgIHN0cnVjdCBJbXBvcnRlZE1vZHVsZSB7CisgICAgTW9kdWxlRmlsZSAqTW9kOworICAgIE1vZHVsZUZpbGUgKkltcG9ydGVkQnk7CisgICAgU291cmNlTG9jYXRpb24gSW1wb3J0TG9jOworCisgICAgSW1wb3J0ZWRNb2R1bGUoTW9kdWxlRmlsZSAqTW9kLAorICAgICAgICAgICAgICAgICAgIE1vZHVsZUZpbGUgKkltcG9ydGVkQnksCisgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSW1wb3J0TG9jKQorICAgICAgICA6IE1vZChNb2QpLCBJbXBvcnRlZEJ5KEltcG9ydGVkQnkpLCBJbXBvcnRMb2MoSW1wb3J0TG9jKSB7fQorICB9OworCisgIEFTVFJlYWRSZXN1bHQgUmVhZEFTVENvcmUoU3RyaW5nUmVmIEZpbGVOYW1lLCBNb2R1bGVLaW5kIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSW1wb3J0TG9jLCBNb2R1bGVGaWxlICpJbXBvcnRlZEJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxJbXBvcnRlZE1vZHVsZT4gJkxvYWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCBFeHBlY3RlZFNpemUsIHRpbWVfdCBFeHBlY3RlZE1vZFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNURmlsZVNpZ25hdHVyZSBFeHBlY3RlZFNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDbGllbnRMb2FkQ2FwYWJpbGl0aWVzKTsKKyAgQVNUUmVhZFJlc3VsdCBSZWFkQ29udHJvbEJsb2NrKE1vZHVsZUZpbGUgJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8SW1wb3J0ZWRNb2R1bGU+ICZMb2FkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGVGaWxlICpJbXBvcnRlZEJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2xpZW50TG9hZENhcGFiaWxpdGllcyk7CisgIHN0YXRpYyBBU1RSZWFkUmVzdWx0IFJlYWRPcHRpb25zQmxvY2soCisgICAgICBsbHZtOjpCaXRzdHJlYW1DdXJzb3IgJlN0cmVhbSwgdW5zaWduZWQgQ2xpZW50TG9hZENhcGFiaWxpdGllcywKKyAgICAgIGJvb2wgQWxsb3dDb21wYXRpYmxlQ29uZmlndXJhdGlvbk1pc21hdGNoLCBBU1RSZWFkZXJMaXN0ZW5lciAmTGlzdGVuZXIsCisgICAgICBzdGQ6OnN0cmluZyAmU3VnZ2VzdGVkUHJlZGVmaW5lcyk7CisKKyAgLy8vIFJlYWQgdGhlIHVuaGFzaGVkIGNvbnRyb2wgYmxvY2suCisgIC8vLworICAvLy8gVGhpcyBoYXMgbm8gZWZmZWN0IG9uIFxjIEYuU3RyZWFtLCBpbnN0ZWFkIGNyZWF0aW5nIGEgZnJlc2ggY3Vyc29yIGZyb20KKyAgLy8vIFxjIEYuRGF0YSBhbmQgcmVhZGluZyBhaGVhZC4KKyAgQVNUUmVhZFJlc3VsdCByZWFkVW5oYXNoZWRDb250cm9sQmxvY2soTW9kdWxlRmlsZSAmRiwgYm9vbCBXYXNJbXBvcnRlZEJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDbGllbnRMb2FkQ2FwYWJpbGl0aWVzKTsKKworICBzdGF0aWMgQVNUUmVhZFJlc3VsdAorICByZWFkVW5oYXNoZWRDb250cm9sQmxvY2tJbXBsKE1vZHVsZUZpbGUgKkYsIGxsdm06OlN0cmluZ1JlZiBTdHJlYW1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENsaWVudExvYWRDYXBhYmlsaXRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0NvbXBhdGlibGVDb25maWd1cmF0aW9uTWlzbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUUmVhZGVyTGlzdGVuZXIgKkxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVmFsaWRhdGVEaWFnbm9zdGljT3B0aW9ucyk7CisKKyAgQVNUUmVhZFJlc3VsdCBSZWFkQVNUQmxvY2soTW9kdWxlRmlsZSAmRiwgdW5zaWduZWQgQ2xpZW50TG9hZENhcGFiaWxpdGllcyk7CisgIEFTVFJlYWRSZXN1bHQgUmVhZEV4dGVuc2lvbkJsb2NrKE1vZHVsZUZpbGUgJkYpOworICB2b2lkIFJlYWRNb2R1bGVPZmZzZXRNYXAoTW9kdWxlRmlsZSAmRikgY29uc3Q7CisgIGJvb2wgUGFyc2VMaW5lVGFibGUoTW9kdWxlRmlsZSAmRiwgY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkKTsKKyAgYm9vbCBSZWFkU291cmNlTWFuYWdlckJsb2NrKE1vZHVsZUZpbGUgJkYpOworICBsbHZtOjpCaXRzdHJlYW1DdXJzb3IgJlNMb2NDdXJzb3JGb3JJRChpbnQgSUQpOworICBTb3VyY2VMb2NhdGlvbiBnZXRJbXBvcnRMb2NhdGlvbihNb2R1bGVGaWxlICpGKTsKKyAgQVNUUmVhZFJlc3VsdCBSZWFkTW9kdWxlTWFwRmlsZUJsb2NrKFJlY29yZERhdGEgJlJlY29yZCwgTW9kdWxlRmlsZSAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZUZpbGUgKkltcG9ydGVkQnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDbGllbnRMb2FkQ2FwYWJpbGl0aWVzKTsKKyAgQVNUUmVhZFJlc3VsdCBSZWFkU3VibW9kdWxlQmxvY2soTW9kdWxlRmlsZSAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2xpZW50TG9hZENhcGFiaWxpdGllcyk7CisgIHN0YXRpYyBib29sIFBhcnNlTGFuZ3VhZ2VPcHRpb25zKGNvbnN0IFJlY29yZERhdGEgJlJlY29yZCwgYm9vbCBDb21wbGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUUmVhZGVyTGlzdGVuZXIgJkxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93Q29tcGF0aWJsZURpZmZlcmVuY2VzKTsKKyAgc3RhdGljIGJvb2wgUGFyc2VUYXJnZXRPcHRpb25zKGNvbnN0IFJlY29yZERhdGEgJlJlY29yZCwgYm9vbCBDb21wbGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVFJlYWRlckxpc3RlbmVyICZMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dDb21wYXRpYmxlRGlmZmVyZW5jZXMpOworICBzdGF0aWMgYm9vbCBQYXJzZURpYWdub3N0aWNPcHRpb25zKGNvbnN0IFJlY29yZERhdGEgJlJlY29yZCwgYm9vbCBDb21wbGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RSZWFkZXJMaXN0ZW5lciAmTGlzdGVuZXIpOworICBzdGF0aWMgYm9vbCBQYXJzZUZpbGVTeXN0ZW1PcHRpb25zKGNvbnN0IFJlY29yZERhdGEgJlJlY29yZCwgYm9vbCBDb21wbGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RSZWFkZXJMaXN0ZW5lciAmTGlzdGVuZXIpOworICBzdGF0aWMgYm9vbCBQYXJzZUhlYWRlclNlYXJjaE9wdGlvbnMoY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkLCBib29sIENvbXBsYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUUmVhZGVyTGlzdGVuZXIgJkxpc3RlbmVyKTsKKyAgc3RhdGljIGJvb2wgUGFyc2VQcmVwcm9jZXNzb3JPcHRpb25zKGNvbnN0IFJlY29yZERhdGEgJlJlY29yZCwgYm9vbCBDb21wbGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVFJlYWRlckxpc3RlbmVyICZMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZTdWdnZXN0ZWRQcmVkZWZpbmVzKTsKKworICBzdHJ1Y3QgUmVjb3JkTG9jYXRpb24geworICAgIE1vZHVsZUZpbGUgKkY7CisgICAgdWludDY0X3QgT2Zmc2V0OworCisgICAgUmVjb3JkTG9jYXRpb24oTW9kdWxlRmlsZSAqTSwgdWludDY0X3QgTykgOiBGKE0pLCBPZmZzZXQoTykge30KKyAgfTsKKworICBRdWFsVHlwZSByZWFkVHlwZVJlY29yZCh1bnNpZ25lZCBJbmRleCk7CisgIHZvaWQgcmVhZEV4Y2VwdGlvblNwZWMoTW9kdWxlRmlsZSAmTW9kdWxlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8UXVhbFR5cGU+ICZFeGNlcHRpb25TdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uUHJvdG9UeXBlOjpFeGNlcHRpb25TcGVjSW5mbyAmRVNJLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlY29yZERhdGEgJlJlY29yZCwgdW5zaWduZWQgJkluZGV4KTsKKyAgUmVjb3JkTG9jYXRpb24gVHlwZUN1cnNvckZvckluZGV4KHVuc2lnbmVkIEluZGV4KTsKKyAgdm9pZCBMb2FkZWREZWNsKHVuc2lnbmVkIEluZGV4LCBEZWNsICpEKTsKKyAgRGVjbCAqUmVhZERlY2xSZWNvcmQoc2VyaWFsaXphdGlvbjo6RGVjbElEIElEKTsKKyAgdm9pZCBtYXJrSW5jb21wbGV0ZURlY2xDaGFpbihEZWNsICpDYW5vbik7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBkZWNsYXJhdGlvbiBvZiBhIGRlY2xhcmF0aW9uICh3aGljaCBtdXN0IGJlCisgIC8vLyBvZiBhIHJlZGVjbGFyYWJsZSBraW5kKSB0aGF0IGlzIGVpdGhlciBsb2NhbCBvciBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZAorICAvLy8gbWVyZ2VkIGludG8gaXRzIHJlZGVjbCBjaGFpbi4KKyAgRGVjbCAqZ2V0TW9zdFJlY2VudEV4aXN0aW5nRGVjbChEZWNsICpEKTsKKworICBSZWNvcmRMb2NhdGlvbiBEZWNsQ3Vyc29yRm9ySUQoc2VyaWFsaXphdGlvbjo6RGVjbElEIElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gJkxvY2F0aW9uKTsKKyAgdm9pZCBsb2FkRGVjbFVwZGF0ZVJlY29yZHMoUGVuZGluZ1VwZGF0ZVJlY29yZCAmUmVjb3JkKTsKKyAgdm9pZCBsb2FkUGVuZGluZ0RlY2xDaGFpbihEZWNsICpELCB1aW50NjRfdCBMb2NhbE9mZnNldCk7CisgIHZvaWQgbG9hZE9iakNDYXRlZ29yaWVzKHNlcmlhbGl6YXRpb246Okdsb2JhbERlY2xJRCBJRCwgT2JqQ0ludGVyZmFjZURlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFByZXZpb3VzR2VuZXJhdGlvbiA9IDApOworCisgIFJlY29yZExvY2F0aW9uIGdldExvY2FsQml0T2Zmc2V0KHVpbnQ2NF90IEdsb2JhbE9mZnNldCk7CisgIHVpbnQ2NF90IGdldEdsb2JhbEJpdE9mZnNldChNb2R1bGVGaWxlICZNLCB1aW50MzJfdCBMb2NhbE9mZnNldCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBmaXJzdCBwcmVwcm9jZXNzZWQgZW50aXR5IElEIHRoYXQgYmVnaW5zIG9yIGVuZHMgYWZ0ZXIKKyAgLy8vIFxhcmcgTG9jLgorICBzZXJpYWxpemF0aW9uOjpQcmVwcm9jZXNzZWRFbnRpdHlJRAorICBmaW5kUHJlcHJvY2Vzc2VkRW50aXR5KFNvdXJjZUxvY2F0aW9uIExvYywgYm9vbCBFbmRzQWZ0ZXIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRmluZCB0aGUgbmV4dCBtb2R1bGUgdGhhdCBjb250YWlucyBlbnRpdGllcyBhbmQgcmV0dXJuIHRoZSBJRAorICAvLy8gb2YgdGhlIGZpcnN0IGVudHJ5LgorICAvLy8KKyAgLy8vIFxwYXJhbSBTTG9jTWFwSSBwb2ludHMgYXQgYSBjaHVuayBvZiBhIG1vZHVsZSB0aGF0IGNvbnRhaW5zIG5vCisgIC8vLyBwcmVwcm9jZXNzZWQgZW50aXRpZXMgb3IgdGhlIGVudGl0aWVzIGl0IGNvbnRhaW5zIGFyZSBub3QgdGhlCisgIC8vLyBvbmVzIHdlIGFyZSBsb29raW5nIGZvci4KKyAgc2VyaWFsaXphdGlvbjo6UHJlcHJvY2Vzc2VkRW50aXR5SUQKKyAgICBmaW5kTmV4dFByZXByb2Nlc3NlZEVudGl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFNMb2NPZmZzZXRNYXBUeXBlOjpjb25zdF9pdGVyYXRvciBTTG9jTWFwSSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIChNb2R1bGVGaWxlLCBMb2NhbCBpbmRleCkgcGFpciBmb3IgXHAgR2xvYmFsSW5kZXggb2YgYQorICAvLy8gcHJlcHJvY2Vzc2VkIGVudGl0eS4KKyAgc3RkOjpwYWlyPE1vZHVsZUZpbGUgKiwgdW5zaWduZWQ+CisgICAgZ2V0TW9kdWxlUHJlcHJvY2Vzc2VkRW50aXR5KHVuc2lnbmVkIEdsb2JhbEluZGV4KTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgKGJlZ2luLCBlbmQpIHBhaXIgZm9yIHRoZSBwcmVwcm9jZXNzZWQgZW50aXRpZXMgb2YgYQorICAvLy8gcGFydGljdWxhciBtb2R1bGUuCisgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPFByZXByb2Nlc3NpbmdSZWNvcmQ6Oml0ZXJhdG9yPgorICBnZXRNb2R1bGVQcmVwcm9jZXNzZWRFbnRpdGllcyhNb2R1bGVGaWxlICZNb2QpIGNvbnN0OworCitwdWJsaWM6CisgIGNsYXNzIE1vZHVsZURlY2xJdGVyYXRvcgorICAgICAgOiBwdWJsaWMgbGx2bTo6aXRlcmF0b3JfYWRhcHRvcl9iYXNlPAorICAgICAgICAgICAgTW9kdWxlRGVjbEl0ZXJhdG9yLCBjb25zdCBzZXJpYWxpemF0aW9uOjpMb2NhbERlY2xJRCAqLAorICAgICAgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgY29uc3QgRGVjbCAqLCBwdHJkaWZmX3QsCisgICAgICAgICAgICBjb25zdCBEZWNsICosIGNvbnN0IERlY2wgKj4geworICAgIEFTVFJlYWRlciAqUmVhZGVyID0gbnVsbHB0cjsKKyAgICBNb2R1bGVGaWxlICpNb2QgPSBudWxscHRyOworCisgIHB1YmxpYzoKKyAgICBNb2R1bGVEZWNsSXRlcmF0b3IoKSA6IGl0ZXJhdG9yX2FkYXB0b3JfYmFzZShudWxscHRyKSB7fQorCisgICAgTW9kdWxlRGVjbEl0ZXJhdG9yKEFTVFJlYWRlciAqUmVhZGVyLCBNb2R1bGVGaWxlICpNb2QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb246OkxvY2FsRGVjbElEICpQb3MpCisgICAgICAgIDogaXRlcmF0b3JfYWRhcHRvcl9iYXNlKFBvcyksIFJlYWRlcihSZWFkZXIpLCBNb2QoTW9kKSB7fQorCisgICAgdmFsdWVfdHlwZSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgICByZXR1cm4gUmVhZGVyLT5HZXREZWNsKFJlYWRlci0+Z2V0R2xvYmFsRGVjbElEKCpNb2QsICpJKSk7CisgICAgfQorCisgICAgdmFsdWVfdHlwZSBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gKip0aGlzOyB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTW9kdWxlRGVjbEl0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICAgIGFzc2VydChSZWFkZXIgPT0gUkhTLlJlYWRlciAmJiBNb2QgPT0gUkhTLk1vZCk7CisgICAgICByZXR1cm4gSSA9PSBSSFMuSTsKKyAgICB9CisgIH07CisKKyAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8TW9kdWxlRGVjbEl0ZXJhdG9yPgorICBnZXRNb2R1bGVGaWxlTGV2ZWxEZWNscyhNb2R1bGVGaWxlICZNb2QpOworCitwcml2YXRlOgorICB2b2lkIFBhc3NJbnRlcmVzdGluZ0RlY2xzVG9Db25zdW1lcigpOworICB2b2lkIFBhc3NJbnRlcmVzdGluZ0RlY2xUb0NvbnN1bWVyKERlY2wgKkQpOworCisgIHZvaWQgZmluaXNoUGVuZGluZ0FjdGlvbnMoKTsKKyAgdm9pZCBkaWFnbm9zZU9kclZpb2xhdGlvbnMoKTsKKworICB2b2lkIHB1c2hFeHRlcm5hbERlY2xJbnRvU2NvcGUoTmFtZWREZWNsICpELCBEZWNsYXJhdGlvbk5hbWUgTmFtZSk7CisKKyAgdm9pZCBhZGRQZW5kaW5nRGVjbENvbnRleHRJbmZvKERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uOjpHbG9iYWxEZWNsSUQgU2VtYURDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbjo6R2xvYmFsRGVjbElEIExleGljYWxEQykgeworICAgIGFzc2VydChEKTsKKyAgICBQZW5kaW5nRGVjbENvbnRleHRJbmZvIEluZm8gPSB7IEQsIFNlbWFEQywgTGV4aWNhbERDIH07CisgICAgUGVuZGluZ0RlY2xDb250ZXh0SW5mb3MucHVzaF9iYWNrKEluZm8pOworICB9CisKKyAgLy8vIFxicmllZiBQcm9kdWNlIGFuIGVycm9yIGRpYWdub3N0aWMgYW5kIHJldHVybiB0cnVlLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBmYXRhbCBlcnJvcnMgdGhhdCBoYXZlIHRvCisgIC8vLyBkbyB3aXRoIG5vbi1yb3V0aW5lIGZhaWx1cmVzIChlLmcuLCBjb3JydXB0ZWQgQVNUIGZpbGUpLgorICB2b2lkIEVycm9yKFN0cmluZ1JlZiBNc2cpIGNvbnN0OworICB2b2lkIEVycm9yKHVuc2lnbmVkIERpYWdJRCwgU3RyaW5nUmVmIEFyZzEgPSBTdHJpbmdSZWYoKSwKKyAgICAgICAgICAgICBTdHJpbmdSZWYgQXJnMiA9IFN0cmluZ1JlZigpKSBjb25zdDsKKworcHVibGljOgorICAvLy8gXGJyaWVmIExvYWQgdGhlIEFTVCBmaWxlIGFuZCB2YWxpZGF0ZSBpdHMgY29udGVudHMgYWdhaW5zdCB0aGUgZ2l2ZW4KKyAgLy8vIFByZXByb2Nlc3Nvci4KKyAgLy8vCisgIC8vLyBccGFyYW0gUFAgdGhlIHByZXByb2Nlc3NvciBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhpcworICAvLy8gcHJlY29tcGlsZWQgaGVhZGVyIHdpbGwgYmUgbG9hZGVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb250ZXh0IHRoZSBBU1QgY29udGV4dCB0aGF0IHRoaXMgcHJlY29tcGlsZWQgaGVhZGVyIHdpbGwgYmUKKyAgLy8vIGxvYWRlZCBpbnRvLCBpZiBhbnkuCisgIC8vLworICAvLy8gXHBhcmFtIFBDSENvbnRhaW5lclJkciB0aGUgUENIQ29udGFpbmVyT3BlcmF0aW9ucyB0byB1c2UgZm9yIGxvYWRpbmcgYW5kCisgIC8vLyBjcmVhdGluZyBtb2R1bGVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBFeHRlbnNpb25zIHRoZSBsaXN0IG9mIG1vZHVsZSBmaWxlIGV4dGVuc2lvbnMgdGhhdCBjYW4gYmUgbG9hZGVkCisgIC8vLyBmcm9tIHRoZSBBU1QgZmlsZXMuCisgIC8vLworICAvLy8gXHBhcmFtIGlzeXNyb290IElmIG5vbi1OVUxMLCB0aGUgc3lzdGVtIGluY2x1ZGUgcGF0aCBzcGVjaWZpZWQgYnkgdGhlCisgIC8vLyB1c2VyLiBUaGlzIGlzIG9ubHkgdXNlZCB3aXRoIHJlbG9jYXRhYmxlIFBDSCBmaWxlcy4gSWYgbm9uLU5VTEwsCisgIC8vLyBhIHJlbG9jYXRhYmxlIFBDSCBmaWxlIHdpbGwgdXNlIHRoZSBkZWZhdWx0IHBhdGggIi8iLgorICAvLy8KKyAgLy8vIFxwYXJhbSBEaXNhYmxlVmFsaWRhdGlvbiBJZiB0cnVlLCB0aGUgQVNUIHJlYWRlciB3aWxsIHN1cHByZXNzIG1vc3QKKyAgLy8vIG9mIGl0cyByZWd1bGFyIGNvbnNpc3RlbmN5IGNoZWNraW5nLCBhbGxvd2luZyB0aGUgdXNlIG9mIHByZWNvbXBpbGVkCisgIC8vLyBoZWFkZXJzIHRoYXQgY2Fubm90IGJlIGRldGVybWluZWQgdG8gYmUgY29tcGF0aWJsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQWxsb3dBU1RXaXRoQ29tcGlsZXJFcnJvcnMgSWYgdHJ1ZSwgdGhlIEFTVCByZWFkZXIgd2lsbCBhY2NlcHQgYW4KKyAgLy8vIEFTVCBmaWxlIHRoZSB3YXMgY3JlYXRlZCBvdXQgb2YgYW4gQVNUIHdpdGggY29tcGlsZXIgZXJyb3JzLAorICAvLy8gb3RoZXJ3aXNlIGl0IHdpbGwgcmVqZWN0IGl0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBBbGxvd0NvbmZpZ3VyYXRpb25NaXNtYXRjaCBJZiB0cnVlLCB0aGUgQVNUIHJlYWRlciB3aWxsIG5vdCBjaGVjaworICAvLy8gZm9yIGNvbmZpZ3VyYXRpb24gZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgQVNUIGZpbGUgYW5kIHRoZSBpbnZvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBWYWxpZGF0ZVN5c3RlbUlucHV0cyBJZiB0cnVlLCB0aGUgQVNUIHJlYWRlciB3aWxsIHZhbGlkYXRlCisgIC8vLyBzeXN0ZW0gaW5wdXQgZmlsZXMgaW4gYWRkaXRpb24gdG8gdXNlciBpbnB1dCBmaWxlcy4gVGhpcyBpcyBvbmx5CisgIC8vLyBtZWFuaW5nZnVsIGlmIFxwIERpc2FibGVWYWxpZGF0aW9uIGlzIGZhbHNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBVc2VHbG9iYWxJbmRleCBJZiB0cnVlLCB0aGUgQVNUIHJlYWRlciB3aWxsIHRyeSB0byBsb2FkIGFuZCB1c2UKKyAgLy8vIHRoZSBnbG9iYWwgbW9kdWxlIGluZGV4LgorICAvLy8KKyAgLy8vIFxwYXJhbSBSZWFkVGltZXIgSWYgbm9uLW51bGwsIGEgdGltZXIgdXNlZCB0byB0cmFjayB0aGUgdGltZSBzcGVudAorICAvLy8gZGVzZXJpYWxpemluZy4KKyAgQVNUUmVhZGVyKFByZXByb2Nlc3NvciAmUFAsIEFTVENvbnRleHQgKkNvbnRleHQsCisgICAgICAgICAgICBjb25zdCBQQ0hDb250YWluZXJSZWFkZXIgJlBDSENvbnRhaW5lclJkciwKKyAgICAgICAgICAgIEFycmF5UmVmPHN0ZDo6c2hhcmVkX3B0cjxNb2R1bGVGaWxlRXh0ZW5zaW9uPj4gRXh0ZW5zaW9ucywKKyAgICAgICAgICAgIFN0cmluZ1JlZiBpc3lzcm9vdCA9ICIiLCBib29sIERpc2FibGVWYWxpZGF0aW9uID0gZmFsc2UsCisgICAgICAgICAgICBib29sIEFsbG93QVNUV2l0aENvbXBpbGVyRXJyb3JzID0gZmFsc2UsCisgICAgICAgICAgICBib29sIEFsbG93Q29uZmlndXJhdGlvbk1pc21hdGNoID0gZmFsc2UsCisgICAgICAgICAgICBib29sIFZhbGlkYXRlU3lzdGVtSW5wdXRzID0gZmFsc2UsIGJvb2wgVXNlR2xvYmFsSW5kZXggPSB0cnVlLAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGxsdm06OlRpbWVyPiBSZWFkVGltZXIgPSB7fSk7CisgIEFTVFJlYWRlcihjb25zdCBBU1RSZWFkZXIgJikgPSBkZWxldGU7CisgIEFTVFJlYWRlciAmb3BlcmF0b3I9KGNvbnN0IEFTVFJlYWRlciAmKSA9IGRlbGV0ZTsKKyAgfkFTVFJlYWRlcigpIG92ZXJyaWRlOworCisgIFNvdXJjZU1hbmFnZXIgJmdldFNvdXJjZU1hbmFnZXIoKSBjb25zdCB7IHJldHVybiBTb3VyY2VNZ3I7IH0KKyAgRmlsZU1hbmFnZXIgJmdldEZpbGVNYW5hZ2VyKCkgY29uc3QgeyByZXR1cm4gRmlsZU1ncjsgfQorICBEaWFnbm9zdGljc0VuZ2luZSAmZ2V0RGlhZ3MoKSBjb25zdCB7IHJldHVybiBEaWFnczsgfQorCisgIC8vLyBcYnJpZWYgRmxhZ3MgdGhhdCBpbmRpY2F0ZSB3aGF0IGtpbmQgb2YgQVNUIGxvYWRpbmcgZmFpbHVyZXMgdGhlIGNsaWVudAorICAvLy8gb2YgdGhlIEFTVCByZWFkZXIgY2FuIGRpcmVjdGx5IGhhbmRsZS4KKyAgLy8vCisgIC8vLyBXaGVuIGEgY2xpZW50IHN0YXRlcyB0aGF0IGl0IGNhbiBoYW5kbGUgYSBwYXJ0aWN1bGFyIGtpbmQgb2YgZmFpbHVyZSwKKyAgLy8vIHRoZSBBU1QgcmVhZGVyIHdpbGwgbm90IGVtaXQgZXJyb3JzIHdoZW4gcHJvZHVjaW5nIHRoYXQga2luZCBvZiBmYWlsdXJlLgorICBlbnVtIExvYWRGYWlsdXJlQ2FwYWJpbGl0aWVzIHsKKyAgICAvLy8gXGJyaWVmIFRoZSBjbGllbnQgY2FuJ3QgaGFuZGxlIGFueSBBU1QgbG9hZGluZyBmYWlsdXJlcy4KKyAgICBBUlJfTm9uZSA9IDAsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBjbGllbnQgY2FuIGhhbmRsZSBhbiBBU1QgZmlsZSB0aGF0IGNhbm5vdCBsb2FkIGJlY2F1c2UgaXQKKyAgICAvLy8gaXMgbWlzc2luZy4KKyAgICBBUlJfTWlzc2luZyA9IDB4MSwKKworICAgIC8vLyBcYnJpZWYgVGhlIGNsaWVudCBjYW4gaGFuZGxlIGFuIEFTVCBmaWxlIHRoYXQgY2Fubm90IGxvYWQgYmVjYXVzZSBpdAorICAgIC8vLyBpcyBvdXQtb2YtZGF0ZSByZWxhdGl2ZSB0byBpdHMgaW5wdXQgZmlsZXMuCisgICAgQVJSX091dE9mRGF0ZSA9IDB4MiwKKworICAgIC8vLyBcYnJpZWYgVGhlIGNsaWVudCBjYW4gaGFuZGxlIGFuIEFTVCBmaWxlIHRoYXQgY2Fubm90IGxvYWQgYmVjYXVzZSBpdAorICAgIC8vLyB3YXMgYnVpbHQgd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIENsYW5nLgorICAgIEFSUl9WZXJzaW9uTWlzbWF0Y2ggPSAweDQsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBjbGllbnQgY2FuIGhhbmRsZSBhbiBBU1QgZmlsZSB0aGF0IGNhbm5vdCBsb2FkIGJlY2F1c2UgaXQncworICAgIC8vLyBjb21waWxlZCBjb25maWd1cmF0aW9uIGRvZXNuJ3QgbWF0Y2ggdGhhdCBvZiB0aGUgY29udGV4dCBpdCB3YXMKKyAgICAvLy8gbG9hZGVkIGludG8uCisgICAgQVJSX0NvbmZpZ3VyYXRpb25NaXNtYXRjaCA9IDB4OAorICB9OworCisgIC8vLyBcYnJpZWYgTG9hZCB0aGUgQVNUIGZpbGUgZGVzaWduYXRlZCBieSB0aGUgZ2l2ZW4gZmlsZSBuYW1lLgorICAvLy8KKyAgLy8vIFxwYXJhbSBGaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgQVNUIGZpbGUgdG8gbG9hZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gVHlwZSBUaGUga2luZCBvZiBBU1QgYmVpbmcgbG9hZGVkLCBlLmcuLCBQQ0gsIG1vZHVsZSwgbWFpbiBmaWxlLAorICAvLy8gb3IgcHJlYW1ibGUuCisgIC8vLworICAvLy8gXHBhcmFtIEltcG9ydExvYyB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIG1vZHVsZSBmaWxlIHdpbGwgYmUgY29uc2lkZXJlZCBhcworICAvLy8gaW1wb3J0ZWQgZnJvbS4gRm9yIG5vbi1tb2R1bGUgQVNUIHR5cGVzIGl0IHNob3VsZCBiZSBpbnZhbGlkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDbGllbnRMb2FkQ2FwYWJpbGl0aWVzIFRoZSBzZXQgb2YgY2xpZW50IGxvYWQtZmFpbHVyZQorICAvLy8gY2FwYWJpbGl0aWVzLCByZXByZXNlbnRlZCBhcyBhIGJpdHNldCBvZiB0aGUgZW51bWVyYXRvcnMgb2YKKyAgLy8vIExvYWRGYWlsdXJlQ2FwYWJpbGl0aWVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJbXBvcnRlZCBvcHRpb25hbCBvdXQtcGFyYW1ldGVyIHRvIGFwcGVuZCB0aGUgbGlzdCBvZiBtb2R1bGVzCisgIC8vLyB0aGF0IHdlcmUgaW1wb3J0ZWQgYnkgcHJlY29tcGlsZWQgaGVhZGVycyBvciBhbnkgb3RoZXIgbm9uLW1vZHVsZSBBU1QgZmlsZQorICBBU1RSZWFkUmVzdWx0IFJlYWRBU1QoU3RyaW5nUmVmIEZpbGVOYW1lLCBNb2R1bGVLaW5kIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDbGllbnRMb2FkQ2FwYWJpbGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEltcG9ydGVkU3VibW9kdWxlPiAqSW1wb3J0ZWQgPSBudWxscHRyKTsKKworICAvLy8gXGJyaWVmIE1ha2UgdGhlIGVudGl0aWVzIGluIHRoZSBnaXZlbiBtb2R1bGUgYW5kIGFueSBvZiBpdHMgKG5vbi1leHBsaWNpdCkKKyAgLy8vIHN1Ym1vZHVsZXMgdmlzaWJsZSB0byBuYW1lIGxvb2t1cC4KKyAgLy8vCisgIC8vLyBccGFyYW0gTW9kIFRoZSBtb2R1bGUgd2hvc2UgbmFtZXMgc2hvdWxkIGJlIG1hZGUgdmlzaWJsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTmFtZVZpc2liaWxpdHkgVGhlIGxldmVsIG9mIHZpc2liaWxpdHkgdG8gZ2l2ZSB0aGUgbmFtZXMgaW4gdGhlCisgIC8vLyBtb2R1bGUuICBWaXNpYmlsaXR5IGNhbiBvbmx5IGJlIGluY3JlYXNlZCBvdmVyIHRpbWUuCisgIC8vLworICAvLy8gXHBhcmFtIEltcG9ydExvYyBUaGUgbG9jYXRpb24gYXQgd2hpY2ggdGhlIGltcG9ydCBvY2N1cnMuCisgIHZvaWQgbWFrZU1vZHVsZVZpc2libGUoTW9kdWxlICpNb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlOjpOYW1lVmlzaWJpbGl0eUtpbmQgTmFtZVZpc2liaWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSW1wb3J0TG9jKTsKKworICAvLy8gXGJyaWVmIE1ha2UgdGhlIG5hbWVzIHdpdGhpbiB0aGlzIHNldCBvZiBoaWRkZW4gbmFtZXMgdmlzaWJsZS4KKyAgdm9pZCBtYWtlTmFtZXNWaXNpYmxlKGNvbnN0IEhpZGRlbk5hbWVzICZOYW1lcywgTW9kdWxlICpPd25lcik7CisKKyAgLy8vIFxicmllZiBOb3RlIHRoYXQgTWVyZ2VkRGVmIGlzIGEgcmVkZWZpbml0aW9uIG9mIHRoZSBjYW5vbmljYWwgZGVmaW5pdGlvbgorICAvLy8gRGVmLCBzbyBEZWYgc2hvdWxkIGJlIHZpc2libGUgd2hlbmV2ZXIgTWVyZ2VkRGVmIGlzLgorICB2b2lkIG1lcmdlRGVmaW5pdGlvblZpc2liaWxpdHkoTmFtZWREZWNsICpEZWYsIE5hbWVkRGVjbCAqTWVyZ2VkRGVmKTsKKworICAvLy8gXGJyaWVmIFRha2UgdGhlIEFTVCBjYWxsYmFja3MgbGlzdGVuZXIuCisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RSZWFkZXJMaXN0ZW5lcj4gdGFrZUxpc3RlbmVyKCkgeworICAgIHJldHVybiBzdGQ6Om1vdmUoTGlzdGVuZXIpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIEFTVCBjYWxsYmFja3MgbGlzdGVuZXIuCisgIHZvaWQgc2V0TGlzdGVuZXIoc3RkOjp1bmlxdWVfcHRyPEFTVFJlYWRlckxpc3RlbmVyPiBMaXN0ZW5lcikgeworICAgIHRoaXMtPkxpc3RlbmVyID0gc3RkOjptb3ZlKExpc3RlbmVyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWRkIGFuIEFTVCBjYWxsYmFjayBsaXN0ZW5lci4KKyAgLy8vCisgIC8vLyBUYWtlcyBvd25lcnNoaXAgb2YgXHAgTC4KKyAgdm9pZCBhZGRMaXN0ZW5lcihzdGQ6OnVuaXF1ZV9wdHI8QVNUUmVhZGVyTGlzdGVuZXI+IEwpIHsKKyAgICBpZiAoTGlzdGVuZXIpCisgICAgICBMID0gbGx2bTo6bWFrZV91bmlxdWU8Q2hhaW5lZEFTVFJlYWRlckxpc3RlbmVyPihzdGQ6Om1vdmUoTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoTGlzdGVuZXIpKTsKKyAgICBMaXN0ZW5lciA9IHN0ZDo6bW92ZShMKTsKKyAgfQorCisgIC8vLyBSQUlJIG9iamVjdCB0byB0ZW1wb3JhcmlseSBhZGQgYW4gQVNUIGNhbGxiYWNrIGxpc3RlbmVyLgorICBjbGFzcyBMaXN0ZW5lclNjb3BlIHsKKyAgICBBU1RSZWFkZXIgJlJlYWRlcjsKKyAgICBib29sIENoYWluZWQgPSBmYWxzZTsKKworICBwdWJsaWM6CisgICAgTGlzdGVuZXJTY29wZShBU1RSZWFkZXIgJlJlYWRlciwgc3RkOjp1bmlxdWVfcHRyPEFTVFJlYWRlckxpc3RlbmVyPiBMKQorICAgICAgICA6IFJlYWRlcihSZWFkZXIpIHsKKyAgICAgIGF1dG8gT2xkID0gUmVhZGVyLnRha2VMaXN0ZW5lcigpOworICAgICAgaWYgKE9sZCkgeworICAgICAgICBDaGFpbmVkID0gdHJ1ZTsKKyAgICAgICAgTCA9IGxsdm06Om1ha2VfdW5pcXVlPENoYWluZWRBU1RSZWFkZXJMaXN0ZW5lcj4oc3RkOjptb3ZlKEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoT2xkKSk7CisgICAgICB9CisgICAgICBSZWFkZXIuc2V0TGlzdGVuZXIoc3RkOjptb3ZlKEwpKTsKKyAgICB9CisKKyAgICB+TGlzdGVuZXJTY29wZSgpIHsKKyAgICAgIGF1dG8gTmV3ID0gUmVhZGVyLnRha2VMaXN0ZW5lcigpOworICAgICAgaWYgKENoYWluZWQpCisgICAgICAgIFJlYWRlci5zZXRMaXN0ZW5lcihzdGF0aWNfY2FzdDxDaGFpbmVkQVNUUmVhZGVyTGlzdGVuZXIgKj4oTmV3LmdldCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+dGFrZVNlY29uZCgpKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIEFTVCBkZXNlcmlhbGl6YXRpb24gbGlzdGVuZXIuCisgIHZvaWQgc2V0RGVzZXJpYWxpemF0aW9uTGlzdGVuZXIoQVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXIgKkxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVGFrZU93bmVyc2hpcCA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgQVNUIHJlYWRlciBoYXMgYSBnbG9iYWwgaW5kZXguCisgIGJvb2wgaGFzR2xvYmFsSW5kZXgoKSBjb25zdCB7IHJldHVybiAoYm9vbClHbG9iYWxJbmRleDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGdsb2JhbCBtb2R1bGUgaW5kZXguCisgIEdsb2JhbE1vZHVsZUluZGV4ICpnZXRHbG9iYWxJbmRleCgpIHsgcmV0dXJuIEdsb2JhbEluZGV4LmdldCgpOyB9CisKKyAgLy8vIFxicmllZiBSZXNldCByZWFkZXIgZm9yIGEgcmVsb2FkIHRyeS4KKyAgdm9pZCByZXNldEZvclJlbG9hZCgpIHsgVHJpZWRMb2FkaW5nR2xvYmFsSW5kZXggPSBmYWxzZTsgfQorCisgIC8vLyBcYnJpZWYgQXR0ZW1wdHMgdG8gbG9hZCB0aGUgZ2xvYmFsIGluZGV4LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgbG9hZGluZyB0aGUgZ2xvYmFsIGluZGV4IGhhcyBmYWlsZWQgZm9yIGFueSByZWFzb24uCisgIGJvb2wgbG9hZEdsb2JhbEluZGV4KCk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB3ZSB0cmllZCB0byBsb2FkIHRoZSBnbG9iYWwgaW5kZXgsIGJ1dCBmYWlsZWQsCisgIC8vLyBlLmcuLCBiZWNhdXNlIGl0IGlzIG91dC1vZi1kYXRlIG9yIGRvZXMgbm90IGV4aXN0LgorICBib29sIGlzR2xvYmFsSW5kZXhVbmF2YWlsYWJsZSgpIGNvbnN0OworICAKKyAgLy8vIFxicmllZiBJbml0aWFsaXplcyB0aGUgQVNUQ29udGV4dAorICB2b2lkIEluaXRpYWxpemVDb250ZXh0KCk7CisKKyAgLy8vIFxicmllZiBVcGRhdGUgdGhlIHN0YXRlIG9mIFNlbWEgYWZ0ZXIgbG9hZGluZyBzb21lIGFkZGl0aW9uYWwgbW9kdWxlcy4KKyAgdm9pZCBVcGRhdGVTZW1hKCk7CisKKyAgLy8vIFxicmllZiBBZGQgaW4tbWVtb3J5ICh2aXJ0dWFsIGZpbGUpIGJ1ZmZlci4KKyAgdm9pZCBhZGRJbk1lbW9yeUJ1ZmZlcihTdHJpbmdSZWYgJkZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+IEJ1ZmZlcikgeworICAgIE1vZHVsZU1nci5hZGRJbk1lbW9yeUJ1ZmZlcihGaWxlTmFtZSwgc3RkOjptb3ZlKEJ1ZmZlcikpOworICB9CisKKyAgLy8vIFxicmllZiBGaW5hbGl6ZXMgdGhlIEFTVCByZWFkZXIncyBzdGF0ZSBiZWZvcmUgd3JpdGluZyBhbiBBU1QgZmlsZSB0bworICAvLy8gZGlzay4KKyAgLy8vCisgIC8vLyBUaGlzIG9wZXJhdGlvbiBtYXkgdW5kbyB0ZW1wb3Jhcnkgc3RhdGUgaW4gdGhlIEFTVCB0aGF0IHNob3VsZCBub3QgYmUKKyAgLy8vIGVtaXR0ZWQuCisgIHZvaWQgZmluYWxpemVGb3JXcml0aW5nKCk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbW9kdWxlIG1hbmFnZXIuCisgIE1vZHVsZU1hbmFnZXIgJmdldE1vZHVsZU1hbmFnZXIoKSB7IHJldHVybiBNb2R1bGVNZ3I7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBwcmVwcm9jZXNzb3IuCisgIFByZXByb2Nlc3NvciAmZ2V0UHJlcHJvY2Vzc29yKCkgY29uc3QgeyByZXR1cm4gUFA7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSBuYW1lIGZvciB0aGUgcHJpbWFyeQorICAvLy8gbW9kdWxlIGZpbGUuCisgIFN0cmluZ1JlZiBnZXRPcmlnaW5hbFNvdXJjZUZpbGUoKSB7CisgICAgcmV0dXJuIE1vZHVsZU1nci5nZXRQcmltYXJ5TW9kdWxlKCkuT3JpZ2luYWxTb3VyY2VGaWxlTmFtZTsgCisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSBuYW1lIGRpcmVjdGx5IGZyb20KKyAgLy8vIHRoZSBBU1QgZmlsZSwgd2l0aG91dCBhY3R1YWxseSBsb2FkaW5nIHRoZSBBU1QgZmlsZS4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nCisgIGdldE9yaWdpbmFsU291cmNlRmlsZShjb25zdCBzdGQ6OnN0cmluZyAmQVNURmlsZU5hbWUsIEZpbGVNYW5hZ2VyICZGaWxlTWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUENIQ29udGFpbmVyUmVhZGVyICZQQ0hDb250YWluZXJSZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MpOworCisgIC8vLyBcYnJpZWYgUmVhZCB0aGUgY29udHJvbCBibG9jayBmb3IgdGhlIG5hbWVkIEFTVCBmaWxlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgc3RhdGljIGJvb2wKKyAgcmVhZEFTVEZpbGVDb250cm9sQmxvY2soU3RyaW5nUmVmIEZpbGVuYW1lLCBGaWxlTWFuYWdlciAmRmlsZU1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUENIQ29udGFpbmVyUmVhZGVyICZQQ0hDb250YWluZXJSZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRmluZE1vZHVsZUZpbGVFeHRlbnNpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RSZWFkZXJMaXN0ZW5lciAmTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVmFsaWRhdGVEaWFnbm9zdGljT3B0aW9ucyk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gQVNUIGZpbGUgaXMgYWNjZXB0YWJsZSB0byBsb2FkIGludG8gYQorICAvLy8gdHJhbnNsYXRpb24gdW5pdCB3aXRoIHRoZSBnaXZlbiBsYW5ndWFnZSBhbmQgdGFyZ2V0IG9wdGlvbnMuCisgIHN0YXRpYyBib29sIGlzQWNjZXB0YWJsZUFTVEZpbGUoU3RyaW5nUmVmIEZpbGVuYW1lLCBGaWxlTWFuYWdlciAmRmlsZU1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQQ0hDb250YWluZXJSZWFkZXIgJlBDSENvbnRhaW5lclJkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0T3B0aW9ucyAmVGFyZ2V0T3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVwcm9jZXNzb3JPcHRpb25zICZQUE9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEV4aXN0aW5nTW9kdWxlQ2FjaGVQYXRoKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHN1Z2dlc3RlZCBjb250ZW50cyBvZiB0aGUgcHJlZGVmaW5lcyBidWZmZXIsCisgIC8vLyB3aGljaCBjb250YWlucyBhICh0eXBpY2FsbHktZW1wdHkpIHN1YnNldCBvZiB0aGUgcHJlZGVmaW5lcworICAvLy8gYnVpbGQgcHJpb3IgdG8gaW5jbHVkaW5nIHRoZSBwcmVjb21waWxlZCBoZWFkZXIuCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRTdWdnZXN0ZWRQcmVkZWZpbmVzKCkgeyByZXR1cm4gU3VnZ2VzdGVkUHJlZGVmaW5lczsgfQorCisgIC8vLyBcYnJpZWYgUmVhZCBhIHByZWFsbG9jYXRlZCBwcmVwcm9jZXNzZWQgZW50aXR5IGZyb20gdGhlIGV4dGVybmFsIHNvdXJjZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBudWxsIGlmIGFuIGVycm9yIG9jY3VycmVkIHRoYXQgcHJldmVudGVkIHRoZSBwcmVwcm9jZXNzZWQKKyAgLy8vIGVudGl0eSBmcm9tIGJlaW5nIGxvYWRlZC4KKyAgUHJlcHJvY2Vzc2VkRW50aXR5ICpSZWFkUHJlcHJvY2Vzc2VkRW50aXR5KHVuc2lnbmVkIEluZGV4KSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgYSBwYWlyIG9mIFtCZWdpbiwgRW5kKSBpbmRpY2VzIG9mIHByZWFsbG9jYXRlZAorICAvLy8gcHJlcHJvY2Vzc2VkIGVudGl0aWVzIHRoYXQgXHAgUmFuZ2UgZW5jb21wYXNzZXMuCisgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+CisgICAgICBmaW5kUHJlcHJvY2Vzc2VkRW50aXRpZXNJblJhbmdlKFNvdXJjZVJhbmdlIFJhbmdlKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIE9wdGlvbmFsbHkgcmV0dXJucyB0cnVlIG9yIGZhbHNlIGlmIHRoZSBwcmVhbGxvY2F0ZWQgcHJlcHJvY2Vzc2VkCisgIC8vLyBlbnRpdHkgd2l0aCBpbmRleCBccCBJbmRleCBjYW1lIGZyb20gZmlsZSBccCBGSUQuCisgIE9wdGlvbmFsPGJvb2w+IGlzUHJlcHJvY2Vzc2VkRW50aXR5SW5GaWxlSUQodW5zaWduZWQgSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUlEIEZJRCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBSZWFkIGEgcHJlYWxsb2NhdGVkIHNraXBwZWQgcmFuZ2UgZnJvbSB0aGUgZXh0ZXJuYWwgc291cmNlLgorICBTb3VyY2VSYW5nZSBSZWFkU2tpcHBlZFJhbmdlKHVuc2lnbmVkIEluZGV4KSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFJlYWQgdGhlIGhlYWRlciBmaWxlIGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gZmlsZSBlbnRyeS4KKyAgSGVhZGVyRmlsZUluZm8gR2V0SGVhZGVyRmlsZUluZm8oY29uc3QgRmlsZUVudHJ5ICpGRSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBSZWFkUHJhZ21hRGlhZ25vc3RpY01hcHBpbmdzKERpYWdub3N0aWNzRW5naW5lICZEaWFnKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBzb3VyY2UgbG9jYXRpb25zIGZvdW5kIGluIHRoZSBjaGFpbi4KKyAgdW5zaWduZWQgZ2V0VG90YWxOdW1TTG9jcygpIGNvbnN0IHsKKyAgICByZXR1cm4gVG90YWxOdW1TTG9jRW50cmllczsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGlkZW50aWZpZXJzIGZvdW5kIGluIHRoZSBjaGFpbi4KKyAgdW5zaWduZWQgZ2V0VG90YWxOdW1JZGVudGlmaWVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KElkZW50aWZpZXJzTG9hZGVkLnNpemUoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBtYWNyb3MgZm91bmQgaW4gdGhlIGNoYWluLgorICB1bnNpZ25lZCBnZXRUb3RhbE51bU1hY3JvcygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KE1hY3Jvc0xvYWRlZC5zaXplKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdHlwZXMgZm91bmQgaW4gdGhlIGNoYWluLgorICB1bnNpZ25lZCBnZXRUb3RhbE51bVR5cGVzKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oVHlwZXNMb2FkZWQuc2l6ZSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRlY2xhcmF0aW9ucyBmb3VuZCBpbiB0aGUgY2hhaW4uCisgIHVuc2lnbmVkIGdldFRvdGFsTnVtRGVjbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkPihEZWNsc0xvYWRlZC5zaXplKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3VibW9kdWxlcyBrbm93bi4KKyAgdW5zaWduZWQgZ2V0VG90YWxOdW1TdWJtb2R1bGVzKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oU3VibW9kdWxlc0xvYWRlZC5zaXplKCkpOworICB9CisgIAorICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMgZm91bmQgaW4gdGhlIGNoYWluLgorICB1bnNpZ25lZCBnZXRUb3RhbE51bVNlbGVjdG9ycygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KFNlbGVjdG9yc0xvYWRlZC5zaXplKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcHJlcHJvY2Vzc2VkIGVudGl0aWVzIGtub3duIHRvIHRoZSBBU1QKKyAgLy8vIHJlYWRlci4KKyAgdW5zaWduZWQgZ2V0VG90YWxOdW1QcmVwcm9jZXNzZWRFbnRpdGllcygpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBSZXN1bHQgPSAwOworICAgIGZvciAoY29uc3QgYXV0byAmTSA6IE1vZHVsZU1ncikKKyAgICAgIFJlc3VsdCArPSBNLk51bVByZXByb2Nlc3NlZEVudGl0aWVzOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICAvLy8gXGJyaWVmIFJlYWRzIGEgVGVtcGxhdGVBcmd1bWVudExvY0luZm8gYXBwcm9wcmlhdGUgZm9yIHRoZQorICAvLy8gZ2l2ZW4gVGVtcGxhdGVBcmd1bWVudCBraW5kLgorICBUZW1wbGF0ZUFyZ3VtZW50TG9jSW5mbworICBHZXRUZW1wbGF0ZUFyZ3VtZW50TG9jSW5mbyhNb2R1bGVGaWxlICZGLCBUZW1wbGF0ZUFyZ3VtZW50OjpBcmdLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlY29yZERhdGEgJlJlY29yZCwgdW5zaWduZWQgJklkeCk7CisKKyAgLy8vIFxicmllZiBSZWFkcyBhIFRlbXBsYXRlQXJndW1lbnRMb2MuCisgIFRlbXBsYXRlQXJndW1lbnRMb2MKKyAgUmVhZFRlbXBsYXRlQXJndW1lbnRMb2MoTW9kdWxlRmlsZSAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkLCB1bnNpZ25lZCAmSWR4KTsKKworICBjb25zdCBBU1RUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8qCisgIFJlYWRBU1RUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8oTW9kdWxlRmlsZSAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWNvcmREYXRhICZSZWNvcmQsIHVuc2lnbmVkICZJbmRleCk7CisKKyAgLy8vIFxicmllZiBSZWFkcyBhIGRlY2xhcmF0b3IgaW5mbyBmcm9tIHRoZSBnaXZlbiByZWNvcmQuCisgIFR5cGVTb3VyY2VJbmZvICpHZXRUeXBlU291cmNlSW5mbyhNb2R1bGVGaWxlICZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkLCB1bnNpZ25lZCAmSWR4KTsKKworICAvLy8gXGJyaWVmIFJlc29sdmUgYSB0eXBlIElEIGludG8gYSB0eXBlLCBwb3RlbnRpYWxseSBidWlsZGluZyBhIG5ldworICAvLy8gdHlwZS4KKyAgUXVhbFR5cGUgR2V0VHlwZShzZXJpYWxpemF0aW9uOjpUeXBlSUQgSUQpOworCisgIC8vLyBcYnJpZWYgUmVzb2x2ZSBhIGxvY2FsIHR5cGUgSUQgd2l0aGluIGEgZ2l2ZW4gQVNUIGZpbGUgaW50byBhIHR5cGUuCisgIFF1YWxUeXBlIGdldExvY2FsVHlwZShNb2R1bGVGaWxlICZGLCB1bnNpZ25lZCBMb2NhbElEKTsKKworICAvLy8gXGJyaWVmIE1hcCBhIGxvY2FsIHR5cGUgSUQgd2l0aGluIGEgZ2l2ZW4gQVNUIGZpbGUgaW50byBhIGdsb2JhbCB0eXBlIElELgorICBzZXJpYWxpemF0aW9uOjpUeXBlSUQgZ2V0R2xvYmFsVHlwZUlEKE1vZHVsZUZpbGUgJkYsIHVuc2lnbmVkIExvY2FsSUQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmVhZCBhIHR5cGUgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZ2l2ZW4gcmVjb3JkLCB3aGljaAorICAvLy8gd2FzIHJlYWQgZnJvbSB0aGUgZ2l2ZW4gQVNUIGZpbGUuCisgIFF1YWxUeXBlIHJlYWRUeXBlKE1vZHVsZUZpbGUgJkYsIGNvbnN0IFJlY29yZERhdGEgJlJlY29yZCwgdW5zaWduZWQgJklkeCkgeworICAgIGlmIChJZHggPj0gUmVjb3JkLnNpemUoKSkKKyAgICAgIHJldHVybiB7fTsKKworICAgIHJldHVybiBnZXRMb2NhbFR5cGUoRiwgUmVjb3JkW0lkeCsrXSk7CisgIH0KKworICAvLy8gXGJyaWVmIE1hcCBmcm9tIGEgbG9jYWwgZGVjbGFyYXRpb24gSUQgd2l0aGluIGEgZ2l2ZW4gbW9kdWxlIHRvIGEKKyAgLy8vIGdsb2JhbCBkZWNsYXJhdGlvbiBJRC4KKyAgc2VyaWFsaXphdGlvbjo6RGVjbElEIGdldEdsb2JhbERlY2xJRChNb2R1bGVGaWxlICZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uOjpMb2NhbERlY2xJRCBMb2NhbElEKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBnbG9iYWwgRGVjbElEIFxwIElEIG9yaWdpbmF0ZWQgZnJvbSBtb2R1bGUgXHAgTS4KKyAgYm9vbCBpc0RlY2xJREZyb21Nb2R1bGUoc2VyaWFsaXphdGlvbjo6R2xvYmFsRGVjbElEIElELCBNb2R1bGVGaWxlICZNKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtb2R1bGUgZmlsZSB0aGF0IG93bnMgdGhlIGdpdmVuIGRlY2xhcmF0aW9uLCBvciBOVUxMCisgIC8vLyBpZiB0aGUgZGVjbGFyYXRpb24gaXMgbm90IGZyb20gYSBtb2R1bGUgZmlsZS4KKyAgTW9kdWxlRmlsZSAqZ2V0T3duaW5nTW9kdWxlRmlsZShjb25zdCBEZWNsICpEKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgYmVzdCBuYW1lIHdlIGtub3cgZm9yIHRoZSBtb2R1bGUgdGhhdCBvd25zIHRoZSBnaXZlbgorICAvLy8gZGVjbGFyYXRpb24sIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgZGVjbGFyYXRpb24gaXMgbm90IGZyb20gYSBtb2R1bGUuCisgIHN0ZDo6c3RyaW5nIGdldE93bmluZ01vZHVsZU5hbWVGb3JEaWFnbm9zdGljKGNvbnN0IERlY2wgKkQpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgc291cmNlIGxvY2F0aW9uIGZvciB0aGUgZGVjbCBccCBJRC4KKyAgU291cmNlTG9jYXRpb24gZ2V0U291cmNlTG9jYXRpb25Gb3JEZWNsSUQoc2VyaWFsaXphdGlvbjo6R2xvYmFsRGVjbElEIElEKTsKKworICAvLy8gXGJyaWVmIFJlc29sdmUgYSBkZWNsYXJhdGlvbiBJRCBpbnRvIGEgZGVjbGFyYXRpb24sIHBvdGVudGlhbGx5CisgIC8vLyBidWlsZGluZyBhIG5ldyBkZWNsYXJhdGlvbi4KKyAgRGVjbCAqR2V0RGVjbChzZXJpYWxpemF0aW9uOjpEZWNsSUQgSUQpOworICBEZWNsICpHZXRFeHRlcm5hbERlY2wodWludDMyX3QgSUQpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmVzb2x2ZSBhIGRlY2xhcmF0aW9uIElEIGludG8gYSBkZWNsYXJhdGlvbi4gUmV0dXJuIDAgaWYgaXQncyBub3QKKyAgLy8vIGJlZW4gbG9hZGVkIHlldC4KKyAgRGVjbCAqR2V0RXhpc3RpbmdEZWNsKHNlcmlhbGl6YXRpb246OkRlY2xJRCBJRCk7CisKKyAgLy8vIFxicmllZiBSZWFkcyBhIGRlY2xhcmF0aW9uIHdpdGggdGhlIGdpdmVuIGxvY2FsIElEIGluIHRoZSBnaXZlbiBtb2R1bGUuCisgIERlY2wgKkdldExvY2FsRGVjbChNb2R1bGVGaWxlICZGLCB1aW50MzJfdCBMb2NhbElEKSB7CisgICAgcmV0dXJuIEdldERlY2woZ2V0R2xvYmFsRGVjbElEKEYsIExvY2FsSUQpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVhZHMgYSBkZWNsYXJhdGlvbiB3aXRoIHRoZSBnaXZlbiBsb2NhbCBJRCBpbiB0aGUgZ2l2ZW4gbW9kdWxlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSByZXF1ZXN0ZWQgZGVjbGFyYXRpb24sIGNhc3RlZCB0byB0aGUgZ2l2ZW4gcmV0dXJuIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIFQgKkdldExvY2FsRGVjbEFzKE1vZHVsZUZpbGUgJkYsIHVpbnQzMl90IExvY2FsSUQpIHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPFQ+KEdldExvY2FsRGVjbChGLCBMb2NhbElEKSk7CisgIH0KKworICAvLy8gXGJyaWVmIE1hcCBhIGdsb2JhbCBkZWNsYXJhdGlvbiBJRCBpbnRvIHRoZSBkZWNsYXJhdGlvbiBJRCB1c2VkIHRvIAorICAvLy8gcmVmZXIgdG8gdGhpcyBkZWNsYXJhdGlvbiB3aXRoaW4gdGhlIGdpdmVuIG1vZHVsZSBmdWxlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSBnbG9iYWwgSUQgb2YgdGhlIGdpdmVuIGRlY2xhcmF0aW9uIGFzIGtub3duIGluIHRoZSBnaXZlbgorICAvLy8gbW9kdWxlIGZpbGUuCisgIHNlcmlhbGl6YXRpb246OkRlY2xJRCAKKyAgbWFwR2xvYmFsSURUb01vZHVsZUZpbGVHbG9iYWxJRChNb2R1bGVGaWxlICZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YXRpb246OkRlY2xJRCBHbG9iYWxJRCk7CisgIAorICAvLy8gXGJyaWVmIFJlYWRzIGEgZGVjbGFyYXRpb24gSUQgZnJvbSB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gYSByZWNvcmQgaW4gdGhlCisgIC8vLyBnaXZlbiBtb2R1bGUuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIGRlY2xhcmF0aW9uIElEIHJlYWQgZnJvbSB0aGUgcmVjb3JkLCBhZGp1c3RlZCB0byBhIGdsb2JhbCBJRC4KKyAgc2VyaWFsaXphdGlvbjo6RGVjbElEIFJlYWREZWNsSUQoTW9kdWxlRmlsZSAmRiwgY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmSWR4KTsKKworICAvLy8gXGJyaWVmIFJlYWRzIGEgZGVjbGFyYXRpb24gZnJvbSB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gYSByZWNvcmQgaW4gdGhlCisgIC8vLyBnaXZlbiBtb2R1bGUuCisgIERlY2wgKlJlYWREZWNsKE1vZHVsZUZpbGUgJkYsIGNvbnN0IFJlY29yZERhdGEgJlIsIHVuc2lnbmVkICZJKSB7CisgICAgcmV0dXJuIEdldERlY2woUmVhZERlY2xJRChGLCBSLCBJKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlYWRzIGEgZGVjbGFyYXRpb24gZnJvbSB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gYSByZWNvcmQgaW4gdGhlCisgIC8vLyBnaXZlbiBtb2R1bGUuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIGRlY2xhcmF0aW9uIHJlYWQgZnJvbSB0aGlzIGxvY2F0aW9uLCBjYXN0ZWQgdG8gdGhlIGdpdmVuCisgIC8vLyByZXN1bHQgdHlwZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgVCAqUmVhZERlY2xBcyhNb2R1bGVGaWxlICZGLCBjb25zdCBSZWNvcmREYXRhICZSLCB1bnNpZ25lZCAmSSkgeworICAgIHJldHVybiBjYXN0X29yX251bGw8VD4oR2V0RGVjbChSZWFkRGVjbElEKEYsIFIsIEkpKSk7CisgIH0KKworICAvLy8gXGJyaWVmIElmIGFueSByZWRlY2xhcmF0aW9ucyBvZiBccCBEIGhhdmUgYmVlbiBpbXBvcnRlZCBzaW5jZSBpdCB3YXMKKyAgLy8vIGxhc3QgY2hlY2tlZCwgdGhpcyBkaWdzIG91dCB0aG9zZSByZWRlY2xhcmF0aW9ucyBhbmQgYWRkcyB0aGVtIHRvIHRoZQorICAvLy8gcmVkZWNsYXJhdGlvbiBjaGFpbiBmb3IgXHAgRC4KKyAgdm9pZCBDb21wbGV0ZVJlZGVjbENoYWluKGNvbnN0IERlY2wgKkQpIG92ZXJyaWRlOworCisgIENYWEJhc2VTcGVjaWZpZXIgKkdldEV4dGVybmFsQ1hYQmFzZVNwZWNpZmllcnModWludDY0X3QgT2Zmc2V0KSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFJlc29sdmUgdGhlIG9mZnNldCBvZiBhIHN0YXRlbWVudCBpbnRvIGEgc3RhdGVtZW50LgorICAvLy8KKyAgLy8vIFRoaXMgb3BlcmF0aW9uIHdpbGwgcmVhZCBhIG5ldyBzdGF0ZW1lbnQgZnJvbSB0aGUgZXh0ZXJuYWwKKyAgLy8vIHNvdXJjZSBlYWNoIHRpbWUgaXQgaXMgY2FsbGVkLCBhbmQgaXMgbWVhbnQgdG8gYmUgdXNlZCB2aWEgYQorICAvLy8gTGF6eU9mZnNldFB0ciAod2hpY2ggaXMgdXNlZCBieSBEZWNscyBmb3IgdGhlIGJvZHkgb2YgZnVuY3Rpb25zLCBldGMpLgorICBTdG10ICpHZXRFeHRlcm5hbERlY2xTdG10KHVpbnQ2NF90IE9mZnNldCkgb3ZlcnJpZGU7CisKKyAgLy8vIFJlYWRCbG9ja0FiYnJldnMgLSBFbnRlciBhIHN1YmJsb2NrIG9mIHRoZSBzcGVjaWZpZWQgQmxvY2tJRCB3aXRoIHRoZQorICAvLy8gc3BlY2lmaWVkIGN1cnNvci4gIFJlYWQgdGhlIGFiYnJldmlhdGlvbnMgdGhhdCBhcmUgYXQgdGhlIHRvcCBvZiB0aGUgYmxvY2sKKyAgLy8vIGFuZCB0aGVuIGxlYXZlIHRoZSBjdXJzb3IgcG9pbnRpbmcgaW50byB0aGUgYmxvY2suCisgIHN0YXRpYyBib29sIFJlYWRCbG9ja0FiYnJldnMobGx2bTo6Qml0c3RyZWFtQ3Vyc29yICZDdXJzb3IsIHVuc2lnbmVkIEJsb2NrSUQpOworCisgIC8vLyBcYnJpZWYgRmluZHMgYWxsIHRoZSB2aXNpYmxlIGRlY2xhcmF0aW9ucyB3aXRoIGEgZ2l2ZW4gbmFtZS4KKyAgLy8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGp1c3QgbG9hZHMgdGhlIGVudGlyZQorICAvLy8gbG9va3VwIHRhYmxlIGFzIHVubWF0ZXJpYWxpemVkIHJlZmVyZW5jZXMuCisgIGJvb2wgRmluZEV4dGVybmFsVmlzaWJsZURlY2xzQnlOYW1lKGNvbnN0IERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lIE5hbWUpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmVhZCBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBsZXhpY2FsbHkgc3RvcmVkIGluIGEKKyAgLy8vIGRlY2xhcmF0aW9uIGNvbnRleHQuCisgIC8vLworICAvLy8gXHBhcmFtIERDIFRoZSBkZWNsYXJhdGlvbiBjb250ZXh0IHdob3NlIGRlY2xhcmF0aW9ucyB3aWxsIGJlCisgIC8vLyByZWFkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJc0tpbmRXZVdhbnQgQSBwcmVkaWNhdGUgaW5kaWNhdGluZyB3aGljaCBkZWNsYXJhdGlvbiBraW5kcworICAvLy8gd2UgYXJlIGludGVyZXN0ZWQgaW4uCisgIC8vLworICAvLy8gXHBhcmFtIERlY2xzIFZlY3RvciB0aGF0IHdpbGwgY29udGFpbiB0aGUgZGVjbGFyYXRpb25zIGxvYWRlZAorICAvLy8gZnJvbSB0aGUgZXh0ZXJuYWwgc291cmNlLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBtZXJnaW5nCisgIC8vLyB0aGVzZSBkZWNsYXJhdGlvbnMgd2l0aCBhbnkgZGVjbGFyYXRpb25zIGFscmVhZHkgc3RvcmVkIGluIHRoZQorICAvLy8gZGVjbGFyYXRpb24gY29udGV4dC4KKyAgdm9pZAorICBGaW5kRXh0ZXJuYWxMZXhpY2FsRGVjbHMoY29uc3QgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6ZnVuY3Rpb25fcmVmPGJvb2woRGVjbDo6S2luZCk+IElzS2luZFdlV2FudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxEZWNsICo+ICZEZWNscykgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGRlY2xzIHRoYXQgYXJlIGNvbnRhaW5lZCBpbiBhIGZpbGUgaW4gdGhlIE9mZnNldC9MZW5ndGgKKyAgLy8vIHJhbmdlLiBccCBMZW5ndGggY2FuIGJlIDAgdG8gaW5kaWNhdGUgYSBwb2ludCBhdCBccCBPZmZzZXQgaW5zdGVhZCBvZgorICAvLy8gYSByYW5nZS4KKyAgdm9pZCBGaW5kRmlsZVJlZ2lvbkRlY2xzKEZpbGVJRCBGaWxlLCB1bnNpZ25lZCBPZmZzZXQsIHVuc2lnbmVkIExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxEZWNsICo+ICZEZWNscykgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBOb3RpZnkgQVNUUmVhZGVyIHRoYXQgd2Ugc3RhcnRlZCBkZXNlcmlhbGl6YXRpb24gb2YKKyAgLy8vIGEgZGVjbCBvciB0eXBlIHNvIHVudGlsIEZpbmlzaGVkRGVzZXJpYWxpemluZyBpcyBjYWxsZWQgdGhlcmUgbWF5IGJlCisgIC8vLyBkZWNscyB0aGF0IGFyZSBpbml0aWFsaXppbmcuIE11c3QgYmUgcGFpcmVkIHdpdGggRmluaXNoZWREZXNlcmlhbGl6aW5nLgorICB2b2lkIFN0YXJ0ZWREZXNlcmlhbGl6aW5nKCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBOb3RpZnkgQVNUUmVhZGVyIHRoYXQgd2UgZmluaXNoZWQgdGhlIGRlc2VyaWFsaXphdGlvbiBvZgorICAvLy8gYSBkZWNsIG9yIHR5cGUuIE11c3QgYmUgcGFpcmVkIHdpdGggU3RhcnRlZERlc2VyaWFsaXppbmcuCisgIHZvaWQgRmluaXNoZWREZXNlcmlhbGl6aW5nKCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBGdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuIHdlIGJlZ2luIHBhcnNpbmcgYSBuZXcKKyAgLy8vIHRyYW5zbGF0aW9uIHVuaXQgaW52b2x2aW5nIHRoaXMgZXh0ZXJuYWwgQVNUIHNvdXJjZS4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJvdmlkZSBhbGwgb2YgdGhlIGV4dGVybmFsIGRlZmluaXRpb25zIHRvCisgIC8vLyB0aGUgQVNUQ29uc3VtZXIuCisgIHZvaWQgU3RhcnRUcmFuc2xhdGlvblVuaXQoQVNUQ29uc3VtZXIgKkNvbnN1bWVyKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFByaW50IHNvbWUgc3RhdGlzdGljcyBhYm91dCBBU1QgdXNhZ2UuCisgIHZvaWQgUHJpbnRTdGF0cygpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgRHVtcCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQVNUIHJlYWRlciB0byBzdGFuZGFyZCBlcnJvci4KKyAgdm9pZCBkdW1wKCk7CisKKyAgLy8vIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkIGJ5IG1lbW9yeSBidWZmZXJzLCBicmVha2luZyBkb3duCisgIC8vLyBieSBoZWFwLWJhY2tlZCB2ZXJzdXMgbW1hcCdlZCBtZW1vcnkuCisgIHZvaWQgZ2V0TWVtb3J5QnVmZmVyU2l6ZXMoTWVtb3J5QnVmZmVyU2l6ZXMgJnNpemVzKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIEluaXRpYWxpemUgdGhlIHNlbWFudGljIHNvdXJjZSB3aXRoIHRoZSBTZW1hIGluc3RhbmNlCisgIC8vLyBiZWluZyB1c2VkIHRvIHBlcmZvcm0gc2VtYW50aWMgYW5hbHlzaXMgb24gdGhlIGFic3RyYWN0IHN5bnRheAorICAvLy8gdHJlZS4KKyAgdm9pZCBJbml0aWFsaXplU2VtYShTZW1hICZTKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIEluZm9ybSB0aGUgc2VtYW50aWMgY29uc3VtZXIgdGhhdCBTZW1hIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuCisgIHZvaWQgRm9yZ2V0U2VtYSgpIG92ZXJyaWRlIHsgU2VtYU9iaiA9IG51bGxwdHI7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBJZGVudGlmaWVySW5mbyBmb3IgdGhlIG5hbWVkIGlkZW50aWZpZXIuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIGJ1aWxkcyBhIG5ldyBJZGVudGlmaWVySW5mbyBmb3IgdGhlIGdpdmVuIGlkZW50aWZpZXIuIElmIGFueQorICAvLy8gZGVjbGFyYXRpb25zIHdpdGggdGhpcyBuYW1lIGFyZSB2aXNpYmxlIGZyb20gdHJhbnNsYXRpb24gdW5pdCBzY29wZSwgdGhlaXIKKyAgLy8vIGRlY2xhcmF0aW9ucyB3aWxsIGJlIGRlc2VyaWFsaXplZCBhbmQgaW50cm9kdWNlZCBpbnRvIHRoZSBkZWNsYXJhdGlvbgorICAvLy8gY2hhaW4gb2YgdGhlIGlkZW50aWZpZXIuCisgIElkZW50aWZpZXJJbmZvICpnZXQoU3RyaW5nUmVmIE5hbWUpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYW4gaXRlcmF0b3IgaW50byB0aGUgc2V0IG9mIGFsbCBpZGVudGlmaWVycworICAvLy8gaW4gYWxsIGxvYWRlZCBBU1QgZmlsZXMuCisgIElkZW50aWZpZXJJdGVyYXRvciAqZ2V0SWRlbnRpZmllcnMoKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIExvYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBnbG9iYWwgbWV0aG9kIHBvb2wgZm9yIGEgZ2l2ZW4KKyAgLy8vIHNlbGVjdG9yLgorICB2b2lkIFJlYWRNZXRob2RQb29sKFNlbGVjdG9yIFNlbCkgb3ZlcnJpZGU7CisKKyAgLy8vIExvYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBnbG9iYWwgbWV0aG9kIHBvb2wgZm9yIGEgZ2l2ZW4KKyAgLy8vIHNlbGVjdG9yIGlmIG5lY2Vzc2FyeS4KKyAgdm9pZCB1cGRhdGVPdXRPZkRhdGVTZWxlY3RvcihTZWxlY3RvciBTZWwpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgTG9hZCB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCBhcmUga25vd24gdG8gdGhlIGV4dGVybmFsIHNvdXJjZSwKKyAgLy8vIHdoaWNoIHdpbGwgYmUgdXNlZCBkdXJpbmcgdHlwbyBjb3JyZWN0aW9uLgorICB2b2lkIFJlYWRLbm93bk5hbWVzcGFjZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE5hbWVzcGFjZURlY2wgKj4gJk5hbWVzcGFjZXMpIG92ZXJyaWRlOworCisgIHZvaWQgUmVhZFVuZGVmaW5lZEJ1dFVzZWQoCisgICAgICBsbHZtOjpNYXBWZWN0b3I8TmFtZWREZWNsICosIFNvdXJjZUxvY2F0aW9uPiAmVW5kZWZpbmVkKSBvdmVycmlkZTsKKworICB2b2lkIFJlYWRNaXNtYXRjaGluZ0RlbGV0ZUV4cHJlc3Npb25zKGxsdm06Ok1hcFZlY3RvcjwKKyAgICAgIEZpZWxkRGVjbCAqLCBsbHZtOjpTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8U291cmNlTG9jYXRpb24sIGJvb2w+LCA0Pj4gJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBycykgb3ZlcnJpZGU7CisKKyAgdm9pZCBSZWFkVGVudGF0aXZlRGVmaW5pdGlvbnMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFZhckRlY2wgKj4gJlRlbnRhdGl2ZURlZnMpIG92ZXJyaWRlOworCisgIHZvaWQgUmVhZFVudXNlZEZpbGVTY29wZWREZWNscygKKyAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IERlY2xhcmF0b3JEZWNsICo+ICZEZWNscykgb3ZlcnJpZGU7CisKKyAgdm9pZCBSZWFkRGVsZWdhdGluZ0NvbnN0cnVjdG9ycygKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q1hYQ29uc3RydWN0b3JEZWNsICo+ICZEZWNscykgb3ZlcnJpZGU7CisKKyAgdm9pZCBSZWFkRXh0VmVjdG9yRGVjbHMoU21hbGxWZWN0b3JJbXBsPFR5cGVkZWZOYW1lRGVjbCAqPiAmRGVjbHMpIG92ZXJyaWRlOworCisgIHZvaWQgUmVhZFVudXNlZExvY2FsVHlwZWRlZk5hbWVDYW5kaWRhdGVzKAorICAgICAgbGx2bTo6U21hbGxTZXRWZWN0b3I8Y29uc3QgVHlwZWRlZk5hbWVEZWNsICosIDQ+ICZEZWNscykgb3ZlcnJpZGU7CisKKyAgdm9pZCBSZWFkUmVmZXJlbmNlZFNlbGVjdG9ycygKKyAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxTZWxlY3RvciwgU291cmNlTG9jYXRpb24+PiAmU2Vscykgb3ZlcnJpZGU7CisKKyAgdm9pZCBSZWFkV2Vha1VuZGVjbGFyZWRJZGVudGlmaWVycygKKyAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxJZGVudGlmaWVySW5mbyAqLCBXZWFrSW5mbz4+ICZXSSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBSZWFkVXNlZFZUYWJsZXMoU21hbGxWZWN0b3JJbXBsPEV4dGVybmFsVlRhYmxlVXNlPiAmVlRhYmxlcykgb3ZlcnJpZGU7CisKKyAgdm9pZCBSZWFkUGVuZGluZ0luc3RhbnRpYXRpb25zKAorICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxWYWx1ZURlY2wgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24+PiAmUGVuZGluZykgb3ZlcnJpZGU7CisKKyAgdm9pZCBSZWFkTGF0ZVBhcnNlZFRlbXBsYXRlcygKKyAgICAgIGxsdm06Ok1hcFZlY3Rvcjxjb25zdCBGdW5jdGlvbkRlY2wgKiwgc3RkOjp1bmlxdWVfcHRyPExhdGVQYXJzZWRUZW1wbGF0ZT4+CisgICAgICAgICAgJkxQVE1hcCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBMb2FkIGEgc2VsZWN0b3IgZnJvbSBkaXNrLCByZWdpc3RlcmluZyBpdHMgSUQgaWYgaXQgZXhpc3RzLgorICB2b2lkIExvYWRTZWxlY3RvcihTZWxlY3RvciBTZWwpOworCisgIHZvaWQgU2V0SWRlbnRpZmllckluZm8odW5zaWduZWQgSUQsIElkZW50aWZpZXJJbmZvICpJSSk7CisgIHZvaWQgU2V0R2xvYmFsbHlWaXNpYmxlRGVjbHMoSWRlbnRpZmllckluZm8gKklJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDx1aW50MzJfdD4gJkRlY2xJRHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPERlY2wgKj4gKkRlY2xzID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBSZXBvcnQgYSBkaWFnbm9zdGljLgorICBEaWFnbm9zdGljQnVpbGRlciBEaWFnKHVuc2lnbmVkIERpYWdJRCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXBvcnQgYSBkaWFnbm9zdGljLgorICBEaWFnbm9zdGljQnVpbGRlciBEaWFnKFNvdXJjZUxvY2F0aW9uIExvYywgdW5zaWduZWQgRGlhZ0lEKSBjb25zdDsKKworICBJZGVudGlmaWVySW5mbyAqRGVjb2RlSWRlbnRpZmllckluZm8oc2VyaWFsaXphdGlvbjo6SWRlbnRpZmllcklEIElEKTsKKworICBJZGVudGlmaWVySW5mbyAqR2V0SWRlbnRpZmllckluZm8oTW9kdWxlRmlsZSAmTSwgY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJklkeCkgeworICAgIHJldHVybiBEZWNvZGVJZGVudGlmaWVySW5mbyhnZXRHbG9iYWxJZGVudGlmaWVySUQoTSwgUmVjb3JkW0lkeCsrXSkpOworICB9CisKKyAgSWRlbnRpZmllckluZm8gKkdldElkZW50aWZpZXIoc2VyaWFsaXphdGlvbjo6SWRlbnRpZmllcklEIElEKSBvdmVycmlkZSB7CisgICAgLy8gTm90ZSB0aGF0IHdlIGFyZSBsb2FkaW5nIGFuIGlkZW50aWZpZXIuCisgICAgRGVzZXJpYWxpemluZyBBbklkZW50aWZpZXIodGhpcyk7CisKKyAgICByZXR1cm4gRGVjb2RlSWRlbnRpZmllckluZm8oSUQpOworICB9CisKKyAgSWRlbnRpZmllckluZm8gKmdldExvY2FsSWRlbnRpZmllcihNb2R1bGVGaWxlICZNLCB1bnNpZ25lZCBMb2NhbElEKTsKKworICBzZXJpYWxpemF0aW9uOjpJZGVudGlmaWVySUQgZ2V0R2xvYmFsSWRlbnRpZmllcklEKE1vZHVsZUZpbGUgJk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTG9jYWxJRCk7CisKKyAgdm9pZCByZXNvbHZlUGVuZGluZ01hY3JvKElkZW50aWZpZXJJbmZvICpJSSwgY29uc3QgUGVuZGluZ01hY3JvSW5mbyAmUE1JbmZvKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtYWNybyB3aXRoIHRoZSBnaXZlbiBJRC4KKyAgTWFjcm9JbmZvICpnZXRNYWNybyhzZXJpYWxpemF0aW9uOjpNYWNyb0lEIElEKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBnbG9iYWwgbWFjcm8gSUQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbG9jYWwKKyAgLy8vIElEIHdpdGhpbiB0aGUgZ2l2ZW4gbW9kdWxlIGZpbGUuCisgIHNlcmlhbGl6YXRpb246Ok1hY3JvSUQgZ2V0R2xvYmFsTWFjcm9JRChNb2R1bGVGaWxlICZNLCB1bnNpZ25lZCBMb2NhbElEKTsKKworICAvLy8gXGJyaWVmIFJlYWQgdGhlIHNvdXJjZSBsb2NhdGlvbiBlbnRyeSB3aXRoIGluZGV4IElELgorICBib29sIFJlYWRTTG9jRW50cnkoaW50IElEKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtb2R1bGUgaW1wb3J0IGxvY2F0aW9uIGFuZCBtb2R1bGUgbmFtZSBmb3IgdGhlCisgIC8vLyBnaXZlbiBzb3VyY2UgbWFuYWdlciBlbnRyeSBJRC4KKyAgc3RkOjpwYWlyPFNvdXJjZUxvY2F0aW9uLCBTdHJpbmdSZWY+IGdldE1vZHVsZUltcG9ydExvYyhpbnQgSUQpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGdsb2JhbCBzdWJtb2R1bGUgSUQgZ2l2ZW4gYSBtb2R1bGUgYW5kIGl0cyBsb2NhbCBJRAorICAvLy8gbnVtYmVyLgorICBzZXJpYWxpemF0aW9uOjpTdWJtb2R1bGVJRCAKKyAgZ2V0R2xvYmFsU3VibW9kdWxlSUQoTW9kdWxlRmlsZSAmTSwgdW5zaWduZWQgTG9jYWxJRCk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc3VibW9kdWxlIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBnbG9iYWwgc3VibW9kdWxlIElELgorICAvLy8KKyAgTW9kdWxlICpnZXRTdWJtb2R1bGUoc2VyaWFsaXphdGlvbjo6U3VibW9kdWxlSUQgR2xvYmFsSUQpOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG1vZHVsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBtb2R1bGUgSUQuCisgIC8vLworICAvLy8gTm90ZTogb3ZlcnJpZGVzIG1ldGhvZCBpbiBFeHRlcm5hbEFTVFNvdXJjZQorICBNb2R1bGUgKmdldE1vZHVsZSh1bnNpZ25lZCBJRCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbW9kdWxlIGZpbGUgd2l0aCBhIGdpdmVuIGxvY2FsIElEIHdpdGhpbiB0aGUgc3BlY2lmaWVkCisgIC8vLyBNb2R1bGVGaWxlLgorICBNb2R1bGVGaWxlICpnZXRMb2NhbE1vZHVsZUZpbGUoTW9kdWxlRmlsZSAmTSwgdW5zaWduZWQgSUQpOworCisgIC8vLyBcYnJpZWYgR2V0IGFuIElEIGZvciB0aGUgZ2l2ZW4gbW9kdWxlIGZpbGUuCisgIHVuc2lnbmVkIGdldE1vZHVsZUZpbGVJRChNb2R1bGVGaWxlICpNKTsKKworICAvLy8gXGJyaWVmIFJldHVybiBhIGRlc2NyaXB0b3IgZm9yIHRoZSBjb3JyZXNwb25kaW5nIG1vZHVsZS4KKyAgbGx2bTo6T3B0aW9uYWw8QVNUU291cmNlRGVzY3JpcHRvcj4gZ2V0U291cmNlRGVzY3JpcHRvcih1bnNpZ25lZCBJRCkgb3ZlcnJpZGU7CisKKyAgRXh0S2luZCBoYXNFeHRlcm5hbERlZmluaXRpb25zKGNvbnN0IERlY2wgKkQpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYSBzZWxlY3RvciBmcm9tIHRoZSBnaXZlbiBtb2R1bGUgd2l0aCBpdHMgbG9jYWwgSUQKKyAgLy8vIG51bWJlci4KKyAgU2VsZWN0b3IgZ2V0TG9jYWxTZWxlY3RvcihNb2R1bGVGaWxlICZNLCB1bnNpZ25lZCBMb2NhbElEKTsKKworICBTZWxlY3RvciBEZWNvZGVTZWxlY3RvcihzZXJpYWxpemF0aW9uOjpTZWxlY3RvcklEIElkeCk7CisKKyAgU2VsZWN0b3IgR2V0RXh0ZXJuYWxTZWxlY3RvcihzZXJpYWxpemF0aW9uOjpTZWxlY3RvcklEIElEKSBvdmVycmlkZTsKKyAgdWludDMyX3QgR2V0TnVtRXh0ZXJuYWxTZWxlY3RvcnMoKSBvdmVycmlkZTsKKworICBTZWxlY3RvciBSZWFkU2VsZWN0b3IoTW9kdWxlRmlsZSAmTSwgY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkLCB1bnNpZ25lZCAmSWR4KSB7CisgICAgcmV0dXJuIGdldExvY2FsU2VsZWN0b3IoTSwgUmVjb3JkW0lkeCsrXSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBnbG9iYWwgc2VsZWN0b3IgSUQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzCisgIC8vLyB0aGUgbG9jYWwgc2VsZWN0b3IgSUQgaW4gYSBnaXZlbiBtb2R1bGUuCisgIHNlcmlhbGl6YXRpb246OlNlbGVjdG9ySUQgZ2V0R2xvYmFsU2VsZWN0b3JJRChNb2R1bGVGaWxlICZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTG9jYWxJRCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZWFkIGEgZGVjbGFyYXRpb24gbmFtZS4KKyAgRGVjbGFyYXRpb25OYW1lIFJlYWREZWNsYXJhdGlvbk5hbWUoTW9kdWxlRmlsZSAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkLCB1bnNpZ25lZCAmSWR4KTsKKyAgdm9pZCBSZWFkRGVjbGFyYXRpb25OYW1lTG9jKE1vZHVsZUZpbGUgJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbk5hbWVMb2MgJkROTG9jLCBEZWNsYXJhdGlvbk5hbWUgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlY29yZERhdGEgJlJlY29yZCwgdW5zaWduZWQgJklkeCk7CisgIHZvaWQgUmVhZERlY2xhcmF0aW9uTmFtZUluZm8oTW9kdWxlRmlsZSAmRiwgRGVjbGFyYXRpb25OYW1lSW5mbyAmTmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkLCB1bnNpZ25lZCAmSWR4KTsKKworICB2b2lkIFJlYWRRdWFsaWZpZXJJbmZvKE1vZHVsZUZpbGUgJkYsIFF1YWxpZmllckluZm8gJkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkLCB1bnNpZ25lZCAmSWR4KTsKKworICBOZXN0ZWROYW1lU3BlY2lmaWVyICpSZWFkTmVzdGVkTmFtZVNwZWNpZmllcihNb2R1bGVGaWxlICZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWNvcmREYXRhICZSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZJZHgpOworCisgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgUmVhZE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoTW9kdWxlRmlsZSAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWNvcmREYXRhICZSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJklkeCk7CisKKyAgLy8vIFxicmllZiBSZWFkIGEgdGVtcGxhdGUgbmFtZS4KKyAgVGVtcGxhdGVOYW1lIFJlYWRUZW1wbGF0ZU5hbWUoTW9kdWxlRmlsZSAmRiwgY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmSWR4KTsKKworICAvLy8gXGJyaWVmIFJlYWQgYSB0ZW1wbGF0ZSBhcmd1bWVudC4KKyAgVGVtcGxhdGVBcmd1bWVudCBSZWFkVGVtcGxhdGVBcmd1bWVudChNb2R1bGVGaWxlICZGLCBjb25zdCBSZWNvcmREYXRhICZSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENhbm9uaWNhbGl6ZSA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIFJlYWQgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdC4KKyAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpSZWFkVGVtcGxhdGVQYXJhbWV0ZXJMaXN0KE1vZHVsZUZpbGUgJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWNvcmREYXRhICZSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmSWR4KTsKKworICAvLy8gXGJyaWVmIFJlYWQgYSB0ZW1wbGF0ZSBhcmd1bWVudCBhcnJheS4KKyAgdm9pZCBSZWFkVGVtcGxhdGVBcmd1bWVudExpc3QoU21hbGxWZWN0b3JJbXBsPFRlbXBsYXRlQXJndW1lbnQ+ICZUZW1wbEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUZpbGUgJkYsIGNvbnN0IFJlY29yZERhdGEgJlJlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJklkeCwgYm9vbCBDYW5vbmljYWxpemUgPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBSZWFkIGEgVW5yZXNvbHZlZFNldCBzdHJ1Y3R1cmUuCisgIHZvaWQgUmVhZFVucmVzb2x2ZWRTZXQoTW9kdWxlRmlsZSAmRiwgTGF6eUFTVFVucmVzb2x2ZWRTZXQgJlNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWNvcmREYXRhICZSZWNvcmQsIHVuc2lnbmVkICZJZHgpOworCisgIC8vLyBcYnJpZWYgUmVhZCBhIEMrKyBiYXNlIHNwZWNpZmllci4KKyAgQ1hYQmFzZVNwZWNpZmllciBSZWFkQ1hYQmFzZVNwZWNpZmllcihNb2R1bGVGaWxlICZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlY29yZERhdGEgJlJlY29yZCx1bnNpZ25lZCAmSWR4KTsKKworICAvLy8gXGJyaWVmIFJlYWQgYSBDWFhDdG9ySW5pdGlhbGl6ZXIgYXJyYXkuCisgIENYWEN0b3JJbml0aWFsaXplciAqKgorICBSZWFkQ1hYQ3RvckluaXRpYWxpemVycyhNb2R1bGVGaWxlICZGLCBjb25zdCBSZWNvcmREYXRhICZSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZJZHgpOworCisgIC8vLyBcYnJpZWYgUmVhZCB0aGUgY29udGVudHMgb2YgYSBDWFhDdG9ySW5pdGlhbGl6ZXIgYXJyYXkuCisgIENYWEN0b3JJbml0aWFsaXplciAqKkdldEV4dGVybmFsQ1hYQ3RvckluaXRpYWxpemVycyh1aW50NjRfdCBPZmZzZXQpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmVhZCBhIHNvdXJjZSBsb2NhdGlvbiBmcm9tIHJhdyBmb3JtIGFuZCByZXR1cm4gaXQgaW4gaXRzCisgIC8vLyBvcmlnaW5hdGluZyBtb2R1bGUgZmlsZSdzIHNvdXJjZSBsb2NhdGlvbiBzcGFjZS4KKyAgU291cmNlTG9jYXRpb24gUmVhZFVudHJhbnNsYXRlZFNvdXJjZUxvY2F0aW9uKHVpbnQzMl90IFJhdykgY29uc3QgeworICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKChSYXcgPj4gMSkgfCAoUmF3IDw8IDMxKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlYWQgYSBzb3VyY2UgbG9jYXRpb24gZnJvbSByYXcgZm9ybS4KKyAgU291cmNlTG9jYXRpb24gUmVhZFNvdXJjZUxvY2F0aW9uKE1vZHVsZUZpbGUgJk1vZHVsZUZpbGUsIHVpbnQzMl90IFJhdykgY29uc3QgeworICAgIFNvdXJjZUxvY2F0aW9uIExvYyA9IFJlYWRVbnRyYW5zbGF0ZWRTb3VyY2VMb2NhdGlvbihSYXcpOworICAgIHJldHVybiBUcmFuc2xhdGVTb3VyY2VMb2NhdGlvbihNb2R1bGVGaWxlLCBMb2MpOworICB9CisKKyAgLy8vIFxicmllZiBUcmFuc2xhdGUgYSBzb3VyY2UgbG9jYXRpb24gZnJvbSBhbm90aGVyIG1vZHVsZSBmaWxlJ3Mgc291cmNlCisgIC8vLyBsb2NhdGlvbiBzcGFjZSBpbnRvIG91cnMuCisgIFNvdXJjZUxvY2F0aW9uIFRyYW5zbGF0ZVNvdXJjZUxvY2F0aW9uKE1vZHVsZUZpbGUgJk1vZHVsZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3QgeworICAgIGlmICghTW9kdWxlRmlsZS5Nb2R1bGVPZmZzZXRNYXAuZW1wdHkoKSkKKyAgICAgIFJlYWRNb2R1bGVPZmZzZXRNYXAoTW9kdWxlRmlsZSk7CisgICAgYXNzZXJ0KE1vZHVsZUZpbGUuU0xvY1JlbWFwLmZpbmQoTG9jLmdldE9mZnNldCgpKSAhPQorICAgICAgICAgICAgICAgTW9kdWxlRmlsZS5TTG9jUmVtYXAuZW5kKCkgJiYKKyAgICAgICAgICAgIkNhbm5vdCBmaW5kIG9mZnNldCB0byByZW1hcC4iKTsKKyAgICBpbnQgUmVtYXAgPSBNb2R1bGVGaWxlLlNMb2NSZW1hcC5maW5kKExvYy5nZXRPZmZzZXQoKSktPnNlY29uZDsKKyAgICByZXR1cm4gTG9jLmdldExvY1dpdGhPZmZzZXQoUmVtYXApOworICB9CisKKyAgLy8vIFxicmllZiBSZWFkIGEgc291cmNlIGxvY2F0aW9uLgorICBTb3VyY2VMb2NhdGlvbiBSZWFkU291cmNlTG9jYXRpb24oTW9kdWxlRmlsZSAmTW9kdWxlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlY29yZERhdGFJbXBsICZSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmSWR4KSB7CisgICAgcmV0dXJuIFJlYWRTb3VyY2VMb2NhdGlvbihNb2R1bGVGaWxlLCBSZWNvcmRbSWR4KytdKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVhZCBhIHNvdXJjZSByYW5nZS4KKyAgU291cmNlUmFuZ2UgUmVhZFNvdXJjZVJhbmdlKE1vZHVsZUZpbGUgJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWNvcmREYXRhICZSZWNvcmQsIHVuc2lnbmVkICZJZHgpOworCisgIC8vLyBcYnJpZWYgUmVhZCBhbiBpbnRlZ3JhbCB2YWx1ZQorICBsbHZtOjpBUEludCBSZWFkQVBJbnQoY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkLCB1bnNpZ25lZCAmSWR4KTsKKworICAvLy8gXGJyaWVmIFJlYWQgYSBzaWduZWQgaW50ZWdyYWwgdmFsdWUKKyAgbGx2bTo6QVBTSW50IFJlYWRBUFNJbnQoY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkLCB1bnNpZ25lZCAmSWR4KTsKKworICAvLy8gXGJyaWVmIFJlYWQgYSBmbG9hdGluZy1wb2ludCB2YWx1ZQorICBsbHZtOjpBUEZsb2F0IFJlYWRBUEZsb2F0KGNvbnN0IFJlY29yZERhdGEgJlJlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpmbHRTZW1hbnRpY3MgJlNlbSwgdW5zaWduZWQgJklkeCk7CisKKyAgLy8gXGJyaWVmIFJlYWQgYSBzdHJpbmcKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIFJlYWRTdHJpbmcoY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkLCB1bnNpZ25lZCAmSWR4KTsKKworICAvLyBcYnJpZWYgU2tpcCBhIHN0cmluZworICBzdGF0aWMgdm9pZCBTa2lwU3RyaW5nKGNvbnN0IFJlY29yZERhdGEgJlJlY29yZCwgdW5zaWduZWQgJklkeCkgeworICAgIElkeCArPSBSZWNvcmRbSWR4XSArIDE7CisgIH0KKworICAvLyBcYnJpZWYgUmVhZCBhIHBhdGgKKyAgc3RkOjpzdHJpbmcgUmVhZFBhdGgoTW9kdWxlRmlsZSAmRiwgY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkLCB1bnNpZ25lZCAmSWR4KTsKKworICAvLyBcYnJpZWYgU2tpcCBhIHBhdGgKKyAgc3RhdGljIHZvaWQgU2tpcFBhdGgoY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkLCB1bnNpZ25lZCAmSWR4KSB7CisgICAgU2tpcFN0cmluZyhSZWNvcmQsIElkeCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlYWQgYSB2ZXJzaW9uIHR1cGxlLgorICBzdGF0aWMgVmVyc2lvblR1cGxlIFJlYWRWZXJzaW9uVHVwbGUoY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkLCB1bnNpZ25lZCAmSWR4KTsKKworICBDWFhUZW1wb3JhcnkgKlJlYWRDWFhUZW1wb3JhcnkoTW9kdWxlRmlsZSAmRiwgY29uc3QgUmVjb3JkRGF0YSAmUmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJklkeCk7CisKKyAgLy8vIFxicmllZiBSZWFkcyBhdHRyaWJ1dGVzIGZyb20gdGhlIGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9uLgorICB2b2lkIFJlYWRBdHRyaWJ1dGVzKEFTVFJlY29yZFJlYWRlciAmUmVjb3JkLCBBdHRyVmVjICZBdHRycyk7CisKKyAgLy8vIFxicmllZiBSZWFkcyBhIHN0YXRlbWVudC4KKyAgU3RtdCAqUmVhZFN0bXQoTW9kdWxlRmlsZSAmRik7CisKKyAgLy8vIFxicmllZiBSZWFkcyBhbiBleHByZXNzaW9uLgorICBFeHByICpSZWFkRXhwcihNb2R1bGVGaWxlICZGKTsKKworICAvLy8gXGJyaWVmIFJlYWRzIGEgc3ViLXN0YXRlbWVudCBvcGVyYW5kIGR1cmluZyBzdGF0ZW1lbnQgcmVhZGluZy4KKyAgU3RtdCAqUmVhZFN1YlN0bXQoKSB7CisgICAgYXNzZXJ0KFJlYWRpbmdLaW5kID09IFJlYWRfU3RtdCAmJgorICAgICAgICAgICAiU2hvdWxkIGJlIGNhbGxlZCBvbmx5IGR1cmluZyBzdGF0ZW1lbnQgcmVhZGluZyEiKTsKKyAgICAvLyBTdWJleHByZXNzaW9ucyBhcmUgc3RvcmVkIGZyb20gbGFzdCB0byBmaXJzdCwgc28gdGhlIG5leHQgU3RtdCB3ZSBuZWVkCisgICAgLy8gaXMgYXQgdGhlIGJhY2sgb2YgdGhlIHN0YWNrLgorICAgIGFzc2VydCghU3RtdFN0YWNrLmVtcHR5KCkgJiYgIlJlYWQgdG9vIG1hbnkgc3ViLXN0YXRlbWVudHMhIik7CisgICAgcmV0dXJuIFN0bXRTdGFjay5wb3BfYmFja192YWwoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVhZHMgYSBzdWItZXhwcmVzc2lvbiBvcGVyYW5kIGR1cmluZyBzdGF0ZW1lbnQgcmVhZGluZy4KKyAgRXhwciAqUmVhZFN1YkV4cHIoKTsKKworICAvLy8gXGJyaWVmIFJlYWRzIGEgdG9rZW4gb3V0IG9mIGEgcmVjb3JkLgorICBUb2tlbiBSZWFkVG9rZW4oTW9kdWxlRmlsZSAmTSwgY29uc3QgUmVjb3JkRGF0YUltcGwgJlJlY29yZCwgdW5zaWduZWQgJklkeCk7CisKKyAgLy8vIFxicmllZiBSZWFkcyB0aGUgbWFjcm8gcmVjb3JkIGxvY2F0ZWQgYXQgdGhlIGdpdmVuIG9mZnNldC4KKyAgTWFjcm9JbmZvICpSZWFkTWFjcm9SZWNvcmQoTW9kdWxlRmlsZSAmRiwgdWludDY0X3QgT2Zmc2V0KTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgZ2xvYmFsIHByZXByb2Nlc3NlZCBlbnRpdHkgSUQgdGhhdCBjb3JyZXNwb25kcyB0bworICAvLy8gdGhlIGdpdmVuIGxvY2FsIElEIHdpdGhpbiB0aGUgZ2l2ZW4gbW9kdWxlLgorICBzZXJpYWxpemF0aW9uOjpQcmVwcm9jZXNzZWRFbnRpdHlJRAorICBnZXRHbG9iYWxQcmVwcm9jZXNzZWRFbnRpdHlJRChNb2R1bGVGaWxlICZNLCB1bnNpZ25lZCBMb2NhbElEKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEFkZCBhIG1hY3JvIHRvIGRlc2VyaWFsaXplIGl0cyBtYWNybyBkaXJlY3RpdmUgaGlzdG9yeS4KKyAgLy8vCisgIC8vLyBccGFyYW0gSUkgVGhlIG5hbWUgb2YgdGhlIG1hY3JvLgorICAvLy8gXHBhcmFtIE0gVGhlIG1vZHVsZSBmaWxlLgorICAvLy8gXHBhcmFtIE1hY3JvRGlyZWN0aXZlc09mZnNldCBPZmZzZXQgb2YgdGhlIHNlcmlhbGl6ZWQgbWFjcm8gZGlyZWN0aXZlCisgIC8vLyBoaXN0b3J5LgorICB2b2lkIGFkZFBlbmRpbmdNYWNybyhJZGVudGlmaWVySW5mbyAqSUksIE1vZHVsZUZpbGUgKk0sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE1hY3JvRGlyZWN0aXZlc09mZnNldCk7CisKKyAgLy8vIFxicmllZiBSZWFkIHRoZSBzZXQgb2YgbWFjcm9zIGRlZmluZWQgYnkgdGhpcyBleHRlcm5hbCBtYWNybyBzb3VyY2UuCisgIHZvaWQgUmVhZERlZmluZWRNYWNyb3MoKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFVwZGF0ZSBhbiBvdXQtb2YtZGF0ZSBpZGVudGlmaWVyLgorICB2b2lkIHVwZGF0ZU91dE9mRGF0ZUlkZW50aWZpZXIoSWRlbnRpZmllckluZm8gJklJKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIE5vdGUgdGhhdCB0aGlzIGlkZW50aWZpZXIgaXMgdXAtdG8tZGF0ZS4KKyAgdm9pZCBtYXJrSWRlbnRpZmllclVwVG9EYXRlKElkZW50aWZpZXJJbmZvICpJSSk7CisKKyAgLy8vIFxicmllZiBMb2FkIGFsbCBleHRlcm5hbCB2aXNpYmxlIGRlY2xzIGluIHRoZSBnaXZlbiBEZWNsQ29udGV4dC4KKyAgdm9pZCBjb21wbGV0ZVZpc2libGVEZWNsc01hcChjb25zdCBEZWNsQ29udGV4dCAqREMpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIEFTVCBjb250ZXh0IHRoYXQgdGhpcyBBU1QgcmVhZGVyIHN1cHBsZW1lbnRzLgorICBBU1RDb250ZXh0ICZnZXRDb250ZXh0KCkgeworICAgIGFzc2VydChDb250ZXh0T2JqICYmICJyZXF1ZXN0ZWQgQVNUIGNvbnRleHQgd2hlbiBub3QgbG9hZGluZyBBU1QiKTsKKyAgICByZXR1cm4gKkNvbnRleHRPYmo7CisgIH0KKworICAvLyBcYnJpZWYgQ29udGFpbnMgdGhlIElEcyBmb3IgZGVjbGFyYXRpb25zIHRoYXQgd2VyZSByZXF1ZXN0ZWQgYmVmb3JlIHdlIGhhdmUKKyAgLy8gYWNjZXNzIHRvIGEgU2VtYSBvYmplY3QuCisgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCAxNj4gUHJlbG9hZGVkRGVjbElEczsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzZW1hbnRpYyBhbmFseXNpcyBvYmplY3QgdXNlZCB0byBhbmFseXplIHRoZQorICAvLy8gdHJhbnNsYXRpb24gdW5pdCBpbiB3aGljaCB0aGUgcHJlY29tcGlsZWQgaGVhZGVyIGlzIGJlaW5nCisgIC8vLyBpbXBvcnRlZC4KKyAgU2VtYSAqZ2V0U2VtYSgpIHsgcmV0dXJuIFNlbWFPYmo7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgaWRlbnRpZmllciByZXNvbHZlciB1c2VkIGZvciBuYW1lIGxvb2t1cCAvIHVwZGF0ZXMKKyAgLy8vIGluIHRoZSB0cmFuc2xhdGlvbiB1bml0IHNjb3BlLiBXZSBoYXZlIG9uZSBvZiB0aGVzZSBldmVuIGlmIHdlIGRvbid0CisgIC8vLyBoYXZlIGEgU2VtYSBvYmplY3QuCisgIElkZW50aWZpZXJSZXNvbHZlciAmZ2V0SWRSZXNvbHZlcigpOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGlkZW50aWZpZXIgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAvLy8gcHJlcHJvY2Vzc29yLgorICBJZGVudGlmaWVyVGFibGUgJmdldElkZW50aWZpZXJUYWJsZSgpOworCisgIC8vLyBcYnJpZWYgUmVjb3JkIHRoYXQgdGhlIGdpdmVuIElEIG1hcHMgdG8gdGhlIGdpdmVuIHN3aXRjaC1jYXNlCisgIC8vLyBzdGF0ZW1lbnQuCisgIHZvaWQgUmVjb3JkU3dpdGNoQ2FzZUlEKFN3aXRjaENhc2UgKlNDLCB1bnNpZ25lZCBJRCk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc3dpdGNoLWNhc2Ugc3RhdGVtZW50IHdpdGggdGhlIGdpdmVuIElELgorICBTd2l0Y2hDYXNlICpnZXRTd2l0Y2hDYXNlV2l0aElEKHVuc2lnbmVkIElEKTsKKworICB2b2lkIENsZWFyU3dpdGNoQ2FzZUlEcygpOworCisgIC8vLyBcYnJpZWYgQ3Vyc29ycyBmb3IgY29tbWVudHMgYmxvY2tzLgorICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8bGx2bTo6Qml0c3RyZWFtQ3Vyc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbjo6TW9kdWxlRmlsZSAqPiwgOD4gQ29tbWVudHNDdXJzb3JzOworCisgIC8vLyBcYnJpZWYgTG9hZHMgY29tbWVudHMgcmFuZ2VzLgorICB2b2lkIFJlYWRDb21tZW50cygpIG92ZXJyaWRlOworCisgIC8vLyBWaXNpdCBhbGwgdGhlIGlucHV0IGZpbGVzIG9mIHRoZSBnaXZlbiBtb2R1bGUgZmlsZS4KKyAgdm9pZCB2aXNpdElucHV0RmlsZXMoc2VyaWFsaXphdGlvbjo6TW9kdWxlRmlsZSAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5jbHVkZVN5c3RlbSwgYm9vbCBDb21wbGFpbiwKKyAgICAgICAgICBsbHZtOjpmdW5jdGlvbl9yZWY8dm9pZChjb25zdCBzZXJpYWxpemF0aW9uOjpJbnB1dEZpbGUgJklGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTeXN0ZW0pPiBWaXNpdG9yKTsKKworICAvLy8gVmlzaXQgYWxsIHRoZSB0b3AtbGV2ZWwgbW9kdWxlIG1hcHMgbG9hZGVkIHdoZW4gYnVpbGRpbmcgdGhlIGdpdmVuIG1vZHVsZQorICAvLy8gZmlsZS4KKyAgdm9pZCB2aXNpdFRvcExldmVsTW9kdWxlTWFwcyhzZXJpYWxpemF0aW9uOjpNb2R1bGVGaWxlICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpmdW5jdGlvbl9yZWY8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQoY29uc3QgRmlsZUVudHJ5ICopPiBWaXNpdG9yKTsKKworICBib29sIGlzUHJvY2Vzc2luZ1VwZGF0ZVJlY29yZHMoKSB7IHJldHVybiBQcm9jZXNzaW5nVXBkYXRlUmVjb3JkczsgfQorfTsKKworLy8vIFxicmllZiBBbiBvYmplY3QgZm9yIHN0cmVhbWluZyBpbmZvcm1hdGlvbiBmcm9tIGEgcmVjb3JkLgorY2xhc3MgQVNUUmVjb3JkUmVhZGVyIHsKKyAgdXNpbmcgTW9kdWxlRmlsZSA9IHNlcmlhbGl6YXRpb246Ok1vZHVsZUZpbGU7CisKKyAgQVNUUmVhZGVyICpSZWFkZXI7CisgIE1vZHVsZUZpbGUgKkY7CisgIHVuc2lnbmVkIElkeCA9IDA7CisgIEFTVFJlYWRlcjo6UmVjb3JkRGF0YSBSZWNvcmQ7CisKKyAgdXNpbmcgUmVjb3JkRGF0YSA9IEFTVFJlYWRlcjo6UmVjb3JkRGF0YTsKKyAgdXNpbmcgUmVjb3JkRGF0YUltcGwgPSBBU1RSZWFkZXI6OlJlY29yZERhdGFJbXBsOworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3QgYW4gQVNUUmVjb3JkUmVhZGVyIHRoYXQgdXNlcyB0aGUgZGVmYXVsdCBlbmNvZGluZyBzY2hlbWUuCisgIEFTVFJlY29yZFJlYWRlcihBU1RSZWFkZXIgJlJlYWRlciwgTW9kdWxlRmlsZSAmRikgOiBSZWFkZXIoJlJlYWRlciksIEYoJkYpIHt9CisKKyAgLy8vIFxicmllZiBSZWFkcyBhIHJlY29yZCB3aXRoIGlkIEFiYnJldklEIGZyb20gQ3Vyc29yLCByZXNldHRpbmcgdGhlCisgIC8vLyBpbnRlcm5hbCBzdGF0ZS4KKyAgdW5zaWduZWQgcmVhZFJlY29yZChsbHZtOjpCaXRzdHJlYW1DdXJzb3IgJkN1cnNvciwgdW5zaWduZWQgQWJicmV2SUQpOworCisgIC8vLyBcYnJpZWYgSXMgdGhpcyBhIG1vZHVsZSBmaWxlIGZvciBhIG1vZHVsZSAocmF0aGVyIHRoYW4gYSBQQ0ggb3Igc2ltaWxhcikuCisgIGJvb2wgaXNNb2R1bGUoKSBjb25zdCB7IHJldHVybiBGLT5pc01vZHVsZSgpOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgQVNUIGNvbnRleHQgdGhhdCB0aGlzIEFTVCByZWFkZXIgc3VwcGxlbWVudHMuCisgIEFTVENvbnRleHQgJmdldENvbnRleHQoKSB7IHJldHVybiBSZWFkZXItPmdldENvbnRleHQoKTsgfQorCisgIC8vLyBcYnJpZWYgVGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhpcyByZWNvcmQuCisgIHVuc2lnbmVkIGdldElkeCgpIGNvbnN0IHsgcmV0dXJuIElkeDsgfQorCisgIC8vLyBcYnJpZWYgVGhlIGxlbmd0aCBvZiB0aGlzIHJlY29yZC4KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBSZWNvcmQuc2l6ZSgpOyB9CisKKyAgLy8vIFxicmllZiBBbiBhcmJpdHJhcnkgaW5kZXggaW4gdGhpcyByZWNvcmQuCisgIGNvbnN0IHVpbnQ2NF90ICZvcGVyYXRvcltdKHNpemVfdCBOKSB7IHJldHVybiBSZWNvcmRbTl07IH0KKworICAvLy8gXGJyaWVmIFRoZSBsYXN0IGVsZW1lbnQgaW4gdGhpcyByZWNvcmQuCisgIGNvbnN0IHVpbnQ2NF90ICZiYWNrKCkgY29uc3QgeyByZXR1cm4gUmVjb3JkLmJhY2soKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGlzIHJlY29yZCwgYW5kIGFkdmFuY2VzIHRvIHRoZQorICAvLy8gbmV4dCB2YWx1ZS4KKyAgY29uc3QgdWludDY0X3QgJnJlYWRJbnQoKSB7IHJldHVybiBSZWNvcmRbSWR4KytdOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoaXMgcmVjb3JkLCB3aXRob3V0IGFkdmFuY2luZy4KKyAgY29uc3QgdWludDY0X3QgJnBlZWtJbnQoKSB7IHJldHVybiBSZWNvcmRbSWR4XTsgfQorCisgIC8vLyBcYnJpZWYgU2tpcHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdmFsdWVzLgorICB2b2lkIHNraXBJbnRzKHVuc2lnbmVkIE4pIHsgSWR4ICs9IE47IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBnbG9iYWwgc3VibW9kdWxlIElEIGl0cyBsb2NhbCBJRCBudW1iZXIuCisgIHNlcmlhbGl6YXRpb246OlN1Ym1vZHVsZUlECisgIGdldEdsb2JhbFN1Ym1vZHVsZUlEKHVuc2lnbmVkIExvY2FsSUQpIHsKKyAgICByZXR1cm4gUmVhZGVyLT5nZXRHbG9iYWxTdWJtb2R1bGVJRCgqRiwgTG9jYWxJRCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzdWJtb2R1bGUgdGhhdCBjb3JyZXNwb25kcyB0byBhIGdsb2JhbCBzdWJtb2R1bGUgSUQuCisgIE1vZHVsZSAqZ2V0U3VibW9kdWxlKHNlcmlhbGl6YXRpb246OlN1Ym1vZHVsZUlEIEdsb2JhbElEKSB7CisgICAgcmV0dXJuIFJlYWRlci0+Z2V0U3VibW9kdWxlKEdsb2JhbElEKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVhZCB0aGUgcmVjb3JkIHRoYXQgZGVzY3JpYmVzIHRoZSBsZXhpY2FsIGNvbnRlbnRzIG9mIGEgREMuCisgIGJvb2wgcmVhZExleGljYWxEZWNsQ29udGV4dFN0b3JhZ2UodWludDY0X3QgT2Zmc2V0LCBEZWNsQ29udGV4dCAqREMpIHsKKyAgICByZXR1cm4gUmVhZGVyLT5SZWFkTGV4aWNhbERlY2xDb250ZXh0U3RvcmFnZSgqRiwgRi0+RGVjbHNDdXJzb3IsIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQyk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlYWQgdGhlIHJlY29yZCB0aGF0IGRlc2NyaWJlcyB0aGUgdmlzaWJsZSBjb250ZW50cyBvZiBhIERDLgorICBib29sIHJlYWRWaXNpYmxlRGVjbENvbnRleHRTdG9yYWdlKHVpbnQ2NF90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uOjpEZWNsSUQgSUQpIHsKKyAgICByZXR1cm4gUmVhZGVyLT5SZWFkVmlzaWJsZURlY2xDb250ZXh0U3RvcmFnZSgqRiwgRi0+RGVjbHNDdXJzb3IsIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRCk7CisgIH0KKworICB2b2lkIHJlYWRFeGNlcHRpb25TcGVjKFNtYWxsVmVjdG9ySW1wbDxRdWFsVHlwZT4gJkV4Y2VwdGlvblN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25Qcm90b1R5cGU6OkV4Y2VwdGlvblNwZWNJbmZvICZFU0kpIHsKKyAgICByZXR1cm4gUmVhZGVyLT5yZWFkRXhjZXB0aW9uU3BlYygqRiwgRXhjZXB0aW9uU3RvcmFnZSwgRVNJLCBSZWNvcmQsIElkeCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgZ2xvYmFsIG9mZnNldCBjb3JyZXNwb25kaW5nIHRvIGEgbG9jYWwgb2Zmc2V0LgorICB1aW50NjRfdCBnZXRHbG9iYWxCaXRPZmZzZXQodWludDMyX3QgTG9jYWxPZmZzZXQpIHsKKyAgICByZXR1cm4gUmVhZGVyLT5nZXRHbG9iYWxCaXRPZmZzZXQoKkYsIExvY2FsT2Zmc2V0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVhZHMgYSBzdGF0ZW1lbnQuCisgIFN0bXQgKnJlYWRTdG10KCkgeyByZXR1cm4gUmVhZGVyLT5SZWFkU3RtdCgqRik7IH0KKworICAvLy8gXGJyaWVmIFJlYWRzIGFuIGV4cHJlc3Npb24uCisgIEV4cHIgKnJlYWRFeHByKCkgeyByZXR1cm4gUmVhZGVyLT5SZWFkRXhwcigqRik7IH0KKworICAvLy8gXGJyaWVmIFJlYWRzIGEgc3ViLXN0YXRlbWVudCBvcGVyYW5kIGR1cmluZyBzdGF0ZW1lbnQgcmVhZGluZy4KKyAgU3RtdCAqcmVhZFN1YlN0bXQoKSB7IHJldHVybiBSZWFkZXItPlJlYWRTdWJTdG10KCk7IH0KKworICAvLy8gXGJyaWVmIFJlYWRzIGEgc3ViLWV4cHJlc3Npb24gb3BlcmFuZCBkdXJpbmcgc3RhdGVtZW50IHJlYWRpbmcuCisgIEV4cHIgKnJlYWRTdWJFeHByKCkgeyByZXR1cm4gUmVhZGVyLT5SZWFkU3ViRXhwcigpOyB9CisKKyAgLy8vIFxicmllZiBSZWFkcyBhIGRlY2xhcmF0aW9uIHdpdGggdGhlIGdpdmVuIGxvY2FsIElEIGluIHRoZSBnaXZlbiBtb2R1bGUuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIHJlcXVlc3RlZCBkZWNsYXJhdGlvbiwgY2FzdGVkIHRvIHRoZSBnaXZlbiByZXR1cm4gdHlwZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgVCAqR2V0TG9jYWxEZWNsQXModWludDMyX3QgTG9jYWxJRCkgeworICAgIHJldHVybiBjYXN0X29yX251bGw8VD4oUmVhZGVyLT5HZXRMb2NhbERlY2woKkYsIExvY2FsSUQpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVhZHMgYSBUZW1wbGF0ZUFyZ3VtZW50TG9jSW5mbyBhcHByb3ByaWF0ZSBmb3IgdGhlCisgIC8vLyBnaXZlbiBUZW1wbGF0ZUFyZ3VtZW50IGtpbmQsIGFkdmFuY2luZyBJZHguCisgIFRlbXBsYXRlQXJndW1lbnRMb2NJbmZvCisgIGdldFRlbXBsYXRlQXJndW1lbnRMb2NJbmZvKFRlbXBsYXRlQXJndW1lbnQ6OkFyZ0tpbmQgS2luZCkgeworICAgIHJldHVybiBSZWFkZXItPkdldFRlbXBsYXRlQXJndW1lbnRMb2NJbmZvKCpGLCBLaW5kLCBSZWNvcmQsIElkeCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlYWRzIGEgVGVtcGxhdGVBcmd1bWVudExvYywgYWR2YW5jaW5nIElkeC4KKyAgVGVtcGxhdGVBcmd1bWVudExvYworICByZWFkVGVtcGxhdGVBcmd1bWVudExvYygpIHsKKyAgICByZXR1cm4gUmVhZGVyLT5SZWFkVGVtcGxhdGVBcmd1bWVudExvYygqRiwgUmVjb3JkLCBJZHgpOworICB9CisKKyAgY29uc3QgQVNUVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvKgorICByZWFkQVNUVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvKCkgeworICAgIHJldHVybiBSZWFkZXItPlJlYWRBU1RUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8oKkYsIFJlY29yZCwgSWR4KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVhZHMgYSBkZWNsYXJhdG9yIGluZm8gZnJvbSB0aGUgZ2l2ZW4gcmVjb3JkLCBhZHZhbmNpbmcgSWR4LgorICBUeXBlU291cmNlSW5mbyAqZ2V0VHlwZVNvdXJjZUluZm8oKSB7CisgICAgcmV0dXJuIFJlYWRlci0+R2V0VHlwZVNvdXJjZUluZm8oKkYsIFJlY29yZCwgSWR4KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTWFwIGEgbG9jYWwgdHlwZSBJRCB3aXRoaW4gYSBnaXZlbiBBU1QgZmlsZSB0byBhIGdsb2JhbCB0eXBlIElELgorICBzZXJpYWxpemF0aW9uOjpUeXBlSUQgZ2V0R2xvYmFsVHlwZUlEKHVuc2lnbmVkIExvY2FsSUQpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVhZGVyLT5nZXRHbG9iYWxUeXBlSUQoKkYsIExvY2FsSUQpOworICB9CisKKyAgLy8vIFxicmllZiBSZWFkIGEgdHlwZSBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSByZWNvcmQuCisgIFF1YWxUeXBlIHJlYWRUeXBlKCkgeworICAgIHJldHVybiBSZWFkZXItPnJlYWRUeXBlKCpGLCBSZWNvcmQsIElkeCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlYWRzIGEgZGVjbGFyYXRpb24gSUQgZnJvbSB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gdGhpcyByZWNvcmQuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIGRlY2xhcmF0aW9uIElEIHJlYWQgZnJvbSB0aGUgcmVjb3JkLCBhZGp1c3RlZCB0byBhIGdsb2JhbCBJRC4KKyAgc2VyaWFsaXphdGlvbjo6RGVjbElEIHJlYWREZWNsSUQoKSB7CisgICAgcmV0dXJuIFJlYWRlci0+UmVhZERlY2xJRCgqRiwgUmVjb3JkLCBJZHgpOworICB9CisKKyAgLy8vIFxicmllZiBSZWFkcyBhIGRlY2xhcmF0aW9uIGZyb20gdGhlIGdpdmVuIHBvc2l0aW9uIGluIGEgcmVjb3JkIGluIHRoZQorICAvLy8gZ2l2ZW4gbW9kdWxlLCBhZHZhbmNpbmcgSWR4LgorICBEZWNsICpyZWFkRGVjbCgpIHsKKyAgICByZXR1cm4gUmVhZGVyLT5SZWFkRGVjbCgqRiwgUmVjb3JkLCBJZHgpOworICB9CisKKyAgLy8vIFxicmllZiBSZWFkcyBhIGRlY2xhcmF0aW9uIGZyb20gdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoZSByZWNvcmQsCisgIC8vLyBhZHZhbmNpbmcgSWR4LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSBkZWNsYXJhdGlvbiByZWFkIGZyb20gdGhpcyBsb2NhdGlvbiwgY2FzdGVkIHRvIHRoZSBnaXZlbgorICAvLy8gcmVzdWx0IHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIFQgKnJlYWREZWNsQXMoKSB7CisgICAgcmV0dXJuIFJlYWRlci0+UmVhZERlY2xBczxUPigqRiwgUmVjb3JkLCBJZHgpOworICB9CisKKyAgSWRlbnRpZmllckluZm8gKmdldElkZW50aWZpZXJJbmZvKCkgeworICAgIHJldHVybiBSZWFkZXItPkdldElkZW50aWZpZXJJbmZvKCpGLCBSZWNvcmQsIElkeCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlYWQgYSBzZWxlY3RvciBmcm9tIHRoZSBSZWNvcmQsIGFkdmFuY2luZyBJZHguCisgIFNlbGVjdG9yIHJlYWRTZWxlY3RvcigpIHsKKyAgICByZXR1cm4gUmVhZGVyLT5SZWFkU2VsZWN0b3IoKkYsIFJlY29yZCwgSWR4KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVhZCBhIGRlY2xhcmF0aW9uIG5hbWUsIGFkdmFuY2luZyBJZHguCisgIERlY2xhcmF0aW9uTmFtZSByZWFkRGVjbGFyYXRpb25OYW1lKCkgeworICAgIHJldHVybiBSZWFkZXItPlJlYWREZWNsYXJhdGlvbk5hbWUoKkYsIFJlY29yZCwgSWR4KTsKKyAgfQorICB2b2lkIHJlYWREZWNsYXJhdGlvbk5hbWVMb2MoRGVjbGFyYXRpb25OYW1lTG9jICZETkxvYywgRGVjbGFyYXRpb25OYW1lIE5hbWUpIHsKKyAgICByZXR1cm4gUmVhZGVyLT5SZWFkRGVjbGFyYXRpb25OYW1lTG9jKCpGLCBETkxvYywgTmFtZSwgUmVjb3JkLCBJZHgpOworICB9CisgIHZvaWQgcmVhZERlY2xhcmF0aW9uTmFtZUluZm8oRGVjbGFyYXRpb25OYW1lSW5mbyAmTmFtZUluZm8pIHsKKyAgICByZXR1cm4gUmVhZGVyLT5SZWFkRGVjbGFyYXRpb25OYW1lSW5mbygqRiwgTmFtZUluZm8sIFJlY29yZCwgSWR4KTsKKyAgfQorCisgIHZvaWQgcmVhZFF1YWxpZmllckluZm8oUXVhbGlmaWVySW5mbyAmSW5mbykgeworICAgIHJldHVybiBSZWFkZXItPlJlYWRRdWFsaWZpZXJJbmZvKCpGLCBJbmZvLCBSZWNvcmQsIElkeCk7CisgIH0KKworICBOZXN0ZWROYW1lU3BlY2lmaWVyICpyZWFkTmVzdGVkTmFtZVNwZWNpZmllcigpIHsKKyAgICByZXR1cm4gUmVhZGVyLT5SZWFkTmVzdGVkTmFtZVNwZWNpZmllcigqRiwgUmVjb3JkLCBJZHgpOworICB9CisKKyAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyByZWFkTmVzdGVkTmFtZVNwZWNpZmllckxvYygpIHsKKyAgICByZXR1cm4gUmVhZGVyLT5SZWFkTmVzdGVkTmFtZVNwZWNpZmllckxvYygqRiwgUmVjb3JkLCBJZHgpOworICB9CisKKyAgLy8vIFxicmllZiBSZWFkIGEgdGVtcGxhdGUgbmFtZSwgYWR2YW5jaW5nIElkeC4KKyAgVGVtcGxhdGVOYW1lIHJlYWRUZW1wbGF0ZU5hbWUoKSB7CisgICAgcmV0dXJuIFJlYWRlci0+UmVhZFRlbXBsYXRlTmFtZSgqRiwgUmVjb3JkLCBJZHgpOworICB9CisKKyAgLy8vIFxicmllZiBSZWFkIGEgdGVtcGxhdGUgYXJndW1lbnQsIGFkdmFuY2luZyBJZHguCisgIFRlbXBsYXRlQXJndW1lbnQgcmVhZFRlbXBsYXRlQXJndW1lbnQoYm9vbCBDYW5vbmljYWxpemUgPSBmYWxzZSkgeworICAgIHJldHVybiBSZWFkZXItPlJlYWRUZW1wbGF0ZUFyZ3VtZW50KCpGLCBSZWNvcmQsIElkeCwgQ2Fub25pY2FsaXplKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVhZCBhIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0LCBhZHZhbmNpbmcgSWR4LgorICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKnJlYWRUZW1wbGF0ZVBhcmFtZXRlckxpc3QoKSB7CisgICAgcmV0dXJuIFJlYWRlci0+UmVhZFRlbXBsYXRlUGFyYW1ldGVyTGlzdCgqRiwgUmVjb3JkLCBJZHgpOworICB9CisKKyAgLy8vIFxicmllZiBSZWFkIGEgdGVtcGxhdGUgYXJndW1lbnQgYXJyYXksIGFkdmFuY2luZyBJZHguCisgIHZvaWQgcmVhZFRlbXBsYXRlQXJndW1lbnRMaXN0KFNtYWxsVmVjdG9ySW1wbDxUZW1wbGF0ZUFyZ3VtZW50PiAmVGVtcGxBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENhbm9uaWNhbGl6ZSA9IGZhbHNlKSB7CisgICAgcmV0dXJuIFJlYWRlci0+UmVhZFRlbXBsYXRlQXJndW1lbnRMaXN0KFRlbXBsQXJncywgKkYsIFJlY29yZCwgSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5vbmljYWxpemUpOworICB9CisKKyAgLy8vIFxicmllZiBSZWFkIGEgVW5yZXNvbHZlZFNldCBzdHJ1Y3R1cmUsIGFkdmFuY2luZyBJZHguCisgIHZvaWQgcmVhZFVucmVzb2x2ZWRTZXQoTGF6eUFTVFVucmVzb2x2ZWRTZXQgJlNldCkgeworICAgIHJldHVybiBSZWFkZXItPlJlYWRVbnJlc29sdmVkU2V0KCpGLCBTZXQsIFJlY29yZCwgSWR4KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVhZCBhIEMrKyBiYXNlIHNwZWNpZmllciwgYWR2YW5jaW5nIElkeC4KKyAgQ1hYQmFzZVNwZWNpZmllciByZWFkQ1hYQmFzZVNwZWNpZmllcigpIHsKKyAgICByZXR1cm4gUmVhZGVyLT5SZWFkQ1hYQmFzZVNwZWNpZmllcigqRiwgUmVjb3JkLCBJZHgpOworICB9CisKKyAgLy8vIFxicmllZiBSZWFkIGEgQ1hYQ3RvckluaXRpYWxpemVyIGFycmF5LCBhZHZhbmNpbmcgSWR4LgorICBDWFhDdG9ySW5pdGlhbGl6ZXIgKipyZWFkQ1hYQ3RvckluaXRpYWxpemVycygpIHsKKyAgICByZXR1cm4gUmVhZGVyLT5SZWFkQ1hYQ3RvckluaXRpYWxpemVycygqRiwgUmVjb3JkLCBJZHgpOworICB9CisKKyAgQ1hYVGVtcG9yYXJ5ICpyZWFkQ1hYVGVtcG9yYXJ5KCkgeworICAgIHJldHVybiBSZWFkZXItPlJlYWRDWFhUZW1wb3JhcnkoKkYsIFJlY29yZCwgSWR4KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVhZCBhIHNvdXJjZSBsb2NhdGlvbiwgYWR2YW5jaW5nIElkeC4KKyAgU291cmNlTG9jYXRpb24gcmVhZFNvdXJjZUxvY2F0aW9uKCkgeworICAgIHJldHVybiBSZWFkZXItPlJlYWRTb3VyY2VMb2NhdGlvbigqRiwgUmVjb3JkLCBJZHgpOworICB9CisKKyAgLy8vIFxicmllZiBSZWFkIGEgc291cmNlIHJhbmdlLCBhZHZhbmNpbmcgSWR4LgorICBTb3VyY2VSYW5nZSByZWFkU291cmNlUmFuZ2UoKSB7CisgICAgcmV0dXJuIFJlYWRlci0+UmVhZFNvdXJjZVJhbmdlKCpGLCBSZWNvcmQsIElkeCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlYWQgYW4gaW50ZWdyYWwgdmFsdWUsIGFkdmFuY2luZyBJZHguCisgIGxsdm06OkFQSW50IHJlYWRBUEludCgpIHsKKyAgICByZXR1cm4gUmVhZGVyLT5SZWFkQVBJbnQoUmVjb3JkLCBJZHgpOworICB9CisKKyAgLy8vIFxicmllZiBSZWFkIGEgc2lnbmVkIGludGVncmFsIHZhbHVlLCBhZHZhbmNpbmcgSWR4LgorICBsbHZtOjpBUFNJbnQgcmVhZEFQU0ludCgpIHsKKyAgICByZXR1cm4gUmVhZGVyLT5SZWFkQVBTSW50KFJlY29yZCwgSWR4KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVhZCBhIGZsb2F0aW5nLXBvaW50IHZhbHVlLCBhZHZhbmNpbmcgSWR4LgorICBsbHZtOjpBUEZsb2F0IHJlYWRBUEZsb2F0KGNvbnN0IGxsdm06OmZsdFNlbWFudGljcyAmU2VtKSB7CisgICAgcmV0dXJuIFJlYWRlci0+UmVhZEFQRmxvYXQoUmVjb3JkLCBTZW0sSWR4KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVhZCBhIHN0cmluZywgYWR2YW5jaW5nIElkeC4KKyAgc3RkOjpzdHJpbmcgcmVhZFN0cmluZygpIHsKKyAgICByZXR1cm4gUmVhZGVyLT5SZWFkU3RyaW5nKFJlY29yZCwgSWR4KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVhZCBhIHBhdGgsIGFkdmFuY2luZyBJZHguCisgIHN0ZDo6c3RyaW5nIHJlYWRQYXRoKCkgeworICAgIHJldHVybiBSZWFkZXItPlJlYWRQYXRoKCpGLCBSZWNvcmQsIElkeCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlYWQgYSB2ZXJzaW9uIHR1cGxlLCBhZHZhbmNpbmcgSWR4LgorICBWZXJzaW9uVHVwbGUgcmVhZFZlcnNpb25UdXBsZSgpIHsKKyAgICByZXR1cm4gQVNUUmVhZGVyOjpSZWFkVmVyc2lvblR1cGxlKFJlY29yZCwgSWR4KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVhZHMgYXR0cmlidXRlcyBmcm9tIHRoZSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbiwgYWR2YW5jaW5nIElkeC4KKyAgdm9pZCByZWFkQXR0cmlidXRlcyhBdHRyVmVjICZBdHRycykgeworICAgIHJldHVybiBSZWFkZXItPlJlYWRBdHRyaWJ1dGVzKCp0aGlzLCBBdHRycyk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlYWRzIGEgdG9rZW4gb3V0IG9mIGEgcmVjb3JkLCBhZHZhbmNpbmcgSWR4LgorICBUb2tlbiByZWFkVG9rZW4oKSB7CisgICAgcmV0dXJuIFJlYWRlci0+UmVhZFRva2VuKCpGLCBSZWNvcmQsIElkeCk7CisgIH0KKworICB2b2lkIHJlY29yZFN3aXRjaENhc2VJRChTd2l0Y2hDYXNlICpTQywgdW5zaWduZWQgSUQpIHsKKyAgICBSZWFkZXItPlJlY29yZFN3aXRjaENhc2VJRChTQywgSUQpOworICB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc3dpdGNoLWNhc2Ugc3RhdGVtZW50IHdpdGggdGhlIGdpdmVuIElELgorICBTd2l0Y2hDYXNlICpnZXRTd2l0Y2hDYXNlV2l0aElEKHVuc2lnbmVkIElEKSB7CisgICAgcmV0dXJuIFJlYWRlci0+Z2V0U3dpdGNoQ2FzZVdpdGhJRChJRCk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgSGVscGVyIGNsYXNzIHRoYXQgc2F2ZXMgdGhlIGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9uIGFuZAorLy8vIHRoZW4gcmVzdG9yZXMgaXQgd2hlbiBkZXN0cm95ZWQuCitzdHJ1Y3QgU2F2ZWRTdHJlYW1Qb3NpdGlvbiB7CisgIGV4cGxpY2l0IFNhdmVkU3RyZWFtUG9zaXRpb24obGx2bTo6Qml0c3RyZWFtQ3Vyc29yICZDdXJzb3IpCisgICAgICA6IEN1cnNvcihDdXJzb3IpLCBPZmZzZXQoQ3Vyc29yLkdldEN1cnJlbnRCaXRObygpKSB7fQorCisgIH5TYXZlZFN0cmVhbVBvc2l0aW9uKCkgeworICAgIEN1cnNvci5KdW1wVG9CaXQoT2Zmc2V0KTsKKyAgfQorCitwcml2YXRlOgorICBsbHZtOjpCaXRzdHJlYW1DdXJzb3IgJkN1cnNvcjsKKyAgdWludDY0X3QgT2Zmc2V0OworfTsKKworaW5saW5lIHZvaWQgUENIVmFsaWRhdG9yOjpFcnJvcihjb25zdCBjaGFyICpNc2cpIHsKKyAgUmVhZGVyLkVycm9yKE1zZyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1NFUklBTElaQVRJT05fQVNUUkVBREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vQVNUV3JpdGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL0FTVFdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MzdiZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL0FTVFdyaXRlci5oCkBAIC0wLDAgKzEsOTk2IEBACisvLz09PS0gQVNUV3JpdGVyLmggLSBBU1QgRmlsZSBXcml0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQVNUV3JpdGVyIGNsYXNzLCB3aGljaCB3cml0ZXMgYW4gQVNUIGZpbGUKKy8vICBjb250YWluaW5nIGEgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zbGF0aW9uIHVuaXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NFUklBTElaQVRJT05fQVNUV1JJVEVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TRVJJQUxJWkFUSU9OX0FTVFdSSVRFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvQVNUTXV0YXRpb25MaXN0ZW5lci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xhcmF0aW9uTmFtZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9OZXN0ZWROYW1lU3BlY2lmaWVyLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1RlbXBsYXRlQmFzZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UZW1wbGF0ZU5hbWUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTG9jLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvUENIQ29udGFpbmVyT3BlcmF0aW9ucy5oIgorI2luY2x1ZGUgImNsYW5nL1NlbWEvU2VtYUNvbnN1bWVyLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VyaWFsaXphdGlvbi9BU1RCaXRDb2Rlcy5oIgorI2luY2x1ZGUgImNsYW5nL1NlcmlhbGl6YXRpb24vQVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9NYXBWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQml0Y29kZS9CaXRzdHJlYW1Xcml0ZXIuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFQRmxvYXQ7CitjbGFzcyBBUEludDsKK2NsYXNzIEFQU0ludDsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBU1RDb250ZXh0OworY2xhc3MgQVNUUmVhZGVyOworY2xhc3MgQVNUVW5yZXNvbHZlZFNldDsKK2NsYXNzIEF0dHI7CitjbGFzcyBDWFhCYXNlU3BlY2lmaWVyOworY2xhc3MgQ1hYQ3RvckluaXRpYWxpemVyOworY2xhc3MgQ1hYUmVjb3JkRGVjbDsKK2NsYXNzIENYWFRlbXBvcmFyeTsKK2NsYXNzIEZpbGVFbnRyeTsKK2NsYXNzIEZQT3B0aW9uczsKK2NsYXNzIEZ1bmN0aW9uRGVjbDsKK2NsYXNzIEhlYWRlclNlYXJjaDsKK2NsYXNzIEhlYWRlclNlYXJjaE9wdGlvbnM7CitjbGFzcyBJZGVudGlmaWVyUmVzb2x2ZXI7CitjbGFzcyBMYW5nT3B0aW9uczsKK2NsYXNzIE1hY3JvRGVmaW5pdGlvblJlY29yZDsKK2NsYXNzIE1hY3JvSW5mbzsKK2NsYXNzIE1lbW9yeUJ1ZmZlckNhY2hlOworY2xhc3MgTW9kdWxlOworY2xhc3MgTW9kdWxlRmlsZUV4dGVuc2lvbjsKK2NsYXNzIE1vZHVsZUZpbGVFeHRlbnNpb25Xcml0ZXI7CitjbGFzcyBOYW1lZERlY2w7CitjbGFzcyBOZXN0ZWROYW1lU3BlY2lmaWVyOworY2xhc3MgT2JqQ0ludGVyZmFjZURlY2w7CitjbGFzcyBQcmVwcm9jZXNzaW5nUmVjb3JkOworY2xhc3MgUHJlcHJvY2Vzc29yOworc3RydWN0IFF1YWxpZmllckluZm87CitjbGFzcyBSZWNvcmREZWNsOworY2xhc3MgU2VtYTsKK2NsYXNzIFNvdXJjZU1hbmFnZXI7CitjbGFzcyBTdG10Oworc3RydWN0IFN0b3JlZERlY2xzTGlzdDsKK2NsYXNzIFN3aXRjaENhc2U7CitjbGFzcyBUZW1wbGF0ZVBhcmFtZXRlckxpc3Q7CitjbGFzcyBUb2tlbjsKK2NsYXNzIFR5cGVTb3VyY2VJbmZvOworY2xhc3MgVmVyc2lvblR1cGxlOworCisvLy8gXGJyaWVmIFdyaXRlcyBhbiBBU1QgZmlsZSBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiBhIHRyYW5zbGF0aW9uIHVuaXQuCisvLy8KKy8vLyBUaGUgQVNUV3JpdGVyIGNsYXNzIHByb2R1Y2VzIGEgYml0c3RyZWFtIGNvbnRhaW5pbmcgdGhlIHNlcmlhbGl6ZWQKKy8vLyByZXByZXNlbnRhdGlvbiBvZiBhIGdpdmVuIGFic3RyYWN0IHN5bnRheCB0cmVlIGFuZCBpdHMgc3VwcG9ydGluZworLy8vIGRhdGEgc3RydWN0dXJlcy4gVGhpcyBiaXRzdHJlYW0gY2FuIGJlIGRlLXNlcmlhbGl6ZWQgdmlhIGFuCisvLy8gaW5zdGFuY2Ugb2YgdGhlIEFTVFJlYWRlciBjbGFzcy4KK2NsYXNzIEFTVFdyaXRlciA6IHB1YmxpYyBBU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgIHB1YmxpYyBBU1RNdXRhdGlvbkxpc3RlbmVyIHsKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RSZWNvcmRXcml0ZXI7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10V3JpdGVyOworICBmcmllbmQgY2xhc3MgQVNUVHlwZVdyaXRlcjsKKworICB1c2luZyBSZWNvcmREYXRhID0gU21hbGxWZWN0b3I8dWludDY0X3QsIDY0PjsKKyAgdXNpbmcgUmVjb3JkRGF0YUltcGwgPSBTbWFsbFZlY3RvckltcGw8dWludDY0X3Q+OworICB1c2luZyBSZWNvcmREYXRhUmVmID0gQXJyYXlSZWY8dWludDY0X3Q+OworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIE1hcCB0aGF0IHByb3ZpZGVzIHRoZSBJRCBudW1iZXJzIG9mIGVhY2ggdHlwZSB3aXRoaW4gdGhlCisgIC8vLyBvdXRwdXQgc3RyZWFtLCBwbHVzIHRob3NlIGRlc2VyaWFsaXplZCBmcm9tIGEgY2hhaW5lZCBQQ0guCisgIC8vLworICAvLy8gVGhlIElEIG51bWJlcnMgb2YgdHlwZXMgYXJlIGNvbnNlY3V0aXZlIChpbiBvcmRlciBvZiBkaXNjb3ZlcnkpCisgIC8vLyBhbmQgc3RhcnQgYXQgMS4gMCBpcyByZXNlcnZlZCBmb3IgTlVMTC4gV2hlbiB0eXBlcyBhcmUgYWN0dWFsbHkKKyAgLy8vIHN0b3JlZCBpbiB0aGUgc3RyZWFtLCB0aGUgSUQgbnVtYmVyIGlzIHNoaWZ0ZWQgYnkgMiBiaXRzIHRvCisgIC8vLyBhbGxvdyBmb3IgdGhlIGNvbnN0L3ZvbGF0aWxlIHF1YWxpZmllcnMuCisgIC8vLworICAvLy8gS2V5cyBpbiB0aGUgbWFwIG5ldmVyIGhhdmUgY29uc3Qvdm9sYXRpbGUgcXVhbGlmaWVycy4KKyAgdXNpbmcgVHlwZUlkeE1hcCA9IGxsdm06OkRlbnNlTWFwPFF1YWxUeXBlLCBzZXJpYWxpemF0aW9uOjpUeXBlSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbjo6VW5zYWZlUXVhbFR5cGVEZW5zZU1hcEluZm8+OworCisgIC8vLyBcYnJpZWYgVGhlIGJpdHN0cmVhbSB3cml0ZXIgdXNlZCB0byBlbWl0IHRoaXMgcHJlY29tcGlsZWQgaGVhZGVyLgorICBsbHZtOjpCaXRzdHJlYW1Xcml0ZXIgJlN0cmVhbTsKKworICAvLy8gVGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGJpdHN0cmVhbS4KKyAgY29uc3QgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZCdWZmZXI7CisKKyAgLy8vIFxicmllZiBUaGUgUENNIG1hbmFnZXIgd2hpY2ggbWFuYWdlcyBtZW1vcnkgYnVmZmVycyBmb3IgcGNtIGZpbGVzLgorICBNZW1vcnlCdWZmZXJDYWNoZSAmUENNQ2FjaGU7CisKKyAgLy8vIFxicmllZiBUaGUgQVNUQ29udGV4dCB3ZSdyZSB3cml0aW5nLgorICBBU1RDb250ZXh0ICpDb250ZXh0ID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFRoZSBwcmVwcm9jZXNzb3Igd2UncmUgd3JpdGluZy4KKyAgUHJlcHJvY2Vzc29yICpQUCA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBUaGUgcmVhZGVyIG9mIGV4aXN0aW5nIEFTVCBmaWxlcywgaWYgd2UncmUgY2hhaW5pbmcuCisgIEFTVFJlYWRlciAqQ2hhaW4gPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIG1vZHVsZSB3ZSdyZSBjdXJyZW50bHkgd3JpdGluZywgaWYgYW55LgorICBNb2R1bGUgKldyaXRpbmdNb2R1bGUgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIGJhc2UgZGlyZWN0b3J5IGZvciBhbnkgcmVsYXRpdmUgcGF0aHMgd2UgZW1pdC4KKyAgc3RkOjpzdHJpbmcgQmFzZURpcmVjdG9yeTsKKworICAvLy8gXGJyaWVmIEluZGljYXRlcyB3aGV0aGVyIHRpbWVzdGFtcHMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdGhlIHByb2R1Y2VkCisgIC8vLyBtb2R1bGUgZmlsZS4gVGhpcyBpcyB0aGUgY2FzZSBmb3IgZmlsZXMgaW1wbGljaXRseSB3cml0dGVuIHRvIHRoZQorICAvLy8gbW9kdWxlIGNhY2hlLCB3aGVyZSB3ZSBuZWVkIHRoZSB0aW1lc3RhbXBzIHRvIGRldGVybWluZSBpZiB0aGUgbW9kdWxlCisgIC8vLyBmaWxlIGlzIHVwIHRvIGRhdGUsIGJ1dCBub3Qgb3RoZXJ3aXNlLgorICBib29sIEluY2x1ZGVUaW1lc3RhbXBzOworCisgIC8vLyBcYnJpZWYgSW5kaWNhdGVzIHdoZW4gdGhlIEFTVCB3cml0aW5nIGlzIGFjdGl2ZWx5IHBlcmZvcm1pbmcKKyAgLy8vIHNlcmlhbGl6YXRpb24sIHJhdGhlciB0aGFuIGp1c3QgcXVldWVpbmcgdXBkYXRlcy4KKyAgYm9vbCBXcml0aW5nQVNUID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBJbmRpY2F0ZXMgdGhhdCB3ZSBhcmUgZG9uZSBzZXJpYWxpemluZyB0aGUgY29sbGVjdGlvbiBvZiBkZWNscworICAvLy8gYW5kIHR5cGVzIHRvIGVtaXQuCisgIGJvb2wgRG9uZVdyaXRpbmdEZWNsc0FuZFR5cGVzID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBJbmRpY2F0ZXMgdGhhdCB0aGUgQVNUIGNvbnRhaW5lZCBjb21waWxlciBlcnJvcnMuCisgIGJvb2wgQVNUSGFzQ29tcGlsZXJFcnJvcnMgPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIE1hcHBpbmcgZnJvbSBpbnB1dCBmaWxlIGVudHJpZXMgdG8gdGhlIGluZGV4IGludG8gdGhlCisgIC8vLyBvZmZzZXQgdGFibGUgd2hlcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhhdCBpbnB1dCBmaWxlIGlzIHN0b3JlZC4KKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgRmlsZUVudHJ5ICosIHVpbnQzMl90PiBJbnB1dEZpbGVJRHM7CisKKyAgLy8vIFxicmllZiBTdG9yZXMgYSBkZWNsYXJhdGlvbiBvciBhIHR5cGUgdG8gYmUgd3JpdHRlbiB0byB0aGUgQVNUIGZpbGUuCisgIGNsYXNzIERlY2xPclR5cGUgeworICBwdWJsaWM6CisgICAgRGVjbE9yVHlwZShEZWNsICpEKSA6IFN0b3JlZChEKSwgSXNUeXBlKGZhbHNlKSB7fQorICAgIERlY2xPclR5cGUoUXVhbFR5cGUgVCkgOiBTdG9yZWQoVC5nZXRBc09wYXF1ZVB0cigpKSwgSXNUeXBlKHRydWUpIHt9CisKKyAgICBib29sIGlzVHlwZSgpIGNvbnN0IHsgcmV0dXJuIElzVHlwZTsgfQorICAgIGJvb2wgaXNEZWNsKCkgY29uc3QgeyByZXR1cm4gIUlzVHlwZTsgfQorCisgICAgUXVhbFR5cGUgZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpc1R5cGUoKSAmJiAiTm90IGEgdHlwZSEiKTsKKyAgICAgIHJldHVybiBRdWFsVHlwZTo6Z2V0RnJvbU9wYXF1ZVB0cihTdG9yZWQpOworICAgIH0KKworICAgIERlY2wgKmdldERlY2woKSBjb25zdCB7CisgICAgICBhc3NlcnQoaXNEZWNsKCkgJiYgIk5vdCBhIGRlY2whIik7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVjbCAqPihTdG9yZWQpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHZvaWQgKlN0b3JlZDsKKyAgICBib29sIElzVHlwZTsKKyAgfTsKKworICAvLy8gXGJyaWVmIFRoZSBkZWNsYXJhdGlvbnMgYW5kIHR5cGVzIHRvIGVtaXQuCisgIHN0ZDo6cXVldWU8RGVjbE9yVHlwZT4gRGVjbFR5cGVzVG9FbWl0OworCisgIC8vLyBcYnJpZWYgVGhlIGZpcnN0IElEIG51bWJlciB3ZSBjYW4gdXNlIGZvciBvdXIgb3duIGRlY2xhcmF0aW9ucy4KKyAgc2VyaWFsaXphdGlvbjo6RGVjbElEIEZpcnN0RGVjbElEID0gc2VyaWFsaXphdGlvbjo6TlVNX1BSRURFRl9ERUNMX0lEUzsKKworICAvLy8gXGJyaWVmIFRoZSBkZWNsIElEIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgbmV4dCBuZXcgZGVjbC4KKyAgc2VyaWFsaXphdGlvbjo6RGVjbElEIE5leHREZWNsSUQgPSBGaXJzdERlY2xJRDsKKworICAvLy8gXGJyaWVmIE1hcCB0aGF0IHByb3ZpZGVzIHRoZSBJRCBudW1iZXJzIG9mIGVhY2ggZGVjbGFyYXRpb24gd2l0aGluCisgIC8vLyB0aGUgb3V0cHV0IHN0cmVhbSwgYXMgd2VsbCBhcyB0aG9zZSBkZXNlcmlhbGl6ZWQgZnJvbSBhIGNoYWluZWQgUENILgorICAvLy8KKyAgLy8vIFRoZSBJRCBudW1iZXJzIG9mIGRlY2xhcmF0aW9ucyBhcmUgY29uc2VjdXRpdmUgKGluIG9yZGVyIG9mCisgIC8vLyBkaXNjb3ZlcnkpIGFuZCBzdGFydCBhdCAyLiAxIGlzIHJlc2VydmVkIGZvciB0aGUgdHJhbnNsYXRpb24KKyAgLy8vIHVuaXQsIHdoaWxlIDAgaXMgcmVzZXJ2ZWQgZm9yIE5VTEwuCisgIGxsdm06OkRlbnNlTWFwPGNvbnN0IERlY2wgKiwgc2VyaWFsaXphdGlvbjo6RGVjbElEPiBEZWNsSURzOworCisgIC8vLyBcYnJpZWYgT2Zmc2V0IG9mIGVhY2ggZGVjbGFyYXRpb24gaW4gdGhlIGJpdHN0cmVhbSwgaW5kZXhlZCBieQorICAvLy8gdGhlIGRlY2xhcmF0aW9uJ3MgSUQuCisgIHN0ZDo6dmVjdG9yPHNlcmlhbGl6YXRpb246OkRlY2xPZmZzZXQ+IERlY2xPZmZzZXRzOworCisgIC8vLyBcYnJpZWYgU29ydGVkIChieSBmaWxlIG9mZnNldCkgdmVjdG9yIG9mIHBhaXJzIG9mIGZpbGUgb2Zmc2V0L0RlY2xJRC4KKyAgdXNpbmcgTG9jRGVjbElEc1R5ID0KKyAgICAgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgc2VyaWFsaXphdGlvbjo6RGVjbElEPiwgNjQ+OworICBzdHJ1Y3QgRGVjbElESW5GaWxlSW5mbyB7CisgICAgTG9jRGVjbElEc1R5IERlY2xJRHM7CisKKyAgICAvLy8gXGJyaWVmIFNldCB3aGVuIHRoZSBEZWNsSURzIHZlY3RvcnMgZnJvbSBhbGwgZmlsZXMgYXJlIGpvaW5lZCwgdGhpcworICAgIC8vLyBpbmRpY2F0ZXMgdGhlIGluZGV4IHRoYXQgdGhpcyBwYXJ0aWN1bGFyIHZlY3RvciBoYXMgaW4gdGhlIGdsb2JhbCBvbmUuCisgICAgdW5zaWduZWQgRmlyc3REZWNsSW5kZXg7CisgIH07CisgIHVzaW5nIEZpbGVEZWNsSURzVHkgPSBsbHZtOjpEZW5zZU1hcDxGaWxlSUQsIERlY2xJREluRmlsZUluZm8gKj47CisKKyAgLy8vIFxicmllZiBNYXAgZnJvbSBmaWxlIFNMb2NFbnRyaWVzIHRvIGluZm8gYWJvdXQgdGhlIGZpbGUtbGV2ZWwgZGVjbGFyYXRpb25zCisgIC8vLyB0aGF0IGl0IGNvbnRhaW5zLgorICBGaWxlRGVjbElEc1R5IEZpbGVEZWNsSURzOworCisgIHZvaWQgYXNzb2NpYXRlRGVjbFdpdGhGaWxlKGNvbnN0IERlY2wgKkQsIHNlcmlhbGl6YXRpb246OkRlY2xJRCk7CisKKyAgLy8vIFxicmllZiBUaGUgZmlyc3QgSUQgbnVtYmVyIHdlIGNhbiB1c2UgZm9yIG91ciBvd24gdHlwZXMuCisgIHNlcmlhbGl6YXRpb246OlR5cGVJRCBGaXJzdFR5cGVJRCA9IHNlcmlhbGl6YXRpb246Ok5VTV9QUkVERUZfVFlQRV9JRFM7CisKKyAgLy8vIFxicmllZiBUaGUgdHlwZSBJRCB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIG5leHQgbmV3IHR5cGUuCisgIHNlcmlhbGl6YXRpb246OlR5cGVJRCBOZXh0VHlwZUlEID0gRmlyc3RUeXBlSUQ7CisKKyAgLy8vIFxicmllZiBNYXAgdGhhdCBwcm92aWRlcyB0aGUgSUQgbnVtYmVycyBvZiBlYWNoIHR5cGUgd2l0aGluIHRoZQorICAvLy8gb3V0cHV0IHN0cmVhbSwgcGx1cyB0aG9zZSBkZXNlcmlhbGl6ZWQgZnJvbSBhIGNoYWluZWQgUENILgorICAvLy8KKyAgLy8vIFRoZSBJRCBudW1iZXJzIG9mIHR5cGVzIGFyZSBjb25zZWN1dGl2ZSAoaW4gb3JkZXIgb2YgZGlzY292ZXJ5KQorICAvLy8gYW5kIHN0YXJ0IGF0IDEuIDAgaXMgcmVzZXJ2ZWQgZm9yIE5VTEwuIFdoZW4gdHlwZXMgYXJlIGFjdHVhbGx5CisgIC8vLyBzdG9yZWQgaW4gdGhlIHN0cmVhbSwgdGhlIElEIG51bWJlciBpcyBzaGlmdGVkIGJ5IDIgYml0cyB0bworICAvLy8gYWxsb3cgZm9yIHRoZSBjb25zdC92b2xhdGlsZSBxdWFsaWZpZXJzLgorICAvLy8KKyAgLy8vIEtleXMgaW4gdGhlIG1hcCBuZXZlciBoYXZlIGNvbnN0L3ZvbGF0aWxlIHF1YWxpZmllcnMuCisgIFR5cGVJZHhNYXAgVHlwZUlkeHM7CisKKyAgLy8vIFxicmllZiBPZmZzZXQgb2YgZWFjaCB0eXBlIGluIHRoZSBiaXRzdHJlYW0sIGluZGV4ZWQgYnkKKyAgLy8vIHRoZSB0eXBlJ3MgSUQuCisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBUeXBlT2Zmc2V0czsKKworICAvLy8gXGJyaWVmIFRoZSBmaXJzdCBJRCBudW1iZXIgd2UgY2FuIHVzZSBmb3Igb3VyIG93biBpZGVudGlmaWVycy4KKyAgc2VyaWFsaXphdGlvbjo6SWRlbnRJRCBGaXJzdElkZW50SUQgPSBzZXJpYWxpemF0aW9uOjpOVU1fUFJFREVGX0lERU5UX0lEUzsKKworICAvLy8gXGJyaWVmIFRoZSBpZGVudGlmaWVyIElEIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgbmV4dCBuZXcgaWRlbnRpZmllci4KKyAgc2VyaWFsaXphdGlvbjo6SWRlbnRJRCBOZXh0SWRlbnRJRCA9IEZpcnN0SWRlbnRJRDsKKworICAvLy8gXGJyaWVmIE1hcCB0aGF0IHByb3ZpZGVzIHRoZSBJRCBudW1iZXJzIG9mIGVhY2ggaWRlbnRpZmllciBpbgorICAvLy8gdGhlIG91dHB1dCBzdHJlYW0uCisgIC8vLworICAvLy8gVGhlIElEIG51bWJlcnMgZm9yIGlkZW50aWZpZXJzIGFyZSBjb25zZWN1dGl2ZSAoaW4gb3JkZXIgb2YKKyAgLy8vIGRpc2NvdmVyeSksIHN0YXJ0aW5nIGF0IDEuIEFuIElEIG9mIHplcm8gcmVmZXJzIHRvIGEgTlVMTAorICAvLy8gSWRlbnRpZmllckluZm8uCisgIGxsdm06Ok1hcFZlY3Rvcjxjb25zdCBJZGVudGlmaWVySW5mbyAqLCBzZXJpYWxpemF0aW9uOjpJZGVudElEPiBJZGVudGlmaWVySURzOworCisgIC8vLyBcYnJpZWYgVGhlIGZpcnN0IElEIG51bWJlciB3ZSBjYW4gdXNlIGZvciBvdXIgb3duIG1hY3Jvcy4KKyAgc2VyaWFsaXphdGlvbjo6TWFjcm9JRCBGaXJzdE1hY3JvSUQgPSBzZXJpYWxpemF0aW9uOjpOVU1fUFJFREVGX01BQ1JPX0lEUzsKKworICAvLy8gXGJyaWVmIFRoZSBpZGVudGlmaWVyIElEIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgbmV4dCBuZXcgaWRlbnRpZmllci4KKyAgc2VyaWFsaXphdGlvbjo6TWFjcm9JRCBOZXh0TWFjcm9JRCA9IEZpcnN0TWFjcm9JRDsKKworICAvLy8gXGJyaWVmIE1hcCB0aGF0IHByb3ZpZGVzIHRoZSBJRCBudW1iZXJzIG9mIGVhY2ggbWFjcm8uCisgIGxsdm06OkRlbnNlTWFwPE1hY3JvSW5mbyAqLCBzZXJpYWxpemF0aW9uOjpNYWNyb0lEPiBNYWNyb0lEczsKKworICBzdHJ1Y3QgTWFjcm9JbmZvVG9FbWl0RGF0YSB7CisgICAgY29uc3QgSWRlbnRpZmllckluZm8gKk5hbWU7CisgICAgTWFjcm9JbmZvICpNSTsKKyAgICBzZXJpYWxpemF0aW9uOjpNYWNyb0lEIElEOworICB9OworCisgIC8vLyBcYnJpZWYgVGhlIG1hY3JvIGluZm9zIHRvIGVtaXQuCisgIHN0ZDo6dmVjdG9yPE1hY3JvSW5mb1RvRW1pdERhdGE+IE1hY3JvSW5mb3NUb0VtaXQ7CisKKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgSWRlbnRpZmllckluZm8gKiwgdWludDY0X3Q+IElkZW50TWFjcm9EaXJlY3RpdmVzT2Zmc2V0TWFwOworCisgIC8vLyBAbmFtZSBGbHVzaFN0bXQgQ2FjaGVzCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgU2V0IG9mIHBhcmVudCBTdG10cyBmb3IgdGhlIGN1cnJlbnRseSBzZXJpYWxpemluZyBzdWItc3RtdC4KKyAgbGx2bTo6RGVuc2VTZXQ8U3RtdCAqPiBQYXJlbnRTdG10czsKKworICAvLy8gXGJyaWVmIE9mZnNldHMgb2Ygc3ViLXN0bXRzIGFscmVhZHkgc2VyaWFsaXplZC4gVGhlIG9mZnNldCBwb2ludHMKKyAgLy8vIGp1c3QgYWZ0ZXIgdGhlIHN0bXQgcmVjb3JkLgorICBsbHZtOjpEZW5zZU1hcDxTdG10ICosIHVpbnQ2NF90PiBTdWJTdG10RW50cmllczsKKworICAvLy8gQH0KKworICAvLy8gXGJyaWVmIE9mZnNldHMgb2YgZWFjaCBvZiB0aGUgaWRlbnRpZmllciBJRHMgaW50byB0aGUgaWRlbnRpZmllcgorICAvLy8gdGFibGUuCisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBJZGVudGlmaWVyT2Zmc2V0czsKKworICAvLy8gXGJyaWVmIFRoZSBmaXJzdCBJRCBudW1iZXIgd2UgY2FuIHVzZSBmb3Igb3VyIG93biBzdWJtb2R1bGVzLgorICBzZXJpYWxpemF0aW9uOjpTdWJtb2R1bGVJRCBGaXJzdFN1Ym1vZHVsZUlEID0KKyAgICAgIHNlcmlhbGl6YXRpb246Ok5VTV9QUkVERUZfU1VCTU9EVUxFX0lEUzsKKworICAvLy8gXGJyaWVmIFRoZSBzdWJtb2R1bGUgSUQgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBuZXh0IG5ldyBzdWJtb2R1bGUuCisgIHNlcmlhbGl6YXRpb246OlN1Ym1vZHVsZUlEIE5leHRTdWJtb2R1bGVJRCA9IEZpcnN0U3VibW9kdWxlSUQ7CisKKyAgLy8vIFxicmllZiBUaGUgZmlyc3QgSUQgbnVtYmVyIHdlIGNhbiB1c2UgZm9yIG91ciBvd24gc2VsZWN0b3JzLgorICBzZXJpYWxpemF0aW9uOjpTZWxlY3RvcklEIEZpcnN0U2VsZWN0b3JJRCA9CisgICAgICBzZXJpYWxpemF0aW9uOjpOVU1fUFJFREVGX1NFTEVDVE9SX0lEUzsKKworICAvLy8gXGJyaWVmIFRoZSBzZWxlY3RvciBJRCB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIG5leHQgbmV3IHNlbGVjdG9yLgorICBzZXJpYWxpemF0aW9uOjpTZWxlY3RvcklEIE5leHRTZWxlY3RvcklEID0gRmlyc3RTZWxlY3RvcklEOworCisgIC8vLyBcYnJpZWYgTWFwIHRoYXQgcHJvdmlkZXMgdGhlIElEIG51bWJlcnMgb2YgZWFjaCBTZWxlY3Rvci4KKyAgbGx2bTo6TWFwVmVjdG9yPFNlbGVjdG9yLCBzZXJpYWxpemF0aW9uOjpTZWxlY3RvcklEPiBTZWxlY3RvcklEczsKKworICAvLy8gXGJyaWVmIE9mZnNldCBvZiBlYWNoIHNlbGVjdG9yIHdpdGhpbiB0aGUgbWV0aG9kIHBvb2wvc2VsZWN0b3IKKyAgLy8vIHRhYmxlLCBpbmRleGVkIGJ5IHRoZSBTZWxlY3RvciBJRCAoLTEpLgorICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gU2VsZWN0b3JPZmZzZXRzOworCisgIC8vLyBcYnJpZWYgTWFwcGluZyBmcm9tIG1hY3JvIGRlZmluaXRpb25zIChhcyB0aGV5IG9jY3VyIGluIHRoZSBwcmVwcm9jZXNzaW5nCisgIC8vLyByZWNvcmQpIHRvIHRoZSBtYWNybyBJRHMuCisgIGxsdm06OkRlbnNlTWFwPGNvbnN0IE1hY3JvRGVmaW5pdGlvblJlY29yZCAqLAorICAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uOjpQcmVwcm9jZXNzZWRFbnRpdHlJRD4gTWFjcm9EZWZpbml0aW9uczsKKworICAvLy8gXGJyaWVmIENhY2hlIG9mIGluZGljZXMgb2YgYW5vbnltb3VzIGRlY2xhcmF0aW9ucyB3aXRoaW4gdGhlaXIgbGV4aWNhbAorICAvLy8gY29udGV4dHMuCisgIGxsdm06OkRlbnNlTWFwPGNvbnN0IERlY2wgKiwgdW5zaWduZWQ+IEFub255bW91c0RlY2xhcmF0aW9uTnVtYmVyczsKKworICAvLy8gQW4gdXBkYXRlIHRvIGEgRGVjbC4KKyAgY2xhc3MgRGVjbFVwZGF0ZSB7CisgICAgLy8vIEEgRGVjbFVwZGF0ZUtpbmQuCisgICAgdW5zaWduZWQgS2luZDsKKyAgICB1bmlvbiB7CisgICAgICBjb25zdCBEZWNsICpEY2w7CisgICAgICB2b2lkICpUeXBlOworICAgICAgdW5zaWduZWQgTG9jOworICAgICAgdW5zaWduZWQgVmFsOworICAgICAgTW9kdWxlICpNb2Q7CisgICAgICBjb25zdCBBdHRyICpBdHRyaWJ1dGU7CisgICAgfTsKKworICBwdWJsaWM6CisgICAgRGVjbFVwZGF0ZSh1bnNpZ25lZCBLaW5kKSA6IEtpbmQoS2luZCksIERjbChudWxscHRyKSB7fQorICAgIERlY2xVcGRhdGUodW5zaWduZWQgS2luZCwgY29uc3QgRGVjbCAqRGNsKSA6IEtpbmQoS2luZCksIERjbChEY2wpIHt9CisgICAgRGVjbFVwZGF0ZSh1bnNpZ25lZCBLaW5kLCBRdWFsVHlwZSBUeXBlKQorICAgICAgICA6IEtpbmQoS2luZCksIFR5cGUoVHlwZS5nZXRBc09wYXF1ZVB0cigpKSB7fQorICAgIERlY2xVcGRhdGUodW5zaWduZWQgS2luZCwgU291cmNlTG9jYXRpb24gTG9jKQorICAgICAgICA6IEtpbmQoS2luZCksIExvYyhMb2MuZ2V0UmF3RW5jb2RpbmcoKSkge30KKyAgICBEZWNsVXBkYXRlKHVuc2lnbmVkIEtpbmQsIHVuc2lnbmVkIFZhbCkgOiBLaW5kKEtpbmQpLCBWYWwoVmFsKSB7fQorICAgIERlY2xVcGRhdGUodW5zaWduZWQgS2luZCwgTW9kdWxlICpNKSA6IEtpbmQoS2luZCksIE1vZChNKSB7fQorICAgIERlY2xVcGRhdGUodW5zaWduZWQgS2luZCwgY29uc3QgQXR0ciAqQXR0cmlidXRlKQorICAgICAgICAgIDogS2luZChLaW5kKSwgQXR0cmlidXRlKEF0dHJpYnV0ZSkge30KKworICAgIHVuc2lnbmVkIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisgICAgY29uc3QgRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IHsgcmV0dXJuIERjbDsgfQorICAgIFF1YWxUeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBRdWFsVHlwZTo6Z2V0RnJvbU9wYXF1ZVB0cihUeXBlKTsgfQorCisgICAgU291cmNlTG9jYXRpb24gZ2V0TG9jKCkgY29uc3QgeworICAgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoTG9jKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXROdW1iZXIoKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKyAgICBNb2R1bGUgKmdldE1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIE1vZDsgfQorICAgIGNvbnN0IEF0dHIgKmdldEF0dHIoKSBjb25zdCB7IHJldHVybiBBdHRyaWJ1dGU7IH0KKyAgfTsKKworICB1c2luZyBVcGRhdGVSZWNvcmQgPSBTbWFsbFZlY3RvcjxEZWNsVXBkYXRlLCAxPjsKKyAgdXNpbmcgRGVjbFVwZGF0ZU1hcCA9IGxsdm06Ok1hcFZlY3Rvcjxjb25zdCBEZWNsICosIFVwZGF0ZVJlY29yZD47CisKKyAgLy8vIFxicmllZiBNYXBwaW5nIGZyb20gZGVjbGFyYXRpb25zIHRoYXQgY2FtZSBmcm9tIGEgY2hhaW5lZCBQQ0ggdG8gdGhlCisgIC8vLyByZWNvcmQgY29udGFpbmluZyBtb2RpZmljYXRpb25zIHRvIHRoZW0uCisgIERlY2xVcGRhdGVNYXAgRGVjbFVwZGF0ZXM7CisKKyAgdXNpbmcgRmlyc3RMYXRlc3REZWNsTWFwID0gbGx2bTo6RGVuc2VNYXA8RGVjbCAqLCBEZWNsICo+OworCisgIC8vLyBcYnJpZWYgTWFwIG9mIGZpcnN0IGRlY2xhcmF0aW9ucyBmcm9tIGEgY2hhaW5lZCBQQ0ggdGhhdCBwb2ludCB0byB0aGUKKyAgLy8vIG1vc3QgcmVjZW50IGRlY2xhcmF0aW9ucyBpbiBhbm90aGVyIFBDSC4KKyAgRmlyc3RMYXRlc3REZWNsTWFwIEZpcnN0TGF0ZXN0RGVjbHM7CisKKyAgLy8vIFxicmllZiBEZWNsYXJhdGlvbnMgZW5jb3VudGVyZWQgdGhhdCBtaWdodCBiZSBleHRlcm5hbAorICAvLy8gZGVmaW5pdGlvbnMuCisgIC8vLworICAvLy8gV2Uga2VlcCB0cmFjayBvZiBleHRlcm5hbCBkZWZpbml0aW9ucyBhbmQgb3RoZXIgJ2ludGVyZXN0aW5nJyBkZWNsYXJhdGlvbnMKKyAgLy8vIGFzIHdlIGFyZSBlbWl0dGluZyBkZWNsYXJhdGlvbnMgdG8gdGhlIEFTVCBmaWxlLiBUaGUgQVNUIGZpbGUgY29udGFpbnMgYQorICAvLy8gc2VwYXJhdGUgcmVjb3JkIGZvciB0aGVzZSBkZWNsYXJhdGlvbnMsIHdoaWNoIGFyZSBwcm92aWRlZCB0byB0aGUgQVNUCisgIC8vLyBjb25zdW1lciBieSB0aGUgQVNUIHJlYWRlci4gVGhpcyBpcyBiZWhhdmlvciBpcyByZXF1aXJlZCB0byBwcm9wZXJseSBjb3BlIHdpdGgsCisgIC8vLyBlLmcuLCB0ZW50YXRpdmUgdmFyaWFibGUgZGVmaW5pdGlvbnMgdGhhdCBvY2N1ciB3aXRoaW4KKyAgLy8vIGhlYWRlcnMuIFRoZSBkZWNsYXJhdGlvbnMgdGhlbXNlbHZlcyBhcmUgc3RvcmVkIGFzIGRlY2xhcmF0aW9uCisgIC8vLyBJRHMsIHNpbmNlIHRoZXkgd2lsbCBiZSB3cml0dGVuIG91dCB0byBhbiBFQUdFUkxZX0RFU0VSSUFMSVpFRF9ERUNMUworICAvLy8gcmVjb3JkLgorICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgMTY+IEVhZ2VybHlEZXNlcmlhbGl6ZWREZWNsczsKKyAgU21hbGxWZWN0b3I8dWludDY0X3QsIDE2PiBNb2R1bGFyQ29kZWdlbkRlY2xzOworCisgIC8vLyBcYnJpZWYgRGVjbENvbnRleHRzIHRoYXQgaGF2ZSByZWNlaXZlZCBleHRlbnNpb25zIHNpbmNlIHRoZWlyIHNlcmlhbGl6ZWQKKyAgLy8vIGZvcm0uCisgIC8vLworICAvLy8gRm9yIG5hbWVzcGFjZXMsIHdoZW4gd2UncmUgY2hhaW5pbmcgYW5kIGVuY291bnRlcmluZyBhIG5hbWVzcGFjZSwgd2UgY2hlY2sKKyAgLy8vIGlmIGl0cyBwcmltYXJ5IG5hbWVzcGFjZSBjb21lcyBmcm9tIHRoZSBjaGFpbi4gSWYgaXQgZG9lcywgd2UgYWRkIHRoZQorICAvLy8gcHJpbWFyeSB0byB0aGlzIHNldCwgc28gdGhhdCB3ZSBjYW4gd3JpdGUgb3V0IGxleGljYWwgY29udGVudCB1cGRhdGVzIGZvcgorICAvLy8gaXQuCisgIGxsdm06OlNtYWxsU2V0VmVjdG9yPGNvbnN0IERlY2xDb250ZXh0ICosIDE2PiBVcGRhdGVkRGVjbENvbnRleHRzOworCisgIC8vLyBcYnJpZWYgS2VlcHMgdHJhY2sgb2YgZGVjbGFyYXRpb25zIHRoYXQgd2UgbXVzdCBlbWl0LCBldmVuIHRob3VnaCB3ZSdyZQorICAvLy8gbm90IGd1YXJhbnRlZWQgdG8gYmUgYWJsZSB0byBmaW5kIHRoZW0gYnkgd2Fsa2luZyB0aGUgQVNUIHN0YXJ0aW5nIGF0IHRoZQorICAvLy8gdHJhbnNsYXRpb24gdW5pdC4KKyAgU21hbGxWZWN0b3I8Y29uc3QgRGVjbCAqLCAxNj4gRGVjbHNUb0VtaXRFdmVuSWZVbnJlZmVyZW5jZWQ7CisKKyAgLy8vIFxicmllZiBUaGUgc2V0IG9mIE9iamVjdGl2ZS1DIGNsYXNzIHRoYXQgaGF2ZSBjYXRlZ29yaWVzIHdlCisgIC8vLyBzaG91bGQgc2VyaWFsaXplLgorICBsbHZtOjpTZXRWZWN0b3I8T2JqQ0ludGVyZmFjZURlY2wgKj4gT2JqQ0NsYXNzZXNXaXRoQ2F0ZWdvcmllczsKKyAgICAgICAgICAgICAgICAgICAgCisgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiBkZWNsYXJhdGlvbnMgdGhhdCBtYXkgaGF2ZSByZWRlY2xhcmF0aW9uIGNoYWlucyB0aGF0CisgIC8vLyBuZWVkIHRvIGJlIHNlcmlhbGl6ZWQuCisgIGxsdm06OlNtYWxsVmVjdG9yPGNvbnN0IERlY2wgKiwgMTY+IFJlZGVjbGFyYXRpb25zOworCisgIC8vLyBcYnJpZWYgQSBjYWNoZSBvZiB0aGUgZmlyc3QgbG9jYWwgZGVjbGFyYXRpb24gZm9yICJpbnRlcmVzdGluZyIKKyAgLy8vIHJlZGVjbGFyYXRpb24gY2hhaW5zLgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBEZWNsICosIGNvbnN0IERlY2wgKj4gRmlyc3RMb2NhbERlY2xDYWNoZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIC8vLyBcYnJpZWYgTWFwcGluZyBmcm9tIFN3aXRjaENhc2Ugc3RhdGVtZW50cyB0byBJRHMuCisgIGxsdm06OkRlbnNlTWFwPFN3aXRjaENhc2UgKiwgdW5zaWduZWQ+IFN3aXRjaENhc2VJRHM7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHN0YXRlbWVudHMgd3JpdHRlbiB0byB0aGUgQVNUIGZpbGUuCisgIHVuc2lnbmVkIE51bVN0YXRlbWVudHMgPSAwOworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBtYWNyb3Mgd3JpdHRlbiB0byB0aGUgQVNUIGZpbGUuCisgIHVuc2lnbmVkIE51bU1hY3JvcyA9IDA7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGxleGljYWwgZGVjbGNvbnRleHRzIHdyaXR0ZW4gdG8gdGhlIEFTVAorICAvLy8gZmlsZS4KKyAgdW5zaWduZWQgTnVtTGV4aWNhbERlY2xDb250ZXh0cyA9IDA7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHZpc2libGUgZGVjbGNvbnRleHRzIHdyaXR0ZW4gdG8gdGhlIEFTVAorICAvLy8gZmlsZS4KKyAgdW5zaWduZWQgTnVtVmlzaWJsZURlY2xDb250ZXh0cyA9IDA7CisKKyAgLy8vIFxicmllZiBBIG1hcHBpbmcgZnJvbSBlYWNoIGtub3duIHN1Ym1vZHVsZSB0byBpdHMgSUQgbnVtYmVyLCB3aGljaCB3aWxsCisgIC8vLyBiZSBhIHBvc2l0aXZlIGludGVnZXIuCisgIGxsdm06OkRlbnNlTWFwPE1vZHVsZSAqLCB1bnNpZ25lZD4gU3VibW9kdWxlSURzOworCisgIC8vLyBcYnJpZWYgQSBsaXN0IG9mIHRoZSBtb2R1bGUgZmlsZSBleHRlbnNpb24gd3JpdGVycy4KKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE1vZHVsZUZpbGVFeHRlbnNpb25Xcml0ZXI+PgorICAgIE1vZHVsZUZpbGVFeHRlbnNpb25Xcml0ZXJzOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgb3IgY3JlYXRlIGEgc3VibW9kdWxlIElEIGZvciB0aGlzIG1vZHVsZS4KKyAgdW5zaWduZWQgZ2V0U3VibW9kdWxlSUQoTW9kdWxlICpNb2QpOworCisgIC8vLyBcYnJpZWYgV3JpdGUgdGhlIGdpdmVuIHN1YmV4cHJlc3Npb24gdG8gdGhlIGJpdHN0cmVhbS4KKyAgdm9pZCBXcml0ZVN1YlN0bXQoU3RtdCAqUyk7CisKKyAgdm9pZCBXcml0ZUJsb2NrSW5mb0Jsb2NrKCk7CisgIHZvaWQgV3JpdGVDb250cm9sQmxvY2soUHJlcHJvY2Vzc29yICZQUCwgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgaXN5c3Jvb3QsIGNvbnN0IHN0ZDo6c3RyaW5nICZPdXRwdXRGaWxlKTsKKworICAvLy8gV3JpdGUgb3V0IHRoZSBzaWduYXR1cmUgYW5kIGRpYWdub3N0aWMgb3B0aW9ucywgYW5kIHJldHVybiB0aGUgc2lnbmF0dXJlLgorICBBU1RGaWxlU2lnbmF0dXJlIHdyaXRlVW5oYXNoZWRDb250cm9sQmxvY2soUHJlcHJvY2Vzc29yICZQUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVENvbnRleHQgJkNvbnRleHQpOworCisgIC8vLyBDYWxjdWxhdGUgaGFzaCBvZiB0aGUgcGNtIGNvbnRlbnQuCisgIHN0YXRpYyBBU1RGaWxlU2lnbmF0dXJlIGNyZWF0ZVNpZ25hdHVyZShTdHJpbmdSZWYgQnl0ZXMpOworCisgIHZvaWQgV3JpdGVJbnB1dEZpbGVzKFNvdXJjZU1hbmFnZXIgJlNvdXJjZU1nciwgSGVhZGVyU2VhcmNoT3B0aW9ucyAmSFNPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIE1vZHVsZXMpOworICB2b2lkIFdyaXRlU291cmNlTWFuYWdlckJsb2NrKFNvdXJjZU1hbmFnZXIgJlNvdXJjZU1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVwcm9jZXNzb3IgJlBQKTsKKyAgdm9pZCBXcml0ZVByZXByb2Nlc3Nvcihjb25zdCBQcmVwcm9jZXNzb3IgJlBQLCBib29sIElzTW9kdWxlKTsKKyAgdm9pZCBXcml0ZUhlYWRlclNlYXJjaChjb25zdCBIZWFkZXJTZWFyY2ggJkhTKTsKKyAgdm9pZCBXcml0ZVByZXByb2Nlc3NvckRldGFpbChQcmVwcm9jZXNzaW5nUmVjb3JkICZQUFJlYyk7CisgIHZvaWQgV3JpdGVTdWJtb2R1bGVzKE1vZHVsZSAqV3JpdGluZ01vZHVsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHZvaWQgV3JpdGVQcmFnbWFEaWFnbm9zdGljTWFwcGluZ3MoY29uc3QgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc01vZHVsZSk7CisKKyAgdW5zaWduZWQgVHlwZUV4dFF1YWxBYmJyZXYgPSAwOworICB1bnNpZ25lZCBUeXBlRnVuY3Rpb25Qcm90b0FiYnJldiA9IDA7CisgIHZvaWQgV3JpdGVUeXBlQWJicmV2cygpOworICB2b2lkIFdyaXRlVHlwZShRdWFsVHlwZSBUKTsKKworICBib29sIGlzTG9va3VwUmVzdWx0RXh0ZXJuYWwoU3RvcmVkRGVjbHNMaXN0ICZSZXN1bHQsIERlY2xDb250ZXh0ICpEQyk7CisgIGJvb2wgaXNMb29rdXBSZXN1bHRFbnRpcmVseUV4dGVybmFsKFN0b3JlZERlY2xzTGlzdCAmUmVzdWx0LCBEZWNsQ29udGV4dCAqREMpOworCisgIHZvaWQgR2VuZXJhdGVOYW1lTG9va3VwVGFibGUoY29uc3QgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmTG9va3VwVGFibGUpOworICB1aW50NjRfdCBXcml0ZURlY2xDb250ZXh0TGV4aWNhbEJsb2NrKEFTVENvbnRleHQgJkNvbnRleHQsIERlY2xDb250ZXh0ICpEQyk7CisgIHVpbnQ2NF90IFdyaXRlRGVjbENvbnRleHRWaXNpYmxlQmxvY2soQVNUQ29udGV4dCAmQ29udGV4dCwgRGVjbENvbnRleHQgKkRDKTsKKyAgdm9pZCBXcml0ZVR5cGVEZWNsT2Zmc2V0cygpOworICB2b2lkIFdyaXRlRmlsZURlY2xJRHNNYXAoKTsKKyAgdm9pZCBXcml0ZUNvbW1lbnRzKCk7CisgIHZvaWQgV3JpdGVTZWxlY3RvcnMoU2VtYSAmU2VtYVJlZik7CisgIHZvaWQgV3JpdGVSZWZlcmVuY2VkU2VsZWN0b3JzUG9vbChTZW1hICZTZW1hUmVmKTsKKyAgdm9pZCBXcml0ZUlkZW50aWZpZXJUYWJsZShQcmVwcm9jZXNzb3IgJlBQLCBJZGVudGlmaWVyUmVzb2x2ZXIgJklkUmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc01vZHVsZSk7CisgIHZvaWQgV3JpdGVEZWNsVXBkYXRlc0Jsb2NrcyhSZWNvcmREYXRhSW1wbCAmT2Zmc2V0c1JlY29yZCk7CisgIHZvaWQgV3JpdGVEZWNsQ29udGV4dFZpc2libGVVcGRhdGUoY29uc3QgRGVjbENvbnRleHQgKkRDKTsKKyAgdm9pZCBXcml0ZUZQUHJhZ21hT3B0aW9ucyhjb25zdCBGUE9wdGlvbnMgJk9wdHMpOworICB2b2lkIFdyaXRlT3BlbkNMRXh0ZW5zaW9ucyhTZW1hICZTZW1hUmVmKTsKKyAgdm9pZCBXcml0ZU9wZW5DTEV4dGVuc2lvblR5cGVzKFNlbWEgJlNlbWFSZWYpOworICB2b2lkIFdyaXRlT3BlbkNMRXh0ZW5zaW9uRGVjbHMoU2VtYSAmU2VtYVJlZik7CisgIHZvaWQgV3JpdGVDVURBUHJhZ21hcyhTZW1hICZTZW1hUmVmKTsKKyAgdm9pZCBXcml0ZU9iakNDYXRlZ29yaWVzKCk7CisgIHZvaWQgV3JpdGVMYXRlUGFyc2VkVGVtcGxhdGVzKFNlbWEgJlNlbWFSZWYpOworICB2b2lkIFdyaXRlT3B0aW1pemVQcmFnbWFPcHRpb25zKFNlbWEgJlNlbWFSZWYpOworICB2b2lkIFdyaXRlTVNTdHJ1Y3RQcmFnbWFPcHRpb25zKFNlbWEgJlNlbWFSZWYpOworICB2b2lkIFdyaXRlTVNQb2ludGVyc1RvTWVtYmVyc1ByYWdtYU9wdGlvbnMoU2VtYSAmU2VtYVJlZik7CisgIHZvaWQgV3JpdGVQYWNrUHJhZ21hT3B0aW9ucyhTZW1hICZTZW1hUmVmKTsKKyAgdm9pZCBXcml0ZU1vZHVsZUZpbGVFeHRlbnNpb24oU2VtYSAmU2VtYVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlRmlsZUV4dGVuc2lvbldyaXRlciAmV3JpdGVyKTsKKworICB1bnNpZ25lZCBEZWNsUGFybVZhckFiYnJldiA9IDA7CisgIHVuc2lnbmVkIERlY2xDb250ZXh0TGV4aWNhbEFiYnJldiA9IDA7CisgIHVuc2lnbmVkIERlY2xDb250ZXh0VmlzaWJsZUxvb2t1cEFiYnJldiA9IDA7CisgIHVuc2lnbmVkIFVwZGF0ZVZpc2libGVBYmJyZXYgPSAwOworICB1bnNpZ25lZCBEZWNsUmVjb3JkQWJicmV2ID0gMDsKKyAgdW5zaWduZWQgRGVjbFR5cGVkZWZBYmJyZXYgPSAwOworICB1bnNpZ25lZCBEZWNsVmFyQWJicmV2ID0gMDsKKyAgdW5zaWduZWQgRGVjbEZpZWxkQWJicmV2ID0gMDsKKyAgdW5zaWduZWQgRGVjbEVudW1BYmJyZXYgPSAwOworICB1bnNpZ25lZCBEZWNsT2JqQ0l2YXJBYmJyZXYgPSAwOworICB1bnNpZ25lZCBEZWNsQ1hYTWV0aG9kQWJicmV2ID0gMDsKKworICB1bnNpZ25lZCBEZWNsUmVmRXhwckFiYnJldiA9IDA7CisgIHVuc2lnbmVkIENoYXJhY3RlckxpdGVyYWxBYmJyZXYgPSAwOworICB1bnNpZ25lZCBJbnRlZ2VyTGl0ZXJhbEFiYnJldiA9IDA7CisgIHVuc2lnbmVkIEV4cHJJbXBsaWNpdENhc3RBYmJyZXYgPSAwOworCisgIHZvaWQgV3JpdGVEZWNsQWJicmV2cygpOworICB2b2lkIFdyaXRlRGVjbChBU1RDb250ZXh0ICZDb250ZXh0LCBEZWNsICpEKTsKKworICBBU1RGaWxlU2lnbmF0dXJlIFdyaXRlQVNUQ29yZShTZW1hICZTZW1hUmVmLCBTdHJpbmdSZWYgaXN5c3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZPdXRwdXRGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUgKldyaXRpbmdNb2R1bGUpOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbmV3IHByZWNvbXBpbGVkIGhlYWRlciB3cml0ZXIgdGhhdCBvdXRwdXRzIHRvCisgIC8vLyB0aGUgZ2l2ZW4gYml0c3RyZWFtLgorICBBU1RXcml0ZXIobGx2bTo6Qml0c3RyZWFtV3JpdGVyICZTdHJlYW0sIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmQnVmZmVyLAorICAgICAgICAgICAgTWVtb3J5QnVmZmVyQ2FjaGUgJlBDTUNhY2hlLAorICAgICAgICAgICAgQXJyYXlSZWY8c3RkOjpzaGFyZWRfcHRyPE1vZHVsZUZpbGVFeHRlbnNpb24+PiBFeHRlbnNpb25zLAorICAgICAgICAgICAgYm9vbCBJbmNsdWRlVGltZXN0YW1wcyA9IHRydWUpOworICB+QVNUV3JpdGVyKCkgb3ZlcnJpZGU7CisKKyAgY29uc3QgTGFuZ09wdGlvbnMgJmdldExhbmdPcHRzKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgYSB0aW1lc3RhbXAgZm9yIG91dHB1dCBpbnRvIHRoZSBBU1QgZmlsZS4gVGhlIGFjdHVhbCB0aW1lc3RhbXAKKyAgLy8vIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSBtYXkgYmUgaWdub3JlZCBpZiB3ZSBoYXZlIGJlZW4gaW5zdHJ1Y3RlZCB0byBub3QKKyAgLy8vIGluY2x1ZGUgdGltZXN0YW1wcyBpbiB0aGUgb3V0cHV0IGZpbGUuCisgIHRpbWVfdCBnZXRUaW1lc3RhbXBGb3JPdXRwdXQoY29uc3QgRmlsZUVudHJ5ICpFKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFdyaXRlIGEgcHJlY29tcGlsZWQgaGVhZGVyIGZvciB0aGUgZ2l2ZW4gc2VtYW50aWMgYW5hbHlzaXMuCisgIC8vLworICAvLy8gXHBhcmFtIFNlbWFSZWYgYSByZWZlcmVuY2UgdG8gdGhlIHNlbWFudGljIGFuYWx5c2lzIG9iamVjdCB0aGF0IHByb2Nlc3NlZAorICAvLy8gdGhlIEFTVCB0byBiZSB3cml0dGVuIGludG8gdGhlIHByZWNvbXBpbGVkIGhlYWRlci4KKyAgLy8vCisgIC8vLyBccGFyYW0gV3JpdGluZ01vZHVsZSBUaGUgbW9kdWxlIHRoYXQgd2UgYXJlIHdyaXRpbmcuIElmIG51bGwsIHdlIGFyZQorICAvLy8gd3JpdGluZyBhIHByZWNvbXBpbGVkIGhlYWRlci4KKyAgLy8vCisgIC8vLyBccGFyYW0gaXN5c3Jvb3QgaWYgbm9uLWVtcHR5LCB3cml0ZSBhIHJlbG9jYXRhYmxlIGZpbGUgd2hvc2UgaGVhZGVycworICAvLy8gYXJlIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBzeXN0ZW0gcm9vdC4gSWYgd2UncmUgd3JpdGluZyBhIG1vZHVsZSwgaXRzCisgIC8vLyBidWlsZCBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkIGluIHByZWZlcmVuY2UgdG8gdGhpcyBpZiBib3RoIGFyZSBhdmFpbGFibGUuCisgIC8vLworICAvLy8gXHJldHVybiB0aGUgbW9kdWxlIHNpZ25hdHVyZSwgd2hpY2ggZXZlbnR1YWxseSB3aWxsIGJlIGEgaGFzaCBvZgorICAvLy8gdGhlIG1vZHVsZSBidXQgY3VycmVudGx5IGlzIG1lcmVseSBhIHJhbmRvbSAzMi1iaXQgbnVtYmVyLgorICBBU1RGaWxlU2lnbmF0dXJlIFdyaXRlQVNUKFNlbWEgJlNlbWFSZWYsIGNvbnN0IHN0ZDo6c3RyaW5nICZPdXRwdXRGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqV3JpdGluZ01vZHVsZSwgU3RyaW5nUmVmIGlzeXNyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzRXJyb3JzID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIHRva2VuLgorICB2b2lkIEFkZFRva2VuKGNvbnN0IFRva2VuICZUb2ssIFJlY29yZERhdGFJbXBsICZSZWNvcmQpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIHNvdXJjZSBsb2NhdGlvbi4KKyAgdm9pZCBBZGRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBMb2MsIFJlY29yZERhdGFJbXBsICZSZWNvcmQpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIHNvdXJjZSByYW5nZS4KKyAgdm9pZCBBZGRTb3VyY2VSYW5nZShTb3VyY2VSYW5nZSBSYW5nZSwgUmVjb3JkRGF0YUltcGwgJlJlY29yZCk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgcmVmZXJlbmNlIHRvIGFuIGlkZW50aWZpZXIuCisgIHZvaWQgQWRkSWRlbnRpZmllclJlZihjb25zdCBJZGVudGlmaWVySW5mbyAqSUksIFJlY29yZERhdGFJbXBsICZSZWNvcmQpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSB1bmlxdWUgbnVtYmVyIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGdpdmVuIHNlbGVjdG9yLgorICBzZXJpYWxpemF0aW9uOjpTZWxlY3RvcklEIGdldFNlbGVjdG9yUmVmKFNlbGVjdG9yIFNlbCk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHVuaXF1ZSBudW1iZXIgdXNlZCB0byByZWZlciB0byB0aGUgZ2l2ZW4gaWRlbnRpZmllci4KKyAgc2VyaWFsaXphdGlvbjo6SWRlbnRJRCBnZXRJZGVudGlmaWVyUmVmKGNvbnN0IElkZW50aWZpZXJJbmZvICpJSSk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHVuaXF1ZSBudW1iZXIgdXNlZCB0byByZWZlciB0byB0aGUgZ2l2ZW4gbWFjcm8uCisgIHNlcmlhbGl6YXRpb246Ok1hY3JvSUQgZ2V0TWFjcm9SZWYoTWFjcm9JbmZvICpNSSwgY29uc3QgSWRlbnRpZmllckluZm8gKk5hbWUpOworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBJRCBvZiBhbiBhbHJlYWR5LWVtaXR0ZWQgbWFjcm8uCisgIHNlcmlhbGl6YXRpb246Ok1hY3JvSUQgZ2V0TWFjcm9JRChNYWNyb0luZm8gKk1JKTsKKworICB1aW50NjRfdCBnZXRNYWNyb0RpcmVjdGl2ZXNPZmZzZXQoY29uc3QgSWRlbnRpZmllckluZm8gKk5hbWUpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIHJlZmVyZW5jZSB0byBhIHR5cGUuCisgIHZvaWQgQWRkVHlwZVJlZihRdWFsVHlwZSBULCBSZWNvcmREYXRhSW1wbCAmUmVjb3JkKTsKKworICAvLy8gXGJyaWVmIEZvcmNlIGEgdHlwZSB0byBiZSBlbWl0dGVkIGFuZCBnZXQgaXRzIElELgorICBzZXJpYWxpemF0aW9uOjpUeXBlSUQgR2V0T3JDcmVhdGVUeXBlSUQoUXVhbFR5cGUgVCk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIHR5cGUgSUQgb2YgYW4gYWxyZWFkeS1lbWl0dGVkIHR5cGUuCisgIHNlcmlhbGl6YXRpb246OlR5cGVJRCBnZXRUeXBlSUQoUXVhbFR5cGUgVCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBGaW5kIHRoZSBmaXJzdCBsb2NhbCBkZWNsYXJhdGlvbiBvZiBhIGdpdmVuIGxvY2FsIHJlZGVjbGFyYWJsZQorICAvLy8gZGVjbC4KKyAgY29uc3QgRGVjbCAqZ2V0Rmlyc3RMb2NhbERlY2woY29uc3QgRGVjbCAqRCk7CisKKyAgLy8vIFxicmllZiBJcyB0aGlzIGEgbG9jYWwgZGVjbGFyYXRpb24gKHRoYXQgaXMsIG9uZSB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0bworICAvLy8gb3VyIEFTVCBmaWxlKT8gVGhpcyBpcyB0aGUgY2FzZSBmb3IgZGVjbGFyYXRpb25zIHRoYXQgYXJlIG5laXRoZXIgaW1wb3J0ZWQKKyAgLy8vIGZyb20gYW5vdGhlciBBU1QgZmlsZSBub3IgcHJlZGVmaW5lZC4KKyAgYm9vbCBJc0xvY2FsRGVjbChjb25zdCBEZWNsICpEKSB7CisgICAgaWYgKEQtPmlzRnJvbUFTVEZpbGUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBhdXRvIEkgPSBEZWNsSURzLmZpbmQoRCk7CisgICAgcmV0dXJuIChJID09IERlY2xJRHMuZW5kKCkgfHwKKyAgICAgICAgICAgIEktPnNlY29uZCA+PSBzZXJpYWxpemF0aW9uOjpOVU1fUFJFREVGX0RFQ0xfSURTKTsKKyAgfTsKKworICAvLy8gXGJyaWVmIEVtaXQgYSByZWZlcmVuY2UgdG8gYSBkZWNsYXJhdGlvbi4KKyAgdm9pZCBBZGREZWNsUmVmKGNvbnN0IERlY2wgKkQsIFJlY29yZERhdGFJbXBsICZSZWNvcmQpOworCisgIC8vLyBcYnJpZWYgRm9yY2UgYSBkZWNsYXJhdGlvbiB0byBiZSBlbWl0dGVkIGFuZCBnZXQgaXRzIElELgorICBzZXJpYWxpemF0aW9uOjpEZWNsSUQgR2V0RGVjbFJlZihjb25zdCBEZWNsICpEKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgZGVjbGFyYXRpb24gSUQgb2YgYW4gYWxyZWFkeS1lbWl0dGVkCisgIC8vLyBkZWNsYXJhdGlvbi4KKyAgc2VyaWFsaXphdGlvbjo6RGVjbElEIGdldERlY2xJRChjb25zdCBEZWNsICpEKTsKKworICB1bnNpZ25lZCBnZXRBbm9ueW1vdXNEZWNsYXJhdGlvbk51bWJlcihjb25zdCBOYW1lZERlY2wgKkQpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgc3RyaW5nIHRvIHRoZSBnaXZlbiByZWNvcmQuCisgIHZvaWQgQWRkU3RyaW5nKFN0cmluZ1JlZiBTdHIsIFJlY29yZERhdGFJbXBsICZSZWNvcmQpOworCisgIC8vLyBcYnJpZWYgQ29udmVydCBhIHBhdGggZnJvbSB0aGlzIGJ1aWxkIHByb2Nlc3MgaW50byBvbmUgdGhhdCBpcyBhcHByb3ByaWF0ZQorICAvLy8gZm9yIGVtaXNzaW9uIGluIHRoZSBtb2R1bGUgZmlsZS4KKyAgYm9vbCBQcmVwYXJlUGF0aEZvck91dHB1dChTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlBhdGgpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgcGF0aCB0byB0aGUgZ2l2ZW4gcmVjb3JkLgorICB2b2lkIEFkZFBhdGgoU3RyaW5nUmVmIFBhdGgsIFJlY29yZERhdGFJbXBsICZSZWNvcmQpOworCisgIC8vLyBcYnJpZWYgRW1pdCB0aGUgY3VycmVudCByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gcGF0aCBhcyBhIGJsb2IuCisgIHZvaWQgRW1pdFJlY29yZFdpdGhQYXRoKHVuc2lnbmVkIEFiYnJldiwgUmVjb3JkRGF0YVJlZiBSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBQYXRoKTsKKworICAvLy8gXGJyaWVmIEFkZCBhIHZlcnNpb24gdHVwbGUgdG8gdGhlIGdpdmVuIHJlY29yZAorICB2b2lkIEFkZFZlcnNpb25UdXBsZShjb25zdCBWZXJzaW9uVHVwbGUgJlZlcnNpb24sIFJlY29yZERhdGFJbXBsICZSZWNvcmQpOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgb3IgY3JlYXRlIGEgc3VibW9kdWxlIElEIGZvciB0aGlzIG1vZHVsZSwgb3IgcmV0dXJuIDAgaWYKKyAgLy8vIHRoZSBzdWJtb2R1bGUgaXMgbmVpdGhlciBsb2NhbCAoYSBzdWJtb2RsZSBvZiB0aGUgY3VycmVudGx5LXdyaXR0ZW4gbW9kdWxlKQorICAvLy8gbm9yIGZyb20gYW4gaW1wb3J0ZWQgbW9kdWxlLgorICB1bnNpZ25lZCBnZXRMb2NhbE9ySW1wb3J0ZWRTdWJtb2R1bGVJRChNb2R1bGUgKk1vZCk7CisKKyAgLy8vIFxicmllZiBOb3RlIHRoYXQgdGhlIGlkZW50aWZpZXIgSUkgb2NjdXJzIGF0IHRoZSBnaXZlbiBvZmZzZXQKKyAgLy8vIHdpdGhpbiB0aGUgaWRlbnRpZmllciB0YWJsZS4KKyAgdm9pZCBTZXRJZGVudGlmaWVyT2Zmc2V0KGNvbnN0IElkZW50aWZpZXJJbmZvICpJSSwgdWludDMyX3QgT2Zmc2V0KTsKKworICAvLy8gXGJyaWVmIE5vdGUgdGhhdCB0aGUgc2VsZWN0b3IgU2VsIG9jY3VycyBhdCB0aGUgZ2l2ZW4gb2Zmc2V0CisgIC8vLyB3aXRoaW4gdGhlIG1ldGhvZCBwb29sL3NlbGVjdG9yIHRhYmxlLgorICB2b2lkIFNldFNlbGVjdG9yT2Zmc2V0KFNlbGVjdG9yIFNlbCwgdWludDMyX3QgT2Zmc2V0KTsKKworICAvLy8gXGJyaWVmIFJlY29yZCBhbiBJRCBmb3IgdGhlIGdpdmVuIHN3aXRjaC1jYXNlIHN0YXRlbWVudC4KKyAgdW5zaWduZWQgUmVjb3JkU3dpdGNoQ2FzZUlEKFN3aXRjaENhc2UgKlMpOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIElEIGZvciB0aGUgZ2l2ZW4gc3dpdGNoLWNhc2Ugc3RhdGVtZW50LgorICB1bnNpZ25lZCBnZXRTd2l0Y2hDYXNlSUQoU3dpdGNoQ2FzZSAqUyk7CisKKyAgdm9pZCBDbGVhclN3aXRjaENhc2VJRHMoKTsKKworICB1bnNpZ25lZCBnZXRUeXBlRXh0UXVhbEFiYnJldigpIGNvbnN0IHsKKyAgICByZXR1cm4gVHlwZUV4dFF1YWxBYmJyZXY7CisgIH0KKworICB1bnNpZ25lZCBnZXRUeXBlRnVuY3Rpb25Qcm90b0FiYnJldigpIGNvbnN0IHsKKyAgICByZXR1cm4gVHlwZUZ1bmN0aW9uUHJvdG9BYmJyZXY7CisgIH0KKworICB1bnNpZ25lZCBnZXREZWNsUGFybVZhckFiYnJldigpIGNvbnN0IHsgcmV0dXJuIERlY2xQYXJtVmFyQWJicmV2OyB9CisgIHVuc2lnbmVkIGdldERlY2xSZWNvcmRBYmJyZXYoKSBjb25zdCB7IHJldHVybiBEZWNsUmVjb3JkQWJicmV2OyB9CisgIHVuc2lnbmVkIGdldERlY2xUeXBlZGVmQWJicmV2KCkgY29uc3QgeyByZXR1cm4gRGVjbFR5cGVkZWZBYmJyZXY7IH0KKyAgdW5zaWduZWQgZ2V0RGVjbFZhckFiYnJldigpIGNvbnN0IHsgcmV0dXJuIERlY2xWYXJBYmJyZXY7IH0KKyAgdW5zaWduZWQgZ2V0RGVjbEZpZWxkQWJicmV2KCkgY29uc3QgeyByZXR1cm4gRGVjbEZpZWxkQWJicmV2OyB9CisgIHVuc2lnbmVkIGdldERlY2xFbnVtQWJicmV2KCkgY29uc3QgeyByZXR1cm4gRGVjbEVudW1BYmJyZXY7IH0KKyAgdW5zaWduZWQgZ2V0RGVjbE9iakNJdmFyQWJicmV2KCkgY29uc3QgeyByZXR1cm4gRGVjbE9iakNJdmFyQWJicmV2OyB9CisgIHVuc2lnbmVkIGdldERlY2xDWFhNZXRob2RBYmJyZXYoKSBjb25zdCB7IHJldHVybiBEZWNsQ1hYTWV0aG9kQWJicmV2OyB9CisKKyAgdW5zaWduZWQgZ2V0RGVjbFJlZkV4cHJBYmJyZXYoKSBjb25zdCB7IHJldHVybiBEZWNsUmVmRXhwckFiYnJldjsgfQorICB1bnNpZ25lZCBnZXRDaGFyYWN0ZXJMaXRlcmFsQWJicmV2KCkgY29uc3QgeyByZXR1cm4gQ2hhcmFjdGVyTGl0ZXJhbEFiYnJldjsgfQorICB1bnNpZ25lZCBnZXRJbnRlZ2VyTGl0ZXJhbEFiYnJldigpIGNvbnN0IHsgcmV0dXJuIEludGVnZXJMaXRlcmFsQWJicmV2OyB9CisgIHVuc2lnbmVkIGdldEV4cHJJbXBsaWNpdENhc3RBYmJyZXYoKSBjb25zdCB7IHJldHVybiBFeHBySW1wbGljaXRDYXN0QWJicmV2OyB9CisKKyAgYm9vbCBoYXNDaGFpbigpIGNvbnN0IHsgcmV0dXJuIENoYWluOyB9CisgIEFTVFJlYWRlciAqZ2V0Q2hhaW4oKSBjb25zdCB7IHJldHVybiBDaGFpbjsgfQorCitwcml2YXRlOgorICAvLyBBU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgorICB2b2lkIFJlYWRlckluaXRpYWxpemVkKEFTVFJlYWRlciAqUmVhZGVyKSBvdmVycmlkZTsKKyAgdm9pZCBJZGVudGlmaWVyUmVhZChzZXJpYWxpemF0aW9uOjpJZGVudElEIElELCBJZGVudGlmaWVySW5mbyAqSUkpIG92ZXJyaWRlOworICB2b2lkIE1hY3JvUmVhZChzZXJpYWxpemF0aW9uOjpNYWNyb0lEIElELCBNYWNyb0luZm8gKk1JKSBvdmVycmlkZTsKKyAgdm9pZCBUeXBlUmVhZChzZXJpYWxpemF0aW9uOjpUeXBlSWR4IElkeCwgUXVhbFR5cGUgVCkgb3ZlcnJpZGU7CisgIHZvaWQgU2VsZWN0b3JSZWFkKHNlcmlhbGl6YXRpb246OlNlbGVjdG9ySUQgSUQsIFNlbGVjdG9yIFNlbCkgb3ZlcnJpZGU7CisgIHZvaWQgTWFjcm9EZWZpbml0aW9uUmVhZChzZXJpYWxpemF0aW9uOjpQcmVwcm9jZXNzZWRFbnRpdHlJRCBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvRGVmaW5pdGlvblJlY29yZCAqTUQpIG92ZXJyaWRlOworICB2b2lkIE1vZHVsZVJlYWQoc2VyaWFsaXphdGlvbjo6U3VibW9kdWxlSUQgSUQsIE1vZHVsZSAqTW9kKSBvdmVycmlkZTsKKworICAvLyBBU1RNdXRhdGlvbkxpc3RlbmVyIGltcGxlbWVudGF0aW9uLgorICB2b2lkIENvbXBsZXRlZFRhZ0RlZmluaXRpb24oY29uc3QgVGFnRGVjbCAqRCkgb3ZlcnJpZGU7CisgIHZvaWQgQWRkZWRWaXNpYmxlRGVjbChjb25zdCBEZWNsQ29udGV4dCAqREMsIGNvbnN0IERlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIEFkZGVkQ1hYSW1wbGljaXRNZW1iZXIoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsIGNvbnN0IERlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIEFkZGVkQ1hYVGVtcGxhdGVTcGVjaWFsaXphdGlvbigKKyAgICAgIGNvbnN0IENsYXNzVGVtcGxhdGVEZWNsICpURCwKKyAgICAgIGNvbnN0IENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIEFkZGVkQ1hYVGVtcGxhdGVTcGVjaWFsaXphdGlvbigKKyAgICAgIGNvbnN0IFZhclRlbXBsYXRlRGVjbCAqVEQsCisgICAgICBjb25zdCBWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAqRCkgb3ZlcnJpZGU7CisgIHZvaWQgQWRkZWRDWFhUZW1wbGF0ZVNwZWNpYWxpemF0aW9uKGNvbnN0IEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpURCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpEKSBvdmVycmlkZTsKKyAgdm9pZCBSZXNvbHZlZEV4Y2VwdGlvblNwZWMoY29uc3QgRnVuY3Rpb25EZWNsICpGRCkgb3ZlcnJpZGU7CisgIHZvaWQgRGVkdWNlZFJldHVyblR5cGUoY29uc3QgRnVuY3Rpb25EZWNsICpGRCwgUXVhbFR5cGUgUmV0dXJuVHlwZSkgb3ZlcnJpZGU7CisgIHZvaWQgUmVzb2x2ZWRPcGVyYXRvckRlbGV0ZShjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqREQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkRlbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKlRoaXNBcmcpIG92ZXJyaWRlOworICB2b2lkIENvbXBsZXRlZEltcGxpY2l0RGVmaW5pdGlvbihjb25zdCBGdW5jdGlvbkRlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIEluc3RhbnRpYXRpb25SZXF1ZXN0ZWQoY29uc3QgVmFsdWVEZWNsICpEKSBvdmVycmlkZTsKKyAgdm9pZCBWYXJpYWJsZURlZmluaXRpb25JbnN0YW50aWF0ZWQoY29uc3QgVmFyRGVjbCAqRCkgb3ZlcnJpZGU7CisgIHZvaWQgRnVuY3Rpb25EZWZpbml0aW9uSW5zdGFudGlhdGVkKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRCkgb3ZlcnJpZGU7CisgIHZvaWQgRGVmYXVsdEFyZ3VtZW50SW5zdGFudGlhdGVkKGNvbnN0IFBhcm1WYXJEZWNsICpEKSBvdmVycmlkZTsKKyAgdm9pZCBEZWZhdWx0TWVtYmVySW5pdGlhbGl6ZXJJbnN0YW50aWF0ZWQoY29uc3QgRmllbGREZWNsICpEKSBvdmVycmlkZTsKKyAgdm9pZCBBZGRlZE9iakNDYXRlZ29yeVRvSW50ZXJmYWNlKGNvbnN0IE9iakNDYXRlZ29yeURlY2wgKkNhdEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqSUZEKSBvdmVycmlkZTsKKyAgdm9pZCBEZWNsYXJhdGlvbk1hcmtlZFVzZWQoY29uc3QgRGVjbCAqRCkgb3ZlcnJpZGU7CisgIHZvaWQgRGVjbGFyYXRpb25NYXJrZWRPcGVuTVBUaHJlYWRQcml2YXRlKGNvbnN0IERlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIERlY2xhcmF0aW9uTWFya2VkT3Blbk1QRGVjbGFyZVRhcmdldChjb25zdCBEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyICpBdHRyKSBvdmVycmlkZTsKKyAgdm9pZCBSZWRlZmluZWRIaWRkZW5EZWZpbml0aW9uKGNvbnN0IE5hbWVkRGVjbCAqRCwgTW9kdWxlICpNKSBvdmVycmlkZTsKKyAgdm9pZCBBZGRlZEF0dHJpYnV0ZVRvUmVjb3JkKGNvbnN0IEF0dHIgKkF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWNvcmREZWNsICpSZWNvcmQpIG92ZXJyaWRlOworfTsKKworLy8vIFxicmllZiBBbiBvYmplY3QgZm9yIHN0cmVhbWluZyBpbmZvcm1hdGlvbiB0byBhIHJlY29yZC4KK2NsYXNzIEFTVFJlY29yZFdyaXRlciB7CisgIEFTVFdyaXRlciAqV3JpdGVyOworICBBU1RXcml0ZXI6OlJlY29yZERhdGFJbXBsICpSZWNvcmQ7CisKKyAgLy8vIFxicmllZiBTdGF0ZW1lbnRzIHRoYXQgd2UndmUgZW5jb3VudGVyZWQgd2hpbGUgc2VyaWFsaXppbmcgYQorICAvLy8gZGVjbGFyYXRpb24gb3IgdHlwZS4KKyAgU21hbGxWZWN0b3I8U3RtdCAqLCAxNj4gU3RtdHNUb0VtaXQ7CisKKyAgLy8vIFxicmllZiBJbmRpY2VzIG9mIHJlY29yZCBlbGVtZW50cyB0aGF0IGRlc2NyaWJlIG9mZnNldHMgd2l0aGluIHRoZQorICAvLy8gYml0Y29kZS4gVGhlc2Ugd2lsbCBiZSBjb252ZXJ0ZWQgdG8gb2Zmc2V0cyByZWxhdGl2ZSB0byB0aGUgY3VycmVudAorICAvLy8gcmVjb3JkIHdoZW4gZW1pdHRlZC4KKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDg+IE9mZnNldEluZGljZXM7CisKKyAgLy8vIFxicmllZiBGbHVzaCBhbGwgb2YgdGhlIHN0YXRlbWVudHMgYW5kIGV4cHJlc3Npb25zIHRoYXQgaGF2ZQorICAvLy8gYmVlbiBhZGRlZCB0byB0aGUgcXVldWUgdmlhIEFkZFN0bXQoKS4KKyAgdm9pZCBGbHVzaFN0bXRzKCk7CisgIHZvaWQgRmx1c2hTdWJTdG10cygpOworCisgIHZvaWQgUHJlcGFyZVRvRW1pdCh1aW50NjRfdCBNeU9mZnNldCkgeworICAgIC8vIENvbnZlcnQgb2Zmc2V0cyBpbnRvIHJlbGF0aXZlIGZvcm0uCisgICAgZm9yICh1bnNpZ25lZCBJIDogT2Zmc2V0SW5kaWNlcykgeworICAgICAgYXV0byAmU3RvcmVkT2Zmc2V0ID0gKCpSZWNvcmQpW0ldOworICAgICAgYXNzZXJ0KFN0b3JlZE9mZnNldCA8IE15T2Zmc2V0ICYmICJpbnZhbGlkIG9mZnNldCIpOworICAgICAgaWYgKFN0b3JlZE9mZnNldCkKKyAgICAgICAgU3RvcmVkT2Zmc2V0ID0gTXlPZmZzZXQgLSBTdG9yZWRPZmZzZXQ7CisgICAgfQorICAgIE9mZnNldEluZGljZXMuY2xlYXIoKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3QgYSBBU1RSZWNvcmRXcml0ZXIgdGhhdCB1c2VzIHRoZSBkZWZhdWx0IGVuY29kaW5nIHNjaGVtZS4KKyAgQVNUUmVjb3JkV3JpdGVyKEFTVFdyaXRlciAmV3JpdGVyLCBBU1RXcml0ZXI6OlJlY29yZERhdGFJbXBsICZSZWNvcmQpCisgICAgICA6IFdyaXRlcigmV3JpdGVyKSwgUmVjb3JkKCZSZWNvcmQpIHt9CisKKyAgLy8vIENvbnN0cnVjdCBhIEFTVFJlY29yZFdyaXRlciB0aGF0IHVzZXMgdGhlIHNhbWUgZW5jb2Rpbmcgc2NoZW1lIGFzIGFub3RoZXIKKyAgLy8vIEFTVFJlY29yZFdyaXRlci4KKyAgQVNUUmVjb3JkV3JpdGVyKEFTVFJlY29yZFdyaXRlciAmUGFyZW50LCBBU1RXcml0ZXI6OlJlY29yZERhdGFJbXBsICZSZWNvcmQpCisgICAgICA6IFdyaXRlcihQYXJlbnQuV3JpdGVyKSwgUmVjb3JkKCZSZWNvcmQpIHt9CisKKyAgLy8vIENvcHlpbmcgYW4gQVNUUmVjb3JkV3JpdGVyIGlzIGFsbW9zdCBjZXJ0YWlubHkgYSBidWcuCisgIEFTVFJlY29yZFdyaXRlcihjb25zdCBBU1RSZWNvcmRXcml0ZXIgJikgPSBkZWxldGU7CisgIEFTVFJlY29yZFdyaXRlciAmb3BlcmF0b3I9KGNvbnN0IEFTVFJlY29yZFdyaXRlciAmKSA9IGRlbGV0ZTsKKworICAvLy8gXGJyaWVmIEV4dHJhY3QgdGhlIHVuZGVybHlpbmcgcmVjb3JkIHN0b3JhZ2UuCisgIEFTVFdyaXRlcjo6UmVjb3JkRGF0YUltcGwgJmdldFJlY29yZERhdGEoKSBjb25zdCB7IHJldHVybiAqUmVjb3JkOyB9CisKKyAgLy8vIFxicmllZiBNaW5pbWFsIHZlY3Rvci1saWtlIGludGVyZmFjZS4KKyAgLy8vIEB7CisgIHZvaWQgcHVzaF9iYWNrKHVpbnQ2NF90IE4pIHsgUmVjb3JkLT5wdXNoX2JhY2soTik7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgdm9pZCBhcHBlbmQoSW5wdXRJdGVyYXRvciBiZWdpbiwgSW5wdXRJdGVyYXRvciBlbmQpIHsKKyAgICBSZWNvcmQtPmFwcGVuZChiZWdpbiwgZW5kKTsKKyAgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gUmVjb3JkLT5lbXB0eSgpOyB9CisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gUmVjb3JkLT5zaXplKCk7IH0KKyAgdWludDY0X3QgJm9wZXJhdG9yW10oc2l6ZV90IE4pIHsgcmV0dXJuICgqUmVjb3JkKVtOXTsgfQorICAvLy8gQH0KKworICAvLy8gXGJyaWVmIEVtaXQgdGhlIHJlY29yZCB0byB0aGUgc3RyZWFtLCBmb2xsb3dlZCBieSBpdHMgc3Vic3RhdGVtZW50cywgYW5kCisgIC8vLyByZXR1cm4gaXRzIG9mZnNldC4KKyAgLy8gRklYTUU6IEFsbG93IHJlY29yZCBwcm9kdWNlcnMgdG8gc3VnZ2VzdCBBYmJyZXZzLgorICB1aW50NjRfdCBFbWl0KHVuc2lnbmVkIENvZGUsIHVuc2lnbmVkIEFiYnJldiA9IDApIHsKKyAgICB1aW50NjRfdCBPZmZzZXQgPSBXcml0ZXItPlN0cmVhbS5HZXRDdXJyZW50Qml0Tm8oKTsKKyAgICBQcmVwYXJlVG9FbWl0KE9mZnNldCk7CisgICAgV3JpdGVyLT5TdHJlYW0uRW1pdFJlY29yZChDb2RlLCAqUmVjb3JkLCBBYmJyZXYpOworICAgIEZsdXNoU3RtdHMoKTsKKyAgICByZXR1cm4gT2Zmc2V0OworICB9CisKKyAgLy8vIFxicmllZiBFbWl0IHRoZSByZWNvcmQgdG8gdGhlIHN0cmVhbSwgcHJlY2VkZWQgYnkgaXRzIHN1YnN0YXRlbWVudHMuCisgIHVpbnQ2NF90IEVtaXRTdG10KHVuc2lnbmVkIENvZGUsIHVuc2lnbmVkIEFiYnJldiA9IDApIHsKKyAgICBGbHVzaFN1YlN0bXRzKCk7CisgICAgUHJlcGFyZVRvRW1pdChXcml0ZXItPlN0cmVhbS5HZXRDdXJyZW50Qml0Tm8oKSk7CisgICAgV3JpdGVyLT5TdHJlYW0uRW1pdFJlY29yZChDb2RlLCAqUmVjb3JkLCBBYmJyZXYpOworICAgIHJldHVybiBXcml0ZXItPlN0cmVhbS5HZXRDdXJyZW50Qml0Tm8oKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWRkIGEgYml0IG9mZnNldCBpbnRvIHRoZSByZWNvcmQuIFRoaXMgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhbgorICAvLy8gb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHJlY29yZCB3aGVuIGVtaXR0ZWQuCisgIHZvaWQgQWRkT2Zmc2V0KHVpbnQ2NF90IEJpdE9mZnNldCkgeworICAgIE9mZnNldEluZGljZXMucHVzaF9iYWNrKFJlY29yZC0+c2l6ZSgpKTsKKyAgICBSZWNvcmQtPnB1c2hfYmFjayhCaXRPZmZzZXQpOworICB9CisKKyAgLy8vIFxicmllZiBBZGQgdGhlIGdpdmVuIHN0YXRlbWVudCBvciBleHByZXNzaW9uIHRvIHRoZSBxdWV1ZSBvZgorICAvLy8gc3RhdGVtZW50cyB0byBlbWl0LgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBzaG91bGQgYmUgdXNlZCB3aGVuIGVtaXR0aW5nIHR5cGVzIGFuZCBkZWNsYXJhdGlvbnMKKyAgLy8vIHRoYXQgaGF2ZSBleHByZXNzaW9ucyBhcyBwYXJ0IG9mIHRoZWlyIGZvcm11bGF0aW9uLiBPbmNlIHRoZQorICAvLy8gdHlwZSBvciBkZWNsYXJhdGlvbiBoYXMgYmVlbiB3cml0dGVuLCBFbWl0KCkgd2lsbCB3cml0ZQorICAvLy8gdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGVtZW50cyBqdXN0IGFmdGVyIHRoZSByZWNvcmQuCisgIHZvaWQgQWRkU3RtdChTdG10ICpTKSB7CisgICAgU3RtdHNUb0VtaXQucHVzaF9iYWNrKFMpOworICB9CisKKyAgLy8vIFxicmllZiBBZGQgYSBkZWZpbml0aW9uIGZvciB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG8gdGhlIHF1ZXVlIG9mIHN0YXRlbWVudHMKKyAgLy8vIHRvIGVtaXQuCisgIHZvaWQgQWRkRnVuY3Rpb25EZWZpbml0aW9uKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIHNvdXJjZSBsb2NhdGlvbi4KKyAgdm9pZCBBZGRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICByZXR1cm4gV3JpdGVyLT5BZGRTb3VyY2VMb2NhdGlvbihMb2MsICpSZWNvcmQpOworICB9CisKKyAgLy8vIFxicmllZiBFbWl0IGEgc291cmNlIHJhbmdlLgorICB2b2lkIEFkZFNvdXJjZVJhbmdlKFNvdXJjZVJhbmdlIFJhbmdlKSB7CisgICAgcmV0dXJuIFdyaXRlci0+QWRkU291cmNlUmFuZ2UoUmFuZ2UsICpSZWNvcmQpOworICB9CisKKyAgLy8vIFxicmllZiBFbWl0IGFuIGludGVncmFsIHZhbHVlLgorICB2b2lkIEFkZEFQSW50KGNvbnN0IGxsdm06OkFQSW50ICZWYWx1ZSk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgc2lnbmVkIGludGVncmFsIHZhbHVlLgorICB2b2lkIEFkZEFQU0ludChjb25zdCBsbHZtOjpBUFNJbnQgJlZhbHVlKTsKKworICAvLy8gXGJyaWVmIEVtaXQgYSBmbG9hdGluZy1wb2ludCB2YWx1ZS4KKyAgdm9pZCBBZGRBUEZsb2F0KGNvbnN0IGxsdm06OkFQRmxvYXQgJlZhbHVlKTsKKworICAvLy8gXGJyaWVmIEVtaXQgYSByZWZlcmVuY2UgdG8gYW4gaWRlbnRpZmllci4KKyAgdm9pZCBBZGRJZGVudGlmaWVyUmVmKGNvbnN0IElkZW50aWZpZXJJbmZvICpJSSkgeworICAgIHJldHVybiBXcml0ZXItPkFkZElkZW50aWZpZXJSZWYoSUksICpSZWNvcmQpOworICB9CisKKyAgLy8vIFxicmllZiBFbWl0IGEgU2VsZWN0b3IgKHdoaWNoIGlzIGEgc21hcnQgcG9pbnRlciByZWZlcmVuY2UpLgorICB2b2lkIEFkZFNlbGVjdG9yUmVmKFNlbGVjdG9yIFMpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIENYWFRlbXBvcmFyeS4KKyAgdm9pZCBBZGRDWFhUZW1wb3JhcnkoY29uc3QgQ1hYVGVtcG9yYXJ5ICpUZW1wKTsKKworICAvLy8gXGJyaWVmIEVtaXQgYSBDKysgYmFzZSBzcGVjaWZpZXIuCisgIHZvaWQgQWRkQ1hYQmFzZVNwZWNpZmllcihjb25zdCBDWFhCYXNlU3BlY2lmaWVyICZCYXNlKTsKKworICAvLy8gXGJyaWVmIEVtaXQgYSBzZXQgb2YgQysrIGJhc2Ugc3BlY2lmaWVycy4KKyAgdm9pZCBBZGRDWFhCYXNlU3BlY2lmaWVycyhBcnJheVJlZjxDWFhCYXNlU3BlY2lmaWVyPiBCYXNlcyk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgcmVmZXJlbmNlIHRvIGEgdHlwZS4KKyAgdm9pZCBBZGRUeXBlUmVmKFF1YWxUeXBlIFQpIHsKKyAgICByZXR1cm4gV3JpdGVyLT5BZGRUeXBlUmVmKFQsICpSZWNvcmQpOworICB9CisKKyAgLy8vIFxicmllZiBFbWl0cyBhIHJlZmVyZW5jZSB0byBhIGRlY2xhcmF0b3IgaW5mby4KKyAgdm9pZCBBZGRUeXBlU291cmNlSW5mbyhUeXBlU291cmNlSW5mbyAqVEluZm8pOworCisgIC8vLyBcYnJpZWYgRW1pdHMgYSB0eXBlIHdpdGggc291cmNlLWxvY2F0aW9uIGluZm9ybWF0aW9uLgorICB2b2lkIEFkZFR5cGVMb2MoVHlwZUxvYyBUTCk7CisKKyAgLy8vIFxicmllZiBFbWl0cyBhIHRlbXBsYXRlIGFyZ3VtZW50IGxvY2F0aW9uIGluZm8uCisgIHZvaWQgQWRkVGVtcGxhdGVBcmd1bWVudExvY0luZm8oVGVtcGxhdGVBcmd1bWVudDo6QXJnS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMb2NJbmZvICZBcmcpOworCisgIC8vLyBcYnJpZWYgRW1pdHMgYSB0ZW1wbGF0ZSBhcmd1bWVudCBsb2NhdGlvbi4KKyAgdm9pZCBBZGRUZW1wbGF0ZUFyZ3VtZW50TG9jKGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMb2MgJkFyZyk7CisKKyAgLy8vIFxicmllZiBFbWl0cyBhbiBBU1QgdGVtcGxhdGUgYXJndW1lbnQgbGlzdCBpbmZvLgorICB2b2lkIEFkZEFTVFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbygKKyAgICAgIGNvbnN0IEFTVFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqQVNUVGVtcGxBcmdMaXN0KTsKKworICAvLy8gXGJyaWVmIEVtaXQgYSByZWZlcmVuY2UgdG8gYSBkZWNsYXJhdGlvbi4KKyAgdm9pZCBBZGREZWNsUmVmKGNvbnN0IERlY2wgKkQpIHsKKyAgICByZXR1cm4gV3JpdGVyLT5BZGREZWNsUmVmKEQsICpSZWNvcmQpOworICB9CisKKyAgLy8vIFxicmllZiBFbWl0IGEgZGVjbGFyYXRpb24gbmFtZS4KKyAgdm9pZCBBZGREZWNsYXJhdGlvbk5hbWUoRGVjbGFyYXRpb25OYW1lIE5hbWUpOworCisgIHZvaWQgQWRkRGVjbGFyYXRpb25OYW1lTG9jKGNvbnN0IERlY2xhcmF0aW9uTmFtZUxvYyAmRE5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBOYW1lKTsKKyAgdm9pZCBBZGREZWNsYXJhdGlvbk5hbWVJbmZvKGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvKTsKKworICB2b2lkIEFkZFF1YWxpZmllckluZm8oY29uc3QgUXVhbGlmaWVySW5mbyAmSW5mbyk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgbmVzdGVkIG5hbWUgc3BlY2lmaWVyLgorICB2b2lkIEFkZE5lc3RlZE5hbWVTcGVjaWZpZXIoTmVzdGVkTmFtZVNwZWNpZmllciAqTk5TKTsKKworICAvLy8gXGJyaWVmIEVtaXQgYSBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIgd2l0aCBzb3VyY2UtbG9jYXRpb24gaW5mb3JtYXRpb24uCisgIHZvaWQgQWRkTmVzdGVkTmFtZVNwZWNpZmllckxvYyhOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIE5OUyk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgdGVtcGxhdGUgbmFtZS4KKyAgdm9pZCBBZGRUZW1wbGF0ZU5hbWUoVGVtcGxhdGVOYW1lIE5hbWUpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIHRlbXBsYXRlIGFyZ3VtZW50LgorICB2b2lkIEFkZFRlbXBsYXRlQXJndW1lbnQoY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmQXJnKTsKKworICAvLy8gXGJyaWVmIEVtaXQgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdC4KKyAgdm9pZCBBZGRUZW1wbGF0ZVBhcmFtZXRlckxpc3QoY29uc3QgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpUZW1wbGF0ZVBhcmFtcyk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgdGVtcGxhdGUgYXJndW1lbnQgbGlzdC4KKyAgdm9pZCBBZGRUZW1wbGF0ZUFyZ3VtZW50TGlzdChjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdCAqVGVtcGxhdGVBcmdzKTsKKworICAvLy8gXGJyaWVmIEVtaXQgYSBVbnJlc29sdmVkU2V0IHN0cnVjdHVyZS4KKyAgdm9pZCBBZGRVbnJlc29sdmVkU2V0KGNvbnN0IEFTVFVucmVzb2x2ZWRTZXQgJlNldCk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgQ1hYQ3RvckluaXRpYWxpemVyIGFycmF5LgorICB2b2lkIEFkZENYWEN0b3JJbml0aWFsaXplcnMoQXJyYXlSZWY8Q1hYQ3RvckluaXRpYWxpemVyICo+IEN0b3JJbml0cyk7CisKKyAgdm9pZCBBZGRDWFhEZWZpbml0aW9uRGF0YShjb25zdCBDWFhSZWNvcmREZWNsICpEKTsKKworICAvLy8gXGJyaWVmIEVtaXQgYSBzdHJpbmcuCisgIHZvaWQgQWRkU3RyaW5nKFN0cmluZ1JlZiBTdHIpIHsKKyAgICByZXR1cm4gV3JpdGVyLT5BZGRTdHJpbmcoU3RyLCAqUmVjb3JkKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRW1pdCBhIHBhdGguCisgIHZvaWQgQWRkUGF0aChTdHJpbmdSZWYgUGF0aCkgeworICAgIHJldHVybiBXcml0ZXItPkFkZFBhdGgoUGF0aCwgKlJlY29yZCk7CisgIH0KKworICAvLy8gXGJyaWVmIEVtaXQgYSB2ZXJzaW9uIHR1cGxlLgorICB2b2lkIEFkZFZlcnNpb25UdXBsZShjb25zdCBWZXJzaW9uVHVwbGUgJlZlcnNpb24pIHsKKyAgICByZXR1cm4gV3JpdGVyLT5BZGRWZXJzaW9uVHVwbGUoVmVyc2lvbiwgKlJlY29yZCk7CisgIH0KKworICAvLy8gXGJyaWVmIEVtaXQgYSBsaXN0IG9mIGF0dHJpYnV0ZXMuCisgIHZvaWQgQWRkQXR0cmlidXRlcyhBcnJheVJlZjxjb25zdCBBdHRyKj4gQXR0cnMpOworfTsKKworLy8vIFxicmllZiBBU1QgYW5kIHNlbWFudGljLWFuYWx5c2lzIGNvbnN1bWVyIHRoYXQgZ2VuZXJhdGVzIGEKKy8vLyBwcmVjb21waWxlZCBoZWFkZXIgZnJvbSB0aGUgcGFyc2VkIHNvdXJjZSBjb2RlLgorY2xhc3MgUENIR2VuZXJhdG9yIDogcHVibGljIFNlbWFDb25zdW1lciB7CisgIGNvbnN0IFByZXByb2Nlc3NvciAmUFA7CisgIHN0ZDo6c3RyaW5nIE91dHB1dEZpbGU7CisgIHN0ZDo6c3RyaW5nIGlzeXNyb290OworICBTZW1hICpTZW1hUHRyOworICBzdGQ6OnNoYXJlZF9wdHI8UENIQnVmZmVyPiBCdWZmZXI7CisgIGxsdm06OkJpdHN0cmVhbVdyaXRlciBTdHJlYW07CisgIEFTVFdyaXRlciBXcml0ZXI7CisgIGJvb2wgQWxsb3dBU1RXaXRoRXJyb3JzOworCitwcm90ZWN0ZWQ6CisgIEFTVFdyaXRlciAmZ2V0V3JpdGVyKCkgeyByZXR1cm4gV3JpdGVyOyB9CisgIGNvbnN0IEFTVFdyaXRlciAmZ2V0V3JpdGVyKCkgY29uc3QgeyByZXR1cm4gV3JpdGVyOyB9CisgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmZ2V0UENIKCkgY29uc3QgeyByZXR1cm4gQnVmZmVyLT5EYXRhOyB9CisKK3B1YmxpYzoKKyAgUENIR2VuZXJhdG9yKGNvbnN0IFByZXByb2Nlc3NvciAmUFAsIFN0cmluZ1JlZiBPdXRwdXRGaWxlLCBTdHJpbmdSZWYgaXN5c3Jvb3QsCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UENIQnVmZmVyPiBCdWZmZXIsCisgICAgICAgICAgICAgICBBcnJheVJlZjxzdGQ6OnNoYXJlZF9wdHI8TW9kdWxlRmlsZUV4dGVuc2lvbj4+IEV4dGVuc2lvbnMsCisgICAgICAgICAgICAgICBib29sIEFsbG93QVNUV2l0aEVycm9ycyA9IGZhbHNlLCBib29sIEluY2x1ZGVUaW1lc3RhbXBzID0gdHJ1ZSk7CisgIH5QQ0hHZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICB2b2lkIEluaXRpYWxpemVTZW1hKFNlbWEgJlMpIG92ZXJyaWRlIHsgU2VtYVB0ciA9ICZTOyB9CisgIHZvaWQgSGFuZGxlVHJhbnNsYXRpb25Vbml0KEFTVENvbnRleHQgJkN0eCkgb3ZlcnJpZGU7CisgIEFTVE11dGF0aW9uTGlzdGVuZXIgKkdldEFTVE11dGF0aW9uTGlzdGVuZXIoKSBvdmVycmlkZTsKKyAgQVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXIgKkdldEFTVERlc2VyaWFsaXphdGlvbkxpc3RlbmVyKCkgb3ZlcnJpZGU7CisgIGJvb2wgaGFzRW1pdHRlZFBDSCgpIGNvbnN0IHsgcmV0dXJuIEJ1ZmZlci0+SXNDb21wbGV0ZTsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfU0VSSUFMSVpBVElPTl9BU1RXUklURVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9BdHRyUENIUmVhZC5pbmMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL0F0dHJQQ0hSZWFkLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzY3NDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9BdHRyUENIUmVhZC5pbmMKQEAgLTAsMCArMSwyMjg2IEBACisvKj09PS0gVGFibGVHZW4nZXJhdGVkIGZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIEF0dHJpYnV0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZSwgZG8gbm90IGVkaXQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisgIHN3aXRjaCAoS2luZCkgeworICBjYXNlIGF0dHI6OkFNREdQVUZsYXRXb3JrR3JvdXBTaXplOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgbWluID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBtYXggPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQU1ER1BVRmxhdFdvcmtHcm91cFNpemVBdHRyKFJhbmdlLCBDb250ZXh0LCBtaW4sIG1heCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBTURHUFVOdW1TR1BSOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgbnVtU0dQUiA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBBTURHUFVOdW1TR1BSQXR0cihSYW5nZSwgQ29udGV4dCwgbnVtU0dQUiwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBTURHUFVOdW1WR1BSOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgbnVtVkdQUiA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBBTURHUFVOdW1WR1BSQXR0cihSYW5nZSwgQ29udGV4dCwgbnVtVkdQUiwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBTURHUFVXYXZlc1BlckVVOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgbWluID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBtYXggPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQU1ER1BVV2F2ZXNQZXJFVUF0dHIoUmFuZ2UsIENvbnRleHQsIG1pbiwgbWF4LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFSTUludGVycnVwdDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIEFSTUludGVycnVwdEF0dHI6OkludGVycnVwdFR5cGUgaW50ZXJydXB0KHN0YXRpY19jYXN0PEFSTUludGVycnVwdEF0dHI6OkludGVycnVwdFR5cGU+KFJlY29yZC5yZWFkSW50KCkpKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEFSTUludGVycnVwdEF0dHIoUmFuZ2UsIENvbnRleHQsIGludGVycnVwdCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBVlJJbnRlcnJ1cHQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEFWUkludGVycnVwdEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QVZSU2lnbmFsOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBBVlJTaWduYWxBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFiaVRhZzogeworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIHRhZ3NTaXplID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBTbWFsbFZlY3RvcjxTdHJpbmdSZWYsIDQ+IHRhZ3M7CisgICAgdGFncy5yZXNlcnZlKHRhZ3NTaXplKTsKKyAgICBTbWFsbFZlY3RvcjxzdGQ6OnN0cmluZywgND4gdGFnc1N0b3JhZ2U7CisgICAgdGFnc1N0b3JhZ2UucmVzZXJ2ZSh0YWdzU2l6ZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSB0YWdzU2l6ZTsgKytpKQorICAgICAgdGFnc1N0b3JhZ2UucHVzaF9iYWNrKFJlY29yZC5yZWFkU3RyaW5nKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gdGFnc1NpemU7ICsraSkKKyAgICAgIHRhZ3MucHVzaF9iYWNrKHRhZ3NTdG9yYWdlW2ldKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEFiaVRhZ0F0dHIoUmFuZ2UsIENvbnRleHQsIHRhZ3MuZGF0YSgpLCB0YWdzU2l6ZSwgU3BlbGxpbmcpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBY3F1aXJlQ2FwYWJpbGl0eTogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIGFyZ3NTaXplID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBTbWFsbFZlY3RvcjxFeHByICosIDQ+IGFyZ3M7CisgICAgYXJncy5yZXNlcnZlKGFyZ3NTaXplKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IGFyZ3NTaXplOyArK2kpCisgICAgICBhcmdzLnB1c2hfYmFjayhSZWNvcmQucmVhZEV4cHIoKSk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBBY3F1aXJlQ2FwYWJpbGl0eUF0dHIoUmFuZ2UsIENvbnRleHQsIGFyZ3MuZGF0YSgpLCBhcmdzU2l6ZSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBY3F1aXJlZEFmdGVyOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgYXJnc1NpemUgPSBSZWNvcmQucmVhZEludCgpOworICAgIFNtYWxsVmVjdG9yPEV4cHIgKiwgND4gYXJnczsKKyAgICBhcmdzLnJlc2VydmUoYXJnc1NpemUpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gYXJnc1NpemU7ICsraSkKKyAgICAgIGFyZ3MucHVzaF9iYWNrKFJlY29yZC5yZWFkRXhwcigpKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEFjcXVpcmVkQWZ0ZXJBdHRyKFJhbmdlLCBDb250ZXh0LCBhcmdzLmRhdGEoKSwgYXJnc1NpemUsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QWNxdWlyZWRCZWZvcmU6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBhcmdzU2l6ZSA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgU21hbGxWZWN0b3I8RXhwciAqLCA0PiBhcmdzOworICAgIGFyZ3MucmVzZXJ2ZShhcmdzU2l6ZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBhcmdzU2l6ZTsgKytpKQorICAgICAgYXJncy5wdXNoX2JhY2soUmVjb3JkLnJlYWRFeHByKCkpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQWNxdWlyZWRCZWZvcmVBdHRyKFJhbmdlLCBDb250ZXh0LCBhcmdzLmRhdGEoKSwgYXJnc1NpemUsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QWxpYXM6IHsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBzdGQ6OnN0cmluZyBhbGlhc2VlPSBSZWNvcmQucmVhZFN0cmluZygpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQWxpYXNBdHRyKFJhbmdlLCBDb250ZXh0LCBhbGlhc2VlLCBTcGVsbGluZyk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFsaWduTWFjNjhrOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBBbGlnbk1hYzY4a0F0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QWxpZ25WYWx1ZTogeworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIEV4cHIgKiBhbGlnbm1lbnQgPSBSZWNvcmQucmVhZEV4cHIoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEFsaWduVmFsdWVBdHRyKFJhbmdlLCBDb250ZXh0LCBhbGlnbm1lbnQsIFNwZWxsaW5nKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QWxpZ25lZDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNhbGlnbm1lbnRFeHByID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB2b2lkICphbGlnbm1lbnRQdHI7CisgICAgaWYgKGlzYWxpZ25tZW50RXhwcikKKyAgICAgIGFsaWdubWVudFB0ciA9IFJlY29yZC5yZWFkRXhwcigpOworICAgIGVsc2UKKyAgICAgIGFsaWdubWVudFB0ciA9IFJlY29yZC5nZXRUeXBlU291cmNlSW5mbygpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQWxpZ25lZEF0dHIoUmFuZ2UsIENvbnRleHQsIGlzYWxpZ25tZW50RXhwciwgYWxpZ25tZW50UHRyLCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFsbG9jQWxpZ246IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBQYXJhbUlkeCBwYXJhbUluZGV4ID0gUGFyYW1JZHg6OmRlc2VyaWFsaXplKFJlY29yZC5yZWFkSW50KCkpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQWxsb2NBbGlnbkF0dHIoUmFuZ2UsIENvbnRleHQsIHBhcmFtSW5kZXgsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QWxsb2NTaXplOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgUGFyYW1JZHggZWxlbVNpemVQYXJhbSA9IFBhcmFtSWR4OjpkZXNlcmlhbGl6ZShSZWNvcmQucmVhZEludCgpKTsKKyAgICBQYXJhbUlkeCBudW1FbGVtc1BhcmFtID0gUGFyYW1JZHg6OmRlc2VyaWFsaXplKFJlY29yZC5yZWFkSW50KCkpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQWxsb2NTaXplQXR0cihSYW5nZSwgQ29udGV4dCwgZWxlbVNpemVQYXJhbSwgbnVtRWxlbXNQYXJhbSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBbHdheXNJbmxpbmU6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEFsd2F5c0lubGluZUF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QW5hbHl6ZXJOb1JldHVybjogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQW5hbHl6ZXJOb1JldHVybkF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QW5ub3RhdGU6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBzdGQ6OnN0cmluZyBhbm5vdGF0aW9uPSBSZWNvcmQucmVhZFN0cmluZygpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQW5ub3RhdGVBdHRyKFJhbmdlLCBDb250ZXh0LCBhbm5vdGF0aW9uLCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFueVg4NkludGVycnVwdDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQW55WDg2SW50ZXJydXB0QXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBbnlYODZOb0NhbGxlclNhdmVkUmVnaXN0ZXJzOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBBbnlYODZOb0NhbGxlclNhdmVkUmVnaXN0ZXJzQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBbnlYODZOb0NmQ2hlY2s6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEFueVg4Nk5vQ2ZDaGVja0F0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QXJjV2Vha3JlZlVuYXZhaWxhYmxlOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBBcmNXZWFrcmVmVW5hdmFpbGFibGVBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFyZ3VtZW50V2l0aFR5cGVUYWc6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBJZGVudGlmaWVySW5mbyAqIGFyZ3VtZW50S2luZCA9IFJlY29yZC5nZXRJZGVudGlmaWVySW5mbygpOworICAgIFBhcmFtSWR4IGFyZ3VtZW50SWR4ID0gUGFyYW1JZHg6OmRlc2VyaWFsaXplKFJlY29yZC5yZWFkSW50KCkpOworICAgIFBhcmFtSWR4IHR5cGVUYWdJZHggPSBQYXJhbUlkeDo6ZGVzZXJpYWxpemUoUmVjb3JkLnJlYWRJbnQoKSk7CisgICAgYm9vbCBpc1BvaW50ZXIgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQXJndW1lbnRXaXRoVHlwZVRhZ0F0dHIoUmFuZ2UsIENvbnRleHQsIGFyZ3VtZW50S2luZCwgYXJndW1lbnRJZHgsIHR5cGVUYWdJZHgsIGlzUG9pbnRlciwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBcnRpZmljaWFsOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBBcnRpZmljaWFsQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBc21MYWJlbDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHN0ZDo6c3RyaW5nIGxhYmVsPSBSZWNvcmQucmVhZFN0cmluZygpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQXNtTGFiZWxBdHRyKFJhbmdlLCBDb250ZXh0LCBsYWJlbCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBc3NlcnRDYXBhYmlsaXR5OiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgYXJnc1NpemUgPSBSZWNvcmQucmVhZEludCgpOworICAgIFNtYWxsVmVjdG9yPEV4cHIgKiwgND4gYXJnczsKKyAgICBhcmdzLnJlc2VydmUoYXJnc1NpemUpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gYXJnc1NpemU7ICsraSkKKyAgICAgIGFyZ3MucHVzaF9iYWNrKFJlY29yZC5yZWFkRXhwcigpKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEFzc2VydENhcGFiaWxpdHlBdHRyKFJhbmdlLCBDb250ZXh0LCBhcmdzLmRhdGEoKSwgYXJnc1NpemUsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QXNzZXJ0RXhjbHVzaXZlTG9jazogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIGFyZ3NTaXplID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBTbWFsbFZlY3RvcjxFeHByICosIDQ+IGFyZ3M7CisgICAgYXJncy5yZXNlcnZlKGFyZ3NTaXplKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IGFyZ3NTaXplOyArK2kpCisgICAgICBhcmdzLnB1c2hfYmFjayhSZWNvcmQucmVhZEV4cHIoKSk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBBc3NlcnRFeGNsdXNpdmVMb2NrQXR0cihSYW5nZSwgQ29udGV4dCwgYXJncy5kYXRhKCksIGFyZ3NTaXplLCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFzc2VydFNoYXJlZExvY2s6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBhcmdzU2l6ZSA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgU21hbGxWZWN0b3I8RXhwciAqLCA0PiBhcmdzOworICAgIGFyZ3MucmVzZXJ2ZShhcmdzU2l6ZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBhcmdzU2l6ZTsgKytpKQorICAgICAgYXJncy5wdXNoX2JhY2soUmVjb3JkLnJlYWRFeHByKCkpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQXNzZXJ0U2hhcmVkTG9ja0F0dHIoUmFuZ2UsIENvbnRleHQsIGFyZ3MuZGF0YSgpLCBhcmdzU2l6ZSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBc3N1bWVBbGlnbmVkOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgRXhwciAqIGFsaWdubWVudCA9IFJlY29yZC5yZWFkRXhwcigpOworICAgIEV4cHIgKiBvZmZzZXQgPSBSZWNvcmQucmVhZEV4cHIoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEFzc3VtZUFsaWduZWRBdHRyKFJhbmdlLCBDb250ZXh0LCBhbGlnbm1lbnQsIG9mZnNldCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBdmFpbGFiaWxpdHk6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBJZGVudGlmaWVySW5mbyAqIHBsYXRmb3JtID0gUmVjb3JkLmdldElkZW50aWZpZXJJbmZvKCk7CisgICAgVmVyc2lvblR1cGxlIGludHJvZHVjZWQ9IFJlY29yZC5yZWFkVmVyc2lvblR1cGxlKCk7CisgICAgVmVyc2lvblR1cGxlIGRlcHJlY2F0ZWQ9IFJlY29yZC5yZWFkVmVyc2lvblR1cGxlKCk7CisgICAgVmVyc2lvblR1cGxlIG9ic29sZXRlZD0gUmVjb3JkLnJlYWRWZXJzaW9uVHVwbGUoKTsKKyAgICBib29sIHVuYXZhaWxhYmxlID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBzdGQ6OnN0cmluZyBtZXNzYWdlPSBSZWNvcmQucmVhZFN0cmluZygpOworICAgIGJvb2wgc3RyaWN0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBzdGQ6OnN0cmluZyByZXBsYWNlbWVudD0gUmVjb3JkLnJlYWRTdHJpbmcoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEF2YWlsYWJpbGl0eUF0dHIoUmFuZ2UsIENvbnRleHQsIHBsYXRmb3JtLCBpbnRyb2R1Y2VkLCBkZXByZWNhdGVkLCBvYnNvbGV0ZWQsIHVuYXZhaWxhYmxlLCBtZXNzYWdlLCBzdHJpY3QsIHJlcGxhY2VtZW50LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkJsb2NrczogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIEJsb2Nrc0F0dHI6OkJsb2NrVHlwZSB0eXBlKHN0YXRpY19jYXN0PEJsb2Nrc0F0dHI6OkJsb2NrVHlwZT4oUmVjb3JkLnJlYWRJbnQoKSkpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQmxvY2tzQXR0cihSYW5nZSwgQ29udGV4dCwgdHlwZSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDMTFOb1JldHVybjogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQzExTm9SZXR1cm5BdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNEZWNsOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBDRGVjbEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q0ZBdWRpdGVkVHJhbnNmZXI6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIENGQXVkaXRlZFRyYW5zZmVyQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDRkNvbnN1bWVkOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBDRkNvbnN1bWVkQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDRlJldHVybnNOb3RSZXRhaW5lZDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQ0ZSZXR1cm5zTm90UmV0YWluZWRBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNGUmV0dXJuc1JldGFpbmVkOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBDRlJldHVybnNSZXRhaW5lZEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q0ZVbmtub3duVHJhbnNmZXI6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIENGVW5rbm93blRyYW5zZmVyQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDVURBQ29uc3RhbnQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIENVREFDb25zdGFudEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q1VEQURldmljZTogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQ1VEQURldmljZUF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q1VEQUdsb2JhbDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQ1VEQUdsb2JhbEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q1VEQUhvc3Q6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIENVREFIb3N0QXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDVURBSW52YWxpZFRhcmdldDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQ1VEQUludmFsaWRUYXJnZXRBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNVREFMYXVuY2hCb3VuZHM6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBFeHByICogbWF4VGhyZWFkcyA9IFJlY29yZC5yZWFkRXhwcigpOworICAgIEV4cHIgKiBtaW5CbG9ja3MgPSBSZWNvcmQucmVhZEV4cHIoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIENVREFMYXVuY2hCb3VuZHNBdHRyKFJhbmdlLCBDb250ZXh0LCBtYXhUaHJlYWRzLCBtaW5CbG9ja3MsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q1VEQVNoYXJlZDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQ1VEQVNoYXJlZEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q1hYMTFOb1JldHVybjogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQ1hYMTFOb1JldHVybkF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q2FsbGFibGVXaGVuOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgY2FsbGFibGVTdGF0ZXNTaXplID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBTbWFsbFZlY3RvcjxDYWxsYWJsZVdoZW5BdHRyOjpDb25zdW1lZFN0YXRlLCA0PiBjYWxsYWJsZVN0YXRlczsKKyAgICBjYWxsYWJsZVN0YXRlcy5yZXNlcnZlKGNhbGxhYmxlU3RhdGVzU2l6ZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gY2FsbGFibGVTdGF0ZXNTaXplOyBpOyAtLWkpCisgICAgICBjYWxsYWJsZVN0YXRlcy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Q2FsbGFibGVXaGVuQXR0cjo6Q29uc3VtZWRTdGF0ZT4oUmVjb3JkLnJlYWRJbnQoKSkpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQ2FsbGFibGVXaGVuQXR0cihSYW5nZSwgQ29udGV4dCwgY2FsbGFibGVTdGF0ZXMuZGF0YSgpLCBjYWxsYWJsZVN0YXRlc1NpemUsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q2FwYWJpbGl0eTogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHN0ZDo6c3RyaW5nIG5hbWU9IFJlY29yZC5yZWFkU3RyaW5nKCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBDYXBhYmlsaXR5QXR0cihSYW5nZSwgQ29udGV4dCwgbmFtZSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDYXB0dXJlZFJlY29yZDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQ2FwdHVyZWRSZWNvcmRBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNhcnJpZXNEZXBlbmRlbmN5OiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBDYXJyaWVzRGVwZW5kZW5jeUF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q2xlYW51cDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIEZ1bmN0aW9uRGVjbCAqIGZ1bmN0aW9uRGVjbCA9IFJlY29yZC5HZXRMb2NhbERlY2xBczxGdW5jdGlvbkRlY2wgPihSZWNvcmQucmVhZEludCgpKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIENsZWFudXBBdHRyKFJhbmdlLCBDb250ZXh0LCBmdW5jdGlvbkRlY2wsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q29sZDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQ29sZEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q29tbW9uOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBDb21tb25BdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNvbnN0OiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBDb25zdEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q29uc3RydWN0b3I6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBpbnQgcHJpb3JpdHkgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQ29uc3RydWN0b3JBdHRyKFJhbmdlLCBDb250ZXh0LCBwcmlvcml0eSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDb25zdW1hYmxlOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgQ29uc3VtYWJsZUF0dHI6OkNvbnN1bWVkU3RhdGUgZGVmYXVsdFN0YXRlKHN0YXRpY19jYXN0PENvbnN1bWFibGVBdHRyOjpDb25zdW1lZFN0YXRlPihSZWNvcmQucmVhZEludCgpKSk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBDb25zdW1hYmxlQXR0cihSYW5nZSwgQ29udGV4dCwgZGVmYXVsdFN0YXRlLCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNvbnN1bWFibGVBdXRvQ2FzdDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgQ29uc3VtYWJsZUF1dG9DYXN0QXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDb25zdW1hYmxlU2V0T25SZWFkOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBDb25zdW1hYmxlU2V0T25SZWFkQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDb252ZXJnZW50OiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBDb252ZXJnZW50QXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpETExFeHBvcnQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIERMTEV4cG9ydEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6RExMSW1wb3J0OiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBETExJbXBvcnRBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkRlcHJlY2F0ZWQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBzdGQ6OnN0cmluZyBtZXNzYWdlPSBSZWNvcmQucmVhZFN0cmluZygpOworICAgIHN0ZDo6c3RyaW5nIHJlcGxhY2VtZW50PSBSZWNvcmQucmVhZFN0cmluZygpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgRGVwcmVjYXRlZEF0dHIoUmFuZ2UsIENvbnRleHQsIG1lc3NhZ2UsIHJlcGxhY2VtZW50LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkRlc3RydWN0b3I6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBpbnQgcHJpb3JpdHkgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgRGVzdHJ1Y3RvckF0dHIoUmFuZ2UsIENvbnRleHQsIHByaW9yaXR5LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkRpYWdub3NlSWY6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBFeHByICogY29uZCA9IFJlY29yZC5yZWFkRXhwcigpOworICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2U9IFJlY29yZC5yZWFkU3RyaW5nKCk7CisgICAgRGlhZ25vc2VJZkF0dHI6OkRpYWdub3N0aWNUeXBlIGRpYWdub3N0aWNUeXBlKHN0YXRpY19jYXN0PERpYWdub3NlSWZBdHRyOjpEaWFnbm9zdGljVHlwZT4oUmVjb3JkLnJlYWRJbnQoKSkpOworICAgIGJvb2wgYXJnRGVwZW5kZW50ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOYW1lZERlY2wgKiBwYXJlbnQgPSBSZWNvcmQuR2V0TG9jYWxEZWNsQXM8TmFtZWREZWNsID4oUmVjb3JkLnJlYWRJbnQoKSk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBEaWFnbm9zZUlmQXR0cihSYW5nZSwgQ29udGV4dCwgY29uZCwgbWVzc2FnZSwgZGlhZ25vc3RpY1R5cGUsIGFyZ0RlcGVuZGVudCwgcGFyZW50LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkRpc2FibGVUYWlsQ2FsbHM6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIERpc2FibGVUYWlsQ2FsbHNBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkVtcHR5QmFzZXM6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEVtcHR5QmFzZXNBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkVuYWJsZUlmOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgRXhwciAqIGNvbmQgPSBSZWNvcmQucmVhZEV4cHIoKTsKKyAgICBzdGQ6OnN0cmluZyBtZXNzYWdlPSBSZWNvcmQucmVhZFN0cmluZygpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgRW5hYmxlSWZBdHRyKFJhbmdlLCBDb250ZXh0LCBjb25kLCBtZXNzYWdlLCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkVudW1FeHRlbnNpYmlsaXR5OiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgRW51bUV4dGVuc2liaWxpdHlBdHRyOjpLaW5kIGV4dGVuc2liaWxpdHkoc3RhdGljX2Nhc3Q8RW51bUV4dGVuc2liaWxpdHlBdHRyOjpLaW5kPihSZWNvcmQucmVhZEludCgpKSk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBFbnVtRXh0ZW5zaWJpbGl0eUF0dHIoUmFuZ2UsIENvbnRleHQsIGV4dGVuc2liaWxpdHksIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6RXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgRXhwciAqIHN1Y2Nlc3NWYWx1ZSA9IFJlY29yZC5yZWFkRXhwcigpOworICAgIHVuc2lnbmVkIGFyZ3NTaXplID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBTbWFsbFZlY3RvcjxFeHByICosIDQ+IGFyZ3M7CisgICAgYXJncy5yZXNlcnZlKGFyZ3NTaXplKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IGFyZ3NTaXplOyArK2kpCisgICAgICBhcmdzLnB1c2hfYmFjayhSZWNvcmQucmVhZEV4cHIoKSk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb25BdHRyKFJhbmdlLCBDb250ZXh0LCBzdWNjZXNzVmFsdWUsIGFyZ3MuZGF0YSgpLCBhcmdzU2l6ZSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpFeHRlcm5hbFNvdXJjZVN5bWJvbDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHN0ZDo6c3RyaW5nIGxhbmd1YWdlPSBSZWNvcmQucmVhZFN0cmluZygpOworICAgIHN0ZDo6c3RyaW5nIGRlZmluZWRJbj0gUmVjb3JkLnJlYWRTdHJpbmcoKTsKKyAgICBib29sIGdlbmVyYXRlZERlY2xhcmF0aW9uID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEV4dGVybmFsU291cmNlU3ltYm9sQXR0cihSYW5nZSwgQ29udGV4dCwgbGFuZ3VhZ2UsIGRlZmluZWRJbiwgZ2VuZXJhdGVkRGVjbGFyYXRpb24sIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6RmFsbFRocm91Z2g6IHsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEZhbGxUaHJvdWdoQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpGYXN0Q2FsbDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgRmFzdENhbGxBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkZpbmFsOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBGaW5hbEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6RmxhZ0VudW06IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEZsYWdFbnVtQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpGbGF0dGVuOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBGbGF0dGVuQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpGb3JtYXQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBJZGVudGlmaWVySW5mbyAqIHR5cGUgPSBSZWNvcmQuZ2V0SWRlbnRpZmllckluZm8oKTsKKyAgICBpbnQgZm9ybWF0SWR4ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBpbnQgZmlyc3RBcmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgRm9ybWF0QXR0cihSYW5nZSwgQ29udGV4dCwgdHlwZSwgZm9ybWF0SWR4LCBmaXJzdEFyZywgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpGb3JtYXRBcmc6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBQYXJhbUlkeCBmb3JtYXRJZHggPSBQYXJhbUlkeDo6ZGVzZXJpYWxpemUoUmVjb3JkLnJlYWRJbnQoKSk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBGb3JtYXRBcmdBdHRyKFJhbmdlLCBDb250ZXh0LCBmb3JtYXRJZHgsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6R05VSW5saW5lOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBHTlVJbmxpbmVBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Okd1YXJkZWRCeTogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIEV4cHIgKiBhcmcgPSBSZWNvcmQucmVhZEV4cHIoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEd1YXJkZWRCeUF0dHIoUmFuZ2UsIENvbnRleHQsIGFyZywgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpHdWFyZGVkVmFyOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBHdWFyZGVkVmFyQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpIb3Q6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEhvdEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6SUJBY3Rpb246IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIElCQWN0aW9uQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpJQk91dGxldDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgSUJPdXRsZXRBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OklCT3V0bGV0Q29sbGVjdGlvbjogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIFR5cGVTb3VyY2VJbmZvICogaW50ZXJmYWNlXyA9IFJlY29yZC5nZXRUeXBlU291cmNlSW5mbygpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgSUJPdXRsZXRDb2xsZWN0aW9uQXR0cihSYW5nZSwgQ29udGV4dCwgaW50ZXJmYWNlXywgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpJRnVuYzogeworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHN0ZDo6c3RyaW5nIHJlc29sdmVyPSBSZWNvcmQucmVhZFN0cmluZygpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgSUZ1bmNBdHRyKFJhbmdlLCBDb250ZXh0LCByZXNvbHZlciwgU3BlbGxpbmcpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpJbml0UHJpb3JpdHk6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBwcmlvcml0eSA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBJbml0UHJpb3JpdHlBdHRyKFJhbmdlLCBDb250ZXh0LCBwcmlvcml0eSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpJbml0U2VnOiB7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgc3RkOjpzdHJpbmcgc2VjdGlvbj0gUmVjb3JkLnJlYWRTdHJpbmcoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEluaXRTZWdBdHRyKFJhbmdlLCBDb250ZXh0LCBzZWN0aW9uLCBTcGVsbGluZyk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkludGVsT2NsQmljYzogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgSW50ZWxPY2xCaWNjQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpJbnRlcm5hbExpbmthZ2U6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIEludGVybmFsTGlua2FnZUF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TFRPVmlzaWJpbGl0eVB1YmxpYzogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgTFRPVmlzaWJpbGl0eVB1YmxpY0F0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TGF5b3V0VmVyc2lvbjogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIHZlcnNpb24gPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgTGF5b3V0VmVyc2lvbkF0dHIoUmFuZ2UsIENvbnRleHQsIHZlcnNpb24sIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TG9ja1JldHVybmVkOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgRXhwciAqIGFyZyA9IFJlY29yZC5yZWFkRXhwcigpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgTG9ja1JldHVybmVkQXR0cihSYW5nZSwgQ29udGV4dCwgYXJnLCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkxvY2tzRXhjbHVkZWQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBhcmdzU2l6ZSA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgU21hbGxWZWN0b3I8RXhwciAqLCA0PiBhcmdzOworICAgIGFyZ3MucmVzZXJ2ZShhcmdzU2l6ZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBhcmdzU2l6ZTsgKytpKQorICAgICAgYXJncy5wdXNoX2JhY2soUmVjb3JkLnJlYWRFeHByKCkpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgTG9ja3NFeGNsdWRlZEF0dHIoUmFuZ2UsIENvbnRleHQsIGFyZ3MuZGF0YSgpLCBhcmdzU2l6ZSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpMb29wSGludDogeworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIExvb3BIaW50QXR0cjo6T3B0aW9uVHlwZSBvcHRpb24oc3RhdGljX2Nhc3Q8TG9vcEhpbnRBdHRyOjpPcHRpb25UeXBlPihSZWNvcmQucmVhZEludCgpKSk7CisgICAgTG9vcEhpbnRBdHRyOjpMb29wSGludFN0YXRlIHN0YXRlKHN0YXRpY19jYXN0PExvb3BIaW50QXR0cjo6TG9vcEhpbnRTdGF0ZT4oUmVjb3JkLnJlYWRJbnQoKSkpOworICAgIEV4cHIgKiB2YWx1ZSA9IFJlY29yZC5yZWFkRXhwcigpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgTG9vcEhpbnRBdHRyKFJhbmdlLCBDb250ZXh0LCBvcHRpb24sIHN0YXRlLCB2YWx1ZSwgU3BlbGxpbmcpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpNU0FCSTogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgTVNBQklBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok1TSW5oZXJpdGFuY2U6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGJlc3RDYXNlID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE1TSW5oZXJpdGFuY2VBdHRyKFJhbmdlLCBDb250ZXh0LCBiZXN0Q2FzZSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpNU05vVlRhYmxlOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBNU05vVlRhYmxlQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpNU1A0MzBJbnRlcnJ1cHQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBudW1iZXIgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgTVNQNDMwSW50ZXJydXB0QXR0cihSYW5nZSwgQ29udGV4dCwgbnVtYmVyLCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok1TU3RydWN0OiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBNU1N0cnVjdEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TVNWdG9yRGlzcDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIHZkbSA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBNU1Z0b3JEaXNwQXR0cihSYW5nZSwgQ29udGV4dCwgdmRtLCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok1heEZpZWxkQWxpZ25tZW50OiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgYWxpZ25tZW50ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE1heEZpZWxkQWxpZ25tZW50QXR0cihSYW5nZSwgQ29udGV4dCwgYWxpZ25tZW50LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok1heUFsaWFzOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBNYXlBbGlhc0F0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TWljcm9NaXBzOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBNaWNyb01pcHNBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok1pblNpemU6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE1pblNpemVBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok1pcHMxNjogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgTWlwczE2QXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpNaXBzSW50ZXJydXB0OiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTWlwc0ludGVycnVwdEF0dHI6OkludGVycnVwdFR5cGUgaW50ZXJydXB0KHN0YXRpY19jYXN0PE1pcHNJbnRlcnJ1cHRBdHRyOjpJbnRlcnJ1cHRUeXBlPihSZWNvcmQucmVhZEludCgpKSk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBNaXBzSW50ZXJydXB0QXR0cihSYW5nZSwgQ29udGV4dCwgaW50ZXJydXB0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok1pcHNMb25nQ2FsbDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgTWlwc0xvbmdDYWxsQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpNaXBzU2hvcnRDYWxsOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBNaXBzU2hvcnRDYWxsQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpNb2RlOiB7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgSWRlbnRpZmllckluZm8gKiBtb2RlID0gUmVjb3JkLmdldElkZW50aWZpZXJJbmZvKCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBNb2RlQXR0cihSYW5nZSwgQ29udGV4dCwgbW9kZSwgU3BlbGxpbmcpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOU0NvbnN1bWVkOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBOU0NvbnN1bWVkQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOU0NvbnN1bWVzU2VsZjogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgTlNDb25zdW1lc1NlbGZBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5TUmV0dXJuc0F1dG9yZWxlYXNlZDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgTlNSZXR1cm5zQXV0b3JlbGVhc2VkQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOU1JldHVybnNOb3RSZXRhaW5lZDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgTlNSZXR1cm5zTm90UmV0YWluZWRBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5TUmV0dXJuc1JldGFpbmVkOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBOU1JldHVybnNSZXRhaW5lZEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TmFrZWQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE5ha2VkQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb0FsaWFzOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBOb0FsaWFzQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb0NvbW1vbjogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgTm9Db21tb25BdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5vRGVidWc6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE5vRGVidWdBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5vRHVwbGljYXRlOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBOb0R1cGxpY2F0ZUF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Tm9Fc2NhcGU6IHsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE5vRXNjYXBlQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb0lubGluZTogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgTm9JbmxpbmVBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5vSW5zdHJ1bWVudEZ1bmN0aW9uOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBOb0luc3RydW1lbnRGdW5jdGlvbkF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Tm9NaWNyb01pcHM6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE5vTWljcm9NaXBzQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb01pcHMxNjogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgTm9NaXBzMTZBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5vUmV0dXJuOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBOb1JldHVybkF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Tm9TYW5pdGl6ZTogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIHNhbml0aXplcnNTaXplID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBTbWFsbFZlY3RvcjxTdHJpbmdSZWYsIDQ+IHNhbml0aXplcnM7CisgICAgc2FuaXRpemVycy5yZXNlcnZlKHNhbml0aXplcnNTaXplKTsKKyAgICBTbWFsbFZlY3RvcjxzdGQ6OnN0cmluZywgND4gc2FuaXRpemVyc1N0b3JhZ2U7CisgICAgc2FuaXRpemVyc1N0b3JhZ2UucmVzZXJ2ZShzYW5pdGl6ZXJzU2l6ZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBzYW5pdGl6ZXJzU2l6ZTsgKytpKQorICAgICAgc2FuaXRpemVyc1N0b3JhZ2UucHVzaF9iYWNrKFJlY29yZC5yZWFkU3RyaW5nKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gc2FuaXRpemVyc1NpemU7ICsraSkKKyAgICAgIHNhbml0aXplcnMucHVzaF9iYWNrKHNhbml0aXplcnNTdG9yYWdlW2ldKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE5vU2FuaXRpemVBdHRyKFJhbmdlLCBDb250ZXh0LCBzYW5pdGl6ZXJzLmRhdGEoKSwgc2FuaXRpemVyc1NpemUsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Tm9TcGxpdFN0YWNrOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBOb1NwbGl0U3RhY2tBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5vVGhyZWFkU2FmZXR5QW5hbHlzaXM6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE5vVGhyZWFkU2FmZXR5QW5hbHlzaXNBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5vVGhyb3c6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE5vVGhyb3dBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5vbk51bGw6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBhcmdzU2l6ZSA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgU21hbGxWZWN0b3I8UGFyYW1JZHgsIDQ+IGFyZ3M7CisgICAgYXJncy5yZXNlcnZlKGFyZ3NTaXplKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IGFyZ3NTaXplOyArK2kpCisgICAgICBhcmdzLnB1c2hfYmFjayhQYXJhbUlkeDo6ZGVzZXJpYWxpemUoUmVjb3JkLnJlYWRJbnQoKSkpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgTm9uTnVsbEF0dHIoUmFuZ2UsIENvbnRleHQsIGFyZ3MuZGF0YSgpLCBhcmdzU2l6ZSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb3RUYWlsQ2FsbGVkOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBOb3RUYWlsQ2FsbGVkQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPTVBDYXB0dXJlS2luZDogeworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIGNhcHR1cmVLaW5kID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE9NUENhcHR1cmVLaW5kQXR0cihSYW5nZSwgQ29udGV4dCwgY2FwdHVyZUtpbmQsIFNwZWxsaW5nKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T01QQ2FwdHVyZU5vSW5pdDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgT01QQ2FwdHVyZU5vSW5pdEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T01QRGVjbGFyZVNpbWREZWNsOiB7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgT01QRGVjbGFyZVNpbWREZWNsQXR0cjo6QnJhbmNoU3RhdGVUeSBicmFuY2hTdGF0ZShzdGF0aWNfY2FzdDxPTVBEZWNsYXJlU2ltZERlY2xBdHRyOjpCcmFuY2hTdGF0ZVR5PihSZWNvcmQucmVhZEludCgpKSk7CisgICAgRXhwciAqIHNpbWRsZW4gPSBSZWNvcmQucmVhZEV4cHIoKTsKKyAgICB1bnNpZ25lZCB1bmlmb3Jtc1NpemUgPSBSZWNvcmQucmVhZEludCgpOworICAgIFNtYWxsVmVjdG9yPEV4cHIgKiwgND4gdW5pZm9ybXM7CisgICAgdW5pZm9ybXMucmVzZXJ2ZSh1bmlmb3Jtc1NpemUpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gdW5pZm9ybXNTaXplOyArK2kpCisgICAgICB1bmlmb3Jtcy5wdXNoX2JhY2soUmVjb3JkLnJlYWRFeHByKCkpOworICAgIHVuc2lnbmVkIGFsaWduZWRzU2l6ZSA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgU21hbGxWZWN0b3I8RXhwciAqLCA0PiBhbGlnbmVkczsKKyAgICBhbGlnbmVkcy5yZXNlcnZlKGFsaWduZWRzU2l6ZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBhbGlnbmVkc1NpemU7ICsraSkKKyAgICAgIGFsaWduZWRzLnB1c2hfYmFjayhSZWNvcmQucmVhZEV4cHIoKSk7CisgICAgdW5zaWduZWQgYWxpZ25tZW50c1NpemUgPSBSZWNvcmQucmVhZEludCgpOworICAgIFNtYWxsVmVjdG9yPEV4cHIgKiwgND4gYWxpZ25tZW50czsKKyAgICBhbGlnbm1lbnRzLnJlc2VydmUoYWxpZ25tZW50c1NpemUpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gYWxpZ25tZW50c1NpemU7ICsraSkKKyAgICAgIGFsaWdubWVudHMucHVzaF9iYWNrKFJlY29yZC5yZWFkRXhwcigpKTsKKyAgICB1bnNpZ25lZCBsaW5lYXJzU2l6ZSA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgU21hbGxWZWN0b3I8RXhwciAqLCA0PiBsaW5lYXJzOworICAgIGxpbmVhcnMucmVzZXJ2ZShsaW5lYXJzU2l6ZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBsaW5lYXJzU2l6ZTsgKytpKQorICAgICAgbGluZWFycy5wdXNoX2JhY2soUmVjb3JkLnJlYWRFeHByKCkpOworICAgIHVuc2lnbmVkIG1vZGlmaWVyc1NpemUgPSBSZWNvcmQucmVhZEludCgpOworICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBtb2RpZmllcnM7CisgICAgbW9kaWZpZXJzLnJlc2VydmUobW9kaWZpZXJzU2l6ZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBtb2RpZmllcnNTaXplOyArK2kpCisgICAgICBtb2RpZmllcnMucHVzaF9iYWNrKFJlY29yZC5yZWFkSW50KCkpOworICAgIHVuc2lnbmVkIHN0ZXBzU2l6ZSA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgU21hbGxWZWN0b3I8RXhwciAqLCA0PiBzdGVwczsKKyAgICBzdGVwcy5yZXNlcnZlKHN0ZXBzU2l6ZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBzdGVwc1NpemU7ICsraSkKKyAgICAgIHN0ZXBzLnB1c2hfYmFjayhSZWNvcmQucmVhZEV4cHIoKSk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBPTVBEZWNsYXJlU2ltZERlY2xBdHRyKFJhbmdlLCBDb250ZXh0LCBicmFuY2hTdGF0ZSwgc2ltZGxlbiwgdW5pZm9ybXMuZGF0YSgpLCB1bmlmb3Jtc1NpemUsIGFsaWduZWRzLmRhdGEoKSwgYWxpZ25lZHNTaXplLCBhbGlnbm1lbnRzLmRhdGEoKSwgYWxpZ25tZW50c1NpemUsIGxpbmVhcnMuZGF0YSgpLCBsaW5lYXJzU2l6ZSwgbW9kaWZpZXJzLmRhdGEoKSwgbW9kaWZpZXJzU2l6ZSwgc3RlcHMuZGF0YSgpLCBzdGVwc1NpemUsIFNwZWxsaW5nKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T01QRGVjbGFyZVRhcmdldERlY2w6IHsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBPTVBEZWNsYXJlVGFyZ2V0RGVjbEF0dHI6Ok1hcFR5cGVUeSBtYXBUeXBlKHN0YXRpY19jYXN0PE9NUERlY2xhcmVUYXJnZXREZWNsQXR0cjo6TWFwVHlwZVR5PihSZWNvcmQucmVhZEludCgpKSk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBPTVBEZWNsYXJlVGFyZ2V0RGVjbEF0dHIoUmFuZ2UsIENvbnRleHQsIG1hcFR5cGUsIFNwZWxsaW5nKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T01QUmVmZXJlbmNlZFZhcjogeworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIEV4cHIgKiByZWYgPSBSZWNvcmQucmVhZEV4cHIoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE9NUFJlZmVyZW5jZWRWYXJBdHRyKFJhbmdlLCBDb250ZXh0LCByZWYsIFNwZWxsaW5nKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T01QVGhyZWFkUHJpdmF0ZURlY2w6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE9NUFRocmVhZFByaXZhdGVEZWNsQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDQm94YWJsZTogeworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgT2JqQ0JveGFibGVBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNCcmlkZ2U6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBJZGVudGlmaWVySW5mbyAqIGJyaWRnZWRUeXBlID0gUmVjb3JkLmdldElkZW50aWZpZXJJbmZvKCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBPYmpDQnJpZGdlQXR0cihSYW5nZSwgQ29udGV4dCwgYnJpZGdlZFR5cGUsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T2JqQ0JyaWRnZU11dGFibGU6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBJZGVudGlmaWVySW5mbyAqIGJyaWRnZWRUeXBlID0gUmVjb3JkLmdldElkZW50aWZpZXJJbmZvKCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBPYmpDQnJpZGdlTXV0YWJsZUF0dHIoUmFuZ2UsIENvbnRleHQsIGJyaWRnZWRUeXBlLCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNCcmlkZ2VSZWxhdGVkOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgSWRlbnRpZmllckluZm8gKiByZWxhdGVkQ2xhc3MgPSBSZWNvcmQuZ2V0SWRlbnRpZmllckluZm8oKTsKKyAgICBJZGVudGlmaWVySW5mbyAqIGNsYXNzTWV0aG9kID0gUmVjb3JkLmdldElkZW50aWZpZXJJbmZvKCk7CisgICAgSWRlbnRpZmllckluZm8gKiBpbnN0YW5jZU1ldGhvZCA9IFJlY29yZC5nZXRJZGVudGlmaWVySW5mbygpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgT2JqQ0JyaWRnZVJlbGF0ZWRBdHRyKFJhbmdlLCBDb250ZXh0LCByZWxhdGVkQ2xhc3MsIGNsYXNzTWV0aG9kLCBpbnN0YW5jZU1ldGhvZCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDRGVzaWduYXRlZEluaXRpYWxpemVyOiB7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBPYmpDRGVzaWduYXRlZEluaXRpYWxpemVyQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDRXhjZXB0aW9uOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBPYmpDRXhjZXB0aW9uQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDRXhwbGljaXRQcm90b2NvbEltcGw6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE9iakNFeHBsaWNpdFByb3RvY29sSW1wbEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T2JqQ0luZGVwZW5kZW50Q2xhc3M6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE9iakNJbmRlcGVuZGVudENsYXNzQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDTWV0aG9kRmFtaWx5OiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgT2JqQ01ldGhvZEZhbWlseUF0dHI6OkZhbWlseUtpbmQgZmFtaWx5KHN0YXRpY19jYXN0PE9iakNNZXRob2RGYW1pbHlBdHRyOjpGYW1pbHlLaW5kPihSZWNvcmQucmVhZEludCgpKSk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBPYmpDTWV0aG9kRmFtaWx5QXR0cihSYW5nZSwgQ29udGV4dCwgZmFtaWx5LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNOU09iamVjdDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgT2JqQ05TT2JqZWN0QXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDUHJlY2lzZUxpZmV0aW1lOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBPYmpDUHJlY2lzZUxpZmV0aW1lQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDUmVxdWlyZXNQcm9wZXJ0eURlZnM6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE9iakNSZXF1aXJlc1Byb3BlcnR5RGVmc0F0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T2JqQ1JlcXVpcmVzU3VwZXI6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE9iakNSZXF1aXJlc1N1cGVyQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDUmV0dXJuc0lubmVyUG9pbnRlcjogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgT2JqQ1JldHVybnNJbm5lclBvaW50ZXJBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNSb290Q2xhc3M6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE9iakNSb290Q2xhc3NBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNSdW50aW1lTmFtZTogeworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHN0ZDo6c3RyaW5nIG1ldGFkYXRhTmFtZT0gUmVjb3JkLnJlYWRTdHJpbmcoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE9iakNSdW50aW1lTmFtZUF0dHIoUmFuZ2UsIENvbnRleHQsIG1ldGFkYXRhTmFtZSwgU3BlbGxpbmcpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDUnVudGltZVZpc2libGU6IHsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE9iakNSdW50aW1lVmlzaWJsZUF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T2JqQ1N1YmNsYXNzaW5nUmVzdHJpY3RlZDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgT2JqQ1N1YmNsYXNzaW5nUmVzdHJpY3RlZEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T3BlbkNMQWNjZXNzOiB7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBPcGVuQ0xBY2Nlc3NBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9wZW5DTEludGVsUmVxZFN1Ykdyb3VwU2l6ZTogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIHN1Ykdyb3VwU2l6ZSA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBPcGVuQ0xJbnRlbFJlcWRTdWJHcm91cFNpemVBdHRyKFJhbmdlLCBDb250ZXh0LCBzdWJHcm91cFNpemUsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T3BlbkNMS2VybmVsOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBPcGVuQ0xLZXJuZWxBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9wZW5DTFVucm9sbEhpbnQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCB1bnJvbGxIaW50ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE9wZW5DTFVucm9sbEhpbnRBdHRyKFJhbmdlLCBDb250ZXh0LCB1bnJvbGxIaW50LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9wdGltaXplTm9uZTogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgT3B0aW1pemVOb25lQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPdmVybG9hZGFibGU6IHsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE92ZXJsb2FkYWJsZUF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T3ZlcnJpZGU6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIE92ZXJyaWRlQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPd25lcnNoaXA6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBJZGVudGlmaWVySW5mbyAqIG1vZHVsZSA9IFJlY29yZC5nZXRJZGVudGlmaWVySW5mbygpOworICAgIHVuc2lnbmVkIGFyZ3NTaXplID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBTbWFsbFZlY3RvcjxQYXJhbUlkeCwgND4gYXJnczsKKyAgICBhcmdzLnJlc2VydmUoYXJnc1NpemUpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gYXJnc1NpemU7ICsraSkKKyAgICAgIGFyZ3MucHVzaF9iYWNrKFBhcmFtSWR4OjpkZXNlcmlhbGl6ZShSZWNvcmQucmVhZEludCgpKSk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBPd25lcnNoaXBBdHRyKFJhbmdlLCBDb250ZXh0LCBtb2R1bGUsIGFyZ3MuZGF0YSgpLCBhcmdzU2l6ZSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpQYWNrZWQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFBhY2tlZEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UGFyYW1UeXBlc3RhdGU6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBQYXJhbVR5cGVzdGF0ZUF0dHI6OkNvbnN1bWVkU3RhdGUgcGFyYW1TdGF0ZShzdGF0aWNfY2FzdDxQYXJhbVR5cGVzdGF0ZUF0dHI6OkNvbnN1bWVkU3RhdGU+KFJlY29yZC5yZWFkSW50KCkpKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFBhcmFtVHlwZXN0YXRlQXR0cihSYW5nZSwgQ29udGV4dCwgcGFyYW1TdGF0ZSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpQYXNjYWw6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFBhc2NhbEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UGFzc09iamVjdFNpemU6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBpbnQgdHlwZSA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBQYXNzT2JqZWN0U2l6ZUF0dHIoUmFuZ2UsIENvbnRleHQsIHR5cGUsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UGNzOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgUGNzQXR0cjo6UENTVHlwZSBwQ1Moc3RhdGljX2Nhc3Q8UGNzQXR0cjo6UENTVHlwZT4oUmVjb3JkLnJlYWRJbnQoKSkpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgUGNzQXR0cihSYW5nZSwgQ29udGV4dCwgcENTLCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlByYWdtYUNsYW5nQlNTU2VjdGlvbjogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHN0ZDo6c3RyaW5nIG5hbWU9IFJlY29yZC5yZWFkU3RyaW5nKCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBQcmFnbWFDbGFuZ0JTU1NlY3Rpb25BdHRyKFJhbmdlLCBDb250ZXh0LCBuYW1lLCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlByYWdtYUNsYW5nRGF0YVNlY3Rpb246IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lPSBSZWNvcmQucmVhZFN0cmluZygpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgUHJhZ21hQ2xhbmdEYXRhU2VjdGlvbkF0dHIoUmFuZ2UsIENvbnRleHQsIG5hbWUsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UHJhZ21hQ2xhbmdSb2RhdGFTZWN0aW9uOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgc3RkOjpzdHJpbmcgbmFtZT0gUmVjb3JkLnJlYWRTdHJpbmcoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFByYWdtYUNsYW5nUm9kYXRhU2VjdGlvbkF0dHIoUmFuZ2UsIENvbnRleHQsIG5hbWUsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UHJhZ21hQ2xhbmdUZXh0U2VjdGlvbjogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHN0ZDo6c3RyaW5nIG5hbWU9IFJlY29yZC5yZWFkU3RyaW5nKCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBQcmFnbWFDbGFuZ1RleHRTZWN0aW9uQXR0cihSYW5nZSwgQ29udGV4dCwgbmFtZSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpQcmVzZXJ2ZUFsbDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgUHJlc2VydmVBbGxBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlByZXNlcnZlTW9zdDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgUHJlc2VydmVNb3N0QXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpQdEd1YXJkZWRCeTogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIEV4cHIgKiBhcmcgPSBSZWNvcmQucmVhZEV4cHIoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFB0R3VhcmRlZEJ5QXR0cihSYW5nZSwgQ29udGV4dCwgYXJnLCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlB0R3VhcmRlZFZhcjogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgUHRHdWFyZGVkVmFyQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpQdXJlOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBQdXJlQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpSZWdDYWxsOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBSZWdDYWxsQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpSZWxlYXNlQ2FwYWJpbGl0eTogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIGFyZ3NTaXplID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBTbWFsbFZlY3RvcjxFeHByICosIDQ+IGFyZ3M7CisgICAgYXJncy5yZXNlcnZlKGFyZ3NTaXplKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IGFyZ3NTaXplOyArK2kpCisgICAgICBhcmdzLnB1c2hfYmFjayhSZWNvcmQucmVhZEV4cHIoKSk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBSZWxlYXNlQ2FwYWJpbGl0eUF0dHIoUmFuZ2UsIENvbnRleHQsIGFyZ3MuZGF0YSgpLCBhcmdzU2l6ZSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpSZW5kZXJTY3JpcHRLZXJuZWw6IHsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFJlbmRlclNjcmlwdEtlcm5lbEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UmVxZFdvcmtHcm91cFNpemU6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCB4RGltID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCB5RGltID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCB6RGltID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFJlcWRXb3JrR3JvdXBTaXplQXR0cihSYW5nZSwgQ29udGV4dCwgeERpbSwgeURpbSwgekRpbSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpSZXF1aXJlQ29uc3RhbnRJbml0OiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBSZXF1aXJlQ29uc3RhbnRJbml0QXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpSZXF1aXJlc0NhcGFiaWxpdHk6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBhcmdzU2l6ZSA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgU21hbGxWZWN0b3I8RXhwciAqLCA0PiBhcmdzOworICAgIGFyZ3MucmVzZXJ2ZShhcmdzU2l6ZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBhcmdzU2l6ZTsgKytpKQorICAgICAgYXJncy5wdXNoX2JhY2soUmVjb3JkLnJlYWRFeHByKCkpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgUmVxdWlyZXNDYXBhYmlsaXR5QXR0cihSYW5nZSwgQ29udGV4dCwgYXJncy5kYXRhKCksIGFyZ3NTaXplLCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlJlc3RyaWN0OiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBSZXN0cmljdEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UmV0dXJuVHlwZXN0YXRlOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgUmV0dXJuVHlwZXN0YXRlQXR0cjo6Q29uc3VtZWRTdGF0ZSBzdGF0ZShzdGF0aWNfY2FzdDxSZXR1cm5UeXBlc3RhdGVBdHRyOjpDb25zdW1lZFN0YXRlPihSZWNvcmQucmVhZEludCgpKSk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBSZXR1cm5UeXBlc3RhdGVBdHRyKFJhbmdlLCBDb250ZXh0LCBzdGF0ZSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpSZXR1cm5zTm9uTnVsbDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgUmV0dXJuc05vbk51bGxBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlJldHVybnNUd2ljZTogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgUmV0dXJuc1R3aWNlQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpTY29wZWRMb2NrYWJsZTogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgU2NvcGVkTG9ja2FibGVBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlNlY3Rpb246IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lPSBSZWNvcmQucmVhZFN0cmluZygpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgU2VjdGlvbkF0dHIoUmFuZ2UsIENvbnRleHQsIG5hbWUsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6U2VsZWN0QW55OiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBTZWxlY3RBbnlBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlNlbnRpbmVsOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgaW50IHNlbnRpbmVsID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBpbnQgbnVsbFBvcyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBTZW50aW5lbEF0dHIoUmFuZ2UsIENvbnRleHQsIHNlbnRpbmVsLCBudWxsUG9zLCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlNldFR5cGVzdGF0ZTogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIFNldFR5cGVzdGF0ZUF0dHI6OkNvbnN1bWVkU3RhdGUgbmV3U3RhdGUoc3RhdGljX2Nhc3Q8U2V0VHlwZXN0YXRlQXR0cjo6Q29uc3VtZWRTdGF0ZT4oUmVjb3JkLnJlYWRJbnQoKSkpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgU2V0VHlwZXN0YXRlQXR0cihSYW5nZSwgQ29udGV4dCwgbmV3U3RhdGUsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6U2hhcmVkVHJ5bG9ja0Z1bmN0aW9uOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgRXhwciAqIHN1Y2Nlc3NWYWx1ZSA9IFJlY29yZC5yZWFkRXhwcigpOworICAgIHVuc2lnbmVkIGFyZ3NTaXplID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBTbWFsbFZlY3RvcjxFeHByICosIDQ+IGFyZ3M7CisgICAgYXJncy5yZXNlcnZlKGFyZ3NTaXplKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IGFyZ3NTaXplOyArK2kpCisgICAgICBhcmdzLnB1c2hfYmFjayhSZWNvcmQucmVhZEV4cHIoKSk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBTaGFyZWRUcnlsb2NrRnVuY3Rpb25BdHRyKFJhbmdlLCBDb250ZXh0LCBzdWNjZXNzVmFsdWUsIGFyZ3MuZGF0YSgpLCBhcmdzU2l6ZSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpTdGRDYWxsOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBTdGRDYWxsQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpTdXBwcmVzczogeworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIGRpYWdub3N0aWNJZGVudGlmaWVyc1NpemUgPSBSZWNvcmQucmVhZEludCgpOworICAgIFNtYWxsVmVjdG9yPFN0cmluZ1JlZiwgND4gZGlhZ25vc3RpY0lkZW50aWZpZXJzOworICAgIGRpYWdub3N0aWNJZGVudGlmaWVycy5yZXNlcnZlKGRpYWdub3N0aWNJZGVudGlmaWVyc1NpemUpOworICAgIFNtYWxsVmVjdG9yPHN0ZDo6c3RyaW5nLCA0PiBkaWFnbm9zdGljSWRlbnRpZmllcnNTdG9yYWdlOworICAgIGRpYWdub3N0aWNJZGVudGlmaWVyc1N0b3JhZ2UucmVzZXJ2ZShkaWFnbm9zdGljSWRlbnRpZmllcnNTaXplKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IGRpYWdub3N0aWNJZGVudGlmaWVyc1NpemU7ICsraSkKKyAgICAgIGRpYWdub3N0aWNJZGVudGlmaWVyc1N0b3JhZ2UucHVzaF9iYWNrKFJlY29yZC5yZWFkU3RyaW5nKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gZGlhZ25vc3RpY0lkZW50aWZpZXJzU2l6ZTsgKytpKQorICAgICAgZGlhZ25vc3RpY0lkZW50aWZpZXJzLnB1c2hfYmFjayhkaWFnbm9zdGljSWRlbnRpZmllcnNTdG9yYWdlW2ldKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFN1cHByZXNzQXR0cihSYW5nZSwgQ29udGV4dCwgZGlhZ25vc3RpY0lkZW50aWZpZXJzLmRhdGEoKSwgZGlhZ25vc3RpY0lkZW50aWZpZXJzU2l6ZSwgU3BlbGxpbmcpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpTd2lmdENhbGw6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFN3aWZ0Q2FsbEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6U3dpZnRDb250ZXh0OiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBTd2lmdENvbnRleHRBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlN3aWZ0RXJyb3JSZXN1bHQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFN3aWZ0RXJyb3JSZXN1bHRBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlN3aWZ0SW5kaXJlY3RSZXN1bHQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFN3aWZ0SW5kaXJlY3RSZXN1bHRBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlN5c1ZBQkk6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFN5c1ZBQklBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlRMU01vZGVsOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgc3RkOjpzdHJpbmcgbW9kZWw9IFJlY29yZC5yZWFkU3RyaW5nKCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBUTFNNb2RlbEF0dHIoUmFuZ2UsIENvbnRleHQsIG1vZGVsLCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlRhcmdldDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHN0ZDo6c3RyaW5nIGZlYXR1cmVzU3RyPSBSZWNvcmQucmVhZFN0cmluZygpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgVGFyZ2V0QXR0cihSYW5nZSwgQ29udGV4dCwgZmVhdHVyZXNTdHIsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6VGVzdFR5cGVzdGF0ZTogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIFRlc3RUeXBlc3RhdGVBdHRyOjpDb25zdW1lZFN0YXRlIHRlc3RTdGF0ZShzdGF0aWNfY2FzdDxUZXN0VHlwZXN0YXRlQXR0cjo6Q29uc3VtZWRTdGF0ZT4oUmVjb3JkLnJlYWRJbnQoKSkpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgVGVzdFR5cGVzdGF0ZUF0dHIoUmFuZ2UsIENvbnRleHQsIHRlc3RTdGF0ZSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpUaGlzQ2FsbDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgVGhpc0NhbGxBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlRocmVhZDogeworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgVGhyZWFkQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpUcmFuc3BhcmVudFVuaW9uOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBUcmFuc3BhcmVudFVuaW9uQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpUcml2aWFsQUJJOiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBUcml2aWFsQUJJQXR0cihSYW5nZSwgQ29udGV4dCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpUcnlBY3F1aXJlQ2FwYWJpbGl0eTogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIEV4cHIgKiBzdWNjZXNzVmFsdWUgPSBSZWNvcmQucmVhZEV4cHIoKTsKKyAgICB1bnNpZ25lZCBhcmdzU2l6ZSA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgU21hbGxWZWN0b3I8RXhwciAqLCA0PiBhcmdzOworICAgIGFyZ3MucmVzZXJ2ZShhcmdzU2l6ZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBhcmdzU2l6ZTsgKytpKQorICAgICAgYXJncy5wdXNoX2JhY2soUmVjb3JkLnJlYWRFeHByKCkpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgVHJ5QWNxdWlyZUNhcGFiaWxpdHlBdHRyKFJhbmdlLCBDb250ZXh0LCBzdWNjZXNzVmFsdWUsIGFyZ3MuZGF0YSgpLCBhcmdzU2l6ZSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpUeXBlVGFnRm9yRGF0YXR5cGU6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBJZGVudGlmaWVySW5mbyAqIGFyZ3VtZW50S2luZCA9IFJlY29yZC5nZXRJZGVudGlmaWVySW5mbygpOworICAgIFR5cGVTb3VyY2VJbmZvICogbWF0Y2hpbmdDVHlwZSA9IFJlY29yZC5nZXRUeXBlU291cmNlSW5mbygpOworICAgIGJvb2wgbGF5b3V0Q29tcGF0aWJsZSA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBtdXN0QmVOdWxsID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFR5cGVUYWdGb3JEYXRhdHlwZUF0dHIoUmFuZ2UsIENvbnRleHQsIGFyZ3VtZW50S2luZCwgbWF0Y2hpbmdDVHlwZSwgbGF5b3V0Q29tcGF0aWJsZSwgbXVzdEJlTnVsbCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpUeXBlVmlzaWJpbGl0eTogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIFR5cGVWaXNpYmlsaXR5QXR0cjo6VmlzaWJpbGl0eVR5cGUgdmlzaWJpbGl0eShzdGF0aWNfY2FzdDxUeXBlVmlzaWJpbGl0eUF0dHI6OlZpc2liaWxpdHlUeXBlPihSZWNvcmQucmVhZEludCgpKSk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBUeXBlVmlzaWJpbGl0eUF0dHIoUmFuZ2UsIENvbnRleHQsIHZpc2liaWxpdHksIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6VW5hdmFpbGFibGU6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBzdGQ6OnN0cmluZyBtZXNzYWdlPSBSZWNvcmQucmVhZFN0cmluZygpOworICAgIFVuYXZhaWxhYmxlQXR0cjo6SW1wbGljaXRSZWFzb24gaW1wbGljaXRSZWFzb24oc3RhdGljX2Nhc3Q8VW5hdmFpbGFibGVBdHRyOjpJbXBsaWNpdFJlYXNvbj4oUmVjb3JkLnJlYWRJbnQoKSkpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgVW5hdmFpbGFibGVBdHRyKFJhbmdlLCBDb250ZXh0LCBtZXNzYWdlLCBpbXBsaWNpdFJlYXNvbiwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpVbnVzZWQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFVudXNlZEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6VXNlZDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgVXNlZEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6VXVpZDogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIHN0ZDo6c3RyaW5nIGd1aWQ9IFJlY29yZC5yZWFkU3RyaW5nKCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBVdWlkQXR0cihSYW5nZSwgQ29udGV4dCwgZ3VpZCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpWZWNSZXR1cm46IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFZlY1JldHVybkF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6VmVjVHlwZUhpbnQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBUeXBlU291cmNlSW5mbyAqIHR5cGVIaW50ID0gUmVjb3JkLmdldFR5cGVTb3VyY2VJbmZvKCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBWZWNUeXBlSGludEF0dHIoUmFuZ2UsIENvbnRleHQsIHR5cGVIaW50LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlZlY3RvckNhbGw6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFZlY3RvckNhbGxBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlZpc2liaWxpdHk6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBWaXNpYmlsaXR5QXR0cjo6VmlzaWJpbGl0eVR5cGUgdmlzaWJpbGl0eShzdGF0aWNfY2FzdDxWaXNpYmlsaXR5QXR0cjo6VmlzaWJpbGl0eVR5cGU+KFJlY29yZC5yZWFkSW50KCkpKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFZpc2liaWxpdHlBdHRyKFJhbmdlLCBDb250ZXh0LCB2aXNpYmlsaXR5LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Oldhcm5VbnVzZWQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFdhcm5VbnVzZWRBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Oldhcm5VbnVzZWRSZXN1bHQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFdhcm5VbnVzZWRSZXN1bHRBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OldlYWs6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFdlYWtBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OldlYWtJbXBvcnQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFdlYWtJbXBvcnRBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OldlYWtSZWY6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBzdGQ6OnN0cmluZyBhbGlhc2VlPSBSZWNvcmQucmVhZFN0cmluZygpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgV2Vha1JlZkF0dHIoUmFuZ2UsIENvbnRleHQsIGFsaWFzZWUsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6V29ya0dyb3VwU2l6ZUhpbnQ6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCB4RGltID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCB5RGltID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCB6RGltID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFdvcmtHcm91cFNpemVIaW50QXR0cihSYW5nZSwgQ29udGV4dCwgeERpbSwgeURpbSwgekRpbSwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpYODZGb3JjZUFsaWduQXJnUG9pbnRlcjogeworICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmQucmVhZEludCgpOworICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmQucmVhZEludCgpOworICAgIE5ldyA9IG5ldyAoQ29udGV4dCkgWDg2Rm9yY2VBbGlnbkFyZ1BvaW50ZXJBdHRyKFJhbmdlLCBDb250ZXh0LCBTcGVsbGluZyk7CisgICAgY2FzdDxJbmhlcml0YWJsZUF0dHI+KE5ldyktPnNldEluaGVyaXRlZChpc0luaGVyaXRlZCk7CisgICAgTmV3LT5zZXRJbXBsaWNpdChpc0ltcGxpY2l0KTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlhSYXlJbnN0cnVtZW50OiB7CisgICAgYm9vbCBpc0luaGVyaXRlZCA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgYm9vbCBpc0ltcGxpY2l0ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBTcGVsbGluZyA9IFJlY29yZC5yZWFkSW50KCk7CisgICAgTmV3ID0gbmV3IChDb250ZXh0KSBYUmF5SW5zdHJ1bWVudEF0dHIoUmFuZ2UsIENvbnRleHQsIFNwZWxsaW5nKTsKKyAgICBjYXN0PEluaGVyaXRhYmxlQXR0cj4oTmV3KS0+c2V0SW5oZXJpdGVkKGlzSW5oZXJpdGVkKTsKKyAgICBOZXctPnNldEltcGxpY2l0KGlzSW1wbGljaXQpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6WFJheUxvZ0FyZ3M6IHsKKyAgICBib29sIGlzSW5oZXJpdGVkID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBib29sIGlzSW1wbGljaXQgPSBSZWNvcmQucmVhZEludCgpOworICAgIHVuc2lnbmVkIFNwZWxsaW5nID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICB1bnNpZ25lZCBhcmd1bWVudENvdW50ID0gUmVjb3JkLnJlYWRJbnQoKTsKKyAgICBOZXcgPSBuZXcgKENvbnRleHQpIFhSYXlMb2dBcmdzQXR0cihSYW5nZSwgQ29udGV4dCwgYXJndW1lbnRDb3VudCwgU3BlbGxpbmcpOworICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpOworICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7CisgICAgYnJlYWs7CisgIH0KKyAgfQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9BdHRyUENIV3JpdGUuaW5jIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9BdHRyUENIV3JpdGUuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NWU5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL0F0dHJQQ0hXcml0ZS5pbmMKQEAgLTAsMCArMSwxNzgwIEBACisvKj09PS0gVGFibGVHZW4nZXJhdGVkIGZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIEF0dHJpYnV0ZSBzZXJpYWxpemF0aW9uIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZSwgZG8gbm90IGVkaXQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisgIHN3aXRjaCAoQS0+Z2V0S2luZCgpKSB7CisgIGNhc2UgYXR0cjo6QU1ER1BVRmxhdFdvcmtHcm91cFNpemU6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QU1ER1BVRmxhdFdvcmtHcm91cFNpemVBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRNaW4oKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0TWF4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QU1ER1BVTnVtU0dQUjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBTURHUFVOdW1TR1BSQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0TnVtU0dQUigpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFNREdQVU51bVZHUFI6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QU1ER1BVTnVtVkdQUkF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmdldE51bVZHUFIoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBTURHUFVXYXZlc1BlckVVOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEFNREdQVVdhdmVzUGVyRVVBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRNaW4oKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0TWF4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QVJNSW50ZXJydXB0OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEFSTUludGVycnVwdEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0SW50ZXJydXB0KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QVZSSW50ZXJydXB0OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEFWUkludGVycnVwdEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QVZSU2lnbmFsOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEFWUlNpZ25hbEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QWJpVGFnOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEFiaVRhZ0F0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPnRhZ3Nfc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8gJlZhbCA6IFNBLT50YWdzKCkpCisgICAgICBSZWNvcmQuQWRkU3RyaW5nKFZhbCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBY3F1aXJlQ2FwYWJpbGl0eTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBY3F1aXJlQ2FwYWJpbGl0eUF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmFyZ3Nfc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8gJlZhbCA6IFNBLT5hcmdzKCkpCisgICAgICBSZWNvcmQuQWRkU3RtdChWYWwpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QWNxdWlyZWRBZnRlcjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBY3F1aXJlZEFmdGVyQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+YXJnc19zaXplKCkpOworICAgIGZvciAoYXV0byAmVmFsIDogU0EtPmFyZ3MoKSkKKyAgICAgIFJlY29yZC5BZGRTdG10KFZhbCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBY3F1aXJlZEJlZm9yZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBY3F1aXJlZEJlZm9yZUF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmFyZ3Nfc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8gJlZhbCA6IFNBLT5hcmdzKCkpCisgICAgICBSZWNvcmQuQWRkU3RtdChWYWwpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QWxpYXM6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QWxpYXNBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQuQWRkU3RyaW5nKFNBLT5nZXRBbGlhc2VlKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QWxpZ25NYWM2OGs6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QWxpZ25NYWM2OGtBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFsaWduVmFsdWU6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QWxpZ25WYWx1ZUF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5BZGRTdG10KFNBLT5nZXRBbGlnbm1lbnQoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBbGlnbmVkOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEFsaWduZWRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0FsaWdubWVudEV4cHIoKSk7CisgICAgaWYgKFNBLT5pc0FsaWdubWVudEV4cHIoKSkKKyAgICAgIFJlY29yZC5BZGRTdG10KFNBLT5nZXRBbGlnbm1lbnRFeHByKCkpOworICAgIGVsc2UKKyAgICAgIFJlY29yZC5BZGRUeXBlU291cmNlSW5mbyhTQS0+Z2V0QWxpZ25tZW50VHlwZSgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFsbG9jQWxpZ246IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QWxsb2NBbGlnbkF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmdldFBhcmFtSW5kZXgoKS5zZXJpYWxpemUoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBbGxvY1NpemU6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QWxsb2NTaXplQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0RWxlbVNpemVQYXJhbSgpLnNlcmlhbGl6ZSgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXROdW1FbGVtc1BhcmFtKCkuc2VyaWFsaXplKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QWx3YXlzSW5saW5lOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEFsd2F5c0lubGluZUF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QW5hbHl6ZXJOb1JldHVybjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBbmFseXplck5vUmV0dXJuQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBbm5vdGF0ZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBbm5vdGF0ZUF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5BZGRTdHJpbmcoU0EtPmdldEFubm90YXRpb24oKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBbnlYODZJbnRlcnJ1cHQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QW55WDg2SW50ZXJydXB0QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBbnlYODZOb0NhbGxlclNhdmVkUmVnaXN0ZXJzOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEFueVg4Nk5vQ2FsbGVyU2F2ZWRSZWdpc3RlcnNBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFueVg4Nk5vQ2ZDaGVjazogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBbnlYODZOb0NmQ2hlY2tBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFyY1dlYWtyZWZVbmF2YWlsYWJsZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBcmNXZWFrcmVmVW5hdmFpbGFibGVBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFyZ3VtZW50V2l0aFR5cGVUYWc6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QXJndW1lbnRXaXRoVHlwZVRhZ0F0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5BZGRJZGVudGlmaWVyUmVmKFNBLT5nZXRBcmd1bWVudEtpbmQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0QXJndW1lbnRJZHgoKS5zZXJpYWxpemUoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0VHlwZVRhZ0lkeCgpLnNlcmlhbGl6ZSgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRJc1BvaW50ZXIoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBcnRpZmljaWFsOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEFydGlmaWNpYWxBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFzbUxhYmVsOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEFzbUxhYmVsQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLkFkZFN0cmluZyhTQS0+Z2V0TGFiZWwoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBc3NlcnRDYXBhYmlsaXR5OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEFzc2VydENhcGFiaWxpdHlBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5hcmdzX3NpemUoKSk7CisgICAgZm9yIChhdXRvICZWYWwgOiBTQS0+YXJncygpKQorICAgICAgUmVjb3JkLkFkZFN0bXQoVmFsKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkFzc2VydEV4Y2x1c2l2ZUxvY2s6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QXNzZXJ0RXhjbHVzaXZlTG9ja0F0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmFyZ3Nfc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8gJlZhbCA6IFNBLT5hcmdzKCkpCisgICAgICBSZWNvcmQuQWRkU3RtdChWYWwpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QXNzZXJ0U2hhcmVkTG9jazogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxBc3NlcnRTaGFyZWRMb2NrQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+YXJnc19zaXplKCkpOworICAgIGZvciAoYXV0byAmVmFsIDogU0EtPmFyZ3MoKSkKKyAgICAgIFJlY29yZC5BZGRTdG10KFZhbCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBc3N1bWVBbGlnbmVkOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEFzc3VtZUFsaWduZWRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQuQWRkU3RtdChTQS0+Z2V0QWxpZ25tZW50KCkpOworICAgIFJlY29yZC5BZGRTdG10KFNBLT5nZXRPZmZzZXQoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpBdmFpbGFiaWxpdHk6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QXZhaWxhYmlsaXR5QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLkFkZElkZW50aWZpZXJSZWYoU0EtPmdldFBsYXRmb3JtKCkpOworICAgIFJlY29yZC5BZGRWZXJzaW9uVHVwbGUoU0EtPmdldEludHJvZHVjZWQoKSk7CisgICAgUmVjb3JkLkFkZFZlcnNpb25UdXBsZShTQS0+Z2V0RGVwcmVjYXRlZCgpKTsKKyAgICBSZWNvcmQuQWRkVmVyc2lvblR1cGxlKFNBLT5nZXRPYnNvbGV0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0VW5hdmFpbGFibGUoKSk7CisgICAgUmVjb3JkLkFkZFN0cmluZyhTQS0+Z2V0TWVzc2FnZSgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRTdHJpY3QoKSk7CisgICAgUmVjb3JkLkFkZFN0cmluZyhTQS0+Z2V0UmVwbGFjZW1lbnQoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpCbG9ja3M6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QmxvY2tzQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CitSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRUeXBlKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6QzExTm9SZXR1cm46IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8QzExTm9SZXR1cm5BdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNEZWNsOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PENEZWNsQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDRkF1ZGl0ZWRUcmFuc2ZlcjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxDRkF1ZGl0ZWRUcmFuc2ZlckF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q0ZDb25zdW1lZDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxDRkNvbnN1bWVkQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDRlJldHVybnNOb3RSZXRhaW5lZDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxDRlJldHVybnNOb3RSZXRhaW5lZEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q0ZSZXR1cm5zUmV0YWluZWQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8Q0ZSZXR1cm5zUmV0YWluZWRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNGVW5rbm93blRyYW5zZmVyOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PENGVW5rbm93blRyYW5zZmVyQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDVURBQ29uc3RhbnQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8Q1VEQUNvbnN0YW50QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDVURBRGV2aWNlOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PENVREFEZXZpY2VBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNVREFHbG9iYWw6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8Q1VEQUdsb2JhbEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q1VEQUhvc3Q6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8Q1VEQUhvc3RBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNVREFJbnZhbGlkVGFyZ2V0OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PENVREFJbnZhbGlkVGFyZ2V0QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDVURBTGF1bmNoQm91bmRzOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PENVREFMYXVuY2hCb3VuZHNBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQuQWRkU3RtdChTQS0+Z2V0TWF4VGhyZWFkcygpKTsKKyAgICBSZWNvcmQuQWRkU3RtdChTQS0+Z2V0TWluQmxvY2tzKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q1VEQVNoYXJlZDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxDVURBU2hhcmVkQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDWFgxMU5vUmV0dXJuOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PENYWDExTm9SZXR1cm5BdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNhbGxhYmxlV2hlbjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxDYWxsYWJsZVdoZW5BdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5jYWxsYWJsZVN0YXRlc19zaXplKCkpOworICAgIGZvciAoQ2FsbGFibGVXaGVuQXR0cjo6Y2FsbGFibGVTdGF0ZXNfaXRlcmF0b3IgaSA9IFNBLT5jYWxsYWJsZVN0YXRlc19iZWdpbigpLCBlID0gU0EtPmNhbGxhYmxlU3RhdGVzX2VuZCgpOyBpICE9IGU7ICsraSkKKyAgICAgIFJlY29yZC5wdXNoX2JhY2soKCppKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDYXBhYmlsaXR5OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PENhcGFiaWxpdHlBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQuQWRkU3RyaW5nKFNBLT5nZXROYW1lKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q2FwdHVyZWRSZWNvcmQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8Q2FwdHVyZWRSZWNvcmRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNhcnJpZXNEZXBlbmRlbmN5OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PENhcnJpZXNEZXBlbmRlbmN5QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDbGVhbnVwOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PENsZWFudXBBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQuQWRkRGVjbFJlZihTQS0+Z2V0RnVuY3Rpb25EZWNsKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q29sZDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxDb2xkQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDb21tb246IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8Q29tbW9uQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDb25zdDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxDb25zdEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q29uc3RydWN0b3I6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8Q29uc3RydWN0b3JBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRQcmlvcml0eSgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkNvbnN1bWFibGU6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8Q29uc3VtYWJsZUF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0RGVmYXVsdFN0YXRlKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q29uc3VtYWJsZUF1dG9DYXN0OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PENvbnN1bWFibGVBdXRvQ2FzdEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Q29uc3VtYWJsZVNldE9uUmVhZDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxDb25zdW1hYmxlU2V0T25SZWFkQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpDb252ZXJnZW50OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PENvbnZlcmdlbnRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkRMTEV4cG9ydDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxETExFeHBvcnRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkRMTEltcG9ydDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxETExJbXBvcnRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkRlcHJlY2F0ZWQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8RGVwcmVjYXRlZEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5BZGRTdHJpbmcoU0EtPmdldE1lc3NhZ2UoKSk7CisgICAgUmVjb3JkLkFkZFN0cmluZyhTQS0+Z2V0UmVwbGFjZW1lbnQoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpEZXN0cnVjdG9yOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PERlc3RydWN0b3JBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRQcmlvcml0eSgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkRpYWdub3NlSWY6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8RGlhZ25vc2VJZkF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5BZGRTdG10KFNBLT5nZXRDb25kKCkpOworICAgIFJlY29yZC5BZGRTdHJpbmcoU0EtPmdldE1lc3NhZ2UoKSk7CitSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXREaWFnbm9zdGljVHlwZSgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRBcmdEZXBlbmRlbnQoKSk7CisgICAgUmVjb3JkLkFkZERlY2xSZWYoU0EtPmdldFBhcmVudCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkRpc2FibGVUYWlsQ2FsbHM6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8RGlzYWJsZVRhaWxDYWxsc0F0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6RW1wdHlCYXNlczogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxFbXB0eUJhc2VzQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpFbmFibGVJZjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxFbmFibGVJZkF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5BZGRTdG10KFNBLT5nZXRDb25kKCkpOworICAgIFJlY29yZC5BZGRTdHJpbmcoU0EtPmdldE1lc3NhZ2UoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpFbnVtRXh0ZW5zaWJpbGl0eTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxFbnVtRXh0ZW5zaWJpbGl0eUF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0RXh0ZW5zaWJpbGl0eSgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkV4Y2x1c2l2ZVRyeWxvY2tGdW5jdGlvbjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb25BdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQuQWRkU3RtdChTQS0+Z2V0U3VjY2Vzc1ZhbHVlKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmFyZ3Nfc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8gJlZhbCA6IFNBLT5hcmdzKCkpCisgICAgICBSZWNvcmQuQWRkU3RtdChWYWwpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6RXh0ZXJuYWxTb3VyY2VTeW1ib2w6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8RXh0ZXJuYWxTb3VyY2VTeW1ib2xBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQuQWRkU3RyaW5nKFNBLT5nZXRMYW5ndWFnZSgpKTsKKyAgICBSZWNvcmQuQWRkU3RyaW5nKFNBLT5nZXREZWZpbmVkSW4oKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0R2VuZXJhdGVkRGVjbGFyYXRpb24oKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpGYWxsVGhyb3VnaDogeworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6RmFzdENhbGw6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8RmFzdENhbGxBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkZpbmFsOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEZpbmFsQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpGbGFnRW51bTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxGbGFnRW51bUF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6RmxhdHRlbjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxGbGF0dGVuQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpGb3JtYXQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8Rm9ybWF0QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLkFkZElkZW50aWZpZXJSZWYoU0EtPmdldFR5cGUoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0Rm9ybWF0SWR4KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmdldEZpcnN0QXJnKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Rm9ybWF0QXJnOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEZvcm1hdEFyZ0F0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmdldEZvcm1hdElkeCgpLnNlcmlhbGl6ZSgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OkdOVUlubGluZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxHTlVJbmxpbmVBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Okd1YXJkZWRCeTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxHdWFyZGVkQnlBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQuQWRkU3RtdChTQS0+Z2V0QXJnKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6R3VhcmRlZFZhcjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxHdWFyZGVkVmFyQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpIb3Q6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8SG90QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpJQkFjdGlvbjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxJQkFjdGlvbkF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6SUJPdXRsZXQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8SUJPdXRsZXRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OklCT3V0bGV0Q29sbGVjdGlvbjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxJQk91dGxldENvbGxlY3Rpb25BdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQuQWRkVHlwZVNvdXJjZUluZm8oU0EtPmdldEludGVyZmFjZUxvYygpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OklGdW5jOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PElGdW5jQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLkFkZFN0cmluZyhTQS0+Z2V0UmVzb2x2ZXIoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpJbml0UHJpb3JpdHk6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8SW5pdFByaW9yaXR5QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0UHJpb3JpdHkoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpJbml0U2VnOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEluaXRTZWdBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQuQWRkU3RyaW5nKFNBLT5nZXRTZWN0aW9uKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6SW50ZWxPY2xCaWNjOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEludGVsT2NsQmljY0F0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6SW50ZXJuYWxMaW5rYWdlOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PEludGVybmFsTGlua2FnZUF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TFRPVmlzaWJpbGl0eVB1YmxpYzogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxMVE9WaXNpYmlsaXR5UHVibGljQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpMYXlvdXRWZXJzaW9uOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PExheW91dFZlcnNpb25BdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRWZXJzaW9uKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TG9ja1JldHVybmVkOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PExvY2tSZXR1cm5lZEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5BZGRTdG10KFNBLT5nZXRBcmcoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpMb2Nrc0V4Y2x1ZGVkOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PExvY2tzRXhjbHVkZWRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5hcmdzX3NpemUoKSk7CisgICAgZm9yIChhdXRvICZWYWwgOiBTQS0+YXJncygpKQorICAgICAgUmVjb3JkLkFkZFN0bXQoVmFsKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Okxvb3BIaW50OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PExvb3BIaW50QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CitSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRPcHRpb24oKSk7CitSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRTdGF0ZSgpKTsKKyAgICBSZWNvcmQuQWRkU3RtdChTQS0+Z2V0VmFsdWUoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpNU0FCSTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxNU0FCSUF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TVNJbmhlcml0YW5jZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxNU0luaGVyaXRhbmNlQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0QmVzdENhc2UoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpNU05vVlRhYmxlOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE1TTm9WVGFibGVBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok1TUDQzMEludGVycnVwdDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxNU1A0MzBJbnRlcnJ1cHRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXROdW1iZXIoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpNU1N0cnVjdDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxNU1N0cnVjdEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TVNWdG9yRGlzcDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxNU1Z0b3JEaXNwQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0VmRtKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TWF4RmllbGRBbGlnbm1lbnQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8TWF4RmllbGRBbGlnbm1lbnRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRBbGlnbm1lbnQoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpNYXlBbGlhczogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxNYXlBbGlhc0F0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TWljcm9NaXBzOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE1pY3JvTWlwc0F0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TWluU2l6ZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxNaW5TaXplQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpNaXBzMTY6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8TWlwczE2QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpNaXBzSW50ZXJydXB0OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE1pcHNJbnRlcnJ1cHRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKK1JlY29yZC5wdXNoX2JhY2soU0EtPmdldEludGVycnVwdCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok1pcHNMb25nQ2FsbDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxNaXBzTG9uZ0NhbGxBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok1pcHNTaG9ydENhbGw6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8TWlwc1Nob3J0Q2FsbEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TW9kZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxNb2RlQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLkFkZElkZW50aWZpZXJSZWYoU0EtPmdldE1vZGUoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOU0NvbnN1bWVkOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE5TQ29uc3VtZWRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5TQ29uc3VtZXNTZWxmOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE5TQ29uc3VtZXNTZWxmQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOU1JldHVybnNBdXRvcmVsZWFzZWQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8TlNSZXR1cm5zQXV0b3JlbGVhc2VkQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOU1JldHVybnNOb3RSZXRhaW5lZDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxOU1JldHVybnNOb3RSZXRhaW5lZEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6TlNSZXR1cm5zUmV0YWluZWQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8TlNSZXR1cm5zUmV0YWluZWRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5ha2VkOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE5ha2VkQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb0FsaWFzOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE5vQWxpYXNBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5vQ29tbW9uOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE5vQ29tbW9uQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb0RlYnVnOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE5vRGVidWdBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5vRHVwbGljYXRlOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE5vRHVwbGljYXRlQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb0VzY2FwZTogeworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Tm9JbmxpbmU6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8Tm9JbmxpbmVBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5vSW5zdHJ1bWVudEZ1bmN0aW9uOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE5vSW5zdHJ1bWVudEZ1bmN0aW9uQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb01pY3JvTWlwczogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxOb01pY3JvTWlwc0F0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Tm9NaXBzMTY6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8Tm9NaXBzMTZBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5vUmV0dXJuOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE5vUmV0dXJuQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb1Nhbml0aXplOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE5vU2FuaXRpemVBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5zYW5pdGl6ZXJzX3NpemUoKSk7CisgICAgZm9yIChhdXRvICZWYWwgOiBTQS0+c2FuaXRpemVycygpKQorICAgICAgUmVjb3JkLkFkZFN0cmluZyhWYWwpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Tm9TcGxpdFN0YWNrOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE5vU3BsaXRTdGFja0F0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6Tm9UaHJlYWRTYWZldHlBbmFseXNpczogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxOb1RocmVhZFNhZmV0eUFuYWx5c2lzQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb1Rocm93OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE5vVGhyb3dBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok5vbk51bGw6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8Tm9uTnVsbEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmFyZ3Nfc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8gJlZhbCA6IFNBLT5hcmdzKCkpCisgICAgICBSZWNvcmQucHVzaF9iYWNrKFZhbC5zZXJpYWxpemUoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpOb3RUYWlsQ2FsbGVkOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE5vdFRhaWxDYWxsZWRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9NUENhcHR1cmVLaW5kOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE9NUENhcHR1cmVLaW5kQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0Q2FwdHVyZUtpbmQoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPTVBDYXB0dXJlTm9Jbml0OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE9NUENhcHR1cmVOb0luaXRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9NUERlY2xhcmVTaW1kRGVjbDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxPTVBEZWNsYXJlU2ltZERlY2xBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKK1JlY29yZC5wdXNoX2JhY2soU0EtPmdldEJyYW5jaFN0YXRlKCkpOworICAgIFJlY29yZC5BZGRTdG10KFNBLT5nZXRTaW1kbGVuKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPnVuaWZvcm1zX3NpemUoKSk7CisgICAgZm9yIChhdXRvICZWYWwgOiBTQS0+dW5pZm9ybXMoKSkKKyAgICAgIFJlY29yZC5BZGRTdG10KFZhbCk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+YWxpZ25lZHNfc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8gJlZhbCA6IFNBLT5hbGlnbmVkcygpKQorICAgICAgUmVjb3JkLkFkZFN0bXQoVmFsKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5hbGlnbm1lbnRzX3NpemUoKSk7CisgICAgZm9yIChhdXRvICZWYWwgOiBTQS0+YWxpZ25tZW50cygpKQorICAgICAgUmVjb3JkLkFkZFN0bXQoVmFsKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5saW5lYXJzX3NpemUoKSk7CisgICAgZm9yIChhdXRvICZWYWwgOiBTQS0+bGluZWFycygpKQorICAgICAgUmVjb3JkLkFkZFN0bXQoVmFsKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5tb2RpZmllcnNfc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8gJlZhbCA6IFNBLT5tb2RpZmllcnMoKSkKKyAgICAgIFJlY29yZC5wdXNoX2JhY2soVmFsKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5zdGVwc19zaXplKCkpOworICAgIGZvciAoYXV0byAmVmFsIDogU0EtPnN0ZXBzKCkpCisgICAgICBSZWNvcmQuQWRkU3RtdChWYWwpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T01QRGVjbGFyZVRhcmdldERlY2w6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8T01QRGVjbGFyZVRhcmdldERlY2xBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKK1JlY29yZC5wdXNoX2JhY2soU0EtPmdldE1hcFR5cGUoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPTVBSZWZlcmVuY2VkVmFyOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE9NUFJlZmVyZW5jZWRWYXJBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQuQWRkU3RtdChTQS0+Z2V0UmVmKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T01QVGhyZWFkUHJpdmF0ZURlY2w6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8T01QVGhyZWFkUHJpdmF0ZURlY2xBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNCb3hhYmxlOiB7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDQnJpZGdlOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE9iakNCcmlkZ2VBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQuQWRkSWRlbnRpZmllclJlZihTQS0+Z2V0QnJpZGdlZFR5cGUoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDQnJpZGdlTXV0YWJsZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxPYmpDQnJpZGdlTXV0YWJsZUF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5BZGRJZGVudGlmaWVyUmVmKFNBLT5nZXRCcmlkZ2VkVHlwZSgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNCcmlkZ2VSZWxhdGVkOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE9iakNCcmlkZ2VSZWxhdGVkQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLkFkZElkZW50aWZpZXJSZWYoU0EtPmdldFJlbGF0ZWRDbGFzcygpKTsKKyAgICBSZWNvcmQuQWRkSWRlbnRpZmllclJlZihTQS0+Z2V0Q2xhc3NNZXRob2QoKSk7CisgICAgUmVjb3JkLkFkZElkZW50aWZpZXJSZWYoU0EtPmdldEluc3RhbmNlTWV0aG9kKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T2JqQ0Rlc2lnbmF0ZWRJbml0aWFsaXplcjogeworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T2JqQ0V4Y2VwdGlvbjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxPYmpDRXhjZXB0aW9uQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDRXhwbGljaXRQcm90b2NvbEltcGw6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8T2JqQ0V4cGxpY2l0UHJvdG9jb2xJbXBsQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDSW5kZXBlbmRlbnRDbGFzczogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxPYmpDSW5kZXBlbmRlbnRDbGFzc0F0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T2JqQ01ldGhvZEZhbWlseTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxPYmpDTWV0aG9kRmFtaWx5QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CitSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRGYW1pbHkoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDTlNPYmplY3Q6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8T2JqQ05TT2JqZWN0QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDUHJlY2lzZUxpZmV0aW1lOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE9iakNQcmVjaXNlTGlmZXRpbWVBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNSZXF1aXJlc1Byb3BlcnR5RGVmczogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxPYmpDUmVxdWlyZXNQcm9wZXJ0eURlZnNBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9iakNSZXF1aXJlc1N1cGVyOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE9iakNSZXF1aXJlc1N1cGVyQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDUmV0dXJuc0lubmVyUG9pbnRlcjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxPYmpDUmV0dXJuc0lubmVyUG9pbnRlckF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T2JqQ1Jvb3RDbGFzczogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxPYmpDUm9vdENsYXNzQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDUnVudGltZU5hbWU6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8T2JqQ1J1bnRpbWVOYW1lQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLkFkZFN0cmluZyhTQS0+Z2V0TWV0YWRhdGFOYW1lKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T2JqQ1J1bnRpbWVWaXNpYmxlOiB7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPYmpDU3ViY2xhc3NpbmdSZXN0cmljdGVkOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE9iakNTdWJjbGFzc2luZ1Jlc3RyaWN0ZWRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9wZW5DTEFjY2VzczogeworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6T3BlbkNMSW50ZWxSZXFkU3ViR3JvdXBTaXplOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE9wZW5DTEludGVsUmVxZFN1Ykdyb3VwU2l6ZUF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmdldFN1Ykdyb3VwU2l6ZSgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9wZW5DTEtlcm5lbDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxPcGVuQ0xLZXJuZWxBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok9wZW5DTFVucm9sbEhpbnQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8T3BlbkNMVW5yb2xsSGludEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmdldFVucm9sbEhpbnQoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPcHRpbWl6ZU5vbmU6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8T3B0aW1pemVOb25lQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPdmVybG9hZGFibGU6IHsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Ok92ZXJyaWRlOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PE92ZXJyaWRlQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpPd25lcnNoaXA6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8T3duZXJzaGlwQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLkFkZElkZW50aWZpZXJSZWYoU0EtPmdldE1vZHVsZSgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5hcmdzX3NpemUoKSk7CisgICAgZm9yIChhdXRvICZWYWwgOiBTQS0+YXJncygpKQorICAgICAgUmVjb3JkLnB1c2hfYmFjayhWYWwuc2VyaWFsaXplKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UGFja2VkOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFBhY2tlZEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UGFyYW1UeXBlc3RhdGU6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8UGFyYW1UeXBlc3RhdGVBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKK1JlY29yZC5wdXNoX2JhY2soU0EtPmdldFBhcmFtU3RhdGUoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpQYXNjYWw6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8UGFzY2FsQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpQYXNzT2JqZWN0U2l6ZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxQYXNzT2JqZWN0U2l6ZUF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmdldFR5cGUoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpQY3M6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8UGNzQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CitSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRQQ1MoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpQcmFnbWFDbGFuZ0JTU1NlY3Rpb246IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8UHJhZ21hQ2xhbmdCU1NTZWN0aW9uQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLkFkZFN0cmluZyhTQS0+Z2V0TmFtZSgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlByYWdtYUNsYW5nRGF0YVNlY3Rpb246IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8UHJhZ21hQ2xhbmdEYXRhU2VjdGlvbkF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5BZGRTdHJpbmcoU0EtPmdldE5hbWUoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpQcmFnbWFDbGFuZ1JvZGF0YVNlY3Rpb246IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8UHJhZ21hQ2xhbmdSb2RhdGFTZWN0aW9uQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLkFkZFN0cmluZyhTQS0+Z2V0TmFtZSgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlByYWdtYUNsYW5nVGV4dFNlY3Rpb246IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8UHJhZ21hQ2xhbmdUZXh0U2VjdGlvbkF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5BZGRTdHJpbmcoU0EtPmdldE5hbWUoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpQcmVzZXJ2ZUFsbDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxQcmVzZXJ2ZUFsbEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UHJlc2VydmVNb3N0OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFByZXNlcnZlTW9zdEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UHRHdWFyZGVkQnk6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8UHRHdWFyZGVkQnlBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQuQWRkU3RtdChTQS0+Z2V0QXJnKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UHRHdWFyZGVkVmFyOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFB0R3VhcmRlZFZhckF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6UHVyZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxQdXJlQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpSZWdDYWxsOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFJlZ0NhbGxBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlJlbGVhc2VDYXBhYmlsaXR5OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFJlbGVhc2VDYXBhYmlsaXR5QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+YXJnc19zaXplKCkpOworICAgIGZvciAoYXV0byAmVmFsIDogU0EtPmFyZ3MoKSkKKyAgICAgIFJlY29yZC5BZGRTdG10KFZhbCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpSZW5kZXJTY3JpcHRLZXJuZWw6IHsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlJlcWRXb3JrR3JvdXBTaXplOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFJlcWRXb3JrR3JvdXBTaXplQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0WERpbSgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRZRGltKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmdldFpEaW0oKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpSZXF1aXJlQ29uc3RhbnRJbml0OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFJlcXVpcmVDb25zdGFudEluaXRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlJlcXVpcmVzQ2FwYWJpbGl0eTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxSZXF1aXJlc0NhcGFiaWxpdHlBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5hcmdzX3NpemUoKSk7CisgICAgZm9yIChhdXRvICZWYWwgOiBTQS0+YXJncygpKQorICAgICAgUmVjb3JkLkFkZFN0bXQoVmFsKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlJlc3RyaWN0OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFJlc3RyaWN0QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpSZXR1cm5UeXBlc3RhdGU6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8UmV0dXJuVHlwZXN0YXRlQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CitSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRTdGF0ZSgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlJldHVybnNOb25OdWxsOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFJldHVybnNOb25OdWxsQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpSZXR1cm5zVHdpY2U6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8UmV0dXJuc1R3aWNlQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpTY29wZWRMb2NrYWJsZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxTY29wZWRMb2NrYWJsZUF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6U2VjdGlvbjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxTZWN0aW9uQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLkFkZFN0cmluZyhTQS0+Z2V0TmFtZSgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlNlbGVjdEFueTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxTZWxlY3RBbnlBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlNlbnRpbmVsOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFNlbnRpbmVsQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0U2VudGluZWwoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0TnVsbFBvcygpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlNldFR5cGVzdGF0ZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxTZXRUeXBlc3RhdGVBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKK1JlY29yZC5wdXNoX2JhY2soU0EtPmdldE5ld1N0YXRlKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6U2hhcmVkVHJ5bG9ja0Z1bmN0aW9uOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFNoYXJlZFRyeWxvY2tGdW5jdGlvbkF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5BZGRTdG10KFNBLT5nZXRTdWNjZXNzVmFsdWUoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+YXJnc19zaXplKCkpOworICAgIGZvciAoYXV0byAmVmFsIDogU0EtPmFyZ3MoKSkKKyAgICAgIFJlY29yZC5BZGRTdG10KFZhbCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpTdGRDYWxsOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFN0ZENhbGxBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlN1cHByZXNzOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFN1cHByZXNzQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+ZGlhZ25vc3RpY0lkZW50aWZpZXJzX3NpemUoKSk7CisgICAgZm9yIChhdXRvICZWYWwgOiBTQS0+ZGlhZ25vc3RpY0lkZW50aWZpZXJzKCkpCisgICAgICBSZWNvcmQuQWRkU3RyaW5nKFZhbCk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpTd2lmdENhbGw6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8U3dpZnRDYWxsQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpTd2lmdENvbnRleHQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8U3dpZnRDb250ZXh0QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpTd2lmdEVycm9yUmVzdWx0OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFN3aWZ0RXJyb3JSZXN1bHRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlN3aWZ0SW5kaXJlY3RSZXN1bHQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8U3dpZnRJbmRpcmVjdFJlc3VsdEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6U3lzVkFCSTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxTeXNWQUJJQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpUTFNNb2RlbDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxUTFNNb2RlbEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5BZGRTdHJpbmcoU0EtPmdldE1vZGVsKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6VGFyZ2V0OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFRhcmdldEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5BZGRTdHJpbmcoU0EtPmdldEZlYXR1cmVzU3RyKCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6VGVzdFR5cGVzdGF0ZTogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxUZXN0VHlwZXN0YXRlQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CitSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRUZXN0U3RhdGUoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpUaGlzQ2FsbDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxUaGlzQ2FsbEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6VGhyZWFkOiB7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpUcmFuc3BhcmVudFVuaW9uOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFRyYW5zcGFyZW50VW5pb25BdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlRyaXZpYWxBQkk6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8VHJpdmlhbEFCSUF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6VHJ5QWNxdWlyZUNhcGFiaWxpdHk6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8VHJ5QWNxdWlyZUNhcGFiaWxpdHlBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQuQWRkU3RtdChTQS0+Z2V0U3VjY2Vzc1ZhbHVlKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmFyZ3Nfc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8gJlZhbCA6IFNBLT5hcmdzKCkpCisgICAgICBSZWNvcmQuQWRkU3RtdChWYWwpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6VHlwZVRhZ0ZvckRhdGF0eXBlOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFR5cGVUYWdGb3JEYXRhdHlwZUF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5BZGRJZGVudGlmaWVyUmVmKFNBLT5nZXRBcmd1bWVudEtpbmQoKSk7CisgICAgUmVjb3JkLkFkZFR5cGVTb3VyY2VJbmZvKFNBLT5nZXRNYXRjaGluZ0NUeXBlTG9jKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmdldExheW91dENvbXBhdGlibGUoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0TXVzdEJlTnVsbCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlR5cGVWaXNpYmlsaXR5OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFR5cGVWaXNpYmlsaXR5QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CitSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRWaXNpYmlsaXR5KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6VW5hdmFpbGFibGU6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8VW5hdmFpbGFibGVBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBSZWNvcmQuQWRkU3RyaW5nKFNBLT5nZXRNZXNzYWdlKCkpOworUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0SW1wbGljaXRSZWFzb24oKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpVbnVzZWQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8VW51c2VkQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpVc2VkOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFVzZWRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlV1aWQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8VXVpZEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5BZGRTdHJpbmcoU0EtPmdldEd1aWQoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpWZWNSZXR1cm46IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8VmVjUmV0dXJuQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpWZWNUeXBlSGludDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxWZWNUeXBlSGludEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIFJlY29yZC5BZGRUeXBlU291cmNlSW5mbyhTQS0+Z2V0VHlwZUhpbnRMb2MoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpWZWN0b3JDYWxsOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFZlY3RvckNhbGxBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlZpc2liaWxpdHk6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8VmlzaWJpbGl0eUF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0VmlzaWJpbGl0eSgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6Oldhcm5VbnVzZWQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8V2FyblVudXNlZEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6V2FyblVudXNlZFJlc3VsdDogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxXYXJuVW51c2VkUmVzdWx0QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpXZWFrOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFdlYWtBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OldlYWtJbXBvcnQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8V2Vha0ltcG9ydEF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6V2Vha1JlZjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxXZWFrUmVmQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLkFkZFN0cmluZyhTQS0+Z2V0QWxpYXNlZSgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OldvcmtHcm91cFNpemVIaW50OiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFdvcmtHcm91cFNpemVIaW50QXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0WERpbSgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5nZXRZRGltKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmdldFpEaW0oKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBhdHRyOjpYODZGb3JjZUFsaWduQXJnUG9pbnRlcjogeworICAgIGNvbnN0IGF1dG8gKlNBID0gY2FzdDxYODZGb3JjZUFsaWduQXJnUG9pbnRlckF0dHI+KEEpOworICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpOworICAgIGJyZWFrOworICB9CisgIGNhc2UgYXR0cjo6WFJheUluc3RydW1lbnQ6IHsKKyAgICBjb25zdCBhdXRvICpTQSA9IGNhc3Q8WFJheUluc3RydW1lbnRBdHRyPihBKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pc0luaGVyaXRlZCgpKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmlzSW1wbGljaXQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGF0dHI6OlhSYXlMb2dBcmdzOiB7CisgICAgY29uc3QgYXV0byAqU0EgPSBjYXN0PFhSYXlMb2dBcmdzQXR0cj4oQSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+aXNJbmhlcml0ZWQoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhBLT5pc0ltcGxpY2l0KCkpOworICAgIFJlY29yZC5wdXNoX2JhY2soQS0+Z2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhTQS0+Z2V0QXJndW1lbnRDb3VudCgpKTsKKyAgICBicmVhazsKKyAgfQorICB9CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL0NvbnRpbnVvdXNSYW5nZU1hcC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9Db250aW51b3VzUmFuZ2VNYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTUwOTNhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9Db250aW51b3VzUmFuZ2VNYXAuaApAQCAtMCwwICsxLDE0MSBAQAorLy89PT0tIENvbnRpbnVvdXNSYW5nZU1hcC5oIC0gTWFwIHdpdGggaW50IHJhbmdlIGFzIGtleSAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIENvbnRpbnVvdXNSYW5nZU1hcCBjbGFzcywgd2hpY2ggaXMgYSBoaWdobHkKKy8vICBzcGVjaWFsaXplZCBjb250YWluZXIgdXNlZCBieSBzZXJpYWxpemF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TRVJJQUxJWkFUSU9OX0NPTlRJTlVPVVNSQU5HRU1BUF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU0VSSUFMSVpBVElPTl9DT05USU5VT1VTUkFOR0VNQVBfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworLy8vIFxicmllZiBBIG1hcCBmcm9tIGNvbnRpbnVvdXMgaW50ZWdlciByYW5nZXMgdG8gc29tZSB2YWx1ZSwgd2l0aCBhIHZlcnkKKy8vLyBzcGVjaWFsaXplZCBpbnRlcmZhY2UuCisvLy8KKy8vLyBDUk0gbWFwcyBmcm9tIGludGVnZXIgcmFuZ2VzIHRvIHZhbHVlcy4gVGhlIHJhbmdlcyBhcmUgY29udGludW91cywgaS5lLgorLy8vIHdoZXJlIG9uZSBlbmRzLCB0aGUgbmV4dCBvbmUgYmVnaW5zLiBTbyBpZiB0aGUgbWFwIGNvbnRhaW5zIHRoZSBzdG9wcyBJMC0zLAorLy8vIHRoZSBmaXJzdCByYW5nZSBpcyBmcm9tIEkwIHRvIEkxLCB0aGUgc2Vjb25kIGZyb20gSTEgdG8gSTIsIHRoZSB0aGlyZCBmcm9tCisvLy8gSTIgdG8gSTMgYW5kIHRoZSBsYXN0IGZyb20gSTMgdG8gaW5maW5pdHkuCisvLy8KKy8vLyBSYW5nZXMgbXVzdCBiZSBpbnNlcnRlZCBpbiBvcmRlci4gSW5zZXJ0aW5nIGEgbmV3IHN0b3AgSTQgaW50byB0aGUgbWFwIHdpbGwKKy8vLyBzaHJpbmsgdGhlIGZvdXJ0aCByYW5nZSB0byBJMyB0byBJNCBhbmQgYWRkIHRoZSBuZXcgcmFuZ2UgSTQgdG8gaW5mLgordGVtcGxhdGUgPHR5cGVuYW1lIEludCwgdHlwZW5hbWUgViwgdW5zaWduZWQgSW5pdGlhbENhcGFjaXR5PgorY2xhc3MgQ29udGludW91c1JhbmdlTWFwIHsKK3B1YmxpYzoKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IHN0ZDo6cGFpcjxJbnQsIFY+OworICB1c2luZyByZWZlcmVuY2UgPSB2YWx1ZV90eXBlICY7CisgIHVzaW5nIGNvbnN0X3JlZmVyZW5jZSA9IGNvbnN0IHZhbHVlX3R5cGUgJjsKKyAgdXNpbmcgcG9pbnRlciA9IHZhbHVlX3R5cGUgKjsKKyAgdXNpbmcgY29uc3RfcG9pbnRlciA9IGNvbnN0IHZhbHVlX3R5cGUgKjsKKworcHJpdmF0ZToKKyAgdXNpbmcgUmVwcmVzZW50YXRpb24gPSBTbWFsbFZlY3Rvcjx2YWx1ZV90eXBlLCBJbml0aWFsQ2FwYWNpdHk+OworCisgIFJlcHJlc2VudGF0aW9uIFJlcDsKKworICBzdHJ1Y3QgQ29tcGFyZSB7CisgICAgYm9vbCBvcGVyYXRvciAoKShjb25zdF9yZWZlcmVuY2UgTCwgSW50IFIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMLmZpcnN0IDwgUjsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciAoKShJbnQgTCwgY29uc3RfcmVmZXJlbmNlIFIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMIDwgUi5maXJzdDsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciAoKShJbnQgTCwgSW50IFIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMIDwgUjsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciAoKShjb25zdF9yZWZlcmVuY2UgTCwgY29uc3RfcmVmZXJlbmNlIFIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMLmZpcnN0IDwgUi5maXJzdDsKKyAgICB9CisgIH07CisKK3B1YmxpYzoKKyAgdm9pZCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSAmVmFsKSB7CisgICAgaWYgKCFSZXAuZW1wdHkoKSAmJiBSZXAuYmFjaygpID09IFZhbCkKKyAgICAgIHJldHVybjsKKworICAgIGFzc2VydCgoUmVwLmVtcHR5KCkgfHwgUmVwLmJhY2soKS5maXJzdCA8IFZhbC5maXJzdCkgJiYKKyAgICAgICAgICAgIk11c3QgaW5zZXJ0IGtleXMgaW4gb3JkZXIuIik7CisgICAgUmVwLnB1c2hfYmFjayhWYWwpOworICB9CisgIAorICB2b2lkIGluc2VydE9yUmVwbGFjZShjb25zdCB2YWx1ZV90eXBlICZWYWwpIHsKKyAgICBpdGVyYXRvciBJID0gc3RkOjpsb3dlcl9ib3VuZChSZXAuYmVnaW4oKSwgUmVwLmVuZCgpLCBWYWwsIENvbXBhcmUoKSk7CisgICAgaWYgKEkgIT0gUmVwLmVuZCgpICYmIEktPmZpcnN0ID09IFZhbC5maXJzdCkgeworICAgICAgSS0+c2Vjb25kID0gVmFsLnNlY29uZDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgUmVwLmluc2VydChJLCBWYWwpOworICB9CisKKyAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBSZXByZXNlbnRhdGlvbjo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gdHlwZW5hbWUgUmVwcmVzZW50YXRpb246OmNvbnN0X2l0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gUmVwLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gUmVwLmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gUmVwLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gUmVwLmVuZCgpOyB9CisKKyAgaXRlcmF0b3IgZmluZChJbnQgSykgeworICAgIGl0ZXJhdG9yIEkgPSBzdGQ6OnVwcGVyX2JvdW5kKFJlcC5iZWdpbigpLCBSZXAuZW5kKCksIEssIENvbXBhcmUoKSk7CisgICAgLy8gSSBwb2ludHMgdG8gdGhlIGZpcnN0IGVudHJ5IHdpdGggYSBrZXkgPiBLLCB3aGljaCBpcyB0aGUgcmFuZ2UgdGhhdAorICAgIC8vIGZvbGxvd3MgdGhlIG9uZSBjb250YWluaW5nIEsuCisgICAgaWYgKEkgPT0gUmVwLmJlZ2luKCkpCisgICAgICByZXR1cm4gUmVwLmVuZCgpOworICAgIC0tSTsKKyAgICByZXR1cm4gSTsKKyAgfQorICBjb25zdF9pdGVyYXRvciBmaW5kKEludCBLKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q29udGludW91c1JhbmdlTWFwKj4odGhpcyktPmZpbmQoSyk7CisgIH0KKworICByZWZlcmVuY2UgYmFjaygpIHsgcmV0dXJuIFJlcC5iYWNrKCk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCB7IHJldHVybiBSZXAuYmFjaygpOyB9CisgIAorICAvLy8gXGJyaWVmIEFuIG9iamVjdCB0aGF0IGhlbHBzIHByb3Blcmx5IGJ1aWxkIGEgY29udGludW91cyByYW5nZSBtYXAKKyAgLy8vIGZyb20gYSBzZXQgb2YgdmFsdWVzLgorICBjbGFzcyBCdWlsZGVyIHsKKyAgICBDb250aW51b3VzUmFuZ2VNYXAgJlNlbGY7CisKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEJ1aWxkZXIoQ29udGludW91c1JhbmdlTWFwICZTZWxmKSA6IFNlbGYoU2VsZikge30KKyAgICBCdWlsZGVyKGNvbnN0IEJ1aWxkZXImKSA9IGRlbGV0ZTsKKyAgICBCdWlsZGVyICZvcGVyYXRvcj0oY29uc3QgQnVpbGRlciYpID0gZGVsZXRlOworICAgIAorICAgIH5CdWlsZGVyKCkgeworICAgICAgbGx2bTo6c29ydChTZWxmLlJlcC5iZWdpbigpLCBTZWxmLlJlcC5lbmQoKSwgQ29tcGFyZSgpKTsKKyAgICAgIHN0ZDo6dW5pcXVlKFNlbGYuUmVwLmJlZ2luKCksIFNlbGYuUmVwLmVuZCgpLAorICAgICAgICAgICAgICAgICAgW10oY29uc3RfcmVmZXJlbmNlIEEsIGNvbnN0X3JlZmVyZW5jZSBCKSB7CisgICAgICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgbm90IGFsbG93IGFueSBkdXBsaWNhdGUga2V5cywgYnV0IHRoZXJlIGFyZSBhIGxvdCBvZgorICAgICAgICAvLyBkdXBsaWNhdGUgMCAtPiAwIG1hcHBpbmdzIHRvIHJlbW92ZSBmaXJzdC4KKyAgICAgICAgYXNzZXJ0KChBID09IEIgfHwgQS5maXJzdCAhPSBCLmZpcnN0KSAmJgorICAgICAgICAgICAgICAgIkNvbnRpbnVvdXNSYW5nZU1hcDo6QnVpbGRlciBnaXZlbiBub24tdW5pcXVlIGtleXMiKTsKKyAgICAgICAgcmV0dXJuIEEgPT0gQjsKKyAgICAgIH0pOworICAgIH0KKyAgICAKKyAgICB2b2lkIGluc2VydChjb25zdCB2YWx1ZV90eXBlICZWYWwpIHsKKyAgICAgIFNlbGYuUmVwLnB1c2hfYmFjayhWYWwpOworICAgIH0KKyAgfTsKKworICBmcmllbmQgY2xhc3MgQnVpbGRlcjsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1NFUklBTElaQVRJT05fQ09OVElOVU9VU1JBTkdFTUFQX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vR2xvYmFsTW9kdWxlSW5kZXguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vR2xvYmFsTW9kdWxlSW5kZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjE0ZWNhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9HbG9iYWxNb2R1bGVJbmRleC5oCkBAIC0wLDAgKzEsMjA3IEBACisvLz09PS0tLSBHbG9iYWxNb2R1bGVJbmRleC5oIC0gR2xvYmFsIE1vZHVsZSBJbmRleCAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBHbG9iYWxNb2R1bGVJbmRleCBjbGFzcywgd2hpY2ggbWFuYWdlcyBhIGdsb2JhbCBpbmRleAorLy8gY29udGFpbmluZyBhbGwgb2YgdGhlIGlkZW50aWZpZXJzIGtub3duIHRvIHRoZSB2YXJpb3VzIG1vZHVsZXMgd2l0aGluIGEgZ2l2ZW4KKy8vIHN1YmRpcmVjdG9yeSBvZiB0aGUgbW9kdWxlIGNhY2hlLiBJdCBpcyB1c2VkIHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mCisvLyBxdWVyaWVzIHN1Y2ggYXMgImRvIGFueSBtb2R1bGVzIGtub3cgYWJvdXQgdGhpcyBpZGVudGlmaWVyPyIKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX0NMQU5HX1NFUklBTElaQVRJT05fR0xPQkFMTU9EVUxFSU5ERVhfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NFUklBTElaQVRJT05fR0xPQkFMTU9EVUxFSU5ERVhfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEJpdHN0cmVhbUN1cnNvcjsKK2NsYXNzIE1lbW9yeUJ1ZmZlcjsKK30KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgRGlyZWN0b3J5RW50cnk7CitjbGFzcyBGaWxlRW50cnk7CitjbGFzcyBGaWxlTWFuYWdlcjsKK2NsYXNzIElkZW50aWZpZXJJdGVyYXRvcjsKK2NsYXNzIFBDSENvbnRhaW5lck9wZXJhdGlvbnM7CitjbGFzcyBQQ0hDb250YWluZXJSZWFkZXI7CisKK25hbWVzcGFjZSBzZXJpYWxpemF0aW9uIHsKKyAgY2xhc3MgTW9kdWxlRmlsZTsKK30KKwordXNpbmcgbGx2bTo6U21hbGxWZWN0b3I7Cit1c2luZyBsbHZtOjpTbWFsbFZlY3RvckltcGw7Cit1c2luZyBsbHZtOjpTdHJpbmdSZWY7Cit1c2luZyBzZXJpYWxpemF0aW9uOjpNb2R1bGVGaWxlOworCisvLy8gXGJyaWVmIEEgZ2xvYmFsIGluZGV4IGZvciBhIHNldCBvZiBtb2R1bGUgZmlsZXMsIHByb3ZpZGluZyBpbmZvcm1hdGlvbiBhYm91dAorLy8vIHRoZSBpZGVudGlmaWVycyB3aXRoaW4gdGhvc2UgbW9kdWxlIGZpbGVzLgorLy8vCisvLy8gVGhlIGdsb2JhbCBpbmRleCBpcyBhbiBhaWQgZm9yIG5hbWUgbG9va3VwIGludG8gbW9kdWxlcywgb2ZmZXJpbmcgYSBjZW50cmFsCisvLy8gcGxhY2Ugd2hlcmUgb25lIGNhbiBsb29rIGZvciBpZGVudGlmaWVycyBkZXRlcm1pbmUgd2hpY2gKKy8vLyBtb2R1bGUgZmlsZXMgY29udGFpbiBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhhdCBpZGVudGlmaWVyLiBUaGlzCisvLy8gYWxsb3dzIHRoZSBjbGllbnQgdG8gcmVzdHJpY3QgdGhlIHNlYXJjaCB0byBvbmx5IHRob3NlIG1vZHVsZSBmaWxlcyBrbm93bgorLy8vIHRvIGhhdmUgYSBpbmZvcm1hdGlvbiBhYm91dCB0aGF0IGlkZW50aWZpZXIsIGltcHJvdmluZyBwZXJmb3JtYW5jZS4gTW9yZW92ZXIsCisvLy8gdGhlIGdsb2JhbCBtb2R1bGUgaW5kZXggbWF5IGtub3cgYWJvdXQgbW9kdWxlIGZpbGVzIHRoYXQgaGF2ZSBub3QgYmVlbgorLy8vIGltcG9ydGVkLCBhbmQgY2FuIGJlIHF1ZXJpZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIG1vZHVsZXMgdGhlIGN1cnJlbnQKKy8vLyB0cmFuc2xhdGlvbiBjb3VsZCBvciBzaG91bGQgbG9hZCB0byBmaXggYSBwcm9ibGVtLgorY2xhc3MgR2xvYmFsTW9kdWxlSW5kZXggeworICAvLy8gXGJyaWVmIEJ1ZmZlciBjb250YWluaW5nIHRoZSBpbmRleCBmaWxlLCB3aGljaCBpcyBsYXppbHkgYWNjZXNzZWQgc28gbG9uZworICAvLy8gYXMgdGhlIGdsb2JhbCBtb2R1bGUgaW5kZXggaXMgbGl2ZS4KKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gQnVmZmVyOworCisgIC8vLyBcYnJpZWYgVGhlIGhhc2ggdGFibGUuCisgIC8vLworICAvLy8gVGhpcyBwb2ludGVyIGFjdHVhbGx5IHBvaW50cyB0byBhIElkZW50aWZpZXJJbmRleFRhYmxlIG9iamVjdCwKKyAgLy8vIGJ1dCB0aGF0IHR5cGUgaXMgb25seSBhY2Nlc3NpYmxlIHdpdGhpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YKKyAgLy8vIEdsb2JhbE1vZHVsZUluZGV4LgorICB2b2lkICpJZGVudGlmaWVySW5kZXg7CisKKyAgLy8vIFxicmllZiBJbmZvcm1hdGlvbiBhYm91dCBhIGdpdmVuIG1vZHVsZSBmaWxlLgorICBzdHJ1Y3QgTW9kdWxlSW5mbyB7CisgICAgTW9kdWxlSW5mbygpIDogRmlsZSgpLCBTaXplKCksIE1vZFRpbWUoKSB7IH0KKworICAgIC8vLyBcYnJpZWYgVGhlIG1vZHVsZSBmaWxlLCBvbmNlIGl0IGhhcyBiZWVuIHJlc29sdmVkLgorICAgIE1vZHVsZUZpbGUgKkZpbGU7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBtb2R1bGUgZmlsZSBuYW1lLgorICAgIHN0ZDo6c3RyaW5nIEZpbGVOYW1lOworCisgICAgLy8vIFxicmllZiBTaXplIG9mIHRoZSBtb2R1bGUgZmlsZSBhdCB0aGUgdGltZSB0aGUgZ2xvYmFsIGluZGV4IHdhcyBidWlsdC4KKyAgICBvZmZfdCBTaXplOworCisgICAgLy8vIFxicmllZiBNb2RpZmljYXRpb24gdGltZSBvZiB0aGUgbW9kdWxlIGZpbGUgYXQgdGhlIHRpbWUgdGhlIGdsb2JhbAorICAgIC8vLyBpbmRleCB3YXMgYnVpbHQuCisgICAgdGltZV90IE1vZFRpbWU7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBtb2R1bGUgSURzIG9uIHdoaWNoIHRoaXMgbW9kdWxlIGRpcmVjdGx5IGRlcGVuZHMuCisgICAgLy8vIEZJWE1FOiBXZSBkb24ndCByZWFsbHkgbmVlZCBhIHZlY3RvciBoZXJlLgorICAgIGxsdm06OlNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBEZXBlbmRlbmNpZXM7CisgIH07CisKKyAgLy8vIFxicmllZiBBIG1hcHBpbmcgZnJvbSBtb2R1bGUgSURzIHRvIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggbW9kdWxlLgorICAvLy8KKyAgLy8vIFRoaXMgdmVjdG9yIG1heSBoYXZlIGdhcHMsIGlmIG1vZHVsZSBmaWxlcyBoYXZlIGJlZW4gcmVtb3ZlZCBvciBoYXZlCisgIC8vLyBiZWVuIHVwZGF0ZWQgc2luY2UgdGhlIGluZGV4IHdhcyBidWlsdC4gQSBnYXAgaXMgaW5kaWNhdGVkIGJ5IGFuIGVtcHR5CisgIC8vLyBmaWxlIG5hbWUuCisgIGxsdm06OlNtYWxsVmVjdG9yPE1vZHVsZUluZm8sIDE2PiBNb2R1bGVzOworCisgIC8vLyBcYnJpZWYgTGF6aWx5LXBvcHVsYXRlZCBtYXBwaW5nIGZyb20gbW9kdWxlIGZpbGVzIHRvIHRoZWlyCisgIC8vLyBjb3JyZXNwb25kaW5nIGluZGV4IGludG8gdGhlIFxjIE1vZHVsZXMgdmVjdG9yLgorICBsbHZtOjpEZW5zZU1hcDxNb2R1bGVGaWxlICosIHVuc2lnbmVkPiBNb2R1bGVzQnlGaWxlOworCisgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiBtb2R1bGVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gcmVzb2x2ZWQuCisgIC8vLworICAvLy8gVGhlIHN0cmluZyBpcyBqdXN0IHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgaXRzZWxmLCB3aGljaCBtYXBzIHRvIHRoZQorICAvLy8gbW9kdWxlIElELgorICBsbHZtOjpTdHJpbmdNYXA8dW5zaWduZWQ+IFVucmVzb2x2ZWRNb2R1bGVzOworCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBpZGVudGlmaWVyIGxvb2t1cHMgd2UgcGVyZm9ybWVkLgorICB1bnNpZ25lZCBOdW1JZGVudGlmaWVyTG9va3VwczsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgaWRlbnRpZmllciBsb29rdXAgaGl0cywgd2hlcmUgd2UgcmVjb2duaXplIHRoZQorICAvLy8gaWRlbnRpZmllci4KKyAgdW5zaWduZWQgTnVtSWRlbnRpZmllckxvb2t1cEhpdHM7CisgIAorICAvLy8gXGJyaWVmIEludGVybmFsIGNvbnN0cnVjdG9yLiBVc2UgXGMgcmVhZEluZGV4KCkgdG8gcmVhZCBhbiBpbmRleC4KKyAgZXhwbGljaXQgR2xvYmFsTW9kdWxlSW5kZXgoc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpCaXRzdHJlYW1DdXJzb3IgQ3Vyc29yKTsKKworICBHbG9iYWxNb2R1bGVJbmRleChjb25zdCBHbG9iYWxNb2R1bGVJbmRleCAmKSA9IGRlbGV0ZTsKKyAgR2xvYmFsTW9kdWxlSW5kZXggJm9wZXJhdG9yPShjb25zdCBHbG9iYWxNb2R1bGVJbmRleCAmKSA9IGRlbGV0ZTsKKworcHVibGljOgorICB+R2xvYmFsTW9kdWxlSW5kZXgoKTsKKworICAvLy8gXGJyaWVmIEFuIGVycm9yIGNvZGUgcmV0dXJuZWQgd2hlbiB0cnlpbmcgdG8gcmVhZCBhbiBpbmRleC4KKyAgZW51bSBFcnJvckNvZGUgeworICAgIC8vLyBcYnJpZWYgTm8gZXJyb3Igb2NjdXJyZWQuCisgICAgRUNfTm9uZSwKKyAgICAvLy8gXGJyaWVmIE5vIGluZGV4IHdhcyBmb3VuZC4KKyAgICBFQ19Ob3RGb3VuZCwKKyAgICAvLy8gXGJyaWVmIFNvbWUgb3RoZXIgcHJvY2VzcyBpcyBjdXJyZW50bHkgYnVpbGRpbmcgdGhlIGluZGV4OyBpdCBpcyBub3QKKyAgICAvLy8gYXZhaWxhYmxlIHlldC4KKyAgICBFQ19CdWlsZGluZywKKyAgICAvLy8gXGJyaWVmIFRoZXJlIHdhcyBhbiB1bnNwZWNpZmllZCBJL08gZXJyb3IgcmVhZGluZyBvciB3cml0aW5nIHRoZSBpbmRleC4KKyAgICBFQ19JT0Vycm9yCisgIH07CisKKyAgLy8vIFxicmllZiBSZWFkIGEgZ2xvYmFsIGluZGV4IGZpbGUgZm9yIHRoZSBnaXZlbiBkaXJlY3RvcnkuCisgIC8vLworICAvLy8gXHBhcmFtIFBhdGggVGhlIHBhdGggdG8gdGhlIHNwZWNpZmljIG1vZHVsZSBjYWNoZSB3aGVyZSB0aGUgbW9kdWxlIGZpbGVzCisgIC8vLyBmb3IgdGhlIGludGVuZGVkIGNvbmZpZ3VyYXRpb24gcmVzaWRlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIEEgcGFpciBjb250YWluaW5nIHRoZSBnbG9iYWwgbW9kdWxlIGluZGV4IChpZiBpdCBleGlzdHMpIGFuZAorICAvLy8gdGhlIGVycm9yIGNvZGUuCisgIHN0YXRpYyBzdGQ6OnBhaXI8R2xvYmFsTW9kdWxlSW5kZXggKiwgRXJyb3JDb2RlPgorICByZWFkSW5kZXgoU3RyaW5nUmVmIFBhdGgpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgaWRlbnRpZmllcnMgc3RvcmVkIGluIHRoZSBpbmRleCB0YWJsZS4KKyAgLy8vCisgIC8vLyBUaGUgY2FsbGVyIGFjY2VwdHMgb3duZXJzaGlwIG9mIHRoZSByZXR1cm5lZCBvYmplY3QuCisgIElkZW50aWZpZXJJdGVyYXRvciAqY3JlYXRlSWRlbnRpZmllckl0ZXJhdG9yKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc2V0IG9mIG1vZHVsZXMgdGhhdCBoYXZlIHVwLXRvLWRhdGUgaW5kZXhlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gTW9kdWxlRmlsZXMgV2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgc2V0IG9mIG1vZHVsZSBmaWxlcyB0aGF0CisgIC8vLyBoYXZlIGJlZW4gaW5kZXhlZC4KKyAgdm9pZCBnZXRLbm93bk1vZHVsZXMoU21hbGxWZWN0b3JJbXBsPE1vZHVsZUZpbGUgKj4gJk1vZHVsZUZpbGVzKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzZXQgb2YgbW9kdWxlIGZpbGVzIG9uIHdoaWNoIHRoZSBnaXZlbiBtb2R1bGUgZmlsZQorICAvLy8gZGlyZWN0bHkgZGVwZW5kcy4KKyAgdm9pZCBnZXRNb2R1bGVEZXBlbmRlbmNpZXMoTW9kdWxlRmlsZSAqRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1vZHVsZUZpbGUgKj4gJkRlcGVuZGVuY2llcyk7CisKKyAgLy8vIFxicmllZiBBIHNldCBvZiBtb2R1bGUgZmlsZXMgaW4gd2hpY2ggd2UgZm91bmQgYSByZXN1bHQuCisgIHR5cGVkZWYgbGx2bTo6U21hbGxQdHJTZXQ8TW9kdWxlRmlsZSAqLCA0PiBIaXRTZXQ7CisgIAorICAvLy8gXGJyaWVmIExvb2sgZm9yIGFsbCBvZiB0aGUgbW9kdWxlIGZpbGVzIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdpdmVuCisgIC8vLyBpZGVudGlmaWVyLCBlLmcuLCBhIGdsb2JhbCBmdW5jdGlvbiwgdmFyaWFibGUsIG9yIHR5cGUgd2l0aCB0aGF0IG5hbWUuCisgIC8vLworICAvLy8gXHBhcmFtIE5hbWUgVGhlIGlkZW50aWZpZXIgdG8gbG9vayBmb3IuCisgIC8vLworICAvLy8gXHBhcmFtIEhpdHMgV2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgc2V0IG9mIG1vZHVsZSBmaWxlcyB0aGF0IGhhdmUKKyAgLy8vIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbmFtZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZSBpZGVudGlmaWVyIGlzIGtub3duIHRvIHRoZSBpbmRleCwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGxvb2t1cElkZW50aWZpZXIoU3RyaW5nUmVmIE5hbWUsIEhpdFNldCAmSGl0cyk7CisKKyAgLy8vIFxicmllZiBOb3RlIHRoYXQgdGhlIGdpdmVuIG1vZHVsZSBmaWxlIGhhcyBiZWVuIGxvYWRlZC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgZ2xvYmFsIG1vZHVsZSBpbmRleCBoYXMgaW5mb3JtYXRpb24gYWJvdXQgdGhpcworICAvLy8gbW9kdWxlIGZpbGUsIGFuZCB0cnVlIG90aGVyd2lzZS4KKyAgYm9vbCBsb2FkZWRNb2R1bGVGaWxlKE1vZHVsZUZpbGUgKkZpbGUpOworCisgIC8vLyBcYnJpZWYgUHJpbnQgc3RhdGlzdGljcyB0byBzdGFuZGFyZCBlcnJvci4KKyAgdm9pZCBwcmludFN0YXRzKCk7CisKKyAgLy8vIFxicmllZiBQcmludCBkZWJ1Z2dpbmcgdmlldyB0byBzdGFuZGFyZCBlcnJvci4KKyAgdm9pZCBkdW1wKCk7CisKKyAgLy8vIFxicmllZiBXcml0ZSBhIGdsb2JhbCBpbmRleCBpbnRvIHRoZSBnaXZlbgorICAvLy8KKyAgLy8vIFxwYXJhbSBGaWxlTWdyIFRoZSBmaWxlIG1hbmFnZXIgdG8gdXNlIHRvIGxvYWQgbW9kdWxlIGZpbGVzLgorICAvLy8gXHBhcmFtIFBDSENvbnRhaW5lclJkciAtIFRoZSBQQ0hDb250YWluZXJPcGVyYXRpb25zIHRvIHVzZSBmb3IgbG9hZGluZyBhbmQKKyAgLy8vIGNyZWF0aW5nIG1vZHVsZXMuCisgIC8vLyBccGFyYW0gUGF0aCBUaGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgbW9kdWxlIGZpbGVzLCBpbnRvCisgIC8vLyB3aGljaCB0aGUgZ2xvYmFsIGluZGV4IHdpbGwgYmUgd3JpdHRlbi4KKyAgc3RhdGljIEVycm9yQ29kZSB3cml0ZUluZGV4KEZpbGVNYW5hZ2VyICZGaWxlTWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUENIQ29udGFpbmVyUmVhZGVyICZQQ0hDb250YWluZXJSZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgUGF0aCk7Cit9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vTW9kdWxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL01vZHVsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YjNiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL01vZHVsZS5oCkBAIC0wLDAgKzEsNDc3IEBACisvLz09PS0tLSBNb2R1bGUuaCAtIE1vZHVsZSBkZXNjcmlwdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgTW9kdWxlIGNsYXNzLCB3aGljaCBkZXNjcmliZXMgYSBtb2R1bGUgdGhhdCBoYXMKKy8vICBiZWVuIGxvYWRlZCBmcm9tIGFuIEFTVCBmaWxlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TRVJJQUxJWkFUSU9OX01PRFVMRV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU0VSSUFMSVpBVElPTl9NT0RVTEVfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRmlsZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Nb2R1bGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL1NlcmlhbGl6YXRpb24vQVNUQml0Q29kZXMuaCIKKyNpbmNsdWRlICJjbGFuZy9TZXJpYWxpemF0aW9uL0NvbnRpbnVvdXNSYW5nZU1hcC5oIgorI2luY2x1ZGUgImNsYW5nL1NlcmlhbGl6YXRpb24vTW9kdWxlRmlsZUV4dGVuc2lvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQml0Y29kZS9CaXRzdHJlYW1SZWFkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0gewordGVtcGxhdGUgPHR5cGVuYW1lIEluZm8+IGNsYXNzIE9uRGlza0NoYWluZWRIYXNoVGFibGU7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5mbz4gY2xhc3MgT25EaXNrSXRlcmFibGVDaGFpbmVkSGFzaFRhYmxlOworfQorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBEZWNsQ29udGV4dDsKK2NsYXNzIE1vZHVsZTsKKworbmFtZXNwYWNlIHNlcmlhbGl6YXRpb24geworCituYW1lc3BhY2UgcmVhZGVyIHsKKyAgY2xhc3MgQVNURGVjbENvbnRleHROYW1lTG9va3VwVHJhaXQ7Cit9CisKKy8vLyBcYnJpZWYgU3BlY2lmaWVzIHRoZSBraW5kIG9mIG1vZHVsZSB0aGF0IGhhcyBiZWVuIGxvYWRlZC4KK2VudW0gTW9kdWxlS2luZCB7CisgIE1LX0ltcGxpY2l0TW9kdWxlLCAvLy88IEZpbGUgaXMgYW4gaW1wbGljaXRseS1sb2FkZWQgbW9kdWxlLgorICBNS19FeHBsaWNpdE1vZHVsZSwgLy8vPCBGaWxlIGlzIGFuIGV4cGxpY2l0bHktbG9hZGVkIG1vZHVsZS4KKyAgTUtfUENILCAgICAgICAgICAgIC8vLzwgRmlsZSBpcyBhIFBDSCBmaWxlIHRyZWF0ZWQgYXMgc3VjaC4KKyAgTUtfUHJlYW1ibGUsICAgICAgIC8vLzwgRmlsZSBpcyBhIFBDSCBmaWxlIHRyZWF0ZWQgYXMgdGhlIHByZWFtYmxlLgorICBNS19NYWluRmlsZSwgICAgICAgLy8vPCBGaWxlIGlzIGEgUENIIGZpbGUgdHJlYXRlZCBhcyB0aGUgYWN0dWFsIG1haW4gZmlsZS4KKyAgTUtfUHJlYnVpbHRNb2R1bGUgIC8vLzwgRmlsZSBpcyBmcm9tIGEgcHJlYnVpbHQgbW9kdWxlIHBhdGguCit9OworCisvLy8gXGJyaWVmIFRoZSBpbnB1dCBmaWxlIHRoYXQgaGFzIGJlZW4gbG9hZGVkIGZyb20gdGhpcyBBU1QgZmlsZSwgYWxvbmcgd2l0aAorLy8vIGJvb2xzIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHdhcyBhbiBvdmVycmlkZGVuIGJ1ZmZlciBvciBpZiBpdCB3YXMKKy8vLyBvdXQtb2YtZGF0ZSBvciBub3QtZm91bmQuCitjbGFzcyBJbnB1dEZpbGUgeworICBlbnVtIHsKKyAgICBPdmVycmlkZGVuID0gMSwKKyAgICBPdXRPZkRhdGUgPSAyLAorICAgIE5vdEZvdW5kID0gMworICB9OworICBsbHZtOjpQb2ludGVySW50UGFpcjxjb25zdCBGaWxlRW50cnkgKiwgMiwgdW5zaWduZWQ+IFZhbDsKKworcHVibGljOgorICBJbnB1dEZpbGUoKSB7fQorICBJbnB1dEZpbGUoY29uc3QgRmlsZUVudHJ5ICpGaWxlLAorICAgICAgICAgICAgYm9vbCBpc092ZXJyaWRkZW4gPSBmYWxzZSwgYm9vbCBpc091dE9mRGF0ZSA9IGZhbHNlKSB7CisgICAgYXNzZXJ0KCEoaXNPdmVycmlkZGVuICYmIGlzT3V0T2ZEYXRlKSAmJgorICAgICAgICAgICAiYW4gb3ZlcnJpZGRlbiBjYW5ub3QgYmUgb3V0LW9mLWRhdGUiKTsKKyAgICB1bnNpZ25lZCBpbnRWYWwgPSAwOworICAgIGlmIChpc092ZXJyaWRkZW4pCisgICAgICBpbnRWYWwgPSBPdmVycmlkZGVuOworICAgIGVsc2UgaWYgKGlzT3V0T2ZEYXRlKQorICAgICAgaW50VmFsID0gT3V0T2ZEYXRlOworICAgIFZhbC5zZXRQb2ludGVyQW5kSW50KEZpbGUsIGludFZhbCk7CisgIH0KKworICBzdGF0aWMgSW5wdXRGaWxlIGdldE5vdEZvdW5kKCkgeworICAgIElucHV0RmlsZSBGaWxlOworICAgIEZpbGUuVmFsLnNldEludChOb3RGb3VuZCk7CisgICAgcmV0dXJuIEZpbGU7CisgIH0KKworICBjb25zdCBGaWxlRW50cnkgKmdldEZpbGUoKSBjb25zdCB7IHJldHVybiBWYWwuZ2V0UG9pbnRlcigpOyB9CisgIGJvb2wgaXNPdmVycmlkZGVuKCkgY29uc3QgeyByZXR1cm4gVmFsLmdldEludCgpID09IE92ZXJyaWRkZW47IH0KKyAgYm9vbCBpc091dE9mRGF0ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbC5nZXRJbnQoKSA9PSBPdXRPZkRhdGU7IH0KKyAgYm9vbCBpc05vdEZvdW5kKCkgY29uc3QgeyByZXR1cm4gVmFsLmdldEludCgpID09IE5vdEZvdW5kOyB9Cit9OworCisvLy8gXGJyaWVmIEluZm9ybWF0aW9uIGFib3V0IGEgbW9kdWxlIHRoYXQgaGFzIGJlZW4gbG9hZGVkIGJ5IHRoZSBBU1RSZWFkZXIuCisvLy8KKy8vLyBFYWNoIGluc3RhbmNlIG9mIHRoZSBNb2R1bGUgY2xhc3MgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgQVNUIGZpbGUsIHdoaWNoCisvLy8gbWF5IGJlIGEgcHJlY29tcGlsZWQgaGVhZGVyLCBwcmVjb21waWxlZCBwcmVhbWJsZSwgYSBtb2R1bGUsIG9yIGFuIEFTVCBmaWxlCisvLy8gb2Ygc29tZSBzb3J0IGxvYWRlZCBhcyB0aGUgbWFpbiBmaWxlLCBhbGwgb2Ygd2hpY2ggYXJlIHNwZWNpZmljIGZvcm11bGF0aW9ucworLy8vIG9mIHRoZSBnZW5lcmFsIG5vdGlvbiBvZiBhICJtb2R1bGUiLiBBIG1vZHVsZSBtYXkgZGVwZW5kIG9uIGFueSBudW1iZXIgb2YKKy8vLyBvdGhlciBtb2R1bGVzLgorY2xhc3MgTW9kdWxlRmlsZSB7CitwdWJsaWM6CisgIE1vZHVsZUZpbGUoTW9kdWxlS2luZCBLaW5kLCB1bnNpZ25lZCBHZW5lcmF0aW9uKQorICAgICAgOiBLaW5kKEtpbmQpLCBHZW5lcmF0aW9uKEdlbmVyYXRpb24pIHt9CisgIH5Nb2R1bGVGaWxlKCk7CisKKyAgLy8gPT09IEdlbmVyYWwgaW5mb3JtYXRpb24gPT09CisKKyAgLy8vIFxicmllZiBUaGUgaW5kZXggb2YgdGhpcyBtb2R1bGUgaW4gdGhlIGxpc3Qgb2YgbW9kdWxlcy4KKyAgdW5zaWduZWQgSW5kZXggPSAwOworCisgIC8vLyBcYnJpZWYgVGhlIHR5cGUgb2YgdGhpcyBtb2R1bGUuCisgIE1vZHVsZUtpbmQgS2luZDsKKworICAvLy8gXGJyaWVmIFRoZSBmaWxlIG5hbWUgb2YgdGhlIG1vZHVsZSBmaWxlLgorICBzdGQ6OnN0cmluZyBGaWxlTmFtZTsKKworICAvLy8gXGJyaWVmIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUuCisgIHN0ZDo6c3RyaW5nIE1vZHVsZU5hbWU7CisKKyAgLy8vIFxicmllZiBUaGUgYmFzZSBkaXJlY3Rvcnkgb2YgdGhlIG1vZHVsZS4KKyAgc3RkOjpzdHJpbmcgQmFzZURpcmVjdG9yeTsKKworICBzdGQ6OnN0cmluZyBnZXRUaW1lc3RhbXBGaWxlbmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRmlsZU5hbWUgKyAiLnRpbWVzdGFtcCI7CisgIH0KKworICAvLy8gXGJyaWVmIFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSBuYW1lIHRoYXQgd2FzIHVzZWQgdG8gYnVpbGQgdGhlCisgIC8vLyBwcmltYXJ5IEFTVCBmaWxlLCB3aGljaCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGZvcgorICAvLy8gcmVsb2NhdGFibGUtcGNoIHN1cHBvcnQuCisgIHN0ZDo6c3RyaW5nIE9yaWdpbmFsU291cmNlRmlsZU5hbWU7CisKKyAgLy8vIFxicmllZiBUaGUgYWN0dWFsIG9yaWdpbmFsIHNvdXJjZSBmaWxlIG5hbWUgdGhhdCB3YXMgdXNlZCB0bworICAvLy8gYnVpbGQgdGhpcyBBU1QgZmlsZS4KKyAgc3RkOjpzdHJpbmcgQWN0dWFsT3JpZ2luYWxTb3VyY2VGaWxlTmFtZTsKKworICAvLy8gXGJyaWVmIFRoZSBmaWxlIElEIGZvciB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUgdGhhdCB3YXMgdXNlZCB0bworICAvLy8gYnVpbGQgdGhpcyBBU1QgZmlsZS4KKyAgRmlsZUlEIE9yaWdpbmFsU291cmNlRmlsZUlEOworCisgIC8vLyBcYnJpZWYgVGhlIGRpcmVjdG9yeSB0aGF0IHRoZSBQQ0ggd2FzIG9yaWdpbmFsbHkgY3JlYXRlZCBpbi4gVXNlZCB0bworICAvLy8gYWxsb3cgcmVzb2x2aW5nIGhlYWRlcnMgZXZlbiBhZnRlciBoZWFkZXJzK1BDSCB3YXMgbW92ZWQgdG8gYSBuZXcgcGF0aC4KKyAgc3RkOjpzdHJpbmcgT3JpZ2luYWxEaXI7CisKKyAgc3RkOjpzdHJpbmcgTW9kdWxlTWFwUGF0aDsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBwcmVjb21waWxlZCBoZWFkZXIgaXMgYSByZWxvY2F0YWJsZSBQQ0ggZmlsZS4KKyAgYm9vbCBSZWxvY2F0YWJsZVBDSCA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aW1lc3RhbXBzIGFyZSBpbmNsdWRlZCBpbiB0aGlzIG1vZHVsZSBmaWxlLgorICBib29sIEhhc1RpbWVzdGFtcHMgPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIFRoZSBmaWxlIGVudHJ5IGZvciB0aGUgbW9kdWxlIGZpbGUuCisgIGNvbnN0IEZpbGVFbnRyeSAqRmlsZSA9IG51bGxwdHI7CisKKyAgLy8vIFRoZSBzaWduYXR1cmUgb2YgdGhlIG1vZHVsZSBmaWxlLCB3aGljaCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBzaXplCisgIC8vLyBhbmQgbW9kaWZpY2F0aW9uIHRpbWUgdG8gaWRlbnRpZnkgdGhpcyBwYXJ0aWN1bGFyIGZpbGUuCisgIEFTVEZpbGVTaWduYXR1cmUgU2lnbmF0dXJlOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIG1vZHVsZSBoYXMgYmVlbiBkaXJlY3RseSBpbXBvcnRlZCBieSB0aGUKKyAgLy8vIHVzZXIuCisgIGJvb2wgRGlyZWN0bHlJbXBvcnRlZCA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgVGhlIGdlbmVyYXRpb24gb2Ygd2hpY2ggdGhpcyBtb2R1bGUgZmlsZSBpcyBhIHBhcnQuCisgIHVuc2lnbmVkIEdlbmVyYXRpb247CisgIAorICAvLy8gVGhlIG1lbW9yeSBidWZmZXIgdGhhdCBzdG9yZXMgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoCisgIC8vLyB0aGlzIEFTVCBmaWxlLCBvd25lZCBieSB0aGUgUENNQ2FjaGUgaW4gdGhlIE1vZHVsZU1hbmFnZXIuCisgIGxsdm06Ok1lbW9yeUJ1ZmZlciAqQnVmZmVyOworCisgIC8vLyBcYnJpZWYgVGhlIHNpemUgb2YgdGhpcyBmaWxlLCBpbiBiaXRzLgorICB1aW50NjRfdCBTaXplSW5CaXRzID0gMDsKKworICAvLy8gXGJyaWVmIFRoZSBnbG9iYWwgYml0IG9mZnNldCAob3IgYmFzZSkgb2YgdGhpcyBtb2R1bGUKKyAgdWludDY0X3QgR2xvYmFsQml0T2Zmc2V0ID0gMDsKKworICAvLy8gXGJyaWVmIFRoZSBzZXJpYWxpemVkIGJpdHN0cmVhbSBkYXRhIGZvciB0aGlzIGZpbGUuCisgIFN0cmluZ1JlZiBEYXRhOworCisgIC8vLyBcYnJpZWYgVGhlIG1haW4gYml0c3RyZWFtIGN1cnNvciBmb3IgdGhlIG1haW4gYmxvY2suCisgIGxsdm06OkJpdHN0cmVhbUN1cnNvciBTdHJlYW07CisKKyAgLy8vIFxicmllZiBUaGUgc291cmNlIGxvY2F0aW9uIHdoZXJlIHRoZSBtb2R1bGUgd2FzIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseQorICAvLy8gaW1wb3J0ZWQgaW4gdGhlIGxvY2FsIHRyYW5zbGF0aW9uIHVuaXQuCisgIC8vLworICAvLy8gSWYgbW9kdWxlIEEgZGVwZW5kcyBvbiBhbmQgaW1wb3J0cyBtb2R1bGUgQiwgYm90aCBtb2R1bGVzIHdpbGwgaGF2ZSB0aGUKKyAgLy8vIHNhbWUgRGlyZWN0SW1wb3J0TG9jLCBidXQgZGlmZmVyZW50IEltcG9ydExvYyAoQidzIEltcG9ydExvYyB3aWxsIGJlIGEKKyAgLy8vIHNvdXJjZSBsb2NhdGlvbiBpbnNpZGUgbW9kdWxlIEEpLgorICAvLy8KKyAgLy8vIFdBUk5JTkc6IFRoaXMgaXMgbGFyZ2VseSB1c2VsZXNzLiBJdCBkb2Vzbid0IHRlbGwgeW91IHdoZW4gYSBtb2R1bGUgd2FzCisgIC8vLyBtYWRlIHZpc2libGUsIGp1c3Qgd2hlbiB0aGUgZmlyc3Qgc3VibW9kdWxlIG9mIHRoYXQgbW9kdWxlIHdhcyBpbXBvcnRlZC4KKyAgU291cmNlTG9jYXRpb24gRGlyZWN0SW1wb3J0TG9jOworCisgIC8vLyBcYnJpZWYgVGhlIHNvdXJjZSBsb2NhdGlvbiB3aGVyZSB0aGlzIG1vZHVsZSB3YXMgZmlyc3QgaW1wb3J0ZWQuCisgIFNvdXJjZUxvY2F0aW9uIEltcG9ydExvYzsKKworICAvLy8gXGJyaWVmIFRoZSBmaXJzdCBzb3VyY2UgbG9jYXRpb24gaW4gdGhpcyBtb2R1bGUuCisgIFNvdXJjZUxvY2F0aW9uIEZpcnN0TG9jOworCisgIC8vLyBUaGUgbGlzdCBvZiBleHRlbnNpb24gcmVhZGVycyB0aGF0IGFyZSBhdHRhY2hlZCB0byB0aGlzIG1vZHVsZQorICAvLy8gZmlsZS4KKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE1vZHVsZUZpbGVFeHRlbnNpb25SZWFkZXI+PiBFeHRlbnNpb25SZWFkZXJzOworCisgIC8vLyBUaGUgbW9kdWxlIG9mZnNldCBtYXAgZGF0YSBmb3IgdGhpcyBmaWxlLiBJZiBub24tZW1wdHksIHRoZSB2YXJpb3VzCisgIC8vLyBDb250aW51b3VzUmFuZ2VNYXBzIGRlc2NyaWJlZCBiZWxvdyBoYXZlIG5vdCB5ZXQgYmVlbiBwb3B1bGF0ZWQuCisgIFN0cmluZ1JlZiBNb2R1bGVPZmZzZXRNYXA7CisKKyAgLy8gPT09IElucHV0IEZpbGVzID09PQorICAvLy8gXGJyaWVmIFRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dC1maWxlcyBibG9jay4KKyAgbGx2bTo6Qml0c3RyZWFtQ3Vyc29yIElucHV0RmlsZXNDdXJzb3I7CisKKyAgLy8vIFxicmllZiBPZmZzZXRzIGZvciBhbGwgb2YgdGhlIGlucHV0IGZpbGUgZW50cmllcyBpbiB0aGUgQVNUIGZpbGUuCisgIGNvbnN0IGxsdm06OnN1cHBvcnQ6OnVuYWxpZ25lZF91aW50NjRfdCAqSW5wdXRGaWxlT2Zmc2V0cyA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBUaGUgaW5wdXQgZmlsZXMgdGhhdCBoYXZlIGJlZW4gbG9hZGVkIGZyb20gdGhpcyBBU1QgZmlsZS4KKyAgc3RkOjp2ZWN0b3I8SW5wdXRGaWxlPiBJbnB1dEZpbGVzTG9hZGVkOworCisgIC8vIEFsbCB1c2VyIGlucHV0IGZpbGVzIHJlc2lkZSBhdCB0aGUgaW5kZXggcmFuZ2UgWzAsIE51bVVzZXJJbnB1dEZpbGVzKSwgYW5kCisgIC8vIHN5c3RlbSBpbnB1dCBmaWxlcyByZXNpZGUgYXQgW051bVVzZXJJbnB1dEZpbGVzLCBJbnB1dEZpbGVzTG9hZGVkLnNpemUoKSkuCisgIHVuc2lnbmVkIE51bVVzZXJJbnB1dEZpbGVzID0gMDsKKworICAvLy8gXGJyaWVmIElmIG5vbi16ZXJvLCBzcGVjaWZpZXMgdGhlIHRpbWUgd2hlbiB3ZSBsYXN0IHZhbGlkYXRlZCBpbnB1dAorICAvLy8gZmlsZXMuICBaZXJvIG1lYW5zIHdlIG5ldmVyIHZhbGlkYXRlZCB0aGVtLgorICAvLy8KKyAgLy8vIFRoZSB0aW1lIGlzIHNwZWNpZmllZCBpbiBzZWNvbmRzIHNpbmNlIHRoZSBzdGFydCBvZiB0aGUgRXBvY2guCisgIHVpbnQ2NF90IElucHV0RmlsZXNWYWxpZGF0aW9uVGltZXN0YW1wID0gMDsKKworICAvLyA9PT0gU291cmNlIExvY2F0aW9ucyA9PT0KKworICAvLy8gXGJyaWVmIEN1cnNvciB1c2VkIHRvIHJlYWQgc291cmNlIGxvY2F0aW9uIGVudHJpZXMuCisgIGxsdm06OkJpdHN0cmVhbUN1cnNvciBTTG9jRW50cnlDdXJzb3I7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHNvdXJjZSBsb2NhdGlvbiBlbnRyaWVzIGluIHRoaXMgQVNUIGZpbGUuCisgIHVuc2lnbmVkIExvY2FsTnVtU0xvY0VudHJpZXMgPSAwOworCisgIC8vLyBcYnJpZWYgVGhlIGJhc2UgSUQgaW4gdGhlIHNvdXJjZSBtYW5hZ2VyJ3MgdmlldyBvZiB0aGlzIG1vZHVsZS4KKyAgaW50IFNMb2NFbnRyeUJhc2VJRCA9IDA7CisKKyAgLy8vIFxicmllZiBUaGUgYmFzZSBvZmZzZXQgaW4gdGhlIHNvdXJjZSBtYW5hZ2VyJ3MgdmlldyBvZiB0aGlzIG1vZHVsZS4KKyAgdW5zaWduZWQgU0xvY0VudHJ5QmFzZU9mZnNldCA9IDA7CisKKyAgLy8vIFxicmllZiBPZmZzZXRzIGZvciBhbGwgb2YgdGhlIHNvdXJjZSBsb2NhdGlvbiBlbnRyaWVzIGluIHRoZQorICAvLy8gQVNUIGZpbGUuCisgIGNvbnN0IHVpbnQzMl90ICpTTG9jRW50cnlPZmZzZXRzID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFNMb2NFbnRyaWVzIHRoYXQgd2UncmUgZ29pbmcgdG8gcHJlbG9hZC4KKyAgU21hbGxWZWN0b3I8dWludDY0X3QsIDQ+IFByZWxvYWRTTG9jRW50cmllczsKKworICAvLy8gXGJyaWVmIFJlbWFwcGluZyB0YWJsZSBmb3Igc291cmNlIGxvY2F0aW9ucyBpbiB0aGlzIG1vZHVsZS4KKyAgQ29udGludW91c1JhbmdlTWFwPHVpbnQzMl90LCBpbnQsIDI+IFNMb2NSZW1hcDsKKworICAvLyA9PT0gSWRlbnRpZmllcnMgPT09CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGlkZW50aWZpZXJzIGluIHRoaXMgQVNUIGZpbGUuCisgIHVuc2lnbmVkIExvY2FsTnVtSWRlbnRpZmllcnMgPSAwOworCisgIC8vLyBcYnJpZWYgT2Zmc2V0cyBpbnRvIHRoZSBpZGVudGlmaWVyIHRhYmxlIGRhdGEuCisgIC8vLworICAvLy8gVGhpcyBhcnJheSBpcyBpbmRleGVkIGJ5IHRoZSBpZGVudGlmaWVyIElEICgtMSksIGFuZCBwcm92aWRlcworICAvLy8gdGhlIG9mZnNldCBpbnRvIElkZW50aWZpZXJUYWJsZURhdGEgd2hlcmUgdGhlIHN0cmluZyBkYXRhIGlzCisgIC8vLyBzdG9yZWQuCisgIGNvbnN0IHVpbnQzMl90ICpJZGVudGlmaWVyT2Zmc2V0cyA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBCYXNlIGlkZW50aWZpZXIgSUQgZm9yIGlkZW50aWZpZXJzIGxvY2FsIHRvIHRoaXMgbW9kdWxlLgorICBzZXJpYWxpemF0aW9uOjpJZGVudElEIEJhc2VJZGVudGlmaWVySUQgPSAwOworCisgIC8vLyBcYnJpZWYgUmVtYXBwaW5nIHRhYmxlIGZvciBpZGVudGlmaWVyIElEcyBpbiB0aGlzIG1vZHVsZS4KKyAgQ29udGludW91c1JhbmdlTWFwPHVpbnQzMl90LCBpbnQsIDI+IElkZW50aWZpZXJSZW1hcDsKKworICAvLy8gXGJyaWVmIEFjdHVhbCBkYXRhIGZvciB0aGUgb24tZGlzayBoYXNoIHRhYmxlIG9mIGlkZW50aWZpZXJzLgorICAvLy8KKyAgLy8vIFRoaXMgcG9pbnRlciBwb2ludHMgaW50byBhIG1lbW9yeSBidWZmZXIsIHdoZXJlIHRoZSBvbi1kaXNrIGhhc2gKKyAgLy8vIHRhYmxlIGZvciBpZGVudGlmaWVycyBhY3R1YWxseSBsaXZlcy4KKyAgY29uc3QgY2hhciAqSWRlbnRpZmllclRhYmxlRGF0YSA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBBIHBvaW50ZXIgdG8gYW4gb24tZGlzayBoYXNoIHRhYmxlIG9mIG9wYXF1ZSB0eXBlCisgIC8vLyBJZGVudGlmaWVySGFzaFRhYmxlLgorICB2b2lkICpJZGVudGlmaWVyTG9va3VwVGFibGUgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgT2Zmc2V0cyBvZiBpZGVudGlmaWVycyB0aGF0IHdlJ3JlIGdvaW5nIHRvIHByZWxvYWQgd2l0aGluCisgIC8vLyBJZGVudGlmaWVyVGFibGVEYXRhLgorICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gUHJlbG9hZElkZW50aWZpZXJPZmZzZXRzOworCisgIC8vID09PSBNYWNyb3MgPT09CisKKyAgLy8vIFxicmllZiBUaGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUgcHJlcHJvY2Vzc29yIGJsb2NrLCB3aGljaCBzdG9yZXMKKyAgLy8vIGFsbCBvZiB0aGUgbWFjcm8gZGVmaW5pdGlvbnMuCisgIGxsdm06OkJpdHN0cmVhbUN1cnNvciBNYWNyb0N1cnNvcjsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgbWFjcm9zIGluIHRoaXMgQVNUIGZpbGUuCisgIHVuc2lnbmVkIExvY2FsTnVtTWFjcm9zID0gMDsKKworICAvLy8gXGJyaWVmIE9mZnNldHMgb2YgbWFjcm9zIGluIHRoZSBwcmVwcm9jZXNzb3IgYmxvY2suCisgIC8vLworICAvLy8gVGhpcyBhcnJheSBpcyBpbmRleGVkIGJ5IHRoZSBtYWNybyBJRCAoLTEpLCBhbmQgcHJvdmlkZXMKKyAgLy8vIHRoZSBvZmZzZXQgaW50byB0aGUgcHJlcHJvY2Vzc29yIGJsb2NrIHdoZXJlIG1hY3JvIGRlZmluaXRpb25zIGFyZQorICAvLy8gc3RvcmVkLgorICBjb25zdCB1aW50MzJfdCAqTWFjcm9PZmZzZXRzID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIEJhc2UgbWFjcm8gSUQgZm9yIG1hY3JvcyBsb2NhbCB0byB0aGlzIG1vZHVsZS4KKyAgc2VyaWFsaXphdGlvbjo6TWFjcm9JRCBCYXNlTWFjcm9JRCA9IDA7CisKKyAgLy8vIFxicmllZiBSZW1hcHBpbmcgdGFibGUgZm9yIG1hY3JvIElEcyBpbiB0aGlzIG1vZHVsZS4KKyAgQ29udGludW91c1JhbmdlTWFwPHVpbnQzMl90LCBpbnQsIDI+IE1hY3JvUmVtYXA7CisKKyAgLy8vIFxicmllZiBUaGUgb2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB0aGUgc2V0IG9mIGRlZmluZWQgbWFjcm9zLgorICB1aW50NjRfdCBNYWNyb1N0YXJ0T2Zmc2V0ID0gMDsKKworICAvLyA9PT0gRGV0YWlsZWQgUHJlcHJvY2Vzc2luZ1JlY29yZCA9PT0KKworICAvLy8gXGJyaWVmIFRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSAob3B0aW9uYWwpIGRldGFpbGVkIHByZXByb2Nlc3NpbmcKKyAgLy8vIHJlY29yZCBibG9jay4KKyAgbGx2bTo6Qml0c3RyZWFtQ3Vyc29yIFByZXByb2Nlc3NvckRldGFpbEN1cnNvcjsKKworICAvLy8gXGJyaWVmIFRoZSBvZmZzZXQgb2YgdGhlIHN0YXJ0IG9mIHRoZSBwcmVwcm9jZXNzb3IgZGV0YWlsIGN1cnNvci4KKyAgdWludDY0X3QgUHJlcHJvY2Vzc29yRGV0YWlsU3RhcnRPZmZzZXQgPSAwOworCisgIC8vLyBcYnJpZWYgQmFzZSBwcmVwcm9jZXNzZWQgZW50aXR5IElEIGZvciBwcmVwcm9jZXNzZWQgZW50aXRpZXMgbG9jYWwgdG8KKyAgLy8vIHRoaXMgbW9kdWxlLgorICBzZXJpYWxpemF0aW9uOjpQcmVwcm9jZXNzZWRFbnRpdHlJRCBCYXNlUHJlcHJvY2Vzc2VkRW50aXR5SUQgPSAwOworCisgIC8vLyBcYnJpZWYgUmVtYXBwaW5nIHRhYmxlIGZvciBwcmVwcm9jZXNzZWQgZW50aXR5IElEcyBpbiB0aGlzIG1vZHVsZS4KKyAgQ29udGludW91c1JhbmdlTWFwPHVpbnQzMl90LCBpbnQsIDI+IFByZXByb2Nlc3NlZEVudGl0eVJlbWFwOworCisgIGNvbnN0IFBQRW50aXR5T2Zmc2V0ICpQcmVwcm9jZXNzZWRFbnRpdHlPZmZzZXRzID0gbnVsbHB0cjsKKyAgdW5zaWduZWQgTnVtUHJlcHJvY2Vzc2VkRW50aXRpZXMgPSAwOworCisgIC8vLyBcYnJpZWYgQmFzZSBJRCBmb3IgcHJlcHJvY2Vzc2VkIHNraXBwZWQgcmFuZ2VzIGxvY2FsIHRvIHRoaXMgbW9kdWxlLgorICB1bnNpZ25lZCBCYXNlUHJlcHJvY2Vzc2VkU2tpcHBlZFJhbmdlSUQgPSAwOworCisgIGNvbnN0IFBQU2tpcHBlZFJhbmdlICpQcmVwcm9jZXNzZWRTa2lwcGVkUmFuZ2VPZmZzZXRzID0gbnVsbHB0cjsKKyAgdW5zaWduZWQgTnVtUHJlcHJvY2Vzc2VkU2tpcHBlZFJhbmdlcyA9IDA7CisKKyAgLy8gPT09IEhlYWRlciBzZWFyY2ggaW5mb3JtYXRpb24gPT09CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGxvY2FsIEhlYWRlckZpbGVJbmZvIHN0cnVjdHVyZXMuCisgIHVuc2lnbmVkIExvY2FsTnVtSGVhZGVyRmlsZUluZm9zID0gMDsKKworICAvLy8gXGJyaWVmIEFjdHVhbCBkYXRhIGZvciB0aGUgb24tZGlzayBoYXNoIHRhYmxlIG9mIGhlYWRlciBmaWxlCisgIC8vLyBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIHBvaW50ZXIgcG9pbnRzIGludG8gYSBtZW1vcnkgYnVmZmVyLCB3aGVyZSB0aGUgb24tZGlzayBoYXNoCisgIC8vLyB0YWJsZSBmb3IgaGVhZGVyIGZpbGUgaW5mb3JtYXRpb24gYWN0dWFsbHkgbGl2ZXMuCisgIGNvbnN0IGNoYXIgKkhlYWRlckZpbGVJbmZvVGFibGVEYXRhID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFRoZSBvbi1kaXNrIGhhc2ggdGFibGUgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIG9mCisgIC8vLyB0aGUgaGVhZGVyIGZpbGVzLgorICB2b2lkICpIZWFkZXJGaWxlSW5mb1RhYmxlID0gbnVsbHB0cjsKKworICAvLyA9PT0gU3VibW9kdWxlIGluZm9ybWF0aW9uID09PSAgCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBzdWJtb2R1bGVzIGluIHRoaXMgbW9kdWxlLgorICB1bnNpZ25lZCBMb2NhbE51bVN1Ym1vZHVsZXMgPSAwOworICAKKyAgLy8vIFxicmllZiBCYXNlIHN1Ym1vZHVsZSBJRCBmb3Igc3VibW9kdWxlcyBsb2NhbCB0byB0aGlzIG1vZHVsZS4KKyAgc2VyaWFsaXphdGlvbjo6U3VibW9kdWxlSUQgQmFzZVN1Ym1vZHVsZUlEID0gMDsKKyAgCisgIC8vLyBcYnJpZWYgUmVtYXBwaW5nIHRhYmxlIGZvciBzdWJtb2R1bGUgSURzIGluIHRoaXMgbW9kdWxlLgorICBDb250aW51b3VzUmFuZ2VNYXA8dWludDMyX3QsIGludCwgMj4gU3VibW9kdWxlUmVtYXA7CisgIAorICAvLyA9PT0gU2VsZWN0b3JzID09PQorCisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBzZWxlY3RvcnMgbmV3IHRvIHRoaXMgZmlsZS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBTZWxlY3Rvck9mZnNldHMuCisgIHVuc2lnbmVkIExvY2FsTnVtU2VsZWN0b3JzID0gMDsKKworICAvLy8gXGJyaWVmIE9mZnNldHMgaW50byB0aGUgc2VsZWN0b3IgbG9va3VwIHRhYmxlJ3MgZGF0YSBhcnJheQorICAvLy8gd2hlcmUgZWFjaCBzZWxlY3RvciByZXNpZGVzLgorICBjb25zdCB1aW50MzJfdCAqU2VsZWN0b3JPZmZzZXRzID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIEJhc2Ugc2VsZWN0b3IgSUQgZm9yIHNlbGVjdG9ycyBsb2NhbCB0byB0aGlzIG1vZHVsZS4KKyAgc2VyaWFsaXphdGlvbjo6U2VsZWN0b3JJRCBCYXNlU2VsZWN0b3JJRCA9IDA7CisKKyAgLy8vIFxicmllZiBSZW1hcHBpbmcgdGFibGUgZm9yIHNlbGVjdG9yIElEcyBpbiB0aGlzIG1vZHVsZS4KKyAgQ29udGludW91c1JhbmdlTWFwPHVpbnQzMl90LCBpbnQsIDI+IFNlbGVjdG9yUmVtYXA7CisKKyAgLy8vIFxicmllZiBBIHBvaW50ZXIgdG8gdGhlIGNoYXJhY3RlciBkYXRhIHRoYXQgY29tcHJpc2VzIHRoZSBzZWxlY3RvciB0YWJsZQorICAvLy8KKyAgLy8vIFRoZSBTZWxlY3Rvck9mZnNldHMgdGFibGUgcmVmZXJzIGludG8gdGhpcyBtZW1vcnkuCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKlNlbGVjdG9yTG9va3VwVGFibGVEYXRhID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIEEgcG9pbnRlciB0byBhbiBvbi1kaXNrIGhhc2ggdGFibGUgb2Ygb3BhcXVlIHR5cGUKKyAgLy8vIEFTVFNlbGVjdG9yTG9va3VwVGFibGUuCisgIC8vLworICAvLy8gVGhpcyBoYXNoIHRhYmxlIHByb3ZpZGVzIHRoZSBJRHMgb2YgYWxsIHNlbGVjdG9ycywgYW5kIHRoZSBhc3NvY2lhdGVkCisgIC8vLyBpbnN0YW5jZSBhbmQgZmFjdG9yeSBtZXRob2RzLgorICB2b2lkICpTZWxlY3Rvckxvb2t1cFRhYmxlID0gbnVsbHB0cjsKKworICAvLyA9PT0gRGVjbGFyYXRpb25zID09PQorCisgIC8vLyBEZWNsc0N1cnNvciAtIFRoaXMgaXMgYSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBERUNMU19CTE9DSyBibG9jay4gSXQKKyAgLy8vIGhhcyByZWFkIGFsbCB0aGUgYWJicmV2aWF0aW9ucyBhdCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIGFuZCBpcyByZWFkeSB0bworICAvLy8ganVtcCBhcm91bmQgd2l0aCB0aGVzZSBpbiBjb250ZXh0LgorICBsbHZtOjpCaXRzdHJlYW1DdXJzb3IgRGVjbHNDdXJzb3I7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGRlY2xhcmF0aW9ucyBpbiB0aGlzIEFTVCBmaWxlLgorICB1bnNpZ25lZCBMb2NhbE51bURlY2xzID0gMDsKKworICAvLy8gXGJyaWVmIE9mZnNldCBvZiBlYWNoIGRlY2xhcmF0aW9uIHdpdGhpbiB0aGUgYml0c3RyZWFtLCBpbmRleGVkCisgIC8vLyBieSB0aGUgZGVjbGFyYXRpb24gSUQgKC0xKS4KKyAgY29uc3QgRGVjbE9mZnNldCAqRGVjbE9mZnNldHMgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgQmFzZSBkZWNsYXJhdGlvbiBJRCBmb3IgZGVjbGFyYXRpb25zIGxvY2FsIHRvIHRoaXMgbW9kdWxlLgorICBzZXJpYWxpemF0aW9uOjpEZWNsSUQgQmFzZURlY2xJRCA9IDA7CisKKyAgLy8vIFxicmllZiBSZW1hcHBpbmcgdGFibGUgZm9yIGRlY2xhcmF0aW9uIElEcyBpbiB0aGlzIG1vZHVsZS4KKyAgQ29udGludW91c1JhbmdlTWFwPHVpbnQzMl90LCBpbnQsIDI+IERlY2xSZW1hcDsKKworICAvLy8gXGJyaWVmIE1hcHBpbmcgZnJvbSB0aGUgbW9kdWxlIGZpbGVzIHRoYXQgdGhpcyBtb2R1bGUgZmlsZSBkZXBlbmRzIG9uCisgIC8vLyB0byB0aGUgYmFzZSBkZWNsYXJhdGlvbiBJRCBmb3IgdGhhdCBtb2R1bGUgYXMgaXQgaXMgdW5kZXJzdG9vZCB3aXRoaW4gdGhpcworICAvLy8gbW9kdWxlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgZWZmZWN0aXZlbHkgYSByZXZlcnNlIGdsb2JhbC10by1sb2NhbCBtYXBwaW5nIGZvciBkZWNsYXJhdGlvbgorICAvLy8gSURzLCBzbyB0aGF0IHdlIGNhbiBpbnRlcnByZXQgYSB0cnVlIGdsb2JhbCBJRCAoZm9yIHRoaXMgdHJhbnNsYXRpb24gdW5pdCkKKyAgLy8vIGFzIGEgbG9jYWwgSUQgKGZvciB0aGlzIG1vZHVsZSBmaWxlKS4KKyAgbGx2bTo6RGVuc2VNYXA8TW9kdWxlRmlsZSAqLCBzZXJpYWxpemF0aW9uOjpEZWNsSUQ+IEdsb2JhbFRvTG9jYWxEZWNsSURzOworCisgIC8vLyBcYnJpZWYgQXJyYXkgb2YgZmlsZS1sZXZlbCBEZWNsSURzIHNvcnRlZCBieSBmaWxlLgorICBjb25zdCBzZXJpYWxpemF0aW9uOjpEZWNsSUQgKkZpbGVTb3J0ZWREZWNscyA9IG51bGxwdHI7CisgIHVuc2lnbmVkIE51bUZpbGVTb3J0ZWREZWNscyA9IDA7CisKKyAgLy8vIFxicmllZiBBcnJheSBvZiBjYXRlZ29yeSBsaXN0IGxvY2F0aW9uIGluZm9ybWF0aW9uIHdpdGhpbiB0aGlzIAorICAvLy8gbW9kdWxlIGZpbGUsIHNvcnRlZCBieSB0aGUgZGVmaW5pdGlvbiBJRC4KKyAgY29uc3Qgc2VyaWFsaXphdGlvbjo6T2JqQ0NhdGVnb3JpZXNJbmZvICpPYmpDQ2F0ZWdvcmllc01hcCA9IG51bGxwdHI7CisgIAorICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgcmVkZWNsYXJhdGlvbiBpbmZvIGVudHJpZXMgaW4gT2JqQ0NhdGVnb3JpZXNNYXAuCisgIHVuc2lnbmVkIExvY2FsTnVtT2JqQ0NhdGVnb3JpZXNJbk1hcCA9IDA7CisgIAorICAvLy8gXGJyaWVmIFRoZSBPYmplY3RpdmUtQyBjYXRlZ29yeSBsaXN0cyBmb3IgY2F0ZWdvcmllcyBrbm93biB0byB0aGlzCisgIC8vLyBtb2R1bGUuCisgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCAxPiBPYmpDQ2F0ZWdvcmllczsKKworICAvLyA9PT0gVHlwZXMgPT09CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHR5cGVzIGluIHRoaXMgQVNUIGZpbGUuCisgIHVuc2lnbmVkIExvY2FsTnVtVHlwZXMgPSAwOworCisgIC8vLyBcYnJpZWYgT2Zmc2V0IG9mIGVhY2ggdHlwZSB3aXRoaW4gdGhlIGJpdHN0cmVhbSwgaW5kZXhlZCBieSB0aGUKKyAgLy8vIHR5cGUgSUQsIG9yIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhIFR5cGUqLgorICBjb25zdCB1aW50MzJfdCAqVHlwZU9mZnNldHMgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgQmFzZSB0eXBlIElEIGZvciB0eXBlcyBsb2NhbCB0byB0aGlzIG1vZHVsZSBhcyByZXByZXNlbnRlZCBpbgorICAvLy8gdGhlIGdsb2JhbCB0eXBlIElEIHNwYWNlLgorICBzZXJpYWxpemF0aW9uOjpUeXBlSUQgQmFzZVR5cGVJbmRleCA9IDA7CisKKyAgLy8vIFxicmllZiBSZW1hcHBpbmcgdGFibGUgZm9yIHR5cGUgSURzIGluIHRoaXMgbW9kdWxlLgorICBDb250aW51b3VzUmFuZ2VNYXA8dWludDMyX3QsIGludCwgMj4gVHlwZVJlbWFwOworCisgIC8vID09PSBNaXNjZWxsYW5lb3VzID09PQorCisgIC8vLyBcYnJpZWYgRGlhZ25vc3RpYyBJRHMgYW5kIHRoZWlyIG1hcHBpbmdzIHRoYXQgdGhlIHVzZXIgY2hhbmdlZC4KKyAgU21hbGxWZWN0b3I8dWludDY0X3QsIDg+IFByYWdtYURpYWdNYXBwaW5nczsKKworICAvLy8gXGJyaWVmIExpc3Qgb2YgbW9kdWxlcyB3aGljaCBkZXBlbmQgb24gdGhpcyBtb2R1bGUKKyAgbGx2bTo6U2V0VmVjdG9yPE1vZHVsZUZpbGUgKj4gSW1wb3J0ZWRCeTsKKworICAvLy8gXGJyaWVmIExpc3Qgb2YgbW9kdWxlcyB3aGljaCB0aGlzIG1vZHVsZSBkZXBlbmRzIG9uCisgIGxsdm06OlNldFZlY3RvcjxNb2R1bGVGaWxlICo+IEltcG9ydHM7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIG1vZHVsZSB3YXMgZGlyZWN0bHkgaW1wb3J0ZWQgYXQKKyAgLy8vIGFueSBwb2ludCBkdXJpbmcgdHJhbnNsYXRpb24uCisgIGJvb2wgaXNEaXJlY3RseUltcG9ydGVkKCkgY29uc3QgeyByZXR1cm4gRGlyZWN0bHlJbXBvcnRlZDsgfQorCisgIC8vLyBcYnJpZWYgSXMgdGhpcyBhIG1vZHVsZSBmaWxlIGZvciBhIG1vZHVsZSAocmF0aGVyIHRoYW4gYSBQQ0ggb3Igc2ltaWxhcikuCisgIGJvb2wgaXNNb2R1bGUoKSBjb25zdCB7CisgICAgcmV0dXJuIEtpbmQgPT0gTUtfSW1wbGljaXRNb2R1bGUgfHwgS2luZCA9PSBNS19FeHBsaWNpdE1vZHVsZSB8fAorICAgICAgICAgICBLaW5kID09IE1LX1ByZWJ1aWx0TW9kdWxlOworICB9CisKKyAgLy8vIFxicmllZiBEdW1wIGRlYnVnZ2luZyBvdXRwdXQgZm9yIHRoaXMgbW9kdWxlLgorICB2b2lkIGR1bXAoKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBzZXJpYWxpemF0aW9uCisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vTW9kdWxlRmlsZUV4dGVuc2lvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9Nb2R1bGVGaWxlRXh0ZW5zaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiZGNlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vTW9kdWxlRmlsZUV4dGVuc2lvbi5oCkBAIC0wLDAgKzEsMTQ5IEBACisvLz09PS0tIE1vZHVsZUZpbGVFeHRlbnNpb24uaCAtIE1vZHVsZSBGaWxlIEV4dGVuc2lvbnMgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU0VSSUFMSVpBVElPTl9NT0RVTEVGSUxFRVhURU5TSU9OX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TRVJJQUxJWkFUSU9OX01PRFVMRUZJTEVFWFRFTlNJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQml0c3RyZWFtQ3Vyc29yOworY2xhc3MgQml0c3RyZWFtV3JpdGVyOworY2xhc3MgaGFzaF9jb2RlOworY2xhc3MgcmF3X29zdHJlYW07Cit9CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFTVFJlYWRlcjsKK2NsYXNzIEFTVFdyaXRlcjsKK2NsYXNzIFNlbWE7CisgIAorbmFtZXNwYWNlIHNlcmlhbGl6YXRpb24geworICBjbGFzcyBNb2R1bGVGaWxlOworfSAvLyBlbmQgbmFtZXNwYWNlIHNlcmlhbGl6YXRpb24KKworLy8vIE1ldGFkYXRhIGZvciBhIG1vZHVsZSBmaWxlIGV4dGVuc2lvbi4KK3N0cnVjdCBNb2R1bGVGaWxlRXh0ZW5zaW9uTWV0YWRhdGEgeworICAvLy8gVGhlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGlzIHBhcnRpY3VsYXIgZXh0ZW5zaW9uIGJsb2NrIHdpdGhpbgorICAvLy8gdGhlIHJlc3VsdGluZyBtb2R1bGUgZmlsZS4gSXQgc2hvdWxkIGJlIHVuaXF1ZSB0byB0aGUgcGFydGljdWxhcgorICAvLy8gZXh0ZW5zaW9uLCBiZWNhdXNlIHRoaXMgbmFtZSB3aWxsIGJlIHVzZWQgdG8gbWF0Y2ggdGhlIG5hbWUgb2YKKyAgLy8vIGFuIGV4dGVuc2lvbiBibG9jayB0byB0aGUgYXBwcm9wcmlhdGUgcmVhZGVyLgorICBzdGQ6OnN0cmluZyBCbG9ja05hbWU7CisKKyAgLy8vIFRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBleHRlbnNpb24gZGF0YS4KKyAgdW5zaWduZWQgTWFqb3JWZXJzaW9uOworCisgIC8vLyBUaGUgbWlub3IgdmVyc2lvbiBvZiB0aGUgZXh0ZW5zaW9uIGRhdGEuCisgIHVuc2lnbmVkIE1pbm9yVmVyc2lvbjsKKworICAvLy8gQSBzdHJpbmcgY29udGFpbmluZyBhZGRpdGlvbmFsIHVzZXIgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlCisgIC8vLyBzdG9yZWQgd2l0aCB0aGUgbWV0YWRhdGEuCisgIHN0ZDo6c3RyaW5nIFVzZXJJbmZvOworfTsKKworY2xhc3MgTW9kdWxlRmlsZUV4dGVuc2lvblJlYWRlcjsKK2NsYXNzIE1vZHVsZUZpbGVFeHRlbnNpb25Xcml0ZXI7CisKKy8vLyBBbiBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgZGVzY3JpYmVzIGEgY3VzdG9tIGV4dGVuc2lvbiB0byB0aGUKKy8vLyBtb2R1bGUvcHJlY29tcGlsZWQgaGVhZGVyIGZpbGUgZm9ybWF0LgorLy8vCisvLy8gQSBtb2R1bGUgZmlsZSBleHRlbnNpb24gY2FuIGludHJvZHVjZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGludG8KKy8vLyBjb21waWxlZCBtb2R1bGUgZmlsZXMgKC5wY20pIGFuZCBwcmVjb21waWxlZCBoZWFkZXJzICgucGNoKSB2aWEgYQorLy8vIGN1c3RvbSB3cml0ZXIgdGhhdCBjYW4gdGhlbiBiZSBhY2Nlc3NlZCB2aWEgYSBjdXN0b20gcmVhZGVyIHdoZW4KKy8vLyB0aGUgbW9kdWxlIGZpbGUgb3IgcHJlY29tcGlsZWQgaGVhZGVyIGlzIGxvYWRlZC4KK2NsYXNzIE1vZHVsZUZpbGVFeHRlbnNpb24geworcHVibGljOgorICB2aXJ0dWFsIH5Nb2R1bGVGaWxlRXh0ZW5zaW9uKCk7CisKKyAgLy8vIFJldHJpZXZlcyB0aGUgbWV0YWRhdGEgZm9yIHRoaXMgbW9kdWxlIGZpbGUgZXh0ZW5zaW9uLgorICB2aXJ0dWFsIE1vZHVsZUZpbGVFeHRlbnNpb25NZXRhZGF0YSBnZXRFeHRlbnNpb25NZXRhZGF0YSgpIGNvbnN0ID0gMDsKKworICAvLy8gSGFzaCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJlc2VuY2Ugb2YgdGhpcyBleHRlbnNpb24gaW50byB0aGUKKyAgLy8vIG1vZHVsZSBoYXNoIGNvZGUuCisgIC8vLworICAvLy8gVGhlIG1vZHVsZSBoYXNoIGNvZGUgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgdmFyaWFudHMKKyAgLy8vIG9mIGEgbW9kdWxlIHRoYXQgYXJlIGluY29tcGF0aWJsZS4gSWYgdGhlIHByZXNlbmNlLCBhYnNlbmNlLCBvcgorICAvLy8gdmVyc2lvbiBvZiB0aGUgbW9kdWxlIGZpbGUgZXh0ZW5zaW9uIHNob3VsZCBmb3JjZSB0aGUgY3JlYXRpb24KKyAgLy8vIG9mIGEgc2VwYXJhdGUgc2V0IG9mIG1vZHVsZSBmaWxlcywgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8KKyAgLy8vIGNvbWJpbmUgdGhhdCBkaXN0aW5ndWlzaGluZyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBtb2R1bGUgaGFzaAorICAvLy8gY29kZS4KKyAgLy8vCisgIC8vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIHNpbXBseSByZXR1cm5zIHRoZQorICAvLy8gaGFzaCBjb2RlIGFzIGdpdmVuLCBzbyB0aGUgcHJlc2VuY2UvYWJzZW5jZSBvZiB0aGlzIGV4dGVuc2lvbgorICAvLy8gZG9lcyBub3QgZGlzdGluZ3Vpc2ggbW9kdWxlIGZpbGVzLgorICB2aXJ0dWFsIGxsdm06Omhhc2hfY29kZSBoYXNoRXh0ZW5zaW9uKGxsdm06Omhhc2hfY29kZSBjKSBjb25zdDsKKworICAvLy8gQ3JlYXRlIGEgbmV3IG1vZHVsZSBmaWxlIGV4dGVuc2lvbiB3cml0ZXIsIHdoaWNoIHdpbGwgYmUKKyAgLy8vIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nIHRoZSBleHRlbnNpb24gY29udGVudHMgaW50byBhIHBhcnRpY3VsYXIKKyAgLy8vIG1vZHVsZSBmaWxlLgorICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGVGaWxlRXh0ZW5zaW9uV3JpdGVyPgorICBjcmVhdGVFeHRlbnNpb25Xcml0ZXIoQVNUV3JpdGVyICZXcml0ZXIpID0gMDsKKworICAvLy8gQ3JlYXRlIGEgbmV3IG1vZHVsZSBmaWxlIGV4dGVuc2lvbiByZWFkZXIsIGdpdmVuIHRoZQorICAvLy8gbWV0YWRhdGEgcmVhZCBmcm9tIHRoZSBibG9jayBhbmQgdGhlIGN1cnNvciBpbnRvIHRoZSBleHRlbnNpb24KKyAgLy8vIGJsb2NrLgorICAvLy8KKyAgLy8vIE1heSByZXR1cm4gbnVsbCB0byBpbmRpY2F0ZSB0aGF0IGFuIGV4dGVuc2lvbiBibG9jayB3aXRoIHRoZQorICAvLy8gZ2l2ZW4gbWV0YWRhdGEgY2Fubm90IGJlIHJlYWQuCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPE1vZHVsZUZpbGVFeHRlbnNpb25SZWFkZXI+CisgIGNyZWF0ZUV4dGVuc2lvblJlYWRlcihjb25zdCBNb2R1bGVGaWxlRXh0ZW5zaW9uTWV0YWRhdGEgJk1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQVNUUmVhZGVyICZSZWFkZXIsIHNlcmlhbGl6YXRpb246Ok1vZHVsZUZpbGUgJk1vZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkJpdHN0cmVhbUN1cnNvciAmU3RyZWFtKSA9IDA7Cit9OworCisvLy8gQWJzdHJhY3QgYmFzZSBjbGFzcyB0aGF0IHdyaXRlcyBhIG1vZHVsZSBmaWxlIGV4dGVuc2lvbiBibG9jayBpbnRvCisvLy8gYSBtb2R1bGUgZmlsZS4KK2NsYXNzIE1vZHVsZUZpbGVFeHRlbnNpb25Xcml0ZXIgeworICBNb2R1bGVGaWxlRXh0ZW5zaW9uICpFeHRlbnNpb247CisKK3Byb3RlY3RlZDoKKyAgTW9kdWxlRmlsZUV4dGVuc2lvbldyaXRlcihNb2R1bGVGaWxlRXh0ZW5zaW9uICpFeHRlbnNpb24pCisgICAgOiBFeHRlbnNpb24oRXh0ZW5zaW9uKSB7IH0KKworcHVibGljOgorICB2aXJ0dWFsIH5Nb2R1bGVGaWxlRXh0ZW5zaW9uV3JpdGVyKCk7CisKKyAgLy8vIFJldHJpZXZlIHRoZSBtb2R1bGUgZmlsZSBleHRlbnNpb24gd2l0aCB3aGljaCB0aGlzIHdyaXRlciBpcworICAvLy8gYXNzb2NpYXRlZC4KKyAgTW9kdWxlRmlsZUV4dGVuc2lvbiAqZ2V0RXh0ZW5zaW9uKCkgY29uc3QgeyByZXR1cm4gRXh0ZW5zaW9uOyB9CisKKyAgLy8vIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGUgZXh0ZW5zaW9uIGJsb2NrIGludG8gdGhlIGdpdmVuIGJpdHN0cmVhbS4KKyAgLy8vCisgIC8vLyBSZXNwb25zaWJsZSBmb3Igd3JpdGluZyB0aGUgY29udGVudHMgb2YgdGhlIGV4dGVuc2lvbiBpbnRvIHRoZQorICAvLy8gZ2l2ZW4gc3RyZWFtLiBBbGwgb2YgdGhlIGNvbnRlbnRzIHNob3VsZCBiZSB3cml0dGVuIGludG8gY3VzdG9tCisgIC8vLyByZWNvcmRzIHdpdGggSURzID49IEZJUlNUX0VYVEVOU0lPTl9SRUNPUkRfSUQuCisgIHZpcnR1YWwgdm9pZCB3cml0ZUV4dGVuc2lvbkNvbnRlbnRzKFNlbWEgJlNlbWFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkJpdHN0cmVhbVdyaXRlciAmU3RyZWFtKSA9IDA7Cit9OworCisvLy8gQWJzdHJhY3QgYmFzZSBjbGFzcyB0aGF0IHJlYWRzIGEgbW9kdWxlIGZpbGUgZXh0ZW5zaW9uIGJsb2NrIGZyb20KKy8vLyBhIG1vZHVsZSBmaWxlLgorLy8vCisvLy8gU3ViY2xhc3NlcyAKK2NsYXNzIE1vZHVsZUZpbGVFeHRlbnNpb25SZWFkZXIgeworICBNb2R1bGVGaWxlRXh0ZW5zaW9uICpFeHRlbnNpb247CisKK3Byb3RlY3RlZDoKKyAgTW9kdWxlRmlsZUV4dGVuc2lvblJlYWRlcihNb2R1bGVGaWxlRXh0ZW5zaW9uICpFeHRlbnNpb24pCisgICAgOiBFeHRlbnNpb24oRXh0ZW5zaW9uKSB7IH0KKworcHVibGljOgorICAvLy8gUmV0cmlldmUgdGhlIG1vZHVsZSBmaWxlIGV4dGVuc2lvbiB3aXRoIHdoaWNoIHRoaXMgcmVhZGVyIGlzCisgIC8vLyBhc3NvY2lhdGVkLgorICBNb2R1bGVGaWxlRXh0ZW5zaW9uICpnZXRFeHRlbnNpb24oKSBjb25zdCB7IHJldHVybiBFeHRlbnNpb247IH0KKworICB2aXJ0dWFsIH5Nb2R1bGVGaWxlRXh0ZW5zaW9uUmVhZGVyKCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfRlJPTlRFTkRfTU9EVUxFRklMRUVYVEVOU0lPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL01vZHVsZU1hbmFnZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vTW9kdWxlTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0N2E2OTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL01vZHVsZU1hbmFnZXIuaApAQCAtMCwwICsxLDMyOCBAQAorLy89PT0tIE1vZHVsZU1hbmFnZXIuY3BwIC0gTW9kdWxlIE1hbmFnZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIE1vZHVsZU1hbmFnZXIgY2xhc3MsIHdoaWNoIG1hbmFnZXMgYSBzZXQgb2YgbG9hZGVkCisvLyAgbW9kdWxlcyBmb3IgdGhlIEFTVFJlYWRlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU0VSSUFMSVpBVElPTl9NT0RVTEVNQU5BR0VSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TRVJJQUxJWkFUSU9OX01PRFVMRU1BTkFHRVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL01vZHVsZS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VyaWFsaXphdGlvbi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEZpbGVFbnRyeTsKK2NsYXNzIEZpbGVNYW5hZ2VyOworY2xhc3MgR2xvYmFsTW9kdWxlSW5kZXg7CitjbGFzcyBIZWFkZXJTZWFyY2g7CitjbGFzcyBNZW1vcnlCdWZmZXJDYWNoZTsKK2NsYXNzIE1vZHVsZU1hcDsKK2NsYXNzIFBDSENvbnRhaW5lclJlYWRlcjsKKworbmFtZXNwYWNlIHNlcmlhbGl6YXRpb24geworCisvLy8gXGJyaWVmIE1hbmFnZXMgdGhlIHNldCBvZiBtb2R1bGVzIGxvYWRlZCBieSBhbiBBU1QgcmVhZGVyLgorY2xhc3MgTW9kdWxlTWFuYWdlciB7CisgIC8vLyBcYnJpZWYgVGhlIGNoYWluIG9mIEFTVCBmaWxlcywgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHdlIHN0YXJ0ZWQgdG8gbG9hZAorICAvLy8gdGhlbSAodGhpcyBvcmRlciBpc24ndCByZWFsbHkgdXNlZnVsIGZvciBhbnl0aGluZykuCisgIFNtYWxsVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGVGaWxlPiwgMj4gQ2hhaW47CisKKyAgLy8vIFxicmllZiBUaGUgY2hhaW4gb2Ygbm9uLW1vZHVsZSBQQ0ggZmlsZXMuIFRoZSBmaXJzdCBlbnRyeSBpcyB0aGUgb25lIG5hbWVkCisgIC8vLyBieSB0aGUgdXNlciwgdGhlIGxhc3Qgb25lIGlzIHRoZSBvbmUgdGhhdCBkb2Vzbid0IGRlcGVuZCBvbiBhbnl0aGluZworICAvLy8gZnVydGhlci4KKyAgU21hbGxWZWN0b3I8TW9kdWxlRmlsZSAqLCAyPiBQQ0hDaGFpbjsKKworICAvLyBcYnJpZWYgVGhlIHJvb3RzIG9mIHRoZSBkZXBlbmRlbmN5IERBRyBvZiBBU1QgZmlsZXMuIFRoaXMgaXMgdXNlZAorICAvLyB0byBpbXBsZW1lbnQgc2hvcnQtY2lyY3VpdGluZyBsb2dpYyB3aGVuIHJ1bm5pbmcgREZTIG92ZXIgdGhlIGRlcGVuZGVuY2llcy4KKyAgU21hbGxWZWN0b3I8TW9kdWxlRmlsZSAqLCAyPiBSb290czsKKworICAvLy8gXGJyaWVmIEFsbCBsb2FkZWQgbW9kdWxlcywgaW5kZXhlZCBieSBuYW1lLgorICBsbHZtOjpEZW5zZU1hcDxjb25zdCBGaWxlRW50cnkgKiwgTW9kdWxlRmlsZSAqPiBNb2R1bGVzOworCisgIC8vLyBcYnJpZWYgRmlsZU1hbmFnZXIgdGhhdCBoYW5kbGVzIHRyYW5zbGF0aW5nIGJldHdlZW4gZmlsZW5hbWVzIGFuZAorICAvLy8gRmlsZUVudHJ5ICouCisgIEZpbGVNYW5hZ2VyICZGaWxlTWdyOworCisgIC8vLyBDYWNoZSBvZiBQQ00gZmlsZXMuCisgIEludHJ1c2l2ZVJlZkNudFB0cjxNZW1vcnlCdWZmZXJDYWNoZT4gUENNQ2FjaGU7CisKKyAgLy8vIFxicmllZiBLbm93cyBob3cgdG8gdW53cmFwIG1vZHVsZSBjb250YWluZXJzLgorICBjb25zdCBQQ0hDb250YWluZXJSZWFkZXIgJlBDSENvbnRhaW5lclJkcjsKKworICAvLy8gXGJyaWVmIFByZXByb2Nlc3NvcidzIEhlYWRlclNlYXJjaEluZm8gY29udGFpbmluZyB0aGUgbW9kdWxlIG1hcC4KKyAgY29uc3QgSGVhZGVyU2VhcmNoICZIZWFkZXJTZWFyY2hJbmZvOworCisgIC8vLyBcYnJpZWYgQSBsb29rdXAgb2YgaW4tbWVtb3J5ICh2aXJ0dWFsIGZpbGUpIGJ1ZmZlcnMKKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgRmlsZUVudHJ5ICosIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+PgorICAgICAgSW5NZW1vcnlCdWZmZXJzOworCisgIC8vLyBcYnJpZWYgVGhlIHZpc2l0YXRpb24gb3JkZXIuCisgIFNtYWxsVmVjdG9yPE1vZHVsZUZpbGUgKiwgND4gVmlzaXRPcmRlcjsKKyAgICAgIAorICAvLy8gXGJyaWVmIFRoZSBsaXN0IG9mIG1vZHVsZSBmaWxlcyB0aGF0IGJvdGggd2UgYW5kIHRoZSBnbG9iYWwgbW9kdWxlIGluZGV4CisgIC8vLyBrbm93IGFib3V0LgorICAvLy8KKyAgLy8vIEVpdGhlciB0aGUgZ2xvYmFsIGluZGV4IG9yIHRoZSBtb2R1bGUgbWFuYWdlciBtYXkgaGF2ZSBtb2R1bGVzIHRoYXQgdGhlCisgIC8vLyBvdGhlciBkb2VzIG5vdCBrbm93IGFib3V0LCBiZWNhdXNlIHRoZSBnbG9iYWwgaW5kZXggY2FuIGJlIG91dC1vZi1kYXRlCisgIC8vLyAoaW4gd2hpY2ggY2FzZSB0aGUgbW9kdWxlIG1hbmFnZXIgY291bGQgaGF2ZSBtb2R1bGVzIGl0IGRvZXMgbm90KSBhbmQKKyAgLy8vIHRoaXMgcGFydGljdWxhciB0cmFuc2xhdGlvbiB1bml0IG1pZ2h0IG5vdCBoYXZlIGxvYWRlZCBhbGwgb2YgdGhlIG1vZHVsZXMKKyAgLy8vIGtub3duIHRvIHRoZSBnbG9iYWwgaW5kZXguCisgIFNtYWxsVmVjdG9yPE1vZHVsZUZpbGUgKiwgND4gTW9kdWxlc0luQ29tbW9uV2l0aEdsb2JhbEluZGV4OworCisgIC8vLyBcYnJpZWYgVGhlIGdsb2JhbCBtb2R1bGUgaW5kZXgsIGlmIG9uZSBpcyBhdHRhY2hlZC4KKyAgLy8vCisgIC8vLyBUaGUgZ2xvYmFsIG1vZHVsZSBpbmRleCB3aWxsIGFjdHVhbGx5IGJlIG93bmVkIGJ5IHRoZSBBU1RSZWFkZXI7IHRoaXMgaXMKKyAgLy8vIGp1c3QgYW4gbm9uLW93bmluZyBwb2ludGVyLgorICBHbG9iYWxNb2R1bGVJbmRleCAqR2xvYmFsSW5kZXggPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgU3RhdGUgdXNlZCBieSB0aGUgInZpc2l0IiBvcGVyYXRpb24gdG8gYXZvaWQgbWFsbG9jIHRyYWZmaWMgaW4KKyAgLy8vIGNhbGxzIHRvIHZpc2l0KCkuCisgIHN0cnVjdCBWaXNpdFN0YXRlIHsKKyAgICBleHBsaWNpdCBWaXNpdFN0YXRlKHVuc2lnbmVkIE4pIDogVmlzaXROdW1iZXIoTiwgMCkgeworICAgICAgU3RhY2sucmVzZXJ2ZShOKTsKKyAgICB9CisKKyAgICB+VmlzaXRTdGF0ZSgpIHsKKyAgICAgIGRlbGV0ZSBOZXh0U3RhdGU7CisgICAgfQorCisgICAgLy8vIFxicmllZiBUaGUgc3RhY2sgdXNlZCB3aGVuIG1hcmtpbmcgdGhlIGltcG9ydHMgb2YgYSBwYXJ0aWN1bGFyIG1vZHVsZQorICAgIC8vLyBhcyBub3QtdG8tYmUtdmlzaXRlZC4KKyAgICBTbWFsbFZlY3RvcjxNb2R1bGVGaWxlICosIDQ+IFN0YWNrOworCisgICAgLy8vIFxicmllZiBUaGUgdmlzaXQgbnVtYmVyIG9mIGVhY2ggbW9kdWxlIGZpbGUsIHdoaWNoIGluZGljYXRlcyB3aGVuCisgICAgLy8vIHRoaXMgbW9kdWxlIGZpbGUgd2FzIGxhc3QgdmlzaXRlZC4KKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gVmlzaXROdW1iZXI7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBuZXh0IHZpc2l0IG51bWJlciB0byB1c2UgdG8gbWFyayB2aXNpdGVkIG1vZHVsZSBmaWxlcy4KKyAgICB1bnNpZ25lZCBOZXh0VmlzaXROdW1iZXIgPSAxOworCisgICAgLy8vIFxicmllZiBUaGUgbmV4dCB2aXNpdCBzdGF0ZS4KKyAgICBWaXNpdFN0YXRlICpOZXh0U3RhdGUgPSBudWxscHRyOworICB9OworCisgIC8vLyBcYnJpZWYgVGhlIGZpcnN0IHZpc2l0KCkgc3RhdGUgaW4gdGhlIGNoYWluLgorICBWaXNpdFN0YXRlICpGaXJzdFZpc2l0U3RhdGUgPSBudWxscHRyOworCisgIFZpc2l0U3RhdGUgKmFsbG9jYXRlVmlzaXRTdGF0ZSgpOworICB2b2lkIHJldHVyblZpc2l0U3RhdGUoVmlzaXRTdGF0ZSAqU3RhdGUpOworCitwdWJsaWM6CisgIHVzaW5nIE1vZHVsZUl0ZXJhdG9yID0gbGx2bTo6cG9pbnRlZV9pdGVyYXRvcjwKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlRmlsZT4+OjppdGVyYXRvcj47CisgIHVzaW5nIE1vZHVsZUNvbnN0SXRlcmF0b3IgPSBsbHZtOjpwb2ludGVlX2l0ZXJhdG9yPAorICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGVGaWxlPj46OmNvbnN0X2l0ZXJhdG9yPjsKKyAgdXNpbmcgTW9kdWxlUmV2ZXJzZUl0ZXJhdG9yID0gbGx2bTo6cG9pbnRlZV9pdGVyYXRvcjwKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlRmlsZT4+OjpyZXZlcnNlX2l0ZXJhdG9yPjsKKyAgdXNpbmcgTW9kdWxlT2Zmc2V0ID0gc3RkOjpwYWlyPHVpbnQzMl90LCBTdHJpbmdSZWY+OworCisgIGV4cGxpY2l0IE1vZHVsZU1hbmFnZXIoRmlsZU1hbmFnZXIgJkZpbGVNZ3IsIE1lbW9yeUJ1ZmZlckNhY2hlICZQQ01DYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQQ0hDb250YWluZXJSZWFkZXIgJlBDSENvbnRhaW5lclJkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIZWFkZXJTZWFyY2ggJkhlYWRlclNlYXJjaEluZm8pOworICB+TW9kdWxlTWFuYWdlcigpOworCisgIC8vLyBcYnJpZWYgRm9yd2FyZCBpdGVyYXRvciB0byB0cmF2ZXJzZSBhbGwgbG9hZGVkIG1vZHVsZXMuCisgIE1vZHVsZUl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gQ2hhaW4uYmVnaW4oKTsgfQorCisgIC8vLyBcYnJpZWYgRm9yd2FyZCBpdGVyYXRvciBlbmQtcG9pbnQgdG8gdHJhdmVyc2UgYWxsIGxvYWRlZCBtb2R1bGVzCisgIE1vZHVsZUl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIENoYWluLmVuZCgpOyB9CisgIAorICAvLy8gXGJyaWVmIENvbnN0IGZvcndhcmQgaXRlcmF0b3IgdG8gdHJhdmVyc2UgYWxsIGxvYWRlZCBtb2R1bGVzLgorICBNb2R1bGVDb25zdEl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gQ2hhaW4uYmVnaW4oKTsgfQorCisgIC8vLyBcYnJpZWYgQ29uc3QgZm9yd2FyZCBpdGVyYXRvciBlbmQtcG9pbnQgdG8gdHJhdmVyc2UgYWxsIGxvYWRlZCBtb2R1bGVzCisgIE1vZHVsZUNvbnN0SXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gQ2hhaW4uZW5kKCk7IH0KKyAgCisgIC8vLyBcYnJpZWYgUmV2ZXJzZSBpdGVyYXRvciB0byB0cmF2ZXJzZSBhbGwgbG9hZGVkIG1vZHVsZXMuCisgIE1vZHVsZVJldmVyc2VJdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiBDaGFpbi5yYmVnaW4oKTsgfQorCisgIC8vLyBcYnJpZWYgUmV2ZXJzZSBpdGVyYXRvciBlbmQtcG9pbnQgdG8gdHJhdmVyc2UgYWxsIGxvYWRlZCBtb2R1bGVzLgorICBNb2R1bGVSZXZlcnNlSXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIENoYWluLnJlbmQoKTsgfQorCisgIC8vLyBcYnJpZWYgQSByYW5nZSBjb3ZlcmluZyB0aGUgUENIIGFuZCBwcmVhbWJsZSBtb2R1bGUgZmlsZXMgbG9hZGVkLgorICBsbHZtOjppdGVyYXRvcl9yYW5nZTxTbWFsbFZlY3RvckltcGw8TW9kdWxlRmlsZSAqPjo6Y29uc3RfaXRlcmF0b3I+CisgIHBjaF9tb2R1bGVzKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYWtlX3JhbmdlKFBDSENoYWluLmJlZ2luKCksIFBDSENoYWluLmVuZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgcHJpbWFyeSBtb2R1bGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYW5hZ2VyLCB0aGF0IGlzLAorICAvLy8gdGhlIGZpcnN0IG1vZHVsZSBsb2FkZWQKKyAgTW9kdWxlRmlsZSAmZ2V0UHJpbWFyeU1vZHVsZSgpIHsgcmV0dXJuICpDaGFpblswXTsgfQorICAKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBwcmltYXJ5IG1vZHVsZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1hbmFnZXIsIHRoYXQgaXMsCisgIC8vLyB0aGUgZmlyc3QgbW9kdWxlIGxvYWRlZC4KKyAgTW9kdWxlRmlsZSAmZ2V0UHJpbWFyeU1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuICpDaGFpblswXTsgfQorICAKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBtb2R1bGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbmRleAorICBNb2R1bGVGaWxlICZvcGVyYXRvcltdKHVuc2lnbmVkIEluZGV4KSBjb25zdCB7IHJldHVybiAqQ2hhaW5bSW5kZXhdOyB9CisgIAorICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG1vZHVsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZpbGUgbmFtZS4KKyAgTW9kdWxlRmlsZSAqbG9va3VwQnlGaWxlTmFtZShTdHJpbmdSZWYgRmlsZU5hbWUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbW9kdWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbW9kdWxlIG5hbWUuCisgIE1vZHVsZUZpbGUgKmxvb2t1cEJ5TW9kdWxlTmFtZShTdHJpbmdSZWYgTW9kTmFtZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBtb2R1bGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBtb2R1bGUgZmlsZS4KKyAgTW9kdWxlRmlsZSAqbG9va3VwKGNvbnN0IEZpbGVFbnRyeSAqRmlsZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBpbi1tZW1vcnkgKHZpcnR1YWwgZmlsZSkgYnVmZmVyIHdpdGggdGhlIGdpdmVuIG5hbWUKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gbG9va3VwQnVmZmVyKFN0cmluZ1JlZiBOYW1lKTsKKyAgCisgIC8vLyBcYnJpZWYgTnVtYmVyIG9mIG1vZHVsZXMgbG9hZGVkCisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBDaGFpbi5zaXplKCk7IH0KKworICAvLy8gXGJyaWVmIFRoZSByZXN1bHQgb2YgYXR0ZW1wdGluZyB0byBhZGQgYSBuZXcgbW9kdWxlLgorICBlbnVtIEFkZE1vZHVsZVJlc3VsdCB7CisgICAgLy8vIFxicmllZiBUaGUgbW9kdWxlIGZpbGUgaGFkIGFscmVhZHkgYmVlbiBsb2FkZWQuCisgICAgQWxyZWFkeUxvYWRlZCwKKworICAgIC8vLyBcYnJpZWYgVGhlIG1vZHVsZSBmaWxlIHdhcyBqdXN0IGxvYWRlZCBpbiByZXNwb25zZSB0byB0aGlzIGNhbGwuCisgICAgTmV3bHlMb2FkZWQsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBtb2R1bGUgZmlsZSBpcyBtaXNzaW5nLgorICAgIE1pc3NpbmcsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBtb2R1bGUgZmlsZSBpcyBvdXQtb2YtZGF0ZS4KKyAgICBPdXRPZkRhdGUKKyAgfTsKKworICB1c2luZyBBU1RGaWxlU2lnbmF0dXJlUmVhZGVyID0gQVNURmlsZVNpZ25hdHVyZSAoKikoU3RyaW5nUmVmKTsKKworICAvLy8gXGJyaWVmIEF0dGVtcHRzIHRvIGNyZWF0ZSBhIG5ldyBtb2R1bGUgYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBrbm93bgorICAvLy8gbW9kdWxlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gRmlsZU5hbWUgVGhlIGZpbGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGJlIGxvYWRlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gVHlwZSBUaGUga2luZCBvZiBtb2R1bGUgYmVpbmcgbG9hZGVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJbXBvcnRMb2MgVGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRoZSBtb2R1bGUgaXMgaW1wb3J0ZWQuCisgIC8vLworICAvLy8gXHBhcmFtIEltcG9ydGVkQnkgVGhlIG1vZHVsZSB0aGF0IGlzIGltcG9ydGluZyB0aGlzIG1vZHVsZSwgb3IgTlVMTCBpZgorICAvLy8gdGhpcyBtb2R1bGUgaXMgaW1wb3J0ZWQgZGlyZWN0bHkgYnkgdGhlIHVzZXIuCisgIC8vLworICAvLy8gXHBhcmFtIEdlbmVyYXRpb24gVGhlIGdlbmVyYXRpb24gaW4gd2hpY2ggdGhpcyBtb2R1bGUgd2FzIGxvYWRlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRXhwZWN0ZWRTaXplIFRoZSBleHBlY3RlZCBzaXplIG9mIHRoZSBtb2R1bGUgZmlsZSwgdXNlZCBmb3IKKyAgLy8vIHZhbGlkYXRpb24uIFRoaXMgd2lsbCBiZSB6ZXJvIGlmIHVua25vd24uCisgIC8vLworICAvLy8gXHBhcmFtIEV4cGVjdGVkTW9kVGltZSBUaGUgZXhwZWN0ZWQgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIG1vZHVsZQorICAvLy8gZmlsZSwgdXNlZCBmb3IgdmFsaWRhdGlvbi4gVGhpcyB3aWxsIGJlIHplcm8gaWYgdW5rbm93bi4KKyAgLy8vCisgIC8vLyBccGFyYW0gRXhwZWN0ZWRTaWduYXR1cmUgVGhlIGV4cGVjdGVkIHNpZ25hdHVyZSBvZiB0aGUgbW9kdWxlIGZpbGUsIHVzZWQKKyAgLy8vIGZvciB2YWxpZGF0aW9uLiBUaGlzIHdpbGwgYmUgemVybyBpZiB1bmtub3duLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSZWFkU2lnbmF0dXJlIFJlYWRzIHRoZSBzaWduYXR1cmUgZnJvbSBhbiBBU1QgZmlsZSB3aXRob3V0IGFjdHVhbGx5CisgIC8vLyBsb2FkaW5nIGl0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBNb2R1bGUgQSBwb2ludGVyIHRvIHRoZSBtb2R1bGUgZmlsZSBpZiB0aGUgbW9kdWxlIHdhcyBzdWNjZXNzZnVsbHkKKyAgLy8vIGxvYWRlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRXJyb3JTdHIgV2lsbCBiZSBzZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nIGlmIGFueSBlcnJvcnMgb2NjdXJyZWQKKyAgLy8vIHdoaWxlIHRyeWluZyB0byBsb2FkIHRoZSBtb2R1bGUuCisgIC8vLworICAvLy8gXHJldHVybiBBIHBvaW50ZXIgdG8gdGhlIG1vZHVsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgZmlsZSBuYW1lLAorICAvLy8gYW5kIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtb2R1bGUgd2FzIGxvYWRlZC4KKyAgQWRkTW9kdWxlUmVzdWx0IGFkZE1vZHVsZShTdHJpbmdSZWYgRmlsZU5hbWUsIE1vZHVsZUtpbmQgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlRmlsZSAqSW1wb3J0ZWRCeSwgdW5zaWduZWQgR2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCBFeHBlY3RlZFNpemUsIHRpbWVfdCBFeHBlY3RlZE1vZFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNURmlsZVNpZ25hdHVyZSBFeHBlY3RlZFNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RGaWxlU2lnbmF0dXJlUmVhZGVyIFJlYWRTaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlRmlsZSAqJk1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmRXJyb3JTdHIpOworCisgIC8vLyBcYnJpZWYgUmVtb3ZlIHRoZSBtb2R1bGVzIHN0YXJ0aW5nIGZyb20gRmlyc3QgKHRvIHRoZSBlbmQpLgorICB2b2lkIHJlbW92ZU1vZHVsZXMoTW9kdWxlSXRlcmF0b3IgRmlyc3QsCisgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTbWFsbFB0clNldEltcGw8TW9kdWxlRmlsZSAqPiAmTG9hZGVkU3VjY2Vzc2Z1bGx5LAorICAgICAgICAgICAgICAgICAgICAgTW9kdWxlTWFwICptb2RNYXApOworCisgIC8vLyBcYnJpZWYgQWRkIGFuIGluLW1lbW9yeSBidWZmZXIgdGhlIGxpc3Qgb2Yga25vd24gYnVmZmVycworICB2b2lkIGFkZEluTWVtb3J5QnVmZmVyKFN0cmluZ1JlZiBGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBCdWZmZXIpOworCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBnbG9iYWwgbW9kdWxlIGluZGV4LgorICB2b2lkIHNldEdsb2JhbEluZGV4KEdsb2JhbE1vZHVsZUluZGV4ICpJbmRleCk7CisKKyAgLy8vIFxicmllZiBOb3RpZmljYXRpb24gZnJvbSB0aGUgQVNUIHJlYWRlciB0aGF0IHRoZSBnaXZlbiBtb2R1bGUgZmlsZQorICAvLy8gaGFzIGJlZW4gImFjY2VwdGVkIiwgYW5kIHdpbGwgbm90IChjYW4gbm90KSBiZSB1bmxvYWRlZC4KKyAgdm9pZCBtb2R1bGVGaWxlQWNjZXB0ZWQoTW9kdWxlRmlsZSAqTUYpOworCisgIC8vLyBcYnJpZWYgVmlzaXQgZWFjaCBvZiB0aGUgbW9kdWxlcy4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgdmlzaXRzIGVhY2ggb2YgdGhlIG1vZHVsZXMsIHN0YXJ0aW5nIHdpdGggdGhlCisgIC8vLyAicm9vdCIgbW9kdWxlcyB0aGF0IG5vIG90aGVyIGxvYWRlZCBtb2R1bGVzIGRlcGVuZCBvbiwgYW5kCisgIC8vLyBwcm9jZWVkaW5nIHRvIHRoZSBsZWFmIG1vZHVsZXMsIHZpc2l0aW5nIGVhY2ggbW9kdWxlIG9ubHkgb25jZQorICAvLy8gZHVyaW5nIHRoZSB0cmF2ZXJzYWwuCisgIC8vLworICAvLy8gVGhpcyB0cmF2ZXJzYWwgaXMgaW50ZW5kZWQgdG8gc3VwcG9ydCB2YXJpb3VzICJsb29rdXAiCisgIC8vLyBvcGVyYXRpb25zIHRoYXQgY2FuIGZpbmQgZGF0YSBpbiBhbnkgb2YgdGhlIGxvYWRlZCBtb2R1bGVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBWaXNpdG9yIEEgdmlzaXRvciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aXRoIGVhY2gKKyAgLy8vIG1vZHVsZS4gVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGNvbnZlcnRpYmxlIHRvIGJvb2w7IHdoZW4gZmFsc2UsIHRoZQorICAvLy8gdmlzaXRhdGlvbiBjb250aW51ZXMgdG8gbW9kdWxlcyB0aGF0IHRoZSBjdXJyZW50IG1vZHVsZSBkZXBlbmRzIG9uLiBXaGVuCisgIC8vLyB0cnVlLCB0aGUgdmlzaXRhdGlvbiBza2lwcyBhbnkgbW9kdWxlcyB0aGF0IHRoZSBjdXJyZW50IG1vZHVsZSBkZXBlbmRzIG9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNb2R1bGVGaWxlc0hpdCBJZiBub24tTlVMTCwgY29udGFpbnMgdGhlIHNldCBvZiBtb2R1bGUgZmlsZXMKKyAgLy8vIHRoYXQgd2Uga25vdyB3ZSBuZWVkIHRvIHZpc2l0IGJlY2F1c2UgdGhlIGdsb2JhbCBtb2R1bGUgaW5kZXggdG9sZCB1cyB0by4KKyAgLy8vIEFueSBtb2R1bGUgdGhhdCBpcyBrbm93biB0byBib3RoIHRoZSBnbG9iYWwgbW9kdWxlIGluZGV4IGFuZCB0aGUgbW9kdWxlCisgIC8vLyBtYW5hZ2VyIHRoYXQgaXMgKm5vdCogaW4gdGhpcyBzZXQgY2FuIGJlIHNraXBwZWQuCisgIHZvaWQgdmlzaXQobGx2bTo6ZnVuY3Rpb25fcmVmPGJvb2woTW9kdWxlRmlsZSAmTSk+IFZpc2l0b3IsCisgICAgICAgICAgICAgbGx2bTo6U21hbGxQdHJTZXRJbXBsPE1vZHVsZUZpbGUgKj4gKk1vZHVsZUZpbGVzSGl0ID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBBdHRlbXB0IHRvIHJlc29sdmUgdGhlIGdpdmVuIG1vZHVsZSBmaWxlIG5hbWUgdG8gYSBmaWxlIGVudHJ5LgorICAvLy8KKyAgLy8vIFxwYXJhbSBGaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIGZpbGUuCisgIC8vLworICAvLy8gXHBhcmFtIEV4cGVjdGVkU2l6ZSBUaGUgc2l6ZSB0aGF0IHRoZSBtb2R1bGUgZmlsZSBpcyBleHBlY3RlZCB0byBoYXZlLgorICAvLy8gSWYgdGhlIGFjdHVhbCBzaXplIGRpZmZlcnMsIHRoZSByZXNvbHZlciBzaG91bGQgcmV0dXJuIFxjIHRydWUuCisgIC8vLworICAvLy8gXHBhcmFtIEV4cGVjdGVkTW9kVGltZSBUaGUgbW9kaWZpY2F0aW9uIHRpbWUgdGhhdCB0aGUgbW9kdWxlIGZpbGUgaXMKKyAgLy8vIGV4cGVjdGVkIHRvIGhhdmUuIElmIHRoZSBhY3R1YWwgbW9kaWZpY2F0aW9uIHRpbWUgZGlmZmVycywgdGhlIHJlc29sdmVyCisgIC8vLyBzaG91bGQgcmV0dXJuIFxjIHRydWUuCisgIC8vLworICAvLy8gXHBhcmFtIEZpbGUgV2lsbCBiZSBzZXQgdG8gdGhlIGZpbGUgaWYgdGhlcmUgaXMgb25lLCBvciBudWxsCisgIC8vLyBvdGhlcndpc2UuCisgIC8vLworICAvLy8gXHJldHVybnMgVHJ1ZSBpZiBhIGZpbGUgZXhpc3RzIGJ1dCBkb2VzIG5vdCBtZWV0IHRoZSBzaXplLworICAvLy8gbW9kaWZpY2F0aW9uIHRpbWUgY3JpdGVyaWEsIGZhbHNlIGlmIHRoZSBmaWxlIGlzIGVpdGhlciBhdmFpbGFibGUgYW5kCisgIC8vLyBzdWl0YWJsZSwgb3IgaXMgbWlzc2luZy4KKyAgYm9vbCBsb29rdXBNb2R1bGVGaWxlKFN0cmluZ1JlZiBGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IEV4cGVjdGVkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBFeHBlY3RlZE1vZFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRW50cnkgKiZGaWxlKTsKKworICAvLy8gXGJyaWVmIFZpZXcgdGhlIGdyYXBodml6IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2R1bGUgZ3JhcGguCisgIHZvaWQgdmlld0dyYXBoKCk7CisKKyAgTWVtb3J5QnVmZmVyQ2FjaGUgJmdldFBDTUNhY2hlKCkgY29uc3QgeyByZXR1cm4gKlBDTUNhY2hlOyB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBzZXJpYWxpemF0aW9uCisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1NFUklBTElaQVRJT05fTU9EVUxFTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL1NlcmlhbGl6YXRpb25EaWFnbm9zdGljLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL1NlcmlhbGl6YXRpb25EaWFnbm9zdGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwNDIyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vU2VyaWFsaXphdGlvbkRpYWdub3N0aWMuaApAQCAtMCwwICsxLDI4IEBACisvLz09PS0tLSBTZXJpYWxpemF0aW9uRGlhZ25vc3RpYy5oIC0gU2VyaWFsaXphdGlvbiBEaWFnbm9zdGljcyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TRVJJQUxJWkFUSU9OX1NFUklBTElaQVRJT05ESUFHTk9TVElDX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TRVJJQUxJWkFUSU9OX1NFUklBTElaQVRJT05ESUFHTk9TVElDX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWMuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgbmFtZXNwYWNlIGRpYWcgeworICAgIGVudW0geworI2RlZmluZSBESUFHKEVOVU0sRkxBR1MsREVGQVVMVF9NQVBQSU5HLERFU0MsR1JPVVAsXAorICAgICAgICAgICAgIFNGSU5BRSxOT1dFUlJPUixTSE9XSU5TWVNIRUFERVIsQ0FURUdPUlkpIEVOVU0sCisjZGVmaW5lIFNFUklBTElaQVRJT05TVEFSVAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWNTZXJpYWxpemF0aW9uS2luZHMuaW5jIgorI3VuZGVmIERJQUcKKyAgICAgIE5VTV9CVUlMVElOX1NFUklBTElaQVRJT05fRElBR05PU1RJQ1MKKyAgICB9OworICB9ICAvLyBlbmQgbmFtZXNwYWNlIGRpYWcKK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DaGVja2Vycy5pbmMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DaGVja2Vycy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRiYTY1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0NoZWNrZXJzLmluYwpAQCAtMCwwICsxLDUzMyBAQAorCisjaWZkZWYgR0VUX0dST1VQUworI2VuZGlmIC8vIEdFVF9HUk9VUFMKKworCisjaWZkZWYgR0VUX1BBQ0tBR0VTCitQQUNLQUdFKCJhbHBoYSIsIC0xLCBmYWxzZSkKK1BBQ0tBR0UoImFscGhhLmNsb25lIiwgLTEsIHRydWUpCitQQUNLQUdFKCJhbHBoYS5jb3JlIiwgLTEsIHRydWUpCitQQUNLQUdFKCJhbHBoYS5jcGx1c3BsdXMiLCAtMSwgdHJ1ZSkKK1BBQ0tBR0UoImFscGhhLmRlYWRjb2RlIiwgLTEsIHRydWUpCitQQUNLQUdFKCJhbHBoYS5vc3giLCAtMSwgdHJ1ZSkKK1BBQ0tBR0UoImFscGhhLm9zeC5jb2NvYSIsIC0xLCB0cnVlKQorUEFDS0FHRSgiYWxwaGEub3N4LmNvY29hLmxvY2FsaXphYmlsaXR5IiwgLTEsIHRydWUpCitQQUNLQUdFKCJhbHBoYS5zZWN1cml0eSIsIC0xLCB0cnVlKQorUEFDS0FHRSgiYWxwaGEuc2VjdXJpdHkudGFpbnQiLCAtMSwgdHJ1ZSkKK1BBQ0tBR0UoImFscGhhLnVuaXgiLCAtMSwgdHJ1ZSkKK1BBQ0tBR0UoImFscGhhLnVuaXguY3N0cmluZyIsIC0xLCB0cnVlKQorUEFDS0FHRSgiYXBpTW9kZWxpbmciLCAtMSwgdHJ1ZSkKK1BBQ0tBR0UoImFwaU1vZGVsaW5nLmdvb2dsZSIsIC0xLCB0cnVlKQorUEFDS0FHRSgiY29yZSIsIC0xLCBmYWxzZSkKK1BBQ0tBR0UoImNvcmUuYnVpbHRpbiIsIC0xLCBmYWxzZSkKK1BBQ0tBR0UoImNvcmUudW5pbml0aWFsaXplZCIsIC0xLCBmYWxzZSkKK1BBQ0tBR0UoImNwbHVzcGx1cyIsIC0xLCBmYWxzZSkKK1BBQ0tBR0UoImRlYWRjb2RlIiwgLTEsIGZhbHNlKQorUEFDS0FHRSgiZGVidWciLCAtMSwgZmFsc2UpCitQQUNLQUdFKCJsbHZtIiwgLTEsIGZhbHNlKQorUEFDS0FHRSgibnVsbGFiaWxpdHkiLCAtMSwgZmFsc2UpCitQQUNLQUdFKCJvcHRpbiIsIC0xLCBmYWxzZSkKK1BBQ0tBR0UoIm9wdGluLmNwbHVzcGx1cyIsIC0xLCBmYWxzZSkKK1BBQ0tBR0UoIm9wdGluLm1waSIsIC0xLCBmYWxzZSkKK1BBQ0tBR0UoIm9wdGluLm9zeCIsIC0xLCBmYWxzZSkKK1BBQ0tBR0UoIm9wdGluLm9zeC5jb2NvYSIsIC0xLCBmYWxzZSkKK1BBQ0tBR0UoIm9wdGluLm9zeC5jb2NvYS5sb2NhbGl6YWJpbGl0eSIsIC0xLCBmYWxzZSkKK1BBQ0tBR0UoIm9wdGluLnBlcmZvcm1hbmNlIiwgLTEsIGZhbHNlKQorUEFDS0FHRSgib3B0aW4ucG9ydGFiaWxpdHkiLCAtMSwgZmFsc2UpCitQQUNLQUdFKCJvc3giLCAtMSwgZmFsc2UpCitQQUNLQUdFKCJvc3guY29jb2EiLCAtMSwgZmFsc2UpCitQQUNLQUdFKCJvc3guY29yZUZvdW5kYXRpb24iLCAtMSwgZmFsc2UpCitQQUNLQUdFKCJvc3guY29yZUZvdW5kYXRpb24uY29udGFpbmVycyIsIC0xLCBmYWxzZSkKK1BBQ0tBR0UoInNlY3VyaXR5IiwgLTEsIGZhbHNlKQorUEFDS0FHRSgic2VjdXJpdHkuaW5zZWN1cmVBUEkiLCAtMSwgZmFsc2UpCitQQUNLQUdFKCJ1bml4IiwgLTEsIGZhbHNlKQorUEFDS0FHRSgidW5peC5jc3RyaW5nIiwgLTEsIHRydWUpCitQQUNLQUdFKCJ2YWxpc3QiLCAtMSwgZmFsc2UpCisjZW5kaWYgLy8gR0VUX1BBQ0tBR0VTCisKKworI2lmZGVmIEdFVF9DSEVDS0VSUworQ0hFQ0tFUigiZGVidWcuQW5hbHlzaXNPcmRlciIsIEFuYWx5c2lzT3JkZXJDaGVja2VyLCBBbmFseXNpc09yZGVyLmNwcCwgIlByaW50IGNhbGxiYWNrcyB0aGF0IGFyZSBjYWxsZWQgZHVyaW5nIGFuYWx5c2lzIGluIG9yZGVyIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigiZGVidWcuU3RhdHMiLCBBbmFseXplclN0YXRzQ2hlY2tlciwgQW5hbHl6ZXJTdGF0c0NoZWNrZXIuY3BwLCAiRW1pdCB3YXJuaW5ncyB3aXRoIGFuYWx5emVyIHN0YXRpc3RpY3MiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJhbHBoYS5zZWN1cml0eS5BcnJheUJvdW5kIiwgQXJyYXlCb3VuZENoZWNrZXIsIEFycmF5Qm91bmRDaGVja2VyLmNwcCwgIldhcm4gYWJvdXQgYnVmZmVyIG92ZXJmbG93cyAob2xkZXIgY2hlY2tlcikiLCAtMSwgdHJ1ZSkKK0NIRUNLRVIoImFscGhhLnNlY3VyaXR5LkFycmF5Qm91bmRWMiIsIEFycmF5Qm91bmRDaGVja2VyVjIsIEFycmF5Qm91bmRDaGVja2VyVjIuY3BwLCAiV2FybiBhYm91dCBidWZmZXIgb3ZlcmZsb3dzIChuZXdlciBjaGVja2VyKSIsIC0xLCB0cnVlKQorQ0hFQ0tFUigib3N4LmNvY29hLkF1dG9yZWxlYXNlV3JpdGUiLCBBdXRvcmVsZWFzZVdyaXRlQ2hlY2tlciwgT2JqQ0F1dG9yZWxlYXNlV3JpdGVDaGVja2VyLmNwcCwgIldhcm4gYWJvdXQgcG90ZW50aWFsbHkgY3Jhc2hpbmcgd3JpdGVzIHRvIGF1dG9yZWxlYXNpbmcgb2JqZWN0cyBmcm9tIGRpZmZlcmVudCBhdXRvcmVsZWFzaW5nIHBvb2xzIGluIE9iamVjdGl2ZS1DIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigiYWxwaGEudW5peC5CbG9ja0luQ3JpdGljYWxTZWN0aW9uIiwgQmxvY2tJbkNyaXRpY2FsU2VjdGlvbkNoZWNrZXIsIEJsb2NrSW5Dcml0aWNhbFNlY3Rpb25DaGVja2VyLmNwcCwgIkNoZWNrIGZvciBjYWxscyB0byBibG9ja2luZyBmdW5jdGlvbnMgaW5zaWRlIGEgY3JpdGljYWwgc2VjdGlvbiIsIC0xLCB0cnVlKQorQ0hFQ0tFUigiYWxwaGEuY29yZS5Cb29sQXNzaWdubWVudCIsIEJvb2xBc3NpZ25tZW50Q2hlY2tlciwgQm9vbEFzc2lnbm1lbnRDaGVja2VyLmNwcCwgIldhcm4gYWJvdXQgYXNzaWduaW5nIG5vbi17MCwxfSB2YWx1ZXMgdG8gQm9vbGVhbiB2YXJpYWJsZXMiLCAtMSwgdHJ1ZSkKK0NIRUNLRVIoImNvcmUuYnVpbHRpbi5CdWlsdGluRnVuY3Rpb25zIiwgQnVpbHRpbkZ1bmN0aW9uQ2hlY2tlciwgQnVpbHRpbkZ1bmN0aW9uQ2hlY2tlci5jcHAsICJFdmFsdWF0ZSBjb21waWxlciBidWlsdGluIGZ1bmN0aW9ucyAoZS5nLiwgYWxsb2NhKCkpIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigib3N4LmNvcmVGb3VuZGF0aW9uLkNGRXJyb3IiLCBDRkVycm9yQ2hlY2tlciwgTlNFcnJvckNoZWNrZXIuY3BwLCAiQ2hlY2sgdXNhZ2Ugb2YgQ0ZFcnJvclJlZiogcGFyYW1ldGVycyIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoImRlYnVnLkR1bXBDRkciLCBDRkdEdW1wZXIsIERlYnVnQ2hlY2tlcnMuY3BwLCAiRGlzcGxheSBDb250cm9sLUZsb3cgR3JhcGhzIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigiZGVidWcuVmlld0NGRyIsIENGR1ZpZXdlciwgRGVidWdDaGVja2Vycy5jcHAsICJWaWV3IENvbnRyb2wtRmxvdyBHcmFwaHMgdXNpbmcgR3JhcGhWaXoiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJvc3guY29yZUZvdW5kYXRpb24uQ0ZOdW1iZXIiLCBDRk51bWJlckNoZWNrZXIsIEJhc2ljT2JqQ0ZvdW5kYXRpb25DaGVja3MuY3BwLCAiQ2hlY2sgZm9yIHByb3BlciB1c2VzIG9mIENGTnVtYmVyIEFQSXMiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJvc3guY29yZUZvdW5kYXRpb24uQ0ZSZXRhaW5SZWxlYXNlIiwgQ0ZSZXRhaW5SZWxlYXNlQ2hlY2tlciwgQmFzaWNPYmpDRm91bmRhdGlvbkNoZWNrcy5jcHAsICJDaGVjayBmb3IgbnVsbCBhcmd1bWVudHMgdG8gQ0ZSZXRhaW4vQ0ZSZWxlYXNlL0NGTWFrZUNvbGxlY3RhYmxlIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigiYWxwaGEudW5peC5jc3RyaW5nLkJ1ZmZlck92ZXJsYXAiLCBDU3RyaW5nQnVmZmVyT3ZlcmxhcCwgQ1N0cmluZ0NoZWNrZXIuY3BwLCAiQ2hlY2tzIGZvciBvdmVybGFwIGluIHR3byBidWZmZXIgYXJndW1lbnRzIiwgLTEsIHRydWUpCitDSEVDS0VSKCJhbHBoYS51bml4LmNzdHJpbmcuTm90TnVsbFRlcm1pbmF0ZWQiLCBDU3RyaW5nTm90TnVsbFRlcm0sIENTdHJpbmdDaGVja2VyLmNwcCwgIkNoZWNrIGZvciBhcmd1bWVudHMgd2hpY2ggYXJlIG5vdCBudWxsLXRlcm1pbmF0aW5nIHN0cmluZ3MiLCAtMSwgdHJ1ZSkKK0NIRUNLRVIoInVuaXguY3N0cmluZy5OdWxsQXJnIiwgQ1N0cmluZ051bGxBcmcsIENTdHJpbmdDaGVja2VyLmNwcCwgIkNoZWNrIGZvciBudWxsIHBvaW50ZXJzIGJlaW5nIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gQyBzdHJpbmcgZnVuY3Rpb25zIiwgLTEsIHRydWUpCitDSEVDS0VSKCJhbHBoYS51bml4LmNzdHJpbmcuT3V0T2ZCb3VuZHMiLCBDU3RyaW5nT3V0T2ZCb3VuZHMsIENTdHJpbmdDaGVja2VyLmNwcCwgIkNoZWNrIGZvciBvdXQtb2YtYm91bmRzIGFjY2VzcyBpbiBzdHJpbmcgZnVuY3Rpb25zIiwgLTEsIHRydWUpCitDSEVDS0VSKCJ1bml4LmNzdHJpbmcuQmFkU2l6ZUFyZyIsIENTdHJpbmdTeW50YXhDaGVja2VyLCBDU3RyaW5nU3ludGF4Q2hlY2tlci5jcHAsICJDaGVjayB0aGUgc2l6ZSBhcmd1bWVudCBwYXNzZWQgaW50byBDIHN0cmluZyBmdW5jdGlvbnMgZm9yIGNvbW1vbiBlcnJvbmVvdXMgcGF0dGVybnMiLCAtMSwgdHJ1ZSkKK0NIRUNLRVIoImNwbHVzcGx1cy5TZWxmQXNzaWdubWVudCIsIENYWFNlbGZBc3NpZ25tZW50Q2hlY2tlciwgQ1hYU2VsZkFzc2lnbm1lbnRDaGVja2VyLmNwcCwgIkNoZWNrcyBDKysgY29weSBhbmQgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9ycyBmb3Igc2VsZiBhc3NpZ25tZW50IiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigiY29yZS5DYWxsQW5kTWVzc2FnZSIsIENhbGxBbmRNZXNzYWdlQ2hlY2tlciwgQ2FsbEFuZE1lc3NhZ2VDaGVja2VyLmNwcCwgIkNoZWNrIGZvciBsb2dpY2FsIGVycm9ycyBmb3IgZnVuY3Rpb24gY2FsbHMgYW5kIE9iamVjdGl2ZS1DIG1lc3NhZ2UgZXhwcmVzc2lvbnMgKGUuZy4sIHVuaW5pdGlhbGl6ZWQgYXJndW1lbnRzLCBudWxsIGZ1bmN0aW9uIHBvaW50ZXJzKSIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoImFscGhhLmNvcmUuQ2FsbEFuZE1lc3NhZ2VVbkluaXRSZWZBcmciLCBDYWxsQW5kTWVzc2FnZVVuSW5pdFJlZkFyZywgQ2FsbEFuZE1lc3NhZ2VDaGVja2VyLmNwcCwgIkNoZWNrIGZvciBsb2dpY2FsIGVycm9ycyBmb3IgZnVuY3Rpb24gY2FsbHMgYW5kIE9iamVjdGl2ZS1DIG1lc3NhZ2UgZXhwcmVzc2lvbnMgKGUuZy4sIHVuaW5pdGlhbGl6ZWQgYXJndW1lbnRzLCBudWxsIGZ1bmN0aW9uIHBvaW50ZXJzLCBhbmQgcG9pbnRlciB0byB1bmRlZmluZWQgdmFyaWFibGVzKSIsIC0xLCB0cnVlKQorQ0hFQ0tFUigiZGVidWcuRHVtcENhbGxzIiwgQ2FsbER1bXBlciwgVHJhdmVyc2FsQ2hlY2tlci5jcHAsICJQcmludCBjYWxscyBhcyB0aGV5IGFyZSB0cmF2ZXJzZWQgYnkgdGhlIGVuZ2luZSIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoImRlYnVnLkR1bXBDYWxsR3JhcGgiLCBDYWxsR3JhcGhEdW1wZXIsIERlYnVnQ2hlY2tlcnMuY3BwLCAiRGlzcGxheSBDYWxsIEdyYXBoIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigiZGVidWcuVmlld0NhbGxHcmFwaCIsIENhbGxHcmFwaFZpZXdlciwgRGVidWdDaGVja2Vycy5jcHAsICJWaWV3IENhbGwgR3JhcGggdXNpbmcgR3JhcGhWaXoiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJhbHBoYS5jb3JlLkNhc3RTaXplIiwgQ2FzdFNpemVDaGVja2VyLCBDYXN0U2l6ZUNoZWNrZXIuY3BwLCAiQ2hlY2sgd2hlbiBjYXN0aW5nIGEgbWFsbG9jJ2VkIHR5cGUgVCwgd2hldGhlciB0aGUgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIHRoZSBzaXplIG9mIFQiLCAtMSwgdHJ1ZSkKK0NIRUNLRVIoImFscGhhLmNvcmUuQ2FzdFRvU3RydWN0IiwgQ2FzdFRvU3RydWN0Q2hlY2tlciwgQ2FzdFRvU3RydWN0Q2hlY2tlci5jcHAsICJDaGVjayBmb3IgY2FzdCBmcm9tIG5vbi1zdHJ1Y3QgcG9pbnRlciB0byBzdHJ1Y3QgcG9pbnRlciIsIC0xLCB0cnVlKQorQ0hFQ0tFUigiYWxwaGEudW5peC5DaHJvb3QiLCBDaHJvb3RDaGVja2VyLCBDaHJvb3RDaGVja2VyLmNwcCwgIkNoZWNrIGltcHJvcGVyIHVzZSBvZiBjaHJvb3QiLCAtMSwgdHJ1ZSkKK0NIRUNLRVIoIm9zeC5jb2NvYS5DbGFzc1JlbGVhc2UiLCBDbGFzc1JlbGVhc2VDaGVja2VyLCBCYXNpY09iakNGb3VuZGF0aW9uQ2hlY2tzLmNwcCwgIkNoZWNrIGZvciBzZW5kaW5nICdyZXRhaW4nLCAncmVsZWFzZScsIG9yICdhdXRvcmVsZWFzZScgZGlyZWN0bHkgdG8gYSBDbGFzcyIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoImFscGhhLmNsb25lLkNsb25lQ2hlY2tlciIsIENsb25lQ2hlY2tlciwgQ2xvbmVDaGVja2VyLmNwcCwgIlJlcG9ydHMgc2ltaWxhciBwaWVjZXMgb2YgY29kZS4iLCAtMSwgdHJ1ZSkKK0NIRUNLRVIoImRlYnVnLkNvbmZpZ0R1bXBlciIsIENvbmZpZ0R1bXBlciwgRGVidWdDaGVja2Vycy5jcHAsICJEdW1wIGNvbmZpZyB0YWJsZSIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoImFscGhhLmNvcmUuQ29udmVyc2lvbiIsIENvbnZlcnNpb25DaGVja2VyLCBDb252ZXJzaW9uQ2hlY2tlci5jcHAsICJMb3NzIG9mIHNpZ24vcHJlY2lzaW9uIGluIGltcGxpY2l0IGNvbnZlcnNpb25zIiwgLTEsIHRydWUpCitDSEVDS0VSKCJ2YWxpc3QuQ29weVRvU2VsZiIsIENvcHlUb1NlbGZDaGVja2VyLCBWYWxpc3RDaGVja2VyLmNwcCwgIkNoZWNrIGZvciB2YV9saXN0cyB3aGljaCBhcmUgY29waWVkIG9udG8gaXRzZWxmLiIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoImRlYWRjb2RlLkRlYWRTdG9yZXMiLCBEZWFkU3RvcmVzQ2hlY2tlciwgRGVhZFN0b3Jlc0NoZWNrZXIuY3BwLCAiQ2hlY2sgZm9yIHZhbHVlcyBzdG9yZWQgdG8gdmFyaWFibGVzIHRoYXQgYXJlIG5ldmVyIHJlYWQgYWZ0ZXJ3YXJkcyIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoImFscGhhLmNwbHVzcGx1cy5EZWxldGVXaXRoTm9uVmlydHVhbER0b3IiLCBEZWxldGVXaXRoTm9uVmlydHVhbER0b3JDaGVja2VyLCBEZWxldGVXaXRoTm9uVmlydHVhbER0b3JDaGVja2VyLmNwcCwgIlJlcG9ydHMgZGVzdHJ1Y3Rpb25zIG9mIHBvbHltb3JwaGljIG9iamVjdHMgd2l0aCBhIG5vbi12aXJ0dWFsIGRlc3RydWN0b3IgaW4gdGhlaXIgYmFzZSBjbGFzcyIsIC0xLCB0cnVlKQorQ0hFQ0tFUigiY29yZS5OdWxsRGVyZWZlcmVuY2UiLCBEZXJlZmVyZW5jZUNoZWNrZXIsIERlcmVmZXJlbmNlQ2hlY2tlci5jcHAsICJDaGVjayBmb3IgZGVyZWZlcmVuY2VzIG9mIG51bGwgcG9pbnRlcnMiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJhbHBoYS5vc3guY29jb2EuRGlyZWN0SXZhckFzc2lnbm1lbnQiLCBEaXJlY3RJdmFyQXNzaWdubWVudCwgRGlyZWN0SXZhckFzc2lnbm1lbnQuY3BwLCAiQ2hlY2sgZm9yIGRpcmVjdCBhc3NpZ25tZW50cyB0byBpbnN0YW5jZSB2YXJpYWJsZXMiLCAtMSwgdHJ1ZSkKK0NIRUNLRVIoImFscGhhLm9zeC5jb2NvYS5EaXJlY3RJdmFyQXNzaWdubWVudEZvckFubm90YXRlZEZ1bmN0aW9ucyIsIERpcmVjdEl2YXJBc3NpZ25tZW50Rm9yQW5ub3RhdGVkRnVuY3Rpb25zLCBEaXJlY3RJdmFyQXNzaWdubWVudC5jcHAsICJDaGVjayBmb3IgZGlyZWN0IGFzc2lnbm1lbnRzIHRvIGluc3RhbmNlIHZhcmlhYmxlcyBpbiB0aGUgbWV0aG9kcyBhbm5vdGF0ZWQgd2l0aCBvYmpjX25vX2RpcmVjdF9pbnN0YW5jZV92YXJpYWJsZV9hc3NpZ25tZW50IiwgLTEsIHRydWUpCitDSEVDS0VSKCJjb3JlLkRpdmlkZVplcm8iLCBEaXZaZXJvQ2hlY2tlciwgRGl2WmVyb0NoZWNrZXIuY3BwLCAiQ2hlY2sgZm9yIGRpdmlzaW9uIGJ5IHplcm8iLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJkZWJ1Zy5EdW1wRG9taW5hdG9ycyIsIERvbWluYXRvcnNUcmVlRHVtcGVyLCBEZWJ1Z0NoZWNrZXJzLmNwcCwgIlByaW50IHRoZSBkb21pbmFuY2UgdHJlZSBmb3IgYSBnaXZlbiBDRkciLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJhbHBoYS5jb3JlLkR5bmFtaWNUeXBlQ2hlY2tlciIsIER5bmFtaWNUeXBlQ2hlY2tlciwgRHluYW1pY1R5cGVDaGVja2VyLmNwcCwgIkNoZWNrIGZvciBjYXNlcyB3aGVyZSB0aGUgZHluYW1pYyBhbmQgdGhlIHN0YXRpYyB0eXBlIG9mIGFuIG9iamVjdCBhcmUgdW5yZWxhdGVkLiIsIC0xLCB0cnVlKQorQ0hFQ0tFUigiY29yZS5EeW5hbWljVHlwZVByb3BhZ2F0aW9uIiwgRHluYW1pY1R5cGVQcm9wYWdhdGlvbiwgRHluYW1pY1R5cGVQcm9wYWdhdGlvbi5jcHAsICJHZW5lcmF0ZSBkeW5hbWljIHR5cGUgaW5mb3JtYXRpb24iLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJvcHRpbi5vc3guY29jb2EubG9jYWxpemFiaWxpdHkuRW1wdHlMb2NhbGl6YXRpb25Db250ZXh0Q2hlY2tlciIsIEVtcHR5TG9jYWxpemF0aW9uQ29udGV4dENoZWNrZXIsIExvY2FsaXphdGlvbkNoZWNrZXIuY3BwLCAiQ2hlY2sgdGhhdCBOU0xvY2FsaXplZFN0cmluZyBtYWNyb3MgaW5jbHVkZSBhIGNvbW1lbnQgZm9yIGNvbnRleHQiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJkZWJ1Zy5WaWV3RXhwbG9kZWRHcmFwaCIsIEV4cGxvZGVkR3JhcGhWaWV3ZXIsIERlYnVnQ2hlY2tlcnMuY3BwLCAiVmlldyBFeHBsb2RlZCBHcmFwaHMgdXNpbmcgR3JhcGhWaXoiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJkZWJ1Zy5FeHBySW5zcGVjdGlvbiIsIEV4cHJJbnNwZWN0aW9uQ2hlY2tlciwgRXhwckluc3BlY3Rpb25DaGVja2VyLmNwcCwgIkNoZWNrIHRoZSBhbmFseXplcidzIHVuZGVyc3RhbmRpbmcgb2YgZXhwcmVzc2lvbnMiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJhbHBoYS5jb3JlLkZpeGVkQWRkciIsIEZpeGVkQWRkcmVzc0NoZWNrZXIsIEZpeGVkQWRkcmVzc0NoZWNrZXIuY3BwLCAiQ2hlY2sgZm9yIGFzc2lnbm1lbnQgb2YgYSBmaXhlZCBhZGRyZXNzIHRvIGEgcG9pbnRlciIsIC0xLCB0cnVlKQorQ0hFQ0tFUigic2VjdXJpdHkuRmxvYXRMb29wQ291bnRlciIsIEZsb2F0TG9vcENvdW50ZXIsIENoZWNrU2VjdXJpdHlTeW50YXhPbmx5LmNwcCwgIldhcm4gb24gdXNpbmcgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSBhcyBhIGxvb3AgY291bnRlciAoQ0VSVDogRkxQMzAtQywgRkxQMzAtQ1BQKSIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoIm9wdGluLnBlcmZvcm1hbmNlLkdDREFudGlwYXR0ZXJuIiwgR0NEQW50aXBhdHRlcm4sIEdDREFudGlwYXR0ZXJuQ2hlY2tlci5jcHAsICJDaGVjayBmb3IgcGVyZm9ybWFuY2UgYW50aS1wYXR0ZXJucyB3aGVuIHVzaW5nIEdyYW5kIENlbnRyYWwgRGlzcGF0Y2giLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJhcGlNb2RlbGluZy5nb29nbGUuR1Rlc3QiLCBHVGVzdENoZWNrZXIsIEdUZXN0Q2hlY2tlci5jcHAsICJNb2RlbCBndGVzdCBhc3NlcnRpb24gQVBJcyIsIC0xLCB0cnVlKQorQ0hFQ0tFUigiYWxwaGEuc2VjdXJpdHkudGFpbnQuVGFpbnRQcm9wYWdhdGlvbiIsIEdlbmVyaWNUYWludENoZWNrZXIsIEdlbmVyaWNUYWludENoZWNrZXIuY3BwLCAiR2VuZXJhdGUgdGFpbnQgaW5mb3JtYXRpb24gdXNlZCBieSBvdGhlciBjaGVja2VycyIsIC0xLCB0cnVlKQorQ0hFQ0tFUigiYWxwaGEuY29yZS5JZGVudGljYWxFeHByIiwgSWRlbnRpY2FsRXhwckNoZWNrZXIsIElkZW50aWNhbEV4cHJDaGVja2VyLmNwcCwgIldhcm4gYWJvdXQgdW5pbnRlbmRlZCB1c2Ugb2YgaWRlbnRpY2FsIGV4cHJlc3Npb25zIGluIG9wZXJhdG9ycyIsIC0xLCB0cnVlKQorQ0hFQ0tFUigiYWxwaGEub3N4LmNvY29hLkluc3RhbmNlVmFyaWFibGVJbnZhbGlkYXRpb24iLCBJbnN0YW5jZVZhcmlhYmxlSW52YWxpZGF0aW9uLCBJdmFySW52YWxpZGF0aW9uQ2hlY2tlci5jcHAsICJDaGVjayB0aGF0IHRoZSBpbnZhbGlkYXRhYmxlIGluc3RhbmNlIHZhcmlhYmxlcyBhcmUgaW52YWxpZGF0ZWQgaW4gdGhlIG1ldGhvZHMgYW5ub3RhdGVkIHdpdGggb2JqY19pbnN0YW5jZV92YXJpYWJsZV9pbnZhbGlkYXRvciIsIC0xLCB0cnVlKQorQ0hFQ0tFUigiYWxwaGEuY3BsdXNwbHVzLkl0ZXJhdG9yUmFuZ2UiLCBJdGVyYXRvclJhbmdlQ2hlY2tlciwgSXRlcmF0b3JDaGVja2VyLmNwcCwgIkNoZWNrIGZvciBpdGVyYXRvcnMgdXNlZCBvdXRzaWRlIHRoZWlyIHZhbGlkIHJhbmdlcyIsIC0xLCB0cnVlKQorQ0hFQ0tFUigibGx2bS5Db252ZW50aW9ucyIsIExMVk1Db252ZW50aW9uc0NoZWNrZXIsIExMVk1Db252ZW50aW9uc0NoZWNrZXIuY3BwLCAiQ2hlY2sgY29kZSBmb3IgTExWTSBjb2RlYmFzZSBjb252ZW50aW9ucyIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoImRlYnVnLkR1bXBMaXZlVmFycyIsIExpdmVWYXJpYWJsZXNEdW1wZXIsIERlYnVnQ2hlY2tlcnMuY3BwLCAiUHJpbnQgcmVzdWx0cyBvZiBsaXZlIHZhcmlhYmxlIGFuYWx5c2lzIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigib3B0aW4ubXBpLk1QSS1DaGVja2VyIiwgTVBJQ2hlY2tlciwgTVBJQ2hlY2tlci5jcHAsICJDaGVja3MgTVBJIGNvZGUiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJvc3guU2VjS2V5Y2hhaW5BUEkiLCBNYWNPU0tleWNoYWluQVBJQ2hlY2tlciwgTWFjT1NLZXljaGFpbkFQSUNoZWNrZXIuY3BwLCAiQ2hlY2sgZm9yIHByb3BlciB1c2VzIG9mIFNlY3VyZSBLZXljaGFpbiBBUElzIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigib3N4LkFQSSIsIE1hY09TWEFQSUNoZWNrZXIsIE1hY09TWEFQSUNoZWNrZXIuY3BwLCAiQ2hlY2sgZm9yIHByb3BlciB1c2VzIG9mIHZhcmlvdXMgQXBwbGUgQVBJcyIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoInVuaXguTWFsbG9jIiwgTWFsbG9jQ2hlY2tlciwgTWFsbG9jQ2hlY2tlci5jcHAsICJDaGVjayBmb3IgbWVtb3J5IGxlYWtzLCBkb3VibGUgZnJlZSwgYW5kIHVzZS1hZnRlci1mcmVlIHByb2JsZW1zLiBUcmFjZXMgbWVtb3J5IG1hbmFnZWQgYnkgbWFsbG9jKCkvZnJlZSgpLiIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoImFscGhhLnNlY3VyaXR5Lk1hbGxvY092ZXJmbG93IiwgTWFsbG9jT3ZlcmZsb3dTZWN1cml0eUNoZWNrZXIsIE1hbGxvY092ZXJmbG93U2VjdXJpdHlDaGVja2VyLmNwcCwgIkNoZWNrIGZvciBvdmVyZmxvd3MgaW4gdGhlIGFyZ3VtZW50cyB0byBtYWxsb2MoKSIsIC0xLCB0cnVlKQorQ0hFQ0tFUigidW5peC5NYWxsb2NTaXplb2YiLCBNYWxsb2NTaXplb2ZDaGVja2VyLCBNYWxsb2NTaXplb2ZDaGVja2VyLmNwcCwgIkNoZWNrIGZvciBkdWJpb3VzIG1hbGxvYyBhcmd1bWVudHMgaW52b2x2aW5nIHNpemVvZiIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoInVuaXguTWlzbWF0Y2hlZERlYWxsb2NhdG9yIiwgTWlzbWF0Y2hlZERlYWxsb2NhdG9yQ2hlY2tlciwgTWFsbG9jQ2hlY2tlci5jcHAsICJDaGVjayBmb3IgbWlzbWF0Y2hlZCBkZWFsbG9jYXRvcnMuIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigiYWxwaGEub3N4LmNvY29hLk1pc3NpbmdJbnZhbGlkYXRpb25NZXRob2QiLCBNaXNzaW5nSW52YWxpZGF0aW9uTWV0aG9kLCBJdmFySW52YWxpZGF0aW9uQ2hlY2tlci5jcHAsICJDaGVjayB0aGF0IHRoZSBpbnZhbGlkYXRpb24gbWV0aG9kcyBhcmUgcHJlc2VudCBpbiBjbGFzc2VzIHRoYXQgY29udGFpbiBpbnZhbGlkYXRhYmxlIGluc3RhbmNlIHZhcmlhYmxlcyIsIC0xLCB0cnVlKQorQ0hFQ0tFUigiYWxwaGEuY3BsdXNwbHVzLk1pc3VzZWRNb3ZlZE9iamVjdCIsIE1pc3VzZWRNb3ZlZE9iamVjdENoZWNrZXIsIE1pc3VzZWRNb3ZlZE9iamVjdENoZWNrZXIuY3BwLCAiTWV0aG9kIGNhbGxzIG9uIGEgbW92ZWQtZnJvbSBvYmplY3QgYW5kIGNvcHlpbmcgYSBtb3ZlZC1mcm9tIG9iamVjdCB3aWxsIGJlIHJlcG9ydGVkIiwgLTEsIHRydWUpCitDSEVDS0VSKCJhbHBoYS5zZWN1cml0eS5NbWFwV3JpdGVFeGVjIiwgTW1hcFdyaXRlRXhlY0NoZWNrZXIsIE1tYXBXcml0ZUV4ZWNDaGVja2VyLmNwcCwgIldhcm4gb24gbW1hcCgpIGNhbGxzIHRoYXQgYXJlIGJvdGggd3JpdGFibGUgYW5kIGV4ZWN1dGFibGUiLCAtMSwgdHJ1ZSkKK0NIRUNLRVIoIm9zeC5jb2NvYS5OU0F1dG9yZWxlYXNlUG9vbCIsIE5TQXV0b3JlbGVhc2VQb29sQ2hlY2tlciwgTlNBdXRvcmVsZWFzZVBvb2xDaGVja2VyLmNwcCwgIldhcm4gZm9yIHN1Ym9wdGltYWwgdXNlcyBvZiBOU0F1dG9yZWxlYXNlUG9vbCBpbiBPYmplY3RpdmUtQyBHQyBtb2RlIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigib3N4LmNvY29hLk5TRXJyb3IiLCBOU0Vycm9yQ2hlY2tlciwgTlNFcnJvckNoZWNrZXIuY3BwLCAiQ2hlY2sgdXNhZ2Ugb2YgTlNFcnJvcioqIHBhcmFtZXRlcnMiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJjcGx1c3BsdXMuTmV3RGVsZXRlIiwgTmV3RGVsZXRlQ2hlY2tlciwgTWFsbG9jQ2hlY2tlci5jcHAsICJDaGVjayBmb3IgZG91YmxlLWZyZWUgYW5kIHVzZS1hZnRlci1mcmVlIHByb2JsZW1zLiBUcmFjZXMgbWVtb3J5IG1hbmFnZWQgYnkgbmV3L2RlbGV0ZS4iLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJjcGx1c3BsdXMuTmV3RGVsZXRlTGVha3MiLCBOZXdEZWxldGVMZWFrc0NoZWNrZXIsIE1hbGxvY0NoZWNrZXIuY3BwLCAiQ2hlY2sgZm9yIG1lbW9yeSBsZWFrcy4gVHJhY2VzIG1lbW9yeSBtYW5hZ2VkIGJ5IG5ldy9kZWxldGUuIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigib3N4LmNvY29hLk5pbEFyZyIsIE5pbEFyZ0NoZWNrZXIsIEJhc2ljT2JqQ0ZvdW5kYXRpb25DaGVja3MuY3BwLCAiQ2hlY2sgZm9yIHByb2hpYml0ZWQgbmlsIGFyZ3VtZW50cyB0byBPYmpDIG1ldGhvZCBjYWxscyIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoImNvcmUuYnVpbHRpbi5Ob1JldHVybkZ1bmN0aW9ucyIsIE5vUmV0dXJuRnVuY3Rpb25DaGVja2VyLCBOb1JldHVybkZ1bmN0aW9uQ2hlY2tlci5jcHAsICJFdmFsdWF0ZSBcInBhbmljXCIgZnVuY3Rpb25zIHRoYXQgYXJlIGtub3duIHRvIG5vdCByZXR1cm4gdG8gdGhlIGNhbGxlciIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoIm9wdGluLm9zeC5jb2NvYS5sb2NhbGl6YWJpbGl0eS5Ob25Mb2NhbGl6ZWRTdHJpbmdDaGVja2VyIiwgTm9uTG9jYWxpemVkU3RyaW5nQ2hlY2tlciwgTG9jYWxpemF0aW9uQ2hlY2tlci5jcHAsICJXYXJucyBhYm91dCB1c2VzIG9mIG5vbi1sb2NhbGl6ZWQgTlNTdHJpbmdzIHBhc3NlZCB0byBVSSBtZXRob2RzIGV4cGVjdGluZyBsb2NhbGl6ZWQgTlNTdHJpbmdzIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigiY29yZS5Ob25OdWxsUGFyYW1DaGVja2VyIiwgTm9uTnVsbFBhcmFtQ2hlY2tlciwgTm9uTnVsbFBhcmFtQ2hlY2tlci5jcHAsICJDaGVjayBmb3IgbnVsbCBwb2ludGVycyBwYXNzZWQgYXMgYXJndW1lbnRzIHRvIGEgZnVuY3Rpb24gd2hvc2UgYXJndW1lbnRzIGFyZSByZWZlcmVuY2VzIG9yIG1hcmtlZCB3aXRoIHRoZSAnbm9ubnVsbCcgYXR0cmlidXRlIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigiY29yZS5Ob25uaWxTdHJpbmdDb25zdGFudHMiLCBOb25udWxsR2xvYmFsQ29uc3RhbnRzQ2hlY2tlciwgTm9uaWxTdHJpbmdDb25zdGFudHNDaGVja2VyLmNwcCwgIkFzc3VtZSB0aGF0IGNvbnN0IHN0cmluZy1saWtlIGdsb2JhbHMgYXJlIG5vbi1udWxsIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigibnVsbGFiaWxpdHkuTnVsbFBhc3NlZFRvTm9ubnVsbCIsIE51bGxQYXNzZWRUb05vbm51bGxDaGVja2VyLCBOdWxsYWJpbGl0eUNoZWNrZXIuY3BwLCAiV2FybnMgd2hlbiBhIG51bGwgcG9pbnRlciBpcyBwYXNzZWQgdG8gYSBwb2ludGVyIHdoaWNoIGhhcyBhIF9Ob25udWxsIHR5cGUuIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigibnVsbGFiaWxpdHkuTnVsbFJldHVybmVkRnJvbU5vbm51bGwiLCBOdWxsUmV0dXJuZWRGcm9tTm9ubnVsbENoZWNrZXIsIE51bGxhYmlsaXR5Q2hlY2tlci5jcHAsICJXYXJucyB3aGVuIGEgbnVsbCBwb2ludGVyIGlzIHJldHVybmVkIGZyb20gYSBmdW5jdGlvbiB0aGF0IGhhcyBfTm9ubnVsbCByZXR1cm4gdHlwZS4iLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJudWxsYWJpbGl0eS5OdWxsYWJsZURlcmVmZXJlbmNlZCIsIE51bGxhYmxlRGVyZWZlcmVuY2VkQ2hlY2tlciwgTnVsbGFiaWxpdHlDaGVja2VyLmNwcCwgIldhcm5zIHdoZW4gYSBudWxsYWJsZSBwb2ludGVyIGlzIGRlcmVmZXJlbmNlZC4iLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJudWxsYWJpbGl0eS5OdWxsYWJsZVBhc3NlZFRvTm9ubnVsbCIsIE51bGxhYmxlUGFzc2VkVG9Ob25udWxsQ2hlY2tlciwgTnVsbGFiaWxpdHlDaGVja2VyLmNwcCwgIldhcm5zIHdoZW4gYSBudWxsYWJsZSBwb2ludGVyIGlzIHBhc3NlZCB0byBhIHBvaW50ZXIgd2hpY2ggaGFzIGEgX05vbm51bGwgdHlwZS4iLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJudWxsYWJpbGl0eS5OdWxsYWJsZVJldHVybmVkRnJvbU5vbm51bGwiLCBOdWxsYWJsZVJldHVybmVkRnJvbU5vbm51bGxDaGVja2VyLCBOdWxsYWJpbGl0eUNoZWNrZXIuY3BwLCAiV2FybnMgd2hlbiBhIG51bGxhYmxlIHBvaW50ZXIgaXMgcmV0dXJuZWQgZnJvbSBhIGZ1bmN0aW9uIHRoYXQgaGFzIF9Ob25udWxsIHJldHVybiB0eXBlLiIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoIm9zeC5OdW1iZXJPYmplY3RDb252ZXJzaW9uIiwgTnVtYmVyT2JqZWN0Q29udmVyc2lvbkNoZWNrZXIsIE51bWJlck9iamVjdENvbnZlcnNpb25DaGVja2VyLmNwcCwgIkNoZWNrIGZvciBlcnJvbmVvdXMgY29udmVyc2lvbnMgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgbnVtYmVycyBpbnRvIG51bWJlcnMiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJvc3guY29jb2EuQXRTeW5jIiwgT2JqQ0F0U3luY0NoZWNrZXIsIE9iakNBdFN5bmNDaGVja2VyLmNwcCwgIkNoZWNrIGZvciBuaWwgcG9pbnRlcnMgdXNlZCBhcyBtdXRleGVzIGZvciBAc3luY2hyb25pemVkIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigib3N4LmNvcmVGb3VuZGF0aW9uLmNvbnRhaW5lcnMuUG9pbnRlclNpemVkVmFsdWVzIiwgT2JqQ0NvbnRhaW5lcnNBU1RDaGVja2VyLCBPYmpDQ29udGFpbmVyc0FTVENoZWNrZXIuY3BwLCAiV2FybnMgaWYgJ0NGQXJyYXknLCAnQ0ZEaWN0aW9uYXJ5JywgJ0NGU2V0JyBhcmUgY3JlYXRlZCB3aXRoIG5vbi1wb2ludGVyLXNpemUgdmFsdWVzIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigib3N4LmNvcmVGb3VuZGF0aW9uLmNvbnRhaW5lcnMuT3V0T2ZCb3VuZHMiLCBPYmpDQ29udGFpbmVyc0NoZWNrZXIsIE9iakNDb250YWluZXJzQ2hlY2tlci5jcHAsICJDaGVja3MgZm9yIGluZGV4IG91dC1vZi1ib3VuZHMgd2hlbiB1c2luZyAnQ0ZBcnJheScgQVBJIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigib3N4LmNvY29hLkRlYWxsb2MiLCBPYmpDRGVhbGxvY0NoZWNrZXIsIENoZWNrT2JqQ0RlYWxsb2MuY3BwLCAiV2FybiBhYm91dCBPYmplY3RpdmUtQyBjbGFzc2VzIHRoYXQgbGFjayBhIGNvcnJlY3QgaW1wbGVtZW50YXRpb24gb2YgLWRlYWxsb2MiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJvc3guY29jb2EuT2JqQ0dlbmVyaWNzIiwgT2JqQ0dlbmVyaWNzQ2hlY2tlciwgRHluYW1pY1R5cGVQcm9wYWdhdGlvbi5jcHAsICJDaGVjayBmb3IgdHlwZSBlcnJvcnMgd2hlbiB1c2luZyBPYmplY3RpdmUtQyBnZW5lcmljcyIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoIm9zeC5jb2NvYS5Mb29wcyIsIE9iakNMb29wQ2hlY2tlciwgQmFzaWNPYmpDRm91bmRhdGlvbkNoZWNrcy5jcHAsICJJbXByb3ZlZCBtb2RlbGluZyBvZiBsb29wcyB1c2luZyBDb2NvYSBjb2xsZWN0aW9uIHR5cGVzIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigib3N4LmNvY29hLkluY29tcGF0aWJsZU1ldGhvZFR5cGVzIiwgT2JqQ01ldGhTaWdzQ2hlY2tlciwgQ2hlY2tPYmpDSW5zdE1ldGhTaWduYXR1cmUuY3BwLCAiV2FybiBhYm91dCBPYmplY3RpdmUtQyBtZXRob2Qgc2lnbmF0dXJlcyB3aXRoIHR5cGUgaW5jb21wYXRpYmlsaXRpZXMiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJvc3guY29jb2EuTm9uTmlsUmV0dXJuVmFsdWUiLCBPYmpDTm9uTmlsUmV0dXJuVmFsdWVDaGVja2VyLCBCYXNpY09iakNGb3VuZGF0aW9uQ2hlY2tzLmNwcCwgIk1vZGVsIHRoZSBBUElzIHRoYXQgYXJlIGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgbm9uLW5pbCB2YWx1ZSIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoIm9zeC5PYmpDUHJvcGVydHkiLCBPYmpDUHJvcGVydHlDaGVja2VyLCBPYmpDUHJvcGVydHlDaGVja2VyLmNwcCwgIkNoZWNrIGZvciBwcm9wZXIgdXNlcyBvZiBPYmplY3RpdmUtQyBwcm9wZXJ0aWVzIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigib3N4LmNvY29hLlNlbGZJbml0IiwgT2JqQ1NlbGZJbml0Q2hlY2tlciwgT2JqQ1NlbGZJbml0Q2hlY2tlci5jcHAsICJDaGVjayB0aGF0ICdzZWxmJyBpcyBwcm9wZXJseSBpbml0aWFsaXplZCBpbnNpZGUgYW4gaW5pdGlhbGl6ZXIgbWV0aG9kIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigib3N4LmNvY29hLk1pc3NpbmdTdXBlckNhbGwiLCBPYmpDU3VwZXJDYWxsQ2hlY2tlciwgT2JqQ01pc3NpbmdTdXBlckNhbGxDaGVja2VyLmNwcCwgIldhcm4gYWJvdXQgT2JqZWN0aXZlLUMgbWV0aG9kcyB0aGF0IGxhY2sgYSBuZWNlc3NhcnkgY2FsbCB0byBzdXBlciIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoIm9zeC5jb2NvYS5TdXBlckRlYWxsb2MiLCBPYmpDU3VwZXJEZWFsbG9jQ2hlY2tlciwgT2JqQ1N1cGVyRGVhbGxvY0NoZWNrZXIuY3BwLCAiV2FybiBhYm91dCBpbXByb3BlciB1c2Ugb2YgJ1tzdXBlciBkZWFsbG9jXScgaW4gT2JqZWN0aXZlLUMiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJvc3guY29jb2EuVW51c2VkSXZhcnMiLCBPYmpDVW51c2VkSXZhcnNDaGVja2VyLCBPYmpDVW51c2VkSVZhcnNDaGVja2VyLmNwcCwgIldhcm4gYWJvdXQgcHJpdmF0ZSBpdmFycyB0aGF0IGFyZSBuZXZlciB1c2VkIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigib3B0aW4ucGVyZm9ybWFuY2UuUGFkZGluZyIsIFBhZGRpbmdDaGVja2VyLCBQYWRkaW5nQ2hlY2tlci5jcHAsICJDaGVjayBmb3IgZXhjZXNzaXZlbHkgcGFkZGVkIHN0cnVjdHMuIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigiYWxwaGEub3N4LmNvY29hLmxvY2FsaXphYmlsaXR5LlBsdXJhbE1pc3VzZUNoZWNrZXIiLCBQbHVyYWxNaXN1c2VDaGVja2VyLCBMb2NhbGl6YXRpb25DaGVja2VyLmNwcCwgIldhcm5zIGFnYWluc3QgdXNpbmcgb25lIHZzLiBtYW55IHBsdXJhbCBwYXR0ZXJuIGluIGNvZGUgd2hlbiBnZW5lcmF0aW5nIGxvY2FsaXplZCBzdHJpbmdzLiIsIC0xLCB0cnVlKQorQ0hFQ0tFUigiYWxwaGEuY29yZS5Qb2ludGVyQXJpdGhtIiwgUG9pbnRlckFyaXRoQ2hlY2tlciwgUG9pbnRlckFyaXRoQ2hlY2tlciwgIkNoZWNrIGZvciBwb2ludGVyIGFyaXRobWV0aWMgb24gbG9jYXRpb25zIG90aGVyIHRoYW4gYXJyYXkgZWxlbWVudHMiLCAtMSwgdHJ1ZSkKK0NIRUNLRVIoImFscGhhLmNvcmUuUG9pbnRlclN1YiIsIFBvaW50ZXJTdWJDaGVja2VyLCBQb2ludGVyU3ViQ2hlY2tlciwgIkNoZWNrIGZvciBwb2ludGVyIHN1YnRyYWN0aW9ucyBvbiB0d28gcG9pbnRlcnMgcG9pbnRpbmcgdG8gZGlmZmVyZW50IG1lbW9yeSBjaHVua3MiLCAtMSwgdHJ1ZSkKK0NIRUNLRVIoImFscGhhLnVuaXguUHRocmVhZExvY2siLCBQdGhyZWFkTG9ja0NoZWNrZXIsIFB0aHJlYWRMb2NrQ2hlY2tlci5jcHAsICJTaW1wbGUgbG9jayAtPiB1bmxvY2sgY2hlY2tlciIsIC0xLCB0cnVlKQorQ0hFQ0tFUigib3N4LmNvY29hLlJldGFpbkNvdW50IiwgUmV0YWluQ291bnRDaGVja2VyLCBSZXRhaW5Db3VudENoZWNrZXIuY3BwLCAiQ2hlY2sgZm9yIGxlYWtzIGFuZCBpbXByb3BlciByZWZlcmVuY2UgY291bnQgbWFuYWdlbWVudCIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoImFscGhhLnNlY3VyaXR5LlJldHVyblB0clJhbmdlIiwgUmV0dXJuUG9pbnRlclJhbmdlQ2hlY2tlciwgUmV0dXJuUG9pbnRlclJhbmdlQ2hlY2tlci5jcHAsICJDaGVjayBmb3IgYW4gb3V0LW9mLWJvdW5kIHBvaW50ZXIgYmVpbmcgcmV0dXJuZWQgdG8gY2FsbGVycyIsIC0xLCB0cnVlKQorQ0hFQ0tFUigiY29yZS51bmluaXRpYWxpemVkLlVuZGVmUmV0dXJuIiwgUmV0dXJuVW5kZWZDaGVja2VyLCBSZXR1cm5VbmRlZkNoZWNrZXIuY3BwLCAiQ2hlY2sgZm9yIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIGJlaW5nIHJldHVybmVkIHRvIHRoZSBjYWxsZXIiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJhbHBoYS51bml4LlNpbXBsZVN0cmVhbSIsIFNpbXBsZVN0cmVhbUNoZWNrZXIsIFNpbXBsZVN0cmVhbUNoZWNrZXIuY3BwLCAiQ2hlY2sgZm9yIG1pc3VzZXMgb2Ygc3RyZWFtIEFQSXMiLCAtMSwgdHJ1ZSkKK0NIRUNLRVIoImFscGhhLmNvcmUuU2l6ZW9mUHRyIiwgU2l6ZW9mUG9pbnRlckNoZWNrZXIsIENoZWNrU2l6ZW9mUG9pbnRlci5jcHAsICJXYXJuIGFib3V0IHVuaW50ZW5kZWQgdXNlIG9mIHNpemVvZigpIG9uIHBvaW50ZXIgZXhwcmVzc2lvbnMiLCAtMSwgdHJ1ZSkKK0NIRUNLRVIoImFscGhhLmNvcmUuU3RhY2tBZGRyZXNzQXN5bmNFc2NhcGUiLCBTdGFja0FkZHJBc3luY0VzY2FwZUNoZWNrZXIsIFN0YWNrQWRkckVzY2FwZUNoZWNrZXIuY3BwLCAiQ2hlY2sgdGhhdCBhZGRyZXNzZXMgdG8gc3RhY2sgbWVtb3J5IGRvIG5vdCBlc2NhcGUgdGhlIGZ1bmN0aW9uIiwgLTEsIHRydWUpCitDSEVDS0VSKCJjb3JlLlN0YWNrQWRkcmVzc0VzY2FwZSIsIFN0YWNrQWRkckVzY2FwZUNoZWNrZXIsIFN0YWNrQWRkckVzY2FwZUNoZWNrZXIuY3BwLCAiQ2hlY2sgdGhhdCBhZGRyZXNzZXMgdG8gc3RhY2sgbWVtb3J5IGRvIG5vdCBlc2NhcGUgdGhlIGZ1bmN0aW9uIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigidW5peC5TdGRDTGlicmFyeUZ1bmN0aW9ucyIsIFN0ZENMaWJyYXJ5RnVuY3Rpb25zQ2hlY2tlciwgU3RkTGlicmFyeUZ1bmN0aW9uc0NoZWNrZXIuY3BwLCAiSW1wcm92ZSBtb2RlbGluZyBvZiB0aGUgQyBzdGFuZGFyZCBsaWJyYXJ5IGZ1bmN0aW9ucyIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoImFscGhhLnVuaXguU3RyZWFtIiwgU3RyZWFtQ2hlY2tlciwgU3RyZWFtQ2hlY2tlci5jcHAsICJDaGVjayBzdHJlYW0gaGFuZGxpbmcgZnVuY3Rpb25zIiwgLTEsIHRydWUpCitDSEVDS0VSKCJkZWJ1Zy5UYWludFRlc3QiLCBUYWludFRlc3RlckNoZWNrZXIsIFRhaW50VGVzdGVyQ2hlY2tlci5jcHAsICJNYXJrIHRhaW50ZWQgc3ltYm9scyBhcyBzdWNoLiIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoImFscGhhLmNvcmUuVGVzdEFmdGVyRGl2WmVybyIsIFRlc3RBZnRlckRpdlplcm9DaGVja2VyLCBUZXN0QWZ0ZXJEaXZaZXJvQ2hlY2tlci5jcHAsICJDaGVjayBmb3IgZGl2aXNpb24gYnkgdmFyaWFibGUgdGhhdCBpcyBsYXRlciBjb21wYXJlZCBhZ2FpbnN0IDAuIEVpdGhlciB0aGUgY29tcGFyaXNvbiBpcyB1c2VsZXNzIG9yIHRoZXJlIGlzIGRpdmlzaW9uIGJ5IHplcm8uIiwgLTEsIHRydWUpCitDSEVDS0VSKCJkZWJ1Zy5EdW1wVHJhdmVyc2FsIiwgVHJhdmVyc2FsRHVtcGVyLCBUcmF2ZXJzYWxDaGVja2VyLmNwcCwgIlByaW50IGJyYW5jaCBjb25kaXRpb25zIGFzIHRoZXkgYXJlIHRyYXZlcnNlZCBieSB0aGUgZW5naW5lIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigiYXBpTW9kZWxpbmcuVHJ1c3ROb25udWxsIiwgVHJ1c3ROb25udWxsQ2hlY2tlciwgVHJ1c3ROb25udWxsQ2hlY2tlci5jcHAsICJUcnVzdCB0aGF0IHJldHVybnMgZnJvbSBmcmFtZXdvcmsgbWV0aG9kcyBhbm5vdGF0ZWQgd2l0aCBfTm9ubnVsbCBhcmUgbm90IG51bGwiLCAtMSwgdHJ1ZSkKK0NIRUNLRVIoInNlY3VyaXR5Lmluc2VjdXJlQVBJLlVuY2hlY2tlZFJldHVybiIsIFVuY2hlY2tlZFJldHVybiwgQ2hlY2tTZWN1cml0eVN5bnRheE9ubHkuY3BwLCAiV2FybiBvbiB1c2VzIG9mIGZ1bmN0aW9ucyB3aG9zZSByZXR1cm4gdmFsdWVzIG11c3QgYmUgYWx3YXlzIGNoZWNrZWQiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJjb3JlLnVuaW5pdGlhbGl6ZWQuQnJhbmNoIiwgVW5kZWZCcmFuY2hDaGVja2VyLCBVbmRlZkJyYW5jaENoZWNrZXIuY3BwLCAiQ2hlY2sgZm9yIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIHVzZWQgYXMgYnJhbmNoIGNvbmRpdGlvbnMiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJjb3JlLnVuaW5pdGlhbGl6ZWQuQ2FwdHVyZWRCbG9ja1ZhcmlhYmxlIiwgVW5kZWZDYXB0dXJlZEJsb2NrVmFyQ2hlY2tlciwgVW5kZWZDYXB0dXJlZEJsb2NrVmFyQ2hlY2tlci5jcHAsICJDaGVjayBmb3IgYmxvY2tzIHRoYXQgY2FwdHVyZSB1bmluaXRpYWxpemVkIHZhbHVlcyIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoImNvcmUuVW5kZWZpbmVkQmluYXJ5T3BlcmF0b3JSZXN1bHQiLCBVbmRlZlJlc3VsdENoZWNrZXIsIFVuZGVmUmVzdWx0Q2hlY2tlci5jcHAsICJDaGVjayBmb3IgdW5kZWZpbmVkIHJlc3VsdHMgb2YgYmluYXJ5IG9wZXJhdG9ycyIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoImNvcmUudW5pbml0aWFsaXplZC5BcnJheVN1YnNjcmlwdCIsIFVuZGVmaW5lZEFycmF5U3Vic2NyaXB0Q2hlY2tlciwgVW5kZWZpbmVkQXJyYXlTdWJzY3JpcHRDaGVja2VyLmNwcCwgIkNoZWNrIGZvciB1bmluaXRpYWxpemVkIHZhbHVlcyB1c2VkIGFzIGFycmF5IHN1YnNjcmlwdHMiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJjb3JlLnVuaW5pdGlhbGl6ZWQuQXNzaWduIiwgVW5kZWZpbmVkQXNzaWdubWVudENoZWNrZXIsIFVuZGVmaW5lZEFzc2lnbm1lbnRDaGVja2VyLmNwcCwgIkNoZWNrIGZvciBhc3NpZ25pbmcgdW5pbml0aWFsaXplZCB2YWx1ZXMiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJ2YWxpc3QuVW5pbml0aWFsaXplZCIsIFVuaW5pdGlhbGl6ZWRDaGVja2VyLCBWYWxpc3RDaGVja2VyLmNwcCwgIkNoZWNrIGZvciB1c2FnZXMgb2YgdW5pbml0aWFsaXplZCAob3IgYWxyZWFkeSByZWxlYXNlZCkgdmFfbGlzdHMuIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigidW5peC5BUEkiLCBVbml4QVBJTWlzdXNlQ2hlY2tlciwgVW5peEFQSUNoZWNrZXIuY3BwLCAiQ2hlY2sgY2FsbHMgdG8gdmFyaW91cyBVTklYL1Bvc2l4IGZ1bmN0aW9ucyIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoIm9wdGluLnBvcnRhYmlsaXR5LlVuaXhBUEkiLCBVbml4QVBJUG9ydGFiaWxpdHlDaGVja2VyLCBVbml4QVBJQ2hlY2tlci5jcHAsICJGaW5kcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGJlaGF2aW9yIGluIFVOSVgvUG9zaXggZnVuY3Rpb25zIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigiYWxwaGEuZGVhZGNvZGUuVW5yZWFjaGFibGVDb2RlIiwgVW5yZWFjaGFibGVDb2RlQ2hlY2tlciwgVW5yZWFjaGFibGVDb2RlQ2hlY2tlci5jcHAsICJDaGVjayB1bnJlYWNoYWJsZSBjb2RlIiwgLTEsIHRydWUpCitDSEVDS0VSKCJ2YWxpc3QuVW50ZXJtaW5hdGVkIiwgVW50ZXJtaW5hdGVkQ2hlY2tlciwgVmFsaXN0Q2hlY2tlci5jcHAsICJDaGVjayBmb3IgdmFfbGlzdHMgd2hpY2ggYXJlIG5vdCByZWxlYXNlZCBieSBhIHZhX2VuZCBjYWxsLiIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoImNvcmUuVkxBU2l6ZSIsIFZMQVNpemVDaGVja2VyLCBWTEFTaXplQ2hlY2tlci5jcHAsICJDaGVjayBmb3IgZGVjbGFyYXRpb25zIG9mIFZMQSBvZiB1bmRlZmluZWQgb3IgemVybyBzaXplIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigib3N4LmNvY29hLlZhcmlhZGljTWV0aG9kVHlwZXMiLCBWYXJpYWRpY01ldGhvZFR5cGVDaGVja2VyLCBCYXNpY09iakNGb3VuZGF0aW9uQ2hlY2tzLmNwcCwgIkNoZWNrIGZvciBwYXNzaW5nIG5vbi1PYmplY3RpdmUtQyB0eXBlcyB0byB2YXJpYWRpYyBjb2xsZWN0aW9uIGluaXRpYWxpemF0aW9uIG1ldGhvZHMgdGhhdCBleHBlY3Qgb25seSBPYmplY3RpdmUtQyB0eXBlcyIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoInVuaXguVmZvcmsiLCBWZm9ya0NoZWNrZXIsIFZmb3JrQ2hlY2tlci5jcHAsICJDaGVjayBmb3IgcHJvcGVyIHVzYWdlIG9mIHZmb3JrIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigib3B0aW4uY3BsdXNwbHVzLlZpcnR1YWxDYWxsIiwgVmlydHVhbENhbGxDaGVja2VyLCBWaXJ0dWFsQ2FsbENoZWNrZXIuY3BwLCAiQ2hlY2sgdmlydHVhbCBmdW5jdGlvbiBjYWxscyBkdXJpbmcgY29uc3RydWN0aW9uIG9yIGRlc3RydWN0aW9uIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigic2VjdXJpdHkuaW5zZWN1cmVBUEkuZ2V0cHciLCBnZXRwdywgQ2hlY2tTZWN1cml0eVN5bnRheE9ubHkuY3BwLCAiV2FybiBvbiB1c2VzIG9mIHRoZSAnZ2V0cHcnIGZ1bmN0aW9uIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigic2VjdXJpdHkuaW5zZWN1cmVBUEkuZ2V0cyIsIGdldHMsIENoZWNrU2VjdXJpdHlTeW50YXhPbmx5LmNwcCwgIldhcm4gb24gdXNlcyBvZiB0aGUgJ2dldHMnIGZ1bmN0aW9uIiwgLTEsIGZhbHNlKQorQ0hFQ0tFUigic2VjdXJpdHkuaW5zZWN1cmVBUEkubWtzdGVtcCIsIG1rc3RlbXAsIENoZWNrU2VjdXJpdHlTeW50YXhPbmx5LmNwcCwgIldhcm4gd2hlbiAnbWtzdGVtcCcgaXMgcGFzc2VkIGZld2VyIHRoYW4gNiBYJ3MgaW4gdGhlIGZvcm1hdCBzdHJpbmciLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJzZWN1cml0eS5pbnNlY3VyZUFQSS5ta3RlbXAiLCBta3RlbXAsIENoZWNrU2VjdXJpdHlTeW50YXhPbmx5LmNwcCwgIldhcm4gb24gdXNlcyBvZiB0aGUgJ21rdGVtcCcgZnVuY3Rpb24iLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJzZWN1cml0eS5pbnNlY3VyZUFQSS5yYW5kIiwgcmFuZCwgQ2hlY2tTZWN1cml0eVN5bnRheE9ubHkuY3BwLCAiV2FybiBvbiB1c2VzIG9mIHRoZSAncmFuZCcsICdyYW5kb20nLCBhbmQgcmVsYXRlZCBmdW5jdGlvbnMiLCAtMSwgZmFsc2UpCitDSEVDS0VSKCJzZWN1cml0eS5pbnNlY3VyZUFQSS5zdHJjcHkiLCBzdHJjcHksIENoZWNrU2VjdXJpdHlTeW50YXhPbmx5LmNwcCwgIldhcm4gb24gdXNlcyBvZiB0aGUgJ3N0cmNweScgYW5kICdzdHJjYXQnIGZ1bmN0aW9ucyIsIC0xLCBmYWxzZSkKK0NIRUNLRVIoInNlY3VyaXR5Lmluc2VjdXJlQVBJLnZmb3JrIiwgdmZvcmssIENoZWNrU2VjdXJpdHlTeW50YXhPbmx5LmNwcCwgIldhcm4gb24gdXNlcyBvZiB0aGUgJ3Zmb3JrJyBmdW5jdGlvbiIsIC0xLCBmYWxzZSkKKyNlbmRpZiAvLyBHRVRfQ0hFQ0tFUlMKKworCisjaWZkZWYgR0VUX01FTUJFUl9BUlJBWVMKK3N0YXRpYyBjb25zdCBzaG9ydCBTdWJQYWNrYWdlQXJyYXkwW10gPSB7IDMsIDE3LCAyMSwgMzEsIDM5LCAyMywgMSwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBTdWJQYWNrYWdlQXJyYXkxW10gPSB7IDIsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MltdID0geyAyOCwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBTdWJQYWNrYWdlQXJyYXkzW10gPSB7IDQsIDYsIDcsIDgsIDExLCAxMCwgMTIsIDEzLCAxNCwgNSwgMTYsIDksIDE1LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTRbXSA9IHsgNiwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXk1W10gPSB7IDIwLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTZbXSA9IHsgMjQsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5N1tdID0geyAyNSwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXk4W10gPSB7IDMwLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTlbXSA9IHsgMzksIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTBbXSA9IHsgNDQsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTFbXSA9IHsgNDksIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTJbXSA9IHsgOTQsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTNbXSA9IHsgOTUsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTRbXSA9IHsgMTAxLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTE1W10gPSB7IDEwMiwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxNltdID0geyAxMDcsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgU3ViUGFja2FnZUFycmF5MTdbXSA9IHsgMTgsIDE5LCAyMCwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxOFtdID0geyAzMywgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxOVtdID0geyA1MSwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkyMFtdID0geyA2MiwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBTdWJQYWNrYWdlQXJyYXkyMVtdID0geyAyMiwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkyMltdID0geyAxMTksIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgU3ViUGFja2FnZUFycmF5MjNbXSA9IHsgMjQsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgU3ViUGFja2FnZUFycmF5MjRbXSA9IHsgMjksIDI3LCAyOCwgMjUsIDI2LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTI1W10gPSB7IDM1LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTI2W10gPSB7IDM2LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTI3W10gPSB7IDUwLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTI4W10gPSB7IDYxLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IFN1YlBhY2thZ2VBcnJheTI5W10gPSB7IDMwLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTMwW10gPSB7IDkzLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IFN1YlBhY2thZ2VBcnJheTMxW10gPSB7IDM3LCAzMiwgMzMsIDM2LCAzNCwgMzUsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MzJbXSA9IHsgMiwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkzM1tdID0geyAzLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTM0W10gPSB7IDU4LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTM1W10gPSB7IDYzLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTM2W10gPSB7IDk4LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IFN1YlBhY2thZ2VBcnJheTM3W10gPSB7IDM4LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTM4W10gPSB7IDQ4LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IFN1YlBhY2thZ2VBcnJheTM5W10gPSB7IDQ1LCA0MSwgNDIsIDQ0LCA0MywgNDAsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5NDBbXSA9IHsgNSwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXk0MVtdID0geyAyNiwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXk0MltdID0geyA5NiwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXk0M1tdID0geyAxMDAsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5NDRbXSA9IHsgMTA1LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IFN1YlBhY2thZ2VBcnJheTQ1W10gPSB7IDQ4LCA0NiwgNDcsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5NDZbXSA9IHsgMTMsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5NDdbXSA9IHsgMTQsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5NDhbXSA9IHsgMTYsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgU3ViUGFja2FnZUFycmF5NDlbXSA9IHsgNTEsIDUwLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTUwW10gPSB7IDEwOSwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBTdWJQYWNrYWdlQXJyYXk1MVtdID0geyA1MiwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXk1MltdID0geyA0NywgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBTdWJQYWNrYWdlQXJyYXk1M1tdID0geyA2MywgNjYsIDU5LCA1NCwgNTcsIDYyLCA1NSwgNjEsIDYwLCA1NiwgNTgsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5NTRbXSA9IHsgMTksIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5NTVbXSA9IHsgMzcsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5NTZbXSA9IHsgNDAsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5NTdbXSA9IHsgNzEsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5NThbXSA9IHsgNzIsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5NTlbXSA9IHsgMzQsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5NjBbXSA9IHsgMTAzLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTYxW10gPSB7IDExMywgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXk2MltdID0geyAxMjEsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgU3ViUGFja2FnZUFycmF5NjNbXSA9IHsgNjUsIDY0LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTY0W10gPSB7IDcsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5NjVbXSA9IHsgNjksIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgU3ViUGFja2FnZUFycmF5NjZbXSA9IHsgNjcsIDY4LCA2OSwgNzAsIDcxLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTY3W10gPSB7IDExNCwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXk2OFtdID0geyAxMTUsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5NjlbXSA9IHsgMTExLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTcwW10gPSB7IDExMiwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXk3MVtdID0geyA5OSwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBTdWJQYWNrYWdlQXJyYXk3MltdID0geyA3MywgNzQsIDc1LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTczW10gPSB7IDY2LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTc0W10gPSB7IDY3LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTc1W10gPSB7IDE4LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IFN1YlBhY2thZ2VBcnJheTc2W10gPSB7IDc3LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTc3W10gPSB7IDMyLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IFN1YlBhY2thZ2VBcnJheTc4W10gPSB7IDc5LCA4NCwgODUsIDkwLCA4MSwgOTEsIDgyLCA4MCwgODYsIDgzLCA4OCwgODksIDg3LCA5MiwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXk3OVtdID0geyAwLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTgwW10gPSB7IDI5LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTgxW10gPSB7IDksIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5ODJbXSA9IHsgMjIsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5ODNbXSA9IHsgMjEsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5ODRbXSA9IHsgMzgsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5ODVbXSA9IHsgNTMsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5ODZbXSA9IHsgMTA4LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTg3W10gPSB7IDQzLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTg4W10gPSB7IDEsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5ODlbXSA9IHsgMTA2LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTkwW10gPSB7IDEwLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTkxW10gPSB7IDIzLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTkyW10gPSB7IDQyLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IFN1YlBhY2thZ2VBcnJheTkzW10gPSB7IDk0LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTk0W10gPSB7IDUyLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IFN1YlBhY2thZ2VBcnJheTk1W10gPSB7IDk2LCA5NywgOTgsIDk5LCAxMDAsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5OTZbXSA9IHsgNzMsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5OTdbXSA9IHsgNzQsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5OThbXSA9IHsgNzUsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5OTlbXSA9IHsgNzYsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTAwW10gPSB7IDc3LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IFN1YlBhY2thZ2VBcnJheTEwMVtdID0geyAxMTQsIDEwMiwgMTExLCAxMDYsIDEwNCwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBTdWJQYWNrYWdlQXJyYXkxMDJbXSA9IHsgMTAzLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTEwM1tdID0geyAxMjQsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgU3ViUGFja2FnZUFycmF5MTA0W10gPSB7IDEwNSwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxMDVbXSA9IHsgNTQsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgU3ViUGFja2FnZUFycmF5MTA2W10gPSB7IDEwNywgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBTdWJQYWNrYWdlQXJyYXkxMDdbXSA9IHsgMTA4LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IFN1YlBhY2thZ2VBcnJheTEwOFtdID0geyAxMTAsIDEwOSwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxMDlbXSA9IHsgNDEsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTEwW10gPSB7IDcwLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IFN1YlBhY2thZ2VBcnJheTExMVtdID0geyAxMTMsIDExMiwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxMTJbXSA9IHsgNDYsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTEzW10gPSB7IDkyLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IFN1YlBhY2thZ2VBcnJheTExNFtdID0geyAxMTUsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTE1W10gPSB7IDExOCwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBTdWJQYWNrYWdlQXJyYXkxMTZbXSA9IHsgMTIxLCAxMzksIDExOCwgMTE3LCAxMjAsIDExOSwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxMTdbXSA9IHsgNTYsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTE4W10gPSB7IDc4LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTExOVtdID0geyA4NywgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxMjBbXSA9IHsgNTUsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgU3ViUGFja2FnZUFycmF5MTIxW10gPSB7IDEyMiwgMTMxLCAxMjQsIDEzOCwgMTI5LCAxMjYsIDEzNywgMTM1LCAxMjcsIDEzMiwgMTI4LCAxMzAsIDEzNCwgMTMzLCAxMjUsIDEzNiwgMTIzLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTEyMltdID0geyA3OSwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxMjNbXSA9IHsgNCwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxMjRbXSA9IHsgMjcsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTI1W10gPSB7IDgyLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTEyNltdID0geyA4NSwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxMjdbXSA9IHsgODQsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTI4W10gPSB7IDg5LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTEyOVtdID0geyA2NCwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxMzBbXSA9IHsgNjUsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTMxW10gPSB7IDY4LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTEzMltdID0geyA4NiwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxMzNbXSA9IHsgODMsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTM0W10gPSB7IDk3LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTEzNVtdID0geyA4OCwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxMzZbXSA9IHsgOTAsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTM3W10gPSB7IDkxLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTEzOFtdID0geyAxMjIsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgU3ViUGFja2FnZUFycmF5MTM5W10gPSB7IDE0MywgMTQxLCAxNDIsIDE0MCwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxNDBbXSA9IHsgOCwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxNDFbXSA9IHsgMTEsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTQyW10gPSB7IDEyLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IFN1YlBhY2thZ2VBcnJheTE0M1tdID0geyAxNDUsIDE0NCwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxNDRbXSA9IHsgODEsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTQ1W10gPSB7IDgwLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IFN1YlBhY2thZ2VBcnJheTE0NltdID0geyAxNDgsIDE0NywgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxNDdbXSA9IHsgNDUsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgU3ViUGFja2FnZUFycmF5MTQ4W10gPSB7IDE1MSwgMTUwLCAxNTMsIDE1MiwgMTU0LCAxNTUsIDE1NiwgMTQ5LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTE0OVtdID0geyAxMTAsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTUwW10gPSB7IDEyNSwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxNTFbXSA9IHsgMTI2LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTE1MltdID0geyAxMjcsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTUzW10gPSB7IDEyOCwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxNTRbXSA9IHsgMTI5LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTE1NVtdID0geyAxMzAsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTU2W10gPSB7IDEzMSwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBTdWJQYWNrYWdlQXJyYXkxNTdbXSA9IHsgMTY0LCAxNTgsIDE1OSwgMTYwLCAxNjEsIDE2MywgMTYyLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTE1OFtdID0geyAxMTcsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTU5W10gPSB7IDU3LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTE2MFtdID0geyA1OSwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxNjFbXSA9IHsgNjAsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTYyW10gPSB7IDEwNCwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxNjNbXSA9IHsgMTIzLCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IFN1YlBhY2thZ2VBcnJheTE2NFtdID0geyAxNjYsIDE2NSwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxNjVbXSA9IHsgMTcsIC0xIH07CitzdGF0aWMgY29uc3Qgc2hvcnQgQ2hlY2tlckFycmF5MTY2W10gPSB7IDE1LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IFN1YlBhY2thZ2VBcnJheTE2N1tdID0geyAxNjksIDE3MCwgMTY4LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTE2OFtdID0geyAzMSwgLTEgfTsKK3N0YXRpYyBjb25zdCBzaG9ydCBDaGVja2VyQXJyYXkxNjlbXSA9IHsgMTE2LCAtMSB9Oworc3RhdGljIGNvbnN0IHNob3J0IENoZWNrZXJBcnJheTE3MFtdID0geyAxMjAsIC0xIH07CisjZW5kaWYgLy8gR0VUX01FTUJFUl9BUlJBWVMKKworCisjaWZkZWYgR0VUX0NIRUNLTkFNRV9UQUJMRQorICB7ICJhbHBoYSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFN1YlBhY2thZ2VBcnJheTAsIGZhbHNlIH0sCisgIHsgImFscGhhLmNsb25lIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU3ViUGFja2FnZUFycmF5MSwgdHJ1ZSB9LAorICB7ICJhbHBoYS5jbG9uZS5DbG9uZUNoZWNrZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTIsIDAsIGZhbHNlIH0sCisgIHsgImFscGhhLmNvcmUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU3ViUGFja2FnZUFycmF5MywgdHJ1ZSB9LAorICB7ICJhbHBoYS5jb3JlLkJvb2xBc3NpZ25tZW50IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTQsIDAsIGZhbHNlIH0sCisgIHsgImFscGhhLmNvcmUuQ2FsbEFuZE1lc3NhZ2VVbkluaXRSZWZBcmciLCAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5NSwgMCwgZmFsc2UgfSwKKyAgeyAiYWxwaGEuY29yZS5DYXN0U2l6ZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk2LCAwLCBmYWxzZSB9LAorICB7ICJhbHBoYS5jb3JlLkNhc3RUb1N0cnVjdCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTcsIDAsIGZhbHNlIH0sCisgIHsgImFscGhhLmNvcmUuQ29udmVyc2lvbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5OCwgMCwgZmFsc2UgfSwKKyAgeyAiYWxwaGEuY29yZS5EeW5hbWljVHlwZUNoZWNrZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk5LCAwLCBmYWxzZSB9LAorICB7ICJhbHBoYS5jb3JlLkZpeGVkQWRkciIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTEwLCAwLCBmYWxzZSB9LAorICB7ICJhbHBoYS5jb3JlLklkZW50aWNhbEV4cHIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTExLCAwLCBmYWxzZSB9LAorICB7ICJhbHBoYS5jb3JlLlBvaW50ZXJBcml0aG0iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTEyLCAwLCBmYWxzZSB9LAorICB7ICJhbHBoYS5jb3JlLlBvaW50ZXJTdWIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTEzLCAwLCBmYWxzZSB9LAorICB7ICJhbHBoYS5jb3JlLlNpemVvZlB0ciIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTE0LCAwLCBmYWxzZSB9LAorICB7ICJhbHBoYS5jb3JlLlN0YWNrQWRkcmVzc0FzeW5jRXNjYXBlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTE1LCAwLCBmYWxzZSB9LAorICB7ICJhbHBoYS5jb3JlLlRlc3RBZnRlckRpdlplcm8iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTE2LCAwLCBmYWxzZSB9LAorICB7ICJhbHBoYS5jcGx1c3BsdXMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFN1YlBhY2thZ2VBcnJheTE3LCB0cnVlIH0sCisgIHsgImFscGhhLmNwbHVzcGx1cy5EZWxldGVXaXRoTm9uVmlydHVhbER0b3IiLCAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTgsIDAsIGZhbHNlIH0sCisgIHsgImFscGhhLmNwbHVzcGx1cy5JdGVyYXRvclJhbmdlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTksIDAsIGZhbHNlIH0sCisgIHsgImFscGhhLmNwbHVzcGx1cy5NaXN1c2VkTW92ZWRPYmplY3QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MjAsIDAsIGZhbHNlIH0sCisgIHsgImFscGhhLmRlYWRjb2RlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU3ViUGFja2FnZUFycmF5MjEsIHRydWUgfSwKKyAgeyAiYWxwaGEuZGVhZGNvZGUuVW5yZWFjaGFibGVDb2RlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkyMiwgMCwgZmFsc2UgfSwKKyAgeyAiYWxwaGEub3N4IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJQYWNrYWdlQXJyYXkyMywgdHJ1ZSB9LAorICB7ICJhbHBoYS5vc3guY29jb2EiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFN1YlBhY2thZ2VBcnJheTI0LCB0cnVlIH0sCisgIHsgImFscGhhLm9zeC5jb2NvYS5EaXJlY3RJdmFyQXNzaWdubWVudCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MjUsIDAsIGZhbHNlIH0sCisgIHsgImFscGhhLm9zeC5jb2NvYS5EaXJlY3RJdmFyQXNzaWdubWVudEZvckFubm90YXRlZEZ1bmN0aW9ucyIsICAgICAgQ2hlY2tlckFycmF5MjYsIDAsIGZhbHNlIH0sCisgIHsgImFscGhhLm9zeC5jb2NvYS5JbnN0YW5jZVZhcmlhYmxlSW52YWxpZGF0aW9uIiwgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MjcsIDAsIGZhbHNlIH0sCisgIHsgImFscGhhLm9zeC5jb2NvYS5NaXNzaW5nSW52YWxpZGF0aW9uTWV0aG9kIiwgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MjgsIDAsIGZhbHNlIH0sCisgIHsgImFscGhhLm9zeC5jb2NvYS5sb2NhbGl6YWJpbGl0eSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU3ViUGFja2FnZUFycmF5MjksIHRydWUgfSwKKyAgeyAiYWxwaGEub3N4LmNvY29hLmxvY2FsaXphYmlsaXR5LlBsdXJhbE1pc3VzZUNoZWNrZXIiLCAgICAgICAgICAgICBDaGVja2VyQXJyYXkzMCwgMCwgZmFsc2UgfSwKKyAgeyAiYWxwaGEuc2VjdXJpdHkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJQYWNrYWdlQXJyYXkzMSwgdHJ1ZSB9LAorICB7ICJhbHBoYS5zZWN1cml0eS5BcnJheUJvdW5kIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTMyLCAwLCBmYWxzZSB9LAorICB7ICJhbHBoYS5zZWN1cml0eS5BcnJheUJvdW5kVjIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTMzLCAwLCBmYWxzZSB9LAorICB7ICJhbHBoYS5zZWN1cml0eS5NYWxsb2NPdmVyZmxvdyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTM0LCAwLCBmYWxzZSB9LAorICB7ICJhbHBoYS5zZWN1cml0eS5NbWFwV3JpdGVFeGVjIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTM1LCAwLCBmYWxzZSB9LAorICB7ICJhbHBoYS5zZWN1cml0eS5SZXR1cm5QdHJSYW5nZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTM2LCAwLCBmYWxzZSB9LAorICB7ICJhbHBoYS5zZWN1cml0eS50YWludCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFN1YlBhY2thZ2VBcnJheTM3LCB0cnVlIH0sCisgIHsgImFscGhhLnNlY3VyaXR5LnRhaW50LlRhaW50UHJvcGFnYXRpb24iLCAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MzgsIDAsIGZhbHNlIH0sCisgIHsgImFscGhhLnVuaXgiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU3ViUGFja2FnZUFycmF5MzksIHRydWUgfSwKKyAgeyAiYWxwaGEudW5peC5CbG9ja0luQ3JpdGljYWxTZWN0aW9uIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk0MCwgMCwgZmFsc2UgfSwKKyAgeyAiYWxwaGEudW5peC5DaHJvb3QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk0MSwgMCwgZmFsc2UgfSwKKyAgeyAiYWxwaGEudW5peC5QdGhyZWFkTG9jayIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk0MiwgMCwgZmFsc2UgfSwKKyAgeyAiYWxwaGEudW5peC5TaW1wbGVTdHJlYW0iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk0MywgMCwgZmFsc2UgfSwKKyAgeyAiYWxwaGEudW5peC5TdHJlYW0iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk0NCwgMCwgZmFsc2UgfSwKKyAgeyAiYWxwaGEudW5peC5jc3RyaW5nIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJQYWNrYWdlQXJyYXk0NSwgdHJ1ZSB9LAorICB7ICJhbHBoYS51bml4LmNzdHJpbmcuQnVmZmVyT3ZlcmxhcCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTQ2LCAwLCBmYWxzZSB9LAorICB7ICJhbHBoYS51bml4LmNzdHJpbmcuTm90TnVsbFRlcm1pbmF0ZWQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTQ3LCAwLCBmYWxzZSB9LAorICB7ICJhbHBoYS51bml4LmNzdHJpbmcuT3V0T2ZCb3VuZHMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTQ4LCAwLCBmYWxzZSB9LAorICB7ICJhcGlNb2RlbGluZyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFN1YlBhY2thZ2VBcnJheTQ5LCB0cnVlIH0sCisgIHsgImFwaU1vZGVsaW5nLlRydXN0Tm9ubnVsbCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5NTAsIDAsIGZhbHNlIH0sCisgIHsgImFwaU1vZGVsaW5nLmdvb2dsZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU3ViUGFja2FnZUFycmF5NTEsIHRydWUgfSwKKyAgeyAiYXBpTW9kZWxpbmcuZ29vZ2xlLkdUZXN0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk1MiwgMCwgZmFsc2UgfSwKKyAgeyAiY29yZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJQYWNrYWdlQXJyYXk1MywgZmFsc2UgfSwKKyAgeyAiY29yZS5DYWxsQW5kTWVzc2FnZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk1NCwgMCwgZmFsc2UgfSwKKyAgeyAiY29yZS5EaXZpZGVaZXJvIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk1NSwgMCwgZmFsc2UgfSwKKyAgeyAiY29yZS5EeW5hbWljVHlwZVByb3BhZ2F0aW9uIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk1NiwgMCwgZmFsc2UgfSwKKyAgeyAiY29yZS5Ob25OdWxsUGFyYW1DaGVja2VyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk1NywgMCwgZmFsc2UgfSwKKyAgeyAiY29yZS5Ob25uaWxTdHJpbmdDb25zdGFudHMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk1OCwgMCwgZmFsc2UgfSwKKyAgeyAiY29yZS5OdWxsRGVyZWZlcmVuY2UiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk1OSwgMCwgZmFsc2UgfSwKKyAgeyAiY29yZS5TdGFja0FkZHJlc3NFc2NhcGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk2MCwgMCwgZmFsc2UgfSwKKyAgeyAiY29yZS5VbmRlZmluZWRCaW5hcnlPcGVyYXRvclJlc3VsdCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk2MSwgMCwgZmFsc2UgfSwKKyAgeyAiY29yZS5WTEFTaXplIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk2MiwgMCwgZmFsc2UgfSwKKyAgeyAiY29yZS5idWlsdGluIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJQYWNrYWdlQXJyYXk2MywgZmFsc2UgfSwKKyAgeyAiY29yZS5idWlsdGluLkJ1aWx0aW5GdW5jdGlvbnMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk2NCwgMCwgZmFsc2UgfSwKKyAgeyAiY29yZS5idWlsdGluLk5vUmV0dXJuRnVuY3Rpb25zIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk2NSwgMCwgZmFsc2UgfSwKKyAgeyAiY29yZS51bmluaXRpYWxpemVkIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJQYWNrYWdlQXJyYXk2NiwgZmFsc2UgfSwKKyAgeyAiY29yZS51bmluaXRpYWxpemVkLkFycmF5U3Vic2NyaXB0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk2NywgMCwgZmFsc2UgfSwKKyAgeyAiY29yZS51bmluaXRpYWxpemVkLkFzc2lnbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk2OCwgMCwgZmFsc2UgfSwKKyAgeyAiY29yZS51bmluaXRpYWxpemVkLkJyYW5jaCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk2OSwgMCwgZmFsc2UgfSwKKyAgeyAiY29yZS51bmluaXRpYWxpemVkLkNhcHR1cmVkQmxvY2tWYXJpYWJsZSIsICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk3MCwgMCwgZmFsc2UgfSwKKyAgeyAiY29yZS51bmluaXRpYWxpemVkLlVuZGVmUmV0dXJuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk3MSwgMCwgZmFsc2UgfSwKKyAgeyAiY3BsdXNwbHVzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJQYWNrYWdlQXJyYXk3MiwgZmFsc2UgfSwKKyAgeyAiY3BsdXNwbHVzLk5ld0RlbGV0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk3MywgMCwgZmFsc2UgfSwKKyAgeyAiY3BsdXNwbHVzLk5ld0RlbGV0ZUxlYWtzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk3NCwgMCwgZmFsc2UgfSwKKyAgeyAiY3BsdXNwbHVzLlNlbGZBc3NpZ25tZW50IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk3NSwgMCwgZmFsc2UgfSwKKyAgeyAiZGVhZGNvZGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJQYWNrYWdlQXJyYXk3NiwgZmFsc2UgfSwKKyAgeyAiZGVhZGNvZGUuRGVhZFN0b3JlcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk3NywgMCwgZmFsc2UgfSwKKyAgeyAiZGVidWciLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJQYWNrYWdlQXJyYXk3OCwgZmFsc2UgfSwKKyAgeyAiZGVidWcuQW5hbHlzaXNPcmRlciIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk3OSwgMCwgZmFsc2UgfSwKKyAgeyAiZGVidWcuQ29uZmlnRHVtcGVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk4MCwgMCwgZmFsc2UgfSwKKyAgeyAiZGVidWcuRHVtcENGRyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk4MSwgMCwgZmFsc2UgfSwKKyAgeyAiZGVidWcuRHVtcENhbGxHcmFwaCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk4MiwgMCwgZmFsc2UgfSwKKyAgeyAiZGVidWcuRHVtcENhbGxzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk4MywgMCwgZmFsc2UgfSwKKyAgeyAiZGVidWcuRHVtcERvbWluYXRvcnMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk4NCwgMCwgZmFsc2UgfSwKKyAgeyAiZGVidWcuRHVtcExpdmVWYXJzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk4NSwgMCwgZmFsc2UgfSwKKyAgeyAiZGVidWcuRHVtcFRyYXZlcnNhbCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk4NiwgMCwgZmFsc2UgfSwKKyAgeyAiZGVidWcuRXhwckluc3BlY3Rpb24iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk4NywgMCwgZmFsc2UgfSwKKyAgeyAiZGVidWcuU3RhdHMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk4OCwgMCwgZmFsc2UgfSwKKyAgeyAiZGVidWcuVGFpbnRUZXN0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk4OSwgMCwgZmFsc2UgfSwKKyAgeyAiZGVidWcuVmlld0NGRyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk5MCwgMCwgZmFsc2UgfSwKKyAgeyAiZGVidWcuVmlld0NhbGxHcmFwaCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk5MSwgMCwgZmFsc2UgfSwKKyAgeyAiZGVidWcuVmlld0V4cGxvZGVkR3JhcGgiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk5MiwgMCwgZmFsc2UgfSwKKyAgeyAibGx2bSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJQYWNrYWdlQXJyYXk5MywgZmFsc2UgfSwKKyAgeyAibGx2bS5Db252ZW50aW9ucyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk5NCwgMCwgZmFsc2UgfSwKKyAgeyAibnVsbGFiaWxpdHkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJQYWNrYWdlQXJyYXk5NSwgZmFsc2UgfSwKKyAgeyAibnVsbGFiaWxpdHkuTnVsbFBhc3NlZFRvTm9ubnVsbCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk5NiwgMCwgZmFsc2UgfSwKKyAgeyAibnVsbGFiaWxpdHkuTnVsbFJldHVybmVkRnJvbU5vbm51bGwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk5NywgMCwgZmFsc2UgfSwKKyAgeyAibnVsbGFiaWxpdHkuTnVsbGFibGVEZXJlZmVyZW5jZWQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk5OCwgMCwgZmFsc2UgfSwKKyAgeyAibnVsbGFiaWxpdHkuTnVsbGFibGVQYXNzZWRUb05vbm51bGwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXk5OSwgMCwgZmFsc2UgfSwKKyAgeyAibnVsbGFiaWxpdHkuTnVsbGFibGVSZXR1cm5lZEZyb21Ob25udWxsIiwgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkxMDAsIDAsIGZhbHNlIH0sCisgIHsgIm9wdGluIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU3ViUGFja2FnZUFycmF5MTAxLCBmYWxzZSB9LAorICB7ICJvcHRpbi5jcGx1c3BsdXMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFN1YlBhY2thZ2VBcnJheTEwMiwgZmFsc2UgfSwKKyAgeyAib3B0aW4uY3BsdXNwbHVzLlZpcnR1YWxDYWxsIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkxMDMsIDAsIGZhbHNlIH0sCisgIHsgIm9wdGluLm1waSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU3ViUGFja2FnZUFycmF5MTA0LCBmYWxzZSB9LAorICB7ICJvcHRpbi5tcGkuTVBJLUNoZWNrZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTEwNSwgMCwgZmFsc2UgfSwKKyAgeyAib3B0aW4ub3N4IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJQYWNrYWdlQXJyYXkxMDYsIGZhbHNlIH0sCisgIHsgIm9wdGluLm9zeC5jb2NvYSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU3ViUGFja2FnZUFycmF5MTA3LCBmYWxzZSB9LAorICB7ICJvcHRpbi5vc3guY29jb2EubG9jYWxpemFiaWxpdHkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFN1YlBhY2thZ2VBcnJheTEwOCwgZmFsc2UgfSwKKyAgeyAib3B0aW4ub3N4LmNvY29hLmxvY2FsaXphYmlsaXR5LkVtcHR5TG9jYWxpemF0aW9uQ29udGV4dENoZWNrZXIiLCBDaGVja2VyQXJyYXkxMDksIDAsIGZhbHNlIH0sCisgIHsgIm9wdGluLm9zeC5jb2NvYS5sb2NhbGl6YWJpbGl0eS5Ob25Mb2NhbGl6ZWRTdHJpbmdDaGVja2VyIiwgICAgICAgQ2hlY2tlckFycmF5MTEwLCAwLCBmYWxzZSB9LAorICB7ICJvcHRpbi5wZXJmb3JtYW5jZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFN1YlBhY2thZ2VBcnJheTExMSwgZmFsc2UgfSwKKyAgeyAib3B0aW4ucGVyZm9ybWFuY2UuR0NEQW50aXBhdHRlcm4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkxMTIsIDAsIGZhbHNlIH0sCisgIHsgIm9wdGluLnBlcmZvcm1hbmNlLlBhZGRpbmciLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTEzLCAwLCBmYWxzZSB9LAorICB7ICJvcHRpbi5wb3J0YWJpbGl0eSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFN1YlBhY2thZ2VBcnJheTExNCwgZmFsc2UgfSwKKyAgeyAib3B0aW4ucG9ydGFiaWxpdHkuVW5peEFQSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkxMTUsIDAsIGZhbHNlIH0sCisgIHsgIm9zeCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU3ViUGFja2FnZUFycmF5MTE2LCBmYWxzZSB9LAorICB7ICJvc3guQVBJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTExNywgMCwgZmFsc2UgfSwKKyAgeyAib3N4Lk51bWJlck9iamVjdENvbnZlcnNpb24iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkxMTgsIDAsIGZhbHNlIH0sCisgIHsgIm9zeC5PYmpDUHJvcGVydHkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTE5LCAwLCBmYWxzZSB9LAorICB7ICJvc3guU2VjS2V5Y2hhaW5BUEkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTEyMCwgMCwgZmFsc2UgfSwKKyAgeyAib3N4LmNvY29hIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJQYWNrYWdlQXJyYXkxMjEsIGZhbHNlIH0sCisgIHsgIm9zeC5jb2NvYS5BdFN5bmMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTIyLCAwLCBmYWxzZSB9LAorICB7ICJvc3guY29jb2EuQXV0b3JlbGVhc2VXcml0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTEyMywgMCwgZmFsc2UgfSwKKyAgeyAib3N4LmNvY29hLkNsYXNzUmVsZWFzZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkxMjQsIDAsIGZhbHNlIH0sCisgIHsgIm9zeC5jb2NvYS5EZWFsbG9jIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTI1LCAwLCBmYWxzZSB9LAorICB7ICJvc3guY29jb2EuSW5jb21wYXRpYmxlTWV0aG9kVHlwZXMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTEyNiwgMCwgZmFsc2UgfSwKKyAgeyAib3N4LmNvY29hLkxvb3BzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkxMjcsIDAsIGZhbHNlIH0sCisgIHsgIm9zeC5jb2NvYS5NaXNzaW5nU3VwZXJDYWxsIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTI4LCAwLCBmYWxzZSB9LAorICB7ICJvc3guY29jb2EuTlNBdXRvcmVsZWFzZVBvb2wiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTEyOSwgMCwgZmFsc2UgfSwKKyAgeyAib3N4LmNvY29hLk5TRXJyb3IiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkxMzAsIDAsIGZhbHNlIH0sCisgIHsgIm9zeC5jb2NvYS5OaWxBcmciLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTMxLCAwLCBmYWxzZSB9LAorICB7ICJvc3guY29jb2EuTm9uTmlsUmV0dXJuVmFsdWUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTEzMiwgMCwgZmFsc2UgfSwKKyAgeyAib3N4LmNvY29hLk9iakNHZW5lcmljcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkxMzMsIDAsIGZhbHNlIH0sCisgIHsgIm9zeC5jb2NvYS5SZXRhaW5Db3VudCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTM0LCAwLCBmYWxzZSB9LAorICB7ICJvc3guY29jb2EuU2VsZkluaXQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTEzNSwgMCwgZmFsc2UgfSwKKyAgeyAib3N4LmNvY29hLlN1cGVyRGVhbGxvYyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkxMzYsIDAsIGZhbHNlIH0sCisgIHsgIm9zeC5jb2NvYS5VbnVzZWRJdmFycyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTM3LCAwLCBmYWxzZSB9LAorICB7ICJvc3guY29jb2EuVmFyaWFkaWNNZXRob2RUeXBlcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTEzOCwgMCwgZmFsc2UgfSwKKyAgeyAib3N4LmNvcmVGb3VuZGF0aW9uIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJQYWNrYWdlQXJyYXkxMzksIGZhbHNlIH0sCisgIHsgIm9zeC5jb3JlRm91bmRhdGlvbi5DRkVycm9yIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTQwLCAwLCBmYWxzZSB9LAorICB7ICJvc3guY29yZUZvdW5kYXRpb24uQ0ZOdW1iZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTE0MSwgMCwgZmFsc2UgfSwKKyAgeyAib3N4LmNvcmVGb3VuZGF0aW9uLkNGUmV0YWluUmVsZWFzZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkxNDIsIDAsIGZhbHNlIH0sCisgIHsgIm9zeC5jb3JlRm91bmRhdGlvbi5jb250YWluZXJzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU3ViUGFja2FnZUFycmF5MTQzLCBmYWxzZSB9LAorICB7ICJvc3guY29yZUZvdW5kYXRpb24uY29udGFpbmVycy5PdXRPZkJvdW5kcyIsICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTE0NCwgMCwgZmFsc2UgfSwKKyAgeyAib3N4LmNvcmVGb3VuZGF0aW9uLmNvbnRhaW5lcnMuUG9pbnRlclNpemVkVmFsdWVzIiwgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkxNDUsIDAsIGZhbHNlIH0sCisgIHsgInNlY3VyaXR5IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU3ViUGFja2FnZUFycmF5MTQ2LCBmYWxzZSB9LAorICB7ICJzZWN1cml0eS5GbG9hdExvb3BDb3VudGVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTE0NywgMCwgZmFsc2UgfSwKKyAgeyAic2VjdXJpdHkuaW5zZWN1cmVBUEkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJQYWNrYWdlQXJyYXkxNDgsIGZhbHNlIH0sCisgIHsgInNlY3VyaXR5Lmluc2VjdXJlQVBJLlVuY2hlY2tlZFJldHVybiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTQ5LCAwLCBmYWxzZSB9LAorICB7ICJzZWN1cml0eS5pbnNlY3VyZUFQSS5nZXRwdyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTE1MCwgMCwgZmFsc2UgfSwKKyAgeyAic2VjdXJpdHkuaW5zZWN1cmVBUEkuZ2V0cyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkxNTEsIDAsIGZhbHNlIH0sCisgIHsgInNlY3VyaXR5Lmluc2VjdXJlQVBJLm1rc3RlbXAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTUyLCAwLCBmYWxzZSB9LAorICB7ICJzZWN1cml0eS5pbnNlY3VyZUFQSS5ta3RlbXAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTE1MywgMCwgZmFsc2UgfSwKKyAgeyAic2VjdXJpdHkuaW5zZWN1cmVBUEkucmFuZCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkxNTQsIDAsIGZhbHNlIH0sCisgIHsgInNlY3VyaXR5Lmluc2VjdXJlQVBJLnN0cmNweSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTU1LCAwLCBmYWxzZSB9LAorICB7ICJzZWN1cml0eS5pbnNlY3VyZUFQSS52Zm9yayIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTE1NiwgMCwgZmFsc2UgfSwKKyAgeyAidW5peCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJQYWNrYWdlQXJyYXkxNTcsIGZhbHNlIH0sCisgIHsgInVuaXguQVBJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTU4LCAwLCBmYWxzZSB9LAorICB7ICJ1bml4Lk1hbGxvYyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTE1OSwgMCwgZmFsc2UgfSwKKyAgeyAidW5peC5NYWxsb2NTaXplb2YiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkxNjAsIDAsIGZhbHNlIH0sCisgIHsgInVuaXguTWlzbWF0Y2hlZERlYWxsb2NhdG9yIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTYxLCAwLCBmYWxzZSB9LAorICB7ICJ1bml4LlN0ZENMaWJyYXJ5RnVuY3Rpb25zIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTE2MiwgMCwgZmFsc2UgfSwKKyAgeyAidW5peC5WZm9yayIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkxNjMsIDAsIGZhbHNlIH0sCisgIHsgInVuaXguY3N0cmluZyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU3ViUGFja2FnZUFycmF5MTY0LCB0cnVlIH0sCisgIHsgInVuaXguY3N0cmluZy5CYWRTaXplQXJnIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTY1LCAwLCBmYWxzZSB9LAorICB7ICJ1bml4LmNzdHJpbmcuTnVsbEFyZyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTE2NiwgMCwgZmFsc2UgfSwKKyAgeyAidmFsaXN0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJQYWNrYWdlQXJyYXkxNjcsIGZhbHNlIH0sCisgIHsgInZhbGlzdC5Db3B5VG9TZWxmIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckFycmF5MTY4LCAwLCBmYWxzZSB9LAorICB7ICJ2YWxpc3QuVW5pbml0aWFsaXplZCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJBcnJheTE2OSwgMCwgZmFsc2UgfSwKKyAgeyAidmFsaXN0LlVudGVybWluYXRlZCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQXJyYXkxNzAsIDAsIGZhbHNlIH0sCisjZW5kaWYgLy8gR0VUX0NIRUNLTkFNRV9UQUJMRQorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DbGFuZ0NoZWNrZXJzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DbGFuZ0NoZWNrZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwYTMwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0NsYW5nQ2hlY2tlcnMuaApAQCAtMCwwICsxLDIyIEBACisvLz09PS0tLSBDbGFuZ0NoZWNrZXJzLmggLSBQcm92aWRlcyBidWlsdGluIGNoZWNrZXJzIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ0hFQ0tFUlNfQ0xBTkdDSEVDS0VSU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ0hFQ0tFUlNfQ0xBTkdDSEVDS0VSU19ICisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgZW50byB7CitjbGFzcyBDaGVja2VyUmVnaXN0cnk7CisKK3ZvaWQgcmVnaXN0ZXJCdWlsdGluQ2hlY2tlcnMoQ2hlY2tlclJlZ2lzdHJ5ICZyZWdpc3RyeSk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBlbnRvCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9DaGVja2Vycy9Mb2NhbENoZWNrZXJzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9DaGVja2Vycy9Mb2NhbENoZWNrZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYzZjA0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0xvY2FsQ2hlY2tlcnMuaApAQCAtMCwwICsxLDI4IEBACisvLz09LSBMb2NhbENoZWNrZXJzLmggLSBJbnRyYS1Qcm9jZWR1cmFsK0Zsb3ctU2Vuc2l0aXZlIENoZWNrZXJzIC0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHRvIGNhbGwgYSBzZXQgb2YgaW50cmEtcHJvY2VkdXJhbCAobG9jYWwpCisvLyAgY2hlY2tlcnMgdGhhdCB1c2UgZmxvdy9wYXRoLXNlbnNpdGl2ZSBhbmFseXNlcyB0byBmaW5kIGJ1Z3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NIRUNLRVJTX0xPQ0FMQ0hFQ0tFUlNfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NIRUNLRVJTX0xPQ0FMQ0hFQ0tFUlNfSAorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGVudG8geworCitjbGFzcyBFeHByRW5naW5lOworCit2b2lkIFJlZ2lzdGVyQ2FsbElubGluZXIoRXhwckVuZ2luZSAmRW5nKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGVudG8KK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL01QSUZ1bmN0aW9uQ2xhc3NpZmllci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvTVBJRnVuY3Rpb25DbGFzc2lmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlOTA4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL01QSUZ1bmN0aW9uQ2xhc3NpZmllci5oCkBAIC0wLDAgKzEsOTcgQEAKKy8vPT09LS0gTVBJRnVuY3Rpb25DbGFzc2lmaWVyLmggLSBjbGFzc2lmaWVzIE1QSSBmdW5jdGlvbnMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgZGVmaW5lcyBmdW5jdGlvbmFsaXR5IHRvIGlkZW50aWZ5IGFuZCBjbGFzc2lmeSBNUEkgZnVuY3Rpb25zLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfTElCX1NUQVRJQ0FOQUxZWkVSX0NIRUNLRVJTX01QSUNIRUNLRVJfTVBJRlVOQ1RJT05DTEFTU0lGSUVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19MSUJfU1RBVElDQU5BTFlaRVJfQ0hFQ0tFUlNfTVBJQ0hFQ0tFUl9NUElGVU5DVElPTkNMQVNTSUZJRVJfSAorCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0NoZWNrZXJDb250ZXh0LmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgZW50byB7CituYW1lc3BhY2UgbXBpIHsKKworY2xhc3MgTVBJRnVuY3Rpb25DbGFzc2lmaWVyIHsKK3B1YmxpYzoKKyAgTVBJRnVuY3Rpb25DbGFzc2lmaWVyKEFTVENvbnRleHQgJkFTVEN0eCkgeyBpZGVudGlmaWVySW5pdChBU1RDdHgpOyB9CisKKyAgLy8gZ2VuZXJhbCBpZGVudGlmaWVycworICBib29sIGlzTVBJVHlwZShjb25zdCBJZGVudGlmaWVySW5mbyAqY29uc3QgSWRlbnRJbmZvKSBjb25zdDsKKyAgYm9vbCBpc05vbkJsb2NraW5nVHlwZShjb25zdCBJZGVudGlmaWVySW5mbyAqY29uc3QgSWRlbnRJbmZvKSBjb25zdDsKKworICAvLyBwb2ludC10by1wb2ludCBpZGVudGlmaWVycworICBib29sIGlzUG9pbnRUb1BvaW50VHlwZShjb25zdCBJZGVudGlmaWVySW5mbyAqY29uc3QgSWRlbnRJbmZvKSBjb25zdDsKKworICAvLyBjb2xsZWN0aXZlIGlkZW50aWZpZXJzCisgIGJvb2wgaXNDb2xsZWN0aXZlVHlwZShjb25zdCBJZGVudGlmaWVySW5mbyAqY29uc3QgSWRlbnRJbmZvKSBjb25zdDsKKyAgYm9vbCBpc0NvbGxUb0NvbGwoY29uc3QgSWRlbnRpZmllckluZm8gKmNvbnN0IElkZW50SW5mbykgY29uc3Q7CisgIGJvb2wgaXNTY2F0dGVyVHlwZShjb25zdCBJZGVudGlmaWVySW5mbyAqY29uc3QgSWRlbnRJbmZvKSBjb25zdDsKKyAgYm9vbCBpc0dhdGhlclR5cGUoY29uc3QgSWRlbnRpZmllckluZm8gKmNvbnN0IElkZW50SW5mbykgY29uc3Q7CisgIGJvb2wgaXNBbGxnYXRoZXJUeXBlKGNvbnN0IElkZW50aWZpZXJJbmZvICpjb25zdCBJZGVudEluZm8pIGNvbnN0OworICBib29sIGlzQWxsdG9hbGxUeXBlKGNvbnN0IElkZW50aWZpZXJJbmZvICpjb25zdCBJZGVudEluZm8pIGNvbnN0OworICBib29sIGlzUmVkdWNlVHlwZShjb25zdCBJZGVudGlmaWVySW5mbyAqY29uc3QgSWRlbnRJbmZvKSBjb25zdDsKKyAgYm9vbCBpc0JjYXN0VHlwZShjb25zdCBJZGVudGlmaWVySW5mbyAqY29uc3QgSWRlbnRJbmZvKSBjb25zdDsKKworICAvLyBhZGRpdGlvbmFsIGlkZW50aWZpZXJzCisgIGJvb2wgaXNNUElfV2FpdChjb25zdCBJZGVudGlmaWVySW5mbyAqY29uc3QgSWRlbnRJbmZvKSBjb25zdDsKKyAgYm9vbCBpc01QSV9XYWl0YWxsKGNvbnN0IElkZW50aWZpZXJJbmZvICpjb25zdCBJZGVudEluZm8pIGNvbnN0OworICBib29sIGlzV2FpdFR5cGUoY29uc3QgSWRlbnRpZmllckluZm8gKmNvbnN0IElkZW50SW5mbykgY29uc3Q7CisKK3ByaXZhdGU6CisgIC8vIEluaXRpYWxpemVzIGZ1bmN0aW9uIGlkZW50aWZpZXJzLCB0byByZWNvZ25pemUgdGhlbSBkdXJpbmcgYW5hbHlzaXMuCisgIHZvaWQgaWRlbnRpZmllckluaXQoQVNUQ29udGV4dCAmQVNUQ3R4KTsKKyAgdm9pZCBpbml0UG9pbnRUb1BvaW50SWRlbnRpZmllcnMoQVNUQ29udGV4dCAmQVNUQ3R4KTsKKyAgdm9pZCBpbml0Q29sbGVjdGl2ZUlkZW50aWZpZXJzKEFTVENvbnRleHQgJkFTVEN0eCk7CisgIHZvaWQgaW5pdEFkZGl0aW9uYWxJZGVudGlmaWVycyhBU1RDb250ZXh0ICZBU1RDdHgpOworCisgIC8vIFRoZSBjb250YWluZXJzIGFyZSB1c2VkLCB0byBlbmFibGUgY2xhc3NpZmljYXRpb24gb2YgTVBJLWZ1bmN0aW9ucyBkdXJpbmcKKyAgLy8gYW5hbHlzaXMuCisgIGxsdm06OlNtYWxsVmVjdG9yPElkZW50aWZpZXJJbmZvICosIDEyPiBNUElOb25CbG9ja2luZ1R5cGVzOworCisgIGxsdm06OlNtYWxsVmVjdG9yPElkZW50aWZpZXJJbmZvICosIDEwPiBNUElQb2ludFRvUG9pbnRUeXBlczsKKyAgbGx2bTo6U21hbGxWZWN0b3I8SWRlbnRpZmllckluZm8gKiwgMTY+IE1QSUNvbGxlY3RpdmVUeXBlczsKKworICBsbHZtOjpTbWFsbFZlY3RvcjxJZGVudGlmaWVySW5mbyAqLCA0PiBNUElQb2ludFRvQ29sbFR5cGVzOworICBsbHZtOjpTbWFsbFZlY3RvcjxJZGVudGlmaWVySW5mbyAqLCA0PiBNUElDb2xsVG9Qb2ludFR5cGVzOworICBsbHZtOjpTbWFsbFZlY3RvcjxJZGVudGlmaWVySW5mbyAqLCA2PiBNUElDb2xsVG9Db2xsVHlwZXM7CisKKyAgbGx2bTo6U21hbGxWZWN0b3I8SWRlbnRpZmllckluZm8gKiwgMzI+IE1QSVR5cGU7CisKKyAgLy8gcG9pbnQtdG8tcG9pbnQgZnVuY3Rpb25zCisgIElkZW50aWZpZXJJbmZvICpJZGVudEluZm9fTVBJX1NlbmQgPSBudWxscHRyLCAqSWRlbnRJbmZvX01QSV9Jc2VuZCA9IG51bGxwdHIsCisgICAgICAqSWRlbnRJbmZvX01QSV9Tc2VuZCA9IG51bGxwdHIsICpJZGVudEluZm9fTVBJX0lzc2VuZCA9IG51bGxwdHIsCisgICAgICAqSWRlbnRJbmZvX01QSV9Cc2VuZCA9IG51bGxwdHIsICpJZGVudEluZm9fTVBJX0lic2VuZCA9IG51bGxwdHIsCisgICAgICAqSWRlbnRJbmZvX01QSV9Sc2VuZCA9IG51bGxwdHIsICpJZGVudEluZm9fTVBJX0lyc2VuZCA9IG51bGxwdHIsCisgICAgICAqSWRlbnRJbmZvX01QSV9SZWN2ID0gbnVsbHB0ciwgKklkZW50SW5mb19NUElfSXJlY3YgPSBudWxscHRyOworCisgIC8vIGNvbGxlY3RpdmUgZnVuY3Rpb25zCisgIElkZW50aWZpZXJJbmZvICpJZGVudEluZm9fTVBJX1NjYXR0ZXIgPSBudWxscHRyLAorICAgICAgKklkZW50SW5mb19NUElfSXNjYXR0ZXIgPSBudWxscHRyLCAqSWRlbnRJbmZvX01QSV9HYXRoZXIgPSBudWxscHRyLAorICAgICAgKklkZW50SW5mb19NUElfSWdhdGhlciA9IG51bGxwdHIsICpJZGVudEluZm9fTVBJX0FsbGdhdGhlciA9IG51bGxwdHIsCisgICAgICAqSWRlbnRJbmZvX01QSV9JYWxsZ2F0aGVyID0gbnVsbHB0ciwgKklkZW50SW5mb19NUElfQmNhc3QgPSBudWxscHRyLAorICAgICAgKklkZW50SW5mb19NUElfSWJjYXN0ID0gbnVsbHB0ciwgKklkZW50SW5mb19NUElfUmVkdWNlID0gbnVsbHB0ciwKKyAgICAgICpJZGVudEluZm9fTVBJX0lyZWR1Y2UgPSBudWxscHRyLCAqSWRlbnRJbmZvX01QSV9BbGxyZWR1Y2UgPSBudWxscHRyLAorICAgICAgKklkZW50SW5mb19NUElfSWFsbHJlZHVjZSA9IG51bGxwdHIsICpJZGVudEluZm9fTVBJX0FsbHRvYWxsID0gbnVsbHB0ciwKKyAgICAgICpJZGVudEluZm9fTVBJX0lhbGx0b2FsbCA9IG51bGxwdHIsICpJZGVudEluZm9fTVBJX0JhcnJpZXIgPSBudWxscHRyOworCisgIC8vIGFkZGl0aW9uYWwgZnVuY3Rpb25zCisgIElkZW50aWZpZXJJbmZvICpJZGVudEluZm9fTVBJX0NvbW1fcmFuayA9IG51bGxwdHIsCisgICAgICAqSWRlbnRJbmZvX01QSV9Db21tX3NpemUgPSBudWxscHRyLCAqSWRlbnRJbmZvX01QSV9XYWl0ID0gbnVsbHB0ciwKKyAgICAgICpJZGVudEluZm9fTVBJX1dhaXRhbGwgPSBudWxscHRyOworfTsKKworfSAvLyBlbmQgb2YgbmFtZXNwYWNlOiBtcGkKK30gLy8gZW5kIG9mIG5hbWVzcGFjZTogZW50bworfSAvLyBlbmQgb2YgbmFtZXNwYWNlOiBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL09iakNSZXRhaW5Db3VudC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvT2JqQ1JldGFpbkNvdW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlODU3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL09iakNSZXRhaW5Db3VudC5oCkBAIC0wLDAgKzEsMjMyIEBACisvLz09LS0gT2JqQ1JldGFpbkNvdW50LmggLSBSZXRhaW4gY291bnQgc3VtbWFyaWVzIGZvciBDb2NvYSAtLS0tLS0tKi0gQysrIC0qLS0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgY29yZSBkYXRhIHN0cnVjdHVyZXMgZm9yIHJldGFpbiBjb3VudCAic3VtbWFyaWVzIgorLy8gIGZvciBPYmplY3RpdmUtQyBhbmQgQ29yZSBGb3VuZGF0aW9uIEFQSXMuICBUaGVzZSBzdW1tYXJpZXMgYXJlIHVzZWQKKy8vICBieSB0aGUgc3RhdGljIGFuYWx5emVyIHRvIHN1bW1hcml6ZSB0aGUgcmV0YWluL3JlbGVhc2UgZWZmZWN0cyBvZgorLy8gIGZ1bmN0aW9uIGFuZCBtZXRob2QgY2FsbHMuICBUaGlzIGRyaXZlcyBhIHBhdGgtc2Vuc2l0aXZlIHR5cGVzdGF0ZQorLy8gIGFuYWx5c2lzIGluIHRoZSBzdGF0aWMgYW5hbHl6ZXIsIGJ1dCBjYW4gYWxzbyBwb3RlbnRpYWxseSBiZSB1c2VkIGJ5CisvLyAgb3RoZXIgY2xpZW50cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ0hFQ0tFUlNfT0JKQ1JFVEFJTkNPVU5UX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DSEVDS0VSU19PQkpDUkVUQUlOQ09VTlRfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK2NsYXNzIEZ1bmN0aW9uRGVjbDsKK2NsYXNzIE9iakNNZXRob2REZWNsOworCituYW1lc3BhY2UgZW50byB7IG5hbWVzcGFjZSBvYmpjX3JldGFpbiB7CisKKy8vLyBBbiBBcmdFZmZlY3Qgc3VtbWFyaXplcyB0aGUgcmV0YWluIGNvdW50IGJlaGF2aW9yIG9uIGFuIGFyZ3VtZW50IG9yIHJlY2VpdmVyCisvLy8gdG8gYSBmdW5jdGlvbiBvciBtZXRob2QuCitlbnVtIEFyZ0VmZmVjdCB7CisgIC8vLyBUaGVyZSBpcyBubyBlZmZlY3QuCisgIERvTm90aGluZywKKworICAvLy8gVGhlIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgaWYgYW4gLWF1dG9yZWxlYXNlIG1lc3NhZ2UgaGFkIGJlZW4gc2VudCB0bworICAvLy8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LgorICBBdXRvcmVsZWFzZSwKKworICAvLy8gVGhlIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgaWYgYW4gLWRlYWxsb2MgbWVzc2FnZSBoYWQgYmVlbiBzZW50IHRvCisgIC8vLyB0aGUgcmVmZXJlbmNlZCBvYmplY3QuCisgIERlYWxsb2MsCisKKyAgLy8vIFRoZSBhcmd1bWVudCBoYXMgaXRzIHJlZmVyZW5jZSBjb3VudCBkZWNyZWFzZWQgYnkgMS4gIFRoaXMgaXMgYXMKKyAgLy8vIGlmIENGUmVsZWFzZSBoYXMgYmVlbiBjYWxsZWQgb24gdGhlIGFyZ3VtZW50LgorICBEZWNSZWYsCisKKyAgLy8vIFRoZSBhcmd1bWVudCBoYXMgaXRzIHJlZmVyZW5jZSBjb3VudCBkZWNyZWFzZWQgYnkgMS4gIFRoaXMgaXMgYXMKKyAgLy8vIGlmIGEgLXJlbGVhc2UgbWVzc2FnZSBoYXMgYmVlbiBzZW50IHRvIHRoZSBhcmd1bWVudC4gIFRoaXMgZGlmZmVycworICAvLy8gaW4gYmVoYXZpb3IgZnJvbSBEZWNSZWYgd2hlbiBHQyBpcyBlbmFibGVkLgorICBEZWNSZWZNc2csCisKKyAgLy8vIFRoZSBhcmd1bWVudCBoYXMgaXRzIHJlZmVyZW5jZSBjb3VudCBkZWNyZWFzZWQgYnkgMSB0byBtb2RlbAorICAvLy8gYSB0cmFuc2ZlcnJlZCBicmlkZ2UgY2FzdCB1bmRlciBBUkMuCisgIERlY1JlZkJyaWRnZWRUcmFuc2ZlcnJlZCwKKworICAvLy8gVGhlIGFyZ3VtZW50IGhhcyBpdHMgcmVmZXJlbmNlIGNvdW50IGluY3JlYXNlZCBieSAxLiAgVGhpcyBpcyBhcworICAvLy8gaWYgYSAtcmV0YWluIG1lc3NhZ2UgaGFzIGJlZW4gc2VudCB0byB0aGUgYXJndW1lbnQuICBUaGlzIGRpZmZlcnMKKyAgLy8vIGluIGJlaGF2aW9yIGZyb20gSW5jUmVmIHdoZW4gR0MgaXMgZW5hYmxlZC4KKyAgSW5jUmVmTXNnLAorCisgIC8vLyBUaGUgYXJndW1lbnQgaGFzIGl0cyByZWZlcmVuY2UgY291bnQgaW5jcmVhc2VkIGJ5IDEuICBUaGlzIGlzIGFzCisgIC8vLyBpZiBDRlJldGFpbiBoYXMgYmVlbiBjYWxsZWQgb24gdGhlIGFyZ3VtZW50LgorICBJbmNSZWYsCisKKyAgLy8vIFRoZSBhcmd1bWVudCBhY3RzIGFzIGlmIGhhcyBiZWVuIHBhc3NlZCB0byBDRk1ha2VDb2xsZWN0YWJsZSwgd2hpY2gKKyAgLy8vIHRyYW5zZmVycyB0aGUgb2JqZWN0IHRvIHRoZSBHYXJiYWdlIENvbGxlY3RvciB1bmRlciBHQy4KKyAgTWFrZUNvbGxlY3RhYmxlLAorCisgIC8vLyBUaGUgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIGEgcmV0YWluLWNvdW50ZWQgb2JqZWN0OyBvbiBleGl0LCB0aGUgbmV3CisgIC8vLyB2YWx1ZSBvZiB0aGUgcG9pbnRlciBpcyBhICswIHZhbHVlIG9yIE5VTEwuCisgIFVucmV0YWluZWRPdXRQYXJhbWV0ZXIsCisKKyAgLy8vIFRoZSBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gYSByZXRhaW4tY291bnRlZCBvYmplY3Q7IG9uIGV4aXQsIHRoZSBuZXcKKyAgLy8vIHZhbHVlIG9mIHRoZSBwb2ludGVyIGlzIGEgKzEgdmFsdWUgb3IgTlVMTC4KKyAgUmV0YWluZWRPdXRQYXJhbWV0ZXIsCisKKyAgLy8vIFRoZSBhcmd1bWVudCBpcyB0cmVhdGVkIGFzIHBvdGVudGlhbGx5IGVzY2FwaW5nLCBtZWFuaW5nIHRoYXQKKyAgLy8vIGV2ZW4gd2hlbiBpdHMgcmVmZXJlbmNlIGNvdW50IGhpdHMgMCBpdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBzdGlsbAorICAvLy8gcG9zc2libHkgYmVpbmcgYWxpdmUgYXMgc29tZW9uZSBlbHNlICptYXkqIGJlIGhvbGRpbmcgb250byB0aGUgb2JqZWN0LgorICBNYXlFc2NhcGUsCisKKyAgLy8vIEFsbCB0eXBlc3RhdGUgdHJhY2tpbmcgb2YgdGhlIG9iamVjdCBjZWFzZXMuICBUaGlzIGlzIHVzdWFsbHkgZW1wbG95ZWQKKyAgLy8vIHdoZW4gdGhlIGVmZmVjdCBvZiB0aGUgY2FsbCBpcyBjb21wbGV0ZWx5IHVua25vd24uCisgIFN0b3BUcmFja2luZywKKworICAvLy8gQWxsIHR5cGVzdGF0ZSB0cmFja2luZyBvZiB0aGUgb2JqZWN0IGNlYXNlcy4gIFVubGlrZSBTdG9wVHJhY2tpbmcsCisgIC8vLyB0aGlzIGlzIGFsc28gZW5mb3JjZWQgd2hlbiB0aGUgbWV0aG9kIGJvZHkgaXMgaW5saW5lZC4KKyAgLy8vCisgIC8vLyBJbiBzb21lIGNhc2VzLCB3ZSBvYnRhaW4gYSBiZXR0ZXIgc3VtbWFyeSBmb3IgdGhpcyBjaGVja2VyCisgIC8vLyBieSBsb29raW5nIGF0IHRoZSBjYWxsIHNpdGUgdGhhbiBieSBpbmxpbmluZyB0aGUgZnVuY3Rpb24uCisgIC8vLyBTaWduaWZpZXMgdGhhdCB3ZSBzaG91bGQgc3RvcCB0cmFja2luZyB0aGUgc3ltYm9sIGV2ZW4gaWYKKyAgLy8vIHRoZSBmdW5jdGlvbiBpcyBpbmxpbmVkLgorICBTdG9wVHJhY2tpbmdIYXJkLAorCisgIC8vLyBQZXJmb3JtcyB0aGUgY29tYmluZWQgZnVuY3Rpb25hbGl0eSBvZiBEZWNSZWYgYW5kIFN0b3BUcmFja2luZ0hhcmQuCisgIC8vLworICAvLy8gVGhlIG1vZGVscyB0aGUgZWZmZWN0IHRoYXQgdGhlIGNhbGxlZCBmdW5jdGlvbiBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UKKyAgLy8vIGNvdW50IG9mIHRoZSBhcmd1bWVudCBhbmQgYWxsIHR5cGVzdGF0ZSB0cmFja2luZyBvbiB0aGF0IGFyZ3VtZW50CisgIC8vLyBzaG91bGQgY2Vhc2UuCisgIERlY1JlZkFuZFN0b3BUcmFja2luZ0hhcmQsCisKKyAgLy8vIFBlcmZvcm1zIHRoZSBjb21iaW5lZCBmdW5jdGlvbmFsaXR5IG9mIERlY1JlZk1zZyBhbmQgU3RvcFRyYWNraW5nSGFyZC4KKyAgLy8vCisgIC8vLyBUaGUgbW9kZWxzIHRoZSBlZmZlY3QgdGhhdCB0aGUgY2FsbGVkIGZ1bmN0aW9uIGRlY3JlbWVudHMgdGhlIHJlZmVyZW5jZQorICAvLy8gY291bnQgb2YgdGhlIGFyZ3VtZW50IGFuZCBhbGwgdHlwZXN0YXRlIHRyYWNraW5nIG9uIHRoYXQgYXJndW1lbnQKKyAgLy8vIHNob3VsZCBjZWFzZS4KKyAgRGVjUmVmTXNnQW5kU3RvcFRyYWNraW5nSGFyZAorfTsKKworLy8vIFJldEVmZmVjdCBzdW1tYXJpemVzIGEgY2FsbCdzIHJldGFpbi9yZWxlYXNlIGJlaGF2aW9yIHdpdGggcmVzcGVjdAorLy8vIHRvIGl0cyByZXR1cm4gdmFsdWUuCitjbGFzcyBSZXRFZmZlY3QgeworcHVibGljOgorICBlbnVtIEtpbmQgeworICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCBubyByZXRhaW4gY291bnQgaW5mb3JtYXRpb24gaXMgdHJhY2tlZCBmb3IKKyAgICAvLy8gdGhlIHJldHVybiB2YWx1ZS4KKyAgICBOb1JldCwKKyAgICAvLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHJldHVybmVkIHZhbHVlIGlzIGFuIG93bmVkICgrMSkgc3ltYm9sLgorICAgIE93bmVkU3ltYm9sLAorICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggcmV0YWluIGNvdW50CisgICAgLy8vIHNlbWFudGljcyBidXQgdGhhdCBpdCBpcyBub3Qgb3duZWQgKCswKS4gIFRoaXMgaXMgdGhlIGRlZmF1bHQKKyAgICAvLy8gZm9yIGdldHRlcnMsIGV0Yy4KKyAgICBOb3RPd25lZFN5bWJvbCwKKyAgICAvLy8gSW5kaWNhdGVzIHRoYXQgdGhlIG9iamVjdCBpcyBub3Qgb3duZWQgYW5kIGNvbnRyb2xsZWQgYnkgdGhlCisgICAgLy8vIEdhcmJhZ2UgY29sbGVjdG9yLgorICAgIEdDTm90T3duZWRTeW1ib2wsCisgICAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgYW4gb3duZWQgb2JqZWN0IHdoZW4gdGhlCisgICAgLy8vIHJlY2VpdmVyIGlzIGFsc28gYSB0cmFja2VkIG9iamVjdC4KKyAgICBPd25lZFdoZW5UcmFja2VkUmVjZWl2ZXIsCisgICAgLy8gVHJlYXQgdGhpcyBmdW5jdGlvbiBhcyByZXR1cm5pbmcgYSBub24tdHJhY2tlZCBzeW1ib2wgZXZlbiBpZgorICAgIC8vIHRoZSBmdW5jdGlvbiBoYXMgYmVlbiBpbmxpbmVkLiBUaGlzIGlzIHVzZWQgd2hlcmUgdGhlIGNhbGwKKyAgICAvLyBzaXRlIHN1bW1hcnkgaXMgbW9yZSBwcmVzaXNlIHRoYW4gdGhlIHN1bW1hcnkgaW5kaXJlY3RseSBwcm9kdWNlZAorICAgIC8vIGJ5IGlubGluaW5nIHRoZSBmdW5jdGlvbgorICAgIE5vUmV0SGFyZAorICB9OworICAKKyAgLy8vIERldGVybWluZXMgdGhlIG9iamVjdCBraW5kIG9mIGEgdHJhY2tlZCBvYmplY3QuCisgIGVudW0gT2JqS2luZCB7CisgICAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSB0cmFja2VkIG9iamVjdCBpcyBhIENGIG9iamVjdC4gIFRoaXMgaXMKKyAgICAvLy8gaW1wb3J0YW50IGJldHdlZW4gR0MgYW5kIG5vbi1HQyBjb2RlLgorICAgIENGLAorICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgdHJhY2tlZCBvYmplY3QgaXMgYW4gT2JqZWN0aXZlLUMgb2JqZWN0LgorICAgIE9iakMsCisgICAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSB0cmFja2VkIG9iamVjdCBjb3VsZCBiZSBhIENGIG9yIE9iamVjdGl2ZS1DIG9iamVjdC4KKyAgICBBbnlPYmosCisgICAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSB0cmFja2VkIG9iamVjdCBpcyBhIGdlbmVyYWxpemVkIG9iamVjdC4KKyAgICBHZW5lcmFsaXplZAorICB9OworCitwcml2YXRlOgorICBLaW5kIEs7CisgIE9iaktpbmQgTzsKKyAgCisgIFJldEVmZmVjdChLaW5kIGssIE9iaktpbmQgbyA9IEFueU9iaikgOiBLKGspLCBPKG8pIHt9CisgIAorcHVibGljOgorICBLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLOyB9CisgIAorICBPYmpLaW5kIGdldE9iaktpbmQoKSBjb25zdCB7IHJldHVybiBPOyB9CisgIAorICBib29sIGlzT3duZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIEsgPT0gT3duZWRTeW1ib2wgfHwgSyA9PSBPd25lZFdoZW5UcmFja2VkUmVjZWl2ZXI7CisgIH0KKyAgCisgIGJvb2wgbm90T3duZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIEsgPT0gTm90T3duZWRTeW1ib2w7CisgIH0KKyAgCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZXRFZmZlY3QgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIEsgPT0gT3RoZXIuSyAmJiBPID09IE90aGVyLk87CisgIH0KKyAgCisgIHN0YXRpYyBSZXRFZmZlY3QgTWFrZU93bmVkV2hlblRyYWNrZWRSZWNlaXZlcigpIHsKKyAgICByZXR1cm4gUmV0RWZmZWN0KE93bmVkV2hlblRyYWNrZWRSZWNlaXZlciwgT2JqQyk7CisgIH0KKyAgCisgIHN0YXRpYyBSZXRFZmZlY3QgTWFrZU93bmVkKE9iaktpbmQgbykgeworICAgIHJldHVybiBSZXRFZmZlY3QoT3duZWRTeW1ib2wsIG8pOworICB9CisgIHN0YXRpYyBSZXRFZmZlY3QgTWFrZU5vdE93bmVkKE9iaktpbmQgbykgeworICAgIHJldHVybiBSZXRFZmZlY3QoTm90T3duZWRTeW1ib2wsIG8pOworICB9CisgIHN0YXRpYyBSZXRFZmZlY3QgTWFrZUdDTm90T3duZWQoKSB7CisgICAgcmV0dXJuIFJldEVmZmVjdChHQ05vdE93bmVkU3ltYm9sLCBPYmpDKTsKKyAgfQorICBzdGF0aWMgUmV0RWZmZWN0IE1ha2VOb1JldCgpIHsKKyAgICByZXR1cm4gUmV0RWZmZWN0KE5vUmV0KTsKKyAgfQorICBzdGF0aWMgUmV0RWZmZWN0IE1ha2VOb1JldEhhcmQoKSB7CisgICAgcmV0dXJuIFJldEVmZmVjdChOb1JldEhhcmQpOworICB9Cit9OworCisvLy8gRW5jYXBzdWxhdGVzIHRoZSByZXRhaW4gY291bnQgc2VtYW50aWNzIG9uIHRoZSBhcmd1bWVudHMsIHJldHVybiB2YWx1ZSwKKy8vLyBhbmQgcmVjZWl2ZXIgKGlmIGFueSkgb2YgYSBmdW5jdGlvbi9tZXRob2QgY2FsbC4KKy8vLworLy8vIE5vdGUgdGhhdCBjb25zdHJ1Y3Rpb24gb2YgdGhlc2Ugb2JqZWN0cyBpcyBub3QgaGlnaGx5IGVmZmljaWVudC4gIFRoYXQKKy8vLyBpcyBva2F5IGZvciBjbGllbnRzIHdoZXJlIGNyZWF0aW5nIHRoZXNlIG9iamVjdHMgaXNuJ3QgcmVhbGx5IGEgYm90dGxlbmVjay4KKy8vLyBUaGUgcHVycG9zZSBvZiB0aGUgQVBJIGlzIHRvIHByb3ZpZGUgc29tZXRoaW5nIHNpbXBsZS4gIFRoZSBhY3R1YWwKKy8vLyBzdGF0aWMgYW5hbHl6ZXIgY2hlY2tlciB0aGF0IGltcGxlbWVudHMgcmV0YWluL3JlbGVhc2UgdHlwZXN0YXRlCisvLy8gdHJhY2tpbmcgdXNlcyBzb21ldGhpbmcgbW9yZSBlZmZpY2llbnQuCitjbGFzcyBDYWxsRWZmZWN0cyB7CisgIGxsdm06OlNtYWxsVmVjdG9yPEFyZ0VmZmVjdCwgMTA+IEFyZ3M7CisgIFJldEVmZmVjdCBSZXQ7CisgIEFyZ0VmZmVjdCBSZWNlaXZlcjsKKworICBDYWxsRWZmZWN0cyhjb25zdCBSZXRFZmZlY3QgJlIpIDogUmV0KFIpIHt9CisKK3B1YmxpYzoKKyAgLy8vIFJldHVybnMgdGhlIGFyZ3VtZW50IGVmZmVjdHMgZm9yIGEgY2FsbC4KKyAgQXJyYXlSZWY8QXJnRWZmZWN0PiBnZXRBcmdzKCkgY29uc3QgeyByZXR1cm4gQXJnczsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBlZmZlY3RzIG9uIHRoZSByZWNlaXZlci4KKyAgQXJnRWZmZWN0IGdldFJlY2VpdmVyKCkgY29uc3QgeyByZXR1cm4gUmVjZWl2ZXI7IH0KKworICAvLy8gUmV0dXJucyB0aGUgZWZmZWN0IG9uIHRoZSByZXR1cm4gdmFsdWUuCisgIFJldEVmZmVjdCBnZXRSZXR1cm5WYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFJldDsgfQorCisgIC8vLyBSZXR1cm4gdGhlIENhbGxFZmVjdCBmb3IgYSBnaXZlbiBPYmplY3RpdmUtQyBtZXRob2QuCisgIHN0YXRpYyBDYWxsRWZmZWN0cyBnZXRFZmZlY3QoY29uc3QgT2JqQ01ldGhvZERlY2wgKk1EKTsKKworICAvLy8gUmV0dXJuIHRoZSBDYWxsRWZlY3QgZm9yIGEgZ2l2ZW4gQy9DKysgZnVuY3Rpb24uCisgIHN0YXRpYyBDYWxsRWZmZWN0cyBnZXRFZmZlY3QoY29uc3QgRnVuY3Rpb25EZWNsICpGRCk7Cit9OworCit9fX0KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1NWYWxFeHBsYWluZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1NWYWxFeHBsYWluZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmJiMGY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvU1ZhbEV4cGxhaW5lci5oCkBAIC0wLDAgKzEsMjQ4IEBACisvLz09IFNWYWxFeHBsYWluZXIuaCAtIFN5bWJvbGljIHZhbHVlIGV4cGxhaW5lciAtLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi0tPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyBTVmFsRXhwbGFpbmVyLCBhIGNsYXNzIGZvciBwcmV0dHktcHJpbnRpbmcgYQorLy8gIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIGEgc3ltYm9saWMgdmFsdWUuIEZvciBleGFtcGxlLAorLy8gICJyZWdfJDA8eD4iIGlzIHR1cm5lZCBpbnRvICJpbml0aWFsIHZhbHVlIG9mIHZhcmlhYmxlICd4JyIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NIRUNLRVJTX1NWQUxFWFBMQUlORVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NIRUNLRVJTX1NWQUxFWFBMQUlORVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDWFguaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU1ZhbFZpc2l0b3IuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworbmFtZXNwYWNlIGVudG8geworCitjbGFzcyBTVmFsRXhwbGFpbmVyIDogcHVibGljIEZ1bGxTVmFsVmlzaXRvcjxTVmFsRXhwbGFpbmVyLCBzdGQ6OnN0cmluZz4geworcHJpdmF0ZToKKyAgQVNUQ29udGV4dCAmQUN0eDsKKworICBzdGQ6OnN0cmluZyBwcmludFN0bXQoY29uc3QgU3RtdCAqUykgeworICAgIHN0ZDo6c3RyaW5nIFN0cjsKKyAgICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gT1MoU3RyKTsKKyAgICBTLT5wcmludFByZXR0eShPUywgbnVsbHB0ciwgUHJpbnRpbmdQb2xpY3koQUN0eC5nZXRMYW5nT3B0cygpKSk7CisgICAgcmV0dXJuIE9TLnN0cigpOworICB9CisKKyAgYm9vbCBpc1RoaXNPYmplY3QoY29uc3QgU3ltYm9saWNSZWdpb24gKlIpIHsKKyAgICBpZiAoYXV0byBTID0gZHluX2Nhc3Q8U3ltYm9sUmVnaW9uVmFsdWU+KFItPmdldFN5bWJvbCgpKSkKKyAgICAgIGlmIChpc2E8Q1hYVGhpc1JlZ2lvbj4oUy0+Z2V0UmVnaW9uKCkpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworcHVibGljOgorICBTVmFsRXhwbGFpbmVyKEFTVENvbnRleHQgJkN0eCkgOiBBQ3R4KEN0eCkge30KKworICBzdGQ6OnN0cmluZyBWaXNpdFVua25vd25WYWwoVW5rbm93blZhbCBWKSB7CisgICAgcmV0dXJuICJ1bmtub3duIHZhbHVlIjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIFZpc2l0VW5kZWZpbmVkVmFsKFVuZGVmaW5lZFZhbCBWKSB7CisgICAgcmV0dXJuICJ1bmRlZmluZWQgdmFsdWUiOworICB9CisKKyAgc3RkOjpzdHJpbmcgVmlzaXRMb2NNZW1SZWdpb25WYWwobG9jOjpNZW1SZWdpb25WYWwgVikgeworICAgIGNvbnN0IE1lbVJlZ2lvbiAqUiA9IFYuZ2V0UmVnaW9uKCk7CisgICAgLy8gQXZvaWQgdGhlIHdlaXJkICJwb2ludGVyIHRvIHBvaW50ZWUgb2YgLi4uIi4KKyAgICBpZiAoYXV0byBTUiA9IGR5bl9jYXN0PFN5bWJvbGljUmVnaW9uPihSKSkgeworICAgICAgLy8gSG93ZXZlciwgInBvaW50ZXIgdG8gJ3RoaXMnIG9iamVjdCIgaXMgZmluZS4KKyAgICAgIGlmICghaXNUaGlzT2JqZWN0KFNSKSkKKyAgICAgICAgcmV0dXJuIFZpc2l0KFNSLT5nZXRTeW1ib2woKSk7CisgICAgfQorICAgIHJldHVybiAicG9pbnRlciB0byAiICsgVmlzaXQoUik7CisgIH0KKworICBzdGQ6OnN0cmluZyBWaXNpdExvY0NvbmNyZXRlSW50KGxvYzo6Q29uY3JldGVJbnQgVikgeworICAgIGxsdm06OkFQU0ludCBJID0gVi5nZXRWYWx1ZSgpOworICAgIHN0ZDo6c3RyaW5nIFN0cjsKKyAgICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gT1MoU3RyKTsKKyAgICBPUyA8PCAiY29uY3JldGUgbWVtb3J5IGFkZHJlc3MgJyIgPDwgSSA8PCAiJyI7CisgICAgcmV0dXJuIE9TLnN0cigpOworICB9CisKKyAgc3RkOjpzdHJpbmcgVmlzaXROb25Mb2NTeW1ib2xWYWwobm9ubG9jOjpTeW1ib2xWYWwgVikgeworICAgIHJldHVybiBWaXNpdChWLmdldFN5bWJvbCgpKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIFZpc2l0Tm9uTG9jQ29uY3JldGVJbnQobm9ubG9jOjpDb25jcmV0ZUludCBWKSB7CisgICAgbGx2bTo6QVBTSW50IEkgPSBWLmdldFZhbHVlKCk7CisgICAgc3RkOjpzdHJpbmcgU3RyOworICAgIGxsdm06OnJhd19zdHJpbmdfb3N0cmVhbSBPUyhTdHIpOworICAgIE9TIDw8IChJLmlzU2lnbmVkKCkgPyAic2lnbmVkICIgOiAidW5zaWduZWQgIikgPDwgSS5nZXRCaXRXaWR0aCgpCisgICAgICAgPDwgIi1iaXQgaW50ZWdlciAnIiA8PCBJIDw8ICInIjsKKyAgICByZXR1cm4gT1Muc3RyKCk7CisgIH0KKworICBzdGQ6OnN0cmluZyBWaXNpdE5vbkxvY0xhenlDb21wb3VuZFZhbChub25sb2M6OkxhenlDb21wb3VuZFZhbCBWKSB7CisgICAgcmV0dXJuICJsYXppbHkgZnJvemVuIGNvbXBvdW5kIHZhbHVlIG9mICIgKyBWaXNpdChWLmdldFJlZ2lvbigpKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIFZpc2l0U3ltYm9sUmVnaW9uVmFsdWUoY29uc3QgU3ltYm9sUmVnaW9uVmFsdWUgKlMpIHsKKyAgICBjb25zdCBNZW1SZWdpb24gKlIgPSBTLT5nZXRSZWdpb24oKTsKKyAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBhcmd1bWVudCB2YWx1ZXMuCisgICAgaWYgKGF1dG8gViA9IGR5bl9jYXN0PFZhclJlZ2lvbj4oUikpCisgICAgICBpZiAoYXV0byBEID0gZHluX2Nhc3Q8UGFybVZhckRlY2w+KFYtPmdldERlY2woKSkpCisgICAgICAgIHJldHVybiAiYXJndW1lbnQgJyIgKyBELT5nZXRRdWFsaWZpZWROYW1lQXNTdHJpbmcoKSArICInIjsKKyAgICByZXR1cm4gImluaXRpYWwgdmFsdWUgb2YgIiArIFZpc2l0KFIpOworICB9CisKKyAgc3RkOjpzdHJpbmcgVmlzaXRTeW1ib2xDb25qdXJlZChjb25zdCBTeW1ib2xDb25qdXJlZCAqUykgeworICAgIHJldHVybiAic3ltYm9sIG9mIHR5cGUgJyIgKyBTLT5nZXRUeXBlKCkuZ2V0QXNTdHJpbmcoKSArCisgICAgICAgICAgICInIGNvbmp1cmVkIGF0IHN0YXRlbWVudCAnIiArIHByaW50U3RtdChTLT5nZXRTdG10KCkpICsgIiciOworICB9CisKKyAgc3RkOjpzdHJpbmcgVmlzaXRTeW1ib2xEZXJpdmVkKGNvbnN0IFN5bWJvbERlcml2ZWQgKlMpIHsKKyAgICByZXR1cm4gInZhbHVlIGRlcml2ZWQgZnJvbSAoIiArIFZpc2l0KFMtPmdldFBhcmVudFN5bWJvbCgpKSArCisgICAgICAgICAgICIpIGZvciAiICsgVmlzaXQoUy0+Z2V0UmVnaW9uKCkpOworICB9CisKKyAgc3RkOjpzdHJpbmcgVmlzaXRTeW1ib2xFeHRlbnQoY29uc3QgU3ltYm9sRXh0ZW50ICpTKSB7CisgICAgcmV0dXJuICJleHRlbnQgb2YgIiArIFZpc2l0KFMtPmdldFJlZ2lvbigpKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIFZpc2l0U3ltYm9sTWV0YWRhdGEoY29uc3QgU3ltYm9sTWV0YWRhdGEgKlMpIHsKKyAgICByZXR1cm4gIm1ldGFkYXRhIG9mIHR5cGUgJyIgKyBTLT5nZXRUeXBlKCkuZ2V0QXNTdHJpbmcoKSArICInIHRpZWQgdG8gIiArCisgICAgICAgICAgIFZpc2l0KFMtPmdldFJlZ2lvbigpKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIFZpc2l0U3ltSW50RXhwcihjb25zdCBTeW1JbnRFeHByICpTKSB7CisgICAgc3RkOjpzdHJpbmcgU3RyOworICAgIGxsdm06OnJhd19zdHJpbmdfb3N0cmVhbSBPUyhTdHIpOworICAgIE9TIDw8ICIoIiA8PCBWaXNpdChTLT5nZXRMSFMoKSkgPDwgIikgIgorICAgICAgIDw8IHN0ZDo6c3RyaW5nKEJpbmFyeU9wZXJhdG9yOjpnZXRPcGNvZGVTdHIoUy0+Z2V0T3Bjb2RlKCkpKSA8PCAiICIKKyAgICAgICA8PCBTLT5nZXRSSFMoKTsKKyAgICByZXR1cm4gT1Muc3RyKCk7CisgIH0KKworICAvLyBUT0RPOiBJbnRTeW1FeHByIGRvZXNuJ3QgYXBwZWFyIGluIHByYWN0aWNlLgorICAvLyBBZGQgdGhlIHJlbGV2YW50IGNvZGUgb25jZSBpdCBkb2VzLgorCisgIHN0ZDo6c3RyaW5nIFZpc2l0U3ltU3ltRXhwcihjb25zdCBTeW1TeW1FeHByICpTKSB7CisgICAgcmV0dXJuICIoIiArIFZpc2l0KFMtPmdldExIUygpKSArICIpICIgKworICAgICAgICAgICBzdGQ6OnN0cmluZyhCaW5hcnlPcGVyYXRvcjo6Z2V0T3Bjb2RlU3RyKFMtPmdldE9wY29kZSgpKSkgKworICAgICAgICAgICAiICgiICsgVmlzaXQoUy0+Z2V0UkhTKCkpICsgIikiOworICB9CisKKyAgLy8gVE9ETzogU3ltYm9sQ2FzdCBkb2Vzbid0IGFwcGVhciBpbiBwcmFjdGljZS4KKyAgLy8gQWRkIHRoZSByZWxldmFudCBjb2RlIG9uY2UgaXQgZG9lcy4KKworICBzdGQ6OnN0cmluZyBWaXNpdFN5bWJvbGljUmVnaW9uKGNvbnN0IFN5bWJvbGljUmVnaW9uICpSKSB7CisgICAgLy8gRXhwbGFpbiAndGhpcycgb2JqZWN0IGhlcmUuCisgICAgLy8gVE9ETzogRXhwbGFpbiBDWFhUaGlzUmVnaW9uIGl0c2VsZiwgZmluZCBhIHdheSB0byB0ZXN0IGl0LgorICAgIGlmIChpc1RoaXNPYmplY3QoUikpCisgICAgICByZXR1cm4gIid0aGlzJyBvYmplY3QiOworICAgIC8vIE9iamVjdGl2ZS1DIG9iamVjdHMgYXJlIG5vdCBub3JtYWwgc3ltYm9saWMgcmVnaW9ucy4gQXQgbGVhc3QsCisgICAgLy8gdGhleSdyZSBhbHdheXMgb24gdGhlIGhlYXAuCisgICAgaWYgKFItPmdldFN5bWJvbCgpLT5nZXRUeXBlKCkKKyAgICAgICAgICAgIC5nZXRDYW5vbmljYWxUeXBlKCktPmdldEFzPE9iakNPYmplY3RQb2ludGVyVHlwZT4oKSkKKyAgICAgIHJldHVybiAib2JqZWN0IGF0ICIgKyBWaXNpdChSLT5nZXRTeW1ib2woKSk7CisgICAgLy8gT3RoZXIgaGVhcC1iYXNlZCBzeW1ib2xpYyByZWdpb25zIGFyZSBhbHNvIHNwZWNpYWwuCisgICAgaWYgKGlzYTxIZWFwU3BhY2VSZWdpb24+KFItPmdldE1lbW9yeVNwYWNlKCkpKQorICAgICAgcmV0dXJuICJoZWFwIHNlZ21lbnQgdGhhdCBzdGFydHMgYXQgIiArIFZpc2l0KFItPmdldFN5bWJvbCgpKTsKKyAgICByZXR1cm4gInBvaW50ZWUgb2YgIiArIFZpc2l0KFItPmdldFN5bWJvbCgpKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIFZpc2l0QWxsb2NhUmVnaW9uKGNvbnN0IEFsbG9jYVJlZ2lvbiAqUikgeworICAgIHJldHVybiAicmVnaW9uIGFsbG9jYXRlZCBieSAnIiArIHByaW50U3RtdChSLT5nZXRFeHByKCkpICsgIiciOworICB9CisKKyAgc3RkOjpzdHJpbmcgVmlzaXRDb21wb3VuZExpdGVyYWxSZWdpb24oY29uc3QgQ29tcG91bmRMaXRlcmFsUmVnaW9uICpSKSB7CisgICAgcmV0dXJuICJjb21wb3VuZCBsaXRlcmFsICIgKyBwcmludFN0bXQoUi0+Z2V0TGl0ZXJhbEV4cHIoKSk7CisgIH0KKworICBzdGQ6OnN0cmluZyBWaXNpdFN0cmluZ1JlZ2lvbihjb25zdCBTdHJpbmdSZWdpb24gKlIpIHsKKyAgICByZXR1cm4gInN0cmluZyBsaXRlcmFsICIgKyBSLT5nZXRTdHJpbmcoKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIFZpc2l0RWxlbWVudFJlZ2lvbihjb25zdCBFbGVtZW50UmVnaW9uICpSKSB7CisgICAgc3RkOjpzdHJpbmcgU3RyOworICAgIGxsdm06OnJhd19zdHJpbmdfb3N0cmVhbSBPUyhTdHIpOworICAgIE9TIDw8ICJlbGVtZW50IG9mIHR5cGUgJyIgPDwgUi0+Z2V0RWxlbWVudFR5cGUoKS5nZXRBc1N0cmluZygpCisgICAgICAgPDwgIicgd2l0aCBpbmRleCAiOworICAgIC8vIEZvciBjb25jcmV0ZSBpbmRleDogb21pdCB0eXBlIG9mIHRoZSBpbmRleCBpbnRlZ2VyLgorICAgIGlmIChhdXRvIEkgPSBSLT5nZXRJbmRleCgpLmdldEFzPG5vbmxvYzo6Q29uY3JldGVJbnQ+KCkpCisgICAgICBPUyA8PCBJLT5nZXRWYWx1ZSgpOworICAgIGVsc2UKKyAgICAgIE9TIDw8ICInIiA8PCBWaXNpdChSLT5nZXRJbmRleCgpKSA8PCAiJyI7CisgICAgT1MgPDwgIiBvZiAiICsgVmlzaXQoUi0+Z2V0U3VwZXJSZWdpb24oKSk7CisgICAgcmV0dXJuIE9TLnN0cigpOworICB9CisKKyAgc3RkOjpzdHJpbmcgVmlzaXRWYXJSZWdpb24oY29uc3QgVmFyUmVnaW9uICpSKSB7CisgICAgY29uc3QgVmFyRGVjbCAqVkQgPSBSLT5nZXREZWNsKCk7CisgICAgc3RkOjpzdHJpbmcgTmFtZSA9IFZELT5nZXRRdWFsaWZpZWROYW1lQXNTdHJpbmcoKTsKKyAgICBpZiAoaXNhPFBhcm1WYXJEZWNsPihWRCkpCisgICAgICByZXR1cm4gInBhcmFtZXRlciAnIiArIE5hbWUgKyAiJyI7CisgICAgZWxzZSBpZiAoVkQtPmhhc0F0dHI8QmxvY2tzQXR0cj4oKSkKKyAgICAgIHJldHVybiAiYmxvY2sgdmFyaWFibGUgJyIgKyBOYW1lICsgIiciOworICAgIGVsc2UgaWYgKFZELT5oYXNMb2NhbFN0b3JhZ2UoKSkKKyAgICAgIHJldHVybiAibG9jYWwgdmFyaWFibGUgJyIgKyBOYW1lICsgIiciOworICAgIGVsc2UgaWYgKFZELT5pc1N0YXRpY0xvY2FsKCkpCisgICAgICByZXR1cm4gInN0YXRpYyBsb2NhbCB2YXJpYWJsZSAnIiArIE5hbWUgKyAiJyI7CisgICAgZWxzZSBpZiAoVkQtPmhhc0dsb2JhbFN0b3JhZ2UoKSkKKyAgICAgIHJldHVybiAiZ2xvYmFsIHZhcmlhYmxlICciICsgTmFtZSArICInIjsKKyAgICBlbHNlCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJBIHZhcmlhYmxlIGlzIGVpdGhlciBsb2NhbCBvciBnbG9iYWwiKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIFZpc2l0T2JqQ0l2YXJSZWdpb24oY29uc3QgT2JqQ0l2YXJSZWdpb24gKlIpIHsKKyAgICByZXR1cm4gImluc3RhbmNlIHZhcmlhYmxlICciICsgUi0+Z2V0RGVjbCgpLT5nZXROYW1lQXNTdHJpbmcoKSArICInIG9mICIgKworICAgICAgICAgICBWaXNpdChSLT5nZXRTdXBlclJlZ2lvbigpKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIFZpc2l0RmllbGRSZWdpb24oY29uc3QgRmllbGRSZWdpb24gKlIpIHsKKyAgICByZXR1cm4gImZpZWxkICciICsgUi0+Z2V0RGVjbCgpLT5nZXROYW1lQXNTdHJpbmcoKSArICInIG9mICIgKworICAgICAgICAgICBWaXNpdChSLT5nZXRTdXBlclJlZ2lvbigpKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIFZpc2l0Q1hYVGVtcE9iamVjdFJlZ2lvbihjb25zdCBDWFhUZW1wT2JqZWN0UmVnaW9uICpSKSB7CisgICAgcmV0dXJuICJ0ZW1wb3Jhcnkgb2JqZWN0IGNvbnN0cnVjdGVkIGF0IHN0YXRlbWVudCAnIiArCisgICAgICAgICAgIHByaW50U3RtdChSLT5nZXRFeHByKCkpICsgIiciOworICB9CisKKyAgc3RkOjpzdHJpbmcgVmlzaXRDWFhCYXNlT2JqZWN0UmVnaW9uKGNvbnN0IENYWEJhc2VPYmplY3RSZWdpb24gKlIpIHsKKyAgICByZXR1cm4gImJhc2Ugb2JqZWN0ICciICsgUi0+Z2V0RGVjbCgpLT5nZXRRdWFsaWZpZWROYW1lQXNTdHJpbmcoKSArCisgICAgICAgICAgICInIGluc2lkZSAiICsgVmlzaXQoUi0+Z2V0U3VwZXJSZWdpb24oKSk7CisgIH0KKworICBzdGQ6OnN0cmluZyBWaXNpdFNWYWwoU1ZhbCBWKSB7CisgICAgc3RkOjpzdHJpbmcgU3RyOworICAgIGxsdm06OnJhd19zdHJpbmdfb3N0cmVhbSBPUyhTdHIpOworICAgIE9TIDw8IFY7CisgICAgcmV0dXJuICJhIHZhbHVlIHVuc3VwcG9ydGVkIGJ5IHRoZSBleHBsYWluZXI6ICgiICsKKyAgICAgICAgICAgc3RkOjpzdHJpbmcoT1Muc3RyKCkpICsgIikiOworICB9CisKKyAgc3RkOjpzdHJpbmcgVmlzaXRTeW1FeHByKFN5bWJvbFJlZiBTKSB7CisgICAgc3RkOjpzdHJpbmcgU3RyOworICAgIGxsdm06OnJhd19zdHJpbmdfb3N0cmVhbSBPUyhTdHIpOworICAgIFMtPmR1bXBUb1N0cmVhbShPUyk7CisgICAgcmV0dXJuICJhIHN5bWJvbGljIGV4cHJlc3Npb24gdW5zdXBwb3J0ZWQgYnkgdGhlIGV4cGxhaW5lcjogKCIgKworICAgICAgICAgICBzdGQ6OnN0cmluZyhPUy5zdHIoKSkgKyAiKSI7CisgIH0KKworICBzdGQ6OnN0cmluZyBWaXNpdE1lbVJlZ2lvbihjb25zdCBNZW1SZWdpb24gKlIpIHsKKyAgICBzdGQ6OnN0cmluZyBTdHI7CisgICAgbGx2bTo6cmF3X3N0cmluZ19vc3RyZWFtIE9TKFN0cik7CisgICAgT1MgPDwgUjsKKyAgICByZXR1cm4gImEgbWVtb3J5IHJlZ2lvbiB1bnN1cHBvcnRlZCBieSB0aGUgZXhwbGFpbmVyICgiICsKKyAgICAgICAgICAgc3RkOjpzdHJpbmcoT1Muc3RyKCkpICsgIikiOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZW50bworCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0FuYWx5c2VzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQW5hbHlzZXMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MWEyYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0FuYWx5c2VzLmRlZgpAQCAtMCwwICsxLDU5IEBACisvLz09PS0tIEFuYWx5c2VzLmRlZiAtIE1ldGFkYXRhIGFib3V0IFN0YXRpYyBBbmFseXNlcyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgc2V0IG9mIHN0YXRpYyBhbmFseXNlcyB1c2VkIGJ5IEFuYWx5c2lzQ29uc3VtZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBBTkFMWVNJU19TVE9SRQorI2RlZmluZSBBTkFMWVNJU19TVE9SRShOQU1FLCBDTURGTEFHLCBERVNDLCBDUkVBVEZOKQorI2VuZGlmCisKK0FOQUxZU0lTX1NUT1JFKFJlZ2lvblN0b3JlLCAicmVnaW9uIiwgIlVzZSByZWdpb24tYmFzZWQgYW5hbHl6ZXIgc3RvcmUiLCBDcmVhdGVSZWdpb25TdG9yZU1hbmFnZXIpCisKKyNpZm5kZWYgQU5BTFlTSVNfQ09OU1RSQUlOVFMKKyNkZWZpbmUgQU5BTFlTSVNfQ09OU1RSQUlOVFMoTkFNRSwgQ01ERkxBRywgREVTQywgQ1JFQVRGTikKKyNlbmRpZgorCitBTkFMWVNJU19DT05TVFJBSU5UUyhSYW5nZUNvbnN0cmFpbnRzLCAicmFuZ2UiLCAiVXNlIGNvbnN0cmFpbnQgdHJhY2tpbmcgb2YgY29uY3JldGUgdmFsdWUgcmFuZ2VzIiwgQ3JlYXRlUmFuZ2VDb25zdHJhaW50TWFuYWdlcikKK0FOQUxZU0lTX0NPTlNUUkFJTlRTKFozQ29uc3RyYWludHMsICJ6MyIsICJVc2UgWjMgY29udHJhaW50IHNvbHZlciIsIENyZWF0ZVozQ29uc3RyYWludE1hbmFnZXIpCisKKyNpZm5kZWYgQU5BTFlTSVNfRElBR05PU1RJQ1MKKyNkZWZpbmUgQU5BTFlTSVNfRElBR05PU1RJQ1MoTkFNRSwgQ01ERkxBRywgREVTQywgQ1JFQVRFRk4pCisjZW5kaWYKKworQU5BTFlTSVNfRElBR05PU1RJQ1MoSFRNTCwgImh0bWwiLCAiT3V0cHV0IGFuYWx5c2lzIHJlc3VsdHMgdXNpbmcgSFRNTCIsIGNyZWF0ZUhUTUxEaWFnbm9zdGljQ29uc3VtZXIpCitBTkFMWVNJU19ESUFHTk9TVElDUyhIVE1MX1NJTkdMRV9GSUxFLCAiaHRtbC1zaW5nbGUtZmlsZSIsICJPdXRwdXQgYW5hbHlzaXMgcmVzdWx0cyB1c2luZyBIVE1MIChub3QgYWxsb3dpbmcgZm9yIG11bHRpLWZpbGUgYnVncykiLCBjcmVhdGVIVE1MU2luZ2xlRmlsZURpYWdub3N0aWNDb25zdW1lcikKK0FOQUxZU0lTX0RJQUdOT1NUSUNTKFBMSVNULCAicGxpc3QiLCAiT3V0cHV0IGFuYWx5c2lzIHJlc3VsdHMgdXNpbmcgUGxpc3RzIiwgY3JlYXRlUGxpc3REaWFnbm9zdGljQ29uc3VtZXIpCitBTkFMWVNJU19ESUFHTk9TVElDUyhQTElTVF9NVUxUSV9GSUxFLCAicGxpc3QtbXVsdGktZmlsZSIsICJPdXRwdXQgYW5hbHlzaXMgcmVzdWx0cyB1c2luZyBQbGlzdHMgKGFsbG93aW5nIGZvciBtdWx0aS1maWxlIGJ1Z3MpIiwgY3JlYXRlUGxpc3RNdWx0aUZpbGVEaWFnbm9zdGljQ29uc3VtZXIpCitBTkFMWVNJU19ESUFHTk9TVElDUyhQTElTVF9IVE1MLCAicGxpc3QtaHRtbCIsICJPdXRwdXQgYW5hbHlzaXMgcmVzdWx0cyB1c2luZyBIVE1MIHdyYXBwZWQgd2l0aCBQbGlzdHMiLCBjcmVhdGVQbGlzdEhUTUxEaWFnbm9zdGljQ29uc3VtZXIpCitBTkFMWVNJU19ESUFHTk9TVElDUyhURVhULCAidGV4dCIsICJUZXh0IG91dHB1dCBvZiBhbmFseXNpcyByZXN1bHRzIiwgY3JlYXRlVGV4dFBhdGhEaWFnbm9zdGljQ29uc3VtZXIpCisKKyNpZm5kZWYgQU5BTFlTSVNfUFVSR0UKKyNkZWZpbmUgQU5BTFlTSVNfUFVSR0UoTkFNRSwgQ01ERkxBRywgREVTQykKKyNlbmRpZgorCitBTkFMWVNJU19QVVJHRShQdXJnZVN0bXQsICAic3RhdGVtZW50IiwgIlB1cmdlIHN5bWJvbHMsIGJpbmRpbmdzLCBhbmQgY29uc3RyYWludHMgYmVmb3JlIGV2ZXJ5IHN0YXRlbWVudCIpCitBTkFMWVNJU19QVVJHRShQdXJnZUJsb2NrLCAiYmxvY2siLCAiUHVyZ2Ugc3ltYm9scywgYmluZGluZ3MsIGFuZCBjb25zdHJhaW50cyBiZWZvcmUgZXZlcnkgYmFzaWMgYmxvY2siKQorQU5BTFlTSVNfUFVSR0UoUHVyZ2VOb25lLCAgIm5vbmUiLCAiRG8gbm90IHB1cmdlIHN5bWJvbHMsIGJpbmRpbmdzLCBvciBjb25zdHJhaW50cyIpCisKKyNpZm5kZWYgQU5BTFlTSVNfSU5MSU5JTkdfTU9ERQorI2RlZmluZSBBTkFMWVNJU19JTkxJTklOR19NT0RFKE5BTUUsIENNREZMQUcsIERFU0MpCisjZW5kaWYKKworQU5BTFlTSVNfSU5MSU5JTkdfTU9ERShBbGwsICAiYWxsIiwgIkFuYWx5emUgYWxsIGZ1bmN0aW9ucyBhcyB0b3AgbGV2ZWwiKQorQU5BTFlTSVNfSU5MSU5JTkdfTU9ERShOb1JlZHVuZGFuY3ksICJub3JlZHVuZGFuY3kiLCAiRG8gbm90IGFuYWx5emUgYSBmdW5jdGlvbiB3aGljaCBoYXMgYmVlbiBwcmV2aW91c2x5IGlubGluZWQiKQorCisjdW5kZWYgQU5BTFlTSVNfU1RPUkUKKyN1bmRlZiBBTkFMWVNJU19DT05TVFJBSU5UUworI3VuZGVmIEFOQUxZU0lTX0RJQUdOT1NUSUNTCisjdW5kZWYgQU5BTFlTSVNfUFVSR0UKKyN1bmRlZiBBTkFMWVNJU19JTkxJTklOR19NT0RFCisjdW5kZWYgQU5BTFlTSVNfSVBBCisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQW5hbHl6ZXJPcHRpb25zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0FuYWx5emVyT3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YTkxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0FuYWx5emVyT3B0aW9ucy5oCkBAIC0wLDAgKzEsNjg1IEBACisvLz09PS0gQW5hbHl6ZXJPcHRpb25zLmggLSBBbmFseXNpcyBFbmdpbmUgT3B0aW9ucyAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgdmFyaW91cyBvcHRpb25zIGZvciB0aGUgc3RhdGljIGFuYWx5emVyIHRoYXQgYXJlIHNldAorLy8gYnkgdGhlIGZyb250ZW5kIGFuZCBhcmUgY29uc3VsdGVkIHRocm91Z2hvdXQgdGhlIGFuYWx5emVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX0FOQUxZWkVST1BUSU9OU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9BTkFMWVpFUk9QVElPTlNfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworCituYW1lc3BhY2UgZW50byB7CisKK2NsYXNzIENoZWNrZXJCYXNlOworCit9IC8vIG5hbWVzcGFjZSBlbnRvCisKKy8vLyBBbmFseXNpcyAtIFNldCBvZiBhdmFpbGFibGUgc291cmNlIGNvZGUgYW5hbHlzZXMuCitlbnVtIEFuYWx5c2VzIHsKKyNkZWZpbmUgQU5BTFlTSVMoTkFNRSwgQ01ERkxBRywgREVTQywgU0NPUEUpIE5BTUUsCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9BbmFseXNlcy5kZWYiCitOdW1BbmFseXNlcworfTsKKworLy8vIEFuYWx5c2lzU3RvcmVzIC0gU2V0IG9mIGF2YWlsYWJsZSBhbmFseXNpcyBzdG9yZSBtb2RlbHMuCitlbnVtIEFuYWx5c2lzU3RvcmVzIHsKKyNkZWZpbmUgQU5BTFlTSVNfU1RPUkUoTkFNRSwgQ01ERkxBRywgREVTQywgQ1JFQVRGTikgTkFNRSMjTW9kZWwsCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9BbmFseXNlcy5kZWYiCitOdW1TdG9yZXMKK307CisKKy8vLyBBbmFseXNpc0NvbnN0cmFpbnRzIC0gU2V0IG9mIGF2YWlsYWJsZSBjb25zdHJhaW50IG1vZGVscy4KK2VudW0gQW5hbHlzaXNDb25zdHJhaW50cyB7CisjZGVmaW5lIEFOQUxZU0lTX0NPTlNUUkFJTlRTKE5BTUUsIENNREZMQUcsIERFU0MsIENSRUFURk4pIE5BTUUjI01vZGVsLAorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQW5hbHlzZXMuZGVmIgorTnVtQ29uc3RyYWludHMKK307CisKKy8vLyBBbmFseXNpc0RpYWdDbGllbnRzIC0gU2V0IG9mIGF2YWlsYWJsZSBkaWFnbm9zdGljIGNsaWVudHMgZm9yIHJlbmRlcmluZworLy8vICBhbmFseXNpcyByZXN1bHRzLgorZW51bSBBbmFseXNpc0RpYWdDbGllbnRzIHsKKyNkZWZpbmUgQU5BTFlTSVNfRElBR05PU1RJQ1MoTkFNRSwgQ01ERkxBRywgREVTQywgQ1JFQVRGTikgUERfIyNOQU1FLAorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQW5hbHlzZXMuZGVmIgorUERfTk9ORSwKK05VTV9BTkFMWVNJU19ESUFHX0NMSUVOVFMKK307CisKKy8vLyBBbmFseXNpc1B1cmdlTW9kZXMgLSBTZXQgb2YgYXZhaWxhYmxlIHN0cmF0ZWdpZXMgZm9yIGRlYWQgc3ltYm9sIHJlbW92YWwuCitlbnVtIEFuYWx5c2lzUHVyZ2VNb2RlIHsKKyNkZWZpbmUgQU5BTFlTSVNfUFVSR0UoTkFNRSwgQ01ERkxBRywgREVTQykgTkFNRSwKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0FuYWx5c2VzLmRlZiIKK051bVB1cmdlTW9kZXMKK307CisKKy8vLyBBbmFseXNpc0lubGluZUZ1bmN0aW9uU2VsZWN0aW9uIC0gU2V0IG9mIGlubGluaW5nIGZ1bmN0aW9uIHNlbGVjdGlvbiBoZXVyaXN0aWNzLgorZW51bSBBbmFseXNpc0lubGluaW5nTW9kZSB7CisjZGVmaW5lIEFOQUxZU0lTX0lOTElOSU5HX01PREUoTkFNRSwgQ01ERkxBRywgREVTQykgTkFNRSwKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0FuYWx5c2VzLmRlZiIKK051bUlubGluaW5nTW9kZXMKK307CisKKy8vLyBcYnJpZWYgRGVzY3JpYmVzIHRoZSBkaWZmZXJlbnQga2luZHMgb2YgQysrIG1lbWJlciBmdW5jdGlvbnMgd2hpY2ggY2FuIGJlCisvLy8gY29uc2lkZXJlZCBmb3IgaW5saW5pbmcgYnkgdGhlIGFuYWx5emVyLgorLy8vCisvLy8gVGhlc2Ugb3B0aW9ucyBhcmUgY3VtdWxhdGl2ZTsgZW5hYmxpbmcgb25lIGtpbmQgb2YgbWVtYmVyIGZ1bmN0aW9uIHdpbGwKKy8vLyBlbmFibGUgYWxsIGtpbmRzIHdpdGggbG93ZXIgZW51bSB2YWx1ZXMuCitlbnVtIENYWElubGluZWFibGVNZW1iZXJLaW5kIHsKKyAgLy8gVW5pbml0aWFsaXplZCA9IDAsCisKKyAgLy8vIEEgZHVtbXkgbW9kZSBpbiB3aGljaCBubyBDKysgaW5saW5pbmcgaXMgZW5hYmxlZC4KKyAgQ0lNS19Ob25lID0gMSwKKworICAvLy8gUmVmZXJzIHRvIHJlZ3VsYXIgbWVtYmVyIGZ1bmN0aW9uIGFuZCBvcGVyYXRvciBjYWxscy4KKyAgQ0lNS19NZW1iZXJGdW5jdGlvbnMsCisKKyAgLy8vIFJlZmVycyB0byBjb25zdHJ1Y3RvcnMgKGltcGxpY2l0IG9yIGV4cGxpY2l0KS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgYSBjb25zdHJ1Y3RvciB3aWxsIG5vdCBiZSBpbmxpbmVkIGlmIHRoZSBjb3JyZXNwb25kaW5nCisgIC8vLyBkZXN0cnVjdG9yIGlzIG5vbi10cml2aWFsLgorICBDSU1LX0NvbnN0cnVjdG9ycywKKworICAvLy8gUmVmZXJzIHRvIGRlc3RydWN0b3JzIChpbXBsaWNpdCBvciBleHBsaWNpdCkuCisgIENJTUtfRGVzdHJ1Y3RvcnMKK307CisKKy8vLyBcYnJpZWYgRGVzY3JpYmVzIHRoZSBkaWZmZXJlbnQgbW9kZXMgb2YgaW50ZXItcHJvY2VkdXJhbCBhbmFseXNpcy4KK2VudW0gSVBBS2luZCB7CisgIElQQUtfTm90U2V0ID0gMCwKKworICAvLy8gUGVyZm9ybSBvbmx5IGludHJhLXByb2NlZHVyYWwgYW5hbHlzaXMuCisgIElQQUtfTm9uZSA9IDEsCisKKyAgLy8vIElubGluZSBDIGZ1bmN0aW9ucyBhbmQgYmxvY2tzIHdoZW4gdGhlaXIgZGVmaW5pdGlvbnMgYXJlIGF2YWlsYWJsZS4KKyAgSVBBS19CYXNpY0lubGluaW5nID0gMiwKKworICAvLy8gSW5saW5lIGNhbGxlZXMoQywgQysrLCBPYmpDKSB3aGVuIHRoZWlyIGRlZmluaXRpb25zIGFyZSBhdmFpbGFibGUuCisgIElQQUtfSW5saW5pbmcgPSAzLAorCisgIC8vLyBFbmFibGUgaW5saW5pbmcgb2YgZHluYW1pY2FsbHkgZGlzcGF0Y2hlZCBtZXRob2RzLgorICBJUEFLX0R5bmFtaWNEaXNwYXRjaCA9IDQsCisKKyAgLy8vIEVuYWJsZSBpbmxpbmluZyBvZiBkeW5hbWljYWxseSBkaXNwYXRjaGVkIG1ldGhvZHMsIGJpZnVyY2F0ZSBwYXRocyB3aGVuCisgIC8vLyBleGFjdCB0eXBlIGluZm8gaXMgdW5hdmFpbGFibGUuCisgIElQQUtfRHluYW1pY0Rpc3BhdGNoQmlmdXJjYXRlID0gNQorfTsKKworY2xhc3MgQW5hbHl6ZXJPcHRpb25zIDogcHVibGljIFJlZkNvdW50ZWRCYXNlPEFuYWx5emVyT3B0aW9ucz4geworcHVibGljOgorICB1c2luZyBDb25maWdUYWJsZSA9IGxsdm06OlN0cmluZ01hcDxzdGQ6OnN0cmluZz47CisKKyAgc3RhdGljIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4KKyAgZ2V0UmVnaXN0ZXJlZENoZWNrZXJzKGJvb2wgSW5jbHVkZUV4cGVyaW1lbnRhbCA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIFBhaXIgb2YgY2hlY2tlciBuYW1lIGFuZCBlbmFibGUvZGlzYWJsZS4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBib29sPj4gQ2hlY2tlcnNDb250cm9sTGlzdDsKKyAgCisgIC8vLyBcYnJpZWYgQSBrZXktdmFsdWUgdGFibGUgb2YgdXNlLXNwZWNpZmllZCBjb25maWd1cmF0aW9uIHZhbHVlcy4KKyAgQ29uZmlnVGFibGUgQ29uZmlnOworICBBbmFseXNpc1N0b3JlcyBBbmFseXNpc1N0b3JlT3B0ID0gUmVnaW9uU3RvcmVNb2RlbDsKKyAgQW5hbHlzaXNDb25zdHJhaW50cyBBbmFseXNpc0NvbnN0cmFpbnRzT3B0ID0gUmFuZ2VDb25zdHJhaW50c01vZGVsOworICBBbmFseXNpc0RpYWdDbGllbnRzIEFuYWx5c2lzRGlhZ09wdCA9IFBEX0hUTUw7CisgIEFuYWx5c2lzUHVyZ2VNb2RlIEFuYWx5c2lzUHVyZ2VPcHQgPSBQdXJnZVN0bXQ7CisgIAorICBzdGQ6OnN0cmluZyBBbmFseXplU3BlY2lmaWNGdW5jdGlvbjsKKworICAvLy8gU3RvcmUgZnVsbCBjb21waWxlciBpbnZvY2F0aW9uIGZvciByZXByb2R1Y2libGUgaW5zdHJ1Y3Rpb25zIGluIHRoZQorICAvLy8gZ2VuZXJhdGVkIHJlcG9ydC4KKyAgc3RkOjpzdHJpbmcgRnVsbENvbXBpbGVySW52b2NhdGlvbjsKKyAgCisgIC8vLyBcYnJpZWYgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoZSBhbmFseXplciB2aXNpdHMgYSBibG9jay4KKyAgdW5zaWduZWQgbWF4QmxvY2tWaXNpdE9uUGF0aDsKKyAgCisgIC8vLyBcYnJpZWYgRGlzYWJsZSBhbGwgYW5hbHl6ZXIgY2hlY2tzLgorICAvLy8KKyAgLy8vIFRoaXMgZmxhZyBhbGxvd3Mgb25lIHRvIGRpc2FibGUgYW5hbHl6ZXIgY2hlY2tzIG9uIHRoZSBjb2RlIHByb2Nlc3NlZCBieQorICAvLy8gdGhlIGdpdmVuIGFuYWx5c2lzIGNvbnN1bWVyLiBOb3RlLCB0aGUgY29kZSB3aWxsIGdldCBwYXJzZWQgYW5kIHRoZQorICAvLy8gY29tbWFuZC1saW5lIG9wdGlvbnMgd2lsbCBnZXQgY2hlY2tlZC4KKyAgdW5zaWduZWQgRGlzYWJsZUFsbENoZWNrcyA6IDE7CisKKyAgdW5zaWduZWQgU2hvd0NoZWNrZXJIZWxwIDogMTsKKyAgdW5zaWduZWQgU2hvd0VuYWJsZWRDaGVja2VyTGlzdCA6IDE7CisgIHVuc2lnbmVkIEFuYWx5emVBbGwgOiAxOworICB1bnNpZ25lZCBBbmFseXplckRpc3BsYXlQcm9ncmVzcyA6IDE7CisgIHVuc2lnbmVkIEFuYWx5emVOZXN0ZWRCbG9ja3MgOiAxOworCisgIC8vLyBcYnJpZWYgVGhlIGZsYWcgcmVndWxhdGVzIGlmIHdlIHNob3VsZCBlYWdlcmx5IGFzc3VtZSBldmFsdWF0aW9ucyBvZgorICAvLy8gY29uZGl0aW9uYWxzLCB0aHVzLCBiaWZ1cmNhdGluZyB0aGUgcGF0aC4KKyAgLy8vCisgIC8vLyBUaGlzIGZsYWcgaW5kaWNhdGVzIGhvdyB0aGUgZW5naW5lIHNob3VsZCBoYW5kbGUgZXhwcmVzc2lvbnMgc3VjaCBhczogJ3ggPQorICAvLy8gKHkgIT0gMCknLiAgV2hlbiB0aGlzIGZsYWcgaXMgdHJ1ZSB0aGVuIHRoZSBzdWJleHByZXNzaW9uICd5ICE9IDAnIHdpbGwgYmUKKyAgLy8vIGVhZ2VybHkgYXNzdW1lZCB0byBiZSB0cnVlIG9yIGZhbHNlLCB0aHVzIGV2YWx1YXRpbmcgaXQgdG8gdGhlIGludGVnZXJzIDAKKyAgLy8vIG9yIDEgcmVzcGVjdGl2ZWx5LiAgVGhlIHVwc2lkZSBpcyB0aGF0IHRoaXMgY2FuIGluY3JlYXNlIGFuYWx5c2lzCisgIC8vLyBwcmVjaXNpb24gdW50aWwgd2UgaGF2ZSBhIGJldHRlciB3YXkgdG8gbGF6aWx5IGV2YWx1YXRlIHN1Y2ggbG9naWMuICBUaGUKKyAgLy8vIGRvd25zaWRlIGlzIHRoYXQgaXQgZWFnZXJseSBiaWZ1cmNhdGVzIHBhdGhzLgorICB1bnNpZ25lZCBlYWdlcmx5QXNzdW1lQmluT3BCaWZ1cmNhdGlvbiA6IDE7CisgIAorICB1bnNpZ25lZCBUcmltR3JhcGggOiAxOworICB1bnNpZ25lZCB2aXN1YWxpemVFeHBsb2RlZEdyYXBoV2l0aEdyYXBoVml6IDogMTsKKyAgdW5zaWduZWQgdmlzdWFsaXplRXhwbG9kZWRHcmFwaFdpdGhVYmlHcmFwaCA6IDE7CisgIHVuc2lnbmVkIFVub3B0aW1pemVkQ0ZHIDogMTsKKyAgdW5zaWduZWQgUHJpbnRTdGF0cyA6IDE7CisgIAorICAvLy8gXGJyaWVmIERvIG5vdCByZS1hbmFseXplIHBhdGhzIGxlYWRpbmcgdG8gZXhoYXVzdGVkIG5vZGVzIHdpdGggYSBkaWZmZXJlbnQKKyAgLy8vIHN0cmF0ZWd5LiBXZSBnZXQgYmV0dGVyIGNvZGUgY292ZXJhZ2Ugd2hlbiByZXRyeSBpcyBlbmFibGVkLgorICB1bnNpZ25lZCBOb1JldHJ5RXhoYXVzdGVkIDogMTsKKyAgCisgIC8vLyBcYnJpZWYgVGhlIGlubGluaW5nIHN0YWNrIGRlcHRoIGxpbWl0LgorICAvLyBDYXAgdGhlIHN0YWNrIGRlcHRoIGF0IDQgY2FsbHMgKDUgc3RhY2sgZnJhbWVzLCBiYXNlICsgNCBjYWxscykuCisgIHVuc2lnbmVkIElubGluZU1heFN0YWNrRGVwdGggPSA1OworICAKKyAgLy8vIFxicmllZiBUaGUgbW9kZSBvZiBmdW5jdGlvbiBzZWxlY3Rpb24gdXNlZCBkdXJpbmcgaW5saW5pbmcuCisgIEFuYWx5c2lzSW5saW5pbmdNb2RlIElubGluaW5nTW9kZSA9IE5vUmVkdW5kYW5jeTsKKworICBlbnVtIGNsYXNzIEV4cGxvcmF0aW9uU3RyYXRlZ3lLaW5kIHsKKyAgICBERlMsCisgICAgQkZTLAorICAgIFVuZXhwbG9yZWRGaXJzdCwKKyAgICBVbmV4cGxvcmVkRmlyc3RRdWV1ZSwKKyAgICBCRlNCbG9ja0RGU0NvbnRlbnRzLAorICAgIE5vdFNldAorICB9OworCitwcml2YXRlOgorICBFeHBsb3JhdGlvblN0cmF0ZWd5S2luZCBFeHBsb3JhdGlvblN0cmF0ZWd5ID0gRXhwbG9yYXRpb25TdHJhdGVneUtpbmQ6Ok5vdFNldDsKKworICAvLy8gXGJyaWVmIERlc2NyaWJlcyB0aGUga2luZHMgZm9yIGhpZ2gtbGV2ZWwgYW5hbHl6ZXIgbW9kZS4KKyAgZW51bSBVc2VyTW9kZUtpbmQgeworICAgIFVNS19Ob3RTZXQgPSAwLAorCisgICAgLy8vIFBlcmZvcm0gc2hhbGxvdyBidXQgZmFzdCBhbmFseXplcy4KKyAgICBVTUtfU2hhbGxvdyA9IDEsCisKKyAgICAvLy8gUGVyZm9ybSBkZWVwIGFuYWx5emVzLgorICAgIFVNS19EZWVwID0gMgorICB9OworCisgIC8vLyBDb250cm9scyB0aGUgaGlnaC1sZXZlbCBhbmFseXplciBtb2RlLCB3aGljaCBpbmZsdWVuY2VzIHRoZSBkZWZhdWx0IAorICAvLy8gc2V0dGluZ3MgZm9yIHNvbWUgb2YgdGhlIGxvd2VyLWxldmVsIGNvbmZpZyBvcHRpb25zIChzdWNoIGFzIElQQU1vZGUpLgorICAvLy8gXHNhIGdldFVzZXJNb2RlCisgIFVzZXJNb2RlS2luZCBVc2VyTW9kZSA9IFVNS19Ob3RTZXQ7CisKKyAgLy8vIENvbnRyb2xzIHRoZSBtb2RlIG9mIGludGVyLXByb2NlZHVyYWwgYW5hbHlzaXMuCisgIElQQUtpbmQgSVBBTW9kZSA9IElQQUtfTm90U2V0OworCisgIC8vLyBDb250cm9scyB3aGljaCBDKysgbWVtYmVyIGZ1bmN0aW9ucyB3aWxsIGJlIGNvbnNpZGVyZWQgZm9yIGlubGluaW5nLgorICBDWFhJbmxpbmVhYmxlTWVtYmVyS2luZCBDWFhNZW1iZXJJbmxpbmluZ01vZGU7CisgIAorICAvLy8gXHNhIGluY2x1ZGVJbXBsaWNpdER0b3JzSW5DRkcKKyAgT3B0aW9uYWw8Ym9vbD4gSW5jbHVkZUltcGxpY2l0RHRvcnNJbkNGRzsKKworICAvLy8gXHNhIGluY2x1ZGVUZW1wb3JhcnlEdG9yc0luQ0ZHCisgIE9wdGlvbmFsPGJvb2w+IEluY2x1ZGVUZW1wb3JhcnlEdG9yc0luQ0ZHOworCisgIC8vLyBcc2EgSW5jbHVkZUxpZmV0aW1lSW5DRkcKKyAgT3B0aW9uYWw8Ym9vbD4gSW5jbHVkZUxpZmV0aW1lSW5DRkc7CisKKyAgLy8vIFxzYSBJbmNsdWRlTG9vcEV4aXRJbkNGRworICBPcHRpb25hbDxib29sPiBJbmNsdWRlTG9vcEV4aXRJbkNGRzsKKworICAvLy8gXHNhIEluY2x1ZGVSaWNoQ29uc3RydWN0b3JzSW5DRkcKKyAgT3B0aW9uYWw8Ym9vbD4gSW5jbHVkZVJpY2hDb25zdHJ1Y3RvcnNJbkNGRzsKKworICAvLy8gXHNhIG1heUlubGluZUNYWFN0YW5kYXJkTGlicmFyeQorICBPcHRpb25hbDxib29sPiBJbmxpbmVDWFhTdGFuZGFyZExpYnJhcnk7CisgIAorICAvLy8gXHNhIGluY2x1ZGVTY29wZXNJbkNGRworICBPcHRpb25hbDxib29sPiBJbmNsdWRlU2NvcGVzSW5DRkc7CisKKyAgLy8vIFxzYSBtYXlJbmxpbmVUZW1wbGF0ZUZ1bmN0aW9ucworICBPcHRpb25hbDxib29sPiBJbmxpbmVUZW1wbGF0ZUZ1bmN0aW9uczsKKworICAvLy8gXHNhIG1heUlubGluZUNYWEFsbG9jYXRvcgorICBPcHRpb25hbDxib29sPiBJbmxpbmVDWFhBbGxvY2F0b3I7CisKKyAgLy8vIFxzYSBtYXlJbmxpbmVDWFhDb250YWluZXJNZXRob2RzCisgIE9wdGlvbmFsPGJvb2w+IElubGluZUNYWENvbnRhaW5lck1ldGhvZHM7CisKKyAgLy8vIFxzYSBtYXlJbmxpbmVDWFhTaGFyZWRQdHJEdG9yCisgIE9wdGlvbmFsPGJvb2w+IElubGluZUNYWFNoYXJlZFB0ckR0b3I7CisKKyAgLy8vIFxzYSBtYXlJbmxpbmVDWFhUZW1wb3JhcnlEdG9ycworICBPcHRpb25hbDxib29sPiBJbmxpbmVDWFhUZW1wb3JhcnlEdG9yczsKKworICAvLy8gXHNhIG1heUlubGluZU9iakNNZXRob2QKKyAgT3B0aW9uYWw8Ym9vbD4gT2JqQ0lubGluaW5nTW9kZTsKKworICAvLyBDYWNoZSBvZiB0aGUgImlwYS1hbHdheXMtaW5saW5lLXNpemUiIHNldHRpbmcuCisgIC8vIFxzYSBnZXRBbHdheXNJbmxpbmVTaXplCisgIE9wdGlvbmFsPHVuc2lnbmVkPiBBbHdheXNJbmxpbmVTaXplOworCisgIC8vLyBcc2Egc2hvdWxkU3VwcHJlc3NOdWxsUmV0dXJuUGF0aHMKKyAgT3B0aW9uYWw8Ym9vbD4gU3VwcHJlc3NOdWxsUmV0dXJuUGF0aHM7CisKKyAgLy8gXHNhIGdldE1heElubGluYWJsZVNpemUKKyAgT3B0aW9uYWw8dW5zaWduZWQ+IE1heElubGluYWJsZVNpemU7CisKKyAgLy8vIFxzYSBzaG91bGRBdm9pZFN1cHByZXNzaW5nTnVsbEFyZ3VtZW50UGF0aHMKKyAgT3B0aW9uYWw8Ym9vbD4gQXZvaWRTdXBwcmVzc2luZ051bGxBcmd1bWVudFBhdGhzOworCisgIC8vLyBcc2Egc2hvdWxkU3VwcHJlc3NJbmxpbmVkRGVmZW5zaXZlQ2hlY2tzCisgIE9wdGlvbmFsPGJvb2w+IFN1cHByZXNzSW5saW5lZERlZmVuc2l2ZUNoZWNrczsKKworICAvLy8gXHNhIHNob3VsZFN1cHByZXNzRnJvbUNYWFN0YW5kYXJkTGlicmFyeQorICBPcHRpb25hbDxib29sPiBTdXBwcmVzc0Zyb21DWFhTdGFuZGFyZExpYnJhcnk7CisKKyAgLy8vIFxzYSByZXBvcnRJc3N1ZXNJbk1haW5Tb3VyY2VGaWxlCisgIE9wdGlvbmFsPGJvb2w+IFJlcG9ydElzc3Vlc0luTWFpblNvdXJjZUZpbGU7CisKKyAgLy8vIFxzYSBTdGFibGVSZXBvcnRGaWxlbmFtZQorICBPcHRpb25hbDxib29sPiBTdGFibGVSZXBvcnRGaWxlbmFtZTsKKworICBPcHRpb25hbDxib29sPiBTZXJpYWxpemVTdGF0czsKKworICAvLy8gXHNhIGdldEdyYXBoVHJpbUludGVydmFsCisgIE9wdGlvbmFsPHVuc2lnbmVkPiBHcmFwaFRyaW1JbnRlcnZhbDsKKworICAvLy8gXHNhIGdldE1heFRpbWVzSW5saW5lTGFyZ2UKKyAgT3B0aW9uYWw8dW5zaWduZWQ+IE1heFRpbWVzSW5saW5lTGFyZ2U7CisKKyAgLy8vIFxzYSBnZXRNaW5DRkdTaXplVHJlYXRGdW5jdGlvbnNBc0xhcmdlCisgIE9wdGlvbmFsPHVuc2lnbmVkPiBNaW5DRkdTaXplVHJlYXRGdW5jdGlvbnNBc0xhcmdlOworCisgIC8vLyBcc2EgZ2V0TWF4Tm9kZXNQZXJUb3BMZXZlbEZ1bmN0aW9uCisgIE9wdGlvbmFsPHVuc2lnbmVkPiBNYXhOb2Rlc1BlclRvcExldmVsRnVuY3Rpb247CisKKyAgLy8vIFxzYSBzaG91bGRJbmxpbmVMYW1iZGFzCisgIE9wdGlvbmFsPGJvb2w+IElubGluZUxhbWJkYXM7CisKKyAgLy8vIFxzYSBzaG91bGRXaWRlbkxvb3BzCisgIE9wdGlvbmFsPGJvb2w+IFdpZGVuTG9vcHM7CisKKyAgLy8vIFxzYSBzaG91bGRVbnJvbGxMb29wcworICBPcHRpb25hbDxib29sPiBVbnJvbGxMb29wczsKKworICAvLy8gXHNhIHNob3VsZERpc3BsYXlOb3Rlc0FzRXZlbnRzCisgIE9wdGlvbmFsPGJvb2w+IERpc3BsYXlOb3Rlc0FzRXZlbnRzOworCisgIC8vLyBcc2EgZ2V0Q1RVRGlyCisgIE9wdGlvbmFsPFN0cmluZ1JlZj4gQ1RVRGlyOworCisgIC8vLyBcc2EgZ2V0Q1RVSW5kZXhOYW1lCisgIE9wdGlvbmFsPFN0cmluZ1JlZj4gQ1RVSW5kZXhOYW1lOworCisgIC8vLyBcc2EgbmFpdmVDVFVFbmFibGVkCisgIE9wdGlvbmFsPGJvb2w+IE5haXZlQ1RVOworCisKKyAgLy8vIEEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0cmlldmVzIG9wdGlvbiBmb3IgYSBnaXZlbiBmdWxsLXF1YWxpZmllZAorICAvLy8gY2hlY2tlciBuYW1lLgorICAvLy8gT3B0aW9ucyBmb3IgY2hlY2tlcnMgY2FuIGJlIHNwZWNpZmllZCB2aWEgJ2FuYWx5emVyLWNvbmZpZycgY29tbWFuZC1saW5lCisgIC8vLyBvcHRpb24uCisgIC8vLyBFeGFtcGxlOgorICAvLy8gQGNvZGUtYW5hbHl6ZXItY29uZmlnIHVuaXguTWFsbG9jOk9wdGlvbk5hbWU9Q2hlY2tlck9wdGlvblZhbHVlIEBlbmRjb2RlCisgIC8vLyBvciBAY29kZS1hbmFseXplci1jb25maWcgdW5peDpPcHRpb25OYW1lPUdyb3VwT3B0aW9uVmFsdWUgQGVuZGNvZGUKKyAgLy8vIGZvciBncm91cHMgb2YgY2hlY2tlcnMuCisgIC8vLyBAcGFyYW0gW2luXSBDaGVja2VyTmFtZSAgRnVsbC1xdWFsaWZpZWQgY2hlY2tlciBuYW1lLCBsaWtlCisgIC8vLyBhbHBoYS51bml4LlN0cmVhbUNoZWNrZXIuCisgIC8vLyBAcGFyYW0gW2luXSBPcHRpb25OYW1lICBOYW1lIG9mIHRoZSBvcHRpb24gdG8gZ2V0LgorICAvLy8gQHBhcmFtIFtpbl0gRGVmYXVsdCAgRGVmYXVsdCB2YWx1ZSBpZiBubyBvcHRpb24gaXMgc3BlY2lmaWVkLgorICAvLy8gQHBhcmFtIFtpbl0gU2VhcmNoSW5QYXJlbnRzIElmIHNldCB0byB0cnVlIGFuZCB0aGUgc2VhcmNoZWQgb3B0aW9uIHdhcyBub3QKKyAgLy8vIHNwZWNpZmllZCBmb3IgdGhlIGdpdmVuIGNoZWNrZXIgdGhlIG9wdGlvbnMgZm9yIHRoZSBwYXJlbnQgcGFja2FnZXMgd2lsbAorICAvLy8gYmUgc2VhcmNoZWQgYXMgd2VsbC4gVGhlIGlubmVyIHBhY2thZ2VzIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSBvdXRlcgorICAvLy8gb25lcy4KKyAgLy8vIEByZXR2YWwgQ2hlY2tlck9wdGlvblZhbHVlICBBbiBvcHRpb24gZm9yIGEgY2hlY2tlciBpZiBpdCB3YXMgc3BlY2lmaWVkLgorICAvLy8gQHJldHZhbCBHcm91cE9wdGlvblZhbHVlICBBbiBvcHRpb24gZm9yIGdyb3VwIGlmIGl0IHdhcyBzcGVjaWZpZWQgYW5kIG5vCisgIC8vLyBjaGVja2VyLXNwZWNpZmljIG9wdGlvbnMgd2VyZSBmb3VuZC4gVGhlIGNsb3NlciBncm91cCB0byBjaGVja2VyLAorICAvLy8gdGhlIG1vcmUgcHJpb3JpdHkgaXQgaGFzLiBGb3IgZXhhbXBsZSwgQGMgY29yZWdyb3VwLnN1Ymdyb3VwIGhhcyBtb3JlCisgIC8vLyBwcmlvcml0eSB0aGFuIEBjIGNvcmVncm91cCBmb3IgQGMgY29yZWdyb3VwLnN1Ymdyb3VwLkNoZWNrZXJOYW1lIGNoZWNrZXIuCisgIC8vLyBAcmV0dmFsIERlZmF1bHQgIElmIG5vciBjaGVja2VyIG9wdGlvbiwgbm9yIGdyb3VwIG9wdGlvbiB3YXMgZm91bmQuCisgIFN0cmluZ1JlZiBnZXRDaGVja2VyT3B0aW9uKFN0cmluZ1JlZiBDaGVja2VyTmFtZSwgU3RyaW5nUmVmIE9wdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNlYXJjaEluUGFyZW50cyA9IGZhbHNlKTsKKworcHVibGljOgorICBBbmFseXplck9wdGlvbnMoKQorICAgICAgOiBEaXNhYmxlQWxsQ2hlY2tzKGZhbHNlKSwgU2hvd0NoZWNrZXJIZWxwKGZhbHNlKSwKKyAgICAgICAgU2hvd0VuYWJsZWRDaGVja2VyTGlzdChmYWxzZSksIEFuYWx5emVBbGwoZmFsc2UpLAorICAgICAgICBBbmFseXplckRpc3BsYXlQcm9ncmVzcyhmYWxzZSksIEFuYWx5emVOZXN0ZWRCbG9ja3MoZmFsc2UpLAorICAgICAgICBlYWdlcmx5QXNzdW1lQmluT3BCaWZ1cmNhdGlvbihmYWxzZSksIFRyaW1HcmFwaChmYWxzZSksCisgICAgICAgIHZpc3VhbGl6ZUV4cGxvZGVkR3JhcGhXaXRoR3JhcGhWaXooZmFsc2UpLAorICAgICAgICB2aXN1YWxpemVFeHBsb2RlZEdyYXBoV2l0aFViaUdyYXBoKGZhbHNlKSwgVW5vcHRpbWl6ZWRDRkcoZmFsc2UpLAorICAgICAgICBQcmludFN0YXRzKGZhbHNlKSwgTm9SZXRyeUV4aGF1c3RlZChmYWxzZSksIENYWE1lbWJlcklubGluaW5nTW9kZSgpIHt9CisKKyAgLy8vIEludGVycHJldHMgYW4gb3B0aW9uJ3Mgc3RyaW5nIHZhbHVlIGFzIGEgYm9vbGVhbi4gVGhlICJ0cnVlIiBzdHJpbmcgaXMKKyAgLy8vIGludGVycHJldGVkIGFzIHRydWUgYW5kIHRoZSAiZmFsc2UiIHN0cmluZyBpcyBpbnRlcnByZXRlZCBhcyBmYWxzZS4KKyAgLy8vCisgIC8vLyBJZiBhbiBvcHRpb24gdmFsdWUgaXMgbm90IHByb3ZpZGVkLCByZXR1cm5zIHRoZSBnaXZlbiBccCBEZWZhdWx0VmFsLgorICAvLy8gQHBhcmFtIFtpbl0gTmFtZSBOYW1lIGZvciBvcHRpb24gdG8gcmV0cmlldmUuCisgIC8vLyBAcGFyYW0gW2luXSBEZWZhdWx0VmFsIERlZmF1bHQgdmFsdWUgcmV0dXJuZWQgaWYgbm8gc3VjaCBvcHRpb24gd2FzCisgIC8vLyBzcGVjaWZpZWQuCisgIC8vLyBAcGFyYW0gW2luXSBDIFRoZSBvcHRpb25hbCBjaGVja2VyIHBhcmFtZXRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlc3RyaWN0CisgIC8vLyB0aGUgc2VhcmNoIHRvIHRoZSBvcHRpb25zIG9mIHRoaXMgcGFydGljdWxhciBjaGVja2VyIChhbmQgaXRzIHBhcmVudHMKKyAgLy8vIGRlcGVuZGVuaW5nIG9uIHNlYXJjaCBtb2RlKS4KKyAgLy8vIEBwYXJhbSBbaW5dIFNlYXJjaEluUGFyZW50cyBJZiBzZXQgdG8gdHJ1ZSBhbmQgdGhlIHNlYXJjaGVkIG9wdGlvbiB3YXMgbm90CisgIC8vLyBzcGVjaWZpZWQgZm9yIHRoZSBnaXZlbiBjaGVja2VyIHRoZSBvcHRpb25zIGZvciB0aGUgcGFyZW50IHBhY2thZ2VzIHdpbGwKKyAgLy8vIGJlIHNlYXJjaGVkIGFzIHdlbGwuIFRoZSBpbm5lciBwYWNrYWdlcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgb3V0ZXIKKyAgLy8vIG9uZXMuCisgIGJvb2wgZ2V0Qm9vbGVhbk9wdGlvbihTdHJpbmdSZWYgTmFtZSwgYm9vbCBEZWZhdWx0VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50bzo6Q2hlY2tlckJhc2UgKkMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTZWFyY2hJblBhcmVudHMgPSBmYWxzZSk7CisKKyAgLy8vIFZhcmlhbnQgdGhhdCBhY2NlcHRzIGEgT3B0aW9uYWwgdmFsdWUgdG8gY2FjaGUgdGhlIHJlc3VsdC4KKyAgLy8vCisgIC8vLyBAcGFyYW0gW2luLG91dF0gViBSZXR1cm4gdmFsdWUgc3RvcmFnZSwgcmV0dXJuZWQgaWYgcGFyYW1ldGVyIGNvbnRhaW5zCisgIC8vLyBhbiBleGlzdGluZyB2YWxpZCBvcHRpb24sIGVsc2UgaXQgaXMgdXNlZCB0byBzdG9yZSBhIHJldHVybiB2YWx1ZQorICAvLy8gQHBhcmFtIFtpbl0gTmFtZSBOYW1lIGZvciBvcHRpb24gdG8gcmV0cmlldmUuCisgIC8vLyBAcGFyYW0gW2luXSBEZWZhdWx0VmFsIERlZmF1bHQgdmFsdWUgcmV0dXJuZWQgaWYgbm8gc3VjaCBvcHRpb24gd2FzCisgIC8vLyBzcGVjaWZpZWQuCisgIC8vLyBAcGFyYW0gW2luXSBDIFRoZSBvcHRpb25hbCBjaGVja2VyIHBhcmFtZXRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlc3RyaWN0CisgIC8vLyB0aGUgc2VhcmNoIHRvIHRoZSBvcHRpb25zIG9mIHRoaXMgcGFydGljdWxhciBjaGVja2VyIChhbmQgaXRzIHBhcmVudHMKKyAgLy8vIGRlcGVuZGVuaW5nIG9uIHNlYXJjaCBtb2RlKS4KKyAgLy8vIEBwYXJhbSBbaW5dIFNlYXJjaEluUGFyZW50cyBJZiBzZXQgdG8gdHJ1ZSBhbmQgdGhlIHNlYXJjaGVkIG9wdGlvbiB3YXMgbm90CisgIC8vLyBzcGVjaWZpZWQgZm9yIHRoZSBnaXZlbiBjaGVja2VyIHRoZSBvcHRpb25zIGZvciB0aGUgcGFyZW50IHBhY2thZ2VzIHdpbGwKKyAgLy8vIGJlIHNlYXJjaGVkIGFzIHdlbGwuIFRoZSBpbm5lciBwYWNrYWdlcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgb3V0ZXIKKyAgLy8vIG9uZXMuCisgIGJvb2wgZ2V0Qm9vbGVhbk9wdGlvbihPcHRpb25hbDxib29sPiAmViwgU3RyaW5nUmVmIE5hbWUsIGJvb2wgRGVmYXVsdFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudG86OkNoZWNrZXJCYXNlICpDICA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNlYXJjaEluUGFyZW50cyA9IGZhbHNlKTsKKworICAvLy8gSW50ZXJwcmV0cyBhbiBvcHRpb24ncyBzdHJpbmcgdmFsdWUgYXMgYW4gaW50ZWdlciB2YWx1ZS4KKyAgLy8vCisgIC8vLyBJZiBhbiBvcHRpb24gdmFsdWUgaXMgbm90IHByb3ZpZGVkLCByZXR1cm5zIHRoZSBnaXZlbiBccCBEZWZhdWx0VmFsLgorICAvLy8gQHBhcmFtIFtpbl0gTmFtZSBOYW1lIGZvciBvcHRpb24gdG8gcmV0cmlldmUuCisgIC8vLyBAcGFyYW0gW2luXSBEZWZhdWx0VmFsIERlZmF1bHQgdmFsdWUgcmV0dXJuZWQgaWYgbm8gc3VjaCBvcHRpb24gd2FzCisgIC8vLyBzcGVjaWZpZWQuCisgIC8vLyBAcGFyYW0gW2luXSBDIFRoZSBvcHRpb25hbCBjaGVja2VyIHBhcmFtZXRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlc3RyaWN0CisgIC8vLyB0aGUgc2VhcmNoIHRvIHRoZSBvcHRpb25zIG9mIHRoaXMgcGFydGljdWxhciBjaGVja2VyIChhbmQgaXRzIHBhcmVudHMKKyAgLy8vIGRlcGVuZGVuaW5nIG9uIHNlYXJjaCBtb2RlKS4KKyAgLy8vIEBwYXJhbSBbaW5dIFNlYXJjaEluUGFyZW50cyBJZiBzZXQgdG8gdHJ1ZSBhbmQgdGhlIHNlYXJjaGVkIG9wdGlvbiB3YXMgbm90CisgIC8vLyBzcGVjaWZpZWQgZm9yIHRoZSBnaXZlbiBjaGVja2VyIHRoZSBvcHRpb25zIGZvciB0aGUgcGFyZW50IHBhY2thZ2VzIHdpbGwKKyAgLy8vIGJlIHNlYXJjaGVkIGFzIHdlbGwuIFRoZSBpbm5lciBwYWNrYWdlcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgb3V0ZXIKKyAgLy8vIG9uZXMuCisgIGludCBnZXRPcHRpb25Bc0ludGVnZXIoU3RyaW5nUmVmIE5hbWUsIGludCBEZWZhdWx0VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudG86OkNoZWNrZXJCYXNlICpDID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNlYXJjaEluUGFyZW50cyA9IGZhbHNlKTsKKworICAvLy8gUXVlcnkgYW4gb3B0aW9uJ3Mgc3RyaW5nIHZhbHVlLgorICAvLy8KKyAgLy8vIElmIGFuIG9wdGlvbiB2YWx1ZSBpcyBub3QgcHJvdmlkZWQsIHJldHVybnMgdGhlIGdpdmVuIFxwIERlZmF1bHRWYWwuCisgIC8vLyBAcGFyYW0gW2luXSBOYW1lIE5hbWUgZm9yIG9wdGlvbiB0byByZXRyaWV2ZS4KKyAgLy8vIEBwYXJhbSBbaW5dIERlZmF1bHRWYWwgRGVmYXVsdCB2YWx1ZSByZXR1cm5lZCBpZiBubyBzdWNoIG9wdGlvbiB3YXMKKyAgLy8vIHNwZWNpZmllZC4KKyAgLy8vIEBwYXJhbSBbaW5dIEMgVGhlIG9wdGlvbmFsIGNoZWNrZXIgcGFyYW1ldGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVzdHJpY3QKKyAgLy8vIHRoZSBzZWFyY2ggdG8gdGhlIG9wdGlvbnMgb2YgdGhpcyBwYXJ0aWN1bGFyIGNoZWNrZXIgKGFuZCBpdHMgcGFyZW50cworICAvLy8gZGVwZW5kZW5pbmcgb24gc2VhcmNoIG1vZGUpLgorICAvLy8gQHBhcmFtIFtpbl0gU2VhcmNoSW5QYXJlbnRzIElmIHNldCB0byB0cnVlIGFuZCB0aGUgc2VhcmNoZWQgb3B0aW9uIHdhcyBub3QKKyAgLy8vIHNwZWNpZmllZCBmb3IgdGhlIGdpdmVuIGNoZWNrZXIgdGhlIG9wdGlvbnMgZm9yIHRoZSBwYXJlbnQgcGFja2FnZXMgd2lsbAorICAvLy8gYmUgc2VhcmNoZWQgYXMgd2VsbC4gVGhlIGlubmVyIHBhY2thZ2VzIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSBvdXRlcgorICAvLy8gb25lcy4KKyAgU3RyaW5nUmVmIGdldE9wdGlvbkFzU3RyaW5nKFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgRGVmYXVsdFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudG86OkNoZWNrZXJCYXNlICpDID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2VhcmNoSW5QYXJlbnRzID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgUmV0cmlldmVzIGFuZCBzZXRzIHRoZSBVc2VyTW9kZS4gVGhpcyBpcyBhIGhpZ2gtbGV2ZWwgb3B0aW9uLAorICAvLy8gd2hpY2ggaXMgdXNlZCB0byBzZXQgb3RoZXIgbG93LWxldmVsIG9wdGlvbnMuIEl0IGlzIG5vdCBhY2Nlc3NpYmxlCisgIC8vLyBvdXRzaWRlIG9mIEFuYWx5emVyT3B0aW9ucy4KKyAgVXNlck1vZGVLaW5kIGdldFVzZXJNb2RlKCk7CisKKyAgRXhwbG9yYXRpb25TdHJhdGVneUtpbmQgZ2V0RXhwbG9yYXRpb25TdHJhdGVneSgpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgaW50ZXItcHJvY2VkdXJhbCBhbmFseXNpcyBtb2RlLgorICBJUEFLaW5kIGdldElQQU1vZGUoKTsKKworICAvLy8gUmV0dXJucyB0aGUgb3B0aW9uIGNvbnRyb2xsaW5nIHdoaWNoIEMrKyBtZW1iZXIgZnVuY3Rpb25zIHdpbGwgYmUKKyAgLy8vIGNvbnNpZGVyZWQgZm9yIGlubGluaW5nLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgY29udHJvbGxlZCBieSB0aGUgJ2MrKy1pbmxpbmluZycgY29uZmlnIG9wdGlvbi4KKyAgLy8vCisgIC8vLyBcc2EgQ1hYTWVtYmVySW5saW5pbmdNb2RlCisgIGJvb2wgbWF5SW5saW5lQ1hYTWVtYmVyRnVuY3Rpb24oQ1hYSW5saW5lYWJsZU1lbWJlcktpbmQgSyk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBPYmplY3RpdmVDIGlubGluaW5nIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBtYXlJbmxpbmVPYmpDTWV0aG9kKCk7CisKKyAgLy8vIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGRlc3RydWN0b3JzIGZvciBDKysgdGVtcG9yYXJ5IG9iamVjdHMgc2hvdWxkCisgIC8vLyBiZSBpbmNsdWRlZCBpbiB0aGUgQ0ZHLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgY29udHJvbGxlZCBieSB0aGUgJ2NmZy10ZW1wb3JhcnktZHRvcnMnIGNvbmZpZyBvcHRpb24sIHdoaWNoCisgIC8vLyBhY2NlcHRzIHRoZSB2YWx1ZXMgInRydWUiIGFuZCAiZmFsc2UiLgorICBib29sIGluY2x1ZGVUZW1wb3JhcnlEdG9yc0luQ0ZHKCk7CisKKyAgLy8vIFJldHVybnMgd2hldGhlciBvciBub3QgaW1wbGljaXQgZGVzdHJ1Y3RvcnMgZm9yIEMrKyBvYmplY3RzIHNob3VsZAorICAvLy8gYmUgaW5jbHVkZWQgaW4gdGhlIENGRy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGNvbnRyb2xsZWQgYnkgdGhlICdjZmctaW1wbGljaXQtZHRvcnMnIGNvbmZpZyBvcHRpb24sIHdoaWNoCisgIC8vLyBhY2NlcHRzIHRoZSB2YWx1ZXMgInRydWUiIGFuZCAiZmFsc2UiLgorICBib29sIGluY2x1ZGVJbXBsaWNpdER0b3JzSW5DRkcoKTsKKworICAvLy8gUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBlbmQtb2YtbGlmZXRpbWUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGluY2x1ZGVkIGluCisgIC8vLyB0aGUgQ0ZHLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgY29udHJvbGxlZCBieSB0aGUgJ2NmZy1saWZldGltZScgY29uZmlnIG9wdGlvbiwgd2hpY2ggYWNjZXB0cworICAvLy8gdGhlIHZhbHVlcyAidHJ1ZSIgYW5kICJmYWxzZSIuCisgIGJvb2wgaW5jbHVkZUxpZmV0aW1lSW5DRkcoKTsKKworICAvLy8gUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZW5kIG9mIHRoZSBsb29wIGluZm9ybWF0aW9uIHNob3VsZCBiZSBpbmNsdWRlZAorICAvLy8gaW4gdGhlIENGRy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGNvbnRyb2xsZWQgYnkgdGhlICdjZmctbG9vcGV4aXQnIGNvbmZpZyBvcHRpb24sIHdoaWNoIGFjY2VwdHMKKyAgLy8vIHRoZSB2YWx1ZXMgInRydWUiIGFuZCAiZmFsc2UiLgorICBib29sIGluY2x1ZGVMb29wRXhpdEluQ0ZHKCk7CisKKyAgLy8vIFJldHVybnMgd2hldGhlciBvciBub3QgY29uc3RydWN0aW9uIHNpdGUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGluY2x1ZGVkCisgIC8vLyBpbiB0aGUgQ0ZHIEMrKyBjb25zdHJ1Y3RvciBlbGVtZW50cy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGNvbnRyb2xsZWQgYnkgdGhlICdjZmctcmljaC1jb25zdHJ1Y3RvcnMnIGNvbmZpZyBvcHRpb25zLAorICAvLy8gd2hpY2ggYWNjZXB0cyB0aGUgdmFsdWVzICJ0cnVlIiBhbmQgImZhbHNlIi4KKyAgYm9vbCBpbmNsdWRlUmljaENvbnN0cnVjdG9yc0luQ0ZHKCk7CisKKyAgLy8vIFJldHVybnMgd2hldGhlciBvciBub3Qgc2NvcGUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBDRkcuCisgIC8vLworICAvLy8gVGhpcyBpcyBjb250cm9sbGVkIGJ5IHRoZSAnY2ZnLXNjb3BlLWluZm8nIGNvbmZpZyBvcHRpb24sIHdoaWNoIGFjY2VwdHMKKyAgLy8vIHRoZSB2YWx1ZXMgInRydWUiIGFuZCAiZmFsc2UiLgorICBib29sIGluY2x1ZGVTY29wZXNJbkNGRygpOworCisgIC8vLyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IEMrKyBzdGFuZGFyZCBsaWJyYXJ5IGZ1bmN0aW9ucyBtYXkgYmUgY29uc2lkZXJlZAorICAvLy8gZm9yIGlubGluaW5nLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgY29udHJvbGxlZCBieSB0aGUgJ2MrKy1zdGRsaWItaW5saW5pbmcnIGNvbmZpZyBvcHRpb24sIHdoaWNoCisgIC8vLyBhY2NlcHRzIHRoZSB2YWx1ZXMgInRydWUiIGFuZCAiZmFsc2UiLgorICBib29sIG1heUlubGluZUNYWFN0YW5kYXJkTGlicmFyeSgpOworCisgIC8vLyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRlbXBsYXRlZCBmdW5jdGlvbnMgbWF5IGJlIGNvbnNpZGVyZWQgZm9yIGlubGluaW5nLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgY29udHJvbGxlZCBieSB0aGUgJ2MrKy10ZW1wbGF0ZS1pbmxpbmluZycgY29uZmlnIG9wdGlvbiwgd2hpY2gKKyAgLy8vIGFjY2VwdHMgdGhlIHZhbHVlcyAidHJ1ZSIgYW5kICJmYWxzZSIuCisgIGJvb2wgbWF5SW5saW5lVGVtcGxhdGVGdW5jdGlvbnMoKTsKKworICAvLy8gUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhbGxvY2F0b3IgY2FsbCBtYXkgYmUgY29uc2lkZXJlZCBmb3IgaW5saW5pbmcuCisgIC8vLworICAvLy8gVGhpcyBpcyBjb250cm9sbGVkIGJ5IHRoZSAnYysrLWFsbG9jYXRvci1pbmxpbmluZycgY29uZmlnIG9wdGlvbiwgd2hpY2gKKyAgLy8vIGFjY2VwdHMgdGhlIHZhbHVlcyAidHJ1ZSIgYW5kICJmYWxzZSIuCisgIGJvb2wgbWF5SW5saW5lQ1hYQWxsb2NhdG9yKCk7CisKKyAgLy8vIFJldHVybnMgd2hldGhlciBvciBub3QgbWV0aG9kcyBvZiBDKysgY29udGFpbmVyIG9iamVjdHMgbWF5IGJlIGNvbnNpZGVyZWQKKyAgLy8vIGZvciBpbmxpbmluZy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGNvbnRyb2xsZWQgYnkgdGhlICdjKystY29udGFpbmVyLWlubGluaW5nJyBjb25maWcgb3B0aW9uLCB3aGljaAorICAvLy8gYWNjZXB0cyB0aGUgdmFsdWVzICJ0cnVlIiBhbmQgImZhbHNlIi4KKyAgYm9vbCBtYXlJbmxpbmVDWFhDb250YWluZXJNZXRob2RzKCk7CisKKyAgLy8vIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGRlc3RydWN0b3Igb2YgQysrICdzaGFyZWRfcHRyJyBtYXkgYmUKKyAgLy8vIGNvbnNpZGVyZWQgZm9yIGlubGluaW5nLgorICAvLy8KKyAgLy8vIFRoaXMgY292ZXJzIHN0ZDo6c2hhcmVkX3B0ciwgc3RkOjp0cjE6OnNoYXJlZF9wdHIsIGFuZCBib29zdDo6c2hhcmVkX3B0ciwKKyAgLy8vIGFuZCBpbmRlZWQgYW55IGRlc3RydWN0b3IgbmFtZWQgIn5zaGFyZWRfcHRyIi4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGNvbnRyb2xsZWQgYnkgdGhlICdjKystc2hhcmVkX3B0ci1pbmxpbmluZycgY29uZmlnIG9wdGlvbiwgd2hpY2gKKyAgLy8vIGFjY2VwdHMgdGhlIHZhbHVlcyAidHJ1ZSIgYW5kICJmYWxzZSIuCisgIGJvb2wgbWF5SW5saW5lQ1hYU2hhcmVkUHRyRHRvcigpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgQysrIHRlbXBvcmFyeSBkZXN0cnVjdG9ycyBzaG91bGQgYmUgaW5saW5lZCBkdXJpbmcKKyAgLy8vIGFuYWx5c2lzLgorICAvLy8KKyAgLy8vIElmIHRlbXBvcmFyeSBkZXN0cnVjdG9ycyBhcmUgZGlzYWJsZWQgaW4gdGhlIENGRyB2aWEgdGhlCisgIC8vLyAnY2ZnLXRlbXBvcmFyeS1kdG9ycycgb3B0aW9uLCB0ZW1wb3JhcnkgZGVzdHJ1Y3RvcnMgd291bGQgbm90IGJlCisgIC8vLyBpbmxpbmVkIGFueXdheS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGNvbnRyb2xsZWQgYnkgdGhlICdjKystdGVtcC1kdG9yLWlubGluaW5nJyBjb25maWcgb3B0aW9uLCB3aGljaAorICAvLy8gYWNjZXB0cyB0aGUgdmFsdWVzICJ0cnVlIiBhbmQgImZhbHNlIi4KKyAgYm9vbCBtYXlJbmxpbmVDWFhUZW1wb3JhcnlEdG9ycygpOworCisgIC8vLyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHBhdGhzIHRoYXQgZ28gdGhyb3VnaCBudWxsIHJldHVybnMgc2hvdWxkIGJlCisgIC8vLyBzdXBwcmVzc2VkLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYSBoZXVyaXN0aWMgZm9yIGF2b2lkaW5nIGJ1ZyByZXBvcnRzIHdpdGggcGF0aHMgdGhhdCBnbyB0aHJvdWdoCisgIC8vLyBpbmxpbmVkIGZ1bmN0aW9ucyB0aGF0IGFyZSBtb3JlIGRlZmVuc2l2ZSB0aGFuIHRoZWlyIGNhbGxlcnMuCisgIC8vLworICAvLy8gVGhpcyBpcyBjb250cm9sbGVkIGJ5IHRoZSAnc3VwcHJlc3MtbnVsbC1yZXR1cm4tcGF0aHMnIGNvbmZpZyBvcHRpb24sCisgIC8vLyB3aGljaCBhY2NlcHRzIHRoZSB2YWx1ZXMgInRydWUiIGFuZCAiZmFsc2UiLgorICBib29sIHNob3VsZFN1cHByZXNzTnVsbFJldHVyblBhdGhzKCk7CisKKyAgLy8vIFJldHVybnMgd2hldGhlciBhIGJ1ZyByZXBvcnQgc2hvdWxkIFxlbSBub3QgYmUgc3VwcHJlc3NlZCBpZiBpdHMgcGF0aAorICAvLy8gaW5jbHVkZXMgYSBjYWxsIHdpdGggYSBudWxsIGFyZ3VtZW50LCBldmVuIGlmIHRoYXQgY2FsbCBoYXMgYSBudWxsIHJldHVybi4KKyAgLy8vCisgIC8vLyBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IHdoZW4gI3Nob3VsZFN1cHByZXNzTnVsbFJldHVyblBhdGhzKCkgaXMgZmFsc2UuCisgIC8vLworICAvLy8gVGhpcyBpcyBhIGNvdW50ZXItaGV1cmlzdGljIHRvIGF2b2lkIGZhbHNlIG5lZ2F0aXZlcy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGNvbnRyb2xsZWQgYnkgdGhlICdhdm9pZC1zdXBwcmVzc2luZy1udWxsLWFyZ3VtZW50LXBhdGhzJyBjb25maWcKKyAgLy8vIG9wdGlvbiwgd2hpY2ggYWNjZXB0cyB0aGUgdmFsdWVzICJ0cnVlIiBhbmQgImZhbHNlIi4KKyAgYm9vbCBzaG91bGRBdm9pZFN1cHByZXNzaW5nTnVsbEFyZ3VtZW50UGF0aHMoKTsKKworICAvLy8gUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBkaWFnbm9zdGljcyBjb250YWluaW5nIGlubGluZWQgZGVmZW5zaXZlIE5VTEwKKyAgLy8vIGNoZWNrcyBzaG91bGQgYmUgc3VwcHJlc3NlZC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGNvbnRyb2xsZWQgYnkgdGhlICdzdXBwcmVzcy1pbmxpbmVkLWRlZmVuc2l2ZS1jaGVja3MnIGNvbmZpZworICAvLy8gb3B0aW9uLCB3aGljaCBhY2NlcHRzIHRoZSB2YWx1ZXMgInRydWUiIGFuZCAiZmFsc2UiLgorICBib29sIHNob3VsZFN1cHByZXNzSW5saW5lZERlZmVuc2l2ZUNoZWNrcygpOworCisgIC8vLyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGRpYWdub3N0aWNzIHJlcG9ydGVkIHdpdGhpbiB0aGUgQysrIHN0YW5kYXJkCisgIC8vLyBsaWJyYXJ5IHNob3VsZCBiZSBzdXBwcmVzc2VkLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgY29udHJvbGxlZCBieSB0aGUgJ3N1cHByZXNzLWMrKy1zdGRsaWInIGNvbmZpZyBvcHRpb24sCisgIC8vLyB3aGljaCBhY2NlcHRzIHRoZSB2YWx1ZXMgInRydWUiIGFuZCAiZmFsc2UiLgorICBib29sIHNob3VsZFN1cHByZXNzRnJvbUNYWFN0YW5kYXJkTGlicmFyeSgpOworCisgIC8vLyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBkaWFnbm9zdGljIHJlcG9ydCBzaG91bGQgYmUgYWx3YXlzIHJlcG9ydGVkCisgIC8vLyBpbiB0aGUgbWFpbiBzb3VyY2UgZmlsZSBhbmQgbm90IHRoZSBoZWFkZXJzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgY29udHJvbGxlZCBieSB0aGUgJ3JlcG9ydC1pbi1tYWluLXNvdXJjZS1maWxlJyBjb25maWcgb3B0aW9uLAorICAvLy8gd2hpY2ggYWNjZXB0cyB0aGUgdmFsdWVzICJ0cnVlIiBhbmQgImZhbHNlIi4KKyAgYm9vbCBzaG91bGRSZXBvcnRJc3N1ZXNJbk1haW5Tb3VyY2VGaWxlKCk7CisKKyAgLy8vIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHJlcG9ydCBmaWxlbmFtZSBzaG91bGQgYmUgcmFuZG9tIG9yIG5vdC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGNvbnRyb2xsZWQgYnkgdGhlICdzdGFibGUtcmVwb3J0LWZpbGVuYW1lJyBjb25maWcgb3B0aW9uLAorICAvLy8gd2hpY2ggYWNjZXB0cyB0aGUgdmFsdWVzICJ0cnVlIiBhbmQgImZhbHNlIi4gRGVmYXVsdCA9IGZhbHNlCisgIGJvb2wgc2hvdWxkV3JpdGVTdGFibGVSZXBvcnRGaWxlbmFtZSgpOworCisgIC8vLyBccmV0dXJuIFdoZXRoZXIgdGhlIGFuYWx5emVyIHNob3VsZAorICAvLy8gc2VyaWFsaXplIHN0YXRpc3RpY3MgdG8gcGxpc3Qgb3V0cHV0LgorICAvLy8gU3RhdGlzdGljcyB3b3VsZCBiZSBzZXJpYWxpemVkIGluIEpTT04gZm9ybWF0IGluc2lkZSB0aGUgbWFpbiBkaWN0aW9uYXJ5CisgIC8vLyB1bmRlciB0aGUgXGMgc3RhdGlzdGljcyBrZXkuCisgIC8vLyBBdmFpbGFibGUgb25seSBpZiBjb21waWxlZCBpbiBhc3NlcnQgbW9kZSBvciB3aXRoIExMVk0gc3RhdGlzdGljcworICAvLy8gZXhwbGljaXRseSBlbmFibGVkLgorICBib29sIHNob3VsZFNlcmlhbGl6ZVN0YXRzKCk7CisKKyAgLy8vIFJldHVybnMgd2hldGhlciBpcnJlbGV2YW50IHBhcnRzIG9mIGEgYnVnIHJlcG9ydCBwYXRoIHNob3VsZCBiZSBwcnVuZWQKKyAgLy8vIG91dCBvZiB0aGUgZmluYWwgb3V0cHV0LgorICAvLy8KKyAgLy8vIFRoaXMgaXMgY29udHJvbGxlZCBieSB0aGUgJ3BydW5lLXBhdGhzJyBjb25maWcgb3B0aW9uLCB3aGljaCBhY2NlcHRzIHRoZQorICAvLy8gdmFsdWVzICJ0cnVlIiBhbmQgImZhbHNlIi4KKyAgYm9vbCBzaG91bGRQcnVuZVBhdGhzKCk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiAnc3RhdGljJyBpbml0aWFsaXplcnMgc2hvdWxkIGJlIGluIGNvbmRpdGlvbmFsIGxvZ2ljCisgIC8vLyBpbiB0aGUgQ0ZHLgorICBib29sIHNob3VsZENvbmRpdGlvbmFsaXplU3RhdGljSW5pdGlhbGl6ZXJzKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZnVuY3Rpb25zIChpbiBiYXNpYyBibG9ja3MpLCB3aGljaCBzaG91bGQgYmUKKyAgLy8gY29uc2lkZXJlZCB0byBiZSBzbWFsbCBlbm91Z2ggdG8gYWx3YXlzIGlubGluZS4KKyAgLy8KKyAgLy8gVGhpcyBpcyBjb250cm9sbGVkIGJ5ICJpcGEtYWx3YXlzLWlubGluZS1zaXplIiBhbmFseXplci1jb25maWcgb3B0aW9uLgorICB1bnNpZ25lZCBnZXRBbHdheXNJbmxpbmVTaXplKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgYm91bmQgb24gdGhlIG51bWJlciBvZiBiYXNpYyBibG9ja3MgaW4gYW4gaW5saW5lZCBmdW5jdGlvbgorICAvLyAoNTAgYnkgZGVmYXVsdCkuCisgIC8vCisgIC8vIFRoaXMgaXMgY29udHJvbGxlZCBieSAiLWFuYWx5emVyLWNvbmZpZyBtYXgtaW5saW5hYmxlLXNpemUiIG9wdGlvbi4KKyAgdW5zaWduZWQgZ2V0TWF4SW5saW5hYmxlU2l6ZSgpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGFuYWx5emVyIGVuZ2luZSBzaG91bGQgc3ludGhlc2l6ZSBmYWtlIGJvZGllcworICAvLy8gZm9yIHdlbGwta25vd24gZnVuY3Rpb25zLgorICBib29sIHNob3VsZFN5bnRoZXNpemVCb2RpZXMoKTsKKworICAvLy8gUmV0dXJucyBob3cgb2Z0ZW4gbm9kZXMgaW4gdGhlIEV4cGxvZGVkR3JhcGggc2hvdWxkIGJlIHJlY3ljbGVkIHRvIHNhdmUKKyAgLy8vIG1lbW9yeS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGNvbnRyb2xsZWQgYnkgdGhlICdncmFwaC10cmltLWludGVydmFsJyBjb25maWcgb3B0aW9uLiBUbyBkaXNhYmxlCisgIC8vLyBub2RlIHJlY2xhbWF0aW9uLCBzZXQgdGhlIG9wdGlvbiB0byAiMCIuCisgIHVuc2lnbmVkIGdldEdyYXBoVHJpbUludGVydmFsKCk7CisKKyAgLy8vIFJldHVybnMgdGhlIG1heGltdW0gdGltZXMgYSBsYXJnZSBmdW5jdGlvbiBjb3VsZCBiZSBpbmxpbmVkLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgY29udHJvbGxlZCBieSB0aGUgJ21heC10aW1lcy1pbmxpbmUtbGFyZ2UnIGNvbmZpZyBvcHRpb24uCisgIHVuc2lnbmVkIGdldE1heFRpbWVzSW5saW5lTGFyZ2UoKTsKKworICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJhc2ljIGJsb2NrcyBhIGZ1bmN0aW9uIG5lZWRzIHRvIGhhdmUgdG8gYmUKKyAgLy8vIGNvbnNpZGVyZWQgbGFyZ2UgZm9yIHRoZSAnbWF4LXRpbWVzLWlubGluZS1sYXJnZScgY29uZmlnIG9wdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGNvbnRyb2xsZWQgYnkgdGhlICdtaW4tY2ZnLXNpemUtdHJlYXQtZnVuY3Rpb25zLWFzLWxhcmdlJyBjb25maWcKKyAgLy8vIG9wdGlvbi4KKyAgdW5zaWduZWQgZ2V0TWluQ0ZHU2l6ZVRyZWF0RnVuY3Rpb25zQXNMYXJnZSgpOworCisgIC8vLyBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBub2RlcyB0aGUgYW5hbHl6ZXIgY2FuIGdlbmVyYXRlIHdoaWxlCisgIC8vLyBleHBsb3JpbmcgYSB0b3AgbGV2ZWwgZnVuY3Rpb24gKGZvciBlYWNoIGV4cGxvZGVkIGdyYXBoKS4KKyAgLy8vIDE1MDAwMCBpcyBkZWZhdWx0OyAwIG1lYW5zIG5vIGxpbWl0LgorICAvLy8KKyAgLy8vIFRoaXMgaXMgY29udHJvbGxlZCBieSB0aGUgJ21heC1ub2RlcycgY29uZmlnIG9wdGlvbi4KKyAgdW5zaWduZWQgZ2V0TWF4Tm9kZXNQZXJUb3BMZXZlbEZ1bmN0aW9uKCk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBsYW1iZGFzIHNob3VsZCBiZSBpbmxpbmVkLiBPdGhlcndpc2UgYSBzaW5rIG5vZGUgd2lsbCBiZQorICAvLy8gZ2VuZXJhdGVkIGVhY2ggdGltZSBhIExhbWJkYUV4cHIgaXMgdmlzaXRlZC4KKyAgYm9vbCBzaG91bGRJbmxpbmVMYW1iZGFzKCk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgYW5hbHlzaXMgc2hvdWxkIHRyeSB0byB3aWRlbiBsb29wcy4KKyAgLy8vIFRoaXMgaXMgY29udHJvbGxlZCBieSB0aGUgJ3dpZGVuLWxvb3BzJyBjb25maWcgb3B0aW9uLgorICBib29sIHNob3VsZFdpZGVuTG9vcHMoKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBhbmFseXNpcyBzaG91bGQgdHJ5IHRvIHVucm9sbCBsb29wcyB3aXRoIGtub3duIGJvdW5kcy4KKyAgLy8vIFRoaXMgaXMgY29udHJvbGxlZCBieSB0aGUgJ3Vucm9sbC1sb29wcycgY29uZmlnIG9wdGlvbi4KKyAgYm9vbCBzaG91bGRVbnJvbGxMb29wcygpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGJ1ZyByZXBvcnRlciBzaG91bGQgdHJhbnNwYXJlbnRseSB0cmVhdCBleHRyYSBub3RlCisgIC8vLyBkaWFnbm9zdGljIHBpZWNlcyBhcyBldmVudCBkaWFnbm9zdGljIHBpZWNlcy4gVXNlZnVsIHdoZW4gdGhlIGRpYWdub3N0aWMKKyAgLy8vIGNvbnN1bWVyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZXh0cmEgbm90ZSBwaWVjZXMuCisgIC8vLworICAvLy8gVGhpcyBpcyBjb250cm9sbGVkIGJ5IHRoZSAnZXh0cmEtbm90ZXMtYXMtZXZlbnRzJyBvcHRpb24sIHdoaWNoIGRlZmF1bHRzCisgIC8vLyB0byBmYWxzZSB3aGVuIHVuc2V0LgorICBib29sIHNob3VsZERpc3BsYXlOb3Rlc0FzRXZlbnRzKCk7CisKKyAgLy8vIFJldHVybnMgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBDVFUgcmVsYXRlZCBmaWxlcy4KKyAgU3RyaW5nUmVmIGdldENUVURpcigpOworCisgIC8vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIENUVSBpbmRleCBvZiBmdW5jdGlvbnMuCisgIFN0cmluZ1JlZiBnZXRDVFVJbmRleE5hbWUoKTsKKworICAvLy8gUmV0dXJucyB0cnVlIHdoZW4gbmFpdmUgY3Jvc3MgdHJhbnNsYXRpb24gdW5pdCBhbmFseXNpcyBpcyBlbmFibGVkLgorICAvLy8gVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSB0byBpbmxpbmUgZnVuY3Rpb25zIGZyb20gYW5vdGhlcgorICAvLy8gdHJhbnNsYXRpb24gdW5pdHMuCisgIGJvb2wgbmFpdmVDVFVFbmFibGVkKCk7Cit9OworICAKK3VzaW5nIEFuYWx5emVyT3B0aW9uc1JlZiA9IEludHJ1c2l2ZVJlZkNudFB0cjxBbmFseXplck9wdGlvbnM+OworICAKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfQU5BTFlaRVJPUFRJT05TX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQnVnUmVwb3J0ZXIvQnVnUmVwb3J0ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQnVnUmVwb3J0ZXIvQnVnUmVwb3J0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2E4OGQyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9CdWdSZXBvcnRlci5oCkBAIC0wLDAgKzEsNTkyIEBACisvLz09PS0gQnVnUmVwb3J0ZXIuaCAtIEdlbmVyYXRlIFBhdGhEaWFnbm9zdGljcyAtLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyBCdWdSZXBvcnRlciwgYSB1dGlsaXR5IGNsYXNzIGZvciBnZW5lcmF0aW5nCisvLyAgUGF0aERpYWdub3N0aWNzIGZvciBhbmFseXNlcyBiYXNlZCBvbiBQcm9ncmFtU3RhdGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfQlVHUkVQT1JURVJfQlVHUkVQT1JURVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfQlVHUkVQT1JURVJfQlVHUkVQT1JURVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9CdWdSZXBvcnRlclZpc2l0b3JzLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9QYXRoRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQ2hlY2tlck1hbmFnZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvUHJvZ3JhbVN0YXRlLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1NWYWxzLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N5bUV4cHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ltbXV0YWJsZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9ub2RlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFuYWx5emVyT3B0aW9uczsKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBEZWNsOworY2xhc3MgRGlhZ25vc3RpY3NFbmdpbmU7CitjbGFzcyBMb2NhdGlvbkNvbnRleHQ7CitjbGFzcyBTb3VyY2VNYW5hZ2VyOworY2xhc3MgU3RtdDsKKworbmFtZXNwYWNlIGVudG8geworCitjbGFzcyBCdWdUeXBlOworY2xhc3MgQ2hlY2tlckJhc2U7CitjbGFzcyBFeHBsb2RlZEdyYXBoOworY2xhc3MgRXhwbG9kZWROb2RlOworY2xhc3MgRXhwckVuZ2luZTsKK2NsYXNzIE1lbVJlZ2lvbjsKK2NsYXNzIFNWYWxCdWlsZGVyOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW50ZXJmYWNlIGZvciBpbmRpdmlkdWFsIGJ1ZyByZXBvcnRzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRocm91Z2ggd2hpY2ggY2hlY2tlcnMgY2FuIGNyZWF0ZQorLy8vIGluZGl2aWR1YWwgYnVnIHJlcG9ydHMuCitjbGFzcyBCdWdSZXBvcnQgOiBwdWJsaWMgbGx2bTo6aWxpc3Rfbm9kZTxCdWdSZXBvcnQ+IHsKK3B1YmxpYzogIAorICBjbGFzcyBOb2RlUmVzb2x2ZXIgeworICAgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworICBwdWJsaWM6CisgICAgdmlydHVhbCB+Tm9kZVJlc29sdmVyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBjb25zdCBFeHBsb2RlZE5vZGUqCisgICAgICAgICAgICBnZXRPcmlnaW5hbE5vZGUoY29uc3QgRXhwbG9kZWROb2RlICpOKSA9IDA7CisgIH07CisKKyAgdXNpbmcgcmFuZ2VzX2l0ZXJhdG9yID0gY29uc3QgU291cmNlUmFuZ2UgKjsKKyAgdXNpbmcgVmlzaXRvckxpc3QgPSBTbWFsbFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QnVnUmVwb3J0ZXJWaXNpdG9yPiwgOD47CisgIHVzaW5nIHZpc2l0b3JfaXRlcmF0b3IgPSBWaXNpdG9yTGlzdDo6aXRlcmF0b3I7CisgIHVzaW5nIEV4dHJhVGV4dExpc3QgPSBTbWFsbFZlY3RvcjxTdHJpbmdSZWYsIDI+OworICB1c2luZyBOb3RlTGlzdCA9IFNtYWxsVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxQYXRoRGlhZ25vc3RpY05vdGVQaWVjZT4sIDQ+OworCitwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBCdWdSZXBvcnRFcXVpdkNsYXNzOworICBmcmllbmQgY2xhc3MgQnVnUmVwb3J0ZXI7CisKKyAgQnVnVHlwZSYgQlQ7CisgIGNvbnN0IERlY2wgKkRlY2xXaXRoSXNzdWUgPSBudWxscHRyOworICBzdGQ6OnN0cmluZyBTaG9ydERlc2NyaXB0aW9uOworICBzdGQ6OnN0cmluZyBEZXNjcmlwdGlvbjsKKyAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBMb2NhdGlvbjsKKyAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBVbmlxdWVpbmdMb2NhdGlvbjsKKyAgY29uc3QgRGVjbCAqVW5pcXVlaW5nRGVjbDsKKyAgCisgIGNvbnN0IEV4cGxvZGVkTm9kZSAqRXJyb3JOb2RlID0gbnVsbHB0cjsKKyAgU21hbGxWZWN0b3I8U291cmNlUmFuZ2UsIDQ+IFJhbmdlczsKKyAgRXh0cmFUZXh0TGlzdCBFeHRyYVRleHQ7CisgIE5vdGVMaXN0IE5vdGVzOworCisgIHVzaW5nIFN5bWJvbHMgPSBsbHZtOjpEZW5zZVNldDxTeW1ib2xSZWY+OworICB1c2luZyBSZWdpb25zID0gbGx2bTo6RGVuc2VTZXQ8Y29uc3QgTWVtUmVnaW9uICo+OworCisgIC8vLyBBIChzdGFjayBvZikgYSBzZXQgb2Ygc3ltYm9scyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhpcworICAvLy8gcmVwb3J0IGFzIGJlaW5nICJpbnRlcmVzdGluZyIsIGFuZCB0aHVzIHVzZWQgdG8gaGVscCBkZWNpZGUgd2hpY2gKKyAgLy8vIGRpYWdub3N0aWNzIHRvIGluY2x1ZGUgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGZpbmFsIHBhdGggZGlhZ25vc3RpYy4KKyAgLy8vIFRoZSBzdGFjayBpcyBsYXJnZWx5IHVzZWQgYnkgQnVnUmVwb3J0ZXIgd2hlbiBnZW5lcmF0aW5nIFBhdGhEaWFnbm9zdGljcworICAvLy8gZm9yIG11bHRpcGxlIFBhdGhEaWFnbm9zdGljQ29uc3VtZXJzLgorICBTbWFsbFZlY3RvcjxTeW1ib2xzICosIDI+IGludGVyZXN0aW5nU3ltYm9sczsKKworICAvLy8gQSAoc3RhY2sgb2YpIHNldCBvZiByZWdpb25zIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHJlcG9ydCBhcyBiZWluZworICAvLy8gImludGVyZXN0aW5nIiwgYW5kIHRodXMgdXNlZCB0byBoZWxwIGRlY2lkZSB3aGljaCBkaWFnbm9zdGljcworICAvLy8gdG8gaW5jbHVkZSB3aGVuIGNvbnN0cnVjdGluZyB0aGUgZmluYWwgcGF0aCBkaWFnbm9zdGljLgorICAvLy8gVGhlIHN0YWNrIGlzIGxhcmdlbHkgdXNlZCBieSBCdWdSZXBvcnRlciB3aGVuIGdlbmVyYXRpbmcgUGF0aERpYWdub3N0aWNzCisgIC8vLyBmb3IgbXVsdGlwbGUgUGF0aERpYWdub3N0aWNDb25zdW1lcnMuCisgIFNtYWxsVmVjdG9yPFJlZ2lvbnMgKiwgMj4gaW50ZXJlc3RpbmdSZWdpb25zOworCisgIC8vLyBBIHNldCBvZiBsb2NhdGlvbiBjb250ZXh0cyB0aGF0IGNvcnJlc3BvaW5kIHRvIGNhbGwgc2l0ZXMgd2hpY2ggc2hvdWxkIGJlCisgIC8vLyBjb25zaWRlcmVkICJpbnRlcmVzdGluZyIuCisgIGxsdm06OlNtYWxsU2V0PGNvbnN0IExvY2F0aW9uQ29udGV4dCAqLCAyPiBJbnRlcmVzdGluZ0xvY2F0aW9uQ29udGV4dHM7CisKKyAgLy8vIEEgc2V0IG9mIGN1c3RvbSB2aXNpdG9ycyB3aGljaCBnZW5lcmF0ZSAiZXZlbnQiIGRpYWdub3N0aWNzIGF0CisgIC8vLyBpbnRlcmVzdGluZyBwb2ludHMgaW4gdGhlIHBhdGguCisgIFZpc2l0b3JMaXN0IENhbGxiYWNrczsKKworICAvLy8gVXNlZCBmb3IgZW5zdXJpbmcgdGhlIHZpc2l0b3JzIGFyZSBvbmx5IGFkZGVkIG9uY2UuCisgIGxsdm06OkZvbGRpbmdTZXQ8QnVnUmVwb3J0ZXJWaXNpdG9yPiBDYWxsYmFja3NTZXQ7CisKKyAgLy8vIFVzZWQgZm9yIGNsaWVudHMgdG8gdGVsbCBpZiB0aGUgcmVwb3J0J3MgY29uZmlndXJhdGlvbiBoYXMgY2hhbmdlZAorICAvLy8gc2luY2UgdGhlIGxhc3QgdGltZSB0aGV5IGNoZWNrZWQuCisgIHVuc2lnbmVkIENvbmZpZ3VyYXRpb25DaGFuZ2VUb2tlbiA9IDA7CisgIAorICAvLy8gV2hlbiBzZXQsIHRoaXMgZmxhZyBkaXNhYmxlcyBhbGwgY2FsbHN0YWNrIHBydW5pbmcgZnJvbSBhIGRpYWdub3N0aWMKKyAgLy8vIHBhdGguICBUaGlzIGlzIHVzZWZ1bCBmb3Igc29tZSByZXBvcnRzIHRoYXQgd2FudCBtYXhpbXVtIGZpZGVsdHkKKyAgLy8vIHdoZW4gcmVwb3J0aW5nIGFuIGlzc3VlLgorICBib29sIERvTm90UHJ1bmVQYXRoID0gZmFsc2U7CisKKyAgLy8vIFVzZWQgdG8gdHJhY2sgdW5pcXVlIHJlYXNvbnMgd2h5IGEgYnVnIHJlcG9ydCBtaWdodCBiZSBpbnZhbGlkLgorICAvLy8KKyAgLy8vIFxzYSBtYXJrSW52YWxpZAorICAvLy8gXHNhIHJlbW92ZUludmFsaWRhdGlvbgorICB1c2luZyBJbnZhbGlkYXRpb25SZWNvcmQgPSBzdGQ6OnBhaXI8Y29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICo+OworCisgIC8vLyBJZiBub24tZW1wdHksIHRoaXMgYnVnIHJlcG9ydCBpcyBsaWtlbHkgYSBmYWxzZSBwb3NpdGl2ZSBhbmQgc2hvdWxkIG5vdCBiZQorICAvLy8gc2hvd24gdG8gdGhlIHVzZXIuCisgIC8vLworICAvLy8gXHNhIG1hcmtJbnZhbGlkCisgIC8vLyBcc2EgcmVtb3ZlSW52YWxpZGF0aW9uCisgIGxsdm06OlNtYWxsU2V0PEludmFsaWRhdGlvblJlY29yZCwgND4gSW52YWxpZGF0aW9uczsKKworcHJpdmF0ZToKKyAgLy8gVXNlZCBpbnRlcm5hbGx5IGJ5IEJ1Z1JlcG9ydGVyLgorICBTeW1ib2xzICZnZXRJbnRlcmVzdGluZ1N5bWJvbHMoKTsKKyAgUmVnaW9ucyAmZ2V0SW50ZXJlc3RpbmdSZWdpb25zKCk7CisKKyAgdm9pZCBsYXp5SW5pdGlhbGl6ZUludGVyZXN0aW5nU2V0cygpOworICB2b2lkIHB1c2hJbnRlcmVzdGluZ1N5bWJvbHNBbmRSZWdpb25zKCk7CisgIHZvaWQgcG9wSW50ZXJlc3RpbmdTeW1ib2xzQW5kUmVnaW9ucygpOworCitwdWJsaWM6CisgIEJ1Z1JlcG9ydChCdWdUeXBlJiBidCwgU3RyaW5nUmVmIGRlc2MsIGNvbnN0IEV4cGxvZGVkTm9kZSAqZXJyb3Jub2RlKQorICAgICAgOiBCVChidCksIERlc2NyaXB0aW9uKGRlc2MpLCBFcnJvck5vZGUoZXJyb3Jub2RlKSB7fQorCisgIEJ1Z1JlcG9ydChCdWdUeXBlJiBidCwgU3RyaW5nUmVmIHNob3J0RGVzYywgU3RyaW5nUmVmIGRlc2MsCisgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGUgKmVycm9ybm9kZSkKKyAgICAgIDogQlQoYnQpLCBTaG9ydERlc2NyaXB0aW9uKHNob3J0RGVzYyksIERlc2NyaXB0aW9uKGRlc2MpLAorICAgICAgICBFcnJvck5vZGUoZXJyb3Jub2RlKSB7fQorCisgIEJ1Z1JlcG9ydChCdWdUeXBlICZidCwgU3RyaW5nUmVmIGRlc2MsIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gbCkKKyAgICAgIDogQlQoYnQpLCBEZXNjcmlwdGlvbihkZXNjKSwgTG9jYXRpb24obCkge30KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIEJ1Z1JlcG9ydCB3aXRoIGEgY3VzdG9tIHVuaXF1ZWluZyBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBUaGUgcmVwb3J0cyB0aGF0IGhhdmUgdGhlIHNhbWUgcmVwb3J0IGxvY2F0aW9uLCBkZXNjcmlwdGlvbiwgYnVnIHR5cGUsIGFuZAorICAvLy8gcmFuZ2VzIGFyZSB1bmlxdWVkIC0gb25seSBvbmUgb2YgdGhlIGVxdWl2YWxlbnQgcmVwb3J0cyB3aWxsIGJlIHByZXNlbnRlZAorICAvLy8gdG8gdGhlIHVzZXIuIFRoaXMgbWV0aG9kIGFsbG93cyB0byByZXN0IHRoZSBsb2NhdGlvbiB3aGljaCBzaG91bGQgYmUgdXNlZAorICAvLy8gZm9yIHVuaXF1aW5nIHJlcG9ydHMuIEZvciBleGFtcGxlLCBtZW1vcnkgbGVha3MgY2hlY2tlciwgY291bGQgc2V0IHRoaXMgdG8KKyAgLy8vIHRoZSBhbGxvY2F0aW9uIHNpdGUsIHJhdGhlciB0aGVuIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgYnVnIGlzIHJlcG9ydGVkLgorICBCdWdSZXBvcnQoQnVnVHlwZSYgYnQsIFN0cmluZ1JlZiBkZXNjLCBjb25zdCBFeHBsb2RlZE5vZGUgKmVycm9ybm9kZSwKKyAgICAgICAgICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gTG9jYXRpb25Ub1VuaXF1ZSwgY29uc3QgRGVjbCAqRGVjbFRvVW5pcXVlKQorICAgICAgOiBCVChidCksIERlc2NyaXB0aW9uKGRlc2MpLCBVbmlxdWVpbmdMb2NhdGlvbihMb2NhdGlvblRvVW5pcXVlKSwKKyAgICAgICAgVW5pcXVlaW5nRGVjbChEZWNsVG9VbmlxdWUpLCBFcnJvck5vZGUoZXJyb3Jub2RlKSB7fQorCisgIHZpcnR1YWwgfkJ1Z1JlcG9ydCgpOworCisgIGNvbnN0IEJ1Z1R5cGUmIGdldEJ1Z1R5cGUoKSBjb25zdCB7IHJldHVybiBCVDsgfQorICBCdWdUeXBlJiBnZXRCdWdUeXBlKCkgeyByZXR1cm4gQlQ7IH0KKworICAvLy8gXGJyaWVmIFRydWUgd2hlbiB0aGUgcmVwb3J0IGhhcyBhbiBleGVjdXRpb24gcGF0aCBhc3NvY2lhdGVkIHdpdGggaXQuCisgIC8vLworICAvLy8gQSByZXBvcnQgaXMgc2FpZCB0byBiZSBwYXRoLXNlbnNpdGl2ZSBpZiBpdCB3YXMgdGhyb3duIGFnYWluc3QgYQorICAvLy8gcGFydGljdWxhciBleHBsb2RlZCBub2RlIGluIHRoZSBwYXRoLXNlbnNpdGl2ZSBhbmFseXNpcyBncmFwaC4KKyAgLy8vIFBhdGgtc2Vuc2l0aXZlIHJlcG9ydHMgaGF2ZSB0aGVpciBpbnRlcm1lZGlhdGUgcGF0aCBkaWFnbm9zdGljcworICAvLy8gYXV0by1nZW5lcmF0ZWQsIHBlcmhhcHMgd2l0aCB0aGUgaGVscCBvZiBjaGVja2VyLWRlZmluZWQgdmlzaXRvcnMsCisgIC8vLyBhbmQgbWF5IGNvbnRhaW4gZXh0cmEgbm90ZXMuCisgIC8vLyBQYXRoLWluc2Vuc2l0aXZlIHJlcG9ydHMgY29uc2lzdCBvbmx5IG9mIGEgc2luZ2xlIHdhcm5pbmcgbWVzc2FnZQorICAvLy8gaW4gYSBzcGVjaWZpYyBsb2NhdGlvbiwgYW5kIHBlcmhhcHMgZXh0cmEgbm90ZXMuCisgIC8vLyBQYXRoLXNlbnNpdGl2ZSBjaGVja2VycyBhcmUgYWxsb3dlZCB0byB0aHJvdyBwYXRoLWluc2Vuc2l0aXZlIHJlcG9ydHMuCisgIGJvb2wgaXNQYXRoU2Vuc2l0aXZlKCkgY29uc3QgeyByZXR1cm4gRXJyb3JOb2RlICE9IG51bGxwdHI7IH0KKworICBjb25zdCBFeHBsb2RlZE5vZGUgKmdldEVycm9yTm9kZSgpIGNvbnN0IHsgcmV0dXJuIEVycm9yTm9kZTsgfQorCisgIFN0cmluZ1JlZiBnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsgcmV0dXJuIERlc2NyaXB0aW9uOyB9CisKKyAgU3RyaW5nUmVmIGdldFNob3J0RGVzY3JpcHRpb24oYm9vbCBVc2VGYWxsYmFjayA9IHRydWUpIGNvbnN0IHsKKyAgICBpZiAoU2hvcnREZXNjcmlwdGlvbi5lbXB0eSgpICYmIFVzZUZhbGxiYWNrKQorICAgICAgcmV0dXJuIERlc2NyaXB0aW9uOworICAgIHJldHVybiBTaG9ydERlc2NyaXB0aW9uOworICB9CisKKyAgLy8vIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhbnkgcGF0aCBwcnVuaW5nIHNob3VsZCB0YWtlIHBsYWNlCisgIC8vLyB3aGVuIGdlbmVyYXRpbmcgYSBQYXRoRGlhZ25vc3RpYyBmcm9tIHRoaXMgQnVnUmVwb3J0LgorICBib29sIHNob3VsZFBydW5lUGF0aCgpIGNvbnN0IHsgcmV0dXJuICFEb05vdFBydW5lUGF0aDsgfQorCisgIC8vLyBEaXNhYmxlIGFsbCBwYXRoIHBydW5pbmcgd2hlbiBnZW5lcmF0aW5nIGEgUGF0aERpYWdub3N0aWMuCisgIHZvaWQgZGlzYWJsZVBhdGhQcnVuaW5nKCkgeyBEb05vdFBydW5lUGF0aCA9IHRydWU7IH0KKyAgCisgIHZvaWQgbWFya0ludGVyZXN0aW5nKFN5bWJvbFJlZiBzeW0pOworICB2b2lkIG1hcmtJbnRlcmVzdGluZyhjb25zdCBNZW1SZWdpb24gKlIpOworICB2b2lkIG1hcmtJbnRlcmVzdGluZyhTVmFsIFYpOworICB2b2lkIG1hcmtJbnRlcmVzdGluZyhjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDKTsKKyAgCisgIGJvb2wgaXNJbnRlcmVzdGluZyhTeW1ib2xSZWYgc3ltKTsKKyAgYm9vbCBpc0ludGVyZXN0aW5nKGNvbnN0IE1lbVJlZ2lvbiAqUik7CisgIGJvb2wgaXNJbnRlcmVzdGluZyhTVmFsIFYpOworICBib29sIGlzSW50ZXJlc3RpbmcoY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQyk7CisKKyAgdW5zaWduZWQgZ2V0Q29uZmlndXJhdGlvbkNoYW5nZVRva2VuKCkgY29uc3QgeworICAgIHJldHVybiBDb25maWd1cmF0aW9uQ2hhbmdlVG9rZW47CisgIH0KKworICAvLy8gUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIHJlcG9ydCBzaG91bGQgYmUgY29uc2lkZXJlZCB2YWxpZC4KKyAgLy8vCisgIC8vLyBJbnZhbGlkIHJlcG9ydHMgYXJlIHRob3NlIHRoYXQgaGF2ZSBiZWVuIGNsYXNzaWZpZWQgYXMgbGlrZWx5IGZhbHNlCisgIC8vLyBwb3NpdGl2ZXMgYWZ0ZXIgdGhlIGZhY3QuCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW52YWxpZGF0aW9ucy5lbXB0eSgpOworICB9CisKKyAgLy8vIE1hcmtzIHRoZSBjdXJyZW50IHJlcG9ydCBhcyBpbnZhbGlkLCBtZWFuaW5nIHRoYXQgaXQgaXMgcHJvYmFibHkgYSBmYWxzZQorICAvLy8gcG9zaXRpdmUgYW5kIHNob3VsZCBub3QgYmUgcmVwb3J0ZWQgdG8gdGhlIHVzZXIuCisgIC8vLworICAvLy8gVGhlIFxwIFRhZyBhbmQgXHAgRGF0YSBhcmd1bWVudHMgYXJlIGludGVuZGVkIHRvIGJlIG9wYXF1ZSBpZGVudGlmaWVycyBmb3IKKyAgLy8vIHRoaXMgcGFydGljdWxhciBpbnZhbGlkYXRpb24sIHdoZXJlIFxwIFRhZyByZXByZXNlbnRzIHRoZSB2aXNpdG9yCisgIC8vLyByZXNwb25zaWJsZSBmb3IgaW52YWxpZGF0aW9uLCBhbmQgXHAgRGF0YSByZXByZXNlbnRzIHRoZSByZWFzb24gdGhpcworICAvLy8gdmlzaXRvciBkZWNpZGVkIHRvIGludmFsaWRhdGUgdGhlIGJ1ZyByZXBvcnQuCisgIC8vLworICAvLy8gXHNhIHJlbW92ZUludmFsaWRhdGlvbgorICB2b2lkIG1hcmtJbnZhbGlkKGNvbnN0IHZvaWQgKlRhZywgY29uc3Qgdm9pZCAqRGF0YSkgeworICAgIEludmFsaWRhdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFRhZywgRGF0YSkpOworICB9CisKKyAgLy8vIFJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIGEgcHJldmlvdXMgaW52YWxpZGF0aW9uLgorICAvLy8KKyAgLy8vIFxzYSBtYXJrSW52YWxpZAorICB2b2lkIHJlbW92ZUludmFsaWRhdGlvbihjb25zdCB2b2lkICpUYWcsIGNvbnN0IHZvaWQgKkRhdGEpIHsKKyAgICBJbnZhbGlkYXRpb25zLmVyYXNlKHN0ZDo6bWFrZV9wYWlyKFRhZywgRGF0YSkpOworICB9CisgIAorICAvLy8gUmV0dXJuIHRoZSBjYW5vbmljYWwgZGVjbGFyYXRpb24sIGJlIGl0IGEgbWV0aG9kIG9yIGNsYXNzLCB3aGVyZQorICAvLy8gdGhpcyBpc3N1ZSBzZW1hbnRpY2FsbHkgb2NjdXJyZWQuCisgIGNvbnN0IERlY2wgKmdldERlY2xXaXRoSXNzdWUoKSBjb25zdDsKKyAgCisgIC8vLyBTcGVjaWZpY2FsbHkgc2V0IHRoZSBEZWNsIHdoZXJlIGFuIGlzc3VlIG9jY3VycmVkLiAgVGhpcyBpc24ndCBuZWNlc3NhcnkKKyAgLy8vIGZvciBCdWdSZXBvcnRzIHRoYXQgY292ZXIgYSBwYXRoIGFzIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmZlcnJlZC4KKyAgdm9pZCBzZXREZWNsV2l0aElzc3VlKGNvbnN0IERlY2wgKmRlY2xXaXRoSXNzdWUpIHsKKyAgICBEZWNsV2l0aElzc3VlID0gZGVjbFdpdGhJc3N1ZTsKKyAgfQorCisgIC8vLyBBZGQgbmV3IGl0ZW0gdG8gdGhlIGxpc3Qgb2YgYWRkaXRpb25hbCBub3RlcyB0aGF0IG5lZWQgdG8gYmUgYXR0YWNoZWQgdG8KKyAgLy8vIHRoaXMgcGF0aC1pbnNlbnNpdGl2ZSByZXBvcnQuIElmIHlvdSB3YW50IHRvIGFkZCBleHRyYSBub3RlcyB0byBhCisgIC8vLyBwYXRoLXNlbnNpdGl2ZSByZXBvcnQsIHlvdSBuZWVkIHRvIHVzZSBhIEJ1Z1JlcG9ydGVyVmlzaXRvciBiZWNhdXNlIGl0CisgIC8vLyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgd2hlcmUgZXhhY3RseSBpbiB0aGUgYXV0by1nZW5lcmF0ZWQgcGF0aCBkaWFnbm9zdGljCisgIC8vLyB0aGUgZXh0cmEgbm90ZSBzaG91bGQgYXBwZWFyLgorICB2b2lkIGFkZE5vdGUoU3RyaW5nUmVmIE1zZywgY29uc3QgUGF0aERpYWdub3N0aWNMb2NhdGlvbiAmUG9zLAorICAgICAgICAgICAgICAgQXJyYXlSZWY8U291cmNlUmFuZ2U+IFJhbmdlcykgeworICAgIGF1dG8gUCA9IHN0ZDo6bWFrZV9zaGFyZWQ8UGF0aERpYWdub3N0aWNOb3RlUGllY2U+KFBvcywgTXNnKTsKKworICAgIGZvciAoY29uc3QgYXV0byAmUiA6IFJhbmdlcykKKyAgICAgIFAtPmFkZFJhbmdlKFIpOworCisgICAgTm90ZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShQKSk7CisgIH0KKworICAvLyBGSVhNRTogSW5zdGVhZCBvZiBtYWtpbmcgYW4gb3ZlcnJpZGUsIHdlIGNvdWxkIGhhdmUgZGVmYXVsdC1pbml0aWFsaXplZAorICAvLyBSYW5nZXMgd2l0aCB7fSwgaG93ZXZlciBpdCBjcmFzaGVzIHRoZSBNU1ZDIDIwMTMgY29tcGlsZXIuCisgIHZvaWQgYWRkTm90ZShTdHJpbmdSZWYgTXNnLCBjb25zdCBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uICZQb3MpIHsKKyAgICBzdGQ6OnZlY3RvcjxTb3VyY2VSYW5nZT4gUmFuZ2VzOworICAgIGFkZE5vdGUoTXNnLCBQb3MsIFJhbmdlcyk7CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IE5vdGVMaXN0ICZnZXROb3RlcygpIHsKKyAgICByZXR1cm4gTm90ZXM7CisgIH0KKworICAvLy8gXGJyaWVmIFRoaXMgYWxsb3dzIGZvciBhZGRpdGlvbiBvZiBtZXRhIGRhdGEgdG8gdGhlIGRpYWdub3N0aWMuCisgIC8vLworICAvLy8gQ3VycmVudGx5LCBvbmx5IHRoZSBIVE1MRGlhZ25vc3RpY0NsaWVudCBrbm93cyBob3cgdG8gZGlzcGxheSBpdC4gCisgIHZvaWQgYWRkRXh0cmFUZXh0KFN0cmluZ1JlZiBTKSB7CisgICAgRXh0cmFUZXh0LnB1c2hfYmFjayhTKTsKKyAgfQorCisgIHZpcnR1YWwgY29uc3QgRXh0cmFUZXh0TGlzdCAmZ2V0RXh0cmFUZXh0KCkgeworICAgIHJldHVybiBFeHRyYVRleHQ7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgImRlZmluaXRpdmUiIGxvY2F0aW9uIG9mIHRoZSByZXBvcnRlZCBidWcuCisgIC8vLworICAvLy8gIFdoaWxlIGEgYnVnIGNhbiBzcGFuIGFuIGVudGlyZSBwYXRoLCB1c3VhbGx5IHRoZXJlIGlzIGEgc3BlY2lmaWMKKyAgLy8vICBsb2NhdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHdoZXJlIHRoZSBrZXkgaXNzdWUgb2NjdXJyZWQuCisgIC8vLyAgVGhpcyBsb2NhdGlvbiBpcyB1c2VkIGJ5IGNsaWVudHMgcmVuZGVyaW5nIGRpYWdub3N0aWNzLgorICB2aXJ0dWFsIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gZ2V0TG9jYXRpb24oY29uc3QgU291cmNlTWFuYWdlciAmU00pIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBsb2NhdGlvbiBvbiB3aGljaCB0aGUgcmVwb3J0IHNob3VsZCBiZSB1bmlxdWVkLgorICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIGdldFVuaXF1ZWluZ0xvY2F0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBVbmlxdWVpbmdMb2NhdGlvbjsKKyAgfQorICAKKyAgLy8vIFxicmllZiBHZXQgdGhlIGRlY2xhcmF0aW9uIGNvbnRhaW5pbmcgdGhlIHVuaXF1ZWluZyBsb2NhdGlvbi4KKyAgY29uc3QgRGVjbCAqZ2V0VW5pcXVlaW5nRGVjbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVW5pcXVlaW5nRGVjbDsKKyAgfQorCisgIGNvbnN0IFN0bXQgKmdldFN0bXQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEFkZCBhIHJhbmdlIHRvIGEgYnVnIHJlcG9ydC4KKyAgLy8vCisgIC8vLyBSYW5nZXMgYXJlIHVzZWQgdG8gaGlnaGxpZ2h0IHJlZ2lvbnMgb2YgaW50ZXJlc3QgaW4gdGhlIHNvdXJjZSBjb2RlLgorICAvLy8gVGhleSBzaG91bGQgYmUgYXQgdGhlIHNhbWUgc291cmNlIGNvZGUgbGluZSBhcyB0aGUgQnVnUmVwb3J0IGxvY2F0aW9uLgorICAvLy8gQnkgZGVmYXVsdCwgdGhlIHNvdXJjZSByYW5nZSBvZiB0aGUgc3RhdGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVycm9yCisgIC8vLyBub2RlIHdpbGwgYmUgdXNlZDsgYWRkIGEgc2luZ2xlIGludmFsaWQgcmFuZ2UgdG8gc3BlY2lmeSBhYnNlbmNlIG9mCisgIC8vLyByYW5nZXMuCisgIHZvaWQgYWRkUmFuZ2UoU291cmNlUmFuZ2UgUikgeworICAgIGFzc2VydCgoUi5pc1ZhbGlkKCkgfHwgUmFuZ2VzLmVtcHR5KCkpICYmICJJbnZhbGlkIHJhbmdlIGNhbiBvbmx5IGJlIHVzZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIHNwZWNpZnkgdGhhdCB0aGUgcmVwb3J0IGRvZXMgbm90IGhhdmUgYSByYW5nZS4iKTsKKyAgICBSYW5nZXMucHVzaF9iYWNrKFIpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIFNvdXJjZVJhbmdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcG9ydC4KKyAgdmlydHVhbCBsbHZtOjppdGVyYXRvcl9yYW5nZTxyYW5nZXNfaXRlcmF0b3I+IGdldFJhbmdlcygpOworCisgIC8vLyBcYnJpZWYgQWRkIGN1c3RvbSBvciBwcmVkZWZpbmVkIGJ1ZyByZXBvcnQgdmlzaXRvcnMgdG8gdGhpcyByZXBvcnQuCisgIC8vLworICAvLy8gVGhlIHZpc2l0b3JzIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIGRlZmF1bHQgdHJhY2UgaXMgbm90IHN1ZmZpY2llbnQuCisgIC8vLyBGb3IgZXhhbXBsZSwgdGhleSBhbGxvdyBjb25zdHJ1Y3RpbmcgYSBtb3JlIGVsYWJvcmF0ZSB0cmFjZS4KKyAgLy8vIFxzYSByZWdpc3RlckNvbmRpdGlvblZpc2l0b3IoKSwgcmVnaXN0ZXJUcmFja051bGxPclVuZGVmVmFsdWUoKSwKKyAgLy8vIHJlZ2lzdGVyRmluZExhc3RTdG9yZSgpLCByZWdpc3Rlck5pbFJlY2VpdmVyVmlzaXRvcigpLCBhbmQKKyAgLy8vIHJlZ2lzdGVyVmFyRGVjbHNMYXN0U3RvcmUoKS4KKyAgdm9pZCBhZGRWaXNpdG9yKHN0ZDo6dW5pcXVlX3B0cjxCdWdSZXBvcnRlclZpc2l0b3I+IHZpc2l0b3IpOworCisgIC8vLyBJdGVyYXRvcnMgdGhyb3VnaCB0aGUgY3VzdG9tIGRpYWdub3N0aWMgdmlzaXRvcnMuCisgIHZpc2l0b3JfaXRlcmF0b3IgdmlzaXRvcl9iZWdpbigpIHsgcmV0dXJuIENhbGxiYWNrcy5iZWdpbigpOyB9CisgIHZpc2l0b3JfaXRlcmF0b3IgdmlzaXRvcl9lbmQoKSB7IHJldHVybiBDYWxsYmFja3MuZW5kKCk7IH0KKworICAvLy8gUHJvZmlsZSB0byBpZGVudGlmeSBlcXVpdmFsZW50IGJ1ZyByZXBvcnRzIGZvciBlcnJvciByZXBvcnQgY29hbGVzY2luZy4KKyAgLy8vIFJlcG9ydHMgYXJlIHVuaXF1ZWQgdG8gZW5zdXJlIHRoYXQgd2UgZG8gbm90IGVtaXQgbXVsdGlwbGUgZGlhZ25vc3RpY3MKKyAgLy8vIGZvciBlYWNoIGJ1Zy4KKyAgdmlydHVhbCB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgaGFzaCkgY29uc3Q7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQnVnVHlwZXMgKGNvbGxlY3Rpb25zIG9mIHJlbGF0ZWQgcmVwb3J0cykuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBCdWdSZXBvcnRFcXVpdkNsYXNzIDogcHVibGljIGxsdm06OkZvbGRpbmdTZXROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIEJ1Z1JlcG9ydGVyOworCisgIC8vLyBMaXN0IG9mICpvd25lZCogQnVnUmVwb3J0IG9iamVjdHMuCisgIGxsdm06OmlsaXN0PEJ1Z1JlcG9ydD4gUmVwb3J0czsKKworICB2b2lkIEFkZFJlcG9ydChzdGQ6OnVuaXF1ZV9wdHI8QnVnUmVwb3J0PiBSKSB7CisgICAgUmVwb3J0cy5wdXNoX2JhY2soUi5yZWxlYXNlKCkpOworICB9CisKK3B1YmxpYzoKKyAgQnVnUmVwb3J0RXF1aXZDbGFzcyhzdGQ6OnVuaXF1ZV9wdHI8QnVnUmVwb3J0PiBSKSB7IEFkZFJlcG9ydChzdGQ6Om1vdmUoUikpOyB9CisgIH5CdWdSZXBvcnRFcXVpdkNsYXNzKCk7CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdCB7CisgICAgYXNzZXJ0KCFSZXBvcnRzLmVtcHR5KCkpOworICAgIFJlcG9ydHMuZnJvbnQoKS5Qcm9maWxlKElEKTsKKyAgfQorCisgIHVzaW5nIGl0ZXJhdG9yID0gbGx2bTo6aWxpc3Q8QnVnUmVwb3J0Pjo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gbGx2bTo6aWxpc3Q8QnVnUmVwb3J0Pjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBSZXBvcnRzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gUmVwb3J0cy5lbmQoKTsgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gUmVwb3J0cy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFJlcG9ydHMuZW5kKCk7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBCdWdSZXBvcnRlciBhbmQgZnJpZW5kcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIEJ1Z1JlcG9ydGVyRGF0YSB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkJ1Z1JlcG9ydGVyRGF0YSgpOworCisgIHZpcnR1YWwgRGlhZ25vc3RpY3NFbmdpbmUmIGdldERpYWdub3N0aWMoKSA9IDA7CisgIHZpcnR1YWwgQXJyYXlSZWY8UGF0aERpYWdub3N0aWNDb25zdW1lcio+IGdldFBhdGhEaWFnbm9zdGljQ29uc3VtZXJzKCkgPSAwOworICB2aXJ0dWFsIEFTVENvbnRleHQgJmdldEFTVENvbnRleHQoKSA9IDA7CisgIHZpcnR1YWwgU291cmNlTWFuYWdlciAmZ2V0U291cmNlTWFuYWdlcigpID0gMDsKKyAgdmlydHVhbCBBbmFseXplck9wdGlvbnMgJmdldEFuYWx5emVyT3B0aW9ucygpID0gMDsKK307CisKKy8vLyBCdWdSZXBvcnRlciBpcyBhIHV0aWxpdHkgY2xhc3MgZm9yIGdlbmVyYXRpbmcgUGF0aERpYWdub3N0aWNzIGZvciBhbmFseXNpcy4KKy8vLyBJdCBjb2xsZWN0cyB0aGUgQnVnUmVwb3J0cyBhbmQgQnVnVHlwZXMgYW5kIGtub3dzIGhvdyB0byBnZW5lcmF0ZQorLy8vIGFuZCBmbHVzaCB0aGUgY29ycmVzcG9uZGluZyBkaWFnbm9zdGljcy4KK2NsYXNzIEJ1Z1JlcG9ydGVyIHsKK3B1YmxpYzoKKyAgZW51bSBLaW5kIHsgQmFzZUJSS2luZCwgR1JCdWdSZXBvcnRlcktpbmQgfTsKKworcHJpdmF0ZToKKyAgdXNpbmcgQnVnVHlwZXNUeSA9IGxsdm06OkltbXV0YWJsZVNldDxCdWdUeXBlICo+OworCisgIEJ1Z1R5cGVzVHk6OkZhY3RvcnkgRjsKKyAgQnVnVHlwZXNUeSBCdWdUeXBlczsKKworICBjb25zdCBLaW5kIGtpbmQ7CisgIEJ1Z1JlcG9ydGVyRGF0YSYgRDsKKworICAvLy8gR2VuZXJhdGUgYW5kIGZsdXNoIHRoZSBkaWFnbm9zdGljcyBmb3IgdGhlIGdpdmVuIGJ1ZyByZXBvcnQuCisgIHZvaWQgRmx1c2hSZXBvcnQoQnVnUmVwb3J0RXF1aXZDbGFzcyYgRVEpOworCisgIC8vLyBHZW5lcmF0ZSBhbmQgZmx1c2ggdGhlIGRpYWdub3N0aWNzIGZvciB0aGUgZ2l2ZW4gYnVnIHJlcG9ydAorICAvLy8gYW5kIFBhdGhEaWFnbm9zdGljQ29uc3VtZXIuCisgIHZvaWQgRmx1c2hSZXBvcnQoQnVnUmVwb3J0ICpleGFtcGxlUmVwb3J0LAorICAgICAgICAgICAgICAgICAgIFBhdGhEaWFnbm9zdGljQ29uc3VtZXIgJlBELAorICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEJ1Z1JlcG9ydCo+IEJ1Z1JlcG9ydHMpOworCisgIC8vLyBUaGUgc2V0IG9mIGJ1ZyByZXBvcnRzIHRyYWNrZWQgYnkgdGhlIEJ1Z1JlcG9ydGVyLgorICBsbHZtOjpGb2xkaW5nU2V0PEJ1Z1JlcG9ydEVxdWl2Q2xhc3M+IEVRQ2xhc3NlczsKKworICAvLy8gQSB2ZWN0b3Igb2YgQnVnUmVwb3J0cyBmb3IgdHJhY2tpbmcgdGhlIGFsbG9jYXRlZCBwb2ludGVycyBhbmQgY2xlYW51cC4KKyAgc3RkOjp2ZWN0b3I8QnVnUmVwb3J0RXF1aXZDbGFzcyAqPiBFUUNsYXNzZXNWZWN0b3I7CisKK3Byb3RlY3RlZDoKKyAgQnVnUmVwb3J0ZXIoQnVnUmVwb3J0ZXJEYXRhJiBkLCBLaW5kIGspCisgICAgICA6IEJ1Z1R5cGVzKEYuZ2V0RW1wdHlTZXQoKSksIGtpbmQoayksIEQoZCkge30KKworcHVibGljOgorICBCdWdSZXBvcnRlcihCdWdSZXBvcnRlckRhdGEmIGQpCisgICAgICA6IEJ1Z1R5cGVzKEYuZ2V0RW1wdHlTZXQoKSksIGtpbmQoQmFzZUJSS2luZCksIEQoZCkge30KKyAgdmlydHVhbCB+QnVnUmVwb3J0ZXIoKTsKKworICAvLy8gXGJyaWVmIEdlbmVyYXRlIGFuZCBmbHVzaCBkaWFnbm9zdGljcyBmb3IgYWxsIGJ1ZyByZXBvcnRzLgorICB2b2lkIEZsdXNoUmVwb3J0cygpOworCisgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIGtpbmQ7IH0KKworICBEaWFnbm9zdGljc0VuZ2luZSYgZ2V0RGlhZ25vc3RpYygpIHsKKyAgICByZXR1cm4gRC5nZXREaWFnbm9zdGljKCk7CisgIH0KKworICBBcnJheVJlZjxQYXRoRGlhZ25vc3RpY0NvbnN1bWVyKj4gZ2V0UGF0aERpYWdub3N0aWNDb25zdW1lcnMoKSB7CisgICAgcmV0dXJuIEQuZ2V0UGF0aERpYWdub3N0aWNDb25zdW1lcnMoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSXRlcmF0b3Igb3ZlciB0aGUgc2V0IG9mIEJ1Z1R5cGVzIHRyYWNrZWQgYnkgdGhlIEJ1Z1JlcG9ydGVyLgorICB1c2luZyBpdGVyYXRvciA9IEJ1Z1R5cGVzVHk6Oml0ZXJhdG9yOworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIEJ1Z1R5cGVzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gQnVnVHlwZXMuZW5kKCk7IH0KKworICAvLy8gXGJyaWVmIEl0ZXJhdG9yIG92ZXIgdGhlIHNldCBvZiBCdWdSZXBvcnRzIHRyYWNrZWQgYnkgdGhlIEJ1Z1JlcG9ydGVyLgorICB1c2luZyBFUUNsYXNzZXNfaXRlcmF0b3IgPSBsbHZtOjpGb2xkaW5nU2V0PEJ1Z1JlcG9ydEVxdWl2Q2xhc3M+OjppdGVyYXRvcjsKKyAgRVFDbGFzc2VzX2l0ZXJhdG9yIEVRQ2xhc3Nlc19iZWdpbigpIHsgcmV0dXJuIEVRQ2xhc3Nlcy5iZWdpbigpOyB9CisgIEVRQ2xhc3Nlc19pdGVyYXRvciBFUUNsYXNzZXNfZW5kKCkgeyByZXR1cm4gRVFDbGFzc2VzLmVuZCgpOyB9CisKKyAgQVNUQ29udGV4dCAmZ2V0Q29udGV4dCgpIHsgcmV0dXJuIEQuZ2V0QVNUQ29udGV4dCgpOyB9CisKKyAgU291cmNlTWFuYWdlciAmZ2V0U291cmNlTWFuYWdlcigpIHsgcmV0dXJuIEQuZ2V0U291cmNlTWFuYWdlcigpOyB9CisKKyAgQW5hbHl6ZXJPcHRpb25zICZnZXRBbmFseXplck9wdGlvbnMoKSB7IHJldHVybiBELmdldEFuYWx5emVyT3B0aW9ucygpOyB9CisKKyAgdmlydHVhbCBib29sIGdlbmVyYXRlUGF0aERpYWdub3N0aWMoUGF0aERpYWdub3N0aWMmIHBhdGhEaWFnbm9zdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoRGlhZ25vc3RpY0NvbnN1bWVyICZQQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8QnVnUmVwb3J0ICo+ICZidWdSZXBvcnRzKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2b2lkIFJlZ2lzdGVyKEJ1Z1R5cGUgKkJUKTsKKworICAvLy8gXGJyaWVmIEFkZCB0aGUgZ2l2ZW4gcmVwb3J0IHRvIHRoZSBzZXQgb2YgcmVwb3J0cyB0cmFja2VkIGJ5IEJ1Z1JlcG9ydGVyLgorICAvLy8KKyAgLy8vIFRoZSByZXBvcnRzIGFyZSB1c3VhbGx5IGdlbmVyYXRlZCBieSB0aGUgY2hlY2tlcnMuIEZ1cnRoZXIsIHRoZXkgYXJlCisgIC8vLyBmb2xkZWQgYmFzZWQgb24gdGhlIHByb2ZpbGUgdmFsdWUsIHdoaWNoIGlzIGRvbmUgdG8gY29hbGVzY2Ugc2ltaWxhcgorICAvLy8gcmVwb3J0cy4KKyAgdm9pZCBlbWl0UmVwb3J0KHN0ZDo6dW5pcXVlX3B0cjxCdWdSZXBvcnQ+IFIpOworCisgIHZvaWQgRW1pdEJhc2ljUmVwb3J0KGNvbnN0IERlY2wgKkRlY2xXaXRoSXNzdWUsIGNvbnN0IENoZWNrZXJCYXNlICpDaGVja2VyLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQnVnTmFtZSwgU3RyaW5nUmVmIEJ1Z0NhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQnVnU3RyLCBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U291cmNlUmFuZ2U+IFJhbmdlcyA9IE5vbmUpOworCisgIHZvaWQgRW1pdEJhc2ljUmVwb3J0KGNvbnN0IERlY2wgKkRlY2xXaXRoSXNzdWUsIENoZWNrTmFtZSBDaGVja05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBCdWdOYW1lLCBTdHJpbmdSZWYgQnVnQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBCdWdTdHIsIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTb3VyY2VSYW5nZT4gUmFuZ2VzID0gTm9uZSk7CisKK3ByaXZhdGU6CisgIGxsdm06OlN0cmluZ01hcDxCdWdUeXBlICo+IFN0ckJ1Z1R5cGVzOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhIEJ1Z1R5cGUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kCisgIC8vLyBjYXRlZ29yeS4KKyAgQnVnVHlwZSAqZ2V0QnVnVHlwZUZvck5hbWUoQ2hlY2tOYW1lIENoZWNrTmFtZSwgU3RyaW5nUmVmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBjYXRlZ29yeSk7Cit9OworCisvLyBGSVhNRTogR2V0IHJpZCBvZiBHUkJ1Z1JlcG9ydGVyLiAgSXQncyB0aGUgd3JvbmcgYWJzdHJhY3Rpb24uCitjbGFzcyBHUkJ1Z1JlcG9ydGVyIDogcHVibGljIEJ1Z1JlcG9ydGVyIHsKKyAgRXhwckVuZ2luZSYgRW5nOworCitwdWJsaWM6CisgIEdSQnVnUmVwb3J0ZXIoQnVnUmVwb3J0ZXJEYXRhJiBkLCBFeHByRW5naW5lJiBlbmcpCisgICAgICA6IEJ1Z1JlcG9ydGVyKGQsIEdSQnVnUmVwb3J0ZXJLaW5kKSwgRW5nKGVuZykge30KKworICB+R1JCdWdSZXBvcnRlcigpIG92ZXJyaWRlOworCisgIC8vLyBnZXRFbmdpbmUgLSBSZXR1cm4gdGhlIGFuYWx5c2lzIGVuZ2luZSB1c2VkIHRvIGFuYWx5emUgYSBnaXZlbgorICAvLy8gIGZ1bmN0aW9uIG9yIG1ldGhvZC4KKyAgRXhwckVuZ2luZSAmZ2V0RW5naW5lKCkgeyByZXR1cm4gRW5nOyB9CisKKyAgLy8vIGdldEdyYXBoIC0gR2V0IHRoZSBleHBsb2RlZCBncmFwaCBjcmVhdGVkIGJ5IHRoZSBhbmFseXNpcyBlbmdpbmUKKyAgLy8vICBmb3IgdGhlIGFuYWx5emVkIG1ldGhvZCBvciBmdW5jdGlvbi4KKyAgRXhwbG9kZWRHcmFwaCAmZ2V0R3JhcGgoKTsKKworICAvLy8gZ2V0U3RhdGVNYW5hZ2VyIC0gUmV0dXJuIHRoZSBzdGF0ZSBtYW5hZ2VyIHVzZWQgYnkgdGhlIGFuYWx5c2lzCisgIC8vLyAgZW5naW5lLgorICBQcm9ncmFtU3RhdGVNYW5hZ2VyICZnZXRTdGF0ZU1hbmFnZXIoKTsKKworICAvLy8gR2VuZXJhdGVzIGEgcGF0aCBjb3JyZXNwb25kaW5nIHRvIG9uZSBvZiB0aGUgZ2l2ZW4gYnVnIHJlcG9ydHMuCisgIC8vLworICAvLy8gV2hpY2ggcmVwb3J0IGlzIHVzZWQgZm9yIHBhdGggZ2VuZXJhdGlvbiBpcyBub3Qgc3BlY2lmaWVkLiBUaGUKKyAgLy8vIGJ1ZyByZXBvcnRlciB3aWxsIHRyeSB0byBwaWNrIHRoZSBzaG9ydGVzdCBwYXRoLCBidXQgdGhpcyBpcyBub3QKKyAgLy8vIGd1YXJhbnRlZWQuCisgIC8vLworICAvLy8gXHJldHVybiBUcnVlIGlmIHRoZSByZXBvcnQgd2FzIHZhbGlkIGFuZCBhIHBhdGggd2FzIGdlbmVyYXRlZCwKKyAgLy8vICAgICAgICAgZmFsc2UgaWYgdGhlIHJlcG9ydHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW52YWxpZC4KKyAgYm9vbCBnZW5lcmF0ZVBhdGhEaWFnbm9zdGljKFBhdGhEaWFnbm9zdGljICZQRCwgUGF0aERpYWdub3N0aWNDb25zdW1lciAmUEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxCdWdSZXBvcnQqPiAmYnVnUmVwb3J0cykgb3ZlcnJpZGU7CisKKyAgLy8vIGNsYXNzb2YgLSBVc2VkIGJ5IGlzYTw+LCBjYXN0PD4sIGFuZCBkeW5fY2FzdDw+LgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEJ1Z1JlcG9ydGVyKiBSKSB7CisgICAgcmV0dXJuIFItPmdldEtpbmQoKSA9PSBHUkJ1Z1JlcG9ydGVyS2luZDsKKyAgfQorfTsKKworY2xhc3MgQnVnUmVwb3J0ZXJDb250ZXh0IHsKKyAgR1JCdWdSZXBvcnRlciAmQlI7CisKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIEJ1Z1JlcG9ydGVyQ29udGV4dChHUkJ1Z1JlcG9ydGVyJiBicikgOiBCUihicikge30KKworICB2aXJ0dWFsIH5CdWdSZXBvcnRlckNvbnRleHQoKSA9IGRlZmF1bHQ7CisKKyAgR1JCdWdSZXBvcnRlciYgZ2V0QnVnUmVwb3J0ZXIoKSB7IHJldHVybiBCUjsgfQorCisgIEV4cGxvZGVkR3JhcGggJmdldEdyYXBoKCkgeyByZXR1cm4gQlIuZ2V0R3JhcGgoKTsgfQorCisgIFByb2dyYW1TdGF0ZU1hbmFnZXImIGdldFN0YXRlTWFuYWdlcigpIHsKKyAgICByZXR1cm4gQlIuZ2V0U3RhdGVNYW5hZ2VyKCk7CisgIH0KKworICBTVmFsQnVpbGRlciAmZ2V0U1ZhbEJ1aWxkZXIoKSB7CisgICAgcmV0dXJuIGdldFN0YXRlTWFuYWdlcigpLmdldFNWYWxCdWlsZGVyKCk7CisgIH0KKworICBBU1RDb250ZXh0ICZnZXRBU1RDb250ZXh0KCkgeworICAgIHJldHVybiBCUi5nZXRDb250ZXh0KCk7CisgIH0KKworICBTb3VyY2VNYW5hZ2VyJiBnZXRTb3VyY2VNYW5hZ2VyKCkgeworICAgIHJldHVybiBCUi5nZXRTb3VyY2VNYW5hZ2VyKCk7CisgIH0KKworICB2aXJ0dWFsIEJ1Z1JlcG9ydDo6Tm9kZVJlc29sdmVyJiBnZXROb2RlUmVzb2x2ZXIoKSA9IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBlbnRvCisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfQlVHUkVQT1JURVJfQlVHUkVQT1JURVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9CdWdSZXBvcnRlclZpc2l0b3JzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0J1Z1JlcG9ydGVyL0J1Z1JlcG9ydGVyVmlzaXRvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjcwYzMyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9CdWdSZXBvcnRlclZpc2l0b3JzLmgKQEAgLTAsMCArMSwzNzkgQEAKKy8vPT09LSBCdWdSZXBvcnRlclZpc2l0b3JzLmggLSBHZW5lcmF0ZSBQYXRoRGlhZ25vc3RpY3MgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWNsYXJlcyBCdWdSZXBvcnRlclZpc2l0b3JzLCB3aGljaCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBlbmhhbmNlZAorLy8gIGRpYWdub3N0aWMgdHJhY2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX0JVR1JFUE9SVEVSX0JVR1JFUE9SVEVSVklTSVRPUlNfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfQlVHUkVQT1JURVJfQlVHUkVQT1JURVJWSVNJVE9SU19ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1NWYWxzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQmluYXJ5T3BlcmF0b3I7CitjbGFzcyBDRkdCbG9jazsKK2NsYXNzIERlY2xSZWZFeHByOworY2xhc3MgRXhwcjsKK2NsYXNzIFN0bXQ7CisKK25hbWVzcGFjZSBlbnRvIHsKKworY2xhc3MgQnVnUmVwb3J0OworY2xhc3MgQnVnUmVwb3J0ZXJDb250ZXh0OworY2xhc3MgRXhwbG9kZWROb2RlOworY2xhc3MgTWVtUmVnaW9uOworY2xhc3MgUGF0aERpYWdub3N0aWNQaWVjZTsKKworLy8vIFxicmllZiBCdWdSZXBvcnRlclZpc2l0b3JzIGFyZSB1c2VkIHRvIGFkZCBjdXN0b20gZGlhZ25vc3RpY3MgYWxvbmcgYSBwYXRoLgorLy8vCisvLy8gQ3VzdG9tIHZpc2l0b3JzIHNob3VsZCBzdWJjbGFzcyB0aGUgQnVnUmVwb3J0ZXJWaXNpdG9ySW1wbCBjbGFzcyBmb3IgYQorLy8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNsb25lKCkgbWV0aG9kLgorLy8vIChXYXJuaW5nOiBpZiB5b3UgaGF2ZSBhIGRlZXAgc3ViY2xhc3Mgb2YgQnVnUmVwb3J0ZXJWaXNpdG9ySW1wbCwgdGhlCisvLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBjbG9uZSgpIHdpbGwgTk9UIGRvIHRoZSByaWdodCB0aGluZywgYW5kIHlvdQorLy8vIHdpbGwgaGF2ZSB0byBwcm92aWRlIHlvdXIgb3duIGltcGxlbWVudGF0aW9uLikKK2NsYXNzIEJ1Z1JlcG9ydGVyVmlzaXRvciA6IHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CitwdWJsaWM6CisgIEJ1Z1JlcG9ydGVyVmlzaXRvcigpID0gZGVmYXVsdDsKKyAgQnVnUmVwb3J0ZXJWaXNpdG9yKGNvbnN0IEJ1Z1JlcG9ydGVyVmlzaXRvciAmKSA9IGRlZmF1bHQ7CisgIEJ1Z1JlcG9ydGVyVmlzaXRvcihCdWdSZXBvcnRlclZpc2l0b3IgJiYpIHt9CisgIHZpcnR1YWwgfkJ1Z1JlcG9ydGVyVmlzaXRvcigpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBCdWdSZXBvcnRlci4KKyAgLy8vCisgIC8vLyBDdXN0b20gQnVnUmVwb3J0ZXJWaXNpdG9ycyBzaG91bGQgbm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGRpcmVjdGx5LgorICAvLy8gSW5zdGVhZCwgdGhleSBzaG91bGQgaW5oZXJpdCBmcm9tIEJ1Z1JlcG9ydGVyVmlzaXRvckltcGwgYW5kIHByb3ZpZGUKKyAgLy8vIGEgcHJvdGVjdGVkIG9yIHB1YmxpYyBjb3B5IGNvbnN0cnVjdG9yLgorICAvLy8KKyAgLy8vIChXYXJuaW5nOiBpZiB5b3UgaGF2ZSBhIGRlZXAgc3ViY2xhc3Mgb2YgQnVnUmVwb3J0ZXJWaXNpdG9ySW1wbCwgdGhlCisgIC8vLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGNsb25lKCkgd2lsbCBOT1QgZG8gdGhlIHJpZ2h0IHRoaW5nLCBhbmQgeW91CisgIC8vLyB3aWxsIGhhdmUgdG8gcHJvdmlkZSB5b3VyIG93biBpbXBsZW1lbnRhdGlvbi4pCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEJ1Z1JlcG9ydGVyVmlzaXRvcj4gY2xvbmUoKSBjb25zdCA9IDA7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSBkaWFnbm9zdGljIHBpZWNlIHdoaWNoIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlCisgIC8vLyBnaXZlbiBub2RlLgorICAvLy8KKyAgLy8vIFRoZSBsYXN0IHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byByZWdpc3RlciBhIG5ldyB2aXNpdG9yIHdpdGggdGhlIGdpdmVuCisgIC8vLyBCdWdSZXBvcnQgd2hpbGUgcHJvY2Vzc2luZyBhIG5vZGUuCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFBhdGhEaWFnbm9zdGljUGllY2U+CisgIFZpc2l0Tm9kZShjb25zdCBFeHBsb2RlZE5vZGUgKlN1Y2MsIGNvbnN0IEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgIEJ1Z1JlcG9ydGVyQ29udGV4dCAmQlJDLCBCdWdSZXBvcnQgJkJSKSA9IDA7CisKKyAgLy8vIFxicmllZiBQcm92aWRlIGN1c3RvbSBkZWZpbml0aW9uIGZvciB0aGUgZmluYWwgZGlhZ25vc3RpYyBwaWVjZSBvbiB0aGUKKyAgLy8vIHBhdGggLSB0aGUgcGllY2UsIHdoaWNoIGlzIGRpc3BsYXllZCBiZWZvcmUgdGhlIHBhdGggaXMgZXhwYW5kZWQuCisgIC8vLworICAvLy8gSWYgcmV0dXJucyBOVUxMIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZC4KKyAgLy8vIEFsc28gbm90ZSB0aGF0IGF0IG1vc3Qgb25lIHZpc2l0b3Igb2YgYSBCdWdSZXBvcnQgc2hvdWxkIGdlbmVyYXRlIGEKKyAgLy8vIG5vbi1OVUxMIGVuZCBvZiBwYXRoIGRpYWdub3N0aWMgcGllY2UuCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPFBhdGhEaWFnbm9zdGljUGllY2U+CisgIGdldEVuZFBhdGgoQnVnUmVwb3J0ZXJDb250ZXh0ICZCUkMsIGNvbnN0IEV4cGxvZGVkTm9kZSAqTiwgQnVnUmVwb3J0ICZCUik7CisKKyAgdmlydHVhbCB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0ID0gMDsKKworICAvLy8gXGJyaWVmIEdlbmVyYXRlcyB0aGUgZGVmYXVsdCBmaW5hbCBkaWFnbm9zdGljIHBpZWNlLgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFBhdGhEaWFnbm9zdGljUGllY2U+CisgIGdldERlZmF1bHRFbmRQYXRoKEJ1Z1JlcG9ydGVyQ29udGV4dCAmQlJDLCBjb25zdCBFeHBsb2RlZE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydCAmQlIpOworfTsKKworLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBjb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBmb3IgY2xvbmUoKSB1c2luZyB0aGUKKy8vLyBDdXJpb3VzbHktUmVjdXJyaW5nIFRlbXBsYXRlIFBhdHRlcm4uIElmIHlvdSBhcmUgaW1wbGVtZW50aW5nIGEgY3VzdG9tCisvLy8gQnVnUmVwb3J0ZXJWaXNpdG9yLCBzdWJjbGFzcyBCdWdSZXBvcnRlclZpc2l0b3JJbXBsIGFuZCBwcm92aWRlIGEgcHVibGljCisvLy8gb3IgcHJvdGVjdGVkIGNvcHkgY29uc3RydWN0b3IuCisvLy8KKy8vLyAoV2FybmluZzogaWYgeW91IGhhdmUgYSBkZWVwIHN1YmNsYXNzIG9mIEJ1Z1JlcG9ydGVyVmlzaXRvckltcGwsIHRoZQorLy8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgY2xvbmUoKSB3aWxsIE5PVCBkbyB0aGUgcmlnaHQgdGhpbmcsIGFuZCB5b3UKKy8vLyB3aWxsIGhhdmUgdG8gcHJvdmlkZSB5b3VyIG93biBpbXBsZW1lbnRhdGlvbi4pCit0ZW1wbGF0ZSA8Y2xhc3MgREVSSVZFRD4KK2NsYXNzIEJ1Z1JlcG9ydGVyVmlzaXRvckltcGwgOiBwdWJsaWMgQnVnUmVwb3J0ZXJWaXNpdG9yIHsKKyAgc3RkOjp1bmlxdWVfcHRyPEJ1Z1JlcG9ydGVyVmlzaXRvcj4gY2xvbmUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VfdW5pcXVlPERFUklWRUQ+KCpzdGF0aWNfY2FzdDxjb25zdCBERVJJVkVEICo+KHRoaXMpKTsKKyAgfQorfTsKKworY2xhc3MgRmluZExhc3RTdG9yZUJSVmlzaXRvciBmaW5hbAorICAgIDogcHVibGljIEJ1Z1JlcG9ydGVyVmlzaXRvckltcGw8RmluZExhc3RTdG9yZUJSVmlzaXRvcj4geworICBjb25zdCBNZW1SZWdpb24gKlI7CisgIFNWYWwgVjsKKyAgYm9vbCBTYXRpc2ZpZWQgPSBmYWxzZTsKKworICAvLy8gSWYgdGhlIHZpc2l0b3IgaXMgdHJhY2tpbmcgdGhlIHZhbHVlIGRpcmVjdGx5IHJlc3BvbnNpYmxlIGZvciB0aGUKKyAgLy8vIGJ1Zywgd2UgYXJlIGdvaW5nIHRvIGVtcGxveSBmYWxzZSBwb3NpdGl2ZSBzdXBwcmVzc2lvbi4KKyAgYm9vbCBFbmFibGVOdWxsRlBTdXBwcmVzc2lvbjsKKworcHVibGljOgorICAvLy8gQ3JlYXRlcyBhIHZpc2l0b3IgZm9yIGV2ZXJ5IFZhckRlY2wgaW5zaWRlIGEgU3RtdCBhbmQgcmVnaXN0ZXJzIGl0IHdpdGgKKyAgLy8vIHRoZSBCdWdSZXBvcnQuCisgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyU3RhdGVtZW50VmFyRGVjbHMoQnVnUmVwb3J0ICZCUiwgY29uc3QgU3RtdCAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEVuYWJsZU51bGxGUFN1cHByZXNzaW9uKTsKKworICBGaW5kTGFzdFN0b3JlQlJWaXNpdG9yKEtub3duU1ZhbCBWLCBjb25zdCBNZW1SZWdpb24gKlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbkVuYWJsZU51bGxGUFN1cHByZXNzaW9uKQorICAgICAgOiBSKFIpLCBWKFYpLCBFbmFibGVOdWxsRlBTdXBwcmVzc2lvbihJbkVuYWJsZU51bGxGUFN1cHByZXNzaW9uKSB7fQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFBhdGhEaWFnbm9zdGljUGllY2U+IFZpc2l0Tm9kZShjb25zdCBFeHBsb2RlZE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwbG9kZWROb2RlICpQcmV2TiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnRlckNvbnRleHQgJkJSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnQgJkJSKSBvdmVycmlkZTsKK307CisKK2NsYXNzIFRyYWNrQ29uc3RyYWludEJSVmlzaXRvciBmaW5hbAorICAgIDogcHVibGljIEJ1Z1JlcG9ydGVyVmlzaXRvckltcGw8VHJhY2tDb25zdHJhaW50QlJWaXNpdG9yPiB7CisgIERlZmluZWRTVmFsIENvbnN0cmFpbnQ7CisgIGJvb2wgQXNzdW1wdGlvbjsKKyAgYm9vbCBJc1NhdGlzZmllZCA9IGZhbHNlOworICBib29sIElzWmVyb0NoZWNrOworCisgIC8vLyBXZSBzaG91bGQgc3RhcnQgdHJhY2tpbmcgZnJvbSB0aGUgbGFzdCBub2RlIGFsb25nIHRoZSBwYXRoIGluIHdoaWNoIHRoZQorICAvLy8gdmFsdWUgaXMgY29uc3RyYWluZWQuCisgIGJvb2wgSXNUcmFja2luZ1R1cm5lZE9uID0gZmFsc2U7CisKK3B1YmxpYzoKKyAgVHJhY2tDb25zdHJhaW50QlJWaXNpdG9yKERlZmluZWRTVmFsIGNvbnN0cmFpbnQsIGJvb2wgYXNzdW1wdGlvbikKKyAgICAgIDogQ29uc3RyYWludChjb25zdHJhaW50KSwgQXNzdW1wdGlvbihhc3N1bXB0aW9uKSwKKyAgICAgICAgSXNaZXJvQ2hlY2soIUFzc3VtcHRpb24gJiYgQ29uc3RyYWludC5nZXRBczxMb2M+KCkpIHt9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gUmV0dXJuIHRoZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmlzaXRvci4gIFRoaXMgdGFnIHdpbGwgYmUgdXNlZAorICAvLy8gdG8gbWFrZSBhbGwgUGF0aERpYWdub3N0aWNQaWVjZXMgY3JlYXRlZCBieSB0aGlzIHZpc2l0b3IuCisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRUYWcoKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8UGF0aERpYWdub3N0aWNQaWVjZT4gVmlzaXROb2RlKGNvbnN0IEV4cGxvZGVkTm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGUgKlByZXZOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyQ29udGV4dCAmQlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydCAmQlIpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAvLy8gQ2hlY2tzIGlmIHRoZSBjb25zdHJhaW50IGlzIHZhbGlkIGluIHRoZSBjdXJyZW50IHN0YXRlLgorICBib29sIGlzVW5kZXJjb25zdHJhaW5lZChjb25zdCBFeHBsb2RlZE5vZGUgKk4pIGNvbnN0OworfTsKKworLy8vIFxjbGFzcyBOaWxSZWNlaXZlckJSVmlzaXRvcgorLy8vIFxicmllZiBQcmludHMgcGF0aCBub3RlcyB3aGVuIGEgbWVzc2FnZSBpcyBzZW50IHRvIGEgbmlsIHJlY2VpdmVyLgorY2xhc3MgTmlsUmVjZWl2ZXJCUlZpc2l0b3IgZmluYWwKKyAgICA6IHB1YmxpYyBCdWdSZXBvcnRlclZpc2l0b3JJbXBsPE5pbFJlY2VpdmVyQlJWaXNpdG9yPiB7CitwdWJsaWM6CisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHN0YXRpYyBpbnQgeCA9IDA7CisgICAgSUQuQWRkUG9pbnRlcigmeCk7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8UGF0aERpYWdub3N0aWNQaWVjZT4gVmlzaXROb2RlKGNvbnN0IEV4cGxvZGVkTm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGUgKlByZXZOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyQ29udGV4dCAmQlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydCAmQlIpIG92ZXJyaWRlOworCisgIC8vLyBJZiB0aGUgc3RhdGVtZW50IGlzIGEgbWVzc2FnZSBzZW5kIGV4cHJlc3Npb24gd2l0aCBuaWwgcmVjZWl2ZXIsIHJldHVybnMKKyAgLy8vIHRoZSByZWNlaXZlciBleHByZXNzaW9uLiBSZXR1cm5zIE5VTEwgb3RoZXJ3aXNlLgorICBzdGF0aWMgY29uc3QgRXhwciAqZ2V0TmlsUmVjZWl2ZXIoY29uc3QgU3RtdCAqUywgY29uc3QgRXhwbG9kZWROb2RlICpOKTsKK307CisKKy8vLyBWaXNpdG9yIHRoYXQgdHJpZXMgdG8gcmVwb3J0IGludGVyZXN0aW5nIGRpYWdub3N0aWNzIGZyb20gY29uZGl0aW9ucy4KK2NsYXNzIENvbmRpdGlvbkJSVmlzaXRvciBmaW5hbAorICAgIDogcHVibGljIEJ1Z1JlcG9ydGVyVmlzaXRvckltcGw8Q29uZGl0aW9uQlJWaXNpdG9yPiB7CisgIC8vIEZJWE1FOiBjb25zdGV4cHIgaW5pdGlhbGl6YXRpb24gaXNuJ3Qgc3VwcG9ydGVkIGJ5IE1TVkMyMDEzLgorICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgR2VuZXJpY1RydWVNZXNzYWdlOworICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgR2VuZXJpY0ZhbHNlTWVzc2FnZTsKKworcHVibGljOgorICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBzdGF0aWMgaW50IHggPSAwOworICAgIElELkFkZFBvaW50ZXIoJngpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZpc2l0b3IuICBUaGlzIHRhZyB3aWxsIGJlIHVzZWQKKyAgLy8vIHRvIG1ha2UgYWxsIFBhdGhEaWFnbm9zdGljUGllY2VzIGNyZWF0ZWQgYnkgdGhpcyB2aXNpdG9yLgorICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0VGFnKCk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFBhdGhEaWFnbm9zdGljUGllY2U+IFZpc2l0Tm9kZShjb25zdCBFeHBsb2RlZE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwbG9kZWROb2RlICpQcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyQ29udGV4dCAmQlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydCAmQlIpIG92ZXJyaWRlOworCisgIHN0ZDo6c2hhcmVkX3B0cjxQYXRoRGlhZ25vc3RpY1BpZWNlPiBWaXNpdE5vZGVJbXBsKGNvbnN0IEV4cGxvZGVkTm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwbG9kZWROb2RlICpQcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnRlckNvbnRleHQgJkJSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ICZCUik7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFBhdGhEaWFnbm9zdGljUGllY2U+CisgIFZpc2l0VGVybWluYXRvcihjb25zdCBTdG10ICpUZXJtLCBjb25zdCBFeHBsb2RlZE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICBjb25zdCBDRkdCbG9jayAqc3JjQmxrLCBjb25zdCBDRkdCbG9jayAqZHN0QmxrLCBCdWdSZXBvcnQgJlIsCisgICAgICAgICAgICAgICAgICBCdWdSZXBvcnRlckNvbnRleHQgJkJSQyk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFBhdGhEaWFnbm9zdGljUGllY2U+CisgIFZpc2l0VHJ1ZVRlc3QoY29uc3QgRXhwciAqQ29uZCwgYm9vbCB0b29rVHJ1ZSwgQnVnUmVwb3J0ZXJDb250ZXh0ICZCUkMsCisgICAgICAgICAgICAgICAgQnVnUmVwb3J0ICZSLCBjb25zdCBFeHBsb2RlZE5vZGUgKk4pOworCisgIHN0ZDo6c2hhcmVkX3B0cjxQYXRoRGlhZ25vc3RpY1BpZWNlPgorICBWaXNpdFRydWVUZXN0KGNvbnN0IEV4cHIgKkNvbmQsIGNvbnN0IERlY2xSZWZFeHByICpEUiwgY29uc3QgYm9vbCB0b29rVHJ1ZSwKKyAgICAgICAgICAgICAgICBCdWdSZXBvcnRlckNvbnRleHQgJkJSQywgQnVnUmVwb3J0ICZSLCBjb25zdCBFeHBsb2RlZE5vZGUgKk4pOworCisgIHN0ZDo6c2hhcmVkX3B0cjxQYXRoRGlhZ25vc3RpY1BpZWNlPgorICBWaXNpdFRydWVUZXN0KGNvbnN0IEV4cHIgKkNvbmQsIGNvbnN0IEJpbmFyeU9wZXJhdG9yICpCRXhwciwKKyAgICAgICAgICAgICAgICBjb25zdCBib29sIHRvb2tUcnVlLCBCdWdSZXBvcnRlckNvbnRleHQgJkJSQywgQnVnUmVwb3J0ICZSLAorICAgICAgICAgICAgICAgIGNvbnN0IEV4cGxvZGVkTm9kZSAqTik7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFBhdGhEaWFnbm9zdGljUGllY2U+CisgIFZpc2l0Q29uZGl0aW9uVmFyaWFibGUoU3RyaW5nUmVmIExoc1N0cmluZywgY29uc3QgRXhwciAqQ29uZFZhckV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCB0b29rVHJ1ZSwgQnVnUmVwb3J0ZXJDb250ZXh0ICZCUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ICZSLCBjb25zdCBFeHBsb2RlZE5vZGUgKk4pOworCisgIGJvb2wgcGF0dGVybk1hdGNoKGNvbnN0IEV4cHIgKkV4LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpQYXJlbnRFeCwKKyAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk91dCwKKyAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXJDb250ZXh0ICZCUkMsCisgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydCAmUiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwbG9kZWROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxib29sPiAmcHJ1bmFibGUpOworCisgIHN0YXRpYyBib29sIGlzUGllY2VNZXNzYWdlR2VuZXJpYyhjb25zdCBQYXRoRGlhZ25vc3RpY1BpZWNlICpQaWVjZSk7Cit9OworCisvLy8gXGJyaWVmIFN1cHByZXNzIHJlcG9ydHMgdGhhdCBtaWdodCBsZWFkIHRvIGtub3duIGZhbHNlIHBvc2l0aXZlcy4KKy8vLworLy8vIEN1cnJlbnRseSB0aGlzIHN1cHByZXNzZXMgcmVwb3J0cyBiYXNlZCBvbiBsb2NhdGlvbnMgb2YgYnVncy4KK2NsYXNzIExpa2VseUZhbHNlUG9zaXRpdmVTdXBwcmVzc2lvbkJSVmlzaXRvciBmaW5hbAorICAgIDogcHVibGljIEJ1Z1JlcG9ydGVyVmlzaXRvckltcGw8TGlrZWx5RmFsc2VQb3NpdGl2ZVN1cHByZXNzaW9uQlJWaXNpdG9yPiB7CitwdWJsaWM6CisgIHN0YXRpYyB2b2lkICpnZXRUYWcoKSB7CisgICAgc3RhdGljIGludCBUYWcgPSAwOworICAgIHJldHVybiBzdGF0aWNfY2FzdDx2b2lkICo+KCZUYWcpOworICB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCBvdmVycmlkZSB7CisgICAgSUQuQWRkUG9pbnRlcihnZXRUYWcoKSk7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8UGF0aERpYWdub3N0aWNQaWVjZT4gVmlzaXROb2RlKGNvbnN0IEV4cGxvZGVkTm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGUgKlByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXJDb250ZXh0ICZCUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ICZCUikgb3ZlcnJpZGUgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPFBhdGhEaWFnbm9zdGljUGllY2U+IGdldEVuZFBhdGgoQnVnUmVwb3J0ZXJDb250ZXh0ICZCUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGxvZGVkTm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ICZCUikgb3ZlcnJpZGU7Cit9OworCisvLy8gXGJyaWVmIFdoZW4gYSByZWdpb24gY29udGFpbmluZyB1bmRlZmluZWQgdmFsdWUgb3IgJzAnIHZhbHVlIGlzIHBhc3NlZCAKKy8vLyBhcyBhbiBhcmd1bWVudCBpbiBhIGNhbGwsIG1hcmtzIHRoZSBjYWxsIGFzIGludGVyZXN0aW5nLgorLy8vCisvLy8gQXMgYSByZXN1bHQsIEJ1Z1JlcG9ydGVyIHdpbGwgbm90IHBydW5lIHRoZSBwYXRoIHRocm91Z2ggdGhlIGZ1bmN0aW9uIGV2ZW4KKy8vLyBpZiB0aGUgcmVnaW9uJ3MgY29udGVudHMgYXJlIG5vdCBtb2RpZmllZC9hY2Nlc3NlZCBieSB0aGUgY2FsbC4KK2NsYXNzIFVuZGVmT3JOdWxsQXJnVmlzaXRvciBmaW5hbAorICAgIDogcHVibGljIEJ1Z1JlcG9ydGVyVmlzaXRvckltcGw8VW5kZWZPck51bGxBcmdWaXNpdG9yPiB7CisgIC8vLyBUaGUgaW50ZXJlc3RpbmcgbWVtb3J5IHJlZ2lvbiB0aGlzIHZpc2l0b3IgaXMgdHJhY2tpbmcuCisgIGNvbnN0IE1lbVJlZ2lvbiAqUjsKKworcHVibGljOgorICBVbmRlZk9yTnVsbEFyZ1Zpc2l0b3IoY29uc3QgTWVtUmVnaW9uICpJblIpIDogUihJblIpIHt9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCBvdmVycmlkZSB7CisgICAgc3RhdGljIGludCBUYWcgPSAwOworICAgIElELkFkZFBvaW50ZXIoJlRhZyk7CisgICAgSUQuQWRkUG9pbnRlcihSKTsKKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxQYXRoRGlhZ25vc3RpY1BpZWNlPiBWaXNpdE5vZGUoY29uc3QgRXhwbG9kZWROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGxvZGVkTm9kZSAqUHJldk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXJDb250ZXh0ICZCUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ICZCUikgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBTdXBwcmVzc0lubGluZURlZmVuc2l2ZUNoZWNrc1Zpc2l0b3IgZmluYWwKKyAgICA6IHB1YmxpYyBCdWdSZXBvcnRlclZpc2l0b3JJbXBsPFN1cHByZXNzSW5saW5lRGVmZW5zaXZlQ2hlY2tzVmlzaXRvcj4geworICAvLy8gVGhlIHN5bWJvbGljIHZhbHVlIGZvciB3aGljaCB3ZSBhcmUgdHJhY2tpbmcgY29uc3RyYWludHMuCisgIC8vLyBUaGlzIHZhbHVlIGlzIGNvbnN0cmFpbmVkIHRvIG51bGwgaW4gdGhlIGVuZCBvZiBwYXRoLgorICBEZWZpbmVkU1ZhbCBWOworCisgIC8vLyBUcmFjayBpZiB3ZSBmb3VuZCB0aGUgbm9kZSB3aGVyZSB0aGUgY29uc3RyYWludCB3YXMgZmlyc3QgYWRkZWQuCisgIGJvb2wgSXNTYXRpc2ZpZWQgPSBmYWxzZTsKKworICAvLy8gU2luY2UgdGhlIHZpc2l0b3JzIGNhbiBiZSByZWdpc3RlcmVkIG9uIG5vZGVzIHByZXZpb3VzIHRvIHRoZSBsYXN0CisgIC8vLyBub2RlIGluIHRoZSBCdWdSZXBvcnQsIGJ1dCB0aGUgcGF0aCB0cmF2ZXJzYWwgYWx3YXlzIHN0YXJ0cyB3aXRoIHRoZSBsYXN0CisgIC8vLyBub2RlLCB0aGUgdmlzaXRvciBpbnZhcmlhbnQgKHRoYXQgd2Ugc3RhcnQgd2l0aCBhIG5vZGUgaW4gd2hpY2ggViBpcyBudWxsKQorICAvLy8gbWlnaHQgbm90IGhvbGQgd2hlbiBub2RlIHZpc2l0YXRpb24gc3RhcnRzLiBXZSBhcmUgZ29pbmcgdG8gc3RhcnQgdHJhY2tpbmcKKyAgLy8vIGZyb20gdGhlIGxhc3Qgbm9kZSBpbiB3aGljaCB0aGUgdmFsdWUgaXMgbnVsbC4KKyAgYm9vbCBJc1RyYWNraW5nVHVybmVkT24gPSBmYWxzZTsKKworcHVibGljOgorICBTdXBwcmVzc0lubGluZURlZmVuc2l2ZUNoZWNrc1Zpc2l0b3IoRGVmaW5lZFNWYWwgVmFsLCBjb25zdCBFeHBsb2RlZE5vZGUgKk4pOworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIFJldHVybiB0aGUgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZpc2l0b3IuICBUaGlzIHRhZyB3aWxsIGJlIHVzZWQKKyAgLy8vIHRvIG1ha2UgYWxsIFBhdGhEaWFnbm9zdGljUGllY2VzIGNyZWF0ZWQgYnkgdGhpcyB2aXNpdG9yLgorICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0VGFnKCk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFBhdGhEaWFnbm9zdGljUGllY2U+IFZpc2l0Tm9kZShjb25zdCBFeHBsb2RlZE5vZGUgKlN1Y2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwbG9kZWROb2RlICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyQ29udGV4dCAmQlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydCAmQlIpIG92ZXJyaWRlOworfTsKKworY2xhc3MgQ1hYU2VsZkFzc2lnbm1lbnRCUlZpc2l0b3IgZmluYWwKKyAgICA6IHB1YmxpYyBCdWdSZXBvcnRlclZpc2l0b3JJbXBsPENYWFNlbGZBc3NpZ25tZW50QlJWaXNpdG9yPiB7CisgIGJvb2wgU2F0aXNmaWVkID0gZmFsc2U7CisKK3B1YmxpYzoKKyAgQ1hYU2VsZkFzc2lnbm1lbnRCUlZpc2l0b3IoKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCBvdmVycmlkZSB7fQorCisgIHN0ZDo6c2hhcmVkX3B0cjxQYXRoRGlhZ25vc3RpY1BpZWNlPiBWaXNpdE5vZGUoY29uc3QgRXhwbG9kZWROb2RlICpTdWNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnRlckNvbnRleHQgJkJSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnQgJkJSKSBvdmVycmlkZTsKK307CisKK25hbWVzcGFjZSBidWdyZXBvcnRlciB7CisKKy8vLyBBdHRlbXB0cyB0byBhZGQgdmlzaXRvcnMgdG8gdHJhY2UgYSBudWxsIG9yIHVuZGVmaW5lZCB2YWx1ZSBiYWNrIHRvIGl0cworLy8vIHBvaW50IG9mIG9yaWdpbiwgd2hldGhlciBpdCBpcyBhIHN5bWJvbCBjb25zdHJhaW5lZCB0byBudWxsIG9yIGFuIGV4cGxpY2l0CisvLy8gYXNzaWdubWVudC4KKy8vLworLy8vIFxwYXJhbSBOIEEgbm9kZSAiZG93bnN0cmVhbSIgZnJvbSB0aGUgZXZhbHVhdGlvbiBvZiB0aGUgc3RhdGVtZW50LgorLy8vIFxwYXJhbSBTIFRoZSBzdGF0ZW1lbnQgd2hvc2UgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQuCisvLy8gXHBhcmFtIFIgVGhlIGJ1ZyByZXBvcnQgdG8gd2hpY2ggdmlzaXRvcnMgc2hvdWxkIGJlIGF0dGFjaGVkLgorLy8vIFxwYXJhbSBJc0FyZyBXaGV0aGVyIHRoZSBzdGF0ZW1lbnQgaXMgYW4gYXJndW1lbnQgdG8gYW4gaW5saW5lZCBmdW5jdGlvbi4KKy8vLyAgICAgICAgICAgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgXHAgTiBcZW0gbXVzdCBiZSB0aGUgQ2FsbEVudGVyIG5vZGUgZm9yCisvLy8gICAgICAgICAgICAgIHRoZSBmdW5jdGlvbi4KKy8vLyBccGFyYW0gRW5hYmxlTnVsbEZQU3VwcHJlc3Npb24gV2hldGhlciB3ZSBzaG91bGQgZW1wbG95IGZhbHNlIHBvc2l0aXZlCisvLy8gICAgICAgICBzdXBwcmVzc2lvbiAoaW5saW5lZCBkZWZlbnNpdmUgY2hlY2tzLCByZXR1cm5lZCBudWxsKS4KKy8vLworLy8vIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIGZ1bmN0aW9uIHdhcyBhYmxlIHRvIGFkZCB2aXNpdG9ycyBmb3IgdGhpcworLy8vICAgICAgICAgc3RhdGVtZW50LiBOb3RlIHRoYXQgcmV0dXJuaW5nIFxjIHRydWUgZG9lcyBub3QgYWN0dWFsbHkgaW1wbHkKKy8vLyAgICAgICAgIHRoYXQgYW55IHZpc2l0b3JzIHdlcmUgYWRkZWQuCitib29sIHRyYWNrTnVsbE9yVW5kZWZWYWx1ZShjb25zdCBFeHBsb2RlZE5vZGUgKk4sIGNvbnN0IFN0bXQgKlMsIEJ1Z1JlcG9ydCAmUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNBcmcgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRW5hYmxlTnVsbEZQU3VwcHJlc3Npb24gPSB0cnVlKTsKKworY29uc3QgRXhwciAqZ2V0RGVyZWZFeHByKGNvbnN0IFN0bXQgKlMpOworY29uc3QgU3RtdCAqR2V0RGVub21FeHByKGNvbnN0IEV4cGxvZGVkTm9kZSAqTik7Citjb25zdCBTdG10ICpHZXRSZXRWYWxFeHByKGNvbnN0IEV4cGxvZGVkTm9kZSAqTik7Citib29sIGlzRGVjbFJlZkV4cHJUb1JlZmVyZW5jZShjb25zdCBFeHByICpFKTsKKworfSAvLyBuYW1lc3BhY2UgYnVncmVwb3J0ZXIKKworfSAvLyBuYW1lc3BhY2UgZW50bworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX0JVR1JFUE9SVEVSX0JVR1JFUE9SVEVSVklTSVRPUlNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9CdWdUeXBlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0J1Z1JlcG9ydGVyL0J1Z1R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzE2M2VmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9CdWdUeXBlLmgKQEAgLTAsMCArMSw5MiBAQAorLy89PT0tLS0gIEJ1Z1R5cGUuaCAtIEJ1ZyBJbmZvcm1hdGlvbiBEZXNjaXB0aW9uIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgQnVnVHlwZSwgYSBjbGFzcyByZXByZXNlbnRpbmcgYSBidWcgdHlwZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9CVUdSRVBPUlRFUl9CVUdUWVBFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX0JVR1JFUE9SVEVSX0JVR1RZUEVfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQnVnUmVwb3J0ZXIvQ29tbW9uQnVnQ2F0ZWdvcmllcy5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQ2hlY2tlci5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworbmFtZXNwYWNlIGVudG8geworCitjbGFzcyBCdWdSZXBvcnRlcjsKK2NsYXNzIEV4cGxvZGVkTm9kZTsKK2NsYXNzIEV4cHJFbmdpbmU7CisKK2NsYXNzIEJ1Z1R5cGUgeworcHJpdmF0ZToKKyAgY29uc3QgQ2hlY2tOYW1lIENoZWNrOworICBjb25zdCBzdGQ6OnN0cmluZyBOYW1lOworICBjb25zdCBzdGQ6OnN0cmluZyBDYXRlZ29yeTsKKyAgY29uc3QgQ2hlY2tlckJhc2UgKkNoZWNrZXI7CisgIGJvb2wgU3VwcHJlc3NPblNpbms7CisKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIEJ1Z1R5cGUoQ2hlY2tOYW1lIENoZWNrLCBTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIENhdCkKKyAgICAgIDogQ2hlY2soQ2hlY2spLCBOYW1lKE5hbWUpLCBDYXRlZ29yeShDYXQpLCBDaGVja2VyKG51bGxwdHIpLAorICAgICAgICBTdXBwcmVzc09uU2luayhmYWxzZSkge30KKyAgQnVnVHlwZShjb25zdCBDaGVja2VyQmFzZSAqQ2hlY2tlciwgU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBDYXQpCisgICAgICA6IENoZWNrKENoZWNrZXItPmdldENoZWNrTmFtZSgpKSwgTmFtZShOYW1lKSwgQ2F0ZWdvcnkoQ2F0KSwKKyAgICAgICAgQ2hlY2tlcihDaGVja2VyKSwgU3VwcHJlc3NPblNpbmsoZmFsc2UpIHt9CisgIHZpcnR1YWwgfkJ1Z1R5cGUoKSA9IGRlZmF1bHQ7CisKKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisgIFN0cmluZ1JlZiBnZXRDYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJuIENhdGVnb3J5OyB9CisgIFN0cmluZ1JlZiBnZXRDaGVja05hbWUoKSBjb25zdCB7CisgICAgLy8gRklYTUU6IFRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IGNoZWNrIG5hbWUgaXMgdXNlZAorICAgIC8vIFRoZSBjaGVjayBuYW1lcyBhcmUgc2V0IGFmdGVyIHRoZSBjb25zdHJ1Y3RvcnMgYXJlIHJ1bi4KKyAgICAvLyBJbiBjYXNlIHRoZSBCdWdUeXBlIG9iamVjdCBpcyBpbml0aWFsaXplZCBpbiB0aGUgY2hlY2tlcidzIGN0b3IKKyAgICAvLyB0aGUgQ2hlY2sgZmllbGQgd2lsbCBiZSBlbXB0eS4gVG8gY2lyY3VtdmVudCB0aGlzIHByb2JsZW0gd2UgdXNlIAorICAgIC8vIENoZWNrZXJCYXNlIHdoZW5ldmVyIGl0IGlzIHBvc3NpYmxlLgorICAgIFN0cmluZ1JlZiBDaGVja05hbWUgPQorICAgICAgICBDaGVja2VyID8gQ2hlY2tlci0+Z2V0Q2hlY2tOYW1lKCkuZ2V0TmFtZSgpIDogQ2hlY2suZ2V0TmFtZSgpOworICAgIGFzc2VydCghQ2hlY2tOYW1lLmVtcHR5KCkgJiYgIkNoZWNrIG5hbWUgaXMgbm90IHNldCBwcm9wZXJseS4iKTsKKyAgICByZXR1cm4gQ2hlY2tOYW1lOworICB9CisKKyAgLy8vIGlzU3VwcHJlc3NPblNpbmsgLSBSZXR1cm5zIHRydWUgaWYgYnVnIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVnCisgIC8vLyAgdHlwZSBzaG91bGQgYmUgc3VwcHJlc3NlZCBpZiB0aGUgZW5kIG5vZGUgb2YgdGhlIHJlcG9ydCBpcyBwb3N0LWRvbWluYXRlZAorICAvLy8gIGJ5IGEgc2luayBub2RlLgorICBib29sIGlzU3VwcHJlc3NPblNpbmsoKSBjb25zdCB7IHJldHVybiBTdXBwcmVzc09uU2luazsgfQorICB2b2lkIHNldFN1cHByZXNzT25TaW5rKGJvb2wgeCkgeyBTdXBwcmVzc09uU2luayA9IHg7IH0KKworICB2aXJ0dWFsIHZvaWQgRmx1c2hSZXBvcnRzKEJ1Z1JlcG9ydGVyJiBCUik7Cit9OworCitjbGFzcyBCdWlsdGluQnVnIDogcHVibGljIEJ1Z1R5cGUgeworICBjb25zdCBzdGQ6OnN0cmluZyBkZXNjOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworcHVibGljOgorICBCdWlsdGluQnVnKGNsYXNzIENoZWNrTmFtZSBjaGVjaywgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pCisgICAgICA6IEJ1Z1R5cGUoY2hlY2ssIG5hbWUsIGNhdGVnb3JpZXM6OkxvZ2ljRXJyb3IpLCBkZXNjKGRlc2NyaXB0aW9uKSB7fQorCisgIEJ1aWx0aW5CdWcoY29uc3QgQ2hlY2tlckJhc2UgKmNoZWNrZXIsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pCisgICAgICA6IEJ1Z1R5cGUoY2hlY2tlciwgbmFtZSwgY2F0ZWdvcmllczo6TG9naWNFcnJvciksIGRlc2MoZGVzY3JpcHRpb24pIHt9CisKKyAgQnVpbHRpbkJ1Zyhjb25zdCBDaGVja2VyQmFzZSAqY2hlY2tlciwgY29uc3QgY2hhciAqbmFtZSkKKyAgICAgIDogQnVnVHlwZShjaGVja2VyLCBuYW1lLCBjYXRlZ29yaWVzOjpMb2dpY0Vycm9yKSwgZGVzYyhuYW1lKSB7fQorCisgIFN0cmluZ1JlZiBnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsgcmV0dXJuIGRlc2M7IH0KK307CisKK30gLy8gZW5kIGVudG8gbmFtZXNwYWNlCisKK30gLy8gZW5kIGNsYW5nIG5hbWVzcGFjZQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0J1Z1JlcG9ydGVyL0NvbW1vbkJ1Z0NhdGVnb3JpZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQnVnUmVwb3J0ZXIvQ29tbW9uQnVnQ2F0ZWdvcmllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODBlN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0J1Z1JlcG9ydGVyL0NvbW1vbkJ1Z0NhdGVnb3JpZXMuaApAQCAtMCwwICsxLDI2IEBACisvLz0tLS0gQ29tbW9uQnVnQ2F0ZWdvcmllcy5oIC0gUHJvdmlkZXMgY29tbW9uIGlzc3VlIGNhdGVnb3JpZXMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9CVUdSRVBPUlRFUl9DT01NT05CVUdDQVRFR09SSUVTX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX0JVR1JFUE9SVEVSX0NPTU1PTkJVR0NBVEVHT1JJRVNfSAorCisvLyBDb21tb24gc3RyaW5ncyB1c2VkIGZvciB0aGUgImNhdGVnb3J5IiBvZiBtYW55IHN0YXRpYyBhbmFseXplciBpc3N1ZXMuCituYW1lc3BhY2UgY2xhbmcgeworICBuYW1lc3BhY2UgZW50byB7CisgICAgbmFtZXNwYWNlIGNhdGVnb3JpZXMgeworICAgICAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBDb3JlRm91bmRhdGlvbk9iamVjdGl2ZUM7CisgICAgICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IExvZ2ljRXJyb3I7CisgICAgICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IE1lbW9yeUNvcmVGb3VuZGF0aW9uT2JqZWN0aXZlQzsKKyAgICAgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3QgTWVtb3J5RXJyb3I7CisgICAgICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IFVuaXhBUEk7CisgICAgfQorICB9Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9QYXRoRGlhZ25vc3RpYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9QYXRoRGlhZ25vc3RpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMTM2OWUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0J1Z1JlcG9ydGVyL1BhdGhEaWFnbm9zdGljLmgKQEAgLTAsMCArMSw4OTAgQEAKKy8vPT09LSBQYXRoRGlhZ25vc3RpYy5oIC0gUGF0aC1TcGVjaWZpYyBEaWFnbm9zdGljIEhhbmRsaW5nIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBQYXRoRGlhZ25vc3RpYy1yZWxhdGVkIGludGVyZmFjZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfQlVHUkVQT1JURVJfUEFUSERJQUdOT1NUSUNfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfQlVHUkVQT1JURVJfUEFUSERJQUdOT1NUSUNfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXQuaCIKKyNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9BbmFseXNpc0RlY2xDb250ZXh0LmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBbmFseXNpc0RlY2xDb250ZXh0OworY2xhc3MgQmluYXJ5T3BlcmF0b3I7CitjbGFzcyBDYWxsRW50ZXI7CitjbGFzcyBDYWxsRXhpdEVuZDsKK2NsYXNzIENhbGxFeHByOworY2xhc3MgQ29uZGl0aW9uYWxPcGVyYXRvcjsKK2NsYXNzIERlY2w7CitjbGFzcyBFeHByOworY2xhc3MgTG9jYXRpb25Db250ZXh0OworY2xhc3MgTWVtYmVyRXhwcjsKK2NsYXNzIFByb2dyYW1Qb2ludDsKK2NsYXNzIFNvdXJjZU1hbmFnZXI7CisKK25hbWVzcGFjZSBlbnRvIHsKKworY2xhc3MgRXhwbG9kZWROb2RlOworY2xhc3MgU3ltRXhwcjsKKwordXNpbmcgU3ltYm9sUmVmID0gY29uc3QgU3ltRXhwciAqOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSGlnaC1sZXZlbCBpbnRlcmZhY2UgZm9yIGhhbmRsZXJzIG9mIHBhdGgtc2Vuc2l0aXZlIGRpYWdub3N0aWNzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgUGF0aERpYWdub3N0aWM7CisKK2NsYXNzIFBhdGhEaWFnbm9zdGljQ29uc3VtZXIgeworcHVibGljOgorICBjbGFzcyBQREZpbGVFbnRyeSA6IHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CisgIHB1YmxpYzoKKyAgICBQREZpbGVFbnRyeShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZOb2RlSUQpIDogTm9kZUlEKE5vZGVJRCkge30KKworICAgIHVzaW5nIENvbnN1bWVyRmlsZXMgPSBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8U3RyaW5nUmVmLCBTdHJpbmdSZWY+PjsKKyAgICAKKyAgICAvLy8gXGJyaWVmIEEgdmVjdG9yIG9mIDxjb25zdW1lcixmaWxlPiBwYWlycy4KKyAgICBDb25zdW1lckZpbGVzIGZpbGVzOworICAgIAorICAgIC8vLyBcYnJpZWYgQSBwcmVjb21wdXRlZCBoYXNoIHRhZyB1c2VkIGZvciB1bmlxdWluZyBQREZpbGVFbnRyeSBvYmplY3RzLgorICAgIGNvbnN0IGxsdm06OkZvbGRpbmdTZXROb2RlSUQgTm9kZUlEOworCisgICAgLy8vIFxicmllZiBVc2VkIGZvciBwcm9maWxpbmcgaW4gdGhlIEZvbGRpbmdTZXQuCisgICAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSB7IElEID0gTm9kZUlEOyB9CisgIH07CisgIAorICBjbGFzcyBGaWxlc01hZGUgeworICAgIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgQWxsb2M7CisgICAgbGx2bTo6Rm9sZGluZ1NldDxQREZpbGVFbnRyeT4gU2V0OworCisgIHB1YmxpYzoKKyAgICB+RmlsZXNNYWRlKCk7CisKKyAgICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gU2V0LmVtcHR5KCk7IH0KKworICAgIHZvaWQgYWRkRGlhZ25vc3RpYyhjb25zdCBQYXRoRGlhZ25vc3RpYyAmUEQsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDb25zdW1lck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBmaWxlTmFtZSk7CisgICAgCisgICAgUERGaWxlRW50cnk6OkNvbnN1bWVyRmlsZXMgKmdldEZpbGVzKGNvbnN0IFBhdGhEaWFnbm9zdGljICZQRCk7CisgIH07CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHVibGljOgorICBQYXRoRGlhZ25vc3RpY0NvbnN1bWVyKCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIH5QYXRoRGlhZ25vc3RpY0NvbnN1bWVyKCk7CisKKyAgdm9pZCBGbHVzaERpYWdub3N0aWNzKEZpbGVzTWFkZSAqRmlsZXNNYWRlKTsKKworICB2aXJ0dWFsIHZvaWQgRmx1c2hEaWFnbm9zdGljc0ltcGwoc3RkOjp2ZWN0b3I8Y29uc3QgUGF0aERpYWdub3N0aWMgKj4gJkRpYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZXNNYWRlICpmaWxlc01hZGUpID0gMDsKKworICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgPSAwOworCisgIHZvaWQgSGFuZGxlUGF0aERpYWdub3N0aWMoc3RkOjp1bmlxdWVfcHRyPFBhdGhEaWFnbm9zdGljPiBEKTsKKworICBlbnVtIFBhdGhHZW5lcmF0aW9uU2NoZW1lIHsgTm9uZSwgTWluaW1hbCwgRXh0ZW5zaXZlLCBBbHRlcm5hdGVFeHRlbnNpdmUgfTsKKworICB2aXJ0dWFsIFBhdGhHZW5lcmF0aW9uU2NoZW1lIGdldEdlbmVyYXRpb25TY2hlbWUoKSBjb25zdCB7IHJldHVybiBNaW5pbWFsOyB9CisgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0xvZ2ljYWxPcENvbnRyb2xGbG93KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgUGF0aERpYWdub3N0aWNDb25zdW1lciBzdXBwb3J0cyBpbmRpdmlkdWFsCisgIC8vLyBQYXRoRGlhZ25vc3RpY3MgdGhhdCBzcGFuIG11bHRpcGxlIGZpbGVzLgorICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNDcm9zc0ZpbGVEaWFnbm9zdGljcygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKK3Byb3RlY3RlZDoKKyAgYm9vbCBmbHVzaGVkID0gZmFsc2U7CisgIGxsdm06OkZvbGRpbmdTZXQ8UGF0aERpYWdub3N0aWM+IERpYWdzOworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBhdGgtc2Vuc2l0aXZlIGRpYWdub3N0aWNzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgUGF0aERpYWdub3N0aWNSYW5nZSA6IHB1YmxpYyBTb3VyY2VSYW5nZSB7CitwdWJsaWM6CisgIGJvb2wgaXNQb2ludCA9IGZhbHNlOworCisgIFBhdGhEaWFnbm9zdGljUmFuZ2UoU291cmNlUmFuZ2UgUiwgYm9vbCBpc1AgPSBmYWxzZSkKKyAgICAgIDogU291cmNlUmFuZ2UoUiksIGlzUG9pbnQoaXNQKSB7fQorICBQYXRoRGlhZ25vc3RpY1JhbmdlKCkgPSBkZWZhdWx0OworfTsKKwordXNpbmcgTG9jYXRpb25PckFuYWx5c2lzRGVjbENvbnRleHQgPQorICAgIGxsdm06OlBvaW50ZXJVbmlvbjxjb25zdCBMb2NhdGlvbkNvbnRleHQgKiwgQW5hbHlzaXNEZWNsQ29udGV4dCAqPjsKKworY2xhc3MgUGF0aERpYWdub3N0aWNMb2NhdGlvbiB7Citwcml2YXRlOgorICBlbnVtIEtpbmQgeyBSYW5nZUssIFNpbmdsZUxvY0ssIFN0bXRLLCBEZWNsSyB9IEsgPSBTaW5nbGVMb2NLOworCisgIGNvbnN0IFN0bXQgKlMgPSBudWxscHRyOworICBjb25zdCBEZWNsICpEID0gbnVsbHB0cjsKKyAgY29uc3QgU291cmNlTWFuYWdlciAqU00gPSBudWxscHRyOworICBGdWxsU291cmNlTG9jIExvYzsKKyAgUGF0aERpYWdub3N0aWNSYW5nZSBSYW5nZTsKKworICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uKFNvdXJjZUxvY2F0aW9uIEwsIGNvbnN0IFNvdXJjZU1hbmFnZXIgJnNtLCBLaW5kIGtpbmQpCisgICAgICA6IEsoa2luZCksIFNNKCZzbSksIExvYyhnZW5Mb2NhdGlvbihMKSksIFJhbmdlKGdlblJhbmdlKCkpIHt9CisKKyAgRnVsbFNvdXJjZUxvYyBnZW5Mb2NhdGlvbigKKyAgICAgIFNvdXJjZUxvY2F0aW9uIEwgPSBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgTG9jYXRpb25PckFuYWx5c2lzRGVjbENvbnRleHQgTEFDID0gKEFuYWx5c2lzRGVjbENvbnRleHQgKiludWxscHRyKSBjb25zdDsKKworICBQYXRoRGlhZ25vc3RpY1JhbmdlIGdlblJhbmdlKAorICAgICAgTG9jYXRpb25PckFuYWx5c2lzRGVjbENvbnRleHQgTEFDID0gKEFuYWx5c2lzRGVjbENvbnRleHQgKiludWxscHRyKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQ3JlYXRlIGFuIGludmFsaWQgbG9jYXRpb24uCisgIFBhdGhEaWFnbm9zdGljTG9jYXRpb24oKSA9IGRlZmF1bHQ7CisKKyAgLy8vIENyZWF0ZSBhIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHN0YXRlbWVudC4KKyAgUGF0aERpYWdub3N0aWNMb2NhdGlvbihjb25zdCBTdG10ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJnNtLAorICAgICAgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uT3JBbmFseXNpc0RlY2xDb250ZXh0IGxhYykKKyAgICAgIDogSyhzLT5nZXRMb2NTdGFydCgpLmlzVmFsaWQoKSA/IFN0bXRLIDogU2luZ2xlTG9jSyksCisgICAgICAgIFMoSyA9PSBTdG10SyA/IHMgOiBudWxscHRyKSwgU00oJnNtKSwKKyAgICAgICAgTG9jKGdlbkxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKCksIGxhYykpLCBSYW5nZShnZW5SYW5nZShsYWMpKSB7CisgICAgYXNzZXJ0KEsgPT0gU2luZ2xlTG9jSyB8fCBTKTsKKyAgICBhc3NlcnQoSyA9PSBTaW5nbGVMb2NLIHx8IExvYy5pc1ZhbGlkKCkpOworICAgIGFzc2VydChLID09IFNpbmdsZUxvY0sgfHwgUmFuZ2UuaXNWYWxpZCgpKTsKKyAgfQorCisgIC8vLyBDcmVhdGUgYSBsb2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBkZWNsYXJhdGlvbi4KKyAgUGF0aERpYWdub3N0aWNMb2NhdGlvbihjb25zdCBEZWNsICpkLCBjb25zdCBTb3VyY2VNYW5hZ2VyICZzbSkKKyAgICAgIDogSyhEZWNsSyksIEQoZCksIFNNKCZzbSksIExvYyhnZW5Mb2NhdGlvbigpKSwgUmFuZ2UoZ2VuUmFuZ2UoKSkgeworICAgIGFzc2VydChEKTsKKyAgICBhc3NlcnQoTG9jLmlzVmFsaWQoKSk7CisgICAgYXNzZXJ0KFJhbmdlLmlzVmFsaWQoKSk7CisgIH0KKworICAvLy8gQ3JlYXRlIGEgbG9jYXRpb24gYXQgYW4gZXhwbGljaXQgb2Zmc2V0IGluIHRoZSBzb3VyY2UuCisgIC8vLworICAvLy8gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGlmIHRoZXJlIGFyZSBubyBtb3JlIGFwcHJvcHJpYXRlIGNvbnN0cnVjdG9ycy4KKyAgUGF0aERpYWdub3N0aWNMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBsb2MsIGNvbnN0IFNvdXJjZU1hbmFnZXIgJnNtKQorICAgICAgOiBTTSgmc20pLCBMb2MobG9jLCBzbSksIFJhbmdlKGdlblJhbmdlKCkpIHsKKyAgICBhc3NlcnQoTG9jLmlzVmFsaWQoKSk7CisgICAgYXNzZXJ0KFJhbmdlLmlzVmFsaWQoKSk7CisgIH0KKworICAvLy8gQ3JlYXRlIGEgbG9jYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZGVjbGFyYXRpb24uCisgIHN0YXRpYyBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIGNyZWF0ZShjb25zdCBEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00pIHsKKyAgICByZXR1cm4gUGF0aERpYWdub3N0aWNMb2NhdGlvbihELCBTTSk7CisgIH0KKworICAvLy8gQ3JlYXRlIGEgbG9jYXRpb24gZm9yIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRlY2xhcmF0aW9uLgorICBzdGF0aWMgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBjcmVhdGVCZWdpbihjb25zdCBEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSk7CisKKyAgLy8vIENyZWF0ZSBhIGxvY2F0aW9uIGZvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdGF0ZW1lbnQuCisgIHN0YXRpYyBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIGNyZWF0ZUJlZ2luKGNvbnN0IFN0bXQgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbk9yQW5hbHlzaXNEZWNsQ29udGV4dCBMQUMpOworCisgIC8vLyBDcmVhdGUgYSBsb2NhdGlvbiBmb3IgdGhlIGVuZCBvZiB0aGUgc3RhdGVtZW50LgorICAvLy8KKyAgLy8vIElmIHRoZSBzdGF0ZW1lbnQgaXMgYSBDb21wb3VuZFN0YXRlbWVudCwgdGhlIGxvY2F0aW9uIHdpbGwgcG9pbnQgdG8gdGhlCisgIC8vLyBjbG9zaW5nIGJyYWNlIGluc3RlYWQgb2YgZm9sbG93aW5nIGl0LgorICBzdGF0aWMgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBjcmVhdGVFbmQoY29uc3QgU3RtdCAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25PckFuYWx5c2lzRGVjbENvbnRleHQgTEFDKTsKKworICAvLy8gQ3JlYXRlIHRoZSBsb2NhdGlvbiBmb3IgdGhlIG9wZXJhdG9yIG9mIHRoZSBiaW5hcnkgZXhwcmVzc2lvbi4KKyAgLy8vIEFzc3VtZXMgdGhlIHN0YXRlbWVudCBoYXMgYSB2YWxpZCBsb2NhdGlvbi4KKyAgc3RhdGljIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gY3JlYXRlT3BlcmF0b3JMb2MoY29uc3QgQmluYXJ5T3BlcmF0b3IgKkJPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSk7CisgIHN0YXRpYyBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIGNyZWF0ZUNvbmRpdGlvbmFsQ29sb25Mb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbmRpdGlvbmFsT3BlcmF0b3IgKkNPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSk7CisKKyAgLy8vIEZvciBtZW1iZXIgZXhwcmVzc2lvbnMsIHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlICcuJyBvciAnLT4nLgorICAvLy8gQXNzdW1lcyB0aGUgc3RhdGVtZW50IGhhcyBhIHZhbGlkIGxvY2F0aW9uLgorICBzdGF0aWMgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBjcmVhdGVNZW1iZXJMb2MoY29uc3QgTWVtYmVyRXhwciAqTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSk7CisKKyAgLy8vIENyZWF0ZSBhIGxvY2F0aW9uIGZvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb21wb3VuZCBzdGF0ZW1lbnQuCisgIC8vLyBBc3N1bWVzIHRoZSBzdGF0ZW1lbnQgaGFzIGEgdmFsaWQgbG9jYXRpb24uCisgIHN0YXRpYyBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIGNyZWF0ZUJlZ2luQnJhY2UoY29uc3QgQ29tcG91bmRTdG10ICpDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSk7CisKKyAgLy8vIENyZWF0ZSBhIGxvY2F0aW9uIGZvciB0aGUgZW5kIG9mIHRoZSBjb21wb3VuZCBzdGF0ZW1lbnQuCisgIC8vLyBBc3N1bWVzIHRoZSBzdGF0ZW1lbnQgaGFzIGEgdmFsaWQgbG9jYXRpb24uCisgIHN0YXRpYyBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIGNyZWF0ZUVuZEJyYWNlKGNvbnN0IENvbXBvdW5kU3RtdCAqQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKTsKKworICAvLy8gQ3JlYXRlIGEgbG9jYXRpb24gZm9yIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGVuY2xvc2luZyBkZWNsYXJhdGlvbiBib2R5LgorICAvLy8gRGVmYXVsdHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBkZWNsYXJhdGlvbiBib2R5LgorICBzdGF0aWMgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBjcmVhdGVEZWNsQmVnaW4oY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKTsKKworICAvLy8gQ29uc3RydWN0cyBhIGxvY2F0aW9uIGZvciB0aGUgZW5kIG9mIHRoZSBlbmNsb3NpbmcgZGVjbGFyYXRpb24gYm9keS4KKyAgLy8vIERlZmF1bHRzIHRvIHRoZSBlbmQgb2YgYnJhY2UuCisgIHN0YXRpYyBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIGNyZWF0ZURlY2xFbmQoY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKTsKKworICAvLy8gQ3JlYXRlIGEgbG9jYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdmFsaWQgRXhwbG9kZWROb2RlLgorICBzdGF0aWMgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBjcmVhdGUoY29uc3QgUHJvZ3JhbVBvaW50ICZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU01uZyk7CisKKyAgLy8vIENyZWF0ZSBhIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5leHQgdmFsaWQgRXhwbG9kZWROb2RlIGFzIGVuZAorICAvLy8gb2YgcGF0aCBsb2NhdGlvbi4KKyAgc3RhdGljIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gY3JlYXRlRW5kT2ZQYXRoKGNvbnN0IEV4cGxvZGVkTm9kZSogTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKTsKKworICAvLy8gQ29udmVydCB0aGUgZ2l2ZW4gbG9jYXRpb24gaW50byBhIHNpbmdsZSBraW5kIGxvY2F0aW9uLgorICBzdGF0aWMgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBjcmVhdGVTaW5nbGVMb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhdGhEaWFnbm9zdGljTG9jYXRpb24gJlBETCk7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBhdGhEaWFnbm9zdGljTG9jYXRpb24gJlgpIGNvbnN0IHsKKyAgICByZXR1cm4gSyA9PSBYLksgJiYgTG9jID09IFguTG9jICYmIFJhbmdlID09IFguUmFuZ2U7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgUGF0aERpYWdub3N0aWNMb2NhdGlvbiAmWCkgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IFgpOworICB9CisKKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgIHJldHVybiBTTSAhPSBudWxscHRyOworICB9CisKKyAgRnVsbFNvdXJjZUxvYyBhc0xvY2F0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBMb2M7CisgIH0KKworICBQYXRoRGlhZ25vc3RpY1JhbmdlIGFzUmFuZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIFJhbmdlOworICB9CisKKyAgY29uc3QgU3RtdCAqYXNTdG10KCkgY29uc3QgeyBhc3NlcnQoaXNWYWxpZCgpKTsgcmV0dXJuIFM7IH0KKyAgY29uc3QgRGVjbCAqYXNEZWNsKCkgY29uc3QgeyBhc3NlcnQoaXNWYWxpZCgpKTsgcmV0dXJuIEQ7IH0KKworICBib29sIGhhc1JhbmdlKCkgY29uc3QgeyByZXR1cm4gSyA9PSBTdG10SyB8fCBLID09IFJhbmdlSyB8fCBLID09IERlY2xLOyB9CisKKyAgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICp0aGlzID0gUGF0aERpYWdub3N0aWNMb2NhdGlvbigpOworICB9CisKKyAgdm9pZCBmbGF0dGVuKCk7CisKKyAgY29uc3QgU291cmNlTWFuYWdlciYgZ2V0TWFuYWdlcigpIGNvbnN0IHsgYXNzZXJ0KGlzVmFsaWQoKSk7IHJldHVybiAqU007IH0KKyAgCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Q7CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHaXZlbiBhbiBleHBsb2RlZCBub2RlLCByZXRyaWV2ZSB0aGUgc3RhdGVtZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgCisgIC8vLyBmb3IgdGhlIGRpYWdub3N0aWMgbG9jYXRpb24uCisgIHN0YXRpYyBjb25zdCBTdG10ICpnZXRTdG10KGNvbnN0IEV4cGxvZGVkTm9kZSAqTik7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc3RhdGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN1Y2Nlc3NvciBub2RlLgorICBzdGF0aWMgY29uc3QgU3RtdCAqZ2V0TmV4dFN0bXQoY29uc3QgRXhwbG9kZWROb2RlICpOKTsKK307CisKK2NsYXNzIFBhdGhEaWFnbm9zdGljTG9jYXRpb25QYWlyIHsKK3ByaXZhdGU6CisgIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gU3RhcnQsIEVuZDsKKworcHVibGljOgorICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uUGFpcihjb25zdCBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uICZzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGF0aERpYWdub3N0aWNMb2NhdGlvbiAmZW5kKQorICAgICAgOiBTdGFydChzdGFydCksIEVuZChlbmQpIHt9CisKKyAgY29uc3QgUGF0aERpYWdub3N0aWNMb2NhdGlvbiAmZ2V0U3RhcnQoKSBjb25zdCB7IHJldHVybiBTdGFydDsgfQorICBjb25zdCBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uICZnZXRFbmQoKSBjb25zdCB7IHJldHVybiBFbmQ7IH0KKworICB2b2lkIHNldFN0YXJ0KGNvbnN0IFBhdGhEaWFnbm9zdGljTG9jYXRpb24gJkwpIHsgU3RhcnQgPSBMOyB9CisgIHZvaWQgc2V0RW5kKGNvbnN0IFBhdGhEaWFnbm9zdGljTG9jYXRpb24gJkwpIHsgRW5kID0gTDsgfQorCisgIHZvaWQgZmxhdHRlbigpIHsKKyAgICBTdGFydC5mbGF0dGVuKCk7CisgICAgRW5kLmZsYXR0ZW4oKTsKKyAgfQorICAKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7CisgICAgU3RhcnQuUHJvZmlsZShJRCk7CisgICAgRW5kLlByb2ZpbGUoSUQpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUGF0aCAicGllY2VzIiBmb3IgcGF0aC1zZW5zaXRpdmUgZGlhZ25vc3RpY3MuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBQYXRoRGlhZ25vc3RpY1BpZWNlOiBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworcHVibGljOgorICBlbnVtIEtpbmQgeyBDb250cm9sRmxvdywgRXZlbnQsIE1hY3JvLCBDYWxsLCBOb3RlIH07CisgIGVudW0gRGlzcGxheUhpbnQgeyBBYm92ZSwgQmVsb3cgfTsKKworcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcgc3RyOworICBjb25zdCBLaW5kIGtpbmQ7CisgIGNvbnN0IERpc3BsYXlIaW50IEhpbnQ7CisKKyAgLy8vIFxicmllZiBJbiB0aGUgY29udGFpbmluZyBidWcgcmVwb3J0LCB0aGlzIHBpZWNlIGlzIHRoZSBsYXN0IHBpZWNlIGZyb20KKyAgLy8vIHRoZSBtYWluIHNvdXJjZSBmaWxlLgorICBib29sIExhc3RJbk1haW5Tb3VyY2VGaWxlID0gZmFsc2U7CisgIAorICAvLy8gQSBjb25zdGFudCBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCB0byB0YWcgdGhlIFBhdGhEaWFnbm9zdGljUGllY2UsCisgIC8vLyB0eXBpY2FsbHkgd2l0aCB0aGUgaWRlbnRpZmljYXRpb24gb2YgdGhlIGNyZWF0b3IuICBUaGUgYWN0dWFsIHBvaW50ZXIKKyAgLy8vIHZhbHVlIGlzIG1lYW50IHRvIGJlIGFuIGlkZW50aWZpZXI7IHRoZSBzdHJpbmcgaXRzZWxmIGlzIHVzZWZ1bCBmb3IKKyAgLy8vIGRlYnVnZ2luZy4KKyAgU3RyaW5nUmVmIFRhZzsKKworICBzdGQ6OnZlY3RvcjxTb3VyY2VSYW5nZT4gcmFuZ2VzOworCitwcm90ZWN0ZWQ6CisgIFBhdGhEaWFnbm9zdGljUGllY2UoU3RyaW5nUmVmIHMsIEtpbmQgaywgRGlzcGxheUhpbnQgaGludCA9IEJlbG93KTsKKyAgUGF0aERpYWdub3N0aWNQaWVjZShLaW5kIGssIERpc3BsYXlIaW50IGhpbnQgPSBCZWxvdyk7CisKK3B1YmxpYzoKKyAgUGF0aERpYWdub3N0aWNQaWVjZSgpID0gZGVsZXRlOworICBQYXRoRGlhZ25vc3RpY1BpZWNlKGNvbnN0IFBhdGhEaWFnbm9zdGljUGllY2UgJikgPSBkZWxldGU7CisgIFBhdGhEaWFnbm9zdGljUGllY2UgJm9wZXJhdG9yPShjb25zdCBQYXRoRGlhZ25vc3RpY1BpZWNlICYpID0gZGVsZXRlOworICB2aXJ0dWFsIH5QYXRoRGlhZ25vc3RpY1BpZWNlKCk7CisKKyAgU3RyaW5nUmVmIGdldFN0cmluZygpIGNvbnN0IHsgcmV0dXJuIHN0cjsgfQorCisgIC8vLyBUYWcgdGhpcyBQYXRoRGlhZ25vc3RpY1BpZWNlIHdpdGggdGhlIGdpdmVuIEMtc3RyaW5nLgorICB2b2lkIHNldFRhZyhjb25zdCBjaGFyICp0YWcpIHsgVGFnID0gdGFnOyB9CisgIAorICAvLy8gUmV0dXJuIHRoZSBvcGFxdWUgdGFnIChpZiBhbnkpIG9uIHRoZSBQYXRoRGlhZ25vc3RpY1BpZWNlLgorICBjb25zdCB2b2lkICpnZXRUYWcoKSBjb25zdCB7IHJldHVybiBUYWcuZGF0YSgpOyB9CisgIAorICAvLy8gUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRhZy4gIFRoaXMgaXMgdXNlZnVsCisgIC8vLyBmb3IgZGVidWdnaW5nLgorICBTdHJpbmdSZWYgZ2V0VGFnU3RyKCkgY29uc3QgeyByZXR1cm4gVGFnOyB9CisgIAorICAvLy8gZ2V0RGlzcGxheUhpbnQgLSBSZXR1cm4gYSBoaW50IGluZGljYXRpbmcgd2hlcmUgdGhlIGRpYWdub3N0aWMgc2hvdWxkCisgIC8vLyAgYmUgZGlzcGxheWVkIGJ5IHRoZSBQYXRoRGlhZ25vc3RpY0NvbnN1bWVyLgorICBEaXNwbGF5SGludCBnZXREaXNwbGF5SGludCgpIGNvbnN0IHsgcmV0dXJuIEhpbnQ7IH0KKworICB2aXJ0dWFsIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBmbGF0dGVuTG9jYXRpb25zKCkgPSAwOworCisgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIGtpbmQ7IH0KKworICB2b2lkIGFkZFJhbmdlKFNvdXJjZVJhbmdlIFIpIHsKKyAgICBpZiAoIVIuaXNWYWxpZCgpKQorICAgICAgcmV0dXJuOworICAgIHJhbmdlcy5wdXNoX2JhY2soUik7CisgIH0KKworICB2b2lkIGFkZFJhbmdlKFNvdXJjZUxvY2F0aW9uIEIsIFNvdXJjZUxvY2F0aW9uIEUpIHsKKyAgICBpZiAoIUIuaXNWYWxpZCgpIHx8ICFFLmlzVmFsaWQoKSkKKyAgICAgIHJldHVybjsKKyAgICByYW5nZXMucHVzaF9iYWNrKFNvdXJjZVJhbmdlKEIsRSkpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgU291cmNlUmFuZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFBhdGhEaWFnbm9zdGljUGllY2UuCisgIEFycmF5UmVmPFNvdXJjZVJhbmdlPiBnZXRSYW5nZXMoKSBjb25zdCB7IHJldHVybiByYW5nZXM7IH0KKworICB2aXJ0dWFsIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Q7CisKKyAgdm9pZCBzZXRBc0xhc3RJbk1haW5Tb3VyY2VGaWxlKCkgeworICAgIExhc3RJbk1haW5Tb3VyY2VGaWxlID0gdHJ1ZTsKKyAgfQorCisgIGJvb2wgaXNMYXN0SW5NYWluU291cmNlRmlsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTGFzdEluTWFpblNvdXJjZUZpbGU7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZHVtcCgpIGNvbnN0ID0gMDsKK307CisKK2NsYXNzIFBhdGhQaWVjZXMgOiBwdWJsaWMgc3RkOjpsaXN0PHN0ZDo6c2hhcmVkX3B0cjxQYXRoRGlhZ25vc3RpY1BpZWNlPj4geworICB2b2lkIGZsYXR0ZW5UbyhQYXRoUGllY2VzICZQcmltYXJ5LCBQYXRoUGllY2VzICZDdXJyZW50LAorICAgICAgICAgICAgICAgICBib29sIFNob3VsZEZsYXR0ZW5NYWNyb3MpIGNvbnN0OworCitwdWJsaWM6CisgIFBhdGhQaWVjZXMgZmxhdHRlbihib29sIFNob3VsZEZsYXR0ZW5NYWNyb3MpIGNvbnN0IHsKKyAgICBQYXRoUGllY2VzIFJlc3VsdDsKKyAgICBmbGF0dGVuVG8oUmVzdWx0LCBSZXN1bHQsIFNob3VsZEZsYXR0ZW5NYWNyb3MpOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKK2NsYXNzIFBhdGhEaWFnbm9zdGljU3BvdFBpZWNlIDogcHVibGljIFBhdGhEaWFnbm9zdGljUGllY2UgeworcHJpdmF0ZToKKyAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBQb3M7CisKK3B1YmxpYzoKKyAgUGF0aERpYWdub3N0aWNTcG90UGllY2UoY29uc3QgUGF0aERpYWdub3N0aWNMb2NhdGlvbiAmcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aERpYWdub3N0aWNQaWVjZTo6S2luZCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZFBvc1JhbmdlID0gdHJ1ZSkKKyAgICAgIDogUGF0aERpYWdub3N0aWNQaWVjZShzLCBrKSwgUG9zKHBvcykgeworICAgIGFzc2VydChQb3MuaXNWYWxpZCgpICYmIFBvcy5hc0xvY2F0aW9uKCkuaXNWYWxpZCgpICYmCisgICAgICAgICAgICJQYXRoRGlhZ25vc3RpY1Nwb3RQaWVjZSdzIG11c3QgaGF2ZSBhIHZhbGlkIGxvY2F0aW9uLiIpOworICAgIGlmIChhZGRQb3NSYW5nZSAmJiBQb3MuaGFzUmFuZ2UoKSkgYWRkUmFuZ2UoUG9zLmFzUmFuZ2UoKSk7CisgIH0KKworICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gUG9zOyB9CisgIHZvaWQgZmxhdHRlbkxvY2F0aW9ucygpIG92ZXJyaWRlIHsgUG9zLmZsYXR0ZW4oKTsgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBQYXRoRGlhZ25vc3RpY1BpZWNlICpQKSB7CisgICAgcmV0dXJuIFAtPmdldEtpbmQoKSA9PSBFdmVudCB8fCBQLT5nZXRLaW5kKCkgPT0gTWFjcm8gfHwKKyAgICAgICAgICAgUC0+Z2V0S2luZCgpID09IE5vdGU7CisgIH0KK307CisKKy8vLyBcYnJpZWYgSW50ZXJmYWNlIGZvciBjbGFzc2VzIGNvbnN0cnVjdGluZyBTdGFjayBoaW50cy4KKy8vLworLy8vIElmIGEgUGF0aERpYWdub3N0aWNFdmVudCBvY2N1cnMgaW4gYSBkaWZmZXJlbnQgZnJhbWUgdGhhbiB0aGUgZmluYWwgCisvLy8gZGlhZ25vc3RpYyB0aGUgaGludHMgY2FuIGJlIHVzZWQgdG8gc3VtbWFyaXplIHRoZSBlZmZlY3Qgb2YgdGhlIGNhbGwuCitjbGFzcyBTdGFja0hpbnRHZW5lcmF0b3IgeworcHVibGljOgorICB2aXJ0dWFsIH5TdGFja0hpbnRHZW5lcmF0b3IoKSA9IDA7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgdGhlIERpYWdub3N0aWMgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIEV4cGxvZGVkTm9kZS4KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRNZXNzYWdlKGNvbnN0IEV4cGxvZGVkTm9kZSAqTikgPSAwOworfTsKKworLy8vIFxicmllZiBDb25zdHJ1Y3RzIGEgU3RhY2sgaGludCBmb3IgdGhlIGdpdmVuIHN5bWJvbC4KKy8vLworLy8vIFRoZSBjbGFzcyBrbm93cyBob3cgdG8gY29uc3RydWN0IHRoZSBzdGFjayBoaW50IG1lc3NhZ2UgYmFzZWQgb24KKy8vLyB0cmF2ZXJzaW5nIHRoZSBDYWxsRXhwciBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGwgYW5kIGNoZWNraW5nIGlmIHRoZSBnaXZlbgorLy8vIHN5bWJvbCBpcyByZXR1cm5lZCBvciBpcyBvbmUgb2YgdGhlIGFyZ3VtZW50cy4KKy8vLyBUaGUgaGludCBjYW4gYmUgY3VzdG9taXplZCBieSByZWRlZmluaW5nICdnZXRNZXNzYWdlRm9yWCgpJyBtZXRob2RzLgorY2xhc3MgU3RhY2tIaW50R2VuZXJhdG9yRm9yU3ltYm9sIDogcHVibGljIFN0YWNrSGludEdlbmVyYXRvciB7Citwcml2YXRlOgorICBTeW1ib2xSZWYgU3ltOworICBzdGQ6OnN0cmluZyBNc2c7CisKK3B1YmxpYzoKKyAgU3RhY2tIaW50R2VuZXJhdG9yRm9yU3ltYm9sKFN5bWJvbFJlZiBTLCBTdHJpbmdSZWYgTSkgOiBTeW0oUyksIE1zZyhNKSB7fQorICB+U3RhY2tIaW50R2VuZXJhdG9yRm9yU3ltYm9sKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIC8vLyBcYnJpZWYgU2VhcmNoIHRoZSBjYWxsIGV4cHJlc3Npb24gZm9yIHRoZSBzeW1ib2wgU3ltIGFuZCBkaXNwYXRjaCB0aGUKKyAgLy8vICdnZXRNZXNzYWdlRm9yWCgpJyBtZXRob2RzIHRvIGNvbnN0cnVjdCBhIHNwZWNpZmljIG1lc3NhZ2UuCisgIHN0ZDo6c3RyaW5nIGdldE1lc3NhZ2UoY29uc3QgRXhwbG9kZWROb2RlICpOKSBvdmVycmlkZTsKKworICAvLy8gUHJvZHVjZXMgdGhlIG1lc3NhZ2Ugb2YgdGhlIGZvbGxvd2luZyBmb3JtOgorICAvLy8gICAnTXNnIHZpYSBOdGggcGFyYW1ldGVyJworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldE1lc3NhZ2VGb3JBcmcoY29uc3QgRXhwciAqQXJnRSwgdW5zaWduZWQgQXJnSW5kZXgpOworCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0TWVzc2FnZUZvclJldHVybihjb25zdCBDYWxsRXhwciAqQ2FsbEV4cHIpIHsKKyAgICByZXR1cm4gTXNnOworICB9CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRNZXNzYWdlRm9yU3ltYm9sTm90Rm91bmQoKSB7CisgICAgcmV0dXJuIE1zZzsKKyAgfQorfTsKKworY2xhc3MgUGF0aERpYWdub3N0aWNFdmVudFBpZWNlIDogcHVibGljIFBhdGhEaWFnbm9zdGljU3BvdFBpZWNlIHsKKyAgT3B0aW9uYWw8Ym9vbD4gSXNQcnVuYWJsZTsKKworICAvLy8gSWYgdGhlIGV2ZW50IG9jY3VycyBpbiBhIGRpZmZlcmVudCBmcmFtZSB0aGFuIHRoZSBmaW5hbCBkaWFnbm9zdGljLAorICAvLy8gc3VwcGx5IGEgbWVzc2FnZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjb25zdHJ1Y3QgYW4gZXh0cmEgaGludCBvbiB0aGUKKyAgLy8vIHJldHVybnMgZnJvbSBhbGwgdGhlIGNhbGxzIG9uIHRoZSBzdGFjayBmcm9tIHRoaXMgZXZlbnQgdG8gdGhlIGZpbmFsCisgIC8vLyBkaWFnbm9zdGljLgorICBzdGQ6OnVuaXF1ZV9wdHI8U3RhY2tIaW50R2VuZXJhdG9yPiBDYWxsU3RhY2tIaW50OworCitwdWJsaWM6CisgIFBhdGhEaWFnbm9zdGljRXZlbnRQaWVjZShjb25zdCBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uICZwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgcywgYm9vbCBhZGRQb3NSYW5nZSA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFja0hpbnRHZW5lcmF0b3IgKnN0YWNrSGludCA9IG51bGxwdHIpCisgICAgICA6IFBhdGhEaWFnbm9zdGljU3BvdFBpZWNlKHBvcywgcywgRXZlbnQsIGFkZFBvc1JhbmdlKSwKKyAgICAgICAgQ2FsbFN0YWNrSGludChzdGFja0hpbnQpIHt9CisgIH5QYXRoRGlhZ25vc3RpY0V2ZW50UGllY2UoKSBvdmVycmlkZTsKKworICAvLy8gTWFyayB0aGUgZGlhZ25vc3RpYyBwaWVjZSBhcyBiZWluZyBwb3RlbnRpYWxseSBwcnVuYWJsZS4gIFRoaXMKKyAgLy8vIGZsYWcgbWF5IGhhdmUgYmVlbiBwcmV2aW91c2x5IHNldCwgYXQgd2hpY2ggcG9pbnQgaXQgd2lsbCBub3QKKyAgLy8vIGJlIHJlc2V0IHVubGVzcyBvbmUgc3BlY2lmaWVzIHRvIGRvIHNvLgorICB2b2lkIHNldFBydW5hYmxlKGJvb2wgaXNQcnVuYWJsZSwgYm9vbCBvdmVycmlkZSA9IGZhbHNlKSB7CisgICAgaWYgKElzUHJ1bmFibGUuaGFzVmFsdWUoKSAmJiAhb3ZlcnJpZGUpCisgICAgIHJldHVybjsKKyAgICBJc1BydW5hYmxlID0gaXNQcnVuYWJsZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZGlhZ25vc3RpYyBwaWVjZSBpcyBwcnVuYWJsZS4KKyAgYm9vbCBpc1BydW5hYmxlKCkgY29uc3QgeworICAgIHJldHVybiBJc1BydW5hYmxlLmhhc1ZhbHVlKCkgPyBJc1BydW5hYmxlLmdldFZhbHVlKCkgOiBmYWxzZTsKKyAgfQorCisgIGJvb2wgaGFzQ2FsbFN0YWNrSGludCgpIHsgcmV0dXJuIChib29sKUNhbGxTdGFja0hpbnQ7IH0KKworICAvLy8gUHJvZHVjZSB0aGUgaGludCBmb3IgdGhlIGdpdmVuIG5vZGUuIFRoZSBub2RlIGNvbnRhaW5zIAorICAvLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhbGwgZm9yIHdoaWNoIHRoZSBkaWFnbm9zdGljIGNhbiBiZSBnZW5lcmF0ZWQuCisgIHN0ZDo6c3RyaW5nIGdldENhbGxTdGFja01lc3NhZ2UoY29uc3QgRXhwbG9kZWROb2RlICpOKSB7CisgICAgaWYgKENhbGxTdGFja0hpbnQpCisgICAgICByZXR1cm4gQ2FsbFN0YWNrSGludC0+Z2V0TWVzc2FnZShOKTsKKyAgICByZXR1cm4ge307ICAKKyAgfQorCisgIHZvaWQgZHVtcCgpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgUGF0aERpYWdub3N0aWNQaWVjZSAqUCkgeworICAgIHJldHVybiBQLT5nZXRLaW5kKCkgPT0gRXZlbnQ7CisgIH0KK307CisKK2NsYXNzIFBhdGhEaWFnbm9zdGljQ2FsbFBpZWNlIDogcHVibGljIFBhdGhEaWFnbm9zdGljUGllY2UgeworICBjb25zdCBEZWNsICpDYWxsZXI7CisgIGNvbnN0IERlY2wgKkNhbGxlZSA9IG51bGxwdHI7CisKKyAgLy8gRmxhZyBzaWduaWZ5aW5nIHRoYXQgdGhpcyBkaWFnbm9zdGljIGhhcyBvbmx5IGNhbGwgZW50ZXIgYW5kIG5vIG1hdGNoaW5nCisgIC8vIGNhbGwgZXhpdC4KKyAgYm9vbCBOb0V4aXQ7CisKKyAgLy8gRmxhZyBzaWduaWZ5aW5nIHRoYXQgdGhlIGNhbGxlZSBmdW5jdGlvbiBpcyBhbiBPYmplY3RpdmUtQyBhdXRvc3ludGhlc2l6ZWQKKyAgLy8gcHJvcGVydHkgZ2V0dGVyIG9yIHNldHRlci4KKyAgYm9vbCBJc0NhbGxlZUFuQXV0b3N5bnRoZXNpemVkUHJvcGVydHlBY2Nlc3NvciA9IGZhbHNlOworCisgIC8vIFRoZSBjdXN0b20gc3RyaW5nLCB3aGljaCBzaG91bGQgYXBwZWFyIGFmdGVyIHRoZSBjYWxsIFJldHVybiBEaWFnbm9zdGljLgorICAvLyBUT0RPOiBTaG91bGQgd2UgYWxsb3cgbXVsdGlwbGUgZGlhZ25vc3RpY3M/CisgIHN0ZDo6c3RyaW5nIENhbGxTdGFja01lc3NhZ2U7CisKKyAgUGF0aERpYWdub3N0aWNDYWxsUGllY2UoY29uc3QgRGVjbCAqY2FsbGVyRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGF0aERpYWdub3N0aWNMb2NhdGlvbiAmY2FsbFJldHVyblBvcykKKyAgICAgIDogUGF0aERpYWdub3N0aWNQaWVjZShDYWxsKSwgQ2FsbGVyKGNhbGxlckQpLCBOb0V4aXQoZmFsc2UpLAorICAgICAgICBjYWxsUmV0dXJuKGNhbGxSZXR1cm5Qb3MpIHt9CisgIFBhdGhEaWFnbm9zdGljQ2FsbFBpZWNlKFBhdGhQaWVjZXMgJm9sZFBhdGgsIGNvbnN0IERlY2wgKmNhbGxlcikKKyAgICAgIDogUGF0aERpYWdub3N0aWNQaWVjZShDYWxsKSwgQ2FsbGVyKGNhbGxlciksIE5vRXhpdCh0cnVlKSwKKyAgICAgICAgcGF0aChvbGRQYXRoKSB7fQorCitwdWJsaWM6CisgIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gY2FsbEVudGVyOworICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIGNhbGxFbnRlcldpdGhpbjsKKyAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBjYWxsUmV0dXJuOyAgCisgIFBhdGhQaWVjZXMgcGF0aDsKKworICB+UGF0aERpYWdub3N0aWNDYWxsUGllY2UoKSBvdmVycmlkZTsKKworICBjb25zdCBEZWNsICpnZXRDYWxsZXIoKSBjb25zdCB7IHJldHVybiBDYWxsZXI7IH0KKyAgCisgIGNvbnN0IERlY2wgKmdldENhbGxlZSgpIGNvbnN0IHsgcmV0dXJuIENhbGxlZTsgfQorICB2b2lkIHNldENhbGxlZShjb25zdCBDYWxsRW50ZXIgJkNFLCBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSk7CisgIAorICBib29sIGhhc0NhbGxTdGFja01lc3NhZ2UoKSB7IHJldHVybiAhQ2FsbFN0YWNrTWVzc2FnZS5lbXB0eSgpOyB9CisgIHZvaWQgc2V0Q2FsbFN0YWNrTWVzc2FnZShTdHJpbmdSZWYgc3QpIHsgQ2FsbFN0YWNrTWVzc2FnZSA9IHN0OyB9CisKKyAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBnZXRMb2NhdGlvbigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGNhbGxFbnRlcjsgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxQYXRoRGlhZ25vc3RpY0V2ZW50UGllY2U+IGdldENhbGxFbnRlckV2ZW50KCkgY29uc3Q7CisgIHN0ZDo6c2hhcmVkX3B0cjxQYXRoRGlhZ25vc3RpY0V2ZW50UGllY2U+CisgIGdldENhbGxFbnRlcldpdGhpbkNhbGxlckV2ZW50KCkgY29uc3Q7CisgIHN0ZDo6c2hhcmVkX3B0cjxQYXRoRGlhZ25vc3RpY0V2ZW50UGllY2U+IGdldENhbGxFeGl0RXZlbnQoKSBjb25zdDsKKworICB2b2lkIGZsYXR0ZW5Mb2NhdGlvbnMoKSBvdmVycmlkZSB7CisgICAgY2FsbEVudGVyLmZsYXR0ZW4oKTsKKyAgICBjYWxsUmV0dXJuLmZsYXR0ZW4oKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBwYXRoKQorICAgICAgSS0+ZmxhdHRlbkxvY2F0aW9ucygpOworICB9CisKKyAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxQYXRoRGlhZ25vc3RpY0NhbGxQaWVjZT4KKyAgY29uc3RydWN0KGNvbnN0IEV4cGxvZGVkTm9kZSAqTiwgY29uc3QgQ2FsbEV4aXRFbmQgJkNFLAorICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00pOworCisgIHN0YXRpYyBQYXRoRGlhZ25vc3RpY0NhbGxQaWVjZSAqY29uc3RydWN0KFBhdGhQaWVjZXMgJnBpZWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbCAqY2FsbGVyKTsKKworICB2b2lkIGR1bXAoKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgUGF0aERpYWdub3N0aWNQaWVjZSAqUCkgeworICAgIHJldHVybiBQLT5nZXRLaW5kKCkgPT0gQ2FsbDsKKyAgfQorfTsKKworY2xhc3MgUGF0aERpYWdub3N0aWNDb250cm9sRmxvd1BpZWNlIDogcHVibGljIFBhdGhEaWFnbm9zdGljUGllY2UgeworICBzdGQ6OnZlY3RvcjxQYXRoRGlhZ25vc3RpY0xvY2F0aW9uUGFpcj4gTFBhaXJzOworCitwdWJsaWM6CisgIFBhdGhEaWFnbm9zdGljQ29udHJvbEZsb3dQaWVjZShjb25zdCBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uICZzdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhdGhEaWFnbm9zdGljTG9jYXRpb24gJmVuZFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBzKQorICAgICAgOiBQYXRoRGlhZ25vc3RpY1BpZWNlKHMsIENvbnRyb2xGbG93KSB7CisgICAgTFBhaXJzLnB1c2hfYmFjayhQYXRoRGlhZ25vc3RpY0xvY2F0aW9uUGFpcihzdGFydFBvcywgZW5kUG9zKSk7CisgIH0KKworICBQYXRoRGlhZ25vc3RpY0NvbnRyb2xGbG93UGllY2UoY29uc3QgUGF0aERpYWdub3N0aWNMb2NhdGlvbiAmc3RhcnRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uICZlbmRQb3MpCisgICAgICA6IFBhdGhEaWFnbm9zdGljUGllY2UoQ29udHJvbEZsb3cpIHsKKyAgICBMUGFpcnMucHVzaF9iYWNrKFBhdGhEaWFnbm9zdGljTG9jYXRpb25QYWlyKHN0YXJ0UG9zLCBlbmRQb3MpKTsKKyAgfQorCisgIH5QYXRoRGlhZ25vc3RpY0NvbnRyb2xGbG93UGllY2UoKSBvdmVycmlkZTsKKworICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIGdldFN0YXJ0TG9jYXRpb24oKSBjb25zdCB7CisgICAgYXNzZXJ0KCFMUGFpcnMuZW1wdHkoKSAmJgorICAgICAgICAgICAiUGF0aERpYWdub3N0aWNDb250cm9sRmxvd1BpZWNlIG5lZWRzIGF0IGxlYXN0IG9uZSBsb2NhdGlvbi4iKTsKKyAgICByZXR1cm4gTFBhaXJzWzBdLmdldFN0YXJ0KCk7CisgIH0KKworICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIGdldEVuZExvY2F0aW9uKCkgY29uc3QgeworICAgIGFzc2VydCghTFBhaXJzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgIlBhdGhEaWFnbm9zdGljQ29udHJvbEZsb3dQaWVjZSBuZWVkcyBhdCBsZWFzdCBvbmUgbG9jYXRpb24uIik7CisgICAgcmV0dXJuIExQYWlyc1swXS5nZXRFbmQoKTsKKyAgfQorCisgIHZvaWQgc2V0U3RhcnRMb2NhdGlvbihjb25zdCBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uICZMKSB7CisgICAgTFBhaXJzWzBdLnNldFN0YXJ0KEwpOworICB9CisKKyAgdm9pZCBzZXRFbmRMb2NhdGlvbihjb25zdCBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uICZMKSB7CisgICAgTFBhaXJzWzBdLnNldEVuZChMKTsKKyAgfQorCisgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IFBhdGhEaWFnbm9zdGljTG9jYXRpb25QYWlyICZYKSB7IExQYWlycy5wdXNoX2JhY2soWCk7IH0KKworICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRTdGFydExvY2F0aW9uKCk7CisgIH0KKworICB1c2luZyBpdGVyYXRvciA9IHN0ZDo6dmVjdG9yPFBhdGhEaWFnbm9zdGljTG9jYXRpb25QYWlyPjo6aXRlcmF0b3I7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBMUGFpcnMuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBMUGFpcnMuZW5kKCk7IH0KKworICB2b2lkIGZsYXR0ZW5Mb2NhdGlvbnMoKSBvdmVycmlkZSB7CisgICAgZm9yIChhdXRvICZJIDogKnRoaXMpCisgICAgICBJLmZsYXR0ZW4oKTsKKyAgfQorCisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0KKyAgICAgIHN0ZDo6dmVjdG9yPFBhdGhEaWFnbm9zdGljTG9jYXRpb25QYWlyPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBMUGFpcnMuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBMUGFpcnMuZW5kKCk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFBhdGhEaWFnbm9zdGljUGllY2UgKlApIHsKKyAgICByZXR1cm4gUC0+Z2V0S2luZCgpID09IENvbnRyb2xGbG93OworICB9CisKKyAgdm9pZCBkdW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCBvdmVycmlkZTsKK307CisKK2NsYXNzIFBhdGhEaWFnbm9zdGljTWFjcm9QaWVjZSA6IHB1YmxpYyBQYXRoRGlhZ25vc3RpY1Nwb3RQaWVjZSB7CitwdWJsaWM6CisgIFBhdGhEaWFnbm9zdGljTWFjcm9QaWVjZShjb25zdCBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uICZwb3MpCisgICAgICA6IFBhdGhEaWFnbm9zdGljU3BvdFBpZWNlKHBvcywgIiIsIE1hY3JvKSB7fQorICB+UGF0aERpYWdub3N0aWNNYWNyb1BpZWNlKCkgb3ZlcnJpZGU7CisKKyAgUGF0aFBpZWNlcyBzdWJQaWVjZXM7CisgIAorICBib29sIGNvbnRhaW5zRXZlbnQoKSBjb25zdDsKKworICB2b2lkIGZsYXR0ZW5Mb2NhdGlvbnMoKSBvdmVycmlkZSB7CisgICAgUGF0aERpYWdub3N0aWNTcG90UGllY2U6OmZsYXR0ZW5Mb2NhdGlvbnMoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBzdWJQaWVjZXMpCisgICAgICBJLT5mbGF0dGVuTG9jYXRpb25zKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFBhdGhEaWFnbm9zdGljUGllY2UgKlApIHsKKyAgICByZXR1cm4gUC0+Z2V0S2luZCgpID09IE1hY3JvOworICB9CisKKyAgdm9pZCBkdW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCBvdmVycmlkZTsKK307CisKK2NsYXNzIFBhdGhEaWFnbm9zdGljTm90ZVBpZWNlOiBwdWJsaWMgUGF0aERpYWdub3N0aWNTcG90UGllY2UgeworcHVibGljOgorICBQYXRoRGlhZ25vc3RpY05vdGVQaWVjZShjb25zdCBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uICZQb3MsIFN0cmluZ1JlZiBTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWRkUG9zUmFuZ2UgPSB0cnVlKQorICAgICAgOiBQYXRoRGlhZ25vc3RpY1Nwb3RQaWVjZShQb3MsIFMsIE5vdGUsIEFkZFBvc1JhbmdlKSB7fQorICB+UGF0aERpYWdub3N0aWNOb3RlUGllY2UoKSBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFBhdGhEaWFnbm9zdGljUGllY2UgKlApIHsKKyAgICByZXR1cm4gUC0+Z2V0S2luZCgpID09IE5vdGU7CisgIH0KKworICB2b2lkIGR1bXAoKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vIEZpbGUgSURzIG1hcHBlZCB0byBzZXRzIG9mIGxpbmUgbnVtYmVycy4KK3VzaW5nIEZpbGVzVG9MaW5lTnVtc01hcCA9IHN0ZDo6bWFwPHVuc2lnbmVkLCBzdGQ6OnNldDx1bnNpZ25lZD4+OworCisvLy8gUGF0aERpYWdub3N0aWMgLSBQYXRoRGlhZ25vc3RpYyBvYmplY3RzIHJlcHJlc2VudCBhIHNpbmdsZSBwYXRoLXNlbnNpdGl2ZQorLy8vICBkaWFnbm9zdGljLiAgSXQgcmVwcmVzZW50cyBhbiBvcmRlcmVkLWNvbGxlY3Rpb24gb2YgUGF0aERpYWdub3N0aWNQaWVjZXMsCisvLy8gIGVhY2ggd2hpY2ggcmVwcmVzZW50IHRoZSBwaWVjZXMgb2YgdGhlIHBhdGguCitjbGFzcyBQYXRoRGlhZ25vc3RpYyA6IHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CisgIHN0ZDo6c3RyaW5nIENoZWNrTmFtZTsKKyAgY29uc3QgRGVjbCAqRGVjbFdpdGhJc3N1ZTsKKyAgc3RkOjpzdHJpbmcgQnVnVHlwZTsKKyAgc3RkOjpzdHJpbmcgVmVyYm9zZURlc2M7CisgIHN0ZDo6c3RyaW5nIFNob3J0RGVzYzsKKyAgc3RkOjpzdHJpbmcgQ2F0ZWdvcnk7CisgIHN0ZDo6ZGVxdWU8c3RkOjpzdHJpbmc+IE90aGVyRGVzYzsKKworICAvLy8gXGJyaWVmIExvYyBUaGUgbG9jYXRpb24gb2YgdGhlIHBhdGggZGlhZ25vc3RpYyByZXBvcnQuCisgIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gTG9jOworCisgIFBhdGhQaWVjZXMgcGF0aEltcGw7CisgIFNtYWxsVmVjdG9yPFBhdGhQaWVjZXMgKiwgMz4gcGF0aFN0YWNrOworICAKKyAgLy8vIFxicmllZiBJbXBvcnRhbnQgYnVnIHVuaXF1ZWluZyBsb2NhdGlvbi4KKyAgLy8vIFRoZSBsb2NhdGlvbiBpbmZvIGlzIHVzZWZ1bCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYnVncy4KKyAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBVbmlxdWVpbmdMb2M7CisgIGNvbnN0IERlY2wgKlVuaXF1ZWluZ0RlY2w7CisKKyAgLy8vIExpbmVzIGV4ZWN1dGVkIGluIHRoZSBwYXRoLgorICBzdGQ6OnVuaXF1ZV9wdHI8RmlsZXNUb0xpbmVOdW1zTWFwPiBFeGVjdXRlZExpbmVzOworCitwdWJsaWM6CisgIFBhdGhEaWFnbm9zdGljKCkgPSBkZWxldGU7CisgIFBhdGhEaWFnbm9zdGljKFN0cmluZ1JlZiBDaGVja05hbWUsIGNvbnN0IERlY2wgKkRlY2xXaXRoSXNzdWUsCisgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBidWd0eXBlLCBTdHJpbmdSZWYgdmVyYm9zZURlc2MsIFN0cmluZ1JlZiBzaG9ydERlc2MsCisgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBjYXRlZ29yeSwgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBMb2NhdGlvblRvVW5pcXVlLAorICAgICAgICAgICAgICAgICBjb25zdCBEZWNsICpEZWNsVG9VbmlxdWUsCisgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxGaWxlc1RvTGluZU51bXNNYXA+IEV4ZWN1dGVkTGluZXMpOworICB+UGF0aERpYWdub3N0aWMoKTsKKyAgCisgIGNvbnN0IFBhdGhQaWVjZXMgJnBhdGg7CisKKyAgLy8vIFJldHVybiB0aGUgcGF0aCBjdXJyZW50bHkgdXNlZCBieSBidWlsZGVycyBmb3IgY29uc3RydWN0aW5nIHRoZSAKKyAgLy8vIFBhdGhEaWFnbm9zdGljLgorICBQYXRoUGllY2VzICZnZXRBY3RpdmVQYXRoKCkgeworICAgIGlmIChwYXRoU3RhY2suZW1wdHkoKSkKKyAgICAgIHJldHVybiBwYXRoSW1wbDsKKyAgICByZXR1cm4gKnBhdGhTdGFjay5iYWNrKCk7CisgIH0KKyAgCisgIC8vLyBSZXR1cm4gYSBtdXRhYmxlIHZlcnNpb24gb2YgJ3BhdGgnLgorICBQYXRoUGllY2VzICZnZXRNdXRhYmxlUGllY2VzKCkgeworICAgIHJldHVybiBwYXRoSW1wbDsKKyAgfQorICAgIAorICAvLy8gUmV0dXJuIHRoZSB1bnJvbGxlZCBzaXplIG9mIHRoZSBwYXRoLgorICB1bnNpZ25lZCBmdWxsX3NpemUoKTsKKworICB2b2lkIHB1c2hBY3RpdmVQYXRoKFBhdGhQaWVjZXMgKnApIHsgcGF0aFN0YWNrLnB1c2hfYmFjayhwKTsgfQorICB2b2lkIHBvcEFjdGl2ZVBhdGgoKSB7IGlmICghcGF0aFN0YWNrLmVtcHR5KCkpIHBhdGhTdGFjay5wb3BfYmFjaygpOyB9CisKKyAgYm9vbCBpc1dpdGhpbkNhbGwoKSBjb25zdCB7IHJldHVybiAhcGF0aFN0YWNrLmVtcHR5KCk7IH0KKworICB2b2lkIHNldEVuZE9mUGF0aChzdGQ6OnVuaXF1ZV9wdHI8UGF0aERpYWdub3N0aWNQaWVjZT4gRW5kUGllY2UpIHsKKyAgICBhc3NlcnQoIUxvYy5pc1ZhbGlkKCkgJiYgIkVuZCBsb2NhdGlvbiBhbHJlYWR5IHNldCEiKTsKKyAgICBMb2MgPSBFbmRQaWVjZS0+Z2V0TG9jYXRpb24oKTsKKyAgICBhc3NlcnQoTG9jLmlzVmFsaWQoKSAmJiAiSW52YWxpZCBsb2NhdGlvbiBmb3IgZW5kLW9mLXBhdGggcGllY2UiKTsKKyAgICBnZXRBY3RpdmVQYXRoKCkucHVzaF9iYWNrKHN0ZDo6bW92ZShFbmRQaWVjZSkpOworICB9CisKKyAgdm9pZCBhcHBlbmRUb0Rlc2MoU3RyaW5nUmVmIFMpIHsKKyAgICBpZiAoIVNob3J0RGVzYy5lbXB0eSgpKQorICAgICAgU2hvcnREZXNjICs9IFM7CisgICAgVmVyYm9zZURlc2MgKz0gUzsKKyAgfQorCisgIHZvaWQgcmVzZXRQYXRoKCkgeworICAgIHBhdGhTdGFjay5jbGVhcigpOworICAgIHBhdGhJbXBsLmNsZWFyKCk7CisgICAgTG9jID0gUGF0aERpYWdub3N0aWNMb2NhdGlvbigpOworICB9CisKKyAgLy8vIFxicmllZiBJZiB0aGUgbGFzdCBwaWVjZSBvZiB0aGUgcmVwb3J0IHBvaW50IHRvIHRoZSBoZWFkZXIgZmlsZSwgcmVzZXRzCisgIC8vLyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlcG9ydCB0byBiZSB0aGUgbGFzdCBsb2NhdGlvbiBpbiB0aGUgbWFpbiBzb3VyY2UKKyAgLy8vIGZpbGUuCisgIHZvaWQgcmVzZXREaWFnbm9zdGljTG9jYXRpb25Ub01haW5GaWxlKCk7CisKKyAgU3RyaW5nUmVmIGdldFZlcmJvc2VEZXNjcmlwdGlvbigpIGNvbnN0IHsgcmV0dXJuIFZlcmJvc2VEZXNjOyB9CisKKyAgU3RyaW5nUmVmIGdldFNob3J0RGVzY3JpcHRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIFNob3J0RGVzYy5lbXB0eSgpID8gVmVyYm9zZURlc2MgOiBTaG9ydERlc2M7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0Q2hlY2tOYW1lKCkgY29uc3QgeyByZXR1cm4gQ2hlY2tOYW1lOyB9CisgIFN0cmluZ1JlZiBnZXRCdWdUeXBlKCkgY29uc3QgeyByZXR1cm4gQnVnVHlwZTsgfQorICBTdHJpbmdSZWYgZ2V0Q2F0ZWdvcnkoKSBjb25zdCB7IHJldHVybiBDYXRlZ29yeTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIHNlbWFudGljIGNvbnRleHQgd2hlcmUgYW4gaXNzdWUgb2NjdXJyZWQuICBJZiB0aGUKKyAgLy8vIGlzc3VlIG9jY3VycyBhbG9uZyBhIHBhdGgsIHRoaXMgcmVwcmVzZW50cyB0aGUgImNlbnRyYWwiIGFyZWEKKyAgLy8vIHdoZXJlIHRoZSBidWcgbWFuaWZlc3RzLgorICBjb25zdCBEZWNsICpnZXREZWNsV2l0aElzc3VlKCkgY29uc3QgeyByZXR1cm4gRGVjbFdpdGhJc3N1ZTsgfQorCisgIHVzaW5nIG1ldGFfaXRlcmF0b3IgPSBzdGQ6OmRlcXVlPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgbWV0YV9pdGVyYXRvciBtZXRhX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gT3RoZXJEZXNjLmJlZ2luKCk7IH0KKyAgbWV0YV9pdGVyYXRvciBtZXRhX2VuZCgpIGNvbnN0IHsgcmV0dXJuIE90aGVyRGVzYy5lbmQoKTsgfQorICB2b2lkIGFkZE1ldGEoU3RyaW5nUmVmIHMpIHsgT3RoZXJEZXNjLnB1c2hfYmFjayhzKTsgfQorCisgIHVzaW5nIGZpbGVzbWFwX2l0ZXJhdG9yID0gRmlsZXNUb0xpbmVOdW1zTWFwOjpjb25zdF9pdGVyYXRvcjsKKworICBmaWxlc21hcF9pdGVyYXRvciBleGVjdXRlZExpbmVzX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBFeGVjdXRlZExpbmVzLT5iZWdpbigpOworICB9CisKKyAgZmlsZXNtYXBfaXRlcmF0b3IgZXhlY3V0ZWRMaW5lc19lbmQoKSBjb25zdCB7IHJldHVybiBFeGVjdXRlZExpbmVzLT5lbmQoKTsgfQorCisgIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCB7CisgICAgYXNzZXJ0KExvYy5pc1ZhbGlkKCkgJiYgIk5vIHJlcG9ydCBsb2NhdGlvbiBzZXQgeWV0ISIpOworICAgIHJldHVybiBMb2M7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbG9jYXRpb24gb24gd2hpY2ggdGhlIHJlcG9ydCBzaG91bGQgYmUgdW5pcXVlZC4KKyAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBnZXRVbmlxdWVpbmdMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIFVuaXF1ZWluZ0xvYzsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBkZWNsYXJhdGlvbiBjb250YWluaW5nIHRoZSB1bmlxdWVpbmcgbG9jYXRpb24uCisgIGNvbnN0IERlY2wgKmdldFVuaXF1ZWluZ0RlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIFVuaXF1ZWluZ0RlY2w7CisgIH0KKworICB2b2lkIGZsYXR0ZW5Mb2NhdGlvbnMoKSB7CisgICAgTG9jLmZsYXR0ZW4oKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBwYXRoSW1wbCkKKyAgICAgIEktPmZsYXR0ZW5Mb2NhdGlvbnMoKTsKKyAgfQorCisgIC8vLyBQcm9maWxlcyB0aGUgZGlhZ25vc3RpYywgaW5kZXBlbmRlbnQgb2YgdGhlIHBhdGggaXQgcmVmZXJlbmNlcy4KKyAgLy8vCisgIC8vLyBUaGlzIGNhbiBiZSB1c2VkIHRvIG1lcmdlIGRpYWdub3N0aWNzIHRoYXQgcmVmZXIgdG8gdGhlIHNhbWUgaXNzdWUKKyAgLy8vIGFsb25nIGRpZmZlcmVudCBwYXRocy4KKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdDsKKworICAvLy8gUHJvZmlsZXMgdGhlIGRpYWdub3N0aWMsIGluY2x1ZGluZyBpdHMgcGF0aC4KKyAgLy8vCisgIC8vLyBUd28gZGlhZ25vc3RpY3Mgd2l0aCB0aGUgc2FtZSBpc3N1ZSBhbG9uZyBkaWZmZXJlbnQgcGF0aHMgd2lsbCBnZW5lcmF0ZQorICAvLy8gZGlmZmVyZW50IHByb2ZpbGVzLgorICB2b2lkIEZ1bGxQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdDsKK307ICAKKworfSAvLyBuYW1lc3BhY2UgZW50bworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX0JVR1JFUE9SVEVSX1BBVEhESUFHTk9TVElDX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQ2hlY2tlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1YWJlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQ2hlY2tlci5oCkBAIC0wLDAgKzEsNTc5IEBACisvLz09IENoZWNrZXIuaCAtIFJlZ2lzdHJhdGlvbiBtZWNoYW5pc20gZm9yIGNoZWNrZXJzIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyBDaGVja2VyLCB1c2VkIHRvIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgY2hlY2tlcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfQ0hFQ0tFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9DSEVDS0VSX0gKKworI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL1Byb2dyYW1Qb2ludC5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQ2hlY2tlck1hbmFnZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU1ZhbHMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGVudG8geworICBjbGFzcyBCdWdSZXBvcnRlcjsKKworbmFtZXNwYWNlIGNoZWNrIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERFQ0w+CitjbGFzcyBBU1REZWNsIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyB2b2lkIF9jaGVja0RlY2wodm9pZCAqY2hlY2tlciwgY29uc3QgRGVjbCAqRCwgQW5hbHlzaXNNYW5hZ2VyJiBtZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXIgJkJSKSB7CisgICAgKChjb25zdCBDSEVDS0VSICopY2hlY2tlciktPmNoZWNrQVNURGVjbChjYXN0PERFQ0w+KEQpLCBtZ3IsIEJSKTsKKyAgfQorCisgIHN0YXRpYyBib29sIF9oYW5kbGVzRGVjbChjb25zdCBEZWNsICpEKSB7CisgICAgcmV0dXJuIGlzYTxERUNMPihEKTsKKyAgfQorcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0tFUj4KKyAgc3RhdGljIHZvaWQgX3JlZ2lzdGVyKENIRUNLRVIgKmNoZWNrZXIsIENoZWNrZXJNYW5hZ2VyICZtZ3IpIHsKKyAgICBtZ3IuX3JlZ2lzdGVyRm9yRGVjbChDaGVja2VyTWFuYWdlcjo6Q2hlY2tEZWNsRnVuYyhjaGVja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jaGVja0RlY2w8Q0hFQ0tFUj4pLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9oYW5kbGVzRGVjbCk7CisgIH0KK307CisKK2NsYXNzIEFTVENvZGVCb2R5IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyB2b2lkIF9jaGVja0JvZHkodm9pZCAqY2hlY2tlciwgY29uc3QgRGVjbCAqRCwgQW5hbHlzaXNNYW5hZ2VyJiBtZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXIgJkJSKSB7CisgICAgKChjb25zdCBDSEVDS0VSICopY2hlY2tlciktPmNoZWNrQVNUQ29kZUJvZHkoRCwgbWdyLCBCUik7CisgIH0KKworcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0tFUj4KKyAgc3RhdGljIHZvaWQgX3JlZ2lzdGVyKENIRUNLRVIgKmNoZWNrZXIsIENoZWNrZXJNYW5hZ2VyICZtZ3IpIHsKKyAgICBtZ3IuX3JlZ2lzdGVyRm9yQm9keShDaGVja2VyTWFuYWdlcjo6Q2hlY2tEZWNsRnVuYyhjaGVja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jaGVja0JvZHk8Q0hFQ0tFUj4pKTsKKyAgfQorfTsKKworY2xhc3MgRW5kT2ZUcmFuc2xhdGlvblVuaXQgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0tFUj4KKyAgc3RhdGljIHZvaWQgX2NoZWNrRW5kT2ZUcmFuc2xhdGlvblVuaXQodm9pZCAqY2hlY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJhbnNsYXRpb25Vbml0RGVjbCAqVFUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFseXNpc01hbmFnZXImIG1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXIgJkJSKSB7CisgICAgKChjb25zdCBDSEVDS0VSICopY2hlY2tlciktPmNoZWNrRW5kT2ZUcmFuc2xhdGlvblVuaXQoVFUsIG1nciwgQlIpOworICB9CisKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyB2b2lkIF9yZWdpc3RlcihDSEVDS0VSICpjaGVja2VyLCBDaGVja2VyTWFuYWdlciAmbWdyKXsKKyAgICBtZ3IuX3JlZ2lzdGVyRm9yRW5kT2ZUcmFuc2xhdGlvblVuaXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyTWFuYWdlcjo6Q2hlY2tFbmRPZlRyYW5zbGF0aW9uVW5pdChjaGVja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NoZWNrRW5kT2ZUcmFuc2xhdGlvblVuaXQ8Q0hFQ0tFUj4pKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNUTVQ+CitjbGFzcyBQcmVTdG10IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyB2b2lkIF9jaGVja1N0bXQodm9pZCAqY2hlY2tlciwgY29uc3QgU3RtdCAqUywgQ2hlY2tlckNvbnRleHQgJkMpIHsKKyAgICAoKGNvbnN0IENIRUNLRVIgKiljaGVja2VyKS0+Y2hlY2tQcmVTdG10KGNhc3Q8U1RNVD4oUyksIEMpOworICB9CisKKyAgc3RhdGljIGJvb2wgX2hhbmRsZXNTdG10KGNvbnN0IFN0bXQgKlMpIHsKKyAgICByZXR1cm4gaXNhPFNUTVQ+KFMpOworICB9CitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBfcmVnaXN0ZXIoQ0hFQ0tFUiAqY2hlY2tlciwgQ2hlY2tlck1hbmFnZXIgJm1ncikgeworICAgIG1nci5fcmVnaXN0ZXJGb3JQcmVTdG10KENoZWNrZXJNYW5hZ2VyOjpDaGVja1N0bXRGdW5jKGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NoZWNrU3RtdDxDSEVDS0VSPiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2hhbmRsZXNTdG10KTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNUTVQ+CitjbGFzcyBQb3N0U3RtdCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBfY2hlY2tTdG10KHZvaWQgKmNoZWNrZXIsIGNvbnN0IFN0bXQgKlMsIENoZWNrZXJDb250ZXh0ICZDKSB7CisgICAgKChjb25zdCBDSEVDS0VSICopY2hlY2tlciktPmNoZWNrUG9zdFN0bXQoY2FzdDxTVE1UPihTKSwgQyk7CisgIH0KKworICBzdGF0aWMgYm9vbCBfaGFuZGxlc1N0bXQoY29uc3QgU3RtdCAqUykgeworICAgIHJldHVybiBpc2E8U1RNVD4oUyk7CisgIH0KK3B1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyB2b2lkIF9yZWdpc3RlcihDSEVDS0VSICpjaGVja2VyLCBDaGVja2VyTWFuYWdlciAmbWdyKSB7CisgICAgbWdyLl9yZWdpc3RlckZvclBvc3RTdG10KENoZWNrZXJNYW5hZ2VyOjpDaGVja1N0bXRGdW5jKGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jaGVja1N0bXQ8Q0hFQ0tFUj4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaGFuZGxlc1N0bXQpOworICB9Cit9OworCitjbGFzcyBQcmVPYmpDTWVzc2FnZSB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBfY2hlY2tPYmpDTWVzc2FnZSh2b2lkICpjaGVja2VyLCBjb25zdCBPYmpDTWV0aG9kQ2FsbCAmbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQ29udGV4dCAmQykgeworICAgICgoY29uc3QgQ0hFQ0tFUiAqKWNoZWNrZXIpLT5jaGVja1ByZU9iakNNZXNzYWdlKG1zZywgQyk7CisgIH0KKworcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0tFUj4KKyAgc3RhdGljIHZvaWQgX3JlZ2lzdGVyKENIRUNLRVIgKmNoZWNrZXIsIENoZWNrZXJNYW5hZ2VyICZtZ3IpIHsKKyAgICBtZ3IuX3JlZ2lzdGVyRm9yUHJlT2JqQ01lc3NhZ2UoCisgICAgIENoZWNrZXJNYW5hZ2VyOjpDaGVja09iakNNZXNzYWdlRnVuYyhjaGVja2VyLCBfY2hlY2tPYmpDTWVzc2FnZTxDSEVDS0VSPikpOworICB9Cit9OworCitjbGFzcyBPYmpDTWVzc2FnZU5pbCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBfY2hlY2tPYmpDTWVzc2FnZSh2b2lkICpjaGVja2VyLCBjb25zdCBPYmpDTWV0aG9kQ2FsbCAmbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQ29udGV4dCAmQykgeworICAgICgoY29uc3QgQ0hFQ0tFUiAqKWNoZWNrZXIpLT5jaGVja09iakNNZXNzYWdlTmlsKG1zZywgQyk7CisgIH0KKworcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0tFUj4KKyAgc3RhdGljIHZvaWQgX3JlZ2lzdGVyKENIRUNLRVIgKmNoZWNrZXIsIENoZWNrZXJNYW5hZ2VyICZtZ3IpIHsKKyAgICBtZ3IuX3JlZ2lzdGVyRm9yT2JqQ01lc3NhZ2VOaWwoCisgICAgIENoZWNrZXJNYW5hZ2VyOjpDaGVja09iakNNZXNzYWdlRnVuYyhjaGVja2VyLCBfY2hlY2tPYmpDTWVzc2FnZTxDSEVDS0VSPikpOworICB9Cit9OworCitjbGFzcyBQb3N0T2JqQ01lc3NhZ2UgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0tFUj4KKyAgc3RhdGljIHZvaWQgX2NoZWNrT2JqQ01lc3NhZ2Uodm9pZCAqY2hlY2tlciwgY29uc3QgT2JqQ01ldGhvZENhbGwgJm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckNvbnRleHQgJkMpIHsKKyAgICAoKGNvbnN0IENIRUNLRVIgKiljaGVja2VyKS0+Y2hlY2tQb3N0T2JqQ01lc3NhZ2UobXNnLCBDKTsKKyAgfQorCitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBfcmVnaXN0ZXIoQ0hFQ0tFUiAqY2hlY2tlciwgQ2hlY2tlck1hbmFnZXIgJm1ncikgeworICAgIG1nci5fcmVnaXN0ZXJGb3JQb3N0T2JqQ01lc3NhZ2UoCisgICAgIENoZWNrZXJNYW5hZ2VyOjpDaGVja09iakNNZXNzYWdlRnVuYyhjaGVja2VyLCBfY2hlY2tPYmpDTWVzc2FnZTxDSEVDS0VSPikpOworICB9Cit9OworCitjbGFzcyBQcmVDYWxsIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyB2b2lkIF9jaGVja0NhbGwodm9pZCAqY2hlY2tlciwgY29uc3QgQ2FsbEV2ZW50ICZtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckNvbnRleHQgJkMpIHsKKyAgICAoKGNvbnN0IENIRUNLRVIgKiljaGVja2VyKS0+Y2hlY2tQcmVDYWxsKG1zZywgQyk7CisgIH0KKworcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0tFUj4KKyAgc3RhdGljIHZvaWQgX3JlZ2lzdGVyKENIRUNLRVIgKmNoZWNrZXIsIENoZWNrZXJNYW5hZ2VyICZtZ3IpIHsKKyAgICBtZ3IuX3JlZ2lzdGVyRm9yUHJlQ2FsbCgKKyAgICAgQ2hlY2tlck1hbmFnZXI6OkNoZWNrQ2FsbEZ1bmMoY2hlY2tlciwgX2NoZWNrQ2FsbDxDSEVDS0VSPikpOworICB9Cit9OworCitjbGFzcyBQb3N0Q2FsbCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBfY2hlY2tDYWxsKHZvaWQgKmNoZWNrZXIsIGNvbnN0IENhbGxFdmVudCAmbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJDb250ZXh0ICZDKSB7CisgICAgKChjb25zdCBDSEVDS0VSICopY2hlY2tlciktPmNoZWNrUG9zdENhbGwobXNnLCBDKTsKKyAgfQorCitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBfcmVnaXN0ZXIoQ0hFQ0tFUiAqY2hlY2tlciwgQ2hlY2tlck1hbmFnZXIgJm1ncikgeworICAgIG1nci5fcmVnaXN0ZXJGb3JQb3N0Q2FsbCgKKyAgICAgQ2hlY2tlck1hbmFnZXI6OkNoZWNrQ2FsbEZ1bmMoY2hlY2tlciwgX2NoZWNrQ2FsbDxDSEVDS0VSPikpOworICB9Cit9OworCitjbGFzcyBMb2NhdGlvbiB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBfY2hlY2tMb2NhdGlvbih2b2lkICpjaGVja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTVmFsICZsb2NhdGlvbiwgYm9vbCBpc0xvYWQsIGNvbnN0IFN0bXQgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJDb250ZXh0ICZDKSB7CisgICAgKChjb25zdCBDSEVDS0VSICopY2hlY2tlciktPmNoZWNrTG9jYXRpb24obG9jYXRpb24sIGlzTG9hZCwgUywgQyk7CisgIH0KKworcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0tFUj4KKyAgc3RhdGljIHZvaWQgX3JlZ2lzdGVyKENIRUNLRVIgKmNoZWNrZXIsIENoZWNrZXJNYW5hZ2VyICZtZ3IpIHsKKyAgICBtZ3IuX3JlZ2lzdGVyRm9yTG9jYXRpb24oCisgICAgICAgICAgIENoZWNrZXJNYW5hZ2VyOjpDaGVja0xvY2F0aW9uRnVuYyhjaGVja2VyLCBfY2hlY2tMb2NhdGlvbjxDSEVDS0VSPikpOworICB9Cit9OworCitjbGFzcyBCaW5kIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyB2b2lkIF9jaGVja0JpbmQodm9pZCAqY2hlY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTVmFsICZsb2NhdGlvbiwgY29uc3QgU1ZhbCAmdmFsLCBjb25zdCBTdG10ICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJDb250ZXh0ICZDKSB7CisgICAgKChjb25zdCBDSEVDS0VSICopY2hlY2tlciktPmNoZWNrQmluZChsb2NhdGlvbiwgdmFsLCBTLCBDKTsKKyAgfQorCitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBfcmVnaXN0ZXIoQ0hFQ0tFUiAqY2hlY2tlciwgQ2hlY2tlck1hbmFnZXIgJm1ncikgeworICAgIG1nci5fcmVnaXN0ZXJGb3JCaW5kKAorICAgICAgICAgICBDaGVja2VyTWFuYWdlcjo6Q2hlY2tCaW5kRnVuYyhjaGVja2VyLCBfY2hlY2tCaW5kPENIRUNLRVI+KSk7CisgIH0KK307CisKK2NsYXNzIEVuZEFuYWx5c2lzIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyB2b2lkIF9jaGVja0VuZEFuYWx5c2lzKHZvaWQgKmNoZWNrZXIsIEV4cGxvZGVkR3JhcGggJkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyICZCUiwgRXhwckVuZ2luZSAmRW5nKSB7CisgICAgKChjb25zdCBDSEVDS0VSICopY2hlY2tlciktPmNoZWNrRW5kQW5hbHlzaXMoRywgQlIsIEVuZyk7CisgIH0KKworcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0tFUj4KKyAgc3RhdGljIHZvaWQgX3JlZ2lzdGVyKENIRUNLRVIgKmNoZWNrZXIsIENoZWNrZXJNYW5hZ2VyICZtZ3IpIHsKKyAgICBtZ3IuX3JlZ2lzdGVyRm9yRW5kQW5hbHlzaXMoCisgICAgIENoZWNrZXJNYW5hZ2VyOjpDaGVja0VuZEFuYWx5c2lzRnVuYyhjaGVja2VyLCBfY2hlY2tFbmRBbmFseXNpczxDSEVDS0VSPikpOworICB9Cit9OworCitjbGFzcyBCZWdpbkZ1bmN0aW9uIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyB2b2lkIF9jaGVja0JlZ2luRnVuY3Rpb24odm9pZCAqY2hlY2tlciwgQ2hlY2tlckNvbnRleHQgJkMpIHsKKyAgICAoKGNvbnN0IENIRUNLRVIgKiljaGVja2VyKS0+Y2hlY2tCZWdpbkZ1bmN0aW9uKEMpOworICB9CisKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyB2b2lkIF9yZWdpc3RlcihDSEVDS0VSICpjaGVja2VyLCBDaGVja2VyTWFuYWdlciAmbWdyKSB7CisgICAgbWdyLl9yZWdpc3RlckZvckJlZ2luRnVuY3Rpb24oQ2hlY2tlck1hbmFnZXI6OkNoZWNrQmVnaW5GdW5jdGlvbkZ1bmMoCisgICAgICAgIGNoZWNrZXIsIF9jaGVja0JlZ2luRnVuY3Rpb248Q0hFQ0tFUj4pKTsKKyAgfQorfTsKKworY2xhc3MgRW5kRnVuY3Rpb24geworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0tFUj4KKyAgc3RhdGljIHZvaWQgX2NoZWNrRW5kRnVuY3Rpb24odm9pZCAqY2hlY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckNvbnRleHQgJkMpIHsKKyAgICAoKGNvbnN0IENIRUNLRVIgKiljaGVja2VyKS0+Y2hlY2tFbmRGdW5jdGlvbihDKTsKKyAgfQorCitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBfcmVnaXN0ZXIoQ0hFQ0tFUiAqY2hlY2tlciwgQ2hlY2tlck1hbmFnZXIgJm1ncikgeworICAgIG1nci5fcmVnaXN0ZXJGb3JFbmRGdW5jdGlvbigKKyAgICAgQ2hlY2tlck1hbmFnZXI6OkNoZWNrRW5kRnVuY3Rpb25GdW5jKGNoZWNrZXIsIF9jaGVja0VuZEZ1bmN0aW9uPENIRUNLRVI+KSk7CisgIH0KK307CisKK2NsYXNzIEJyYW5jaENvbmRpdGlvbiB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBfY2hlY2tCcmFuY2hDb25kaXRpb24odm9pZCAqY2hlY2tlciwgY29uc3QgU3RtdCAqQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckNvbnRleHQgJiBDKSB7CisgICAgKChjb25zdCBDSEVDS0VSICopY2hlY2tlciktPmNoZWNrQnJhbmNoQ29uZGl0aW9uKENvbmRpdGlvbiwgQyk7CisgIH0KKworcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0tFUj4KKyAgc3RhdGljIHZvaWQgX3JlZ2lzdGVyKENIRUNLRVIgKmNoZWNrZXIsIENoZWNrZXJNYW5hZ2VyICZtZ3IpIHsKKyAgICBtZ3IuX3JlZ2lzdGVyRm9yQnJhbmNoQ29uZGl0aW9uKAorICAgICAgQ2hlY2tlck1hbmFnZXI6OkNoZWNrQnJhbmNoQ29uZGl0aW9uRnVuYyhjaGVja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2hlY2tCcmFuY2hDb25kaXRpb248Q0hFQ0tFUj4pKTsKKyAgfQorfTsKKworY2xhc3MgTmV3QWxsb2NhdG9yIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyB2b2lkIF9jaGVja05ld0FsbG9jYXRvcih2b2lkICpjaGVja2VyLCBjb25zdCBDWFhOZXdFeHByICpORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWYWwgVGFyZ2V0LCBDaGVja2VyQ29udGV4dCAmQykgeworICAgICgoY29uc3QgQ0hFQ0tFUiAqKWNoZWNrZXIpLT5jaGVja05ld0FsbG9jYXRvcihORSwgVGFyZ2V0LCBDKTsKKyAgfQorCitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBfcmVnaXN0ZXIoQ0hFQ0tFUiAqY2hlY2tlciwgQ2hlY2tlck1hbmFnZXIgJm1ncikgeworICAgIG1nci5fcmVnaXN0ZXJGb3JOZXdBbGxvY2F0b3IoCisgICAgICAgIENoZWNrZXJNYW5hZ2VyOjpDaGVja05ld0FsbG9jYXRvckZ1bmMoY2hlY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2hlY2tOZXdBbGxvY2F0b3I8Q0hFQ0tFUj4pKTsKKyAgfQorfTsKKworY2xhc3MgTGl2ZVN5bWJvbHMgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0tFUj4KKyAgc3RhdGljIHZvaWQgX2NoZWNrTGl2ZVN5bWJvbHModm9pZCAqY2hlY2tlciwgUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xSZWFwZXIgJlNSKSB7CisgICAgKChjb25zdCBDSEVDS0VSICopY2hlY2tlciktPmNoZWNrTGl2ZVN5bWJvbHMoc3RhdGUsIFNSKTsKKyAgfQorCitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBfcmVnaXN0ZXIoQ0hFQ0tFUiAqY2hlY2tlciwgQ2hlY2tlck1hbmFnZXIgJm1ncikgeworICAgIG1nci5fcmVnaXN0ZXJGb3JMaXZlU3ltYm9scygKKyAgICAgQ2hlY2tlck1hbmFnZXI6OkNoZWNrTGl2ZVN5bWJvbHNGdW5jKGNoZWNrZXIsIF9jaGVja0xpdmVTeW1ib2xzPENIRUNLRVI+KSk7CisgIH0KK307CisKK2NsYXNzIERlYWRTeW1ib2xzIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyB2b2lkIF9jaGVja0RlYWRTeW1ib2xzKHZvaWQgKmNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFJlYXBlciAmU1IsIENoZWNrZXJDb250ZXh0ICZDKSB7CisgICAgKChjb25zdCBDSEVDS0VSICopY2hlY2tlciktPmNoZWNrRGVhZFN5bWJvbHMoU1IsIEMpOworICB9CisKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyB2b2lkIF9yZWdpc3RlcihDSEVDS0VSICpjaGVja2VyLCBDaGVja2VyTWFuYWdlciAmbWdyKSB7CisgICAgbWdyLl9yZWdpc3RlckZvckRlYWRTeW1ib2xzKAorICAgICBDaGVja2VyTWFuYWdlcjo6Q2hlY2tEZWFkU3ltYm9sc0Z1bmMoY2hlY2tlciwgX2NoZWNrRGVhZFN5bWJvbHM8Q0hFQ0tFUj4pKTsKKyAgfQorfTsKKworY2xhc3MgUmVnaW9uQ2hhbmdlcyB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgUHJvZ3JhbVN0YXRlUmVmIAorICBfY2hlY2tSZWdpb25DaGFuZ2VzKHZvaWQgKmNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludmFsaWRhdGVkU3ltYm9scyAqaW52YWxpZGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgTWVtUmVnaW9uICo+IEV4cGxpY2l0cywKKyAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBNZW1SZWdpb24gKj4gUmVnaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEV2ZW50ICpDYWxsKSB7CisgICAgcmV0dXJuICgoY29uc3QgQ0hFQ0tFUiAqKSBjaGVja2VyKS0+Y2hlY2tSZWdpb25DaGFuZ2VzKHN0YXRlLCBpbnZhbGlkYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbGljaXRzLCBSZWdpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ3R4LCBDYWxsKTsKKyAgfQorCitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBfcmVnaXN0ZXIoQ0hFQ0tFUiAqY2hlY2tlciwgQ2hlY2tlck1hbmFnZXIgJm1ncikgeworICAgIG1nci5fcmVnaXN0ZXJGb3JSZWdpb25DaGFuZ2VzKAorICAgICAgICAgIENoZWNrZXJNYW5hZ2VyOjpDaGVja1JlZ2lvbkNoYW5nZXNGdW5jKGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NoZWNrUmVnaW9uQ2hhbmdlczxDSEVDS0VSPikpOworICB9Cit9OworCitjbGFzcyBQb2ludGVyRXNjYXBlIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyBQcm9ncmFtU3RhdGVSZWYKKyAgX2NoZWNrUG9pbnRlckVzY2FwZSh2b2lkICpDaGVja2VyLAorICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW52YWxpZGF0ZWRTeW1ib2xzICZFc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEV2ZW50ICpDYWxsLAorICAgICAgICAgICAgICAgICAgICAgUG9pbnRlckVzY2FwZUtpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgIFJlZ2lvbkFuZFN5bWJvbEludmFsaWRhdGlvblRyYWl0cyAqRVRyYWl0cykgeworCisgICAgaWYgKCFFVHJhaXRzKQorICAgICAgcmV0dXJuICgoY29uc3QgQ0hFQ0tFUiAqKUNoZWNrZXIpLT5jaGVja1BvaW50ZXJFc2NhcGUoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtpbmQpOworCisgICAgSW52YWxpZGF0ZWRTeW1ib2xzIFJlZ3VsYXJFc2NhcGU7CisgICAgZm9yIChJbnZhbGlkYXRlZFN5bWJvbHM6OmNvbnN0X2l0ZXJhdG9yIEkgPSBFc2NhcGVkLmJlZ2luKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gRXNjYXBlZC5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBpZiAoIUVUcmFpdHMtPmhhc1RyYWl0KCpJLAorICAgICAgICAgICAgICBSZWdpb25BbmRTeW1ib2xJbnZhbGlkYXRpb25UcmFpdHM6OlRLX1ByZXNlcnZlQ29udGVudHMpICYmCisgICAgICAgICAgIUVUcmFpdHMtPmhhc1RyYWl0KCpJLAorICAgICAgICAgICAgICBSZWdpb25BbmRTeW1ib2xJbnZhbGlkYXRpb25UcmFpdHM6OlRLX1N1cHByZXNzRXNjYXBlKSkKKyAgICAgICAgUmVndWxhckVzY2FwZS5pbnNlcnQoKkkpOworCisgICAgaWYgKFJlZ3VsYXJFc2NhcGUuZW1wdHkoKSkKKyAgICAgIHJldHVybiBTdGF0ZTsKKworICAgIHJldHVybiAoKGNvbnN0IENIRUNLRVIgKilDaGVja2VyKS0+Y2hlY2tQb2ludGVyRXNjYXBlKFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ3VsYXJFc2NhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLaW5kKTsKKyAgfQorCitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBfcmVnaXN0ZXIoQ0hFQ0tFUiAqY2hlY2tlciwgQ2hlY2tlck1hbmFnZXIgJm1ncikgeworICAgIG1nci5fcmVnaXN0ZXJGb3JQb2ludGVyRXNjYXBlKAorICAgICAgICAgIENoZWNrZXJNYW5hZ2VyOjpDaGVja1BvaW50ZXJFc2NhcGVGdW5jKGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2hlY2tQb2ludGVyRXNjYXBlPENIRUNLRVI+KSk7CisgIH0KK307CisKK2NsYXNzIENvbnN0UG9pbnRlckVzY2FwZSB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgUHJvZ3JhbVN0YXRlUmVmCisgIF9jaGVja0NvbnN0UG9pbnRlckVzY2FwZSh2b2lkICpDaGVja2VyLAorICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnZhbGlkYXRlZFN5bWJvbHMgJkVzY2FwZWQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEV2ZW50ICpDYWxsLAorICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJFc2NhcGVLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgUmVnaW9uQW5kU3ltYm9sSW52YWxpZGF0aW9uVHJhaXRzICpFVHJhaXRzKSB7CisKKyAgICBpZiAoIUVUcmFpdHMpCisgICAgICByZXR1cm4gU3RhdGU7CisKKyAgICBJbnZhbGlkYXRlZFN5bWJvbHMgQ29uc3RFc2NhcGU7CisgICAgZm9yIChJbnZhbGlkYXRlZFN5bWJvbHM6OmNvbnN0X2l0ZXJhdG9yIEkgPSBFc2NhcGVkLmJlZ2luKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gRXNjYXBlZC5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBpZiAoRVRyYWl0cy0+aGFzVHJhaXQoKkksCisgICAgICAgICAgICAgIFJlZ2lvbkFuZFN5bWJvbEludmFsaWRhdGlvblRyYWl0czo6VEtfUHJlc2VydmVDb250ZW50cykgJiYKKyAgICAgICAgICAhRVRyYWl0cy0+aGFzVHJhaXQoKkksCisgICAgICAgICAgICAgIFJlZ2lvbkFuZFN5bWJvbEludmFsaWRhdGlvblRyYWl0czo6VEtfU3VwcHJlc3NFc2NhcGUpKQorICAgICAgICBDb25zdEVzY2FwZS5pbnNlcnQoKkkpOworCisgICAgaWYgKENvbnN0RXNjYXBlLmVtcHR5KCkpCisgICAgICByZXR1cm4gU3RhdGU7CisKKyAgICByZXR1cm4gKChjb25zdCBDSEVDS0VSICopQ2hlY2tlciktPmNoZWNrQ29uc3RQb2ludGVyRXNjYXBlKFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RFc2NhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2luZCk7CisgIH0KKworcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0tFUj4KKyAgc3RhdGljIHZvaWQgX3JlZ2lzdGVyKENIRUNLRVIgKmNoZWNrZXIsIENoZWNrZXJNYW5hZ2VyICZtZ3IpIHsKKyAgICBtZ3IuX3JlZ2lzdGVyRm9yUG9pbnRlckVzY2FwZSgKKyAgICAgIENoZWNrZXJNYW5hZ2VyOjpDaGVja1BvaW50ZXJFc2NhcGVGdW5jKGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jaGVja0NvbnN0UG9pbnRlckVzY2FwZTxDSEVDS0VSPikpOworICB9Cit9OworCisgIAordGVtcGxhdGUgPHR5cGVuYW1lIEVWRU5UPgorY2xhc3MgRXZlbnQgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0tFUj4KKyAgc3RhdGljIHZvaWQgX2NoZWNrRXZlbnQodm9pZCAqY2hlY2tlciwgY29uc3Qgdm9pZCAqZXZlbnQpIHsKKyAgICAoKGNvbnN0IENIRUNLRVIgKiljaGVja2VyKS0+Y2hlY2tFdmVudCgqKGNvbnN0IEVWRU5UICopZXZlbnQpOworICB9CitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBfcmVnaXN0ZXIoQ0hFQ0tFUiAqY2hlY2tlciwgQ2hlY2tlck1hbmFnZXIgJm1ncikgeworICAgIG1nci5fcmVnaXN0ZXJMaXN0ZW5lckZvckV2ZW50PEVWRU5UPigKKyAgICAgICAgICAgICAgICAgQ2hlY2tlck1hbmFnZXI6OkNoZWNrRXZlbnRGdW5jKGNoZWNrZXIsIF9jaGVja0V2ZW50PENIRUNLRVI+KSk7CisgIH0KK307CisKK30gLy8gZW5kIGNoZWNrIG5hbWVzcGFjZQorCituYW1lc3BhY2UgZXZhbCB7CisKK2NsYXNzIEFzc3VtZSB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgUHJvZ3JhbVN0YXRlUmVmIF9ldmFsQXNzdW1lKHZvaWQgKmNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1ZhbCAmY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhc3N1bXB0aW9uKSB7CisgICAgcmV0dXJuICgoY29uc3QgQ0hFQ0tFUiAqKWNoZWNrZXIpLT5ldmFsQXNzdW1lKHN0YXRlLCBjb25kLCBhc3N1bXB0aW9uKTsKKyAgfQorCitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBfcmVnaXN0ZXIoQ0hFQ0tFUiAqY2hlY2tlciwgQ2hlY2tlck1hbmFnZXIgJm1ncikgeworICAgIG1nci5fcmVnaXN0ZXJGb3JFdmFsQXNzdW1lKAorICAgICAgICAgICAgICAgICBDaGVja2VyTWFuYWdlcjo6RXZhbEFzc3VtZUZ1bmMoY2hlY2tlciwgX2V2YWxBc3N1bWU8Q0hFQ0tFUj4pKTsKKyAgfQorfTsKKworY2xhc3MgQ2FsbCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgYm9vbCBfZXZhbENhbGwodm9pZCAqY2hlY2tlciwgY29uc3QgQ2FsbEV4cHIgKkNFLCBDaGVja2VyQ29udGV4dCAmQykgeworICAgIHJldHVybiAoKGNvbnN0IENIRUNLRVIgKiljaGVja2VyKS0+ZXZhbENhbGwoQ0UsIEMpOworICB9CisKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyB2b2lkIF9yZWdpc3RlcihDSEVDS0VSICpjaGVja2VyLCBDaGVja2VyTWFuYWdlciAmbWdyKSB7CisgICAgbWdyLl9yZWdpc3RlckZvckV2YWxDYWxsKAorICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlck1hbmFnZXI6OkV2YWxDYWxsRnVuYyhjaGVja2VyLCBfZXZhbENhbGw8Q0hFQ0tFUj4pKTsKKyAgfQorfTsKKworfSAvLyBlbmQgZXZhbCBuYW1lc3BhY2UKKworY2xhc3MgQ2hlY2tlckJhc2UgOiBwdWJsaWMgUHJvZ3JhbVBvaW50VGFnIHsKKyAgQ2hlY2tOYW1lIE5hbWU7CisgIGZyaWVuZCBjbGFzcyA6OmNsYW5nOjplbnRvOjpDaGVja2VyTWFuYWdlcjsKKworcHVibGljOgorICBTdHJpbmdSZWYgZ2V0VGFnRGVzY3JpcHRpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgQ2hlY2tOYW1lIGdldENoZWNrTmFtZSgpIGNvbnN0OworCisgIC8vLyBTZWUgQ2hlY2tlck1hbmFnZXI6OnJ1bkNoZWNrZXJzRm9yUHJpbnRTdGF0ZS4KKyAgdmlydHVhbCB2b2lkIHByaW50U3RhdGUocmF3X29zdHJlYW0gJk91dCwgUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOTCwgY29uc3QgY2hhciAqU2VwKSBjb25zdCB7IH0KK307CisKKy8vLyBEdW1wIGNoZWNrZXIgbmFtZSB0byBzdHJlYW0uCityYXdfb3N0cmVhbSYgb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT3V0LCBjb25zdCBDaGVja2VyQmFzZSAmQ2hlY2tlcik7CisKKy8vLyBUYWcgdGhhdCBjYW4gdXNlIGEgY2hlY2tlciBuYW1lIGFzIGEgbWVzc2FnZSBwcm92aWRlciAKKy8vLyAoc2VlIFNpbXBsZVByb2dyYW1Qb2ludFRhZykuCitjbGFzcyBDaGVja2VyUHJvZ3JhbVBvaW50VGFnIDogcHVibGljIFNpbXBsZVByb2dyYW1Qb2ludFRhZyB7CitwdWJsaWM6CisgIENoZWNrZXJQcm9ncmFtUG9pbnRUYWcoU3RyaW5nUmVmIENoZWNrZXJOYW1lLCBTdHJpbmdSZWYgTXNnKTsKKyAgQ2hlY2tlclByb2dyYW1Qb2ludFRhZyhjb25zdCBDaGVja2VyQmFzZSAqQ2hlY2tlciwgU3RyaW5nUmVmIE1zZyk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0sxLCB0eXBlbmFtZS4uLiBDSEVDS3M+CitjbGFzcyBDaGVja2VyIDogcHVibGljIENIRUNLMSwgcHVibGljIENIRUNLcy4uLiwgcHVibGljIENoZWNrZXJCYXNlIHsKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyB2b2lkIF9yZWdpc3RlcihDSEVDS0VSICpjaGVja2VyLCBDaGVja2VyTWFuYWdlciAmbWdyKSB7CisgICAgQ0hFQ0sxOjpfcmVnaXN0ZXIoY2hlY2tlciwgbWdyKTsKKyAgICBDaGVja2VyPENIRUNLcy4uLj46Ol9yZWdpc3RlcihjaGVja2VyLCBtZ3IpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0sxPgorY2xhc3MgQ2hlY2tlcjxDSEVDSzE+IDogcHVibGljIENIRUNLMSwgcHVibGljIENoZWNrZXJCYXNlIHsKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyB2b2lkIF9yZWdpc3RlcihDSEVDS0VSICpjaGVja2VyLCBDaGVja2VyTWFuYWdlciAmbWdyKSB7CisgICAgQ0hFQ0sxOjpfcmVnaXN0ZXIoY2hlY2tlciwgbWdyKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEVWRU5UPgorY2xhc3MgRXZlbnREaXNwYXRjaGVyIHsKKyAgQ2hlY2tlck1hbmFnZXIgKk1ncjsKK3B1YmxpYzoKKyAgRXZlbnREaXNwYXRjaGVyKCkgOiBNZ3IobnVsbHB0cikgeyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENIRUNLRVI+CisgIHN0YXRpYyB2b2lkIF9yZWdpc3RlcihDSEVDS0VSICpjaGVja2VyLCBDaGVja2VyTWFuYWdlciAmbWdyKSB7CisgICAgbWdyLl9yZWdpc3RlckRpc3BhdGNoZXJGb3JFdmVudDxFVkVOVD4oKTsKKyAgICBzdGF0aWNfY2FzdDxFdmVudERpc3BhdGNoZXI8RVZFTlQ+ICo+KGNoZWNrZXIpLT5NZ3IgPSAmbWdyOworICB9CisKKyAgdm9pZCBkaXNwYXRjaEV2ZW50KGNvbnN0IEVWRU5UICZldmVudCkgY29uc3QgeworICAgIE1nci0+X2Rpc3BhdGNoRXZlbnQoZXZlbnQpOworICB9Cit9OworCisvLy8gXGJyaWVmIFdlIGRlcmVmZXJlbmNlZCBhIGxvY2F0aW9uIHRoYXQgbWF5IGJlIG51bGwuCitzdHJ1Y3QgSW1wbGljaXROdWxsRGVyZWZFdmVudCB7CisgIFNWYWwgTG9jYXRpb247CisgIGJvb2wgSXNMb2FkOworICBFeHBsb2RlZE5vZGUgKlNpbmtOb2RlOworICBCdWdSZXBvcnRlciAqQlI7CisgIC8vIFdoZW4gdHJ1ZSwgdGhlIGRlcmVmZXJlbmNlIGlzIGluIHRoZSBzb3VyY2UgY29kZSBkaXJlY3RseS4gV2hlbiBmYWxzZSwgdGhlCisgIC8vIGRlcmVmZXJlbmNlIG1pZ2h0IGhhcHBlbiBsYXRlciAoZm9yIGV4YW1wbGUgcG9pbnRlciBwYXNzZWQgdG8gYSBwYXJhbWV0ZXIKKyAgLy8gdGhhdCBpcyBtYXJrZWQgd2l0aCBub25udWxsIGF0dHJpYnV0ZS4pCisgIGJvb2wgSXNEaXJlY3REZXJlZmVyZW5jZTsKK307CisKKy8vLyBcYnJpZWYgQSBoZWxwZXIgY2xhc3Mgd2hpY2ggd3JhcHMgYSBib29sZWFuIHZhbHVlIHNldCB0byBmYWxzZSBieSBkZWZhdWx0LgorLy8vCisvLy8gVGhpcyBjbGFzcyBzaG91bGQgYmVoYXZlIGV4YWN0bHkgbGlrZSAnYm9vbCcgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBuZWVkIHRvCisvLy8gYmUgZXhwbGljaXRseSBpbml0aWFsaXplZC4KK3N0cnVjdCBEZWZhdWx0Qm9vbCB7CisgIGJvb2wgdmFsOworICBEZWZhdWx0Qm9vbCgpIDogdmFsKGZhbHNlKSB7fQorICAvKmltcGxpY2l0Ki8gb3BlcmF0b3IgYm9vbCYoKSB7IHJldHVybiB2YWw7IH0KKyAgLyppbXBsaWNpdCovIG9wZXJhdG9yIGNvbnN0IGJvb2wmKCkgY29uc3QgeyByZXR1cm4gdmFsOyB9CisgIERlZmF1bHRCb29sICZvcGVyYXRvcj0oYm9vbCBiKSB7IHZhbCA9IGI7IHJldHVybiAqdGhpczsgfQorfTsKKworfSAvLyBlbmQgZW50byBuYW1lc3BhY2UKKworfSAvLyBlbmQgY2xhbmcgbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyTWFuYWdlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTcxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0NoZWNrZXJNYW5hZ2VyLmgKQEAgLTAsMCArMSw2NTkgQEAKKy8vPT09LSBDaGVja2VyTWFuYWdlci5oIC0gU3RhdGljIEFuYWx5emVyIENoZWNrZXIgTWFuYWdlciAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVmaW5lcyB0aGUgU3RhdGljIEFuYWx5emVyIENoZWNrZXIgTWFuYWdlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9DSEVDS0VSTUFOQUdFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9DSEVDS0VSTUFOQUdFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9Qcm9ncmFtUG9pbnQuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MYW5nT3B0aW9ucy5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Qcm9ncmFtU3RhdGVfRndkLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N0b3JlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBbmFseXplck9wdGlvbnM7CitjbGFzcyBDYWxsRXhwcjsKK2NsYXNzIENYWE5ld0V4cHI7CitjbGFzcyBEZWNsOworY2xhc3MgTG9jYXRpb25Db250ZXh0OworY2xhc3MgU3RtdDsKK2NsYXNzIFRyYW5zbGF0aW9uVW5pdERlY2w7CisKK25hbWVzcGFjZSBlbnRvIHsKKworY2xhc3MgQW5hbHlzaXNNYW5hZ2VyOworY2xhc3MgQnVnUmVwb3J0ZXI7CitjbGFzcyBDYWxsRXZlbnQ7CitjbGFzcyBDaGVja2VyQmFzZTsKK2NsYXNzIENoZWNrZXJDb250ZXh0OworY2xhc3MgQ2hlY2tlclJlZ2lzdHJ5OworY2xhc3MgRXhwbG9kZWRHcmFwaDsKK2NsYXNzIEV4cGxvZGVkTm9kZTsKK2NsYXNzIEV4cGxvZGVkTm9kZVNldDsKK2NsYXNzIEV4cHJFbmdpbmU7CitjbGFzcyBNZW1SZWdpb247CitzdHJ1Y3QgTm9kZUJ1aWxkZXJDb250ZXh0OworY2xhc3MgT2JqQ01ldGhvZENhbGw7CitjbGFzcyBSZWdpb25BbmRTeW1ib2xJbnZhbGlkYXRpb25UcmFpdHM7CitjbGFzcyBTVmFsOworY2xhc3MgU3ltYm9sUmVhcGVyOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQ2hlY2tlckZuOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUkVULCB0eXBlbmFtZS4uLiBQcz4KK2NsYXNzIENoZWNrZXJGbjxSRVQoUHMuLi4pPiB7CisgIHVzaW5nIEZ1bmMgPSBSRVQgKCopKHZvaWQgKiwgUHMuLi4pOworCisgIEZ1bmMgRm47CisKK3B1YmxpYzoKKyAgQ2hlY2tlckJhc2UgKkNoZWNrZXI7CisKKyAgQ2hlY2tlckZuKENoZWNrZXJCYXNlICpjaGVja2VyLCBGdW5jIGZuKSA6IEZuKGZuKSwgQ2hlY2tlcihjaGVja2VyKSB7fQorCisgIFJFVCBvcGVyYXRvcigpKFBzLi4uIHBzKSBjb25zdCB7CisgICAgcmV0dXJuIEZuKENoZWNrZXIsIHBzLi4uKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIGRpZmZlcmVudCByZWFzb25zIGEgcG9pbnRlciBlc2NhcGVzCisvLy8gZHVyaW5nIGFuYWx5c2lzLgorZW51bSBQb2ludGVyRXNjYXBlS2luZCB7CisgIC8vLyBBIHBvaW50ZXIgZXNjYXBlcyBkdWUgdG8gYmluZGluZyBpdHMgdmFsdWUgdG8gYSBsb2NhdGlvbgorICAvLy8gdGhhdCB0aGUgYW5hbHl6ZXIgY2Fubm90IHRyYWNrLgorICBQU0tfRXNjYXBlT25CaW5kLAorCisgIC8vLyBUaGUgcG9pbnRlciBoYXMgYmVlbiBwYXNzZWQgdG8gYSBmdW5jdGlvbiBjYWxsIGRpcmVjdGx5LgorICBQU0tfRGlyZWN0RXNjYXBlT25DYWxsLAorCisgIC8vLyBUaGUgcG9pbnRlciBoYXMgYmVlbiBwYXNzZWQgdG8gYSBmdW5jdGlvbiBpbmRpcmVjdGx5LgorICAvLy8gRm9yIGV4YW1wbGUsIHRoZSBwb2ludGVyIGlzIGFjY2Vzc2libGUgdGhyb3VnaCBhbgorICAvLy8gYXJndW1lbnQgdG8gYSBmdW5jdGlvbi4KKyAgUFNLX0luZGlyZWN0RXNjYXBlT25DYWxsLAorCisgIC8vLyBUaGUgcmVhc29uIGZvciBwb2ludGVyIGVzY2FwZSBpcyB1bmtub3duLiBGb3IgZXhhbXBsZSwgCisgIC8vLyBhIHJlZ2lvbiBjb250YWluaW5nIHRoaXMgcG9pbnRlciBpcyBpbnZhbGlkYXRlZC4KKyAgUFNLX0VzY2FwZU90aGVyCit9OworCisvLyBUaGlzIHdyYXBwZXIgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBvbmx5IFN0cmluZ1JlZnMgb3JpZ2luYXRpbmcgZnJvbSB0aGUKKy8vIENoZWNrZXJSZWdpc3RyeSBhcmUgdXNlZCBhcyBjaGVjayBuYW1lcy4gV2Ugd2FudCB0byBtYWtlIHN1cmUgYWxsIGNoZWNrCisvLyBuYW1lIHN0cmluZ3MgaGF2ZSBhIGxpZmV0aW1lIHRoYXQga2VlcHMgdGhlbSBhbGl2ZSBhdCBsZWFzdCB1bnRpbCB0aGUgcGF0aAorLy8gZGlhZ25vc3RpY3MgaGF2ZSBiZWVuIHByb2Nlc3NlZC4KK2NsYXNzIENoZWNrTmFtZSB7CisgIGZyaWVuZCBjbGFzcyA6OmNsYW5nOjplbnRvOjpDaGVja2VyUmVnaXN0cnk7CisKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgZXhwbGljaXQgQ2hlY2tOYW1lKFN0cmluZ1JlZiBOYW1lKSA6IE5hbWUoTmFtZSkge30KKworcHVibGljOgorICBDaGVja05hbWUoKSA9IGRlZmF1bHQ7CisKKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9Cit9OworCitlbnVtIGNsYXNzIE9iakNNZXNzYWdlVmlzaXRLaW5kIHsKKyAgUHJlLAorICBQb3N0LAorICBNZXNzYWdlTmlsCit9OworCitjbGFzcyBDaGVja2VyTWFuYWdlciB7CisgIGNvbnN0IExhbmdPcHRpb25zIExhbmdPcHRzOworICBBbmFseXplck9wdGlvbnMgJkFPcHRpb25zOworICBDaGVja05hbWUgQ3VycmVudENoZWNrTmFtZTsKKworcHVibGljOgorICBDaGVja2VyTWFuYWdlcihjb25zdCBMYW5nT3B0aW9ucyAmbGFuZ09wdHMsIEFuYWx5emVyT3B0aW9ucyAmQU9wdGlvbnMpCisgICAgICA6IExhbmdPcHRzKGxhbmdPcHRzKSwgQU9wdGlvbnMoQU9wdGlvbnMpIHt9CisKKyAgfkNoZWNrZXJNYW5hZ2VyKCk7CisKKyAgdm9pZCBzZXRDdXJyZW50Q2hlY2tOYW1lKENoZWNrTmFtZSBuYW1lKSB7IEN1cnJlbnRDaGVja05hbWUgPSBuYW1lOyB9CisgIENoZWNrTmFtZSBnZXRDdXJyZW50Q2hlY2tOYW1lKCkgY29uc3QgeyByZXR1cm4gQ3VycmVudENoZWNrTmFtZTsgfQorCisgIGJvb2wgaGFzUGF0aFNlbnNpdGl2ZUNoZWNrZXJzKCkgY29uc3Q7CisKKyAgdm9pZCBmaW5pc2hlZENoZWNrZXJSZWdpc3RyYXRpb24oKTsKKworICBjb25zdCBMYW5nT3B0aW9ucyAmZ2V0TGFuZ09wdHMoKSBjb25zdCB7IHJldHVybiBMYW5nT3B0czsgfQorICBBbmFseXplck9wdGlvbnMgJmdldEFuYWx5emVyT3B0aW9ucygpIHsgcmV0dXJuIEFPcHRpb25zOyB9CisKKyAgdXNpbmcgQ2hlY2tlclJlZiA9IENoZWNrZXJCYXNlICo7CisgIHVzaW5nIENoZWNrZXJUYWcgPSBjb25zdCB2b2lkICo7CisgIHVzaW5nIENoZWNrZXJEdG9yID0gQ2hlY2tlckZuPHZvaWQgKCk+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gcmVnaXN0ZXJDaGVja2VyCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgVXNlZCB0byByZWdpc3RlciBjaGVja2Vycy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNoZWNrZXIgb2JqZWN0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0tFUj4KKyAgQ0hFQ0tFUiAqcmVnaXN0ZXJDaGVja2VyKCkgeworICAgIENoZWNrZXJUYWcgdGFnID0gZ2V0VGFnPENIRUNLRVI+KCk7CisgICAgQ2hlY2tlclJlZiAmcmVmID0gQ2hlY2tlclRhZ3NbdGFnXTsKKyAgICBpZiAocmVmKQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENIRUNLRVIgKj4ocmVmKTsgLy8gYWxyZWFkeSByZWdpc3RlcmVkLgorCisgICAgQ0hFQ0tFUiAqY2hlY2tlciA9IG5ldyBDSEVDS0VSKCk7CisgICAgY2hlY2tlci0+TmFtZSA9IEN1cnJlbnRDaGVja05hbWU7CisgICAgQ2hlY2tlckR0b3JzLnB1c2hfYmFjayhDaGVja2VyRHRvcihjaGVja2VyLCBkZXN0cnVjdDxDSEVDS0VSPikpOworICAgIENIRUNLRVI6Ol9yZWdpc3RlcihjaGVja2VyLCAqdGhpcyk7CisgICAgcmVmID0gY2hlY2tlcjsKKyAgICByZXR1cm4gY2hlY2tlcjsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBDSEVDS0VSICpyZWdpc3RlckNoZWNrZXIoQW5hbHl6ZXJPcHRpb25zICZBT3B0cykgeworICAgIENoZWNrZXJUYWcgdGFnID0gZ2V0VGFnPENIRUNLRVI+KCk7CisgICAgQ2hlY2tlclJlZiAmcmVmID0gQ2hlY2tlclRhZ3NbdGFnXTsKKyAgICBpZiAocmVmKQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENIRUNLRVIgKj4ocmVmKTsgLy8gYWxyZWFkeSByZWdpc3RlcmVkLgorCisgICAgQ0hFQ0tFUiAqY2hlY2tlciA9IG5ldyBDSEVDS0VSKEFPcHRzKTsKKyAgICBjaGVja2VyLT5OYW1lID0gQ3VycmVudENoZWNrTmFtZTsKKyAgICBDaGVja2VyRHRvcnMucHVzaF9iYWNrKENoZWNrZXJEdG9yKGNoZWNrZXIsIGRlc3RydWN0PENIRUNLRVI+KSk7CisgICAgQ0hFQ0tFUjo6X3JlZ2lzdGVyKGNoZWNrZXIsICp0aGlzKTsKKyAgICByZWYgPSBjaGVja2VyOworICAgIHJldHVybiBjaGVja2VyOworICB9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGdW5jdGlvbnMgZm9yIHJ1bm5pbmcgY2hlY2tlcnMgZm9yIEFTVCB0cmF2ZXJzaW5nLi4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFxicmllZiBSdW4gY2hlY2tlcnMgaGFuZGxpbmcgRGVjbHMuCisgIHZvaWQgcnVuQ2hlY2tlcnNPbkFTVERlY2woY29uc3QgRGVjbCAqRCwgQW5hbHlzaXNNYW5hZ2VyJiBtZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXIgJkJSKTsKKworICAvLy8gXGJyaWVmIFJ1biBjaGVja2VycyBoYW5kbGluZyBEZWNscyBjb250YWluaW5nIGEgU3RtdCBib2R5LgorICB2b2lkIHJ1bkNoZWNrZXJzT25BU1RCb2R5KGNvbnN0IERlY2wgKkQsIEFuYWx5c2lzTWFuYWdlciYgbWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyICZCUik7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGdW5jdGlvbnMgZm9yIHJ1bm5pbmcgY2hlY2tlcnMgZm9yIHBhdGgtc2Vuc2l0aXZlIGNoZWNraW5nLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIFJ1biBjaGVja2VycyBmb3IgcHJlLXZpc2l0aW5nIFN0bXRzLgorICAvLy8KKyAgLy8vIFRoZSBub3RpZmljYXRpb24gaXMgcGVyZm9ybWVkIGZvciBldmVyeSBleHBsb3JlZCBDRkdFbGVtZW50LCB3aGljaCBkb2VzCisgIC8vLyBub3QgaW5jbHVkZSB0aGUgY29udHJvbCBmbG93IHN0YXRlbWVudHMgc3VjaCBhcyBJZlN0bXQuCisgIC8vLworICAvLy8gXHNhIHJ1bkNoZWNrZXJzRm9yQnJhbmNoQ29uZGl0aW9uLCBydW5DaGVja2Vyc0ZvclBvc3RTdG10CisgIHZvaWQgcnVuQ2hlY2tlcnNGb3JQcmVTdG10KEV4cGxvZGVkTm9kZVNldCAmRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGVTZXQgJlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RtdCAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwckVuZ2luZSAmRW5nKSB7CisgICAgcnVuQ2hlY2tlcnNGb3JTdG10KC8qaXNQcmVWaXNpdD0qL3RydWUsIERzdCwgU3JjLCBTLCBFbmcpOworICB9CisKKyAgLy8vIFxicmllZiBSdW4gY2hlY2tlcnMgZm9yIHBvc3QtdmlzaXRpbmcgU3RtdHMuCisgIC8vLworICAvLy8gVGhlIG5vdGlmaWNhdGlvbiBpcyBwZXJmb3JtZWQgZm9yIGV2ZXJ5IGV4cGxvcmVkIENGR0VsZW1lbnQsIHdoaWNoIGRvZXMKKyAgLy8vIG5vdCBpbmNsdWRlIHRoZSBjb250cm9sIGZsb3cgc3RhdGVtZW50cyBzdWNoIGFzIElmU3RtdC4KKyAgLy8vCisgIC8vLyBcc2EgcnVuQ2hlY2tlcnNGb3JCcmFuY2hDb25kaXRpb24sIHJ1bkNoZWNrZXJzRm9yUHJlU3RtdAorICB2b2lkIHJ1bkNoZWNrZXJzRm9yUG9zdFN0bXQoRXhwbG9kZWROb2RlU2V0ICZEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGVTZXQgJlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0bXQgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByRW5naW5lICZFbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdhc0lubGluZWQgPSBmYWxzZSkgeworICAgIHJ1bkNoZWNrZXJzRm9yU3RtdCgvKmlzUHJlVmlzaXQ9Ki9mYWxzZSwgRHN0LCBTcmMsIFMsIEVuZywgd2FzSW5saW5lZCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJ1biBjaGVja2VycyBmb3IgdmlzaXRpbmcgU3RtdHMuCisgIHZvaWQgcnVuQ2hlY2tlcnNGb3JTdG10KGJvb2wgaXNQcmVWaXNpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QsIGNvbnN0IEV4cGxvZGVkTm9kZVNldCAmU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdG10ICpTLCBFeHByRW5naW5lICZFbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2FzSW5saW5lZCA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIFJ1biBjaGVja2VycyBmb3IgcHJlLXZpc2l0aW5nIG9iai1jIG1lc3NhZ2VzLgorICB2b2lkIHJ1bkNoZWNrZXJzRm9yUHJlT2JqQ01lc3NhZ2UoRXhwbG9kZWROb2RlU2V0ICZEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGVTZXQgJlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNNZXRob2RDYWxsICZtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByRW5naW5lICZFbmcpIHsKKyAgICBydW5DaGVja2Vyc0Zvck9iakNNZXNzYWdlKE9iakNNZXNzYWdlVmlzaXRLaW5kOjpQcmUsIERzdCwgU3JjLCBtc2csIEVuZyk7CisgIH0KKworICAvLy8gXGJyaWVmIFJ1biBjaGVja2VycyBmb3IgcG9zdC12aXNpdGluZyBvYmotYyBtZXNzYWdlcy4KKyAgdm9pZCBydW5DaGVja2Vyc0ZvclBvc3RPYmpDTWVzc2FnZShFeHBsb2RlZE5vZGVTZXQgJkRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGVTZXQgJlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDTWV0aG9kQ2FsbCAmbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJFbmdpbmUgJkVuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdhc0lubGluZWQgPSBmYWxzZSkgeworICAgIHJ1bkNoZWNrZXJzRm9yT2JqQ01lc3NhZ2UoT2JqQ01lc3NhZ2VWaXNpdEtpbmQ6OlBvc3QsIERzdCwgU3JjLCBtc2csIEVuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0lubGluZWQpOworICB9CisKKyAgLy8vIFxicmllZiBSdW4gY2hlY2tlcnMgZm9yIHZpc2l0aW5nIGFuIG9iai1jIG1lc3NhZ2UgdG8gbmlsLgorICB2b2lkIHJ1bkNoZWNrZXJzRm9yT2JqQ01lc3NhZ2VOaWwoRXhwbG9kZWROb2RlU2V0ICZEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGVTZXQgJlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNNZXRob2RDYWxsICZtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByRW5naW5lICZFbmcpIHsKKyAgICBydW5DaGVja2Vyc0Zvck9iakNNZXNzYWdlKE9iakNNZXNzYWdlVmlzaXRLaW5kOjpNZXNzYWdlTmlsLCBEc3QsIFNyYywgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5nKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUnVuIGNoZWNrZXJzIGZvciB2aXNpdGluZyBvYmotYyBtZXNzYWdlcy4KKyAgdm9pZCBydW5DaGVja2Vyc0Zvck9iakNNZXNzYWdlKE9iakNNZXNzYWdlVmlzaXRLaW5kIHZpc2l0S2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwbG9kZWROb2RlU2V0ICZTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDTWV0aG9kQ2FsbCAmbXNnLCBFeHByRW5naW5lICZFbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdhc0lubGluZWQgPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBSdW4gY2hlY2tlcnMgZm9yIHByZS12aXNpdGluZyBvYmotYyBtZXNzYWdlcy4KKyAgdm9pZCBydW5DaGVja2Vyc0ZvclByZUNhbGwoRXhwbG9kZWROb2RlU2V0ICZEc3QsIGNvbnN0IEV4cGxvZGVkTm9kZVNldCAmU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsRXZlbnQgJkNhbGwsIEV4cHJFbmdpbmUgJkVuZykgeworICAgIHJ1bkNoZWNrZXJzRm9yQ2FsbEV2ZW50KC8qaXNQcmVWaXNpdD0qL3RydWUsIERzdCwgU3JjLCBDYWxsLCBFbmcpOworICB9CisKKyAgLy8vIFxicmllZiBSdW4gY2hlY2tlcnMgZm9yIHBvc3QtdmlzaXRpbmcgb2JqLWMgbWVzc2FnZXMuCisgIHZvaWQgcnVuQ2hlY2tlcnNGb3JQb3N0Q2FsbChFeHBsb2RlZE5vZGVTZXQgJkRzdCwgY29uc3QgRXhwbG9kZWROb2RlU2V0ICZTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsRXZlbnQgJkNhbGwsIEV4cHJFbmdpbmUgJkVuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2FzSW5saW5lZCA9IGZhbHNlKSB7CisgICAgcnVuQ2hlY2tlcnNGb3JDYWxsRXZlbnQoLyppc1ByZVZpc2l0PSovZmFsc2UsIERzdCwgU3JjLCBDYWxsLCBFbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzSW5saW5lZCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJ1biBjaGVja2VycyBmb3IgdmlzaXRpbmcgb2JqLWMgbWVzc2FnZXMuCisgIHZvaWQgcnVuQ2hlY2tlcnNGb3JDYWxsRXZlbnQoYm9vbCBpc1ByZVZpc2l0LCBFeHBsb2RlZE5vZGVTZXQgJkRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGVTZXQgJlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsRXZlbnQgJkNhbGwsIEV4cHJFbmdpbmUgJkVuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdhc0lubGluZWQgPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBSdW4gY2hlY2tlcnMgZm9yIGxvYWQvc3RvcmUgb2YgYSBsb2NhdGlvbi4KKyAgdm9pZCBydW5DaGVja2Vyc0ZvckxvY2F0aW9uKEV4cGxvZGVkTm9kZVNldCAmRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwbG9kZWROb2RlU2V0ICZTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVmFsIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0xvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdG10ICpOb2RlRXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdG10ICpCb3VuZEV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwckVuZ2luZSAmRW5nKTsKKworICAvLy8gXGJyaWVmIFJ1biBjaGVja2VycyBmb3IgYmluZGluZyBvZiBhIHZhbHVlIHRvIGEgbG9jYXRpb24uCisgIHZvaWQgcnVuQ2hlY2tlcnNGb3JCaW5kKEV4cGxvZGVkTm9kZVNldCAmRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGVTZXQgJlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZhbCBsb2NhdGlvbiwgU1ZhbCB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0bXQgKlMsIEV4cHJFbmdpbmUgJkVuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZ3JhbVBvaW50ICZQUCk7CisKKyAgLy8vIFxicmllZiBSdW4gY2hlY2tlcnMgZm9yIGVuZCBvZiBhbmFseXNpcy4KKyAgdm9pZCBydW5DaGVja2Vyc0ZvckVuZEFuYWx5c2lzKEV4cGxvZGVkR3JhcGggJkcsIEJ1Z1JlcG9ydGVyICZCUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJFbmdpbmUgJkVuZyk7CisKKyAgLy8vIFxicmllZiBSdW4gY2hlY2tlcnMgb24gYmVnaW5uaW5nIG9mIGZ1bmN0aW9uLgorICB2b2lkIHJ1bkNoZWNrZXJzRm9yQmVnaW5GdW5jdGlvbihFeHBsb2RlZE5vZGVTZXQgJkRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvY2tFZGdlICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJFbmdpbmUgJkVuZyk7CisKKyAgLy8vIFxicmllZiBSdW4gY2hlY2tlcnMgb24gZW5kIG9mIGZ1bmN0aW9uLgorICB2b2lkIHJ1bkNoZWNrZXJzRm9yRW5kRnVuY3Rpb24oTm9kZUJ1aWxkZXJDb250ZXh0ICZCQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwckVuZ2luZSAmRW5nKTsKKworICAvLy8gXGJyaWVmIFJ1biBjaGVja2VycyBmb3IgYnJhbmNoIGNvbmRpdGlvbi4KKyAgdm9pZCBydW5DaGVja2Vyc0ZvckJyYW5jaENvbmRpdGlvbihjb25zdCBTdG10ICpjb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QsIEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByRW5naW5lICZFbmcpOworCisgIC8vLyBcYnJpZWYgUnVuIGNoZWNrZXJzIGJldHdlZW4gQysrIG9wZXJhdG9yIG5ldyBhbmQgY29uc3RydWN0b3IgY2FsbHMuCisgIHZvaWQgcnVuQ2hlY2tlcnNGb3JOZXdBbGxvY2F0b3IoY29uc3QgQ1hYTmV3RXhwciAqTkUsIFNWYWwgVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByRW5naW5lICZFbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3YXNJbmxpbmVkID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgUnVuIGNoZWNrZXJzIGZvciBsaXZlIHN5bWJvbHMuCisgIC8vLworICAvLy8gQWxsb3dzIG1vZGlmeWluZyBTeW1ib2xSZWFwZXIgb2JqZWN0LiBGb3IgZXhhbXBsZSwgY2hlY2tlcnMgY2FuIGV4cGxpY2l0bHkKKyAgLy8vIHJlZ2lzdGVyIHN5bWJvbHMgb2YgaW50ZXJlc3QgYXMgbGl2ZS4gVGhlc2Ugc3ltYm9scyB3aWxsIG5vdCBiZSBtYXJrZWQKKyAgLy8vIGRlYWQgYW5kIHJlbW92ZWQuCisgIHZvaWQgcnVuQ2hlY2tlcnNGb3JMaXZlU3ltYm9scyhQcm9ncmFtU3RhdGVSZWYgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xSZWFwZXIgJlN5bVJlYXBlcik7CisKKyAgLy8vIFxicmllZiBSdW4gY2hlY2tlcnMgZm9yIGRlYWQgc3ltYm9scy4KKyAgLy8vCisgIC8vLyBOb3RpZmllcyBjaGVja2VycyB3aGVuIHN5bWJvbHMgYmVjb21lIGRlYWQuIEZvciBleGFtcGxlLCB0aGlzIGFsbG93cworICAvLy8gY2hlY2tlcnMgdG8gYWdncmVzc2l2ZWx5IGNsZWFuIHVwL3JlZHVjZSB0aGUgY2hlY2tlciBzdGF0ZSBhbmQgcHJvZHVjZQorICAvLy8gcHJlY2lzZSBkaWFnbm9zdGljcy4KKyAgdm9pZCBydW5DaGVja2Vyc0ZvckRlYWRTeW1ib2xzKEV4cGxvZGVkTm9kZVNldCAmRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwbG9kZWROb2RlU2V0ICZTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xSZWFwZXIgJlN5bVJlYXBlciwgY29uc3QgU3RtdCAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJFbmdpbmUgJkVuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1Qb2ludDo6S2luZCBLKTsKKworICAvLy8gXGJyaWVmIFJ1biBjaGVja2VycyBmb3IgcmVnaW9uIGNoYW5nZXMuCisgIC8vLworICAvLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgY2hlY2s6OlJlZ2lvbkNoYW5nZXMgY2FsbGJhY2suCisgIC8vLyBccGFyYW0gc3RhdGUgVGhlIGN1cnJlbnQgcHJvZ3JhbSBzdGF0ZS4KKyAgLy8vIFxwYXJhbSBpbnZhbGlkYXRlZCBBIHNldCBvZiBhbGwgc3ltYm9scyBwb3RlbnRpYWxseSB0b3VjaGVkIGJ5IHRoZSBjaGFuZ2UuCisgIC8vLyBccGFyYW0gRXhwbGljaXRSZWdpb25zIFRoZSByZWdpb25zIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGZvciBpbnZhbGlkYXRpb24uCisgIC8vLyAgIEZvciBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBhIGZ1bmN0aW9uIGNhbGwsIHRoZXNlIHdvdWxkIGJlIGFyZ3VtZW50cy4KKyAgLy8vIFxwYXJhbSBSZWdpb25zIFRoZSB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWNjZXNzaWJsZSByZWdpb25zLAorICAvLy8gICBpLmUuIGFsbCByZWdpb25zIHRoYXQgbWF5IGhhdmUgYmVlbiB0b3VjaGVkIGJ5IHRoaXMgY2hhbmdlLgorICAvLy8gXHBhcmFtIENhbGwgVGhlIGNhbGwgZXhwcmVzc2lvbiB3cmFwcGVyIGlmIHRoZSByZWdpb25zIGFyZSBpbnZhbGlkYXRlZAorICAvLy8gICBieSBhIGNhbGwuCisgIFByb2dyYW1TdGF0ZVJlZgorICBydW5DaGVja2Vyc0ZvclJlZ2lvbkNoYW5nZXMoUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW52YWxpZGF0ZWRTeW1ib2xzICppbnZhbGlkYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IE1lbVJlZ2lvbiAqPiBFeHBsaWNpdFJlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBNZW1SZWdpb24gKj4gUmVnaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFdmVudCAqQ2FsbCk7CisKKyAgLy8vIFxicmllZiBSdW4gY2hlY2tlcnMgd2hlbiBwb2ludGVycyBlc2NhcGUuCisgIC8vLworICAvLy8gVGhpcyBub3RpZmllcyB0aGUgY2hlY2tlcnMgYWJvdXQgcG9pbnRlciBlc2NhcGUsIHdoaWNoIG9jY3VycyB3aGVuZXZlcgorICAvLy8gdGhlIGFuYWx5emVyIGNhbm5vdCB0cmFjayB0aGUgc3ltYm9sIGFueSBtb3JlLiBGb3IgZXhhbXBsZSwgYXMgYQorICAvLy8gcmVzdWx0IG9mIGFzc2lnbmluZyBhIHBvaW50ZXIgaW50byBhIGdsb2JhbCBvciB3aGVuIGl0J3MgcGFzc2VkIHRvIGEgCisgIC8vLyBmdW5jdGlvbiBjYWxsIHRoZSBhbmFseXplciBjYW5ub3QgbW9kZWwuCisgIC8vLyAKKyAgLy8vIFxwYXJhbSBTdGF0ZSBUaGUgc3RhdGUgYXQgdGhlIHBvaW50IG9mIGVzY2FwZS4KKyAgLy8vIFxwYXJhbSBFc2NhcGVkIFRoZSBsaXN0IG9mIGVzY2FwZWQgc3ltYm9scy4KKyAgLy8vIFxwYXJhbSBDYWxsIFRoZSBjb3JyZXNwb25kaW5nIENhbGxFdmVudCwgaWYgdGhlIHN5bWJvbHMgZXNjYXBlIGFzIAorICAvLy8gICAgICAgIHBhcmFtZXRlcnMgdG8gdGhlIGdpdmVuIGNhbGwuCisgIC8vLyBccGFyYW0gS2luZCBUaGUgcmVhc29uIG9mIHBvaW50ZXIgZXNjYXBlLgorICAvLy8gXHBhcmFtIElUcmFpdHMgSW5mb3JtYXRpb24gYWJvdXQgaW52YWxpZGF0aW9uIGZvciBhIHBhcnRpY3VsYXIgCisgIC8vLyAgICAgICAgcmVnaW9uL3N5bWJvbC4KKyAgLy8vIFxyZXR1cm5zIENoZWNrZXJzIGNhbiBtb2RpZnkgdGhlIHN0YXRlIGJ5IHJldHVybmluZyBhIG5ldyBvbmUuCisgIFByb2dyYW1TdGF0ZVJlZiAKKyAgcnVuQ2hlY2tlcnNGb3JQb2ludGVyRXNjYXBlKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludmFsaWRhdGVkU3ltYm9scyAmRXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFdmVudCAqQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJFc2NhcGVLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpb25BbmRTeW1ib2xJbnZhbGlkYXRpb25UcmFpdHMgKklUcmFpdHMpOworCisgIC8vLyBcYnJpZWYgUnVuIGNoZWNrZXJzIGZvciBoYW5kbGluZyBhc3N1bXB0aW9ucyBvbiBzeW1ib2xpYyB2YWx1ZXMuCisgIFByb2dyYW1TdGF0ZVJlZiBydW5DaGVja2Vyc0ZvckV2YWxBc3N1bWUoUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWYWwgQ29uZCwgYm9vbCBBc3N1bXB0aW9uKTsKKworICAvLy8gXGJyaWVmIFJ1biBjaGVja2VycyBmb3IgZXZhbHVhdGluZyBhIGNhbGwuCisgIC8vLworICAvLy8gV2FybmluZzogQ3VycmVudGx5LCB0aGUgQ2FsbEV2ZW50IE1VU1QgY29tZSBmcm9tIGEgQ2FsbEV4cHIhCisgIHZvaWQgcnVuQ2hlY2tlcnNGb3JFdmFsQ2FsbChFeHBsb2RlZE5vZGVTZXQgJkRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGxvZGVkTm9kZVNldCAmU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEV2ZW50ICZDRSwgRXhwckVuZ2luZSAmRW5nKTsKKyAgCisgIC8vLyBcYnJpZWYgUnVuIGNoZWNrZXJzIGZvciB0aGUgZW50aXJlIFRyYW5zbGF0aW9uIFVuaXQuCisgIHZvaWQgcnVuQ2hlY2tlcnNPbkVuZE9mVHJhbnNsYXRpb25Vbml0KGNvbnN0IFRyYW5zbGF0aW9uVW5pdERlY2wgKlRVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFseXNpc01hbmFnZXIgJm1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXIgJkJSKTsKKworICAvLy8gXGJyaWVmIFJ1biBjaGVja2VycyBmb3IgZGVidWctcHJpbnRpbmcgYSBQcm9ncmFtU3RhdGUuCisgIC8vLworICAvLy8gVW5saWtlIG1vc3Qgb3RoZXIgY2FsbGJhY2tzLCBhbnkgY2hlY2tlciBjYW4gc2ltcGx5IGltcGxlbWVudCB0aGUgdmlydHVhbAorICAvLy8gbWV0aG9kIENoZWNrZXJCYXNlOjpwcmludFN0YXRlIGlmIGl0IGhhcyBjdXN0b20gZGF0YSB0byBwcmludC4KKyAgLy8vIFxwYXJhbSBPdXQgVGhlIG91dHB1dCBzdHJlYW0KKyAgLy8vIFxwYXJhbSBTdGF0ZSBUaGUgc3RhdGUgYmVpbmcgcHJpbnRlZAorICAvLy8gXHBhcmFtIE5MIFRoZSBwcmVmZXJyZWQgcmVwcmVzZW50YXRpb24gb2YgYSBuZXdsaW5lLgorICAvLy8gXHBhcmFtIFNlcCBUaGUgcHJlZmVycmVkIHNlcGFyYXRvciBiZXR3ZWVuIGRpZmZlcmVudCBraW5kcyBvZiBkYXRhLgorICB2b2lkIHJ1bkNoZWNrZXJzRm9yUHJpbnRTdGF0ZShyYXdfb3N0cmVhbSAmT3V0LCBQcm9ncmFtU3RhdGVSZWYgU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5MLCBjb25zdCBjaGFyICpTZXApOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW50ZXJuYWwgcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucyBmb3IgQVNUIHRyYXZlcnNpbmcuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vIEZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSByZWdpc3RyYXRpb24gbWVjaGFuaXNtLCBjaGVja2VycyBzaG91bGQgbm90IHRvdWNoCisgIC8vIHRoZXNlIGRpcmVjdGx5LgorCisgIHVzaW5nIENoZWNrRGVjbEZ1bmMgPQorICAgICAgQ2hlY2tlckZuPHZvaWQgKGNvbnN0IERlY2wgKiwgQW5hbHlzaXNNYW5hZ2VyJiwgQnVnUmVwb3J0ZXIgJik+OworCisgIHVzaW5nIEhhbmRsZXNEZWNsRnVuYyA9IGJvb2wgKCopKGNvbnN0IERlY2wgKkQpOworCisgIHZvaWQgX3JlZ2lzdGVyRm9yRGVjbChDaGVja0RlY2xGdW5jIGNoZWNrZm4sIEhhbmRsZXNEZWNsRnVuYyBpc0ZvckRlY2xGbik7CisKKyAgdm9pZCBfcmVnaXN0ZXJGb3JCb2R5KENoZWNrRGVjbEZ1bmMgY2hlY2tmbik7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbnRlcm5hbCByZWdpc3RyYXRpb24gZnVuY3Rpb25zIGZvciBwYXRoLXNlbnNpdGl2ZSBjaGVja2luZy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgdXNpbmcgQ2hlY2tTdG10RnVuYyA9IENoZWNrZXJGbjx2b2lkIChjb25zdCBTdG10ICosIENoZWNrZXJDb250ZXh0ICYpPjsKKyAgCisgIHVzaW5nIENoZWNrT2JqQ01lc3NhZ2VGdW5jID0KKyAgICAgIENoZWNrZXJGbjx2b2lkIChjb25zdCBPYmpDTWV0aG9kQ2FsbCAmLCBDaGVja2VyQ29udGV4dCAmKT47CisKKyAgdXNpbmcgQ2hlY2tDYWxsRnVuYyA9CisgICAgICBDaGVja2VyRm48dm9pZCAoY29uc3QgQ2FsbEV2ZW50ICYsIENoZWNrZXJDb250ZXh0ICYpPjsKKyAgCisgIHVzaW5nIENoZWNrTG9jYXRpb25GdW5jID0KKyAgICAgIENoZWNrZXJGbjx2b2lkIChjb25zdCBTVmFsICZsb2NhdGlvbiwgYm9vbCBpc0xvYWQsIGNvbnN0IFN0bXQgKlMsCisgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckNvbnRleHQgJik+OworICAKKyAgdXNpbmcgQ2hlY2tCaW5kRnVuYyA9CisgICAgICBDaGVja2VyRm48dm9pZCAoY29uc3QgU1ZhbCAmbG9jYXRpb24sIGNvbnN0IFNWYWwgJnZhbCwgY29uc3QgU3RtdCAqUywKKyAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQ29udGV4dCAmKT47CisgIAorICB1c2luZyBDaGVja0VuZEFuYWx5c2lzRnVuYyA9CisgICAgICBDaGVja2VyRm48dm9pZCAoRXhwbG9kZWRHcmFwaCAmLCBCdWdSZXBvcnRlciAmLCBFeHByRW5naW5lICYpPjsKKworICB1c2luZyBDaGVja0JlZ2luRnVuY3Rpb25GdW5jID0gQ2hlY2tlckZuPHZvaWQgKENoZWNrZXJDb250ZXh0ICYpPjsKKworICB1c2luZyBDaGVja0VuZEZ1bmN0aW9uRnVuYyA9IENoZWNrZXJGbjx2b2lkIChDaGVja2VyQ29udGV4dCAmKT47CisgIAorICB1c2luZyBDaGVja0JyYW5jaENvbmRpdGlvbkZ1bmMgPQorICAgICAgQ2hlY2tlckZuPHZvaWQgKGNvbnN0IFN0bXQgKiwgQ2hlY2tlckNvbnRleHQgJik+OworCisgIHVzaW5nIENoZWNrTmV3QWxsb2NhdG9yRnVuYyA9CisgICAgICBDaGVja2VyRm48dm9pZCAoY29uc3QgQ1hYTmV3RXhwciAqLCBTVmFsLCBDaGVja2VyQ29udGV4dCAmKT47CisgIAorICB1c2luZyBDaGVja0RlYWRTeW1ib2xzRnVuYyA9CisgICAgICBDaGVja2VyRm48dm9pZCAoU3ltYm9sUmVhcGVyICYsIENoZWNrZXJDb250ZXh0ICYpPjsKKyAgCisgIHVzaW5nIENoZWNrTGl2ZVN5bWJvbHNGdW5jID0gQ2hlY2tlckZuPHZvaWQgKFByb2dyYW1TdGF0ZVJlZixTeW1ib2xSZWFwZXIgJik+OworICAKKyAgdXNpbmcgQ2hlY2tSZWdpb25DaGFuZ2VzRnVuYyA9CisgICAgICBDaGVja2VyRm48UHJvZ3JhbVN0YXRlUmVmIChQcm9ncmFtU3RhdGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnZhbGlkYXRlZFN5bWJvbHMgKnN5bWJvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBNZW1SZWdpb24gKj4gRXhwbGljaXRSZWdpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgTWVtUmVnaW9uICo+IFJlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsRXZlbnQgKkNhbGwpPjsKKyAgCisgIHVzaW5nIENoZWNrUG9pbnRlckVzY2FwZUZ1bmMgPQorICAgICAgQ2hlY2tlckZuPFByb2dyYW1TdGF0ZVJlZiAoUHJvZ3JhbVN0YXRlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW52YWxpZGF0ZWRTeW1ib2xzICZFc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEV2ZW50ICpDYWxsLCBQb2ludGVyRXNjYXBlS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaW9uQW5kU3ltYm9sSW52YWxpZGF0aW9uVHJhaXRzICpJVHJhaXRzKT47CisgIAorICB1c2luZyBFdmFsQXNzdW1lRnVuYyA9CisgICAgICBDaGVja2VyRm48UHJvZ3JhbVN0YXRlUmVmIChQcm9ncmFtU3RhdGVSZWYsIGNvbnN0IFNWYWwgJmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFzc3VtcHRpb24pPjsKKyAgCisgIHVzaW5nIEV2YWxDYWxsRnVuYyA9IENoZWNrZXJGbjxib29sIChjb25zdCBDYWxsRXhwciAqLCBDaGVja2VyQ29udGV4dCAmKT47CisKKyAgdXNpbmcgQ2hlY2tFbmRPZlRyYW5zbGF0aW9uVW5pdCA9CisgICAgICBDaGVja2VyRm48dm9pZCAoY29uc3QgVHJhbnNsYXRpb25Vbml0RGVjbCAqLCBBbmFseXNpc01hbmFnZXIgJiwKKyAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnRlciAmKT47CisKKyAgdXNpbmcgSGFuZGxlc1N0bXRGdW5jID0gYm9vbCAoKikoY29uc3QgU3RtdCAqRCk7CisKKyAgdm9pZCBfcmVnaXN0ZXJGb3JQcmVTdG10KENoZWNrU3RtdEZ1bmMgY2hlY2tmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXNTdG10RnVuYyBpc0ZvclN0bXRGbik7CisgIHZvaWQgX3JlZ2lzdGVyRm9yUG9zdFN0bXQoQ2hlY2tTdG10RnVuYyBjaGVja2ZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXNTdG10RnVuYyBpc0ZvclN0bXRGbik7CisKKyAgdm9pZCBfcmVnaXN0ZXJGb3JQcmVPYmpDTWVzc2FnZShDaGVja09iakNNZXNzYWdlRnVuYyBjaGVja2ZuKTsKKyAgdm9pZCBfcmVnaXN0ZXJGb3JQb3N0T2JqQ01lc3NhZ2UoQ2hlY2tPYmpDTWVzc2FnZUZ1bmMgY2hlY2tmbik7CisKKyAgdm9pZCBfcmVnaXN0ZXJGb3JPYmpDTWVzc2FnZU5pbChDaGVja09iakNNZXNzYWdlRnVuYyBjaGVja2ZuKTsKKworICB2b2lkIF9yZWdpc3RlckZvclByZUNhbGwoQ2hlY2tDYWxsRnVuYyBjaGVja2ZuKTsKKyAgdm9pZCBfcmVnaXN0ZXJGb3JQb3N0Q2FsbChDaGVja0NhbGxGdW5jIGNoZWNrZm4pOworCisgIHZvaWQgX3JlZ2lzdGVyRm9yTG9jYXRpb24oQ2hlY2tMb2NhdGlvbkZ1bmMgY2hlY2tmbik7CisKKyAgdm9pZCBfcmVnaXN0ZXJGb3JCaW5kKENoZWNrQmluZEZ1bmMgY2hlY2tmbik7CisKKyAgdm9pZCBfcmVnaXN0ZXJGb3JFbmRBbmFseXNpcyhDaGVja0VuZEFuYWx5c2lzRnVuYyBjaGVja2ZuKTsKKworICB2b2lkIF9yZWdpc3RlckZvckJlZ2luRnVuY3Rpb24oQ2hlY2tFbmRGdW5jdGlvbkZ1bmMgY2hlY2tmbik7CisgIHZvaWQgX3JlZ2lzdGVyRm9yRW5kRnVuY3Rpb24oQ2hlY2tFbmRGdW5jdGlvbkZ1bmMgY2hlY2tmbik7CisKKyAgdm9pZCBfcmVnaXN0ZXJGb3JCcmFuY2hDb25kaXRpb24oQ2hlY2tCcmFuY2hDb25kaXRpb25GdW5jIGNoZWNrZm4pOworCisgIHZvaWQgX3JlZ2lzdGVyRm9yTmV3QWxsb2NhdG9yKENoZWNrTmV3QWxsb2NhdG9yRnVuYyBjaGVja2ZuKTsKKworICB2b2lkIF9yZWdpc3RlckZvckxpdmVTeW1ib2xzKENoZWNrTGl2ZVN5bWJvbHNGdW5jIGNoZWNrZm4pOworCisgIHZvaWQgX3JlZ2lzdGVyRm9yRGVhZFN5bWJvbHMoQ2hlY2tEZWFkU3ltYm9sc0Z1bmMgY2hlY2tmbik7CisKKyAgdm9pZCBfcmVnaXN0ZXJGb3JSZWdpb25DaGFuZ2VzKENoZWNrUmVnaW9uQ2hhbmdlc0Z1bmMgY2hlY2tmbik7CisKKyAgdm9pZCBfcmVnaXN0ZXJGb3JQb2ludGVyRXNjYXBlKENoZWNrUG9pbnRlckVzY2FwZUZ1bmMgY2hlY2tmbik7CisKKyAgdm9pZCBfcmVnaXN0ZXJGb3JDb25zdFBvaW50ZXJFc2NhcGUoQ2hlY2tQb2ludGVyRXNjYXBlRnVuYyBjaGVja2ZuKTsKKworICB2b2lkIF9yZWdpc3RlckZvckV2YWxBc3N1bWUoRXZhbEFzc3VtZUZ1bmMgY2hlY2tmbik7CisKKyAgdm9pZCBfcmVnaXN0ZXJGb3JFdmFsQ2FsbChFdmFsQ2FsbEZ1bmMgY2hlY2tmbik7CisKKyAgdm9pZCBfcmVnaXN0ZXJGb3JFbmRPZlRyYW5zbGF0aW9uVW5pdChDaGVja0VuZE9mVHJhbnNsYXRpb25Vbml0IGNoZWNrZm4pOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW50ZXJuYWwgcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucyBmb3IgZXZlbnRzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICB1c2luZyBFdmVudFRhZyA9IHZvaWQgKjsKKyAgdXNpbmcgQ2hlY2tFdmVudEZ1bmMgPSBDaGVja2VyRm48dm9pZCAoY29uc3Qgdm9pZCAqZXZlbnQpPjsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRVZFTlQ+CisgIHZvaWQgX3JlZ2lzdGVyTGlzdGVuZXJGb3JFdmVudChDaGVja0V2ZW50RnVuYyBjaGVja2ZuKSB7CisgICAgRXZlbnRJbmZvICZpbmZvID0gRXZlbnRzW2dldFRhZzxFVkVOVD4oKV07CisgICAgaW5mby5DaGVja2Vycy5wdXNoX2JhY2soY2hlY2tmbik7ICAgIAorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEVWRU5UPgorICB2b2lkIF9yZWdpc3RlckRpc3BhdGNoZXJGb3JFdmVudCgpIHsKKyAgICBFdmVudEluZm8gJmluZm8gPSBFdmVudHNbZ2V0VGFnPEVWRU5UPigpXTsKKyAgICBpbmZvLkhhc0Rpc3BhdGNoZXIgPSB0cnVlOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEVWRU5UPgorICB2b2lkIF9kaXNwYXRjaEV2ZW50KGNvbnN0IEVWRU5UICZldmVudCkgY29uc3QgeworICAgIEV2ZW50c1R5Ojpjb25zdF9pdGVyYXRvciBJID0gRXZlbnRzLmZpbmQoZ2V0VGFnPEVWRU5UPigpKTsKKyAgICBpZiAoSSA9PSBFdmVudHMuZW5kKCkpCisgICAgICByZXR1cm47CisgICAgY29uc3QgRXZlbnRJbmZvICZpbmZvID0gSS0+c2Vjb25kOworICAgIGZvciAoY29uc3QgYXV0byBDaGVja2VyIDogaW5mby5DaGVja2VycykKKyAgICAgIENoZWNrZXIoJmV2ZW50KTsKKyAgfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW1wbGVtZW50YXRpb24gZGV0YWlscy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDSEVDS0VSPgorICBzdGF0aWMgdm9pZCBkZXN0cnVjdCh2b2lkICpvYmopIHsgZGVsZXRlIHN0YXRpY19jYXN0PENIRUNLRVIgKj4ob2JqKTsgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgdm9pZCAqZ2V0VGFnKCkgeyBzdGF0aWMgaW50IHRhZzsgcmV0dXJuICZ0YWc7IH0KKworICBsbHZtOjpEZW5zZU1hcDxDaGVja2VyVGFnLCBDaGVja2VyUmVmPiBDaGVja2VyVGFnczsKKworICBzdGQ6OnZlY3RvcjxDaGVja2VyRHRvcj4gQ2hlY2tlckR0b3JzOworCisgIHN0cnVjdCBEZWNsQ2hlY2tlckluZm8geworICAgIENoZWNrRGVjbEZ1bmMgQ2hlY2tGbjsKKyAgICBIYW5kbGVzRGVjbEZ1bmMgSXNGb3JEZWNsRm47CisgIH07CisgIHN0ZDo6dmVjdG9yPERlY2xDaGVja2VySW5mbz4gRGVjbENoZWNrZXJzOworCisgIHN0ZDo6dmVjdG9yPENoZWNrRGVjbEZ1bmM+IEJvZHlDaGVja2VyczsKKworICB1c2luZyBDYWNoZWREZWNsQ2hlY2tlcnMgPSBTbWFsbFZlY3RvcjxDaGVja0RlY2xGdW5jLCA0PjsKKyAgdXNpbmcgQ2FjaGVkRGVjbENoZWNrZXJzTWFwVHkgPSBsbHZtOjpEZW5zZU1hcDx1bnNpZ25lZCwgQ2FjaGVkRGVjbENoZWNrZXJzPjsKKyAgQ2FjaGVkRGVjbENoZWNrZXJzTWFwVHkgQ2FjaGVkRGVjbENoZWNrZXJzTWFwOworCisgIHN0cnVjdCBTdG10Q2hlY2tlckluZm8geworICAgIENoZWNrU3RtdEZ1bmMgQ2hlY2tGbjsKKyAgICBIYW5kbGVzU3RtdEZ1bmMgSXNGb3JTdG10Rm47CisgICAgYm9vbCBJc1ByZVZpc2l0OworICB9OworICBzdGQ6OnZlY3RvcjxTdG10Q2hlY2tlckluZm8+IFN0bXRDaGVja2VyczsKKworICB1c2luZyBDYWNoZWRTdG10Q2hlY2tlcnMgPSBTbWFsbFZlY3RvcjxDaGVja1N0bXRGdW5jLCA0PjsKKyAgdXNpbmcgQ2FjaGVkU3RtdENoZWNrZXJzTWFwVHkgPSBsbHZtOjpEZW5zZU1hcDx1bnNpZ25lZCwgQ2FjaGVkU3RtdENoZWNrZXJzPjsKKyAgQ2FjaGVkU3RtdENoZWNrZXJzTWFwVHkgQ2FjaGVkU3RtdENoZWNrZXJzTWFwOworCisgIGNvbnN0IENhY2hlZFN0bXRDaGVja2VycyAmZ2V0Q2FjaGVkU3RtdENoZWNrZXJzRm9yKGNvbnN0IFN0bXQgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQcmVWaXNpdCk7CisKKyAgLy8vIFJldHVybnMgdGhlIGNoZWNrZXJzIHRoYXQgaGF2ZSByZWdpc3RlcmVkIGZvciBjYWxsYmFja3Mgb2YgdGhlCisgIC8vLyBnaXZlbiBccCBLaW5kLgorICBjb25zdCBzdGQ6OnZlY3RvcjxDaGVja09iakNNZXNzYWdlRnVuYz4gJgorICBnZXRPYmpDTWVzc2FnZUNoZWNrZXJzKE9iakNNZXNzYWdlVmlzaXRLaW5kIEtpbmQpOworCisgIHN0ZDo6dmVjdG9yPENoZWNrT2JqQ01lc3NhZ2VGdW5jPiBQcmVPYmpDTWVzc2FnZUNoZWNrZXJzOworICBzdGQ6OnZlY3RvcjxDaGVja09iakNNZXNzYWdlRnVuYz4gUG9zdE9iakNNZXNzYWdlQ2hlY2tlcnM7CisgIHN0ZDo6dmVjdG9yPENoZWNrT2JqQ01lc3NhZ2VGdW5jPiBPYmpDTWVzc2FnZU5pbENoZWNrZXJzOworCisgIHN0ZDo6dmVjdG9yPENoZWNrQ2FsbEZ1bmM+IFByZUNhbGxDaGVja2VyczsKKyAgc3RkOjp2ZWN0b3I8Q2hlY2tDYWxsRnVuYz4gUG9zdENhbGxDaGVja2VyczsKKworICBzdGQ6OnZlY3RvcjxDaGVja0xvY2F0aW9uRnVuYz4gTG9jYXRpb25DaGVja2VyczsKKworICBzdGQ6OnZlY3RvcjxDaGVja0JpbmRGdW5jPiBCaW5kQ2hlY2tlcnM7CisKKyAgc3RkOjp2ZWN0b3I8Q2hlY2tFbmRBbmFseXNpc0Z1bmM+IEVuZEFuYWx5c2lzQ2hlY2tlcnM7CisKKyAgc3RkOjp2ZWN0b3I8Q2hlY2tCZWdpbkZ1bmN0aW9uRnVuYz4gQmVnaW5GdW5jdGlvbkNoZWNrZXJzOworICBzdGQ6OnZlY3RvcjxDaGVja0VuZEZ1bmN0aW9uRnVuYz4gRW5kRnVuY3Rpb25DaGVja2VyczsKKworICBzdGQ6OnZlY3RvcjxDaGVja0JyYW5jaENvbmRpdGlvbkZ1bmM+IEJyYW5jaENvbmRpdGlvbkNoZWNrZXJzOworCisgIHN0ZDo6dmVjdG9yPENoZWNrTmV3QWxsb2NhdG9yRnVuYz4gTmV3QWxsb2NhdG9yQ2hlY2tlcnM7CisKKyAgc3RkOjp2ZWN0b3I8Q2hlY2tMaXZlU3ltYm9sc0Z1bmM+IExpdmVTeW1ib2xzQ2hlY2tlcnM7CisKKyAgc3RkOjp2ZWN0b3I8Q2hlY2tEZWFkU3ltYm9sc0Z1bmM+IERlYWRTeW1ib2xzQ2hlY2tlcnM7CisKKyAgc3RkOjp2ZWN0b3I8Q2hlY2tSZWdpb25DaGFuZ2VzRnVuYz4gUmVnaW9uQ2hhbmdlc0NoZWNrZXJzOworCisgIHN0ZDo6dmVjdG9yPENoZWNrUG9pbnRlckVzY2FwZUZ1bmM+IFBvaW50ZXJFc2NhcGVDaGVja2VyczsKKworICBzdGQ6OnZlY3RvcjxFdmFsQXNzdW1lRnVuYz4gRXZhbEFzc3VtZUNoZWNrZXJzOworCisgIHN0ZDo6dmVjdG9yPEV2YWxDYWxsRnVuYz4gRXZhbENhbGxDaGVja2VyczsKKworICBzdGQ6OnZlY3RvcjxDaGVja0VuZE9mVHJhbnNsYXRpb25Vbml0PiBFbmRPZlRyYW5zbGF0aW9uVW5pdENoZWNrZXJzOworCisgIHN0cnVjdCBFdmVudEluZm8geworICAgIFNtYWxsVmVjdG9yPENoZWNrRXZlbnRGdW5jLCA0PiBDaGVja2VyczsKKyAgICBib29sIEhhc0Rpc3BhdGNoZXIgPSBmYWxzZTsKKworICAgIEV2ZW50SW5mbygpID0gZGVmYXVsdDsKKyAgfTsKKyAgCisgIHVzaW5nIEV2ZW50c1R5ID0gbGx2bTo6RGVuc2VNYXA8RXZlbnRUYWcsIEV2ZW50SW5mbz47CisgIEV2ZW50c1R5IEV2ZW50czsKK307CisKK30gLy8gbmFtZXNwYWNlIGVudG8KKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9DSEVDS0VSTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0NoZWNrZXJPcHRJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0NoZWNrZXJPcHRJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4MTg3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQ2hlY2tlck9wdEluZm8uaApAQCAtMCwwICsxLDQ0IEBACisvLz09PS0tLSBDaGVja2VyT3B0SW5mby5oIC0gU3BlY2lmaWVzIHdoaWNoIGNoZWNrZXJzIHRvIHVzZSAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9DSEVDS0VST1BUSU5GT19ICisjZGVmaW5lIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9DSEVDS0VST1BUSU5GT19ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgZW50byB7CisKKy8vLyBSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUgYSBjaGVja2VyIG9yIHBhY2thZ2UgZnJvbSBhCisvLy8gc3BlY2lmaWMgYW5hbHlzaXMgcnVuLgorLy8vCisvLy8gXHNhIENoZWNrZXJSZWdpc3RyeTo6aW5pdGlhbGl6ZU1hbmFnZXIKK2NsYXNzIENoZWNrZXJPcHRJbmZvIHsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIGJvb2wgRW5hYmxlOworICBib29sIENsYWltZWQ7CisKK3B1YmxpYzoKKyAgQ2hlY2tlck9wdEluZm8oU3RyaW5nUmVmIG5hbWUsIGJvb2wgZW5hYmxlKQorICAgIDogTmFtZShuYW1lKSwgRW5hYmxlKGVuYWJsZSksIENsYWltZWQoZmFsc2UpIHsgfQorICAKKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisgIGJvb2wgaXNFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gRW5hYmxlOyB9CisgIGJvb2wgaXNEaXNhYmxlZCgpIGNvbnN0IHsgcmV0dXJuICFpc0VuYWJsZWQoKTsgfQorCisgIGJvb2wgaXNDbGFpbWVkKCkgY29uc3QgeyByZXR1cm4gQ2xhaW1lZDsgfQorICBib29sIGlzVW5jbGFpbWVkKCkgY29uc3QgeyByZXR1cm4gIWlzQ2xhaW1lZCgpOyB9CisgIHZvaWQgY2xhaW0oKSB7IENsYWltZWQgPSB0cnVlOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZW50bworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyUmVnaXN0cnkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQ2hlY2tlclJlZ2lzdHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyNmVkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQ2hlY2tlclJlZ2lzdHJ5LmgKQEAgLTAsMCArMSwxNDIgQEAKKy8vPT09LS0tIENoZWNrZXJSZWdpc3RyeS5oIC0gTWFpbnRhaW5zIGFsbCBhdmFpbGFibGUgY2hlY2tlcnMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX0NIRUNLRVJSRUdJU1RSWV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9DSEVDS0VSUkVHSVNUUllfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQ2hlY2tlck1hbmFnZXIuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIEZJWE1FOiBtb3ZlIHRoaXMgaW5mb3JtYXRpb24gdG8gYW4gSFRNTCBmaWxlIGluIGRvY3MvLgorLy8gQXQgdGhlIHZlcnkgbGVhc3QsIGEgY2hlY2tlciBwbHVnaW4gaXMgYSBkeW5hbWljIGxpYnJhcnkgdGhhdCBleHBvcnRzCisvLyBjbGFuZ19hbmFseXplckFQSVZlcnNpb25TdHJpbmcuIFRoaXMgc2hvdWxkIGJlIGRlZmluZWQgYXMgZm9sbG93czoKKy8vCisvLyAgIGV4dGVybiAiQyIKKy8vICAgY29uc3QgY2hhciBjbGFuZ19hbmFseXplckFQSVZlcnNpb25TdHJpbmdbXSA9CisvLyAgICAgQ0xBTkdfQU5BTFlaRVJfQVBJX1ZFUlNJT05fU1RSSU5HOworLy8KKy8vIFRoaXMgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGFuYWx5emVyIGlzIGtub3duIHRvCisvLyBiZSBpbmNvbXBhdGlibGUgd2l0aCBhIHBsdWdpbi4gUGx1Z2lucyB3aXRoIGluY29tcGF0aWJsZSB2ZXJzaW9uIHN0cmluZ3MsCisvLyBvciB3aXRob3V0IGEgdmVyc2lvbiBzdHJpbmcgYXQgYWxsLCB3aWxsIG5vdCBiZSBsb2FkZWQuCisvLworLy8gVG8gYWRkIGEgY3VzdG9tIGNoZWNrZXIgdG8gdGhlIGFuYWx5emVyLCB0aGUgcGx1Z2luIG11c3QgYWxzbyBkZWZpbmUgdGhlCisvLyBmdW5jdGlvbiBjbGFuZ19yZWdpc3RlckNoZWNrZXJzLiBGb3IgZXhhbXBsZToKKy8vCisvLyAgICBleHRlcm4gIkMiCisvLyAgICB2b2lkIGNsYW5nX3JlZ2lzdGVyQ2hlY2tlcnMgKENoZWNrZXJSZWdpc3RyeSAmcmVnaXN0cnkpIHsKKy8vICAgICAgcmVnaXN0cnkuYWRkQ2hlY2tlcjxNYWluQ2FsbENoZWNrZXI+KCJleGFtcGxlLk1haW5DYWxsQ2hlY2tlciIsCisvLyAgICAgICAgIkRpc2FsbG93cyBjYWxscyB0byBmdW5jdGlvbnMgY2FsbGVkIG1haW4iKTsKKy8vICAgIH0KKy8vCisvLyBUaGUgZmlyc3QgbWV0aG9kIGFyZ3VtZW50IGlzIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGNoZWNrZXIsIGluY2x1ZGluZyBpdHMKKy8vIGVuY2xvc2luZyBwYWNrYWdlLiBCeSBjb252ZW50aW9uLCB0aGUgcmVnaXN0ZXJlZCBuYW1lIG9mIGEgY2hlY2tlciBpcyB0aGUKKy8vIG5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgY2xhc3MgKHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCkuCisvLyBUaGUgc2Vjb25kIG1ldGhvZCBhcmd1bWVudCBpcyBhIHNob3J0IGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQorLy8gY2hlY2tlci4KKy8vCisvLyBUaGUgY2xhbmdfcmVnaXN0ZXJDaGVja2VycyBmdW5jdGlvbiBtYXkgYWRkIGFueSBudW1iZXIgb2YgY2hlY2tlcnMgdG8gdGhlCisvLyByZWdpc3RyeS4gSWYgYW55IGNoZWNrZXJzIHJlcXVpcmUgYWRkaXRpb25hbCBpbml0aWFsaXphdGlvbiwgdXNlIHRoZSB0aHJlZS0KKy8vIGFyZ3VtZW50IGZvcm0gb2YgQ2hlY2tlclJlZ2lzdHJ5OjphZGRDaGVja2VyLgorLy8gCisvLyBUbyBsb2FkIGEgY2hlY2tlciBwbHVnaW4sIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZHluYW1pYyBsaWJyYXJ5IGFzCisvLyB0aGUgYXJndW1lbnQgdG8gdGhlIC1sb2FkIG9wdGlvbiBpbiB0aGUgY2MxIGZyb250ZW5kLiBZb3UgY2FuIHRoZW4gZW5hYmxlCisvLyB5b3VyIGN1c3RvbSBjaGVja2VyIHVzaW5nIHRoZSAtYW5hbHl6ZXItY2hlY2tlcjoKKy8vCisvLyAgIGNsYW5nIC1jYzEgLWxvYWQgPC9wYXRoL3RvL3BsdWdpbi5keWxpYj4gLWFuYWx5emUKKy8vICAgICAtYW5hbHl6ZXItY2hlY2tlcj08ZXhhbXBsZS5NYWluQ2FsbENoZWNrZXI+CisvLworLy8gRm9yIGEgY29tcGxldGUgd29ya2luZyBleGFtcGxlLCBzZWUgZXhhbXBsZXMvYW5hbHl6ZXItcGx1Z2luLgorCisjaWZuZGVmIENMQU5HX0FOQUxZWkVSX0FQSV9WRVJTSU9OX1NUUklORworLy8gRklYTUU6IFRoZSBDbGFuZyB2ZXJzaW9uIHN0cmluZyBpcyBub3QgcGFydGljdWxhcmx5IGdyYW51bGFyOworLy8gdGhlIGFuYWx5emVyIGluZnJhc3RydWN0dXJlIGNhbiBjaGFuZ2UgYSBsb3QgYmV0d2VlbiByZWxlYXNlcy4KKy8vIFVuZm9ydHVuYXRlbHksIHRoaXMgc3RyaW5nIGhhcyB0byBiZSBzdGF0aWNhbGx5IGVtYmVkZGVkIGluIGVhY2ggcGx1Z2luLAorLy8gc28gd2UgY2FuJ3QganVzdCB1c2UgdGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGluIFZlcnNpb24uaC4KKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9WZXJzaW9uLmgiCisjZGVmaW5lIENMQU5HX0FOQUxZWkVSX0FQSV9WRVJTSU9OX1NUUklORyBDTEFOR19WRVJTSU9OX1NUUklORworI2VuZGlmCisKK25hbWVzcGFjZSBjbGFuZyB7CitjbGFzcyBEaWFnbm9zdGljc0VuZ2luZTsKK2NsYXNzIEFuYWx5emVyT3B0aW9uczsKKworbmFtZXNwYWNlIGVudG8geworCitjbGFzcyBDaGVja2VyT3B0SW5mbzsKKworLy8vIE1hbmFnZXMgYSBzZXQgb2YgYXZhaWxhYmxlIGNoZWNrZXJzIGZvciBydW5uaW5nIGEgc3RhdGljIGFuYWx5c2lzLgorLy8vIFRoZSBjaGVja2VycyBhcmUgb3JnYW5pemVkIGludG8gcGFja2FnZXMgYnkgZnVsbCBuYW1lLCB3aGVyZSBpbmNsdWRpbmcKKy8vLyBhIHBhY2thZ2Ugd2lsbCByZWN1cnNpdmVseSBpbmNsdWRlIGFsbCBzdWJwYWNrYWdlcyBhbmQgY2hlY2tlcnMgd2l0aGluIGl0LgorLy8vIEZvciBleGFtcGxlLCB0aGUgY2hlY2tlciAiY29yZS5idWlsdGluLk5vUmV0dXJuRnVuY3Rpb25DaGVja2VyIiB3aWxsIGJlCisvLy8gaW5jbHVkZWQgaWYgaW5pdGlhbGl6ZU1hbmFnZXIoKSBpcyBjYWxsZWQgd2l0aCBhbiBvcHRpb24gb2YgImNvcmUiLAorLy8vICJjb3JlLmJ1aWx0aW4iLCBvciB0aGUgZnVsbCBuYW1lICJjb3JlLmJ1aWx0aW4uTm9SZXR1cm5GdW5jdGlvbkNoZWNrZXIiLgorY2xhc3MgQ2hlY2tlclJlZ2lzdHJ5IHsKK3B1YmxpYzoKKyAgLy8vIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyBwZXJmb3JtIGFueSBuZWNlc3Nhcnkgc2V0dXAgZm9yIGEgY2hlY2tlci4KKyAgLy8vIFRoZXkgc2hvdWxkIGluY2x1ZGUgYSBjYWxsIHRvIENoZWNrZXJNYW5hZ2VyOjpyZWdpc3RlckNoZWNrZXIuCisgIHR5cGVkZWYgdm9pZCAoKkluaXRpYWxpemF0aW9uRnVuY3Rpb24pKENoZWNrZXJNYW5hZ2VyICYpOworICBzdHJ1Y3QgQ2hlY2tlckluZm8geworICAgIEluaXRpYWxpemF0aW9uRnVuY3Rpb24gSW5pdGlhbGl6ZTsKKyAgICBTdHJpbmdSZWYgRnVsbE5hbWU7CisgICAgU3RyaW5nUmVmIERlc2M7CisKKyAgICBDaGVja2VySW5mbyhJbml0aWFsaXphdGlvbkZ1bmN0aW9uIGZuLCBTdHJpbmdSZWYgbmFtZSwgU3RyaW5nUmVmIGRlc2MpCisgICAgOiBJbml0aWFsaXplKGZuKSwgRnVsbE5hbWUobmFtZSksIERlc2MoZGVzYykge30KKyAgfTsKKworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPENoZWNrZXJJbmZvPiBDaGVja2VySW5mb0xpc3Q7CisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgdm9pZCBpbml0aWFsaXplTWFuYWdlcihDaGVja2VyTWFuYWdlciAmbWdyKSB7CisgICAgbWdyLnJlZ2lzdGVyQ2hlY2tlcjxUPigpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIEFkZHMgYSBjaGVja2VyIHRvIHRoZSByZWdpc3RyeS4gVXNlIHRoaXMgbm9uLXRlbXBsYXRlZCBvdmVybG9hZCB3aGVuIHlvdXIKKyAgLy8vIGNoZWNrZXIgcmVxdWlyZXMgY3VzdG9tIGluaXRpYWxpemF0aW9uLgorICB2b2lkIGFkZENoZWNrZXIoSW5pdGlhbGl6YXRpb25GdW5jdGlvbiBmbiwgU3RyaW5nUmVmIGZ1bGxOYW1lLAorICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIGRlc2MpOworCisgIC8vLyBBZGRzIGEgY2hlY2tlciB0byB0aGUgcmVnaXN0cnkuIFVzZSB0aGlzIHRlbXBsYXRlZCBvdmVybG9hZCB3aGVuIHlvdXIKKyAgLy8vIGNoZWNrZXIgZG9lcyBub3QgcmVxdWlyZSBhbnkgY3VzdG9tIGluaXRpYWxpemF0aW9uLgorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgdm9pZCBhZGRDaGVja2VyKFN0cmluZ1JlZiBmdWxsTmFtZSwgU3RyaW5nUmVmIGRlc2MpIHsKKyAgICAvLyBBdm9pZCBNU1ZDJ3MgQ29tcGlsZXIgRXJyb3IgQzIyNzY6CisgICAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5Lzg1MGNzdHcxKHY9VlMuODApLmFzcHgKKyAgICBhZGRDaGVja2VyKCZDaGVja2VyUmVnaXN0cnk6OmluaXRpYWxpemVNYW5hZ2VyPFQ+LCBmdWxsTmFtZSwgZGVzYyk7CisgIH0KKworICAvLy8gSW5pdGlhbGl6ZXMgYSBDaGVja2VyTWFuYWdlciBieSBjYWxsaW5nIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgZm9yCisgIC8vLyBhbGwgY2hlY2tlcnMgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBDaGVja2VyT3B0SW5mbyBsaXN0LiBUaGUgb3JkZXIgb2YgdGhpcworICAvLy8gbGlzdCBpcyBzaWduaWZpY2FudDsgbGF0ZXIgb3B0aW9ucyBjYW4gYmUgdXNlZCB0byByZXZlcnNlIGVhcmxpZXIgb25lcy4KKyAgLy8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gZXhjbHVkZSBjZXJ0YWluIGNoZWNrZXJzIGluIGFuIGluY2x1ZGVkIHBhY2thZ2UuCisgIHZvaWQgaW5pdGlhbGl6ZU1hbmFnZXIoQ2hlY2tlck1hbmFnZXIgJm1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q2hlY2tlck9wdEluZm8+ICZvcHRzKSBjb25zdDsKKworICAvLy8gQ2hlY2sgaWYgZXZlcnkgb3B0aW9uIGNvcnJlc3BvbmRzIHRvIGEgc3BlY2lmaWMgY2hlY2tlciBvciBwYWNrYWdlLgorICB2b2lkIHZhbGlkYXRlQ2hlY2tlck9wdGlvbnMoY29uc3QgQW5hbHl6ZXJPcHRpb25zICZvcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJmRpYWdzKSBjb25zdDsKKworICAvLy8gUHJpbnRzIHRoZSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBhbGwgY2hlY2tlcnMgaW4gdGhpcyByZWdpc3RyeS4KKyAgLy8vIFRoaXMgb3V0cHV0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBtYWNoaW5lLXBhcnNlYWJsZS4KKyAgdm9pZCBwcmludEhlbHAocmF3X29zdHJlYW0gJm91dCwgc2l6ZV90IG1heE5hbWVDaGFycyA9IDMwKSBjb25zdDsKKyAgdm9pZCBwcmludExpc3QocmF3X29zdHJlYW0gJm91dCwKKyAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPENoZWNrZXJPcHRJbmZvPiAmb3B0cykgY29uc3Q7CisKK3ByaXZhdGU6CisgIG11dGFibGUgQ2hlY2tlckluZm9MaXN0IENoZWNrZXJzOworICBtdXRhYmxlIGxsdm06OlN0cmluZ01hcDxzaXplX3Q+IFBhY2thZ2VzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGVudG8KK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvSXNzdWVIYXNoLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0lzc3VlSGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYzRmMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0lzc3VlSGFzaC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vPT09LS0tLS0tLS0tLSBJc3N1ZUhhc2guaCAtIEdlbmVyYXRlIGlkZW50aWZpY2F0aW9uIGhhc2hlcyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9JU1NVRV9IQVNIX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX0lTU1VFX0hBU0hfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK2NsYXNzIERlY2w7CitjbGFzcyBTb3VyY2VNYW5hZ2VyOworY2xhc3MgRnVsbFNvdXJjZUxvYzsKK2NsYXNzIExhbmdPcHRpb25zOworCisvLy8gXGJyaWVmIEdldCBhbiBNRDUgaGFzaCB0byBoZWxwIGlkZW50aWZ5IGJ1Z3MuCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBoYXNoIHRoYXQgaGVscHMgaWRlbnRpZnkgYnVncyB3aXRoaW4gYSBzb3VyY2UgZmlsZS4KKy8vLyBUaGlzIGlkZW50aWZpY2F0aW9uIGNhbiBiZSB1dGlsaXplZCB0byBkaWZmIGRpYWdub3N0aWMgcmVzdWx0cyBvbiBkaWZmZXJlbnQKKy8vLyBzbmFwc2hvdHMgb2YgYSBwcm9qZWN0cywgb3IgbWFpbnRhaW4gYSBkYXRhYmFzZSBvZiBzdXBwcmVzc2VkIGRpYWdub3RpY3MuCisvLy8KKy8vLyBUaGUgaGFzaCBjb250YWlucyB0aGUgbm9ybWFsaXplZCB0ZXh0IG9mIHRoZSBsb2NhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlCisvLy8gZGlhZ25vc3RpYy4gTm9ybWFsaXphdGlvbiBtZWFucyByZW1vdmluZyB0aGUgd2hpdGVzcGFjZXMuIFRoZSBhc3NvY2lhdGVkCisvLy8gbG9jYXRpb24gaXMgdGhlIGVpdGhlciB0aGUgbGFzdCBsb2NhdGlvbiBvZiBhIGRpYWdub3N0aWMgcGF0aCBvciBhIHVuaXF1ZWluZworLy8vIGxvY2F0aW9uLiBUaGUgYnVndHlwZSBhbmQgdGhlIG5hbWUgb2YgdGhlIGNoZWNrZXIgaXMgYWxzbyBwYXJ0IG9mIHRoZSBoYXNoLgorLy8vIFRoZSBsYXN0IGNvbXBvbmVudCBpcyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbmNsb3NpbmcgZGVjbGFyYXRpb24KKy8vLyBvZiB0aGUgYXNzb2NpYXRlZCBsb2NhdGlvbi4KKy8vLyAKKy8vLyBJbiBjYXNlIGEgbmV3IGhhc2ggaXMgaW50cm9kdWNlZCwgdGhlIG9sZCBvbmUgc2hvdWxkIHN0aWxsIGJlIG1haW50YWluZWQgZm9yCisvLy8gYSB3aGlsZS4gT25lIHNob3VsZCBub3QgaW50cm9kdWNlIGEgbmV3IGhhc2ggZm9yIGV2ZXJ5IGNoYW5nZSwgaXQgaXMKKy8vLyBwb3NzaWJsZSB0byBpbnRyb2R1Y2UgZXhwZXJpbWVudGFsIGhhc2hlcyB0aGF0IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KKy8vLyBTdWNoIGhhc2hlcyBzaG91bGQgYmUgbWFya2VkIGFzIGV4cGVyaW1lbnRhbCB1c2luZyBhIGNvbW1lbnQgaW4gdGhlIHBsaXN0CisvLy8gZmlsZXMuCitsbHZtOjpTbWFsbFN0cmluZzwzMj4gR2V0SXNzdWVIYXNoKGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdWxsU291cmNlTG9jICZJc3N1ZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIENoZWNrZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgQnVnVHlwZSwgY29uc3QgRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKTsKKworLy8vIFxicmllZiBHZXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpc3N1ZSBoYXNoLiBTZWUgR2V0SXNzdWVIYXNoKCkgZm9yCisvLy8gbW9yZSBpbmZvcm1hdGlvbi4KK3N0ZDo6c3RyaW5nIEdldElzc3VlU3RyaW5nKGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLCBGdWxsU291cmNlTG9jICZJc3N1ZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBDaGVja2VyTmFtZSwgbGx2bTo6U3RyaW5nUmVmIEJ1Z1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsICpELCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpOworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhEaWFnbm9zdGljQ29uc3VtZXJzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhEaWFnbm9zdGljQ29uc3VtZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1MTJmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aERpYWdub3N0aWNDb25zdW1lcnMuaApAQCAtMCwwICsxLDQwIEBACisvLz09PS0tLSBQYXRoRGlhZ25vc3RpY0NsaWVudHMuaCAtIFBhdGggRGlhZ25vc3RpYyBDbGllbnRzIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHRvIGNyZWF0ZSBkaWZmZXJlbnQgcGF0aCBkaWFnb3N0aWMgY2xpZW50cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIRElBR05PU1RJQ0NPTlNVTUVSU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIRElBR05PU1RJQ0NPTlNVTUVSU19ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBbmFseXplck9wdGlvbnM7CitjbGFzcyBQcmVwcm9jZXNzb3I7CisKK25hbWVzcGFjZSBlbnRvIHsKKworY2xhc3MgUGF0aERpYWdub3N0aWNDb25zdW1lcjsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8UGF0aERpYWdub3N0aWNDb25zdW1lcio+IFBhdGhEaWFnbm9zdGljQ29uc3VtZXJzOworCisjZGVmaW5lIEFOQUxZU0lTX0RJQUdOT1NUSUNTKE5BTUUsIENNREZMQUcsIERFU0MsIENSRUFURUZOKVwKK3ZvaWQgQ1JFQVRFRk4oQW5hbHl6ZXJPcHRpb25zICZBbmFseXplck9wdHMsXAorICAgICAgICAgICAgICBQYXRoRGlhZ25vc3RpY0NvbnN1bWVycyAmQyxcCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZQcmVmaXgsXAorICAgICAgICAgICAgICBjb25zdCBQcmVwcm9jZXNzb3IgJlBQKTsKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0FuYWx5c2VzLmRlZiIKKworfSAvLyBlbmQgJ2VudG8nIG5hbWVzcGFjZQorfSAvLyBlbmQgJ2NsYW5nJyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQVBTSW50VHlwZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0FQU0ludFR5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzhhOWI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0FQU0ludFR5cGUuaApAQCAtMCwwICsxLDEwOSBAQAorLy89PSBBUFNJbnRUeXBlLmggLSBTaW1wbGUgcmVjb3JkIG9mIHRoZSB0eXBlIG9mIEFQU0ludHMgLS0tLS0tLS0qLSBDKysgLSotLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9BUFNJTlRUWVBFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfQVBTSU5UVFlQRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUFNJbnQuaCIKKyNpbmNsdWRlIDx0dXBsZT4KKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBlbnRvIHsKKworLy8vIFxicmllZiBBIHJlY29yZCBvZiB0aGUgInR5cGUiIG9mIGFuIEFQU0ludCwgdXNlZCBmb3IgY29udmVyc2lvbnMuCitjbGFzcyBBUFNJbnRUeXBlIHsKKyAgdWludDMyX3QgQml0V2lkdGg7CisgIGJvb2wgSXNVbnNpZ25lZDsKKworcHVibGljOgorICBBUFNJbnRUeXBlKHVpbnQzMl90IFdpZHRoLCBib29sIFVuc2lnbmVkKQorICAgIDogQml0V2lkdGgoV2lkdGgpLCBJc1Vuc2lnbmVkKFVuc2lnbmVkKSB7fQorCisgIC8qIGltcGxpY2l0ICovIEFQU0ludFR5cGUoY29uc3QgbGx2bTo6QVBTSW50ICZWYWx1ZSkKKyAgICA6IEJpdFdpZHRoKFZhbHVlLmdldEJpdFdpZHRoKCkpLCBJc1Vuc2lnbmVkKFZhbHVlLmlzVW5zaWduZWQoKSkge30KKworICB1aW50MzJfdCBnZXRCaXRXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIEJpdFdpZHRoOyB9CisgIGJvb2wgaXNVbnNpZ25lZCgpIGNvbnN0IHsgcmV0dXJuIElzVW5zaWduZWQ7IH0KKworICAvLy8gXGJyaWVmIENvbnZlcnQgYSBnaXZlbiBBUFNJbnQsIGluIHBsYWNlLCB0byBtYXRjaCB0aGlzIHR5cGUuCisgIC8vLworICAvLy8gVGhpcyBiZWhhdmVzIGxpa2UgYSBDIGNhc3Q6IGNvbnZlcnRpbmcgMjU1dTggKDB4RkYpIHRvIHMxNiBnaXZlcworICAvLy8gMjU1ICgweDAwRkYpLCBhbmQgY29udmVydGluZyAtMXM4ICgweEZGKSB0byB1MTYgZ2l2ZXMgNjU1MzUgKDB4RkZGRikuCisgIHZvaWQgYXBwbHkobGx2bTo6QVBTSW50ICZWYWx1ZSkgY29uc3QgeworICAgIC8vIE5vdGUgdGhlIG9yZGVyIGhlcmUuIFdlIGV4dGVuZCBmaXJzdCB0byBwcmVzZXJ2ZSB0aGUgc2lnbiwgaWYgdGhpcyB2YWx1ZQorICAgIC8vIGlzIHNpZ25lZCwgL3RoZW4vIG1hdGNoIHRoZSBzaWduZWRuZXNzIG9mIHRoZSByZXN1bHQgdHlwZS4KKyAgICBWYWx1ZSA9IFZhbHVlLmV4dE9yVHJ1bmMoQml0V2lkdGgpOworICAgIFZhbHVlLnNldElzVW5zaWduZWQoSXNVbnNpZ25lZCk7CisgIH0KKworICAvLy8gQ29udmVydCBhbmQgcmV0dXJuIGEgbmV3IEFQU0ludCB3aXRoIHRoZSBnaXZlbiB2YWx1ZSwgYnV0IHRoaXMKKyAgLy8vIHR5cGUncyBiaXQgd2lkdGggYW5kIHNpZ25lZG5lc3MuCisgIC8vLworICAvLy8gXHNlZSBhcHBseQorICBsbHZtOjpBUFNJbnQgY29udmVydChjb25zdCBsbHZtOjpBUFNJbnQgJlZhbHVlKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICBsbHZtOjpBUFNJbnQgUmVzdWx0KFZhbHVlLCBWYWx1ZS5pc1Vuc2lnbmVkKCkpOworICAgIGFwcGx5KFJlc3VsdCk7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGFuIGFsbC16ZXJvIHZhbHVlIGZvciB0aGlzIHR5cGUuCisgIGxsdm06OkFQU0ludCBnZXRaZXJvVmFsdWUoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgICByZXR1cm4gbGx2bTo6QVBTSW50KEJpdFdpZHRoLCBJc1Vuc2lnbmVkKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlIGZvciB0aGlzIHR5cGUuCisgIGxsdm06OkFQU0ludCBnZXRNaW5WYWx1ZSgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBsbHZtOjpBUFNJbnQ6OmdldE1pblZhbHVlKEJpdFdpZHRoLCBJc1Vuc2lnbmVkKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlIGZvciB0aGlzIHR5cGUuCisgIGxsdm06OkFQU0ludCBnZXRNYXhWYWx1ZSgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICAgIHJldHVybiBsbHZtOjpBUFNJbnQ6OmdldE1heFZhbHVlKEJpdFdpZHRoLCBJc1Vuc2lnbmVkKTsKKyAgfQorCisgIGxsdm06OkFQU0ludCBnZXRWYWx1ZSh1aW50NjRfdCBSYXdWYWx1ZSkgY29uc3QgTExWTV9SRUFET05MWSB7CisgICAgcmV0dXJuIChsbHZtOjpBUFNJbnQoQml0V2lkdGgsIElzVW5zaWduZWQpID0gUmF3VmFsdWUpOworICB9CisKKyAgLy8vIFVzZWQgdG8gY2xhc3NpZnkgd2hldGhlciBhIHZhbHVlIGlzIHJlcHJlc2VudGFibGUgdXNpbmcgdGhpcyB0eXBlLgorICAvLy8KKyAgLy8vIFxzZWUgdGVzdEluUmFuZ2UKKyAgZW51bSBSYW5nZVRlc3RSZXN1bHRLaW5kIHsKKyAgICBSVFJfQmVsb3cgPSAtMSwgLy8vPCBWYWx1ZSBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW0gcmVwcmVzZW50YWJsZSB2YWx1ZS4KKyAgICBSVFJfV2l0aGluID0gMCwgLy8vPCBWYWx1ZSBpcyByZXByZXNlbnRhYmxlIHVzaW5nIHRoaXMgdHlwZS4KKyAgICBSVFJfQWJvdmUgPSAxICAgLy8vPCBWYWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gcmVwcmVzZW50YWJsZSB2YWx1ZS4KKyAgfTsKKworICAvLy8gVGVzdHMgd2hldGhlciBhIGdpdmVuIHZhbHVlIGlzIGxvc3NsZXNzbHkgcmVwcmVzZW50YWJsZSB1c2luZyB0aGlzIHR5cGUuCisgIC8vLworICAvLy8gXHBhcmFtIFZhbCBUaGUgdmFsdWUgdG8gdGVzdC4KKyAgLy8vIFxwYXJhbSBBbGxvd01peGVkU2lnbiBXaGV0aGVyIG9yIG5vdCB0byBhbGxvdyBzaWduZWRuZXNzIGNvbnZlcnNpb25zLgorICAvLy8gICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIC0xczggaXMgY29uc2lkZXJlZCBpbiByYW5nZQorICAvLy8gICAgICAgICAgICAgICAgICAgICAgIGZvciAndW5zaWduZWQgY2hhcicgKHU4KS4KKyAgUmFuZ2VUZXN0UmVzdWx0S2luZCB0ZXN0SW5SYW5nZShjb25zdCBsbHZtOjpBUFNJbnQgJlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93TWl4ZWRTaWduKSBjb25zdCBMTFZNX1JFQURPTkxZOworICAKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFQU0ludFR5cGUgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIEJpdFdpZHRoID09IE90aGVyLkJpdFdpZHRoICYmIElzVW5zaWduZWQgPT0gT3RoZXIuSXNVbnNpZ25lZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUHJvdmlkZSBhbiBvcmRlcmluZyBmb3IgZmluZGluZyBhIGNvbW1vbiBjb252ZXJzaW9uIHR5cGUuCisgIC8vLworICAvLy8gVW5zaWduZWQgaW50ZWdlcnMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYmV0dGVyIGNvbnZlcnNpb24gdHlwZXMgdGhhbgorICAvLy8gc2lnbmVkIGludGVnZXJzIG9mIHRoZSBzYW1lIHdpZHRoLgorICBib29sIG9wZXJhdG9yPChjb25zdCBBUFNJbnRUeXBlICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShCaXRXaWR0aCwgSXNVbnNpZ25lZCkgPAorICAgICAgICAgICBzdGQ6OnRpZShPdGhlci5CaXRXaWR0aCwgT3RoZXIuSXNVbnNpZ25lZCk7CisgIH0KK307CisgICAgCit9IC8vIGVuZCBlbnRvIG5hbWVzcGFjZQorfSAvLyBlbmQgY2xhbmcgbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0FuYWx5c2lzTWFuYWdlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0FuYWx5c2lzTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YjkzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQW5hbHlzaXNNYW5hZ2VyLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8vPT0gQW5hbHlzaXNNYW5hZ2VyLmggLSBQYXRoIHNlbnNpdGl2ZSBhbmFseXNpcyBkYXRhIG1hbmFnZXIgLS0tLS0tKi0gQysrIC0qLS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEFuYWx5c2lzTWFuYWdlciBjbGFzcyB0aGF0IG1hbmFnZXMgdGhlIGRhdGEgYW5kIHBvbGljeQorLy8gZm9yIHBhdGggc2Vuc2l0aXZlIGFuYWx5c2lzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfQU5BTFlTSVNNQU5BR0VSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfQU5BTFlTSVNNQU5BR0VSX0gKKworI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0FuYWx5c2lzRGVjbENvbnRleHQuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0FuYWx5emVyT3B0aW9ucy5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQnVnUmVwb3J0ZXIvQnVnUmVwb3J0ZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0J1Z1JlcG9ydGVyL1BhdGhEaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoRGlhZ25vc3RpY0NvbnN1bWVycy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBDb2RlSW5qZWN0b3I7CisKK25hbWVzcGFjZSBlbnRvIHsKKyAgY2xhc3MgQ2hlY2tlck1hbmFnZXI7CisKK2NsYXNzIEFuYWx5c2lzTWFuYWdlciA6IHB1YmxpYyBCdWdSZXBvcnRlckRhdGEgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIEFuYWx5c2lzRGVjbENvbnRleHRNYW5hZ2VyIEFuYUN0eE1ncjsKKworICBBU1RDb250ZXh0ICZDdHg7CisgIERpYWdub3N0aWNzRW5naW5lICZEaWFnczsKKyAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzOworICBQYXRoRGlhZ25vc3RpY0NvbnN1bWVycyBQYXRoQ29uc3VtZXJzOworCisgIC8vIENvbmZpZ3VyYWJsZSBjb21wb25lbnRzIGNyZWF0b3JzLgorICBTdG9yZU1hbmFnZXJDcmVhdG9yIENyZWF0ZVN0b3JlTWdyOworICBDb25zdHJhaW50TWFuYWdlckNyZWF0b3IgQ3JlYXRlQ29uc3RyYWludE1ncjsKKworICBDaGVja2VyTWFuYWdlciAqQ2hlY2tlck1ncjsKKworcHVibGljOgorICBBbmFseXplck9wdGlvbnMgJm9wdGlvbnM7CisgIAorICBBbmFseXNpc01hbmFnZXIoQVNUQ29udGV4dCAmY3R4LERpYWdub3N0aWNzRW5naW5lICZkaWFncywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZsYW5nLAorICAgICAgICAgICAgICAgICAgY29uc3QgUGF0aERpYWdub3N0aWNDb25zdW1lcnMgJkNvbnN1bWVycywKKyAgICAgICAgICAgICAgICAgIFN0b3JlTWFuYWdlckNyZWF0b3Igc3RvcmVtZ3IsCisgICAgICAgICAgICAgICAgICBDb25zdHJhaW50TWFuYWdlckNyZWF0b3IgY29uc3RyYWludG1nciwgCisgICAgICAgICAgICAgICAgICBDaGVja2VyTWFuYWdlciAqY2hlY2tlck1nciwKKyAgICAgICAgICAgICAgICAgIEFuYWx5emVyT3B0aW9ucyAmT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIENvZGVJbmplY3RvciogaW5qZWN0b3IgPSBudWxscHRyKTsKKworICB+QW5hbHlzaXNNYW5hZ2VyKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBDbGVhckNvbnRleHRzKCkgeworICAgIEFuYUN0eE1nci5jbGVhcigpOworICB9CisgIAorICBBbmFseXNpc0RlY2xDb250ZXh0TWFuYWdlciYgZ2V0QW5hbHlzaXNEZWNsQ29udGV4dE1hbmFnZXIoKSB7CisgICAgcmV0dXJuIEFuYUN0eE1ncjsKKyAgfQorCisgIFN0b3JlTWFuYWdlckNyZWF0b3IgZ2V0U3RvcmVNYW5hZ2VyQ3JlYXRvcigpIHsKKyAgICByZXR1cm4gQ3JlYXRlU3RvcmVNZ3I7CisgIH0KKworICBBbmFseXplck9wdGlvbnMmIGdldEFuYWx5emVyT3B0aW9ucygpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gb3B0aW9uczsKKyAgfQorCisgIENvbnN0cmFpbnRNYW5hZ2VyQ3JlYXRvciBnZXRDb25zdHJhaW50TWFuYWdlckNyZWF0b3IoKSB7CisgICAgcmV0dXJuIENyZWF0ZUNvbnN0cmFpbnRNZ3I7CisgIH0KKworICBDaGVja2VyTWFuYWdlciAqZ2V0Q2hlY2tlck1hbmFnZXIoKSBjb25zdCB7IHJldHVybiBDaGVja2VyTWdyOyB9CisKKyAgQVNUQ29udGV4dCAmZ2V0QVNUQ29udGV4dCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gQ3R4OworICB9CisKKyAgU291cmNlTWFuYWdlciAmZ2V0U291cmNlTWFuYWdlcigpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0QVNUQ29udGV4dCgpLmdldFNvdXJjZU1hbmFnZXIoKTsKKyAgfQorCisgIERpYWdub3N0aWNzRW5naW5lICZnZXREaWFnbm9zdGljKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBEaWFnczsKKyAgfQorCisgIGNvbnN0IExhbmdPcHRpb25zICZnZXRMYW5nT3B0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gTGFuZ09wdHM7CisgIH0KKworICBBcnJheVJlZjxQYXRoRGlhZ25vc3RpY0NvbnN1bWVyKj4gZ2V0UGF0aERpYWdub3N0aWNDb25zdW1lcnMoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIFBhdGhDb25zdW1lcnM7CisgIH0KKworICB2b2lkIEZsdXNoRGlhZ25vc3RpY3MoKTsKKworICBib29sIHNob3VsZFZpc3VhbGl6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gb3B0aW9ucy52aXN1YWxpemVFeHBsb2RlZEdyYXBoV2l0aEdyYXBoVml6IHx8CisgICAgICAgICAgIG9wdGlvbnMudmlzdWFsaXplRXhwbG9kZWRHcmFwaFdpdGhVYmlHcmFwaDsKKyAgfQorCisgIGJvb2wgc2hvdWxkSW5saW5lQ2FsbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gb3B0aW9ucy5nZXRJUEFNb2RlKCkgIT0gSVBBS19Ob25lOworICB9CisKKyAgQ0ZHICpnZXRDRkcoRGVjbCBjb25zdCAqRCkgeworICAgIHJldHVybiBBbmFDdHhNZ3IuZ2V0Q29udGV4dChEKS0+Z2V0Q0ZHKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgVCAqZ2V0QW5hbHlzaXMoRGVjbCBjb25zdCAqRCkgeworICAgIHJldHVybiBBbmFDdHhNZ3IuZ2V0Q29udGV4dChEKS0+Z2V0QW5hbHlzaXM8VD4oKTsKKyAgfQorCisgIFBhcmVudE1hcCAmZ2V0UGFyZW50TWFwKERlY2wgY29uc3QgKkQpIHsKKyAgICByZXR1cm4gQW5hQ3R4TWdyLmdldENvbnRleHQoRCktPmdldFBhcmVudE1hcCgpOworICB9CisKKyAgQW5hbHlzaXNEZWNsQ29udGV4dCAqZ2V0QW5hbHlzaXNEZWNsQ29udGV4dChjb25zdCBEZWNsICpEKSB7CisgICAgcmV0dXJuIEFuYUN0eE1nci5nZXRDb250ZXh0KEQpOworICB9Cit9OworCit9IC8vIGVuQW5hQ3R4TWdyc3BhY2UKKworfSAvLyBlbmQgY2xhbmcgbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0Jhc2ljVmFsdWVGYWN0b3J5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQmFzaWNWYWx1ZUZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmJjNjUwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0Jhc2ljVmFsdWVGYWN0b3J5LmgKQEAgLTAsMCArMSwyNzAgQEAKKy8vPT0tIEJhc2ljVmFsdWVGYWN0b3J5LmggLSBCYXNpYyB2YWx1ZXMgZm9yIFBhdGggU2VucyBhbmFseXNpcyAtLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIEJhc2ljVmFsdWVGYWN0b3J5LCBhIGNsYXNzIHRoYXQgbWFuYWdlcyB0aGUgbGlmZXRpbWUKKy8vICBvZiBBUFNJbnQgb2JqZWN0cyBhbmQgc3ltYm9saWMgY29uc3RyYWludHMgdXNlZCBieSBFeHByRW5naW5lCisvLyAgYW5kIHJlbGF0ZWQgY2xhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX0JBU0lDVkFMVUVGQUNUT1JZX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfQkFTSUNWQUxVRUZBQ1RPUllfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVENvbnRleHQuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXhwci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0FQU0ludFR5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU1ZhbHMuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU3RvcmVSZWYuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvTWVtUmVnaW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQVBTSW50LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ltbXV0YWJsZUxpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQ1hYQmFzZVNwZWNpZmllcjsKK2NsYXNzIERlY2xhcmF0b3JEZWNsOworCituYW1lc3BhY2UgZW50byB7CisKK2NsYXNzIENvbXBvdW5kVmFsRGF0YSA6IHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CisgIFF1YWxUeXBlIFQ7CisgIGxsdm06OkltbXV0YWJsZUxpc3Q8U1ZhbD4gTDsKKworcHVibGljOgorICBDb21wb3VuZFZhbERhdGEoUXVhbFR5cGUgdCwgbGx2bTo6SW1tdXRhYmxlTGlzdDxTVmFsPiBsKSA6IFQodCksIEwobCkgeworICAgIGFzc2VydChOb25Mb2M6OmlzQ29tcG91bmRUeXBlKHQpKTsKKyAgfQorCisgIHVzaW5nIGl0ZXJhdG9yID0gbGx2bTo6SW1tdXRhYmxlTGlzdDxTVmFsPjo6aXRlcmF0b3I7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBMLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gTC5lbmQoKTsgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQsIFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6SW1tdXRhYmxlTGlzdDxTVmFsPiBMKTsKKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIHsgUHJvZmlsZShJRCwgVCwgTCk7IH0KK307CisKK2NsYXNzIExhenlDb21wb3VuZFZhbERhdGEgOiBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworICBTdG9yZVJlZiBzdG9yZTsKKyAgY29uc3QgVHlwZWRWYWx1ZVJlZ2lvbiAqcmVnaW9uOworCitwdWJsaWM6CisgIExhenlDb21wb3VuZFZhbERhdGEoY29uc3QgU3RvcmVSZWYgJnN0LCBjb25zdCBUeXBlZFZhbHVlUmVnaW9uICpyKQorICAgICAgOiBzdG9yZShzdCksIHJlZ2lvbihyKSB7CisgICAgYXNzZXJ0KE5vbkxvYzo6aXNDb21wb3VuZFR5cGUoci0+Z2V0VmFsdWVUeXBlKCkpKTsKKyAgfQorCisgIGNvbnN0IHZvaWQgKmdldFN0b3JlKCkgY29uc3QgeyByZXR1cm4gc3RvcmUuZ2V0U3RvcmUoKTsgfQorICBjb25zdCBUeXBlZFZhbHVlUmVnaW9uICpnZXRSZWdpb24oKSBjb25zdCB7IHJldHVybiByZWdpb247IH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElELAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0b3JlUmVmICZzdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlZFZhbHVlUmVnaW9uICpyZWdpb24pOworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgeyBQcm9maWxlKElELCBzdG9yZSwgcmVnaW9uKTsgfQorfTsKKworY2xhc3MgUG9pbnRlclRvTWVtYmVyRGF0YSA6IHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CisgIGNvbnN0IERlY2xhcmF0b3JEZWNsICpEOworICBsbHZtOjpJbW11dGFibGVMaXN0PGNvbnN0IENYWEJhc2VTcGVjaWZpZXIgKj4gTDsKKworcHVibGljOgorICBQb2ludGVyVG9NZW1iZXJEYXRhKGNvbnN0IERlY2xhcmF0b3JEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkltbXV0YWJsZUxpc3Q8Y29uc3QgQ1hYQmFzZVNwZWNpZmllciAqPiBMKQorICAgICAgOiBEKEQpLCBMKEwpIHt9CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBsbHZtOjpJbW11dGFibGVMaXN0PGNvbnN0IENYWEJhc2VTcGVjaWZpZXIgKj46Oml0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gTC5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEwuZW5kKCk7IH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElELCBjb25zdCBEZWNsYXJhdG9yRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpJbW11dGFibGVMaXN0PGNvbnN0IENYWEJhc2VTcGVjaWZpZXIgKj4gTCk7CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSB7IFByb2ZpbGUoSUQsIEQsIEwpOyB9CisgIGNvbnN0IERlY2xhcmF0b3JEZWNsICpnZXREZWNsYXJhdG9yRGVjbCgpIGNvbnN0IHtyZXR1cm4gRDt9CisKKyAgbGx2bTo6SW1tdXRhYmxlTGlzdDxjb25zdCBDWFhCYXNlU3BlY2lmaWVyICo+IGdldENYWEJhc2VMaXN0KCkgY29uc3QgeworICAgIHJldHVybiBMOworICB9Cit9OworCitjbGFzcyBCYXNpY1ZhbHVlRmFjdG9yeSB7CisgIHVzaW5nIEFQU0ludFNldFR5ID0KKyAgICAgIGxsdm06OkZvbGRpbmdTZXQ8bGx2bTo6Rm9sZGluZ1NldE5vZGVXcmFwcGVyPGxsdm06OkFQU0ludD4+OworCisgIEFTVENvbnRleHQgJkN0eDsKKyAgbGx2bTo6QnVtcFB0ckFsbG9jYXRvciYgQlBBbGxvYzsKKworICBBUFNJbnRTZXRUeSBBUFNJbnRTZXQ7CisgIHZvaWQgKlBlcnNpc3RlbnRTVmFscyA9IG51bGxwdHI7CisgIHZvaWQgKlBlcnNpc3RlbnRTVmFsUGFpcnMgPSBudWxscHRyOworCisgIGxsdm06OkltbXV0YWJsZUxpc3Q8U1ZhbD46OkZhY3RvcnkgU1ZhbExpc3RGYWN0b3J5OworICBsbHZtOjpJbW11dGFibGVMaXN0PGNvbnN0IENYWEJhc2VTcGVjaWZpZXIgKj46OkZhY3RvcnkgQ1hYQmFzZUxpc3RGYWN0b3J5OworICBsbHZtOjpGb2xkaW5nU2V0PENvbXBvdW5kVmFsRGF0YT4gIENvbXBvdW5kVmFsRGF0YVNldDsKKyAgbGx2bTo6Rm9sZGluZ1NldDxMYXp5Q29tcG91bmRWYWxEYXRhPiBMYXp5Q29tcG91bmRWYWxEYXRhU2V0OworICBsbHZtOjpGb2xkaW5nU2V0PFBvaW50ZXJUb01lbWJlckRhdGE+IFBvaW50ZXJUb01lbWJlckRhdGFTZXQ7CisKKyAgLy8gVGhpcyBpcyBwcml2YXRlIGJlY2F1c2UgZXh0ZXJuYWwgY2xpZW50cyBzaG91bGQgdXNlIHRoZSBmYWN0b3J5CisgIC8vIG1ldGhvZCB0aGF0IHRha2VzIGEgUXVhbFR5cGUuCisgIGNvbnN0IGxsdm06OkFQU0ludCYgZ2V0VmFsdWUodWludDY0X3QgWCwgdW5zaWduZWQgQml0V2lkdGgsIGJvb2wgaXNVbnNpZ25lZCk7CisKK3B1YmxpYzoKKyAgQmFzaWNWYWx1ZUZhY3RvcnkoQVNUQ29udGV4dCAmY3R4LCBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yICZBbGxvYykKKyAgICAgIDogQ3R4KGN0eCksIEJQQWxsb2MoQWxsb2MpLCBTVmFsTGlzdEZhY3RvcnkoQWxsb2MpLAorICAgICAgICBDWFhCYXNlTGlzdEZhY3RvcnkoQWxsb2MpIHt9CisKKyAgfkJhc2ljVmFsdWVGYWN0b3J5KCk7CisKKyAgQVNUQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIEN0eDsgfQorCisgIGNvbnN0IGxsdm06OkFQU0ludCYgZ2V0VmFsdWUoY29uc3QgbGx2bTo6QVBTSW50JiBYKTsKKyAgY29uc3QgbGx2bTo6QVBTSW50JiBnZXRWYWx1ZShjb25zdCBsbHZtOjpBUEludCYgWCwgYm9vbCBpc1Vuc2lnbmVkKTsKKyAgY29uc3QgbGx2bTo6QVBTSW50JiBnZXRWYWx1ZSh1aW50NjRfdCBYLCBRdWFsVHlwZSBUKTsKKworICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgQVBTSW50IHVzZWQgdG8gc3RvcmUgdmFsdWVzIG9mIHRoZSBnaXZlbiBRdWFsVHlwZS4KKyAgQVBTSW50VHlwZSBnZXRBUFNJbnRUeXBlKFF1YWxUeXBlIFQpIGNvbnN0IHsKKyAgICBhc3NlcnQoVC0+aXNJbnRlZ3JhbE9yRW51bWVyYXRpb25UeXBlKCkgfHwgTG9jOjppc0xvY1R5cGUoVCkpOworICAgIHJldHVybiBBUFNJbnRUeXBlKEN0eC5nZXRJbnRXaWR0aChUKSwKKyAgICAgICAgICAgICAgICAgICAgICAhVC0+aXNTaWduZWRJbnRlZ2VyT3JFbnVtZXJhdGlvblR5cGUoKSk7CisgIH0KKworICAvLy8gQ29udmVydCAtIENyZWF0ZSBhIG5ldyBwZXJzaXN0ZW50IEFQU0ludCB3aXRoIHRoZSBzYW1lIHZhbHVlIGFzICdGcm9tJworICAvLy8gIGJ1dCB3aXRoIHRoZSBiaXR3aWR0aCBhbmQgc2lnbmVkbmVzcyBvZiAnVG8nLgorICBjb25zdCBsbHZtOjpBUFNJbnQgJkNvbnZlcnQoY29uc3QgbGx2bTo6QVBTSW50JiBUbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCYgRnJvbSkgeworICAgIEFQU0ludFR5cGUgVGFyZ2V0VHlwZShUbyk7CisgICAgaWYgKFRhcmdldFR5cGUgPT0gQVBTSW50VHlwZShGcm9tKSkKKyAgICAgIHJldHVybiBGcm9tOworCisgICAgcmV0dXJuIGdldFZhbHVlKFRhcmdldFR5cGUuY29udmVydChGcm9tKSk7CisgIH0KKyAgCisgIGNvbnN0IGxsdm06OkFQU0ludCAmQ29udmVydChRdWFsVHlwZSBULCBjb25zdCBsbHZtOjpBUFNJbnQgJkZyb20pIHsKKyAgICBBUFNJbnRUeXBlIFRhcmdldFR5cGUgPSBnZXRBUFNJbnRUeXBlKFQpOworICAgIGlmIChUYXJnZXRUeXBlID09IEFQU0ludFR5cGUoRnJvbSkpCisgICAgICByZXR1cm4gRnJvbTsKKyAgICAKKyAgICByZXR1cm4gZ2V0VmFsdWUoVGFyZ2V0VHlwZS5jb252ZXJ0KEZyb20pKTsKKyAgfQorCisgIGNvbnN0IGxsdm06OkFQU0ludCAmZ2V0SW50VmFsdWUodWludDY0X3QgWCwgYm9vbCBpc1Vuc2lnbmVkKSB7CisgICAgUXVhbFR5cGUgVCA9IGlzVW5zaWduZWQgPyBDdHguVW5zaWduZWRJbnRUeSA6IEN0eC5JbnRUeTsKKyAgICByZXR1cm4gZ2V0VmFsdWUoWCwgVCk7CisgIH0KKworICBjb25zdCBsbHZtOjpBUFNJbnQgJmdldE1heFZhbHVlKGNvbnN0IGxsdm06OkFQU0ludCAmdikgeworICAgIHJldHVybiBnZXRWYWx1ZShBUFNJbnRUeXBlKHYpLmdldE1heFZhbHVlKCkpOworICB9CisKKyAgY29uc3QgbGx2bTo6QVBTSW50ICZnZXRNaW5WYWx1ZShjb25zdCBsbHZtOjpBUFNJbnQgJnYpIHsKKyAgICByZXR1cm4gZ2V0VmFsdWUoQVBTSW50VHlwZSh2KS5nZXRNaW5WYWx1ZSgpKTsKKyAgfQorCisgIGNvbnN0IGxsdm06OkFQU0ludCAmZ2V0TWF4VmFsdWUoUXVhbFR5cGUgVCkgeworICAgIHJldHVybiBnZXRWYWx1ZShnZXRBUFNJbnRUeXBlKFQpLmdldE1heFZhbHVlKCkpOworICB9CisKKyAgY29uc3QgbGx2bTo6QVBTSW50ICZnZXRNaW5WYWx1ZShRdWFsVHlwZSBUKSB7CisgICAgcmV0dXJuIGdldFZhbHVlKGdldEFQU0ludFR5cGUoVCkuZ2V0TWluVmFsdWUoKSk7CisgIH0KKworICBjb25zdCBsbHZtOjpBUFNJbnQgJkFkZDEoY29uc3QgbGx2bTo6QVBTSW50ICZWKSB7CisgICAgbGx2bTo6QVBTSW50IFggPSBWOworICAgICsrWDsKKyAgICByZXR1cm4gZ2V0VmFsdWUoWCk7CisgIH0KKworICBjb25zdCBsbHZtOjpBUFNJbnQgJlN1YjEoY29uc3QgbGx2bTo6QVBTSW50ICZWKSB7CisgICAgbGx2bTo6QVBTSW50IFggPSBWOworICAgIC0tWDsKKyAgICByZXR1cm4gZ2V0VmFsdWUoWCk7CisgIH0KKworICBjb25zdCBsbHZtOjpBUFNJbnQgJmdldFplcm9XaXRoVHlwZVNpemUoUXVhbFR5cGUgVCkgeworICAgIGFzc2VydChULT5pc1NjYWxhclR5cGUoKSk7CisgICAgcmV0dXJuIGdldFZhbHVlKDAsIEN0eC5nZXRUeXBlU2l6ZShUKSwgdHJ1ZSk7CisgIH0KKworICBjb25zdCBsbHZtOjpBUFNJbnQgJmdldFplcm9XaXRoUHRyV2lkdGgoYm9vbCBpc1Vuc2lnbmVkID0gdHJ1ZSkgeworICAgIHJldHVybiBnZXRWYWx1ZSgwLCBDdHguZ2V0VHlwZVNpemUoQ3R4LlZvaWRQdHJUeSksIGlzVW5zaWduZWQpOworICB9CisKKyAgY29uc3QgbGx2bTo6QVBTSW50ICZnZXRJbnRXaXRoUHRyV2lkdGgodWludDY0X3QgWCwgYm9vbCBpc1Vuc2lnbmVkKSB7CisgICAgcmV0dXJuIGdldFZhbHVlKFgsIEN0eC5nZXRUeXBlU2l6ZShDdHguVm9pZFB0clR5KSwgaXNVbnNpZ25lZCk7CisgIH0KKworICBjb25zdCBsbHZtOjpBUFNJbnQgJmdldFRydXRoVmFsdWUoYm9vbCBiLCBRdWFsVHlwZSBUKSB7CisgICAgcmV0dXJuIGdldFZhbHVlKGIgPyAxIDogMCwgQ3R4LmdldEludFdpZHRoKFQpLCB0cnVlKTsKKyAgfQorCisgIGNvbnN0IGxsdm06OkFQU0ludCAmZ2V0VHJ1dGhWYWx1ZShib29sIGIpIHsKKyAgICByZXR1cm4gZ2V0VHJ1dGhWYWx1ZShiLCBDdHguZ2V0TG9naWNhbE9wZXJhdGlvblR5cGUoKSk7CisgIH0KKworICBjb25zdCBDb21wb3VuZFZhbERhdGEgKmdldENvbXBvdW5kVmFsRGF0YShRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpJbW11dGFibGVMaXN0PFNWYWw+IFZhbHMpOworCisgIGNvbnN0IExhenlDb21wb3VuZFZhbERhdGEgKmdldExhenlDb21wb3VuZFZhbERhdGEoY29uc3QgU3RvcmVSZWYgJnN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlZFZhbHVlUmVnaW9uICpyZWdpb24pOworCisgIGNvbnN0IFBvaW50ZXJUb01lbWJlckRhdGEgKmdldFBvaW50ZXJUb01lbWJlckRhdGEoCisgICAgICBjb25zdCBEZWNsYXJhdG9yRGVjbCAqREQsCisgICAgICBsbHZtOjpJbW11dGFibGVMaXN0PGNvbnN0IENYWEJhc2VTcGVjaWZpZXIgKj4gTCk7CisKKyAgbGx2bTo6SW1tdXRhYmxlTGlzdDxTVmFsPiBnZXRFbXB0eVNWYWxMaXN0KCkgeworICAgIHJldHVybiBTVmFsTGlzdEZhY3RvcnkuZ2V0RW1wdHlMaXN0KCk7CisgIH0KKworICBsbHZtOjpJbW11dGFibGVMaXN0PFNWYWw+IHByZXBlbmRTVmFsKFNWYWwgWCwgbGx2bTo6SW1tdXRhYmxlTGlzdDxTVmFsPiBMKSB7CisgICAgcmV0dXJuIFNWYWxMaXN0RmFjdG9yeS5hZGQoWCwgTCk7CisgIH0KKworICBsbHZtOjpJbW11dGFibGVMaXN0PGNvbnN0IENYWEJhc2VTcGVjaWZpZXIgKj4gZ2V0RW1wdHlDWFhCYXNlTGlzdCgpIHsKKyAgICByZXR1cm4gQ1hYQmFzZUxpc3RGYWN0b3J5LmdldEVtcHR5TGlzdCgpOworICB9CisKKyAgbGx2bTo6SW1tdXRhYmxlTGlzdDxjb25zdCBDWFhCYXNlU3BlY2lmaWVyICo+IHByZXBlbmRDWFhCYXNlKAorICAgICAgY29uc3QgQ1hYQmFzZVNwZWNpZmllciAqQ0JTLAorICAgICAgbGx2bTo6SW1tdXRhYmxlTGlzdDxjb25zdCBDWFhCYXNlU3BlY2lmaWVyICo+IEwpIHsKKyAgICByZXR1cm4gQ1hYQmFzZUxpc3RGYWN0b3J5LmFkZChDQlMsIEwpOworICB9CisKKyAgY29uc3QgUG9pbnRlclRvTWVtYmVyRGF0YSAqYWNjdW1DWFhCYXNlKAorICAgICAgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8Q2FzdEV4cHI6OnBhdGhfY29uc3RfaXRlcmF0b3I+IFBhdGhSYW5nZSwKKyAgICAgIGNvbnN0IG5vbmxvYzo6UG9pbnRlclRvTWVtYmVyICZQVE0pOworCisgIGNvbnN0IGxsdm06OkFQU0ludCogZXZhbEFQU0ludChCaW5hcnlPcGVyYXRvcjo6T3Bjb2RlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCYgVjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBTSW50JiBWMik7CisKKyAgY29uc3Qgc3RkOjpwYWlyPFNWYWwsIHVpbnRwdHJfdD4mCisgIGdldFBlcnNpc3RlbnRTVmFsV2l0aERhdGEoY29uc3QgU1ZhbCYgViwgdWludHB0cl90IERhdGEpOworCisgIGNvbnN0IHN0ZDo6cGFpcjxTVmFsLCBTVmFsPiYKKyAgZ2V0UGVyc2lzdGVudFNWYWxQYWlyKGNvbnN0IFNWYWwmIFYxLCBjb25zdCBTVmFsJiBWMik7CisKKyAgY29uc3QgU1ZhbCogZ2V0UGVyc2lzdGVudFNWYWwoU1ZhbCBYKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGVudG8KKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX0JBU0lDVkFMVUVGQUNUT1JZX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9CbG9ja0NvdW50ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9CbG9ja0NvdW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDc3OWU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0Jsb2NrQ291bnRlci5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vPT0tIEJsb2NrQ291bnRlci5oIC0gQURUIGZvciBjb3VudGluZyBibG9jayB2aXNpdHMgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIEJsb2NrQ291bnRlciwgYW4gYWJzdHJhY3QgZGF0YSB0eXBlIHVzZWQgdG8gY291bnQKKy8vICB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgZ2l2ZW4gYmxvY2sgaGFzIGJlZW4gdmlzaXRlZCBhbG9uZyBhIHBhdGgKKy8vICBhbmFseXplZCBieSBDb3JlRW5naW5lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfQkxPQ0tDT1VOVEVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfQkxPQ0tDT1VOVEVSX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgU3RhY2tGcmFtZUNvbnRleHQ7CisKK25hbWVzcGFjZSBlbnRvIHsKKworLy8vIFxjbGFzcyBCbG9ja0NvdW50ZXIKKy8vLyBcYnJpZWYgQW4gYWJzdHJhY3QgZGF0YSB0eXBlIHVzZWQgdG8gY291bnQgdGhlIG51bWJlciBvZiB0aW1lcyBhIGdpdmVuCisvLy8gYmxvY2sgaGFzIGJlZW4gdmlzaXRlZCBhbG9uZyBhIHBhdGggYW5hbHl6ZWQgYnkgQ29yZUVuZ2luZS4KK2NsYXNzIEJsb2NrQ291bnRlciB7CisgIHZvaWQgKkRhdGE7CisKKyAgQmxvY2tDb3VudGVyKHZvaWQgKkQpIDogRGF0YShEKSB7fQorCitwdWJsaWM6CisgIEJsb2NrQ291bnRlcigpIDogRGF0YShudWxscHRyKSB7fQorCisgIHVuc2lnbmVkIGdldE51bVZpc2l0ZWQoY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKkNhbGxTaXRlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCbG9ja0lEKSBjb25zdDsKKworICBjbGFzcyBGYWN0b3J5IHsKKyAgICB2b2lkICpGOworICBwdWJsaWM6CisgICAgRmFjdG9yeShsbHZtOjpCdW1wUHRyQWxsb2NhdG9yJiBBbGxvYyk7CisgICAgfkZhY3RvcnkoKTsKKworICAgIEJsb2NrQ291bnRlciBHZXRFbXB0eUNvdW50ZXIoKTsKKyAgICBCbG9ja0NvdW50ZXIgSW5jcmVtZW50Q291bnQoQmxvY2tDb3VudGVyIEJDLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGFja0ZyYW1lQ29udGV4dCAqQ2FsbFNpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQmxvY2tJRCk7CisgIH07CisKKyAgZnJpZW5kIGNsYXNzIEZhY3Rvcnk7Cit9OworCit9IC8vIGVuZCBHUiBuYW1lc3BhY2UKKworfSAvLyBlbmQgY2xhbmcgbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0NhbGxFdmVudC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0NhbGxFdmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlN2IzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQ2FsbEV2ZW50LmgKQEAgLTAsMCArMSwxMTQ1IEBACisvLz09PS0gQ2FsbEV2ZW50LmggLSBXcmFwcGVyIGZvciBhbGwgZnVuY3Rpb24gYW5kIG1ldGhvZCBjYWxscyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZSBUaGlzIGZpbGUgZGVmaW5lcyBDYWxsRXZlbnQgYW5kIGl0cyBzdWJjbGFzc2VzLCB3aGljaCByZXByZXNlbnQgcGF0aC0KKy8vLyBzZW5zaXRpdmUgaW5zdGFuY2VzIG9mIGRpZmZlcmVudCBraW5kcyBvZiBmdW5jdGlvbiBhbmQgbWV0aG9kIGNhbGxzCisvLy8gKEMsIEMrKywgYW5kIE9iamVjdGl2ZS1DKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX0NBTExFVkVOVF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX0NBTExFVkVOVF9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQmFzZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQ1hYLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xPYmpDLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHIuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXhwckNYWC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByT2JqQy5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1Byb2dyYW1TdGF0ZS5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Qcm9ncmFtU3RhdGVfRndkLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1NWYWxzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBMb2NhdGlvbkNvbnRleHQ7CitjbGFzcyBQcm9ncmFtUG9pbnQ7CitjbGFzcyBQcm9ncmFtUG9pbnRUYWc7CitjbGFzcyBTdGFja0ZyYW1lQ29udGV4dDsKKworbmFtZXNwYWNlIGVudG8geworCitlbnVtIENhbGxFdmVudEtpbmQgeworICBDRV9GdW5jdGlvbiwKKyAgQ0VfQ1hYTWVtYmVyLAorICBDRV9DWFhNZW1iZXJPcGVyYXRvciwKKyAgQ0VfQ1hYRGVzdHJ1Y3RvciwKKyAgQ0VfQkVHX0NYWF9JTlNUQU5DRV9DQUxMUyA9IENFX0NYWE1lbWJlciwKKyAgQ0VfRU5EX0NYWF9JTlNUQU5DRV9DQUxMUyA9IENFX0NYWERlc3RydWN0b3IsCisgIENFX0NYWENvbnN0cnVjdG9yLAorICBDRV9DWFhBbGxvY2F0b3IsCisgIENFX0JFR19GVU5DVElPTl9DQUxMUyA9IENFX0Z1bmN0aW9uLAorICBDRV9FTkRfRlVOQ1RJT05fQ0FMTFMgPSBDRV9DWFhBbGxvY2F0b3IsCisgIENFX0Jsb2NrLAorICBDRV9PYmpDTWVzc2FnZQorfTsKKworY2xhc3MgQ2FsbEV2ZW50OworCisvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgZGVzY3JpcHRpb24gb2YgYSBmdW5jdGlvbiBjYWxsIHVzaW5nIHRoZSBudW1iZXIgb2YKKy8vLyBhcmd1bWVudHMgYW5kIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4KK2NsYXNzIENhbGxEZXNjcmlwdGlvbiB7CisgIGZyaWVuZCBDYWxsRXZlbnQ7CisKKyAgbXV0YWJsZSBJZGVudGlmaWVySW5mbyAqSUkgPSBudWxscHRyOworICBtdXRhYmxlIGJvb2wgSXNMb29rdXBEb25lID0gZmFsc2U7CisgIFN0cmluZ1JlZiBGdW5jTmFtZTsKKyAgdW5zaWduZWQgUmVxdWlyZWRBcmdzOworCitwdWJsaWM6CisgIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBOb0FyZ1JlcXVpcmVtZW50ID0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpOworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0cyBhIENhbGxEZXNjcmlwdGlvbiBvYmplY3QuCisgIC8vLworICAvLy8gQHBhcmFtIEZ1bmNOYW1lIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgbWF0Y2hlZC4KKyAgLy8vCisgIC8vLyBAcGFyYW0gUmVxdWlyZWRBcmdzIFRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRoYXQgaXMgZXhwZWN0ZWQgdG8gbWF0Y2ggYQorICAvLy8gY2FsbC4gT21pdCB0aGlzIHBhcmFtZXRlciB0byBtYXRjaCBldmVyeSBvY2N1cmFuY2Ugb2YgY2FsbCB3aXRoIGEgZ2l2ZW4KKyAgLy8vIG5hbWUgcmVnYXJkbGVzcyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgQ2FsbERlc2NyaXB0aW9uKFN0cmluZ1JlZiBGdW5jTmFtZSwgdW5zaWduZWQgUmVxdWlyZWRBcmdzID0gTm9BcmdSZXF1aXJlbWVudCkKKyAgICAgIDogRnVuY05hbWUoRnVuY05hbWUpLCBSZXF1aXJlZEFyZ3MoUmVxdWlyZWRBcmdzKSB7fQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHRoaXMgb2JqZWN0IG1hdGNoZXMuCisgIFN0cmluZ1JlZiBnZXRGdW5jdGlvbk5hbWUoKSBjb25zdCB7IHJldHVybiBGdW5jTmFtZTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCA9IENhbGxFdmVudD4KK2NsYXNzIENhbGxFdmVudFJlZiA6IHB1YmxpYyBJbnRydXNpdmVSZWZDbnRQdHI8Y29uc3QgVD4geworcHVibGljOgorICBDYWxsRXZlbnRSZWYoY29uc3QgVCAqQ2FsbCkgOiBJbnRydXNpdmVSZWZDbnRQdHI8Y29uc3QgVD4oQ2FsbCkge30KKyAgQ2FsbEV2ZW50UmVmKGNvbnN0IENhbGxFdmVudFJlZiAmT3JpZykgOiBJbnRydXNpdmVSZWZDbnRQdHI8Y29uc3QgVD4oT3JpZykge30KKworICBDYWxsRXZlbnRSZWY8VD4gY2xvbmVXaXRoU3RhdGUoUHJvZ3JhbVN0YXRlUmVmIFN0YXRlKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPmdldCgpLT50ZW1wbGF0ZSBjbG9uZVdpdGhTdGF0ZTxUPihTdGF0ZSk7CisgIH0KKworICAvLyBBbGxvdyBpbXBsaWNpdCBjb252ZXJzaW9ucyB0byBhIHN1cGVyY2xhc3MgdHlwZSwgc2luY2UgQ2FsbEV2ZW50UmVmCisgIC8vIGJlaGF2ZXMgbGlrZSBhIHBvaW50ZXItdG8tY29uc3QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTdXBlclQ+CisgIG9wZXJhdG9yIENhbGxFdmVudFJlZjxTdXBlclQ+ICgpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+Z2V0KCk7CisgIH0KK307CisKKy8vLyBcY2xhc3MgUnVudGltZURlZmluaXRpb24gCisvLy8gXGJyaWVmIERlZmluZXMgdGhlIHJ1bnRpbWUgZGVmaW5pdGlvbiBvZiB0aGUgY2FsbGVkIGZ1bmN0aW9uLgorLy8vIAorLy8vIEVuY2Fwc3VsYXRlcyB0aGUgaW5mb3JtYXRpb24gd2UgaGF2ZSBhYm91dCB3aGljaCBEZWNsIHdpbGwgYmUgdXNlZCAKKy8vLyB3aGVuIHRoZSBjYWxsIGlzIGV4ZWN1dGVkIG9uIHRoZSBnaXZlbiBwYXRoLiBXaGVuIGRlYWxpbmcgd2l0aCBkeW5hbWljCisvLy8gZGlzcGF0Y2gsIHRoZSBpbmZvcm1hdGlvbiBpcyBiYXNlZCBvbiBEeW5hbWljVHlwZUluZm8gYW5kIG1pZ2h0IG5vdCBiZSAKKy8vLyBwcmVjaXNlLgorY2xhc3MgUnVudGltZURlZmluaXRpb24geworICAvLy8gVGhlIERlY2xhcmF0aW9uIG9mIHRoZSBmdW5jdGlvbiB3aGljaCBjb3VsZCBiZSBjYWxsZWQgYXQgcnVudGltZS4KKyAgLy8vIE5VTEwgaWYgbm90IGF2YWlsYWJsZS4KKyAgY29uc3QgRGVjbCAqRCA9IG51bGxwdHI7CisKKyAgLy8vIFRoZSByZWdpb24gcmVwcmVzZW50aW5nIGFuIG9iamVjdCAoT2JqQy9DKyspIG9uIHdoaWNoIHRoZSBtZXRob2QgaXMKKyAgLy8vIGNhbGxlZC4gV2l0aCBkeW5hbWljIGRpc3BhdGNoLCB0aGUgbWV0aG9kIGRlZmluaXRpb24gZGVwZW5kcyBvbiB0aGUKKyAgLy8vIHJ1bnRpbWUgdHlwZSBvZiB0aGlzIG9iamVjdC4gTlVMTCB3aGVuIHRoZSBEeW5hbWljVHlwZUluZm8gaXMKKyAgLy8vIHByZWNpc2UuCisgIGNvbnN0IE1lbVJlZ2lvbiAqUiA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgUnVudGltZURlZmluaXRpb24oKSA9IGRlZmF1bHQ7CisgIFJ1bnRpbWVEZWZpbml0aW9uKGNvbnN0IERlY2wgKkluRCk6IEQoSW5EKSB7fQorICBSdW50aW1lRGVmaW5pdGlvbihjb25zdCBEZWNsICpJbkQsIGNvbnN0IE1lbVJlZ2lvbiAqSW5SKTogRChJbkQpLCBSKEluUikge30KKworICBjb25zdCBEZWNsICpnZXREZWNsKCkgeyByZXR1cm4gRDsgfQorICAgIAorICAvLy8gXGJyaWVmIENoZWNrIGlmIHRoZSBkZWZpbml0aW9uIHdlIGhhdmUgaXMgcHJlY2lzZS4gCisgIC8vLyBJZiBub3QsIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNhbGwgZGlzcGF0Y2hlcyB0byBhbm90aGVyIGRlZmluaXRpb24gYXQgCisgIC8vLyBleGVjdXRpb24gdGltZS4KKyAgYm9vbCBtYXlIYXZlT3RoZXJEZWZpbml0aW9ucygpIHsgcmV0dXJuIFIgIT0gbnVsbHB0cjsgfQorICAKKyAgLy8vIFdoZW4gb3RoZXIgZGVmaW5pdGlvbnMgYXJlIHBvc3NpYmxlLCByZXR1cm5zIHRoZSByZWdpb24gd2hvc2UgcnVudGltZSB0eXBlIAorICAvLy8gZGV0ZXJtaW5lcyB0aGUgbWV0aG9kIGRlZmluaXRpb24uCisgIGNvbnN0IE1lbVJlZ2lvbiAqZ2V0RGlzcGF0Y2hSZWdpb24oKSB7IHJldHVybiBSOyB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYW4gYWJzdHJhY3QgY2FsbCB0byBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBhbG9uZyBhCisvLy8gcGFydGljdWxhciBwYXRoLgorLy8vCisvLy8gQ2FsbEV2ZW50cyBhcmUgY3JlYXRlZCB0aHJvdWdoIHRoZSBmYWN0b3J5IG1ldGhvZHMgb2YgQ2FsbEV2ZW50TWFuYWdlci4KKy8vLworLy8vIENhbGxFdmVudHMgc2hvdWxkIGFsd2F5cyBiZSBjaGVhcCB0byBjcmVhdGUgYW5kIGRlc3Ryb3kuIEluIG9yZGVyIGZvcgorLy8vIENhbGxFdmVudE1hbmFnZXIgdG8gYmUgYWJsZSB0byByZS11c2UgQ2FsbEV2ZW50LXNpemVkIG1lbW9yeSBibG9ja3MsCisvLy8gc3ViY2xhc3NlcyBvZiBDYWxsRXZlbnQgbWF5IG5vdCBhZGQgYW55IGRhdGEgbWVtYmVycyB0byB0aGUgYmFzZSBjbGFzcy4KKy8vLyBVc2UgdGhlICJEYXRhIiBhbmQgIkxvY2F0aW9uIiBmaWVsZHMgaW5zdGVhZC4KK2NsYXNzIENhbGxFdmVudCB7CitwdWJsaWM6CisgIHVzaW5nIEtpbmQgPSBDYWxsRXZlbnRLaW5kOworCitwcml2YXRlOgorICBQcm9ncmFtU3RhdGVSZWYgU3RhdGU7CisgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eDsKKyAgbGx2bTo6UG9pbnRlclVuaW9uPGNvbnN0IEV4cHIgKiwgY29uc3QgRGVjbCAqPiBPcmlnaW47CisKK3Byb3RlY3RlZDoKKyAgLy8gVGhpcyBpcyB1c2VyIGRhdGEgZm9yIHN1YmNsYXNzZXMuCisgIGNvbnN0IHZvaWQgKkRhdGE7CisKKyAgLy8gVGhpcyBpcyB1c2VyIGRhdGEgZm9yIHN1YmNsYXNzZXMuCisgIC8vIFRoaXMgc2hvdWxkIGNvbWUgcmlnaHQgYmVmb3JlIFJlZkNvdW50LCBzbyB0aGF0IHRoZSB0d28gZmllbGRzIGNhbiBiZQorICAvLyBwYWNrZWQgdG9nZXRoZXIgb24gTFA2NCBwbGF0Zm9ybXMuCisgIFNvdXJjZUxvY2F0aW9uIExvY2F0aW9uOworCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIHN0cnVjdCBsbHZtOjpJbnRydXNpdmVSZWZDbnRQdHJJbmZvOworCisgIG11dGFibGUgdW5zaWduZWQgUmVmQ291bnQgPSAwOworCisgIHZvaWQgUmV0YWluKCkgY29uc3QgeyArK1JlZkNvdW50OyB9CisgIHZvaWQgUmVsZWFzZSgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBDYWxsRXZlbnRNYW5hZ2VyOworCisgIENhbGxFdmVudChjb25zdCBFeHByICpFLCBQcm9ncmFtU3RhdGVSZWYgc3RhdGUsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqbGN0eCkKKyAgICAgIDogU3RhdGUoc3RkOjptb3ZlKHN0YXRlKSksIExDdHgobGN0eCksIE9yaWdpbihFKSB7fQorCisgIENhbGxFdmVudChjb25zdCBEZWNsICpELCBQcm9ncmFtU3RhdGVSZWYgc3RhdGUsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqbGN0eCkKKyAgICAgIDogU3RhdGUoc3RkOjptb3ZlKHN0YXRlKSksIExDdHgobGN0eCksIE9yaWdpbihEKSB7fQorCisgIC8vIERPIE5PVCBNQUtFIFBVQkxJQworICBDYWxsRXZlbnQoY29uc3QgQ2FsbEV2ZW50ICZPcmlnaW5hbCkKKyAgICAgIDogU3RhdGUoT3JpZ2luYWwuU3RhdGUpLCBMQ3R4KE9yaWdpbmFsLkxDdHgpLCBPcmlnaW4oT3JpZ2luYWwuT3JpZ2luKSwKKyAgICAgICAgRGF0YShPcmlnaW5hbC5EYXRhKSwgTG9jYXRpb24oT3JpZ2luYWwuTG9jYXRpb24pIHt9CisKKyAgLy8vIENvcGllcyB0aGlzIENhbGxFdmVudCwgd2l0aCB2dGFibGUgaW50YWN0LCBpbnRvIGEgbmV3IGJsb2NrIG9mIG1lbW9yeS4KKyAgdmlydHVhbCB2b2lkIGNsb25lVG8odm9pZCAqRGVzdCkgY29uc3QgPSAwOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSB2YWx1ZSBvZiBhcmJpdHJhcnkgZXhwcmVzc2lvbnMgYXQgdGhpcyBwb2ludCBpbiB0aGUgcGF0aC4KKyAgU1ZhbCBnZXRTVmFsKGNvbnN0IFN0bXQgKlMpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3RhdGUoKS0+Z2V0U1ZhbChTLCBnZXRMb2NhdGlvbkNvbnRleHQoKSk7CisgIH0KKworICB1c2luZyBWYWx1ZUxpc3QgPSBTbWFsbFZlY3RvckltcGw8U1ZhbD47CisKKyAgLy8vIFxicmllZiBVc2VkIHRvIHNwZWNpZnkgbm9uLWFyZ3VtZW50IHJlZ2lvbnMgdGhhdCB3aWxsIGJlIGludmFsaWRhdGVkIGFzIGEKKyAgLy8vIHJlc3VsdCBvZiB0aGlzIGNhbGwuCisgIHZpcnR1YWwgdm9pZCBnZXRFeHRyYUludmFsaWRhdGVkVmFsdWVzKFZhbHVlTGlzdCAmVmFsdWVzLAorICAgICAgICAgICAgICAgICBSZWdpb25BbmRTeW1ib2xJbnZhbGlkYXRpb25UcmFpdHMgKkVUcmFpdHMpIGNvbnN0IHt9CisKK3B1YmxpYzoKKyAgQ2FsbEV2ZW50ICZvcGVyYXRvcj0oY29uc3QgQ2FsbEV2ZW50ICYpID0gZGVsZXRlOworICB2aXJ0dWFsIH5DYWxsRXZlbnQoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBraW5kIG9mIGNhbGwgdGhpcyBpcy4KKyAgdmlydHVhbCBLaW5kIGdldEtpbmQoKSBjb25zdCA9IDA7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgZnVuY3Rpb24gb3IgbWV0aG9kIHRoYXQgd2lsbCBiZQorICAvLy8gY2FsbGVkLiBNYXkgYmUgbnVsbC4KKyAgdmlydHVhbCBjb25zdCBEZWNsICpnZXREZWNsKCkgY29uc3QgeworICAgIHJldHVybiBPcmlnaW4uZHluX2Nhc3Q8Y29uc3QgRGVjbCAqPigpOworICB9CisKKyAgLy8vIFxicmllZiBUaGUgc3RhdGUgaW4gd2hpY2ggdGhlIGNhbGwgaXMgYmVpbmcgZXZhbHVhdGVkLgorICBjb25zdCBQcm9ncmFtU3RhdGVSZWYgJmdldFN0YXRlKCkgY29uc3QgeworICAgIHJldHVybiBTdGF0ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGNhbGwgaXMgYmVpbmcgZXZhbHVhdGVkLgorICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKmdldExvY2F0aW9uQ29udGV4dCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTEN0eDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZnVuY3Rpb24gb3IgbWV0aG9kIHRoYXQgd2lsbCBiZQorICAvLy8gY2FsbGVkLgorICB2aXJ0dWFsIFJ1bnRpbWVEZWZpbml0aW9uIGdldFJ1bnRpbWVEZWZpbml0aW9uKCkgY29uc3QgPSAwOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZXhwcmVzc2lvbiB3aG9zZSB2YWx1ZSB3aWxsIGJlIHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsLgorICAvLy8gTWF5IGJlIG51bGwuCisgIGNvbnN0IEV4cHIgKmdldE9yaWdpbkV4cHIoKSBjb25zdCB7CisgICAgcmV0dXJuIE9yaWdpbi5keW5fY2FzdDxjb25zdCBFeHByICo+KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKGV4cGxpY2l0IGFuZCBpbXBsaWNpdCkuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gdGhlCisgIC8vLyBjYWxsZWUncyBkZWNsYXJhdGlvbiwgYW5kIHRoYXQgaXQgbWF5IGluY2x1ZGUgYXJndW1lbnRzIG5vdCB3cml0dGVuIGluCisgIC8vLyB0aGUgc291cmNlLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldE51bUFyZ3MoKSBjb25zdCA9IDA7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIGNhbGxlZSBpcyBrbm93biB0byBiZSBmcm9tIGEgc3lzdGVtIGhlYWRlci4KKyAgYm9vbCBpc0luU3lzdGVtSGVhZGVyKCkgY29uc3QgeworICAgIGNvbnN0IERlY2wgKkQgPSBnZXREZWNsKCk7CisgICAgaWYgKCFEKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgU291cmNlTG9jYXRpb24gTG9jID0gRC0+Z2V0TG9jYXRpb24oKTsKKyAgICBpZiAoTG9jLmlzVmFsaWQoKSkgeworICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00gPQorICAgICAgICBnZXRTdGF0ZSgpLT5nZXRTdGF0ZU1hbmFnZXIoKS5nZXRDb250ZXh0KCkuZ2V0U291cmNlTWFuYWdlcigpOworICAgICAgcmV0dXJuIFNNLmlzSW5TeXN0ZW1IZWFkZXIoRC0+Z2V0TG9jYXRpb24oKSk7CisgICAgfQorCisgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBpbXBsaWNpdGx5LWRlY2xhcmVkIGdsb2JhbCBvcGVyYXRvciBuZXcvZGVsZXRlLgorICAgIC8vIFRoZXNlIHNob3VsZCBiZSBjb25zaWRlcmVkIHN5c3RlbSBmdW5jdGlvbnMuCisgICAgaWYgKGNvbnN0IGF1dG8gKkZEID0gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPihEKSkKKyAgICAgIHJldHVybiBGRC0+aXNPdmVybG9hZGVkT3BlcmF0b3IoKSAmJiBGRC0+aXNJbXBsaWNpdCgpICYmIEZELT5pc0dsb2JhbCgpOworCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIENhbGxFdmVudCBpcyBhIGNhbGwgdG8gYSBmdW5jdGlvbiB0aGF0IG1hdGNoZXMKKyAgLy8vIHRoZSBDYWxsRGVzY3JpcHRpb24uCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gbWF0Y2ggT2JqLUMgbWV0aG9kCisgIC8vLyBjYWxscy4KKyAgYm9vbCBpc0NhbGxlZChjb25zdCBDYWxsRGVzY3JpcHRpb24gJkNEKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgYSBzb3VyY2UgcmFuZ2UgZm9yIHRoZSBlbnRpcmUgY2FsbCwgc3VpdGFibGUgZm9yCisgIC8vLyBvdXRwdXR0aW5nIGluIGRpYWdub3N0aWNzLgorICB2aXJ0dWFsIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcmlnaW5FeHByKCktPmdldFNvdXJjZVJhbmdlKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gYXJndW1lbnQgYXQgdGhlIHRpbWUgb2YgdGhlIGNhbGwuCisgIHZpcnR1YWwgU1ZhbCBnZXRBcmdTVmFsKHVuc2lnbmVkIEluZGV4KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGV4cHJlc3Npb24gYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYXJndW1lbnQuCisgIC8vLyBNYXkgYmUgbnVsbCBpZiB0aGlzIGV4cHJlc3Npb24gZG9lcyBub3QgYXBwZWFyIGluIHRoZSBzb3VyY2UuCisgIHZpcnR1YWwgY29uc3QgRXhwciAqZ2V0QXJnRXhwcih1bnNpZ25lZCBJbmRleCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgc291cmNlIHJhbmdlIGZvciBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXJndW1lbnQuCisgIC8vLworICAvLy8gTWF5IGJlIGludmFsaWQgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCB3cml0dGVuIGluIHRoZSBzb3VyY2UuCisgIHZpcnR1YWwgU291cmNlUmFuZ2UgZ2V0QXJnU291cmNlUmFuZ2UodW5zaWduZWQgSW5kZXgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgcmVzdWx0IHR5cGUsIGFkanVzdGVkIGZvciByZWZlcmVuY2VzLgorICBRdWFsVHlwZSBnZXRSZXN1bHRUeXBlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGNhbGwuCisgIC8vLworICAvLy8gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgdGhlIENhbGxFdmVudCB3YXMgY3JlYXRlZCB1c2luZyBhIHN0YXRlIGluCisgIC8vLyB3aGljaCB0aGUgcmV0dXJuIHZhbHVlIGhhcyBhbHJlYWR5IGJlZW4gYm91bmQgdG8gdGhlIG9yaWdpbiBleHByZXNzaW9uLgorICBTVmFsIGdldFJldHVyblZhbHVlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgb2YgYW55IG9mIHRoZSBub24tbnVsbCBhcmd1bWVudHMgc2F0aXNmaWVzCisgIC8vLyB0aGUgY29uZGl0aW9uLgorICBib29sIGhhc05vbk51bGxBcmd1bWVudHNXaXRoVHlwZShib29sICgqQ29uZGl0aW9uKShRdWFsVHlwZSkpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGFwcGVhciB0byByZXByZXNlbnQgY2FsbGJhY2tzLgorICBib29sIGhhc05vblplcm9DYWxsYmFja0FyZygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIHZvaWQqLgorICBib29sIGhhc1ZvaWRQb2ludGVyVG9Ob25Db25zdEFyZygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGFyZSBrbm93biB0byBlc2NhcGUgdG8gbG9uZy0KKyAgLy8vIHRlcm0gc3RvcmFnZSwgZXZlbiBpZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBtb2RpZnkgdGhlbS4KKyAgLy8gTk9URTogVGhlIGV4YWN0IHNlbWFudGljcyBvZiB0aGlzIGFyZSBzdGlsbCBiZWluZyBkZWZpbmVkIQorICAvLyBXZSBkb24ndCByZWFsbHkgd2FudCBhIGxpc3Qgb2YgaGFyZGNvZGVkIGV4Y2VwdGlvbnMgaW4gdGhlIGxvbmcgcnVuLAorICAvLyBidXQgd2UgZG9uJ3Qgd2FudCBkdXBsaWNhdGVkIGxpc3RzIG9mIGtub3duIEFQSXMgaW4gdGhlIHNob3J0IHRlcm0gZWl0aGVyLgorICB2aXJ0dWFsIGJvb2wgYXJndW1lbnRzTWF5RXNjYXBlKCkgY29uc3QgeworICAgIHJldHVybiBoYXNOb25aZXJvQ2FsbGJhY2tBcmcoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsZWUgaXMgYW4gZXh0ZXJuYWxseS12aXNpYmxlIGZ1bmN0aW9uIGluIHRoZQorICAvLy8gdG9wLWxldmVsIG5hbWVzcGFjZSwgc3VjaCBhcyBcYyBtYWxsb2MuCisgIC8vLworICAvLy8gWW91IGNhbiB1c2UgdGhpcyBjYWxsIHRvIGRldGVybWluZSB0aGF0IGEgcGFydGljdWxhciBmdW5jdGlvbiByZWFsbHkgaXMKKyAgLy8vIGEgbGlicmFyeSBmdW5jdGlvbiBhbmQgbm90LCBzYXksIGEgQysrIG1lbWJlciBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUuCisgIC8vLworICAvLy8gSWYgYSBuYW1lIGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gbXVzdCBhZGRpdGlvbmFsbHkgbWF0Y2ggdGhlIGdpdmVuCisgIC8vLyBuYW1lLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGRlbGliZXJhdGVseSBleGNsdWRlcyBDKysgbGlicmFyeSBmdW5jdGlvbnMgaW4gdGhlIFxjIHN0ZAorICAvLy8gbmFtZXNwYWNlLCBidXQgd2lsbCBpbmNsdWRlIEMgbGlicmFyeSBmdW5jdGlvbnMgYWNjZXNzZWQgdGhyb3VnaCB0aGUKKyAgLy8vIFxjIHN0ZCBuYW1lc3BhY2UuIFRoaXMgYWxzbyBkb2VzIG5vdCBjaGVjayBpZiB0aGUgZnVuY3Rpb24gaXMgZGVjbGFyZWQKKyAgLy8vIGFzICdleHRlcm4gIkMiJywgb3IgaWYgaXQgdXNlcyBDKysgbmFtZSBtYW5nbGluZy4KKyAgLy8gRklYTUU6IEFkZCBhIGhlbHBlciBmb3IgY2hlY2tpbmcgbmFtZXNwYWNlcy4KKyAgLy8gRklYTUU6IE1vdmUgdGhpcyBkb3duIHRvIEFueUZ1bmN0aW9uQ2FsbCBvbmNlIGNoZWNrZXJzIGhhdmUgbW9yZQorICAvLyBwcmVjaXNlIGNhbGxiYWNrcy4KKyAgYm9vbCBpc0dsb2JhbENGdW5jdGlvbihTdHJpbmdSZWYgU3BlY2lmaWNOYW1lID0gU3RyaW5nUmVmKCkpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY2FsbGVlLCBpZiBpdHMgbmFtZSBpcyBhIHNpbXBsZSBpZGVudGlmaWVyLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgZmFpbCBmb3IgT2JqZWN0aXZlLUMgbWV0aG9kcywgYmxvY2tzLCBhbmQgQysrCisgIC8vLyBvdmVybG9hZGVkIG9wZXJhdG9ycy4gVGhlIGZvcm1lciBpcyBuYW1lZCBieSBhIFNlbGVjdG9yIHJhdGhlciB0aGFuIGEKKyAgLy8vIHNpbXBsZSBpZGVudGlmaWVyLCBhbmQgdGhlIGxhdHRlciB0d28gZG8gbm90IGhhdmUgbmFtZXMuCisgIC8vIEZJWE1FOiBNb3ZlIHRoaXMgZG93biB0byBBbnlGdW5jdGlvbkNhbGwgb25jZSBjaGVja2VycyBoYXZlIG1vcmUKKyAgLy8gcHJlY2lzZSBjYWxsYmFja3MuCisgIGNvbnN0IElkZW50aWZpZXJJbmZvICpnZXRDYWxsZWVJZGVudGlmaWVyKCkgY29uc3QgeworICAgIGNvbnN0IGF1dG8gKk5EID0gZHluX2Nhc3Rfb3JfbnVsbDxOYW1lZERlY2w+KGdldERlY2woKSk7CisgICAgaWYgKCFORCkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBORC0+Z2V0SWRlbnRpZmllcigpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGFuIGFwcHJvcHJpYXRlIFByb2dyYW1Qb2ludCBmb3IgdGhpcyBjYWxsLgorICBQcm9ncmFtUG9pbnQgZ2V0UHJvZ3JhbVBvaW50KGJvb2wgSXNQcmVWaXNpdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2dyYW1Qb2ludFRhZyAqVGFnID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgbmV3IHN0YXRlIHdpdGggYWxsIGFyZ3VtZW50IHJlZ2lvbnMgaW52YWxpZGF0ZWQuCisgIC8vLworICAvLy8gVGhpcyBhY2NlcHRzIGFuIGFsdGVybmF0ZSBzdGF0ZSBpbiBjYXNlIHNvbWUgcHJvY2Vzc2luZyBoYXMgYWxyZWFkeQorICAvLy8gb2NjdXJyZWQuCisgIFByb2dyYW1TdGF0ZVJlZiBpbnZhbGlkYXRlUmVnaW9ucyh1bnNpZ25lZCBCbG9ja0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0YXRlUmVmIE9yaWcgPSBudWxscHRyKSBjb25zdDsKKworICB1c2luZyBGcmFtZUJpbmRpbmdUeSA9IHN0ZDo6cGFpcjxMb2MsIFNWYWw+OworICB1c2luZyBCaW5kaW5nc1R5ID0gU21hbGxWZWN0b3JJbXBsPEZyYW1lQmluZGluZ1R5PjsKKworICAvLy8gUG9wdWxhdGVzIHRoZSBnaXZlbiBTbWFsbFZlY3RvciB3aXRoIHRoZSBiaW5kaW5ncyBpbiB0aGUgY2FsbGVlJ3Mgc3RhY2sKKyAgLy8vIGZyYW1lIGF0IHRoZSBzdGFydCBvZiB0aGlzIGNhbGwuCisgIHZpcnR1YWwgdm9pZCBnZXRJbml0aWFsU3RhY2tGcmFtZUNvbnRlbnRzKGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpDYWxsZWVDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdzVHkgJkJpbmRpbmdzKSBjb25zdCA9IDA7CisKKyAgLy8vIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgQ2FsbEV2ZW50LCBidXQgdXNpbmcgdGhlIGdpdmVuIHN0YXRlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgQ2FsbEV2ZW50UmVmPFQ+IGNsb25lV2l0aFN0YXRlKFByb2dyYW1TdGF0ZVJlZiBOZXdTdGF0ZSkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgQ2FsbEV2ZW50LCBidXQgdXNpbmcgdGhlIGdpdmVuIHN0YXRlLgorICBDYWxsRXZlbnRSZWY8PiBjbG9uZVdpdGhTdGF0ZShQcm9ncmFtU3RhdGVSZWYgTmV3U3RhdGUpIGNvbnN0IHsKKyAgICByZXR1cm4gY2xvbmVXaXRoU3RhdGU8Q2FsbEV2ZW50PihOZXdTdGF0ZSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgc3RhdGVtZW50IGlzIGEgZnVuY3Rpb24gb3IgbWV0aG9kIGNhbGwKKyAgLy8vIG9mIHNvbWUga2luZC4KKyAgc3RhdGljIGJvb2wgaXNDYWxsU3RtdChjb25zdCBTdG10ICpTKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHJlc3VsdCB0eXBlIG9mIGEgZnVuY3Rpb24gb3IgbWV0aG9kIGRlY2xhcmF0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgd2lsbCByZXR1cm4gYSBudWxsIFF1YWxUeXBlIGlmIHRoZSByZXN1bHQgdHlwZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KKyAgc3RhdGljIFF1YWxUeXBlIGdldERlY2xhcmVkUmVzdWx0VHlwZShjb25zdCBEZWNsICpEKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZGVjbCBpcyBrbm93biB0byBiZSB2YXJpYWRpYy4KKyAgLy8vCisgIC8vLyBccCBEIG11c3Qgbm90IGJlIG51bGwuCisgIHN0YXRpYyBib29sIGlzVmFyaWFkaWMoY29uc3QgRGVjbCAqRCk7CisKKyAgLy8gSXRlcmF0b3IgYWNjZXNzIHRvIGZvcm1hbCBwYXJhbWV0ZXJzIGFuZCB0aGVpciB0eXBlcy4KK3ByaXZhdGU6CisgIHN0cnVjdCBHZXRUeXBlRm4geworICAgIFF1YWxUeXBlIG9wZXJhdG9yKCkoUGFybVZhckRlY2wgKlBEKSBjb25zdCB7IHJldHVybiBQRC0+Z2V0VHlwZSgpOyB9CisgIH07CisKK3B1YmxpYzoKKyAgLy8vIFJldHVybiBjYWxsJ3MgZm9ybWFsIHBhcmFtZXRlcnMuCisgIC8vLworICAvLy8gUmVtZW1iZXIgdGhhdCB0aGUgbnVtYmVyIG9mIGZvcm1hbCBwYXJhbWV0ZXJzIG1heSBub3QgbWF0Y2ggdGhlIG51bWJlcgorICAvLy8gb2YgYXJndW1lbnRzIGZvciBhbGwgY2FsbHMuIEhvd2V2ZXIsIHRoZSBmaXJzdCBwYXJhbWV0ZXIgd2lsbCBhbHdheXMKKyAgLy8vIGNvcnJlc3BvbmQgd2l0aCB0aGUgYXJndW1lbnQgdmFsdWUgcmV0dXJuZWQgYnkgXGMgZ2V0QXJnU1ZhbCgwKS4KKyAgdmlydHVhbCBBcnJheVJlZjxQYXJtVmFyRGVjbCAqPiBwYXJhbWV0ZXJzKCkgY29uc3QgPSAwOworCisgIHVzaW5nIHBhcmFtX3R5cGVfaXRlcmF0b3IgPQorICAgICAgbGx2bTo6bWFwcGVkX2l0ZXJhdG9yPEFycmF5UmVmPFBhcm1WYXJEZWNsICo+OjppdGVyYXRvciwgR2V0VHlwZUZuPjsKKworICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciBvdmVyIHRoZSB0eXBlcyBvZiB0aGUgY2FsbCdzIGZvcm1hbCBwYXJhbWV0ZXJzLgorICAvLy8KKyAgLy8vIFRoaXMgdXNlcyB0aGUgY2FsbGVlIGRlY2wgZm91bmQgYnkgZGVmYXVsdCBuYW1lIGxvb2t1cCByYXRoZXIgdGhhbiB0aGUKKyAgLy8vIGRlZmluaXRpb24gYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgcHVibGljIGludGVyZmFjZSwgYW5kIHByb2JhYmx5IGhhcworICAvLy8gbW9yZSBhbm5vdGF0aW9ucy4KKyAgcGFyYW1fdHlwZV9pdGVyYXRvciBwYXJhbV90eXBlX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYXBfaXRlcmF0b3IocGFyYW1ldGVycygpLmJlZ2luKCksIEdldFR5cGVGbigpKTsKKyAgfQorICAvLy8gXHNhIHBhcmFtX3R5cGVfYmVnaW4oKQorICBwYXJhbV90eXBlX2l0ZXJhdG9yIHBhcmFtX3R5cGVfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBsbHZtOjptYXBfaXRlcmF0b3IocGFyYW1ldGVycygpLmVuZCgpLCBHZXRUeXBlRm4oKSk7CisgIH0KKworICAvLyBGb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkKKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPdXQpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIGNhbGwgdG8gYW55IHNvcnQgb2YgZnVuY3Rpb24gdGhhdCBtaWdodCBoYXZlIGEKKy8vLyBGdW5jdGlvbkRlY2wuCitjbGFzcyBBbnlGdW5jdGlvbkNhbGwgOiBwdWJsaWMgQ2FsbEV2ZW50IHsKK3Byb3RlY3RlZDoKKyAgQW55RnVuY3Rpb25DYWxsKGNvbnN0IEV4cHIgKkUsIFByb2dyYW1TdGF0ZVJlZiBTdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCkKKyAgICAgIDogQ2FsbEV2ZW50KEUsIFN0LCBMQ3R4KSB7fQorICBBbnlGdW5jdGlvbkNhbGwoY29uc3QgRGVjbCAqRCwgUHJvZ3JhbVN0YXRlUmVmIFN0LAorICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4KQorICAgICAgOiBDYWxsRXZlbnQoRCwgU3QsIExDdHgpIHt9CisgIEFueUZ1bmN0aW9uQ2FsbChjb25zdCBBbnlGdW5jdGlvbkNhbGwgJk90aGVyKSA9IGRlZmF1bHQ7CisKK3B1YmxpYzoKKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMsIGJ1dCB0aGV5IG11c3QgcmV0dXJuCisgIC8vIGEgRnVuY3Rpb25EZWNsLgorICBjb25zdCBGdW5jdGlvbkRlY2wgKmdldERlY2woKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGNhc3Q8RnVuY3Rpb25EZWNsPihDYWxsRXZlbnQ6OmdldERlY2woKSk7CisgIH0KKworICBSdW50aW1lRGVmaW5pdGlvbiBnZXRSdW50aW1lRGVmaW5pdGlvbigpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgYXJndW1lbnRzTWF5RXNjYXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZXRJbml0aWFsU3RhY2tGcmFtZUNvbnRlbnRzKGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpDYWxsZWVDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nc1R5ICZCaW5kaW5ncykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgQXJyYXlSZWY8UGFybVZhckRlY2wgKj4gcGFyYW1ldGVycygpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ2FsbEV2ZW50ICpDQSkgeworICAgIHJldHVybiBDQS0+Z2V0S2luZCgpID49IENFX0JFR19GVU5DVElPTl9DQUxMUyAmJgorICAgICAgICAgICBDQS0+Z2V0S2luZCgpIDw9IENFX0VORF9GVU5DVElPTl9DQUxMUzsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgQyBmdW5jdGlvbiBvciBzdGF0aWMgQysrIG1lbWJlciBmdW5jdGlvbiBjYWxsLgorLy8vCisvLy8gRXhhbXBsZTogXGMgZnVuKCkKK2NsYXNzIFNpbXBsZUZ1bmN0aW9uQ2FsbCA6IHB1YmxpYyBBbnlGdW5jdGlvbkNhbGwgeworICBmcmllbmQgY2xhc3MgQ2FsbEV2ZW50TWFuYWdlcjsKKworcHJvdGVjdGVkOgorICBTaW1wbGVGdW5jdGlvbkNhbGwoY29uc3QgQ2FsbEV4cHIgKkNFLCBQcm9ncmFtU3RhdGVSZWYgU3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgpCisgICAgICA6IEFueUZ1bmN0aW9uQ2FsbChDRSwgU3QsIExDdHgpIHt9CisgIFNpbXBsZUZ1bmN0aW9uQ2FsbChjb25zdCBTaW1wbGVGdW5jdGlvbkNhbGwgJk90aGVyKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBjbG9uZVRvKHZvaWQgKkRlc3QpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBuZXcgKERlc3QpIFNpbXBsZUZ1bmN0aW9uQ2FsbCgqdGhpcyk7CisgIH0KKworcHVibGljOgorICB2aXJ0dWFsIGNvbnN0IENhbGxFeHByICpnZXRPcmlnaW5FeHByKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PENhbGxFeHByPihBbnlGdW5jdGlvbkNhbGw6OmdldE9yaWdpbkV4cHIoKSk7CisgIH0KKworICBjb25zdCBGdW5jdGlvbkRlY2wgKmdldERlY2woKSBjb25zdCBvdmVycmlkZTsKKworICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZ2V0T3JpZ2luRXhwcigpLT5nZXROdW1BcmdzKCk7IH0KKworICBjb25zdCBFeHByICpnZXRBcmdFeHByKHVuc2lnbmVkIEluZGV4KSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGdldE9yaWdpbkV4cHIoKS0+Z2V0QXJnKEluZGV4KTsKKyAgfQorCisgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIENFX0Z1bmN0aW9uOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDYWxsRXZlbnQgKkNBKSB7CisgICAgcmV0dXJuIENBLT5nZXRLaW5kKCkgPT0gQ0VfRnVuY3Rpb247CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIGNhbGwgdG8gYSBibG9jay4KKy8vLworLy8vIEV4YW1wbGU6IDx0dD5eeyAvKiAuLi4gKi8gfSgpPC90dD4KK2NsYXNzIEJsb2NrQ2FsbCA6IHB1YmxpYyBDYWxsRXZlbnQgeworICBmcmllbmQgY2xhc3MgQ2FsbEV2ZW50TWFuYWdlcjsKKworcHJvdGVjdGVkOgorICBCbG9ja0NhbGwoY29uc3QgQ2FsbEV4cHIgKkNFLCBQcm9ncmFtU3RhdGVSZWYgU3QsCisgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgpCisgICAgICA6IENhbGxFdmVudChDRSwgU3QsIExDdHgpIHt9CisgIEJsb2NrQ2FsbChjb25zdCBCbG9ja0NhbGwgJk90aGVyKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBjbG9uZVRvKHZvaWQgKkRlc3QpIGNvbnN0IG92ZXJyaWRlIHsgbmV3IChEZXN0KSBCbG9ja0NhbGwoKnRoaXMpOyB9CisKKyAgdm9pZCBnZXRFeHRyYUludmFsaWRhdGVkVmFsdWVzKFZhbHVlTGlzdCAmVmFsdWVzLAorICAgICAgICAgUmVnaW9uQW5kU3ltYm9sSW52YWxpZGF0aW9uVHJhaXRzICpFVHJhaXRzKSBjb25zdCBvdmVycmlkZTsKKworcHVibGljOgorICB2aXJ0dWFsIGNvbnN0IENhbGxFeHByICpnZXRPcmlnaW5FeHByKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PENhbGxFeHByPihDYWxsRXZlbnQ6OmdldE9yaWdpbkV4cHIoKSk7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZ2V0T3JpZ2luRXhwcigpLT5nZXROdW1BcmdzKCk7IH0KKworICBjb25zdCBFeHByICpnZXRBcmdFeHByKHVuc2lnbmVkIEluZGV4KSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGdldE9yaWdpbkV4cHIoKS0+Z2V0QXJnKEluZGV4KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgcmVnaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlIG9mIHRoZSBibG9jay4KKyAgLy8vCisgIC8vLyBUaGlzIG1heSBiZSBOVUxMIGlmIHRoZSBibG9jaydzIG9yaWdpbiBpcyB1bmtub3duLgorICBjb25zdCBCbG9ja0RhdGFSZWdpb24gKmdldEJsb2NrUmVnaW9uKCkgY29uc3Q7CisKKyAgY29uc3QgQmxvY2tEZWNsICpnZXREZWNsKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGNvbnN0IEJsb2NrRGF0YVJlZ2lvbiAqQlIgPSBnZXRCbG9ja1JlZ2lvbigpOworICAgIGlmICghQlIpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gQlItPmdldERlY2woKTsKKyAgfQorCisgIGJvb2wgaXNDb252ZXJzaW9uRnJvbUxhbWJkYSgpIGNvbnN0IHsKKyAgICBjb25zdCBCbG9ja0RlY2wgKkJEID0gZ2V0RGVjbCgpOworICAgIGlmICghQkQpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gQkQtPmlzQ29udmVyc2lvbkZyb21MYW1iZGEoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRm9yIGEgYmxvY2sgY29udmVydGVkIGZyb20gYSBDKysgbGFtYmRhLCByZXR1cm5zIHRoZSBibG9jaworICAvLy8gVmFyUmVnaW9uIGZvciB0aGUgdmFyaWFibGUgaG9sZGluZyB0aGUgY2FwdHVyZWQgQysrIGxhbWJkYSByZWNvcmQuCisgIGNvbnN0IFZhclJlZ2lvbiAqZ2V0UmVnaW9uU3RvcmluZ0NhcHR1cmVkTGFtYmRhKCkgY29uc3QgeworICAgIGFzc2VydChpc0NvbnZlcnNpb25Gcm9tTGFtYmRhKCkpOworICAgIGNvbnN0IEJsb2NrRGF0YVJlZ2lvbiAqQlIgPSBnZXRCbG9ja1JlZ2lvbigpOworICAgIGFzc2VydChCUiAmJiAiQmxvY2sgY29udmVydGVkIGZyb20gbGFtYmRhIG11c3QgaGF2ZSBhIGJsb2NrIHJlZ2lvbiIpOworCisgICAgYXV0byBJID0gQlItPnJlZmVyZW5jZWRfdmFyc19iZWdpbigpOworICAgIGFzc2VydChJICE9IEJSLT5yZWZlcmVuY2VkX3ZhcnNfZW5kKCkpOworCisgICAgcmV0dXJuIEkuZ2V0Q2FwdHVyZWRSZWdpb24oKTsKKyAgfQorCisgIFJ1bnRpbWVEZWZpbml0aW9uIGdldFJ1bnRpbWVEZWZpbml0aW9uKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmICghaXNDb252ZXJzaW9uRnJvbUxhbWJkYSgpKQorICAgICAgcmV0dXJuIFJ1bnRpbWVEZWZpbml0aW9uKGdldERlY2woKSk7CisKKyAgICAvLyBDbGFuZyBjb252ZXJ0cyBsYW1iZGFzIHRvIGJsb2NrcyB3aXRoIGFuIGltcGxpY2l0IHVzZXItZGVmaW5lZAorICAgIC8vIGNvbnZlcnNpb24gb3BlcmF0b3IgbWV0aG9kIG9uIHRoZSBsYW1iZGEgcmVjb3JkIHRoYXQgbG9va3MgKHJvdWdobHkpCisgICAgLy8gbGlrZToKKyAgICAvLworICAgIC8vIHR5cGVkZWYgUiheYmxvY2tfdHlwZSkoUDEsIFAyLCAuLi4pOworICAgIC8vIG9wZXJhdG9yIGJsb2NrX3R5cGUoKSBjb25zdCB7CisgICAgLy8gICBhdXRvIExhbWJkYSA9ICp0aGlzOworICAgIC8vICAgcmV0dXJuIF4oUDEgcDEsIFAyIHAyLCAuLi4peworICAgIC8vICAgICAvKiByZXR1cm4gTGFtYmRhKHAxLCBwMiwgLi4uKTsgKi8KKyAgICAvLyAgIH07CisgICAgLy8gfQorICAgIC8vCisgICAgLy8gSGVyZSBSIGlzIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbGFtYmRhIGFuZCBQMSwgUDIsIC4uLiBhcmUKKyAgICAvLyBpdHMgcGFyYW1ldGVyIHR5cGVzLiAnTGFtYmRhJyBpcyBhIGZha2UgVmFyRGVjbCBjYXB0dXJlZCBieSB0aGUgYmxvY2sKKyAgICAvLyB0aGF0IGlzIGluaXRpYWxpemVkIHRvIGEgY29weSBvZiB0aGUgbGFtYmRhLgorICAgIC8vCisgICAgLy8gU2VtYSBsZWF2ZXMgdGhlIGJvZHkgb2YgYSBsYW1iZGEtY29udmVydGVkIGJsb2NrIGVtcHR5IChpdCBpcworICAgIC8vIHByb2R1Y2VkIGJ5IENvZGVHZW4pLCBzbyB3ZSBjYW4ndCBhbmFseXplIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB3ZSBza2lwCisgICAgLy8gdGhlIGJsb2NrIGJvZHkgYW5kIGFuYWx5emUgdGhlIG9wZXJhdG9yKCkgbWV0aG9kIG9uIHRoZSBjYXB0dXJlZCBsYW1iZGEuCisgICAgY29uc3QgVmFyRGVjbCAqTGFtYmRhVkQgPSBnZXRSZWdpb25TdG9yaW5nQ2FwdHVyZWRMYW1iZGEoKS0+Z2V0RGVjbCgpOworICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkxhbWJkYURlY2wgPSBMYW1iZGFWRC0+Z2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKKyAgICBDWFhNZXRob2REZWNsKiBMYW1iZGFDYWxsT3BlcmF0b3IgPSBMYW1iZGFEZWNsLT5nZXRMYW1iZGFDYWxsT3BlcmF0b3IoKTsKKworICAgIHJldHVybiBSdW50aW1lRGVmaW5pdGlvbihMYW1iZGFDYWxsT3BlcmF0b3IpOworICB9CisKKyAgYm9vbCBhcmd1bWVudHNNYXlFc2NhcGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2b2lkIGdldEluaXRpYWxTdGFja0ZyYW1lQ29udGVudHMoY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKkNhbGxlZUN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdzVHkgJkJpbmRpbmdzKSBjb25zdCBvdmVycmlkZTsKKworICBBcnJheVJlZjxQYXJtVmFyRGVjbCo+IHBhcmFtZXRlcnMoKSBjb25zdCBvdmVycmlkZTsKKworICBLaW5kIGdldEtpbmQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBDRV9CbG9jazsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ2FsbEV2ZW50ICpDQSkgeworICAgIHJldHVybiBDQS0+Z2V0S2luZCgpID09IENFX0Jsb2NrOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBub24tc3RhdGljIEMrKyBtZW1iZXIgZnVuY3Rpb24gY2FsbCwgbm8gbWF0dGVyIGhvdworLy8vIGl0IGlzIHdyaXR0ZW4uCitjbGFzcyBDWFhJbnN0YW5jZUNhbGwgOiBwdWJsaWMgQW55RnVuY3Rpb25DYWxsIHsKK3Byb3RlY3RlZDoKKyAgQ1hYSW5zdGFuY2VDYWxsKGNvbnN0IENhbGxFeHByICpDRSwgUHJvZ3JhbVN0YXRlUmVmIFN0LAorICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4KQorICAgICAgOiBBbnlGdW5jdGlvbkNhbGwoQ0UsIFN0LCBMQ3R4KSB7fQorICBDWFhJbnN0YW5jZUNhbGwoY29uc3QgRnVuY3Rpb25EZWNsICpELCBQcm9ncmFtU3RhdGVSZWYgU3QsCisgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgpCisgICAgICA6IEFueUZ1bmN0aW9uQ2FsbChELCBTdCwgTEN0eCkge30KKyAgQ1hYSW5zdGFuY2VDYWxsKGNvbnN0IENYWEluc3RhbmNlQ2FsbCAmT3RoZXIpID0gZGVmYXVsdDsKKworICB2b2lkIGdldEV4dHJhSW52YWxpZGF0ZWRWYWx1ZXMoVmFsdWVMaXN0ICZWYWx1ZXMsIAorICAgICAgICAgUmVnaW9uQW5kU3ltYm9sSW52YWxpZGF0aW9uVHJhaXRzICpFVHJhaXRzKSBjb25zdCBvdmVycmlkZTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBpbXBsaWNpdCAndGhpcycgb2JqZWN0LgorICB2aXJ0dWFsIGNvbnN0IEV4cHIgKmdldENYWFRoaXNFeHByKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGltcGxpY2l0ICd0aGlzJyBvYmplY3QuCisgIHZpcnR1YWwgU1ZhbCBnZXRDWFhUaGlzVmFsKCkgY29uc3Q7CisKKyAgY29uc3QgRnVuY3Rpb25EZWNsICpnZXREZWNsKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgUnVudGltZURlZmluaXRpb24gZ2V0UnVudGltZURlZmluaXRpb24oKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGdldEluaXRpYWxTdGFja0ZyYW1lQ29udGVudHMoY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKkNhbGxlZUN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdzVHkgJkJpbmRpbmdzKSBjb25zdCBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENhbGxFdmVudCAqQ0EpIHsKKyAgICByZXR1cm4gQ0EtPmdldEtpbmQoKSA+PSBDRV9CRUdfQ1hYX0lOU1RBTkNFX0NBTExTICYmCisgICAgICAgICAgIENBLT5nZXRLaW5kKCkgPD0gQ0VfRU5EX0NYWF9JTlNUQU5DRV9DQUxMUzsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgbm9uLXN0YXRpYyBDKysgbWVtYmVyIGZ1bmN0aW9uIGNhbGwuCisvLy8KKy8vLyBFeGFtcGxlOiBcYyBvYmouZnVuKCkKK2NsYXNzIENYWE1lbWJlckNhbGwgOiBwdWJsaWMgQ1hYSW5zdGFuY2VDYWxsIHsKKyAgZnJpZW5kIGNsYXNzIENhbGxFdmVudE1hbmFnZXI7CisKK3Byb3RlY3RlZDoKKyAgQ1hYTWVtYmVyQ2FsbChjb25zdCBDWFhNZW1iZXJDYWxsRXhwciAqQ0UsIFByb2dyYW1TdGF0ZVJlZiBTdCwKKyAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgpCisgICAgICA6IENYWEluc3RhbmNlQ2FsbChDRSwgU3QsIExDdHgpIHt9CisgIENYWE1lbWJlckNhbGwoY29uc3QgQ1hYTWVtYmVyQ2FsbCAmT3RoZXIpID0gZGVmYXVsdDsKKworICB2b2lkIGNsb25lVG8odm9pZCAqRGVzdCkgY29uc3Qgb3ZlcnJpZGUgeyBuZXcgKERlc3QpIENYWE1lbWJlckNhbGwoKnRoaXMpOyB9CisKK3B1YmxpYzoKKyAgdmlydHVhbCBjb25zdCBDWFhNZW1iZXJDYWxsRXhwciAqZ2V0T3JpZ2luRXhwcigpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxDWFhNZW1iZXJDYWxsRXhwcj4oQ1hYSW5zdGFuY2VDYWxsOjpnZXRPcmlnaW5FeHByKCkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtQXJncygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBpZiAoY29uc3QgQ2FsbEV4cHIgKkNFID0gZ2V0T3JpZ2luRXhwcigpKQorICAgICAgcmV0dXJuIENFLT5nZXROdW1BcmdzKCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBjb25zdCBFeHByICpnZXRBcmdFeHByKHVuc2lnbmVkIEluZGV4KSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGdldE9yaWdpbkV4cHIoKS0+Z2V0QXJnKEluZGV4KTsKKyAgfQorCisgIGNvbnN0IEV4cHIgKmdldENYWFRoaXNFeHByKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgUnVudGltZURlZmluaXRpb24gZ2V0UnVudGltZURlZmluaXRpb24oKSBjb25zdCBvdmVycmlkZTsKKworICBLaW5kIGdldEtpbmQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBDRV9DWFhNZW1iZXI7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENhbGxFdmVudCAqQ0EpIHsKKyAgICByZXR1cm4gQ0EtPmdldEtpbmQoKSA9PSBDRV9DWFhNZW1iZXI7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIEMrKyBvdmVybG9hZGVkIG9wZXJhdG9yIGNhbGwgd2hlcmUgdGhlIG9wZXJhdG9yIGlzCisvLy8gaW1wbGVtZW50ZWQgYXMgYSBub24tc3RhdGljIG1lbWJlciBmdW5jdGlvbi4KKy8vLworLy8vIEV4YW1wbGU6IDx0dD5pdGVyICsgMTwvdHQ+CitjbGFzcyBDWFhNZW1iZXJPcGVyYXRvckNhbGwgOiBwdWJsaWMgQ1hYSW5zdGFuY2VDYWxsIHsKKyAgZnJpZW5kIGNsYXNzIENhbGxFdmVudE1hbmFnZXI7CisKK3Byb3RlY3RlZDoKKyAgQ1hYTWVtYmVyT3BlcmF0b3JDYWxsKGNvbnN0IENYWE9wZXJhdG9yQ2FsbEV4cHIgKkNFLCBQcm9ncmFtU3RhdGVSZWYgU3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgpCisgICAgICA6IENYWEluc3RhbmNlQ2FsbChDRSwgU3QsIExDdHgpIHt9CisgIENYWE1lbWJlck9wZXJhdG9yQ2FsbChjb25zdCBDWFhNZW1iZXJPcGVyYXRvckNhbGwgJk90aGVyKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBjbG9uZVRvKHZvaWQgKkRlc3QpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBuZXcgKERlc3QpIENYWE1lbWJlck9wZXJhdG9yQ2FsbCgqdGhpcyk7CisgIH0KKworcHVibGljOgorICB2aXJ0dWFsIGNvbnN0IENYWE9wZXJhdG9yQ2FsbEV4cHIgKmdldE9yaWdpbkV4cHIoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8Q1hYT3BlcmF0b3JDYWxsRXhwcj4oQ1hYSW5zdGFuY2VDYWxsOjpnZXRPcmlnaW5FeHByKCkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtQXJncygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0T3JpZ2luRXhwcigpLT5nZXROdW1BcmdzKCkgLSAxOworICB9CisKKyAgY29uc3QgRXhwciAqZ2V0QXJnRXhwcih1bnNpZ25lZCBJbmRleCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRPcmlnaW5FeHByKCktPmdldEFyZyhJbmRleCArIDEpOworICB9CisKKyAgY29uc3QgRXhwciAqZ2V0Q1hYVGhpc0V4cHIoKSBjb25zdCBvdmVycmlkZTsKKworICBLaW5kIGdldEtpbmQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBDRV9DWFhNZW1iZXJPcGVyYXRvcjsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ2FsbEV2ZW50ICpDQSkgeworICAgIHJldHVybiBDQS0+Z2V0S2luZCgpID09IENFX0NYWE1lbWJlck9wZXJhdG9yOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYW4gaW1wbGljaXQgY2FsbCB0byBhIEMrKyBkZXN0cnVjdG9yLgorLy8vCisvLy8gVGhpcyBjYW4gb2NjdXIgYXQgdGhlIGVuZCBvZiBhIHNjb3BlIChmb3IgYXV0b21hdGljIG9iamVjdHMpLCBhdCB0aGUgZW5kCisvLy8gb2YgYSBmdWxsLWV4cHJlc3Npb24gKGZvciB0ZW1wb3JhcmllcyksIG9yIGFzIHBhcnQgb2YgYSBkZWxldGUuCitjbGFzcyBDWFhEZXN0cnVjdG9yQ2FsbCA6IHB1YmxpYyBDWFhJbnN0YW5jZUNhbGwgeworICBmcmllbmQgY2xhc3MgQ2FsbEV2ZW50TWFuYWdlcjsKKworcHJvdGVjdGVkOgorICB1c2luZyBEdG9yRGF0YVR5ID0gbGx2bTo6UG9pbnRlckludFBhaXI8Y29uc3QgTWVtUmVnaW9uICosIDEsIGJvb2w+OworCisgIC8vLyBDcmVhdGVzIGFuIGltcGxpY2l0IGRlc3RydWN0b3IuCisgIC8vLworICAvLy8gXHBhcmFtIEREIFRoZSBkZXN0cnVjdG9yIHRoYXQgd2lsbCBiZSBjYWxsZWQuCisgIC8vLyBccGFyYW0gVHJpZ2dlciBUaGUgc3RhdGVtZW50IHdob3NlIGNvbXBsZXRpb24gY2F1c2VzIHRoaXMgZGVzdHJ1Y3RvciBjYWxsLgorICAvLy8gXHBhcmFtIFRhcmdldCBUaGUgb2JqZWN0IHJlZ2lvbiB0byBiZSBkZXN0cnVjdGVkLgorICAvLy8gXHBhcmFtIFN0IFRoZSBwYXRoLXNlbnNpdGl2ZSBzdGF0ZSBhdCB0aGlzIHBvaW50IGluIHRoZSBwcm9ncmFtLgorICAvLy8gXHBhcmFtIExDdHggVGhlIGxvY2F0aW9uIGNvbnRleHQgYXQgdGhpcyBwb2ludCBpbiB0aGUgcHJvZ3JhbS4KKyAgQ1hYRGVzdHJ1Y3RvckNhbGwoY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkRELCBjb25zdCBTdG10ICpUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1SZWdpb24gKlRhcmdldCwgYm9vbCBJc0Jhc2VEZXN0cnVjdG9yLAorICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RhdGVSZWYgU3QsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCkKKyAgICAgIDogQ1hYSW5zdGFuY2VDYWxsKERELCBTdCwgTEN0eCkgeworICAgIERhdGEgPSBEdG9yRGF0YVR5KFRhcmdldCwgSXNCYXNlRGVzdHJ1Y3RvcikuZ2V0T3BhcXVlVmFsdWUoKTsKKyAgICBMb2NhdGlvbiA9IFRyaWdnZXItPmdldExvY0VuZCgpOworICB9CisKKyAgQ1hYRGVzdHJ1Y3RvckNhbGwoY29uc3QgQ1hYRGVzdHJ1Y3RvckNhbGwgJk90aGVyKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBjbG9uZVRvKHZvaWQgKkRlc3QpIGNvbnN0IG92ZXJyaWRlIHtuZXcgKERlc3QpIENYWERlc3RydWN0b3JDYWxsKCp0aGlzKTt9CisKK3B1YmxpYzoKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBMb2NhdGlvbjsgfQorICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorCisgIFJ1bnRpbWVEZWZpbml0aW9uIGdldFJ1bnRpbWVEZWZpbml0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgaW1wbGljaXQgJ3RoaXMnIG9iamVjdC4KKyAgU1ZhbCBnZXRDWFhUaGlzVmFsKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgY2FsbCB0byBhIGJhc2UgY2xhc3MgZGVzdHJ1Y3Rvci4KKyAgYm9vbCBpc0Jhc2VEZXN0cnVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBEdG9yRGF0YVR5OjpnZXRGcm9tT3BhcXVlVmFsdWUoRGF0YSkuZ2V0SW50KCk7CisgIH0KKworICBLaW5kIGdldEtpbmQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBDRV9DWFhEZXN0cnVjdG9yOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDYWxsRXZlbnQgKkNBKSB7CisgICAgcmV0dXJuIENBLT5nZXRLaW5kKCkgPT0gQ0VfQ1hYRGVzdHJ1Y3RvcjsKKyAgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgY2FsbCB0byBhIEMrKyBjb25zdHJ1Y3Rvci4KKy8vLworLy8vIEV4YW1wbGU6IFxjIFQoMSkKK2NsYXNzIENYWENvbnN0cnVjdG9yQ2FsbCA6IHB1YmxpYyBBbnlGdW5jdGlvbkNhbGwgeworICBmcmllbmQgY2xhc3MgQ2FsbEV2ZW50TWFuYWdlcjsKKworcHJvdGVjdGVkOgorICAvLy8gQ3JlYXRlcyBhIGNvbnN0cnVjdG9yIGNhbGwuCisgIC8vLworICAvLy8gXHBhcmFtIENFIFRoZSBjb25zdHJ1Y3RvciBleHByZXNzaW9uIGFzIHdyaXR0ZW4gaW4gdGhlIHNvdXJjZS4KKyAgLy8vIFxwYXJhbSBUYXJnZXQgVGhlIHJlZ2lvbiB3aGVyZSB0aGUgb2JqZWN0IHNob3VsZCBiZSBjb25zdHJ1Y3RlZC4gSWYgTlVMTCwKKyAgLy8vICAgICAgICAgICAgICAgYSBuZXcgc3ltYm9saWMgcmVnaW9uIHdpbGwgYmUgdXNlZC4KKyAgLy8vIFxwYXJhbSBTdCBUaGUgcGF0aC1zZW5zaXRpdmUgc3RhdGUgYXQgdGhpcyBwb2ludCBpbiB0aGUgcHJvZ3JhbS4KKyAgLy8vIFxwYXJhbSBMQ3R4IFRoZSBsb2NhdGlvbiBjb250ZXh0IGF0IHRoaXMgcG9pbnQgaW4gdGhlIHByb2dyYW0uCisgIENYWENvbnN0cnVjdG9yQ2FsbChjb25zdCBDWFhDb25zdHJ1Y3RFeHByICpDRSwgY29uc3QgTWVtUmVnaW9uICpUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RhdGVSZWYgU3QsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCkKKyAgICAgIDogQW55RnVuY3Rpb25DYWxsKENFLCBTdCwgTEN0eCkgeworICAgIERhdGEgPSBUYXJnZXQ7CisgIH0KKworICBDWFhDb25zdHJ1Y3RvckNhbGwoY29uc3QgQ1hYQ29uc3RydWN0b3JDYWxsICZPdGhlcikgPSBkZWZhdWx0OworCisgIHZvaWQgY2xvbmVUbyh2b2lkICpEZXN0KSBjb25zdCBvdmVycmlkZSB7IG5ldyAoRGVzdCkgQ1hYQ29uc3RydWN0b3JDYWxsKCp0aGlzKTsgfQorCisgIHZvaWQgZ2V0RXh0cmFJbnZhbGlkYXRlZFZhbHVlcyhWYWx1ZUxpc3QgJlZhbHVlcywKKyAgICAgICAgIFJlZ2lvbkFuZFN5bWJvbEludmFsaWRhdGlvblRyYWl0cyAqRVRyYWl0cykgY29uc3Qgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgdmlydHVhbCBjb25zdCBDWFhDb25zdHJ1Y3RFeHByICpnZXRPcmlnaW5FeHByKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PENYWENvbnN0cnVjdEV4cHI+KEFueUZ1bmN0aW9uQ2FsbDo6Z2V0T3JpZ2luRXhwcigpKTsKKyAgfQorCisgIGNvbnN0IENYWENvbnN0cnVjdG9yRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0T3JpZ2luRXhwcigpLT5nZXRDb25zdHJ1Y3RvcigpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtQXJncygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGdldE9yaWdpbkV4cHIoKS0+Z2V0TnVtQXJncygpOyB9CisKKyAgY29uc3QgRXhwciAqZ2V0QXJnRXhwcih1bnNpZ25lZCBJbmRleCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRPcmlnaW5FeHByKCktPmdldEFyZyhJbmRleCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBpbXBsaWNpdCAndGhpcycgb2JqZWN0LgorICBTVmFsIGdldENYWFRoaXNWYWwoKSBjb25zdDsKKworICB2b2lkIGdldEluaXRpYWxTdGFja0ZyYW1lQ29udGVudHMoY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKkNhbGxlZUN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdzVHkgJkJpbmRpbmdzKSBjb25zdCBvdmVycmlkZTsKKworICBLaW5kIGdldEtpbmQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBDRV9DWFhDb25zdHJ1Y3RvcjsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ2FsbEV2ZW50ICpDQSkgeworICAgIHJldHVybiBDQS0+Z2V0S2luZCgpID09IENFX0NYWENvbnN0cnVjdG9yOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGNhbGwgaW4gYSBDKysgbmV3LWV4cHJlc3Npb24uCisvLy8KKy8vLyBUaGlzIGlzIGEgY2FsbCB0byAib3BlcmF0b3IgbmV3Ii4KK2NsYXNzIENYWEFsbG9jYXRvckNhbGwgOiBwdWJsaWMgQW55RnVuY3Rpb25DYWxsIHsKKyAgZnJpZW5kIGNsYXNzIENhbGxFdmVudE1hbmFnZXI7CisKK3Byb3RlY3RlZDoKKyAgQ1hYQWxsb2NhdG9yQ2FsbChjb25zdCBDWFhOZXdFeHByICpFLCBQcm9ncmFtU3RhdGVSZWYgU3QsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4KQorICAgICAgOiBBbnlGdW5jdGlvbkNhbGwoRSwgU3QsIExDdHgpIHt9CisgIENYWEFsbG9jYXRvckNhbGwoY29uc3QgQ1hYQWxsb2NhdG9yQ2FsbCAmT3RoZXIpID0gZGVmYXVsdDsKKworICB2b2lkIGNsb25lVG8odm9pZCAqRGVzdCkgY29uc3Qgb3ZlcnJpZGUgeyBuZXcgKERlc3QpIENYWEFsbG9jYXRvckNhbGwoKnRoaXMpOyB9CisKK3B1YmxpYzoKKyAgdmlydHVhbCBjb25zdCBDWFhOZXdFeHByICpnZXRPcmlnaW5FeHByKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PENYWE5ld0V4cHI+KEFueUZ1bmN0aW9uQ2FsbDo6Z2V0T3JpZ2luRXhwcigpKTsKKyAgfQorCisgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0T3JpZ2luRXhwcigpLT5nZXRPcGVyYXRvck5ldygpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtQXJncygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0T3JpZ2luRXhwcigpLT5nZXROdW1QbGFjZW1lbnRBcmdzKCkgKyAxOworICB9CisKKyAgY29uc3QgRXhwciAqZ2V0QXJnRXhwcih1bnNpZ25lZCBJbmRleCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBvZiBhbiBhbGxvY2F0b3IgY2FsbCBpcyB0aGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGlvbi4KKyAgICBpZiAoSW5kZXggPT0gMCkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBnZXRPcmlnaW5FeHByKCktPmdldFBsYWNlbWVudEFyZyhJbmRleCAtIDEpOworICB9CisKKyAgS2luZCBnZXRLaW5kKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gQ0VfQ1hYQWxsb2NhdG9yOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDYWxsRXZlbnQgKkNFKSB7CisgICAgcmV0dXJuIENFLT5nZXRLaW5kKCkgPT0gQ0VfQ1hYQWxsb2NhdG9yOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgdGhlIHdheXMgYW4gT2JqZWN0aXZlLUMgbWVzc2FnZSBzZW5kIGNhbiBvY2N1ci4KKy8vCisvLyBOb3RlIHRvIG1haW50YWluZXJzOiBPQ01fTWVzc2FnZSBzaG91bGQgYWx3YXlzIGJlIGxhc3QsIHNpbmNlIGl0IGRvZXMgbm90CisvLyBuZWVkIHRvIGZpdCBpbiB0aGUgRGF0YSBmaWVsZCdzIGxvdyBiaXRzLgorZW51bSBPYmpDTWVzc2FnZUtpbmQgeworICBPQ01fUHJvcGVydHlBY2Nlc3MsCisgIE9DTV9TdWJzY3JpcHQsCisgIE9DTV9NZXNzYWdlCit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYW55IGV4cHJlc3Npb24gdGhhdCBjYWxscyBhbiBPYmplY3RpdmUtQyBtZXRob2QuCisvLy8KKy8vLyBUaGlzIGluY2x1ZGVzIGFsbCBvZiB0aGUga2luZHMgbGlzdGVkIGluIE9iakNNZXNzYWdlS2luZC4KK2NsYXNzIE9iakNNZXRob2RDYWxsIDogcHVibGljIENhbGxFdmVudCB7CisgIGZyaWVuZCBjbGFzcyBDYWxsRXZlbnRNYW5hZ2VyOworCisgIGNvbnN0IFBzZXVkb09iamVjdEV4cHIgKmdldENvbnRhaW5pbmdQc2V1ZG9PYmplY3RFeHByKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgT2JqQ01ldGhvZENhbGwoY29uc3QgT2JqQ01lc3NhZ2VFeHByICpNc2csIFByb2dyYW1TdGF0ZVJlZiBTdCwKKyAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4KQorICAgICAgOiBDYWxsRXZlbnQoTXNnLCBTdCwgTEN0eCkgeworICAgIERhdGEgPSBudWxscHRyOworICB9CisKKyAgT2JqQ01ldGhvZENhbGwoY29uc3QgT2JqQ01ldGhvZENhbGwgJk90aGVyKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBjbG9uZVRvKHZvaWQgKkRlc3QpIGNvbnN0IG92ZXJyaWRlIHsgbmV3IChEZXN0KSBPYmpDTWV0aG9kQ2FsbCgqdGhpcyk7IH0KKworICB2b2lkIGdldEV4dHJhSW52YWxpZGF0ZWRWYWx1ZXMoVmFsdWVMaXN0ICZWYWx1ZXMsCisgICAgICAgICBSZWdpb25BbmRTeW1ib2xJbnZhbGlkYXRpb25UcmFpdHMgKkVUcmFpdHMpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vLyBDaGVjayBpZiB0aGUgc2VsZWN0b3IgbWF5IGhhdmUgbXVsdGlwbGUgZGVmaW5pdGlvbnMgKG1heSBoYXZlIG92ZXJyaWRlcykuCisgIHZpcnR1YWwgYm9vbCBjYW5CZU92ZXJyaWRlbkluU3ViY2xhc3MoT2JqQ0ludGVyZmFjZURlY2wgKklEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIFNlbCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgdmlydHVhbCBjb25zdCBPYmpDTWVzc2FnZUV4cHIgKmdldE9yaWdpbkV4cHIoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8T2JqQ01lc3NhZ2VFeHByPihDYWxsRXZlbnQ6OmdldE9yaWdpbkV4cHIoKSk7CisgIH0KKworICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0T3JpZ2luRXhwcigpLT5nZXRNZXRob2REZWNsKCk7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRPcmlnaW5FeHByKCktPmdldE51bUFyZ3MoKTsKKyAgfQorCisgIGNvbnN0IEV4cHIgKmdldEFyZ0V4cHIodW5zaWduZWQgSW5kZXgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0T3JpZ2luRXhwcigpLT5nZXRBcmcoSW5kZXgpOworICB9CisKKyAgYm9vbCBpc0luc3RhbmNlTWVzc2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3JpZ2luRXhwcigpLT5pc0luc3RhbmNlTWVzc2FnZSgpOworICB9CisKKyAgT2JqQ01ldGhvZEZhbWlseSBnZXRNZXRob2RGYW1pbHkoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9yaWdpbkV4cHIoKS0+Z2V0TWV0aG9kRmFtaWx5KCk7CisgIH0KKworICBTZWxlY3RvciBnZXRTZWxlY3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3JpZ2luRXhwcigpLT5nZXRTZWxlY3RvcigpOworICB9CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlciBhdCB0aGUgdGltZSBvZiB0aGlzIGNhbGwuCisgIFNWYWwgZ2V0UmVjZWl2ZXJTVmFsKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHZhbHVlIG9mICdzZWxmJyBpZiBhdmFpbGFibGUuCisgIFNWYWwgZ2V0U2VsZlNWYWwoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgaW50ZXJmYWNlIGZvciB0aGUgcmVjZWl2ZXIuCisgIC8vLworICAvLy8gVGhpcyB3b3JrcyB3aGV0aGVyIHRoaXMgaXMgYW4gaW5zdGFuY2UgbWVzc2FnZSBvciBhIGNsYXNzIG1lc3NhZ2UuCisgIC8vLyBIb3dldmVyLCBpdCBjdXJyZW50bHkganVzdCB1c2VzIHRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgcmVjZWl2ZXIuCisgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpnZXRSZWNlaXZlckludGVyZmFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3JpZ2luRXhwcigpLT5nZXRSZWNlaXZlckludGVyZmFjZSgpOworICB9CisKKyAgLy8vIFxicmllZiBDaGVja3MgaWYgdGhlIHJlY2VpdmVyIHJlZmVycyB0byAnc2VsZicgb3IgJ3N1cGVyJy4KKyAgYm9vbCBpc1JlY2VpdmVyU2VsZk9yU3VwZXIoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyBob3cgdGhlIG1lc3NhZ2Ugd2FzIHdyaXR0ZW4gaW4gdGhlIHNvdXJjZSAocHJvcGVydHkgYWNjZXNzLAorICAvLy8gc3Vic2NyaXB0LCBvciBleHBsaWNpdCBtZXNzYWdlIHNlbmQpLgorICBPYmpDTWVzc2FnZUtpbmQgZ2V0TWVzc2FnZUtpbmQoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgcHJvcGVydHkgYWNjZXNzIG9yIHN1YnNjcmlwdCBpcyBhIHNldHRlciAoaGFzIHRoZQorICAvLy8gZm9ybSBvZiBhbiBhc3NpZ25tZW50KS4KKyAgYm9vbCBpc1NldHRlcigpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKGdldE1lc3NhZ2VLaW5kKCkpIHsKKyAgICBjYXNlIE9DTV9NZXNzYWdlOgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVGhpcyBpcyBub3QgYSBwc2V1ZG8tb2JqZWN0IGFjY2VzcyEiKTsKKyAgICBjYXNlIE9DTV9Qcm9wZXJ0eUFjY2VzczoKKyAgICAgIHJldHVybiBnZXROdW1BcmdzKCkgPiAwOworICAgIGNhc2UgT0NNX1N1YnNjcmlwdDoKKyAgICAgIHJldHVybiBnZXROdW1BcmdzKCkgPiAxOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIG1lc3NhZ2Uga2luZCIpOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgcHJvcGVydHkgYWNjZXNzZWQgYnkgdGhpcyBtZXRob2QsIGVpdGhlciBleHBsaWNpdGx5IHZpYQorICAvLyBwcm9wZXJ0eSBzeW50YXggb3IgaW1wbGljaXRseSB2aWEgYSBnZXR0ZXIgb3Igc2V0dGVyIG1ldGhvZC4gUmV0dXJucworICAvLyBudWxscHRyIGlmIHRoZSBjYWxsIGlzIG5vdCBhIHByb29wZXJ0eSBhY2Nlc3MuCisgIGNvbnN0IE9iakNQcm9wZXJ0eURlY2wgKmdldEFjY2Vzc2VkUHJvcGVydHkoKSBjb25zdDsKKworICBSdW50aW1lRGVmaW5pdGlvbiBnZXRSdW50aW1lRGVmaW5pdGlvbigpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgYXJndW1lbnRzTWF5RXNjYXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZXRJbml0aWFsU3RhY2tGcmFtZUNvbnRlbnRzKGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpDYWxsZWVDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nc1R5ICZCaW5kaW5ncykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgQXJyYXlSZWY8UGFybVZhckRlY2wqPiBwYXJhbWV0ZXJzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgS2luZCBnZXRLaW5kKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gQ0VfT2JqQ01lc3NhZ2U7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENhbGxFdmVudCAqQ0EpIHsKKyAgICByZXR1cm4gQ0EtPmdldEtpbmQoKSA9PSBDRV9PYmpDTWVzc2FnZTsKKyAgfQorfTsKKworLy8vIFxicmllZiBNYW5hZ2VzIHRoZSBsaWZldGltZSBvZiBDYWxsRXZlbnQgb2JqZWN0cy4KKy8vLworLy8vIENhbGxFdmVudE1hbmFnZXIgcHJvdmlkZXMgYSB3YXkgdG8gY3JlYXRlIGFyYml0cmFyeSBDYWxsRXZlbnRzICJvbiB0aGUKKy8vLyBzdGFjayIgYXMgaWYgdGhleSB3ZXJlIHZhbHVlIG9iamVjdHMgYnkga2VlcGluZyBhIGNhY2hlIG9mIENhbGxFdmVudC1zaXplZAorLy8vIG1lbW9yeSBibG9ja3MuIFRoZSBDYWxsRXZlbnRzIGNyZWF0ZWQgYnkgQ2FsbEV2ZW50TWFuYWdlciBhcmUgb25seSB2YWxpZAorLy8vIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIE93bmVkQ2FsbEV2ZW50IHRoYXQgaG9sZHMgdGhlbTsgcmlnaHQgbm93IHRoZXNlCisvLy8gb2JqZWN0cyBjYW5ub3QgYmUgY29waWVkIGFuZCBvd25lcnNoaXAgY2Fubm90IGJlIHRyYW5zZmVycmVkLgorY2xhc3MgQ2FsbEV2ZW50TWFuYWdlciB7CisgIGZyaWVuZCBjbGFzcyBDYWxsRXZlbnQ7CisKKyAgbGx2bTo6QnVtcFB0ckFsbG9jYXRvciAmQWxsb2M7CisgIFNtYWxsVmVjdG9yPHZvaWQgKiwgOD4gQ2FjaGU7CisKKyAgdXNpbmcgQ2FsbEV2ZW50VGVtcGxhdGVUeSA9IFNpbXBsZUZ1bmN0aW9uQ2FsbDsKKworICB2b2lkIHJlY2xhaW0oY29uc3Qgdm9pZCAqTWVtb3J5KSB7CisgICAgQ2FjaGUucHVzaF9iYWNrKGNvbnN0X2Nhc3Q8dm9pZCAqPihNZW1vcnkpKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIG1lbW9yeSB0aGF0IGNhbiBiZSBpbml0aWFsaXplZCBhcyBhIENhbGxFdmVudC4KKyAgdm9pZCAqYWxsb2NhdGUoKSB7CisgICAgaWYgKENhY2hlLmVtcHR5KCkpCisgICAgICByZXR1cm4gQWxsb2MuQWxsb2NhdGU8Q2FsbEV2ZW50VGVtcGxhdGVUeT4oKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gQ2FjaGUucG9wX2JhY2tfdmFsKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnPgorICBUICpjcmVhdGUoQXJnIEEsIFByb2dyYW1TdGF0ZVJlZiBTdCwgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4KSB7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoVCkgPT0gc2l6ZW9mKENhbGxFdmVudFRlbXBsYXRlVHkpLAorICAgICAgICAgICAgICAgICAgIkNhbGxFdmVudCBzdWJjbGFzc2VzIGFyZSBub3QgYWxsIHRoZSBzYW1lIHNpemUiKTsKKyAgICByZXR1cm4gbmV3IChhbGxvY2F0ZSgpKSBUKEEsIFN0LCBMQ3R4KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPgorICBUICpjcmVhdGUoQXJnMSBBMSwgQXJnMiBBMiwgUHJvZ3JhbVN0YXRlUmVmIFN0LCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihUKSA9PSBzaXplb2YoQ2FsbEV2ZW50VGVtcGxhdGVUeSksCisgICAgICAgICAgICAgICAgICAiQ2FsbEV2ZW50IHN1YmNsYXNzZXMgYXJlIG5vdCBhbGwgdGhlIHNhbWUgc2l6ZSIpOworICAgIHJldHVybiBuZXcgKGFsbG9jYXRlKCkpIFQoQTEsIEEyLCBTdCwgTEN0eCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMz4KKyAgVCAqY3JlYXRlKEFyZzEgQTEsIEFyZzIgQTIsIEFyZzMgQTMsIFByb2dyYW1TdGF0ZVJlZiBTdCwKKyAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCkgeworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFQpID09IHNpemVvZihDYWxsRXZlbnRUZW1wbGF0ZVR5KSwKKyAgICAgICAgICAgICAgICAgICJDYWxsRXZlbnQgc3ViY2xhc3NlcyBhcmUgbm90IGFsbCB0aGUgc2FtZSBzaXplIik7CisgICAgcmV0dXJuIG5ldyAoYWxsb2NhdGUoKSkgVChBMSwgQTIsIEEzLCBTdCwgTEN0eCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMywKKyAgICAgICAgICAgIHR5cGVuYW1lIEFyZzQ+CisgIFQgKmNyZWF0ZShBcmcxIEExLCBBcmcyIEEyLCBBcmczIEEzLCBBcmc0IEE0LCBQcm9ncmFtU3RhdGVSZWYgU3QsCisgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihUKSA9PSBzaXplb2YoQ2FsbEV2ZW50VGVtcGxhdGVUeSksCisgICAgICAgICAgICAgICAgICAiQ2FsbEV2ZW50IHN1YmNsYXNzZXMgYXJlIG5vdCBhbGwgdGhlIHNhbWUgc2l6ZSIpOworICAgIHJldHVybiBuZXcgKGFsbG9jYXRlKCkpIFQoQTEsIEEyLCBBMywgQTQsIFN0LCBMQ3R4KTsKKyAgfQorCitwdWJsaWM6CisgIENhbGxFdmVudE1hbmFnZXIobGx2bTo6QnVtcFB0ckFsbG9jYXRvciAmYWxsb2MpIDogQWxsb2MoYWxsb2MpIHt9CisKKyAgQ2FsbEV2ZW50UmVmPD4KKyAgZ2V0Q2FsbGVyKGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpDYWxsZWVDdHgsIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSk7CisKKyAgQ2FsbEV2ZW50UmVmPD4KKyAgZ2V0U2ltcGxlQ2FsbChjb25zdCBDYWxsRXhwciAqRSwgUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLAorICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCk7CisKKyAgQ2FsbEV2ZW50UmVmPE9iakNNZXRob2RDYWxsPgorICBnZXRPYmpDTWV0aG9kQ2FsbChjb25zdCBPYmpDTWVzc2FnZUV4cHIgKkUsIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZTxPYmpDTWV0aG9kQ2FsbD4oRSwgU3RhdGUsIExDdHgpOworICB9CisKKyAgQ2FsbEV2ZW50UmVmPENYWENvbnN0cnVjdG9yQ2FsbD4KKyAgZ2V0Q1hYQ29uc3RydWN0b3JDYWxsKGNvbnN0IENYWENvbnN0cnVjdEV4cHIgKkUsIGNvbnN0IE1lbVJlZ2lvbiAqVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgpIHsKKyAgICByZXR1cm4gY3JlYXRlPENYWENvbnN0cnVjdG9yQ2FsbD4oRSwgVGFyZ2V0LCBTdGF0ZSwgTEN0eCk7CisgIH0KKworICBDYWxsRXZlbnRSZWY8Q1hYRGVzdHJ1Y3RvckNhbGw+CisgIGdldENYWERlc3RydWN0b3JDYWxsKGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpERCwgY29uc3QgU3RtdCAqVHJpZ2dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtUmVnaW9uICpUYXJnZXQsIGJvb2wgSXNCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RhdGVSZWYgU3RhdGUsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCkgeworICAgIHJldHVybiBjcmVhdGU8Q1hYRGVzdHJ1Y3RvckNhbGw+KERELCBUcmlnZ2VyLCBUYXJnZXQsIElzQmFzZSwgU3RhdGUsIExDdHgpOworICB9CisKKyAgQ2FsbEV2ZW50UmVmPENYWEFsbG9jYXRvckNhbGw+CisgIGdldENYWEFsbG9jYXRvckNhbGwoY29uc3QgQ1hYTmV3RXhwciAqRSwgUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCkgeworICAgIHJldHVybiBjcmVhdGU8Q1hYQWxsb2NhdG9yQ2FsbD4oRSwgU3RhdGUsIExDdHgpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK0NhbGxFdmVudFJlZjxUPiBDYWxsRXZlbnQ6OmNsb25lV2l0aFN0YXRlKFByb2dyYW1TdGF0ZVJlZiBOZXdTdGF0ZSkgY29uc3QgeworICBhc3NlcnQoaXNhPFQ+KCp0aGlzKSAmJiAiQ2xvbmluZyB0byB1bnJlbGF0ZWQgdHlwZSIpOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihUKSA9PSBzaXplb2YoQ2FsbEV2ZW50KSwKKyAgICAgICAgICAgICAgICAiU3ViY2xhc3NlcyBtYXkgbm90IGFkZCBmaWVsZHMiKTsKKworICBpZiAoTmV3U3RhdGUgPT0gU3RhdGUpCisgICAgcmV0dXJuIGNhc3Q8VD4odGhpcyk7CisKKyAgQ2FsbEV2ZW50TWFuYWdlciAmTWdyID0gU3RhdGUtPmdldFN0YXRlTWFuYWdlcigpLmdldENhbGxFdmVudE1hbmFnZXIoKTsKKyAgVCAqQ29weSA9IHN0YXRpY19jYXN0PFQgKj4oTWdyLmFsbG9jYXRlKCkpOworICBjbG9uZVRvKENvcHkpOworICBhc3NlcnQoQ29weS0+Z2V0S2luZCgpID09IHRoaXMtPmdldEtpbmQoKSAmJiAiQmFkIGNvcHkiKTsKKworICBDb3B5LT5TdGF0ZSA9IE5ld1N0YXRlOworICByZXR1cm4gQ29weTsKK30KKworaW5saW5lIHZvaWQgQ2FsbEV2ZW50OjpSZWxlYXNlKCkgY29uc3QgeworICBhc3NlcnQoUmVmQ291bnQgPiAwICYmICJSZWZlcmVuY2UgY291bnQgaXMgYWxyZWFkeSB6ZXJvLiIpOworICAtLVJlZkNvdW50OworCisgIGlmIChSZWZDb3VudCA+IDApCisgICAgcmV0dXJuOworCisgIENhbGxFdmVudE1hbmFnZXIgJk1nciA9IFN0YXRlLT5nZXRTdGF0ZU1hbmFnZXIoKS5nZXRDYWxsRXZlbnRNYW5hZ2VyKCk7CisgIE1nci5yZWNsYWltKHRoaXMpOworCisgIHRoaXMtPn5DYWxsRXZlbnQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgZW50bworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCituYW1lc3BhY2UgbGx2bSB7CisKKy8vIFN1cHBvcnQgaXNhPD4sIGNhc3Q8PiwgYW5kIGR5bl9jYXN0PD4gZm9yIENhbGxFdmVudFJlZi4KK3RlbXBsYXRlPGNsYXNzIFQ+IHN0cnVjdCBzaW1wbGlmeV90eXBlPCBjbGFuZzo6ZW50bzo6Q2FsbEV2ZW50UmVmPFQ+PiB7CisgIHVzaW5nIFNpbXBsZVR5cGUgPSBjb25zdCBUICo7CisKKyAgc3RhdGljIFNpbXBsZVR5cGUKKyAgZ2V0U2ltcGxpZmllZFZhbHVlKGNsYW5nOjplbnRvOjpDYWxsRXZlbnRSZWY8VD4gVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXQoKTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfQ0FMTEVWRU5UX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9DaGVja2VyQ29udGV4dC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0NoZWNrZXJDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhNTY0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9DaGVja2VyQ29udGV4dC5oCkBAIC0wLDAgKzEsMzYwIEBACisvLz09IENoZWNrZXJDb250ZXh0LmggLSBDb250ZXh0IGluZm8gZm9yIHBhdGgtc2Vuc2l0aXZlIGNoZWNrZXJzLS0qLSBDKysgLSotLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyBDaGVja2VyQ29udGV4dCB0aGF0IHByb3ZpZGVzIGNvbnRleHR1YWwgaW5mbyBmb3IKKy8vIHBhdGgtc2Vuc2l0aXZlIGNoZWNrZXJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfQ0hFQ0tFUkNPTlRFWFRfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9DSEVDS0VSQ09OVEVYVF9ICisKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvRXhwckVuZ2luZS5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Qcm9ncmFtU3RhdGVUcmFpdC5oIgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGVudG8geworCisgIC8vLyBEZWNsYXJlcyBhbiBpbW11dGFibGUgbWFwIG9mIHR5cGUgXHAgTmFtZVR5LCBzdWl0YWJsZSBmb3IgcGxhY2VtZW50IGludG8KKyAgLy8vIHRoZSBQcm9ncmFtU3RhdGUuIFRoaXMgaXMgaW1wbGVtZW50aW5nIHVzaW5nIGxsdm06OkltbXV0YWJsZU1hcC4KKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gU3RhdGUgPSBTdGF0ZS0+c2V0PE5hbWU+KEssIFYpOworICAvLy8gY29uc3QgVmFsdWUgKlYgPSBTdGF0ZS0+Z2V0PE5hbWU+KEspOyAvLyBSZXR1cm5zIE5VTEwgaWYgbm90IGluIHRoZSBtYXAuCisgIC8vLyBTdGF0ZSA9IFN0YXRlLT5yZW1vdmU8TmFtZT4oSyk7CisgIC8vLyBOYW1lVHkgTWFwID0gU3RhdGUtPmdldDxOYW1lPigpOworICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBUaGUgbWFjcm8gc2hvdWxkIG5vdCBiZSB1c2VkIGluc2lkZSBuYW1lc3BhY2VzLCBvciBmb3IgdHJhaXRzIHRoYXQgbXVzdAorICAvLy8gYmUgYWNjZXNzaWJsZSBmcm9tIG1vcmUgdGhhbiBvbmUgdHJhbnNsYXRpb24gdW5pdC4KKyAgI2RlZmluZSBSRUdJU1RFUl9NQVBfV0lUSF9QUk9HUkFNU1RBVEUoTmFtZSwgS2V5LCBWYWx1ZSkgXAorICAgIFJFR0lTVEVSX1RSQUlUX1dJVEhfUFJPR1JBTVNUQVRFKE5hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTEFOR19FTlRPX1BST0dSQU1TVEFURV9NQVAoS2V5LCBWYWx1ZSkpCisKKyAgLy8vIERlY2xhcmVzIGFuIGltbXV0YWJsZSBzZXQgb2YgdHlwZSBccCBOYW1lVHksIHN1aXRhYmxlIGZvciBwbGFjZW1lbnQgaW50bworICAvLy8gdGhlIFByb2dyYW1TdGF0ZS4gVGhpcyBpcyBpbXBsZW1lbnRpbmcgdXNpbmcgbGx2bTo6SW1tdXRhYmxlU2V0LgorICAvLy8KKyAgLy8vIFxjb2RlCisgIC8vLyBTdGF0ZSA9IFN0YXRlLT5hZGQ8TmFtZT4oRSk7CisgIC8vLyBTdGF0ZSA9IFN0YXRlLT5yZW1vdmU8TmFtZT4oRSk7CisgIC8vLyBib29sIFByZXNlbnQgPSBTdGF0ZS0+Y29udGFpbnM8TmFtZT4oRSk7CisgIC8vLyBOYW1lVHkgU2V0ID0gU3RhdGUtPmdldDxOYW1lPigpOworICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBUaGUgbWFjcm8gc2hvdWxkIG5vdCBiZSB1c2VkIGluc2lkZSBuYW1lc3BhY2VzLCBvciBmb3IgdHJhaXRzIHRoYXQgbXVzdAorICAvLy8gYmUgYWNjZXNzaWJsZSBmcm9tIG1vcmUgdGhhbiBvbmUgdHJhbnNsYXRpb24gdW5pdC4KKyAgI2RlZmluZSBSRUdJU1RFUl9TRVRfV0lUSF9QUk9HUkFNU1RBVEUoTmFtZSwgRWxlbSkgXAorICAgIFJFR0lTVEVSX1RSQUlUX1dJVEhfUFJPR1JBTVNUQVRFKE5hbWUsIGxsdm06OkltbXV0YWJsZVNldDxFbGVtPikKKyAgCisgIC8vLyBEZWNsYXJlcyBhbiBpbW11dGFibGUgbGlzdCBvZiB0eXBlIFxwIE5hbWVUeSwgc3VpdGFibGUgZm9yIHBsYWNlbWVudCBpbnRvCisgIC8vLyB0aGUgUHJvZ3JhbVN0YXRlLiBUaGlzIGlzIGltcGxlbWVudGluZyB1c2luZyBsbHZtOjpJbW11dGFibGVMaXN0LgorICAvLy8KKyAgLy8vIFxjb2RlCisgIC8vLyBTdGF0ZSA9IFN0YXRlLT5hZGQ8TmFtZT4oRSk7IC8vIEFkZHMgdG8gdGhlIC9lbmQvIG9mIHRoZSBsaXN0LgorICAvLy8gYm9vbCBQcmVzZW50ID0gU3RhdGUtPmNvbnRhaW5zPE5hbWU+KEUpOworICAvLy8gTmFtZVR5IExpc3QgPSBTdGF0ZS0+Z2V0PE5hbWU+KCk7CisgIC8vLyBcZW5kY29kZQorICAvLy8KKyAgLy8vIFRoZSBtYWNybyBzaG91bGQgbm90IGJlIHVzZWQgaW5zaWRlIG5hbWVzcGFjZXMsIG9yIGZvciB0cmFpdHMgdGhhdCBtdXN0CisgIC8vLyBiZSBhY2Nlc3NpYmxlIGZyb20gbW9yZSB0aGFuIG9uZSB0cmFuc2xhdGlvbiB1bml0LgorICAjZGVmaW5lIFJFR0lTVEVSX0xJU1RfV0lUSF9QUk9HUkFNU1RBVEUoTmFtZSwgRWxlbSkgXAorICAgIFJFR0lTVEVSX1RSQUlUX1dJVEhfUFJPR1JBTVNUQVRFKE5hbWUsIGxsdm06OkltbXV0YWJsZUxpc3Q8RWxlbT4pCisKKworY2xhc3MgQ2hlY2tlckNvbnRleHQgeworICBFeHByRW5naW5lICZFbmc7CisgIC8vLyBUaGUgY3VycmVudCBleHBsb2RlZChzeW1ib2xpYyBleGVjdXRpb24pIGdyYXBoIG5vZGUuCisgIEV4cGxvZGVkTm9kZSAqUHJlZDsKKyAgLy8vIFRoZSBmbGFnIGlzIHRydWUgaWYgdGhlIChzdGF0ZSBvZiB0aGUgZXhlY3V0aW9uKSBoYXMgYmVlbiBtb2RpZmllZAorICAvLy8gYnkgdGhlIGNoZWNrZXIgdXNpbmcgdGhpcyBjb250ZXh0LiBGb3IgZXhhbXBsZSwgYSBuZXcgdHJhbnNpdGlvbiBoYXMgYmVlbgorICAvLy8gYWRkZWQgb3IgYSBidWcgcmVwb3J0IGlzc3VlZC4KKyAgYm9vbCBDaGFuZ2VkOworICAvLy8gVGhlIHRhZ2dlZCBsb2NhdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBnZW5lcmF0ZSBhbGwgbmV3IG5vZGVzLgorICBjb25zdCBQcm9ncmFtUG9pbnQgTG9jYXRpb247CisgIE5vZGVCdWlsZGVyICZOQjsKKworcHVibGljOgorICAvLy8gSWYgd2UgYXJlIHBvc3QgdmlzaXRpbmcgYSBjYWxsLCB0aGlzIGZsYWcgd2lsbCBiZSBzZXQgaWYgdGhlCisgIC8vLyBjYWxsIHdhcyBpbmxpbmVkLiAgSW4gYWxsIG90aGVyIGNhc2VzIGl0IHdpbGwgYmUgZmFsc2UuCisgIGNvbnN0IGJvb2wgd2FzSW5saW5lZDsKKyAgCisgIENoZWNrZXJDb250ZXh0KE5vZGVCdWlsZGVyICZidWlsZGVyLAorICAgICAgICAgICAgICAgICBFeHByRW5naW5lICZlbmcsCisgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqcHJlZCwKKyAgICAgICAgICAgICAgICAgY29uc3QgUHJvZ3JhbVBvaW50ICZsb2MsCisgICAgICAgICAgICAgICAgIGJvb2wgd2FzSW5saW5lZCA9IGZhbHNlKQorICAgIDogRW5nKGVuZyksCisgICAgICBQcmVkKHByZWQpLAorICAgICAgQ2hhbmdlZChmYWxzZSksCisgICAgICBMb2NhdGlvbihsb2MpLAorICAgICAgTkIoYnVpbGRlciksCisgICAgICB3YXNJbmxpbmVkKHdhc0lubGluZWQpIHsKKyAgICBhc3NlcnQoUHJlZC0+Z2V0U3RhdGUoKSAmJgorICAgICAgICAgICAiV2Ugc2hvdWxkIG5vdCBjYWxsIHRoZSBjaGVja2VycyBvbiBhbiBlbXB0eSBzdGF0ZS4iKTsKKyAgfQorCisgIEFuYWx5c2lzTWFuYWdlciAmZ2V0QW5hbHlzaXNNYW5hZ2VyKCkgeworICAgIHJldHVybiBFbmcuZ2V0QW5hbHlzaXNNYW5hZ2VyKCk7CisgIH0KKworICBDb25zdHJhaW50TWFuYWdlciAmZ2V0Q29uc3RyYWludE1hbmFnZXIoKSB7CisgICAgcmV0dXJuIEVuZy5nZXRDb25zdHJhaW50TWFuYWdlcigpOworICB9CisKKyAgU3RvcmVNYW5hZ2VyICZnZXRTdG9yZU1hbmFnZXIoKSB7CisgICAgcmV0dXJuIEVuZy5nZXRTdG9yZU1hbmFnZXIoKTsKKyAgfQorICAKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBwcmV2aW91cyBub2RlIGluIHRoZSBleHBsb2RlZCBncmFwaCwgd2hpY2ggaW5jbHVkZXMKKyAgLy8vIHRoZSBzdGF0ZSBvZiB0aGUgcHJvZ3JhbSBiZWZvcmUgdGhlIGNoZWNrZXIgcmFuLiBOb3RlLCBjaGVja2VycyBzaG91bGQKKyAgLy8vIG5vdCByZXRhaW4gdGhlIG5vZGUgaW4gdGhlaXIgc3RhdGUgc2luY2UgdGhlIG5vZGVzIG1pZ2h0IGdldCBpbnZhbGlkYXRlZC4KKyAgRXhwbG9kZWROb2RlICpnZXRQcmVkZWNlc3NvcigpIHsgcmV0dXJuIFByZWQ7IH0KKyAgY29uc3QgUHJvZ3JhbVN0YXRlUmVmICZnZXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIFByZWQtPmdldFN0YXRlKCk7IH0KKworICAvLy8gXGJyaWVmIENoZWNrIGlmIHRoZSBjaGVja2VyIGNoYW5nZWQgdGhlIHN0YXRlIG9mIHRoZSBleGVjdXRpb247IGV4OiBhZGRlZAorICAvLy8gYSBuZXcgdHJhbnNpdGlvbiBvciBhIGJ1ZyByZXBvcnQuCisgIGJvb2wgaXNEaWZmZXJlbnQoKSB7IHJldHVybiBDaGFuZ2VkOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGN1cnJlbnQgYmxvY2sgaGFzIGJlZW4gdmlzaXRlZAorICAvLy8gYWxvbmcgdGhlIGFuYWx5emVkIHBhdGguCisgIHVuc2lnbmVkIGJsb2NrQ291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIE5CLmdldENvbnRleHQoKS5ibG9ja0NvdW50KCk7CisgIH0KKworICBBU1RDb250ZXh0ICZnZXRBU1RDb250ZXh0KCkgeworICAgIHJldHVybiBFbmcuZ2V0Q29udGV4dCgpOworICB9CisKKyAgY29uc3QgTGFuZ09wdGlvbnMgJmdldExhbmdPcHRzKCkgY29uc3QgeworICAgIHJldHVybiBFbmcuZ2V0Q29udGV4dCgpLmdldExhbmdPcHRzKCk7CisgIH0KKworICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKmdldExvY2F0aW9uQ29udGV4dCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZC0+Z2V0TG9jYXRpb25Db250ZXh0KCk7CisgIH0KKworICBjb25zdCBTdGFja0ZyYW1lQ29udGV4dCAqZ2V0U3RhY2tGcmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZC0+Z2V0U3RhY2tGcmFtZSgpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IExvY2F0aW9uQ29udGV4dCBoYXMgbm8gY2FsbGVyIGNvbnRleHQuCisgIGJvb2wgaW5Ub3BGcmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldExvY2F0aW9uQ29udGV4dCgpLT5pblRvcEZyYW1lKCk7ICB9CisKKyAgQnVnUmVwb3J0ZXIgJmdldEJ1Z1JlcG9ydGVyKCkgeworICAgIHJldHVybiBFbmcuZ2V0QnVnUmVwb3J0ZXIoKTsKKyAgfQorICAKKyAgU291cmNlTWFuYWdlciAmZ2V0U291cmNlTWFuYWdlcigpIHsKKyAgICByZXR1cm4gZ2V0QnVnUmVwb3J0ZXIoKS5nZXRTb3VyY2VNYW5hZ2VyKCk7CisgIH0KKworICBTVmFsQnVpbGRlciAmZ2V0U1ZhbEJ1aWxkZXIoKSB7CisgICAgcmV0dXJuIEVuZy5nZXRTVmFsQnVpbGRlcigpOworICB9CisKKyAgU3ltYm9sTWFuYWdlciAmZ2V0U3ltYm9sTWFuYWdlcigpIHsKKyAgICByZXR1cm4gZ2V0U1ZhbEJ1aWxkZXIoKS5nZXRTeW1ib2xNYW5hZ2VyKCk7CisgIH0KKworICBib29sIGlzT2JqQ0dDRW5hYmxlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRW5nLmlzT2JqQ0dDRW5hYmxlZCgpOworICB9CisKKyAgUHJvZ3JhbVN0YXRlTWFuYWdlciAmZ2V0U3RhdGVNYW5hZ2VyKCkgeworICAgIHJldHVybiBFbmcuZ2V0U3RhdGVNYW5hZ2VyKCk7CisgIH0KKworICBBbmFseXNpc0RlY2xDb250ZXh0ICpnZXRDdXJyZW50QW5hbHlzaXNEZWNsQ29udGV4dCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZC0+Z2V0TG9jYXRpb25Db250ZXh0KCktPmdldEFuYWx5c2lzRGVjbENvbnRleHQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBibG9ja0lELgorICB1bnNpZ25lZCBnZXRCbG9ja0lEKCkgY29uc3QgeworICAgIHJldHVybiBOQi5nZXRDb250ZXh0KCkuZ2V0QmxvY2soKS0+Z2V0QmxvY2tJRCgpOworICB9CisKKyAgLy8vIFxicmllZiBJZiB0aGUgZ2l2ZW4gbm9kZSBjb3JyZXNwb25kcyB0byBhIFBvc3RTdG9yZSBwcm9ncmFtIHBvaW50LAorICAvLy8gcmV0cmlldmUgdGhlIGxvY2F0aW9uIHJlZ2lvbiBhcyBpdCB3YXMgdXR0ZXJlZCBpbiB0aGUgY29kZS4KKyAgLy8vCisgIC8vLyBUaGlzIHV0aWxpdHkgY2FuIGJlIHVzZWZ1bCBmb3IgZ2VuZXJhdGluZyBleHRlbnNpdmUgZGlhZ25vc3RpY3MsIGZvcgorICAvLy8gZXhhbXBsZSwgZm9yIGZpbmRpbmcgdmFyaWFibGVzIHRoYXQgdGhlIGdpdmVuIHN5bWJvbCB3YXMgYXNzaWduZWQgdG8uCisgIHN0YXRpYyBjb25zdCBNZW1SZWdpb24gKmdldExvY2F0aW9uUmVnaW9uSWZQb3N0U3RvcmUoY29uc3QgRXhwbG9kZWROb2RlICpOKSB7CisgICAgUHJvZ3JhbVBvaW50IEwgPSBOLT5nZXRMb2NhdGlvbigpOworICAgIGlmIChPcHRpb25hbDxQb3N0U3RvcmU+IFBTTCA9IEwuZ2V0QXM8UG9zdFN0b3JlPigpKQorICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWVtUmVnaW9uKj4oUFNMLT5nZXRMb2NhdGlvblZhbHVlKCkpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHZhbHVlIG9mIGFyYml0cmFyeSBleHByZXNzaW9ucyBhdCB0aGlzIHBvaW50IGluIHRoZSBwYXRoLgorICBTVmFsIGdldFNWYWwoY29uc3QgU3RtdCAqUykgY29uc3QgeworICAgIHJldHVybiBQcmVkLT5nZXRTVmFsKFMpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIG9mIFxwIEUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFxwCisgIC8vLyBWYWwgdW5kZXIgdW5zaWduZWQgY29tcGFyaXNvbgorICBib29sIGlzR3JlYXRlck9yRXF1YWwoY29uc3QgRXhwciAqRSwgdW5zaWduZWQgbG9uZyBsb25nIFZhbCk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgb2YgXHAgRSBpcyBuZWdhdGl2ZS4KKyAgYm9vbCBpc05lZ2F0aXZlKGNvbnN0IEV4cHIgKkUpOworCisgIC8vLyBcYnJpZWYgR2VuZXJhdGVzIGEgbmV3IHRyYW5zaXRpb24gaW4gdGhlIHByb2dyYW0gc3RhdGUgZ3JhcGgKKyAgLy8vIChFeHBsb2RlZEdyYXBoKS4gVXNlcyB0aGUgZGVmYXVsdCBDaGVja2VyQ29udGV4dCBwcmVkZWNlc3NvciBub2RlLgorICAvLy8KKyAgLy8vIEBwYXJhbSBTdGF0ZSBUaGUgc3RhdGUgb2YgdGhlIGdlbmVyYXRlZCBub2RlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgc3RhdGUKKyAgLy8vICAgICAgICB3aWxsIG5vdCBiZSBjaGFuZ2VkLCBidXQgdGhlIG5ldyBub2RlIHdpbGwgaGF2ZSB0aGUgY2hlY2tlcidzIHRhZy4KKyAgLy8vIEBwYXJhbSBUYWcgVGhlIHRhZyBpcyB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBjcmVhdGlvbiBzaXRlLiBJZiBubworICAvLy8gICAgICAgIHRhZyBpcyBzcGVjaWZpZWQsIGEgZGVmYXVsdCB0YWcsIHVuaXF1ZSB0byB0aGUgZ2l2ZW4gY2hlY2tlciwKKyAgLy8vICAgICAgICB3aWxsIGJlIHVzZWQuIFRhZ3MgYXJlIHVzZWQgdG8gcHJldmVudCBzdGF0ZXMgZ2VuZXJhdGVkIGF0CisgIC8vLyAgICAgICAgZGlmZmVyZW50IHNpdGVzIGZyb20gY2FjaGluZyBvdXQuCisgIEV4cGxvZGVkTm9kZSAqYWRkVHJhbnNpdGlvbihQcm9ncmFtU3RhdGVSZWYgU3RhdGUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZ3JhbVBvaW50VGFnICpUYWcgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIGFkZFRyYW5zaXRpb25JbXBsKFN0YXRlID8gU3RhdGUgOiBnZXRTdGF0ZSgpLCBmYWxzZSwgbnVsbHB0ciwgVGFnKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2VuZXJhdGVzIGEgbmV3IHRyYW5zaXRpb24gd2l0aCB0aGUgZ2l2ZW4gcHJlZGVjZXNzb3IuCisgIC8vLyBBbGxvd3MgY2hlY2tlcnMgdG8gZ2VuZXJhdGUgYSBjaGFpbiBvZiBub2Rlcy4KKyAgLy8vCisgIC8vLyBAcGFyYW0gU3RhdGUgVGhlIHN0YXRlIG9mIHRoZSBnZW5lcmF0ZWQgbm9kZS4KKyAgLy8vIEBwYXJhbSBQcmVkIFRoZSB0cmFuc2l0aW9uIHdpbGwgYmUgZ2VuZXJhdGVkIGZyb20gdGhlIHNwZWNpZmllZCBQcmVkIG5vZGUKKyAgLy8vICAgICAgICAgICAgIHRvIHRoZSBuZXdseSBnZW5lcmF0ZWQgbm9kZS4KKyAgLy8vIEBwYXJhbSBUYWcgVGhlIHRhZyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgY3JlYXRpb24gc2l0ZS4KKyAgRXhwbG9kZWROb2RlICphZGRUcmFuc2l0aW9uKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2dyYW1Qb2ludFRhZyAqVGFnID0gbnVsbHB0cikgeworICAgIHJldHVybiBhZGRUcmFuc2l0aW9uSW1wbChTdGF0ZSwgZmFsc2UsIFByZWQsIFRhZyk7CisgIH0KKworICAvLy8gXGJyaWVmIEdlbmVyYXRlIGEgc2luayBub2RlLiBHZW5lcmF0aW5nIGEgc2luayBzdG9wcyBleHBsb3JhdGlvbiBvZiB0aGUKKyAgLy8vIGdpdmVuIHBhdGguIFRvIGNyZWF0ZSBhIHNpbmsgbm9kZSBmb3IgdGhlIHB1cnBvc2Ugb2YgcmVwb3J0aW5nIGFuIGVycm9yLAorICAvLy8gY2hlY2tlcnMgc2hvdWxkIHVzZSBnZW5lcmF0ZUVycm9yTm9kZSgpIGluc3RlYWQuCisgIEV4cGxvZGVkTm9kZSAqZ2VuZXJhdGVTaW5rKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwgRXhwbG9kZWROb2RlICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKlRhZyA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gYWRkVHJhbnNpdGlvbkltcGwoU3RhdGUgPyBTdGF0ZSA6IGdldFN0YXRlKCksIHRydWUsIFByZWQsIFRhZyk7CisgIH0KKworICAvLy8gXGJyaWVmIEdlbmVyYXRlIGEgdHJhbnNpdGlvbiB0byBhIG5vZGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVwb3J0CisgIC8vLyBhbiBlcnJvci4gVGhpcyBub2RlIHdpbGwgYmUgYSBzaW5rLiBUaGF0IGlzLCBpdCB3aWxsIHN0b3AgZXhwbG9yYXRpb24gb2YKKyAgLy8vIHRoZSBnaXZlbiBwYXRoLgorICAvLy8KKyAgLy8vIEBwYXJhbSBTdGF0ZSBUaGUgc3RhdGUgb2YgdGhlIGdlbmVyYXRlZCBub2RlLgorICAvLy8gQHBhcmFtIFRhZyBUaGUgdGFnIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBjcmVhdGlvbiBzaXRlLiBJZiBudWxsLAorICAvLy8gICAgICAgIHRoZSBkZWZhdWx0IHRhZyBmb3IgdGhlIGNoZWNrZXIgd2lsbCBiZSB1c2VkLgorICBFeHBsb2RlZE5vZGUgKmdlbmVyYXRlRXJyb3JOb2RlKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZ3JhbVBvaW50VGFnICpUYWcgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIGdlbmVyYXRlU2luayhTdGF0ZSwgUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgKFRhZyA/IFRhZyA6IExvY2F0aW9uLmdldFRhZygpKSk7CisgIH0KKworICAvLy8gXGJyaWVmIEdlbmVyYXRlIGEgdHJhbnNpdGlvbiB0byBhIG5vZGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVwb3J0CisgIC8vLyBhbiBlcnJvci4gVGhpcyBub2RlIHdpbGwgbm90IGJlIGEgc2luay4gVGhhdCBpcywgZXhwbG9yYXRpb24gd2lsbAorICAvLy8gY29udGludWUgYWxvbmcgdGhpcyBwYXRoLgorICAvLy8KKyAgLy8vIEBwYXJhbSBTdGF0ZSBUaGUgc3RhdGUgb2YgdGhlIGdlbmVyYXRlZCBub2RlLgorICAvLy8gQHBhcmFtIFRhZyBUaGUgdGFnIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBjcmVhdGlvbiBzaXRlLiBJZiBudWxsLAorICAvLy8gICAgICAgIHRoZSBkZWZhdWx0IHRhZyBmb3IgdGhlIGNoZWNrZXIgd2lsbCBiZSB1c2VkLgorICBFeHBsb2RlZE5vZGUgKgorICBnZW5lcmF0ZU5vbkZhdGFsRXJyb3JOb2RlKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZ3JhbVBvaW50VGFnICpUYWcgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIGFkZFRyYW5zaXRpb24oU3RhdGUsIChUYWcgPyBUYWcgOiBMb2NhdGlvbi5nZXRUYWcoKSkpOworICB9CisKKyAgLy8vIFxicmllZiBFbWl0IHRoZSBkaWFnbm9zdGljcyByZXBvcnQuCisgIHZvaWQgZW1pdFJlcG9ydChzdGQ6OnVuaXF1ZV9wdHI8QnVnUmVwb3J0PiBSKSB7CisgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgRW5nLmdldEJ1Z1JlcG9ydGVyKCkuZW1pdFJlcG9ydChzdGQ6Om1vdmUoUikpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSB3b3JkIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGRlY2xhcmF0aW9uCisgIC8vLyBpbiB0aGUgcmVwb3J0LgorICBTdHJpbmdSZWYgZ2V0RGVjbERlc2NyaXB0aW9uKGNvbnN0IERlY2wgKkQpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgY2FsbGVkIGZ1bmN0aW9uIChwYXRoLXNlbnNpdGl2ZSkuCisgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqZ2V0Q2FsbGVlRGVjbChjb25zdCBDYWxsRXhwciAqQ0UpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBuYW1lIG9mIHRoZSBjYWxsZWQgZnVuY3Rpb24gKHBhdGgtc2Vuc2l0aXZlKS4KKyAgU3RyaW5nUmVmIGdldENhbGxlZU5hbWUoY29uc3QgRnVuY3Rpb25EZWNsICpGdW5EZWNsKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgaWRlbnRpZmllciBvZiB0aGUgY2FsbGVkIGZ1bmN0aW9uIChwYXRoLXNlbnNpdGl2ZSkuCisgIGNvbnN0IElkZW50aWZpZXJJbmZvICpnZXRDYWxsZWVJZGVudGlmaWVyKGNvbnN0IENhbGxFeHByICpDRSkgY29uc3QgeworICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRnVuRGVjbCA9IGdldENhbGxlZURlY2woQ0UpOworICAgIGlmIChGdW5EZWNsKQorICAgICAgcmV0dXJuIEZ1bkRlY2wtPmdldElkZW50aWZpZXIoKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBuYW1lIG9mIHRoZSBjYWxsZWQgZnVuY3Rpb24gKHBhdGgtc2Vuc2l0aXZlKS4KKyAgU3RyaW5nUmVmIGdldENhbGxlZU5hbWUoY29uc3QgQ2FsbEV4cHIgKkNFKSBjb25zdCB7CisgICAgY29uc3QgRnVuY3Rpb25EZWNsICpGdW5EZWNsID0gZ2V0Q2FsbGVlRGVjbChDRSk7CisgICAgcmV0dXJuIGdldENhbGxlZU5hbWUoRnVuRGVjbCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2FsbGVlIGlzIGFuIGV4dGVybmFsbHktdmlzaWJsZSBmdW5jdGlvbiBpbiB0aGUKKyAgLy8vIHRvcC1sZXZlbCBuYW1lc3BhY2UsIHN1Y2ggYXMgXGMgbWFsbG9jLgorICAvLy8KKyAgLy8vIElmIGEgbmFtZSBpcyBwcm92aWRlZCwgdGhlIGZ1bmN0aW9uIG11c3QgYWRkaXRpb25hbGx5IG1hdGNoIHRoZSBnaXZlbgorICAvLy8gbmFtZS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBkZWxpYmVyYXRlbHkgZXhjbHVkZXMgQysrIGxpYnJhcnkgZnVuY3Rpb25zIGluIHRoZSBcYyBzdGQKKyAgLy8vIG5hbWVzcGFjZSwgYnV0IHdpbGwgaW5jbHVkZSBDIGxpYnJhcnkgZnVuY3Rpb25zIGFjY2Vzc2VkIHRocm91Z2ggdGhlCisgIC8vLyBcYyBzdGQgbmFtZXNwYWNlLiBUaGlzIGFsc28gZG9lcyBub3QgY2hlY2sgaWYgdGhlIGZ1bmN0aW9uIGlzIGRlY2xhcmVkCisgIC8vLyBhcyAnZXh0ZXJuICJDIicsIG9yIGlmIGl0IHVzZXMgQysrIG5hbWUgbWFuZ2xpbmcuCisgIHN0YXRpYyBib29sIGlzQ0xpYnJhcnlGdW5jdGlvbihjb25zdCBGdW5jdGlvbkRlY2wgKkZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUgPSBTdHJpbmdSZWYoKSk7CisKKyAgLy8vIFxicmllZiBEZXBlbmRpbmcgb24gd2l0aGVyIHRoZSBsb2NhdGlvbiBjb3JyZXNwb25kcyB0byBhIG1hY3JvLCByZXR1cm4gCisgIC8vLyBlaXRoZXIgdGhlIG1hY3JvIG5hbWUgb3IgdGhlIHRva2VuIHNwZWxsaW5nLgorICAvLy8KKyAgLy8vIFRoaXMgY291bGQgYmUgdXNlZnVsIHdoZW4gY2hlY2tlcnMnIGxvZ2ljIGRlcGVuZHMgb24gd2hldGhlciBhIGZ1bmN0aW9uCisgIC8vLyBpcyBjYWxsZWQgd2l0aCBhIGdpdmVuIG1hY3JvIGFyZ3VtZW50LiBGb3IgZXhhbXBsZToKKyAgLy8vICAgcyA9IHNvY2tldChBRl9JTkVULC4uKQorICAvLy8gSWYgQUZfSU5FVCBpcyBhIG1hY3JvLCB0aGUgcmVzdWx0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgc291cmNlIG9mIHRhaW50LgorICAvLy8KKyAgLy8vIFxzYSBjbGFuZzo6TGV4ZXI6OmdldFNwZWxsaW5nKCksIGNsYW5nOjpMZXhlcjo6Z2V0SW1tZWRpYXRlTWFjcm9OYW1lKCkuCisgIFN0cmluZ1JlZiBnZXRNYWNyb05hbWVPclNwZWxsaW5nKFNvdXJjZUxvY2F0aW9uICZMb2MpOworCitwcml2YXRlOgorICBFeHBsb2RlZE5vZGUgKmFkZFRyYW5zaXRpb25JbXBsKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTWFya0FzU2luaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKlRhZyA9IG51bGxwdHIpIHsKKyAgICAvLyBUaGUgYW5hbHl6ZXIgbWF5IHN0b3AgZXhwbG9yaW5nIGlmIGl0IHNlZXMgYSBzdGF0ZSBpdCBoYXMgcHJldmlvdXNseQorICAgIC8vIHZpc2l0ZWQgKCJjYWNoZSBvdXQiKS4gVGhlIGVhcmx5IHJldHVybiBoZXJlIGlzIGEgZGVmZW5zaXZlIGNoZWNrIHRvCisgICAgLy8gcHJldmVudCBhY2NpZGVudGFsIGNhY2hpbmcgb3V0IGJ5IGNoZWNrZXIgQVBJIGNsaWVudHMuIFVubGVzcyB0aGVyZSBpcyBhCisgICAgLy8gdGFnIG9yIHRoZSBjbGllbnQgY2hlY2tlciBoYXMgcmVxdWVzdGVkIHRoYXQgdGhlIGdlbmVyYXRlZCBub2RlIGJlCisgICAgLy8gbWFya2VkIGFzIGEgc2luaywgd2UgYXNzdW1lIHRoYXQgYSBjbGllbnQgcmVxdWVzdGluZyBhIHRyYW5zaXRpb24gdG8gYQorICAgIC8vIHN0YXRlIHRoYXQgaXMgdGhlIHNhbWUgYXMgdGhlIHByZWRlY2Vzc29yIHN0YXRlIGhhcyBtYWRlIGEgbWlzdGFrZS4gV2UKKyAgICAvLyByZXR1cm4gdGhlIHByZWRlY2Vzc29yIHJhdGhlciB0aGFuIGNhY2hlIG91dC4KKyAgICAvLworICAgIC8vIFRPRE86IFdlIGNvdWxkIHBvdGVudGlhbGx5IGNoYW5nZSB0aGUgcmV0dXJuIHRvIGFuIGFzc2VydGlvbiB0byBhbGVydAorICAgIC8vIGNsaWVudHMgdG8gdGhlaXIgbWlzdGFrZSwgYnV0IHNldmVyYWwgY2hlY2tlcnMgKGluY2x1ZGluZworICAgIC8vIERlcmVmZXJlbmNlQ2hlY2tlciwgQ2FsbEFuZE1lc3NhZ2VDaGVja2VyLCBhbmQgRHluYW1pY1R5cGVQcm9wYWdhdGlvbikKKyAgICAvLyByZWx5IHVwb24gdGhlIGRlZmVuc2l2ZSBiZWhhdmlvciBhbmQgd291bGQgbmVlZCB0byBiZSB1cGRhdGVkLgorICAgIGlmICghU3RhdGUgfHwgKFN0YXRlID09IFByZWQtPmdldFN0YXRlKCkgJiYgIVRhZyAmJiAhTWFya0FzU2luaykpCisgICAgICByZXR1cm4gUHJlZDsKKworICAgIENoYW5nZWQgPSB0cnVlOworICAgIGNvbnN0IFByb2dyYW1Qb2ludCAmTG9jYWxMb2MgPSAoVGFnID8gTG9jYXRpb24ud2l0aFRhZyhUYWcpIDogTG9jYXRpb24pOworICAgIGlmICghUCkKKyAgICAgIFAgPSBQcmVkOworCisgICAgRXhwbG9kZWROb2RlICpub2RlOworICAgIGlmIChNYXJrQXNTaW5rKQorICAgICAgbm9kZSA9IE5CLmdlbmVyYXRlU2luayhMb2NhbExvYywgU3RhdGUsIFApOworICAgIGVsc2UKKyAgICAgIG5vZGUgPSBOQi5nZW5lcmF0ZU5vZGUoTG9jYWxMb2MsIFN0YXRlLCBQKTsKKyAgICByZXR1cm4gbm9kZTsKKyAgfQorfTsKKworfSAvLyBlbmQgR1IgbmFtZXNwYWNlCisKK30gLy8gZW5kIGNsYW5nIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9DaGVja2VySGVscGVycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0NoZWNrZXJIZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzNGE3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9DaGVja2VySGVscGVycy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8vPT0gQ2hlY2tlckhlbHBlcnMuaCAtIEhlbHBlciBmdW5jdGlvbnMgZm9yIGNoZWNrZXJzIC0tLS0tLS0tLS0tLSotIEMrKyAtKi0tPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIENoZWNrZXJWaXNpdG9yLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfQ0hFQ0tFUkhFTFBFUlNfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9DSEVDS0VSSEVMUEVSU19ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdC5oIgorI2luY2x1ZGUgPHR1cGxlPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBFeHByOworY2xhc3MgVmFyRGVjbDsKK2NsYXNzIFF1YWxUeXBlOworY2xhc3MgQXR0cmlidXRlZFR5cGU7CisKK25hbWVzcGFjZSBlbnRvIHsKKworYm9vbCBjb250YWluc01hY3JvKGNvbnN0IFN0bXQgKlMpOworYm9vbCBjb250YWluc0VudW0oY29uc3QgU3RtdCAqUyk7Citib29sIGNvbnRhaW5zU3RhdGljTG9jYWwoY29uc3QgU3RtdCAqUyk7Citib29sIGNvbnRhaW5zQnVpbHRpbk9mZnNldE9mKGNvbnN0IFN0bXQgKlMpOwordGVtcGxhdGUgPGNsYXNzIFQ+IGJvb2wgY29udGFpbnNTdG10KGNvbnN0IFN0bXQgKlMpIHsKKyAgaWYgKGlzYTxUPihTKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgIGZvciAoY29uc3QgU3RtdCAqQ2hpbGQgOiBTLT5jaGlsZHJlbigpKQorICAgIGlmIChDaGlsZCAmJiBjb250YWluc1N0bXQ8VD4oQ2hpbGQpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGQ6OnBhaXI8Y29uc3QgY2xhbmc6OlZhckRlY2wgKiwgY29uc3QgY2xhbmc6OkV4cHIgKj4KK3BhcnNlQXNzaWdubWVudChjb25zdCBTdG10ICpTKTsKKworLy8gRG8gbm90IHJlb3JkZXIhIFRoZSBnZXRNb3N0TnVsbGFibGUgbWV0aG9kIHJlbGllcyBvbiB0aGUgb3JkZXIuCisvLyBPcHRpbWl6YXRpb246IE1vc3QgcG9pbnRlcnMgZXhwZWN0ZWQgdG8gYmUgdW5zcGVjaWZpZWQuIFdoZW4gYSBzeW1ib2wgaGFzIGFuCisvLyB1bnNwZWNpZmllZCBvciBub25udWxsIHR5cGUgbm9uIG9mIHRoZSBydWxlcyB3b3VsZCBpbmRpY2F0ZSBhbnkgcHJvYmxlbSBmb3IKKy8vIHRoYXQgc3ltYm9sLiBGb3IgdGhpcyByZWFzb24gb25seSBudWxsYWJsZSBhbmQgY29udHJhZGljdGVkIG51bGxhYmlsaXR5IGFyZQorLy8gc3RvcmVkIGZvciBhIHN5bWJvbC4gV2hlbiBhIHN5bWJvbCBpcyBhbHJlYWR5IGNvbnRyYWRpY3RlZCwgaXQgY2FuIG5vdCBiZQorLy8gY2FzdGVkIGJhY2sgdG8gbnVsbGFibGUuCitlbnVtIGNsYXNzIE51bGxhYmlsaXR5IDogY2hhciB7CisgIENvbnRyYWRpY3RlZCwgLy8gVHJhY2tlZCBudWxsYWJpbGl0eSBpcyBjb250cmFkaWN0ZWQgYnkgYW4gZXhwbGljaXQgY2FzdC4gRG8KKyAgICAgICAgICAgICAgICAvLyBub3QgcmVwb3J0IGFueSBudWxsYWJpbGl0eSByZWxhdGVkIGlzc3VlIGZvciB0aGlzIHN5bWJvbC4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIG51bGxhYmlsaXR5IGlzIHByb3BhZ2F0ZWQgYWdncmVzc2l2ZWx5IHRvIGF2b2lkIGZhbHNlCisgICAgICAgICAgICAgICAgLy8gcG9zaXRpdmUgcmVzdWx0cy4gU2VlIHRoZSBjb21tZW50IG9uIGdldE1vc3ROdWxsYWJsZSBtZXRob2QuCisgIE51bGxhYmxlLAorICBVbnNwZWNpZmllZCwKKyAgTm9ubnVsbAorfTsKKworLy8vIEdldCBudWxsYWJpbGl0eSBhbm5vdGF0aW9uIGZvciBhIGdpdmVuIHR5cGUuCitOdWxsYWJpbGl0eSBnZXROdWxsYWJpbGl0eUFubm90YXRpb24oUXVhbFR5cGUgVHlwZSk7CisKK30gLy8gZW5kIEdSIG5hbWVzcGFjZQorCit9IC8vIGVuZCBjbGFuZyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQ29uc3RyYWludE1hbmFnZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Db25zdHJhaW50TWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMWJlNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQ29uc3RyYWludE1hbmFnZXIuaApAQCAtMCwwICsxLDIwOSBAQAorLy89PT0tIENvbnN0cmFpbnRNYW5hZ2VyLmggLSBDb25zdHJhaW50cyBvbiBzeW1ib2xpYyB2YWx1ZXMuIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZWQgdGhlIGludGVyZmFjZSB0byBtYW5hZ2UgY29uc3RyYWludHMgb24gc3ltYm9saWMgdmFsdWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfQ09OU1RSQUlOVE1BTkFHRVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9DT05TVFJBSU5UTUFOQUdFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1Byb2dyYW1TdGF0ZV9Gd2QuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU1ZhbHMuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU3ltRXhwci5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NhdmVBbmRSZXN0b3JlLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQVBTSW50OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgZW50byB7CisKK2NsYXNzIFByb2dyYW1TdGF0ZU1hbmFnZXI7CitjbGFzcyBTdWJFbmdpbmU7CitjbGFzcyBTeW1ib2xSZWFwZXI7CisKK2NsYXNzIENvbmRpdGlvblRydXRoVmFsIHsKKyAgT3B0aW9uYWw8Ym9vbD4gVmFsOworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3QgYSBDb25kaXRpb25UcnV0aFZhbCBpbmRpY2F0aW5nIHRoZSBjb25zdHJhaW50IGlzIGNvbnN0cmFpbmVkCisgIC8vLyB0byBlaXRoZXIgdHJ1ZSBvciBmYWxzZSwgZGVwZW5kaW5nIG9uIHRoZSBib29sZWFuIHZhbHVlIHByb3ZpZGVkLgorICBDb25kaXRpb25UcnV0aFZhbChib29sIGNvbnN0cmFpbnQpIDogVmFsKGNvbnN0cmFpbnQpIHt9CisKKyAgLy8vIENvbnN0cnVjdCBhIENvbnN0cmFpbnRWYWwgaW5kaWNhdGluZyB0aGUgY29uc3RyYWludCBpcyB1bmRlcmNvbnN0cmFpbmVkLgorICBDb25kaXRpb25UcnV0aFZhbCgpID0gZGVmYXVsdDsKKworICAvLy8gXHJldHVybiBTdG9yZWQgdmFsdWUsIGFzc3VtaW5nIHRoYXQgdGhlIHZhbHVlIGlzIGtub3duLgorICAvLy8gQ3Jhc2hlcyBvdGhlcndpc2UuCisgIGJvb2wgZ2V0VmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuICpWYWw7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0cmFpbnQgaXMgcGVyZmVjdGx5IGNvbnN0cmFpbmVkIHRvICd0cnVlJy4KKyAgYm9vbCBpc0NvbnN0cmFpbmVkVHJ1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsLmhhc1ZhbHVlKCkgJiYgVmFsLmdldFZhbHVlKCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0cmFpbnQgaXMgcGVyZmVjdGx5IGNvbnN0cmFpbmVkIHRvICdmYWxzZScuCisgIGJvb2wgaXNDb25zdHJhaW5lZEZhbHNlKCkgY29uc3QgeworICAgIHJldHVybiBWYWwuaGFzVmFsdWUoKSAmJiAhVmFsLmdldFZhbHVlKCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0cmFpbmVkIGlzIHBlcmZlY3RseSBjb25zdHJhaW5lZC4KKyAgYm9vbCBpc0NvbnN0cmFpbmVkKCkgY29uc3QgeworICAgIHJldHVybiBWYWwuaGFzVmFsdWUoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29uc3RyYWluZWQgaXMgdW5kZXJjb25zdHJhaW5lZCBhbmQgd2UgZG8gbm90IGtub3cKKyAgLy8vIGlmIHRoZSBjb25zdHJhaW50IGlzIHRydWUgb2YgdmFsdWUuCisgIGJvb2wgaXNVbmRlcmNvbnN0cmFpbmVkKCkgY29uc3QgeworICAgIHJldHVybiAhVmFsLmhhc1ZhbHVlKCk7CisgIH0KK307CisKK2NsYXNzIENvbnN0cmFpbnRNYW5hZ2VyIHsKK3B1YmxpYzoKKyAgQ29uc3RyYWludE1hbmFnZXIoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgfkNvbnN0cmFpbnRNYW5hZ2VyKCk7CisKKyAgdmlydHVhbCBQcm9ncmFtU3RhdGVSZWYgYXNzdW1lKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZWRTVmFsIENvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFzc3VtcHRpb24pID0gMDsKKworICB1c2luZyBQcm9ncmFtU3RhdGVQYWlyID0gc3RkOjpwYWlyPFByb2dyYW1TdGF0ZVJlZiwgUHJvZ3JhbVN0YXRlUmVmPjsKKworICAvLy8gUmV0dXJucyBhIHBhaXIgb2Ygc3RhdGVzIChTdFRydWUsIFN0RmFsc2UpIHdoZXJlIHRoZSBnaXZlbiBjb25kaXRpb24gaXMKKyAgLy8vIGFzc3VtZWQgdG8gYmUgdHJ1ZSBvciBmYWxzZSwgcmVzcGVjdGl2ZWx5LgorICBQcm9ncmFtU3RhdGVQYWlyIGFzc3VtZUR1YWwoUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLCBEZWZpbmVkU1ZhbCBDb25kKSB7CisgICAgUHJvZ3JhbVN0YXRlUmVmIFN0VHJ1ZSA9IGFzc3VtZShTdGF0ZSwgQ29uZCwgdHJ1ZSk7CisKKyAgICAvLyBJZiBTdFRydWUgaXMgaW5mZWFzaWJsZSwgYXNzZXJ0aW5nIHRoZSBmYWxzZW5lc3Mgb2YgQ29uZCBpcyB1bm5lY2Vzc2FyeQorICAgIC8vIGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnN0cmFpbnRzIGFscmVhZHkgZXN0YWJsaXNoIHRoaXMuCisgICAgaWYgKCFTdFRydWUpIHsKKyNpZm5kZWYgX19PUFRJTUlaRV9fCisgICAgICAvLyBUaGlzIGNoZWNrIGlzIGV4cGVuc2l2ZSBhbmQgc2hvdWxkIGJlIGRpc2FibGVkIGV2ZW4gaW4gUmVsZWFzZStBc3NlcnRzCisgICAgICAvLyBidWlsZHMuCisgICAgICAvLyBGSVhNRTogX19PUFRJTUlaRV9fIGlzIGEgR05VIGV4dGVuc2lvbiB0aGF0IENsYW5nIGltcGxlbWVudHMgYnV0IE1TVkMKKyAgICAgIC8vIGRvZXMgbm90LiBJcyB0aGVyZSBhIGdvb2QgZXF1aXZhbGVudCB0aGVyZT8KKyAgICAgIGFzc2VydChhc3N1bWUoU3RhdGUsIENvbmQsIGZhbHNlKSAmJiAiU3lzdGVtIGlzIG92ZXIgY29uc3RyYWluZWQuIik7CisjZW5kaWYKKyAgICAgIHJldHVybiBQcm9ncmFtU3RhdGVQYWlyKChQcm9ncmFtU3RhdGVSZWYpbnVsbHB0ciwgU3RhdGUpOworICAgIH0KKworICAgIFByb2dyYW1TdGF0ZVJlZiBTdEZhbHNlID0gYXNzdW1lKFN0YXRlLCBDb25kLCBmYWxzZSk7CisgICAgaWYgKCFTdEZhbHNlKSB7CisgICAgICAvLyBXZSBhcmUgY2FyZWZ1bCB0byByZXR1cm4gdGhlIG9yaWdpbmFsIHN0YXRlLCAvbm90LyBTdFRydWUsCisgICAgICAvLyBiZWNhdXNlIHdlIHdhbnQgdG8gYXZvaWQgaGF2aW5nIGNhbGxlcnMgZ2VuZXJhdGUgYSBuZXcgbm9kZQorICAgICAgLy8gaW4gdGhlIEV4cGxvZGVkR3JhcGguCisgICAgICByZXR1cm4gUHJvZ3JhbVN0YXRlUGFpcihTdGF0ZSwgKFByb2dyYW1TdGF0ZVJlZiludWxscHRyKTsKKyAgICB9CisKKyAgICByZXR1cm4gUHJvZ3JhbVN0YXRlUGFpcihTdFRydWUsIFN0RmFsc2UpOworICB9CisKKyAgdmlydHVhbCBQcm9ncmFtU3RhdGVSZWYgYXNzdW1lSW5jbHVzaXZlUmFuZ2UoUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25Mb2MgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCAmRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBTSW50ICZUbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbkJvdW5kKSA9IDA7CisKKyAgdmlydHVhbCBQcm9ncmFtU3RhdGVQYWlyIGFzc3VtZUluY2x1c2l2ZVJhbmdlRHVhbChQcm9ncmFtU3RhdGVSZWYgU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uTG9jIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCAmRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpBUFNJbnQgJlRvKSB7CisgICAgUHJvZ3JhbVN0YXRlUmVmIFN0SW5SYW5nZSA9CisgICAgICAgIGFzc3VtZUluY2x1c2l2ZVJhbmdlKFN0YXRlLCBWYWx1ZSwgRnJvbSwgVG8sIHRydWUpOworCisgICAgLy8gSWYgU3RUcnVlIGlzIGluZmVhc2libGUsIGFzc2VydGluZyB0aGUgZmFsc2VuZXNzIG9mIENvbmQgaXMgdW5uZWNlc3NhcnkKKyAgICAvLyBiZWNhdXNlIHRoZSBleGlzdGluZyBjb25zdHJhaW50cyBhbHJlYWR5IGVzdGFibGlzaCB0aGlzLgorICAgIGlmICghU3RJblJhbmdlKQorICAgICAgcmV0dXJuIFByb2dyYW1TdGF0ZVBhaXIoKFByb2dyYW1TdGF0ZVJlZiludWxscHRyLCBTdGF0ZSk7CisKKyAgICBQcm9ncmFtU3RhdGVSZWYgU3RPdXRPZlJhbmdlID0KKyAgICAgICAgYXNzdW1lSW5jbHVzaXZlUmFuZ2UoU3RhdGUsIFZhbHVlLCBGcm9tLCBUbywgZmFsc2UpOworICAgIGlmICghU3RPdXRPZlJhbmdlKSB7CisgICAgICAvLyBXZSBhcmUgY2FyZWZ1bCB0byByZXR1cm4gdGhlIG9yaWdpbmFsIHN0YXRlLCAvbm90LyBTdFRydWUsCisgICAgICAvLyBiZWNhdXNlIHdlIHdhbnQgdG8gYXZvaWQgaGF2aW5nIGNhbGxlcnMgZ2VuZXJhdGUgYSBuZXcgbm9kZQorICAgICAgLy8gaW4gdGhlIEV4cGxvZGVkR3JhcGguCisgICAgICByZXR1cm4gUHJvZ3JhbVN0YXRlUGFpcihTdGF0ZSwgKFByb2dyYW1TdGF0ZVJlZiludWxscHRyKTsKKyAgICB9CisKKyAgICByZXR1cm4gUHJvZ3JhbVN0YXRlUGFpcihTdEluUmFuZ2UsIFN0T3V0T2ZSYW5nZSk7CisgIH0KKworICAvLy8gXGJyaWVmIElmIGEgc3ltYm9sIGlzIHBlcmZlY3RseSBjb25zdHJhaW5lZCB0byBhIGNvbnN0YW50LCBhdHRlbXB0CisgIC8vLyB0byByZXR1cm4gdGhlIGNvbmNyZXRlIHZhbHVlLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBhIENvbnN0cmFpbnRNYW5hZ2VyIGlzIG5vdCBvYmxpZ2F0ZWQgdG8gcmV0dXJuIGEgY29uY3JldGl6ZWQKKyAgLy8vIHZhbHVlIGZvciBhIHN5bWJvbCwgZXZlbiBpZiBpdCBpcyBwZXJmZWN0bHkgY29uc3RyYWluZWQuCisgIHZpcnR1YWwgY29uc3QgbGx2bTo6QVBTSW50KiBnZXRTeW1WYWwoUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFJlZiBzeW0pIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBTY2FuIGFsbCBzeW1ib2xzIHJlZmVyZW5jZWQgYnkgdGhlIGNvbnN0cmFpbnRzLiBJZiB0aGUgc3ltYm9sIGlzIG5vdAorICAvLy8gYWxpdmUsIHJlbW92ZSBpdC4KKyAgdmlydHVhbCBQcm9ncmFtU3RhdGVSZWYgcmVtb3ZlRGVhZEJpbmRpbmdzKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xSZWFwZXImIFN5bVJlYXBlcikgPSAwOworCisgIHZpcnR1YWwgdm9pZCBwcmludChQcm9ncmFtU3RhdGVSZWYgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT3V0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmwsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzZXApID0gMDsKKworICB2aXJ0dWFsIHZvaWQgRW5kUGF0aChQcm9ncmFtU3RhdGVSZWYgc3RhdGUpIHt9CisKKyAgLy8vIENvbnZlbmllbmNlIG1ldGhvZCB0byBxdWVyeSB0aGUgc3RhdGUgdG8gc2VlIGlmIGEgc3ltYm9sIGlzIG51bGwgb3IKKyAgLy8vIG5vdCBudWxsLCBvciBpZiBuZWl0aGVyIGFzc3VtcHRpb24gY2FuIGJlIG1hZGUuCisgIENvbmRpdGlvblRydXRoVmFsIGlzTnVsbChQcm9ncmFtU3RhdGVSZWYgU3RhdGUsIFN5bWJvbFJlZiBTeW0pIHsKKyAgICBTYXZlQW5kUmVzdG9yZTxib29sPiBEaXNhYmxlTm90aWZ5KE5vdGlmeUFzc3VtZUNsaWVudHMsIGZhbHNlKTsKKworICAgIHJldHVybiBjaGVja051bGwoU3RhdGUsIFN5bSk7CisgIH0KKworcHJvdGVjdGVkOgorICAvLy8gQSBmbGFnIHRvIGluZGljYXRlIHRoYXQgY2xpZW50cyBzaG91bGQgYmUgbm90aWZpZWQgb2YgYXNzdW1wdGlvbnMuCisgIC8vLyBCeSBkZWZhdWx0IHRoaXMgaXMgdGhlIGNhc2UsIGJ1dCBzb21ldGltZXMgdGhpcyBuZWVkcyB0byBiZSByZXN0cmljdGVkCisgIC8vLyB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb25zIHdpdGhpbiB0aGUgQ29uc3RyYWludE1hbmFnZXIuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgZmxhZyBhbGxvd3MgdGhlIENvbnN0cmFpbnRNYW5hZ2VyIHRvIGJlIHJlLWVudHJhbnQsCisgIC8vLyBidXQgbm90IHRocmVhZC1zYWZlLgorICBib29sIE5vdGlmeUFzc3VtZUNsaWVudHMgPSB0cnVlOworCisgIC8vLyBjYW5SZWFzb25BYm91dCAtIE5vdCBhbGwgQ29uc3RyYWludE1hbmFnZXJzIGNhbiBhY2N1cmF0ZWx5IHJlYXNvbiBhYm91dAorICAvLy8gIGFsbCBTVmFsIHZhbHVlcy4gIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgQ29uc3RyYWludE1hbmFnZXIgY2FuCisgIC8vLyAgcmVhc29uYWJseSBoYW5kbGUgYSBnaXZlbiBTVmFsIHZhbHVlLiAgVGhpcyBpcyB0eXBpY2FsbHkgcXVlcmllZCBieQorICAvLy8gIEV4cHJFbmdpbmUgdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBhCisgIC8vLyAgY29uanVyZWQgc3ltYm9saWMgdmFsdWUgaW4gb3JkZXIgdG8gcmVjb3ZlciBzb21lIHByZWNpc2lvbi4KKyAgdmlydHVhbCBib29sIGNhblJlYXNvbkFib3V0KFNWYWwgWCkgY29uc3QgPSAwOworCisgIC8vLyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGEgc3ltYm9sIGlzIGtub3duIHRvIGJlIG51bGwgKCJ0cnVlIiksIGtub3duIHRvIGJlCisgIC8vLyBub24tbnVsbCAoImZhbHNlIiksIG9yIG1heSBiZSBlaXRoZXIgKCJ1bmRlcmNvbnN0cmFpbmVkIikuCisgIHZpcnR1YWwgQ29uZGl0aW9uVHJ1dGhWYWwgY2hlY2tOdWxsKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwgU3ltYm9sUmVmIFN5bSk7Cit9OworCitzdGQ6OnVuaXF1ZV9wdHI8Q29uc3RyYWludE1hbmFnZXI+CitDcmVhdGVSYW5nZUNvbnN0cmFpbnRNYW5hZ2VyKFByb2dyYW1TdGF0ZU1hbmFnZXIgJnN0YXRlbWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJFbmdpbmUgKnN1YmVuZ2luZSk7CisKK3N0ZDo6dW5pcXVlX3B0cjxDb25zdHJhaW50TWFuYWdlcj4KK0NyZWF0ZVozQ29uc3RyYWludE1hbmFnZXIoUHJvZ3JhbVN0YXRlTWFuYWdlciAmc3RhdGVtZ3IsIFN1YkVuZ2luZSAqc3ViZW5naW5lKTsKKworfSAvLyBuYW1lc3BhY2UgZW50bworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX0NPTlNUUkFJTlRNQU5BR0VSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Db3JlRW5naW5lLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQ29yZUVuZ2luZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNDc5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQ29yZUVuZ2luZS5oCkBAIC0wLDAgKzEsNTc1IEBACisvLz09PS0gQ29yZUVuZ2luZS5oIC0gUGF0aC1TZW5zaXRpdmUgRGF0YWZsb3cgRW5naW5lIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyBhIGdlbmVyaWMgZW5naW5lIGZvciBpbnRyYXByb2NlZHVyYWwsIHBhdGgtc2Vuc2l0aXZlLAorLy8gIGRhdGFmbG93IGFuYWx5c2lzIHZpYSBncmFwaCByZWFjaGFiaWxpdHkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9DT1JFRU5HSU5FX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfQ09SRUVOR0lORV9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdC5oIgorI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0FuYWx5c2lzRGVjbENvbnRleHQuaCIKKyNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9DRkcuaCIKKyNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9Qcm9ncmFtUG9pbnQuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0Jsb2NrQ291bnRlci5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9FeHBsb2RlZEdyYXBoLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1Byb2dyYW1TdGF0ZV9Gd2QuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvV29ya0xpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEFuYWx5emVyT3B0aW9uczsKK2NsYXNzIENYWEJpbmRUZW1wb3JhcnlFeHByOworY2xhc3MgRXhwcjsKK2NsYXNzIExhYmVsRGVjbDsKKworbmFtZXNwYWNlIGVudG8geworCitjbGFzcyBGdW5jdGlvblN1bW1hcmllc1R5OworY2xhc3MgU3ViRW5naW5lOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIENvcmVFbmdpbmUgLSBJbXBsZW1lbnRzIHRoZSBjb3JlIGxvZ2ljIG9mIHRoZSBncmFwaC1yZWFjaGFiaWxpdHkKKy8vLyAgIGFuYWx5c2lzLiBJdCB0cmF2ZXJzZXMgdGhlIENGRyBhbmQgZ2VuZXJhdGVzIHRoZSBFeHBsb2RlZEdyYXBoLgorLy8vICAgUHJvZ3JhbSAic3RhdGVzIiBhcmUgdHJlYXRlZCBhcyBvcGFxdWUgdm9pZCBwb2ludGVycy4KKy8vLyAgIFRoZSB0ZW1wbGF0ZSBjbGFzcyBDb3JlRW5naW5lICh3aGljaCBzdWJjbGFzc2VzIENvcmVFbmdpbmUpCisvLy8gICBwcm92aWRlcyB0aGUgbWF0Y2hpbmcgY29tcG9uZW50IHRvIHRoZSBlbmdpbmUgdGhhdCBrbm93cyB0aGUgYWN0dWFsIHR5cGVzCisvLy8gICBmb3Igc3RhdGVzLiAgTm90ZSB0aGF0IHRoaXMgZW5naW5lIG9ubHkgZGlzcGF0Y2hlcyB0byB0cmFuc2ZlciBmdW5jdGlvbnMKKy8vLyAgIGF0IHRoZSBzdGF0ZW1lbnQgYW5kIGJsb2NrLWxldmVsLiAgVGhlIGFuYWx5c2VzIHRoZW1zZWx2ZXMgbXVzdCBpbXBsZW1lbnQKKy8vLyAgIGFueSB0cmFuc2ZlciBmdW5jdGlvbiBsb2dpYyBhbmQgdGhlIHN1Yi1leHByZXNzaW9uIGxldmVsIChpZiBhbnkpLgorY2xhc3MgQ29yZUVuZ2luZSB7CisgIGZyaWVuZCBjbGFzcyBDb21tb25Ob2RlQnVpbGRlcjsKKyAgZnJpZW5kIGNsYXNzIEVuZE9mRnVuY3Rpb25Ob2RlQnVpbGRlcjsKKyAgZnJpZW5kIGNsYXNzIEV4cHJFbmdpbmU7CisgIGZyaWVuZCBjbGFzcyBJbmRpcmVjdEdvdG9Ob2RlQnVpbGRlcjsKKyAgZnJpZW5kIGNsYXNzIE5vZGVCdWlsZGVyOworICBmcmllbmQgc3RydWN0IE5vZGVCdWlsZGVyQ29udGV4dDsKKyAgZnJpZW5kIGNsYXNzIFN3aXRjaE5vZGVCdWlsZGVyOworCitwdWJsaWM6CisgIHVzaW5nIEJsb2Nrc0V4aGF1c3RlZCA9CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8QmxvY2tFZGdlLCBjb25zdCBFeHBsb2RlZE5vZGUgKj4+OworICAKKyAgdXNpbmcgQmxvY2tzQWJvcnRlZCA9CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgQ0ZHQmxvY2sgKiwgY29uc3QgRXhwbG9kZWROb2RlICo+PjsKKworcHJpdmF0ZToKKyAgU3ViRW5naW5lICZTdWJFbmc7CisKKyAgLy8vIEcgLSBUaGUgc2ltdWxhdGlvbiBncmFwaC4gIEVhY2ggbm9kZSBpcyBhIChsb2NhdGlvbixzdGF0ZSkgcGFpci4KKyAgbXV0YWJsZSBFeHBsb2RlZEdyYXBoIEc7CisKKyAgLy8vIFdMaXN0IC0gQSBzZXQgb2YgcXVldWVkIG5vZGVzIHRoYXQgbmVlZCB0byBiZSBwcm9jZXNzZWQgYnkgdGhlCisgIC8vLyAgd29ya2xpc3QgYWxnb3JpdGhtLiAgSXQgaXMgdXAgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIFdMaXN0IHRvIGRlY2lkZQorICAvLy8gIHRoZSBvcmRlciB0aGF0IG5vZGVzIGFyZSBwcm9jZXNzZWQuCisgIHN0ZDo6dW5pcXVlX3B0cjxXb3JrTGlzdD4gV0xpc3Q7CisKKyAgLy8vIEJDb3VudGVyRmFjdG9yeSAtIEEgZmFjdG9yeSBvYmplY3QgZm9yIGNyZWF0ZWQgQmxvY2tDb3VudGVyIG9iamVjdHMuCisgIC8vLyAgIFRoZXNlIGFyZSB1c2VkIHRvIHJlY29yZCBmb3Iga2V5IG5vZGVzIGluIHRoZSBFeHBsb2RlZEdyYXBoIHRoZQorICAvLy8gICBudW1iZXIgb2YgdGltZXMgZGlmZmVyZW50IENGR0Jsb2NrcyBoYXZlIGJlZW4gdmlzaXRlZCBhbG9uZyBhIHBhdGguCisgIEJsb2NrQ291bnRlcjo6RmFjdG9yeSBCQ291bnRlckZhY3Rvcnk7CisKKyAgLy8vIFRoZSBsb2NhdGlvbnMgd2hlcmUgd2Ugc3RvcHBlZCBkb2luZyB3b3JrIGJlY2F1c2Ugd2UgdmlzaXRlZCBhIGxvY2F0aW9uCisgIC8vLyAgdG9vIG1hbnkgdGltZXMuCisgIEJsb2Nrc0V4aGF1c3RlZCBibG9ja3NFeGhhdXN0ZWQ7CisgIAorICAvLy8gVGhlIGxvY2F0aW9ucyB3aGVyZSB3ZSBzdG9wcGVkIGJlY2F1c2UgdGhlIGVuZ2luZSBhYm9ydGVkIGFuYWx5c2lzLAorICAvLy8gdXN1YWxseSBiZWNhdXNlIGl0IGNvdWxkIG5vdCByZWFzb24gYWJvdXQgc29tZXRoaW5nLgorICBCbG9ja3NBYm9ydGVkIGJsb2Nrc0Fib3J0ZWQ7CisKKyAgLy8vIFRoZSBpbmZvcm1hdGlvbiBhYm91dCBmdW5jdGlvbnMgc2hhcmVkIGJ5IHRoZSB3aG9sZSB0cmFuc2xhdGlvbiB1bml0LgorICAvLy8gKFRoaXMgZGF0YSBpcyBvd25lZCBieSBBbmFseXNpc0NvbnN1bWVyLikKKyAgRnVuY3Rpb25TdW1tYXJpZXNUeSAqRnVuY3Rpb25TdW1tYXJpZXM7CisKKyAgdm9pZCBnZW5lcmF0ZU5vZGUoY29uc3QgUHJvZ3JhbVBvaW50ICZMb2MsCisgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlICpQcmVkKTsKKworICB2b2lkIEhhbmRsZUJsb2NrRWRnZShjb25zdCBCbG9ja0VkZ2UgJkUsIEV4cGxvZGVkTm9kZSAqUHJlZCk7CisgIHZvaWQgSGFuZGxlQmxvY2tFbnRyYW5jZShjb25zdCBCbG9ja0VudHJhbmNlICZFLCBFeHBsb2RlZE5vZGUgKlByZWQpOworICB2b2lkIEhhbmRsZUJsb2NrRXhpdChjb25zdCBDRkdCbG9jayAqQiwgRXhwbG9kZWROb2RlICpQcmVkKTsKKworICB2b2lkIEhhbmRsZUNhbGxFbnRlcihjb25zdCBDYWxsRW50ZXIgJkNFLCBFeHBsb2RlZE5vZGUgKlByZWQpOworCisgIHZvaWQgSGFuZGxlUG9zdFN0bXQoY29uc3QgQ0ZHQmxvY2sgKkIsIHVuc2lnbmVkIFN0bXRJZHgsIEV4cGxvZGVkTm9kZSAqUHJlZCk7CisKKyAgdm9pZCBIYW5kbGVCcmFuY2goY29uc3QgU3RtdCAqQ29uZCwgY29uc3QgU3RtdCAqVGVybSwgY29uc3QgQ0ZHQmxvY2sgKkIsCisgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCk7CisgIHZvaWQgSGFuZGxlQ2xlYW51cFRlbXBvcmFyeUJyYW5jaChjb25zdCBDWFhCaW5kVGVtcG9yYXJ5RXhwciAqQlRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZHQmxvY2sgKkIsIEV4cGxvZGVkTm9kZSAqUHJlZCk7CisKKyAgLy8vIEhhbmRsZSBjb25kaXRpb25hbCBsb2dpYyBmb3IgcnVubmluZyBzdGF0aWMgaW5pdGlhbGl6ZXJzLgorICB2b2lkIEhhbmRsZVN0YXRpY0luaXQoY29uc3QgRGVjbFN0bXQgKkRTLCBjb25zdCBDRkdCbG9jayAqQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCk7CisKK3ByaXZhdGU6CisgIEV4cGxvZGVkTm9kZSAqZ2VuZXJhdGVDYWxsRXhpdEJlZ2luTm9kZShFeHBsb2RlZE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXR1cm5TdG10ICpSUyk7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdCBhIENvcmVFbmdpbmUgb2JqZWN0IHRvIGFuYWx5emUgdGhlIHByb3ZpZGVkIENGRy4KKyAgQ29yZUVuZ2luZShTdWJFbmdpbmUgJnN1YmVuZ2luZSwKKyAgICAgICAgICAgICBGdW5jdGlvblN1bW1hcmllc1R5ICpGUywKKyAgICAgICAgICAgICBBbmFseXplck9wdGlvbnMgJk9wdHMpOworCisgIENvcmVFbmdpbmUoY29uc3QgQ29yZUVuZ2luZSAmKSA9IGRlbGV0ZTsKKyAgQ29yZUVuZ2luZSAmb3BlcmF0b3I9KGNvbnN0IENvcmVFbmdpbmUgJikgPSBkZWxldGU7CisKKyAgLy8vIGdldEdyYXBoIC0gUmV0dXJucyB0aGUgZXhwbG9kZWQgZ3JhcGguCisgIEV4cGxvZGVkR3JhcGggJmdldEdyYXBoKCkgeyByZXR1cm4gRzsgfQorCisgIC8vLyBFeGVjdXRlV29ya0xpc3QgLSBSdW4gdGhlIHdvcmtsaXN0IGFsZ29yaXRobSBmb3IgYSBtYXhpbXVtIG51bWJlciBvZgorICAvLy8gIHN0ZXBzLiAgUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIHN0aWxsIHNpbXVsYXRpb24gc3RhdGUgb24gdGhlIHdvcmtsaXN0LgorICBib29sIEV4ZWN1dGVXb3JrTGlzdChjb25zdCBMb2NhdGlvbkNvbnRleHQgKkwsIHVuc2lnbmVkIFN0ZXBzLAorICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RhdGVSZWYgSW5pdFN0YXRlKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIHN0aWxsIHNpbXVsYXRpb24gc3RhdGUgb24gdGhlIHdvcmtsaXN0LgorICBib29sIEV4ZWN1dGVXb3JrTGlzdFdpdGhJbml0aWFsU3RhdGUoY29uc3QgTG9jYXRpb25Db250ZXh0ICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3RlcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RhdGVSZWYgSW5pdFN0YXRlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0KTsKKworICAvLy8gRGlzcGF0Y2ggdGhlIHdvcmsgbGlzdCBpdGVtIGJhc2VkIG9uIHRoZSBnaXZlbiBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKyAgLy8vIFVzZSBQcmVkIHBhcmFtZXRlciBhcyB0aGUgcHJlZGVjZXNzb3Igc3RhdGUuCisgIHZvaWQgZGlzcGF0Y2hXb3JrSXRlbShFeHBsb2RlZE5vZGUqIFByZWQsIFByb2dyYW1Qb2ludCBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JrTGlzdFVuaXQmIFdVKTsKKworICAvLyBGdW5jdGlvbnMgZm9yIGV4dGVybmFsIGNoZWNraW5nIG9mIHdoZXRoZXIgd2UgaGF2ZSB1bmZpbmlzaGVkIHdvcmsKKyAgYm9vbCB3YXNCbG9ja0Fib3J0ZWQoKSBjb25zdCB7IHJldHVybiAhYmxvY2tzQWJvcnRlZC5lbXB0eSgpOyB9CisgIGJvb2wgd2FzQmxvY2tzRXhoYXVzdGVkKCkgY29uc3QgeyByZXR1cm4gIWJsb2Nrc0V4aGF1c3RlZC5lbXB0eSgpOyB9CisgIGJvb2wgaGFzV29ya1JlbWFpbmluZygpIGNvbnN0IHsgcmV0dXJuIHdhc0Jsb2Nrc0V4aGF1c3RlZCgpIHx8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTGlzdC0+aGFzV29yaygpIHx8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNCbG9ja0Fib3J0ZWQoKTsgfQorCisgIC8vLyBJbmZvcm0gdGhlIENvcmVFbmdpbmUgdGhhdCBhIGJhc2ljIGJsb2NrIHdhcyBhYm9ydGVkIGJlY2F1c2UKKyAgLy8vIGl0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWx5IGFuYWx5emVkLgorICB2b2lkIGFkZEFib3J0ZWRCbG9jayhjb25zdCBFeHBsb2RlZE5vZGUgKm5vZGUsIGNvbnN0IENGR0Jsb2NrICpibG9jaykgeworICAgIGJsb2Nrc0Fib3J0ZWQucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGJsb2NrLCBub2RlKSk7CisgIH0KKyAgCisgIFdvcmtMaXN0ICpnZXRXb3JrTGlzdCgpIGNvbnN0IHsgcmV0dXJuIFdMaXN0LmdldCgpOyB9CisKKyAgQmxvY2tzRXhoYXVzdGVkOjpjb25zdF9pdGVyYXRvciBibG9ja3NfZXhoYXVzdGVkX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBibG9ja3NFeGhhdXN0ZWQuYmVnaW4oKTsKKyAgfQorCisgIEJsb2Nrc0V4aGF1c3RlZDo6Y29uc3RfaXRlcmF0b3IgYmxvY2tzX2V4aGF1c3RlZF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGJsb2Nrc0V4aGF1c3RlZC5lbmQoKTsKKyAgfQorCisgIEJsb2Nrc0Fib3J0ZWQ6OmNvbnN0X2l0ZXJhdG9yIGJsb2Nrc19hYm9ydGVkX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBibG9ja3NBYm9ydGVkLmJlZ2luKCk7CisgIH0KKworICBCbG9ja3NBYm9ydGVkOjpjb25zdF9pdGVyYXRvciBibG9ja3NfYWJvcnRlZF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGJsb2Nrc0Fib3J0ZWQuZW5kKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEVucXVldWUgdGhlIGdpdmVuIHNldCBvZiBub2RlcyBvbnRvIHRoZSB3b3JrIGxpc3QuCisgIHZvaWQgZW5xdWV1ZShFeHBsb2RlZE5vZGVTZXQgJlNldCk7CisKKyAgLy8vIFxicmllZiBFbnF1ZXVlIG5vZGVzIHRoYXQgd2VyZSBjcmVhdGVkIGFzIGEgcmVzdWx0IG9mIHByb2Nlc3NpbmcKKyAgLy8vIGEgc3RhdGVtZW50IG9udG8gdGhlIHdvcmsgbGlzdC4KKyAgdm9pZCBlbnF1ZXVlKEV4cGxvZGVkTm9kZVNldCAmU2V0LCBjb25zdCBDRkdCbG9jayAqQmxvY2ssIHVuc2lnbmVkIElkeCk7CisKKyAgLy8vIFxicmllZiBlbnF1ZXVlIHRoZSBub2RlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQgb2YgZnVuY3Rpb24gb250byB0aGUKKyAgLy8vIGVuZCBvZiBwYXRoIC8gd29yayBsaXN0LgorICB2b2lkIGVucXVldWVFbmRPZkZ1bmN0aW9uKEV4cGxvZGVkTm9kZVNldCAmU2V0LCBjb25zdCBSZXR1cm5TdG10ICpSUyk7CisKKyAgLy8vIFxicmllZiBFbnF1ZXVlIGEgc2luZ2xlIG5vZGUgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiBzdGF0ZW1lbnQgcHJvY2Vzc2luZy4KKyAgdm9pZCBlbnF1ZXVlU3RtdE5vZGUoRXhwbG9kZWROb2RlICpOLCBjb25zdCBDRkdCbG9jayAqQmxvY2ssIHVuc2lnbmVkIElkeCk7Cit9OworCisvLyBUT0RPOiBUdXJuIGludG8gYSBjYWxzcy4KK3N0cnVjdCBOb2RlQnVpbGRlckNvbnRleHQgeworICBjb25zdCBDb3JlRW5naW5lICZFbmc7CisgIGNvbnN0IENGR0Jsb2NrICpCbG9jazsKKyAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQzsKKworICBOb2RlQnVpbGRlckNvbnRleHQoY29uc3QgQ29yZUVuZ2luZSAmRSwgY29uc3QgQ0ZHQmxvY2sgKkIsIEV4cGxvZGVkTm9kZSAqTikKKyAgICAgIDogRW5nKEUpLCBCbG9jayhCKSwgTEMoTi0+Z2V0TG9jYXRpb25Db250ZXh0KCkpIHsgYXNzZXJ0KEIpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIENGR0Jsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1aWxkZXIuCisgIGNvbnN0IENGR0Jsb2NrICpnZXRCbG9jaygpIGNvbnN0IHsgcmV0dXJuIEJsb2NrOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGN1cnJlbnQgYmFzaWMgYmxvY2sgaGFzIGJlZW4KKyAgLy8vIHZpc2l0ZWQgb24gdGhlIGV4cGxvZGVkIGdyYXBoIHBhdGguCisgIHVuc2lnbmVkIGJsb2NrQ291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIEVuZy5XTGlzdC0+Z2V0QmxvY2tDb3VudGVyKCkuZ2V0TnVtVmlzaXRlZCgKKyAgICAgICAgICAgICAgICAgICAgTEMtPmdldEN1cnJlbnRTdGFja0ZyYW1lKCksCisgICAgICAgICAgICAgICAgICAgIEJsb2NrLT5nZXRCbG9ja0lEKCkpOworICB9Cit9OworCisvLy8gXGNsYXNzIE5vZGVCdWlsZGVyCisvLy8gXGJyaWVmIFRoaXMgaXMgdGhlIHNpbXBsZXN0IGJ1aWxkZXIgd2hpY2ggZ2VuZXJhdGVzIG5vZGVzIGluIHRoZQorLy8vIEV4cGxvZGVkR3JhcGguCisvLy8KKy8vLyBUaGUgbWFpbiBiZW5lZml0IG9mIHRoZSBidWlsZGVyIGlzIHRoYXQgaXQgYXV0b21hdGljYWxseSB0cmFja3MgdGhlCisvLy8gZnJvbnRpZXIgbm9kZXMgKG9yIGRlc3RpbmF0aW9uIHNldCkuIFRoaXMgaXMgdGhlIHNldCBvZiBub2RlcyB3aGljaCBzaG91bGQKKy8vLyBiZSBwcm9wYWdhdGVkIHRvIHRoZSBuZXh0IHN0ZXAgLyBidWlsZGVyLiBUaGV5IGFyZSB0aGUgbm9kZXMgd2hpY2ggaGF2ZSBiZWVuCisvLy8gYWRkZWQgdG8gdGhlIGJ1aWxkZXIgKGVpdGhlciBhcyB0aGUgaW5wdXQgbm9kZSBzZXQgb3IgYXMgdGhlIG5ld2x5CisvLy8gY29uc3RydWN0ZWQgbm9kZXMpIGJ1dCBkaWQgbm90IGhhdmUgYW55IG91dGdvaW5nIHRyYW5zaXRpb25zIGFkZGVkLgorY2xhc3MgTm9kZUJ1aWxkZXIgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgTm9kZUJ1aWxkZXJDb250ZXh0ICZDOworCisgIC8vLyBTcGVjaWZpZXMgaWYgdGhlIGJ1aWxkZXIgcmVzdWx0cyBoYXZlIGJlZW4gZmluYWxpemVkLiBGb3IgZXhhbXBsZSwgaWYgaXQKKyAgLy8vIGlzIHNldCB0byBmYWxzZSwgYXV0b3RyYW5zaXRpb25zIGFyZSB5ZXQgdG8gYmUgZ2VuZXJhdGVkLgorICBib29sIEZpbmFsaXplZDsKKworICBib29sIEhhc0dlbmVyYXRlZE5vZGVzID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBUaGUgZnJvbnRpZXIgc2V0IC0gYSBzZXQgb2Ygbm9kZXMgd2hpY2ggbmVlZCB0byBiZSBwcm9wYWdhdGVkIGFmdGVyCisgIC8vLyB0aGUgYnVpbGRlciBkaWVzLgorICBFeHBsb2RlZE5vZGVTZXQgJkZyb250aWVyOworCisgIC8vLyBDaGVja2VzIGlmIHRoZSByZXN1bHRzIGFyZSByZWFkeS4KKyAgdmlydHVhbCBib29sIGNoZWNrUmVzdWx0cygpIHsKKyAgICByZXR1cm4gRmluYWxpemVkOworICB9CisKKyAgYm9vbCBoYXNOb1NpbmtzSW5Gcm9udGllcigpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gIEkgOiBGcm9udGllcikKKyAgICAgIGlmIChJLT5pc1NpbmsoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIEFsbG93IHN1YmNsYXNzZXMgdG8gZmluYWxpemUgcmVzdWx0cyBiZWZvcmUgcmVzdWx0X2JlZ2luKCkgaXMgZXhlY3V0ZWQuCisgIHZpcnR1YWwgdm9pZCBmaW5hbGl6ZVJlc3VsdHMoKSB7fQorICAKKyAgRXhwbG9kZWROb2RlICpnZW5lcmF0ZU5vZGVJbXBsKGNvbnN0IFByb2dyYW1Qb2ludCAmUFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RhdGVSZWYgU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE1hcmtBc1NpbmsgPSBmYWxzZSk7CisKK3B1YmxpYzoKKyAgTm9kZUJ1aWxkZXIoRXhwbG9kZWROb2RlICpTcmNOb2RlLCBFeHBsb2RlZE5vZGVTZXQgJkRzdFNldCwKKyAgICAgICAgICAgICAgY29uc3QgTm9kZUJ1aWxkZXJDb250ZXh0ICZDdHgsIGJvb2wgRiA9IHRydWUpCisgICAgICA6IEMoQ3R4KSwgRmluYWxpemVkKEYpLCBGcm9udGllcihEc3RTZXQpIHsKKyAgICBGcm9udGllci5BZGQoU3JjTm9kZSk7CisgIH0KKworICBOb2RlQnVpbGRlcihjb25zdCBFeHBsb2RlZE5vZGVTZXQgJlNyY1NldCwgRXhwbG9kZWROb2RlU2V0ICZEc3RTZXQsCisgICAgICAgICAgICAgIGNvbnN0IE5vZGVCdWlsZGVyQ29udGV4dCAmQ3R4LCBib29sIEYgPSB0cnVlKQorICAgICAgOiBDKEN0eCksIEZpbmFsaXplZChGKSwgRnJvbnRpZXIoRHN0U2V0KSB7CisgICAgRnJvbnRpZXIuaW5zZXJ0KFNyY1NldCk7CisgICAgYXNzZXJ0KGhhc05vU2lua3NJbkZyb250aWVyKCkpOworICB9CisKKyAgdmlydHVhbCB+Tm9kZUJ1aWxkZXIoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBHZW5lcmF0ZXMgYSBub2RlIGluIHRoZSBFeHBsb2RlZEdyYXBoLgorICBFeHBsb2RlZE5vZGUgKmdlbmVyYXRlTm9kZShjb25zdCBQcm9ncmFtUG9pbnQgJlBQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RhdGVSZWYgU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCkgeworICAgIHJldHVybiBnZW5lcmF0ZU5vZGVJbXBsKFBQLCBTdGF0ZSwgUHJlZCwgZmFsc2UpOworICB9CisKKyAgLy8vIFxicmllZiBHZW5lcmF0ZXMgYSBzaW5rIGluIHRoZSBFeHBsb2RlZEdyYXBoLgorICAvLy8KKyAgLy8vIFdoZW4gYSBub2RlIGlzIG1hcmtlZCBhcyBzaW5rLCB0aGUgZXhwbG9yYXRpb24gZnJvbSB0aGUgbm9kZSBpcyBzdG9wcGVkIC0KKyAgLy8vIHRoZSBub2RlIGJlY29tZXMgdGhlIGxhc3Qgbm9kZSBvbiB0aGUgcGF0aCBhbmQgY2VydGFpbiBraW5kcyBvZiBidWdzIGFyZQorICAvLy8gc3VwcHJlc3NlZC4KKyAgRXhwbG9kZWROb2RlICpnZW5lcmF0ZVNpbmsoY29uc3QgUHJvZ3JhbVBvaW50ICZQUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQpIHsKKyAgICByZXR1cm4gZ2VuZXJhdGVOb2RlSW1wbChQUCwgU3RhdGUsIFByZWQsIHRydWUpOworICB9CisKKyAgY29uc3QgRXhwbG9kZWROb2RlU2V0ICZnZXRSZXN1bHRzKCkgeworICAgIGZpbmFsaXplUmVzdWx0cygpOworICAgIGFzc2VydChjaGVja1Jlc3VsdHMoKSk7CisgICAgcmV0dXJuIEZyb250aWVyOworICB9CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBFeHBsb2RlZE5vZGVTZXQ6Oml0ZXJhdG9yOworCisgIC8vLyBcYnJpZWYgSXRlcmF0b3JzIHRocm91Z2ggdGhlIHJlc3VsdHMgZnJvbnRpZXIuCisgIGl0ZXJhdG9yIGJlZ2luKCkgeworICAgIGZpbmFsaXplUmVzdWx0cygpOworICAgIGFzc2VydChjaGVja1Jlc3VsdHMoKSk7CisgICAgcmV0dXJuIEZyb250aWVyLmJlZ2luKCk7CisgIH0KKworICBpdGVyYXRvciBlbmQoKSB7CisgICAgZmluYWxpemVSZXN1bHRzKCk7CisgICAgcmV0dXJuIEZyb250aWVyLmVuZCgpOworICB9CisKKyAgY29uc3QgTm9kZUJ1aWxkZXJDb250ZXh0ICZnZXRDb250ZXh0KCkgeyByZXR1cm4gQzsgfQorICBib29sIGhhc0dlbmVyYXRlZE5vZGVzKCkgeyByZXR1cm4gSGFzR2VuZXJhdGVkTm9kZXM7IH0KKworICB2b2lkIHRha2VOb2Rlcyhjb25zdCBFeHBsb2RlZE5vZGVTZXQgJlMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gSSA6IFMpCisgICAgICBGcm9udGllci5lcmFzZShJKTsKKyAgfQorCisgIHZvaWQgdGFrZU5vZGVzKEV4cGxvZGVkTm9kZSAqTikgeyBGcm9udGllci5lcmFzZShOKTsgfQorICB2b2lkIGFkZE5vZGVzKGNvbnN0IEV4cGxvZGVkTm9kZVNldCAmUykgeyBGcm9udGllci5pbnNlcnQoUyk7IH0KKyAgdm9pZCBhZGROb2RlcyhFeHBsb2RlZE5vZGUgKk4pIHsgRnJvbnRpZXIuQWRkKE4pOyB9Cit9OworCisvLy8gXGNsYXNzIE5vZGVCdWlsZGVyV2l0aFNpbmtzCisvLy8gXGJyaWVmIFRoaXMgbm9kZSBidWlsZGVyIGtlZXBzIHRyYWNrIG9mIHRoZSBnZW5lcmF0ZWQgc2luayBub2Rlcy4KK2NsYXNzIE5vZGVCdWlsZGVyV2l0aFNpbmtzOiBwdWJsaWMgTm9kZUJ1aWxkZXIgeworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgIFNtYWxsVmVjdG9yPEV4cGxvZGVkTm9kZSosIDI+IHNpbmtzR2VuZXJhdGVkOworICBQcm9ncmFtUG9pbnQgJkxvY2F0aW9uOworCitwdWJsaWM6CisgIE5vZGVCdWlsZGVyV2l0aFNpbmtzKEV4cGxvZGVkTm9kZSAqUHJlZCwgRXhwbG9kZWROb2RlU2V0ICZEc3RTZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5vZGVCdWlsZGVyQ29udGV4dCAmQ3R4LCBQcm9ncmFtUG9pbnQgJkwpCisgICAgICA6IE5vZGVCdWlsZGVyKFByZWQsIERzdFNldCwgQ3R4KSwgTG9jYXRpb24oTCkge30KKworICBFeHBsb2RlZE5vZGUgKmdlbmVyYXRlTm9kZShQcm9ncmFtU3RhdGVSZWYgU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZ3JhbVBvaW50VGFnICpUYWcgPSBudWxscHRyKSB7CisgICAgY29uc3QgUHJvZ3JhbVBvaW50ICZMb2NhbExvYyA9IChUYWcgPyBMb2NhdGlvbi53aXRoVGFnKFRhZykgOiBMb2NhdGlvbik7CisgICAgcmV0dXJuIE5vZGVCdWlsZGVyOjpnZW5lcmF0ZU5vZGUoTG9jYWxMb2MsIFN0YXRlLCBQcmVkKTsKKyAgfQorCisgIEV4cGxvZGVkTm9kZSAqZ2VuZXJhdGVTaW5rKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwgRXhwbG9kZWROb2RlICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKlRhZyA9IG51bGxwdHIpIHsKKyAgICBjb25zdCBQcm9ncmFtUG9pbnQgJkxvY2FsTG9jID0gKFRhZyA/IExvY2F0aW9uLndpdGhUYWcoVGFnKSA6IExvY2F0aW9uKTsKKyAgICBFeHBsb2RlZE5vZGUgKk4gPSBOb2RlQnVpbGRlcjo6Z2VuZXJhdGVTaW5rKExvY2FsTG9jLCBTdGF0ZSwgUHJlZCk7CisgICAgaWYgKE4gJiYgTi0+aXNTaW5rKCkpCisgICAgICBzaW5rc0dlbmVyYXRlZC5wdXNoX2JhY2soTik7CisgICAgcmV0dXJuIE47CisgIH0KKworICBjb25zdCBTbWFsbFZlY3RvckltcGw8RXhwbG9kZWROb2RlKj4gJmdldFNpbmtzKCkgY29uc3QgeworICAgIHJldHVybiBzaW5rc0dlbmVyYXRlZDsKKyAgfQorfTsKKworLy8vIFxjbGFzcyBTdG10Tm9kZUJ1aWxkZXIKKy8vLyBcYnJpZWYgVGhpcyBidWlsZGVyIGNsYXNzIGlzIHVzZWZ1bCBmb3IgZ2VuZXJhdGluZyBub2RlcyB0aGF0IHJlc3VsdGVkIGZyb20KKy8vLyB2aXNpdGluZyBhIHN0YXRlbWVudC4gVGhlIG1haW4gZGlmZmVyZW5jZSBmcm9tIGl0cyBwYXJlbnQgTm9kZUJ1aWxkZXIgaXMKKy8vLyB0aGF0IGl0IGNyZWF0ZXMgYSBzdGF0ZW1lbnQgc3BlY2lmaWMgUHJvZ3JhbVBvaW50LgorY2xhc3MgU3RtdE5vZGVCdWlsZGVyOiBwdWJsaWMgTm9kZUJ1aWxkZXIgeworICBOb2RlQnVpbGRlciAqRW5jbG9zaW5nQmxkcjsKKworcHVibGljOgorICAvLy8gXGJyaWVmIENvbnN0cnVjdHMgYSBTdG10Tm9kZUJ1aWxkZXIuIElmIHRoZSBidWlsZGVyIGlzIGdvaW5nIHRvIHByb2Nlc3MKKyAgLy8vIG5vZGVzIGN1cnJlbnRseSBvd25lZCBieSBhbm90aGVyIGJ1aWxkZXIod2l0aCBsYXJnZXIgc2NvcGUpLCB1c2UKKyAgLy8vIEVuY2xvc2luZyBidWlsZGVyIHRvIHRyYW5zZmVyIG93bmVyc2hpcC4KKyAgU3RtdE5vZGVCdWlsZGVyKEV4cGxvZGVkTm9kZSAqU3JjTm9kZSwgRXhwbG9kZWROb2RlU2V0ICZEc3RTZXQsCisgICAgICAgICAgICAgICAgICBjb25zdCBOb2RlQnVpbGRlckNvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgICAgIE5vZGVCdWlsZGVyICpFbmNsb3NpbmcgPSBudWxscHRyKQorICAgICAgOiBOb2RlQnVpbGRlcihTcmNOb2RlLCBEc3RTZXQsIEN0eCksIEVuY2xvc2luZ0JsZHIoRW5jbG9zaW5nKSB7CisgICAgaWYgKEVuY2xvc2luZ0JsZHIpCisgICAgICBFbmNsb3NpbmdCbGRyLT50YWtlTm9kZXMoU3JjTm9kZSk7CisgIH0KKworICBTdG10Tm9kZUJ1aWxkZXIoRXhwbG9kZWROb2RlU2V0ICZTcmNTZXQsIEV4cGxvZGVkTm9kZVNldCAmRHN0U2V0LAorICAgICAgICAgICAgICAgICAgY29uc3QgTm9kZUJ1aWxkZXJDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICBOb2RlQnVpbGRlciAqRW5jbG9zaW5nID0gbnVsbHB0cikKKyAgICAgIDogTm9kZUJ1aWxkZXIoU3JjU2V0LCBEc3RTZXQsIEN0eCksIEVuY2xvc2luZ0JsZHIoRW5jbG9zaW5nKSB7CisgICAgaWYgKEVuY2xvc2luZ0JsZHIpCisgICAgICBmb3IgKGNvbnN0IGF1dG8gSSA6IFNyY1NldCkKKyAgICAgICAgRW5jbG9zaW5nQmxkci0+dGFrZU5vZGVzKEkpOworICB9CisKKyAgflN0bXROb2RlQnVpbGRlcigpIG92ZXJyaWRlOworCisgIHVzaW5nIE5vZGVCdWlsZGVyOjpnZW5lcmF0ZU5vZGU7CisgIHVzaW5nIE5vZGVCdWlsZGVyOjpnZW5lcmF0ZVNpbms7CisKKyAgRXhwbG9kZWROb2RlICpnZW5lcmF0ZU5vZGUoY29uc3QgU3RtdCAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RhdGVSZWYgU3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2dyYW1Qb2ludFRhZyAqdGFnID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVBvaW50OjpLaW5kIEsgPSBQcm9ncmFtUG9pbnQ6OlBvc3RTdG10S2luZCl7CisgICAgY29uc3QgUHJvZ3JhbVBvaW50ICZMID0gUHJvZ3JhbVBvaW50OjpnZXRQcm9ncmFtUG9pbnQoUywgSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkLT5nZXRMb2NhdGlvbkNvbnRleHQoKSwgdGFnKTsKKyAgICByZXR1cm4gTm9kZUJ1aWxkZXI6OmdlbmVyYXRlTm9kZShMLCBTdCwgUHJlZCk7CisgIH0KKworICBFeHBsb2RlZE5vZGUgKmdlbmVyYXRlU2luayhjb25zdCBTdG10ICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdGF0ZVJlZiBTdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZ3JhbVBvaW50VGFnICp0YWcgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtUG9pbnQ6OktpbmQgSyA9IFByb2dyYW1Qb2ludDo6UG9zdFN0bXRLaW5kKXsKKyAgICBjb25zdCBQcm9ncmFtUG9pbnQgJkwgPSBQcm9ncmFtUG9pbnQ6OmdldFByb2dyYW1Qb2ludChTLCBLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQtPmdldExvY2F0aW9uQ29udGV4dCgpLCB0YWcpOworICAgIHJldHVybiBOb2RlQnVpbGRlcjo6Z2VuZXJhdGVTaW5rKEwsIFN0LCBQcmVkKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBCcmFuY2hOb2RlQnVpbGRlciBpcyByZXNwb25zaWJsZSBmb3IgY29uc3RydWN0aW5nIHRoZSBub2RlcworLy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR3byBicmFuY2hlcyBvZiB0aGUgaWYgc3RhdGVtZW50IC0gdHJ1ZSBhbmQgZmFsc2UuCitjbGFzcyBCcmFuY2hOb2RlQnVpbGRlcjogcHVibGljIE5vZGVCdWlsZGVyIHsKKyAgY29uc3QgQ0ZHQmxvY2sgKkRzdFQ7CisgIGNvbnN0IENGR0Jsb2NrICpEc3RGOworCisgIGJvb2wgSW5GZWFzaWJsZVRydWU7CisgIGJvb2wgSW5GZWFzaWJsZUZhbHNlOworCisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgQnJhbmNoTm9kZUJ1aWxkZXIoRXhwbG9kZWROb2RlICpTcmNOb2RlLCBFeHBsb2RlZE5vZGVTZXQgJkRzdFNldCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgTm9kZUJ1aWxkZXJDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkdCbG9jayAqZHN0VCwgY29uc3QgQ0ZHQmxvY2sgKmRzdEYpCisgICAgICA6IE5vZGVCdWlsZGVyKFNyY05vZGUsIERzdFNldCwgQyksIERzdFQoZHN0VCksIERzdEYoZHN0RiksCisgICAgICAgIEluRmVhc2libGVUcnVlKCFEc3RUKSwgSW5GZWFzaWJsZUZhbHNlKCFEc3RGKSB7CisgICAgLy8gVGhlIGJyYW5jaCBub2RlIGJ1aWxkZXIgZG9lcyBub3QgZ2VuZXJhdGUgYXV0b3RyYW5zaXRpb25zLgorICAgIC8vIElmIHRoZXJlIGFyZSBubyBzdWNjZXNzb3JzIGl0IG1lYW5zIHRoYXQgYm90aCBicmFuY2hlcyBhcmUgaW5mZWFzaWJsZS4KKyAgICB0YWtlTm9kZXMoU3JjTm9kZSk7CisgIH0KKworICBCcmFuY2hOb2RlQnVpbGRlcihjb25zdCBFeHBsb2RlZE5vZGVTZXQgJlNyY1NldCwgRXhwbG9kZWROb2RlU2V0ICZEc3RTZXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5vZGVCdWlsZGVyQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZHQmxvY2sgKmRzdFQsIGNvbnN0IENGR0Jsb2NrICpkc3RGKQorICAgICAgOiBOb2RlQnVpbGRlcihTcmNTZXQsIERzdFNldCwgQyksIERzdFQoZHN0VCksIERzdEYoZHN0RiksCisgICAgICAgIEluRmVhc2libGVUcnVlKCFEc3RUKSwgSW5GZWFzaWJsZUZhbHNlKCFEc3RGKSB7CisgICAgdGFrZU5vZGVzKFNyY1NldCk7CisgIH0KKworICBFeHBsb2RlZE5vZGUgKmdlbmVyYXRlTm9kZShQcm9ncmFtU3RhdGVSZWYgU3RhdGUsIGJvb2wgYnJhbmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQpOworCisgIGNvbnN0IENGR0Jsb2NrICpnZXRUYXJnZXRCbG9jayhib29sIGJyYW5jaCkgY29uc3QgeworICAgIHJldHVybiBicmFuY2ggPyBEc3RUIDogRHN0RjsKKyAgfQorCisgIHZvaWQgbWFya0luZmVhc2libGUoYm9vbCBicmFuY2gpIHsKKyAgICBpZiAoYnJhbmNoKQorICAgICAgSW5GZWFzaWJsZVRydWUgPSB0cnVlOworICAgIGVsc2UKKyAgICAgIEluRmVhc2libGVGYWxzZSA9IHRydWU7CisgIH0KKworICBib29sIGlzRmVhc2libGUoYm9vbCBicmFuY2gpIHsKKyAgICByZXR1cm4gYnJhbmNoID8gIUluRmVhc2libGVUcnVlIDogIUluRmVhc2libGVGYWxzZTsKKyAgfQorfTsKKworY2xhc3MgSW5kaXJlY3RHb3RvTm9kZUJ1aWxkZXIgeworICBDb3JlRW5naW5lJiBFbmc7CisgIGNvbnN0IENGR0Jsb2NrICpTcmM7CisgIGNvbnN0IENGR0Jsb2NrICZEaXNwYXRjaEJsb2NrOworICBjb25zdCBFeHByICpFOworICBFeHBsb2RlZE5vZGUgKlByZWQ7CisKK3B1YmxpYzoKKyAgSW5kaXJlY3RHb3RvTm9kZUJ1aWxkZXIoRXhwbG9kZWROb2RlICpwcmVkLCBjb25zdCBDRkdCbG9jayAqc3JjLCAKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqZSwgY29uc3QgQ0ZHQmxvY2sgKmRpc3BhdGNoLCBDb3JlRW5naW5lKiBlbmcpCisgICAgICA6IEVuZygqZW5nKSwgU3JjKHNyYyksIERpc3BhdGNoQmxvY2soKmRpc3BhdGNoKSwgRShlKSwgUHJlZChwcmVkKSB7fQorCisgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICBmcmllbmQgY2xhc3MgSW5kaXJlY3RHb3RvTm9kZUJ1aWxkZXI7CisKKyAgICBDRkdCbG9jazo6Y29uc3Rfc3VjY19pdGVyYXRvciBJOworCisgICAgaXRlcmF0b3IoQ0ZHQmxvY2s6OmNvbnN0X3N1Y2NfaXRlcmF0b3IgaSkgOiBJKGkpIHt9CisKKyAgcHVibGljOgorICAgIGl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeyArK0k7IHJldHVybiAqdGhpczsgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciAmWCkgY29uc3QgeyByZXR1cm4gSSAhPSBYLkk7IH0KKworICAgIGNvbnN0IExhYmVsRGVjbCAqZ2V0TGFiZWwoKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxMYWJlbFN0bXQ+KCgqSSktPmdldExhYmVsKCkpLT5nZXREZWNsKCk7CisgICAgfQorCisgICAgY29uc3QgQ0ZHQmxvY2sgKmdldEJsb2NrKCkgY29uc3QgeworICAgICAgcmV0dXJuICpJOworICAgIH0KKyAgfTsKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKERpc3BhdGNoQmxvY2suc3VjY19iZWdpbigpKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcihEaXNwYXRjaEJsb2NrLnN1Y2NfZW5kKCkpOyB9CisKKyAgRXhwbG9kZWROb2RlICpnZW5lcmF0ZU5vZGUoY29uc3QgaXRlcmF0b3IgJkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpbmsgPSBmYWxzZSk7CisKKyAgY29uc3QgRXhwciAqZ2V0VGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gRTsgfQorCisgIFByb2dyYW1TdGF0ZVJlZiBnZXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIFByZWQtPlN0YXRlOyB9CisgIAorICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKmdldExvY2F0aW9uQ29udGV4dCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZC0+Z2V0TG9jYXRpb25Db250ZXh0KCk7CisgIH0KK307CisKK2NsYXNzIFN3aXRjaE5vZGVCdWlsZGVyIHsKKyAgQ29yZUVuZ2luZSYgRW5nOworICBjb25zdCBDRkdCbG9jayAqU3JjOworICBjb25zdCBFeHByICpDb25kaXRpb247CisgIEV4cGxvZGVkTm9kZSAqUHJlZDsKKworcHVibGljOgorICBTd2l0Y2hOb2RlQnVpbGRlcihFeHBsb2RlZE5vZGUgKnByZWQsIGNvbnN0IENGR0Jsb2NrICpzcmMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHIgKmNvbmRpdGlvbiwgQ29yZUVuZ2luZSogZW5nKQorICAgICAgOiBFbmcoKmVuZyksIFNyYyhzcmMpLCBDb25kaXRpb24oY29uZGl0aW9uKSwgUHJlZChwcmVkKSB7fQorCisgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICBmcmllbmQgY2xhc3MgU3dpdGNoTm9kZUJ1aWxkZXI7CisKKyAgICBDRkdCbG9jazo6Y29uc3Rfc3VjY19yZXZlcnNlX2l0ZXJhdG9yIEk7CisKKyAgICBpdGVyYXRvcihDRkdCbG9jazo6Y29uc3Rfc3VjY19yZXZlcnNlX2l0ZXJhdG9yIGkpIDogSShpKSB7fQorCisgIHB1YmxpYzoKKyAgICBpdGVyYXRvciAmb3BlcmF0b3IrKygpIHsgKytJOyByZXR1cm4gKnRoaXM7IH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3IgJlgpIGNvbnN0IHsgcmV0dXJuIEkgIT0gWC5JOyB9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yICZYKSBjb25zdCB7IHJldHVybiBJID09IFguSTsgfQorCisgICAgY29uc3QgQ2FzZVN0bXQgKmdldENhc2UoKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxDYXNlU3RtdD4oKCpJKS0+Z2V0TGFiZWwoKSk7CisgICAgfQorCisgICAgY29uc3QgQ0ZHQmxvY2sgKmdldEJsb2NrKCkgY29uc3QgeworICAgICAgcmV0dXJuICpJOworICAgIH0KKyAgfTsKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKFNyYy0+c3VjY19yYmVnaW4oKSsxKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcihTcmMtPnN1Y2NfcmVuZCgpKTsgfQorCisgIGNvbnN0IFN3aXRjaFN0bXQgKmdldFN3aXRjaCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxTd2l0Y2hTdG10PihTcmMtPmdldFRlcm1pbmF0b3IoKSk7CisgIH0KKworICBFeHBsb2RlZE5vZGUgKmdlbmVyYXRlQ2FzZVN0bXROb2RlKGNvbnN0IGl0ZXJhdG9yICZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSk7CisKKyAgRXhwbG9kZWROb2RlICpnZW5lcmF0ZURlZmF1bHRDYXNlTm9kZShQcm9ncmFtU3RhdGVSZWYgU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpbmsgPSBmYWxzZSk7CisKKyAgY29uc3QgRXhwciAqZ2V0Q29uZGl0aW9uKCkgY29uc3QgeyByZXR1cm4gQ29uZGl0aW9uOyB9CisKKyAgUHJvZ3JhbVN0YXRlUmVmIGdldFN0YXRlKCkgY29uc3QgeyByZXR1cm4gUHJlZC0+U3RhdGU7IH0KKyAgCisgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqZ2V0TG9jYXRpb25Db250ZXh0KCkgY29uc3QgeworICAgIHJldHVybiBQcmVkLT5nZXRMb2NhdGlvbkNvbnRleHQoKTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgZW50bworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfQ09SRUVOR0lORV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvRHluYW1pY1R5cGVJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvRHluYW1pY1R5cGVJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzYzY0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9EeW5hbWljVHlwZUluZm8uaApAQCAtMCwwICsxLDUyIEBACisvLz09IER5bmFtaWNUeXBlSW5mby5oIC0gUnVudGltZSB0eXBlIGluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9EWU5BTUlDVFlQRUlORk9fSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9EWU5BTUlDVFlQRUlORk9fSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBlbnRvIHsKKworLy8vIFxicmllZiBTdG9yZXMgdGhlIGN1cnJlbnRseSBpbmZlcnJlZCBzdHJpY3Rlc3QgYm91bmQgb24gdGhlIHJ1bnRpbWUgdHlwZQorLy8vIG9mIGEgcmVnaW9uIGluIGEgZ2l2ZW4gc3RhdGUgYWxvbmcgdGhlIGFuYWx5c2lzIHBhdGguCitjbGFzcyBEeW5hbWljVHlwZUluZm8geworcHJpdmF0ZToKKyAgUXVhbFR5cGUgVDsKKyAgYm9vbCBDYW5CZUFTdWJDbGFzczsKKworcHVibGljOgorCisgIER5bmFtaWNUeXBlSW5mbygpIDogVChRdWFsVHlwZSgpKSB7fQorICBEeW5hbWljVHlwZUluZm8oUXVhbFR5cGUgV2l0aFR5cGUsIGJvb2wgQ2FuQmVTdWIgPSB0cnVlKQorICAgIDogVChXaXRoVHlwZSksIENhbkJlQVN1YkNsYXNzKENhbkJlU3ViKSB7fQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGZhbHNlIGlmIG5vIGR5bmFtaWMgdHlwZSBpbmZvIGlzIGF2YWlsYWJsZS4KKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gIVQuaXNOdWxsKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGN1cnJlbnRseSBpbmZlcnJlZCB1cHBlciBib3VuZCBvbiB0aGUgcnVudGltZSB0eXBlLgorICBRdWFsVHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBmYWxzZSBpZiB0aGUgdHlwZSBpbmZvcm1hdGlvbiBpcyBwcmVjaXNlICh0aGUgdHlwZSBUIGlzCisgIC8vLyB0aGUgb25seSB0eXBlIGluIHRoZSBsYXR0aWNlKSwgdHJ1ZSBvdGhlcndpc2UuCisgIGJvb2wgY2FuQmVBU3ViQ2xhc3MoKSBjb25zdCB7IHJldHVybiBDYW5CZUFTdWJDbGFzczsgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3QgeworICAgIElELkFkZChUKTsKKyAgICBJRC5BZGRJbnRlZ2VyKCh1bnNpZ25lZClDYW5CZUFTdWJDbGFzcyk7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IER5bmFtaWNUeXBlSW5mbyAmWCkgY29uc3QgeworICAgIHJldHVybiBUID09IFguVCAmJiBDYW5CZUFTdWJDbGFzcyA9PSBYLkNhbkJlQVN1YkNsYXNzOworICB9Cit9OworCit9IC8vIGVuZCBlbnRvCit9IC8vIGVuZCBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9EeW5hbWljVHlwZU1hcC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0R5bmFtaWNUeXBlTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjNGVmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9EeW5hbWljVHlwZU1hcC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8vPT09LSBEeW5hbWljVHlwZU1hcC5oIC0gRHluYW1pYyB0eXBlIG1hcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBwcm92aWRlcyBBUElzIGZvciB0cmFja2luZyBkeW5hbWljIHR5cGUgaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9EWU5BTUlDVFlQRU1BUF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX0RZTkFNSUNUWVBFTUFQX0gKKworI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9EeW5hbWljVHlwZUluZm8uaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvUHJvZ3JhbVN0YXRlLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1Byb2dyYW1TdGF0ZV9Gd2QuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvUHJvZ3JhbVN0YXRlVHJhaXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbW11dGFibGVNYXAuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGVudG8geworCitjbGFzcyBNZW1SZWdpb247CisKKy8vLyBUaGUgR0RNIGNvbXBvbmVudCBjb250YWluaW5nIHRoZSBkeW5hbWljIHR5cGUgaW5mby4gVGhpcyBpcyBhIG1hcCBmcm9tIGEKKy8vLyBzeW1ib2wgdG8gaXRzIG1vc3QgbGlrZWx5IHR5cGUuCitzdHJ1Y3QgRHluYW1pY1R5cGVNYXAge307CisKK3VzaW5nIER5bmFtaWNUeXBlTWFwSW1wbCA9CisgICAgbGx2bTo6SW1tdXRhYmxlTWFwPGNvbnN0IE1lbVJlZ2lvbiAqLCBEeW5hbWljVHlwZUluZm8+OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFByb2dyYW1TdGF0ZVRyYWl0PER5bmFtaWNUeXBlTWFwPgorICAgIDogcHVibGljIFByb2dyYW1TdGF0ZVBhcnRpYWxUcmFpdDxEeW5hbWljVHlwZU1hcEltcGw+IHsKKyAgc3RhdGljIHZvaWQgKkdETUluZGV4KCkgeworICAgIHN0YXRpYyBpbnQgaW5kZXggPSAwOworICAgIHJldHVybiAmaW5kZXg7CisgIH0KK307CisKKy8vLyBcYnJpZWYgR2V0IGR5bmFtaWMgdHlwZSBpbmZvcm1hdGlvbiBmb3IgYSByZWdpb24uCitEeW5hbWljVHlwZUluZm8gZ2V0RHluYW1pY1R5cGVJbmZvKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtUmVnaW9uICpSZWcpOworCisvLy8gXGJyaWVmIFNldCBkeW5hbWljIHR5cGUgaW5mb3JtYXRpb24gb2YgdGhlIHJlZ2lvbjsgcmV0dXJuIHRoZSBuZXcgc3RhdGUuCitQcm9ncmFtU3RhdGVSZWYgc2V0RHluYW1pY1R5cGVJbmZvKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwgY29uc3QgTWVtUmVnaW9uICpSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNUeXBlSW5mbyBOZXdUeSk7CisKKy8vLyBcYnJpZWYgU2V0IGR5bmFtaWMgdHlwZSBpbmZvcm1hdGlvbiBvZiB0aGUgcmVnaW9uOyByZXR1cm4gdGhlIG5ldyBzdGF0ZS4KK2lubGluZSBQcm9ncmFtU3RhdGVSZWYgc2V0RHluYW1pY1R5cGVJbmZvKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbVJlZ2lvbiAqUmVnLCBRdWFsVHlwZSBOZXdUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ2FuQmVTdWJDbGFzc2VkID0gdHJ1ZSkgeworICByZXR1cm4gc2V0RHluYW1pY1R5cGVJbmZvKFN0YXRlLCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY1R5cGVJbmZvKE5ld1R5LCBDYW5CZVN1YkNsYXNzZWQpKTsKK30KKwordm9pZCBwcmludER5bmFtaWNUeXBlSW5mbyhQcm9ncmFtU3RhdGVSZWYgU3RhdGUsIHJhd19vc3RyZWFtICZPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5MLCBjb25zdCBjaGFyICpTZXApOworCit9IC8vIG5hbWVzcGFjZSBlbnRvCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfRFlOQU1JQ1RZUEVNQVBfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0Vudmlyb25tZW50LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvRW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDlhYTgxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0Vudmlyb25tZW50LmgKQEAgLTAsMCArMSwxMjUgQEAKKy8vPT09LSBFbnZpcm9ubWVudC5oIC0gTWFwIGZyb20gU3RtdCogdG8gTG9jYXRpb25zL1ZhbHVlcyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVkIHRoZSBFbnZpcm9ubWVudCBhbmQgRW52aXJvbm1lbnRNYW5hZ2VyIGNsYXNzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9FTlZJUk9OTUVOVF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX0VOVklST05NRU5UX0gKKworI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0FuYWx5c2lzRGVjbENvbnRleHQuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvUHJvZ3JhbVN0YXRlX0Z3ZC5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TVmFscy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ltbXV0YWJsZU1hcC5oIgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIFN0bXQ7CisKK25hbWVzcGFjZSBlbnRvIHsKKworY2xhc3MgU1ZhbEJ1aWxkZXI7CitjbGFzcyBTeW1ib2xSZWFwZXI7CisKKy8vLyBBbiBlbnRyeSBpbiB0aGUgZW52aXJvbm1lbnQgY29uc2lzdHMgb2YgYSBTdG10IGFuZCBhbiBMb2NhdGlvbkNvbnRleHQuCisvLy8gVGhpcyBhbGxvd3MgdGhlIGVudmlyb25tZW50IHRvIG1hbmFnZSBjb250ZXh0LXNlbnNpdGl2ZSBiaW5kaW5ncywKKy8vLyB3aGljaCBpcyBlc3NlbnRpYWxseSBmb3IgbW9kZWxpbmcgcmVjdXJzaXZlIGZ1bmN0aW9uIGFuYWx5c2lzLCBhbW9uZworLy8vIG90aGVyIHRoaW5ncy4KK2NsYXNzIEVudmlyb25tZW50RW50cnkgOiBwdWJsaWMgc3RkOjpwYWlyPGNvbnN0IFN0bXQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICo+IHsKK3B1YmxpYzoKKyAgRW52aXJvbm1lbnRFbnRyeShjb25zdCBTdG10ICpzLCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkwpOworCisgIGNvbnN0IFN0bXQgKmdldFN0bXQoKSBjb25zdCB7IHJldHVybiBmaXJzdDsgfQorICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKmdldExvY2F0aW9uQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIHNlY29uZDsgfQorICAKKyAgLy8vIFByb2ZpbGUgYW4gRW52aXJvbm1lbnRFbnRyeSBmb3IgaW5jbHVzaW9uIGluIGEgRm9sZGluZ1NldC4KKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnZpcm9ubWVudEVudHJ5ICZFKSB7CisgICAgSUQuQWRkUG9pbnRlcihFLmdldFN0bXQoKSk7CisgICAgSUQuQWRkUG9pbnRlcihFLmdldExvY2F0aW9uQ29udGV4dCgpKTsKKyAgfQorICAKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7CisgICAgUHJvZmlsZShJRCwgKnRoaXMpOworICB9Cit9OworCisvLy8gQW4gaW1tdXRhYmxlIG1hcCBmcm9tIEVudmlyb25lbW50RW50cmllcyB0byBTVmFscy4KK2NsYXNzIEVudmlyb25tZW50IHsKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBFbnZpcm9ubWVudE1hbmFnZXI7CisKKyAgdXNpbmcgQmluZGluZ3NUeSA9IGxsdm06OkltbXV0YWJsZU1hcDxFbnZpcm9ubWVudEVudHJ5LCBTVmFsPjsKKworICBCaW5kaW5nc1R5IEV4cHJCaW5kaW5nczsKKworICBFbnZpcm9ubWVudChCaW5kaW5nc1R5IGViKSA6IEV4cHJCaW5kaW5ncyhlYikge30KKworICBTVmFsIGxvb2t1cEV4cHIoY29uc3QgRW52aXJvbm1lbnRFbnRyeSAmRSkgY29uc3Q7CisKK3B1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3IgPSBCaW5kaW5nc1R5OjppdGVyYXRvcjsKKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEV4cHJCaW5kaW5ncy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEV4cHJCaW5kaW5ncy5lbmQoKTsgfQorCisgIC8vLyBGZXRjaGVzIHRoZSBjdXJyZW50IGJpbmRpbmcgb2YgdGhlIGV4cHJlc3Npb24gaW4gdGhlCisgIC8vLyBFbnZpcm9ubWVudC4KKyAgU1ZhbCBnZXRTVmFsKGNvbnN0IEVudmlyb25tZW50RW50cnkgJkUsIFNWYWxCdWlsZGVyICZzdmFsQnVpbGRlcikgY29uc3Q7CisKKyAgLy8vIFByb2ZpbGUgLSBQcm9maWxlIHRoZSBjb250ZW50cyBvZiBhbiBFbnZpcm9ubWVudCBvYmplY3QgZm9yIHVzZQorICAvLy8gIGluIGEgRm9sZGluZ1NldC4KKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCwgY29uc3QgRW52aXJvbm1lbnQqIGVudikgeworICAgIGVudi0+RXhwckJpbmRpbmdzLlByb2ZpbGUoSUQpOworICB9CisKKyAgLy8vIFByb2ZpbGUgLSBVc2VkIHRvIHByb2ZpbGUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgb2JqZWN0IGZvciBpbmNsdXNpb24KKyAgLy8vICBpbiBhIEZvbGRpbmdTZXQuCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgY29uc3QgeworICAgIFByb2ZpbGUoSUQsIHRoaXMpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEVudmlyb25tZW50JiBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRXhwckJpbmRpbmdzID09IFJIUy5FeHByQmluZGluZ3M7CisgIH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPdXQsIGNvbnN0IGNoYXIgKk5MLCBjb25zdCBjaGFyICpTZXAsCisgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpXaXRoTEMgPSBudWxscHRyKSBjb25zdDsKK307CisKK2NsYXNzIEVudmlyb25tZW50TWFuYWdlciB7Citwcml2YXRlOgorICB1c2luZyBGYWN0b3J5VHkgPSBFbnZpcm9ubWVudDo6QmluZGluZ3NUeTo6RmFjdG9yeTsKKworICBGYWN0b3J5VHkgRjsKKworcHVibGljOgorICBFbnZpcm9ubWVudE1hbmFnZXIobGx2bTo6QnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yKSA6IEYoQWxsb2NhdG9yKSB7fQorCisgIEVudmlyb25tZW50IGdldEluaXRpYWxFbnZpcm9ubWVudCgpIHsKKyAgICByZXR1cm4gRW52aXJvbm1lbnQoRi5nZXRFbXB0eU1hcCgpKTsKKyAgfQorCisgIC8vLyBCaW5kIGEgc3ltYm9saWMgdmFsdWUgdG8gdGhlIGdpdmVuIGVudmlyb25tZW50IGVudHJ5LgorICBFbnZpcm9ubWVudCBiaW5kRXhwcihFbnZpcm9ubWVudCBFbnYsIGNvbnN0IEVudmlyb25tZW50RW50cnkgJkUsIFNWYWwgViwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbnZhbGlkYXRlKTsKKworICBFbnZpcm9ubWVudCByZW1vdmVEZWFkQmluZGluZ3MoRW52aXJvbm1lbnQgRW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sUmVhcGVyICZTeW1SZWFwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RhdGVSZWYgc3RhdGUpOworfTsKKworfSAvLyBuYW1lc3BhY2UgZW50bworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfRU5WSVJPTk1FTlRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0V4cGxvZGVkR3JhcGguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9FeHBsb2RlZEdyYXBoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1YzQzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9FeHBsb2RlZEdyYXBoLmgKQEAgLTAsMCArMSw1MDMgQEAKKy8vPT09LSBFeHBsb2RlZEdyYXBoLmggLSBMb2NhbCwgUGF0aC1TZW5zLiAiRXhwbG9kZWQgR3JhcGgiIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB0ZW1wbGF0ZSBjbGFzc2VzIEV4cGxvZGVkTm9kZSBhbmQgRXhwbG9kZWRHcmFwaCwKKy8vICB3aGljaCByZXByZXNlbnQgYSBwYXRoLXNlbnNpdGl2ZSwgaW50cmEtcHJvY2VkdXJhbCAiZXhwbG9kZWQgZ3JhcGguIgorLy8gIFNlZSAiUHJlY2lzZSBpbnRlcnByb2NlZHVyYWwgZGF0YWZsb3cgYW5hbHlzaXMgdmlhIGdyYXBoIHJlYWNoYWJpbGl0eSIKKy8vICBieSBSZXBzLCBIb3J3aXR6LCBhbmQgU2FnaXYKKy8vICAoaHR0cDovL3BvcnRhbC5hY20ub3JnL2NpdGF0aW9uLmNmbT9pZD0xOTk0NjIpIGZvciB0aGUgZGVmaW5pdGlvbiBvZiBhbgorLy8gIGV4cGxvZGVkIGdyYXBoLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfRVhQTE9ERURHUkFQSF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX0VYUExPREVER1JBUEhfSAorCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQW5hbHlzaXNEZWNsQ29udGV4dC5oIgorI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL1Byb2dyYW1Qb2ludC5oIgorI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL1N1cHBvcnQvQnVtcFZlY3Rvci5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvUHJvZ3JhbVN0YXRlLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1Byb2dyYW1TdGF0ZV9Gd2QuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU1ZhbHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVwdGhGaXJzdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQ0ZHOworY2xhc3MgRGVjbDsKK2NsYXNzIEV4cHI7CitjbGFzcyBQYXJlbnRNYXA7CitjbGFzcyBTdG10OworCituYW1lc3BhY2UgZW50byB7CisKK2NsYXNzIEV4cGxvZGVkR3JhcGg7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBFeHBsb2RlZEdyYXBoICJpbXBsZW1lbnRhdGlvbiIgY2xhc3Nlcy4gIFRoZXNlIGNsYXNzZXMgYXJlIG5vdCB0eXBlZCB0bworLy8gY29udGFpbiBhIHNwZWNpZmljIGtpbmQgb2Ygc3RhdGUuICBUeXBlZC1zcGVjaWFsaXplZCB2ZXJzaW9ucyBhcmUgZGVmaW5lZAorLy8gb24gdG9wIG9mIHRoZXNlIGNsYXNzZXMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBFeHBsb2RlZE5vZGUgaXMgbm90IGNvbnN0aWZpZWQgYWxsIG92ZXIgdGhlIGVuZ2luZSBiZWNhdXNlIHdlIG5lZWQgdG8gYWRkCisvLyBzdWNjZXNzb3JzIHRvIGl0IGF0IGFueSB0aW1lIGFmdGVyIGNyZWF0aW5nIGl0LgorCitjbGFzcyBFeHBsb2RlZE5vZGUgOiBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworICBmcmllbmQgY2xhc3MgQnJhbmNoTm9kZUJ1aWxkZXI7CisgIGZyaWVuZCBjbGFzcyBDb3JlRW5naW5lOworICBmcmllbmQgY2xhc3MgRW5kT2ZGdW5jdGlvbk5vZGVCdWlsZGVyOworICBmcmllbmQgY2xhc3MgRXhwbG9kZWRHcmFwaDsKKyAgZnJpZW5kIGNsYXNzIEluZGlyZWN0R290b05vZGVCdWlsZGVyOworICBmcmllbmQgY2xhc3MgTm9kZUJ1aWxkZXI7CisgIGZyaWVuZCBjbGFzcyBTd2l0Y2hOb2RlQnVpbGRlcjsKKworICAvLy8gRWZmaWNpZW50bHkgc3RvcmVzIGEgbGlzdCBvZiBFeHBsb2RlZE5vZGVzLCBvciBhbiBvcHRpb25hbCBmbGFnLgorICAvLy8KKyAgLy8vIE5vZGVHcm91cCBwcm92aWRlcyBvcGFxdWUgc3RvcmFnZSBmb3IgYSBsaXN0IG9mIEV4cGxvZGVkTm9kZXMsIG9wdGltaXppbmcKKyAgLy8vIGZvciB0aGUgY2FzZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIG5vZGUgaW4gdGhlIGdyb3VwLiBUaGlzIGlzIGEgZmFpcmx5CisgIC8vLyBjb21tb24gY2FzZSBpbiBhbiBFeHBsb2RlZEdyYXBoLCB3aGVyZSBtb3N0IG5vZGVzIGhhdmUgb25seSBvbmUKKyAgLy8vIHByZWRlY2Vzc29yIGFuZCBtYW55IGhhdmUgb25seSBvbmUgc3VjY2Vzc29yLiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvCisgIC8vLyBzdG9yZSBhIGZsYWcgcmF0aGVyIHRoYW4gYSBub2RlIGxpc3QsIHdoaWNoIEV4cGxvZGVkTm9kZSB1c2VzIHRvIG1hcmsKKyAgLy8vIHdoZXRoZXIgYSBub2RlIGlzIGEgc2luay4gSWYgdGhlIGZsYWcgaXMgc2V0LCB0aGUgZ3JvdXAgaXMgaW1wbGljaXRseQorICAvLy8gZW1wdHkgYW5kIG5vIG5vZGVzIG1heSBiZSBhZGRlZC4KKyAgY2xhc3MgTm9kZUdyb3VwIHsKKyAgICAvLyBDb25jZXB0dWFsbHkgYSBkaXNjcmltaW5hdGVkIHVuaW9uLiBJZiB0aGUgbG93IGJpdCBpcyBzZXQsIHRoZSBub2RlIGlzCisgICAgLy8gYSBzaW5rLiBJZiB0aGUgbG93IGJpdCBpcyBub3Qgc2V0LCB0aGUgcG9pbnRlciByZWZlcnMgdG8gdGhlIHN0b3JhZ2UKKyAgICAvLyBmb3IgdGhlIG5vZGVzIGluIHRoZSBncm91cC4KKyAgICAvLyBUaGlzIGlzIG5vdCBhIFBvaW50ZXJJbnRQYWlyIGluIG9yZGVyIHRvIGtlZXAgdGhlIHN0b3JhZ2UgdHlwZSBvcGFxdWUuCisgICAgdWludHB0cl90IFA7CisgICAgCisgIHB1YmxpYzoKKyAgICBOb2RlR3JvdXAoYm9vbCBGbGFnID0gZmFsc2UpIDogUChGbGFnKSB7CisgICAgICBhc3NlcnQoZ2V0RmxhZygpID09IEZsYWcpOworICAgIH0KKworICAgIEV4cGxvZGVkTm9kZSAqIGNvbnN0ICpiZWdpbigpIGNvbnN0OworCisgICAgRXhwbG9kZWROb2RlICogY29uc3QgKmVuZCgpIGNvbnN0OworCisgICAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0OworCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFAgPT0gMCB8fCBnZXRGbGFnKCkgIT0gMDsgfQorCisgICAgLy8vIEFkZHMgYSBub2RlIHRvIHRoZSBsaXN0LgorICAgIC8vLworICAgIC8vLyBUaGUgZ3JvdXAgbXVzdCBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBpdHMgZmxhZyBzZXQuCisgICAgdm9pZCBhZGROb2RlKEV4cGxvZGVkTm9kZSAqTiwgRXhwbG9kZWRHcmFwaCAmRyk7CisKKyAgICAvLy8gUmVwbGFjZXMgdGhlIHNpbmdsZSBub2RlIGluIHRoaXMgZ3JvdXAgd2l0aCBhIG5ldyBub2RlLgorICAgIC8vLworICAgIC8vLyBOb3RlIHRoYXQgdGhpcyBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4geW91IGtub3cgdGhlIGdyb3VwIHdhcyBub3QKKyAgICAvLy8gY3JlYXRlZCB3aXRoIGl0cyBmbGFnIHNldCwgYW5kIHRoYXQgdGhlIGdyb3VwIGlzIGVtcHR5IG9yIGNvbnRhaW5zCisgICAgLy8vIG9ubHkgYSBzaW5nbGUgbm9kZS4KKyAgICB2b2lkIHJlcGxhY2VOb2RlKEV4cGxvZGVkTm9kZSAqbm9kZSk7CisKKyAgICAvLy8gUmV0dXJucyB3aGV0aGVyIHRoaXMgZ3JvdXAgd2FzIGNyZWF0ZWQgd2l0aCBpdHMgZmxhZyBzZXQuCisgICAgYm9vbCBnZXRGbGFnKCkgY29uc3QgeworICAgICAgcmV0dXJuIChQICYgMSk7CisgICAgfQorICB9OworCisgIC8vLyBMb2NhdGlvbiAtIFRoZSBwcm9ncmFtIGxvY2F0aW9uICh3aXRoaW4gYSBmdW5jdGlvbiBib2R5KSBhc3NvY2lhdGVkCisgIC8vLyAgd2l0aCB0aGlzIG5vZGUuCisgIGNvbnN0IFByb2dyYW1Qb2ludCBMb2NhdGlvbjsKKworICAvLy8gU3RhdGUgLSBUaGUgc3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KKyAgUHJvZ3JhbVN0YXRlUmVmIFN0YXRlOworCisgIC8vLyBQcmVkcyAtIFRoZSBwcmVkZWNlc3NvcnMgb2YgdGhpcyBub2RlLgorICBOb2RlR3JvdXAgUHJlZHM7CisKKyAgLy8vIFN1Y2NzIC0gVGhlIHN1Y2Nlc3NvcnMgb2YgdGhpcyBub2RlLgorICBOb2RlR3JvdXAgU3VjY3M7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgRXhwbG9kZWROb2RlKGNvbnN0IFByb2dyYW1Qb2ludCAmbG9jLCBQcm9ncmFtU3RhdGVSZWYgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzU2luaykKKyAgICAgIDogTG9jYXRpb24obG9jKSwgU3RhdGUoc3RkOjptb3ZlKHN0YXRlKSksIFN1Y2NzKElzU2luaykgeworICAgIGFzc2VydChpc1NpbmsoKSA9PSBJc1NpbmspOworICB9CisKKyAgLy8vIGdldExvY2F0aW9uIC0gUmV0dXJucyB0aGUgZWRnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5vZGUuCisgIFByb2dyYW1Qb2ludCBnZXRMb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIExvY2F0aW9uOyB9CisKKyAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpnZXRMb2NhdGlvbkNvbnRleHQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExvY2F0aW9uKCkuZ2V0TG9jYXRpb25Db250ZXh0KCk7CisgIH0KKworICBjb25zdCBTdGFja0ZyYW1lQ29udGV4dCAqZ2V0U3RhY2tGcmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TG9jYXRpb25Db250ZXh0KCktPmdldEN1cnJlbnRTdGFja0ZyYW1lKCk7CisgIH0KKworICBjb25zdCBEZWNsICZnZXRDb2RlRGVjbCgpIGNvbnN0IHsgcmV0dXJuICpnZXRMb2NhdGlvbkNvbnRleHQoKS0+Z2V0RGVjbCgpOyB9CisKKyAgQ0ZHICZnZXRDRkcoKSBjb25zdCB7IHJldHVybiAqZ2V0TG9jYXRpb25Db250ZXh0KCktPmdldENGRygpOyB9CisKKyAgUGFyZW50TWFwICZnZXRQYXJlbnRNYXAoKSBjb25zdCB7cmV0dXJuIGdldExvY2F0aW9uQ29udGV4dCgpLT5nZXRQYXJlbnRNYXAoKTt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFQgJmdldEFuYWx5c2lzKCkgY29uc3QgeworICAgIHJldHVybiAqZ2V0TG9jYXRpb25Db250ZXh0KCktPmdldEFuYWx5c2lzPFQ+KCk7CisgIH0KKworICBjb25zdCBQcm9ncmFtU3RhdGVSZWYgJmdldFN0YXRlKCkgY29uc3QgeyByZXR1cm4gU3RhdGU7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgT3B0aW9uYWw8VD4gZ2V0TG9jYXRpb25BcygpIGNvbnN0IExMVk1fTFZBTFVFX0ZVTkNUSU9OIHsKKyAgICByZXR1cm4gTG9jYXRpb24uZ2V0QXM8VD4oKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIHZhbHVlIG9mIGFuIGFyYml0cmFyeSBleHByZXNzaW9uIGF0IHRoaXMgbm9kZS4KKyAgU1ZhbCBnZXRTVmFsKGNvbnN0IFN0bXQgKlMpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3RhdGUoKS0+Z2V0U1ZhbChTLCBnZXRMb2NhdGlvbkNvbnRleHQoKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2dyYW1Qb2ludCAmTG9jLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2dyYW1TdGF0ZVJlZiAmc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1NpbmspIHsKKyAgICBJRC5BZGQoTG9jKTsKKyAgICBJRC5BZGRQb2ludGVyKHN0YXRlLmdldCgpKTsKKyAgICBJRC5BZGRCb29sZWFuKElzU2luayk7CisgIH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIGNvbnN0IHsKKyAgICAvLyBXZSBhdm9pZCBjb3B5IGNvbnN0cnVjdG9ycyBieSBub3QgdXNpbmcgYWNjZXNzb3JzLgorICAgIFByb2ZpbGUoSUQsIExvY2F0aW9uLCBTdGF0ZSwgaXNTaW5rKCkpOworICB9CisKKyAgLy8vIGFkZFByZWRlY2Nlc3NvciAtIEFkZHMgYSBwcmVkZWNlc3NvciB0byB0aGUgY3VycmVudCBub2RlLCBhbmQKKyAgLy8vICBpbiB0YW5kZW0gYWRkIHRoaXMgbm9kZSBhcyBhIHN1Y2Nlc3NvciBvZiB0aGUgb3RoZXIgbm9kZS4KKyAgdm9pZCBhZGRQcmVkZWNlc3NvcihFeHBsb2RlZE5vZGUgKlYsIEV4cGxvZGVkR3JhcGggJkcpOworCisgIHVuc2lnbmVkIHN1Y2Nfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFN1Y2NzLnNpemUoKTsgfQorICB1bnNpZ25lZCBwcmVkX3NpemUoKSBjb25zdCB7IHJldHVybiBQcmVkcy5zaXplKCk7IH0KKyAgYm9vbCBzdWNjX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gU3VjY3MuZW1wdHkoKTsgfQorICBib29sIHByZWRfZW1wdHkoKSBjb25zdCB7IHJldHVybiBQcmVkcy5lbXB0eSgpOyB9CisKKyAgYm9vbCBpc1NpbmsoKSBjb25zdCB7IHJldHVybiBTdWNjcy5nZXRGbGFnKCk7IH0KKworICBib29sIGhhc1NpbmdsZVByZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIChwcmVkX3NpemUoKSA9PSAxKTsKKyAgfQorCisgIEV4cGxvZGVkTm9kZSAqZ2V0Rmlyc3RQcmVkKCkgeworICAgIHJldHVybiBwcmVkX2VtcHR5KCkgPyBudWxscHRyIDogKihwcmVkX2JlZ2luKCkpOworICB9CisKKyAgY29uc3QgRXhwbG9kZWROb2RlICpnZXRGaXJzdFByZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwbG9kZWROb2RlKj4odGhpcyktPmdldEZpcnN0UHJlZCgpOworICB9CisKKyAgY29uc3QgRXhwbG9kZWROb2RlICpnZXRGaXJzdFN1Y2MoKSBjb25zdCB7CisgICAgcmV0dXJuIHN1Y2NfZW1wdHkoKSA/IG51bGxwdHIgOiAqKHN1Y2NfYmVnaW4oKSk7CisgIH0KKworICAvLyBJdGVyYXRvcnMgb3ZlciBzdWNjZXNzb3IgYW5kIHByZWRlY2Vzc29yIHZlcnRpY2VzLgorICB1c2luZyBzdWNjX2l0ZXJhdG9yID0gRXhwbG9kZWROb2RlICogY29uc3QgKjsKKyAgdXNpbmcgY29uc3Rfc3VjY19pdGVyYXRvciA9IGNvbnN0IEV4cGxvZGVkTm9kZSAqIGNvbnN0ICo7CisgIHVzaW5nIHByZWRfaXRlcmF0b3IgPSBFeHBsb2RlZE5vZGUgKiBjb25zdCAqOworICB1c2luZyBjb25zdF9wcmVkX2l0ZXJhdG9yID0gY29uc3QgRXhwbG9kZWROb2RlICogY29uc3QgKjsKKworICBwcmVkX2l0ZXJhdG9yIHByZWRfYmVnaW4oKSB7IHJldHVybiBQcmVkcy5iZWdpbigpOyB9CisgIHByZWRfaXRlcmF0b3IgcHJlZF9lbmQoKSB7IHJldHVybiBQcmVkcy5lbmQoKTsgfQorCisgIGNvbnN0X3ByZWRfaXRlcmF0b3IgcHJlZF9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFeHBsb2RlZE5vZGUqPih0aGlzKS0+cHJlZF9iZWdpbigpOworICB9CisgIGNvbnN0X3ByZWRfaXRlcmF0b3IgcHJlZF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwbG9kZWROb2RlKj4odGhpcyktPnByZWRfZW5kKCk7CisgIH0KKworICBzdWNjX2l0ZXJhdG9yIHN1Y2NfYmVnaW4oKSB7IHJldHVybiBTdWNjcy5iZWdpbigpOyB9CisgIHN1Y2NfaXRlcmF0b3Igc3VjY19lbmQoKSB7IHJldHVybiBTdWNjcy5lbmQoKTsgfQorCisgIGNvbnN0X3N1Y2NfaXRlcmF0b3Igc3VjY19iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFeHBsb2RlZE5vZGUqPih0aGlzKS0+c3VjY19iZWdpbigpOworICB9CisgIGNvbnN0X3N1Y2NfaXRlcmF0b3Igc3VjY19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwbG9kZWROb2RlKj4odGhpcyktPnN1Y2NfZW5kKCk7CisgIH0KKworICAvLyBGb3IgZGVidWdnaW5nLgorCitwdWJsaWM6CisgIGNsYXNzIEF1ZGl0b3IgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+QXVkaXRvcigpOworCisgICAgdmlydHVhbCB2b2lkIEFkZEVkZ2UoRXhwbG9kZWROb2RlICpTcmMsIEV4cGxvZGVkTm9kZSAqRHN0KSA9IDA7CisgIH07CisKKyAgc3RhdGljIHZvaWQgU2V0QXVkaXRvcihBdWRpdG9yKiBBKTsKKyAgCitwcml2YXRlOgorICB2b2lkIHJlcGxhY2VTdWNjZXNzb3IoRXhwbG9kZWROb2RlICpub2RlKSB7IFN1Y2NzLnJlcGxhY2VOb2RlKG5vZGUpOyB9CisgIHZvaWQgcmVwbGFjZVByZWRlY2Vzc29yKEV4cGxvZGVkTm9kZSAqbm9kZSkgeyBQcmVkcy5yZXBsYWNlTm9kZShub2RlKTsgfQorfTsKKwordXNpbmcgSW50ZXJFeHBsb2RlZEdyYXBoTWFwID0KKyAgICBsbHZtOjpEZW5zZU1hcDxjb25zdCBFeHBsb2RlZE5vZGUgKiwgY29uc3QgRXhwbG9kZWROb2RlICo+OworCitjbGFzcyBFeHBsb2RlZEdyYXBoIHsKK3Byb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIENvcmVFbmdpbmU7CisKKyAgLy8gVHlwZSBkZWZpbml0aW9ucy4KKyAgdXNpbmcgTm9kZVZlY3RvciA9IHN0ZDo6dmVjdG9yPEV4cGxvZGVkTm9kZSAqPjsKKworICAvLy8gVGhlIHJvb3RzIG9mIHRoZSBzaW11bGF0aW9uIGdyYXBoLiBVc3VhbGx5IHRoZXJlIHdpbGwgYmUgb25seQorICAvLy8gb25lLCBidXQgY2xpZW50cyBhcmUgZnJlZSB0byBlc3RhYmxpc2ggbXVsdGlwbGUgc3ViZ3JhcGhzIHdpdGhpbiBhIHNpbmdsZQorICAvLy8gU2ltdWxHcmFwaC4gTW9yZW92ZXIsIHRoZXNlIHN1YmdyYXBocyBjYW4gb2Z0ZW4gbWVyZ2Ugd2hlbiBwYXRocyBmcm9tCisgIC8vLyBkaWZmZXJlbnQgcm9vdHMgcmVhY2ggdGhlIHNhbWUgc3RhdGUgYXQgdGhlIHNhbWUgcHJvZ3JhbSBsb2NhdGlvbi4KKyAgTm9kZVZlY3RvciBSb290czsKKworICAvLy8gVGhlIG5vZGVzIGluIHRoZSBzaW11bGF0aW9uIGdyYXBoIHdoaWNoIGhhdmUgYmVlbgorICAvLy8gc3BlY2lhbGx5IG1hcmtlZCBhcyB0aGUgZW5kcG9pbnQgb2YgYW4gYWJzdHJhY3Qgc2ltdWxhdGlvbiBwYXRoLgorICBOb2RlVmVjdG9yIEVuZE5vZGVzOworCisgIC8vLyBOb2RlcyAtIFRoZSBub2RlcyBpbiB0aGUgZ3JhcGguCisgIGxsdm06OkZvbGRpbmdTZXQ8RXhwbG9kZWROb2RlPiBOb2RlczsKKworICAvLy8gQlZDIC0gQWxsb2NhdG9yIGFuZCBjb250ZXh0IGZvciBhbGxvY2F0aW5nIG5vZGVzIGFuZCB0aGVpciBwcmVkZWNlc3NvcgorICAvLy8gYW5kIHN1Y2Nlc3NvciBncm91cHMuCisgIEJ1bXBWZWN0b3JDb250ZXh0IEJWQzsKKworICAvLy8gTnVtTm9kZXMgLSBUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBncmFwaC4KKyAgdW5zaWduZWQgTnVtTm9kZXMgPSAwOworICAKKyAgLy8vIEEgbGlzdCBvZiByZWNlbnRseSBhbGxvY2F0ZWQgbm9kZXMgdGhhdCBjYW4gcG90ZW50aWFsbHkgYmUgcmVjeWNsZWQuCisgIE5vZGVWZWN0b3IgQ2hhbmdlZE5vZGVzOworICAKKyAgLy8vIEEgbGlzdCBvZiBub2RlcyB0aGF0IGNhbiBiZSByZXVzZWQuCisgIE5vZGVWZWN0b3IgRnJlZU5vZGVzOworICAKKyAgLy8vIERldGVybWluZXMgaG93IG9mdGVuIG5vZGVzIGFyZSByZWNsYWltZWQuCisgIC8vLworICAvLy8gSWYgdGhpcyBpcyAwLCBub2RlcyB3aWxsIG5ldmVyIGJlIHJlY2xhaW1lZC4KKyAgdW5zaWduZWQgUmVjbGFpbU5vZGVJbnRlcnZhbCA9IDA7CisgIAorICAvLy8gQ291bnRlciB0byBkZXRlcm1pbmUgd2hlbiB0byByZWNsYWltIG5vZGVzLgorICB1bnNpZ25lZCBSZWNsYWltQ291bnRlcjsKKworcHVibGljOgorICBFeHBsb2RlZEdyYXBoKCk7CisgIH5FeHBsb2RlZEdyYXBoKCk7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbm9kZSBhc3NvY2lhdGVkIHdpdGggYSAoTG9jYXRpb24sU3RhdGUpIHBhaXIsCisgIC8vLyAgd2hlcmUgdGhlICdMb2NhdGlvbicgaXMgYSBQcm9ncmFtUG9pbnQgaW4gdGhlIENGRy4gIElmIG5vIG5vZGUgZm9yCisgIC8vLyAgdGhpcyBwYWlyIGV4aXN0cywgaXQgaXMgY3JlYXRlZC4gSXNOZXcgaXMgc2V0IHRvIHRydWUgaWYKKyAgLy8vICB0aGUgbm9kZSB3YXMgZnJlc2hseSBjcmVhdGVkLgorICBFeHBsb2RlZE5vZGUgKmdldE5vZGUoY29uc3QgUHJvZ3JhbVBvaW50ICZMLCBQcm9ncmFtU3RhdGVSZWYgU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzU2luayA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogSXNOZXcgPSBudWxscHRyKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5vZGUgZm9yIGEgKExvY2F0aW9uLCBTdGF0ZSkgcGFpciwKKyAgLy8vICBidXQgZG9uJ3Qgc3RvcmUgaXQgZm9yIGRlZHVwbGljYXRpb24gbGF0ZXIuICBUaGlzCisgIC8vLyAgaXMgdXNlZnVsIHdoZW4gY29weWluZyBhbiBhbHJlYWR5IGNvbXBsZXRlZAorICAvLy8gIEV4cGxvZGVkR3JhcGggZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgRXhwbG9kZWROb2RlICpjcmVhdGVVbmNhY2hlZE5vZGUoY29uc3QgUHJvZ3JhbVBvaW50ICZMLAorICAgIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICBib29sIElzU2luayA9IGZhbHNlKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8RXhwbG9kZWRHcmFwaD4gTWFrZUVtcHR5R3JhcGgoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VfdW5pcXVlPEV4cGxvZGVkR3JhcGg+KCk7CisgIH0KKworICAvLy8gYWRkUm9vdCAtIEFkZCBhbiB1bnR5cGVkIG5vZGUgdG8gdGhlIHNldCBvZiByb290cy4KKyAgRXhwbG9kZWROb2RlICphZGRSb290KEV4cGxvZGVkTm9kZSAqVikgeworICAgIFJvb3RzLnB1c2hfYmFjayhWKTsKKyAgICByZXR1cm4gVjsKKyAgfQorCisgIC8vLyBhZGRFbmRPZlBhdGggLSBBZGQgYW4gdW50eXBlZCBub2RlIHRvIHRoZSBzZXQgb2YgRU9QIG5vZGVzLgorICBFeHBsb2RlZE5vZGUgKmFkZEVuZE9mUGF0aChFeHBsb2RlZE5vZGUgKlYpIHsKKyAgICBFbmROb2Rlcy5wdXNoX2JhY2soVik7CisgICAgcmV0dXJuIFY7CisgIH0KKworICB1bnNpZ25lZCBudW1fcm9vdHMoKSBjb25zdCB7IHJldHVybiBSb290cy5zaXplKCk7IH0KKyAgdW5zaWduZWQgbnVtX2VvcHMoKSBjb25zdCB7IHJldHVybiBFbmROb2Rlcy5zaXplKCk7IH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gTnVtTm9kZXMgPT0gMDsgfQorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gTnVtTm9kZXM7IH0KKworICB2b2lkIHJlc2VydmUodW5zaWduZWQgTm9kZUNvdW50KSB7IE5vZGVzLnJlc2VydmUoTm9kZUNvdW50KTsgfQorCisgIC8vIEl0ZXJhdG9ycy4KKyAgdXNpbmcgTm9kZVR5ID0gRXhwbG9kZWROb2RlOworICB1c2luZyBBbGxOb2Rlc1R5ID0gbGx2bTo6Rm9sZGluZ1NldDxFeHBsb2RlZE5vZGU+OworICB1c2luZyByb290c19pdGVyYXRvciA9IE5vZGVWZWN0b3I6Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9yb290c19pdGVyYXRvciA9IE5vZGVWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBlb3BfaXRlcmF0b3IgPSBOb2RlVmVjdG9yOjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfZW9wX2l0ZXJhdG9yID0gTm9kZVZlY3Rvcjo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIG5vZGVfaXRlcmF0b3IgPSBBbGxOb2Rlc1R5OjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3Rfbm9kZV9pdGVyYXRvciA9IEFsbE5vZGVzVHk6OmNvbnN0X2l0ZXJhdG9yOworCisgIG5vZGVfaXRlcmF0b3Igbm9kZXNfYmVnaW4oKSB7IHJldHVybiBOb2Rlcy5iZWdpbigpOyB9CisKKyAgbm9kZV9pdGVyYXRvciBub2Rlc19lbmQoKSB7IHJldHVybiBOb2Rlcy5lbmQoKTsgfQorCisgIGNvbnN0X25vZGVfaXRlcmF0b3Igbm9kZXNfYmVnaW4oKSBjb25zdCB7IHJldHVybiBOb2Rlcy5iZWdpbigpOyB9CisKKyAgY29uc3Rfbm9kZV9pdGVyYXRvciBub2Rlc19lbmQoKSBjb25zdCB7IHJldHVybiBOb2Rlcy5lbmQoKTsgfQorCisgIHJvb3RzX2l0ZXJhdG9yIHJvb3RzX2JlZ2luKCkgeyByZXR1cm4gUm9vdHMuYmVnaW4oKTsgfQorCisgIHJvb3RzX2l0ZXJhdG9yIHJvb3RzX2VuZCgpIHsgcmV0dXJuIFJvb3RzLmVuZCgpOyB9CisKKyAgY29uc3Rfcm9vdHNfaXRlcmF0b3Igcm9vdHNfYmVnaW4oKSBjb25zdCB7IHJldHVybiBSb290cy5iZWdpbigpOyB9CisKKyAgY29uc3Rfcm9vdHNfaXRlcmF0b3Igcm9vdHNfZW5kKCkgY29uc3QgeyByZXR1cm4gUm9vdHMuZW5kKCk7IH0KKworICBlb3BfaXRlcmF0b3IgZW9wX2JlZ2luKCkgeyByZXR1cm4gRW5kTm9kZXMuYmVnaW4oKTsgfQorCisgIGVvcF9pdGVyYXRvciBlb3BfZW5kKCkgeyByZXR1cm4gRW5kTm9kZXMuZW5kKCk7IH0KKworICBjb25zdF9lb3BfaXRlcmF0b3IgZW9wX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gRW5kTm9kZXMuYmVnaW4oKTsgfQorCisgIGNvbnN0X2VvcF9pdGVyYXRvciBlb3BfZW5kKCkgY29uc3QgeyByZXR1cm4gRW5kTm9kZXMuZW5kKCk7IH0KKworICBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yICYgZ2V0QWxsb2NhdG9yKCkgeyByZXR1cm4gQlZDLmdldEFsbG9jYXRvcigpOyB9CisgIEJ1bXBWZWN0b3JDb250ZXh0ICZnZXROb2RlQWxsb2NhdG9yKCkgeyByZXR1cm4gQlZDOyB9CisKKyAgdXNpbmcgTm9kZU1hcCA9IGxsdm06OkRlbnNlTWFwPGNvbnN0IEV4cGxvZGVkTm9kZSAqLCBFeHBsb2RlZE5vZGUgKj47CisKKyAgLy8vIENyZWF0ZXMgYSB0cmltbWVkIHZlcnNpb24gb2YgdGhlIGdyYXBoIHRoYXQgb25seSBjb250YWlucyBwYXRocyBsZWFkaW5nCisgIC8vLyB0byB0aGUgZ2l2ZW4gbm9kZXMuCisgIC8vLworICAvLy8gXHBhcmFtIE5vZGVzIFRoZSBub2RlcyB3aGljaCBtdXN0IGFwcGVhciBpbiB0aGUgZmluYWwgZ3JhcGguIFByZXN1bWFibHkKKyAgLy8vICAgICAgICAgICAgICB0aGVzZSBhcmUgZW5kLW9mLXBhdGggbm9kZXMgKGkuZS4gdGhleSBoYXZlIG5vIHN1Y2Nlc3NvcnMpLgorICAvLy8gXHBhcmFtW291dF0gRm9yd2FyZE1hcCBBIG9wdGlvbmFsIG1hcCBmcm9tIG5vZGVzIGluIHRoaXMgZ3JhcGggdG8gbm9kZXMgaW4KKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJldHVybmVkIGdyYXBoLgorICAvLy8gXHBhcmFtW291dF0gSW52ZXJzZU1hcCBBbiBvcHRpb25hbCBtYXAgZnJvbSBub2RlcyBpbiB0aGUgcmV0dXJuZWQgZ3JhcGggdG8KKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMgaW4gdGhpcyBncmFwaC4KKyAgLy8vIFxyZXR1cm5zIFRoZSB0cmltbWVkIGdyYXBoCisgIHN0ZDo6dW5pcXVlX3B0cjxFeHBsb2RlZEdyYXBoPgorICB0cmltKEFycmF5UmVmPGNvbnN0IE5vZGVUeSAqPiBOb2RlcywKKyAgICAgICBJbnRlckV4cGxvZGVkR3JhcGhNYXAgKkZvcndhcmRNYXAgPSBudWxscHRyLAorICAgICAgIEludGVyRXhwbG9kZWRHcmFwaE1hcCAqSW52ZXJzZU1hcCA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBFbmFibGUgdHJhY2tpbmcgb2YgcmVjZW50bHkgYWxsb2NhdGVkIG5vZGVzIGZvciBwb3RlbnRpYWwgcmVjbGFtYXRpb24KKyAgLy8vIHdoZW4gY2FsbGluZyByZWNsYWltUmVjZW50bHlBbGxvY2F0ZWROb2RlcygpLgorICB2b2lkIGVuYWJsZU5vZGVSZWNsYW1hdGlvbih1bnNpZ25lZCBJbnRlcnZhbCkgeworICAgIFJlY2xhaW1Db3VudGVyID0gUmVjbGFpbU5vZGVJbnRlcnZhbCA9IEludGVydmFsOworICB9CisKKyAgLy8vIFJlY2xhaW0gInVuaW50ZXJlc3RpbmciIG5vZGVzIGNyZWF0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIG1ldGhvZAorICAvLy8gd2FzIGNhbGxlZC4KKyAgdm9pZCByZWNsYWltUmVjZW50bHlBbGxvY2F0ZWROb2RlcygpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIG5vZGVzIGZvciB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBraW5kIGFyZSBhbHdheXMKKyAgLy8vICAgICAgICBrZXB0IGFyb3VuZC4KKyAgc3RhdGljIGJvb2wgaXNJbnRlcmVzdGluZ0xWYWx1ZUV4cHIoY29uc3QgRXhwciAqRXgpOworCitwcml2YXRlOgorICBib29sIHNob3VsZENvbGxlY3QoY29uc3QgRXhwbG9kZWROb2RlICpub2RlKTsKKyAgdm9pZCBjb2xsZWN0Tm9kZShFeHBsb2RlZE5vZGUgKm5vZGUpOworfTsKKworY2xhc3MgRXhwbG9kZWROb2RlU2V0IHsKKyAgdXNpbmcgSW1wbFR5ID0gbGx2bTo6U21hbGxTZXRWZWN0b3I8RXhwbG9kZWROb2RlICosIDQ+OworICBJbXBsVHkgSW1wbDsKKworcHVibGljOgorICBFeHBsb2RlZE5vZGVTZXQoRXhwbG9kZWROb2RlICpOKSB7CisgICAgYXNzZXJ0KE4gJiYgIXN0YXRpY19jYXN0PEV4cGxvZGVkTm9kZSo+KE4pLT5pc1NpbmsoKSk7CisgICAgSW1wbC5pbnNlcnQoTik7CisgIH0KKworICBFeHBsb2RlZE5vZGVTZXQoKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBBZGQoRXhwbG9kZWROb2RlICpOKSB7CisgICAgaWYgKE4gJiYgIXN0YXRpY19jYXN0PEV4cGxvZGVkTm9kZSo+KE4pLT5pc1NpbmsoKSkgSW1wbC5pbnNlcnQoTik7CisgIH0KKworICB1c2luZyBpdGVyYXRvciA9IEltcGxUeTo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gSW1wbFR5Ojpjb25zdF9pdGVyYXRvcjsKKworICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gSW1wbC5zaXplKCk7ICB9CisgIGJvb2wgZW1wdHkoKSAgICBjb25zdCB7IHJldHVybiBJbXBsLmVtcHR5KCk7IH0KKyAgYm9vbCBlcmFzZShFeHBsb2RlZE5vZGUgKk4pIHsgcmV0dXJuIEltcGwucmVtb3ZlKE4pOyB9CisKKyAgdm9pZCBjbGVhcigpIHsgSW1wbC5jbGVhcigpOyB9CisKKyAgdm9pZCBpbnNlcnQoY29uc3QgRXhwbG9kZWROb2RlU2V0ICZTKSB7CisgICAgYXNzZXJ0KCZTICE9IHRoaXMpOworICAgIGlmIChlbXB0eSgpKQorICAgICAgSW1wbCA9IFMuSW1wbDsKKyAgICBlbHNlCisgICAgICBJbXBsLmluc2VydChTLmJlZ2luKCksIFMuZW5kKCkpOworICB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBJbXBsLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gSW1wbC5lbmQoKTsgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gSW1wbC5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEltcGwuZW5kKCk7IH0KK307CisKK30gLy8gbmFtZXNwYWNlIGVudG8KKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworLy8gR3JhcGhUcmFpdHMKKworbmFtZXNwYWNlIGxsdm0geworCisgIHRlbXBsYXRlPD4gc3RydWN0IEdyYXBoVHJhaXRzPGNsYW5nOjplbnRvOjpFeHBsb2RlZE5vZGUqPiB7CisgICAgdXNpbmcgTm9kZVJlZiA9IGNsYW5nOjplbnRvOjpFeHBsb2RlZE5vZGUgKjsKKyAgICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9IGNsYW5nOjplbnRvOjpFeHBsb2RlZE5vZGU6OnN1Y2NfaXRlcmF0b3I7CisgICAgdXNpbmcgbm9kZXNfaXRlcmF0b3IgPSBsbHZtOjpkZl9pdGVyYXRvcjxOb2RlUmVmPjsKKworICAgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShOb2RlUmVmIE4pIHsgcmV0dXJuIE47IH0KKworICAgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPnN1Y2NfYmVnaW4oKTsgfQorCisgICAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPnN1Y2NfZW5kKCk7IH0KKworICAgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIGRmX2JlZ2luKE4pOyB9CisKKyAgICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gZGZfZW5kKE4pOyB9CisgIH07CisKKyAgdGVtcGxhdGU8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8Y29uc3QgY2xhbmc6OmVudG86OkV4cGxvZGVkTm9kZSo+IHsKKyAgICB1c2luZyBOb2RlUmVmID0gY29uc3QgY2xhbmc6OmVudG86OkV4cGxvZGVkTm9kZSAqOworICAgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gY2xhbmc6OmVudG86OkV4cGxvZGVkTm9kZTo6Y29uc3Rfc3VjY19pdGVyYXRvcjsKKyAgICB1c2luZyBub2Rlc19pdGVyYXRvciA9IGxsdm06OmRmX2l0ZXJhdG9yPE5vZGVSZWY+OworCisgICAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKE5vZGVSZWYgTikgeyByZXR1cm4gTjsgfQorCisgICAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+c3VjY19iZWdpbigpOyB9CisKKyAgICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+c3VjY19lbmQoKTsgfQorCisgICAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKE5vZGVSZWYgTikgeyByZXR1cm4gZGZfYmVnaW4oTik7IH0KKworICAgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBkZl9lbmQoTik7IH0KKyAgfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfRVhQTE9ERURHUkFQSF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvRXhwckVuZ2luZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0V4cHJFbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2I1ZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0V4cHJFbmdpbmUuaApAQCAtMCwwICsxLDgzMCBAQAorLy89PT0tIEV4cHJFbmdpbmUuaCAtIFBhdGgtU2Vuc2l0aXZlIEV4cHJlc3Npb24tTGV2ZWwgRGF0YWZsb3cgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgYSBtZXRhLWVuZ2luZSBmb3IgcGF0aC1zZW5zaXRpdmUgZGF0YWZsb3cgYW5hbHlzaXMgdGhhdAorLy8gIGlzIGJ1aWx0IG9uIENvcmVFbmdpbmUsIGJ1dCBwcm92aWRlcyB0aGUgYm9pbGVycGxhdGUgdG8gZXhlY3V0ZSB0cmFuc2ZlcgorLy8gIGZ1bmN0aW9ucyBhbmQgYnVpbGQgdGhlIEV4cGxvZGVkR3JhcGggYXQgdGhlIGV4cHJlc3Npb24gbGV2ZWwuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9FWFBSRU5HSU5FX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfRVhQUkVOR0lORV9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXhwci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQ0ZHLmgiCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvRG9tYWluU3BlY2lmaWMvT2JqQ05vUmV0dXJuLmgiCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvUHJvZ3JhbVBvaW50LmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQnVnUmVwb3J0ZXIvQnVnUmVwb3J0ZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQW5hbHlzaXNNYW5hZ2VyLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0NvcmVFbmdpbmUuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvRnVuY3Rpb25TdW1tYXJ5LmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1Byb2dyYW1TdGF0ZS5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Qcm9ncmFtU3RhdGVUcmFpdC5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Qcm9ncmFtU3RhdGVfRndkLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1NWYWxCdWlsZGVyLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1NWYWxzLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N1YkVuZ2luZS5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Xb3JrTGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBbmFseXNpc0RlY2xDb250ZXh0TWFuYWdlcjsKK2NsYXNzIEFuYWx5emVyT3B0aW9uczsKK2NsYXNzIEFTVENvbnRleHQ7CitjbGFzcyBDb25zdHJ1Y3Rpb25Db250ZXh0OworY2xhc3MgQ1hYQmluZFRlbXBvcmFyeUV4cHI7CitjbGFzcyBDWFhDYXRjaFN0bXQ7CitjbGFzcyBDWFhDb25zdHJ1Y3RFeHByOworY2xhc3MgQ1hYRGVsZXRlRXhwcjsKK2NsYXNzIENYWE5ld0V4cHI7CitjbGFzcyBDWFhUaGlzRXhwcjsKK2NsYXNzIERlY2w7CitjbGFzcyBEZWNsU3RtdDsKK2NsYXNzIEdDQ0FzbVN0bXQ7CitjbGFzcyBMYW1iZGFFeHByOworY2xhc3MgTG9jYXRpb25Db250ZXh0OworY2xhc3MgTWF0ZXJpYWxpemVUZW1wb3JhcnlFeHByOworY2xhc3MgTVNBc21TdG10OworY2xhc3MgTmFtZWREZWNsOworY2xhc3MgT2JqQ0F0U3luY2hyb25pemVkU3RtdDsKK2NsYXNzIE9iakNGb3JDb2xsZWN0aW9uU3RtdDsKK2NsYXNzIE9iakNJdmFyUmVmRXhwcjsKK2NsYXNzIE9iakNNZXNzYWdlRXhwcjsKK2NsYXNzIFJldHVyblN0bXQ7CitjbGFzcyBTdG10OworCituYW1lc3BhY2UgY3Jvc3NfdHUgeworCitjbGFzcyBDcm9zc1RyYW5zbGF0aW9uVW5pdENvbnRleHQ7CisKK30gLy8gbmFtZXNwYWNlIGNyb3NzX3R1CisgIAorbmFtZXNwYWNlIGVudG8geworCitjbGFzcyBCYXNpY1ZhbHVlRmFjdG9yeTsKK2NsYXNzIENhbGxFdmVudDsKK2NsYXNzIENoZWNrZXJNYW5hZ2VyOworY2xhc3MgQ29uc3RyYWludE1hbmFnZXI7CitjbGFzcyBDWFhUZW1wT2JqZWN0UmVnaW9uOworY2xhc3MgTWVtUmVnaW9uOworY2xhc3MgUmVnaW9uQW5kU3ltYm9sSW52YWxpZGF0aW9uVHJhaXRzOworY2xhc3MgU3ltYm9sTWFuYWdlcjsKKworY2xhc3MgRXhwckVuZ2luZSA6IHB1YmxpYyBTdWJFbmdpbmUgeworcHVibGljOgorICAvLy8gVGhlIG1vZGVzIG9mIGlubGluaW5nLCB3aGljaCBvdmVycmlkZSB0aGUgZGVmYXVsdCBhbmFseXNpcy13aWRlIHNldHRpbmdzLgorICBlbnVtIElubGluaW5nTW9kZXMgeworICAgIC8vLyBGb2xsb3cgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIGlubGluaW5nIGNhbGxlZXMuCisgICAgSW5saW5lX1JlZ3VsYXIgPSAwLAorCisgICAgLy8vIERvIG1pbmltYWwgaW5saW5pbmcgb2YgY2FsbGVlcy4KKyAgICBJbmxpbmVfTWluaW1hbCA9IDB4MQorICB9OworCisgIC8vLyBIaW50cyBmb3IgZmlndXJpbmcgb3V0IG9mIGEgY2FsbCBzaG91bGQgYmUgaW5saW5lZCBkdXJpbmcgZXZhbENhbGwoKS4KKyAgc3RydWN0IEV2YWxDYWxsT3B0aW9ucyB7CisgICAgLy8vIFRoaXMgY2FsbCBpcyBhIGNvbnN0cnVjdG9yIG9yIGEgZGVzdHJ1Y3RvciBmb3Igd2hpY2ggd2UgZG8gbm90IGN1cnJlbnRseQorICAgIC8vLyBjb21wdXRlIHRoZSB0aGlzLXJlZ2lvbiBjb3JyZWN0bHkuCisgICAgYm9vbCBJc0N0b3JPckR0b3JXaXRoSW1wcm9wZXJseU1vZGVsZWRUYXJnZXRSZWdpb24gPSBmYWxzZTsKKworICAgIC8vLyBUaGlzIGNhbGwgaXMgYSBjb25zdHJ1Y3RvciBvciBhIGRlc3RydWN0b3IgZm9yIGEgc2luZ2xlIGVsZW1lbnQgd2l0aGluCisgICAgLy8vIGFuIGFycmF5LCBhIHBhcnQgb2YgYXJyYXkgY29uc3RydWN0aW9uIG9yIGRlc3RydWN0aW9uLgorICAgIGJvb2wgSXNBcnJheUN0b3JPckR0b3IgPSBmYWxzZTsKKworICAgIC8vLyBUaGlzIGNhbGwgaXMgYSBjb25zdHJ1Y3RvciBvciBhIGRlc3RydWN0b3Igb2YgYSB0ZW1wb3JhcnkgdmFsdWUuCisgICAgYm9vbCBJc1RlbXBvcmFyeUN0b3JPckR0b3IgPSBmYWxzZTsKKworICAgIC8vLyBUaGlzIGNhbGwgaXMgYSBjb25zdHJ1Y3RvciBmb3IgYSB0ZW1wb3JhcnkgdGhhdCBpcyBsaWZldGltZS1leHRlbmRlZAorICAgIC8vLyBieSBiaW5kaW5nIGEgc21hbGxlciBvYmplY3Qgd2l0aGluIGl0IHRvIGEgcmVmZXJlbmNlLCBmb3IgZXhhbXBsZQorICAgIC8vLyAnY29uc3QgaW50ICZ4ID0gQygpLng7Jy4KKyAgICBib29sIElzVGVtcG9yYXJ5TGlmZXRpbWVFeHRlbmRlZFZpYVN1Ym9iamVjdCA9IGZhbHNlOworCisgICAgLy8vIFRoaXMgY2FsbCBpcyBhIGNvbnN0cnVjdG9yIGZvciBhIHRlbXBvcmFyeSB0aGF0IGlzIGxpZmV0aW1lLWV4dGVuZGVkCisgICAgLy8vIGJ5IGJpbmRpbmcgaXQgdG8gYSByZWZlcmVuY2UtdHlwZSBmaWVsZCB3aXRoaW4gYW4gYWdncmVnYXRlLAorICAgIC8vLyBmb3IgZXhhbXBsZSAnQSB7IGNvbnN0IEMgJmM7IH07IEEgYSA9IHsgQygpIH07JworICAgIGJvb2wgSXNUZW1wb3JhcnlMaWZldGltZUV4dGVuZGVkVmlhQWdncmVnYXRlID0gZmFsc2U7CisKKyAgICBFdmFsQ2FsbE9wdGlvbnMoKSB7fQorICB9OworCitwcml2YXRlOgorICBjcm9zc190dTo6Q3Jvc3NUcmFuc2xhdGlvblVuaXRDb250ZXh0ICZDVFU7CisKKyAgQW5hbHlzaXNNYW5hZ2VyICZBTWdyOworICAKKyAgQW5hbHlzaXNEZWNsQ29udGV4dE1hbmFnZXIgJkFuYWx5c2lzRGVjbENvbnRleHRzOworCisgIENvcmVFbmdpbmUgRW5naW5lOworCisgIC8vLyBHIC0gdGhlIHNpbXVsYXRpb24gZ3JhcGguCisgIEV4cGxvZGVkR3JhcGggJkc7CisKKyAgLy8vIFN0YXRlTWdyIC0gT2JqZWN0IHRoYXQgbWFuYWdlcyB0aGUgZGF0YSBmb3IgYWxsIGNyZWF0ZWQgc3RhdGVzLgorICBQcm9ncmFtU3RhdGVNYW5hZ2VyIFN0YXRlTWdyOworCisgIC8vLyBTeW1NZ3IgLSBPYmplY3QgdGhhdCBtYW5hZ2VzIHRoZSBzeW1ib2wgaW5mb3JtYXRpb24uCisgIFN5bWJvbE1hbmFnZXIgJlN5bU1ncjsKKworICAvLy8gc3ZhbEJ1aWxkZXIgLSBTVmFsQnVpbGRlciBvYmplY3QgdGhhdCBjcmVhdGVzIFNWYWxzIGZyb20gZXhwcmVzc2lvbnMuCisgIFNWYWxCdWlsZGVyICZzdmFsQnVpbGRlcjsKKworICB1bnNpZ25lZCBpbnQgY3VyclN0bXRJZHggPSAwOworICBjb25zdCBOb2RlQnVpbGRlckNvbnRleHQgKmN1cnJCbGRyQ3R4ID0gbnVsbHB0cjsKKyAgCisgIC8vLyBIZWxwZXIgb2JqZWN0IHRvIGRldGVybWluZSBpZiBhbiBPYmplY3RpdmUtQyBtZXNzYWdlIGV4cHJlc3Npb24KKyAgLy8vIGltcGxpY2l0bHkgbmV2ZXIgcmV0dXJucy4KKyAgT2JqQ05vUmV0dXJuIE9iakNOb1JldDsKKyAgCisgIC8vLyBXaGV0aGVyIG9yIG5vdCBHQyBpcyBlbmFibGVkIGluIHRoaXMgYW5hbHlzaXMuCisgIGJvb2wgT2JqQ0dDRW5hYmxlZDsKKworICAvLy8gVGhlIEJ1Z1JlcG9ydGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVuZ2luZS4gIEl0IGlzIGltcG9ydGFudCB0aGF0CisgIC8vLyAgdGhpcyBvYmplY3QgYmUgcGxhY2VkIGF0IHRoZSB2ZXJ5IGVuZCBvZiBtZW1iZXIgdmFyaWFibGVzIHNvIHRoYXQgaXRzCisgIC8vLyAgZGVzdHJ1Y3RvciBpcyBjYWxsZWQgYmVmb3JlIHRoZSByZXN0IG9mIHRoZSBFeHByRW5naW5lIGlzIGRlc3Ryb3llZC4KKyAgR1JCdWdSZXBvcnRlciBCUjsKKworICAvLy8gVGhlIGZ1bmN0aW9ucyB3aGljaCBoYXZlIGJlZW4gYW5hbHl6ZWQgdGhyb3VnaCBpbmxpbmluZy4gVGhpcyBpcyBvd25lZCBieQorICAvLy8gQW5hbHlzaXNDb25zdW1lci4gSXQgY2FuIGJlIG51bGwuCisgIFNldE9mQ29uc3REZWNscyAqVmlzaXRlZENhbGxlZXM7CisKKyAgLy8vIFRoZSBmbGFnLCB3aGljaCBzcGVjaWZpZXMgdGhlIG1vZGUgb2YgaW5saW5pbmcgZm9yIHRoZSBlbmdpbmUuCisgIElubGluaW5nTW9kZXMgSG93VG9JbmxpbmU7CisKK3B1YmxpYzoKKyAgRXhwckVuZ2luZShjcm9zc190dTo6Q3Jvc3NUcmFuc2xhdGlvblVuaXRDb250ZXh0ICZDVFUsIEFuYWx5c2lzTWFuYWdlciAmbWdyLAorICAgICAgICAgICAgIGJvb2wgZ2NFbmFibGVkLCBTZXRPZkNvbnN0RGVjbHMgKlZpc2l0ZWRDYWxsZWVzSW4sCisgICAgICAgICAgICAgRnVuY3Rpb25TdW1tYXJpZXNUeSAqRlMsIElubGluaW5nTW9kZXMgSG93VG9JbmxpbmVJbik7CisKKyAgfkV4cHJFbmdpbmUoKSBvdmVycmlkZTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIHN0aWxsIHNpbXVsYXRpb24gc3RhdGUgb24gdGhlIHdvcmtsaXN0LgorICBib29sIEV4ZWN1dGVXb3JrTGlzdChjb25zdCBMb2NhdGlvbkNvbnRleHQgKkwsIHVuc2lnbmVkIFN0ZXBzID0gMTUwMDAwKSB7CisgICAgcmV0dXJuIEVuZ2luZS5FeGVjdXRlV29ya0xpc3QoTCwgU3RlcHMsIG51bGxwdHIpOworICB9CisKKyAgLy8vIEV4ZWN1dGUgdGhlIHdvcmsgbGlzdCB3aXRoIGFuIGluaXRpYWwgc3RhdGUuIE5vZGVzIHRoYXQgcmVhY2hlcyB0aGUgZXhpdAorICAvLy8gb2YgdGhlIGZ1bmN0aW9uIGFyZSBhZGRlZCBpbnRvIHRoZSBEc3Qgc2V0LCB3aGljaCByZXByZXNlbnQgdGhlIGV4aXQKKyAgLy8vIHN0YXRlIG9mIHRoZSBmdW5jdGlvbiBjYWxsLiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgc3RpbGwgc2ltdWxhdGlvbgorICAvLy8gc3RhdGUgb24gdGhlIHdvcmtsaXN0LgorICBib29sIEV4ZWN1dGVXb3JrTGlzdFdpdGhJbml0aWFsU3RhdGUoY29uc3QgTG9jYXRpb25Db250ZXh0ICpMLCB1bnNpZ25lZCBTdGVwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdGF0ZVJlZiBJbml0U3RhdGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QpIHsKKyAgICByZXR1cm4gRW5naW5lLkV4ZWN1dGVXb3JrTGlzdFdpdGhJbml0aWFsU3RhdGUoTCwgU3RlcHMsIEluaXRTdGF0ZSwgRHN0KTsKKyAgfQorCisgIC8vLyBnZXRDb250ZXh0IC0gUmV0dXJuIHRoZSBBU1RDb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFuYWx5c2lzLgorICBBU1RDb250ZXh0ICZnZXRDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQU1nci5nZXRBU1RDb250ZXh0KCk7IH0KKworICBBbmFseXNpc01hbmFnZXIgJmdldEFuYWx5c2lzTWFuYWdlcigpIG92ZXJyaWRlIHsgcmV0dXJuIEFNZ3I7IH0KKworICBDaGVja2VyTWFuYWdlciAmZ2V0Q2hlY2tlck1hbmFnZXIoKSBjb25zdCB7CisgICAgcmV0dXJuICpBTWdyLmdldENoZWNrZXJNYW5hZ2VyKCk7CisgIH0KKworICBTVmFsQnVpbGRlciAmZ2V0U1ZhbEJ1aWxkZXIoKSB7IHJldHVybiBzdmFsQnVpbGRlcjsgfQorCisgIEJ1Z1JlcG9ydGVyICZnZXRCdWdSZXBvcnRlcigpIHsgcmV0dXJuIEJSOyB9CisKKyAgY3Jvc3NfdHU6OkNyb3NzVHJhbnNsYXRpb25Vbml0Q29udGV4dCAqCisgIGdldENyb3NzVHJhbnNsYXRpb25Vbml0Q29udGV4dCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gJkNUVTsKKyAgfQorCisgIGNvbnN0IE5vZGVCdWlsZGVyQ29udGV4dCAmZ2V0QnVpbGRlckNvbnRleHQoKSB7CisgICAgYXNzZXJ0KGN1cnJCbGRyQ3R4KTsKKyAgICByZXR1cm4gKmN1cnJCbGRyQ3R4OworICB9CisKKyAgYm9vbCBpc09iakNHQ0VuYWJsZWQoKSB7IHJldHVybiBPYmpDR0NFbmFibGVkOyB9CisKKyAgY29uc3QgU3RtdCAqZ2V0U3RtdCgpIGNvbnN0OworCisgIHZvaWQgR2VuZXJhdGVBdXRvVHJhbnNpdGlvbihFeHBsb2RlZE5vZGUgKk4pOworICB2b2lkIGVucXVldWVFbmRPZlBhdGgoRXhwbG9kZWROb2RlU2V0ICZTKTsKKyAgdm9pZCBHZW5lcmF0ZUNhbGxFeGl0Tm9kZShFeHBsb2RlZE5vZGUgKk4pOworCisgIC8vLyBWaXN1YWxpemUgdGhlIEV4cGxvZGVkR3JhcGggY3JlYXRlZCBieSBleGVjdXRpbmcgdGhlIHNpbXVsYXRpb24uCisgIHZvaWQgVmlld0dyYXBoKGJvb2wgdHJpbSA9IGZhbHNlKTsKKworICAvLy8gVmlzdWFsaXplIGEgdHJpbW1lZCBFeHBsb2RlZEdyYXBoIHRoYXQgb25seSBjb250YWlucyBwYXRocyB0byB0aGUgZ2l2ZW4KKyAgLy8vIG5vZGVzLgorICB2b2lkIFZpZXdHcmFwaChBcnJheVJlZjxjb25zdCBFeHBsb2RlZE5vZGUgKj4gTm9kZXMpOworCisgIC8vLyBnZXRJbml0aWFsU3RhdGUgLSBSZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUgdXNlZCBmb3IgdGhlIHJvb3QgdmVydGV4CisgIC8vLyAgaW4gdGhlIEV4cGxvZGVkR3JhcGguCisgIFByb2dyYW1TdGF0ZVJlZiBnZXRJbml0aWFsU3RhdGUoY29uc3QgTG9jYXRpb25Db250ZXh0ICpJbml0TG9jKSBvdmVycmlkZTsKKworICBFeHBsb2RlZEdyYXBoICZnZXRHcmFwaCgpIHsgcmV0dXJuIEc7IH0KKyAgY29uc3QgRXhwbG9kZWRHcmFwaCAmZ2V0R3JhcGgoKSBjb25zdCB7IHJldHVybiBHOyB9CisKKyAgLy8vIFxicmllZiBSdW4gdGhlIGFuYWx5emVyJ3MgZ2FyYmFnZSBjb2xsZWN0aW9uIC0gcmVtb3ZlIGRlYWQgc3ltYm9scyBhbmQKKyAgLy8vIGJpbmRpbmdzIGZyb20gdGhlIHN0YXRlLgorICAvLy8KKyAgLy8vIENoZWNrZXJzIGNhbiBwYXJ0aWNpcGF0ZSBpbiB0aGlzIHByb2Nlc3Mgd2l0aCB0d28gY2FsbGJhY2tzOgorICAvLy8gXGMgY2hlY2tMaXZlU3ltYm9scyBhbmQgXGMgY2hlY2tEZWFkU3ltYm9scy4gU2VlIHRoZSBDaGVja2VyRG9jdW1lbnRhdGlvbgorICAvLy8gY2xhc3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIE5vZGUgVGhlIHByZWRlY2Vzc29yIG5vZGUsIGZyb20gd2hpY2ggdGhlIHByb2Nlc3Npbmcgc2hvdWxkIHN0YXJ0LgorICAvLy8gXHBhcmFtIE91dCBUaGUgcmV0dXJuZWQgc2V0IG9mIG91dHB1dCBub2Rlcy4KKyAgLy8vIFxwYXJhbSBSZWZlcmVuY2VTdG10IFRoZSBzdGF0ZW1lbnQgd2hpY2ggaXMgYWJvdXQgdG8gYmUgcHJvY2Vzc2VkLgorICAvLy8gICAgICAgIEV2ZXJ5dGhpbmcgbmVlZGVkIGZvciB0aGlzIHN0YXRlbWVudCBzaG91bGQgYmUgY29uc2lkZXJlZCBsaXZlLgorICAvLy8gICAgICAgIEEgbnVsbCBzdGF0ZW1lbnQgbWVhbnMgdGhhdCBldmVyeXRoaW5nIGluIGNoaWxkIExvY2F0aW9uQ29udGV4dHMKKyAgLy8vICAgICAgICBpcyBkZWFkLgorICAvLy8gXHBhcmFtIExDIFRoZSBsb2NhdGlvbiBjb250ZXh0IG9mIHRoZSBccCBSZWZlcmVuY2VTdG10LiBBIG51bGwgbG9jYXRpb24KKyAgLy8vICAgICAgICBjb250ZXh0IG1lYW5zIHRoYXQgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgYW5hbHlzaXMgYW5kIHRoYXQKKyAgLy8vICAgICAgICBhbGwgc3RhdGVtZW50cyBhbmQgbG9jYWwgdmFyaWFibGVzIHNob3VsZCBiZSBjb25zaWRlcmVkIGRlYWQuCisgIC8vLyBccGFyYW0gRGlhZ25vc3RpY1N0bXQgVXNlZCBhcyBhIGxvY2F0aW9uIGZvciBhbnkgd2FybmluZ3MgdGhhdCBzaG91bGQKKyAgLy8vICAgICAgICBvY2N1ciB3aGlsZSByZW1vdmluZyB0aGUgZGVhZCAoZS5nLiBsZWFrcykuIEJ5IGRlZmF1bHQsIHRoZQorICAvLy8gICAgICAgIFxwIFJlZmVyZW5jZVN0bXQgaXMgdXNlZC4KKyAgLy8vIFxwYXJhbSBLIERlbm90ZXMgd2hldGhlciB0aGlzIGlzIGEgcHJlLSBvciBwb3N0LXN0YXRlbWVudCBwdXJnZS4gVGhpcworICAvLy8gICAgICAgIG11c3Qgb25seSBiZSBQcm9ncmFtUG9pbnQ6OlBvc3RTdG10UHVyZ2VEZWFkU3ltYm9sc0tpbmQgaWYgYW4KKyAgLy8vICAgICAgICBlbnRpcmUgbG9jYXRpb24gY29udGV4dCBpcyBiZWluZyBjbGVhcmVkLCBpbiB3aGljaCBjYXNlIHRoZQorICAvLy8gICAgICAgIFxwIFJlZmVyZW5jZVN0bXQgbXVzdCBlaXRoZXIgYmUgYSBSZXR1cm5TdG10IG9yIFxjIE5VTEwuIE90aGVyd2lzZSwKKyAgLy8vICAgICAgICBpdCBtdXN0IGJlIFByb2dyYW1Qb2ludDo6UHJlU3RtdFB1cmdlRGVhZFN5bWJvbHNLaW5kICh0aGUgZGVmYXVsdCkKKyAgLy8vICAgICAgICBhbmQgXHAgUmVmZXJlbmNlU3RtdCBtdXN0IGJlIHZhbGlkIChub24tbnVsbCkuCisgIHZvaWQgcmVtb3ZlRGVhZChFeHBsb2RlZE5vZGUgKk5vZGUsIEV4cGxvZGVkTm9kZVNldCAmT3V0LAorICAgICAgICAgICAgY29uc3QgU3RtdCAqUmVmZXJlbmNlU3RtdCwgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQywKKyAgICAgICAgICAgIGNvbnN0IFN0bXQgKkRpYWdub3N0aWNTdG10ID0gbnVsbHB0ciwKKyAgICAgICAgICAgIFByb2dyYW1Qb2ludDo6S2luZCBLID0gUHJvZ3JhbVBvaW50OjpQcmVTdG10UHVyZ2VEZWFkU3ltYm9sc0tpbmQpOworCisgIC8vLyBwcm9jZXNzQ0ZHRWxlbWVudCAtIENhbGxlZCBieSBDb3JlRW5naW5lLiBVc2VkIHRvIGdlbmVyYXRlIG5ldyBzdWNjZXNzb3IKKyAgLy8vICBub2RlcyBieSBwcm9jZXNzaW5nIHRoZSAnZWZmZWN0cycgb2YgYSBDRkcgZWxlbWVudC4KKyAgdm9pZCBwcm9jZXNzQ0ZHRWxlbWVudChjb25zdCBDRkdFbGVtZW50IEUsIEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdG10SWR4LCBOb2RlQnVpbGRlckNvbnRleHQgKkN0eCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBQcm9jZXNzU3RtdChjb25zdCBTdG10ICpTLCBFeHBsb2RlZE5vZGUgKlByZWQpOworCisgIHZvaWQgUHJvY2Vzc0xvb3BFeGl0KGNvbnN0IFN0bXQqIFMsIEV4cGxvZGVkTm9kZSAqUHJlZCk7CisKKyAgdm9pZCBQcm9jZXNzSW5pdGlhbGl6ZXIoY29uc3QgQ0ZHSW5pdGlhbGl6ZXIgSSwgRXhwbG9kZWROb2RlICpQcmVkKTsKKworICB2b2lkIFByb2Nlc3NJbXBsaWNpdER0b3IoY29uc3QgQ0ZHSW1wbGljaXREdG9yIEQsIEV4cGxvZGVkTm9kZSAqUHJlZCk7CisKKyAgdm9pZCBQcm9jZXNzTmV3QWxsb2NhdG9yKGNvbnN0IENYWE5ld0V4cHIgKk5FLCBFeHBsb2RlZE5vZGUgKlByZWQpOworCisgIHZvaWQgUHJvY2Vzc0F1dG9tYXRpY09iakR0b3IoY29uc3QgQ0ZHQXV0b21hdGljT2JqRHRvciBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwgRXhwbG9kZWROb2RlU2V0ICZEc3QpOworICB2b2lkIFByb2Nlc3NEZWxldGVEdG9yKGNvbnN0IENGR0RlbGV0ZUR0b3IgRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsIEV4cGxvZGVkTm9kZVNldCAmRHN0KTsKKyAgdm9pZCBQcm9jZXNzQmFzZUR0b3IoY29uc3QgQ0ZHQmFzZUR0b3IgRCwKKyAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlICpQcmVkLCBFeHBsb2RlZE5vZGVTZXQgJkRzdCk7CisgIHZvaWQgUHJvY2Vzc01lbWJlckR0b3IoY29uc3QgQ0ZHTWVtYmVyRHRvciBELAorICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwgRXhwbG9kZWROb2RlU2V0ICZEc3QpOworICB2b2lkIFByb2Nlc3NUZW1wb3JhcnlEdG9yKGNvbnN0IENGR1RlbXBvcmFyeUR0b3IgRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlICpQcmVkLCBFeHBsb2RlZE5vZGVTZXQgJkRzdCk7CisKKyAgLy8vIENhbGxlZCBieSBDb3JlRW5naW5lIHdoZW4gcHJvY2Vzc2luZyB0aGUgZW50cmFuY2Ugb2YgYSBDRkdCbG9jay4KKyAgdm9pZCBwcm9jZXNzQ0ZHQmxvY2tFbnRyYW5jZShjb25zdCBCbG9ja0VkZ2UgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZUJ1aWxkZXJXaXRoU2lua3MgJm5vZGVCdWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCkgb3ZlcnJpZGU7CisgCisgIC8vLyBQcm9jZXNzQnJhbmNoIC0gQ2FsbGVkIGJ5IENvcmVFbmdpbmUuICBVc2VkIHRvIGdlbmVyYXRlIHN1Y2Nlc3NvcgorICAvLy8gIG5vZGVzIGJ5IHByb2Nlc3NpbmcgdGhlICdlZmZlY3RzJyBvZiBhIGJyYW5jaCBjb25kaXRpb24uCisgIHZvaWQgcHJvY2Vzc0JyYW5jaChjb25zdCBTdG10ICpDb25kaXRpb24sIGNvbnN0IFN0bXQgKlRlcm0sIAorICAgICAgICAgICAgICAgICAgICAgTm9kZUJ1aWxkZXJDb250ZXh0JiBCdWlsZGVyQ3R4LAorICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkdCbG9jayAqRHN0VCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGR0Jsb2NrICpEc3RGKSBvdmVycmlkZTsKKworICAvLy8gQ2FsbGVkIGJ5IENvcmVFbmdpbmUuCisgIC8vLyBVc2VkIHRvIGdlbmVyYXRlIHN1Y2Nlc3NvciBub2RlcyBmb3IgdGVtcG9yYXJ5IGRlc3RydWN0b3JzIGRlcGVuZGluZworICAvLy8gb24gd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBjb25zdHJ1Y3RvciB3YXMgdmlzaXRlZC4KKyAgdm9pZCBwcm9jZXNzQ2xlYW51cFRlbXBvcmFyeUJyYW5jaChjb25zdCBDWFhCaW5kVGVtcG9yYXJ5RXhwciAqQlRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVCdWlsZGVyQ29udGV4dCAmQmxkQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwgRXhwbG9kZWROb2RlU2V0ICZEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZHQmxvY2sgKkRzdFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZHQmxvY2sgKkRzdEYpIG92ZXJyaWRlOworCisgIC8vLyBDYWxsZWQgYnkgQ29yZUVuZ2luZS4gIFVzZWQgdG8gcHJvY2Vzc2luZyBicmFuY2hpbmcgYmVoYXZpb3IKKyAgLy8vIGF0IHN0YXRpYyBpbml0aWFsaXplcnMuCisgIHZvaWQgcHJvY2Vzc1N0YXRpY0luaXRpYWxpemVyKGNvbnN0IERlY2xTdG10ICpEUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZUJ1aWxkZXJDb250ZXh0JiBCdWlsZGVyQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkdCbG9jayAqRHN0VCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZHQmxvY2sgKkRzdEYpIG92ZXJyaWRlOworCisgIC8vLyBwcm9jZXNzSW5kaXJlY3RHb3RvIC0gQ2FsbGVkIGJ5IENvcmVFbmdpbmUuICBVc2VkIHRvIGdlbmVyYXRlIHN1Y2Nlc3NvcgorICAvLy8gIG5vZGVzIGJ5IHByb2Nlc3NpbmcgdGhlICdlZmZlY3RzJyBvZiBhIGNvbXB1dGVkIGdvdG8ganVtcC4KKyAgdm9pZCBwcm9jZXNzSW5kaXJlY3RHb3RvKEluZGlyZWN0R290b05vZGVCdWlsZGVyJiBidWlsZGVyKSBvdmVycmlkZTsKKworICAvLy8gUHJvY2Vzc1N3aXRjaCAtIENhbGxlZCBieSBDb3JlRW5naW5lLiAgVXNlZCB0byBnZW5lcmF0ZSBzdWNjZXNzb3IKKyAgLy8vICBub2RlcyBieSBwcm9jZXNzaW5nIHRoZSAnZWZmZWN0cycgb2YgYSBzd2l0Y2ggc3RhdGVtZW50LgorICB2b2lkIHByb2Nlc3NTd2l0Y2goU3dpdGNoTm9kZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOworCisgIC8vLyBDYWxsZWQgYnkgQ29yZUVuZ2luZS4gIFVzZWQgdG8gbm90aWZ5IGNoZWNrZXJzIHRoYXQgcHJvY2Vzc2luZyBhCisgIC8vLyBmdW5jdGlvbiBoYXMgYmVndW4uIENhbGxlZCBmb3IgYm90aCBpbmxpbmVkIGFuZCBhbmQgdG9wLWxldmVsIGZ1bmN0aW9ucy4KKyAgdm9pZCBwcm9jZXNzQmVnaW5PZkZ1bmN0aW9uKE5vZGVCdWlsZGVyQ29udGV4dCAmQkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsIEV4cGxvZGVkTm9kZVNldCAmRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvY2tFZGdlICZMKSBvdmVycmlkZTsKKworICAvLy8gQ2FsbGVkIGJ5IENvcmVFbmdpbmUuICBVc2VkIHRvIG5vdGlmeSBjaGVja2VycyB0aGF0IHByb2Nlc3NpbmcgYQorICAvLy8gZnVuY3Rpb24gaGFzIGVuZGVkLiBDYWxsZWQgZm9yIGJvdGggaW5saW5lZCBhbmQgYW5kIHRvcC1sZXZlbCBmdW5jdGlvbnMuCisgIHZvaWQgcHJvY2Vzc0VuZE9mRnVuY3Rpb24oTm9kZUJ1aWxkZXJDb250ZXh0JiBCQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0dXJuU3RtdCAqUlMgPSBudWxscHRyKSBvdmVycmlkZTsKKworICAvLy8gUmVtb3ZlIGRlYWQgYmluZGluZ3Mvc3ltYm9scyBiZWZvcmUgZXhpdGluZyBhIGZ1bmN0aW9uLgorICB2b2lkIHJlbW92ZURlYWRPbkVuZE9mRnVuY3Rpb24oTm9kZUJ1aWxkZXJDb250ZXh0JiBCQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0KTsKKworICAvLy8gR2VuZXJhdGUgdGhlIGVudHJ5IG5vZGUgb2YgdGhlIGNhbGxlZS4KKyAgdm9pZCBwcm9jZXNzQ2FsbEVudGVyKE5vZGVCdWlsZGVyQ29udGV4dCYgQkMsIENhbGxFbnRlciBDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCkgb3ZlcnJpZGU7CisKKyAgLy8vIEdlbmVyYXRlIHRoZSBzZXF1ZW5jZSBvZiBub2RlcyB0aGF0IHNpbXVsYXRlIHRoZSBjYWxsIGV4aXQgYW5kIHRoZSBwb3N0CisgIC8vLyB2aXNpdCBmb3IgQ2FsbEV4cHIuCisgIHZvaWQgcHJvY2Vzc0NhbGxFeGl0KEV4cGxvZGVkTm9kZSAqUHJlZCkgb3ZlcnJpZGU7CisKKyAgLy8vIENhbGxlZCBieSBDb3JlRW5naW5lIHdoZW4gdGhlIGFuYWx5c2lzIHdvcmtsaXN0IGhhcyB0ZXJtaW5hdGVkLgorICB2b2lkIHByb2Nlc3NFbmRXb3JrbGlzdChib29sIGhhc1dvcmtSZW1haW5pbmcpIG92ZXJyaWRlOworCisgIC8vLyBldmFsQXNzdW1lIC0gQ2FsbGJhY2sgZnVuY3Rpb24gaW52b2tlZCBieSB0aGUgQ29uc3RyYWludE1hbmFnZXIgd2hlbgorICAvLy8gIG1ha2luZyBhc3N1bXB0aW9ucyBhYm91dCBzdGF0ZSB2YWx1ZXMuCisgIFByb2dyYW1TdGF0ZVJlZiBwcm9jZXNzQXNzdW1lKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgU1ZhbCBjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFzc3VtcHRpb24pIG92ZXJyaWRlOworCisgIC8vLyBwcm9jZXNzUmVnaW9uQ2hhbmdlcyAtIENhbGxlZCBieSBQcm9ncmFtU3RhdGVNYW5hZ2VyIHdoZW5ldmVyIGEgY2hhbmdlIGlzIG1hZGUKKyAgLy8vICB0byB0aGUgc3RvcmUuIFVzZWQgdG8gdXBkYXRlIGNoZWNrZXJzIHRoYXQgdHJhY2sgcmVnaW9uIHZhbHVlcy4KKyAgUHJvZ3JhbVN0YXRlUmVmIAorICBwcm9jZXNzUmVnaW9uQ2hhbmdlcyhQcm9ncmFtU3RhdGVSZWYgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludmFsaWRhdGVkU3ltYm9scyAqaW52YWxpZGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IE1lbVJlZ2lvbiAqPiBFeHBsaWNpdFJlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IE1lbVJlZ2lvbiAqPiBSZWdpb25zLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFdmVudCAqQ2FsbCkgb3ZlcnJpZGU7CisKKyAgLy8vIHByaW50U3RhdGUgLSBDYWxsZWQgYnkgUHJvZ3JhbVN0YXRlTWFuYWdlciB0byBwcmludCBjaGVja2VyLXNwZWNpZmljIGRhdGEuCisgIHZvaWQgcHJpbnRTdGF0ZShyYXdfb3N0cmVhbSAmT3V0LCBQcm9ncmFtU3RhdGVSZWYgU3RhdGUsIGNvbnN0IGNoYXIgKk5MLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqU2VwLAorICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4ID0gbnVsbHB0cikgb3ZlcnJpZGU7CisKKyAgUHJvZ3JhbVN0YXRlTWFuYWdlciAmZ2V0U3RhdGVNYW5hZ2VyKCkgb3ZlcnJpZGUgeyByZXR1cm4gU3RhdGVNZ3I7IH0KKworICBTdG9yZU1hbmFnZXIgJmdldFN0b3JlTWFuYWdlcigpIHsgcmV0dXJuIFN0YXRlTWdyLmdldFN0b3JlTWFuYWdlcigpOyB9CisKKyAgQ29uc3RyYWludE1hbmFnZXIgJmdldENvbnN0cmFpbnRNYW5hZ2VyKCkgeworICAgIHJldHVybiBTdGF0ZU1nci5nZXRDb25zdHJhaW50TWFuYWdlcigpOworICB9CisKKyAgLy8gRklYTUU6IFJlbW92ZSB3aGVuIHdlIG1pZ3JhdGUgb3ZlciB0byBqdXN0IHVzaW5nIFNWYWxCdWlsZGVyLgorICBCYXNpY1ZhbHVlRmFjdG9yeSAmZ2V0QmFzaWNWYWxzKCkgeworICAgIHJldHVybiBTdGF0ZU1nci5nZXRCYXNpY1ZhbHMoKTsKKyAgfQorCisgIC8vIEZJWE1FOiBSZW1vdmUgd2hlbiB3ZSBtaWdyYXRlIG92ZXIgdG8ganVzdCB1c2luZyBWYWx1ZU1hbmFnZXIuCisgIFN5bWJvbE1hbmFnZXIgJmdldFN5bWJvbE1hbmFnZXIoKSB7IHJldHVybiBTeW1NZ3I7IH0KKyAgY29uc3QgU3ltYm9sTWFuYWdlciAmZ2V0U3ltYm9sTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIFN5bU1ncjsgfQorCisgIC8vIEZ1bmN0aW9ucyBmb3IgZXh0ZXJuYWwgY2hlY2tpbmcgb2Ygd2hldGhlciB3ZSBoYXZlIHVuZmluaXNoZWQgd29yaworICBib29sIHdhc0Jsb2Nrc0V4aGF1c3RlZCgpIGNvbnN0IHsgcmV0dXJuIEVuZ2luZS53YXNCbG9ja3NFeGhhdXN0ZWQoKTsgfQorICBib29sIGhhc0VtcHR5V29ya0xpc3QoKSBjb25zdCB7IHJldHVybiAhRW5naW5lLmdldFdvcmtMaXN0KCktPmhhc1dvcmsoKTsgfQorICBib29sIGhhc1dvcmtSZW1haW5pbmcoKSBjb25zdCB7IHJldHVybiBFbmdpbmUuaGFzV29ya1JlbWFpbmluZygpOyB9CisKKyAgY29uc3QgQ29yZUVuZ2luZSAmZ2V0Q29yZUVuZ2luZSgpIGNvbnN0IHsgcmV0dXJuIEVuZ2luZTsgfQorCitwdWJsaWM6CisgIC8vLyBWaXNpdCAtIFRyYW5zZmVyIGZ1bmN0aW9uIGxvZ2ljIGZvciBhbGwgc3RhdGVtZW50cy4gIERpc3BhdGNoZXMgdG8KKyAgLy8vICBvdGhlciBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgc3BlY2lmaWMga2luZHMgb2Ygc3RhdGVtZW50cy4KKyAgdm9pZCBWaXNpdChjb25zdCBTdG10ICpTLCBFeHBsb2RlZE5vZGUgKlByZWQsIEV4cGxvZGVkTm9kZVNldCAmRHN0KTsKKworICAvLy8gVmlzaXRBcnJheVN1YnNjcmlwdEV4cHIgLSBUcmFuc2ZlciBmdW5jdGlvbiBmb3IgYXJyYXkgYWNjZXNzZXMuCisgIHZvaWQgVmlzaXRBcnJheVN1YnNjcmlwdEV4cHIoY29uc3QgQXJyYXlTdWJzY3JpcHRFeHByICpFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QpOworCisgIC8vLyBWaXNpdEdDQ0FzbVN0bXQgLSBUcmFuc2ZlciBmdW5jdGlvbiBsb2dpYyBmb3IgaW5saW5lIGFzbS4KKyAgdm9pZCBWaXNpdEdDQ0FzbVN0bXQoY29uc3QgR0NDQXNtU3RtdCAqQSwgRXhwbG9kZWROb2RlICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGVTZXQgJkRzdCk7CisKKyAgLy8vIFZpc2l0TVNBc21TdG10IC0gVHJhbnNmZXIgZnVuY3Rpb24gbG9naWMgZm9yIE1TIGlubGluZSBhc20uCisgIHZvaWQgVmlzaXRNU0FzbVN0bXQoY29uc3QgTVNBc21TdG10ICpBLCBFeHBsb2RlZE5vZGUgKlByZWQsCisgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QpOworCisgIC8vLyBWaXNpdEJsb2NrRXhwciAtIFRyYW5zZmVyIGZ1bmN0aW9uIGxvZ2ljIGZvciBCbG9ja0V4cHJzLgorICB2b2lkIFZpc2l0QmxvY2tFeHByKGNvbnN0IEJsb2NrRXhwciAqQkUsIEV4cGxvZGVkTm9kZSAqUHJlZCwgCisgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QpOworCisgIC8vLyBWaXNpdExhbWJkYUV4cHIgLSBUcmFuc2ZlciBmdW5jdGlvbiBsb2dpYyBmb3IgTGFtYmRhRXhwcnMuCisgIHZvaWQgVmlzaXRMYW1iZGFFeHByKGNvbnN0IExhbWJkYUV4cHIgKkxFLCBFeHBsb2RlZE5vZGUgKlByZWQsIAorICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGVTZXQgJkRzdCk7CisKKyAgLy8vIFZpc2l0QmluYXJ5T3BlcmF0b3IgLSBUcmFuc2ZlciBmdW5jdGlvbiBsb2dpYyBmb3IgYmluYXJ5IG9wZXJhdG9ycy4KKyAgdm9pZCBWaXNpdEJpbmFyeU9wZXJhdG9yKGNvbnN0IEJpbmFyeU9wZXJhdG9yKiBCLCBFeHBsb2RlZE5vZGUgKlByZWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QpOworCisKKyAgLy8vIFZpc2l0Q2FsbCAtIFRyYW5zZmVyIGZ1bmN0aW9uIGZvciBmdW5jdGlvbiBjYWxscy4KKyAgdm9pZCBWaXNpdENhbGxFeHByKGNvbnN0IENhbGxFeHByICpDRSwgRXhwbG9kZWROb2RlICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QpOworCisgIC8vLyBWaXNpdENhc3QgLSBUcmFuc2ZlciBmdW5jdGlvbiBsb2dpYyBmb3IgYWxsIGNhc3RzIChpbXBsaWNpdCBhbmQgZXhwbGljaXQpLgorICB2b2lkIFZpc2l0Q2FzdChjb25zdCBDYXN0RXhwciAqQ2FzdEUsIGNvbnN0IEV4cHIgKkV4LCBFeHBsb2RlZE5vZGUgKlByZWQsCisgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0KTsKKworICAvLy8gVmlzaXRDb21wb3VuZExpdGVyYWxFeHByIC0gVHJhbnNmZXIgZnVuY3Rpb24gbG9naWMgZm9yIGNvbXBvdW5kIGxpdGVyYWxzLgorICB2b2lkIFZpc2l0Q29tcG91bmRMaXRlcmFsRXhwcihjb25zdCBDb21wb3VuZExpdGVyYWxFeHByICpDTCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwgRXhwbG9kZWROb2RlU2V0ICZEc3QpOworCisgIC8vLyBUcmFuc2ZlciBmdW5jdGlvbiBsb2dpYyBmb3IgRGVjbFJlZkV4cHJzIGFuZCBCbG9ja0RlY2xSZWZFeHBycy4KKyAgdm9pZCBWaXNpdENvbW1vbkRlY2xSZWZFeHByKGNvbnN0IEV4cHIgKkRSLCBjb25zdCBOYW1lZERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsIEV4cGxvZGVkTm9kZVNldCAmRHN0KTsKKyAgCisgIC8vLyBWaXNpdERlY2xTdG10IC0gVHJhbnNmZXIgZnVuY3Rpb24gbG9naWMgZm9yIERlY2xTdG10cy4KKyAgdm9pZCBWaXNpdERlY2xTdG10KGNvbnN0IERlY2xTdG10ICpEUywgRXhwbG9kZWROb2RlICpQcmVkLCAKKyAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0KTsKKworICAvLy8gVmlzaXRHdWFyZGVkRXhwciAtIFRyYW5zZmVyIGZ1bmN0aW9uIGxvZ2ljIGZvciA/LCBfX2J1aWx0aW5fY2hvb3NlCisgIHZvaWQgVmlzaXRHdWFyZGVkRXhwcihjb25zdCBFeHByICpFeCwgY29uc3QgRXhwciAqTCwgY29uc3QgRXhwciAqUiwgCisgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsIEV4cGxvZGVkTm9kZVNldCAmRHN0KTsKKyAgCisgIHZvaWQgVmlzaXRJbml0TGlzdEV4cHIoY29uc3QgSW5pdExpc3RFeHByICpFLCBFeHBsb2RlZE5vZGUgKlByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QpOworCisgIC8vLyBWaXNpdExvZ2ljYWxFeHByIC0gVHJhbnNmZXIgZnVuY3Rpb24gbG9naWMgZm9yICcmJicsICd8fCcKKyAgdm9pZCBWaXNpdExvZ2ljYWxFeHByKGNvbnN0IEJpbmFyeU9wZXJhdG9yKiBCLCBFeHBsb2RlZE5vZGUgKlByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGVTZXQgJkRzdCk7CisKKyAgLy8vIFZpc2l0TWVtYmVyRXhwciAtIFRyYW5zZmVyIGZ1bmN0aW9uIGZvciBtZW1iZXIgZXhwcmVzc2lvbnMuCisgIHZvaWQgVmlzaXRNZW1iZXJFeHByKGNvbnN0IE1lbWJlckV4cHIgKk0sIEV4cGxvZGVkTm9kZSAqUHJlZCwgCisgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0KTsKKworICAvLy8gVmlzaXRBdG9taWNFeHByIC0gVHJhbnNmZXIgZnVuY3Rpb24gZm9yIGJ1aWx0aW4gYXRvbWljIGV4cHJlc3Npb25zCisgIHZvaWQgVmlzaXRBdG9taWNFeHByKGNvbnN0IEF0b21pY0V4cHIgKkUsIEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QpOworCisgIC8vLyBUcmFuc2ZlciBmdW5jdGlvbiBsb2dpYyBmb3IgT2JqQ0F0U3luY2hyb25pemVkU3RtdHMuCisgIHZvaWQgVmlzaXRPYmpDQXRTeW5jaHJvbml6ZWRTdG10KGNvbnN0IE9iakNBdFN5bmNocm9uaXplZFN0bXQgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwgRXhwbG9kZWROb2RlU2V0ICZEc3QpOworCisgIC8vLyBUcmFuc2ZlciBmdW5jdGlvbiBsb2dpYyBmb3IgY29tcHV0aW5nIHRoZSBsdmFsdWUgb2YgYW4gT2JqZWN0aXZlLUMgaXZhci4KKyAgdm9pZCBWaXNpdEx2YWxPYmpDSXZhclJlZkV4cHIoY29uc3QgT2JqQ0l2YXJSZWZFeHByICpEUiwgRXhwbG9kZWROb2RlICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGVTZXQgJkRzdCk7CisKKyAgLy8vIFZpc2l0T2JqQ0ZvckNvbGxlY3Rpb25TdG10IC0gVHJhbnNmZXIgZnVuY3Rpb24gbG9naWMgZm9yCisgIC8vLyAgT2JqQ0ZvckNvbGxlY3Rpb25TdG10LgorICB2b2lkIFZpc2l0T2JqQ0ZvckNvbGxlY3Rpb25TdG10KGNvbnN0IE9iakNGb3JDb2xsZWN0aW9uU3RtdCAqUywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlICpQcmVkLCBFeHBsb2RlZE5vZGVTZXQgJkRzdCk7CisKKyAgdm9pZCBWaXNpdE9iakNNZXNzYWdlKGNvbnN0IE9iakNNZXNzYWdlRXhwciAqTUUsIEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0KTsKKworICAvLy8gVmlzaXRSZXR1cm5TdG10IC0gVHJhbnNmZXIgZnVuY3Rpb24gbG9naWMgZm9yIHJldHVybiBzdGF0ZW1lbnRzLgorICB2b2lkIFZpc2l0UmV0dXJuU3RtdChjb25zdCBSZXR1cm5TdG10ICpSLCBFeHBsb2RlZE5vZGUgKlByZWQsIAorICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGVTZXQgJkRzdCk7CisgIAorICAvLy8gVmlzaXRPZmZzZXRPZkV4cHIgLSBUcmFuc2ZlciBmdW5jdGlvbiBmb3Igb2Zmc2V0b2YuCisgIHZvaWQgVmlzaXRPZmZzZXRPZkV4cHIoY29uc3QgT2Zmc2V0T2ZFeHByICpFeCwgRXhwbG9kZWROb2RlICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0KTsKKworICAvLy8gVmlzaXRVbmFyeUV4cHJPclR5cGVUcmFpdEV4cHIgLSBUcmFuc2ZlciBmdW5jdGlvbiBmb3Igc2l6ZW9mLgorICB2b2lkIFZpc2l0VW5hcnlFeHByT3JUeXBlVHJhaXRFeHByKGNvbnN0IFVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwciAqRXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlICpQcmVkLCBFeHBsb2RlZE5vZGVTZXQgJkRzdCk7CisKKyAgLy8vIFZpc2l0VW5hcnlPcGVyYXRvciAtIFRyYW5zZmVyIGZ1bmN0aW9uIGxvZ2ljIGZvciB1bmFyeSBvcGVyYXRvcnMuCisgIHZvaWQgVmlzaXRVbmFyeU9wZXJhdG9yKGNvbnN0IFVuYXJ5T3BlcmF0b3IqIEIsIEV4cGxvZGVkTm9kZSAqUHJlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0KTsKKworICAvLy8gSGFuZGxlICsrIGFuZCAtLSAoYm90aCBwcmUtIGFuZCBwb3N0LWluY3JlbWVudCkuCisgIHZvaWQgVmlzaXRJbmNyZW1lbnREZWNyZW1lbnRPcGVyYXRvcihjb25zdCBVbmFyeU9wZXJhdG9yKiBVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QpOworCisgIHZvaWQgVmlzaXRDWFhCaW5kVGVtcG9yYXJ5RXhwcihjb25zdCBDWFhCaW5kVGVtcG9yYXJ5RXhwciAqQlRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZQcmVWaXNpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0KTsKKworICB2b2lkIFZpc2l0Q1hYQ2F0Y2hTdG10KGNvbnN0IENYWENhdGNoU3RtdCAqQ1MsIEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGVTZXQgJkRzdCk7CisKKyAgdm9pZCBWaXNpdENYWFRoaXNFeHByKGNvbnN0IENYWFRoaXNFeHByICpURSwgRXhwbG9kZWROb2RlICpQcmVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmIERzdCk7CisKKyAgdm9pZCBWaXNpdENYWENvbnN0cnVjdEV4cHIoY29uc3QgQ1hYQ29uc3RydWN0RXhwciAqRSwgRXhwbG9kZWROb2RlICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGVTZXQgJkRzdCk7CisKKyAgdm9pZCBWaXNpdENYWERlc3RydWN0b3IoUXVhbFR5cGUgT2JqZWN0VHlwZSwgY29uc3QgTWVtUmVnaW9uICpEZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdG10ICpTLCBib29sIElzQmFzZUR0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwgRXhwbG9kZWROb2RlU2V0ICZEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV2YWxDYWxsT3B0aW9ucyAmT3B0aW9ucyk7CisKKyAgdm9pZCBWaXNpdENYWE5ld0FsbG9jYXRvckNhbGwoY29uc3QgQ1hYTmV3RXhwciAqQ05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0KTsKKworICB2b2lkIFZpc2l0Q1hYTmV3RXhwcihjb25zdCBDWFhOZXdFeHByICpDTkUsIEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QpOworCisgIHZvaWQgVmlzaXRDWFhEZWxldGVFeHByKGNvbnN0IENYWERlbGV0ZUV4cHIgKkNERSwgRXhwbG9kZWROb2RlICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGVTZXQgJkRzdCk7CisKKyAgLy8vIENyZWF0ZSBhIEMrKyB0ZW1wb3Jhcnkgb2JqZWN0IGZvciBhbiBydmFsdWUuCisgIHZvaWQgQ3JlYXRlQ1hYVGVtcG9yYXJ5T2JqZWN0KGNvbnN0IE1hdGVyaWFsaXplVGVtcG9yYXJ5RXhwciAqTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0KTsKKyAgCisgIC8vLyBldmFsRWFnZXJseUFzc3VtZUJpbk9wQmlmdXJjYXRpb24gLSBHaXZlbiB0aGUgbm9kZXMgaW4gJ1NyYycsIGVhZ2VybHkgYXNzdW1lIHN5bWJvbGljCisgIC8vLyAgZXhwcmVzc2lvbnMgb2YgdGhlIGZvcm0gJ3ggIT0gMCcgYW5kIGdlbmVyYXRlIG5ldyBub2RlcyAoc3RvcmVkIGluIERzdCkKKyAgLy8vICB3aXRoIHRob3NlIGFzc3VtcHRpb25zLgorICB2b2lkIGV2YWxFYWdlcmx5QXNzdW1lQmluT3BCaWZ1cmNhdGlvbihFeHBsb2RlZE5vZGVTZXQgJkRzdCwgRXhwbG9kZWROb2RlU2V0ICZTcmMsIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHIgKkV4KTsKKyAgCisgIHN0ZDo6cGFpcjxjb25zdCBQcm9ncmFtUG9pbnRUYWcgKiwgY29uc3QgUHJvZ3JhbVBvaW50VGFnICo+CisgICAgZ2V0ZWFnZXJseUFzc3VtZUJpbk9wQmlmdXJjYXRpb25UYWdzKCk7CisKKyAgU1ZhbCBldmFsTWludXMoU1ZhbCBYKSB7CisgICAgcmV0dXJuIFguaXNWYWxpZCgpID8gc3ZhbEJ1aWxkZXIuZXZhbE1pbnVzKFguY2FzdEFzPE5vbkxvYz4oKSkgOiBYOworICB9CisKKyAgU1ZhbCBldmFsQ29tcGxlbWVudChTVmFsIFgpIHsKKyAgICByZXR1cm4gWC5pc1ZhbGlkKCkgPyBzdmFsQnVpbGRlci5ldmFsQ29tcGxlbWVudChYLmNhc3RBczxOb25Mb2M+KCkpIDogWDsKKyAgfQorCisgIFByb2dyYW1TdGF0ZVJlZiBoYW5kbGVMVmFsdWVCaXRDYXN0KFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgY29uc3QgRXhwciAqRXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCwgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgRXhUeSwgY29uc3QgQ2FzdEV4cHIgKkNhc3RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10Tm9kZUJ1aWxkZXIgJkJsZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCk7CisKKyAgUHJvZ3JhbVN0YXRlUmVmIGhhbmRsZUxWZWN0b3JTcGxhdChQcm9ncmFtU3RhdGVSZWYgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhc3RFeHByICpDYXN0RSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10Tm9kZUJ1aWxkZXIgJkJsZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlICpQcmVkKTsKKworICB2b2lkIGhhbmRsZVVPRXh0ZW5zaW9uKEV4cGxvZGVkTm9kZVNldDo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbmFyeU9wZXJhdG9yKiBVLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXROb2RlQnVpbGRlciAmQmxkcik7CisKK3B1YmxpYzoKKyAgU1ZhbCBldmFsQmluT3AoUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLCBCaW5hcnlPcGVyYXRvcjo6T3Bjb2RlIG9wLAorICAgICAgICAgICAgICAgICBOb25Mb2MgTCwgTm9uTG9jIFIsIFF1YWxUeXBlIFQpIHsKKyAgICByZXR1cm4gc3ZhbEJ1aWxkZXIuZXZhbEJpbk9wTk4oc3RhdGUsIG9wLCBMLCBSLCBUKTsKKyAgfQorCisgIFNWYWwgZXZhbEJpbk9wKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBvcCwKKyAgICAgICAgICAgICAgICAgTm9uTG9jIEwsIFNWYWwgUiwgUXVhbFR5cGUgVCkgeworICAgIHJldHVybiBSLmlzVmFsaWQoKSA/IHN2YWxCdWlsZGVyLmV2YWxCaW5PcE5OKHN0YXRlLCBvcCwgTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmNhc3RBczxOb25Mb2M+KCksIFQpIDogUjsKKyAgfQorCisgIFNWYWwgZXZhbEJpbk9wKFByb2dyYW1TdGF0ZVJlZiBTVCwgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBPcCwKKyAgICAgICAgICAgICAgICAgU1ZhbCBMSFMsIFNWYWwgUkhTLCBRdWFsVHlwZSBUKSB7CisgICAgcmV0dXJuIHN2YWxCdWlsZGVyLmV2YWxCaW5PcChTVCwgT3AsIExIUywgUkhTLCBUKTsKKyAgfQorICAKK3Byb3RlY3RlZDoKKyAgLy8vIGV2YWxCaW5kIC0gSGFuZGxlIHRoZSBzZW1hbnRpY3Mgb2YgYmluZGluZyBhIHZhbHVlIHRvIGEgc3BlY2lmaWMgbG9jYXRpb24uCisgIC8vLyAgVGhpcyBtZXRob2QgaXMgdXNlZCBieSBldmFsU3RvcmUsIFZpc2l0RGVjbFN0bXQsIGFuZCBvdGhlcnMuCisgIHZvaWQgZXZhbEJpbmQoRXhwbG9kZWROb2RlU2V0ICZEc3QsIGNvbnN0IFN0bXQgKlN0b3JlRSwgRXhwbG9kZWROb2RlICpQcmVkLAorICAgICAgICAgICAgICAgIFNWYWwgbG9jYXRpb24sIFNWYWwgVmFsLCBib29sIGF0RGVjbEluaXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnQgKlBQID0gbnVsbHB0cik7CisKKyAgLy8vIENhbGwgUG9pbnRlckVzY2FwZSBjYWxsYmFjayB3aGVuIGEgdmFsdWUgZXNjYXBlcyBhcyBhIHJlc3VsdCBvZiBiaW5kLgorICBQcm9ncmFtU3RhdGVSZWYgcHJvY2Vzc1BvaW50ZXJFc2NhcGVkT25CaW5kKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVmFsIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVmFsIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgpIG92ZXJyaWRlOworICAvLy8gQ2FsbCBQb2ludGVyRXNjYXBlIGNhbGxiYWNrIHdoZW4gYSB2YWx1ZSBlc2NhcGVzIGFzIGEgcmVzdWx0IG9mCisgIC8vLyByZWdpb24gaW52YWxpZGF0aW9uLgorICAvLy8gXHBhcmFtW2luXSBJVHJhaXRzIFNwZWNpZmllcyBpbnZhbGlkYXRpb24gdHJhaXRzIGZvciByZWdpb25zL3N5bWJvbHMuCisgIFByb2dyYW1TdGF0ZVJlZiBub3RpZnlDaGVja2Vyc09mUG9pbnRlckVzY2FwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludmFsaWRhdGVkU3ltYm9scyAqSW52YWxpZGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBNZW1SZWdpb24gKj4gRXhwbGljaXRSZWdpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgTWVtUmVnaW9uICo+IFJlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsRXZlbnQgKkNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpb25BbmRTeW1ib2xJbnZhbGlkYXRpb25UcmFpdHMgJklUcmFpdHMpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIC8vIEZJWE1FOiAndGFnJyBzaG91bGQgYmUgcmVtb3ZlZCwgYW5kIGEgTG9jYXRpb25Db250ZXh0IHNob3VsZCBiZSB1c2VkCisgIC8vIGluc3RlYWQuCisgIC8vIEZJWE1FOiBDb21tZW50IG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBhcmd1bWVudHMsIHdoZW4gJ1N0JyBtYXkgbm90CisgIC8vIGJlIHRoZSBzYW1lIGFzIFByZWQtPnN0YXRlLCBhbmQgd2hlbiAnbG9jYXRpb24nIG1heSBub3QgYmUgdGhlCisgIC8vIHNhbWUgYXMgc3RhdGUtPmdldExWYWx1ZShFeCkuCisgIC8vLyBTaW11bGF0ZSBhIHJlYWQgb2YgdGhlIHJlc3VsdCBvZiBFeC4KKyAgdm9pZCBldmFsTG9hZChFeHBsb2RlZE5vZGVTZXQgJkRzdCwKKyAgICAgICAgICAgICAgICBjb25zdCBFeHByICpOb2RlRXgsICAvKiBFdmVudHVhbGx5IHdpbGwgYmUgYSBDRkdTdG10ICovCisgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqQm91bmRFeHByLAorICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICBQcm9ncmFtU3RhdGVSZWYgU3QsCisgICAgICAgICAgICAgICAgU1ZhbCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKnRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgUXVhbFR5cGUgTG9hZFR5ID0gUXVhbFR5cGUoKSk7CisKKyAgLy8gRklYTUU6ICd0YWcnIHNob3VsZCBiZSByZW1vdmVkLCBhbmQgYSBMb2NhdGlvbkNvbnRleHQgc2hvdWxkIGJlIHVzZWQKKyAgLy8gaW5zdGVhZC4KKyAgdm9pZCBldmFsU3RvcmUoRXhwbG9kZWROb2RlU2V0ICZEc3QsIGNvbnN0IEV4cHIgKkFzc2lnbkUsIGNvbnN0IEV4cHIgKlN0b3JlRSwKKyAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlICpQcmVkLCBQcm9ncmFtU3RhdGVSZWYgU3QsIFNWYWwgVGFyZ2V0TFYsIFNWYWwgVmFsLAorICAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKnRhZyA9IG51bGxwdHIpOworCisgIC8vLyBSZXR1cm4gdGhlIENGRyBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHdvcmtsaXN0IGVsZW1lbnQKKyAgLy8vIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCBieSBFeHByRW5naW5lLgorICBDRkdFbGVtZW50IGdldEN1cnJlbnRDRkdFbGVtZW50KCkgeworICAgIHJldHVybiAoKmN1cnJCbGRyQ3R4LT5nZXRCbG9jaygpKVtjdXJyU3RtdElkeF07CisgIH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyBzdGF0ZSBpbiB3aGljaCB0aGUgY2FsbCByZXR1cm4gdmFsdWUgaXMgYmluZGVkIHRvIHRoZQorICAvLy8gY2FsbCBvcmlnaW4gZXhwcmVzc2lvbi4KKyAgUHJvZ3JhbVN0YXRlUmVmIGJpbmRSZXR1cm5WYWx1ZShjb25zdCBDYWxsRXZlbnQgJkNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSk7CisKKyAgLy8vIEV2YWx1YXRlIGEgY2FsbCwgcnVubmluZyBwcmUtIGFuZCBwb3N0LWNhbGwgY2hlY2tzIGFuZCBhbGxvd2luZyBjaGVja2VycworICAvLy8gdG8gYmUgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBjYWxsIGl0c2VsZi4KKyAgdm9pZCBldmFsQ2FsbChFeHBsb2RlZE5vZGVTZXQgJkRzdCwgRXhwbG9kZWROb2RlICpQcmVkLAorICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFdmVudCAmQ2FsbCk7CisKKyAgLy8vIFxicmllZiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGNhbGwgZXZhbHVhdGlvbi4KKyAgdm9pZCBkZWZhdWx0RXZhbENhbGwoTm9kZUJ1aWxkZXIgJkIsIEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEV2ZW50ICZDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFdmFsQ2FsbE9wdGlvbnMgJkNhbGxPcHRzID0ge30pOworCitwcml2YXRlOgorICB2b2lkIGV2YWxMb2FkQ29tbW9uKEV4cGxvZGVkTm9kZVNldCAmRHN0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHIgKk5vZGVFeCwgIC8qIEV2ZW50dWFsbHkgd2lsbCBiZSBhIENGR1N0bXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpCb3VuZEV4LAorICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RhdGVSZWYgU3QsCisgICAgICAgICAgICAgICAgICAgICAgU1ZhbCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKnRhZywKKyAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBMb2FkVHkpOworCisgIC8vIEZJWE1FOiAndGFnJyBzaG91bGQgYmUgcmVtb3ZlZCwgYW5kIGEgTG9jYXRpb25Db250ZXh0IHNob3VsZCBiZSB1c2VkCisgIC8vIGluc3RlYWQuCisgIHZvaWQgZXZhbExvY2F0aW9uKEV4cGxvZGVkTm9kZVNldCAmRHN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTdG10ICpOb2RlRXgsIC8qIFRoaXMgd2lsbCBldmVudHVhbGx5IGJlIGEgQ0ZHU3RtdCAqLworICAgICAgICAgICAgICAgICAgICBjb25zdCBTdG10ICpCb3VuZEV4LAorICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsCisgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdGF0ZVJlZiBTdCwgU1ZhbCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZ3JhbVBvaW50VGFnICp0YWcsIGJvb2wgaXNMb2FkKTsKKworICAvLy8gQ291bnQgdGhlIHN0YWNrIGRlcHRoIGFuZCBkZXRlcm1pbmUgaWYgdGhlIGNhbGwgaXMgcmVjdXJzaXZlLgorICB2b2lkIGV4YW1pbmVTdGFja0ZyYW1lcyhjb25zdCBEZWNsICpELCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJklzUmVjdXJzaXZlLCB1bnNpZ25lZCAmU3RhY2tEZXB0aCk7CisKKyAgZW51bSBDYWxsSW5saW5lUG9saWN5IHsKKyAgICBDSVBfQWxsb3dlZCwKKyAgICBDSVBfRGlzYWxsb3dlZE9uY2UsCisgICAgQ0lQX0Rpc2FsbG93ZWRBbHdheXMKKyAgfTsKKworICAvLy8gXGJyaWVmIFNlZSBpZiBhIHBhcnRpY3VsYXIgY2FsbCBzaG91bGQgYmUgaW5saW5lZCwgYnkgb25seSBsb29raW5nCisgIC8vLyBhdCB0aGUgY2FsbCBldmVudCBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYW5hbHlzaXMuCisgIENhbGxJbmxpbmVQb2xpY3kgbWF5SW5saW5lQ2FsbEtpbmQoY29uc3QgQ2FsbEV2ZW50ICZDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFseXplck9wdGlvbnMgJk9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXZhbENhbGxPcHRpb25zICZDYWxsT3B0cyk7CisKKyAgLy8vIENoZWNrcyBvdXIgcG9saWNpZXMgYW5kIGRlY2lkZXMgd2VpdGhlciB0aGUgZ2l2ZW4gY2FsbCBzaG91bGQgYmUgaW5saW5lZC4KKyAgYm9vbCBzaG91bGRJbmxpbmVDYWxsKGNvbnN0IENhbGxFdmVudCAmQ2FsbCwgY29uc3QgRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV2YWxDYWxsT3B0aW9ucyAmQ2FsbE9wdHMgPSB7fSk7CisKKyAgYm9vbCBpbmxpbmVDYWxsKGNvbnN0IENhbGxFdmVudCAmQ2FsbCwgY29uc3QgRGVjbCAqRCwgTm9kZUJ1aWxkZXIgJkJsZHIsCisgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSk7CisKKyAgLy8vIFxicmllZiBDb25zZXJ2YXRpdmVseSBldmFsdWF0ZSBjYWxsIGJ5IGludmFsaWRhdGluZyByZWdpb25zIGFuZCBiaW5kaW5nCisgIC8vLyBhIGNvbmp1cmVkIHJldHVybiB2YWx1ZS4KKyAgdm9pZCBjb25zZXJ2YXRpdmVFdmFsQ2FsbChjb25zdCBDYWxsRXZlbnQgJkNhbGwsIE5vZGVCdWlsZGVyICZCbGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwgUHJvZ3JhbVN0YXRlUmVmIFN0YXRlKTsKKworICAvLy8gXGJyaWVmIEVpdGhlciBpbmxpbmUgb3IgcHJvY2VzcyB0aGUgY2FsbCBjb25zZXJ2YXRpdmVseSAob3IgYm90aCksIGJhc2VkCisgIC8vLyBvbiBEeW5hbWljRGlzcGF0Y2hCaWZ1cmNhdGlvbiBkYXRhLgorICB2b2lkIEJpZnVyY2F0ZUNhbGwoY29uc3QgTWVtUmVnaW9uICpCaWZ1clJlZywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFdmVudCAmQ2FsbCwgY29uc3QgRGVjbCAqRCwgTm9kZUJ1aWxkZXIgJkJsZHIsCisgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQpOworCisgIGJvb2wgcmVwbGF5V2l0aG91dElubGluaW5nKEV4cGxvZGVkTm9kZSAqUCwgY29uc3QgTG9jYXRpb25Db250ZXh0ICpDYWxsZWVMQyk7CisKKyAgLy8vIE1vZGVscyBhIHRyaXZpYWwgY29weSBvciBtb3ZlIGNvbnN0cnVjdG9yIG9yIHRyaXZpYWwgYXNzaWdubWVudCBvcGVyYXRvcgorICAvLy8gY2FsbCB3aXRoIGEgc2ltcGxlIGJpbmQuCisgIHZvaWQgcGVyZm9ybVRyaXZpYWxDb3B5KE5vZGVCdWlsZGVyICZCbGRyLCBFeHBsb2RlZE5vZGUgKlByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFdmVudCAmQ2FsbCk7CisKKyAgLy8vIElmIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBccCBJbml0V2l0aEFkanVzdG1lbnRzIGlzIGEgTm9uTG9jLAorICAvLy8gY29weSBpdCBpbnRvIGEgbmV3IHRlbXBvcmFyeSBvYmplY3QgcmVnaW9uLCBhbmQgcmVwbGFjZSB0aGUgdmFsdWUgb2YgdGhlCisgIC8vLyBleHByZXNzaW9uIHdpdGggdGhhdC4KKyAgLy8vCisgIC8vLyBJZiBccCBSZXN1bHQgaXMgcHJvdmlkZWQsIHRoZSBuZXcgcmVnaW9uIHdpbGwgYmUgYm91bmQgdG8gdGhpcyBleHByZXNzaW9uCisgIC8vLyBpbnN0ZWFkIG9mIFxwIEluaXRXaXRoQWRqdXN0bWVudHMuCisgIFByb2dyYW1TdGF0ZVJlZiBjcmVhdGVUZW1wb3JhcnlSZWdpb25JZk5lZWRlZChQcm9ncmFtU3RhdGVSZWYgU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqSW5pdFdpdGhBZGp1c3RtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHIgKlJlc3VsdCA9IG51bGxwdHIpOworCisgIC8vLyBSZXR1cm5zIGEgcmVnaW9uIHJlcHJlc2VudGluZyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIChwb3NzaWJseQorICAvLy8gbXVsdGktZGltZW5zaW9uYWwpIGFycmF5LCBmb3IgdGhlIHB1cnBvc2VzIG9mIGVsZW1lbnQgY29uc3RydWN0aW9uIG9yCisgIC8vLyBkZXN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBPbiByZXR1cm4sIFxwIFR5IHdpbGwgYmUgc2V0IHRvIHRoZSBiYXNlIHR5cGUgb2YgdGhlIGFycmF5LgorICAvLy8KKyAgLy8vIElmIHRoZSB0eXBlIGlzIG5vdCBhbiBhcnJheSB0eXBlIGF0IGFsbCwgdGhlIG9yaWdpbmFsIHZhbHVlIGlzIHJldHVybmVkLgorICAvLy8gT3RoZXJ3aXNlIHRoZSAiSXNBcnJheSIgZmxhZyBpcyBzZXQuCisgIHN0YXRpYyBTVmFsIG1ha2VaZXJvRWxlbWVudFJlZ2lvbihQcm9ncmFtU3RhdGVSZWYgU3RhdGUsIFNWYWwgTFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgJlR5LCBib29sICZJc0FycmF5KTsKKworICAvLy8gRm9yIGEgRGVjbFN0bXQgb3IgQ1hYSW5pdEN0b3JJbml0aWFsaXplciwgd2FsayBiYWNrd2FyZCBpbiB0aGUgY3VycmVudCBDRkcKKyAgLy8vIGJsb2NrIHRvIGZpbmQgdGhlIGNvbnN0cnVjdG9yIGV4cHJlc3Npb24gdGhhdCBkaXJlY3RseSBjb25zdHJ1Y3RlZCBpbnRvCisgIC8vLyB0aGUgc3RvcmFnZSBmb3IgdGhpcyBzdGF0ZW1lbnQuIFJldHVybnMgbnVsbCBpZiB0aGUgY29uc3RydWN0b3IgZm9yIHRoaXMKKyAgLy8vIHN0YXRlbWVudCBjcmVhdGVkIGEgdGVtcG9yYXJ5IG9iamVjdCByZWdpb24gcmF0aGVyIHRoYW4gZGlyZWN0bHkKKyAgLy8vIGNvbnN0cnVjdGluZyBpbnRvIGFuIGV4aXN0aW5nIHJlZ2lvbi4KKyAgY29uc3QgQ1hYQ29uc3RydWN0RXhwciAqZmluZERpcmVjdENvbnN0cnVjdG9yRm9yQ3VycmVudENGR0VsZW1lbnQoKTsKKworICAvLy8gRm9yIGEgZ2l2ZW4gY29uc3RydWN0b3IsIGxvb2sgZm9yd2FyZCBpbiB0aGUgY3VycmVudCBDRkcgYmxvY2sgdG8KKyAgLy8vIGRldGVybWluZSB0aGUgcmVnaW9uIGludG8gd2hpY2ggYW4gb2JqZWN0IHdpbGwgYmUgY29uc3RydWN0ZWQgYnkgXHAgQ0UuCisgIC8vLyBXaGVuIHRoZSBsb29rYWhlYWQgZmFpbHMsIGEgdGVtcG9yYXJ5IHJlZ2lvbiBpcyByZXR1cm5lZCwgYW5kIHRoZQorICAvLy8gSXNDb25zdHJ1Y3RvcldpdGhJbXByb3Blcmx5TW9kZWxlZFRhcmdldFJlZ2lvbiBmbGFnIGlzIHNldCBpbiBccCBDYWxsT3B0cy4KKyAgY29uc3QgTWVtUmVnaW9uICpnZXRSZWdpb25Gb3JDb25zdHJ1Y3RlZE9iamVjdChjb25zdCBDWFhDb25zdHJ1Y3RFeHByICpDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uc3RydWN0aW9uQ29udGV4dCAqQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZhbENhbGxPcHRpb25zICZDYWxsT3B0cyk7CisKKyAgLy8vIFN0b3JlIHRoZSByZWdpb24gb2YgYSBDKysgdGVtcG9yYXJ5IG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIGEKKyAgLy8vIENYWEJpbmRUZW1wb3JhcnlFeHByIGZvciBsYXRlciBkZXN0cnVjdGlvbi4KKyAgc3RhdGljIFByb2dyYW1TdGF0ZVJlZiBhZGRJbml0aWFsaXplZFRlbXBvcmFyeSgKKyAgICAgIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwgY29uc3QgQ1hYQmluZFRlbXBvcmFyeUV4cHIgKkJURSwKKyAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEMsIGNvbnN0IENYWFRlbXBPYmplY3RSZWdpb24gKlIpOworCisgIC8vLyBDaGVjayBpZiBhbGwgaW5pdGlhbGl6ZWQgdGVtcG9yYXJ5IHJlZ2lvbnMgYXJlIGNsZWFyIGZvciB0aGUgZ2l2ZW4KKyAgLy8vIGNvbnRleHQgcmFuZ2UgKGluY2x1ZGluZyBGcm9tTEMsIG5vdCBpbmNsdWRpbmcgVG9MQykuCisgIC8vLyBUaGlzIGlzIHVzZWZ1bCBmb3IgYXNzZXJ0aW9ucy4KKyAgc3RhdGljIGJvb2wgYXJlSW5pdGlhbGl6ZWRUZW1wb3Jhcmllc0NsZWFyKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqRnJvbUxDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpUb0xDKTsKKworICAvLy8gU3RvcmUgdGhlIHJlZ2lvbiBvZiBhIEMrKyB0ZW1wb3Jhcnkgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gYQorICAvLy8gQ1hYQmluZFRlbXBvcmFyeUV4cHIgZm9yIGxhdGVyIGRlc3RydWN0aW9uLgorICBzdGF0aWMgUHJvZ3JhbVN0YXRlUmVmIGFkZFRlbXBvcmFyeU1hdGVyaWFsaXphdGlvbigKKyAgICAgIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwgY29uc3QgTWF0ZXJpYWxpemVUZW1wb3JhcnlFeHByICpNVEUsCisgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDLCBjb25zdCBDWFhUZW1wT2JqZWN0UmVnaW9uICpSKTsKKworICAvLy8gQ2hlY2sgaWYgYWxsIHRlbXBvcmFyeSBtYXRlcmlhbGl6YXRpb24gcmVnaW9ucyBhcmUgY2xlYXIgZm9yIHRoZSBnaXZlbgorICAvLy8gY29udGV4dCByYW5nZSAoaW5jbHVkaW5nIEZyb21MQywgbm90IGluY2x1ZGluZyBUb0xDKS4KKyAgLy8vIFRoaXMgaXMgdXNlZnVsIGZvciBhc3NlcnRpb25zLgorICBzdGF0aWMgYm9vbCBhcmVUZW1wb3JhcnlNYXRlcmlhbGl6YXRpb25zQ2xlYXIoUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpGcm9tTEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKlRvTEMpOworCisgIC8vLyBBZGRzIGFuIGluaXRpYWxpemVkIHRlbXBvcmFyeSBhbmQvb3IgYSBtYXRlcmlhbGl6YXRpb24sIHdoaWNoZXZlciBpcworICAvLy8gbmVjZXNzYXJ5LCBieSBsb29raW5nIGF0IHRoZSB3aG9sZSBjb25zdHJ1Y3Rpb24gY29udGV4dC4gSGFuZGxlcworICAvLy8gZnVuY3Rpb24gcmV0dXJuIHZhbHVlcywgd2hpY2ggbmVlZCB0aGUgY29uc3RydWN0aW9uIGNvbnRleHQgb2YgdGhlIHBhcmVudAorICAvLy8gc3RhY2sgZnJhbWUsIGF1dG9tYWdpY2FsbHkuCisgIFByb2dyYW1TdGF0ZVJlZiBhZGRBbGxOZWNlc3NhcnlUZW1wb3JhcnlJbmZvKAorICAgICAgUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLCBjb25zdCBDb25zdHJ1Y3Rpb25Db250ZXh0ICpDQywKKyAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEMsIGNvbnN0IE1lbVJlZ2lvbiAqUik7CisKKyAgLy8vIFN0b3JlIHRoZSByZWdpb24gcmV0dXJuZWQgYnkgb3BlcmF0b3IgbmV3KCkgc28gdGhhdCB0aGUgY29uc3RydWN0b3IKKyAgLy8vIHRoYXQgZm9sbG93cyBpdCBrbmV3IHdoYXQgbG9jYXRpb24gdG8gaW5pdGlhbGl6ZS4gVGhlIHZhbHVlIHNob3VsZCBiZQorICAvLy8gY2xlYXJlZCBvbmNlIHRoZSByZXNwZWN0aXZlIENYWE5ld0V4cHIgQ0ZHU3RtdCBlbGVtZW50IGlzIHByb2Nlc3NlZC4KKyAgc3RhdGljIFByb2dyYW1TdGF0ZVJlZgorICBzZXRDWFhOZXdBbGxvY2F0b3JWYWx1ZShQcm9ncmFtU3RhdGVSZWYgU3RhdGUsIGNvbnN0IENYWE5ld0V4cHIgKkNORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpDYWxsZXJMQywgU1ZhbCBWKTsKKworICAvLy8gUmV0cmlldmUgdGhlIGxvY2F0aW9uIHJldHVybmVkIGJ5IHRoZSBjdXJyZW50IG9wZXJhdG9yIG5ldygpLgorICBzdGF0aWMgU1ZhbAorICBnZXRDWFhOZXdBbGxvY2F0b3JWYWx1ZShQcm9ncmFtU3RhdGVSZWYgU3RhdGUsIGNvbnN0IENYWE5ld0V4cHIgKkNORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpDYWxsZXJMQyk7CisKKyAgLy8vIENsZWFyIHRoZSBsb2NhdGlvbiByZXR1cm5lZCBieSB0aGUgcmVzcGVjdGl2ZSBvcGVyYXRvciBuZXcoKS4gVGhpcyBuZWVkcworICAvLy8gdG8gYmUgZG9uZSBhcyBzb29uIGFzIENYWE5ld0V4cHIgQ0ZHIGJsb2NrIGlzIGV2YWx1YXRlZC4KKyAgc3RhdGljIFByb2dyYW1TdGF0ZVJlZgorICBjbGVhckNYWE5ld0FsbG9jYXRvclZhbHVlKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwgY29uc3QgQ1hYTmV3RXhwciAqQ05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqQ2FsbGVyTEMpOworCisgIC8vLyBDaGVjayBpZiBhbGwgYWxsb2NhdG9yIHZhbHVlcyBhcmUgY2xlYXIgZm9yIHRoZSBnaXZlbiBjb250ZXh0IHJhbmdlCisgIC8vLyAoaW5jbHVkaW5nIEZyb21MQywgbm90IGluY2x1ZGluZyBUb0xDKS4gVGhpcyBpcyB1c2VmdWwgZm9yIGFzc2VydGlvbnMuCisgIHN0YXRpYyBib29sIGFyZUNYWE5ld0FsbG9jYXRvclZhbHVlc0NsZWFyKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpGcm9tTEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqVG9MQyk7Cit9OworCisvLy8gVHJhaXRzIGZvciBzdG9yaW5nIHRoZSBjYWxsIHByb2Nlc3NpbmcgcG9saWN5IGluc2lkZSBHRE0uCisvLy8gVGhlIEdETSBzdG9yZXMgdGhlIGNvcnJlc3BvbmRpbmcgQ2FsbEV4cHIgcG9pbnRlci4KKy8vIEZJWE1FOiBUaGlzIGRvZXMgbm90IHVzZSB0aGUgbmljZSB0cmFpdCBtYWNyb3MgYmVjYXVzZSBpdCBtdXN0IGJlIGFjY2Vzc2libGUKKy8vIGZyb20gbXVsdGlwbGUgdHJhbnNsYXRpb24gdW5pdHMuCitzdHJ1Y3QgUmVwbGF5V2l0aG91dElubGluaW5ne307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IFByb2dyYW1TdGF0ZVRyYWl0PFJlcGxheVdpdGhvdXRJbmxpbmluZz4gOgorICBwdWJsaWMgUHJvZ3JhbVN0YXRlUGFydGlhbFRyYWl0PGNvbnN0IHZvaWQqPiB7CisgIHN0YXRpYyB2b2lkICpHRE1JbmRleCgpIHsgc3RhdGljIGludCBpbmRleCA9IDA7IHJldHVybiAmaW5kZXg7IH0KK307CisKK30gLy8gbmFtZXNwYWNlIGVudG8KKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX0VYUFJFTkdJTkVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0Z1bmN0aW9uU3VtbWFyeS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0Z1bmN0aW9uU3VtbWFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MGZhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvRnVuY3Rpb25TdW1tYXJ5LmgKQEAgLTAsMCArMSwxNDMgQEAKKy8vPT09LSBGdW5jdGlvblN1bW1hcnkuaCAtIFN0b3JlcyBzdW1tYXJpZXMgb2YgZnVuY3Rpb25zLiAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBzdW1tYXJ5IG9mIGEgZnVuY3Rpb24gZ2F0aGVyZWQvdXNlZCBieSBzdGF0aWMgYW5hbHlzaXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9GVU5DVElPTlNVTU1BUllfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9GVU5DVElPTlNVTU1BUllfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2wuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsQml0VmVjdG9yLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGVudG8geworCit1c2luZyBTZXRPZkRlY2xzID0gc3RkOjpkZXF1ZTxEZWNsICo+OwordXNpbmcgU2V0T2ZDb25zdERlY2xzID0gbGx2bTo6RGVuc2VTZXQ8Y29uc3QgRGVjbCAqPjsKKworY2xhc3MgRnVuY3Rpb25TdW1tYXJpZXNUeSB7CisgIGNsYXNzIEZ1bmN0aW9uU3VtbWFyeSB7CisgIHB1YmxpYzoKKyAgICAvLy8gTWFya3MgdGhlIElEcyBvZiB0aGUgYmFzaWMgYmxvY2tzIHZpc2l0ZWQgZHVyaW5nIHRoZSBhbmFseXplcy4KKyAgICBsbHZtOjpTbWFsbEJpdFZlY3RvciBWaXNpdGVkQmFzaWNCbG9ja3M7CisKKyAgICAvLy8gVG90YWwgbnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgZnVuY3Rpb24uCisgICAgdW5zaWduZWQgVG90YWxCYXNpY0Jsb2NrcyA6IDMwOworCisgICAgLy8vIFRydWUgaWYgdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBjaGVja2VkIGFnYWluc3QgdGhlIHJ1bGVzIGZvciB3aGljaAorICAgIC8vLyBmdW5jdGlvbnMgbWF5IGJlIGlubGluZWQuCisgICAgdW5zaWduZWQgSW5saW5lQ2hlY2tlZCA6IDE7CisKKyAgICAvLy8gVHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIG1heSBiZSBpbmxpbmVkLgorICAgIHVuc2lnbmVkIE1heUlubGluZSA6IDE7CisKKyAgICAvLy8gVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24gaGFzIGJlZW4gaW5saW5lZC4KKyAgICB1bnNpZ25lZCBUaW1lc0lubGluZWQgOiAzMjsKKworICAgIEZ1bmN0aW9uU3VtbWFyeSgpCisgICAgICAgIDogVG90YWxCYXNpY0Jsb2NrcygwKSwgSW5saW5lQ2hlY2tlZCgwKSwgTWF5SW5saW5lKDApLAorICAgICAgICAgIFRpbWVzSW5saW5lZCgwKSB7fQorICB9OworCisgIHVzaW5nIE1hcFR5ID0gbGx2bTo6RGVuc2VNYXA8Y29uc3QgRGVjbCAqLCBGdW5jdGlvblN1bW1hcnk+OworICBNYXBUeSBNYXA7CisKK3B1YmxpYzoKKyAgTWFwVHk6Oml0ZXJhdG9yIGZpbmRPckluc2VydFN1bW1hcnkoY29uc3QgRGVjbCAqRCkgeworICAgIE1hcFR5OjppdGVyYXRvciBJID0gTWFwLmZpbmQoRCk7CisgICAgaWYgKEkgIT0gTWFwLmVuZCgpKQorICAgICAgcmV0dXJuIEk7CisKKyAgICB1c2luZyBLVlBhaXIgPSBzdGQ6OnBhaXI8Y29uc3QgRGVjbCAqLCBGdW5jdGlvblN1bW1hcnk+OworCisgICAgSSA9IE1hcC5pbnNlcnQoS1ZQYWlyKEQsIEZ1bmN0aW9uU3VtbWFyeSgpKSkuZmlyc3Q7CisgICAgYXNzZXJ0KEkgIT0gTWFwLmVuZCgpKTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIHZvaWQgbWFya01heUlubGluZShjb25zdCBEZWNsICpEKSB7CisgICAgTWFwVHk6Oml0ZXJhdG9yIEkgPSBmaW5kT3JJbnNlcnRTdW1tYXJ5KEQpOworICAgIEktPnNlY29uZC5JbmxpbmVDaGVja2VkID0gMTsKKyAgICBJLT5zZWNvbmQuTWF5SW5saW5lID0gMTsKKyAgfQorCisgIHZvaWQgbWFya1Nob3VsZE5vdElubGluZShjb25zdCBEZWNsICpEKSB7CisgICAgTWFwVHk6Oml0ZXJhdG9yIEkgPSBmaW5kT3JJbnNlcnRTdW1tYXJ5KEQpOworICAgIEktPnNlY29uZC5JbmxpbmVDaGVja2VkID0gMTsKKyAgICBJLT5zZWNvbmQuTWF5SW5saW5lID0gMDsKKyAgfQorCisgIHZvaWQgbWFya1JlYWNoZWRNYXhCbG9ja0NvdW50KGNvbnN0IERlY2wgKkQpIHsKKyAgICBtYXJrU2hvdWxkTm90SW5saW5lKEQpOworICB9CisKKyAgT3B0aW9uYWw8Ym9vbD4gbWF5SW5saW5lKGNvbnN0IERlY2wgKkQpIHsKKyAgICBNYXBUeTo6Y29uc3RfaXRlcmF0b3IgSSA9IE1hcC5maW5kKEQpOworICAgIGlmIChJICE9IE1hcC5lbmQoKSAmJiBJLT5zZWNvbmQuSW5saW5lQ2hlY2tlZCkKKyAgICAgIHJldHVybiBJLT5zZWNvbmQuTWF5SW5saW5lOworICAgIHJldHVybiBOb25lOworICB9CisKKyAgdm9pZCBtYXJrVmlzaXRlZEJhc2ljQmxvY2sodW5zaWduZWQgSUQsIGNvbnN0IERlY2wqIEQsIHVuc2lnbmVkIFRvdGFsSURzKSB7CisgICAgTWFwVHk6Oml0ZXJhdG9yIEkgPSBmaW5kT3JJbnNlcnRTdW1tYXJ5KEQpOworICAgIGxsdm06OlNtYWxsQml0VmVjdG9yICZCbG9ja3MgPSBJLT5zZWNvbmQuVmlzaXRlZEJhc2ljQmxvY2tzOworICAgIGFzc2VydChJRCA8IFRvdGFsSURzKTsKKyAgICBpZiAoVG90YWxJRHMgPiBCbG9ja3Muc2l6ZSgpKSB7CisgICAgICBCbG9ja3MucmVzaXplKFRvdGFsSURzKTsKKyAgICAgIEktPnNlY29uZC5Ub3RhbEJhc2ljQmxvY2tzID0gVG90YWxJRHM7CisgICAgfQorICAgIEJsb2Nrcy5zZXQoSUQpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtVmlzaXRlZEJhc2ljQmxvY2tzKGNvbnN0IERlY2wqIEQpIHsKKyAgICBNYXBUeTo6Y29uc3RfaXRlcmF0b3IgSSA9IE1hcC5maW5kKEQpOworICAgIGlmIChJICE9IE1hcC5lbmQoKSkKKyAgICAgIHJldHVybiBJLT5zZWNvbmQuVmlzaXRlZEJhc2ljQmxvY2tzLmNvdW50KCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1UaW1lc0lubGluZWQoY29uc3QgRGVjbCogRCkgeworICAgIE1hcFR5Ojpjb25zdF9pdGVyYXRvciBJID0gTWFwLmZpbmQoRCk7CisgICAgaWYgKEkgIT0gTWFwLmVuZCgpKQorICAgICAgcmV0dXJuIEktPnNlY29uZC5UaW1lc0lubGluZWQ7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB2b2lkIGJ1bXBOdW1UaW1lc0lubGluZWQoY29uc3QgRGVjbCogRCkgeworICAgIE1hcFR5OjppdGVyYXRvciBJID0gZmluZE9ySW5zZXJ0U3VtbWFyeShEKTsKKyAgICBJLT5zZWNvbmQuVGltZXNJbmxpbmVkKys7CisgIH0KKworICAvLy8gR2V0IHRoZSBwZXJjZW50YWdlIG9mIHRoZSByZWFjaGFibGUgYmxvY2tzLgorICB1bnNpZ25lZCBnZXRQZXJjZW50QmxvY2tzUmVhY2hhYmxlKGNvbnN0IERlY2wgKkQpIHsKKyAgICBNYXBUeTo6Y29uc3RfaXRlcmF0b3IgSSA9IE1hcC5maW5kKEQpOworICAgICAgaWYgKEkgIT0gTWFwLmVuZCgpKQorICAgICAgICByZXR1cm4gKChJLT5zZWNvbmQuVmlzaXRlZEJhc2ljQmxvY2tzLmNvdW50KCkgKiAxMDApIC8KKyAgICAgICAgICAgICAgICAgSS0+c2Vjb25kLlRvdGFsQmFzaWNCbG9ja3MpOworICAgIHJldHVybiAwOworICB9CisKKyAgdW5zaWduZWQgZ2V0VG90YWxOdW1CYXNpY0Jsb2NrcygpOworICB1bnNpZ25lZCBnZXRUb3RhbE51bVZpc2l0ZWRCYXNpY0Jsb2NrcygpOworfTsKKworfSAvLyBuYW1lc3BhY2UgZW50bworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX0ZVTkNUSU9OU1VNTUFSWV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvTG9vcFVucm9sbGluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0xvb3BVbnJvbGxpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGM1MDVjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0xvb3BVbnJvbGxpbmcuaApAQCAtMCwwICsxLDUwIEBACisvLz09PS0tLSBMb29wVW5yb2xsaW5nLmggLSBVbnJvbGwgbG9vcHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gVGhpcyBoZWFkZXIgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBvZiBmdW5jdGlvbnMgd2hpY2ggYXJlIHVzZWQgdG8gZGVjaWRlCisvLy8gd2hpY2ggbG9vcHMgc2hvdWxkIGJlIGNvbXBsZXRlbHkgdW5yb2xsZWQgYW5kIG1hcmsgdGhlaXIgY29ycmVzcG9uZGluZworLy8vIENGR0Jsb2Nrcy4gSXQgaXMgZG9uZSBieSB0cmFja2luZyBhIHN0YWNrIG9mIGxvb3BzIGluIHRoZSBQcm9ncmFtU3RhdGUuIFRoaXMKKy8vLyB3YXkgc3BlY2lmaWMgbG9vcHMgY2FuIGJlIG1hcmtlZCBhcyBjb21wbGV0ZWx5IHVucm9sbGVkLiBGb3IgY29uc2lkZXJpbmcgYQorLy8vIGxvb3AgdG8gYmUgY29tcGxldGVseSB1bnJvbGxlZCBpdCBoYXMgdG8gZnVsZmlsbCB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50czoKKy8vLyAtIEN1cnJlbnRseSBvbmx5IGZvclN0bXRzIGNhbiBiZSBjb25zaWRlcmVkLgorLy8vIC0gVGhlIGJvdW5kIGhhcyB0byBiZSBrbm93bi4KKy8vLyAtIFRoZSBjb3VudGVyIHZhcmlhYmxlIGhhcyBub3QgZXNjYXBlZCBiZWZvcmUvaW4gdGhlIGJvZHkgb2YgdGhlIGxvb3AgYW5kCisvLy8gICBjaGFuZ2VkIG9ubHkgaW4gdGhlIGluY3JlbWVudCBzdGF0ZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgbG9vcC4gSXQgYWxzbworLy8vICAgaGFzIHRvIGJlIGluaXRpYWxpemVkIGJ5IGEgbGl0ZXJhbCBpbiB0aGUgY29ycmVzcG9uZGluZyBpbml0U3RtdC4KKy8vLyAtIERvZXMgbm90IGNvbnRhaW4gZ290bywgc3dpdGNoIGFuZCByZXR1cm5TdG10LgorLy8vCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfTE9PUFVOUk9MTElOR19ICisjZGVmaW5lIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX0xPT1BVTlJPTExJTkdfSAorCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQ0ZHLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1Byb2dyYW1TdGF0ZS5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9FeHBsb2RlZEdyYXBoLmgiCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGVudG8geworY2xhc3MgQW5hbHlzaXNNYW5hZ2VyOworCisvLy8gUmV0dXJucyBpZiB0aGUgZ2l2ZW4gU3RhdGUgaW5kaWNhdGVzIHRoYXQgaXMgaW5zaWRlIGEgY29tcGxldGVseSB1bnJvbGxlZAorLy8vIGxvb3AuCitib29sIGlzVW5yb2xsZWRTdGF0ZShQcm9ncmFtU3RhdGVSZWYgU3RhdGUpOworCisvLy8gVXBkYXRlcyB0aGUgc3RhY2sgb2YgbG9vcHMgY29udGFpbmVkIGJ5IHRoZSBQcm9ncmFtU3RhdGUuCitQcm9ncmFtU3RhdGVSZWYgdXBkYXRlTG9vcFN0YWNrKGNvbnN0IFN0bXQgKkxvb3BTdG10LCBBU1RDb250ZXh0ICZBU1RDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSogUHJlZCwgdW5zaWduZWQgbWF4VmlzaXRPblBhdGgpOworCisvLy8gVXBkYXRlcyB0aGUgZ2l2ZW4gUHJvZ3JhbVN0YXRlLiBJbiBjdXJyZW50IGltcGxlbWVudGF0aW9uIGl0IHJlbW92ZXMgdGhlIHRvcAorLy8vIGVsZW1lbnQgb2YgdGhlIHN0YWNrIG9mIGxvb3BzLgorUHJvZ3JhbVN0YXRlUmVmIHByb2Nlc3NMb29wRW5kKGNvbnN0IFN0bXQgKkxvb3BTdG10LCBQcm9ncmFtU3RhdGVSZWYgU3RhdGUpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgZW50bworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0xvb3BXaWRlbmluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0xvb3BXaWRlbmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNjg3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvTG9vcFdpZGVuaW5nLmgKQEAgLTAsMCArMSwzNiBAQAorLy89PT0tLS0gTG9vcFdpZGVuaW5nLmggLSBXaWRlbiBsb29wcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFRoaXMgaGVhZGVyIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMgb2YgZnVuY3Rpb25zIHdoaWNoIGFyZSB1c2VkIHRvIHdpZGVuCisvLy8gbG9vcHMgd2hpY2ggZG8gbm90IG90aGVyd2lzZSBleGl0LiBUaGUgd2lkZW5pbmcgaXMgZG9uZSBieSBpbnZhbGlkYXRpbmcKKy8vLyBhbnl0aGluZyB3aGljaCBtaWdodCBiZSBtb2RpZmllZCBieSB0aGUgYm9keSBvZiB0aGUgbG9vcC4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9MT09QV0lERU5JTkdfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9MT09QV0lERU5JTkdfSAorCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQ0ZHLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1Byb2dyYW1TdGF0ZS5oIgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGVudG8geworCisvLy8gXGJyaWVmIEdldCB0aGUgc3RhdGVzIHRoYXQgcmVzdWx0IGZyb20gd2lkZW5pbmcgdGhlIGxvb3AuCisvLy8KKy8vLyBXaWRlbiB0aGUgbG9vcCBieSBpbnZhbGlkYXRpbmcgYW55dGhpbmcgdGhhdCBtaWdodCBiZSBtb2RpZmllZAorLy8vIGJ5IHRoZSBsb29wIGJvZHkgaW4gYW55IGl0ZXJhdGlvbi4KK1Byb2dyYW1TdGF0ZVJlZiBnZXRXaWRlbmVkTG9vcFN0YXRlKFByb2dyYW1TdGF0ZVJlZiBQcmV2U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCbG9ja0NvdW50LCBjb25zdCBTdG10ICpMb29wU3RtdCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBlbnRvCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvTWVtUmVnaW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvTWVtUmVnaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5MDllMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9NZW1SZWdpb24uaApAQCAtMCwwICsxLDE0MzUgQEAKKy8vPT0gTWVtUmVnaW9uLmggLSBBYnN0cmFjdCBtZW1vcnkgcmVnaW9ucyBmb3Igc3RhdGljIGFuYWx5c2lzIC0tKi0gQysrIC0qLS09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIE1lbVJlZ2lvbiBhbmQgaXRzIHN1YmNsYXNzZXMuICBNZW1SZWdpb24gZGVmaW5lcyBhCisvLyAgcGFydGlhbGx5LXR5cGVkIGFic3RyYWN0aW9uIG9mIG1lbW9yeSB1c2VmdWwgZm9yIHBhdGgtc2Vuc2l0aXZlIGRhdGFmbG93CisvLyAgYW5hbHlzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9NRU1SRUdJT05fSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9NRU1SRUdJT05fSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVENvbnRleHQuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvQ2hhclVuaXRzLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2wuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbENYWC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByT2JqQy5oIgorI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0FuYWx5c2lzRGVjbENvbnRleHQuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1NWYWxzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgTG9jYXRpb25Db250ZXh0OworY2xhc3MgU3RhY2tGcmFtZUNvbnRleHQ7CisKK25hbWVzcGFjZSBlbnRvIHsKKworY2xhc3MgQ29kZVRleHRSZWdpb247CitjbGFzcyBNZW1SZWdpb25NYW5hZ2VyOworY2xhc3MgTWVtU3BhY2VSZWdpb247CitjbGFzcyBTVmFsQnVpbGRlcjsKK2NsYXNzIFN5bWJvbGljUmVnaW9uOworY2xhc3MgVmFyUmVnaW9uOworCisvLy8gUmVwcmVzZW50IGEgcmVnaW9uJ3Mgb2Zmc2V0IHdpdGhpbiB0aGUgdG9wIGxldmVsIGJhc2UgcmVnaW9uLgorY2xhc3MgUmVnaW9uT2Zmc2V0IHsKKyAgLy8vIFRoZSBiYXNlIHJlZ2lvbi4KKyAgY29uc3QgTWVtUmVnaW9uICpSOworCisgIC8vLyBUaGUgYml0IG9mZnNldCB3aXRoaW4gdGhlIGJhc2UgcmVnaW9uLiBDYW4gYmUgbmVnYXRpdmUuCisgIGludDY0X3QgT2Zmc2V0OworCitwdWJsaWM6CisgIC8vIFdlJ3JlIHVzaW5nIGEgY29uc3QgaW5zdGVhZCBvZiBhbiBlbnVtZXJhdGlvbiBkdWUgdG8gdGhlIHNpemUgcmVxdWlyZWQ7CisgIC8vIFZpc3VhbCBTdHVkaW8gd2lsbCBvbmx5IGNyZWF0ZSBlbnVtZXJhdGlvbnMgb2Ygc2l6ZSBpbnQsIG5vdCBsb25nIGxvbmcuCisgIHN0YXRpYyBjb25zdCBpbnQ2NF90IFN5bWJvbGljID0gSU5UNjRfTUFYOworCisgIFJlZ2lvbk9mZnNldCgpIDogUihudWxscHRyKSB7fQorICBSZWdpb25PZmZzZXQoY29uc3QgTWVtUmVnaW9uICpyLCBpbnQ2NF90IG9mZikgOiBSKHIpLCBPZmZzZXQob2ZmKSB7fQorCisgIGNvbnN0IE1lbVJlZ2lvbiAqZ2V0UmVnaW9uKCkgY29uc3QgeyByZXR1cm4gUjsgfQorCisgIGJvb2wgaGFzU3ltYm9saWNPZmZzZXQoKSBjb25zdCB7IHJldHVybiBPZmZzZXQgPT0gU3ltYm9saWM7IH0KKworICBpbnQ2NF90IGdldE9mZnNldCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWhhc1N5bWJvbGljT2Zmc2V0KCkpOworICAgIHJldHVybiBPZmZzZXQ7CisgIH0KKworICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBSOyB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQmFzZSByZWdpb24gY2xhc3Nlcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBNZW1SZWdpb24gLSBUaGUgcm9vdCBhYnN0cmFjdCBjbGFzcyBmb3IgYWxsIG1lbW9yeSByZWdpb25zLgorY2xhc3MgTWVtUmVnaW9uIDogcHVibGljIGxsdm06OkZvbGRpbmdTZXROb2RlIHsKK3B1YmxpYzoKKyAgZW51bSBLaW5kIHsKKyNkZWZpbmUgUkVHSU9OKElkLCBQYXJlbnQpIElkICMjIEtpbmQsCisjZGVmaW5lIFJFR0lPTl9SQU5HRShJZCwgRmlyc3QsIExhc3QpIEJFR0lOXyMjSWQgPSBGaXJzdCwgRU5EXyMjSWQgPSBMYXN0LAorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9SZWdpb25zLmRlZiIKKyAgfTsKKworcHJpdmF0ZToKKyAgY29uc3QgS2luZCBraW5kOworCitwcm90ZWN0ZWQ6CisgIE1lbVJlZ2lvbihLaW5kIGspIDoga2luZChrKSB7fQorICB2aXJ0dWFsIH5NZW1SZWdpb24oKTsKKworcHVibGljOgorICBBU1RDb250ZXh0ICZnZXRDb250ZXh0KCkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIE1lbVJlZ2lvbk1hbmFnZXIqIGdldE1lbVJlZ2lvbk1hbmFnZXIoKSBjb25zdCA9IDA7CisKKyAgY29uc3QgTWVtU3BhY2VSZWdpb24gKmdldE1lbW9yeVNwYWNlKCkgY29uc3Q7CisKKyAgY29uc3QgTWVtUmVnaW9uICpnZXRCYXNlUmVnaW9uKCkgY29uc3Q7CisKKyAgLy8vIENoZWNrIGlmIHRoZSByZWdpb24gaXMgYSBzdWJyZWdpb24gb2YgdGhlIGdpdmVuIHJlZ2lvbi4KKyAgLy8vIEVhY2ggcmVnaW9uIGlzIGEgc3VicmVnaW9uIG9mIGl0c2VsZi4KKyAgdmlydHVhbCBib29sIGlzU3ViUmVnaW9uT2YoY29uc3QgTWVtUmVnaW9uICpSKSBjb25zdDsKKworICBjb25zdCBNZW1SZWdpb24gKlN0cmlwQ2FzdHMoYm9vbCBTdHJpcEJhc2VDYXN0cyA9IHRydWUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgSWYgdGhpcyBpcyBhIHN5bWJvbGljIHJlZ2lvbiwgcmV0dXJucyB0aGUgcmVnaW9uLiBPdGhlcndpc2UsCisgIC8vLyBnb2VzIHVwIHRoZSBiYXNlIGNoYWluIGxvb2tpbmcgZm9yIHRoZSBmaXJzdCBzeW1ib2xpYyBiYXNlIHJlZ2lvbi4KKyAgY29uc3QgU3ltYm9saWNSZWdpb24gKmdldFN5bWJvbGljQmFzZSgpIGNvbnN0OworCisgIGJvb2wgaGFzR2xvYmFsc09yUGFyYW1ldGVyc1N0b3JhZ2UoKSBjb25zdDsKKworICBib29sIGhhc1N0YWNrU3RvcmFnZSgpIGNvbnN0OworICAKKyAgYm9vbCBoYXNTdGFja05vblBhcmFtZXRlcnNTdG9yYWdlKCkgY29uc3Q7CisgIAorICBib29sIGhhc1N0YWNrUGFyYW1ldGVyc1N0b3JhZ2UoKSBjb25zdDsKKworICAvLy8gQ29tcHV0ZSB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgdG9wIGxldmVsIG1lbW9yeSBvYmplY3QuCisgIFJlZ2lvbk9mZnNldCBnZXRBc09mZnNldCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgcmVnaW9uIGZvciBkZWJ1ZyB1c2UuCisgIHN0ZDo6c3RyaW5nIGdldFN0cmluZygpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJlZ2lvbiBjYW4gYmUgcHJpbnRlZCBpbiBhIHVzZXItZnJpZW5kbHkgd2F5LgorICB2aXJ0dWFsIGJvb2wgY2FuUHJpbnRQcmV0dHkoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFByaW50IHRoZSByZWdpb24gZm9yIHVzZSBpbiBkaWFnbm9zdGljcy4KKyAgdmlydHVhbCB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZvcykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyByZWdpb24ncyB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIGNhbiBiZSB1c2VkCisgIC8vLyBhcyBwYXJ0IG9mIGEgbGFyZ2VyIGV4cHJlc3Npb24uCisgIHZpcnR1YWwgYm9vbCBjYW5QcmludFByZXR0eUFzRXhwcigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUHJpbnQgdGhlIHJlZ2lvbiBhcyBleHByZXNzaW9uLgorICAvLy8KKyAgLy8vIFdoZW4gdGhpcyByZWdpb24gcmVwcmVzZW50cyBhIHN1YmV4cHJlc3Npb24sIHRoZSBtZXRob2QgaXMgZm9yIHByaW50aW5nCisgIC8vLyBhbiBleHByZXNzaW9uIGNvbnRhaW5pbmcgaXQuCisgIHZpcnR1YWwgdm9pZCBwcmludFByZXR0eUFzRXhwcihyYXdfb3N0cmVhbSAmb3MpIGNvbnN0OworCisgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIGtpbmQ7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBSZWdpb25UeT4gY29uc3QgUmVnaW9uVHkqIGdldEFzKCkgY29uc3Q7CisKKyAgdmlydHVhbCBib29sIGlzQm91bmRhYmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworCisgIC8vLyBHZXQgZGVzY3JpcHRpdmUgbmFtZSBmb3IgbWVtb3J5IHJlZ2lvbi4gVGhlIG5hbWUgaXMgb2J0YWluZWQgZnJvbQorICAvLy8gdGhlIHZhcmlhYmxlL2ZpZWxkIGRlY2xhcmF0aW9uIHJldHJpZXZlZCBmcm9tIHRoZSBtZW1vcnkgcmVnaW9uLgorICAvLy8gUmVnaW9ucyB0aGF0IHBvaW50IHRvIGFuIGVsZW1lbnQgb2YgYW4gYXJyYXkgYXJlIHJldHVybmVkIGFzOiAiYXJyWzBdIi4KKyAgLy8vIFJlZ2lvbnMgdGhhdCBwb2ludCB0byBhIHN0cnVjdCBhcmUgcmV0dXJuZWQgYXM6ICJzdC52YXIiLgorICAvLworICAvLy8gXHBhcmFtIFVzZVF1b3RlcyBTZXQgaWYgdGhlIG5hbWUgc2hvdWxkIGJlIHF1b3RlZC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB2YXJpYWJsZSBuYW1lIGZvciBtZW1vcnkgcmVnaW9uCisgIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aXZlTmFtZShib29sIFVzZVF1b3RlcyA9IHRydWUpIGNvbnN0OworCisKKyAgLy8vIFJldHJpZXZlIHNvdXJjZSByYW5nZSBmcm9tIG1lbW9yeSByZWdpb24uIFRoZSByYW5nZSByZXRyaWV2YWwKKyAgLy8vIGlzIGJhc2VkIG9uIHRoZSBkZWNsIG9idGFpbmVkIGZyb20gdGhlIG1lbW9yeSByZWdpb24uCisgIC8vLyBGb3IgYSBWYXJSZWdpb24gdGhlIHJhbmdlIG9mIHRoZSBiYXNlIHJlZ2lvbiBpcyByZXR1cm5lZC4KKyAgLy8vIEZvciBhIEZpZWxkUmVnaW9uIHRoZSByYW5nZSBvZiB0aGUgZmllbGQgaXMgcmV0dXJuZWQuCisgIC8vLyBJZiBubyBkZWNsYXJhdGlvbiBpcyBmb3VuZCwgYW4gZW1wdHkgc291cmNlIHJhbmdlIGlzIHJldHVybmVkLgorICAvLy8gVGhlIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgaWYgdGhlIHJldHVybmVkIHJhbmdlIGlzIHZhbGlkLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHNvdXJjZSByYW5nZSBmb3IgZGVjbGFyYXRpb24gcmV0cmlldmVkIGZyb20gbWVtb3J5IHJlZ2lvbgorICBjbGFuZzo6U291cmNlUmFuZ2Ugc291cmNlUmFuZ2UoKSBjb25zdDsKK307CisKKy8vLyBNZW1TcGFjZVJlZ2lvbiAtIEEgbWVtb3J5IHJlZ2lvbiB0aGF0IHJlcHJlc2VudHMgYSAibWVtb3J5IHNwYWNlIjsKKy8vLyAgZm9yIGV4YW1wbGUsIHRoZSBzZXQgb2YgZ2xvYmFsIHZhcmlhYmxlcywgdGhlIHN0YWNrIGZyYW1lLCBldGMuCitjbGFzcyBNZW1TcGFjZVJlZ2lvbiA6IHB1YmxpYyBNZW1SZWdpb24geworcHJvdGVjdGVkOgorICBNZW1SZWdpb25NYW5hZ2VyICpNZ3I7CisKKyAgTWVtU3BhY2VSZWdpb24oTWVtUmVnaW9uTWFuYWdlciAqbWdyLCBLaW5kIGspIDogTWVtUmVnaW9uKGspLCBNZ3IobWdyKSB7CisgICAgYXNzZXJ0KGNsYXNzb2YodGhpcykpOworICAgIGFzc2VydChtZ3IpOworICB9CisKKyAgTWVtUmVnaW9uTWFuYWdlciogZ2V0TWVtUmVnaW9uTWFuYWdlcigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIE1ncjsgfQorCitwdWJsaWM6CisgIGJvb2wgaXNCb3VuZGFibGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24gKlIpIHsKKyAgICBLaW5kIGsgPSBSLT5nZXRLaW5kKCk7CisgICAgcmV0dXJuIGsgPj0gQkVHSU5fTUVNU1BBQ0VTICYmIGsgPD0gRU5EX01FTVNQQUNFUzsKKyAgfQorfTsKKworLy8vIENvZGVTcGFjZVJlZ2lvbiAtIFRoZSBtZW1vcnkgc3BhY2UgdGhhdCBob2xkcyB0aGUgZXhlY3V0YWJsZSBjb2RlIG9mCisvLy8gZnVuY3Rpb25zIGFuZCBibG9ja3MuCitjbGFzcyBDb2RlU3BhY2VSZWdpb24gOiBwdWJsaWMgTWVtU3BhY2VSZWdpb24geworICBmcmllbmQgY2xhc3MgTWVtUmVnaW9uTWFuYWdlcjsKKworICBDb2RlU3BhY2VSZWdpb24oTWVtUmVnaW9uTWFuYWdlciAqbWdyKQorICAgICAgOiBNZW1TcGFjZVJlZ2lvbihtZ3IsIENvZGVTcGFjZVJlZ2lvbktpbmQpIHt9CisKK3B1YmxpYzoKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1lbVJlZ2lvbiAqUikgeworICAgIHJldHVybiBSLT5nZXRLaW5kKCkgPT0gQ29kZVNwYWNlUmVnaW9uS2luZDsKKyAgfQorfTsKKworY2xhc3MgR2xvYmFsc1NwYWNlUmVnaW9uIDogcHVibGljIE1lbVNwYWNlUmVnaW9uIHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwcm90ZWN0ZWQ6CisgIEdsb2JhbHNTcGFjZVJlZ2lvbihNZW1SZWdpb25NYW5hZ2VyICptZ3IsIEtpbmQgaykgOiBNZW1TcGFjZVJlZ2lvbihtZ3IsIGspIHsKKyAgICBhc3NlcnQoY2xhc3NvZih0aGlzKSk7CisgIH0KKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1lbVJlZ2lvbiAqUikgeworICAgIEtpbmQgayA9IFItPmdldEtpbmQoKTsKKyAgICByZXR1cm4gayA+PSBCRUdJTl9HTE9CQUxfTUVNU1BBQ0VTICYmIGsgPD0gRU5EX0dMT0JBTF9NRU1TUEFDRVM7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhlIHJlZ2lvbiBvZiB0aGUgc3RhdGljIHZhcmlhYmxlcyB3aXRoaW4gdGhlIGN1cnJlbnQgQ29kZVRleHRSZWdpb24KKy8vLyBzY29wZS4KKy8vLworLy8vIEN1cnJlbnRseSwgb25seSB0aGUgc3RhdGljIGxvY2FscyBhcmUgcGxhY2VkIHRoZXJlLCBzbyB3ZSBrbm93IHRoYXQgdGhlc2UKKy8vLyB2YXJpYWJsZXMgZG8gbm90IGdldCBpbnZhbGlkYXRlZCBieSBjYWxscyB0byBvdGhlciBmdW5jdGlvbnMuCitjbGFzcyBTdGF0aWNHbG9iYWxTcGFjZVJlZ2lvbiA6IHB1YmxpYyBHbG9iYWxzU3BhY2VSZWdpb24geworICBmcmllbmQgY2xhc3MgTWVtUmVnaW9uTWFuYWdlcjsKKworICBjb25zdCBDb2RlVGV4dFJlZ2lvbiAqQ1I7CisgIAorICBTdGF0aWNHbG9iYWxTcGFjZVJlZ2lvbihNZW1SZWdpb25NYW5hZ2VyICptZ3IsIGNvbnN0IENvZGVUZXh0UmVnaW9uICpjcikKKyAgICA6IEdsb2JhbHNTcGFjZVJlZ2lvbihtZ3IsIFN0YXRpY0dsb2JhbFNwYWNlUmVnaW9uS2luZCksIENSKGNyKSB7CisgICAgYXNzZXJ0KGNyKTsKKyAgfQorCitwdWJsaWM6CisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKKworICBjb25zdCBDb2RlVGV4dFJlZ2lvbiAqZ2V0Q29kZVJlZ2lvbigpIGNvbnN0IHsgcmV0dXJuIENSOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24gKlIpIHsKKyAgICByZXR1cm4gUi0+Z2V0S2luZCgpID09IFN0YXRpY0dsb2JhbFNwYWNlUmVnaW9uS2luZDsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGUgcmVnaW9uIGZvciBhbGwgdGhlIG5vbi1zdGF0aWMgZ2xvYmFsIHZhcmlhYmxlcy4KKy8vLworLy8vIFRoaXMgY2xhc3MgaXMgZnVydGhlciBzcGxpdCBpbnRvIHN1YmNsYXNzZXMgZm9yIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZgorLy8vIGludmFsaWRhdGluZyBhIHNldCBvZiByZWxhdGVkIGdsb2JhbCB2YWx1ZXMgYXMgaXMgZG9uZSBpbgorLy8vIFJlZ2lvblN0b3JlTWFuYWdlcjo6aW52YWxpZGF0ZVJlZ2lvbnMgKGluc3RlYWQgb2YgZmluZGluZyBhbGwgdGhlIGRlcGVuZGVudAorLy8vIGdsb2JhbHMsIHdlIGludmFsaWRhdGUgdGhlIHdob2xlIHBhcmVudCByZWdpb24pLgorY2xhc3MgTm9uU3RhdGljR2xvYmFsU3BhY2VSZWdpb24gOiBwdWJsaWMgR2xvYmFsc1NwYWNlUmVnaW9uIHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgIE5vblN0YXRpY0dsb2JhbFNwYWNlUmVnaW9uKE1lbVJlZ2lvbk1hbmFnZXIgKm1nciwgS2luZCBrKQorICAgICAgOiBHbG9iYWxzU3BhY2VSZWdpb24obWdyLCBrKSB7CisgICAgYXNzZXJ0KGNsYXNzb2YodGhpcykpOworICB9CisKK3B1YmxpYzoKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1lbVJlZ2lvbiAqUikgeworICAgIEtpbmQgayA9IFItPmdldEtpbmQoKTsKKyAgICByZXR1cm4gayA+PSBCRUdJTl9OT05fU1RBVElDX0dMT0JBTF9NRU1TUEFDRVMgJiYKKyAgICAgICAgICAgayA8PSBFTkRfTk9OX1NUQVRJQ19HTE9CQUxfTUVNU1BBQ0VTOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoZSByZWdpb24gY29udGFpbmluZyBnbG9iYWxzIHdoaWNoIGFyZSBkZWZpbmVkIGluIHN5c3RlbS9leHRlcm5hbAorLy8vIGhlYWRlcnMgYW5kIGFyZSBjb25zaWRlcmVkIG1vZGlmaWFibGUgYnkgc3lzdGVtIGNhbGxzIChleDogZXJybm8pLgorY2xhc3MgR2xvYmFsU3lzdGVtU3BhY2VSZWdpb24gOiBwdWJsaWMgTm9uU3RhdGljR2xvYmFsU3BhY2VSZWdpb24geworICBmcmllbmQgY2xhc3MgTWVtUmVnaW9uTWFuYWdlcjsKKworICBHbG9iYWxTeXN0ZW1TcGFjZVJlZ2lvbihNZW1SZWdpb25NYW5hZ2VyICptZ3IpCisgICAgOiBOb25TdGF0aWNHbG9iYWxTcGFjZVJlZ2lvbihtZ3IsIEdsb2JhbFN5c3RlbVNwYWNlUmVnaW9uS2luZCkge30KKworcHVibGljOgorCisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24gKlIpIHsKKyAgICByZXR1cm4gUi0+Z2V0S2luZCgpID09IEdsb2JhbFN5c3RlbVNwYWNlUmVnaW9uS2luZDsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGUgcmVnaW9uIGNvbnRhaW5pbmcgZ2xvYmFscyB3aGljaCBhcmUgY29uc2lkZXJlZCBub3QgdG8gYmUgbW9kaWZpZWQKKy8vLyBvciBwb2ludCB0byBkYXRhIHdoaWNoIGNvdWxkIGJlIG1vZGlmaWVkIGFzIGEgcmVzdWx0IG9mIGEgZnVuY3Rpb24gY2FsbAorLy8vIChzeXN0ZW0gb3IgaW50ZXJuYWwpLiBFeDogQ29uc3QgZ2xvYmFsIHNjYWxhcnMgd291bGQgYmUgbW9kZWxlZCBhcyBwYXJ0IG9mCisvLy8gdGhpcyByZWdpb24uIFRoaXMgcmVnaW9uIGFsc28gaW5jbHVkZXMgbW9zdCBzeXN0ZW0gZ2xvYmFscyBzaW5jZSB0aGV5IGhhdmUKKy8vLyBsb3cgY2hhbmNlIG9mIGJlaW5nIG1vZGlmaWVkLgorY2xhc3MgR2xvYmFsSW1tdXRhYmxlU3BhY2VSZWdpb24gOiBwdWJsaWMgTm9uU3RhdGljR2xvYmFsU3BhY2VSZWdpb24geworICBmcmllbmQgY2xhc3MgTWVtUmVnaW9uTWFuYWdlcjsKKworICBHbG9iYWxJbW11dGFibGVTcGFjZVJlZ2lvbihNZW1SZWdpb25NYW5hZ2VyICptZ3IpCisgICAgOiBOb25TdGF0aWNHbG9iYWxTcGFjZVJlZ2lvbihtZ3IsIEdsb2JhbEltbXV0YWJsZVNwYWNlUmVnaW9uS2luZCkge30KKworcHVibGljOgorCisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24gKlIpIHsKKyAgICByZXR1cm4gUi0+Z2V0S2luZCgpID09IEdsb2JhbEltbXV0YWJsZVNwYWNlUmVnaW9uS2luZDsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGUgcmVnaW9uIGNvbnRhaW5pbmcgZ2xvYmFscyB3aGljaCBjYW4gYmUgbW9kaWZpZWQgYnkgY2FsbHMgdG8KKy8vLyAiaW50ZXJuYWxseSIgZGVmaW5lZCBmdW5jdGlvbnMgLSAoZm9yIG5vdyBqdXN0KSBmdW5jdGlvbnMgb3RoZXIgdGhlbiBzeXN0ZW0KKy8vLyBjYWxscy4KK2NsYXNzIEdsb2JhbEludGVybmFsU3BhY2VSZWdpb24gOiBwdWJsaWMgTm9uU3RhdGljR2xvYmFsU3BhY2VSZWdpb24geworICBmcmllbmQgY2xhc3MgTWVtUmVnaW9uTWFuYWdlcjsKKworICBHbG9iYWxJbnRlcm5hbFNwYWNlUmVnaW9uKE1lbVJlZ2lvbk1hbmFnZXIgKm1ncikKKyAgICA6IE5vblN0YXRpY0dsb2JhbFNwYWNlUmVnaW9uKG1nciwgR2xvYmFsSW50ZXJuYWxTcGFjZVJlZ2lvbktpbmQpIHt9CisKK3B1YmxpYzoKKworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uICpSKSB7CisgICAgcmV0dXJuIFItPmdldEtpbmQoKSA9PSBHbG9iYWxJbnRlcm5hbFNwYWNlUmVnaW9uS2luZDsKKyAgfQorfTsKKworY2xhc3MgSGVhcFNwYWNlUmVnaW9uIDogcHVibGljIE1lbVNwYWNlUmVnaW9uIHsKKyAgZnJpZW5kIGNsYXNzIE1lbVJlZ2lvbk1hbmFnZXI7CisgIAorICBIZWFwU3BhY2VSZWdpb24oTWVtUmVnaW9uTWFuYWdlciAqbWdyKQorICAgIDogTWVtU3BhY2VSZWdpb24obWdyLCBIZWFwU3BhY2VSZWdpb25LaW5kKSB7fQorcHVibGljOgorCisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24gKlIpIHsKKyAgICByZXR1cm4gUi0+Z2V0S2luZCgpID09IEhlYXBTcGFjZVJlZ2lvbktpbmQ7CisgIH0KK307CisgIAorY2xhc3MgVW5rbm93blNwYWNlUmVnaW9uIDogcHVibGljIE1lbVNwYWNlUmVnaW9uIHsKKyAgZnJpZW5kIGNsYXNzIE1lbVJlZ2lvbk1hbmFnZXI7CisgIFVua25vd25TcGFjZVJlZ2lvbihNZW1SZWdpb25NYW5hZ2VyICptZ3IpCisgICAgICA6IE1lbVNwYWNlUmVnaW9uKG1nciwgVW5rbm93blNwYWNlUmVnaW9uS2luZCkge30KKworcHVibGljOgorCisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24gKlIpIHsKKyAgICByZXR1cm4gUi0+Z2V0S2luZCgpID09IFVua25vd25TcGFjZVJlZ2lvbktpbmQ7CisgIH0KK307CisKK2NsYXNzIFN0YWNrU3BhY2VSZWdpb24gOiBwdWJsaWMgTWVtU3BhY2VSZWdpb24geworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKKyAgY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKlNGQzsKKworcHJvdGVjdGVkOgorICBTdGFja1NwYWNlUmVnaW9uKE1lbVJlZ2lvbk1hbmFnZXIgKm1nciwgS2luZCBrLCBjb25zdCBTdGFja0ZyYW1lQ29udGV4dCAqc2ZjKQorICAgIDogTWVtU3BhY2VSZWdpb24obWdyLCBrKSwgU0ZDKHNmYykgeworICAgIGFzc2VydChjbGFzc29mKHRoaXMpKTsKKyAgICBhc3NlcnQoc2ZjKTsKKyAgfQorCitwdWJsaWM6CisgIGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpnZXRTdGFja0ZyYW1lKCkgY29uc3QgeyByZXR1cm4gU0ZDOyB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1lbVJlZ2lvbiAqUikgeworICAgIEtpbmQgayA9IFItPmdldEtpbmQoKTsKKyAgICByZXR1cm4gayA+PSBCRUdJTl9TVEFDS19NRU1TUEFDRVMgJiYgayA8PSBFTkRfU1RBQ0tfTUVNU1BBQ0VTOworICB9Cit9OworCitjbGFzcyBTdGFja0xvY2Fsc1NwYWNlUmVnaW9uIDogcHVibGljIFN0YWNrU3BhY2VSZWdpb24geworICBmcmllbmQgY2xhc3MgTWVtUmVnaW9uTWFuYWdlcjsKKyAgU3RhY2tMb2NhbHNTcGFjZVJlZ2lvbihNZW1SZWdpb25NYW5hZ2VyICptZ3IsIGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpzZmMpCisgICAgOiBTdGFja1NwYWNlUmVnaW9uKG1nciwgU3RhY2tMb2NhbHNTcGFjZVJlZ2lvbktpbmQsIHNmYykge30KK3B1YmxpYzoKKworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uICpSKSB7CisgICAgcmV0dXJuIFItPmdldEtpbmQoKSA9PSBTdGFja0xvY2Fsc1NwYWNlUmVnaW9uS2luZDsKKyAgfQorfTsKKworY2xhc3MgU3RhY2tBcmd1bWVudHNTcGFjZVJlZ2lvbiA6IHB1YmxpYyBTdGFja1NwYWNlUmVnaW9uIHsKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBNZW1SZWdpb25NYW5hZ2VyOworICBTdGFja0FyZ3VtZW50c1NwYWNlUmVnaW9uKE1lbVJlZ2lvbk1hbmFnZXIgKm1nciwgY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKnNmYykKKyAgICA6IFN0YWNrU3BhY2VSZWdpb24obWdyLCBTdGFja0FyZ3VtZW50c1NwYWNlUmVnaW9uS2luZCwgc2ZjKSB7fQorcHVibGljOgorCisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24gKlIpIHsKKyAgICByZXR1cm4gUi0+Z2V0S2luZCgpID09IFN0YWNrQXJndW1lbnRzU3BhY2VSZWdpb25LaW5kOworICB9Cit9OworCisKKy8vLyBTdWJSZWdpb24gLSBBIHJlZ2lvbiB0aGF0IHN1YnNldHMgYW5vdGhlciBsYXJnZXIgcmVnaW9uLiAgTW9zdCByZWdpb25zCisvLy8gIGFyZSBzdWJjbGFzc2VzIG9mIFN1YlJlZ2lvbi4KK2NsYXNzIFN1YlJlZ2lvbiA6IHB1YmxpYyBNZW1SZWdpb24geworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgTWVtUmVnaW9uKiBzdXBlclJlZ2lvbjsKKyAgU3ViUmVnaW9uKGNvbnN0IE1lbVJlZ2lvbiAqc1JlZywgS2luZCBrKSA6IE1lbVJlZ2lvbihrKSwgc3VwZXJSZWdpb24oc1JlZykgeworICAgIGFzc2VydChjbGFzc29mKHRoaXMpKTsKKyAgICBhc3NlcnQoc1JlZyk7CisgIH0KKworcHVibGljOgorICBjb25zdCBNZW1SZWdpb24qIGdldFN1cGVyUmVnaW9uKCkgY29uc3QgeworICAgIHJldHVybiBzdXBlclJlZ2lvbjsKKyAgfQorCisgIC8vLyBnZXRFeHRlbnQgLSBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSByZWdpb24gaW4gYnl0ZXMuCisgIHZpcnR1YWwgRGVmaW5lZE9yVW5rbm93blNWYWwgZ2V0RXh0ZW50KFNWYWxCdWlsZGVyICZzdmFsQnVpbGRlcikgY29uc3QgeworICAgIHJldHVybiBVbmtub3duVmFsKCk7CisgIH0KKworICBNZW1SZWdpb25NYW5hZ2VyKiBnZXRNZW1SZWdpb25NYW5hZ2VyKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBpc1N1YlJlZ2lvbk9mKGNvbnN0IE1lbVJlZ2lvbiogUikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24qIFIpIHsKKyAgICByZXR1cm4gUi0+Z2V0S2luZCgpID4gRU5EX01FTVNQQUNFUzsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1lbVJlZ2lvbiBzdWJjbGFzc2VzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEFsbG9jYVJlZ2lvbiAtIEEgcmVnaW9uIHRoYXQgcmVwcmVzZW50cyBhbiB1bnR5cGVkIGJsb2Igb2YgYnl0ZXMgY3JlYXRlZAorLy8vICBieSBhIGNhbGwgdG8gJ2FsbG9jYScuCitjbGFzcyBBbGxvY2FSZWdpb24gOiBwdWJsaWMgU3ViUmVnaW9uIHsKKyAgZnJpZW5kIGNsYXNzIE1lbVJlZ2lvbk1hbmFnZXI7CisKKyAgdW5zaWduZWQgQ250OyAvLyBCbG9jayBjb3VudGVyLiAgVXNlZCB0byBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgcGllY2VzIG9mCisgICAgICAgICAgICAgICAgLy8gbWVtb3J5IGFsbG9jYXRlZCBieSBhbGxvY2EgYXQgdGhlIHNhbWUgY2FsbCBzaXRlLgorICBjb25zdCBFeHByICpFeDsKKworICBBbGxvY2FSZWdpb24oY29uc3QgRXhwciAqZXgsIHVuc2lnbmVkIGNudCwgY29uc3QgTWVtU3BhY2VSZWdpb24gKnN1cGVyUmVnaW9uKQorICAgICAgOiBTdWJSZWdpb24oc3VwZXJSZWdpb24sIEFsbG9jYVJlZ2lvbktpbmQpLCBDbnQoY250KSwgRXgoZXgpIHsKKyAgICBhc3NlcnQoRXgpOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZVJlZ2lvbihsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCwgY29uc3QgRXhwciAqRXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ250LCBjb25zdCBNZW1SZWdpb24gKnN1cGVyUmVnaW9uKTsKKworcHVibGljOgorCisgIGNvbnN0IEV4cHIgKmdldEV4cHIoKSBjb25zdCB7IHJldHVybiBFeDsgfQorCisgIGJvb2wgaXNCb3VuZGFibGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisKKyAgRGVmaW5lZE9yVW5rbm93blNWYWwgZ2V0RXh0ZW50KFNWYWxCdWlsZGVyICZzdmFsQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uKiBSKSB7CisgICAgcmV0dXJuIFItPmdldEtpbmQoKSA9PSBBbGxvY2FSZWdpb25LaW5kOworICB9Cit9OworCisvLy8gVHlwZWRSZWdpb24gLSBBbiBhYnN0cmFjdCBjbGFzcyByZXByZXNlbnRpbmcgcmVnaW9ucyB0aGF0IGFyZSB0eXBlZC4KK2NsYXNzIFR5cGVkUmVnaW9uIDogcHVibGljIFN1YlJlZ2lvbiB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICBUeXBlZFJlZ2lvbihjb25zdCBNZW1SZWdpb24gKnNSZWcsIEtpbmQgaykgOiBTdWJSZWdpb24oc1JlZywgaykgeworICAgIGFzc2VydChjbGFzc29mKHRoaXMpKTsKKyAgfQorCitwdWJsaWM6CisgIHZpcnR1YWwgUXVhbFR5cGUgZ2V0TG9jYXRpb25UeXBlKCkgY29uc3QgPSAwOworCisgIFF1YWxUeXBlIGdldERlc3VnYXJlZExvY2F0aW9uVHlwZShBU1RDb250ZXh0ICZDb250ZXh0KSBjb25zdCB7CisgICAgcmV0dXJuIGdldExvY2F0aW9uVHlwZSgpLmdldERlc3VnYXJlZFR5cGUoQ29udGV4dCk7CisgIH0KKworICBib29sIGlzQm91bmRhYmxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uKiBSKSB7CisgICAgdW5zaWduZWQgayA9IFItPmdldEtpbmQoKTsKKyAgICByZXR1cm4gayA+PSBCRUdJTl9UWVBFRF9SRUdJT05TICYmIGsgPD0gRU5EX1RZUEVEX1JFR0lPTlM7CisgIH0KK307CisKKy8vLyBUeXBlZFZhbHVlUmVnaW9uIC0gQW4gYWJzdHJhY3QgY2xhc3MgcmVwcmVzZW50aW5nIHJlZ2lvbnMgaGF2aW5nIGEgdHlwZWQgdmFsdWUuCitjbGFzcyBUeXBlZFZhbHVlUmVnaW9uIDogcHVibGljIFR5cGVkUmVnaW9uIHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgIFR5cGVkVmFsdWVSZWdpb24oY29uc3QgTWVtUmVnaW9uKiBzUmVnLCBLaW5kIGspIDogVHlwZWRSZWdpb24oc1JlZywgaykgeworICAgIGFzc2VydChjbGFzc29mKHRoaXMpKTsKKyAgfQorCitwdWJsaWM6CisgIHZpcnR1YWwgUXVhbFR5cGUgZ2V0VmFsdWVUeXBlKCkgY29uc3QgPSAwOworCisgIFF1YWxUeXBlIGdldExvY2F0aW9uVHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAvLyBGSVhNRTogV2UgY2FuIHBvc3NpYmx5IG9wdGltaXplIHRoaXMgbGF0ZXIgdG8gY2FjaGUgdGhpcyB2YWx1ZS4KKyAgICBRdWFsVHlwZSBUID0gZ2V0VmFsdWVUeXBlKCk7CisgICAgQVNUQ29udGV4dCAmY3R4ID0gZ2V0Q29udGV4dCgpOworICAgIGlmIChULT5nZXRBczxPYmpDT2JqZWN0VHlwZT4oKSkKKyAgICAgIHJldHVybiBjdHguZ2V0T2JqQ09iamVjdFBvaW50ZXJUeXBlKFQpOworICAgIHJldHVybiBjdHguZ2V0UG9pbnRlclR5cGUoZ2V0VmFsdWVUeXBlKCkpOworICB9CisKKyAgUXVhbFR5cGUgZ2V0RGVzdWdhcmVkVmFsdWVUeXBlKEFTVENvbnRleHQgJkNvbnRleHQpIGNvbnN0IHsKKyAgICBRdWFsVHlwZSBUID0gZ2V0VmFsdWVUeXBlKCk7CisgICAgcmV0dXJuIFQuZ2V0VHlwZVB0ck9yTnVsbCgpID8gVC5nZXREZXN1Z2FyZWRUeXBlKENvbnRleHQpIDogVDsKKyAgfQorCisgIERlZmluZWRPclVua25vd25TVmFsIGdldEV4dGVudChTVmFsQnVpbGRlciAmc3ZhbEJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uKiBSKSB7CisgICAgdW5zaWduZWQgayA9IFItPmdldEtpbmQoKTsKKyAgICByZXR1cm4gayA+PSBCRUdJTl9UWVBFRF9WQUxVRV9SRUdJT05TICYmIGsgPD0gRU5EX1RZUEVEX1ZBTFVFX1JFR0lPTlM7CisgIH0KK307CisKKworY2xhc3MgQ29kZVRleHRSZWdpb24gOiBwdWJsaWMgVHlwZWRSZWdpb24geworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgQ29kZVRleHRSZWdpb24oY29uc3QgTWVtU3BhY2VSZWdpb24gKnNyZWcsIEtpbmQgaykgOiBUeXBlZFJlZ2lvbihzcmVnLCBrKSB7CisgICAgYXNzZXJ0KGNsYXNzb2YodGhpcykpOworICB9CisKK3B1YmxpYzoKKyAgYm9vbCBpc0JvdW5kYWJsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24qIFIpIHsKKyAgICBLaW5kIGsgPSBSLT5nZXRLaW5kKCk7CisgICAgcmV0dXJuIGsgPj0gQkVHSU5fQ09ERV9URVhUX1JFR0lPTlMgJiYgayA8PSBFTkRfQ09ERV9URVhUX1JFR0lPTlM7CisgIH0KK307CisKKy8vLyBGdW5jdGlvbkNvZGVSZWdpb24gLSBBIHJlZ2lvbiB0aGF0IHJlcHJlc2VudHMgY29kZSB0ZXh0cyBvZiBmdW5jdGlvbi4KK2NsYXNzIEZ1bmN0aW9uQ29kZVJlZ2lvbiA6IHB1YmxpYyBDb2RlVGV4dFJlZ2lvbiB7CisgIGZyaWVuZCBjbGFzcyBNZW1SZWdpb25NYW5hZ2VyOworCisgIGNvbnN0IE5hbWVkRGVjbCAqRkQ7CisKKyAgRnVuY3Rpb25Db2RlUmVnaW9uKGNvbnN0IE5hbWVkRGVjbCAqZmQsIGNvbnN0IENvZGVTcGFjZVJlZ2lvbiogc3JlZykKKyAgICA6IENvZGVUZXh0UmVnaW9uKHNyZWcsIEZ1bmN0aW9uQ29kZVJlZ2lvbktpbmQpLCBGRChmZCkgeworICAgIGFzc2VydChpc2E8T2JqQ01ldGhvZERlY2w+KGZkKSB8fCBpc2E8RnVuY3Rpb25EZWNsPihmZCkpOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZVJlZ2lvbihsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCwgY29uc3QgTmFtZWREZWNsICpGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1SZWdpb24qKTsKKworcHVibGljOgorICBRdWFsVHlwZSBnZXRMb2NhdGlvblR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgY29uc3QgQVNUQ29udGV4dCAmQ3R4ID0gZ2V0Q29udGV4dCgpOworICAgIGlmIChjb25zdCBGdW5jdGlvbkRlY2wgKkQgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KEZEKSkgeworICAgICAgcmV0dXJuIEN0eC5nZXRQb2ludGVyVHlwZShELT5nZXRUeXBlKCkpOworICAgIH0KKworICAgIGFzc2VydChpc2E8T2JqQ01ldGhvZERlY2w+KEZEKSk7CisgICAgYXNzZXJ0KGZhbHNlICYmICJHZXR0aW5nIHRoZSB0eXBlIG9mIE9iakNNZXRob2QgaXMgbm90IHN1cHBvcnRlZCB5ZXQiKTsKKworICAgIC8vIFRPRE86IFdlIG1pZ2h0IHdhbnQgdG8gcmV0dXJuIGEgZGlmZmVyZW50IHR5cGUgaGVyZSAoZXg6IGlkICgqdHkpKC4uLikpCisgICAgLy8gICAgICAgZGVwZW5kaW5nIG9uIGhvdyBpdCBpcyB1c2VkLgorICAgIHJldHVybiBRdWFsVHlwZSgpOworICB9CisKKyAgY29uc3QgTmFtZWREZWNsICpnZXREZWNsKCkgY29uc3QgeworICAgIHJldHVybiBGRDsKKyAgfQorCisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdCBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1lbVJlZ2lvbiogUikgeworICAgIHJldHVybiBSLT5nZXRLaW5kKCkgPT0gRnVuY3Rpb25Db2RlUmVnaW9uS2luZDsKKyAgfQorfTsKKyAgCisgIAorLy8vIEJsb2NrQ29kZVJlZ2lvbiAtIEEgcmVnaW9uIHRoYXQgcmVwcmVzZW50cyBjb2RlIHRleHRzIG9mIGJsb2NrcyAoY2xvc3VyZXMpLgorLy8vICBCbG9ja3MgYXJlIHJlcHJlc2VudGVkIHdpdGggdHdvIGtpbmRzIG9mIHJlZ2lvbnMuICBCbG9ja0NvZGVSZWdpb25zCisvLy8gIHJlcHJlc2VudCB0aGUgImNvZGUiLCB3aGlsZSBCbG9ja0RhdGFSZWdpb25zIHJlcHJlc2VudCBpbnN0YW5jZXMgb2YgYmxvY2tzLAorLy8vICB3aGljaCBjb3JyZXNwb25kIHRvICJjb2RlK2RhdGEiLiAgVGhlIGRpc3RpbmN0aW9uIGlzIGltcG9ydGFudCwgYmVjYXVzZQorLy8vICBsaWtlIGEgY2xvc3VyZSBhIGJsb2NrIGNhcHR1cmVzIHRoZSB2YWx1ZXMgb2YgZXh0ZXJuYWxseSByZWZlcmVuY2VkCisvLy8gIHZhcmlhYmxlcy4KK2NsYXNzIEJsb2NrQ29kZVJlZ2lvbiA6IHB1YmxpYyBDb2RlVGV4dFJlZ2lvbiB7CisgIGZyaWVuZCBjbGFzcyBNZW1SZWdpb25NYW5hZ2VyOworCisgIGNvbnN0IEJsb2NrRGVjbCAqQkQ7CisgIEFuYWx5c2lzRGVjbENvbnRleHQgKkFDOworICBDYW5RdWFsVHlwZSBsb2NUeTsKKworICBCbG9ja0NvZGVSZWdpb24oY29uc3QgQmxvY2tEZWNsICpiZCwgQ2FuUXVhbFR5cGUgbFR5LAorICAgICAgICAgICAgICAgICAgQW5hbHlzaXNEZWNsQ29udGV4dCAqYWMsIGNvbnN0IENvZGVTcGFjZVJlZ2lvbiogc3JlZykKKyAgICAgIDogQ29kZVRleHRSZWdpb24oc3JlZywgQmxvY2tDb2RlUmVnaW9uS2luZCksIEJEKGJkKSwgQUMoYWMpLCBsb2NUeShsVHkpIHsKKyAgICBhc3NlcnQoYmQpOworICAgIGFzc2VydChhYyk7CisgICAgYXNzZXJ0KGxUeS0+Z2V0VHlwZVB0cigpLT5pc0Jsb2NrUG9pbnRlclR5cGUoKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlUmVnaW9uKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElELCBjb25zdCBCbG9ja0RlY2wgKkJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhblF1YWxUeXBlLCBjb25zdCBBbmFseXNpc0RlY2xDb250ZXh0KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1SZWdpb24qKTsKKworcHVibGljOgorICBRdWFsVHlwZSBnZXRMb2NhdGlvblR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGxvY1R5OworICB9CisgIAorICBjb25zdCBCbG9ja0RlY2wgKmdldERlY2woKSBjb25zdCB7CisgICAgcmV0dXJuIEJEOworICB9CisKKyAgQW5hbHlzaXNEZWNsQ29udGV4dCAqZ2V0QW5hbHlzaXNEZWNsQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIEFDOyB9CisKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uKiBSKSB7CisgICAgcmV0dXJuIFItPmdldEtpbmQoKSA9PSBCbG9ja0NvZGVSZWdpb25LaW5kOworICB9Cit9OworICAKKy8vLyBCbG9ja0RhdGFSZWdpb24gLSBBIHJlZ2lvbiB0aGF0IHJlcHJlc2VudHMgYSBibG9jayBpbnN0YW5jZS4KKy8vLyAgQmxvY2tzIGFyZSByZXByZXNlbnRlZCB3aXRoIHR3byBraW5kcyBvZiByZWdpb25zLiAgQmxvY2tDb2RlUmVnaW9ucworLy8vICByZXByZXNlbnQgdGhlICJjb2RlIiwgd2hpbGUgQmxvY2tEYXRhUmVnaW9ucyByZXByZXNlbnQgaW5zdGFuY2VzIG9mIGJsb2NrcywKKy8vLyAgd2hpY2ggY29ycmVzcG9uZCB0byAiY29kZStkYXRhIi4gIFRoZSBkaXN0aW5jdGlvbiBpcyBpbXBvcnRhbnQsIGJlY2F1c2UKKy8vLyAgbGlrZSBhIGNsb3N1cmUgYSBibG9jayBjYXB0dXJlcyB0aGUgdmFsdWVzIG9mIGV4dGVybmFsbHkgcmVmZXJlbmNlZAorLy8vICB2YXJpYWJsZXMuCitjbGFzcyBCbG9ja0RhdGFSZWdpb24gOiBwdWJsaWMgVHlwZWRSZWdpb24geworICBmcmllbmQgY2xhc3MgTWVtUmVnaW9uTWFuYWdlcjsKKworICBjb25zdCBCbG9ja0NvZGVSZWdpb24gKkJDOworICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDOyAvLyBDYW4gYmUgbnVsbCAqLworICB1bnNpZ25lZCBCbG9ja0NvdW50OworICB2b2lkICpSZWZlcmVuY2VkVmFyczsKKyAgdm9pZCAqT3JpZ2luYWxWYXJzOworCisgIEJsb2NrRGF0YVJlZ2lvbihjb25zdCBCbG9ja0NvZGVSZWdpb24gKmJjLCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKmxjLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY291bnQsIGNvbnN0IE1lbVNwYWNlUmVnaW9uICpzcmVnKQorICAgICAgOiBUeXBlZFJlZ2lvbihzcmVnLCBCbG9ja0RhdGFSZWdpb25LaW5kKSwgQkMoYmMpLCBMQyhsYyksCisgICAgICAgIEJsb2NrQ291bnQoY291bnQpLCBSZWZlcmVuY2VkVmFycyhudWxscHRyKSwgT3JpZ2luYWxWYXJzKG51bGxwdHIpIHsKKyAgICBhc3NlcnQoYmMpOworICAgIGFzc2VydChsYyk7CisgICAgYXNzZXJ0KGlzYTxHbG9iYWxJbW11dGFibGVTcGFjZVJlZ2lvbj4oc3JlZykgfHwKKyAgICAgICAgICAgaXNhPFN0YWNrTG9jYWxzU3BhY2VSZWdpb24+KHNyZWcpIHx8CisgICAgICAgICAgIGlzYTxVbmtub3duU3BhY2VSZWdpb24+KHNyZWcpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGVSZWdpb24obGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYsIGNvbnN0IEJsb2NrQ29kZVJlZ2lvbiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqLCB1bnNpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1SZWdpb24gKik7CisKK3B1YmxpYzoKKyAgY29uc3QgQmxvY2tDb2RlUmVnaW9uICpnZXRDb2RlUmVnaW9uKCkgY29uc3QgeyByZXR1cm4gQkM7IH0KKyAgCisgIGNvbnN0IEJsb2NrRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IHsgcmV0dXJuIEJDLT5nZXREZWNsKCk7IH0KKworICBRdWFsVHlwZSBnZXRMb2NhdGlvblR5cGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBCQy0+Z2V0TG9jYXRpb25UeXBlKCk7IH0KKworICBjbGFzcyByZWZlcmVuY2VkX3ZhcnNfaXRlcmF0b3IgeworICAgIGNvbnN0IE1lbVJlZ2lvbiAqIGNvbnN0ICpSOworICAgIGNvbnN0IE1lbVJlZ2lvbiAqIGNvbnN0ICpPcmlnaW5hbFI7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCByZWZlcmVuY2VkX3ZhcnNfaXRlcmF0b3IoY29uc3QgTWVtUmVnaW9uICogY29uc3QgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbVJlZ2lvbiAqIGNvbnN0ICpvcmlnaW5hbFIpCisgICAgICA6IFIociksIE9yaWdpbmFsUihvcmlnaW5hbFIpIHt9CisKKyAgICBjb25zdCBWYXJSZWdpb24gKmdldENhcHR1cmVkUmVnaW9uKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8VmFyUmVnaW9uPigqUik7CisgICAgfQorICAgIGNvbnN0IFZhclJlZ2lvbiAqZ2V0T3JpZ2luYWxSZWdpb24oKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxWYXJSZWdpb24+KCpPcmlnaW5hbFIpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCByZWZlcmVuY2VkX3ZhcnNfaXRlcmF0b3IgJkkpIGNvbnN0IHsKKyAgICAgIGFzc2VydCgoUiA9PSBudWxscHRyKSA9PSAoSS5SID09IG51bGxwdHIpKTsKKyAgICAgIHJldHVybiBJLlIgPT0gUjsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHJlZmVyZW5jZWRfdmFyc19pdGVyYXRvciAmSSkgY29uc3QgeworICAgICAgYXNzZXJ0KChSID09IG51bGxwdHIpID09IChJLlIgPT0gbnVsbHB0cikpOworICAgICAgcmV0dXJuIEkuUiAhPSBSOworICAgIH0KKyAgICByZWZlcmVuY2VkX3ZhcnNfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgICArK1I7CisgICAgICArK09yaWdpbmFsUjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgIH07CisKKyAgLy8vIFJldHVybiB0aGUgb3JpZ2luYWwgcmVnaW9uIGZvciBhIGNhcHR1cmVkIHJlZ2lvbiwgaWYKKyAgLy8vIG9uZSBleGlzdHMuCisgIGNvbnN0IFZhclJlZ2lvbiAqZ2V0T3JpZ2luYWxSZWdpb24oY29uc3QgVmFyUmVnaW9uICpWUikgY29uc3Q7CisgICAgICAKKyAgcmVmZXJlbmNlZF92YXJzX2l0ZXJhdG9yIHJlZmVyZW5jZWRfdmFyc19iZWdpbigpIGNvbnN0OworICByZWZlcmVuY2VkX3ZhcnNfaXRlcmF0b3IgcmVmZXJlbmNlZF92YXJzX2VuZCgpIGNvbnN0OyAgCisKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uKiBSKSB7CisgICAgcmV0dXJuIFItPmdldEtpbmQoKSA9PSBCbG9ja0RhdGFSZWdpb25LaW5kOworICB9Citwcml2YXRlOgorICB2b2lkIExhenlJbml0aWFsaXplUmVmZXJlbmNlZFZhcnMoKTsKKyAgc3RkOjpwYWlyPGNvbnN0IFZhclJlZ2lvbiAqLCBjb25zdCBWYXJSZWdpb24gKj4KKyAgZ2V0Q2FwdHVyZVJlZ2lvbnMoY29uc3QgVmFyRGVjbCAqVkQpOworfTsKKworLy8vIFN5bWJvbGljUmVnaW9uIC0gQSBzcGVjaWFsLCAibm9uLWNvbmNyZXRlIiByZWdpb24uIFVubGlrZSBvdGhlciByZWdpb24KKy8vLyAgY2xhc3NlcywgU3ltYm9saWNSZWdpb24gcmVwcmVzZW50cyBhIHJlZ2lvbiB0aGF0IHNlcnZlcyBhcyBhbiBhbGlhcyBmb3IKKy8vLyAgZWl0aGVyIGEgcmVhbCByZWdpb24sIGEgTlVMTCBwb2ludGVyLCBldGMuICBJdCBlc3NlbnRpYWxseSBpcyB1c2VkIHRvCisvLy8gIG1hcCB0aGUgY29uY2VwdCBvZiBzeW1ib2xpYyB2YWx1ZXMgaW50byB0aGUgZG9tYWluIG9mIHJlZ2lvbnMuICBTeW1ib2xpYworLy8vICByZWdpb25zIGRvIG5vdCBuZWVkIHRvIGJlIHR5cGVkLgorY2xhc3MgU3ltYm9saWNSZWdpb24gOiBwdWJsaWMgU3ViUmVnaW9uIHsKKyAgZnJpZW5kIGNsYXNzIE1lbVJlZ2lvbk1hbmFnZXI7CisKKyAgY29uc3QgU3ltYm9sUmVmIHN5bTsKKworICBTeW1ib2xpY1JlZ2lvbihjb25zdCBTeW1ib2xSZWYgcywgY29uc3QgTWVtU3BhY2VSZWdpb24gKnNyZWcpCisgICAgICA6IFN1YlJlZ2lvbihzcmVnLCBTeW1ib2xpY1JlZ2lvbktpbmQpLCBzeW0ocykgeworICAgIGFzc2VydChzKTsKKyAgICBhc3NlcnQocy0+Z2V0VHlwZSgpLT5pc0FueVBvaW50ZXJUeXBlKCkgfHwKKyAgICAgICAgICAgcy0+Z2V0VHlwZSgpLT5pc1JlZmVyZW5jZVR5cGUoKSB8fAorICAgICAgICAgICBzLT5nZXRUeXBlKCktPmlzQmxvY2tQb2ludGVyVHlwZSgpKTsKKyAgICBhc3NlcnQoaXNhPFVua25vd25TcGFjZVJlZ2lvbj4oc3JlZykgfHwgaXNhPEhlYXBTcGFjZVJlZ2lvbj4oc3JlZykpOworICB9CisKK3B1YmxpYzoKKyAgU3ltYm9sUmVmIGdldFN5bWJvbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3ltOworICB9CisKKyAgYm9vbCBpc0JvdW5kYWJsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKworICBEZWZpbmVkT3JVbmtub3duU1ZhbCBnZXRFeHRlbnQoU1ZhbEJ1aWxkZXIgJnN2YWxCdWlsZGVyKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyB2b2lkIFByb2ZpbGVSZWdpb24obGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sUmVmIHN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1SZWdpb24qIHN1cGVyUmVnaW9uKTsKKworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uKiBSKSB7CisgICAgcmV0dXJuIFItPmdldEtpbmQoKSA9PSBTeW1ib2xpY1JlZ2lvbktpbmQ7CisgIH0KK307CisKKy8vLyBTdHJpbmdSZWdpb24gLSBSZWdpb24gYXNzb2NpYXRlZCB3aXRoIGEgU3RyaW5nTGl0ZXJhbC4KK2NsYXNzIFN0cmluZ1JlZ2lvbiA6IHB1YmxpYyBUeXBlZFZhbHVlUmVnaW9uIHsKKyAgZnJpZW5kIGNsYXNzIE1lbVJlZ2lvbk1hbmFnZXI7CisKKyAgY29uc3QgU3RyaW5nTGl0ZXJhbCogU3RyOworCisgIFN0cmluZ1JlZ2lvbihjb25zdCBTdHJpbmdMaXRlcmFsICpzdHIsIGNvbnN0IEdsb2JhbEludGVybmFsU3BhY2VSZWdpb24gKnNyZWcpCisgICAgICA6IFR5cGVkVmFsdWVSZWdpb24oc3JlZywgU3RyaW5nUmVnaW9uS2luZCksIFN0cihzdHIpIHsKKyAgICBhc3NlcnQoc3RyKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGVSZWdpb24obGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nTGl0ZXJhbCogU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbVJlZ2lvbiogc3VwZXJSZWdpb24pOworCitwdWJsaWM6CisKKyAgY29uc3QgU3RyaW5nTGl0ZXJhbCogZ2V0U3RyaW5nTGl0ZXJhbCgpIGNvbnN0IHsgcmV0dXJuIFN0cjsgfQorCisgIFF1YWxUeXBlIGdldFZhbHVlVHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gU3RyLT5nZXRUeXBlKCk7CisgIH0KKworICBEZWZpbmVkT3JVbmtub3duU1ZhbCBnZXRFeHRlbnQoU1ZhbEJ1aWxkZXIgJnN2YWxCdWlsZGVyKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIGlzQm91bmRhYmxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBQcm9maWxlUmVnaW9uKElELCBTdHIsIHN1cGVyUmVnaW9uKTsKKyAgfQorCisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24qIFIpIHsKKyAgICByZXR1cm4gUi0+Z2V0S2luZCgpID09IFN0cmluZ1JlZ2lvbktpbmQ7CisgIH0KK307CisgIAorLy8vIFRoZSByZWdpb24gYXNzb2NpYXRlZCB3aXRoIGFuIE9iakNTdHJpbmdMaXRlcmFsLgorY2xhc3MgT2JqQ1N0cmluZ1JlZ2lvbiA6IHB1YmxpYyBUeXBlZFZhbHVlUmVnaW9uIHsKKyAgZnJpZW5kIGNsYXNzIE1lbVJlZ2lvbk1hbmFnZXI7CisKKyAgY29uc3QgT2JqQ1N0cmluZ0xpdGVyYWwqIFN0cjsKKworICBPYmpDU3RyaW5nUmVnaW9uKGNvbnN0IE9iakNTdHJpbmdMaXRlcmFsICpzdHIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgR2xvYmFsSW50ZXJuYWxTcGFjZVJlZ2lvbiAqc3JlZykKKyAgICAgIDogVHlwZWRWYWx1ZVJlZ2lvbihzcmVnLCBPYmpDU3RyaW5nUmVnaW9uS2luZCksIFN0cihzdHIpIHsKKyAgICBhc3NlcnQoc3RyKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGVSZWdpb24obGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ1N0cmluZ0xpdGVyYWwqIFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1SZWdpb24qIHN1cGVyUmVnaW9uKTsKKyAgCitwdWJsaWM6CisgIAorICBjb25zdCBPYmpDU3RyaW5nTGl0ZXJhbCogZ2V0T2JqQ1N0cmluZ0xpdGVyYWwoKSBjb25zdCB7IHJldHVybiBTdHI7IH0KKworICBRdWFsVHlwZSBnZXRWYWx1ZVR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFN0ci0+Z2V0VHlwZSgpOworICB9CisKKyAgYm9vbCBpc0JvdW5kYWJsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdCBvdmVycmlkZSB7CisgICAgUHJvZmlsZVJlZ2lvbihJRCwgU3RyLCBzdXBlclJlZ2lvbik7CisgIH0KKworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uKiBSKSB7CisgICAgcmV0dXJuIFItPmdldEtpbmQoKSA9PSBPYmpDU3RyaW5nUmVnaW9uS2luZDsKKyAgfQorfTsKKworLy8vIENvbXBvdW5kTGl0ZXJhbFJlZ2lvbiAtIEEgbWVtb3J5IHJlZ2lvbiByZXByZXNlbnRpbmcgYSBjb21wb3VuZCBsaXRlcmFsLgorLy8vICAgQ29tcG91bmQgbGl0ZXJhbHMgYXJlIGVzc2VudGlhbGx5IHRlbXBvcmFyaWVzIHRoYXQgYXJlIHN0YWNrIGFsbG9jYXRlZAorLy8vICAgb3IgaW4gdGhlIGdsb2JhbCBjb25zdGFudCBwb29sLgorY2xhc3MgQ29tcG91bmRMaXRlcmFsUmVnaW9uIDogcHVibGljIFR5cGVkVmFsdWVSZWdpb24geworICBmcmllbmQgY2xhc3MgTWVtUmVnaW9uTWFuYWdlcjsKKworICBjb25zdCBDb21wb3VuZExpdGVyYWxFeHByICpDTDsKKworICBDb21wb3VuZExpdGVyYWxSZWdpb24oY29uc3QgQ29tcG91bmRMaXRlcmFsRXhwciAqY2wsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1TcGFjZVJlZ2lvbiAqc1JlZykKKyAgICAgIDogVHlwZWRWYWx1ZVJlZ2lvbihzUmVnLCBDb21wb3VuZExpdGVyYWxSZWdpb25LaW5kKSwgQ0woY2wpIHsKKyAgICBhc3NlcnQoY2wpOworICAgIGFzc2VydChpc2E8R2xvYmFsSW50ZXJuYWxTcGFjZVJlZ2lvbj4oc1JlZykgfHwKKyAgICAgICAgICAgaXNhPFN0YWNrTG9jYWxzU3BhY2VSZWdpb24+KHNSZWcpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGVSZWdpb24obGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tcG91bmRMaXRlcmFsRXhwciAqQ0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtUmVnaW9uKiBzdXBlclJlZ2lvbik7CitwdWJsaWM6CisgIFF1YWxUeXBlIGdldFZhbHVlVHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gQ0wtPmdldFR5cGUoKTsKKyAgfQorCisgIGJvb2wgaXNCb3VuZGFibGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAhQ0wtPmlzRmlsZVNjb3BlKCk7IH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgY29uc3QgQ29tcG91bmRMaXRlcmFsRXhwciAqZ2V0TGl0ZXJhbEV4cHIoKSBjb25zdCB7IHJldHVybiBDTDsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uKiBSKSB7CisgICAgcmV0dXJuIFItPmdldEtpbmQoKSA9PSBDb21wb3VuZExpdGVyYWxSZWdpb25LaW5kOworICB9Cit9OworCitjbGFzcyBEZWNsUmVnaW9uIDogcHVibGljIFR5cGVkVmFsdWVSZWdpb24geworcHJvdGVjdGVkOgorICBjb25zdCBEZWNsICpEOworCisgIERlY2xSZWdpb24oY29uc3QgRGVjbCAqZCwgY29uc3QgTWVtUmVnaW9uICpzUmVnLCBLaW5kIGspCisgICAgICA6IFR5cGVkVmFsdWVSZWdpb24oc1JlZywgayksIEQoZCkgeworICAgIGFzc2VydChjbGFzc29mKHRoaXMpKTsKKyAgICBhc3NlcnQoZCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlUmVnaW9uKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElELCBjb25zdCBEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbVJlZ2lvbiogc3VwZXJSZWdpb24sIEtpbmQgayk7CisKK3B1YmxpYzoKKyAgY29uc3QgRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IHsgcmV0dXJuIEQ7IH0KKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdCBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1lbVJlZ2lvbiogUikgeworICAgIHVuc2lnbmVkIGsgPSBSLT5nZXRLaW5kKCk7CisgICAgcmV0dXJuIGsgPj0gQkVHSU5fREVDTF9SRUdJT05TICYmIGsgPD0gRU5EX0RFQ0xfUkVHSU9OUzsKKyAgfQorfTsKKworY2xhc3MgVmFyUmVnaW9uIDogcHVibGljIERlY2xSZWdpb24geworICBmcmllbmQgY2xhc3MgTWVtUmVnaW9uTWFuYWdlcjsKKworICAvLyBDb25zdHJ1Y3RvcnMgYW5kIHByaXZhdGUgbWV0aG9kcy4KKyAgVmFyUmVnaW9uKGNvbnN0IFZhckRlY2wgKnZkLCBjb25zdCBNZW1SZWdpb24gKnNSZWcpCisgICAgICA6IERlY2xSZWdpb24odmQsIHNSZWcsIFZhclJlZ2lvbktpbmQpIHsKKyAgICAvLyBWYXJSZWdpb24gYXBwZWFycyBpbiB1bmtub3duIHNwYWNlIHdoZW4gaXQncyBhIGJsb2NrIHZhcmlhYmxlIGFzIHNlZW4KKyAgICAvLyBmcm9tIGEgYmxvY2sgdXNpbmcgaXQsIHdoZW4gdGhpcyBibG9jayBpcyBhbmFseXplZCBhdCB0b3AtbGV2ZWwuCisgICAgLy8gT3RoZXIgYmxvY2sgdmFyaWFibGVzIGFwcGVhciB3aXRoaW4gYmxvY2sgZGF0YSByZWdpb25zLAorICAgIC8vIHdoaWNoLCB1bmxpa2UgZXZlcnl0aGluZyBlbHNlIG9uIHRoaXMgbGlzdCwgYXJlIG5vdCBtZW1vcnkgc3BhY2VzLgorICAgIGFzc2VydChpc2E8R2xvYmFsc1NwYWNlUmVnaW9uPihzUmVnKSB8fCBpc2E8U3RhY2tTcGFjZVJlZ2lvbj4oc1JlZykgfHwKKyAgICAgICAgICAgaXNhPEJsb2NrRGF0YVJlZ2lvbj4oc1JlZykgfHwgaXNhPFVua25vd25TcGFjZVJlZ2lvbj4oc1JlZykpOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZVJlZ2lvbihsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCwgY29uc3QgVmFyRGVjbCAqVkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtUmVnaW9uICpzdXBlclJlZ2lvbikgeworICAgIERlY2xSZWdpb246OlByb2ZpbGVSZWdpb24oSUQsIFZELCBzdXBlclJlZ2lvbiwgVmFyUmVnaW9uS2luZCk7CisgIH0KKworcHVibGljOgorICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIGNvbnN0IG92ZXJyaWRlOworCisgIGNvbnN0IFZhckRlY2wgKmdldERlY2woKSBjb25zdCB7IHJldHVybiBjYXN0PFZhckRlY2w+KEQpOyB9CisKKyAgY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKmdldFN0YWNrRnJhbWUoKSBjb25zdDsKKworICBRdWFsVHlwZSBnZXRWYWx1ZVR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgLy8gRklYTUU6IFdlIGNhbiBjYWNoZSB0aGlzIGlmIG5lZWRlZC4KKyAgICByZXR1cm4gZ2V0RGVjbCgpLT5nZXRUeXBlKCk7CisgIH0KKworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uKiBSKSB7CisgICAgcmV0dXJuIFItPmdldEtpbmQoKSA9PSBWYXJSZWdpb25LaW5kOworICB9CisKKyAgYm9vbCBjYW5QcmludFByZXR0eUFzRXhwcigpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgcHJpbnRQcmV0dHlBc0V4cHIocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKK307CisgIAorLy8vIENYWFRoaXNSZWdpb24gLSBSZXByZXNlbnRzIHRoZSByZWdpb24gZm9yIHRoZSBpbXBsaWNpdCAndGhpcycgcGFyYW1ldGVyCisvLy8gIGluIGEgY2FsbCB0byBhIEMrKyBtZXRob2QuICBUaGlzIHJlZ2lvbiBkb2Vzbid0IHJlcHJlc2VudCB0aGUgb2JqZWN0CisvLy8gIHJlZmVycmVkIHRvIGJ5ICd0aGlzJywgYnV0IHJhdGhlciAndGhpcycgaXRzZWxmLgorY2xhc3MgQ1hYVGhpc1JlZ2lvbiA6IHB1YmxpYyBUeXBlZFZhbHVlUmVnaW9uIHsKKyAgZnJpZW5kIGNsYXNzIE1lbVJlZ2lvbk1hbmFnZXI7CisKKyAgQ1hYVGhpc1JlZ2lvbihjb25zdCBQb2ludGVyVHlwZSAqdGhpc1BvaW50ZXJUeSwKKyAgICAgICAgICAgICAgICBjb25zdCBTdGFja0FyZ3VtZW50c1NwYWNlUmVnaW9uICpzUmVnKQorICAgICAgOiBUeXBlZFZhbHVlUmVnaW9uKHNSZWcsIENYWFRoaXNSZWdpb25LaW5kKSwKKyAgICAgICAgVGhpc1BvaW50ZXJUeSh0aGlzUG9pbnRlclR5KSB7CisgICAgYXNzZXJ0KFRoaXNQb2ludGVyVHktPmdldFBvaW50ZWVUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpICYmCisgICAgICAgICAgICJJbnZhbGlkIHJlZ2lvbiB0eXBlISIpOworICB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZVJlZ2lvbihsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb2ludGVyVHlwZSAqUFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtUmVnaW9uICpzUmVnKTsKKworcHVibGljOgorICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IG92ZXJyaWRlOworCisgIFF1YWxUeXBlIGdldFZhbHVlVHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUXVhbFR5cGUoVGhpc1BvaW50ZXJUeSwgMCk7CisgIH0KKworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uKiBSKSB7CisgICAgcmV0dXJuIFItPmdldEtpbmQoKSA9PSBDWFhUaGlzUmVnaW9uS2luZDsKKyAgfQorCitwcml2YXRlOgorICBjb25zdCBQb2ludGVyVHlwZSAqVGhpc1BvaW50ZXJUeTsKK307CisKK2NsYXNzIEZpZWxkUmVnaW9uIDogcHVibGljIERlY2xSZWdpb24geworICBmcmllbmQgY2xhc3MgTWVtUmVnaW9uTWFuYWdlcjsKKworICBGaWVsZFJlZ2lvbihjb25zdCBGaWVsZERlY2wgKmZkLCBjb25zdCBTdWJSZWdpb24qIHNSZWcpCisgICAgOiBEZWNsUmVnaW9uKGZkLCBzUmVnLCBGaWVsZFJlZ2lvbktpbmQpIHt9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZVJlZ2lvbihsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCwgY29uc3QgRmllbGREZWNsICpGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1SZWdpb24qIHN1cGVyUmVnaW9uKSB7CisgICAgRGVjbFJlZ2lvbjo6UHJvZmlsZVJlZ2lvbihJRCwgRkQsIHN1cGVyUmVnaW9uLCBGaWVsZFJlZ2lvbktpbmQpOworICB9CisKK3B1YmxpYzoKKyAgY29uc3QgRmllbGREZWNsICpnZXREZWNsKCkgY29uc3QgeyByZXR1cm4gY2FzdDxGaWVsZERlY2w+KEQpOyB9CisKKyAgUXVhbFR5cGUgZ2V0VmFsdWVUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIC8vIEZJWE1FOiBXZSBjYW4gY2FjaGUgdGhpcyBpZiBuZWVkZWQuCisgICAgcmV0dXJuIGdldERlY2woKS0+Z2V0VHlwZSgpOworICB9CisKKyAgRGVmaW5lZE9yVW5rbm93blNWYWwgZ2V0RXh0ZW50KFNWYWxCdWlsZGVyICZzdmFsQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24qIFIpIHsKKyAgICByZXR1cm4gUi0+Z2V0S2luZCgpID09IEZpZWxkUmVnaW9uS2luZDsKKyAgfQorCisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBjYW5QcmludFByZXR0eSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgY2FuUHJpbnRQcmV0dHlBc0V4cHIoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBwcmludFByZXR0eUFzRXhwcihyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworfTsKKworY2xhc3MgT2JqQ0l2YXJSZWdpb24gOiBwdWJsaWMgRGVjbFJlZ2lvbiB7CisgIGZyaWVuZCBjbGFzcyBNZW1SZWdpb25NYW5hZ2VyOworCisgIE9iakNJdmFyUmVnaW9uKGNvbnN0IE9iakNJdmFyRGVjbCAqaXZkLCBjb25zdCBTdWJSZWdpb24gKnNSZWcpOworCisgIHN0YXRpYyB2b2lkIFByb2ZpbGVSZWdpb24obGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQsIGNvbnN0IE9iakNJdmFyRGVjbCAqaXZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbVJlZ2lvbiogc3VwZXJSZWdpb24pOworCitwdWJsaWM6CisgIGNvbnN0IE9iakNJdmFyRGVjbCAqZ2V0RGVjbCgpIGNvbnN0OworICBRdWFsVHlwZSBnZXRWYWx1ZVR5cGUoKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIGNhblByaW50UHJldHR5QXNFeHByKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgcHJpbnRQcmV0dHlBc0V4cHIocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uKiBSKSB7CisgICAgcmV0dXJuIFItPmdldEtpbmQoKSA9PSBPYmpDSXZhclJlZ2lvbktpbmQ7CisgIH0KK307CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQXV4aWxpYXJ5IGRhdGEgY2xhc3NlcyBmb3IgdXNlIHdpdGggTWVtUmVnaW9ucy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIEVsZW1lbnRSZWdpb247CisKK2NsYXNzIFJlZ2lvblJhd09mZnNldCB7CisgIGZyaWVuZCBjbGFzcyBFbGVtZW50UmVnaW9uOworCisgIGNvbnN0IE1lbVJlZ2lvbiAqUmVnaW9uOworICBDaGFyVW5pdHMgT2Zmc2V0OworCisgIFJlZ2lvblJhd09mZnNldChjb25zdCBNZW1SZWdpb24qIHJlZywgQ2hhclVuaXRzIG9mZnNldCA9IENoYXJVbml0czo6WmVybygpKQorICAgIDogUmVnaW9uKHJlZyksIE9mZnNldChvZmZzZXQpIHt9CisKK3B1YmxpYzoKKyAgLy8gRklYTUU6IEV2ZW50dWFsbHkgc3VwcG9ydCBzeW1ib2xpYyBvZmZzZXRzLgorICBDaGFyVW5pdHMgZ2V0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gT2Zmc2V0OyB9CisgIGNvbnN0IE1lbVJlZ2lvbiAqZ2V0UmVnaW9uKCkgY29uc3QgeyByZXR1cm4gUmVnaW9uOyB9CisKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCisvLy8gXGJyaWVmIEVsZW1lbnRSZWdpbiBpcyB1c2VkIHRvIHJlcHJlc2VudCBib3RoIGFycmF5IGVsZW1lbnRzIGFuZCBjYXN0cy4KK2NsYXNzIEVsZW1lbnRSZWdpb24gOiBwdWJsaWMgVHlwZWRWYWx1ZVJlZ2lvbiB7CisgIGZyaWVuZCBjbGFzcyBNZW1SZWdpb25NYW5hZ2VyOworCisgIFF1YWxUeXBlIEVsZW1lbnRUeXBlOworICBOb25Mb2MgSW5kZXg7CisKKyAgRWxlbWVudFJlZ2lvbihRdWFsVHlwZSBlbGVtZW50VHlwZSwgTm9uTG9jIElkeCwgY29uc3QgU3ViUmVnaW9uICpzUmVnKQorICAgICAgOiBUeXBlZFZhbHVlUmVnaW9uKHNSZWcsIEVsZW1lbnRSZWdpb25LaW5kKSwKKyAgICAgICAgRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpLCBJbmRleChJZHgpIHsKKyAgICBhc3NlcnQoKCFJZHguZ2V0QXM8bm9ubG9jOjpDb25jcmV0ZUludD4oKSB8fAorICAgICAgICAgICAgSWR4LmNhc3RBczxub25sb2M6OkNvbmNyZXRlSW50PigpLmdldFZhbHVlKCkuaXNTaWduZWQoKSkgJiYKKyAgICAgICAgICAgIlRoZSBpbmRleCBtdXN0IGJlIHNpZ25lZCIpOworICAgIGFzc2VydCghZWxlbWVudFR5cGUuaXNOdWxsKCkgJiYgIWVsZW1lbnRUeXBlLT5pc1ZvaWRUeXBlKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgcmVnaW9uIHR5cGUhIik7CisgIH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlUmVnaW9uKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElELCBRdWFsVHlwZSBlbGVtZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVmFsIElkeCwgY29uc3QgTWVtUmVnaW9uKiBzdXBlclJlZ2lvbik7CisKK3B1YmxpYzoKKworICBOb25Mb2MgZ2V0SW5kZXgoKSBjb25zdCB7IHJldHVybiBJbmRleDsgfQorCisgIFF1YWxUeXBlIGdldFZhbHVlVHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gRWxlbWVudFR5cGU7CisgIH0KKworICBRdWFsVHlwZSBnZXRFbGVtZW50VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRWxlbWVudFR5cGU7CisgIH0KKyAgLy8vIENvbXB1dGUgdGhlIG9mZnNldCB3aXRoaW4gdGhlIGFycmF5LiBUaGUgYXJyYXkgbWlnaHQgYWxzbyBiZSBhIHN1Ym9iamVjdC4KKyAgUmVnaW9uUmF3T2Zmc2V0IGdldEFzQXJyYXlPZmZzZXQoKSBjb25zdDsKKworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24qIFIpIHsKKyAgICByZXR1cm4gUi0+Z2V0S2luZCgpID09IEVsZW1lbnRSZWdpb25LaW5kOworICB9Cit9OworCisvLyBDKysgdGVtcG9yYXJ5IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYW4gZXhwcmVzc2lvbi4KK2NsYXNzIENYWFRlbXBPYmplY3RSZWdpb24gOiBwdWJsaWMgVHlwZWRWYWx1ZVJlZ2lvbiB7CisgIGZyaWVuZCBjbGFzcyBNZW1SZWdpb25NYW5hZ2VyOworCisgIEV4cHIgY29uc3QgKkV4OworCisgIENYWFRlbXBPYmplY3RSZWdpb24oRXhwciBjb25zdCAqRSwgTWVtU3BhY2VSZWdpb24gY29uc3QgKnNSZWcpCisgICAgICA6IFR5cGVkVmFsdWVSZWdpb24oc1JlZywgQ1hYVGVtcE9iamVjdFJlZ2lvbktpbmQpLCBFeChFKSB7CisgICAgYXNzZXJ0KEUpOworICAgIGFzc2VydChpc2E8U3RhY2tMb2NhbHNTcGFjZVJlZ2lvbj4oc1JlZykgfHwKKyAgICAgICAgICAgaXNhPEdsb2JhbEludGVybmFsU3BhY2VSZWdpb24+KHNSZWcpKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGVSZWdpb24obGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciBjb25zdCAqRSwgY29uc3QgTWVtUmVnaW9uICpzUmVnKTsKKworcHVibGljOgorICBjb25zdCBFeHByICpnZXRFeHByKCkgY29uc3QgeyByZXR1cm4gRXg7IH0KKworICBRdWFsVHlwZSBnZXRWYWx1ZVR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEV4LT5nZXRUeXBlKCk7CisgIH0KKworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24qIFIpIHsKKyAgICByZXR1cm4gUi0+Z2V0S2luZCgpID09IENYWFRlbXBPYmplY3RSZWdpb25LaW5kOworICB9Cit9OworCisvLyBDWFhCYXNlT2JqZWN0UmVnaW9uIHJlcHJlc2VudHMgYSBiYXNlIG9iamVjdCB3aXRoaW4gYSBDKysgb2JqZWN0LiBJdCBpcyAKKy8vIGlkZW50aWZpZWQgYnkgdGhlIGJhc2UgY2xhc3MgZGVjbGFyYXRpb24gYW5kIHRoZSByZWdpb24gb2YgaXRzIHBhcmVudCBvYmplY3QuCitjbGFzcyBDWFhCYXNlT2JqZWN0UmVnaW9uIDogcHVibGljIFR5cGVkVmFsdWVSZWdpb24geworICBmcmllbmQgY2xhc3MgTWVtUmVnaW9uTWFuYWdlcjsKKworICBsbHZtOjpQb2ludGVySW50UGFpcjxjb25zdCBDWFhSZWNvcmREZWNsICosIDEsIGJvb2w+IERhdGE7CisKKyAgQ1hYQmFzZU9iamVjdFJlZ2lvbihjb25zdCBDWFhSZWNvcmREZWNsICpSRCwgYm9vbCBJc1ZpcnR1YWwsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ViUmVnaW9uICpTUmVnKQorICAgICAgOiBUeXBlZFZhbHVlUmVnaW9uKFNSZWcsIENYWEJhc2VPYmplY3RSZWdpb25LaW5kKSwgRGF0YShSRCwgSXNWaXJ0dWFsKSB7CisgICAgYXNzZXJ0KFJEKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGVSZWdpb24obGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIGNvbnN0IENYWFJlY29yZERlY2wgKlJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNWaXJ0dWFsLCBjb25zdCBNZW1SZWdpb24gKlNSZWcpOworCitwdWJsaWM6CisgIGNvbnN0IENYWFJlY29yZERlY2wgKmdldERlY2woKSBjb25zdCB7IHJldHVybiBEYXRhLmdldFBvaW50ZXIoKTsgfQorICBib29sIGlzVmlydHVhbCgpIGNvbnN0IHsgcmV0dXJuIERhdGEuZ2V0SW50KCk7IH0KKworICBRdWFsVHlwZSBnZXRWYWx1ZVR5cGUoKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24gKnJlZ2lvbikgeworICAgIHJldHVybiByZWdpb24tPmdldEtpbmQoKSA9PSBDWFhCYXNlT2JqZWN0UmVnaW9uS2luZDsKKyAgfQorCisgIGJvb2wgY2FuUHJpbnRQcmV0dHlBc0V4cHIoKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIHByaW50UHJldHR5QXNFeHByKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZWdpb25UeT4KK2NvbnN0IFJlZ2lvblR5KiBNZW1SZWdpb246OmdldEFzKCkgY29uc3QgeworICBpZiAoY29uc3QgUmVnaW9uVHkqIFJUID0gZHluX2Nhc3Q8UmVnaW9uVHk+KHRoaXMpKQorICAgIHJldHVybiBSVDsKKworICByZXR1cm4gbnVsbHB0cjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1lbVJlZ2lvbk1hbmFnZXIgLSBGYWN0b3J5IG9iamVjdCBmb3IgY3JlYXRpbmcgcmVnaW9ucy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIE1lbVJlZ2lvbk1hbmFnZXIgeworICBBU1RDb250ZXh0ICZDOworICBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yJiBBOworICBsbHZtOjpGb2xkaW5nU2V0PE1lbVJlZ2lvbj4gUmVnaW9uczsKKworICBHbG9iYWxJbnRlcm5hbFNwYWNlUmVnaW9uICpJbnRlcm5hbEdsb2JhbHM7CisgIEdsb2JhbFN5c3RlbVNwYWNlUmVnaW9uICpTeXN0ZW1HbG9iYWxzOworICBHbG9iYWxJbW11dGFibGVTcGFjZVJlZ2lvbiAqSW1tdXRhYmxlR2xvYmFsczsKKworICAKKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKiwgU3RhY2tMb2NhbHNTcGFjZVJlZ2lvbiAqPiAKKyAgICBTdGFja0xvY2Fsc1NwYWNlUmVnaW9uczsKKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKiwgU3RhY2tBcmd1bWVudHNTcGFjZVJlZ2lvbiAqPgorICAgIFN0YWNrQXJndW1lbnRzU3BhY2VSZWdpb25zOworICBsbHZtOjpEZW5zZU1hcDxjb25zdCBDb2RlVGV4dFJlZ2lvbiAqLCBTdGF0aWNHbG9iYWxTcGFjZVJlZ2lvbiAqPgorICAgIFN0YXRpY3NHbG9iYWxTcGFjZVJlZ2lvbnM7CisKKyAgSGVhcFNwYWNlUmVnaW9uICpoZWFwOworICBVbmtub3duU3BhY2VSZWdpb24gKnVua25vd247CisgIENvZGVTcGFjZVJlZ2lvbiAqY29kZTsKKworcHVibGljOgorICBNZW1SZWdpb25NYW5hZ2VyKEFTVENvbnRleHQgJmMsIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgJmEpCisgICAgOiBDKGMpLCBBKGEpLCBJbnRlcm5hbEdsb2JhbHMobnVsbHB0ciksIFN5c3RlbUdsb2JhbHMobnVsbHB0ciksCisgICAgICBJbW11dGFibGVHbG9iYWxzKG51bGxwdHIpLCBoZWFwKG51bGxwdHIpLCB1bmtub3duKG51bGxwdHIpLAorICAgICAgY29kZShudWxscHRyKSB7fQorCisgIH5NZW1SZWdpb25NYW5hZ2VyKCk7CisKKyAgQVNUQ29udGV4dCAmZ2V0Q29udGV4dCgpIHsgcmV0dXJuIEM7IH0KKyAgCisgIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgJmdldEFsbG9jYXRvcigpIHsgcmV0dXJuIEE7IH0KKworICAvLy8gZ2V0U3RhY2tMb2NhbHNSZWdpb24gLSBSZXRyaWV2ZSB0aGUgbWVtb3J5IHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlCisgIC8vLyAgc3BlY2lmaWVkIHN0YWNrIGZyYW1lLgorICBjb25zdCBTdGFja0xvY2Fsc1NwYWNlUmVnaW9uICoKKyAgZ2V0U3RhY2tMb2NhbHNSZWdpb24oY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKlNUQyk7CisKKyAgLy8vIGdldFN0YWNrQXJndW1lbnRzUmVnaW9uIC0gUmV0cmlldmUgdGhlIG1lbW9yeSByZWdpb24gYXNzb2NpYXRlZCB3aXRoCisgIC8vLyAgZnVuY3Rpb24vbWV0aG9kIGFyZ3VtZW50cyBvZiB0aGUgc3BlY2lmaWVkIHN0YWNrIGZyYW1lLgorICBjb25zdCBTdGFja0FyZ3VtZW50c1NwYWNlUmVnaW9uICoKKyAgZ2V0U3RhY2tBcmd1bWVudHNSZWdpb24oY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKlNUQyk7CisKKyAgLy8vIGdldEdsb2JhbHNSZWdpb24gLSBSZXRyaWV2ZSB0aGUgbWVtb3J5IHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGgKKyAgLy8vICBnbG9iYWwgdmFyaWFibGVzLgorICBjb25zdCBHbG9iYWxzU3BhY2VSZWdpb24gKmdldEdsb2JhbHNSZWdpb24oCisgICAgICBNZW1SZWdpb246OktpbmQgSyA9IE1lbVJlZ2lvbjo6R2xvYmFsSW50ZXJuYWxTcGFjZVJlZ2lvbktpbmQsCisgICAgICBjb25zdCBDb2RlVGV4dFJlZ2lvbiAqUiA9IG51bGxwdHIpOworCisgIC8vLyBnZXRIZWFwUmVnaW9uIC0gUmV0cmlldmUgdGhlIG1lbW9yeSByZWdpb24gYXNzb2NpYXRlZCB3aXRoIHRoZQorICAvLy8gIGdlbmVyaWMgImhlYXAiLgorICBjb25zdCBIZWFwU3BhY2VSZWdpb24gKmdldEhlYXBSZWdpb24oKTsKKworICAvLy8gZ2V0VW5rbm93blJlZ2lvbiAtIFJldHJpZXZlIHRoZSBtZW1vcnkgcmVnaW9uIGFzc29jaWF0ZWQgd2l0aCB1bmtub3duCisgIC8vLyBtZW1vcnkgc3BhY2UuCisgIGNvbnN0IFVua25vd25TcGFjZVJlZ2lvbiAqZ2V0VW5rbm93blJlZ2lvbigpOworCisgIGNvbnN0IENvZGVTcGFjZVJlZ2lvbiAqZ2V0Q29kZVJlZ2lvbigpOworCisgIC8vLyBnZXRBbGxvY2FSZWdpb24gLSBSZXRyaWV2ZSBhIHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGggYSBjYWxsIHRvIGFsbG9jYSgpLgorICBjb25zdCBBbGxvY2FSZWdpb24gKmdldEFsbG9jYVJlZ2lvbihjb25zdCBFeHByICpFeCwgdW5zaWduZWQgQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDKTsKKworICAvLy8gZ2V0Q29tcG91bmRMaXRlcmFsUmVnaW9uIC0gUmV0cmlldmUgdGhlIHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGggYQorICAvLy8gIGdpdmVuIENvbXBvdW5kTGl0ZXJhbC4KKyAgY29uc3QgQ29tcG91bmRMaXRlcmFsUmVnaW9uKgorICBnZXRDb21wb3VuZExpdGVyYWxSZWdpb24oY29uc3QgQ29tcG91bmRMaXRlcmFsRXhwciAqQ0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDKTsKKyAgCisgIC8vLyBnZXRDWFhUaGlzUmVnaW9uIC0gUmV0cmlldmUgdGhlIFthcnRpZmljaWFsXSByZWdpb24gYXNzb2NpYXRlZCB3aXRoIHRoZQorICAvLy8gIHBhcmFtZXRlciAndGhpcycuCisgIGNvbnN0IENYWFRoaXNSZWdpb24gKmdldENYWFRoaXNSZWdpb24oUXVhbFR5cGUgdGhpc1BvaW50ZXJUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDKTsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIG9yIGNyZWF0ZSBhICJzeW1ib2xpYyIgbWVtb3J5IHJlZ2lvbi4KKyAgY29uc3QgU3ltYm9saWNSZWdpb24qIGdldFN5bWJvbGljUmVnaW9uKFN5bWJvbFJlZiBTeW0pOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgdW5pcXVlIHN5bWJvbGljIHJlZ2lvbiBiZWxvbmdpbmcgdG8gaGVhcCBtZW1vcnkgc3BhY2UuCisgIGNvbnN0IFN5bWJvbGljUmVnaW9uICpnZXRTeW1ib2xpY0hlYXBSZWdpb24oU3ltYm9sUmVmIHN5bSk7CisKKyAgY29uc3QgU3RyaW5nUmVnaW9uICpnZXRTdHJpbmdSZWdpb24oY29uc3QgU3RyaW5nTGl0ZXJhbCogU3RyKTsKKworICBjb25zdCBPYmpDU3RyaW5nUmVnaW9uICpnZXRPYmpDU3RyaW5nUmVnaW9uKGNvbnN0IE9iakNTdHJpbmdMaXRlcmFsICpTdHIpOworCisgIC8vLyBnZXRWYXJSZWdpb24gLSBSZXRyaWV2ZSBvciBjcmVhdGUgdGhlIG1lbW9yeSByZWdpb24gYXNzb2NpYXRlZCB3aXRoCisgIC8vLyAgYSBzcGVjaWZpZWQgVmFyRGVjbCBhbmQgTG9jYXRpb25Db250ZXh0LgorICBjb25zdCBWYXJSZWdpb24qIGdldFZhclJlZ2lvbihjb25zdCBWYXJEZWNsICpELCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDKTsKKworICAvLy8gZ2V0VmFyUmVnaW9uIC0gUmV0cmlldmUgb3IgY3JlYXRlIHRoZSBtZW1vcnkgcmVnaW9uIGFzc29jaWF0ZWQgd2l0aAorICAvLy8gIGEgc3BlY2lmaWVkIFZhckRlY2wgYW5kIHN1cGVyIHJlZ2lvbi4KKyAgY29uc3QgVmFyUmVnaW9uICpnZXRWYXJSZWdpb24oY29uc3QgVmFyRGVjbCAqRCwgY29uc3QgTWVtUmVnaW9uICpzdXBlclIpOworCisgIC8vLyBnZXRFbGVtZW50UmVnaW9uIC0gUmV0cmlldmUgdGhlIG1lbW9yeSByZWdpb24gYXNzb2NpYXRlZCB3aXRoIHRoZQorICAvLy8gIGFzc29jaWF0ZWQgZWxlbWVudCB0eXBlLCBpbmRleCwgYW5kIHN1cGVyIHJlZ2lvbi4KKyAgY29uc3QgRWxlbWVudFJlZ2lvbiAqZ2V0RWxlbWVudFJlZ2lvbihRdWFsVHlwZSBlbGVtZW50VHlwZSwgTm9uTG9jIElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWJSZWdpb24gKnN1cGVyUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVENvbnRleHQgJkN0eCk7CisKKyAgY29uc3QgRWxlbWVudFJlZ2lvbiAqZ2V0RWxlbWVudFJlZ2lvbldpdGhTdXBlcihjb25zdCBFbGVtZW50UmVnaW9uICpFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWJSZWdpb24gKnN1cGVyUmVnaW9uKSB7CisgICAgcmV0dXJuIGdldEVsZW1lbnRSZWdpb24oRVItPmdldEVsZW1lbnRUeXBlKCksIEVSLT5nZXRJbmRleCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyUmVnaW9uLCBFUi0+Z2V0Q29udGV4dCgpKTsKKyAgfQorCisgIC8vLyBnZXRGaWVsZFJlZ2lvbiAtIFJldHJpZXZlIG9yIGNyZWF0ZSB0aGUgbWVtb3J5IHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGgKKyAgLy8vICBhIHNwZWNpZmllZCBGaWVsZERlY2wuICAnc3VwZXJSZWdpb24nIGNvcnJlc3BvbmRzIHRvIHRoZSBjb250YWluaW5nCisgIC8vLyAgbWVtb3J5IHJlZ2lvbiAod2hpY2ggdHlwaWNhbGx5IHJlcHJlc2VudHMgdGhlIG1lbW9yeSByZXByZXNlbnRpbmcKKyAgLy8vICBhIHN0cnVjdHVyZSBvciBjbGFzcykuCisgIGNvbnN0IEZpZWxkUmVnaW9uICpnZXRGaWVsZFJlZ2lvbihjb25zdCBGaWVsZERlY2wgKmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ViUmVnaW9uKiBzdXBlclJlZ2lvbik7CisKKyAgY29uc3QgRmllbGRSZWdpb24gKmdldEZpZWxkUmVnaW9uV2l0aFN1cGVyKGNvbnN0IEZpZWxkUmVnaW9uICpGUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN1YlJlZ2lvbiAqc3VwZXJSZWdpb24pIHsKKyAgICByZXR1cm4gZ2V0RmllbGRSZWdpb24oRlItPmdldERlY2woKSwgc3VwZXJSZWdpb24pOworICB9CisKKyAgLy8vIGdldE9iakNJdmFyUmVnaW9uIC0gUmV0cmlldmUgb3IgY3JlYXRlIHRoZSBtZW1vcnkgcmVnaW9uIGFzc29jaWF0ZWQgd2l0aAorICAvLy8gICBhIHNwZWNpZmllZCBPYmplY3RpdmUtYyBpbnN0YW5jZSB2YXJpYWJsZS4gICdzdXBlclJlZ2lvbicgY29ycmVzcG9uZHMKKyAgLy8vICAgdG8gdGhlIGNvbnRhaW5pbmcgcmVnaW9uICh3aGljaCB0eXBpY2FsbHkgcmVwcmVzZW50cyB0aGUgT2JqZWN0aXZlLUMKKyAgLy8vICAgb2JqZWN0KS4KKyAgY29uc3QgT2JqQ0l2YXJSZWdpb24gKmdldE9iakNJdmFyUmVnaW9uKGNvbnN0IE9iakNJdmFyRGVjbCAqaXZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ViUmVnaW9uKiBzdXBlclJlZ2lvbik7CisKKyAgY29uc3QgQ1hYVGVtcE9iamVjdFJlZ2lvbiAqZ2V0Q1hYVGVtcE9iamVjdFJlZ2lvbihFeHByIGNvbnN0ICpFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbkNvbnRleHQgY29uc3QgKkxDKTsKKworICAvLy8gQ3JlYXRlIGEgQ1hYQmFzZU9iamVjdFJlZ2lvbiB3aXRoIHRoZSBnaXZlbiBiYXNlIGNsYXNzIGZvciByZWdpb24KKyAgLy8vIFxwIFN1cGVyLgorICAvLy8KKyAgLy8vIFRoZSB0eXBlIG9mIFxwIFN1cGVyIGlzIGFzc3VtZWQgYmUgYSBjbGFzcyBkZXJpdmluZyBmcm9tIFxwIEJhc2VDbGFzcy4KKyAgY29uc3QgQ1hYQmFzZU9iamVjdFJlZ2lvbiAqCisgIGdldENYWEJhc2VPYmplY3RSZWdpb24oY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZUNsYXNzLCBjb25zdCBTdWJSZWdpb24gKlN1cGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNWaXJ0dWFsKTsKKworICAvLy8gQ3JlYXRlIGEgQ1hYQmFzZU9iamVjdFJlZ2lvbiB3aXRoIHRoZSBzYW1lIENYWFJlY29yZERlY2wgYnV0IGEgZGlmZmVyZW50CisgIC8vLyBzdXBlciByZWdpb24uCisgIGNvbnN0IENYWEJhc2VPYmplY3RSZWdpb24gKgorICBnZXRDWFhCYXNlT2JqZWN0UmVnaW9uV2l0aFN1cGVyKGNvbnN0IENYWEJhc2VPYmplY3RSZWdpb24gKmJhc2VSZWcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN1YlJlZ2lvbiAqc3VwZXJSZWdpb24pIHsKKyAgICByZXR1cm4gZ2V0Q1hYQmFzZU9iamVjdFJlZ2lvbihiYXNlUmVnLT5nZXREZWNsKCksIHN1cGVyUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VSZWctPmlzVmlydHVhbCgpKTsKKyAgfQorCisgIGNvbnN0IEZ1bmN0aW9uQ29kZVJlZ2lvbiAqZ2V0RnVuY3Rpb25Db2RlUmVnaW9uKGNvbnN0IE5hbWVkRGVjbCAqRkQpOworICBjb25zdCBCbG9ja0NvZGVSZWdpb24gKmdldEJsb2NrQ29kZVJlZ2lvbihjb25zdCBCbG9ja0RlY2wgKkJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5RdWFsVHlwZSBsb2NUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbHlzaXNEZWNsQ29udGV4dCAqQUMpOworICAKKyAgLy8vIGdldEJsb2NrRGF0YVJlZ2lvbiAtIEdldCB0aGUgbWVtb3J5IHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGggYW4gaW5zdGFuY2UKKyAgLy8vICBvZiBhIGJsb2NrLiAgVW5saWtlIG1hbnkgb3RoZXIgTWVtUmVnaW9ucywgdGhlIExvY2F0aW9uQ29udGV4dCoKKyAgLy8vICBhcmd1bWVudCBpcyBhbGxvd2VkIHRvIGJlIE5VTEwgZm9yIGNhc2VzIHdoZXJlIHdlIGhhdmUgbm8ga25vd24KKyAgLy8vICBjb250ZXh0LgorICBjb25zdCBCbG9ja0RhdGFSZWdpb24gKmdldEJsb2NrRGF0YVJlZ2lvbihjb25zdCBCbG9ja0NvZGVSZWdpb24gKmJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKmxjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBibG9ja0NvdW50KTsKKworICAvLy8gQ3JlYXRlIGEgQ1hYVGVtcE9iamVjdFJlZ2lvbiBmb3IgdGVtcG9yYXJpZXMgd2hpY2ggYXJlIGxpZmV0aW1lLWV4dGVuZGVkCisgIC8vLyBieSBzdGF0aWMgcmVmZXJlbmNlcy4gVGhpcyBkaWZmZXJzIGZyb20gZ2V0Q1hYVGVtcE9iamVjdFJlZ2lvbiBpbiB0aGUKKyAgLy8vIHN1cGVyLXJlZ2lvbiB1c2VkLgorICBjb25zdCBDWFhUZW1wT2JqZWN0UmVnaW9uICpnZXRDWFhTdGF0aWNUZW1wT2JqZWN0UmVnaW9uKGNvbnN0IEV4cHIgKkV4KTsKKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlZ2lvblR5LCB0eXBlbmFtZSBTdXBlclR5LAorICAgICAgICAgICAgdHlwZW5hbWUgQXJnMVR5PgorICBSZWdpb25UeSogZ2V0U3ViUmVnaW9uKGNvbnN0IEFyZzFUeSBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN1cGVyVHkqIHN1cGVyUmVnaW9uKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVnaW9uVHksIHR5cGVuYW1lIFN1cGVyVHksCisgICAgICAgICAgICB0eXBlbmFtZSBBcmcxVHksIHR5cGVuYW1lIEFyZzJUeT4KKyAgUmVnaW9uVHkqIGdldFN1YlJlZ2lvbihjb25zdCBBcmcxVHkgYXJnMSwgY29uc3QgQXJnMlR5IGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3VwZXJUeSogc3VwZXJSZWdpb24pOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZWdpb25UeSwgdHlwZW5hbWUgU3VwZXJUeSwKKyAgICAgICAgICAgIHR5cGVuYW1lIEFyZzFUeSwgdHlwZW5hbWUgQXJnMlR5LCB0eXBlbmFtZSBBcmczVHk+CisgIFJlZ2lvblR5KiBnZXRTdWJSZWdpb24oY29uc3QgQXJnMVR5IGFyZzEsIGNvbnN0IEFyZzJUeSBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzNUeSBhcmczLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN1cGVyVHkqIHN1cGVyUmVnaW9uKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUkVHPgorICBjb25zdCBSRUcqIExhenlBbGxvY2F0ZShSRUcqJiByZWdpb24pOworICAKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJFRywgdHlwZW5hbWUgQVJHPgorICBjb25zdCBSRUcqIExhenlBbGxvY2F0ZShSRUcqJiByZWdpb24sIEFSRyBhKTsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBPdXQtb2YtbGluZSBtZW1iZXIgZGVmaW5pdGlvbnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitpbmxpbmUgQVNUQ29udGV4dCAmTWVtUmVnaW9uOjpnZXRDb250ZXh0KCkgY29uc3QgeworICByZXR1cm4gZ2V0TWVtUmVnaW9uTWFuYWdlcigpLT5nZXRDb250ZXh0KCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNZWFucyBmb3Igc3RvcmluZyByZWdpb24vc3ltYm9sIGhhbmRsaW5nIHRyYWl0cy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBJbmZvcm1hdGlvbiBhYm91dCBpbnZhbGlkYXRpb24gZm9yIGEgcGFydGljdWxhciByZWdpb24vc3ltYm9sLgorY2xhc3MgUmVnaW9uQW5kU3ltYm9sSW52YWxpZGF0aW9uVHJhaXRzIHsKKyAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFN0b3JhZ2VUeXBlRm9yS2luZHM7CisgIGxsdm06OkRlbnNlTWFwPGNvbnN0IE1lbVJlZ2lvbiAqLCBTdG9yYWdlVHlwZUZvcktpbmRzPiBNUlRyYWl0c01hcDsKKyAgbGx2bTo6RGVuc2VNYXA8U3ltYm9sUmVmLCBTdG9yYWdlVHlwZUZvcktpbmRzPiBTeW1UcmFpdHNNYXA7CisKKyAgdHlwZWRlZiBsbHZtOjpEZW5zZU1hcDxjb25zdCBNZW1SZWdpb24gKiwgU3RvcmFnZVR5cGVGb3JLaW5kcz46OmNvbnN0X2l0ZXJhdG9yCisgICAgICBjb25zdF9yZWdpb25faXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8U3ltYm9sUmVmLCBTdG9yYWdlVHlwZUZvcktpbmRzPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgIGNvbnN0X3N5bWJvbF9pdGVyYXRvcjsKKworcHVibGljOgorICAvLy8gXGJyaWVmIERlc2NyaWJlcyBkaWZmZXJlbnQgaW52YWxpZGF0aW9uIHRyYWl0cy4KKyAgZW51bSBJbnZhbGlkYXRpb25LaW5kcyB7CisgICAgLy8vIFRlbGxzIHRoYXQgYSByZWdpb24ncyBjb250ZW50cyBpcyBub3QgY2hhbmdlZC4KKyAgICBUS19QcmVzZXJ2ZUNvbnRlbnRzID0gMHgxLAorICAgIC8vLyBTdXBwcmVzcyBwb2ludGVyLWVzY2FwaW5nIG9mIGEgcmVnaW9uLgorICAgIFRLX1N1cHByZXNzRXNjYXBlID0gMHgyLAorICAgIC8vIERvIG5vdCBpbnZhbGlkYXRlIHN1cGVyIHJlZ2lvbi4KKyAgICBUS19Eb05vdEludmFsaWRhdGVTdXBlclJlZ2lvbiA9IDB4NCwKKyAgICAvLy8gV2hlbiBhcHBsaWVkIHRvIGEgTWVtU3BhY2VSZWdpb24sIGluZGljYXRlcyB0aGUgZW50aXJlIG1lbW9yeSBzcGFjZQorICAgIC8vLyBzaG91bGQgYmUgaW52YWxpZGF0ZWQuCisgICAgVEtfRW50aXJlTWVtU3BhY2UgPSAweDgKKworICAgIC8vIERvIG5vdCBmb3JnZXQgdG8gZXh0ZW5kIFN0b3JhZ2VUeXBlRm9yS2luZHMgaWYgbnVtYmVyIG9mIHRyYWl0cyBleGNlZWQgCisgICAgLy8gdGhlIG51bWJlciBvZiBiaXRzIFN0b3JhZ2VUeXBlRm9yS2luZHMgY2FuIHN0b3JlLgorICB9OworCisgIHZvaWQgc2V0VHJhaXQoU3ltYm9sUmVmIFN5bSwgSW52YWxpZGF0aW9uS2luZHMgSUspOworICB2b2lkIHNldFRyYWl0KGNvbnN0IE1lbVJlZ2lvbiAqTVIsIEludmFsaWRhdGlvbktpbmRzIElLKTsKKyAgYm9vbCBoYXNUcmFpdChTeW1ib2xSZWYgU3ltLCBJbnZhbGlkYXRpb25LaW5kcyBJSykgY29uc3Q7CisgIGJvb2wgaGFzVHJhaXQoY29uc3QgTWVtUmVnaW9uICpNUiwgSW52YWxpZGF0aW9uS2luZHMgSUspIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFByZXR0eS1wcmludGluZyByZWdpb25zLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhbmc6OmVudG86Ok1lbVJlZ2lvbiAqUikgeworICBSLT5kdW1wVG9TdHJlYW0ob3MpOworICByZXR1cm4gb3M7Cit9CisKK30gLy8gbmFtZXNwYWNlIGVudG8KKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvUHJvZ3JhbVN0YXRlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvUHJvZ3JhbVN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0MDYzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Qcm9ncmFtU3RhdGUuaApAQCAtMCwwICsxLDg3OCBAQAorLy89PSBQcm9ncmFtU3RhdGUuaCAtIFBhdGgtc2Vuc2l0aXZlICJTdGF0ZSIgZm9yIHRyYWNraW5nIHZhbHVlcyAtKi0gQysrIC0qLS09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgc3RhdGUgb2YgdGhlIHByb2dyYW0gYWxvbmcgdGhlIGFuYWx5c2lzYSBwYXRoLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfUFJPR1JBTVNUQVRFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfUFJPR1JBTVNUQVRFX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQ29uc3RyYWludE1hbmFnZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvRHluYW1pY1R5cGVJbmZvLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1Byb2dyYW1TdGF0ZV9Gd2QuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU1ZhbEJ1aWxkZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU3RvcmUuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvVGFpbnRUYWcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW1tdXRhYmxlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEFQU0ludDsKK30KKworbmFtZXNwYWNlIGNsYW5nIHsKK2NsYXNzIEFTVENvbnRleHQ7CisKK25hbWVzcGFjZSBlbnRvIHsKKworY2xhc3MgQ2FsbEV2ZW50OworY2xhc3MgQ2FsbEV2ZW50TWFuYWdlcjsKKwordHlwZWRlZiBzdGQ6OnVuaXF1ZV9wdHI8Q29uc3RyYWludE1hbmFnZXI+KCpDb25zdHJhaW50TWFuYWdlckNyZWF0b3IpKAorICAgIFByb2dyYW1TdGF0ZU1hbmFnZXIgJiwgU3ViRW5naW5lICopOwordHlwZWRlZiBzdGQ6OnVuaXF1ZV9wdHI8U3RvcmVNYW5hZ2VyPigqU3RvcmVNYW5hZ2VyQ3JlYXRvcikoCisgICAgUHJvZ3JhbVN0YXRlTWFuYWdlciAmKTsKK3R5cGVkZWYgbGx2bTo6SW1tdXRhYmxlTWFwPGNvbnN0IFN1YlJlZ2lvbiosIFRhaW50VGFnVHlwZT4gVGFpbnRlZFN1YlJlZ2lvbnM7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQcm9ncmFtU3RhdGVUcmFpdCAtIFRyYWl0cyB1c2VkIGJ5IHRoZSBHZW5lcmljIERhdGEgTWFwIG9mIGEgUHJvZ3JhbVN0YXRlLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBQcm9ncmFtU3RhdGVQYXJ0aWFsVHJhaXQ7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgUHJvZ3JhbVN0YXRlVHJhaXQgeworICB0eXBlZGVmIHR5cGVuYW1lIFQ6OmRhdGFfdHlwZSBkYXRhX3R5cGU7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCAqTWFrZVZvaWRQdHIoZGF0YV90eXBlIEQpIHsgcmV0dXJuICh2b2lkKikgRDsgfQorICBzdGF0aWMgaW5saW5lIGRhdGFfdHlwZSBNYWtlRGF0YSh2b2lkICpjb25zdCogUCkgeworICAgIHJldHVybiBQID8gKGRhdGFfdHlwZSkgKlAgOiAoZGF0YV90eXBlKSAwOworICB9Cit9OworCisvLy8gXGNsYXNzIFByb2dyYW1TdGF0ZQorLy8vIFByb2dyYW1TdGF0ZSAtIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzOgorLy8vCisvLy8gICAgMS4gQSBtYXBwaW5nIGZyb20gZXhwcmVzc2lvbnMgdG8gdmFsdWVzIChFbnZpcm9ubWVudCkKKy8vLyAgICAyLiBBIG1hcHBpbmcgZnJvbSBsb2NhdGlvbnMgdG8gdmFsdWVzIChTdG9yZSkKKy8vLyAgICAzLiBDb25zdHJhaW50cyBvbiBzeW1ib2xpYyB2YWx1ZXMgKEdlbmVyaWNEYXRhTWFwKQorLy8vCisvLy8gIFRvZ2V0aGVyIHRoZXNlIHJlcHJlc2VudCB0aGUgImFic3RyYWN0IHN0YXRlIiBvZiBhIHByb2dyYW0uCisvLy8KKy8vLyAgUHJvZ3JhbVN0YXRlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgYSBmdW5jdGlvbmFsIG9iamVjdDsgdGhhdCBpcywKKy8vLyAgb25jZSBpdCBpcyBjcmVhdGVkIGFuZCBtYWRlICJwZXJzaXN0ZW50IiBpbiBhIEZvbGRpbmdTZXQsIGl0cworLy8vICB2YWx1ZXMgd2lsbCBuZXZlciBjaGFuZ2UuCitjbGFzcyBQcm9ncmFtU3RhdGUgOiBwdWJsaWMgbGx2bTo6Rm9sZGluZ1NldE5vZGUgeworcHVibGljOgorICB0eXBlZGVmIGxsdm06OkltbXV0YWJsZVNldDxsbHZtOjpBUFNJbnQqPiAgICAgICAgICAgICAgICBJbnRTZXRUeTsKKyAgdHlwZWRlZiBsbHZtOjpJbW11dGFibGVNYXA8dm9pZCosIHZvaWQqPiAgICAgICAgICAgICAgICAgR2VuZXJpY0RhdGFNYXA7CisKK3ByaXZhdGU6CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFByb2dyYW1TdGF0ZSYgUikgPSBkZWxldGU7CisKKyAgZnJpZW5kIGNsYXNzIFByb2dyYW1TdGF0ZU1hbmFnZXI7CisgIGZyaWVuZCBjbGFzcyBFeHBsb2RlZEdyYXBoOworICBmcmllbmQgY2xhc3MgRXhwbG9kZWROb2RlOworCisgIFByb2dyYW1TdGF0ZU1hbmFnZXIgKnN0YXRlTWdyOworICBFbnZpcm9ubWVudCBFbnY7ICAgICAgICAgICAvLyBNYXBzIGEgU3RtdCB0byBpdHMgY3VycmVudCBTVmFsLgorICBTdG9yZSBzdG9yZTsgICAgICAgICAgICAgICAvLyBNYXBzIGEgbG9jYXRpb24gdG8gaXRzIGN1cnJlbnQgdmFsdWUuCisgIEdlbmVyaWNEYXRhTWFwICAgR0RNOyAgICAgIC8vIEN1c3RvbSBkYXRhIHN0b3JlZCBieSBhIGNsaWVudCBvZiB0aGlzIGNsYXNzLgorICB1bnNpZ25lZCByZWZDb3VudDsKKworICAvLy8gbWFrZVdpdGhTdG9yZSAtIFJldHVybiBhIFByb2dyYW1TdGF0ZSB3aXRoIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUgY3VycmVudAorICAvLy8gIHN0YXRlIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB1c2luZyB0aGUgc3BlY2lmaWVkIFN0b3JlLgorICBQcm9ncmFtU3RhdGVSZWYgbWFrZVdpdGhTdG9yZShjb25zdCBTdG9yZVJlZiAmc3RvcmUpIGNvbnN0OworCisgIHZvaWQgc2V0U3RvcmUoY29uc3QgU3RvcmVSZWYgJnN0b3JlUmVmKTsKKworcHVibGljOgorICAvLy8gVGhpcyBjdG9yIGlzIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgZmlyc3QgUHJvZ3JhbVN0YXRlIG9iamVjdC4KKyAgUHJvZ3JhbVN0YXRlKFByb2dyYW1TdGF0ZU1hbmFnZXIgKm1nciwgY29uc3QgRW52aXJvbm1lbnQmIGVudiwKKyAgICAgICAgICBTdG9yZVJlZiBzdCwgR2VuZXJpY0RhdGFNYXAgZ2RtKTsKKworICAvLy8gQ29weSBjdG9yIC0gV2UgbXVzdCBleHBsaWNpdGx5IGRlZmluZSB0aGlzIG9yIGVsc2UgdGhlICJOZXh0IiBwdHIKKyAgLy8vICBpbiBGb2xkaW5nU2V0Tm9kZSB3aWxsIGFsc28gZ2V0IGNvcGllZC4KKyAgUHJvZ3JhbVN0YXRlKGNvbnN0IFByb2dyYW1TdGF0ZSAmUkhTKTsKKworICB+UHJvZ3JhbVN0YXRlKCk7CisKKyAgLy8vIFJldHVybiB0aGUgUHJvZ3JhbVN0YXRlTWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdGF0ZS4KKyAgUHJvZ3JhbVN0YXRlTWFuYWdlciAmZ2V0U3RhdGVNYW5hZ2VyKCkgY29uc3QgeworICAgIHJldHVybiAqc3RhdGVNZ3I7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBDb25zdHJhaW50TWFuYWdlci4KKyAgQ29uc3RyYWludE1hbmFnZXIgJmdldENvbnN0cmFpbnRNYW5hZ2VyKCkgY29uc3Q7CisKKyAgLy8vIGdldEVudmlyb25tZW50IC0gUmV0dXJuIHRoZSBlbnZpcm9ubWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdGF0ZS4KKyAgLy8vICBUaGUgZW52aXJvbm1lbnQgaXMgdGhlIG1hcHBpbmcgZnJvbSBleHByZXNzaW9ucyB0byB2YWx1ZXMuCisgIGNvbnN0IEVudmlyb25tZW50JiBnZXRFbnZpcm9ubWVudCgpIGNvbnN0IHsgcmV0dXJuIEVudjsgfQorCisgIC8vLyBSZXR1cm4gdGhlIHN0b3JlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0YXRlLiAgVGhlIHN0b3JlCisgIC8vLyAgaXMgYSBtYXBwaW5nIGZyb20gbG9jYXRpb25zIHRvIHZhbHVlcy4KKyAgU3RvcmUgZ2V0U3RvcmUoKSBjb25zdCB7IHJldHVybiBzdG9yZTsgfQorCisKKyAgLy8vIGdldEdETSAtIFJldHVybiB0aGUgZ2VuZXJpYyBkYXRhIG1hcCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdGF0ZS4KKyAgR2VuZXJpY0RhdGFNYXAgZ2V0R0RNKCkgY29uc3QgeyByZXR1cm4gR0RNOyB9CisKKyAgdm9pZCBzZXRHRE0oR2VuZXJpY0RhdGFNYXAgZ2RtKSB7IEdETSA9IGdkbTsgfQorCisgIC8vLyBQcm9maWxlIC0gUHJvZmlsZSB0aGUgY29udGVudHMgb2YgYSBQcm9ncmFtU3RhdGUgb2JqZWN0IGZvciB1c2UgaW4gYQorICAvLy8gIEZvbGRpbmdTZXQuICBUd28gUHJvZ3JhbVN0YXRlIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZXF1YWwgaWYgdGhleQorICAvLy8gIGhhdmUgdGhlIHNhbWUgRW52aXJvbm1lbnQsIFN0b3JlLCBhbmQgR2VuZXJpY0RhdGFNYXAuCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQsIGNvbnN0IFByb2dyYW1TdGF0ZSAqVikgeworICAgIFYtPkVudi5Qcm9maWxlKElEKTsKKyAgICBJRC5BZGRQb2ludGVyKFYtPnN0b3JlKTsKKyAgICBWLT5HRE0uUHJvZmlsZShJRCk7CisgIH0KKworICAvLy8gUHJvZmlsZSAtIFVzZWQgdG8gcHJvZmlsZSB0aGUgY29udGVudHMgb2YgdGhpcyBvYmplY3QgZm9yIGluY2x1c2lvbgorICAvLy8gIGluIGEgRm9sZGluZ1NldC4KKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdCB7CisgICAgUHJvZmlsZShJRCwgdGhpcyk7CisgIH0KKworICBCYXNpY1ZhbHVlRmFjdG9yeSAmZ2V0QmFzaWNWYWxzKCkgY29uc3Q7CisgIFN5bWJvbE1hbmFnZXIgJmdldFN5bWJvbE1hbmFnZXIoKSBjb25zdDsKKworICAvLz09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT0vLworICAvLyBDb25zdHJhaW50cyBvbiB2YWx1ZXMuCisgIC8vPT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PS8vCisgIC8vCisgIC8vIEVhY2ggUHJvZ3JhbVN0YXRlIHJlY29yZHMgY29uc3RyYWludHMgb24gc3ltYm9saWMgdmFsdWVzLiAgVGhlc2UgY29uc3RyYWludHMKKyAgLy8gYXJlIG1hbmFnZWQgdXNpbmcgdGhlIENvbnN0cmFpbnRNYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCBhIFByb2dyYW1TdGF0ZU1hbmFnZXIuCisgIC8vIEFzIGNvbnN0cmFpbnRzIGdyYWR1YWxseSBhY2NydWUgb24gc3ltYm9saWMgdmFsdWVzLCBhZGRlZCBjb25zdHJhaW50cworICAvLyBtYXkgY29uZmxpY3QgYW5kIGluZGljYXRlIHRoYXQgYSBzdGF0ZSBpcyBpbmZlYXNpYmxlIChhcyBubyByZWFsIHZhbHVlcworICAvLyBjb3VsZCBzYXRpc2Z5IGFsbCB0aGUgY29uc3RyYWludHMpLiAgVGhpcyBpcyB0aGUgcHJpbmNpcGFsIG1lY2hhbmlzbQorICAvLyBmb3IgbW9kZWxpbmcgcGF0aC1zZW5zaXRpdml0eSBpbiBFeHByRW5naW5lL1Byb2dyYW1TdGF0ZS4KKyAgLy8KKyAgLy8gVmFyaW91cyAiYXNzdW1lIiBtZXRob2RzIGZvcm0gdGhlIGludGVyZmFjZSBmb3IgYWRkaW5nIGNvbnN0cmFpbnRzIHRvCisgIC8vIHN5bWJvbGljIHZhbHVlcy4gIEEgY2FsbCB0byAnYXNzdW1lJyBpbmRpY2F0ZXMgYW4gYXNzdW1wdGlvbiBiZWluZyBwbGFjZWQKKyAgLy8gb24gb25lIG9yIHN5bWJvbGljIHZhbHVlcy4gICdhc3N1bWUnIG1ldGhvZHMgdGFrZSB0aGUgZm9sbG93aW5nIGlucHV0czoKKyAgLy8KKyAgLy8gICgxKSBBIFByb2dyYW1TdGF0ZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHN0YXRlLgorICAvLworICAvLyAgKDIpIFRoZSBhc3N1bWVkIGNvbnN0cmFpbnQgKHdoaWNoIGlzIHNwZWNpZmljIHRvIGEgZ2l2ZW4gImFzc3VtZSIgbWV0aG9kKS4KKyAgLy8KKyAgLy8gICgzKSBBIGJpbmFyeSB2YWx1ZSAiQXNzdW1wdGlvbiIgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY29uc3RyYWludCBpcworICAvLyAgICAgIGFzc3VtZWQgdG8gYmUgdHJ1ZSBvciBmYWxzZS4KKyAgLy8KKyAgLy8gVGhlIG91dHB1dCBvZiAiYXNzdW1lKiIgaXMgYSBuZXcgUHJvZ3JhbVN0YXRlIG9iamVjdCB3aXRoIHRoZSBhZGRlZCBjb25zdHJhaW50cy4KKyAgLy8gSWYgbm8gbmV3IHN0YXRlIGlzIGZlYXNpYmxlLCBOVUxMIGlzIHJldHVybmVkLgorICAvLworCisgIC8vLyBBc3N1bWVzIHRoYXQgdGhlIHZhbHVlIG9mIFxwIGNvbmQgaXMgemVybyAoaWYgXHAgYXNzdW1wdGlvbiBpcyAiZmFsc2UiKQorICAvLy8gb3Igbm9uLXplcm8gKGlmIFxwIGFzc3VtcHRpb24gaXMgInRydWUiKS4KKyAgLy8vCisgIC8vLyBUaGlzIHJldHVybnMgYSBuZXcgc3RhdGUgd2l0aCB0aGUgYWRkZWQgY29uc3RyYWludCBvbiBccCBjb25kLgorICAvLy8gSWYgbm8gbmV3IHN0YXRlIGlzIGZlYXNpYmxlLCBOVUxMIGlzIHJldHVybmVkLgorICBQcm9ncmFtU3RhdGVSZWYgYXNzdW1lKERlZmluZWRPclVua25vd25TVmFsIGNvbmQsIGJvb2wgYXNzdW1wdGlvbikgY29uc3Q7CisKKyAgLy8vIEFzc3VtZXMgYm90aCAidHJ1ZSIgYW5kICJmYWxzZSIgZm9yIFxwIGNvbmQsIGFuZCByZXR1cm5zIGJvdGgKKyAgLy8vIGNvcnJlc3BvbmRpbmcgc3RhdGVzIChyZXNwZWN0aXZlbHkpLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBjYWxsaW5nIGFzc3VtZSgpIHR3aWNlLiBOb3RlIHRoYXQgb25lIChidXQgbm90CisgIC8vLyBib3RoKSBvZiB0aGUgcmV0dXJuZWQgc3RhdGVzIG1heSBiZSBOVUxMLgorICBzdGQ6OnBhaXI8UHJvZ3JhbVN0YXRlUmVmLCBQcm9ncmFtU3RhdGVSZWY+CisgIGFzc3VtZShEZWZpbmVkT3JVbmtub3duU1ZhbCBjb25kKSBjb25zdDsKKworICBQcm9ncmFtU3RhdGVSZWYgYXNzdW1lSW5Cb3VuZChEZWZpbmVkT3JVbmtub3duU1ZhbCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lZE9yVW5rbm93blNWYWwgdXBwZXJCb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFzc3VtcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgSW5kZXhUeXBlID0gUXVhbFR5cGUoKSkgY29uc3Q7CisKKyAgLy8vIEFzc3VtZXMgdGhhdCB0aGUgdmFsdWUgb2YgXHAgVmFsIGlzIGJvdW5kZWQgd2l0aCBbXHAgRnJvbTsgXHAgVG9dCisgIC8vLyAoaWYgXHAgYXNzdW1wdGlvbiBpcyAidHJ1ZSIpIG9yIGl0IGlzIGZ1bGx5IG91dCBvZiB0aGlzIHJhbmdlCisgIC8vLyAoaWYgXHAgYXNzdW1wdGlvbiBpcyAiZmFsc2UiKS4KKyAgLy8vCisgIC8vLyBUaGlzIHJldHVybnMgYSBuZXcgc3RhdGUgd2l0aCB0aGUgYWRkZWQgY29uc3RyYWludCBvbiBccCBjb25kLgorICAvLy8gSWYgbm8gbmV3IHN0YXRlIGlzIGZlYXNpYmxlLCBOVUxMIGlzIHJldHVybmVkLgorICBQcm9ncmFtU3RhdGVSZWYgYXNzdW1lSW5jbHVzaXZlUmFuZ2UoRGVmaW5lZE9yVW5rbm93blNWYWwgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBTSW50ICZGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBTSW50ICZUbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXNzdW1wdGlvbikgY29uc3Q7CisKKyAgLy8vIEFzc3VtZXMgZ2l2ZW4gcmFuZ2UgYm90aCAidHJ1ZSIgYW5kICJmYWxzZSIgZm9yIFxwIFZhbCwgYW5kIHJldHVybnMgYm90aAorICAvLy8gY29ycmVzcG9uZGluZyBzdGF0ZXMgKHJlc3BlY3RpdmVseSkuCisgIC8vLworICAvLy8gVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGNhbGxpbmcgYXNzdW1lKCkgdHdpY2UuIE5vdGUgdGhhdCBvbmUgKGJ1dCBub3QKKyAgLy8vIGJvdGgpIG9mIHRoZSByZXR1cm5lZCBzdGF0ZXMgbWF5IGJlIE5VTEwuCisgIHN0ZDo6cGFpcjxQcm9ncmFtU3RhdGVSZWYsIFByb2dyYW1TdGF0ZVJlZj4KKyAgYXNzdW1lSW5jbHVzaXZlUmFuZ2UoRGVmaW5lZE9yVW5rbm93blNWYWwgVmFsLCBjb25zdCBsbHZtOjpBUFNJbnQgJkZyb20sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCAmVG8pIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQ2hlY2sgaWYgdGhlIGdpdmVuIFNWYWwgaXMgbm90IGNvbnN0cmFpbmVkIHRvIHplcm8gYW5kIGlzIG5vdAorICAvLy8gICAgICAgIGEgemVybyBjb25zdGFudC4KKyAgQ29uZGl0aW9uVHJ1dGhWYWwgaXNOb25OdWxsKFNWYWwgVikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiB0aGUgZ2l2ZW4gU1ZhbCBpcyBjb25zdHJhaW5lZCB0byB6ZXJvIG9yIGlzIGEgemVybworICAvLy8gICAgICAgIGNvbnN0YW50LgorICBDb25kaXRpb25UcnV0aFZhbCBpc051bGwoU1ZhbCBWKSBjb25zdDsKKworICAvLy8gXHJldHVybiBXaGV0aGVyIHZhbHVlcyBccCBMaHMgYW5kIFxwIFJocyBhcmUgZXF1YWwuCisgIENvbmRpdGlvblRydXRoVmFsIGFyZUVxdWFsKFNWYWwgTGhzLCBTVmFsIFJocykgY29uc3Q7CisKKyAgLy8vIFV0aWxpdHkgbWV0aG9kIGZvciBnZXR0aW5nIHJlZ2lvbnMuCisgIGNvbnN0IFZhclJlZ2lvbiogZ2V0UmVnaW9uKGNvbnN0IFZhckRlY2wgKkQsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEMpIGNvbnN0OworCisgIC8vPT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PS8vCisgIC8vIEJpbmRpbmcgYW5kIHJldHJpZXZpbmcgdmFsdWVzIHRvL2Zyb20gdGhlIGVudmlyb25tZW50IGFuZCBzeW1ib2xpYyBzdG9yZS4KKyAgLy89PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09Ly8KKworICAvLy8gQ3JlYXRlIGEgbmV3IHN0YXRlIGJ5IGJpbmRpbmcgdGhlIHZhbHVlICdWJyB0byB0aGUgc3RhdGVtZW50ICdTJyBpbiB0aGUKKyAgLy8vIHN0YXRlJ3MgZW52aXJvbm1lbnQuCisgIFByb2dyYW1TdGF0ZVJlZiBCaW5kRXhwcihjb25zdCBTdG10ICpTLCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZhbCBWLCBib29sIEludmFsaWRhdGUgPSB0cnVlKSBjb25zdDsKKworICBQcm9ncmFtU3RhdGVSZWYgYmluZExvYyhMb2MgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNWYWwgViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5vdGlmeUNoYW5nZXMgPSB0cnVlKSBjb25zdDsKKworICBQcm9ncmFtU3RhdGVSZWYgYmluZExvYyhTVmFsIGxvY2F0aW9uLCBTVmFsIFYsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCkgY29uc3Q7CisKKyAgUHJvZ3JhbVN0YXRlUmVmIGJpbmREZWZhdWx0KFNWYWwgbG9jLCBTVmFsIFYsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCkgY29uc3Q7CisKKyAgUHJvZ3JhbVN0YXRlUmVmIGtpbGxCaW5kaW5nKExvYyBMVikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBzdGF0ZSB3aXRoIGJpbmRpbmdzIGZvciB0aGUgZ2l2ZW4gcmVnaW9ucworICAvLy8gIGNsZWFyZWQgZnJvbSB0aGUgc3RvcmUuCisgIC8vLworICAvLy8gT3B0aW9uYWxseSBpbnZhbGlkYXRlcyBnbG9iYWwgcmVnaW9ucyBhcyB3ZWxsLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSZWdpb25zIHRoZSBzZXQgb2YgcmVnaW9ucyB0byBiZSBpbnZhbGlkYXRlZC4KKyAgLy8vIFxwYXJhbSBFIHRoZSBleHByZXNzaW9uIHRoYXQgY2F1c2VkIHRoZSBpbnZhbGlkYXRpb24uCisgIC8vLyBccGFyYW0gQmxvY2tDb3VudCBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrIGhhcyBiZWVuCisgIC8vICAgICAgICAgdmlzaXRlZC4KKyAgLy8vIFxwYXJhbSBDYXVzZXNQb2ludGVyRXNjYXBlIHRoZSBmbGFnIGlzIHNldCB0byB0cnVlIHdoZW4KKyAgLy8vICAgICAgICB0aGUgaW52YWxpZGF0aW9uIGVudGFpbHMgZXNjYXBlIG9mIGEgc3ltYm9sIChyZXByZXNlbnRpbmcgYQorICAvLy8gICAgICAgIHBvaW50ZXIpLiBGb3IgZXhhbXBsZSwgZHVlIHRvIGl0IGJlaW5nIHBhc3NlZCBhcyBhbiBhcmd1bWVudCBpbiBhCisgIC8vLyAgICAgICAgY2FsbC4KKyAgLy8vIFxwYXJhbSBJUyB0aGUgc2V0IG9mIGludmFsaWRhdGVkIHN5bWJvbHMuCisgIC8vLyBccGFyYW0gQ2FsbCBpZiBub24tbnVsbCwgdGhlIGludmFsaWRhdGVkIHJlZ2lvbnMgcmVwcmVzZW50IHBhcmFtZXRlcnMgdG8KKyAgLy8vICAgICAgICB0aGUgY2FsbCBhbmQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZGlyZWN0bHkgaW52YWxpZGF0ZWQuCisgIC8vLyBccGFyYW0gSVRyYWl0cyBpbmZvcm1hdGlvbiBhYm91dCBzcGVjaWFsIGhhbmRsaW5nIGZvciBhIHBhcnRpY3VsYXIKKyAgLy8vICAgICAgICByZWdpb24vc3ltYm9sLgorICBQcm9ncmFtU3RhdGVSZWYKKyAgaW52YWxpZGF0ZVJlZ2lvbnMoQXJyYXlSZWY8Y29uc3QgTWVtUmVnaW9uICo+IFJlZ2lvbnMsIGNvbnN0IEV4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJsb2NrQ291bnQsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBDYXVzZXNQb2ludGVyRXNjYXBlLCBJbnZhbGlkYXRlZFN5bWJvbHMgKklTID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEV2ZW50ICpDYWxsID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgUmVnaW9uQW5kU3ltYm9sSW52YWxpZGF0aW9uVHJhaXRzICpJVHJhaXRzID0gbnVsbHB0cikgY29uc3Q7CisKKyAgUHJvZ3JhbVN0YXRlUmVmCisgIGludmFsaWRhdGVSZWdpb25zKEFycmF5UmVmPFNWYWw+IFJlZ2lvbnMsIGNvbnN0IEV4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJsb2NrQ291bnQsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBDYXVzZXNQb2ludGVyRXNjYXBlLCBJbnZhbGlkYXRlZFN5bWJvbHMgKklTID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEV2ZW50ICpDYWxsID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgUmVnaW9uQW5kU3ltYm9sSW52YWxpZGF0aW9uVHJhaXRzICpJVHJhaXRzID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIGVudGVyU3RhY2tGcmFtZSAtIFJldHVybnMgdGhlIHN0YXRlIGZvciBlbnRyeSB0byB0aGUgZ2l2ZW4gc3RhY2sgZnJhbWUsCisgIC8vLyAgcHJlc2VydmluZyB0aGUgY3VycmVudCBzdGF0ZS4KKyAgUHJvZ3JhbVN0YXRlUmVmIGVudGVyU3RhY2tGcmFtZShjb25zdCBDYWxsRXZlbnQgJkNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKkNhbGxlZUN0eCkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgbHZhbHVlIGZvciBhIHZhcmlhYmxlIHJlZmVyZW5jZS4KKyAgTG9jIGdldExWYWx1ZShjb25zdCBWYXJEZWNsICpELCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDKSBjb25zdDsKKworICBMb2MgZ2V0TFZhbHVlKGNvbnN0IENvbXBvdW5kTGl0ZXJhbEV4cHIgKmxpdGVyYWwsCisgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQykgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgbHZhbHVlIGZvciBhbiBpdmFyIHJlZmVyZW5jZS4KKyAgU1ZhbCBnZXRMVmFsdWUoY29uc3QgT2JqQ0l2YXJEZWNsICpkZWNsLCBTVmFsIGJhc2UpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIGx2YWx1ZSBmb3IgYSBmaWVsZCByZWZlcmVuY2UuCisgIFNWYWwgZ2V0TFZhbHVlKGNvbnN0IEZpZWxkRGVjbCAqZGVjbCwgU1ZhbCBCYXNlKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBsdmFsdWUgZm9yIGFuIGluZGlyZWN0IGZpZWxkIHJlZmVyZW5jZS4KKyAgU1ZhbCBnZXRMVmFsdWUoY29uc3QgSW5kaXJlY3RGaWVsZERlY2wgKmRlY2wsIFNWYWwgQmFzZSkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgbHZhbHVlIGZvciBhbiBhcnJheSBpbmRleC4KKyAgU1ZhbCBnZXRMVmFsdWUoUXVhbFR5cGUgRWxlbWVudFR5cGUsIFNWYWwgSWR4LCBTVmFsIEJhc2UpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBTVmFsIGJvdW5kIHRvIHRoZSBzdGF0ZW1lbnQgJ1MnIGluIHRoZSBzdGF0ZSdzIGVudmlyb25tZW50LgorICBTVmFsIGdldFNWYWwoY29uc3QgU3RtdCAqUywgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4KSBjb25zdDsKKworICBTVmFsIGdldFNWYWxBc1NjYWxhck9yTG9jKGNvbnN0IFN0bXQgKkV4LCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB2YWx1ZSBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAvLy8gUmV0dXJucyBVbmtub3duVmFsKCkgaWYgbm9uZSBmb3VuZC4KKyAgU1ZhbCBnZXRTVmFsKExvYyBMViwgUXVhbFR5cGUgVCA9IFF1YWxUeXBlKCkpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSAicmF3IiBTVmFsIGJvdW5kIHRvIExWIGJlZm9yZSBhbnkgdmFsdWUgc2ltcGxmaWNhdGlvbi4KKyAgU1ZhbCBnZXRSYXdTVmFsKExvYyBMViwgUXVhbFR5cGUgVD0gUXVhbFR5cGUoKSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHZhbHVlIGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCisgIC8vLyBSZXR1cm5zIFVua25vd25WYWwoKSBpZiBub25lIGZvdW5kLgorICBTVmFsIGdldFNWYWwoY29uc3QgTWVtUmVnaW9uKiBSLCBRdWFsVHlwZSBUID0gUXVhbFR5cGUoKSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHZhbHVlIGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24sIGFzc3VtaW5nCisgIC8vLyB0aGF0IHRoZSB2YWx1ZSBpcyBhIHNjYWxhciBpbnRlZ2VyIG9yIGFuIGVudW1lcmF0aW9uIG9yIGEgcG9pbnRlci4KKyAgLy8vIFJldHVybnMgVW5rbm93blZhbCgpIGlmIG5vbmUgZm91bmQgb3IgdGhlIHJlZ2lvbiBpcyBub3Qga25vd24gdG8gaG9sZAorICAvLy8gYSB2YWx1ZSBvZiBzdWNoIHR5cGUuCisgIFNWYWwgZ2V0U1ZhbEFzU2NhbGFyT3JMb2MoY29uc3QgTWVtUmVnaW9uICpSKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFZpc2l0cyB0aGUgc3ltYm9scyByZWFjaGFibGUgZnJvbSB0aGUgZ2l2ZW4gU1ZhbCB1c2luZyB0aGUgcHJvdmlkZWQKKyAgLy8vIFN5bWJvbFZpc2l0b3IuCisgIC8vLworICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIEFQSS4gQ29uc2lkZXIgdXNpbmcgU2NhblJlYWNoYWJsZVN5bWJvbHMgY2xhc3MKKyAgLy8vIGRpcmVjdGx5IHdoZW4gbWFraW5nIG11bHRpcGxlIHNjYW5zIG9uIHRoZSBzYW1lIHN0YXRlIHdpdGggdGhlIHNhbWUKKyAgLy8vIHZpc2l0b3IgdG8gYXZvaWQgcmVwZWF0ZWQgaW5pdGlhbGl6YXRpb24gY29zdC4KKyAgLy8vIFxzYSBTY2FuUmVhY2hhYmxlU3ltYm9scworICBib29sIHNjYW5SZWFjaGFibGVTeW1ib2xzKFNWYWwgdmFsLCBTeW1ib2xWaXNpdG9yJiB2aXNpdG9yKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFZpc2l0cyB0aGUgc3ltYm9scyByZWFjaGFibGUgZnJvbSB0aGUgU1ZhbHMgaW4gdGhlIGdpdmVuIHJhbmdlCisgIC8vLyB1c2luZyB0aGUgcHJvdmlkZWQgU3ltYm9sVmlzaXRvci4KKyAgYm9vbCBzY2FuUmVhY2hhYmxlU3ltYm9scyhjb25zdCBTVmFsICpJLCBjb25zdCBTVmFsICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFZpc2l0b3IgJnZpc2l0b3IpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVmlzaXRzIHRoZSBzeW1ib2xzIHJlYWNoYWJsZSBmcm9tIHRoZSByZWdpb25zIGluIHRoZSBnaXZlbgorICAvLy8gTWVtUmVnaW9ucyByYW5nZSB1c2luZyB0aGUgcHJvdmlkZWQgU3ltYm9sVmlzaXRvci4KKyAgYm9vbCBzY2FuUmVhY2hhYmxlU3ltYm9scyhjb25zdCBNZW1SZWdpb24gKiBjb25zdCAqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1SZWdpb24gKiBjb25zdCAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xWaXNpdG9yICZ2aXNpdG9yKSBjb25zdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0I+IENCIHNjYW5SZWFjaGFibGVTeW1ib2xzKFNWYWwgdmFsKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENCPiBDQiBzY2FuUmVhY2hhYmxlU3ltYm9scyhjb25zdCBTVmFsICpiZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1ZhbCAqZW5kKSBjb25zdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0I+IENCCisgIHNjYW5SZWFjaGFibGVTeW1ib2xzKGNvbnN0IE1lbVJlZ2lvbiAqIGNvbnN0ICpiZWcsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbVJlZ2lvbiAqIGNvbnN0ICplbmQpIGNvbnN0OworCisgIC8vLyBDcmVhdGUgYSBuZXcgc3RhdGUgaW4gd2hpY2ggdGhlIHN0YXRlbWVudCBpcyBtYXJrZWQgYXMgdGFpbnRlZC4KKyAgUHJvZ3JhbVN0YXRlUmVmIGFkZFRhaW50KGNvbnN0IFN0bXQgKlMsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWludFRhZ1R5cGUgS2luZCA9IFRhaW50VGFnR2VuZXJpYykgY29uc3Q7CisKKyAgLy8vIENyZWF0ZSBhIG5ldyBzdGF0ZSBpbiB3aGljaCB0aGUgdmFsdWUgaXMgbWFya2VkIGFzIHRhaW50ZWQuCisgIFByb2dyYW1TdGF0ZVJlZiBhZGRUYWludChTVmFsIFYsIFRhaW50VGFnVHlwZSBLaW5kID0gVGFpbnRUYWdHZW5lcmljKSBjb25zdDsKKworICAvLy8gQ3JlYXRlIGEgbmV3IHN0YXRlIGluIHdoaWNoIHRoZSBzeW1ib2wgaXMgbWFya2VkIGFzIHRhaW50ZWQuCisgIFByb2dyYW1TdGF0ZVJlZiBhZGRUYWludChTeW1ib2xSZWYgUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWludFRhZ1R5cGUgS2luZCA9IFRhaW50VGFnR2VuZXJpYykgY29uc3Q7CisKKyAgLy8vIENyZWF0ZSBhIG5ldyBzdGF0ZSBpbiB3aGljaCB0aGUgcmVnaW9uIHN5bWJvbCBpcyBtYXJrZWQgYXMgdGFpbnRlZC4KKyAgUHJvZ3JhbVN0YXRlUmVmIGFkZFRhaW50KGNvbnN0IE1lbVJlZ2lvbiAqUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWludFRhZ1R5cGUgS2luZCA9IFRhaW50VGFnR2VuZXJpYykgY29uc3Q7CisKKyAgLy8vIENyZWF0ZSBhIG5ldyBzdGF0ZSBpbiBhIHdoaWNoIGEgc3ViLXJlZ2lvbiBvZiBhIGdpdmVuIHN5bWJvbCBpcyB0YWludGVkLgorICAvLy8gVGhpcyBtaWdodCBiZSBuZWNlc3Nhcnkgd2hlbiByZWZlcnJpbmcgdG8gcmVnaW9ucyB0aGF0IGNhbiBub3QgaGF2ZSBhbgorICAvLy8gaW5kaXZpZHVhbCBzeW1ib2wsIGUuZy4gaWYgdGhleSBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlIGRlZmF1bHQgYmluZGluZyBvZgorICAvLy8gYSBMYXp5Q29tcG91bmRWYWwuCisgIFByb2dyYW1TdGF0ZVJlZiBhZGRQYXJ0aWFsVGFpbnQoU3ltYm9sUmVmIFBhcmVudFN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWJSZWdpb24gKlN1YlJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWludFRhZ1R5cGUgS2luZCA9IFRhaW50VGFnR2VuZXJpYykgY29uc3Q7CisKKyAgLy8vIENoZWNrIGlmIHRoZSBzdGF0ZW1lbnQgaXMgdGFpbnRlZCBpbiB0aGUgY3VycmVudCBzdGF0ZS4KKyAgYm9vbCBpc1RhaW50ZWQoY29uc3QgU3RtdCAqUywgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4LAorICAgICAgICAgICAgICAgICBUYWludFRhZ1R5cGUgS2luZCA9IFRhaW50VGFnR2VuZXJpYykgY29uc3Q7CisgIGJvb2wgaXNUYWludGVkKFNWYWwgViwgVGFpbnRUYWdUeXBlIEtpbmQgPSBUYWludFRhZ0dlbmVyaWMpIGNvbnN0OworICBib29sIGlzVGFpbnRlZChTeW1ib2xSZWYgU3ltLCBUYWludFRhZ1R5cGUgS2luZCA9IFRhaW50VGFnR2VuZXJpYykgY29uc3Q7CisgIGJvb2wgaXNUYWludGVkKGNvbnN0IE1lbVJlZ2lvbiAqUmVnLCBUYWludFRhZ1R5cGUgS2luZD1UYWludFRhZ0dlbmVyaWMpIGNvbnN0OworCisgIC8vPT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PS8vCisgIC8vIEFjY2Vzc2luZyB0aGUgR2VuZXJpYyBEYXRhIE1hcCAoR0RNKS4KKyAgLy89PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09Ly8KKworICB2b2lkICpjb25zdCogRmluZEdETSh2b2lkICpLKSBjb25zdDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBQcm9ncmFtU3RhdGVSZWYgYWRkKHR5cGVuYW1lIFByb2dyYW1TdGF0ZVRyYWl0PFQ+OjprZXlfdHlwZSBLKSBjb25zdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdHlwZW5hbWUgUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OmRhdGFfdHlwZQorICBnZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIFByb2dyYW1TdGF0ZVRyYWl0PFQ+OjpNYWtlRGF0YShGaW5kR0RNKFByb2dyYW1TdGF0ZVRyYWl0PFQ+OjpHRE1JbmRleCgpKSk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICB0eXBlbmFtZSBQcm9ncmFtU3RhdGVUcmFpdDxUPjo6bG9va3VwX3R5cGUKKyAgZ2V0KHR5cGVuYW1lIFByb2dyYW1TdGF0ZVRyYWl0PFQ+OjprZXlfdHlwZSBrZXkpIGNvbnN0IHsKKyAgICB2b2lkICpjb25zdCogZCA9IEZpbmRHRE0oUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OkdETUluZGV4KCkpOworICAgIHJldHVybiBQcm9ncmFtU3RhdGVUcmFpdDxUPjo6TG9va3VwKFByb2dyYW1TdGF0ZVRyYWl0PFQ+OjpNYWtlRGF0YShkKSwga2V5KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB0eXBlbmFtZSBQcm9ncmFtU3RhdGVUcmFpdDxUPjo6Y29udGV4dF90eXBlIGdldF9jb250ZXh0KCkgY29uc3Q7CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBQcm9ncmFtU3RhdGVSZWYgcmVtb3ZlKHR5cGVuYW1lIFByb2dyYW1TdGF0ZVRyYWl0PFQ+OjprZXlfdHlwZSBLKSBjb25zdDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBQcm9ncmFtU3RhdGVSZWYgcmVtb3ZlKHR5cGVuYW1lIFByb2dyYW1TdGF0ZVRyYWl0PFQ+OjprZXlfdHlwZSBLLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OmNvbnRleHRfdHlwZSBDKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFByb2dyYW1TdGF0ZVJlZiByZW1vdmUoKSBjb25zdDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBQcm9ncmFtU3RhdGVSZWYgc2V0KHR5cGVuYW1lIFByb2dyYW1TdGF0ZVRyYWl0PFQ+OjpkYXRhX3R5cGUgRCkgY29uc3Q7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgUHJvZ3JhbVN0YXRlUmVmIHNldCh0eXBlbmFtZSBQcm9ncmFtU3RhdGVUcmFpdDxUPjo6a2V5X3R5cGUgSywKKyAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFByb2dyYW1TdGF0ZVRyYWl0PFQ+Ojp2YWx1ZV90eXBlIEUpIGNvbnN0OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIFByb2dyYW1TdGF0ZVJlZiBzZXQodHlwZW5hbWUgUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OmtleV90eXBlIEssCisgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBQcm9ncmFtU3RhdGVUcmFpdDxUPjo6dmFsdWVfdHlwZSBFLAorICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OmNvbnRleHRfdHlwZSBDKSBjb25zdDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBib29sIGNvbnRhaW5zKHR5cGVuYW1lIFByb2dyYW1TdGF0ZVRyYWl0PFQ+OjprZXlfdHlwZSBrZXkpIGNvbnN0IHsKKyAgICB2b2lkICpjb25zdCogZCA9IEZpbmRHRE0oUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OkdETUluZGV4KCkpOworICAgIHJldHVybiBQcm9ncmFtU3RhdGVUcmFpdDxUPjo6Q29udGFpbnMoUHJvZ3JhbVN0YXRlVHJhaXQ8VD46Ok1ha2VEYXRhKGQpLCBrZXkpOworICB9CisKKyAgLy8gUHJldHR5LXByaW50aW5nLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPdXQsIGNvbnN0IGNoYXIgKm5sID0gIlxuIiwgY29uc3QgY2hhciAqc2VwID0gIiIsCisgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpDdXJyZW50TEMgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBwcmludERPVChyYXdfb3N0cmVhbSAmT3V0LAorICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqQ3VycmVudExDID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgcHJpbnRUYWludChyYXdfb3N0cmVhbSAmT3V0LCBjb25zdCBjaGFyICpubCA9ICJcbiIsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzZXAgPSAiIikgY29uc3Q7CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisgIHZvaWQgZHVtcFRhaW50KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGZyaWVuZCB2b2lkIFByb2dyYW1TdGF0ZVJldGFpbihjb25zdCBQcm9ncmFtU3RhdGUgKnN0YXRlKTsKKyAgZnJpZW5kIHZvaWQgUHJvZ3JhbVN0YXRlUmVsZWFzZShjb25zdCBQcm9ncmFtU3RhdGUgKnN0YXRlKTsKKworICAvLy8gXHNhIGludmFsaWRhdGVWYWx1ZXMoKQorICAvLy8gXHNhIGludmFsaWRhdGVSZWdpb25zKCkKKyAgUHJvZ3JhbVN0YXRlUmVmCisgIGludmFsaWRhdGVSZWdpb25zSW1wbChBcnJheVJlZjxTVmFsPiBWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpFLCB1bnNpZ25lZCBCbG9ja0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZXN1bHRzSW5TeW1ib2xFc2NhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkYXRlZFN5bWJvbHMgKklTLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVnaW9uQW5kU3ltYm9sSW52YWxpZGF0aW9uVHJhaXRzICpIVHJhaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEV2ZW50ICpDYWxsKSBjb25zdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQcm9ncmFtU3RhdGVNYW5hZ2VyIC0gRmFjdG9yeSBvYmplY3QgZm9yIFByb2dyYW1TdGF0ZXMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBQcm9ncmFtU3RhdGVNYW5hZ2VyIHsKKyAgZnJpZW5kIGNsYXNzIFByb2dyYW1TdGF0ZTsKKyAgZnJpZW5kIHZvaWQgUHJvZ3JhbVN0YXRlUmVsZWFzZShjb25zdCBQcm9ncmFtU3RhdGUgKnN0YXRlKTsKK3ByaXZhdGU6CisgIC8vLyBFbmcgLSBUaGUgU3ViRW5naW5lIHRoYXQgb3ducyB0aGlzIHN0YXRlIG1hbmFnZXIuCisgIFN1YkVuZ2luZSAqRW5nOyAvKiBDYW4gYmUgbnVsbC4gKi8KKworICBFbnZpcm9ubWVudE1hbmFnZXIgICAgICAgICAgICAgICAgICAgRW52TWdyOworICBzdGQ6OnVuaXF1ZV9wdHI8U3RvcmVNYW5hZ2VyPiAgICAgICAgU3RvcmVNZ3I7CisgIHN0ZDo6dW5pcXVlX3B0cjxDb25zdHJhaW50TWFuYWdlcj4gICBDb25zdHJhaW50TWdyOworCisgIFByb2dyYW1TdGF0ZTo6R2VuZXJpY0RhdGFNYXA6OkZhY3RvcnkgICAgIEdETUZhY3Rvcnk7CisgIFRhaW50ZWRTdWJSZWdpb25zOjpGYWN0b3J5IFRTUkZhY3Rvcnk7CisKKyAgdHlwZWRlZiBsbHZtOjpEZW5zZU1hcDx2b2lkKixzdGQ6OnBhaXI8dm9pZCosdm9pZCAoKikodm9pZCopPiA+IEdETUNvbnRleHRzVHk7CisgIEdETUNvbnRleHRzVHkgR0RNQ29udGV4dHM7CisKKyAgLy8vIFN0YXRlU2V0IC0gRm9sZGluZ1NldCBjb250YWluaW5nIGFsbCB0aGUgc3RhdGVzIGNyZWF0ZWQgZm9yIGFuYWx5emluZworICAvLy8gIGEgcGFydGljdWxhciBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCB0byB1bmlxdWUgc3RhdGVzLgorICBsbHZtOjpGb2xkaW5nU2V0PFByb2dyYW1TdGF0ZT4gU3RhdGVTZXQ7CisKKyAgLy8vIE9iamVjdCB0aGF0IG1hbmFnZXMgdGhlIGRhdGEgZm9yIGFsbCBjcmVhdGVkIFNWYWxzLgorICBzdGQ6OnVuaXF1ZV9wdHI8U1ZhbEJ1aWxkZXI+IHN2YWxCdWlsZGVyOworCisgIC8vLyBNYW5hZ2VzIG1lbW9yeSBmb3IgY3JlYXRlZCBDYWxsRXZlbnRzLgorICBzdGQ6OnVuaXF1ZV9wdHI8Q2FsbEV2ZW50TWFuYWdlcj4gQ2FsbEV2ZW50TWdyOworCisgIC8vLyBBIEJ1bXBQdHJBbGxvY2F0b3IgdG8gYWxsb2NhdGUgc3RhdGVzLgorICBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yICZBbGxvYzsKKworICAvLy8gQSB2ZWN0b3Igb2YgUHJvZ3JhbVN0YXRlcyB0aGF0IHdlIGNhbiByZXVzZS4KKyAgc3RkOjp2ZWN0b3I8UHJvZ3JhbVN0YXRlICo+IGZyZWVTdGF0ZXM7CisKK3B1YmxpYzoKKyAgUHJvZ3JhbVN0YXRlTWFuYWdlcihBU1RDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgIFN0b3JlTWFuYWdlckNyZWF0b3IgQ3JlYXRlU3RvcmVNYW5hZ2VyLAorICAgICAgICAgICAgICAgICBDb25zdHJhaW50TWFuYWdlckNyZWF0b3IgQ3JlYXRlQ29uc3RyYWludE1hbmFnZXIsCisgICAgICAgICAgICAgICAgIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3ImIGFsbG9jLAorICAgICAgICAgICAgICAgICBTdWJFbmdpbmUgKnN1YmVuZyk7CisKKyAgflByb2dyYW1TdGF0ZU1hbmFnZXIoKTsKKworICBQcm9ncmFtU3RhdGVSZWYgZ2V0SW5pdGlhbFN0YXRlKGNvbnN0IExvY2F0aW9uQ29udGV4dCAqSW5pdExvYyk7CisKKyAgQVNUQ29udGV4dCAmZ2V0Q29udGV4dCgpIHsgcmV0dXJuIHN2YWxCdWlsZGVyLT5nZXRDb250ZXh0KCk7IH0KKyAgY29uc3QgQVNUQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIHN2YWxCdWlsZGVyLT5nZXRDb250ZXh0KCk7IH0KKworICBCYXNpY1ZhbHVlRmFjdG9yeSAmZ2V0QmFzaWNWYWxzKCkgeworICAgIHJldHVybiBzdmFsQnVpbGRlci0+Z2V0QmFzaWNWYWx1ZUZhY3RvcnkoKTsKKyAgfQorCisgIFNWYWxCdWlsZGVyICZnZXRTVmFsQnVpbGRlcigpIHsKKyAgICByZXR1cm4gKnN2YWxCdWlsZGVyOworICB9CisKKyAgU3ltYm9sTWFuYWdlciAmZ2V0U3ltYm9sTWFuYWdlcigpIHsKKyAgICByZXR1cm4gc3ZhbEJ1aWxkZXItPmdldFN5bWJvbE1hbmFnZXIoKTsKKyAgfQorICBjb25zdCBTeW1ib2xNYW5hZ2VyICZnZXRTeW1ib2xNYW5hZ2VyKCkgY29uc3QgeworICAgIHJldHVybiBzdmFsQnVpbGRlci0+Z2V0U3ltYm9sTWFuYWdlcigpOworICB9CisKKyAgbGx2bTo6QnVtcFB0ckFsbG9jYXRvciYgZ2V0QWxsb2NhdG9yKCkgeyByZXR1cm4gQWxsb2M7IH0KKworICBNZW1SZWdpb25NYW5hZ2VyJiBnZXRSZWdpb25NYW5hZ2VyKCkgeworICAgIHJldHVybiBzdmFsQnVpbGRlci0+Z2V0UmVnaW9uTWFuYWdlcigpOworICB9CisgIGNvbnN0IE1lbVJlZ2lvbk1hbmFnZXImIGdldFJlZ2lvbk1hbmFnZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIHN2YWxCdWlsZGVyLT5nZXRSZWdpb25NYW5hZ2VyKCk7CisgIH0KKworICBDYWxsRXZlbnRNYW5hZ2VyICZnZXRDYWxsRXZlbnRNYW5hZ2VyKCkgeyByZXR1cm4gKkNhbGxFdmVudE1ncjsgfQorCisgIFN0b3JlTWFuYWdlciYgZ2V0U3RvcmVNYW5hZ2VyKCkgeyByZXR1cm4gKlN0b3JlTWdyOyB9CisgIENvbnN0cmFpbnRNYW5hZ2VyJiBnZXRDb25zdHJhaW50TWFuYWdlcigpIHsgcmV0dXJuICpDb25zdHJhaW50TWdyOyB9CisgIFN1YkVuZ2luZSogZ2V0T3duaW5nRW5naW5lKCkgeyByZXR1cm4gRW5nOyB9CisKKyAgUHJvZ3JhbVN0YXRlUmVmIHJlbW92ZURlYWRCaW5kaW5ncyhQcm9ncmFtU3RhdGVSZWYgU3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGFja0ZyYW1lQ29udGV4dCAqTEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFJlYXBlciYgU3ltUmVhcGVyKTsKKworcHVibGljOgorCisgIFNWYWwgQXJyYXlUb1BvaW50ZXIoTG9jIEFycmF5LCBRdWFsVHlwZSBFbGVtZW50VHkpIHsKKyAgICByZXR1cm4gU3RvcmVNZ3ItPkFycmF5VG9Qb2ludGVyKEFycmF5LCBFbGVtZW50VHkpOworICB9CisKKyAgLy8gTWV0aG9kcyB0aGF0IG1hbmlwdWxhdGUgdGhlIEdETS4KKyAgUHJvZ3JhbVN0YXRlUmVmIGFkZEdETShQcm9ncmFtU3RhdGVSZWYgU3QsIHZvaWQgKktleSwgdm9pZCAqRGF0YSk7CisgIFByb2dyYW1TdGF0ZVJlZiByZW1vdmVHRE0oUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLCB2b2lkICpLZXkpOworCisgIC8vIE1ldGhvZHMgdGhhdCBxdWVyeSAmIG1hbmlwdWxhdGUgdGhlIFN0b3JlLgorCisgIHZvaWQgaXRlckJpbmRpbmdzKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgU3RvcmVNYW5hZ2VyOjpCaW5kaW5nc0hhbmRsZXImIEYpIHsKKyAgICBTdG9yZU1nci0+aXRlckJpbmRpbmdzKHN0YXRlLT5nZXRTdG9yZSgpLCBGKTsKKyAgfQorCisgIFByb2dyYW1TdGF0ZVJlZiBnZXRQZXJzaXN0ZW50U3RhdGUoUHJvZ3JhbVN0YXRlICZJbXBsKTsKKyAgUHJvZ3JhbVN0YXRlUmVmIGdldFBlcnNpc3RlbnRTdGF0ZVdpdGhHRE0oUHJvZ3JhbVN0YXRlUmVmIEZyb21TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RhdGVSZWYgR0RNU3RhdGUpOworCisgIGJvb2wgaGF2ZUVxdWFsRW52aXJvbm1lbnRzKFByb2dyYW1TdGF0ZVJlZiBTMSwgUHJvZ3JhbVN0YXRlUmVmIFMyKSB7CisgICAgcmV0dXJuIFMxLT5FbnYgPT0gUzItPkVudjsKKyAgfQorCisgIGJvb2wgaGF2ZUVxdWFsU3RvcmVzKFByb2dyYW1TdGF0ZVJlZiBTMSwgUHJvZ3JhbVN0YXRlUmVmIFMyKSB7CisgICAgcmV0dXJuIFMxLT5zdG9yZSA9PSBTMi0+c3RvcmU7CisgIH0KKworICAvLz09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT0vLworICAvLyBHZW5lcmljIERhdGEgTWFwIG1ldGhvZHMuCisgIC8vPT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PS8vCisgIC8vCisgIC8vIFByb2dyYW1TdGF0ZU1hbmFnZXIgYW5kIFByb2dyYW1TdGF0ZSBzdXBwb3J0IGEgImdlbmVyaWMgZGF0YSBtYXAiIHRoYXQgYWxsb3dzCisgIC8vIGRpZmZlcmVudCBjbGllbnRzIG9mIFByb2dyYW1TdGF0ZSBvYmplY3RzIHRvIGVtYmVkIGFyYml0cmFyeSBkYXRhIHdpdGhpbiBhCisgIC8vIFByb2dyYW1TdGF0ZSBvYmplY3QuICBUaGUgZ2VuZXJpYyBkYXRhIG1hcCBpcyBlc3NlbnRpYWxseSBhbiBpbW11dGFibGUgbWFwCisgIC8vIGZyb20gYSAidGFnIiAodGhhdCBhY3RzIGFzIHRoZSAia2V5IiBmb3IgYSBjbGllbnQpIGFuZCBvcGFxdWUgdmFsdWVzLgorICAvLyBUYWdzL2tleXMgYW5kIHZhbHVlcyBhcmUgc2ltcGx5IHZvaWQqIHZhbHVlcy4gIFRoZSB0eXBpY2FsIHdheSB0aGF0IGNsaWVudHMKKyAgLy8gZ2VuZXJhdGUgdW5pcXVlIHRhZ3MgYXJlIGJ5IHRha2luZyB0aGUgYWRkcmVzcyBvZiBhIHN0YXRpYyB2YXJpYWJsZS4KKyAgLy8gQ2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgZGF0YSB2YWx1ZXMgcmVmZXJyZWQgdG8gYnkgYQorICAvLyB0aGUgZGF0YSBwb2ludGVyIGFyZSBpbW11dGFibGUgKGFuZCB0aHVzIGFyZSBlc3NlbnRpYWxseSBwdXJlbHkgZnVuY3Rpb25hbAorICAvLyBkYXRhKS4KKyAgLy8KKyAgLy8gVGhlIHRlbXBsYXRlZCBtZXRob2RzIGJlbG93IHVzZSB0aGUgUHJvZ3JhbVN0YXRlVHJhaXQ8VD4gY2xhc3MKKyAgLy8gdG8gcmVzb2x2ZSBrZXlzIGludG8gdGhlIEdETSBhbmQgdG8gcmV0dXJuIGRhdGEgdmFsdWVzIHRvIGNsaWVudHMuCisgIC8vCisKKyAgLy8gVHJhaXQgYmFzZWQgR0RNIGRpc3BhdGNoLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgUHJvZ3JhbVN0YXRlUmVmIHNldChQcm9ncmFtU3RhdGVSZWYgc3QsIHR5cGVuYW1lIFByb2dyYW1TdGF0ZVRyYWl0PFQ+OjpkYXRhX3R5cGUgRCkgeworICAgIHJldHVybiBhZGRHRE0oc3QsIFByb2dyYW1TdGF0ZVRyYWl0PFQ+OjpHRE1JbmRleCgpLAorICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0YXRlVHJhaXQ8VD46Ok1ha2VWb2lkUHRyKEQpKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIFByb2dyYW1TdGF0ZVJlZiBzZXQoUHJvZ3JhbVN0YXRlUmVmIHN0LAorICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OmtleV90eXBlIEssCisgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBQcm9ncmFtU3RhdGVUcmFpdDxUPjo6dmFsdWVfdHlwZSBWLAorICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OmNvbnRleHRfdHlwZSBDKSB7CisKKyAgICByZXR1cm4gYWRkR0RNKHN0LCBQcm9ncmFtU3RhdGVUcmFpdDxUPjo6R0RNSW5kZXgoKSwKKyAgICAgUHJvZ3JhbVN0YXRlVHJhaXQ8VD46Ok1ha2VWb2lkUHRyKFByb2dyYW1TdGF0ZVRyYWl0PFQ+OjpTZXQoc3QtPmdldDxUPigpLCBLLCBWLCBDKSkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFByb2dyYW1TdGF0ZVJlZiBhZGQoUHJvZ3JhbVN0YXRlUmVmIHN0LAorICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OmtleV90eXBlIEssCisgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBQcm9ncmFtU3RhdGVUcmFpdDxUPjo6Y29udGV4dF90eXBlIEMpIHsKKyAgICByZXR1cm4gYWRkR0RNKHN0LCBQcm9ncmFtU3RhdGVUcmFpdDxUPjo6R0RNSW5kZXgoKSwKKyAgICAgICAgUHJvZ3JhbVN0YXRlVHJhaXQ8VD46Ok1ha2VWb2lkUHRyKFByb2dyYW1TdGF0ZVRyYWl0PFQ+OjpBZGQoc3QtPmdldDxUPigpLCBLLCBDKSkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFByb2dyYW1TdGF0ZVJlZiByZW1vdmUoUHJvZ3JhbVN0YXRlUmVmIHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OmtleV90eXBlIEssCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBQcm9ncmFtU3RhdGVUcmFpdDxUPjo6Y29udGV4dF90eXBlIEMpIHsKKworICAgIHJldHVybiBhZGRHRE0oc3QsIFByb2dyYW1TdGF0ZVRyYWl0PFQ+OjpHRE1JbmRleCgpLAorICAgICBQcm9ncmFtU3RhdGVUcmFpdDxUPjo6TWFrZVZvaWRQdHIoUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OlJlbW92ZShzdC0+Z2V0PFQ+KCksIEssIEMpKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgUHJvZ3JhbVN0YXRlUmVmIHJlbW92ZShQcm9ncmFtU3RhdGVSZWYgc3QpIHsKKyAgICByZXR1cm4gcmVtb3ZlR0RNKHN0LCBQcm9ncmFtU3RhdGVUcmFpdDxUPjo6R0RNSW5kZXgoKSk7CisgIH0KKworICB2b2lkICpGaW5kR0RNQ29udGV4dCh2b2lkICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKCpDcmVhdGVDb250ZXh0KShsbHZtOjpCdW1wUHRyQWxsb2NhdG9yJiksCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICgqRGVsZXRlQ29udGV4dCkodm9pZCopKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdHlwZW5hbWUgUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OmNvbnRleHRfdHlwZSBnZXRfY29udGV4dCgpIHsKKyAgICB2b2lkICpwID0gRmluZEdETUNvbnRleHQoUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OkdETUluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdGF0ZVRyYWl0PFQ+OjpDcmVhdGVDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RhdGVUcmFpdDxUPjo6RGVsZXRlQ29udGV4dCk7CisKKyAgICByZXR1cm4gUHJvZ3JhbVN0YXRlVHJhaXQ8VD46Ok1ha2VDb250ZXh0KHApOworICB9CisKKyAgdm9pZCBFbmRQYXRoKFByb2dyYW1TdGF0ZVJlZiBTdCkgeworICAgIENvbnN0cmFpbnRNZ3ItPkVuZFBhdGgoU3QpOworICB9Cit9OworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBPdXQtb2YtbGluZSBtZXRob2QgZGVmaW5pdGlvbnMgZm9yIFByb2dyYW1TdGF0ZS4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2lubGluZSBDb25zdHJhaW50TWFuYWdlciAmUHJvZ3JhbVN0YXRlOjpnZXRDb25zdHJhaW50TWFuYWdlcigpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRlTWdyLT5nZXRDb25zdHJhaW50TWFuYWdlcigpOworfQorCitpbmxpbmUgY29uc3QgVmFyUmVnaW9uKiBQcm9ncmFtU3RhdGU6OmdldFJlZ2lvbihjb25zdCBWYXJEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQykgY29uc3QKK3sKKyAgcmV0dXJuIGdldFN0YXRlTWFuYWdlcigpLmdldFJlZ2lvbk1hbmFnZXIoKS5nZXRWYXJSZWdpb24oRCwgTEMpOworfQorCitpbmxpbmUgUHJvZ3JhbVN0YXRlUmVmIFByb2dyYW1TdGF0ZTo6YXNzdW1lKERlZmluZWRPclVua25vd25TVmFsIENvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQXNzdW1wdGlvbikgY29uc3QgeworICBpZiAoQ29uZC5pc1Vua25vd24oKSkKKyAgICByZXR1cm4gdGhpczsKKworICByZXR1cm4gZ2V0U3RhdGVNYW5hZ2VyKCkuQ29uc3RyYWludE1ncgorICAgICAgLT5hc3N1bWUodGhpcywgQ29uZC5jYXN0QXM8RGVmaW5lZFNWYWw+KCksIEFzc3VtcHRpb24pOworfQorCitpbmxpbmUgc3RkOjpwYWlyPFByb2dyYW1TdGF0ZVJlZiAsIFByb2dyYW1TdGF0ZVJlZiA+CitQcm9ncmFtU3RhdGU6OmFzc3VtZShEZWZpbmVkT3JVbmtub3duU1ZhbCBDb25kKSBjb25zdCB7CisgIGlmIChDb25kLmlzVW5rbm93bigpKQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih0aGlzLCB0aGlzKTsKKworICByZXR1cm4gZ2V0U3RhdGVNYW5hZ2VyKCkuQ29uc3RyYWludE1ncgorICAgICAgLT5hc3N1bWVEdWFsKHRoaXMsIENvbmQuY2FzdEFzPERlZmluZWRTVmFsPigpKTsKK30KKworaW5saW5lIFByb2dyYW1TdGF0ZVJlZiBQcm9ncmFtU3RhdGU6OmFzc3VtZUluY2x1c2l2ZVJhbmdlKAorICAgIERlZmluZWRPclVua25vd25TVmFsIFZhbCwgY29uc3QgbGx2bTo6QVBTSW50ICZGcm9tLCBjb25zdCBsbHZtOjpBUFNJbnQgJlRvLAorICAgIGJvb2wgQXNzdW1wdGlvbikgY29uc3QgeworICBpZiAoVmFsLmlzVW5rbm93bigpKQorICAgIHJldHVybiB0aGlzOworCisgIGFzc2VydChWYWwuZ2V0QXM8Tm9uTG9jPigpICYmICJPbmx5IE5vbkxvY3MgYXJlIHN1cHBvcnRlZCEiKTsKKworICByZXR1cm4gZ2V0U3RhdGVNYW5hZ2VyKCkuQ29uc3RyYWludE1nci0+YXNzdW1lSW5jbHVzaXZlUmFuZ2UoCisgICAgICB0aGlzLCBWYWwuY2FzdEFzPE5vbkxvYz4oKSwgRnJvbSwgVG8sIEFzc3VtcHRpb24pOworfQorCitpbmxpbmUgc3RkOjpwYWlyPFByb2dyYW1TdGF0ZVJlZiwgUHJvZ3JhbVN0YXRlUmVmPgorUHJvZ3JhbVN0YXRlOjphc3N1bWVJbmNsdXNpdmVSYW5nZShEZWZpbmVkT3JVbmtub3duU1ZhbCBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCAmRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBTSW50ICZUbykgY29uc3QgeworICBpZiAoVmFsLmlzVW5rbm93bigpKQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih0aGlzLCB0aGlzKTsKKworICBhc3NlcnQoVmFsLmdldEFzPE5vbkxvYz4oKSAmJiAiT25seSBOb25Mb2NzIGFyZSBzdXBwb3J0ZWQhIik7CisKKyAgcmV0dXJuIGdldFN0YXRlTWFuYWdlcigpLkNvbnN0cmFpbnRNZ3ItPmFzc3VtZUluY2x1c2l2ZVJhbmdlRHVhbCgKKyAgICAgIHRoaXMsIFZhbC5jYXN0QXM8Tm9uTG9jPigpLCBGcm9tLCBUbyk7Cit9CisKK2lubGluZSBQcm9ncmFtU3RhdGVSZWYgUHJvZ3JhbVN0YXRlOjpiaW5kTG9jKFNWYWwgTFYsIFNWYWwgViwgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4KSBjb25zdCB7CisgIGlmIChPcHRpb25hbDxMb2M+IEwgPSBMVi5nZXRBczxMb2M+KCkpCisgICAgcmV0dXJuIGJpbmRMb2MoKkwsIFYsIExDdHgpOworICByZXR1cm4gdGhpczsKK30KKworaW5saW5lIExvYyBQcm9ncmFtU3RhdGU6OmdldExWYWx1ZShjb25zdCBWYXJEZWNsICpWRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDKSBjb25zdCB7CisgIHJldHVybiBnZXRTdGF0ZU1hbmFnZXIoKS5TdG9yZU1nci0+Z2V0TFZhbHVlVmFyKFZELCBMQyk7Cit9CisKK2lubGluZSBMb2MgUHJvZ3JhbVN0YXRlOjpnZXRMVmFsdWUoY29uc3QgQ29tcG91bmRMaXRlcmFsRXhwciAqbGl0ZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDKSBjb25zdCB7CisgIHJldHVybiBnZXRTdGF0ZU1hbmFnZXIoKS5TdG9yZU1nci0+Z2V0TFZhbHVlQ29tcG91bmRMaXRlcmFsKGxpdGVyYWwsIExDKTsKK30KKworaW5saW5lIFNWYWwgUHJvZ3JhbVN0YXRlOjpnZXRMVmFsdWUoY29uc3QgT2JqQ0l2YXJEZWNsICpELCBTVmFsIEJhc2UpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFN0YXRlTWFuYWdlcigpLlN0b3JlTWdyLT5nZXRMVmFsdWVJdmFyKEQsIEJhc2UpOworfQorCitpbmxpbmUgU1ZhbCBQcm9ncmFtU3RhdGU6OmdldExWYWx1ZShjb25zdCBGaWVsZERlY2wgKkQsIFNWYWwgQmFzZSkgY29uc3QgeworICByZXR1cm4gZ2V0U3RhdGVNYW5hZ2VyKCkuU3RvcmVNZ3ItPmdldExWYWx1ZUZpZWxkKEQsIEJhc2UpOworfQorCitpbmxpbmUgU1ZhbCBQcm9ncmFtU3RhdGU6OmdldExWYWx1ZShjb25zdCBJbmRpcmVjdEZpZWxkRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWYWwgQmFzZSkgY29uc3QgeworICBTdG9yZU1hbmFnZXIgJlNNID0gKmdldFN0YXRlTWFuYWdlcigpLlN0b3JlTWdyOworICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBELT5jaGFpbigpKSB7CisgICAgQmFzZSA9IFNNLmdldExWYWx1ZUZpZWxkKGNhc3Q8RmllbGREZWNsPihJKSwgQmFzZSk7CisgIH0KKworICByZXR1cm4gQmFzZTsKK30KKworaW5saW5lIFNWYWwgUHJvZ3JhbVN0YXRlOjpnZXRMVmFsdWUoUXVhbFR5cGUgRWxlbWVudFR5cGUsIFNWYWwgSWR4LCBTVmFsIEJhc2UpIGNvbnN0eworICBpZiAoT3B0aW9uYWw8Tm9uTG9jPiBOID0gSWR4LmdldEFzPE5vbkxvYz4oKSkKKyAgICByZXR1cm4gZ2V0U3RhdGVNYW5hZ2VyKCkuU3RvcmVNZ3ItPmdldExWYWx1ZUVsZW1lbnQoRWxlbWVudFR5cGUsICpOLCBCYXNlKTsKKyAgcmV0dXJuIFVua25vd25WYWwoKTsKK30KKworaW5saW5lIFNWYWwgUHJvZ3JhbVN0YXRlOjpnZXRTVmFsKGNvbnN0IFN0bXQgKkV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCkgY29uc3R7CisgIHJldHVybiBFbnYuZ2V0U1ZhbChFbnZpcm9ubWVudEVudHJ5KEV4LCBMQ3R4KSwKKyAgICAgICAgICAgICAgICAgICAgICpnZXRTdGF0ZU1hbmFnZXIoKS5zdmFsQnVpbGRlcik7Cit9CisKK2lubGluZSBTVmFsCitQcm9ncmFtU3RhdGU6OmdldFNWYWxBc1NjYWxhck9yTG9jKGNvbnN0IFN0bXQgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCkgY29uc3QgeworICBpZiAoY29uc3QgRXhwciAqRXggPSBkeW5fY2FzdDxFeHByPihTKSkgeworICAgIFF1YWxUeXBlIFQgPSBFeC0+Z2V0VHlwZSgpOworICAgIGlmIChFeC0+aXNHTFZhbHVlKCkgfHwgTG9jOjppc0xvY1R5cGUoVCkgfHwKKyAgICAgICAgVC0+aXNJbnRlZ3JhbE9yRW51bWVyYXRpb25UeXBlKCkpCisgICAgICByZXR1cm4gZ2V0U1ZhbChTLCBMQ3R4KTsKKyAgfQorCisgIHJldHVybiBVbmtub3duVmFsKCk7Cit9CisKK2lubGluZSBTVmFsIFByb2dyYW1TdGF0ZTo6Z2V0UmF3U1ZhbChMb2MgTFYsIFF1YWxUeXBlIFQpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFN0YXRlTWFuYWdlcigpLlN0b3JlTWdyLT5nZXRCaW5kaW5nKGdldFN0b3JlKCksIExWLCBUKTsKK30KKworaW5saW5lIFNWYWwgUHJvZ3JhbVN0YXRlOjpnZXRTVmFsKGNvbnN0IE1lbVJlZ2lvbiogUiwgUXVhbFR5cGUgVCkgY29uc3QgeworICByZXR1cm4gZ2V0U3RhdGVNYW5hZ2VyKCkuU3RvcmVNZ3ItPmdldEJpbmRpbmcoZ2V0U3RvcmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYzo6TWVtUmVnaW9uVmFsKFIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCk7Cit9CisKK2lubGluZSBCYXNpY1ZhbHVlRmFjdG9yeSAmUHJvZ3JhbVN0YXRlOjpnZXRCYXNpY1ZhbHMoKSBjb25zdCB7CisgIHJldHVybiBnZXRTdGF0ZU1hbmFnZXIoKS5nZXRCYXNpY1ZhbHMoKTsKK30KKworaW5saW5lIFN5bWJvbE1hbmFnZXIgJlByb2dyYW1TdGF0ZTo6Z2V0U3ltYm9sTWFuYWdlcigpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFN0YXRlTWFuYWdlcigpLmdldFN5bWJvbE1hbmFnZXIoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1Byb2dyYW1TdGF0ZVJlZiBQcm9ncmFtU3RhdGU6OmFkZCh0eXBlbmFtZSBQcm9ncmFtU3RhdGVUcmFpdDxUPjo6a2V5X3R5cGUgSykgY29uc3QgeworICByZXR1cm4gZ2V0U3RhdGVNYW5hZ2VyKCkuYWRkPFQ+KHRoaXMsIEssIGdldF9jb250ZXh0PFQ+KCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIFByb2dyYW1TdGF0ZVRyYWl0PFQ+Ojpjb250ZXh0X3R5cGUgUHJvZ3JhbVN0YXRlOjpnZXRfY29udGV4dCgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFN0YXRlTWFuYWdlcigpLmdldF9jb250ZXh0PFQ+KCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitQcm9ncmFtU3RhdGVSZWYgUHJvZ3JhbVN0YXRlOjpyZW1vdmUodHlwZW5hbWUgUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OmtleV90eXBlIEspIGNvbnN0IHsKKyAgcmV0dXJuIGdldFN0YXRlTWFuYWdlcigpLnJlbW92ZTxUPih0aGlzLCBLLCBnZXRfY29udGV4dDxUPigpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1Byb2dyYW1TdGF0ZVJlZiBQcm9ncmFtU3RhdGU6OnJlbW92ZSh0eXBlbmFtZSBQcm9ncmFtU3RhdGVUcmFpdDxUPjo6a2V5X3R5cGUgSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBQcm9ncmFtU3RhdGVUcmFpdDxUPjo6Y29udGV4dF90eXBlIEMpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFN0YXRlTWFuYWdlcigpLnJlbW92ZTxUPih0aGlzLCBLLCBDKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitQcm9ncmFtU3RhdGVSZWYgUHJvZ3JhbVN0YXRlOjpyZW1vdmUoKSBjb25zdCB7CisgIHJldHVybiBnZXRTdGF0ZU1hbmFnZXIoKS5yZW1vdmU8VD4odGhpcyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitQcm9ncmFtU3RhdGVSZWYgUHJvZ3JhbVN0YXRlOjpzZXQodHlwZW5hbWUgUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OmRhdGFfdHlwZSBEKSBjb25zdCB7CisgIHJldHVybiBnZXRTdGF0ZU1hbmFnZXIoKS5zZXQ8VD4odGhpcywgRCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitQcm9ncmFtU3RhdGVSZWYgUHJvZ3JhbVN0YXRlOjpzZXQodHlwZW5hbWUgUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OmtleV90eXBlIEssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OnZhbHVlX3R5cGUgRSkgY29uc3QgeworICByZXR1cm4gZ2V0U3RhdGVNYW5hZ2VyKCkuc2V0PFQ+KHRoaXMsIEssIEUsIGdldF9jb250ZXh0PFQ+KCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorUHJvZ3JhbVN0YXRlUmVmIFByb2dyYW1TdGF0ZTo6c2V0KHR5cGVuYW1lIFByb2dyYW1TdGF0ZVRyYWl0PFQ+OjprZXlfdHlwZSBLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFByb2dyYW1TdGF0ZVRyYWl0PFQ+Ojp2YWx1ZV90eXBlIEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgUHJvZ3JhbVN0YXRlVHJhaXQ8VD46OmNvbnRleHRfdHlwZSBDKSBjb25zdCB7CisgIHJldHVybiBnZXRTdGF0ZU1hbmFnZXIoKS5zZXQ8VD4odGhpcywgSywgRSwgQyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDQj4KK0NCIFByb2dyYW1TdGF0ZTo6c2NhblJlYWNoYWJsZVN5bWJvbHMoU1ZhbCB2YWwpIGNvbnN0IHsKKyAgQ0IgY2IodGhpcyk7CisgIHNjYW5SZWFjaGFibGVTeW1ib2xzKHZhbCwgY2IpOworICByZXR1cm4gY2I7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDQj4KK0NCIFByb2dyYW1TdGF0ZTo6c2NhblJlYWNoYWJsZVN5bWJvbHMoY29uc3QgU1ZhbCAqYmVnLCBjb25zdCBTVmFsICplbmQpIGNvbnN0IHsKKyAgQ0IgY2IodGhpcyk7CisgIHNjYW5SZWFjaGFibGVTeW1ib2xzKGJlZywgZW5kLCBjYik7CisgIHJldHVybiBjYjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIENCPgorQ0IgUHJvZ3JhbVN0YXRlOjpzY2FuUmVhY2hhYmxlU3ltYm9scyhjb25zdCBNZW1SZWdpb24gKiBjb25zdCAqYmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtUmVnaW9uICogY29uc3QgKmVuZCkgY29uc3QgeworICBDQiBjYih0aGlzKTsKKyAgc2NhblJlYWNoYWJsZVN5bWJvbHMoYmVnLCBlbmQsIGNiKTsKKyAgcmV0dXJuIGNiOworfQorCisvLy8gXGNsYXNzIFNjYW5SZWFjaGFibGVTeW1ib2xzCisvLy8gQSB1dGlsaXR5IGNsYXNzIHRoYXQgdmlzaXRzIHRoZSByZWFjaGFibGUgc3ltYm9scyB1c2luZyBhIGN1c3RvbQorLy8vIFN5bWJvbFZpc2l0b3IuIFRlcm1pbmF0ZXMgcmVjdXJzaXZlIHRyYXZlcnNhbCB3aGVuIHRoZSB2aXNpdG9yIGZ1bmN0aW9uCisvLy8gcmV0dXJucyBmYWxzZS4KK2NsYXNzIFNjYW5SZWFjaGFibGVTeW1ib2xzIHsKKyAgdHlwZWRlZiBsbHZtOjpEZW5zZVNldDxjb25zdCB2b2lkKj4gVmlzaXRlZEl0ZW1zOworCisgIFZpc2l0ZWRJdGVtcyB2aXNpdGVkOworICBQcm9ncmFtU3RhdGVSZWYgc3RhdGU7CisgIFN5bWJvbFZpc2l0b3IgJnZpc2l0b3I7CitwdWJsaWM6CisgIFNjYW5SZWFjaGFibGVTeW1ib2xzKFByb2dyYW1TdGF0ZVJlZiBzdCwgU3ltYm9sVmlzaXRvciAmdikKKyAgICAgIDogc3RhdGUoc3RkOjptb3ZlKHN0KSksIHZpc2l0b3Iodikge30KKworICBib29sIHNjYW4obm9ubG9jOjpMYXp5Q29tcG91bmRWYWwgdmFsKTsKKyAgYm9vbCBzY2FuKG5vbmxvYzo6Q29tcG91bmRWYWwgdmFsKTsKKyAgYm9vbCBzY2FuKFNWYWwgdmFsKTsKKyAgYm9vbCBzY2FuKGNvbnN0IE1lbVJlZ2lvbiAqUik7CisgIGJvb2wgc2Nhbihjb25zdCBTeW1FeHByICpzeW0pOworfTsKKworfSAvLyBlbmQgZW50byBuYW1lc3BhY2UKKworfSAvLyBlbmQgY2xhbmcgbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1Byb2dyYW1TdGF0ZVRyYWl0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvUHJvZ3JhbVN0YXRlVHJhaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTU1YjI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1Byb2dyYW1TdGF0ZVRyYWl0LmgKQEAgLTAsMCArMSwyNDMgQEAKKy8vUHJvZ3JhbVN0YXRlVHJhaXQuaCAtIFBhcnRpYWwgaW1wbGVtZW50YXRpb25zIG9mIFByb2dyYW1TdGF0ZVRyYWl0IC0qLSBDKysgLSotCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHBhcnRpYWwgaW1wbGVtZW50YXRpb25zIG9mIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyBvZgorLy8gIHRoZSBjbGFzcyBQcm9ncmFtU3RhdGVUcmFpdDw+LiAgUHJvZ3JhbVN0YXRlVHJhaXQ8PiBpcyB1c2VkIGJ5IFByb2dyYW1TdGF0ZQorLy8gIHRvIGltcGxlbWVudCBzZXQvZ2V0IG1ldGhvZHMgZm9yIG1hbmlwdWxhdGluZyBhIFByb2dyYW1TdGF0ZSdzCisvLyAgZ2VuZXJpYyBkYXRhIG1hcC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX1BST0dSQU1TVEFURVRSQUlUX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfUFJPR1JBTVNUQVRFVFJBSVRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvSW1tdXRhYmxlTGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ltbXV0YWJsZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ltbXV0YWJsZVNldC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGVudG8geworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgUHJvZ3JhbVN0YXRlUGFydGlhbFRyYWl0OworCisgIC8vLyBEZWNsYXJlcyBhIHByb2dyYW0gc3RhdGUgdHJhaXQgZm9yIHR5cGUgXHAgVHlwZSBjYWxsZWQgXHAgTmFtZSwgYW5kCisgIC8vLyBpbnRyb2R1Y2UgYSB0eXBlIG5hbWVkIFxjIE5hbWVUeS4KKyAgLy8vIFRoZSBtYWNybyBzaG91bGQgbm90IGJlIHVzZWQgaW5zaWRlIG5hbWVzcGFjZXMsIG9yIGZvciB0cmFpdHMgdGhhdCBtdXN0CisgIC8vLyBiZSBhY2Nlc3NpYmxlIGZyb20gbW9yZSB0aGFuIG9uZSB0cmFuc2xhdGlvbiB1bml0LgorICAjZGVmaW5lIFJFR0lTVEVSX1RSQUlUX1dJVEhfUFJPR1JBTVNUQVRFKE5hbWUsIFR5cGUpIFwKKyAgICBuYW1lc3BhY2UgeyBcCisgICAgICBjbGFzcyBOYW1lIHt9OyBcCisgICAgICB1c2luZyBOYW1lICMjIFR5ID0gVHlwZTsgXAorICAgIH0gXAorICAgIG5hbWVzcGFjZSBjbGFuZyB7IFwKKyAgICBuYW1lc3BhY2UgZW50byB7IFwKKyAgICAgIHRlbXBsYXRlIDw+IFwKKyAgICAgIHN0cnVjdCBQcm9ncmFtU3RhdGVUcmFpdDxOYW1lPiBcCisgICAgICAgIDogcHVibGljIFByb2dyYW1TdGF0ZVBhcnRpYWxUcmFpdDxOYW1lICMjIFR5PiB7IFwKKyAgICAgICAgc3RhdGljIHZvaWQgKkdETUluZGV4KCkgeyBzdGF0aWMgaW50IEluZGV4OyByZXR1cm4gJkluZGV4OyB9IFwKKyAgICAgIH07IFwKKyAgICB9IFwKKyAgICB9CisKKyAgLy8gUGFydGlhbC1zcGVjaWFsaXphdGlvbiBmb3IgSW1tdXRhYmxlTWFwLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBEYXRhLCB0eXBlbmFtZSBJbmZvPgorICBzdHJ1Y3QgUHJvZ3JhbVN0YXRlUGFydGlhbFRyYWl0PGxsdm06OkltbXV0YWJsZU1hcDxLZXksIERhdGEsIEluZm8+PiB7CisgICAgdXNpbmcgZGF0YV90eXBlID0gbGx2bTo6SW1tdXRhYmxlTWFwPEtleSwgRGF0YSwgSW5mbz47CisgICAgdXNpbmcgY29udGV4dF90eXBlID0gdHlwZW5hbWUgZGF0YV90eXBlOjpGYWN0b3J5ICY7CisgICAgdXNpbmcga2V5X3R5cGUgPSBLZXk7CisgICAgdXNpbmcgdmFsdWVfdHlwZSA9IERhdGE7CisgICAgdXNpbmcgbG9va3VwX3R5cGUgPSBjb25zdCB2YWx1ZV90eXBlICo7CisKKyAgICBzdGF0aWMgZGF0YV90eXBlIE1ha2VEYXRhKHZvaWQgKmNvbnN0ICpwKSB7CisgICAgICByZXR1cm4gcCA/IGRhdGFfdHlwZSgodHlwZW5hbWUgZGF0YV90eXBlOjpUcmVlVHkgKikgKnApCisgICAgICAgICAgICAgICA6IGRhdGFfdHlwZShudWxscHRyKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCAqTWFrZVZvaWRQdHIoZGF0YV90eXBlIEIpIHsKKyAgICAgIHJldHVybiBCLmdldFJvb3QoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgbG9va3VwX3R5cGUgTG9va3VwKGRhdGFfdHlwZSBCLCBrZXlfdHlwZSBLKSB7CisgICAgICByZXR1cm4gQi5sb29rdXAoSyk7CisgICAgfQorCisgICAgc3RhdGljIGRhdGFfdHlwZSBTZXQoZGF0YV90eXBlIEIsIGtleV90eXBlIEssIHZhbHVlX3R5cGUgRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X3R5cGUgRikgeworICAgICAgcmV0dXJuIEYuYWRkKEIsIEssIEUpOworICAgIH0KKworICAgIHN0YXRpYyBkYXRhX3R5cGUgUmVtb3ZlKGRhdGFfdHlwZSBCLCBrZXlfdHlwZSBLLCBjb250ZXh0X3R5cGUgRikgeworICAgICAgcmV0dXJuIEYucmVtb3ZlKEIsIEspOworICAgIH0KKworICAgIHN0YXRpYyBib29sIENvbnRhaW5zKGRhdGFfdHlwZSBCLCBrZXlfdHlwZSBLKSB7CisgICAgICByZXR1cm4gQi5jb250YWlucyhLKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29udGV4dF90eXBlIE1ha2VDb250ZXh0KHZvaWQgKnApIHsKKyAgICAgIHJldHVybiAqKCh0eXBlbmFtZSBkYXRhX3R5cGU6OkZhY3RvcnkgKikgcCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgKkNyZWF0ZUNvbnRleHQobGx2bTo6QnVtcFB0ckFsbG9jYXRvciYgQWxsb2MpIHsKKyAgICAgIHJldHVybiBuZXcgdHlwZW5hbWUgZGF0YV90eXBlOjpGYWN0b3J5KEFsbG9jKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBEZWxldGVDb250ZXh0KHZvaWQgKkN0eCkgeworICAgICAgZGVsZXRlICh0eXBlbmFtZSBkYXRhX3R5cGU6OkZhY3RvcnkgKikgQ3R4OworICAgIH0KKyAgfTsKKworICAvLy8gSGVscGVyIGZvciByZWdpc3RlcmluZyBhIG1hcCB0cmFpdC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgbWFwIHR5cGUgd2VyZSB3cml0dGVuIGRpcmVjdGx5IGluIHRoZSBpbnZvY2F0aW9uIG9mCisgIC8vLyBSRUdJU1RFUl9UUkFJVF9XSVRIX1BST0dSQU1TVEFURSwgdGhlIGNvbW1hIGluIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMKKyAgLy8vIHdvdWxkIGJlIHRyZWF0ZWQgYXMgYSBtYWNybyBhcmd1bWVudCBzZXBhcmF0b3IsIHdoaWNoIGlzIHdyb25nLgorICAvLy8gVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gc3BlY2lmeSBhIG1hcCB0eXBlIGluIGEgd2F5IHRoYXQgdGhlIHByZXByb2Nlc3NvcgorICAvLy8gY2FuIGRlYWwgd2l0aC4KKyAgI2RlZmluZSBDTEFOR19FTlRPX1BST0dSQU1TVEFURV9NQVAoS2V5LCBWYWx1ZSkgbGx2bTo6SW1tdXRhYmxlTWFwPEtleSwgVmFsdWU+CisKKyAgLy8gUGFydGlhbC1zcGVjaWFsaXphdGlvbiBmb3IgSW1tdXRhYmxlU2V0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBJbmZvPgorICBzdHJ1Y3QgUHJvZ3JhbVN0YXRlUGFydGlhbFRyYWl0PGxsdm06OkltbXV0YWJsZVNldDxLZXksIEluZm8+PiB7CisgICAgdXNpbmcgZGF0YV90eXBlID0gbGx2bTo6SW1tdXRhYmxlU2V0PEtleSwgSW5mbz47CisgICAgdXNpbmcgY29udGV4dF90eXBlID0gdHlwZW5hbWUgZGF0YV90eXBlOjpGYWN0b3J5ICY7CisgICAgdXNpbmcga2V5X3R5cGUgPSBLZXk7CisKKyAgICBzdGF0aWMgZGF0YV90eXBlIE1ha2VEYXRhKHZvaWQgKmNvbnN0ICpwKSB7CisgICAgICByZXR1cm4gcCA/IGRhdGFfdHlwZSgodHlwZW5hbWUgZGF0YV90eXBlOjpUcmVlVHkgKikgKnApCisgICAgICAgICAgICAgICA6IGRhdGFfdHlwZShudWxscHRyKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCAqTWFrZVZvaWRQdHIoZGF0YV90eXBlIEIpIHsKKyAgICAgIHJldHVybiBCLmdldFJvb3QoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgZGF0YV90eXBlIEFkZChkYXRhX3R5cGUgQiwga2V5X3R5cGUgSywgY29udGV4dF90eXBlIEYpIHsKKyAgICAgIHJldHVybiBGLmFkZChCLCBLKTsKKyAgICB9CisKKyAgICBzdGF0aWMgZGF0YV90eXBlIFJlbW92ZShkYXRhX3R5cGUgQiwga2V5X3R5cGUgSywgY29udGV4dF90eXBlIEYpIHsKKyAgICAgIHJldHVybiBGLnJlbW92ZShCLCBLKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBDb250YWlucyhkYXRhX3R5cGUgQiwga2V5X3R5cGUgSykgeworICAgICAgcmV0dXJuIEIuY29udGFpbnMoSyk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnRleHRfdHlwZSBNYWtlQ29udGV4dCh2b2lkICpwKSB7CisgICAgICByZXR1cm4gKigodHlwZW5hbWUgZGF0YV90eXBlOjpGYWN0b3J5ICopIHApOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkICpDcmVhdGVDb250ZXh0KGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jKSB7CisgICAgICByZXR1cm4gbmV3IHR5cGVuYW1lIGRhdGFfdHlwZTo6RmFjdG9yeShBbGxvYyk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgRGVsZXRlQ29udGV4dCh2b2lkICpDdHgpIHsKKyAgICAgIGRlbGV0ZSAodHlwZW5hbWUgZGF0YV90eXBlOjpGYWN0b3J5ICopIEN0eDsKKyAgICB9CisgIH07CisKKyAgLy8gUGFydGlhbC1zcGVjaWFsaXphdGlvbiBmb3IgSW1tdXRhYmxlTGlzdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBQcm9ncmFtU3RhdGVQYXJ0aWFsVHJhaXQ8bGx2bTo6SW1tdXRhYmxlTGlzdDxUPj4geworICAgIHVzaW5nIGRhdGFfdHlwZSA9IGxsdm06OkltbXV0YWJsZUxpc3Q8VD47CisgICAgdXNpbmcga2V5X3R5cGUgPSBUOworICAgIHVzaW5nIGNvbnRleHRfdHlwZSA9IHR5cGVuYW1lIGRhdGFfdHlwZTo6RmFjdG9yeSAmOworCisgICAgc3RhdGljIGRhdGFfdHlwZSBBZGQoZGF0YV90eXBlIEwsIGtleV90eXBlIEssIGNvbnRleHRfdHlwZSBGKSB7CisgICAgICByZXR1cm4gRi5hZGQoSywgTCk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgQ29udGFpbnMoZGF0YV90eXBlIEwsIGtleV90eXBlIEspIHsKKyAgICAgIHJldHVybiBMLmNvbnRhaW5zKEspOworICAgIH0KKworICAgIHN0YXRpYyBkYXRhX3R5cGUgTWFrZURhdGEodm9pZCAqY29uc3QgKnApIHsKKyAgICAgIHJldHVybiBwID8gZGF0YV90eXBlKChjb25zdCBsbHZtOjpJbW11dGFibGVMaXN0SW1wbDxUPiAqKSAqcCkKKyAgICAgICAgICAgICAgIDogZGF0YV90eXBlKG51bGxwdHIpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkICpNYWtlVm9pZFB0cihkYXRhX3R5cGUgRCkgeworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8bGx2bTo6SW1tdXRhYmxlTGlzdEltcGw8VD4gKj4oRC5nZXRJbnRlcm5hbFBvaW50ZXIoKSk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnRleHRfdHlwZSBNYWtlQ29udGV4dCh2b2lkICpwKSB7CisgICAgICByZXR1cm4gKigodHlwZW5hbWUgZGF0YV90eXBlOjpGYWN0b3J5ICopIHApOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkICpDcmVhdGVDb250ZXh0KGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jKSB7CisgICAgICByZXR1cm4gbmV3IHR5cGVuYW1lIGRhdGFfdHlwZTo6RmFjdG9yeShBbGxvYyk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgRGVsZXRlQ29udGV4dCh2b2lkICpDdHgpIHsKKyAgICAgIGRlbGV0ZSAodHlwZW5hbWUgZGF0YV90eXBlOjpGYWN0b3J5ICopIEN0eDsKKyAgICB9CisgIH07CisKKyAgLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgYm9vbC4KKyAgdGVtcGxhdGUgPD4gc3RydWN0IFByb2dyYW1TdGF0ZVBhcnRpYWxUcmFpdDxib29sPiB7CisgICAgdXNpbmcgZGF0YV90eXBlID0gYm9vbDsKKworICAgIHN0YXRpYyBkYXRhX3R5cGUgTWFrZURhdGEodm9pZCAqY29uc3QgKnApIHsKKyAgICAgIHJldHVybiBwID8gKGRhdGFfdHlwZSkgKHVpbnRwdHJfdCkgKnAKKyAgICAgICAgICAgICAgIDogZGF0YV90eXBlKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgKk1ha2VWb2lkUHRyKGRhdGFfdHlwZSBkKSB7CisgICAgICByZXR1cm4gKHZvaWQgKikgKHVpbnRwdHJfdCkgZDsKKyAgICB9CisgIH07CisKKyAgLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgdW5zaWduZWQuCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBQcm9ncmFtU3RhdGVQYXJ0aWFsVHJhaXQ8dW5zaWduZWQ+IHsKKyAgICB1c2luZyBkYXRhX3R5cGUgPSB1bnNpZ25lZDsKKworICAgIHN0YXRpYyBkYXRhX3R5cGUgTWFrZURhdGEodm9pZCAqY29uc3QgKnApIHsKKyAgICAgIHJldHVybiBwID8gKGRhdGFfdHlwZSkgKHVpbnRwdHJfdCkgKnAKKyAgICAgICAgICAgICAgIDogZGF0YV90eXBlKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgKk1ha2VWb2lkUHRyKGRhdGFfdHlwZSBkKSB7CisgICAgICByZXR1cm4gKHZvaWQgKikgKHVpbnRwdHJfdCkgZDsKKyAgICB9CisgIH07CisKKyAgLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3Igdm9pZCouCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBQcm9ncmFtU3RhdGVQYXJ0aWFsVHJhaXQ8dm9pZCAqPiB7CisgICAgdXNpbmcgZGF0YV90eXBlID0gdm9pZCAqOworCisgICAgc3RhdGljIGRhdGFfdHlwZSBNYWtlRGF0YSh2b2lkICpjb25zdCAqcCkgeworICAgICAgcmV0dXJuIHAgPyAqcAorICAgICAgICAgICAgICAgOiBkYXRhX3R5cGUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCAqTWFrZVZvaWRQdHIoZGF0YV90eXBlIGQpIHsKKyAgICAgIHJldHVybiBkOworICAgIH0KKyAgfTsKKworICAvLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciBjb25zdCB2b2lkICouCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBQcm9ncmFtU3RhdGVQYXJ0aWFsVHJhaXQ8Y29uc3Qgdm9pZCAqPiB7CisgICAgdXNpbmcgZGF0YV90eXBlID0gY29uc3Qgdm9pZCAqOworCisgICAgc3RhdGljIGRhdGFfdHlwZSBNYWtlRGF0YSh2b2lkICpjb25zdCAqcCkgeworICAgICAgcmV0dXJuIHAgPyAqcCA6IGRhdGFfdHlwZSgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkICpNYWtlVm9pZFB0cihkYXRhX3R5cGUgZCkgeworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8dm9pZCAqPihkKTsKKyAgICB9CisgIH07CisKK30gLy8gbmFtZXNwYWNlIGVudG8KK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9QUk9HUkFNU1RBVEVUUkFJVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvUHJvZ3JhbVN0YXRlX0Z3ZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1Byb2dyYW1TdGF0ZV9Gd2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTViYjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1Byb2dyYW1TdGF0ZV9Gd2QuaApAQCAtMCwwICsxLDQzIEBACisvLz09IFByb2dyYW1TdGF0ZV9Gd2QuaCAtIEluY29tcGxldGUgZGVjbGFyYXRpb25zIG9mIFByb2dyYW1TdGF0ZSAtKi0gQysrIC0qLS09LworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX1BST0dSQU1TVEFURV9GV0RfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9QUk9HUkFNU1RBVEVfRldEX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBlbnRvIHsKKyAgY2xhc3MgUHJvZ3JhbVN0YXRlOworICBjbGFzcyBQcm9ncmFtU3RhdGVNYW5hZ2VyOworICB2b2lkIFByb2dyYW1TdGF0ZVJldGFpbihjb25zdCBQcm9ncmFtU3RhdGUgKnN0YXRlKTsKKyAgdm9pZCBQcm9ncmFtU3RhdGVSZWxlYXNlKGNvbnN0IFByb2dyYW1TdGF0ZSAqc3RhdGUpOworfQorfQorCituYW1lc3BhY2UgbGx2bSB7CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBJbnRydXNpdmVSZWZDbnRQdHJJbmZvPGNvbnN0IGNsYW5nOjplbnRvOjpQcm9ncmFtU3RhdGU+IHsKKyAgICBzdGF0aWMgdm9pZCByZXRhaW4oY29uc3QgY2xhbmc6OmVudG86OlByb2dyYW1TdGF0ZSAqc3RhdGUpIHsKKyAgICAgIGNsYW5nOjplbnRvOjpQcm9ncmFtU3RhdGVSZXRhaW4oc3RhdGUpOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCByZWxlYXNlKGNvbnN0IGNsYW5nOjplbnRvOjpQcm9ncmFtU3RhdGUgKnN0YXRlKSB7CisgICAgICBjbGFuZzo6ZW50bzo6UHJvZ3JhbVN0YXRlUmVsZWFzZShzdGF0ZSk7CisgICAgfQorICB9OworfQorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGVudG8geworICB0eXBlZGVmIEludHJ1c2l2ZVJlZkNudFB0cjxjb25zdCBQcm9ncmFtU3RhdGU+IFByb2dyYW1TdGF0ZVJlZjsKK30KK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9SZWdpb25zLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9SZWdpb25zLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODRhMWZmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1JlZ2lvbnMuZGVmCkBAIC0wLDAgKzEsODkgQEAKKy8vPT09LS0gUmVnaW9ucy5kZWYgLSBNZXRhZGF0YSBhYm91dCBNZW1SZWdpb24ga2luZHMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlIGxpc3Qgb2YgcmVnaW9ucyAoTWVtUmVnaW9uIHN1Yi1jbGFzc2VzKSB1c2VkIGluIHRoZSBTdGF0aWMgQW5hbHl6ZXIuCisvLyBJbiBvcmRlciB0byB1c2UgdGhpcyBpbmZvcm1hdGlvbiwgdXNlcnMgb2YgdGhpcyBmaWxlIG11c3QgZGVmaW5lIG9uZSBvciBtb3JlCisvLyBvZiB0aGUgdGhyZWUgbWFjcm9zOgorLy8KKy8vIFJFR0lPTihJZCwgUGFyZW50KSAtIGZvciBzcGVjaWZpYyBNZW1SZWdpb24gc3ViLWNsYXNzZXMsIHJlc2VydmluZworLy8gZW51bSB2YWx1ZSBJZEtpbmQgZm9yIHRoZWlyIGtpbmQuCisvLworLy8gQUJTVFJBQ1RfUkVHSU9OKElkLCBQYXJlbnQpIC0gZm9yIGFic3RyYWN0IHJlZ2lvbiBjbGFzc2VzLAorLy8KKy8vIFJFR0lPTl9SQU5HRShJZCwgRmlyc3QsIExhc3QpIC0gZm9yIHJhbmdlcyBvZiBraW5kLWVudW1zLAorLy8gYWxsb3dpbmcgdG8gZGV0ZXJtaW5lIGFic3RyYWN0IGNsYXNzIG9mIGEgcmVnaW9uCisvLyBiYXNlZCBvbiB0aGUga2luZC1lbnVtIHZhbHVlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgUkVHSU9OCisjZGVmaW5lIFJFR0lPTihJZCwgUGFyZW50KQorI2VuZGlmCisKKyNpZm5kZWYgQUJTVFJBQ1RfUkVHSU9OCisjZGVmaW5lIEFCU1RSQUNUX1JFR0lPTihJZCwgUGFyZW50KQorI2VuZGlmCisKKyNpZm5kZWYgUkVHSU9OX1JBTkdFCisjZGVmaW5lIFJFR0lPTl9SQU5HRShJZCwgRmlyc3QsIExhc3QpCisjZW5kaWYKKworQUJTVFJBQ1RfUkVHSU9OKE1lbVNwYWNlUmVnaW9uLCBNZW1SZWdpb24pCisgIFJFR0lPTihDb2RlU3BhY2VSZWdpb24sIE1lbVNwYWNlUmVnaW9uKQorICBBQlNUUkFDVF9SRUdJT04oR2xvYmFsc1NwYWNlUmVnaW9uLCBNZW1TcGFjZVJlZ2lvbikKKyAgICBBQlNUUkFDVF9SRUdJT04oTm9uU3RhdGljR2xvYmFsU3BhY2VSZWdpb24sIEdsb2JhbHNTcGFjZVJlZ2lvbikKKyAgICAgIFJFR0lPTihHbG9iYWxJbW11dGFibGVTcGFjZVJlZ2lvbiwgTm9uU3RhdGljR2xvYmFsU3BhY2VSZWdpb24pCisgICAgICBSRUdJT04oR2xvYmFsSW50ZXJuYWxTcGFjZVJlZ2lvbiwgTm9uU3RhdGljR2xvYmFsU3BhY2VSZWdpb24pCisgICAgICBSRUdJT04oR2xvYmFsU3lzdGVtU3BhY2VSZWdpb24sIE5vblN0YXRpY0dsb2JhbFNwYWNlUmVnaW9uKQorICAgICAgUkVHSU9OX1JBTkdFKE5PTl9TVEFUSUNfR0xPQkFMX01FTVNQQUNFUywgR2xvYmFsSW1tdXRhYmxlU3BhY2VSZWdpb25LaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsU3lzdGVtU3BhY2VSZWdpb25LaW5kKQorICAgIFJFR0lPTihTdGF0aWNHbG9iYWxTcGFjZVJlZ2lvbiwgTWVtU3BhY2VSZWdpb24pCisgICAgUkVHSU9OX1JBTkdFKEdMT0JBTF9NRU1TUEFDRVMsIEdsb2JhbEltbXV0YWJsZVNwYWNlUmVnaW9uS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGljR2xvYmFsU3BhY2VSZWdpb25LaW5kKQorICBSRUdJT04oSGVhcFNwYWNlUmVnaW9uLCBNZW1TcGFjZVJlZ2lvbikKKyAgQUJTVFJBQ1RfUkVHSU9OKFN0YWNrU3BhY2VSZWdpb24sIE1lbVNwYWNlUmVnaW9uKQorICAgIFJFR0lPTihTdGFja0FyZ3VtZW50c1NwYWNlUmVnaW9uLCBTdGFja1NwYWNlUmVnaW9uKQorICAgIFJFR0lPTihTdGFja0xvY2Fsc1NwYWNlUmVnaW9uLCBTdGFja1NwYWNlUmVnaW9uKQorICAgIFJFR0lPTl9SQU5HRShTVEFDS19NRU1TUEFDRVMsIFN0YWNrQXJndW1lbnRzU3BhY2VSZWdpb25LaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YWNrTG9jYWxzU3BhY2VSZWdpb25LaW5kKQorICBSRUdJT04oVW5rbm93blNwYWNlUmVnaW9uLCBNZW1TcGFjZVJlZ2lvbikKKyAgUkVHSU9OX1JBTkdFKE1FTVNQQUNFUywgQ29kZVNwYWNlUmVnaW9uS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93blNwYWNlUmVnaW9uS2luZCkKK0FCU1RSQUNUX1JFR0lPTihTdWJSZWdpb24sIE1lbVJlZ2lvbikKKyAgUkVHSU9OKEFsbG9jYVJlZ2lvbiwgU3ViUmVnaW9uKQorICBSRUdJT04oU3ltYm9saWNSZWdpb24sIFN1YlJlZ2lvbikKKyAgQUJTVFJBQ1RfUkVHSU9OKFR5cGVkUmVnaW9uLCBTdWJSZWdpb24pCisgICAgUkVHSU9OKEJsb2NrRGF0YVJlZ2lvbiwgVHlwZWRSZWdpb24pCisgICAgQUJTVFJBQ1RfUkVHSU9OKENvZGVUZXh0UmVnaW9uLCBUeXBlZFJlZ2lvbikKKyAgICAgIFJFR0lPTihCbG9ja0NvZGVSZWdpb24sIENvZGVUZXh0UmVnaW9uKQorICAgICAgUkVHSU9OKEZ1bmN0aW9uQ29kZVJlZ2lvbiwgQ29kZVRleHRSZWdpb24pCisgICAgICBSRUdJT05fUkFOR0UoQ09ERV9URVhUX1JFR0lPTlMsIEJsb2NrQ29kZVJlZ2lvbktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQ29kZVJlZ2lvbktpbmQpCisgICAgQUJTVFJBQ1RfUkVHSU9OKFR5cGVkVmFsdWVSZWdpb24sIFR5cGVkUmVnaW9uKQorICAgICAgUkVHSU9OKENvbXBvdW5kTGl0ZXJhbFJlZ2lvbiwgVHlwZWRWYWx1ZVJlZ2lvbikKKyAgICAgIFJFR0lPTihDWFhCYXNlT2JqZWN0UmVnaW9uLCBUeXBlZFZhbHVlUmVnaW9uKQorICAgICAgUkVHSU9OKENYWFRlbXBPYmplY3RSZWdpb24sIFR5cGVkVmFsdWVSZWdpb24pCisgICAgICBSRUdJT04oQ1hYVGhpc1JlZ2lvbiwgVHlwZWRWYWx1ZVJlZ2lvbikKKyAgICAgIEFCU1RSQUNUX1JFR0lPTihEZWNsUmVnaW9uLCBUeXBlZFZhbHVlUmVnaW9uKQorICAgICAgICBSRUdJT04oRmllbGRSZWdpb24sIERlY2xSZWdpb24pCisgICAgICAgIFJFR0lPTihPYmpDSXZhclJlZ2lvbiwgRGVjbFJlZ2lvbikKKyAgICAgICAgUkVHSU9OKFZhclJlZ2lvbiwgRGVjbFJlZ2lvbikKKyAgICAgICAgUkVHSU9OX1JBTkdFKERFQ0xfUkVHSU9OUywgRmllbGRSZWdpb25LaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJSZWdpb25LaW5kKQorICAgICAgUkVHSU9OKEVsZW1lbnRSZWdpb24sIFR5cGVkVmFsdWVSZWdpb24pCisgICAgICBSRUdJT04oT2JqQ1N0cmluZ1JlZ2lvbiwgVHlwZWRWYWx1ZVJlZ2lvbikKKyAgICAgIFJFR0lPTihTdHJpbmdSZWdpb24sIFR5cGVkVmFsdWVSZWdpb24pCisgICAgICBSRUdJT05fUkFOR0UoVFlQRURfVkFMVUVfUkVHSU9OUywgQ29tcG91bmRMaXRlcmFsUmVnaW9uS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWdpb25LaW5kKQorICAgIFJFR0lPTl9SQU5HRShUWVBFRF9SRUdJT05TLCBCbG9ja0RhdGFSZWdpb25LaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWdpb25LaW5kKQorCisjdW5kZWYgUkVHSU9OX1JBTkdFCisjdW5kZWYgQUJTVFJBQ1RfUkVHSU9OCisjdW5kZWYgUkVHSU9OCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU1ZhbEJ1aWxkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TVmFsQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYWNmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU1ZhbEJ1aWxkZXIuaApAQCAtMCwwICsxLDM4NyBAQAorLy8gU1ZhbEJ1aWxkZXIuaCAtIENvbnN0cnVjdGlvbiBvZiBTVmFscyBmcm9tIGV2YWx1YXRpbmcgZXhwcmVzc2lvbnMgLSotIEMrKyAtKi0KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgU1ZhbEJ1aWxkZXIsIGEgY2xhc3MgdGhhdCBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgZm9yCisvLyAgInN5bWJvbGljYWwgZXZhbHVhdG9ycyIgd2hpY2ggY29uc3RydWN0IGFuIFNWYWwgZnJvbSBhbiBleHByZXNzaW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfU1ZBTEJVSUxERVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9TVkFMQlVJTERFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsYXJhdGlvbk5hbWUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXhwci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByT2JqQy5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xhbmdPcHRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0Jhc2ljVmFsdWVGYWN0b3J5LmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL01lbVJlZ2lvbi5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Qcm9ncmFtU3RhdGVfRndkLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1NWYWxzLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N5bUV4cHIuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU3ltYm9sTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ltbXV0YWJsZUxpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIEJsb2NrRGVjbDsKK2NsYXNzIENYWEJvb2xMaXRlcmFsRXhwcjsKK2NsYXNzIENYWE1ldGhvZERlY2w7CitjbGFzcyBDWFhSZWNvcmREZWNsOworY2xhc3MgRGVjbGFyYXRvckRlY2w7CitjbGFzcyBGdW5jdGlvbkRlY2w7CitjbGFzcyBMb2NhdGlvbkNvbnRleHQ7CitjbGFzcyBTdGFja0ZyYW1lQ29udGV4dDsKK2NsYXNzIFN0bXQ7CisKK25hbWVzcGFjZSBlbnRvIHsKKworY2xhc3MgQ29uZGl0aW9uVHJ1dGhWYWw7CitjbGFzcyBQcm9ncmFtU3RhdGVNYW5hZ2VyOworY2xhc3MgU3RvcmVSZWY7CisKK2NsYXNzIFNWYWxCdWlsZGVyIHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwcm90ZWN0ZWQ6CisgIEFTVENvbnRleHQgJkNvbnRleHQ7CisgIAorICAvLy8gTWFuYWdlciBvZiBBUFNJbnQgdmFsdWVzLgorICBCYXNpY1ZhbHVlRmFjdG9yeSBCYXNpY1ZhbHM7CisKKyAgLy8vIE1hbmFnZXMgdGhlIGNyZWF0aW9uIG9mIHN5bWJvbHMuCisgIFN5bWJvbE1hbmFnZXIgU3ltTWdyOworCisgIC8vLyBNYW5hZ2VzIHRoZSBjcmVhdGlvbiBvZiBtZW1vcnkgcmVnaW9ucy4KKyAgTWVtUmVnaW9uTWFuYWdlciBNZW1NZ3I7CisKKyAgUHJvZ3JhbVN0YXRlTWFuYWdlciAmU3RhdGVNZ3I7CisKKyAgLy8vIFRoZSBzY2FsYXIgdHlwZSB0byB1c2UgZm9yIGFycmF5IGluZGljZXMuCisgIGNvbnN0IFF1YWxUeXBlIEFycmF5SW5kZXhUeTsKKyAgCisgIC8vLyBUaGUgd2lkdGggb2YgdGhlIHNjYWxhciB0eXBlIHVzZWQgZm9yIGFycmF5IGluZGljZXMuCisgIGNvbnN0IHVuc2lnbmVkIEFycmF5SW5kZXhXaWR0aDsKKworICB2aXJ0dWFsIFNWYWwgZXZhbENhc3RGcm9tTm9uTG9jKE5vbkxvYyB2YWwsIFF1YWxUeXBlIGNhc3RUeSkgPSAwOworICB2aXJ0dWFsIFNWYWwgZXZhbENhc3RGcm9tTG9jKExvYyB2YWwsIFF1YWxUeXBlIGNhc3RUeSkgPSAwOworCitwdWJsaWM6CisgIC8vIEZJWE1FOiBNYWtlIHRoZXNlIHByb3RlY3RlZCBhZ2FpbiBvbmNlIFJlZ2lvblN0b3JlTWFuYWdlciBjb3JyZWN0bHkKKyAgLy8gaGFuZGxlcyBsb2FkcyBmcm9tIGRpZmZlcmVudCBib3VuZCB2YWx1ZSB0eXBlcy4KKyAgdmlydHVhbCBTVmFsIGRpc3BhdGNoQ2FzdChTVmFsIHZhbCwgUXVhbFR5cGUgY2FzdFR5KSA9IDA7CisKK3B1YmxpYzoKKyAgU1ZhbEJ1aWxkZXIobGx2bTo6QnVtcFB0ckFsbG9jYXRvciAmYWxsb2MsIEFTVENvbnRleHQgJmNvbnRleHQsCisgICAgICAgICAgICAgIFByb2dyYW1TdGF0ZU1hbmFnZXIgJnN0YXRlTWdyKQorICAgICAgOiBDb250ZXh0KGNvbnRleHQpLCBCYXNpY1ZhbHMoY29udGV4dCwgYWxsb2MpLAorICAgICAgICBTeW1NZ3IoY29udGV4dCwgQmFzaWNWYWxzLCBhbGxvYyksIE1lbU1ncihjb250ZXh0LCBhbGxvYyksCisgICAgICAgIFN0YXRlTWdyKHN0YXRlTWdyKSwgQXJyYXlJbmRleFR5KGNvbnRleHQuTG9uZ0xvbmdUeSksCisgICAgICAgIEFycmF5SW5kZXhXaWR0aChjb250ZXh0LmdldFR5cGVTaXplKEFycmF5SW5kZXhUeSkpIHt9CisKKyAgdmlydHVhbCB+U1ZhbEJ1aWxkZXIoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBoYXZlU2FtZVR5cGUoY29uc3QgU3ltRXhwciAqU3ltMSwgY29uc3QgU3ltRXhwciAqU3ltMikgeworICAgIHJldHVybiBoYXZlU2FtZVR5cGUoU3ltMS0+Z2V0VHlwZSgpLCBTeW0yLT5nZXRUeXBlKCkpOworICB9CisKKyAgYm9vbCBoYXZlU2FtZVR5cGUoUXVhbFR5cGUgVHkxLCBRdWFsVHlwZSBUeTIpIHsKKyAgICAvLyBGSVhNRTogUmVtb3ZlIHRoZSBzZWNvbmQgZGlzanVuY3Qgd2hlbiB3ZSBzdXBwb3J0IHN5bWJvbGljCisgICAgLy8gdHJ1bmNhdGlvbi9leHRlbnNpb24uCisgICAgcmV0dXJuIChDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoVHkxKSA9PSBDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoVHkyKSB8fAorICAgICAgICAgICAgKFR5MS0+aXNJbnRlZ3JhbE9yRW51bWVyYXRpb25UeXBlKCkgJiYKKyAgICAgICAgICAgICBUeTItPmlzSW50ZWdyYWxPckVudW1lcmF0aW9uVHlwZSgpKSk7CisgIH0KKworICBTVmFsIGV2YWxDYXN0KFNWYWwgdmFsLCBRdWFsVHlwZSBjYXN0VHksIFF1YWxUeXBlIG9yaWdpbmFsVHlwZSk7CisKKyAgLy8gSGFuZGxlcyBjYXN0cyBvZiB0eXBlIENLX0ludGVncmFsQ2FzdC4KKyAgU1ZhbCBldmFsSW50ZWdyYWxDYXN0KFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgU1ZhbCB2YWwsIFF1YWxUeXBlIGNhc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIG9yaWdpbmFsVHlwZSk7CisKKyAgdmlydHVhbCBTVmFsIGV2YWxNaW51cyhOb25Mb2MgdmFsKSA9IDA7CisKKyAgdmlydHVhbCBTVmFsIGV2YWxDb21wbGVtZW50KE5vbkxvYyB2YWwpID0gMDsKKworICAvLy8gQ3JlYXRlIGEgbmV3IHZhbHVlIHdoaWNoIHJlcHJlc2VudHMgYSBiaW5hcnkgZXhwcmVzc2lvbiB3aXRoIHR3byBub24tCisgIC8vLyBsb2NhdGlvbiBvcGVyYW5kcy4KKyAgdmlydHVhbCBTVmFsIGV2YWxCaW5PcE5OKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbkxvYyBsaHMsIE5vbkxvYyByaHMsIFF1YWxUeXBlIHJlc3VsdFR5KSA9IDA7CisKKyAgLy8vIENyZWF0ZSBhIG5ldyB2YWx1ZSB3aGljaCByZXByZXNlbnRzIGEgYmluYXJ5IGV4cHJlc3Npb24gd2l0aCB0d28gbWVtb3J5CisgIC8vLyBsb2NhdGlvbiBvcGVyYW5kcy4KKyAgdmlydHVhbCBTVmFsIGV2YWxCaW5PcExMKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYyBsaHMsIExvYyByaHMsIFF1YWxUeXBlIHJlc3VsdFR5KSA9IDA7CisKKyAgLy8vIENyZWF0ZSBhIG5ldyB2YWx1ZSB3aGljaCByZXByZXNlbnRzIGEgYmluYXJ5IGV4cHJlc3Npb24gd2l0aCBhIG1lbW9yeQorICAvLy8gbG9jYXRpb24gYW5kIG5vbi1sb2NhdGlvbiBvcGVyYW5kcy4gRm9yIGV4YW1wbGUsIHRoaXMgd291bGQgYmUgdXNlZCB0bworICAvLy8gZXZhbHVhdGUgYSBwb2ludGVyIGFyaXRobWV0aWMgb3BlcmF0aW9uLgorICB2aXJ0dWFsIFNWYWwgZXZhbEJpbk9wTE4oUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLCBCaW5hcnlPcGVyYXRvcjo6T3Bjb2RlIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jIGxocywgTm9uTG9jIHJocywgUXVhbFR5cGUgcmVzdWx0VHkpID0gMDsKKworICAvLy8gRXZhbHVhdGVzIGEgZ2l2ZW4gU1ZhbC4gSWYgdGhlIFNWYWwgaGFzIG9ubHkgb25lIHBvc3NpYmxlIChpbnRlZ2VyKSB2YWx1ZSwKKyAgLy8vIHRoYXQgdmFsdWUgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSwgcmV0dXJucyBOVUxMLgorICB2aXJ0dWFsIGNvbnN0IGxsdm06OkFQU0ludCAqZ2V0S25vd25WYWx1ZShQcm9ncmFtU3RhdGVSZWYgc3RhdGUsIFNWYWwgdmFsKSA9IDA7CisKKyAgLy8vIFNpbXBsaWZ5IHN5bWJvbGljIGV4cHJlc3Npb25zIHdpdGhpbiBhIGdpdmVuIFNWYWwuIFJldHVybiBhbiBTVmFsCisgIC8vLyB0aGF0IHJlcHJlc2VudHMgdGhlIHNhbWUgdmFsdWUsIGJ1dCBpcyBob3BlZnVsbHkgZWFzaWVyIHRvIHdvcmsgd2l0aAorICAvLy8gdGhhbiB0aGUgb3JpZ2luYWwgU1ZhbC4KKyAgdmlydHVhbCBTVmFsIHNpbXBsaWZ5U1ZhbChQcm9ncmFtU3RhdGVSZWYgU3RhdGUsIFNWYWwgVmFsKSA9IDA7CisgIAorICAvLy8gQ29uc3RydWN0cyBhIHN5bWJvbGljIGV4cHJlc3Npb24gZm9yIHR3byBub24tbG9jYXRpb24gdmFsdWVzLgorICBTVmFsIG1ha2VTeW1FeHByVmFsTk4oUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLCBCaW5hcnlPcGVyYXRvcjo6T3Bjb2RlIG9wLAorICAgICAgICAgICAgICAgICAgICAgIE5vbkxvYyBsaHMsIE5vbkxvYyByaHMsIFF1YWxUeXBlIHJlc3VsdFR5KTsKKworICBTVmFsIGV2YWxCaW5PcChQcm9ncmFtU3RhdGVSZWYgc3RhdGUsIEJpbmFyeU9wZXJhdG9yOjpPcGNvZGUgb3AsCisgICAgICAgICAgICAgICAgIFNWYWwgbGhzLCBTVmFsIHJocywgUXVhbFR5cGUgdHlwZSk7CisKKyAgLy8vIFxyZXR1cm4gV2hldGhlciB2YWx1ZXMgaW4gXHAgbGhzIGFuZCBccCByaHMgYXJlIGVxdWFsIGF0IFxwIHN0YXRlLgorICBDb25kaXRpb25UcnV0aFZhbCBhcmVFcXVhbChQcm9ncmFtU3RhdGVSZWYgc3RhdGUsIFNWYWwgbGhzLCBTVmFsIHJocyk7CisKKyAgU1ZhbCBldmFsRVEoUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLCBTVmFsIGxocywgU1ZhbCByaHMpOworCisgIERlZmluZWRPclVua25vd25TVmFsIGV2YWxFUShQcm9ncmFtU3RhdGVSZWYgc3RhdGUsIERlZmluZWRPclVua25vd25TVmFsIGxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZWRPclVua25vd25TVmFsIHJocyk7CisKKyAgQVNUQ29udGV4dCAmZ2V0Q29udGV4dCgpIHsgcmV0dXJuIENvbnRleHQ7IH0KKyAgY29uc3QgQVNUQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIENvbnRleHQ7IH0KKworICBQcm9ncmFtU3RhdGVNYW5hZ2VyICZnZXRTdGF0ZU1hbmFnZXIoKSB7IHJldHVybiBTdGF0ZU1ncjsgfQorICAKKyAgUXVhbFR5cGUgZ2V0Q29uZGl0aW9uVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29udGV4dC5nZXRMYW5nT3B0cygpLkNQbHVzUGx1cyA/IENvbnRleHQuQm9vbFR5IDogQ29udGV4dC5JbnRUeTsKKyAgfQorICAKKyAgUXVhbFR5cGUgZ2V0QXJyYXlJbmRleFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIEFycmF5SW5kZXhUeTsKKyAgfQorCisgIEJhc2ljVmFsdWVGYWN0b3J5ICZnZXRCYXNpY1ZhbHVlRmFjdG9yeSgpIHsgcmV0dXJuIEJhc2ljVmFsczsgfQorICBjb25zdCBCYXNpY1ZhbHVlRmFjdG9yeSAmZ2V0QmFzaWNWYWx1ZUZhY3RvcnkoKSBjb25zdCB7IHJldHVybiBCYXNpY1ZhbHM7IH0KKworICBTeW1ib2xNYW5hZ2VyICZnZXRTeW1ib2xNYW5hZ2VyKCkgeyByZXR1cm4gU3ltTWdyOyB9CisgIGNvbnN0IFN5bWJvbE1hbmFnZXIgJmdldFN5bWJvbE1hbmFnZXIoKSBjb25zdCB7IHJldHVybiBTeW1NZ3I7IH0KKworICBNZW1SZWdpb25NYW5hZ2VyICZnZXRSZWdpb25NYW5hZ2VyKCkgeyByZXR1cm4gTWVtTWdyOyB9CisgIGNvbnN0IE1lbVJlZ2lvbk1hbmFnZXIgJmdldFJlZ2lvbk1hbmFnZXIoKSBjb25zdCB7IHJldHVybiBNZW1NZ3I7IH0KKworICAvLyBGb3J3YXJkaW5nIG1ldGhvZHMgdG8gU3ltYm9sTWFuYWdlci4KKworICBjb25zdCBTeW1ib2xDb25qdXJlZCogY29uanVyZVN5bWJvbChjb25zdCBTdG10ICpzdG10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZpc2l0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnN5bWJvbFRhZyA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gU3ltTWdyLmNvbmp1cmVTeW1ib2woc3RtdCwgTEN0eCwgdHlwZSwgdmlzaXRDb3VudCwgc3ltYm9sVGFnKTsKKyAgfQorCisgIGNvbnN0IFN5bWJvbENvbmp1cmVkKiBjb25qdXJlU3ltYm9sKGNvbnN0IEV4cHIgKmV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdmlzaXRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3ltYm9sVGFnID0gbnVsbHB0cikgeworICAgIHJldHVybiBTeW1NZ3IuY29uanVyZVN5bWJvbChleHByLCBMQ3R4LCB2aXNpdENvdW50LCBzeW1ib2xUYWcpOworICB9CisKKyAgLy8vIENvbnN0cnVjdCBhbiBTVmFsIHJlcHJlc2VudGluZyAnMCcgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgRGVmaW5lZE9yVW5rbm93blNWYWwgbWFrZVplcm9WYWwoUXVhbFR5cGUgdHlwZSk7CisKKyAgLy8vIE1ha2UgYSB1bmlxdWUgc3ltYm9sIGZvciB2YWx1ZSBvZiByZWdpb24uCisgIERlZmluZWRPclVua25vd25TVmFsIGdldFJlZ2lvblZhbHVlU3ltYm9sVmFsKGNvbnN0IFR5cGVkVmFsdWVSZWdpb24gKnJlZ2lvbik7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBuZXcgc3ltYm9sIHdpdGggYSB1bmlxdWUgJ25hbWUnLgorICAvLy8KKyAgLy8vIFdlIHJlc29ydCB0byBjb25qdXJlZCBzeW1ib2xzIHdoZW4gd2UgY2Fubm90IGNvbnN0cnVjdCBhIGRlcml2ZWQgc3ltYm9sLgorICAvLy8gVGhlIGFkdmFudGFnZSBvZiBzeW1ib2xzIGRlcml2ZWQvYnVpbHQgZnJvbSBvdGhlciBzeW1ib2xzIGlzIHRoYXQgd2UKKyAgLy8vIHByZXNlcnZlIHRoZSByZWxhdGlvbiBiZXR3ZWVuIHJlbGF0ZWQob3IgZXZlbiBlcXVpdmFsZW50KSBleHByZXNzaW9ucywgc28KKyAgLy8vIGNvbmp1cmVkIHN5bWJvbHMgc2hvdWxkIGJlIHVzZWQgc3BhcmluZ2x5LgorICBEZWZpbmVkT3JVbmtub3duU1ZhbCBjb25qdXJlU3ltYm9sVmFsKGNvbnN0IHZvaWQgKnN5bWJvbFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpleHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb3VudCk7CisgIERlZmluZWRPclVua25vd25TVmFsIGNvbmp1cmVTeW1ib2xWYWwoY29uc3Qgdm9pZCAqc3ltYm9sVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHIgKmV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY291bnQpOworICBEZWZpbmVkT3JVbmtub3duU1ZhbCBjb25qdXJlU3ltYm9sVmFsKGNvbnN0IFN0bXQgKnN0bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdmlzaXRDb3VudCk7CisKKyAgLy8vIFxicmllZiBDb25qdXJlIGEgc3ltYm9sIHJlcHJlc2VudGluZyBoZWFwIGFsbG9jYXRlZCBtZW1vcnkgcmVnaW9uLgorICAvLy8KKyAgLy8vIE5vdGUsIHRoZSBleHByZXNzaW9uIHNob3VsZCByZXByZXNlbnQgYSBsb2NhdGlvbi4KKyAgRGVmaW5lZE9yVW5rbm93blNWYWwgZ2V0Q29uanVyZWRIZWFwU3ltYm9sVmFsKGNvbnN0IEV4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb3VudCk7CisKKyAgRGVmaW5lZE9yVW5rbm93blNWYWwgZ2V0RGVyaXZlZFJlZ2lvblZhbHVlU3ltYm9sVmFsKAorICAgICAgU3ltYm9sUmVmIHBhcmVudFN5bWJvbCwgY29uc3QgVHlwZWRWYWx1ZVJlZ2lvbiAqcmVnaW9uKTsKKworICBEZWZpbmVkU1ZhbCBnZXRNZXRhZGF0YVN5bWJvbFZhbChjb25zdCB2b2lkICpzeW1ib2xUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbVJlZ2lvbiAqcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpleHByLCBRdWFsVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvdW50KTsKKworICBEZWZpbmVkU1ZhbCBnZXRNZW1iZXJQb2ludGVyKGNvbnN0IERlY2xhcmF0b3JEZWNsICpERCk7CisKKyAgRGVmaW5lZFNWYWwgZ2V0RnVuY3Rpb25Qb2ludGVyKGNvbnN0IEZ1bmN0aW9uRGVjbCAqZnVuYyk7CisgIAorICBEZWZpbmVkU1ZhbCBnZXRCbG9ja1BvaW50ZXIoY29uc3QgQmxvY2tEZWNsICpibG9jaywgQ2FuUXVhbFR5cGUgbG9jVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKmxvY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBibG9ja0NvdW50KTsKKworICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgXHAgRSwgaWYgaXQgY2FuIGJlIGRldGVybWluZWQgaW4gYSBub24tcGF0aC1zZW5zaXRpdmUKKyAgLy8vIG1hbm5lci4KKyAgLy8vCisgIC8vLyBJZiBccCBFIGlzIG5vdCBhIGNvbnN0YW50IG9yIGNhbm5vdCBiZSBtb2RlbGVkLCByZXR1cm5zIFxjIE5vbmUuCisgIE9wdGlvbmFsPFNWYWw+IGdldENvbnN0YW50VmFsKGNvbnN0IEV4cHIgKkUpOworCisgIE5vbkxvYyBtYWtlQ29tcG91bmRWYWwoUXVhbFR5cGUgdHlwZSwgbGx2bTo6SW1tdXRhYmxlTGlzdDxTVmFsPiB2YWxzKSB7CisgICAgcmV0dXJuIG5vbmxvYzo6Q29tcG91bmRWYWwoQmFzaWNWYWxzLmdldENvbXBvdW5kVmFsRGF0YSh0eXBlLCB2YWxzKSk7CisgIH0KKworICBOb25Mb2MgbWFrZUxhenlDb21wb3VuZFZhbChjb25zdCBTdG9yZVJlZiAmc3RvcmUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlZFZhbHVlUmVnaW9uICpyZWdpb24pIHsKKyAgICByZXR1cm4gbm9ubG9jOjpMYXp5Q29tcG91bmRWYWwoCisgICAgICAgIEJhc2ljVmFscy5nZXRMYXp5Q29tcG91bmRWYWxEYXRhKHN0b3JlLCByZWdpb24pKTsKKyAgfQorCisgIE5vbkxvYyBtYWtlUG9pbnRlclRvTWVtYmVyKGNvbnN0IERlY2xhcmF0b3JEZWNsICpERCkgeworICAgIHJldHVybiBub25sb2M6OlBvaW50ZXJUb01lbWJlcihERCk7CisgIH0KKworICBOb25Mb2MgbWFrZVBvaW50ZXJUb01lbWJlcihjb25zdCBQb2ludGVyVG9NZW1iZXJEYXRhICpQVE1EKSB7CisgICAgcmV0dXJuIG5vbmxvYzo6UG9pbnRlclRvTWVtYmVyKFBUTUQpOworICB9CisKKyAgTm9uTG9jIG1ha2VaZXJvQXJyYXlJbmRleCgpIHsKKyAgICByZXR1cm4gbm9ubG9jOjpDb25jcmV0ZUludChCYXNpY1ZhbHMuZ2V0VmFsdWUoMCwgQXJyYXlJbmRleFR5KSk7CisgIH0KKworICBOb25Mb2MgbWFrZUFycmF5SW5kZXgodWludDY0X3QgaWR4KSB7CisgICAgcmV0dXJuIG5vbmxvYzo6Q29uY3JldGVJbnQoQmFzaWNWYWxzLmdldFZhbHVlKGlkeCwgQXJyYXlJbmRleFR5KSk7CisgIH0KKworICBTVmFsIGNvbnZlcnRUb0FycmF5SW5kZXgoU1ZhbCB2YWwpOworCisgIG5vbmxvYzo6Q29uY3JldGVJbnQgbWFrZUludFZhbChjb25zdCBJbnRlZ2VyTGl0ZXJhbCogaW50ZWdlcikgeworICAgIHJldHVybiBub25sb2M6OkNvbmNyZXRlSW50KAorICAgICAgICBCYXNpY1ZhbHMuZ2V0VmFsdWUoaW50ZWdlci0+Z2V0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgIGludGVnZXItPmdldFR5cGUoKS0+aXNVbnNpZ25lZEludGVnZXJPckVudW1lcmF0aW9uVHlwZSgpKSk7CisgIH0KKworICBub25sb2M6OkNvbmNyZXRlSW50IG1ha2VCb29sVmFsKGNvbnN0IE9iakNCb29sTGl0ZXJhbEV4cHIgKmJvb2xlYW4pIHsKKyAgICByZXR1cm4gbWFrZVRydXRoVmFsKGJvb2xlYW4tPmdldFZhbHVlKCksIGJvb2xlYW4tPmdldFR5cGUoKSk7CisgIH0KKworICBub25sb2M6OkNvbmNyZXRlSW50IG1ha2VCb29sVmFsKGNvbnN0IENYWEJvb2xMaXRlcmFsRXhwciAqYm9vbGVhbik7CisKKyAgbm9ubG9jOjpDb25jcmV0ZUludCBtYWtlSW50VmFsKGNvbnN0IGxsdm06OkFQU0ludCYgaW50ZWdlcikgeworICAgIHJldHVybiBub25sb2M6OkNvbmNyZXRlSW50KEJhc2ljVmFscy5nZXRWYWx1ZShpbnRlZ2VyKSk7CisgIH0KKworICBsb2M6OkNvbmNyZXRlSW50IG1ha2VJbnRMb2NWYWwoY29uc3QgbGx2bTo6QVBTSW50ICZpbnRlZ2VyKSB7CisgICAgcmV0dXJuIGxvYzo6Q29uY3JldGVJbnQoQmFzaWNWYWxzLmdldFZhbHVlKGludGVnZXIpKTsKKyAgfQorCisgIE5vbkxvYyBtYWtlSW50VmFsKGNvbnN0IGxsdm06OkFQSW50JiBpbnRlZ2VyLCBib29sIGlzVW5zaWduZWQpIHsKKyAgICByZXR1cm4gbm9ubG9jOjpDb25jcmV0ZUludChCYXNpY1ZhbHMuZ2V0VmFsdWUoaW50ZWdlciwgaXNVbnNpZ25lZCkpOworICB9CisKKyAgRGVmaW5lZFNWYWwgbWFrZUludFZhbCh1aW50NjRfdCBpbnRlZ2VyLCBRdWFsVHlwZSB0eXBlKSB7CisgICAgaWYgKExvYzo6aXNMb2NUeXBlKHR5cGUpKQorICAgICAgcmV0dXJuIGxvYzo6Q29uY3JldGVJbnQoQmFzaWNWYWxzLmdldFZhbHVlKGludGVnZXIsIHR5cGUpKTsKKworICAgIHJldHVybiBub25sb2M6OkNvbmNyZXRlSW50KEJhc2ljVmFscy5nZXRWYWx1ZShpbnRlZ2VyLCB0eXBlKSk7CisgIH0KKworICBOb25Mb2MgbWFrZUludFZhbCh1aW50NjRfdCBpbnRlZ2VyLCBib29sIGlzVW5zaWduZWQpIHsKKyAgICByZXR1cm4gbm9ubG9jOjpDb25jcmV0ZUludChCYXNpY1ZhbHMuZ2V0SW50VmFsdWUoaW50ZWdlciwgaXNVbnNpZ25lZCkpOworICB9CisKKyAgTm9uTG9jIG1ha2VJbnRWYWxXaXRoUHRyV2lkdGgodWludDY0X3QgaW50ZWdlciwgYm9vbCBpc1Vuc2lnbmVkKSB7CisgICAgcmV0dXJuIG5vbmxvYzo6Q29uY3JldGVJbnQoCisgICAgICAgIEJhc2ljVmFscy5nZXRJbnRXaXRoUHRyV2lkdGgoaW50ZWdlciwgaXNVbnNpZ25lZCkpOworICB9CisKKyAgTm9uTG9jIG1ha2VMb2NBc0ludGVnZXIoTG9jIGxvYywgdW5zaWduZWQgYml0cykgeworICAgIHJldHVybiBub25sb2M6OkxvY0FzSW50ZWdlcihCYXNpY1ZhbHMuZ2V0UGVyc2lzdGVudFNWYWxXaXRoRGF0YShsb2MsIGJpdHMpKTsKKyAgfQorCisgIE5vbkxvYyBtYWtlTm9uTG9jKGNvbnN0IFN5bUV4cHIgKmxocywgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBvcCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBTSW50JiByaHMsIFF1YWxUeXBlIHR5cGUpOworCisgIE5vbkxvYyBtYWtlTm9uTG9jKGNvbnN0IGxsdm06OkFQU0ludCYgcmhzLCBCaW5hcnlPcGVyYXRvcjo6T3Bjb2RlIG9wLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTeW1FeHByICpsaHMsIFF1YWxUeXBlIHR5cGUpOworCisgIE5vbkxvYyBtYWtlTm9uTG9jKGNvbnN0IFN5bUV4cHIgKmxocywgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBvcCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ltRXhwciAqcmhzLCBRdWFsVHlwZSB0eXBlKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIE5vbkxvYyB2YWx1ZSBmb3IgY2FzdC4KKyAgTm9uTG9jIG1ha2VOb25Mb2MoY29uc3QgU3ltRXhwciAqb3BlcmFuZCwgUXVhbFR5cGUgZnJvbVR5LCBRdWFsVHlwZSB0b1R5KTsKKworICBub25sb2M6OkNvbmNyZXRlSW50IG1ha2VUcnV0aFZhbChib29sIGIsIFF1YWxUeXBlIHR5cGUpIHsKKyAgICByZXR1cm4gbm9ubG9jOjpDb25jcmV0ZUludChCYXNpY1ZhbHMuZ2V0VHJ1dGhWYWx1ZShiLCB0eXBlKSk7CisgIH0KKworICBub25sb2M6OkNvbmNyZXRlSW50IG1ha2VUcnV0aFZhbChib29sIGIpIHsKKyAgICByZXR1cm4gbm9ubG9jOjpDb25jcmV0ZUludChCYXNpY1ZhbHMuZ2V0VHJ1dGhWYWx1ZShiKSk7CisgIH0KKworICAvLy8gQ3JlYXRlIE5VTEwgcG9pbnRlciwgd2l0aCBwcm9wZXIgcG9pbnRlciBiaXQtd2lkdGggZm9yIGdpdmVuIGFkZHJlc3MKKyAgLy8vIHNwYWNlLgorICAvLy8gXHBhcmFtIHR5cGUgcG9pbnRlciB0eXBlLgorICBMb2MgbWFrZU51bGxXaXRoVHlwZShRdWFsVHlwZSB0eXBlKSB7CisgICAgcmV0dXJuIGxvYzo6Q29uY3JldGVJbnQoQmFzaWNWYWxzLmdldFplcm9XaXRoVHlwZVNpemUodHlwZSkpOworICB9CisKKyAgTG9jIG1ha2VOdWxsKCkgeworICAgIHJldHVybiBsb2M6OkNvbmNyZXRlSW50KEJhc2ljVmFscy5nZXRaZXJvV2l0aFB0cldpZHRoKCkpOworICB9CisKKyAgTG9jIG1ha2VMb2MoU3ltYm9sUmVmIHN5bSkgeworICAgIHJldHVybiBsb2M6Ok1lbVJlZ2lvblZhbChNZW1NZ3IuZ2V0U3ltYm9saWNSZWdpb24oc3ltKSk7CisgIH0KKworICBMb2MgbWFrZUxvYyhjb25zdCBNZW1SZWdpb24qIHJlZ2lvbikgeworICAgIHJldHVybiBsb2M6Ok1lbVJlZ2lvblZhbChyZWdpb24pOworICB9CisKKyAgTG9jIG1ha2VMb2MoY29uc3QgQWRkckxhYmVsRXhwciAqZXhwcikgeworICAgIHJldHVybiBsb2M6OkdvdG9MYWJlbChleHByLT5nZXRMYWJlbCgpKTsKKyAgfQorCisgIExvYyBtYWtlTG9jKGNvbnN0IGxsdm06OkFQU0ludCYgaW50ZWdlcikgeworICAgIHJldHVybiBsb2M6OkNvbmNyZXRlSW50KEJhc2ljVmFscy5nZXRWYWx1ZShpbnRlZ2VyKSk7CisgIH0KKworICAvLy8gUmV0dXJuIGEgbWVtb3J5IHJlZ2lvbiBmb3IgdGhlICd0aGlzJyBvYmplY3QgcmVmZXJlbmNlLgorICBsb2M6Ok1lbVJlZ2lvblZhbCBnZXRDWFhUaGlzKGNvbnN0IENYWE1ldGhvZERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKlNGQyk7CisKKyAgLy8vIFJldHVybiBhIG1lbW9yeSByZWdpb24gZm9yIHRoZSAndGhpcycgb2JqZWN0IHJlZmVyZW5jZS4KKyAgbG9jOjpNZW1SZWdpb25WYWwgZ2V0Q1hYVGhpcyhjb25zdCBDWFhSZWNvcmREZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpTRkMpOworfTsKKworU1ZhbEJ1aWxkZXIqIGNyZWF0ZVNpbXBsZVNWYWxCdWlsZGVyKGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgJmFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVENvbnRleHQgJmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0YXRlTWFuYWdlciAmc3RhdGVNZ3IpOworCit9IC8vIG5hbWVzcGFjZSBlbnRvCisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9TVkFMQlVJTERFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU1ZhbFZpc2l0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TVmFsVmlzaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4N2ZkY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU1ZhbFZpc2l0b3IuaApAQCAtMCwwICsxLDE1MSBAQAorLy89PT0tLS0gU1ZhbFZpc2l0b3IuaCAtIFZpc2l0b3IgZm9yIFNWYWwgc3ViY2xhc3NlcyAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIFNWYWxWaXNpdG9yLCBTeW1FeHByVmlzaXRvciwgYW5kIE1lbVJlZ2lvblZpc2l0b3IKKy8vICBpbnRlcmZhY2VzLCBhbmQgYWxzbyBGdWxsU1ZhbFZpc2l0b3IsIHdoaWNoIHZpc2l0cyBhbGwgdGhyZWUgaGllcmFyY2hpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9TVkFMVklTSVRPUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX1NWQUxWSVNJVE9SX0gKKworI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TVmFscy5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TeW1ib2xNYW5hZ2VyLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL01lbVJlZ2lvbi5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCituYW1lc3BhY2UgZW50byB7CisKKy8vLyBTVmFsVmlzaXRvciAtIHRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNpbXBsZSB2aXNpdG9yIGZvciBTVmFsCisvLy8gc3ViY2xhc3Nlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsQ2xhc3MsIHR5cGVuYW1lIFJldFR5ID0gdm9pZD4gY2xhc3MgU1ZhbFZpc2l0b3IgeworcHVibGljOgorCisjZGVmaW5lIERJU1BBVENIKE5BTUUsIENMQVNTKSBcCisgIHJldHVybiBzdGF0aWNfY2FzdDxJbXBsQ2xhc3MgKj4odGhpcyktPlZpc2l0ICMjIE5BTUUoVi5jYXN0QXM8Q0xBU1M+KCkpCisKKyAgUmV0VHkgVmlzaXQoU1ZhbCBWKSB7CisgICAgLy8gRGlzcGF0Y2ggdG8gVmlzaXRGb29WYWwgZm9yIGVhY2ggRm9vVmFsLgorICAgIC8vIFRha2UgbmFtZXNwYWNlcyAobG9jOjogYW5kIG5vbmxvYzo6KSBpbnRvIGFjY291bnQuCisgICAgc3dpdGNoIChWLmdldEJhc2VLaW5kKCkpIHsKKyNkZWZpbmUgQkFTSUNfU1ZBTChJZCwgUGFyZW50KSBjYXNlIFNWYWw6OklkICMjIEtpbmQ6IERJU1BBVENIKElkLCBJZCk7CisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1NWYWxzLmRlZiIKKyAgICBjYXNlIFNWYWw6OkxvY0tpbmQ6CisgICAgICBzd2l0Y2ggKFYuZ2V0U3ViS2luZCgpKSB7CisjZGVmaW5lIExPQ19TVkFMKElkLCBQYXJlbnQpIFwKKyAgICAgIGNhc2UgbG9jOjpJZCAjIyBLaW5kOiBESVNQQVRDSChMb2MgIyMgSWQsIGxvYyA6OiBJZCk7CisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1NWYWxzLmRlZiIKKyAgICAgIH0KKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gTG9jIHN1Yi1raW5kISIpOworICAgIGNhc2UgU1ZhbDo6Tm9uTG9jS2luZDoKKyAgICAgIHN3aXRjaCAoVi5nZXRTdWJLaW5kKCkpIHsKKyNkZWZpbmUgTk9OTE9DX1NWQUwoSWQsIFBhcmVudCkgXAorICAgICAgY2FzZSBub25sb2M6OklkICMjIEtpbmQ6IERJU1BBVENIKE5vbkxvYyAjIyBJZCwgbm9ubG9jIDo6IElkKTsKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU1ZhbHMuZGVmIgorICAgICAgfQorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBOb25Mb2Mgc3ViLWtpbmQhIik7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gU1ZhbCBraW5kISIpOworICB9CisKKyNkZWZpbmUgQkFTSUNfU1ZBTChJZCwgUGFyZW50KSBcCisgIFJldFR5IFZpc2l0ICMjIElkKElkIFYpIHsgRElTUEFUQ0goUGFyZW50LCBJZCk7IH0KKyNkZWZpbmUgQUJTVFJBQ1RfU1ZBTChJZCwgUGFyZW50KSBcCisgIEJBU0lDX1NWQUwoSWQsIFBhcmVudCkKKyNkZWZpbmUgTE9DX1NWQUwoSWQsIFBhcmVudCkgXAorICBSZXRUeSBWaXNpdExvYyAjIyBJZChsb2M6OklkIFYpIHsgRElTUEFUQ0goUGFyZW50LCBQYXJlbnQpOyB9CisjZGVmaW5lIE5PTkxPQ19TVkFMKElkLCBQYXJlbnQpIFwKKyAgUmV0VHkgVmlzaXROb25Mb2MgIyMgSWQobm9ubG9jOjpJZCBWKSB7IERJU1BBVENIKFBhcmVudCwgUGFyZW50KTsgfQorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TVmFscy5kZWYiCisKKyAgLy8gQmFzZSBjYXNlLCBpZ25vcmUgaXQuIDopCisgIFJldFR5IFZpc2l0U1ZhbChTVmFsIFYpIHsgcmV0dXJuIFJldFR5KCk7IH0KKworI3VuZGVmIERJU1BBVENICit9OworCisvLy8gU3ltRXhwclZpc2l0b3IgLSB0aGlzIGNsYXNzIGltcGxlbWVudHMgYSBzaW1wbGUgdmlzaXRvciBmb3IgU3ltRXhwcgorLy8vIHN1YmNsYXNzZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbENsYXNzLCB0eXBlbmFtZSBSZXRUeSA9IHZvaWQ+IGNsYXNzIFN5bUV4cHJWaXNpdG9yIHsKK3B1YmxpYzoKKworI2RlZmluZSBESVNQQVRDSChDTEFTUykgXAorICAgIHJldHVybiBzdGF0aWNfY2FzdDxJbXBsQ2xhc3MgKj4odGhpcyktPlZpc2l0ICMjIENMQVNTKGNhc3Q8Q0xBU1M+KFMpKQorCisgIFJldFR5IFZpc2l0KFN5bWJvbFJlZiBTKSB7CisgICAgLy8gRGlzcGF0Y2ggdG8gVmlzaXRTeW1ib2xGb28gZm9yIGVhY2ggU3ltYm9sRm9vLgorICAgIHN3aXRjaCAoUy0+Z2V0S2luZCgpKSB7CisjZGVmaW5lIFNZTUJPTChJZCwgUGFyZW50KSBcCisgICAgY2FzZSBTeW1FeHByOjpJZCAjIyBLaW5kOiBESVNQQVRDSChJZCk7CisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N5bWJvbHMuZGVmIgorICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIFN5bUV4cHIga2luZCEiKTsKKyAgfQorCisgIC8vIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBjaG9vc2VzIG5vdCB0byBpbXBsZW1lbnQgYSBjZXJ0YWluIHZpc2l0IG1ldGhvZCwgZmFsbAorICAvLyBiYWNrIG9uIHZpc2l0aW5nIHRoZSBzdXBlcmNsYXNzLgorI2RlZmluZSBTWU1CT0woSWQsIFBhcmVudCkgUmV0VHkgVmlzaXQgIyMgSWQoY29uc3QgSWQgKlMpIHsgRElTUEFUQ0goUGFyZW50KTsgfQorI2RlZmluZSBBQlNUUkFDVF9TWU1CT0woSWQsIFBhcmVudCkgU1lNQk9MKElkLCBQYXJlbnQpCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N5bWJvbHMuZGVmIgorCisgIC8vIEJhc2UgY2FzZSwgaWdub3JlIGl0LiA6KQorICBSZXRUeSBWaXNpdFN5bUV4cHIoU3ltYm9sUmVmIFMpIHsgcmV0dXJuIFJldFR5KCk7IH0KKworI3VuZGVmIERJU1BBVENICit9OworCisvLy8gTWVtUmVnaW9uVmlzaXRvciAtIHRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNpbXBsZSB2aXNpdG9yIGZvciBNZW1SZWdpb24KKy8vLyBzdWJjbGFzc2VzLgordGVtcGxhdGUgPHR5cGVuYW1lIEltcGxDbGFzcywgdHlwZW5hbWUgUmV0VHkgPSB2b2lkPiBjbGFzcyBNZW1SZWdpb25WaXNpdG9yIHsKK3B1YmxpYzoKKworI2RlZmluZSBESVNQQVRDSChDTEFTUykgXAorICByZXR1cm4gc3RhdGljX2Nhc3Q8SW1wbENsYXNzICo+KHRoaXMpLT5WaXNpdCAjIyBDTEFTUyhjYXN0PENMQVNTPihSKSkKKworICBSZXRUeSBWaXNpdChjb25zdCBNZW1SZWdpb24gKlIpIHsKKyAgICAvLyBEaXNwYXRjaCB0byBWaXNpdEZvb1JlZ2lvbiBmb3IgZWFjaCBGb29SZWdpb24uCisgICAgc3dpdGNoIChSLT5nZXRLaW5kKCkpIHsKKyNkZWZpbmUgUkVHSU9OKElkLCBQYXJlbnQpIGNhc2UgTWVtUmVnaW9uOjpJZCAjIyBLaW5kOiBESVNQQVRDSChJZCk7CisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1JlZ2lvbnMuZGVmIgorICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIE1lbVJlZ2lvbiBraW5kISIpOworICB9CisKKyAgLy8gSWYgdGhlIGltcGxlbWVudGF0aW9uIGNob29zZXMgbm90IHRvIGltcGxlbWVudCBhIGNlcnRhaW4gdmlzaXQgbWV0aG9kLCBmYWxsCisgIC8vIGJhY2sgb24gdmlzaXRpbmcgdGhlIHN1cGVyY2xhc3MuCisjZGVmaW5lIFJFR0lPTihJZCwgUGFyZW50KSBcCisgIFJldFR5IFZpc2l0ICMjIElkKGNvbnN0IElkICpSKSB7IERJU1BBVENIKFBhcmVudCk7IH0KKyNkZWZpbmUgQUJTVFJBQ1RfUkVHSU9OKElkLCBQYXJlbnQpIFwKKyAgUkVHSU9OKElkLCBQYXJlbnQpCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1JlZ2lvbnMuZGVmIgorCisgIC8vIEJhc2UgY2FzZSwgaWdub3JlIGl0LiA6KQorICBSZXRUeSBWaXNpdE1lbVJlZ2lvbihjb25zdCBNZW1SZWdpb24gKlIpIHsgcmV0dXJuIFJldFR5KCk7IH0KKworI3VuZGVmIERJU1BBVENICit9OworCisvLy8gRnVsbFNWYWxWaXNpdG9yIC0gYSBjb252ZW5pZW50IG1peGVkIHZpc2l0b3IgZm9yIGFsbCB0aHJlZToKKy8vLyBTVmFsLCBTeW1FeHByIGFuZCBNZW1SZWdpb24gc3ViY2xhc3Nlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsQ2xhc3MsIHR5cGVuYW1lIFJldFR5ID0gdm9pZD4KK2NsYXNzIEZ1bGxTVmFsVmlzaXRvciA6IHB1YmxpYyBTVmFsVmlzaXRvcjxJbXBsQ2xhc3MsIFJldFR5PiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTeW1FeHByVmlzaXRvcjxJbXBsQ2xhc3MsIFJldFR5PiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZW1SZWdpb25WaXNpdG9yPEltcGxDbGFzcywgUmV0VHk+IHsKK3B1YmxpYzoKKyAgdXNpbmcgU1ZhbFZpc2l0b3I8SW1wbENsYXNzLCBSZXRUeT46OlZpc2l0OworICB1c2luZyBTeW1FeHByVmlzaXRvcjxJbXBsQ2xhc3MsIFJldFR5Pjo6VmlzaXQ7CisgIHVzaW5nIE1lbVJlZ2lvblZpc2l0b3I8SW1wbENsYXNzLCBSZXRUeT46OlZpc2l0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGVudG8KKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1NWYWxzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TVmFscy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlMzA5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TVmFscy5kZWYKQEAgLTAsMCArMSw3NSBAQAorLy89PT0tLSBTVmFscy5kZWYgLSBNZXRhZGF0YSBhYm91dCBTVmFsIGtpbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGUgbGlzdCBvZiBzeW1ib2xpYyB2YWx1ZXMgKFNWYWwga2luZHMgYW5kIHN1Yi1raW5kcykgdXNlZCBpbiB0aGUgU3RhdGljCisvLyBBbmFseXplci4gVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gbG9jOjogYW5kIG5vbmxvYzo6IFNWYWwgbmFtZXNwYWNlcyBpcworLy8gY3VycmVudGx5IGhhcmRjb2RlZCwgYmVjYXVzZSBpdCBpcyB0b28gcGVjdWxpYXIgYW5kIGV4cGxpY2l0IHRvIGJlIGhhbmRsZWQKKy8vIHVuaWZvcm1seS4gSW4gb3JkZXIgdG8gdXNlIHRoaXMgaW5mb3JtYXRpb24sIHVzZXJzIG9mIHRoaXMgZmlsZSBtdXN0IGRlZmluZQorLy8gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBtYWNyb3M6CisvLworLy8gQkFTSUNfU1ZBTChJZCwgUGFyZW50KSAtIGZvciBzcGVjaWZpYyBTVmFsIHN1Yi1raW5kcywgd2hpY2ggYXJlCisvLyBuZWl0aGVyIGluIGxvYzo6IG5vciBpbiBub25sb2M6OiBuYW1lc3BhY2U7IHRoZXNlIGNsYXNzZXMgb2NjdXB5CisvLyB0aGVpciBvd24gYmFzZSBraW5kIElkS2luZC4KKy8vCisvLyBBQlNUUkFDVF9TVkFMKElkLCBQYXJlbnQpIC0gZm9yIGFic3RyYWN0IFNWYWwgY2xhc3NlcyB3aGljaCBhcmUKKy8vIG5laXRoZXIgaW4gbG9jOjogbm9yIGluIG5vbmxvYzo6IG5hbWVzcGFjZSwKKy8vCisvLyBBQlNUUkFDVF9TVkFMX1dJVEhfS0lORChJZCwgUGFyZW50KSAtIGZvciBTVmFsIGNsYXNzZXMgd2hpY2ggYXJlIGFsc28KKy8vIG5laXRoZXIgaW4gbG9jOjogbm9yIGluIG5vbmxvYzo6IG5hbWVzcGFjZSwgYnV0IG9jY3VweSBhIHdob2xlIGJhc2Uga2luZAorLy8gaWRlbnRpZmllciBJZEtpbmQsIG11Y2ggbGlrZSBCQVNJQ19TVkFMcy4KKy8vCisvLyBMT0NfU1ZBTChJZCwgUGFyZW50KSAtIGZvciB2YWx1ZXMgaW4gbG9jOjogbmFtZXNwYWNlLCB3aGljaCBvY2N1cHkgYSBzdWIta2luZAorLy8gbG9jOjpJZEtpbmQuCisvLworLy8gTk9OTE9DX1NWQUwoSWQsIFBhcmVudCkgLSBmb3IgdmFsdWVzIGluIG5vbmxvYzo6IG5hbWVzcGFjZSwgd2hpY2ggb2NjdXB5IGEKKy8vIHN1Yi1raW5kIG5vbmxvYzo6SWRLaW5kLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQkFTSUNfU1ZBTAorI2RlZmluZSBCQVNJQ19TVkFMKElkLCBQYXJlbnQpCisjZW5kaWYKKworI2lmbmRlZiBBQlNUUkFDVF9TVkFMCisjZGVmaW5lIEFCU1RSQUNUX1NWQUwoSWQsIFBhcmVudCkKKyNlbmRpZgorCisjaWZuZGVmIEFCU1RSQUNUX1NWQUxfV0lUSF9LSU5ECisjZGVmaW5lIEFCU1RSQUNUX1NWQUxfV0lUSF9LSU5EKElkLCBQYXJlbnQpIEFCU1RSQUNUX1NWQUwoSWQsIFBhcmVudCkKKyNlbmRpZgorCisjaWZuZGVmIExPQ19TVkFMCisjZGVmaW5lIExPQ19TVkFMKElkLCBQYXJlbnQpCisjZW5kaWYKKworI2lmbmRlZiBOT05MT0NfU1ZBTAorI2RlZmluZSBOT05MT0NfU1ZBTChJZCwgUGFyZW50KQorI2VuZGlmCisKK0JBU0lDX1NWQUwoVW5kZWZpbmVkVmFsLCBTVmFsKQorQUJTVFJBQ1RfU1ZBTChEZWZpbmVkT3JVbmtub3duU1ZhbCwgU1ZhbCkKKyAgQkFTSUNfU1ZBTChVbmtub3duVmFsLCBEZWZpbmVkT3JVbmtub3duU1ZhbCkKKyAgQUJTVFJBQ1RfU1ZBTChEZWZpbmVkU1ZhbCwgRGVmaW5lZE9yVW5rbm93blNWYWwpCisgICAgQUJTVFJBQ1RfU1ZBTF9XSVRIX0tJTkQoTG9jLCBEZWZpbmVkU1ZhbCkKKyAgICAgIExPQ19TVkFMKENvbmNyZXRlSW50LCBMb2MpCisgICAgICBMT0NfU1ZBTChHb3RvTGFiZWwsIExvYykKKyAgICAgIExPQ19TVkFMKE1lbVJlZ2lvblZhbCwgTG9jKQorICAgIEFCU1RSQUNUX1NWQUxfV0lUSF9LSU5EKE5vbkxvYywgRGVmaW5lZFNWYWwpCisgICAgICBOT05MT0NfU1ZBTChDb21wb3VuZFZhbCwgTm9uTG9jKQorICAgICAgTk9OTE9DX1NWQUwoQ29uY3JldGVJbnQsIE5vbkxvYykKKyAgICAgIE5PTkxPQ19TVkFMKExhenlDb21wb3VuZFZhbCwgTm9uTG9jKQorICAgICAgTk9OTE9DX1NWQUwoTG9jQXNJbnRlZ2VyLCBOb25Mb2MpCisgICAgICBOT05MT0NfU1ZBTChTeW1ib2xWYWwsIE5vbkxvYykKKyAgICAgIE5PTkxPQ19TVkFMKFBvaW50ZXJUb01lbWJlciwgTm9uTG9jKQorCisjdW5kZWYgTk9OTE9DX1NWQUwKKyN1bmRlZiBMT0NfU1ZBTAorI3VuZGVmIEFCU1RSQUNUX1NWQUxfV0lUSF9LSU5ECisjdW5kZWYgQUJTVFJBQ1RfU1ZBTAorI3VuZGVmIEJBU0lDX1NWQUwKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TVmFscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1NWYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY1MDdmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TVmFscy5oCkBAIC0wLDAgKzEsNjc5IEBACisvLz09PS0gU1ZhbHMuaCAtIEFic3RyYWN0IFZhbHVlcyBmb3IgU3RhdGljIEFuYWx5c2lzIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyBTVmFsLCBMb2MsIGFuZCBOb25Mb2MsIGNsYXNzZXMgdGhhdCByZXByZXNlbnQKKy8vICBhYnN0cmFjdCByLXZhbHVlcyBmb3IgdXNlIHdpdGggcGF0aC1zZW5zaXRpdmUgdmFsdWUgdHJhY2tpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9TVkFMU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX1NWQUxTX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N5bUV4cHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW1tdXRhYmxlTGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKy8vPT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PS8vCisvLyAgQmFzZSBTVmFsIHR5cGVzLgorLy89PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09Ly8KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQ1hYQmFzZVNwZWNpZmllcjsKK2NsYXNzIERlY2xhcmF0b3JEZWNsOworY2xhc3MgRnVuY3Rpb25EZWNsOworY2xhc3MgTGFiZWxEZWNsOworCituYW1lc3BhY2UgZW50byB7CisKK2NsYXNzIEJhc2ljVmFsdWVGYWN0b3J5OworY2xhc3MgQ29tcG91bmRWYWxEYXRhOworY2xhc3MgTGF6eUNvbXBvdW5kVmFsRGF0YTsKK2NsYXNzIE1lbVJlZ2lvbjsKK2NsYXNzIFBvaW50ZXJUb01lbWJlckRhdGE7CitjbGFzcyBTVmFsQnVpbGRlcjsKK2NsYXNzIFR5cGVkVmFsdWVSZWdpb247CisKK25hbWVzcGFjZSBub25sb2MgeworCisvLy8gU3ViLWtpbmRzIGZvciBOb25Mb2MgdmFsdWVzLgorZW51bSBLaW5kIHsKKyNkZWZpbmUgTk9OTE9DX1NWQUwoSWQsIFBhcmVudCkgSWQgIyMgS2luZCwKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU1ZhbHMuZGVmIgorfTsKKworfSAvLyBuYW1lc3BhY2Ugbm9ubG9jCisKK25hbWVzcGFjZSBsb2MgeworCisvLy8gU3ViLWtpbmRzIGZvciBMb2MgdmFsdWVzLgorZW51bSBLaW5kIHsKKyNkZWZpbmUgTE9DX1NWQUwoSWQsIFBhcmVudCkgSWQgIyMgS2luZCwKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU1ZhbHMuZGVmIgorfTsKKworfSAvLyBuYW1lc3BhY2UgbG9jCisKKy8vLyBTVmFsIC0gVGhpcyByZXByZXNlbnRzIGEgc3ltYm9saWMgZXhwcmVzc2lvbiwgd2hpY2ggY2FuIGJlIGVpdGhlcgorLy8vICBhbiBMLXZhbHVlIG9yIGFuIFItdmFsdWUuCisvLy8KK2NsYXNzIFNWYWwgeworcHVibGljOgorICBlbnVtIEJhc2VLaW5kIHsKKyAgICAvLyBUaGUgZW51bWVyYXRvcnMgbXVzdCBiZSByZXByZXNlbnRhYmxlIHVzaW5nIDIgYml0cy4KKyNkZWZpbmUgQkFTSUNfU1ZBTChJZCwgUGFyZW50KSBJZCAjIyBLaW5kLAorI2RlZmluZSBBQlNUUkFDVF9TVkFMX1dJVEhfS0lORChJZCwgUGFyZW50KSBJZCAjIyBLaW5kLAorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TVmFscy5kZWYiCisgIH07CisgIGVudW0geyBCYXNlQml0cyA9IDIsIEJhc2VNYXNrID0gMHgzIH07CisKK3Byb3RlY3RlZDoKKyAgY29uc3Qgdm9pZCAqRGF0YSA9IG51bGxwdHI7CisKKyAgLy8vIFRoZSBsb3dlc3QgMiBiaXRzIGFyZSBhIEJhc2VLaW5kICgwIC0tIDMpLgorICAvLy8gIFRoZSBoaWdoZXIgYml0cyBhcmUgYW4gdW5zaWduZWQgImtpbmQiIHZhbHVlLgorICB1bnNpZ25lZCBLaW5kID0gMDsKKworICBleHBsaWNpdCBTVmFsKGNvbnN0IHZvaWQgKmQsIGJvb2wgaXNMb2MsIHVuc2lnbmVkIFZhbEtpbmQpCisgICAgICA6IERhdGEoZCksIEtpbmQoKGlzTG9jID8gTG9jS2luZCA6IE5vbkxvY0tpbmQpIHwgKFZhbEtpbmQgPDwgQmFzZUJpdHMpKSB7fQorCisgIGV4cGxpY2l0IFNWYWwoQmFzZUtpbmQgaywgY29uc3Qgdm9pZCAqRCA9IG51bGxwdHIpIDogRGF0YShEKSwgS2luZChrKSB7fQorCitwdWJsaWM6CisgIGV4cGxpY2l0IFNWYWwoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBDb252ZXJ0IHRvIHRoZSBzcGVjaWZpZWQgU1ZhbCB0eXBlLCBhc3NlcnRpbmcgdGhhdCB0aGlzIFNWYWwgaXMgb2YKKyAgLy8vIHRoZSBkZXNpcmVkIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIFQgY2FzdEFzKCkgY29uc3QgeworICAgIGFzc2VydChUOjppc0tpbmQoKnRoaXMpKTsKKyAgICByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IFQgKj4odGhpcyk7CisgIH0KKworICAvLy8gXGJyaWVmIENvbnZlcnQgdG8gdGhlIHNwZWNpZmllZCBTVmFsIHR5cGUsIHJldHVybmluZyBOb25lIGlmIHRoaXMgU1ZhbCBpcworICAvLy8gbm90IG9mIHRoZSBkZXNpcmVkIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIE9wdGlvbmFsPFQ+IGdldEFzKCkgY29uc3QgeworICAgIGlmICghVDo6aXNLaW5kKCp0aGlzKSkKKyAgICAgIHJldHVybiBOb25lOworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgVCAqPih0aGlzKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFJhd0tpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisgIEJhc2VLaW5kIGdldEJhc2VLaW5kKCkgY29uc3QgeyByZXR1cm4gKEJhc2VLaW5kKSAoS2luZCAmIEJhc2VNYXNrKTsgfQorICB1bnNpZ25lZCBnZXRTdWJLaW5kKCkgY29uc3QgeyByZXR1cm4gKEtpbmQgJiB+QmFzZU1hc2spID4+IEJhc2VCaXRzOyB9CisKKyAgLy8gVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIHVzaW5nIFNWYWwgaW4gYSBGb2xkaW5nU2V0Tm9kZS4gIEl0CisgIC8vIGV4dHJhY3RzIGEgdW5pcXVlIHNpZ25hdHVyZSBmb3IgdGhpcyBTVmFsIG9iamVjdC4KKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7CisgICAgSUQuQWRkSW50ZWdlcigodW5zaWduZWQpIGdldFJhd0tpbmQoKSk7CisgICAgSUQuQWRkUG9pbnRlcihEYXRhKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTVmFsICZSKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFJhd0tpbmQoKSA9PSBSLmdldFJhd0tpbmQoKSAmJiBEYXRhID09IFIuRGF0YTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTVmFsICZSKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gUik7CisgIH0KKworICBib29sIGlzVW5rbm93bigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UmF3S2luZCgpID09IFVua25vd25WYWxLaW5kOworICB9CisKKyAgYm9vbCBpc1VuZGVmKCkgY29uc3QgeworICAgIHJldHVybiBnZXRSYXdLaW5kKCkgPT0gVW5kZWZpbmVkVmFsS2luZDsKKyAgfQorCisgIGJvb2wgaXNVbmtub3duT3JVbmRlZigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UmF3S2luZCgpIDw9IFVua25vd25WYWxLaW5kOworICB9CisKKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgIHJldHVybiBnZXRSYXdLaW5kKCkgPiBVbmtub3duVmFsS2luZDsKKyAgfQorCisgIGJvb2wgaXNDb25zdGFudCgpIGNvbnN0OworCisgIGJvb2wgaXNDb25zdGFudChpbnQgSSkgY29uc3Q7CisKKyAgYm9vbCBpc1plcm9Db25zdGFudCgpIGNvbnN0OworCisgIC8vLyBoYXNDb25qdXJlZFN5bWJvbCAtIElmIHRoaXMgU1ZhbCB3cmFwcyBhIGNvbmp1cmVkIHN5bWJvbCwgcmV0dXJuIHRydWU7CisgIGJvb2wgaGFzQ29uanVyZWRTeW1ib2woKSBjb25zdDsKKworICAvLy8gZ2V0QXNGdW5jdGlvbkRlY2wgLSBJZiB0aGlzIFNWYWwgaXMgYSBNZW1SZWdpb25WYWwgYW5kIHdyYXBzIGEKKyAgLy8vIENvZGVUZXh0UmVnaW9uIHdyYXBwaW5nIGEgRnVuY3Rpb25EZWNsLCByZXR1cm4gdGhhdCBGdW5jdGlvbkRlY2wuCisgIC8vLyBPdGhlcndpc2UgcmV0dXJuIDAuCisgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqZ2V0QXNGdW5jdGlvbkRlY2woKSBjb25zdDsKKworICAvLy8gXGJyaWVmIElmIHRoaXMgU1ZhbCBpcyBhIGxvY2F0aW9uIGFuZCB3cmFwcyBhIHN5bWJvbCwgcmV0dXJuIHRoYXQKKyAgLy8vICBTeW1ib2xSZWYuIE90aGVyd2lzZSByZXR1cm4gMC4KKyAgLy8vCisgIC8vLyBDYXN0cyBhcmUgaWdub3JlZCBkdXJpbmcgbG9va3VwLgorICAvLy8gXHBhcmFtIEluY2x1ZGVCYXNlUmVnaW9ucyBUaGUgYm9vbGVhbiB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgdGhlIHNlYXJjaAorICAvLy8gc2hvdWxkIGNvbnRpbnVlIHRvIHRoZSBiYXNlIHJlZ2lvbnMgaWYgdGhlIHJlZ2lvbiBpcyBub3Qgc3ltYm9saWMuCisgIFN5bWJvbFJlZiBnZXRBc0xvY1N5bWJvbChib29sIEluY2x1ZGVCYXNlUmVnaW9ucyA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBzeW1ib2wgaW4gdGhlIFNWYWwgb3IgaXRzIGJhc2UgcmVnaW9uLgorICBTeW1ib2xSZWYgZ2V0TG9jU3ltYm9sSW5CYXNlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJZiB0aGlzIFNWYWwgd3JhcHMgYSBzeW1ib2wgcmV0dXJuIHRoYXQgU3ltYm9sUmVmLgorICAvLy8gT3RoZXJ3aXNlLCByZXR1cm4gMC4KKyAgLy8vCisgIC8vLyBDYXN0cyBhcmUgaWdub3JlZCBkdXJpbmcgbG9va3VwLgorICAvLy8gXHBhcmFtIEluY2x1ZGVCYXNlUmVnaW9ucyBUaGUgYm9vbGVhbiB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgdGhlIHNlYXJjaAorICAvLy8gc2hvdWxkIGNvbnRpbnVlIHRvIHRoZSBiYXNlIHJlZ2lvbnMgaWYgdGhlIHJlZ2lvbiBpcyBub3Qgc3ltYm9saWMuCisgIFN5bWJvbFJlZiBnZXRBc1N5bWJvbChib29sIEluY2x1ZGVCYXNlUmVnaW9ucyA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gZ2V0QXNTeW1ib2xpY0V4cHJlc3Npb24gLSBJZiB0aGlzIFN2YWwgd3JhcHMgYSBzeW1ib2xpYyBleHByZXNzaW9uIHRoZW4KKyAgLy8vICByZXR1cm4gdGhhdCBleHByZXNzaW9uLiAgT3RoZXJ3aXNlIHJldHVybiBOVUxMLgorICBjb25zdCBTeW1FeHByICpnZXRBc1N5bWJvbGljRXhwcmVzc2lvbigpIGNvbnN0OworCisgIGNvbnN0IFN5bUV4cHIgKmdldEFzU3ltRXhwcigpIGNvbnN0OworCisgIGNvbnN0IE1lbVJlZ2lvbiAqZ2V0QXNSZWdpb24oKSBjb25zdDsKKworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICBTeW1FeHByOjpzeW1ib2xfaXRlcmF0b3Igc3ltYm9sX2JlZ2luKCkgY29uc3QgeworICAgIGNvbnN0IFN5bUV4cHIgKlNFID0gZ2V0QXNTeW1ib2woLypJbmNsdWRlQmFzZVJlZ2lvbnM9Ki90cnVlKTsKKyAgICBpZiAoU0UpCisgICAgICByZXR1cm4gU0UtPnN5bWJvbF9iZWdpbigpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBTeW1FeHByOjpzeW1ib2xfaXRlcmF0b3IoKTsKKyAgfQorCisgIFN5bUV4cHI6OnN5bWJvbF9pdGVyYXRvciBzeW1ib2xfZW5kKCkgY29uc3QgeyAKKyAgICByZXR1cm4gU3ltRXhwcjo6c3ltYm9sX2VuZCgpOworICB9Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJm9zLCBjbGFuZzo6ZW50bzo6U1ZhbCBWKSB7CisgIFYuZHVtcFRvU3RyZWFtKG9zKTsKKyAgcmV0dXJuIG9zOworfQorCitjbGFzcyBVbmRlZmluZWRWYWwgOiBwdWJsaWMgU1ZhbCB7CitwdWJsaWM6CisgIFVuZGVmaW5lZFZhbCgpIDogU1ZhbChVbmRlZmluZWRWYWxLaW5kKSB7fQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU1ZhbDsKKworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgU1ZhbCYgVikgeworICAgIHJldHVybiBWLmdldEJhc2VLaW5kKCkgPT0gVW5kZWZpbmVkVmFsS2luZDsKKyAgfQorfTsKKworY2xhc3MgRGVmaW5lZE9yVW5rbm93blNWYWwgOiBwdWJsaWMgU1ZhbCB7CitwdWJsaWM6CisgIC8vIFdlIHdhbnQgY2FsbGluZyB0aGVzZSBtZXRob2RzIHRvIGJlIGEgY29tcGlsZXIgZXJyb3Igc2luY2UgdGhleSBhcmUKKyAgLy8gdGF1dG9sb2dpY2FsbHkgZmFsc2UuCisgIGJvb2wgaXNVbmRlZigpIGNvbnN0ID0gZGVsZXRlOworICBib29sIGlzVmFsaWQoKSBjb25zdCA9IGRlbGV0ZTsKKyAgCitwcm90ZWN0ZWQ6CisgIERlZmluZWRPclVua25vd25TVmFsKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBEZWZpbmVkT3JVbmtub3duU1ZhbChjb25zdCB2b2lkICpkLCBib29sIGlzTG9jLCB1bnNpZ25lZCBWYWxLaW5kKQorICAgICAgOiBTVmFsKGQsIGlzTG9jLCBWYWxLaW5kKSB7fQorICBleHBsaWNpdCBEZWZpbmVkT3JVbmtub3duU1ZhbChCYXNlS2luZCBrLCB2b2lkICpEID0gbnVsbHB0cikgOiBTVmFsKGssIEQpIHt9CisgIAorcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFNWYWw7CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IFNWYWwmIFYpIHsKKyAgICByZXR1cm4gIVYuaXNVbmRlZigpOworICB9Cit9OworICAKK2NsYXNzIFVua25vd25WYWwgOiBwdWJsaWMgRGVmaW5lZE9yVW5rbm93blNWYWwgeworcHVibGljOgorICBleHBsaWNpdCBVbmtub3duVmFsKCkgOiBEZWZpbmVkT3JVbmtub3duU1ZhbChVbmtub3duVmFsS2luZCkge30KKyAgCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU1ZhbDsKKworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgU1ZhbCAmVikgeworICAgIHJldHVybiBWLmdldEJhc2VLaW5kKCkgPT0gVW5rbm93blZhbEtpbmQ7CisgIH0KK307CisKK2NsYXNzIERlZmluZWRTVmFsIDogcHVibGljIERlZmluZWRPclVua25vd25TVmFsIHsKK3B1YmxpYzoKKyAgLy8gV2Ugd2FudCBjYWxsaW5nIHRoZXNlIG1ldGhvZHMgdG8gYmUgYSBjb21waWxlciBlcnJvciBzaW5jZSB0aGV5IGFyZQorICAvLyB0YXV0b2xvZ2ljYWxseSB0cnVlL2ZhbHNlLgorICBib29sIGlzVW5rbm93bigpIGNvbnN0ID0gZGVsZXRlOworICBib29sIGlzVW5rbm93bk9yVW5kZWYoKSBjb25zdCA9IGRlbGV0ZTsKKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgPSBkZWxldGU7CisKK3Byb3RlY3RlZDoKKyAgRGVmaW5lZFNWYWwoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IERlZmluZWRTVmFsKGNvbnN0IHZvaWQgKmQsIGJvb2wgaXNMb2MsIHVuc2lnbmVkIFZhbEtpbmQpCisgICAgICA6IERlZmluZWRPclVua25vd25TVmFsKGQsIGlzTG9jLCBWYWxLaW5kKSB7fQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU1ZhbDsKKworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgU1ZhbCYgVikgeworICAgIHJldHVybiAhVi5pc1Vua25vd25PclVuZGVmKCk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhbiBTVmFsIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBub3QgYmUgVW5rbm93blZhbC4KK2NsYXNzIEtub3duU1ZhbCA6IHB1YmxpYyBTVmFsIHsKKyAgZnJpZW5kIGNsYXNzIFNWYWw7CisKKyAgS25vd25TVmFsKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBTVmFsICZWKSB7CisgICAgcmV0dXJuICFWLmlzVW5rbm93bigpOworICB9CisKK3B1YmxpYzoKKyAgS25vd25TVmFsKGNvbnN0IERlZmluZWRTVmFsICZWKSA6IFNWYWwoVikge30KKyAgS25vd25TVmFsKGNvbnN0IFVuZGVmaW5lZFZhbCAmVikgOiBTVmFsKFYpIHt9Cit9OworCitjbGFzcyBOb25Mb2MgOiBwdWJsaWMgRGVmaW5lZFNWYWwgeworcHJvdGVjdGVkOgorICBOb25Mb2MoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IE5vbkxvYyh1bnNpZ25lZCBTdWJLaW5kLCBjb25zdCB2b2lkICpkKQorICAgICAgOiBEZWZpbmVkU1ZhbChkLCBmYWxzZSwgU3ViS2luZCkge30KKworcHVibGljOgorICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmT3V0KSBjb25zdDsKKworICBzdGF0aWMgYm9vbCBpc0NvbXBvdW5kVHlwZShRdWFsVHlwZSBUKSB7CisgICAgcmV0dXJuIFQtPmlzQXJyYXlUeXBlKCkgfHwgVC0+aXNSZWNvcmRUeXBlKCkgfHwKKyAgICAgICAgICAgVC0+aXNDb21wbGV4VHlwZSgpIHx8IFQtPmlzVmVjdG9yVHlwZSgpOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBTVmFsOworCisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBTVmFsJiBWKSB7CisgICAgcmV0dXJuIFYuZ2V0QmFzZUtpbmQoKSA9PSBOb25Mb2NLaW5kOworICB9Cit9OworCitjbGFzcyBMb2MgOiBwdWJsaWMgRGVmaW5lZFNWYWwgeworcHJvdGVjdGVkOgorICBMb2MoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IExvYyh1bnNpZ25lZCBTdWJLaW5kLCBjb25zdCB2b2lkICpEKQorICAgICAgOiBEZWZpbmVkU1ZhbChjb25zdF9jYXN0PHZvaWQgKj4oRCksIHRydWUsIFN1YktpbmQpIHt9CisKK3B1YmxpYzoKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJk91dCkgY29uc3Q7CisKKyAgc3RhdGljIGJvb2wgaXNMb2NUeXBlKFF1YWxUeXBlIFQpIHsKKyAgICByZXR1cm4gVC0+aXNBbnlQb2ludGVyVHlwZSgpIHx8IFQtPmlzQmxvY2tQb2ludGVyVHlwZSgpIHx8IAorICAgICAgICAgICBULT5pc1JlZmVyZW5jZVR5cGUoKSB8fCBULT5pc051bGxQdHJUeXBlKCk7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFNWYWw7CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IFNWYWwmIFYpIHsKKyAgICByZXR1cm4gVi5nZXRCYXNlS2luZCgpID09IExvY0tpbmQ7CisgIH0KK307CisKKy8vPT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PS8vCisvLyAgU3ViY2xhc3NlcyBvZiBOb25Mb2MuCisvLz09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT0vLworCituYW1lc3BhY2Ugbm9ubG9jIHsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIHN5bWJvbGljIGV4cHJlc3Npb24uCitjbGFzcyBTeW1ib2xWYWwgOiBwdWJsaWMgTm9uTG9jIHsKK3B1YmxpYzoKKyAgU3ltYm9sVmFsKCkgPSBkZWxldGU7CisgIFN5bWJvbFZhbChTeW1ib2xSZWYgc3ltKSA6IE5vbkxvYyhTeW1ib2xWYWxLaW5kLCBzeW0pIHsgYXNzZXJ0KHN5bSk7IH0KKworICBTeW1ib2xSZWYgZ2V0U3ltYm9sKCkgY29uc3QgeworICAgIHJldHVybiAoY29uc3QgU3ltRXhwciAqKSBEYXRhOworICB9CisKKyAgYm9vbCBpc0V4cHJlc3Npb24oKSBjb25zdCB7CisgICAgcmV0dXJuICFpc2E8U3ltYm9sRGF0YT4oZ2V0U3ltYm9sKCkpOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBTVmFsOworCisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBTVmFsJiBWKSB7CisgICAgcmV0dXJuIFYuZ2V0QmFzZUtpbmQoKSA9PSBOb25Mb2NLaW5kICYmCisgICAgICAgICAgIFYuZ2V0U3ViS2luZCgpID09IFN5bWJvbFZhbEtpbmQ7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgTm9uTG9jJiBWKSB7CisgICAgcmV0dXJuIFYuZ2V0U3ViS2luZCgpID09IFN5bWJvbFZhbEtpbmQ7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVmFsdWUgcmVwcmVzZW50aW5nIGludGVnZXIgY29uc3RhbnQuCitjbGFzcyBDb25jcmV0ZUludCA6IHB1YmxpYyBOb25Mb2MgeworcHVibGljOgorICBleHBsaWNpdCBDb25jcmV0ZUludChjb25zdCBsbHZtOjpBUFNJbnQmIFYpIDogTm9uTG9jKENvbmNyZXRlSW50S2luZCwgJlYpIHt9CisKKyAgY29uc3QgbGx2bTo6QVBTSW50JiBnZXRWYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IGxsdm06OkFQU0ludCAqPihEYXRhKTsKKyAgfQorCisgIC8vIFRyYW5zZmVyIGZ1bmN0aW9ucyBmb3IgYmluYXJ5L3VuYXJ5IG9wZXJhdGlvbnMgb24gQ29uY3JldGVJbnRzLgorICBTVmFsIGV2YWxCaW5PcChTVmFsQnVpbGRlciAmc3ZhbEJ1aWxkZXIsIEJpbmFyeU9wZXJhdG9yOjpPcGNvZGUgT3AsCisgICAgICAgICAgICAgICAgIGNvbnN0IENvbmNyZXRlSW50JiBSKSBjb25zdDsKKworICBDb25jcmV0ZUludCBldmFsQ29tcGxlbWVudChTVmFsQnVpbGRlciAmc3ZhbEJ1aWxkZXIpIGNvbnN0OworCisgIENvbmNyZXRlSW50IGV2YWxNaW51cyhTVmFsQnVpbGRlciAmc3ZhbEJ1aWxkZXIpIGNvbnN0OworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU1ZhbDsKKworICBDb25jcmV0ZUludCgpID0gZGVmYXVsdDsKKworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgU1ZhbCYgVikgeworICAgIHJldHVybiBWLmdldEJhc2VLaW5kKCkgPT0gTm9uTG9jS2luZCAmJgorICAgICAgICAgICBWLmdldFN1YktpbmQoKSA9PSBDb25jcmV0ZUludEtpbmQ7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgTm9uTG9jJiBWKSB7CisgICAgcmV0dXJuIFYuZ2V0U3ViS2luZCgpID09IENvbmNyZXRlSW50S2luZDsKKyAgfQorfTsKKworY2xhc3MgTG9jQXNJbnRlZ2VyIDogcHVibGljIE5vbkxvYyB7CisgIGZyaWVuZCBjbGFzcyBlbnRvOjpTVmFsQnVpbGRlcjsKKworICBleHBsaWNpdCBMb2NBc0ludGVnZXIoY29uc3Qgc3RkOjpwYWlyPFNWYWwsIHVpbnRwdHJfdD4gJmRhdGEpCisgICAgICA6IE5vbkxvYyhMb2NBc0ludGVnZXJLaW5kLCAmZGF0YSkgeworICAgIC8vIFdlIGRvIG5vdCBuZWVkIHRvIHJlcHJlc2VudCBsb2M6OkNvbmNyZXRlSW50IGFzIExvY0FzSW50ZWdlciwKKyAgICAvLyBhcyBpdCdkIGNvbGxhcHNlIGludG8gYSBub25sb2M6OkNvbmNyZXRlSW50IGluc3RlYWQuCisgICAgYXNzZXJ0KGRhdGEuZmlyc3QuZ2V0QmFzZUtpbmQoKSA9PSBMb2NLaW5kICYmCisgICAgICAgICAgIChkYXRhLmZpcnN0LmdldFN1YktpbmQoKSA9PSBsb2M6Ok1lbVJlZ2lvblZhbEtpbmQgfHwKKyAgICAgICAgICAgIGRhdGEuZmlyc3QuZ2V0U3ViS2luZCgpID09IGxvYzo6R290b0xhYmVsS2luZCkpOworICB9CisKK3B1YmxpYzoKKyAgTG9jIGdldExvYygpIGNvbnN0IHsKKyAgICBjb25zdCBzdGQ6OnBhaXI8U1ZhbCwgdWludHB0cl90PiAqRCA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBzdGQ6OnBhaXI8U1ZhbCwgdWludHB0cl90PiAqPihEYXRhKTsKKyAgICByZXR1cm4gRC0+Zmlyc3QuY2FzdEFzPExvYz4oKTsKKyAgfQorCisgIExvYyBnZXRQZXJzaXN0ZW50TG9jKCkgY29uc3QgeworICAgIGNvbnN0IHN0ZDo6cGFpcjxTVmFsLCB1aW50cHRyX3Q+ICpEID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IHN0ZDo6cGFpcjxTVmFsLCB1aW50cHRyX3Q+ICo+KERhdGEpOworICAgIGNvbnN0IFNWYWwmIFYgPSBELT5maXJzdDsKKyAgICByZXR1cm4gVi5jYXN0QXM8TG9jPigpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtQml0cygpIGNvbnN0IHsKKyAgICBjb25zdCBzdGQ6OnBhaXI8U1ZhbCwgdWludHB0cl90PiAqRCA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBzdGQ6OnBhaXI8U1ZhbCwgdWludHB0cl90PiAqPihEYXRhKTsKKyAgICByZXR1cm4gRC0+c2Vjb25kOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBTVmFsOworCisgIExvY0FzSW50ZWdlcigpID0gZGVmYXVsdDsKKworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgU1ZhbCYgVikgeworICAgIHJldHVybiBWLmdldEJhc2VLaW5kKCkgPT0gTm9uTG9jS2luZCAmJgorICAgICAgICAgICBWLmdldFN1YktpbmQoKSA9PSBMb2NBc0ludGVnZXJLaW5kOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IE5vbkxvYyYgVikgeworICAgIHJldHVybiBWLmdldFN1YktpbmQoKSA9PSBMb2NBc0ludGVnZXJLaW5kOworICB9Cit9OworCitjbGFzcyBDb21wb3VuZFZhbCA6IHB1YmxpYyBOb25Mb2MgeworICBmcmllbmQgY2xhc3MgZW50bzo6U1ZhbEJ1aWxkZXI7CisKKyAgZXhwbGljaXQgQ29tcG91bmRWYWwoY29uc3QgQ29tcG91bmRWYWxEYXRhKiBEKSA6IE5vbkxvYyhDb21wb3VuZFZhbEtpbmQsIEQpIHt9CisKK3B1YmxpYzoKKyAgY29uc3QgQ29tcG91bmRWYWxEYXRhKiBnZXRWYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgQ29tcG91bmRWYWxEYXRhICo+KERhdGEpOworICB9CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBsbHZtOjpJbW11dGFibGVMaXN0PFNWYWw+OjppdGVyYXRvcjsKKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0OworICBpdGVyYXRvciBlbmQoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFNWYWw7CisKKyAgQ29tcG91bmRWYWwoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IFNWYWwmIFYpIHsKKyAgICByZXR1cm4gVi5nZXRCYXNlS2luZCgpID09IE5vbkxvY0tpbmQgJiYgVi5nZXRTdWJLaW5kKCkgPT0gQ29tcG91bmRWYWxLaW5kOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IE5vbkxvYyYgVikgeworICAgIHJldHVybiBWLmdldFN1YktpbmQoKSA9PSBDb21wb3VuZFZhbEtpbmQ7CisgIH0KK307CisKK2NsYXNzIExhenlDb21wb3VuZFZhbCA6IHB1YmxpYyBOb25Mb2MgeworICBmcmllbmQgY2xhc3MgZW50bzo6U1ZhbEJ1aWxkZXI7CisKKyAgZXhwbGljaXQgTGF6eUNvbXBvdW5kVmFsKGNvbnN0IExhenlDb21wb3VuZFZhbERhdGEgKkQpCisgICAgICA6IE5vbkxvYyhMYXp5Q29tcG91bmRWYWxLaW5kLCBEKSB7fQorCitwdWJsaWM6CisgIGNvbnN0IExhenlDb21wb3VuZFZhbERhdGEgKmdldENWRGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgTGF6eUNvbXBvdW5kVmFsRGF0YSAqPihEYXRhKTsKKyAgfQorCisgIGNvbnN0IHZvaWQgKmdldFN0b3JlKCkgY29uc3Q7CisgIGNvbnN0IFR5cGVkVmFsdWVSZWdpb24gKmdldFJlZ2lvbigpIGNvbnN0OworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU1ZhbDsKKworICBMYXp5Q29tcG91bmRWYWwoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IFNWYWwmIFYpIHsKKyAgICByZXR1cm4gVi5nZXRCYXNlS2luZCgpID09IE5vbkxvY0tpbmQgJiYKKyAgICAgICAgICAgVi5nZXRTdWJLaW5kKCkgPT0gTGF6eUNvbXBvdW5kVmFsS2luZDsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBOb25Mb2MmIFYpIHsKKyAgICByZXR1cm4gVi5nZXRTdWJLaW5kKCkgPT0gTGF6eUNvbXBvdW5kVmFsS2luZDsKKyAgfQorfTsKKworLy8vIFxicmllZiBWYWx1ZSByZXByZXNlbnRpbmcgcG9pbnRlci10by1tZW1iZXIuCisvLy8KKy8vLyBUaGlzIHZhbHVlIGlzIHF1YWxpZmllZCBhcyBOb25Mb2MgYmVjYXVzZSBuZWl0aGVyIGxvYWRpbmcgbm9yIHN0b3JpbmcKKy8vLyBvcGVyYXRpb25zIGFyZSBhcGxpZWQgdG8gaXQuIEluc3RlYWQsIHRoZSBhbmFseXplciB1c2VzIHRoZSBMLXZhbHVlIGNvbWluZworLy8vIGZyb20gcG9pbnRlci10by1tZW1iZXIgYXBwbGllZCB0byBhbiBvYmplY3QuCisvLy8gVGhpcyBTVmFsIGlzIHJlcHJlc2VudGVkIGJ5IGEgRGVjbGFyYXRvckRlY2wgd2hpY2ggY2FuIGJlIGEgbWVtYmVyIGZ1bmN0aW9uCisvLy8gcG9pbnRlciBvciBhIG1lbWJlciBkYXRhIHBvaW50ZXIgYW5kIGEgbGlzdCBvZiBDWFhCYXNlU3BlY2lmaWVycy4gVGhpcyBsaXN0CisvLy8gaXMgcmVxdWlyZWQgdG8gYWNjdW11bGF0ZSB0aGUgcG9pbnRlci10by1tZW1iZXIgY2FzdCBoaXN0b3J5IHRvIGZpZ3VyZSBvdXQKKy8vLyB0aGUgY29ycmVjdCBzdWJvYmplY3QgZmllbGQuCitjbGFzcyBQb2ludGVyVG9NZW1iZXIgOiBwdWJsaWMgTm9uTG9jIHsKKyAgZnJpZW5kIGNsYXNzIGVudG86OlNWYWxCdWlsZGVyOworCitwdWJsaWM6CisgIHVzaW5nIFBUTURhdGFUeXBlID0KKyAgICAgIGxsdm06OlBvaW50ZXJVbmlvbjxjb25zdCBEZWNsYXJhdG9yRGVjbCAqLCBjb25zdCBQb2ludGVyVG9NZW1iZXJEYXRhICo+OworCisgIGNvbnN0IFBUTURhdGFUeXBlIGdldFBUTURhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIFBUTURhdGFUeXBlOjpnZXRGcm9tT3BhcXVlVmFsdWUoY29uc3RfY2FzdDx2b2lkICo+KERhdGEpKTsKKyAgfQorCisgIGJvb2wgaXNOdWxsTWVtYmVyUG9pbnRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UFRNRGF0YSgpLmlzTnVsbCgpOworICB9CisKKyAgY29uc3QgRGVjbGFyYXRvckRlY2wgKmdldERlY2woKSBjb25zdDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBBZGp1c3RlZERlY2w+CisgIGNvbnN0IEFkanVzdGVkRGVjbCAqZ2V0RGVjbEFzKCkgY29uc3QgeworICAgIHJldHVybiBkeW5fY2FzdF9vcl9udWxsPEFkanVzdGVkRGVjbD4oZ2V0RGVjbCgpKTsKKyAgfQorCisgIHVzaW5nIGl0ZXJhdG9yID0gbGx2bTo6SW1tdXRhYmxlTGlzdDxjb25zdCBDWFhCYXNlU3BlY2lmaWVyICo+OjppdGVyYXRvcjsKKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0OworICBpdGVyYXRvciBlbmQoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFNWYWw7CisKKyAgUG9pbnRlclRvTWVtYmVyKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBQb2ludGVyVG9NZW1iZXIoY29uc3QgUFRNRGF0YVR5cGUgRCkKKyAgICAgIDogTm9uTG9jKFBvaW50ZXJUb01lbWJlcktpbmQsIEQuZ2V0T3BhcXVlVmFsdWUoKSkge30KKworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgU1ZhbCYgVikgeworICAgIHJldHVybiBWLmdldEJhc2VLaW5kKCkgPT0gTm9uTG9jS2luZCAmJgorICAgICAgICAgICBWLmdldFN1YktpbmQoKSA9PSBQb2ludGVyVG9NZW1iZXJLaW5kOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IE5vbkxvYyYgVikgeworICAgIHJldHVybiBWLmdldFN1YktpbmQoKSA9PSBQb2ludGVyVG9NZW1iZXJLaW5kOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBub25sb2MKKworLy89PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09Ly8KKy8vICBTdWJjbGFzc2VzIG9mIExvYy4KKy8vPT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PS8vCisKK25hbWVzcGFjZSBsb2MgeworCitjbGFzcyBHb3RvTGFiZWwgOiBwdWJsaWMgTG9jIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgR290b0xhYmVsKGNvbnN0IExhYmVsRGVjbCAqTGFiZWwpIDogTG9jKEdvdG9MYWJlbEtpbmQsIExhYmVsKSB7CisgICAgYXNzZXJ0KExhYmVsKTsKKyAgfQorCisgIGNvbnN0IExhYmVsRGVjbCAqZ2V0TGFiZWwoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IExhYmVsRGVjbCAqPihEYXRhKTsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU1ZhbDsKKworICBHb3RvTGFiZWwoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IFNWYWwmIFYpIHsKKyAgICByZXR1cm4gVi5nZXRCYXNlS2luZCgpID09IExvY0tpbmQgJiYgVi5nZXRTdWJLaW5kKCkgPT0gR290b0xhYmVsS2luZDsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBMb2MmIFYpIHsKKyAgICByZXR1cm4gVi5nZXRTdWJLaW5kKCkgPT0gR290b0xhYmVsS2luZDsKKyAgfQorfTsKKworY2xhc3MgTWVtUmVnaW9uVmFsIDogcHVibGljIExvYyB7CitwdWJsaWM6CisgIGV4cGxpY2l0IE1lbVJlZ2lvblZhbChjb25zdCBNZW1SZWdpb24qIHIpIDogTG9jKE1lbVJlZ2lvblZhbEtpbmQsIHIpIHsKKyAgICBhc3NlcnQocik7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgdW5kZXJsaW5pbmcgcmVnaW9uLgorICBjb25zdCBNZW1SZWdpb24gKmdldFJlZ2lvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgTWVtUmVnaW9uICo+KERhdGEpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHVuZGVybGluaW5nIHJlZ2lvbiBhbmQgc3RyaXAgY2FzdHMuCisgIGNvbnN0IE1lbVJlZ2lvbiogc3RyaXBDYXN0cyhib29sIFN0cmlwQmFzZUNhc3RzID0gdHJ1ZSkgY29uc3Q7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJFR0lPTj4KKyAgY29uc3QgUkVHSU9OKiBnZXRSZWdpb25BcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZHluX2Nhc3Q8UkVHSU9OPihnZXRSZWdpb24oKSk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWVtUmVnaW9uVmFsICZSKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFJlZ2lvbigpID09IFIuZ2V0UmVnaW9uKCk7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgTWVtUmVnaW9uVmFsICZSKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFJlZ2lvbigpICE9IFIuZ2V0UmVnaW9uKCk7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFNWYWw7CisKKyAgTWVtUmVnaW9uVmFsKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBib29sIGlzS2luZChjb25zdCBTVmFsJiBWKSB7CisgICAgcmV0dXJuIFYuZ2V0QmFzZUtpbmQoKSA9PSBMb2NLaW5kICYmCisgICAgICAgICAgIFYuZ2V0U3ViS2luZCgpID09IE1lbVJlZ2lvblZhbEtpbmQ7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0tpbmQoY29uc3QgTG9jJiBWKSB7CisgICAgcmV0dXJuIFYuZ2V0U3ViS2luZCgpID09IE1lbVJlZ2lvblZhbEtpbmQ7CisgIH0KK307CisKK2NsYXNzIENvbmNyZXRlSW50IDogcHVibGljIExvYyB7CitwdWJsaWM6CisgIGV4cGxpY2l0IENvbmNyZXRlSW50KGNvbnN0IGxsdm06OkFQU0ludCYgVikgOiBMb2MoQ29uY3JldGVJbnRLaW5kLCAmVikge30KKworICBjb25zdCBsbHZtOjpBUFNJbnQgJmdldFZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgbGx2bTo6QVBTSW50ICo+KERhdGEpOworICB9CisKKyAgLy8gVHJhbnNmZXIgZnVuY3Rpb25zIGZvciBiaW5hcnkvdW5hcnkgb3BlcmF0aW9ucyBvbiBDb25jcmV0ZUludHMuCisgIFNWYWwgZXZhbEJpbk9wKEJhc2ljVmFsdWVGYWN0b3J5JiBCYXNpY1ZhbHMsIEJpbmFyeU9wZXJhdG9yOjpPcGNvZGUgT3AsCisgICAgICAgICAgICAgICAgIGNvbnN0IENvbmNyZXRlSW50JiBSKSBjb25zdDsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFNWYWw7CisKKyAgQ29uY3JldGVJbnQoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IFNWYWwmIFYpIHsKKyAgICByZXR1cm4gVi5nZXRCYXNlS2luZCgpID09IExvY0tpbmQgJiYKKyAgICAgICAgICAgVi5nZXRTdWJLaW5kKCkgPT0gQ29uY3JldGVJbnRLaW5kOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IExvYyYgVikgeworICAgIHJldHVybiBWLmdldFN1YktpbmQoKSA9PSBDb25jcmV0ZUludEtpbmQ7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGxvYyAKKworfSAvLyBuYW1lc3BhY2UgZW50bworCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNQb2RMaWtlOwordGVtcGxhdGUgPD4gc3RydWN0IGlzUG9kTGlrZTxjbGFuZzo6ZW50bzo6U1ZhbD4geworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9TVkFMU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU2ltcGxlQ29uc3RyYWludE1hbmFnZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TaW1wbGVDb25zdHJhaW50TWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOTgwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU2ltcGxlQ29uc3RyYWludE1hbmFnZXIuaApAQCAtMCwwICsxLDkyIEBACisvLz09IFNpbXBsZUNvbnN0cmFpbnRNYW5hZ2VyLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi0tPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBTaW1wbGlmaWVkIGNvbnN0cmFpbnQgbWFuYWdlciBiYWNrZW5kLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfU0lNUExFQ09OU1RSQUlOVE1BTkFHRVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9TSU1QTEVDT05TVFJBSU5UTUFOQUdFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQ29uc3RyYWludE1hbmFnZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvUHJvZ3JhbVN0YXRlLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CisKK25hbWVzcGFjZSBlbnRvIHsKKworY2xhc3MgU2ltcGxlQ29uc3RyYWludE1hbmFnZXIgOiBwdWJsaWMgQ29uc3RyYWludE1hbmFnZXIgeworICBTdWJFbmdpbmUgKlNVOworICBTVmFsQnVpbGRlciAmU1ZCOworCitwdWJsaWM6CisgIFNpbXBsZUNvbnN0cmFpbnRNYW5hZ2VyKFN1YkVuZ2luZSAqc3ViZW5naW5lLCBTVmFsQnVpbGRlciAmU0IpCisgICAgICA6IFNVKHN1YmVuZ2luZSksIFNWQihTQikge30KKworICB+U2ltcGxlQ29uc3RyYWludE1hbmFnZXIoKSBvdmVycmlkZTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEltcGxlbWVudGF0aW9uIGZvciBpbnRlcmZhY2UgZnJvbSBDb25zdHJhaW50TWFuYWdlci4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBFbnN1cmVzIHRoYXQgdGhlIERlZmluZWRTVmFsIGNvbmRpdGlvbmFsIGlzIGV4cHJlc3NlZCBhcyBhIE5vbkxvYyBieQorICAvLy8gY3JlYXRpbmcgYm9vbGVhbiBjYXN0cyB0byBoYW5kbGUgTG9jJ3MuCisgIFByb2dyYW1TdGF0ZVJlZiBhc3N1bWUoUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLCBEZWZpbmVkU1ZhbCBDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQXNzdW1wdGlvbikgb3ZlcnJpZGU7CisKKyAgUHJvZ3JhbVN0YXRlUmVmIGFzc3VtZUluY2x1c2l2ZVJhbmdlKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwgTm9uTG9jIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBTSW50ICZGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBTSW50ICZUbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5SYW5nZSkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnRlcmZhY2UgdGhhdCBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50LgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIEdpdmVuIGEgc3ltYm9saWMgZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSByZWFzb25lZCBhYm91dCwgYXNzdW1lIHRoYXQgaXQgaXMKKyAgLy8vIHRydWUvZmFsc2UgYW5kIGdlbmVyYXRlIHRoZSBuZXcgcHJvZ3JhbSBzdGF0ZS4KKyAgdmlydHVhbCBQcm9ncmFtU3RhdGVSZWYgYXNzdW1lU3ltKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwgU3ltYm9sUmVmIFN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQXNzdW1wdGlvbikgPSAwOworCisgIC8vLyBHaXZlbiBhIHN5bWJvbGljIGV4cHJlc3Npb24gd2l0aGluIHRoZSByYW5nZSBbRnJvbSwgVG9dLCBhc3N1bWUgdGhhdCBpdCBpcworICAvLy8gdHJ1ZS9mYWxzZSBhbmQgZ2VuZXJhdGUgdGhlIG5ldyBwcm9ncmFtIHN0YXRlLgorICAvLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGhhbmRsZSBjYXNlIHJhbmdlcyBwcm9kdWNlZCBieSBhIGxhbmd1YWdlCisgIC8vLyBleHRlbnNpb24gZm9yIHN3aXRjaCBjYXNlIHN0YXRlbWVudHMuCisgIHZpcnR1YWwgUHJvZ3JhbVN0YXRlUmVmIGFzc3VtZVN5bUluY2x1c2l2ZVJhbmdlKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sUmVmIFN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBTSW50ICZGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpBUFNJbnQgJlRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluUmFuZ2UpID0gMDsKKworICAvLy8gR2l2ZW4gYSBzeW1ib2xpYyBleHByZXNzaW9uIHRoYXQgY2Fubm90IGJlIHJlYXNvbmVkIGFib3V0LCBhc3N1bWUgdGhhdAorICAvLy8gaXQgaXMgemVyby9ub256ZXJvIGFuZCBhZGQgaXQgZGlyZWN0bHkgdG8gdGhlIHNvbHZlciBzdGF0ZS4KKyAgdmlydHVhbCBQcm9ncmFtU3RhdGVSZWYgYXNzdW1lU3ltVW5zdXBwb3J0ZWQoUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xSZWYgU3ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFzc3VtcHRpb24pID0gMDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEludGVybmFsIGltcGxlbWVudGF0aW9uLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgQmFzaWNWYWx1ZUZhY3RvcnkgJmdldEJhc2ljVmFscygpIGNvbnN0IHsgcmV0dXJuIFNWQi5nZXRCYXNpY1ZhbHVlRmFjdG9yeSgpOyB9CisgIFN5bWJvbE1hbmFnZXIgJmdldFN5bWJvbE1hbmFnZXIoKSBjb25zdCB7IHJldHVybiBTVkIuZ2V0U3ltYm9sTWFuYWdlcigpOyB9CisKK3ByaXZhdGU6CisgIFByb2dyYW1TdGF0ZVJlZiBhc3N1bWUoUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLCBOb25Mb2MgQ29uZCwgYm9vbCBBc3N1bXB0aW9uKTsKKworICBQcm9ncmFtU3RhdGVSZWYgYXNzdW1lQXV4KFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwgTm9uTG9jIENvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBc3N1bXB0aW9uKTsKK307CisKK30gLy8gZW5kIEdSIG5hbWVzcGFjZQorCit9IC8vIGVuZCBjbGFuZyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU3RvcmUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YWZiMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU3RvcmUuaApAQCAtMCwwICsxLDMzMCBAQAorLy89PT0tIFN0b3JlLmggLSBJbnRlcmZhY2UgZm9yIG1hcHMgZnJvbSBMb2NhdGlvbnMgdG8gVmFsdWVzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZWQgdGhlIHR5cGVzIFN0b3JlIGFuZCBTdG9yZU1hbmFnZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9TVE9SRV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX1NUT1JFX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL01lbVJlZ2lvbi5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Qcm9ncmFtU3RhdGVfRndkLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1NWYWxCdWlsZGVyLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1NWYWxzLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N0b3JlUmVmLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N5bUV4cHIuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBU1RDb250ZXh0OworY2xhc3MgQ2FzdEV4cHI7CitjbGFzcyBDb21wb3VuZExpdGVyYWxFeHByOworY2xhc3MgQ1hYQmFzZVBhdGg7CitjbGFzcyBEZWNsOworY2xhc3MgRXhwcjsKK2NsYXNzIExvY2F0aW9uQ29udGV4dDsKK2NsYXNzIE9iakNJdmFyRGVjbDsKK2NsYXNzIFN0YWNrRnJhbWVDb250ZXh0OworCituYW1lc3BhY2UgZW50byB7CisKK2NsYXNzIENhbGxFdmVudDsKK2NsYXNzIFByb2dyYW1TdGF0ZU1hbmFnZXI7CitjbGFzcyBTY2FuUmVhY2hhYmxlU3ltYm9sczsKK2NsYXNzIFN5bWJvbFJlYXBlcjsKKwordXNpbmcgSW52YWxpZGF0ZWRTeW1ib2xzID0gbGx2bTo6RGVuc2VTZXQ8U3ltYm9sUmVmPjsKKworY2xhc3MgU3RvcmVNYW5hZ2VyIHsKK3Byb3RlY3RlZDoKKyAgU1ZhbEJ1aWxkZXIgJnN2YWxCdWlsZGVyOworICBQcm9ncmFtU3RhdGVNYW5hZ2VyICZTdGF0ZU1ncjsKKworICAvLy8gTVJNZ3IgLSBNYW5hZ2VzIHJlZ2lvbiBvYmplY3RzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFN0b3JlTWFuYWdlci4KKyAgTWVtUmVnaW9uTWFuYWdlciAmTVJNZ3I7CisgIEFTVENvbnRleHQgJkN0eDsKKworICBTdG9yZU1hbmFnZXIoUHJvZ3JhbVN0YXRlTWFuYWdlciAmc3RhdGVNZ3IpOworCitwdWJsaWM6CisgIHZpcnR1YWwgflN0b3JlTWFuYWdlcigpID0gZGVmYXVsdDsKKworICAvLy8gUmV0dXJuIHRoZSB2YWx1ZSBib3VuZCB0byBzcGVjaWZpZWQgbG9jYXRpb24gaW4gYSBnaXZlbiBzdGF0ZS4KKyAgLy8vIFxwYXJhbVtpbl0gc3RvcmUgVGhlIHN0b3JlIGluIHdoaWNoIHRvIG1ha2UgdGhlIGxvb2t1cC4KKyAgLy8vIFxwYXJhbVtpbl0gbG9jIFRoZSBzeW1ib2xpYyBtZW1vcnkgbG9jYXRpb24uCisgIC8vLyBccGFyYW1baW5dIFQgQW4gb3B0aW9uYWwgdHlwZSB0aGF0IHByb3ZpZGVzIGEgaGludCBpbmRpY2F0aW5nIHRoZQorICAvLy8gICBleHBlY3RlZCB0eXBlIG9mIHRoZSByZXR1cm5lZCB2YWx1ZS4gIFRoaXMgaXMgdXNlZCBpZiB0aGUgdmFsdWUgaXMKKyAgLy8vICAgbGF6aWx5IGNvbXB1dGVkLgorICAvLy8gXHJldHVybiBUaGUgdmFsdWUgYm91bmQgdG8gdGhlIGxvY2F0aW9uIFxjIGxvYy4KKyAgdmlydHVhbCBTVmFsIGdldEJpbmRpbmcoU3RvcmUgc3RvcmUsIExvYyBsb2MsIFF1YWxUeXBlIFQgPSBRdWFsVHlwZSgpKSA9IDA7CisKKyAgLy8vIFJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBib3VuZCB0byBhIHJlZ2lvbiBpbiBhIGdpdmVuIHN0b3JlLiBUaGUgZGVmYXVsdAorICAvLy8gYmluZGluZyBpcyB0aGUgdmFsdWUgb2Ygc3ViLXJlZ2lvbnMgdGhhdCB3ZXJlIG5vdCBpbml0aWFsaXplZCBzZXBhcmF0ZWx5CisgIC8vLyBmcm9tIHRoZWlyIGJhc2UgcmVnaW9uLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHN0cnVjdHVyZSBpcyB6ZXJvLWluaXRpYWxpemVkCisgIC8vLyB1cG9uIGNvbnN0cnVjdGlvbiwgdGhpcyBtZXRob2QgcmV0cmlldmVzIHRoZSBjb25jcmV0ZSB6ZXJvIHZhbHVlLCBldmVuIGlmCisgIC8vLyBzb21lIG9yIGFsbCBmaWVsZHMgd2VyZSBsYXRlciBvdmVyd3JpdHRlbiBtYW51YWxseS4gRGVmYXVsdCBiaW5kaW5nIG1heSBiZQorICAvLy8gYW4gdW5rbm93biwgdW5kZWZpbmVkLCBjb25jcmV0ZSwgb3Igc3ltYm9saWMgdmFsdWUuCisgIC8vLyBccGFyYW1baW5dIHN0b3JlIFRoZSBzdG9yZSBpbiB3aGljaCB0byBtYWtlIHRoZSBsb29rdXAuCisgIC8vLyBccGFyYW1baW5dIFIgVGhlIHJlZ2lvbiB0byBmaW5kIHRoZSBkZWZhdWx0IGJpbmRpbmcgZm9yLgorICAvLy8gXHJldHVybiBUaGUgZGVmYXVsdCB2YWx1ZSBib3VuZCB0byB0aGUgcmVnaW9uIGluIHRoZSBzdG9yZSwgaWYgYSBkZWZhdWx0CisgIC8vLyBiaW5kaW5nIGV4aXN0cy4KKyAgdmlydHVhbCBPcHRpb25hbDxTVmFsPiBnZXREZWZhdWx0QmluZGluZyhTdG9yZSBzdG9yZSwgY29uc3QgTWVtUmVnaW9uICpSKSA9IDA7CisKKyAgLy8vIFJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBib3VuZCB0byBhIExhenlDb21wb3VuZFZhbC4gVGhlIGRlZmF1bHQgYmluZGluZworICAvLy8gaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHZhbHVlIG9mIGFueSBmaWVsZHMgb3IgZWxlbWVudHMgd2l0aGluIHRoZQorICAvLy8gc3RydWN0dXJlIHJlcHJlc2VudGVkIGJ5IHRoZSBMYXp5Q29tcG91bmRWYWwgd2hpY2ggd2VyZSBub3QgaW5pdGlhbGl6ZWQKKyAgLy8vIGV4cGxpY2l0bHkgc2VwYXJhdGVseSBmcm9tIHRoZSB3aG9sZSBzdHJ1Y3R1cmUuIERlZmF1bHQgYmluZGluZyBtYXkgYmUgYW4KKyAgLy8vIHVua25vd24sIHVuZGVmaW5lZCwgY29uY3JldGUsIG9yIHN5bWJvbGljIHZhbHVlLgorICAvLy8gXHBhcmFtW2luXSBsY3YgVGhlIGxhenkgY29tcG91bmQgdmFsdWUuCisgIC8vLyBccmV0dXJuIFRoZSBkZWZhdWx0IHZhbHVlIGJvdW5kIHRvIHRoZSBMYXp5Q29tcG91bmRWYWwgXGMgbGN2LCBpZiBhCisgIC8vLyBkZWZhdWx0IGJpbmRpbmcgZXhpc3RzLgorICBPcHRpb25hbDxTVmFsPiBnZXREZWZhdWx0QmluZGluZyhub25sb2M6OkxhenlDb21wb3VuZFZhbCBsY3YpIHsKKyAgICByZXR1cm4gZ2V0RGVmYXVsdEJpbmRpbmcobGN2LmdldFN0b3JlKCksIGxjdi5nZXRSZWdpb24oKSk7CisgIH0KKworICAvLy8gUmV0dXJuIGEgc3RvcmUgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIGJvdW5kIHRvIHRoZSBnaXZlbiBsb2NhdGlvbi4KKyAgLy8vIFxwYXJhbVtpbl0gc3RvcmUgVGhlIHN0b3JlIGluIHdoaWNoIHRvIG1ha2UgdGhlIGJpbmRpbmcuCisgIC8vLyBccGFyYW1baW5dIGxvYyBUaGUgc3ltYm9saWMgbWVtb3J5IGxvY2F0aW9uLgorICAvLy8gXHBhcmFtW2luXSB2YWwgVGhlIHZhbHVlIHRvIGJpbmQgdG8gbG9jYXRpb24gXGMgbG9jLgorICAvLy8gXHJldHVybiBBIFN0b3JlUmVmIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBzYW1lCisgIC8vLyAgIGJpbmRpbmdzIGFzIFxjIHN0b3JlIHdpdGggdGhlIGFkZGl0aW9uIG9mIGhhdmluZyB0aGUgdmFsdWUgc3BlY2lmaWVkCisgIC8vLyAgIGJ5IFxjIHZhbCBib3VuZCB0byB0aGUgbG9jYXRpb24gZ2l2ZW4gZm9yIFxjIGxvYy4KKyAgdmlydHVhbCBTdG9yZVJlZiBCaW5kKFN0b3JlIHN0b3JlLCBMb2MgbG9jLCBTVmFsIHZhbCkgPSAwOworCisgIHZpcnR1YWwgU3RvcmVSZWYgQmluZERlZmF1bHQoU3RvcmUgc3RvcmUsIGNvbnN0IE1lbVJlZ2lvbiAqUiwgU1ZhbCBWKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyBzdG9yZSB3aXRoIHRoZSBzcGVjaWZpZWQgYmluZGluZyByZW1vdmVkLgorICAvLy8gXHBhcmFtIFNUIHRoZSBvcmlnaW5hbCBzdG9yZSwgdGhhdCBpcyB0aGUgYmFzaXMgZm9yIHRoZSBuZXcgc3RvcmUuCisgIC8vLyBccGFyYW0gTCB0aGUgbG9jYXRpb24gd2hvc2UgYmluZGluZyBzaG91bGQgYmUgcmVtb3ZlZC4KKyAgdmlydHVhbCBTdG9yZVJlZiBraWxsQmluZGluZyhTdG9yZSBTVCwgTG9jIEwpID0gMDsKKworICAvLy8gZ2V0SW5pdGlhbFN0b3JlIC0gUmV0dXJucyB0aGUgaW5pdGlhbCAiZW1wdHkiIHN0b3JlIHJlcHJlc2VudGluZyB0aGUKKyAgLy8vICB2YWx1ZSBiaW5kaW5ncyB1cG9uIGVudHJ5IHRvIGFuIGFuYWx5emVkIGZ1bmN0aW9uLgorICB2aXJ0dWFsIFN0b3JlUmVmIGdldEluaXRpYWxTdG9yZShjb25zdCBMb2NhdGlvbkNvbnRleHQgKkluaXRMb2MpID0gMDsKKworICAvLy8gZ2V0UmVnaW9uTWFuYWdlciAtIFJldHVybnMgdGhlIGludGVybmFsIFJlZ2lvbk1hbmFnZXIgb2JqZWN0IHRoYXQgaXMKKyAgLy8vICB1c2VkIHRvIHF1ZXJ5IGFuZCBtYW5pcHVsYXRlIE1lbVJlZ2lvbiBvYmplY3RzLgorICBNZW1SZWdpb25NYW5hZ2VyJiBnZXRSZWdpb25NYW5hZ2VyKCkgeyByZXR1cm4gTVJNZ3I7IH0KKworICB2aXJ0dWFsIExvYyBnZXRMVmFsdWVWYXIoY29uc3QgVmFyRGVjbCAqVkQsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEMpIHsKKyAgICByZXR1cm4gc3ZhbEJ1aWxkZXIubWFrZUxvYyhNUk1nci5nZXRWYXJSZWdpb24oVkQsIExDKSk7CisgIH0KKworICBMb2MgZ2V0TFZhbHVlQ29tcG91bmRMaXRlcmFsKGNvbnN0IENvbXBvdW5kTGl0ZXJhbEV4cHIgKkNMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEMpIHsKKyAgICByZXR1cm4gbG9jOjpNZW1SZWdpb25WYWwoTVJNZ3IuZ2V0Q29tcG91bmRMaXRlcmFsUmVnaW9uKENMLCBMQykpOworICB9CisKKyAgdmlydHVhbCBTVmFsIGdldExWYWx1ZUl2YXIoY29uc3QgT2JqQ0l2YXJEZWNsICpkZWNsLCBTVmFsIGJhc2UpOworCisgIHZpcnR1YWwgU1ZhbCBnZXRMVmFsdWVGaWVsZChjb25zdCBGaWVsZERlY2wgKkQsIFNWYWwgQmFzZSkgeworICAgIHJldHVybiBnZXRMVmFsdWVGaWVsZE9ySXZhcihELCBCYXNlKTsKKyAgfQorCisgIHZpcnR1YWwgU1ZhbCBnZXRMVmFsdWVFbGVtZW50KFF1YWxUeXBlIGVsZW1lbnRUeXBlLCBOb25Mb2Mgb2Zmc2V0LCBTVmFsIEJhc2UpOworCisgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBzb29uIGJlIGVsaW1pbmF0ZWQgYWx0b2dldGhlcjsgY2xpZW50cyBzaG91bGQgZGVhbCB3aXRoCisgIC8vIHJlZ2lvbiBleHRlbnRzIGRpcmVjdGx5LgorICB2aXJ0dWFsIERlZmluZWRPclVua25vd25TVmFsIGdldFNpemVJbkVsZW1lbnRzKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtUmVnaW9uICpyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgRWxlVHkpIHsKKyAgICByZXR1cm4gVW5rbm93blZhbCgpOworICB9CisKKyAgLy8vIEFycmF5VG9Qb2ludGVyIC0gVXNlZCBieSBFeHByRW5naW5lOjpWaXN0Q2FzdCB0byBoYW5kbGUgaW1wbGljaXQKKyAgLy8vICBjb252ZXJzaW9ucyBiZXR3ZWVuIGFycmF5cyBhbmQgcG9pbnRlcnMuCisgIHZpcnR1YWwgU1ZhbCBBcnJheVRvUG9pbnRlcihMb2MgQXJyYXksIFF1YWxUeXBlIEVsZW1lbnRUeSkgPSAwOworCisgIC8vLyBFdmFsdWF0ZXMgYSBjaGFpbiBvZiBkZXJpdmVkLXRvLWJhc2UgY2FzdHMgdGhyb3VnaCB0aGUgcGF0aCBzcGVjaWZpZWQgaW4KKyAgLy8vIFxwIENhc3QuCisgIFNWYWwgZXZhbERlcml2ZWRUb0Jhc2UoU1ZhbCBEZXJpdmVkLCBjb25zdCBDYXN0RXhwciAqQ2FzdCk7CisKKyAgLy8vIEV2YWx1YXRlcyBhIGNoYWluIG9mIGRlcml2ZWQtdG8tYmFzZSBjYXN0cyB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgcGF0aC4KKyAgU1ZhbCBldmFsRGVyaXZlZFRvQmFzZShTVmFsIERlcml2ZWQsIGNvbnN0IENYWEJhc2VQYXRoICZDYXN0UGF0aCk7CisKKyAgLy8vIEV2YWx1YXRlcyBhIGRlcml2ZWQtdG8tYmFzZSBjYXN0IHRocm91Z2ggYSBzaW5nbGUgbGV2ZWwgb2YgZGVyaXZhdGlvbi4KKyAgU1ZhbCBldmFsRGVyaXZlZFRvQmFzZShTVmFsIERlcml2ZWQsIFF1YWxUeXBlIERlcml2ZWRQdHJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNWaXJ0dWFsKTsKKworICAvLy8gXGJyaWVmIEF0dGVtcHRzIHRvIGRvIGEgZG93biBjYXN0LiBVc2VkIHRvIG1vZGVsIEJhc2VUb0Rlcml2ZWQgYW5kIEMrKworICAvLy8gICAgICAgIGR5bmFtaWNfY2FzdC4KKyAgLy8vIFRoZSBjYWxsYmFjayBtYXkgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgMyBzY2VuYXJpb3M6CisgIC8vLyAgLSBTdWNjZXNzZnVsIGNhc3QgKGV4OiBkZXJpdmVkIGlzIHN1YmNsYXNzIG9mIGJhc2UpLgorICAvLy8gIC0gRmFpbGVkIGNhc3QgKGV4OiBkZXJpdmVkIGlzIGRlZmluaXRlbHkgbm90IGEgc3ViY2xhc3Mgb2YgYmFzZSkuCisgIC8vLyAgICBUaGUgZGlzdGluY3Rpb24gb2YgdGhpcyBjYXNlIGZyb20gdGhlIG5leHQgb25lIGlzIG5lY2Vzc2FyeSB0byBtb2RlbAorICAvLy8gICAgZHluYW1pY19jYXN0LiAKKyAgLy8vICAtIFdlIGRvbid0IGtub3cgKGJhc2UgaXMgYSBzeW1ib2xpYyByZWdpb24gYW5kIHdlIGRvbid0IGhhdmUgCisgIC8vLyAgICBlbm91Z2ggaW5mbyB0byBkZXRlcm1pbmUgaWYgdGhlIGNhc3Qgd2lsbCBzdWNjZWVkIGF0IHJ1biB0aW1lKS4KKyAgLy8vIFRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIFNWYWwgcmVwcmVzZW50aW5nIHRoZSBkZXJpdmVkIGNsYXNzOyBpdCdzCisgIC8vLyB2YWxpZCBvbmx5IGlmIEZhaWxlZCBmbGFnIGlzIHNldCB0byBmYWxzZS4KKyAgU1ZhbCBhdHRlbXB0RG93bkNhc3QoU1ZhbCBCYXNlLCBRdWFsVHlwZSBEZXJpdmVkUHRyVHlwZSwgYm9vbCAmRmFpbGVkKTsKKworICBjb25zdCBFbGVtZW50UmVnaW9uICpHZXRFbGVtZW50WmVyb1JlZ2lvbihjb25zdCBTdWJSZWdpb24gKlIsIFF1YWxUeXBlIFQpOworCisgIC8vLyBjYXN0UmVnaW9uIC0gVXNlZCBieSBFeHByRW5naW5lOjpWaXNpdENhc3QgdG8gaGFuZGxlIGNhc3RzIGZyb20KKyAgLy8vICBhIE1lbVJlZ2lvbiogdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiB0eXBlLiAgJ1InIGlzIHRoZSByZWdpb24gYmVpbmcKKyAgLy8vICBjYXN0ZWQgYW5kICdDYXN0VG9UeScgdGhlIHJlc3VsdCB0eXBlIG9mIHRoZSBjYXN0LgorICBjb25zdCBNZW1SZWdpb24gKmNhc3RSZWdpb24oY29uc3QgTWVtUmVnaW9uICpyZWdpb24sIFF1YWxUeXBlIENhc3RUb1R5KTsKKworICB2aXJ0dWFsIFN0b3JlUmVmIHJlbW92ZURlYWRCaW5kaW5ncyhTdG9yZSBzdG9yZSwgY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKkxDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFJlYXBlciAmU3ltUmVhcGVyKSA9IDA7CisKKyAgdmlydHVhbCBib29sIGluY2x1ZGVkSW5CaW5kaW5ncyhTdG9yZSBzdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1SZWdpb24gKnJlZ2lvbikgY29uc3QgPSAwOworICAKKyAgLy8vIElmIHRoZSBTdG9yZU1hbmFnZXIgc3VwcG9ydHMgaXQsIGluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mCisgIC8vLyB0aGUgc3BlY2lmaWVkIFN0b3JlIG9iamVjdC4KKyAgdmlydHVhbCB2b2lkIGluY3JlbWVudFJlZmVyZW5jZUNvdW50KFN0b3JlIHN0b3JlKSB7fQorCisgIC8vLyBJZiB0aGUgU3RvcmVNYW5hZ2VyIHN1cHBvcnRzIGl0LCBkZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZgorICAvLy8gdGhlIHNwZWNpZmllZCBTdG9yZSBvYmplY3QuICBJZiB0aGUgcmVmZXJlbmNlIGNvdW50IGhpdHMgMCwgdGhlIG1lbW9yeQorICAvLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3QgaXMgcmVjeWNsZWQuCisgIHZpcnR1YWwgdm9pZCBkZWNyZW1lbnRSZWZlcmVuY2VDb3VudChTdG9yZSBzdG9yZSkge30KKworICB1c2luZyBJbnZhbGlkYXRlZFJlZ2lvbnMgPSBTbWFsbFZlY3Rvcjxjb25zdCBNZW1SZWdpb24gKiwgOD47CisKKyAgLy8vIGludmFsaWRhdGVSZWdpb25zIC0gQ2xlYXJzIG91dCB0aGUgc3BlY2lmaWVkIHJlZ2lvbnMgZnJvbSB0aGUgc3RvcmUsCisgIC8vLyAgbWFya2luZyB0aGVpciB2YWx1ZXMgYXMgdW5rbm93bi4gRGVwZW5kaW5nIG9uIHRoZSBzdG9yZSwgdGhpcyBtYXkgYWxzbworICAvLy8gIGludmFsaWRhdGUgYWRkaXRpb25hbCByZWdpb25zIHRoYXQgbWF5IGhhdmUgY2hhbmdlZCBiYXNlZCBvbiBhY2Nlc3NpbmcKKyAgLy8vICB0aGUgZ2l2ZW4gcmVnaW9ucy4gT3B0aW9uYWxseSwgaW52YWxpZGF0ZXMgbm9uLXN0YXRpYyBnbG9iYWxzIGFzIHdlbGwuCisgIC8vLyBccGFyYW1baW5dIHN0b3JlIFRoZSBpbml0aWFsIHN0b3JlCisgIC8vLyBccGFyYW1baW5dIFZhbHVlcyBUaGUgdmFsdWVzIHRvIGludmFsaWRhdGUuCisgIC8vLyBccGFyYW1baW5dIEUgVGhlIGN1cnJlbnQgc3RhdGVtZW50IGJlaW5nIGV2YWx1YXRlZC4gVXNlZCB0byBjb25qdXJlCisgIC8vLyAgIHN5bWJvbHMgdG8gbWFyayB0aGUgdmFsdWVzIG9mIGludmFsaWRhdGVkIHJlZ2lvbnMuCisgIC8vLyBccGFyYW1baW5dIENvdW50IFRoZSBjdXJyZW50IGJsb2NrIGNvdW50LiBVc2VkIHRvIGNvbmp1cmUKKyAgLy8vICAgc3ltYm9scyB0byBtYXJrIHRoZSB2YWx1ZXMgb2YgaW52YWxpZGF0ZWQgcmVnaW9ucy4KKyAgLy8vIFxwYXJhbVtpbl0gQ2FsbCBUaGUgY2FsbCBleHByZXNzaW9uIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2gKKyAgLy8vICAgZ2xvYmFscyBzaG91bGQgZ2V0IGludmFsaWRhdGVkLgorICAvLy8gXHBhcmFtW2luLG91dF0gSVMgQSBzZXQgdG8gZmlsbCB3aXRoIGFueSBzeW1ib2xzIHRoYXQgYXJlIG5vIGxvbmdlcgorICAvLy8gICBhY2Nlc3NpYmxlLiBQYXNzIFxjIE5VTEwgaWYgdGhpcyBpbmZvcm1hdGlvbiB3aWxsIG5vdCBiZSB1c2VkLgorICAvLy8gXHBhcmFtW2luXSBJVHJhaXRzIEluZm9ybWF0aW9uIGFib3V0IGludmFsaWRhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIAorICAvLy8gICByZWdpb24vc3ltYm9sLgorICAvLy8gXHBhcmFtW2luLG91dF0gSW52YWxpZGF0ZWRUb3BMZXZlbCBBIHZlY3RvciB0byBmaWxsIHdpdGggcmVnaW9ucworICAvLy8vICBleHBsaWNpdGx5IGJlaW5nIGludmFsaWRhdGVkLiBQYXNzIFxjIE5VTEwgaWYgdGhpcworICAvLy8gICBpbmZvcm1hdGlvbiB3aWxsIG5vdCBiZSB1c2VkLgorICAvLy8gXHBhcmFtW2luLG91dF0gSW52YWxpZGF0ZWQgQSB2ZWN0b3IgdG8gZmlsbCB3aXRoIGFueSByZWdpb25zIGJlaW5nCisgIC8vLyAgIGludmFsaWRhdGVkLiBUaGlzIHNob3VsZCBpbmNsdWRlIGFueSByZWdpb25zIGV4cGxpY2l0bHkgaW52YWxpZGF0ZWQKKyAgLy8vICAgZXZlbiBpZiB0aGV5IGRvIG5vdCBjdXJyZW50bHkgaGF2ZSBiaW5kaW5ncy4gUGFzcyBcYyBOVUxMIGlmIHRoaXMKKyAgLy8vICAgaW5mb3JtYXRpb24gd2lsbCBub3QgYmUgdXNlZC4KKyAgdmlydHVhbCBTdG9yZVJlZiBpbnZhbGlkYXRlUmVnaW9ucyhTdG9yZSBzdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTVmFsPiBWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqRSwgdW5zaWduZWQgQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFdmVudCAqQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkYXRlZFN5bWJvbHMgJklTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lvbkFuZFN5bWJvbEludmFsaWRhdGlvblRyYWl0cyAmSVRyYWl0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkYXRlZFJlZ2lvbnMgKkludmFsaWRhdGVkVG9wTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZGF0ZWRSZWdpb25zICpJbnZhbGlkYXRlZCkgPSAwOworCisgIC8vLyBlbnRlclN0YWNrRnJhbWUgLSBMZXQgdGhlIFN0b3JlTWFuYWdlciB0byBkbyBzb21ldGhpbmcgd2hlbiBleGVjdXRpb24KKyAgLy8vIGVuZ2luZSBpcyBhYm91dCB0byBleGVjdXRlIGludG8gYSBjYWxsZWUuCisgIFN0b3JlUmVmIGVudGVyU3RhY2tGcmFtZShTdG9yZSBzdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFdmVudCAmQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpDYWxsZWVDdHgpOworCisgIC8vLyBGaW5kcyB0aGUgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIHN5bWJvbHMgd2l0aGluIHRoZSBnaXZlbiByZWdpb24uCisgIC8vLworICAvLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRvciBhYm9ydGVkIHRoZSBzY2FuLgorICB2aXJ0dWFsIGJvb2wgc2NhblJlYWNoYWJsZVN5bWJvbHMoU3RvcmUgUywgY29uc3QgTWVtUmVnaW9uICpSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhblJlYWNoYWJsZVN5bWJvbHMgJlZpc2l0b3IpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgcHJpbnQoU3RvcmUgc3RvcmUsIHJhd19vc3RyZWFtICZPdXQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBubCwgY29uc3QgY2hhciAqc2VwKSA9IDA7CisKKyAgY2xhc3MgQmluZGluZ3NIYW5kbGVyIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgfkJpbmRpbmdzSGFuZGxlcigpOworCisgICAgdmlydHVhbCBib29sIEhhbmRsZUJpbmRpbmcoU3RvcmVNYW5hZ2VyJiBTTWdyLCBTdG9yZSBzdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1SZWdpb24gKnJlZ2lvbiwgU1ZhbCB2YWwpID0gMDsKKyAgfTsKKworICBjbGFzcyBGaW5kVW5pcXVlQmluZGluZyA6CisgIHB1YmxpYyBCaW5kaW5nc0hhbmRsZXIgeworICAgIFN5bWJvbFJlZiBTeW07CisgICAgY29uc3QgTWVtUmVnaW9uKiBCaW5kaW5nID0gbnVsbHB0cjsKKyAgICBib29sIEZpcnN0ID0gdHJ1ZTsKKworICBwdWJsaWM6CisgICAgRmluZFVuaXF1ZUJpbmRpbmcoU3ltYm9sUmVmIHN5bSkgOiBTeW0oc3ltKSB7fQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIHsgcmV0dXJuIEZpcnN0ICYmIEJpbmRpbmc7IH0KKworICAgIGJvb2wgSGFuZGxlQmluZGluZyhTdG9yZU1hbmFnZXImIFNNZ3IsIFN0b3JlIHN0b3JlLCBjb25zdCBNZW1SZWdpb24qIFIsCisgICAgICAgICAgICAgICAgICAgICAgIFNWYWwgdmFsKSBvdmVycmlkZTsKKyAgICBjb25zdCBNZW1SZWdpb24gKmdldFJlZ2lvbigpIHsgcmV0dXJuIEJpbmRpbmc7IH0KKyAgfTsKKworICAvLy8gaXRlckJpbmRpbmdzIC0gSXRlcmF0ZSBvdmVyIHRoZSBiaW5kaW5ncyBpbiB0aGUgU3RvcmUuCisgIHZpcnR1YWwgdm9pZCBpdGVyQmluZGluZ3MoU3RvcmUgc3RvcmUsIEJpbmRpbmdzSGFuZGxlciYgZikgPSAwOworCitwcm90ZWN0ZWQ6CisgIGNvbnN0IEVsZW1lbnRSZWdpb24gKk1ha2VFbGVtZW50UmVnaW9uKGNvbnN0IFN1YlJlZ2lvbiAqYmFzZVJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgcG9pbnRlZVR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBpbmRleCA9IDApOworCisgIC8vLyBDYXN0UmV0cmlldmVkVmFsIC0gVXNlZCBieSBzdWJjbGFzc2VzIG9mIFN0b3JlTWFuYWdlciB0byBpbXBsZW1lbnQKKyAgLy8vICBpbXBsaWNpdCBjYXN0cyB0aGF0IGFyaXNlIGZyb20gbG9hZHMgZnJvbSByZWdpb25zIHRoYXQgYXJlIHJlaW50ZXJwcmV0ZWQKKyAgLy8vICBhcyBhbm90aGVyIHJlZ2lvbi4KKyAgU1ZhbCBDYXN0UmV0cmlldmVkVmFsKFNWYWwgdmFsLCBjb25zdCBUeXBlZFZhbHVlUmVnaW9uICpyZWdpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgY2FzdFR5LCBib29sIHBlcmZvcm1UZXN0T25seSA9IHRydWUpOworCitwcml2YXRlOgorICBTVmFsIGdldExWYWx1ZUZpZWxkT3JJdmFyKGNvbnN0IERlY2wgKmRlY2wsIFNWYWwgYmFzZSk7Cit9OworCitpbmxpbmUgU3RvcmVSZWY6OlN0b3JlUmVmKFN0b3JlIHN0b3JlLCBTdG9yZU1hbmFnZXIgJiBzbWdyKQorICAgIDogc3RvcmUoc3RvcmUpLCBtZ3Ioc21ncikgeworICBpZiAoc3RvcmUpCisgICAgbWdyLmluY3JlbWVudFJlZmVyZW5jZUNvdW50KHN0b3JlKTsKK30KKworaW5saW5lIFN0b3JlUmVmOjpTdG9yZVJlZihjb25zdCBTdG9yZVJlZiAmc3IpCisgICAgOiBzdG9yZShzci5zdG9yZSksIG1ncihzci5tZ3IpCit7IAorICBpZiAoc3RvcmUpCisgICAgbWdyLmluY3JlbWVudFJlZmVyZW5jZUNvdW50KHN0b3JlKTsKK30KKyAgCitpbmxpbmUgU3RvcmVSZWY6On5TdG9yZVJlZigpIHsKKyAgaWYgKHN0b3JlKQorICAgIG1nci5kZWNyZW1lbnRSZWZlcmVuY2VDb3VudChzdG9yZSk7Cit9CisgIAoraW5saW5lIFN0b3JlUmVmICZTdG9yZVJlZjo6b3BlcmF0b3I9KFN0b3JlUmVmIGNvbnN0ICZuZXdTdG9yZSkgeworICBhc3NlcnQoJm5ld1N0b3JlLm1nciA9PSAmbWdyKTsKKyAgaWYgKHN0b3JlICE9IG5ld1N0b3JlLnN0b3JlKSB7CisgICAgbWdyLmluY3JlbWVudFJlZmVyZW5jZUNvdW50KG5ld1N0b3JlLnN0b3JlKTsKKyAgICBtZ3IuZGVjcmVtZW50UmVmZXJlbmNlQ291bnQoc3RvcmUpOworICAgIHN0b3JlID0gbmV3U3RvcmUuZ2V0U3RvcmUoKTsKKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CisKKy8vIEZJWE1FOiBEbyB3ZSBuZWVkIHRvIHBhc3MgUHJvZ3JhbVN0YXRlTWFuYWdlciBhbnltb3JlPworc3RkOjp1bmlxdWVfcHRyPFN0b3JlTWFuYWdlcj4KK0NyZWF0ZVJlZ2lvblN0b3JlTWFuYWdlcihQcm9ncmFtU3RhdGVNYW5hZ2VyICZTdE1ncik7CitzdGQ6OnVuaXF1ZV9wdHI8U3RvcmVNYW5hZ2VyPgorQ3JlYXRlRmllbGRzT25seVJlZ2lvblN0b3JlTWFuYWdlcihQcm9ncmFtU3RhdGVNYW5hZ2VyICZTdE1ncik7CisKK30gLy8gbmFtZXNwYWNlIGVudG8KKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX1NUT1JFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TdG9yZVJlZi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N0b3JlUmVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViNGU1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TdG9yZVJlZi5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vPT09LSBTdG9yZVJlZi5oIC0gU21hcnQgcG9pbnRlciBmb3Igc3RvcmUgb2JqZWN0cyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVkIHRoZSB0eXBlIFN0b3JlUmVmLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfU1RPUkVSRUZfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9TVE9SRVJFRl9ICisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGVudG8geworICAKK2NsYXNzIFN0b3JlTWFuYWdlcjsKKyAgCisvLy8gU3RvcmUgLSBUaGlzIG9wYXF1ZSB0eXBlIGVuY2Fwc3VsYXRlcyBhbiBpbW11dGFibGUgbWFwcGluZyBmcm9tCisvLy8gIGxvY2F0aW9ucyB0byB2YWx1ZXMuICBBdCBhIGhpZ2gtbGV2ZWwsIGl0IHJlcHJlc2VudHMgdGhlIHN5bWJvbGljCisvLy8gIG1lbW9yeSBtb2RlbC4gIERpZmZlcmVudCBzdWJjbGFzc2VzIG9mIFN0b3JlTWFuYWdlciBtYXkgY2hvb3NlCisvLy8gIGRpZmZlcmVudCB0eXBlcyB0byByZXByZXNlbnQgdGhlIGxvY2F0aW9ucyBhbmQgdmFsdWVzLgordXNpbmcgU3RvcmUgPSBjb25zdCB2b2lkICo7CisgIAorY2xhc3MgU3RvcmVSZWYgeworICBTdG9yZSBzdG9yZTsKKyAgU3RvcmVNYW5hZ2VyICZtZ3I7CisKK3B1YmxpYzoKKyAgU3RvcmVSZWYoU3RvcmUgc3RvcmUsIFN0b3JlTWFuYWdlciAmc21ncik7CisgIFN0b3JlUmVmKGNvbnN0IFN0b3JlUmVmICZzcik7CisgIFN0b3JlUmVmICZvcGVyYXRvcj0oU3RvcmVSZWYgY29uc3QgJm5ld1N0b3JlKTsKKyAgflN0b3JlUmVmKCk7CisgIAorICBib29sIG9wZXJhdG9yPT0oY29uc3QgU3RvcmVSZWYgJngpIGNvbnN0IHsKKyAgICBhc3NlcnQoJm1nciA9PSAmeC5tZ3IpOworICAgIHJldHVybiB4LnN0b3JlID09IHN0b3JlOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN0b3JlUmVmICZ4KSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3I9PSh4KTsgfQorICAKKyAgU3RvcmUgZ2V0U3RvcmUoKSBjb25zdCB7IHJldHVybiBzdG9yZTsgfQorICBjb25zdCBTdG9yZU1hbmFnZXIgJmdldFN0b3JlTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIG1ncjsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgZW50bworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX1NUT1JFUkVGX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TdWJFbmdpbmUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TdWJFbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTc0ZmZkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N1YkVuZ2luZS5oCkBAIC0wLDAgKzEsMTc3IEBACisvLz09IFN1YkVuZ2luZS5oIC0gSW50ZXJmYWNlIG9mIHRoZSBzdWJlbmdpbmUgb2YgQ29yZUVuZ2luZSAtLS0tLS0tLSotIEMrKyAtKi0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2Ugb2YgYSBzdWJlbmdpbmUgb2YgdGhlIENvcmVFbmdpbmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfU1VCRU5HSU5FX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfU1VCRU5HSU5FX0gKKworI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL1Byb2dyYW1Qb2ludC5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TVmFscy5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TdG9yZS5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBDRkdCbG9jazsKK2NsYXNzIENGR0VsZW1lbnQ7CitjbGFzcyBMb2NhdGlvbkNvbnRleHQ7CitjbGFzcyBTdG10OworCituYW1lc3BhY2UgY3Jvc3NfdHUgeworY2xhc3MgQ3Jvc3NUcmFuc2xhdGlvblVuaXRDb250ZXh0OworfQorCituYW1lc3BhY2UgZW50byB7CisgIAorc3RydWN0IE5vZGVCdWlsZGVyQ29udGV4dDsKK2NsYXNzIEFuYWx5c2lzTWFuYWdlcjsKK2NsYXNzIEV4cGxvZGVkTm9kZVNldDsKK2NsYXNzIEV4cGxvZGVkTm9kZTsKK2NsYXNzIFByb2dyYW1TdGF0ZTsKK2NsYXNzIFByb2dyYW1TdGF0ZU1hbmFnZXI7CitjbGFzcyBCbG9ja0NvdW50ZXI7CitjbGFzcyBCcmFuY2hOb2RlQnVpbGRlcjsKK2NsYXNzIEluZGlyZWN0R290b05vZGVCdWlsZGVyOworY2xhc3MgU3dpdGNoTm9kZUJ1aWxkZXI7CitjbGFzcyBFbmRPZkZ1bmN0aW9uTm9kZUJ1aWxkZXI7CitjbGFzcyBOb2RlQnVpbGRlcldpdGhTaW5rczsKK2NsYXNzIE1lbVJlZ2lvbjsKKworY2xhc3MgU3ViRW5naW5lIHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworcHVibGljOgorICB2aXJ0dWFsIH5TdWJFbmdpbmUoKSB7fQorCisgIHZpcnR1YWwgUHJvZ3JhbVN0YXRlUmVmIGdldEluaXRpYWxTdGF0ZShjb25zdCBMb2NhdGlvbkNvbnRleHQgKkluaXRMb2MpID0gMDsKKworICB2aXJ0dWFsIEFuYWx5c2lzTWFuYWdlciAmZ2V0QW5hbHlzaXNNYW5hZ2VyKCkgPSAwOworCisgIHZpcnR1YWwgY3Jvc3NfdHU6OkNyb3NzVHJhbnNsYXRpb25Vbml0Q29udGV4dCAqCisgIGdldENyb3NzVHJhbnNsYXRpb25Vbml0Q29udGV4dCgpID0gMDsKKworICB2aXJ0dWFsIFByb2dyYW1TdGF0ZU1hbmFnZXIgJmdldFN0YXRlTWFuYWdlcigpID0gMDsKKworICAvLy8gQ2FsbGVkIGJ5IENvcmVFbmdpbmUuIFVzZWQgdG8gZ2VuZXJhdGUgbmV3IHN1Y2Nlc3NvcgorICAvLy8gbm9kZXMgYnkgcHJvY2Vzc2luZyB0aGUgJ2VmZmVjdHMnIG9mIGEgYmxvY2stbGV2ZWwgc3RhdGVtZW50LgorICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0NGR0VsZW1lbnQoY29uc3QgQ0ZHRWxlbWVudCBFLCBFeHBsb2RlZE5vZGUqIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdG10SWR4LCBOb2RlQnVpbGRlckNvbnRleHQgKkN0eCk9MDsKKworICAvLy8gQ2FsbGVkIGJ5IENvcmVFbmdpbmUgd2hlbiBpdCBzdGFydHMgcHJvY2Vzc2luZyBhIENGR0Jsb2NrLiAgVGhlCisgIC8vLyBTdWJFbmdpbmUgaXMgZXhwZWN0ZWQgdG8gcG9wdWxhdGUgZHN0Tm9kZXMgd2l0aCBuZXcgbm9kZXMgcmVwcmVzZW50aW5nCisgIC8vLyB1cGRhdGVkIGFuYWx5c2lzIHN0YXRlLCBvciBnZW5lcmF0ZSBubyBub2RlcyBhdCBhbGwgaWYgaXQgZG9lc24ndC4KKyAgdmlydHVhbCB2b2lkIHByb2Nlc3NDRkdCbG9ja0VudHJhbmNlKGNvbnN0IEJsb2NrRWRnZSAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVCdWlsZGVyV2l0aFNpbmtzICZub2RlQnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCkgPSAwOworCisgIC8vLyBDYWxsZWQgYnkgQ29yZUVuZ2luZS4gIFVzZWQgdG8gZ2VuZXJhdGUgc3VjY2Vzc29yCisgIC8vLyAgbm9kZXMgYnkgcHJvY2Vzc2luZyB0aGUgJ2VmZmVjdHMnIG9mIGEgYnJhbmNoIGNvbmRpdGlvbi4KKyAgdmlydHVhbCB2b2lkIHByb2Nlc3NCcmFuY2goY29uc3QgU3RtdCAqQ29uZGl0aW9uLCBjb25zdCBTdG10ICpUZXJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlQnVpbGRlckNvbnRleHQmIEJ1aWxkZXJDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGR0Jsb2NrICpEc3RULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkdCbG9jayAqRHN0RikgPSAwOworCisgIC8vLyBDYWxsZWQgYnkgQ29yZUVuZ2luZS4KKyAgLy8vIFVzZWQgdG8gZ2VuZXJhdGUgc3VjY2Vzc29yIG5vZGVzIGZvciB0ZW1wb3JhcnkgZGVzdHJ1Y3RvcnMgZGVwZW5kaW5nCisgIC8vLyBvbiB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIGNvbnN0cnVjdG9yIHdhcyB2aXNpdGVkLgorICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0NsZWFudXBUZW1wb3JhcnlCcmFuY2goY29uc3QgQ1hYQmluZFRlbXBvcmFyeUV4cHIgKkJURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVCdWlsZGVyQ29udGV4dCAmQmxkQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkdCbG9jayAqRHN0VCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGR0Jsb2NrICpEc3RGKSA9IDA7CisKKyAgLy8vIENhbGxlZCBieSBDb3JlRW5naW5lLiAgVXNlZCB0byBwcm9jZXNzaW5nIGJyYW5jaGluZyBiZWhhdmlvcgorICAvLy8gYXQgc3RhdGljIGluaXRpYWxpemVycy4KKyAgdmlydHVhbCB2b2lkIHByb2Nlc3NTdGF0aWNJbml0aWFsaXplcihjb25zdCBEZWNsU3RtdCAqRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZUJ1aWxkZXJDb250ZXh0JiBCdWlsZGVyQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGVTZXQgJkRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkdCbG9jayAqRHN0VCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkdCbG9jayAqRHN0RikgPSAwOworCisgIC8vLyBDYWxsZWQgYnkgQ29yZUVuZ2luZS4gIFVzZWQgdG8gZ2VuZXJhdGUgc3VjY2Vzc29yCisgIC8vLyBub2RlcyBieSBwcm9jZXNzaW5nIHRoZSAnZWZmZWN0cycgb2YgYSBjb21wdXRlZCBnb3RvIGp1bXAuCisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzSW5kaXJlY3RHb3RvKEluZGlyZWN0R290b05vZGVCdWlsZGVyJiBidWlsZGVyKSA9IDA7CisKKyAgLy8vIENhbGxlZCBieSBDb3JlRW5naW5lLiAgVXNlZCB0byBnZW5lcmF0ZSBzdWNjZXNzb3IKKyAgLy8vIG5vZGVzIGJ5IHByb2Nlc3NpbmcgdGhlICdlZmZlY3RzJyBvZiBhIHN3aXRjaCBzdGF0ZW1lbnQuCisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzU3dpdGNoKFN3aXRjaE5vZGVCdWlsZGVyJiBidWlsZGVyKSA9IDA7CisKKyAgLy8vIENhbGxlZCBieSBDb3JlRW5naW5lLiAgVXNlZCB0byBub3RpZnkgY2hlY2tlcnMgdGhhdCBwcm9jZXNzaW5nIGEKKyAgLy8vIGZ1bmN0aW9uIGhhcyBiZWd1bi4gQ2FsbGVkIGZvciBib3RoIGlubGluZWQgYW5kIGFuZCB0b3AtbGV2ZWwgZnVuY3Rpb25zLgorICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0JlZ2luT2ZGdW5jdGlvbihOb2RlQnVpbGRlckNvbnRleHQgJkJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCbG9ja0VkZ2UgJkwpID0gMDsKKworICAvLy8gQ2FsbGVkIGJ5IENvcmVFbmdpbmUuICBVc2VkIHRvIG5vdGlmeSBjaGVja2VycyB0aGF0IHByb2Nlc3NpbmcgYQorICAvLy8gZnVuY3Rpb24gaGFzIGVuZGVkLiBDYWxsZWQgZm9yIGJvdGggaW5saW5lZCBhbmQgYW5kIHRvcC1sZXZlbCBmdW5jdGlvbnMuCisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzRW5kT2ZGdW5jdGlvbihOb2RlQnVpbGRlckNvbnRleHQmIEJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0dXJuU3RtdCAqUlMgPSBudWxscHRyKSA9IDA7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGVudHJ5IG5vZGUgb2YgdGhlIGNhbGxlZS4KKyAgdmlydHVhbCB2b2lkIHByb2Nlc3NDYWxsRW50ZXIoTm9kZUJ1aWxkZXJDb250ZXh0JiBCQywgQ2FsbEVudGVyIENFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQpID0gMDsKKworICAvLyBHZW5lcmF0ZSB0aGUgZmlyc3QgcG9zdCBjYWxsc2l0ZSBub2RlLgorICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0NhbGxFeGl0KEV4cGxvZGVkTm9kZSAqUHJlZCkgPSAwOworCisgIC8vLyBDYWxsZWQgYnkgQ29uc3RyYWludE1hbmFnZXIuIFVzZWQgdG8gY2FsbCBjaGVja2VyLXNwZWNpZmljCisgIC8vLyBsb2dpYyBmb3IgaGFuZGxpbmcgYXNzdW1wdGlvbnMgb24gc3ltYm9saWMgdmFsdWVzLgorICB2aXJ0dWFsIFByb2dyYW1TdGF0ZVJlZiBwcm9jZXNzQXNzdW1lKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWYWwgY29uZCwgYm9vbCBhc3N1bXB0aW9uKSA9IDA7CisKKyAgLy8vIHByb2Nlc3NSZWdpb25DaGFuZ2VzIC0gQ2FsbGVkIGJ5IFByb2dyYW1TdGF0ZU1hbmFnZXIgd2hlbmV2ZXIgYSBjaGFuZ2UgaXMKKyAgLy8vIG1hZGUgdG8gdGhlIHN0b3JlLiBVc2VkIHRvIHVwZGF0ZSBjaGVja2VycyB0aGF0IHRyYWNrIHJlZ2lvbiB2YWx1ZXMuCisgIHZpcnR1YWwgUHJvZ3JhbVN0YXRlUmVmIAorICBwcm9jZXNzUmVnaW9uQ2hhbmdlcyhQcm9ncmFtU3RhdGVSZWYgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludmFsaWRhdGVkU3ltYm9scyAqaW52YWxpZGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IE1lbVJlZ2lvbiAqPiBFeHBsaWNpdFJlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IE1lbVJlZ2lvbiAqPiBSZWdpb25zLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFdmVudCAqQ2FsbCkgPSAwOworCisKKyAgaW5saW5lIFByb2dyYW1TdGF0ZVJlZiAKKyAgcHJvY2Vzc1JlZ2lvbkNoYW5nZShQcm9ncmFtU3RhdGVSZWYgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtUmVnaW9uKiBNUiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgpIHsKKyAgICByZXR1cm4gcHJvY2Vzc1JlZ2lvbkNoYW5nZXMoc3RhdGUsIG51bGxwdHIsIE1SLCBNUiwgTEN0eCwgbnVsbHB0cik7CisgIH0KKworICB2aXJ0dWFsIFByb2dyYW1TdGF0ZVJlZgorICBwcm9jZXNzUG9pbnRlckVzY2FwZWRPbkJpbmQoUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLCBTVmFsIExvYywgU1ZhbCBWYWwsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCkgPSAwOworCisgIHZpcnR1YWwgUHJvZ3JhbVN0YXRlUmVmCisgIG5vdGlmeUNoZWNrZXJzT2ZQb2ludGVyRXNjYXBlKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludmFsaWRhdGVkU3ltYm9scyAqSW52YWxpZGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBNZW1SZWdpb24gKj4gRXhwbGljaXRSZWdpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgTWVtUmVnaW9uICo+IFJlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsRXZlbnQgKkNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpb25BbmRTeW1ib2xJbnZhbGlkYXRpb25UcmFpdHMgJkhUcmFpdHMpID0gMDsKKworICAvLy8gcHJpbnRTdGF0ZSAtIENhbGxlZCBieSBQcm9ncmFtU3RhdGVNYW5hZ2VyIHRvIHByaW50IGNoZWNrZXItc3BlY2lmaWMgZGF0YS4KKyAgdmlydHVhbCB2b2lkIHByaW50U3RhdGUocmF3X29zdHJlYW0gJk91dCwgUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOTCwgY29uc3QgY2hhciAqU2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHggPSBudWxscHRyKSA9IDA7CisKKyAgLy8vIENhbGxlZCBieSBDb3JlRW5naW5lIHdoZW4gdGhlIGFuYWx5c2lzIHdvcmtsaXN0IGlzIGVpdGhlciBlbXB0eSBvciB0aGUKKyAgLy8gIG1heGltdW0gbnVtYmVyIG9mIGFuYWx5c2lzIHN0ZXBzIGhhdmUgYmVlbiByZWFjaGVkLgorICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0VuZFdvcmtsaXN0KGJvb2wgaGFzV29ya1JlbWFpbmluZykgPSAwOworfTsKKworfSAvLyBlbmQgR1IgbmFtZXNwYWNlCisKK30gLy8gZW5kIGNsYW5nIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TdW1tYXJ5TWFuYWdlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N1bW1hcnlNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkNzhiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TdW1tYXJ5TWFuYWdlci5oCkBAIC0wLDAgKzEsNTggQEAKKy8vPT0gU3VtbWFyeU1hbmFnZXIuaCAtIEdlbmVyaWMgaGFuZGxpbmcgb2YgZnVuY3Rpb24gc3VtbWFyaWVzIC0tKi0gQysrIC0qLS09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIFN1bW1hcnlNYW5hZ2VyIGFuZCByZWxhdGVkIGNsYXNzZXMsIHdoaWNoIHByb3ZpZGVzCisvLyAgYSBnZW5lcmljIG1lY2hhbmlzbSBmb3IgbWFuYWdpbmcgZnVuY3Rpb24gc3VtbWFyaWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19HUl9TVU1NQVJZCisjZGVmaW5lIExMVk1fQ0xBTkdfR1JfU1VNTUFSWQorCituYW1lc3BhY2UgY2xhbmcgeworCituYW1lc3BhY2UgZW50byB7CisKK25hbWVzcGFjZSBzdW1tTWdyIHsKKworICAKKy8qIEtleSBraW5kczoKKyAKKyAtIEMgZnVuY3Rpb25zCisgLSBDKysgZnVuY3Rpb25zIChuYW1lICsgcGFyYW1ldGVyIHR5cGVzKQorIC0gT2JqQyBtZXRob2RzOgorICAgLSBDbGFzcywgc2VsZWN0b3IgKGNsYXNzIG1ldGhvZCkKKyAgIC0gQ2xhc3MsIHNlbGVjdG9yIChpbnN0YW5jZSBtZXRob2QpCisgICAtIENhdGVnb3J5LCBzZWxlY3RvciAoaW5zdGFuY2UgbWV0aG9kKQorICAgLSBQcm90b2NvbCwgc2VsZWN0b3IgKGluc3RhbmNlIG1ldGhvZCkKKyAtIEMrKyBtZXRob2RzCisgIC0gQ2xhc3MsIGZ1bmN0aW9uIG5hbWUgKyBwYXJhbWV0ZXIgdHlwZXMgKyBjb25zdAorICovCisgIAorY2xhc3MgU3VtbWFyeUtleSB7CisgIAorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nOjpzdW1tTWdyCisgIAorY2xhc3MgU3VtbWFyeU1hbmFnZXJJbXBsIHsKKyAgCit9OworCisgIAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBTdW1tYXJ5TWFuYWdlciA6IFN1bW1hcnlNYW5hZ2VySW1wbCB7CisgIAorfTsKKworfSAvLyBlbmQgR1IgbmFtZXNwYWNlCisKK30gLy8gZW5kIGNsYW5nIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TeW1FeHByLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU3ltRXhwci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NTUxZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU3ltRXhwci5oCkBAIC0wLDAgKzEsMTQwIEBACisvLz09PS0gU3ltRXhwci5oIC0gTWFuYWdlbWVudCBvZiBTeW1ib2xpYyBWYWx1ZXMgLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyBTeW1FeHByIGFuZCBTeW1ib2xEYXRhLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfU1lNRVhQUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX1NZTUVYUFJfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBlbnRvIHsKKworY2xhc3MgTWVtUmVnaW9uOworCisvLy8gXGJyaWVmIFN5bWJvbGljIHZhbHVlLiBUaGVzZSB2YWx1ZXMgdXNlZCB0byBjYXB0dXJlIHN5bWJvbGljIGV4ZWN1dGlvbiBvZgorLy8vIHRoZSBwcm9ncmFtLgorY2xhc3MgU3ltRXhwciA6IHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHVibGljOgorICBlbnVtIEtpbmQgeworI2RlZmluZSBTWU1CT0woSWQsIFBhcmVudCkgSWQjI0tpbmQsCisjZGVmaW5lIFNZTUJPTF9SQU5HRShJZCwgRmlyc3QsIExhc3QpIEJFR0lOXyMjSWQgPSBGaXJzdCwgRU5EXyMjSWQgPSBMYXN0LAorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TeW1ib2xzLmRlZiIKKyAgfTsKKworcHJpdmF0ZToKKyAgS2luZCBLOworCitwcm90ZWN0ZWQ6CisgIFN5bUV4cHIoS2luZCBrKSA6IEsoaykge30KKworICBzdGF0aWMgYm9vbCBpc1ZhbGlkVHlwZUZvclN5bWJvbChRdWFsVHlwZSBUKSB7CisgICAgLy8gRklYTUU6IERlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGNob29zZSB0byBkZXByZWNhdGUgc3RydWN0dXJhbCBzeW1ib2xzLAorICAgIC8vIHRoaXMgbWF5IGJlY29tZSBtdWNoIHN0cmljdGVyLgorICAgIHJldHVybiAhVC5pc051bGwoKSAmJiAhVC0+aXNWb2lkVHlwZSgpOworICB9CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+U3ltRXhwcigpID0gZGVmYXVsdDsKKworICBLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLOyB9CisKKyAgdmlydHVhbCB2b2lkIGR1bXAoKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qge30KKworICB2aXJ0dWFsIFF1YWxUeXBlIGdldFR5cGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJnByb2ZpbGUpID0gMDsKKworICAvLy8gXGJyaWVmIEl0ZXJhdG9yIG92ZXIgc3ltYm9scyB0aGF0IHRoZSBjdXJyZW50IHN5bWJvbCBkZXBlbmRzIG9uLgorICAvLy8KKyAgLy8vIEZvciBTeW1ib2xEYXRhLCBpdCdzIHRoZSBzeW1ib2wgaXRzZWxmOyBmb3IgZXhwcmVzc2lvbnMsIGl0J3MgdGhlCisgIC8vLyBleHByZXNzaW9uIHN5bWJvbCBhbmQgYWxsIHRoZSBvcGVyYW5kcyBpbiBpdC4gTm90ZSwgU3ltYm9sRGVyaXZlZCBpcworICAvLy8gdHJlYXRlZCBhcyBTeW1ib2xEYXRhIC0gdGhlIGl0ZXJhdG9yIHdpbGwgTk9UIHZpc2l0IHRoZSBwYXJlbnQgcmVnaW9uLgorICBjbGFzcyBzeW1ib2xfaXRlcmF0b3IgeworICAgIFNtYWxsVmVjdG9yPGNvbnN0IFN5bUV4cHIgKiwgNT4gaXRyOworCisgICAgdm9pZCBleHBhbmQoKTsKKworICBwdWJsaWM6CisgICAgc3ltYm9sX2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworICAgIHN5bWJvbF9pdGVyYXRvcihjb25zdCBTeW1FeHByICpTRSk7CisKKyAgICBzeW1ib2xfaXRlcmF0b3IgJm9wZXJhdG9yKysoKTsKKyAgICBjb25zdCBTeW1FeHByICpvcGVyYXRvciooKTsKKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBzeW1ib2xfaXRlcmF0b3IgJlgpIGNvbnN0OworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBzeW1ib2xfaXRlcmF0b3IgJlgpIGNvbnN0OworICB9OworCisgIHN5bWJvbF9pdGVyYXRvciBzeW1ib2xfYmVnaW4oKSBjb25zdCB7IHJldHVybiBzeW1ib2xfaXRlcmF0b3IodGhpcyk7IH0KKyAgc3RhdGljIHN5bWJvbF9pdGVyYXRvciBzeW1ib2xfZW5kKCkgeyByZXR1cm4gc3ltYm9sX2l0ZXJhdG9yKCk7IH0KKworICB1bnNpZ25lZCBjb21wdXRlQ29tcGxleGl0eSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRmluZCB0aGUgcmVnaW9uIGZyb20gd2hpY2ggdGhpcyBzeW1ib2wgb3JpZ2luYXRlcy4KKyAgLy8vCisgIC8vLyBXaGVuZXZlciB0aGUgc3ltYm9sIHdhcyBjb25zdHJ1Y3RlZCB0byBkZW5vdGUgYW4gdW5rbm93biB2YWx1ZSBvZgorICAvLy8gYSBjZXJ0YWluIG1lbW9yeSByZWdpb24sIHJldHVybiB0aGlzIHJlZ2lvbi4gVGhpcyBtZXRob2QKKyAgLy8vIGFsbG93cyBjaGVja2VycyB0byBtYWtlIGRlY2lzaW9ucyBkZXBlbmRpbmcgb24gdGhlIG9yaWdpbiBvZiB0aGUgc3ltYm9sLgorICAvLy8gU3ltYm9sIGNsYXNzZXMgZm9yIHdoaWNoIHRoZSBvcmlnaW4gcmVnaW9uIGlzIGtub3duIGluY2x1ZGUKKyAgLy8vIFN5bWJvbFJlZ2lvblZhbHVlIHdoaWNoIGRlbm90ZXMgdGhlIHZhbHVlIG9mIHRoZSByZWdpb24gYmVmb3JlCisgIC8vLyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhbmFseXNpcywgYW5kIFN5bWJvbERlcml2ZWQgd2hpY2ggZGVub3RlcyB0aGUgdmFsdWUKKyAgLy8vIG9mIGEgY2VydGFpbiBtZW1vcnkgcmVnaW9uIGFmdGVyIGl0cyBzdXBlciByZWdpb24gKGEgbWVtb3J5IHNwYWNlIG9yCisgIC8vLyBhIGxhcmdlciByZWNvcmQgcmVnaW9uKSBpcyBkZWZhdWx0LWJvdW5kIHdpdGggYSBjZXJ0YWluIHN5bWJvbC4KKyAgdmlydHVhbCBjb25zdCBNZW1SZWdpb24gKmdldE9yaWdpblJlZ2lvbigpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KK307CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhbmc6OmVudG86OlN5bUV4cHIgKlNFKSB7CisgIFNFLT5kdW1wVG9TdHJlYW0ob3MpOworICByZXR1cm4gb3M7Cit9CisKK3VzaW5nIFN5bWJvbFJlZiA9IGNvbnN0IFN5bUV4cHIgKjsKK3VzaW5nIFN5bWJvbFJlZlNtYWxsVmVjdG9yVHkgPSBTbWFsbFZlY3RvcjxTeW1ib2xSZWYsIDI+OwordXNpbmcgU3ltYm9sSUQgPSB1bnNpZ25lZDsKKworLy8vIFxicmllZiBBIHN5bWJvbCByZXByZXNlbnRpbmcgZGF0YSB3aGljaCBjYW4gYmUgc3RvcmVkIGluIGEgbWVtb3J5IGxvY2F0aW9uCisvLy8gKHJlZ2lvbikuCitjbGFzcyBTeW1ib2xEYXRhIDogcHVibGljIFN5bUV4cHIgeworICBjb25zdCBTeW1ib2xJRCBTeW07CisKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICBTeW1ib2xEYXRhKEtpbmQgaywgU3ltYm9sSUQgc3ltKSA6IFN5bUV4cHIoayksIFN5bShzeW0pIHsKKyAgICBhc3NlcnQoY2xhc3NvZih0aGlzKSk7CisgIH0KKworcHVibGljOgorICB+U3ltYm9sRGF0YSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICBTeW1ib2xJRCBnZXRTeW1ib2xJRCgpIGNvbnN0IHsgcmV0dXJuIFN5bTsgfQorCisgIC8vIEltcGxlbWVudCBpc2E8VD4gc3VwcG9ydC4KKyAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgU3ltRXhwciAqU0UpIHsKKyAgICBLaW5kIGsgPSBTRS0+Z2V0S2luZCgpOworICAgIHJldHVybiBrID49IEJFR0lOX1NZTUJPTFMgJiYgayA8PSBFTkRfU1lNQk9MUzsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgZW50bworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX1NZTUVYUFJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N5bWJvbE1hbmFnZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TeW1ib2xNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIyMmU4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TeW1ib2xNYW5hZ2VyLmgKQEAgLTAsMCArMSw2NDAgQEAKKy8vPT09LSBTeW1ib2xNYW5hZ2VyLmggLSBNYW5hZ2VtZW50IG9mIFN5bWJvbGljIFZhbHVlcyAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIFN5bWJvbE1hbmFnZXIsIGEgY2xhc3MgdGhhdCBtYW5hZ2VzIHN5bWJvbGljIHZhbHVlcworLy8gIGNyZWF0ZWQgZm9yIHVzZSBieSBFeHByRW5naW5lIGFuZCByZWxhdGVkIGNsYXNzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9TWU1CT0xNQU5BR0VSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfU1lNQk9MTUFOQUdFUl9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXhwci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQW5hbHlzaXNEZWNsQ29udGV4dC5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvTWVtUmVnaW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N0b3JlUmVmLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N5bUV4cHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBU1RDb250ZXh0OworY2xhc3MgU3RtdDsKKworbmFtZXNwYWNlIGVudG8geworCitjbGFzcyBCYXNpY1ZhbHVlRmFjdG9yeTsKK2NsYXNzIFN0b3JlTWFuYWdlcjsKKworLy8vXGJyaWVmIEEgc3ltYm9sIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgc3RvcmVkIGF0IGEgTWVtUmVnaW9uLgorY2xhc3MgU3ltYm9sUmVnaW9uVmFsdWUgOiBwdWJsaWMgU3ltYm9sRGF0YSB7CisgIGNvbnN0IFR5cGVkVmFsdWVSZWdpb24gKlI7CisKK3B1YmxpYzoKKyAgU3ltYm9sUmVnaW9uVmFsdWUoU3ltYm9sSUQgc3ltLCBjb25zdCBUeXBlZFZhbHVlUmVnaW9uICpyKQorICAgICAgOiBTeW1ib2xEYXRhKFN5bWJvbFJlZ2lvblZhbHVlS2luZCwgc3ltKSwgUihyKSB7CisgICAgYXNzZXJ0KHIpOworICAgIGFzc2VydChpc1ZhbGlkVHlwZUZvclN5bWJvbChyLT5nZXRWYWx1ZVR5cGUoKSkpOworICB9CisKKyAgY29uc3QgVHlwZWRWYWx1ZVJlZ2lvbiogZ2V0UmVnaW9uKCkgY29uc3QgeyByZXR1cm4gUjsgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgcHJvZmlsZSwgY29uc3QgVHlwZWRWYWx1ZVJlZ2lvbiogUikgeworICAgIHByb2ZpbGUuQWRkSW50ZWdlcigodW5zaWduZWQpIFN5bWJvbFJlZ2lvblZhbHVlS2luZCk7CisgICAgcHJvZmlsZS5BZGRQb2ludGVyKFIpOworICB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIHByb2ZpbGUpIG92ZXJyaWRlIHsKKyAgICBQcm9maWxlKHByb2ZpbGUsIFIpOworICB9CisKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKKyAgY29uc3QgTWVtUmVnaW9uICpnZXRPcmlnaW5SZWdpb24oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBnZXRSZWdpb24oKTsgfQorCisgIFF1YWxUeXBlIGdldFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKworICAvLyBJbXBsZW1lbnQgaXNhPFQ+IHN1cHBvcnQuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3ltRXhwciAqU0UpIHsKKyAgICByZXR1cm4gU0UtPmdldEtpbmQoKSA9PSBTeW1ib2xSZWdpb25WYWx1ZUtpbmQ7CisgIH0KK307CisKKy8vLyBBIHN5bWJvbCByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uIGluIHRoZSBjYXNlIHdoZW4gd2UgZG8KKy8vLyBub3Qga25vdyBhbnl0aGluZyBhYm91dCB3aGF0IHRoZSBleHByZXNzaW9uIGlzLgorY2xhc3MgU3ltYm9sQ29uanVyZWQgOiBwdWJsaWMgU3ltYm9sRGF0YSB7CisgIGNvbnN0IFN0bXQgKlM7CisgIFF1YWxUeXBlIFQ7CisgIHVuc2lnbmVkIENvdW50OworICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHg7CisgIGNvbnN0IHZvaWQgKlN5bWJvbFRhZzsKKworcHVibGljOgorICBTeW1ib2xDb25qdXJlZChTeW1ib2xJRCBzeW0sIGNvbnN0IFN0bXQgKnMsIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqbGN0eCwKKyAgICAgICAgICAgICAgICAgUXVhbFR5cGUgdCwgdW5zaWduZWQgY291bnQsIGNvbnN0IHZvaWQgKnN5bWJvbFRhZykKKyAgICAgIDogU3ltYm9sRGF0YShTeW1ib2xDb25qdXJlZEtpbmQsIHN5bSksIFMocyksIFQodCksIENvdW50KGNvdW50KSwKKyAgICAgICAgTEN0eChsY3R4KSwgU3ltYm9sVGFnKHN5bWJvbFRhZykgeworICAgIC8vIEZJWE1FOiAncycgbWlnaHQgYmUgYSBudWxscHRyIGlmIHdlJ3JlIGNvbmR1Y3RpbmcgaW52YWxpZGF0aW9uCisgICAgLy8gdGhhdCB3YXMgY2F1c2VkIGJ5IGEgZGVzdHJ1Y3RvciBjYWxsIG9uIGEgdGVtcG9yYXJ5IG9iamVjdCwKKyAgICAvLyB3aGljaCBoYXMgbm8gc3RhdGVtZW50IGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICAvLyBEdWUgdG8gdGhpcywgd2UgbWlnaHQgYmUgY3JlYXRpbmcgdGhlIHNhbWUgaW52YWxpZGF0aW9uIHN5bWJvbCBmb3IKKyAgICAvLyB0d28gZGlmZmVyZW50IGludmFsaWRhdGlvbiBwYXNzZXMgKGZvciB0d28gZGlmZmVyZW50IHRlbXBvcmFyaWVzKS4KKyAgICBhc3NlcnQobGN0eCk7CisgICAgYXNzZXJ0KGlzVmFsaWRUeXBlRm9yU3ltYm9sKHQpKTsKKyAgfQorCisgIGNvbnN0IFN0bXQgKmdldFN0bXQoKSBjb25zdCB7IHJldHVybiBTOyB9CisgIHVuc2lnbmVkIGdldENvdW50KCkgY29uc3QgeyByZXR1cm4gQ291bnQ7IH0KKyAgY29uc3Qgdm9pZCAqZ2V0VGFnKCkgY29uc3QgeyByZXR1cm4gU3ltYm9sVGFnOyB9CisKKyAgUXVhbFR5cGUgZ2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBwcm9maWxlLCBjb25zdCBTdG10ICpTLAorICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIHVuc2lnbmVkIENvdW50LCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqU3ltYm9sVGFnKSB7CisgICAgcHJvZmlsZS5BZGRJbnRlZ2VyKCh1bnNpZ25lZCkgU3ltYm9sQ29uanVyZWRLaW5kKTsKKyAgICBwcm9maWxlLkFkZFBvaW50ZXIoUyk7CisgICAgcHJvZmlsZS5BZGRQb2ludGVyKExDdHgpOworICAgIHByb2ZpbGUuQWRkKFQpOworICAgIHByb2ZpbGUuQWRkSW50ZWdlcihDb3VudCk7CisgICAgcHJvZmlsZS5BZGRQb2ludGVyKFN5bWJvbFRhZyk7CisgIH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgcHJvZmlsZSkgb3ZlcnJpZGUgeworICAgIFByb2ZpbGUocHJvZmlsZSwgUywgVCwgQ291bnQsIExDdHgsIFN5bWJvbFRhZyk7CisgIH0KKworICAvLyBJbXBsZW1lbnQgaXNhPFQ+IHN1cHBvcnQuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3ltRXhwciAqU0UpIHsKKyAgICByZXR1cm4gU0UtPmdldEtpbmQoKSA9PSBTeW1ib2xDb25qdXJlZEtpbmQ7CisgIH0KK307CisKKy8vLyBBIHN5bWJvbCByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIGEgTWVtUmVnaW9uIHdob3NlIHBhcmVudCByZWdpb24gaGFzCisvLy8gc3ltYm9saWMgdmFsdWUuCitjbGFzcyBTeW1ib2xEZXJpdmVkIDogcHVibGljIFN5bWJvbERhdGEgeworICBTeW1ib2xSZWYgcGFyZW50U3ltYm9sOworICBjb25zdCBUeXBlZFZhbHVlUmVnaW9uICpSOworCitwdWJsaWM6CisgIFN5bWJvbERlcml2ZWQoU3ltYm9sSUQgc3ltLCBTeW1ib2xSZWYgcGFyZW50LCBjb25zdCBUeXBlZFZhbHVlUmVnaW9uICpyKQorICAgICAgOiBTeW1ib2xEYXRhKFN5bWJvbERlcml2ZWRLaW5kLCBzeW0pLCBwYXJlbnRTeW1ib2wocGFyZW50KSwgUihyKSB7CisgICAgYXNzZXJ0KHBhcmVudCk7CisgICAgYXNzZXJ0KHIpOworICAgIGFzc2VydChpc1ZhbGlkVHlwZUZvclN5bWJvbChyLT5nZXRWYWx1ZVR5cGUoKSkpOworICB9CisKKyAgU3ltYm9sUmVmIGdldFBhcmVudFN5bWJvbCgpIGNvbnN0IHsgcmV0dXJuIHBhcmVudFN5bWJvbDsgfQorICBjb25zdCBUeXBlZFZhbHVlUmVnaW9uICpnZXRSZWdpb24oKSBjb25zdCB7IHJldHVybiBSOyB9CisKKyAgUXVhbFR5cGUgZ2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CisgIGNvbnN0IE1lbVJlZ2lvbiAqZ2V0T3JpZ2luUmVnaW9uKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZ2V0UmVnaW9uKCk7IH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIHByb2ZpbGUsIFN5bWJvbFJlZiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZWRWYWx1ZVJlZ2lvbiAqcikgeworICAgIHByb2ZpbGUuQWRkSW50ZWdlcigodW5zaWduZWQpIFN5bWJvbERlcml2ZWRLaW5kKTsKKyAgICBwcm9maWxlLkFkZFBvaW50ZXIocik7CisgICAgcHJvZmlsZS5BZGRQb2ludGVyKHBhcmVudCk7CisgIH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgcHJvZmlsZSkgb3ZlcnJpZGUgeworICAgIFByb2ZpbGUocHJvZmlsZSwgcGFyZW50U3ltYm9sLCBSKTsKKyAgfQorCisgIC8vIEltcGxlbWVudCBpc2E8VD4gc3VwcG9ydC4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTeW1FeHByICpTRSkgeworICAgIHJldHVybiBTRS0+Z2V0S2luZCgpID09IFN5bWJvbERlcml2ZWRLaW5kOworICB9Cit9OworCisvLy8gU3ltYm9sRXh0ZW50IC0gUmVwcmVzZW50cyB0aGUgZXh0ZW50IChzaXplIGluIGJ5dGVzKSBvZiBhIGJvdW5kZWQgcmVnaW9uLgorLy8vICBDbGllbnRzIHNob3VsZCBub3QgYXNrIHRoZSBTeW1ib2xNYW5hZ2VyIGZvciBhIHJlZ2lvbidzIGV4dGVudC4gQWx3YXlzIHVzZQorLy8vICBTdWJSZWdpb246OmdldEV4dGVudCBpbnN0ZWFkIC0tIHRoZSB2YWx1ZSByZXR1cm5lZCBtYXkgbm90IGJlIGEgc3ltYm9sLgorY2xhc3MgU3ltYm9sRXh0ZW50IDogcHVibGljIFN5bWJvbERhdGEgeworICBjb25zdCBTdWJSZWdpb24gKlI7CisgIAorcHVibGljOgorICBTeW1ib2xFeHRlbnQoU3ltYm9sSUQgc3ltLCBjb25zdCBTdWJSZWdpb24gKnIpCisgICAgICA6IFN5bWJvbERhdGEoU3ltYm9sRXh0ZW50S2luZCwgc3ltKSwgUihyKSB7CisgICAgYXNzZXJ0KHIpOworICB9CisKKyAgY29uc3QgU3ViUmVnaW9uICpnZXRSZWdpb24oKSBjb25zdCB7IHJldHVybiBSOyB9CisKKyAgUXVhbFR5cGUgZ2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBwcm9maWxlLCBjb25zdCBTdWJSZWdpb24gKlIpIHsKKyAgICBwcm9maWxlLkFkZEludGVnZXIoKHVuc2lnbmVkKSBTeW1ib2xFeHRlbnRLaW5kKTsKKyAgICBwcm9maWxlLkFkZFBvaW50ZXIoUik7CisgIH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgcHJvZmlsZSkgb3ZlcnJpZGUgeworICAgIFByb2ZpbGUocHJvZmlsZSwgUik7CisgIH0KKworICAvLyBJbXBsZW1lbnQgaXNhPFQ+IHN1cHBvcnQuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3ltRXhwciAqU0UpIHsKKyAgICByZXR1cm4gU0UtPmdldEtpbmQoKSA9PSBTeW1ib2xFeHRlbnRLaW5kOworICB9Cit9OworCisvLy8gU3ltYm9sTWV0YWRhdGEgLSBSZXByZXNlbnRzIHBhdGgtZGVwZW5kZW50IG1ldGFkYXRhIGFib3V0IGEgc3BlY2lmaWMgcmVnaW9uLgorLy8vICBNZXRhZGF0YSBzeW1ib2xzIHJlbWFpbiBsaXZlIGFzIGxvbmcgYXMgdGhleSBhcmUgbWFya2VkIGFzIGluIHVzZSBiZWZvcmUKKy8vLyAgZGVhZC1zeW1ib2wgc3dlZXBpbmcgQU5EIHRoZWlyIGFzc29jaWF0ZWQgcmVnaW9ucyBhcmUgc3RpbGwgYWxpdmUuCisvLy8gIEludGVuZGVkIGZvciB1c2UgYnkgY2hlY2tlcnMuCitjbGFzcyBTeW1ib2xNZXRhZGF0YSA6IHB1YmxpYyBTeW1ib2xEYXRhIHsKKyAgY29uc3QgTWVtUmVnaW9uKiBSOworICBjb25zdCBTdG10ICpTOworICBRdWFsVHlwZSBUOworICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHg7CisgIHVuc2lnbmVkIENvdW50OworICBjb25zdCB2b2lkICpUYWc7CisKK3B1YmxpYzoKKyAgU3ltYm9sTWV0YWRhdGEoU3ltYm9sSUQgc3ltLCBjb25zdCBNZW1SZWdpb24qIHIsIGNvbnN0IFN0bXQgKnMsIFF1YWxUeXBlIHQsCisgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCwgdW5zaWduZWQgY291bnQsIGNvbnN0IHZvaWQgKnRhZykKKyAgICAgIDogU3ltYm9sRGF0YShTeW1ib2xNZXRhZGF0YUtpbmQsIHN5bSksIFIociksIFMocyksIFQodCksIExDdHgoTEN0eCksCisgICAgICAgIENvdW50KGNvdW50KSwgVGFnKHRhZykgeworICAgICAgYXNzZXJ0KHIpOworICAgICAgYXNzZXJ0KHMpOworICAgICAgYXNzZXJ0KGlzVmFsaWRUeXBlRm9yU3ltYm9sKHQpKTsKKyAgICAgIGFzc2VydChMQ3R4KTsKKyAgICAgIGFzc2VydCh0YWcpOworICAgIH0KKworICBjb25zdCBNZW1SZWdpb24gKmdldFJlZ2lvbigpIGNvbnN0IHsgcmV0dXJuIFI7IH0KKyAgY29uc3QgU3RtdCAqZ2V0U3RtdCgpIGNvbnN0IHsgcmV0dXJuIFM7IH0KKyAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpnZXRMb2NhdGlvbkNvbnRleHQoKSBjb25zdCB7IHJldHVybiBMQ3R4OyB9CisgIHVuc2lnbmVkIGdldENvdW50KCkgY29uc3QgeyByZXR1cm4gQ291bnQ7IH0KKyAgY29uc3Qgdm9pZCAqZ2V0VGFnKCkgY29uc3QgeyByZXR1cm4gVGFnOyB9CisKKyAgUXVhbFR5cGUgZ2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBwcm9maWxlLCBjb25zdCBNZW1SZWdpb24gKlIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RtdCAqUywgUXVhbFR5cGUgVCwgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4LAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvdW50LCBjb25zdCB2b2lkICpUYWcpIHsKKyAgICBwcm9maWxlLkFkZEludGVnZXIoKHVuc2lnbmVkKSBTeW1ib2xNZXRhZGF0YUtpbmQpOworICAgIHByb2ZpbGUuQWRkUG9pbnRlcihSKTsKKyAgICBwcm9maWxlLkFkZFBvaW50ZXIoUyk7CisgICAgcHJvZmlsZS5BZGQoVCk7CisgICAgcHJvZmlsZS5BZGRQb2ludGVyKExDdHgpOworICAgIHByb2ZpbGUuQWRkSW50ZWdlcihDb3VudCk7CisgICAgcHJvZmlsZS5BZGRQb2ludGVyKFRhZyk7CisgIH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgcHJvZmlsZSkgb3ZlcnJpZGUgeworICAgIFByb2ZpbGUocHJvZmlsZSwgUiwgUywgVCwgTEN0eCwgQ291bnQsIFRhZyk7CisgIH0KKworICAvLyBJbXBsZW1lbnQgaXNhPFQ+IHN1cHBvcnQuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3ltRXhwciAqU0UpIHsKKyAgICByZXR1cm4gU0UtPmdldEtpbmQoKSA9PSBTeW1ib2xNZXRhZGF0YUtpbmQ7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIGNhc3QgZXhwcmVzc2lvbi4KK2NsYXNzIFN5bWJvbENhc3QgOiBwdWJsaWMgU3ltRXhwciB7CisgIGNvbnN0IFN5bUV4cHIgKk9wZXJhbmQ7CisKKyAgLy8vIFR5cGUgb2YgdGhlIG9wZXJhbmQuCisgIFF1YWxUeXBlIEZyb21UeTsKKworICAvLy8gVGhlIHR5cGUgb2YgdGhlIHJlc3VsdC4KKyAgUXVhbFR5cGUgVG9UeTsKKworcHVibGljOgorICBTeW1ib2xDYXN0KGNvbnN0IFN5bUV4cHIgKkluLCBRdWFsVHlwZSBGcm9tLCBRdWFsVHlwZSBUbykKKyAgICAgIDogU3ltRXhwcihTeW1ib2xDYXN0S2luZCksIE9wZXJhbmQoSW4pLCBGcm9tVHkoRnJvbSksIFRvVHkoVG8pIHsKKyAgICBhc3NlcnQoSW4pOworICAgIGFzc2VydChpc1ZhbGlkVHlwZUZvclN5bWJvbChGcm9tKSk7CisgICAgLy8gRklYTUU6IEdlbmVyaWNUYWludENoZWNrZXIgY3JlYXRlcyBzeW1ib2xzIG9mIHZvaWQgdHlwZS4KKyAgICAvLyBPdGhlcndpc2UsICdUbycgc2hvdWxkIGFsc28gYmUgYSB2YWxpZCB0eXBlLgorICB9CisKKyAgUXVhbFR5cGUgZ2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIFRvVHk7IH0KKworICBjb25zdCBTeW1FeHByICpnZXRPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gT3BlcmFuZDsgfQorCisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTeW1FeHByICpJbiwgUXVhbFR5cGUgRnJvbSwgUXVhbFR5cGUgVG8pIHsKKyAgICBJRC5BZGRJbnRlZ2VyKCh1bnNpZ25lZCkgU3ltYm9sQ2FzdEtpbmQpOworICAgIElELkFkZFBvaW50ZXIoSW4pOworICAgIElELkFkZChGcm9tKTsKKyAgICBJRC5BZGQoVG8pOworICB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBvdmVycmlkZSB7CisgICAgUHJvZmlsZShJRCwgT3BlcmFuZCwgRnJvbVR5LCBUb1R5KTsKKyAgfQorCisgIC8vIEltcGxlbWVudCBpc2E8VD4gc3VwcG9ydC4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTeW1FeHByICpTRSkgeworICAgIHJldHVybiBTRS0+Z2V0S2luZCgpID09IFN5bWJvbENhc3RLaW5kOworICB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBzeW1ib2xpYyBleHByZXNzaW9uIGludm9sdmluZyBhIGJpbmFyeSBvcGVyYXRvciAKK2NsYXNzIEJpbmFyeVN5bUV4cHIgOiBwdWJsaWMgU3ltRXhwciB7CisgIEJpbmFyeU9wZXJhdG9yOjpPcGNvZGUgT3A7CisgIFF1YWxUeXBlIFQ7CisKK3Byb3RlY3RlZDoKKyAgQmluYXJ5U3ltRXhwcihLaW5kIGssIEJpbmFyeU9wZXJhdG9yOjpPcGNvZGUgb3AsIFF1YWxUeXBlIHQpCisgICAgICA6IFN5bUV4cHIoayksIE9wKG9wKSwgVCh0KSB7CisgICAgYXNzZXJ0KGNsYXNzb2YodGhpcykpOworICAgIGFzc2VydChpc1ZhbGlkVHlwZUZvclN5bWJvbCh0KSk7CisgIH0KKworcHVibGljOgorICAvLyBGSVhNRTogV2UgcHJvYmFibHkgbmVlZCB0byBtYWtlIHRoaXMgb3V0LW9mLWxpbmUgdG8gYXZvaWQgcmVkdW5kYW50CisgIC8vIGdlbmVyYXRpb24gb2YgdmlydHVhbCBmdW5jdGlvbnMuCisgIFF1YWxUeXBlIGdldFR5cGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBUOyB9CisKKyAgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBnZXRPcGNvZGUoKSBjb25zdCB7IHJldHVybiBPcDsgfQorCisgIC8vIEltcGxlbWVudCBpc2E8VD4gc3VwcG9ydC4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTeW1FeHByICpTRSkgeworICAgIEtpbmQgayA9IFNFLT5nZXRLaW5kKCk7CisgICAgcmV0dXJuIGsgPj0gQkVHSU5fQklOQVJZU1lNRVhQUlMgJiYgayA8PSBFTkRfQklOQVJZU1lNRVhQUlM7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIHN5bWJvbGljIGV4cHJlc3Npb24gbGlrZSAneCcgKyAzLgorY2xhc3MgU3ltSW50RXhwciA6IHB1YmxpYyBCaW5hcnlTeW1FeHByIHsKKyAgY29uc3QgU3ltRXhwciAqTEhTOworICBjb25zdCBsbHZtOjpBUFNJbnQmIFJIUzsKKworcHVibGljOgorICBTeW1JbnRFeHByKGNvbnN0IFN5bUV4cHIgKmxocywgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBvcCwKKyAgICAgICAgICAgICBjb25zdCBsbHZtOjpBUFNJbnQgJnJocywgUXVhbFR5cGUgdCkKKyAgICAgIDogQmluYXJ5U3ltRXhwcihTeW1JbnRFeHByS2luZCwgb3AsIHQpLCBMSFMobGhzKSwgUkhTKHJocykgeworICAgIGFzc2VydChsaHMpOworICB9CisKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKKworICBjb25zdCBTeW1FeHByICpnZXRMSFMoKSBjb25zdCB7IHJldHVybiBMSFM7IH0KKyAgY29uc3QgbGx2bTo6QVBTSW50ICZnZXRSSFMoKSBjb25zdCB7IHJldHVybiBSSFM7IH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElELCBjb25zdCBTeW1FeHByICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBvcCwgY29uc3QgbGx2bTo6QVBTSW50JiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgdCkgeworICAgIElELkFkZEludGVnZXIoKHVuc2lnbmVkKSBTeW1JbnRFeHByS2luZCk7CisgICAgSUQuQWRkUG9pbnRlcihsaHMpOworICAgIElELkFkZEludGVnZXIob3ApOworICAgIElELkFkZFBvaW50ZXIoJnJocyk7CisgICAgSUQuQWRkKHQpOworICB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBvdmVycmlkZSB7CisgICAgUHJvZmlsZShJRCwgTEhTLCBnZXRPcGNvZGUoKSwgUkhTLCBnZXRUeXBlKCkpOworICB9CisKKyAgLy8gSW1wbGVtZW50IGlzYTxUPiBzdXBwb3J0LgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN5bUV4cHIgKlNFKSB7CisgICAgcmV0dXJuIFNFLT5nZXRLaW5kKCkgPT0gU3ltSW50RXhwcktpbmQ7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIHN5bWJvbGljIGV4cHJlc3Npb24gbGlrZSAzIC0gJ3gnLgorY2xhc3MgSW50U3ltRXhwciA6IHB1YmxpYyBCaW5hcnlTeW1FeHByIHsKKyAgY29uc3QgbGx2bTo6QVBTSW50JiBMSFM7CisgIGNvbnN0IFN5bUV4cHIgKlJIUzsKKworcHVibGljOgorICBJbnRTeW1FeHByKGNvbnN0IGxsdm06OkFQU0ludCAmbGhzLCBCaW5hcnlPcGVyYXRvcjo6T3Bjb2RlIG9wLAorICAgICAgICAgICAgIGNvbnN0IFN5bUV4cHIgKnJocywgUXVhbFR5cGUgdCkKKyAgICAgIDogQmluYXJ5U3ltRXhwcihJbnRTeW1FeHByS2luZCwgb3AsIHQpLCBMSFMobGhzKSwgUkhTKHJocykgeworICAgIGFzc2VydChyaHMpOworICB9CisKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKKworICBjb25zdCBTeW1FeHByICpnZXRSSFMoKSBjb25zdCB7IHJldHVybiBSSFM7IH0KKyAgY29uc3QgbGx2bTo6QVBTSW50ICZnZXRMSFMoKSBjb25zdCB7IHJldHVybiBMSFM7IH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElELCBjb25zdCBsbHZtOjpBUFNJbnQmIGxocywKKyAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvcjo6T3Bjb2RlIG9wLCBjb25zdCBTeW1FeHByICpyaHMsCisgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgdCkgeworICAgIElELkFkZEludGVnZXIoKHVuc2lnbmVkKSBJbnRTeW1FeHByS2luZCk7CisgICAgSUQuQWRkUG9pbnRlcigmbGhzKTsKKyAgICBJRC5BZGRJbnRlZ2VyKG9wKTsKKyAgICBJRC5BZGRQb2ludGVyKHJocyk7CisgICAgSUQuQWRkKHQpOworICB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBvdmVycmlkZSB7CisgICAgUHJvZmlsZShJRCwgTEhTLCBnZXRPcGNvZGUoKSwgUkhTLCBnZXRUeXBlKCkpOworICB9CisKKyAgLy8gSW1wbGVtZW50IGlzYTxUPiBzdXBwb3J0LgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN5bUV4cHIgKlNFKSB7CisgICAgcmV0dXJuIFNFLT5nZXRLaW5kKCkgPT0gSW50U3ltRXhwcktpbmQ7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIHN5bWJvbGljIGV4cHJlc3Npb24gbGlrZSAneCcgKyAneScuCitjbGFzcyBTeW1TeW1FeHByIDogcHVibGljIEJpbmFyeVN5bUV4cHIgeworICBjb25zdCBTeW1FeHByICpMSFM7CisgIGNvbnN0IFN5bUV4cHIgKlJIUzsKKworcHVibGljOgorICBTeW1TeW1FeHByKGNvbnN0IFN5bUV4cHIgKmxocywgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBvcCwgY29uc3QgU3ltRXhwciAqcmhzLAorICAgICAgICAgICAgIFF1YWxUeXBlIHQpCisgICAgICA6IEJpbmFyeVN5bUV4cHIoU3ltU3ltRXhwcktpbmQsIG9wLCB0KSwgTEhTKGxocyksIFJIUyhyaHMpIHsKKyAgICBhc3NlcnQobGhzKTsKKyAgICBhc3NlcnQocmhzKTsKKyAgfQorCisgIGNvbnN0IFN5bUV4cHIgKmdldExIUygpIGNvbnN0IHsgcmV0dXJuIExIUzsgfQorICBjb25zdCBTeW1FeHByICpnZXRSSFMoKSBjb25zdCB7IHJldHVybiBSSFM7IH0KKworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQsIGNvbnN0IFN5bUV4cHIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBvcCwgY29uc3QgU3ltRXhwciAqcmhzLCBRdWFsVHlwZSB0KSB7CisgICAgSUQuQWRkSW50ZWdlcigodW5zaWduZWQpIFN5bVN5bUV4cHJLaW5kKTsKKyAgICBJRC5BZGRQb2ludGVyKGxocyk7CisgICAgSUQuQWRkSW50ZWdlcihvcCk7CisgICAgSUQuQWRkUG9pbnRlcihyaHMpOworICAgIElELkFkZCh0KTsKKyAgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgb3ZlcnJpZGUgeworICAgIFByb2ZpbGUoSUQsIExIUywgZ2V0T3Bjb2RlKCksIFJIUywgZ2V0VHlwZSgpKTsKKyAgfQorCisgIC8vIEltcGxlbWVudCBpc2E8VD4gc3VwcG9ydC4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTeW1FeHByICpTRSkgeworICAgIHJldHVybiBTRS0+Z2V0S2luZCgpID09IFN5bVN5bUV4cHJLaW5kOworICB9Cit9OworCitjbGFzcyBTeW1ib2xNYW5hZ2VyIHsKKyAgdXNpbmcgRGF0YVNldFR5ID0gbGx2bTo6Rm9sZGluZ1NldDxTeW1FeHByPjsKKyAgdXNpbmcgU3ltYm9sRGVwZW5kVHkgPSBsbHZtOjpEZW5zZU1hcDxTeW1ib2xSZWYsIFN5bWJvbFJlZlNtYWxsVmVjdG9yVHkgKj47CisKKyAgRGF0YVNldFR5IERhdGFTZXQ7CisKKyAgLy8vIFN0b3JlcyB0aGUgZXh0cmEgZGVwZW5kZW5jaWVzIGJldHdlZW4gc3ltYm9sczogdGhlIGRhdGEgc2hvdWxkIGJlIGtlcHQKKyAgLy8vIGFsaXZlIGFzIGxvbmcgYXMgdGhlIGtleSBpcyBsaXZlLgorICBTeW1ib2xEZXBlbmRUeSBTeW1ib2xEZXBlbmRlbmNpZXM7CisKKyAgdW5zaWduZWQgU3ltYm9sQ291bnRlciA9IDA7CisgIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3ImIEJQQWxsb2M7CisgIEJhc2ljVmFsdWVGYWN0b3J5ICZCVjsKKyAgQVNUQ29udGV4dCAmQ3R4OworCitwdWJsaWM6CisgIFN5bWJvbE1hbmFnZXIoQVNUQ29udGV4dCAmY3R4LCBCYXNpY1ZhbHVlRmFjdG9yeSAmYnYsCisgICAgICAgICAgICAgICAgbGx2bTo6QnVtcFB0ckFsbG9jYXRvciYgYnBhbGxvYykKKyAgICAgIDogU3ltYm9sRGVwZW5kZW5jaWVzKDE2KSwgQlBBbGxvYyhicGFsbG9jKSwgQlYoYnYpLCBDdHgoY3R4KSB7fQorICB+U3ltYm9sTWFuYWdlcigpOworCisgIHN0YXRpYyBib29sIGNhblN5bWJvbGljYXRlKFF1YWxUeXBlIFQpOworCisgIC8vLyBcYnJpZWYgTWFrZSBhIHVuaXF1ZSBzeW1ib2wgZm9yIE1lbVJlZ2lvbiBSIGFjY29yZGluZyB0byBpdHMga2luZC4KKyAgY29uc3QgU3ltYm9sUmVnaW9uVmFsdWUqIGdldFJlZ2lvblZhbHVlU3ltYm9sKGNvbnN0IFR5cGVkVmFsdWVSZWdpb24qIFIpOworCisgIGNvbnN0IFN5bWJvbENvbmp1cmVkKiBjb25qdXJlU3ltYm9sKGNvbnN0IFN0bXQgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmlzaXRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqU3ltYm9sVGFnID0gbnVsbHB0cik7CisKKyAgY29uc3QgU3ltYm9sQ29uanVyZWQqIGNvbmp1cmVTeW1ib2woY29uc3QgRXhwciAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWaXNpdENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpTeW1ib2xUYWcgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIGNvbmp1cmVTeW1ib2woRSwgTEN0eCwgRS0+Z2V0VHlwZSgpLCBWaXNpdENvdW50LCBTeW1ib2xUYWcpOworICB9CisKKyAgY29uc3QgU3ltYm9sRGVyaXZlZCAqZ2V0RGVyaXZlZFN5bWJvbChTeW1ib2xSZWYgcGFyZW50U3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGVkVmFsdWVSZWdpb24gKlIpOworCisgIGNvbnN0IFN5bWJvbEV4dGVudCAqZ2V0RXh0ZW50U3ltYm9sKGNvbnN0IFN1YlJlZ2lvbiAqUik7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGEgbWV0YWRhdGEgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIHJlZ2lvbi4KKyAgLy8vCisgIC8vLyBWaXNpdENvdW50IGNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgcmVnaW9ucyBjb3JyZXNwb25kaW5nIHRvCisgIC8vLyBkaWZmZXJlbnQgbG9vcCBpdGVyYXRpb25zLCB0aHVzLCBtYWtpbmcgdGhlIHN5bWJvbCBwYXRoLWRlcGVuZGVudC4KKyAgY29uc3QgU3ltYm9sTWV0YWRhdGEgKmdldE1ldGFkYXRhU3ltYm9sKGNvbnN0IE1lbVJlZ2lvbiAqUiwgY29uc3QgU3RtdCAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWaXNpdENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqU3ltYm9sVGFnID0gbnVsbHB0cik7CisKKyAgY29uc3QgU3ltYm9sQ2FzdCogZ2V0Q2FzdFN5bWJvbChjb25zdCBTeW1FeHByICpPcGVyYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIEZyb20sIFF1YWxUeXBlIFRvKTsKKworICBjb25zdCBTeW1JbnRFeHByICpnZXRTeW1JbnRFeHByKGNvbnN0IFN5bUV4cHIgKmxocywgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpBUFNJbnQmIHJocywgUXVhbFR5cGUgdCk7CisKKyAgY29uc3QgU3ltSW50RXhwciAqZ2V0U3ltSW50RXhwcihjb25zdCBTeW1FeHByICZsaHMsIEJpbmFyeU9wZXJhdG9yOjpPcGNvZGUgb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBTSW50JiByaHMsIFF1YWxUeXBlIHQpIHsKKyAgICByZXR1cm4gZ2V0U3ltSW50RXhwcigmbGhzLCBvcCwgcmhzLCB0KTsKKyAgfQorCisgIGNvbnN0IEludFN5bUV4cHIgKmdldEludFN5bUV4cHIoY29uc3QgbGx2bTo6QVBTSW50JiBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTeW1FeHByICpyaHMsIFF1YWxUeXBlIHQpOworCisgIGNvbnN0IFN5bVN5bUV4cHIgKmdldFN5bVN5bUV4cHIoY29uc3QgU3ltRXhwciAqbGhzLCBCaW5hcnlPcGVyYXRvcjo6T3Bjb2RlIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN5bUV4cHIgKnJocywgUXVhbFR5cGUgdCk7CisKKyAgUXVhbFR5cGUgZ2V0VHlwZShjb25zdCBTeW1FeHByICpTRSkgY29uc3QgeworICAgIHJldHVybiBTRS0+Z2V0VHlwZSgpOworICB9CisKKyAgLy8vIFxicmllZiBBZGQgYXJ0aWZpY2lhbCBzeW1ib2wgZGVwZW5kZW5jeS4KKyAgLy8vCisgIC8vLyBUaGUgZGVwZW5kZW50IHN5bWJvbCBzaG91bGQgc3RheSBhbGl2ZSBhcyBsb25nIGFzIHRoZSBwcmltYXJ5IGlzIGFsaXZlLgorICB2b2lkIGFkZFN5bWJvbERlcGVuZGVuY3koY29uc3QgU3ltYm9sUmVmIFByaW1hcnksIGNvbnN0IFN5bWJvbFJlZiBEZXBlbmRlbnQpOworCisgIGNvbnN0IFN5bWJvbFJlZlNtYWxsVmVjdG9yVHkgKmdldERlcGVuZGVudFN5bWJvbHMoY29uc3QgU3ltYm9sUmVmIFByaW1hcnkpOworCisgIEFTVENvbnRleHQgJmdldENvbnRleHQoKSB7IHJldHVybiBDdHg7IH0KKyAgQmFzaWNWYWx1ZUZhY3RvcnkgJmdldEJhc2ljVmFscygpIHsgcmV0dXJuIEJWOyB9Cit9OworCisvLy8gXGJyaWVmIEEgY2xhc3MgcmVzcG9uc2libGUgZm9yIGNsZWFuaW5nIHVwIHVudXNlZCBzeW1ib2xzLgorY2xhc3MgU3ltYm9sUmVhcGVyIHsKKyAgZW51bSBTeW1ib2xTdGF0dXMgeworICAgIE5vdFByb2Nlc3NlZCwKKyAgICBIYXZlTWFya2VkRGVwZW5kZW50cworICB9OworCisgIHVzaW5nIFN5bWJvbFNldFR5ID0gbGx2bTo6RGVuc2VTZXQ8U3ltYm9sUmVmPjsKKyAgdXNpbmcgU3ltYm9sTWFwVHkgPSBsbHZtOjpEZW5zZU1hcDxTeW1ib2xSZWYsIFN5bWJvbFN0YXR1cz47CisgIHVzaW5nIFJlZ2lvblNldFR5ID0gbGx2bTo6RGVuc2VTZXQ8Y29uc3QgTWVtUmVnaW9uICo+OworCisgIFN5bWJvbE1hcFR5IFRoZUxpdmluZzsKKyAgU3ltYm9sU2V0VHkgTWV0YWRhdGFJblVzZTsKKyAgU3ltYm9sU2V0VHkgVGhlRGVhZDsKKworICBSZWdpb25TZXRUeSBSZWdpb25Sb290czsKKyAgCisgIGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpMQ3R4OworICBjb25zdCBTdG10ICpMb2M7CisgIFN5bWJvbE1hbmFnZXImIFN5bU1ncjsKKyAgU3RvcmVSZWYgcmVhcGVkU3RvcmU7CisgIGxsdm06OkRlbnNlTWFwPGNvbnN0IE1lbVJlZ2lvbiAqLCB1bnNpZ25lZD4gaW5jbHVkZWRSZWdpb25DYWNoZTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIHJlYXBlciBvYmplY3QsIHdoaWNoIHJlbW92ZXMgZXZlcnl0aGluZyB3aGljaCBpcyBub3QKKyAgLy8vIGxpdmUgYmVmb3JlIHdlIGV4ZWN1dGUgc3RhdGVtZW50IHMgaW4gdGhlIGdpdmVuIGxvY2F0aW9uIGNvbnRleHQuCisgIC8vLworICAvLy8gSWYgdGhlIHN0YXRlbWVudCBpcyBOVUxMLCBldmVyeXRoaW5nIGlzIHRoaXMgYW5kIHBhcmVudCBjb250ZXh0cyBpcworICAvLy8gY29uc2lkZXJlZCBsaXZlLgorICAvLy8gSWYgdGhlIHN0YWNrIGZyYW1lIGNvbnRleHQgaXMgTlVMTCwgZXZlcnl0aGluZyBvbiBzdGFjayBpcyBjb25zaWRlcmVkCisgIC8vLyBkZWFkLgorICBTeW1ib2xSZWFwZXIoY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKkN0eCwgY29uc3QgU3RtdCAqcywKKyAgICAgICAgICAgICAgIFN5bWJvbE1hbmFnZXIgJnN5bW1nciwgU3RvcmVNYW5hZ2VyICZzdG9yZU1ncikKKyAgICAgIDogTEN0eChDdHgpLCBMb2MocyksIFN5bU1ncihzeW1tZ3IpLCByZWFwZWRTdG9yZShudWxscHRyLCBzdG9yZU1ncikge30KKworICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKmdldExvY2F0aW9uQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIExDdHg7IH0KKworICBib29sIGlzTGl2ZShTeW1ib2xSZWYgc3ltKTsKKyAgYm9vbCBpc0xpdmVSZWdpb24oY29uc3QgTWVtUmVnaW9uICpyZWdpb24pOworICBib29sIGlzTGl2ZShjb25zdCBTdG10ICpFeHByVmFsLCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgpIGNvbnN0OworICBib29sIGlzTGl2ZShjb25zdCBWYXJSZWdpb24gKlZSLCBib29sIGluY2x1ZGVTdG9yZUJpbmRpbmdzID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVW5jb25kaXRpb25hbGx5IG1hcmtzIGEgc3ltYm9sIGFzIGxpdmUuCisgIC8vLworICAvLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUKKyAgLy8vIHVzZWQgYnkgY2hlY2tlcnMsIG9ubHkgYnkgdGhlIHN0YXRlIGluZnJhc3RydWN0dXJlIHN1Y2ggYXMgdGhlIHN0b3JlIGFuZAorICAvLy8gZW52aXJvbm1lbnQuIENoZWNrZXJzIHNob3VsZCBpbnN0ZWFkIHVzZSBtZXRhZGF0YSBzeW1ib2xzIGFuZCBtYXJrSW5Vc2UuCisgIHZvaWQgbWFya0xpdmUoU3ltYm9sUmVmIHN5bSk7CisKKyAgLy8vIFxicmllZiBNYXJrcyBhIHN5bWJvbCBhcyBpbXBvcnRhbnQgdG8gYSBjaGVja2VyLgorICAvLy8KKyAgLy8vIEZvciBtZXRhZGF0YSBzeW1ib2xzLAorICAvLy8gdGhpcyB3aWxsIGtlZXAgdGhlIHN5bWJvbCBhbGl2ZSBhcyBsb25nIGFzIGl0cyBhc3NvY2lhdGVkIHJlZ2lvbiBpcyBhbHNvCisgIC8vLyBsaXZlLiBGb3Igb3RoZXIgc3ltYm9scywgdGhpcyBoYXMgbm8gZWZmZWN0OyBjaGVja2VycyBhcmUgbm90IHBlcm1pdHRlZAorICAvLy8gdG8gaW5mbHVlbmNlIHRoZSBsaWZlIG9mIG90aGVyIHN5bWJvbHMuIFRoaXMgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIGFueQorICAvLy8gc3ltYm9sIG1hcmtpbmcgaGFzIG9jY3VycmVkLCBpLmUuIGluIHRoZSBNYXJrTGl2ZVN5bWJvbHMgY2FsbGJhY2suCisgIHZvaWQgbWFya0luVXNlKFN5bWJvbFJlZiBzeW0pOworCisgIC8vLyBcYnJpZWYgSWYgYSBzeW1ib2wgaXMga25vd24gdG8gYmUgbGl2ZSwgbWFya3MgdGhlIHN5bWJvbCBhcyBsaXZlLgorICAvLy8KKyAgLy8vICBPdGhlcndpc2UsIGlmIHRoZSBzeW1ib2wgY2Fubm90IGJlIHByb3ZlbiBsaXZlLCBpdCBpcyBtYXJrZWQgYXMgZGVhZC4KKyAgLy8vICBSZXR1cm5zIHRydWUgaWYgdGhlIHN5bWJvbCBpcyBkZWFkLCBmYWxzZSBpZiBsaXZlLgorICBib29sIG1heWJlRGVhZChTeW1ib2xSZWYgc3ltKTsKKworICB1c2luZyBkZWFkX2l0ZXJhdG9yID0gU3ltYm9sU2V0VHk6OmNvbnN0X2l0ZXJhdG9yOworCisgIGRlYWRfaXRlcmF0b3IgZGVhZF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIFRoZURlYWQuYmVnaW4oKTsgfQorICBkZWFkX2l0ZXJhdG9yIGRlYWRfZW5kKCkgY29uc3QgeyByZXR1cm4gVGhlRGVhZC5lbmQoKTsgfQorCisgIGJvb2wgaGFzRGVhZFN5bWJvbHMoKSBjb25zdCB7CisgICAgcmV0dXJuICFUaGVEZWFkLmVtcHR5KCk7CisgIH0KKyAgCisgIHVzaW5nIHJlZ2lvbl9pdGVyYXRvciA9IFJlZ2lvblNldFR5Ojpjb25zdF9pdGVyYXRvcjsKKworICByZWdpb25faXRlcmF0b3IgcmVnaW9uX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gUmVnaW9uUm9vdHMuYmVnaW4oKTsgfQorICByZWdpb25faXRlcmF0b3IgcmVnaW9uX2VuZCgpIGNvbnN0IHsgcmV0dXJuIFJlZ2lvblJvb3RzLmVuZCgpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGEgc3ltYm9sIGhhcyBiZWVuIGNvbmZpcm1lZCBkZWFkLgorICAvLy8KKyAgLy8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UgYWxsIG1hcmtpbmcgb2YgZGVhZCBzeW1ib2xzIGhhcyBjb21wbGV0ZWQuCisgIC8vLyAoRm9yIGNoZWNrZXJzLCB0aGlzIG1lYW5zIG9ubHkgaW4gdGhlIGV2YWxEZWFkU3ltYm9scyBjYWxsYmFjay4pCisgIGJvb2wgaXNEZWFkKFN5bWJvbFJlZiBzeW0pIGNvbnN0IHsKKyAgICByZXR1cm4gVGhlRGVhZC5jb3VudChzeW0pOworICB9CisgIAorICB2b2lkIG1hcmtMaXZlKGNvbnN0IE1lbVJlZ2lvbiAqcmVnaW9uKTsKKyAgdm9pZCBtYXJrRWxlbWVudEluZGljZXNMaXZlKGNvbnN0IE1lbVJlZ2lvbiAqcmVnaW9uKTsKKyAgCisgIC8vLyBcYnJpZWYgU2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9saWMgc3RvcmUgYWZ0ZXIKKyAgLy8vIFN0b3JlTWFuYWdlcjo6cmVtb3ZlRGVhZEJpbmRpbmdzIGhhcyBiZWVuIGNhbGxlZC4KKyAgdm9pZCBzZXRSZWFwZWRTdG9yZShTdG9yZVJlZiBzdCkgeyByZWFwZWRTdG9yZSA9IHN0OyB9CisKK3ByaXZhdGU6CisgIC8vLyBNYXJrIHRoZSBzeW1ib2xzIGRlcGVuZGVudCBvbiB0aGUgaW5wdXQgc3ltYm9sIGFzIGxpdmUuCisgIHZvaWQgbWFya0RlcGVuZGVudHNMaXZlKFN5bWJvbFJlZiBzeW0pOworfTsKKworY2xhc3MgU3ltYm9sVmlzaXRvciB7Citwcm90ZWN0ZWQ6CisgIH5TeW1ib2xWaXNpdG9yKCkgPSBkZWZhdWx0OworCitwdWJsaWM6CisgIFN5bWJvbFZpc2l0b3IoKSA9IGRlZmF1bHQ7CisgIFN5bWJvbFZpc2l0b3IoY29uc3QgU3ltYm9sVmlzaXRvciAmKSA9IGRlZmF1bHQ7CisgIFN5bWJvbFZpc2l0b3IoU3ltYm9sVmlzaXRvciAmJikge30KKworICAvLy8gXGJyaWVmIEEgdmlzaXRvciBtZXRob2QgaW52b2tlZCBieSBQcm9ncmFtU3RhdGVNYW5hZ2VyOjpzY2FuUmVhY2hhYmxlU3ltYm9scy4KKyAgLy8vCisgIC8vLyBUaGUgbWV0aG9kIHJldHVybnMgXGMgdHJ1ZSBpZiBzeW1ib2xzIHNob3VsZCBjb250aW51ZSBiZSBzY2FubmVkIGFuZCBcYworICAvLy8gZmFsc2Ugb3RoZXJ3aXNlLgorICB2aXJ0dWFsIGJvb2wgVmlzaXRTeW1ib2woU3ltYm9sUmVmIHN5bSkgPSAwOworICB2aXJ0dWFsIGJvb2wgVmlzaXRNZW1SZWdpb24oY29uc3QgTWVtUmVnaW9uICpyZWdpb24pIHsgcmV0dXJuIHRydWU7IH0KK307CisKK30gLy8gbmFtZXNwYWNlIGVudG8KKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX1NZTUJPTE1BTkFHRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N5bWJvbHMuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N5bWJvbHMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNGQ4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU3ltYm9scy5kZWYKQEAgLTAsMCArMSw1NSBAQAorLy89PT0tLSBTeW1ib2xzLmRlZiAtIE1ldGFkYXRhIGFib3V0IFN5bUV4cHIga2luZHMgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGUgbGlzdCBvZiBzeW1ib2xzIChTeW1FeHByIHN1Yi1jbGFzc2VzKSB1c2VkIGluIHRoZSBTdGF0aWMgQW5hbHl6ZXIuCisvLyBJbiBvcmRlciB0byB1c2UgdGhpcyBpbmZvcm1hdGlvbiwgdXNlcnMgb2YgdGhpcyBmaWxlIG11c3QgZGVmaW5lCisvLyBvbmUgb3IgbW9yZSBvZiB0aGUgdGhyZWUgbWFjcm9zOgorLy8KKy8vIFNZTUJPTChJZCwgUGFyZW50KSAtIGZvciBzcGVjaWZpYyBTeW1FeHByIHN1Yi1jbGFzc2VzLCByZXNlcnZpbmcgdGhlCisvLyBJZEtpbmQgaWRlbnRpZmllciBmb3IgaXRzIGtpbmQgZW51bWVyYXRpb24gdmFsdWUuCisvLworLy8gQUJTVFJBQ1RfU1lNQk9MKElkLCBQYXJlbnQpIC0gZm9yIGFic3RyYWN0IHN5bWJvbCBjbGFzc2VzLAorLy8KKy8vIFNZTUJPTF9SQU5HRShJZCwgRmlyc3QsIExhc3QpIC0gZm9yIHJhbmdlcyBvZiBraW5kLWVudW1zLAorLy8gYWxsb3dpbmcgdG8gZGV0ZXJtaW5lIGFic3RyYWN0IGNsYXNzIG9mIGEgc3ltYm9sCisvLyBiYXNlZCBvbiB0aGUga2luZCBlbnVtZXJhdGlvbiB2YWx1ZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIFNZTUJPTAorI2RlZmluZSBTWU1CT0woSWQsIFBhcmVudCkKKyNlbmRpZgorCisjaWZuZGVmIEFCU1RSQUNUX1NZTUJPTAorI2RlZmluZSBBQlNUUkFDVF9TWU1CT0woSWQsIFBhcmVudCkKKyNlbmRpZgorCisjaWZuZGVmIFNZTUJPTF9SQU5HRQorI2RlZmluZSBTWU1CT0xfUkFOR0UoSWQsIEZpcnN0LCBMYXN0KQorI2VuZGlmCisKK0FCU1RSQUNUX1NZTUJPTChCaW5hcnlTeW1FeHByLCBTeW1FeHByKQorICBTWU1CT0woSW50U3ltRXhwciwgQmluYXJ5U3ltRXhwcikKKyAgU1lNQk9MKFN5bUludEV4cHIsIEJpbmFyeVN5bUV4cHIpCisgIFNZTUJPTChTeW1TeW1FeHByLCBCaW5hcnlTeW1FeHByKQorU1lNQk9MX1JBTkdFKEJJTkFSWVNZTUVYUFJTLCBJbnRTeW1FeHByS2luZCwgU3ltU3ltRXhwcktpbmQpCisKK1NZTUJPTChTeW1ib2xDYXN0LCBTeW1FeHByKQorCitBQlNUUkFDVF9TWU1CT0woU3ltYm9sRGF0YSwgU3ltRXhwcikKKyAgU1lNQk9MKFN5bWJvbENvbmp1cmVkLCBTeW1ib2xEYXRhKQorICBTWU1CT0woU3ltYm9sRGVyaXZlZCwgU3ltYm9sRGF0YSkKKyAgU1lNQk9MKFN5bWJvbEV4dGVudCwgU3ltYm9sRGF0YSkKKyAgU1lNQk9MKFN5bWJvbE1ldGFkYXRhLCBTeW1ib2xEYXRhKQorICBTWU1CT0woU3ltYm9sUmVnaW9uVmFsdWUsIFN5bWJvbERhdGEpCitTWU1CT0xfUkFOR0UoU1lNQk9MUywgU3ltYm9sQ29uanVyZWRLaW5kLCBTeW1ib2xSZWdpb25WYWx1ZUtpbmQpCisKKyN1bmRlZiBTWU1CT0wKKyN1bmRlZiBBQlNUUkFDVF9TWU1CT0wKKyN1bmRlZiBTWU1CT0xfUkFOR0UKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9UYWludE1hbmFnZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9UYWludE1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjc2MjYzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1RhaW50TWFuYWdlci5oCkBAIC0wLDAgKzEsNTYgQEAKKy8vPT0gVGFpbnRNYW5hZ2VyLmggLSBNYW5hZ2luZyB0YWludCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLSotIEMrKyAtKi0tPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBwcm92aWRlcyBBUElzIGZvciBhZGRpbmcsIHJlbW92aW5nLCBxdWVyeWluZyBzeW1ib2wgdGFpbnQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9UQUlOVE1BTkFHRVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0NPUkVfUEFUSFNFTlNJVElWRV9UQUlOVE1BTkFHRVJfSAorCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9QYXRoRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Qcm9ncmFtU3RhdGUuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvUHJvZ3JhbVN0YXRlVHJhaXQuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvVGFpbnRUYWcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbW11dGFibGVNYXAuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBlbnRvIHsKKworLy8vIFRoZSBHRE0gY29tcG9uZW50IGNvbnRhaW5pbmcgdGhlIHRhaW50ZWQgcm9vdCBzeW1ib2xzLiBXZSBsYXppbHkgaW5mZXIgdGhlCisvLy8gdGFpbnQgb2YgdGhlIGRlcGVuZGVudCBzeW1ib2xzLiBDdXJyZW50bHksIHRoaXMgaXMgYSBtYXAgZnJvbSBhIHN5bWJvbCB0bworLy8vIHRhZyBraW5kLiBUT0RPOiBTaG91bGQgc3VwcG9ydCBtdWx0aXBsZSB0YWcga2luZHMuCisvLyBGSVhNRTogVGhpcyBkb2VzIG5vdCB1c2UgdGhlIG5pY2UgdHJhaXQgbWFjcm9zIGJlY2F1c2UgaXQgbXVzdCBiZSBhY2Nlc3NpYmxlCisvLyBmcm9tIG11bHRpcGxlIHRyYW5zbGF0aW9uIHVuaXRzLgorc3RydWN0IFRhaW50TWFwIHt9OwordHlwZWRlZiBsbHZtOjpJbW11dGFibGVNYXA8U3ltYm9sUmVmLCBUYWludFRhZ1R5cGU+IFRhaW50TWFwSW1wbDsKK3RlbXBsYXRlPD4gc3RydWN0IFByb2dyYW1TdGF0ZVRyYWl0PFRhaW50TWFwPgorICAgIDogIHB1YmxpYyBQcm9ncmFtU3RhdGVQYXJ0aWFsVHJhaXQ8VGFpbnRNYXBJbXBsPiB7CisgIHN0YXRpYyB2b2lkICpHRE1JbmRleCgpIHsgc3RhdGljIGludCBpbmRleCA9IDA7IHJldHVybiAmaW5kZXg7IH0KK307CisKKy8vLyBUaGUgR0RNIGNvbXBvbmVudCBtYXBwaW5nIGRlcml2ZWQgc3ltYm9scycgcGFyZW50IHN5bWJvbHMgdG8gdGhlaXIKKy8vLyB1bmRlcmx5aW5nIHJlZ2lvbnMuIFRoaXMgaXMgdXNlZCB0byBlZmZpY2llbnRseSBjaGVjayB3aGV0aGVyIGEgc3ltYm9sIGlzCisvLy8gdGFpbnRlZCB3aGVuIGl0IHJlcHJlc2VudHMgYSBzdWItcmVnaW9uIG9mIGEgdGFpbnRlZCBzeW1ib2wuCitzdHJ1Y3QgRGVyaXZlZFN5bVRhaW50IHt9OwordHlwZWRlZiBsbHZtOjpJbW11dGFibGVNYXA8U3ltYm9sUmVmLCBUYWludGVkU3ViUmVnaW9ucz4gRGVyaXZlZFN5bVRhaW50SW1wbDsKK3RlbXBsYXRlPD4gc3RydWN0IFByb2dyYW1TdGF0ZVRyYWl0PERlcml2ZWRTeW1UYWludD4KKyAgICA6ICBwdWJsaWMgUHJvZ3JhbVN0YXRlUGFydGlhbFRyYWl0PERlcml2ZWRTeW1UYWludEltcGw+IHsKKyAgc3RhdGljIHZvaWQgKkdETUluZGV4KCkgeyBzdGF0aWMgaW50IGluZGV4OyByZXR1cm4gJmluZGV4OyB9Cit9OworCitjbGFzcyBUYWludE1hbmFnZXIgeworCisgIFRhaW50TWFuYWdlcigpIHt9Cit9OworCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1RhaW50VGFnLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvVGFpbnRUYWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzU2ZTdkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1RhaW50VGFnLmgKQEAgLTAsMCArMSwyNyBAQAorLy89PSBUYWludFRhZy5oIC0gUGF0aC1zZW5zaXRpdmUgIlN0YXRlIiBmb3IgdHJhY2tpbmcgdmFsdWVzIC0qLSBDKysgLSotLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIERlZmluZXMgYSBzZXQgb2YgdGFpbnQgdGFncy4gU2V2ZXJhbCB0YWdzIGFyZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUga2luZHMKKy8vIG9mIHRhaW50LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX1RBSU5UVEFHX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfVEFJTlRUQUdfSAorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGVudG8geworCisvLy8gVGhlIHR5cGUgb2YgdGFpbnQsIHdoaWNoIGhlbHBzIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBkaWZmZXJlbnQgdHlwZXMgb2YKKy8vLyB0YWludC4KK3R5cGVkZWYgdW5zaWduZWQgVGFpbnRUYWdUeXBlOworc3RhdGljIGNvbnN0IFRhaW50VGFnVHlwZSBUYWludFRhZ0dlbmVyaWMgPSAwOworCit9fQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Xb3JrTGlzdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1dvcmtMaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmOGYzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Xb3JrTGlzdC5oCkBAIC0wLDAgKzEsOTQgQEAKKy8vPT0tIFdvcmtMaXN0LmggLSBXb3JrbGlzdCBjbGFzcyB1c2VkIGJ5IENvcmVFbmdpbmUgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIFdvcmtMaXN0LCBhIHB1cmUgdmlydHVhbCBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYW4gb3BhcXVlCisvLyAgd29ya2xpc3QgdXNlZCBieSBDb3JlRW5naW5lIHRvIGV4cGxvcmUgdGhlIHJlYWNoYWJpbGl0eSBzdGF0ZSBzcGFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfQ09SRV9QQVRIU0VOU0lUSVZFX1dPUktMSVNUX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9DT1JFX1BBVEhTRU5TSVRJVkVfV09SS0xJU1RfSAorCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0Jsb2NrQ291bnRlci5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9FeHBsb2RlZEdyYXBoLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGNsYW5nIHsKKyAgCitjbGFzcyBDRkdCbG9jazsKKworbmFtZXNwYWNlIGVudG8geworCitjbGFzcyBXb3JrTGlzdFVuaXQgeworICBFeHBsb2RlZE5vZGUgKm5vZGU7CisgIEJsb2NrQ291bnRlciBjb3VudGVyOworICBjb25zdCBDRkdCbG9jayAqYmxvY2s7CisgIHVuc2lnbmVkIGJsb2NrSWR4OyAvLyBUaGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBzdGF0ZW1lbnQuCisKK3B1YmxpYzoKKyAgV29ya0xpc3RVbml0KEV4cGxvZGVkTm9kZSAqTiwgQmxvY2tDb3VudGVyIEMsCisgICAgICAgICAgICAgICBjb25zdCBDRkdCbG9jayAqQiwgdW5zaWduZWQgaWR4KQorICA6IG5vZGUoTiksCisgICAgY291bnRlcihDKSwKKyAgICBibG9jayhCKSwKKyAgICBibG9ja0lkeChpZHgpIHt9CisKKyAgZXhwbGljaXQgV29ya0xpc3RVbml0KEV4cGxvZGVkTm9kZSAqTiwgQmxvY2tDb3VudGVyIEMpCisgIDogbm9kZShOKSwKKyAgICBjb3VudGVyKEMpLAorICAgIGJsb2NrKG51bGxwdHIpLAorICAgIGJsb2NrSWR4KDApIHt9CisKKyAgLy8vIFJldHVybnMgdGhlIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB3b3JrbGlzdCB1bml0LgorICBFeHBsb2RlZE5vZGUgKmdldE5vZGUoKSBjb25zdCB7IHJldHVybiBub2RlOyB9CisgIAorICAvLy8gUmV0dXJucyB0aGUgYmxvY2sgY291bnRlciBtYXAgYXNzb2NpYXRlZCB3aXRoIHRoZSB3b3JrbGlzdCB1bml0LgorICBCbG9ja0NvdW50ZXIgZ2V0QmxvY2tDb3VudGVyKCkgY29uc3QgeyByZXR1cm4gY291bnRlcjsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBDRkdibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHdvcmtsaXN0IHVuaXQuCisgIGNvbnN0IENGR0Jsb2NrICpnZXRCbG9jaygpIGNvbnN0IHsgcmV0dXJuIGJsb2NrOyB9CisgIAorICAvLy8gUmV0dXJuIHRoZSBpbmRleCB3aXRoaW4gdGhlIENGR0Jsb2NrIGZvciB0aGUgd29ya2xpc3QgdW5pdC4KKyAgdW5zaWduZWQgZ2V0SW5kZXgoKSBjb25zdCB7IHJldHVybiBibG9ja0lkeDsgfQorfTsKKworY2xhc3MgV29ya0xpc3QgeworICBCbG9ja0NvdW50ZXIgQ3VycmVudENvdW50ZXI7CitwdWJsaWM6CisgIHZpcnR1YWwgfldvcmtMaXN0KCk7CisgIHZpcnR1YWwgYm9vbCBoYXNXb3JrKCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgdm9pZCBlbnF1ZXVlKGNvbnN0IFdvcmtMaXN0VW5pdCYgVSkgPSAwOworCisgIHZvaWQgZW5xdWV1ZShFeHBsb2RlZE5vZGUgKk4sIGNvbnN0IENGR0Jsb2NrICpCLCB1bnNpZ25lZCBpZHgpIHsKKyAgICBlbnF1ZXVlKFdvcmtMaXN0VW5pdChOLCBDdXJyZW50Q291bnRlciwgQiwgaWR4KSk7CisgIH0KKworICB2b2lkIGVucXVldWUoRXhwbG9kZWROb2RlICpOKSB7CisgICAgYXNzZXJ0KE4tPmdldExvY2F0aW9uKCkuZ2V0S2luZCgpICE9IFByb2dyYW1Qb2ludDo6UG9zdFN0bXRLaW5kKTsKKyAgICBlbnF1ZXVlKFdvcmtMaXN0VW5pdChOLCBDdXJyZW50Q291bnRlcikpOworICB9CisKKyAgdmlydHVhbCBXb3JrTGlzdFVuaXQgZGVxdWV1ZSgpID0gMDsKKworICB2b2lkIHNldEJsb2NrQ291bnRlcihCbG9ja0NvdW50ZXIgQykgeyBDdXJyZW50Q291bnRlciA9IEM7IH0KKyAgQmxvY2tDb3VudGVyIGdldEJsb2NrQ291bnRlcigpIGNvbnN0IHsgcmV0dXJuIEN1cnJlbnRDb3VudGVyOyB9CisKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxXb3JrTGlzdD4gbWFrZURGUygpOworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFdvcmtMaXN0PiBtYWtlQkZTKCk7CisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8V29ya0xpc3Q+IG1ha2VCRlNCbG9ja0RGU0NvbnRlbnRzKCk7CisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8V29ya0xpc3Q+IG1ha2VVbmV4cGxvcmVkRmlyc3QoKTsKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxXb3JrTGlzdD4gbWFrZVVuZXhwbG9yZWRGaXJzdFByaW9yaXR5UXVldWUoKTsKK307CisKK30gLy8gZW5kIGVudG8gbmFtZXNwYWNlCisKK30gLy8gZW5kIGNsYW5nIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0Zyb250ZW5kL0FuYWx5c2lzQ29uc3VtZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0Zyb250ZW5kL0FuYWx5c2lzQ29uc3VtZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWRhZDZjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQW5hbHlzaXNDb25zdW1lci5oCkBAIC0wLDAgKzEsNDggQEAKKy8vPT09LS0tIEFuYWx5c2lzQ29uc3VtZXIuaCAtIEZyb250LWVuZCBBbmFseXNpcyBFbmdpbmUgSG9va3MgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgY29udGFpbnMgdGhlIGZ1bmN0aW9ucyBuZWNlc3NhcnkgZm9yIGEgZnJvbnQtZW5kIHRvIHJ1biB2YXJpb3VzCisvLyBhbmFseXNlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfRlJPTlRFTkRfQU5BTFlTSVNDT05TVU1FUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfRlJPTlRFTkRfQU5BTFlTSVNDT05TVU1FUl9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29uc3VtZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBQcmVwcm9jZXNzb3I7CitjbGFzcyBEaWFnbm9zdGljc0VuZ2luZTsKK2NsYXNzIENvZGVJbmplY3RvcjsKK2NsYXNzIENvbXBpbGVySW5zdGFuY2U7CisKK25hbWVzcGFjZSBlbnRvIHsKK2NsYXNzIFBhdGhEaWFnbm9zdGljQ29uc3VtZXI7CitjbGFzcyBDaGVja2VyTWFuYWdlcjsKKworY2xhc3MgQW5hbHlzaXNBU1RDb25zdW1lciA6IHB1YmxpYyBBU1RDb25zdW1lciB7CitwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBBZGREaWFnbm9zdGljQ29uc3VtZXIoUGF0aERpYWdub3N0aWNDb25zdW1lciAqQ29uc3VtZXIpID0gMDsKK307CisKKy8vLyBDcmVhdGVBbmFseXNpc0NvbnN1bWVyIC0gQ3JlYXRlcyBhbiBBU1RDb25zdW1lciB0byBydW4gdmFyaW91cyBjb2RlCisvLy8gYW5hbHlzaXMgcGFzc2VzLiAgKFRoZSBzZXQgb2YgYW5hbHlzZXMgcnVuIGlzIGNvbnRyb2xsZWQgYnkgY29tbWFuZC1saW5lCisvLy8gb3B0aW9ucy4pCitzdGQ6OnVuaXF1ZV9wdHI8QW5hbHlzaXNBU1RDb25zdW1lcj4KK0NyZWF0ZUFuYWx5c2lzQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0kpOworCit9IC8vIGVuZCBHUiBuYW1lc3BhY2UKKworfSAvLyBlbmQgY2xhbmcgbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQ2hlY2tlclJlZ2lzdHJhdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQ2hlY2tlclJlZ2lzdHJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ODViN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9DaGVja2VyUmVnaXN0cmF0aW9uLmgKQEAgLTAsMCArMSwzMyBAQAorLy89PT0tLSBDaGVja2VyUmVnaXN0cmF0aW9uLmggLSBDaGVja2VyIFJlZ2lzdHJhdGlvbiBGdW5jdGlvbiAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0ZST05URU5EX0NIRUNLRVJSRUdJU1RSQVRJT05fSAorI2RlZmluZSBMTFZNX0NMQU5HX1NUQVRJQ0FOQUxZWkVSX0ZST05URU5EX0NIRUNLRVJSRUdJU1RSQVRJT05fSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBjbGFuZyB7CisgIGNsYXNzIEFuYWx5emVyT3B0aW9uczsKKyAgY2xhc3MgTGFuZ09wdGlvbnM7CisgIGNsYXNzIERpYWdub3N0aWNzRW5naW5lOworCituYW1lc3BhY2UgZW50byB7CisgIGNsYXNzIENoZWNrZXJNYW5hZ2VyOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDaGVja2VyTWFuYWdlcj4KKyAgY3JlYXRlQ2hlY2tlck1hbmFnZXIoQW5hbHl6ZXJPcHRpb25zICZvcHRzLCBjb25zdCBMYW5nT3B0aW9ucyAmbGFuZ09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBwbHVnaW5zLCBEaWFnbm9zdGljc0VuZ2luZSAmZGlhZ3MpOworCit9IC8vIGVuZCBlbnRvIG5hbWVzcGFjZQorCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NmQ0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuaApAQCAtMCwwICsxLDYzIEBACisvLz09PS0tIEZyb250ZW5kQWN0aW9ucy5oIC0gVXNlZnVsIEZyb250ZW5kIEFjdGlvbnMgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfU1RBVElDQU5BTFlaRVJfRlJPTlRFTkRfRlJPTlRFTkRBQ1RJT05TX0gKKyNkZWZpbmUgTExWTV9DTEFOR19TVEFUSUNBTkFMWVpFUl9GUk9OVEVORF9GUk9OVEVOREFDVElPTlNfSAorCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgU3RtdDsKK2NsYXNzIEFuYWx5emVyT3B0aW9uczsKKworbmFtZXNwYWNlIGVudG8geworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQVNUIENvbnN1bWVyIEFjdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIEFuYWx5c2lzQWN0aW9uIDogcHVibGljIEFTVEZyb250ZW5kQWN0aW9uIHsKK3Byb3RlY3RlZDoKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPiBDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKSBvdmVycmlkZTsKK307CisKKy8vLyBcYnJpZWYgRnJvbnRlbmQgYWN0aW9uIHRvIHBhcnNlIG1vZGVsIGZpbGVzLgorLy8vCisvLy8gVGhpcyBmcm9udGVuZCBhY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHBhcnNpbmcgbW9kZWwgZmlsZXMuIE1vZGVsIGZpbGVzIGNhbgorLy8vIG5vdCBiZSBwYXJzZWQgb24gdGhlaXIgb3duLCB0aGV5IHJlbHkgb24gdHlwZSBpbmZvcm1hdGlvbiB0aGF0IGlzIGF2YWlsYWJsZQorLy8vIGluIGFub3RoZXIgdHJhbnNsYXRpb24gdW5pdC4gVGhlIHBhcnNpbmcgb2YgbW9kZWwgZmlsZXMgaXMgZG9uZSBieSBhCisvLy8gc2VwYXJhdGUgY29tcGlsZXIgaW5zdGFuY2UgdGhhdCByZXVzZXMgdGhlIEFTVENvbnRleHQgYW5kIG90aGVuIGluZm9ybWF0aW9uCisvLy8gZnJvbSB0aGUgbWFpbiB0cmFuc2xhdGlvbiB1bml0IHRoYXQgaXMgYmVpbmcgY29tcGlsZWQuIEFmdGVyIGEgbW9kZWwgZmlsZSBpcworLy8vIHBhcnNlZCwgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb25zIHdpbGwgYmUgY29sbGVjdGVkIGludG8gYSBTdHJpbmdNYXAuCitjbGFzcyBQYXJzZU1vZGVsRmlsZUFjdGlvbiA6IHB1YmxpYyBBU1RGcm9udGVuZEFjdGlvbiB7CitwdWJsaWM6CisgIFBhcnNlTW9kZWxGaWxlQWN0aW9uKGxsdm06OlN0cmluZ01hcDxTdG10ICo+ICZCb2RpZXMpOworICBib29sIGlzTW9kZWxQYXJzaW5nQWN0aW9uKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorCitwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RDb25zdW1lcj4gQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIGxsdm06OlN0cmluZ01hcDxTdG10ICo+ICZCb2RpZXM7Cit9OworCit2b2lkIHByaW50Q2hlY2tlckhlbHAocmF3X29zdHJlYW0gJk9TLCBBcnJheVJlZjxzdGQ6OnN0cmluZz4gcGx1Z2lucyk7Cit2b2lkIHByaW50RW5hYmxlZENoZWNrZXJMaXN0KHJhd19vc3RyZWFtICZPUywgQXJyYXlSZWY8c3RkOjpzdHJpbmc+IHBsdWdpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFuYWx5emVyT3B0aW9ucyAmb3B0cyk7CisKK30gLy8gZW5kIEdSIG5hbWVzcGFjZQorCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9Nb2RlbENvbnN1bWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9Nb2RlbENvbnN1bWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmODA0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0Zyb250ZW5kL01vZGVsQ29uc3VtZXIuaApAQCAtMCwwICsxLDQ0IEBACisvLz09PS0tIE1vZGVsQ29uc3VtZXIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgVGhpcyBmaWxlIGltcGxlbWVudHMgY2xhbmc6OmVudG86Ok1vZGVsQ29uc3VtZXIgd2hpY2ggaXMgYW4KKy8vLyBBU1RDb25zdW1lciBmb3IgbW9kZWwgZmlsZXMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19HUl9NT0RFTENPTlNVTUVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19HUl9NT0RFTENPTlNVTUVSX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb25zdW1lci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBTdG10OworCituYW1lc3BhY2UgZW50byB7CisKKy8vLyBcYnJpZWYgQVNUQ29uc3VtZXIgdG8gY29uc3VtZSBtb2RlbCBmaWxlcycgQVNULgorLy8vCisvLy8gVGhpcyBjb25zdW1lciBjb2xsZWN0cyB0aGUgYm9kaWVzIG9mIGZ1bmN0aW9uIGRlZmluaXRpb25zIGludG8gYSBTdHJpbmdNYXAKKy8vLyBmcm9tIGEgbW9kZWwgZmlsZS4KK2NsYXNzIE1vZGVsQ29uc3VtZXIgOiBwdWJsaWMgQVNUQ29uc3VtZXIgeworcHVibGljOgorICBNb2RlbENvbnN1bWVyKGxsdm06OlN0cmluZ01hcDxTdG10ICo+ICZCb2RpZXMpOworCisgIGJvb2wgSGFuZGxlVG9wTGV2ZWxEZWNsKERlY2xHcm91cFJlZiBEKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgbGx2bTo6U3RyaW5nTWFwPFN0bXQgKj4gJkJvZGllczsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9BU1REaWZmL0FTVERpZmYuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvQVNURGlmZi9BU1REaWZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQxMWM5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvQVNURGlmZi9BU1REaWZmLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8vPT09LSBBU1REaWZmLmggLSBBU1QgZGlmZmVyZW5jaW5nIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi0gLT09PS8vCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBzcGVjaWZpZXMgYW4gaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tcGFyZSBDKysgc3ludGF4CisvLyB0cmVlcy4KKy8vCisvLyBXZSB1c2UgdGhlIGd1bXRyZWUgYWxnb3JpdGhtIHdoaWNoIGNvbWJpbmVzIGEgaGV1cmlzdGljIHRvcC1kb3duIHNlYXJjaCB0aGF0CisvLyBpcyBhYmxlIHRvIG1hdGNoIGxhcmdlIHN1YnRyZWVzIHRoYXQgYXJlIGVxdWl2YWxlbnQsIHdpdGggYW4gb3B0aW1hbAorLy8gYWxnb3JpdGhtIHRvIG1hdGNoIHNtYWxsIHN1YnRyZWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19UT09MSU5HX0FTVERJRkZfQVNURElGRl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19BU1RESUZGX0FTVERJRkZfSAorCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9BU1REaWZmL0FTVERpZmZJbnRlcm5hbC5oIgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGRpZmYgeworCitlbnVtIENoYW5nZUtpbmQgeworICBOb25lLAorICBEZWxldGUsICAgIC8vIChTcmMpOiBkZWxldGUgbm9kZSBTcmMuCisgIFVwZGF0ZSwgICAgLy8gKFNyYywgRHN0KTogdXBkYXRlIHRoZSB2YWx1ZSBvZiBub2RlIFNyYyB0byBtYXRjaCBEc3QuCisgIEluc2VydCwgICAgLy8gKFNyYywgRHN0LCBQb3MpOiBpbnNlcnQgU3JjIGFzIGNoaWxkIG9mIERzdCBhdCBvZmZzZXQgUG9zLgorICBNb3ZlLCAgICAgIC8vIChTcmMsIERzdCwgUG9zKTogbW92ZSBTcmMgdG8gYmUgYSBjaGlsZCBvZiBEc3QgYXQgb2Zmc2V0IFBvcy4KKyAgVXBkYXRlTW92ZSAvLyBTYW1lIGFzIE1vdmUgcGx1cyBVcGRhdGUuCit9OworCisvLy8gUmVwcmVzZW50cyBhIENsYW5nIEFTVCBub2RlLCBhbG9uZ3NpZGUgc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgorc3RydWN0IE5vZGUgeworICBOb2RlSWQgUGFyZW50LCBMZWZ0TW9zdERlc2NlbmRhbnQsIFJpZ2h0TW9zdERlc2NlbmRhbnQ7CisgIGludCBEZXB0aCwgSGVpZ2h0LCBTaGlmdCA9IDA7CisgIGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlIEFTVE5vZGU7CisgIFNtYWxsVmVjdG9yPE5vZGVJZCwgND4gQ2hpbGRyZW47CisgIENoYW5nZUtpbmQgQ2hhbmdlID0gTm9uZTsKKworICBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kIGdldFR5cGUoKSBjb25zdDsKKyAgU3RyaW5nUmVmIGdldFR5cGVMYWJlbCgpIGNvbnN0OworICBib29sIGlzTGVhZigpIGNvbnN0IHsgcmV0dXJuIENoaWxkcmVuLmVtcHR5KCk7IH0KKyAgbGx2bTo6T3B0aW9uYWw8U3RyaW5nUmVmPiBnZXRJZGVudGlmaWVyKCkgY29uc3Q7CisgIGxsdm06Ok9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBnZXRRdWFsaWZpZWRJZGVudGlmaWVyKCkgY29uc3Q7Cit9OworCitjbGFzcyBBU1REaWZmIHsKK3B1YmxpYzoKKyAgQVNURGlmZihTeW50YXhUcmVlICZTcmMsIFN5bnRheFRyZWUgJkRzdCwgY29uc3QgQ29tcGFyaXNvbk9wdGlvbnMgJk9wdGlvbnMpOworICB+QVNURGlmZigpOworCisgIC8vIFJldHVybnMgdGhlIElEIG9mIHRoZSBub2RlIHRoYXQgaXMgbWFwcGVkIHRvIHRoZSBnaXZlbiBub2RlIGluIFNvdXJjZVRyZWUuCisgIE5vZGVJZCBnZXRNYXBwZWQoY29uc3QgU3ludGF4VHJlZSAmU291cmNlVHJlZSwgTm9kZUlkIElkKSBjb25zdDsKKworICBjbGFzcyBJbXBsOworCitwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gRGlmZkltcGw7Cit9OworCisvLy8gU3ludGF4VHJlZSBvYmplY3RzIHJlcHJlc2VudCBzdWJ0cmVlcyBvZiB0aGUgQVNULgorLy8vIFRoZXkgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gYW55IERlY2wgb3IgU3RtdC4KK2NsYXNzIFN5bnRheFRyZWUgeworcHVibGljOgorICAvLy8gQ29uc3RydWN0cyBhIHRyZWUgZnJvbSBhIHRyYW5zbGF0aW9uIHVuaXQuCisgIFN5bnRheFRyZWUoQVNUQ29udGV4dCAmQVNUKTsKKyAgLy8vIENvbnN0cnVjdHMgYSB0cmVlIGZyb20gYW55IEFTVCBub2RlLgorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgU3ludGF4VHJlZShUICpOb2RlLCBBU1RDb250ZXh0ICZBU1QpCisgICAgICA6IFRyZWVJbXBsKGxsdm06Om1ha2VfdW5pcXVlPEltcGw+KHRoaXMsIE5vZGUsIEFTVCkpIHt9CisgIFN5bnRheFRyZWUoU3ludGF4VHJlZSAmJk90aGVyKSA9IGRlZmF1bHQ7CisgIH5TeW50YXhUcmVlKCk7CisKKyAgY29uc3QgQVNUQ29udGV4dCAmZ2V0QVNUQ29udGV4dCgpIGNvbnN0OworICBTdHJpbmdSZWYgZ2V0RmlsZW5hbWUoKSBjb25zdDsKKworICBpbnQgZ2V0U2l6ZSgpIGNvbnN0OworICBOb2RlSWQgZ2V0Um9vdElkKCkgY29uc3Q7CisgIHVzaW5nIFByZW9yZGVySXRlcmF0b3IgPSBOb2RlSWQ7CisgIFByZW9yZGVySXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKKyAgUHJlb3JkZXJJdGVyYXRvciBlbmQoKSBjb25zdDsKKworICBjb25zdCBOb2RlICZnZXROb2RlKE5vZGVJZCBJZCkgY29uc3Q7CisgIGludCBmaW5kUG9zaXRpb25JblBhcmVudChOb2RlSWQgSWQpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgb2Zmc2V0IG9mIHRoZSBub2RlIGluIGl0cyBzb3VyY2UgZmlsZS4KKyAgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gZ2V0U291cmNlUmFuZ2VPZmZzZXRzKGNvbnN0IE5vZGUgJk4pIGNvbnN0OworCisgIC8vLyBTZXJpYWxpemUgdGhlIG5vZGUgYXR0cmlidXRlcyB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbi4gVGhpcyBzaG91bGQKKyAgLy8vIHVuaXF1ZWx5IGRpc3Rpbmd1aXNoIG5vZGVzIG9mIHRoZSBzYW1lIGtpbmQuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGp1c3QKKyAgLy8vIHJldHVybnMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbm9kZSB2YWx1ZSwgbm90IGNvbnNpZGVyaW5nIGRlc2NlbmRhbnRzLgorICBzdGQ6OnN0cmluZyBnZXROb2RlVmFsdWUoTm9kZUlkIElkKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgZ2V0Tm9kZVZhbHVlKGNvbnN0IE5vZGUgJk5vZGUpIGNvbnN0OworCisgIGNsYXNzIEltcGw7CisgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBUcmVlSW1wbDsKK307CisKK3N0cnVjdCBDb21wYXJpc29uT3B0aW9ucyB7CisgIC8vLyBEdXJpbmcgdG9wLWRvd24gbWF0Y2hpbmcsIG9ubHkgY29uc2lkZXIgbm9kZXMgb2YgYXQgbGVhc3QgdGhpcyBoZWlnaHQuCisgIGludCBNaW5IZWlnaHQgPSAyOworCisgIC8vLyBEdXJpbmcgYm90dG9tLXVwIG1hdGNoaW5nLCBtYXRjaCBvbmx5IG5vZGVzIHdpdGggYXQgbGVhc3QgdGhpcyB2YWx1ZSBhcworICAvLy8gdGhlIHJhdGlvIG9mIHRoZWlyIGNvbW1vbiBkZXNjZW5kYW50cy4KKyAgZG91YmxlIE1pblNpbWlsYXJpdHkgPSAwLjU7CisKKyAgLy8vIFdoZW5ldmVyIHR3byBzdWJ0cmVlcyBhcmUgbWF0Y2hlZCBpbiB0aGUgYm90dG9tLXVwIHBoYXNlLCB0aGUgb3B0aW1hbAorICAvLy8gbWFwcGluZyBpcyBjb21wdXRlZCwgdW5sZXNzIHRoZSBzaXplIG9mIGVpdGhlciBzdWJ0cmVlcyBleGNlZWRzIHRoaXMuCisgIGludCBNYXhTaXplID0gMTAwOworCisgIGJvb2wgU3RvcEFmdGVyVG9wRG93biA9IGZhbHNlOworCisgIC8vLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSBub2RlcyBzaG91bGQgbmV2ZXIgYmUgbWF0Y2hlZC4KKyAgYm9vbCBpc01hdGNoaW5nQWxsb3dlZChjb25zdCBOb2RlICZOMSwgY29uc3QgTm9kZSAmTjIpIGNvbnN0IHsKKyAgICByZXR1cm4gTjEuZ2V0VHlwZSgpLmlzU2FtZShOMi5nZXRUeXBlKCkpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZGlmZgorfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9BU1REaWZmL0FTVERpZmZJbnRlcm5hbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9BU1REaWZmL0FTVERpZmZJbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NmFkMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0FTVERpZmYvQVNURGlmZkludGVybmFsLmgKQEAgLTAsMCArMSw0OCBAQAorLy89PT0tIEFTVERpZmZJbnRlcm5hbC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLSAtPT09Ly8KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19UT09MSU5HX0FTVERJRkZfQVNURElGRklOVEVSTkFMX0gKKyNkZWZpbmUgTExWTV9DTEFOR19UT09MSU5HX0FTVERJRkZfQVNURElGRklOVEVSTkFMX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RUeXBlVHJhaXRzLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgZGlmZiB7CisKK3VzaW5nIER5blR5cGVkTm9kZSA9IGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlOworCitjbGFzcyBTeW50YXhUcmVlOworY2xhc3MgU3ludGF4VHJlZUltcGw7CitzdHJ1Y3QgQ29tcGFyaXNvbk9wdGlvbnM7CisKKy8vLyBXaXRoaW4gYSB0cmVlLCB0aGlzIGlkZW50aWZpZXMgYSBub2RlIGJ5IGl0cyBwcmVvcmRlciBvZmZzZXQuCitzdHJ1Y3QgTm9kZUlkIHsKK3ByaXZhdGU6CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IEludmFsaWROb2RlSWQgPSAtMTsKKworcHVibGljOgorICBpbnQgSWQ7CisKKyAgTm9kZUlkKCkgOiBJZChJbnZhbGlkTm9kZUlkKSB7fQorICBOb2RlSWQoaW50IElkKSA6IElkKElkKSB7fQorCisgIG9wZXJhdG9yIGludCgpIGNvbnN0IHsgcmV0dXJuIElkOyB9CisgIE5vZGVJZCAmb3BlcmF0b3IrKygpIHsgcmV0dXJuICsrSWQsICp0aGlzOyB9CisgIE5vZGVJZCAmb3BlcmF0b3ItLSgpIHsgcmV0dXJuIC0tSWQsICp0aGlzOyB9CisgIC8vIFN1cHBvcnQgZGVmaW5pbmcgaXRlcmF0b3JzIG9uIE5vZGVJZC4KKyAgTm9kZUlkICZvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQorCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIElkICE9IEludmFsaWROb2RlSWQ7IH0KKyAgYm9vbCBpc0ludmFsaWQoKSBjb25zdCB7IHJldHVybiBJZCA9PSBJbnZhbGlkTm9kZUlkOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZGlmZgorfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvQWxsVFVzRXhlY3V0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0FsbFRVc0V4ZWN1dGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTdhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0FsbFRVc0V4ZWN1dGlvbi5oCkBAIC0wLDAgKzEsNzYgQEAKKy8vPT09LS0tIEFsbFRVc0V4ZWN1dGlvbi5oIC0gRXhlY3V0ZSBhY3Rpb25zIG9uIGFsbCBUVXMuIC0qLSBDKysgLS0tLS0tLS0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIGEgdG9vbCBleGVjdXRvciB0aGF0IHJ1bnMgZ2l2ZW4gYWN0aW9ucyBvbiBhbGwgVFVzIGluIHRoZQorLy8gIGNvbXBpbGF0aW9uIGRhdGFiYXNlLiBUb29sIHJlc3VsdHMgYXJlIGRldXBsaWNhdGVkIGJ5IHRoZSByZXN1bHQga2V5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19UT09MSU5HX0FMTFRVU0VYRUNVVElPTl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19BTExUVVNFWEVDVVRJT05fSAorCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9Bcmd1bWVudHNBZGp1c3RlcnMuaCIKKyNpbmNsdWRlICJjbGFuZy9Ub29saW5nL0V4ZWN1dGlvbi5oIgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIHRvb2xpbmcgeworCisvLy8gXGJyaWVmIEV4ZWN1dGVzIGdpdmVuIGZyb250ZW5kIGFjdGlvbnMgb24gYWxsIGZpbGVzL1RVcyBpbiB0aGUgY29tcGlsYXRpb24KKy8vLyBkYXRhYmFzZS4KK2NsYXNzIEFsbFRVc1Rvb2xFeGVjdXRvciA6IHB1YmxpYyBUb29sRXhlY3V0b3IgeworcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciAqRXhlY3V0b3JOYW1lOworCisgIC8vLyBcYnJpZWYgSW5pdCB3aXRoIFxwIENvbXBpbGF0aW9uRGF0YWJhc2UuCisgIC8vLyBUaGlzIHVzZXMgXHAgVGhyZWFkQ291bnQgdGhyZWFkcyB0byBleGVjZWN1dGUgdGhlIGFjdGlvbnMgb24gYWxsIGZpbGVzIGluCisgIC8vLyBwYXJhbGxlbC4gSWYgXHAgVGhyZWFkQ291bnQgaXMgMCwgdGhpcyB1c2VzIGBsbHZtOjpoYXJkd2FyZV9jb25jdXJyZW5jeWAuCisgIEFsbFRVc1Rvb2xFeGVjdXRvcihjb25zdCBDb21waWxhdGlvbkRhdGFiYXNlICZDb21waWxhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUaHJlYWRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQQ0hDb250YWluZXJPcGVyYXRpb25zPiBQQ0hDb250YWluZXJPcHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8UENIQ29udGFpbmVyT3BlcmF0aW9ucz4oKSk7CisKKyAgLy8vIFxicmllZiBJbml0IHdpdGggXHAgQ29tbW9uT3B0aW9uc1BhcnNlci4gVGhpcyBpcyBleHBlY3RlZCB0byBiZSB1c2VkIGJ5CisgIC8vLyBgY3JlYXRlRXhlY3V0b3JGcm9tQ29tbWFuZExpbmVBcmdzYCBiYXNlZCBvbiBjb21tYW5kbGluZSBvcHRpb25zLgorICAvLy8KKyAgLy8vIFRoZSBleGVjdXRvciB0YWtlcyBvd25lcnNoaXAgb2YgXHAgT3B0aW9ucy4KKyAgQWxsVFVzVG9vbEV4ZWN1dG9yKENvbW1vbk9wdGlvbnNQYXJzZXIgT3B0aW9ucywgdW5zaWduZWQgVGhyZWFkQ291bnQsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UENIQ29udGFpbmVyT3BlcmF0aW9ucz4gUENIQ29udGFpbmVyT3BzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFBDSENvbnRhaW5lck9wZXJhdGlvbnM+KCkpOworCisgIFN0cmluZ1JlZiBnZXRFeGVjdXRvck5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBFeGVjdXRvck5hbWU7IH0KKworICB1c2luZyBUb29sRXhlY3V0b3I6OmV4ZWN1dGU7CisKKyAgbGx2bTo6RXJyb3IKKyAgZXhlY3V0ZShsbHZtOjpBcnJheVJlZjwKKyAgICAgICAgICBzdGQ6OnBhaXI8c3RkOjp1bmlxdWVfcHRyPEZyb250ZW5kQWN0aW9uRmFjdG9yeT4sIEFyZ3VtZW50c0FkanVzdGVyPj4KKyAgICAgICAgICAgICAgQWN0aW9ucykgb3ZlcnJpZGU7CisKKyAgRXhlY3V0aW9uQ29udGV4dCAqZ2V0RXhlY3V0aW9uQ29udGV4dCgpIG92ZXJyaWRlIHsgcmV0dXJuICZDb250ZXh0OyB9OworCisgIFRvb2xSZXN1bHRzICpnZXRUb29sUmVzdWx0cygpIG92ZXJyaWRlIHsgcmV0dXJuIFJlc3VsdHMuZ2V0KCk7IH0KKworICB2b2lkIG1hcFZpcnR1YWxGaWxlKFN0cmluZ1JlZiBGaWxlUGF0aCwgU3RyaW5nUmVmIENvbnRlbnQpIG92ZXJyaWRlIHsKKyAgICBPdmVybGF5RmlsZXNbRmlsZVBhdGhdID0gQ29udGVudDsKKyAgfQorCitwcml2YXRlOgorICAvLyBVc2VkIHRvIHN0b3JlIHRoZSBwYXJzZXIgd2hlbiB0aGUgZXhlY3V0b3IgaXMgaW5pdGlhbGl6ZWQgd2l0aCBwYXJzZXIuCisgIGxsdm06Ok9wdGlvbmFsPENvbW1vbk9wdGlvbnNQYXJzZXI+IE9wdGlvbnNQYXJzZXI7CisgIGNvbnN0IENvbXBpbGF0aW9uRGF0YWJhc2UgJkNvbXBpbGF0aW9uczsKKyAgc3RkOjp1bmlxdWVfcHRyPFRvb2xSZXN1bHRzPiBSZXN1bHRzOworICBFeGVjdXRpb25Db250ZXh0IENvbnRleHQ7CisgIGxsdm06OlN0cmluZ01hcDxzdGQ6OnN0cmluZz4gT3ZlcmxheUZpbGVzOworICB1bnNpZ25lZCBUaHJlYWRDb3VudDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSB0b29saW5nCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfVE9PTElOR19BTExUVVNFWEVDVVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9Bcmd1bWVudHNBZGp1c3RlcnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvQXJndW1lbnRzQWRqdXN0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI4OGY4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvQXJndW1lbnRzQWRqdXN0ZXJzLmgKQEAgLTAsMCArMSw3MiBAQAorLy89PT0tIEFyZ3VtZW50c0FkanVzdGVycy5oIC0gQ29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhZGp1c3RlciAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdHlwZSBBcmd1bWVudHNBZGp1c3RlciBhbmQgZnVuY3Rpb25zIHRvIGNyZWF0ZSBzZXZlcmFsCisvLyB1c2VmdWwgYXJndW1lbnQgYWRqdXN0ZXJzLgorLy8gQXJndW1lbnRzQWRqdXN0ZXJzIG1vZGlmeSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIG9idGFpbmVkIGZyb20gYSBjb21waWxhdGlvbgorLy8gZGF0YWJhc2UgYmVmb3JlIHRoZXkgYXJlIHVzZWQgdG8gcnVuIGEgZnJvbnRlbmQgYWN0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19UT09MSU5HX0FSR1VNRU5UU0FESlVTVEVSU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19BUkdVTUVOVFNBREpVU1RFUlNfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSB0b29saW5nIHsKKworLy8vIFxicmllZiBBIHNlcXVlbmNlIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCit1c2luZyBDb21tYW5kTGluZUFyZ3VtZW50cyA9IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjsKKworLy8vIFxicmllZiBBIHByb3RvdHlwZSBvZiBhIGNvbW1hbmQgbGluZSBhZGp1c3Rlci4KKy8vLworLy8vIENvbW1hbmQgbGluZSBhcmd1bWVudCBhZGp1c3RlciBpcyByZXNwb25zaWJsZSBmb3IgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworLy8vIG1vZGlmaWNhdGlvbiBiZWZvcmUgdGhlIGFyZ3VtZW50cyBhcmUgdXNlZCB0byBydW4gYSBmcm9udGVuZCBhY3Rpb24uCit1c2luZyBBcmd1bWVudHNBZGp1c3RlciA9IHN0ZDo6ZnVuY3Rpb248Q29tbWFuZExpbmVBcmd1bWVudHMoCisgICAgY29uc3QgQ29tbWFuZExpbmVBcmd1bWVudHMgJiwgU3RyaW5nUmVmIEZpbGVuYW1lKT47CisKKy8vLyBcYnJpZWYgR2V0cyBhbiBhcmd1bWVudCBhZGp1c3RlciB0aGF0IGNvbnZlcnRzIGlucHV0IGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKy8vLyB0byB0aGUgInN5bnRheCBjaGVjayBvbmx5IiB2YXJpYW50LgorQXJndW1lbnRzQWRqdXN0ZXIgZ2V0Q2xhbmdTeW50YXhPbmx5QWRqdXN0ZXIoKTsKKworLy8vIFxicmllZiBHZXRzIGFuIGFyZ3VtZW50IGFkanVzdGVyIHdoaWNoIHJlbW92ZXMgb3V0cHV0LXJlbGF0ZWQgY29tbWFuZCBsaW5lCisvLy8gYXJndW1lbnRzLgorQXJndW1lbnRzQWRqdXN0ZXIgZ2V0Q2xhbmdTdHJpcE91dHB1dEFkanVzdGVyKCk7CisKKy8vLyBcYnJpZWYgR2V0cyBhbiBhcmd1bWVudCBhZGp1c3RlciB3aGljaCByZW1vdmVzIGRlcGVuZGVuY3ktZmlsZQorLy8vIHJlbGF0ZWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KK0FyZ3VtZW50c0FkanVzdGVyIGdldENsYW5nU3RyaXBEZXBlbmRlbmN5RmlsZUFkanVzdGVyKCk7CisKK2VudW0gY2xhc3MgQXJndW1lbnRJbnNlcnRQb3NpdGlvbiB7IEJFR0lOLCBFTkQgfTsKKworLy8vIFxicmllZiBHZXRzIGFuIGFyZ3VtZW50IGFkanVzdGVyIHdoaWNoIGluc2VydHMgXHAgRXh0cmEgYXJndW1lbnRzIGluIHRoZQorLy8vIHNwZWNpZmllZCBwb3NpdGlvbi4KK0FyZ3VtZW50c0FkanVzdGVyIGdldEluc2VydEFyZ3VtZW50QWRqdXN0ZXIoY29uc3QgQ29tbWFuZExpbmVBcmd1bWVudHMgJkV4dHJhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmd1bWVudEluc2VydFBvc2l0aW9uIFBvcyk7CisKKy8vLyBcYnJpZWYgR2V0cyBhbiBhcmd1bWVudCBhZGp1c3RlciB3aGljaCBpbnNlcnRzIGFuIFxwIEV4dHJhIGFyZ3VtZW50IGluIHRoZQorLy8vIHNwZWNpZmllZCBwb3NpdGlvbi4KK0FyZ3VtZW50c0FkanVzdGVyIGdldEluc2VydEFyZ3VtZW50QWRqdXN0ZXIoCisgICAgY29uc3QgY2hhciAqRXh0cmEsCisgICAgQXJndW1lbnRJbnNlcnRQb3NpdGlvbiBQb3MgPSBBcmd1bWVudEluc2VydFBvc2l0aW9uOjpFTkQpOworCisvLy8gXGJyaWVmIEdldHMgYW4gYXJndW1lbnQgYWRqdXN0ZXIgd2hpY2ggYWRqdXN0cyB0aGUgYXJndW1lbnRzIGluIHNlcXVlbmNlCisvLy8gd2l0aCB0aGUgXHAgRmlyc3QgYWRqdXN0ZXIgYW5kIHRoZW4gd2l0aCB0aGUgXHAgU2Vjb25kIG9uZS4KK0FyZ3VtZW50c0FkanVzdGVyIGNvbWJpbmVBZGp1c3RlcnMoQXJndW1lbnRzQWRqdXN0ZXIgRmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50c0FkanVzdGVyIFNlY29uZCk7CisKK30gLy8gbmFtZXNwYWNlIHRvb2xpbmcKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1RPT0xJTkdfQVJHVU1FTlRTQURKVVNURVJTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvQ29tbW9uT3B0aW9uc1BhcnNlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9Db21tb25PcHRpb25zUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlODE2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvQ29tbW9uT3B0aW9uc1BhcnNlci5oCkBAIC0wLDAgKzEsMTU3IEBACisvLz09PS0gQ29tbW9uT3B0aW9uc1BhcnNlci5oIC0gY29tbW9uIG9wdGlvbnMgZm9yIGNsYW5nIHRvb2xzIC0qLSBDKysgLSotPT09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQ29tbW9uT3B0aW9uc1BhcnNlciBjbGFzcyB1c2VkIHRvIHBhcnNlIGNvbW1vbgorLy8gIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciBjbGFuZyB0b29scywgc28gdGhhdCB0aGV5IGNhbiBiZSBydW4gYXMgc2VwYXJhdGUKKy8vICBjb21tYW5kLWxpbmUgYXBwbGljYXRpb25zIHdpdGggYSBjb25zaXN0ZW50IGNvbW1vbiBpbnRlcmZhY2UgZm9yIGhhbmRsaW5nCisvLyAgY29tcGlsYXRpb24gZGF0YWJhc2UgYW5kIGlucHV0IGZpbGVzLgorLy8KKy8vICBJdCBwcm92aWRlcyBhIGNvbW1vbiBzdWJzZXQgb2YgY29tbWFuZC1saW5lIG9wdGlvbnMsIGNvbW1vbiBhbGdvcml0aG0KKy8vICBmb3IgbG9jYXRpbmcgYSBjb21waWxhdGlvbiBkYXRhYmFzZSBhbmQgc291cmNlIGZpbGVzLCBhbmQgaGVscCBtZXNzYWdlcworLy8gIGZvciB0aGUgYmFzaWMgY29tbWFuZC1saW5lIGludGVyZmFjZS4KKy8vCisvLyAgSXQgY3JlYXRlcyBhIENvbXBpbGF0aW9uRGF0YWJhc2UgYW5kIHJlYWRzIGNvbW1vbiBjb21tYW5kLWxpbmUgb3B0aW9ucy4KKy8vCisvLyAgVGhpcyBjbGFzcyB1c2VzIHRoZSBDbGFuZyBUb29saW5nIGluZnJhc3RydWN0dXJlLCBzZWUKKy8vICAgIGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb2NzL0hvd1RvU2V0dXBUb29saW5nRm9yTExWTS5odG1sCisvLyAgZm9yIGRldGFpbHMgb24gc2V0dGluZyBpdCB1cCB3aXRoIExMVk0gc291cmNlIHRyZWUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfQ09NTU9OT1BUSU9OU1BBUlNFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19DT01NT05PUFRJT05TUEFSU0VSX0gKKworI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvQXJndW1lbnRzQWRqdXN0ZXJzLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9Db21waWxhdGlvbkRhdGFiYXNlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgdG9vbGluZyB7CisvLy8gXGJyaWVmIEEgcGFyc2VyIGZvciBvcHRpb25zIGNvbW1vbiB0byBhbGwgY29tbWFuZC1saW5lIENsYW5nIHRvb2xzLgorLy8vCisvLy8gUGFyc2VzIGEgY29tbW9uIHN1YnNldCBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzLCBsb2NhdGVzIGFuZCBsb2FkcyBhCisvLy8gY29tcGlsYXRpb24gY29tbWFuZHMgZGF0YWJhc2UgYW5kIHJ1bnMgYSB0b29sIHdpdGggdXNlci1zcGVjaWZpZWQgYWN0aW9uLiBJdAorLy8vIGFsc28gY29udGFpbnMgYSBoZWxwIG1lc3NhZ2UgZm9yIHRoZSBjb21tb24gY29tbWFuZC1saW5lIG9wdGlvbnMuCisvLy8KKy8vLyBBbiBleGFtcGxlIG9mIHVzYWdlOgorLy8vIFxjb2RlCisvLy8gI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9ucy5oIgorLy8vICNpbmNsdWRlICJjbGFuZy9Ub29saW5nL0NvbW1vbk9wdGlvbnNQYXJzZXIuaCIKKy8vLyAjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9Ub29saW5nLmgiCisvLy8gI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorLy8vCisvLy8gdXNpbmcgbmFtZXNwYWNlIGNsYW5nOjp0b29saW5nOworLy8vIHVzaW5nIG5hbWVzcGFjZSBsbHZtOworLy8vCisvLy8gc3RhdGljIGNsOjpPcHRpb25DYXRlZ29yeSBNeVRvb2xDYXRlZ29yeSgiTXkgdG9vbCBvcHRpb25zIik7CisvLy8gc3RhdGljIGNsOjpleHRyYWhlbHAgQ29tbW9uSGVscChDb21tb25PcHRpb25zUGFyc2VyOjpIZWxwTWVzc2FnZSk7CisvLy8gc3RhdGljIGNsOjpleHRyYWhlbHAgTW9yZUhlbHAoIlxuTW9yZSBoZWxwIHRleHQuLi4iKTsKKy8vLyBzdGF0aWMgY2w6Om9wdDxib29sPiBZb3VyT3duT3B0aW9uKC4uLik7CisvLy8gLi4uCisvLy8KKy8vLyBpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpIHsKKy8vLyAgIENvbW1vbk9wdGlvbnNQYXJzZXIgT3B0aW9uc1BhcnNlcihhcmdjLCBhcmd2LCBNeVRvb2xDYXRlZ29yeSk7CisvLy8gICBDbGFuZ1Rvb2wgVG9vbChPcHRpb25zUGFyc2VyLmdldENvbXBpbGF0aW9ucygpLAorLy8vICAgICAgICAgICAgICAgICAgT3B0aW9uc1BhcnNlci5nZXRTb3VyY2VQYXRoTGlzdCgpKTsKKy8vLyAgIHJldHVybiBUb29sLnJ1bihuZXdGcm9udGVuZEFjdGlvbkZhY3Rvcnk8U3ludGF4T25seUFjdGlvbj4oKS5nZXQoKSk7CisvLy8gfQorLy8vIFxlbmRjb2RlCitjbGFzcyBDb21tb25PcHRpb25zUGFyc2VyIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBQYXJzZXMgY29tbWFuZC1saW5lLCBpbml0aWFsaXplcyBhIGNvbXBpbGF0aW9uIGRhdGFiYXNlLgorICAvLy8KKyAgLy8vIFRoaXMgY29uc3RydWN0b3IgY2FuIGNoYW5nZSBhcmdjIGFuZCBhcmd2IGNvbnRlbnRzLCBlLmcuIGNvbnN1bWUKKyAgLy8vIGNvbW1hbmQtbGluZSBvcHRpb25zIHVzZWQgZm9yIGNyZWF0aW5nIEZpeGVkQ29tcGlsYXRpb25EYXRhYmFzZS4KKyAgLy8vCisgIC8vLyBBbGwgb3B0aW9ucyBub3QgYmVsb25naW5nIHRvIFxwIENhdGVnb3J5IGJlY29tZSBoaWRkZW4uCisgIC8vLworICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBleGl0cyBwcm9ncmFtIGluIGNhc2Ugb2YgZXJyb3IuCisgIENvbW1vbk9wdGlvbnNQYXJzZXIoaW50ICZhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpjbDo6T3B0aW9uQ2F0ZWdvcnkgJkNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk92ZXJ2aWV3ID0gbnVsbHB0cikKKyAgICAgIDogQ29tbW9uT3B0aW9uc1BhcnNlcihhcmdjLCBhcmd2LCBDYXRlZ29yeSwgbGx2bTo6Y2w6Ok9uZU9yTW9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVydmlldykge30KKworICAvLy8gXGJyaWVmIFBhcnNlcyBjb21tYW5kLWxpbmUsIGluaXRpYWxpemVzIGEgY29tcGlsYXRpb24gZGF0YWJhc2UuCisgIC8vLworICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBjYW4gY2hhbmdlIGFyZ2MgYW5kIGFyZ3YgY29udGVudHMsIGUuZy4gY29uc3VtZQorICAvLy8gY29tbWFuZC1saW5lIG9wdGlvbnMgdXNlZCBmb3IgY3JlYXRpbmcgRml4ZWRDb21waWxhdGlvbkRhdGFiYXNlLgorICAvLy8KKyAgLy8vIEFsbCBvcHRpb25zIG5vdCBiZWxvbmdpbmcgdG8gXHAgQ2F0ZWdvcnkgYmVjb21lIGhpZGRlbi4KKyAgLy8vCisgIC8vLyBJdCBhbHNvIGFsbG93cyBjYWxscyB0byBzZXQgdGhlIHJlcXVpcmVkIG51bWJlciBvZiBwb3NpdGlvbmFsIHBhcmFtZXRlcnMuCisgIENvbW1vbk9wdGlvbnNQYXJzZXIoaW50ICZhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpjbDo6T3B0aW9uQ2F0ZWdvcnkgJkNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmNsOjpOdW1PY2N1cnJlbmNlc0ZsYWcgT2NjdXJyZW5jZXNGbGFnLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk92ZXJ2aWV3ID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBBIGZhY3RvcnkgbWV0aG9kIHRoYXQgaXMgc2ltaWxhciB0byB0aGUgYWJvdmUgY29uc3RydWN0b3IsIGV4Y2VwdAorICAvLy8gdGhpcyByZXR1cm5zIGFuIGVycm9yIGluc3RlYWQgZXhpdGluZyB0aGUgcHJvZ3JhbSBvbiBlcnJvci4KKyAgc3RhdGljIGxsdm06OkV4cGVjdGVkPENvbW1vbk9wdGlvbnNQYXJzZXI+CisgIGNyZWF0ZShpbnQgJmFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBsbHZtOjpjbDo6T3B0aW9uQ2F0ZWdvcnkgJkNhdGVnb3J5LAorICAgICAgICAgbGx2bTo6Y2w6Ok51bU9jY3VycmVuY2VzRmxhZyBPY2N1cnJlbmNlc0ZsYWcsCisgICAgICAgICBjb25zdCBjaGFyICpPdmVydmlldyA9IG51bGxwdHIpOworCisgIC8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsb2FkZWQgY29tcGlsYXRpb25zIGRhdGFiYXNlLgorICBDb21waWxhdGlvbkRhdGFiYXNlICZnZXRDb21waWxhdGlvbnMoKSB7CisgICAgcmV0dXJuICpDb21waWxhdGlvbnM7CisgIH0KKworICAvLy8gUmV0dXJucyBhIGxpc3Qgb2Ygc291cmNlIGZpbGUgcGF0aHMgdG8gcHJvY2Vzcy4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZnZXRTb3VyY2VQYXRoTGlzdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU291cmNlUGF0aExpc3Q7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgYXJndW1lbnQgYWRqdXN0ZXIgY2FsY3VsYXRlZCBmcm9tICItLWV4dHJhLWFyZyIgYW5kCisgIC8vIi0tZXh0cmEtYXJnLWJlZm9yZSIgb3B0aW9ucy4KKyAgQXJndW1lbnRzQWRqdXN0ZXIgZ2V0QXJndW1lbnRzQWRqdXN0ZXIoKSB7IHJldHVybiBBZGp1c3RlcjsgfQorCisgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBIZWxwTWVzc2FnZTsKKworcHJpdmF0ZToKKyAgQ29tbW9uT3B0aW9uc1BhcnNlcigpID0gZGVmYXVsdDsKKworICBsbHZtOjpFcnJvciBpbml0KGludCAmYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsCisgICAgICAgICAgICAgICAgICAgbGx2bTo6Y2w6Ok9wdGlvbkNhdGVnb3J5ICZDYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICBsbHZtOjpjbDo6TnVtT2NjdXJyZW5jZXNGbGFnIE9jY3VycmVuY2VzRmxhZywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpPdmVydmlldyk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENvbXBpbGF0aW9uRGF0YWJhc2U+IENvbXBpbGF0aW9uczsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFNvdXJjZVBhdGhMaXN0OworICBBcmd1bWVudHNBZGp1c3RlciBBZGp1c3RlcjsKK307CisKK2NsYXNzIEFyZ3VtZW50c0FkanVzdGluZ0NvbXBpbGF0aW9ucyA6IHB1YmxpYyBDb21waWxhdGlvbkRhdGFiYXNlIHsKK3B1YmxpYzoKKyAgQXJndW1lbnRzQWRqdXN0aW5nQ29tcGlsYXRpb25zKAorICAgICAgc3RkOjp1bmlxdWVfcHRyPENvbXBpbGF0aW9uRGF0YWJhc2U+IENvbXBpbGF0aW9ucykKKyAgICAgIDogQ29tcGlsYXRpb25zKHN0ZDo6bW92ZShDb21waWxhdGlvbnMpKSB7fQorCisgIHZvaWQgYXBwZW5kQXJndW1lbnRzQWRqdXN0ZXIoQXJndW1lbnRzQWRqdXN0ZXIgQWRqdXN0ZXIpOworCisgIHN0ZDo6dmVjdG9yPENvbXBpbGVDb21tYW5kPgorICBnZXRDb21waWxlQ29tbWFuZHMoU3RyaW5nUmVmIEZpbGVQYXRoKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0QWxsRmlsZXMoKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnZlY3RvcjxDb21waWxlQ29tbWFuZD4gZ2V0QWxsQ29tcGlsZUNvbW1hbmRzKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxDb21waWxhdGlvbkRhdGFiYXNlPiBDb21waWxhdGlvbnM7CisgIHN0ZDo6dmVjdG9yPEFyZ3VtZW50c0FkanVzdGVyPiBBZGp1c3RlcnM7CisKKyAgc3RkOjp2ZWN0b3I8Q29tcGlsZUNvbW1hbmQ+CisgIGFkanVzdENvbW1hbmRzKHN0ZDo6dmVjdG9yPENvbXBpbGVDb21tYW5kPiBDb21tYW5kcykgY29uc3Q7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdG9vbGluZworfSAgLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAgLy8gTExWTV9UT09MU19DTEFOR19JTkNMVURFX0NMQU5HX1RPT0xJTkdfQ09NTU9OT1BUSU9OU1BBUlNFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0NvbXBpbGF0aW9uRGF0YWJhc2UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvQ29tcGlsYXRpb25EYXRhYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZTExMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0NvbXBpbGF0aW9uRGF0YWJhc2UuaApAQCAtMCwwICsxLDIxOSBAQAorLy89PT0tIENvbXBpbGF0aW9uRGF0YWJhc2UuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIHByb3ZpZGVzIGFuIGludGVyZmFjZSBhbmQgbXVsdGlwbGUgaW1wbGVtZW50YXRpb25zIGZvcgorLy8gIENvbXBpbGF0aW9uRGF0YWJhc2VzLgorLy8KKy8vICBXaGlsZSBDKysgcmVmYWN0b3JpbmcgYW5kIGFuYWx5c2lzIHRvb2xzIGFyZSBub3QgY29tcGlsZXJzLCBhbmQgdGh1cworLy8gIGRvbid0IHJ1biBhcyBwYXJ0IG9mIHRoZSBidWlsZCBzeXN0ZW0sIHRoZXkgbmVlZCB0aGUgZXhhY3QgaW5mb3JtYXRpb24KKy8vICBvZiBhIGJ1aWxkIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gY29ycmVjdGx5IHVuZGVyc3RhbmQgdGhlIEMrKyBjb2RlIG9mCisvLyAgdGhlIHByb2plY3QuIFRoaXMgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgdmlhIHRoZSBDb21waWxhdGlvbkRhdGFiYXNlCisvLyAgaW50ZXJmYWNlLgorLy8KKy8vICBUbyBjcmVhdGUgYSBDb21waWxhdGlvbkRhdGFiYXNlIGZyb20gYSBidWlsZCBkaXJlY3Rvcnkgb25lIGNhbiBjYWxsCisvLyAgQ29tcGlsYXRpb25EYXRhYmFzZTo6bG9hZEZyb21EaXJlY3RvcnkoKSwgd2hpY2ggZGVkdWNlcyB0aGUgY29ycmVjdAorLy8gIGNvbXBpbGF0aW9uIGRhdGFiYXNlIGZyb20gdGhlIHJvb3Qgb2YgdGhlIGJ1aWxkIHRyZWUuCisvLworLy8gIFNlZSB0aGUgY29uY3JldGUgc3ViY2xhc3NlcyBvZiBDb21waWxhdGlvbkRhdGFiYXNlIGZvciBjdXJyZW50bHkgc3VwcG9ydGVkCisvLyAgZm9ybWF0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfVE9PTElOR19DT01QSUxBVElPTkRBVEFCQVNFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19UT09MSU5HX0NPTVBJTEFUSU9OREFUQUJBU0VfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIHRvb2xpbmcgeworCisvLy8gXGJyaWVmIFNwZWNpZmllcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGNvbW1hbmQgb2YgYSBjb21waWxhdGlvbi4KK3N0cnVjdCBDb21waWxlQ29tbWFuZCB7CisgIENvbXBpbGVDb21tYW5kKCkgPSBkZWZhdWx0OworICBDb21waWxlQ29tbWFuZChUd2luZSBEaXJlY3RvcnksIFR3aW5lIEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ29tbWFuZExpbmUsIFR3aW5lIE91dHB1dCkKKyAgICAgIDogRGlyZWN0b3J5KERpcmVjdG9yeS5zdHIoKSksIEZpbGVuYW1lKEZpbGVuYW1lLnN0cigpKSwKKyAgICAgICAgQ29tbWFuZExpbmUoc3RkOjptb3ZlKENvbW1hbmRMaW5lKSksIE91dHB1dChPdXRwdXQuc3RyKCkpe30KKworICAvLy8gXGJyaWVmIFRoZSB3b3JraW5nIGRpcmVjdG9yeSB0aGUgY29tbWFuZCB3YXMgZXhlY3V0ZWQgZnJvbS4KKyAgc3RkOjpzdHJpbmcgRGlyZWN0b3J5OworCisgIC8vLyBUaGUgc291cmNlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21tYW5kLgorICBzdGQ6OnN0cmluZyBGaWxlbmFtZTsKKworICAvLy8gXGJyaWVmIFRoZSBjb21tYW5kIGxpbmUgdGhhdCB3YXMgZXhlY3V0ZWQuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBDb21tYW5kTGluZTsKKworICAvLy8gVGhlIG91dHB1dCBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWFuZC4KKyAgc3RkOjpzdHJpbmcgT3V0cHV0OworfTsKKworLy8vIFxicmllZiBJbnRlcmZhY2UgZm9yIGNvbXBpbGF0aW9uIGRhdGFiYXNlcy4KKy8vLworLy8vIEEgY29tcGlsYXRpb24gZGF0YWJhc2UgYWxsb3dzIHRoZSB1c2VyIHRvIHJldHJpZXZlIGNvbXBpbGUgY29tbWFuZCBsaW5lcworLy8vIGZvciB0aGUgZmlsZXMgaW4gYSBwcm9qZWN0LgorLy8vCisvLy8gTWFueSBpbXBsZW1lbnRhdGlvbnMgYXJlIGVudW1lcmFibGUsIGFsbG93aW5nIGFsbCBjb21tYW5kIGxpbmVzIHRvIGJlCisvLy8gcmV0cmlldmVkLiBUaGVzZSBjYW4gYmUgdXNlZCB0byBydW4gY2xhbmcgdG9vbHMgb3ZlciBhIHN1YnNldCBvZiB0aGUgZmlsZXMKKy8vLyBpbiBhIHByb2plY3QuCitjbGFzcyBDb21waWxhdGlvbkRhdGFiYXNlIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+Q29tcGlsYXRpb25EYXRhYmFzZSgpOworCisgIC8vLyBcYnJpZWYgTG9hZHMgYSBjb21waWxhdGlvbiBkYXRhYmFzZSBmcm9tIGEgYnVpbGQgZGlyZWN0b3J5LgorICAvLy8KKyAgLy8vIExvb2tzIGF0IHRoZSBzcGVjaWZpZWQgJ0J1aWxkRGlyZWN0b3J5JyBhbmQgY3JlYXRlcyBhIGNvbXBpbGF0aW9uIGRhdGFiYXNlCisgIC8vLyB0aGF0IGFsbG93cyB0byBxdWVyeSBjb21waWxlIGNvbW1hbmRzIGZvciBzb3VyY2UgZmlsZXMgaW4gdGhlCisgIC8vLyBjb3JyZXNwb25kaW5nIHNvdXJjZSB0cmVlLgorICAvLy8KKyAgLy8vIFJldHVybnMgTlVMTCBhbmQgc2V0cyBFcnJvck1lc3NhZ2UgaWYgd2Ugd2VyZSBub3QgYWJsZSB0byBidWlsZCB1cCBhCisgIC8vLyBjb21waWxhdGlvbiBkYXRhYmFzZSBmb3IgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KKyAgLy8vCisgIC8vLyBGSVhNRTogQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgSlNPTiBjb21waWxhdGlvbiBkYXRhYmFzZXMsIHdoaWNoCisgIC8vLyBhcmUgbmFtZWQgJ2NvbXBpbGVfY29tbWFuZHMuanNvbicgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeS4gRXh0ZW5kIHRoaXMKKyAgLy8vIGZvciBvdGhlciBidWlsZCB0eXBlcyAobGlrZSBuaW5qYSBidWlsZCBmaWxlcykuCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q29tcGlsYXRpb25EYXRhYmFzZT4KKyAgbG9hZEZyb21EaXJlY3RvcnkoU3RyaW5nUmVmIEJ1aWxkRGlyZWN0b3J5LCBzdGQ6OnN0cmluZyAmRXJyb3JNZXNzYWdlKTsKKworICAvLy8gXGJyaWVmIFRyaWVzIHRvIGRldGVjdCBhIGNvbXBpbGF0aW9uIGRhdGFiYXNlIGxvY2F0aW9uIGFuZCBsb2FkIGl0LgorICAvLy8KKyAgLy8vIExvb2tzIGZvciBhIGNvbXBpbGF0aW9uIGRhdGFiYXNlIGluIGFsbCBwYXJlbnQgcGF0aHMgb2YgZmlsZSAnU291cmNlRmlsZScKKyAgLy8vIGJ5IGNhbGxpbmcgbG9hZEZyb21EaXJlY3RvcnkuCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q29tcGlsYXRpb25EYXRhYmFzZT4KKyAgYXV0b0RldGVjdEZyb21Tb3VyY2UoU3RyaW5nUmVmIFNvdXJjZUZpbGUsIHN0ZDo6c3RyaW5nICZFcnJvck1lc3NhZ2UpOworCisgIC8vLyBcYnJpZWYgVHJpZXMgdG8gZGV0ZWN0IGEgY29tcGlsYXRpb24gZGF0YWJhc2UgbG9jYXRpb24gYW5kIGxvYWQgaXQuCisgIC8vLworICAvLy8gTG9va3MgZm9yIGEgY29tcGlsYXRpb24gZGF0YWJhc2UgaW4gZGlyZWN0b3J5ICdTb3VyY2VEaXInIGFuZCBhbGwKKyAgLy8vIGl0cyBwYXJlbnQgcGF0aHMgYnkgY2FsbGluZyBsb2FkRnJvbURpcmVjdG9yeS4KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDb21waWxhdGlvbkRhdGFiYXNlPgorICBhdXRvRGV0ZWN0RnJvbURpcmVjdG9yeShTdHJpbmdSZWYgU291cmNlRGlyLCBzdGQ6OnN0cmluZyAmRXJyb3JNZXNzYWdlKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgYWxsIGNvbXBpbGUgY29tbWFuZHMgaW4gd2hpY2ggdGhlIHNwZWNpZmllZCBmaWxlIHdhcworICAvLy8gY29tcGlsZWQuCisgIC8vLworICAvLy8gVGhpcyBpbmNsdWRlcyBjb21waWxlIGNvbW1hbmRzIHRoYXQgc3BhbiBtdWx0aXBsZSBzb3VyY2UgZmlsZXMuCisgIC8vLyBGb3IgZXhhbXBsZSwgY29uc2lkZXIgYSBwcm9qZWN0IHdpdGggdGhlIGZvbGxvd2luZyBjb21waWxhdGlvbnM6CisgIC8vLyAkIGNsYW5nKysgLW8gdGVzdCBhLmNjIGIuY2MgdC5jYworICAvLy8gJCBjbGFuZysrIC1vIHByb2R1Y3Rpb24gYS5jYyBiLmNjIC1EUFJPRFVDVElPTgorICAvLy8gQSBjb21waWxhdGlvbiBkYXRhYmFzZSByZXByZXNlbnRpbmcgdGhlIHByb2plY3Qgd291bGQgcmV0dXJuIGJvdGggY29tbWFuZAorICAvLy8gbGluZXMgZm9yIGEuY2MgYW5kIGIuY2MgYW5kIG9ubHkgdGhlIGZpcnN0IGNvbW1hbmQgbGluZSBmb3IgdC5jYy4KKyAgdmlydHVhbCBzdGQ6OnZlY3RvcjxDb21waWxlQ29tbWFuZD4gZ2V0Q29tcGlsZUNvbW1hbmRzKAorICAgICAgU3RyaW5nUmVmIEZpbGVQYXRoKSBjb25zdCA9IDA7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBmaWxlcyBhdmFpbGFibGUgaW4gdGhlIGNvbXBpbGF0aW9uIGRhdGFiYXNlLgorICAvLy8KKyAgLy8vIEJ5IGRlZmF1bHQsIHJldHVybnMgbm90aGluZy4gSW1wbGVtZW50YXRpb25zIHNob3VsZCBvdmVycmlkZSB0aGlzIGlmIHRoZXkKKyAgLy8vIGNhbiBlbnVtZXJhdGUgdGhlaXIgc291cmNlIGZpbGVzLgorICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBnZXRBbGxGaWxlcygpIGNvbnN0IHsgcmV0dXJuIHt9OyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGFsbCBjb21waWxlIGNvbW1hbmRzIGZvciBhbGwgdGhlIGZpbGVzIGluIHRoZSBjb21waWxhdGlvbgorICAvLy8gZGF0YWJhc2UuCisgIC8vLworICAvLy8gRklYTUU6IEFkZCBhIGxheWVyIGluIFRvb2xpbmcgdGhhdCBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gcnVuIGEgdG9vbAorICAvLy8gb3ZlciBhbGwgZmlsZXMgaW4gYSBjb21waWxhdGlvbiBkYXRhYmFzZS4gTm90IGFsbCBidWlsZCBzeXN0ZW1zIGhhdmUgdGhlCisgIC8vLyBhYmlsaXR5IHRvIHByb3ZpZGUgYSBmZWFzaWJsZSBpbXBsZW1lbnRhdGlvbiBmb3IgXGMgZ2V0QWxsQ29tcGlsZUNvbW1hbmRzLgorICAvLy8KKyAgLy8vIEJ5IGRlZmF1bHQsIHRoaXMgaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgZ2V0QWxsRmlsZXMoKSBhbmQKKyAgLy8vIGdldENvbXBpbGVDb21tYW5kcygpLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIGZvciBlZmZpY2llbmN5LgorICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPENvbXBpbGVDb21tYW5kPiBnZXRBbGxDb21waWxlQ29tbWFuZHMoKSBjb25zdDsKK307CisKKy8vLyBcYnJpZWYgSW50ZXJmYWNlIGZvciBjb21waWxhdGlvbiBkYXRhYmFzZSBwbHVnaW5zLgorLy8vCisvLy8gQSBjb21waWxhdGlvbiBkYXRhYmFzZSBwbHVnaW4gYWxsb3dzIHRoZSB1c2VyIHRvIHJlZ2lzdGVyIGN1c3RvbSBjb21waWxhdGlvbgorLy8vIGRhdGFiYXNlcyB0aGF0IGFyZSBwaWNrZWQgdXAgYXMgY29tcGlsYXRpb24gZGF0YWJhc2UgaWYgdGhlIGNvcnJlc3BvbmRpbmcKKy8vLyBsaWJyYXJ5IGlzIGxpbmtlZCBpbi4gVG8gcmVnaXN0ZXIgYSBwbHVnaW4sIGRlY2xhcmUgYSBzdGF0aWMgdmFyaWFibGUgbGlrZToKKy8vLworLy8vIFxjb2RlCisvLy8gc3RhdGljIENvbXBpbGF0aW9uRGF0YWJhc2VQbHVnaW5SZWdpc3RyeTo6QWRkPE15RGF0YWJhc2VQbHVnaW4+CisvLy8gWCgibXktY29tcGlsYXRpb24tZGF0YWJhc2UiLCAiUmVhZHMgbXkgb3duIGNvbXBpbGF0aW9uIGRhdGFiYXNlIik7CisvLy8gXGVuZGNvZGUKK2NsYXNzIENvbXBpbGF0aW9uRGF0YWJhc2VQbHVnaW4geworcHVibGljOgorICB2aXJ0dWFsIH5Db21waWxhdGlvbkRhdGFiYXNlUGx1Z2luKCk7CisKKyAgLy8vIFxicmllZiBMb2FkcyBhIGNvbXBpbGF0aW9uIGRhdGFiYXNlIGZyb20gYSBidWlsZCBkaXJlY3RvcnkuCisgIC8vLworICAvLy8gXHNlZSBDb21waWxhdGlvbkRhdGFiYXNlOjpsb2FkRnJvbURpcmVjdG9yeSgpLgorICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxDb21waWxhdGlvbkRhdGFiYXNlPgorICBsb2FkRnJvbURpcmVjdG9yeShTdHJpbmdSZWYgRGlyZWN0b3J5LCBzdGQ6OnN0cmluZyAmRXJyb3JNZXNzYWdlKSA9IDA7Cit9OworCisvLy8gXGJyaWVmIEEgY29tcGlsYXRpb24gZGF0YWJhc2UgdGhhdCByZXR1cm5zIGEgc2luZ2xlIGNvbXBpbGUgY29tbWFuZCBsaW5lLgorLy8vCisvLy8gVXNlZnVsIHdoZW4gd2Ugd2FudCBhIHRvb2wgdG8gYmVoYXZlIG1vcmUgbGlrZSBhIGNvbXBpbGVyIGludm9jYXRpb24uCisvLy8gVGhpcyBjb21waWxhdGlvbiBkYXRhYmFzZSBpcyBub3QgZW51bWVyYWJsZTogZ2V0QWxsRmlsZXMoKSByZXR1cm5zIHt9LgorY2xhc3MgRml4ZWRDb21waWxhdGlvbkRhdGFiYXNlIDogcHVibGljIENvbXBpbGF0aW9uRGF0YWJhc2UgeworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgYSBGaXhlZENvbXBpbGF0aW9uRGF0YWJhc2UgZnJvbSB0aGUgYXJndW1lbnRzIGFmdGVyICItLSIuCisgIC8vLworICAvLy8gUGFyc2VzIHRoZSBnaXZlbiBjb21tYW5kIGxpbmUgZm9yICItLSIuIElmICItLSIgaXMgZm91bmQsIHRoZSByZXN0IG9mCisgIC8vLyB0aGUgYXJndW1lbnRzIHdpbGwgbWFrZSB1cCB0aGUgY29tbWFuZCBsaW5lIGluIHRoZSByZXR1cm5lZAorICAvLy8gRml4ZWRDb21waWxhdGlvbkRhdGFiYXNlLgorICAvLy8gVGhlIGFyZ3VtZW50cyBhZnRlciAiLS0iIG11c3Qgbm90IGluY2x1ZGUgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIG9yIHRoZQorICAvLy8gYXJndlswXSBvZiB0aGUgdG9vbC4gVGhvc2Ugd2lsbCBiZSBhZGRlZCBieSB0aGUgRml4ZWRDb21waWxhdGlvbkRhdGFiYXNlCisgIC8vLyB3aGVuIGEgQ29tcGlsZUNvbW1hbmQgaXMgcmVxdWVzdGVkLiBUaGUgYXJndlswXSBvZiB0aGUgcmV0dXJuZWQgY29tbWFuZAorICAvLy8gbGluZSB3aWxsIGJlICJjbGFuZy10b29sIi4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIE5VTEwgaW4gY2FzZSAiLS0iIGlzIG5vdCBmb3VuZC4KKyAgLy8vCisgIC8vLyBUaGUgYXJndW1lbnQgbGlzdCBpcyBtZWFudCB0byBiZSBjb21wYXRpYmxlIHdpdGggbm9ybWFsIGxsdm0gY29tbWFuZCBsaW5lCisgIC8vLyBwYXJzaW5nIGluIG1haW4gbWV0aG9kcy4KKyAgLy8vIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAvLy8gICBzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDb21waWxhdGlvbkRhdGFiYXNlPiBDb21waWxhdGlvbnMoCisgIC8vLyAgICAgRml4ZWRDb21waWxhdGlvbkRhdGFiYXNlOjpsb2FkRnJvbUNvbW1hbmRMaW5lKGFyZ2MsIGFyZ3YpKTsKKyAgLy8vICAgY2w6OlBhcnNlQ29tbWFuZExpbmVPcHRpb25zKGFyZ2MsIGFyZ3YpOworICAvLy8gICAuLi4KKyAgLy8vIH0KKyAgLy8vCisgIC8vLyBccGFyYW0gQXJnYyBUaGUgbnVtYmVyIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgLSB3aWxsIGJlIGNoYW5nZWQgdG8KKyAgLy8vIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGJlZm9yZSAiLS0iLCBpZiAiLS0iIHdhcyBmb3VuZCBpbiB0aGUgYXJndW1lbnQKKyAgLy8vIGxpc3QuCisgIC8vLyBccGFyYW0gQXJndiBQb2ludHMgdG8gdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgIC8vLyBccGFyYW0gRXJyb3JNc2cgQ29udGFpbnMgZXJyb3IgdGV4dCBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBudWxsIHBvaW50ZXIuCisgIC8vLyBccGFyYW0gRGlyZWN0b3J5IFRoZSBiYXNlIGRpcmVjdG9yeSB1c2VkIGluIHRoZSBGaXhlZENvbXBpbGF0aW9uRGF0YWJhc2UuCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDb21waWxhdGlvbkRhdGFiYXNlPiBsb2FkRnJvbUNvbW1hbmRMaW5lKAorICAgICAgaW50ICZBcmdjLCBjb25zdCBjaGFyICpjb25zdCAqQXJndiwgc3RkOjpzdHJpbmcgJkVycm9yTXNnLAorICAgICAgVHdpbmUgRGlyZWN0b3J5ID0gIi4iKTsKKworICAvLy8gUmVhZHMgZmxhZ3MgZnJvbSB0aGUgZ2l2ZW4gZmlsZSwgb25lLXBlciBsaW5lLgorICAvLy8gUmV0dXJucyBudWxscHRyIGFuZCBzZXRzIEVycm9yTWVzc2FnZSBpZiB3ZSBjYW4ndCByZWFkIHRoZSBmaWxlLgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ29tcGlsYXRpb25EYXRhYmFzZT4KKyAgbG9hZEZyb21GaWxlKFN0cmluZ1JlZiBQYXRoLCBzdGQ6OnN0cmluZyAmRXJyb3JNc2cpOworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0cyBhIGNvbXBpbGF0aW9uIGRhdGEgYmFzZSBmcm9tIGEgc3BlY2lmaWVkIGRpcmVjdG9yeQorICAvLy8gYW5kIGNvbW1hbmQgbGluZS4KKyAgRml4ZWRDb21waWxhdGlvbkRhdGFiYXNlKFR3aW5lIERpcmVjdG9yeSwgQXJyYXlSZWY8c3RkOjpzdHJpbmc+IENvbW1hbmRMaW5lKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGdpdmVuIGNvbXBpbGUgY29tbWFuZC4KKyAgLy8vCisgIC8vLyBXaWxsIGFsd2F5cyByZXR1cm4gYSB2ZWN0b3Igd2l0aCBvbmUgZW50cnkgdGhhdCBjb250YWlucyB0aGUgZGlyZWN0b3J5CisgIC8vLyBhbmQgY29tbWFuZCBsaW5lIHNwZWNpZmllZCBhdCBjb25zdHJ1Y3Rpb24gd2l0aCAiY2xhbmctdG9vbCIgYXMgYXJndlswXQorICAvLy8gYW5kICdGaWxlUGF0aCcgYXMgcG9zaXRpb25hbCBhcmd1bWVudC4KKyAgc3RkOjp2ZWN0b3I8Q29tcGlsZUNvbW1hbmQ+CisgIGdldENvbXBpbGVDb21tYW5kcyhTdHJpbmdSZWYgRmlsZVBhdGgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAvLy8gVGhpcyBpcyBidWlsdCB1cCB0byBjb250YWluIGEgc2luZ2xlIGVudHJ5IHZlY3RvciB0byBiZSByZXR1cm5lZCBmcm9tCisgIC8vLyBnZXRDb21waWxlQ29tbWFuZHMgYWZ0ZXIgYWRkaW5nIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50LgorICBzdGQ6OnZlY3RvcjxDb21waWxlQ29tbWFuZD4gQ29tcGlsZUNvbW1hbmRzOworfTsKKworfSAvLyBuYW1lc3BhY2UgdG9vbGluZworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfVE9PTElOR19DT01QSUxBVElPTkRBVEFCQVNFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvQ29tcGlsYXRpb25EYXRhYmFzZVBsdWdpblJlZ2lzdHJ5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0NvbXBpbGF0aW9uRGF0YWJhc2VQbHVnaW5SZWdpc3RyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MWEwOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0NvbXBpbGF0aW9uRGF0YWJhc2VQbHVnaW5SZWdpc3RyeS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vPT09LSBDb21waWxhdGlvbkRhdGFiYXNlUGx1Z2luUmVnaXN0cnkuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19UT09MSU5HX0NPTVBJTEFUSU9OREFUQUJBU0VQTFVHSU5SRUdJU1RSWV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19DT01QSUxBVElPTkRBVEFCQVNFUExVR0lOUkVHSVNUUllfSAorCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9Db21waWxhdGlvbkRhdGFiYXNlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1JlZ2lzdHJ5LmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgdG9vbGluZyB7CisKK3VzaW5nIENvbXBpbGF0aW9uRGF0YWJhc2VQbHVnaW5SZWdpc3RyeSA9CisgICAgbGx2bTo6UmVnaXN0cnk8Q29tcGlsYXRpb25EYXRhYmFzZVBsdWdpbj47CisKK30gLy8gbmFtZXNwYWNlIHRvb2xpbmcKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1RPT0xJTkdfQ09NUElMQVRJT05EQVRBQkFTRVBMVUdJTlJFR0lTVFJZX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvQ29yZS9EaWFnbm9zdGljLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0NvcmUvRGlhZ25vc3RpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MzA3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0NvcmUvRGlhZ25vc3RpYy5oCkBAIC0wLDAgKzEsMTAwIEBACisvLz09PS0tLSBEaWFnbm9zdGljLmggLSBGcmFtZXdvcmsgZm9yIGNsYW5nIGRpYWdub3N0aWNzIHRvb2xzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gXGZpbGUKKy8vICBTdHJ1Y3R1cmVzIHN1cHBvcnRpbmcgZGlhZ25vc3RpY3MgYW5kIHJlZmFjdG9yaW5ncyB0aGF0IHNwYW4gbXVsdGlwbGUKKy8vICB0cmFuc2xhdGlvbiB1bml0cy4gSW5kaWNhdGUgZGlhZ25vc3RpY3MgcmVwb3J0cyBhbmQgcmVwbGFjZW1lbnRzCisvLyAgc3VnZ2VzdGlvbnMgZm9yIHRoZSBhbmFseXplZCBzb3VyY2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19UT09MSU5HX0NPUkVfRElBR05PU1RJQ19ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19DT1JFX0RJQUdOT1NUSUNfSAorCisjaW5jbHVkZSAiUmVwbGFjZW1lbnQuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgdG9vbGluZyB7CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyB0aGUgZGlhZ25vc3RpYyBtZXNzYWdlIHdpdGggdGhlIGVycm9yIG1lc3NhZ2UgYXNzb2NpYXRlZAorLy8vIGFuZCB0aGUgaW5mb3JtYXRpb24gb24gdGhlIGxvY2F0aW9uIG9mIHRoZSBwcm9ibGVtLgorc3RydWN0IERpYWdub3N0aWNNZXNzYWdlIHsKKyAgRGlhZ25vc3RpY01lc3NhZ2UobGx2bTo6U3RyaW5nUmVmIE1lc3NhZ2UgPSAiIik7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3RzIGEgZGlhZ25vc3RpYyBtZXNzYWdlIHdpdGggYW5vZmZzZXQgdG8gdGhlIGRpYWdub3N0aWMKKyAgLy8vIHdpdGhpbiB0aGUgZmlsZSB3aGVyZSB0aGUgcHJvYmxlbSBvY2N1cnJlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gTG9jIFNob3VsZCBiZSBhIGZpbGUgbG9jYXRpb24sIGl0IGlzIG5vdCBtZWFuaW5nZnVsIGZvciBhIG1hY3JvCisgIC8vLyBsb2NhdGlvbi4KKyAgLy8vCisgIERpYWdub3N0aWNNZXNzYWdlKGxsdm06OlN0cmluZ1JlZiBNZXNzYWdlLCBjb25zdCBTb3VyY2VNYW5hZ2VyICZTb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpOworICBzdGQ6OnN0cmluZyBNZXNzYWdlOworICBzdGQ6OnN0cmluZyBGaWxlUGF0aDsKKyAgdW5zaWduZWQgRmlsZU9mZnNldDsKK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyB0aGUgZGlhZ25vc3RpYyB3aXRoIHRoZSBsZXZlbCBvZiBzZXZlcml0eSBhbmQgcG9zc2libGUKKy8vLyBmaXhlcyB0byBiZSBhcHBsaWVkLgorc3RydWN0IERpYWdub3N0aWMgeworICBlbnVtIExldmVsIHsKKyAgICBXYXJuaW5nID0gRGlhZ25vc3RpY3NFbmdpbmU6Oldhcm5pbmcsCisgICAgRXJyb3IgPSBEaWFnbm9zdGljc0VuZ2luZTo6RXJyb3IKKyAgfTsKKworICBEaWFnbm9zdGljKCkgPSBkZWZhdWx0OworCisgIERpYWdub3N0aWMobGx2bTo6U3RyaW5nUmVmIERpYWdub3N0aWNOYW1lLCBMZXZlbCBEaWFnTGV2ZWwsCisgICAgICAgICAgICAgU3RyaW5nUmVmIEJ1aWxkRGlyZWN0b3J5KTsKKworICBEaWFnbm9zdGljKGxsdm06OlN0cmluZ1JlZiBEaWFnbm9zdGljTmFtZSwgY29uc3QgRGlhZ25vc3RpY01lc3NhZ2UgJk1lc3NhZ2UsCisgICAgICAgICAgICAgY29uc3QgbGx2bTo6U3RyaW5nTWFwPFJlcGxhY2VtZW50cz4gJkZpeCwKKyAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvcjxEaWFnbm9zdGljTWVzc2FnZSwgMT4gJk5vdGVzLCBMZXZlbCBEaWFnTGV2ZWwsCisgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIEJ1aWxkRGlyZWN0b3J5KTsKKworICAvLy8gXGJyaWVmIE5hbWUgaWRlbnRpZnlpbmcgdGhlIERpYWdub3N0aWMuCisgIHN0ZDo6c3RyaW5nIERpYWdub3N0aWNOYW1lOworCisgIC8vLyBcYnJpZWYgTWVzc2FnZSBhc3NvY2lhdGVkIHRvIHRoZSBkaWFnbm9zdGljLgorICBEaWFnbm9zdGljTWVzc2FnZSBNZXNzYWdlOworCisgIC8vLyBcYnJpZWYgRml4ZXMgdG8gYXBwbHksIGdyb3VwZWQgYnkgZmlsZSBwYXRoLgorICBsbHZtOjpTdHJpbmdNYXA8UmVwbGFjZW1lbnRzPiBGaXg7CisKKyAgLy8vIFxicmllZiBQb3RlbnRpYWwgbm90ZXMgYWJvdXQgdGhlIGRpYWdub3N0aWMuCisgIFNtYWxsVmVjdG9yPERpYWdub3N0aWNNZXNzYWdlLCAxPiBOb3RlczsKKworICAvLy8gXGJyaWVmIERpYWdub3N0aWMgbGV2ZWwuIENhbiBpbmRpY2F0ZSBlaXRoZXIgYW4gZXJyb3Igb3IgYSB3YXJuaW5nLgorICBMZXZlbCBEaWFnTGV2ZWw7CisKKyAgLy8vIFxicmllZiBBIGJ1aWxkIGRpcmVjdG9yeSBvZiB0aGUgZGlhZ25vc3RpYyBzb3VyY2UgZmlsZS4KKyAgLy8vCisgIC8vLyBJdCdzIGFuIGFic29sdXRlIHBhdGggd2hpY2ggaXMgYGRpcmVjdG9yeWAgZmllbGQgb2YgdGhlIHNvdXJjZSBmaWxlIGluCisgIC8vLyBjb21waWxhdGlvbiBkYXRhYmFzZS4gSWYgdXNlcnMgZG9uJ3Qgc3BlY2lmeSB0aGUgY29tcGlsYXRpb24gZGF0YWJhc2UKKyAgLy8vIGRpcmVjdG9yeSwgaXQgaXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoZXJlIGNsYW5nLXRpZHkgcnVucy4KKyAgLy8vCisgIC8vLyBOb3RlOiBpdCBpcyBlbXB0eSBpbiB1bml0dGVzdC4KKyAgc3RkOjpzdHJpbmcgQnVpbGREaXJlY3Rvcnk7Cit9OworCisvLy8gXGJyaWVmIENvbGxlY3Rpb24gb2YgRGlhZ25vc3RpY3MgZ2VuZXJhdGVkIGZyb20gYSBzaW5nbGUgdHJhbnNsYXRpb24gdW5pdC4KK3N0cnVjdCBUcmFuc2xhdGlvblVuaXREaWFnbm9zdGljcyB7CisgIC8vLyBOYW1lIG9mIHRoZSBtYWluIHNvdXJjZSBmb3IgdGhlIHRyYW5zbGF0aW9uIHVuaXQuCisgIHN0ZDo6c3RyaW5nIE1haW5Tb3VyY2VGaWxlOworICBzdGQ6OnZlY3RvcjxEaWFnbm9zdGljPiBEaWFnbm9zdGljczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSB0b29saW5nCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1RPT0xJTkdfQ09SRV9ESUFHTk9TVElDX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvQ29yZS9Mb29rdXAuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvQ29yZS9Mb29rdXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzJiNGRiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9Db3JlL0xvb2t1cC5oCkBAIC0wLDAgKzEsNDggQEAKKy8vPT09LS0tIExvb2t1cC5oIC0gRnJhbWV3b3JrIGZvciBjbGFuZyByZWZhY3RvcmluZyB0b29scyAtLSotIEMrKyAtKi0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIGhlbHBlciBtZXRob2RzIGZvciBjbGFuZyB0b29scyBwZXJmb3JtaW5nIG5hbWUgbG9va3VwLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19UT09MSU5HX0NPUkVfTE9PS1VQX0gKKyNkZWZpbmUgTExWTV9DTEFOR19UT09MSU5HX0NPUkVfTE9PS1VQX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIERlY2xDb250ZXh0OworY2xhc3MgTmFtZWREZWNsOworY2xhc3MgTmVzdGVkTmFtZVNwZWNpZmllcjsKKworbmFtZXNwYWNlIHRvb2xpbmcgeworCisvLy8gRW11bGF0ZSBhIGxvb2t1cCB0byByZXBsYWNlIG9uZSBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIgd2l0aCBhbm90aGVyIHVzaW5nIGFzCisvLy8gZmV3IGFkZGl0aW9uYWwgbmFtZXNwYWNlIHF1YWxpZmljYXRpb25zIGFzIHBvc3NpYmxlLgorLy8vCisvLy8gVGhpcyBkb2VzIG5vdCBwZXJmb3JtIGEgZnVsbCBDKysgbG9va3VwIHNvIEFETCB3aWxsIG5vdCB3b3JrLgorLy8vCisvLy8gXHBhcmFtIFVzZSBUaGUgbmVzdGVkIG5hbWUgdG8gYmUgcmVwbGFjZWQuCisvLy8gXHBhcmFtIFVzZUNvbnRleHQgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIG5lc3RlZCBuYW1lIGlzIGNvbnRhaW5lZC4gVGhpcworLy8vICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdXNlZCB0byBtaW5pbWl6ZSBuYW1lc3BhY2UgcXVhbGlmaWNhdGlvbnMuCisvLy8gXHBhcmFtIEZyb21EZWNsIFRoZSBkZWNsYXJhdGlvbiB0byB3aGljaCB0aGUgbmVzdGVkIG5hbWUgcG9pbnRzLgorLy8vIFxwYXJhbSBSZXBsYWNlbWVudFN0cmluZyBUaGUgcmVwbGFjZW1lbnQgbmVzdGVkIG5hbWUuIE11c3QgYmUgZnVsbHkKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGluY2x1ZGluZyBhIGxlYWRpbmcgIjo6Ii4KKy8vLyBccmV0dXJucyBUaGUgbmV3IG5hbWUgdG8gYmUgaW5zZXJ0ZWQgaW4gcGxhY2Ugb2YgdGhlIGN1cnJlbnQgbmVzdGVkIG5hbWUuCitzdGQ6OnN0cmluZyByZXBsYWNlTmVzdGVkTmFtZShjb25zdCBOZXN0ZWROYW1lU3BlY2lmaWVyICpVc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsQ29udGV4dCAqVXNlQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWVkRGVjbCAqRnJvbURlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgUmVwbGFjZW1lbnRTdHJpbmcpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgdG9vbGluZworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1RPT0xJTkdfQ09SRV9MT09LVVBfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9Db3JlL1JlcGxhY2VtZW50LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0NvcmUvUmVwbGFjZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDZkNmFhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9Db3JlL1JlcGxhY2VtZW50LmgKQEAgLTAsMCArMSwzNzIgQEAKKy8vPT09LSBSZXBsYWNlbWVudC5oIC0gRnJhbWV3b3JrIGZvciBjbGFuZyByZWZhY3RvcmluZyB0b29scyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIENsYXNzZXMgc3VwcG9ydGluZyByZWZhY3RvcmluZ3MgdGhhdCBzcGFuIG11bHRpcGxlIHRyYW5zbGF0aW9uIHVuaXRzLgorLy8gIFdoaWxlIHNpbmdsZSB0cmFuc2xhdGlvbiB1bml0IHJlZmFjdG9yaW5ncyBhcmUgc3VwcG9ydGVkIHZpYSB0aGUgUmV3cml0ZXIsCisvLyAgd2hlbiByZWZhY3RvcmluZyBtdWx0aXBsZSB0cmFuc2xhdGlvbiB1bml0cyBjaGFuZ2VzIG11c3QgYmUgc3RvcmVkIGluIGEKKy8vICBTb3VyY2VNYW5hZ2VyIGluZGVwZW5kZW50IGZvcm0sIGR1cGxpY2F0ZSBjaGFuZ2VzIG5lZWQgdG8gYmUgcmVtb3ZlZCwgYW5kCisvLyAgYWxsIGNoYW5nZXMgbXVzdCBiZSBhcHBsaWVkIGF0IG9uY2UgYXQgdGhlIGVuZCBvZiB0aGUgcmVmYWN0b3Jpbmcgc28gdGhhdAorLy8gIHRoZSBjb2RlIGlzIGFsd2F5cyBwYXJzZWFibGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfQ09SRV9SRVBMQUNFTUVOVF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19DT1JFX1JFUExBQ0VNRU5UX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xhbmdPcHRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgRmlsZU1hbmFnZXI7CitjbGFzcyBSZXdyaXRlcjsKK2NsYXNzIFNvdXJjZU1hbmFnZXI7CisKK25hbWVzcGFjZSB0b29saW5nIHsKKworLy8vIFxicmllZiBBIHNvdXJjZSByYW5nZSBpbmRlcGVuZGVudCBvZiB0aGUgXGMgU291cmNlTWFuYWdlci4KK2NsYXNzIFJhbmdlIHsKK3B1YmxpYzoKKyAgUmFuZ2UoKSA9IGRlZmF1bHQ7CisgIFJhbmdlKHVuc2lnbmVkIE9mZnNldCwgdW5zaWduZWQgTGVuZ3RoKSA6IE9mZnNldChPZmZzZXQpLCBMZW5ndGgoTGVuZ3RoKSB7fQorCisgIC8vLyBcYnJpZWYgQWNjZXNzb3JzLgorICAvLy8gQHsKKyAgdW5zaWduZWQgZ2V0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gT2Zmc2V0OyB9CisgIHVuc2lnbmVkIGdldExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIExlbmd0aDsgfQorICAvLy8gQH0KKworICAvLy8gXG5hbWUgUmFuZ2UgUHJlZGljYXRlcworICAvLy8gQHsKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgcmFuZ2Ugb3ZlcmxhcHMgd2l0aCBccCBSSFMgb3Igbm90LgorICBib29sIG92ZXJsYXBzV2l0aChSYW5nZSBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gT2Zmc2V0ICsgTGVuZ3RoID4gUkhTLk9mZnNldCAmJiBPZmZzZXQgPCBSSFMuT2Zmc2V0ICsgUkhTLkxlbmd0aDsKKyAgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIHJhbmdlIGNvbnRhaW5zIFxwIFJIUyBvciBub3QuCisgIGJvb2wgY29udGFpbnMoUmFuZ2UgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFJIUy5PZmZzZXQgPj0gT2Zmc2V0ICYmCisgICAgICAgICAgIChSSFMuT2Zmc2V0ICsgUkhTLkxlbmd0aCkgPD0gKE9mZnNldCArIExlbmd0aCk7CisgIH0KKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyByYW5nZSBlcXVhbHMgdG8gXHAgUkhTIG9yIG5vdC4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJhbmdlICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gT2Zmc2V0ID09IFJIUy5nZXRPZmZzZXQoKSAmJiBMZW5ndGggPT0gUkhTLmdldExlbmd0aCgpOworICB9CisgIC8vLyBAfQorCitwcml2YXRlOgorICB1bnNpZ25lZCBPZmZzZXQgPSAwOworICB1bnNpZ25lZCBMZW5ndGggPSAwOworfTsKKworLy8vIFxicmllZiBBIHRleHQgcmVwbGFjZW1lbnQuCisvLy8KKy8vLyBSZXByZXNlbnRzIGEgU291cmNlTWFuYWdlciBpbmRlcGVuZGVudCByZXBsYWNlbWVudCBvZiBhIHJhbmdlIG9mIHRleHQgaW4gYQorLy8vIHNwZWNpZmljIGZpbGUuCitjbGFzcyBSZXBsYWNlbWVudCB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBpbnZhbGlkIChub3QgYXBwbGljYWJsZSkgcmVwbGFjZW1lbnQuCisgIFJlcGxhY2VtZW50KCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGEgcmVwbGFjZW1lbnQgb2YgdGhlIHJhbmdlIFtPZmZzZXQsIE9mZnNldCtMZW5ndGgpIGluCisgIC8vLyBGaWxlUGF0aCB3aXRoIFJlcGxhY2VtZW50VGV4dC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRmlsZVBhdGggQSBzb3VyY2UgZmlsZSBhY2Nlc3NpYmxlIHZpYSBhIFNvdXJjZU1hbmFnZXIuCisgIC8vLyBccGFyYW0gT2Zmc2V0IFRoZSBieXRlIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIGluIHRoZSBmaWxlLgorICAvLy8gXHBhcmFtIExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByYW5nZSBpbiBieXRlcy4KKyAgUmVwbGFjZW1lbnQoU3RyaW5nUmVmIEZpbGVQYXRoLCB1bnNpZ25lZCBPZmZzZXQsIHVuc2lnbmVkIExlbmd0aCwKKyAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlcGxhY2VtZW50VGV4dCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGEgUmVwbGFjZW1lbnQgb2YgdGhlIHJhbmdlIFtTdGFydCwgU3RhcnQrTGVuZ3RoKSB3aXRoCisgIC8vLyBSZXBsYWNlbWVudFRleHQuCisgIFJlcGxhY2VtZW50KGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNvdXJjZXMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0LAorICAgICAgICAgICAgICB1bnNpZ25lZCBMZW5ndGgsIFN0cmluZ1JlZiBSZXBsYWNlbWVudFRleHQpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhIFJlcGxhY2VtZW50IG9mIHRoZSBnaXZlbiByYW5nZSB3aXRoIFJlcGxhY2VtZW50VGV4dC4KKyAgUmVwbGFjZW1lbnQoY29uc3QgU291cmNlTWFuYWdlciAmU291cmNlcywgY29uc3QgQ2hhclNvdXJjZVJhbmdlICZSYW5nZSwKKyAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlcGxhY2VtZW50VGV4dCwKKyAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzID0gTGFuZ09wdGlvbnMoKSk7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGEgUmVwbGFjZW1lbnQgb2YgdGhlIG5vZGUgd2l0aCBSZXBsYWNlbWVudFRleHQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBOb2RlPgorICBSZXBsYWNlbWVudChjb25zdCBTb3VyY2VNYW5hZ2VyICZTb3VyY2VzLCBjb25zdCBOb2RlICZOb2RlVG9SZXBsYWNlLAorICAgICAgICAgICAgICBTdHJpbmdSZWYgUmVwbGFjZW1lbnRUZXh0LAorICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMgPSBMYW5nT3B0aW9ucygpKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgd2hldGhlciB0aGlzIHJlcGxhY2VtZW50IGNhbiBiZSBhcHBsaWVkIHRvIGEgZmlsZS4KKyAgLy8vCisgIC8vLyBPbmx5IHJlcGxhY2VtZW50cyB0aGF0IGFyZSBpbiBhIHZhbGlkIGZpbGUgY2FuIGJlIGFwcGxpZWQuCisgIGJvb2wgaXNBcHBsaWNhYmxlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBBY2Nlc3NvcnMuCisgIC8vLyBAeworICBTdHJpbmdSZWYgZ2V0RmlsZVBhdGgoKSBjb25zdCB7IHJldHVybiBGaWxlUGF0aDsgfQorICB1bnNpZ25lZCBnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBSZXBsYWNlbWVudFJhbmdlLmdldE9mZnNldCgpOyB9CisgIHVuc2lnbmVkIGdldExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIFJlcGxhY2VtZW50UmFuZ2UuZ2V0TGVuZ3RoKCk7IH0KKyAgU3RyaW5nUmVmIGdldFJlcGxhY2VtZW50VGV4dCgpIGNvbnN0IHsgcmV0dXJuIFJlcGxhY2VtZW50VGV4dDsgfQorICAvLy8gQH0KKworICAvLy8gXGJyaWVmIEFwcGxpZXMgdGhlIHJlcGxhY2VtZW50IG9uIHRoZSBSZXdyaXRlci4KKyAgYm9vbCBhcHBseShSZXdyaXRlciAmUmV3cml0ZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0OworCitwcml2YXRlOgorICB2b2lkIHNldEZyb21Tb3VyY2VMb2NhdGlvbihjb25zdCBTb3VyY2VNYW5hZ2VyICZTb3VyY2VzLCBTb3VyY2VMb2NhdGlvbiBTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGVuZ3RoLCBTdHJpbmdSZWYgUmVwbGFjZW1lbnRUZXh0KTsKKyAgdm9pZCBzZXRGcm9tU291cmNlUmFuZ2UoY29uc3QgU291cmNlTWFuYWdlciAmU291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2hhclNvdXJjZVJhbmdlICZSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlcGxhY2VtZW50VGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKTsKKworICBzdGQ6OnN0cmluZyBGaWxlUGF0aDsKKyAgUmFuZ2UgUmVwbGFjZW1lbnRSYW5nZTsKKyAgc3RkOjpzdHJpbmcgUmVwbGFjZW1lbnRUZXh0OworfTsKKworZW51bSBjbGFzcyByZXBsYWNlbWVudF9lcnJvciB7CisgIGZhaWxfdG9fYXBwbHkgPSAwLAorICB3cm9uZ19maWxlX3BhdGgsCisgIG92ZXJsYXBfY29uZmxpY3QsCisgIGluc2VydF9jb25mbGljdCwKK307CisKKy8vLyBcYnJpZWYgQ2FycmllcyBleHRyYSBlcnJvciBpbmZvcm1hdGlvbiBpbiByZXBsYWNlbWVudC1yZWxhdGVkIGxsdm06OkVycm9yLAorLy8vIGUuZy4gZmFpbCBhcHBseWluZyByZXBsYWNlbWVudHMgYW5kIHJlcGxhY2VtZW50cyBjb25mbGljdC4KK2NsYXNzIFJlcGxhY2VtZW50RXJyb3IgOiBwdWJsaWMgbGx2bTo6RXJyb3JJbmZvPFJlcGxhY2VtZW50RXJyb3I+IHsKK3B1YmxpYzoKKyAgUmVwbGFjZW1lbnRFcnJvcihyZXBsYWNlbWVudF9lcnJvciBFcnIpIDogRXJyKEVycikge30KKworICAvLy8gXGJyaWVmIENvbnN0cnVjdHMgYW4gZXJyb3IgcmVsYXRlZCB0byBhbiBleGlzdGluZyByZXBsYWNlbWVudC4KKyAgUmVwbGFjZW1lbnRFcnJvcihyZXBsYWNlbWVudF9lcnJvciBFcnIsIFJlcGxhY2VtZW50IEV4aXN0aW5nKQorICAgICAgOiBFcnIoRXJyKSwgRXhpc3RpbmdSZXBsYWNlbWVudChzdGQ6Om1vdmUoRXhpc3RpbmcpKSB7fQorCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0cyBhbiBlcnJvciByZWxhdGVkIHRvIGEgbmV3IHJlcGxhY2VtZW50IGFuZCBhbiBleGlzdGluZworICAvLy8gcmVwbGFjZW1lbnQgaW4gYSBzZXQgb2YgcmVwbGFjZW1lbnRzLgorICBSZXBsYWNlbWVudEVycm9yKHJlcGxhY2VtZW50X2Vycm9yIEVyciwgUmVwbGFjZW1lbnQgTmV3LCBSZXBsYWNlbWVudCBFeGlzdGluZykKKyAgICAgIDogRXJyKEVyciksIE5ld1JlcGxhY2VtZW50KHN0ZDo6bW92ZShOZXcpKSwKKyAgICAgICAgRXhpc3RpbmdSZXBsYWNlbWVudChzdGQ6Om1vdmUoRXhpc3RpbmcpKSB7fQorCisgIHN0ZDo6c3RyaW5nIG1lc3NhZ2UoKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsgT1MgPDwgbWVzc2FnZSgpOyB9CisKKyAgcmVwbGFjZW1lbnRfZXJyb3IgZ2V0KCkgY29uc3QgeyByZXR1cm4gRXJyOyB9CisKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgY29uc3QgbGx2bTo6T3B0aW9uYWw8UmVwbGFjZW1lbnQ+ICZnZXROZXdSZXBsYWNlbWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTmV3UmVwbGFjZW1lbnQ7CisgIH0KKworICBjb25zdCBsbHZtOjpPcHRpb25hbDxSZXBsYWNlbWVudD4gJmdldEV4aXN0aW5nUmVwbGFjZW1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIEV4aXN0aW5nUmVwbGFjZW1lbnQ7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gVXNlcnMgYXJlIG5vdCBleHBlY3RlZCB0byB1c2UgZXJyb3JfY29kZS4KKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbGx2bTo6aW5jb252ZXJ0aWJsZUVycm9yQ29kZSgpOworICB9CisKKyAgcmVwbGFjZW1lbnRfZXJyb3IgRXJyOworCisgIC8vIEEgbmV3IHJlcGxhY2VtZW50LCB3aGljaCBpcyB0byBleHBlY3RlZCBiZSBhZGRlZCBpbnRvIGEgc2V0IG9mCisgIC8vIHJlcGxhY2VtZW50cywgdGhhdCBpcyBjYXVzaW5nIHByb2JsZW0uCisgIGxsdm06Ok9wdGlvbmFsPFJlcGxhY2VtZW50PiBOZXdSZXBsYWNlbWVudDsKKworICAvLyBBbiBleGlzdGluZyByZXBsYWNlbWVudCBpbiBhIHJlcGxhY2VtZW50cyBzZXQgdGhhdCBpcyBjYXVzaW5nIHByb2JsZW0uCisgIGxsdm06Ok9wdGlvbmFsPFJlcGxhY2VtZW50PiBFeGlzdGluZ1JlcGxhY2VtZW50OworfTsKKworLy8vIFxicmllZiBMZXNzLXRoYW4gb3BlcmF0b3IgYmV0d2VlbiB0d28gUmVwbGFjZW1lbnRzLgorYm9vbCBvcGVyYXRvcjwoY29uc3QgUmVwbGFjZW1lbnQgJkxIUywgY29uc3QgUmVwbGFjZW1lbnQgJlJIUyk7CisKKy8vLyBcYnJpZWYgRXF1YWwtdG8gb3BlcmF0b3IgYmV0d2VlbiB0d28gUmVwbGFjZW1lbnRzLgorYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJlcGxhY2VtZW50ICZMSFMsIGNvbnN0IFJlcGxhY2VtZW50ICZSSFMpOworCisvLy8gXGJyaWVmIE1haW50YWlucyBhIHNldCBvZiByZXBsYWNlbWVudHMgdGhhdCBhcmUgY29uZmxpY3QtZnJlZS4KKy8vLyBUd28gcmVwbGFjZW1lbnRzIGFyZSBjb25zaWRlcmVkIGNvbmZsaWN0cyBpZiB0aGV5IG92ZXJsYXAgb3IgaGF2ZSB0aGUgc2FtZQorLy8vIG9mZnNldCAoaS5lLiBvcmRlci1kZXBlbmRlbnQpLgorY2xhc3MgUmVwbGFjZW1lbnRzIHsKK3ByaXZhdGU6CisgIHVzaW5nIFJlcGxhY2VtZW50c0ltcGwgPSBzdGQ6OnNldDxSZXBsYWNlbWVudD47CisKK3B1YmxpYzoKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBSZXBsYWNlbWVudHNJbXBsOjpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciA9IFJlcGxhY2VtZW50c0ltcGw6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgUmVwbGFjZW1lbnRzKCkgPSBkZWZhdWx0OworCisgIGV4cGxpY2l0IFJlcGxhY2VtZW50cyhjb25zdCBSZXBsYWNlbWVudCAmUikgeyBSZXBsYWNlcy5pbnNlcnQoUik7IH0KKworICAvLy8gXGJyaWVmIEFkZHMgYSBuZXcgcmVwbGFjZW1lbnQgXHAgUiB0byB0aGUgY3VycmVudCBzZXQgb2YgcmVwbGFjZW1lbnRzLgorICAvLy8gXHAgUiBtdXN0IGhhdmUgdGhlIHNhbWUgZmlsZSBwYXRoIGFzIGFsbCBleGlzdGluZyByZXBsYWNlbWVudHMuCisgIC8vLyBSZXR1cm5zIGBzdWNjZXNzYCBpZiB0aGUgcmVwbGFjZW1lbnQgaXMgc3VjY2Vzc2Z1bGx5IGluc2VydGVkOyBvdGhlcndpc2UsCisgIC8vLyBpdCByZXR1cm5zIGFuIGxsdm06OkVycm9yLCBpLmUuIHRoZXJlIGlzIGEgY29uZmxpY3QgYmV0d2VlbiBSIGFuZCB0aGUKKyAgLy8vIGV4aXN0aW5nIHJlcGxhY2VtZW50cyAoaS5lLiB0aGV5IGFyZSBvcmRlci1kZXBlbmRlbnQpIG9yIFIncyBmaWxlIHBhdGggaXMKKyAgLy8vIGRpZmZlcmVudCBmcm9tIHRoZSBmaWxlcGF0aCBvZiBleGlzdGluZyByZXBsYWNlbWVudHMuIENhbGxlcnMgbXVzdAorICAvLy8gZXhwbGljaXRseSBjaGVjayB0aGUgRXJyb3IgcmV0dXJuZWQsIGFuZCB0aGUgcmV0dXJuZWQgZXJyb3IgY2FuIGJlCisgIC8vLyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgbWVzc2FnZSB3aXRoIGBsbHZtOjp0b1N0cmluZygpYC4gVGhpcyBwcmV2ZW50cyB1c2VycworICAvLy8gZnJvbSBhZGRpbmcgb3JkZXItZGVwZW5kZW50IHJlcGxhY2VtZW50cy4gVG8gY29udHJvbCB0aGUgb3JkZXIgaW4gd2hpY2gKKyAgLy8vIG9yZGVyLWRlcGVuZGVudCByZXBsYWNlbWVudHMgYXJlIGFwcGxpZWQsIHVzZSBtZXJnZSh7Un0pIHdpdGggUiByZWZlcnJpbmcKKyAgLy8vIHRvIHRoZSBjaGFuZ2VkIGNvZGUgYWZ0ZXIgYXBwbHlpbmcgYWxsIGV4aXN0aW5nIHJlcGxhY2VtZW50cy4KKyAgLy8vIFR3byByZXBsYWNlbWVudHMgQSBhbmQgQiBhcmUgY29uc2lkZXJlZCBvcmRlci1pbmRlcGVuZGVudCBpZiBhcHBseWluZyB0aGVtCisgIC8vLyBpbiBlaXRoZXIgb3JkZXIgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0LiBOb3RlIHRoYXQgdGhlIHJhbmdlIG9mIHRoZQorICAvLy8gcmVwbGFjZW1lbnQgdGhhdCBpcyBhcHBsaWVkIGxhdGVyIHN0aWxsIHJlZmVycyB0byB0aGUgb3JpZ2luYWwgY29kZS4KKyAgLy8vIFRoZXNlIGluY2x1ZGUgKGJ1dCBub3QgcmVzdHJpY3RlZCB0bykgcmVwbGFjZW1lbnRzIHRoYXQ6CisgIC8vLyAgIC0gZG9uJ3Qgb3ZlcmxhcCAoYmVpbmcgZGlyZWN0bHkgYWRqYWNlbnQgaXMgZmluZSkgYW5kCisgIC8vLyAgIC0gYXJlIG92ZXJsYXBwaW5nIGRlbGV0aW9ucy4KKyAgLy8vICAgLSBhcmUgaW5zZXJ0aW9ucyBhdCB0aGUgc2FtZSBvZmZzZXQgYW5kIGFwcGx5aW5nIHRoZW0gaW4gZWl0aGVyIG9yZGVyCisgIC8vLyAgICAgaGFzIHRoZSBzYW1lIGVmZmVjdCwgaS5lLiBYICsgWSA9IFkgKyBYIHdoZW4gaW5zZXJ0aW5nIFggYW5kIFkKKyAgLy8vICAgICByZXNwZWN0aXZlbHkuCisgIC8vLyAgIC0gYXJlIGlkZW50aWNhbCByZXBsYWNlbWVudHMsIGkuZS4gYXBwbHlpbmcgdGhlIHNhbWUgcmVwbGFjZW1lbnQgdHdpY2UKKyAgLy8vICAgICBpcyBlcXVpdmFsZW50IHRvIGFwcGx5aW5nIGl0IG9uY2UuCisgIC8vLyBFeGFtcGxlczoKKyAgLy8vIDEuIFJlcGxhY2VtZW50IEEoMCwgMCwgImEiKSBhbmQgQigwLCAwLCAiYWEiKSBhcmUgb3JkZXItaW5kZXBlbmRlbnQgc2luY2UKKyAgLy8vICAgIGFwcGx5aW5nIHRoZW0gaW4gZWl0aGVyIG9yZGVyIGdpdmVzIHJlcGxhY2VtZW50ICgwLCAwLCAiYWFhIikuCisgIC8vLyAgICBIb3dldmVyLCBBKDAsIDAsICJhIikgYW5kIEIoMCwgMCwgImIiKSBhcmUgb3JkZXItZGVwZW5kZW50IHNpbmNlCisgIC8vLyAgICBhcHBseWluZyBBIGZpcnN0IGdpdmVzICgwLCAwLCAiYWIiKSB3aGlsZSBhcHBseWluZyBCIGZpcnN0IGdpdmVzIChCLCBBLAorICAvLy8gICAgImJhIikuCisgIC8vLyAyLiBSZXBsYWNlbWVudCBBKDAsIDIsICIxMjMiKSBhbmQgQigwLCAyLCAiMTIzIikgYXJlIG9yZGVyLWluZGVwZW5kZW50CisgIC8vLyAgICBzaW5jZSBhcHBseWluZyB0aGVtIGluIGVpdGhlciBvcmRlciBnaXZlcyAoMCwgMiwgIjEyMyIpLgorICAvLy8gMy4gUmVwbGFjZW1lbnQgQSgwLCAzLCAiMTIzIikgYW5kIEIoMiwgMywgIjMyMSIpIGFyZSBvcmRlci1pbmRlcGVuZGVudAorICAvLy8gICAgc2luY2UgZWl0aGVyIG9yZGVyIGdpdmVzICgwLCA1LCAiMTIzMjEiKS4KKyAgLy8vIDQuIFJlcGxhY2VtZW50IEEoMCwgMywgImFiIikgYW5kIEIoMCwgMywgImFiIikgYXJlIG9yZGVyLWluZGVwZW5kZW50IHNpbmNlCisgIC8vLyAgICBhcHBseWluZyB0aGUgc2FtZSByZXBsYWNlbWVudCB0d2ljZSBpcyBlcXVpdmFsZW50IHRvIGFwcGx5aW5nIGl0IG9uY2UuCisgIC8vLyBSZXBsYWNlbWVudHMgd2l0aCBvZmZzZXQgVUlOVF9NQVggYXJlIHNwZWNpYWwgLSB3ZSBkbyBub3QgZGV0ZWN0IGNvbmZsaWN0cworICAvLy8gZm9yIHN1Y2ggcmVwbGFjZW1lbnRzIHNpbmNlIHVzZXJzIG1heSBhZGQgdGhlbSBpbnRlbnRpb25hbGx5IGFzIGEgc3BlY2lhbAorICAvLy8gY2F0ZWdvcnkgb2YgcmVwbGFjZW1lbnRzLgorICBsbHZtOjpFcnJvciBhZGQoY29uc3QgUmVwbGFjZW1lbnQgJlIpOworCisgIC8vLyBcYnJpZWYgTWVyZ2VzIFxwIFJlcGxhY2VzIGludG8gdGhlIGN1cnJlbnQgcmVwbGFjZW1lbnRzLiBccCBSZXBsYWNlcworICAvLy8gcmVmZXJzIHRvIGNvZGUgYWZ0ZXIgYXBwbHlpbmcgdGhlIGN1cnJlbnQgcmVwbGFjZW1lbnRzLgorICBMTFZNX05PRElTQ0FSRCBSZXBsYWNlbWVudHMgbWVyZ2UoY29uc3QgUmVwbGFjZW1lbnRzICZSZXBsYWNlcykgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgYWZmZWN0ZWQgcmFuZ2VzIGluIHRoZSBjaGFuZ2VkIGNvZGUuCisgIHN0ZDo6dmVjdG9yPFJhbmdlPiBnZXRBZmZlY3RlZFJhbmdlcygpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIG5ldyBvZmZzZXQgaW4gdGhlIGNvZGUgYWZ0ZXIgcmVwbGFjZW1lbnRzIGJlaW5nIGFwcGxpZWQuCisgIC8vIE5vdGUgdGhhdCBpZiB0aGVyZSBpcyBhbiBpbnNlcnRpb24gYXQgT2Zmc2V0IGluIHRoZSBjdXJyZW50IHJlcGxhY2VtZW50cywKKyAgLy8gXHAgT2Zmc2V0IHdpbGwgYmUgc2hpZnRlZCB0byBPZmZzZXQgKyBMZW5ndGggaW4gaW5zZXJ0ZWQgdGV4dC4KKyAgdW5zaWduZWQgZ2V0U2hpZnRlZENvZGVQb3NpdGlvbih1bnNpZ25lZCBQb3NpdGlvbikgY29uc3Q7CisKKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFJlcGxhY2VzLnNpemUoKTsgfQorCisgIHZvaWQgY2xlYXIoKSB7IFJlcGxhY2VzLmNsZWFyKCk7IH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gUmVwbGFjZXMuZW1wdHkoKTsgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gUmVwbGFjZXMuYmVnaW4oKTsgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFJlcGxhY2VzLmVuZCgpOyB9CisKKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCAgeyByZXR1cm4gUmVwbGFjZXMucmJlZ2luKCk7IH0KKworICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiBSZXBsYWNlcy5yZW5kKCk7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVwbGFjZW1lbnRzICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVwbGFjZXMgPT0gUkhTLlJlcGxhY2VzOworICB9CisKK3ByaXZhdGU6CisgIFJlcGxhY2VtZW50cyhjb25zdF9pdGVyYXRvciBCZWdpbiwgY29uc3RfaXRlcmF0b3IgRW5kKQorICAgICAgOiBSZXBsYWNlcyhCZWdpbiwgRW5kKSB7fQorCisgIC8vIFJldHVybnMgYFJgIHdpdGggbmV3IHJhbmdlIHRoYXQgcmVmZXJzIHRvIGNvZGUgYWZ0ZXIgYFJlcGxhY2VzYCBiZWluZworICAvLyBhcHBsaWVkLgorICBSZXBsYWNlbWVudCBnZXRSZXBsYWNlbWVudEluQ2hhbmdlZENvZGUoY29uc3QgUmVwbGFjZW1lbnQgJlIpIGNvbnN0OworCisgIC8vIFJldHVybnMgYSBzZXQgb2YgcmVwbGFjZW1lbnRzIHRoYXQgaXMgZXF1aXZhbGVudCB0byB0aGUgY3VycmVudAorICAvLyByZXBsYWNlbWVudHMgYnkgbWVyZ2luZyBhbGwgYWRqYWNlbnQgcmVwbGFjZW1lbnRzLiBUd28gc2V0cyBvZiByZXBsYWNlbWVudHMKKyAgLy8gYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgZWZmZWN0IHdoZW4gdGhleSBhcmUKKyAgLy8gYXBwbGllZC4KKyAgUmVwbGFjZW1lbnRzIGdldENhbm9uaWNhbFJlcGxhY2VtZW50cygpIGNvbnN0OworCisgIC8vIElmIGBSYCBhbmQgYWxsIGV4aXN0aW5nIHJlcGxhY2VtZW50cyBhcmUgb3JkZXItaW5kZXBlZGVudCwgdGhlbiBtZXJnZSBpdAorICAvLyB3aXRoIGBSZXBsYWNlc2AgYW5kIHJldHVybnMgdGhlIG1lcmdlZCByZXBsYWNlbWVudHM7IG90aGVyd2lzZSwgcmV0dXJucyBhbgorICAvLyBlcnJvci4KKyAgbGx2bTo6RXhwZWN0ZWQ8UmVwbGFjZW1lbnRzPgorICBtZXJnZUlmT3JkZXJJbmRlcGVuZGVudChjb25zdCBSZXBsYWNlbWVudCAmUikgY29uc3Q7CisKKyAgUmVwbGFjZW1lbnRzSW1wbCBSZXBsYWNlczsKK307CisKKy8vLyBcYnJpZWYgQXBwbHkgYWxsIHJlcGxhY2VtZW50cyBpbiBccCBSZXBsYWNlcyB0byB0aGUgUmV3cml0ZXIgXHAgUmV3cml0ZS4KKy8vLworLy8vIFJlcGxhY2VtZW50IGFwcGxpY2F0aW9ucyBoYXBwZW4gaW5kZXBlbmRlbnRseSBvZiB0aGUgc3VjY2VzcyBvZgorLy8vIG90aGVyIGFwcGxpY2F0aW9ucy4KKy8vLworLy8vIFxyZXR1cm5zIHRydWUgaWYgYWxsIHJlcGxhY2VtZW50cyBhcHBseS4gZmFsc2Ugb3RoZXJ3aXNlLgorYm9vbCBhcHBseUFsbFJlcGxhY2VtZW50cyhjb25zdCBSZXBsYWNlbWVudHMgJlJlcGxhY2VzLCBSZXdyaXRlciAmUmV3cml0ZSk7CisKKy8vLyBcYnJpZWYgQXBwbGllcyBhbGwgcmVwbGFjZW1lbnRzIGluIFxwIFJlcGxhY2VzIHRvIFxwIENvZGUuCisvLy8KKy8vLyBUaGlzIGNvbXBsZXRlbHkgaWdub3JlcyB0aGUgcGF0aCBzdG9yZWQgaW4gZWFjaCByZXBsYWNlbWVudC4gSWYgYWxsCisvLy8gcmVwbGFjZW1lbnRzIGFyZSBhcHBsaWVkIHN1Y2Nlc3NmdWxseSwgdGhpcyByZXR1cm5zIHRoZSBjb2RlIHdpdGgKKy8vLyByZXBsYWNlbWVudHMgYXBwbGllZDsgb3RoZXJ3aXNlLCBhbiBsbHZtOjpFcnJvciBjYXJyeWluZyBsbHZtOjpTdHJpbmdFcnJvcgorLy8vIGlzIHJldHVybmVkICh0aGUgRXJyb3IgbWVzc2FnZSBjYW4gYmUgY29udmVydGVkIHRvIHN0cmluZyB1c2luZworLy8vIGBsbHZtOjp0b1N0cmluZygpYCBhbmQgJ3N0ZDo6ZXJyb3JfY29kZWAgaW4gdGhlIGBFcnJvcmAgc2hvdWxkIGJlIGlnbm9yZWQpLgorbGx2bTo6RXhwZWN0ZWQ8c3RkOjpzdHJpbmc+IGFwcGx5QWxsUmVwbGFjZW1lbnRzKFN0cmluZ1JlZiBDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlcGxhY2VtZW50cyAmUmVwbGFjZXMpOworCisvLy8gXGJyaWVmIENvbGxlY3Rpb24gb2YgUmVwbGFjZW1lbnRzIGdlbmVyYXRlZCBmcm9tIGEgc2luZ2xlIHRyYW5zbGF0aW9uIHVuaXQuCitzdHJ1Y3QgVHJhbnNsYXRpb25Vbml0UmVwbGFjZW1lbnRzIHsKKyAgLy8vIE5hbWUgb2YgdGhlIG1haW4gc291cmNlIGZvciB0aGUgdHJhbnNsYXRpb24gdW5pdC4KKyAgc3RkOjpzdHJpbmcgTWFpblNvdXJjZUZpbGU7CisKKyAgc3RkOjp2ZWN0b3I8UmVwbGFjZW1lbnQ+IFJlcGxhY2VtZW50czsKK307CisKKy8vLyBcYnJpZWYgQ2FsY3VsYXRlcyB0aGUgbmV3IHJhbmdlcyBhZnRlciBccCBSZXBsYWNlcyBhcmUgYXBwbGllZC4gVGhlc2UKKy8vLyBpbmNsdWRlIGJvdGggdGhlIG9yaWdpbmFsIFxwIFJhbmdlcyBhbmQgdGhlIGFmZmVjdGVkIHJhbmdlcyBvZiBccCBSZXBsYWNlcworLy8vIGluIHRoZSBuZXcgY29kZS4KKy8vLworLy8vIFxwcmUgUmVwbGFjZW1lbnRzIG11c3QgYmUgZm9yIHRoZSBzYW1lIGZpbGUuCisvLy8KKy8vLyBccmV0dXJuIFRoZSBuZXcgcmFuZ2VzIGFmdGVyIFxwIFJlcGxhY2VzIGFyZSBhcHBsaWVkLiBUaGUgbmV3IHJhbmdlcyB3aWxsIGJlCisvLy8gc29ydGVkIGFuZCBub24tb3ZlcmxhcHBpbmcuCitzdGQ6OnZlY3RvcjxSYW5nZT4KK2NhbGN1bGF0ZVJhbmdlc0FmdGVyUmVwbGFjZW1lbnRzKGNvbnN0IFJlcGxhY2VtZW50cyAmUmVwbGFjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxSYW5nZT4gJlJhbmdlcyk7CisKKy8vLyBcYnJpZWYgSWYgdGhlcmUgYXJlIG11bHRpcGxlIDxGaWxlLCBSZXBsYWNlbWVudHM+IHBhaXJzIHdpdGggdGhlIHNhbWUgZmlsZQorLy8vIGVudHJ5LCB3ZSBvbmx5IGtlZXAgb25lIHBhaXIgYW5kIGRpc2NhcmQgdGhlIHJlc3QuCisvLy8gSWYgYSBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdHMgY29ycmVzcG9uZGluZyByZXBsYWNlbWVudHMgd2lsbCBiZSBpZ25vcmVkLgorc3RkOjptYXA8c3RkOjpzdHJpbmcsIFJlcGxhY2VtZW50cz4gZ3JvdXBSZXBsYWNlbWVudHNCeUZpbGUoCisgICAgRmlsZU1hbmFnZXIgJkZpbGVNZ3IsCisgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFJlcGxhY2VtZW50cz4gJkZpbGVUb1JlcGxhY2VzKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIE5vZGU+CitSZXBsYWNlbWVudDo6UmVwbGFjZW1lbnQoY29uc3QgU291cmNlTWFuYWdlciAmU291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOb2RlICZOb2RlVG9SZXBsYWNlLCBTdHJpbmdSZWYgUmVwbGFjZW1lbnRUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cykgeworICBjb25zdCBDaGFyU291cmNlUmFuZ2UgUmFuZ2UgPQorICAgICAgQ2hhclNvdXJjZVJhbmdlOjpnZXRUb2tlblJhbmdlKE5vZGVUb1JlcGxhY2UtPmdldFNvdXJjZVJhbmdlKCkpOworICBzZXRGcm9tU291cmNlUmFuZ2UoU291cmNlcywgUmFuZ2UsIFJlcGxhY2VtZW50VGV4dCwgTGFuZ09wdHMpOworfQorCit9IC8vIG5hbWVzcGFjZSB0b29saW5nCisKK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1RPT0xJTkdfQ09SRV9SRVBMQUNFTUVOVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0RpYWdub3N0aWNzWWFtbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9EaWFnbm9zdGljc1lhbWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDZmZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9EaWFnbm9zdGljc1lhbWwuaApAQCAtMCwwICsxLDk0IEBACisvLz09PS0tIERpYWdub3N0aWNzWWFtbC5oIC0tIFNlcmlhbGlhemF0aW9uIGZvciBEaWFnbm9zdGljc3MgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIGEgWUFNTCBkb2N1bWVudCBmb3Igc2VyaWFsaXppbmcKKy8vLyBkaWFnbm9zdGljcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfRElBR05PU1RJQ1NZQU1MX0gKKyNkZWZpbmUgTExWTV9DTEFOR19UT09MSU5HX0RJQUdOT1NUSUNTWUFNTF9ICisKKyNpbmNsdWRlICJjbGFuZy9Ub29saW5nL0NvcmUvRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvUmVwbGFjZW1lbnRzWWFtbC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGNsYW5nOjp0b29saW5nOjpEaWFnbm9zdGljKQorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgeWFtbCB7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPGNsYW5nOjp0b29saW5nOjpEaWFnbm9zdGljPiB7CisgIC8vLyBcYnJpZWYgSGVscGVyIHRvIChkZSlzZXJpYWxpemUgYSBEaWFnbm9zdGljIHNpbmNlIHdlIGRvbid0IGhhdmUgZGlyZWN0CisgIC8vLyBhY2Nlc3MgdG8gaXRzIGRhdGEgbWVtYmVycy4KKyAgY2xhc3MgTm9ybWFsaXplZERpYWdub3N0aWMgeworICBwdWJsaWM6CisgICAgTm9ybWFsaXplZERpYWdub3N0aWMoY29uc3QgSU8gJikKKyAgICAgICAgOiBEaWFnTGV2ZWwoY2xhbmc6OnRvb2xpbmc6OkRpYWdub3N0aWM6OkxldmVsOjpXYXJuaW5nKSB7fQorCisgICAgTm9ybWFsaXplZERpYWdub3N0aWMoY29uc3QgSU8gJiwgY29uc3QgY2xhbmc6OnRvb2xpbmc6OkRpYWdub3N0aWMgJkQpCisgICAgICAgIDogRGlhZ25vc3RpY05hbWUoRC5EaWFnbm9zdGljTmFtZSksIE1lc3NhZ2UoRC5NZXNzYWdlKSwgRml4KEQuRml4KSwKKyAgICAgICAgICBOb3RlcyhELk5vdGVzKSwgRGlhZ0xldmVsKEQuRGlhZ0xldmVsKSwKKyAgICAgICAgICBCdWlsZERpcmVjdG9yeShELkJ1aWxkRGlyZWN0b3J5KSB7fQorCisgICAgY2xhbmc6OnRvb2xpbmc6OkRpYWdub3N0aWMgZGVub3JtYWxpemUoY29uc3QgSU8gJikgeworICAgICAgcmV0dXJuIGNsYW5nOjp0b29saW5nOjpEaWFnbm9zdGljKERpYWdub3N0aWNOYW1lLCBNZXNzYWdlLCBGaXgsIE5vdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdMZXZlbCwgQnVpbGREaXJlY3RvcnkpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIERpYWdub3N0aWNOYW1lOworICAgIGNsYW5nOjp0b29saW5nOjpEaWFnbm9zdGljTWVzc2FnZSBNZXNzYWdlOworICAgIGxsdm06OlN0cmluZ01hcDxjbGFuZzo6dG9vbGluZzo6UmVwbGFjZW1lbnRzPiBGaXg7CisgICAgU21hbGxWZWN0b3I8Y2xhbmc6OnRvb2xpbmc6OkRpYWdub3N0aWNNZXNzYWdlLCAxPiBOb3RlczsKKyAgICBjbGFuZzo6dG9vbGluZzo6RGlhZ25vc3RpYzo6TGV2ZWwgRGlhZ0xldmVsOworICAgIHN0ZDo6c3RyaW5nIEJ1aWxkRGlyZWN0b3J5OworICB9OworCisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklvLCBjbGFuZzo6dG9vbGluZzo6RGlhZ25vc3RpYyAmRCkgeworICAgIE1hcHBpbmdOb3JtYWxpemF0aW9uPE5vcm1hbGl6ZWREaWFnbm9zdGljLCBjbGFuZzo6dG9vbGluZzo6RGlhZ25vc3RpYz4gS2V5cygKKyAgICAgICAgSW8sIEQpOworICAgIElvLm1hcFJlcXVpcmVkKCJEaWFnbm9zdGljTmFtZSIsIEtleXMtPkRpYWdub3N0aWNOYW1lKTsKKyAgICBJby5tYXBSZXF1aXJlZCgiTWVzc2FnZSIsIEtleXMtPk1lc3NhZ2UuTWVzc2FnZSk7CisgICAgSW8ubWFwUmVxdWlyZWQoIkZpbGVPZmZzZXQiLCBLZXlzLT5NZXNzYWdlLkZpbGVPZmZzZXQpOworICAgIElvLm1hcFJlcXVpcmVkKCJGaWxlUGF0aCIsIEtleXMtPk1lc3NhZ2UuRmlsZVBhdGgpOworCisgICAgLy8gRklYTUU6IEV4cG9ydCBwcm9wZXJseSBhbGwgdGhlIGRpZmZlcmVudCBmaWVsZHMuCisKKyAgICBzdGQ6OnZlY3RvcjxjbGFuZzo6dG9vbGluZzo6UmVwbGFjZW1lbnQ+IEZpeGVzOworICAgIGZvciAoYXV0byAmUmVwbGFjZW1lbnRzIDogS2V5cy0+Rml4KSB7CisgICAgICBmb3IgKGF1dG8gJlJlcGxhY2VtZW50IDogUmVwbGFjZW1lbnRzLnNlY29uZCkgeworICAgICAgICBGaXhlcy5wdXNoX2JhY2soUmVwbGFjZW1lbnQpOworICAgICAgfQorICAgIH0KKyAgICBJby5tYXBSZXF1aXJlZCgiUmVwbGFjZW1lbnRzIiwgRml4ZXMpOworICAgIGZvciAoYXV0byAmRml4IDogRml4ZXMpIHsKKyAgICAgIGxsdm06OkVycm9yIEVyciA9IEtleXMtPkZpeFtGaXguZ2V0RmlsZVBhdGgoKV0uYWRkKEZpeCk7CisgICAgICBpZiAoRXJyKSB7CisgICAgICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgYmV0dGVyIGNvbmZsaWN0IGhhbmRsaW5nLgorICAgICAgICBsbHZtOjplcnJzKCkgPDwgIkZpeCBjb25mbGljdHMgd2l0aCBleGlzdGluZyBmaXg6ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGxsdm06OnRvU3RyaW5nKHN0ZDo6bW92ZShFcnIpKSA8PCAiXG4iOworICAgICAgfQorICAgIH0KKyAgfQorfTsKKworLy8vIFxicmllZiBTcGVjaWFsaXplZCBNYXBwaW5nVHJhaXRzIHRvIGRlc2NyaWJlIGhvdyBhCisvLy8gVHJhbnNsYXRpb25Vbml0RGlhZ25vc3RpY3MgaXMgKGRlKXNlcmlhbGl6ZWQuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxjbGFuZzo6dG9vbGluZzo6VHJhbnNsYXRpb25Vbml0RGlhZ25vc3RpY3M+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSW8sIGNsYW5nOjp0b29saW5nOjpUcmFuc2xhdGlvblVuaXREaWFnbm9zdGljcyAmRG9jKSB7CisgICAgSW8ubWFwUmVxdWlyZWQoIk1haW5Tb3VyY2VGaWxlIiwgRG9jLk1haW5Tb3VyY2VGaWxlKTsKKyAgICBJby5tYXBSZXF1aXJlZCgiRGlhZ25vc3RpY3MiLCBEb2MuRGlhZ25vc3RpY3MpOworICB9Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIHlhbWwKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1RPT0xJTkdfRElBR05PU1RJQ1NZQU1MX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvRXhlY3V0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0V4ZWN1dGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNDRjNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0V4ZWN1dGlvbi5oCkBAIC0wLDAgKzEsMTc1IEBACisvLz09PS0tLSBFeGVjdXRpb24uaCAtIEV4ZWN1dGluZyBjbGFuZyBmcm9udGVuZCBhY3Rpb25zIC0qLSBDKysgLS0tLS0tLS0tKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyBmcmFtZXdvcmsgZm9yIGV4ZWN1dGluZyBjbGFuZyBmcm9udGVuZCBhY3Rpb25zLgorLy8KKy8vICBUaGUgZnJhbWV3b3JrIGNhbiBiZSBleHRlbmRlZCB0byBzdXBwb3J0IGRpZmZlcmVudCBleGVjdXRpb24gcGxhbnMgaW5jbHVkaW5nCisvLyAgc3RhbmRhbG9uZSBleGVjdXRpb24gb24gdGhlIGdpdmVuIFRVcyBvciBwYXJhbGxlbCBleGVjdXRpb24gb24gYWxsIFRVcyBpbgorLy8gIHRoZSBjb2RlYmFzZS4KKy8vCisvLyAgSW4gb3JkZXIgdG8gZW5hYmxlIG11bHRpcHJvY2Vzc2luZyBleGVjdXRpb24sIHRvb2wgYWN0aW9ucyBhcmUgZXhwZWN0ZWQgdG8KKy8vICBvdXRwdXQgcmVzdWx0IGludG8gdGhlIFRvb2xSZXN1bHRzIHByb3ZpZGVkIGJ5IHRoZSBleGVjdXRvci4gVGhlCisvLyAgYFRvb2xSZXN1bHRzYCBpcyBhbiBpbnRlcmZhY2UgdGhhdCBhYnN0cmFjdHMgaG93IHJlc3VsdHMgYXJlIHN0b3JlZCBlLmcuCisvLyAgaW4tbWVtb3J5IGZvciBzdGFuZGFsb25lIGV4ZWN1dGlvbiBvciBvbi1kaXNrIGZvciBsYXJnZS1zY2FsZSBleGVjdXRpb24uCisvLworLy8gIE5ldyBleGVjdXRvcnMgY2FuIGJlIHJlZ2lzdGVyZWQgYXMgVG9vbEV4ZWN1dG9yUGx1Z2lucyB2aWEgdGhlCisvLyAgYFRvb2xFeGVjdXRvclBsdWdpblJlZ2lzdHJ5YC4gQ0xJIHRvb2xzIGNhbiB1c2UKKy8vICBgY3JlYXRlRXhlY3V0b3JGcm9tQ29tbWFuZExpbmVBcmdzYCB0byBjcmVhdGUgYSBzcGVjaWZpYyByZWdpc3RlcmVkIGV4ZWN1dG9yCisvLyAgYWNjb3JkaW5nIHRvIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19UT09MSU5HX0VYRUNVVElPTl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19FWEVDVVRJT05fSAorCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9Db21tb25PcHRpb25zUGFyc2VyLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9Ub29saW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1JlZ2lzdHJ5LmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgdG9vbGluZyB7CisKKy8vLyBcYnJpZWYgQW4gYWJzdHJhY3Rpb24gZm9yIHRoZSByZXN1bHQgb2YgYSB0b29sIGV4ZWN1dGlvbi4gRm9yIGV4YW1wbGUsIHRoZQorLy8vIHVuZGVybHlpbmcgcmVzdWx0IGNhbiBiZSBpbi1tZW1vcnkgb3Igb24tZGlzay4KKy8vLworLy8vIFJlc3VsdHMgc2hvdWxkIGJlIHN0cmluZyBrZXktdmFsdWUgcGFpcnMuIEZvciBleGFtcGxlLCBhIHJlZmFjdG9yaW5nIHRvb2wKKy8vLyBjYW4gdXNlIHNvdXJjZSBsb2NhdGlvbiBhcyBrZXkgYW5kIGEgcmVwbGFjZW1lbnQgaW4gWUFNTCBmb3JtYXQgYXMgdmFsdWUuCitjbGFzcyBUb29sUmVzdWx0cyB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRvb2xSZXN1bHRzKCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIHZvaWQgYWRkUmVzdWx0KFN0cmluZ1JlZiBLZXksIFN0cmluZ1JlZiBWYWx1ZSkgPSAwOworICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiBBbGxLVlJlc3VsdHMoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBmb3JFYWNoUmVzdWx0KAorICAgICAgbGx2bTo6ZnVuY3Rpb25fcmVmPHZvaWQoU3RyaW5nUmVmIEtleSwgU3RyaW5nUmVmIFZhbHVlKT4gQ2FsbGJhY2spID0gMDsKK307CisKK2NsYXNzIEluTWVtb3J5VG9vbFJlc3VsdHMgOiBwdWJsaWMgVG9vbFJlc3VsdHMgeworcHVibGljOgorICB2b2lkIGFkZFJlc3VsdChTdHJpbmdSZWYgS2V5LCBTdHJpbmdSZWYgVmFsdWUpIG92ZXJyaWRlOworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gQWxsS1ZSZXN1bHRzKCkgb3ZlcnJpZGU7CisgIHZvaWQgZm9yRWFjaFJlc3VsdChsbHZtOjpmdW5jdGlvbl9yZWY8dm9pZChTdHJpbmdSZWYgS2V5LCBTdHJpbmdSZWYgVmFsdWUpPgorICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IEtWUmVzdWx0czsKK307CisKKy8vLyBcYnJpZWYgVGhlIGNvbnRleHQgb2YgYW4gZXhlY3V0aW9uLCBpbmNsdWRpbmcgdGhlIGluZm9ybWF0aW9uIGFib3V0CisvLy8gY29tcGlsYXRpb24gYW5kIHJlc3VsdHMuCitjbGFzcyBFeGVjdXRpb25Db250ZXh0IHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+RXhlY3V0aW9uQ29udGV4dCgpIHt9CisKKyAgLy8vIFxicmllZiBJbml0aWFsaXplcyBhIGNvbnRleHQuIFRoaXMgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgYFJlc3VsdHNgLgorICBleHBsaWNpdCBFeGVjdXRpb25Db250ZXh0KFRvb2xSZXN1bHRzICpSZXN1bHRzKSA6IFJlc3VsdHMoUmVzdWx0cykge30KKworICAvLy8gXGJyaWVmIEFkZHMgYSBLViBwYWlyIHRvIHRoZSByZXN1bHQgY29udGFpbmVyIG9mIHRoaXMgZXhlY3V0aW9uLgorICB2b2lkIHJlcG9ydFJlc3VsdChTdHJpbmdSZWYgS2V5LCBTdHJpbmdSZWYgVmFsdWUpOworCisgIC8vIFJldHVybnMgdGhlIHNvdXJjZSBjb250cm9sIHN5c3RlbSdzIHJldmlzaW9uIG51bWJlciBpZiBhcHBsaWNhYmxlLgorICAvLyBPdGhlcndpc2UgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0UmV2aXNpb24oKSB7IHJldHVybiAiIjsgfQorCisgIC8vIFJldHVybnMgdGhlIGNvcnB1cyBiZWluZyBhbmFseXplZCwgZS5nLiAibGx2bSIgZm9yIHRoZSBMTFZNIGNvZGViYXNlLCBpZgorICAvLyBhcHBsaWNhYmxlLgorICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldENvcnB1cygpIHsgcmV0dXJuICIiOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgY3VycmVudGx5IHByb2Nlc3NlZCBjb21waWxhdGlvbiB1bml0IGlmIGF2YWlsYWJsZS4KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRDdXJyZW50Q29tcGlsYXRpb25Vbml0KCkgeyByZXR1cm4gIiI7IH0KKworcHJpdmF0ZToKKyAgVG9vbFJlc3VsdHMgKlJlc3VsdHM7Cit9OworCisvLy8gXGJyaWVmIEludGVyZmFjZSBmb3IgZXhlY3V0aW5nIGNsYW5nIGZyb250ZW5kIGFjdGlvbnMuCisvLy8KKy8vLyBUaGlzIGNhbiBiZSBleHRlbmRlZCB0byBzdXBwb3J0IHJ1bm5pbmcgdG9vbCBhY3Rpb25zIGluIGRpZmZlcmVudAorLy8vIGV4ZWN1dGlvbiBtb2RlLCBlLmcuIG9uIGEgc3BlY2lmaWMgc2V0IG9mIFRVcyBvciBtYW55IFRVcyBpbiBwYXJhbGxlbC4KKy8vLworLy8vICBOZXcgZXhlY3V0b3JzIGNhbiBiZSByZWdpc3RlcmVkIGFzIFRvb2xFeGVjdXRvclBsdWdpbnMgdmlhIHRoZQorLy8vICBgVG9vbEV4ZWN1dG9yUGx1Z2luUmVnaXN0cnlgLiBDTEkgdG9vbHMgY2FuIHVzZQorLy8vICBgY3JlYXRlRXhlY3V0b3JGcm9tQ29tbWFuZExpbmVBcmdzYCB0byBjcmVhdGUgYSBzcGVjaWZpYyByZWdpc3RlcmVkCisvLy8gIGV4ZWN1dG9yIGFjY29yZGluZyB0byB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KK2NsYXNzIFRvb2xFeGVjdXRvciB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRvb2xFeGVjdXRvcigpIHt9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgc3BlY2lmaWMgZXhlY3V0b3IuCisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldEV4ZWN1dG9yTmFtZSgpIGNvbnN0ID0gMDsKKworICAvLy8gXGJyaWVmIEV4ZWN1dGVzIGVhY2ggYWN0aW9uIHdpdGggYSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50cyBhZGp1c3Rlci4KKyAgdmlydHVhbCBsbHZtOjpFcnJvcgorICBleGVjdXRlKGxsdm06OkFycmF5UmVmPAorICAgICAgICAgIHN0ZDo6cGFpcjxzdGQ6OnVuaXF1ZV9wdHI8RnJvbnRlbmRBY3Rpb25GYWN0b3J5PiwgQXJndW1lbnRzQWRqdXN0ZXI+PgorICAgICAgICAgICAgICBBY3Rpb25zKSA9IDA7CisKKyAgLy8vIFxicmllZiBDb252ZW5pZW50IGZ1bmN0aW9ucyBmb3IgdGhlIGFib3ZlIGBleGVjdXRlYC4KKyAgbGx2bTo6RXJyb3IgZXhlY3V0ZShzdGQ6OnVuaXF1ZV9wdHI8RnJvbnRlbmRBY3Rpb25GYWN0b3J5PiBBY3Rpb24pOworICAvLy8gRXhlY3V0ZXMgYW4gYWN0aW9uIHdpdGggYW4gYXJndW1lbnQgYWRqdXN0ZXIuCisgIGxsdm06OkVycm9yIGV4ZWN1dGUoc3RkOjp1bmlxdWVfcHRyPEZyb250ZW5kQWN0aW9uRmFjdG9yeT4gQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50c0FkanVzdGVyIEFkanVzdGVyKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGV4ZWN1dGlvbiBjb250ZXh0LgorICAvLy8KKyAgLy8vIFRoaXMgc2hvdWxkIGJlIHBhc3NlZCB0byB0b29sIGNhbGxiYWNrcywgYW5kIHRvb2wgY2FsbGJhY2tzIHNob3VsZCByZXBvcnQKKyAgLy8vIHJlc3VsdHMgdmlhIHRoZSByZXR1cm5lZCBjb250ZXh0LgorICB2aXJ0dWFsIEV4ZWN1dGlvbkNvbnRleHQgKmdldEV4ZWN1dGlvbkNvbnRleHQoKSA9IDA7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSByZXN1bHQgY29udGFpbmVyLgorICAvLy8KKyAgLy8vIE5PVEU6IFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBhZnRlciB0aGUgZXhlY3V0aW9uIGZpbmlzaGVzLiBUb29sCisgIC8vLyBjYWxsYmFja3Mgc2hvdWxkIHJlcG9ydCByZXN1bHRzIHZpYSBgRXhlY3V0aW9uQ29udGV4dGAgaW5zdGVhZC4KKyAgdmlydHVhbCBUb29sUmVzdWx0cyAqZ2V0VG9vbFJlc3VsdHMoKSA9IDA7CisKKyAgLy8vIFxicmllZiBNYXAgYSB2aXJ0dWFsIGZpbGUgdG8gYmUgdXNlZCB3aGlsZSBydW5uaW5nIHRoZSB0b29sLgorICAvLy8KKyAgLy8vIFxwYXJhbSBGaWxlUGF0aCBUaGUgcGF0aCBhdCB3aGljaCB0aGUgY29udGVudCB3aWxsIGJlIG1hcHBlZC4KKyAgLy8vIFxwYXJhbSBDb250ZW50IEEgYnVmZmVyIG9mIHRoZSBmaWxlJ3MgY29udGVudC4KKyAgdmlydHVhbCB2b2lkIG1hcFZpcnR1YWxGaWxlKFN0cmluZ1JlZiBGaWxlUGF0aCwgU3RyaW5nUmVmIENvbnRlbnQpID0gMDsKK307CisKKy8vLyBcYnJpZWYgSW50ZXJmYWNlIGZvciBmYWN0b3JpZXMgdGhhdCBjcmVhdGUgc3BlY2lmaWMgZXhlY3V0b3JzLiBUaGlzIGlzIGFsc28KKy8vLyB1c2VkIGFzIGEgcGx1Z2luIHRvIGJlIHJlZ2lzdGVyZWQgaW50byBUb29sRXhlY3V0b3JQbHVnaW5SZWdpc3RyeS4KK2NsYXNzIFRvb2xFeGVjdXRvclBsdWdpbiB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRvb2xFeGVjdXRvclBsdWdpbigpIHt9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gYFRvb2xFeGVjdXRvcmAuCisgIC8vLworICAvLy8gYE9wdGlvbnNQYXJzZXJgIGNhbiBiZSBjb25zdW1lZCAoZS5nLiBtb3ZlZCkgaWYgdGhlIGNyZWF0aW9uIHN1Y2NlZWRzLgorICB2aXJ0dWFsIGxsdm06OkV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxUb29sRXhlY3V0b3I+PgorICBjcmVhdGUoQ29tbW9uT3B0aW9uc1BhcnNlciAmT3B0aW9uc1BhcnNlcikgPSAwOworfTsKKworLy8vIFxicmllZiBUaGlzIGNyZWF0ZXMgYSBUb29sRXhlY3V0b3IgdGhhdCBpcyBpbiB0aGUgZ2xvYmFsIHJlZ2lzdHJ5IGJhc2VkIG9uCisvLy8gY29tbWFuZGxpbmUgYXJndW1lbnRzLgorLy8vCisvLy8gVGhpcyBwaWNrcyB0aGUgcmlnaHQgZXhlY3V0b3IgYmFzZWQgb24gdGhlIGAtLWV4ZWN1dG9yYCBvcHRpb24uIFRoaXMgcGFyc2VzCisvLy8gdGhlIGNvbW1hbmRsaW5lIGFyZ3VtZW50cyB3aXRoIGBDb21tb25PcHRpb25zUGFyc2VyYCwgc28gY2FsbGVyIGRvZXMgbm90CisvLy8gbmVlZCB0byBwYXJzZSBhZ2Fpbi4KKy8vLworLy8vIEJ5IGRlZmF1bHQsIHRoaXMgY3JlYXRlcyBhIGBTdGFuZGFsb25lVG9vbEV4ZWN1dG9yYCAoInN0YW5kYWxvbmUiKSBpZgorLy8vIGAtLWV4ZWN1dG9yYCBpcyBub3QgcHJvdmlkZWQuCitsbHZtOjpFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8VG9vbEV4ZWN1dG9yPj4KK2NyZWF0ZUV4ZWN1dG9yRnJvbUNvbW1hbmRMaW5lQXJncyhpbnQgJmFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmNsOjpPcHRpb25DYXRlZ29yeSAmQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqT3ZlcnZpZXcgPSBudWxscHRyKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK2xsdm06OkV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxUb29sRXhlY3V0b3I+PgorY3JlYXRlRXhlY3V0b3JGcm9tQ29tbWFuZExpbmVBcmdzSW1wbChpbnQgJmFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpjbDo6T3B0aW9uQ2F0ZWdvcnkgJkNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpPdmVydmlldyA9IG51bGxwdHIpOworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSB0b29saW5nCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfVE9PTElOR19FWEVDVVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9GaWxlTWF0Y2hUcmllLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0ZpbGVNYXRjaFRyaWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGYzMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9GaWxlTWF0Y2hUcmllLmgKQEAgLTAsMCArMSw4OSBAQAorLy89PT0tIEZpbGVNYXRjaFRyaWUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGltcGxlbWVudHMgYSBtYXRjaCB0cmllIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGZpbGUgaW4gYSBjb21waWxhdGlvbgorLy8gIGRhdGFiYXNlIGJhc2VkIG9uIGEgZ2l2ZW4gcGF0aCBpbiB0aGUgcHJlc2VuY2Ugb2Ygc3ltbGlua3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfRklMRU1BVENIVFJJRV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19GSUxFTUFUQ0hUUklFX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgdG9vbGluZyB7CisKK2NsYXNzIEZpbGVNYXRjaFRyaWVOb2RlOworCitzdHJ1Y3QgUGF0aENvbXBhcmF0b3IgeworICB2aXJ0dWFsIH5QYXRoQ29tcGFyYXRvcigpID0gZGVmYXVsdDsKKworICB2aXJ0dWFsIGJvb2wgZXF1aXZhbGVudChTdHJpbmdSZWYgRmlsZUEsIFN0cmluZ1JlZiBGaWxlQikgY29uc3QgPSAwOworfTsKKworLy8vIFxicmllZiBBIHRyaWUgdG8gZWZmaWNpZW50bHkgbWF0Y2ggYWdhaW5zdCB0aGUgZW50cmllcyBvZiB0aGUgY29tcGlsYXRpb24KKy8vLyBkYXRhYmFzZSBpbiBvcmRlciBvZiBtYXRjaGluZyBzdWZmaXggbGVuZ3RoLgorLy8vCisvLy8gV2hlbiBhIGNsYW5nIHRvb2wgaXMgc3VwcG9zZWQgdG8gb3BlcmF0ZSBvbiBhIHNwZWNpZmljIGZpbGUsIHdlIGhhdmUgdG8KKy8vLyBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUgaW4gdGhlIGNvbXBpbGF0aW9uIGRhdGFiYXNlLiBBbHRob3VnaCBlbnRyaWVzCisvLy8gaW4gdGhlIGNvbXBpbGF0aW9uIGRhdGFiYXNlIGFyZSBrZXllZCBieSBmaWxlbmFtZSwgYSBzaW1wbGUgc3RyaW5nIG1hdGNoCisvLy8gaXMgaW5zdWZmaWNpZW50IGJlY2F1c2Ugb2Ygc3ltbGlua3MuIENvbW1vbmx5LCBhIHByb2plY3QgaGllcmFyY2h5IGxvb2tzCisvLy8gbGlrZSB0aGlzOgorLy8vICAgLzxwcm9qZWN0LXJvb3Q+L3NyYy88cGF0aD4vPHNvbWVmaWxlPi5jYyAgICAgICh1c2VkIGFzIGlucHV0IGZvciB0aGUgdG9vbCkKKy8vLyAgIC88cHJvamVjdC1yb290Pi9idWlsZC88c3ltbGluay10by1zcmM+LzxwYXRoPi88c29tZWZpbGU+LmNjIChzdG9yZWQgaW4gREIpCisvLy8KKy8vLyBGdXJ0aGVybW9yZSwgdGhlcmUgbWlnaHQgYmUgc3ltbGlua3MgaW5zaWRlIHRoZSBzb3VyY2UgZm9sZGVyIG9yIGluc2lkZSB0aGUKKy8vLyBkYXRhYmFzZSwgc28gdGhhdCB0aGUgc2FtZSBzb3VyY2UgZmlsZSBpcyB0cmFuc2xhdGVkIHdpdGggZGlmZmVyZW50IGJ1aWxkCisvLy8gb3B0aW9ucy4KKy8vLworLy8vIEZvciBhIGdpdmVuIGlucHV0IGZpbGUsIHRoZSBcYyBGaWxlTWF0Y2hUcmllIGZpbmRzIGl0cyBlbnRyaWVzIGluIG9yZGVyCisvLy8gb2YgbWF0Y2hpbmcgc3VmZml4IGxlbmd0aC4gRm9yIGVhY2ggc3VmZml4IGxlbmd0aCwgdGhlcmUgbWlnaHQgYmUgb25lIG9yCisvLy8gbW9yZSBlbnRyaWVzIGluIHRoZSBkYXRhYmFzZS4gRm9yIGVhY2ggb2YgdGhvc2UgZW50cmllcywgaXQgY2FsbHMKKy8vLyBcYyBsbHZtOjpzeXM6OmZzOjplcXVpdmFsZW50KCkgKGluamVjdGVkIGFzIFxjIFBhdGhDb21wYXJhdG9yKS4gVGhlcmUgbWlnaHQKKy8vLyBiZSB6ZXJvIG9yIG1vcmUgZW50cmllcyB3aXRoIHRoZSBzYW1lIG1hdGNoaW5nIHN1ZmZpeCBsZW5ndGggdGhhdCBhcmUKKy8vLyBlcXVpdmFsZW50IHRvIHRoZSBpbnB1dCBmaWxlLiBUaHJlZSBjYXNlcyBhcmUgZGlzdGluZ3Vpc2hlZDoKKy8vLyAwICBlcXVpdmFsZW50IGZpbGVzOiBDb250aW51ZSB3aXRoIHRoZSBuZXh0IHN1ZmZpeCBsZW5ndGguCisvLy8gMSAgZXF1aXZhbGVudCBmaWxlOiAgQmVzdCBtYXRjaCBmb3VuZCwgcmV0dXJuIGl0LgorLy8vID4xIGVxdWl2YWxlbnQgZmlsZXM6IE1hdGNoIGlzIGFtYmlndW91cywgcmV0dXJuIGVycm9yLgorY2xhc3MgRmlsZU1hdGNoVHJpZSB7CitwdWJsaWM6CisgIEZpbGVNYXRjaFRyaWUoKTsKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIG5ldyBcYyBGaWxlTWF0Y2hUcmllIHdpdGggdGhlIGdpdmVuIFxjIFBhdGhDb21wYXJhdG9yLgorICAvLy8KKyAgLy8vIFRoZSBcYyBGaWxlTWF0Y2hUcmllIHRha2VzIG93bmVyc2hpcCBvZiAnQ29tcGFyYXRvcicuIFVzZWQgZm9yIHRlc3RpbmcuCisgIEZpbGVNYXRjaFRyaWUoUGF0aENvbXBhcmF0b3IqIENvbXBhcmF0b3IpOworCisgIH5GaWxlTWF0Y2hUcmllKCk7CisKKyAgLy8vIFxicmllZiBJbnNlcnQgYSBuZXcgYWJzb2x1dGUgcGF0aC4gUmVsYXRpdmUgcGF0aHMgYXJlIGlnbm9yZWQuCisgIHZvaWQgaW5zZXJ0KFN0cmluZ1JlZiBOZXdQYXRoKTsKKworICAvLy8gXGJyaWVmIEZpbmRzIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUgaW4gdGhpcyB0cmllLgorICAvLy8KKyAgLy8vIFJldHVybnMgZmlsZSBuYW1lIHN0b3JlZCBpbiB0aGlzIHRyaWUgdGhhdCBpcyBlcXVpdmFsZW50IHRvICdGaWxlTmFtZScKKyAgLy8vIGFjY29yZGluZyB0byAnQ29tcGFyYXRvcicsIGlmIGl0IGNhbiBiZSB1bmlxdWVseSBpZGVudGlmaWVkLiBJZiB0aGVyZQorICAvLy8gYXJlIG5vIG1hdGNoZXMgYW4gZW1wdHkgXGMgU3RyaW5nUmVmIGlzIHJldHVybmVkLiBJZiB0aGVyZSBhcmUgYW1iaWdpb3VzCisgIC8vLyBtYXRjaGVzLCBhbiBlbXB0eSBcYyBTdHJpbmdSZWYgaXMgcmV0dXJuZWQgYW5kIGEgY29ycmVzcG9uZGluZyBtZXNzYWdlCisgIC8vLyB3cml0dGVuIHRvICdFcnJvcicuCisgIFN0cmluZ1JlZiBmaW5kRXF1aXZhbGVudChTdHJpbmdSZWYgRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmRXJyb3IpIGNvbnN0OworCitwcml2YXRlOgorICBGaWxlTWF0Y2hUcmllTm9kZSAqUm9vdDsKKyAgc3RkOjp1bmlxdWVfcHRyPFBhdGhDb21wYXJhdG9yPiBDb21wYXJhdG9yOworfTsKKworfSAvLyBuYW1lc3BhY2UgdG9vbGluZworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfVE9PTElOR19GSUxFTUFUQ0hUUklFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvRml4SXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvRml4SXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWU1MDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9GaXhJdC5oCkBAIC0wLDAgKzEsNzkgQEAKKy8vPT09LS0tIEZpeEl0LmggLSBGaXhJdCBIaW50IHV0aWxpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBlYXNlIHNvdXJjZSByZXdyaXRpbmcgZnJvbSBBU1Qtbm9kZXMuCisvLworLy8gIEV4YW1wbGUgc3dhcHBpbmcgQSBhbmQgQiBleHByZXNzaW9uczoKKy8vCisvLyAgICBFeHByICpBLCAqQjsKKy8vICAgIHRvb2xpbmc6OmZpeGl0OjpjcmVhdGVSZXBsYWNlbWVudCgqQSwgKkIpOworLy8gICAgdG9vbGluZzo6Zml4aXQ6OmNyZWF0ZVJlcGxhY2VtZW50KCpCLCAqQSk7CisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfRklYSVRfSAorI2RlZmluZSBMTFZNX0NMQU5HX1RPT0xJTkdfRklYSVRfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVENvbnRleHQuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSB0b29saW5nIHsKK25hbWVzcGFjZSBmaXhpdCB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CitTdHJpbmdSZWYgZ2V0VGV4dChTb3VyY2VSYW5nZSBSYW5nZSwgY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCk7CisKKy8vLyBcYnJpZWYgUmV0dXJucyB0aGUgU291cmNlUmFuZ2Ugb2YgYSBTb3VyY2VSYW5nZS4gVGhpcyBpZGVudGl0eSBmdW5jdGlvbiBpcworLy8vICAgICAgICB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgdGVtcGxhdGUgYWJzdHJhY3Rpb25zLgoraW5saW5lIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKGNvbnN0IFNvdXJjZVJhbmdlICZSYW5nZSkgeyByZXR1cm4gUmFuZ2U7IH0KKworLy8vIFxicmllZiBSZXR1cm5zIHRoZSBTb3VyY2VSYW5nZSBvZiB0aGUgdG9rZW4gYXQgTG9jYXRpb24gXHAgTG9jLgoraW5saW5lIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKGNvbnN0IFNvdXJjZUxvY2F0aW9uICZMb2MpIHsKKyAgcmV0dXJuIFNvdXJjZVJhbmdlKExvYyk7Cit9CisKKy8vLyBcYnJpZWYgUmV0dXJucyB0aGUgU291cmNlUmFuZ2Ugb2YgYW4gZ2l2ZW4gTm9kZS4gXHAgTm9kZSBpcyB0eXBpY2FsbHkgYQorLy8vICAgICAgICAnU3RtdCcsICdFeHByJyBvciBhICdEZWNsJy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZShjb25zdCBUICZOb2RlKSB7CisgIHJldHVybiBOb2RlLmdldFNvdXJjZVJhbmdlKCk7Cit9Cit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gXGJyaWVmIFJldHVybnMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIFxwIE5vZGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1N0cmluZ1JlZiBnZXRUZXh0KGNvbnN0IFQgJk5vZGUsIGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpnZXRUZXh0KGludGVybmFsOjpnZXRTb3VyY2VSYW5nZShOb2RlKSwgQ29udGV4dCk7Cit9CisKKy8vIFxicmllZiBSZXR1cm5zIGEgRml4SXRIaW50IHRvIHJlbW92ZSBccCBOb2RlLgorLy8gVE9ETzogQWRkIHN1cHBvcnQgZm9yIHJlbGF0ZWQgc3ludGFjdGljYWwgZWxlbWVudHMgKGkuZS4gY29tbWVudHMsIC4uLikuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRml4SXRIaW50IGNyZWF0ZVJlbW92YWwoY29uc3QgVCAmTm9kZSkgeworICByZXR1cm4gRml4SXRIaW50OjpDcmVhdGVSZW1vdmFsKGludGVybmFsOjpnZXRTb3VyY2VSYW5nZShOb2RlKSk7Cit9CisKKy8vIFxicmllZiBSZXR1cm5zIGEgRml4SXRIaW50IHRvIHJlcGxhY2UgXHAgRGVzdGluYXRpb24gYnkgXHAgU291cmNlLgordGVtcGxhdGUgPHR5cGVuYW1lIEQsIHR5cGVuYW1lIFM+CitGaXhJdEhpbnQgY3JlYXRlUmVwbGFjZW1lbnQoY29uc3QgRCAmRGVzdGluYXRpb24sIGNvbnN0IFMgJlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCkgeworICByZXR1cm4gRml4SXRIaW50OjpDcmVhdGVSZXBsYWNlbWVudChpbnRlcm5hbDo6Z2V0U291cmNlUmFuZ2UoRGVzdGluYXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUZXh0KFNvdXJjZSwgQ29udGV4dCkpOworfQorCisvLyBcYnJpZWYgUmV0dXJucyBhIEZpeEl0SGludCB0byByZXBsYWNlIFxwIERlc3RpbmF0aW9uIGJ5IFxwIFNvdXJjZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEPgorRml4SXRIaW50IGNyZWF0ZVJlcGxhY2VtZW50KGNvbnN0IEQgJkRlc3RpbmF0aW9uLCBTdHJpbmdSZWYgU291cmNlKSB7CisgIHJldHVybiBGaXhJdEhpbnQ6OkNyZWF0ZVJlcGxhY2VtZW50KGludGVybmFsOjpnZXRTb3VyY2VSYW5nZShEZXN0aW5hdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBmaXhpdAorfSAvLyBlbmQgbmFtZXNwYWNlIHRvb2xpbmcKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19UT09MSU5HX0ZJWElOVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0pTT05Db21waWxhdGlvbkRhdGFiYXNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0pTT05Db21waWxhdGlvbkRhdGFiYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0NzQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvSlNPTkNvbXBpbGF0aW9uRGF0YWJhc2UuaApAQCAtMCwwICsxLDE0MyBAQAorLy89PT0tIEpTT05Db21waWxhdGlvbkRhdGFiYXNlLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhlIEpTT05Db21waWxhdGlvbkRhdGFiYXNlIGZpbmRzIGNvbXBpbGF0aW9uIGRhdGFiYXNlcyBzdXBwbGllZCBhcyBhIGZpbGUKKy8vICAnY29tcGlsZV9jb21tYW5kcy5qc29uJy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfVE9PTElOR19KU09OQ09NUElMQVRJT05EQVRBQkFTRV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19KU09OQ09NUElMQVRJT05EQVRBQkFTRV9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9Db21waWxhdGlvbkRhdGFiYXNlLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9GaWxlTWF0Y2hUcmllLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NvdXJjZU1nci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ZQU1MUGFyc2VyLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSB0b29saW5nIHsKKworLy8vIFxicmllZiBBIEpTT04gYmFzZWQgY29tcGlsYXRpb24gZGF0YWJhc2UuCisvLy8KKy8vLyBKU09OIGNvbXBpbGF0aW9uIGRhdGFiYXNlIGZpbGVzIG11c3QgY29udGFpbiBhIGxpc3Qgb2YgSlNPTiBvYmplY3RzIHdoaWNoCisvLy8gcHJvdmlkZSB0aGUgY29tbWFuZCBsaW5lcyBpbiB0aGUgYXR0cmlidXRlcyAnZGlyZWN0b3J5JywgJ2NvbW1hbmQnLAorLy8vICdhcmd1bWVudHMnIGFuZCAnZmlsZSc6CisvLy8gWworLy8vICAgeyAiZGlyZWN0b3J5IjogIjx3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgY29tcGlsZT4iLAorLy8vICAgICAiY29tbWFuZCI6ICI8Y29tcGlsZSBjb21tYW5kIGxpbmU+IiwKKy8vLyAgICAgImZpbGUiOiAiPHBhdGggdG8gc291cmNlIGZpbGU+IgorLy8vICAgfSwKKy8vLyAgIHsgImRpcmVjdG9yeSI6ICI8d29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIGNvbXBpbGU+IiwKKy8vLyAgICAgImFyZ3VtZW50cyI6IFsiPHJhdz4iLCAiPGNvbW1hbmQ+IiAiPGxpbmU+IiAiPHBhcmFtZXRlcnM+Il0sCisvLy8gICAgICJmaWxlIjogIjxwYXRoIHRvIHNvdXJjZSBmaWxlPiIKKy8vLyAgIH0sCisvLy8gICAuLi4KKy8vLyBdCisvLy8gRWFjaCBvYmplY3QgZW50cnkgZGVmaW5lcyBvbmUgY29tcGlsZSBhY3Rpb24uIFRoZSBzcGVjaWZpZWQgZmlsZSBpcworLy8vIGNvbnNpZGVyZWQgdG8gYmUgdGhlIG1haW4gc291cmNlIGZpbGUgZm9yIHRoZSB0cmFuc2xhdGlvbiB1bml0LgorLy8vCisvLy8gJ2NvbW1hbmQnIGlzIGEgZnVsbCBjb21tYW5kIGxpbmUgdGhhdCB3aWxsIGJlIHVuZXNjYXBlZC4KKy8vLworLy8vICdhcmd1bWVudHMnIGlzIGEgbGlzdCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRoYXQgd2lsbCBub3QgYmUgdW5lc2NhcGVkLgorLy8vCisvLy8gSlNPTiBjb21waWxhdGlvbiBkYXRhYmFzZXMgY2FuIGZvciBleGFtcGxlIGJlIGdlbmVyYXRlZCBpbiBDTWFrZSBwcm9qZWN0cworLy8vIGJ5IHNldHRpbmcgdGhlIGZsYWcgLURDTUFLRV9FWFBPUlRfQ09NUElMRV9DT01NQU5EUy4KK2VudW0gY2xhc3MgSlNPTkNvbW1hbmRMaW5lU3ludGF4IHsgV2luZG93cywgR251LCBBdXRvRGV0ZWN0IH07CitjbGFzcyBKU09OQ29tcGlsYXRpb25EYXRhYmFzZSA6IHB1YmxpYyBDb21waWxhdGlvbkRhdGFiYXNlIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBMb2FkcyBhIEpTT04gY29tcGlsYXRpb24gZGF0YWJhc2UgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUuCisgIC8vLworICAvLy8gUmV0dXJucyBOVUxMIGFuZCBzZXRzIEVycm9yTWVzc2FnZSBpZiB0aGUgZGF0YWJhc2UgY291bGQgbm90IGJlCisgIC8vLyBsb2FkZWQgZnJvbSB0aGUgZ2l2ZW4gZmlsZS4KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxKU09OQ29tcGlsYXRpb25EYXRhYmFzZT4KKyAgbG9hZEZyb21GaWxlKFN0cmluZ1JlZiBGaWxlUGF0aCwgc3RkOjpzdHJpbmcgJkVycm9yTWVzc2FnZSwKKyAgICAgICAgICAgICAgIEpTT05Db21tYW5kTGluZVN5bnRheCBTeW50YXgpOworCisgIC8vLyBcYnJpZWYgTG9hZHMgYSBKU09OIGNvbXBpbGF0aW9uIGRhdGFiYXNlIGZyb20gYSBkYXRhIGJ1ZmZlci4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIE5VTEwgYW5kIHNldHMgRXJyb3JNZXNzYWdlIGlmIHRoZSBkYXRhYmFzZSBjb3VsZCBub3QgYmUgbG9hZGVkLgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEpTT05Db21waWxhdGlvbkRhdGFiYXNlPgorICBsb2FkRnJvbUJ1ZmZlcihTdHJpbmdSZWYgRGF0YWJhc2VTdHJpbmcsIHN0ZDo6c3RyaW5nICZFcnJvck1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIEpTT05Db21tYW5kTGluZVN5bnRheCBTeW50YXgpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhbGwgY29tcGlsZSBjb21tYW5kcyBpbiB3aGljaCB0aGUgc3BlY2lmaWVkIGZpbGUgd2FzCisgIC8vLyBjb21waWxlZC4KKyAgLy8vCisgIC8vLyBGSVhNRTogQ3VycmVudGx5IEZpbGVQYXRoIG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aCBpbnNpZGUgdGhlCisgIC8vLyBzb3VyY2UgZGlyZWN0b3J5IHdoaWNoIGRvZXMgbm90IGhhdmUgc3ltbGlua3MgcmVzb2x2ZWQuCisgIHN0ZDo6dmVjdG9yPENvbXBpbGVDb21tYW5kPgorICBnZXRDb21waWxlQ29tbWFuZHMoU3RyaW5nUmVmIEZpbGVQYXRoKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIGZpbGVzIGF2YWlsYWJsZSBpbiB0aGUgY29tcGlsYXRpb24gZGF0YWJhc2UuCisgIC8vLworICAvLy8gVGhlc2UgYXJlIHRoZSAnZmlsZScgZW50cmllcyBvZiB0aGUgSlNPTiBvYmplY3RzLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0QWxsRmlsZXMoKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgYWxsIGNvbXBpbGUgY29tbWFuZHMgZm9yIGFsbCB0aGUgZmlsZXMgaW4gdGhlIGNvbXBpbGF0aW9uCisgIC8vLyBkYXRhYmFzZS4KKyAgc3RkOjp2ZWN0b3I8Q29tcGlsZUNvbW1hbmQ+IGdldEFsbENvbXBpbGVDb21tYW5kcygpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIENvbnN0cnVjdHMgYSBKU09OIGNvbXBpbGF0aW9uIGRhdGFiYXNlIG9uIGEgbWVtb3J5IGJ1ZmZlci4KKyAgSlNPTkNvbXBpbGF0aW9uRGF0YWJhc2Uoc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT05Db21tYW5kTGluZVN5bnRheCBTeW50YXgpCisgICAgICA6IERhdGFiYXNlKHN0ZDo6bW92ZShEYXRhYmFzZSkpLCBTeW50YXgoU3ludGF4KSwKKyAgICAgICAgWUFNTFN0cmVhbSh0aGlzLT5EYXRhYmFzZS0+Z2V0QnVmZmVyKCksIFNNKSB7fQorCisgIC8vLyBcYnJpZWYgUGFyc2VzIHRoZSBkYXRhYmFzZSBmaWxlIGFuZCBjcmVhdGVzIHRoZSBpbmRleC4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIHdoZXRoZXIgcGFyc2luZyBzdWNjZWVkZWQuIFNldHMgRXJyb3JNZXNzYWdlIGlmIHBhcnNpbmcKKyAgLy8vIGZhaWxlZC4KKyAgYm9vbCBwYXJzZShzdGQ6OnN0cmluZyAmRXJyb3JNZXNzYWdlKTsKKworICAvLyBUdXBsZSAoZGlyZWN0b3J5LCBmaWxlbmFtZSwgY29tbWFuZGxpbmUsIG91dHB1dCkgd2hlcmUgJ2NvbW1hbmRsaW5lJworICAvLyBwb2ludHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc2NhbGFyIG5vZGVzIGluIHRoZSBZQU1MIHN0cmVhbS4KKyAgLy8gSWYgdGhlIGNvbW1hbmQgbGluZSBjb250YWlucyBhIHNpbmdsZSBhcmd1bWVudCwgaXQgaXMgYSBzaGVsbC1lc2NhcGVkCisgIC8vIGNvbW1hbmQgbGluZS4KKyAgLy8gT3RoZXJ3aXNlLCBlYWNoIGVudHJ5IGluIHRoZSBjb21tYW5kIGxpbmUgdmVjdG9yIGlzIGEgbGl0ZXJhbAorICAvLyBhcmd1bWVudCB0byB0aGUgY29tcGlsZXIuCisgIC8vIFRoZSBvdXRwdXQgZmllbGQgbWF5IGJlIGEgbnVsbHB0ci4KKyAgdXNpbmcgQ29tcGlsZUNvbW1hbmRSZWYgPQorICAgICAgc3RkOjp0dXBsZTxsbHZtOjp5YW1sOjpTY2FsYXJOb2RlICosIGxsdm06OnlhbWw6OlNjYWxhck5vZGUgKiwKKyAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bGx2bTo6eWFtbDo6U2NhbGFyTm9kZSAqPiwKKyAgICAgICAgICAgICAgICAgbGx2bTo6eWFtbDo6U2NhbGFyTm9kZSAqPjsKKworICAvLy8gXGJyaWVmIENvbnZlcnRzIHRoZSBnaXZlbiBhcnJheSBvZiBDb21waWxlQ29tbWFuZFJlZnMgdG8gQ29tcGlsZUNvbW1hbmRzLgorICB2b2lkIGdldENvbW1hbmRzKEFycmF5UmVmPENvbXBpbGVDb21tYW5kUmVmPiBDb21tYW5kc1JlZiwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDb21waWxlQ29tbWFuZD4gJkNvbW1hbmRzKSBjb25zdDsKKworICAvLyBNYXBzIGZpbGUgcGF0aHMgdG8gdGhlIGNvbXBpbGUgY29tbWFuZCBsaW5lcyBmb3IgdGhhdCBmaWxlLgorICBsbHZtOjpTdHJpbmdNYXA8c3RkOjp2ZWN0b3I8Q29tcGlsZUNvbW1hbmRSZWY+PiBJbmRleEJ5RmlsZTsKKworICAvLy8gQWxsIHRoZSBjb21waWxlIGNvbW1hbmRzIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgd2VyZSBwcm92aWRlZCBpbiB0aGUKKyAgLy8vIEpTT04gc3RyZWFtLgorICBzdGQ6OnZlY3RvcjxDb21waWxlQ29tbWFuZFJlZj4gQWxsQ29tbWFuZHM7CisKKyAgRmlsZU1hdGNoVHJpZSBNYXRjaFRyaWU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gRGF0YWJhc2U7CisgIEpTT05Db21tYW5kTGluZVN5bnRheCBTeW50YXg7CisgIGxsdm06OlNvdXJjZU1nciBTTTsKKyAgbGx2bTo6eWFtbDo6U3RyZWFtIFlBTUxTdHJlYW07Cit9OworCit9IC8vIG5hbWVzcGFjZSB0b29saW5nCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19UT09MSU5HX0pTT05DT01QSUxBVElPTkRBVEFCQVNFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzk1YzNiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy5oCkBAIC0wLDAgKzEsMTAwIEBACisvLz09PS0tLSBSZWZhY3RvcmluZy5oIC0gRnJhbWV3b3JrIGZvciBjbGFuZyByZWZhY3RvcmluZyB0b29scyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBJbnRlcmZhY2VzIHN1cHBvcnRpbmcgcmVmYWN0b3JpbmdzIHRoYXQgc3BhbiBtdWx0aXBsZSB0cmFuc2xhdGlvbiB1bml0cy4KKy8vICBXaGlsZSBzaW5nbGUgdHJhbnNsYXRpb24gdW5pdCByZWZhY3RvcmluZ3MgYXJlIHN1cHBvcnRlZCB2aWEgdGhlIFJld3JpdGVyLAorLy8gIHdoZW4gcmVmYWN0b3JpbmcgbXVsdGlwbGUgdHJhbnNsYXRpb24gdW5pdHMgY2hhbmdlcyBtdXN0IGJlIHN0b3JlZCBpbiBhCisvLyAgU291cmNlTWFuYWdlciBpbmRlcGVuZGVudCBmb3JtLCBkdXBsaWNhdGUgY2hhbmdlcyBuZWVkIHRvIGJlIHJlbW92ZWQsIGFuZAorLy8gIGFsbCBjaGFuZ2VzIG11c3QgYmUgYXBwbGllZCBhdCBvbmNlIGF0IHRoZSBlbmQgb2YgdGhlIHJlZmFjdG9yaW5nIHNvIHRoYXQKKy8vICB0aGUgY29kZSBpcyBhbHdheXMgcGFyc2VhYmxlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SSU5HX0gKKyNkZWZpbmUgTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SSU5HX0gKKworI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvQ29yZS9SZXBsYWNlbWVudC5oIgorI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvVG9vbGluZy5oIgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBjbGFuZyB7CisKK2NsYXNzIFJld3JpdGVyOworCituYW1lc3BhY2UgdG9vbGluZyB7CisKKy8vLyBcYnJpZWYgQSB0b29sIHRvIHJ1biByZWZhY3RvcmluZ3MuCisvLy8KKy8vLyBUaGlzIGlzIGEgcmVmYWN0b3Jpbmcgc3BlY2lmaWMgdmVyc2lvbiBvZiBcc2VlIENsYW5nVG9vbC4gRnJvbnRlbmRBY3Rpb25zCisvLy8gcGFzc2VkIHRvIHJ1bigpIGFuZCBydW5BbmRTYXZlKCkgc2hvdWxkIGFkZCByZXBsYWNlbWVudHMgdG8KKy8vLyBnZXRSZXBsYWNlbWVudHMoKS4KK2NsYXNzIFJlZmFjdG9yaW5nVG9vbCA6IHB1YmxpYyBDbGFuZ1Rvb2wgeworcHVibGljOgorICAvLy8gXHNlZSBDbGFuZ1Rvb2w6OkNsYW5nVG9vbC4KKyAgUmVmYWN0b3JpbmdUb29sKGNvbnN0IENvbXBpbGF0aW9uRGF0YWJhc2UgJkNvbXBpbGF0aW9ucywKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBTb3VyY2VQYXRocywKKyAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQQ0hDb250YWluZXJPcGVyYXRpb25zPiBQQ0hDb250YWluZXJPcHMgPQorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8UENIQ29udGFpbmVyT3BlcmF0aW9ucz4oKSk7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBmaWxlIHBhdGggdG8gcmVwbGFjZW1lbnRzIG1hcCB0byB3aGljaCByZXBsYWNlbWVudHMKKyAgLy8vIHNob3VsZCBiZSBhZGRlZCBkdXJpbmcgdGhlIHJ1biBvZiB0aGUgdG9vbC4KKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFJlcGxhY2VtZW50cz4gJmdldFJlcGxhY2VtZW50cygpOworCisgIC8vLyBcYnJpZWYgQ2FsbCBydW4oKSwgYXBwbHkgYWxsIGdlbmVyYXRlZCByZXBsYWNlbWVudHMsIGFuZCBpbW1lZGlhdGVseSBzYXZlCisgIC8vLyB0aGUgcmVzdWx0cyB0byBkaXNrLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIDAgdXBvbiBzdWNjZXNzLiBOb24temVybyB1cG9uIGZhaWx1cmUuCisgIGludCBydW5BbmRTYXZlKEZyb250ZW5kQWN0aW9uRmFjdG9yeSAqQWN0aW9uRmFjdG9yeSk7CisKKyAgLy8vIFxicmllZiBBcHBseSBhbGwgc3RvcmVkIHJlcGxhY2VtZW50cyB0byB0aGUgZ2l2ZW4gUmV3cml0ZXIuCisgIC8vLworICAvLy8gRmlsZVRvUmVwbGFjZXMgd2lsbCBiZSBkZWR1cGxpY2F0ZWQgd2l0aCBgZ3JvdXBSZXBsYWNlbWVudHNCeUZpbGVgIGJlZm9yZQorICAvLy8gYXBwbGljYXRpb24uCisgIC8vLworICAvLy8gUmVwbGFjZW1lbnQgYXBwbGljYXRpb25zIGhhcHBlbiBpbmRlcGVuZGVudGx5IG9mIHRoZSBzdWNjZXNzIG9mIG90aGVyCisgIC8vLyBhcHBsaWNhdGlvbnMuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBhbGwgcmVwbGFjZW1lbnRzIGFwcGx5LiBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgYXBwbHlBbGxSZXBsYWNlbWVudHMoUmV3cml0ZXIgJlJld3JpdGUpOworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIFdyaXRlIGFsbCByZWZhY3RvcmVkIGZpbGVzIHRvIGRpc2suCisgIGludCBzYXZlUmV3cml0dGVuRmlsZXMoUmV3cml0ZXIgJlJld3JpdGUpOworCitwcml2YXRlOgorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUmVwbGFjZW1lbnRzPiBGaWxlVG9SZXBsYWNlczsKK307CisKKy8vLyBcYnJpZWYgR3JvdXBzIFxwIFJlcGxhY2VzIGJ5IHRoZSBmaWxlIHBhdGggYW5kIGFwcGxpZXMgZWFjaCBncm91cCBvZgorLy8vIFJlcGxhY2VtZW50cyBvbiB0aGUgcmVsYXRlZCBmaWxlIGluIFxwIFJld3JpdGVyLiBJbiBhZGRpdGlvbiB0byBhcHBseWluZworLy8vIGdpdmVuIFJlcGxhY2VtZW50cywgdGhpcyBmdW5jdGlvbiBhbHNvIGZvcm1hdHMgdGhlIGNoYW5nZWQgY29kZS4KKy8vLworLy8vIFxwcmUgUmVwbGFjZW1lbnRzIG11c3QgYmUgY29uZmxpY3QtZnJlZS4KKy8vLworLy8vIEZpbGVUb1JlcGxhY2VzIHdpbGwgYmUgZGVkdXBsaWNhdGVkIHdpdGggYGdyb3VwUmVwbGFjZW1lbnRzQnlGaWxlYCBiZWZvcmUKKy8vLyBhcHBsaWNhdGlvbi4KKy8vLworLy8vIFJlcGxhY2VtZW50IGFwcGxpY2F0aW9ucyBoYXBwZW4gaW5kZXBlbmRlbnRseSBvZiB0aGUgc3VjY2VzcyBvZiBvdGhlcgorLy8vIGFwcGxpY2F0aW9ucy4KKy8vLworLy8vIFxwYXJhbVtpbl0gRmlsZVRvUmVwbGFjZXMgUmVwbGFjZW1lbnRzIChncm91cGVkIGJ5IGZpbGVzKSB0byBhcHBseS4KKy8vLyBccGFyYW1baW5dIFJld3JpdGUgVGhlIGBSZXdyaXR0ZXJgIHRvIGFwcGx5IHJlcGxhY2VtZW50cyBvbi4KKy8vLyBccGFyYW1baW5dIFN0eWxlIFRoZSBzdHlsZSBuYW1lIHVzZWQgZm9yIHJlZm9ybWF0dGluZy4gU2VlIGBgYGdldFN0eWxlYGBgIGluCisvLy8gImluY2x1ZGUvY2xhbmcvRm9ybWF0L0Zvcm1hdC5oIiBmb3IgYWxsIHBvc3NpYmxlIHN0eWxlIGZvcm1zLgorLy8vCisvLy8gXHJldHVybnMgdHJ1ZSBpZiBhbGwgcmVwbGFjZW1lbnRzIGFwcGxpZWQgYW5kIGZvcm1hdHRlZC4gZmFsc2Ugb3RoZXJ3aXNlLgorYm9vbCBmb3JtYXRBbmRBcHBseUFsbFJlcGxhY2VtZW50cygKKyAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUmVwbGFjZW1lbnRzPiAmRmlsZVRvUmVwbGFjZXMsCisgICAgUmV3cml0ZXIgJlJld3JpdGUsIFN0cmluZ1JlZiBTdHlsZSA9ICJmaWxlIik7CisKK30gLy8gZW5kIG5hbWVzcGFjZSB0b29saW5nCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUklOR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL0FTVFNlbGVjdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9BU1RTZWxlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTAyYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9BU1RTZWxlY3Rpb24uaApAQCAtMCwwICsxLDE1NSBAQAorLy89PT0tLS0gQVNUU2VsZWN0aW9uLmggLSBDbGFuZyByZWZhY3RvcmluZyBsaWJyYXJ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfQVNUX1NFTEVDVElPTl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9BU1RfU0VMRUNUSU9OX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RUeXBlVHJhaXRzLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBBU1RDb250ZXh0OworCituYW1lc3BhY2UgdG9vbGluZyB7CisKK2VudW0gY2xhc3MgU291cmNlU2VsZWN0aW9uS2luZCB7CisgIC8vLyBBIG5vZGUgdGhhdCdzIG5vdCBzZWxlY3RlZC4KKyAgTm9uZSwKKworICAvLy8gQSBub2RlIHRoYXQncyBjb25zaWRlcmVkIHRvIGJlIHNlbGVjdGVkIGJlY2F1c2UgdGhlIHdob2xlIHNlbGVjdGlvbiByYW5nZQorICAvLy8gaXMgaW5zaWRlIG9mIGl0cyBzb3VyY2UgcmFuZ2UuCisgIENvbnRhaW5zU2VsZWN0aW9uLAorICAvLy8gQSBub2RlIHRoYXQncyBjb25zaWRlcmVkIHRvIGJlIHNlbGVjdGVkIGJlY2F1c2UgdGhlIHN0YXJ0IG9mIHRoZSBzZWxlY3Rpb24KKyAgLy8vIHJhbmdlIGlzIGluc2lkZSBpdHMgc291cmNlIHJhbmdlLgorICBDb250YWluc1NlbGVjdGlvblN0YXJ0LAorICAvLy8gQSBub2RlIHRoYXQncyBjb25zaWRlcmVkIHRvIGJlIHNlbGVjdGVkIGJlY2F1c2UgdGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uCisgIC8vLyByYW5nZSBpcyBpbnNpZGUgaXRzIHNvdXJjZSByYW5nZS4KKyAgQ29udGFpbnNTZWxlY3Rpb25FbmQsCisKKyAgLy8vIEEgbm9kZSB0aGF0J3MgY29uc2lkZXJlZCB0byBiZSBzZWxlY3RlZCBiZWNhdXNlIHRoZSBub2RlIGlzIGVudGlyZWx5IGluCisgIC8vLyB0aGUgc2VsZWN0aW9uIHJhbmdlLgorICBJbnNpZGVTZWxlY3Rpb24sCit9OworCisvLy8gUmVwcmVzZW50cyBhIHNlbGVjdGVkIEFTVCBub2RlLgorLy8vCisvLy8gQVNUIHNlbGVjdGlvbiBpcyByZXByZXNlbnRlZCB1c2luZyBhIHRyZWUgb2YgXGMgU2VsZWN0ZWRBU1ROb2RlLiBUaGUgdHJlZQorLy8vIGZvbGxvd3MgdGhlIHRvcC1kb3duIHNoYXBlIG9mIHRoZSBhY3R1YWwgQVNULiBFYWNoIHNlbGVjdGVkIG5vZGUgaGFzCisvLy8gYSBzZWxlY3Rpb24ga2luZC4gVGhlIGtpbmQgbWlnaHQgYmUgbm9uZSBhcyB0aGUgbm9kZSBpdHNlbGYgbWlnaHQgbm90CisvLy8gYWN0dWFsbHkgYmUgc2VsZWN0ZWQsIGUuZy4gYSBzdGF0ZW1lbnQgaW4gbWFjcm8gd2hvc2UgY2hpbGQgaXMgaW4gYSBtYWNybworLy8vIGFyZ3VtZW50Lgorc3RydWN0IFNlbGVjdGVkQVNUTm9kZSB7CisgIGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlIE5vZGU7CisgIFNvdXJjZVNlbGVjdGlvbktpbmQgU2VsZWN0aW9uS2luZDsKKyAgc3RkOjp2ZWN0b3I8U2VsZWN0ZWRBU1ROb2RlPiBDaGlsZHJlbjsKKworICBTZWxlY3RlZEFTVE5vZGUoY29uc3QgYXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGUgJk5vZGUsCisgICAgICAgICAgICAgICAgICBTb3VyY2VTZWxlY3Rpb25LaW5kIFNlbGVjdGlvbktpbmQpCisgICAgICA6IE5vZGUoTm9kZSksIFNlbGVjdGlvbktpbmQoU2VsZWN0aW9uS2luZCkge30KKyAgU2VsZWN0ZWRBU1ROb2RlKFNlbGVjdGVkQVNUTm9kZSAmJikgPSBkZWZhdWx0OworICBTZWxlY3RlZEFTVE5vZGUgJm9wZXJhdG9yPShTZWxlY3RlZEFTVE5vZGUgJiYpID0gZGVmYXVsdDsKKworICB2b2lkIGR1bXAobGx2bTo6cmF3X29zdHJlYW0gJk9TID0gbGx2bTo6ZXJycygpKSBjb25zdDsKKworICB1c2luZyBSZWZlcmVuY2VUeXBlID0gc3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBTZWxlY3RlZEFTVE5vZGU+OworfTsKKworLy8vIFRyYXZlcnNlcyB0aGUgZ2l2ZW4gQVNUQ29udGV4dCBhbmQgY3JlYXRlcyBhIHRyZWUgb2Ygc2VsZWN0ZWQgQVNUIG5vZGVzLgorLy8vCisvLy8gXHJldHVybnMgTm9uZSBpZiBubyBub2RlcyBhcmUgc2VsZWN0ZWQgaW4gdGhlIEFTVCwgb3IgYSBzZWxlY3RlZCBBU1Qgbm9kZQorLy8vIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIFRyYW5zbGF0aW9uVW5pdERlY2wgb3RoZXJ3aXNlLgorT3B0aW9uYWw8U2VsZWN0ZWRBU1ROb2RlPiBmaW5kU2VsZWN0ZWRBU1ROb2Rlcyhjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBTZWxlY3Rpb25SYW5nZSk7CisKKy8vLyBBbiBBU1Qgc2VsZWN0aW9uIHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBzZWxlY3Rpb24gb2YgYSBzZXQgb2YKKy8vLyBzdGF0ZW1lbnRzIHRoYXQgYmVsb25nIHRvIG9uZSBib2R5IG9mIGNvZGUgKGxpa2Ugb25lIGZ1bmN0aW9uKS4KKy8vLworLy8vIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHNlbGVjdGlvbiBpbiB0aGUgc291cmNlLgorLy8vCisvLy8gXGNvZGUKKy8vLyB2b2lkIGZ1bmN0aW9uKCkgeworLy8vICAvLyBzZWxlY3Rpb24gYmVnaW46CisvLy8gIGludCB4ID0gMDsKKy8vLyAgeworLy8vICAgICAvLyBzZWxlY3Rpb24gZW5kCisvLy8gICAgIHggPSAxOworLy8vICB9CisvLy8gIHggPSAyOworLy8vIH0KKy8vLyBcZW5kY29kZQorLy8vCisvLy8gV291bGQgY29ycmVzcG9uZCB0byBhIGNvZGUgcmFuZ2Ugc2VsZWN0aW9uIG9mIHN0YXRlbWVudHMgImludCB4ID0gMCIKKy8vLyBhbmQgdGhlIGVudGlyZSBjb21wb3VuZCBzdGF0ZW1lbnQgdGhhdCBmb2xsb3dzIGl0LgorLy8vCisvLy8gQSBcYyBDb2RlUmFuZ2VBU1RTZWxlY3Rpb24gdmFsdWUgc3RvcmVzIHJlZmVyZW5jZXMgdG8gdGhlIGZ1bGwKKy8vLyBcYyBTZWxlY3RlZEFTVE5vZGUgdHJlZSBhbmQgc2hvdWxkIG5vdCBvdXRsaXZlIGl0LgorY2xhc3MgQ29kZVJhbmdlQVNUU2VsZWN0aW9uIHsKK3B1YmxpYzoKKyAgQ29kZVJhbmdlQVNUU2VsZWN0aW9uKENvZGVSYW5nZUFTVFNlbGVjdGlvbiAmJikgPSBkZWZhdWx0OworICBDb2RlUmFuZ2VBU1RTZWxlY3Rpb24gJm9wZXJhdG9yPShDb2RlUmFuZ2VBU1RTZWxlY3Rpb24gJiYpID0gZGVmYXVsdDsKKworICAvLy8gUmV0dXJucyB0aGUgcGFyZW50IGhpZXJhcmNoeSAodG9wIHRvIGJvdHRvbSkgZm9yIHRoZSBzZWxlY3RlZCBub2Rlcy4KKyAgQXJyYXlSZWY8U2VsZWN0ZWRBU1ROb2RlOjpSZWZlcmVuY2VUeXBlPiBnZXRQYXJlbnRzKCkgeyByZXR1cm4gUGFyZW50czsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgc3RhdGVtZW50cy4KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgaWYgKCFBcmVDaGlsZHJlblNlbGVjdGVkKQorICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIFNlbGVjdGVkTm9kZS5nZXQoKS5DaGlsZHJlbi5zaXplKCk7CisgIH0KKworICBjb25zdCBTdG10ICpvcGVyYXRvcltdKHNpemVfdCBJKSBjb25zdCB7CisgICAgaWYgKCFBcmVDaGlsZHJlblNlbGVjdGVkKSB7CisgICAgICBhc3NlcnQoSSA9PSAwICYmICJJbnZhbGlkIGluZGV4Iik7CisgICAgICByZXR1cm4gU2VsZWN0ZWROb2RlLmdldCgpLk5vZGUuZ2V0PFN0bXQ+KCk7CisgICAgfQorICAgIHJldHVybiBTZWxlY3RlZE5vZGUuZ2V0KCkuQ2hpbGRyZW5bSV0uTm9kZS5nZXQ8U3RtdD4oKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgd2hlbiBhIHNlbGVjdGVkIGNvZGUgcmFuZ2UgaXMgaW4gYSBmdW5jdGlvbi1saWtlIGJvZHkKKyAgLy8vIG9mIGNvZGUsIGxpa2UgYSBmdW5jdGlvbiwgbWV0aG9kIG9yIGEgYmxvY2suCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB0ZXN0IGFnYWluc3Qgc2VsZWN0ZWQgZXhwcmVzc2lvbnMgdGhhdCBhcmUKKyAgLy8vIGxvY2F0ZWQgb3V0c2lkZSBvZiBhIGZ1bmN0aW9uLCBlLmcuIGdsb2JhbCB2YXJpYWJsZSBpbml0aWFsaXplcnMsIGRlZmF1bHQKKyAgLy8vIGFyZ3VtZW50IHZhbHVlcywgb3IgZXZlbiB0ZW1wbGF0ZSBhcmd1bWVudHMuCisgIC8vLworICAvLy8gVXNlIHRoZSBcYyBnZXRGdW5jdGlvbkxpa2VOZWFyZXN0UGFyZW50IHRvIGdldCB0aGUgZnVuY3Rpb24tbGlrZSBwYXJlbnQKKyAgLy8vIGRlY2xhcmF0aW9uLgorICBib29sIGlzSW5GdW5jdGlvbkxpa2VCb2R5T2ZDb2RlKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIG5lYXJlc3QgZnVuY3Rpb24tbGlrZSBwYXJlbnQgZGVjbGFyYXRpb24gb3IgbnVsbCBpZiBzdWNoCisgIC8vLyBkZWNsYXJhdGlvbiBkb2Vzbid0IGV4aXN0LgorICBjb25zdCBEZWNsICpnZXRGdW5jdGlvbkxpa2VOZWFyZXN0UGFyZW50KCkgY29uc3Q7CisKKyAgc3RhdGljIE9wdGlvbmFsPENvZGVSYW5nZUFTVFNlbGVjdGlvbj4KKyAgY3JlYXRlKFNvdXJjZVJhbmdlIFNlbGVjdGlvblJhbmdlLCBjb25zdCBTZWxlY3RlZEFTVE5vZGUgJkFTVFNlbGVjdGlvbik7CisKK3ByaXZhdGU6CisgIENvZGVSYW5nZUFTVFNlbGVjdGlvbihTZWxlY3RlZEFTVE5vZGU6OlJlZmVyZW5jZVR5cGUgU2VsZWN0ZWROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U2VsZWN0ZWRBU1ROb2RlOjpSZWZlcmVuY2VUeXBlPiBQYXJlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBcmVDaGlsZHJlblNlbGVjdGVkKQorICAgICAgOiBTZWxlY3RlZE5vZGUoU2VsZWN0ZWROb2RlKSwgUGFyZW50cyhQYXJlbnRzLmJlZ2luKCksIFBhcmVudHMuZW5kKCkpLAorICAgICAgICBBcmVDaGlsZHJlblNlbGVjdGVkKEFyZUNoaWxkcmVuU2VsZWN0ZWQpIHt9CisKKyAgLy8vIFRoZSByZWZlcmVuY2UgdG8gdGhlIHNlbGVjdGVkIG5vZGUgKG9yIHJlZmVyZW5jZSB0byB0aGUgc2VsZWN0ZWQKKyAgLy8vIGNoaWxkIG5vZGVzKS4KKyAgU2VsZWN0ZWRBU1ROb2RlOjpSZWZlcmVuY2VUeXBlIFNlbGVjdGVkTm9kZTsKKyAgLy8vIFRoZSBwYXJlbnQgaGllcmFyY2h5ICh0b3AgdG8gYm90dG9tKSBmb3IgdGhlIHNlbGVjdGVkIG5vZS4KKyAgbGx2bTo6U21hbGxWZWN0b3I8U2VsZWN0ZWRBU1ROb2RlOjpSZWZlcmVuY2VUeXBlLCA4PiBQYXJlbnRzOworICAvLy8gVHJ1ZSBvbmx5IHdoZW4gdGhlIGNoaWxkcmVuIG9mIHRoZSBzZWxlY3RlZCBub2RlIGFyZSBhY3R1YWxseSBzZWxlY3RlZC4KKyAgYm9vbCBBcmVDaGlsZHJlblNlbGVjdGVkOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHRvb2xpbmcKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SX0FTVF9TRUxFQ1RJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9BdG9taWNDaGFuZ2UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvQXRvbWljQ2hhbmdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0NjhhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvQXRvbWljQ2hhbmdlLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8vPT09LS0tIEF0b21pY0NoYW5nZS5oIC0gQXRvbWljQ2hhbmdlIGNsYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIEF0b21pY0NoYW5nZSB3aGljaCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHNldCBvZiBzb3VyY2UKKy8vICBjaGFuZ2VzLCBlLmcuIHJlcGxhY2VtZW50cyBhbmQgaGVhZGVyIGluc2VydGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfQVRPTUlDQ0hBTkdFX0gKKyNkZWZpbmUgTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SX0FUT01JQ0NIQU5HRV9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgiCisjaW5jbHVkZSAiY2xhbmcvRm9ybWF0L0Zvcm1hdC5oIgorI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvQ29yZS9SZXBsYWNlbWVudC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIHRvb2xpbmcgeworCisvLy8gXGJyaWVmIEFuIGF0b21pYyBjaGFuZ2UgaXMgdXNlZCB0byBjcmVhdGUgYW5kIGdyb3VwIGEgc2V0IG9mIHNvdXJjZSBlZGl0cywKKy8vLyBlLmcuIHJlcGxhY2VtZW50cyBvciBoZWFkZXIgaW5zZXJ0aW9ucy4gRWRpdHMgaW4gYW4gQXRvbWljQ2hhbmdlIHNob3VsZCBiZQorLy8vIHJlbGF0ZWQsIGUuZy4gcmVwbGFjZW1lbnRzIGZvciB0aGUgc2FtZSB0eXBlIHJlZmVyZW5jZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKKy8vLyBoZWFkZXIgaW5zZXJ0aW9uL2RlbGV0aW9uLgorLy8vCisvLy8gQW4gQXRvbWljQ2hhbmdlIGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgYSBrZXkgYW5kIHdpbGwgZWl0aGVyIGJlIGZ1bGx5CisvLy8gYXBwbGllZCBvciBub3QgYXBwbGllZCBhdCBhbGwuCisvLy8KKy8vLyBDYWxsaW5nIHNldEVycm9yIG9uIGFuIEF0b21pY0NoYW5nZSBzdG9yZXMgdGhlIGVycm9yIG1lc3NhZ2UgYW5kIG1hcmtzIGl0IGFzCisvLy8gYmFkLCBpLmUuIG5vbmUgb2YgaXRzIHNvdXJjZSBlZGl0cyB3aWxsIGJlIGFwcGxpZWQuCitjbGFzcyBBdG9taWNDaGFuZ2UgeworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gYXRvbWljIGNoYW5nZSBhcm91bmQgXHAgS2V5UG9zaXRpb24gd2l0aCB0aGUga2V5IGJlaW5nIGEKKyAgLy8vIGNvbmNhdGVuYXRpb24gb2YgdGhlIGZpbGUgbmFtZSBhbmQgdGhlIG9mZnNldCBvZiBccCBLZXlQb3NpdGlvbi4KKyAgLy8vIFxwIEtleVBvc2l0aW9uIHNob3VsZCBiZSB0aGUgbG9jYXRpb24gb2YgdGhlIGtleSBzeW50YWN0aWNhbCBlbGVtZW50IHRoYXQKKyAgLy8vIGlzIGJlaW5nIGNoYW5nZWQsIGUuZy4gdGhlIGNhbGwgdG8gYSByZWZhY3RvcmVkIG1ldGhvZC4KKyAgQXRvbWljQ2hhbmdlKGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLCBTb3VyY2VMb2NhdGlvbiBLZXlQb3NpdGlvbik7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGFuIGF0b21pYyBjaGFuZ2UgZm9yIFxwIEZpbGVQYXRoIHdpdGggYSBjdXN0b21pemVkIGtleS4KKyAgQXRvbWljQ2hhbmdlKGxsdm06OlN0cmluZ1JlZiBGaWxlUGF0aCwgbGx2bTo6U3RyaW5nUmVmIEtleSkKKyAgICAgIDogS2V5KEtleSksIEZpbGVQYXRoKEZpbGVQYXRoKSB7fQorCisgIEF0b21pY0NoYW5nZShBdG9taWNDaGFuZ2UgJiYpID0gZGVmYXVsdDsKKyAgQXRvbWljQ2hhbmdlKGNvbnN0IEF0b21pY0NoYW5nZSAmKSA9IGRlZmF1bHQ7CisKKyAgQXRvbWljQ2hhbmdlICZvcGVyYXRvcj0oQXRvbWljQ2hhbmdlICYmKSA9IGRlZmF1bHQ7CisgIEF0b21pY0NoYW5nZSAmb3BlcmF0b3I9KGNvbnN0IEF0b21pY0NoYW5nZSAmKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEF0b21pY0NoYW5nZSAmT3RoZXIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgYXRvbWljIGNoYW5nZSBhcyBhIFlBTUwgc3RyaW5nLgorICBzdGQ6OnN0cmluZyB0b1lBTUxTdHJpbmcoKTsKKworICAvLy8gXGJyaWVmIENvbnZlcnRzIGEgWUFNTC1lbmNvZGVkIGF1dG9taWMgY2hhbmdlIHRvIEF0b21pY0NoYW5nZS4KKyAgc3RhdGljIEF0b21pY0NoYW5nZSBjb252ZXJ0RnJvbVlBTUwobGx2bTo6U3RyaW5nUmVmIFlBTUxDb250ZW50KTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGtleSBvZiB0aGlzIGNoYW5nZSwgd2hpY2ggaXMgYSBjb25jYXRlbmF0aW9uIG9mIHRoZQorICAvLy8gZmlsZSBuYW1lIGFuZCBvZmZzZXQgb2YgdGhlIGtleSBwb3NpdGlvbi4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldEtleSgpIGNvbnN0IHsgcmV0dXJuIEtleTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoaXMgYXRvbWljIGNoYW5nZS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldEZpbGVQYXRoKCkgY29uc3QgeyByZXR1cm4gRmlsZVBhdGg7IH0KKworICAvLy8gXGJyaWVmIElmIHRoaXMgY2hhbmdlIGNvdWxkIG5vdCBiZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseSwgZS5nLiBiZWNhdXNlIG9mCisgIC8vLyBjb25mbGljdHMgYW1vbmcgcmVwbGFjZW1lbnRzLCB1c2UgdGhpcyB0byBzZXQgYW4gZXJyb3IgZGVzY3JpcHRpb24uCisgIC8vLyBUaGVyZWJ5LCBwbGFjZXMgdGhhdCBjYW5ub3QgYmUgZml4ZWQgYXV0b21hdGljYWxseSBjYW4gYmUgZ2F0aGVyZWQgd2hlbgorICAvLy8gYXBwbHlpbmcgY2hhbmdlcy4KKyAgdm9pZCBzZXRFcnJvcihsbHZtOjpTdHJpbmdSZWYgRXJyb3IpIHsgdGhpcy0+RXJyb3IgPSBFcnJvcjsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB3aGV0aGVyIGFuIGVycm9yIGhhcyBiZWVuIHNldCBvbiB0aGlzIGxpc3QuCisgIGJvb2wgaGFzRXJyb3IoKSBjb25zdCB7IHJldHVybiAhRXJyb3IuZW1wdHkoKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBvciBhbiBlbXB0eSBzdHJpbmcgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRFcnJvcigpIGNvbnN0IHsgcmV0dXJuIEVycm9yOyB9CisKKyAgLy8vIFxicmllZiBBZGRzIGEgcmVwbGFjZW1lbnQgdGhhdCByZXBsYWNlcyB0aGUgZ2l2ZW4gUmFuZ2Ugd2l0aAorICAvLy8gUmVwbGFjZW1lbnRUZXh0LgorICAvLy8gXHJldHVybnMgQW4gbGx2bTo6RXJyb3IgY2FycnlpbmcgUmVwbGFjZW1lbnRFcnJvciBvbiBlcnJvci4KKyAgbGx2bTo6RXJyb3IgcmVwbGFjZShjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwgY29uc3QgQ2hhclNvdXJjZVJhbmdlICZSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgUmVwbGFjZW1lbnRUZXh0KTsKKworICAvLy8gXGJyaWVmIEFkZHMgYSByZXBsYWNlbWVudCB0aGF0IHJlcGxhY2VzIHJhbmdlIFtMb2MsIExvYytMZW5ndGgpIHdpdGgKKyAgLy8vIFxwIFRleHQuCisgIC8vLyBccmV0dXJucyBBbiBsbHZtOjpFcnJvciBjYXJyeWluZyBSZXBsYWNlbWVudEVycm9yIG9uIGVycm9yLgorICBsbHZtOjpFcnJvciByZXBsYWNlKGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGVuZ3RoLCBsbHZtOjpTdHJpbmdSZWYgVGV4dCk7CisKKyAgLy8vIFxicmllZiBBZGRzIGEgcmVwbGFjZW1lbnQgdGhhdCBpbnNlcnRzIFxwIFRleHQgYXQgXHAgTG9jLiBJZiB0aGlzCisgIC8vLyBpbnNlcnRpb24gY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgaW5zZXJ0aW9uIChhdCB0aGUgc2FtZSBwb3NpdGlvbiksCisgIC8vLyB0aGlzIHdpbGwgYmUgaW5zZXJ0ZWQgYmVmb3JlL2FmdGVyIHRoZSBleGlzdGluZyBpbnNlcnRpb24gZGVwZW5kaW5nIG9uCisgIC8vLyBccCBJbnNlcnRBZnRlci4gVXNlcnMgc2hvdWxkIHVzZSBgcmVwbGFjZWAgd2l0aCBgTGVuZ3RoPTBgIGluc3RlYWQgaWYgdGhleQorICAvLy8gZG8gbm90IHdhbnQgY29uZmxpY3QgcmVzb2x2aW5nIGJ5IGRlZmF1bHQuIElmIHRoZSBjb25mbGljdGluZyByZXBsYWNlbWVudAorICAvLy8gaXMgbm90IGFuIGluc2VydGlvbiwgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCisgIC8vLworICAvLy8gXHJldHVybnMgQW4gbGx2bTo6RXJyb3IgY2FycnlpbmcgUmVwbGFjZW1lbnRFcnJvciBvbiBlcnJvci4KKyAgbGx2bTo6RXJyb3IgaW5zZXJ0KGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgVGV4dCwgYm9vbCBJbnNlcnRBZnRlciA9IHRydWUpOworCisgIC8vLyBcYnJpZWYgQWRkcyBhIGhlYWRlciBpbnRvIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGtleSBwb3NpdGlvbi4KKyAgLy8vIEhlYWRlciBjYW4gYmUgaW4gYW5nbGUgYnJhY2tldHMgb3IgZG91YmxlIHF1b3RhdGlvbiBtYXJrcy4gQnkgZGVmYXVsdAorICAvLy8gKGhlYWRlciBpcyBub3QgcXVvdGVkKSwgaGVhZGVyIHdpbGwgYmUgc3Vycm91bmRlZCB3aXRoIGRvdWJsZSBxdW90ZXMuCisgIHZvaWQgYWRkSGVhZGVyKGxsdm06OlN0cmluZ1JlZiBIZWFkZXIpOworCisgIC8vLyBcYnJpZWYgUmVtb3ZlcyBhIGhlYWRlciBmcm9tIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGtleSBwb3NpdGlvbi4KKyAgdm9pZCByZW1vdmVIZWFkZXIobGx2bTo6U3RyaW5nUmVmIEhlYWRlcik7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIGV4aXN0aW5nIHJlcGxhY2VtZW50cy4KKyAgY29uc3QgUmVwbGFjZW1lbnRzICZnZXRSZXBsYWNlbWVudHMoKSBjb25zdCB7IHJldHVybiBSZXBsYWNlczsgfQorCisgIGxsdm06OkFycmF5UmVmPHN0ZDo6c3RyaW5nPiBnZXRJbnNlcnRlZEhlYWRlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIEluc2VydGVkSGVhZGVyczsKKyAgfQorCisgIGxsdm06OkFycmF5UmVmPHN0ZDo6c3RyaW5nPiBnZXRSZW1vdmVkSGVhZGVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVtb3ZlZEhlYWRlcnM7CisgIH0KKworcHJpdmF0ZToKKyAgQXRvbWljQ2hhbmdlKCkge30KKworICBBdG9taWNDaGFuZ2Uoc3RkOjpzdHJpbmcgS2V5LCBzdGQ6OnN0cmluZyBGaWxlUGF0aCwgc3RkOjpzdHJpbmcgRXJyb3IsCisgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gSW5zZXJ0ZWRIZWFkZXJzLAorICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFJlbW92ZWRIZWFkZXJzLAorICAgICAgICAgICAgICAgY2xhbmc6OnRvb2xpbmc6OlJlcGxhY2VtZW50cyBSZXBsYWNlcyk7CisKKyAgLy8gVGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIGFuIEF0b21pY0NoYW5nZS4KKyAgc3RkOjpzdHJpbmcgS2V5OworICBzdGQ6OnN0cmluZyBGaWxlUGF0aDsKKyAgc3RkOjpzdHJpbmcgRXJyb3I7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBJbnNlcnRlZEhlYWRlcnM7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBSZW1vdmVkSGVhZGVyczsKKyAgdG9vbGluZzo6UmVwbGFjZW1lbnRzIFJlcGxhY2VzOworfTsKKwordXNpbmcgQXRvbWljQ2hhbmdlcyA9IHN0ZDo6dmVjdG9yPEF0b21pY0NoYW5nZT47CisKKy8vIERlZmluZXMgc3BlY3MgZm9yIGFwcGx5aW5nIGNoYW5nZXMuCitzdHJ1Y3QgQXBwbHlDaGFuZ2VzU3BlYyB7CisgIC8vIElmIHRydWUsIGNsZWFucyB1cCByZWR1bmRhbnQvZXJyb25lb3VzIGNvZGUgYXJvdW5kIGNoYW5nZWQgY29kZSB3aXRoCisgIC8vIGNsYW5nLWZvcm1hdCdzIGNsZWFudXAgZnVuY3Rpb25hbGl0eSwgZS5nLiByZWR1bmRhbnQgY29tbWFzIGFyb3VuZCBkZWxldGVkCisgIC8vIHBhcmFtZXRlciBvciBlbXB0eSBuYW1lc3BhY2VzIGludHJvZHVjZWQgYnkgZGVsZXRpb25zLgorICBib29sIENsZWFudXAgPSB0cnVlOworCisgIGZvcm1hdDo6Rm9ybWF0U3R5bGUgU3R5bGUgPSBmb3JtYXQ6OmdldE5vU3R5bGUoKTsKKworICAvLyBPcHRpb25zIGZvciBzZWxlY3RpdmVseSBmb3JtYXR0aW5nIGNoYW5nZXMgd2l0aCBjbGFuZy1mb3JtYXQ6CisgIC8vIGtBbGw6IEZvcm1hdCBhbGwgY2hhbmdlZCBsaW5lcy4KKyAgLy8ga05vbmU6IERvbid0IGZvcm1hdCBhbnl0aGluZy4KKyAgLy8ga1Zpb2xhdGlvbnM6IEZvcm1hdCBsaW5lcyBleGNlZWRpbmcgdGhlIGBDb2x1bW5MaW1pdGAgaW4gYFN0eWxlYC4KKyAgZW51bSBGb3JtYXRPcHRpb24geyBrQWxsLCBrTm9uZSwga1Zpb2xhdGlvbnMgfTsKKworICBGb3JtYXRPcHRpb24gRm9ybWF0ID0ga05vbmU7Cit9OworCisvLy8gXGJyaWVmIEFwcGxpZXMgYWxsIEF0b21pY0NoYW5nZXMgaW4gXHAgQ2hhbmdlcyB0byB0aGUgXHAgQ29kZS4KKy8vLworLy8vIFRoaXMgY29tcGxldGVseSBpZ25vcmVzIHRoZSBmaWxlIHBhdGggaW4gZWFjaCBjaGFuZ2UgYW5kIHJlcGxhY2VzIHRoZW0gd2l0aAorLy8vIFxwIEZpbGVQYXRoLCBpLmUuIGNhbGxlcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyBhbGwgY2hhbmdlcyBhcmUgZm9yCisvLy8gdGhlIHNhbWUgZmlsZS4KKy8vLworLy8vIFxyZXR1cm5zIFRoZSBjaGFuZ2VkIGNvZGUgaWYgYWxsIGNoYW5nZXMgYXJlIGFwcGxpZWQgc3VjY2Vzc2Z1bGx5OworLy8vIG90aGVyd2lzZSwgYW4gbGx2bTo6RXJyb3IgY2FycnlpbmcgbGx2bTo6U3RyaW5nRXJyb3IgaXMgcmV0dXJuZWQgKHRoZSBFcnJvcgorLy8vIG1lc3NhZ2UgY2FuIGJlIGNvbnZlcnRlZCB0byBzdHJpbmcgd2l0aCBgbGx2bTo6dG9TdHJpbmcoKWAgYW5kIHRoZQorLy8vIGVycm9yX2NvZGUgc2hvdWxkIGJlIGlnbm9yZWQpLgorbGx2bTo6RXhwZWN0ZWQ8c3RkOjpzdHJpbmc+CithcHBseUF0b21pY0NoYW5nZXMobGx2bTo6U3RyaW5nUmVmIEZpbGVQYXRoLCBsbHZtOjpTdHJpbmdSZWYgQ29kZSwKKyAgICAgICAgICAgICAgICAgICBsbHZtOjpBcnJheVJlZjxBdG9taWNDaGFuZ2U+IENoYW5nZXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQXBwbHlDaGFuZ2VzU3BlYyAmU3BlYyk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSB0b29saW5nCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9BVE9NSUNDSEFOR0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9FeHRyYWN0L0V4dHJhY3QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvRXh0cmFjdC9FeHRyYWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkNzZkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvRXh0cmFjdC9FeHRyYWN0LmgKQEAgLTAsMCArMSw1MyBAQAorLy89PT0tLS0gRXh0cmFjdC5oIC0gQ2xhbmcgcmVmYWN0b3JpbmcgbGlicmFyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfRVhUUkFDVF9FWFRSQUNUX0gKKyNkZWZpbmUgTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SX0VYVFJBQ1RfRVhUUkFDVF9ICisKKyNpbmNsdWRlICJjbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL0FTVFNlbGVjdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdBY3Rpb25SdWxlcy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIHRvb2xpbmcgeworCisvLy8gQW4gIkV4dHJhY3QgRnVuY3Rpb24iIHJlZmFjdG9yaW5nIG1vdmVzIGNvZGUgaW50byBhIG5ldyBmdW5jdGlvbiB0aGF0J3MKKy8vLyB0aGVuIGNhbGxlZCBmcm9tIHRoZSBwbGFjZSB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSB3YXMuCitjbGFzcyBFeHRyYWN0RnVuY3Rpb24gZmluYWwgOiBwdWJsaWMgU291cmNlQ2hhbmdlUmVmYWN0b3JpbmdSdWxlIHsKK3B1YmxpYzoKKyAgLy8vIEluaXRpYXRlcyB0aGUgZXh0cmFjdCBmdW5jdGlvbiByZWZhY3RvcmluZyBvcGVyYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIENvZGUgICAgIFRoZSBzZWxlY3RlZCBzZXQgb2Ygc3RhdGVtZW50cy4KKyAgLy8vIFxwYXJhbSBEZWNsTmFtZSBUaGUgbmFtZSBuYW1lIG9mIHRoZSBleHRyYWN0IGZ1bmN0aW9uLiBJZiBOb25lLAorICAvLy8gICAgICAgICAgICAgICAgICJleHRyYWN0ZWQiIGlzIHVzZWQuCisgIHN0YXRpYyBFeHBlY3RlZDxFeHRyYWN0RnVuY3Rpb24+IGluaXRpYXRlKFJlZmFjdG9yaW5nUnVsZUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVSYW5nZUFTVFNlbGVjdGlvbiBDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxzdGQ6OnN0cmluZz4gRGVjbE5hbWUpOworCisgIHN0YXRpYyBjb25zdCBSZWZhY3RvcmluZ0Rlc2NyaXB0b3IgJmRlc2NyaWJlKCk7CisKK3ByaXZhdGU6CisgIEV4dHJhY3RGdW5jdGlvbihDb2RlUmFuZ2VBU1RTZWxlY3Rpb24gQ29kZSwgT3B0aW9uYWw8c3RkOjpzdHJpbmc+IERlY2xOYW1lKQorICAgICAgOiBDb2RlKHN0ZDo6bW92ZShDb2RlKSksCisgICAgICAgIERlY2xOYW1lKERlY2xOYW1lID8gc3RkOjptb3ZlKCpEZWNsTmFtZSkgOiAiZXh0cmFjdGVkIikge30KKworICBFeHBlY3RlZDxBdG9taWNDaGFuZ2VzPgorICBjcmVhdGVTb3VyY2VSZXBsYWNlbWVudHMoUmVmYWN0b3JpbmdSdWxlQ29udGV4dCAmQ29udGV4dCkgb3ZlcnJpZGU7CisKKyAgQ29kZVJhbmdlQVNUU2VsZWN0aW9uIENvZGU7CisKKyAgLy8gRklYTUU6IEFjY291bnQgZm9yIG5hbWluZyBjb2xsaXNpb25zOgorICAvLyAgLSBlcnJvciB3aGVuIG5hbWUgaXMgc3BlY2lmaWVkIGJ5IHVzZXIuCisgIC8vICAtIHJlbmFtZSB0byAiZXh0cmFjdGVkTiIgd2hlbiBuYW1lIGlzIGltcGxpY2l0LgorICBzdGQ6OnN0cmluZyBEZWNsTmFtZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSB0b29saW5nCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9FWFRSQUNUX0VYVFJBQ1RfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWN1cnNpdmVTeW1ib2xWaXNpdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlY3Vyc2l2ZVN5bWJvbFZpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTZhZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWN1cnNpdmVTeW1ib2xWaXNpdG9yLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8vPT09LS0tIFJlY3Vyc2l2ZVN5bWJvbFZpc2l0b3IuaCAtIENsYW5nIHJlZmFjdG9yaW5nIGxpYnJhcnkgLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBBIHdyYXBwZXIgY2xhc3MgYXJvdW5kIFxjIFJlY3Vyc2l2ZUFTVFZpc2l0b3IgdGhhdCB2aXNpdHMgZWFjaAorLy8vIG9jY3VycmVuY2VzIG9mIGEgbmFtZWQgc3ltYm9sLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRUNVUlNJVkVfU1lNQk9MX1ZJU0lUT1JfSAorI2RlZmluZSBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVDVVJTSVZFX1NZTUJPTF9WSVNJVE9SX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BU1QuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvUmVjdXJzaXZlQVNUVmlzaXRvci5oIgorI2luY2x1ZGUgImNsYW5nL0xleC9MZXhlci5oIgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIHRvb2xpbmcgeworCisvLy8gVHJhdmVyc2VzIHRoZSBBU1QgYW5kIHZpc2l0cyB0aGUgb2NjdXJyZW5jZSBvZiBlYWNoIG5hbWVkIHN5bWJvbCBpbiB0aGUKKy8vLyBnaXZlbiBub2Rlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUmVjdXJzaXZlU3ltYm9sVmlzaXRvcgorICAgIDogcHVibGljIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8UmVjdXJzaXZlU3ltYm9sVmlzaXRvcjxUPj4geworICB1c2luZyBCYXNlVHlwZSA9IFJlY3Vyc2l2ZUFTVFZpc2l0b3I8UmVjdXJzaXZlU3ltYm9sVmlzaXRvcjxUPj47CisKK3B1YmxpYzoKKyAgUmVjdXJzaXZlU3ltYm9sVmlzaXRvcihjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKQorICAgICAgOiBTTShTTSksIExhbmdPcHRzKExhbmdPcHRzKSB7fQorCisgIGJvb2wgdmlzaXRTeW1ib2xPY2N1cnJlbmNlKGNvbnN0IE5hbWVkRGVjbCAqTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNvdXJjZVJhbmdlPiBOYW1lUmFuZ2VzKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBEZWNsYXJhdGlvbiB2aXNpdG9yczoKKworICBib29sIFZpc2l0TmFtZWREZWNsKGNvbnN0IE5hbWVkRGVjbCAqRCkgeworICAgIHJldHVybiBpc2E8Q1hYQ29udmVyc2lvbkRlY2w+KEQpID8gdHJ1ZSA6IHZpc2l0KEQsIEQtPmdldExvY2F0aW9uKCkpOworICB9CisKKyAgYm9vbCBWaXNpdENYWENvbnN0cnVjdG9yRGVjbChjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkNEKSB7CisgICAgZm9yIChjb25zdCBhdXRvICpJbml0aWFsaXplciA6IENELT5pbml0cygpKSB7CisgICAgICAvLyBJZ25vcmUgaW1wbGljaXQgaW5pdGlhbGl6ZXJzLgorICAgICAgaWYgKCFJbml0aWFsaXplci0+aXNXcml0dGVuKCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKGNvbnN0IEZpZWxkRGVjbCAqRkQgPSBJbml0aWFsaXplci0+Z2V0TWVtYmVyKCkpIHsKKyAgICAgICAgaWYgKCF2aXNpdChGRCwgSW5pdGlhbGl6ZXItPmdldFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgTGV4ZXI6OmdldExvY0ZvckVuZE9mVG9rZW4oSW5pdGlhbGl6ZXItPmdldFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU00sIExhbmdPcHRzKSkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIEV4cHJlc3Npb24gdmlzaXRvcnM6CisKKyAgYm9vbCBWaXNpdERlY2xSZWZFeHByKGNvbnN0IERlY2xSZWZFeHByICpFeHByKSB7CisgICAgcmV0dXJuIHZpc2l0KEV4cHItPmdldEZvdW5kRGVjbCgpLCBFeHByLT5nZXRMb2NhdGlvbigpKTsKKyAgfQorCisgIGJvb2wgVmlzaXRNZW1iZXJFeHByKGNvbnN0IE1lbWJlckV4cHIgKkV4cHIpIHsKKyAgICByZXR1cm4gdmlzaXQoRXhwci0+Z2V0Rm91bmREZWNsKCkuZ2V0RGVjbCgpLCBFeHByLT5nZXRNZW1iZXJMb2MoKSk7CisgIH0KKworICBib29sIFZpc2l0T2Zmc2V0T2ZFeHByKGNvbnN0IE9mZnNldE9mRXhwciAqUykgeworICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBTLT5nZXROdW1Db21wb25lbnRzKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBjb25zdCBPZmZzZXRPZk5vZGUgJkNvbXBvbmVudCA9IFMtPmdldENvbXBvbmVudChJKTsKKyAgICAgIGlmIChDb21wb25lbnQuZ2V0S2luZCgpID09IE9mZnNldE9mTm9kZTo6RmllbGQpIHsKKyAgICAgICAgaWYgKCF2aXNpdChDb21wb25lbnQuZ2V0RmllbGQoKSwgQ29tcG9uZW50LmdldExvY0VuZCgpKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAvLyBGSVhNRTogVHJ5IHRvIHJlc29sdmUgZGVwZW5kZW50IGZpZWxkIHJlZmVyZW5jZXMuCisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gT3RoZXIgdmlzaXRvcnM6CisKKyAgYm9vbCBWaXNpdFR5cGVMb2MoY29uc3QgVHlwZUxvYyBMb2MpIHsKKyAgICBjb25zdCBTb3VyY2VMb2NhdGlvbiBUeXBlQmVnaW5Mb2MgPSBMb2MuZ2V0QmVnaW5Mb2MoKTsKKyAgICBjb25zdCBTb3VyY2VMb2NhdGlvbiBUeXBlRW5kTG9jID0KKyAgICAgICAgTGV4ZXI6OmdldExvY0ZvckVuZE9mVG9rZW4oVHlwZUJlZ2luTG9jLCAwLCBTTSwgTGFuZ09wdHMpOworICAgIGlmIChjb25zdCBhdXRvICpUZW1wbGF0ZVR5cGVQYXJtID0KKyAgICAgICAgICAgIGR5bl9jYXN0PFRlbXBsYXRlVHlwZVBhcm1UeXBlPihMb2MuZ2V0VHlwZSgpKSkgeworICAgICAgaWYgKCF2aXNpdChUZW1wbGF0ZVR5cGVQYXJtLT5nZXREZWNsKCksIFR5cGVCZWdpbkxvYywgVHlwZUVuZExvYykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGNvbnN0IGF1dG8gKlRlbXBsYXRlU3BlY1R5cGUgPQorICAgICAgICAgICAgZHluX2Nhc3Q8VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGU+KExvYy5nZXRUeXBlKCkpKSB7CisgICAgICBpZiAoIXZpc2l0KFRlbXBsYXRlU3BlY1R5cGUtPmdldFRlbXBsYXRlTmFtZSgpLmdldEFzVGVtcGxhdGVEZWNsKCksCisgICAgICAgICAgICAgICAgIFR5cGVCZWdpbkxvYywgVHlwZUVuZExvYykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHZpc2l0KExvYy5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpLCBUeXBlQmVnaW5Mb2MsIFR5cGVFbmRMb2MpOworICB9CisKKyAgYm9vbCBUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoTmVzdGVkTmFtZVNwZWNpZmllckxvYyBOTlMpIHsKKyAgICAvLyBUaGUgYmFzZSB2aXNpdG9yIHdpbGwgdmlzaXQgTk5TTCBwcmVmaXhlcywgc28gd2Ugc2hvdWxkIG9ubHkgbG9vayBhdAorICAgIC8vIHRoZSBjdXJyZW50IE5OUy4KKyAgICBpZiAoTk5TKSB7CisgICAgICBjb25zdCBOYW1lc3BhY2VEZWNsICpORCA9IE5OUy5nZXROZXN0ZWROYW1lU3BlY2lmaWVyKCktPmdldEFzTmFtZXNwYWNlKCk7CisgICAgICBpZiAoIXZpc2l0KE5ELCBOTlMuZ2V0TG9jYWxCZWdpbkxvYygpLCBOTlMuZ2V0TG9jYWxFbmRMb2MoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEJhc2VUeXBlOjpUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoTk5TKTsKKyAgfQorCitwcml2YXRlOgorICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTTsKKyAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzOworCisgIGJvb2wgdmlzaXQoY29uc3QgTmFtZWREZWNsICpORCwgU291cmNlTG9jYXRpb24gQmVnaW5Mb2MsCisgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4odGhpcyktPnZpc2l0U3ltYm9sT2NjdXJyZW5jZSgKKyAgICAgICAgTkQsIFNvdXJjZVJhbmdlKEJlZ2luTG9jLCBFbmRMb2MpKTsKKyAgfQorICBib29sIHZpc2l0KGNvbnN0IE5hbWVkRGVjbCAqTkQsIFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgIHJldHVybiB2aXNpdChORCwgTG9jLAorICAgICAgICAgICAgICAgICBMb2MuZ2V0TG9jV2l0aE9mZnNldChORC0+Z2V0TmFtZUFzU3RyaW5nKCkubGVuZ3RoKCkgLSAxKSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSB0b29saW5nCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRUNVUlNJVkVfU1lNQk9MX1ZJU0lUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ0FjdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ0FjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MDgwMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nQWN0aW9uLmgKQEAgLTAsMCArMSw2NCBAQAorLy89PT0tLS0gUmVmYWN0b3JpbmdBY3Rpb24uaCAtIENsYW5nIHJlZmFjdG9yaW5nIGxpYnJhcnkgLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVGQUNUT1JJTkdfQUNUSU9OX0gKKyNkZWZpbmUgTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SX1JFRkFDVE9SSU5HX0FDVElPTl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ0FjdGlvblJ1bGVzLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIHRvb2xpbmcgeworCisvLy8gQSByZWZhY3RvcmluZyBhY3Rpb24gaXMgYSBjbGFzcyB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCByZWZhY3RvcmluZworLy8vIGFjdGlvbiBydWxlcy4gVGhlc2UgcnVsZXMgZ2V0IGdyb3VwZWQgdW5kZXIgYSBjb21tb24gdW1icmVsbGEgLSBhIHNpbmdsZQorLy8vIGNsYW5nLXJlZmFjdG9yIHN1YmNvbW1hbmQuCisvLy8KKy8vLyBBIHN1YmNsYXNzIG9mIFxjIFJlZmFjdG9yaW5nQWN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgc2V0IG9mCisvLy8gZ3JvdXBlZCByZWZhY3RvcmluZyBhY3Rpb24gcnVsZXMgdGhhdCByZXByZXNlbnQgb25lIHJlZmFjdG9yaW5nIG9wZXJhdGlvbi4KKy8vLyBBbHRob3VnaCB0aGUgcnVsZXMgaW4gb25lIGFjdGlvbiBtYXkgaGF2ZSBhIG51bWJlciBvZiBkaWZmZXJlbnQKKy8vLyBpbXBsZW1lbnRhdGlvbnMsIHRoZXkgc2hvdWxkIHN0cml2ZSB0byBwcm9kdWNlIGEgc2ltaWxhciByZXN1bHQuIEl0IHNob3VsZAorLy8vIGJlIGVhc3kgZm9yIHVzZXJzIHRvIGlkZW50aWZ5IHdoaWNoIHJlZmFjdG9yaW5nIGFjdGlvbiBwcm9kdWNlZCB0aGUgcmVzdWx0CisvLy8gcmVnYXJkbGVzcyBvZiB3aGljaCByZWZhY3RvcmluZyBhY3Rpb24gcnVsZSB3YXMgdXNlZC4KKy8vLworLy8vIFRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGFjdGlvbnMgYW5kIHJ1bGVzIGVuYWJsZXMgdGhlIGNyZWF0aW9uIG9mIGFjdGlvbgorLy8vIHRoYXQgdXNlcyB2ZXJ5IGRpZmZlcmVudCBydWxlcywgZm9yIGV4YW1wbGU6CisvLy8gICAtIGxvY2FsIHZzIGdsb2JhbDogYSByZWZhY3RvcmluZyBvcGVyYXRpb24gbGlrZQorLy8vICAgICAiYWRkIG1pc3Npbmcgc3dpdGNoIGNhc2VzIiBjYW4gYmUgYXBwbGllZCB0byBvbmUgc3dpdGNoIHdoZW4gaXQncworLy8vICAgICBzZWxlY3RlZCBpbiBhbiBlZGl0b3IsIG9yIHRvIGFsbCBzd2l0Y2hlcyBpbiBhIHByb2plY3Qgd2hlbiBhbiBlbnVtCisvLy8gICAgIGNvbnN0YW50IGlzIGFkZGVkIHRvIGFuIGVudW0uCisvLy8gICAtIHRvb2wgdnMgZWRpdG9yOiBzb21lIHJlZmFjdG9yaW5nIG9wZXJhdGlvbiBjYW4gYmUgaW5pdGlhdGVkIGluIHRoZQorLy8vICAgICBlZGl0b3Igd2hlbiBhIGRlY2xhcmF0aW9uIGlzIHNlbGVjdGVkLCBvciBpbiBhIHRvb2wgd2hlbiB0aGUgbmFtZSBvZgorLy8vICAgICB0aGUgZGVjbGFyYXRpb24gaXMgcGFzc2VkIHVzaW5nIGEgY29tbWFuZC1saW5lIGFyZ3VtZW50LgorY2xhc3MgUmVmYWN0b3JpbmdBY3Rpb24geworcHVibGljOgorICB2aXJ0dWFsIH5SZWZhY3RvcmluZ0FjdGlvbigpIHt9CisKKyAgLy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHN1YmNvbW1hbmQgdGhhdCdzIHVzZWQgYnkgY2xhbmctcmVmYWN0b3IgZm9yIHRoaXMKKyAgLy8vIGFjdGlvbi4KKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0Q29tbWFuZCgpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXREZXNjcmlwdGlvbigpIGNvbnN0ID0gMDsKKworICBSZWZhY3RvcmluZ0FjdGlvblJ1bGVzIGNyZWF0ZUFjdGl2ZUFjdGlvblJ1bGVzKCk7CisKK3Byb3RlY3RlZDoKKyAgLy8vIFJldHVybnMgYSBzZXQgb2YgcmVmYWN0b3JpbmcgYWN0aW9ucyBydWxlcyB0aGF0IGFyZSBkZWZpbmVkIGJ5IHRoaXMKKyAgLy8vIGFjdGlvbi4KKyAgdmlydHVhbCBSZWZhY3RvcmluZ0FjdGlvblJ1bGVzIGNyZWF0ZUFjdGlvblJ1bGVzKCkgY29uc3QgPSAwOworfTsKKworLy8vIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIHRoZSBhdmFpbGFibGUgcmVmYWN0b3JpbmcgYWN0aW9ucy4KK3N0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxSZWZhY3RvcmluZ0FjdGlvbj4+IGNyZWF0ZVJlZmFjdG9yaW5nQWN0aW9ucygpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgdG9vbGluZworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVGQUNUT1JJTkdfQUNUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdBY3Rpb25SdWxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nQWN0aW9uUnVsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMzBlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nQWN0aW9uUnVsZS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vPT09LS0tIFJlZmFjdG9yaW5nQWN0aW9uUnVsZS5oIC0gQ2xhbmcgcmVmYWN0b3JpbmcgbGlicmFyeSAtLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVGQUNUT1JJTkdfQUNUSU9OX1JVTEVfSAorI2RlZmluZSBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVGQUNUT1JJTkdfQUNUSU9OX1JVTEVfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIHRvb2xpbmcgeworCitjbGFzcyBSZWZhY3RvcmluZ09wdGlvblZpc2l0b3I7CitjbGFzcyBSZWZhY3RvcmluZ1Jlc3VsdENvbnN1bWVyOworY2xhc3MgUmVmYWN0b3JpbmdSdWxlQ29udGV4dDsKKworc3RydWN0IFJlZmFjdG9yaW5nRGVzY3JpcHRvciB7CisgIC8vLyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3BlY2lmaWMgcmVmYWN0b3JpbmcuCisgIFN0cmluZ1JlZiBOYW1lOworICAvLy8gQSBodW1hbiByZWFkYWJsZSB0aXRsZSBmb3IgdGhlIHJlZmFjdG9yaW5nLgorICBTdHJpbmdSZWYgVGl0bGU7CisgIC8vLyBBIGh1bWFuIHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIHJlZmFjdG9yaW5nIGRvZXMuCisgIFN0cmluZ1JlZiBEZXNjcmlwdGlvbjsKK307CisKKy8vLyBBIGNvbW1vbiByZWZhY3RvcmluZyBhY3Rpb24gcnVsZSBpbnRlcmZhY2UgdGhhdCBkZWZpbmVzIHRoZSAnaW52b2tlJworLy8vIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgdGhlIHJlZmFjdG9yaW5nIG9wZXJhdGlvbiAoZWl0aGVyIGZ1bGx5IG9yCisvLy8gcGFydGlhbGx5KS4KK2NsYXNzIFJlZmFjdG9yaW5nQWN0aW9uUnVsZUJhc2UgeworcHVibGljOgorICB2aXJ0dWFsIH5SZWZhY3RvcmluZ0FjdGlvblJ1bGVCYXNlKCkge30KKworICAvLy8gSW5pdGlhdGVzIGFuZCBwZXJmb3JtcyBhIHNwZWNpZmljIHJlZmFjdG9yaW5nIGFjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGUgc3BlY2lmaWMgcnVsZSB3aWxsIGludm9rZSBhbiBhcHByb3ByaWF0ZSBcYyBoYW5kbGUgbWV0aG9kIG9uIGEKKyAgLy8vIGNvbnN1bWVyIHRvIHByb3BhZ2F0ZSB0aGUgcmVzdWx0IG9mIHRoZSByZWZhY3RvcmluZyBhY3Rpb24uCisgIHZpcnR1YWwgdm9pZCBpbnZva2UoUmVmYWN0b3JpbmdSZXN1bHRDb25zdW1lciAmQ29uc3VtZXIsCisgICAgICAgICAgICAgICAgICAgICAgUmVmYWN0b3JpbmdSdWxlQ29udGV4dCAmQ29udGV4dCkgPSAwOworCisgIC8vLyBSZXR1cm5zIHRoZSBzdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZXMgdGhlIHJlZmFjdG9yaW5nLgorICAvLyBzdGF0aWMgY29uc3QgUmVmYWN0b3JpbmdEZXNjcmlwdG9yICZkZXNjcmliZSgpID0gMDsKK307CisKKy8vLyBBIHJlZmFjdG9yaW5nIGFjdGlvbiBydWxlIGlzIGEgd3JhcHBlciBjbGFzcyBhcm91bmQgYSBzcGVjaWZpYyByZWZhY3RvcmluZworLy8vIGFjdGlvbiBydWxlIChTb3VyY2VDaGFuZ2VSZWZhY3RvcmluZ1J1bGUsIGV0YykgdGhhdCwgaW4gYWRkaXRpb24gdG8gaW52b2tpbmcKKy8vLyB0aGUgYWN0aW9uLCBkZXNjcmliZXMgdGhlIHJlcXVpcmVtZW50cyB0aGF0IGRldGVybWluZSB3aGVuIHRoZSBhY3Rpb24gY2FuIGJlCisvLy8gaW5pdGlhdGVkLgorY2xhc3MgUmVmYWN0b3JpbmdBY3Rpb25SdWxlIDogcHVibGljIFJlZmFjdG9yaW5nQWN0aW9uUnVsZUJhc2UgeworcHVibGljOgorICAvLy8gUmV0dXJucyB0cnVlIHdoZW4gdGhlIHJ1bGUgaGFzIGEgc291cmNlIHNlbGVjdGlvbiByZXF1aXJlbWVudCB0aGF0IGhhcworICAvLy8gdG8gYmUgZnVsbGZpbGxlZCBiZWZvcmUgcmVmYWN0b3JpbmcgY2FuIGJlIHBlcmZvcm1lZC4KKyAgdmlydHVhbCBib29sIGhhc1NlbGVjdGlvblJlcXVpcmVtZW50KCkgPSAwOworCisgIC8vLyBUcmF2ZXJzZXMgZWFjaCByZWZhY3RvcmluZyBvcHRpb24gdXNlZCBieSB0aGUgcnVsZSBhbmQgaW52b2tlcyB0aGUKKyAgLy8vIFxjIHZpc2l0IGNhbGxiYWNrIGluIHRoZSBjb25zdW1lciBmb3IgZWFjaCBvcHRpb24uCisgIC8vLworICAvLy8gT3B0aW9ucyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgb2YgdXNlLCBlLmcuIGlmIGEgcnVsZSBoYXMgdHdvCisgIC8vLyByZXF1aXJlbWVudHMgdGhhdCB1c2Ugb3B0aW9ucywgdGhlIG9wdGlvbnMgZnJvbSB0aGUgZmlyc3QgcmVxdWlyZW1lbnQKKyAgLy8vIGFyZSB2aXNpdGVkIGJlZm9yZSB0aGUgb3B0aW9ucyBpbiB0aGUgc2Vjb25kIHJlcXVpcmVtZW50LgorICB2aXJ0dWFsIHZvaWQgdmlzaXRSZWZhY3RvcmluZ09wdGlvbnMoUmVmYWN0b3JpbmdPcHRpb25WaXNpdG9yICZWaXNpdG9yKSA9IDA7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgdG9vbGluZworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVGQUNUT1JJTkdfQUNUSU9OX1JVTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ0FjdGlvblJ1bGVSZXF1aXJlbWVudHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdBY3Rpb25SdWxlUmVxdWlyZW1lbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1YTZhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdBY3Rpb25SdWxlUmVxdWlyZW1lbnRzLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8vPT09LS0tIFJlZmFjdG9yaW5nQWN0aW9uUnVsZVJlcXVpcmVtZW50cy5oIC0gQ2xhbmcgcmVmYWN0b3JpbmcgbGlicmFyeSAtLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SX1JFRkFDVE9SSU5HX0FDVElPTl9SVUxFX1JFUVVJUkVNRU5UU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRUZBQ1RPUklOR19BQ1RJT05fUlVMRV9SRVFVSVJFTUVOVFNfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvQVNUU2VsZWN0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ0RpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJjbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nT3B0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ1J1bGVDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgdG9vbGluZyB7CisKKy8vLyBBIHJlZmFjdG9yaW5nIGFjdGlvbiBydWxlIHJlcXVpcmVtZW50IGRldGVybWluZXMgd2hlbiBhIHJlZmFjdG9yaW5nIGFjdGlvbgorLy8vIHJ1bGUgY2FuIGJlIGludm9rZWQuIFRoZSBydWxlIGNhbiBiZSBpbnZva2VkIG9ubHkgd2hlbiBhbGwgb2YgdGhlCisvLy8gcmVxdWlyZW1lbnRzIGFyZSBzYXRpc2ZpZWQuCisvLy8KKy8vLyBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZQorLy8vICdFeHBlY3RlZDxUPiBldmFsdWF0ZShSZWZhY3RvcmluZ1J1bGVDb250ZXh0ICYpIGNvbnN0JyBtZW1iZXIgZnVuY3Rpb24uCisvLy8gXGMgVCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgcmV0dXJuIHR5cGUgdGhhdCBpcyBwYXNzZWQgdG8gdGhlCisvLy8gcmVmYWN0b3JpbmcgcnVsZSdzIGNvbnN0cnVjdG9yLgorLy8vIEZvciBleGFtcGxlLCB0aGUgXGMgU291cmNlUmFuZ2VTZWxlY3Rpb25SZXF1aXJlbWVudCBzdWJjbGFzcyBkZWZpbmVzCisvLy8gJ0V4cGVjdGVkPFNvdXJjZVJhbmdlPiBldmFsdWF0ZShSZWZhY3RvcmluZ1J1bGVDb250ZXh0ICZDb250ZXh0KSBjb25zdCcKKy8vLyBmdW5jdGlvbi4gV2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSBub24tZXJyb3IgdmFsdWUsIHRoZSByZXN1bHRpbmcKKy8vLyBzb3VyY2UgcmFuZ2UgaXMgcGFzc2VkIHRvIHRoZSBzcGVjaWZpYyByZWZhY3RvcmluZyBhY3Rpb24gcnVsZQorLy8vIGNvbnN0cnVjdG9yIChwcm92aWRlZCBhbGwgb3RoZXIgcmVxdWlyZW1lbnRzIGFyZSBzYXRpc2ZpZWQpLgorY2xhc3MgUmVmYWN0b3JpbmdBY3Rpb25SdWxlUmVxdWlyZW1lbnQgeworICAvLyBFeHBlY3RlZDxUPiBldmFsdWF0ZShSZWZhY3RvcmluZ1J1bGVDb250ZXh0ICZDb250ZXh0KSBjb25zdDsKK307CisKKy8vLyBBIGJhc2UgY2xhc3MgZm9yIGFueSByZXF1aXJlbWVudCB0aGF0IGV4cGVjdHMgc29tZSBwYXJ0IG9mIHRoZSBzb3VyY2UgdG8gYmUKKy8vLyBzZWxlY3RlZCBpbiBhbiBlZGl0b3IgKG9yIHRoZSByZWZhY3RvcmluZyB0b29sIHdpdGggdGhlIC1zZWxlY3Rpb24gb3B0aW9uKS4KK2NsYXNzIFNvdXJjZVNlbGVjdGlvblJlcXVpcmVtZW50IDogcHVibGljIFJlZmFjdG9yaW5nQWN0aW9uUnVsZVJlcXVpcmVtZW50IHt9OworCisvLy8gQSBzZWxlY3Rpb24gcmVxdWlyZW1lbnQgdGhhdCBpcyBzYXRpc2ZpZWQgd2hlbiBhbnkgcG9ydGlvbiBvZiB0aGUgc291cmNlCisvLy8gdGV4dCBpcyBzZWxlY3RlZC4KK2NsYXNzIFNvdXJjZVJhbmdlU2VsZWN0aW9uUmVxdWlyZW1lbnQgOiBwdWJsaWMgU291cmNlU2VsZWN0aW9uUmVxdWlyZW1lbnQgeworcHVibGljOgorICBFeHBlY3RlZDxTb3VyY2VSYW5nZT4gZXZhbHVhdGUoUmVmYWN0b3JpbmdSdWxlQ29udGV4dCAmQ29udGV4dCkgY29uc3QgeworICAgIGlmIChDb250ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkuaXNWYWxpZCgpKQorICAgICAgcmV0dXJuIENvbnRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKKyAgICByZXR1cm4gQ29udGV4dC5jcmVhdGVEaWFnbm9zdGljRXJyb3IoZGlhZzo6ZXJyX3JlZmFjdG9yX25vX3NlbGVjdGlvbik7CisgIH0KK307CisKKy8vLyBBbiBBU1Qgc2VsZWN0aW9uIHJlcXVpcmVtZW50IGlzIHNhdGlzZmllZCB3aGVuIGFueSBwb3J0aW9uIG9mIHRoZSBBU1QKKy8vLyBvdmVybGFwcyB3aXRoIHRoZSBzZWxlY3Rpb24gcmFuZ2UuCisvLy8KKy8vLyBUaGUgcmVxdWlyZW1lbnQgd2lsbCBiZSBldmFsdWF0ZWQgb25seSBvbmNlIGR1cmluZyB0aGUgaW5pdGlhdGlvbiBhbmQKKy8vLyBzZWFyY2ggb2YgbWF0Y2hpbmcgcmVmYWN0b3JpbmcgYWN0aW9uIHJ1bGVzLgorY2xhc3MgQVNUU2VsZWN0aW9uUmVxdWlyZW1lbnQgOiBwdWJsaWMgU291cmNlUmFuZ2VTZWxlY3Rpb25SZXF1aXJlbWVudCB7CitwdWJsaWM6CisgIEV4cGVjdGVkPFNlbGVjdGVkQVNUTm9kZT4gZXZhbHVhdGUoUmVmYWN0b3JpbmdSdWxlQ29udGV4dCAmQ29udGV4dCkgY29uc3Q7Cit9OworCisvLy8gQSBzZWxlY3Rpb24gcmVxdWlyZW1lbnQgdGhhdCBpcyBzYXRpc2ZpZWQgd2hlbiB0aGUgc2VsZWN0aW9uIHJhbmdlIG92ZXJsYXBzCisvLy8gd2l0aCBhIG51bWJlciBvZiBuZWlnaGJvdXJpbmcgc3RhdGVtZW50cyBpbiB0aGUgQVNULiBUaGUgc3RhdGVtZW5zdCBtdXN0IGJlCisvLy8gY29udGFpbmVkIGluIGRlY2xhcmF0aW9uIGxpa2UgYSBmdW5jdGlvbi4gVGhlIHNlbGVjdGlvbiByYW5nZSBtdXN0IGJlIGEKKy8vLyBub24tZW1wdHkgc291cmNlIHNlbGVjdGlvbiAoaS5lLiBjdXJzb3JzIHdvbid0IGJlIGFjY2VwdGVkKS4KKy8vLworLy8vIFRoZSByZXF1aXJlbWVudCB3aWxsIGJlIGV2YWx1YXRlZCBvbmx5IG9uY2UgZHVyaW5nIHRoZSBpbml0aWF0aW9uIGFuZCBzZWFyY2gKKy8vLyBvZiBtYXRjaGluZyByZWZhY3RvcmluZyBhY3Rpb24gcnVsZXMuCisvLy8KKy8vLyBcc2VlIENvZGVSYW5nZUFTVFNlbGVjdGlvbgorY2xhc3MgQ29kZVJhbmdlQVNUU2VsZWN0aW9uUmVxdWlyZW1lbnQgOiBwdWJsaWMgQVNUU2VsZWN0aW9uUmVxdWlyZW1lbnQgeworcHVibGljOgorICBFeHBlY3RlZDxDb2RlUmFuZ2VBU1RTZWxlY3Rpb24+CisgIGV2YWx1YXRlKFJlZmFjdG9yaW5nUnVsZUNvbnRleHQgJkNvbnRleHQpIGNvbnN0OworfTsKKworLy8vIEEgYmFzZSBjbGFzcyBmb3IgYW55IHJlcXVpcmVtZW50IHRoYXQgcmVxdWlyZXMgc29tZSByZWZhY3RvcmluZyBvcHRpb25zLgorY2xhc3MgUmVmYWN0b3JpbmdPcHRpb25zUmVxdWlyZW1lbnQgOiBwdWJsaWMgUmVmYWN0b3JpbmdBY3Rpb25SdWxlUmVxdWlyZW1lbnQgeworcHVibGljOgorICB2aXJ0dWFsIH5SZWZhY3RvcmluZ09wdGlvbnNSZXF1aXJlbWVudCgpIHt9CisKKyAgLy8vIFJldHVybnMgdGhlIHNldCBvZiByZWZhY3RvcmluZyBvcHRpb25zIHRoYXQgYXJlIHVzZWQgd2hlbiBldmFsdWF0aW5nIHRoaXMKKyAgLy8vIHJlcXVpcmVtZW50LgorICB2aXJ0dWFsIEFycmF5UmVmPHN0ZDo6c2hhcmVkX3B0cjxSZWZhY3RvcmluZ09wdGlvbj4+CisgIGdldFJlZmFjdG9yaW5nT3B0aW9ucygpIGNvbnN0ID0gMDsKK307CisKKy8vLyBBIHJlcXVpcmVtZW50IHRoYXQgZXZhbHVhdGVzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gXGMgT3B0aW9uVHlwZSB3aGVuCisvLy8gdGhlIFxjIE9wdGlvblR5cGUgaXMgYSByZXF1aXJlZCBvcHRpb24uIFdoZW4gdGhlIFxjIE9wdGlvblR5cGUgaXMgYW4KKy8vLyBvcHRpb25hbCBvcHRpb24sIHRoZSByZXF1aXJlbWVudCB3aWxsIGV2YWx1YXRlIHRvIFxjIE5vbmUgaWYgdGhlIG9wdGlvbiBpcworLy8vIG5vdCBzcGVjaWZpZWQgb3IgdG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUgb3RoZXJ3aXNlLgordGVtcGxhdGUgPHR5cGVuYW1lIE9wdGlvblR5cGU+CitjbGFzcyBPcHRpb25SZXF1aXJlbWVudCA6IHB1YmxpYyBSZWZhY3RvcmluZ09wdGlvbnNSZXF1aXJlbWVudCB7CitwdWJsaWM6CisgIE9wdGlvblJlcXVpcmVtZW50KCkgOiBPcHQoY3JlYXRlUmVmYWN0b3JpbmdPcHRpb248T3B0aW9uVHlwZT4oKSkge30KKworICBBcnJheVJlZjxzdGQ6OnNoYXJlZF9wdHI8UmVmYWN0b3JpbmdPcHRpb24+PgorICBnZXRSZWZhY3RvcmluZ09wdGlvbnMoKSBjb25zdCBmaW5hbCBvdmVycmlkZSB7CisgICAgcmV0dXJuIE9wdDsKKyAgfQorCisgIEV4cGVjdGVkPHR5cGVuYW1lIE9wdGlvblR5cGU6OlZhbHVlVHlwZT4KKyAgZXZhbHVhdGUoUmVmYWN0b3JpbmdSdWxlQ29udGV4dCAmKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE9wdGlvblR5cGUgKj4oT3B0LmdldCgpKS0+Z2V0VmFsdWUoKTsKKyAgfQorCitwcml2YXRlOgorICAvLy8gVGhlIHBhcnRpYWxseS1vd25lZCBvcHRpb24uCisgIC8vLworICAvLy8gVGhlIG93bmVyc2hpcCBvZiB0aGUgb3B0aW9uIGlzIHNoYXJlZCBhbW9uZyB0aGUgZGlmZmVyZW50IHJlcXVpcmVtZW50cworICAvLy8gYmVjYXVzZSB0aGUgc2FtZSBvcHRpb24gY2FuIGJlIHVzZWQgYnkgbXVsdGlwbGUgcnVsZXMgaW4gb25lIHJlZmFjdG9yaW5nCisgIC8vLyBhY3Rpb24uCisgIHN0ZDo6c2hhcmVkX3B0cjxSZWZhY3RvcmluZ09wdGlvbj4gT3B0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHRvb2xpbmcKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SX1JFRkFDVE9SSU5HX0FDVElPTl9SVUxFX1JFUVVJUkVNRU5UU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nQWN0aW9uUnVsZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdBY3Rpb25SdWxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMjA2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nQWN0aW9uUnVsZXMuaApAQCAtMCwwICsxLDk0IEBACisvLz09PS0tLSBSZWZhY3RvcmluZ0FjdGlvblJ1bGVzLmggLSBDbGFuZyByZWZhY3RvcmluZyBsaWJyYXJ5IC0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRUZBQ1RPUklOR19BQ1RJT05fUlVMRVNfSAorI2RlZmluZSBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVGQUNUT1JJTkdfQUNUSU9OX1JVTEVTX0gKKworI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdBY3Rpb25SdWxlLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ0FjdGlvblJ1bGVzSW50ZXJuYWwuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSB0b29saW5nIHsKKworLy8vIENyZWF0ZXMgYSBuZXcgcmVmYWN0b3JpbmcgYWN0aW9uIHJ1bGUgdGhhdCBjb25zdHJ1Y3RzIGFuZCBpbnZva2VzIHRoZQorLy8vIFxjIFJ1bGVUeXBlIHJ1bGUgd2hlbiBhbGwgb2YgdGhlIHJlcXVpcmVtZW50cyBhcmUgc2F0aXNmaWVkLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiB0YWtlcyBpbiBhIGxpc3Qgb2YgdmFsdWVzIHdob3NlIHR5cGUgZGVyaXZlcyBmcm9tCisvLy8gXGMgUmVmYWN0b3JpbmdBY3Rpb25SdWxlUmVxdWlyZW1lbnQuIFRoZXNlIHZhbHVlcyBkZXNjcmliZSB0aGUgaW5pdGlhdGlvbgorLy8vIHJlcXVpcmVtZW50cyB0aGF0IGhhdmUgdG8gYmUgc2F0aXNmaWVkIGJ5IHRoZSByZWZhY3RvcmluZyBlbmdpbmUgYmVmb3JlCisvLy8gdGhlIHByb3ZpZGVkIGFjdGlvbiBydWxlIGNhbiBiZSBjb25zdHJ1Y3RlZCBhbmQgaW52b2tlZC4gVGhlIGVuZ2luZQorLy8vIHZlcmlmaWVzIHRoYXQgdGhlIHJlcXVpcmVtZW50cyBhcmUgc2F0aXNmaWVkIGJ5IGV2YWx1YXRpbmcgdGhlbSAodXNpbmcgdGhlCisvLy8gJ2V2YWx1YXRlJyBtZW1iZXIgZnVuY3Rpb24pIGFuZCBjaGVja2luZyB0aGF0IHRoZSByZXN1bHRzIGRvbid0IGNvbnRhaW4KKy8vLyBhbnkgZXJyb3JzLiBPbmNlIGFsbCByZXF1aXJlbWVudHMgYXJlIHNhdGlzZmllZCwgdGhlIHByb3ZpZGVkIHJlZmFjdG9yaW5nCisvLy8gcnVsZSBpcyBjb25zdHJ1Y3RlZCBieSBwYXNzaW5nIGluIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIHJlcXVpcmVtZW50cycKKy8vLyBldmFsdWF0ZSBmdW5jdGlvbnMgYXMgYXJndW1lbnRzIHRvIHRoZSBjb25zdHJ1Y3Rvci4gVGhlIHJ1bGUgaXMgdGhlbiBpbnZva2VkCisvLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgY29uc3RydWN0aW9uLgorLy8vCisvLy8gVGhlIHNlcGFyYXRpb24gb2YgcmVxdWlyZW1lbnRzLCB0aGVpciBldmFsdWF0aW9uIGFuZCB0aGUgaW52b2NhdGlvbiBvZiB0aGUKKy8vLyByZWZhY3RvcmluZyBhY3Rpb24gcnVsZSBhbGxvd3MgdGhlIHJlZmFjdG9yaW5nIGNsaWVudHMgdG86CisvLy8gICAtIERpc2FibGUgcmVmYWN0b3JpbmcgYWN0aW9uIHJ1bGVzIHdob3NlIHJlcXVpcmVtZW50cyBhcmUgbm90IHN1cHBvcnRlZC4KKy8vLyAgIC0gR2F0aGVyIHRoZSBzZXQgb2Ygb3B0aW9ucyBhbmQgZGVmaW5lIGEgY29tbWFuZC1saW5lIC8gdmlzdWFsIGludGVyZmFjZQorLy8vICAgICB0aGF0IGFsbG93cyB1c2VycyB0byBpbnB1dCB0aGVzZSBvcHRpb25zIHdpdGhvdXQgZXZlciBpbnZva2luZyB0aGUKKy8vLyAgICAgYWN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFJ1bGVUeXBlLCB0eXBlbmFtZS4uLiBSZXF1aXJlbWVudFR5cGVzPgorc3RkOjp1bmlxdWVfcHRyPFJlZmFjdG9yaW5nQWN0aW9uUnVsZT4KK2NyZWF0ZVJlZmFjdG9yaW5nQWN0aW9uUnVsZShjb25zdCBSZXF1aXJlbWVudFR5cGVzICYuLi4gUmVxdWlyZW1lbnRzKTsKKworLy8vIEEgc2V0IG9mIHJlZmFjdG9yaW5nIGFjdGlvbiBydWxlcyB0aGF0IHNob3VsZCBoYXZlIHVuaXF1ZSBpbml0aWF0aW9uCisvLy8gcmVxdWlyZW1lbnRzLgordXNpbmcgUmVmYWN0b3JpbmdBY3Rpb25SdWxlcyA9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFJlZmFjdG9yaW5nQWN0aW9uUnVsZT4+OworCisvLy8gQSB0eXBlIG9mIHJlZmFjdG9yaW5nIGFjdGlvbiBydWxlIHRoYXQgcHJvZHVjZXMgc291cmNlIHJlcGxhY2VtZW50cyBpbiB0aGUKKy8vLyBmb3JtIG9mIGF0b21pYyBjaGFuZ2VzLgorLy8vCisvLy8gVGhpcyBhY3Rpb24gcnVsZSBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgbG9jYWwgcmVmYWN0b3JpbmdzIHRoYXQgcmVwbGFjZQorLy8vIHNvdXJjZSBpbiBhIHNpbmdsZSBBU1QgdW5pdC4KK2NsYXNzIFNvdXJjZUNoYW5nZVJlZmFjdG9yaW5nUnVsZSA6IHB1YmxpYyBSZWZhY3RvcmluZ0FjdGlvblJ1bGVCYXNlIHsKK3B1YmxpYzoKKyAgdm9pZCBpbnZva2UoUmVmYWN0b3JpbmdSZXN1bHRDb25zdW1lciAmQ29uc3VtZXIsCisgICAgICAgICAgICAgIFJlZmFjdG9yaW5nUnVsZUNvbnRleHQgJkNvbnRleHQpIGZpbmFsIG92ZXJyaWRlIHsKKyAgICBFeHBlY3RlZDxBdG9taWNDaGFuZ2VzPiBDaGFuZ2VzID0gY3JlYXRlU291cmNlUmVwbGFjZW1lbnRzKENvbnRleHQpOworICAgIGlmICghQ2hhbmdlcykKKyAgICAgIENvbnN1bWVyLmhhbmRsZUVycm9yKENoYW5nZXMudGFrZUVycm9yKCkpOworICAgIGVsc2UKKyAgICAgIENvbnN1bWVyLmhhbmRsZShzdGQ6Om1vdmUoKkNoYW5nZXMpKTsKKyAgfQorCitwcml2YXRlOgorICB2aXJ0dWFsIEV4cGVjdGVkPEF0b21pY0NoYW5nZXM+CisgIGNyZWF0ZVNvdXJjZVJlcGxhY2VtZW50cyhSZWZhY3RvcmluZ1J1bGVDb250ZXh0ICZDb250ZXh0KSA9IDA7Cit9OworCisvLy8gQSB0eXBlIG9mIHJlZmFjdG9yaW5nIGFjdGlvbiBydWxlIHRoYXQgZmluZHMgYSBzZXQgb2Ygc3ltYm9sIG9jY3VycmVuY2VzCisvLy8gdGhhdCByZWZlcmVuY2UgYSBwYXJ0aWN1bGFyIHN5bWJvbC4KKy8vLworLy8vIFRoaXMgYWN0aW9uIHJ1bGUgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGFuIGludGVyYWN0aXZlIHJlbmFtZSB0aGF0IGFsbG93cworLy8vIHVzZXJzIHRvIHNwZWNpZnkgdGhlIG5ldyBuYW1lIGFuZCB0aGUgc2V0IG9mIHNlbGVjdGVkIG9jY3VycmVuY2VzIGR1cmluZworLy8vIHRoZSByZWZhY3RvcmluZy4KK2NsYXNzIEZpbmRTeW1ib2xPY2N1cnJlbmNlc1JlZmFjdG9yaW5nUnVsZSA6IHB1YmxpYyBSZWZhY3RvcmluZ0FjdGlvblJ1bGVCYXNlIHsKK3B1YmxpYzoKKyAgdm9pZCBpbnZva2UoUmVmYWN0b3JpbmdSZXN1bHRDb25zdW1lciAmQ29uc3VtZXIsCisgICAgICAgICAgICAgIFJlZmFjdG9yaW5nUnVsZUNvbnRleHQgJkNvbnRleHQpIGZpbmFsIG92ZXJyaWRlIHsKKyAgICBFeHBlY3RlZDxTeW1ib2xPY2N1cnJlbmNlcz4gT2NjdXJyZW5jZXMgPSBmaW5kU3ltYm9sT2NjdXJyZW5jZXMoQ29udGV4dCk7CisgICAgaWYgKCFPY2N1cnJlbmNlcykKKyAgICAgIENvbnN1bWVyLmhhbmRsZUVycm9yKE9jY3VycmVuY2VzLnRha2VFcnJvcigpKTsKKyAgICBlbHNlCisgICAgICBDb25zdW1lci5oYW5kbGUoc3RkOjptb3ZlKCpPY2N1cnJlbmNlcykpOworICB9CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgRXhwZWN0ZWQ8U3ltYm9sT2NjdXJyZW5jZXM+CisgIGZpbmRTeW1ib2xPY2N1cnJlbmNlcyhSZWZhY3RvcmluZ1J1bGVDb250ZXh0ICZDb250ZXh0KSA9IDA7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgdG9vbGluZworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVGQUNUT1JJTkdfQUNUSU9OX1JVTEVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdBY3Rpb25SdWxlc0ludGVybmFsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nQWN0aW9uUnVsZXNJbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YjZjOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nQWN0aW9uUnVsZXNJbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTU4IEBACisvLz09PS0tLSBSZWZhY3RvcmluZ0FjdGlvblJ1bGVzSW50ZXJuYWwuaCAtIENsYW5nIHJlZmFjdG9yaW5nIGxpYnJhcnkgLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRUZBQ1RPUklOR19BQ1RJT05fUlVMRVNfSU5URVJOQUxfSAorI2RlZmluZSBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVGQUNUT1JJTkdfQUNUSU9OX1JVTEVTX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nQWN0aW9uUnVsZS5oIgorI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdBY3Rpb25SdWxlUmVxdWlyZW1lbnRzLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ1Jlc3VsdENvbnN1bWVyLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ1J1bGVDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgdG9vbGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCitpbmxpbmUgbGx2bTo6RXJyb3IgZmluZEVycm9yKCkgeyByZXR1cm4gbGx2bTo6RXJyb3I6OnN1Y2Nlc3MoKTsgfQorCitpbmxpbmUgdm9pZCBpZ25vcmVFcnJvcigpIHt9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGaXJzdFQsIHR5cGVuYW1lLi4uIFJlc3RUPgordm9pZCBpZ25vcmVFcnJvcihFeHBlY3RlZDxGaXJzdFQ+ICZGaXJzdCwgRXhwZWN0ZWQ8UmVzdFQ+ICYuLi4gUmVzdCkgeworICBpZiAoIUZpcnN0KQorICAgIGxsdm06OmNvbnN1bWVFcnJvcihGaXJzdC50YWtlRXJyb3IoKSk7CisgIGlnbm9yZUVycm9yKFJlc3QuLi4pOworfQorCisvLy8gU2NhbnMgdGhlIHR1cGxlIGFuZCByZXR1cm5zIGEgdmFsaWQgXGMgRXJyb3IgaWYgYW55IG9mIHRoZSB2YWx1ZXMgYXJlCisvLy8gaW52YWxpZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGaXJzdFQsIHR5cGVuYW1lLi4uIFJlc3RUPgorbGx2bTo6RXJyb3IgZmluZEVycm9yKEV4cGVjdGVkPEZpcnN0VD4gJkZpcnN0LCBFeHBlY3RlZDxSZXN0VD4gJi4uLiBSZXN0KSB7CisgIGlmICghRmlyc3QpIHsKKyAgICBpZ25vcmVFcnJvcihSZXN0Li4uKTsKKyAgICByZXR1cm4gRmlyc3QudGFrZUVycm9yKCk7CisgIH0KKyAgcmV0dXJuIGZpbmRFcnJvcihSZXN0Li4uKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFJ1bGVUeXBlLCB0eXBlbmFtZS4uLiBSZXF1aXJlbWVudFR5cGVzLCBzaXplX3QuLi4gSXM+Cit2b2lkIGludm9rZVJ1bGVBZnRlclZhbGlkYXRpbmdSZXF1aXJlbWVudHMoCisgICAgUmVmYWN0b3JpbmdSZXN1bHRDb25zdW1lciAmQ29uc3VtZXIsIFJlZmFjdG9yaW5nUnVsZUNvbnRleHQgJkNvbnRleHQsCisgICAgY29uc3Qgc3RkOjp0dXBsZTxSZXF1aXJlbWVudFR5cGVzLi4uPiAmUmVxdWlyZW1lbnRzLAorICAgIGxsdm06OmluZGV4X3NlcXVlbmNlPElzLi4uPikgeworICAvLyBDaGVjayBpZiB0aGUgcmVxdWlyZW1lbnRzIHdlJ3JlIGludGVyZXN0ZWQgaW4gY2FuIGJlIGV2YWx1YXRlZC4KKyAgYXV0byBWYWx1ZXMgPQorICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PElzPihSZXF1aXJlbWVudHMpLmV2YWx1YXRlKENvbnRleHQpLi4uKTsKKyAgYXV0byBFcnIgPSBmaW5kRXJyb3Ioc3RkOjpnZXQ8SXM+KFZhbHVlcykuLi4pOworICBpZiAoRXJyKQorICAgIHJldHVybiBDb25zdW1lci5oYW5kbGVFcnJvcihzdGQ6Om1vdmUoRXJyKSk7CisgIC8vIENvbnN0cnVjdCB0aGUgdGFyZ2V0IGFjdGlvbiBydWxlIGJ5IGV4dHJhY3RpbmcgdGhlIGV2YWx1YXRlZAorICAvLyByZXF1aXJlbWVudHMgZnJvbSBFeHBlY3RlZDw+IHdyYXBwZXJzIGFuZCB0aGVuIHJ1biBpdC4KKyAgYXV0byBSdWxlID0KKyAgICAgIFJ1bGVUeXBlOjppbml0aWF0ZShDb250ZXh0LCBzdGQ6Om1vdmUoKCpzdGQ6OmdldDxJcz4oVmFsdWVzKSkpLi4uKTsKKyAgaWYgKCFSdWxlKQorICAgIHJldHVybiBDb25zdW1lci5oYW5kbGVFcnJvcihSdWxlLnRha2VFcnJvcigpKTsKKyAgUnVsZS0+aW52b2tlKENvbnN1bWVyLCBDb250ZXh0KTsKK30KKworaW5saW5lIHZvaWQgdmlzaXRSZWZhY3RvcmluZ09wdGlvbnNJbXBsKFJlZmFjdG9yaW5nT3B0aW9uVmlzaXRvciAmKSB7fQorCisvLy8gU2NhbnMgdGhlIGxpc3Qgb2YgcmVxdWlyZW1lbnRzIGluIGEgcnVsZSBhbmQgdmlzaXRzIGFsbCB0aGUgcmVmYWN0b3JpbmcKKy8vLyBvcHRpb25zIHRoYXQgYXJlIHVzZWQgYnkgYWxsIHRoZSByZXF1aXJlbWVudHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRmlyc3RULCB0eXBlbmFtZS4uLiBSZXN0VD4KK3ZvaWQgdmlzaXRSZWZhY3RvcmluZ09wdGlvbnNJbXBsKFJlZmFjdG9yaW5nT3B0aW9uVmlzaXRvciAmVmlzaXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpcnN0VCAmRmlyc3QsIGNvbnN0IFJlc3RUICYuLi4gUmVzdCkgeworICBzdHJ1Y3QgT3B0aW9uR2F0aGVyZXIgeworICAgIFJlZmFjdG9yaW5nT3B0aW9uVmlzaXRvciAmVmlzaXRvcjsKKworICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSZWZhY3RvcmluZ09wdGlvbnNSZXF1aXJlbWVudCAmUmVxdWlyZW1lbnQpIHsKKyAgICAgIGZvciAoY29uc3QgYXV0byAmT3B0aW9uIDogUmVxdWlyZW1lbnQuZ2V0UmVmYWN0b3JpbmdPcHRpb25zKCkpCisgICAgICAgIE9wdGlvbi0+cGFzc1RvVmlzaXRvcihWaXNpdG9yKTsKKyAgICB9CisgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJlZmFjdG9yaW5nQWN0aW9uUnVsZVJlcXVpcmVtZW50ICYpIHt9CisgIH07CisgIChPcHRpb25HYXRoZXJlcntWaXNpdG9yfSkoRmlyc3QpOworICByZXR1cm4gdmlzaXRSZWZhY3RvcmluZ09wdGlvbnNJbXBsKFZpc2l0b3IsIFJlc3QuLi4pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gUmVxdWlyZW1lbnRUeXBlcywgc2l6ZV90Li4uIElzPgordm9pZCB2aXNpdFJlZmFjdG9yaW5nT3B0aW9ucygKKyAgICBSZWZhY3RvcmluZ09wdGlvblZpc2l0b3IgJlZpc2l0b3IsCisgICAgY29uc3Qgc3RkOjp0dXBsZTxSZXF1aXJlbWVudFR5cGVzLi4uPiAmUmVxdWlyZW1lbnRzLAorICAgIGxsdm06OmluZGV4X3NlcXVlbmNlPElzLi4uPikgeworICB2aXNpdFJlZmFjdG9yaW5nT3B0aW9uc0ltcGwoVmlzaXRvciwgc3RkOjpnZXQ8SXM+KFJlcXVpcmVtZW50cykuLi4pOworfQorCisvLy8gQSB0eXBlIHRyYWl0IHRoYXQgcmV0dXJucyB0cnVlIHdoZW4gdGhlIGdpdmVuIHR5cGUgbGlzdCBoYXMgYXQgbGVhc3Qgb25lCisvLy8gdHlwZSB3aG9zZSBiYXNlIGlzIHRoZSBnaXZlbiBiYXNlIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmFzZSwgdHlwZW5hbWUgRmlyc3QsIHR5cGVuYW1lLi4uIFJlc3Q+CitzdHJ1Y3QgSGFzQmFzZU9mIDogc3RkOjpjb25kaXRpb25hbDxIYXNCYXNlT2Y8QmFzZSwgRmlyc3Q+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc0Jhc2VPZjxCYXNlLCBSZXN0Li4uPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRydWVfdHlwZSwgc3RkOjpmYWxzZV90eXBlPjo6dHlwZSB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEJhc2UsIHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSGFzQmFzZU9mPEJhc2UsIFQ+IDogc3RkOjppc19iYXNlX29mPEJhc2UsIFQ+IHt9OworCisvLy8gQSB0eXBlIHRyYWl0IHRoYXQgcmV0dXJucyB0cnVlIHdoZW4gdGhlIGdpdmVuIHR5cGUgbGlzdCBjb250YWlucyB0eXBlcyB0aGF0CisvLy8gZGVyaXZlIGZyb20gQmFzZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBCYXNlLCB0eXBlbmFtZSBGaXJzdCwgdHlwZW5hbWUuLi4gUmVzdD4KK3N0cnVjdCBBcmVCYXNlT2YgOiBzdGQ6OmNvbmRpdGlvbmFsPEFyZUJhc2VPZjxCYXNlLCBGaXJzdD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJlQmFzZU9mPEJhc2UsIFJlc3QuLi4+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dHJ1ZV90eXBlLCBzdGQ6OmZhbHNlX3R5cGU+Ojp0eXBlIHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmFzZSwgdHlwZW5hbWUgVD4KK3N0cnVjdCBBcmVCYXNlT2Y8QmFzZSwgVD4gOiBzdGQ6OmlzX2Jhc2Vfb2Y8QmFzZSwgVD4ge307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUnVsZVR5cGUsIHR5cGVuYW1lLi4uIFJlcXVpcmVtZW50VHlwZXM+CitzdGQ6OnVuaXF1ZV9wdHI8UmVmYWN0b3JpbmdBY3Rpb25SdWxlPgorY3JlYXRlUmVmYWN0b3JpbmdBY3Rpb25SdWxlKGNvbnN0IFJlcXVpcmVtZW50VHlwZXMgJi4uLiBSZXF1aXJlbWVudHMpIHsKKyAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Jhc2Vfb2Y8UmVmYWN0b3JpbmdBY3Rpb25SdWxlQmFzZSwgUnVsZVR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYSByZWZhY3RvcmluZyBhY3Rpb24gcnVsZSB0eXBlIik7CisgIHN0YXRpY19hc3NlcnQoaW50ZXJuYWw6OkFyZUJhc2VPZjxSZWZhY3RvcmluZ0FjdGlvblJ1bGVSZXF1aXJlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVtZW50VHlwZXMuLi4+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYSBsaXN0IG9mIHJlZmFjdG9yaW5nIGFjdGlvbiBydWxlcyIpOworCisgIGNsYXNzIFJ1bGUgZmluYWwgOiBwdWJsaWMgUmVmYWN0b3JpbmdBY3Rpb25SdWxlIHsKKyAgcHVibGljOgorICAgIFJ1bGUoc3RkOjp0dXBsZTxSZXF1aXJlbWVudFR5cGVzLi4uPiBSZXF1aXJlbWVudHMpCisgICAgICAgIDogUmVxdWlyZW1lbnRzKFJlcXVpcmVtZW50cykge30KKworICAgIHZvaWQgaW52b2tlKFJlZmFjdG9yaW5nUmVzdWx0Q29uc3VtZXIgJkNvbnN1bWVyLAorICAgICAgICAgICAgICAgIFJlZmFjdG9yaW5nUnVsZUNvbnRleHQgJkNvbnRleHQpIG92ZXJyaWRlIHsKKyAgICAgIGludGVybmFsOjppbnZva2VSdWxlQWZ0ZXJWYWxpZGF0aW5nUmVxdWlyZW1lbnRzPFJ1bGVUeXBlPigKKyAgICAgICAgICBDb25zdW1lciwgQ29udGV4dCwgUmVxdWlyZW1lbnRzLAorICAgICAgICAgIGxsdm06OmluZGV4X3NlcXVlbmNlX2ZvcjxSZXF1aXJlbWVudFR5cGVzLi4uPigpKTsKKyAgICB9CisKKyAgICBib29sIGhhc1NlbGVjdGlvblJlcXVpcmVtZW50KCkgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIGludGVybmFsOjpIYXNCYXNlT2Y8U291cmNlU2VsZWN0aW9uUmVxdWlyZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlbWVudFR5cGVzLi4uPjo6dmFsdWU7CisgICAgfQorCisgICAgdm9pZCB2aXNpdFJlZmFjdG9yaW5nT3B0aW9ucyhSZWZhY3RvcmluZ09wdGlvblZpc2l0b3IgJlZpc2l0b3IpIG92ZXJyaWRlIHsKKyAgICAgIGludGVybmFsOjp2aXNpdFJlZmFjdG9yaW5nT3B0aW9ucygKKyAgICAgICAgICBWaXNpdG9yLCBSZXF1aXJlbWVudHMsCisgICAgICAgICAgbGx2bTo6aW5kZXhfc2VxdWVuY2VfZm9yPFJlcXVpcmVtZW50VHlwZXMuLi4+KCkpOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnR1cGxlPFJlcXVpcmVtZW50VHlwZXMuLi4+IFJlcXVpcmVtZW50czsKKyAgfTsKKworICByZXR1cm4gbGx2bTo6bWFrZV91bmlxdWU8UnVsZT4oc3RkOjptYWtlX3R1cGxlKFJlcXVpcmVtZW50cy4uLikpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgdG9vbGluZworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVGQUNUT1JJTkdfQUNUSU9OX1JVTEVTX0lOVEVSTkFMX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdEaWFnbm9zdGljLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nRGlhZ25vc3RpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NjdkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nRGlhZ25vc3RpYy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vPT09LS0tIFJlZmFjdG9yaW5nRGlhZ25vc3RpYy5oIC0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SSU5HX1JFRkFDVE9SSU5HRElBR05PU1RJQ19ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUklOR19SRUZBQ1RPUklOR0RJQUdOT1NUSUNfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1BhcnRpYWxEaWFnbm9zdGljLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgZGlhZyB7CitlbnVtIHsKKyNkZWZpbmUgRElBRyhFTlVNLCBGTEFHUywgREVGQVVMVF9NQVBQSU5HLCBERVNDLCBHUk9VUCwgU0ZJTkFFLCBOT1dFUlJPUiwgICAgICBcCisgICAgICAgICAgICAgU0hPV0lOU1lTSEVBREVSLCBDQVRFR09SWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNLAorI2RlZmluZSBSRUZBQ1RPUklOR1NUQVJUCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpY1JlZmFjdG9yaW5nS2luZHMuaW5jIgorI3VuZGVmIERJQUcKKyAgTlVNX0JVSUxUSU5fUkVGQUNUT1JJTkdfRElBR05PU1RJQ1MKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgZGlhZworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JJTkdfUkVGQUNUT1JJTkdESUFHTk9TVElDX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdPcHRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdPcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDExMjIzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ09wdGlvbi5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vPT09LS0tIFJlZmFjdG9yaW5nT3B0aW9uLmggLSBDbGFuZyByZWZhY3RvcmluZyBsaWJyYXJ5IC0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SX1JFRkFDVE9SSU5HX09QVElPTl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRUZBQ1RPUklOR19PUFRJT05fSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSB0b29saW5nIHsKKworY2xhc3MgUmVmYWN0b3JpbmdPcHRpb25WaXNpdG9yOworCisvLy8gQSByZWZhY3RvcmluZyBvcHRpb24gaXMgYW4gaW50ZXJmYWNlIHRoYXQgZGVzY3JpYmVzIGEgdmFsdWUgdGhhdAorLy8vIGhhcyBhbiBpbXBhY3Qgb24gdGhlIG91dGNvbWUgb2YgYSByZWZhY3RvcmluZy4KKy8vLworLy8vIFJlZmFjdG9yaW5nIG9wdGlvbnMgY2FuIGJlIHNwZWNpZmllZCB1c2luZyBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHdoZW4KKy8vLyB0aGUgY2xhbmctcmVmYWN0b3IgdG9vbCBpcyB1c2VkLgorY2xhc3MgUmVmYWN0b3JpbmdPcHRpb24geworcHVibGljOgorICB2aXJ0dWFsIH5SZWZhY3RvcmluZ09wdGlvbigpIHt9CisKKyAgLy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHJlZmFjdG9yaW5nIG9wdGlvbi4KKyAgLy8vCisgIC8vLyBFYWNoIHJlZmFjdG9yaW5nIG9wdGlvbiBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZS4KKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXREZXNjcmlwdGlvbigpIGNvbnN0ID0gMDsKKworICAvLy8gVHJ1ZSB3aGVuIHRoaXMgb3B0aW9uIG11c3QgYmUgc3BlY2lmaWVkIGJlZm9yZSBpbnZva2luZyB0aGUgcmVmYWN0b3JpbmcKKyAgLy8vIGFjdGlvbi4KKyAgdmlydHVhbCBib29sIGlzUmVxdWlyZWQoKSBjb25zdCA9IDA7CisKKyAgLy8vIEludm9rZXMgdGhlIFxjIHZpc2l0IG1ldGhvZCBpbiB0aGUgb3B0aW9uIGNvbnN1bWVyIHRoYXQncyBhcHByb3ByaWF0ZQorICAvLy8gZm9yIHRoZSBvcHRpb24ncyB2YWx1ZSB0eXBlLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlLCBpZiB0aGUgb3B0aW9uIHN0b3JlcyBhIHN0cmluZyB2YWx1ZSwgdGhpcyBtZXRob2Qgd2lsbAorICAvLy8gaW52b2tlIHRoZSBcYyB2aXNpdCBtZXRob2Qgd2l0aCBhIHJlZmVyZW5jZSB0byBhbiBzdGQ6OnN0cmluZyB2YWx1ZS4KKyAgdmlydHVhbCB2b2lkIHBhc3NUb1Zpc2l0b3IoUmVmYWN0b3JpbmdPcHRpb25WaXNpdG9yICZWaXNpdG9yKSA9IDA7Cit9OworCisvLy8gQ29uc3RydWN0cyBhIHJlZmFjdG9yaW5nIG9wdGlvbiBvZiB0aGUgZ2l2ZW4gdHlwZS4KKy8vLworLy8vIFRoZSBvd25lcnNoaXAgb2Ygb3B0aW9ucyBpcyBzaGFyZWQgYW1vbmcgcmVxdWlyZW1lbnRzIHRoYXQgdXNlIGl0IGJlY2F1c2UKKy8vLyBvbmUgb3B0aW9uIGNhbiBiZSB1c2VkIGJ5IG11bHRpcGxlIHJ1bGVzIGluIGEgcmVmYWN0b3JpbmcgYWN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIE9wdGlvblR5cGU+CitzdGQ6OnNoYXJlZF9wdHI8T3B0aW9uVHlwZT4gY3JlYXRlUmVmYWN0b3JpbmdPcHRpb24oKSB7CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19iYXNlX29mPFJlZmFjdG9yaW5nT3B0aW9uLCBPcHRpb25UeXBlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgImludmFsaWQgb3B0aW9uIHR5cGUiKTsKKyAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8T3B0aW9uVHlwZT4oKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIHRvb2xpbmcKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SX1JFRkFDVE9SSU5HX09QVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nT3B0aW9uVmlzaXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ09wdGlvblZpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWE4ZmE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ09wdGlvblZpc2l0b3IuaApAQCAtMCwwICsxLDYyIEBACisvLz09PS0tLSBSZWZhY3RvcmluZ09wdGlvblZpc2l0b3IuaCAtIENsYW5nIHJlZmFjdG9yaW5nIGxpYnJhcnkgLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRUZBQ1RPUklOR19PUFRJT05fVklTSVRPUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRUZBQ1RPUklOR19PUFRJT05fVklTSVRPUl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgdG9vbGluZyB7CisKK2NsYXNzIFJlZmFjdG9yaW5nT3B0aW9uOworCisvLy8gQW4gaW50ZXJmYWNlIHRoYXQgZGVjbGFyZXMgZnVuY3Rpb25zIHRoYXQgaGFuZGxlIGRpZmZlcmVudCByZWZhY3RvcmluZworLy8vIG9wdGlvbiB0eXBlcy4KKy8vLworLy8vIEEgdmFsaWQgcmVmYWN0b3Jpbmcgb3B0aW9uIHR5cGUgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBcYyB2aXNpdAorLy8vIGRlY2xhcmF0aW9uIGluIHRoaXMgaW50ZXJmYWNlLgorY2xhc3MgUmVmYWN0b3JpbmdPcHRpb25WaXNpdG9yIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+UmVmYWN0b3JpbmdPcHRpb25WaXNpdG9yKCkge30KKworICB2aXJ0dWFsIHZvaWQgdmlzaXQoY29uc3QgUmVmYWN0b3JpbmdPcHRpb24gJk9wdCwKKyAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHN0ZDo6c3RyaW5nPiAmVmFsdWUpID0gMDsKK307CisKK25hbWVzcGFjZSB0cmFpdHMgeworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBIYXNIYW5kbGUgeworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzVD4KKyAgc3RhdGljIGF1dG8gY2hlY2soQ2xhc3NUICopIC0+IHR5cGVuYW1lIHN0ZDo6aXNfc2FtZTwKKyAgICAgIGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxSZWZhY3RvcmluZ09wdGlvblZpc2l0b3I+KCkudmlzaXQoCisgICAgICAgICAgc3RkOjpkZWNsdmFsPFJlZmFjdG9yaW5nT3B0aW9uPigpLCAqc3RkOjpkZWNsdmFsPE9wdGlvbmFsPFQ+ICo+KCkpKSwKKyAgICAgIHZvaWQ+Ojp0eXBlOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZT4gc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBjaGVjayguLi4pOworCitwdWJsaWM6CisgIHVzaW5nIFR5cGUgPSBkZWNsdHlwZShjaGVjazxSZWZhY3RvcmluZ09wdGlvblZpc2l0b3I+KG51bGxwdHIpKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLy8gQSB0eXBlIHRyYWl0IHRoYXQgcmV0dXJucyB0cnVlIGlmZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhIHR5cGUgdGhhdCBjYW4gYmUKKy8vLyBzdG9yZWQgaW4gYSByZWZhY3RvcmluZyBvcHRpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJc1ZhbGlkT3B0aW9uVHlwZSA6IGludGVybmFsOjpIYXNIYW5kbGU8VD46OlR5cGUge307CisKK30gLy8gZW5kIG5hbWVzcGFjZSB0cmFpdHMKK30gLy8gZW5kIG5hbWVzcGFjZSB0b29saW5nCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRUZBQ1RPUklOR19PUFRJT05fVklTSVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nT3B0aW9ucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ09wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDVjMGEwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ09wdGlvbnMuaApAQCAtMCwwICsxLDU4IEBACisvLz09PS0tLSBSZWZhY3RvcmluZ09wdGlvbnMuaCAtIENsYW5nIHJlZmFjdG9yaW5nIGxpYnJhcnkgLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRUZBQ1RPUklOR19PUFRJT05TX0gKKyNkZWZpbmUgTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SX1JFRkFDVE9SSU5HX09QVElPTlNfSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdBY3Rpb25SdWxlUmVxdWlyZW1lbnRzLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ09wdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdPcHRpb25WaXNpdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgdG9vbGluZyB7CisKKy8vLyBBIHJlZmFjdG9yaW5nIG9wdGlvbiB0aGF0IHN0b3JlcyBhIHZhbHVlIG9mIHR5cGUgXGMgVC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHM6OklzVmFsaWRPcHRpb25UeXBlPFQ+Ojp2YWx1ZT46OnR5cGU+CitjbGFzcyBPcHRpb25hbFJlZmFjdG9yaW5nT3B0aW9uIDogcHVibGljIFJlZmFjdG9yaW5nT3B0aW9uIHsKK3B1YmxpYzoKKyAgdm9pZCBwYXNzVG9WaXNpdG9yKFJlZmFjdG9yaW5nT3B0aW9uVmlzaXRvciAmVmlzaXRvcikgZmluYWwgb3ZlcnJpZGUgeworICAgIFZpc2l0b3IudmlzaXQoKnRoaXMsIFZhbHVlKTsKKyAgfQorCisgIGJvb2wgaXNSZXF1aXJlZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgdXNpbmcgVmFsdWVUeXBlID0gT3B0aW9uYWw8VD47CisKKyAgY29uc3QgVmFsdWVUeXBlICZnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKK3Byb3RlY3RlZDoKKyAgT3B0aW9uYWw8VD4gVmFsdWU7Cit9OworCisvLy8gQSByZXF1aXJlZCByZWZhY3RvcmluZyBvcHRpb24gdGhhdCBzdG9yZXMgYSB2YWx1ZSBvZiB0eXBlIFxjIFQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzOjpJc1ZhbGlkT3B0aW9uVHlwZTxUPjo6dmFsdWU+Ojp0eXBlPgorY2xhc3MgUmVxdWlyZWRSZWZhY3RvcmluZ09wdGlvbiA6IHB1YmxpYyBPcHRpb25hbFJlZmFjdG9yaW5nT3B0aW9uPFQ+IHsKK3B1YmxpYzoKKyAgdXNpbmcgVmFsdWVUeXBlID0gVDsKKworICBjb25zdCBWYWx1ZVR5cGUgJmdldFZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiAqT3B0aW9uYWxSZWZhY3RvcmluZ09wdGlvbjxUPjo6VmFsdWU7CisgIH0KKyAgYm9vbCBpc1JlcXVpcmVkKCkgY29uc3QgZmluYWwgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHRvb2xpbmcKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SX1JFRkFDVE9SSU5HX09QVElPTlNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ1Jlc3VsdENvbnN1bWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nUmVzdWx0Q29uc3VtZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTc3MzhlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ1Jlc3VsdENvbnN1bWVyLmgKQEAgLTAsMCArMSw1MiBAQAorLy89PT0tLS0gUmVmYWN0b3JpbmdSZXN1bHRDb25zdW1lci5oIC0gQ2xhbmcgcmVmYWN0b3JpbmcgbGlicmFyeSAtLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVGQUNUT1JJTkdfUkVTVUxUX0NPTlNVTUVSX0gKKyNkZWZpbmUgTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SX1JFRkFDVE9SSU5HX1JFU1VMVF9DT05TVU1FUl9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9BdG9taWNDaGFuZ2UuaCIKKyNpbmNsdWRlICJjbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlbmFtZS9TeW1ib2xPY2N1cnJlbmNlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIHRvb2xpbmcgeworCisvLy8gQW4gYWJzdHJhY3QgaW50ZXJmYWNlIHRoYXQgY29uc3VtZXMgdGhlIHZhcmlvdXMgcmVmYWN0b3JpbmcgcmVzdWx0cyB0aGF0IGNhbgorLy8vIGJlIHByb2R1Y2VkIGJ5IHJlZmFjdG9yaW5nIGFjdGlvbnMuCisvLy8KKy8vLyBBIHZhbGlkIHJlZmFjdG9yaW5nIHJlc3VsdCBtdXN0IGJlIGhhbmRsZWQgYnkgYSBcYyBoYW5kbGUgbWV0aG9kLgorY2xhc3MgUmVmYWN0b3JpbmdSZXN1bHRDb25zdW1lciB7CitwdWJsaWM6CisgIHZpcnR1YWwgflJlZmFjdG9yaW5nUmVzdWx0Q29uc3VtZXIoKSB7fQorCisgIC8vLyBIYW5kbGVzIGFuIGluaXRhdGlvbiBvciBhbiBpbnZpY2F0aW9uIGVycm9yLiBBbiBpbml0aWF0aW9uIGVycm9yIHR5cGljYWxseQorICAvLy8gaGFzIGEgXGMgRGlhZ25vc3RpY0Vycm9yIHBheWxvYWQgdGhhdCBkZXNjcmliZXMgd2h5IGluaXRhdGlvbiBmYWlsZWQuCisgIHZpcnR1YWwgdm9pZCBoYW5kbGVFcnJvcihsbHZtOjpFcnJvciBFcnIpID0gMDsKKworICAvLy8gSGFuZGxlcyB0aGUgc291cmNlIHJlcGxhY2VtZW50cyB0aGF0IGFyZSBwcm9kdWNlZCBieSBhIHJlZmFjdG9yaW5nIGFjdGlvbi4KKyAgdmlydHVhbCB2b2lkIGhhbmRsZShBdG9taWNDaGFuZ2VzIFNvdXJjZVJlcGxhY2VtZW50cykgeworICAgIGRlZmF1bHRSZXN1bHRIYW5kbGVyKCk7CisgIH0KKworICAvLy8gSGFuZGxlcyB0aGUgc3ltYm9sIG9jY3VycmVuY2VzIHRoYXQgYXJlIGZvdW5kIGJ5IGFuIGludGVyYWN0aXZlCisgIC8vLyByZWZhY3RvcmluZyBhY3Rpb24uCisgIHZpcnR1YWwgdm9pZCBoYW5kbGUoU3ltYm9sT2NjdXJyZW5jZXMgT2NjdXJyZW5jZXMpIHsgZGVmYXVsdFJlc3VsdEhhbmRsZXIoKTsgfQorCitwcml2YXRlOgorICB2b2lkIGRlZmF1bHRSZXN1bHRIYW5kbGVyKCkgeworICAgIGhhbmRsZUVycm9yKGxsdm06Om1ha2VfZXJyb3I8bGx2bTo6U3RyaW5nRXJyb3I+KAorICAgICAgICAidW5zdXBwb3J0ZWQgcmVmYWN0b3JpbmcgcmVzdWx0IiwgbGx2bTo6aW5jb252ZXJ0aWJsZUVycm9yQ29kZSgpKSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSB0b29saW5nCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRUZBQ1RPUklOR19SRVNVTFRfQ09OU1VNRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ1J1bGVDb250ZXh0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nUnVsZUNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODJhYjgyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZWZhY3RvcmluZ1J1bGVDb250ZXh0LmgKQEAgLTAsMCArMSw5MCBAQAorLy89PT0tLS0gUmVmYWN0b3JpbmdSdWxlQ29udGV4dC5oIC0gQ2xhbmcgcmVmYWN0b3JpbmcgbGlicmFyeSAtLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVGQUNUT1JJTkdfUlVMRV9DT05URVhUX0gKKyNkZWZpbmUgTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SX1JFRkFDVE9SSU5HX1JVTEVfQ09OVEVYVF9ICisKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljRXJyb3IuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9BU1RTZWxlY3Rpb24uaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQVNUQ29udGV4dDsKKworbmFtZXNwYWNlIHRvb2xpbmcgeworCisvLy8gVGhlIHJlZmFjdG9yaW5nIHJ1bGUgY29udGV4dCBzdG9yZXMgYWxsIG9mIHRoZSBpbnB1dHMgdGhhdCBtaWdodCBiZSBuZWVkZWQKKy8vLyBieSBhIHJlZmFjdG9yaW5nIGFjdGlvbiBydWxlLiBJdCBjYW4gY3JlYXRlIHRoZSBzcGVjaWFsaXplZAorLy8vIFxjIEFTVFJlZmFjdG9yaW5nT3BlcmF0aW9uIG9yIFxjIFByZXByb2Nlc3NvclJlZmFjdG9yaW5nT3BlcmF0aW9uIHZhbHVlcworLy8vIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIHJlZmFjdG9yaW5nIGFjdGlvbiBydWxlcy4KKy8vLworLy8vIFRoZSBmb2xsb3dpbmcgaW5wdXRzIGFyZSBzdG9yZWQgYnkgdGhlIG9wZXJhdGlvbjoKKy8vLworLy8vICAgLSBTb3VyY2VNYW5hZ2VyOiBhIHJlZmVyZW5jZSB0byBhIHZhbGlkIHNvdXJjZSBtYW5hZ2VyLgorLy8vCisvLy8gICAtIFNlbGVjdGlvblJhbmdlOiBhbiBvcHRpb25hbCBzb3VyY2Ugc2VsZWN0aW9uIHJhbmdlcyB0aGF0IGNhbiBiZSB1c2VkCisvLy8gICAgIHRvIHJlcHJlc2VudCBhIHNlbGVjdGlvbiBpbiBhbiBlZGl0b3IuCitjbGFzcyBSZWZhY3RvcmluZ1J1bGVDb250ZXh0IHsKK3B1YmxpYzoKKyAgUmVmYWN0b3JpbmdSdWxlQ29udGV4dChjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSkgOiBTTShTTSkge30KKworICBjb25zdCBTb3VyY2VNYW5hZ2VyICZnZXRTb3VyY2VzKCkgY29uc3QgeyByZXR1cm4gU007IH0KKworICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCBzb3VyY2Ugc2VsZWN0aW9uIHJhbmdlIGFzIHNldCBieSB0aGUKKyAgLy8vIHJlZmFjdG9yaW5nIGVuZ2luZS4gQ2FuIGJlIGludmFsaWQuCisgIFNvdXJjZVJhbmdlIGdldFNlbGVjdGlvblJhbmdlKCkgY29uc3QgeyByZXR1cm4gU2VsZWN0aW9uUmFuZ2U7IH0KKworICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKFNvdXJjZVJhbmdlIFIpIHsgU2VsZWN0aW9uUmFuZ2UgPSBSOyB9CisKKyAgYm9vbCBoYXNBU1RDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQVNUOyB9CisKKyAgQVNUQ29udGV4dCAmZ2V0QVNUQ29udGV4dCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoQVNUICYmICJubyBBU1QhIik7CisgICAgcmV0dXJuICpBU1Q7CisgIH0KKworICB2b2lkIHNldEFTVENvbnRleHQoQVNUQ29udGV4dCAmQ29udGV4dCkgeyBBU1QgPSAmQ29udGV4dDsgfQorCisgIC8vLyBDcmVhdGVzIGFuIGxsdm06OkVycm9yIHZhbHVlIHRoYXQgY29udGFpbnMgYSBkaWFnbm9zdGljLgorICAvLy8KKyAgLy8vIFRoZSBlcnJvcnMgc2hvdWxkIG5vdCBvdXRsaXZlIHRoZSBjb250ZXh0LgorICBsbHZtOjpFcnJvciBjcmVhdGVEaWFnbm9zdGljRXJyb3IoU291cmNlTG9jYXRpb24gTG9jLCB1bnNpZ25lZCBEaWFnSUQpIHsKKyAgICByZXR1cm4gRGlhZ25vc3RpY0Vycm9yOjpjcmVhdGUoTG9jLCBQYXJ0aWFsRGlhZ25vc3RpYyhEaWFnSUQsIERpYWdTdG9yYWdlKSk7CisgIH0KKworICBsbHZtOjpFcnJvciBjcmVhdGVEaWFnbm9zdGljRXJyb3IodW5zaWduZWQgRGlhZ0lEKSB7CisgICAgcmV0dXJuIGNyZWF0ZURpYWdub3N0aWNFcnJvcihTb3VyY2VMb2NhdGlvbigpLCBEaWFnSUQpOworICB9CisKKyAgdm9pZCBzZXRBU1RTZWxlY3Rpb24oc3RkOjp1bmlxdWVfcHRyPFNlbGVjdGVkQVNUTm9kZT4gTm9kZSkgeworICAgIEFTVE5vZGVTZWxlY3Rpb24gPSBzdGQ6Om1vdmUoTm9kZSk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIFRoZSBzb3VyY2UgbWFuYWdlciBmb3IgdGhlIHRyYW5zbGF0aW9uIHVuaXQgLyBmaWxlIG9uIHdoaWNoIGEgcmVmYWN0b3JpbmcKKyAgLy8vIGFjdGlvbiBtaWdodCBvcGVyYXRlIG9uLgorICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTTsKKyAgLy8vIEFuIG9wdGlvbmFsIHNvdXJjZSBzZWxlY3Rpb24gcmFuZ2UgdGhhdCdzIGNvbW1vbmx5IHVzZWQgdG8gcmVwcmVzZW50CisgIC8vLyBhIHNlbGVjdGlvbiBpbiBhbiBlZGl0b3IuCisgIFNvdXJjZVJhbmdlIFNlbGVjdGlvblJhbmdlOworICAvLy8gQW4gb3B0aW9uYWwgQVNUIGZvciB0aGUgdHJhbnNsYXRpb24gdW5pdCBvbiB3aGljaCBhIHJlZmFjdG9yaW5nIGFjdGlvbgorICAvLy8gbWlnaHQgb3BlcmF0ZSBvbi4KKyAgQVNUQ29udGV4dCAqQVNUID0gbnVsbHB0cjsKKyAgLy8vIFRoZSBhbGxvY2F0b3IgZm9yIGRpYWdub3N0aWNzLgorICBQYXJ0aWFsRGlhZ25vc3RpYzo6U3RvcmFnZUFsbG9jYXRvciBEaWFnU3RvcmFnZTsKKworICAvLyBGSVhNRTogUmVtb3ZlIHdoZW4gbWVtb2l6ZWQuCisgIHN0ZDo6dW5pcXVlX3B0cjxTZWxlY3RlZEFTVE5vZGU+IEFTVE5vZGVTZWxlY3Rpb247Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgdG9vbGluZworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVGQUNUT1JJTkdfUlVMRV9DT05URVhUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVuYW1lL1JlbmFtaW5nQWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlbmFtZS9SZW5hbWluZ0FjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMmVkNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlbmFtZS9SZW5hbWluZ0FjdGlvbi5oCkBAIC0wLDAgKzEsMTIyIEBACisvLz09PS0tLSBSZW5hbWluZ0FjdGlvbi5oIC0gQ2xhbmcgcmVmYWN0b3JpbmcgbGlicmFyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgUHJvdmlkZXMgYW4gYWN0aW9uIHRvIHJlbmFtZSBldmVyeSBzeW1ib2wgYXQgYSBwb2ludC4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVOQU1FX1JFTkFNSU5HX0FDVElPTl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRU5BTUVfUkVOQU1JTkdfQUNUSU9OX0gKKworI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcuaCIKKyNpbmNsdWRlICJjbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL0F0b21pY0NoYW5nZS5oIgorI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdBY3Rpb25SdWxlcy5oIgorI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdPcHRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZW5hbWUvU3ltYm9sT2NjdXJyZW5jZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK2NsYXNzIEFTVENvbnN1bWVyOworY2xhc3MgQ29tcGlsZXJJbnN0YW5jZTsKKworbmFtZXNwYWNlIHRvb2xpbmcgeworCitjbGFzcyBSZW5hbWluZ0FjdGlvbiB7CitwdWJsaWM6CisgIFJlbmFtaW5nQWN0aW9uKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmTmV3TmFtZXMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmUHJldk5hbWVzLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+ICZVU1JMaXN0LAorICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdG9vbGluZzo6UmVwbGFjZW1lbnRzPiAmRmlsZVRvUmVwbGFjZXMsCisgICAgICAgICAgICAgICAgIGJvb2wgUHJpbnRMb2NhdGlvbnMgPSBmYWxzZSkKKyAgICAgIDogTmV3TmFtZXMoTmV3TmFtZXMpLCBQcmV2TmFtZXMoUHJldk5hbWVzKSwgVVNSTGlzdChVU1JMaXN0KSwKKyAgICAgICAgRmlsZVRvUmVwbGFjZXMoRmlsZVRvUmVwbGFjZXMpLCBQcmludExvY2F0aW9ucyhQcmludExvY2F0aW9ucykge30KKworICBzdGQ6OnVuaXF1ZV9wdHI8QVNUQ29uc3VtZXI+IG5ld0FTVENvbnN1bWVyKCk7CisKK3ByaXZhdGU6CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmTmV3TmFtZXMsICZQcmV2TmFtZXM7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4gJlVTUkxpc3Q7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0b29saW5nOjpSZXBsYWNlbWVudHM+ICZGaWxlVG9SZXBsYWNlczsKKyAgYm9vbCBQcmludExvY2F0aW9uczsKK307CisKK2NsYXNzIFJlbmFtZU9jY3VycmVuY2VzIGZpbmFsIDogcHVibGljIFNvdXJjZUNoYW5nZVJlZmFjdG9yaW5nUnVsZSB7CitwdWJsaWM6CisgIHN0YXRpYyBFeHBlY3RlZDxSZW5hbWVPY2N1cnJlbmNlcz4gaW5pdGlhdGUoUmVmYWN0b3JpbmdSdWxlQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBTZWxlY3Rpb25SYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBOZXdOYW1lKTsKKworICBzdGF0aWMgY29uc3QgUmVmYWN0b3JpbmdEZXNjcmlwdG9yICZkZXNjcmliZSgpOworCitwcml2YXRlOgorICBSZW5hbWVPY2N1cnJlbmNlcyhjb25zdCBOYW1lZERlY2wgKk5ELCBzdGQ6OnN0cmluZyBOZXdOYW1lKQorICAgICAgOiBORChORCksIE5ld05hbWUoc3RkOjptb3ZlKE5ld05hbWUpKSB7fQorCisgIEV4cGVjdGVkPEF0b21pY0NoYW5nZXM+CisgIGNyZWF0ZVNvdXJjZVJlcGxhY2VtZW50cyhSZWZhY3RvcmluZ1J1bGVDb250ZXh0ICZDb250ZXh0KSBvdmVycmlkZTsKKworICBjb25zdCBOYW1lZERlY2wgKk5EOworICBzdGQ6OnN0cmluZyBOZXdOYW1lOworfTsKKworY2xhc3MgUXVhbGlmaWVkUmVuYW1lUnVsZSBmaW5hbCA6IHB1YmxpYyBTb3VyY2VDaGFuZ2VSZWZhY3RvcmluZ1J1bGUgeworcHVibGljOgorICBzdGF0aWMgRXhwZWN0ZWQ8UXVhbGlmaWVkUmVuYW1lUnVsZT4gaW5pdGlhdGUoUmVmYWN0b3JpbmdSdWxlQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIE9sZFF1YWxpZmllZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBOZXdRdWFsaWZpZWROYW1lKTsKKworICBzdGF0aWMgY29uc3QgUmVmYWN0b3JpbmdEZXNjcmlwdG9yICZkZXNjcmliZSgpOworCitwcml2YXRlOgorICBRdWFsaWZpZWRSZW5hbWVSdWxlKGNvbnN0IE5hbWVkRGVjbCAqTkQsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgTmV3UXVhbGlmaWVkTmFtZSkKKyAgICAgIDogTkQoTkQpLCBOZXdRdWFsaWZpZWROYW1lKHN0ZDo6bW92ZShOZXdRdWFsaWZpZWROYW1lKSkge30KKworICBFeHBlY3RlZDxBdG9taWNDaGFuZ2VzPgorICBjcmVhdGVTb3VyY2VSZXBsYWNlbWVudHMoUmVmYWN0b3JpbmdSdWxlQ29udGV4dCAmQ29udGV4dCkgb3ZlcnJpZGU7CisKKyAgLy8gQSBOYW1lZERlY2wgd2hpY2ggaW5kZW50aWZpZXMgdGhlIHN5bWJvbCBiZWluZyByZW5hbWVkLgorICBjb25zdCBOYW1lZERlY2wgKk5EOworICAvLyBUaGUgbmV3IHF1YWxpZmllZCBuYW1lIHRvIGNoYW5nZSB0aGUgc3ltYm9sIHRvLgorICBzdGQ6OnN0cmluZyBOZXdRdWFsaWZpZWROYW1lOworfTsKKworLy8vIFJldHVybnMgc291cmNlIHJlcGxhY2VtZW50cyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHJlbmFtZSBvZiB0aGUgZ2l2ZW4KKy8vLyBzeW1ib2wgb2NjdXJyZW5jZXMuCitsbHZtOjpFeHBlY3RlZDxzdGQ6OnZlY3RvcjxBdG9taWNDaGFuZ2U+PgorY3JlYXRlUmVuYW1lUmVwbGFjZW1lbnRzKGNvbnN0IFN5bWJvbE9jY3VycmVuY2VzICZPY2N1cnJlbmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwgY29uc3QgU3ltYm9sTmFtZSAmTmV3TmFtZSk7CisKKy8vLyBSZW5hbWUgYWxsIHN5bWJvbHMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gVVNScy4KK2NsYXNzIFF1YWxpZmllZFJlbmFtaW5nQWN0aW9uIHsKK3B1YmxpYzoKKyAgUXVhbGlmaWVkUmVuYW1pbmdBY3Rpb24oCisgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJk5ld05hbWVzLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiAmVVNSTGlzdCwKKyAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0b29saW5nOjpSZXBsYWNlbWVudHM+ICZGaWxlVG9SZXBsYWNlcykKKyAgICAgIDogTmV3TmFtZXMoTmV3TmFtZXMpLCBVU1JMaXN0KFVTUkxpc3QpLCBGaWxlVG9SZXBsYWNlcyhGaWxlVG9SZXBsYWNlcykge30KKworICBzdGQ6OnVuaXF1ZV9wdHI8QVNUQ29uc3VtZXI+IG5ld0FTVENvbnN1bWVyKCk7CisKK3ByaXZhdGU6CisgIC8vLyBOZXcgc3ltYm9sIG5hbWVzLgorICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJk5ld05hbWVzOworCisgIC8vLyBBIGxpc3Qgb2YgVVNScy4gRWFjaCBlbGVtZW50IHJlcHJlc2VudHMgVVNScyBvZiBhIHN5bWJvbCBiZWluZyByZW5hbWVkLgorICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+ICZVU1JMaXN0OworCisgIC8vLyBBIGZpbGUgcGF0aCB0byByZXBsYWNlbWVudHMgbWFwLgorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdG9vbGluZzo6UmVwbGFjZW1lbnRzPiAmRmlsZVRvUmVwbGFjZXM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgdG9vbGluZworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVOQU1FX1JFTkFNSU5HX0FDVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlbmFtZS9TeW1ib2xOYW1lLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlbmFtZS9TeW1ib2xOYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZDI5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVuYW1lL1N5bWJvbE5hbWUuaApAQCAtMCwwICsxLDQ5IEBACisvLz09PS0tLSBTeW1ib2xOYW1lLmggLSBDbGFuZyByZWZhY3RvcmluZyBsaWJyYXJ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRU5BTUVfU1lNQk9MX05BTUVfSAorI2RlZmluZSBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVOQU1FX1NZTUJPTF9OQU1FX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgdG9vbGluZyB7CisKKy8vLyBBIG5hbWUgb2YgYSBzeW1ib2wuCisvLy8KKy8vLyBTeW1ib2wncyBuYW1lIGNhbiBiZSBjb21wb3NlZCBvZiBtdWx0aXBsZSBzdHJpbmdzLiBGb3IgZXhhbXBsZSwgT2JqZWN0aXZlLUMKKy8vLyBtZXRob2RzIGNhbiBjb250YWluIG11bHRpcGxlIGFyZ3VtZW50IGxhYmxlczoKKy8vLworLy8vIFxjb2RlCisvLy8gLSAodm9pZCkgbXlNZXRob2ROYW1lUGllY2U6IChpbnQpeCBhbm90aGVyTmFtZVBpZWNlczooaW50KXk7CisvLy8gLy8gICAgICAgXn4gc3RyaW5nIDAgfn5+fn4gICAgICAgICBefiBzdHJpbmcgMSB+fn5+fgorLy8vIFxlbmRjb2RlCitjbGFzcyBTeW1ib2xOYW1lIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgU3ltYm9sTmFtZShTdHJpbmdSZWYgTmFtZSkgeworICAgIC8vIFdoaWxlIGVtcHR5IHN5bWJvbCBuYW1lcyBhcmUgdmFsaWQgKE9iamVjdGl2ZS1DIHNlbGVjdG9ycyBjYW4gaGF2ZSBlbXB0eQorICAgIC8vIG5hbWUgcGllY2VzKSwgb2NjdXJyZW5jZXMgT2JqZWN0aXZlLUMgc2VsZWN0b3JzIGFyZSBjcmVhdGVkIHVzaW5nIGFuCisgICAgLy8gYXJyYXkgb2Ygc3RyaW5ncyBpbnN0ZWFkIG9mIGp1c3Qgb25lIHN0cmluZy4KKyAgICBhc3NlcnQoIU5hbWUuZW1wdHkoKSAmJiAiSW52YWxpZCBzeW1ib2wgbmFtZSEiKTsKKyAgICB0aGlzLT5OYW1lLnB1c2hfYmFjayhOYW1lLnN0cigpKTsKKyAgfQorCisgIEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBnZXROYW1lUGllY2VzKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorCitwcml2YXRlOgorICBsbHZtOjpTbWFsbFZlY3RvcjxzdGQ6OnN0cmluZywgMT4gTmFtZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSB0b29saW5nCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRU5BTUVfU1lNQk9MX05BTUVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZW5hbWUvU3ltYm9sT2NjdXJyZW5jZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVuYW1lL1N5bWJvbE9jY3VycmVuY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY4NTMwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVuYW1lL1N5bWJvbE9jY3VycmVuY2VzLmgKQEAgLTAsMCArMSw5MSBAQAorLy89PT0tLS0gU3ltYm9sT2NjdXJyZW5jZXMuaCAtIENsYW5nIHJlZmFjdG9yaW5nIGxpYnJhcnkgLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVOQU1FX1NZTUJPTF9PQ0NVUlJFTkNFU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRU5BTUVfU1lNQk9MX09DQ1VSUkVOQ0VTX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIHRvb2xpbmcgeworCitjbGFzcyBTeW1ib2xOYW1lOworCisvLy8gQW4gb2NjdXJyZW5jZSBvZiBhIHN5bWJvbCBpbiB0aGUgc291cmNlLgorLy8vCisvLy8gT2NjdXJyZW5jZXMgY2FuIGhhdmUgZGlmZmVyZW5jZSBraW5kcywgdGhhdCBkZXNjcmliZSB3aGV0aGVyIHRoaXMgb2NjdXJyZW5jZQorLy8vIGlzIGFuIGV4YWN0IHNlbWFudGljIG1hdGNoLCBvciB3aGV0aGVyIHRoaXMgaXMgYSB3ZWFrZXIgdGV4dHVhbCBtYXRjaCB0aGF0J3MKKy8vLyBub3QgZ3VhcmFudGVlZCB0byByZXByZXNlbnQgdGhlIGV4YWN0IGRlY2xhcmF0aW9uLgorLy8vCisvLy8gQSBzaW5nbGUgb2NjdXJyZW5jZSBvZiBhIHN5bWJvbCBjYW4gc3BhbiBtb3JlIHRoYW4gb25lIHNvdXJjZSByYW5nZS4gRm9yCisvLy8gZXhhbXBsZSwgT2JqZWN0aXZlLUMgc2VsZWN0b3JzIGNhbiBjb250YWluIG11bHRpcGxlIGFyZ3VtZW50IGxhYmVsczoKKy8vLworLy8vIFxjb2RlCisvLy8gW29iamVjdCBzZWxlY3RvclBpZWNlMTogLi4uIHNlbGVjdG9yUGllY2UyOiAuLi5dOworLy8vIC8vICAgICAgXn5+IHJhbmdlIDAgfn4gICAgICBefn4gcmFuZ2UgMSB+fgorLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBXZSBoYXZlIHRvIHJlcGxhY2UgdGhlIHRleHQgaW4gYm90aCByYW5nZSAwIGFuZCByYW5nZSAxIHdoZW4gcmVuYW1pbmcgdGhlCisvLy8gT2JqZWN0aXZlLUMgbWV0aG9kICdzZWxlY3RvclBpZWNlMTpzZWxlY3RvclBpZWNlMicuCitjbGFzcyBTeW1ib2xPY2N1cnJlbmNlIHsKK3B1YmxpYzoKKyAgZW51bSBPY2N1cnJlbmNlS2luZCB7CisgICAgLy8vIFRoaXMgb2NjdXJyZW5jZSBpcyBhbiBleGFjdCBtYXRjaCBhbmQgY2FuIGJlIHJlbmFtZWQgYXV0b21hdGljYWxseS4KKyAgICAvLy8KKyAgICAvLy8gTm90ZToKKyAgICAvLy8gU3ltYm9sIG9jY3VycmVuY2VzIGluIG1hY3JvIGFyZ3VtZW50cyB0aGF0IGV4cGFuZCB0byBkaWZmZXJlbnQKKyAgICAvLy8gZGVjbGFyYXRpb25zIGdldCBtYXJrZWQgYXMgZXhhY3QgbWF0Y2hlcywgYW5kIHRodXMgdGhlIHJlbmFtaW5nIGVuZ2luZQorICAgIC8vLyB3aWxsIHJlbmFtZSB0aGVtIGUuZy46CisgICAgLy8vCisgICAgLy8vIFxjb2RlCisgICAgLy8vICAgI2RlZmluZSBNQUNSTyh4KSB4ICsgbnM6OngKKyAgICAvLy8gICBpbnQgZm9vKGludCB2YXIpIHsKKyAgICAvLy8gICAgIHJldHVybiBNQUNSTyh2YXIpOyAvLyB2YXIgaXMgcmVuYW1lZCBhdXRvbWF0aWNhbGx5IGhlcmUgd2hlbgorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVpdGhlciB2YXIgb3IgbnM6OnZhciBpcyByZW5hbWVkLgorICAgIC8vLyAgIH07CisgICAgLy8vIFxlbmRjb2RlCisgICAgLy8vCisgICAgLy8vIFRoZSB1c2VyIHdpbGwgaGF2ZSB0byBmaXggdGhlaXIgY29kZSBtYW51YWxseSBhZnRlciBwZXJmb3JtaW5nIHN1Y2ggYQorICAgIC8vLyByZW5hbWUuCisgICAgLy8vIEZJWE1FOiBUaGUgcmVuYW1lIHZlcmlmaWVyIHNob3VsZCBub3RpZnkgdXNlciBhYm91dCB0aGlzIGlzc3VlLgorICAgIE1hdGNoaW5nU3ltYm9sCisgIH07CisKKyAgU3ltYm9sT2NjdXJyZW5jZShjb25zdCBTeW1ib2xOYW1lICZOYW1lLCBPY2N1cnJlbmNlS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNvdXJjZUxvY2F0aW9uPiBMb2NhdGlvbnMpOworCisgIFN5bWJvbE9jY3VycmVuY2UoU3ltYm9sT2NjdXJyZW5jZSAmJikgPSBkZWZhdWx0OworICBTeW1ib2xPY2N1cnJlbmNlICZvcGVyYXRvcj0oU3ltYm9sT2NjdXJyZW5jZSAmJikgPSBkZWZhdWx0OworCisgIE9jY3VycmVuY2VLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgQXJyYXlSZWY8U291cmNlUmFuZ2U+IGdldE5hbWVSYW5nZXMoKSBjb25zdCB7CisgICAgaWYgKE11bHRpcGxlUmFuZ2VzKSB7CisgICAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKE11bHRpcGxlUmFuZ2VzLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYW5nZU9yTnVtUmFuZ2VzLmdldEJlZ2luKCkuZ2V0UmF3RW5jb2RpbmcoKSk7CisgICAgfQorICAgIHJldHVybiBSYW5nZU9yTnVtUmFuZ2VzOworICB9CisKK3ByaXZhdGU6CisgIE9jY3VycmVuY2VLaW5kIEtpbmQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxTb3VyY2VSYW5nZVtdPiBNdWx0aXBsZVJhbmdlczsKKyAgU291cmNlUmFuZ2UgUmFuZ2VPck51bVJhbmdlczsKK307CisKK3VzaW5nIFN5bWJvbE9jY3VycmVuY2VzID0gc3RkOjp2ZWN0b3I8U3ltYm9sT2NjdXJyZW5jZT47CisKK30gLy8gZW5kIG5hbWVzcGFjZSB0b29saW5nCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRU5BTUVfU1lNQk9MX09DQ1VSUkVOQ0VTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVuYW1lL1VTUkZpbmRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZW5hbWUvVVNSRmluZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0YTVkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVuYW1lL1VTUkZpbmRlci5oCkBAIC0wLDAgKzEsNTAgQEAKKy8vPT09LS0tIFVTUkZpbmRlci5oIC0gQ2xhbmcgcmVmYWN0b3JpbmcgbGlicmFyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBNZXRob2RzIGZvciBkZXRlcm1pbmluZyB0aGUgVVNSIG9mIGEgc3ltYm9sIGF0IGEgbG9jYXRpb24gaW4gc291cmNlCisvLy8gY29kZS4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVOQU1FX1VTUl9GSU5ERVJfSAorI2RlZmluZSBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVOQU1FX1VTUl9GSU5ERVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQVNUQ29udGV4dDsKK2NsYXNzIERlY2w7CitjbGFzcyBTb3VyY2VMb2NhdGlvbjsKK2NsYXNzIE5hbWVkRGVjbDsKKworbmFtZXNwYWNlIHRvb2xpbmcgeworCisvLyBHaXZlbiBhbiBBU1QgY29udGV4dCBhbmQgYSBwb2ludCwgcmV0dXJucyBhIE5hbWVkRGVjbCBpZGVudGlmeWluZyB0aGUgc3ltYm9sCisvLyBhdCB0aGUgcG9pbnQuIFJldHVybnMgbnVsbCBpZiBub3RoaW5nIGlzIGZvdW5kIGF0IHRoZSBwb2ludC4KK2NvbnN0IE5hbWVkRGVjbCAqZ2V0TmFtZWREZWNsQXQoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTG9jYXRpb24gUG9pbnQpOworCisvLyBHaXZlbiBhbiBBU1QgY29udGV4dCBhbmQgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSwgcmV0dXJucyBhIE5hbWVkRGVjbAorLy8gaWRlbnRpZnlpbmcgdGhlIHN5bWJvbCB3aXRoIGEgbWF0Y2hpbmcgbmFtZS4gUmV0dXJucyBudWxsIGlmIG5vdGhpbmcgaXMKKy8vIGZvdW5kIGZvciB0aGUgbmFtZS4KK2NvbnN0IE5hbWVkRGVjbCAqZ2V0TmFtZWREZWNsRm9yKGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSk7CisKKy8vIENvbnZlcnRzIGEgRGVjbCBpbnRvIGEgVVNSLgorc3RkOjpzdHJpbmcgZ2V0VVNSRm9yRGVjbChjb25zdCBEZWNsICpEZWNsKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHRvb2xpbmcKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SX1JFTkFNRV9VU1JfRklOREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVuYW1lL1VTUkZpbmRpbmdBY3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVuYW1lL1VTUkZpbmRpbmdBY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWM1YWU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZW5hbWUvVVNSRmluZGluZ0FjdGlvbi5oCkBAIC0wLDAgKzEsNjggQEAKKy8vPT09LS0tIFVTUkZpbmRpbmdBY3Rpb24uaCAtIENsYW5nIHJlZmFjdG9yaW5nIGxpYnJhcnkgLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBQcm92aWRlcyBhbiBhY3Rpb24gdG8gZmluZCBhbGwgcmVsZXZhbnQgVVNScyBhdCBhIHBvaW50LgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRU5BTUVfVVNSX0ZJTkRJTkdfQUNUSU9OX0gKKyNkZWZpbmUgTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SX1JFTkFNRV9VU1JfRklORElOR19BQ1RJT05fSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworY2xhc3MgQVNUQ29uc3VtZXI7CitjbGFzcyBBU1RDb250ZXh0OworY2xhc3MgQ29tcGlsZXJJbnN0YW5jZTsKK2NsYXNzIE5hbWVkRGVjbDsKKworbmFtZXNwYWNlIHRvb2xpbmcgeworCisvLy8gUmV0dXJucyB0aGUgY2Fub25pY2FsIGRlY2xhcmF0aW9uIHRoYXQgYmVzdCByZXByZXNlbnRzIGEgc3ltYm9sIHRoYXQgY2FuIGJlCisvLy8gcmVuYW1lZC4KKy8vLworLy8vIFRoZSBmb2xsb3dpbmcgY2Fub25pY2FsaXphdGlvbiBydWxlcyBhcmUgY3VycmVudGx5IHVzZWQ6CisvLy8KKy8vLyAtIEEgY29uc3RydWN0b3IgaXMgY2Fub25pY2FsaXplZCB0byBpdHMgY2xhc3MuCisvLy8gLSBBIGRlc3RydWN0b3IgaXMgY2Fub25pY2FsaXplZCB0byBpdHMgY2xhc3MuCitjb25zdCBOYW1lZERlY2wgKmdldENhbm9uaWNhbFN5bWJvbERlY2xhcmF0aW9uKGNvbnN0IE5hbWVkRGVjbCAqRm91bmREZWNsKTsKKworLy8vIFJldHVybnMgdGhlIHNldCBvZiBVU1JzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgZ2l2ZW4gZGVjbGFyYXRpb24uCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0VVNSc0ZvckRlY2xhcmF0aW9uKGNvbnN0IE5hbWVkRGVjbCAqTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVENvbnRleHQgJkNvbnRleHQpOworCitzdHJ1Y3QgVVNSRmluZGluZ0FjdGlvbiB7CisgIFVTUkZpbmRpbmdBY3Rpb24oQXJyYXlSZWY8dW5zaWduZWQ+IFN5bWJvbE9mZnNldHMsCisgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8c3RkOjpzdHJpbmc+IFF1YWxpZmllZE5hbWVzLCBib29sIEZvcmNlKQorICAgICAgOiBTeW1ib2xPZmZzZXRzKFN5bWJvbE9mZnNldHMpLCBRdWFsaWZpZWROYW1lcyhRdWFsaWZpZWROYW1lcyksCisgICAgICAgIEVycm9yT2NjdXJyZWQoZmFsc2UpLCBGb3JjZShGb3JjZSkge30KKyAgc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPiBuZXdBU1RDb25zdW1lcigpOworCisgIEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBnZXRVU1JTcGVsbGluZ3MoKSB7IHJldHVybiBTcGVsbGluZ05hbWVzOyB9CisgIEFycmF5UmVmPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4gZ2V0VVNSTGlzdCgpIHsgcmV0dXJuIFVTUkxpc3Q7IH0KKyAgYm9vbCBlcnJvck9jY3VycmVkKCkgeyByZXR1cm4gRXJyb3JPY2N1cnJlZDsgfQorCitwcml2YXRlOgorICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gU3ltYm9sT2Zmc2V0czsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFF1YWxpZmllZE5hbWVzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gU3BlbGxpbmdOYW1lczsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiBVU1JMaXN0OworICBib29sIEVycm9yT2NjdXJyZWQ7CisgIGJvb2wgRm9yY2U7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgdG9vbGluZworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX1RPT0xJTkdfUkVGQUNUT1JfUkVOQU1FX1VTUl9GSU5ESU5HX0FDVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlbmFtZS9VU1JMb2NGaW5kZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvUmVuYW1lL1VTUkxvY0ZpbmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMWE4YWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nL1JlbmFtZS9VU1JMb2NGaW5kZXIuaApAQCAtMCwwICsxLDUzIEBACisvLz09PS0tLSBVU1JMb2NGaW5kZXIuaCAtIENsYW5nIHJlZmFjdG9yaW5nIGxpYnJhcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgUHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgZmluZGluZyBhbGwgaW5zdGFuY2VzIG9mIGEgVVNSIGluIGEgZ2l2ZW4KKy8vLyBBU1QuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19UT09MSU5HX1JFRkFDVE9SX1JFTkFNRV9VU1JfTE9DX0ZJTkRFUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRU5BTUVfVVNSX0xPQ19GSU5ERVJfSAorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVC5oIgorI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvQ29yZS9SZXBsYWNlbWVudC5oIgorI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcvQXRvbWljQ2hhbmdlLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy9SZW5hbWUvU3ltYm9sT2NjdXJyZW5jZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIHRvb2xpbmcgeworCisvLy8gQ3JlYXRlIGF0b21pYyBjaGFuZ2VzIGZvciByZW5hbWluZyBhbGwgc3ltYm9sIHJlZmVyZW5jZXMgd2hpY2ggYXJlCisvLy8gaWRlbnRpZmllZCBieSB0aGUgVVNScyBzZXQgdG8gYSBnaXZlbiBuZXcgbmFtZS4KKy8vLworLy8vIFxwYXJhbSBVU1JzIFRoZSBzZXQgY29udGFpbmluZyBVU1JzIG9mIGEgcGFydGljdWxhciBvbGQgc3ltYm9sLgorLy8vIFxwYXJhbSBOZXdOYW1lIFRoZSBuZXcgbmFtZSB0byByZXBsYWNlIG9sZCBzeW1ib2wgbmFtZS4KKy8vLyBccGFyYW0gVHJhbnNsYXRpb25Vbml0RGVjbCBUaGUgdHJhbnNsYXRpb24gdW5pdCBkZWNsYXJhdGlvbi4KKy8vLworLy8vIFxyZXR1cm4gQXRvbWljIGNoYW5nZXMgZm9yIHJlbmFtaW5nLgorc3RkOjp2ZWN0b3I8dG9vbGluZzo6QXRvbWljQ2hhbmdlPgorY3JlYXRlUmVuYW1lQXRvbWljQ2hhbmdlcyhsbHZtOjpBcnJheVJlZjxzdGQ6OnN0cmluZz4gVVNScywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIE5ld05hbWUsIERlY2wgKlRyYW5zbGF0aW9uVW5pdERlY2wpOworCisvLy8gRmluZHMgdGhlIHN5bWJvbCBvY2N1cnJlbmNlcyBmb3IgdGhlIHN5bWJvbCB0aGF0J3MgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4KKy8vLyBVU1Igc2V0LgorLy8vCisvLy8gXHJldHVybiBTeW1ib2xPY2N1cnJlbmNlcyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gQXRvbWljQ2hhbmdlcyB3aGVuCisvLy8gcmVuYW1pbmcuCitTeW1ib2xPY2N1cnJlbmNlcyBnZXRPY2N1cnJlbmNlc09mVVNScyhBcnJheVJlZjxzdGQ6OnN0cmluZz4gVVNScywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBQcmV2TmFtZSwgRGVjbCAqRGVjbCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSB0b29saW5nCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUl9SRU5BTUVfVVNSX0xPQ19GSU5ERVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZ0NhbGxiYWNrcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZ0NhbGxiYWNrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NjI5NTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nQ2FsbGJhY2tzLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8vPT09LS0tIFJlZmFjdG9yaW5nQ2FsbGJhY2tzLmggLSBTdHJ1Y3R1cmFsIHF1ZXJ5IGZyYW1ld29yayAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFByb3ZpZGVzIGNhbGxiYWNrcyB0byBtYWtlIGNvbW1vbiBraW5kcyBvZiByZWZhY3RvcmluZ3MgZWFzeS4KKy8vCisvLyAgVGhlIGdlbmVyYWwgaWRlYSBpcyB0byBjb25zdHJ1Y3QgYSBtYXRjaGVyIGV4cHJlc3Npb24gdGhhdCBkZXNjcmliZXMgYQorLy8gIHN1YnRyZWUgbWF0Y2ggb24gdGhlIEFTVCBhbmQgdGhlbiByZXBsYWNlIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlCisvLyAgZWl0aGVyIGJ5IHNvbWUgc3BlY2lmaWMgdGV4dCBvciBzb21lIG90aGVyIEFTVCBub2RlLgorLy8KKy8vICBFeGFtcGxlOgorLy8gIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworLy8gICAgQ2xhbmdUb29sIFRvb2woYXJnYywgYXJndik7CisvLyAgICBNYXRjaEZpbmRlciBGaW5kZXI7CisvLyAgICBSZXBsYWNlU3RtdFdpdGhUZXh0IENhbGxiYWNrKCJpbnRlZ2VyIiwgIjQyIik7CisvLyAgICBGaW5kZXIuQWRkTWF0Y2hlcihpZCgiaW50ZWdlciIsIGV4cHJlc3Npb24oaW50ZWdlckxpdGVyYWwoKSkpLCBDYWxsYmFjayk7CisvLyAgICByZXR1cm4gVG9vbC5ydW4obmV3RnJvbnRlbmRBY3Rpb25GYWN0b3J5KCZGaW5kZXIpKTsKKy8vICB9CisvLworLy8gIFRoaXMgd2lsbCByZXBsYWNlIGFsbCBpbnRlZ2VyIGxpdGVyYWxzIHdpdGggIjQyIi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUklOR0NBTExCQUNLU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19SRUZBQ1RPUklOR0NBTExCQUNLU19ICisKKyNpbmNsdWRlICJjbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaEZpbmRlci5oIgorI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSB0b29saW5nIHsKKworLy8vIFxicmllZiBCYXNlIGNsYXNzIGZvciBSZWZhY3RvcmluZ0NhbGxiYWNrcy4KKy8vLworLy8vIENvbGxlY3RzIFxjIHRvb2xpbmc6OlJlcGxhY2VtZW50cyB3aGlsZSBydW5uaW5nLgorY2xhc3MgUmVmYWN0b3JpbmdDYWxsYmFjayA6IHB1YmxpYyBhc3RfbWF0Y2hlcnM6Ok1hdGNoRmluZGVyOjpNYXRjaENhbGxiYWNrIHsKK3B1YmxpYzoKKyAgUmVmYWN0b3JpbmdDYWxsYmFjaygpOworICBSZXBsYWNlbWVudHMgJmdldFJlcGxhY2VtZW50cygpOworCitwcm90ZWN0ZWQ6CisgIFJlcGxhY2VtZW50cyBSZXBsYWNlOworfTsKKworLy8vIFxicmllZiBBZGFwdG9yIGJldHdlZW4gXGMgYXN0X21hdGNoZXJzOjpNYXRjaEZpbmRlciBhbmQgXGMKKy8vLyB0b29saW5nOjpSZWZhY3RvcmluZ1Rvb2wuCisvLy8KKy8vLyBSdW5zIEFTVCBtYXRjaGVycyBhbmQgc3RvcmVzIHRoZSBcYyB0b29saW5nOjpSZXBsYWNlbWVudHMgaW4gYSBtYXAuCitjbGFzcyBBU1RNYXRjaFJlZmFjdG9yZXIgeworcHVibGljOgorICBleHBsaWNpdCBBU1RNYXRjaFJlZmFjdG9yZXIoCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFJlcGxhY2VtZW50cz4gJkZpbGVUb1JlcGxhY2VzKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCBhZGRNYXRjaGVyKGNvbnN0IFQgJk1hdGNoZXIsIFJlZmFjdG9yaW5nQ2FsbGJhY2sgKkNhbGxiYWNrKSB7CisgICAgTWF0Y2hGaW5kZXIuYWRkTWF0Y2hlcihNYXRjaGVyLCBDYWxsYmFjayk7CisgICAgQ2FsbGJhY2tzLnB1c2hfYmFjayhDYWxsYmFjayk7CisgIH0KKworICB2b2lkIGFkZER5bmFtaWNNYXRjaGVyKGNvbnN0IGFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OkR5blR5cGVkTWF0Y2hlciAmTWF0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZWZhY3RvcmluZ0NhbGxiYWNrICpDYWxsYmFjayk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPiBuZXdBU1RDb25zdW1lcigpOworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgUmVmYWN0b3JpbmdBU1RDb25zdW1lcjsKKyAgc3RkOjp2ZWN0b3I8UmVmYWN0b3JpbmdDYWxsYmFjayAqPiBDYWxsYmFja3M7CisgIGFzdF9tYXRjaGVyczo6TWF0Y2hGaW5kZXIgTWF0Y2hGaW5kZXI7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBSZXBsYWNlbWVudHM+ICZGaWxlVG9SZXBsYWNlczsKK307CisKKy8vLyBcYnJpZWYgUmVwbGFjZSB0aGUgdGV4dCBvZiB0aGUgc3RhdGVtZW50IGJvdW5kIHRvIFxjIEZyb21JZCB3aXRoIHRoZSB0ZXh0IGluCisvLy8gXGMgVG9UZXh0LgorY2xhc3MgUmVwbGFjZVN0bXRXaXRoVGV4dCA6IHB1YmxpYyBSZWZhY3RvcmluZ0NhbGxiYWNrIHsKK3B1YmxpYzoKKyAgUmVwbGFjZVN0bXRXaXRoVGV4dChTdHJpbmdSZWYgRnJvbUlkLCBTdHJpbmdSZWYgVG9UZXh0KTsKKyAgdm9pZCBydW4oY29uc3QgYXN0X21hdGNoZXJzOjpNYXRjaEZpbmRlcjo6TWF0Y2hSZXN1bHQgJlJlc3VsdCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIEZyb21JZDsKKyAgc3RkOjpzdHJpbmcgVG9UZXh0OworfTsKKworLy8vIFxicmllZiBSZXBsYWNlIHRoZSB0ZXh0IG9mIGFuIEFTVCBub2RlIGJvdW5kIHRvIFxjIEZyb21JZCB3aXRoIHRoZSByZXN1bHQgb2YKKy8vLyBldmFsdWF0aW5nIHRoZSB0ZW1wbGF0ZSBpbiBcYyBUb1RlbXBsYXRlLgorLy8vCisvLy8gRXhwcmVzc2lvbnMgb2YgdGhlIGZvcm0gJHtOb2RlTmFtZX0gaW4gXGMgVG9UZW1wbGF0ZSB3aWxsIGJlCisvLy8gcmVwbGFjZWQgYnkgdGhlIHRleHQgb2YgdGhlIG5vZGUgYm91bmQgdG8gJHtOb2RlTmFtZX0uIFRoZSBzdHJpbmcKKy8vLyAiJCQiIHdpbGwgYmUgcmVwbGFjZWQgYnkgIiQiLgorY2xhc3MgUmVwbGFjZU5vZGVXaXRoVGVtcGxhdGUgOiBwdWJsaWMgUmVmYWN0b3JpbmdDYWxsYmFjayB7CitwdWJsaWM6CisgIHN0YXRpYyBsbHZtOjpFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8UmVwbGFjZU5vZGVXaXRoVGVtcGxhdGU+PgorICBjcmVhdGUoU3RyaW5nUmVmIEZyb21JZCwgU3RyaW5nUmVmIFRvVGVtcGxhdGUpOworICB2b2lkIHJ1bihjb25zdCBhc3RfbWF0Y2hlcnM6Ok1hdGNoRmluZGVyOjpNYXRjaFJlc3VsdCAmUmVzdWx0KSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgc3RydWN0IFRlbXBsYXRlRWxlbWVudCB7CisgICAgZW51bSB7IExpdGVyYWwsIElkZW50aWZpZXIgfSBUeXBlOworICAgIHN0ZDo6c3RyaW5nIFZhbHVlOworICB9OworICBSZXBsYWNlTm9kZVdpdGhUZW1wbGF0ZShsbHZtOjpTdHJpbmdSZWYgRnJvbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUZW1wbGF0ZUVsZW1lbnQ+IFRlbXBsYXRlKTsKKyAgc3RkOjpzdHJpbmcgRnJvbUlkOworICBzdGQ6OnZlY3RvcjxUZW1wbGF0ZUVsZW1lbnQ+IFRlbXBsYXRlOworfTsKKworLy8vIFxicmllZiBSZXBsYWNlIHRoZSB0ZXh0IG9mIHRoZSBzdGF0ZW1lbnQgYm91bmQgdG8gXGMgRnJvbUlkIHdpdGggdGhlIHRleHQgb2YKKy8vLyB0aGUgc3RhdGVtZW50IGJvdW5kIHRvIFxjIFRvSWQuCitjbGFzcyBSZXBsYWNlU3RtdFdpdGhTdG10IDogcHVibGljIFJlZmFjdG9yaW5nQ2FsbGJhY2sgeworcHVibGljOgorICBSZXBsYWNlU3RtdFdpdGhTdG10KFN0cmluZ1JlZiBGcm9tSWQsIFN0cmluZ1JlZiBUb0lkKTsKKyAgdm9pZCBydW4oY29uc3QgYXN0X21hdGNoZXJzOjpNYXRjaEZpbmRlcjo6TWF0Y2hSZXN1bHQgJlJlc3VsdCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIEZyb21JZDsKKyAgc3RkOjpzdHJpbmcgVG9JZDsKK307CisKKy8vLyBcYnJpZWYgUmVwbGFjZSBhbiBpZi1zdGF0ZW1lbnQgYm91bmQgdG8gXGMgSWQgd2l0aCB0aGUgb3V0ZGVudGVkIHRleHQgb2YgaXRzCisvLy8gYm9keSwgY2hvb3NpbmcgdGhlIGNvbnNlcXVlbnQgb3IgdGhlIGFsdGVybmF0aXZlIGJhc2VkIG9uIHdoZXRoZXIKKy8vLyBcYyBQaWNrVHJ1ZUJyYW5jaCBpcyB0cnVlLgorY2xhc3MgUmVwbGFjZUlmU3RtdFdpdGhJdHNCb2R5IDogcHVibGljIFJlZmFjdG9yaW5nQ2FsbGJhY2sgeworcHVibGljOgorICBSZXBsYWNlSWZTdG10V2l0aEl0c0JvZHkoU3RyaW5nUmVmIElkLCBib29sIFBpY2tUcnVlQnJhbmNoKTsKKyAgdm9pZCBydW4oY29uc3QgYXN0X21hdGNoZXJzOjpNYXRjaEZpbmRlcjo6TWF0Y2hSZXN1bHQgJlJlc3VsdCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIElkOworICBjb25zdCBib29sIFBpY2tUcnVlQnJhbmNoOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHRvb2xpbmcKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVwbGFjZW1lbnRzWWFtbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZXBsYWNlbWVudHNZYW1sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIxZGM0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVwbGFjZW1lbnRzWWFtbC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vPT09LS0gUmVwbGFjZW1lbnRzWWFtbC5oIC0tIFNlcmlhbGlhemF0aW9uIGZvciBSZXBsYWNlbWVudHMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIGEgWUFNTCBkb2N1bWVudCBmb3Igc2VyaWFsaXppbmcKKy8vLyByZXBsYWNlbWVudHMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19UT09MSU5HX1JFUExBQ0VNRU5UU1lBTUxfSAorI2RlZmluZSBMTFZNX0NMQU5HX1RPT0xJTkdfUkVQTEFDRU1FTlRTWUFNTF9ICisKKyNpbmNsdWRlICJjbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1lBTUxUcmFpdHMuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IoY2xhbmc6OnRvb2xpbmc6OlJlcGxhY2VtZW50KQorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgeWFtbCB7CisKKy8vLyBcYnJpZWYgU3BlY2lhbGl6ZWQgTWFwcGluZ1RyYWl0cyB0byBkZXNjcmliZSBob3cgYSBSZXBsYWNlbWVudCBpcworLy8vIChkZSlzZXJpYWxpemVkLgordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8Y2xhbmc6OnRvb2xpbmc6OlJlcGxhY2VtZW50PiB7CisgIC8vLyBcYnJpZWYgSGVscGVyIHRvIChkZSlzZXJpYWxpemUgYSBSZXBsYWNlbWVudCBzaW5jZSB3ZSBkb24ndCBoYXZlIGRpcmVjdAorICAvLy8gYWNjZXNzIHRvIGl0cyBkYXRhIG1lbWJlcnMuCisgIHN0cnVjdCBOb3JtYWxpemVkUmVwbGFjZW1lbnQgeworICAgIE5vcm1hbGl6ZWRSZXBsYWNlbWVudChjb25zdCBJTyAmKQorICAgICAgICA6IEZpbGVQYXRoKCIiKSwgT2Zmc2V0KDApLCBMZW5ndGgoMCksIFJlcGxhY2VtZW50VGV4dCgiIikge30KKworICAgIE5vcm1hbGl6ZWRSZXBsYWNlbWVudChjb25zdCBJTyAmLCBjb25zdCBjbGFuZzo6dG9vbGluZzo6UmVwbGFjZW1lbnQgJlIpCisgICAgICAgIDogRmlsZVBhdGgoUi5nZXRGaWxlUGF0aCgpKSwgT2Zmc2V0KFIuZ2V0T2Zmc2V0KCkpLAorICAgICAgICAgIExlbmd0aChSLmdldExlbmd0aCgpKSwgUmVwbGFjZW1lbnRUZXh0KFIuZ2V0UmVwbGFjZW1lbnRUZXh0KCkpIHt9CisKKyAgICBjbGFuZzo6dG9vbGluZzo6UmVwbGFjZW1lbnQgZGVub3JtYWxpemUoY29uc3QgSU8gJikgeworICAgICAgcmV0dXJuIGNsYW5nOjp0b29saW5nOjpSZXBsYWNlbWVudChGaWxlUGF0aCwgT2Zmc2V0LCBMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50VGV4dCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgRmlsZVBhdGg7CisgICAgdW5zaWduZWQgaW50IE9mZnNldDsKKyAgICB1bnNpZ25lZCBpbnQgTGVuZ3RoOworICAgIHN0ZDo6c3RyaW5nIFJlcGxhY2VtZW50VGV4dDsKKyAgfTsKKworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJbywgY2xhbmc6OnRvb2xpbmc6OlJlcGxhY2VtZW50ICZSKSB7CisgICAgTWFwcGluZ05vcm1hbGl6YXRpb248Tm9ybWFsaXplZFJlcGxhY2VtZW50LCBjbGFuZzo6dG9vbGluZzo6UmVwbGFjZW1lbnQ+CisgICAgS2V5cyhJbywgUik7CisgICAgSW8ubWFwUmVxdWlyZWQoIkZpbGVQYXRoIiwgS2V5cy0+RmlsZVBhdGgpOworICAgIElvLm1hcFJlcXVpcmVkKCJPZmZzZXQiLCBLZXlzLT5PZmZzZXQpOworICAgIElvLm1hcFJlcXVpcmVkKCJMZW5ndGgiLCBLZXlzLT5MZW5ndGgpOworICAgIElvLm1hcFJlcXVpcmVkKCJSZXBsYWNlbWVudFRleHQiLCBLZXlzLT5SZXBsYWNlbWVudFRleHQpOworICB9Cit9OworCisvLy8gXGJyaWVmIFNwZWNpYWxpemVkIE1hcHBpbmdUcmFpdHMgdG8gZGVzY3JpYmUgaG93IGEKKy8vLyBUcmFuc2xhdGlvblVuaXRSZXBsYWNlbWVudHMgaXMgKGRlKXNlcmlhbGl6ZWQuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxjbGFuZzo6dG9vbGluZzo6VHJhbnNsYXRpb25Vbml0UmVwbGFjZW1lbnRzPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklvLAorICAgICAgICAgICAgICAgICAgICAgIGNsYW5nOjp0b29saW5nOjpUcmFuc2xhdGlvblVuaXRSZXBsYWNlbWVudHMgJkRvYykgeworICAgIElvLm1hcFJlcXVpcmVkKCJNYWluU291cmNlRmlsZSIsIERvYy5NYWluU291cmNlRmlsZSk7CisgICAgSW8ubWFwUmVxdWlyZWQoIlJlcGxhY2VtZW50cyIsIERvYy5SZXBsYWNlbWVudHMpOworICB9Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIHlhbWwKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9TdGFuZGFsb25lRXhlY3V0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1N0YW5kYWxvbmVFeGVjdXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWYzMmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9TdGFuZGFsb25lRXhlY3V0aW9uLmgKQEAgLTAsMCArMSw5NyBAQAorLy89PT0tLS0gU3RhbmRhbG9uZUV4ZWN1dGlvbi5oIC0gU3RhbmRhbG9uZSBleGVjdXRpb24uIC0qLSBDKysgLS0tLS0tLS0tLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgc3RhbmRhbG9uZSBleGVjdXRpb24gb2YgY2xhbmcgdG9vbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfU1RBTkRBTE9ORUVYRUNVVElPTl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19TVEFOREFMT05FRVhFQ1VUSU9OX0gKKworI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvQXJndW1lbnRzQWRqdXN0ZXJzLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9FeGVjdXRpb24uaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSB0b29saW5nIHsKKworLy8vIFxicmllZiBBIHN0YW5kYWxvbmUgZXhlY3V0b3IgdGhhdCBydW5zIEZyb250ZW5kQWN0aW9ucyBvbiBhIGdpdmVuIHNldCBvZgorLy8vIFRVcyBpbiBzZXF1ZW5jZS4KKy8vLworLy8vIEJ5IGRlZmF1bHQsIHRoaXMgZXhlY3V0b3IgdXNlcyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyBhZGp1c3RlcnMgKGFzIGRlZmluZWQKKy8vLyBpbiBgY2xhbmcvVG9vbGluZy9Bcmd1bWVudHNBZGp1c3RlcnMuaGApOgorLy8vICAgLSBgZ2V0Q2xhbmdTdHJpcE91dHB1dEFkanVzdGVyKClgCisvLy8gICAtIGBnZXRDbGFuZ1N5bnRheE9ubHlBZGp1c3RlcigpYAorLy8vICAgLSBgZ2V0Q2xhbmdTdHJpcERlcGVuZGVuY3lGaWxlQWRqdXN0ZXIoKWAKK2NsYXNzIFN0YW5kYWxvbmVUb29sRXhlY3V0b3IgOiBwdWJsaWMgVG9vbEV4ZWN1dG9yIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGNoYXIgKkV4ZWN1dG9yTmFtZTsKKworICAvLy8gXGJyaWVmIEluaXQgd2l0aCBccCBDb21waWxhdGlvbkRhdGFiYXNlIGFuZCB0aGUgcGF0aHMgb2YgYWxsIGZpbGVzIHRvIGJlCisgIC8vLyBwcm9jY2Vzc2VkLgorICBTdGFuZGFsb25lVG9vbEV4ZWN1dG9yKAorICAgICAgY29uc3QgQ29tcGlsYXRpb25EYXRhYmFzZSAmQ29tcGlsYXRpb25zLAorICAgICAgbGx2bTo6QXJyYXlSZWY8c3RkOjpzdHJpbmc+IFNvdXJjZVBhdGhzLAorICAgICAgc3RkOjpzaGFyZWRfcHRyPFBDSENvbnRhaW5lck9wZXJhdGlvbnM+IFBDSENvbnRhaW5lck9wcyA9CisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxQQ0hDb250YWluZXJPcGVyYXRpb25zPigpKTsKKworICAvLy8gXGJyaWVmIEluaXQgd2l0aCBccCBDb21tb25PcHRpb25zUGFyc2VyLiBUaGlzIGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgYnkKKyAgLy8vIGBjcmVhdGVFeGVjdXRvckZyb21Db21tYW5kTGluZUFyZ3NgIGJhc2VkIG9uIGNvbW1hbmRsaW5lIG9wdGlvbnMuCisgIC8vLworICAvLy8gVGhlIGV4ZWN1dG9yIHRha2VzIG93bmVyc2hpcCBvZiBccCBPcHRpb25zLgorICBTdGFuZGFsb25lVG9vbEV4ZWN1dG9yKAorICAgICAgQ29tbW9uT3B0aW9uc1BhcnNlciBPcHRpb25zLAorICAgICAgc3RkOjpzaGFyZWRfcHRyPFBDSENvbnRhaW5lck9wZXJhdGlvbnM+IFBDSENvbnRhaW5lck9wcyA9CisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxQQ0hDb250YWluZXJPcGVyYXRpb25zPigpKTsKKworICBTdHJpbmdSZWYgZ2V0RXhlY3V0b3JOYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gRXhlY3V0b3JOYW1lOyB9CisKKyAgdXNpbmcgVG9vbEV4ZWN1dG9yOjpleGVjdXRlOworCisgIGxsdm06OkVycm9yCisgIGV4ZWN1dGUobGx2bTo6QXJyYXlSZWY8CisgICAgICAgICAgc3RkOjpwYWlyPHN0ZDo6dW5pcXVlX3B0cjxGcm9udGVuZEFjdGlvbkZhY3Rvcnk+LCBBcmd1bWVudHNBZGp1c3Rlcj4+CisgICAgICAgICAgICAgIEFjdGlvbnMpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgU2V0IGEgXGMgRGlhZ25vc3RpY0NvbnN1bWVyIHRvIHVzZSBkdXJpbmcgcGFyc2luZy4KKyAgdm9pZCBzZXREaWFnbm9zdGljQ29uc3VtZXIoRGlhZ25vc3RpY0NvbnN1bWVyICpEaWFnQ29uc3VtZXIpIHsKKyAgICBUb29sLnNldERpYWdub3N0aWNDb25zdW1lcihEaWFnQ29uc3VtZXIpOworICB9CisKKyAgRXhlY3V0aW9uQ29udGV4dCAqZ2V0RXhlY3V0aW9uQ29udGV4dCgpIG92ZXJyaWRlIHsgcmV0dXJuICZDb250ZXh0OyB9OworCisgIFRvb2xSZXN1bHRzICpnZXRUb29sUmVzdWx0cygpIG92ZXJyaWRlIHsgcmV0dXJuICZSZXN1bHRzOyB9CisKKyAgbGx2bTo6QXJyYXlSZWY8c3RkOjpzdHJpbmc+IGdldFNvdXJjZVBhdGhzKCkgY29uc3QgeworICAgIHJldHVybiBUb29sLmdldFNvdXJjZVBhdGhzKCk7CisgIH0KKworICB2b2lkIG1hcFZpcnR1YWxGaWxlKFN0cmluZ1JlZiBGaWxlUGF0aCwgU3RyaW5nUmVmIENvbnRlbnQpIG92ZXJyaWRlIHsKKyAgICBUb29sLm1hcFZpcnR1YWxGaWxlKEZpbGVQYXRoLCBDb250ZW50KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZmlsZSBtYW5hZ2VyIHVzZWQgaW4gdGhlIHRvb2wuCisgIC8vLworICAvLy8gVGhlIGZpbGUgbWFuYWdlciBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgdHJhbnNsYXRpb24gdW5pdHMuCisgIEZpbGVNYW5hZ2VyICZnZXRGaWxlcygpIHsgcmV0dXJuIFRvb2wuZ2V0RmlsZXMoKTsgfQorCitwcml2YXRlOgorICAvLyBVc2VkIHRvIHN0b3JlIHRoZSBwYXJzZXIgd2hlbiB0aGUgZXhlY3V0b3IgaXMgaW5pdGlhbGl6ZWQgd2l0aCBwYXJzZXIuCisgIGxsdm06Ok9wdGlvbmFsPENvbW1vbk9wdGlvbnNQYXJzZXI+IE9wdGlvbnNQYXJzZXI7CisgIC8vIEZJWE1FOiBUaGUgc3RhbmRhbG9uZSBleGVjdXRvciBpcyBjdXJyZW50bHkganVzdCBhIHdyYXBwZXIgb2YgYENsYW5nVG9vbGAuCisgIC8vIE1lcmdlIGBDbGFuZ1Rvb2xgIGltcGxlbWVudGF0aW9uIGludG8gdGhlIHRoaXMuCisgIENsYW5nVG9vbCBUb29sOworICBFeGVjdXRpb25Db250ZXh0IENvbnRleHQ7CisgIEluTWVtb3J5VG9vbFJlc3VsdHMgUmVzdWx0czsKKyAgQXJndW1lbnRzQWRqdXN0ZXIgQXJnc0FkanVzdGVyOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHRvb2xpbmcKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19UT09MSU5HX1NUQU5EQUxPTkVFWEVDVVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9Ub29sRXhlY3V0b3JQbHVnaW5SZWdpc3RyeS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9Ub29sRXhlY3V0b3JQbHVnaW5SZWdpc3RyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMTY4OWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1Rvb2xFeGVjdXRvclBsdWdpblJlZ2lzdHJ5LmgKQEAgLTAsMCArMSwyNCBAQAorLy89PT0tIFRvb2xFeGVjdXRvclBsdWdpblJlZ2lzdHJ5LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfVE9PTEVYRUNVVE9SUExVR0lOUkVHSVNUUllfSAorI2RlZmluZSBMTFZNX0NMQU5HX1RPT0xJTkdfVE9PTEVYRUNVVE9SUExVR0lOUkVHSVNUUllfSAorCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9FeGVjdXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUmVnaXN0cnkuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSB0b29saW5nIHsKKwordXNpbmcgVG9vbEV4ZWN1dG9yUGx1Z2luUmVnaXN0cnkgPSBsbHZtOjpSZWdpc3RyeTxUb29sRXhlY3V0b3JQbHVnaW4+OworCit9IC8vIG5hbWVzcGFjZSB0b29saW5nCit9IC8vIG5hbWVzcGFjZSBjbGFuZworCisjZW5kaWYgLy8gTExWTV9DTEFOR19UT09MSU5HX1RPT0xFWEVDVVRPUlBMVUdJTlJFR0lTVFJZX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvVG9vbGluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9Ub29saW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiNGEyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvVG9vbGluZy5oCkBAIC0wLDAgKzEsNDg0IEBACisvLz09PS0gVG9vbGluZy5oIC0gRnJhbWV3b3JrIGZvciBzdGFuZGFsb25lIENsYW5nIHRvb2xzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gcnVuIGNsYW5nIHRvb2xzIHN0YW5kYWxvbmUgaW5zdGVhZAorLy8gIG9mIHJ1bm5pbmcgdGhlbSBhcyBhIHBsdWdpbi4KKy8vCisvLyAgQSBDbGFuZ1Rvb2wgaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIENvbXBpbGF0aW9uRGF0YWJhc2UgYW5kIGEgc2V0IG9mIGZpbGVzCisvLyAgdG8gcnVuIG92ZXIuIFRoZSB0b29sIHdpbGwgdGhlbiBydW4gYSB1c2VyLXNwZWNpZmllZCBGcm9udGVuZEFjdGlvbiBvdmVyCisvLyAgYWxsIFRVcyBpbiB3aGljaCB0aGUgZ2l2ZW4gZmlsZXMgYXJlIGNvbXBpbGVkLgorLy8KKy8vICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJ1biBhIEZyb250ZW5kQWN0aW9uIG92ZXIgYSBzbmlwcGV0IG9mIGNvZGUgYnkKKy8vICBjYWxsaW5nIHJ1blRvb2xPbkNvZGUsIHdoaWNoIGlzIHVzZWZ1bCBmb3IgdW5pdCB0ZXN0aW5nLgorLy8KKy8vICBBcHBsaWNhdGlvbnMgdGhhdCBuZWVkIG1vcmUgZmluZSBncmFpbmVkIGNvbnRyb2wgb3ZlciBob3cgdG8gcnVuCisvLyAgbXVsdGlwbGUgRnJvbnRlbmRBY3Rpb25zIG92ZXIgY29kZSBjYW4gdXNlIFRvb2xJbnZvY2F0aW9uLgorLy8KKy8vICBFeGFtcGxlIHRvb2xzOgorLy8gIC0gcnVubmluZyBjbGFuZyAtZnN5bnRheC1vbmx5IG92ZXIgc291cmNlIGNvZGUgZnJvbSBhbiBlZGl0b3IgdG8gZ2V0CisvLyAgICBmYXN0IHN5bnRheCBjaGVja3MKKy8vICAtIHJ1bm5pbmcgbWF0Y2gvcmVwbGFjZSB0b29scyBvdmVyIEMrKyBjb2RlCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1RPT0xJTkdfVE9PTElOR19ICisjZGVmaW5lIExMVk1fQ0xBTkdfVE9PTElOR19UT09MSU5HX0gKKworI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb25zdW1lci5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0ZpbGVNYW5hZ2VyLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1ZpcnR1YWxGaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9QQ0hDb250YWluZXJPcGVyYXRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9Bcmd1bWVudHNBZGp1c3RlcnMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9PcHRpb24vT3B0aW9uLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsYW5nIHsKKworY2xhc3MgQ29tcGlsZXJJbnN0YW5jZTsKK2NsYXNzIENvbXBpbGVySW52b2NhdGlvbjsKK2NsYXNzIERpYWdub3N0aWNDb25zdW1lcjsKK2NsYXNzIERpYWdub3N0aWNzRW5naW5lOworY2xhc3MgU291cmNlTWFuYWdlcjsKKworbmFtZXNwYWNlIGRyaXZlciB7CisKK2NsYXNzIENvbXBpbGF0aW9uOworCit9IC8vIG5hbWVzcGFjZSBkcml2ZXIKKworbmFtZXNwYWNlIHRvb2xpbmcgeworCitjbGFzcyBDb21waWxhdGlvbkRhdGFiYXNlOworCisvLy8gXGJyaWVmIEludGVyZmFjZSB0byBwcm9jZXNzIGEgY2xhbmc6OkNvbXBpbGVySW52b2NhdGlvbi4KKy8vLworLy8vIElmIHlvdXIgdG9vbCBpcyBiYXNlZCBvbiBGcm9udGVuZEFjdGlvbiwgeW91IHNob3VsZCBiZSBkZXJpdmluZyBmcm9tCisvLy8gRnJvbnRlbmRBY3Rpb25GYWN0b3J5IGluc3RlYWQuCitjbGFzcyBUb29sQWN0aW9uIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VG9vbEFjdGlvbigpOworCisgIC8vLyBcYnJpZWYgUGVyZm9ybSBhbiBhY3Rpb24gZm9yIGFuIGludm9jYXRpb24uCisgIHZpcnR1YWwgYm9vbAorICBydW5JbnZvY2F0aW9uKHN0ZDo6c2hhcmVkX3B0cjxDb21waWxlckludm9jYXRpb24+IEludm9jYXRpb24sCisgICAgICAgICAgICAgICAgRmlsZU1hbmFnZXIgKkZpbGVzLAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQQ0hDb250YWluZXJPcGVyYXRpb25zPiBQQ0hDb250YWluZXJPcHMsCisgICAgICAgICAgICAgICAgRGlhZ25vc3RpY0NvbnN1bWVyICpEaWFnQ29uc3VtZXIpID0gMDsKK307CisKKy8vLyBcYnJpZWYgSW50ZXJmYWNlIHRvIGdlbmVyYXRlIGNsYW5nOjpGcm9udGVuZEFjdGlvbnMuCisvLy8KKy8vLyBIYXZpbmcgYSBmYWN0b3J5IGludGVyZmFjZSBhbGxvd3MsIGZvciBleGFtcGxlLCBhIG5ldyBGcm9udGVuZEFjdGlvbiB0byBiZQorLy8vIGNyZWF0ZWQgZm9yIGVhY2ggdHJhbnNsYXRpb24gdW5pdCBwcm9jZXNzZWQgYnkgQ2xhbmdUb29sLiAgVGhpcyBjbGFzcyBpcworLy8vIGFsc28gYSBUb29sQWN0aW9uIHdoaWNoIHVzZXMgdGhlIEZyb250ZW5kQWN0aW9ucyBjcmVhdGVkIGJ5IGNyZWF0ZSgpIHRvCisvLy8gcHJvY2VzcyBlYWNoIHRyYW5zbGF0aW9uIHVuaXQuCitjbGFzcyBGcm9udGVuZEFjdGlvbkZhY3RvcnkgOiBwdWJsaWMgVG9vbEFjdGlvbiB7CitwdWJsaWM6CisgIH5Gcm9udGVuZEFjdGlvbkZhY3RvcnkoKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIEludm9rZXMgdGhlIGNvbXBpbGVyIHdpdGggYSBGcm9udGVuZEFjdGlvbiBjcmVhdGVkIGJ5IGNyZWF0ZSgpLgorICBib29sIHJ1bkludm9jYXRpb24oc3RkOjpzaGFyZWRfcHRyPENvbXBpbGVySW52b2NhdGlvbj4gSW52b2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIEZpbGVNYW5hZ2VyICpGaWxlcywKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQQ0hDb250YWluZXJPcGVyYXRpb25zPiBQQ0hDb250YWluZXJPcHMsCisgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljQ29uc3VtZXIgKkRpYWdDb25zdW1lcikgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgbmV3IGNsYW5nOjpGcm9udGVuZEFjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGUgY2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgcmV0dXJuZWQgYWN0aW9uLgorICB2aXJ0dWFsIEZyb250ZW5kQWN0aW9uICpjcmVhdGUoKSA9IDA7Cit9OworCisvLy8gXGJyaWVmIFJldHVybnMgYSBuZXcgRnJvbnRlbmRBY3Rpb25GYWN0b3J5IGZvciBhIGdpdmVuIHR5cGUuCisvLy8KKy8vLyBUIG11c3QgZGVyaXZlIGZyb20gY2xhbmc6OkZyb250ZW5kQWN0aW9uLgorLy8vCisvLy8gRXhhbXBsZToKKy8vLyBGcm9udGVuZEFjdGlvbkZhY3RvcnkgKkZhY3RvcnkgPQorLy8vICAgbmV3RnJvbnRlbmRBY3Rpb25GYWN0b3J5PGNsYW5nOjpTeW50YXhPbmx5QWN0aW9uPigpOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnVuaXF1ZV9wdHI8RnJvbnRlbmRBY3Rpb25GYWN0b3J5PiBuZXdGcm9udGVuZEFjdGlvbkZhY3RvcnkoKTsKKworLy8vIFxicmllZiBDYWxsYmFja3MgY2FsbGVkIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCBzb3VyY2UgZmlsZSBwcm9jZXNzZWQgYnkgYQorLy8vIEZyb250ZW5kQWN0aW9uIGNyZWF0ZWQgYnkgdGhlIEZyb250ZWRBY3Rpb25GYWN0b3J5IHJldHVybmVkIGJ5IFxjCisvLy8gbmV3RnJvbnRlbmRBY3Rpb25GYWN0b3J5LgorY2xhc3MgU291cmNlRmlsZUNhbGxiYWNrcyB7CitwdWJsaWM6CisgIHZpcnR1YWwgflNvdXJjZUZpbGVDYWxsYmFja3MoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBDYWxsZWQgYmVmb3JlIGEgc291cmNlIGZpbGUgaXMgcHJvY2Vzc2VkIGJ5IGEgRnJvbnRFbmRBY3Rpb24uCisgIC8vLyBcc2VlIGNsYW5nOjpGcm9udGVuZEFjdGlvbjo6QmVnaW5Tb3VyY2VGaWxlQWN0aW9uCisgIHZpcnR1YWwgYm9vbCBoYW5kbGVCZWdpblNvdXJjZShDb21waWxlckluc3RhbmNlICZDSSkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFxicmllZiBDYWxsZWQgYWZ0ZXIgYSBzb3VyY2UgZmlsZSBpcyBwcm9jZXNzZWQgYnkgYSBGcm9udGVuZEFjdGlvbi4KKyAgLy8vIFxzZWUgY2xhbmc6OkZyb250ZW5kQWN0aW9uOjpFbmRTb3VyY2VGaWxlQWN0aW9uCisgIHZpcnR1YWwgdm9pZCBoYW5kbGVFbmRTb3VyY2UoKSB7fQorfTsKKworLy8vIFxicmllZiBSZXR1cm5zIGEgbmV3IEZyb250ZW5kQWN0aW9uRmFjdG9yeSBmb3IgYW55IHR5cGUgdGhhdCBwcm92aWRlcyBhbgorLy8vIGltcGxlbWVudGF0aW9uIG9mIG5ld0FTVENvbnN1bWVyKCkuCisvLy8KKy8vLyBGYWN0b3J5VCBtdXN0IGltcGxlbWVudDogQVNUQ29uc3VtZXIgKm5ld0FTVENvbnN1bWVyKCkuCisvLy8KKy8vLyBFeGFtcGxlOgorLy8vIHN0cnVjdCBQcm92aWRlc0FTVENvbnN1bWVycyB7CisvLy8gICBjbGFuZzo6QVNUQ29uc3VtZXIgKm5ld0FTVENvbnN1bWVyKCk7CisvLy8gfSBGYWN0b3J5OworLy8vIHN0ZDo6dW5pcXVlX3B0cjxGcm9udGVuZEFjdGlvbkZhY3Rvcnk+IEZhY3RvcnlBZGFwdGVyKAorLy8vICAgbmV3RnJvbnRlbmRBY3Rpb25GYWN0b3J5KCZGYWN0b3J5KSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRmFjdG9yeVQ+CitpbmxpbmUgc3RkOjp1bmlxdWVfcHRyPEZyb250ZW5kQWN0aW9uRmFjdG9yeT4gbmV3RnJvbnRlbmRBY3Rpb25GYWN0b3J5KAorICAgIEZhY3RvcnlUICpDb25zdW1lckZhY3RvcnksIFNvdXJjZUZpbGVDYWxsYmFja3MgKkNhbGxiYWNrcyA9IG51bGxwdHIpOworCisvLy8gXGJyaWVmIFJ1bnMgKGFuZCBkZWxldGVzKSB0aGUgdG9vbCBvbiAnQ29kZScgd2l0aCB0aGUgLWZzeW50YXgtb25seSBmbGFnLgorLy8vCisvLy8gXHBhcmFtIFRvb2xBY3Rpb24gVGhlIGFjdGlvbiB0byBydW4gb3ZlciB0aGUgY29kZS4KKy8vLyBccGFyYW0gQ29kZSBDKysgY29kZS4KKy8vLyBccGFyYW0gRmlsZU5hbWUgVGhlIGZpbGUgbmFtZSB3aGljaCAnQ29kZScgd2lsbCBiZSBtYXBwZWQgYXMuCisvLy8gXHBhcmFtIFBDSENvbnRhaW5lck9wcyAgVGhlIFBDSENvbnRhaW5lck9wZXJhdGlvbnMgZm9yIGxvYWRpbmcgYW5kIGNyZWF0aW5nCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2xhbmcgbW9kdWxlcy4KKy8vLworLy8vIFxyZXR1cm4gLSBUcnVlIGlmICdUb29sQWN0aW9uJyB3YXMgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLgorYm9vbCBydW5Ub29sT25Db2RlKEZyb250ZW5kQWN0aW9uICpUb29sQWN0aW9uLCBjb25zdCBUd2luZSAmQ29kZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmRmlsZU5hbWUgPSAiaW5wdXQuY2MiLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQQ0hDb250YWluZXJPcGVyYXRpb25zPiBQQ0hDb250YWluZXJPcHMgPQorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFBDSENvbnRhaW5lck9wZXJhdGlvbnM+KCkpOworCisvLy8gVGhlIGZpcnN0IHBhcnQgb2YgdGhlIHBhaXIgaXMgdGhlIGZpbGVuYW1lLCB0aGUgc2Vjb25kIHBhcnQgdGhlCisvLy8gZmlsZS1jb250ZW50LgordXNpbmcgRmlsZUNvbnRlbnRNYXBwaW5ncyA9IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PjsKKworLy8vIFxicmllZiBSdW5zIChhbmQgZGVsZXRlcykgdGhlIHRvb2wgb24gJ0NvZGUnIHdpdGggdGhlIC1mc3ludGF4LW9ubHkgZmxhZyBhbmQKKy8vLyAgICAgICAgd2l0aCBhZGRpdGlvbmFsIG90aGVyIGZsYWdzLgorLy8vCisvLy8gXHBhcmFtIFRvb2xBY3Rpb24gVGhlIGFjdGlvbiB0byBydW4gb3ZlciB0aGUgY29kZS4KKy8vLyBccGFyYW0gQ29kZSBDKysgY29kZS4KKy8vLyBccGFyYW0gQXJncyBBZGRpdGlvbmFsIGZsYWdzIHRvIHBhc3Mgb24uCisvLy8gXHBhcmFtIEZpbGVOYW1lIFRoZSBmaWxlIG5hbWUgd2hpY2ggJ0NvZGUnIHdpbGwgYmUgbWFwcGVkIGFzLgorLy8vIFxwYXJhbSBUb29sTmFtZSBUaGUgbmFtZSBvZiB0aGUgYmluYXJ5IHJ1bm5pbmcgdGhlIHRvb2wuIFN0YW5kYXJkIGxpYnJhcnkKKy8vLyAgICAgICAgICAgICAgICAgaGVhZGVyIHBhdGhzIHdpbGwgYmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhpcy4KKy8vLyBccGFyYW0gUENIQ29udGFpbmVyT3BzICAgVGhlIFBDSENvbnRhaW5lck9wZXJhdGlvbnMgZm9yIGxvYWRpbmcgYW5kIGNyZWF0aW5nCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYW5nIG1vZHVsZXMuCisvLy8KKy8vLyBccmV0dXJuIC0gVHJ1ZSBpZiAnVG9vbEFjdGlvbicgd2FzIHN1Y2Nlc3NmdWxseSBleGVjdXRlZC4KK2Jvb2wgcnVuVG9vbE9uQ29kZVdpdGhBcmdzKAorICAgIEZyb250ZW5kQWN0aW9uICpUb29sQWN0aW9uLCBjb25zdCBUd2luZSAmQ29kZSwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJkFyZ3MsIGNvbnN0IFR3aW5lICZGaWxlTmFtZSA9ICJpbnB1dC5jYyIsCisgICAgY29uc3QgVHdpbmUgJlRvb2xOYW1lID0gImNsYW5nLXRvb2wiLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxQQ0hDb250YWluZXJPcGVyYXRpb25zPiBQQ0hDb250YWluZXJPcHMgPQorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFBDSENvbnRhaW5lck9wZXJhdGlvbnM+KCksCisgICAgY29uc3QgRmlsZUNvbnRlbnRNYXBwaW5ncyAmVmlydHVhbE1hcHBlZEZpbGVzID0gRmlsZUNvbnRlbnRNYXBwaW5ncygpKTsKKworLy8vIFxicmllZiBCdWlsZHMgYW4gQVNUIGZvciAnQ29kZScuCisvLy8KKy8vLyBccGFyYW0gQ29kZSBDKysgY29kZS4KKy8vLyBccGFyYW0gRmlsZU5hbWUgVGhlIGZpbGUgbmFtZSB3aGljaCAnQ29kZScgd2lsbCBiZSBtYXBwZWQgYXMuCisvLy8gXHBhcmFtIFBDSENvbnRhaW5lck9wcyBUaGUgUENIQ29udGFpbmVyT3BlcmF0aW9ucyBmb3IgbG9hZGluZyBhbmQgY3JlYXRpbmcKKy8vLyBjbGFuZyBtb2R1bGVzLgorLy8vCisvLy8gXHJldHVybiBUaGUgcmVzdWx0aW5nIEFTVCBvciBudWxsIGlmIGFuIGVycm9yIG9jY3VycmVkLgorc3RkOjp1bmlxdWVfcHRyPEFTVFVuaXQ+CitidWlsZEFTVEZyb21Db2RlKGNvbnN0IFR3aW5lICZDb2RlLCBjb25zdCBUd2luZSAmRmlsZU5hbWUgPSAiaW5wdXQuY2MiLAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UENIQ29udGFpbmVyT3BlcmF0aW9ucz4gUENIQ29udGFpbmVyT3BzID0KKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8UENIQ29udGFpbmVyT3BlcmF0aW9ucz4oKSk7CisKKy8vLyBcYnJpZWYgQnVpbGRzIGFuIEFTVCBmb3IgJ0NvZGUnIHdpdGggYWRkaXRpb25hbCBmbGFncy4KKy8vLworLy8vIFxwYXJhbSBDb2RlIEMrKyBjb2RlLgorLy8vIFxwYXJhbSBBcmdzIEFkZGl0aW9uYWwgZmxhZ3MgdG8gcGFzcyBvbi4KKy8vLyBccGFyYW0gRmlsZU5hbWUgVGhlIGZpbGUgbmFtZSB3aGljaCAnQ29kZScgd2lsbCBiZSBtYXBwZWQgYXMuCisvLy8gXHBhcmFtIFRvb2xOYW1lIFRoZSBuYW1lIG9mIHRoZSBiaW5hcnkgcnVubmluZyB0aGUgdG9vbC4gU3RhbmRhcmQgbGlicmFyeQorLy8vICAgICAgICAgICAgICAgICBoZWFkZXIgcGF0aHMgd2lsbCBiZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGlzLgorLy8vIFxwYXJhbSBQQ0hDb250YWluZXJPcHMgVGhlIFBDSENvbnRhaW5lck9wZXJhdGlvbnMgZm9yIGxvYWRpbmcgYW5kIGNyZWF0aW5nCisvLy8gY2xhbmcgbW9kdWxlcy4KKy8vLworLy8vIFxwYXJhbSBBZGp1c3RlciBBIGZ1bmN0aW9uIHRvIGZpbHRlciB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhcyBzcGVjaWZpZWQuCisvLy8KKy8vLyBccmV0dXJuIFRoZSByZXN1bHRpbmcgQVNUIG9yIG51bGwgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCitzdGQ6OnVuaXF1ZV9wdHI8QVNUVW5pdD4gYnVpbGRBU1RGcm9tQ29kZVdpdGhBcmdzKAorICAgIGNvbnN0IFR3aW5lICZDb2RlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJkFyZ3MsCisgICAgY29uc3QgVHdpbmUgJkZpbGVOYW1lID0gImlucHV0LmNjIiwgY29uc3QgVHdpbmUgJlRvb2xOYW1lID0gImNsYW5nLXRvb2wiLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxQQ0hDb250YWluZXJPcGVyYXRpb25zPiBQQ0hDb250YWluZXJPcHMgPQorICAgICAgc3RkOjptYWtlX3NoYXJlZDxQQ0hDb250YWluZXJPcGVyYXRpb25zPigpLAorICAgIEFyZ3VtZW50c0FkanVzdGVyIEFkanVzdGVyID0gZ2V0Q2xhbmdTdHJpcERlcGVuZGVuY3lGaWxlQWRqdXN0ZXIoKSk7CisKKy8vLyBcYnJpZWYgVXRpbGl0eSB0byBydW4gYSBGcm9udGVuZEFjdGlvbiBpbiBhIHNpbmdsZSBjbGFuZyBpbnZvY2F0aW9uLgorY2xhc3MgVG9vbEludm9jYXRpb24geworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZSBhIHRvb2wgaW52b2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29tbWFuZExpbmUgVGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gY2xhbmcuIE5vdGUgdGhhdCBjbGFuZworICAvLy8gdXNlcyBpdHMgYmluYXJ5IG5hbWUgKENvbW1hbmRMaW5lWzBdKSB0byBsb2NhdGUgaXRzIGJ1aWx0aW4gaGVhZGVycy4KKyAgLy8vIENhbGxlcnMgaGF2ZSB0byBlbnN1cmUgdGhhdCB0aGV5IGFyZSBpbnN0YWxsZWQgaW4gYSBjb21wYXRpYmxlIGxvY2F0aW9uCisgIC8vLyAoc2VlIGNsYW5nIGRyaXZlciBpbXBsZW1lbnRhdGlvbikgb3IgbWFwcGVkIGluIHZpYSBtYXBWaXJ0dWFsRmlsZS4KKyAgLy8vIFxwYXJhbSBGQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQuIENsYXNzIHRha2VzIG93bmVyc2hpcC4KKyAgLy8vIFxwYXJhbSBGaWxlcyBUaGUgRmlsZU1hbmFnZXIgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbi4gQ2xhc3MgZG9lcyBub3QgdGFrZQorICAvLy8gb3duZXJzaGlwLgorICAvLy8gXHBhcmFtIFBDSENvbnRhaW5lck9wcyBUaGUgUENIQ29udGFpbmVyT3BlcmF0aW9ucyBmb3IgbG9hZGluZyBhbmQgY3JlYXRpbmcKKyAgLy8vIGNsYW5nIG1vZHVsZXMuCisgIFRvb2xJbnZvY2F0aW9uKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBDb21tYW5kTGluZSwgRnJvbnRlbmRBY3Rpb24gKkZBY3Rpb24sCisgICAgICAgICAgICAgICAgIEZpbGVNYW5hZ2VyICpGaWxlcywKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBDSENvbnRhaW5lck9wZXJhdGlvbnM+IFBDSENvbnRhaW5lck9wcyA9CisgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFBDSENvbnRhaW5lck9wZXJhdGlvbnM+KCkpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgdG9vbCBpbnZvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb21tYW5kTGluZSBUaGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBjbGFuZy4KKyAgLy8vIFxwYXJhbSBBY3Rpb24gVGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZC4KKyAgLy8vIFxwYXJhbSBGaWxlcyBUaGUgRmlsZU1hbmFnZXIgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbi4KKyAgLy8vIFxwYXJhbSBQQ0hDb250YWluZXJPcHMgVGhlIFBDSENvbnRhaW5lck9wZXJhdGlvbnMgZm9yIGxvYWRpbmcgYW5kIGNyZWF0aW5nCisgIC8vLyBjbGFuZyBtb2R1bGVzLgorICBUb29sSW52b2NhdGlvbihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ29tbWFuZExpbmUsIFRvb2xBY3Rpb24gKkFjdGlvbiwKKyAgICAgICAgICAgICAgICAgRmlsZU1hbmFnZXIgKkZpbGVzLAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UENIQ29udGFpbmVyT3BlcmF0aW9ucz4gUENIQ29udGFpbmVyT3BzKTsKKworICB+VG9vbEludm9jYXRpb24oKTsKKworICAvLy8gXGJyaWVmIFNldCBhIFxjIERpYWdub3N0aWNDb25zdW1lciB0byB1c2UgZHVyaW5nIHBhcnNpbmcuCisgIHZvaWQgc2V0RGlhZ25vc3RpY0NvbnN1bWVyKERpYWdub3N0aWNDb25zdW1lciAqRGlhZ0NvbnN1bWVyKSB7CisgICAgdGhpcy0+RGlhZ0NvbnN1bWVyID0gRGlhZ0NvbnN1bWVyOworICB9CisKKyAgLy8vIFxicmllZiBNYXAgYSB2aXJ0dWFsIGZpbGUgdG8gYmUgdXNlZCB3aGlsZSBydW5uaW5nIHRoZSB0b29sLgorICAvLy8KKyAgLy8vIFxwYXJhbSBGaWxlUGF0aCBUaGUgcGF0aCBhdCB3aGljaCB0aGUgY29udGVudCB3aWxsIGJlIG1hcHBlZC4KKyAgLy8vIFxwYXJhbSBDb250ZW50IEEgbnVsbCB0ZXJtaW5hdGVkIGJ1ZmZlciBvZiB0aGUgZmlsZSdzIGNvbnRlbnQuCisgIC8vIEZJWE1FOiByZW1vdmUgdGhpcyB3aGVuIGFsbCB1c2VycyBoYXZlIG1pZ3JhdGVkIQorICB2b2lkIG1hcFZpcnR1YWxGaWxlKFN0cmluZ1JlZiBGaWxlUGF0aCwgU3RyaW5nUmVmIENvbnRlbnQpOworCisgIC8vLyBcYnJpZWYgUnVuIHRoZSBjbGFuZyBpbnZvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRydWUgaWYgdGhlcmUgd2VyZSBubyBlcnJvcnMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgYm9vbCBydW4oKTsKKworIHByaXZhdGU6CisgIHZvaWQgYWRkRmlsZU1hcHBpbmdzVG8oU291cmNlTWFuYWdlciAmU291cmNlTWFuYWdlcik7CisKKyAgYm9vbCBydW5JbnZvY2F0aW9uKGNvbnN0IGNoYXIgKkJpbmFyeU5hbWUsCisgICAgICAgICAgICAgICAgICAgICBkcml2ZXI6OkNvbXBpbGF0aW9uICpDb21waWxhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21waWxlckludm9jYXRpb24+IEludm9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UENIQ29udGFpbmVyT3BlcmF0aW9ucz4gUENIQ29udGFpbmVyT3BzKTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ29tbWFuZExpbmU7CisgIFRvb2xBY3Rpb24gKkFjdGlvbjsKKyAgYm9vbCBPd25zQWN0aW9uOworICBGaWxlTWFuYWdlciAqRmlsZXM7CisgIHN0ZDo6c2hhcmVkX3B0cjxQQ0hDb250YWluZXJPcGVyYXRpb25zPiBQQ0hDb250YWluZXJPcHM7CisgIC8vIE1hcHMgPGZpbGUgbmFtZT4gLT4gPGZpbGUgY29udGVudD4uCisgIGxsdm06OlN0cmluZ01hcDxTdHJpbmdSZWY+IE1hcHBlZEZpbGVDb250ZW50czsKKyAgRGlhZ25vc3RpY0NvbnN1bWVyICpEaWFnQ29uc3VtZXIgPSBudWxscHRyOworfTsKKworLy8vIFxicmllZiBVdGlsaXR5IHRvIHJ1biBhIEZyb250ZW5kQWN0aW9uIG92ZXIgYSBzZXQgb2YgZmlsZXMuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGlzIHdyaXR0ZW4gdG8gYmUgdXNhYmxlIGZvciBjb21tYW5kIGxpbmUgdXRpbGl0aWVzLgorLy8vIEJ5IGRlZmF1bHQgdGhlIGNsYXNzIHVzZXMgQ2xhbmdTeW50YXhPbmx5QWRqdXN0ZXIgdG8gbW9kaWZ5CisvLy8gY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBiZWZvcmUgdGhlIGFyZ3VtZW50cyBhcmUgdXNlZCB0byBydW4KKy8vLyBhIGZyb250ZW5kIGFjdGlvbi4gT25lIGNvdWxkIGluc3RhbGwgYW4gYWRkaXRpb25hbCBjb21tYW5kIGxpbmUKKy8vLyBhcmd1bWVudHMgYWRqdXN0ZXIgYnkgY2FsbGluZyB0aGUgYXBwZW5kQXJndW1lbnRzQWRqdXN0ZXIoKSBtZXRob2QuCitjbGFzcyBDbGFuZ1Rvb2wgeworcHVibGljOgorICAvLy8gXGJyaWVmIENvbnN0cnVjdHMgYSBjbGFuZyB0b29sIHRvIHJ1biBvdmVyIGEgbGlzdCBvZiBmaWxlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29tcGlsYXRpb25zIFRoZSBDb21waWxhdGlvbkRhdGFiYXNlIHdoaWNoIGNvbnRhaW5zIHRoZSBjb21waWxlCisgIC8vLyAgICAgICAgY29tbWFuZCBsaW5lcyBmb3IgdGhlIGdpdmVuIHNvdXJjZSBwYXRocy4KKyAgLy8vIFxwYXJhbSBTb3VyY2VQYXRocyBUaGUgc291cmNlIGZpbGVzIHRvIHJ1biBvdmVyLiBJZiBhIHNvdXJjZSBmaWxlcyBpcworICAvLy8gICAgICAgIG5vdCBmb3VuZCBpbiBDb21waWxhdGlvbnMsIGl0IGlzIHNraXBwZWQuCisgIC8vLyBccGFyYW0gUENIQ29udGFpbmVyT3BzIFRoZSBQQ0hDb250YWluZXJPcGVyYXRpb25zIGZvciBsb2FkaW5nIGFuZCBjcmVhdGluZworICAvLy8gY2xhbmcgbW9kdWxlcy4KKyAgLy8vIFxwYXJhbSBCYXNlRlMgVkZTIHVzZWQgZm9yIGFsbCB1bmRlcmx5aW5nIGZpbGUgYWNjZXNzZXMgd2hlbiBydW5uaW5nIHRoZQorICAvLy8gdG9vbC4KKyAgQ2xhbmdUb29sKGNvbnN0IENvbXBpbGF0aW9uRGF0YWJhc2UgJkNvbXBpbGF0aW9ucywKKyAgICAgICAgICAgIEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBTb3VyY2VQYXRocywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQQ0hDb250YWluZXJPcGVyYXRpb25zPiBQQ0hDb250YWluZXJPcHMgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8UENIQ29udGFpbmVyT3BlcmF0aW9ucz4oKSwKKyAgICAgICAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjx2ZnM6OkZpbGVTeXN0ZW0+IEJhc2VGUyA9CisgICAgICAgICAgICAgICAgdmZzOjpnZXRSZWFsRmlsZVN5c3RlbSgpKTsKKworICB+Q2xhbmdUb29sKCk7CisKKyAgLy8vIFxicmllZiBTZXQgYSBcYyBEaWFnbm9zdGljQ29uc3VtZXIgdG8gdXNlIGR1cmluZyBwYXJzaW5nLgorICB2b2lkIHNldERpYWdub3N0aWNDb25zdW1lcihEaWFnbm9zdGljQ29uc3VtZXIgKkRpYWdDb25zdW1lcikgeworICAgIHRoaXMtPkRpYWdDb25zdW1lciA9IERpYWdDb25zdW1lcjsKKyAgfQorCisgIC8vLyBcYnJpZWYgTWFwIGEgdmlydHVhbCBmaWxlIHRvIGJlIHVzZWQgd2hpbGUgcnVubmluZyB0aGUgdG9vbC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRmlsZVBhdGggVGhlIHBhdGggYXQgd2hpY2ggdGhlIGNvbnRlbnQgd2lsbCBiZSBtYXBwZWQuCisgIC8vLyBccGFyYW0gQ29udGVudCBBIG51bGwgdGVybWluYXRlZCBidWZmZXIgb2YgdGhlIGZpbGUncyBjb250ZW50LgorICB2b2lkIG1hcFZpcnR1YWxGaWxlKFN0cmluZ1JlZiBGaWxlUGF0aCwgU3RyaW5nUmVmIENvbnRlbnQpOworCisgIC8vLyBcYnJpZWYgQXBwZW5kIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhZGp1c3RlciB0byB0aGUgYWRqdXN0ZXIgY2hhaW4uCisgIC8vLworICAvLy8gXHBhcmFtIEFkanVzdGVyIEFuIGFyZ3VtZW50IGFkanVzdGVyLCB3aGljaCB3aWxsIGJlIHJ1biBvbiB0aGUgb3V0cHV0IG9mCisgIC8vLyAgICAgICAgcHJldmlvdXMgYXJndW1lbnQgYWRqdXN0ZXJzLgorICB2b2lkIGFwcGVuZEFyZ3VtZW50c0FkanVzdGVyKEFyZ3VtZW50c0FkanVzdGVyIEFkanVzdGVyKTsKKworICAvLy8gXGJyaWVmIENsZWFyIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFkanVzdGVyIGNoYWluLgorICB2b2lkIGNsZWFyQXJndW1lbnRzQWRqdXN0ZXJzKCk7CisKKyAgLy8vIFJ1bnMgYW4gYWN0aW9uIG92ZXIgYWxsIGZpbGVzIHNwZWNpZmllZCBpbiB0aGUgY29tbWFuZCBsaW5lLgorICAvLy8KKyAgLy8vIFxwYXJhbSBBY3Rpb24gVG9vbCBhY3Rpb24uCisgIC8vLworICAvLy8gXHJldHVybnMgMCBvbiBzdWNjZXNzOyAxIGlmIGFueSBlcnJvciBvY2N1cmVkOyAyIGlmIHRoZXJlIGlzIG5vIGVycm9yIGJ1dAorICAvLy8gc29tZSBmaWxlcyBhcmUgc2tpcHBlZCBkdWUgdG8gbWlzc2luZyBjb21waWxlIGNvbW1hbmRzLgorICBpbnQgcnVuKFRvb2xBY3Rpb24gKkFjdGlvbik7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gQVNUIGZvciBlYWNoIGZpbGUgc3BlY2lmaWVkIGluIHRoZSBjb21tYW5kIGxpbmUgYW5kCisgIC8vLyBhcHBlbmQgdGhlbSB0byBBU1RzLgorICBpbnQgYnVpbGRBU1RzKHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBU1RVbml0Pj4gJkFTVHMpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZmlsZSBtYW5hZ2VyIHVzZWQgaW4gdGhlIHRvb2wuCisgIC8vLworICAvLy8gVGhlIGZpbGUgbWFuYWdlciBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgdHJhbnNsYXRpb24gdW5pdHMuCisgIEZpbGVNYW5hZ2VyICZnZXRGaWxlcygpIHsgcmV0dXJuICpGaWxlczsgfQorCisgIGxsdm06OkFycmF5UmVmPHN0ZDo6c3RyaW5nPiBnZXRTb3VyY2VQYXRocygpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZVBhdGhzOyB9CisKK3ByaXZhdGU6CisgIGNvbnN0IENvbXBpbGF0aW9uRGF0YWJhc2UgJkNvbXBpbGF0aW9uczsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFNvdXJjZVBhdGhzOworICBzdGQ6OnNoYXJlZF9wdHI8UENIQ29udGFpbmVyT3BlcmF0aW9ucz4gUENIQ29udGFpbmVyT3BzOworCisgIGxsdm06OkludHJ1c2l2ZVJlZkNudFB0cjx2ZnM6Ok92ZXJsYXlGaWxlU3lzdGVtPiBPdmVybGF5RmlsZVN5c3RlbTsKKyAgbGx2bTo6SW50cnVzaXZlUmVmQ250UHRyPHZmczo6SW5NZW1vcnlGaWxlU3lzdGVtPiBJbk1lbW9yeUZpbGVTeXN0ZW07CisgIGxsdm06OkludHJ1c2l2ZVJlZkNudFB0cjxGaWxlTWFuYWdlcj4gRmlsZXM7CisKKyAgLy8gQ29udGFpbnMgYSBsaXN0IG9mIHBhaXJzICg8ZmlsZSBuYW1lPiwgPGZpbGUgY29udGVudD4pLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8U3RyaW5nUmVmLCBTdHJpbmdSZWY+PiBNYXBwZWRGaWxlQ29udGVudHM7CisKKyAgbGx2bTo6U3RyaW5nU2V0PD4gU2VlbldvcmtpbmdEaXJlY3RvcmllczsKKworICBBcmd1bWVudHNBZGp1c3RlciBBcmdzQWRqdXN0ZXI7CisKKyAgRGlhZ25vc3RpY0NvbnN1bWVyICpEaWFnQ29uc3VtZXIgPSBudWxscHRyOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnVuaXF1ZV9wdHI8RnJvbnRlbmRBY3Rpb25GYWN0b3J5PiBuZXdGcm9udGVuZEFjdGlvbkZhY3RvcnkoKSB7CisgIGNsYXNzIFNpbXBsZUZyb250ZW5kQWN0aW9uRmFjdG9yeSA6IHB1YmxpYyBGcm9udGVuZEFjdGlvbkZhY3RvcnkgeworICBwdWJsaWM6CisgICAgRnJvbnRlbmRBY3Rpb24gKmNyZWF0ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIG5ldyBUOyB9CisgIH07CisKKyAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxGcm9udGVuZEFjdGlvbkZhY3Rvcnk+KAorICAgICAgbmV3IFNpbXBsZUZyb250ZW5kQWN0aW9uRmFjdG9yeSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGYWN0b3J5VD4KK2lubGluZSBzdGQ6OnVuaXF1ZV9wdHI8RnJvbnRlbmRBY3Rpb25GYWN0b3J5PiBuZXdGcm9udGVuZEFjdGlvbkZhY3RvcnkoCisgICAgRmFjdG9yeVQgKkNvbnN1bWVyRmFjdG9yeSwgU291cmNlRmlsZUNhbGxiYWNrcyAqQ2FsbGJhY2tzKSB7CisgIGNsYXNzIEZyb250ZW5kQWN0aW9uRmFjdG9yeUFkYXB0ZXIgOiBwdWJsaWMgRnJvbnRlbmRBY3Rpb25GYWN0b3J5IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEZyb250ZW5kQWN0aW9uRmFjdG9yeUFkYXB0ZXIoRmFjdG9yeVQgKkNvbnN1bWVyRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUZpbGVDYWxsYmFja3MgKkNhbGxiYWNrcykKKyAgICAgICAgOiBDb25zdW1lckZhY3RvcnkoQ29uc3VtZXJGYWN0b3J5KSwgQ2FsbGJhY2tzKENhbGxiYWNrcykge30KKworICAgIEZyb250ZW5kQWN0aW9uICpjcmVhdGUoKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gbmV3IENvbnN1bWVyRmFjdG9yeUFkYXB0b3IoQ29uc3VtZXJGYWN0b3J5LCBDYWxsYmFja3MpOworICAgIH0KKworICBwcml2YXRlOgorICAgIGNsYXNzIENvbnN1bWVyRmFjdG9yeUFkYXB0b3IgOiBwdWJsaWMgQVNURnJvbnRlbmRBY3Rpb24geworICAgIHB1YmxpYzoKKyAgICAgIENvbnN1bWVyRmFjdG9yeUFkYXB0b3IoRmFjdG9yeVQgKkNvbnN1bWVyRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlRmlsZUNhbGxiYWNrcyAqQ2FsbGJhY2tzKQorICAgICAgICAgIDogQ29uc3VtZXJGYWN0b3J5KENvbnN1bWVyRmFjdG9yeSksIENhbGxiYWNrcyhDYWxsYmFja3MpIHt9CisKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBU1RDb25zdW1lcj4KKyAgICAgIENyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJiwgU3RyaW5nUmVmKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDb25zdW1lckZhY3RvcnktPm5ld0FTVENvbnN1bWVyKCk7CisgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBib29sIEJlZ2luU291cmNlRmlsZUFjdGlvbihDb21waWxlckluc3RhbmNlICZDSSkgb3ZlcnJpZGUgeworICAgICAgICBpZiAoIUFTVEZyb250ZW5kQWN0aW9uOjpCZWdpblNvdXJjZUZpbGVBY3Rpb24oQ0kpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKENhbGxiYWNrcykKKyAgICAgICAgICByZXR1cm4gQ2FsbGJhY2tzLT5oYW5kbGVCZWdpblNvdXJjZShDSSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICB2b2lkIEVuZFNvdXJjZUZpbGVBY3Rpb24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChDYWxsYmFja3MpCisgICAgICAgICAgQ2FsbGJhY2tzLT5oYW5kbGVFbmRTb3VyY2UoKTsKKyAgICAgICAgQVNURnJvbnRlbmRBY3Rpb246OkVuZFNvdXJjZUZpbGVBY3Rpb24oKTsKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICBGYWN0b3J5VCAqQ29uc3VtZXJGYWN0b3J5OworICAgICAgU291cmNlRmlsZUNhbGxiYWNrcyAqQ2FsbGJhY2tzOworICAgIH07CisgICAgRmFjdG9yeVQgKkNvbnN1bWVyRmFjdG9yeTsKKyAgICBTb3VyY2VGaWxlQ2FsbGJhY2tzICpDYWxsYmFja3M7CisgIH07CisKKyAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxGcm9udGVuZEFjdGlvbkZhY3Rvcnk+KAorICAgICAgbmV3IEZyb250ZW5kQWN0aW9uRmFjdG9yeUFkYXB0ZXIoQ29uc3VtZXJGYWN0b3J5LCBDYWxsYmFja3MpKTsKK30KKworLy8vIFxicmllZiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIFxjIEZpbGUsIGJ5IHByZXBlbmRpbmcgaXQgd2l0aAorLy8vIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpZiBcYyBGaWxlIGlzIG5vdCBhYnNvbHV0ZS4KKy8vLworLy8vIE90aGVyd2lzZSByZXR1cm5zIFxjIEZpbGUuCisvLy8gSWYgJ0ZpbGUnIHN0YXJ0cyB3aXRoICIuLyIsIHRoZSByZXR1cm5lZCBwYXRoIHdpbGwgbm90IGNvbnRhaW4gdGhlICIuLyIuCisvLy8gT3RoZXJ3aXNlLCB0aGUgcmV0dXJuZWQgcGF0aCB3aWxsIGNvbnRhaW4gdGhlIGxpdGVyYWwgcGF0aC1jb25jYXRlbmF0aW9uIG9mCisvLy8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBcYyBGaWxlLgorLy8vCisvLy8gVGhlIGRpZmZlcmVuY2UgdG8gbGx2bTo6c3lzOjpmczo6bWFrZV9hYnNvbHV0ZSBpcyB0aGUgY2Fub25pY2FsaXphdGlvbiB0aGlzCisvLy8gZG9lcyBieSByZW1vdmluZyAiLi8iIGFuZCBjb21wdXRpbmcgbmF0aXZlIHBhdGhzLgorLy8vCisvLy8gXHBhcmFtIEZpbGUgRWl0aGVyIGFuIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGguCitzdGQ6OnN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoU3RyaW5nUmVmIEZpbGUpOworCisvLy8gXGJyaWVmIENoYW5nZXMgQ29tbWFuZExpbmUgdG8gY29udGFpbiBpbXBsaWNpdCBmbGFncyB0aGF0IHdvdWxkIGhhdmUgYmVlbgorLy8vIGRlZmluZWQgaGFkIHRoZSBjb21waWxlciBkcml2ZXIgYmVlbiBpbnZva2VkIHRocm91Z2ggdGhlIHBhdGggSW52b2tlZEFzLgorLy8vCisvLy8gRm9yIGV4YW1wbGUsIHdoZW4gY2FsbGVkIHdpdGggXGMgSW52b2tlZEFzIHNldCB0byBgaTY4Ni1saW51eC1hbmRyb2lkLWcrK2AsCisvLy8gdGhlIGFyZ3VtZW50cyAnLXRhcmdldCcsICdpNjg2LWxpbnV4LWFuZHJvaWRgLCBgLS1kcml2ZXItbW9kZT1nKytgIHdpbGwKKy8vLyBiZSBpbnNlcnRlZCBhZnRlciB0aGUgZmlyc3QgYXJndW1lbnQgaW4gXGMgQ29tbWFuZExpbmUuCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IGFkZCBuZXcgYC10YXJnZXRgIG9yIGAtLWRyaXZlci1tb2RlYCBmbGFncyBpZiB0aGV5CisvLy8gYXJlIGFscmVhZHkgcHJlc2VudCBpbiBgQ29tbWFuZExpbmVgIChldmVuIGlmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgc2V0dGluZ3MKKy8vLyB0aGFuIHdvdWxkIGhhdmUgYmVlbiBpbnNlcnRlZCkuCisvLy8KKy8vLyBccHJlIGBsbHZtOjpJbml0aWFsaXplQWxsVGFyZ2V0cygpYCBoYXMgYmVlbiBjYWxsZWQuCisvLy8KKy8vLyBccGFyYW0gQ29tbWFuZExpbmUgdGhlIGNvbW1hbmQgbGluZSB1c2VkIHRvIGludm9rZSB0aGUgY29tcGlsZXIgZHJpdmVyIG9yCisvLy8gQ2xhbmcgdG9vbCwgaW5jbHVkaW5nIHRoZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlIGFzIFxjIENvbW1hbmRMaW5lWzBdLgorLy8vIFxwYXJhbSBJbnZva2VkQXMgdGhlIHBhdGggdG8gdGhlIGRyaXZlciB1c2VkIHRvIGluZmVyIGltcGxpY2l0IGZsYWdzLgorLy8vCisvLy8gXG5vdGUgVGhpcyB3aWxsIG5vdCBzZXQgXGMgQ29tbWFuZExpbmVbMF0gdG8gXGMgSW52b2tlZEFzLiBUaGUgdG9vbGluZworLy8vIGluZnJhc3RydWN0dXJlIGV4cGVjdHMgdGhhdCBDb21tYW5kTGluZVswXSBpcyBhIHRvb2wgcGF0aCByZWxhdGl2ZSB0byB3aGljaAorLy8vIHRoZSBidWlsdGluIGhlYWRlcnMgY2FuIGJlIGZvdW5kLgordm9pZCBhZGRUYXJnZXRBbmRNb2RlRm9yUHJvZ3JhbU5hbWUoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZDb21tYW5kTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbnZva2VkQXMpOworCisvLy8gXGJyaWVmIENyZWF0ZXMgYSBcYyBDb21waWxlckludm9jYXRpb24uCitDb21waWxlckludm9jYXRpb24gKm5ld0ludm9jYXRpb24oRGlhZ25vc3RpY3NFbmdpbmUgKkRpYWdub3N0aWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ0MxQXJncyk7CisKK30gLy8gbmFtZXNwYWNlIHRvb2xpbmcKKworfSAvLyBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfVE9PTElOR19UT09MSU5HX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db21tb24vQXJncy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvbW1vbi9BcmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5YTZhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db21tb24vQXJncy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vPT09LSBBcmdzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExEX0FSR1NfSAorI2RlZmluZSBMTERfQVJHU19ICisKKyNpbmNsdWRlICJsbGQvQ29tbW9uL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb3B0IHsKK2NsYXNzIElucHV0QXJnTGlzdDsKK30KK30gLy8gbmFtZXNwYWNlIGxsdm0KKworbmFtZXNwYWNlIGxsZCB7CituYW1lc3BhY2UgYXJncyB7CitpbnQgZ2V0SW50ZWdlcihsbHZtOjpvcHQ6OklucHV0QXJnTGlzdCAmQXJncywgdW5zaWduZWQgS2V5LCBpbnQgRGVmYXVsdCk7CitzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IGdldFN0cmluZ3MobGx2bTo6b3B0OjpJbnB1dEFyZ0xpc3QgJkFyZ3MsIGludCBJZCk7CisKK3VpbnQ2NF90IGdldFpPcHRpb25WYWx1ZShsbHZtOjpvcHQ6OklucHV0QXJnTGlzdCAmQXJncywgaW50IElkLCBTdHJpbmdSZWYgS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IERlZmF1bHQpOworCitzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IGdldExpbmVzKE1lbW9yeUJ1ZmZlclJlZiBNQik7Cit9IC8vIG5hbWVzcGFjZSBhcmdzCit9IC8vIG5hbWVzcGFjZSBsbGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29tbW9uL0RyaXZlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvbW1vbi9Ecml2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWVjM2NkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvbW1vbi9Ecml2ZXIuaApAQCAtMCwwICsxLDQzIEBACisvLz09PS0gbGxkL0NvbW1vbi9Ecml2ZXIuaCAtIExpbmtlciBEcml2ZXIgRW11bGF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBMaW5rZXIKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMRF9DT01NT05fRFJJVkVSX0gKKyNkZWZpbmUgTExEX0NPTU1PTl9EUklWRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworbmFtZXNwYWNlIGxsZCB7CituYW1lc3BhY2UgY29mZiB7Citib29sIGxpbmsobGx2bTo6QXJyYXlSZWY8Y29uc3QgY2hhciAqPiBBcmdzLCBib29sIENhbkV4aXRFYXJseSwKKyAgICAgICAgICBsbHZtOjpyYXdfb3N0cmVhbSAmRGlhZyA9IGxsdm06OmVycnMoKSk7Cit9CisKK25hbWVzcGFjZSBtaW5ndyB7Citib29sIGxpbmsobGx2bTo6QXJyYXlSZWY8Y29uc3QgY2hhciAqPiBBcmdzLAorICAgICAgICAgIGxsdm06OnJhd19vc3RyZWFtICZEaWFnID0gbGx2bTo6ZXJycygpKTsKK30KKworbmFtZXNwYWNlIGVsZiB7Citib29sIGxpbmsobGx2bTo6QXJyYXlSZWY8Y29uc3QgY2hhciAqPiBBcmdzLCBib29sIENhbkV4aXRFYXJseSwKKyAgICAgICAgICBsbHZtOjpyYXdfb3N0cmVhbSAmRGlhZyA9IGxsdm06OmVycnMoKSk7Cit9CisKK25hbWVzcGFjZSBtYWNoX28geworYm9vbCBsaW5rKGxsdm06OkFycmF5UmVmPGNvbnN0IGNoYXIgKj4gQXJncywKKyAgICAgICAgICBsbHZtOjpyYXdfb3N0cmVhbSAmRGlhZyA9IGxsdm06OmVycnMoKSk7Cit9CisKK25hbWVzcGFjZSB3YXNtIHsKK2Jvb2wgbGluayhsbHZtOjpBcnJheVJlZjxjb25zdCBjaGFyICo+IEFyZ3MsIGJvb2wgQ2FuRXhpdEVhcmx5LAorICAgICAgICAgIGxsdm06OnJhd19vc3RyZWFtICZEaWFnID0gbGx2bTo6ZXJycygpKTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29tbW9uL0Vycm9ySGFuZGxlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvbW1vbi9FcnJvckhhbmRsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWU2ZjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvbW1vbi9FcnJvckhhbmRsZXIuaApAQCAtMCwwICsxLDExMiBAQAorLy89PT0tIEVycm9ySGFuZGxlci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gTGlua2VyCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJbiBMTEQsIHdlIGhhdmUgdGhyZWUgbGV2ZWxzIG9mIGVycm9yczogZmF0YWwsIGVycm9yIG9yIHdhcm4uCisvLworLy8gRmF0YWwgbWFrZXMgdGhlIHByb2dyYW0gZXhpdCBpbW1lZGlhdGVseSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuCisvLyBZb3Ugc2hvdWxkbid0IHVzZSBpdCBleGNlcHQgZm9yIHJlcG9ydGluZyBhIGNvcnJ1cHRlZCBpbnB1dCBmaWxlLgorLy8KKy8vIEVycm9yIHByaW50cyBvdXQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgaW5jcmVtZW50IGEgZ2xvYmFsIHZhcmlhYmxlCisvLyBFcnJvckNvdW50IHRvIHJlY29yZCB0aGUgZmFjdCB0aGF0IHdlIG1ldCBhbiBlcnJvciBjb25kaXRpb24uIEl0IGRvZXMKKy8vIG5vdCBleGl0LCBzbyBpdCBpcyBzYWZlIGZvciBhIGxsZC1hcy1hLWxpYnJhcnkgdXNlIGNhc2UuIEl0IGlzIGdlbmVyYWxseQorLy8gdXNlZnVsIGJlY2F1c2UgaXQgY2FuIHJlcG9ydCBtb3JlIHRoYW4gb25lIGVycm9yIGluIGEgc2luZ2xlIHJ1bi4KKy8vCisvLyBXYXJuIGRvZXNuJ3QgZG8gYW55dGhpbmcgYnV0IHByaW50aW5nIG91dCBhIGdpdmVuIG1lc3NhZ2UuCisvLworLy8gSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSBsbHZtOjpvdXRzKCkgb3IgbGx2bTo6ZXJycygpIGRpcmVjdGx5CisvLyBpbiBMTEQgYmVjYXVzZSB0aGV5IGFyZSBub3QgdGhyZWFkLXNhZmUuIFRoZSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4KKy8vIHRoaXMgZmlsZSBhcmUgbXV0dWFsbHkgZXhjbHVkZWQsIHNvIHlvdSB3YW50IHRvIHVzZSB0aGVtIGluc3RlYWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTERfQ09NTU9OX0VSUk9SSEFORExFUl9ICisjZGVmaW5lIExMRF9DT01NT05fRVJST1JIQU5ETEVSX0gKKworI2luY2x1ZGUgImxsZC9Db21tb24vTExWTS5oIgorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0ZpbGVPdXRwdXRCdWZmZXIuaCIKKworbmFtZXNwYWNlIGxsZCB7CisKK2NsYXNzIEVycm9ySGFuZGxlciB7CitwdWJsaWM6CisgIHVpbnQ2NF90IEVycm9yQ291bnQgPSAwOworICB1aW50NjRfdCBFcnJvckxpbWl0ID0gMjA7CisgIFN0cmluZ1JlZiBFcnJvckxpbWl0RXhjZWVkZWRNc2cgPSAidG9vIG1hbnkgZXJyb3JzIGVtaXR0ZWQsIHN0b3BwaW5nIG5vdyI7CisgIFN0cmluZ1JlZiBMb2dOYW1lID0gImxsZCI7CisgIGxsdm06OnJhd19vc3RyZWFtICpFcnJvck9TID0gJmxsdm06OmVycnMoKTsKKyAgYm9vbCBDb2xvckRpYWdub3N0aWNzID0gbGx2bTo6ZXJycygpLmhhc19jb2xvcnMoKTsKKyAgYm9vbCBFeGl0RWFybHkgPSB0cnVlOworICBib29sIEZhdGFsV2FybmluZ3MgPSBmYWxzZTsKKyAgYm9vbCBWZXJib3NlID0gZmFsc2U7CisKKyAgdm9pZCBlcnJvcihjb25zdCBUd2luZSAmTXNnKTsKKyAgTExWTV9BVFRSSUJVVEVfTk9SRVRVUk4gdm9pZCBmYXRhbChjb25zdCBUd2luZSAmTXNnKTsKKyAgdm9pZCBsb2coY29uc3QgVHdpbmUgJk1zZyk7CisgIHZvaWQgbWVzc2FnZShjb25zdCBUd2luZSAmTXNnKTsKKyAgdm9pZCB3YXJuKGNvbnN0IFR3aW5lICZNc2cpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpGaWxlT3V0cHV0QnVmZmVyPiBPdXRwdXRCdWZmZXI7CisKK3ByaXZhdGU6CisgIHZvaWQgcHJpbnQoU3RyaW5nUmVmIFMsIHJhd19vc3RyZWFtOjpDb2xvcnMgQyk7Cit9OworCisvLy8gUmV0dXJucyB0aGUgZGVmYXVsdCBlcnJvciBoYW5kbGVyLgorRXJyb3JIYW5kbGVyICZlcnJvckhhbmRsZXIoKTsKKworaW5saW5lIHZvaWQgZXJyb3IoY29uc3QgVHdpbmUgJk1zZykgeyBlcnJvckhhbmRsZXIoKS5lcnJvcihNc2cpOyB9CitpbmxpbmUgTExWTV9BVFRSSUJVVEVfTk9SRVRVUk4gdm9pZCBmYXRhbChjb25zdCBUd2luZSAmTXNnKSB7CisgIGVycm9ySGFuZGxlcigpLmZhdGFsKE1zZyk7Cit9CitpbmxpbmUgdm9pZCBsb2coY29uc3QgVHdpbmUgJk1zZykgeyBlcnJvckhhbmRsZXIoKS5sb2coTXNnKTsgfQoraW5saW5lIHZvaWQgbWVzc2FnZShjb25zdCBUd2luZSAmTXNnKSB7IGVycm9ySGFuZGxlcigpLm1lc3NhZ2UoTXNnKTsgfQoraW5saW5lIHZvaWQgd2Fybihjb25zdCBUd2luZSAmTXNnKSB7IGVycm9ySGFuZGxlcigpLndhcm4oTXNnKTsgfQoraW5saW5lIHVpbnQ2NF90IGVycm9yQ291bnQoKSB7IHJldHVybiBlcnJvckhhbmRsZXIoKS5FcnJvckNvdW50OyB9CisKK0xMVk1fQVRUUklCVVRFX05PUkVUVVJOIHZvaWQgZXhpdExsZChpbnQgVmFsKTsKKworLy8gY2hlY2sgZnVuY3Rpb25zIGFyZSBjb252ZW5pZW50IGZ1bmN0aW9ucyB0byBzdHJpcCBlcnJvcnMKKy8vIGZyb20gZXJyb3Itb3ItdmFsdWUgb2JqZWN0cy4KK3RlbXBsYXRlIDxjbGFzcyBUPiBUIGNoZWNrKEVycm9yT3I8VD4gRSkgeworICBpZiAoYXV0byBFQyA9IEUuZ2V0RXJyb3IoKSkKKyAgICBmYXRhbChFQy5tZXNzYWdlKCkpOworICByZXR1cm4gc3RkOjptb3ZlKCpFKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+IFQgY2hlY2soRXhwZWN0ZWQ8VD4gRSkgeworICBpZiAoIUUpCisgICAgZmF0YWwobGx2bTo6dG9TdHJpbmcoRS50YWtlRXJyb3IoKSkpOworICByZXR1cm4gc3RkOjptb3ZlKCpFKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitUIGNoZWNrMihFcnJvck9yPFQ+IEUsIGxsdm06OmZ1bmN0aW9uX3JlZjxzdGQ6OnN0cmluZygpPiBQcmVmaXgpIHsKKyAgaWYgKGF1dG8gRUMgPSBFLmdldEVycm9yKCkpCisgICAgZmF0YWwoUHJlZml4KCkgKyAiOiAiICsgRUMubWVzc2FnZSgpKTsKKyAgcmV0dXJuIHN0ZDo6bW92ZSgqRSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorVCBjaGVjazIoRXhwZWN0ZWQ8VD4gRSwgbGx2bTo6ZnVuY3Rpb25fcmVmPHN0ZDo6c3RyaW5nKCk+IFByZWZpeCkgeworICBpZiAoIUUpCisgICAgZmF0YWwoUHJlZml4KCkgKyAiOiAiICsgdG9TdHJpbmcoRS50YWtlRXJyb3IoKSkpOworICByZXR1cm4gc3RkOjptb3ZlKCpFKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IFR3aW5lICZTKSB7IHJldHVybiBTLnN0cigpOyB9CisKKy8vIFRvIGV2YWx1YXRlIHRoZSBzZWNvbmQgYXJndW1lbnQgbGF6aWx5LCB3ZSB1c2UgQyBtYWNyby4KKyNkZWZpbmUgQ0hFQ0soRSwgUykgY2hlY2syKEUsIFsmXSB7IHJldHVybiB0b1N0cmluZyhTKTsgfSkKKworfSAvLyBuYW1lc3BhY2UgbGxkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvbW1vbi9MTFZNLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29tbW9uL0xMVk0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWQwZTJiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvbW1vbi9MTFZNLmgKQEAgLTAsMCArMSw4MyBAQAorLy89PT0tLS0gTExWTS5oIC0gSW1wb3J0IHZhcmlvdXMgY29tbW9uIExMVk0gZGF0YXR5cGVzIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZm9yd2FyZCBkZWNsYXJlcyBhbmQgaW1wb3J0cyB2YXJpb3VzIGNvbW1vbiBMTFZNIGRhdGF0eXBlcyB0aGF0CisvLyBsbGQgd2FudHMgdG8gdXNlIHVucXVhbGlmaWVkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExEX0NPTU1PTl9MTFZNX0gKKyNkZWZpbmUgTExEX0NPTU1PTl9MTFZNX0gKKworLy8gVGhpcyBzaG91bGQgYmUgdGhlIG9ubHkgI2luY2x1ZGUsIGZvcmNlICNpbmNsdWRlcyBvZiBhbGwgdGhlIG90aGVycyBvbgorLy8gY2xpZW50cy4KKyNpbmNsdWRlICJsbHZtL0FEVC9IYXNoaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisgIC8vIEFEVCdzLgorICBjbGFzcyBFcnJvcjsKKyAgY2xhc3MgU3RyaW5nUmVmOworICBjbGFzcyBUd2luZTsKKyAgY2xhc3MgTWVtb3J5QnVmZmVyOworICBjbGFzcyBNZW1vcnlCdWZmZXJSZWY7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIEFycmF5UmVmOworICB0ZW1wbGF0ZTx1bnNpZ25lZCBJbnRlcm5hbExlbj4gY2xhc3MgU21hbGxTdHJpbmc7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4+IGNsYXNzIFNtYWxsVmVjdG9yOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBTbWFsbFZlY3RvckltcGw7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgc3RydWN0IFNhdmVBbmRSZXN0b3JlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGNsYXNzIEVycm9yT3I7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgY2xhc3MgRXhwZWN0ZWQ7CisKKyAgY2xhc3MgcmF3X29zdHJlYW07CisgIC8vIFRPRE86IERlbnNlTWFwLCAuLi4KK30KKworbmFtZXNwYWNlIGxsZCB7CisgIC8vIENhc3Rpbmcgb3BlcmF0b3JzLgorICB1c2luZyBsbHZtOjppc2E7CisgIHVzaW5nIGxsdm06OmNhc3Q7CisgIHVzaW5nIGxsdm06OmR5bl9jYXN0OworICB1c2luZyBsbHZtOjpkeW5fY2FzdF9vcl9udWxsOworICB1c2luZyBsbHZtOjpjYXN0X29yX251bGw7CisKKyAgLy8gQURUJ3MuCisgIHVzaW5nIGxsdm06OkVycm9yOworICB1c2luZyBsbHZtOjpTdHJpbmdSZWY7CisgIHVzaW5nIGxsdm06OlR3aW5lOworICB1c2luZyBsbHZtOjpNZW1vcnlCdWZmZXI7CisgIHVzaW5nIGxsdm06Ok1lbW9yeUJ1ZmZlclJlZjsKKyAgdXNpbmcgbGx2bTo6QXJyYXlSZWY7CisgIHVzaW5nIGxsdm06OlNtYWxsU3RyaW5nOworICB1c2luZyBsbHZtOjpTbWFsbFZlY3RvcjsKKyAgdXNpbmcgbGx2bTo6U21hbGxWZWN0b3JJbXBsOworICB1c2luZyBsbHZtOjpTYXZlQW5kUmVzdG9yZTsKKyAgdXNpbmcgbGx2bTo6RXJyb3JPcjsKKyAgdXNpbmcgbGx2bTo6RXhwZWN0ZWQ7CisKKyAgdXNpbmcgbGx2bTo6cmF3X29zdHJlYW07Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGxkLgorCituYW1lc3BhY2Ugc3RkIHsKK3RlbXBsYXRlIDw+IHN0cnVjdCBoYXNoPGxsdm06OlN0cmluZ1JlZj4geworcHVibGljOgorICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBsbHZtOjpTdHJpbmdSZWYgJnMpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6aGFzaF92YWx1ZShzKTsKKyAgfQorfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29tbW9uL01lbW9yeS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvbW1vbi9NZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTlmN2MxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvbW1vbi9NZW1vcnkuaApAQCAtMCwwICsxLDYwIEBACisvLz09PS0gTWVtb3J5LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBMaW5rZXIKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFyZW5hIGFsbG9jYXRvcnMuCisvLworLy8gQWxtb3N0IGFsbCBsYXJnZSBvYmplY3RzLCBzdWNoIGFzIGZpbGVzLCBzZWN0aW9ucyBvciBzeW1ib2xzLCBhcmUKKy8vIHVzZWQgZm9yIHRoZSBlbnRpcmUgbGlmZXRpbWUgb2YgdGhlIGxpbmtlciBvbmNlIHRoZXkgYXJlIGNyZWF0ZWQuCisvLyBUaGlzIHVzYWdlIGNoYXJhY3RlcmlzdGljIG1ha2VzIGFyZW5hIGFsbG9jYXRvciBhbiBhdHRyYWN0aXZlIGNob2ljZQorLy8gd2hlcmUgdGhlIGVudGlyZSBsaW5rZXIgaXMgb25lIGFyZW5hLiBXaXRoIGFuIGFyZW5hLCBuZXdseSBjcmVhdGVkCisvLyBvYmplY3RzIGJlbG9uZyB0byB0aGUgYXJlbmEgYW5kIGZyZWVkIGFsbCBhdCBvbmNlIHdoZW4gZXZlcnl0aGluZyBpcyBkb25lLgorLy8gQXJlbmEgYWxsb2NhdG9ycyBhcmUgZWZmaWNpZW50IGFuZCBlYXN5IHRvIHVuZGVyc3RhbmQuCisvLyBNb3N0IG9iamVjdHMgYXJlIGFsbG9jYXRlZCB1c2luZyB0aGUgYXJlbmEgYWxsb2NhdG9ycyBkZWZpbmVkIGJ5IHRoaXMgZmlsZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMRF9DT01NT05fTUVNT1JZX0gKKyNkZWZpbmUgTExEX0NPTU1PTl9NRU1PUllfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TdHJpbmdTYXZlci5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsZCB7CisKKy8vIFVzZSB0aGlzIGFyZW5hIGlmIHlvdXIgb2JqZWN0IGRvZXNuJ3QgaGF2ZSBhIGRlc3RydWN0b3IuCitleHRlcm4gbGx2bTo6QnVtcFB0ckFsbG9jYXRvciBCQWxsb2M7CitleHRlcm4gbGx2bTo6U3RyaW5nU2F2ZXIgU2F2ZXI7CisKK3ZvaWQgZnJlZUFyZW5hKCk7CisKKy8vIFRoZXNlIHR3byBjbGFzc2VzIGFyZSBoYWNrIHRvIGtlZXAgdHJhY2sgb2YgYWxsCisvLyBTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3IgaW5zdGFuY2VzLgorc3RydWN0IFNwZWNpZmljQWxsb2NCYXNlIHsKKyAgU3BlY2lmaWNBbGxvY0Jhc2UoKSB7IEluc3RhbmNlcy5wdXNoX2JhY2sodGhpcyk7IH0KKyAgdmlydHVhbCB+U3BlY2lmaWNBbGxvY0Jhc2UoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgdm9pZCByZXNldCgpID0gMDsKKyAgc3RhdGljIHN0ZDo6dmVjdG9yPFNwZWNpZmljQWxsb2NCYXNlICo+IEluc3RhbmNlczsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgU3BlY2lmaWNBbGxvYyA6IHB1YmxpYyBTcGVjaWZpY0FsbG9jQmFzZSB7CisgIHZvaWQgcmVzZXQoKSBvdmVycmlkZSB7IEFsbG9jLkRlc3Ryb3lBbGwoKTsgfQorICBsbHZtOjpTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3I8VD4gQWxsb2M7Cit9OworCisvLyBVc2UgdGhpcyBhcmVuYSBpZiB5b3VyIG9iamVjdCBoYXMgYSBkZXN0cnVjdG9yLgorLy8gWW91ciBkZXN0cnVjdG9yIHdpbGwgYmUgaW52b2tlZCBmcm9tIGZyZWVBcmVuYSgpLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFU+IFQgKm1ha2UoVSAmJi4uLiBBcmdzKSB7CisgIHN0YXRpYyBTcGVjaWZpY0FsbG9jPFQ+IEFsbG9jOworICByZXR1cm4gbmV3IChBbGxvYy5BbGxvYy5BbGxvY2F0ZSgpKSBUKHN0ZDo6Zm9yd2FyZDxVPihBcmdzKS4uLik7Cit9CisKK30gLy8gbmFtZXNwYWNlIGxsZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db21tb24vUmVwcm9kdWNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29tbW9uL1JlcHJvZHVjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNDI1ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29tbW9uL1JlcHJvZHVjZS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8vPT09LSBSZXByb2R1Y2UuaCAtIFV0aWxpdGllcyBmb3IgY3JlYXRpbmcgcmVwcm9kdWNlcnMgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExEX0NPTU1PTl9SRVBST0RVQ0VfSAorI2RlZmluZSBMTERfQ09NTU9OX1JFUFJPRFVDRV9ICisKKyNpbmNsdWRlICJsbGQvQ29tbW9uL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9wdCB7IGNsYXNzIEFyZzsgfQorfQorCituYW1lc3BhY2UgbGxkIHsKKworLy8gTWFrZXMgYSBnaXZlbiBwYXRobmFtZSBhbiBhYnNvbHV0ZSBwYXRoIGZpcnN0LCBhbmQgdGhlbiByZW1vdmUKKy8vIGJlZ2lubmluZyAvLiBGb3IgZXhhbXBsZSwgIi4uL2Zvby5vIiBpcyBjb252ZXJ0ZWQgdG8gImhvbWUvam9obi9mb28ubyIsCisvLyBhc3N1bWluZyB0aGF0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyAiL2hvbWUvam9obi9iYXIiLgorc3RkOjpzdHJpbmcgcmVsYXRpdmVUb1Jvb3QoU3RyaW5nUmVmIFBhdGgpOworCisvLyBRdW90ZSBhIGdpdmVuIHN0cmluZyBpZiBpdCBjb250YWlucyBhIHNwYWNlIGNoYXJhY3Rlci4KK3N0ZDo6c3RyaW5nIHF1b3RlKFN0cmluZ1JlZiBTKTsKKworLy8gUmV3cml0ZSB0aGUgZ2l2ZW4gcGF0aCBpZiBhIGZpbGUgZXhpc3RzIHdpdGggdGhhdCBwYXRobmFtZSwgb3RoZXJ3aXNlCisvLyByZXR1cm5zIHRoZSBvcmlnaW5hbCBwYXRoLgorc3RkOjpzdHJpbmcgcmV3cml0ZVBhdGgoU3RyaW5nUmVmIFMpOworCisvLyBSZXR1cm5zIHRoZSBzdHJpbmcgZm9ybSBvZiB0aGUgZ2l2ZW4gYXJndW1lbnQuCitzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBsbHZtOjpvcHQ6OkFyZyAmQXJnKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29tbW9uL1N0cmluZ3MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db21tb24vU3RyaW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZTVlYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29tbW9uL1N0cmluZ3MuaApAQCAtMCwwICsxLDc2IEBACisvLz09PS0gU3RyaW5ncy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBMaW5rZXIKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMRF9TVFJJTkdTX0gKKyNkZWZpbmUgTExEX1NUUklOR1NfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9HbG9iUGF0dGVybi5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbGQgeworLy8gUmV0dXJucyBhIGRlbWFuZ2xlZCBDKysgc3ltYm9sIG5hbWUuIElmIE5hbWUgaXMgbm90IGEgbWFuZ2xlZAorLy8gbmFtZSwgaXQgcmV0dXJucyBPcHRpb25hbDo6Tm9uZS4KK2xsdm06Ok9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBkZW1hbmdsZUl0YW5pdW0obGx2bTo6U3RyaW5nUmVmIE5hbWUpOworbGx2bTo6T3B0aW9uYWw8c3RkOjpzdHJpbmc+IGRlbWFuZ2xlTVNWQyhsbHZtOjpTdHJpbmdSZWYgUyk7CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhcnNlSGV4KGxsdm06OlN0cmluZ1JlZiBTKTsKK2Jvb2wgaXNWYWxpZENJZGVudGlmaWVyKGxsdm06OlN0cmluZ1JlZiBTKTsKKworLy8gVGhpcyBpcyBhIGxhenkgdmVyc2lvbiBvZiBTdHJpbmdSZWYuIFN0cmluZyBzaXplIGlzIGNvbXB1dGVkIGxhemlseQorLy8gd2hlbiBpdCBpcyBuZWVkZWQuIEl0IGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gU3RyaW5nUmVmIHRvIGluc3RhbnRpYXRlCisvLyBpZiB5b3UgaGF2ZSBhIHN0cmluZyB3aG9zZSBzaXplIGlzIHVua25vd24uCisvLworLy8gQ09GRiBhbmQgRUxGIHN0cmluZyB0YWJsZXMgY29udGFpbiBhIGxvdCBvZiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5ncy4KKy8vIE1vc3Qgb2YgdGhlbSBhcmUgbm90IG5lY2Vzc2FyeSBmb3IgdGhlIGxpbmtlciBiZWNhdXNlIHRoZXkgYXJlIG5hbWVzCisvLyBvZiBsb2NhbCBzeW1ib2xzIGFuZCB0aGUgbGlua2VyIGRvZXNuJ3QgdXNlIGxvY2FsIHN5bWJvbCBuYW1lcyBmb3IKKy8vIG5hbWUgcmVzb2x1dGlvbi4gU28sIHdlIHVzZSB0aGlzIGNsYXNzIHRvIHJlcHJlc2VudHMgc3RyaW5ncyByZWFkCisvLyBmcm9tIHN0cmluZyB0YWJsZXMuCitjbGFzcyBTdHJpbmdSZWZaIHsKK3B1YmxpYzoKKyAgU3RyaW5nUmVmWigpIDogU3RhcnQobnVsbHB0ciksIFNpemUoMCkge30KKyAgU3RyaW5nUmVmWihjb25zdCBjaGFyICpTLCBzaXplX3QgU2l6ZSkgOiBTdGFydChTKSwgU2l6ZShTaXplKSB7fQorCisgIC8qaW1wbGljaXQqLyBTdHJpbmdSZWZaKGNvbnN0IGNoYXIgKlMpIDogU3RhcnQoUyksIFNpemUoLTEpIHt9CisKKyAgLyppbXBsaWNpdCovIFN0cmluZ1JlZloobGx2bTo6U3RyaW5nUmVmIFMpCisgICAgICA6IFN0YXJ0KFMuZGF0YSgpKSwgU2l6ZShTLnNpemUoKSkge30KKworICBvcGVyYXRvciBsbHZtOjpTdHJpbmdSZWYoKSBjb25zdCB7CisgICAgaWYgKFNpemUgPT0gKHNpemVfdCktMSkKKyAgICAgIFNpemUgPSBzdHJsZW4oU3RhcnQpOworICAgIHJldHVybiB7U3RhcnQsIFNpemV9OworICB9CisKK3ByaXZhdGU6CisgIGNvbnN0IGNoYXIgKlN0YXJ0OworICBtdXRhYmxlIHNpemVfdCBTaXplOworfTsKKworLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIG11bHRpcGxlIGdsb2IgcGF0dGVybnMuCitjbGFzcyBTdHJpbmdNYXRjaGVyIHsKK3B1YmxpYzoKKyAgU3RyaW5nTWF0Y2hlcigpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgU3RyaW5nTWF0Y2hlcihsbHZtOjpBcnJheVJlZjxsbHZtOjpTdHJpbmdSZWY+IFBhdCk7CisKKyAgYm9vbCBtYXRjaChsbHZtOjpTdHJpbmdSZWYgUykgY29uc3Q7CisKK3ByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPGxsdm06Okdsb2JQYXR0ZXJuPiBQYXR0ZXJuczsKK307CisKK2lubGluZSBsbHZtOjpBcnJheVJlZjx1aW50OF90PiB0b0FycmF5UmVmKGxsdm06OlN0cmluZ1JlZiBTKSB7CisgIHJldHVybiB7cmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KFMuZGF0YSgpKSwgUy5zaXplKCl9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db21tb24vVGFyZ2V0T3B0aW9uc0NvbW1hbmRGbGFncy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvbW1vbi9UYXJnZXRPcHRpb25zQ29tbWFuZEZsYWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ0M2IxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db21tb24vVGFyZ2V0T3B0aW9uc0NvbW1hbmRGbGFncy5oCkBAIC0wLDAgKzEsMjIgQEAKKy8vPT09LS0gVGFyZ2V0T3B0aW9uc0NvbW1hbmRGbGFncy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBIZWxwZXIgdG8gY3JlYXRlIFRhcmdldE9wdGlvbnMgZnJvbSBjb21tYW5kIGxpbmUgZmxhZ3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvZGVHZW4uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisKK25hbWVzcGFjZSBsbGQgeworbGx2bTo6VGFyZ2V0T3B0aW9ucyBJbml0VGFyZ2V0T3B0aW9uc0Zyb21Db2RlR2VuRmxhZ3MoKTsKK2xsdm06Ok9wdGlvbmFsPGxsdm06OkNvZGVNb2RlbDo6TW9kZWw+IEdldENvZGVNb2RlbEZyb21DTU1vZGVsKCk7CitzdGQ6OnN0cmluZyBHZXRDUFVTdHIoKTsKK30KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db21tb24vVGhyZWFkcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvbW1vbi9UaHJlYWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU0NTkwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db21tb24vVGhyZWFkcy5oCkBAIC0wLDAgKzEsODYgQEAKKy8vPT09LSBUaHJlYWRzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTExEIHN1cHBvcnRzIHRocmVhZHMgdG8gZGlzdHJpYnV0ZSB3b3JrbG9hZHMgdG8gbXVsdGlwbGUgY29yZXMuIFVzaW5nCisvLyBtdWx0aWNvcmUgaXMgbW9zdCBlZmZlY3RpdmUgd2hlbiBtb3JlIHRoYW4gb25lIGNvcmUgYXJlIGlkbGUuIEF0IHRoZQorLy8gbGFzdCBzdGVwIG9mIGEgYnVpbGQsIGl0IGlzIG9mdGVuIHRoZSBjYXNlIHRoYXQgYSBsaW5rZXIgaXMgdGhlIG9ubHkKKy8vIGFjdGl2ZSBwcm9jZXNzIG9uIGEgY29tcHV0ZXIuIFNvLCB3ZSBhcmUgbmF0dXJhbGx5IGludGVyZXN0ZWQgaW4gdXNpbmcKKy8vIHRocmVhZHMgd2lzZWx5IHRvIHJlZHVjZSBsYXRlbmN5IHRvIGRlbGl2ZXIgcmVzdWx0cyB0byB1c2Vycy4KKy8vCisvLyBUaGF0IHNhaWQsIHdlIGRvbid0IHdhbnQgdG8gZG8gInRvbyBjbGV2ZXIiIHRoaW5ncyB1c2luZyB0aHJlYWRzLgorLy8gQ29tcGxleCBtdWx0aS10aHJlYWRlZCBhbGdvcml0aG1zIGFyZSBzb21ldGltZXMgZXh0cmVtZWx5IGhhcmQgdG8KKy8vIHJlYXNvbiBhYm91dCBhbmQgY2FuIGVhc2lseSBtZXNzIHVwIHRoZSBlbnRpcmUgZGVzaWduLgorLy8KKy8vIEZvcnR1bmF0ZWx5LCB3aGVuIGEgbGlua2VyIGxpbmtzIGxhcmdlIHByb2dyYW1zICh3aGVuIHRoZSBsaW5rIHRpbWUgaXMKKy8vIG1vc3QgY3JpdGljYWwpLCBpdCBzcGVuZHMgbW9zdCBvZiB0aGUgdGltZSB0byB3b3JrIG9uIG1hc3NpdmUgbnVtYmVyIG9mCisvLyBzbWFsbCBwaWVjZXMgb2YgZGF0YSBvZiB0aGUgc2FtZSBraW5kLCBhbmQgdGhlcmUgYXJlIG9wcG9ydHVuaXRpZXMgZm9yCisvLyBsYXJnZSBwYXJhbGxlbGlzbSB0aGVyZS4gSGVyZSBhcmUgZXhhbXBsZXM6CisvLworLy8gIC0gV2UgaGF2ZSBodW5kcmVkcyBvZiB0aG91c2FuZHMgb2YgaW5wdXQgc2VjdGlvbnMgdGhhdCBuZWVkIHRvIGJlCisvLyAgICBjb3BpZWQgdG8gYSByZXN1bHQgZmlsZSBhdCB0aGUgbGFzdCBzdGVwIG9mIGxpbmsuIE9uY2Ugd2UgZml4IGEgZmlsZQorLy8gICAgbGF5b3V0LCBlYWNoIHNlY3Rpb24gY2FuIGJlIGNvcGllZCB0byBpdHMgZGVzdGluYXRpb24gYW5kIGl0cworLy8gICAgcmVsb2NhdGlvbnMgY2FuIGJlIGFwcGxpZWQgaW5kZXBlbmRlbnRseS4KKy8vCisvLyAgLSBXZSBoYXZlIHRlbnMgb2YgbWlsbGlvbnMgb2Ygc21hbGwgc3RyaW5ncyB3aGVuIGNvbnN0cnVjdGluZyBhCisvLyAgICBtZXJnZWFibGUgc3RyaW5nIHNlY3Rpb24uCisvLworLy8gRm9yIHRoZSBjYXNlcyBzdWNoIGFzIHRoZSBmb3JtZXIsIHdlIGNhbiBqdXN0IHVzZSBwYXJhbGxlbEZvckVhY2gKKy8vIGluc3RlYWQgb2Ygc3RkOjpmb3JfZWFjaCAob3IgYSBwbGFpbiBmb3IgbG9vcCkuIEJlY2F1c2UgdGFza3MgYXJlCisvLyBjb21wbGV0ZWx5IGluZGVwZW5kZW50IGZyb20gZWFjaCBvdGhlciwgd2UgY2FuIHJ1biB0aGVtIGluIHBhcmFsbGVsCisvLyB3aXRob3V0IGFueSBjb29yZGluYXRpb24gYmV0d2VlbiB0aGVtLiBUaGF0J3MgdmVyeSBlYXN5IHRvIHVuZGVyc3RhbmQKKy8vIGFuZCByZWFzb24gYWJvdXQuCisvLworLy8gRm9yIHRoZSBjYXNlcyBzdWNoIGFzIHRoZSBsYXR0ZXIsIHdlIGNhbiB1c2UgcGFyYWxsZWwgYWxnb3JpdGhtcyB0bworLy8gZGVhbCB3aXRoIG1hc3NpdmUgZGF0YS4gV2UgaGF2ZSB0byB3cml0ZSBjb2RlIGZvciBhIHRhaWxvcmVkIGFsZ29yaXRobQorLy8gZm9yIGVhY2ggcHJvYmxlbSwgYnV0IHRoZSBjb21wbGV4aXR5IG9mIG11bHRpLXRocmVhZGluZyBpcyBpc29sYXRlZCBpbgorLy8gYSBzaW5nbGUgcGFzcyBhbmQgZG9lc24ndCBhZmZlY3QgdGhlIGxpbmtlcidzIG92ZXJhbGwgZGVzaWduLgorLy8KKy8vIFRoZSBhYm92ZSBhcHByb2FjaCBzZWVtcyB0byBiZSB3b3JraW5nIGZhaXJseSB3ZWxsLiBBcyBhbiBleGFtcGxlLCB3aGVuCisvLyBsaW5raW5nIENocm9taXVtIChvdXRwdXQgc2l6ZSAxLjYgR0IpLCB1c2luZyA0IGNvcmVzIHJlZHVjZXMgbGF0ZW5jeSB0bworLy8gNzUlIGNvbXBhcmVkIHRvIHNpbmdsZSBjb3JlIChmcm9tIDEyLjY2IHNlY29uZHMgdG8gOS41NSBzZWNvbmRzKSBvbiBteQorLy8gSXZ5IEJyaWRnZSBYZW9uIDIuOCBHSHogbWFjaGluZS4gVXNpbmcgNDAgY29yZXMgcmVkdWNlcyBpdCB0byA2MyUgKGZyb20KKy8vIDEyLjY2IHNlY29uZHMgdG8gNy45NSBzZWNvbmRzKS4gQmVjYXVzZSBvZiB0aGUgQW1kYWhsJ3MgbGF3LCB0aGUKKy8vIHNwZWVkdXAgaXMgbm90IGxpbmVhciwgYnV0IGFzIHlvdSBhZGQgbW9yZSBjb3JlcywgaXQgZ2V0cyBmYXN0ZXIuCisvLworLy8gT24gYSBmaW5hbCBub3RlLCBpZiB5b3UgYXJlIHRyeWluZyB0byBvcHRpbWl6ZSwga2VlcCB0aGUgYXhpb20gImRvbid0CisvLyBndWVzcywgbWVhc3VyZSEiIGluIG1pbmQuIFNvbWUgaW1wb3J0YW50IHBhc3NlcyBvZiB0aGUgbGlua2VyIGFyZSBub3QKKy8vIHRoYXQgc2xvdy4gRm9yIGV4YW1wbGUsIHJlc29sdmluZyBhbGwgc3ltYm9scyBpcyBub3QgYSB2ZXJ5IGhlYXZ5IHBhc3MsCisvLyBhbHRob3VnaCBpdCB3b3VsZCBiZSB2ZXJ5IGhhcmQgdG8gcGFyYWxsZWxpemUgaXQuIFlvdSB3YW50IHRvIGZpcnN0CisvLyBpZGVudGlmeSBhIHNsb3cgcGFzcyBhbmQgdGhlbiBvcHRpbWl6ZSBpdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMRF9DT01NT05fVEhSRUFEU19ICisjZGVmaW5lIExMRF9DT01NT05fVEhSRUFEU19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGFyYWxsZWwuaCIKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgbGxkIHsKKworZXh0ZXJuIGJvb2wgVGhyZWFkc0VuYWJsZWQ7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCBjbGFzcyBGdW5jVHk+IHZvaWQgcGFyYWxsZWxGb3JFYWNoKFIgJiZSYW5nZSwgRnVuY1R5IEZuKSB7CisgIGlmIChUaHJlYWRzRW5hYmxlZCkKKyAgICBmb3JfZWFjaChsbHZtOjpwYXJhbGxlbDo6cGFyLCBzdGQ6OmJlZ2luKFJhbmdlKSwgc3RkOjplbmQoUmFuZ2UpLCBGbik7CisgIGVsc2UKKyAgICBmb3JfZWFjaChsbHZtOjpwYXJhbGxlbDo6c2VxLCBzdGQ6OmJlZ2luKFJhbmdlKSwgc3RkOjplbmQoUmFuZ2UpLCBGbik7Cit9CisKK2lubGluZSB2b2lkIHBhcmFsbGVsRm9yRWFjaE4oc2l6ZV90IEJlZ2luLCBzaXplX3QgRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc2l6ZV90KT4gRm4pIHsKKyAgaWYgKFRocmVhZHNFbmFibGVkKQorICAgIGZvcl9lYWNoX24obGx2bTo6cGFyYWxsZWw6OnBhciwgQmVnaW4sIEVuZCwgRm4pOworICBlbHNlCisgICAgZm9yX2VhY2hfbihsbHZtOjpwYXJhbGxlbDo6c2VxLCBCZWdpbiwgRW5kLCBGbik7Cit9CisKK30gLy8gbmFtZXNwYWNlIGxsZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db21tb24vVGltZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db21tb24vVGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjU0YWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvbW1vbi9UaW1lci5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vPT09LSBUaW1lci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gTGlua2VyCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTERfQ09NTU9OX1RJTUVSX0gKKyNkZWZpbmUgTExEX0NPTU1PTl9USU1FUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGxkIHsKKworY2xhc3MgVGltZXI7CisKK3N0cnVjdCBTY29wZWRUaW1lciB7CisgIGV4cGxpY2l0IFNjb3BlZFRpbWVyKFRpbWVyICZUKTsKKworICB+U2NvcGVkVGltZXIoKTsKKworICB2b2lkIHN0b3AoKTsKKworICBUaW1lciAqVCA9IG51bGxwdHI7Cit9OworCitjbGFzcyBUaW1lciB7CitwdWJsaWM6CisgIFRpbWVyKGxsdm06OlN0cmluZ1JlZiBOYW1lLCBUaW1lciAmUGFyZW50KTsKKworICBzdGF0aWMgVGltZXIgJnJvb3QoKTsKKworICB2b2lkIHN0YXJ0KCk7CisgIHZvaWQgc3RvcCgpOworICB2b2lkIHByaW50KCk7CisKKyAgZG91YmxlIG1pbGxpcygpIGNvbnN0OworCitwcml2YXRlOgorICBleHBsaWNpdCBUaW1lcihsbHZtOjpTdHJpbmdSZWYgTmFtZSk7CisgIHZvaWQgcHJpbnQoaW50IERlcHRoLCBkb3VibGUgVG90YWxEdXJhdGlvbiwgYm9vbCBSZWN1cnNlID0gdHJ1ZSkgY29uc3Q7CisKKyAgc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jaz4gU3RhcnRUaW1lOworICBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMgVG90YWw7CisgIHN0ZDo6dmVjdG9yPFRpbWVyICo+IENoaWxkcmVuOworICBzdGQ6OnN0cmluZyBOYW1lOworICBUaW1lciAqUGFyZW50OworfTsKKworfSAvLyBuYW1lc3BhY2UgbGxkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvbW1vbi9WZXJzaW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29tbW9uL1ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2RlNzdkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvbW1vbi9WZXJzaW9uLmgKQEAgLTAsMCArMSwyNSBAQAorLy89PT0tIGxsZC9Db21tb24vVmVyc2lvbi5oIC0gTExEIFZlcnNpb24gTnVtYmVyIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZWZpbmVzIGEgdmVyc2lvbi1yZWxhdGVkIHV0aWxpdHkgZnVuY3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTERfVkVSU0lPTl9ICisjZGVmaW5lIExMRF9WRVJTSU9OX0gKKworI2luY2x1ZGUgImxsZC9Db21tb24vVmVyc2lvbi5pbmMiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisKK25hbWVzcGFjZSBsbGQgeworLy8vIFxicmllZiBSZXRyaWV2ZXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb21wbGV0ZSBsbGQgdmVyc2lvbi4KK3N0ZDo6c3RyaW5nIGdldExMRFZlcnNpb24oKTsKK30KKworI2VuZGlmIC8vIExMRF9WRVJTSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL0Fic29sdXRlQXRvbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvQWJzb2x1dGVBdG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyNTI5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL0Fic29sdXRlQXRvbS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vPT09LSBDb3JlL0Fic29sdXRlQXRvbS5oIC0gQW4gYWJzb2x1dGUgQXRvbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExEX0NPUkVfQUJTT0xVVEVfQVRPTV9ICisjZGVmaW5lIExMRF9DT1JFX0FCU09MVVRFX0FUT01fSAorCisjaW5jbHVkZSAibGxkL0NvcmUvQXRvbS5oIgorCituYW1lc3BhY2UgbGxkIHsKKworLy8vIEFuIEFic29sdXRlQXRvbSBoYXMgbm8gY29udGVudC4KKy8vLyBJdCBleGlzdHMgdG8gcmVwcmVzZW50IGNvbnRlbnQgYXQgZml4ZWQgYWRkcmVzc2VzIGluIG1lbW9yeS4KK2NsYXNzIEFic29sdXRlQXRvbSA6IHB1YmxpYyBBdG9tIHsKK3B1YmxpYzoKKworICB2aXJ0dWFsIHVpbnQ2NF90IHZhbHVlKCkgY29uc3QgPSAwOworCisgIC8vLyBzY29wZSAtIFRoZSB2aXNpYmlsaXR5IG9mIHRoaXMgYXRvbSB0byBvdGhlciBhdG9tcy4gIEMgc3RhdGljIGZ1bmN0aW9ucworICAvLy8gaGF2ZSBzY29wZSBzY29wZVRyYW5zbGF0aW9uVW5pdC4gIFJlZ3VsYXIgQyBmdW5jdGlvbnMgaGF2ZSBzY29wZQorICAvLy8gc2NvcGVHbG9iYWwuICBGdW5jdGlvbnMgY29tcGlsZWQgd2l0aCB2aXNpYmlsaXR5PWhpZGRlbiBoYXZlIHNjb3BlCisgIC8vLyBzY29wZUxpbmthZ2VVbml0IHNvIHRoZXkgY2FuIGJlIHNlZSBieSBvdGhlciBhdG9tcyBiZWluZyBsaW5rZWQgYnV0IG5vdAorICAvLy8gYnkgdGhlIE9TIGxvYWRlci4KKyAgdmlydHVhbCBTY29wZSBzY29wZSgpIGNvbnN0ID0gMDsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0b20gKmEpIHsKKyAgICByZXR1cm4gYS0+ZGVmaW5pdGlvbigpID09IGRlZmluaXRpb25BYnNvbHV0ZTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQWJzb2x1dGVBdG9tICopIHsgcmV0dXJuIHRydWU7IH0KKworcHJvdGVjdGVkOgorICBBYnNvbHV0ZUF0b20oKSA6IEF0b20oZGVmaW5pdGlvbkFic29sdXRlKSB7fQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGxkCisKKyNlbmRpZiAvLyBMTERfQ09SRV9BQlNPTFVURV9BVE9NX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL0FyY2hpdmVMaWJyYXJ5RmlsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvQXJjaGl2ZUxpYnJhcnlGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM3MzZlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL0FyY2hpdmVMaWJyYXJ5RmlsZS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vPT09LSBDb3JlL0FyY2hpdmVMaWJyYXJ5RmlsZS5oIC0gTW9kZWxzIHN0YXRpYyBsaWJyYXJ5IC0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExEX0NPUkVfQVJDSElWRV9MSUJSQVJZX0ZJTEVfSAorI2RlZmluZSBMTERfQ09SRV9BUkNISVZFX0xJQlJBUllfRklMRV9ICisKKyNpbmNsdWRlICJsbGQvQ29yZS9GaWxlLmgiCisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgbGxkIHsKKworLy8vCisvLy8gVGhlIEFyY2hpdmVMaWJyYXJ5RmlsZSBzdWJjbGFzcyBvZiBGaWxlIGlzIHVzZWQgdG8gcmVwcmVzZW50IHVuaXgKKy8vLyBzdGF0aWMgbGlicmFyeSBhcmNoaXZlcy4gIFRoZXNlIGxpYnJhcmllcyBwcm92aWRlIG5vIGF0b21zIHRvIHRoZQorLy8vIGluaXRpYWwgc2V0IG9mIGF0b21zIGxpbmtlZC4gIEluc3RlYWQsIHdoZW4gdGhlIFJlc29sdmVyIHdpbGwgcXVlcnkKKy8vLyBBcmNoaXZlTGlicmFyeUZpbGUgaW5zdGFuY2VzIGZvciBzcGVjaWZpYyBzeW1ib2xzIG5hbWVzIHVzaW5nIHRoZQorLy8vIGZpbmQoKSBtZXRob2QuICBJZiB0aGUgYXJjaGl2ZSBjb250YWlucyBhbiBvYmplY3QgZmlsZSB3aGljaCBoYXMgYQorLy8vIERlZmluZWRBdG9tIHdob3NlIHNjb3BlIGlzIG5vdCB0cmFuc2xhdGlvblVuaXQsIHRoZW4gdGhhdCBlbnRpcmUKKy8vLyBvYmplY3QgZmlsZSBGaWxlIGlzIHJldHVybmVkLgorLy8vCitjbGFzcyBBcmNoaXZlTGlicmFyeUZpbGUgOiBwdWJsaWMgRmlsZSB7CitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRmlsZSAqZikgeworICAgIHJldHVybiBmLT5raW5kKCkgPT0ga2luZEFyY2hpdmVMaWJyYXJ5OworICB9CisKKyAgLy8vIENoZWNrIGlmIGFueSBtZW1iZXIgb2YgdGhlIGFyY2hpdmUgY29udGFpbnMgYW4gQXRvbSB3aXRoIHRoZQorICAvLy8gc3BlY2lmaWVkIG5hbWUgYW5kIHJldHVybiB0aGUgRmlsZSBvYmplY3QgZm9yIHRoYXQgbWVtYmVyLCBvciBudWxscHRyLgorICB2aXJ0dWFsIEZpbGUgKmZpbmQoU3RyaW5nUmVmIG5hbWUpID0gMDsKKworICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZQorICBwYXJzZUFsbE1lbWJlcnMoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEZpbGU+PiAmcmVzdWx0KSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgLy8vIG9ubHkgc3ViY2xhc3NlcyBvZiBBcmNoaXZlTGlicmFyeUZpbGUgY2FuIGJlIGluc3RhbnRpYXRlZAorICBBcmNoaXZlTGlicmFyeUZpbGUoU3RyaW5nUmVmIHBhdGgpIDogRmlsZShwYXRoLCBraW5kQXJjaGl2ZUxpYnJhcnkpIHt9Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbGQKKworI2VuZGlmIC8vIExMRF9DT1JFX0FSQ0hJVkVfTElCUkFSWV9GSUxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL0F0b20uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL0F0b20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDljM2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvQXRvbS5oCkBAIC0wLDAgKzEsMTMxIEBACisvLz09PS0gQ29yZS9BdG9tLmggLSBBIG5vZGUgaW4gbGlua2luZyBncmFwaCAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBMaW5rZXIKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMRF9DT1JFX0FUT01fSAorI2RlZmluZSBMTERfQ09SRV9BVE9NX0gKKworI2luY2x1ZGUgImxsZC9Db21tb24vTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorCituYW1lc3BhY2UgbGxkIHsKKworY2xhc3MgRmlsZTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIE93bmluZ0F0b21QdHI7CisKKy8vLworLy8vIFRoZSBsaW5rZXIgaGFzIGEgR3JhcGggVGhlb3J5IG1vZGVsIG9mIGxpbmtpbmcuIEFuIG9iamVjdCBmaWxlIGlzIHNlZW4KKy8vLyBhcyBhIHNldCBvZiBBdG9tcyB3aXRoIFJlZmVyZW5jZXMgdG8gb3RoZXIgQXRvbXMuICBFYWNoIEF0b20gaXMgYSBub2RlCisvLy8gYW5kIGVhY2ggUmVmZXJlbmNlIGlzIGFuIGVkZ2UuIEFuIEF0b20gY2FuIGJlIGEgRGVmaW5lZEF0b20gd2hpY2ggaGFzCisvLy8gY29udGVudCBvciBhIFVuZGVmaW5lZEF0b20gd2hpY2ggaXMgYSBwbGFjZWhvbGRlciBhbmQgcmVwcmVzZW50cyBhbgorLy8vIHVuZGVmaW5lZCBzeW1ib2wgKGV4dGVybiBkZWNsYXJhdGlvbikuCisvLy8KK2NsYXNzIEF0b20geworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgT3duaW5nQXRvbVB0cjsKKworcHVibGljOgorICAvLy8gV2hldGhlciB0aGlzIGF0b20gaXMgZGVmaW5lZCBvciBhIHByb3h5IGZvciBhbiB1bmRlZmluZWQgc3ltYm9sCisgIGVudW0gRGVmaW5pdGlvbiB7CisgICAgZGVmaW5pdGlvblJlZ3VsYXIsICAgICAgLy8vPCBOb3JtYWwgQy9DKysgZnVuY3Rpb24gb3IgZ2xvYmFsIHZhcmlhYmxlLgorICAgIGRlZmluaXRpb25BYnNvbHV0ZSwgICAgIC8vLzwgQXNtLW9ubHkgKGZvbyA9IDEwKS4gTm90IHRpZWQgdG8gYW55IGNvbnRlbnQuCisgICAgZGVmaW5pdGlvblVuZGVmaW5lZCwgICAgLy8vPCBPbmx5IGluIC5vIGZpbGVzIHRvIG1vZGVsIHJlZmVyZW5jZSB0byB1bmRlZi4KKyAgICBkZWZpbml0aW9uU2hhcmVkTGlicmFyeSAvLy88IE9ubHkgaW4gc2hhcmVkIGxpYnJhcmllcyB0byBtb2RlbCBleHBvcnQuCisgIH07CisKKyAgLy8vIFRoZSBzY29wZSBpbiB3aGljaCB0aGlzIGF0b20gaXMgYWNlc3NpYmxlIHRvIG90aGVyIGF0b21zLgorICBlbnVtIFNjb3BlIHsKKyAgICBzY29wZVRyYW5zbGF0aW9uVW5pdCwgIC8vLzwgQWNjZXNzaWJsZSBvbmx5IHRvIGF0b21zIGluIHRoZSBzYW1lIHRyYW5zbGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gIHVuaXQgKGUuZy4gYSBDIHN0YXRpYykuCisgICAgc2NvcGVMaW5rYWdlVW5pdCwgICAgICAvLy88IEFjY2Vzc2libGUgdG8gYXRvbXMgYmVpbmcgbGlua2VkIGJ1dCBub3QgdmlzaWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vICB0byBydW50aW1lIGxvYWRlciAoZS5nLiB2aXNpYmlsaXR5PWhpZGRlbikuCisgICAgc2NvcGVHbG9iYWwgICAgICAgICAgICAvLy88IEFjY2Vzc2libGUgdG8gYWxsIGF0b21zIGFuZCB2aXNpYmxlIHRvIHJ1bnRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyAgbG9hZGVyIChlLmcuIHZpc2liaWxpdHk9ZGVmYXVsdCkuCisgIH07CisKKyAgLy8vIGZpbGUgLSByZXR1cm5zIHRoZSBGaWxlIHRoYXQgcHJvZHVjZWQvb3ducyB0aGlzIEF0b20KKyAgdmlydHVhbCBjb25zdCBGaWxlJiBmaWxlKCkgY29uc3QgPSAwOworCisgIC8vLyBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGF0b20uIEZvciBhIGZ1bmN0aW9uIGF0b20sIGl0IGlzIHRoZSAobWFuZ2xlZCkKKyAgLy8vIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLgorICB2aXJ0dWFsIFN0cmluZ1JlZiBuYW1lKCkgY29uc3QgPSAwOworCisgIC8vLyBkZWZpbml0aW9uIC0gV2hldGhlciB0aGlzIGF0b20gaXMgYSBkZWZpbml0aW9uIG9yIHJlcHJlc2VudHMgYW4gdW5kZWZpbmVkCisgIC8vLyBzeW1ib2wuCisgIERlZmluaXRpb24gZGVmaW5pdGlvbigpIGNvbnN0IHsgcmV0dXJuIF9kZWZpbml0aW9uOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdG9tICphKSB7IHJldHVybiB0cnVlOyB9CisKK3Byb3RlY3RlZDoKKyAgLy8vIEF0b20gaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcy4gIE9ubHkgc3ViY2xhc3NlcyBjYW4gYWNjZXNzIGNvbnN0cnVjdG9yLgorICBleHBsaWNpdCBBdG9tKERlZmluaXRpb24gZGVmKSA6IF9kZWZpbml0aW9uKGRlZikge30KKworICAvLy8gVGhlIG1lbW9yeSBmb3IgQXRvbSBvYmplY3RzIGlzIGFsd2F5cyBtYW5hZ2VkIGJ5IHRoZSBvd25pbmcgRmlsZQorICAvLy8gb2JqZWN0LiAgVGhlcmVmb3JlLCBubyBvbmUgYnV0IHRoZSBvd25pbmcgRmlsZSBvYmplY3Qgc2hvdWxkIGNhbGwKKyAgLy8vIGRlbGV0ZSBvbiBhbiBBdG9tLiAgSW4gZmFjdCwgc29tZSBGaWxlIG9iamVjdHMgbWF5IGJ1bGsgYWxsb2NhdGUKKyAgLy8vIGFuIGFycmF5IG9mIEF0b21zLCBzbyB0aGV5IGNhbm5vdCBiZSBpbmRpdmlkdWFsbHkgZGVsZXRlZCBieSBhbnlvbmUuCisgIHZpcnR1YWwgfkF0b20oKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgIERlZmluaXRpb24gX2RlZmluaXRpb247Cit9OworCisvLy8gQ2xhc3Mgd2hpY2ggb3ducyBhbiBhdG9tIHBvaW50ZXIgYW5kIHJ1bnMgdGhlIGF0b20gZGVzdHJ1Y3RvciB3aGVuIHRoZQorLy8vIG93bmluZyBwb2ludGVyIGdvZXMgb3V0IG9mIHNjb3BlLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIE93bmluZ0F0b21QdHIgeworcHJpdmF0ZToKKyAgT3duaW5nQXRvbVB0cihjb25zdCBPd25pbmdBdG9tUHRyICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBPd25pbmdBdG9tUHRyICYpID0gZGVsZXRlOworCitwdWJsaWM6CisgIE93bmluZ0F0b21QdHIoKSA9IGRlZmF1bHQ7CisgIE93bmluZ0F0b21QdHIoVCAqYXRvbSkgOiBhdG9tKGF0b20pIHsgfQorCisgIH5Pd25pbmdBdG9tUHRyKCkgeworICAgIGlmIChhdG9tKQorICAgICAgcnVuRGVzdHJ1Y3RvcihhdG9tKTsKKyAgfQorCisgIHZvaWQgcnVuRGVzdHJ1Y3RvcihBdG9tICphdG9tKSB7CisgICAgYXRvbS0+fkF0b20oKTsKKyAgfQorCisgIE93bmluZ0F0b21QdHIoT3duaW5nQXRvbVB0ciAmJnB0cikgOiBhdG9tKHB0ci5hdG9tKSB7CisgICAgcHRyLmF0b20gPSBudWxscHRyOworICB9CisKKyAgdm9pZCBvcGVyYXRvcj0oT3duaW5nQXRvbVB0ciYmIHB0cikgeworICAgIGlmIChhdG9tKQorICAgICAgcnVuRGVzdHJ1Y3RvcihhdG9tKTsKKyAgICBhdG9tID0gcHRyLmF0b207CisgICAgcHRyLmF0b20gPSBudWxscHRyOworICB9CisKKyAgVCAqY29uc3QgJmdldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gYXRvbTsKKyAgfQorCisgIFQgKiZnZXQoKSB7CisgICAgcmV0dXJuIGF0b207CisgIH0KKworICBUICpyZWxlYXNlKCkgeworICAgIGF1dG8gKnYgPSBhdG9tOworICAgIGF0b20gPSBudWxscHRyOworICAgIHJldHVybiB2OworICB9CisKK3ByaXZhdGU6CisgIFQgKmF0b20gPSBudWxscHRyOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsZAorCisjZW5kaWYgLy8gTExEX0NPUkVfQVRPTV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9EZWZpbmVkQXRvbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvRGVmaW5lZEF0b20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjI5ZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvRGVmaW5lZEF0b20uaApAQCAtMCwwICsxLDM3NCBAQAorLy89PT0tIENvcmUvRGVmaW5lZEF0b20uaCAtIEFuIEF0b20gd2l0aCBjb250ZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gTGlua2VyCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTERfQ09SRV9ERUZJTkVEX0FUT01fSAorI2RlZmluZSBMTERfQ09SRV9ERUZJTkVEX0FUT01fSAorCisjaW5jbHVkZSAibGxkL0NvbW1vbi9MTFZNLmgiCisjaW5jbHVkZSAibGxkL0NvcmUvQXRvbS5oIgorI2luY2x1ZGUgImxsZC9Db3JlL1JlZmVyZW5jZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisKK25hbWVzcGFjZSBsbGQgeworY2xhc3MgRmlsZTsKKworLy8vIFxicmllZiBUaGUgZnVuZGFtZW50YWwgdW5pdCBvZiBsaW5raW5nLgorLy8vCisvLy8gQSBDIGZ1bmN0aW9uIG9yIGdsb2JhbCB2YXJpYWJsZSBpcyBhbiBhdG9tLiAgQW4gYXRvbSBoYXMgY29udGVudCBhbmQKKy8vLyBhdHRyaWJ1dGVzLiBUaGUgY29udGVudCBvZiBhIGZ1bmN0aW9uIGF0b20gaXMgdGhlIGluc3RydWN0aW9ucyB0aGF0CisvLy8gaW1wbGVtZW50IHRoZSBmdW5jdGlvbi4gIFRoZSBjb250ZW50IG9mIGEgZ2xvYmFsIHZhcmlhYmxlIGF0b20gaXMgaXRzCisvLy8gaW5pdGlhbCBieXRlcy4KKy8vLworLy8vIEhlcmUgYXJlIHNvbWUgZXhhbXBsZSBhdHRyaWJ1dGUgc2V0cyBmb3IgY29tbW9uIGF0b21zLiBJZiBhIHBhcnRpY3VsYXIKKy8vLyBhdHRyaWJ1dGUgaXMgbm90IGxpc3RlZCwgdGhlIGRlZmF1bHQgdmFsdWVzIGFyZTogIGRlZmluaXRpb249cmVndWxhciwKKy8vLyBzZWN0aW9uQ2hvaWNlPWJhc2VkT25Db250ZW50LCBzY29wZT10cmFuc2xhdGlvblVuaXQsIG1lcmdlPW5vLAorLy8vIGRlYWRTdHJpcD1ub3JtYWwsIGludGVycG9zYWJsZT1ubworLy8vCisvLy8gIEMgZnVuY3Rpb246ICB2b2lkIGZvbygpIHt9IDxicj4KKy8vLyAgICBuYW1lPWZvbywgdHlwZT1jb2RlLCBwZXJtPXJfeCwgc2NvcGU9Z2xvYmFsCisvLy8KKy8vLyAgQyBzdGF0aWMgZnVuY3Rpb246ICBzdGFpYyB2b2lkIGZ1bmMoKSB7fSA8YnI+CisvLy8gICAgbmFtZT1mdW5jLCB0eXBlPWNvZGUsIHBlcm09cl94CisvLy8KKy8vLyAgQyBnbG9iYWwgdmFyaWFibGU6ICBpbnQgY291bnQgPSAxOyA8YnI+CisvLy8gICAgbmFtZT1jb3VudCwgdHlwZT1kYXRhLCBwZXJtPXJ3Xywgc2NvcGU9Z2xvYmFsCisvLy8KKy8vLyAgQyB0ZW50YXRpdmUgZGVmaW5pdGlvbjogIGludCBiYXI7IDxicj4KKy8vLyAgICBuYW1lPWJhciwgdHlwZT16ZXJvZmlsbCwgcGVybT1yd18sIHNjb3BlPWdsb2JhbCwKKy8vLyAgICBtZXJnZT1hc1RlbnRhdGl2ZSwgaW50ZXJwb3NhYmxlPXllc0FuZFJ1bnRpbWVXZWFrCisvLy8KKy8vLyAgVW5pbml0aWFsaXplZCBDIHN0YXRpYyB2YXJpYWJsZTogIHN0YXRpYyBpbnQgc3R1ZmY7IDxicj4KKy8vLyAgICBuYW1lPXN0dWZmLCB0eXBlPXplcm9maWxsLCBwZXJtPXJ3XworLy8vCisvLy8gIFdlYWsgQyBmdW5jdGlvbjogIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIGZvbygpIHt9IDxicj4KKy8vLyAgICBuYW1lPWZvbywgdHlwZT1jb2RlLCBwZXJtPXJfeCwgc2NvcGU9Z2xvYmFsLCBtZXJnZT1hc1dlYWsKKy8vLworLy8vICBIaWRkZW4gQyBmdW5jdGlvbjogIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkgdm9pZCBmb28oKSB7fTxicj4KKy8vLyAgICBuYW1lPWZvbywgdHlwZT1jb2RlLCBwZXJtPXJfeCwgc2NvcGU9bGlua2FnZVVuaXQKKy8vLworLy8vICBOby1kZWFkLXN0cmlwIGZ1bmN0aW9uOiAgX19hdHRyaWJ1dGVfXygodXNlZCkpIHZvaWQgZm9vKCkge30gPGJyPgorLy8vICAgIG5hbWU9Zm9vLCB0eXBlPWNvZGUsIHBlcm09cl94LCBzY29wZT1nbG9iYWwsIGRlYWRTdHJpcD1uZXZlcgorLy8vCisvLy8gIE5vbi1pbmxpbmVkIEMrKyBpbmxpbmUgbWV0aG9kOiAgaW5saW5lIHZvaWQgRm9vOjpkb2l0KCkge30gPGJyPgorLy8vICAgIG5hbWU9X1pOM0ZvbzRkb2l0RXYsIHR5cGU9Y29kZSwgcGVybT1yX3gsIHNjb3BlPWdsb2JhbCwKKy8vLyAgICBtZXJnZUR1cGVzPWFzV2VhaworLy8vCisvLy8gIE5vbi1pbmxpbmVkIEMrKyBpbmxpbmUgbWV0aG9kIHdob3NlIGFkZHJlc3MgaXMgdGFrZW46CisvLy8gICAgIGlubGluZSB2b2lkIEZvbzo6ZG9pdCgpIHt9IDxicj4KKy8vLyAgICBuYW1lPV9aTjNGb280ZG9pdEV2LCB0eXBlPWNvZGUsIHBlcm09cl94LCBzY29wZT1nbG9iYWwsCisvLy8gICAgbWVyZ2VEdXBlcz1hc0FkZHJlc3NlZFdlYWsKKy8vLworLy8vICBsaXRlcmFsIGMtc3RyaW5nOiAgImhlbGxvIiA8YnI+CisvLy8gICAgbmFtZT0iIiB0eXBlPWNzdHJpbmcsIHBlcm09cl9fLCBzY29wZT1saW5rYWdlVW5pdAorLy8vCisvLy8gIGxpdGVyYWwgZG91YmxlOiAgMS4yMzQgPGJyPgorLy8vICAgIG5hbWU9IiIgdHlwZT1saXRlcmFsOCwgcGVybT1yX18sIHNjb3BlPWxpbmthZ2VVbml0CisvLy8KKy8vLyAgY29uc3RhbnQ6ICB7IDEsMiwzIH0gPGJyPgorLy8vICAgIG5hbWU9IiIgdHlwZT1jb25zdGFudCwgcGVybT1yX18sIHNjb3BlPWxpbmthZ2VVbml0CisvLy8KKy8vLyAgUG9pbnRlciB0byBpbml0aWFsaXplciBmdW5jdGlvbjogIDxicj4KKy8vLyAgICBuYW1lPSIiIHR5cGU9aW5pdGlhbGl6ZXIsIHBlcm09cndfbCwKKy8vLyAgICBzZWN0aW9uQ2hvaWNlPWN1c3RvbVJlcXVpcmVkCisvLy8KKy8vLyAgQyBmdW5jdGlvbiBwbGFjZSBpbiBjdXN0b20gc2VjdGlvbjogIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9fZm9vIikpKQorLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oKSB7fSA8YnI+CisvLy8gICAgbmFtZT1mb28sIHR5cGU9Y29kZSwgcGVybT1yX3gsIHNjb3BlPWdsb2JhbCwKKy8vLyAgICBzZWN0aW9uQ2hvaWNlPWN1c3RvbVJlcXVpcmVkLCBjdXN0b21TZWN0aW9uTmFtZT1fX2ZvbworLy8vCitjbGFzcyBEZWZpbmVkQXRvbSA6IHB1YmxpYyBBdG9tIHsKK3B1YmxpYzoKKyAgZW51bSBJbnRlcnBvc2FibGUgeworICAgIGludGVycG9zZU5vLCAgICAgICAgICAgIC8vIGxpbmtlciBjYW4gZGlyZWN0bHkgYmluZCB1c2VzIG9mIHRoaXMgYXRvbQorICAgIGludGVycG9zZVllcywgICAgICAgICAgIC8vIGxpbmtlciBtdXN0IGluZGlyZWN0ICh0aHJvdWdoIEdPVCkgdXNlcworICAgIGludGVycG9zZVllc0FuZFJ1bnRpbWVXZWFrIC8vIG11c3QgaW5kaXJlY3QgYW5kIG1hcmsgc3ltYm9sIHdlYWsgaW4gZmluYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5rZWQgaW1hZ2UKKyAgfTsKKworICBlbnVtIE1lcmdlIHsKKyAgICBtZXJnZU5vLCAgICAgICAgICAgICAgICAvLyBBbm90aGVyIGF0b20gd2l0aCBzYW1lIG5hbWUgaXMgZXJyb3IKKyAgICBtZXJnZUFzVGVudGF0aXZlLCAgICAgICAvLyBJcyBBTlNJIEMgdGVudGF0aXZlIGRlZmluaXRpb24sIGNhbiBiZSBjb2FsZXNjZWQKKyAgICBtZXJnZUFzV2VhaywgICAgICAgICAgICAvLyBJcyBDKysgaW5saW5lIGRlZmluaXRpb24gdGhhdCB3YXMgbm90IGlubGluZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGFkZHJlc3Mgd2FzIG5vdCB0YWtlbiwgc28gYXRvbSBjYW4gYmUgaGlkZGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgbGlua2VyCisgICAgbWVyZ2VBc1dlYWtBbmRBZGRyZXNzVXNlZCwgLy8gSXMgQysrIGRlZmluaXRpb24gaW5saW5lIGRlZmluaXRpb24gd2hvc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRyZXNzIHdhcyB0YWtlbi4KKyAgICBtZXJnZVNhbWVOYW1lQW5kU2l6ZSwgICAvLyBBbm90aGVyIGF0b20gd2l0aCBkaWZmZXJlbnQgc2l6ZSBpcyBlcnJvcgorICAgIG1lcmdlQnlMYXJnZXN0U2VjdGlvbiwgIC8vIENob29zZSBhbiBhdG9tIHdob3NlIHNlY3Rpb24gaXMgdGhlIGxhcmdlc3QuCisgICAgbWVyZ2VCeUNvbnRlbnQsICAgICAgICAgLy8gTWVyZ2Ugd2l0aCBvdGhlciBjb25zdGFudHMgd2l0aCBzYW1lIGNvbnRlbnQuCisgIH07CisKKyAgZW51bSBDb250ZW50VHlwZSB7CisgICAgdHlwZVVua25vd24sICAgICAgICAgICAgLy8gZm9yIHVzZSB3aXRoIGRlZmluaXRpb25VbmRlZmluZWQKKyAgICB0eXBlTWFjaEhlYWRlciwgICAgICAgICAvLyBhdG9tIHJlcHJlc2VudGluZyBtYWNoX2hlYWRlciBbRGFyd2luXQorICAgIHR5cGVDb2RlLCAgICAgICAgICAgICAgIC8vIGV4ZWN1dGFibGUgY29kZQorICAgIHR5cGVSZXNvbHZlciwgICAgICAgICAgIC8vIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYWRkcmVzcyBvZiB0YXJnZXQKKyAgICB0eXBlQnJhbmNoSXNsYW5kLCAgICAgICAvLyBsaW5rZXIgY3JlYXRlZCBmb3IgbGFyZ2UgYmluYXJpZXMKKyAgICB0eXBlQnJhbmNoU2hpbSwgICAgICAgICAvLyBsaW5rZXIgY3JlYXRlZCB0byBzd2l0Y2ggdGh1bWIgbW9kZQorICAgIHR5cGVTdHViLCAgICAgICAgICAgICAgIC8vIGxpbmtlciBjcmVhdGVkIGZvciBjYWxsaW5nIGV4dGVybmFsIGZ1bmN0aW9uCisgICAgdHlwZVN0dWJIZWxwZXIsICAgICAgICAgLy8gbGlua2VyIGNyZWF0ZWQgZm9yIGluaXRpYWwgc3R1YiBiaW5kaW5nCisgICAgdHlwZUNvbnN0YW50LCAgICAgICAgICAgLy8gYSByZWFkLW9ubHkgY29uc3RhbnQKKyAgICB0eXBlQ1N0cmluZywgICAgICAgICAgICAvLyBhIHplcm8gdGVybWluYXRlZCBVVEY4IEMgc3RyaW5nCisgICAgdHlwZVVURjE2U3RyaW5nLCAgICAgICAgLy8gYSB6ZXJvIHRlcm1pbmF0ZWQgVVRGMTYgc3RyaW5nCisgICAgdHlwZUNGSSwgICAgICAgICAgICAgICAgLy8gYSBGREUgb3IgQ0lFIGZyb20gZHdhcmYgdW53aW5kIGluZm8KKyAgICB0eXBlTFNEQSwgICAgICAgICAgICAgICAvLyBleHRyYSB1bndpbmRpbmcgaW5mbworICAgIHR5cGVMaXRlcmFsNCwgICAgICAgICAgIC8vIGEgZm91ci1idHllIHJlYWQtb25seSBjb25zdGFudAorICAgIHR5cGVMaXRlcmFsOCwgICAgICAgICAgIC8vIGFuIGVpZ2h0LWJ0eWUgcmVhZC1vbmx5IGNvbnN0YW50CisgICAgdHlwZUxpdGVyYWwxNiwgICAgICAgICAgLy8gYSBzaXh0ZWVuLWJ0eWUgcmVhZC1vbmx5IGNvbnN0YW50CisgICAgdHlwZURhdGEsICAgICAgICAgICAgICAgLy8gcmVhZC13cml0ZSBkYXRhCisgICAgdHlwZURhdGFGYXN0LCAgICAgICAgICAgLy8gYWxsb3cgZGF0YSB0byBiZSBxdWlja2x5IGFjY2Vzc2VkCisgICAgdHlwZVplcm9GaWxsLCAgICAgICAgICAgLy8gemVyby1maWxsIGRhdGEKKyAgICB0eXBlWmVyb0ZpbGxGYXN0LCAgICAgICAvLyBhbGxvdyB6ZXJvLWZpbGwgZGF0YSB0byBiZSBxdWlja3kgYWNjZXNzZWQKKyAgICB0eXBlQ29uc3REYXRhLCAgICAgICAgICAvLyByZWFkLW9ubHkgZGF0YSBhZnRlciBkeW5hbWljIGxpbmtlciBpcyBkb25lCisgICAgdHlwZU9iakMxQ2xhc3MsICAgICAgICAgLy8gT2JqQzEgY2xhc3MgW0Rhcndpbl0KKyAgICB0eXBlTGF6eVBvaW50ZXIsICAgICAgICAvLyBwb2ludGVyIHRocm91Z2ggd2hpY2ggYSBzdHViIGp1bXBzCisgICAgdHlwZUxhenlEeWxpYlBvaW50ZXIsICAgLy8gcG9pbnRlciB0aHJvdWdoIHdoaWNoIGEgc3R1YiBqdW1wcyBbRGFyd2luXQorICAgIHR5cGVOb25MYXp5UG9pbnRlciwgICAgIC8vIHBvaW50ZXIgdG8gZXh0ZXJuYWwgc3ltYm9sCisgICAgdHlwZUNGU3RyaW5nLCAgICAgICAgICAgLy8gTlMvQ0ZTdHJpbmcgb2JqZWN0IFtEYXJ3aW5dCisgICAgdHlwZUdPVCwgICAgICAgICAgICAgICAgLy8gcG9pbnRlciB0byBleHRlcm5hbCBzeW1ib2wKKyAgICB0eXBlSW5pdGlhbGl6ZXJQdHIsICAgICAvLyBwb2ludGVyIHRvIGluaXRpYWxpemVyIGZ1bmN0aW9uCisgICAgdHlwZVRlcm1pbmF0b3JQdHIsICAgICAgLy8gcG9pbnRlciB0byB0ZXJtaW5hdG9yIGZ1bmN0aW9uCisgICAgdHlwZUNTdHJpbmdQdHIsICAgICAgICAgLy8gcG9pbnRlciB0byBVVEY4IEMgc3RyaW5nIFtEYXJ3aW5dCisgICAgdHlwZU9iakNDbGFzc1B0ciwgICAgICAgLy8gcG9pbnRlciB0byBPYmpDIGNsYXNzIFtEYXJ3aW5dCisgICAgdHlwZU9iakMyQ2F0ZWdvcnlMaXN0LCAgLy8gcG9pbnRlcnMgdG8gT2JqQyBjYXRlZ29yeSBbRGFyd2luXQorICAgIHR5cGVPYmpDSW1hZ2VJbmZvLCAgICAgIC8vIHBvaW50ZXIgdG8gT2JqQyBjbGFzcyBbRGFyd2luXQorICAgIHR5cGVPYmpDTWV0aG9kTGlzdCwgICAgIC8vIHBvaW50ZXIgdG8gT2JqQyBtZXRob2QgbGlzdCBbRGFyd2luXQorICAgIHR5cGVEVHJhY2VET0YsICAgICAgICAgIC8vIHJ1bnRpbWUgZGF0YSBmb3IgRHRyYWNlIFtEYXJ3aW5dCisgICAgdHlwZUludGVycG9zaW5nVHVwbGVzLCAgLy8gdHVwbGVzIG9mIGludGVycG9zaW5nIGluZm8gZm9yIGR5bGQgW0Rhcndpbl0KKyAgICB0eXBlVGVtcExUTywgICAgICAgICAgICAvLyB0ZW1wb3JhcnkgYXRvbSBmb3IgYml0Y29kZSByZWFkZXIKKyAgICB0eXBlQ29tcGFjdFVud2luZEluZm8sICAvLyBydW50aW1lIGRhdGEgZm9yIHVud2luZGVyIFtEYXJ3aW5dCisgICAgdHlwZVByb2Nlc3NlZFVud2luZEluZm8sLy8gY29tcHJlc3NlZCBjb21wYWN0IHVud2luZCBpbmZvIFtEYXJ3aW5dCisgICAgdHlwZVRodW5rVExWLCAgICAgICAgICAgLy8gdGh1bmsgdXNlZCB0byBhY2Nlc3MgYSBUTFYgW0Rhcndpbl0KKyAgICB0eXBlVExWSW5pdGlhbERhdGEsICAgICAvLyBpbml0aWFsIGRhdGEgZm9yIGEgVExWIFtEYXJ3aW5dCisgICAgdHlwZVRMVkluaXRpYWxaZXJvRmlsbCwgLy8gVExWIGluaXRpYWwgemVybyBmaWxsIGRhdGEgW0Rhcndpbl0KKyAgICB0eXBlVExWSW5pdGlhbGl6ZXJQdHIsICAvLyBwb2ludGVyIHRvIHRocmVhZCBsb2NhbCBpbml0aWFsaXplciBbRGFyd2luXQorICAgIHR5cGVEU09IYW5kbGUsICAgICAgICAgIC8vIGF0b20gcmVwcmVzZW50aW5nIERTTyBoYW5kbGUgW0Rhcndpbl0KKyAgICB0eXBlU2VjdENyZWF0ZSwgICAgICAgICAvLyBDcmVhdGVkIHZpYSB0aGUgLXNlY3RjcmVhdGUgb3B0aW9uIFtEYXJ3aW5dCisgIH07CisKKyAgLy8gUGVybWlzc2lvbiBiaXRzIGZvciBhdG9tcyBhbmQgc2VnbWVudHMuIFRoZSBvcmRlciBvZiB0aGVzZSB2YWx1ZXMgYXJlCisgIC8vIGltcG9ydGFudCwgYmVjYXVzZSB0aGUgbGF5b3V0IHBhc3MgbWF5IHNvcnQgYXRvbXMgYnkgcGVybWlzc2lvbiBpZiBvdGhlcgorICAvLyBhdHRyaWJ1dGVzIGFyZSB0aGUgc2FtZS4KKyAgZW51bSBDb250ZW50UGVybWlzc2lvbnMgeworICAgIHBlcm1fX18gID0gMCwgICAgICAgICAgIC8vIG1hcHBlZCBhcyB1bmFjY2Vzc2libGUKKyAgICBwZXJtUl9fICA9IDgsICAgICAgICAgICAvLyBtYXBwZWQgcmVhZC1vbmx5CisgICAgcGVybVJXXyAgPSA4ICsgMiwgICAgICAgLy8gbWFwcGVkIHJlYWRhYmxlIGFuZCB3cml0YWJsZQorICAgIHBlcm1SV19MID0gOCArIDIgKyAxLCAgIC8vIGluaXRpYWxseSBtYXBwZWQgci93LCB0aGVuIG1hZGUgcmVhZC1vbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZGVyIHdyaXRhYmxlCisgICAgcGVybVJfWCAgPSA4ICsgNCwgICAgICAgLy8gbWFwcGVkIHJlYWRhYmxlIGFuZCBleGVjdXRhYmxlCisgICAgcGVybVJXWCAgPSA4ICsgMiArIDQsICAgLy8gbWFwcGVkIHJlYWRhYmxlIGFuZCB3cml0YWJsZSBhbmQgZXhlY3V0YWJsZQorICAgIHBlcm1Vbmtub3duID0gMTYgICAgICAgIC8vIHVua25vd24gb3IgaW52YWxpZCBwZXJtaXNzaW9ucworICB9OworCisgIGVudW0gU2VjdGlvbkNob2ljZSB7CisgICAgc2VjdGlvbkJhc2VkT25Db250ZW50LCAgLy8gbGlua2VyIGluZmVycyBmaW5hbCBzZWN0aW9uIGJhc2VkIG9uIGNvbnRlbnQKKyAgICBzZWN0aW9uQ3VzdG9tUHJlZmVycmVkLCAvLyBsaW5rZXIgbWF5IHBsYWNlIGluIHNwZWNpZmljIHNlY3Rpb24KKyAgICBzZWN0aW9uQ3VzdG9tUmVxdWlyZWQgICAvLyBsaW5rZXIgbXVzdCBwbGFjZSBpbiBzcGVjaWZpYyBzZWN0aW9uCisgIH07CisKKyAgZW51bSBEZWFkU3RyaXBLaW5kIHsKKyAgICBkZWFkU3RyaXBOb3JtYWwsICAgICAgICAvLyBsaW5rZXIgbWF5IGRlYWQgc3RyaXAgdGhpcyBhdG9tCisgICAgZGVhZFN0cmlwTmV2ZXIsICAgICAgICAgLy8gbGlua2VyIG11c3QgbmV2ZXIgZGVhZCBzdHJpcCB0aGlzIGF0b20KKyAgICBkZWFkU3RyaXBBbHdheXMgICAgICAgICAvLyBsaW5rZXIgbXVzdCByZW1vdmUgdGhpcyBhdG9tIGlmIHVudXNlZAorICB9OworCisgIGVudW0gRHluYW1pY0V4cG9ydCB7CisgICAgLy8vIFxicmllZiBUaGUgbGlua2VyIG1heSBvciBtYXkgbm90IGV4cG9ydCB0aGlzIGF0b20gZHluYW1pY2FsbHkgZGVwZW5kaW5nCisgICAgLy8vICAgb24gdGhlIG91dHB1dCB0eXBlIGFuZCBvdGhlciBjb250ZXh0IG9mIHRoZSBsaW5rLgorICAgIGR5bmFtaWNFeHBvcnROb3JtYWwsCisgICAgLy8vIFxicmllZiBUaGUgbGlua2VyIHdpbGwgYWx3YXlzIGV4cG9ydCB0aGlzIGF0b20gZHluYW1pY2FsbHkuCisgICAgZHluYW1pY0V4cG9ydEFsd2F5cywKKyAgfTsKKworICAvLyBBdHRyaWJ1dGVzIGRlc2NyaWJlIGEgY29kZSBtb2RlbCB1c2VkIGJ5IHRoZSBhdG9tLgorICBlbnVtIENvZGVNb2RlbCB7CisgICAgY29kZU5BLCAgICAgICAgICAgLy8gbm8gc3BlY2lmaWMgY29kZSBtb2RlbAorICAgIC8vIE1JUFMgY29kZSBtb2RlbHMKKyAgICBjb2RlTWlwc1BJQywgICAgICAvLyBQSUMgZnVuY3Rpb24gaW4gYSBQSUMgLyBub24tUElDIG1peGVkIGZpbGUKKyAgICBjb2RlTWlwc01pY3JvLCAgICAvLyBtaWNyb01JUFMgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcKKyAgICBjb2RlTWlwc01pY3JvUElDLCAvLyBtaWNyb01JUFMgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcgKyBQSUMKKyAgICBjb2RlTWlwczE2LCAgICAgICAvLyBNSVBTLTE2IGluc3RydWN0aW9uIGVuY29kaW5nCisgICAgLy8gQVJNIGNvZGUgbW9kZWxzCisgICAgY29kZUFSTVRodW1iLCAgICAgLy8gQVJNIFRodW1iIGluc3RydWN0aW9uIHNldAorICAgIGNvZGVBUk1fYSwgICAgICAgIC8vICRhLWxpa2UgbWFwcGluZyBzeW1ib2wgKGZvciBBUk0gY29kZSkKKyAgICBjb2RlQVJNX2QsICAgICAgICAvLyAkZC1saWtlIG1hcHBpbmcgc3ltYm9sIChmb3IgZGF0YSkKKyAgICBjb2RlQVJNX3QsICAgICAgICAvLyAkdC1saWtlIG1hcHBpbmcgc3ltYm9sIChmb3IgVGh1bWIgY29kZSkKKyAgfTsKKworICBzdHJ1Y3QgQWxpZ25tZW50IHsKKyAgICBBbGlnbm1lbnQoaW50IHYsIGludCBtID0gMCkgOiB2YWx1ZSh2KSwgbW9kdWx1cyhtKSB7fQorCisgICAgdWludDE2X3QgdmFsdWU7CisgICAgdWludDE2X3QgbW9kdWx1czsKKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBbGlnbm1lbnQgJnJocykgY29uc3QgeworICAgICAgcmV0dXJuICh2YWx1ZSA9PSByaHMudmFsdWUpICYmIChtb2R1bHVzID09IHJocy5tb2R1bHVzKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFxicmllZiByZXR1cm5zIGEgdmFsdWUgZm9yIHRoZSBvcmRlciBvZiB0aGlzIEF0b20gd2l0aGluIGl0cyBmaWxlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCBieSB0aGUgbGlua2VyIHRvIG9yZGVyIHRoZSBsYXlvdXQgb2YgQXRvbXMgc28gdGhhdCB0aGUKKyAgLy8vIHJlc3VsdGluZyBpbWFnZSBpcyBzdGFibGUgYW5kIHJlcHJvZHVjaWJsZS4KKyAgdmlydHVhbCB1aW50NjRfdCBvcmRpbmFsKCkgY29uc3QgPSAwOworCisgIC8vLyBcYnJpZWYgdGhlIG51bWJlciBvZiBieXRlcyBvZiBzcGFjZSB0aGlzIGF0b20ncyBjb250ZW50IHdpbGwgb2NjdXB5IGluIHRoZQorICAvLy8gZmluYWwgbGlua2VkIGltYWdlLgorICAvLy8KKyAgLy8vIEZvciBhIGZ1bmN0aW9uIGF0b20sIGl0IGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgY29kZSBpbiB0aGUgZnVuY3Rpb24uCisgIHZpcnR1YWwgdWludDY0X3Qgc2l6ZSgpIGNvbnN0ID0gMDsKKworICAvLy8gXGJyaWVmIFRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIGZyb20gd2hpY2ggdGhlIGF0b20gaXMgaW5zdGFudGlhdGVkLgorICAvLy8KKyAgLy8vIE1lcmdlOjptZXJnZUJ5TGFyZ2VzdFNlY3Rpb24gaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZiBzZWN0aW9uIHNpemUKKyAgLy8vIGFuZCBub3QgaW4gdGVybXMgb2YgYXRvbSBzaXplLCBzbyB3ZSBuZWVkIHRoaXMgZnVuY3Rpb24gc2VwYXJhdGUKKyAgLy8vIGZyb20gc2l6ZSgpLgorICB2aXJ0dWFsIHVpbnQ2NF90IHNlY3Rpb25TaXplKCkgY29uc3QgeyByZXR1cm4gMDsgfQorCisgIC8vLyBcYnJpZWYgVGhlIHZpc2liaWxpdHkgb2YgdGhpcyBhdG9tIHRvIG90aGVyIGF0b21zLgorICAvLy8KKyAgLy8vIEMgc3RhdGljIGZ1bmN0aW9ucyBoYXZlIHNjb3BlIHNjb3BlVHJhbnNsYXRpb25Vbml0LiAgUmVndWxhciBDIGZ1bmN0aW9ucworICAvLy8gaGF2ZSBzY29wZSBzY29wZUdsb2JhbC4gIEZ1bmN0aW9ucyBjb21waWxlZCB3aXRoIHZpc2liaWxpdHk9aGlkZGVuIGhhdmUKKyAgLy8vIHNjb3BlIHNjb3BlTGlua2FnZVVuaXQgc28gdGhleSBjYW4gYmUgc2VlIGJ5IG90aGVyIGF0b21zIGJlaW5nIGxpbmtlZCBidXQKKyAgLy8vIG5vdCBieSB0aGUgT1MgbG9hZGVyLgorICB2aXJ0dWFsIFNjb3BlIHNjb3BlKCkgY29uc3QgPSAwOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGUgbGlua2VyIHNob3VsZCB1c2UgZGlyZWN0IG9yIGluZGlyZWN0IGFjY2VzcyB0byB0aGlzCisgIC8vLyBhdG9tLgorICB2aXJ0dWFsIEludGVycG9zYWJsZSBpbnRlcnBvc2FibGUoKSBjb25zdCA9IDA7CisKKyAgLy8vIFxicmllZiBob3cgdGhlIGxpbmtlciBzaG91bGQgaGFuZGxlIGlmIG11bHRpcGxlIGF0b21zIGhhdmUgdGhlIHNhbWUgbmFtZS4KKyAgdmlydHVhbCBNZXJnZSBtZXJnZSgpIGNvbnN0ID0gMDsKKworICAvLy8gXGJyaWVmIFRoZSB0eXBlIG9mIHRoaXMgYXRvbSwgc3VjaCBhcyBjb2RlIG9yIGRhdGEuCisgIHZpcnR1YWwgQ29udGVudFR5cGUgY29udGVudFR5cGUoKSBjb25zdCA9IDA7CisKKyAgLy8vIFxicmllZiBUaGUgYWxpZ25tZW50IGNvbnN0cmFpbnRzIG9uIGhvdyB0aGlzIGF0b20gbXVzdCBiZSBsYWlkIG91dCBpbiB0aGUKKyAgLy8vIGZpbmFsIGxpbmtlZCBpbWFnZSAoZS5nLiAxNi1ieXRlIGFsaWduZWQpLgorICB2aXJ0dWFsIEFsaWdubWVudCBhbGlnbm1lbnQoKSBjb25zdCA9IDA7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgYXRvbSBtdXN0IGJlIGluIGEgc3BlY2lhbGx5IG5hbWVkIHNlY3Rpb24gaW4gdGhlIGZpbmFsCisgIC8vLyBsaW5rZWQgaW1hZ2UsIG9yIGlmIHRoZSBsaW5rZXIgY2FuIGluZmVyIHRoZSBzZWN0aW9uIGJhc2VkIG9uIHRoZQorICAvLy8gY29udGVudFR5cGUoKS4KKyAgdmlydHVhbCBTZWN0aW9uQ2hvaWNlIHNlY3Rpb25DaG9pY2UoKSBjb25zdCA9IDA7CisKKyAgLy8vIFxicmllZiBJZiBzZWN0aW9uQ2hvaWNlKCkgIT0gc2VjdGlvbkJhc2VkT25Db250ZW50LCB0aGVuIHRoaXMgcmV0dXJuIHRoZQorICAvLy8gbmFtZSBvZiB0aGUgc2VjdGlvbiB0aGUgYXRvbSBzaG91bGQgYmUgcGxhY2VkIGludG8uCisgIHZpcnR1YWwgU3RyaW5nUmVmIGN1c3RvbVNlY3Rpb25OYW1lKCkgY29uc3QgPSAwOworCisgIC8vLyBcYnJpZWYgY29uc3RyYWludHMgb24gd2hldGhlciB0aGUgbGlua2VyIG1heSBkZWFkIHN0cmlwIGF3YXkgdGhpcyBhdG9tLgorICB2aXJ0dWFsIERlYWRTdHJpcEtpbmQgZGVhZFN0cmlwKCkgY29uc3QgPSAwOworCisgIC8vLyBcYnJpZWYgVW5kZXIgd2hpY2ggY29uZGl0aW9ucyBzaG91bGQgdGhpcyBhdG9tIGJlIGR5bmFtaWNhbGx5IGV4cG9ydGVkLgorICB2aXJ0dWFsIER5bmFtaWNFeHBvcnQgZHluYW1pY0V4cG9ydCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZHluYW1pY0V4cG9ydE5vcm1hbDsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29kZSBtb2RlbCB1c2VkIGJ5IHRoZSBhdG9tLgorICB2aXJ0dWFsIENvZGVNb2RlbCBjb2RlTW9kZWwoKSBjb25zdCB7IHJldHVybiBjb2RlTkE7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIE9TIG1lbW9yeSBwcm90ZWN0aW9ucyByZXF1aXJlZCBmb3IgdGhpcyBhdG9tJ3MgY29udGVudAorICAvLy8gYXQgcnVudGltZS4KKyAgLy8vCisgIC8vLyBBIGZ1bmN0aW9uIGF0b20gaXMgUl9YLCBhIGdsb2JhbCB2YXJpYWJsZSBpcyBSV18sIGFuZCBhIHJlYWQtb25seSBjb25zdGFudAorICAvLy8gaXMgUl9fLgorICB2aXJ0dWFsIENvbnRlbnRQZXJtaXNzaW9ucyBwZXJtaXNzaW9ucygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgcmF3ICh1bnJlbG9jYXRlZCkgYnl0ZXMgb2YgdGhpcyBBdG9tJ3MKKyAgLy8vIGNvbnRlbnQuCisgIHZpcnR1YWwgQXJyYXlSZWY8dWludDhfdD4gcmF3Q29udGVudCgpIGNvbnN0ID0gMDsKKworICAvLy8gVGhpcyBjbGFzcyBhYnN0cmFjdHMgaXRlcmF0aW5nIG92ZXIgdGhlIHNlcXVlbmNlIG9mIFJlZmVyZW5jZXMKKyAgLy8vIGluIGFuIEF0b20uICBDb25jcmV0ZSBpbnN0YW5jZXMgb2YgRGVmaW5lZEF0b20gbXVzdCBpbXBsZW1lbnQKKyAgLy8vIHRoZSBkZXJlZkl0ZXJhdG9yKCkgYW5kIGluY3JlbWVudEl0ZXJhdG9yKCkgbWV0aG9kcy4KKyAgY2xhc3MgcmVmZXJlbmNlX2l0ZXJhdG9yIHsKKyAgcHVibGljOgorICAgIHJlZmVyZW5jZV9pdGVyYXRvcihjb25zdCBEZWZpbmVkQXRvbSAmYSwgY29uc3Qgdm9pZCAqaXQpCisgICAgICA6IF9hdG9tKGEpLCBfaXQoaXQpIHsgfQorCisgICAgY29uc3QgUmVmZXJlbmNlICpvcGVyYXRvciooKSBjb25zdCB7CisgICAgICByZXR1cm4gX2F0b20uZGVyZWZJdGVyYXRvcihfaXQpOworICAgIH0KKworICAgIGNvbnN0IFJlZmVyZW5jZSAqb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfYXRvbS5kZXJlZkl0ZXJhdG9yKF9pdCk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHJlZmVyZW5jZV9pdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfaXQgPT0gb3RoZXIuX2l0OworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCByZWZlcmVuY2VfaXRlcmF0b3IgJm90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgcmVmZXJlbmNlX2l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgICAgX2F0b20uaW5jcmVtZW50SXRlcmF0b3IoX2l0KTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgIHByaXZhdGU6CisgICAgY29uc3QgRGVmaW5lZEF0b20gJl9hdG9tOworICAgIGNvbnN0IHZvaWQgKl9pdDsKKyAgfTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzIEF0b20ncyBSZWZlcmVuY2VzLgorICB2aXJ0dWFsIHJlZmVyZW5jZV9pdGVyYXRvciBiZWdpbigpIGNvbnN0ID0gMDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGlzIEF0b20ncyBSZWZlcmVuY2VzLgorICB2aXJ0dWFsIHJlZmVyZW5jZV9pdGVyYXRvciBlbmQoKSBjb25zdCA9IDA7CisKKyAgLy8vIEFkZHMgYSByZWZlcmVuY2UgdG8gdGhpcyBhdG9tLgorICB2aXJ0dWFsIHZvaWQgYWRkUmVmZXJlbmNlKFJlZmVyZW5jZTo6S2luZE5hbWVzcGFjZSBucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2U6OktpbmRBcmNoIGFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlOjpLaW5kVmFsdWUga2luZFZhbHVlLCB1aW50NjRfdCBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXRvbSAqdGFyZ2V0LCBSZWZlcmVuY2U6OkFkZGVuZCBhKSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiU3ViY2xhc3MgZG9lcyBub3QgcGVybWl0IGFkZGluZyByZWZlcmVuY2VzIik7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0b20gKmEpIHsKKyAgICByZXR1cm4gYS0+ZGVmaW5pdGlvbigpID09IGRlZmluaXRpb25SZWd1bGFyOworICB9CisKKyAgLy8vIFV0aWxpdHkgZm9yIGRlcml2aW5nIHBlcm1pc3Npb25zIGZyb20gY29udGVudCB0eXBlCisgIHN0YXRpYyBDb250ZW50UGVybWlzc2lvbnMgcGVybWlzc2lvbnMoQ29udGVudFR5cGUgdHlwZSk7CisKKyAgLy8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGF0b20gb2NjdXBpZXMgZmlsZSBzcGFjZQorICBib29sIG9jY3VwaWVzRGlza1NwYWNlKCkgY29uc3QgeworICAgIENvbnRlbnRUeXBlIGF0b21Db250ZW50VHlwZSA9IGNvbnRlbnRUeXBlKCk7CisgICAgcmV0dXJuICEoYXRvbUNvbnRlbnRUeXBlID09IERlZmluZWRBdG9tOjp0eXBlWmVyb0ZpbGwgfHwKKyAgICAgICAgICAgICBhdG9tQ29udGVudFR5cGUgPT0gRGVmaW5lZEF0b206OnR5cGVaZXJvRmlsbEZhc3QgfHwKKyAgICAgICAgICAgICBhdG9tQ29udGVudFR5cGUgPT0gRGVmaW5lZEF0b206OnR5cGVUTFZJbml0aWFsWmVyb0ZpbGwpOworICB9CisKKyAgLy8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgcmVsb2NhdGlvbnMgaW4gdGhpcyBhdG9tIHRvIG90aGVyIGRlZmluZWQKKyAgLy8vIGF0b21zIGNhbiBiZSBpbXBsaWNpdGx5IGdlbmVyYXRlZCwgYW5kIHNvIHdlIGRvbid0IG5lZWQgdG8gZXhwbGljaXRseQorICAvLy8gZW1pdCB0aG9zZSByZWxvY2F0aW9ucy4KKyAgYm9vbCByZWxvY3NUb0RlZmluZWRDYW5CZUltcGxpY2l0KCkgY29uc3QgeworICAgIENvbnRlbnRUeXBlIGF0b21Db250ZW50VHlwZSA9IGNvbnRlbnRUeXBlKCk7CisgICAgcmV0dXJuIGF0b21Db250ZW50VHlwZSA9PSB0eXBlQ0ZJOworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8gRGVmaW5lZEF0b20gaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcy4gT25seSBzdWJjbGFzc2VzIGNhbiBhY2Nlc3MKKyAgLy8gY29uc3RydWN0b3IuCisgIERlZmluZWRBdG9tKCkgOiBBdG9tKGRlZmluaXRpb25SZWd1bGFyKSB7IH0KKworICB+RGVmaW5lZEF0b20oKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgUmVmZXJlbmNlIG9iamVjdCB0aGF0IHRoZSBhYnN0cmFjdAorICAvLy8gaXRlcmF0b3IgInBvaW50cyIgdG8uCisgIHZpcnR1YWwgY29uc3QgUmVmZXJlbmNlICpkZXJlZkl0ZXJhdG9yKGNvbnN0IHZvaWQgKml0ZXIpIGNvbnN0ID0gMDsKKworICAvLy8gXGJyaWVmIEFkanVzdHMgdGhlIGFic3RyYWN0IGl0ZXJhdG9yIHRvICJwb2ludCIgdG8gdGhlIG5leHQgUmVmZXJlbmNlCisgIC8vLyBvYmplY3QgZm9yIHRoaXMgQXRvbS4KKyAgdmlydHVhbCB2b2lkIGluY3JlbWVudEl0ZXJhdG9yKGNvbnN0IHZvaWQgKiZpdGVyKSBjb25zdCA9IDA7Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIGxsZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL0Vycm9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9FcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YTM2NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9FcnJvci5oCkBAIC0wLDAgKzEsNjggQEAKKy8vPT09LSBFcnJvci5oIC0gc3lzdGVtX2Vycm9yIGV4dGVuc2lvbnMgZm9yIGxsZCAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBkZWNsYXJlcyBhIG5ldyBlcnJvcl9jYXRlZ29yeSBmb3IgdGhlIGxsZCBsaWJyYXJ5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExEX0NPUkVfRVJST1JfSAorI2RlZmluZSBMTERfQ09SRV9FUlJPUl9ICisKKyNpbmNsdWRlICJsbGQvQ29tbW9uL0xMVk0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsZCB7CisKK2NvbnN0IHN0ZDo6ZXJyb3JfY2F0ZWdvcnkgJllhbWxSZWFkZXJDYXRlZ29yeSgpOworCitlbnVtIGNsYXNzIFlhbWxSZWFkZXJFcnJvciB7CisgIHVua25vd25fa2V5d29yZCwKKyAgaWxsZWdhbF92YWx1ZQorfTsKKworaW5saW5lIHN0ZDo6ZXJyb3JfY29kZSBtYWtlX2Vycm9yX2NvZGUoWWFtbFJlYWRlckVycm9yIGUpIHsKKyAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZShzdGF0aWNfY2FzdDxpbnQ+KGUpLCBZYW1sUmVhZGVyQ2F0ZWdvcnkoKSk7Cit9CisKKy8vLyBDcmVhdGVzIGFuIGVycm9yX2NvZGUgb2JqZWN0IHRoYXQgaGFzIGFzc29jaWF0ZWQgd2l0aCBpdCBhbiBhcmJpdHJhcnkKKy8vLyBlcnJvciBtZXNzc2FnZS4gIFRoZSB2YWx1ZSgpIG9mIHRoZSBlcnJvcl9jb2RlIHdpbGwgYWx3YXlzIGJlIG5vbi16ZXJvCisvLy8gYnV0IGl0cyB2YWx1ZSBpcyBtZWFuaW5nbGVzcy4gVGhlIG1lc3NzYWdlKCkgd2lsbCBiZSAoYSBjb3B5IG9mKSB0aGUKKy8vLyBzdXBwbGllZCBlcnJvciBzdHJpbmcuCisvLy8gTm90ZTogIE9uY2UgRXJyb3JPcjw+IGlzIHVwZGF0ZWQgdG8gd29yayB3aXRoIGVycm9ycyBvdGhlciB0aGFuIGVycm9yX2NvZGUsCisvLy8gdGhpcyBjYW4gYmUgdXBkYXRlZCB0byByZXR1cm4gc29tZSBvdGhlciBraW5kIG9mIGVycm9yLgorc3RkOjplcnJvcl9jb2RlIG1ha2VfZHluYW1pY19lcnJvcl9jb2RlKFN0cmluZ1JlZiBtc2cpOworCisvLy8gR2VuZXJpYyBlcnJvci4KKy8vLworLy8vIEZvciBlcnJvcnMgdGhhdCBkb24ndCByZXF1aXJlIHRoZWlyIG93biBzcGVjaWZpYyBzdWItZXJyb3IgKG1vc3QgZXJyb3JzKQorLy8vIHRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGVycm9yIHZpYSBhIHN0cmluZyBtZXNzYWdlLgorY2xhc3MgR2VuZXJpY0Vycm9yIDogcHVibGljIGxsdm06OkVycm9ySW5mbzxHZW5lcmljRXJyb3I+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIEdlbmVyaWNFcnJvcihUd2luZSBNc2cpOworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIE1zZzsgfQorICB2b2lkIGxvZyhsbHZtOjpyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6ZXJyb3JfY29kZSBjb252ZXJ0VG9FcnJvckNvZGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIG1ha2VfZHluYW1pY19lcnJvcl9jb2RlKGdldE1lc3NhZ2UoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgTXNnOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsZAorCituYW1lc3BhY2Ugc3RkIHsKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc19lcnJvcl9jb2RlX2VudW08bGxkOjpZYW1sUmVhZGVyRXJyb3I+IDogc3RkOjp0cnVlX3R5cGUge307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvRmlsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvRmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNDE4NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9GaWxlLmgKQEAgLTAsMCArMSwyNzggQEAKKy8vPT09LSBDb3JlL0ZpbGUuaCAtIEEgQ29udGFpbmVyIG9mIEF0b21zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExEX0NPUkVfRklMRV9ICisjZGVmaW5lIExMRF9DT1JFX0ZJTEVfSAorCisjaW5jbHVkZSAibGxkL0NvcmUvQWJzb2x1dGVBdG9tLmgiCisjaW5jbHVkZSAibGxkL0NvcmUvRGVmaW5lZEF0b20uaCIKKyNpbmNsdWRlICJsbGQvQ29yZS9TaGFyZWRMaWJyYXJ5QXRvbS5oIgorI2luY2x1ZGUgImxsZC9Db3JlL1VuZGVmaW5lZEF0b20uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbGQgeworCitjbGFzcyBMaW5raW5nQ29udGV4dDsKKworLy8vIEV2ZXJ5IEF0b20gaXMgb3duZWQgYnkgc29tZSBGaWxlLiBBIGNvbW1vbiBzY2VuYXJpbyBpcyBmb3IgYSBzaW5nbGUKKy8vLyBvYmplY3QgZmlsZSAoLm8pIHRvIGJlIHBhcnNlZCBieSBzb21lIHJlYWRlciBhbmQgcHJvZHVjZSBhIHNpbmdsZQorLy8vIEZpbGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgY29udGVudCBvZiB0aGF0IG9iamVjdCBmaWxlLgorLy8vCisvLy8gVG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBBdG9tcyBpbiBhIEZpbGUgdGhlcmUgYXJlIGZvdXIgbWV0aG9kcyB0aGF0CisvLy8gcmV0dXJuIGNvbGxlY3Rpb25zLiAgRm9yIGluc3RhbmNlIHRvIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIERlZmluZWRBdG9tcworLy8vIGluIGEgRmlsZSBvYmplY3QgdXNlOgorLy8vICAgICAgZm9yIChjb25zdCBEZWZpbmVkQXRvbXMgKmF0b20gOiBmaWxlLT5kZWZpbmVkKCkpIHsKKy8vLyAgICAgIH0KKy8vLworLy8vIFRoZSBBdG9tIG9iamVjdHMgaW4gYSBGaWxlIGFyZSBvd25lZCBieSB0aGUgRmlsZSBvYmplY3QuICBUaGUgQXRvbSBvYmplY3RzCisvLy8gYXJlIGRlc3Ryb3llZCB3aGVuIHRoZSBGaWxlIG9iamVjdCBpcyBkZXN0cm95ZWQuCitjbGFzcyBGaWxlIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+RmlsZSgpOworCisgIC8vLyBcYnJpZWYgS2luZHMgb2YgZmlsZXMgdGhhdCBhcmUgc3VwcG9ydGVkLgorICBlbnVtIEtpbmQgeworICAgIGtpbmRFcnJvck9iamVjdCwgICAgICAgICAgLy8vPCBhIGVycm9yIG9iamVjdCBmaWxlICgubykKKyAgICBraW5kTm9ybWFsaXplZE9iamVjdCwgICAgIC8vLzwgYSBub3JtYWxpemVkIGZpbGUgKC5vKQorICAgIGtpbmRNYWNoT2JqZWN0LCAgICAgICAgICAgLy8vPCBhIE1hY2hPIG9iamVjdCBmaWxlICgubykKKyAgICBraW5kQ0VudHJ5T2JqZWN0LCAgICAgICAgIC8vLzwgYSBmaWxlIGZvciBDRW50cmllcworICAgIGtpbmRIZWFkZXJPYmplY3QsICAgICAgICAgLy8vPCBhIGZpbGUgZm9yIGZpbGUgaGVhZGVycworICAgIGtpbmRFbnRyeU9iamVjdCwgICAgICAgICAgLy8vPCBhIGZpbGUgZm9yIHRoZSBlbnRyeQorICAgIGtpbmRVbmRlZmluZWRTeW1zT2JqZWN0LCAgLy8vPCBhIGZpbGUgZm9yIHVuZGVmaW5lZCBzeW1ib2xzCisgICAga2luZFN0dWJIZWxwZXJPYmplY3QsICAgICAvLy88IGEgZmlsZSBmb3Igc3R1YiBoZWxwZXJzCisgICAga2luZFJlc29sdmVyTWVyZ2VkT2JqZWN0LCAvLy88IHRoZSByZXNvbHZlciBtZXJnZWQgZmlsZS4KKyAgICBraW5kU2VjdENyZWF0ZU9iamVjdCwgICAgIC8vLzwgYSBzZWN0IGNyZWF0ZSBvYmplY3QgZmlsZSAoLm8pCisgICAga2luZFNoYXJlZExpYnJhcnksICAgICAgICAvLy88IHNoYXJlZCBsaWJyYXJ5ICguc28pCisgICAga2luZEFyY2hpdmVMaWJyYXJ5ICAgICAgICAvLy88IGFyY2hpdmUgKC5hKQorICB9OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyBmaWxlIGtpbmQuICBOZWVkIGZvciBkeW5fY2FzdDw+IG9uIEZpbGUgb2JqZWN0cy4KKyAgS2luZCBraW5kKCkgY29uc3QgeworICAgIHJldHVybiBfa2luZDsKKyAgfQorCisgIC8vLyBUaGlzIHJldHVybnMgdGhlIHBhdGggdG8gdGhlIGZpbGUgd2hpY2ggd2FzIHVzZWQgdG8gY3JlYXRlIHRoaXMgb2JqZWN0CisgIC8vLyAoZS5nLiAiL3RtcC9mb28ubyIpLiBJZiB0aGUgZmlsZSBpcyBhIG1lbWJlciBvZiBhbiBhcmNoaXZlIGZpbGUsIHRoZQorICAvLy8gcmV0dXJuZWQgc3RyaW5nIGluY2x1ZGVzIHRoZSBhcmNoaXZlIGZpbGUgbmFtZS4KKyAgU3RyaW5nUmVmIHBhdGgoKSBjb25zdCB7CisgICAgaWYgKF9hcmNoaXZlUGF0aC5lbXB0eSgpKQorICAgICAgcmV0dXJuIF9wYXRoOworICAgIGlmIChfYXJjaGl2ZU1lbWJlclBhdGguZW1wdHkoKSkKKyAgICAgIF9hcmNoaXZlTWVtYmVyUGF0aCA9IChfYXJjaGl2ZVBhdGggKyAiKCIgKyBfcGF0aCArICIpIikuc3RyKCk7CisgICAgcmV0dXJuIF9hcmNoaXZlTWVtYmVyUGF0aDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBhcmNoaXZlIGZpbGUgbmFtZSBpZiB0aGlzIGZpbGUgaXMgaW5zdGFudGlhdGVkCisgIC8vLyBmcm9tIGFuIGFyY2hpdmUgZmlsZS4gT3RoZXJ3aXNlIHJldHVybnMgdGhlIGVtcHR5IHN0cmluZy4KKyAgU3RyaW5nUmVmIGFyY2hpdmVQYXRoKCkgY29uc3QgeyByZXR1cm4gX2FyY2hpdmVQYXRoOyB9CisgIHZvaWQgc2V0QXJjaGl2ZVBhdGgoU3RyaW5nUmVmIHBhdGgpIHsgX2FyY2hpdmVQYXRoID0gcGF0aDsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBwYXRoIG5hbWUgb2YgdGhpcyBmaWxlLiBJdCBkb2Vzbid0IGluY2x1ZGUgYXJjaGl2ZSBmaWxlIG5hbWUuCisgIFN0cmluZ1JlZiBtZW1iZXJQYXRoKCkgY29uc3QgeyByZXR1cm4gX3BhdGg7IH0KKworICAvLy8gUmV0dXJucyB0aGUgY29tbWFuZCBsaW5lIG9yZGVyIG9mIHRoZSBmaWxlLgorICB1aW50NjRfdCBvcmRpbmFsKCkgY29uc3QgeworICAgIGFzc2VydChfb3JkaW5hbCAhPSBVSU5UNjRfTUFYKTsKKyAgICByZXR1cm4gX29yZGluYWw7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlL2ZhbHNlIGRlcGVuZGluZyBvbiB3aGV0aGVyIGFuIG9yZGluYWwgaGFzIGJlZW4gc2V0LgorICBib29sIGhhc09yZGluYWwoKSBjb25zdCB7IHJldHVybiAoX29yZGluYWwgIT0gVUlOVDY0X01BWCk7IH0KKworICAvLy8gU2V0cyB0aGUgY29tbWFuZCBsaW5lIG9yZGVyIG9mIHRoZSBmaWxlLgorICB2b2lkIHNldE9yZGluYWwodWludDY0X3Qgb3JkaW5hbCkgY29uc3QgeyBfb3JkaW5hbCA9IG9yZGluYWw7IH0KKworICAvLy8gUmV0dXJucyB0aGUgb3JkaW5hbCBmb3IgdGhlIG5leHQgYXRvbSB0byBiZSBkZWZpbmVkIGluIHRoaXMgZmlsZS4KKyAgdWludDY0X3QgZ2V0TmV4dEF0b21PcmRpbmFsQW5kSW5jcmVtZW50KCkgY29uc3QgeworICAgIHJldHVybiBfbmV4dEF0b21PcmRpbmFsKys7CisgIH0KKworICAvLy8gRm9yIGFsbG9jYXRpbmcgYW55IG9iamVjdHMgb3duZWQgYnkgdGhpcyBGaWxlLgorICBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yICZhbGxvY2F0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIF9hbGxvY2F0b3I7CisgIH0KKworICAvLy8gVGhlIHR5cGUgb2YgYXRvbSBtdXRhYmxlIGNvbnRhaW5lci4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHVzaW5nIEF0b21WZWN0b3IgPSBzdGQ6OnZlY3RvcjxPd25pbmdBdG9tUHRyPFQ+PjsKKworICAvLy8gVGhlIHJhbmdlIHR5cGUgZm9yIHRoZSBhdG9tcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEF0b21SYW5nZSB7CisgIHB1YmxpYzoKKyAgICBBdG9tUmFuZ2UoQXRvbVZlY3RvcjxUPiAmdikgOiBfdih2KSB7fQorICAgIEF0b21SYW5nZShjb25zdCBBdG9tVmVjdG9yPFQ+ICZ2KSA6IF92KGNvbnN0X2Nhc3Q8QXRvbVZlY3RvcjxUPiAmPih2KSkge30KKworICAgIHR5cGVkZWYgc3RkOjpwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uPGNvbnN0IE93bmluZ0F0b21QdHI8VD4mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQqPiBDb25zdERlcmVmRm47CisKKyAgICB0eXBlZGVmIHN0ZDo6cG9pbnRlcl90b191bmFyeV9mdW5jdGlvbjxPd25pbmdBdG9tUHRyPFQ+JiwgVCo+IERlcmVmRm47CisKKyAgICB0eXBlZGVmIGxsdm06Om1hcHBlZF9pdGVyYXRvcjx0eXBlbmFtZSBBdG9tVmVjdG9yPFQ+Ojpjb25zdF9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdERlcmVmRm4+IENvbnN0SXRUeTsKKyAgICB0eXBlZGVmIGxsdm06Om1hcHBlZF9pdGVyYXRvcjx0eXBlbmFtZSBBdG9tVmVjdG9yPFQ+OjppdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXJlZkZuPiBJdFR5OworCisgICAgc3RhdGljIGNvbnN0IFQqIERlcmVmQ29uc3QoY29uc3QgT3duaW5nQXRvbVB0cjxUPiAmcCkgeworICAgICAgcmV0dXJuIHAuZ2V0KCk7CisgICAgfQorCisgICAgc3RhdGljIFQqIERlcmVmKE93bmluZ0F0b21QdHI8VD4gJnApIHsKKyAgICAgIHJldHVybiBwLmdldCgpOworICAgIH0KKworICAgIENvbnN0SXRUeSBiZWdpbigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBDb25zdEl0VHkoX3YuYmVnaW4oKSwgQ29uc3REZXJlZkZuKERlcmVmQ29uc3QpKTsKKyAgICB9CisgICAgQ29uc3RJdFR5IGVuZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBDb25zdEl0VHkoX3YuZW5kKCksIENvbnN0RGVyZWZGbihEZXJlZkNvbnN0KSk7CisgICAgfQorCisgICAgSXRUeSBiZWdpbigpIHsKKyAgICAgIHJldHVybiBJdFR5KF92LmJlZ2luKCksIERlcmVmRm4oRGVyZWYpKTsKKyAgICB9CisgICAgSXRUeSBlbmQoKSB7CisgICAgICByZXR1cm4gSXRUeShfdi5lbmQoKSwgRGVyZWZGbihEZXJlZikpOworICAgIH0KKworICAgIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHR5cGVuYW1lIEF0b21WZWN0b3I8VD46Oml0ZXJhdG9yPiBvd25pbmdfcHRycygpIHsKKyAgICAgIHJldHVybiBsbHZtOjptYWtlX3JhbmdlKF92LmJlZ2luKCksIF92LmVuZCgpKTsKKyAgICB9CisKKyAgICBsbHZtOjppdGVyYXRvcl9yYW5nZTx0eXBlbmFtZSBBdG9tVmVjdG9yPFQ+OjppdGVyYXRvcj4gb3duaW5nX3B0cnMoKSBjb25zdCB7CisgICAgICByZXR1cm4gbGx2bTo6bWFrZV9yYW5nZShfdi5iZWdpbigpLCBfdi5lbmQoKSk7CisgICAgfQorCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdi5lbXB0eSgpOworICAgIH0KKworICAgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgcmV0dXJuIF92LnNpemUoKTsKKyAgICB9CisKKyAgICBjb25zdCBPd25pbmdBdG9tUHRyPFQ+ICZvcGVyYXRvcltdKHNpemVfdCBpZHgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBfdltpZHhdOworICAgIH0KKworICAgIE93bmluZ0F0b21QdHI8VD4gJm9wZXJhdG9yW10oc2l6ZV90IGlkeCkgeworICAgICAgcmV0dXJuIF92W2lkeF07CisgICAgfQorCisgIHByaXZhdGU6CisgICAgQXRvbVZlY3RvcjxUPiAmX3Y7CisgIH07CisKKyAgLy8vIFxicmllZiBNdXN0IGJlIGltcGxlbWVudGVkIHRvIHJldHVybiB0aGUgQXRvbVZlY3RvciBvYmplY3QgZm9yCisgIC8vLyBhbGwgRGVmaW5lZEF0b21zIGluIHRoaXMgRmlsZS4KKyAgdmlydHVhbCBjb25zdCBBdG9tUmFuZ2U8RGVmaW5lZEF0b20+IGRlZmluZWQoKSBjb25zdCA9IDA7CisKKyAgLy8vIFxicmllZiBNdXN0IGJlIGltcGxlbWVudGVkIHRvIHJldHVybiB0aGUgQXRvbVZlY3RvciBvYmplY3QgZm9yCisgIC8vLyBhbGwgVW5kZWZpbmVkQXRvbXcgaW4gdGhpcyBGaWxlLgorICB2aXJ0dWFsIGNvbnN0IEF0b21SYW5nZTxVbmRlZmluZWRBdG9tPiB1bmRlZmluZWQoKSBjb25zdCA9IDA7CisKKyAgLy8vIFxicmllZiBNdXN0IGJlIGltcGxlbWVudGVkIHRvIHJldHVybiB0aGUgQXRvbVZlY3RvciBvYmplY3QgZm9yCisgIC8vLyBhbGwgU2hhcmVkTGlicmFyeUF0b21zIGluIHRoaXMgRmlsZS4KKyAgdmlydHVhbCBjb25zdCBBdG9tUmFuZ2U8U2hhcmVkTGlicmFyeUF0b20+IHNoYXJlZExpYnJhcnkoKSBjb25zdCA9IDA7CisKKyAgLy8vIFxicmllZiBNdXN0IGJlIGltcGxlbWVudGVkIHRvIHJldHVybiB0aGUgQXRvbVZlY3RvciBvYmplY3QgZm9yCisgIC8vLyBhbGwgQWJzb2x1dGVBdG9tcyBpbiB0aGlzIEZpbGUuCisgIHZpcnR1YWwgY29uc3QgQXRvbVJhbmdlPEFic29sdXRlQXRvbT4gYWJzb2x1dGUoKSBjb25zdCA9IDA7CisKKyAgLy8vIERyb3AgYWxsIG9mIHRoZSBhdG9tcyBvd25lZCBieSB0aGlzIGZpbGUuICBUaGlzIHdpbGwgcmVzdWx0IGluIGFsbCBvZgorICAvLy8gdGhlIGF0b21zIHJ1bm5pbmcgdGhlaXIgZGVzdHJ1Y3RvcnMuCisgIC8vLyBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgYXRvbXMgbWF5IGJlIGFsbG9jYXRlZCBvbiBhIEJ1bXBQdHJBbGxvY2F0b3IKKyAgLy8vIG9mIGEgZGlmZmVyZW50IGZpbGUuICBXZSBuZWVkIHRvIGRlc3RydWN0IGFsbCBhdG9tcyBiZWZvcmUgYW55IGZpbGVzLgorICB2aXJ0dWFsIHZvaWQgY2xlYXJBdG9tcygpID0gMDsKKworICAvLy8gXGJyaWVmIElmIGEgZmlsZSBpcyBwYXJzZWQgdXNpbmcgYSBkaWZmZXJlbnQgbWV0aG9kIHRoYW4gZG9QYXJzZSgpLAorICAvLy8gb25lIG11c3QgdXNlIHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgbGFzdCBlcnJvciBzdGF0dXMsIHNvIHRoYXQKKyAgLy8vIGRvUGFyc2Ugd2lsbCBub3QgYmUgY2FsbGVkIHR3aWNlLiBPbmx5IFlBTUwgcmVhZGVyIHVzZXMgdGhpcworICAvLy8gKGJlY2F1c2UgWUFNTCByZWFkZXIgZG9lcyBub3QgcmVhZCBibG9icyBidXQgc3RydWN0dXJlZCBkYXRhKS4KKyAgdm9pZCBzZXRMYXN0RXJyb3Ioc3RkOjplcnJvcl9jb2RlIGVycikgeyBfbGFzdEVycm9yID0gZXJyOyB9CisKKyAgc3RkOjplcnJvcl9jb2RlIHBhcnNlKCk7CisKKyAgLy8gVXN1YWxseSBlYWNoIGZpbGUgb3ducyBhIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+LgorICAvLyBIb3dldmVyLCB0aGVyZSdzIG9uZSBzcGVjaWFsIGNhc2UuIElmIGEgZmlsZSBpcyBhbiBhcmNoaXZlIGZpbGUsCisgIC8vIHRoZSBhcmNoaXZlIGZpbGUgYW5kIGl0cyBjaGlsZHJlbiBhbGwgc2hhcmVzIHRoZSBzYW1lIG1lbW9yeSBidWZmZXIuCisgIC8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIEFyY2hpdmVGaWxlIHRvIGdpdmUgaXRzIGNoaWxkcmVuCisgIC8vIGNvLW93bmVyc2hpcCBvZiB0aGUgYnVmZmVyLgorICB2b2lkIHNldFNoYXJlZE1lbW9yeUJ1ZmZlcihzdGQ6OnNoYXJlZF9wdHI8TWVtb3J5QnVmZmVyPiBtYikgeworICAgIF9zaGFyZWRNZW1vcnlCdWZmZXIgPSBtYjsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8vLyBcYnJpZWYgb25seSBzdWJjbGFzc2VzIG9mIEZpbGUgY2FuIGJlIGluc3RhbnRpYXRlZAorICBGaWxlKFN0cmluZ1JlZiBwLCBLaW5kIGtpbmQpCisgICAgOiBfcGF0aChwKSwgX2tpbmQoa2luZCksIF9vcmRpbmFsKFVJTlQ2NF9NQVgpLAorICAgICAgX25leHRBdG9tT3JkaW5hbCgwKSB7fQorCisgIC8vLyBcYnJpZWYgU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcGFyc2UgdGhlCisgIC8vLyBtZW1vcnkgYnVmZmVyIHBhc3NlZCB0byB0aGlzIGZpbGUncyBjb25zdHJ1Y3Rvci4KKyAgdmlydHVhbCBzdGQ6OmVycm9yX2NvZGUgZG9QYXJzZSgpIHsgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOyB9CisKKyAgc3RhdGljIEF0b21WZWN0b3I8RGVmaW5lZEF0b20+IF9ub0RlZmluZWRBdG9tczsKKyAgc3RhdGljIEF0b21WZWN0b3I8VW5kZWZpbmVkQXRvbT4gX25vVW5kZWZpbmVkQXRvbXM7CisgIHN0YXRpYyBBdG9tVmVjdG9yPFNoYXJlZExpYnJhcnlBdG9tPiBfbm9TaGFyZWRMaWJyYXJ5QXRvbXM7CisgIHN0YXRpYyBBdG9tVmVjdG9yPEFic29sdXRlQXRvbT4gX25vQWJzb2x1dGVBdG9tczsKKyAgbXV0YWJsZSBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yIF9hbGxvY2F0b3I7CisKK3ByaXZhdGU6CisgIFN0cmluZ1JlZiBfcGF0aDsKKyAgc3RkOjpzdHJpbmcgX2FyY2hpdmVQYXRoOworICBtdXRhYmxlIHN0ZDo6c3RyaW5nIF9hcmNoaXZlTWVtYmVyUGF0aDsKKyAgS2luZCAgICAgICAgICAgICAgX2tpbmQ7CisgIG11dGFibGUgdWludDY0X3QgIF9vcmRpbmFsOworICBtdXRhYmxlIHVpbnQ2NF90IF9uZXh0QXRvbU9yZGluYWw7CisgIHN0ZDo6c2hhcmVkX3B0cjxNZW1vcnlCdWZmZXI+IF9zaGFyZWRNZW1vcnlCdWZmZXI7CisgIGxsdm06Ok9wdGlvbmFsPHN0ZDo6ZXJyb3JfY29kZT4gX2xhc3RFcnJvcjsKKyAgc3RkOjptdXRleCBfcGFyc2VNdXRleDsKK307CisKKy8vLyBBbiBFcnJvckZpbGUgcmVwcmVzZW50cyBhIGZpbGUgdGhhdCBkb2Vzbid0IGV4aXN0LgorLy8vIElmIHlvdSB0cnkgdG8gcGFyc2UgYSBmaWxlIHdoaWNoIGRvZXNuJ3QgZXhpc3QsIGFuIGluc3RhbmNlIG9mIHRoaXMKKy8vLyBjbGFzcyB3aWxsIGJlIHJldHVybmVkLiBUaGF0J3MgcGFyc2UgbWV0aG9kIGFsd2F5cyByZXR1cm5zIGFuIGVycm9yLgorLy8vIFRoaXMgaXMgdXNlZnVsIHRvIGRlbGF5IGVycm9yaW5nIG9uIG5vbi1leGlzdGVudCBmaWxlcywgc28gdGhhdCB3ZQorLy8vIGNhbiBkbyB1bml0IHRlc3RpbmcgYSBkcml2ZXIgdXNpbmcgbm9uLWV4aXN0aW5nIGZpbGUgcGF0aHMuCitjbGFzcyBFcnJvckZpbGUgOiBwdWJsaWMgRmlsZSB7CitwdWJsaWM6CisgIEVycm9yRmlsZShTdHJpbmdSZWYgcGF0aCwgc3RkOjplcnJvcl9jb2RlIGVjKQorICAgICAgOiBGaWxlKHBhdGgsIGtpbmRFcnJvck9iamVjdCksIF9lYyhlYykge30KKworICBzdGQ6OmVycm9yX2NvZGUgZG9QYXJzZSgpIG92ZXJyaWRlIHsgcmV0dXJuIF9lYzsgfQorCisgIGNvbnN0IEF0b21SYW5nZTxEZWZpbmVkQXRvbT4gZGVmaW5lZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJpbnRlcm5hbCBlcnJvciIpOworICB9CisgIGNvbnN0IEF0b21SYW5nZTxVbmRlZmluZWRBdG9tPiB1bmRlZmluZWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiaW50ZXJuYWwgZXJyb3IiKTsKKyAgfQorICBjb25zdCBBdG9tUmFuZ2U8U2hhcmVkTGlicmFyeUF0b20+IHNoYXJlZExpYnJhcnkoKSBjb25zdCBvdmVycmlkZSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiaW50ZXJuYWwgZXJyb3IiKTsKKyAgfQorICBjb25zdCBBdG9tUmFuZ2U8QWJzb2x1dGVBdG9tPiBhYnNvbHV0ZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJpbnRlcm5hbCBlcnJvciIpOworICB9CisKKyAgdm9pZCBjbGVhckF0b21zKCkgb3ZlcnJpZGUgeworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6ZXJyb3JfY29kZSBfZWM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGxkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvSW5zdHJ1bWVudGF0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9JbnN0cnVtZW50YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjIzNzU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvSW5zdHJ1bWVudGF0aW9uLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8vPT09LSBpbmNsdWRlL0NvcmUvSW5zdHJ1bWVudGF0aW9uLmggLSBJbnN0cnVtZW50YXRpb24gQVBJIC0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBQcm92aWRlIGFuIEluc3RydW1lbnRhdGlvbiBBUEkgdGhhdCBvcHRpb25hbGx5IHVzZXMgVlR1bmUgaW50ZXJmYWNlcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTERfQ09SRV9JTlNUUlVNRU5UQVRJT05fSAorI2RlZmluZSBMTERfQ09SRV9JTlNUUlVNRU5UQVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2lmZGVmIExMRF9IQVNfVlRVTkUKKyMgaW5jbHVkZSA8aXR0bm90aWZ5Lmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGxsZCB7CisjaWZkZWYgTExEX0hBU19WVFVORQorLy8vIFxicmllZiBBIHVuaXF1ZSBnbG9iYWwgc2NvcGUgZm9yIGluc3RydW1lbnRhdGlvbiBkYXRhLgorLy8vCisvLy8gRG9tYWlucyBsYXN0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCBjYW5ub3QgYmUgZGVzdHJveWVkLgorLy8vIE11bHRpcGxlIERvbWFpbnMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIG5hbWUgcmVwcmVzZW50IHRoZSBzYW1lIGRvbWFpbi4KK2NsYXNzIERvbWFpbiB7CisgIF9faXR0X2RvbWFpbiAqX2RvbWFpbjsKKworcHVibGljOgorICBleHBsaWNpdCBEb21haW4oY29uc3QgY2hhciAqbmFtZSkgOiBfZG9tYWluKF9faXR0X2RvbWFpbl9jcmVhdGVBKG5hbWUpKSB7fQorCisgIG9wZXJhdG9yIF9faXR0X2RvbWFpbiAqKCkgY29uc3QgeyByZXR1cm4gX2RvbWFpbjsgfQorICBfX2l0dF9kb21haW4gKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBfZG9tYWluOyB9Cit9OworCisvLy8gXGJyaWVmIEEgZ2xvYmFsIHJlZmVyZW5jZSB0byBhIHN0cmluZyBjb25zdGFudC4KKy8vLworLy8vIFRoZXNlIGFyZSB1bmlxdWVkIGJ5IHRoZSBJVFQgcnVudGltZSBhbmQgY2Fubm90IGJlIGRlbGV0ZWQuIFRoZXkgYXJlIG5vdAorLy8vIHNwZWNpZmljIHRvIGEgZG9tYWluLgorLy8vCisvLy8gUHJlZmVyIHJldXNpbmcgYSBzaW5nbGUgU3RyaW5nSGFuZGxlIG92ZXIgcGFzc2luZyBhIG50YnMgd2hlbiB0aGUgc2FtZQorLy8vIHN0cmluZyB3aWxsIGJlIHVzZWQgb2Z0ZW4uCitjbGFzcyBTdHJpbmdIYW5kbGUgeworICBfX2l0dF9zdHJpbmdfaGFuZGxlICpfaGFuZGxlOworCitwdWJsaWM6CisgIFN0cmluZ0hhbmRsZShjb25zdCBjaGFyICpuYW1lKSA6IF9oYW5kbGUoX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBKG5hbWUpKSB7fQorCisgIG9wZXJhdG9yIF9faXR0X3N0cmluZ19oYW5kbGUgKigpIGNvbnN0IHsgcmV0dXJuIF9oYW5kbGU7IH0KK307CisKKy8vLyBcYnJpZWYgQSB0YXNrIG9uIGEgc2luZ2xlIHRocmVhZC4gTmVzdHMgd2l0aGluIG90aGVyIHRhc2tzLgorLy8vCisvLy8gRWFjaCB0aHJlYWQgaGFzIGl0cyBvd24gdGFzayBzdGFjayBhbmQgdGFza3MgbmVzdCByZWN1cnNpdmVseSBvbiB0aGF0IHN0YWNrLgorLy8vIEEgdGFzayBjYW5ub3QgdHJhbnNmZXIgdGhyZWFkcy4KKy8vLworLy8vIFNCUk0gaXMgdXNlZCB0byBlbnN1cmUgdGFzayBzdGFydHMgYW5kIGVuZHMgYXJlIGJhbGxhbmNlZC4gVGhlIGxpZmV0aW1lIG9mCisvLy8gYSB0YXNrIGlzIGVpdGhlciB0aGUgbGlmZXRpbWUgb2YgdGhpcyBvYmplY3QsIG9yIHVudGlsIGVuZCBpcyBjYWxsZWQuCitjbGFzcyBTY29wZWRUYXNrIHsKKyAgX19pdHRfZG9tYWluICpfZG9tYWluOworCisgIFNjb3BlZFRhc2soY29uc3QgU2NvcGVkVGFzayAmKSA9IGRlbGV0ZTsKKyAgU2NvcGVkVGFzayAmb3BlcmF0b3I9KGNvbnN0IFNjb3BlZFRhc2sgJikgPSBkZWxldGU7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGUgYSB0YXNrIGluIERvbWFpbiBccCBkIG5hbWVkIFxwIHMuCisgIFNjb3BlZFRhc2soY29uc3QgRG9tYWluICZkLCBjb25zdCBTdHJpbmdIYW5kbGUgJnMpIDogX2RvbWFpbihkKSB7CisgICAgX19pdHRfdGFza19iZWdpbihkLCBfX2l0dF9udWxsLCBfX2l0dF9udWxsLCBzKTsKKyAgfQorCisgIFNjb3BlZFRhc2soU2NvcGVkVGFzayAmJm90aGVyKSB7CisgICAgKnRoaXMgPSBzdGQ6Om1vdmUob3RoZXIpOworICB9CisKKyAgU2NvcGVkVGFzayAmb3BlcmF0b3I9KFNjb3BlZFRhc2sgJiZvdGhlcikgeworICAgIF9kb21haW4gPSBvdGhlci5fZG9tYWluOworICAgIG90aGVyLl9kb21haW4gPSBudWxscHRyOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBcYnJpZWYgUHJlbWF0dXJlbHkgZW5kIHRoaXMgdGFzay4KKyAgdm9pZCBlbmQoKSB7CisgICAgaWYgKF9kb21haW4pCisgICAgICBfX2l0dF90YXNrX2VuZChfZG9tYWluKTsKKyAgICBfZG9tYWluID0gbnVsbHB0cjsKKyAgfQorCisgIH5TY29wZWRUYXNrKCkgeyBlbmQoKTsgfQorfTsKKworLy8vIFxicmllZiBBIHNwZWNpZmljIHBvaW50IGluIHRpbWUuIEFsbG93cyBtZXRhZGF0YSB0byBiZSBhc3NvY2lhdGVkLgorY2xhc3MgTWFya2VyIHsKK3B1YmxpYzoKKyAgTWFya2VyKGNvbnN0IERvbWFpbiAmZCwgY29uc3QgU3RyaW5nSGFuZGxlICZzKSB7CisgICAgX19pdHRfbWFya2VyKGQsIF9faXR0X251bGwsIHMsIF9faXR0X3Njb3BlX2dsb2JhbCk7CisgIH0KK307CisjZWxzZQorY2xhc3MgRG9tYWluIHsKK3B1YmxpYzoKKyAgRG9tYWluKGNvbnN0IGNoYXIgKm5hbWUpIHt9Cit9OworCitjbGFzcyBTdHJpbmdIYW5kbGUgeworcHVibGljOgorICBTdHJpbmdIYW5kbGUoY29uc3QgY2hhciAqbmFtZSkge30KK307CisKK2NsYXNzIFNjb3BlZFRhc2sgeworcHVibGljOgorICBTY29wZWRUYXNrKGNvbnN0IERvbWFpbiAmZCwgY29uc3QgU3RyaW5nSGFuZGxlICZzKSB7fQorICB2b2lkIGVuZCgpIHt9Cit9OworCitjbGFzcyBNYXJrZXIgeworcHVibGljOgorICBNYXJrZXIoY29uc3QgRG9tYWluICZkLCBjb25zdCBTdHJpbmdIYW5kbGUgJnMpIHt9Cit9OworI2VuZGlmCisKK2lubGluZSBjb25zdCBEb21haW4gJmdldERlZmF1bHREb21haW4oKSB7CisgIHN0YXRpYyBEb21haW4gZG9tYWluKCJvcmcubGx2bS5sbGQiKTsKKyAgcmV0dXJuIGRvbWFpbjsKK30KK30gLy8gZW5kIG5hbWVzcGFjZSBsbGQuCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvTGlua2luZ0NvbnRleHQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL0xpbmtpbmdDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI5NTEwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL0xpbmtpbmdDb250ZXh0LmgKQEAgLTAsMCArMSwyNTggQEAKKy8vPT09LSBsbGQvQ29yZS9MaW5raW5nQ29udGV4dC5oIC0gTGlua2VyIFRhcmdldCBJbmZvIEludGVyZmFjZSAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExEX0NPUkVfTElOS0lOR19DT05URVhUX0gKKyNkZWZpbmUgTExEX0NPUkVfTElOS0lOR19DT05URVhUX0gKKworI2luY2x1ZGUgImxsZC9Db3JlL05vZGUuaCIKKyNpbmNsdWRlICJsbGQvQ29yZS9SZWFkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbGQgeworCitjbGFzcyBQYXNzTWFuYWdlcjsKK2NsYXNzIEZpbGU7CitjbGFzcyBXcml0ZXI7CitjbGFzcyBOb2RlOworY2xhc3MgU2hhcmVkTGlicmFyeUZpbGU7CisKKy8vLyBcYnJpZWYgVGhlIExpbmtpbmdDb250ZXh0IGNsYXNzIGVuY2Fwc3VsYXRlcyAid2hhdCBhbmQgaG93IiB0byBsaW5rLgorLy8vCisvLy8gVGhlIGJhc2UgY2xhc3MgTGlua2luZ0NvbnRleHQgY29udGFpbnMgdGhlIG9wdGlvbnMgbmVlZGVkIGJ5IGNvcmUgbGlua2luZy4KKy8vLyBTdWJjbGFzc2VzIG9mIExpbmtpbmdDb250ZXh0IGhhdmUgYWRkaXRpb25hbCBvcHRpb25zIG5lZWRlZCBieSBzcGVjaWZpYworLy8vIFdyaXRlcnMuCitjbGFzcyBMaW5raW5nQ29udGV4dCB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkxpbmtpbmdDb250ZXh0KCk7CisKKyAgLy8vIFxuYW1lIE1ldGhvZHMgbmVlZGVkIGJ5IGNvcmUgbGlua2luZworICAvLy8gQHsKKworICAvLy8gTmFtZSBvZiBzeW1ib2wgbGlua2VyIHNob3VsZCB1c2UgYXMgImVudHJ5IHBvaW50IiB0byBwcm9ncmFtLAorICAvLy8gdXN1YWxseSAibWFpbiIgb3IgInN0YXJ0Ii4KKyAgdmlydHVhbCBTdHJpbmdSZWYgZW50cnlTeW1ib2xOYW1lKCkgY29uc3QgeyByZXR1cm4gX2VudHJ5U3ltYm9sTmFtZTsgfQorCisgIC8vLyBXaGV0aGVyIGNvcmUgbGlua2luZyBzaG91bGQgcmVtb3ZlIEF0b21zIG5vdCByZWFjaGFibGUgYnkgZm9sbG93aW5nCisgIC8vLyBSZWZlcmVuY2VzIGZyb20gdGhlIGVudHJ5IHBvaW50IEF0b20gb3IgZnJvbSBhbGwgZ2xvYmFsIHNjb3BlIEF0b21zCisgIC8vLyBpZiBnbG9iYWxzQXJlRGVhZFN0cmlwUm9vdHMoKSBpcyB0cnVlLgorICBib29sIGRlYWRTdHJpcCgpIGNvbnN0IHsgcmV0dXJuIF9kZWFkU3RyaXA7IH0KKworICAvLy8gT25seSB1c2VkIGlmIGRlYWRTdHJpcCgpIHJldHVybnMgdHJ1ZS4gIE1lYW5zIGFsbCBnbG9iYWwgc2NvcGUgQXRvbXMKKyAgLy8vIHNob3VsZCBiZSBtYXJrZWQgbGl2ZSAoYWxvbmcgd2l0aCBhbGwgQXRvbXMgdGhleSByZWZlcmVuY2UpLiAgVXN1YWxseQorICAvLy8gdGhpcyBtZXRob2QgcmV0dXJucyBmYWxzZSBmb3IgbWFpbiBleGVjdXRhYmxlcywgYnV0IHRydWUgZm9yIGR5bmFtaWMKKyAgLy8vIHNoYXJlZCBsaWJyYXJpZXMuCisgIGJvb2wgZ2xvYmFsc0FyZURlYWRTdHJpcFJvb3RzKCkgY29uc3QgeyByZXR1cm4gX2dsb2JhbHNBcmVEZWFkU3RyaXBSb290czsgfQorCisgIC8vLyBPbmx5IHVzZWQgaWYgZGVhZFN0cmlwKCkgcmV0dXJucyB0cnVlLiAgVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmFtZXMKKyAgLy8vIG9mIERlZmluZWRBdG9tcyB0aGF0IHNob3VsZCBiZSBtYXJrZWQgbGl2ZSAoYWxvbmcgd2l0aCBhbGwgQXRvbXMgdGhleQorICAvLy8gcmVmZXJlbmNlKS4gT25seSBBdG9tcyB3aXRoIHNjb3BlIHNjb3BlTGlua2FnZVVuaXQgb3Igc2NvcGVHbG9iYWwgY2FuCisgIC8vLyBiZSBrZXB0IGxpdmUgdXNpbmcgdGhpcyBtZXRob2QuCisgIEFycmF5UmVmPFN0cmluZ1JlZj4gZGVhZFN0cmlwUm9vdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF9kZWFkU3RyaXBSb290czsKKyAgfQorCisgIC8vLyBBZGQgdGhlIGdpdmVuIHN5bWJvbCBuYW1lIHRvIHRoZSBkZWFkIHN0cmlwIHJvb3Qgc2V0LiBPbmx5IHVzZWQgaWYKKyAgLy8vIGRlYWRTdHJpcCgpIHJldHVybnMgdHJ1ZS4KKyAgdm9pZCBhZGREZWFkU3RyaXBSb290KFN0cmluZ1JlZiBzeW1ib2xOYW1lKSB7CisgICAgYXNzZXJ0KCFzeW1ib2xOYW1lLmVtcHR5KCkgJiYgIkVtcHR5IHN5bWJvbCBjYW5ub3QgYmUgYSBkZWFkIHN0cmlwIHJvb3QiKTsKKyAgICBfZGVhZFN0cmlwUm9vdHMucHVzaF9iYWNrKHN5bWJvbE5hbWUpOworICB9CisKKyAgLy8vIE5vcm1hbGx5LCBldmVyeSBVbmRlZmluZWRBdG9tIG11c3QgYmUgcmVwbGFjZWQgYnkgYSBEZWZpbmVkQXRvbSBvciBhCisgIC8vLyBTaGFyZWRMaWJyYXJ5QXRvbSBmb3IgdGhlIGxpbmsgdG8gYmUgc3VjY2Vzc2Z1bC4gIFRoaXMgbWV0aG9kIGNvbnRyb2xzCisgIC8vLyB3aGV0aGVyIGNvcmUgbGlua2luZyBwcmludHMgb3V0IGEgbGlzdCBvZiByZW1haW5pbmcgVW5kZWZpbmVkQXRvbXMuCisgIC8vLworICAvLy8gXHRvZG8gVGhpcyBzaG91bGQgYmUgYSBtZXRob2QgY29yZSBsaW5raW5nIGNhbGxzIHdpdGggYSBsaXN0IG9mIHRoZQorICAvLy8gVW5kZWZpbmVkQXRvbXMgc28gdGhhdCBkaWZmZXJlbnQgZHJpdmVycyBjYW4gZm9ybWF0IHRoZSBlcnJvciBtZXNzYWdlCisgIC8vLyBhcyBuZWVkZWQuCisgIGJvb2wgcHJpbnRSZW1haW5pbmdVbmRlZmluZXMoKSBjb25zdCB7IHJldHVybiBfcHJpbnRSZW1haW5pbmdVbmRlZmluZXM7IH0KKworICAvLy8gTm9ybWFsbHksIGV2ZXJ5IFVuZGVmaW5lZEF0b20gbXVzdCBiZSByZXBsYWNlZCBieSBhIERlZmluZWRBdG9tIG9yIGEKKyAgLy8vIFNoYXJlZExpYnJhcnlBdG9tIGZvciB0aGUgbGluayB0byBiZSBzdWNjZXNzZnVsLiAgVGhpcyBtZXRob2QgY29udHJvbHMKKyAgLy8vIHdoZXRoZXIgY29yZSBsaW5raW5nIGNvbnNpZGVycyByZW1haW5pbmcgdW5kZWZpbmVzIHRvIGJlIGFuIGVycm9yLgorICBib29sIGFsbG93UmVtYWluaW5nVW5kZWZpbmVzKCkgY29uc3QgeyByZXR1cm4gX2FsbG93UmVtYWluaW5nVW5kZWZpbmVzOyB9CisKKyAgLy8vIE5vcm1hbGx5LCBldmVyeSBVbmRlZmluZWRBdG9tIG11c3QgYmUgcmVwbGFjZWQgYnkgYSBEZWZpbmVkQXRvbSBvciBhCisgIC8vLyBTaGFyZWRMaWJyYXJ5QXRvbSBmb3IgdGhlIGxpbmsgdG8gYmUgc3VjY2Vzc2Z1bC4gIFRoaXMgbWV0aG9kIGNvbnRyb2xzCisgIC8vLyB3aGV0aGVyIGNvcmUgbGlua2luZyBjb25zaWRlcnMgcmVtYWluaW5nIHVuZGVmaW5lcyBmcm9tIHRoZSBzaGFyZWQgbGlicmFyeQorICAvLy8gdG8gYmUgYW4gZXJyb3IuCisgIGJvb2wgYWxsb3dTaGxpYlVuZGVmaW5lcygpIGNvbnN0IHsgcmV0dXJuIF9hbGxvd1NobGliVW5kZWZpbmVzOyB9CisKKyAgLy8vIElmIHRydWUsIGNvcmUgbGlua2luZyB3aWxsIHdyaXRlIHRoZSBwYXRoIHRvIGVhY2ggaW5wdXQgZmlsZSB0byBzdGRvdXQKKyAgLy8vIChpLmUuIGxsdm06Om91dHMoKSkgYXMgaXQgaXMgdXNlZC4gIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIC10CisgIC8vLyBsaW5rZXIgb3B0aW9uLgorICAvLy8KKyAgLy8vIFx0b2RvIFRoaXMgc2hvdWxkIGJlIGEgbWV0aG9kIGNvcmUgbGlua2luZyBjYWxscyBzbyB0aGF0IGRyaXZlcnMgY2FuCisgIC8vLyBmb3JtYXQgdGhlIGxpbmUgYXMgbmVlZGVkLgorICBib29sIGxvZ0lucHV0RmlsZXMoKSBjb25zdCB7IHJldHVybiBfbG9nSW5wdXRGaWxlczsgfQorCisgIC8vLyBQYXJ0cyBvZiBMTFZNIHVzZSBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIGFyZSBib3VuZCB0byBjb21tYW5kIGxpbmUKKyAgLy8vIG9wdGlvbnMgKHNlZSBsbHZtOjpjbDo6T3B0aW9ucykuIFRoaXMgbWV0aG9kIHJldHVybnMgImNvbW1hbmQgbGluZSIKKyAgLy8vIG9wdGlvbnMgd2hpY2ggYXJlIHVzZWQgdG8gY29uZmlndXJlIExMVk0ncyBjb21tYW5kIGxpbmUgc2V0dGluZ3MuCisgIC8vLyBGb3IgaW5zdGFuY2UgdGhlIC1kZWJ1Zy1vbmx5IFhYWCBvcHRpb24gY2FuIGJlIHVzZWQgdG8gZHluYW1pY2FsbHkKKyAgLy8vIHRyYWNlIGRpZmZlcmVudCBwYXJ0cyBvZiBMTFZNIGFuZCBsbGQuCisgIEFycmF5UmVmPGNvbnN0IGNoYXIgKj4gbGx2bU9wdGlvbnMoKSBjb25zdCB7IHJldHVybiBfbGx2bU9wdGlvbnM7IH0KKworICAvLy8gXG5hbWUgTWV0aG9kcyB1c2VkIGJ5IERyaXZlcnMgdG8gY29uZmlndXJlIFRhcmdldEluZm8KKyAgLy8vIEB7CisgIHZvaWQgc2V0T3V0cHV0UGF0aChTdHJpbmdSZWYgc3RyKSB7IF9vdXRwdXRQYXRoID0gc3RyOyB9CisKKyAgLy8gU2V0IHRoZSBlbnRyeSBzeW1ib2wgbmFtZS4gWW91IG1heSBhbHNvIG5lZWQgdG8gY2FsbCBhZGREZWFkU3RyaXBSb290KCkgZm9yCisgIC8vIHRoZSBzeW1ib2wgaWYgeW91ciBwbGF0Zm9ybSBzdXBwb3J0cyBkZWFkLXN0cmlwcGluZywgc28gdGhhdCB0aGUgc3ltYm9sCisgIC8vIHdpbGwgbm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgb3V0cHV0LgorICB2b2lkIHNldEVudHJ5U3ltYm9sTmFtZShTdHJpbmdSZWYgbmFtZSkgeworICAgIF9lbnRyeVN5bWJvbE5hbWUgPSBuYW1lOworICB9CisKKyAgdm9pZCBzZXREZWFkU3RyaXBwaW5nKGJvb2wgZW5hYmxlKSB7IF9kZWFkU3RyaXAgPSBlbmFibGU7IH0KKyAgdm9pZCBzZXRHbG9iYWxzQXJlRGVhZFN0cmlwUm9vdHMoYm9vbCB2KSB7IF9nbG9iYWxzQXJlRGVhZFN0cmlwUm9vdHMgPSB2OyB9CisKKyAgdm9pZCBzZXRQcmludFJlbWFpbmluZ1VuZGVmaW5lcyhib29sIHByaW50KSB7CisgICAgX3ByaW50UmVtYWluaW5nVW5kZWZpbmVzID0gcHJpbnQ7CisgIH0KKworICB2b2lkIHNldEFsbG93UmVtYWluaW5nVW5kZWZpbmVzKGJvb2wgYWxsb3cpIHsKKyAgICBfYWxsb3dSZW1haW5pbmdVbmRlZmluZXMgPSBhbGxvdzsKKyAgfQorCisgIHZvaWQgc2V0QWxsb3dTaGxpYlVuZGVmaW5lcyhib29sIGFsbG93KSB7IF9hbGxvd1NobGliVW5kZWZpbmVzID0gYWxsb3c7IH0KKyAgdm9pZCBzZXRMb2dJbnB1dEZpbGVzKGJvb2wgbG9nKSB7IF9sb2dJbnB1dEZpbGVzID0gbG9nOyB9CisKKyAgdm9pZCBhcHBlbmRMTFZNT3B0aW9uKGNvbnN0IGNoYXIgKm9wdCkgeyBfbGx2bU9wdGlvbnMucHVzaF9iYWNrKG9wdCk7IH0KKworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Tm9kZT4+ICZnZXROb2RlcygpIHsgcmV0dXJuIF9ub2RlczsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Tm9kZT4+ICZnZXROb2RlcygpIGNvbnN0IHsgcmV0dXJuIF9ub2RlczsgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBhZGRzIHVuZGVmaW5lZCBzeW1ib2xzIHNwZWNpZmllZCBieSB0aGUgLXUgb3B0aW9uIHRvIHRoZSB0bworICAvLy8gdGhlIGxpc3Qgb2YgdW5kZWZpbmVkIHN5bWJvbHMga25vd24gdG8gdGhlIGxpbmtlci4gVGhpcyBvcHRpb24gZXNzZW50aWFsbHkKKyAgLy8vIGZvcmNlcyBhbiB1bmRlZmluZWQgc3ltYm9sIHRvIGJlIGNyZWF0ZWQuIFlvdSBtYXkgYWxzbyBuZWVkIHRvIGNhbGwKKyAgLy8vIGFkZERlYWRTdHJpcFJvb3QoKSBmb3IgdGhlIHN5bWJvbCBpZiB5b3VyIHBsYXRmb3JtIHN1cHBvcnRzIGRlYWQKKyAgLy8vIHN0cmlwcGluZywgc28gdGhhdCB0aGUgc3ltYm9sIHdpbGwgbm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgb3V0cHV0LgorICB2b2lkIGFkZEluaXRpYWxVbmRlZmluZWRTeW1ib2woU3RyaW5nUmVmIHN5bWJvbE5hbWUpIHsKKyAgICBfaW5pdGlhbFVuZGVmaW5lZFN5bWJvbHMucHVzaF9iYWNrKHN5bWJvbE5hbWUpOworICB9CisKKyAgLy8vIEl0ZXJhdG9ycyBmb3Igc3ltYm9scyB0aGF0IGFwcGVhciBvbiB0aGUgY29tbWFuZCBsaW5lLgorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gU3RyaW5nUmVmVmVjdG9yOworICB0eXBlZGVmIFN0cmluZ1JlZlZlY3Rvcjo6aXRlcmF0b3IgU3RyaW5nUmVmVmVjdG9ySXRlcjsKKyAgdHlwZWRlZiBTdHJpbmdSZWZWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIFN0cmluZ1JlZlZlY3RvckNvbnN0SXRlcjsKKworICAvLy8gQ3JlYXRlIGxpbmtlciBpbnRlcm5hbCBmaWxlcyBjb250YWluaW5nIGF0b21zIGZvciB0aGUgbGlua2VyIHRvIGluY2x1ZGUKKyAgLy8vIGR1cmluZyBsaW5rLiBGbGF2b3JzIGNhbiBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIHRoZWlyIExpbmtpbmdDb250ZXh0CisgIC8vLyB0byBhZGQgbW9yZSBpbnRlcm5hbCBmaWxlcy4gVGhlc2UgaW50ZXJuYWwgZmlsZXMgYXJlIHBvc2l0aW9uZWQgYmVmb3JlCisgIC8vLyB0aGUgYWN0dWFsIGlucHV0IGZpbGVzLgorICB2aXJ0dWFsIHZvaWQgY3JlYXRlSW50ZXJuYWxGaWxlcyhzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RmlsZT4+ICYpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIGxpc3Qgb2YgdW5kZWZpbmVkIHN5bWJvbHMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZQorICAvLy8gbGlua2VyIGNvbW1hbmQgbGluZSwgdXNpbmcgdGhlIC11IG9wdGlvbi4KKyAgQXJyYXlSZWY8U3RyaW5nUmVmPiBpbml0aWFsVW5kZWZpbmVkU3ltYm9scygpIGNvbnN0IHsKKyAgICByZXR1cm4gX2luaXRpYWxVbmRlZmluZWRTeW1ib2xzOworICB9CisKKyAgLy8vIEFmdGVyIGFsbCBzZXQqIG1ldGhvZHMgYXJlIGNhbGxlZCwgdGhlIERyaXZlciBjYWxscyB0aGlzIG1ldGhvZAorICAvLy8gdG8gdmFsaWRhdGUgdGhhdCB0aGVyZSBhcmUgbm8gbWlzc2luZyBvcHRpb25zIG9yIGludmFsaWQgY29tYmluYXRpb25zCisgIC8vLyBvZiBvcHRpb25zLiAgSWYgdGhlcmUgaXMgYSBwcm9ibGVtLCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtCisgIC8vLyBpcyB3cml0dGVuIHRvIHRoZSBzdXBwbGllZCBzdHJlYW0uCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhbiBlcnJvciB3aXRoIHRoZSBjdXJyZW50IHNldHRpbmdzLgorICBib29sIHZhbGlkYXRlKHJhd19vc3RyZWFtICZkaWFnbm9zdGljcyk7CisKKyAgLy8vIEZvcm1hdHMgc3ltYm9sIG5hbWUgZm9yIHVzZSBpbiBlcnJvciBtZXNzYWdlcy4KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZW1hbmdsZShTdHJpbmdSZWYgc3ltYm9sTmFtZSkgY29uc3QgPSAwOworCisgIC8vLyBAfQorICAvLy8gXG5hbWUgTWV0aG9kcyB1c2VkIGJ5IERyaXZlcjo6bGluaygpCisgIC8vLyBAeworCisgIC8vLyBSZXR1cm5zIHRoZSBmaWxlIHN5c3RlbSBwYXRoIHRvIHdoaWNoIHRoZSBsaW5rZWQgb3V0cHV0IHNob3VsZCBiZSB3cml0dGVuLgorICAvLy8KKyAgLy8vIFx0b2RvIFRvIHN1cHBvcnQgaW4tbWVtb3J5IGxpbmtpbmcsIHdlIG5lZWQgYW4gYWJzdHJhY3Rpb24gdGhhdCBhbGxvd3MKKyAgLy8vIHRoZSBsaW5rZXIgdG8gd3JpdGUgdG8gYW4gaW4tbWVtb3J5IGJ1ZmZlci4KKyAgU3RyaW5nUmVmIG91dHB1dFBhdGgoKSBjb25zdCB7IHJldHVybiBfb3V0cHV0UGF0aDsgfQorCisgIC8vLyBBY2Nlc3NvciBmb3IgUmVnaXN0ZXIgb2JqZWN0IGVtYmVkZGVkIGluIExpbmtpbmdDb250ZXh0LgorICBjb25zdCBSZWdpc3RyeSAmcmVnaXN0cnkoKSBjb25zdCB7IHJldHVybiBfcmVnaXN0cnk7IH0KKyAgUmVnaXN0cnkgJnJlZ2lzdHJ5KCkgeyByZXR1cm4gX3JlZ2lzdHJ5OyB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBjb3JlIGxpbmtpbmcgdG8gZ2l2ZSB0aGUgV3JpdGVyIGEgY2hhbmNlCisgIC8vLyB0byBhZGQgZmlsZSBmb3JtYXQgc3BlY2lmaWMgImZpbGVzIiB0byBzZXQgb2YgZmlsZXMgdG8gYmUgbGlua2VkLiBUaGlzIGlzCisgIC8vLyBob3cgZmlsZSBmb3JtYXQgc3BlY2lmaWMgYXRvbXMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaW5rLgorICB2aXJ0dWFsIHZvaWQgY3JlYXRlSW1wbGljaXRGaWxlcyhzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RmlsZT4+ICYpID0gMDsKKworICAvLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGNvcmUgbGlua2luZyB0byBidWlsZCB0aGUgbGlzdCBvZiBQYXNzZXMgdG8gYmUKKyAgLy8vIHJ1biBvbiB0aGUgbWVyZ2VkL2xpbmtlZCBncmFwaCBvZiBhbGwgaW5wdXQgZmlsZXMuCisgIHZpcnR1YWwgdm9pZCBhZGRQYXNzZXMoUGFzc01hbmFnZXIgJnBtKSA9IDA7CisKKyAgLy8vIENhbGxzIHRocm91Z2ggdG8gdGhlIHdyaXRlRmlsZSgpIG1ldGhvZCBvbiB0aGUgc3BlY2lmaWVkIFdyaXRlci4KKyAgLy8vCisgIC8vLyBccGFyYW0gbGlua2VkRmlsZSBUaGlzIGlzIHRoZSBtZXJnZWQvbGlua2VkIGdyYXBoIG9mIGFsbCBpbnB1dCBmaWxlIEF0b21zLgorICB2aXJ0dWFsIGxsdm06OkVycm9yIHdyaXRlRmlsZShjb25zdCBGaWxlICZsaW5rZWRGaWxlKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBuZXh0IG9yZGluYWwgYW5kIEluY3JlbWVudCBpdC4KKyAgdmlydHVhbCB1aW50NjRfdCBnZXROZXh0T3JkaW5hbEFuZEluY3JlbWVudCgpIGNvbnN0IHsgcmV0dXJuIF9uZXh0T3JkaW5hbCsrOyB9CisKKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQganVzdCBiZWZvcmUgdGhlIFJlc29sdmVyIGtpY2tzIGluLgorICAvLyBEZXJpdmVkIGNsYXNzZXMgbWF5IHVzZSBpdCB0byBjaGFuZ2UgdGhlIGxpc3Qgb2YgaW5wdXQgZmlsZXMuCisgIHZpcnR1YWwgdm9pZCBmaW5hbGl6ZUlucHV0RmlsZXMoKSA9IDA7CisKKyAgLy8vIENhbGxiYWNrIGludm9rZWQgZm9yIGVhY2ggZmlsZSB0aGUgUmVzb2x2ZXIgZGVjaWRlcyB3ZSBhcmUgZ29pbmcgdG8gbG9hZC4KKyAgLy8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gdXBkYXRlIGNvbnRleHQgc3RhdGUgYmFzZWQgb24gdGhlIGZpbGUsIGFuZCBlbWl0CisgIC8vLyBlcnJvcnMgZm9yIGFueSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBjb250ZXh0IHN0YXRlIGFuZCBhIGxvYWRlZCBmaWxlLgorICAvLy8gRm9yIGV4YW1wbGUsIHdlIGNhbiBlcnJvciBpZiB3ZSB0cnkgdG8gbG9hZCBhIGZpbGUgd2hpY2ggaXMgYSBkaWZmZXJlbnQKKyAgLy8vIGFyY2ggZnJvbSB0aGF0IGJlaW5nIGxpbmtlZC4KKyAgdmlydHVhbCBsbHZtOjpFcnJvciBoYW5kbGVMb2FkZWRGaWxlKEZpbGUgJmZpbGUpID0gMDsKKworICAvLy8gQH0KK3Byb3RlY3RlZDoKKyAgTGlua2luZ0NvbnRleHQoKTsgLy8gTXVzdCBiZSBzdWJjbGFzc2VkCisKKyAgLy8vIEFic3RyYWN0IG1ldGhvZCB0byBsYXppbHkgaW5zdGFudGlhdGUgdGhlIFdyaXRlci4KKyAgdmlydHVhbCBXcml0ZXIgJndyaXRlcigpIGNvbnN0ID0gMDsKKworICAvLy8gTWV0aG9kIHRvIGNyZWF0ZSBhbiBpbnRlcm5hbCBmaWxlIGZvciB0aGUgZW50cnkgc3ltYm9sCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEZpbGU+IGNyZWF0ZUVudHJ5U3ltYm9sRmlsZSgpIGNvbnN0OworICBzdGQ6OnVuaXF1ZV9wdHI8RmlsZT4gY3JlYXRlRW50cnlTeW1ib2xGaWxlKFN0cmluZ1JlZiBmaWxlbmFtZSkgY29uc3Q7CisKKyAgLy8vIE1ldGhvZCB0byBjcmVhdGUgYW4gaW50ZXJuYWwgZmlsZSBmb3IgYW4gdW5kZWZpbmVkIHN5bWJvbAorICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxGaWxlPiBjcmVhdGVVbmRlZmluZWRTeW1ib2xGaWxlKCkgY29uc3Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxGaWxlPiBjcmVhdGVVbmRlZmluZWRTeW1ib2xGaWxlKFN0cmluZ1JlZiBmaWxlbmFtZSkgY29uc3Q7CisKKyAgU3RyaW5nUmVmIF9vdXRwdXRQYXRoOworICBTdHJpbmdSZWYgX2VudHJ5U3ltYm9sTmFtZTsKKyAgYm9vbCBfZGVhZFN0cmlwID0gZmFsc2U7CisgIGJvb2wgX2dsb2JhbHNBcmVEZWFkU3RyaXBSb290cyA9IGZhbHNlOworICBib29sIF9wcmludFJlbWFpbmluZ1VuZGVmaW5lcyA9IHRydWU7CisgIGJvb2wgX2FsbG93UmVtYWluaW5nVW5kZWZpbmVzID0gZmFsc2U7CisgIGJvb2wgX2xvZ0lucHV0RmlsZXMgPSBmYWxzZTsKKyAgYm9vbCBfYWxsb3dTaGxpYlVuZGVmaW5lcyA9IGZhbHNlOworICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IF9kZWFkU3RyaXBSb290czsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBfbGx2bU9wdGlvbnM7CisgIFN0cmluZ1JlZlZlY3RvciBfaW5pdGlhbFVuZGVmaW5lZFN5bWJvbHM7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxOb2RlPj4gX25vZGVzOworICBtdXRhYmxlIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgX2FsbG9jYXRvcjsKKyAgbXV0YWJsZSB1aW50NjRfdCBfbmV4dE9yZGluYWwgPSAwOworICBSZWdpc3RyeSBfcmVnaXN0cnk7CisKK3ByaXZhdGU6CisgIC8vLyBWYWxpZGF0ZSB0aGUgc3ViY2xhc3MgYml0cy4gT25seSBjYWxsZWQgYnkgdmFsaWRhdGUuCisgIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUltcGwocmF3X29zdHJlYW0gJmRpYWdub3N0aWNzKSA9IDA7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGxkCisKKyNlbmRpZiAvLyBMTERfQ09SRV9MSU5LSU5HX0NPTlRFWFRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvTm9kZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvTm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMDQ4MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9Ob2RlLmgKQEAgLTAsMCArMSw3NSBAQAorLy89PT0tIGxsZC9Db3JlL05vZGUuaCAtIElucHV0IGZpbGUgY2xhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gTGlua2VyCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8KKy8vLyBUaGUgY2xhc3NlcyBpbiB0aGlzIGZpbGUgcmVwcmVzZW50cyBpbnB1dHMgdG8gdGhlIGxpbmtlci4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTERfQ09SRV9OT0RFX0gKKyNkZWZpbmUgTExEX0NPUkVfTk9ERV9ICisKKyNpbmNsdWRlICJsbGQvQ29yZS9GaWxlLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsZCB7CisKKy8vIEEgTm9kZSByZXByZXNlbnRzIGEgRmlsZU5vZGUgb3Igb3RoZXIgdHlwZSBvZiBOb2RlLiBJbiB0aGUgbGF0dGVyIGNhc2UsCisvLyB0aGUgbm9kZSBjb250YWlucyBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnB1dCBmaWxlIGxpc3QuCisvLyBDdXJyZW50bHkgb25seSBHcm91cEVuZCBub2RlIGlzIGRlZmluZWQgYXMgYSBtZXRhIG5vZGUuCitjbGFzcyBOb2RlIHsKK3B1YmxpYzoKKyAgZW51bSBjbGFzcyBLaW5kIHsgRmlsZSwgR3JvdXBFbmQgfTsKKworICBleHBsaWNpdCBOb2RlKEtpbmQgdHlwZSkgOiBfa2luZCh0eXBlKSB7fQorICB2aXJ0dWFsIH5Ob2RlKCkgPSBkZWZhdWx0OworCisgIHZpcnR1YWwgS2luZCBraW5kKCkgY29uc3QgeyByZXR1cm4gX2tpbmQ7IH0KKworcHJpdmF0ZToKKyAgS2luZCBfa2luZDsKK307CisKKy8vIFRoaXMgaXMgYSBtYXJrZXIgZm9yIC0tZW5kLWdyb3VwLiBnZXRTaXplKCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mCisvLyBmaWxlcyBiZXR3ZWVuIHRoZSBjb3JyZXNwb25kaW5nIC0tc3RhcnQtZ3JvdXAgYW5kIHRoaXMgbWFya2VyLgorY2xhc3MgR3JvdXBFbmQgOiBwdWJsaWMgTm9kZSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IEdyb3VwRW5kKGludCBzaXplKSA6IE5vZGUoS2luZDo6R3JvdXBFbmQpLCBfc2l6ZShzaXplKSB7fQorCisgIGludCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gX3NpemU7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE5vZGUgKmEpIHsKKyAgICByZXR1cm4gYS0+a2luZCgpID09IEtpbmQ6Okdyb3VwRW5kOworICB9CisKK3ByaXZhdGU6CisgIGludCBfc2l6ZTsKK307CisKKy8vIEEgY29udGFpbmVyIG9mIEZpbGUuCitjbGFzcyBGaWxlTm9kZSA6IHB1YmxpYyBOb2RlIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRmlsZU5vZGUoc3RkOjp1bmlxdWVfcHRyPEZpbGU+IGYpCisgICAgICA6IE5vZGUoTm9kZTo6S2luZDo6RmlsZSksIF9maWxlKHN0ZDo6bW92ZShmKSkge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE5vZGUgKmEpIHsKKyAgICByZXR1cm4gYS0+a2luZCgpID09IE5vZGU6OktpbmQ6OkZpbGU7CisgIH0KKworICBGaWxlICpnZXRGaWxlKCkgeyByZXR1cm4gX2ZpbGUuZ2V0KCk7IH0KKworcHJvdGVjdGVkOgorICBzdGQ6OnVuaXF1ZV9wdHI8RmlsZT4gX2ZpbGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGxkCisKKyNlbmRpZiAvLyBMTERfQ09SRV9OT0RFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL1Bhc3MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL1Bhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmUzZjliCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvUGFzcy5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vPT09LS0tLS0tIENvcmUvUGFzcy5oIC0gQmFzZSBjbGFzcyBmb3IgbGlua2VyIHBhc3NlcyAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExEX0NPUkVfUEFTU19ICisjZGVmaW5lIExMRF9DT1JFX1BBU1NfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKK25hbWVzcGFjZSBsbGQgeworCitjbGFzcyBTaW1wbGVGaWxlOworCisvLy8gT25jZSB0aGUgY29yZSBsaW5raW5nIGlzIGRvbmUgKHdoaWNoIHJlc29sdmVzIHJlZmVyZW5jZXMsIGNvYWxlc2NlcyBhdG9tcworLy8vIGFuZCBwcm9kdWNlcyBhIGNvbXBsZXRlIEF0b20gZ3JhcGgpLCB0aGUgbGlua2VyIHJ1bnMgYSBzZXJpZXMgb2YgcGFzc2VzCisvLy8gb24gdGhlIEF0b20gZ3JhcGguIFRoZSBncmFwaCBpcyBtb2RlbGVkIGFzIGEgRmlsZSwgd2hpY2ggbWVhbnMgdGhlIHBhc3MKKy8vLyBoYXMgYWNjZXNzIHRvIGFsbCB0aGUgYXRvbXMgYW5kIHRvIEZpbGUgbGV2ZWwgYXR0cmlidXRlcy4gRWFjaCBwYXNzIGRvZXMKKy8vLyBhIHBhcnRpY3VsYXIgdHJhbnNmb3JtYXRpb24gdG8gdGhlIEF0b20gZ3JhcGggb3IgdG8gdGhlIEZpbGUgYXR0cmlidXRlcy4KKy8vLworLy8vIFRoaXMgaXMgdGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBwYXNzZXMuICBBIFBhc3MgZG9lcyBpdHMKKy8vLyBhY3R1YWwgd29yayBpbiBpdCBwZXJmb3JtKCkgbWV0aG9kLiAgSXQgY2FuIGl0ZXJhdG9yIG92ZXIgQXRvbXMgaW4gdGhlCisvLy8gZ3JhcGggdXNpbmcgdGhlICpiZWdpbigpLyplbmQoKSBhdG9tIGl0ZXJhdG9yIG9mIHRoZSBGaWxlLiAgSXQgY2FuIGFkZAorLy8vIG5ldyBBdG9tcyB0byB0aGUgZ3JhcGggdXNpbmcgdGhlIEZpbGUncyBhZGRBdG9tKCkgbWV0aG9kLgorY2xhc3MgUGFzcyB7CitwdWJsaWM6CisgIHZpcnR1YWwgflBhc3MoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIERvIHRoZSBhY3R1YWwgd29yayBvZiB0aGUgUGFzcy4KKyAgdmlydHVhbCBsbHZtOjpFcnJvciBwZXJmb3JtKFNpbXBsZUZpbGUgJm1lcmdlZEZpbGUpID0gMDsKKworcHJvdGVjdGVkOgorICAvLyBPbmx5IHN1YmNsYXNzZXNzIGNhbiBiZSBpbnN0YW50aWF0ZWQuCisgIFBhc3MoKSA9IGRlZmF1bHQ7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGxkCisKKyNlbmRpZiAvLyBMTERfQ09SRV9QQVNTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL1Bhc3NNYW5hZ2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9QYXNzTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYTY1YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9QYXNzTWFuYWdlci5oCkBAIC0wLDAgKzEsNDggQEAKKy8vPT09LSBsbGQvQ29yZS9QYXNzTWFuYWdlci5oIC0gTWFuYWdlIGxpbmtlciBwYXNzZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExEX0NPUkVfUEFTU19NQU5BR0VSX0gKKyNkZWZpbmUgTExEX0NPUkVfUEFTU19NQU5BR0VSX0gKKworI2luY2x1ZGUgImxsZC9Db21tb24vTExWTS5oIgorI2luY2x1ZGUgImxsZC9Db3JlL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGxkIHsKK2NsYXNzIFNpbXBsZUZpbGU7CitjbGFzcyBQYXNzOworCisvLy8gXGJyaWVmIE93bnMgYW5kIHJ1bnMgYSBjb2xsZWN0aW9uIG9mIHBhc3Nlcy4KKy8vLworLy8vIFRoaXMgY2xhc3MgaXMgY3VycmVudGx5IGp1c3QgYSBjb250YWluZXIgZm9yIHBhc3NlcyBhbmQgYSB3YXkgdG8gcnVuIHRoZW0uCisvLy8KKy8vLyBJbiB0aGUgZnV0dXJlIHRoaXMgc2hvdWxkIGhhbmRsZSB0aW1pbmcgcGFzcyBydW5zLCBydW5uaW5nIHBhcmFsbGVsIHBhc3NlcywKKy8vLyBhbmQgdmFsaWRhdGUvc2F0aXNmeSBwYXNzIGRlcGVuZGVuY2llcy4KK2NsYXNzIFBhc3NNYW5hZ2VyIHsKK3B1YmxpYzoKKyAgdm9pZCBhZGQoc3RkOjp1bmlxdWVfcHRyPFBhc3M+IHBhc3MpIHsKKyAgICBfcGFzc2VzLnB1c2hfYmFjayhzdGQ6Om1vdmUocGFzcykpOworICB9CisKKyAgbGx2bTo6RXJyb3IgcnVuT25GaWxlKFNpbXBsZUZpbGUgJmZpbGUpIHsKKyAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxQYXNzPiAmcGFzcyA6IF9wYXNzZXMpCisgICAgICBpZiAobGx2bTo6RXJyb3IgRUMgPSBwYXNzLT5wZXJmb3JtKGZpbGUpKQorICAgICAgICByZXR1cm4gRUM7CisgICAgcmV0dXJuIGxsdm06OkVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBQYXNzZXMgaW4gdGhlIG9yZGVyIHRoZXkgc2hvdWxkIHJ1bi4KKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFBhc3M+PiBfcGFzc2VzOworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9SZWFkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL1JlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YmFmODYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9SZWFkZXIuaApAQCAtMCwwICsxLDE1NSBAQAorLy89PT0tIGxsZC9Db3JlL1JlYWRlci5oIC0gQWJzdHJhY3QgRmlsZSBGb3JtYXQgUmVhZGluZyBJbnRlcmZhY2UgLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gTGlua2VyCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTERfQ09SRV9SRUFERVJfSAorI2RlZmluZSBMTERfQ09SRV9SRUFERVJfSAorCisjaW5jbHVkZSAibGxkL0NvbW1vbi9MTFZNLmgiCisjaW5jbHVkZSAibGxkL0NvcmUvUmVmZXJlbmNlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvTWFnaWMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JPci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSB5YW1sIHsKK2NsYXNzIElPOworfSAvLyBlbmQgbmFtZXNwYWNlIHlhbWwKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBsbGQgeworCitjbGFzcyBGaWxlOworY2xhc3MgTGlua2luZ0NvbnRleHQ7CitjbGFzcyBNYWNoT0xpbmtpbmdDb250ZXh0OworCisvLy8gXGJyaWVmIEFuIGFic3RyYWN0IGNsYXNzIGZvciByZWFkaW5nIG9iamVjdCBmaWxlcywgbGlicmFyeSBmaWxlcywgYW5kCisvLy8gZXhlY3V0YWJsZSBmaWxlcy4KKy8vLworLy8vIEVhY2ggZmlsZSBmb3JtYXQgKGUuZy4gbWFjaC1vLCBldGMpIGhhcyBhIGNvbmNyZXRlIHN1YmNsYXNzIG9mIFJlYWRlci4KK2NsYXNzIFJlYWRlciB7CitwdWJsaWM6CisgIHZpcnR1YWwgflJlYWRlcigpID0gZGVmYXVsdDsKKworICAvLy8gU25pZmZzIHRoZSBmaWxlIHRvIGRldGVybWluZSBpZiB0aGlzIFJlYWRlciBjYW4gcGFyc2UgaXQuCisgIC8vLyBUaGUgbWV0aG9kIGlzIGNhbGxlZCB3aXRoOgorICAvLy8gMSkgdGhlIGZpbGVfbWFnaWMgZW51bWVyYXRpb24gcmV0dXJuZWQgYnkgaWRlbnRpZnlfbWFnaWMoKQorICAvLy8gMikgdGhlIHdob2xlIGZpbGUgY29udGVudCBidWZmZXIgaWYgdGhlIGFib3ZlIGlzIG5vdCBlbm91Z2guCisgIHZpcnR1YWwgYm9vbCBjYW5QYXJzZShsbHZtOjpmaWxlX21hZ2ljIG1hZ2ljLCBNZW1vcnlCdWZmZXJSZWYgbWIpIGNvbnN0ID0gMDsKKworICAvLy8gXGJyaWVmIFBhcnNlIGEgc3VwcGxpZWQgYnVmZmVyIChhbHJlYWR5IGZpbGxlZCB3aXRoIHRoZSBjb250ZW50cyBvZiBhCisgIC8vLyBmaWxlKSBhbmQgY3JlYXRlIGEgRmlsZSBvYmplY3QuCisgIC8vLyBUaGUgcmVzdWx0aW5nIEZpbGUgb2JqZWN0IHRha2VzIG93bmVyc2hpcCBvZiB0aGUgTWVtb3J5QnVmZmVyLgorICB2aXJ0dWFsIEVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPEZpbGU+PgorICBsb2FkRmlsZShzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBtYiwgY29uc3QgY2xhc3MgUmVnaXN0cnkgJikgY29uc3QgPSAwOworfTsKKworLy8vIFxicmllZiBBbiBhYnN0cmFjdCBjbGFzcyBmb3IgaGFuZGxpbmcgYWx0ZXJuYXRlIHlhbWwgcmVwcmVzZW50YXRpb25zCisvLy8gb2Ygb2JqZWN0IGZpbGVzLgorLy8vCisvLy8gVGhlIFlBTUwgc3ludGF4IGFsbG93cyAidGFncyIgd2hpY2ggYXJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZgorLy8vIHRoZSBZQU1MIG5vZGUuICBJbiBsbGQsIHRvcCBsZXZlbCBZQU1MIGRvY3VtZW50cyBjYW4gYmUgaW4gbWFueSBZQU1MCisvLy8gcmVwcmVzZW50YXRpb25zIChlLmcgbWFjaC1vIGVuY29kZWQgYXMgeWFtbCwgZXRjKS4gIEEgdGFnIGlzIHVzZWQgdG8KKy8vLyBzcGVjaWZ5IHdoaWNoIHJlcHJlc2VudGF0aW9uIGlzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyBZQU1MIGRvY3VtZW50LgorLy8vIFRvIHdvcmssIHRoZXJlIG11c3QgYmUgYSBZYW1sSU9UYWdnZWREb2N1bWVudEhhbmRsZXIgcmVnaXN0ZXJlZCB0aGF0CisvLy8gaGFuZGxlcyBlYWNoIHRhZyB0eXBlLgorY2xhc3MgWWFtbElPVGFnZ2VkRG9jdW1lbnRIYW5kbGVyIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+WWFtbElPVGFnZ2VkRG9jdW1lbnRIYW5kbGVyKCk7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBlYWNoIHJlZ2lzdGVyZWQgWWFtbElPVGFnZ2VkRG9jdW1lbnRIYW5kbGVyCisgIC8vLyB1bnRpbCBvbmUgcmV0dXJucyB0cnVlLiAgSWYgdGhlIHN1YmNsYXNzIGhhbmRsZXMgdGFnIHR5cGUgIXh5eiwgdGhlbgorICAvLy8gdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgaW8ubWFwVGFnKCIheHp5IikgdG8gc2VlIGlmIHRoYXQgaXMgdGhlIGN1cnJlbnQKKyAgLy8vIGRvY3VtZW50IHR5cGUsIGFuZCBpZiBzbywgcHJvY2VzcyB0aGUgcmVzdCBvZiB0aGUgZG9jdW1lbnQgdXNpbmcKKyAgLy8vIFlBTUwgSS9PLCB0aGVuIGNvbnZlcnQgdGhlIHJlc3VsdCBpbnRvIGFuIGxsZDo6RmlsZSogYW5kIHJldHVybiBpdC4KKyAgdmlydHVhbCBib29sIGhhbmRsZWREb2NUYWcobGx2bTo6eWFtbDo6SU8gJmlvLCBjb25zdCBsbGQ6OkZpbGUgKiZmKSBjb25zdCA9IDA7Cit9OworCisvLy8gQSByZWdpc3RyeSB0byBob2xkIHRoZSBsaXN0IG9mIGN1cnJlbnRseSByZWdpc3RlcmVkIFJlYWRlcnMgYW5kCisvLy8gdGFibGVzIHdoaWNoIG1hcCBSZWZlcmVuY2Uga2luZCB2YWx1ZXMgdG8gc3RyaW5ncy4KKy8vLyBUaGUgbGlua2VyIGRvZXMgbm90IGRpcmVjdGx5IGludm9rZSBSZWFkZXJzLiAgSW5zdGVhZCwgaXQgcmVnaXN0ZXJzCisvLy8gUmVhZGVycyBiYXNlZCBvbiBpdCBjb25maWd1cmF0aW9uIGFuZCBjb21tYW5kIGxpbmUgb3B0aW9ucywgdGhlbiBjYWxscworLy8vIHRoZSBSZWdpc3RyeSBvYmplY3QgdG8gcGFyc2UgZmlsZXMuCitjbGFzcyBSZWdpc3RyeSB7CitwdWJsaWM6CisgIFJlZ2lzdHJ5KCk7CisKKyAgLy8vIFdhbGsgdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBSZWFkZXJzIGFuZCBmaW5kIG9uZSB0aGF0IGNhbiBwYXJzZSB0aGUKKyAgLy8vIHN1cHBsaWVkIGZpbGUgYW5kIHBhcnNlIGl0LgorICBFcnJvck9yPHN0ZDo6dW5pcXVlX3B0cjxGaWxlPj4KKyAgbG9hZEZpbGUoc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gbWIpIGNvbnN0OworCisgIC8vLyBXYWxrIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQga2luZCB0YWJsZXMgdG8gY29udmVydCBhIFJlZmVyZW5jZSBLaW5kCisgIC8vLyBuYW1lIHRvIGEgdmFsdWUuCisgIGJvb2wgcmVmZXJlbmNlS2luZEZyb21TdHJpbmcoU3RyaW5nUmVmIGlucHV0U3RyLCBSZWZlcmVuY2U6OktpbmROYW1lc3BhY2UgJm5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZTo6S2luZEFyY2ggJmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlOjpLaW5kVmFsdWUgJnZhbHVlKSBjb25zdDsKKworICAvLy8gV2FsayB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGtpbmQgdGFibGVzIHRvIGNvbnZlcnQgYSBSZWZlcmVuY2UgS2luZAorICAvLy8gdmFsdWUgdG8gYSBzdHJpbmcuCisgIGJvb2wgcmVmZXJlbmNlS2luZFRvU3RyaW5nKFJlZmVyZW5jZTo6S2luZE5hbWVzcGFjZSBucywgUmVmZXJlbmNlOjpLaW5kQXJjaCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2U6OktpbmRWYWx1ZSB2YWx1ZSwgU3RyaW5nUmVmICYpIGNvbnN0OworCisgIC8vLyBXYWxrIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgdGFnIGhhbmRsZXJzIGFuZCBoYXZlIHRoZSBvbmUgdGhhdCBoYW5kbGVzCisgIC8vLyB0aGUgY3VycmVudCBkb2N1bWVudCB0eXBlIHByb2Nlc3MgdGhlIHlhbWwgaW50byBhbiBsbGQ6OkZpbGUqLgorICBib29sIGhhbmRsZVRhZ2dlZERvYyhsbHZtOjp5YW1sOjpJTyAmaW8sIGNvbnN0IGxsZDo6RmlsZSAqJmZpbGUpIGNvbnN0OworCisgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBkeW5hbWljYWxseSBhZGQgc3VwcG9ydCBmb3IgdmFyaW91cyBmaWxlCisgIC8vIGZvcm1hdHMuIFRoZSBtZXRob2RzIGFyZSBhbHNvIGltcGxlbWVudGVkIGluIHRoZSBhcHByb3ByaWF0ZSBsaWIqLmEKKyAgLy8gbGlicmFyeSwgc28gdGhhdCB0aGUgY29kZSBmb3IgaGFuZGxpbmcgYSBmb3JtYXQgaXMgb25seSBsaW5rZWQgaW4sIGlmIHRoaXMKKyAgLy8gbWV0aG9kIGlzIHVzZWQuICBBbnkgb3B0aW9ucyB0aGF0IGEgUmVhZGVyIG1pZ2h0IG5lZWQgbXVzdCBiZSBwYXNzZWQKKyAgLy8gYXMgcGFyYW1ldGVycyB0byB0aGUgYWRkU3VwcG9ydCooKSBtZXRob2QuCisgIHZvaWQgYWRkU3VwcG9ydEFyY2hpdmVzKGJvb2wgbG9nTG9hZGluZyk7CisgIHZvaWQgYWRkU3VwcG9ydFlhbWxGaWxlcygpOworICB2b2lkIGFkZFN1cHBvcnRNYWNoT09iamVjdHMoTWFjaE9MaW5raW5nQ29udGV4dCAmKTsKKworICAvLy8gVG8gY29udmVydCBiZXR3ZWVuIGtpbmQgdmFsdWVzIGFuZCBuYW1lcywgdGhlIHJlZ2lzdHJ5IHdhbGtzIHRoZSBsaXN0CisgIC8vLyBvZiByZWdpc3RlcmVkIGtpbmQgdGFibGVzLiBFYWNoIHRhYmxlIGlzIGEgemVybyB0ZXJtaW5hdGVkIGFycmF5IG9mCisgIC8vLyBLaW5kU3RyaW5ncyBlbGVtZW50cy4KKyAgc3RydWN0IEtpbmRTdHJpbmdzIHsKKyAgICBSZWZlcmVuY2U6OktpbmRWYWx1ZSAgdmFsdWU7CisgICAgU3RyaW5nUmVmICAgICAgICAgICAgIG5hbWU7CisgIH07CisKKyAgLy8vIEEgUmVmZXJlbmNlIEtpbmQgdmFsdWUgaXMgYSB0dXBsZSBvZiA8bmFtZXNwYWNlLCBhcmNoLCB2YWx1ZT4uICBBbGwKKyAgLy8vIGVudHJpZXMgaW4gYSBjb252ZXJzaW9uIHRhYmxlIGhhdmUgdGhlIHNhbWUgPG5hbWVzcGFjZSwgYXJjaD4uICBUaGUKKyAgLy8vIGFycmF5IHRoZW4gY29udGFpbnMgdGhlIHZhbHVlL25hbWUgcGFpcnMuCisgIHZvaWQgYWRkS2luZFRhYmxlKFJlZmVyZW5jZTo6S2luZE5hbWVzcGFjZSBucywgUmVmZXJlbmNlOjpLaW5kQXJjaCBhcmNoLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBLaW5kU3RyaW5ncyBhcnJheVtdKTsKKworcHJpdmF0ZToKKyAgc3RydWN0IEtpbmRFbnRyeSB7CisgICAgUmVmZXJlbmNlOjpLaW5kTmFtZXNwYWNlICBuczsKKyAgICBSZWZlcmVuY2U6OktpbmRBcmNoICAgICAgIGFyY2g7CisgICAgY29uc3QgS2luZFN0cmluZ3MgICAgICAgICphcnJheTsKKyAgfTsKKworICB2b2lkIGFkZChzdGQ6OnVuaXF1ZV9wdHI8UmVhZGVyPik7CisgIHZvaWQgYWRkKHN0ZDo6dW5pcXVlX3B0cjxZYW1sSU9UYWdnZWREb2N1bWVudEhhbmRsZXI+KTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8UmVhZGVyPj4gICAgICAgICAgICAgICAgICAgICAgIF9yZWFkZXJzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8WWFtbElPVGFnZ2VkRG9jdW1lbnRIYW5kbGVyPj4gIF95YW1sSGFuZGxlcnM7CisgIHN0ZDo6dmVjdG9yPEtpbmRFbnRyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2tpbmRFbnRyaWVzOworfTsKKworLy8gVXRpbGl0aWVzIGZvciBidWlsZGluZyBhIEtpbmRTdHJpbmcgdGFibGUuICBGb3IgaW5zdGFuY2U6CisvLyAgIHN0YXRpYyBjb25zdCBSZWdpc3RyeTo6S2luZFN0cmluZ3MgdGFibGVbXSA9IHsKKy8vICAgICAgTExEX0tJTkRfU1RSSU5HX0VOVFJZKFJfVkFYX0FERFIxNiksCisvLyAgICAgIExMRF9LSU5EX1NUUklOR19FTlRSWShSX1ZBWF9EQVRBMTYpLAorLy8gICAgICBMTERfS0lORF9TVFJJTkdfRU5ECisvLyAgIH07CisjZGVmaW5lIExMRF9LSU5EX1NUUklOR19FTlRSWShuYW1lKSB7IG5hbWUsICNuYW1lIH0KKyNkZWZpbmUgTExEX0tJTkRfU1RSSU5HX0VORCAgICAgICAgIHsgMCwgICAgIiIgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGxkCisKKyNlbmRpZiAvLyBMTERfQ09SRV9SRUFERVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvUmVmZXJlbmNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9SZWZlcmVuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDMwMDNjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvUmVmZXJlbmNlLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8vPT09LSBDb3JlL1JlZmVyZW5jZXMuaCAtIEEgUmVmZXJlbmNlIHRvIEFub3RoZXIgQXRvbSAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExEX0NPUkVfUkVGRVJFTkNFU19ICisjZGVmaW5lIExMRF9DT1JFX1JFRkVSRU5DRVNfSAorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsZCB7CisKK2NsYXNzIEF0b207CisKKy8vLworLy8vIFRoZSBsaW5rZXIgaGFzIGEgR3JhcGggVGhlb3J5IG1vZGVsIG9mIGxpbmtpbmcuIEFuIG9iamVjdCBmaWxlIGlzIHNlZW4KKy8vLyBhcyBhIHNldCBvZiBBdG9tcyB3aXRoIFJlZmVyZW5jZXMgdG8gb3RoZXIgQXRvbXMuICBFYWNoIEF0b20gaXMgYSBub2RlCisvLy8gYW5kIGVhY2ggUmVmZXJlbmNlIGlzIGFuIGVkZ2UuCisvLy8KKy8vLyBGb3IgZXhhbXBsZSBpZiBhIGZ1bmN0aW9uIGNvbnRhaW5zIGEgY2FsbCBzaXRlIHRvICJtYWxsb2MiIDQwIGJ5dGVzIGludG8KKy8vLyB0aGUgQXRvbSwgdGhlbiB0aGUgZnVuY3Rpb24gQXRvbSB3aWxsIGhhdmUgYSBSZWZlcmVuY2Ugb2Y6IG9mZnNldEluQXRvbT00MCwKKy8vLyBraW5kPWNhbGxzaXRlLCB0YXJnZXQ9bWFsbG9jLCBhZGRlbmQ9MC4KKy8vLworLy8vIEJlc2lkZXMgc3VwcG9ydGluZyB0cmFkaXRpb25hbCAicmVsb2NhdGlvbnMiLCByZWZlcmVuY2VzIGFyZSBhbHNvIHVzZWQKKy8vLyBmb3JjaW5nIGxheW91dCAob25lIGF0b20gbXVzdCBmb2xsb3cgYW5vdGhlciksIG1hcmtpbmcgZGF0YS1pbi1jb2RlCisvLy8gKGp1bXAgdGFibGVzIG9yIEFSTSBjb25zdGFudHMpLCBldGMuCisvLy8KKy8vLyBUaGUgImtpbmQiIG9mIGEgcmVmZXJlbmNlIGlzIGEgdHVwbGUgb2YgPG5hbWVzcGFjZSwgYXJjaCwgdmFsdWU+LiAgVGhpcworLy8vIGVuYWJsZSB1cyB0byByZS11c2UgZXhpc3RpbmcgcmVsb2NhdGlvbiB0eXBlcyBkZWZpbmRlZCBmb3IgdmFyaW91cworLy8vIGZpbGUgZm9ybWF0cyBhbmQgYXJjaGl0ZWN0dXJlcy4KKy8vLworLy8vIFJlZmVyZW5jZXMgYW5kIGF0b21zIGZvcm0gYSBkaXJlY3RlZCBncmFwaC4gVGhlIGRlYWQtc3RyaXBwaW5nIHBhc3MKKy8vLyB0cmF2ZXJzZXMgdGhlbSBzdGFydGluZyBmcm9tIGRlYWQtc3RyaXAgcm9vdCBhdG9tcyB0byBnYXJiYWdlIGNvbGxlY3QKKy8vLyB1bnJlYWNoYWJsZSBvbmVzLgorLy8vCisvLy8gUmVmZXJlbmNlcyBvZiBhbnkga2luZCBhcmUgY29uc2lkZXJlZCBhcyBkaXJlY3RlZCBlZGdlcy4gSW4gYWRkaXRpb24gdG8KKy8vLyB0aGF0LCByZWZlcmVuY2VzIG9mIHNvbWUga2luZCBpcyBjb25zaWRlcmVkIGFzIGJpZGlyZWN0ZWQgZWRnZXMuCitjbGFzcyBSZWZlcmVuY2UgeworcHVibGljOgorICAvLy8gV2hpY2ggdW5pdmVyc2UgZGVmaW5lcyB0aGUga2luZFZhbHVlKCkuCisgIGVudW0gY2xhc3MgS2luZE5hbWVzcGFjZSB7CisgICAgYWxsICAgICA9IDAsCisgICAgdGVzdGluZyA9IDEsCisgICAgbWFjaF9vICA9IDIsCisgIH07CisKKyAgS2luZE5hbWVzcGFjZSBraW5kTmFtZXNwYWNlKCkgY29uc3QgeyByZXR1cm4gKEtpbmROYW1lc3BhY2UpX2tpbmROYW1lc3BhY2U7IH0KKyAgdm9pZCBzZXRLaW5kTmFtZXNwYWNlKEtpbmROYW1lc3BhY2UgbnMpIHsgX2tpbmROYW1lc3BhY2UgPSAodWludDhfdCluczsgfQorCisgIC8vIFdoaWNoIGFyY2hpdGVjdHVyZSB0aGUga2luZCB2YWx1ZSBpcyBmb3IuCisgIGVudW0gY2xhc3MgS2luZEFyY2ggeyBhbGwsIEFBcmNoNjQsIEFSTSwgeDg2LCB4ODZfNjR9OworCisgIEtpbmRBcmNoIGtpbmRBcmNoKCkgY29uc3QgeyByZXR1cm4gKEtpbmRBcmNoKV9raW5kQXJjaDsgfQorICB2b2lkIHNldEtpbmRBcmNoKEtpbmRBcmNoIGEpIHsgX2tpbmRBcmNoID0gKHVpbnQ4X3QpYTsgfQorCisgIHR5cGVkZWYgdWludDE2X3QgS2luZFZhbHVlOworCisgIEtpbmRWYWx1ZSBraW5kVmFsdWUoKSBjb25zdCB7IHJldHVybiBfa2luZFZhbHVlOyB9CisKKyAgLy8vIHNldEtpbmRWYWx1ZSgpIGlzIG5lZWRlZCBiZWNhdXNlIGR1cmluZyBsaW5raW5nLCBzb21lIG9wdGltaXphdGlvbnMgbWF5CisgIC8vLyBjaGFuZ2UgdGhlIGNvZGVnZW4gYW5kIGhlbmNlIHRoZSByZWZlcmVuY2Uga2luZC4KKyAgdm9pZCBzZXRLaW5kVmFsdWUoS2luZFZhbHVlIHZhbHVlKSB7CisgICAgX2tpbmRWYWx1ZSA9IHZhbHVlOworICB9CisKKyAgLy8vIEtpbmRWYWx1ZXMgdXNlZCB3aXRoIEtpbmROYW1lc3BhY2U6OmFsbCBhbmQgS2luZEFyY2g6OmFsbC4KKyAgZW51bSB7CisgICAgLy8ga2luZExheW91dEFmdGVyIGlzIHRyZWF0ZWQgYXMgYSBiaWRpcmVjdGVkIGVkZ2UgYnkgdGhlIGRlYWQtc3RyaXBwaW5nCisgICAgLy8gcGFzcy4KKyAgICBraW5kTGF5b3V0QWZ0ZXIgPSAxLAorICAgIGtpbmRBc3NvY2lhdGUsCisgIH07CisKKyAgLy8gQSB2YWx1ZSB0byBiZSBhZGRlZCB0byB0aGUgdmFsdWUgb2YgYSB0YXJnZXQKKyAgdHlwZWRlZiBpbnQ2NF90IEFkZGVuZDsKKworICAvLy8gSWYgdGhlIHJlZmVyZW5jZSBpcyBhIGZpeHVwIGluIHRoZSBBdG9tLCB0aGVuIHRoaXMgcmV0dXJucyB0aGUKKyAgLy8vIGJ5dGUgb2Zmc2V0IGludG8gdGhlIEF0b20ncyBjb250ZW50IHRvIGRvIHRoZSBmaXggdXAuCisgIHZpcnR1YWwgdWludDY0X3Qgb2Zmc2V0SW5BdG9tKCkgY29uc3QgPSAwOworCisgIC8vLyBSZXR1cm5zIHRoZSBhdG9tIHRoaXMgcmVmZXJlbmNlIHJlZmVycyB0by4KKyAgdmlydHVhbCBjb25zdCBBdG9tICp0YXJnZXQoKSBjb25zdCA9IDA7CisKKyAgLy8vIER1cmluZyBsaW5raW5nLCB0aGUgbGlua2VyIG1heSBtZXJnZSBncmFwaHMgd2hpY2ggY29hbGVzY2VzIHNvbWUgbm9kZXMKKyAgLy8vIChpLmUuIEF0b21zKS4gIFRvIHN3aXRjaCB0aGUgdGFyZ2V0IG9mIGEgcmVmZXJlbmNlLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisgIHZpcnR1YWwgdm9pZCBzZXRUYXJnZXQoY29uc3QgQXRvbSAqKSA9IDA7CisKKyAgLy8vIFNvbWUgcmVsb2NhdGlvbnMgcmVxdWlyZSBhIHN5bWJvbCBhbmQgYSB2YWx1ZSAoZS5nLiBmb28gKyA0KS4KKyAgdmlydHVhbCBBZGRlbmQgYWRkZW5kKCkgY29uc3QgPSAwOworCisgIC8vLyBEdXJpbmcgbGlua2luZywgc29tZSBvcHRpbXphdGlvbnMgbWF5IGNoYW5nZSBhZGRlbmQgdmFsdWUuCisgIHZpcnR1YWwgdm9pZCBzZXRBZGRlbmQoQWRkZW5kKSA9IDA7CisKKyAgLy8vIFJldHVybnMgdGFyZ2V0IHNwZWNpZmljIGF0dHJpYnV0ZXMgb2YgdGhlIHJlZmVyZW5jZS4KKyAgdmlydHVhbCB1aW50MzJfdCB0YWcoKSBjb25zdCB7IHJldHVybiAwOyB9CisKK3Byb3RlY3RlZDoKKyAgLy8vIFJlZmVyZW5jZSBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzLiAgT25seSBzdWJjbGFzc2VzIGNhbiB1c2UgY29uc3RydWN0b3IuCisgIFJlZmVyZW5jZShLaW5kTmFtZXNwYWNlIG5zLCBLaW5kQXJjaCBhLCBLaW5kVmFsdWUgdmFsdWUpCisgICAgICA6IF9raW5kVmFsdWUodmFsdWUpLCBfa2luZE5hbWVzcGFjZSgodWludDhfdClucyksIF9raW5kQXJjaCgodWludDhfdClhKSB7fQorCisgIC8vLyBUaGUgbWVtb3J5IGZvciBSZWZlcmVuY2Ugb2JqZWN0cyBpcyBhbHdheXMgbWFuYWdlZCBieSB0aGUgb3duaW5nIEZpbGUKKyAgLy8vIG9iamVjdC4gIFRoZXJlZm9yZSwgbm8gb25lIGJ1dCB0aGUgb3duaW5nIEZpbGUgb2JqZWN0IHNob3VsZCBjYWxsCisgIC8vLyBkZWxldGUgb24gYW4gUmVmZXJlbmNlLiAgSW4gZmFjdCwgc29tZSBGaWxlIG9iamVjdHMgbWF5IGJ1bGsgYWxsb2NhdGUKKyAgLy8vIGFuIGFycmF5IG9mIFJlZmVyZW5jZXMsIHNvIHRoZXkgY2Fubm90IGJlIGluZGl2aWR1YWxseSBkZWxldGVkIGJ5IGFueW9uZS4KKyAgdmlydHVhbCB+UmVmZXJlbmNlKCkgPSBkZWZhdWx0OworCisgIEtpbmRWYWx1ZSAgX2tpbmRWYWx1ZTsKKyAgdWludDhfdCAgICBfa2luZE5hbWVzcGFjZTsKKyAgdWludDhfdCAgICBfa2luZEFyY2g7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGxkCisKKyNlbmRpZiAvLyBMTERfQ09SRV9SRUZFUkVOQ0VTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL1Jlc29sdmVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9SZXNvbHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNjJhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9SZXNvbHZlci5oCkBAIC0wLDAgKzEsMTA2IEBACisvLz09PS0gQ29yZS9SZXNvbHZlci5oIC0gUmVzb2x2ZXMgQXRvbSBSZWZlcmVuY2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBMaW5rZXIKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMRF9DT1JFX1JFU09MVkVSX0gKKyNkZWZpbmUgTExEX0NPUkVfUkVTT0xWRVJfSAorCisjaW5jbHVkZSAibGxkL0NvcmUvQXJjaGl2ZUxpYnJhcnlGaWxlLmgiCisjaW5jbHVkZSAibGxkL0NvcmUvRmlsZS5oIgorI2luY2x1ZGUgImxsZC9Db3JlL1NoYXJlZExpYnJhcnlGaWxlLmgiCisjaW5jbHVkZSAibGxkL0NvcmUvU2ltcGxlLmgiCisjaW5jbHVkZSAibGxkL0NvcmUvU3ltYm9sVGFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yT3IuaCIKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsZCB7CisKK2NsYXNzIEF0b207CitjbGFzcyBMaW5raW5nQ29udGV4dDsKKworLy8vIFxicmllZiBUaGUgUmVzb2x2ZXIgaXMgcmVzcG9uc2libGUgZm9yIG1lcmdpbmcgYWxsIGlucHV0IG9iamVjdCBmaWxlcworLy8vIGFuZCBwcm9kdWNpbmcgYSBtZXJnZWQgZ3JhcGguCitjbGFzcyBSZXNvbHZlciB7CitwdWJsaWM6CisgIFJlc29sdmVyKExpbmtpbmdDb250ZXh0ICZjdHgpIDogX2N0eChjdHgpLCBfcmVzdWx0KG5ldyBNZXJnZWRGaWxlKCkpIHt9CisKKyAgLy8gSW5wdXRGaWxlczo6SGFuZGxlciBtZXRob2RzCisgIHZvaWQgZG9EZWZpbmVkQXRvbShPd25pbmdBdG9tUHRyPERlZmluZWRBdG9tPiBhdG9tKTsKKyAgYm9vbCBkb1VuZGVmaW5lZEF0b20oT3duaW5nQXRvbVB0cjxVbmRlZmluZWRBdG9tPiBhdG9tKTsKKyAgdm9pZCBkb1NoYXJlZExpYnJhcnlBdG9tKE93bmluZ0F0b21QdHI8U2hhcmVkTGlicmFyeUF0b20+IGF0b20pOworICB2b2lkIGRvQWJzb2x1dGVBdG9tKE93bmluZ0F0b21QdHI8QWJzb2x1dGVBdG9tPiBhdG9tKTsKKworICAvLyBIYW5kbGUgZmlsZXMsIHRoaXMgYWRkcyBhdG9tcyBmcm9tIHRoZSBjdXJyZW50IGZpbGUgdGhhdHMKKyAgLy8gYmVpbmcgcHJvY2Vzc2VkIGJ5IHRoZSByZXNvbHZlcgorICBsbHZtOjpFeHBlY3RlZDxib29sPiBoYW5kbGVGaWxlKEZpbGUgJik7CisKKyAgLy8gSGFuZGxlIGFuIGFyY2hpdmUgbGlicmFyeSBmaWxlLgorICBsbHZtOjpFeHBlY3RlZDxib29sPiBoYW5kbGVBcmNoaXZlRmlsZShGaWxlICYpOworCisgIC8vIEhhbmRsZSBhIHNoYXJlZCBsaWJyYXJ5IGZpbGUuCisgIGxsdm06OkVycm9yIGhhbmRsZVNoYXJlZExpYnJhcnkoRmlsZSAmKTsKKworICAvLy8gQGJyaWVmIGRvIHdvcmsgb2YgbWVyZ2luZyBhbmQgcmVzb2x2aW5nIGFuZCByZXR1cm4gbGlzdAorICBib29sIHJlc29sdmUoKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8U2ltcGxlRmlsZT4gcmVzdWx0RmlsZSgpIHsgcmV0dXJuIHN0ZDo6bW92ZShfcmVzdWx0KTsgfQorCitwcml2YXRlOgorICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248bGx2bTo6RXhwZWN0ZWQ8Ym9vbD4oU3RyaW5nUmVmKT4gVW5kZWZDYWxsYmFjazsKKworICBib29sIHVuZGVmaW5lc0FkZGVkKGludCBiZWdpbiwgaW50IGVuZCk7CisgIEZpbGUgKmdldEZpbGUoaW50ICZpbmRleCk7CisKKyAgLy8vIFxicmllZiBUaGUgbWFpbiBmdW5jdGlvbiB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlIGZpbGVzIHRvIHJlc29sdmUKKyAgYm9vbCByZXNvbHZlVW5kZWZpbmVzKCk7CisgIHZvaWQgdXBkYXRlUmVmZXJlbmNlcygpOworICB2b2lkIGRlYWRTdHJpcE9wdGltaXplKCk7CisgIGJvb2wgY2hlY2tVbmRlZmluZXMoKTsKKyAgdm9pZCByZW1vdmVDb2FsZXNjZWRBd2F5QXRvbXMoKTsKKyAgbGx2bTo6RXhwZWN0ZWQ8Ym9vbD4gZm9yRWFjaFVuZGVmaW5lcyhGaWxlICZmaWxlLCBVbmRlZkNhbGxiYWNrIGNhbGxiYWNrKTsKKworICB2b2lkIG1hcmtMaXZlKGNvbnN0IEF0b20gKmF0b20pOworCisgIGNsYXNzIE1lcmdlZEZpbGUgOiBwdWJsaWMgU2ltcGxlRmlsZSB7CisgIHB1YmxpYzoKKyAgICBNZXJnZWRGaWxlKCkgOiBTaW1wbGVGaWxlKCI8bGlua2VyLWludGVybmFsPiIsIGtpbmRSZXNvbHZlck1lcmdlZE9iamVjdCkge30KKyAgICB2b2lkIGFkZEF0b21zKGxsdm06Ok11dGFibGVBcnJheVJlZjxPd25pbmdBdG9tUHRyPEF0b20+PiBhdG9tcyk7CisgIH07CisKKyAgTGlua2luZ0NvbnRleHQgJl9jdHg7CisgIFN5bWJvbFRhYmxlIF9zeW1ib2xUYWJsZTsKKyAgc3RkOjp2ZWN0b3I8T3duaW5nQXRvbVB0cjxBdG9tPj4gICAgIF9hdG9tczsKKyAgc3RkOjpzZXQ8Y29uc3QgQXRvbSAqPiAgICAgICAgX2RlYWRTdHJpcFJvb3RzOworICBsbHZtOjpEZW5zZVNldDxjb25zdCBBdG9tICo+ICBfbGl2ZUF0b21zOworICBsbHZtOjpEZW5zZVNldDxjb25zdCBBdG9tICo+ICBfZGVhZEF0b21zOworICBzdGQ6OnVuaXF1ZV9wdHI8TWVyZ2VkRmlsZT4gICBfcmVzdWx0OworICBzdGQ6OnVub3JkZXJlZF9tdWx0aW1hcDxjb25zdCBBdG9tICosIGNvbnN0IEF0b20gKj4gX3JldmVyc2VSZWY7CisKKyAgLy8gLS1zdGFydC1ncm91cCBhbmQgLS1lbmQtZ3JvdXAKKyAgc3RkOjp2ZWN0b3I8RmlsZSAqPiBfZmlsZXM7CisgIHN0ZDo6bWFwPEZpbGUgKiwgYm9vbD4gX25ld1VuZGVmaW5lc0FkZGVkOworCisgIC8vIExpc3Qgb2YgdW5kZWZpbmVkIHN5bWJvbHMuCisgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gX3VuZGVmaW5lczsKKworICAvLyBTdGFydCBwb3NpdGlvbiBpbiBfdW5kZWZpbmVzIGZvciBlYWNoIGFyY2hpdmUvc2hhcmVkIGxpYnJhcnkgZmlsZS4KKyAgLy8gU3ltYm9scyBmcm9tIGluZGV4IDAgdG8gdGhlIHN0YXJ0IHBvc2l0aW9uIGFyZSBhbHJlYWR5IHNlYXJjaGVkIGJlZm9yZS4KKyAgLy8gU2VhcmNoaW5nIHRoZW0gYWdhaW4gd291bGQgbmV2ZXIgc3VjY2VlZC4gV2hlbiB3ZSBsb29rIGZvciB1bmRlZmluZWQKKyAgLy8gc3ltYm9scyBmcm9tIGFuIGFyY2hpdmUvc2hhcmVkIGxpYnJhcnkgZmlsZSwgc3RhcnQgZnJvbSBpdHMgc3RhcnQKKyAgLy8gcG9zaXRpb24gdG8gc2F2ZSB0aW1lLgorICBzdGQ6Om1hcDxGaWxlICosIHNpemVfdD4gX3VuZGVmaW5lSW5kZXg7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbGQKKworI2VuZGlmIC8vIExMRF9DT1JFX1JFU09MVkVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL1NoYXJlZExpYnJhcnlBdG9tLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9TaGFyZWRMaWJyYXJ5QXRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZWM3YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9TaGFyZWRMaWJyYXJ5QXRvbS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8vPT09LSBDb3JlL1NoYXJlZExpYnJhcnlBdG9tLmggLSBBIFNoYXJlZCBMaWJyYXJ5IEF0b20gLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExEX0NPUkVfU0hBUkVEX0xJQlJBUllfQVRPTV9ICisjZGVmaW5lIExMRF9DT1JFX1NIQVJFRF9MSUJSQVJZX0FUT01fSAorCisjaW5jbHVkZSAibGxkL0NvcmUvQXRvbS5oIgorCituYW1lc3BhY2UgbGxkIHsKKworLy8vIEEgU2hhcmVkTGlicmFyeUF0b20gaGFzIG5vIGNvbnRlbnQuCisvLy8gSXQgZXhpc3RzIHRvIHJlcHJlc2VudCBhIHN5bWJvbCB3aGljaCB3aWxsIGJlIGJvdW5kIGF0IHJ1bnRpbWUuCitjbGFzcyBTaGFyZWRMaWJyYXJ5QXRvbSA6IHB1YmxpYyBBdG9tIHsKK3B1YmxpYzoKKyAgZW51bSBjbGFzcyBUeXBlIDogdWludDMyX3QgeworICAgIFVua25vd24sCisgICAgQ29kZSwKKyAgICBEYXRhLAorICB9OworCisgIC8vLyBSZXR1cm5zIHNoYXJlZCBsaWJyYXJ5IG5hbWUgdXNlZCB0byBsb2FkIGl0IGF0IHJ1bnRpbWUuCisgIC8vLyBPbiBEYXJ3aW4gaXQgaXMgdGhlIExDX0RZTElCX0xPQUQgZHlsaWIgbmFtZS4KKyAgdmlydHVhbCBTdHJpbmdSZWYgbG9hZE5hbWUoKSBjb25zdCA9IDA7CisKKyAgLy8vIFJldHVybnMgaWYgc2hhcmVkIGxpYnJhcnkgc3ltYm9sIGNhbiBiZSBtaXNzaW5nIGF0IHJ1bnRpbWUgYW5kIGlmCisgIC8vLyBzbyB0aGUgbG9hZGVyIHNob3VsZCBzaWxlbnRseSByZXNvbHZlIGFkZHJlc3Mgb2Ygc3ltYm9sIHRvIGJlIG51bGxwdHIuCisgIHZpcnR1YWwgYm9vbCBjYW5CZU51bGxBdFJ1bnRpbWUoKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBUeXBlIHR5cGUoKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCB1aW50NjRfdCBzaXplKCkgY29uc3QgPSAwOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQXRvbSAqYSkgeworICAgIHJldHVybiBhLT5kZWZpbml0aW9uKCkgPT0gZGVmaW5pdGlvblNoYXJlZExpYnJhcnk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIGJvb2wgY2xhc3NvZihjb25zdCBTaGFyZWRMaWJyYXJ5QXRvbSAqKSB7IHJldHVybiB0cnVlOyB9CisKK3Byb3RlY3RlZDoKKyAgU2hhcmVkTGlicmFyeUF0b20oKSA6IEF0b20oZGVmaW5pdGlvblNoYXJlZExpYnJhcnkpIHt9CisKKyAgflNoYXJlZExpYnJhcnlBdG9tKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworfTsKKworfSAvLyBuYW1lc3BhY2UgbGxkCisKKyNlbmRpZiAvLyBMTERfQ09SRV9TSEFSRURfTElCUkFSWV9BVE9NX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL1NoYXJlZExpYnJhcnlGaWxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9TaGFyZWRMaWJyYXJ5RmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYmY5NjcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9TaGFyZWRMaWJyYXJ5RmlsZS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8vPT09LSBDb3JlL1NoYXJlZExpYnJhcnlGaWxlLmggLSBNb2RlbHMgc2hhcmVkIGxpYnJhcmllcyBhcyBBdG9tcyAtLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExEX0NPUkVfU0hBUkVEX0xJQlJBUllfRklMRV9ICisjZGVmaW5lIExMRF9DT1JFX1NIQVJFRF9MSUJSQVJZX0ZJTEVfSAorCisjaW5jbHVkZSAibGxkL0NvcmUvRmlsZS5oIgorCituYW1lc3BhY2UgbGxkIHsKKworLy8vCisvLy8gVGhlIFNoYXJlZExpYnJhcnlGaWxlIHN1YmNsYXNzIG9mIEZpbGUgaXMgdXNlZCB0byByZXByZXNlbnQgZHluYW1pYworLy8vIHNoYXJlZCBsaWJyYXJpZXMgYmVpbmcgbGlua2VkIGFnYWluc3QuCisvLy8KK2NsYXNzIFNoYXJlZExpYnJhcnlGaWxlIDogcHVibGljIEZpbGUgeworcHVibGljOgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEZpbGUgKmYpIHsKKyAgICByZXR1cm4gZi0+a2luZCgpID09IGtpbmRTaGFyZWRMaWJyYXJ5OworICB9CisKKyAgLy8vIENoZWNrIGlmIHRoZSBzaGFyZWQgbGlicmFyeSBleHBvcnRzIGEgc3ltYm9sIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAvLy8gSWYgc28sIHJldHVybiBhIFNoYXJlZExpYnJhcnlBdG9tIHdoaWNoIHJlcHJlc2VudHMgdGhhdCBleHBvcnRlZAorICAvLy8gc3ltYm9sLiAgT3RoZXJ3aXNlIHJldHVybiBudWxscHRyLgorICB2aXJ0dWFsIE93bmluZ0F0b21QdHI8U2hhcmVkTGlicmFyeUF0b20+IGV4cG9ydHMoU3RyaW5nUmVmIG5hbWUpIGNvbnN0ID0gMDsKKworICAvLyBSZXR1cm5zIHRoZSBpbnN0YWxsIG5hbWUuCisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldERTT05hbWUoKSBjb25zdCA9IDA7CisKKyAgY29uc3QgQXRvbVJhbmdlPERlZmluZWRBdG9tPiBkZWZpbmVkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBfZGVmaW5lZEF0b21zOworICB9CisKKyAgY29uc3QgQXRvbVJhbmdlPFVuZGVmaW5lZEF0b20+IHVuZGVmaW5lZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gX3VuZGVmaW5lZEF0b21zOworICB9CisKKyAgY29uc3QgQXRvbVJhbmdlPFNoYXJlZExpYnJhcnlBdG9tPiBzaGFyZWRMaWJyYXJ5KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBfc2hhcmVkTGlicmFyeUF0b21zOworICB9CisKKyAgY29uc3QgQXRvbVJhbmdlPEFic29sdXRlQXRvbT4gYWJzb2x1dGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9hYnNvbHV0ZUF0b21zOworICB9CisKKyAgdm9pZCBjbGVhckF0b21zKCkgb3ZlcnJpZGUgeworICAgIF9kZWZpbmVkQXRvbXMuY2xlYXIoKTsKKyAgICBfdW5kZWZpbmVkQXRvbXMuY2xlYXIoKTsKKyAgICBfc2hhcmVkTGlicmFyeUF0b21zLmNsZWFyKCk7CisgICAgX2Fic29sdXRlQXRvbXMuY2xlYXIoKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8vLyBvbmx5IHN1YmNsYXNzZXMgb2YgU2hhcmVkTGlicmFyeUZpbGUgY2FuIGJlIGluc3RhbnRpYXRlZAorICBleHBsaWNpdCBTaGFyZWRMaWJyYXJ5RmlsZShTdHJpbmdSZWYgcGF0aCkgOiBGaWxlKHBhdGgsIGtpbmRTaGFyZWRMaWJyYXJ5KSB7fQorCisgIEF0b21WZWN0b3I8RGVmaW5lZEF0b20+IF9kZWZpbmVkQXRvbXM7CisgIEF0b21WZWN0b3I8VW5kZWZpbmVkQXRvbT4gX3VuZGVmaW5lZEF0b21zOworICBBdG9tVmVjdG9yPFNoYXJlZExpYnJhcnlBdG9tPiBfc2hhcmVkTGlicmFyeUF0b21zOworICBBdG9tVmVjdG9yPEFic29sdXRlQXRvbT4gX2Fic29sdXRlQXRvbXM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbGQKKworI2VuZGlmIC8vIExMRF9DT1JFX1NIQVJFRF9MSUJSQVJZX0ZJTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvU2ltcGxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9TaW1wbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWE3YWJmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvU2ltcGxlLmgKQEAgLTAsMCArMSwyNzEgQEAKKy8vPT09LSBsbGQvQ29yZS9TaW1wbGUuaCAtIFNpbXBsZSBpbXBsZW1lbnRhdGlvbnMgb2YgQXRvbSBhbmQgRmlsZSAtLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBQcm92aWRlIHNpbXBsZSBpbXBsZW1lbnRhdGlvbnMgZm9yIEF0b21zIGFuZCBGaWxlLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMRF9DT1JFX1NJTVBMRV9ICisjZGVmaW5lIExMRF9DT1JFX1NJTVBMRV9ICisKKyNpbmNsdWRlICJsbGQvQ29yZS9BYnNvbHV0ZUF0b20uaCIKKyNpbmNsdWRlICJsbGQvQ29yZS9BdG9tLmgiCisjaW5jbHVkZSAibGxkL0NvcmUvRGVmaW5lZEF0b20uaCIKKyNpbmNsdWRlICJsbGQvQ29yZS9GaWxlLmgiCisjaW5jbHVkZSAibGxkL0NvcmUvUmVmZXJlbmNlLmgiCisjaW5jbHVkZSAibGxkL0NvcmUvU2hhcmVkTGlicmFyeUF0b20uaCIKKyNpbmNsdWRlICJsbGQvQ29yZS9VbmRlZmluZWRBdG9tLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworbmFtZXNwYWNlIGxsZCB7CisKK2NsYXNzIFNpbXBsZUZpbGUgOiBwdWJsaWMgRmlsZSB7CitwdWJsaWM6CisgIFNpbXBsZUZpbGUoU3RyaW5nUmVmIHBhdGgsIEZpbGU6OktpbmQga2luZCkKKyAgICA6IEZpbGUocGF0aCwga2luZCkge30KKworICB+U2ltcGxlRmlsZSgpIG92ZXJyaWRlIHsKKyAgICBfZGVmaW5lZC5jbGVhcigpOworICAgIF91bmRlZmluZWQuY2xlYXIoKTsKKyAgICBfc2hhcmVkLmNsZWFyKCk7CisgICAgX2Fic29sdXRlLmNsZWFyKCk7CisgIH0KKworICB2b2lkIGFkZEF0b20oRGVmaW5lZEF0b20gJmEpIHsKKyAgICBfZGVmaW5lZC5wdXNoX2JhY2soT3duaW5nQXRvbVB0cjxEZWZpbmVkQXRvbT4oJmEpKTsKKyAgfQorICB2b2lkIGFkZEF0b20oVW5kZWZpbmVkQXRvbSAmYSkgeworICAgIF91bmRlZmluZWQucHVzaF9iYWNrKE93bmluZ0F0b21QdHI8VW5kZWZpbmVkQXRvbT4oJmEpKTsKKyAgfQorICB2b2lkIGFkZEF0b20oU2hhcmVkTGlicmFyeUF0b20gJmEpIHsKKyAgICBfc2hhcmVkLnB1c2hfYmFjayhPd25pbmdBdG9tUHRyPFNoYXJlZExpYnJhcnlBdG9tPigmYSkpOworICB9CisgIHZvaWQgYWRkQXRvbShBYnNvbHV0ZUF0b20gJmEpIHsKKyAgICBfYWJzb2x1dGUucHVzaF9iYWNrKE93bmluZ0F0b21QdHI8QWJzb2x1dGVBdG9tPigmYSkpOworICB9CisKKyAgdm9pZCBhZGRBdG9tKGNvbnN0IEF0b20gJmF0b20pIHsKKyAgICBpZiAoYXV0byAqcCA9IGR5bl9jYXN0PERlZmluZWRBdG9tPigmYXRvbSkpIHsKKyAgICAgIGFkZEF0b20oY29uc3RfY2FzdDxEZWZpbmVkQXRvbSAmPigqcCkpOworICAgIH0gZWxzZSBpZiAoYXV0byAqcCA9IGR5bl9jYXN0PFVuZGVmaW5lZEF0b20+KCZhdG9tKSkgeworICAgICAgYWRkQXRvbShjb25zdF9jYXN0PFVuZGVmaW5lZEF0b20gJj4oKnApKTsKKyAgICB9IGVsc2UgaWYgKGF1dG8gKnAgPSBkeW5fY2FzdDxTaGFyZWRMaWJyYXJ5QXRvbT4oJmF0b20pKSB7CisgICAgICBhZGRBdG9tKGNvbnN0X2Nhc3Q8U2hhcmVkTGlicmFyeUF0b20gJj4oKnApKTsKKyAgICB9IGVsc2UgaWYgKGF1dG8gKnAgPSBkeW5fY2FzdDxBYnNvbHV0ZUF0b20+KCZhdG9tKSkgeworICAgICAgYWRkQXRvbShjb25zdF9jYXN0PEFic29sdXRlQXRvbSAmPigqcCkpOworICAgIH0gZWxzZSB7CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJhdG9tIGhhcyB1bmtub3duIGRlZmluaXRpb24ga2luZCIpOworICAgIH0KKyAgfQorCisgIHZvaWQgcmVtb3ZlRGVmaW5lZEF0b21zSWYoc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IERlZmluZWRBdG9tICopPiBwcmVkKSB7CisgICAgYXV0byAmYXRvbXMgPSBfZGVmaW5lZDsKKyAgICBhdXRvIG5ld0VuZCA9IHN0ZDo6cmVtb3ZlX2lmKGF0b21zLmJlZ2luKCksIGF0b21zLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZwcmVkXShPd25pbmdBdG9tUHRyPERlZmluZWRBdG9tPiAmcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJlZChwLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGF0b21zLmVyYXNlKG5ld0VuZCwgYXRvbXMuZW5kKCkpOworICB9CisKKyAgY29uc3QgQXRvbVJhbmdlPERlZmluZWRBdG9tPiBkZWZpbmVkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gX2RlZmluZWQ7IH0KKworICBjb25zdCBBdG9tUmFuZ2U8VW5kZWZpbmVkQXRvbT4gdW5kZWZpbmVkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBfdW5kZWZpbmVkOworICB9CisKKyAgY29uc3QgQXRvbVJhbmdlPFNoYXJlZExpYnJhcnlBdG9tPiBzaGFyZWRMaWJyYXJ5KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBfc2hhcmVkOworICB9CisKKyAgY29uc3QgQXRvbVJhbmdlPEFic29sdXRlQXRvbT4gYWJzb2x1dGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIF9hYnNvbHV0ZTsKKyAgfQorCisgIHZvaWQgY2xlYXJBdG9tcygpIG92ZXJyaWRlIHsKKyAgICBfZGVmaW5lZC5jbGVhcigpOworICAgIF91bmRlZmluZWQuY2xlYXIoKTsKKyAgICBfc2hhcmVkLmNsZWFyKCk7CisgICAgX2Fic29sdXRlLmNsZWFyKCk7CisgIH0KKworcHJpdmF0ZToKKyAgQXRvbVZlY3RvcjxEZWZpbmVkQXRvbT4gX2RlZmluZWQ7CisgIEF0b21WZWN0b3I8VW5kZWZpbmVkQXRvbT4gX3VuZGVmaW5lZDsKKyAgQXRvbVZlY3RvcjxTaGFyZWRMaWJyYXJ5QXRvbT4gX3NoYXJlZDsKKyAgQXRvbVZlY3RvcjxBYnNvbHV0ZUF0b20+IF9hYnNvbHV0ZTsKK307CisKK2NsYXNzIFNpbXBsZVJlZmVyZW5jZSA6IHB1YmxpYyBSZWZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgbGx2bTo6aWxpc3Rfbm9kZTxTaW1wbGVSZWZlcmVuY2U+IHsKK3B1YmxpYzoKKyAgU2ltcGxlUmVmZXJlbmNlKFJlZmVyZW5jZTo6S2luZE5hbWVzcGFjZSBucywgUmVmZXJlbmNlOjpLaW5kQXJjaCBhcmNoLAorICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlOjpLaW5kVmFsdWUgdmFsdWUsIHVpbnQ2NF90IG9mZiwgY29uc3QgQXRvbSAqdCwKKyAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZTo6QWRkZW5kIGEpCisgICAgICA6IFJlZmVyZW5jZShucywgYXJjaCwgdmFsdWUpLCBfdGFyZ2V0KHQpLCBfb2Zmc2V0SW5BdG9tKG9mZiksIF9hZGRlbmQoYSkgeworICB9CisgIFNpbXBsZVJlZmVyZW5jZSgpCisgICAgICA6IFJlZmVyZW5jZShSZWZlcmVuY2U6OktpbmROYW1lc3BhY2U6OmFsbCwgUmVmZXJlbmNlOjpLaW5kQXJjaDo6YWxsLCAwKSwKKyAgICAgICAgX3RhcmdldChudWxscHRyKSwgX29mZnNldEluQXRvbSgwKSwgX2FkZGVuZCgwKSB7fQorCisgIHVpbnQ2NF90IG9mZnNldEluQXRvbSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIF9vZmZzZXRJbkF0b207IH0KKworICBjb25zdCBBdG9tICp0YXJnZXQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgYXNzZXJ0KF90YXJnZXQpOworICAgIHJldHVybiBfdGFyZ2V0OworICB9CisKKyAgQWRkZW5kIGFkZGVuZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIF9hZGRlbmQ7IH0KKyAgdm9pZCBzZXRBZGRlbmQoQWRkZW5kIGEpIG92ZXJyaWRlIHsgX2FkZGVuZCA9IGE7IH0KKyAgdm9pZCBzZXRUYXJnZXQoY29uc3QgQXRvbSAqbmV3QXRvbSkgb3ZlcnJpZGUgeyBfdGFyZ2V0ID0gbmV3QXRvbTsgfQorCitwcml2YXRlOgorICBjb25zdCBBdG9tICpfdGFyZ2V0OworICB1aW50NjRfdCBfb2Zmc2V0SW5BdG9tOworICBBZGRlbmQgX2FkZGVuZDsKK307CisKK2NsYXNzIFNpbXBsZURlZmluZWRBdG9tIDogcHVibGljIERlZmluZWRBdG9tIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgU2ltcGxlRGVmaW5lZEF0b20oY29uc3QgRmlsZSAmZikKKyAgICAgIDogX2ZpbGUoZiksIF9vcmRpbmFsKGYuZ2V0TmV4dEF0b21PcmRpbmFsQW5kSW5jcmVtZW50KCkpIHt9CisKKyAgflNpbXBsZURlZmluZWRBdG9tKCkgb3ZlcnJpZGUgeworICAgIF9yZWZlcmVuY2VzLmNsZWFyQW5kTGVha05vZGVzVW5zYWZlbHkoKTsKKyAgfQorCisgIGNvbnN0IEZpbGUgJmZpbGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBfZmlsZTsgfQorCisgIFN0cmluZ1JlZiBuYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gU3RyaW5nUmVmKCk7IH0KKworICB1aW50NjRfdCBvcmRpbmFsKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gX29yZGluYWw7IH0KKworICBTY29wZSBzY29wZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIERlZmluZWRBdG9tOjpzY29wZUxpbmthZ2VVbml0OyB9CisKKyAgSW50ZXJwb3NhYmxlIGludGVycG9zYWJsZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gRGVmaW5lZEF0b206OmludGVycG9zZU5vOworICB9CisKKyAgTWVyZ2UgbWVyZ2UoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBEZWZpbmVkQXRvbTo6bWVyZ2VObzsgfQorCisgIEFsaWdubWVudCBhbGlnbm1lbnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAxOyB9CisKKyAgU2VjdGlvbkNob2ljZSBzZWN0aW9uQ2hvaWNlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBEZWZpbmVkQXRvbTo6c2VjdGlvbkJhc2VkT25Db250ZW50OworICB9CisKKyAgU3RyaW5nUmVmIGN1c3RvbVNlY3Rpb25OYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gU3RyaW5nUmVmKCk7IH0KKyAgRGVhZFN0cmlwS2luZCBkZWFkU3RyaXAoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIERlZmluZWRBdG9tOjpkZWFkU3RyaXBOb3JtYWw7CisgIH0KKworICBEZWZpbmVkQXRvbTo6cmVmZXJlbmNlX2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGNvbnN0IHZvaWQgKml0ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkICo+KF9yZWZlcmVuY2VzLmJlZ2luKCkuZ2V0Tm9kZVB0cigpKTsKKyAgICByZXR1cm4gcmVmZXJlbmNlX2l0ZXJhdG9yKCp0aGlzLCBpdCk7CisgIH0KKworICBEZWZpbmVkQXRvbTo6cmVmZXJlbmNlX2l0ZXJhdG9yIGVuZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBjb25zdCB2b2lkICppdCA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCAqPihfcmVmZXJlbmNlcy5lbmQoKS5nZXROb2RlUHRyKCkpOworICAgIHJldHVybiByZWZlcmVuY2VfaXRlcmF0b3IoKnRoaXMsIGl0KTsKKyAgfQorCisgIGNvbnN0IFJlZmVyZW5jZSAqZGVyZWZJdGVyYXRvcihjb25zdCB2b2lkICppdCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiAmKlJlZkxpc3Q6OmNvbnN0X2l0ZXJhdG9yKAorICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBsbHZtOjppbGlzdF9ub2RlPFNpbXBsZVJlZmVyZW5jZT4gKj4oaXQpKTsKKyAgfQorCisgIHZvaWQgaW5jcmVtZW50SXRlcmF0b3IoY29uc3Qgdm9pZCAqJml0KSBjb25zdCBvdmVycmlkZSB7CisgICAgUmVmTGlzdDo6Y29uc3RfaXRlcmF0b3IgcmVmKAorICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBsbHZtOjppbGlzdF9ub2RlPFNpbXBsZVJlZmVyZW5jZT4gKj4oaXQpKTsKKyAgICBpdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCAqPihzdGQ6Om5leHQocmVmKS5nZXROb2RlUHRyKCkpOworICB9CisKKyAgdm9pZCBhZGRSZWZlcmVuY2UoUmVmZXJlbmNlOjpLaW5kTmFtZXNwYWNlIG5zLAorICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2U6OktpbmRBcmNoIGFyY2gsCisgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZTo6S2luZFZhbHVlIGtpbmRWYWx1ZSwgdWludDY0X3Qgb2ZmLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBBdG9tICp0YXJnZXQsIFJlZmVyZW5jZTo6QWRkZW5kIGEpIG92ZXJyaWRlIHsKKyAgICBhc3NlcnQodGFyZ2V0ICYmICJ0cnlpbmcgdG8gY3JlYXRlIHJlZmVyZW5jZSB0byBub3RoaW5nIik7CisgICAgYXV0byBub2RlID0gbmV3IChfZmlsZS5hbGxvY2F0b3IoKSkKKyAgICAgICAgU2ltcGxlUmVmZXJlbmNlKG5zLCBhcmNoLCBraW5kVmFsdWUsIG9mZiwgdGFyZ2V0LCBhKTsKKyAgICBfcmVmZXJlbmNlcy5wdXNoX2JhY2sobm9kZSk7CisgIH0KKworICAvLy8gU29ydCByZWZlcmVuY2VzIGluIGEgY2Fub25pY2FsIG9yZGVyIChieSBvZmZzZXQsIHRoZW4gYnkga2luZCkuCisgIHZvaWQgc29ydFJlZmVyZW5jZXMoKSBjb25zdCB7CisgICAgLy8gQ2Fubm90IHNvcnQgYSBsaW5rZWQgIGxpc3QsIHNvIG1vdmUgZWxlbWVudHMgaW50byBhIHRlbXBvcmFyeSB2ZWN0b3IsCisgICAgLy8gc29ydCB0aGUgdmVjdG9yLCB0aGVuIHJlY29uc3RydWN0IHRoZSBsaXN0LgorICAgIGxsdm06OlNtYWxsVmVjdG9yPFNpbXBsZVJlZmVyZW5jZSAqLCAxNj4gZWxlbWVudHM7CisgICAgZm9yIChTaW1wbGVSZWZlcmVuY2UgJm5vZGUgOiBfcmVmZXJlbmNlcykgeworICAgICAgZWxlbWVudHMucHVzaF9iYWNrKCZub2RlKTsKKyAgICB9CisgICAgc3RkOjpzb3J0KGVsZW1lbnRzLmJlZ2luKCksIGVsZW1lbnRzLmVuZCgpLAorICAgICAgICBbXSAoY29uc3QgU2ltcGxlUmVmZXJlbmNlICpsaHMsIGNvbnN0IFNpbXBsZVJlZmVyZW5jZSAqcmhzKSAtPiBib29sIHsKKyAgICAgICAgICB1aW50NjRfdCBsaHNPZmZzZXQgPSBsaHMtPm9mZnNldEluQXRvbSgpOworICAgICAgICAgIHVpbnQ2NF90IHJoc09mZnNldCA9IHJocy0+b2Zmc2V0SW5BdG9tKCk7CisgICAgICAgICAgaWYgKHJoc09mZnNldCAhPSBsaHNPZmZzZXQpCisgICAgICAgICAgICByZXR1cm4gKGxoc09mZnNldCA8IHJoc09mZnNldCk7CisgICAgICAgICAgaWYgKHJocy0+a2luZE5hbWVzcGFjZSgpICE9IGxocy0+a2luZE5hbWVzcGFjZSgpKQorICAgICAgICAgICAgcmV0dXJuIChsaHMtPmtpbmROYW1lc3BhY2UoKSA8IHJocy0+a2luZE5hbWVzcGFjZSgpKTsKKyAgICAgICAgICBpZiAocmhzLT5raW5kQXJjaCgpICE9IGxocy0+a2luZEFyY2goKSkKKyAgICAgICAgICAgIHJldHVybiAobGhzLT5raW5kQXJjaCgpIDwgcmhzLT5raW5kQXJjaCgpKTsKKyAgICAgICAgICByZXR1cm4gKGxocy0+a2luZFZhbHVlKCkgPCByaHMtPmtpbmRWYWx1ZSgpKTsKKyAgICAgICAgfSk7CisgICAgX3JlZmVyZW5jZXMuY2xlYXJBbmRMZWFrTm9kZXNVbnNhZmVseSgpOworICAgIGZvciAoU2ltcGxlUmVmZXJlbmNlICpub2RlIDogZWxlbWVudHMpIHsKKyAgICAgIF9yZWZlcmVuY2VzLnB1c2hfYmFjayhub2RlKTsKKyAgICB9CisgIH0KKworICB2b2lkIHNldE9yZGluYWwodWludDY0X3Qgb3JkKSB7IF9vcmRpbmFsID0gb3JkOyB9CisKK3ByaXZhdGU6CisgIHR5cGVkZWYgbGx2bTo6aWxpc3Q8U2ltcGxlUmVmZXJlbmNlPiBSZWZMaXN0OworCisgIGNvbnN0IEZpbGUgJl9maWxlOworICB1aW50NjRfdCBfb3JkaW5hbDsKKyAgbXV0YWJsZSBSZWZMaXN0IF9yZWZlcmVuY2VzOworfTsKKworY2xhc3MgU2ltcGxlVW5kZWZpbmVkQXRvbSA6IHB1YmxpYyBVbmRlZmluZWRBdG9tIHsKK3B1YmxpYzoKKyAgU2ltcGxlVW5kZWZpbmVkQXRvbShjb25zdCBGaWxlICZmLCBTdHJpbmdSZWYgbmFtZSkgOiBfZmlsZShmKSwgX25hbWUobmFtZSkgeworICAgIGFzc2VydCghbmFtZS5lbXB0eSgpICYmICJVbmRlZmluZWRBdG9tcyBtdXN0IGhhdmUgYSBuYW1lIik7CisgIH0KKworICB+U2ltcGxlVW5kZWZpbmVkQXRvbSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAvLy8gZmlsZSAtIHJldHVybnMgdGhlIEZpbGUgdGhhdCBwcm9kdWNlZC9vd25zIHRoaXMgQXRvbQorICBjb25zdCBGaWxlICZmaWxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gX2ZpbGU7IH0KKworICAvLy8gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBhdG9tLiBGb3IgYSBmdW5jdGlvbiBhdG9tLCBpdCBpcyB0aGUgKG1hbmdsZWQpCisgIC8vLyBuYW1lIG9mIHRoZSBmdW5jdGlvbi4KKyAgU3RyaW5nUmVmIG5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBfbmFtZTsgfQorCisgIENhbkJlTnVsbCBjYW5CZU51bGwoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBVbmRlZmluZWRBdG9tOjpjYW5CZU51bGxOZXZlcjsgfQorCitwcml2YXRlOgorICBjb25zdCBGaWxlICZfZmlsZTsKKyAgU3RyaW5nUmVmIF9uYW1lOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsZAorCisjZW5kaWYgLy8gTExEX0NPUkVfU0lNUExFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL1N5bWJvbFRhYmxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9TeW1ib2xUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwM2Y0OTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9TeW1ib2xUYWJsZS5oCkBAIC0wLDAgKzEsOTYgQEAKKy8vPT09LSBDb3JlL1N5bWJvbFRhYmxlLmggLSBNYWluIFN5bWJvbCBUYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExEX0NPUkVfU1lNQk9MX1RBQkxFX0gKKyNkZWZpbmUgTExEX0NPUkVfU1lNQk9MX1RBQkxFX0gKKworI2luY2x1ZGUgImxsZC9Db21tb24vTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RKQi5oIgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsZCB7CisKK2NsYXNzIEFic29sdXRlQXRvbTsKK2NsYXNzIEF0b207CitjbGFzcyBEZWZpbmVkQXRvbTsKK2NsYXNzIExpbmtpbmdDb250ZXh0OworY2xhc3MgUmVzb2x2ZXJPcHRpb25zOworY2xhc3MgU2hhcmVkTGlicmFyeUF0b207CitjbGFzcyBVbmRlZmluZWRBdG9tOworCisvLy8gXGJyaWVmIFRoZSBTeW1ib2xUYWJsZSBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgY29hbGVzY2luZyBhdG9tcy4KKy8vLworLy8vIEFsbCBhdG9tcyBjb2FsZXNjYWJsZSBieS1uYW1lIG9yIGJ5LWNvbnRlbnQgc2hvdWxkIGJlIGFkZGVkLgorLy8vIFRoZSBtZXRob2QgcmVwbGFjZW1lbnQoKSBjYW4gYmUgdXNlZCB0byBmaW5kIHRoZSByZXBsYWNlbWVudCBhdG9tCisvLy8gaWYgYW4gYXRvbSBoYXMgYmVlbiBjb2FsZXNjZWQgYXdheS4KK2NsYXNzIFN5bWJvbFRhYmxlIHsKK3B1YmxpYzoKKyAgLy8vIEBicmllZiBhZGQgYXRvbSB0byBzeW1ib2wgdGFibGUKKyAgYm9vbCBhZGQoY29uc3QgRGVmaW5lZEF0b20gJik7CisKKyAgLy8vIEBicmllZiBhZGQgYXRvbSB0byBzeW1ib2wgdGFibGUKKyAgYm9vbCBhZGQoY29uc3QgVW5kZWZpbmVkQXRvbSAmKTsKKworICAvLy8gQGJyaWVmIGFkZCBhdG9tIHRvIHN5bWJvbCB0YWJsZQorICBib29sIGFkZChjb25zdCBTaGFyZWRMaWJyYXJ5QXRvbSAmKTsKKworICAvLy8gQGJyaWVmIGFkZCBhdG9tIHRvIHN5bWJvbCB0YWJsZQorICBib29sIGFkZChjb25zdCBBYnNvbHV0ZUF0b20gJik7CisKKyAgLy8vIEBicmllZiByZXR1cm5zIGF0b20gaW4gc3ltYm9sIHRhYmxlIGZvciBzcGVjaWZpZWQgbmFtZSAob3IgbnVsbHB0cikKKyAgY29uc3QgQXRvbSAqZmluZEJ5TmFtZShTdHJpbmdSZWYgc3ltKTsKKworICAvLy8gQGJyaWVmIHJldHVybnMgdmVjdG9yIG9mIHJlbWFpbmluZyBVbmRlZmluZWRBdG9tcworICBzdGQ6OnZlY3Rvcjxjb25zdCBVbmRlZmluZWRBdG9tICo+IHVuZGVmaW5lcygpOworCisgIC8vLyBAYnJpZWYgaWYgYXRvbSBoYXMgYmVlbiBjb2FsZXNjZWQgYXdheSwgcmV0dXJuIHJlcGxhY2VtZW50LCBlbHNlIHJldHVybiBhdG9tCisgIGNvbnN0IEF0b20gKnJlcGxhY2VtZW50KGNvbnN0IEF0b20gKik7CisKKyAgLy8vIEBicmllZiBpZiBhdG9tIGhhcyBiZWVuIGNvYWxlc2NlZCBhd2F5LCByZXR1cm4gdHJ1ZQorICBib29sIGlzQ29hbGVzY2VkQXdheShjb25zdCBBdG9tICopOworCitwcml2YXRlOgorICB0eXBlZGVmIGxsdm06OkRlbnNlTWFwPGNvbnN0IEF0b20gKiwgY29uc3QgQXRvbSAqPiBBdG9tVG9BdG9tOworCisgIHN0cnVjdCBTdHJpbmdSZWZNYXBwaW5nSW5mbyB7CisgICAgc3RhdGljIFN0cmluZ1JlZiBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIFN0cmluZ1JlZigpOyB9CisgICAgc3RhdGljIFN0cmluZ1JlZiBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiBTdHJpbmdSZWYoIiAiLCAxKTsgfQorICAgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoU3RyaW5nUmVmIGNvbnN0IHZhbCkgeworICAgICAgcmV0dXJuIGxsdm06OmRqYkhhc2godmFsLCAwKTsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgaXNFcXVhbChTdHJpbmdSZWYgY29uc3QgbGhzLCBTdHJpbmdSZWYgY29uc3QgcmhzKSB7CisgICAgICByZXR1cm4gbGhzLmVxdWFscyhyaHMpOworICAgIH0KKyAgfTsKKyAgdHlwZWRlZiBsbHZtOjpEZW5zZU1hcDxTdHJpbmdSZWYsIGNvbnN0IEF0b20gKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWZNYXBwaW5nSW5mbz4gTmFtZVRvQXRvbTsKKworICBzdHJ1Y3QgQXRvbU1hcHBpbmdJbmZvIHsKKyAgICBzdGF0aWMgY29uc3QgRGVmaW5lZEF0b20gKiBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgICBzdGF0aWMgY29uc3QgRGVmaW5lZEF0b20gKiBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiAoRGVmaW5lZEF0b20qKSgtMSk7IH0KKyAgICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IERlZmluZWRBdG9tICogY29uc3QgVmFsKTsKKyAgICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IERlZmluZWRBdG9tICogY29uc3QgTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVmaW5lZEF0b20gKiBjb25zdCBSSFMpOworICB9OworICB0eXBlZGVmIGxsdm06OkRlbnNlU2V0PGNvbnN0IERlZmluZWRBdG9tKiwgQXRvbU1hcHBpbmdJbmZvPiBBdG9tQ29udGVudFNldDsKKworICBib29sIGFkZEJ5TmFtZShjb25zdCBBdG9tICYpOworICBib29sIGFkZEJ5Q29udGVudChjb25zdCBEZWZpbmVkQXRvbSAmKTsKKworICBBdG9tVG9BdG9tIF9yZXBsYWNlZEF0b21zOworICBOYW1lVG9BdG9tIF9uYW1lVGFibGU7CisgIEF0b21Db250ZW50U2V0IF9jb250ZW50VGFibGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbGQKKworI2VuZGlmIC8vIExMRF9DT1JFX1NZTUJPTF9UQUJMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9VbmRlZmluZWRBdG9tLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvQ29yZS9VbmRlZmluZWRBdG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ1ZDZlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL1VuZGVmaW5lZEF0b20uaApAQCAtMCwwICsxLDY4IEBACisvLz09PS0gQ29yZS9VbmRlZmluZWRBdG9tLmggLSBBbiBVbmRlZmluZWQgQXRvbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBMaW5rZXIKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMRF9DT1JFX1VOREVGSU5FRF9BVE9NX0gKKyNkZWZpbmUgTExEX0NPUkVfVU5ERUZJTkVEX0FUT01fSAorCisjaW5jbHVkZSAibGxkL0NvcmUvQXRvbS5oIgorCituYW1lc3BhY2UgbGxkIHsKKworLy8vIEFuIFVuZGVmaW5lZEF0b20gaGFzIG5vIGNvbnRlbnQuCisvLy8gSXQgZXhpc3RzIGFzIGEgcGxhY2Vob2xkZXIgZm9yIGEgZnV0dXJlIGF0b20uCitjbGFzcyBVbmRlZmluZWRBdG9tIDogcHVibGljIEF0b20geworcHVibGljOgorICAvLy8gV2hldGhlciB0aGlzIHVuZGVmaW5lZCBzeW1ib2wgbmVlZHMgdG8gYmUgcmVzb2x2ZWQsCisgIC8vLyBvciB3aGV0aGVyIGl0IGNhbiBqdXN0IGV2YWx1YXRlIHRvIG51bGxwdHIuCisgIC8vLyBUaGlzIGNvbmNlcHQgaXMgb2Z0ZW4gY2FsbGVkICJ3ZWFrIiwgYnV0IHRoYXQgdGVybQorICAvLy8gaXMgb3ZlcmxvYWRlZCB0byBtZWFuIG90aGVyIHRoaW5ncyB0b28uCisgIGVudW0gQ2FuQmVOdWxsIHsKKyAgICAvLy8gTm9ybWFsIHN5bWJvbHMgbXVzdCBiZSByZXNvbHZlZCBhdCBidWlsZCB0aW1lCisgICAgY2FuQmVOdWxsTmV2ZXIsCisKKyAgICAvLy8gVGhpcyBzeW1ib2wgY2FuIGJlIG1pc3NpbmcgYXQgcnVudGltZSBhbmQgd2lsbCBldmFsdXRlIHRvIG51bGxwdHIuCisgICAgLy8vIFRoYXQgaXMsIHRoZSBzdGF0aWMgbGlua2VyIHN0aWxsIG11c3QgZmluZCBhIGRlZmluaXRpb24gKHVzdWFsbHkKKyAgICAvLy8gaXMgc29tZSBzaGFyZWQgbGlicmFyeSksIGJ1dCBhdCBydW50aW1lLCB0aGUgZHluYW1pYyBsb2FkZXIKKyAgICAvLy8gd2lsbCBhbGxvdyB0aGUgc3ltYm9sIHRvIGJlIG1pc3NpbmcgYW5kIHJlc29sdmVkIHRvIG51bGxwdHIuCisgICAgLy8vCisgICAgLy8vIE9uIERhcndpbiB0aGlzIGlzIGdlbmVyYXRlZCB1c2luZyBhIGZ1bmN0aW9uIHByb3RvdHlwZSB3aXRoCisgICAgLy8vIF9fYXR0cmlidXRlX18oKHdlYWtfaW1wb3J0KSkuCisgICAgLy8vIE9uIGxpbnV4IHRoaXMgaXMgZ2VuZXJhdGVkIHVzaW5nIGEgZnVuY3Rpb24gcHJvdG90eXBlIHdpdGgKKyAgICAvLy8gIF9fYXR0cmlidXRlX18oKHdlYWspKS4KKyAgICAvLy8gT24gV2luZG93cyB0aGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZC4KKyAgICBjYW5CZU51bGxBdFJ1bnRpbWUsCisKKyAgICAvLy8gVGhpcyBzeW1ib2wgY2FuIGJlIG1pc3NpbmcgYXQgYnVpbGQgdGltZS4KKyAgICAvLy8gVGhhdCBpcywgdGhlIHN0YXRpYyBsaW5rZXIgd2lsbCBub3QgZXJyb3IgaWYgYSBkZWZpbml0aW9uIGZvcgorICAgIC8vLyB0aGlzIHN5bWJvbCBpcyBub3QgZm91bmQgYXQgYnVpbGQgdGltZS4gSW5zdGVhZCwgdGhlIGxpbmtlcgorICAgIC8vLyB3aWxsIGJ1aWxkIGFuIGV4ZWN1dGFibGUgdGhhdCBsZXRzIHRoZSBkeW5hbWljIGxvYWRlciBmaW5kIHRoZQorICAgIC8vLyBzeW1ib2wgYXQgcnVudGltZS4KKyAgICAvLy8gVGhpcyBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgb24gRGFyd2luIG5vciBXaW5kb3dzLgorICAgIC8vLyBPbiBsaW51eCB0aGlzIGlzIGdlbmVyYXRlZCB1c2luZyBhIGZ1bmN0aW9uIHByb3RvdHlwZSB3aXRoCisgICAgLy8vICBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkuCisgICAgY2FuQmVOdWxsQXRCdWlsZHRpbWUKKyAgfTsKKworICB2aXJ0dWFsIENhbkJlTnVsbCBjYW5CZU51bGwoKSBjb25zdCA9IDA7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBBdG9tICphKSB7CisgICAgcmV0dXJuIGEtPmRlZmluaXRpb24oKSA9PSBkZWZpbml0aW9uVW5kZWZpbmVkOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBVbmRlZmluZWRBdG9tICopIHsgcmV0dXJuIHRydWU7IH0KKworcHJvdGVjdGVkOgorICBVbmRlZmluZWRBdG9tKCkgOiBBdG9tKGRlZmluaXRpb25VbmRlZmluZWQpIHt9CisKKyAgflVuZGVmaW5lZEF0b20oKSBvdmVycmlkZSA9IGRlZmF1bHQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbGQKKworI2VuZGlmIC8vIExMRF9DT1JFX1VOREVGSU5FRF9BVE9NX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL1dyaXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL0NvcmUvV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwY2E0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsZC9Db3JlL1dyaXRlci5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vPT09LSBsbGQvQ29yZS9Xcml0ZXIuaCAtIEFic3RyYWN0IEZpbGUgRm9ybWF0IEludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExEX0NPUkVfV1JJVEVSX0gKKyNkZWZpbmUgTExEX0NPUkVfV1JJVEVSX0gKKworI2luY2x1ZGUgImxsZC9Db21tb24vTExWTS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbGQgeworY2xhc3MgRmlsZTsKK2NsYXNzIExpbmtpbmdDb250ZXh0OworY2xhc3MgTWFjaE9MaW5raW5nQ29udGV4dDsKKworLy8vIFxicmllZiBUaGUgV3JpdGVyIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciB3cml0aW5nIG9iamVjdCBmaWxlcywgc2hhcmVkCisvLy8gbGlicmFyeSBmaWxlcywgYW5kIGV4ZWN1dGFibGUgZmlsZXMuICBFYWNoIGZpbGUgZm9ybWF0IChlLmcuIG1hY2gtbywgZXRjKQorLy8vIGhhcyBhIGNvbmNyZXRlIHN1YmNsYXNzIG9mIFdyaXRlci4KK2NsYXNzIFdyaXRlciB7CitwdWJsaWM6CisgIHZpcnR1YWwgfldyaXRlcigpOworCisgIC8vLyBcYnJpZWYgV3JpdGUgYSBmaWxlIGZyb20gdGhlIHN1cHBsaWVkIEZpbGUgb2JqZWN0CisgIHZpcnR1YWwgbGx2bTo6RXJyb3Igd3JpdGVGaWxlKGNvbnN0IEZpbGUgJmxpbmtlZEZpbGUsIFN0cmluZ1JlZiBwYXRoKSA9IDA7CisKKyAgLy8vIFxicmllZiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgQ29yZSBMaW5raW5nIHRvIGdpdmUgdGhlIFdyaXRlciBhIGNoYW5jZQorICAvLy8gdG8gYWRkIGZpbGUgZm9ybWF0IHNwZWNpZmljICJmaWxlcyIgdG8gc2V0IG9mIGZpbGVzIHRvIGJlIGxpbmtlZC4gVGhpcyBpcworICAvLy8gaG93IGZpbGUgZm9ybWF0IHNwZWNpZmljIGF0b21zIGNhbiBiZSBhZGRlZCB0byB0aGUgbGluay4KKyAgdmlydHVhbCB2b2lkIGNyZWF0ZUltcGxpY2l0RmlsZXMoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEZpbGU+PiAmKSB7fQorCitwcm90ZWN0ZWQ6CisgIC8vIG9ubHkgY29uY3JldGUgc3ViY2xhc3NlcyBjYW4gYmUgaW5zdGFudGlhdGVkCisgIFdyaXRlcigpOworfTsKKworc3RkOjp1bmlxdWVfcHRyPFdyaXRlcj4gY3JlYXRlV3JpdGVyTWFjaE8oY29uc3QgTWFjaE9MaW5raW5nQ29udGV4dCAmKTsKK3N0ZDo6dW5pcXVlX3B0cjxXcml0ZXI+IGNyZWF0ZVdyaXRlcllBTUwoY29uc3QgTGlua2luZ0NvbnRleHQgJik7Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGxkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL1JlYWRlcldyaXRlci9NYWNoT0xpbmtpbmdDb250ZXh0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvUmVhZGVyV3JpdGVyL01hY2hPTGlua2luZ0NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWVmYThjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL1JlYWRlcldyaXRlci9NYWNoT0xpbmtpbmdDb250ZXh0LmgKQEAgLTAsMCArMSw1MDggQEAKKy8vPT09LSBsbGQvUmVhZGVyV3JpdGVyL01hY2hPTGlua2luZ0NvbnRleHQuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExEX1JFQURFUl9XUklURVJfTUFDSE9fTElOS0lOR19DT05URVhUX0gKKyNkZWZpbmUgTExEX1JFQURFUl9XUklURVJfTUFDSE9fTElOS0lOR19DT05URVhUX0gKKworI2luY2x1ZGUgImxsZC9Db3JlL0xpbmtpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAibGxkL0NvcmUvUmVhZGVyLmgiCisjaW5jbHVkZSAibGxkL0NvcmUvV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvTWFjaE8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPHNldD4KKwordXNpbmcgbGx2bTo6TWFjaE86OkhlYWRlckZpbGVUeXBlOworCituYW1lc3BhY2UgbGxkIHsKKworbmFtZXNwYWNlIG1hY2hfbyB7CitjbGFzcyBBcmNoSGFuZGxlcjsKK2NsYXNzIE1hY2hPRHlsaWJGaWxlOworY2xhc3MgTWFjaE9GaWxlOworY2xhc3MgU2VjdENyZWF0ZUZpbGU7Cit9CisKK2NsYXNzIE1hY2hPTGlua2luZ0NvbnRleHQgOiBwdWJsaWMgTGlua2luZ0NvbnRleHQgeworcHVibGljOgorICBNYWNoT0xpbmtpbmdDb250ZXh0KCk7CisgIH5NYWNoT0xpbmtpbmdDb250ZXh0KCkgb3ZlcnJpZGU7CisKKyAgZW51bSBBcmNoIHsKKyAgICBhcmNoX3Vua25vd24sCisgICAgYXJjaF9wcGMsCisgICAgYXJjaF94ODYsCisgICAgYXJjaF94ODZfNjQsCisgICAgYXJjaF9hcm12NiwKKyAgICBhcmNoX2FybXY3LAorICAgIGFyY2hfYXJtdjdzLAorICAgIGFyY2hfYXJtNjQsCisgIH07CisKKyAgZW51bSBjbGFzcyBPUyB7CisgICAgdW5rbm93biwKKyAgICBtYWNPU1gsCisgICAgaU9TLAorICAgIGlPU19zaW11bGF0b3IKKyAgfTsKKworICBlbnVtIGNsYXNzIEV4cG9ydE1vZGUgeworICAgIGdsb2JhbHMsICAgIC8vIERlZmF1bHQsIGFsbCBnbG9iYWwgc3ltYm9scyBleHBvcnRlZC4KKyAgICB3aGl0ZUxpc3QsICAvLyAtZXhwb3J0ZWRfc3ltYm9sW3NfbGlzdF0sIG9ubHkgbGlzdGVkIHN5bWJvbHMgZXhwb3J0ZWQuCisgICAgYmxhY2tMaXN0ICAgLy8gLXVuZXhwb3J0ZWRfc3ltYm9sW3NfbGlzdF0sIG5vIGxpc3RlZCBzeW1ib2wgZXhwb3J0ZWQuCisgIH07CisKKyAgZW51bSBjbGFzcyBEZWJ1Z0luZm9Nb2RlIHsKKyAgICBhZGREZWJ1Z01hcCwgICAgLy8gRGVmYXVsdAorICAgIG5vRGVidWdNYXAgICAgICAvLyAtUyBvcHRpb24KKyAgfTsKKworICBlbnVtIGNsYXNzIFVuZGVmaW5lZE1vZGUgeworICAgIGVycm9yLAorICAgIHdhcm5pbmcsCisgICAgc3VwcHJlc3MsCisgICAgZHluYW1pY0xvb2t1cAorICB9OworCisgIGVudW0gT2JqQ0NvbnN0cmFpbnQgeworICAgIG9iamNfdW5rbm93biA9IDAsCisgICAgb2JqY19zdXBwb3J0c19nYyA9IDIsCisgICAgb2JqY19nY19vbmx5ID0gNCwKKyAgICAvLyBJbWFnZSBvcHRpbWl6ZWQgYnkgZHlsZCA9IDgKKyAgICAvLyBHQyBjb21wYWN0aW9uID0gMTYKKyAgICBvYmpjX3JldGFpblJlbGVhc2VGb3JTaW11bGF0b3IgPSAzMiwKKyAgICBvYmpjX3JldGFpblJlbGVhc2UKKyAgfTsKKworICAvLy8gSW5pdGlhbGl6ZXMgdGhlIGNvbnRleHQgdG8gc2FuZSBkZWZhdWx0IHZhbHVlcyBnaXZlbiB0aGUgc3BlY2lmaWVkIG91dHB1dAorICAvLy8gZmlsZSB0eXBlLCBhcmNoLCBvcywgYW5kIG1pbmltdW0gb3MgdmVyc2lvbi4gIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUKKyAgLy8vIG90aGVyIHNldFhYWCgpIG1ldGhvZHMuCisgIHZvaWQgY29uZmlndXJlKEhlYWRlckZpbGVUeXBlIHR5cGUsIEFyY2ggYXJjaCwgT1Mgb3MsIHVpbnQzMl90IG1pbk9TVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgYm9vbCBleHBvcnREeW5hbWljU3ltYm9scyk7CisKKyAgdm9pZCBhZGRQYXNzZXMoUGFzc01hbmFnZXIgJnBtKSBvdmVycmlkZTsKKyAgYm9vbCB2YWxpZGF0ZUltcGwocmF3X29zdHJlYW0gJmRpYWdub3N0aWNzKSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZGVtYW5nbGUoU3RyaW5nUmVmIHN5bWJvbE5hbWUpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgY3JlYXRlSW1wbGljaXRGaWxlcyhzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RmlsZT4+ICYpIG92ZXJyaWRlOworCisgIC8vLyBDcmVhdGVzIGEgbmV3IGZpbGUgd2hpY2ggaXMgb3duZWQgYnkgdGhlIGNvbnRleHQuICBSZXR1cm5zIGEgcG9pbnRlciB0bworICAvLy8gdGhlIG5ldyBmaWxlLgorICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MuLi4gQXJncz4KKyAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlLCBUICo+Ojp0eXBlCisgIG1ha2VfZmlsZShBcmdzICYmLi4uIGFyZ3MpIGNvbnN0IHsKKyAgICBhdXRvIGZpbGUgPSBzdGQ6OnVuaXF1ZV9wdHI8VD4obmV3IFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSk7CisgICAgYXV0byAqZmlsZVB0ciA9IGZpbGUuZ2V0KCk7CisgICAgYXV0byAqY3R4ID0gY29uc3RfY2FzdDxNYWNoT0xpbmtpbmdDb250ZXh0ICo+KHRoaXMpOworICAgIGN0eC0+Z2V0Tm9kZXMoKS5wdXNoX2JhY2sobGx2bTo6bWFrZV91bmlxdWU8RmlsZU5vZGU+KHN0ZDo6bW92ZShmaWxlKSkpOworICAgIHJldHVybiBmaWxlUHRyOworICB9CisKKyAgdWludDMyX3QgZ2V0Q1BVVHlwZSgpIGNvbnN0OworICB1aW50MzJfdCBnZXRDUFVTdWJUeXBlKCkgY29uc3Q7CisKKyAgYm9vbCBhZGRFbnRyeVBvaW50TG9hZENvbW1hbmQoKSBjb25zdDsKKyAgYm9vbCBhZGRVbml4VGhyZWFkTG9hZENvbW1hbmQoKSBjb25zdDsKKyAgYm9vbCBvdXRwdXRUeXBlSGFzRW50cnkoKSBjb25zdDsKKyAgYm9vbCBpczY0Qml0KCkgY29uc3Q7CisKKyAgdmlydHVhbCB1aW50NjRfdCBwYWdlWmVyb1NpemUoKSBjb25zdCB7IHJldHVybiBfcGFnZVplcm9TaXplOyB9CisgIHZpcnR1YWwgdWludDY0X3QgcGFnZVNpemUoKSBjb25zdCB7IHJldHVybiBfcGFnZVNpemU7IH0KKworICBtYWNoX286OkFyY2hIYW5kbGVyICZhcmNoSGFuZGxlcigpIGNvbnN0OworCisgIEhlYWRlckZpbGVUeXBlIG91dHB1dE1hY2hPVHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9vdXRwdXRNYWNoT1R5cGU7IH0KKworICBBcmNoIGFyY2goKSBjb25zdCB7IHJldHVybiBfYXJjaDsgfQorICBTdHJpbmdSZWYgYXJjaE5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lRnJvbUFyY2goX2FyY2gpOyB9CisgIE9TIG9zKCkgY29uc3QgeyByZXR1cm4gX29zOyB9CisKKyAgRXhwb3J0TW9kZSBleHBvcnRNb2RlKCkgY29uc3QgeyByZXR1cm4gX2V4cG9ydE1vZGU7IH0KKyAgdm9pZCBzZXRFeHBvcnRNb2RlKEV4cG9ydE1vZGUgbW9kZSkgeyBfZXhwb3J0TW9kZSA9IG1vZGU7IH0KKyAgdm9pZCBhZGRFeHBvcnRTeW1ib2woU3RyaW5nUmVmIHN5bSk7CisgIGJvb2wgZXhwb3J0UmVzdHJpY3RNb2RlKCkgY29uc3QgeyByZXR1cm4gX2V4cG9ydE1vZGUgIT0gRXhwb3J0TW9kZTo6Z2xvYmFsczsgfQorICBib29sIGV4cG9ydFN5bWJvbE5hbWVkKFN0cmluZ1JlZiBzeW0pIGNvbnN0OworCisgIERlYnVnSW5mb01vZGUgZGVidWdJbmZvTW9kZSgpIGNvbnN0IHsgcmV0dXJuIF9kZWJ1Z0luZm9Nb2RlOyB9CisgIHZvaWQgc2V0RGVidWdJbmZvTW9kZShEZWJ1Z0luZm9Nb2RlIG1vZGUpIHsKKyAgICBfZGVidWdJbmZvTW9kZSA9IG1vZGU7CisgIH0KKworICB2b2lkIGFwcGVuZE9yZGVyZWRTeW1ib2woU3RyaW5nUmVmIHN5bWJvbCwgU3RyaW5nUmVmIGZpbGVuYW1lKTsKKworICBib29sIGtlZXBQcml2YXRlRXh0ZXJucygpIGNvbnN0IHsgcmV0dXJuIF9rZWVwUHJpdmF0ZUV4dGVybnM7IH0KKyAgdm9pZCBzZXRLZWVwUHJpdmF0ZUV4dGVybnMoYm9vbCB2KSB7IF9rZWVwUHJpdmF0ZUV4dGVybnMgPSB2OyB9CisgIGJvb2wgZGVtYW5nbGVTeW1ib2xzKCkgY29uc3QgeyByZXR1cm4gX2RlbWFuZ2xlOyB9CisgIHZvaWQgc2V0RGVtYW5nbGVTeW1ib2xzKGJvb2wgZCkgeyBfZGVtYW5nbGUgPSBkOyB9CisgIGJvb2wgbWVyZ2VPYmpDQ2F0ZWdvcmllcygpIGNvbnN0IHsgcmV0dXJuIF9tZXJnZU9iakNDYXRlZ29yaWVzOyB9CisgIHZvaWQgc2V0TWVyZ2VPYmpDQ2F0ZWdvcmllcyhib29sIHYpIHsgX21lcmdlT2JqQ0NhdGVnb3JpZXMgPSB2OyB9CisgIC8vLyBDcmVhdGUgZmlsZSBhdCBzcGVjaWZpZWQgcGF0aCB3aGljaCB3aWxsIGNvbnRhaW4gYSBiaW5hcnkgZW5jb2RpbmcKKyAgLy8vIG9mIGFsbCBpbnB1dCBhbmQgb3V0cHV0IGZpbGUgcGF0aHMuCisgIHN0ZDo6ZXJyb3JfY29kZSBjcmVhdGVEZXBlbmRlbmN5RmlsZShTdHJpbmdSZWYgcGF0aCk7CisgIHZvaWQgYWRkSW5wdXRGaWxlRGVwZW5kZW5jeShTdHJpbmdSZWYgcGF0aCkgY29uc3Q7CisgIHZvaWQgYWRkSW5wdXRGaWxlTm90Rm91bmQoU3RyaW5nUmVmIHBhdGgpIGNvbnN0OworICB2b2lkIGFkZE91dHB1dEZpbGVEZXBlbmRlbmN5KFN0cmluZ1JlZiBwYXRoKSBjb25zdDsKKworICBib29sIG1pbk9TKFN0cmluZ1JlZiBtYWMsIFN0cmluZ1JlZiBpT1MpIGNvbnN0OworICB2b2lkIHNldERvTm90aGluZyhib29sIHZhbHVlKSB7IF9kb05vdGhpbmcgPSB2YWx1ZTsgfQorICBib29sIGRvTm90aGluZygpIGNvbnN0IHsgcmV0dXJuIF9kb05vdGhpbmc7IH0KKyAgYm9vbCBwcmludEF0b21zKCkgY29uc3QgeyByZXR1cm4gX3ByaW50QXRvbXM7IH0KKyAgYm9vbCB0ZXN0aW5nRmlsZVVzYWdlKCkgY29uc3QgeyByZXR1cm4gX3Rlc3RpbmdGaWxlVXNhZ2U7IH0KKyAgY29uc3QgU3RyaW5nUmVmVmVjdG9yICZzZWFyY2hEaXJzKCkgY29uc3QgeyByZXR1cm4gX3NlYXJjaERpcnM7IH0KKyAgY29uc3QgU3RyaW5nUmVmVmVjdG9yICZmcmFtZXdvcmtEaXJzKCkgY29uc3QgeyByZXR1cm4gX2ZyYW1ld29ya0RpcnM7IH0KKyAgdm9pZCBzZXRTeXNMaWJSb290cyhjb25zdCBTdHJpbmdSZWZWZWN0b3IgJnBhdGhzKTsKKyAgY29uc3QgU3RyaW5nUmVmVmVjdG9yICZzeXNMaWJSb290cygpIGNvbnN0IHsgcmV0dXJuIF9zeXNsaWJSb290czsgfQorICBib29sIFBJRSgpIGNvbnN0IHsgcmV0dXJuIF9waWU7IH0KKyAgdm9pZCBzZXRQSUUoYm9vbCBwaWUpIHsgX3BpZSA9IHBpZTsgfQorICBib29sIGdlbmVyYXRlVmVyc2lvbkxvYWRDb21tYW5kKCkgY29uc3QgeworICAgIHJldHVybiBfZ2VuZXJhdGVWZXJzaW9uTG9hZENvbW1hbmQ7CisgIH0KKyAgdm9pZCBzZXRHZW5lcmF0ZVZlcnNpb25Mb2FkQ29tbWFuZChib29sIHYpIHsKKyAgICBfZ2VuZXJhdGVWZXJzaW9uTG9hZENvbW1hbmQgPSB2OworICB9CisKKyAgYm9vbCBnZW5lcmF0ZUZ1bmN0aW9uU3RhcnRzTG9hZENvbW1hbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIF9nZW5lcmF0ZUZ1bmN0aW9uU3RhcnRzTG9hZENvbW1hbmQ7CisgIH0KKyAgdm9pZCBzZXRHZW5lcmF0ZUZ1bmN0aW9uU3RhcnRzTG9hZENvbW1hbmQoYm9vbCB2KSB7CisgICAgX2dlbmVyYXRlRnVuY3Rpb25TdGFydHNMb2FkQ29tbWFuZCA9IHY7CisgIH0KKworICBib29sIGdlbmVyYXRlRGF0YUluQ29kZUxvYWRDb21tYW5kKCkgY29uc3QgeworICAgIHJldHVybiBfZ2VuZXJhdGVEYXRhSW5Db2RlTG9hZENvbW1hbmQ7CisgIH0KKyAgdm9pZCBzZXRHZW5lcmF0ZURhdGFJbkNvZGVMb2FkQ29tbWFuZChib29sIHYpIHsKKyAgICBfZ2VuZXJhdGVEYXRhSW5Db2RlTG9hZENvbW1hbmQgPSB2OworICB9CisKKyAgdWludDY0X3Qgc3RhY2tTaXplKCkgY29uc3QgeyByZXR1cm4gX3N0YWNrU2l6ZTsgfQorICB2b2lkIHNldFN0YWNrU2l6ZSh1aW50NjRfdCBzdGFja1NpemUpIHsgX3N0YWNrU2l6ZSA9IHN0YWNrU2l6ZTsgfQorCisgIHVpbnQ2NF90IGJhc2VBZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gX2Jhc2VBZGRyZXNzOyB9CisgIHZvaWQgc2V0QmFzZUFkZHJlc3ModWludDY0X3QgYmFzZUFkZHJlc3MpIHsgX2Jhc2VBZGRyZXNzID0gYmFzZUFkZHJlc3M7IH0KKworICBPYmpDQ29uc3RyYWludCBvYmpjQ29uc3RyYWludCgpIGNvbnN0IHsgcmV0dXJuIF9vYmpjQ29uc3RyYWludDsgfQorCisgIHVpbnQzMl90IG9zTWluVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIF9vc01pblZlcnNpb247IH0KKworICB1aW50MzJfdCBzZGtWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gX3Nka1ZlcnNpb247IH0KKyAgdm9pZCBzZXRTZGtWZXJzaW9uKHVpbnQ2NF90IHYpIHsgX3Nka1ZlcnNpb24gPSB2OyB9CisKKyAgdWludDY0X3Qgc291cmNlVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIF9zb3VyY2VWZXJzaW9uOyB9CisgIHZvaWQgc2V0U291cmNlVmVyc2lvbih1aW50NjRfdCB2KSB7IF9zb3VyY2VWZXJzaW9uID0gdjsgfQorCisgIHVpbnQzMl90IHN3aWZ0VmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIF9zd2lmdFZlcnNpb247IH0KKworICAvLy8gXGJyaWVmIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gcGF0aCBvbiB0aGUgZmlsZXN5c3RlbSBleGlzdHMuCisgIC8vLworICAvLy8gV2hlbiBydW5uaW5nIGluIC10ZXN0X2ZpbGVfdXNhZ2UgbW9kZSwgdGhpcyBtZXRob2QgY29uc3VsdHMgYW4KKyAgLy8vIGludGVybmFsbHkgbWFpbnRhaW5lZCBsaXN0IG9mIGZpbGVzIHRoYXQgZXhpc3QgKHByb3ZpZGVkIGJ5IC1wYXRoX2V4aXN0cykKKyAgLy8vIGluc3RlYWQgb2YgdGhlIGFjdHVhbCBmaWxlc3lzdGVtLgorICBib29sIHBhdGhFeGlzdHMoU3RyaW5nUmVmIHBhdGgpIGNvbnN0OworCisgIC8vLyBMaWtlIHBhdGhFeGlzdHMoKSBidXQgb25seSB1c2VkIG9uIGZpbGVzIC0gbm90IGRpcmVjdG9yaWVzLgorICBib29sIGZpbGVFeGlzdHMoU3RyaW5nUmVmIHBhdGgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQWRkcyBhbnkgbGlicmFyeSBzZWFyY2ggcGF0aHMgZGVyaXZlZCBmcm9tIHRoZSBnaXZlbiBiYXNlLCBwb3NzaWJseQorICAvLy8gbW9kaWZpZWQgYnkgLXN5c2xpYnJvb3RzLgorICAvLy8KKyAgLy8vIFRoZSBzZXQgb2YgcGF0aHMgYWRkZWQgY29uc2lzdHMgb2YgYXBwcm94aW1hdGVseSBhbGwgc3lzbGlicm9vdC1wcmVwZW5kZWQKKyAgLy8vIHZlcnNpb25zIG9mIGxpYlBhdGggdGhhdCBleGlzdCwgb3IgdGhlIG9yaWdpbmFsIGxpYlBhdGggaWYgdGhlcmUgYXJlIG5vbmUKKyAgLy8vIGZvciB3aGF0ZXZlciByZWFzb24uIFdpdGggdmFyaW91cyBlZGdlLWNhc2VzIGZvciBjb21wYXRpYmlsaXR5LgorICB2b2lkIGFkZE1vZGlmaWVkU2VhcmNoRGlyKFN0cmluZ1JlZiBsaWJQYXRoLCBib29sIGlzU3lzdGVtUGF0aCA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIC1sRm9vIGNhbiBiZSByZXNvbHZlIHdpdGhpbiB0aGUgZ2l2ZW4gcGF0aCwgYW5kCisgIC8vLyByZXR1cm4gdGhlIGZpbGVuYW1lIGlmIHNvLgorICAvLy8KKyAgLy8vIFRoZSAtbEZvbyBvcHRpb24gaXMgZG9jdW1lbnRlZCB0byBzZWFyY2ggZm9yIGxpYkZvby5keWxpYiBhbmQgbGliRm9vLmEgaW4KKyAgLy8vIHRoYXQgb3JkZXIsIHVubGVzcyBGb28gZW5kcyBpbiAiLm8iLCBpbiB3aGljaCBjYXNlIG9ubHkgdGhlIGV4YWN0IGZpbGUKKyAgLy8vIG1hdGNoZXMgKGUuZy4gLWxmb28ubyB3b3VsZCBvbmx5IGZpbmQgZm9vLm8pLgorICBsbHZtOjpPcHRpb25hbDxTdHJpbmdSZWY+IHNlYXJjaERpckZvckxpYnJhcnkoU3RyaW5nUmVmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgbGliTmFtZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJdGVyYXRlcyB0aHJvdWdoIGFsbCBzZWFyY2ggcGF0aCBlbnRyaWVzIGxvb2tpbmcgZm9yIGxpYk5hbWUgKGFzCisgIC8vLyBzcGVjaWZpZWQgYnkgLWxGb28pLgorICBsbHZtOjpPcHRpb25hbDxTdHJpbmdSZWY+IHNlYXJjaExpYnJhcnkoU3RyaW5nUmVmIGxpYk5hbWUpIGNvbnN0OworCisgIC8vLyBBZGQgYSBmcmFtZXdvcmsgc2VhcmNoIHBhdGguICBJbnRlcm5hbGx5LCB0aGlzIG1ldGhvZCBtYXkgYmUgcHJlcGVuZGVkCisgIC8vLyB0aGUgcGF0aCB3aXRoIHN5c2xpYnJvb3QuCisgIHZvaWQgYWRkRnJhbWV3b3JrU2VhcmNoRGlyKFN0cmluZ1JlZiBmd1BhdGgsIGJvb2wgaXNTeXN0ZW1QYXRoID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgSXRlcmF0ZXMgdGhyb3VnaCBhbGwgZnJhbWV3b3JrIGRpcmVjdG9yaWVzIGxvb2tpbmcgZm9yCisgIC8vLyBGb28uZnJhbWV3b3JrL0ZvbyAod2hlbiBmd05hbWUgPSAiRm9vIikuCisgIGxsdm06Ok9wdGlvbmFsPFN0cmluZ1JlZj4gZmluZFBhdGhGb3JGcmFtZXdvcmsoU3RyaW5nUmVmIGZ3TmFtZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUaGUgZHlsaWIncyBiaW5hcnkgY29tcGF0aWJpbGl0eSB2ZXJzaW9uLCBpbiB0aGUgcmF3IHVpbnQzMiBmb3JtYXQuCisgIC8vLworICAvLy8gV2hlbiBidWlsZGluZyBhIGR5bmFtaWMgbGlicmFyeSwgdGhpcyBpcyB0aGUgY29tcGF0aWJpbGl0eSB2ZXJzaW9uIHRoYXQKKyAgLy8vIGdldHMgZW1iZWRkZWQgaW50byB0aGUgcmVzdWx0LiBPdGhlciBNYWNoLU8gYmluYXJpZXMgdGhhdCBsaW5rIGFnYWluc3QKKyAgLy8vIHRoaXMgbGlicmFyeSB3aWxsIHN0b3JlIHRoZSBjb21wYXRpYmlsaXR5IHZlcnNpb24gaW4gaXRzIGxvYWQgY29tbWFuZC4gQXQKKyAgLy8vIHJ1bnRpbWUsIHRoZSBsb2FkZXIgd2lsbCB2ZXJpZnkgdGhhdCB0aGUgYmluYXJ5IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUKKyAgLy8vIGluc3RhbGxlZCBkeW5hbWljIGxpYnJhcnkuCisgIHVpbnQzMl90IGNvbXBhdGliaWxpdHlWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gX2NvbXBhdGliaWxpdHlWZXJzaW9uOyB9CisKKyAgLy8vIFxicmllZiBUaGUgZHlsaWIncyBjdXJyZW50IHZlcnNpb24sIGluIHRoZSB0aGUgcmF3IHVpbnQzMiBmb3JtYXQuCisgIC8vLworICAvLy8gV2hlbiBidWlsZGluZyBhIGR5bmFtaWMgbGlicmFyeSwgdGhpcyBpcyB0aGUgY3VycmVudCB2ZXJzaW9uIHRoYXQgZ2V0cworICAvLy8gZW1iZWRkZWQgaW50byB0aGUgcmVzdWx0LiBPdGhlciBNYWNoLU8gYmluYXJpZXMgdGhhdCBsaW5rIGFnYWluc3QKKyAgLy8vIHRoaXMgbGlicmFyeSB3aWxsIHN0b3JlIHRoZSBjb21wYXRpYmlsaXR5IHZlcnNpb24gaW4gaXRzIGxvYWQgY29tbWFuZC4KKyAgdWludDMyX3QgY3VycmVudFZlcnNpb24oKSBjb25zdCB7IHJldHVybiBfY3VycmVudFZlcnNpb247IH0KKworICAvLy8gXGJyaWVmIFRoZSBkeWxpYidzIGluc3RhbGwgbmFtZS4KKyAgLy8vCisgIC8vLyBCaW5hcmllcyB0aGF0IGxpbmsgYWdhaW5zdCB0aGUgZHlsaWIgd2lsbCBlbWJlZCB0aGlzIHBhdGggaW50byB0aGUgZHlsaWIKKyAgLy8vIGxvYWQgY29tbWFuZC4gV2hlbiBsb2FkaW5nIHRoZSBiaW5hcmllcyBhdCBydW50aW1lLCB0aGlzIGlzIHRoZSBsb2NhdGlvbgorICAvLy8gb24gZGlzayB0aGF0IHRoZSBsb2FkZXIgd2lsbCBsb29rIGZvciB0aGUgZHlsaWIuCisgIFN0cmluZ1JlZiBpbnN0YWxsTmFtZSgpIGNvbnN0IHsgcmV0dXJuIF9pbnN0YWxsTmFtZTsgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciBvciBub3QgdGhlIGR5bGliIGhhcyBzaWRlIGVmZmVjdHMgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICAvLy8KKyAgLy8vIER5bGlicyBtYXJrZWQgYXMgYmVpbmcgZGVhZCBzdHJpcHBhYmxlIHByb3ZpZGUgdGhlIGd1YXJhbnRlZSB0aGF0IGxvYWRpbmcKKyAgLy8vIHRoZSBkeWxpYiBoYXMgbm8gc2lkZSBlZmZlY3RzLCBhbGxvd2luZyB0aGUgbGlua2VyIHRvIHN0cmlwIG91dCB0aGUgZHlsaWIKKyAgLy8vIHdoZW4gbGlua2luZyBhIGJpbmFyeSB0aGF0IGRvZXMgbm90IHVzZSBhbnkgb2YgaXRzIHN5bWJvbHMuCisgIGJvb2wgZGVhZFN0cmlwcGFibGVEeWxpYigpIGNvbnN0IHsgcmV0dXJuIF9kZWFkU3RyaXBwYWJsZUR5bGliOyB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIG9yIG5vdCB0byB1c2UgZmxhdCBuYW1lc3BhY2UuCisgIC8vLworICAvLy8gTWFjaE8gdXN1YWxseSB1c2VzIGEgdHdvLWxldmVsIG5hbWVzcGFjZSwgd2hlcmUgZWFjaCBleHRlcm5hbCBzeW1ib2wKKyAgLy8vIHJlZmVyZW5jZWQgYnkgdGhlIHRhcmdldCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGR5bGliIHRoYXQgd2lsbCBwcm92aWRlCisgIC8vLyB0aGUgc3ltYm9sJ3MgZGVmaW5pdGlvbiBhdCBydW50aW1lLiBVc2luZyBmbGF0IG5hbWVzcGFjZSBvdmVycmlkZXMgdGhpcworICAvLy8gYmVoYXZpb3I6IHRoZSBsaW5rZXIgc2VhcmNoZXMgYWxsIGR5bGlicyBvbiB0aGUgY29tbWFuZCBsaW5lIGFuZCBhbGwKKyAgLy8vIGR5bGlicyB0aG9zZSBvcmlnaW5hbCBkeWxpYnMgZGVwZW5kIG9uLCBidXQgZG9lcyBub3QgcmVjb3JkIHdoaWNoIGR5bGliCisgIC8vLyBhbiBleHRlcm5hbCBzeW1ib2wgY2FtZSBmcm9tLiBBdCBydW50aW1lIGR5bGQgYWdhaW4gc2VhcmNoZXMgYWxsIGltYWdlcworICAvLy8gYW5kIHVzZXMgdGhlIGZpcnN0IGRlZmluaXRpb24gaXQgZmluZHMuIEluIGFkZGl0aW9uLCBhbnkgdW5kZWZpbmVzIGluCisgIC8vLyBsb2FkZWQgZmxhdF9uYW1lc3BhY2UgZHlsaWJzIG11c3QgYmUgcmVzb2x2YWJsZSBhdCBidWlsZCB0aW1lLgorICBib29sIHVzZUZsYXROYW1lc3BhY2UoKSBjb25zdCB7IHJldHVybiBfZmxhdE5hbWVzcGFjZTsgfQorCisgIC8vLyBcYnJpZWYgSG93IHRvIGhhbmRsZSB1bmRlZmluZWQgc3ltYm9scy4KKyAgLy8vCisgIC8vLyBPcHRpb25zIGFyZToKKyAgLy8vICAqIGVycm9yOiBSZXBvcnQgYW4gZXJyb3IgYW5kIHRlcm1pbmF0ZSBsaW5raW5nLgorICAvLy8gICogd2FybmluZzogUmVwb3J0IGEgd2FybmluZywgYnV0IGNvbnRpbnVlIGxpbmtpbmcuCisgIC8vLyAgKiBzdXBwcmVzczogSWdub3JlIGFuZCBjb250aW51ZSBsaW5raW5nLgorICAvLy8gICogZHluYW1pY19sb29rdXA6IEZvciB1c2Ugd2l0aCAtdHdvbGV2ZWwgbmFtZXNwYWNlOiBSZWNvcmRzIHNvdXJjZSBkeWxpYnMKKyAgLy8vICAgIGZvciBzeW1ib2xzIHRoYXQgYXJlIGRlZmluZWQgaW4gYSBsaW5rZWQgZHlsaWIgYXQgc3RhdGljIGxpbmsgdGltZS4KKyAgLy8vICAgIFVuZGVmaW5lZCBzeW1ib2xzIGFyZSBoYW5kbGVkIGJ5IHNlYXJjaGluZyBhbGwgbG9hZGVkIGltYWdlcyBhdAorICAvLy8gICAgcnVudGltZS4KKyAgVW5kZWZpbmVkTW9kZSB1bmRlZmluZWRNb2RlKCkgY29uc3QgeyByZXR1cm4gX3VuZGVmaW5lZE1vZGU7IH0KKworICAvLy8gXGJyaWVmIFRoZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlIHRoYXQgd2lsbCBsb2FkIHRoZSBidW5kbGUgYXQgcnVudGltZS4KKyAgLy8vCisgIC8vLyBXaGVuIGJ1aWxkaW5nIGEgTWFjaC1PIGJ1bmRsZSwgdGhpcyBleGVjdXRhYmxlIHdpbGwgYmUgZXhhbWluZWQgaWYgdGhlcmUKKyAgLy8vIGFyZSB1bmRlZmluZWQgc3ltYm9scyBhZnRlciB0aGUgbWFpbiBsaW5rIHBoYXNlLiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoaXMKKyAgLy8vIGJpbmFyeSB3aWxsIGJlIGxvYWRpbmcgdGhlIGJ1bmRsZSBhdCBydW50aW1lIGFuZCB3aWxsIHByb3ZpZGUgdGhlIHN5bWJvbHMKKyAgLy8vIGF0IHRoYXQgcG9pbnQuCisgIFN0cmluZ1JlZiBidW5kbGVMb2FkZXIoKSBjb25zdCB7IHJldHVybiBfYnVuZGxlTG9hZGVyOyB9CisKKyAgdm9pZCBzZXRDb21wYXRpYmlsaXR5VmVyc2lvbih1aW50MzJfdCB2ZXJzKSB7IF9jb21wYXRpYmlsaXR5VmVyc2lvbiA9IHZlcnM7IH0KKyAgdm9pZCBzZXRDdXJyZW50VmVyc2lvbih1aW50MzJfdCB2ZXJzKSB7IF9jdXJyZW50VmVyc2lvbiA9IHZlcnM7IH0KKyAgdm9pZCBzZXRJbnN0YWxsTmFtZShTdHJpbmdSZWYgbmFtZSkgeyBfaW5zdGFsbE5hbWUgPSBuYW1lOyB9CisgIHZvaWQgc2V0RGVhZFN0cmlwcGFibGVEeWxpYihib29sIGRlYWRTdHJpcHBhYmxlKSB7CisgICAgX2RlYWRTdHJpcHBhYmxlRHlsaWIgPSBkZWFkU3RyaXBwYWJsZTsKKyAgfQorICB2b2lkIHNldFVzZUZsYXROYW1lc3BhY2UoYm9vbCBmbGF0TmFtZXNwYWNlKSB7CisgICAgX2ZsYXROYW1lc3BhY2UgPSBmbGF0TmFtZXNwYWNlOworICB9CisKKyAgdm9pZCBzZXRVbmRlZmluZWRNb2RlKFVuZGVmaW5lZE1vZGUgdW5kZWZpbmVkTW9kZSkgeworICAgIF91bmRlZmluZWRNb2RlID0gdW5kZWZpbmVkTW9kZTsKKyAgfQorCisgIHZvaWQgc2V0QnVuZGxlTG9hZGVyKFN0cmluZ1JlZiBsb2FkZXIpIHsgX2J1bmRsZUxvYWRlciA9IGxvYWRlcjsgfQorICB2b2lkIHNldFByaW50QXRvbXMoYm9vbCB2YWx1ZT10cnVlKSB7IF9wcmludEF0b21zID0gdmFsdWU7IH0KKyAgdm9pZCBzZXRUZXN0aW5nRmlsZVVzYWdlKGJvb2wgdmFsdWUgPSB0cnVlKSB7CisgICAgX3Rlc3RpbmdGaWxlVXNhZ2UgPSB2YWx1ZTsKKyAgfQorICB2b2lkIGFkZEV4aXN0aW5nUGF0aEZvckRlYnVnKFN0cmluZ1JlZiBwYXRoKSB7CisgICAgX2V4aXN0aW5nUGF0aHMuaW5zZXJ0KHBhdGgpOworICB9CisKKyAgdm9pZCBhZGRScGF0aChTdHJpbmdSZWYgcnBhdGgpOworICBjb25zdCBTdHJpbmdSZWZWZWN0b3IgJnJwYXRocygpIGNvbnN0IHsgcmV0dXJuIF9ycGF0aHM7IH0KKworICAvLy8gQWRkIHNlY3Rpb24gYWxpZ25tZW50IGNvbnN0cmFpbnQgb24gZmluYWwgbGF5b3V0LgorICB2b2lkIGFkZFNlY3Rpb25BbGlnbm1lbnQoU3RyaW5nUmVmIHNlZywgU3RyaW5nUmVmIHNlY3QsIHVpbnQxNl90IGFsaWduKTsKKworICAvLy8gXGJyaWVmIEFkZCBhIHNlY3Rpb24gYmFzZWQgb24gYSBjb21tYW5kLWxpbmUgc2VjdGNyZWF0ZSBvcHRpb24uCisgIHZvaWQgYWRkU2VjdENyZWF0ZVNlY3Rpb24oU3RyaW5nUmVmIHNlZywgU3RyaW5nUmVmIHNlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gY29udGVudCk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBzcGVjaWZpZWQgc2VjdGlvbiBoYWQgYWxpZ25tZW50IGNvbnN0cmFpbnRzLgorICBib29sIHNlY3Rpb25BbGlnbmVkKFN0cmluZ1JlZiBzZWcsIFN0cmluZ1JlZiBzZWN0LCB1aW50MTZfdCAmYWxpZ24pIGNvbnN0OworCisgIFN0cmluZ1JlZiBkeWxkUGF0aCgpIGNvbnN0IHsgcmV0dXJuICIvdXNyL2xpYi9keWxkIjsgfQorCisgIC8vLyBTdHViIGNyZWF0aW9uIFBhc3Mgc2hvdWxkIGJlIHJ1bi4KKyAgYm9vbCBuZWVkc1N0dWJzUGFzcygpIGNvbnN0OworCisgIC8vIEdPVCBjcmVhdGlvbiBQYXNzIHNob3VsZCBiZSBydW4uCisgIGJvb2wgbmVlZHNHT1RQYXNzKCkgY29uc3Q7CisKKyAgLy8vIFBhc3MgdG8gYWRkIFRMViBzZWN0aW9ucy4KKyAgYm9vbCBuZWVkc1RMVlBhc3MoKSBjb25zdDsKKworICAvLy8gUGFzcyB0byB0cmFuc2Zvcm0gX19jb21wYWN0X3Vud2luZCBpbnRvIF9fdW53aW5kX2luZm8gc2hvdWxkIGJlIHJ1bi4KKyAgYm9vbCBuZWVkc0NvbXBhY3RVbndpbmRQYXNzKCkgY29uc3Q7CisKKyAgLy8vIFBhc3MgdG8gYWRkIHNoaW1zIHN3aXRjaGluZyBiZXR3ZWVuIHRodW1iIGFuZCBhcm0gbW9kZS4KKyAgYm9vbCBuZWVkc1NoaW1QYXNzKCkgY29uc3Q7CisKKyAgLy8vIFBhc3MgdG8gYWRkIG9iamMgaW1hZ2UgaW5mbyBhbmQgb3B0aW1pemVkIG9iamMgZGF0YS4KKyAgYm9vbCBuZWVkc09iakNQYXNzKCkgY29uc3Q7CisKKyAgLy8vIE1hZ2ljIHN5bWJvbCBuYW1lIHN0dWJzIHdpbGwgbmVlZCB0byBoZWxwIGxhenkgYmluZC4KKyAgU3RyaW5nUmVmIGJpbmRlclN5bWJvbE5hbWUoKSBjb25zdDsKKworICAvLy8gVXNlZCB0byBrZWVwIHRyYWNrIG9mIGRpcmVjdCBhbmQgaW5kaXJlY3QgZHlsaWJzLgorICB2b2lkIHJlZ2lzdGVyRHlsaWIobWFjaF9vOjpNYWNoT0R5bGliRmlsZSAqZHlsaWIsIGJvb2wgdXB3YXJkKSBjb25zdDsKKworICAvLyBSZWFkcyBhIGZpbGUgZnJvbSBkaXNrIHRvIG1lbW9yeS4gUmV0dXJucyBvbmx5IGEgbmVlZGVkIGNodW5rCisgIC8vIGlmIGEgZmF0IGJpbmFyeS4KKyAgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPj4gZ2V0TWVtb3J5QnVmZmVyKFN0cmluZ1JlZiBwYXRoKTsKKworICAvLy8gVXNlZCB0byBmaW5kIGluZGlyZWN0IGR5bGlicy4gSW5zdGFudGlhdGVzIGEgTWFjaE9EeWxpYkZpbGUgaWYgb25lCisgIC8vLyBoYXMgbm90IGFscmVhZHkgYmVlbiBtYWRlIGZvciB0aGUgcmVxdWVzdGVkIGR5bGliLiAgVXNlcyAtTCBhbmQgLUYKKyAgLy8vIHNlYXJjaCBwYXRocyB0byBhbGxvdyBpbmRpcmVjdCBkeWxpYnMgdG8gYmUgb3ZlcnJpZGRlbi4KKyAgbWFjaF9vOjpNYWNoT0R5bGliRmlsZSogZmluZEluZGlyZWN0RHlsaWIoU3RyaW5nUmVmIHBhdGgpOworCisgIHVpbnQzMl90IGR5bGliQ3VycmVudFZlcnNpb24oU3RyaW5nUmVmIGluc3RhbGxOYW1lKSBjb25zdDsKKworICB1aW50MzJfdCBkeWxpYkNvbXBhdFZlcnNpb24oU3RyaW5nUmVmIGluc3RhbGxOYW1lKSBjb25zdDsKKworICBBcnJheVJlZjxtYWNoX286Ok1hY2hPRHlsaWJGaWxlKj4gYWxsRHlsaWJzKCkgY29uc3QgeworICAgIHJldHVybiBfYWxsRHlsaWJzOworICB9CisKKyAgLy8vIENyZWF0ZXMgYSBjb3B5IChvd25lZCBieSB0aGlzIE1hY2hPTGlua2luZ0NvbnRleHQpIG9mIGEgc3RyaW5nLgorICBTdHJpbmdSZWYgY29weShTdHJpbmdSZWYgc3RyKSB7IHJldHVybiBzdHIuY29weShfYWxsb2NhdG9yKTsgfQorCisgIC8vLyBJZiB0aGUgbWVtb3J5QnVmZmVyIGlzIGEgZmF0IGZpbGUgd2l0aCBhIHNsaWNlIGZvciB0aGUgY3VycmVudCBhcmNoLAorICAvLy8gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIG9mZnNldCBhbmQgc2l6ZSBvZiB0aGF0IHNsaWNlLgorICBib29sIHNsaWNlRnJvbUZhdEZpbGUoTWVtb3J5QnVmZmVyUmVmIG1iLCB1aW50MzJfdCAmb2Zmc2V0LCB1aW50MzJfdCAmc2l6ZSk7CisKKyAgLy8vIFJldHVybnMgaWYgYSBjb21tYW5kIGxpbmUgb3B0aW9uIHNwZWNpZmllZCBkeWxpYiBpcyBhbiB1cHdhcmQgbGluay4KKyAgYm9vbCBpc1Vwd2FyZER5bGliKFN0cmluZ1JlZiBpbnN0YWxsTmFtZSkgY29uc3Q7CisKKyAgc3RhdGljIGJvb2wgaXNUaGluT2JqZWN0RmlsZShTdHJpbmdSZWYgcGF0aCwgQXJjaCAmYXJjaCk7CisgIHN0YXRpYyBBcmNoIGFyY2hGcm9tQ3B1VHlwZSh1aW50MzJfdCBjcHV0eXBlLCB1aW50MzJfdCBjcHVzdWJ0eXBlKTsKKyAgc3RhdGljIEFyY2ggYXJjaEZyb21OYW1lKFN0cmluZ1JlZiBhcmNoTmFtZSk7CisgIHN0YXRpYyBTdHJpbmdSZWYgbmFtZUZyb21BcmNoKEFyY2ggYXJjaCk7CisgIHN0YXRpYyB1aW50MzJfdCBjcHVUeXBlRnJvbUFyY2goQXJjaCBhcmNoKTsKKyAgc3RhdGljIHVpbnQzMl90IGNwdVN1YnR5cGVGcm9tQXJjaChBcmNoIGFyY2gpOworICBzdGF0aWMgYm9vbCBpczY0Qml0KEFyY2ggYXJjaCk7CisgIHN0YXRpYyBib29sIGlzSG9zdEVuZGlhbihBcmNoIGFyY2gpOworICBzdGF0aWMgYm9vbCBpc0JpZ0VuZGlhbihBcmNoIGFyY2gpOworCisgIC8vLyBDb25zdHJ1Y3QgMzItYml0IHZhbHVlIGZyb20gc3RyaW5nICJYLlkuWiIgd2hlcmUKKyAgLy8vIGJpdHMgYXJlIHh4eHgueXkuenouICBMYXJnZXN0IG51bWJlciBpcyA2NTUzNS4yNTUuMjU1CisgIHN0YXRpYyBib29sIHBhcnNlUGFja2VkVmVyc2lvbihTdHJpbmdSZWYgc3RyLCB1aW50MzJfdCAmcmVzdWx0KTsKKworICAvLy8gQ29uc3RydWN0IDY0LWJpdCB2YWx1ZSBmcm9tIHN0cmluZyAiQS5CLkMuRC5FIiB3aGVyZQorICAvLy8gYml0cyBhcmUgYWFhYS5iYi5jYy5kZC5lZS4gIExhcmdlc3QgbnVtYmVyIGlzIDE2Nzc3MjE1LjEwMjMuMTAyMy4xMDIzLjEwMjMKKyAgc3RhdGljIGJvb2wgcGFyc2VQYWNrZWRWZXJzaW9uKFN0cmluZ1JlZiBzdHIsIHVpbnQ2NF90ICZyZXN1bHQpOworCisgIHZvaWQgZmluYWxpemVJbnB1dEZpbGVzKCkgb3ZlcnJpZGU7CisKKyAgbGx2bTo6RXJyb3IgaGFuZGxlTG9hZGVkRmlsZShGaWxlICZmaWxlKSBvdmVycmlkZTsKKworICBib29sIGN1c3RvbUF0b21PcmRlcmVyKGNvbnN0IERlZmluZWRBdG9tICpsZWZ0LCBjb25zdCBEZWZpbmVkQXRvbSAqcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmbGVmdEJlZm9yZVJpZ2h0KSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSAnZmxhdCBuYW1lc3BhY2UnIGZpbGUuIFRoaXMgaXMgdGhlIGZpbGUgdGhhdCBzdXBwbGllcworICAvLy8gYXRvbXMgZm9yIG90aGVyd2lzZSB1bmRlZmluZWQgc3ltYm9scyB3aGVuIHRoZSAtZmxhdF9uYW1lc3BhY2Ugb3IKKyAgLy8vIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAgb3B0aW9ucyBhcmUgdXNlZC4KKyAgRmlsZSogZmxhdE5hbWVzcGFjZUZpbGUoKSBjb25zdCB7IHJldHVybiBfZmxhdE5hbWVzcGFjZUZpbGU7IH0KKworcHJpdmF0ZToKKyAgV3JpdGVyICZ3cml0ZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgbWFjaF9vOjpNYWNoT0R5bGliRmlsZSogbG9hZEluZGlyZWN0RHlsaWIoU3RyaW5nUmVmIHBhdGgpOworICB2b2lkIGNoZWNrRXhwb3J0V2hpdGVMaXN0KGNvbnN0IERlZmluZWRBdG9tICphdG9tKSBjb25zdDsKKyAgdm9pZCBjaGVja0V4cG9ydEJsYWNrTGlzdChjb25zdCBEZWZpbmVkQXRvbSAqYXRvbSkgY29uc3Q7CisgIHN0cnVjdCBBcmNoSW5mbyB7CisgICAgU3RyaW5nUmVmICAgICAgICAgICAgICAgICBhcmNoTmFtZTsKKyAgICBNYWNoT0xpbmtpbmdDb250ZXh0OjpBcmNoIGFyY2g7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBsaXR0bGVFbmRpYW47CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICBjcHV0eXBlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgY3B1c3VidHlwZTsKKyAgfTsKKworICBzdHJ1Y3QgU2VjdGlvbkFsaWduIHsKKyAgICBTdHJpbmdSZWYgc2VnbWVudE5hbWU7CisgICAgU3RyaW5nUmVmIHNlY3Rpb25OYW1lOworICAgIHVpbnQxNl90ICBhbGlnbjsKKyAgfTsKKworICBzdHJ1Y3QgT3JkZXJGaWxlTm9kZSB7CisgICAgU3RyaW5nUmVmIGZpbGVGaWx0ZXI7CisgICAgdW5zaWduZWQgIG9yZGVyOworICB9OworCisgIHN0YXRpYyBib29sIGZpbmRPcmRlck9yZGluYWwoY29uc3Qgc3RkOjp2ZWN0b3I8T3JkZXJGaWxlTm9kZT4gJm5vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWZpbmVkQXRvbSAqYXRvbSwgdW5zaWduZWQgJm9yZGluYWwpOworCisgIHN0YXRpYyBBcmNoSW5mbyBfc19hcmNoSW5mb3NbXTsKKworICBzdGQ6OnNldDxTdHJpbmdSZWY+IF9leGlzdGluZ1BhdGhzOyAvLyBGb3IgdGVzdGluZyBvbmx5LgorICBTdHJpbmdSZWZWZWN0b3IgX3NlYXJjaERpcnM7CisgIFN0cmluZ1JlZlZlY3RvciBfc3lzbGliUm9vdHM7CisgIFN0cmluZ1JlZlZlY3RvciBfZnJhbWV3b3JrRGlyczsKKyAgSGVhZGVyRmlsZVR5cGUgX291dHB1dE1hY2hPVHlwZSA9IGxsdm06Ok1hY2hPOjpNSF9FWEVDVVRFOworICBib29sIF9vdXRwdXRNYWNoT1R5cGVTdGF0aWMgPSBmYWxzZTsgLy8gRGlzYW1iaWd1YXRlIHN0YXRpYyB2cyBkeW5hbWljIHByb2cKKyAgYm9vbCBfZG9Ob3RoaW5nID0gZmFsc2U7ICAgICAgICAgICAgIC8vIGZvciAtaGVscCBhbmQgLXYgd2hpY2gganVzdCBwcmludCBpbmZvCisgIGJvb2wgX3BpZSA9IGZhbHNlOworICBBcmNoIF9hcmNoID0gYXJjaF91bmtub3duOworICBPUyBfb3MgPSBPUzo6bWFjT1NYOworICB1aW50MzJfdCBfb3NNaW5WZXJzaW9uID0gMDsKKyAgdWludDMyX3QgX3Nka1ZlcnNpb24gPSAwOworICB1aW50NjRfdCBfc291cmNlVmVyc2lvbiA9IDA7CisgIHVpbnQ2NF90IF9wYWdlWmVyb1NpemUgPSAwOworICB1aW50NjRfdCBfcGFnZVNpemUgPSA0MDk2OworICB1aW50NjRfdCBfYmFzZUFkZHJlc3MgPSAwOworICB1aW50NjRfdCBfc3RhY2tTaXplID0gMDsKKyAgdWludDMyX3QgX2NvbXBhdGliaWxpdHlWZXJzaW9uID0gMDsKKyAgdWludDMyX3QgX2N1cnJlbnRWZXJzaW9uID0gMDsKKyAgT2JqQ0NvbnN0cmFpbnQgX29iamNDb25zdHJhaW50ID0gb2JqY191bmtub3duOworICB1aW50MzJfdCBfc3dpZnRWZXJzaW9uID0gMDsKKyAgU3RyaW5nUmVmIF9pbnN0YWxsTmFtZTsKKyAgU3RyaW5nUmVmVmVjdG9yIF9ycGF0aHM7CisgIGJvb2wgX2ZsYXROYW1lc3BhY2UgPSBmYWxzZTsKKyAgVW5kZWZpbmVkTW9kZSBfdW5kZWZpbmVkTW9kZSA9IFVuZGVmaW5lZE1vZGU6OmVycm9yOworICBib29sIF9kZWFkU3RyaXBwYWJsZUR5bGliID0gZmFsc2U7CisgIGJvb2wgX3ByaW50QXRvbXMgPSBmYWxzZTsKKyAgYm9vbCBfdGVzdGluZ0ZpbGVVc2FnZSA9IGZhbHNlOworICBib29sIF9rZWVwUHJpdmF0ZUV4dGVybnMgPSBmYWxzZTsKKyAgYm9vbCBfZGVtYW5nbGUgPSBmYWxzZTsKKyAgYm9vbCBfbWVyZ2VPYmpDQ2F0ZWdvcmllcyA9IHRydWU7CisgIGJvb2wgX2dlbmVyYXRlVmVyc2lvbkxvYWRDb21tYW5kID0gZmFsc2U7CisgIGJvb2wgX2dlbmVyYXRlRnVuY3Rpb25TdGFydHNMb2FkQ29tbWFuZCA9IGZhbHNlOworICBib29sIF9nZW5lcmF0ZURhdGFJbkNvZGVMb2FkQ29tbWFuZCA9IGZhbHNlOworICBTdHJpbmdSZWYgX2J1bmRsZUxvYWRlcjsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8bWFjaF9vOjpBcmNoSGFuZGxlcj4gX2FyY2hIYW5kbGVyOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxXcml0ZXI+IF93cml0ZXI7CisgIHN0ZDo6dmVjdG9yPFNlY3Rpb25BbGlnbj4gX3NlY3RBbGlnbnM7CisgIG11dGFibGUgbGx2bTo6U3RyaW5nTWFwPG1hY2hfbzo6TWFjaE9EeWxpYkZpbGUqPiBfcGF0aFRvRHlsaWJNYXA7CisgIG11dGFibGUgc3RkOjp2ZWN0b3I8bWFjaF9vOjpNYWNoT0R5bGliRmlsZSo+IF9hbGxEeWxpYnM7CisgIG11dGFibGUgc3RkOjpzZXQ8bWFjaF9vOjpNYWNoT0R5bGliRmlsZSo+IF91cHdhcmREeWxpYnM7CisgIG11dGFibGUgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEZpbGU+PiBfaW5kaXJlY3REeWxpYnM7CisgIG11dGFibGUgc3RkOjptdXRleCBfZHlsaWJzTXV0ZXg7CisgIEV4cG9ydE1vZGUgX2V4cG9ydE1vZGUgPSBFeHBvcnRNb2RlOjpnbG9iYWxzOworICBsbHZtOjpTdHJpbmdTZXQ8PiBfZXhwb3J0ZWRTeW1ib2xzOworICBEZWJ1Z0luZm9Nb2RlIF9kZWJ1Z0luZm9Nb2RlID0gRGVidWdJbmZvTW9kZTo6YWRkRGVidWdNYXA7CisgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpyYXdfZmRfb3N0cmVhbT4gX2RlcGVuZGVuY3lJbmZvOworICBsbHZtOjpTdHJpbmdNYXA8c3RkOjp2ZWN0b3I8T3JkZXJGaWxlTm9kZT4+IF9vcmRlckZpbGVzOworICB1bnNpZ25lZCBfb3JkZXJGaWxlRW50cmllcyA9IDA7CisgIEZpbGUgKl9mbGF0TmFtZXNwYWNlRmlsZSA9IG51bGxwdHI7CisgIG1hY2hfbzo6U2VjdENyZWF0ZUZpbGUgKl9zZWN0Q3JlYXRlRmlsZSA9IG51bGxwdHI7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGxkCisKKyNlbmRpZiAvLyBMTERfUkVBREVSX1dSSVRFUl9NQUNIT19MSU5LSU5HX0NPTlRFWFRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL1JlYWRlcldyaXRlci9ZYW1sQ29udGV4dC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGxkL1JlYWRlcldyaXRlci9ZYW1sQ29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5N2QyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbGQvUmVhZGVyV3JpdGVyL1lhbWxDb250ZXh0LmgKQEAgLTAsMCArMSw0MyBAQAorLy89PT0tIGxsZC9SZWFkZXJXcml0ZXIvWWFtbENvbnRleHQuaCAtIG9iamVjdCB1c2VkIGluIFlBTUwgSS9PIGNvbnRleHQgLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gTGlua2VyCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTERfUkVBREVSX1dSSVRFUl9ZQU1MX0NPTlRFWFRfSAorI2RlZmluZSBMTERfUkVBREVSX1dSSVRFUl9ZQU1MX0NPTlRFWFRfSAorCisjaW5jbHVkZSAibGxkL0NvbW1vbi9MTFZNLmgiCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGxkIHsKK2NsYXNzIEZpbGU7CitjbGFzcyBMaW5raW5nQ29udGV4dDsKK2NsYXNzIFJlZ2lzdHJ5OworbmFtZXNwYWNlIG1hY2hfbyB7CituYW1lc3BhY2Ugbm9ybWFsaXplZCB7CitzdHJ1Y3QgTm9ybWFsaXplZEZpbGU7Cit9Cit9CisKK3VzaW5nIGxsZDo6bWFjaF9vOjpub3JtYWxpemVkOjpOb3JtYWxpemVkRmlsZTsKKworLy8vIFdoZW4gWUFNTCBJL08gaXMgdXNlZCBpbiBsbGQsIHRoZSB5YW1sIGNvbnRleHQgYWx3YXlzIGhvbGRzIGEgWWFtbENvbnRleHQKKy8vLyBvYmplY3QuICBXZSBuZWVkIHRvIHN1cHBvcnQgaGV0ZXJnZW5vdXMgeWFtbCBkb2N1bWVudHMgd2hpY2ggZWFjaCByZXF1aXJlCisvLy8gZGlmZmVyZW50IGNvbnRleHQgaW5mby4gIFRoaXMgc3RydWN0IHN1cHBvcnRzIGFsbCBjbGllbnRzLgorc3RydWN0IFlhbWxDb250ZXh0IHsKKyAgY29uc3QgTGlua2luZ0NvbnRleHQgKl9jdHggPSBudWxscHRyOworICBjb25zdCBSZWdpc3RyeSAqX3JlZ2lzdHJ5ID0gbnVsbHB0cjsKKyAgRmlsZSAqX2ZpbGUgPSBudWxscHRyOworICBOb3JtYWxpemVkRmlsZSAqX25vcm1hbGl6ZU1hY2hPRmlsZSA9IG51bGxwdHI7CisgIFN0cmluZ1JlZiBfcGF0aDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbGQKKworI2VuZGlmIC8vIExMRF9SRUFERVJfV1JJVEVSX1lBTUxfQ09OVEVYVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvQW5hbHlzaXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9BbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZGNiODkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvQW5hbHlzaXMuaApAQCAtMCwwICsxLDY1IEBACisvKj09PS0tIGxsdm0tYy9BbmFseXNpcy5oIC0gQW5hbHlzaXMgTGlicmFyeSBDIEludGVyZmFjZSAtLS0tLS0tLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGhlYWRlciBkZWNsYXJlcyB0aGUgQyBpbnRlcmZhY2UgdG8gbGliTExWTUFuYWx5c2lzLmEsIHdoaWNoICAgICAgICAgICAqfAorfCogaW1wbGVtZW50cyB2YXJpb3VzIGFuYWx5c2VzIG9mIHRoZSBMTFZNIElSLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBNYW55IGV4b3RpYyBsYW5ndWFnZXMgY2FuIGludGVyb3BlcmF0ZSB3aXRoIEMgY29kZSBidXQgaGF2ZSBhIGhhcmRlciB0aW1lICAqfAorfCogd2l0aCBDKysgZHVlIHRvIG5hbWUgbWFuZ2xpbmcuIFNvIGluIGFkZGl0aW9uIHRvIEMsIHRoaXMgaW50ZXJmYWNlIGVuYWJsZXMgKnwKK3wqIHRvb2xzIHdyaXR0ZW4gaW4gc3VjaCBsYW5ndWFnZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX0NfQU5BTFlTSVNfSAorI2RlZmluZSBMTFZNX0NfQU5BTFlTSVNfSAorCisjaW5jbHVkZSAibGx2bS1jL1R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNBbmFseXNpcyBBbmFseXNpcworICogQGluZ3JvdXAgTExWTUMKKyAqCisgKiBAeworICovCisKK3R5cGVkZWYgZW51bSB7CisgIExMVk1BYm9ydFByb2Nlc3NBY3Rpb24sIC8qIHZlcmlmaWVyIHdpbGwgcHJpbnQgdG8gc3RkZXJyIGFuZCBhYm9ydCgpICovCisgIExMVk1QcmludE1lc3NhZ2VBY3Rpb24sIC8qIHZlcmlmaWVyIHdpbGwgcHJpbnQgdG8gc3RkZXJyIGFuZCByZXR1cm4gMSAqLworICBMTFZNUmV0dXJuU3RhdHVzQWN0aW9uICAvKiB2ZXJpZmllciB3aWxsIGp1c3QgcmV0dXJuIDEgKi8KK30gTExWTVZlcmlmaWVyRmFpbHVyZUFjdGlvbjsKKworCisvKiBWZXJpZmllcyB0aGF0IGEgbW9kdWxlIGlzIHZhbGlkLCB0YWtpbmcgdGhlIHNwZWNpZmllZCBhY3Rpb24gaWYgbm90LgorICAgT3B0aW9uYWxseSByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgYW55IGludmFsaWQgY29uc3RydWN0cy4KKyAgIE91dE1lc3NhZ2UgbXVzdCBiZSBkaXNwb3NlZCB3aXRoIExMVk1EaXNwb3NlTWVzc2FnZS4gKi8KK0xMVk1Cb29sIExMVk1WZXJpZnlNb2R1bGUoTExWTU1vZHVsZVJlZiBNLCBMTFZNVmVyaWZpZXJGYWlsdXJlQWN0aW9uIEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKk91dE1lc3NhZ2UpOworCisvKiBWZXJpZmllcyB0aGF0IGEgc2luZ2xlIGZ1bmN0aW9uIGlzIHZhbGlkLCB0YWtpbmcgdGhlIHNwZWNpZmllZCBhY3Rpb24uIFVzZWZ1bAorICAgZm9yIGRlYnVnZ2luZy4gKi8KK0xMVk1Cb29sIExMVk1WZXJpZnlGdW5jdGlvbihMTFZNVmFsdWVSZWYgRm4sIExMVk1WZXJpZmllckZhaWx1cmVBY3Rpb24gQWN0aW9uKTsKKworLyogT3BlbiB1cCBhIGdob3N0dmlldyB3aW5kb3cgdGhhdCBkaXNwbGF5cyB0aGUgQ0ZHIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICAgVXNlZnVsIGZvciBkZWJ1Z2dpbmcuICovCit2b2lkIExMVk1WaWV3RnVuY3Rpb25DRkcoTExWTVZhbHVlUmVmIEZuKTsKK3ZvaWQgTExWTVZpZXdGdW5jdGlvbkNGR09ubHkoTExWTVZhbHVlUmVmIEZuKTsKKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL0JpdFJlYWRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL0JpdFJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZmMzMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvQml0UmVhZGVyLmgKQEAgLTAsMCArMSw4NSBAQAorLyo9PT0tLSBsbHZtLWMvQml0UmVhZGVyLmggLSBCaXRSZWFkZXIgTGlicmFyeSBDIEludGVyZmFjZSAtLS0tLS0qLSBDKysgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICp8Cit8KiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBoZWFkZXIgZGVjbGFyZXMgdGhlIEMgaW50ZXJmYWNlIHRvIGxpYkxMVk1CaXRSZWFkZXIuYSwgd2hpY2ggICAgICAgICAgKnwKK3wqIGltcGxlbWVudHMgaW5wdXQgb2YgdGhlIExMVk0gYml0Y29kZSBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogTWFueSBleG90aWMgbGFuZ3VhZ2VzIGNhbiBpbnRlcm9wZXJhdGUgd2l0aCBDIGNvZGUgYnV0IGhhdmUgYSBoYXJkZXIgdGltZSAgKnwKK3wqIHdpdGggQysrIGR1ZSB0byBuYW1lIG1hbmdsaW5nLiBTbyBpbiBhZGRpdGlvbiB0byBDLCB0aGlzIGludGVyZmFjZSBlbmFibGVzICp8Cit8KiB0b29scyB3cml0dGVuIGluIHN1Y2ggbGFuZ3VhZ2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9DX0JJVFJFQURFUl9ICisjZGVmaW5lIExMVk1fQ19CSVRSRUFERVJfSAorCisjaW5jbHVkZSAibGx2bS1jL1R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNCaXRSZWFkZXIgQml0IFJlYWRlcgorICogQGluZ3JvdXAgTExWTUMKKyAqCisgKiBAeworICovCisKKy8qIEJ1aWxkcyBhIG1vZHVsZSBmcm9tIHRoZSBiaXRjb2RlIGluIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGJ1ZmZlciwgcmV0dXJuaW5nIGEKKyAgIHJlZmVyZW5jZSB0byB0aGUgbW9kdWxlIHZpYSB0aGUgT3V0TW9kdWxlIHBhcmFtZXRlci4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgICBPcHRpb25hbGx5IHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlIHZpYSBPdXRNZXNzYWdlLgorCisgICBUaGlzIGlzIGRlcHJlY2F0ZWQuIFVzZSBMTFZNUGFyc2VCaXRjb2RlMi4gKi8KK0xMVk1Cb29sIExMVk1QYXJzZUJpdGNvZGUoTExWTU1lbW9yeUJ1ZmZlclJlZiBNZW1CdWYsIExMVk1Nb2R1bGVSZWYgKk91dE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKk91dE1lc3NhZ2UpOworCisvKiBCdWlsZHMgYSBtb2R1bGUgZnJvbSB0aGUgYml0Y29kZSBpbiB0aGUgc3BlY2lmaWVkIG1lbW9yeSBidWZmZXIsIHJldHVybmluZyBhCisgICByZWZlcmVuY2UgdG8gdGhlIG1vZHVsZSB2aWEgdGhlIE91dE1vZHVsZSBwYXJhbWV0ZXIuIFJldHVybnMgMCBvbiBzdWNjZXNzLiAqLworTExWTUJvb2wgTExWTVBhcnNlQml0Y29kZTIoTExWTU1lbW9yeUJ1ZmZlclJlZiBNZW1CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTW9kdWxlUmVmICpPdXRNb2R1bGUpOworCisvKiBUaGlzIGlzIGRlcHJlY2F0ZWQuIFVzZSBMTFZNUGFyc2VCaXRjb2RlSW5Db250ZXh0Mi4gKi8KK0xMVk1Cb29sIExMVk1QYXJzZUJpdGNvZGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQ29udGV4dFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1lbW9yeUJ1ZmZlclJlZiBNZW1CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Nb2R1bGVSZWYgKk91dE1vZHVsZSwgY2hhciAqKk91dE1lc3NhZ2UpOworCitMTFZNQm9vbCBMTFZNUGFyc2VCaXRjb2RlSW5Db250ZXh0MihMTFZNQ29udGV4dFJlZiBDb250ZXh0UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1lbW9yeUJ1ZmZlclJlZiBNZW1CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTW9kdWxlUmVmICpPdXRNb2R1bGUpOworCisvKiogUmVhZHMgYSBtb2R1bGUgZnJvbSB0aGUgc3BlY2lmaWVkIHBhdGgsIHJldHVybmluZyB2aWEgdGhlIE91dE1QIHBhcmFtZXRlcgorICAgIGEgbW9kdWxlIHByb3ZpZGVyIHdoaWNoIHBlcmZvcm1zIGxhenkgZGVzZXJpYWxpemF0aW9uLiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAgICBPcHRpb25hbGx5IHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlIHZpYSBPdXRNZXNzYWdlLgorICAgIFRoaXMgaXMgZGVwcmVjYXRlZC4gVXNlIExMVk1HZXRCaXRjb2RlTW9kdWxlSW5Db250ZXh0Mi4gKi8KK0xMVk1Cb29sIExMVk1HZXRCaXRjb2RlTW9kdWxlSW5Db250ZXh0KExMVk1Db250ZXh0UmVmIENvbnRleHRSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWVtb3J5QnVmZmVyUmVmIE1lbUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Nb2R1bGVSZWYgKk91dE0sIGNoYXIgKipPdXRNZXNzYWdlKTsKKworLyoqIFJlYWRzIGEgbW9kdWxlIGZyb20gdGhlIHNwZWNpZmllZCBwYXRoLCByZXR1cm5pbmcgdmlhIHRoZSBPdXRNUCBwYXJhbWV0ZXIgYQorICogbW9kdWxlIHByb3ZpZGVyIHdoaWNoIHBlcmZvcm1zIGxhenkgZGVzZXJpYWxpemF0aW9uLiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gKi8KK0xMVk1Cb29sIExMVk1HZXRCaXRjb2RlTW9kdWxlSW5Db250ZXh0MihMTFZNQ29udGV4dFJlZiBDb250ZXh0UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NZW1vcnlCdWZmZXJSZWYgTWVtQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Nb2R1bGVSZWYgKk91dE0pOworCisvKiBUaGlzIGlzIGRlcHJlY2F0ZWQuIFVzZSBMTFZNR2V0Qml0Y29kZU1vZHVsZTIuICovCitMTFZNQm9vbCBMTFZNR2V0Qml0Y29kZU1vZHVsZShMTFZNTWVtb3J5QnVmZmVyUmVmIE1lbUJ1ZiwgTExWTU1vZHVsZVJlZiAqT3V0TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipPdXRNZXNzYWdlKTsKKworTExWTUJvb2wgTExWTUdldEJpdGNvZGVNb2R1bGUyKExMVk1NZW1vcnlCdWZmZXJSZWYgTWVtQnVmLCBMTFZNTW9kdWxlUmVmICpPdXRNKTsKKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL0JpdFdyaXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL0JpdFdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5N2QwMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvQml0V3JpdGVyLmgKQEAgLTAsMCArMSw1OSBAQAorLyo9PT0tLSBsbHZtLWMvQml0V3JpdGVyLmggLSBCaXRXcml0ZXIgTGlicmFyeSBDIEludGVyZmFjZSAtLS0tLS0qLSBDKysgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICp8Cit8KiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBoZWFkZXIgZGVjbGFyZXMgdGhlIEMgaW50ZXJmYWNlIHRvIGxpYkxMVk1CaXRXcml0ZXIuYSwgd2hpY2ggICAgICAgICAgKnwKK3wqIGltcGxlbWVudHMgb3V0cHV0IG9mIHRoZSBMTFZNIGJpdGNvZGUgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogTWFueSBleG90aWMgbGFuZ3VhZ2VzIGNhbiBpbnRlcm9wZXJhdGUgd2l0aCBDIGNvZGUgYnV0IGhhdmUgYSBoYXJkZXIgdGltZSAgKnwKK3wqIHdpdGggQysrIGR1ZSB0byBuYW1lIG1hbmdsaW5nLiBTbyBpbiBhZGRpdGlvbiB0byBDLCB0aGlzIGludGVyZmFjZSBlbmFibGVzICp8Cit8KiB0b29scyB3cml0dGVuIGluIHN1Y2ggbGFuZ3VhZ2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9DX0JJVFdSSVRFUl9ICisjZGVmaW5lIExMVk1fQ19CSVRXUklURVJfSAorCisjaW5jbHVkZSAibGx2bS1jL1R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNCaXRXcml0ZXIgQml0IFdyaXRlcgorICogQGluZ3JvdXAgTExWTUMKKyAqCisgKiBAeworICovCisKKy8qPT09LS0gT3BlcmF0aW9ucyBvbiBtb2R1bGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKy8qKiBXcml0ZXMgYSBtb2R1bGUgdG8gdGhlIHNwZWNpZmllZCBwYXRoLiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gKi8KK2ludCBMTFZNV3JpdGVCaXRjb2RlVG9GaWxlKExMVk1Nb2R1bGVSZWYgTSwgY29uc3QgY2hhciAqUGF0aCk7CisKKy8qKiBXcml0ZXMgYSBtb2R1bGUgdG8gYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IuIFJldHVybnMgMCBvbiBzdWNjZXNzLiAqLworaW50IExMVk1Xcml0ZUJpdGNvZGVUb0ZEKExMVk1Nb2R1bGVSZWYgTSwgaW50IEZELCBpbnQgU2hvdWxkQ2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFVuYnVmZmVyZWQpOworCisvKiogRGVwcmVjYXRlZCBmb3IgTExWTVdyaXRlQml0Y29kZVRvRkQuIFdyaXRlcyBhIG1vZHVsZSB0byBhbiBvcGVuIGZpbGUKKyAgICBkZXNjcmlwdG9yLiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gQ2xvc2VzIHRoZSBIYW5kbGUuICovCitpbnQgTExWTVdyaXRlQml0Y29kZVRvRmlsZUhhbmRsZShMTFZNTW9kdWxlUmVmIE0sIGludCBIYW5kbGUpOworCisvKiogV3JpdGVzIGEgbW9kdWxlIHRvIGEgbmV3IG1lbW9yeSBidWZmZXIgYW5kIHJldHVybnMgaXQuICovCitMTFZNTWVtb3J5QnVmZmVyUmVmIExMVk1Xcml0ZUJpdGNvZGVUb01lbW9yeUJ1ZmZlcihMTFZNTW9kdWxlUmVmIE0pOworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvQ29tZGF0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvQ29tZGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5OTk2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9Db21kYXQuaApAQCAtMCwwICsxLDc1IEBACisvKj09PS0tIGxsdm0tYy9Db21kYXQuaCAtIE1vZHVsZSBDb21kYXQgQyBJbnRlcmZhY2UgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQyBpbnRlcmZhY2UgdG8gQ09NREFULiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9DX0NPTURBVF9ICisjZGVmaW5lIExMVk1fQ19DT01EQVRfSAorCisjaW5jbHVkZSAibGx2bS1jL1R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKyAgTExWTUFueUNvbWRhdFNlbGVjdGlvbktpbmQsICAgICAgICAvLy88IFRoZSBsaW5rZXIgbWF5IGNob29zZSBhbnkgQ09NREFULgorICBMTFZNRXhhY3RNYXRjaENvbWRhdFNlbGVjdGlvbktpbmQsIC8vLzwgVGhlIGRhdGEgcmVmZXJlbmNlZCBieSB0aGUgQ09NREFUIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGJlIHRoZSBzYW1lLgorICBMTFZNTGFyZ2VzdENvbWRhdFNlbGVjdGlvbktpbmQsICAgIC8vLzwgVGhlIGxpbmtlciB3aWxsIGNob29zZSB0aGUgbGFyZ2VzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQ09NREFULgorICBMTFZNTm9EdXBsaWNhdGVzQ29tZGF0U2VsZWN0aW9uS2luZCwgLy8vPCBObyBvdGhlciBNb2R1bGUgbWF5IHNwZWNpZnkgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBDT01EQVQuCisgIExMVk1TYW1lU2l6ZUNvbWRhdFNlbGVjdGlvbktpbmQgLy8vPCBUaGUgZGF0YSByZWZlcmVuY2VkIGJ5IHRoZSBDT01EQVQgbXVzdCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgdGhlIHNhbWUgc2l6ZS4KK30gTExWTUNvbWRhdFNlbGVjdGlvbktpbmQ7CisKKy8qKgorICogUmV0dXJuIHRoZSBDb21kYXQgaW4gdGhlIG1vZHVsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gSXQgaXMgY3JlYXRlZAorICogaWYgaXQgZGlkbid0IGFscmVhZHkgZXhpc3QuCisgKgorICogQHNlZSBsbHZtOjpNb2R1bGU6OmdldE9ySW5zZXJ0Q29tZGF0KCkKKyAqLworTExWTUNvbWRhdFJlZiBMTFZNR2V0T3JJbnNlcnRDb21kYXQoTExWTU1vZHVsZVJlZiBNLCBjb25zdCBjaGFyICpOYW1lKTsKKworLyoqCisgKiBHZXQgdGhlIENvbWRhdCBhc3NpZ25lZCB0byB0aGUgZ2l2ZW4gZ2xvYmFsIG9iamVjdC4KKyAqCisgKiBAc2VlIGxsdm06Okdsb2JhbE9iamVjdDo6Z2V0Q29tZGF0KCkKKyAqLworTExWTUNvbWRhdFJlZiBMTFZNR2V0Q29tZGF0KExMVk1WYWx1ZVJlZiBWKTsKKworLyoqCisgKiBBc3NpZ24gdGhlIENvbWRhdCB0byB0aGUgZ2l2ZW4gZ2xvYmFsIG9iamVjdC4KKyAqCisgKiBAc2VlIGxsdm06Okdsb2JhbE9iamVjdDo6c2V0Q29tZGF0KCkKKyAqLwordm9pZCBMTFZNU2V0Q29tZGF0KExMVk1WYWx1ZVJlZiBWLCBMTFZNQ29tZGF0UmVmIEMpOworCisvKgorICogR2V0IHRoZSBjb25mbGljdCByZXNvbHV0aW9uIHNlbGVjdGlvbiBraW5kIGZvciB0aGUgQ29tZGF0LgorICoKKyAqIEBzZWUgbGx2bTo6Q29tZGF0OjpnZXRTZWxlY3Rpb25LaW5kKCkKKyAqLworTExWTUNvbWRhdFNlbGVjdGlvbktpbmQgTExWTUdldENvbWRhdFNlbGVjdGlvbktpbmQoTExWTUNvbWRhdFJlZiBDKTsKKworLyoKKyAqIFNldCB0aGUgY29uZmxpY3QgcmVzb2x1dGlvbiBzZWxlY3Rpb24ga2luZCBmb3IgdGhlIENvbWRhdC4KKyAqCisgKiBAc2VlIGxsdm06OkNvbWRhdDo6c2V0U2VsZWN0aW9uS2luZCgpCisgKi8KK3ZvaWQgTExWTVNldENvbWRhdFNlbGVjdGlvbktpbmQoTExWTUNvbWRhdFJlZiBDLCBMTFZNQ29tZGF0U2VsZWN0aW9uS2luZCBLaW5kKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvQ29yZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL0NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGM3ZmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL0NvcmUuaApAQCAtMCwwICsxLDMzMzkgQEAKKy8qPT09LS0gbGx2bS1jL0NvcmUuaCAtIENvcmUgTGlicmFyeSBDIEludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0qLSBDIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqfAorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgaGVhZGVyIGRlY2xhcmVzIHRoZSBDIGludGVyZmFjZSB0byBsaWJMTFZNQ29yZS5hLCB3aGljaCBpbXBsZW1lbnRzICAgICp8Cit8KiB0aGUgTExWTSBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9DX0NPUkVfSAorI2RlZmluZSBMTFZNX0NfQ09SRV9ICisKKyNpbmNsdWRlICJsbHZtLWMvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0tYy9UeXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogQGRlZmdyb3VwIExMVk1DIExMVk0tQzogQyBpbnRlcmZhY2UgdG8gTExWTQorICoKKyAqIFRoaXMgbW9kdWxlIGV4cG9zZXMgcGFydHMgb2YgdGhlIExMVk0gbGlicmFyeSBhcyBhIEMgQVBJLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNUcmFuc2Zvcm1zIFRyYW5zZm9ybXMKKyAqLworCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ0NvcmUgQ29yZQorICoKKyAqIFRoaXMgbW9kdWxlcyBwcm92aWRlIGFuIGludGVyZmFjZSB0byBsaWJMTFZNQ29yZSwgd2hpY2ggaW1wbGVtZW50cworICogdGhlIExMVk0gaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uIGFzIHdlbGwgYXMgb3RoZXIgcmVsYXRlZCB0eXBlcworICogYW5kIHV0aWxpdGllcy4KKyAqCisgKiBNYW55IGV4b3RpYyBsYW5ndWFnZXMgY2FuIGludGVyb3BlcmF0ZSB3aXRoIEMgY29kZSBidXQgaGF2ZSBhIGhhcmRlciB0aW1lCisgKiB3aXRoIEMrKyBkdWUgdG8gbmFtZSBtYW5nbGluZy4gU28gaW4gYWRkaXRpb24gdG8gQywgdGhpcyBpbnRlcmZhY2UgZW5hYmxlcworICogdG9vbHMgd3JpdHRlbiBpbiBzdWNoIGxhbmd1YWdlcy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogQGRlZmdyb3VwIExMVk1DQ29yZVR5cGVzIFR5cGVzIGFuZCBFbnVtZXJhdGlvbnMKKyAqCisgKiBAeworICovCisKK3R5cGVkZWYgZW51bSB7CisgIC8qIFRlcm1pbmF0b3IgSW5zdHJ1Y3Rpb25zICovCisgIExMVk1SZXQgICAgICAgICAgICA9IDEsCisgIExMVk1CciAgICAgICAgICAgICA9IDIsCisgIExMVk1Td2l0Y2ggICAgICAgICA9IDMsCisgIExMVk1JbmRpcmVjdEJyICAgICA9IDQsCisgIExMVk1JbnZva2UgICAgICAgICA9IDUsCisgIC8qIHJlbW92ZWQgNiBkdWUgdG8gQVBJIGNoYW5nZXMgKi8KKyAgTExWTVVucmVhY2hhYmxlICAgID0gNywKKworICAvKiBTdGFuZGFyZCBCaW5hcnkgT3BlcmF0b3JzICovCisgIExMVk1BZGQgICAgICAgICAgICA9IDgsCisgIExMVk1GQWRkICAgICAgICAgICA9IDksCisgIExMVk1TdWIgICAgICAgICAgICA9IDEwLAorICBMTFZNRlN1YiAgICAgICAgICAgPSAxMSwKKyAgTExWTU11bCAgICAgICAgICAgID0gMTIsCisgIExMVk1GTXVsICAgICAgICAgICA9IDEzLAorICBMTFZNVURpdiAgICAgICAgICAgPSAxNCwKKyAgTExWTVNEaXYgICAgICAgICAgID0gMTUsCisgIExMVk1GRGl2ICAgICAgICAgICA9IDE2LAorICBMTFZNVVJlbSAgICAgICAgICAgPSAxNywKKyAgTExWTVNSZW0gICAgICAgICAgID0gMTgsCisgIExMVk1GUmVtICAgICAgICAgICA9IDE5LAorCisgIC8qIExvZ2ljYWwgT3BlcmF0b3JzICovCisgIExMVk1TaGwgICAgICAgICAgICA9IDIwLAorICBMTFZNTFNociAgICAgICAgICAgPSAyMSwKKyAgTExWTUFTaHIgICAgICAgICAgID0gMjIsCisgIExMVk1BbmQgICAgICAgICAgICA9IDIzLAorICBMTFZNT3IgICAgICAgICAgICAgPSAyNCwKKyAgTExWTVhvciAgICAgICAgICAgID0gMjUsCisKKyAgLyogTWVtb3J5IE9wZXJhdG9ycyAqLworICBMTFZNQWxsb2NhICAgICAgICAgPSAyNiwKKyAgTExWTUxvYWQgICAgICAgICAgID0gMjcsCisgIExMVk1TdG9yZSAgICAgICAgICA9IDI4LAorICBMTFZNR2V0RWxlbWVudFB0ciAgPSAyOSwKKworICAvKiBDYXN0IE9wZXJhdG9ycyAqLworICBMTFZNVHJ1bmMgICAgICAgICAgPSAzMCwKKyAgTExWTVpFeHQgICAgICAgICAgID0gMzEsCisgIExMVk1TRXh0ICAgICAgICAgICA9IDMyLAorICBMTFZNRlBUb1VJICAgICAgICAgPSAzMywKKyAgTExWTUZQVG9TSSAgICAgICAgID0gMzQsCisgIExMVk1VSVRvRlAgICAgICAgICA9IDM1LAorICBMTFZNU0lUb0ZQICAgICAgICAgPSAzNiwKKyAgTExWTUZQVHJ1bmMgICAgICAgID0gMzcsCisgIExMVk1GUEV4dCAgICAgICAgICA9IDM4LAorICBMTFZNUHRyVG9JbnQgICAgICAgPSAzOSwKKyAgTExWTUludFRvUHRyICAgICAgID0gNDAsCisgIExMVk1CaXRDYXN0ICAgICAgICA9IDQxLAorICBMTFZNQWRkclNwYWNlQ2FzdCAgPSA2MCwKKworICAvKiBPdGhlciBPcGVyYXRvcnMgKi8KKyAgTExWTUlDbXAgICAgICAgICAgID0gNDIsCisgIExMVk1GQ21wICAgICAgICAgICA9IDQzLAorICBMTFZNUEhJICAgICAgICAgICAgPSA0NCwKKyAgTExWTUNhbGwgICAgICAgICAgID0gNDUsCisgIExMVk1TZWxlY3QgICAgICAgICA9IDQ2LAorICBMTFZNVXNlck9wMSAgICAgICAgPSA0NywKKyAgTExWTVVzZXJPcDIgICAgICAgID0gNDgsCisgIExMVk1WQUFyZyAgICAgICAgICA9IDQ5LAorICBMTFZNRXh0cmFjdEVsZW1lbnQgPSA1MCwKKyAgTExWTUluc2VydEVsZW1lbnQgID0gNTEsCisgIExMVk1TaHVmZmxlVmVjdG9yICA9IDUyLAorICBMTFZNRXh0cmFjdFZhbHVlICAgPSA1MywKKyAgTExWTUluc2VydFZhbHVlICAgID0gNTQsCisKKyAgLyogQXRvbWljIG9wZXJhdG9ycyAqLworICBMTFZNRmVuY2UgICAgICAgICAgPSA1NSwKKyAgTExWTUF0b21pY0NtcFhjaGcgID0gNTYsCisgIExMVk1BdG9taWNSTVcgICAgICA9IDU3LAorCisgIC8qIEV4Y2VwdGlvbiBIYW5kbGluZyBPcGVyYXRvcnMgKi8KKyAgTExWTVJlc3VtZSAgICAgICAgID0gNTgsCisgIExMVk1MYW5kaW5nUGFkICAgICA9IDU5LAorICBMTFZNQ2xlYW51cFJldCAgICAgPSA2MSwKKyAgTExWTUNhdGNoUmV0ICAgICAgID0gNjIsCisgIExMVk1DYXRjaFBhZCAgICAgICA9IDYzLAorICBMTFZNQ2xlYW51cFBhZCAgICAgPSA2NCwKKyAgTExWTUNhdGNoU3dpdGNoICAgID0gNjUKK30gTExWTU9wY29kZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgTExWTVZvaWRUeXBlS2luZCwgICAgICAgIC8qKjwgdHlwZSB3aXRoIG5vIHNpemUgKi8KKyAgTExWTUhhbGZUeXBlS2luZCwgICAgICAgIC8qKjwgMTYgYml0IGZsb2F0aW5nIHBvaW50IHR5cGUgKi8KKyAgTExWTUZsb2F0VHlwZUtpbmQsICAgICAgIC8qKjwgMzIgYml0IGZsb2F0aW5nIHBvaW50IHR5cGUgKi8KKyAgTExWTURvdWJsZVR5cGVLaW5kLCAgICAgIC8qKjwgNjQgYml0IGZsb2F0aW5nIHBvaW50IHR5cGUgKi8KKyAgTExWTVg4Nl9GUDgwVHlwZUtpbmQsICAgIC8qKjwgODAgYml0IGZsb2F0aW5nIHBvaW50IHR5cGUgKFg4NykgKi8KKyAgTExWTUZQMTI4VHlwZUtpbmQsICAgICAgIC8qKjwgMTI4IGJpdCBmbG9hdGluZyBwb2ludCB0eXBlICgxMTItYml0IG1hbnRpc3NhKSovCisgIExMVk1QUENfRlAxMjhUeXBlS2luZCwgICAvKio8IDEyOCBiaXQgZmxvYXRpbmcgcG9pbnQgdHlwZSAodHdvIDY0LWJpdHMpICovCisgIExMVk1MYWJlbFR5cGVLaW5kLCAgICAgICAvKio8IExhYmVscyAqLworICBMTFZNSW50ZWdlclR5cGVLaW5kLCAgICAgLyoqPCBBcmJpdHJhcnkgYml0IHdpZHRoIGludGVnZXJzICovCisgIExMVk1GdW5jdGlvblR5cGVLaW5kLCAgICAvKio8IEZ1bmN0aW9ucyAqLworICBMTFZNU3RydWN0VHlwZUtpbmQsICAgICAgLyoqPCBTdHJ1Y3R1cmVzICovCisgIExMVk1BcnJheVR5cGVLaW5kLCAgICAgICAvKio8IEFycmF5cyAqLworICBMTFZNUG9pbnRlclR5cGVLaW5kLCAgICAgLyoqPCBQb2ludGVycyAqLworICBMTFZNVmVjdG9yVHlwZUtpbmQsICAgICAgLyoqPCBTSU1EICdwYWNrZWQnIGZvcm1hdCwgb3Igb3RoZXIgdmVjdG9yIHR5cGUgKi8KKyAgTExWTU1ldGFkYXRhVHlwZUtpbmQsICAgIC8qKjwgTWV0YWRhdGEgKi8KKyAgTExWTVg4Nl9NTVhUeXBlS2luZCwgICAgIC8qKjwgWDg2IE1NWCAqLworICBMTFZNVG9rZW5UeXBlS2luZCAgICAgICAgLyoqPCBUb2tlbnMgKi8KK30gTExWTVR5cGVLaW5kOworCit0eXBlZGVmIGVudW0geworICBMTFZNRXh0ZXJuYWxMaW5rYWdlLCAgICAvKio8IEV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbiAqLworICBMTFZNQXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2UsCisgIExMVk1MaW5rT25jZUFueUxpbmthZ2UsIC8qKjwgS2VlcCBvbmUgY29weSBvZiBmdW5jdGlvbiB3aGVuIGxpbmtpbmcgKGlubGluZSkqLworICBMTFZNTGlua09uY2VPRFJMaW5rYWdlLCAvKio8IFNhbWUsIGJ1dCBvbmx5IHJlcGxhY2VkIGJ5IHNvbWV0aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWl2YWxlbnQuICovCisgIExMVk1MaW5rT25jZU9EUkF1dG9IaWRlTGlua2FnZSwgLyoqPCBPYnNvbGV0ZSAqLworICBMTFZNV2Vha0FueUxpbmthZ2UsICAgICAvKio8IEtlZXAgb25lIGNvcHkgb2YgZnVuY3Rpb24gd2hlbiBsaW5raW5nICh3ZWFrKSAqLworICBMTFZNV2Vha09EUkxpbmthZ2UsICAgICAvKio8IFNhbWUsIGJ1dCBvbmx5IHJlcGxhY2VkIGJ5IHNvbWV0aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWl2YWxlbnQuICovCisgIExMVk1BcHBlbmRpbmdMaW5rYWdlLCAgIC8qKjwgU3BlY2lhbCBwdXJwb3NlLCBvbmx5IGFwcGxpZXMgdG8gZ2xvYmFsIGFycmF5cyAqLworICBMTFZNSW50ZXJuYWxMaW5rYWdlLCAgICAvKio8IFJlbmFtZSBjb2xsaXNpb25zIHdoZW4gbGlua2luZyAoc3RhdGljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zKSAqLworICBMTFZNUHJpdmF0ZUxpbmthZ2UsICAgICAvKio8IExpa2UgSW50ZXJuYWwsIGJ1dCBvbWl0IGZyb20gc3ltYm9sIHRhYmxlICovCisgIExMVk1ETExJbXBvcnRMaW5rYWdlLCAgIC8qKjwgT2Jzb2xldGUgKi8KKyAgTExWTURMTEV4cG9ydExpbmthZ2UsICAgLyoqPCBPYnNvbGV0ZSAqLworICBMTFZNRXh0ZXJuYWxXZWFrTGlua2FnZSwvKio8IEV4dGVybmFsV2VhayBsaW5rYWdlIGRlc2NyaXB0aW9uICovCisgIExMVk1HaG9zdExpbmthZ2UsICAgICAgIC8qKjwgT2Jzb2xldGUgKi8KKyAgTExWTUNvbW1vbkxpbmthZ2UsICAgICAgLyoqPCBUZW50YXRpdmUgZGVmaW5pdGlvbnMgKi8KKyAgTExWTUxpbmtlclByaXZhdGVMaW5rYWdlLCAvKio8IExpa2UgUHJpdmF0ZSwgYnV0IGxpbmtlciByZW1vdmVzLiAqLworICBMTFZNTGlua2VyUHJpdmF0ZVdlYWtMaW5rYWdlIC8qKjwgTGlrZSBMaW5rZXJQcml2YXRlLCBidXQgaXMgd2Vhay4gKi8KK30gTExWTUxpbmthZ2U7CisKK3R5cGVkZWYgZW51bSB7CisgIExMVk1EZWZhdWx0VmlzaWJpbGl0eSwgIC8qKjwgVGhlIEdWIGlzIHZpc2libGUgKi8KKyAgTExWTUhpZGRlblZpc2liaWxpdHksICAgLyoqPCBUaGUgR1YgaXMgaGlkZGVuICovCisgIExMVk1Qcm90ZWN0ZWRWaXNpYmlsaXR5IC8qKjwgVGhlIEdWIGlzIHByb3RlY3RlZCAqLworfSBMTFZNVmlzaWJpbGl0eTsKKwordHlwZWRlZiBlbnVtIHsKKyAgTExWTU5vVW5uYW1lZEFkZHIsICAgIC8qKjwgQWRkcmVzcyBvZiB0aGUgR1YgaXMgc2lnbmlmaWNhbnQuICovCisgIExMVk1Mb2NhbFVubmFtZWRBZGRyLCAvKio8IEFkZHJlc3Mgb2YgdGhlIEdWIGlzIGxvY2FsbHkgaW5zaWduaWZpY2FudC4gKi8KKyAgTExWTUdsb2JhbFVubmFtZWRBZGRyIC8qKjwgQWRkcmVzcyBvZiB0aGUgR1YgaXMgZ2xvYmFsbHkgaW5zaWduaWZpY2FudC4gKi8KK30gTExWTVVubmFtZWRBZGRyOworCit0eXBlZGVmIGVudW0geworICBMTFZNRGVmYXVsdFN0b3JhZ2VDbGFzcyAgID0gMCwKKyAgTExWTURMTEltcG9ydFN0b3JhZ2VDbGFzcyA9IDEsIC8qKjwgRnVuY3Rpb24gdG8gYmUgaW1wb3J0ZWQgZnJvbSBETEwuICovCisgIExMVk1ETExFeHBvcnRTdG9yYWdlQ2xhc3MgPSAyICAvKio8IEZ1bmN0aW9uIHRvIGJlIGFjY2Vzc2libGUgZnJvbSBETEwuICovCit9IExMVk1ETExTdG9yYWdlQ2xhc3M7CisKK3R5cGVkZWYgZW51bSB7CisgIExMVk1DQ2FsbENvbnYgICAgICAgICAgID0gMCwKKyAgTExWTUZhc3RDYWxsQ29udiAgICAgICAgPSA4LAorICBMTFZNQ29sZENhbGxDb252ICAgICAgICA9IDksCisgIExMVk1XZWJLaXRKU0NhbGxDb252ICAgID0gMTIsCisgIExMVk1BbnlSZWdDYWxsQ29udiAgICAgID0gMTMsCisgIExMVk1YODZTdGRjYWxsQ2FsbENvbnYgID0gNjQsCisgIExMVk1YODZGYXN0Y2FsbENhbGxDb252ID0gNjUKK30gTExWTUNhbGxDb252OworCit0eXBlZGVmIGVudW0geworICBMTFZNQXJndW1lbnRWYWx1ZUtpbmQsCisgIExMVk1CYXNpY0Jsb2NrVmFsdWVLaW5kLAorICBMTFZNTWVtb3J5VXNlVmFsdWVLaW5kLAorICBMTFZNTWVtb3J5RGVmVmFsdWVLaW5kLAorICBMTFZNTWVtb3J5UGhpVmFsdWVLaW5kLAorCisgIExMVk1GdW5jdGlvblZhbHVlS2luZCwKKyAgTExWTUdsb2JhbEFsaWFzVmFsdWVLaW5kLAorICBMTFZNR2xvYmFsSUZ1bmNWYWx1ZUtpbmQsCisgIExMVk1HbG9iYWxWYXJpYWJsZVZhbHVlS2luZCwKKyAgTExWTUJsb2NrQWRkcmVzc1ZhbHVlS2luZCwKKyAgTExWTUNvbnN0YW50RXhwclZhbHVlS2luZCwKKyAgTExWTUNvbnN0YW50QXJyYXlWYWx1ZUtpbmQsCisgIExMVk1Db25zdGFudFN0cnVjdFZhbHVlS2luZCwKKyAgTExWTUNvbnN0YW50VmVjdG9yVmFsdWVLaW5kLAorCisgIExMVk1VbmRlZlZhbHVlVmFsdWVLaW5kLAorICBMTFZNQ29uc3RhbnRBZ2dyZWdhdGVaZXJvVmFsdWVLaW5kLAorICBMTFZNQ29uc3RhbnREYXRhQXJyYXlWYWx1ZUtpbmQsCisgIExMVk1Db25zdGFudERhdGFWZWN0b3JWYWx1ZUtpbmQsCisgIExMVk1Db25zdGFudEludFZhbHVlS2luZCwKKyAgTExWTUNvbnN0YW50RlBWYWx1ZUtpbmQsCisgIExMVk1Db25zdGFudFBvaW50ZXJOdWxsVmFsdWVLaW5kLAorICBMTFZNQ29uc3RhbnRUb2tlbk5vbmVWYWx1ZUtpbmQsCisKKyAgTExWTU1ldGFkYXRhQXNWYWx1ZVZhbHVlS2luZCwKKyAgTExWTUlubGluZUFzbVZhbHVlS2luZCwKKworICBMTFZNSW5zdHJ1Y3Rpb25WYWx1ZUtpbmQsCit9IExMVk1WYWx1ZUtpbmQ7CisKK3R5cGVkZWYgZW51bSB7CisgIExMVk1JbnRFUSA9IDMyLCAvKio8IGVxdWFsICovCisgIExMVk1JbnRORSwgICAgICAvKio8IG5vdCBlcXVhbCAqLworICBMTFZNSW50VUdULCAgICAgLyoqPCB1bnNpZ25lZCBncmVhdGVyIHRoYW4gKi8KKyAgTExWTUludFVHRSwgICAgIC8qKjwgdW5zaWduZWQgZ3JlYXRlciBvciBlcXVhbCAqLworICBMTFZNSW50VUxULCAgICAgLyoqPCB1bnNpZ25lZCBsZXNzIHRoYW4gKi8KKyAgTExWTUludFVMRSwgICAgIC8qKjwgdW5zaWduZWQgbGVzcyBvciBlcXVhbCAqLworICBMTFZNSW50U0dULCAgICAgLyoqPCBzaWduZWQgZ3JlYXRlciB0aGFuICovCisgIExMVk1JbnRTR0UsICAgICAvKio8IHNpZ25lZCBncmVhdGVyIG9yIGVxdWFsICovCisgIExMVk1JbnRTTFQsICAgICAvKio8IHNpZ25lZCBsZXNzIHRoYW4gKi8KKyAgTExWTUludFNMRSAgICAgIC8qKjwgc2lnbmVkIGxlc3Mgb3IgZXF1YWwgKi8KK30gTExWTUludFByZWRpY2F0ZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgTExWTVJlYWxQcmVkaWNhdGVGYWxzZSwgLyoqPCBBbHdheXMgZmFsc2UgKGFsd2F5cyBmb2xkZWQpICovCisgIExMVk1SZWFsT0VRLCAgICAgICAgICAgIC8qKjwgVHJ1ZSBpZiBvcmRlcmVkIGFuZCBlcXVhbCAqLworICBMTFZNUmVhbE9HVCwgICAgICAgICAgICAvKio8IFRydWUgaWYgb3JkZXJlZCBhbmQgZ3JlYXRlciB0aGFuICovCisgIExMVk1SZWFsT0dFLCAgICAgICAgICAgIC8qKjwgVHJ1ZSBpZiBvcmRlcmVkIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgKi8KKyAgTExWTVJlYWxPTFQsICAgICAgICAgICAgLyoqPCBUcnVlIGlmIG9yZGVyZWQgYW5kIGxlc3MgdGhhbiAqLworICBMTFZNUmVhbE9MRSwgICAgICAgICAgICAvKio8IFRydWUgaWYgb3JkZXJlZCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsICovCisgIExMVk1SZWFsT05FLCAgICAgICAgICAgIC8qKjwgVHJ1ZSBpZiBvcmRlcmVkIGFuZCBvcGVyYW5kcyBhcmUgdW5lcXVhbCAqLworICBMTFZNUmVhbE9SRCwgICAgICAgICAgICAvKio8IFRydWUgaWYgb3JkZXJlZCAobm8gbmFucykgKi8KKyAgTExWTVJlYWxVTk8sICAgICAgICAgICAgLyoqPCBUcnVlIGlmIHVub3JkZXJlZDogaXNuYW4oWCkgfCBpc25hbihZKSAqLworICBMTFZNUmVhbFVFUSwgICAgICAgICAgICAvKio8IFRydWUgaWYgdW5vcmRlcmVkIG9yIGVxdWFsICovCisgIExMVk1SZWFsVUdULCAgICAgICAgICAgIC8qKjwgVHJ1ZSBpZiB1bm9yZGVyZWQgb3IgZ3JlYXRlciB0aGFuICovCisgIExMVk1SZWFsVUdFLCAgICAgICAgICAgIC8qKjwgVHJ1ZSBpZiB1bm9yZGVyZWQsIGdyZWF0ZXIgdGhhbiwgb3IgZXF1YWwgKi8KKyAgTExWTVJlYWxVTFQsICAgICAgICAgICAgLyoqPCBUcnVlIGlmIHVub3JkZXJlZCBvciBsZXNzIHRoYW4gKi8KKyAgTExWTVJlYWxVTEUsICAgICAgICAgICAgLyoqPCBUcnVlIGlmIHVub3JkZXJlZCwgbGVzcyB0aGFuLCBvciBlcXVhbCAqLworICBMTFZNUmVhbFVORSwgICAgICAgICAgICAvKio8IFRydWUgaWYgdW5vcmRlcmVkIG9yIG5vdCBlcXVhbCAqLworICBMTFZNUmVhbFByZWRpY2F0ZVRydWUgICAvKio8IEFsd2F5cyB0cnVlIChhbHdheXMgZm9sZGVkKSAqLworfSBMTFZNUmVhbFByZWRpY2F0ZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgTExWTUxhbmRpbmdQYWRDYXRjaCwgICAgLyoqPCBBIGNhdGNoIGNsYXVzZSAgICovCisgIExMVk1MYW5kaW5nUGFkRmlsdGVyICAgIC8qKjwgQSBmaWx0ZXIgY2xhdXNlICAqLworfSBMTFZNTGFuZGluZ1BhZENsYXVzZVR5OworCit0eXBlZGVmIGVudW0geworICBMTFZNTm90VGhyZWFkTG9jYWwgPSAwLAorICBMTFZNR2VuZXJhbER5bmFtaWNUTFNNb2RlbCwKKyAgTExWTUxvY2FsRHluYW1pY1RMU01vZGVsLAorICBMTFZNSW5pdGlhbEV4ZWNUTFNNb2RlbCwKKyAgTExWTUxvY2FsRXhlY1RMU01vZGVsCit9IExMVk1UaHJlYWRMb2NhbE1vZGU7CisKK3R5cGVkZWYgZW51bSB7CisgIExMVk1BdG9taWNPcmRlcmluZ05vdEF0b21pYyA9IDAsIC8qKjwgQSBsb2FkIG9yIHN0b3JlIHdoaWNoIGlzIG5vdCBhdG9taWMgKi8KKyAgTExWTUF0b21pY09yZGVyaW5nVW5vcmRlcmVkID0gMSwgLyoqPCBMb3dlc3QgbGV2ZWwgb2YgYXRvbWljaXR5LCBndWFyYW50ZWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29tZXdoYXQgc2FuZSByZXN1bHRzLCBsb2NrIGZyZWUuICovCisgIExMVk1BdG9taWNPcmRlcmluZ01vbm90b25pYyA9IDIsIC8qKjwgZ3VhcmFudGVlcyB0aGF0IGlmIHlvdSB0YWtlIGFsbCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zIGFmZmVjdGluZyBhIHNwZWNpZmljIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjb25zaXN0ZW50IG9yZGVyaW5nIGV4aXN0cyAqLworICBMTFZNQXRvbWljT3JkZXJpbmdBY3F1aXJlID0gNCwgLyoqPCBBY3F1aXJlIHByb3ZpZGVzIGEgYmFycmllciBvZiB0aGUgc29ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcnkgdG8gYWNxdWlyZSBhIGxvY2sgdG8gYWNjZXNzIG90aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSB3aXRoIG5vcm1hbCBsb2FkcyBhbmQgc3RvcmVzLiAqLworICBMTFZNQXRvbWljT3JkZXJpbmdSZWxlYXNlID0gNSwgLyoqPCBSZWxlYXNlIGlzIHNpbWlsYXIgdG8gQWNxdWlyZSwgYnV0IHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBiYXJyaWVyIG9mIHRoZSBzb3J0IG5lY2Vzc2FyeSB0byByZWxlYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgbG9jay4gKi8KKyAgTExWTUF0b21pY09yZGVyaW5nQWNxdWlyZVJlbGVhc2UgPSA2LCAvKio8IHByb3ZpZGVzIGJvdGggYW4gQWNxdWlyZSBhbmQgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZSBiYXJyaWVyIChmb3IgZmVuY2VzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucyB3aGljaCBib3RoIHJlYWQgYW5kIHdyaXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5KS4gKi8KKyAgTExWTUF0b21pY09yZGVyaW5nU2VxdWVudGlhbGx5Q29uc2lzdGVudCA9IDcgLyoqPCBwcm92aWRlcyBBY3F1aXJlIHNlbWFudGljcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsb2FkcyBhbmQgUmVsZWFzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFudGljcyBmb3Igc3RvcmVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgaXQgZ3VhcmFudGVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgYSB0b3RhbCBvcmRlcmluZyBleGlzdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbnRpYWxseUNvbnNpc3RlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLiAqLworfSBMTFZNQXRvbWljT3JkZXJpbmc7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTExWTUF0b21pY1JNV0Jpbk9wWGNoZywgLyoqPCBTZXQgdGhlIG5ldyB2YWx1ZSBhbmQgcmV0dXJuIHRoZSBvbmUgb2xkICovCisgICAgTExWTUF0b21pY1JNV0Jpbk9wQWRkLCAvKio8IEFkZCBhIHZhbHVlIGFuZCByZXR1cm4gdGhlIG9sZCBvbmUgKi8KKyAgICBMTFZNQXRvbWljUk1XQmluT3BTdWIsIC8qKjwgU3VidHJhY3QgYSB2YWx1ZSBhbmQgcmV0dXJuIHRoZSBvbGQgb25lICovCisgICAgTExWTUF0b21pY1JNV0Jpbk9wQW5kLCAvKio8IEFuZCBhIHZhbHVlIGFuZCByZXR1cm4gdGhlIG9sZCBvbmUgKi8KKyAgICBMTFZNQXRvbWljUk1XQmluT3BOYW5kLCAvKio8IE5vdC1BbmQgYSB2YWx1ZSBhbmQgcmV0dXJuIHRoZSBvbGQgb25lICovCisgICAgTExWTUF0b21pY1JNV0Jpbk9wT3IsIC8qKjwgT1IgYSB2YWx1ZSBhbmQgcmV0dXJuIHRoZSBvbGQgb25lICovCisgICAgTExWTUF0b21pY1JNV0Jpbk9wWG9yLCAvKio8IFhvciBhIHZhbHVlIGFuZCByZXR1cm4gdGhlIG9sZCBvbmUgKi8KKyAgICBMTFZNQXRvbWljUk1XQmluT3BNYXgsIC8qKjwgU2V0cyB0aGUgdmFsdWUgaWYgaXQncyBncmVhdGVyIHRoYW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsIHVzaW5nIGEgc2lnbmVkIGNvbXBhcmlzb24gYW5kIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb2xkIG9uZSAqLworICAgIExMVk1BdG9taWNSTVdCaW5PcE1pbiwgLyoqPCBTZXRzIHRoZSB2YWx1ZSBpZiBpdCdzIFNtYWxsZXIgdGhhbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwgdXNpbmcgYSBzaWduZWQgY29tcGFyaXNvbiBhbmQgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvbGQgb25lICovCisgICAgTExWTUF0b21pY1JNV0Jpbk9wVU1heCwgLyoqPCBTZXRzIHRoZSB2YWx1ZSBpZiBpdCdzIGdyZWF0ZXIgdGhhbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwgdXNpbmcgYW4gdW5zaWduZWQgY29tcGFyaXNvbiBhbmQgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvbGQgb25lICovCisgICAgTExWTUF0b21pY1JNV0Jpbk9wVU1pbiAvKio8IFNldHMgdGhlIHZhbHVlIGlmIGl0J3MgZ3JlYXRlciB0aGFuIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbCB1c2luZyBhbiB1bnNpZ25lZCBjb21wYXJpc29uICBhbmQgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvbGQgb25lICovCit9IExMVk1BdG9taWNSTVdCaW5PcDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBMTFZNRFNFcnJvciwKKyAgICBMTFZNRFNXYXJuaW5nLAorICAgIExMVk1EU1JlbWFyaywKKyAgICBMTFZNRFNOb3RlCit9IExMVk1EaWFnbm9zdGljU2V2ZXJpdHk7CisKKy8qKgorICogQXR0cmlidXRlIGluZGV4IGFyZSBlaXRoZXIgTExWTUF0dHJpYnV0ZVJldHVybkluZGV4LAorICogTExWTUF0dHJpYnV0ZUZ1bmN0aW9uSW5kZXggb3IgYSBwYXJhbWV0ZXIgbnVtYmVyIGZyb20gMSB0byBOLgorICovCitlbnVtIHsKKyAgTExWTUF0dHJpYnV0ZVJldHVybkluZGV4ID0gMFUsCisgIC8vIElTTyBDIHJlc3RyaWN0cyBlbnVtZXJhdG9yIHZhbHVlcyB0byByYW5nZSBvZiAnaW50JworICAvLyAoNDI5NDk2NzI5NSBpcyB0b28gbGFyZ2UpCisgIC8vIExMVk1BdHRyaWJ1dGVGdW5jdGlvbkluZGV4ID0gfjBVLAorICBMTFZNQXR0cmlidXRlRnVuY3Rpb25JbmRleCA9IC0xLAorfTsKKwordHlwZWRlZiB1bnNpZ25lZCBMTFZNQXR0cmlidXRlSW5kZXg7CisKKy8qKgorICogQH0KKyAqLworCit2b2lkIExMVk1Jbml0aWFsaXplQ29yZShMTFZNUGFzc1JlZ2lzdHJ5UmVmIFIpOworCisvKiogRGVhbGxvY2F0ZSBhbmQgZGVzdHJveSBhbGwgTWFuYWdlZFN0YXRpYyB2YXJpYWJsZXMuCisgICAgQHNlZSBsbHZtOjpsbHZtX3NodXRkb3duCisgICAgQHNlZSBNYW5hZ2VkU3RhdGljICovCit2b2lkIExMVk1TaHV0ZG93bih2b2lkKTsKKworLyo9PT0tLSBFcnJvciBoYW5kbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworY2hhciAqTExWTUNyZWF0ZU1lc3NhZ2UoY29uc3QgY2hhciAqTWVzc2FnZSk7Cit2b2lkIExMVk1EaXNwb3NlTWVzc2FnZShjaGFyICpNZXNzYWdlKTsKKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNDb3JlQ29udGV4dCBDb250ZXh0cworICoKKyAqIENvbnRleHRzIGFyZSBleGVjdXRpb24gc3RhdGVzIGZvciB0aGUgY29yZSBMTFZNIElSIHN5c3RlbS4KKyAqCisgKiBNb3N0IHR5cGVzIGFyZSB0aWVkIHRvIGEgY29udGV4dCBpbnN0YW5jZS4gTXVsdGlwbGUgY29udGV4dHMgY2FuCisgKiBleGlzdCBzaW11bHRhbmVvdXNseS4gQSBzaW5nbGUgY29udGV4dCBpcyBub3QgdGhyZWFkIHNhZmUuIEhvd2V2ZXIsCisgKiBkaWZmZXJlbnQgY29udGV4dHMgY2FuIGV4ZWN1dGUgb24gZGlmZmVyZW50IHRocmVhZHMgc2ltdWx0YW5lb3VzbHkuCisgKgorICogQHsKKyAqLworCit0eXBlZGVmIHZvaWQgKCpMTFZNRGlhZ25vc3RpY0hhbmRsZXIpKExMVk1EaWFnbm9zdGljSW5mb1JlZiwgdm9pZCAqKTsKK3R5cGVkZWYgdm9pZCAoKkxMVk1ZaWVsZENhbGxiYWNrKShMTFZNQ29udGV4dFJlZiwgdm9pZCAqKTsKKworLyoqCisgKiBDcmVhdGUgYSBuZXcgY29udGV4dC4KKyAqCisgKiBFdmVyeSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHBhaXJlZCB3aXRoIGEgY2FsbCB0bworICogTExWTUNvbnRleHREaXNwb3NlKCkgb3IgdGhlIGNvbnRleHQgd2lsbCBsZWFrIG1lbW9yeS4KKyAqLworTExWTUNvbnRleHRSZWYgTExWTUNvbnRleHRDcmVhdGUodm9pZCk7CisKKy8qKgorICogT2J0YWluIHRoZSBnbG9iYWwgY29udGV4dCBpbnN0YW5jZS4KKyAqLworTExWTUNvbnRleHRSZWYgTExWTUdldEdsb2JhbENvbnRleHQodm9pZCk7CisKKy8qKgorICogU2V0IHRoZSBkaWFnbm9zdGljIGhhbmRsZXIgZm9yIHRoaXMgY29udGV4dC4KKyAqLwordm9pZCBMTFZNQ29udGV4dFNldERpYWdub3N0aWNIYW5kbGVyKExMVk1Db250ZXh0UmVmIEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTURpYWdub3N0aWNIYW5kbGVyIEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqRGlhZ25vc3RpY0NvbnRleHQpOworCisvKioKKyAqIEdldCB0aGUgZGlhZ25vc3RpYyBoYW5kbGVyIG9mIHRoaXMgY29udGV4dC4KKyAqLworTExWTURpYWdub3N0aWNIYW5kbGVyIExMVk1Db250ZXh0R2V0RGlhZ25vc3RpY0hhbmRsZXIoTExWTUNvbnRleHRSZWYgQyk7CisKKy8qKgorICogR2V0IHRoZSBkaWFnbm9zdGljIGNvbnRleHQgb2YgdGhpcyBjb250ZXh0LgorICovCit2b2lkICpMTFZNQ29udGV4dEdldERpYWdub3N0aWNDb250ZXh0KExMVk1Db250ZXh0UmVmIEMpOworCisvKioKKyAqIFNldCB0aGUgeWllbGQgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoaXMgY29udGV4dC4KKyAqCisgKiBAc2VlIExMVk1Db250ZXh0OjpzZXRZaWVsZENhbGxiYWNrKCkKKyAqLwordm9pZCBMTFZNQ29udGV4dFNldFlpZWxkQ2FsbGJhY2soTExWTUNvbnRleHRSZWYgQywgTExWTVlpZWxkQ2FsbGJhY2sgQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpPcGFxdWVIYW5kbGUpOworCisvKioKKyAqIERlc3Ryb3kgYSBjb250ZXh0IGluc3RhbmNlLgorICoKKyAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZXZlcnkgY2FsbCB0byBMTFZNQ29udGV4dENyZWF0ZSgpIG9yIG1lbW9yeQorICogd2lsbCBiZSBsZWFrZWQuCisgKi8KK3ZvaWQgTExWTUNvbnRleHREaXNwb3NlKExMVk1Db250ZXh0UmVmIEMpOworCisvKioKKyAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgRGlhZ25vc3RpY0luZm8uIFVzZQorICogTExWTURpc3Bvc2VNZXNzYWdlIHRvIGZyZWUgdGhlIHN0cmluZy4KKyAqCisgKiBAc2VlIERpYWdub3N0aWNJbmZvOjpwcmludCgpCisgKi8KK2NoYXIgKkxMVk1HZXREaWFnSW5mb0Rlc2NyaXB0aW9uKExMVk1EaWFnbm9zdGljSW5mb1JlZiBESSk7CisKKy8qKgorICogUmV0dXJuIGFuIGVudW0gTExWTURpYWdub3N0aWNTZXZlcml0eS4KKyAqCisgKiBAc2VlIERpYWdub3N0aWNJbmZvOjpnZXRTZXZlcml0eSgpCisgKi8KK0xMVk1EaWFnbm9zdGljU2V2ZXJpdHkgTExWTUdldERpYWdJbmZvU2V2ZXJpdHkoTExWTURpYWdub3N0aWNJbmZvUmVmIERJKTsKKwordW5zaWduZWQgTExWTUdldE1ES2luZElESW5Db250ZXh0KExMVk1Db250ZXh0UmVmIEMsIGNvbnN0IGNoYXIgKk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU0xlbik7Cit1bnNpZ25lZCBMTFZNR2V0TURLaW5kSUQoY29uc3QgY2hhciAqTmFtZSwgdW5zaWduZWQgU0xlbik7CisKKy8qKgorICogUmV0dXJuIGFuIHVuaXF1ZSBpZCBnaXZlbiB0aGUgbmFtZSBvZiBhIGVudW0gYXR0cmlidXRlLAorICogb3IgMCBpZiBubyBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lIGV4aXN0cy4KKyAqCisgKiBTZWUgaHR0cDovL2xsdm0ub3JnL2RvY3MvTGFuZ1JlZi5odG1sI3BhcmFtZXRlci1hdHRyaWJ1dGVzCisgKiBhbmQgaHR0cDovL2xsdm0ub3JnL2RvY3MvTGFuZ1JlZi5odG1sI2Z1bmN0aW9uLWF0dHJpYnV0ZXMKKyAqIGZvciB0aGUgbGlzdCBvZiBhdmFpbGFibGUgYXR0cmlidXRlcy4KKyAqCisgKiBOQjogQXR0cmlidXRlIG5hbWVzIGFuZC9vciBpZCBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dAorICogZ29pbmcgdGhyb3VnaCB0aGUgQyBBUEkgZGVwcmVjYXRpb24gY3ljbGUuCisgKi8KK3Vuc2lnbmVkIExMVk1HZXRFbnVtQXR0cmlidXRlS2luZEZvck5hbWUoY29uc3QgY2hhciAqTmFtZSwgc2l6ZV90IFNMZW4pOwordW5zaWduZWQgTExWTUdldExhc3RFbnVtQXR0cmlidXRlS2luZCh2b2lkKTsKKworLyoqCisgKiBDcmVhdGUgYW4gZW51bSBhdHRyaWJ1dGUuCisgKi8KK0xMVk1BdHRyaWJ1dGVSZWYgTExWTUNyZWF0ZUVudW1BdHRyaWJ1dGUoTExWTUNvbnRleHRSZWYgQywgdW5zaWduZWQgS2luZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBWYWwpOworCisvKioKKyAqIEdldCB0aGUgdW5pcXVlIGlkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVudW0gYXR0cmlidXRlCisgKiBwYXNzZWQgYXMgYXJndW1lbnQuCisgKi8KK3Vuc2lnbmVkIExMVk1HZXRFbnVtQXR0cmlidXRlS2luZChMTFZNQXR0cmlidXRlUmVmIEEpOworCisvKioKKyAqIEdldCB0aGUgZW51bSBhdHRyaWJ1dGUncyB2YWx1ZS4gMCBpcyByZXR1cm5lZCBpZiBub25lIGV4aXN0cy4KKyAqLwordWludDY0X3QgTExWTUdldEVudW1BdHRyaWJ1dGVWYWx1ZShMTFZNQXR0cmlidXRlUmVmIEEpOworCisvKioKKyAqIENyZWF0ZSBhIHN0cmluZyBhdHRyaWJ1dGUuCisgKi8KK0xMVk1BdHRyaWJ1dGVSZWYgTExWTUNyZWF0ZVN0cmluZ0F0dHJpYnV0ZShMTFZNQ29udGV4dFJlZiBDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkssIHVuc2lnbmVkIEtMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqViwgdW5zaWduZWQgVkxlbmd0aCk7CisKKy8qKgorICogR2V0IHRoZSBzdHJpbmcgYXR0cmlidXRlJ3Mga2luZC4KKyAqLworY29uc3QgY2hhciAqTExWTUdldFN0cmluZ0F0dHJpYnV0ZUtpbmQoTExWTUF0dHJpYnV0ZVJlZiBBLCB1bnNpZ25lZCAqTGVuZ3RoKTsKKworLyoqCisgKiBHZXQgdGhlIHN0cmluZyBhdHRyaWJ1dGUncyB2YWx1ZS4KKyAqLworY29uc3QgY2hhciAqTExWTUdldFN0cmluZ0F0dHJpYnV0ZVZhbHVlKExMVk1BdHRyaWJ1dGVSZWYgQSwgdW5zaWduZWQgKkxlbmd0aCk7CisKKy8qKgorICogQ2hlY2sgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgYXR0cmlidXRlcy4KKyAqLworTExWTUJvb2wgTExWTUlzRW51bUF0dHJpYnV0ZShMTFZNQXR0cmlidXRlUmVmIEEpOworTExWTUJvb2wgTExWTUlzU3RyaW5nQXR0cmlidXRlKExMVk1BdHRyaWJ1dGVSZWYgQSk7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ0NvcmVNb2R1bGUgTW9kdWxlcworICoKKyAqIE1vZHVsZXMgcmVwcmVzZW50IHRoZSB0b3AtbGV2ZWwgc3RydWN0dXJlIGluIGFuIExMVk0gcHJvZ3JhbS4gQW4gTExWTQorICogbW9kdWxlIGlzIGVmZmVjdGl2ZWx5IGEgdHJhbnNsYXRpb24gdW5pdCBvciBhIGNvbGxlY3Rpb24gb2YKKyAqIHRyYW5zbGF0aW9uIHVuaXRzIG1lcmdlZCB0b2dldGhlci4KKyAqCisgKiBAeworICovCisKKy8qKgorICogQ3JlYXRlIGEgbmV3LCBlbXB0eSBtb2R1bGUgaW4gdGhlIGdsb2JhbCBjb250ZXh0LgorICoKKyAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIExMVk1Nb2R1bGVDcmVhdGVXaXRoTmFtZUluQ29udGV4dCB3aXRoCisgKiBMTFZNR2V0R2xvYmFsQ29udGV4dCgpIGFzIHRoZSBjb250ZXh0IHBhcmFtZXRlci4KKyAqCisgKiBFdmVyeSBpbnZvY2F0aW9uIHNob3VsZCBiZSBwYWlyZWQgd2l0aCBMTFZNRGlzcG9zZU1vZHVsZSgpIG9yIG1lbW9yeQorICogd2lsbCBiZSBsZWFrZWQuCisgKi8KK0xMVk1Nb2R1bGVSZWYgTExWTU1vZHVsZUNyZWF0ZVdpdGhOYW1lKGNvbnN0IGNoYXIgKk1vZHVsZUlEKTsKKworLyoqCisgKiBDcmVhdGUgYSBuZXcsIGVtcHR5IG1vZHVsZSBpbiBhIHNwZWNpZmljIGNvbnRleHQuCisgKgorICogRXZlcnkgaW52b2NhdGlvbiBzaG91bGQgYmUgcGFpcmVkIHdpdGggTExWTURpc3Bvc2VNb2R1bGUoKSBvciBtZW1vcnkKKyAqIHdpbGwgYmUgbGVha2VkLgorICovCitMTFZNTW9kdWxlUmVmIExMVk1Nb2R1bGVDcmVhdGVXaXRoTmFtZUluQ29udGV4dChjb25zdCBjaGFyICpNb2R1bGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0UmVmIEMpOworLyoqCisgKiBSZXR1cm4gYW4gZXhhY3QgY29weSBvZiB0aGUgc3BlY2lmaWVkIG1vZHVsZS4KKyAqLworTExWTU1vZHVsZVJlZiBMTFZNQ2xvbmVNb2R1bGUoTExWTU1vZHVsZVJlZiBNKTsKKworLyoqCisgKiBEZXN0cm95IGEgbW9kdWxlIGluc3RhbmNlLgorICoKKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IGNyZWF0ZWQgbW9kdWxlIG9yIG1lbW9yeSB3aWxsIGJlCisgKiBsZWFrZWQuCisgKi8KK3ZvaWQgTExWTURpc3Bvc2VNb2R1bGUoTExWTU1vZHVsZVJlZiBNKTsKKworLyoqCisgKiBPYnRhaW4gdGhlIGlkZW50aWZpZXIgb2YgYSBtb2R1bGUuCisgKgorICogQHBhcmFtIE0gTW9kdWxlIHRvIG9idGFpbiBpZGVudGlmaWVyIG9mCisgKiBAcGFyYW0gTGVuIE91dCBwYXJhbWV0ZXIgd2hpY2ggaG9sZHMgdGhlIGxlbmd0aCBvZiB0aGUgcmV0dXJuZWQgc3RyaW5nLgorICogQHJldHVybiBUaGUgaWRlbnRpZmllciBvZiBNLgorICogQHNlZSBNb2R1bGU6OmdldE1vZHVsZUlkZW50aWZpZXIoKQorICovCitjb25zdCBjaGFyICpMTFZNR2V0TW9kdWxlSWRlbnRpZmllcihMTFZNTW9kdWxlUmVmIE0sIHNpemVfdCAqTGVuKTsKKworLyoqCisgKiBTZXQgdGhlIGlkZW50aWZpZXIgb2YgYSBtb2R1bGUgdG8gYSBzdHJpbmcgSWRlbnQgd2l0aCBsZW5ndGggTGVuLgorICoKKyAqIEBwYXJhbSBNIFRoZSBtb2R1bGUgdG8gc2V0IGlkZW50aWZpZXIKKyAqIEBwYXJhbSBJZGVudCBUaGUgc3RyaW5nIHRvIHNldCBNJ3MgaWRlbnRpZmllciB0bworICogQHBhcmFtIExlbiBMZW5ndGggb2YgSWRlbnQKKyAqIEBzZWUgTW9kdWxlOjpzZXRNb2R1bGVJZGVudGlmaWVyKCkKKyAqLwordm9pZCBMTFZNU2V0TW9kdWxlSWRlbnRpZmllcihMTFZNTW9kdWxlUmVmIE0sIGNvbnN0IGNoYXIgKklkZW50LCBzaXplX3QgTGVuKTsKKworLyoqCisgKiBPYnRhaW4gdGhlIG1vZHVsZSdzIG9yaWdpbmFsIHNvdXJjZSBmaWxlIG5hbWUuCisgKgorICogQHBhcmFtIE0gTW9kdWxlIHRvIG9idGFpbiB0aGUgbmFtZSBvZgorICogQHBhcmFtIExlbiBPdXQgcGFyYW1ldGVyIHdoaWNoIGhvbGRzIHRoZSBsZW5ndGggb2YgdGhlIHJldHVybmVkIHN0cmluZworICogQHJldHVybiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUgbmFtZSBvZiBNCisgKiBAc2VlIE1vZHVsZTo6Z2V0U291cmNlRmlsZU5hbWUoKQorICovCitjb25zdCBjaGFyICpMTFZNR2V0U291cmNlRmlsZU5hbWUoTExWTU1vZHVsZVJlZiBNLCBzaXplX3QgKkxlbik7CisKKy8qKgorICogU2V0IHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSBuYW1lIG9mIGEgbW9kdWxlIHRvIGEgc3RyaW5nIE5hbWUgd2l0aCBsZW5ndGgKKyAqIExlbi4KKyAqCisgKiBAcGFyYW0gTSBUaGUgbW9kdWxlIHRvIHNldCB0aGUgc291cmNlIGZpbGUgbmFtZSBvZgorICogQHBhcmFtIE5hbWUgVGhlIHN0cmluZyB0byBzZXQgTSdzIHNvdXJjZSBmaWxlIG5hbWUgdG8KKyAqIEBwYXJhbSBMZW4gTGVuZ3RoIG9mIE5hbWUKKyAqIEBzZWUgTW9kdWxlOjpzZXRTb3VyY2VGaWxlTmFtZSgpCisgKi8KK3ZvaWQgTExWTVNldFNvdXJjZUZpbGVOYW1lKExMVk1Nb2R1bGVSZWYgTSwgY29uc3QgY2hhciAqTmFtZSwgc2l6ZV90IExlbik7CisKKy8qKgorICogT2J0YWluIHRoZSBkYXRhIGxheW91dCBmb3IgYSBtb2R1bGUuCisgKgorICogQHNlZSBNb2R1bGU6OmdldERhdGFMYXlvdXRTdHIoKQorICoKKyAqIExMVk1HZXREYXRhTGF5b3V0IGlzIERFUFJFQ0FURUQsIGFzIHRoZSBuYW1lIGlzIG5vdCBvbmx5IGluY29ycmVjdCwKKyAqIGJ1dCBtYXRjaCB0aGUgbmFtZSBvZiBhbm90aGVyIG1ldGhvZCBvbiB0aGUgbW9kdWxlLiBQcmVmZXIgdGhlIHVzZQorICogb2YgTExWTUdldERhdGFMYXlvdXRTdHIsIHdoaWNoIGlzIG5vdCBhbWJpZ3VvdXMuCisgKi8KK2NvbnN0IGNoYXIgKkxMVk1HZXREYXRhTGF5b3V0U3RyKExMVk1Nb2R1bGVSZWYgTSk7Citjb25zdCBjaGFyICpMTFZNR2V0RGF0YUxheW91dChMTFZNTW9kdWxlUmVmIE0pOworCisvKioKKyAqIFNldCB0aGUgZGF0YSBsYXlvdXQgZm9yIGEgbW9kdWxlLgorICoKKyAqIEBzZWUgTW9kdWxlOjpzZXREYXRhTGF5b3V0KCkKKyAqLwordm9pZCBMTFZNU2V0RGF0YUxheW91dChMTFZNTW9kdWxlUmVmIE0sIGNvbnN0IGNoYXIgKkRhdGFMYXlvdXRTdHIpOworCisvKioKKyAqIE9idGFpbiB0aGUgdGFyZ2V0IHRyaXBsZSBmb3IgYSBtb2R1bGUuCisgKgorICogQHNlZSBNb2R1bGU6OmdldFRhcmdldFRyaXBsZSgpCisgKi8KK2NvbnN0IGNoYXIgKkxMVk1HZXRUYXJnZXQoTExWTU1vZHVsZVJlZiBNKTsKKworLyoqCisgKiBTZXQgdGhlIHRhcmdldCB0cmlwbGUgZm9yIGEgbW9kdWxlLgorICoKKyAqIEBzZWUgTW9kdWxlOjpzZXRUYXJnZXRUcmlwbGUoKQorICovCit2b2lkIExMVk1TZXRUYXJnZXQoTExWTU1vZHVsZVJlZiBNLCBjb25zdCBjaGFyICpUcmlwbGUpOworCisvKioKKyAqIER1bXAgYSByZXByZXNlbnRhdGlvbiBvZiBhIG1vZHVsZSB0byBzdGRlcnIuCisgKgorICogQHNlZSBNb2R1bGU6OmR1bXAoKQorICovCit2b2lkIExMVk1EdW1wTW9kdWxlKExMVk1Nb2R1bGVSZWYgTSk7CisKKy8qKgorICogUHJpbnQgYSByZXByZXNlbnRhdGlvbiBvZiBhIG1vZHVsZSB0byBhIGZpbGUuIFRoZSBFcnJvck1lc3NhZ2UgbmVlZHMgdG8gYmUKKyAqIGRpc3Bvc2VkIHdpdGggTExWTURpc3Bvc2VNZXNzYWdlLiBSZXR1cm5zIDAgb24gc3VjY2VzcywgMSBvdGhlcndpc2UuCisgKgorICogQHNlZSBNb2R1bGU6OnByaW50KCkKKyAqLworTExWTUJvb2wgTExWTVByaW50TW9kdWxlVG9GaWxlKExMVk1Nb2R1bGVSZWYgTSwgY29uc3QgY2hhciAqRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKkVycm9yTWVzc2FnZSk7CisKKy8qKgorICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2R1bGUuIFVzZQorICogTExWTURpc3Bvc2VNZXNzYWdlIHRvIGZyZWUgdGhlIHN0cmluZy4KKyAqCisgKiBAc2VlIE1vZHVsZTo6cHJpbnQoKQorICovCitjaGFyICpMTFZNUHJpbnRNb2R1bGVUb1N0cmluZyhMTFZNTW9kdWxlUmVmIE0pOworCisvKioKKyAqIFNldCBpbmxpbmUgYXNzZW1ibHkgZm9yIGEgbW9kdWxlLgorICoKKyAqIEBzZWUgTW9kdWxlOjpzZXRNb2R1bGVJbmxpbmVBc20oKQorICovCit2b2lkIExMVk1TZXRNb2R1bGVJbmxpbmVBc20oTExWTU1vZHVsZVJlZiBNLCBjb25zdCBjaGFyICpBc20pOworCisvKioKKyAqIE9idGFpbiB0aGUgY29udGV4dCB0byB3aGljaCB0aGlzIG1vZHVsZSBpcyBhc3NvY2lhdGVkLgorICoKKyAqIEBzZWUgTW9kdWxlOjpnZXRDb250ZXh0KCkKKyAqLworTExWTUNvbnRleHRSZWYgTExWTUdldE1vZHVsZUNvbnRleHQoTExWTU1vZHVsZVJlZiBNKTsKKworLyoqCisgKiBPYnRhaW4gYSBUeXBlIGZyb20gYSBtb2R1bGUgYnkgaXRzIHJlZ2lzdGVyZWQgbmFtZS4KKyAqLworTExWTVR5cGVSZWYgTExWTUdldFR5cGVCeU5hbWUoTExWTU1vZHVsZVJlZiBNLCBjb25zdCBjaGFyICpOYW1lKTsKKworLyoqCisgKiBPYnRhaW4gdGhlIG51bWJlciBvZiBvcGVyYW5kcyBmb3IgbmFtZWQgbWV0YWRhdGEgaW4gYSBtb2R1bGUuCisgKgorICogQHNlZSBsbHZtOjpNb2R1bGU6OmdldE5hbWVkTWV0YWRhdGEoKQorICovCit1bnNpZ25lZCBMTFZNR2V0TmFtZWRNZXRhZGF0YU51bU9wZXJhbmRzKExMVk1Nb2R1bGVSZWYgTSwgY29uc3QgY2hhciAqTmFtZSk7CisKKy8qKgorICogT2J0YWluIHRoZSBuYW1lZCBtZXRhZGF0YSBvcGVyYW5kcyBmb3IgYSBtb2R1bGUuCisgKgorICogVGhlIHBhc3NlZCBMTFZNVmFsdWVSZWYgcG9pbnRlciBzaG91bGQgcmVmZXIgdG8gYW4gYXJyYXkgb2YKKyAqIExMVk1WYWx1ZVJlZiBhdCBsZWFzdCBMTFZNR2V0TmFtZWRNZXRhZGF0YU51bU9wZXJhbmRzIGxvbmcuIFRoaXMKKyAqIGFycmF5IHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggdGhlIExMVk1WYWx1ZVJlZiBpbnN0YW5jZXMuIEVhY2gKKyAqIGluc3RhbmNlIGNvcnJlc3BvbmRzIHRvIGEgbGx2bTo6TUROb2RlLgorICoKKyAqIEBzZWUgbGx2bTo6TW9kdWxlOjpnZXROYW1lZE1ldGFkYXRhKCkKKyAqIEBzZWUgbGx2bTo6TUROb2RlOjpnZXRPcGVyYW5kKCkKKyAqLwordm9pZCBMTFZNR2V0TmFtZWRNZXRhZGF0YU9wZXJhbmRzKExMVk1Nb2R1bGVSZWYgTSwgY29uc3QgY2hhciAqTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgKkRlc3QpOworCisvKioKKyAqIEFkZCBhbiBvcGVyYW5kIHRvIG5hbWVkIG1ldGFkYXRhLgorICoKKyAqIEBzZWUgbGx2bTo6TW9kdWxlOjpnZXROYW1lZE1ldGFkYXRhKCkKKyAqIEBzZWUgbGx2bTo6TUROb2RlOjphZGRPcGVyYW5kKCkKKyAqLwordm9pZCBMTFZNQWRkTmFtZWRNZXRhZGF0YU9wZXJhbmQoTExWTU1vZHVsZVJlZiBNLCBjb25zdCBjaGFyICpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIFZhbCk7CisKKy8qKgorICogQWRkIGEgZnVuY3Rpb24gdG8gYSBtb2R1bGUgdW5kZXIgYSBzcGVjaWZpZWQgbmFtZS4KKyAqCisgKiBAc2VlIGxsdm06OkZ1bmN0aW9uOjpDcmVhdGUoKQorICovCitMTFZNVmFsdWVSZWYgTExWTUFkZEZ1bmN0aW9uKExMVk1Nb2R1bGVSZWYgTSwgY29uc3QgY2hhciAqTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRnVuY3Rpb25UeSk7CisKKy8qKgorICogT2J0YWluIGEgRnVuY3Rpb24gdmFsdWUgZnJvbSBhIE1vZHVsZSBieSBpdHMgbmFtZS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgY29ycmVzcG9uZHMgdG8gYSBsbHZtOjpGdW5jdGlvbiB2YWx1ZS4KKyAqCisgKiBAc2VlIGxsdm06Ok1vZHVsZTo6Z2V0RnVuY3Rpb24oKQorICovCitMTFZNVmFsdWVSZWYgTExWTUdldE5hbWVkRnVuY3Rpb24oTExWTU1vZHVsZVJlZiBNLCBjb25zdCBjaGFyICpOYW1lKTsKKworLyoqCisgKiBPYnRhaW4gYW4gaXRlcmF0b3IgdG8gdGhlIGZpcnN0IEZ1bmN0aW9uIGluIGEgTW9kdWxlLgorICoKKyAqIEBzZWUgbGx2bTo6TW9kdWxlOjpiZWdpbigpCisgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNR2V0Rmlyc3RGdW5jdGlvbihMTFZNTW9kdWxlUmVmIE0pOworCisvKioKKyAqIE9idGFpbiBhbiBpdGVyYXRvciB0byB0aGUgbGFzdCBGdW5jdGlvbiBpbiBhIE1vZHVsZS4KKyAqCisgKiBAc2VlIGxsdm06Ok1vZHVsZTo6ZW5kKCkKKyAqLworTExWTVZhbHVlUmVmIExMVk1HZXRMYXN0RnVuY3Rpb24oTExWTU1vZHVsZVJlZiBNKTsKKworLyoqCisgKiBBZHZhbmNlIGEgRnVuY3Rpb24gaXRlcmF0b3IgdG8gdGhlIG5leHQgRnVuY3Rpb24uCisgKgorICogUmV0dXJucyBOVUxMIGlmIHRoZSBpdGVyYXRvciB3YXMgYWxyZWFkeSBhdCB0aGUgZW5kIGFuZCB0aGVyZSBhcmUgbm8gbW9yZQorICogZnVuY3Rpb25zLgorICovCitMTFZNVmFsdWVSZWYgTExWTUdldE5leHRGdW5jdGlvbihMTFZNVmFsdWVSZWYgRm4pOworCisvKioKKyAqIERlY3JlbWVudCBhIEZ1bmN0aW9uIGl0ZXJhdG9yIHRvIHRoZSBwcmV2aW91cyBGdW5jdGlvbi4KKyAqCisgKiBSZXR1cm5zIE5VTEwgaWYgdGhlIGl0ZXJhdG9yIHdhcyBhbHJlYWR5IGF0IHRoZSBiZWdpbm5pbmcgYW5kIHRoZXJlIGFyZQorICogbm8gcHJldmlvdXMgZnVuY3Rpb25zLgorICovCitMTFZNVmFsdWVSZWYgTExWTUdldFByZXZpb3VzRnVuY3Rpb24oTExWTVZhbHVlUmVmIEZuKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIExMVk1DQ29yZVR5cGUgVHlwZXMKKyAqCisgKiBUeXBlcyByZXByZXNlbnQgdGhlIHR5cGUgb2YgYSB2YWx1ZS4KKyAqCisgKiBUeXBlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgY29udGV4dCBpbnN0YW5jZS4gVGhlIGNvbnRleHQgaW50ZXJuYWxseQorICogZGVkdXBsaWNhdGVzIHR5cGVzIHNvIHRoZXJlIGlzIG9ubHkgMSBpbnN0YW5jZSBvZiBhIHNwZWNpZmljIHR5cGUKKyAqIGFsaXZlIGF0IGEgdGltZS4gSW4gb3RoZXIgd29yZHMsIGEgdW5pcXVlIHR5cGUgaXMgc2hhcmVkIGFtb25nIGFsbAorICogY29uc3VtZXJzIHdpdGhpbiBhIGNvbnRleHQuCisgKgorICogQSBUeXBlIGluIHRoZSBDIEFQSSBjb3JyZXNwb25kcyB0byBsbHZtOjpUeXBlLgorICoKKyAqIFR5cGVzIGhhdmUgdGhlIGZvbGxvd2luZyBoaWVyYXJjaHk6CisgKgorICogICB0eXBlczoKKyAqICAgICBpbnRlZ2VyIHR5cGUKKyAqICAgICByZWFsIHR5cGUKKyAqICAgICBmdW5jdGlvbiB0eXBlCisgKiAgICAgc2VxdWVuY2UgdHlwZXM6CisgKiAgICAgICBhcnJheSB0eXBlCisgKiAgICAgICBwb2ludGVyIHR5cGUKKyAqICAgICAgIHZlY3RvciB0eXBlCisgKiAgICAgdm9pZCB0eXBlCisgKiAgICAgbGFiZWwgdHlwZQorICogICAgIG9wYXF1ZSB0eXBlCisgKgorICogQHsKKyAqLworCisvKioKKyAqIE9idGFpbiB0aGUgZW51bWVyYXRlZCB0eXBlIG9mIGEgVHlwZSBpbnN0YW5jZS4KKyAqCisgKiBAc2VlIGxsdm06OlR5cGU6Z2V0VHlwZUlEKCkKKyAqLworTExWTVR5cGVLaW5kIExMVk1HZXRUeXBlS2luZChMTFZNVHlwZVJlZiBUeSk7CisKKy8qKgorICogV2hldGhlciB0aGUgdHlwZSBoYXMgYSBrbm93biBzaXplLgorICoKKyAqIFRoaW5ncyB0aGF0IGRvbid0IGhhdmUgYSBzaXplIGFyZSBhYnN0cmFjdCB0eXBlcywgbGFiZWxzLCBhbmQgdm9pZC5hCisgKgorICogQHNlZSBsbHZtOjpUeXBlOjppc1NpemVkKCkKKyAqLworTExWTUJvb2wgTExWTVR5cGVJc1NpemVkKExMVk1UeXBlUmVmIFR5KTsKKworLyoqCisgKiBPYnRhaW4gdGhlIGNvbnRleHQgdG8gd2hpY2ggdGhpcyB0eXBlIGluc3RhbmNlIGlzIGFzc29jaWF0ZWQuCisgKgorICogQHNlZSBsbHZtOjpUeXBlOjpnZXRDb250ZXh0KCkKKyAqLworTExWTUNvbnRleHRSZWYgTExWTUdldFR5cGVDb250ZXh0KExMVk1UeXBlUmVmIFR5KTsKKworLyoqCisgKiBEdW1wIGEgcmVwcmVzZW50YXRpb24gb2YgYSB0eXBlIHRvIHN0ZGVyci4KKyAqCisgKiBAc2VlIGxsdm06OlR5cGU6OmR1bXAoKQorICovCit2b2lkIExMVk1EdW1wVHlwZShMTFZNVHlwZVJlZiBWYWwpOworCisvKioKKyAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZS4gVXNlCisgKiBMTFZNRGlzcG9zZU1lc3NhZ2UgdG8gZnJlZSB0aGUgc3RyaW5nLgorICoKKyAqIEBzZWUgbGx2bTo6VHlwZTo6cHJpbnQoKQorICovCitjaGFyICpMTFZNUHJpbnRUeXBlVG9TdHJpbmcoTExWTVR5cGVSZWYgVmFsKTsKKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNDb3JlVHlwZUludCBJbnRlZ2VyIFR5cGVzCisgKgorICogRnVuY3Rpb25zIGluIHRoaXMgc2VjdGlvbiBvcGVyYXRlIG9uIGludGVnZXIgdHlwZXMuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIE9idGFpbiBhbiBpbnRlZ2VyIHR5cGUgZnJvbSBhIGNvbnRleHQgd2l0aCBzcGVjaWZpZWQgYml0IHdpZHRoLgorICovCitMTFZNVHlwZVJlZiBMTFZNSW50MVR5cGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQyk7CitMTFZNVHlwZVJlZiBMTFZNSW50OFR5cGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQyk7CitMTFZNVHlwZVJlZiBMTFZNSW50MTZUeXBlSW5Db250ZXh0KExMVk1Db250ZXh0UmVmIEMpOworTExWTVR5cGVSZWYgTExWTUludDMyVHlwZUluQ29udGV4dChMTFZNQ29udGV4dFJlZiBDKTsKK0xMVk1UeXBlUmVmIExMVk1JbnQ2NFR5cGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQyk7CitMTFZNVHlwZVJlZiBMTFZNSW50MTI4VHlwZUluQ29udGV4dChMTFZNQ29udGV4dFJlZiBDKTsKK0xMVk1UeXBlUmVmIExMVk1JbnRUeXBlSW5Db250ZXh0KExMVk1Db250ZXh0UmVmIEMsIHVuc2lnbmVkIE51bUJpdHMpOworCisvKioKKyAqIE9idGFpbiBhbiBpbnRlZ2VyIHR5cGUgZnJvbSB0aGUgZ2xvYmFsIGNvbnRleHQgd2l0aCBhIHNwZWNpZmllZCBiaXQKKyAqIHdpZHRoLgorICovCitMTFZNVHlwZVJlZiBMTFZNSW50MVR5cGUodm9pZCk7CitMTFZNVHlwZVJlZiBMTFZNSW50OFR5cGUodm9pZCk7CitMTFZNVHlwZVJlZiBMTFZNSW50MTZUeXBlKHZvaWQpOworTExWTVR5cGVSZWYgTExWTUludDMyVHlwZSh2b2lkKTsKK0xMVk1UeXBlUmVmIExMVk1JbnQ2NFR5cGUodm9pZCk7CitMTFZNVHlwZVJlZiBMTFZNSW50MTI4VHlwZSh2b2lkKTsKK0xMVk1UeXBlUmVmIExMVk1JbnRUeXBlKHVuc2lnbmVkIE51bUJpdHMpOwordW5zaWduZWQgTExWTUdldEludFR5cGVXaWR0aChMTFZNVHlwZVJlZiBJbnRlZ2VyVHkpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNDb3JlVHlwZUZsb2F0IEZsb2F0aW5nIFBvaW50IFR5cGVzCisgKgorICogQHsKKyAqLworCisvKioKKyAqIE9idGFpbiBhIDE2LWJpdCBmbG9hdGluZyBwb2ludCB0eXBlIGZyb20gYSBjb250ZXh0LgorICovCitMTFZNVHlwZVJlZiBMTFZNSGFsZlR5cGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQyk7CisKKy8qKgorICogT2J0YWluIGEgMzItYml0IGZsb2F0aW5nIHBvaW50IHR5cGUgZnJvbSBhIGNvbnRleHQuCisgKi8KK0xMVk1UeXBlUmVmIExMVk1GbG9hdFR5cGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQyk7CisKKy8qKgorICogT2J0YWluIGEgNjQtYml0IGZsb2F0aW5nIHBvaW50IHR5cGUgZnJvbSBhIGNvbnRleHQuCisgKi8KK0xMVk1UeXBlUmVmIExMVk1Eb3VibGVUeXBlSW5Db250ZXh0KExMVk1Db250ZXh0UmVmIEMpOworCisvKioKKyAqIE9idGFpbiBhIDgwLWJpdCBmbG9hdGluZyBwb2ludCB0eXBlIChYODcpIGZyb20gYSBjb250ZXh0LgorICovCitMTFZNVHlwZVJlZiBMTFZNWDg2RlA4MFR5cGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQyk7CisKKy8qKgorICogT2J0YWluIGEgMTI4LWJpdCBmbG9hdGluZyBwb2ludCB0eXBlICgxMTItYml0IG1hbnRpc3NhKSBmcm9tIGEKKyAqIGNvbnRleHQuCisgKi8KK0xMVk1UeXBlUmVmIExMVk1GUDEyOFR5cGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQyk7CisKKy8qKgorICogT2J0YWluIGEgMTI4LWJpdCBmbG9hdGluZyBwb2ludCB0eXBlICh0d28gNjQtYml0cykgZnJvbSBhIGNvbnRleHQuCisgKi8KK0xMVk1UeXBlUmVmIExMVk1QUENGUDEyOFR5cGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQyk7CisKKy8qKgorICogT2J0YWluIGEgZmxvYXRpbmcgcG9pbnQgdHlwZSBmcm9tIHRoZSBnbG9iYWwgY29udGV4dC4KKyAqCisgKiBUaGVzZSBtYXAgdG8gdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGdyb3VwIG9mIHRoZSBzYW1lIG5hbWUuCisgKi8KK0xMVk1UeXBlUmVmIExMVk1IYWxmVHlwZSh2b2lkKTsKK0xMVk1UeXBlUmVmIExMVk1GbG9hdFR5cGUodm9pZCk7CitMTFZNVHlwZVJlZiBMTFZNRG91YmxlVHlwZSh2b2lkKTsKK0xMVk1UeXBlUmVmIExMVk1YODZGUDgwVHlwZSh2b2lkKTsKK0xMVk1UeXBlUmVmIExMVk1GUDEyOFR5cGUodm9pZCk7CitMTFZNVHlwZVJlZiBMTFZNUFBDRlAxMjhUeXBlKHZvaWQpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNDb3JlVHlwZUZ1bmN0aW9uIEZ1bmN0aW9uIFR5cGVzCisgKgorICogQHsKKyAqLworCisvKioKKyAqIE9idGFpbiBhIGZ1bmN0aW9uIHR5cGUgY29uc2lzdGluZyBvZiBhIHNwZWNpZmllZCBzaWduYXR1cmUuCisgKgorICogVGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQgYXMgYSB0dXBsZSBvZiBhIHJldHVybiBUeXBlLCBhIGxpc3Qgb2YKKyAqIHBhcmFtZXRlciB0eXBlcywgYW5kIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGlzIHZhcmlhZGljLgorICovCitMTFZNVHlwZVJlZiBMTFZNRnVuY3Rpb25UeXBlKExMVk1UeXBlUmVmIFJldHVyblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1UeXBlUmVmICpQYXJhbVR5cGVzLCB1bnNpZ25lZCBQYXJhbUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQm9vbCBJc1ZhckFyZyk7CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIGEgZnVuY3Rpb24gdHlwZSBpcyB2YXJpYWRpYy4KKyAqLworTExWTUJvb2wgTExWTUlzRnVuY3Rpb25WYXJBcmcoTExWTVR5cGVSZWYgRnVuY3Rpb25UeSk7CisKKy8qKgorICogT2J0YWluIHRoZSBUeXBlIHRoaXMgZnVuY3Rpb24gVHlwZSByZXR1cm5zLgorICovCitMTFZNVHlwZVJlZiBMTFZNR2V0UmV0dXJuVHlwZShMTFZNVHlwZVJlZiBGdW5jdGlvblR5KTsKKworLyoqCisgKiBPYnRhaW4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIHRoaXMgZnVuY3Rpb24gYWNjZXB0cy4KKyAqLwordW5zaWduZWQgTExWTUNvdW50UGFyYW1UeXBlcyhMTFZNVHlwZVJlZiBGdW5jdGlvblR5KTsKKworLyoqCisgKiBPYnRhaW4gdGhlIHR5cGVzIG9mIGEgZnVuY3Rpb24ncyBwYXJhbWV0ZXJzLgorICoKKyAqIFRoZSBEZXN0IHBhcmFtZXRlciBzaG91bGQgcG9pbnQgdG8gYSBwcmUtYWxsb2NhdGVkIGFycmF5IG9mCisgKiBMTFZNVHlwZVJlZiBhdCBsZWFzdCBMTFZNQ291bnRQYXJhbVR5cGVzKCkgbGFyZ2UuIE9uIHJldHVybiwgdGhlCisgKiBmaXJzdCBMTFZNQ291bnRQYXJhbVR5cGVzKCkgZW50cmllcyBpbiB0aGUgYXJyYXkgd2lsbCBiZSBwb3B1bGF0ZWQKKyAqIHdpdGggTExWTVR5cGVSZWYgaW5zdGFuY2VzLgorICoKKyAqIEBwYXJhbSBGdW5jdGlvblR5IFRoZSBmdW5jdGlvbiB0eXBlIHRvIG9wZXJhdGUgb24uCisgKiBAcGFyYW0gRGVzdCBNZW1vcnkgYWRkcmVzcyBvZiBhbiBhcnJheSB0byBiZSBmaWxsZWQgd2l0aCByZXN1bHQuCisgKi8KK3ZvaWQgTExWTUdldFBhcmFtVHlwZXMoTExWTVR5cGVSZWYgRnVuY3Rpb25UeSwgTExWTVR5cGVSZWYgKkRlc3QpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNDb3JlVHlwZVN0cnVjdCBTdHJ1Y3R1cmUgVHlwZXMKKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgcmVsYXRlIHRvIExMVk1UeXBlUmVmIGluc3RhbmNlcy4KKyAqCisgKiBAc2VlIGxsdm06OlN0cnVjdFR5cGUKKyAqCisgKiBAeworICovCisKKy8qKgorICogQ3JlYXRlIGEgbmV3IHN0cnVjdHVyZSB0eXBlIGluIGEgY29udGV4dC4KKyAqCisgKiBBIHN0cnVjdHVyZSBpcyBzcGVjaWZpZWQgYnkgYSBsaXN0IG9mIGlubmVyIGVsZW1lbnRzL3R5cGVzIGFuZAorICogd2hldGhlciB0aGVzZSBjYW4gYmUgcGFja2VkIHRvZ2V0aGVyLgorICoKKyAqIEBzZWUgbGx2bTo6U3RydWN0VHlwZTo6Y3JlYXRlKCkKKyAqLworTExWTVR5cGVSZWYgTExWTVN0cnVjdFR5cGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQywgTExWTVR5cGVSZWYgKkVsZW1lbnRUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEVsZW1lbnRDb3VudCwgTExWTUJvb2wgUGFja2VkKTsKKworLyoqCisgKiBDcmVhdGUgYSBuZXcgc3RydWN0dXJlIHR5cGUgaW4gdGhlIGdsb2JhbCBjb250ZXh0LgorICoKKyAqIEBzZWUgbGx2bTo6U3RydWN0VHlwZTo6Y3JlYXRlKCkKKyAqLworTExWTVR5cGVSZWYgTExWTVN0cnVjdFR5cGUoTExWTVR5cGVSZWYgKkVsZW1lbnRUeXBlcywgdW5zaWduZWQgRWxlbWVudENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUJvb2wgUGFja2VkKTsKKworLyoqCisgKiBDcmVhdGUgYW4gZW1wdHkgc3RydWN0dXJlIGluIGEgY29udGV4dCBoYXZpbmcgYSBzcGVjaWZpZWQgbmFtZS4KKyAqCisgKiBAc2VlIGxsdm06OlN0cnVjdFR5cGU6OmNyZWF0ZSgpCisgKi8KK0xMVk1UeXBlUmVmIExMVk1TdHJ1Y3RDcmVhdGVOYW1lZChMTFZNQ29udGV4dFJlZiBDLCBjb25zdCBjaGFyICpOYW1lKTsKKworLyoqCisgKiBPYnRhaW4gdGhlIG5hbWUgb2YgYSBzdHJ1Y3R1cmUuCisgKgorICogQHNlZSBsbHZtOjpTdHJ1Y3RUeXBlOjpnZXROYW1lKCkKKyAqLworY29uc3QgY2hhciAqTExWTUdldFN0cnVjdE5hbWUoTExWTVR5cGVSZWYgVHkpOworCisvKioKKyAqIFNldCB0aGUgY29udGVudHMgb2YgYSBzdHJ1Y3R1cmUgdHlwZS4KKyAqCisgKiBAc2VlIGxsdm06OlN0cnVjdFR5cGU6OnNldEJvZHkoKQorICovCit2b2lkIExMVk1TdHJ1Y3RTZXRCb2R5KExMVk1UeXBlUmVmIFN0cnVjdFR5LCBMTFZNVHlwZVJlZiAqRWxlbWVudFR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFbGVtZW50Q291bnQsIExMVk1Cb29sIFBhY2tlZCk7CisKKy8qKgorICogR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZGVmaW5lZCBpbnNpZGUgdGhlIHN0cnVjdHVyZS4KKyAqCisgKiBAc2VlIGxsdm06OlN0cnVjdFR5cGU6OmdldE51bUVsZW1lbnRzKCkKKyAqLwordW5zaWduZWQgTExWTUNvdW50U3RydWN0RWxlbWVudFR5cGVzKExMVk1UeXBlUmVmIFN0cnVjdFR5KTsKKworLyoqCisgKiBHZXQgdGhlIGVsZW1lbnRzIHdpdGhpbiBhIHN0cnVjdHVyZS4KKyAqCisgKiBUaGUgZnVuY3Rpb24gaXMgcGFzc2VkIHRoZSBhZGRyZXNzIG9mIGEgcHJlLWFsbG9jYXRlZCBhcnJheSBvZgorICogTExWTVR5cGVSZWYgYXQgbGVhc3QgTExWTUNvdW50U3RydWN0RWxlbWVudFR5cGVzKCkgbG9uZy4gQWZ0ZXIKKyAqIGludm9jYXRpb24sIHRoaXMgYXJyYXkgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgc3RydWN0dXJlJ3MKKyAqIGVsZW1lbnRzLiBUaGUgb2JqZWN0cyBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2lsbCBoYXZlIGEgbGlmZXRpbWUKKyAqIG9mIHRoZSBzdHJ1Y3R1cmUgdHlwZSBpdHNlbGYsIHdoaWNoIGlzIHRoZSBsaWZldGltZSBvZiB0aGUgY29udGV4dCBpdAorICogaXMgY29udGFpbmVkIGluLgorICovCit2b2lkIExMVk1HZXRTdHJ1Y3RFbGVtZW50VHlwZXMoTExWTVR5cGVSZWYgU3RydWN0VHksIExMVk1UeXBlUmVmICpEZXN0KTsKKworLyoqCisgKiBHZXQgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQgYXQgYSBnaXZlbiBpbmRleCBpbiB0aGUgc3RydWN0dXJlLgorICoKKyAqIEBzZWUgbGx2bTo6U3RydWN0VHlwZTo6Z2V0VHlwZUF0SW5kZXgoKQorICovCitMTFZNVHlwZVJlZiBMTFZNU3RydWN0R2V0VHlwZUF0SW5kZXgoTExWTVR5cGVSZWYgU3RydWN0VHksIHVuc2lnbmVkIGkpOworCisvKioKKyAqIERldGVybWluZSB3aGV0aGVyIGEgc3RydWN0dXJlIGlzIHBhY2tlZC4KKyAqCisgKiBAc2VlIGxsdm06OlN0cnVjdFR5cGU6OmlzUGFja2VkKCkKKyAqLworTExWTUJvb2wgTExWTUlzUGFja2VkU3RydWN0KExMVk1UeXBlUmVmIFN0cnVjdFR5KTsKKworLyoqCisgKiBEZXRlcm1pbmUgd2hldGhlciBhIHN0cnVjdHVyZSBpcyBvcGFxdWUuCisgKgorICogQHNlZSBsbHZtOjpTdHJ1Y3RUeXBlOjppc09wYXF1ZSgpCisgKi8KK0xMVk1Cb29sIExMVk1Jc09wYXF1ZVN0cnVjdChMTFZNVHlwZVJlZiBTdHJ1Y3RUeSk7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ0NvcmVUeXBlU2VxdWVudGlhbCBTZXF1ZW50aWFsIFR5cGVzCisgKgorICogU2VxdWVudGlhbCB0eXBlcyByZXByZXNlbnRzICJhcnJheXMiIG9mIHR5cGVzLiBUaGlzIGlzIGEgc3VwZXIgY2xhc3MKKyAqIGZvciBhcnJheSwgdmVjdG9yLCBhbmQgcG9pbnRlciB0eXBlcy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogT2J0YWluIHRoZSB0eXBlIG9mIGVsZW1lbnRzIHdpdGhpbiBhIHNlcXVlbnRpYWwgdHlwZS4KKyAqCisgKiBUaGlzIHdvcmtzIG9uIGFycmF5LCB2ZWN0b3IsIGFuZCBwb2ludGVyIHR5cGVzLgorICoKKyAqIEBzZWUgbGx2bTo6U2VxdWVudGlhbFR5cGU6OmdldEVsZW1lbnRUeXBlKCkKKyAqLworTExWTVR5cGVSZWYgTExWTUdldEVsZW1lbnRUeXBlKExMVk1UeXBlUmVmIFR5KTsKKworLyoqCisgKiBSZXR1cm5zIHR5cGUncyBzdWJ0eXBlcworICoKKyAqIEBzZWUgbGx2bTo6VHlwZTo6c3VidHlwZXMoKQorICovCit2b2lkIExMVk1HZXRTdWJ0eXBlcyhMTFZNVHlwZVJlZiBUcCwgTExWTVR5cGVSZWYgKkFycik7CisKKy8qKgorICogIFJldHVybiB0aGUgbnVtYmVyIG9mIHR5cGVzIGluIHRoZSBkZXJpdmVkIHR5cGUuCisgKgorICogQHNlZSBsbHZtOjpUeXBlOjpnZXROdW1Db250YWluZWRUeXBlcygpCisgKi8KK3Vuc2lnbmVkIExMVk1HZXROdW1Db250YWluZWRUeXBlcyhMTFZNVHlwZVJlZiBUcCk7CisKKy8qKgorICogQ3JlYXRlIGEgZml4ZWQgc2l6ZSBhcnJheSB0eXBlIHRoYXQgcmVmZXJzIHRvIGEgc3BlY2lmaWMgdHlwZS4KKyAqCisgKiBUaGUgY3JlYXRlZCB0eXBlIHdpbGwgZXhpc3QgaW4gdGhlIGNvbnRleHQgdGhhdCBpdHMgZWxlbWVudCB0eXBlCisgKiBleGlzdHMgaW4uCisgKgorICogQHNlZSBsbHZtOjpBcnJheVR5cGU6OmdldCgpCisgKi8KK0xMVk1UeXBlUmVmIExMVk1BcnJheVR5cGUoTExWTVR5cGVSZWYgRWxlbWVudFR5cGUsIHVuc2lnbmVkIEVsZW1lbnRDb3VudCk7CisKKy8qKgorICogT2J0YWluIHRoZSBsZW5ndGggb2YgYW4gYXJyYXkgdHlwZS4KKyAqCisgKiBUaGlzIG9ubHkgd29ya3Mgb24gdHlwZXMgdGhhdCByZXByZXNlbnQgYXJyYXlzLgorICoKKyAqIEBzZWUgbGx2bTo6QXJyYXlUeXBlOjpnZXROdW1FbGVtZW50cygpCisgKi8KK3Vuc2lnbmVkIExMVk1HZXRBcnJheUxlbmd0aChMTFZNVHlwZVJlZiBBcnJheVR5KTsKKworLyoqCisgKiBDcmVhdGUgYSBwb2ludGVyIHR5cGUgdGhhdCBwb2ludHMgdG8gYSBkZWZpbmVkIHR5cGUuCisgKgorICogVGhlIGNyZWF0ZWQgdHlwZSB3aWxsIGV4aXN0IGluIHRoZSBjb250ZXh0IHRoYXQgaXRzIHBvaW50ZWUgdHlwZQorICogZXhpc3RzIGluLgorICoKKyAqIEBzZWUgbGx2bTo6UG9pbnRlclR5cGU6OmdldCgpCisgKi8KK0xMVk1UeXBlUmVmIExMVk1Qb2ludGVyVHlwZShMTFZNVHlwZVJlZiBFbGVtZW50VHlwZSwgdW5zaWduZWQgQWRkcmVzc1NwYWNlKTsKKworLyoqCisgKiBPYnRhaW4gdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgYSBwb2ludGVyIHR5cGUuCisgKgorICogVGhpcyBvbmx5IHdvcmtzIG9uIHR5cGVzIHRoYXQgcmVwcmVzZW50IHBvaW50ZXJzLgorICoKKyAqIEBzZWUgbGx2bTo6UG9pbnRlclR5cGU6OmdldEFkZHJlc3NTcGFjZSgpCisgKi8KK3Vuc2lnbmVkIExMVk1HZXRQb2ludGVyQWRkcmVzc1NwYWNlKExMVk1UeXBlUmVmIFBvaW50ZXJUeSk7CisKKy8qKgorICogQ3JlYXRlIGEgdmVjdG9yIHR5cGUgdGhhdCBjb250YWlucyBhIGRlZmluZWQgdHlwZSBhbmQgaGFzIGEgc3BlY2lmaWMKKyAqIG51bWJlciBvZiBlbGVtZW50cy4KKyAqCisgKiBUaGUgY3JlYXRlZCB0eXBlIHdpbGwgZXhpc3QgaW4gdGhlIGNvbnRleHQgdGhhdHMgaXRzIGVsZW1lbnQgdHlwZQorICogZXhpc3RzIGluLgorICoKKyAqIEBzZWUgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KCkKKyAqLworTExWTVR5cGVSZWYgTExWTVZlY3RvclR5cGUoTExWTVR5cGVSZWYgRWxlbWVudFR5cGUsIHVuc2lnbmVkIEVsZW1lbnRDb3VudCk7CisKKy8qKgorICogT2J0YWluIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSB2ZWN0b3IgdHlwZS4KKyAqCisgKiBUaGlzIG9ubHkgd29ya3Mgb24gdHlwZXMgdGhhdCByZXByZXNlbnQgdmVjdG9ycy4KKyAqCisgKiBAc2VlIGxsdm06OlZlY3RvclR5cGU6OmdldE51bUVsZW1lbnRzKCkKKyAqLwordW5zaWduZWQgTExWTUdldFZlY3RvclNpemUoTExWTVR5cGVSZWYgVmVjdG9yVHkpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNDb3JlVHlwZU90aGVyIE90aGVyIFR5cGVzCisgKgorICogQHsKKyAqLworCisvKioKKyAqIENyZWF0ZSBhIHZvaWQgdHlwZSBpbiBhIGNvbnRleHQuCisgKi8KK0xMVk1UeXBlUmVmIExMVk1Wb2lkVHlwZUluQ29udGV4dChMTFZNQ29udGV4dFJlZiBDKTsKKworLyoqCisgKiBDcmVhdGUgYSBsYWJlbCB0eXBlIGluIGEgY29udGV4dC4KKyAqLworTExWTVR5cGVSZWYgTExWTUxhYmVsVHlwZUluQ29udGV4dChMTFZNQ29udGV4dFJlZiBDKTsKKworLyoqCisgKiBDcmVhdGUgYSBYODYgTU1YIHR5cGUgaW4gYSBjb250ZXh0LgorICovCitMTFZNVHlwZVJlZiBMTFZNWDg2TU1YVHlwZUluQ29udGV4dChMTFZNQ29udGV4dFJlZiBDKTsKKworLyoqCisgKiBDcmVhdGUgYSB0b2tlbiB0eXBlIGluIGEgY29udGV4dC4KKyAqLworTExWTVR5cGVSZWYgTExWTVRva2VuVHlwZUluQ29udGV4dChMTFZNQ29udGV4dFJlZiBDKTsKKworLyoqCisgKiBDcmVhdGUgYSBtZXRhZGF0YSB0eXBlIGluIGEgY29udGV4dC4KKyAqLworTExWTVR5cGVSZWYgTExWTU1ldGFkYXRhVHlwZUluQ29udGV4dChMTFZNQ29udGV4dFJlZiBDKTsKKworLyoqCisgKiBUaGVzZSBhcmUgc2ltaWxhciB0byB0aGUgYWJvdmUgZnVuY3Rpb25zIGV4Y2VwdCB0aGV5IG9wZXJhdGUgb24gdGhlCisgKiBnbG9iYWwgY29udGV4dC4KKyAqLworTExWTVR5cGVSZWYgTExWTVZvaWRUeXBlKHZvaWQpOworTExWTVR5cGVSZWYgTExWTUxhYmVsVHlwZSh2b2lkKTsKK0xMVk1UeXBlUmVmIExMVk1YODZNTVhUeXBlKHZvaWQpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIExMVk1DQ29yZVZhbHVlcyBWYWx1ZXMKKyAqCisgKiBUaGUgYnVsayBvZiBMTFZNJ3Mgb2JqZWN0IG1vZGVsIGNvbnNpc3RzIG9mIHZhbHVlcywgd2hpY2ggY29tcHJpc2UgYSB2ZXJ5CisgKiByaWNoIHR5cGUgaGllcmFyY2h5LgorICoKKyAqIExMVk1WYWx1ZVJlZiBlc3NlbnRpYWxseSByZXByZXNlbnRzIGxsdm06OlZhbHVlLiBUaGVyZSBpcyBhIHJpY2gKKyAqIGhpZXJhcmNoeSBvZiBjbGFzc2VzIHdpdGhpbiB0aGlzIHR5cGUuIERlcGVuZGluZyBvbiB0aGUgaW5zdGFuY2UKKyAqIG9idGFpbmVkLCBub3QgYWxsIEFQSXMgYXJlIGF2YWlsYWJsZS4KKyAqCisgKiBDYWxsZXJzIGNhbiBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgYW4gTExWTVZhbHVlUmVmIGJ5IGNhbGxpbmcgdGhlCisgKiBMTFZNSXNBKiBmYW1pbHkgb2YgZnVuY3Rpb25zIChlLmcuIExMVk1Jc0FBcmd1bWVudCgpKS4gVGhlc2UKKyAqIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBieSBhIG1hY3JvLCBzbyBpdCBpc24ndCBvYnZpb3VzIHdoaWNoIGFyZQorICogYXZhaWxhYmxlIGJ5IGxvb2tpbmcgYXQgdGhlIERveHlnZW4gc291cmNlIGNvZGUuIEluc3RlYWQsIGxvb2sgYXQgdGhlCisgKiBzb3VyY2UgZGVmaW5pdGlvbiBvZiBMTFZNX0ZPUl9FQUNIX1ZBTFVFX1NVQkNMQVNTIGFuZCBub3RlIHRoZSBsaXN0CisgKiBvZiB2YWx1ZSBuYW1lcyBnaXZlbi4gVGhlc2UgdmFsdWUgbmFtZXMgYWxzbyBjb3JyZXNwb25kIHRvIGNsYXNzZXMgaW4KKyAqIHRoZSBsbHZtOjpWYWx1ZSBoaWVyYXJjaHkuCisgKgorICogQHsKKyAqLworCisjZGVmaW5lIExMVk1fRk9SX0VBQ0hfVkFMVUVfU1VCQ0xBU1MobWFjcm8pIFwKKyAgbWFjcm8oQXJndW1lbnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtYWNybyhCYXNpY0Jsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1hY3JvKElubGluZUFzbSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWFjcm8oVXNlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvKENvbnN0YW50KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhCbG9ja0FkZHJlc3MpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKENvbnN0YW50QWdncmVnYXRlWmVybykgICAgICAgICAgXAorICAgICAgbWFjcm8oQ29uc3RhbnRBcnJheSkgICAgICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhDb25zdGFudERhdGFTZXF1ZW50aWFsKSAgICAgICAgIFwKKyAgICAgICAgbWFjcm8oQ29uc3RhbnREYXRhQXJyYXkpICAgICAgICAgICAgXAorICAgICAgICBtYWNybyhDb25zdGFudERhdGFWZWN0b3IpICAgICAgICAgICBcCisgICAgICBtYWNybyhDb25zdGFudEV4cHIpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKENvbnN0YW50RlApICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWFjcm8oQ29uc3RhbnRJbnQpICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhDb25zdGFudFBvaW50ZXJOdWxsKSAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKENvbnN0YW50U3RydWN0KSAgICAgICAgICAgICAgICAgXAorICAgICAgbWFjcm8oQ29uc3RhbnRUb2tlbk5vbmUpICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhDb25zdGFudFZlY3RvcikgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKEdsb2JhbFZhbHVlKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtYWNybyhHbG9iYWxBbGlhcykgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1hY3JvKEdsb2JhbE9iamVjdCkgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBtYWNybyhGdW5jdGlvbikgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG1hY3JvKEdsb2JhbFZhcmlhYmxlKSAgICAgICAgICAgICBcCisgICAgICBtYWNybyhVbmRlZlZhbHVlKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhJbnN0cnVjdGlvbikgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWFjcm8oQmluYXJ5T3BlcmF0b3IpICAgICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhDYWxsSW5zdCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWFjcm8oSW50cmluc2ljSW5zdCkgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG1hY3JvKERiZ0luZm9JbnRyaW5zaWMpICAgICAgICAgICBcCisgICAgICAgICAgICBtYWNybyhEYmdEZWNsYXJlSW5zdCkgICAgICAgICAgIFwKKyAgICAgICAgICBtYWNybyhNZW1JbnRyaW5zaWMpICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbWFjcm8oTWVtQ3B5SW5zdCkgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtYWNybyhNZW1Nb3ZlSW5zdCkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1hY3JvKE1lbVNldEluc3QpICAgICAgICAgICAgICAgXAorICAgICAgbWFjcm8oQ21wSW5zdCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1hY3JvKEZDbXBJbnN0KSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWFjcm8oSUNtcEluc3QpICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWFjcm8oRXh0cmFjdEVsZW1lbnRJbnN0KSAgICAgICAgICAgICBcCisgICAgICBtYWNybyhHZXRFbGVtZW50UHRySW5zdCkgICAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKEluc2VydEVsZW1lbnRJbnN0KSAgICAgICAgICAgICAgXAorICAgICAgbWFjcm8oSW5zZXJ0VmFsdWVJbnN0KSAgICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhMYW5kaW5nUGFkSW5zdCkgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKFBISU5vZGUpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWFjcm8oU2VsZWN0SW5zdCkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhTaHVmZmxlVmVjdG9ySW5zdCkgICAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKFN0b3JlSW5zdCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWFjcm8oVGVybWluYXRvckluc3QpICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1hY3JvKEJyYW5jaEluc3QpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWFjcm8oSW5kaXJlY3RCckluc3QpICAgICAgICAgICAgICAgXAorICAgICAgICBtYWNybyhJbnZva2VJbnN0KSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1hY3JvKFJldHVybkluc3QpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWFjcm8oU3dpdGNoSW5zdCkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtYWNybyhVbnJlYWNoYWJsZUluc3QpICAgICAgICAgICAgICBcCisgICAgICAgIG1hY3JvKFJlc3VtZUluc3QpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWFjcm8oQ2xlYW51cFJldHVybkluc3QpICAgICAgICAgICAgXAorICAgICAgICBtYWNybyhDYXRjaFJldHVybkluc3QpICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhGdW5jbGV0UGFkSW5zdCkgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWFjcm8oQ2F0Y2hQYWRJbnN0KSAgICAgICAgICAgICAgICAgXAorICAgICAgICBtYWNybyhDbGVhbnVwUGFkSW5zdCkgICAgICAgICAgICAgICBcCisgICAgICBtYWNybyhVbmFyeUluc3RydWN0aW9uKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWFjcm8oQWxsb2NhSW5zdCkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtYWNybyhDYXN0SW5zdCkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbWFjcm8oQWRkclNwYWNlQ2FzdEluc3QpICAgICAgICAgIFwKKyAgICAgICAgICBtYWNybyhCaXRDYXN0SW5zdCkgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG1hY3JvKEZQRXh0SW5zdCkgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbWFjcm8oRlBUb1NJSW5zdCkgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBtYWNybyhGUFRvVUlJbnN0KSAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG1hY3JvKEZQVHJ1bmNJbnN0KSAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbWFjcm8oSW50VG9QdHJJbnN0KSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBtYWNybyhQdHJUb0ludEluc3QpICAgICAgICAgICAgICAgXAorICAgICAgICAgIG1hY3JvKFNFeHRJbnN0KSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbWFjcm8oU0lUb0ZQSW5zdCkgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBtYWNybyhUcnVuY0luc3QpICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG1hY3JvKFVJVG9GUEluc3QpICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbWFjcm8oWkV4dEluc3QpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWFjcm8oRXh0cmFjdFZhbHVlSW5zdCkgICAgICAgICAgICAgXAorICAgICAgICBtYWNybyhMb2FkSW5zdCkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1hY3JvKFZBQXJnSW5zdCkKKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNDb3JlVmFsdWVHZW5lcmFsIEdlbmVyYWwgQVBJcworICoKKyAqIEZ1bmN0aW9ucyBpbiB0aGlzIHNlY3Rpb24gd29yayBvbiBhbGwgTExWTVZhbHVlUmVmIGluc3RhbmNlcywKKyAqIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgc3ViLXR5cGUuIFRoZXkgY29ycmVzcG9uZCB0byBmdW5jdGlvbnMgYXZhaWxhYmxlCisgKiBvbiBsbHZtOjpWYWx1ZS4KKyAqCisgKiBAeworICovCisKKy8qKgorICogT2J0YWluIHRoZSB0eXBlIG9mIGEgdmFsdWUuCisgKgorICogQHNlZSBsbHZtOjpWYWx1ZTo6Z2V0VHlwZSgpCisgKi8KK0xMVk1UeXBlUmVmIExMVk1UeXBlT2YoTExWTVZhbHVlUmVmIFZhbCk7CisKKy8qKgorICogT2J0YWluIHRoZSBlbnVtZXJhdGVkIHR5cGUgb2YgYSBWYWx1ZSBpbnN0YW5jZS4KKyAqCisgKiBAc2VlIGxsdm06OlZhbHVlOjpnZXRWYWx1ZUlEKCkKKyAqLworTExWTVZhbHVlS2luZCBMTFZNR2V0VmFsdWVLaW5kKExMVk1WYWx1ZVJlZiBWYWwpOworCisvKioKKyAqIE9idGFpbiB0aGUgc3RyaW5nIG5hbWUgb2YgYSB2YWx1ZS4KKyAqCisgKiBAc2VlIGxsdm06OlZhbHVlOjpnZXROYW1lKCkKKyAqLworY29uc3QgY2hhciAqTExWTUdldFZhbHVlTmFtZShMTFZNVmFsdWVSZWYgVmFsKTsKKworLyoqCisgKiBTZXQgdGhlIHN0cmluZyBuYW1lIG9mIGEgdmFsdWUuCisgKgorICogQHNlZSBsbHZtOjpWYWx1ZTo6c2V0TmFtZSgpCisgKi8KK3ZvaWQgTExWTVNldFZhbHVlTmFtZShMTFZNVmFsdWVSZWYgVmFsLCBjb25zdCBjaGFyICpOYW1lKTsKKworLyoqCisgKiBEdW1wIGEgcmVwcmVzZW50YXRpb24gb2YgYSB2YWx1ZSB0byBzdGRlcnIuCisgKgorICogQHNlZSBsbHZtOjpWYWx1ZTo6ZHVtcCgpCisgKi8KK3ZvaWQgTExWTUR1bXBWYWx1ZShMTFZNVmFsdWVSZWYgVmFsKTsKKworLyoqCisgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLiBVc2UKKyAqIExMVk1EaXNwb3NlTWVzc2FnZSB0byBmcmVlIHRoZSBzdHJpbmcuCisgKgorICogQHNlZSBsbHZtOjpWYWx1ZTo6cHJpbnQoKQorICovCitjaGFyICpMTFZNUHJpbnRWYWx1ZVRvU3RyaW5nKExMVk1WYWx1ZVJlZiBWYWwpOworCisvKioKKyAqIFJlcGxhY2UgYWxsIHVzZXMgb2YgYSB2YWx1ZSB3aXRoIGFub3RoZXIgb25lLgorICoKKyAqIEBzZWUgbGx2bTo6VmFsdWU6OnJlcGxhY2VBbGxVc2VzV2l0aCgpCisgKi8KK3ZvaWQgTExWTVJlcGxhY2VBbGxVc2VzV2l0aChMTFZNVmFsdWVSZWYgT2xkVmFsLCBMTFZNVmFsdWVSZWYgTmV3VmFsKTsKKworLyoqCisgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc3BlY2lmaWVkIHZhbHVlIGluc3RhbmNlIGlzIGNvbnN0YW50LgorICovCitMTFZNQm9vbCBMTFZNSXNDb25zdGFudChMTFZNVmFsdWVSZWYgVmFsKTsKKworLyoqCisgKiBEZXRlcm1pbmUgd2hldGhlciBhIHZhbHVlIGluc3RhbmNlIGlzIHVuZGVmaW5lZC4KKyAqLworTExWTUJvb2wgTExWTUlzVW5kZWYoTExWTVZhbHVlUmVmIFZhbCk7CisKKy8qKgorICogQ29udmVydCB2YWx1ZSBpbnN0YW5jZXMgYmV0d2VlbiB0eXBlcy4KKyAqCisgKiBJbnRlcm5hbGx5LCBhbiBMTFZNVmFsdWVSZWYgaXMgInBpbm5lZCIgdG8gYSBzcGVjaWZpYyB0eXBlLiBUaGlzCisgKiBzZXJpZXMgb2YgZnVuY3Rpb25zIGFsbG93cyB5b3UgdG8gY2FzdCBhbiBpbnN0YW5jZSB0byBhIHNwZWNpZmljCisgKiB0eXBlLgorICoKKyAqIElmIHRoZSBjYXN0IGlzIG5vdCB2YWxpZCBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLCBOVUxMIGlzIHJldHVybmVkLgorICoKKyAqIEBzZWUgbGx2bTo6ZHluX2Nhc3Rfb3JfbnVsbDw+CisgKi8KKyNkZWZpbmUgTExWTV9ERUNMQVJFX1ZBTFVFX0NBU1QobmFtZSkgXAorICBMTFZNVmFsdWVSZWYgTExWTUlzQSMjbmFtZShMTFZNVmFsdWVSZWYgVmFsKTsKK0xMVk1fRk9SX0VBQ0hfVkFMVUVfU1VCQ0xBU1MoTExWTV9ERUNMQVJFX1ZBTFVFX0NBU1QpCisKK0xMVk1WYWx1ZVJlZiBMTFZNSXNBTUROb2RlKExMVk1WYWx1ZVJlZiBWYWwpOworTExWTVZhbHVlUmVmIExMVk1Jc0FNRFN0cmluZyhMTFZNVmFsdWVSZWYgVmFsKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIExMVk1DQ29yZVZhbHVlVXNlcyBVc2FnZQorICoKKyAqIFRoaXMgbW9kdWxlIGRlZmluZXMgZnVuY3Rpb25zIHRoYXQgYWxsb3cgeW91IHRvIGluc3BlY3QgdGhlIHVzZXMgb2YgYQorICogTExWTVZhbHVlUmVmLgorICoKKyAqIEl0IGlzIHBvc3NpYmxlIHRvIG9idGFpbiBhbiBMTFZNVXNlUmVmIGZvciBhbnkgTExWTVZhbHVlUmVmIGluc3RhbmNlLgorICogRWFjaCBMTFZNVXNlUmVmICh3aGljaCBjb3JyZXNwb25kcyB0byBhIGxsdm06OlVzZSBpbnN0YW5jZSkgaG9sZHMgYQorICogbGx2bTo6VXNlciBhbmQgbGx2bTo6VmFsdWUuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIE9idGFpbiB0aGUgZmlyc3QgdXNlIG9mIGEgdmFsdWUuCisgKgorICogVXNlcyBhcmUgb2J0YWluZWQgaW4gYW4gaXRlcmF0b3IgZmFzaGlvbi4gRmlyc3QsIGNhbGwgdGhpcyBmdW5jdGlvbgorICogdG8gb2J0YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBmaXJzdCB1c2UuIFRoZW4sIGNhbGwgTExWTUdldE5leHRVc2UoKQorICogb24gdGhhdCBpbnN0YW5jZSBhbmQgYWxsIHN1YnNlcXVlbnRseSBvYnRhaW5lZCBpbnN0YW5jZXMgdW50aWwKKyAqIExMVk1HZXROZXh0VXNlKCkgcmV0dXJucyBOVUxMLgorICoKKyAqIEBzZWUgbGx2bTo6VmFsdWU6OnVzZV9iZWdpbigpCisgKi8KK0xMVk1Vc2VSZWYgTExWTUdldEZpcnN0VXNlKExMVk1WYWx1ZVJlZiBWYWwpOworCisvKioKKyAqIE9idGFpbiB0aGUgbmV4dCB1c2Ugb2YgYSB2YWx1ZS4KKyAqCisgKiBUaGlzIGVmZmVjdGl2ZWx5IGFkdmFuY2VzIHRoZSBpdGVyYXRvci4gSXQgcmV0dXJucyBOVUxMIGlmIHlvdSBhcmUgb24KKyAqIHRoZSBmaW5hbCB1c2UgYW5kIG5vIG1vcmUgYXJlIGF2YWlsYWJsZS4KKyAqLworTExWTVVzZVJlZiBMTFZNR2V0TmV4dFVzZShMTFZNVXNlUmVmIFUpOworCisvKioKKyAqIE9idGFpbiB0aGUgdXNlciB2YWx1ZSBmb3IgYSB1c2VyLgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBjb3JyZXNwb25kcyB0byBhIGxsdm06OlVzZXIgdHlwZS4KKyAqCisgKiBAc2VlIGxsdm06OlVzZTo6Z2V0VXNlcigpCisgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNR2V0VXNlcihMTFZNVXNlUmVmIFUpOworCisvKioKKyAqIE9idGFpbiB0aGUgdmFsdWUgdGhpcyB1c2UgY29ycmVzcG9uZHMgdG8uCisgKgorICogQHNlZSBsbHZtOjpVc2U6OmdldCgpLgorICovCitMTFZNVmFsdWVSZWYgTExWTUdldFVzZWRWYWx1ZShMTFZNVXNlUmVmIFUpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNDb3JlVmFsdWVVc2VyIFVzZXIgdmFsdWUKKyAqCisgKiBGdW5jdGlvbiBpbiB0aGlzIGdyb3VwIHBlcnRhaW4gdG8gTExWTVZhbHVlUmVmIGluc3RhbmNlcyB0aGF0IGRlc2NlbnQKKyAqIGZyb20gbGx2bTo6VXNlci4gVGhpcyBpbmNsdWRlcyBjb25zdGFudHMsIGluc3RydWN0aW9ucywgYW5kCisgKiBvcGVyYXRvcnMuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIE9idGFpbiBhbiBvcGVyYW5kIGF0IGEgc3BlY2lmaWMgaW5kZXggaW4gYSBsbHZtOjpVc2VyIHZhbHVlLgorICoKKyAqIEBzZWUgbGx2bTo6VXNlcjo6Z2V0T3BlcmFuZCgpCisgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNR2V0T3BlcmFuZChMTFZNVmFsdWVSZWYgVmFsLCB1bnNpZ25lZCBJbmRleCk7CisKKy8qKgorICogT2J0YWluIHRoZSB1c2Ugb2YgYW4gb3BlcmFuZCBhdCBhIHNwZWNpZmljIGluZGV4IGluIGEgbGx2bTo6VXNlciB2YWx1ZS4KKyAqCisgKiBAc2VlIGxsdm06OlVzZXI6OmdldE9wZXJhbmRVc2UoKQorICovCitMTFZNVXNlUmVmIExMVk1HZXRPcGVyYW5kVXNlKExMVk1WYWx1ZVJlZiBWYWwsIHVuc2lnbmVkIEluZGV4KTsKKworLyoqCisgKiBTZXQgYW4gb3BlcmFuZCBhdCBhIHNwZWNpZmljIGluZGV4IGluIGEgbGx2bTo6VXNlciB2YWx1ZS4KKyAqCisgKiBAc2VlIGxsdm06OlVzZXI6OnNldE9wZXJhbmQoKQorICovCit2b2lkIExMVk1TZXRPcGVyYW5kKExMVk1WYWx1ZVJlZiBVc2VyLCB1bnNpZ25lZCBJbmRleCwgTExWTVZhbHVlUmVmIFZhbCk7CisKKy8qKgorICogT2J0YWluIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgaW4gYSBsbHZtOjpVc2VyIHZhbHVlLgorICoKKyAqIEBzZWUgbGx2bTo6VXNlcjo6Z2V0TnVtT3BlcmFuZHMoKQorICovCitpbnQgTExWTUdldE51bU9wZXJhbmRzKExMVk1WYWx1ZVJlZiBWYWwpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNDb3JlVmFsdWVDb25zdGFudCBDb25zdGFudHMKKyAqCisgKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgQVBJcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBMTFZNVmFsdWVSZWYgdGhhdAorICogY29ycmVzcG9uZCB0byBsbHZtOjpDb25zdGFudCBpbnN0YW5jZXMuCisgKgorICogVGhlc2UgZnVuY3Rpb25zIHdpbGwgd29yayBmb3IgYW55IExMVk1WYWx1ZVJlZiBpbiB0aGUgbGx2bTo6Q29uc3RhbnQKKyAqIGNsYXNzIGhpZXJhcmNoeS4KKyAqCisgKiBAeworICovCisKKy8qKgorICogT2J0YWluIGEgY29uc3RhbnQgdmFsdWUgcmVmZXJyaW5nIHRvIHRoZSBudWxsIGluc3RhbmNlIG9mIGEgdHlwZS4KKyAqCisgKiBAc2VlIGxsdm06OkNvbnN0YW50OjpnZXROdWxsVmFsdWUoKQorICovCitMTFZNVmFsdWVSZWYgTExWTUNvbnN0TnVsbChMTFZNVHlwZVJlZiBUeSk7IC8qIGFsbCB6ZXJvZXMgKi8KKworLyoqCisgKiBPYnRhaW4gYSBjb25zdGFudCB2YWx1ZSByZWZlcnJpbmcgdG8gdGhlIGluc3RhbmNlIG9mIGEgdHlwZQorICogY29uc2lzdGluZyBvZiBhbGwgb25lcy4KKyAqCisgKiBUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIGludGVnZXIgdHlwZXMuCisgKgorICogQHNlZSBsbHZtOjpDb25zdGFudDo6Z2V0QWxsT25lc1ZhbHVlKCkKKyAqLworTExWTVZhbHVlUmVmIExMVk1Db25zdEFsbE9uZXMoTExWTVR5cGVSZWYgVHkpOworCisvKioKKyAqIE9idGFpbiBhIGNvbnN0YW50IHZhbHVlIHJlZmVycmluZyB0byBhbiB1bmRlZmluZWQgdmFsdWUgb2YgYSB0eXBlLgorICoKKyAqIEBzZWUgbGx2bTo6VW5kZWZWYWx1ZTo6Z2V0KCkKKyAqLworTExWTVZhbHVlUmVmIExMVk1HZXRVbmRlZihMTFZNVHlwZVJlZiBUeSk7CisKKy8qKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgYSB2YWx1ZSBpbnN0YW5jZSBpcyBudWxsLgorICoKKyAqIEBzZWUgbGx2bTo6Q29uc3RhbnQ6OmlzTnVsbFZhbHVlKCkKKyAqLworTExWTUJvb2wgTExWTUlzTnVsbChMTFZNVmFsdWVSZWYgVmFsKTsKKworLyoqCisgKiBPYnRhaW4gYSBjb25zdGFudCB0aGF0IGlzIGEgY29uc3RhbnQgcG9pbnRlciBwb2ludGluZyB0byBOVUxMIGZvciBhCisgKiBzcGVjaWZpZWQgdHlwZS4KKyAqLworTExWTVZhbHVlUmVmIExMVk1Db25zdFBvaW50ZXJOdWxsKExMVk1UeXBlUmVmIFR5KTsKKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNDb3JlVmFsdWVDb25zdGFudFNjYWxhciBTY2FsYXIgY29uc3RhbnRzCisgKgorICogRnVuY3Rpb25zIGluIHRoaXMgZ3JvdXAgbW9kZWwgTExWTVZhbHVlUmVmIGluc3RhbmNlcyB0aGF0IGNvcnJlc3BvbmQKKyAqIHRvIGNvbnN0YW50cyByZWZlcnJpbmcgdG8gc2NhbGFyIHR5cGVzLgorICoKKyAqIEZvciBpbnRlZ2VyIHR5cGVzLCB0aGUgTExWTVR5cGVSZWYgcGFyYW1ldGVyIHNob3VsZCBjb3JyZXNwb25kIHRvIGEKKyAqIGxsdm06OkludGVnZXJUeXBlIGluc3RhbmNlIGFuZCB0aGUgcmV0dXJuZWQgTExWTVZhbHVlUmVmIHdpbGwKKyAqIGNvcnJlc3BvbmQgdG8gYSBsbHZtOjpDb25zdGFudEludC4KKyAqCisgKiBGb3IgZmxvYXRpbmcgcG9pbnQgdHlwZXMsIHRoZSBMTFZNVHlwZVJlZiByZXR1cm5lZCBjb3JyZXNwb25kcyB0byBhCisgKiBsbHZtOjpDb25zdGFudEZQLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBPYnRhaW4gYSBjb25zdGFudCB2YWx1ZSBmb3IgYW4gaW50ZWdlciB0eXBlLgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBjb3JyZXNwb25kcyB0byBhIGxsdm06OkNvbnN0YW50SW50LgorICoKKyAqIEBzZWUgbGx2bTo6Q29uc3RhbnRJbnQ6OmdldCgpCisgKgorICogQHBhcmFtIEludFR5IEludGVnZXIgdHlwZSB0byBvYnRhaW4gdmFsdWUgb2YuCisgKiBAcGFyYW0gTiBUaGUgdmFsdWUgdGhlIHJldHVybmVkIGluc3RhbmNlIHNob3VsZCByZWZlciB0by4KKyAqIEBwYXJhbSBTaWduRXh0ZW5kIFdoZXRoZXIgdG8gc2lnbiBleHRlbmQgdGhlIHByb2R1Y2VkIHZhbHVlLgorICovCitMTFZNVmFsdWVSZWYgTExWTUNvbnN0SW50KExMVk1UeXBlUmVmIEludFR5LCB1bnNpZ25lZCBsb25nIGxvbmcgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUJvb2wgU2lnbkV4dGVuZCk7CisKKy8qKgorICogT2J0YWluIGEgY29uc3RhbnQgdmFsdWUgZm9yIGFuIGludGVnZXIgb2YgYXJiaXRyYXJ5IHByZWNpc2lvbi4KKyAqCisgKiBAc2VlIGxsdm06OkNvbnN0YW50SW50OjpnZXQoKQorICovCitMTFZNVmFsdWVSZWYgTExWTUNvbnN0SW50T2ZBcmJpdHJhcnlQcmVjaXNpb24oTExWTVR5cGVSZWYgSW50VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtV29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDY0X3QgV29yZHNbXSk7CisKKy8qKgorICogT2J0YWluIGEgY29uc3RhbnQgdmFsdWUgZm9yIGFuIGludGVnZXIgcGFyc2VkIGZyb20gYSBzdHJpbmcuCisgKgorICogQSBzaW1pbGFyIEFQSSwgTExWTUNvbnN0SW50T2ZTdHJpbmdBbmRTaXplIGlzIGFsc28gYXZhaWxhYmxlLiBJZiB0aGUKKyAqIHN0cmluZydzIGxlbmd0aCBpcyBhdmFpbGFibGUsIGl0IGlzIHByZWZlcnJlZCB0byBjYWxsIHRoYXQgZnVuY3Rpb24KKyAqIGluc3RlYWQuCisgKgorICogQHNlZSBsbHZtOjpDb25zdGFudEludDo6Z2V0KCkKKyAqLworTExWTVZhbHVlUmVmIExMVk1Db25zdEludE9mU3RyaW5nKExMVk1UeXBlUmVmIEludFR5LCBjb25zdCBjaGFyICpUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgUmFkaXgpOworCisvKioKKyAqIE9idGFpbiBhIGNvbnN0YW50IHZhbHVlIGZvciBhbiBpbnRlZ2VyIHBhcnNlZCBmcm9tIGEgc3RyaW5nIHdpdGgKKyAqIHNwZWNpZmllZCBsZW5ndGguCisgKgorICogQHNlZSBsbHZtOjpDb25zdGFudEludDo6Z2V0KCkKKyAqLworTExWTVZhbHVlUmVmIExMVk1Db25zdEludE9mU3RyaW5nQW5kU2l6ZShMTFZNVHlwZVJlZiBJbnRUeSwgY29uc3QgY2hhciAqVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU0xlbiwgdWludDhfdCBSYWRpeCk7CisKKy8qKgorICogT2J0YWluIGEgY29uc3RhbnQgdmFsdWUgcmVmZXJyaW5nIHRvIGEgZG91YmxlIGZsb2F0aW5nIHBvaW50IHZhbHVlLgorICovCitMTFZNVmFsdWVSZWYgTExWTUNvbnN0UmVhbChMTFZNVHlwZVJlZiBSZWFsVHksIGRvdWJsZSBOKTsKKworLyoqCisgKiBPYnRhaW4gYSBjb25zdGFudCBmb3IgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSBwYXJzZWQgZnJvbSBhIHN0cmluZy4KKyAqCisgKiBBIHNpbWlsYXIgQVBJLCBMTFZNQ29uc3RSZWFsT2ZTdHJpbmdBbmRTaXplIGlzIGFsc28gYXZhaWxhYmxlLiBJdAorICogc2hvdWxkIGJlIHVzZWQgaWYgdGhlIGlucHV0IHN0cmluZydzIGxlbmd0aCBpcyBrbm93bi4KKyAqLworTExWTVZhbHVlUmVmIExMVk1Db25zdFJlYWxPZlN0cmluZyhMTFZNVHlwZVJlZiBSZWFsVHksIGNvbnN0IGNoYXIgKlRleHQpOworCisvKioKKyAqIE9idGFpbiBhIGNvbnN0YW50IGZvciBhIGZsb2F0aW5nIHBvaW50IHZhbHVlIHBhcnNlZCBmcm9tIGEgc3RyaW5nLgorICovCitMTFZNVmFsdWVSZWYgTExWTUNvbnN0UmVhbE9mU3RyaW5nQW5kU2l6ZShMTFZNVHlwZVJlZiBSZWFsVHksIGNvbnN0IGNoYXIgKlRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTTGVuKTsKKworLyoqCisgKiBPYnRhaW4gdGhlIHplcm8gZXh0ZW5kZWQgdmFsdWUgZm9yIGFuIGludGVnZXIgY29uc3RhbnQgdmFsdWUuCisgKgorICogQHNlZSBsbHZtOjpDb25zdGFudEludDo6Z2V0WkV4dFZhbHVlKCkKKyAqLwordW5zaWduZWQgbG9uZyBsb25nIExMVk1Db25zdEludEdldFpFeHRWYWx1ZShMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwpOworCisvKioKKyAqIE9idGFpbiB0aGUgc2lnbiBleHRlbmRlZCB2YWx1ZSBmb3IgYW4gaW50ZWdlciBjb25zdGFudCB2YWx1ZS4KKyAqCisgKiBAc2VlIGxsdm06OkNvbnN0YW50SW50OjpnZXRTRXh0VmFsdWUoKQorICovCitsb25nIGxvbmcgTExWTUNvbnN0SW50R2V0U0V4dFZhbHVlKExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCk7CisKKy8qKgorICogT2J0YWluIHRoZSBkb3VibGUgdmFsdWUgZm9yIGFuIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IHZhbHVlLgorICogbG9zZXNJbmZvIGluZGljYXRlcyBpZiBzb21lIHByZWNpc2lvbiB3YXMgbG9zdCBpbiB0aGUgY29udmVyc2lvbi4KKyAqCisgKiBAc2VlIGxsdm06OkNvbnN0YW50RlA6OmdldERvdWJsZVZhbHVlCisgKi8KK2RvdWJsZSBMTFZNQ29uc3RSZWFsR2V0RG91YmxlKExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwgTExWTUJvb2wgKmxvc2VzSW5mbyk7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ0NvcmVWYWx1ZUNvbnN0YW50Q29tcG9zaXRlIENvbXBvc2l0ZSBDb25zdGFudHMKKyAqCisgKiBGdW5jdGlvbnMgaW4gdGhpcyBncm91cCBvcGVyYXRlIG9uIGNvbXBvc2l0ZSBjb25zdGFudHMuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIENyZWF0ZSBhIENvbnN0YW50RGF0YVNlcXVlbnRpYWwgYW5kIGluaXRpYWxpemUgaXQgd2l0aCBhIHN0cmluZy4KKyAqCisgKiBAc2VlIGxsdm06OkNvbnN0YW50RGF0YUFycmF5OjpnZXRTdHJpbmcoKQorICovCitMTFZNVmFsdWVSZWYgTExWTUNvbnN0U3RyaW5nSW5Db250ZXh0KExMVk1Db250ZXh0UmVmIEMsIGNvbnN0IGNoYXIgKlN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGVuZ3RoLCBMTFZNQm9vbCBEb250TnVsbFRlcm1pbmF0ZSk7CisKKy8qKgorICogQ3JlYXRlIGEgQ29uc3RhbnREYXRhU2VxdWVudGlhbCB3aXRoIHN0cmluZyBjb250ZW50IGluIHRoZSBnbG9iYWwgY29udGV4dC4KKyAqCisgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIExMVk1Db25zdFN0cmluZ0luQ29udGV4dCBleGNlcHQgaXQgb3BlcmF0ZXMgb24gdGhlCisgKiBnbG9iYWwgY29udGV4dC4KKyAqCisgKiBAc2VlIExMVk1Db25zdFN0cmluZ0luQ29udGV4dCgpCisgKiBAc2VlIGxsdm06OkNvbnN0YW50RGF0YUFycmF5OjpnZXRTdHJpbmcoKQorICovCitMTFZNVmFsdWVSZWYgTExWTUNvbnN0U3RyaW5nKGNvbnN0IGNoYXIgKlN0ciwgdW5zaWduZWQgTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQm9vbCBEb250TnVsbFRlcm1pbmF0ZSk7CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY29uc3RhbnQgaXMgYW4gYXJyYXkgb2YgaTguCisgKgorICogQHNlZSBDb25zdGFudERhdGFTZXF1ZW50aWFsOjpnZXRBc1N0cmluZygpCisgKi8KK0xMVk1Cb29sIExMVk1Jc0NvbnN0YW50U3RyaW5nKExMVk1WYWx1ZVJlZiBjKTsKKworLyoqCisgKiBHZXQgdGhlIGdpdmVuIGNvbnN0YW50IGRhdGEgc2VxdWVudGlhbCBhcyBhIHN0cmluZy4KKyAqCisgKiBAc2VlIENvbnN0YW50RGF0YVNlcXVlbnRpYWw6OmdldEFzU3RyaW5nKCkKKyAqLworY29uc3QgY2hhciAqTExWTUdldEFzU3RyaW5nKExMVk1WYWx1ZVJlZiBjLCBzaXplX3QgKkxlbmd0aCk7CisKKy8qKgorICogQ3JlYXRlIGFuIGFub255bW91cyBDb25zdGFudFN0cnVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgorICoKKyAqIEBzZWUgbGx2bTo6Q29uc3RhbnRTdHJ1Y3Q6OmdldEFub24oKQorICovCitMTFZNVmFsdWVSZWYgTExWTUNvbnN0U3RydWN0SW5Db250ZXh0KExMVk1Db250ZXh0UmVmIEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiAqQ29uc3RhbnRWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb3VudCwgTExWTUJvb2wgUGFja2VkKTsKKworLyoqCisgKiBDcmVhdGUgYSBDb25zdGFudFN0cnVjdCBpbiB0aGUgZ2xvYmFsIENvbnRleHQuCisgKgorICogVGhpcyBpcyB0aGUgc2FtZSBhcyBMTFZNQ29uc3RTdHJ1Y3RJbkNvbnRleHQgZXhjZXB0IGl0IG9wZXJhdGVzIG9uIHRoZQorICogZ2xvYmFsIENvbnRleHQuCisgKgorICogQHNlZSBMTFZNQ29uc3RTdHJ1Y3RJbkNvbnRleHQoKQorICovCitMTFZNVmFsdWVSZWYgTExWTUNvbnN0U3RydWN0KExMVk1WYWx1ZVJlZiAqQ29uc3RhbnRWYWxzLCB1bnNpZ25lZCBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUJvb2wgUGFja2VkKTsKKworLyoqCisgKiBDcmVhdGUgYSBDb25zdGFudEFycmF5IGZyb20gdmFsdWVzLgorICoKKyAqIEBzZWUgbGx2bTo6Q29uc3RhbnRBcnJheTo6Z2V0KCkKKyAqLworTExWTVZhbHVlUmVmIExMVk1Db25zdEFycmF5KExMVk1UeXBlUmVmIEVsZW1lbnRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgKkNvbnN0YW50VmFscywgdW5zaWduZWQgTGVuZ3RoKTsKKworLyoqCisgKiBDcmVhdGUgYSBub24tYW5vbnltb3VzIENvbnN0YW50U3RydWN0IGZyb20gdmFsdWVzLgorICoKKyAqIEBzZWUgbGx2bTo6Q29uc3RhbnRTdHJ1Y3Q6OmdldCgpCisgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3ROYW1lZFN0cnVjdChMTFZNVHlwZVJlZiBTdHJ1Y3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgKkNvbnN0YW50VmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb3VudCk7CisKKy8qKgorICogR2V0IGFuIGVsZW1lbnQgYXQgc3BlY2lmaWVkIGluZGV4IGFzIGEgY29uc3RhbnQuCisgKgorICogQHNlZSBDb25zdGFudERhdGFTZXF1ZW50aWFsOjpnZXRFbGVtZW50QXNDb25zdGFudCgpCisgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNR2V0RWxlbWVudEFzQ29uc3RhbnQoTExWTVZhbHVlUmVmIEMsIHVuc2lnbmVkIGlkeCk7CisKKy8qKgorICogQ3JlYXRlIGEgQ29uc3RhbnRWZWN0b3IgZnJvbSB2YWx1ZXMuCisgKgorICogQHNlZSBsbHZtOjpDb25zdGFudFZlY3Rvcjo6Z2V0KCkKKyAqLworTExWTVZhbHVlUmVmIExMVk1Db25zdFZlY3RvcihMTFZNVmFsdWVSZWYgKlNjYWxhckNvbnN0YW50VmFscywgdW5zaWduZWQgU2l6ZSk7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ0NvcmVWYWx1ZUNvbnN0YW50RXhwcmVzc2lvbnMgQ29uc3RhbnQgRXhwcmVzc2lvbnMKKyAqCisgKiBGdW5jdGlvbnMgaW4gdGhpcyBncm91cCBjb3JyZXNwb25kIHRvIEFQSXMgb24gbGx2bTo6Q29uc3RhbnRFeHByLgorICoKKyAqIEBzZWUgbGx2bTo6Q29uc3RhbnRFeHByLgorICoKKyAqIEB7CisgKi8KK0xMVk1PcGNvZGUgTExWTUdldENvbnN0T3Bjb2RlKExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCk7CitMTFZNVmFsdWVSZWYgTExWTUFsaWduT2YoTExWTVR5cGVSZWYgVHkpOworTExWTVZhbHVlUmVmIExMVk1TaXplT2YoTExWTVR5cGVSZWYgVHkpOworTExWTVZhbHVlUmVmIExMVk1Db25zdE5lZyhMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwpOworTExWTVZhbHVlUmVmIExMVk1Db25zdE5TV05lZyhMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwpOworTExWTVZhbHVlUmVmIExMVk1Db25zdE5VV05lZyhMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEZOZWcoTExWTVZhbHVlUmVmIENvbnN0YW50VmFsKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3ROb3QoTExWTVZhbHVlUmVmIENvbnN0YW50VmFsKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RBZGQoTExWTVZhbHVlUmVmIExIU0NvbnN0YW50LCBMTFZNVmFsdWVSZWYgUkhTQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdE5TV0FkZChMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0TlVXQWRkKExMVk1WYWx1ZVJlZiBMSFNDb25zdGFudCwgTExWTVZhbHVlUmVmIFJIU0NvbnN0YW50KTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RGQWRkKExMVk1WYWx1ZVJlZiBMSFNDb25zdGFudCwgTExWTVZhbHVlUmVmIFJIU0NvbnN0YW50KTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RTdWIoTExWTVZhbHVlUmVmIExIU0NvbnN0YW50LCBMTFZNVmFsdWVSZWYgUkhTQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdE5TV1N1YihMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0TlVXU3ViKExMVk1WYWx1ZVJlZiBMSFNDb25zdGFudCwgTExWTVZhbHVlUmVmIFJIU0NvbnN0YW50KTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RGU3ViKExMVk1WYWx1ZVJlZiBMSFNDb25zdGFudCwgTExWTVZhbHVlUmVmIFJIU0NvbnN0YW50KTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RNdWwoTExWTVZhbHVlUmVmIExIU0NvbnN0YW50LCBMTFZNVmFsdWVSZWYgUkhTQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdE5TV011bChMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0TlVXTXVsKExMVk1WYWx1ZVJlZiBMSFNDb25zdGFudCwgTExWTVZhbHVlUmVmIFJIU0NvbnN0YW50KTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RGTXVsKExMVk1WYWx1ZVJlZiBMSFNDb25zdGFudCwgTExWTVZhbHVlUmVmIFJIU0NvbnN0YW50KTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RVRGl2KExMVk1WYWx1ZVJlZiBMSFNDb25zdGFudCwgTExWTVZhbHVlUmVmIFJIU0NvbnN0YW50KTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RFeGFjdFVEaXYoTExWTVZhbHVlUmVmIExIU0NvbnN0YW50LCBMTFZNVmFsdWVSZWYgUkhTQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdFNEaXYoTExWTVZhbHVlUmVmIExIU0NvbnN0YW50LCBMTFZNVmFsdWVSZWYgUkhTQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEV4YWN0U0RpdihMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0RkRpdihMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0VVJlbShMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0U1JlbShMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0RlJlbShMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0QW5kKExMVk1WYWx1ZVJlZiBMSFNDb25zdGFudCwgTExWTVZhbHVlUmVmIFJIU0NvbnN0YW50KTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RPcihMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0WG9yKExMVk1WYWx1ZVJlZiBMSFNDb25zdGFudCwgTExWTVZhbHVlUmVmIFJIU0NvbnN0YW50KTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RJQ21wKExMVk1JbnRQcmVkaWNhdGUgUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIExIU0NvbnN0YW50LCBMTFZNVmFsdWVSZWYgUkhTQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEZDbXAoTExWTVJlYWxQcmVkaWNhdGUgUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIExIU0NvbnN0YW50LCBMTFZNVmFsdWVSZWYgUkhTQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdFNobChMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0TFNocihMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0QVNocihMTFZNVmFsdWVSZWYgTEhTQ29uc3RhbnQsIExMVk1WYWx1ZVJlZiBSSFNDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0R0VQKExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmICpDb25zdGFudEluZGljZXMsIHVuc2lnbmVkIE51bUluZGljZXMpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEluQm91bmRzR0VQKExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgKkNvbnN0YW50SW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JbmRpY2VzKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RUcnVuYyhMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwsIExMVk1UeXBlUmVmIFRvVHlwZSk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0U0V4dChMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwsIExMVk1UeXBlUmVmIFRvVHlwZSk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0WkV4dChMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwsIExMVk1UeXBlUmVmIFRvVHlwZSk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0RlBUcnVuYyhMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwsIExMVk1UeXBlUmVmIFRvVHlwZSk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0RlBFeHQoTExWTVZhbHVlUmVmIENvbnN0YW50VmFsLCBMTFZNVHlwZVJlZiBUb1R5cGUpOworTExWTVZhbHVlUmVmIExMVk1Db25zdFVJVG9GUChMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwsIExMVk1UeXBlUmVmIFRvVHlwZSk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0U0lUb0ZQKExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwgTExWTVR5cGVSZWYgVG9UeXBlKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RGUFRvVUkoTExWTVZhbHVlUmVmIENvbnN0YW50VmFsLCBMTFZNVHlwZVJlZiBUb1R5cGUpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEZQVG9TSShMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwsIExMVk1UeXBlUmVmIFRvVHlwZSk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0UHRyVG9JbnQoTExWTVZhbHVlUmVmIENvbnN0YW50VmFsLCBMTFZNVHlwZVJlZiBUb1R5cGUpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEludFRvUHRyKExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwgTExWTVR5cGVSZWYgVG9UeXBlKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RCaXRDYXN0KExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwgTExWTVR5cGVSZWYgVG9UeXBlKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RBZGRyU3BhY2VDYXN0KExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwgTExWTVR5cGVSZWYgVG9UeXBlKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RaRXh0T3JCaXRDYXN0KExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1UeXBlUmVmIFRvVHlwZSk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0U0V4dE9yQml0Q2FzdChMTFZNVmFsdWVSZWYgQ29uc3RhbnRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBUb1R5cGUpOworTExWTVZhbHVlUmVmIExMVk1Db25zdFRydW5jT3JCaXRDYXN0KExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBUb1R5cGUpOworTExWTVZhbHVlUmVmIExMVk1Db25zdFBvaW50ZXJDYXN0KExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBUb1R5cGUpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEludENhc3QoTExWTVZhbHVlUmVmIENvbnN0YW50VmFsLCBMTFZNVHlwZVJlZiBUb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQm9vbCBpc1NpZ25lZCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0RlBDYXN0KExMVk1WYWx1ZVJlZiBDb25zdGFudFZhbCwgTExWTVR5cGVSZWYgVG9UeXBlKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQ29uc3RTZWxlY3QoTExWTVZhbHVlUmVmIENvbnN0YW50Q29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgQ29uc3RhbnRJZlRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiBDb25zdGFudElmRmFsc2UpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEV4dHJhY3RFbGVtZW50KExMVk1WYWx1ZVJlZiBWZWN0b3JDb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgSW5kZXhDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0SW5zZXJ0RWxlbWVudChMTFZNVmFsdWVSZWYgVmVjdG9yQ29uc3RhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgRWxlbWVudFZhbHVlQ29uc3RhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgSW5kZXhDb25zdGFudCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0U2h1ZmZsZVZlY3RvcihMTFZNVmFsdWVSZWYgVmVjdG9yQUNvbnN0YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIFZlY3RvckJDb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiBNYXNrQ29uc3RhbnQpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEV4dHJhY3RWYWx1ZShMTFZNVmFsdWVSZWYgQWdnQ29uc3RhbnQsIHVuc2lnbmVkICpJZHhMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JZHgpOworTExWTVZhbHVlUmVmIExMVk1Db25zdEluc2VydFZhbHVlKExMVk1WYWx1ZVJlZiBBZ2dDb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgRWxlbWVudFZhbHVlQ29uc3RhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKklkeExpc3QsIHVuc2lnbmVkIE51bUlkeCk7CitMTFZNVmFsdWVSZWYgTExWTUNvbnN0SW5saW5lQXNtKExMVk1UeXBlUmVmIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpBc21TdHJpbmcsIGNvbnN0IGNoYXIgKkNvbnN0cmFpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQm9vbCBIYXNTaWRlRWZmZWN0cywgTExWTUJvb2wgSXNBbGlnblN0YWNrKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQmxvY2tBZGRyZXNzKExMVk1WYWx1ZVJlZiBGLCBMTFZNQmFzaWNCbG9ja1JlZiBCQik7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ0NvcmVWYWx1ZUNvbnN0YW50R2xvYmFscyBHbG9iYWwgVmFsdWVzCisgKgorICogVGhpcyBncm91cCBjb250YWlucyBmdW5jdGlvbnMgdGhhdCBvcGVyYXRlIG9uIGdsb2JhbCB2YWx1ZXMuIEZ1bmN0aW9ucyBpbgorICogdGhpcyBncm91cCByZWxhdGUgdG8gZnVuY3Rpb25zIGluIHRoZSBsbHZtOjpHbG9iYWxWYWx1ZSBjbGFzcyB0cmVlLgorICoKKyAqIEBzZWUgbGx2bTo6R2xvYmFsVmFsdWUKKyAqCisgKiBAeworICovCisKK0xMVk1Nb2R1bGVSZWYgTExWTUdldEdsb2JhbFBhcmVudChMTFZNVmFsdWVSZWYgR2xvYmFsKTsKK0xMVk1Cb29sIExMVk1Jc0RlY2xhcmF0aW9uKExMVk1WYWx1ZVJlZiBHbG9iYWwpOworTExWTUxpbmthZ2UgTExWTUdldExpbmthZ2UoTExWTVZhbHVlUmVmIEdsb2JhbCk7Cit2b2lkIExMVk1TZXRMaW5rYWdlKExMVk1WYWx1ZVJlZiBHbG9iYWwsIExMVk1MaW5rYWdlIExpbmthZ2UpOworY29uc3QgY2hhciAqTExWTUdldFNlY3Rpb24oTExWTVZhbHVlUmVmIEdsb2JhbCk7Cit2b2lkIExMVk1TZXRTZWN0aW9uKExMVk1WYWx1ZVJlZiBHbG9iYWwsIGNvbnN0IGNoYXIgKlNlY3Rpb24pOworTExWTVZpc2liaWxpdHkgTExWTUdldFZpc2liaWxpdHkoTExWTVZhbHVlUmVmIEdsb2JhbCk7Cit2b2lkIExMVk1TZXRWaXNpYmlsaXR5KExMVk1WYWx1ZVJlZiBHbG9iYWwsIExMVk1WaXNpYmlsaXR5IFZpeik7CitMTFZNRExMU3RvcmFnZUNsYXNzIExMVk1HZXRETExTdG9yYWdlQ2xhc3MoTExWTVZhbHVlUmVmIEdsb2JhbCk7Cit2b2lkIExMVk1TZXRETExTdG9yYWdlQ2xhc3MoTExWTVZhbHVlUmVmIEdsb2JhbCwgTExWTURMTFN0b3JhZ2VDbGFzcyBDbGFzcyk7CitMTFZNVW5uYW1lZEFkZHIgTExWTUdldFVubmFtZWRBZGRyZXNzKExMVk1WYWx1ZVJlZiBHbG9iYWwpOwordm9pZCBMTFZNU2V0VW5uYW1lZEFkZHJlc3MoTExWTVZhbHVlUmVmIEdsb2JhbCwgTExWTVVubmFtZWRBZGRyIFVubmFtZWRBZGRyKTsKKworLyoqIERlcHJlY2F0ZWQ6IFVzZSBMTFZNR2V0VW5uYW1lZEFkZHJlc3MgaW5zdGVhZC4gKi8KK0xMVk1Cb29sIExMVk1IYXNVbm5hbWVkQWRkcihMTFZNVmFsdWVSZWYgR2xvYmFsKTsKKy8qKiBEZXByZWNhdGVkOiBVc2UgTExWTVNldFVubmFtZWRBZGRyZXNzIGluc3RlYWQuICovCit2b2lkIExMVk1TZXRVbm5hbWVkQWRkcihMTFZNVmFsdWVSZWYgR2xvYmFsLCBMTFZNQm9vbCBIYXNVbm5hbWVkQWRkcik7CisKKy8qKgorICogQGRlZmdyb3VwIExMVk1DQ29yZVZhbHVlV2l0aEFsaWdubWVudCBWYWx1ZXMgd2l0aCBhbGlnbm1lbnQKKyAqCisgKiBGdW5jdGlvbnMgaW4gdGhpcyBncm91cCBvbmx5IGFwcGx5IHRvIHZhbHVlcyB3aXRoIGFsaWdubWVudCwgaS5lLgorICogZ2xvYmFsIHZhcmlhYmxlcywgbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zLgorICovCisKKy8qKgorICogT2J0YWluIHRoZSBwcmVmZXJyZWQgYWxpZ25tZW50IG9mIHRoZSB2YWx1ZS4KKyAqIEBzZWUgbGx2bTo6QWxsb2NhSW5zdDo6Z2V0QWxpZ25tZW50KCkKKyAqIEBzZWUgbGx2bTo6TG9hZEluc3Q6OmdldEFsaWdubWVudCgpCisgKiBAc2VlIGxsdm06OlN0b3JlSW5zdDo6Z2V0QWxpZ25tZW50KCkKKyAqIEBzZWUgbGx2bTo6R2xvYmFsVmFsdWU6OmdldEFsaWdubWVudCgpCisgKi8KK3Vuc2lnbmVkIExMVk1HZXRBbGlnbm1lbnQoTExWTVZhbHVlUmVmIFYpOworCisvKioKKyAqIFNldCB0aGUgcHJlZmVycmVkIGFsaWdubWVudCBvZiB0aGUgdmFsdWUuCisgKiBAc2VlIGxsdm06OkFsbG9jYUluc3Q6OnNldEFsaWdubWVudCgpCisgKiBAc2VlIGxsdm06OkxvYWRJbnN0OjpzZXRBbGlnbm1lbnQoKQorICogQHNlZSBsbHZtOjpTdG9yZUluc3Q6OnNldEFsaWdubWVudCgpCisgKiBAc2VlIGxsdm06Okdsb2JhbFZhbHVlOjpzZXRBbGlnbm1lbnQoKQorICovCit2b2lkIExMVk1TZXRBbGlnbm1lbnQoTExWTVZhbHVlUmVmIFYsIHVuc2lnbmVkIEJ5dGVzKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIExMVk1Db3JlVmFsdWVDb25zdGFudEdsb2JhbFZhcmlhYmxlIEdsb2JhbCBWYXJpYWJsZXMKKyAqCisgKiBUaGlzIGdyb3VwIGNvbnRhaW5zIGZ1bmN0aW9ucyB0aGF0IG9wZXJhdGUgb24gZ2xvYmFsIHZhcmlhYmxlIHZhbHVlcy4KKyAqCisgKiBAc2VlIGxsdm06Okdsb2JhbFZhcmlhYmxlCisgKgorICogQHsKKyAqLworTExWTVZhbHVlUmVmIExMVk1BZGRHbG9iYWwoTExWTU1vZHVsZVJlZiBNLCBMTFZNVHlwZVJlZiBUeSwgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUFkZEdsb2JhbEluQWRkcmVzc1NwYWNlKExMVk1Nb2R1bGVSZWYgTSwgTExWTVR5cGVSZWYgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSk7CitMTFZNVmFsdWVSZWYgTExWTUdldE5hbWVkR2xvYmFsKExMVk1Nb2R1bGVSZWYgTSwgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUdldEZpcnN0R2xvYmFsKExMVk1Nb2R1bGVSZWYgTSk7CitMTFZNVmFsdWVSZWYgTExWTUdldExhc3RHbG9iYWwoTExWTU1vZHVsZVJlZiBNKTsKK0xMVk1WYWx1ZVJlZiBMTFZNR2V0TmV4dEdsb2JhbChMTFZNVmFsdWVSZWYgR2xvYmFsVmFyKTsKK0xMVk1WYWx1ZVJlZiBMTFZNR2V0UHJldmlvdXNHbG9iYWwoTExWTVZhbHVlUmVmIEdsb2JhbFZhcik7Cit2b2lkIExMVk1EZWxldGVHbG9iYWwoTExWTVZhbHVlUmVmIEdsb2JhbFZhcik7CitMTFZNVmFsdWVSZWYgTExWTUdldEluaXRpYWxpemVyKExMVk1WYWx1ZVJlZiBHbG9iYWxWYXIpOwordm9pZCBMTFZNU2V0SW5pdGlhbGl6ZXIoTExWTVZhbHVlUmVmIEdsb2JhbFZhciwgTExWTVZhbHVlUmVmIENvbnN0YW50VmFsKTsKK0xMVk1Cb29sIExMVk1Jc1RocmVhZExvY2FsKExMVk1WYWx1ZVJlZiBHbG9iYWxWYXIpOwordm9pZCBMTFZNU2V0VGhyZWFkTG9jYWwoTExWTVZhbHVlUmVmIEdsb2JhbFZhciwgTExWTUJvb2wgSXNUaHJlYWRMb2NhbCk7CitMTFZNQm9vbCBMTFZNSXNHbG9iYWxDb25zdGFudChMTFZNVmFsdWVSZWYgR2xvYmFsVmFyKTsKK3ZvaWQgTExWTVNldEdsb2JhbENvbnN0YW50KExMVk1WYWx1ZVJlZiBHbG9iYWxWYXIsIExMVk1Cb29sIElzQ29uc3RhbnQpOworTExWTVRocmVhZExvY2FsTW9kZSBMTFZNR2V0VGhyZWFkTG9jYWxNb2RlKExMVk1WYWx1ZVJlZiBHbG9iYWxWYXIpOwordm9pZCBMTFZNU2V0VGhyZWFkTG9jYWxNb2RlKExMVk1WYWx1ZVJlZiBHbG9iYWxWYXIsIExMVk1UaHJlYWRMb2NhbE1vZGUgTW9kZSk7CitMTFZNQm9vbCBMTFZNSXNFeHRlcm5hbGx5SW5pdGlhbGl6ZWQoTExWTVZhbHVlUmVmIEdsb2JhbFZhcik7Cit2b2lkIExMVk1TZXRFeHRlcm5hbGx5SW5pdGlhbGl6ZWQoTExWTVZhbHVlUmVmIEdsb2JhbFZhciwgTExWTUJvb2wgSXNFeHRJbml0KTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIExMVk1Db3JlVmFsdWVDb25zdGFudEdsb2JhbEFsaWFzIEdsb2JhbCBBbGlhc2VzCisgKgorICogVGhpcyBncm91cCBjb250YWlucyBmdW5jdGlvbiB0aGF0IG9wZXJhdGUgb24gZ2xvYmFsIGFsaWFzIHZhbHVlcy4KKyAqCisgKiBAc2VlIGxsdm06Okdsb2JhbEFsaWFzCisgKgorICogQHsKKyAqLworTExWTVZhbHVlUmVmIExMVk1BZGRBbGlhcyhMTFZNTW9kdWxlUmVmIE0sIExMVk1UeXBlUmVmIFR5LCBMTFZNVmFsdWVSZWYgQWxpYXNlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ0NvcmVWYWx1ZUZ1bmN0aW9uIEZ1bmN0aW9uIHZhbHVlcworICoKKyAqIEZ1bmN0aW9ucyBpbiB0aGlzIGdyb3VwIG9wZXJhdGUgb24gTExWTVZhbHVlUmVmIGluc3RhbmNlcyB0aGF0CisgKiBjb3JyZXNwb25kIHRvIGxsdm06OkZ1bmN0aW9uIGluc3RhbmNlcy4KKyAqCisgKiBAc2VlIGxsdm06OkZ1bmN0aW9uCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFJlbW92ZSBhIGZ1bmN0aW9uIGZyb20gaXRzIGNvbnRhaW5pbmcgbW9kdWxlIGFuZCBkZWxldGVzIGl0LgorICoKKyAqIEBzZWUgbGx2bTo6RnVuY3Rpb246OmVyYXNlRnJvbVBhcmVudCgpCisgKi8KK3ZvaWQgTExWTURlbGV0ZUZ1bmN0aW9uKExMVk1WYWx1ZVJlZiBGbik7CisKKy8qKgorICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gZnVuY3Rpb24gaGFzIGEgcGVyc29uYWxpdHkgZnVuY3Rpb24uCisgKgorICogQHNlZSBsbHZtOjpGdW5jdGlvbjo6aGFzUGVyc29uYWxpdHlGbigpCisgKi8KK0xMVk1Cb29sIExMVk1IYXNQZXJzb25hbGl0eUZuKExMVk1WYWx1ZVJlZiBGbik7CisKKy8qKgorICogT2J0YWluIHRoZSBwZXJzb25hbGl0eSBmdW5jdGlvbiBhdHRhY2hlZCB0byB0aGUgZnVuY3Rpb24uCisgKgorICogQHNlZSBsbHZtOjpGdW5jdGlvbjo6Z2V0UGVyc29uYWxpdHlGbigpCisgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNR2V0UGVyc29uYWxpdHlGbihMTFZNVmFsdWVSZWYgRm4pOworCisvKioKKyAqIFNldCB0aGUgcGVyc29uYWxpdHkgZnVuY3Rpb24gYXR0YWNoZWQgdG8gdGhlIGZ1bmN0aW9uLgorICoKKyAqIEBzZWUgbGx2bTo6RnVuY3Rpb246OnNldFBlcnNvbmFsaXR5Rm4oKQorICovCit2b2lkIExMVk1TZXRQZXJzb25hbGl0eUZuKExMVk1WYWx1ZVJlZiBGbiwgTExWTVZhbHVlUmVmIFBlcnNvbmFsaXR5Rm4pOworCisvKioKKyAqIE9idGFpbiB0aGUgSUQgbnVtYmVyIGZyb20gYSBmdW5jdGlvbiBpbnN0YW5jZS4KKyAqCisgKiBAc2VlIGxsdm06OkZ1bmN0aW9uOjpnZXRJbnRyaW5zaWNJRCgpCisgKi8KK3Vuc2lnbmVkIExMVk1HZXRJbnRyaW5zaWNJRChMTFZNVmFsdWVSZWYgRm4pOworCisvKioKKyAqIE9idGFpbiB0aGUgY2FsbGluZyBmdW5jdGlvbiBvZiBhIGZ1bmN0aW9uLgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgTExWTUNhbGxDb252IGVudW1lcmF0aW9uLgorICoKKyAqIEBzZWUgbGx2bTo6RnVuY3Rpb246OmdldENhbGxpbmdDb252KCkKKyAqLwordW5zaWduZWQgTExWTUdldEZ1bmN0aW9uQ2FsbENvbnYoTExWTVZhbHVlUmVmIEZuKTsKKworLyoqCisgKiBTZXQgdGhlIGNhbGxpbmcgY29udmVudGlvbiBvZiBhIGZ1bmN0aW9uLgorICoKKyAqIEBzZWUgbGx2bTo6RnVuY3Rpb246OnNldENhbGxpbmdDb252KCkKKyAqCisgKiBAcGFyYW0gRm4gRnVuY3Rpb24gdG8gb3BlcmF0ZSBvbgorICogQHBhcmFtIENDIExMVk1DYWxsQ29udiB0byBzZXQgY2FsbGluZyBjb252ZW50aW9uIHRvCisgKi8KK3ZvaWQgTExWTVNldEZ1bmN0aW9uQ2FsbENvbnYoTExWTVZhbHVlUmVmIEZuLCB1bnNpZ25lZCBDQyk7CisKKy8qKgorICogT2J0YWluIHRoZSBuYW1lIG9mIHRoZSBnYXJiYWdlIGNvbGxlY3RvciB0byB1c2UgZHVyaW5nIGNvZGUKKyAqIGdlbmVyYXRpb24uCisgKgorICogQHNlZSBsbHZtOjpGdW5jdGlvbjo6Z2V0R0MoKQorICovCitjb25zdCBjaGFyICpMTFZNR2V0R0MoTExWTVZhbHVlUmVmIEZuKTsKKworLyoqCisgKiBEZWZpbmUgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHRvIHVzZSBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgorICoKKyAqIEBzZWUgbGx2bTo6RnVuY3Rpb246OnNldEdDKCkKKyAqLwordm9pZCBMTFZNU2V0R0MoTExWTVZhbHVlUmVmIEZuLCBjb25zdCBjaGFyICpOYW1lKTsKKworLyoqCisgKiBBZGQgYW4gYXR0cmlidXRlIHRvIGEgZnVuY3Rpb24uCisgKgorICogQHNlZSBsbHZtOjpGdW5jdGlvbjo6YWRkQXR0cmlidXRlKCkKKyAqLwordm9pZCBMTFZNQWRkQXR0cmlidXRlQXRJbmRleChMTFZNVmFsdWVSZWYgRiwgTExWTUF0dHJpYnV0ZUluZGV4IElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUF0dHJpYnV0ZVJlZiBBKTsKK3Vuc2lnbmVkIExMVk1HZXRBdHRyaWJ1dGVDb3VudEF0SW5kZXgoTExWTVZhbHVlUmVmIEYsIExMVk1BdHRyaWJ1dGVJbmRleCBJZHgpOwordm9pZCBMTFZNR2V0QXR0cmlidXRlc0F0SW5kZXgoTExWTVZhbHVlUmVmIEYsIExMVk1BdHRyaWJ1dGVJbmRleCBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQXR0cmlidXRlUmVmICpBdHRycyk7CitMTFZNQXR0cmlidXRlUmVmIExMVk1HZXRFbnVtQXR0cmlidXRlQXRJbmRleChMTFZNVmFsdWVSZWYgRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1BdHRyaWJ1dGVJbmRleCBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBLaW5kSUQpOworTExWTUF0dHJpYnV0ZVJlZiBMTFZNR2V0U3RyaW5nQXR0cmlidXRlQXRJbmRleChMTFZNVmFsdWVSZWYgRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUF0dHJpYnV0ZUluZGV4IElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqSywgdW5zaWduZWQgS0xlbik7Cit2b2lkIExMVk1SZW1vdmVFbnVtQXR0cmlidXRlQXRJbmRleChMTFZNVmFsdWVSZWYgRiwgTExWTUF0dHJpYnV0ZUluZGV4IElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEtpbmRJRCk7Cit2b2lkIExMVk1SZW1vdmVTdHJpbmdBdHRyaWJ1dGVBdEluZGV4KExMVk1WYWx1ZVJlZiBGLCBMTFZNQXR0cmlidXRlSW5kZXggSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpLLCB1bnNpZ25lZCBLTGVuKTsKKworLyoqCisgKiBBZGQgYSB0YXJnZXQtZGVwZW5kZW50IGF0dHJpYnV0ZSB0byBhIGZ1bmN0aW9uCisgKiBAc2VlIGxsdm06OkF0dHJCdWlsZGVyOjphZGRBdHRyaWJ1dGUoKQorICovCit2b2lkIExMVk1BZGRUYXJnZXREZXBlbmRlbnRGdW5jdGlvbkF0dHIoTExWTVZhbHVlUmVmIEZuLCBjb25zdCBjaGFyICpBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlYpOworCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ0NvcmVWYWx1ZUZ1bmN0aW9uUGFyYW1ldGVycyBGdW5jdGlvbiBQYXJhbWV0ZXJzCisgKgorICogRnVuY3Rpb25zIGluIHRoaXMgZ3JvdXAgcmVsYXRlIHRvIGFyZ3VtZW50cy9wYXJhbWV0ZXJzIG9uIGZ1bmN0aW9ucy4KKyAqCisgKiBGdW5jdGlvbnMgaW4gdGhpcyBncm91cCBleHBlY3QgTExWTVZhbHVlUmVmIGluc3RhbmNlcyB0aGF0IGNvcnJlc3BvbmQKKyAqIHRvIGxsdm06OkZ1bmN0aW9uIGluc3RhbmNlcy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogT2J0YWluIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBpbiBhIGZ1bmN0aW9uLgorICoKKyAqIEBzZWUgbGx2bTo6RnVuY3Rpb246OmFyZ19zaXplKCkKKyAqLwordW5zaWduZWQgTExWTUNvdW50UGFyYW1zKExMVk1WYWx1ZVJlZiBGbik7CisKKy8qKgorICogT2J0YWluIHRoZSBwYXJhbWV0ZXJzIGluIGEgZnVuY3Rpb24uCisgKgorICogVGhlIHRha2VzIGEgcG9pbnRlciB0byBhIHByZS1hbGxvY2F0ZWQgYXJyYXkgb2YgTExWTVZhbHVlUmVmIHRoYXQgaXMKKyAqIGF0IGxlYXN0IExMVk1Db3VudFBhcmFtcygpIGxvbmcuIFRoaXMgYXJyYXkgd2lsbCBiZSBmaWxsZWQgd2l0aAorICogTExWTVZhbHVlUmVmIGluc3RhbmNlcyB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBwYXJhbWV0ZXJzIHRoZQorICogZnVuY3Rpb24gcmVjZWl2ZXMuIEVhY2ggTExWTVZhbHVlUmVmIGNvcnJlc3BvbmRzIHRvIGEgbGx2bTo6QXJndW1lbnQKKyAqIGluc3RhbmNlLgorICoKKyAqIEBzZWUgbGx2bTo6RnVuY3Rpb246OmFyZ19iZWdpbigpCisgKi8KK3ZvaWQgTExWTUdldFBhcmFtcyhMTFZNVmFsdWVSZWYgRm4sIExMVk1WYWx1ZVJlZiAqUGFyYW1zKTsKKworLyoqCisgKiBPYnRhaW4gdGhlIHBhcmFtZXRlciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICoKKyAqIFBhcmFtZXRlcnMgYXJlIGluZGV4ZWQgZnJvbSAwLgorICoKKyAqIEBzZWUgbGx2bTo6RnVuY3Rpb246OmFyZ19iZWdpbigpCisgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNR2V0UGFyYW0oTExWTVZhbHVlUmVmIEZuLCB1bnNpZ25lZCBJbmRleCk7CisKKy8qKgorICogT2J0YWluIHRoZSBmdW5jdGlvbiB0byB3aGljaCB0aGlzIGFyZ3VtZW50IGJlbG9uZ3MuCisgKgorICogVW5saWtlIG90aGVyIGZ1bmN0aW9ucyBpbiB0aGlzIGdyb3VwLCB0aGlzIG9uZSB0YWtlcyBhbiBMTFZNVmFsdWVSZWYKKyAqIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBsbHZtOjpBdHRyaWJ1dGUuCisgKgorICogVGhlIHJldHVybmVkIExMVk1WYWx1ZVJlZiBpcyB0aGUgbGx2bTo6RnVuY3Rpb24gdG8gd2hpY2ggdGhpcworICogYXJndW1lbnQgYmVsb25ncy4KKyAqLworTExWTVZhbHVlUmVmIExMVk1HZXRQYXJhbVBhcmVudChMTFZNVmFsdWVSZWYgSW5zdCk7CisKKy8qKgorICogT2J0YWluIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gYSBmdW5jdGlvbi4KKyAqCisgKiBAc2VlIGxsdm06OkZ1bmN0aW9uOjphcmdfYmVnaW4oKQorICovCitMTFZNVmFsdWVSZWYgTExWTUdldEZpcnN0UGFyYW0oTExWTVZhbHVlUmVmIEZuKTsKKworLyoqCisgKiBPYnRhaW4gdGhlIGxhc3QgcGFyYW1ldGVyIHRvIGEgZnVuY3Rpb24uCisgKgorICogQHNlZSBsbHZtOjpGdW5jdGlvbjo6YXJnX2VuZCgpCisgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNR2V0TGFzdFBhcmFtKExMVk1WYWx1ZVJlZiBGbik7CisKKy8qKgorICogT2J0YWluIHRoZSBuZXh0IHBhcmFtZXRlciB0byBhIGZ1bmN0aW9uLgorICoKKyAqIFRoaXMgdGFrZXMgYW4gTExWTVZhbHVlUmVmIG9idGFpbmVkIGZyb20gTExWTUdldEZpcnN0UGFyYW0oKSAod2hpY2ggaXMKKyAqIGFjdHVhbGx5IGEgd3JhcHBlZCBpdGVyYXRvcikgYW5kIG9idGFpbnMgdGhlIG5leHQgcGFyYW1ldGVyIGZyb20gdGhlCisgKiB1bmRlcmx5aW5nIGl0ZXJhdG9yLgorICovCitMTFZNVmFsdWVSZWYgTExWTUdldE5leHRQYXJhbShMTFZNVmFsdWVSZWYgQXJnKTsKKworLyoqCisgKiBPYnRhaW4gdGhlIHByZXZpb3VzIHBhcmFtZXRlciB0byBhIGZ1bmN0aW9uLgorICoKKyAqIFRoaXMgaXMgdGhlIG9wcG9zaXRlIG9mIExMVk1HZXROZXh0UGFyYW0oKS4KKyAqLworTExWTVZhbHVlUmVmIExMVk1HZXRQcmV2aW91c1BhcmFtKExMVk1WYWx1ZVJlZiBBcmcpOworCisvKioKKyAqIFNldCB0aGUgYWxpZ25tZW50IGZvciBhIGZ1bmN0aW9uIHBhcmFtZXRlci4KKyAqCisgKiBAc2VlIGxsdm06OkFyZ3VtZW50OjphZGRBdHRyKCkKKyAqIEBzZWUgbGx2bTo6QXR0ckJ1aWxkZXI6OmFkZEFsaWdubWVudEF0dHIoKQorICovCit2b2lkIExMVk1TZXRQYXJhbUFsaWdubWVudChMTFZNVmFsdWVSZWYgQXJnLCB1bnNpZ25lZCBBbGlnbik7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ0NvcmVWYWx1ZU1ldGFkYXRhIE1ldGFkYXRhCisgKgorICogQHsKKyAqLworCisvKioKKyAqIE9idGFpbiBhIE1EU3RyaW5nIHZhbHVlIGZyb20gYSBjb250ZXh0LgorICoKKyAqIFRoZSByZXR1cm5lZCBpbnN0YW5jZSBjb3JyZXNwb25kcyB0byB0aGUgbGx2bTo6TURTdHJpbmcgY2xhc3MuCisgKgorICogVGhlIGluc3RhbmNlIGlzIHNwZWNpZmllZCBieSBzdHJpbmcgZGF0YSBvZiBhIHNwZWNpZmllZCBsZW5ndGguIFRoZQorICogc3RyaW5nIGNvbnRlbnQgaXMgY29waWVkLCBzbyB0aGUgYmFja2luZyBtZW1vcnkgY2FuIGJlIGZyZWVkIGFmdGVyCisgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCisgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNTURTdHJpbmdJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQywgY29uc3QgY2hhciAqU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTTGVuKTsKKworLyoqCisgKiBPYnRhaW4gYSBNRFN0cmluZyB2YWx1ZSBmcm9tIHRoZSBnbG9iYWwgY29udGV4dC4KKyAqLworTExWTVZhbHVlUmVmIExMVk1NRFN0cmluZyhjb25zdCBjaGFyICpTdHIsIHVuc2lnbmVkIFNMZW4pOworCisvKioKKyAqIE9idGFpbiBhIE1ETm9kZSB2YWx1ZSBmcm9tIGEgY29udGV4dC4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgY29ycmVzcG9uZHMgdG8gdGhlIGxsdm06Ok1ETm9kZSBjbGFzcy4KKyAqLworTExWTVZhbHVlUmVmIExMVk1NRE5vZGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQywgTExWTVZhbHVlUmVmICpWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ291bnQpOworCisvKioKKyAqIE9idGFpbiBhIE1ETm9kZSB2YWx1ZSBmcm9tIHRoZSBnbG9iYWwgY29udGV4dC4KKyAqLworTExWTVZhbHVlUmVmIExMVk1NRE5vZGUoTExWTVZhbHVlUmVmICpWYWxzLCB1bnNpZ25lZCBDb3VudCk7CisKKy8qKgorICogT2J0YWluIGEgTWV0YWRhdGEgYXMgYSBWYWx1ZS4KKyAqLworTExWTVZhbHVlUmVmIExMVk1NZXRhZGF0YUFzVmFsdWUoTExWTUNvbnRleHRSZWYgQywgTExWTU1ldGFkYXRhUmVmIE1EKTsKKworLyoqCisgKiBPYnRhaW4gYSBWYWx1ZSBhcyBhIE1ldGFkYXRhLgorICovCitMTFZNTWV0YWRhdGFSZWYgTExWTVZhbHVlQXNNZXRhZGF0YShMTFZNVmFsdWVSZWYgVmFsKTsKKworLyoqCisgKiBPYnRhaW4gdGhlIHVuZGVybHlpbmcgc3RyaW5nIGZyb20gYSBNRFN0cmluZyB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gViBJbnN0YW5jZSB0byBvYnRhaW4gc3RyaW5nIGZyb20uCisgKiBAcGFyYW0gTGVuZ3RoIE1lbW9yeSBhZGRyZXNzIHdoaWNoIHdpbGwgaG9sZCBsZW5ndGggb2YgcmV0dXJuZWQgc3RyaW5nLgorICogQHJldHVybiBTdHJpbmcgZGF0YSBpbiBNRFN0cmluZy4KKyAqLworY29uc3QgY2hhciAqTExWTUdldE1EU3RyaW5nKExMVk1WYWx1ZVJlZiBWLCB1bnNpZ25lZCAqTGVuZ3RoKTsKKworLyoqCisgKiBPYnRhaW4gdGhlIG51bWJlciBvZiBvcGVyYW5kcyBmcm9tIGFuIE1ETm9kZSB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gViBNRE5vZGUgdG8gZ2V0IG51bWJlciBvZiBvcGVyYW5kcyBmcm9tLgorICogQHJldHVybiBOdW1iZXIgb2Ygb3BlcmFuZHMgb2YgdGhlIE1ETm9kZS4KKyAqLwordW5zaWduZWQgTExWTUdldE1ETm9kZU51bU9wZXJhbmRzKExMVk1WYWx1ZVJlZiBWKTsKKworLyoqCisgKiBPYnRhaW4gdGhlIGdpdmVuIE1ETm9kZSdzIG9wZXJhbmRzLgorICoKKyAqIFRoZSBwYXNzZWQgTExWTVZhbHVlUmVmIHBvaW50ZXIgc2hvdWxkIHBvaW50IHRvIGVub3VnaCBtZW1vcnkgdG8gaG9sZCBhbGwgb2YKKyAqIHRoZSBvcGVyYW5kcyBvZiB0aGUgZ2l2ZW4gTUROb2RlIChzZWUgTExWTUdldE1ETm9kZU51bU9wZXJhbmRzKSBhcworICogTExWTVZhbHVlUmVmcy4gVGhpcyBtZW1vcnkgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgTExWTVZhbHVlUmVmcyBvZiB0aGUKKyAqIE1ETm9kZSdzIG9wZXJhbmRzLgorICoKKyAqIEBwYXJhbSBWIE1ETm9kZSB0byBnZXQgdGhlIG9wZXJhbmRzIGZyb20uCisgKiBAcGFyYW0gRGVzdCBEZXN0aW5hdGlvbiBhcnJheSBmb3Igb3BlcmFuZHMuCisgKi8KK3ZvaWQgTExWTUdldE1ETm9kZU9wZXJhbmRzKExMVk1WYWx1ZVJlZiBWLCBMTFZNVmFsdWVSZWYgKkRlc3QpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNDb3JlVmFsdWVCYXNpY0Jsb2NrIEJhc2ljIEJsb2NrCisgKgorICogQSBiYXNpYyBibG9jayByZXByZXNlbnRzIGEgc2luZ2xlIGVudHJ5IHNpbmdsZSBleGl0IHNlY3Rpb24gb2YgY29kZS4KKyAqIEJhc2ljIGJsb2NrcyBjb250YWluIGEgbGlzdCBvZiBpbnN0cnVjdGlvbnMgd2hpY2ggZm9ybSB0aGUgYm9keSBvZgorICogdGhlIGJsb2NrLgorICoKKyAqIEJhc2ljIGJsb2NrcyBiZWxvbmcgdG8gZnVuY3Rpb25zLiBUaGV5IGhhdmUgdGhlIHR5cGUgb2YgbGFiZWwuCisgKgorICogQmFzaWMgYmxvY2tzIGFyZSB0aGVtc2VsdmVzIHZhbHVlcy4gSG93ZXZlciwgdGhlIEMgQVBJIG1vZGVscyB0aGVtIGFzCisgKiBMTFZNQmFzaWNCbG9ja1JlZi4KKyAqCisgKiBAc2VlIGxsdm06OkJhc2ljQmxvY2sKKyAqCisgKiBAeworICovCisKKy8qKgorICogQ29udmVydCBhIGJhc2ljIGJsb2NrIGluc3RhbmNlIHRvIGEgdmFsdWUgdHlwZS4KKyAqLworTExWTVZhbHVlUmVmIExMVk1CYXNpY0Jsb2NrQXNWYWx1ZShMTFZNQmFzaWNCbG9ja1JlZiBCQik7CisKKy8qKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgYW4gTExWTVZhbHVlUmVmIGlzIGl0c2VsZiBhIGJhc2ljIGJsb2NrLgorICovCitMTFZNQm9vbCBMTFZNVmFsdWVJc0Jhc2ljQmxvY2soTExWTVZhbHVlUmVmIFZhbCk7CisKKy8qKgorICogQ29udmVydCBhbiBMTFZNVmFsdWVSZWYgdG8gYW4gTExWTUJhc2ljQmxvY2tSZWYgaW5zdGFuY2UuCisgKi8KK0xMVk1CYXNpY0Jsb2NrUmVmIExMVk1WYWx1ZUFzQmFzaWNCbG9jayhMTFZNVmFsdWVSZWYgVmFsKTsKKworLyoqCisgKiBPYnRhaW4gdGhlIHN0cmluZyBuYW1lIG9mIGEgYmFzaWMgYmxvY2suCisgKi8KK2NvbnN0IGNoYXIgKkxMVk1HZXRCYXNpY0Jsb2NrTmFtZShMTFZNQmFzaWNCbG9ja1JlZiBCQik7CisKKy8qKgorICogT2J0YWluIHRoZSBmdW5jdGlvbiB0byB3aGljaCBhIGJhc2ljIGJsb2NrIGJlbG9uZ3MuCisgKgorICogQHNlZSBsbHZtOjpCYXNpY0Jsb2NrOjpnZXRQYXJlbnQoKQorICovCitMTFZNVmFsdWVSZWYgTExWTUdldEJhc2ljQmxvY2tQYXJlbnQoTExWTUJhc2ljQmxvY2tSZWYgQkIpOworCisvKioKKyAqIE9idGFpbiB0aGUgdGVybWluYXRvciBpbnN0cnVjdGlvbiBmb3IgYSBiYXNpYyBibG9jay4KKyAqCisgKiBJZiB0aGUgYmFzaWMgYmxvY2sgZG9lcyBub3QgaGF2ZSBhIHRlcm1pbmF0b3IgKGl0IGlzIG5vdCB3ZWxsLWZvcm1lZAorICogaWYgaXQgZG9lc24ndCksIHRoZW4gTlVMTCBpcyByZXR1cm5lZC4KKyAqCisgKiBUaGUgcmV0dXJuZWQgTExWTVZhbHVlUmVmIGNvcnJlc3BvbmRzIHRvIGEgbGx2bTo6VGVybWluYXRvckluc3QuCisgKgorICogQHNlZSBsbHZtOjpCYXNpY0Jsb2NrOjpnZXRUZXJtaW5hdG9yKCkKKyAqLworTExWTVZhbHVlUmVmIExMVk1HZXRCYXNpY0Jsb2NrVGVybWluYXRvcihMTFZNQmFzaWNCbG9ja1JlZiBCQik7CisKKy8qKgorICogT2J0YWluIHRoZSBudW1iZXIgb2YgYmFzaWMgYmxvY2tzIGluIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIEZuIEZ1bmN0aW9uIHZhbHVlIHRvIG9wZXJhdGUgb24uCisgKi8KK3Vuc2lnbmVkIExMVk1Db3VudEJhc2ljQmxvY2tzKExMVk1WYWx1ZVJlZiBGbik7CisKKy8qKgorICogT2J0YWluIGFsbCBvZiB0aGUgYmFzaWMgYmxvY2tzIGluIGEgZnVuY3Rpb24uCisgKgorICogVGhpcyBvcGVyYXRlcyBvbiBhIGZ1bmN0aW9uIHZhbHVlLiBUaGUgQmFzaWNCbG9ja3MgcGFyYW1ldGVyIGlzIGEKKyAqIHBvaW50ZXIgdG8gYSBwcmUtYWxsb2NhdGVkIGFycmF5IG9mIExMVk1CYXNpY0Jsb2NrUmVmIG9mIGF0IGxlYXN0CisgKiBMTFZNQ291bnRCYXNpY0Jsb2NrcygpIGluIGxlbmd0aC4gVGhpcyBhcnJheSBpcyBwb3B1bGF0ZWQgd2l0aAorICogTExWTUJhc2ljQmxvY2tSZWYgaW5zdGFuY2VzLgorICovCit2b2lkIExMVk1HZXRCYXNpY0Jsb2NrcyhMTFZNVmFsdWVSZWYgRm4sIExMVk1CYXNpY0Jsb2NrUmVmICpCYXNpY0Jsb2Nrcyk7CisKKy8qKgorICogT2J0YWluIHRoZSBmaXJzdCBiYXNpYyBibG9jayBpbiBhIGZ1bmN0aW9uLgorICoKKyAqIFRoZSByZXR1cm5lZCBiYXNpYyBibG9jayBjYW4gYmUgdXNlZCBhcyBhbiBpdGVyYXRvci4gWW91IHdpbGwgbGlrZWx5CisgKiBldmVudHVhbGx5IGNhbGwgaW50byBMTFZNR2V0TmV4dEJhc2ljQmxvY2soKSB3aXRoIGl0LgorICoKKyAqIEBzZWUgbGx2bTo6RnVuY3Rpb246OmJlZ2luKCkKKyAqLworTExWTUJhc2ljQmxvY2tSZWYgTExWTUdldEZpcnN0QmFzaWNCbG9jayhMTFZNVmFsdWVSZWYgRm4pOworCisvKioKKyAqIE9idGFpbiB0aGUgbGFzdCBiYXNpYyBibG9jayBpbiBhIGZ1bmN0aW9uLgorICoKKyAqIEBzZWUgbGx2bTo6RnVuY3Rpb246OmVuZCgpCisgKi8KK0xMVk1CYXNpY0Jsb2NrUmVmIExMVk1HZXRMYXN0QmFzaWNCbG9jayhMTFZNVmFsdWVSZWYgRm4pOworCisvKioKKyAqIEFkdmFuY2UgYSBiYXNpYyBibG9jayBpdGVyYXRvci4KKyAqLworTExWTUJhc2ljQmxvY2tSZWYgTExWTUdldE5leHRCYXNpY0Jsb2NrKExMVk1CYXNpY0Jsb2NrUmVmIEJCKTsKKworLyoqCisgKiBHbyBiYWNrd2FyZHMgaW4gYSBiYXNpYyBibG9jayBpdGVyYXRvci4KKyAqLworTExWTUJhc2ljQmxvY2tSZWYgTExWTUdldFByZXZpb3VzQmFzaWNCbG9jayhMTFZNQmFzaWNCbG9ja1JlZiBCQik7CisKKy8qKgorICogT2J0YWluIHRoZSBiYXNpYyBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBlbnRyeSBwb2ludCBvZiBhCisgKiBmdW5jdGlvbi4KKyAqCisgKiBAc2VlIGxsdm06OkZ1bmN0aW9uOjpnZXRFbnRyeUJsb2NrKCkKKyAqLworTExWTUJhc2ljQmxvY2tSZWYgTExWTUdldEVudHJ5QmFzaWNCbG9jayhMTFZNVmFsdWVSZWYgRm4pOworCisvKioKKyAqIEFwcGVuZCBhIGJhc2ljIGJsb2NrIHRvIHRoZSBlbmQgb2YgYSBmdW5jdGlvbi4KKyAqCisgKiBAc2VlIGxsdm06OkJhc2ljQmxvY2s6OkNyZWF0ZSgpCisgKi8KK0xMVk1CYXNpY0Jsb2NrUmVmIExMVk1BcHBlbmRCYXNpY0Jsb2NrSW5Db250ZXh0KExMVk1Db250ZXh0UmVmIEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgRm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKKworLyoqCisgKiBBcHBlbmQgYSBiYXNpYyBibG9jayB0byB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gdXNpbmcgdGhlIGdsb2JhbAorICogY29udGV4dC4KKyAqCisgKiBAc2VlIGxsdm06OkJhc2ljQmxvY2s6OkNyZWF0ZSgpCisgKi8KK0xMVk1CYXNpY0Jsb2NrUmVmIExMVk1BcHBlbmRCYXNpY0Jsb2NrKExMVk1WYWx1ZVJlZiBGbiwgY29uc3QgY2hhciAqTmFtZSk7CisKKy8qKgorICogSW5zZXJ0IGEgYmFzaWMgYmxvY2sgaW4gYSBmdW5jdGlvbiBiZWZvcmUgYW5vdGhlciBiYXNpYyBibG9jay4KKyAqCisgKiBUaGUgZnVuY3Rpb24gdG8gYWRkIHRvIGlzIGRldGVybWluZWQgYnkgdGhlIGZ1bmN0aW9uIG9mIHRoZQorICogcGFzc2VkIGJhc2ljIGJsb2NrLgorICoKKyAqIEBzZWUgbGx2bTo6QmFzaWNCbG9jazo6Q3JlYXRlKCkKKyAqLworTExWTUJhc2ljQmxvY2tSZWYgTExWTUluc2VydEJhc2ljQmxvY2tJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1CYXNpY0Jsb2NrUmVmIEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CisKKy8qKgorICogSW5zZXJ0IGEgYmFzaWMgYmxvY2sgaW4gYSBmdW5jdGlvbiB1c2luZyB0aGUgZ2xvYmFsIGNvbnRleHQuCisgKgorICogQHNlZSBsbHZtOjpCYXNpY0Jsb2NrOjpDcmVhdGUoKQorICovCitMTFZNQmFzaWNCbG9ja1JlZiBMTFZNSW5zZXJ0QmFzaWNCbG9jayhMTFZNQmFzaWNCbG9ja1JlZiBJbnNlcnRCZWZvcmVCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworCisvKioKKyAqIFJlbW92ZSBhIGJhc2ljIGJsb2NrIGZyb20gYSBmdW5jdGlvbiBhbmQgZGVsZXRlIGl0LgorICoKKyAqIFRoaXMgZGVsZXRlcyB0aGUgYmFzaWMgYmxvY2sgZnJvbSBpdHMgY29udGFpbmluZyBmdW5jdGlvbiBhbmQgZGVsZXRlcworICogdGhlIGJhc2ljIGJsb2NrIGl0c2VsZi4KKyAqCisgKiBAc2VlIGxsdm06OkJhc2ljQmxvY2s6OmVyYXNlRnJvbVBhcmVudCgpCisgKi8KK3ZvaWQgTExWTURlbGV0ZUJhc2ljQmxvY2soTExWTUJhc2ljQmxvY2tSZWYgQkIpOworCisvKioKKyAqIFJlbW92ZSBhIGJhc2ljIGJsb2NrIGZyb20gYSBmdW5jdGlvbi4KKyAqCisgKiBUaGlzIGRlbGV0ZXMgdGhlIGJhc2ljIGJsb2NrIGZyb20gaXRzIGNvbnRhaW5pbmcgZnVuY3Rpb24gYnV0IGtlZXAKKyAqIHRoZSBiYXNpYyBibG9jayBhbGl2ZS4KKyAqCisgKiBAc2VlIGxsdm06OkJhc2ljQmxvY2s6OnJlbW92ZUZyb21QYXJlbnQoKQorICovCit2b2lkIExMVk1SZW1vdmVCYXNpY0Jsb2NrRnJvbVBhcmVudChMTFZNQmFzaWNCbG9ja1JlZiBCQik7CisKKy8qKgorICogTW92ZSBhIGJhc2ljIGJsb2NrIHRvIGJlZm9yZSBhbm90aGVyIG9uZS4KKyAqCisgKiBAc2VlIGxsdm06OkJhc2ljQmxvY2s6Om1vdmVCZWZvcmUoKQorICovCit2b2lkIExMVk1Nb3ZlQmFzaWNCbG9ja0JlZm9yZShMTFZNQmFzaWNCbG9ja1JlZiBCQiwgTExWTUJhc2ljQmxvY2tSZWYgTW92ZVBvcyk7CisKKy8qKgorICogTW92ZSBhIGJhc2ljIGJsb2NrIHRvIGFmdGVyIGFub3RoZXIgb25lLgorICoKKyAqIEBzZWUgbGx2bTo6QmFzaWNCbG9jazo6bW92ZUFmdGVyKCkKKyAqLwordm9pZCBMTFZNTW92ZUJhc2ljQmxvY2tBZnRlcihMTFZNQmFzaWNCbG9ja1JlZiBCQiwgTExWTUJhc2ljQmxvY2tSZWYgTW92ZVBvcyk7CisKKy8qKgorICogT2J0YWluIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpbiBhIGJhc2ljIGJsb2NrLgorICoKKyAqIFRoZSByZXR1cm5lZCBMTFZNVmFsdWVSZWYgY29ycmVzcG9uZHMgdG8gYSBsbHZtOjpJbnN0cnVjdGlvbgorICogaW5zdGFuY2UuCisgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNR2V0Rmlyc3RJbnN0cnVjdGlvbihMTFZNQmFzaWNCbG9ja1JlZiBCQik7CisKKy8qKgorICogT2J0YWluIHRoZSBsYXN0IGluc3RydWN0aW9uIGluIGEgYmFzaWMgYmxvY2suCisgKgorICogVGhlIHJldHVybmVkIExMVk1WYWx1ZVJlZiBjb3JyZXNwb25kcyB0byBhbiBMTFZNOkluc3RydWN0aW9uLgorICovCitMTFZNVmFsdWVSZWYgTExWTUdldExhc3RJbnN0cnVjdGlvbihMTFZNQmFzaWNCbG9ja1JlZiBCQik7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ0NvcmVWYWx1ZUluc3RydWN0aW9uIEluc3RydWN0aW9ucworICoKKyAqIEZ1bmN0aW9ucyBpbiB0aGlzIGdyb3VwIHJlbGF0ZSB0byB0aGUgaW5zcGVjdGlvbiBhbmQgbWFuaXB1bGF0aW9uIG9mCisgKiBpbmRpdmlkdWFsIGluc3RydWN0aW9ucy4KKyAqCisgKiBJbiB0aGUgQysrIEFQSSwgYW4gaW5zdHJ1Y3Rpb24gaXMgbW9kZWxlZCBieSBsbHZtOjpJbnN0cnVjdGlvbi4gVGhpcworICogY2xhc3MgaGFzIGEgbGFyZ2UgbnVtYmVyIG9mIGRlc2NlbmRlbnRzLiBsbHZtOjpJbnN0cnVjdGlvbiBpcyBhCisgKiBsbHZtOjpWYWx1ZSBhbmQgaW4gdGhlIEMgQVBJLCBpbnN0cnVjdGlvbnMgYXJlIG1vZGVsZWQgYnkKKyAqIExMVk1WYWx1ZVJlZi4KKyAqCisgKiBUaGlzIGdyb3VwIGFsc28gY29udGFpbnMgc3ViLWdyb3VwcyB3aGljaCBvcGVyYXRlIG9uIHNwZWNpZmljCisgKiBsbHZtOjpJbnN0cnVjdGlvbiB0eXBlcywgZS5nLiBsbHZtOjpDYWxsSW5zdC4KKyAqCisgKiBAeworICovCisKKy8qKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgYW4gaW5zdHJ1Y3Rpb24gaGFzIGFueSBtZXRhZGF0YSBhdHRhY2hlZC4KKyAqLworaW50IExMVk1IYXNNZXRhZGF0YShMTFZNVmFsdWVSZWYgVmFsKTsKKworLyoqCisgKiBSZXR1cm4gbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGFuIGluc3RydWN0aW9uIHZhbHVlLgorICovCitMTFZNVmFsdWVSZWYgTExWTUdldE1ldGFkYXRhKExMVk1WYWx1ZVJlZiBWYWwsIHVuc2lnbmVkIEtpbmRJRCk7CisKKy8qKgorICogU2V0IG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBhbiBpbnN0cnVjdGlvbiB2YWx1ZS4KKyAqLwordm9pZCBMTFZNU2V0TWV0YWRhdGEoTExWTVZhbHVlUmVmIFZhbCwgdW5zaWduZWQgS2luZElELCBMTFZNVmFsdWVSZWYgTm9kZSk7CisKKy8qKgorICogT2J0YWluIHRoZSBiYXNpYyBibG9jayB0byB3aGljaCBhbiBpbnN0cnVjdGlvbiBiZWxvbmdzLgorICoKKyAqIEBzZWUgbGx2bTo6SW5zdHJ1Y3Rpb246OmdldFBhcmVudCgpCisgKi8KK0xMVk1CYXNpY0Jsb2NrUmVmIExMVk1HZXRJbnN0cnVjdGlvblBhcmVudChMTFZNVmFsdWVSZWYgSW5zdCk7CisKKy8qKgorICogT2J0YWluIHRoZSBpbnN0cnVjdGlvbiB0aGF0IG9jY3VycyBhZnRlciB0aGUgb25lIHNwZWNpZmllZC4KKyAqCisgKiBUaGUgbmV4dCBpbnN0cnVjdGlvbiB3aWxsIGJlIGZyb20gdGhlIHNhbWUgYmFzaWMgYmxvY2suCisgKgorICogSWYgdGhpcyBpcyB0aGUgbGFzdCBpbnN0cnVjdGlvbiBpbiBhIGJhc2ljIGJsb2NrLCBOVUxMIHdpbGwgYmUKKyAqIHJldHVybmVkLgorICovCitMTFZNVmFsdWVSZWYgTExWTUdldE5leHRJbnN0cnVjdGlvbihMTFZNVmFsdWVSZWYgSW5zdCk7CisKKy8qKgorICogT2J0YWluIHRoZSBpbnN0cnVjdGlvbiB0aGF0IG9jY3VycmVkIGJlZm9yZSB0aGlzIG9uZS4KKyAqCisgKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgdGhlIGZpcnN0IGluc3RydWN0aW9uIGluIGEgYmFzaWMgYmxvY2ssIE5VTEwKKyAqIHdpbGwgYmUgcmV0dXJuZWQuCisgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNR2V0UHJldmlvdXNJbnN0cnVjdGlvbihMTFZNVmFsdWVSZWYgSW5zdCk7CisKKy8qKgorICogUmVtb3ZlIGFuZCBkZWxldGUgYW4gaW5zdHJ1Y3Rpb24uCisgKgorICogVGhlIGluc3RydWN0aW9uIHNwZWNpZmllZCBpcyByZW1vdmVkIGZyb20gaXRzIGNvbnRhaW5pbmcgYnVpbGRpbmcKKyAqIGJsb2NrIGJ1dCBpcyBrZXB0IGFsaXZlLgorICoKKyAqIEBzZWUgbGx2bTo6SW5zdHJ1Y3Rpb246OnJlbW92ZUZyb21QYXJlbnQoKQorICovCit2b2lkIExMVk1JbnN0cnVjdGlvblJlbW92ZUZyb21QYXJlbnQoTExWTVZhbHVlUmVmIEluc3QpOworCisvKioKKyAqIFJlbW92ZSBhbmQgZGVsZXRlIGFuIGluc3RydWN0aW9uLgorICoKKyAqIFRoZSBpbnN0cnVjdGlvbiBzcGVjaWZpZWQgaXMgcmVtb3ZlZCBmcm9tIGl0cyBjb250YWluaW5nIGJ1aWxkaW5nCisgKiBibG9jayBhbmQgdGhlbiBkZWxldGVkLgorICoKKyAqIEBzZWUgbGx2bTo6SW5zdHJ1Y3Rpb246OmVyYXNlRnJvbVBhcmVudCgpCisgKi8KK3ZvaWQgTExWTUluc3RydWN0aW9uRXJhc2VGcm9tUGFyZW50KExMVk1WYWx1ZVJlZiBJbnN0KTsKKworLyoqCisgKiBPYnRhaW4gdGhlIGNvZGUgb3Bjb2RlIGZvciBhbiBpbmRpdmlkdWFsIGluc3RydWN0aW9uLgorICoKKyAqIEBzZWUgbGx2bTo6SW5zdHJ1Y3Rpb246OmdldE9wQ29kZSgpCisgKi8KK0xMVk1PcGNvZGUgTExWTUdldEluc3RydWN0aW9uT3Bjb2RlKExMVk1WYWx1ZVJlZiBJbnN0KTsKKworLyoqCisgKiBPYnRhaW4gdGhlIHByZWRpY2F0ZSBvZiBhbiBpbnN0cnVjdGlvbi4KKyAqCisgKiBUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIGluc3RydWN0aW9ucyB0aGF0IGNvcnJlc3BvbmQgdG8gbGx2bTo6SUNtcEluc3QKKyAqIG9yIGxsdm06OkNvbnN0YW50RXhwciB3aG9zZSBvcGNvZGUgaXMgbGx2bTo6SW5zdHJ1Y3Rpb246OklDbXAuCisgKgorICogQHNlZSBsbHZtOjpJQ21wSW5zdDo6Z2V0UHJlZGljYXRlKCkKKyAqLworTExWTUludFByZWRpY2F0ZSBMTFZNR2V0SUNtcFByZWRpY2F0ZShMTFZNVmFsdWVSZWYgSW5zdCk7CisKKy8qKgorICogT2J0YWluIHRoZSBmbG9hdCBwcmVkaWNhdGUgb2YgYW4gaW5zdHJ1Y3Rpb24uCisgKgorICogVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBpbnN0cnVjdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvIGxsdm06OkZDbXBJbnN0CisgKiBvciBsbHZtOjpDb25zdGFudEV4cHIgd2hvc2Ugb3Bjb2RlIGlzIGxsdm06Okluc3RydWN0aW9uOjpGQ21wLgorICoKKyAqIEBzZWUgbGx2bTo6RkNtcEluc3Q6OmdldFByZWRpY2F0ZSgpCisgKi8KK0xMVk1SZWFsUHJlZGljYXRlIExMVk1HZXRGQ21wUHJlZGljYXRlKExMVk1WYWx1ZVJlZiBJbnN0KTsKKworLyoqCisgKiBDcmVhdGUgYSBjb3B5IG9mICd0aGlzJyBpbnN0cnVjdGlvbiB0aGF0IGlzIGlkZW50aWNhbCBpbiBhbGwgd2F5cworICogZXhjZXB0IHRoZSBmb2xsb3dpbmc6CisgKiAgICogVGhlIGluc3RydWN0aW9uIGhhcyBubyBwYXJlbnQKKyAqICAgKiBUaGUgaW5zdHJ1Y3Rpb24gaGFzIG5vIG5hbWUKKyAqCisgKiBAc2VlIGxsdm06Okluc3RydWN0aW9uOjpjbG9uZSgpCisgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNSW5zdHJ1Y3Rpb25DbG9uZShMTFZNVmFsdWVSZWYgSW5zdCk7CisKKy8qKgorICogQGRlZmdyb3VwIExMVk1DQ29yZVZhbHVlSW5zdHJ1Y3Rpb25DYWxsIENhbGwgU2l0ZXMgYW5kIEludm9jYXRpb25zCisgKgorICogRnVuY3Rpb25zIGluIHRoaXMgZ3JvdXAgYXBwbHkgdG8gaW5zdHJ1Y3Rpb25zIHRoYXQgcmVmZXIgdG8gY2FsbAorICogc2l0ZXMgYW5kIGludm9jYXRpb25zLiBUaGVzZSBjb3JyZXNwb25kIHRvIEMrKyB0eXBlcyBpbiB0aGUKKyAqIGxsdm06OkNhbGxJbnN0IGNsYXNzIHRyZWUuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIE9idGFpbiB0aGUgYXJndW1lbnQgY291bnQgZm9yIGEgY2FsbCBpbnN0cnVjdGlvbi4KKyAqCisgKiBUaGlzIGV4cGVjdHMgYW4gTExWTVZhbHVlUmVmIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBsbHZtOjpDYWxsSW5zdCwKKyAqIGxsdm06Okludm9rZUluc3QsIG9yIGxsdm06RnVuY2xldFBhZEluc3QuCisgKgorICogQHNlZSBsbHZtOjpDYWxsSW5zdDo6Z2V0TnVtQXJnT3BlcmFuZHMoKQorICogQHNlZSBsbHZtOjpJbnZva2VJbnN0OjpnZXROdW1BcmdPcGVyYW5kcygpCisgKiBAc2VlIGxsdm06OkZ1bmNsZXRQYWRJbnN0OjpnZXROdW1BcmdPcGVyYW5kcygpCisgKi8KK3Vuc2lnbmVkIExMVk1HZXROdW1BcmdPcGVyYW5kcyhMTFZNVmFsdWVSZWYgSW5zdHIpOworCisvKioKKyAqIFNldCB0aGUgY2FsbGluZyBjb252ZW50aW9uIGZvciBhIGNhbGwgaW5zdHJ1Y3Rpb24uCisgKgorICogVGhpcyBleHBlY3RzIGFuIExMVk1WYWx1ZVJlZiB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgbGx2bTo6Q2FsbEluc3Qgb3IKKyAqIGxsdm06Okludm9rZUluc3QuCisgKgorICogQHNlZSBsbHZtOjpDYWxsSW5zdDo6c2V0Q2FsbGluZ0NvbnYoKQorICogQHNlZSBsbHZtOjpJbnZva2VJbnN0OjpzZXRDYWxsaW5nQ29udigpCisgKi8KK3ZvaWQgTExWTVNldEluc3RydWN0aW9uQ2FsbENvbnYoTExWTVZhbHVlUmVmIEluc3RyLCB1bnNpZ25lZCBDQyk7CisKKy8qKgorICogT2J0YWluIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIGEgY2FsbCBpbnN0cnVjdGlvbi4KKyAqCisgKiBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZiBMTFZNU2V0SW5zdHJ1Y3Rpb25DYWxsQ29udigpLiBSZWFkcyBpdHMKKyAqIHVzYWdlLgorICoKKyAqIEBzZWUgTExWTVNldEluc3RydWN0aW9uQ2FsbENvbnYoKQorICovCit1bnNpZ25lZCBMTFZNR2V0SW5zdHJ1Y3Rpb25DYWxsQ29udihMTFZNVmFsdWVSZWYgSW5zdHIpOworCit2b2lkIExMVk1TZXRJbnN0clBhcmFtQWxpZ25tZW50KExMVk1WYWx1ZVJlZiBJbnN0ciwgdW5zaWduZWQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduKTsKKwordm9pZCBMTFZNQWRkQ2FsbFNpdGVBdHRyaWJ1dGUoTExWTVZhbHVlUmVmIEMsIExMVk1BdHRyaWJ1dGVJbmRleCBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQXR0cmlidXRlUmVmIEEpOwordW5zaWduZWQgTExWTUdldENhbGxTaXRlQXR0cmlidXRlQ291bnQoTExWTVZhbHVlUmVmIEMsIExMVk1BdHRyaWJ1dGVJbmRleCBJZHgpOwordm9pZCBMTFZNR2V0Q2FsbFNpdGVBdHRyaWJ1dGVzKExMVk1WYWx1ZVJlZiBDLCBMTFZNQXR0cmlidXRlSW5kZXggSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1BdHRyaWJ1dGVSZWYgKkF0dHJzKTsKK0xMVk1BdHRyaWJ1dGVSZWYgTExWTUdldENhbGxTaXRlRW51bUF0dHJpYnV0ZShMTFZNVmFsdWVSZWYgQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQXR0cmlidXRlSW5kZXggSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEtpbmRJRCk7CitMTFZNQXR0cmlidXRlUmVmIExMVk1HZXRDYWxsU2l0ZVN0cmluZ0F0dHJpYnV0ZShMTFZNVmFsdWVSZWYgQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1BdHRyaWJ1dGVJbmRleCBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpLLCB1bnNpZ25lZCBLTGVuKTsKK3ZvaWQgTExWTVJlbW92ZUNhbGxTaXRlRW51bUF0dHJpYnV0ZShMTFZNVmFsdWVSZWYgQywgTExWTUF0dHJpYnV0ZUluZGV4IElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBLaW5kSUQpOwordm9pZCBMTFZNUmVtb3ZlQ2FsbFNpdGVTdHJpbmdBdHRyaWJ1dGUoTExWTVZhbHVlUmVmIEMsIExMVk1BdHRyaWJ1dGVJbmRleCBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpLLCB1bnNpZ25lZCBLTGVuKTsKKworLyoqCisgKiBPYnRhaW4gdGhlIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIGludm9rZWQgYnkgdGhpcyBpbnN0cnVjdGlvbi4KKyAqCisgKiBUaGlzIGV4cGVjdHMgYW4gTExWTVZhbHVlUmVmIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBsbHZtOjpDYWxsSW5zdCBvcgorICogbGx2bTo6SW52b2tlSW5zdC4KKyAqCisgKiBAc2VlIGxsdm06OkNhbGxJbnN0OjpnZXRDYWxsZWRWYWx1ZSgpCisgKiBAc2VlIGxsdm06Okludm9rZUluc3Q6OmdldENhbGxlZFZhbHVlKCkKKyAqLworTExWTVZhbHVlUmVmIExMVk1HZXRDYWxsZWRWYWx1ZShMTFZNVmFsdWVSZWYgSW5zdHIpOworCisvKioKKyAqIE9idGFpbiB3aGV0aGVyIGEgY2FsbCBpbnN0cnVjdGlvbiBpcyBhIHRhaWwgY2FsbC4KKyAqCisgKiBUaGlzIG9ubHkgd29ya3Mgb24gbGx2bTo6Q2FsbEluc3QgaW5zdHJ1Y3Rpb25zLgorICoKKyAqIEBzZWUgbGx2bTo6Q2FsbEluc3Q6OmlzVGFpbENhbGwoKQorICovCitMTFZNQm9vbCBMTFZNSXNUYWlsQ2FsbChMTFZNVmFsdWVSZWYgQ2FsbEluc3QpOworCisvKioKKyAqIFNldCB3aGV0aGVyIGEgY2FsbCBpbnN0cnVjdGlvbiBpcyBhIHRhaWwgY2FsbC4KKyAqCisgKiBUaGlzIG9ubHkgd29ya3Mgb24gbGx2bTo6Q2FsbEluc3QgaW5zdHJ1Y3Rpb25zLgorICoKKyAqIEBzZWUgbGx2bTo6Q2FsbEluc3Q6OnNldFRhaWxDYWxsKCkKKyAqLwordm9pZCBMTFZNU2V0VGFpbENhbGwoTExWTVZhbHVlUmVmIENhbGxJbnN0LCBMTFZNQm9vbCBJc1RhaWxDYWxsKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIG5vcm1hbCBkZXN0aW5hdGlvbiBiYXNpYyBibG9jay4KKyAqCisgKiBUaGlzIG9ubHkgd29ya3Mgb24gbGx2bTo6SW52b2tlSW5zdCBpbnN0cnVjdGlvbnMuCisgKgorICogQHNlZSBsbHZtOjpJbnZva2VJbnN0OjpnZXROb3JtYWxEZXN0KCkKKyAqLworTExWTUJhc2ljQmxvY2tSZWYgTExWTUdldE5vcm1hbERlc3QoTExWTVZhbHVlUmVmIEludm9rZUluc3QpOworCisvKioKKyAqIFJldHVybiB0aGUgdW53aW5kIGRlc3RpbmF0aW9uIGJhc2ljIGJsb2NrLgorICoKKyAqIFdvcmtzIG9uIGxsdm06Okludm9rZUluc3QsIGxsdm06OkNsZWFudXBSZXR1cm5JbnN0LCBhbmQKKyAqIGxsdm06OkNhdGNoU3dpdGNoSW5zdCBpbnN0cnVjdGlvbnMuCisgKgorICogQHNlZSBsbHZtOjpJbnZva2VJbnN0OjpnZXRVbndpbmREZXN0KCkKKyAqIEBzZWUgbGx2bTo6Q2xlYW51cFJldHVybkluc3Q6OmdldFVud2luZERlc3QoKQorICogQHNlZSBsbHZtOjpDYXRjaFN3aXRjaEluc3Q6OmdldFVud2luZERlc3QoKQorICovCitMTFZNQmFzaWNCbG9ja1JlZiBMTFZNR2V0VW53aW5kRGVzdChMTFZNVmFsdWVSZWYgSW52b2tlSW5zdCk7CisKKy8qKgorICogU2V0IHRoZSBub3JtYWwgZGVzdGluYXRpb24gYmFzaWMgYmxvY2suCisgKgorICogVGhpcyBvbmx5IHdvcmtzIG9uIGxsdm06Okludm9rZUluc3QgaW5zdHJ1Y3Rpb25zLgorICoKKyAqIEBzZWUgbGx2bTo6SW52b2tlSW5zdDo6c2V0Tm9ybWFsRGVzdCgpCisgKi8KK3ZvaWQgTExWTVNldE5vcm1hbERlc3QoTExWTVZhbHVlUmVmIEludm9rZUluc3QsIExMVk1CYXNpY0Jsb2NrUmVmIEIpOworCisvKioKKyAqIFNldCB0aGUgdW53aW5kIGRlc3RpbmF0aW9uIGJhc2ljIGJsb2NrLgorICoKKyAqIFdvcmtzIG9uIGxsdm06Okludm9rZUluc3QsIGxsdm06OkNsZWFudXBSZXR1cm5JbnN0LCBhbmQKKyAqIGxsdm06OkNhdGNoU3dpdGNoSW5zdCBpbnN0cnVjdGlvbnMuCisgKgorICogQHNlZSBsbHZtOjpJbnZva2VJbnN0OjpzZXRVbndpbmREZXN0KCkKKyAqIEBzZWUgbGx2bTo6Q2xlYW51cFJldHVybkluc3Q6OnNldFVud2luZERlc3QoKQorICogQHNlZSBsbHZtOjpDYXRjaFN3aXRjaEluc3Q6OnNldFVud2luZERlc3QoKQorICovCit2b2lkIExMVk1TZXRVbndpbmREZXN0KExMVk1WYWx1ZVJlZiBJbnZva2VJbnN0LCBMTFZNQmFzaWNCbG9ja1JlZiBCKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIExMVk1DQ29yZVZhbHVlSW5zdHJ1Y3Rpb25UZXJtaW5hdG9yIFRlcm1pbmF0b3JzCisgKgorICogRnVuY3Rpb25zIGluIHRoaXMgZ3JvdXAgb25seSBhcHBseSB0byBpbnN0cnVjdGlvbnMgdGhhdCBtYXAgdG8KKyAqIGxsdm06OlRlcm1pbmF0b3JJbnN0IGluc3RhbmNlcy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc29ycyB0aGF0IHRoaXMgdGVybWluYXRvciBoYXMuCisgKgorICogQHNlZSBsbHZtOjpUZXJtaW5hdG9ySW5zdDo6Z2V0TnVtU3VjY2Vzc29ycworICovCit1bnNpZ25lZCBMTFZNR2V0TnVtU3VjY2Vzc29ycyhMTFZNVmFsdWVSZWYgVGVybSk7CisKKy8qKgorICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgc3VjY2Vzc29yLgorICoKKyAqIEBzZWUgbGx2bTo6VGVybWluYXRvckluc3Q6OmdldFN1Y2Nlc3NvcgorICovCitMTFZNQmFzaWNCbG9ja1JlZiBMTFZNR2V0U3VjY2Vzc29yKExMVk1WYWx1ZVJlZiBUZXJtLCB1bnNpZ25lZCBpKTsKKworLyoqCisgKiBVcGRhdGUgdGhlIHNwZWNpZmllZCBzdWNjZXNzb3IgdG8gcG9pbnQgYXQgdGhlIHByb3ZpZGVkIGJsb2NrLgorICoKKyAqIEBzZWUgbGx2bTo6VGVybWluYXRvckluc3Q6OnNldFN1Y2Nlc3NvcgorICovCit2b2lkIExMVk1TZXRTdWNjZXNzb3IoTExWTVZhbHVlUmVmIFRlcm0sIHVuc2lnbmVkIGksIExMVk1CYXNpY0Jsb2NrUmVmIGJsb2NrKTsKKworLyoqCisgKiBSZXR1cm4gaWYgYSBicmFuY2ggaXMgY29uZGl0aW9uYWwuCisgKgorICogVGhpcyBvbmx5IHdvcmtzIG9uIGxsdm06OkJyYW5jaEluc3QgaW5zdHJ1Y3Rpb25zLgorICoKKyAqIEBzZWUgbGx2bTo6QnJhbmNoSW5zdDo6aXNDb25kaXRpb25hbAorICovCitMTFZNQm9vbCBMTFZNSXNDb25kaXRpb25hbChMTFZNVmFsdWVSZWYgQnJhbmNoKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGNvbmRpdGlvbiBvZiBhIGJyYW5jaCBpbnN0cnVjdGlvbi4KKyAqCisgKiBUaGlzIG9ubHkgd29ya3Mgb24gbGx2bTo6QnJhbmNoSW5zdCBpbnN0cnVjdGlvbnMuCisgKgorICogQHNlZSBsbHZtOjpCcmFuY2hJbnN0OjpnZXRDb25kaXRpb24KKyAqLworTExWTVZhbHVlUmVmIExMVk1HZXRDb25kaXRpb24oTExWTVZhbHVlUmVmIEJyYW5jaCk7CisKKy8qKgorICogU2V0IHRoZSBjb25kaXRpb24gb2YgYSBicmFuY2ggaW5zdHJ1Y3Rpb24uCisgKgorICogVGhpcyBvbmx5IHdvcmtzIG9uIGxsdm06OkJyYW5jaEluc3QgaW5zdHJ1Y3Rpb25zLgorICoKKyAqIEBzZWUgbGx2bTo6QnJhbmNoSW5zdDo6c2V0Q29uZGl0aW9uCisgKi8KK3ZvaWQgTExWTVNldENvbmRpdGlvbihMTFZNVmFsdWVSZWYgQnJhbmNoLCBMTFZNVmFsdWVSZWYgQ29uZCk7CisKKy8qKgorICogT2J0YWluIHRoZSBkZWZhdWx0IGRlc3RpbmF0aW9uIGJhc2ljIGJsb2NrIG9mIGEgc3dpdGNoIGluc3RydWN0aW9uLgorICoKKyAqIFRoaXMgb25seSB3b3JrcyBvbiBsbHZtOjpTd2l0Y2hJbnN0IGluc3RydWN0aW9ucy4KKyAqCisgKiBAc2VlIGxsdm06OlN3aXRjaEluc3Q6OmdldERlZmF1bHREZXN0KCkKKyAqLworTExWTUJhc2ljQmxvY2tSZWYgTExWTUdldFN3aXRjaERlZmF1bHREZXN0KExMVk1WYWx1ZVJlZiBTd2l0Y2hJbnN0cik7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ0NvcmVWYWx1ZUluc3RydWN0aW9uQWxsb2NhIEFsbG9jYXMKKyAqCisgKiBGdW5jdGlvbnMgaW4gdGhpcyBncm91cCBvbmx5IGFwcGx5IHRvIGluc3RydWN0aW9ucyB0aGF0IG1hcCB0bworICogbGx2bTo6QWxsb2NhSW5zdCBpbnN0YW5jZXMuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIE9idGFpbiB0aGUgdHlwZSB0aGF0IGlzIGJlaW5nIGFsbG9jYXRlZCBieSB0aGUgYWxsb2NhIGluc3RydWN0aW9uLgorICovCitMTFZNVHlwZVJlZiBMTFZNR2V0QWxsb2NhdGVkVHlwZShMTFZNVmFsdWVSZWYgQWxsb2NhKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIExMVk1DQ29yZVZhbHVlSW5zdHJ1Y3Rpb25HZXRFbGVtZW50UG9pbnRlciBHRVBzCisgKgorICogRnVuY3Rpb25zIGluIHRoaXMgZ3JvdXAgb25seSBhcHBseSB0byBpbnN0cnVjdGlvbnMgdGhhdCBtYXAgdG8KKyAqIGxsdm06OkdldEVsZW1lbnRQdHJJbnN0IGluc3RhbmNlcy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gR0VQIGluc3RydWN0aW9uIGlzIGluYm91bmRzLgorICovCitMTFZNQm9vbCBMTFZNSXNJbkJvdW5kcyhMTFZNVmFsdWVSZWYgR0VQKTsKKworLyoqCisgKiBTZXQgdGhlIGdpdmVuIEdFUCBpbnN0cnVjdGlvbiB0byBiZSBpbmJvdW5kcyBvciBub3QuCisgKi8KK3ZvaWQgTExWTVNldElzSW5Cb3VuZHMoTExWTVZhbHVlUmVmIEdFUCwgTExWTUJvb2wgSW5Cb3VuZHMpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNDb3JlVmFsdWVJbnN0cnVjdGlvblBISU5vZGUgUEhJIE5vZGVzCisgKgorICogRnVuY3Rpb25zIGluIHRoaXMgZ3JvdXAgb25seSBhcHBseSB0byBpbnN0cnVjdGlvbnMgdGhhdCBtYXAgdG8KKyAqIGxsdm06OlBISU5vZGUgaW5zdGFuY2VzLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBBZGQgYW4gaW5jb21pbmcgdmFsdWUgdG8gdGhlIGVuZCBvZiBhIFBISSBsaXN0LgorICovCit2b2lkIExMVk1BZGRJbmNvbWluZyhMTFZNVmFsdWVSZWYgUGhpTm9kZSwgTExWTVZhbHVlUmVmICpJbmNvbWluZ1ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgIExMVk1CYXNpY0Jsb2NrUmVmICpJbmNvbWluZ0Jsb2NrcywgdW5zaWduZWQgQ291bnQpOworCisvKioKKyAqIE9idGFpbiB0aGUgbnVtYmVyIG9mIGluY29taW5nIGJhc2ljIGJsb2NrcyB0byBhIFBISSBub2RlLgorICovCit1bnNpZ25lZCBMTFZNQ291bnRJbmNvbWluZyhMTFZNVmFsdWVSZWYgUGhpTm9kZSk7CisKKy8qKgorICogT2J0YWluIGFuIGluY29taW5nIHZhbHVlIHRvIGEgUEhJIG5vZGUgYXMgYW4gTExWTVZhbHVlUmVmLgorICovCitMTFZNVmFsdWVSZWYgTExWTUdldEluY29taW5nVmFsdWUoTExWTVZhbHVlUmVmIFBoaU5vZGUsIHVuc2lnbmVkIEluZGV4KTsKKworLyoqCisgKiBPYnRhaW4gYW4gaW5jb21pbmcgdmFsdWUgdG8gYSBQSEkgbm9kZSBhcyBhbiBMTFZNQmFzaWNCbG9ja1JlZi4KKyAqLworTExWTUJhc2ljQmxvY2tSZWYgTExWTUdldEluY29taW5nQmxvY2soTExWTVZhbHVlUmVmIFBoaU5vZGUsIHVuc2lnbmVkIEluZGV4KTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIExMVk1DQ29yZVZhbHVlSW5zdHJ1Y3Rpb25FeHRyYWN0VmFsdWUgRXh0cmFjdFZhbHVlCisgKiBAZGVmZ3JvdXAgTExWTUNDb3JlVmFsdWVJbnN0cnVjdGlvbkluc2VydFZhbHVlIEluc2VydFZhbHVlCisgKgorICogRnVuY3Rpb25zIGluIHRoaXMgZ3JvdXAgb25seSBhcHBseSB0byBpbnN0cnVjdGlvbnMgdGhhdCBtYXAgdG8KKyAqIGxsdm06OkV4dHJhY3RWYWx1ZSBhbmQgbGx2bTo6SW5zZXJ0VmFsdWUgaW5zdGFuY2VzLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBPYnRhaW4gdGhlIG51bWJlciBvZiBpbmRpY2VzLgorICogTkI6IFRoaXMgYWxzbyB3b3JrcyBvbiBHRVAuCisgKi8KK3Vuc2lnbmVkIExMVk1HZXROdW1JbmRpY2VzKExMVk1WYWx1ZVJlZiBJbnN0KTsKKworLyoqCisgKiBPYnRhaW4gdGhlIGluZGljZXMgYXMgYW4gYXJyYXkuCisgKi8KK2NvbnN0IHVuc2lnbmVkICpMTFZNR2V0SW5kaWNlcyhMTFZNVmFsdWVSZWYgSW5zdCk7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIExMVk1DQ29yZUluc3RydWN0aW9uQnVpbGRlciBJbnN0cnVjdGlvbiBCdWlsZGVycworICoKKyAqIEFuIGluc3RydWN0aW9uIGJ1aWxkZXIgcmVwcmVzZW50cyBhIHBvaW50IHdpdGhpbiBhIGJhc2ljIGJsb2NrIGFuZCBpcworICogdGhlIGV4Y2x1c2l2ZSBtZWFucyBvZiBidWlsZGluZyBpbnN0cnVjdGlvbnMgdXNpbmcgdGhlIEMgaW50ZXJmYWNlLgorICoKKyAqIEB7CisgKi8KKworTExWTUJ1aWxkZXJSZWYgTExWTUNyZWF0ZUJ1aWxkZXJJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQyk7CitMTFZNQnVpbGRlclJlZiBMTFZNQ3JlYXRlQnVpbGRlcih2b2lkKTsKK3ZvaWQgTExWTVBvc2l0aW9uQnVpbGRlcihMTFZNQnVpbGRlclJlZiBCdWlsZGVyLCBMTFZNQmFzaWNCbG9ja1JlZiBCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgSW5zdHIpOwordm9pZCBMTFZNUG9zaXRpb25CdWlsZGVyQmVmb3JlKExMVk1CdWlsZGVyUmVmIEJ1aWxkZXIsIExMVk1WYWx1ZVJlZiBJbnN0cik7Cit2b2lkIExMVk1Qb3NpdGlvbkJ1aWxkZXJBdEVuZChMTFZNQnVpbGRlclJlZiBCdWlsZGVyLCBMTFZNQmFzaWNCbG9ja1JlZiBCbG9jayk7CitMTFZNQmFzaWNCbG9ja1JlZiBMTFZNR2V0SW5zZXJ0QmxvY2soTExWTUJ1aWxkZXJSZWYgQnVpbGRlcik7Cit2b2lkIExMVk1DbGVhckluc2VydGlvblBvc2l0aW9uKExMVk1CdWlsZGVyUmVmIEJ1aWxkZXIpOwordm9pZCBMTFZNSW5zZXJ0SW50b0J1aWxkZXIoTExWTUJ1aWxkZXJSZWYgQnVpbGRlciwgTExWTVZhbHVlUmVmIEluc3RyKTsKK3ZvaWQgTExWTUluc2VydEludG9CdWlsZGVyV2l0aE5hbWUoTExWTUJ1aWxkZXJSZWYgQnVpbGRlciwgTExWTVZhbHVlUmVmIEluc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK3ZvaWQgTExWTURpc3Bvc2VCdWlsZGVyKExMVk1CdWlsZGVyUmVmIEJ1aWxkZXIpOworCisvKiBNZXRhZGF0YSAqLwordm9pZCBMTFZNU2V0Q3VycmVudERlYnVnTG9jYXRpb24oTExWTUJ1aWxkZXJSZWYgQnVpbGRlciwgTExWTVZhbHVlUmVmIEwpOworTExWTVZhbHVlUmVmIExMVk1HZXRDdXJyZW50RGVidWdMb2NhdGlvbihMTFZNQnVpbGRlclJlZiBCdWlsZGVyKTsKK3ZvaWQgTExWTVNldEluc3REZWJ1Z0xvY2F0aW9uKExMVk1CdWlsZGVyUmVmIEJ1aWxkZXIsIExMVk1WYWx1ZVJlZiBJbnN0KTsKKworLyogVGVybWluYXRvcnMgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRSZXRWb2lkKExMVk1CdWlsZGVyUmVmKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRSZXQoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRBZ2dyZWdhdGVSZXQoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiAqUmV0VmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTik7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkQnIoTExWTUJ1aWxkZXJSZWYsIExMVk1CYXNpY0Jsb2NrUmVmIERlc3QpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZENvbmRCcihMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIElmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQmFzaWNCbG9ja1JlZiBUaGVuLCBMTFZNQmFzaWNCbG9ja1JlZiBFbHNlKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRTd2l0Y2goTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQmFzaWNCbG9ja1JlZiBFbHNlLCB1bnNpZ25lZCBOdW1DYXNlcyk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkSW5kaXJlY3RCcihMTFZNQnVpbGRlclJlZiBCLCBMTFZNVmFsdWVSZWYgQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bURlc3RzKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRJbnZva2UoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBGbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmICpBcmdzLCB1bnNpZ25lZCBOdW1BcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQmFzaWNCbG9ja1JlZiBUaGVuLCBMTFZNQmFzaWNCbG9ja1JlZiBDYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkVW5yZWFjaGFibGUoTExWTUJ1aWxkZXJSZWYpOworCisvKiBFeGNlcHRpb24gSGFuZGxpbmcgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRSZXN1bWUoTExWTUJ1aWxkZXJSZWYgQiwgTExWTVZhbHVlUmVmIEV4bik7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkTGFuZGluZ1BhZChMTFZNQnVpbGRlclJlZiBCLCBMTFZNVHlwZVJlZiBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiBQZXJzRm4sIHVuc2lnbmVkIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRDbGVhbnVwUmV0KExMVk1CdWlsZGVyUmVmIEIsIExMVk1WYWx1ZVJlZiBDYXRjaFBhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1CYXNpY0Jsb2NrUmVmIEJCKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRDYXRjaFJldChMTFZNQnVpbGRlclJlZiBCLCBMTFZNVmFsdWVSZWYgQ2F0Y2hQYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUJhc2ljQmxvY2tSZWYgQkIpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZENhdGNoUGFkKExMVk1CdWlsZGVyUmVmIEIsIExMVk1WYWx1ZVJlZiBQYXJlbnRQYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmICpBcmdzLCB1bnNpZ25lZCBOdW1BcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZENsZWFudXBQYWQoTExWTUJ1aWxkZXJSZWYgQiwgTExWTVZhbHVlUmVmIFBhcmVudFBhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiAqQXJncywgdW5zaWduZWQgTnVtQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZENhdGNoU3dpdGNoKExMVk1CdWlsZGVyUmVmIEIsIExMVk1WYWx1ZVJlZiBQYXJlbnRQYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUJhc2ljQmxvY2tSZWYgVW53aW5kQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSGFuZGxlcnMsIGNvbnN0IGNoYXIgKk5hbWUpOworCisvKiBBZGQgYSBjYXNlIHRvIHRoZSBzd2l0Y2ggaW5zdHJ1Y3Rpb24gKi8KK3ZvaWQgTExWTUFkZENhc2UoTExWTVZhbHVlUmVmIFN3aXRjaCwgTExWTVZhbHVlUmVmIE9uVmFsLAorICAgICAgICAgICAgICAgICBMTFZNQmFzaWNCbG9ja1JlZiBEZXN0KTsKKworLyogQWRkIGEgZGVzdGluYXRpb24gdG8gdGhlIGluZGlyZWN0YnIgaW5zdHJ1Y3Rpb24gKi8KK3ZvaWQgTExWTUFkZERlc3RpbmF0aW9uKExMVk1WYWx1ZVJlZiBJbmRpcmVjdEJyLCBMTFZNQmFzaWNCbG9ja1JlZiBEZXN0KTsKKworLyogR2V0IHRoZSBudW1iZXIgb2YgY2xhdXNlcyBvbiB0aGUgbGFuZGluZ3BhZCBpbnN0cnVjdGlvbiAqLwordW5zaWduZWQgTExWTUdldE51bUNsYXVzZXMoTExWTVZhbHVlUmVmIExhbmRpbmdQYWQpOworCisvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBjbGF1c2UgYXQgaWRuZXggSWR4IG9uIHRoZSBsYW5kaW5ncGFkIGluc3RydWN0aW9uICovCitMTFZNVmFsdWVSZWYgTExWTUdldENsYXVzZShMTFZNVmFsdWVSZWYgTGFuZGluZ1BhZCwgdW5zaWduZWQgSWR4KTsKKworLyogQWRkIGEgY2F0Y2ggb3IgZmlsdGVyIGNsYXVzZSB0byB0aGUgbGFuZGluZ3BhZCBpbnN0cnVjdGlvbiAqLwordm9pZCBMTFZNQWRkQ2xhdXNlKExMVk1WYWx1ZVJlZiBMYW5kaW5nUGFkLCBMTFZNVmFsdWVSZWYgQ2xhdXNlVmFsKTsKKworLyogR2V0IHRoZSAnY2xlYW51cCcgZmxhZyBpbiB0aGUgbGFuZGluZ3BhZCBpbnN0cnVjdGlvbiAqLworTExWTUJvb2wgTExWTUlzQ2xlYW51cChMTFZNVmFsdWVSZWYgTGFuZGluZ1BhZCk7CisKKy8qIFNldCB0aGUgJ2NsZWFudXAnIGZsYWcgaW4gdGhlIGxhbmRpbmdwYWQgaW5zdHJ1Y3Rpb24gKi8KK3ZvaWQgTExWTVNldENsZWFudXAoTExWTVZhbHVlUmVmIExhbmRpbmdQYWQsIExMVk1Cb29sIFZhbCk7CisKKy8qIEFkZCBhIGRlc3RpbmF0aW9uIHRvIHRoZSBjYXRjaHN3aXRjaCBpbnN0cnVjdGlvbiAqLwordm9pZCBMTFZNQWRkSGFuZGxlcihMTFZNVmFsdWVSZWYgQ2F0Y2hTd2l0Y2gsIExMVk1CYXNpY0Jsb2NrUmVmIERlc3QpOworCisvKiBHZXQgdGhlIG51bWJlciBvZiBoYW5kbGVycyBvbiB0aGUgY2F0Y2hzd2l0Y2ggaW5zdHJ1Y3Rpb24gKi8KK3Vuc2lnbmVkIExMVk1HZXROdW1IYW5kbGVycyhMTFZNVmFsdWVSZWYgQ2F0Y2hTd2l0Y2gpOworCisvKioKKyAqIE9idGFpbiB0aGUgYmFzaWMgYmxvY2tzIGFjdGluZyBhcyBoYW5kbGVycyBmb3IgYSBjYXRjaHN3aXRjaCBpbnN0cnVjdGlvbi4KKyAqCisgKiBUaGUgSGFuZGxlcnMgcGFyYW1ldGVyIHNob3VsZCBwb2ludCB0byBhIHByZS1hbGxvY2F0ZWQgYXJyYXkgb2YKKyAqIExMVk1CYXNpY0Jsb2NrUmVmcyBhdCBsZWFzdCBMTFZNR2V0TnVtSGFuZGxlcnMoKSBsYXJnZS4gT24gcmV0dXJuLCB0aGUKKyAqIGZpcnN0IExMVk1HZXROdW1IYW5kbGVycygpIGVudHJpZXMgaW4gdGhlIGFycmF5IHdpbGwgYmUgcG9wdWxhdGVkCisgKiB3aXRoIExMVk1CYXNpY0Jsb2NrUmVmIGluc3RhbmNlcy4KKyAqCisgKiBAcGFyYW0gQ2F0Y2hTd2l0Y2ggVGhlIGNhdGNoc3dpdGNoIGluc3RydWN0aW9uIHRvIG9wZXJhdGUgb24uCisgKiBAcGFyYW0gSGFuZGxlcnMgTWVtb3J5IGFkZHJlc3Mgb2YgYW4gYXJyYXkgdG8gYmUgZmlsbGVkIHdpdGggYmFzaWMgYmxvY2tzLgorICovCit2b2lkIExMVk1HZXRIYW5kbGVycyhMTFZNVmFsdWVSZWYgQ2F0Y2hTd2l0Y2gsIExMVk1CYXNpY0Jsb2NrUmVmICpIYW5kbGVycyk7CisKKy8qIEZ1bmNsZXRzICovCisKKy8qIEdldCB0aGUgbnVtYmVyIG9mIGZ1bmNsZXRwYWQgYXJndW1lbnRzLiAqLworTExWTVZhbHVlUmVmIExMVk1HZXRBcmdPcGVyYW5kKExMVk1WYWx1ZVJlZiBGdW5jbGV0LCB1bnNpZ25lZCBpKTsKKworLyogU2V0IGEgZnVuY2xldHBhZCBhcmd1bWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXguICovCit2b2lkIExMVk1TZXRBcmdPcGVyYW5kKExMVk1WYWx1ZVJlZiBGdW5jbGV0LCB1bnNpZ25lZCBpLCBMTFZNVmFsdWVSZWYgdmFsdWUpOworCisvKioKKyAqIEdldCB0aGUgcGFyZW50IGNhdGNoc3dpdGNoIGluc3RydWN0aW9uIG9mIGEgY2F0Y2hwYWQgaW5zdHJ1Y3Rpb24uCisgKgorICogVGhpcyBvbmx5IHdvcmtzIG9uIGxsdm06OkNhdGNoUGFkSW5zdCBpbnN0cnVjdGlvbnMuCisgKgorICogQHNlZSBsbHZtOjpDYXRjaFBhZEluc3Q6OmdldENhdGNoU3dpdGNoKCkKKyAqLworTExWTVZhbHVlUmVmIExMVk1HZXRQYXJlbnRDYXRjaFN3aXRjaChMTFZNVmFsdWVSZWYgQ2F0Y2hQYWQpOworCisvKioKKyAqIFNldCB0aGUgcGFyZW50IGNhdGNoc3dpdGNoIGluc3RydWN0aW9uIG9mIGEgY2F0Y2hwYWQgaW5zdHJ1Y3Rpb24uCisgKgorICogVGhpcyBvbmx5IHdvcmtzIG9uIGxsdm06OkNhdGNoUGFkSW5zdCBpbnN0cnVjdGlvbnMuCisgKgorICogQHNlZSBsbHZtOjpDYXRjaFBhZEluc3Q6OnNldENhdGNoU3dpdGNoKCkKKyAqLwordm9pZCBMTFZNU2V0UGFyZW50Q2F0Y2hTd2l0Y2goTExWTVZhbHVlUmVmIENhdGNoUGFkLCBMTFZNVmFsdWVSZWYgQ2F0Y2hTd2l0Y2gpOworCisvKiBBcml0aG1ldGljICovCitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkQWRkKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGROU1dBZGQoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBMSFMsIExMVk1WYWx1ZVJlZiBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZE5VV0FkZChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkRkFkZChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFN1YihMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkTlNXU3ViKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGROVVdTdWIoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBMSFMsIExMVk1WYWx1ZVJlZiBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEZTdWIoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBMSFMsIExMVk1WYWx1ZVJlZiBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRNdWwoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBMSFMsIExMVk1WYWx1ZVJlZiBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZE5TV011bChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkTlVXTXVsKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRGTXVsKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkVURpdihMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEV4YWN0VURpdihMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkU0RpdihMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEV4YWN0U0RpdihMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkRkRpdihMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFVSZW0oTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBMSFMsIExMVk1WYWx1ZVJlZiBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRTUmVtKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkRlJlbShMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFNobChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZExTaHIoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBMSFMsIExMVk1WYWx1ZVJlZiBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRBU2hyKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkQW5kKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRPcihMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkWG9yKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTEhTLCBMTFZNVmFsdWVSZWYgUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRCaW5PcChMTFZNQnVpbGRlclJlZiBCLCBMTFZNT3Bjb2RlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiBMSFMsIExMVk1WYWx1ZVJlZiBSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkTmVnKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgViwgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkTlNXTmVnKExMVk1CdWlsZGVyUmVmIEIsIExMVk1WYWx1ZVJlZiBWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGROVVdOZWcoTExWTUJ1aWxkZXJSZWYgQiwgTExWTVZhbHVlUmVmIFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEZOZWcoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWLCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGROb3QoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWLCBjb25zdCBjaGFyICpOYW1lKTsKKworLyogTWVtb3J5ICovCitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkTWFsbG9jKExMVk1CdWlsZGVyUmVmLCBMTFZNVHlwZVJlZiBUeSwgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkQXJyYXlNYWxsb2MoTExWTUJ1aWxkZXJSZWYsIExMVk1UeXBlUmVmIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiBWYWwsIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEFsbG9jYShMTFZNQnVpbGRlclJlZiwgTExWTVR5cGVSZWYgVHksIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEFycmF5QWxsb2NhKExMVk1CdWlsZGVyUmVmLCBMTFZNVHlwZVJlZiBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgVmFsLCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRGcmVlKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgUG9pbnRlclZhbCk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkTG9hZChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFBvaW50ZXJWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRTdG9yZShMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFZhbCwgTExWTVZhbHVlUmVmIFB0cik7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkR0VQKExMVk1CdWlsZGVyUmVmIEIsIExMVk1WYWx1ZVJlZiBQb2ludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgKkluZGljZXMsIHVuc2lnbmVkIE51bUluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEluQm91bmRzR0VQKExMVk1CdWlsZGVyUmVmIEIsIExMVk1WYWx1ZVJlZiBQb2ludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiAqSW5kaWNlcywgdW5zaWduZWQgTnVtSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRTdHJ1Y3RHRVAoTExWTUJ1aWxkZXJSZWYgQiwgTExWTVZhbHVlUmVmIFBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElkeCwgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkR2xvYmFsU3RyaW5nKExMVk1CdWlsZGVyUmVmIEIsIGNvbnN0IGNoYXIgKlN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkR2xvYmFsU3RyaW5nUHRyKExMVk1CdWlsZGVyUmVmIEIsIGNvbnN0IGNoYXIgKlN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNQm9vbCBMTFZNR2V0Vm9sYXRpbGUoTExWTVZhbHVlUmVmIE1lbW9yeUFjY2Vzc0luc3QpOwordm9pZCBMTFZNU2V0Vm9sYXRpbGUoTExWTVZhbHVlUmVmIE1lbW9yeUFjY2Vzc0luc3QsIExMVk1Cb29sIElzVm9sYXRpbGUpOworTExWTUF0b21pY09yZGVyaW5nIExMVk1HZXRPcmRlcmluZyhMTFZNVmFsdWVSZWYgTWVtb3J5QWNjZXNzSW5zdCk7Cit2b2lkIExMVk1TZXRPcmRlcmluZyhMTFZNVmFsdWVSZWYgTWVtb3J5QWNjZXNzSW5zdCwgTExWTUF0b21pY09yZGVyaW5nIE9yZGVyaW5nKTsKKworLyogQ2FzdHMgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRUcnVuYyhMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBEZXN0VHksIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFpFeHQoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBEZXN0VHksIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFNFeHQoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBEZXN0VHksIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEZQVG9VSShMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRGUFRvU0koTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1UeXBlUmVmIERlc3RUeSwgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkVUlUb0ZQKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBEZXN0VHksIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFNJVG9GUChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRGUFRydW5jKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRGUEV4dChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBEZXN0VHksIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFB0clRvSW50KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1UeXBlUmVmIERlc3RUeSwgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkSW50VG9QdHIoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRCaXRDYXN0KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRBZGRyU3BhY2VDYXN0KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRaRXh0T3JCaXRDYXN0KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRTRXh0T3JCaXRDYXN0KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRUcnVuY09yQml0Q2FzdChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBEZXN0VHksIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZENhc3QoTExWTUJ1aWxkZXJSZWYgQiwgTExWTU9wY29kZSBPcCwgTExWTVZhbHVlUmVmIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1UeXBlUmVmIERlc3RUeSwgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkUG9pbnRlckNhc3QoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRJbnRDYXN0KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLCAvKlNpZ25lZCBjYXN0ISovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBEZXN0VHksIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEZQQ2FzdChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVR5cGVSZWYgRGVzdFR5LCBjb25zdCBjaGFyICpOYW1lKTsKKworLyogQ29tcGFyaXNvbnMgKi8KK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRJQ21wKExMVk1CdWlsZGVyUmVmLCBMTFZNSW50UHJlZGljYXRlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEZDbXAoTExWTUJ1aWxkZXJSZWYsIExMVk1SZWFsUHJlZGljYXRlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIExIUywgTExWTVZhbHVlUmVmIFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworCisvKiBNaXNjZWxsYW5lb3VzIGluc3RydWN0aW9ucyAqLworTExWTVZhbHVlUmVmIExMVk1CdWlsZFBoaShMTFZNQnVpbGRlclJlZiwgTExWTVR5cGVSZWYgVHksIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZENhbGwoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBGbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiAqQXJncywgdW5zaWduZWQgTnVtQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFNlbGVjdChMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIElmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgVGhlbiwgTExWTVZhbHVlUmVmIEVsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFZBQXJnKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgTGlzdCwgTExWTVR5cGVSZWYgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkRXh0cmFjdEVsZW1lbnQoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWZWNWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIEluZGV4LCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRJbnNlcnRFbGVtZW50KExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmVjVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIEVsdFZhbCwgTExWTVZhbHVlUmVmIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZSk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkU2h1ZmZsZVZlY3RvcihMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIFYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIFYyLCBMTFZNVmFsdWVSZWYgTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEV4dHJhY3RWYWx1ZShMTFZNQnVpbGRlclJlZiwgTExWTVZhbHVlUmVmIEFnZ1ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZXgsIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZEluc2VydFZhbHVlKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgQWdnVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiBFbHRWYWwsIHVuc2lnbmVkIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworCitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkSXNOdWxsKExMVk1CdWlsZGVyUmVmLCBMTFZNVmFsdWVSZWYgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRJc05vdE51bGwoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpOworTExWTVZhbHVlUmVmIExMVk1CdWlsZFB0ckRpZmYoTExWTUJ1aWxkZXJSZWYsIExMVk1WYWx1ZVJlZiBMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgUkhTLCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRGZW5jZShMTFZNQnVpbGRlclJlZiBCLCBMTFZNQXRvbWljT3JkZXJpbmcgb3JkZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUJvb2wgc2luZ2xlVGhyZWFkLCBjb25zdCBjaGFyICpOYW1lKTsKK0xMVk1WYWx1ZVJlZiBMTFZNQnVpbGRBdG9taWNSTVcoTExWTUJ1aWxkZXJSZWYgQiwgTExWTUF0b21pY1JNV0Jpbk9wIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgUFRSLCBMTFZNVmFsdWVSZWYgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQXRvbWljT3JkZXJpbmcgb3JkZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Cb29sIHNpbmdsZVRocmVhZCk7CitMTFZNVmFsdWVSZWYgTExWTUJ1aWxkQXRvbWljQ21wWGNoZyhMTFZNQnVpbGRlclJlZiBCLCBMTFZNVmFsdWVSZWYgUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZhbHVlUmVmIENtcCwgTExWTVZhbHVlUmVmIE5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1BdG9taWNPcmRlcmluZyBTdWNjZXNzT3JkZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQXRvbWljT3JkZXJpbmcgRmFpbHVyZU9yZGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUJvb2wgU2luZ2xlVGhyZWFkKTsKKworTExWTUJvb2wgTExWTUlzQXRvbWljU2luZ2xlVGhyZWFkKExMVk1WYWx1ZVJlZiBBdG9taWNJbnN0KTsKK3ZvaWQgTExWTVNldEF0b21pY1NpbmdsZVRocmVhZChMTFZNVmFsdWVSZWYgQXRvbWljSW5zdCwgTExWTUJvb2wgU2luZ2xlVGhyZWFkKTsKKworTExWTUF0b21pY09yZGVyaW5nIExMVk1HZXRDbXBYY2hnU3VjY2Vzc09yZGVyaW5nKExMVk1WYWx1ZVJlZiBDbXBYY2hnSW5zdCk7Cit2b2lkIExMVk1TZXRDbXBYY2hnU3VjY2Vzc09yZGVyaW5nKExMVk1WYWx1ZVJlZiBDbXBYY2hnSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUF0b21pY09yZGVyaW5nIE9yZGVyaW5nKTsKK0xMVk1BdG9taWNPcmRlcmluZyBMTFZNR2V0Q21wWGNoZ0ZhaWx1cmVPcmRlcmluZyhMTFZNVmFsdWVSZWYgQ21wWGNoZ0luc3QpOwordm9pZCBMTFZNU2V0Q21wWGNoZ0ZhaWx1cmVPcmRlcmluZyhMTFZNVmFsdWVSZWYgQ21wWGNoZ0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1BdG9taWNPcmRlcmluZyBPcmRlcmluZyk7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ0NvcmVNb2R1bGVQcm92aWRlciBNb2R1bGUgUHJvdmlkZXJzCisgKgorICogQHsKKyAqLworCisvKioKKyAqIENoYW5nZXMgdGhlIHR5cGUgb2YgTSBzbyBpdCBjYW4gYmUgcGFzc2VkIHRvIEZ1bmN0aW9uUGFzc01hbmFnZXJzIGFuZCB0aGUKKyAqIEpJVC4gIFRoZXkgdGFrZSBNb2R1bGVQcm92aWRlcnMgZm9yIGhpc3RvcmljYWwgcmVhc29ucy4KKyAqLworTExWTU1vZHVsZVByb3ZpZGVyUmVmCitMTFZNQ3JlYXRlTW9kdWxlUHJvdmlkZXJGb3JFeGlzdGluZ01vZHVsZShMTFZNTW9kdWxlUmVmIE0pOworCisvKioKKyAqIERlc3Ryb3lzIHRoZSBtb2R1bGUgTS4KKyAqLwordm9pZCBMTFZNRGlzcG9zZU1vZHVsZVByb3ZpZGVyKExMVk1Nb2R1bGVQcm92aWRlclJlZiBNKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIExMVk1DQ29yZU1lbW9yeUJ1ZmZlcnMgTWVtb3J5IEJ1ZmZlcnMKKyAqCisgKiBAeworICovCisKK0xMVk1Cb29sIExMVk1DcmVhdGVNZW1vcnlCdWZmZXJXaXRoQ29udGVudHNPZkZpbGUoY29uc3QgY2hhciAqUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1lbW9yeUJ1ZmZlclJlZiAqT3V0TWVtQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqT3V0TWVzc2FnZSk7CitMTFZNQm9vbCBMTFZNQ3JlYXRlTWVtb3J5QnVmZmVyV2l0aFNURElOKExMVk1NZW1vcnlCdWZmZXJSZWYgKk91dE1lbUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKk91dE1lc3NhZ2UpOworTExWTU1lbW9yeUJ1ZmZlclJlZiBMTFZNQ3JlYXRlTWVtb3J5QnVmZmVyV2l0aE1lbW9yeVJhbmdlKGNvbnN0IGNoYXIgKklucHV0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgSW5wdXREYXRhTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkJ1ZmZlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUJvb2wgUmVxdWlyZXNOdWxsVGVybWluYXRvcik7CitMTFZNTWVtb3J5QnVmZmVyUmVmIExMVk1DcmVhdGVNZW1vcnlCdWZmZXJXaXRoTWVtb3J5UmFuZ2VDb3B5KGNvbnN0IGNoYXIgKklucHV0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IElucHV0RGF0YUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqQnVmZmVyTmFtZSk7Citjb25zdCBjaGFyICpMTFZNR2V0QnVmZmVyU3RhcnQoTExWTU1lbW9yeUJ1ZmZlclJlZiBNZW1CdWYpOworc2l6ZV90IExMVk1HZXRCdWZmZXJTaXplKExMVk1NZW1vcnlCdWZmZXJSZWYgTWVtQnVmKTsKK3ZvaWQgTExWTURpc3Bvc2VNZW1vcnlCdWZmZXIoTExWTU1lbW9yeUJ1ZmZlclJlZiBNZW1CdWYpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNDb3JlUGFzc1JlZ2lzdHJ5IFBhc3MgUmVnaXN0cnkKKyAqCisgKiBAeworICovCisKKy8qKiBSZXR1cm4gdGhlIGdsb2JhbCBwYXNzIHJlZ2lzdHJ5LCBmb3IgdXNlIHdpdGggaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLgorICAgIEBzZWUgbGx2bTo6UGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkgKi8KK0xMVk1QYXNzUmVnaXN0cnlSZWYgTExWTUdldEdsb2JhbFBhc3NSZWdpc3RyeSh2b2lkKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIExMVk1DQ29yZVBhc3NNYW5hZ2VycyBQYXNzIE1hbmFnZXJzCisgKgorICogQHsKKyAqLworCisvKiogQ29uc3RydWN0cyBhIG5ldyB3aG9sZS1tb2R1bGUgcGFzcyBwaXBlbGluZS4gVGhpcyB0eXBlIG9mIHBpcGVsaW5lIGlzCisgICAgc3VpdGFibGUgZm9yIGxpbmstdGltZSBvcHRpbWl6YXRpb24gYW5kIHdob2xlLW1vZHVsZSB0cmFuc2Zvcm1hdGlvbnMuCisgICAgQHNlZSBsbHZtOjpQYXNzTWFuYWdlcjo6UGFzc01hbmFnZXIgKi8KK0xMVk1QYXNzTWFuYWdlclJlZiBMTFZNQ3JlYXRlUGFzc01hbmFnZXIodm9pZCk7CisKKy8qKiBDb25zdHJ1Y3RzIGEgbmV3IGZ1bmN0aW9uLWJ5LWZ1bmN0aW9uIHBhc3MgcGlwZWxpbmUgb3ZlciB0aGUgbW9kdWxlCisgICAgcHJvdmlkZXIuIEl0IGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZSBtb2R1bGUgcHJvdmlkZXIuIFRoaXMgdHlwZSBvZgorICAgIHBpcGVsaW5lIGlzIHN1aXRhYmxlIGZvciBjb2RlIGdlbmVyYXRpb24gYW5kIEpJVCBjb21waWxhdGlvbiB0YXNrcy4KKyAgICBAc2VlIGxsdm06OkZ1bmN0aW9uUGFzc01hbmFnZXI6OkZ1bmN0aW9uUGFzc01hbmFnZXIgKi8KK0xMVk1QYXNzTWFuYWdlclJlZiBMTFZNQ3JlYXRlRnVuY3Rpb25QYXNzTWFuYWdlckZvck1vZHVsZShMTFZNTW9kdWxlUmVmIE0pOworCisvKiogRGVwcmVjYXRlZDogVXNlIExMVk1DcmVhdGVGdW5jdGlvblBhc3NNYW5hZ2VyRm9yTW9kdWxlIGluc3RlYWQuICovCitMTFZNUGFzc01hbmFnZXJSZWYgTExWTUNyZWF0ZUZ1bmN0aW9uUGFzc01hbmFnZXIoTExWTU1vZHVsZVByb3ZpZGVyUmVmIE1QKTsKKworLyoqIEluaXRpYWxpemVzLCBleGVjdXRlcyBvbiB0aGUgcHJvdmlkZWQgbW9kdWxlLCBhbmQgZmluYWxpemVzIGFsbCBvZiB0aGUKKyAgICBwYXNzZXMgc2NoZWR1bGVkIGluIHRoZSBwYXNzIG1hbmFnZXIuIFJldHVybnMgMSBpZiBhbnkgb2YgdGhlIHBhc3NlcworICAgIG1vZGlmaWVkIHRoZSBtb2R1bGUsIDAgb3RoZXJ3aXNlLgorICAgIEBzZWUgbGx2bTo6UGFzc01hbmFnZXI6OnJ1bihNb2R1bGUmKSAqLworTExWTUJvb2wgTExWTVJ1blBhc3NNYW5hZ2VyKExMVk1QYXNzTWFuYWdlclJlZiBQTSwgTExWTU1vZHVsZVJlZiBNKTsKKworLyoqIEluaXRpYWxpemVzIGFsbCBvZiB0aGUgZnVuY3Rpb24gcGFzc2VzIHNjaGVkdWxlZCBpbiB0aGUgZnVuY3Rpb24gcGFzcworICAgIG1hbmFnZXIuIFJldHVybnMgMSBpZiBhbnkgb2YgdGhlIHBhc3NlcyBtb2RpZmllZCB0aGUgbW9kdWxlLCAwIG90aGVyd2lzZS4KKyAgICBAc2VlIGxsdm06OkZ1bmN0aW9uUGFzc01hbmFnZXI6OmRvSW5pdGlhbGl6YXRpb24gKi8KK0xMVk1Cb29sIExMVk1Jbml0aWFsaXplRnVuY3Rpb25QYXNzTWFuYWdlcihMTFZNUGFzc01hbmFnZXJSZWYgRlBNKTsKKworLyoqIEV4ZWN1dGVzIGFsbCBvZiB0aGUgZnVuY3Rpb24gcGFzc2VzIHNjaGVkdWxlZCBpbiB0aGUgZnVuY3Rpb24gcGFzcyBtYW5hZ2VyCisgICAgb24gdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLiBSZXR1cm5zIDEgaWYgYW55IG9mIHRoZSBwYXNzZXMgbW9kaWZpZWQgdGhlCisgICAgZnVuY3Rpb24sIGZhbHNlIG90aGVyd2lzZS4KKyAgICBAc2VlIGxsdm06OkZ1bmN0aW9uUGFzc01hbmFnZXI6OnJ1bihGdW5jdGlvbiYpICovCitMTFZNQm9vbCBMTFZNUnVuRnVuY3Rpb25QYXNzTWFuYWdlcihMTFZNUGFzc01hbmFnZXJSZWYgRlBNLCBMTFZNVmFsdWVSZWYgRik7CisKKy8qKiBGaW5hbGl6ZXMgYWxsIG9mIHRoZSBmdW5jdGlvbiBwYXNzZXMgc2NoZWR1bGVkIGluIHRoZSBmdW5jdGlvbiBwYXNzCisgICAgbWFuYWdlci4gUmV0dXJucyAxIGlmIGFueSBvZiB0aGUgcGFzc2VzIG1vZGlmaWVkIHRoZSBtb2R1bGUsIDAgb3RoZXJ3aXNlLgorICAgIEBzZWUgbGx2bTo6RnVuY3Rpb25QYXNzTWFuYWdlcjo6ZG9GaW5hbGl6YXRpb24gKi8KK0xMVk1Cb29sIExMVk1GaW5hbGl6ZUZ1bmN0aW9uUGFzc01hbmFnZXIoTExWTVBhc3NNYW5hZ2VyUmVmIEZQTSk7CisKKy8qKiBGcmVlcyB0aGUgbWVtb3J5IG9mIGEgcGFzcyBwaXBlbGluZS4gRm9yIGZ1bmN0aW9uIHBpcGVsaW5lcywgZG9lcyBub3QgZnJlZQorICAgIHRoZSBtb2R1bGUgcHJvdmlkZXIuCisgICAgQHNlZSBsbHZtOjpQYXNzTWFuYWdlckJhc2U6On5QYXNzTWFuYWdlckJhc2UuICovCit2b2lkIExMVk1EaXNwb3NlUGFzc01hbmFnZXIoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIExMVk1DQ29yZVRocmVhZGluZyBUaHJlYWRpbmcKKyAqCisgKiBIYW5kbGUgdGhlIHN0cnVjdHVyZXMgbmVlZGVkIHRvIG1ha2UgTExWTSBzYWZlIGZvciBtdWx0aXRocmVhZGluZy4KKyAqCisgKiBAeworICovCisKKy8qKiBEZXByZWNhdGVkOiBNdWx0aS10aHJlYWRpbmcgY2FuIG9ubHkgYmUgZW5hYmxlZC9kaXNhYmxlZCB3aXRoIHRoZSBjb21waWxlCisgICAgdGltZSBkZWZpbmUgTExWTV9FTkFCTEVfVEhSRUFEUy4gIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMKKyAgICBMTFZNSXNNdWx0aXRocmVhZGVkKCkuICovCitMTFZNQm9vbCBMTFZNU3RhcnRNdWx0aXRocmVhZGVkKHZvaWQpOworCisvKiogRGVwcmVjYXRlZDogTXVsdGktdGhyZWFkaW5nIGNhbiBvbmx5IGJlIGVuYWJsZWQvZGlzYWJsZWQgd2l0aCB0aGUgY29tcGlsZQorICAgIHRpbWUgZGVmaW5lIExMVk1fRU5BQkxFX1RIUkVBRFMuICovCit2b2lkIExMVk1TdG9wTXVsdGl0aHJlYWRlZCh2b2lkKTsKKworLyoqIENoZWNrIHdoZXRoZXIgTExWTSBpcyBleGVjdXRpbmcgaW4gdGhyZWFkLXNhZmUgbW9kZSBvciBub3QuCisgICAgQHNlZSBsbHZtOjpsbHZtX2lzX211bHRpdGhyZWFkZWQgKi8KK0xMVk1Cb29sIExMVk1Jc011bHRpdGhyZWFkZWQodm9pZCk7CisKKy8qKgorICogQH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBMTFZNX0NfQ09SRV9IICovCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvRGF0YVR5cGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvRGF0YVR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkM2IyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9EYXRhVHlwZXMuaApAQCAtMCwwICsxLDEzNSBAQAorLyo9PT0tLSBpbmNsdWRlL2xsdm0tYy9EYXRhVHlwZXMuaCAtIERlZmluZSBmaXhlZCBzaXplIHR5cGVzIC0tLS0tLSotIEMgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICp8Cit8KiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIHRvIGZpZ3VyZSBvdXQgdGhlIHNpemUgb2YgX0hPU1RfIGRhdGEgdHlwZXMuKnwKK3wqIFRoaXMgZmlsZSBpcyBpbXBvcnRhbnQgYmVjYXVzZSBkaWZmZXJlbnQgaG9zdCBPUydzIGRlZmluZSBkaWZmZXJlbnQgbWFjcm9zLCp8Cit8KiB3aGljaCBtYWtlcyBwb3J0YWJpbGl0eSB0b3VnaC4gIFRoaXMgZmlsZSBleHBvcnRzIHRoZSBmb2xsb3dpbmcgICAgICAgICAgICAqfAorfCogZGVmaW5pdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgIFt1XWludCgzMnw2NClfdCA6IHR5cGVkZWZzIGZvciBzaWduZWQgYW5kIHVuc2lnbmVkIDMyLzY0IGJpdCBzeXN0ZW0gdHlwZXMqfAorfCogICBbVV1JTlQoOHwxNnwzMnw2NClfKE1JTnxNQVgpIDogQ29uc3RhbnRzIGZvciB0aGUgbWluIGFuZCBtYXggdmFsdWVzLiAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBObyBsaWJyYXJ5IGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgdGhlc2UgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKy8qIFBsZWFzZSBsZWF2ZSB0aGlzIGZpbGUgQy1jb21wYXRpYmxlLiAqLworCisjaWZuZGVmIExMVk1fQ19EQVRBVFlQRVNfSAorI2RlZmluZSBMTFZNX0NfREFUQVRZUEVTX0gKKworI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorI2RlZmluZSBIQVZFX1NURElOVF9IIDEKKyNkZWZpbmUgSEFWRV9VSU5UNjRfVCAxCisjZGVmaW5lIEhBVkVfVV9JTlQ2NF9UIDEKKworI2lmZGVmIF9fY3BsdXNwbHVzCisjaW5jbHVkZSA8Y21hdGg+CisjZWxzZQorI2luY2x1ZGUgPG1hdGguaD4KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxjaW50dHlwZXM+CisjZWxzZQorI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxjc3RkaW50PgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxzZQorI2Vycm9yICJDb21waWxlciBtdXN0IHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2Ygc3RkaW50LmgiCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9NU0NfVkVSCisKKyNpZiAhZGVmaW5lZChVSU5UMzJfTUFYKQorIyBlcnJvciAiVGhlIHN0YW5kYXJkIGhlYWRlciA8Y3N0ZGludD4gaXMgbm90IEMrKzExIGNvbXBsaWFudC4gTXVzdCAjZGVmaW5lICJcCisgICAgICAgICJfX1NURENfTElNSVRfTUFDUk9TIGJlZm9yZSAjaW5jbHVkaW5nIGxsdm0tYy9EYXRhVHlwZXMuaCIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVUlOVDMyX0MpCisjIGVycm9yICJUaGUgc3RhbmRhcmQgaGVhZGVyIDxjc3RkaW50PiBpcyBub3QgQysrMTEgY29tcGxpYW50LiBNdXN0ICNkZWZpbmUgIlwKKyAgICAgICAgIl9fU1REQ19DT05TVEFOVF9NQUNST1MgYmVmb3JlICNpbmNsdWRpbmcgbGx2bS1jL0RhdGFUeXBlcy5oIgorI2VuZGlmCisKKy8qIE5vdGUgdGhhdCA8aW50dHlwZXMuaD4gaW5jbHVkZXMgPHN0ZGludC5oPiwgaWYgdGhpcyBpcyBhIEM5OSBzeXN0ZW0uICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpZmRlZiBfQUlYCisvLyBHQ0MgaXMgc3RyaWN0IGFib3V0IGRlZmluaW5nIGxhcmdlIGNvbnN0YW50czogdGhleSBtdXN0IGhhdmUgTEwgbW9kaWZpZXIuCisjdW5kZWYgSU5UNjRfTUFYCisjdW5kZWYgSU5UNjRfTUlOCisjZW5kaWYKKworLyogSGFuZGxlIGluY29ycmVjdCBkZWZpbml0aW9uIG9mIHVpbnQ2NF90IGFzIHVfaW50NjRfdCAqLworI2lmbmRlZiBIQVZFX1VJTlQ2NF9UCisjaWZkZWYgSEFWRV9VX0lOVDY0X1QKK3R5cGVkZWYgdV9pbnQ2NF90IHVpbnQ2NF90OworI2Vsc2UKKyMgZXJyb3IgIkRvbid0IGhhdmUgYSBkZWZpbml0aW9uIGZvciB1aW50NjRfdCBvbiB0aGlzIHBsYXRmb3JtIgorI2VuZGlmCisjZW5kaWYKKworI2Vsc2UgLyogX01TQ19WRVIgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNlbHNlCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmIGRlZmluZWQoX1dJTjY0KQordHlwZWRlZiBzaWduZWQgX19pbnQ2NCBzc2l6ZV90OworI2Vsc2UKK3R5cGVkZWYgc2lnbmVkIGludCBzc2l6ZV90OworI2VuZGlmIC8qIF9XSU42NCAqLworCisjaWZuZGVmIEhBVkVfSU5UVFlQRVNfSAorI2RlZmluZSBQUklkNjQgIkk2NGQiCisjZGVmaW5lIFBSSWk2NCAiSTY0aSIKKyNkZWZpbmUgUFJJbzY0ICJJNjRvIgorI2RlZmluZSBQUkl1NjQgIkk2NHUiCisjZGVmaW5lIFBSSXg2NCAiSTY0eCIKKyNkZWZpbmUgUFJJWDY0ICJJNjRYIgorCisjZGVmaW5lIFBSSWQzMiAiZCIKKyNkZWZpbmUgUFJJaTMyICJpIgorI2RlZmluZSBQUklvMzIgIm8iCisjZGVmaW5lIFBSSXUzMiAidSIKKyNkZWZpbmUgUFJJeDMyICJ4IgorI2RlZmluZSBQUklYMzIgIlgiCisjZW5kaWYgLyogSEFWRV9JTlRUWVBFU19IICovCisKKyNlbmRpZiAvKiBfTVNDX1ZFUiAqLworCisvKiBTZXQgZGVmYXVsdHMgZm9yIGNvbnN0YW50cyB3aGljaCB3ZSBjYW5ub3QgZmluZC4gKi8KKyNpZiAhZGVmaW5lZChJTlQ2NF9NQVgpCisjIGRlZmluZSBJTlQ2NF9NQVggOTIyMzM3MjAzNjg1NDc3NTgwN0xMCisjZW5kaWYKKyNpZiAhZGVmaW5lZChJTlQ2NF9NSU4pCisjIGRlZmluZSBJTlQ2NF9NSU4gKCgtSU5UNjRfTUFYKS0xKQorI2VuZGlmCisjaWYgIWRlZmluZWQoVUlOVDY0X01BWCkKKyMgZGVmaW5lIFVJTlQ2NF9NQVggMHhmZmZmZmZmZmZmZmZmZmZmVUxMCisjZW5kaWYKKworI2lmbmRlZiBIVUdFX1ZBTEYKKyNkZWZpbmUgSFVHRV9WQUxGIChmbG9hdClIVUdFX1ZBTAorI2VuZGlmCisKKyNlbmRpZiAvKiBMTFZNX0NfREFUQVRZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9EZWJ1Z0luZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9EZWJ1Z0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU1NjUzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL0RlYnVnSW5mby5oCkBAIC0wLDAgKzEsMjM0IEBACisvLz09PS0tLS0tLS0tLS0tLSBEZWJ1Z0luZm8uaCAtIExMVk0gQyBBUEkgRGVidWcgSW5mbyBBUEkgLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBDIEFQSSBlbmRwb2ludHMgZm9yIGdlbmVyYXRpbmcgRFdBUkYgRGVidWcgSW5mbworLy8vCisvLy8gTm90ZTogVGhpcyBpbnRlcmZhY2UgaXMgZXhwZXJpbWVudGFsLiBJdCBpcyAqTk9UKiBzdGFibGUsIGFuZCBtYXkgYmUKKy8vLyAgICAgICBjaGFuZ2VkIHdpdGhvdXQgd2FybmluZy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NfREVCVUdJTkZPX0gKKyNkZWZpbmUgTExWTV9DX0RFQlVHSU5GT19ICisKKyNpbmNsdWRlICJsbHZtLWMvQ29yZS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogRGVidWcgaW5mbyBmbGFncy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgTExWTURJRmxhZ1plcm8gPSAwLAorICBMTFZNRElGbGFnUHJpdmF0ZSA9IDEsCisgIExMVk1ESUZsYWdQcm90ZWN0ZWQgPSAyLAorICBMTFZNRElGbGFnUHVibGljID0gMywKKyAgTExWTURJRmxhZ0Z3ZERlY2wgPSAxIDw8IDIsCisgIExMVk1ESUZsYWdBcHBsZUJsb2NrID0gMSA8PCAzLAorICBMTFZNRElGbGFnQmxvY2tCeXJlZlN0cnVjdCA9IDEgPDwgNCwKKyAgTExWTURJRmxhZ1ZpcnR1YWwgPSAxIDw8IDUsCisgIExMVk1ESUZsYWdBcnRpZmljaWFsID0gMSA8PCA2LAorICBMTFZNRElGbGFnRXhwbGljaXQgPSAxIDw8IDcsCisgIExMVk1ESUZsYWdQcm90b3R5cGVkID0gMSA8PCA4LAorICBMTFZNRElGbGFnT2JqY0NsYXNzQ29tcGxldGUgPSAxIDw8IDksCisgIExMVk1ESUZsYWdPYmplY3RQb2ludGVyID0gMSA8PCAxMCwKKyAgTExWTURJRmxhZ1ZlY3RvciA9IDEgPDwgMTEsCisgIExMVk1ESUZsYWdTdGF0aWNNZW1iZXIgPSAxIDw8IDEyLAorICBMTFZNRElGbGFnTFZhbHVlUmVmZXJlbmNlID0gMSA8PCAxMywKKyAgTExWTURJRmxhZ1JWYWx1ZVJlZmVyZW5jZSA9IDEgPDwgMTQsCisgIExMVk1ESUZsYWdSZXNlcnZlZCA9IDEgPDwgMTUsCisgIExMVk1ESUZsYWdTaW5nbGVJbmhlcml0YW5jZSA9IDEgPDwgMTYsCisgIExMVk1ESUZsYWdNdWx0aXBsZUluaGVyaXRhbmNlID0gMiA8PCAxNiwKKyAgTExWTURJRmxhZ1ZpcnR1YWxJbmhlcml0YW5jZSA9IDMgPDwgMTYsCisgIExMVk1ESUZsYWdJbnRyb2R1Y2VkVmlydHVhbCA9IDEgPDwgMTgsCisgIExMVk1ESUZsYWdCaXRGaWVsZCA9IDEgPDwgMTksCisgIExMVk1ESUZsYWdOb1JldHVybiA9IDEgPDwgMjAsCisgIExMVk1ESUZsYWdNYWluU3VicHJvZ3JhbSA9IDEgPDwgMjEsCisgIExMVk1ESUZsYWdUeXBlUGFzc0J5VmFsdWUgPSAxIDw8IDIyLAorICBMTFZNRElGbGFnVHlwZVBhc3NCeVJlZmVyZW5jZSA9IDEgPDwgMjMsCisgIExMVk1ESUZsYWdJbmRpcmVjdFZpcnR1YWxCYXNlID0gKDEgPDwgMikgfCAoMSA8PCA1KSwKKyAgTExWTURJRmxhZ0FjY2Vzc2liaWxpdHkgPSBMTFZNRElGbGFnUHJpdmF0ZSB8IExMVk1ESUZsYWdQcm90ZWN0ZWQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1ESUZsYWdQdWJsaWMsCisgIExMVk1ESUZsYWdQdHJUb01lbWJlclJlcCA9IExMVk1ESUZsYWdTaW5nbGVJbmhlcml0YW5jZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1ESUZsYWdNdWx0aXBsZUluaGVyaXRhbmNlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTURJRmxhZ1ZpcnR1YWxJbmhlcml0YW5jZQorfSBMTFZNRElGbGFnczsKKworLyoqCisgKiBTb3VyY2UgbGFuZ3VhZ2VzIGtub3duIGJ5IERXQVJGLgorICovCit0eXBlZGVmIGVudW0geworICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZUM4OSwKKyAgTExWTURXQVJGU291cmNlTGFuZ3VhZ2VDLAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZUFkYTgzLAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZUNfcGx1c19wbHVzLAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZUNvYm9sNzQsCisgIExMVk1EV0FSRlNvdXJjZUxhbmd1YWdlQ29ib2w4NSwKKyAgTExWTURXQVJGU291cmNlTGFuZ3VhZ2VGb3J0cmFuNzcsCisgIExMVk1EV0FSRlNvdXJjZUxhbmd1YWdlRm9ydHJhbjkwLAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZVBhc2NhbDgzLAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZU1vZHVsYTIsCisgIC8vIE5ldyBpbiBEV0FSRiB2MzoKKyAgTExWTURXQVJGU291cmNlTGFuZ3VhZ2VKYXZhLAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZUM5OSwKKyAgTExWTURXQVJGU291cmNlTGFuZ3VhZ2VBZGE5NSwKKyAgTExWTURXQVJGU291cmNlTGFuZ3VhZ2VGb3J0cmFuOTUsCisgIExMVk1EV0FSRlNvdXJjZUxhbmd1YWdlUExJLAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZU9iakMsCisgIExMVk1EV0FSRlNvdXJjZUxhbmd1YWdlT2JqQ19wbHVzX3BsdXMsCisgIExMVk1EV0FSRlNvdXJjZUxhbmd1YWdlVVBDLAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZUQsCisgIC8vIE5ldyBpbiBEV0FSRiB2NDoKKyAgTExWTURXQVJGU291cmNlTGFuZ3VhZ2VQeXRob24sCisgIC8vIE5ldyBpbiBEV0FSRiB2NToKKyAgTExWTURXQVJGU291cmNlTGFuZ3VhZ2VPcGVuQ0wsCisgIExMVk1EV0FSRlNvdXJjZUxhbmd1YWdlR28sCisgIExMVk1EV0FSRlNvdXJjZUxhbmd1YWdlTW9kdWxhMywKKyAgTExWTURXQVJGU291cmNlTGFuZ3VhZ2VIYXNrZWxsLAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZUNfcGx1c19wbHVzXzAzLAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZUNfcGx1c19wbHVzXzExLAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZU9DYW1sLAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZVJ1c3QsCisgIExMVk1EV0FSRlNvdXJjZUxhbmd1YWdlQzExLAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZVN3aWZ0LAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZUp1bGlhLAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZUR5bGFuLAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZUNfcGx1c19wbHVzXzE0LAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZUZvcnRyYW4wMywKKyAgTExWTURXQVJGU291cmNlTGFuZ3VhZ2VGb3J0cmFuMDgsCisgIExMVk1EV0FSRlNvdXJjZUxhbmd1YWdlUmVuZGVyU2NyaXB0LAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZUJMSVNTLAorICAvLyBWZW5kb3IgZXh0ZW5zaW9uczoKKyAgTExWTURXQVJGU291cmNlTGFuZ3VhZ2VNaXBzX0Fzc2VtYmxlciwKKyAgTExWTURXQVJGU291cmNlTGFuZ3VhZ2VHT09HTEVfUmVuZGVyU2NyaXB0LAorICBMTFZNRFdBUkZTb3VyY2VMYW5ndWFnZUJPUkxBTkRfRGVscGhpCit9IExMVk1EV0FSRlNvdXJjZUxhbmd1YWdlOworCisvKioKKyAqIFRoZSBhbW91bnQgb2YgZGVidWcgaW5mb3JtYXRpb24gdG8gZW1pdC4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBMTFZNRFdBUkZFbWlzc2lvbk5vbmUgPSAwLAorICAgIExMVk1EV0FSRkVtaXNzaW9uRnVsbCwKKyAgICBMTFZNRFdBUkZFbWlzc2lvbkxpbmVUYWJsZXNPbmx5Cit9IExMVk1EV0FSRkVtaXNzaW9uS2luZDsKKworLyoqCisgKiBUaGUgY3VycmVudCBkZWJ1ZyBtZXRhZGF0YSB2ZXJzaW9uIG51bWJlci4KKyAqLwordW5zaWduZWQgTExWTURlYnVnTWV0YWRhdGFWZXJzaW9uKHZvaWQpOworCisvKioKKyAqIFRoZSB2ZXJzaW9uIG9mIGRlYnVnIG1ldGFkYXRhIHRoYXQncyBwcmVzZW50IGluIHRoZSBwcm92aWRlZCBcYyBNb2R1bGUuCisgKi8KK3Vuc2lnbmVkIExMVk1HZXRNb2R1bGVEZWJ1Z01ldGFkYXRhVmVyc2lvbihMTFZNTW9kdWxlUmVmIE1vZHVsZSk7CisKKy8qKgorICogU3RyaXAgZGVidWcgaW5mbyBpbiB0aGUgbW9kdWxlIGlmIGl0IGV4aXN0cy4KKyAqIFRvIGRvIHRoaXMsIHdlIHJlbW92ZSBhbGwgY2FsbHMgdG8gdGhlIGRlYnVnZ2VyIGludHJpbnNpY3MgYW5kIGFueSBuYW1lZAorICogbWV0YWRhdGEgZm9yIGRlYnVnZ2luZy4gV2UgYWxzbyByZW1vdmUgZGVidWcgbG9jYXRpb25zIGZvciBpbnN0cnVjdGlvbnMuCisgKiBSZXR1cm4gdHJ1ZSBpZiBtb2R1bGUgaXMgbW9kaWZpZWQuCisgKi8KK0xMVk1Cb29sIExMVk1TdHJpcE1vZHVsZURlYnVnSW5mbyhMTFZNTW9kdWxlUmVmIE1vZHVsZSk7CisKKy8qKgorICogQ29uc3RydWN0IGEgYnVpbGRlciBmb3IgYSBtb2R1bGUsIGFuZCBkbyBub3QgYWxsb3cgZm9yIHVucmVzb2x2ZWQgbm9kZXMKKyAqIGF0dGFjaGVkIHRvIHRoZSBtb2R1bGUuCisgKi8KK0xMVk1ESUJ1aWxkZXJSZWYgTExWTUNyZWF0ZURJQnVpbGRlckRpc2FsbG93VW5yZXNvbHZlZChMTFZNTW9kdWxlUmVmIE0pOworCisvKioKKyAqIENvbnN0cnVjdCBhIGJ1aWxkZXIgZm9yIGEgbW9kdWxlIGFuZCBjb2xsZWN0IHVucmVzb2x2ZWQgbm9kZXMgYXR0YWNoZWQKKyAqIHRvIHRoZSBtb2R1bGUgaW4gb3JkZXIgdG8gcmVzb2x2ZSBjeWNsZXMgZHVyaW5nIGEgY2FsbCB0bworICogXGMgTExWTURJQnVpbGRlckZpbmFsaXplLgorICovCitMTFZNRElCdWlsZGVyUmVmIExMVk1DcmVhdGVESUJ1aWxkZXIoTExWTU1vZHVsZVJlZiBNKTsKKworLyoqCisgKiBEZWFsbG9jYXRlcyB0aGUgXGMgRElCdWlsZGVyIGFuZCBldmVyeXRoaW5nIGl0IG93bnMuCisgKiBAbm90ZSBZb3UgbXVzdCBjYWxsIFxjIExMVk1ESUJ1aWxkZXJGaW5hbGl6ZSBiZWZvcmUgdGhpcworICovCit2b2lkIExMVk1EaXNwb3NlRElCdWlsZGVyKExMVk1ESUJ1aWxkZXJSZWYgQnVpbGRlcik7CisKKy8qKgorICogQ29uc3RydWN0IGFueSBkZWZlcnJlZCBkZWJ1ZyBpbmZvIGRlc2NyaXB0b3JzLgorICovCit2b2lkIExMVk1ESUJ1aWxkZXJGaW5hbGl6ZShMTFZNRElCdWlsZGVyUmVmIEJ1aWxkZXIpOworCisvKioKKyAqIEEgQ29tcGlsZVVuaXQgcHJvdmlkZXMgYW4gYW5jaG9yIGZvciBhbGwgZGVidWdnaW5nCisgKiBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQgZHVyaW5nIHRoaXMgaW5zdGFuY2Ugb2YgY29tcGlsYXRpb24uCisgKiBccGFyYW0gTGFuZyAgICAgICAgICBTb3VyY2UgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIGVnLgorICogICAgICAgICAgICAgICAgICAgICAgXGMgTExWTURXQVJGU291cmNlTGFuZ3VhZ2VDOTkKKyAqIFxwYXJhbSBGaWxlUmVmICAgICAgIEZpbGUgaW5mby4KKyAqIFxwYXJhbSBQcm9kdWNlciAgICAgIElkZW50aWZ5IHRoZSBwcm9kdWNlciBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBjb2RlLiAgVXN1YWxseSB0aGlzIGlzIGEgY29tcGlsZXIKKyAqICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gc3RyaW5nLgorICogXHBhcmFtIFByb2R1Y2VyTGVuICAgVGhlIGxlbmd0aCBvZiB0aGUgQyBzdHJpbmcgcGFzc2VkIHRvIFxjIFByb2R1Y2VyLgorICogXHBhcmFtIGlzT3B0aW1pemVkICAgQSBib29sZWFuIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgb3B0aW1pemF0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICBpcyBlbmFibGVkIG9yIG5vdC4KKyAqIFxwYXJhbSBGbGFncyAgICAgICAgIFRoaXMgc3RyaW5nIGxpc3RzIGNvbW1hbmQgbGluZSBvcHRpb25zLiBUaGlzCisgKiAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXMgZGlyZWN0bHkgZW1iZWRkZWQgaW4gZGVidWcgaW5mbworICogICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHdoaWNoIG1heSBiZSB1c2VkIGJ5IGEgdG9vbAorICogICAgICAgICAgICAgICAgICAgICAgYW5hbHl6aW5nIGdlbmVyYXRlZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisgKiBccGFyYW0gRmxhZ3NMZW4gICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBDIHN0cmluZyBwYXNzZWQgdG8gXGMgRmxhZ3MuCisgKiBccGFyYW0gUnVudGltZVZlciAgICBUaGlzIGluZGljYXRlcyBydW50aW1lIHZlcnNpb24gZm9yIGxhbmd1YWdlcyBsaWtlCisgKiAgICAgICAgICAgICAgICAgICAgICBPYmplY3RpdmUtQy4KKyAqIFxwYXJhbSBTcGxpdE5hbWUgICAgIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgd2UnbGwgc3BsaXQgZGVidWcgaW5mbworICogICAgICAgICAgICAgICAgICAgICAgb3V0IGludG8uCisgKiBccGFyYW0gU3BsaXROYW1lTGVuICBUaGUgbGVuZ3RoIG9mIHRoZSBDIHN0cmluZyBwYXNzZWQgdG8gXGMgU3BsaXROYW1lLgorICogXHBhcmFtIEtpbmQgICAgICAgICAgVGhlIGtpbmQgb2YgZGVidWcgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUuCisgKiBccGFyYW0gRFdPSWQgICAgICAgICBUaGUgRFdPSWQgaWYgdGhpcyBpcyBhIHNwbGl0IHNrZWxldG9uIGNvbXBpbGUgdW5pdC4KKyAqIFxwYXJhbSBTcGxpdERlYnVnSW5saW5pbmcgICAgV2hldGhlciB0byBlbWl0IGlubGluZSBkZWJ1ZyBpbmZvLgorICogXHBhcmFtIERlYnVnSW5mb0ZvclByb2ZpbGluZyBXaGV0aGVyIHRvIGVtaXQgZXh0cmEgZGVidWcgaW5mbyBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSBjb2xsZWN0aW9uLgorICovCitMTFZNTWV0YWRhdGFSZWYgTExWTURJQnVpbGRlckNyZWF0ZUNvbXBpbGVVbml0KAorICAgIExMVk1ESUJ1aWxkZXJSZWYgQnVpbGRlciwgTExWTURXQVJGU291cmNlTGFuZ3VhZ2UgTGFuZywKKyAgICBMTFZNTWV0YWRhdGFSZWYgRmlsZVJlZiwgY29uc3QgY2hhciAqUHJvZHVjZXIsIHNpemVfdCBQcm9kdWNlckxlbiwKKyAgICBMTFZNQm9vbCBpc09wdGltaXplZCwgY29uc3QgY2hhciAqRmxhZ3MsIHNpemVfdCBGbGFnc0xlbiwKKyAgICB1bnNpZ25lZCBSdW50aW1lVmVyLCBjb25zdCBjaGFyICpTcGxpdE5hbWUsIHNpemVfdCBTcGxpdE5hbWVMZW4sCisgICAgTExWTURXQVJGRW1pc3Npb25LaW5kIEtpbmQsIHVuc2lnbmVkIERXT0lkLCBMTFZNQm9vbCBTcGxpdERlYnVnSW5saW5pbmcsCisgICAgTExWTUJvb2wgRGVidWdJbmZvRm9yUHJvZmlsaW5nKTsKKworLyoqCisgKiBDcmVhdGUgYSBmaWxlIGRlc2NyaXB0b3IgdG8gaG9sZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGEgZmlsZS4KKyAqIFxwYXJhbSBCdWlsZGVyICAgICAgVGhlIFxjIERJQnVpbGRlci4KKyAqIFxwYXJhbSBGaWxlbmFtZSAgICAgRmlsZSBuYW1lLgorICogXHBhcmFtIEZpbGVuYW1lTGVuICBUaGUgbGVuZ3RoIG9mIHRoZSBDIHN0cmluZyBwYXNzZWQgdG8gXGMgRmlsZW5hbWUuCisgKiBccGFyYW0gRGlyZWN0b3J5ICAgIERpcmVjdG9yeS4KKyAqIFxwYXJhbSBEaXJlY3RvcnlMZW4gVGhlIGxlbmd0aCBvZiB0aGUgQyBzdHJpbmcgcGFzc2VkIHRvIFxjIERpcmVjdG9yeS4KKyAqLworTExWTU1ldGFkYXRhUmVmCitMTFZNRElCdWlsZGVyQ3JlYXRlRmlsZShMTFZNRElCdWlsZGVyUmVmIEJ1aWxkZXIsIGNvbnN0IGNoYXIgKkZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEZpbGVuYW1lTGVuLCBjb25zdCBjaGFyICpEaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgRGlyZWN0b3J5TGVuKTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IERlYnVnTG9jYXRpb24gdGhhdCBkZXNjcmliZXMgYSBzb3VyY2UgbG9jYXRpb24uCisgKiBccGFyYW0gTGluZSBUaGUgbGluZSBpbiB0aGUgc291cmNlIGZpbGUuCisgKiBccGFyYW0gQ29sdW1uIFRoZSBjb2x1bW4gaW4gdGhlIHNvdXJjZSBmaWxlLgorICogXHBhcmFtIFNjb3BlIFRoZSBzY29wZSBpbiB3aGljaCB0aGUgbG9jYXRpb24gcmVzaWRlcy4KKyAqIFxwYXJhbSBJbmxpbmVkQXQgVGhlIHNjb3BlIHdoZXJlIHRoaXMgbG9jYXRpb24gd2FzIGlubGluZWQsIGlmIGF0IGFsbC4KKyAqICAgICAgICAgICAgICAgICAgKG9wdGlvbmFsKS4KKyAqIFxub3RlIElmIHRoZSBpdGVtIHRvIHdoaWNoIHRoaXMgbG9jYXRpb24gaXMgYXR0YWNoZWQgY2Fubm90IGJlCisgKiAgICAgICBhdHRyaWJ1dGVkIHRvIGEgc291cmNlIGxpbmUsIHBhc3MgMCBmb3IgdGhlIGxpbmUgYW5kIGNvbHVtbi4KKyAqLworTExWTU1ldGFkYXRhUmVmCitMTFZNRElCdWlsZGVyQ3JlYXRlRGVidWdMb2NhdGlvbihMTFZNQ29udGV4dFJlZiBDdHgsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2x1bW4sIExMVk1NZXRhZGF0YVJlZiBTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NZXRhZGF0YVJlZiBJbmxpbmVkQXQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZW5kIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9EaXNhc3NlbWJsZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9EaXNhc3NlbWJsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTgwYjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL0Rpc2Fzc2VtYmxlci5oCkBAIC0wLDAgKzEsMTEzIEBACisvKj09PS0tIGxsdm0tYy9EaXNhc3NlbWJsZXIuaCAtIERpc2Fzc2VtYmxlciBQdWJsaWMgQyBJbnRlcmZhY2UgLS0tKi0gQyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGhlYWRlciBwcm92aWRlcyBhIHB1YmxpYyBpbnRlcmZhY2UgdG8gYSBkaXNhc3NlbWJsZXIgbGlicmFyeS4gICAgICAgICAqfAorfCogTExWTSBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIExMVk1fQ19ESVNBU1NFTUJMRVJfSAorI2RlZmluZSBMTFZNX0NfRElTQVNTRU1CTEVSX0gKKworI2luY2x1ZGUgImxsdm0tYy9EaXNhc3NlbWJsZXJUeXBlcy5oIgorCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ0Rpc2Fzc2VtYmxlciBEaXNhc3NlbWJsZXIKKyAqIEBpbmdyb3VwIExMVk1DCisgKgorICogQHsKKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qICFkZWZpbmVkKF9fY3BsdXNwbHVzKSAqLworCisvKioKKyAqIENyZWF0ZSBhIGRpc2Fzc2VtYmxlciBmb3IgdGhlIFRyaXBsZU5hbWUuICBTeW1ib2xpYyBkaXNhc3NlbWJseSBpcyBzdXBwb3J0ZWQKKyAqIGJ5IHBhc3NpbmcgYSBibG9jayBvZiBpbmZvcm1hdGlvbiBpbiB0aGUgRGlzSW5mbyBwYXJhbWV0ZXIgYW5kIHNwZWNpZnlpbmcgdGhlCisgKiBUYWdUeXBlIGFuZCBjYWxsYmFjayBmdW5jdGlvbnMgYXMgZGVzY3JpYmVkIGFib3ZlLiAgVGhlc2UgY2FuIGFsbCBiZSBwYXNzZWQKKyAqIGFzIE5VTEwuICBJZiBzdWNjZXNzZnVsLCB0aGlzIHJldHVybnMgYSBkaXNhc3NlbWJsZXIgY29udGV4dC4gIElmIG5vdCwgaXQKKyAqIHJldHVybnMgTlVMTC4gVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAqIExMVk1DcmVhdGVEaXNhc21DUFVGZWF0dXJlcygpIHdpdGggYW4gZW1wdHkgQ1BVIG5hbWUgYW5kIGZlYXR1cmUgc2V0LgorICovCitMTFZNRGlzYXNtQ29udGV4dFJlZiBMTFZNQ3JlYXRlRGlzYXNtKGNvbnN0IGNoYXIgKlRyaXBsZU5hbWUsIHZvaWQgKkRpc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBUYWdUeXBlLCBMTFZNT3BJbmZvQ2FsbGJhY2sgR2V0T3BJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNU3ltYm9sTG9va3VwQ2FsbGJhY2sgU3ltYm9sTG9va1VwKTsKKworLyoqCisgKiBDcmVhdGUgYSBkaXNhc3NlbWJsZXIgZm9yIHRoZSBUcmlwbGVOYW1lIGFuZCBhIHNwZWNpZmljIENQVS4gIFN5bWJvbGljCisgKiBkaXNhc3NlbWJseSBpcyBzdXBwb3J0ZWQgYnkgcGFzc2luZyBhIGJsb2NrIG9mIGluZm9ybWF0aW9uIGluIHRoZSBEaXNJbmZvCisgKiBwYXJhbWV0ZXIgYW5kIHNwZWNpZnlpbmcgdGhlIFRhZ1R5cGUgYW5kIGNhbGxiYWNrIGZ1bmN0aW9ucyBhcyBkZXNjcmliZWQKKyAqIGFib3ZlLiAgVGhlc2UgY2FuIGFsbCBiZSBwYXNzZWQgKiBhcyBOVUxMLiAgSWYgc3VjY2Vzc2Z1bCwgdGhpcyByZXR1cm5zIGEKKyAqIGRpc2Fzc2VtYmxlciBjb250ZXh0LiAgSWYgbm90LCBpdCByZXR1cm5zIE5VTEwuIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudAorICogdG8gY2FsbGluZyBMTFZNQ3JlYXRlRGlzYXNtQ1BVRmVhdHVyZXMoKSB3aXRoIGFuIGVtcHR5IGZlYXR1cmUgc2V0LgorICovCitMTFZNRGlzYXNtQ29udGV4dFJlZiBMTFZNQ3JlYXRlRGlzYXNtQ1BVKGNvbnN0IGNoYXIgKlRyaXBsZSwgY29uc3QgY2hhciAqQ1BVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpEaXNJbmZvLCBpbnQgVGFnVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU9wSW5mb0NhbGxiYWNrIEdldE9wSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVN5bWJvbExvb2t1cENhbGxiYWNrIFN5bWJvbExvb2tVcCk7CisKKy8qKgorICogQ3JlYXRlIGEgZGlzYXNzZW1ibGVyIGZvciB0aGUgVHJpcGxlTmFtZSwgYSBzcGVjaWZpYyBDUFUgYW5kIHNwZWNpZmljIGZlYXR1cmUKKyAqIHN0cmluZy4gIFN5bWJvbGljIGRpc2Fzc2VtYmx5IGlzIHN1cHBvcnRlZCBieSBwYXNzaW5nIGEgYmxvY2sgb2YgaW5mb3JtYXRpb24KKyAqIGluIHRoZSBEaXNJbmZvIHBhcmFtZXRlciBhbmQgc3BlY2lmeWluZyB0aGUgVGFnVHlwZSBhbmQgY2FsbGJhY2sgZnVuY3Rpb25zIGFzCisgKiBkZXNjcmliZWQgYWJvdmUuICBUaGVzZSBjYW4gYWxsIGJlIHBhc3NlZCAqIGFzIE5VTEwuICBJZiBzdWNjZXNzZnVsLCB0aGlzCisgKiByZXR1cm5zIGEgZGlzYXNzZW1ibGVyIGNvbnRleHQuICBJZiBub3QsIGl0IHJldHVybnMgTlVMTC4KKyAqLworTExWTURpc2FzbUNvbnRleHRSZWYKK0xMVk1DcmVhdGVEaXNhc21DUFVGZWF0dXJlcyhjb25zdCBjaGFyICpUcmlwbGUsIGNvbnN0IGNoYXIgKkNQVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpGZWF0dXJlcywgdm9pZCAqRGlzSW5mbywgaW50IFRhZ1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU9wSW5mb0NhbGxiYWNrIEdldE9wSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNU3ltYm9sTG9va3VwQ2FsbGJhY2sgU3ltYm9sTG9va1VwKTsKKworLyoqCisgKiBTZXQgdGhlIGRpc2Fzc2VtYmxlcidzIG9wdGlvbnMuICBSZXR1cm5zIDEgaWYgaXQgY2FuIHNldCB0aGUgT3B0aW9ucyBhbmQgMAorICogb3RoZXJ3aXNlLgorICovCitpbnQgTExWTVNldERpc2FzbU9wdGlvbnMoTExWTURpc2FzbUNvbnRleHRSZWYgREMsIHVpbnQ2NF90IE9wdGlvbnMpOworCisvKiBUaGUgb3B0aW9uIHRvIHByb2R1Y2UgbWFya2VkIHVwIGFzc2VtYmx5LiAqLworI2RlZmluZSBMTFZNRGlzYXNzZW1ibGVyX09wdGlvbl9Vc2VNYXJrdXAgMQorLyogVGhlIG9wdGlvbiB0byBwcmludCBpbW1lZGlhdGVzIGFzIGhleC4gKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9PcHRpb25fUHJpbnRJbW1IZXggMgorLyogVGhlIG9wdGlvbiB1c2UgdGhlIG90aGVyIGFzc2VtYmxlciBwcmludGVyIHZhcmlhbnQgKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9PcHRpb25fQXNtUHJpbnRlclZhcmlhbnQgNAorLyogVGhlIG9wdGlvbiB0byBzZXQgY29tbWVudCBvbiBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9PcHRpb25fU2V0SW5zdHJDb21tZW50cyA4CisgIC8qIFRoZSBvcHRpb24gdG8gcHJpbnQgbGF0ZW5jeSBpbmZvcm1hdGlvbiBhbG9uZ3NpZGUgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIExMVk1EaXNhc3NlbWJsZXJfT3B0aW9uX1ByaW50TGF0ZW5jeSAxNgorCisvKioKKyAqIERpc3Bvc2Ugb2YgYSBkaXNhc3NlbWJsZXIgY29udGV4dC4KKyAqLwordm9pZCBMTFZNRGlzYXNtRGlzcG9zZShMTFZNRGlzYXNtQ29udGV4dFJlZiBEQyk7CisKKy8qKgorICogRGlzYXNzZW1ibGUgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gdXNpbmcgdGhlIGRpc2Fzc2VtYmxlciBjb250ZXh0IHNwZWNpZmllZCBpbgorICogdGhlIHBhcmFtZXRlciBEQy4gIFRoZSBieXRlcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIHNwZWNpZmllZCBpbiB0aGUKKyAqIHBhcmFtZXRlciBCeXRlcywgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IEJ5dGVzU2l6ZSBudW1iZXIgb2YgYnl0ZXMuICBUaGUKKyAqIGluc3RydWN0aW9uIGlzIGF0IHRoZSBhZGRyZXNzIHNwZWNpZmllZCBieSB0aGUgUEMgcGFyYW1ldGVyLiAgSWYgYSB2YWxpZAorICogaW5zdHJ1Y3Rpb24gY2FuIGJlIGRpc2Fzc2VtYmxlZCwgaXRzIHN0cmluZyBpcyByZXR1cm5lZCBpbmRpcmVjdGx5IGluCisgKiBPdXRTdHJpbmcgd2hvc2Ugc2l6ZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHBhcmFtZXRlciBPdXRTdHJpbmdTaXplLiAgVGhpcworICogZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBpbnN0cnVjdGlvbiBvciB6ZXJvIGlmIHRoZXJlIHdhcworICogbm8gdmFsaWQgaW5zdHJ1Y3Rpb24uCisgKi8KK3NpemVfdCBMTFZNRGlzYXNtSW5zdHJ1Y3Rpb24oTExWTURpc2FzbUNvbnRleHRSZWYgREMsIHVpbnQ4X3QgKkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBCeXRlc1NpemUsIHVpbnQ2NF90IFBDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpPdXRTdHJpbmcsIHNpemVfdCBPdXRTdHJpbmdTaXplKTsKKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qICFkZWZpbmVkKF9fY3BsdXNwbHVzKSAqLworCisjZW5kaWYgLyogTExWTV9DX0RJU0FTU0VNQkxFUl9IICovCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvRGlzYXNzZW1ibGVyVHlwZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9EaXNhc3NlbWJsZXJUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzU0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvRGlzYXNzZW1ibGVyVHlwZXMuaApAQCAtMCwwICsxLDE2MCBAQAorLyo9PT0tLSBsbHZtLWMvRGlzYXNzZW1ibGVyVHlwZWRlZnMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICp8Cit8KiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9ESVNBU1NFTUJMRVJfVFlQRVNfSAorI2RlZmluZSBMTFZNX0RJU0FTU0VNQkxFUl9UWVBFU19ICisKKyNpbmNsdWRlICJsbHZtLWMvRGF0YVR5cGVzLmgiCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorCisvKioKKyAqIEFuIG9wYXF1ZSByZWZlcmVuY2UgdG8gYSBkaXNhc3NlbWJsZXIgY29udGV4dC4KKyAqLwordHlwZWRlZiB2b2lkICpMTFZNRGlzYXNtQ29udGV4dFJlZjsKKworLyoqCisgKiBUaGUgdHlwZSBmb3IgdGhlIG9wZXJhbmQgaW5mb3JtYXRpb24gY2FsbCBiYWNrIGZ1bmN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgdG8KKyAqIGdldCB0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24gZm9yIGFuIG9wZXJhbmQgb2YgYW4gaW5zdHJ1Y3Rpb24uICBUeXBpY2FsbHkKKyAqIHRoaXMgaXMgZnJvbSB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiwgc3ltYm9sIHRhYmxlLCBldGMuICBUaGF0IGJsb2NrIG9mCisgKiBpbmZvcm1hdGlvbiBpcyBzYXZlZCB3aGVuIHRoZSBkaXNhc3NlbWJsZXIgY29udGV4dCBpcyBjcmVhdGVkIGFuZCBwYXNzZWQgdG8KKyAqIHRoZSBjYWxsIGJhY2sgaW4gdGhlIERpc0luZm8gcGFyYW1ldGVyLiAgVGhlIGluc3RydWN0aW9uIGNvbnRhaW5pbmcgb3BlcmFuZAorICogaXMgYXQgdGhlIFBDIHBhcmFtZXRlci4gIEZvciBzb21lIGluc3RydWN0aW9uIHNldHMsIHRoZXJlIGNhbiBiZSBtb3JlIHRoYW4KKyAqIG9uZSBvcGVyYW5kIHdpdGggc3ltYm9saWMgaW5mb3JtYXRpb24uICBUbyBkZXRlcm1pbmUgdGhlIHN5bWJvbGljIG9wZXJhbmQKKyAqIGluZm9ybWF0aW9uIGZvciBlYWNoIG9wZXJhbmQsIHRoZSBieXRlcyBmb3IgdGhlIHNwZWNpZmljIG9wZXJhbmQgaW4gdGhlCisgKiBpbnN0cnVjdGlvbiBhcmUgc3BlY2lmaWVkIGJ5IHRoZSBPZmZzZXQgcGFyYW1ldGVyIGFuZCBpdHMgYnl0ZSB3aWRpdGggaXMgdGhlCisgKiBzaXplIHBhcmFtZXRlci4gIEZvciBpbnN0cnVjdGlvbnMgc2V0cyB3aXRoIGZpeGVkIHdpZHRocyBhbmQgb25lIHN5bWJvbGljCisgKiBvcGVyYW5kIHBlciBpbnN0cnVjdGlvbiwgdGhlIE9mZnNldCBwYXJhbWV0ZXIgd2lsbCBiZSB6ZXJvIGFuZCBTaXplIHBhcmFtZXRlcgorICogd2lsbCBiZSB0aGUgaW5zdHJ1Y3Rpb24gd2lkdGguICBUaGUgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gVGFnQnVmIGFuZCBpcworICogVHJpcGxlIHNwZWNpZmljIHdpdGggaXRzIHNwZWNpZmljIGluZm9ybWF0aW9uIGRlZmluZWQgYnkgdGhlIHZhbHVlIG9mCisgKiBUYWdUeXBlIGZvciB0aGF0IFRyaXBsZS4gIElmIHN5bWJvbGljIGluZm9ybWF0aW9uIGlzIHJldHVybmVkIHRoZSBmdW5jdGlvbgorICogcmV0dXJucyAxLCBvdGhlcndpc2UgaXQgcmV0dXJucyAwLgorICovCit0eXBlZGVmIGludCAoKkxMVk1PcEluZm9DYWxsYmFjaykodm9pZCAqRGlzSW5mbywgdWludDY0X3QgUEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0LCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBUYWdUeXBlLCB2b2lkICpUYWdCdWYpOworCisvKioKKyAqIFRoZSBpbml0aWFsIHN1cHBvcnQgaW4gTExWTSBNQyBmb3IgdGhlIG1vc3QgZ2VuZXJhbCBmb3JtIG9mIGEgcmVsb2NhdGFibGUKKyAqIGV4cHJlc3Npb24gaXMgIkFkZFN5bWJvbCAtIFN1YnRyYWN0U3ltYm9sICsgT2Zmc2V0Ii4gIEZvciBzb21lIERhcndpbiB0YXJnZXRzCisgKiB0aGlzIGZ1bGwgZm9ybSBpcyBlbmNvZGVkIGluIHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHNvIHRoYXQgQWRkU3ltYm9sIGFuZAorICogU3VidHJhY3RTeW1ib2wgY2FuIGJlIGxpbmsgZWRpdGVkIGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIuICBNYW55IG90aGVyCisgKiBwbGF0Zm9ybXMgb25seSBhbGxvdyBhIHJlbG9jYXRhYmxlIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gQWRkU3ltYm9sICsgT2Zmc2V0CisgKiB0byBiZSBlbmNvZGVkLgorICoKKyAqIFRoZSBMTFZNT3BJbmZvQ2FsbGJhY2soKSBmb3IgdGhlIFRhZ1R5cGUgdmFsdWUgb2YgMSB1c2VzIHRoZSBzdHJ1Y3QKKyAqIExMVk1PcEluZm8xLiAgVGhlIHZhbHVlIG9mIHRoZSByZWxvY2F0YWJsZSBleHByZXNzaW9uIGZvciB0aGUgb3BlcmFuZCwKKyAqIGluY2x1ZGluZyBhbnkgUEMgYWRqdXN0bWVudCwgaXMgcGFzc2VkIGluIHRvIHRoZSBjYWxsIGJhY2sgaW4gdGhlIFZhbHVlCisgKiBmaWVsZC4gIFRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3BlcmFuZCBpcyByZXR1cm5lZCB1c2luZyBhbGwKKyAqIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdHVyZSB3aXRoIHRoZSBPZmZzZXQgb2YgdGhlIHJlbG9jYXRhYmxlIGV4cHJlc3Npb24KKyAqIHJldHVybmVkIGluIHRoZSBWYWx1ZSBmaWVsZC4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgc29tZSBzeW1ib2xzIGluIHRoZQorICogcmVsb2NhdGFibGUgZXhwcmVzc2lvbiB3ZXJlIGFzc2VtYmx5IHRlbXBvcmFyeSBzeW1ib2xzLCBmb3IgZXhhbXBsZQorICogIkxkYXRhIC0gTHBpY0Jhc2UgKyBjb25zdGFudCIsIGFuZCBvbmx5IHRoZSBWYWx1ZXMgb2YgdGhlIHN5bWJvbHMgd2l0aG91dAorICogc3ltYm9sIG5hbWVzIGFyZSBwcmVzZW50IGluIHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLiAgVGhlIFZhcmlhbnRLaW5kCisgKiB0eXBlIGlzIG9uZSBvZiB0aGUgVGFyZ2V0IHNwZWNpZmljICNkZWZpbmVzIGJlbG93IGFuZCBpcyB1c2VkIHRvIHByaW50CisgKiBvcGVyYW5kcyBsaWtlICJfZm9vQEdPVCIsICI6bG93ZXIxNjpfZm9vIiwgZXRjLgorICovCitzdHJ1Y3QgTExWTU9wSW5mb1N5bWJvbDEgeworICB1aW50NjRfdCBQcmVzZW50OyAgLyogMSBpZiB0aGlzIHN5bWJvbCBpcyBwcmVzZW50ICovCisgIGNvbnN0IGNoYXIgKk5hbWU7ICAvKiBzeW1ib2wgbmFtZSBpZiBub3QgTlVMTCAqLworICB1aW50NjRfdCBWYWx1ZTsgICAgLyogc3ltYm9sIHZhbHVlIGlmIG5hbWUgaXMgTlVMTCAqLworfTsKKworc3RydWN0IExMVk1PcEluZm8xIHsKKyAgc3RydWN0IExMVk1PcEluZm9TeW1ib2wxIEFkZFN5bWJvbDsKKyAgc3RydWN0IExMVk1PcEluZm9TeW1ib2wxIFN1YnRyYWN0U3ltYm9sOworICB1aW50NjRfdCBWYWx1ZTsKKyAgdWludDY0X3QgVmFyaWFudEtpbmQ7Cit9OworCisvKioKKyAqIFRoZSBvcGVyYW5kIFZhcmlhbnRLaW5kcyBmb3Igc3ltYm9saWMgZGlzYXNzZW1ibHkuCisgKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9WYXJpYW50S2luZF9Ob25lIDAgLyogYWxsIHRhcmdldHMgKi8KKworLyoqCisgKiBUaGUgQVJNIHRhcmdldCBWYXJpYW50S2luZHMuCisgKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9WYXJpYW50S2luZF9BUk1fSEkxNiAxIC8qIDp1cHBlcjE2OiAqLworI2RlZmluZSBMTFZNRGlzYXNzZW1ibGVyX1ZhcmlhbnRLaW5kX0FSTV9MTzE2IDIgLyogOmxvd2VyMTY6ICovCisKKy8qKgorICogVGhlIEFSTTY0IHRhcmdldCBWYXJpYW50S2luZHMuCisgKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9WYXJpYW50S2luZF9BUk02NF9QQUdFICAgICAgIDEgLyogQHBhZ2UgKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9WYXJpYW50S2luZF9BUk02NF9QQUdFT0ZGICAgIDIgLyogQHBhZ2VvZmYgKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9WYXJpYW50S2luZF9BUk02NF9HT1RQQUdFICAgIDMgLyogQGdvdHBhZ2UgKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9WYXJpYW50S2luZF9BUk02NF9HT1RQQUdFT0ZGIDQgLyogQGdvdHBhZ2VvZmYgKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9WYXJpYW50S2luZF9BUk02NF9UTFZQICAgICAgIDUgLyogQHR2bHBwYWdlICovCisjZGVmaW5lIExMVk1EaXNhc3NlbWJsZXJfVmFyaWFudEtpbmRfQVJNNjRfVExWT0ZGICAgICA2IC8qIEB0dmxwcGFnZW9mZiAqLworCisvKioKKyAqIFRoZSB0eXBlIGZvciB0aGUgc3ltYm9sIGxvb2t1cCBmdW5jdGlvbi4gIFRoaXMgbWF5IGJlIGNhbGxlZCBieSB0aGUKKyAqIGRpc2Fzc2VtYmxlciBmb3IgdGhpbmdzIGxpa2UgYWRkaW5nIGEgY29tbWVudCBmb3IgYSBQQyBwbHVzIGEgY29uc3RhbnQKKyAqIG9mZnNldCBsb2FkIGluc3RydWN0aW9uIHRvIHVzZSBhIHN5bWJvbCBuYW1lIGluc3RlYWQgb2YgYSBsb2FkIGFkZHJlc3MgdmFsdWUuCisgKiBJdCBpcyBwYXNzZWQgdGhlIGJsb2NrIGluZm9ybWF0aW9uIGlzIHNhdmVkIHdoZW4gdGhlIGRpc2Fzc2VtYmxlciBjb250ZXh0IGlzCisgKiBjcmVhdGVkIGFuZCB0aGUgUmVmZXJlbmNlVmFsdWUgdG8gbG9vayB1cCBhcyBhIHN5bWJvbC4gIElmIG5vIHN5bWJvbCBpcyBmb3VuZAorICogZm9yIHRoZSBSZWZlcmVuY2VWYWx1ZSBOVUxMIGlzIHJldHVybmVkLiAgVGhlIFJlZmVyZW5jZVR5cGUgb2YgdGhlCisgKiBpbnN0cnVjdGlvbiBpcyBwYXNzZWQgaW5kaXJlY3RseSBhcyBpcyB0aGUgUEMgb2YgdGhlIGluc3RydWN0aW9uIGluCisgKiBSZWZlcmVuY2VQQy4gIElmIHRoZSBvdXRwdXQgcmVmZXJlbmNlIGNhbiBiZSBkZXRlcm1pbmVkIGl0cyB0eXBlIGlzIHJldHVybmVkCisgKiBpbmRpcmVjdGx5IGluIFJlZmVyZW5jZVR5cGUgYWxvbmcgd2l0aCBSZWZlcmVuY2VOYW1lIGlmIGFueSwgb3IgdGhhdCBpcyBzZXQKKyAqIHRvIE5VTEwuCisgKi8KK3R5cGVkZWYgY29uc3QgY2hhciAqKCpMTFZNU3ltYm9sTG9va3VwQ2FsbGJhY2spKHZvaWQgKkRpc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBSZWZlcmVuY2VWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICpSZWZlcmVuY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgUmVmZXJlbmNlUEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqUmVmZXJlbmNlTmFtZSk7CisvKioKKyAqIFRoZSByZWZlcmVuY2UgdHlwZXMgb24gaW5wdXQgYW5kIG91dHB1dC4KKyAqLworLyogTm8gaW5wdXQgcmVmZXJlbmNlIHR5cGUgb3Igbm8gb3V0cHV0IHJlZmVyZW5jZSB0eXBlLiAqLworI2RlZmluZSBMTFZNRGlzYXNzZW1ibGVyX1JlZmVyZW5jZVR5cGVfSW5PdXRfTm9uZSAwCisKKy8qIFRoZSBpbnB1dCByZWZlcmVuY2UgaXMgZnJvbSBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9SZWZlcmVuY2VUeXBlX0luX0JyYW5jaCAxCisvKiBUaGUgaW5wdXQgcmVmZXJlbmNlIGlzIGZyb20gYSBQQyByZWxhdGl2ZSBsb2FkIGluc3RydWN0aW9uLiAqLworI2RlZmluZSBMTFZNRGlzYXNzZW1ibGVyX1JlZmVyZW5jZVR5cGVfSW5fUENyZWxfTG9hZCAyCisKKy8qIFRoZSBpbnB1dCByZWZlcmVuY2UgaXMgZnJvbSBhbiBBUk02NDo6QURSUCBpbnN0cnVjdGlvbi4gKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9SZWZlcmVuY2VUeXBlX0luX0FSTTY0X0FEUlAgMHgxMDAwMDAwMDEKKy8qIFRoZSBpbnB1dCByZWZlcmVuY2UgaXMgZnJvbSBhbiBBUk02NDo6QUREWHJpIGluc3RydWN0aW9uLiAqLworI2RlZmluZSBMTFZNRGlzYXNzZW1ibGVyX1JlZmVyZW5jZVR5cGVfSW5fQVJNNjRfQUREWHJpIDB4MTAwMDAwMDAyCisvKiBUaGUgaW5wdXQgcmVmZXJlbmNlIGlzIGZyb20gYW4gQVJNNjQ6OkxEUlh1aSBpbnN0cnVjdGlvbi4gKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9SZWZlcmVuY2VUeXBlX0luX0FSTTY0X0xEUlh1aSAweDEwMDAwMDAwMworLyogVGhlIGlucHV0IHJlZmVyZW5jZSBpcyBmcm9tIGFuIEFSTTY0OjpMRFJYbCBpbnN0cnVjdGlvbi4gKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9SZWZlcmVuY2VUeXBlX0luX0FSTTY0X0xEUlhsIDB4MTAwMDAwMDA0CisvKiBUaGUgaW5wdXQgcmVmZXJlbmNlIGlzIGZyb20gYW4gQVJNNjQ6OkFEUiBpbnN0cnVjdGlvbi4gKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9SZWZlcmVuY2VUeXBlX0luX0FSTTY0X0FEUiAweDEwMDAwMDAwNQorCisvKiBUaGUgb3V0cHV0IHJlZmVyZW5jZSBpcyB0byBhcyBzeW1ib2wgc3R1Yi4gKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9SZWZlcmVuY2VUeXBlX091dF9TeW1ib2xTdHViIDEKKy8qIFRoZSBvdXRwdXQgcmVmZXJlbmNlIGlzIHRvIGEgc3ltYm9sIGFkZHJlc3MgaW4gYSBsaXRlcmFsIHBvb2wuICovCisjZGVmaW5lIExMVk1EaXNhc3NlbWJsZXJfUmVmZXJlbmNlVHlwZV9PdXRfTGl0UG9vbF9TeW1BZGRyIDIKKy8qIFRoZSBvdXRwdXQgcmVmZXJlbmNlIGlzIHRvIGEgY3N0cmluZyBhZGRyZXNzIGluIGEgbGl0ZXJhbCBwb29sLiAqLworI2RlZmluZSBMTFZNRGlzYXNzZW1ibGVyX1JlZmVyZW5jZVR5cGVfT3V0X0xpdFBvb2xfQ3N0ckFkZHIgMworCisvKiBUaGUgb3V0cHV0IHJlZmVyZW5jZSBpcyB0byBhIE9iamVjdGl2ZS1DIENvcmVGb3VuZGF0aW9uIHN0cmluZy4gKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9SZWZlcmVuY2VUeXBlX091dF9PYmpjX0NGU3RyaW5nX1JlZiA0CisvKiBUaGUgb3V0cHV0IHJlZmVyZW5jZSBpcyB0byBhIE9iamVjdGl2ZS1DIG1lc3NhZ2UuICovCisjZGVmaW5lIExMVk1EaXNhc3NlbWJsZXJfUmVmZXJlbmNlVHlwZV9PdXRfT2JqY19NZXNzYWdlIDUKKy8qIFRoZSBvdXRwdXQgcmVmZXJlbmNlIGlzIHRvIGEgT2JqZWN0aXZlLUMgbWVzc2FnZSByZWYuICovCisjZGVmaW5lIExMVk1EaXNhc3NlbWJsZXJfUmVmZXJlbmNlVHlwZV9PdXRfT2JqY19NZXNzYWdlX1JlZiA2CisvKiBUaGUgb3V0cHV0IHJlZmVyZW5jZSBpcyB0byBhIE9iamVjdGl2ZS1DIHNlbGVjdG9yIHJlZi4gKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9SZWZlcmVuY2VUeXBlX091dF9PYmpjX1NlbGVjdG9yX1JlZiA3CisvKiBUaGUgb3V0cHV0IHJlZmVyZW5jZSBpcyB0byBhIE9iamVjdGl2ZS1DIGNsYXNzIHJlZi4gKi8KKyNkZWZpbmUgTExWTURpc2Fzc2VtYmxlcl9SZWZlcmVuY2VUeXBlX091dF9PYmpjX0NsYXNzX1JlZiA4CisKKy8qIFRoZSBvdXRwdXQgcmVmZXJlbmNlIGlzIHRvIGEgQysrIHN5bWJvbCBuYW1lLiAqLworI2RlZmluZSBMTFZNRGlzYXNzZW1ibGVyX1JlZmVyZW5jZVR5cGVfRGVNYW5nbGVkX05hbWUgOQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9FcnJvckhhbmRsaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvRXJyb3JIYW5kbGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNTliM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvRXJyb3JIYW5kbGluZy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qPT09LS0gbGx2bS1jL0Vycm9ySGFuZGxpbmcuaCAtIEVycm9yIEhhbmRsaW5nIEMgSW50ZXJmYWNlIC0tLS0tLS0qLSBDIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqfAorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBDIGludGVyZmFjZSB0byBMTFZNJ3MgZXJyb3IgaGFuZGxpbmcgbWVjaGFuaXNtLiAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX0NfRVJST1JfSEFORExJTkdfSAorI2RlZmluZSBMTFZNX0NfRVJST1JfSEFORExJTkdfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgdm9pZCAoKkxMVk1GYXRhbEVycm9ySGFuZGxlcikoY29uc3QgY2hhciAqUmVhc29uKTsKKworLyoqCisgKiBJbnN0YWxsIGEgZmF0YWwgZXJyb3IgaGFuZGxlci4gQnkgZGVmYXVsdCwgaWYgTExWTSBkZXRlY3RzIGEgZmF0YWwgZXJyb3IsIGl0CisgKiB3aWxsIGNhbGwgZXhpdCgxKS4gVGhpcyBtYXkgbm90IGJlIGFwcHJvcHJpYXRlIGluIG1hbnkgY29udGV4dHMuIEZvciBleGFtcGxlLAorICogZG9pbmcgZXhpdCgxKSB3aWxsIGJ5cGFzcyBtYW55IGNyYXNoIHJlcG9ydGluZy90cmFjaW5nIHN5c3RlbSB0b29scy4gVGhpcworICogZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBpbnN0YWxsIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGludm9rZWQgcHJpb3IgdG8gdGhlCisgKiBjYWxsIHRvIGV4aXQoMSkuCisgKi8KK3ZvaWQgTExWTUluc3RhbGxGYXRhbEVycm9ySGFuZGxlcihMTFZNRmF0YWxFcnJvckhhbmRsZXIgSGFuZGxlcik7CisKKy8qKgorICogUmVzZXQgdGhlIGZhdGFsIGVycm9yIGhhbmRsZXIuIFRoaXMgcmVzZXRzIExMVk0ncyBmYXRhbCBlcnJvciBoYW5kbGluZworICogYmVoYXZpb3IgdG8gdGhlIGRlZmF1bHQuCisgKi8KK3ZvaWQgTExWTVJlc2V0RmF0YWxFcnJvckhhbmRsZXIodm9pZCk7CisKKy8qKgorICogRW5hYmxlIExMVk0ncyBidWlsdC1pbiBzdGFjayB0cmFjZSBjb2RlLiBUaGlzIGludGVyY2VwdHMgdGhlIE9TJ3MgY3Jhc2gKKyAqIHNpZ25hbHMgYW5kIHByaW50cyB3aGljaCBjb21wb25lbnQgb2YgTExWTSB5b3Ugd2VyZSBpbiBhdCB0aGUgdGltZSBpZiB0aGUKKyAqIGNyYXNoLgorICovCit2b2lkIExMVk1FbmFibGVQcmV0dHlTdGFja1RyYWNlKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9FeGVjdXRpb25FbmdpbmUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9FeGVjdXRpb25FbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTgzMGZlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL0V4ZWN1dGlvbkVuZ2luZS5oCkBAIC0wLDAgKzEsMTkzIEBACisvKj09PS0tIGxsdm0tYy9FeGVjdXRpb25FbmdpbmUuaCAtIEV4ZWN1dGlvbkVuZ2luZSBMaWIgQyBJZmFjZSAtLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGhlYWRlciBkZWNsYXJlcyB0aGUgQyBpbnRlcmZhY2UgdG8gbGliTExWTUV4ZWN1dGlvbkVuZ2luZS5vLCB3aGljaCAgICAqfAorfCogaW1wbGVtZW50cyB2YXJpb3VzIGFuYWx5c2VzIG9mIHRoZSBMTFZNIElSLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBNYW55IGV4b3RpYyBsYW5ndWFnZXMgY2FuIGludGVyb3BlcmF0ZSB3aXRoIEMgY29kZSBidXQgaGF2ZSBhIGhhcmRlciB0aW1lICAqfAorfCogd2l0aCBDKysgZHVlIHRvIG5hbWUgbWFuZ2xpbmcuIFNvIGluIGFkZGl0aW9uIHRvIEMsIHRoaXMgaW50ZXJmYWNlIGVuYWJsZXMgKnwKK3wqIHRvb2xzIHdyaXR0ZW4gaW4gc3VjaCBsYW5ndWFnZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX0NfRVhFQ1VUSU9ORU5HSU5FX0gKKyNkZWZpbmUgTExWTV9DX0VYRUNVVElPTkVOR0lORV9ICisKKyNpbmNsdWRlICJsbHZtLWMvVGFyZ2V0LmgiCisjaW5jbHVkZSAibGx2bS1jL1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtLWMvVHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ0V4ZWN1dGlvbkVuZ2luZSBFeGVjdXRpb24gRW5naW5lCisgKiBAaW5ncm91cCBMTFZNQworICoKKyAqIEB7CisgKi8KKwordm9pZCBMTFZNTGlua0luTUNKSVQodm9pZCk7Cit2b2lkIExMVk1MaW5rSW5JbnRlcnByZXRlcih2b2lkKTsKKwordHlwZWRlZiBzdHJ1Y3QgTExWTU9wYXF1ZUdlbmVyaWNWYWx1ZSAqTExWTUdlbmVyaWNWYWx1ZVJlZjsKK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVFeGVjdXRpb25FbmdpbmUgKkxMVk1FeGVjdXRpb25FbmdpbmVSZWY7Cit0eXBlZGVmIHN0cnVjdCBMTFZNT3BhcXVlTUNKSVRNZW1vcnlNYW5hZ2VyICpMTFZNTUNKSVRNZW1vcnlNYW5hZ2VyUmVmOworCitzdHJ1Y3QgTExWTU1DSklUQ29tcGlsZXJPcHRpb25zIHsKKyAgdW5zaWduZWQgT3B0TGV2ZWw7CisgIExMVk1Db2RlTW9kZWwgQ29kZU1vZGVsOworICBMTFZNQm9vbCBOb0ZyYW1lUG9pbnRlckVsaW07CisgIExMVk1Cb29sIEVuYWJsZUZhc3RJU2VsOworICBMTFZNTUNKSVRNZW1vcnlNYW5hZ2VyUmVmIE1DSk1NOworfTsKKworLyo9PT0tLSBPcGVyYXRpb25zIG9uIGdlbmVyaWMgdmFsdWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworTExWTUdlbmVyaWNWYWx1ZVJlZiBMTFZNQ3JlYXRlR2VuZXJpY1ZhbHVlT2ZJbnQoTExWTVR5cGVSZWYgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Cb29sIElzU2lnbmVkKTsKKworTExWTUdlbmVyaWNWYWx1ZVJlZiBMTFZNQ3JlYXRlR2VuZXJpY1ZhbHVlT2ZQb2ludGVyKHZvaWQgKlApOworCitMTFZNR2VuZXJpY1ZhbHVlUmVmIExMVk1DcmVhdGVHZW5lcmljVmFsdWVPZkZsb2F0KExMVk1UeXBlUmVmIFR5LCBkb3VibGUgTik7CisKK3Vuc2lnbmVkIExMVk1HZW5lcmljVmFsdWVJbnRXaWR0aChMTFZNR2VuZXJpY1ZhbHVlUmVmIEdlblZhbFJlZik7CisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBMTFZNR2VuZXJpY1ZhbHVlVG9JbnQoTExWTUdlbmVyaWNWYWx1ZVJlZiBHZW5WYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Cb29sIElzU2lnbmVkKTsKKwordm9pZCAqTExWTUdlbmVyaWNWYWx1ZVRvUG9pbnRlcihMTFZNR2VuZXJpY1ZhbHVlUmVmIEdlblZhbCk7CisKK2RvdWJsZSBMTFZNR2VuZXJpY1ZhbHVlVG9GbG9hdChMTFZNVHlwZVJlZiBUeVJlZiwgTExWTUdlbmVyaWNWYWx1ZVJlZiBHZW5WYWwpOworCit2b2lkIExMVk1EaXNwb3NlR2VuZXJpY1ZhbHVlKExMVk1HZW5lcmljVmFsdWVSZWYgR2VuVmFsKTsKKworLyo9PT0tLSBPcGVyYXRpb25zIG9uIGV4ZWN1dGlvbiBlbmdpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworTExWTUJvb2wgTExWTUNyZWF0ZUV4ZWN1dGlvbkVuZ2luZUZvck1vZHVsZShMTFZNRXhlY3V0aW9uRW5naW5lUmVmICpPdXRFRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1vZHVsZVJlZiBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqT3V0RXJyb3IpOworCitMTFZNQm9vbCBMTFZNQ3JlYXRlSW50ZXJwcmV0ZXJGb3JNb2R1bGUoTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiAqT3V0SW50ZXJwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Nb2R1bGVSZWYgTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqT3V0RXJyb3IpOworCitMTFZNQm9vbCBMTFZNQ3JlYXRlSklUQ29tcGlsZXJGb3JNb2R1bGUoTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiAqT3V0SklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Nb2R1bGVSZWYgTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcHRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqT3V0RXJyb3IpOworCit2b2lkIExMVk1Jbml0aWFsaXplTUNKSVRDb21waWxlck9wdGlvbnMoCisgIHN0cnVjdCBMTFZNTUNKSVRDb21waWxlck9wdGlvbnMgKk9wdGlvbnMsIHNpemVfdCBTaXplT2ZPcHRpb25zKTsKKworLyoqCisgKiBDcmVhdGUgYW4gTUNKSVQgZXhlY3V0aW9uIGVuZ2luZSBmb3IgYSBtb2R1bGUsIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuIEl0IGlzCisgKiB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBlbnN1cmUgdGhhdCBhbGwgZmllbGRzIGluIE9wdGlvbnMgdXAgdG8KKyAqIHRoZSBnaXZlbiBTaXplT2ZPcHRpb25zIGFyZSBpbml0aWFsaXplZC4gSXQgaXMgY29ycmVjdCB0byBwYXNzIGEgc21hbGxlcgorICogdmFsdWUgb2YgU2l6ZU9mT3B0aW9ucyB0aGF0IG9taXRzIHNvbWUgZmllbGRzLiBUaGUgY2Fub25pY2FsIHdheSBvZiB1c2luZworICogdGhpcyBpczoKKyAqCisgKiBMTFZNTUNKSVRDb21waWxlck9wdGlvbnMgb3B0aW9uczsKKyAqIExMVk1Jbml0aWFsaXplTUNKSVRDb21waWxlck9wdGlvbnMoJm9wdGlvbnMsIHNpemVvZihvcHRpb25zKSk7CisgKiAuLi4gZmlsbCBpbiB0aG9zZSBvcHRpb25zIHlvdSBjYXJlIGFib3V0CisgKiBMTFZNQ3JlYXRlTUNKSVRDb21waWxlckZvck1vZHVsZSgmaml0LCBtb2QsICZvcHRpb25zLCBzaXplb2Yob3B0aW9ucyksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworICoKKyAqIE5vdGUgdGhhdCB0aGlzIGlzIGFsc28gY29ycmVjdCwgdGhvdWdoIHBvc3NpYmx5IHN1Ym9wdGltYWw6CisgKgorICogTExWTUNyZWF0ZU1DSklUQ29tcGlsZXJGb3JNb2R1bGUoJmppdCwgbW9kLCAwLCAwLCAmZXJyb3IpOworICovCitMTFZNQm9vbCBMTFZNQ3JlYXRlTUNKSVRDb21waWxlckZvck1vZHVsZSgKKyAgTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiAqT3V0SklULCBMTFZNTW9kdWxlUmVmIE0sCisgIHN0cnVjdCBMTFZNTUNKSVRDb21waWxlck9wdGlvbnMgKk9wdGlvbnMsIHNpemVfdCBTaXplT2ZPcHRpb25zLAorICBjaGFyICoqT3V0RXJyb3IpOworCit2b2lkIExMVk1EaXNwb3NlRXhlY3V0aW9uRW5naW5lKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgRUUpOworCit2b2lkIExMVk1SdW5TdGF0aWNDb25zdHJ1Y3RvcnMoTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiBFRSk7CisKK3ZvaWQgTExWTVJ1blN0YXRpY0Rlc3RydWN0b3JzKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgRUUpOworCitpbnQgTExWTVJ1bkZ1bmN0aW9uQXNNYWluKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgRUUsIExMVk1WYWx1ZVJlZiBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBcmdDLCBjb25zdCBjaGFyICogY29uc3QgKkFyZ1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqRW52UCk7CisKK0xMVk1HZW5lcmljVmFsdWVSZWYgTExWTVJ1bkZ1bmN0aW9uKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgRUUsIExMVk1WYWx1ZVJlZiBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1HZW5lcmljVmFsdWVSZWYgKkFyZ3MpOworCit2b2lkIExMVk1GcmVlTWFjaGluZUNvZGVGb3JGdW5jdGlvbihMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFLCBMTFZNVmFsdWVSZWYgRik7CisKK3ZvaWQgTExWTUFkZE1vZHVsZShMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFLCBMTFZNTW9kdWxlUmVmIE0pOworCitMTFZNQm9vbCBMTFZNUmVtb3ZlTW9kdWxlKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgRUUsIExMVk1Nb2R1bGVSZWYgTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1vZHVsZVJlZiAqT3V0TW9kLCBjaGFyICoqT3V0RXJyb3IpOworCitMTFZNQm9vbCBMTFZNRmluZEZ1bmN0aW9uKExMVk1FeGVjdXRpb25FbmdpbmVSZWYgRUUsIGNvbnN0IGNoYXIgKk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiAqT3V0Rm4pOworCit2b2lkICpMTFZNUmVjb21waWxlQW5kUmVsaW5rRnVuY3Rpb24oTExWTUV4ZWN1dGlvbkVuZ2luZVJlZiBFRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmFsdWVSZWYgRm4pOworCitMTFZNVGFyZ2V0RGF0YVJlZiBMTFZNR2V0RXhlY3V0aW9uRW5naW5lVGFyZ2V0RGF0YShMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFKTsKK0xMVk1UYXJnZXRNYWNoaW5lUmVmCitMTFZNR2V0RXhlY3V0aW9uRW5naW5lVGFyZ2V0TWFjaGluZShMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFKTsKKwordm9pZCBMTFZNQWRkR2xvYmFsTWFwcGluZyhMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFLCBMTFZNVmFsdWVSZWYgR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBBZGRyKTsKKwordm9pZCAqTExWTUdldFBvaW50ZXJUb0dsb2JhbChMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFLCBMTFZNVmFsdWVSZWYgR2xvYmFsKTsKKwordWludDY0X3QgTExWTUdldEdsb2JhbFZhbHVlQWRkcmVzcyhMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFLCBjb25zdCBjaGFyICpOYW1lKTsKKwordWludDY0X3QgTExWTUdldEZ1bmN0aW9uQWRkcmVzcyhMTFZNRXhlY3V0aW9uRW5naW5lUmVmIEVFLCBjb25zdCBjaGFyICpOYW1lKTsKKworLyo9PT0tLSBPcGVyYXRpb25zIG9uIG1lbW9yeSBtYW5hZ2VycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKwordHlwZWRlZiB1aW50OF90ICooKkxMVk1NZW1vcnlNYW5hZ2VyQWxsb2NhdGVDb2RlU2VjdGlvbkNhbGxiYWNrKSgKKyAgdm9pZCAqT3BhcXVlLCB1aW50cHRyX3QgU2l6ZSwgdW5zaWduZWQgQWxpZ25tZW50LCB1bnNpZ25lZCBTZWN0aW9uSUQsCisgIGNvbnN0IGNoYXIgKlNlY3Rpb25OYW1lKTsKK3R5cGVkZWYgdWludDhfdCAqKCpMTFZNTWVtb3J5TWFuYWdlckFsbG9jYXRlRGF0YVNlY3Rpb25DYWxsYmFjaykoCisgIHZvaWQgKk9wYXF1ZSwgdWludHB0cl90IFNpemUsIHVuc2lnbmVkIEFsaWdubWVudCwgdW5zaWduZWQgU2VjdGlvbklELAorICBjb25zdCBjaGFyICpTZWN0aW9uTmFtZSwgTExWTUJvb2wgSXNSZWFkT25seSk7Cit0eXBlZGVmIExMVk1Cb29sICgqTExWTU1lbW9yeU1hbmFnZXJGaW5hbGl6ZU1lbW9yeUNhbGxiYWNrKSgKKyAgdm9pZCAqT3BhcXVlLCBjaGFyICoqRXJyTXNnKTsKK3R5cGVkZWYgdm9pZCAoKkxMVk1NZW1vcnlNYW5hZ2VyRGVzdHJveUNhbGxiYWNrKSh2b2lkICpPcGFxdWUpOworCisvKioKKyAqIENyZWF0ZSBhIHNpbXBsZSBjdXN0b20gTUNKSVQgbWVtb3J5IG1hbmFnZXIuIFRoaXMgbWVtb3J5IG1hbmFnZXIgY2FuCisgKiBpbnRlcmNlcHQgYWxsb2NhdGlvbnMgaW4gYSBtb2R1bGUtb2JsaXZpb3VzIHdheS4gVGhpcyB3aWxsIHJldHVybiBOVUxMCisgKiBpZiBhbnkgb2YgdGhlIHBhc3NlZCBmdW5jdGlvbnMgYXJlIE5VTEwuCisgKgorICogQHBhcmFtIE9wYXF1ZSBBbiBvcGFxdWUgY2xpZW50IG9iamVjdCB0byBwYXNzIGJhY2sgdG8gdGhlIGNhbGxiYWNrcy4KKyAqIEBwYXJhbSBBbGxvY2F0ZUNvZGVTZWN0aW9uIEFsbG9jYXRlIGEgYmxvY2sgb2YgbWVtb3J5IGZvciBleGVjdXRhYmxlIGNvZGUuCisgKiBAcGFyYW0gQWxsb2NhdGVEYXRhU2VjdGlvbiBBbGxvY2F0ZSBhIGJsb2NrIG9mIG1lbW9yeSBmb3IgZGF0YS4KKyAqIEBwYXJhbSBGaW5hbGl6ZU1lbW9yeSBTZXQgcGFnZSBwZXJtaXNzaW9ucyBhbmQgZmx1c2ggY2FjaGUuIFJldHVybiAwIG9uCisgKiAgIHN1Y2Nlc3MsIDEgb24gZXJyb3IuCisgKi8KK0xMVk1NQ0pJVE1lbW9yeU1hbmFnZXJSZWYgTExWTUNyZWF0ZVNpbXBsZU1DSklUTWVtb3J5TWFuYWdlcigKKyAgdm9pZCAqT3BhcXVlLAorICBMTFZNTWVtb3J5TWFuYWdlckFsbG9jYXRlQ29kZVNlY3Rpb25DYWxsYmFjayBBbGxvY2F0ZUNvZGVTZWN0aW9uLAorICBMTFZNTWVtb3J5TWFuYWdlckFsbG9jYXRlRGF0YVNlY3Rpb25DYWxsYmFjayBBbGxvY2F0ZURhdGFTZWN0aW9uLAorICBMTFZNTWVtb3J5TWFuYWdlckZpbmFsaXplTWVtb3J5Q2FsbGJhY2sgRmluYWxpemVNZW1vcnksCisgIExMVk1NZW1vcnlNYW5hZ2VyRGVzdHJveUNhbGxiYWNrIERlc3Ryb3kpOworCit2b2lkIExMVk1EaXNwb3NlTUNKSVRNZW1vcnlNYW5hZ2VyKExMVk1NQ0pJVE1lbW9yeU1hbmFnZXJSZWYgTU0pOworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogZGVmaW5lZChfX2NwbHVzcGx1cykgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvSVJSZWFkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9JUlJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNThkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvSVJSZWFkZXIuaApAQCAtMCwwICsxLDQwIEBACisvKj09PS0tIGxsdm0tYy9JUlJlYWRlci5oIC0gSVIgUmVhZGVyIEMgSW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tKi0gQyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQyBpbnRlcmZhY2UgdG8gdGhlIElSIFJlYWRlci4gICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9DX0lSUkVBREVSX0gKKyNkZWZpbmUgTExWTV9DX0lSUkVBREVSX0gKKworI2luY2x1ZGUgImxsdm0tYy9UeXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogUmVhZCBMTFZNIElSIGZyb20gYSBtZW1vcnkgYnVmZmVyIGFuZCBjb252ZXJ0IGl0IGludG8gYW4gaW4tbWVtb3J5IE1vZHVsZQorICogb2JqZWN0LiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqIE9wdGlvbmFsbHkgcmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIGFueSBlcnJvcnMgdGhhdAorICogb2NjdXJyZWQgZHVyaW5nIHBhcnNpbmcgSVIuIE91dE1lc3NhZ2UgbXVzdCBiZSBkaXNwb3NlZCB3aXRoCisgKiBMTFZNRGlzcG9zZU1lc3NhZ2UuCisgKgorICogQHNlZSBsbHZtOjpQYXJzZUlSKCkKKyAqLworTExWTUJvb2wgTExWTVBhcnNlSVJJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQ29udGV4dFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NZW1vcnlCdWZmZXJSZWYgTWVtQnVmLCBMTFZNTW9kdWxlUmVmICpPdXRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKk91dE1lc3NhZ2UpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9Jbml0aWFsaXphdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL0luaXRpYWxpemF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjODM5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9Jbml0aWFsaXphdGlvbi5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qPT09LS0gbGx2bS1jL0luaXRpYWxpemF0aW9uLmggLSBJbml0aWFsaXphdGlvbiBDIEludGVyZmFjZSAtLS0tLS0qLSBDIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqfAorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgaGVhZGVyIGRlY2xhcmVzIHRoZSBDIGludGVyZmFjZSB0byBMTFZNIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzLCAgICAgICp8Cit8KiB3aGljaCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgeW91IGNhbiB1c2UgdGhlIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgICAgICAqfAorfCogdGhlIGNvcnJlc3BvbmRpbmcgTExWTSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIExMVk1fQ19JTklUSUFMSVpBVElPTl9ICisjZGVmaW5lIExMVk1fQ19JTklUSUFMSVpBVElPTl9ICisKKyNpbmNsdWRlICJsbHZtLWMvVHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ0luaXRpYWxpemF0aW9uIEluaXRpYWxpemF0aW9uIFJvdXRpbmVzCisgKiBAaW5ncm91cCBMTFZNQworICoKKyAqIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHJvdXRpbmVzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgTExWTSBzeXN0ZW0uCisgKgorICogQHsKKyAqLworCit2b2lkIExMVk1Jbml0aWFsaXplQ29yZShMTFZNUGFzc1JlZ2lzdHJ5UmVmIFIpOwordm9pZCBMTFZNSW5pdGlhbGl6ZVRyYW5zZm9ybVV0aWxzKExMVk1QYXNzUmVnaXN0cnlSZWYgUik7Cit2b2lkIExMVk1Jbml0aWFsaXplU2NhbGFyT3B0cyhMTFZNUGFzc1JlZ2lzdHJ5UmVmIFIpOwordm9pZCBMTFZNSW5pdGlhbGl6ZU9iakNBUkNPcHRzKExMVk1QYXNzUmVnaXN0cnlSZWYgUik7Cit2b2lkIExMVk1Jbml0aWFsaXplVmVjdG9yaXphdGlvbihMTFZNUGFzc1JlZ2lzdHJ5UmVmIFIpOwordm9pZCBMTFZNSW5pdGlhbGl6ZUluc3RDb21iaW5lKExMVk1QYXNzUmVnaXN0cnlSZWYgUik7Cit2b2lkIExMVk1Jbml0aWFsaXplSVBPKExMVk1QYXNzUmVnaXN0cnlSZWYgUik7Cit2b2lkIExMVk1Jbml0aWFsaXplSW5zdHJ1bWVudGF0aW9uKExMVk1QYXNzUmVnaXN0cnlSZWYgUik7Cit2b2lkIExMVk1Jbml0aWFsaXplQW5hbHlzaXMoTExWTVBhc3NSZWdpc3RyeVJlZiBSKTsKK3ZvaWQgTExWTUluaXRpYWxpemVJUEEoTExWTVBhc3NSZWdpc3RyeVJlZiBSKTsKK3ZvaWQgTExWTUluaXRpYWxpemVDb2RlR2VuKExMVk1QYXNzUmVnaXN0cnlSZWYgUik7Cit2b2lkIExMVk1Jbml0aWFsaXplVGFyZ2V0KExMVk1QYXNzUmVnaXN0cnlSZWYgUik7CisKKy8qKgorICogQH0KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9MaW5rVGltZU9wdGltaXplci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL0xpbmtUaW1lT3B0aW1pemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjZjU5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9MaW5rVGltZU9wdGltaXplci5oCkBAIC0wLDAgKzEsNjkgQEAKKy8vPT09LS0gbGx2bS9MaW5rVGltZU9wdGltaXplci5oIC0gTFRPIFB1YmxpYyBDIEludGVyZmFjZSAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgcHJvdmlkZXMgYSBDIEFQSSB0byB1c2UgdGhlIExMVk0gbGluayB0aW1lIG9wdGltaXphdGlvbgorLy8gbGlicmFyeS4gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGxpbmtlcnMgd2hpY2ggYXJlIEMtb25seSBpbgorLy8gdGhlaXIgaW1wbGVtZW50YXRpb24gZm9yIHBlcmZvcm1pbmcgTFRPLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DX0xJTktUSU1FT1BUSU1JWkVSX0gKKyNkZWZpbmUgTExWTV9DX0xJTktUSU1FT1BUSU1JWkVSX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ0xpbmtUaW1lT3B0aW1pemVyIExpbmsgVGltZSBPcHRpbWl6YXRpb24KKyAqIEBpbmdyb3VwIExMVk1DCisgKgorICogQHsKKyAqLworCisgIC8vLyBUaGlzIHByb3ZpZGVzIGEgZHVtbXkgdHlwZSBmb3IgcG9pbnRlcnMgdG8gdGhlIExUTyBvYmplY3QuCisgIHR5cGVkZWYgdm9pZCogbGx2bV9sdG9fdDsKKworICAvLy8gVGhpcyBwcm92aWRlcyBhIEMtdmlzaWJsZSBlbnVtZXJhdG9yIHRvIG1hbmFnZSBzdGF0dXMgY29kZXMuCisgIC8vLyBUaGlzIHNob3VsZCBtYXAgZXhhY3RseSBvbnRvIHRoZSBDKysgZW51bWVyYXRvciBMVE9TdGF0dXMuCisgIHR5cGVkZWYgZW51bSBsbHZtX2x0b19zdGF0dXMgeworICAgIExMVk1fTFRPX1VOS05PV04sCisgICAgTExWTV9MVE9fT1BUX1NVQ0NFU1MsCisgICAgTExWTV9MVE9fUkVBRF9TVUNDRVNTLAorICAgIExMVk1fTFRPX1JFQURfRkFJTFVSRSwKKyAgICBMTFZNX0xUT19XUklURV9GQUlMVVJFLAorICAgIExMVk1fTFRPX05PX1RBUkdFVCwKKyAgICBMTFZNX0xUT19OT19XT1JLLAorICAgIExMVk1fTFRPX01PRFVMRV9NRVJHRV9GQUlMVVJFLAorICAgIExMVk1fTFRPX0FTTV9GQUlMVVJFLAorCisgICAgLy8gIEFkZGVkIEMtc3BlY2lmaWMgZXJyb3IgY29kZXMKKyAgICBMTFZNX0xUT19OVUxMX09CSkVDVAorICB9IGxsdm1fbHRvX3N0YXR1c190OworCisgIC8vLyBUaGlzIHByb3ZpZGVzIEMgaW50ZXJmYWNlIHRvIGluaXRpYWxpemUgbGluayB0aW1lIG9wdGltaXplci4gVGhpcyBhbGxvd3MKKyAgLy8vIGxpbmtlciB0byB1c2UgZGxvcGVuKCkgaW50ZXJmYWNlIHRvIGR5bmFtaWNhbGx5IGxvYWQgTGlua1RpbWVPcHRpbWl6ZXIuCisgIC8vLyBleHRlcm4gIkMiIGhlbHBzLCBiZWNhdXNlIGRsb3BlbigpIGludGVyZmFjZSB1c2VzIG5hbWUgdG8gZmluZCB0aGUgc3ltYm9sLgorICBleHRlcm4gbGx2bV9sdG9fdCBsbHZtX2NyZWF0ZV9vcHRpbWl6ZXIodm9pZCk7CisgIGV4dGVybiB2b2lkIGxsdm1fZGVzdHJveV9vcHRpbWl6ZXIobGx2bV9sdG9fdCBsdG8pOworCisgIGV4dGVybiBsbHZtX2x0b19zdGF0dXNfdCBsbHZtX3JlYWRfb2JqZWN0X2ZpbGUKKyAgICAobGx2bV9sdG9fdCBsdG8sIGNvbnN0IGNoYXIqIGlucHV0X2ZpbGVuYW1lKTsKKyAgZXh0ZXJuIGxsdm1fbHRvX3N0YXR1c190IGxsdm1fb3B0aW1pemVfbW9kdWxlcworICAgIChsbHZtX2x0b190IGx0bywgY29uc3QgY2hhciogb3V0cHV0X2ZpbGVuYW1lKTsKKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL0xpbmtlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL0xpbmtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMmMzN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvTGlua2VyLmgKQEAgLTAsMCArMSw0MSBAQAorLyo9PT0tLSBsbHZtLWMvTGlua2VyLmggLSBNb2R1bGUgTGlua2VyIEMgSW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICp8Cit8KiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGRlZmluZXMgdGhlIEMgaW50ZXJmYWNlIHRvIHRoZSBtb2R1bGUvZmlsZS9hcmNoaXZlIGxpbmtlci4gICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIExMVk1fQ19MSU5LRVJfSAorI2RlZmluZSBMTFZNX0NfTElOS0VSX0gKKworI2luY2x1ZGUgImxsdm0tYy9UeXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFRoaXMgZW51bSBpcyBwcm92aWRlZCBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgb25seS4gSXQgaGFzIG5vIGVmZmVjdC4gKi8KK3R5cGVkZWYgZW51bSB7CisgIExMVk1MaW5rZXJEZXN0cm95U291cmNlID0gMCwgLyogVGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvci4gKi8KKyAgTExWTUxpbmtlclByZXNlcnZlU291cmNlX1JlbW92ZWQgPSAxIC8qIFRoaXMgb3B0aW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgbm90IGJlIHVzZWQuICovCit9IExMVk1MaW5rZXJNb2RlOworCisvKiBMaW5rcyB0aGUgc291cmNlIG1vZHVsZSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBtb2R1bGUuIFRoZSBzb3VyY2UgbW9kdWxlIGlzCisgKiBkZXN0cm95ZWQuCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAqIFVzZSB0aGUgZGlhZ25vc3RpYyBoYW5kbGVyIHRvIGdldCBhbnkgZGlhZ25vc3RpYyBtZXNzYWdlLgorKi8KK0xMVk1Cb29sIExMVk1MaW5rTW9kdWxlczIoTExWTU1vZHVsZVJlZiBEZXN0LCBMTFZNTW9kdWxlUmVmIFNyYyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL09iamVjdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL09iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOTgwZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvT2JqZWN0LmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qPT09LS0gbGx2bS1jL09iamVjdC5oIC0gT2JqZWN0IExpYiBDIElmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqLworLyogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgaGVhZGVyIGRlY2xhcmVzIHRoZSBDIGludGVyZmFjZSB0byBsaWJMTFZNT2JqZWN0LmEsIHdoaWNoICAgICAgICAgICAgICovCisvKiBpbXBsZW1lbnRzIG9iamVjdCBmaWxlIHJlYWRpbmcgYW5kIHdyaXRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE1hbnkgZXhvdGljIGxhbmd1YWdlcyBjYW4gaW50ZXJvcGVyYXRlIHdpdGggQyBjb2RlIGJ1dCBoYXZlIGEgaGFyZGVyIHRpbWUgICovCisvKiB3aXRoIEMrKyBkdWUgdG8gbmFtZSBtYW5nbGluZy4gU28gaW4gYWRkaXRpb24gdG8gQywgdGhpcyBpbnRlcmZhY2UgZW5hYmxlcyAqLworLyogdG9vbHMgd3JpdHRlbiBpbiBzdWNoIGxhbmd1YWdlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIExMVk1fQ19PQkpFQ1RfSAorI2RlZmluZSBMTFZNX0NfT0JKRUNUX0gKKworI2luY2x1ZGUgImxsdm0tYy9UeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29uZmlnL2xsdm0tY29uZmlnLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNPYmplY3QgT2JqZWN0IGZpbGUgcmVhZGluZyBhbmQgd3JpdGluZworICogQGluZ3JvdXAgTExWTUMKKyAqCisgKiBAeworICovCisKKy8vIE9wYXF1ZSB0eXBlIHdyYXBwZXJzCit0eXBlZGVmIHN0cnVjdCBMTFZNT3BhcXVlT2JqZWN0RmlsZSAqTExWTU9iamVjdEZpbGVSZWY7Cit0eXBlZGVmIHN0cnVjdCBMTFZNT3BhcXVlU2VjdGlvbkl0ZXJhdG9yICpMTFZNU2VjdGlvbkl0ZXJhdG9yUmVmOwordHlwZWRlZiBzdHJ1Y3QgTExWTU9wYXF1ZVN5bWJvbEl0ZXJhdG9yICpMTFZNU3ltYm9sSXRlcmF0b3JSZWY7Cit0eXBlZGVmIHN0cnVjdCBMTFZNT3BhcXVlUmVsb2NhdGlvbkl0ZXJhdG9yICpMTFZNUmVsb2NhdGlvbkl0ZXJhdG9yUmVmOworCisvLyBPYmplY3RGaWxlIGNyZWF0aW9uCitMTFZNT2JqZWN0RmlsZVJlZiBMTFZNQ3JlYXRlT2JqZWN0RmlsZShMTFZNTWVtb3J5QnVmZmVyUmVmIE1lbUJ1Zik7Cit2b2lkIExMVk1EaXNwb3NlT2JqZWN0RmlsZShMTFZNT2JqZWN0RmlsZVJlZiBPYmplY3RGaWxlKTsKKworLy8gT2JqZWN0RmlsZSBTZWN0aW9uIGl0ZXJhdG9ycworTExWTVNlY3Rpb25JdGVyYXRvclJlZiBMTFZNR2V0U2VjdGlvbnMoTExWTU9iamVjdEZpbGVSZWYgT2JqZWN0RmlsZSk7Cit2b2lkIExMVk1EaXNwb3NlU2VjdGlvbkl0ZXJhdG9yKExMVk1TZWN0aW9uSXRlcmF0b3JSZWYgU0kpOworTExWTUJvb2wgTExWTUlzU2VjdGlvbkl0ZXJhdG9yQXRFbmQoTExWTU9iamVjdEZpbGVSZWYgT2JqZWN0RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVNlY3Rpb25JdGVyYXRvclJlZiBTSSk7Cit2b2lkIExMVk1Nb3ZlVG9OZXh0U2VjdGlvbihMTFZNU2VjdGlvbkl0ZXJhdG9yUmVmIFNJKTsKK3ZvaWQgTExWTU1vdmVUb0NvbnRhaW5pbmdTZWN0aW9uKExMVk1TZWN0aW9uSXRlcmF0b3JSZWYgU2VjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1TeW1ib2xJdGVyYXRvclJlZiBTeW0pOworCisvLyBPYmplY3RGaWxlIFN5bWJvbCBpdGVyYXRvcnMKK0xMVk1TeW1ib2xJdGVyYXRvclJlZiBMTFZNR2V0U3ltYm9scyhMTFZNT2JqZWN0RmlsZVJlZiBPYmplY3RGaWxlKTsKK3ZvaWQgTExWTURpc3Bvc2VTeW1ib2xJdGVyYXRvcihMTFZNU3ltYm9sSXRlcmF0b3JSZWYgU0kpOworTExWTUJvb2wgTExWTUlzU3ltYm9sSXRlcmF0b3JBdEVuZChMTFZNT2JqZWN0RmlsZVJlZiBPYmplY3RGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNU3ltYm9sSXRlcmF0b3JSZWYgU0kpOwordm9pZCBMTFZNTW92ZVRvTmV4dFN5bWJvbChMTFZNU3ltYm9sSXRlcmF0b3JSZWYgU0kpOworCisvLyBTZWN0aW9uUmVmIGFjY2Vzc29ycworY29uc3QgY2hhciAqTExWTUdldFNlY3Rpb25OYW1lKExMVk1TZWN0aW9uSXRlcmF0b3JSZWYgU0kpOwordWludDY0X3QgTExWTUdldFNlY3Rpb25TaXplKExMVk1TZWN0aW9uSXRlcmF0b3JSZWYgU0kpOworY29uc3QgY2hhciAqTExWTUdldFNlY3Rpb25Db250ZW50cyhMTFZNU2VjdGlvbkl0ZXJhdG9yUmVmIFNJKTsKK3VpbnQ2NF90IExMVk1HZXRTZWN0aW9uQWRkcmVzcyhMTFZNU2VjdGlvbkl0ZXJhdG9yUmVmIFNJKTsKK0xMVk1Cb29sIExMVk1HZXRTZWN0aW9uQ29udGFpbnNTeW1ib2woTExWTVNlY3Rpb25JdGVyYXRvclJlZiBTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1TeW1ib2xJdGVyYXRvclJlZiBTeW0pOworCisvLyBTZWN0aW9uIFJlbG9jYXRpb24gaXRlcmF0b3JzCitMTFZNUmVsb2NhdGlvbkl0ZXJhdG9yUmVmIExMVk1HZXRSZWxvY2F0aW9ucyhMTFZNU2VjdGlvbkl0ZXJhdG9yUmVmIFNlY3Rpb24pOwordm9pZCBMTFZNRGlzcG9zZVJlbG9jYXRpb25JdGVyYXRvcihMTFZNUmVsb2NhdGlvbkl0ZXJhdG9yUmVmIFJJKTsKK0xMVk1Cb29sIExMVk1Jc1JlbG9jYXRpb25JdGVyYXRvckF0RW5kKExMVk1TZWN0aW9uSXRlcmF0b3JSZWYgU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1SZWxvY2F0aW9uSXRlcmF0b3JSZWYgUkkpOwordm9pZCBMTFZNTW92ZVRvTmV4dFJlbG9jYXRpb24oTExWTVJlbG9jYXRpb25JdGVyYXRvclJlZiBSSSk7CisKKworLy8gU3ltYm9sUmVmIGFjY2Vzc29ycworY29uc3QgY2hhciAqTExWTUdldFN5bWJvbE5hbWUoTExWTVN5bWJvbEl0ZXJhdG9yUmVmIFNJKTsKK3VpbnQ2NF90IExMVk1HZXRTeW1ib2xBZGRyZXNzKExMVk1TeW1ib2xJdGVyYXRvclJlZiBTSSk7Cit1aW50NjRfdCBMTFZNR2V0U3ltYm9sU2l6ZShMTFZNU3ltYm9sSXRlcmF0b3JSZWYgU0kpOworCisvLyBSZWxvY2F0aW9uUmVmIGFjY2Vzc29ycwordWludDY0X3QgTExWTUdldFJlbG9jYXRpb25PZmZzZXQoTExWTVJlbG9jYXRpb25JdGVyYXRvclJlZiBSSSk7CitMTFZNU3ltYm9sSXRlcmF0b3JSZWYgTExWTUdldFJlbG9jYXRpb25TeW1ib2woTExWTVJlbG9jYXRpb25JdGVyYXRvclJlZiBSSSk7Cit1aW50NjRfdCBMTFZNR2V0UmVsb2NhdGlvblR5cGUoTExWTVJlbG9jYXRpb25JdGVyYXRvclJlZiBSSSk7CisvLyBOT1RFOiBDYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHJldHVybmVkIHN0cmluZyBvZiB0aGUgdHdvCisvLyBmb2xsb3dpbmcgZnVuY3Rpb25zLgorY29uc3QgY2hhciAqTExWTUdldFJlbG9jYXRpb25UeXBlTmFtZShMTFZNUmVsb2NhdGlvbkl0ZXJhdG9yUmVmIFJJKTsKK2NvbnN0IGNoYXIgKkxMVk1HZXRSZWxvY2F0aW9uVmFsdWVTdHJpbmcoTExWTVJlbG9jYXRpb25JdGVyYXRvclJlZiBSSSk7CisKKy8qKgorICogQH0KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9PcmNCaW5kaW5ncy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL09yY0JpbmRpbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlMmU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9PcmNCaW5kaW5ncy5oCkBAIC0wLDAgKzEsMTUyIEBACisvKj09PS0tLS0tLS0tLS0tIGxsdm0tYy9PcmNCaW5kaW5ncy5oIC0gT3JjIExpYiBDIElmYWNlIC0tLS0tLS0tLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGhlYWRlciBkZWNsYXJlcyB0aGUgQyBpbnRlcmZhY2UgdG8gbGliTExWTU9yY0pJVC5hLCB3aGljaCBpbXBsZW1lbnRzICAqfAorfCogSklUIGNvbXBpbGF0aW9uIG9mIExMVk0gSVIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBNYW55IGV4b3RpYyBsYW5ndWFnZXMgY2FuIGludGVyb3BlcmF0ZSB3aXRoIEMgY29kZSBidXQgaGF2ZSBhIGhhcmRlciB0aW1lICAqfAorfCogd2l0aCBDKysgZHVlIHRvIG5hbWUgbWFuZ2xpbmcuIFNvIGluIGFkZGl0aW9uIHRvIEMsIHRoaXMgaW50ZXJmYWNlIGVuYWJsZXMgKnwKK3wqIHRvb2xzIHdyaXR0ZW4gaW4gc3VjaCBsYW5ndWFnZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogTm90ZTogVGhpcyBpbnRlcmZhY2UgaXMgZXhwZXJpbWVudGFsLiBJdCBpcyAqTk9UKiBzdGFibGUsIGFuZCBtYXkgYmUgICAgICAgKnwKK3wqICAgICAgIGNoYW5nZWQgd2l0aG91dCB3YXJuaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX0NfT1JDQklORElOR1NfSAorI2RlZmluZSBMTFZNX0NfT1JDQklORElOR1NfSAorCisjaW5jbHVkZSAibGx2bS1jL09iamVjdC5oIgorI2luY2x1ZGUgImxsdm0tYy9UYXJnZXRNYWNoaW5lLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgTExWTU9yY09wYXF1ZUpJVFN0YWNrICpMTFZNT3JjSklUU3RhY2tSZWY7Cit0eXBlZGVmIHVpbnQ2NF90IExMVk1PcmNNb2R1bGVIYW5kbGU7Cit0eXBlZGVmIHVpbnQ2NF90IExMVk1PcmNUYXJnZXRBZGRyZXNzOwordHlwZWRlZiB1aW50NjRfdCAoKkxMVk1PcmNTeW1ib2xSZXNvbHZlckZuKShjb25zdCBjaGFyICpOYW1lLCB2b2lkICpMb29rdXBDdHgpOwordHlwZWRlZiB1aW50NjRfdCAoKkxMVk1PcmNMYXp5Q29tcGlsZUNhbGxiYWNrRm4pKExMVk1PcmNKSVRTdGFja1JlZiBKSVRTdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDYWxsYmFja0N0eCk7CisKK3R5cGVkZWYgZW51bSB7IExMVk1PcmNFcnJTdWNjZXNzID0gMCwgTExWTU9yY0VyckdlbmVyaWMgfSBMTFZNT3JjRXJyb3JDb2RlOworCisvKioKKyAqIENyZWF0ZSBhbiBPUkMgSklUIHN0YWNrLgorICoKKyAqIFRoZSBjbGllbnQgb3ducyB0aGUgcmVzdWx0aW5nIHN0YWNrLCBhbmQgbXVzdCBjYWxsIE9yY0Rpc3Bvc2VJbnN0YW5jZSguLi4pCisgKiB0byBkZXN0cm95IGl0IGFuZCBmcmVlIGl0cyBtZW1vcnkuIFRoZSBKSVQgc3RhY2sgd2lsbCB0YWtlIG93bmVyc2hpcCBvZiB0aGUKKyAqIFRhcmdldE1hY2hpbmUsIHdoaWNoIHdpbGwgYmUgZGVzdHJveWVkIHdoZW4gdGhlIHN0YWNrIGlzIGRlc3Ryb3llZC4gVGhlCisgKiBjbGllbnQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGRpc3Bvc2Ugb2YgdGhlIFRhcmdldCBNYWNoaW5lLCBvciBpdCB3aWxsIHJlc3VsdAorICogaW4gYSBkb3VibGUtZnJlZS4KKyAqLworTExWTU9yY0pJVFN0YWNrUmVmIExMVk1PcmNDcmVhdGVJbnN0YW5jZShMTFZNVGFyZ2V0TWFjaGluZVJlZiBUTSk7CisKKy8qKgorICogR2V0IHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbW9zdCByZWNlbnQgZXJyb3IgKGlmIGFueSkuCisgKgorICogVGhpcyBtZXNzYWdlIGlzIG93bmVkIGJ5IHRoZSBPUkMgSklUIFN0YWNrIGFuZCB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlIHN0YWNrCisgKiBpcyBkaXNwb3NlZCBvZiBieSBMTFZNT3JjRGlzcG9zZUluc3RhbmNlLgorICovCitjb25zdCBjaGFyICpMTFZNT3JjR2V0RXJyb3JNc2coTExWTU9yY0pJVFN0YWNrUmVmIEpJVFN0YWNrKTsKKworLyoqCisgKiBNYW5nbGUgdGhlIGdpdmVuIHN5bWJvbC4KKyAqIE1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZCBmb3IgTWFuZ2xlZFN5bWJvbCB0byBob2xkIHRoZSByZXN1bHQuIFRoZSBjbGllbnQKKyAqLwordm9pZCBMTFZNT3JjR2V0TWFuZ2xlZFN5bWJvbChMTFZNT3JjSklUU3RhY2tSZWYgSklUU3RhY2ssIGNoYXIgKipNYW5nbGVkU3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpTeW1ib2wpOworCisvKioKKyAqIERpc3Bvc2Ugb2YgYSBtYW5nbGVkIHN5bWJvbC4KKyAqLwordm9pZCBMTFZNT3JjRGlzcG9zZU1hbmdsZWRTeW1ib2woY2hhciAqTWFuZ2xlZFN5bWJvbCk7CisKKy8qKgorICogQ3JlYXRlIGEgbGF6eSBjb21waWxlIGNhbGxiYWNrLgorICovCitMTFZNT3JjRXJyb3JDb2RlCitMTFZNT3JjQ3JlYXRlTGF6eUNvbXBpbGVDYWxsYmFjayhMTFZNT3JjSklUU3RhY2tSZWYgSklUU3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNT3JjVGFyZ2V0QWRkcmVzcyAqUmV0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1PcmNMYXp5Q29tcGlsZUNhbGxiYWNrRm4gQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDYWxsYmFja0N0eCk7CisKKy8qKgorICogQ3JlYXRlIGEgbmFtZWQgaW5kaXJlY3QgY2FsbCBzdHViLgorICovCitMTFZNT3JjRXJyb3JDb2RlIExMVk1PcmNDcmVhdGVJbmRpcmVjdFN0dWIoTExWTU9yY0pJVFN0YWNrUmVmIEpJVFN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlN0dWJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1PcmNUYXJnZXRBZGRyZXNzIEluaXRBZGRyKTsKKworLyoqCisgKiBTZXQgdGhlIHBvaW50ZXIgZm9yIHRoZSBnaXZlbiBpbmRpcmVjdCBzdHViLgorICovCitMTFZNT3JjRXJyb3JDb2RlIExMVk1PcmNTZXRJbmRpcmVjdFN0dWJQb2ludGVyKExMVk1PcmNKSVRTdGFja1JlZiBKSVRTdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqU3R1Yk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1PcmNUYXJnZXRBZGRyZXNzIE5ld0FkZHIpOworCisvKioKKyAqIEFkZCBtb2R1bGUgdG8gYmUgZWFnZXJseSBjb21waWxlZC4KKyAqLworTExWTU9yY0Vycm9yQ29kZQorTExWTU9yY0FkZEVhZ2VybHlDb21waWxlZElSKExMVk1PcmNKSVRTdGFja1JlZiBKSVRTdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNT3JjTW9kdWxlSGFuZGxlICpSZXRIYW5kbGUsIExMVk1Nb2R1bGVSZWYgTW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1PcmNTeW1ib2xSZXNvbHZlckZuIFN5bWJvbFJlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKlN5bWJvbFJlc29sdmVyQ3R4KTsKKworLyoqCisgKiBBZGQgbW9kdWxlIHRvIGJlIGxhemlseSBjb21waWxlZCBvbmUgZnVuY3Rpb24gYXQgYSB0aW1lLgorICovCitMTFZNT3JjRXJyb3JDb2RlCitMTFZNT3JjQWRkTGF6aWx5Q29tcGlsZWRJUihMTFZNT3JjSklUU3RhY2tSZWYgSklUU3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNT3JjTW9kdWxlSGFuZGxlICpSZXRIYW5kbGUsIExMVk1Nb2R1bGVSZWYgTW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU9yY1N5bWJvbFJlc29sdmVyRm4gU3ltYm9sUmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpTeW1ib2xSZXNvbHZlckN0eCk7CisKKy8qKgorICogQWRkIGFuIG9iamVjdCBmaWxlLgorICoKKyAqIFRoaXMgbWV0aG9kIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgZ2l2ZW4gbWVtb3J5IGJ1ZmZlciBhbmQgYXR0ZW1wdHMgdG8gYWRkCisgKiBpdCB0byB0aGUgSklUIGFzIGFuIG9iamVjdCBmaWxlLgorICogQ2xpZW50cyBzaG91bGQgKm5vdCogZGlzcG9zZSBvZiB0aGUgJ09iaicgYXJndW1lbnQ6IHRoZSBKSVQgd2lsbCBtYW5hZ2UgaXQKKyAqIGZyb20gdGhpcyBjYWxsIG9ud2FyZHMuCisgKi8KK0xMVk1PcmNFcnJvckNvZGUgTExWTU9yY0FkZE9iamVjdEZpbGUoTExWTU9yY0pJVFN0YWNrUmVmIEpJVFN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNT3JjTW9kdWxlSGFuZGxlICpSZXRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NZW1vcnlCdWZmZXJSZWYgT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNT3JjU3ltYm9sUmVzb2x2ZXJGbiBTeW1ib2xSZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqU3ltYm9sUmVzb2x2ZXJDdHgpOworCisvKioKKyAqIFJlbW92ZSBhIG1vZHVsZSBzZXQgZnJvbSB0aGUgSklULgorICoKKyAqIFRoaXMgd29ya3MgZm9yIGFsbCBtb2R1bGVzIHRoYXQgY2FuIGJlIGFkZGVkIHZpYSBPcmNBZGQqLCBpbmNsdWRpbmcgb2JqZWN0CisgKiBmaWxlcy4KKyAqLworTExWTU9yY0Vycm9yQ29kZSBMTFZNT3JjUmVtb3ZlTW9kdWxlKExMVk1PcmNKSVRTdGFja1JlZiBKSVRTdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNT3JjTW9kdWxlSGFuZGxlIEgpOworCisvKioKKyAqIEdldCBzeW1ib2wgYWRkcmVzcyBmcm9tIEpJVCBpbnN0YW5jZS4KKyAqLworTExWTU9yY0Vycm9yQ29kZSBMTFZNT3JjR2V0U3ltYm9sQWRkcmVzcyhMTFZNT3JjSklUU3RhY2tSZWYgSklUU3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1PcmNUYXJnZXRBZGRyZXNzICpSZXRBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpTeW1ib2xOYW1lKTsKKworLyoqCisgKiBEaXNwb3NlIG9mIGFuIE9SQyBKSVQgc3RhY2suCisgKi8KK0xMVk1PcmNFcnJvckNvZGUgTExWTU9yY0Rpc3Bvc2VJbnN0YW5jZShMTFZNT3JjSklUU3RhY2tSZWYgSklUU3RhY2spOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBleHRlcm4gIkMiICovCisKKyNlbmRpZiAvKiBMTFZNX0NfT1JDQklORElOR1NfSCAqLwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL1N1cHBvcnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9TdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdkNWQ3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9TdXBwb3J0LmgKQEAgLTAsMCArMSw2NSBAQAorLyo9PT0tLSBsbHZtLWMvU3VwcG9ydC5oIC0gU3VwcG9ydCBDIEludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICp8Cit8KiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGRlZmluZXMgdGhlIEMgaW50ZXJmYWNlIHRvIHRoZSBMTFZNIHN1cHBvcnQgbGlicmFyeS4gICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIExMVk1fQ19TVVBQT1JUX0gKKyNkZWZpbmUgTExWTV9DX1NVUFBPUlRfSAorCisjaW5jbHVkZSAibGx2bS1jL0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0tYy9UeXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBwZXJtYW5lbnRseSBsb2FkcyB0aGUgZHluYW1pYyBsaWJyYXJ5IGF0IHRoZSBnaXZlbiBwYXRoLgorICogSXQgaXMgc2FmZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lIGxpYnJhcnkuCisgKgorICogQHNlZSBzeXM6OkR5bmFtaWNMaWJyYXJ5OjpMb2FkTGlicmFyeVBlcm1hbmVudGx5KCkKKyAgKi8KK0xMVk1Cb29sIExMVk1Mb2FkTGlicmFyeVBlcm1hbmVudGx5KGNvbnN0IGNoYXIqIEZpbGVuYW1lKTsKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHBhcnNlcyB0aGUgZ2l2ZW4gYXJndW1lbnRzIHVzaW5nIHRoZSBMTFZNIGNvbW1hbmQgbGluZSBwYXJzZXIuCisgKiBOb3RlIHRoYXQgdGhlIG9ubHkgc3RhYmxlIHRoaW5nIGFib3V0IHRoaXMgZnVuY3Rpb24gaXMgaXRzIHNpZ25hdHVyZTsgeW91CisgKiBjYW5ub3QgcmVseSBvbiBhbnkgcGFydGljdWxhciBzZXQgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBiZWluZyBpbnRlcnByZXRlZAorICogdGhlIHNhbWUgd2F5IGFjcm9zcyBMTFZNIHZlcnNpb25zLgorICoKKyAqIEBzZWUgbGx2bTo6Y2w6OlBhcnNlQ29tbWFuZExpbmVPcHRpb25zKCkKKyAqLwordm9pZCBMTFZNUGFyc2VDb21tYW5kTGluZU9wdGlvbnMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmNvbnN0ICphcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqT3ZlcnZpZXcpOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzZWFyY2ggdGhyb3VnaCBhbGwgcHJldmlvdXNseSBsb2FkZWQgZHluYW1pYworICogbGlicmFyaWVzIGZvciB0aGUgc3ltYm9sIFxwIHN5bWJvbE5hbWUuIElmIGl0IGlzIGZvdW5kLCB0aGUgYWRkcmVzcyBvZgorICogdGhhdCBzeW1ib2wgaXMgcmV0dXJuZWQuIElmIG5vdCwgbnVsbCBpcyByZXR1cm5lZC4KKyAqCisgKiBAc2VlIHN5czo6RHluYW1pY0xpYnJhcnk6OlNlYXJjaEZvckFkZHJlc3NPZlN5bWJvbCgpCisgKi8KK3ZvaWQgKkxMVk1TZWFyY2hGb3JBZGRyZXNzT2ZTeW1ib2woY29uc3QgY2hhciAqc3ltYm9sTmFtZSk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbnMgcGVybWFuZW50bHkgYWRkcyB0aGUgc3ltYm9sIFxwIHN5bWJvbE5hbWUgd2l0aCB0aGUKKyAqIHZhbHVlIFxwIHN5bWJvbFZhbHVlLiAgVGhlc2Ugc3ltYm9scyBhcmUgc2VhcmNoZWQgYmVmb3JlIGFueQorICogbGlicmFyaWVzLgorICoKKyAqIEBzZWUgc3lzOjpEeW5hbWljTGlicmFyeTo6QWRkU3ltYm9sKCkKKyAqLwordm9pZCBMTFZNQWRkU3ltYm9sKGNvbnN0IGNoYXIgKnN5bWJvbE5hbWUsIHZvaWQgKnN5bWJvbFZhbHVlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvVGFyZ2V0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvVGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwMDRiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9UYXJnZXQuaApAQCAtMCwwICsxLDI5OSBAQAorLyo9PT0tLSBsbHZtLWMvVGFyZ2V0LmggLSBUYXJnZXQgTGliIEMgSWZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICovCisvKiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBoZWFkZXIgZGVjbGFyZXMgdGhlIEMgaW50ZXJmYWNlIHRvIGxpYkxMVk1UYXJnZXQuYSwgd2hpY2ggICAgICAgICAgICAgKi8KKy8qIGltcGxlbWVudHMgdGFyZ2V0IGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTWFueSBleG90aWMgbGFuZ3VhZ2VzIGNhbiBpbnRlcm9wZXJhdGUgd2l0aCBDIGNvZGUgYnV0IGhhdmUgYSBoYXJkZXIgdGltZSAgKi8KKy8qIHdpdGggQysrIGR1ZSB0byBuYW1lIG1hbmdsaW5nLiBTbyBpbiBhZGRpdGlvbiB0byBDLCB0aGlzIGludGVyZmFjZSBlbmFibGVzICovCisvKiB0b29scyB3cml0dGVuIGluIHN1Y2ggbGFuZ3VhZ2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9DX1RBUkdFVF9ICisjZGVmaW5lIExMVk1fQ19UQVJHRVRfSAorCisjaW5jbHVkZSAibGx2bS1jL1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db25maWcvbGx2bS1jb25maWcuaCIKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKGlubGluZSkKKyNkZWZpbmUgaW5saW5lIF9faW5saW5lCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ1RhcmdldCBUYXJnZXQgaW5mb3JtYXRpb24KKyAqIEBpbmdyb3VwIExMVk1DCisgKgorICogQHsKKyAqLworCitlbnVtIExMVk1CeXRlT3JkZXJpbmcgeyBMTFZNQmlnRW5kaWFuLCBMTFZNTGl0dGxlRW5kaWFuIH07CisKK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVUYXJnZXREYXRhICpMTFZNVGFyZ2V0RGF0YVJlZjsKK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVUYXJnZXRMaWJyYXJ5SW5mb3REYXRhICpMTFZNVGFyZ2V0TGlicmFyeUluZm9SZWY7CisKKy8qIERlY2xhcmUgYWxsIG9mIHRoZSB0YXJnZXQtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIHRoYXQgYXJlIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgTExWTV9UQVJHRVQoVGFyZ2V0TmFtZSkgXAorICB2b2lkIExMVk1Jbml0aWFsaXplIyNUYXJnZXROYW1lIyNUYXJnZXRJbmZvKHZvaWQpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL1RhcmdldHMuZGVmIgorI3VuZGVmIExMVk1fVEFSR0VUICAvKiBFeHBsaWNpdCB1bmRlZiB0byBtYWtlIFNXSUcgaGFwcGllciAqLworCisjZGVmaW5lIExMVk1fVEFSR0VUKFRhcmdldE5hbWUpIHZvaWQgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI1RhcmdldCh2b2lkKTsKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9UYXJnZXRzLmRlZiIKKyN1bmRlZiBMTFZNX1RBUkdFVCAgLyogRXhwbGljaXQgdW5kZWYgdG8gbWFrZSBTV0lHIGhhcHBpZXIgKi8KKworI2RlZmluZSBMTFZNX1RBUkdFVChUYXJnZXROYW1lKSBcCisgIHZvaWQgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI1RhcmdldE1DKHZvaWQpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL1RhcmdldHMuZGVmIgorI3VuZGVmIExMVk1fVEFSR0VUICAvKiBFeHBsaWNpdCB1bmRlZiB0byBtYWtlIFNXSUcgaGFwcGllciAqLworCisvKiBEZWNsYXJlIGFsbCBvZiB0aGUgYXZhaWxhYmxlIGFzc2VtYmx5IHByaW50ZXIgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLiAqLworI2RlZmluZSBMTFZNX0FTTV9QUklOVEVSKFRhcmdldE5hbWUpIFwKKyAgdm9pZCBMTFZNSW5pdGlhbGl6ZSMjVGFyZ2V0TmFtZSMjQXNtUHJpbnRlcih2b2lkKTsKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9Bc21QcmludGVycy5kZWYiCisjdW5kZWYgTExWTV9BU01fUFJJTlRFUiAgLyogRXhwbGljaXQgdW5kZWYgdG8gbWFrZSBTV0lHIGhhcHBpZXIgKi8KKworLyogRGVjbGFyZSBhbGwgb2YgdGhlIGF2YWlsYWJsZSBhc3NlbWJseSBwYXJzZXIgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLiAqLworI2RlZmluZSBMTFZNX0FTTV9QQVJTRVIoVGFyZ2V0TmFtZSkgXAorICB2b2lkIExMVk1Jbml0aWFsaXplIyNUYXJnZXROYW1lIyNBc21QYXJzZXIodm9pZCk7CisjaW5jbHVkZSAibGx2bS9Db25maWcvQXNtUGFyc2Vycy5kZWYiCisjdW5kZWYgTExWTV9BU01fUEFSU0VSICAvKiBFeHBsaWNpdCB1bmRlZiB0byBtYWtlIFNXSUcgaGFwcGllciAqLworCisvKiBEZWNsYXJlIGFsbCBvZiB0aGUgYXZhaWxhYmxlIGRpc2Fzc2VtYmxlciBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuICovCisjZGVmaW5lIExMVk1fRElTQVNTRU1CTEVSKFRhcmdldE5hbWUpIFwKKyAgdm9pZCBMTFZNSW5pdGlhbGl6ZSMjVGFyZ2V0TmFtZSMjRGlzYXNzZW1ibGVyKHZvaWQpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL0Rpc2Fzc2VtYmxlcnMuZGVmIgorI3VuZGVmIExMVk1fRElTQVNTRU1CTEVSICAvKiBFeHBsaWNpdCB1bmRlZiB0byBtYWtlIFNXSUcgaGFwcGllciAqLworCisvKiogTExWTUluaXRpYWxpemVBbGxUYXJnZXRJbmZvcyAtIFRoZSBtYWluIHByb2dyYW0gc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBpZgorICAgIGl0IHdhbnRzIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHRhcmdldHMgdGhhdCBMTFZNIGlzIGNvbmZpZ3VyZWQgdG8KKyAgICBzdXBwb3J0LiAqLworc3RhdGljIGlubGluZSB2b2lkIExMVk1Jbml0aWFsaXplQWxsVGFyZ2V0SW5mb3Modm9pZCkgeworI2RlZmluZSBMTFZNX1RBUkdFVChUYXJnZXROYW1lKSBMTFZNSW5pdGlhbGl6ZSMjVGFyZ2V0TmFtZSMjVGFyZ2V0SW5mbygpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL1RhcmdldHMuZGVmIgorI3VuZGVmIExMVk1fVEFSR0VUICAvKiBFeHBsaWNpdCB1bmRlZiB0byBtYWtlIFNXSUcgaGFwcGllciAqLworfQorCisvKiogTExWTUluaXRpYWxpemVBbGxUYXJnZXRzIC0gVGhlIG1haW4gcHJvZ3JhbSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmIGl0CisgICAgd2FudHMgdG8gbGluayBpbiBhbGwgYXZhaWxhYmxlIHRhcmdldHMgdGhhdCBMTFZNIGlzIGNvbmZpZ3VyZWQgdG8KKyAgICBzdXBwb3J0LiAqLworc3RhdGljIGlubGluZSB2b2lkIExMVk1Jbml0aWFsaXplQWxsVGFyZ2V0cyh2b2lkKSB7CisjZGVmaW5lIExMVk1fVEFSR0VUKFRhcmdldE5hbWUpIExMVk1Jbml0aWFsaXplIyNUYXJnZXROYW1lIyNUYXJnZXQoKTsKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9UYXJnZXRzLmRlZiIKKyN1bmRlZiBMTFZNX1RBUkdFVCAgLyogRXhwbGljaXQgdW5kZWYgdG8gbWFrZSBTV0lHIGhhcHBpZXIgKi8KK30KKworLyoqIExMVk1Jbml0aWFsaXplQWxsVGFyZ2V0TUNzIC0gVGhlIG1haW4gcHJvZ3JhbSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmCisgICAgaXQgd2FudHMgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgdGFyZ2V0IE1DIHRoYXQgTExWTSBpcyBjb25maWd1cmVkIHRvCisgICAgc3VwcG9ydC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBMTFZNSW5pdGlhbGl6ZUFsbFRhcmdldE1Dcyh2b2lkKSB7CisjZGVmaW5lIExMVk1fVEFSR0VUKFRhcmdldE5hbWUpIExMVk1Jbml0aWFsaXplIyNUYXJnZXROYW1lIyNUYXJnZXRNQygpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL1RhcmdldHMuZGVmIgorI3VuZGVmIExMVk1fVEFSR0VUICAvKiBFeHBsaWNpdCB1bmRlZiB0byBtYWtlIFNXSUcgaGFwcGllciAqLworfQorCisvKiogTExWTUluaXRpYWxpemVBbGxBc21QcmludGVycyAtIFRoZSBtYWluIHByb2dyYW0gc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBpZgorICAgIGl0IHdhbnRzIGFsbCBhc20gcHJpbnRlcnMgdGhhdCBMTFZNIGlzIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCwgdG8gbWFrZSB0aGVtCisgICAgYXZhaWxhYmxlIHZpYSB0aGUgVGFyZ2V0UmVnaXN0cnkuICovCitzdGF0aWMgaW5saW5lIHZvaWQgTExWTUluaXRpYWxpemVBbGxBc21QcmludGVycyh2b2lkKSB7CisjZGVmaW5lIExMVk1fQVNNX1BSSU5URVIoVGFyZ2V0TmFtZSkgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI0FzbVByaW50ZXIoKTsKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9Bc21QcmludGVycy5kZWYiCisjdW5kZWYgTExWTV9BU01fUFJJTlRFUiAgLyogRXhwbGljaXQgdW5kZWYgdG8gbWFrZSBTV0lHIGhhcHBpZXIgKi8KK30KKworLyoqIExMVk1Jbml0aWFsaXplQWxsQXNtUGFyc2VycyAtIFRoZSBtYWluIHByb2dyYW0gc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBpZgorICAgIGl0IHdhbnRzIGFsbCBhc20gcGFyc2VycyB0aGF0IExMVk0gaXMgY29uZmlndXJlZCB0byBzdXBwb3J0LCB0byBtYWtlIHRoZW0KKyAgICBhdmFpbGFibGUgdmlhIHRoZSBUYXJnZXRSZWdpc3RyeS4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBMTFZNSW5pdGlhbGl6ZUFsbEFzbVBhcnNlcnModm9pZCkgeworI2RlZmluZSBMTFZNX0FTTV9QQVJTRVIoVGFyZ2V0TmFtZSkgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI0FzbVBhcnNlcigpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL0FzbVBhcnNlcnMuZGVmIgorI3VuZGVmIExMVk1fQVNNX1BBUlNFUiAgLyogRXhwbGljaXQgdW5kZWYgdG8gbWFrZSBTV0lHIGhhcHBpZXIgKi8KK30KKworLyoqIExMVk1Jbml0aWFsaXplQWxsRGlzYXNzZW1ibGVycyAtIFRoZSBtYWluIHByb2dyYW0gc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbgorICAgIGlmIGl0IHdhbnRzIGFsbCBkaXNhc3NlbWJsZXJzIHRoYXQgTExWTSBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQsIHRvIG1ha2UKKyAgICB0aGVtIGF2YWlsYWJsZSB2aWEgdGhlIFRhcmdldFJlZ2lzdHJ5LiAqLworc3RhdGljIGlubGluZSB2b2lkIExMVk1Jbml0aWFsaXplQWxsRGlzYXNzZW1ibGVycyh2b2lkKSB7CisjZGVmaW5lIExMVk1fRElTQVNTRU1CTEVSKFRhcmdldE5hbWUpIFwKKyAgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI0Rpc2Fzc2VtYmxlcigpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL0Rpc2Fzc2VtYmxlcnMuZGVmIgorI3VuZGVmIExMVk1fRElTQVNTRU1CTEVSICAvKiBFeHBsaWNpdCB1bmRlZiB0byBtYWtlIFNXSUcgaGFwcGllciAqLworfQorCisvKiogTExWTUluaXRpYWxpemVOYXRpdmVUYXJnZXQgLSBUaGUgbWFpbiBwcm9ncmFtIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gdG8KKyAgICBpbml0aWFsaXplIHRoZSBuYXRpdmUgdGFyZ2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGhvc3QuICBUaGlzIGlzIHVzZWZ1bAorICAgIGZvciBKSVQgYXBwbGljYXRpb25zIHRvIGVuc3VyZSB0aGF0IHRoZSB0YXJnZXQgZ2V0cyBsaW5rZWQgaW4gY29ycmVjdGx5LiAqLworc3RhdGljIGlubGluZSBMTFZNQm9vbCBMTFZNSW5pdGlhbGl6ZU5hdGl2ZVRhcmdldCh2b2lkKSB7CisgIC8qIElmIHdlIGhhdmUgYSBuYXRpdmUgdGFyZ2V0LCBpbml0aWFsaXplIGl0IHRvIGVuc3VyZSBpdCBpcyBsaW5rZWQgaW4uICovCisjaWZkZWYgTExWTV9OQVRJVkVfVEFSR0VUCisgIExMVk1fTkFUSVZFX1RBUkdFVElORk8oKTsKKyAgTExWTV9OQVRJVkVfVEFSR0VUKCk7CisgIExMVk1fTkFUSVZFX1RBUkdFVE1DKCk7CisgIHJldHVybiAwOworI2Vsc2UKKyAgcmV0dXJuIDE7CisjZW5kaWYKK30KKworLyoqIExMVk1Jbml0aWFsaXplTmF0aXZlVGFyZ2V0QXNtUGFyc2VyIC0gVGhlIG1haW4gcHJvZ3JhbSBzaG91bGQgY2FsbCB0aGlzCisgICAgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSB0aGUgcGFyc2VyIGZvciB0aGUgbmF0aXZlIHRhcmdldCBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgIGhvc3QuICovCitzdGF0aWMgaW5saW5lIExMVk1Cb29sIExMVk1Jbml0aWFsaXplTmF0aXZlQXNtUGFyc2VyKHZvaWQpIHsKKyNpZmRlZiBMTFZNX05BVElWRV9BU01QQVJTRVIKKyAgTExWTV9OQVRJVkVfQVNNUEFSU0VSKCk7CisgIHJldHVybiAwOworI2Vsc2UKKyAgcmV0dXJuIDE7CisjZW5kaWYKK30KKworLyoqIExMVk1Jbml0aWFsaXplTmF0aXZlVGFyZ2V0QXNtUHJpbnRlciAtIFRoZSBtYWluIHByb2dyYW0gc2hvdWxkIGNhbGwgdGhpcworICAgIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIHByaW50ZXIgZm9yIHRoZSBuYXRpdmUgdGFyZ2V0IGNvcnJlc3BvbmRpbmcgdG8KKyAgICB0aGUgaG9zdC4gKi8KK3N0YXRpYyBpbmxpbmUgTExWTUJvb2wgTExWTUluaXRpYWxpemVOYXRpdmVBc21QcmludGVyKHZvaWQpIHsKKyNpZmRlZiBMTFZNX05BVElWRV9BU01QUklOVEVSCisgIExMVk1fTkFUSVZFX0FTTVBSSU5URVIoKTsKKyAgcmV0dXJuIDA7CisjZWxzZQorICByZXR1cm4gMTsKKyNlbmRpZgorfQorCisvKiogTExWTUluaXRpYWxpemVOYXRpdmVUYXJnZXREaXNhc3NlbWJsZXIgLSBUaGUgbWFpbiBwcm9ncmFtIHNob3VsZCBjYWxsIHRoaXMKKyAgICBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZSBkaXNhc3NlbWJsZXIgZm9yIHRoZSBuYXRpdmUgdGFyZ2V0IGNvcnJlc3BvbmRpbmcKKyAgICB0byB0aGUgaG9zdC4gKi8KK3N0YXRpYyBpbmxpbmUgTExWTUJvb2wgTExWTUluaXRpYWxpemVOYXRpdmVEaXNhc3NlbWJsZXIodm9pZCkgeworI2lmZGVmIExMVk1fTkFUSVZFX0RJU0FTU0VNQkxFUgorICBMTFZNX05BVElWRV9ESVNBU1NFTUJMRVIoKTsKKyAgcmV0dXJuIDA7CisjZWxzZQorICByZXR1cm4gMTsKKyNlbmRpZgorfQorCisvKj09PS0tIFRhcmdldCBEYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisvKioKKyAqIE9idGFpbiB0aGUgZGF0YSBsYXlvdXQgZm9yIGEgbW9kdWxlLgorICoKKyAqIEBzZWUgTW9kdWxlOjpnZXREYXRhTGF5b3V0KCkKKyAqLworTExWTVRhcmdldERhdGFSZWYgTExWTUdldE1vZHVsZURhdGFMYXlvdXQoTExWTU1vZHVsZVJlZiBNKTsKKworLyoqCisgKiBTZXQgdGhlIGRhdGEgbGF5b3V0IGZvciBhIG1vZHVsZS4KKyAqCisgKiBAc2VlIE1vZHVsZTo6c2V0RGF0YUxheW91dCgpCisgKi8KK3ZvaWQgTExWTVNldE1vZHVsZURhdGFMYXlvdXQoTExWTU1vZHVsZVJlZiBNLCBMTFZNVGFyZ2V0RGF0YVJlZiBETCk7CisKKy8qKiBDcmVhdGVzIHRhcmdldCBkYXRhIGZyb20gYSB0YXJnZXQgbGF5b3V0IHN0cmluZy4KKyAgICBTZWUgdGhlIGNvbnN0cnVjdG9yIGxsdm06OkRhdGFMYXlvdXQ6OkRhdGFMYXlvdXQuICovCitMTFZNVGFyZ2V0RGF0YVJlZiBMTFZNQ3JlYXRlVGFyZ2V0RGF0YShjb25zdCBjaGFyICpTdHJpbmdSZXApOworCisvKiogRGVhbGxvY2F0ZXMgYSBUYXJnZXREYXRhLgorICAgIFNlZSB0aGUgZGVzdHJ1Y3RvciBsbHZtOjpEYXRhTGF5b3V0Ojp+RGF0YUxheW91dC4gKi8KK3ZvaWQgTExWTURpc3Bvc2VUYXJnZXREYXRhKExMVk1UYXJnZXREYXRhUmVmIFREKTsKKworLyoqIEFkZHMgdGFyZ2V0IGxpYnJhcnkgaW5mb3JtYXRpb24gdG8gYSBwYXNzIG1hbmFnZXIuIFRoaXMgZG9lcyBub3QgdGFrZQorICAgIG93bmVyc2hpcCBvZiB0aGUgdGFyZ2V0IGxpYnJhcnkgaW5mby4KKyAgICBTZWUgdGhlIG1ldGhvZCBsbHZtOjpQYXNzTWFuYWdlckJhc2U6OmFkZC4gKi8KK3ZvaWQgTExWTUFkZFRhcmdldExpYnJhcnlJbmZvKExMVk1UYXJnZXRMaWJyYXJ5SW5mb1JlZiBUTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogQ29udmVydHMgdGFyZ2V0IGRhdGEgdG8gYSB0YXJnZXQgbGF5b3V0IHN0cmluZy4gVGhlIHN0cmluZyBtdXN0IGJlIGRpc3Bvc2VkCisgICAgd2l0aCBMTFZNRGlzcG9zZU1lc3NhZ2UuCisgICAgU2VlIHRoZSBjb25zdHJ1Y3RvciBsbHZtOjpEYXRhTGF5b3V0OjpEYXRhTGF5b3V0LiAqLworY2hhciAqTExWTUNvcHlTdHJpbmdSZXBPZlRhcmdldERhdGEoTExWTVRhcmdldERhdGFSZWYgVEQpOworCisvKiogUmV0dXJucyB0aGUgYnl0ZSBvcmRlciBvZiBhIHRhcmdldCwgZWl0aGVyIExMVk1CaWdFbmRpYW4gb3IKKyAgICBMTFZNTGl0dGxlRW5kaWFuLgorICAgIFNlZSB0aGUgbWV0aG9kIGxsdm06OkRhdGFMYXlvdXQ6OmlzTGl0dGxlRW5kaWFuLiAqLworZW51bSBMTFZNQnl0ZU9yZGVyaW5nIExMVk1CeXRlT3JkZXIoTExWTVRhcmdldERhdGFSZWYgVEQpOworCisvKiogUmV0dXJucyB0aGUgcG9pbnRlciBzaXplIGluIGJ5dGVzIGZvciBhIHRhcmdldC4KKyAgICBTZWUgdGhlIG1ldGhvZCBsbHZtOjpEYXRhTGF5b3V0OjpnZXRQb2ludGVyU2l6ZS4gKi8KK3Vuc2lnbmVkIExMVk1Qb2ludGVyU2l6ZShMTFZNVGFyZ2V0RGF0YVJlZiBURCk7CisKKy8qKiBSZXR1cm5zIHRoZSBwb2ludGVyIHNpemUgaW4gYnl0ZXMgZm9yIGEgdGFyZ2V0IGZvciBhIHNwZWNpZmllZAorICAgIGFkZHJlc3Mgc3BhY2UuCisgICAgU2VlIHRoZSBtZXRob2QgbGx2bTo6RGF0YUxheW91dDo6Z2V0UG9pbnRlclNpemUuICovCit1bnNpZ25lZCBMTFZNUG9pbnRlclNpemVGb3JBUyhMTFZNVGFyZ2V0RGF0YVJlZiBURCwgdW5zaWduZWQgQVMpOworCisvKiogUmV0dXJucyB0aGUgaW50ZWdlciB0eXBlIHRoYXQgaXMgdGhlIHNhbWUgc2l6ZSBhcyBhIHBvaW50ZXIgb24gYSB0YXJnZXQuCisgICAgU2VlIHRoZSBtZXRob2QgbGx2bTo6RGF0YUxheW91dDo6Z2V0SW50UHRyVHlwZS4gKi8KK0xMVk1UeXBlUmVmIExMVk1JbnRQdHJUeXBlKExMVk1UYXJnZXREYXRhUmVmIFREKTsKKworLyoqIFJldHVybnMgdGhlIGludGVnZXIgdHlwZSB0aGF0IGlzIHRoZSBzYW1lIHNpemUgYXMgYSBwb2ludGVyIG9uIGEgdGFyZ2V0LgorICAgIFRoaXMgdmVyc2lvbiBhbGxvd3MgdGhlIGFkZHJlc3Mgc3BhY2UgdG8gYmUgc3BlY2lmaWVkLgorICAgIFNlZSB0aGUgbWV0aG9kIGxsdm06OkRhdGFMYXlvdXQ6OmdldEludFB0clR5cGUuICovCitMTFZNVHlwZVJlZiBMTFZNSW50UHRyVHlwZUZvckFTKExMVk1UYXJnZXREYXRhUmVmIFRELCB1bnNpZ25lZCBBUyk7CisKKy8qKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIHR5cGUgdGhhdCBpcyB0aGUgc2FtZSBzaXplIGFzIGEgcG9pbnRlciBvbiBhIHRhcmdldC4KKyAgICBTZWUgdGhlIG1ldGhvZCBsbHZtOjpEYXRhTGF5b3V0OjpnZXRJbnRQdHJUeXBlLiAqLworTExWTVR5cGVSZWYgTExWTUludFB0clR5cGVJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQywgTExWTVRhcmdldERhdGFSZWYgVEQpOworCisvKiogUmV0dXJucyB0aGUgaW50ZWdlciB0eXBlIHRoYXQgaXMgdGhlIHNhbWUgc2l6ZSBhcyBhIHBvaW50ZXIgb24gYSB0YXJnZXQuCisgICAgVGhpcyB2ZXJzaW9uIGFsbG93cyB0aGUgYWRkcmVzcyBzcGFjZSB0byBiZSBzcGVjaWZpZWQuCisgICAgU2VlIHRoZSBtZXRob2QgbGx2bTo6RGF0YUxheW91dDo6Z2V0SW50UHRyVHlwZS4gKi8KK0xMVk1UeXBlUmVmIExMVk1JbnRQdHJUeXBlRm9yQVNJbkNvbnRleHQoTExWTUNvbnRleHRSZWYgQywgTExWTVRhcmdldERhdGFSZWYgVEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFTKTsKKworLyoqIENvbXB1dGVzIHRoZSBzaXplIG9mIGEgdHlwZSBpbiBieXRlcyBmb3IgYSB0YXJnZXQuCisgICAgU2VlIHRoZSBtZXRob2QgbGx2bTo6RGF0YUxheW91dDo6Z2V0VHlwZVNpemVJbkJpdHMuICovCit1bnNpZ25lZCBsb25nIGxvbmcgTExWTVNpemVPZlR5cGVJbkJpdHMoTExWTVRhcmdldERhdGFSZWYgVEQsIExMVk1UeXBlUmVmIFR5KTsKKworLyoqIENvbXB1dGVzIHRoZSBzdG9yYWdlIHNpemUgb2YgYSB0eXBlIGluIGJ5dGVzIGZvciBhIHRhcmdldC4KKyAgICBTZWUgdGhlIG1ldGhvZCBsbHZtOjpEYXRhTGF5b3V0OjpnZXRUeXBlU3RvcmVTaXplLiAqLwordW5zaWduZWQgbG9uZyBsb25nIExMVk1TdG9yZVNpemVPZlR5cGUoTExWTVRhcmdldERhdGFSZWYgVEQsIExMVk1UeXBlUmVmIFR5KTsKKworLyoqIENvbXB1dGVzIHRoZSBBQkkgc2l6ZSBvZiBhIHR5cGUgaW4gYnl0ZXMgZm9yIGEgdGFyZ2V0LgorICAgIFNlZSB0aGUgbWV0aG9kIGxsdm06OkRhdGFMYXlvdXQ6OmdldFR5cGVBbGxvY1NpemUuICovCit1bnNpZ25lZCBsb25nIGxvbmcgTExWTUFCSVNpemVPZlR5cGUoTExWTVRhcmdldERhdGFSZWYgVEQsIExMVk1UeXBlUmVmIFR5KTsKKworLyoqIENvbXB1dGVzIHRoZSBBQkkgYWxpZ25tZW50IG9mIGEgdHlwZSBpbiBieXRlcyBmb3IgYSB0YXJnZXQuCisgICAgU2VlIHRoZSBtZXRob2QgbGx2bTo6RGF0YUxheW91dDo6Z2V0VHlwZUFCSVNpemUuICovCit1bnNpZ25lZCBMTFZNQUJJQWxpZ25tZW50T2ZUeXBlKExMVk1UYXJnZXREYXRhUmVmIFRELCBMTFZNVHlwZVJlZiBUeSk7CisKKy8qKiBDb21wdXRlcyB0aGUgY2FsbCBmcmFtZSBhbGlnbm1lbnQgb2YgYSB0eXBlIGluIGJ5dGVzIGZvciBhIHRhcmdldC4KKyAgICBTZWUgdGhlIG1ldGhvZCBsbHZtOjpEYXRhTGF5b3V0OjpnZXRUeXBlQUJJU2l6ZS4gKi8KK3Vuc2lnbmVkIExMVk1DYWxsRnJhbWVBbGlnbm1lbnRPZlR5cGUoTExWTVRhcmdldERhdGFSZWYgVEQsIExMVk1UeXBlUmVmIFR5KTsKKworLyoqIENvbXB1dGVzIHRoZSBwcmVmZXJyZWQgYWxpZ25tZW50IG9mIGEgdHlwZSBpbiBieXRlcyBmb3IgYSB0YXJnZXQuCisgICAgU2VlIHRoZSBtZXRob2QgbGx2bTo6RGF0YUxheW91dDo6Z2V0VHlwZUFCSVNpemUuICovCit1bnNpZ25lZCBMTFZNUHJlZmVycmVkQWxpZ25tZW50T2ZUeXBlKExMVk1UYXJnZXREYXRhUmVmIFRELCBMTFZNVHlwZVJlZiBUeSk7CisKKy8qKiBDb21wdXRlcyB0aGUgcHJlZmVycmVkIGFsaWdubWVudCBvZiBhIGdsb2JhbCB2YXJpYWJsZSBpbiBieXRlcyBmb3IgYSB0YXJnZXQuCisgICAgU2VlIHRoZSBtZXRob2QgbGx2bTo6RGF0YUxheW91dDo6Z2V0UHJlZmVycmVkQWxpZ25tZW50LiAqLwordW5zaWduZWQgTExWTVByZWZlcnJlZEFsaWdubWVudE9mR2xvYmFsKExMVk1UYXJnZXREYXRhUmVmIFRELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WYWx1ZVJlZiBHbG9iYWxWYXIpOworCisvKiogQ29tcHV0ZXMgdGhlIHN0cnVjdHVyZSBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGJ5dGUgb2Zmc2V0IGZvciBhIHRhcmdldC4KKyAgICBTZWUgdGhlIG1ldGhvZCBsbHZtOjpTdHJ1Y3RMYXlvdXQ6OmdldEVsZW1lbnRDb250YWluaW5nT2Zmc2V0LiAqLwordW5zaWduZWQgTExWTUVsZW1lbnRBdE9mZnNldChMTFZNVGFyZ2V0RGF0YVJlZiBURCwgTExWTVR5cGVSZWYgU3RydWN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBPZmZzZXQpOworCisvKiogQ29tcHV0ZXMgdGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBpbmRleGVkIHN0cnVjdCBlbGVtZW50IGZvciBhIHRhcmdldC4KKyAgICBTZWUgdGhlIG1ldGhvZCBsbHZtOjpTdHJ1Y3RMYXlvdXQ6OmdldEVsZW1lbnRDb250YWluaW5nT2Zmc2V0LiAqLwordW5zaWduZWQgbG9uZyBsb25nIExMVk1PZmZzZXRPZkVsZW1lbnQoTExWTVRhcmdldERhdGFSZWYgVEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVHlwZVJlZiBTdHJ1Y3RUeSwgdW5zaWduZWQgRWxlbWVudCk7CisKKy8qKgorICogQH0KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9UYXJnZXRNYWNoaW5lLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvVGFyZ2V0TWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZjdmNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvVGFyZ2V0TWFjaGluZS5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKj09PS0tIGxsdm0tYy9UYXJnZXRNYWNoaW5lLmggLSBUYXJnZXQgTWFjaGluZSBMaWJyYXJ5IEMgSW50ZXJmYWNlIC0gQysrIC0qLT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGhlYWRlciBkZWNsYXJlcyB0aGUgQyBpbnRlcmZhY2UgdG8gdGhlIFRhcmdldCBhbmQgVGFyZ2V0TWFjaGluZSAgICAgICAqfAorfCogY2xhc3Nlcywgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgb3Igb2JqZWN0IGZpbGVzLiAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBNYW55IGV4b3RpYyBsYW5ndWFnZXMgY2FuIGludGVyb3BlcmF0ZSB3aXRoIEMgY29kZSBidXQgaGF2ZSBhIGhhcmRlciB0aW1lICAqfAorfCogd2l0aCBDKysgZHVlIHRvIG5hbWUgbWFuZ2xpbmcuIFNvIGluIGFkZGl0aW9uIHRvIEMsIHRoaXMgaW50ZXJmYWNlIGVuYWJsZXMgKnwKK3wqIHRvb2xzIHdyaXR0ZW4gaW4gc3VjaCBsYW5ndWFnZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX0NfVEFSR0VUTUFDSElORV9ICisjZGVmaW5lIExMVk1fQ19UQVJHRVRNQUNISU5FX0gKKworI2luY2x1ZGUgImxsdm0tYy9UYXJnZXQuaCIKKyNpbmNsdWRlICJsbHZtLWMvVHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgTExWTU9wYXF1ZVRhcmdldE1hY2hpbmUgKkxMVk1UYXJnZXRNYWNoaW5lUmVmOwordHlwZWRlZiBzdHJ1Y3QgTExWTVRhcmdldCAqTExWTVRhcmdldFJlZjsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBMTFZNQ29kZUdlbkxldmVsTm9uZSwKKyAgICBMTFZNQ29kZUdlbkxldmVsTGVzcywKKyAgICBMTFZNQ29kZUdlbkxldmVsRGVmYXVsdCwKKyAgICBMTFZNQ29kZUdlbkxldmVsQWdncmVzc2l2ZQorfSBMTFZNQ29kZUdlbk9wdExldmVsOworCit0eXBlZGVmIGVudW0geworICAgIExMVk1SZWxvY0RlZmF1bHQsCisgICAgTExWTVJlbG9jU3RhdGljLAorICAgIExMVk1SZWxvY1BJQywKKyAgICBMTFZNUmVsb2NEeW5hbWljTm9QaWMKK30gTExWTVJlbG9jTW9kZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBMTFZNQ29kZU1vZGVsRGVmYXVsdCwKKyAgICBMTFZNQ29kZU1vZGVsSklURGVmYXVsdCwKKyAgICBMTFZNQ29kZU1vZGVsU21hbGwsCisgICAgTExWTUNvZGVNb2RlbEtlcm5lbCwKKyAgICBMTFZNQ29kZU1vZGVsTWVkaXVtLAorICAgIExMVk1Db2RlTW9kZWxMYXJnZQorfSBMTFZNQ29kZU1vZGVsOworCit0eXBlZGVmIGVudW0geworICAgIExMVk1Bc3NlbWJseUZpbGUsCisgICAgTExWTU9iamVjdEZpbGUKK30gTExWTUNvZGVHZW5GaWxlVHlwZTsKKworLyoqIFJldHVybnMgdGhlIGZpcnN0IGxsdm06OlRhcmdldCBpbiB0aGUgcmVnaXN0ZXJlZCB0YXJnZXRzIGxpc3QuICovCitMTFZNVGFyZ2V0UmVmIExMVk1HZXRGaXJzdFRhcmdldCh2b2lkKTsKKy8qKiBSZXR1cm5zIHRoZSBuZXh0IGxsdm06OlRhcmdldCBnaXZlbiBhIHByZXZpb3VzIG9uZSAob3IgbnVsbCBpZiB0aGVyZSdzIG5vbmUpICovCitMTFZNVGFyZ2V0UmVmIExMVk1HZXROZXh0VGFyZ2V0KExMVk1UYXJnZXRSZWYgVCk7CisKKy8qPT09LS0gVGFyZ2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisvKiogRmluZHMgdGhlIHRhcmdldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBuYW1lIGFuZCBzdG9yZXMgaXQgaW4gXHAgVC4KKyAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MuICovCitMTFZNVGFyZ2V0UmVmIExMVk1HZXRUYXJnZXRGcm9tTmFtZShjb25zdCBjaGFyICpOYW1lKTsKKworLyoqIEZpbmRzIHRoZSB0YXJnZXQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdHJpcGxlIGFuZCBzdG9yZXMgaXQgaW4gXHAgVC4KKyAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MuIE9wdGlvbmFsbHkgcmV0dXJucyBhbnkgZXJyb3IgaW4gRXJyb3JNZXNzYWdlLgorICBVc2UgTExWTURpc3Bvc2VNZXNzYWdlIHRvIGRpc3Bvc2UgdGhlIG1lc3NhZ2UuICovCitMTFZNQm9vbCBMTFZNR2V0VGFyZ2V0RnJvbVRyaXBsZShjb25zdCBjaGFyKiBUcmlwbGUsIExMVk1UYXJnZXRSZWYgKlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqRXJyb3JNZXNzYWdlKTsKKworLyoqIFJldHVybnMgdGhlIG5hbWUgb2YgYSB0YXJnZXQuIFNlZSBsbHZtOjpUYXJnZXQ6OmdldE5hbWUgKi8KK2NvbnN0IGNoYXIgKkxMVk1HZXRUYXJnZXROYW1lKExMVk1UYXJnZXRSZWYgVCk7CisKKy8qKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiAgb2YgYSB0YXJnZXQuIFNlZSBsbHZtOjpUYXJnZXQ6OmdldERlc2NyaXB0aW9uICovCitjb25zdCBjaGFyICpMTFZNR2V0VGFyZ2V0RGVzY3JpcHRpb24oTExWTVRhcmdldFJlZiBUKTsKKworLyoqIFJldHVybnMgaWYgdGhlIHRhcmdldCBoYXMgYSBKSVQgKi8KK0xMVk1Cb29sIExMVk1UYXJnZXRIYXNKSVQoTExWTVRhcmdldFJlZiBUKTsKKworLyoqIFJldHVybnMgaWYgdGhlIHRhcmdldCBoYXMgYSBUYXJnZXRNYWNoaW5lIGFzc29jaWF0ZWQgKi8KK0xMVk1Cb29sIExMVk1UYXJnZXRIYXNUYXJnZXRNYWNoaW5lKExMVk1UYXJnZXRSZWYgVCk7CisKKy8qKiBSZXR1cm5zIGlmIHRoZSB0YXJnZXQgYXMgYW4gQVNNIGJhY2tlbmQgKHJlcXVpcmVkIGZvciBlbWl0dGluZyBvdXRwdXQpICovCitMTFZNQm9vbCBMTFZNVGFyZ2V0SGFzQXNtQmFja2VuZChMTFZNVGFyZ2V0UmVmIFQpOworCisvKj09PS0tIFRhcmdldCBNYWNoaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworLyoqIENyZWF0ZXMgYSBuZXcgbGx2bTo6VGFyZ2V0TWFjaGluZS4gU2VlIGxsdm06OlRhcmdldDo6Y3JlYXRlVGFyZ2V0TWFjaGluZSAqLworTExWTVRhcmdldE1hY2hpbmVSZWYgTExWTUNyZWF0ZVRhcmdldE1hY2hpbmUoTExWTVRhcmdldFJlZiBULAorICBjb25zdCBjaGFyICpUcmlwbGUsIGNvbnN0IGNoYXIgKkNQVSwgY29uc3QgY2hhciAqRmVhdHVyZXMsCisgIExMVk1Db2RlR2VuT3B0TGV2ZWwgTGV2ZWwsIExMVk1SZWxvY01vZGUgUmVsb2MsIExMVk1Db2RlTW9kZWwgQ29kZU1vZGVsKTsKKworLyoqIERpc3Bvc2UgdGhlIExMVk1UYXJnZXRNYWNoaW5lUmVmIGluc3RhbmNlIGdlbmVyYXRlZCBieQorICBMTFZNQ3JlYXRlVGFyZ2V0TWFjaGluZS4gKi8KK3ZvaWQgTExWTURpc3Bvc2VUYXJnZXRNYWNoaW5lKExMVk1UYXJnZXRNYWNoaW5lUmVmIFQpOworCisvKiogUmV0dXJucyB0aGUgVGFyZ2V0IHVzZWQgaW4gYSBUYXJnZXRNYWNoaW5lICovCitMTFZNVGFyZ2V0UmVmIExMVk1HZXRUYXJnZXRNYWNoaW5lVGFyZ2V0KExMVk1UYXJnZXRNYWNoaW5lUmVmIFQpOworCisvKiogUmV0dXJucyB0aGUgdHJpcGxlIHVzZWQgY3JlYXRpbmcgdGhpcyB0YXJnZXQgbWFjaGluZS4gU2VlCisgIGxsdm06OlRhcmdldE1hY2hpbmU6OmdldFRyaXBsZS4gVGhlIHJlc3VsdCBuZWVkcyB0byBiZSBkaXNwb3NlZCB3aXRoCisgIExMVk1EaXNwb3NlTWVzc2FnZS4gKi8KK2NoYXIgKkxMVk1HZXRUYXJnZXRNYWNoaW5lVHJpcGxlKExMVk1UYXJnZXRNYWNoaW5lUmVmIFQpOworCisvKiogUmV0dXJucyB0aGUgY3B1IHVzZWQgY3JlYXRpbmcgdGhpcyB0YXJnZXQgbWFjaGluZS4gU2VlCisgIGxsdm06OlRhcmdldE1hY2hpbmU6OmdldENQVS4gVGhlIHJlc3VsdCBuZWVkcyB0byBiZSBkaXNwb3NlZCB3aXRoCisgIExMVk1EaXNwb3NlTWVzc2FnZS4gKi8KK2NoYXIgKkxMVk1HZXRUYXJnZXRNYWNoaW5lQ1BVKExMVk1UYXJnZXRNYWNoaW5lUmVmIFQpOworCisvKiogUmV0dXJucyB0aGUgZmVhdHVyZSBzdHJpbmcgdXNlZCBjcmVhdGluZyB0aGlzIHRhcmdldCBtYWNoaW5lLiBTZWUKKyAgbGx2bTo6VGFyZ2V0TWFjaGluZTo6Z2V0RmVhdHVyZVN0cmluZy4gVGhlIHJlc3VsdCBuZWVkcyB0byBiZSBkaXNwb3NlZCB3aXRoCisgIExMVk1EaXNwb3NlTWVzc2FnZS4gKi8KK2NoYXIgKkxMVk1HZXRUYXJnZXRNYWNoaW5lRmVhdHVyZVN0cmluZyhMTFZNVGFyZ2V0TWFjaGluZVJlZiBUKTsKKworLyoqIENyZWF0ZSBhIERhdGFMYXlvdXQgYmFzZWQgb24gdGhlIHRhcmdldE1hY2hpbmUuICovCitMTFZNVGFyZ2V0RGF0YVJlZiBMTFZNQ3JlYXRlVGFyZ2V0RGF0YUxheW91dChMTFZNVGFyZ2V0TWFjaGluZVJlZiBUKTsKKworLyoqIFNldCB0aGUgdGFyZ2V0IG1hY2hpbmUncyBBU00gdmVyYm9zaXR5LiAqLwordm9pZCBMTFZNU2V0VGFyZ2V0TWFjaGluZUFzbVZlcmJvc2l0eShMTFZNVGFyZ2V0TWFjaGluZVJlZiBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQm9vbCBWZXJib3NlQXNtKTsKKworLyoqIEVtaXRzIGFuIGFzbSBvciBvYmplY3QgZmlsZSBmb3IgdGhlIGdpdmVuIG1vZHVsZSB0byB0aGUgZmlsZW5hbWUuIFRoaXMKKyAgd3JhcHMgc2V2ZXJhbCBjKysgb25seSBjbGFzc2VzIChhbW9uZyB0aGVtIGEgZmlsZSBzdHJlYW0pLiBSZXR1cm5zIGFueQorICBlcnJvciBpbiBFcnJvck1lc3NhZ2UuIFVzZSBMTFZNRGlzcG9zZU1lc3NhZ2UgdG8gZGlzcG9zZSB0aGUgbWVzc2FnZS4gKi8KK0xMVk1Cb29sIExMVk1UYXJnZXRNYWNoaW5lRW1pdFRvRmlsZShMTFZNVGFyZ2V0TWFjaGluZVJlZiBULCBMTFZNTW9kdWxlUmVmIE0sCisgIGNoYXIgKkZpbGVuYW1lLCBMTFZNQ29kZUdlbkZpbGVUeXBlIGNvZGVnZW4sIGNoYXIgKipFcnJvck1lc3NhZ2UpOworCisvKiogQ29tcGlsZSB0aGUgTExWTSBJUiBzdG9yZWQgaW4gXHAgTSBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiBccCBPdXRNZW1CdWYuICovCitMTFZNQm9vbCBMTFZNVGFyZ2V0TWFjaGluZUVtaXRUb01lbW9yeUJ1ZmZlcihMTFZNVGFyZ2V0TWFjaGluZVJlZiBULCBMTFZNTW9kdWxlUmVmIE0sCisgIExMVk1Db2RlR2VuRmlsZVR5cGUgY29kZWdlbiwgY2hhcioqIEVycm9yTWVzc2FnZSwgTExWTU1lbW9yeUJ1ZmZlclJlZiAqT3V0TWVtQnVmKTsKKworLyo9PT0tLSBUcmlwbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKy8qKiBHZXQgYSB0cmlwbGUgZm9yIHRoZSBob3N0IG1hY2hpbmUgYXMgYSBzdHJpbmcuIFRoZSByZXN1bHQgbmVlZHMgdG8gYmUKKyAgZGlzcG9zZWQgd2l0aCBMTFZNRGlzcG9zZU1lc3NhZ2UuICovCitjaGFyKiBMTFZNR2V0RGVmYXVsdFRhcmdldFRyaXBsZSh2b2lkKTsKKworLyoqIEFkZHMgdGhlIHRhcmdldC1zcGVjaWZpYyBhbmFseXNpcyBwYXNzZXMgdG8gdGhlIHBhc3MgbWFuYWdlci4gKi8KK3ZvaWQgTExWTUFkZEFuYWx5c2lzUGFzc2VzKExMVk1UYXJnZXRNYWNoaW5lUmVmIFQsIExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL1RyYW5zZm9ybXMvSVBPLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvVHJhbnNmb3Jtcy9JUE8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzA1YjE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL1RyYW5zZm9ybXMvSVBPLmgKQEAgLTAsMCArMSw4NCBAQAorLyo9PT0tLSBJUE8uaCAtIEludGVycHJvY2VkdXJhbCBUcmFuc2Zvcm1hdGlvbnMgQyBJbnRlcmZhY2UgLS0tLS0qLSBDKysgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICp8Cit8KiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBoZWFkZXIgZGVjbGFyZXMgdGhlIEMgaW50ZXJmYWNlIHRvIGxpYkxMVk1JUE8uYSwgd2hpY2ggaW1wbGVtZW50cyAgICAgKnwKK3wqIHZhcmlvdXMgaW50ZXJwcm9jZWR1cmFsIHRyYW5zZm9ybWF0aW9ucyBvZiB0aGUgTExWTSBJUi4gICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX0NfVFJBTlNGT1JNU19JUE9fSAorI2RlZmluZSBMTFZNX0NfVFJBTlNGT1JNU19JUE9fSAorCisjaW5jbHVkZSAibGx2bS1jL1R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNUcmFuc2Zvcm1zSVBPIEludGVycHJvY2VkdXJhbCB0cmFuc2Zvcm1hdGlvbnMKKyAqIEBpbmdyb3VwIExMVk1DVHJhbnNmb3JtcworICoKKyAqIEB7CisgKi8KKworLyoqIFNlZSBsbHZtOjpjcmVhdGVBcmd1bWVudFByb21vdGlvblBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRBcmd1bWVudFByb21vdGlvblBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVDb25zdGFudE1lcmdlUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZENvbnN0YW50TWVyZ2VQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlQ2FsbGVkVmFsdWVQcm9wYWdhdGlvblBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRDYWxsZWRWYWx1ZVByb3BhZ2F0aW9uUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZURlYWRBcmdFbGltaW5hdGlvblBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGREZWFkQXJnRWxpbWluYXRpb25QYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlRnVuY3Rpb25BdHRyc1Bhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRGdW5jdGlvbkF0dHJzUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZUZ1bmN0aW9uSW5saW5pbmdQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkRnVuY3Rpb25JbmxpbmluZ1Bhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVBbHdheXNJbmxpbmVyUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZEFsd2F5c0lubGluZXJQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlR2xvYmFsRENFUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZEdsb2JhbERDRVBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVHbG9iYWxPcHRpbWl6ZXJQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkR2xvYmFsT3B0aW1pemVyUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZUlQQ29uc3RhbnRQcm9wYWdhdGlvblBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRJUENvbnN0YW50UHJvcGFnYXRpb25QYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlUHJ1bmVFSFBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRQcnVuZUVIUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZUlQU0NDUFBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRJUFNDQ1BQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlSW50ZXJuYWxpemVQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkSW50ZXJuYWxpemVQYXNzKExMVk1QYXNzTWFuYWdlclJlZiwgdW5zaWduZWQgQWxsQnV0TWFpbik7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlU3RyaXBEZWFkUHJvdG90eXBlc1Bhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRTdHJpcERlYWRQcm90b3R5cGVzUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZVN0cmlwU3ltYm9sc1Bhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRTdHJpcFN5bWJvbHNQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKgorICogQH0KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9UcmFuc2Zvcm1zL1Bhc3NNYW5hZ2VyQnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL1RyYW5zZm9ybXMvUGFzc01hbmFnZXJCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk3ODZiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9UcmFuc2Zvcm1zL1Bhc3NNYW5hZ2VyQnVpbGRlci5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qPT09LS0gbGx2bS1jL1RyYW5zZm9ybS9QYXNzTWFuYWdlckJ1aWxkZXIuaCAtIFBNQiBDIEludGVyZmFjZSAtLS0qLSBDIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqfAorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgaGVhZGVyIGRlY2xhcmVzIHRoZSBDIGludGVyZmFjZSB0byB0aGUgUGFzc01hbmFnZXJCdWlsZGVyIGNsYXNzLiAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX0NfVFJBTlNGT1JNU19QQVNTTUFOQUdFUkJVSUxERVJfSAorI2RlZmluZSBMTFZNX0NfVFJBTlNGT1JNU19QQVNTTUFOQUdFUkJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS1jL1R5cGVzLmgiCisKK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVQYXNzTWFuYWdlckJ1aWxkZXIgKkxMVk1QYXNzTWFuYWdlckJ1aWxkZXJSZWY7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNUcmFuc2Zvcm1zUGFzc01hbmFnZXJCdWlsZGVyIFBhc3MgbWFuYWdlciBidWlsZGVyCisgKiBAaW5ncm91cCBMTFZNQ1RyYW5zZm9ybXMKKyAqCisgKiBAeworICovCisKKy8qKiBTZWUgbGx2bTo6UGFzc01hbmFnZXJCdWlsZGVyLiAqLworTExWTVBhc3NNYW5hZ2VyQnVpbGRlclJlZiBMTFZNUGFzc01hbmFnZXJCdWlsZGVyQ3JlYXRlKHZvaWQpOwordm9pZCBMTFZNUGFzc01hbmFnZXJCdWlsZGVyRGlzcG9zZShMTFZNUGFzc01hbmFnZXJCdWlsZGVyUmVmIFBNQik7CisKKy8qKiBTZWUgbGx2bTo6UGFzc01hbmFnZXJCdWlsZGVyOjpPcHRMZXZlbC4gKi8KK3ZvaWQKK0xMVk1QYXNzTWFuYWdlckJ1aWxkZXJTZXRPcHRMZXZlbChMTFZNUGFzc01hbmFnZXJCdWlsZGVyUmVmIFBNQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcHRMZXZlbCk7CisKKy8qKiBTZWUgbGx2bTo6UGFzc01hbmFnZXJCdWlsZGVyOjpTaXplTGV2ZWwuICovCit2b2lkCitMTFZNUGFzc01hbmFnZXJCdWlsZGVyU2V0U2l6ZUxldmVsKExMVk1QYXNzTWFuYWdlckJ1aWxkZXJSZWYgUE1CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTaXplTGV2ZWwpOworCisvKiogU2VlIGxsdm06OlBhc3NNYW5hZ2VyQnVpbGRlcjo6RGlzYWJsZVVuaXRBdEFUaW1lLiAqLwordm9pZAorTExWTVBhc3NNYW5hZ2VyQnVpbGRlclNldERpc2FibGVVbml0QXRBVGltZShMTFZNUGFzc01hbmFnZXJCdWlsZGVyUmVmIFBNQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUJvb2wgVmFsdWUpOworCisvKiogU2VlIGxsdm06OlBhc3NNYW5hZ2VyQnVpbGRlcjo6RGlzYWJsZVVucm9sbExvb3BzLiAqLwordm9pZAorTExWTVBhc3NNYW5hZ2VyQnVpbGRlclNldERpc2FibGVVbnJvbGxMb29wcyhMTFZNUGFzc01hbmFnZXJCdWlsZGVyUmVmIFBNQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUJvb2wgVmFsdWUpOworCisvKiogU2VlIGxsdm06OlBhc3NNYW5hZ2VyQnVpbGRlcjo6RGlzYWJsZVNpbXBsaWZ5TGliQ2FsbHMgKi8KK3ZvaWQKK0xMVk1QYXNzTWFuYWdlckJ1aWxkZXJTZXREaXNhYmxlU2ltcGxpZnlMaWJDYWxscyhMTFZNUGFzc01hbmFnZXJCdWlsZGVyUmVmIFBNQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQm9vbCBWYWx1ZSk7CisKKy8qKiBTZWUgbGx2bTo6UGFzc01hbmFnZXJCdWlsZGVyOjpJbmxpbmVyLiAqLwordm9pZAorTExWTVBhc3NNYW5hZ2VyQnVpbGRlclVzZUlubGluZXJXaXRoVGhyZXNob2xkKExMVk1QYXNzTWFuYWdlckJ1aWxkZXJSZWYgUE1CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFRocmVzaG9sZCk7CisKKy8qKiBTZWUgbGx2bTo6UGFzc01hbmFnZXJCdWlsZGVyOjpwb3B1bGF0ZUZ1bmN0aW9uUGFzc01hbmFnZXIuICovCit2b2lkCitMTFZNUGFzc01hbmFnZXJCdWlsZGVyUG9wdWxhdGVGdW5jdGlvblBhc3NNYW5hZ2VyKExMVk1QYXNzTWFuYWdlckJ1aWxkZXJSZWYgUE1CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OlBhc3NNYW5hZ2VyQnVpbGRlcjo6cG9wdWxhdGVNb2R1bGVQYXNzTWFuYWdlci4gKi8KK3ZvaWQKK0xMVk1QYXNzTWFuYWdlckJ1aWxkZXJQb3B1bGF0ZU1vZHVsZVBhc3NNYW5hZ2VyKExMVk1QYXNzTWFuYWdlckJ1aWxkZXJSZWYgUE1CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpQYXNzTWFuYWdlckJ1aWxkZXI6OnBvcHVsYXRlTFRPUGFzc01hbmFnZXIuICovCit2b2lkIExMVk1QYXNzTWFuYWdlckJ1aWxkZXJQb3B1bGF0ZUxUT1Bhc3NNYW5hZ2VyKExMVk1QYXNzTWFuYWdlckJ1aWxkZXJSZWYgUE1CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNUGFzc01hbmFnZXJSZWYgUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Cb29sIEludGVybmFsaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQm9vbCBSdW5JbmxpbmVyKTsKKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL1RyYW5zZm9ybXMvU2NhbGFyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvVHJhbnNmb3Jtcy9TY2FsYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODI4ODEzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL1RyYW5zZm9ybXMvU2NhbGFyLmgKQEAgLTAsMCArMSwxNTggQEAKKy8qPT09LS0gU2NhbGFyLmggLSBTY2FsYXIgVHJhbnNmb3JtYXRpb24gTGlicmFyeSBDIEludGVyZmFjZSAtLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqfAorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgaGVhZGVyIGRlY2xhcmVzIHRoZSBDIGludGVyZmFjZSB0byBsaWJMTFZNU2NhbGFyT3B0cy5hLCB3aGljaCAgICAgICAgICp8Cit8KiBpbXBsZW1lbnRzIHZhcmlvdXMgc2NhbGFyIHRyYW5zZm9ybWF0aW9ucyBvZiB0aGUgTExWTSBJUi4gICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIE1hbnkgZXhvdGljIGxhbmd1YWdlcyBjYW4gaW50ZXJvcGVyYXRlIHdpdGggQyBjb2RlIGJ1dCBoYXZlIGEgaGFyZGVyIHRpbWUgICp8Cit8KiB3aXRoIEMrKyBkdWUgdG8gbmFtZSBtYW5nbGluZy4gU28gaW4gYWRkaXRpb24gdG8gQywgdGhpcyBpbnRlcmZhY2UgZW5hYmxlcyAqfAorfCogdG9vbHMgd3JpdHRlbiBpbiBzdWNoIGxhbmd1YWdlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIExMVk1fQ19UUkFOU0ZPUk1TX1NDQUxBUl9ICisjZGVmaW5lIExMVk1fQ19UUkFOU0ZPUk1TX1NDQUxBUl9ICisKKyNpbmNsdWRlICJsbHZtLWMvVHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ1RyYW5zZm9ybXNTY2FsYXIgU2NhbGFyIHRyYW5zZm9ybWF0aW9ucworICogQGluZ3JvdXAgTExWTUNUcmFuc2Zvcm1zCisgKgorICogQHsKKyAqLworCisvKiogU2VlIGxsdm06OmNyZWF0ZUFnZ3Jlc3NpdmVEQ0VQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkQWdncmVzc2l2ZURDRVBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVCaXRUcmFja2luZ0RDRVBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRCaXRUcmFja2luZ0RDRVBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVBbGlnbm1lbnRGcm9tQXNzdW1wdGlvbnNQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkQWxpZ25tZW50RnJvbUFzc3VtcHRpb25zUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZUNGR1NpbXBsaWZpY2F0aW9uUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZENGR1NpbXBsaWZpY2F0aW9uUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZURlYWRTdG9yZUVsaW1pbmF0aW9uUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZERlYWRTdG9yZUVsaW1pbmF0aW9uUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZVNjYWxhcml6ZXJQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkU2NhbGFyaXplclBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVNZXJnZWRMb2FkU3RvcmVNb3Rpb25QYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkTWVyZ2VkTG9hZFN0b3JlTW90aW9uUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZUdWTlBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRHVk5QYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlR1ZOUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZE5ld0dWTlBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVJbmRWYXJTaW1wbGlmeVBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRJbmRWYXJTaW1wbGlmeVBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVKdW1wVGhyZWFkaW5nUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZEp1bXBUaHJlYWRpbmdQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlTElDTVBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRMSUNNUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZUxvb3BEZWxldGlvblBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRMb29wRGVsZXRpb25QYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlTG9vcElkaW9tUGFzcyBmdW5jdGlvbiAqLwordm9pZCBMTFZNQWRkTG9vcElkaW9tUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZUxvb3BSb3RhdGVQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkTG9vcFJvdGF0ZVBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVMb29wUmVyb2xsUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZExvb3BSZXJvbGxQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlTG9vcFVucm9sbFBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRMb29wVW5yb2xsUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZUxvb3BVbnN3aXRjaFBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRMb29wVW5zd2l0Y2hQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlTWVtQ3B5T3B0UGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZE1lbUNweU9wdFBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVQYXJ0aWFsbHlJbmxpbmVMaWJDYWxsc1Bhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRQYXJ0aWFsbHlJbmxpbmVMaWJDYWxsc1Bhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVSZWFzc29jaWF0ZVBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRSZWFzc29jaWF0ZVBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVTQ0NQUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZFNDQ1BQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlU1JPQVBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRTY2FsYXJSZXBsQWdncmVnYXRlc1Bhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVTUk9BUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZFNjYWxhclJlcGxBZ2dyZWdhdGVzUGFzc1NTQShMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZVNST0FQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkU2NhbGFyUmVwbEFnZ3JlZ2F0ZXNQYXNzV2l0aFRocmVzaG9sZChMTFZNUGFzc01hbmFnZXJSZWYgUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBUaHJlc2hvbGQpOworCisvKiogU2VlIGxsdm06OmNyZWF0ZVNpbXBsaWZ5TGliQ2FsbHNQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkU2ltcGxpZnlMaWJDYWxsc1Bhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVUYWlsQ2FsbEVsaW1pbmF0aW9uUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZFRhaWxDYWxsRWxpbWluYXRpb25QYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlQ29uc3RhbnRQcm9wYWdhdGlvblBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRDb25zdGFudFByb3BhZ2F0aW9uUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmRlbW90ZVByb21vdGVNZW1vcnlUb1JlZ2lzdGVyUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZERlbW90ZU1lbW9yeVRvUmVnaXN0ZXJQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlVmVyaWZpZXJQYXNzIGZ1bmN0aW9uLiAqLwordm9pZCBMTFZNQWRkVmVyaWZpZXJQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlQ29ycmVsYXRlZFZhbHVlUHJvcGFnYXRpb25QYXNzIGZ1bmN0aW9uICovCit2b2lkIExMVk1BZGRDb3JyZWxhdGVkVmFsdWVQcm9wYWdhdGlvblBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVFYXJseUNTRVBhc3MgZnVuY3Rpb24gKi8KK3ZvaWQgTExWTUFkZEVhcmx5Q1NFUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZUVhcmx5Q1NFUGFzcyBmdW5jdGlvbiAqLwordm9pZCBMTFZNQWRkRWFybHlDU0VNZW1TU0FQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlTG93ZXJFeHBlY3RJbnRyaW5zaWNQYXNzIGZ1bmN0aW9uICovCit2b2lkIExMVk1BZGRMb3dlckV4cGVjdEludHJpbnNpY1Bhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVUeXBlQmFzZWRBbGlhc0FuYWx5c2lzUGFzcyBmdW5jdGlvbiAqLwordm9pZCBMTFZNQWRkVHlwZUJhc2VkQWxpYXNBbmFseXNpc1Bhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVTY29wZWROb0FsaWFzQUFQYXNzIGZ1bmN0aW9uICovCit2b2lkIExMVk1BZGRTY29wZWROb0FsaWFzQUFQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlQmFzaWNBbGlhc0FuYWx5c2lzUGFzcyBmdW5jdGlvbiAqLwordm9pZCBMTFZNQWRkQmFzaWNBbGlhc0FuYWx5c2lzUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogZGVmaW5lZChfX2NwbHVzcGx1cykgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtLWMvVHJhbnNmb3Jtcy9VdGlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL1RyYW5zZm9ybXMvVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTcxZjdmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL1RyYW5zZm9ybXMvVXRpbHMuaApAQCAtMCwwICsxLDUwIEBACisvKj09PS0tIFV0aWxzLmggLSBUcmFuc2Zvcm1hdGlvbiBVdGlscyBMaWJyYXJ5IEMgSW50ZXJmYWNlIC0tLS0tLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGhlYWRlciBkZWNsYXJlcyB0aGUgQyBpbnRlcmZhY2UgdG8gbGliTExWTVRyYW5zZm9ybVV0aWxzLmEsIHdoaWNoICAgICAqfAorfCogaW1wbGVtZW50cyB2YXJpb3VzIHRyYW5zZm9ybWF0aW9uIHV0aWxpdGllcyBvZiB0aGUgTExWTSBJUi4gICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBNYW55IGV4b3RpYyBsYW5ndWFnZXMgY2FuIGludGVyb3BlcmF0ZSB3aXRoIEMgY29kZSBidXQgaGF2ZSBhIGhhcmRlciB0aW1lICAqfAorfCogd2l0aCBDKysgZHVlIHRvIG5hbWUgbWFuZ2xpbmcuIFNvIGluIGFkZGl0aW9uIHRvIEMsIHRoaXMgaW50ZXJmYWNlIGVuYWJsZXMgKnwKK3wqIHRvb2xzIHdyaXR0ZW4gaW4gc3VjaCBsYW5ndWFnZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX0NfVFJBTlNGT1JNU19VVElMU19ICisjZGVmaW5lIExMVk1fQ19UUkFOU0ZPUk1TX1VUSUxTX0gKKworI2luY2x1ZGUgImxsdm0tYy9UeXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogQGRlZmdyb3VwIExMVk1DVHJhbnNmb3Jtc1V0aWxzIFRyYW5zZm9ybWF0aW9uIFV0aWxpdGllcworICogQGluZ3JvdXAgTExWTUNUcmFuc2Zvcm1zCisgKgorICogQHsKKyAqLworCisvKiogU2VlIGxsdm06OmNyZWF0ZUxvd2VyU3dpdGNoUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZExvd2VyU3dpdGNoUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKiogU2VlIGxsdm06OmNyZWF0ZVByb21vdGVNZW1vcnlUb1JlZ2lzdGVyUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZFByb21vdGVNZW1vcnlUb1JlZ2lzdGVyUGFzcyhMTFZNUGFzc01hbmFnZXJSZWYgUE0pOworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogZGVmaW5lZChfX2NwbHVzcGx1cykgKi8KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9UcmFuc2Zvcm1zL1ZlY3Rvcml6ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL1RyYW5zZm9ybXMvVmVjdG9yaXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y4MzA2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9UcmFuc2Zvcm1zL1ZlY3Rvcml6ZS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVmVjdG9yaXplLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0qLSBDIC0qLT09PSpcCit8Kj09PS0tLS0tLS0tLS0tIFZlY3Rvcml6YXRpb24gVHJhbnNmb3JtYXRpb24gTGlicmFyeSBDIEludGVyZmFjZSAtLS0tLS0tLS09PT0qfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGhlYWRlciBkZWNsYXJlcyB0aGUgQyBpbnRlcmZhY2UgdG8gbGliTExWTVZlY3Rvcml6ZS5hLCB3aGljaCAgICAgICAgICAqfAorfCogaW1wbGVtZW50cyB2YXJpb3VzIHZlY3Rvcml6YXRpb24gdHJhbnNmb3JtYXRpb25zIG9mIHRoZSBMTFZNIElSLiAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBNYW55IGV4b3RpYyBsYW5ndWFnZXMgY2FuIGludGVyb3BlcmF0ZSB3aXRoIEMgY29kZSBidXQgaGF2ZSBhIGhhcmRlciB0aW1lICAqfAorfCogd2l0aCBDKysgZHVlIHRvIG5hbWUgbWFuZ2xpbmcuIFNvIGluIGFkZGl0aW9uIHRvIEMsIHRoaXMgaW50ZXJmYWNlIGVuYWJsZXMgKnwKK3wqIHRvb2xzIHdyaXR0ZW4gaW4gc3VjaCBsYW5ndWFnZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX0NfVFJBTlNGT1JNU19WRUNUT1JJWkVfSAorI2RlZmluZSBMTFZNX0NfVFJBTlNGT1JNU19WRUNUT1JJWkVfSAorCisjaW5jbHVkZSAibGx2bS1jL1R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBAZGVmZ3JvdXAgTExWTUNUcmFuc2Zvcm1zVmVjdG9yaXplIFZlY3Rvcml6YXRpb24gdHJhbnNmb3JtYXRpb25zCisgKiBAaW5ncm91cCBMTFZNQ1RyYW5zZm9ybXMKKyAqCisgKiBAeworICovCisKKy8qKiBERVBSRUNBVEVEIC0gVXNlIExMVk1BZGRTTFBWZWN0b3JpemVQYXNzICovCit2b2lkIExMVk1BZGRCQlZlY3Rvcml6ZVBhc3MoTExWTVBhc3NNYW5hZ2VyUmVmIFBNKTsKKworLyoqIFNlZSBsbHZtOjpjcmVhdGVMb29wVmVjdG9yaXplUGFzcyBmdW5jdGlvbi4gKi8KK3ZvaWQgTExWTUFkZExvb3BWZWN0b3JpemVQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKiBTZWUgbGx2bTo6Y3JlYXRlU0xQVmVjdG9yaXplclBhc3MgZnVuY3Rpb24uICovCit2b2lkIExMVk1BZGRTTFBWZWN0b3JpemVQYXNzKExMVk1QYXNzTWFuYWdlclJlZiBQTSk7CisKKy8qKgorICogQH0KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9UeXBlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL1R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5MzQwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9UeXBlcy5oCkBAIC0wLDAgKzEsMTUwIEBACisvKj09PS0tIGxsdm0tYy9TdXBwb3J0LmggLSBDIEludGVyZmFjZSBUeXBlcyBkZWNsYXJhdGlvbnMgLS0tLS0tLS0tKi0gQyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgZGVmaW5lcyB0eXBlcyB1c2VkIGJ5IHRoZSBDIGludGVyZmFjZSB0byBMTFZNLiAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9DX1RZUEVTX0gKKyNkZWZpbmUgTExWTV9DX1RZUEVTX0gKKworI2luY2x1ZGUgImxsdm0tYy9EYXRhVHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIEBkZWZncm91cCBMTFZNQ1N1cHBvcnRUeXBlcyBUeXBlcyBhbmQgRW51bWVyYXRpb25zCisgKgorICogQHsKKyAqLworCit0eXBlZGVmIGludCBMTFZNQm9vbDsKKworLyogT3BhcXVlIHR5cGVzLiAqLworCisvKioKKyAqIExMVk0gdXNlcyBhIHBvbHltb3JwaGljIHR5cGUgaGllcmFyY2h5IHdoaWNoIEMgY2Fubm90IHJlcHJlc2VudCwgdGhlcmVmb3JlCisgKiBwYXJhbWV0ZXJzIG11c3QgYmUgcGFzc2VkIGFzIGJhc2UgdHlwZXMuIERlc3BpdGUgdGhlIGRlY2xhcmVkIHR5cGVzLCBtb3N0CisgKiBvZiB0aGUgZnVuY3Rpb25zIHByb3ZpZGVkIG9wZXJhdGUgb25seSBvbiBicmFuY2hlcyBvZiB0aGUgdHlwZSBoaWVyYXJjaHkuCisgKiBUaGUgZGVjbGFyZWQgcGFyYW1ldGVyIG5hbWVzIGFyZSBkZXNjcmlwdGl2ZSBhbmQgc3BlY2lmeSB3aGljaCB0eXBlIGlzCisgKiByZXF1aXJlZC4gQWRkaXRpb25hbGx5LCBlYWNoIHR5cGUgaGllcmFyY2h5IGlzIGRvY3VtZW50ZWQgYWxvbmcgd2l0aCB0aGUKKyAqIGZ1bmN0aW9ucyB0aGF0IG9wZXJhdGUgdXBvbiBpdC4gRm9yIG1vcmUgZGV0YWlsLCByZWZlciB0byBMTFZNJ3MgQysrIGNvZGUuCisgKiBJZiBpbiBkb3VidCwgcmVmZXIgdG8gQ29yZS5jcHAsIHdoaWNoIHBlcmZvcm1zIHBhcmFtZXRlciBkb3duY2FzdHMgaW4gdGhlCisgKiBmb3JtIHVud3JhcDxSZXF1aXJlZFR5cGU+KFBhcmFtKS4KKyAqLworCisvKioKKyAqIFVzZWQgdG8gcGFzcyByZWdpb25zIG9mIG1lbW9yeSB0aHJvdWdoIExMVk0gaW50ZXJmYWNlcy4KKyAqCisgKiBAc2VlIGxsdm06Ok1lbW9yeUJ1ZmZlcgorICovCit0eXBlZGVmIHN0cnVjdCBMTFZNT3BhcXVlTWVtb3J5QnVmZmVyICpMTFZNTWVtb3J5QnVmZmVyUmVmOworCisvKioKKyAqIFRoZSB0b3AtbGV2ZWwgY29udGFpbmVyIGZvciBhbGwgTExWTSBnbG9iYWwgZGF0YS4gU2VlIHRoZSBMTFZNQ29udGV4dCBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTExWTU9wYXF1ZUNvbnRleHQgKkxMVk1Db250ZXh0UmVmOworCisvKioKKyAqIFRoZSB0b3AtbGV2ZWwgY29udGFpbmVyIGZvciBhbGwgb3RoZXIgTExWTSBJbnRlcm1lZGlhdGUgUmVwcmVzZW50YXRpb24gKElSKQorICogb2JqZWN0cy4KKyAqCisgKiBAc2VlIGxsdm06Ok1vZHVsZQorICovCit0eXBlZGVmIHN0cnVjdCBMTFZNT3BhcXVlTW9kdWxlICpMTFZNTW9kdWxlUmVmOworCisvKioKKyAqIEVhY2ggdmFsdWUgaW4gdGhlIExMVk0gSVIgaGFzIGEgdHlwZSwgYW4gTExWTVR5cGVSZWYuCisgKgorICogQHNlZSBsbHZtOjpUeXBlCisgKi8KK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVUeXBlICpMTFZNVHlwZVJlZjsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgdmFsdWUgaW4gTExWTSBJUi4KKyAqCisgKiBUaGlzIG1vZGVscyBsbHZtOjpWYWx1ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTExWTU9wYXF1ZVZhbHVlICpMTFZNVmFsdWVSZWY7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGJhc2ljIGJsb2NrIG9mIGluc3RydWN0aW9ucyBpbiBMTFZNIElSLgorICoKKyAqIFRoaXMgbW9kZWxzIGxsdm06OkJhc2ljQmxvY2suCisgKi8KK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVCYXNpY0Jsb2NrICpMTFZNQmFzaWNCbG9ja1JlZjsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIExMVk0gTWV0YWRhdGEuCisgKgorICogVGhpcyBtb2RlbHMgbGx2bTo6TWV0YWRhdGEuCisgKi8KK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVNZXRhZGF0YSAqTExWTU1ldGFkYXRhUmVmOworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gTExWTSBiYXNpYyBibG9jayBidWlsZGVyLgorICoKKyAqIFRoaXMgbW9kZWxzIGxsdm06OklSQnVpbGRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTExWTU9wYXF1ZUJ1aWxkZXIgKkxMVk1CdWlsZGVyUmVmOworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gTExWTSBkZWJ1ZyBpbmZvIGJ1aWxkZXIuCisgKgorICogVGhpcyBtb2RlbHMgbGx2bTo6RElCdWlsZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBMTFZNT3BhcXVlRElCdWlsZGVyICpMTFZNRElCdWlsZGVyUmVmOworCisvKioKKyAqIEludGVyZmFjZSB1c2VkIHRvIHByb3ZpZGUgYSBtb2R1bGUgdG8gSklUIG9yIGludGVycHJldGVyLgorICogVGhpcyBpcyBub3cganVzdCBhIHN5bm9ueW0gZm9yIGxsdm06Ok1vZHVsZSwgYnV0IHdlIGhhdmUgdG8ga2VlcCB1c2luZyB0aGUKKyAqIGRpZmZlcmVudCB0eXBlIHRvIGtlZXAgYmluYXJ5IGNvbXBhdGliaWxpdHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVNb2R1bGVQcm92aWRlciAqTExWTU1vZHVsZVByb3ZpZGVyUmVmOworCisvKiogQHNlZSBsbHZtOjpQYXNzTWFuYWdlckJhc2UgKi8KK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVQYXNzTWFuYWdlciAqTExWTVBhc3NNYW5hZ2VyUmVmOworCisvKiogQHNlZSBsbHZtOjpQYXNzUmVnaXN0cnkgKi8KK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVQYXNzUmVnaXN0cnkgKkxMVk1QYXNzUmVnaXN0cnlSZWY7CisKKy8qKgorICogVXNlZCB0byBnZXQgdGhlIHVzZXJzIGFuZCB1c2VlcyBvZiBhIFZhbHVlLgorICoKKyAqIEBzZWUgbGx2bTo6VXNlICovCit0eXBlZGVmIHN0cnVjdCBMTFZNT3BhcXVlVXNlICpMTFZNVXNlUmVmOworCisvKioKKyAqIFVzZWQgdG8gcmVwcmVzZW50IGFuIGF0dHJpYnV0ZXMuCisgKgorICogQHNlZSBsbHZtOjpBdHRyaWJ1dGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgTExWTU9wYXF1ZUF0dHJpYnV0ZVJlZiAqTExWTUF0dHJpYnV0ZVJlZjsKKworLyoqCisgKiBAc2VlIGxsdm06OkRpYWdub3N0aWNJbmZvCisgKi8KK3R5cGVkZWYgc3RydWN0IExMVk1PcGFxdWVEaWFnbm9zdGljSW5mbyAqTExWTURpYWdub3N0aWNJbmZvUmVmOworCisvKioKKyAqIEBzZWUgbGx2bTo6Q29tZGF0CisgKi8KK3R5cGVkZWYgc3RydWN0IExMVk1Db21kYXQgKkxMVk1Db21kYXRSZWY7CisKKy8qKgorICogQH0KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9sdG8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0tYy9sdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWQxNzJkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS1jL2x0by5oCkBAIC0wLDAgKzEsODQ5IEBACisvKj09PS0tIGxsdm0tYy9sdG8uaCAtIExUTyBQdWJsaWMgQyBJbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGhlYWRlciBwcm92aWRlcyBwdWJsaWMgaW50ZXJmYWNlIHRvIGFuIGFic3RyYWN0IGxpbmsgdGltZSBvcHRpbWl6YXRpb24qfAorfCogbGlicmFyeS4gIExMVk0gcHJvdmlkZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UgZm9yIHVzZSB3aXRoICAgKnwKK3wqIGxsdm0gYml0Y29kZSBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX0NfTFRPX0gKKyNkZWZpbmUgTExWTV9DX0xUT19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPGNzdGRkZWY+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikKKyNpbmNsdWRlIDxzdGRib29sLmg+Cit0eXBlZGVmIGJvb2wgbHRvX2Jvb2xfdDsKKyNlbHNlCisvKiBNU1ZDIGluIHBhcnRpY3VsYXIgZG9lcyBub3QgaGF2ZSBhbnl0aGluZyBsaWtlIF9Cb29sIG9yIGJvb2wgaW4gQywgYnV0IHdlIGNhbgorICAgYXQgbGVhc3QgbWFrZSBzdXJlIHRoZSB0eXBlIGlzIHRoZSBzYW1lIHNpemUuICBUaGUgaW1wbGVtZW50YXRpb24gc2lkZSB3aWxsCisgICB1c2UgQysrIGJvb2wuICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgbHRvX2Jvb2xfdDsKKyNlbmRpZgorI2Vsc2UKK3R5cGVkZWYgYm9vbCBsdG9fYm9vbF90OworI2VuZGlmCisKKy8qKgorICogQGRlZmdyb3VwIExMVk1DTFRPIExUTworICogQGluZ3JvdXAgTExWTUMKKyAqCisgKiBAeworICovCisKKyNkZWZpbmUgTFRPX0FQSV9WRVJTSU9OIDIyCisKKy8qKgorICogXHNpbmNlIHByaW9yIHRvIExUT19BUElfVkVSU0lPTj0zCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgTFRPX1NZTUJPTF9BTElHTk1FTlRfTUFTSyAgICAgICAgICAgICAgPSAweDAwMDAwMDFGLCAvKiBsb2cyIG9mIGFsaWdubWVudCAqLworICAgIExUT19TWU1CT0xfUEVSTUlTU0lPTlNfTUFTSyAgICAgICAgICAgID0gMHgwMDAwMDBFMCwKKyAgICBMVE9fU1lNQk9MX1BFUk1JU1NJT05TX0NPREUgICAgICAgICAgICA9IDB4MDAwMDAwQTAsCisgICAgTFRPX1NZTUJPTF9QRVJNSVNTSU9OU19EQVRBICAgICAgICAgICAgPSAweDAwMDAwMEMwLAorICAgIExUT19TWU1CT0xfUEVSTUlTU0lPTlNfUk9EQVRBICAgICAgICAgID0gMHgwMDAwMDA4MCwKKyAgICBMVE9fU1lNQk9MX0RFRklOSVRJT05fTUFTSyAgICAgICAgICAgICA9IDB4MDAwMDA3MDAsCisgICAgTFRPX1NZTUJPTF9ERUZJTklUSU9OX1JFR1VMQVIgICAgICAgICAgPSAweDAwMDAwMTAwLAorICAgIExUT19TWU1CT0xfREVGSU5JVElPTl9URU5UQVRJVkUgICAgICAgID0gMHgwMDAwMDIwMCwKKyAgICBMVE9fU1lNQk9MX0RFRklOSVRJT05fV0VBSyAgICAgICAgICAgICA9IDB4MDAwMDAzMDAsCisgICAgTFRPX1NZTUJPTF9ERUZJTklUSU9OX1VOREVGSU5FRCAgICAgICAgPSAweDAwMDAwNDAwLAorICAgIExUT19TWU1CT0xfREVGSU5JVElPTl9XRUFLVU5ERUYgICAgICAgID0gMHgwMDAwMDUwMCwKKyAgICBMVE9fU1lNQk9MX1NDT1BFX01BU0sgICAgICAgICAgICAgICAgICA9IDB4MDAwMDM4MDAsCisgICAgTFRPX1NZTUJPTF9TQ09QRV9JTlRFUk5BTCAgICAgICAgICAgICAgPSAweDAwMDAwODAwLAorICAgIExUT19TWU1CT0xfU0NPUEVfSElEREVOICAgICAgICAgICAgICAgID0gMHgwMDAwMTAwMCwKKyAgICBMVE9fU1lNQk9MX1NDT1BFX1BST1RFQ1RFRCAgICAgICAgICAgICA9IDB4MDAwMDIwMDAsCisgICAgTFRPX1NZTUJPTF9TQ09QRV9ERUZBVUxUICAgICAgICAgICAgICAgPSAweDAwMDAxODAwLAorICAgIExUT19TWU1CT0xfU0NPUEVfREVGQVVMVF9DQU5fQkVfSElEREVOID0gMHgwMDAwMjgwMCwKKyAgICBMVE9fU1lNQk9MX0NPTURBVCAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDQwMDAsCisgICAgTFRPX1NZTUJPTF9BTElBUyAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA4MDAwCit9IGx0b19zeW1ib2xfYXR0cmlidXRlczsKKworLyoqCisgKiBcc2luY2UgcHJpb3IgdG8gTFRPX0FQSV9WRVJTSU9OPTMKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBMVE9fREVCVUdfTU9ERUxfTk9ORSAgICAgICAgID0gMCwKKyAgICBMVE9fREVCVUdfTU9ERUxfRFdBUkYgICAgICAgID0gMQorfSBsdG9fZGVidWdfbW9kZWw7CisKKy8qKgorICogXHNpbmNlIHByaW9yIHRvIExUT19BUElfVkVSU0lPTj0zCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgTFRPX0NPREVHRU5fUElDX01PREVMX1NUQVRJQyAgICAgICAgID0gMCwKKyAgICBMVE9fQ09ERUdFTl9QSUNfTU9ERUxfRFlOQU1JQyAgICAgICAgPSAxLAorICAgIExUT19DT0RFR0VOX1BJQ19NT0RFTF9EWU5BTUlDX05PX1BJQyA9IDIsCisgICAgTFRPX0NPREVHRU5fUElDX01PREVMX0RFRkFVTFQgICAgICAgID0gMworfSBsdG9fY29kZWdlbl9tb2RlbDsKKworLyoqIG9wYXF1ZSByZWZlcmVuY2UgdG8gYSBsb2FkZWQgb2JqZWN0IG1vZHVsZSAqLwordHlwZWRlZiBzdHJ1Y3QgTExWTU9wYXF1ZUxUT01vZHVsZSAqbHRvX21vZHVsZV90OworCisvKiogb3BhcXVlIHJlZmVyZW5jZSB0byBhIGNvZGUgZ2VuZXJhdG9yICovCit0eXBlZGVmIHN0cnVjdCBMTFZNT3BhcXVlTFRPQ29kZUdlbmVyYXRvciAqbHRvX2NvZGVfZ2VuX3Q7CisKKy8qKiBvcGFxdWUgcmVmZXJlbmNlIHRvIGEgdGhpbiBjb2RlIGdlbmVyYXRvciAqLwordHlwZWRlZiBzdHJ1Y3QgTExWTU9wYXF1ZVRoaW5MVE9Db2RlR2VuZXJhdG9yICp0aGlubHRvX2NvZGVfZ2VuX3Q7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBSZXR1cm5zIGEgcHJpbnRhYmxlIHN0cmluZy4KKyAqCisgKiBcc2luY2UgcHJpb3IgdG8gTFRPX0FQSV9WRVJTSU9OPTMKKyAqLworZXh0ZXJuIGNvbnN0IGNoYXIqCitsdG9fZ2V0X3ZlcnNpb24odm9pZCk7CisKKy8qKgorICogUmV0dXJucyB0aGUgbGFzdCBlcnJvciBzdHJpbmcgb3IgTlVMTCBpZiBsYXN0IG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAqCisgKiBcc2luY2UgcHJpb3IgdG8gTFRPX0FQSV9WRVJTSU9OPTMKKyAqLworZXh0ZXJuIGNvbnN0IGNoYXIqCitsdG9fZ2V0X2Vycm9yX21lc3NhZ2Uodm9pZCk7CisKKy8qKgorICogQ2hlY2tzIGlmIGEgZmlsZSBpcyBhIGxvYWRhYmxlIG9iamVjdCBmaWxlLgorICoKKyAqIFxzaW5jZSBwcmlvciB0byBMVE9fQVBJX1ZFUlNJT049MworICovCitleHRlcm4gbHRvX2Jvb2xfdAorbHRvX21vZHVsZV9pc19vYmplY3RfZmlsZShjb25zdCBjaGFyKiBwYXRoKTsKKworLyoqCisgKiBDaGVja3MgaWYgYSBmaWxlIGlzIGEgbG9hZGFibGUgb2JqZWN0IGNvbXBpbGVkIGZvciByZXF1ZXN0ZWQgdGFyZ2V0LgorICoKKyAqIFxzaW5jZSBwcmlvciB0byBMVE9fQVBJX1ZFUlNJT049MworICovCitleHRlcm4gbHRvX2Jvb2xfdAorbHRvX21vZHVsZV9pc19vYmplY3RfZmlsZV9mb3JfdGFyZ2V0KGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGFyZ2V0X3RyaXBsZV9wcmVmaXgpOworCisvKioKKyAqIFJldHVybiB0cnVlIGlmIFxwIEJ1ZmZlciBjb250YWlucyBhIGJpdGNvZGUgZmlsZSB3aXRoIE9iakMgY29kZSAoY2F0ZWdvcnkKKyAqIG9yIGNsYXNzKSBpbiBpdC4KKyAqCisgKiBcc2luY2UgTFRPX0FQSV9WRVJTSU9OPTIwCisgKi8KK2V4dGVybiBsdG9fYm9vbF90CitsdG9fbW9kdWxlX2hhc19vYmpjX2NhdGVnb3J5KGNvbnN0IHZvaWQgKm1lbSwgc2l6ZV90IGxlbmd0aCk7CisKKy8qKgorICogQ2hlY2tzIGlmIGEgYnVmZmVyIGlzIGEgbG9hZGFibGUgb2JqZWN0IGZpbGUuCisgKgorICogXHNpbmNlIHByaW9yIHRvIExUT19BUElfVkVSU0lPTj0zCisgKi8KK2V4dGVybiBsdG9fYm9vbF90IGx0b19tb2R1bGVfaXNfb2JqZWN0X2ZpbGVfaW5fbWVtb3J5KGNvbnN0IHZvaWQgKm1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpOworCisvKioKKyAqIENoZWNrcyBpZiBhIGJ1ZmZlciBpcyBhIGxvYWRhYmxlIG9iamVjdCBjb21waWxlZCBmb3IgcmVxdWVzdGVkIHRhcmdldC4KKyAqCisgKiBcc2luY2UgcHJpb3IgdG8gTFRPX0FQSV9WRVJTSU9OPTMKKyAqLworZXh0ZXJuIGx0b19ib29sX3QKK2x0b19tb2R1bGVfaXNfb2JqZWN0X2ZpbGVfaW5fbWVtb3J5X2Zvcl90YXJnZXQoY29uc3Qgdm9pZCogbWVtLCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRhcmdldF90cmlwbGVfcHJlZml4KTsKKworLyoqCisgKiBMb2FkcyBhbiBvYmplY3QgZmlsZSBmcm9tIGRpc2suCisgKiBSZXR1cm5zIE5VTEwgb24gZXJyb3IgKGNoZWNrIGx0b19nZXRfZXJyb3JfbWVzc2FnZSgpIGZvciBkZXRhaWxzKS4KKyAqCisgKiBcc2luY2UgcHJpb3IgdG8gTFRPX0FQSV9WRVJTSU9OPTMKKyAqLworZXh0ZXJuIGx0b19tb2R1bGVfdAorbHRvX21vZHVsZV9jcmVhdGUoY29uc3QgY2hhciogcGF0aCk7CisKKy8qKgorICogTG9hZHMgYW4gb2JqZWN0IGZpbGUgZnJvbSBtZW1vcnkuCisgKiBSZXR1cm5zIE5VTEwgb24gZXJyb3IgKGNoZWNrIGx0b19nZXRfZXJyb3JfbWVzc2FnZSgpIGZvciBkZXRhaWxzKS4KKyAqCisgKiBcc2luY2UgcHJpb3IgdG8gTFRPX0FQSV9WRVJTSU9OPTMKKyAqLworZXh0ZXJuIGx0b19tb2R1bGVfdAorbHRvX21vZHVsZV9jcmVhdGVfZnJvbV9tZW1vcnkoY29uc3Qgdm9pZCogbWVtLCBzaXplX3QgbGVuZ3RoKTsKKworLyoqCisgKiBMb2FkcyBhbiBvYmplY3QgZmlsZSBmcm9tIG1lbW9yeSB3aXRoIGFuIGV4dHJhIHBhdGggYXJndW1lbnQuCisgKiBSZXR1cm5zIE5VTEwgb24gZXJyb3IgKGNoZWNrIGx0b19nZXRfZXJyb3JfbWVzc2FnZSgpIGZvciBkZXRhaWxzKS4KKyAqCisgKiBcc2luY2UgTFRPX0FQSV9WRVJTSU9OPTkKKyAqLworZXh0ZXJuIGx0b19tb2R1bGVfdAorbHRvX21vZHVsZV9jcmVhdGVfZnJvbV9tZW1vcnlfd2l0aF9wYXRoKGNvbnN0IHZvaWQqIG1lbSwgc2l6ZV90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoKTsKKworLyoqCisgKiBcYnJpZWYgTG9hZHMgYW4gb2JqZWN0IGZpbGUgaW4gaXRzIG93biBjb250ZXh0LgorICoKKyAqIExvYWRzIGFuIG9iamVjdCBmaWxlIGluIGl0cyBvd24gTExWTUNvbnRleHQuICBUaGlzIGZ1bmN0aW9uIGNhbGwgaXMKKyAqIHRocmVhZC1zYWZlLiAgSG93ZXZlciwgbW9kdWxlcyBjcmVhdGVkIHRoaXMgd2F5IHNob3VsZCBub3QgYmUgbWVyZ2VkIGludG8gYW4KKyAqIGx0b19jb2RlX2dlbl90IHVzaW5nIFxhIGx0b19jb2RlZ2VuX2FkZF9tb2R1bGUoKS4KKyAqCisgKiBSZXR1cm5zIE5VTEwgb24gZXJyb3IgKGNoZWNrIGx0b19nZXRfZXJyb3JfbWVzc2FnZSgpIGZvciBkZXRhaWxzKS4KKyAqCisgKiBcc2luY2UgTFRPX0FQSV9WRVJTSU9OPTExCisgKi8KK2V4dGVybiBsdG9fbW9kdWxlX3QKK2x0b19tb2R1bGVfY3JlYXRlX2luX2xvY2FsX2NvbnRleHQoY29uc3Qgdm9pZCAqbWVtLCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoKTsKKworLyoqCisgKiBcYnJpZWYgTG9hZHMgYW4gb2JqZWN0IGZpbGUgaW4gdGhlIGNvZGVnZW4gY29udGV4dC4KKyAqCisgKiBMb2FkcyBhbiBvYmplY3QgZmlsZSBpbnRvIHRoZSBzYW1lIGNvbnRleHQgYXMgXGMgY2cuICBUaGUgbW9kdWxlIGlzIHNhZmUgdG8KKyAqIGFkZCB1c2luZyBcYSBsdG9fY29kZWdlbl9hZGRfbW9kdWxlKCkuCisgKgorICogUmV0dXJucyBOVUxMIG9uIGVycm9yIChjaGVjayBsdG9fZ2V0X2Vycm9yX21lc3NhZ2UoKSBmb3IgZGV0YWlscykuCisgKgorICogXHNpbmNlIExUT19BUElfVkVSU0lPTj0xMQorICovCitleHRlcm4gbHRvX21vZHVsZV90CitsdG9fbW9kdWxlX2NyZWF0ZV9pbl9jb2RlZ2VuX2NvbnRleHQoY29uc3Qgdm9pZCAqbWVtLCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGx0b19jb2RlX2dlbl90IGNnKTsKKworLyoqCisgKiBMb2FkcyBhbiBvYmplY3QgZmlsZSBmcm9tIGRpc2suIFRoZSBzZWVrIHBvaW50IG9mIGZkIGlzIG5vdCBwcmVzZXJ2ZWQuCisgKiBSZXR1cm5zIE5VTEwgb24gZXJyb3IgKGNoZWNrIGx0b19nZXRfZXJyb3JfbWVzc2FnZSgpIGZvciBkZXRhaWxzKS4KKyAqCisgKiBcc2luY2UgTFRPX0FQSV9WRVJTSU9OPTUKKyAqLworZXh0ZXJuIGx0b19tb2R1bGVfdAorbHRvX21vZHVsZV9jcmVhdGVfZnJvbV9mZChpbnQgZmQsIGNvbnN0IGNoYXIgKnBhdGgsIHNpemVfdCBmaWxlX3NpemUpOworCisvKioKKyAqIExvYWRzIGFuIG9iamVjdCBmaWxlIGZyb20gZGlzay4gVGhlIHNlZWsgcG9pbnQgb2YgZmQgaXMgbm90IHByZXNlcnZlZC4KKyAqIFJldHVybnMgTlVMTCBvbiBlcnJvciAoY2hlY2sgbHRvX2dldF9lcnJvcl9tZXNzYWdlKCkgZm9yIGRldGFpbHMpLgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049NQorICovCitleHRlcm4gbHRvX21vZHVsZV90CitsdG9fbW9kdWxlX2NyZWF0ZV9mcm9tX2ZkX2F0X29mZnNldChpbnQgZmQsIGNvbnN0IGNoYXIgKnBhdGgsIHNpemVfdCBmaWxlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWFwX3NpemUsIG9mZl90IG9mZnNldCk7CisKKy8qKgorICogRnJlZXMgYWxsIG1lbW9yeSBpbnRlcm5hbGx5IGFsbG9jYXRlZCBieSB0aGUgbW9kdWxlLgorICogVXBvbiByZXR1cm4gdGhlIGx0b19tb2R1bGVfdCBpcyBubyBsb25nZXIgdmFsaWQuCisgKgorICogXHNpbmNlIHByaW9yIHRvIExUT19BUElfVkVSU0lPTj0zCisgKi8KK2V4dGVybiB2b2lkCitsdG9fbW9kdWxlX2Rpc3Bvc2UobHRvX21vZHVsZV90IG1vZCk7CisKKy8qKgorICogUmV0dXJucyB0cmlwbGUgc3RyaW5nIHdoaWNoIHRoZSBvYmplY3QgbW9kdWxlIHdhcyBjb21waWxlZCB1bmRlci4KKyAqCisgKiBcc2luY2UgcHJpb3IgdG8gTFRPX0FQSV9WRVJTSU9OPTMKKyAqLworZXh0ZXJuIGNvbnN0IGNoYXIqCitsdG9fbW9kdWxlX2dldF90YXJnZXRfdHJpcGxlKGx0b19tb2R1bGVfdCBtb2QpOworCisvKioKKyAqIFNldHMgdHJpcGxlIHN0cmluZyB3aXRoIHdoaWNoIHRoZSBvYmplY3Qgd2lsbCBiZSBjb2RlZ2VuZWQuCisgKgorICogXHNpbmNlIExUT19BUElfVkVSU0lPTj00CisgKi8KK2V4dGVybiB2b2lkCitsdG9fbW9kdWxlX3NldF90YXJnZXRfdHJpcGxlKGx0b19tb2R1bGVfdCBtb2QsIGNvbnN0IGNoYXIgKnRyaXBsZSk7CisKKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gdGhlIG9iamVjdCBtb2R1bGUuCisgKgorICogXHNpbmNlIHByaW9yIHRvIExUT19BUElfVkVSU0lPTj0zCisgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQKK2x0b19tb2R1bGVfZ2V0X251bV9zeW1ib2xzKGx0b19tb2R1bGVfdCBtb2QpOworCisvKioKKyAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGl0aCBzeW1ib2wgaW4gdGhlIG9iamVjdCBtb2R1bGUuCisgKgorICogXHNpbmNlIHByaW9yIHRvIExUT19BUElfVkVSU0lPTj0zCisgKi8KK2V4dGVybiBjb25zdCBjaGFyKgorbHRvX21vZHVsZV9nZXRfc3ltYm9sX25hbWUobHRvX21vZHVsZV90IG1vZCwgdW5zaWduZWQgaW50IGluZGV4KTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBpdGggc3ltYm9sIGluIHRoZSBvYmplY3QgbW9kdWxlLgorICoKKyAqIFxzaW5jZSBwcmlvciB0byBMVE9fQVBJX1ZFUlNJT049MworICovCitleHRlcm4gbHRvX3N5bWJvbF9hdHRyaWJ1dGVzCitsdG9fbW9kdWxlX2dldF9zeW1ib2xfYXR0cmlidXRlKGx0b19tb2R1bGVfdCBtb2QsIHVuc2lnbmVkIGludCBpbmRleCk7CisKKy8qKgorICogUmV0dXJucyB0aGUgbW9kdWxlJ3MgbGlua2VyIG9wdGlvbnMuCisgKgorICogVGhlIGxpbmtlciBvcHRpb25zIG1heSBjb25zaXN0IG9mIG11bHRpcGxlIGZsYWdzLiBJdCBpcyB0aGUgbGlua2VyJ3MKKyAqIHJlc3BvbnNpYmlsaXR5IHRvIHNwbGl0IHRoZSBmbGFncyB1c2luZyBhIHBsYXRmb3JtLXNwZWNpZmljIG1lY2hhbmlzbS4KKyAqCisgKiBcc2luY2UgTFRPX0FQSV9WRVJTSU9OPTE2CisgKi8KK2V4dGVybiBjb25zdCBjaGFyKgorbHRvX21vZHVsZV9nZXRfbGlua2Vyb3B0cyhsdG9fbW9kdWxlX3QgbW9kKTsKKworLyoqCisgKiBEaWFnbm9zdGljIHNldmVyaXR5LgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049NworICovCit0eXBlZGVmIGVudW0geworICBMVE9fRFNfRVJST1IgPSAwLAorICBMVE9fRFNfV0FSTklORyA9IDEsCisgIExUT19EU19SRU1BUksgPSAzLCAvLyBBZGRlZCBpbiBMVE9fQVBJX1ZFUlNJT049MTAuCisgIExUT19EU19OT1RFID0gMgorfSBsdG9fY29kZWdlbl9kaWFnbm9zdGljX3NldmVyaXR5X3Q7CisKKy8qKgorICogRGlhZ25vc3RpYyBoYW5kbGVyIHR5cGUuCisgKiBccCBzZXZlcml0eSBkZWZpbmVzIHRoZSBzZXZlcml0eS4KKyAqIFxwIGRpYWcgaXMgdGhlIGFjdHVhbCBkaWFnbm9zdGljLgorICogVGhlIGRpYWdub3N0aWMgaXMgbm90IHByZWZpeGVkIGJ5IGFueSBvZiBzZXZlcml0eSBrZXl3b3JkLCBlLmcuLCAnZXJyb3I6ICcuCisgKiBccCBjdHh0IGlzIHVzZWQgdG8gcGFzcyB0aGUgY29udGV4dCBzZXQgd2l0aCB0aGUgZGlhZ25vc3RpYyBoYW5kbGVyLgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049NworICovCit0eXBlZGVmIHZvaWQgKCpsdG9fZGlhZ25vc3RpY19oYW5kbGVyX3QpKAorICAgIGx0b19jb2RlZ2VuX2RpYWdub3N0aWNfc2V2ZXJpdHlfdCBzZXZlcml0eSwgY29uc3QgY2hhciAqZGlhZywgdm9pZCAqY3R4dCk7CisKKy8qKgorICogU2V0IGEgZGlhZ25vc3RpYyBoYW5kbGVyIGFuZCB0aGUgcmVsYXRlZCBjb250ZXh0ICh2b2lkICopLgorICogVGhpcyBpcyBtb3JlIGdlbmVyYWwgdGhhbiBsdG9fZ2V0X2Vycm9yX21lc3NhZ2UsIGFzIHRoZSBkaWFnbm9zdGljIGhhbmRsZXIKKyAqIGNhbiBiZSBjYWxsZWQgYXQgYW55dGltZSB3aXRoaW4gbHRvLgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049NworICovCitleHRlcm4gdm9pZCBsdG9fY29kZWdlbl9zZXRfZGlhZ25vc3RpY19oYW5kbGVyKGx0b19jb2RlX2dlbl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdG9fZGlhZ25vc3RpY19oYW5kbGVyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKik7CisKKy8qKgorICogSW5zdGFudGlhdGVzIGEgY29kZSBnZW5lcmF0b3IuCisgKiBSZXR1cm5zIE5VTEwgb24gZXJyb3IgKGNoZWNrIGx0b19nZXRfZXJyb3JfbWVzc2FnZSgpIGZvciBkZXRhaWxzKS4KKyAqCisgKiBBbGwgbW9kdWxlcyBhZGRlZCB1c2luZyBcYSBsdG9fY29kZWdlbl9hZGRfbW9kdWxlKCkgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZAorICogaW4gdGhlIHNhbWUgY29udGV4dCBhcyB0aGUgY29kZWdlbi4KKyAqCisgKiBcc2luY2UgcHJpb3IgdG8gTFRPX0FQSV9WRVJTSU9OPTMKKyAqLworZXh0ZXJuIGx0b19jb2RlX2dlbl90CitsdG9fY29kZWdlbl9jcmVhdGUodm9pZCk7CisKKy8qKgorICogXGJyaWVmIEluc3RhbnRpYXRlIGEgY29kZSBnZW5lcmF0b3IgaW4gaXRzIG93biBjb250ZXh0LgorICoKKyAqIEluc3RhbnRpYXRlcyBhIGNvZGUgZ2VuZXJhdG9yIGluIGl0cyBvd24gY29udGV4dC4gIE1vZHVsZXMgYWRkZWQgdmlhIFxhCisgKiBsdG9fY29kZWdlbl9hZGRfbW9kdWxlKCkgbXVzdCBoYXZlIGFsbCBiZWVuIGNyZWF0ZWQgaW4gdGhlIHNhbWUgY29udGV4dCwKKyAqIHVzaW5nIFxhIGx0b19tb2R1bGVfY3JlYXRlX2luX2NvZGVnZW5fY29udGV4dCgpLgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049MTEKKyAqLworZXh0ZXJuIGx0b19jb2RlX2dlbl90CitsdG9fY29kZWdlbl9jcmVhdGVfaW5fbG9jYWxfY29udGV4dCh2b2lkKTsKKworLyoqCisgKiBGcmVlcyBhbGwgY29kZSBnZW5lcmF0b3IgYW5kIGFsbCBtZW1vcnkgaXQgaW50ZXJuYWxseSBhbGxvY2F0ZWQuCisgKiBVcG9uIHJldHVybiB0aGUgbHRvX2NvZGVfZ2VuX3QgaXMgbm8gbG9uZ2VyIHZhbGlkLgorICoKKyAqIFxzaW5jZSBwcmlvciB0byBMVE9fQVBJX1ZFUlNJT049MworICovCitleHRlcm4gdm9pZAorbHRvX2NvZGVnZW5fZGlzcG9zZShsdG9fY29kZV9nZW5fdCk7CisKKy8qKgorICogQWRkIGFuIG9iamVjdCBtb2R1bGUgdG8gdGhlIHNldCBvZiBtb2R1bGVzIGZvciB3aGljaCBjb2RlIHdpbGwgYmUgZ2VuZXJhdGVkLgorICogUmV0dXJucyB0cnVlIG9uIGVycm9yIChjaGVjayBsdG9fZ2V0X2Vycm9yX21lc3NhZ2UoKSBmb3IgZGV0YWlscykuCisgKgorICogXGMgY2cgYW5kIFxjIG1vZCBtdXN0IGJvdGggYmUgaW4gdGhlIHNhbWUgY29udGV4dC4gIFNlZSBcYQorICogbHRvX2NvZGVnZW5fY3JlYXRlX2luX2xvY2FsX2NvbnRleHQoKSBhbmQgXGEKKyAqIGx0b19tb2R1bGVfY3JlYXRlX2luX2NvZGVnZW5fY29udGV4dCgpLgorICoKKyAqIFxzaW5jZSBwcmlvciB0byBMVE9fQVBJX1ZFUlNJT049MworICovCitleHRlcm4gbHRvX2Jvb2xfdAorbHRvX2NvZGVnZW5fYWRkX21vZHVsZShsdG9fY29kZV9nZW5fdCBjZywgbHRvX21vZHVsZV90IG1vZCk7CisKKy8qKgorICogU2V0cyB0aGUgb2JqZWN0IG1vZHVsZSBmb3IgY29kZSBnZW5lcmF0aW9uLiBUaGlzIHdpbGwgdHJhbnNmZXIgdGhlIG93bmVyc2hpcAorICogb2YgdGhlIG1vZHVsZSB0byB0aGUgY29kZSBnZW5lcmF0b3IuCisgKgorICogXGMgY2cgYW5kIFxjIG1vZCBtdXN0IGJvdGggYmUgaW4gdGhlIHNhbWUgY29udGV4dC4KKyAqCisgKiBcc2luY2UgTFRPX0FQSV9WRVJTSU9OPTEzCisgKi8KK2V4dGVybiB2b2lkCitsdG9fY29kZWdlbl9zZXRfbW9kdWxlKGx0b19jb2RlX2dlbl90IGNnLCBsdG9fbW9kdWxlX3QgbW9kKTsKKworLyoqCisgKiBTZXRzIGlmIGRlYnVnIGluZm8gc2hvdWxkIGJlIGdlbmVyYXRlZC4KKyAqIFJldHVybnMgdHJ1ZSBvbiBlcnJvciAoY2hlY2sgbHRvX2dldF9lcnJvcl9tZXNzYWdlKCkgZm9yIGRldGFpbHMpLgorICoKKyAqIFxzaW5jZSBwcmlvciB0byBMVE9fQVBJX1ZFUlNJT049MworICovCitleHRlcm4gbHRvX2Jvb2xfdAorbHRvX2NvZGVnZW5fc2V0X2RlYnVnX21vZGVsKGx0b19jb2RlX2dlbl90IGNnLCBsdG9fZGVidWdfbW9kZWwpOworCisvKioKKyAqIFNldHMgd2hpY2ggUElDIGNvZGUgbW9kZWwgdG8gZ2VuZXJhdGVkLgorICogUmV0dXJucyB0cnVlIG9uIGVycm9yIChjaGVjayBsdG9fZ2V0X2Vycm9yX21lc3NhZ2UoKSBmb3IgZGV0YWlscykuCisgKgorICogXHNpbmNlIHByaW9yIHRvIExUT19BUElfVkVSU0lPTj0zCisgKi8KK2V4dGVybiBsdG9fYm9vbF90CitsdG9fY29kZWdlbl9zZXRfcGljX21vZGVsKGx0b19jb2RlX2dlbl90IGNnLCBsdG9fY29kZWdlbl9tb2RlbCk7CisKKy8qKgorICogU2V0cyB0aGUgY3B1IHRvIGdlbmVyYXRlIGNvZGUgZm9yLgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049NAorICovCitleHRlcm4gdm9pZAorbHRvX2NvZGVnZW5fc2V0X2NwdShsdG9fY29kZV9nZW5fdCBjZywgY29uc3QgY2hhciAqY3B1KTsKKworLyoqCisgKiBTZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgYXNzZW1ibGVyIHRvb2wgdG8gcnVuLiBJZiBub3Qgc2V0LCBsaWJMVE8KKyAqIHdpbGwgdXNlIGdjYyB0byBpbnZva2UgdGhlIGFzc2VtYmxlci4KKyAqCisgKiBcc2luY2UgTFRPX0FQSV9WRVJTSU9OPTMKKyAqLworZXh0ZXJuIHZvaWQKK2x0b19jb2RlZ2VuX3NldF9hc3NlbWJsZXJfcGF0aChsdG9fY29kZV9nZW5fdCBjZywgY29uc3QgY2hhciogcGF0aCk7CisKKy8qKgorICogU2V0cyBleHRyYSBhcmd1bWVudHMgdGhhdCBsaWJMVE8gc2hvdWxkIHBhc3MgdG8gdGhlIGFzc2VtYmxlci4KKyAqCisgKiBcc2luY2UgTFRPX0FQSV9WRVJTSU9OPTQKKyAqLworZXh0ZXJuIHZvaWQKK2x0b19jb2RlZ2VuX3NldF9hc3NlbWJsZXJfYXJncyhsdG9fY29kZV9nZW5fdCBjZywgY29uc3QgY2hhciAqKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5hcmdzKTsKKworLyoqCisgKiBBZGRzIHRvIGEgbGlzdCBvZiBhbGwgZ2xvYmFsIHN5bWJvbHMgdGhhdCBtdXN0IGV4aXN0IGluIHRoZSBmaW5hbCBnZW5lcmF0ZWQKKyAqIGNvZGUuIElmIGEgZnVuY3Rpb24gaXMgbm90IGxpc3RlZCB0aGVyZSwgaXQgbWlnaHQgYmUgaW5saW5lZCBpbnRvIGV2ZXJ5IHVzYWdlCisgKiBhbmQgb3B0aW1pemVkIGF3YXkuCisgKgorICogXHNpbmNlIHByaW9yIHRvIExUT19BUElfVkVSU0lPTj0zCisgKi8KK2V4dGVybiB2b2lkCitsdG9fY29kZWdlbl9hZGRfbXVzdF9wcmVzZXJ2ZV9zeW1ib2wobHRvX2NvZGVfZ2VuX3QgY2csIGNvbnN0IGNoYXIqIHN5bWJvbCk7CisKKy8qKgorICogV3JpdGVzIGEgbmV3IG9iamVjdCBmaWxlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCB0aGF0IGNvbnRhaW5zIHRoZQorICogbWVyZ2VkIGNvbnRlbnRzIG9mIGFsbCBtb2R1bGVzIGFkZGVkIHNvIGZhci4KKyAqIFJldHVybnMgdHJ1ZSBvbiBlcnJvciAoY2hlY2sgbHRvX2dldF9lcnJvcl9tZXNzYWdlKCkgZm9yIGRldGFpbHMpLgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049NQorICovCitleHRlcm4gbHRvX2Jvb2xfdAorbHRvX2NvZGVnZW5fd3JpdGVfbWVyZ2VkX21vZHVsZXMobHRvX2NvZGVfZ2VuX3QgY2csIGNvbnN0IGNoYXIqIHBhdGgpOworCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbGwgYWRkZWQgbW9kdWxlcyBpbnRvIG9uZSBuYXRpdmUgb2JqZWN0IGZpbGUuCisgKiBUaGlzIGNhbGxzIGx0b19jb2RlZ2VuX29wdGltaXplIHRoZW4gbHRvX2NvZGVnZW5fY29tcGlsZV9vcHRpbWl6ZWQuCisgKgorICogT24gc3VjY2VzcyByZXR1cm5zIGEgcG9pbnRlciB0byBhIGdlbmVyYXRlZCBtYWNoLW8vRUxGIGJ1ZmZlciBhbmQKKyAqIGxlbmd0aCBzZXQgdG8gdGhlIGJ1ZmZlciBzaXplLiAgVGhlIGJ1ZmZlciBpcyBvd25lZCBieSB0aGUKKyAqIGx0b19jb2RlX2dlbl90IGFuZCB3aWxsIGJlIGZyZWVkIHdoZW4gbHRvX2NvZGVnZW5fZGlzcG9zZSgpCisgKiBpcyBjYWxsZWQsIG9yIGx0b19jb2RlZ2VuX2NvbXBpbGUoKSBpcyBjYWxsZWQgYWdhaW4uCisgKiBPbiBmYWlsdXJlLCByZXR1cm5zIE5VTEwgKGNoZWNrIGx0b19nZXRfZXJyb3JfbWVzc2FnZSgpIGZvciBkZXRhaWxzKS4KKyAqCisgKiBcc2luY2UgcHJpb3IgdG8gTFRPX0FQSV9WRVJTSU9OPTMKKyAqLworZXh0ZXJuIGNvbnN0IHZvaWQqCitsdG9fY29kZWdlbl9jb21waWxlKGx0b19jb2RlX2dlbl90IGNnLCBzaXplX3QqIGxlbmd0aCk7CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFsbCBhZGRlZCBtb2R1bGVzIGludG8gb25lIG5hdGl2ZSBvYmplY3QgZmlsZS4KKyAqIFRoaXMgY2FsbHMgbHRvX2NvZGVnZW5fb3B0aW1pemUgdGhlbiBsdG9fY29kZWdlbl9jb21waWxlX29wdGltaXplZCAoaW5zdGVhZAorICogb2YgcmV0dXJuaW5nIGEgZ2VuZXJhdGVkIG1hY2gtby9FTEYgYnVmZmVyLCBpdCB3cml0ZXMgdG8gYSBmaWxlKS4KKyAqCisgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZSBpcyB3cml0dGVuIHRvIG5hbWUuIFJldHVybnMgdHJ1ZSBvbiBlcnJvci4KKyAqCisgKiBcc2luY2UgTFRPX0FQSV9WRVJTSU9OPTUKKyAqLworZXh0ZXJuIGx0b19ib29sX3QKK2x0b19jb2RlZ2VuX2NvbXBpbGVfdG9fZmlsZShsdG9fY29kZV9nZW5fdCBjZywgY29uc3QgY2hhcioqIG5hbWUpOworCisvKioKKyAqIFJ1bnMgb3B0aW1pemF0aW9uIGZvciB0aGUgbWVyZ2VkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9uIGVycm9yLgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049MTIKKyAqLworZXh0ZXJuIGx0b19ib29sX3QKK2x0b19jb2RlZ2VuX29wdGltaXplKGx0b19jb2RlX2dlbl90IGNnKTsKKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgdGhlIG9wdGltaXplZCBtZXJnZWQgbW9kdWxlIGludG8gb25lIG5hdGl2ZSBvYmplY3QgZmlsZS4KKyAqIEl0IHdpbGwgbm90IHJ1biBhbnkgSVIgb3B0aW1pemF0aW9ucyBvbiB0aGUgbWVyZ2VkIG1vZHVsZS4KKyAqCisgKiBPbiBzdWNjZXNzIHJldHVybnMgYSBwb2ludGVyIHRvIGEgZ2VuZXJhdGVkIG1hY2gtby9FTEYgYnVmZmVyIGFuZCBsZW5ndGggc2V0CisgKiB0byB0aGUgYnVmZmVyIHNpemUuICBUaGUgYnVmZmVyIGlzIG93bmVkIGJ5IHRoZSBsdG9fY29kZV9nZW5fdCBhbmQgd2lsbCBiZQorICogZnJlZWQgd2hlbiBsdG9fY29kZWdlbl9kaXNwb3NlKCkgaXMgY2FsbGVkLCBvcgorICogbHRvX2NvZGVnZW5fY29tcGlsZV9vcHRpbWl6ZWQoKSBpcyBjYWxsZWQgYWdhaW4uIE9uIGZhaWx1cmUsIHJldHVybnMgTlVMTAorICogKGNoZWNrIGx0b19nZXRfZXJyb3JfbWVzc2FnZSgpIGZvciBkZXRhaWxzKS4KKyAqCisgKiBcc2luY2UgTFRPX0FQSV9WRVJTSU9OPTEyCisgKi8KK2V4dGVybiBjb25zdCB2b2lkKgorbHRvX2NvZGVnZW5fY29tcGlsZV9vcHRpbWl6ZWQobHRvX2NvZGVfZ2VuX3QgY2csIHNpemVfdCogbGVuZ3RoKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBydW50aW1lIEFQSSB2ZXJzaW9uLgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049MTIKKyAqLworZXh0ZXJuIHVuc2lnbmVkIGludAorbHRvX2FwaV92ZXJzaW9uKHZvaWQpOworCisvKioKKyAqIFNldHMgb3B0aW9ucyB0byBoZWxwIGRlYnVnIGNvZGVnZW4gYnVncy4KKyAqCisgKiBcc2luY2UgcHJpb3IgdG8gTFRPX0FQSV9WRVJTSU9OPTMKKyAqLworZXh0ZXJuIHZvaWQKK2x0b19jb2RlZ2VuX2RlYnVnX29wdGlvbnMobHRvX2NvZGVfZ2VuX3QgY2csIGNvbnN0IGNoYXIgKik7CisKKy8qKgorICogSW5pdGlhbGl6ZXMgTExWTSBkaXNhc3NlbWJsZXJzLgorICogRklYTUU6IFRoaXMgZG9lc24ndCByZWFsbHkgYmVsb25nIGhlcmUuCisgKgorICogXHNpbmNlIExUT19BUElfVkVSU0lPTj01CisgKi8KK2V4dGVybiB2b2lkCitsdG9faW5pdGlhbGl6ZV9kaXNhc3NlbWJsZXIodm9pZCk7CisKKy8qKgorICogU2V0cyBpZiB3ZSBzaG91bGQgcnVuIGludGVybmFsaXplIHBhc3MgZHVyaW5nIG9wdGltaXphdGlvbiBhbmQgY29kZQorICogZ2VuZXJhdGlvbi4KKyAqCisgKiBcc2luY2UgTFRPX0FQSV9WRVJTSU9OPTE0CisgKi8KK2V4dGVybiB2b2lkCitsdG9fY29kZWdlbl9zZXRfc2hvdWxkX2ludGVybmFsaXplKGx0b19jb2RlX2dlbl90IGNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdG9fYm9vbF90IFNob3VsZEludGVybmFsaXplKTsKKworLyoqCisgKiBcYnJpZWYgU2V0IHdoZXRoZXIgdG8gZW1iZWQgdXNlbGlzdHMgaW4gYml0Y29kZS4KKyAqCisgKiBTZXRzIHdoZXRoZXIgXGEgbHRvX2NvZGVnZW5fd3JpdGVfbWVyZ2VkX21vZHVsZXMoKSBzaG91bGQgZW1iZWQgdXNlbGlzdHMgaW4KKyAqIG91dHB1dCBiaXRjb2RlLiAgVGhpcyBzaG91bGQgYmUgdHVybmVkIG9uIGZvciBhbGwgLXNhdmUtdGVtcHMgb3V0cHV0LgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049MTUKKyAqLworZXh0ZXJuIHZvaWQKK2x0b19jb2RlZ2VuX3NldF9zaG91bGRfZW1iZWRfdXNlbGlzdHMobHRvX2NvZGVfZ2VuX3QgY2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx0b19ib29sX3QgU2hvdWxkRW1iZWRVc2VsaXN0cyk7CisKKy8qKgorICogQH0gLy8gZW5kZ291cCBMTFZNQ0xUTworICogQGRlZmdyb3VwIExMVk1DVExUTyBUaGluTFRPCisgKiBAaW5ncm91cCBMTFZNQworICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBUeXBlIHRvIHdyYXAgYSBzaW5nbGUgb2JqZWN0IHJldHVybmVkIGJ5IFRoaW5MVE8uCisgKgorICogXHNpbmNlIExUT19BUElfVkVSU0lPTj0xOAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKkJ1ZmZlcjsKKyAgc2l6ZV90IFNpemU7Cit9IExUT09iamVjdEJ1ZmZlcjsKKworLyoqCisgKiBJbnN0YW50aWF0ZXMgYSBUaGluTFRPIGNvZGUgZ2VuZXJhdG9yLgorICogUmV0dXJucyBOVUxMIG9uIGVycm9yIChjaGVjayBsdG9fZ2V0X2Vycm9yX21lc3NhZ2UoKSBmb3IgZGV0YWlscykuCisgKgorICoKKyAqIFRoZSBUaGluTFRPQ29kZUdlbmVyYXRvciBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmV1c2UgZm9yIG11bHRpcGxlCisgKiBjb21waWxhdGlvbjogdGhlIG1vZGVsIGlzIHRoYXQgdGhlIGNsaWVudCBhZGRzIG1vZHVsZXMgdG8gdGhlIGdlbmVyYXRvciBhbmQKKyAqIGFzayB0byBwZXJmb3JtIHRoZSBUaGluTFRPIG9wdGltaXphdGlvbnMgLyBjb2RlZ2VuLCBhbmQgZmluYWxseSBkZXN0cm95cyB0aGUKKyAqIGNvZGVnZW5lcmF0b3IuCisgKgorICogXHNpbmNlIExUT19BUElfVkVSU0lPTj0xOAorICovCitleHRlcm4gdGhpbmx0b19jb2RlX2dlbl90IHRoaW5sdG9fY3JlYXRlX2NvZGVnZW4odm9pZCk7CisKKy8qKgorICogRnJlZXMgdGhlIGdlbmVyYXRvciBhbmQgYWxsIG1lbW9yeSBpdCBpbnRlcm5hbGx5IGFsbG9jYXRlZC4KKyAqIFVwb24gcmV0dXJuIHRoZSB0aGlubHRvX2NvZGVfZ2VuX3QgaXMgbm8gbG9uZ2VyIHZhbGlkLgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049MTgKKyAqLworZXh0ZXJuIHZvaWQgdGhpbmx0b19jb2RlZ2VuX2Rpc3Bvc2UodGhpbmx0b19jb2RlX2dlbl90IGNnKTsKKworLyoqCisgKiBBZGQgYSBtb2R1bGUgdG8gYSBUaGluTFRPIGNvZGUgZ2VuZXJhdG9yLiBJZGVudGlmaWVyIGhhcyB0byBiZSB1bmlxdWUgYW1vbmcKKyAqIGFsbCB0aGUgbW9kdWxlcyBpbiBhIGNvZGUgZ2VuZXJhdG9yLiBUaGUgZGF0YSBidWZmZXIgc3RheXMgb3duZWQgYnkgdGhlCisgKiBjbGllbnQsIGFuZCBpcyBleHBlY3RlZCB0byBiZSBhdmFpbGFibGUgZm9yIHRoZSBlbnRpcmUgbGlmZXRpbWUgb2YgdGhlCisgKiB0aGlubHRvX2NvZGVfZ2VuX3QgaXQgaXMgYWRkZWQgdG8uCisgKgorICogT24gZmFpbHVyZSwgcmV0dXJucyBOVUxMIChjaGVjayBsdG9fZ2V0X2Vycm9yX21lc3NhZ2UoKSBmb3IgZGV0YWlscykuCisgKgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049MTgKKyAqLworZXh0ZXJuIHZvaWQgdGhpbmx0b19jb2RlZ2VuX2FkZF9tb2R1bGUodGhpbmx0b19jb2RlX2dlbl90IGNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaWRlbnRpZmllciwgY29uc3QgY2hhciAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpOworCisvKioKKyAqIE9wdGltaXplIGFuZCBjb2RlZ2VuIGFsbCB0aGUgbW9kdWxlcyBhZGRlZCB0byB0aGUgY29kZWdlbmVyYXRvciB1c2luZworICogVGhpbkxUTy4gUmVzdWx0aW5nIG9iamVjdHMgYXJlIGFjY2Vzc2libGUgdXNpbmcgdGhpbmx0b19tb2R1bGVfZ2V0X29iamVjdCgpLgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049MTgKKyAqLworZXh0ZXJuIHZvaWQgdGhpbmx0b19jb2RlZ2VuX3Byb2Nlc3ModGhpbmx0b19jb2RlX2dlbl90IGNnKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2JqZWN0IGZpbGVzIHByb2R1Y2VkIGJ5IHRoZSBUaGluTFRPIENvZGVHZW5lcmF0b3IuCisgKgorICogSXQgdXN1YWxseSBtYXRjaGVzIHRoZSBudW1iZXIgb2YgaW5wdXQgZmlsZXMsIGJ1dCB0aGlzIGlzIG5vdCBhIGd1YXJhbnRlZSBvZgorICogdGhlIEFQSSBhbmQgbWF5IGNoYW5nZSBpbiBmdXR1cmUgaW1wbGVtZW50YXRpb24sIHNvIHRoZSBjbGllbnQgc2hvdWxkIG5vdAorICogYXNzdW1lIGl0LgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049MTgKKyAqLworZXh0ZXJuIHVuc2lnbmVkIGludCB0aGlubHRvX21vZHVsZV9nZXRfbnVtX29iamVjdHModGhpbmx0b19jb2RlX2dlbl90IGNnKTsKKworLyoqCisgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBpdGggb2JqZWN0IGZpbGUgcHJvZHVjZWQgYnkgdGhlIFRoaW5MVE8KKyAqIENvZGVHZW5lcmF0b3IuCisgKgorICogQ2xpZW50IHNob3VsZCB1c2UgXHAgdGhpbmx0b19tb2R1bGVfZ2V0X251bV9vYmplY3RzKCkgdG8gZ2V0IHRoZSBudW1iZXIgb2YKKyAqIGF2YWlsYWJsZSBvYmplY3RzLgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049MTgKKyAqLworZXh0ZXJuIExUT09iamVjdEJ1ZmZlciB0aGlubHRvX21vZHVsZV9nZXRfb2JqZWN0KHRoaW5sdG9fY29kZV9nZW5fdCBjZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXgpOworCisvKioKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBvYmplY3QgZmlsZXMgcHJvZHVjZWQgYnkgdGhlIFRoaW5MVE8gQ29kZUdlbmVyYXRvci4KKyAqCisgKiBJdCB1c3VhbGx5IG1hdGNoZXMgdGhlIG51bWJlciBvZiBpbnB1dCBmaWxlcywgYnV0IHRoaXMgaXMgbm90IGEgZ3VhcmFudGVlIG9mCisgKiB0aGUgQVBJIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiwgc28gdGhlIGNsaWVudCBzaG91bGQgbm90CisgKiBhc3N1bWUgaXQuCisgKgorICogXHNpbmNlIExUT19BUElfVkVSU0lPTj0yMQorICovCit1bnNpZ25lZCBpbnQgdGhpbmx0b19tb2R1bGVfZ2V0X251bV9vYmplY3RfZmlsZXModGhpbmx0b19jb2RlX2dlbl90IGNnKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBpdGggb2JqZWN0IGZpbGUgcHJvZHVjZWQgYnkgdGhlIFRoaW5MVE8KKyAqIENvZGVHZW5lcmF0b3IuCisgKgorICogQ2xpZW50IHNob3VsZCB1c2UgXHAgdGhpbmx0b19tb2R1bGVfZ2V0X251bV9vYmplY3RfZmlsZXMoKSB0byBnZXQgdGhlIG51bWJlcgorICogb2YgYXZhaWxhYmxlIG9iamVjdHMuCisgKgorICogXHNpbmNlIExUT19BUElfVkVSU0lPTj0yMQorICovCitjb25zdCBjaGFyICp0aGlubHRvX21vZHVsZV9nZXRfb2JqZWN0X2ZpbGUodGhpbmx0b19jb2RlX2dlbl90IGNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbmRleCk7CisKKy8qKgorICogU2V0cyB3aGljaCBQSUMgY29kZSBtb2RlbCB0byBnZW5lcmF0ZS4KKyAqIFJldHVybnMgdHJ1ZSBvbiBlcnJvciAoY2hlY2sgbHRvX2dldF9lcnJvcl9tZXNzYWdlKCkgZm9yIGRldGFpbHMpLgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049MTgKKyAqLworZXh0ZXJuIGx0b19ib29sX3QgdGhpbmx0b19jb2RlZ2VuX3NldF9waWNfbW9kZWwodGhpbmx0b19jb2RlX2dlbl90IGNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHRvX2NvZGVnZW5fbW9kZWwpOworCisvKioKKyAqIFNldHMgdGhlIHBhdGggdG8gYSBkaXJlY3RvcnkgdG8gdXNlIGFzIGEgc3RvcmFnZSBmb3IgdGVtcG9yYXJ5IGJpdGNvZGUgZmlsZXMuCisgKiBUaGUgaW50ZW50aW9uIGlzIHRvIG1ha2UgdGhlIGJpdGNvZGUgZmlsZXMgYXZhaWxhYmxlIGZvciBkZWJ1Z2dpbmcgYXQgdmFyaW91cworICogc3RhZ2Ugb2YgdGhlIHBpcGVsaW5lLgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049MTgKKyAqLworZXh0ZXJuIHZvaWQgdGhpbmx0b19jb2RlZ2VuX3NldF9zYXZldGVtcHNfZGlyKHRoaW5sdG9fY29kZV9nZW5fdCBjZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzYXZlX3RlbXBzX2Rpcik7CisKKy8qKgorICogU2V0IHRoZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdoZXJlIHRvIHNhdmUgZ2VuZXJhdGVkIG9iamVjdCBmaWxlcy4gVGhpcworICogcGF0aCBjYW4gYmUgdXNlZCBieSBhIGxpbmtlciB0byByZXF1ZXN0IG9uLWRpc2sgZmlsZXMgaW5zdGVhZCBvZiBpbi1tZW1vcnkKKyAqIGJ1ZmZlcnMuIFdoZW4gc2V0LCByZXN1bHRzIGFyZSBhdmFpbGFibGUgdGhyb3VnaAorICogdGhpbmx0b19tb2R1bGVfZ2V0X29iamVjdF9maWxlKCkgaW5zdGVhZCBvZiB0aGlubHRvX21vZHVsZV9nZXRfb2JqZWN0KCkuCisgKgorICogXHNpbmNlIExUT19BUElfVkVSU0lPTj0yMQorICovCit2b2lkIHRoaW5sdG9fc2V0X2dlbmVyYXRlZF9vYmplY3RzX2Rpcih0aGlubHRvX2NvZGVfZ2VuX3QgY2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzYXZlX3RlbXBzX2Rpcik7CisKKy8qKgorICogU2V0cyB0aGUgY3B1IHRvIGdlbmVyYXRlIGNvZGUgZm9yLgorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049MTgKKyAqLworZXh0ZXJuIHZvaWQgdGhpbmx0b19jb2RlZ2VuX3NldF9jcHUodGhpbmx0b19jb2RlX2dlbl90IGNnLCBjb25zdCBjaGFyICpjcHUpOworCisvKioKKyAqIERpc2FibGUgQ29kZUdlbiwgb25seSBydW4gdGhlIHN0YWdlcyB0aWxsIGNvZGVnZW4gYW5kIHN0b3AuIFRoZSBvdXRwdXQgd2lsbAorICogYmUgYml0Y29kZS4KKyAqCisgKiBcc2luY2UgTFRPX0FQSV9WRVJTSU9OPTE5CisgKi8KK2V4dGVybiB2b2lkIHRoaW5sdG9fY29kZWdlbl9kaXNhYmxlX2NvZGVnZW4odGhpbmx0b19jb2RlX2dlbl90IGNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdG9fYm9vbF90IGRpc2FibGUpOworCisvKioKKyAqIFBlcmZvcm0gQ29kZUdlbiBvbmx5OiBkaXNhYmxlIGFsbCBvdGhlciBzdGFnZXMuCisgKgorICogXHNpbmNlIExUT19BUElfVkVSU0lPTj0xOQorICovCitleHRlcm4gdm9pZCB0aGlubHRvX2NvZGVnZW5fc2V0X2NvZGVnZW5fb25seSh0aGlubHRvX2NvZGVfZ2VuX3QgY2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdG9fYm9vbF90IGNvZGVnZW5fb25seSk7CisKKy8qKgorICogUGFyc2UgLW1sbHZtIHN0eWxlIGRlYnVnIG9wdGlvbnMuCisgKgorICogXHNpbmNlIExUT19BUElfVkVSU0lPTj0xOAorICovCitleHRlcm4gdm9pZCB0aGlubHRvX2RlYnVnX29wdGlvbnMoY29uc3QgY2hhciAqY29uc3QgKm9wdGlvbnMsIGludCBudW1iZXIpOworCisvKioKKyAqIFRlc3QgaWYgYSBtb2R1bGUgaGFzIHN1cHBvcnQgZm9yIFRoaW5MVE8gbGlua2luZy4KKyAqCisgKiBcc2luY2UgTFRPX0FQSV9WRVJTSU9OPTE4CisgKi8KK2V4dGVybiBsdG9fYm9vbF90IGx0b19tb2R1bGVfaXNfdGhpbmx0byhsdG9fbW9kdWxlX3QgbW9kKTsKKworLyoqCisgKiBBZGRzIGEgc3ltYm9sIHRvIHRoZSBsaXN0IG9mIGdsb2JhbCBzeW1ib2xzIHRoYXQgbXVzdCBleGlzdCBpbiB0aGUgZmluYWwKKyAqIGdlbmVyYXRlZCBjb2RlLiBJZiBhIGZ1bmN0aW9uIGlzIG5vdCBsaXN0ZWQgdGhlcmUsIGl0IG1pZ2h0IGJlIGlubGluZWQgaW50bworICogZXZlcnkgdXNhZ2UgYW5kIG9wdGltaXplZCBhd2F5LiBGb3IgZXZlcnkgc2luZ2xlIG1vZHVsZSwgdGhlIGZ1bmN0aW9ucworICogcmVmZXJlbmNlZCBmcm9tIGNvZGUgb3V0c2lkZSBvZiB0aGUgVGhpbkxUTyBtb2R1bGVzIG5lZWQgdG8gYmUgYWRkZWQgaGVyZS4KKyAqCisgKiBcc2luY2UgTFRPX0FQSV9WRVJTSU9OPTE4CisgKi8KK2V4dGVybiB2b2lkIHRoaW5sdG9fY29kZWdlbl9hZGRfbXVzdF9wcmVzZXJ2ZV9zeW1ib2wodGhpbmx0b19jb2RlX2dlbl90IGNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKTsKKworLyoqCisgKiBBZGRzIGEgc3ltYm9sIHRvIHRoZSBsaXN0IG9mIGdsb2JhbCBzeW1ib2xzIHRoYXQgYXJlIGNyb3NzLXJlZmVyZW5jZWQgYmV0d2VlbgorICogVGhpbkxUTyBmaWxlcy4gSWYgdGhlIFRoaW5MVE8gQ29kZUdlbmVyYXRvciBjYW4gZW5zdXJlIHRoYXQgZXZlcnkKKyAqIHJlZmVyZW5jZXMgZnJvbSBhIFRoaW5MVE8gbW9kdWxlIHRvIHRoaXMgc3ltYm9sIGlzIG9wdGltaXplZCBhd2F5LCB0aGVuCisgKiB0aGUgc3ltYm9sIGNhbiBiZSBkaXNjYXJkZWQuCisgKgorICogXHNpbmNlIExUT19BUElfVkVSU0lPTj0xOAorICovCitleHRlcm4gdm9pZCB0aGlubHRvX2NvZGVnZW5fYWRkX2Nyb3NzX3JlZmVyZW5jZWRfc3ltYm9sKHRoaW5sdG9fY29kZV9nZW5fdCBjZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCk7CisKKy8qKgorICogQH0gLy8gZW5kZ291cCBMTFZNQ1RMVE8KKyAqIEBkZWZncm91cCBMTFZNQ1RMVE9fQ0FDSElORyBUaGluTFRPIENhY2hlIENvbnRyb2wKKyAqIEBpbmdyb3VwIExMVk1DVExUTworICoKKyAqIFRoZXNlIGVudHJ5IHBvaW50cyBjb250cm9sIHRoZSBUaGluTFRPIGNhY2hlLiBUaGUgY2FjaGUgaXMgaW50ZW5kZWQgdG8KKyAqIHN1cHBvcnQgaW5jcmVtZW50YWwgYnVpbGRzLCBhbmQgdGh1cyBuZWVkcyB0byBiZSBwZXJzaXN0ZW50IGFjcm9zcyBidWlsZHMuCisgKiBUaGUgY2xpZW50IGVuYWJsZXMgdGhlIGNhY2hlIGJ5IHN1cHBseWluZyBhIHBhdGggdG8gYW4gZXhpc3RpbmcgZGlyZWN0b3J5LgorICogVGhlIGNvZGUgZ2VuZXJhdG9yIHdpbGwgdXNlIHRoaXMgdG8gc3RvcmUgb2JqZWN0cyBmaWxlcyB0aGF0IG1heSBiZSByZXVzZWQKKyAqIGR1cmluZyBhIHN1YnNlcXVlbnQgYnVpbGQuCisgKiBUbyBhdm9pZCBmaWxsaW5nIHRoZSBkaXNrIHNwYWNlLCBhIGZldyBrbm9icyBhcmUgcHJvdmlkZWQ6CisgKiAgLSBUaGUgcHJ1bmluZyBpbnRlcnZhbCBsaW1pdHMgdGhlIGZyZXF1ZW5jeSBhdCB3aGljaCB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IKKyAqICAgIHdpbGwgdHJ5IHRvIHNjYW4gdGhlIGNhY2hlIGRpcmVjdG9yeSB0byBwcnVuZSBleHBpcmVkIGVudHJpZXMuCisgKiAgICBTZXR0aW5nIHRvIGEgbmVnYXRpdmUgbnVtYmVyIGRpc2FibGVzIHRoZSBwcnVuaW5nLgorICogIC0gVGhlIHBydW5pbmcgZXhwaXJhdGlvbiB0aW1lIGluZGljYXRlcyB0byB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgaG93IG9sZCBhbgorICogICAgZW50cnkgbmVlZHMgdG8gYmUgdG8gYmUgcmVtb3ZlZC4KKyAqICAtIEZpbmFsbHksIHRoZSBnYXJiYWdlIGNvbGxlY3RvciBjYW4gYmUgaW5zdHJ1Y3RlZCB0byBwcnVuZSB0aGUgY2FjaGUgdW50aWwKKyAqICAgIHRoZSBvY2N1cGllZCBzcGFjZSBnb2VzIGJlbG93IGEgdGhyZXNob2xkLgorICogQHsKKyAqLworCisvKioKKyAqIFNldHMgdGhlIHBhdGggdG8gYSBkaXJlY3RvcnkgdG8gdXNlIGFzIGEgY2FjaGUgc3RvcmFnZSBmb3IgaW5jcmVtZW50YWwgYnVpbGQuCisgKiBTZXR0aW5nIHRoaXMgYWN0aXZhdGVzIGNhY2hpbmcuCisgKgorICogXHNpbmNlIExUT19BUElfVkVSU0lPTj0xOAorICovCitleHRlcm4gdm9pZCB0aGlubHRvX2NvZGVnZW5fc2V0X2NhY2hlX2Rpcih0aGlubHRvX2NvZGVfZ2VuX3QgY2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjYWNoZV9kaXIpOworCisvKioKKyAqIFNldHMgdGhlIGNhY2hlIHBydW5pbmcgaW50ZXJ2YWwgKGluIHNlY29uZHMpLiBBIG5lZ2F0aXZlIHZhbHVlIGRpc2FibGVzIHRoZQorICogcHJ1bmluZy4gQW4gdW5zcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIGFwcGxpZWQsIGFuZCBhIHZhbHVlIG9mIDAgd2lsbAorICogZm9yY2UgcHJ1bm5pbmcgdG8gb2NjdXIuCisgKgorICogXHNpbmNlIExUT19BUElfVkVSU0lPTj0xOAorICovCitleHRlcm4gdm9pZCB0aGlubHRvX2NvZGVnZW5fc2V0X2NhY2hlX3BydW5pbmdfaW50ZXJ2YWwodGhpbmx0b19jb2RlX2dlbl90IGNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRlcnZhbCk7CisKKy8qKgorICogU2V0cyB0aGUgbWF4aW11bSBjYWNoZSBzaXplIHRoYXQgY2FuIGJlIHBlcnNpc3RlbnQgYWNyb3NzIGJ1aWxkLCBpbiB0ZXJtcyBvZgorICogcGVyY2VudGFnZSBvZiB0aGUgYXZhaWxhYmxlIHNwYWNlIG9uIHRoZSBkaXNrLiBTZXQgdG8gMTAwIHRvIGluZGljYXRlCisgKiBubyBsaW1pdCwgNTAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY2FjaGUgc2l6ZSB3aWxsIG5vdCBiZSBsZWZ0IG92ZXIgaGFsZiB0aGUKKyAqIGF2YWlsYWJsZSBzcGFjZS4gQSB2YWx1ZSBvdmVyIDEwMCB3aWxsIGJlIHJlZHVjZWQgdG8gMTAwLCBhIHZhbHVlIG9mIDAgd2lsbAorICogYmUgaWdub3JlZC4gQW4gdW5zcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIGFwcGxpZWQuCisgKgorICogVGhlIGZvcm11bGEgbG9va3MgbGlrZToKKyAqICBBdmFpbGFibGVTcGFjZSA9IEZyZWVTcGFjZSArIEV4aXN0aW5nQ2FjaGVTaXplCisgKiAgTmV3Q2FjaGVTaXplID0gQXZhaWxhYmxlU3BhY2UgKiBQLzEwMAorICoKKyAqIFxzaW5jZSBMVE9fQVBJX1ZFUlNJT049MTgKKyAqLworZXh0ZXJuIHZvaWQgdGhpbmx0b19jb2RlZ2VuX3NldF9maW5hbF9jYWNoZV9zaXplX3JlbGF0aXZlX3RvX2F2YWlsYWJsZV9zcGFjZSgKKyAgICB0aGlubHRvX2NvZGVfZ2VuX3QgY2csIHVuc2lnbmVkIHBlcmNlbnRhZ2UpOworCisvKioKKyAqIFNldHMgdGhlIGV4cGlyYXRpb24gKGluIHNlY29uZHMpIGZvciBhbiBlbnRyeSBpbiB0aGUgY2FjaGUuIEFuIHVuc3BlY2lmaWVkCisgKiBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgYXBwbGllZC4gQSB2YWx1ZSBvZiAwIHdpbGwgYmUgaWdub3JlZC4KKyAqCisgKiBcc2luY2UgTFRPX0FQSV9WRVJTSU9OPTE4CisgKi8KK2V4dGVybiB2b2lkIHRoaW5sdG9fY29kZWdlbl9zZXRfY2FjaGVfZW50cnlfZXhwaXJhdGlvbih0aGlubHRvX2NvZGVfZ2VuX3QgY2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZXhwaXJhdGlvbik7CisKKy8qKgorICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBkaXJlY3RvcnkgKGluIGJ5dGVzKS4gQSB2YWx1ZSBvdmVyIHRoZQorICogYW1vdW50IG9mIGF2YWlsYWJsZSBzcGFjZSBvbiB0aGUgZGlzayB3aWxsIGJlIHJlZHVjZWQgdG8gdGhlIGFtb3VudCBvZgorICogYXZhaWxhYmxlIHNwYWNlLiBBbiB1bnNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgYXBwbGllZC4gQSB2YWx1ZSBvZiAwCisgKiB3aWxsIGJlIGlnbm9yZWQuCisgKgorICogXHNpbmNlIExUT19BUElfVkVSU0lPTj0yMgorICovCitleHRlcm4gdm9pZCB0aGlubHRvX2NvZGVnZW5fc2V0X2NhY2hlX3NpemVfYnl0ZXModGhpbmx0b19jb2RlX2dlbl90IGNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1heF9zaXplX2J5dGVzKTsKKworLyoqCisgKiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlcyBpbiB0aGUgY2FjaGUgZGlyZWN0b3J5LiBBbiB1bnNwZWNpZmllZAorICogZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIGFwcGxpZWQuIEEgdmFsdWUgb2YgMCB3aWxsIGJlIGlnbm9yZWQuCisgKgorICogXHNpbmNlIExUT19BUElfVkVSU0lPTj0yMgorICovCitleHRlcm4gdm9pZCB0aGlubHRvX2NvZGVnZW5fc2V0X2NhY2hlX3NpemVfZmlsZXModGhpbmx0b19jb2RlX2dlbl90IGNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1heF9zaXplX2ZpbGVzKTsKKworCisKKy8qKgorICogQH0gLy8gZW5kZ3JvdXAgTExWTUNUTFRPX0NBQ0hJTkcKKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTExWTV9DX0xUT19IICovCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9BUEZsb2F0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9BUEZsb2F0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwYjZhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0FQRmxvYXQuaApAQCAtMCwwICsxLDEyNDkgQEAKKy8vPT09LSBsbHZtL0FEVC9BUEZsb2F0LmggLSBBcmJpdHJhcnkgUHJlY2lzaW9uIEZsb2F0aW5nIFBvaW50IC0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZgorLy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBhIGNsYXNzIHRvIHJlcHJlc2VudCBhcmJpdHJhcnkgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50CisvLy8gdmFsdWVzIGFuZCBwcm92aWRlIGEgdmFyaWV0eSBvZiBhcml0aG1ldGljIG9wZXJhdGlvbnMgb24gdGhlbS4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9BUEZMT0FUX0gKKyNkZWZpbmUgTExWTV9BRFRfQVBGTE9BVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNkZWZpbmUgQVBGTE9BVF9ESVNQQVRDSF9PTl9TRU1BTlRJQ1MoTUVUSE9EX0NBTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh1c2VzTGF5b3V0PElFRUVGbG9hdD4oZ2V0U2VtYW50aWNzKCkpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBVLklFRUUuTUVUSE9EX0NBTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHVzZXNMYXlvdXQ8RG91YmxlQVBGbG9hdD4oZ2V0U2VtYW50aWNzKCkpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIFUuRG91YmxlLk1FVEhPRF9DQUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHNlbWFudGljcyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKGZhbHNlKQorCituYW1lc3BhY2UgbGx2bSB7CisKK3N0cnVjdCBmbHRTZW1hbnRpY3M7CitjbGFzcyBBUFNJbnQ7CitjbGFzcyBTdHJpbmdSZWY7CitjbGFzcyBBUEZsb2F0OworY2xhc3MgcmF3X29zdHJlYW07CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBTbWFsbFZlY3RvckltcGw7CisKKy8vLyBFbnVtIHRoYXQgcmVwcmVzZW50cyB3aGF0IGZyYWN0aW9uIG9mIHRoZSBMU0IgdHJ1bmNhdGVkIGJpdHMgb2YgYW4gZnAgbnVtYmVyCisvLy8gcmVwcmVzZW50LgorLy8vCisvLy8gVGhpcyBlc3NlbnRpYWxseSBjb21iaW5lcyB0aGUgcm9sZXMgb2YgZ3VhcmQgYW5kIHN0aWNreSBiaXRzLgorZW51bSBsb3N0RnJhY3Rpb24geyAvLyBFeGFtcGxlIG9mIHRydW5jYXRlZCBiaXRzOgorICBsZkV4YWN0bHlaZXJvLCAgICAvLyAwMDAwMDAKKyAgbGZMZXNzVGhhbkhhbGYsICAgLy8gMHh4eHh4ICB4J3Mgbm90IGFsbCB6ZXJvCisgIGxmRXhhY3RseUhhbGYsICAgIC8vIDEwMDAwMAorICBsZk1vcmVUaGFuSGFsZiAgICAvLyAxeHh4eHggIHgncyBub3QgYWxsIHplcm8KK307CisKKy8vLyBBIHNlbGYtY29udGFpbmVkIGhvc3QtIGFuZCB0YXJnZXQtaW5kZXBlbmRlbnQgYXJiaXRyYXJ5LXByZWNpc2lvbgorLy8vIGZsb2F0aW5nLXBvaW50IHNvZnR3YXJlIGltcGxlbWVudGF0aW9uLgorLy8vCisvLy8gQVBGbG9hdCB1c2VzIGJpZ251bSBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgcHJvdmlkZWQgYnkgc3RhdGljIGZ1bmN0aW9ucyBpbgorLy8vIHRoZSBBUEludCBjbGFzcy4gIFRoZSBsaWJyYXJ5IHdpbGwgd29yayB3aXRoIGJpZ251bSBpbnRlZ2VycyB3aG9zZSBwYXJ0cyBhcmUKKy8vLyBhbnkgdW5zaWduZWQgdHlwZSBhdCBsZWFzdCAxNiBiaXRzIHdpZGUsIGJ1dCA2NCBiaXRzIGlzIHJlY29tbWVuZGVkLgorLy8vCisvLy8gV3JpdHRlbiBmb3IgY2xhcml0eSByYXRoZXIgdGhhbiBzcGVlZCwgaW4gcGFydGljdWxhciB3aXRoIGEgdmlldyB0byB1c2UgaW4KKy8vLyB0aGUgZnJvbnQtZW5kIG9mIGEgY3Jvc3MgY29tcGlsZXIgc28gdGhhdCB0YXJnZXQgYXJpdGhtZXRpYyBjYW4gYmUgY29ycmVjdGx5CisvLy8gcGVyZm9ybWVkIG9uIHRoZSBob3N0LiAgUGVyZm9ybWFuY2Ugc2hvdWxkIG5vbmV0aGVsZXNzIGJlIHJlYXNvbmFibGUsCisvLy8gcGFydGljdWxhcmx5IGZvciBpdHMgaW50ZW5kZWQgdXNlLiAgSXQgbWF5IGJlIHVzZWZ1bCBhcyBhIGJhc2UKKy8vLyBpbXBsZW1lbnRhdGlvbiBmb3IgYSBydW4tdGltZSBsaWJyYXJ5IGR1cmluZyBkZXZlbG9wbWVudCBvZiBhIGZhc3RlcgorLy8vIHRhcmdldC1zcGVjaWZpYyBvbmUuCisvLy8KKy8vLyBBbGwgNSByb3VuZGluZyBtb2RlcyBpbiB0aGUgSUVFRS03NTRSIGRyYWZ0IGFyZSBoYW5kbGVkIGNvcnJlY3RseSBmb3IgYWxsCisvLy8gaW1wbGVtZW50ZWQgb3BlcmF0aW9ucy4gIEN1cnJlbnRseSBpbXBsZW1lbnRlZCBvcGVyYXRpb25zIGFyZSBhZGQsIHN1YnRyYWN0LAorLy8vIG11bHRpcGx5LCBkaXZpZGUsIGZ1c2VkLW11bHRpcGx5LWFkZCwgY29udmVyc2lvbi10by1mbG9hdCwKKy8vLyBjb252ZXJzaW9uLXRvLWludGVnZXIgYW5kIGNvbnZlcnNpb24tZnJvbS1pbnRlZ2VyLiAgTmV3IHJvdW5kaW5nIG1vZGVzCisvLy8gKGUuZy4gYXdheSBmcm9tIHplcm8pIGNhbiBiZSBhZGRlZCB3aXRoIHRocmVlIG9yIGZvdXIgbGluZXMgb2YgY29kZS4KKy8vLworLy8vIEZvdXIgZm9ybWF0cyBhcmUgYnVpbHQtaW46IElFRUUgc2luZ2xlIHByZWNpc2lvbiwgZG91YmxlIHByZWNpc2lvbiwKKy8vLyBxdWFkcnVwbGUgcHJlY2lzaW9uLCBhbmQgeDg3IDgwLWJpdCBleHRlbmRlZCBkb3VibGUgKHdoZW4gb3BlcmF0aW5nIHdpdGgKKy8vLyBmdWxsIGV4dGVuZGVkIHByZWNpc2lvbikuICBBZGRpbmcgYSBuZXcgZm9ybWF0IHRoYXQgb2JleXMgSUVFRSBzZW1hbnRpY3MKKy8vLyBvbmx5IHJlcXVpcmVzIGFkZGluZyB0d28gbGluZXMgb2YgY29kZTogYSBkZWNsYXJhdGlvbiBhbmQgZGVmaW5pdGlvbiBvZiB0aGUKKy8vLyBmb3JtYXQuCisvLy8KKy8vLyBBbGwgb3BlcmF0aW9ucyByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGF0IG9wZXJhdGlvbiBhcyBhbiBleGNlcHRpb24gYml0LW1hc2ssCisvLy8gc28gbXVsdGlwbGUgb3BlcmF0aW9ucyBjYW4gYmUgZG9uZSBjb25zZWN1dGl2ZWx5IHdpdGggdGhlaXIgcmVzdWx0cyBvci1lZAorLy8vIHRvZ2V0aGVyLiAgVGhlIHJldHVybmVkIHN0YXR1cyBjYW4gYmUgdXNlZnVsIGZvciBjb21waWxlciBkaWFnbm9zdGljczsgZS5nLiwKKy8vLyBpbmV4YWN0LCB1bmRlcmZsb3cgYW5kIG92ZXJmbG93IGNhbiBiZSBlYXNpbHkgZGlhZ25vc2VkIG9uIGNvbnN0YW50IGZvbGRpbmcsCisvLy8gYW5kIGNvbXBpbGVyIG9wdGltaXplcnMgY2FuIGRldGVybWluZSB3aGF0IGV4Y2VwdGlvbnMgd291bGQgYmUgcmFpc2VkIGJ5CisvLy8gZm9sZGluZyBvcGVyYXRpb25zIGFuZCBvcHRpbWl6ZSwgb3IgcGVyaGFwcyBub3Qgb3B0aW1pemUsIGFjY29yZGluZ2x5LgorLy8vCisvLy8gQXQgcHJlc2VudCwgdW5kZXJmbG93IHRpbmluZXNzIGlzIGRldGVjdGVkIGFmdGVyIHJvdW5kaW5nOyBpdCBzaG91bGQgYmUKKy8vLyBzdHJhaWdodCBmb3J3YXJkIHRvIGFkZCBzdXBwb3J0IGZvciB0aGUgYmVmb3JlLXJvdW5kaW5nIGNhc2UgdG9vLgorLy8vCisvLy8gVGhlIGxpYnJhcnkgcmVhZHMgaGV4YWRlY2ltYWwgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhcyBwZXIgQzk5LCBhbmQKKy8vLyBjb3JyZWN0bHkgcm91bmRzIGlmIG5lY2Vzc2FyeSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCByb3VuZGluZyBtb2RlLgorLy8vIFN5bnRheCBpcyByZXF1aXJlZCB0byBoYXZlIGJlZW4gdmFsaWRhdGVkIGJ5IHRoZSBjYWxsZXIuICBJdCBhbHNvIGNvbnZlcnRzCisvLy8gZmxvYXRpbmcgcG9pbnQgbnVtYmVycyB0byBoZXhhZGVjaW1hbCB0ZXh0IGFzIHBlciB0aGUgQzk5ICVhIGFuZCAlQQorLy8vIGNvbnZlcnNpb25zLiAgVGhlIG91dHB1dCBwcmVjaXNpb24gKG9yIGFsdGVybmF0aXZlbHkgdGhlIG5hdHVyYWwgbWluaW1hbAorLy8vIHByZWNpc2lvbikgY2FuIGJlIHNwZWNpZmllZDsgaWYgdGhlIHJlcXVlc3RlZCBwcmVjaXNpb24gaXMgbGVzcyB0aGFuIHRoZQorLy8vIG5hdHVyYWwgcHJlY2lzaW9uIHRoZSBvdXRwdXQgaXMgY29ycmVjdGx5IHJvdW5kZWQgZm9yIHRoZSBzcGVjaWZpZWQgcm91bmRpbmcKKy8vLyBtb2RlLgorLy8vCisvLy8gSXQgYWxzbyByZWFkcyBkZWNpbWFsIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgYW5kIGNvcnJlY3RseSByb3VuZHMgYWNjb3JkaW5nCisvLy8gdG8gdGhlIHNwZWNpZmllZCByb3VuZGluZyBtb2RlLgorLy8vCisvLy8gQ29udmVyc2lvbiB0byBkZWNpbWFsIHRleHQgaXMgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4KKy8vLworLy8vIE5vbi16ZXJvIGZpbml0ZSBudW1iZXJzIGFyZSByZXByZXNlbnRlZCBpbnRlcm5hbGx5IGFzIGEgc2lnbiBiaXQsIGEgMTYtYml0CisvLy8gc2lnbmVkIGV4cG9uZW50LCBhbmQgdGhlIHNpZ25pZmljYW5kIGFzIGFuIGFycmF5IG9mIGludGVnZXIgcGFydHMuICBBZnRlcgorLy8vIG5vcm1hbGl6YXRpb24gb2YgYSBudW1iZXIgb2YgcHJlY2lzaW9uIFAgdGhlIGV4cG9uZW50IGlzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YKKy8vLyB0aGUgZm9ybWF0LCBhbmQgaWYgdGhlIG51bWJlciBpcyBub3QgZGVub3JtYWwgdGhlIFAtdGggYml0IG9mIHRoZQorLy8vIHNpZ25pZmljYW5kIGlzIHNldCBhcyBhbiBleHBsaWNpdCBpbnRlZ2VyIGJpdC4gIEZvciBkZW5vcm1hbHMgdGhlIG1vc3QKKy8vLyBzaWduaWZpY2FudCBiaXQgaXMgc2hpZnRlZCByaWdodCBzbyB0aGF0IHRoZSBleHBvbmVudCBpcyBtYWludGFpbmVkIGF0IHRoZQorLy8vIGZvcm1hdCdzIG1pbmltdW0sIHNvIHRoYXQgdGhlIHNtYWxsZXN0IGRlbm9ybWFsIGhhcyBqdXN0IHRoZSBsZWFzdAorLy8vIHNpZ25pZmljYW50IGJpdCBvZiB0aGUgc2lnbmlmaWNhbmQgc2V0LiAgVGhlIHNpZ24gb2YgemVyb2VzIGFuZCBpbmZpbml0aWVzCisvLy8gaXMgc2lnbmlmaWNhbnQ7IHRoZSBleHBvbmVudCBhbmQgc2lnbmlmaWNhbmQgb2Ygc3VjaCBudW1iZXJzIGlzIG5vdCBzdG9yZWQsCisvLy8gYnV0IGhhcyBhIGtub3duIGltcGxpY2l0IChkZXRlcm1pbmlzdGljKSB2YWx1ZTogMCBmb3IgdGhlIHNpZ25pZmljYW5kcywgMAorLy8vIGZvciB6ZXJvIGV4cG9uZW50LCBhbGwgMSBiaXRzIGZvciBpbmZpbml0eSBleHBvbmVudC4gIEZvciBOYU5zIHRoZSBzaWduIGFuZAorLy8vIHNpZ25pZmljYW5kIGFyZSBkZXRlcm1pbmlzdGljLCBhbHRob3VnaCBub3QgcmVhbGx5IG1lYW5pbmdmdWwsIGFuZCBwcmVzZXJ2ZWQKKy8vLyBpbiBub24tY29udmVyc2lvbiBvcGVyYXRpb25zLiAgVGhlIGV4cG9uZW50IGlzIGltcGxpY2l0bHkgYWxsIDEgYml0cy4KKy8vLworLy8vIEFQRmxvYXQgZG9lcyBub3QgcHJvdmlkZSBhbnkgZXhjZXB0aW9uIGhhbmRsaW5nIGJleW9uZCBkZWZhdWx0IGV4Y2VwdGlvbgorLy8vIGhhbmRsaW5nLiBXZSByZXByZXNlbnQgU2lnbmFsaW5nIE5hTnMgdmlhIElFRUUtNzU0UiAyMDA4IDYuMi4xIHNob3VsZCBjbGF1c2UKKy8vLyBieSBlbmNvZGluZyBTaWduYWxpbmcgTmFOcyB3aXRoIHRoZSBmaXJzdCBiaXQgb2YgaXRzIHRyYWlsaW5nIHNpZ25pZmljYW5kIGFzCisvLy8gMC4KKy8vLworLy8vIFRPRE8KKy8vLyA9PT09CisvLy8KKy8vLyBTb21lIGZlYXR1cmVzIHRoYXQgbWF5IG9yIG1heSBub3QgYmUgd29ydGggYWRkaW5nOgorLy8vCisvLy8gQmluYXJ5IHRvIGRlY2ltYWwgY29udmVyc2lvbiAoaGFyZCkuCisvLy8KKy8vLyBPcHRpb25hbCBhYmlsaXR5IHRvIGRldGVjdCB1bmRlcmZsb3cgdGluaW5lc3MgYmVmb3JlIHJvdW5kaW5nLgorLy8vCisvLy8gTmV3IGZvcm1hdHM6IHg4NyBpbiBzaW5nbGUgYW5kIGRvdWJsZSBwcmVjaXNpb24gbW9kZSAoSUVFRSBhcGFydCBmcm9tCisvLy8gZXh0ZW5kZWQgZXhwb25lbnQgcmFuZ2UpIChoYXJkKS4KKy8vLworLy8vIE5ldyBvcGVyYXRpb25zOiBzcXJ0LCBJRUVFIHJlbWFpbmRlciwgQzkwIGZtb2QsIG5leHR0b3dhcmQuCisvLy8KKworLy8gVGhpcyBpcyB0aGUgY29tbW9uIHR5cGUgZGVmaW5pdGlvbnMgc2hhcmVkIGJ5IEFQRmxvYXQgYW5kIGl0cyBpbnRlcm5hbAorLy8gaW1wbGVtZW50YXRpb24gY2xhc3Nlcy4gVGhpcyBzdHJ1Y3Qgc2hvdWxkIG5vdCBkZWZpbmUgYW55IG5vbi1zdGF0aWMgZGF0YQorLy8gbWVtYmVycy4KK3N0cnVjdCBBUEZsb2F0QmFzZSB7CisgIHR5cGVkZWYgQVBJbnQ6OldvcmRUeXBlIGludGVnZXJQYXJ0OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50ZWdlclBhcnRXaWR0aCA9IEFQSW50OjpBUElOVF9CSVRTX1BFUl9XT1JEOworCisgIC8vLyBBIHNpZ25lZCB0eXBlIHRvIHJlcHJlc2VudCBhIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgdW5iaWFzZWQgZXhwb25lbnQuCisgIHR5cGVkZWYgc2lnbmVkIHNob3J0IEV4cG9uZW50VHlwZTsKKworICAvLy8gXG5hbWUgRmxvYXRpbmcgUG9pbnQgU2VtYW50aWNzLgorICAvLy8gQHsKKworICBzdGF0aWMgY29uc3QgZmx0U2VtYW50aWNzICZJRUVFaGFsZigpIExMVk1fUkVBRE5PTkU7CisgIHN0YXRpYyBjb25zdCBmbHRTZW1hbnRpY3MgJklFRUVzaW5nbGUoKSBMTFZNX1JFQUROT05FOworICBzdGF0aWMgY29uc3QgZmx0U2VtYW50aWNzICZJRUVFZG91YmxlKCkgTExWTV9SRUFETk9ORTsKKyAgc3RhdGljIGNvbnN0IGZsdFNlbWFudGljcyAmSUVFRXF1YWQoKSBMTFZNX1JFQUROT05FOworICBzdGF0aWMgY29uc3QgZmx0U2VtYW50aWNzICZQUENEb3VibGVEb3VibGUoKSBMTFZNX1JFQUROT05FOworICBzdGF0aWMgY29uc3QgZmx0U2VtYW50aWNzICZ4ODdEb3VibGVFeHRlbmRlZCgpIExMVk1fUkVBRE5PTkU7CisKKyAgLy8vIEEgUHNldWRvIGZsdHNlbWFudGljIHVzZWQgdG8gY29uc3RydWN0IEFQRmxvYXRzIHRoYXQgY2Fubm90IGNvbmZsaWN0IHdpdGgKKyAgLy8vIGFueXRoaW5nIHJlYWwuCisgIHN0YXRpYyBjb25zdCBmbHRTZW1hbnRpY3MgJkJvZ3VzKCkgTExWTV9SRUFETk9ORTsKKworICAvLy8gQH0KKworICAvLy8gSUVFRS03NTRSIDUuMTE6IEZsb2F0aW5nIFBvaW50IENvbXBhcmlzb24gUmVsYXRpb25zLgorICBlbnVtIGNtcFJlc3VsdCB7CisgICAgY21wTGVzc1RoYW4sCisgICAgY21wRXF1YWwsCisgICAgY21wR3JlYXRlclRoYW4sCisgICAgY21wVW5vcmRlcmVkCisgIH07CisKKyAgLy8vIElFRUUtNzU0UiA0LjM6IFJvdW5kaW5nLWRpcmVjdGlvbiBhdHRyaWJ1dGVzLgorICBlbnVtIHJvdW5kaW5nTW9kZSB7CisgICAgcm1OZWFyZXN0VGllc1RvRXZlbiwKKyAgICBybVRvd2FyZFBvc2l0aXZlLAorICAgIHJtVG93YXJkTmVnYXRpdmUsCisgICAgcm1Ub3dhcmRaZXJvLAorICAgIHJtTmVhcmVzdFRpZXNUb0F3YXkKKyAgfTsKKworICAvLy8gSUVFRS03NTRSIDc6IERlZmF1bHQgZXhjZXB0aW9uIGhhbmRsaW5nLgorICAvLy8KKyAgLy8vIG9wVW5kZXJmbG93IG9yIG9wT3ZlcmZsb3cgYXJlIGFsd2F5cyByZXR1cm5lZCBvci1lZCB3aXRoIG9wSW5leGFjdC4KKyAgZW51bSBvcFN0YXR1cyB7CisgICAgb3BPSyA9IDB4MDAsCisgICAgb3BJbnZhbGlkT3AgPSAweDAxLAorICAgIG9wRGl2QnlaZXJvID0gMHgwMiwKKyAgICBvcE92ZXJmbG93ID0gMHgwNCwKKyAgICBvcFVuZGVyZmxvdyA9IDB4MDgsCisgICAgb3BJbmV4YWN0ID0gMHgxMAorICB9OworCisgIC8vLyBDYXRlZ29yeSBvZiBpbnRlcm5hbGx5LXJlcHJlc2VudGVkIG51bWJlci4KKyAgZW51bSBmbHRDYXRlZ29yeSB7CisgICAgZmNJbmZpbml0eSwKKyAgICBmY05hTiwKKyAgICBmY05vcm1hbCwKKyAgICBmY1plcm8KKyAgfTsKKworICAvLy8gQ29udmVuaWVuY2UgZW51bSB1c2VkIHRvIGNvbnN0cnVjdCBhbiB1bmluaXRpYWxpemVkIEFQRmxvYXQuCisgIGVudW0gdW5pbml0aWFsaXplZFRhZyB7CisgICAgdW5pbml0aWFsaXplZAorICB9OworCisgIC8vLyBFbnVtZXJhdGlvbiBvZiBcYyBpbG9nYiBlcnJvciByZXN1bHRzLgorICBlbnVtIElsb2diRXJyb3JLaW5kcyB7CisgICAgSUVLX1plcm8gPSBJTlRfTUlOICsgMSwKKyAgICBJRUtfTmFOID0gSU5UX01JTiwKKyAgICBJRUtfSW5mID0gSU5UX01BWAorICB9OworCisgIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VtYW50aWNzUHJlY2lzaW9uKGNvbnN0IGZsdFNlbWFudGljcyAmKTsKKyAgc3RhdGljIEV4cG9uZW50VHlwZSBzZW1hbnRpY3NNaW5FeHBvbmVudChjb25zdCBmbHRTZW1hbnRpY3MgJik7CisgIHN0YXRpYyBFeHBvbmVudFR5cGUgc2VtYW50aWNzTWF4RXhwb25lbnQoY29uc3QgZmx0U2VtYW50aWNzICYpOworICBzdGF0aWMgdW5zaWduZWQgaW50IHNlbWFudGljc1NpemVJbkJpdHMoY29uc3QgZmx0U2VtYW50aWNzICYpOworCisgIC8vLyBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBmbG9hdGluZyBwb2ludCBudW1iZXIgKGluIGJpdHMpIGluIHRoZSBnaXZlbgorICAvLy8gc2VtYW50aWNzLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0U2l6ZUluQml0cyhjb25zdCBmbHRTZW1hbnRpY3MgJlNlbSk7Cit9OworCituYW1lc3BhY2UgZGV0YWlsIHsKKworY2xhc3MgSUVFRUZsb2F0IGZpbmFsIDogcHVibGljIEFQRmxvYXRCYXNlIHsKK3B1YmxpYzoKKyAgLy8vIFxuYW1lIENvbnN0cnVjdG9ycworICAvLy8gQHsKKworICBJRUVFRmxvYXQoY29uc3QgZmx0U2VtYW50aWNzICYpOyAvLyBEZWZhdWx0IGNvbnN0cnVjdCB0byAwLjAKKyAgSUVFRUZsb2F0KGNvbnN0IGZsdFNlbWFudGljcyAmLCBpbnRlZ2VyUGFydCk7CisgIElFRUVGbG9hdChjb25zdCBmbHRTZW1hbnRpY3MgJiwgdW5pbml0aWFsaXplZFRhZyk7CisgIElFRUVGbG9hdChjb25zdCBmbHRTZW1hbnRpY3MgJiwgY29uc3QgQVBJbnQgJik7CisgIGV4cGxpY2l0IElFRUVGbG9hdChkb3VibGUgZCk7CisgIGV4cGxpY2l0IElFRUVGbG9hdChmbG9hdCBmKTsKKyAgSUVFRUZsb2F0KGNvbnN0IElFRUVGbG9hdCAmKTsKKyAgSUVFRUZsb2F0KElFRUVGbG9hdCAmJik7CisgIH5JRUVFRmxvYXQoKTsKKworICAvLy8gQH0KKworICAvLy8gUmV0dXJucyB3aGV0aGVyIHRoaXMgaW5zdGFuY2UgYWxsb2NhdGVkIG1lbW9yeS4KKyAgYm9vbCBuZWVkc0NsZWFudXAoKSBjb25zdCB7IHJldHVybiBwYXJ0Q291bnQoKSA+IDE7IH0KKworICAvLy8gXG5hbWUgQ29udmVuaWVuY2UgImNvbnN0cnVjdG9ycyIKKyAgLy8vIEB7CisKKyAgLy8vIEB9CisKKyAgLy8vIFxuYW1lIEFyaXRobWV0aWMKKyAgLy8vIEB7CisKKyAgb3BTdGF0dXMgYWRkKGNvbnN0IElFRUVGbG9hdCAmLCByb3VuZGluZ01vZGUpOworICBvcFN0YXR1cyBzdWJ0cmFjdChjb25zdCBJRUVFRmxvYXQgJiwgcm91bmRpbmdNb2RlKTsKKyAgb3BTdGF0dXMgbXVsdGlwbHkoY29uc3QgSUVFRUZsb2F0ICYsIHJvdW5kaW5nTW9kZSk7CisgIG9wU3RhdHVzIGRpdmlkZShjb25zdCBJRUVFRmxvYXQgJiwgcm91bmRpbmdNb2RlKTsKKyAgLy8vIElFRUUgcmVtYWluZGVyLgorICBvcFN0YXR1cyByZW1haW5kZXIoY29uc3QgSUVFRUZsb2F0ICYpOworICAvLy8gQyBmbW9kLCBvciBsbHZtIGZyZW0uCisgIG9wU3RhdHVzIG1vZChjb25zdCBJRUVFRmxvYXQgJik7CisgIG9wU3RhdHVzIGZ1c2VkTXVsdGlwbHlBZGQoY29uc3QgSUVFRUZsb2F0ICYsIGNvbnN0IElFRUVGbG9hdCAmLCByb3VuZGluZ01vZGUpOworICBvcFN0YXR1cyByb3VuZFRvSW50ZWdyYWwocm91bmRpbmdNb2RlKTsKKyAgLy8vIElFRUUtNzU0UiA1LjMuMTogbmV4dFVwL25leHREb3duLgorICBvcFN0YXR1cyBuZXh0KGJvb2wgbmV4dERvd24pOworCisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBTaWduIG9wZXJhdGlvbnMuCisgIC8vLyBAeworCisgIHZvaWQgY2hhbmdlU2lnbigpOworCisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBDb252ZXJzaW9ucworICAvLy8gQHsKKworICBvcFN0YXR1cyBjb252ZXJ0KGNvbnN0IGZsdFNlbWFudGljcyAmLCByb3VuZGluZ01vZGUsIGJvb2wgKik7CisgIG9wU3RhdHVzIGNvbnZlcnRUb0ludGVnZXIoTXV0YWJsZUFycmF5UmVmPGludGVnZXJQYXJ0PiwgdW5zaWduZWQgaW50LCBib29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kaW5nTW9kZSwgYm9vbCAqKSBjb25zdDsKKyAgb3BTdGF0dXMgY29udmVydEZyb21BUEludChjb25zdCBBUEludCAmLCBib29sLCByb3VuZGluZ01vZGUpOworICBvcFN0YXR1cyBjb252ZXJ0RnJvbVNpZ25FeHRlbmRlZEludGVnZXIoY29uc3QgaW50ZWdlclBhcnQgKiwgdW5zaWduZWQgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCwgcm91bmRpbmdNb2RlKTsKKyAgb3BTdGF0dXMgY29udmVydEZyb21aZXJvRXh0ZW5kZWRJbnRlZ2VyKGNvbnN0IGludGVnZXJQYXJ0ICosIHVuc2lnbmVkIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wsIHJvdW5kaW5nTW9kZSk7CisgIG9wU3RhdHVzIGNvbnZlcnRGcm9tU3RyaW5nKFN0cmluZ1JlZiwgcm91bmRpbmdNb2RlKTsKKyAgQVBJbnQgYml0Y2FzdFRvQVBJbnQoKSBjb25zdDsKKyAgZG91YmxlIGNvbnZlcnRUb0RvdWJsZSgpIGNvbnN0OworICBmbG9hdCBjb252ZXJ0VG9GbG9hdCgpIGNvbnN0OworCisgIC8vLyBAfQorCisgIC8vLyBUaGUgZGVmaW5pdGlvbiBvZiBlcXVhbGl0eSBpcyBub3Qgc3RyYWlnaHRmb3J3YXJkIGZvciBmbG9hdGluZyBwb2ludCwgc28KKyAgLy8vIHdlIHdvbid0IHVzZSBvcGVyYXRvcj09LiAgVXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nLCBvciB3cml0ZSB3aGF0ZXZlciBpdAorICAvLy8gaXMgeW91IHJlYWxseSBtZWFuLgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgSUVFRUZsb2F0ICYpIGNvbnN0ID0gZGVsZXRlOworCisgIC8vLyBJRUVFIGNvbXBhcmlzb24gd2l0aCBhbm90aGVyIGZsb2F0aW5nIHBvaW50IG51bWJlciAoTmFOcyBjb21wYXJlCisgIC8vLyB1bm9yZGVyZWQsIDA9PS0wKS4KKyAgY21wUmVzdWx0IGNvbXBhcmUoY29uc3QgSUVFRUZsb2F0ICYpIGNvbnN0OworCisgIC8vLyBCaXR3aXNlIGNvbXBhcmlzb24gZm9yIGVxdWFsaXR5IChRTmFOcyBjb21wYXJlIGVxdWFsLCAwIT0tMCkuCisgIGJvb2wgYml0d2lzZUlzRXF1YWwoY29uc3QgSUVFRUZsb2F0ICYpIGNvbnN0OworCisgIC8vLyBXcml0ZSBvdXQgYSBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmxvYXRpbmcgcG9pbnQgdmFsdWUgdG8gRFNULAorICAvLy8gd2hpY2ggbXVzdCBiZSBvZiBzdWZmaWNpZW50IHNpemUsIGluIHRoZSBDOTkgZm9ybSBbLV0weGguaGhoaHBbKy1dZC4KKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiwgZXhjbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBOVUwuCisgIHVuc2lnbmVkIGludCBjb252ZXJ0VG9IZXhTdHJpbmcoY2hhciAqZHN0LCB1bnNpZ25lZCBpbnQgaGV4RGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXBwZXJDYXNlLCByb3VuZGluZ01vZGUpIGNvbnN0OworCisgIC8vLyBcbmFtZSBJRUVFLTc1NFIgNS43LjIgR2VuZXJhbCBvcGVyYXRpb25zLgorICAvLy8gQHsKKworICAvLy8gSUVFRS03NTRSIGlzU2lnbk1pbnVzOiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMKKyAgLy8vIG5lZ2F0aXZlLgorICAvLy8KKyAgLy8vIFRoaXMgYXBwbGllcyB0byB6ZXJvcyBhbmQgTmFOcyBhcyB3ZWxsLgorICBib29sIGlzTmVnYXRpdmUoKSBjb25zdCB7IHJldHVybiBzaWduOyB9CisKKyAgLy8vIElFRUUtNzU0UiBpc05vcm1hbDogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBjdXJyZW50IHZhbHVlIGlzIG5vcm1hbC4KKyAgLy8vCisgIC8vLyBUaGlzIGltcGxpZXMgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZmxvYXQgaXMgbm90IHplcm8sIHN1Ym5vcm1hbCwKKyAgLy8vIGluZmluaXRlLCBvciBOYU4gZm9sbG93aW5nIHRoZSBkZWZpbml0aW9uIG9mIG5vcm1hbGl0eSBmcm9tIElFRUUtNzU0Ui4KKyAgYm9vbCBpc05vcm1hbCgpIGNvbnN0IHsgcmV0dXJuICFpc0Rlbm9ybWFsKCkgJiYgaXNGaW5pdGVOb25aZXJvKCk7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBjdXJyZW50IHZhbHVlIGlzIHplcm8sIHN1Ym5vcm1hbCwgb3IKKyAgLy8vIG5vcm1hbC4KKyAgLy8vCisgIC8vLyBUaGlzIG1lYW5zIHRoYXQgdGhlIHZhbHVlIGlzIG5vdCBpbmZpbml0ZSBvciBOYU4uCisgIGJvb2wgaXNGaW5pdGUoKSBjb25zdCB7IHJldHVybiAhaXNOYU4oKSAmJiAhaXNJbmZpbml0eSgpOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZmxvYXQgaXMgcGx1cyBvciBtaW51cyB6ZXJvLgorICBib29sIGlzWmVybygpIGNvbnN0IHsgcmV0dXJuIGNhdGVnb3J5ID09IGZjWmVybzsgfQorCisgIC8vLyBJRUVFLTc1NFIgaXNTdWJub3JtYWwoKTogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBmbG9hdCBpcyBhCisgIC8vLyBkZW5vcm1hbC4KKyAgYm9vbCBpc0Rlbm9ybWFsKCkgY29uc3Q7CisKKyAgLy8vIElFRUUtNzU0UiBpc0luZmluaXRlKCk6IFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZmxvYXQgaXMgaW5maW5pdHkuCisgIGJvb2wgaXNJbmZpbml0eSgpIGNvbnN0IHsgcmV0dXJuIGNhdGVnb3J5ID09IGZjSW5maW5pdHk7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBmbG9hdCBpcyBhIHF1aWV0IG9yIHNpZ25hbGluZyBOYU4uCisgIGJvb2wgaXNOYU4oKSBjb25zdCB7IHJldHVybiBjYXRlZ29yeSA9PSBmY05hTjsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGZsb2F0IGlzIGEgc2lnbmFsaW5nIE5hTi4KKyAgYm9vbCBpc1NpZ25hbGluZygpIGNvbnN0OworCisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBTaW1wbGUgUXVlcmllcworICAvLy8gQHsKKworICBmbHRDYXRlZ29yeSBnZXRDYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJuIGNhdGVnb3J5OyB9CisgIGNvbnN0IGZsdFNlbWFudGljcyAmZ2V0U2VtYW50aWNzKCkgY29uc3QgeyByZXR1cm4gKnNlbWFudGljczsgfQorICBib29sIGlzTm9uWmVybygpIGNvbnN0IHsgcmV0dXJuIGNhdGVnb3J5ICE9IGZjWmVybzsgfQorICBib29sIGlzRmluaXRlTm9uWmVybygpIGNvbnN0IHsgcmV0dXJuIGlzRmluaXRlKCkgJiYgIWlzWmVybygpOyB9CisgIGJvb2wgaXNQb3NaZXJvKCkgY29uc3QgeyByZXR1cm4gaXNaZXJvKCkgJiYgIWlzTmVnYXRpdmUoKTsgfQorICBib29sIGlzTmVnWmVybygpIGNvbnN0IHsgcmV0dXJuIGlzWmVybygpICYmIGlzTmVnYXRpdmUoKTsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIG51bWJlciBoYXMgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIG5vbi16ZXJvCisgIC8vLyBtYWduaXR1ZGUgaW4gdGhlIGN1cnJlbnQgc2VtYW50aWNzLgorICBib29sIGlzU21hbGxlc3QoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBudW1iZXIgaGFzIHRoZSBsYXJnZXN0IHBvc3NpYmxlIGZpbml0ZQorICAvLy8gbWFnbml0dWRlIGluIHRoZSBjdXJyZW50IHNlbWFudGljcy4KKyAgYm9vbCBpc0xhcmdlc3QoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBudW1iZXIgaXMgYW4gZXhhY3QgaW50ZWdlci4KKyAgYm9vbCBpc0ludGVnZXIoKSBjb25zdDsKKworICAvLy8gQH0KKworICBJRUVFRmxvYXQgJm9wZXJhdG9yPShjb25zdCBJRUVFRmxvYXQgJik7CisgIElFRUVGbG9hdCAmb3BlcmF0b3I9KElFRUVGbG9hdCAmJik7CisKKyAgLy8vIE92ZXJsb2FkIHRvIGNvbXB1dGUgYSBoYXNoIGNvZGUgZm9yIGFuIEFQRmxvYXQgdmFsdWUuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoZSB1c2Ugb2YgaGFzaCBjb2RlcyBmb3IgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIGlzIGluIGdlbmVyYWwKKyAgLy8vIGZyb3VnaHQgd2l0aCBwZXJpbC4gRXF1YWxpdHkgaXMgaGFyZCB0byBkZWZpbmUgZm9yIHRoZXNlIHZhbHVlcy4gRm9yCisgIC8vLyBleGFtcGxlLCBzaG91bGQgbmVnYXRpdmUgYW5kIHBvc2l0aXZlIHplcm8gaGFzaCB0byBkaWZmZXJlbnQgY29kZXM/IEFyZQorICAvLy8gdGhleSBlcXVhbCBvciBub3Q/IFRoaXMgaGFzaCB2YWx1ZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpY2FsbHkKKyAgLy8vIGVtcGhhc2l6ZXMgcHJvZHVjaW5nIGRpZmZlcmVudCBjb2RlcyBmb3IgZGlmZmVyZW50IGlucHV0cyBpbiBvcmRlciB0bworICAvLy8gYmUgdXNlZCBpbiBjYW5vbmljYWxpemF0aW9uIGFuZCBtZW1vaXphdGlvbi4gQXMgc3VjaCwgZXF1YWxpdHkgaXMKKyAgLy8vIGJpdHdpc2VJc0VxdWFsLCBhbmQgMCAhPSAtMC4KKyAgZnJpZW5kIGhhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IElFRUVGbG9hdCAmQXJnKTsKKworICAvLy8gQ29udmVydHMgdGhpcyB2YWx1ZSBpbnRvIGEgZGVjaW1hbCBzdHJpbmcuCisgIC8vLworICAvLy8gXHBhcmFtIEZvcm1hdFByZWNpc2lvbiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGlnaXRzIG9mCisgIC8vLyAgIHByZWNpc2lvbiB0byBvdXRwdXQuICBJZiB0aGVyZSBhcmUgZmV3ZXIgZGlnaXRzIGF2YWlsYWJsZSwKKyAgLy8vICAgemVybyBwYWRkaW5nIHdpbGwgbm90IGJlIHVzZWQgdW5sZXNzIHRoZSB2YWx1ZSBpcworICAvLy8gICBpbnRlZ3JhbCBhbmQgc21hbGwgZW5vdWdoIHRvIGJlIGV4cHJlc3NlZCBpbgorICAvLy8gICBGb3JtYXRQcmVjaXNpb24gZGlnaXRzLiAgMCBtZWFucyB0byB1c2UgdGhlIG5hdHVyYWwKKyAgLy8vICAgcHJlY2lzaW9uIG9mIHRoZSBudW1iZXIuCisgIC8vLyBccGFyYW0gRm9ybWF0TWF4UGFkZGluZyBUaGUgbWF4aW11bSBudW1iZXIgb2YgemVyb3MgdG8KKyAgLy8vICAgY29uc2lkZXIgaW5zZXJ0aW5nIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gc2NpZW50aWZpYworICAvLy8gICBub3RhdGlvbi4gIDAgbWVhbnMgdG8gYWx3YXlzIHVzZSBzY2llbnRpZmljIG5vdGF0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUcnVuY2F0ZVplcm8gSW5kaWNhdGUgd2hldGhlciB0byByZW1vdmUgdGhlIHRyYWlsaW5nIHplcm8gaW4KKyAgLy8vICAgZnJhY3Rpb24gcGFydCBvciBub3QuIEFsc28gc2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byBmYWxzZSBmb3JjaW5nCisgIC8vLyAgIHByb2R1Y2luZyBvZiBvdXRwdXQgbW9yZSBzaW1pbGFyIHRvIGRlZmF1bHQgcHJpbnRmIGJlaGF2aW9yLgorICAvLy8gICBTcGVjaWZpY2FsbHkgdGhlIGxvd2VyIGUgaXMgdXNlZCBhcyBleHBvbmVudCBkZWxpbWl0ZXIgYW5kIGV4cG9uZW50CisgIC8vLyAgIGFsd2F5cyBjb250YWlucyBubyBsZXNzIHRoYW4gdHdvIGRpZ2l0cy4KKyAgLy8vCisgIC8vLyBOdW1iZXIgICAgICAgUHJlY2lzaW9uICAgIE1heFBhZGRpbmcgICAgICBSZXN1bHQKKyAgLy8vIC0tLS0tLSAgICAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLQorICAvLy8gMS4wMUUrNCAgICAgICAgICAgICAgNSAgICAgICAgICAgICAyICAgICAgIDEwMTAwCisgIC8vLyAxLjAxRSs0ICAgICAgICAgICAgICA0ICAgICAgICAgICAgIDIgICAgICAgMS4wMUUrNAorICAvLy8gMS4wMUUrNCAgICAgICAgICAgICAgNSAgICAgICAgICAgICAxICAgICAgIDEuMDFFKzQKKyAgLy8vIDEuMDFFLTIgICAgICAgICAgICAgIDUgICAgICAgICAgICAgMiAgICAgICAwLjAxMDEKKyAgLy8vIDEuMDFFLTIgICAgICAgICAgICAgIDQgICAgICAgICAgICAgMiAgICAgICAwLjAxMDEKKyAgLy8vIDEuMDFFLTIgICAgICAgICAgICAgIDQgICAgICAgICAgICAgMSAgICAgICAxLjAxRS0yCisgIHZvaWQgdG9TdHJpbmcoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZTdHIsIHVuc2lnbmVkIEZvcm1hdFByZWNpc2lvbiA9IDAsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgRm9ybWF0TWF4UGFkZGluZyA9IDMsIGJvb2wgVHJ1bmNhdGVaZXJvID0gdHJ1ZSkgY29uc3Q7CisKKyAgLy8vIElmIHRoaXMgdmFsdWUgaGFzIGFuIGV4YWN0IG11bHRpcGxpY2F0aXZlIGludmVyc2UsIHN0b3JlIGl0IGluIGludiBhbmQKKyAgLy8vIHJldHVybiB0cnVlLgorICBib29sIGdldEV4YWN0SW52ZXJzZShBUEZsb2F0ICppbnYpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBleHBvbmVudCBvZiB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIEFQRmxvYXQuCisgIC8vLworICAvLy8gQmVjYXVzZSB0aGUgcmFkaXggb2YgQVBGbG9hdCBpcyAyLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gZmxvb3IobG9nMih4KSkuCisgIC8vLyBGb3Igc3BlY2lhbCBBUEZsb2F0IHZhbHVlcywgdGhpcyByZXR1cm5zIHNwZWNpYWwgZXJyb3IgY29kZXM6CisgIC8vLworICAvLy8gICBOYU4gLT4gXGMgSUVLX05hTgorICAvLy8gICAwICAgLT4gXGMgSUVLX1plcm8KKyAgLy8vICAgSW5mIC0+IFxjIElFS19JbmYKKyAgLy8vCisgIGZyaWVuZCBpbnQgaWxvZ2IoY29uc3QgSUVFRUZsb2F0ICZBcmcpOworCisgIC8vLyBSZXR1cm5zOiBYICogMl5FeHAgZm9yIGludGVncmFsIGV4cG9uZW50cy4KKyAgZnJpZW5kIElFRUVGbG9hdCBzY2FsYm4oSUVFRUZsb2F0IFgsIGludCBFeHAsIHJvdW5kaW5nTW9kZSk7CisKKyAgZnJpZW5kIElFRUVGbG9hdCBmcmV4cChjb25zdCBJRUVFRmxvYXQgJlgsIGludCAmRXhwLCByb3VuZGluZ01vZGUpOworCisgIC8vLyBcbmFtZSBTcGVjaWFsIHZhbHVlIHNldHRlcnMuCisgIC8vLyBAeworCisgIHZvaWQgbWFrZUxhcmdlc3QoYm9vbCBOZWcgPSBmYWxzZSk7CisgIHZvaWQgbWFrZVNtYWxsZXN0KGJvb2wgTmVnID0gZmFsc2UpOworICB2b2lkIG1ha2VOYU4oYm9vbCBTTmFOID0gZmFsc2UsIGJvb2wgTmVnID0gZmFsc2UsCisgICAgICAgICAgICAgICBjb25zdCBBUEludCAqZmlsbCA9IG51bGxwdHIpOworICB2b2lkIG1ha2VJbmYoYm9vbCBOZWcgPSBmYWxzZSk7CisgIHZvaWQgbWFrZVplcm8oYm9vbCBOZWcgPSBmYWxzZSk7CisgIHZvaWQgbWFrZVF1aWV0KCk7CisKKyAgLy8vIFJldHVybnMgdGhlIHNtYWxsZXN0IChieSBtYWduaXR1ZGUpIG5vcm1hbGl6ZWQgZmluaXRlIG51bWJlciBpbiB0aGUgZ2l2ZW4KKyAgLy8vIHNlbWFudGljcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gTmVnYXRpdmUgLSBUcnVlIGlmZiB0aGUgbnVtYmVyIHNob3VsZCBiZSBuZWdhdGl2ZQorICB2b2lkIG1ha2VTbWFsbGVzdE5vcm1hbGl6ZWQoYm9vbCBOZWdhdGl2ZSA9IGZhbHNlKTsKKworICAvLy8gQH0KKworICBjbXBSZXN1bHQgY29tcGFyZUFic29sdXRlVmFsdWUoY29uc3QgSUVFRUZsb2F0ICYpIGNvbnN0OworCitwcml2YXRlOgorICAvLy8gXG5hbWUgU2ltcGxlIFF1ZXJpZXMKKyAgLy8vIEB7CisKKyAgaW50ZWdlclBhcnQgKnNpZ25pZmljYW5kUGFydHMoKTsKKyAgY29uc3QgaW50ZWdlclBhcnQgKnNpZ25pZmljYW5kUGFydHMoKSBjb25zdDsKKyAgdW5zaWduZWQgaW50IHBhcnRDb3VudCgpIGNvbnN0OworCisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBTaWduaWZpY2FuZCBvcGVyYXRpb25zLgorICAvLy8gQHsKKworICBpbnRlZ2VyUGFydCBhZGRTaWduaWZpY2FuZChjb25zdCBJRUVFRmxvYXQgJik7CisgIGludGVnZXJQYXJ0IHN1YnRyYWN0U2lnbmlmaWNhbmQoY29uc3QgSUVFRUZsb2F0ICYsIGludGVnZXJQYXJ0KTsKKyAgbG9zdEZyYWN0aW9uIGFkZE9yU3VidHJhY3RTaWduaWZpY2FuZChjb25zdCBJRUVFRmxvYXQgJiwgYm9vbCBzdWJ0cmFjdCk7CisgIGxvc3RGcmFjdGlvbiBtdWx0aXBseVNpZ25pZmljYW5kKGNvbnN0IElFRUVGbG9hdCAmLCBjb25zdCBJRUVFRmxvYXQgKik7CisgIGxvc3RGcmFjdGlvbiBkaXZpZGVTaWduaWZpY2FuZChjb25zdCBJRUVFRmxvYXQgJik7CisgIHZvaWQgaW5jcmVtZW50U2lnbmlmaWNhbmQoKTsKKyAgdm9pZCBpbml0aWFsaXplKGNvbnN0IGZsdFNlbWFudGljcyAqKTsKKyAgdm9pZCBzaGlmdFNpZ25pZmljYW5kTGVmdCh1bnNpZ25lZCBpbnQpOworICBsb3N0RnJhY3Rpb24gc2hpZnRTaWduaWZpY2FuZFJpZ2h0KHVuc2lnbmVkIGludCk7CisgIHVuc2lnbmVkIGludCBzaWduaWZpY2FuZExTQigpIGNvbnN0OworICB1bnNpZ25lZCBpbnQgc2lnbmlmaWNhbmRNU0IoKSBjb25zdDsKKyAgdm9pZCB6ZXJvU2lnbmlmaWNhbmQoKTsKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzaWduaWZpY2FuZCBleGNsdWRpbmcgdGhlIGludGVncmFsIGJpdCBpcyBhbGwgb25lcy4KKyAgYm9vbCBpc1NpZ25pZmljYW5kQWxsT25lcygpIGNvbnN0OworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNpZ25pZmljYW5kIGV4Y2x1ZGluZyB0aGUgaW50ZWdyYWwgYml0IGlzIGFsbCB6ZXJvcy4KKyAgYm9vbCBpc1NpZ25pZmljYW5kQWxsWmVyb3MoKSBjb25zdDsKKworICAvLy8gQH0KKworICAvLy8gXG5hbWUgQXJpdGhtZXRpYyBvbiBzcGVjaWFsIHZhbHVlcy4KKyAgLy8vIEB7CisKKyAgb3BTdGF0dXMgYWRkT3JTdWJ0cmFjdFNwZWNpYWxzKGNvbnN0IElFRUVGbG9hdCAmLCBib29sIHN1YnRyYWN0KTsKKyAgb3BTdGF0dXMgZGl2aWRlU3BlY2lhbHMoY29uc3QgSUVFRUZsb2F0ICYpOworICBvcFN0YXR1cyBtdWx0aXBseVNwZWNpYWxzKGNvbnN0IElFRUVGbG9hdCAmKTsKKyAgb3BTdGF0dXMgbW9kU3BlY2lhbHMoY29uc3QgSUVFRUZsb2F0ICYpOworCisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBNaXNjZWxsYW55CisgIC8vLyBAeworCisgIGJvb2wgY29udmVydEZyb21TdHJpbmdTcGVjaWFscyhTdHJpbmdSZWYgc3RyKTsKKyAgb3BTdGF0dXMgbm9ybWFsaXplKHJvdW5kaW5nTW9kZSwgbG9zdEZyYWN0aW9uKTsKKyAgb3BTdGF0dXMgYWRkT3JTdWJ0cmFjdChjb25zdCBJRUVFRmxvYXQgJiwgcm91bmRpbmdNb2RlLCBib29sIHN1YnRyYWN0KTsKKyAgb3BTdGF0dXMgaGFuZGxlT3ZlcmZsb3cocm91bmRpbmdNb2RlKTsKKyAgYm9vbCByb3VuZEF3YXlGcm9tWmVybyhyb3VuZGluZ01vZGUsIGxvc3RGcmFjdGlvbiwgdW5zaWduZWQgaW50KSBjb25zdDsKKyAgb3BTdGF0dXMgY29udmVydFRvU2lnbkV4dGVuZGVkSW50ZWdlcihNdXRhYmxlQXJyYXlSZWY8aW50ZWdlclBhcnQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCwgYm9vbCwgcm91bmRpbmdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKikgY29uc3Q7CisgIG9wU3RhdHVzIGNvbnZlcnRGcm9tVW5zaWduZWRQYXJ0cyhjb25zdCBpbnRlZ2VyUGFydCAqLCB1bnNpZ25lZCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZGluZ01vZGUpOworICBvcFN0YXR1cyBjb252ZXJ0RnJvbUhleGFkZWNpbWFsU3RyaW5nKFN0cmluZ1JlZiwgcm91bmRpbmdNb2RlKTsKKyAgb3BTdGF0dXMgY29udmVydEZyb21EZWNpbWFsU3RyaW5nKFN0cmluZ1JlZiwgcm91bmRpbmdNb2RlKTsKKyAgY2hhciAqY29udmVydE5vcm1hbFRvSGV4U3RyaW5nKGNoYXIgKiwgdW5zaWduZWQgaW50LCBib29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRpbmdNb2RlKSBjb25zdDsKKyAgb3BTdGF0dXMgcm91bmRTaWduaWZpY2FuZFdpdGhFeHBvbmVudChjb25zdCBpbnRlZ2VyUGFydCAqLCB1bnNpZ25lZCBpbnQsIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZGluZ01vZGUpOworCisgIC8vLyBAfQorCisgIEFQSW50IGNvbnZlcnRIYWxmQVBGbG9hdFRvQVBJbnQoKSBjb25zdDsKKyAgQVBJbnQgY29udmVydEZsb2F0QVBGbG9hdFRvQVBJbnQoKSBjb25zdDsKKyAgQVBJbnQgY29udmVydERvdWJsZUFQRmxvYXRUb0FQSW50KCkgY29uc3Q7CisgIEFQSW50IGNvbnZlcnRRdWFkcnVwbGVBUEZsb2F0VG9BUEludCgpIGNvbnN0OworICBBUEludCBjb252ZXJ0RjgwTG9uZ0RvdWJsZUFQRmxvYXRUb0FQSW50KCkgY29uc3Q7CisgIEFQSW50IGNvbnZlcnRQUENEb3VibGVEb3VibGVBUEZsb2F0VG9BUEludCgpIGNvbnN0OworICB2b2lkIGluaXRGcm9tQVBJbnQoY29uc3QgZmx0U2VtYW50aWNzICpTZW0sIGNvbnN0IEFQSW50ICZhcGkpOworICB2b2lkIGluaXRGcm9tSGFsZkFQSW50KGNvbnN0IEFQSW50ICZhcGkpOworICB2b2lkIGluaXRGcm9tRmxvYXRBUEludChjb25zdCBBUEludCAmYXBpKTsKKyAgdm9pZCBpbml0RnJvbURvdWJsZUFQSW50KGNvbnN0IEFQSW50ICZhcGkpOworICB2b2lkIGluaXRGcm9tUXVhZHJ1cGxlQVBJbnQoY29uc3QgQVBJbnQgJmFwaSk7CisgIHZvaWQgaW5pdEZyb21GODBMb25nRG91YmxlQVBJbnQoY29uc3QgQVBJbnQgJmFwaSk7CisgIHZvaWQgaW5pdEZyb21QUENEb3VibGVEb3VibGVBUEludChjb25zdCBBUEludCAmYXBpKTsKKworICB2b2lkIGFzc2lnbihjb25zdCBJRUVFRmxvYXQgJik7CisgIHZvaWQgY29weVNpZ25pZmljYW5kKGNvbnN0IElFRUVGbG9hdCAmKTsKKyAgdm9pZCBmcmVlU2lnbmlmaWNhbmQoKTsKKworICAvLy8gTm90ZTogdGhpcyBtdXN0IGJlIHRoZSBmaXJzdCBkYXRhIG1lbWJlci4KKyAgLy8vIFRoZSBzZW1hbnRpY3MgdGhhdCB0aGlzIHZhbHVlIG9iZXlzLgorICBjb25zdCBmbHRTZW1hbnRpY3MgKnNlbWFudGljczsKKworICAvLy8gQSBiaW5hcnkgZnJhY3Rpb24gd2l0aCBhbiBleHBsaWNpdCBpbnRlZ2VyIGJpdC4KKyAgLy8vCisgIC8vLyBUaGUgc2lnbmlmaWNhbmQgbXVzdCBiZSBhdCBsZWFzdCBvbmUgYml0IHdpZGVyIHRoYW4gdGhlIHRhcmdldCBwcmVjaXNpb24uCisgIHVuaW9uIFNpZ25pZmljYW5kIHsKKyAgICBpbnRlZ2VyUGFydCBwYXJ0OworICAgIGludGVnZXJQYXJ0ICpwYXJ0czsKKyAgfSBzaWduaWZpY2FuZDsKKworICAvLy8gVGhlIHNpZ25lZCB1bmJpYXNlZCBleHBvbmVudCBvZiB0aGUgdmFsdWUuCisgIEV4cG9uZW50VHlwZSBleHBvbmVudDsKKworICAvLy8gV2hhdCBraW5kIG9mIGZsb2F0aW5nIHBvaW50IG51bWJlciB0aGlzIGlzLgorICAvLy8KKyAgLy8vIE9ubHkgMiBiaXRzIGFyZSByZXF1aXJlZCwgYnV0IFZpc3VhbFN0dWRpbyBpbmNvcnJlY3RseSBzaWduIGV4dGVuZHMgaXQuCisgIC8vLyBVc2luZyB0aGUgZXh0cmEgYml0IGtlZXBzIGl0IGZyb20gZmFpbGluZyB1bmRlciBWaXN1YWxTdHVkaW8uCisgIGZsdENhdGVnb3J5IGNhdGVnb3J5IDogMzsKKworICAvLy8gU2lnbiBiaXQgb2YgdGhlIG51bWJlci4KKyAgdW5zaWduZWQgaW50IHNpZ24gOiAxOworfTsKKworaGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3QgSUVFRUZsb2F0ICZBcmcpOworaW50IGlsb2diKGNvbnN0IElFRUVGbG9hdCAmQXJnKTsKK0lFRUVGbG9hdCBzY2FsYm4oSUVFRUZsb2F0IFgsIGludCBFeHAsIElFRUVGbG9hdDo6cm91bmRpbmdNb2RlKTsKK0lFRUVGbG9hdCBmcmV4cChjb25zdCBJRUVFRmxvYXQgJlZhbCwgaW50ICZFeHAsIElFRUVGbG9hdDo6cm91bmRpbmdNb2RlIFJNKTsKKworLy8gVGhpcyBtb2RlIGltcGxlbWVudHMgbW9yZSBwcmVjaXNlIGZsb2F0IGluIHRlcm1zIG9mIHR3byBBUEZsb2F0cy4KKy8vIFRoZSBpbnRlcmZhY2UgYW5kIGxheW91dCBpcyBkZXNpZ25lZCBmb3IgYXJiaXRyYXkgdW5kZXJseWluZyBzZW1hbnRpY3MsCisvLyB0aG91Z2ggY3VycmVudGx5IG9ubHkgUFBDRG91YmxlRG91YmxlIHNlbWFudGljcyBhcmUgc3VwcG9ydGVkLCB3aG9zZQorLy8gY29ycmVzcG9uZGluZyB1bmRlcmx5aW5nIHNlbWFudGljcyBhcmUgSUVFRWRvdWJsZS4KK2NsYXNzIERvdWJsZUFQRmxvYXQgZmluYWwgOiBwdWJsaWMgQVBGbG9hdEJhc2UgeworICAvLyBOb3RlOiB0aGlzIG11c3QgYmUgdGhlIGZpcnN0IGRhdGEgbWVtYmVyLgorICBjb25zdCBmbHRTZW1hbnRpY3MgKlNlbWFudGljczsKKyAgc3RkOjp1bmlxdWVfcHRyPEFQRmxvYXRbXT4gRmxvYXRzOworCisgIG9wU3RhdHVzIGFkZEltcGwoY29uc3QgQVBGbG9hdCAmYSwgY29uc3QgQVBGbG9hdCAmYWEsIGNvbnN0IEFQRmxvYXQgJmMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQVBGbG9hdCAmY2MsIHJvdW5kaW5nTW9kZSBSTSk7CisKKyAgb3BTdGF0dXMgYWRkV2l0aFNwZWNpYWwoY29uc3QgRG91YmxlQVBGbG9hdCAmTEhTLCBjb25zdCBEb3VibGVBUEZsb2F0ICZSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZUFQRmxvYXQgJk91dCwgcm91bmRpbmdNb2RlIFJNKTsKKworcHVibGljOgorICBEb3VibGVBUEZsb2F0KGNvbnN0IGZsdFNlbWFudGljcyAmUyk7CisgIERvdWJsZUFQRmxvYXQoY29uc3QgZmx0U2VtYW50aWNzICZTLCB1bmluaXRpYWxpemVkVGFnKTsKKyAgRG91YmxlQVBGbG9hdChjb25zdCBmbHRTZW1hbnRpY3MgJlMsIGludGVnZXJQYXJ0KTsKKyAgRG91YmxlQVBGbG9hdChjb25zdCBmbHRTZW1hbnRpY3MgJlMsIGNvbnN0IEFQSW50ICZJKTsKKyAgRG91YmxlQVBGbG9hdChjb25zdCBmbHRTZW1hbnRpY3MgJlMsIEFQRmxvYXQgJiZGaXJzdCwgQVBGbG9hdCAmJlNlY29uZCk7CisgIERvdWJsZUFQRmxvYXQoY29uc3QgRG91YmxlQVBGbG9hdCAmUkhTKTsKKyAgRG91YmxlQVBGbG9hdChEb3VibGVBUEZsb2F0ICYmUkhTKTsKKworICBEb3VibGVBUEZsb2F0ICZvcGVyYXRvcj0oY29uc3QgRG91YmxlQVBGbG9hdCAmUkhTKTsKKworICBEb3VibGVBUEZsb2F0ICZvcGVyYXRvcj0oRG91YmxlQVBGbG9hdCAmJlJIUykgeworICAgIGlmICh0aGlzICE9ICZSSFMpIHsKKyAgICAgIHRoaXMtPn5Eb3VibGVBUEZsb2F0KCk7CisgICAgICBuZXcgKHRoaXMpIERvdWJsZUFQRmxvYXQoc3RkOjptb3ZlKFJIUykpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBib29sIG5lZWRzQ2xlYW51cCgpIGNvbnN0IHsgcmV0dXJuIEZsb2F0cyAhPSBudWxscHRyOyB9CisKKyAgQVBGbG9hdCAmZ2V0Rmlyc3QoKSB7IHJldHVybiBGbG9hdHNbMF07IH0KKyAgY29uc3QgQVBGbG9hdCAmZ2V0Rmlyc3QoKSBjb25zdCB7IHJldHVybiBGbG9hdHNbMF07IH0KKyAgQVBGbG9hdCAmZ2V0U2Vjb25kKCkgeyByZXR1cm4gRmxvYXRzWzFdOyB9CisgIGNvbnN0IEFQRmxvYXQgJmdldFNlY29uZCgpIGNvbnN0IHsgcmV0dXJuIEZsb2F0c1sxXTsgfQorCisgIG9wU3RhdHVzIGFkZChjb25zdCBEb3VibGVBUEZsb2F0ICZSSFMsIHJvdW5kaW5nTW9kZSBSTSk7CisgIG9wU3RhdHVzIHN1YnRyYWN0KGNvbnN0IERvdWJsZUFQRmxvYXQgJlJIUywgcm91bmRpbmdNb2RlIFJNKTsKKyAgb3BTdGF0dXMgbXVsdGlwbHkoY29uc3QgRG91YmxlQVBGbG9hdCAmUkhTLCByb3VuZGluZ01vZGUgUk0pOworICBvcFN0YXR1cyBkaXZpZGUoY29uc3QgRG91YmxlQVBGbG9hdCAmUkhTLCByb3VuZGluZ01vZGUgUk0pOworICBvcFN0YXR1cyByZW1haW5kZXIoY29uc3QgRG91YmxlQVBGbG9hdCAmUkhTKTsKKyAgb3BTdGF0dXMgbW9kKGNvbnN0IERvdWJsZUFQRmxvYXQgJlJIUyk7CisgIG9wU3RhdHVzIGZ1c2VkTXVsdGlwbHlBZGQoY29uc3QgRG91YmxlQVBGbG9hdCAmTXVsdGlwbGljYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvdWJsZUFQRmxvYXQgJkFkZGVuZCwgcm91bmRpbmdNb2RlIFJNKTsKKyAgb3BTdGF0dXMgcm91bmRUb0ludGVncmFsKHJvdW5kaW5nTW9kZSBSTSk7CisgIHZvaWQgY2hhbmdlU2lnbigpOworICBjbXBSZXN1bHQgY29tcGFyZUFic29sdXRlVmFsdWUoY29uc3QgRG91YmxlQVBGbG9hdCAmUkhTKSBjb25zdDsKKworICBmbHRDYXRlZ29yeSBnZXRDYXRlZ29yeSgpIGNvbnN0OworICBib29sIGlzTmVnYXRpdmUoKSBjb25zdDsKKworICB2b2lkIG1ha2VJbmYoYm9vbCBOZWcpOworICB2b2lkIG1ha2VaZXJvKGJvb2wgTmVnKTsKKyAgdm9pZCBtYWtlTGFyZ2VzdChib29sIE5lZyk7CisgIHZvaWQgbWFrZVNtYWxsZXN0KGJvb2wgTmVnKTsKKyAgdm9pZCBtYWtlU21hbGxlc3ROb3JtYWxpemVkKGJvb2wgTmVnKTsKKyAgdm9pZCBtYWtlTmFOKGJvb2wgU05hTiwgYm9vbCBOZWcsIGNvbnN0IEFQSW50ICpmaWxsKTsKKworICBjbXBSZXN1bHQgY29tcGFyZShjb25zdCBEb3VibGVBUEZsb2F0ICZSSFMpIGNvbnN0OworICBib29sIGJpdHdpc2VJc0VxdWFsKGNvbnN0IERvdWJsZUFQRmxvYXQgJlJIUykgY29uc3Q7CisgIEFQSW50IGJpdGNhc3RUb0FQSW50KCkgY29uc3Q7CisgIG9wU3RhdHVzIGNvbnZlcnRGcm9tU3RyaW5nKFN0cmluZ1JlZiwgcm91bmRpbmdNb2RlKTsKKyAgb3BTdGF0dXMgbmV4dChib29sIG5leHREb3duKTsKKworICBvcFN0YXR1cyBjb252ZXJ0VG9JbnRlZ2VyKE11dGFibGVBcnJheVJlZjxpbnRlZ2VyUGFydD4gSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IFdpZHRoLCBib29sIElzU2lnbmVkLCByb3VuZGluZ01vZGUgUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqSXNFeGFjdCkgY29uc3Q7CisgIG9wU3RhdHVzIGNvbnZlcnRGcm9tQVBJbnQoY29uc3QgQVBJbnQgJklucHV0LCBib29sIElzU2lnbmVkLCByb3VuZGluZ01vZGUgUk0pOworICBvcFN0YXR1cyBjb252ZXJ0RnJvbVNpZ25FeHRlbmRlZEludGVnZXIoY29uc3QgaW50ZWdlclBhcnQgKklucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IElucHV0U2l6ZSwgYm9vbCBJc1NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kaW5nTW9kZSBSTSk7CisgIG9wU3RhdHVzIGNvbnZlcnRGcm9tWmVyb0V4dGVuZGVkSW50ZWdlcihjb25zdCBpbnRlZ2VyUGFydCAqSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgSW5wdXRTaXplLCBib29sIElzU2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRpbmdNb2RlIFJNKTsKKyAgdW5zaWduZWQgaW50IGNvbnZlcnRUb0hleFN0cmluZyhjaGFyICpEU1QsIHVuc2lnbmVkIGludCBIZXhEaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVcHBlckNhc2UsIHJvdW5kaW5nTW9kZSBSTSkgY29uc3Q7CisKKyAgYm9vbCBpc0Rlbm9ybWFsKCkgY29uc3Q7CisgIGJvb2wgaXNTbWFsbGVzdCgpIGNvbnN0OworICBib29sIGlzTGFyZ2VzdCgpIGNvbnN0OworICBib29sIGlzSW50ZWdlcigpIGNvbnN0OworCisgIHZvaWQgdG9TdHJpbmcoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZTdHIsIHVuc2lnbmVkIEZvcm1hdFByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBGb3JtYXRNYXhQYWRkaW5nLCBib29sIFRydW5jYXRlWmVybyA9IHRydWUpIGNvbnN0OworCisgIGJvb2wgZ2V0RXhhY3RJbnZlcnNlKEFQRmxvYXQgKmludikgY29uc3Q7CisKKyAgZnJpZW5kIGludCBpbG9nYihjb25zdCBEb3VibGVBUEZsb2F0ICZBcmcpOworICBmcmllbmQgRG91YmxlQVBGbG9hdCBzY2FsYm4oRG91YmxlQVBGbG9hdCBYLCBpbnQgRXhwLCByb3VuZGluZ01vZGUpOworICBmcmllbmQgRG91YmxlQVBGbG9hdCBmcmV4cChjb25zdCBEb3VibGVBUEZsb2F0ICZYLCBpbnQgJkV4cCwgcm91bmRpbmdNb2RlKTsKKyAgZnJpZW5kIGhhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IERvdWJsZUFQRmxvYXQgJkFyZyk7Cit9OworCitoYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBEb3VibGVBUEZsb2F0ICZBcmcpOworCit9IC8vIEVuZCBkZXRhaWwgbmFtZXNwYWNlCisKKy8vIFRoaXMgaXMgYSBpbnRlcmZhY2UgY2xhc3MgdGhhdCBpcyBjdXJyZW50bHkgZm9yd2FyZGluZyBmdW5jdGlvbmFsaXRpZXMgZnJvbQorLy8gZGV0YWlsOjpJRUVFRmxvYXQuCitjbGFzcyBBUEZsb2F0IDogcHVibGljIEFQRmxvYXRCYXNlIHsKKyAgdHlwZWRlZiBkZXRhaWw6OklFRUVGbG9hdCBJRUVFRmxvYXQ7CisgIHR5cGVkZWYgZGV0YWlsOjpEb3VibGVBUEZsb2F0IERvdWJsZUFQRmxvYXQ7CisKKyAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxJRUVFRmxvYXQ+Ojp2YWx1ZSwgIiIpOworCisgIHVuaW9uIFN0b3JhZ2UgeworICAgIGNvbnN0IGZsdFNlbWFudGljcyAqc2VtYW50aWNzOworICAgIElFRUVGbG9hdCBJRUVFOworICAgIERvdWJsZUFQRmxvYXQgRG91YmxlOworCisgICAgZXhwbGljaXQgU3RvcmFnZShJRUVFRmxvYXQgRiwgY29uc3QgZmx0U2VtYW50aWNzICZTKTsKKyAgICBleHBsaWNpdCBTdG9yYWdlKERvdWJsZUFQRmxvYXQgRiwgY29uc3QgZmx0U2VtYW50aWNzICZTKQorICAgICAgICA6IERvdWJsZShzdGQ6Om1vdmUoRikpIHsKKyAgICAgIGFzc2VydCgmUyA9PSAmUFBDRG91YmxlRG91YmxlKCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdUeXBlcz4KKyAgICBTdG9yYWdlKGNvbnN0IGZsdFNlbWFudGljcyAmU2VtYW50aWNzLCBBcmdUeXBlcyAmJi4uLiBBcmdzKSB7CisgICAgICBpZiAodXNlc0xheW91dDxJRUVFRmxvYXQ+KFNlbWFudGljcykpIHsKKyAgICAgICAgbmV3ICgmSUVFRSkgSUVFRUZsb2F0KFNlbWFudGljcywgc3RkOjpmb3J3YXJkPEFyZ1R5cGVzPihBcmdzKS4uLik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmICh1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KFNlbWFudGljcykpIHsKKyAgICAgICAgbmV3ICgmRG91YmxlKSBEb3VibGVBUEZsb2F0KFNlbWFudGljcywgc3RkOjpmb3J3YXJkPEFyZ1R5cGVzPihBcmdzKS4uLik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgc2VtYW50aWNzIik7CisgICAgfQorCisgICAgflN0b3JhZ2UoKSB7CisgICAgICBpZiAodXNlc0xheW91dDxJRUVFRmxvYXQ+KCpzZW1hbnRpY3MpKSB7CisgICAgICAgIElFRUUufklFRUVGbG9hdCgpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAodXNlc0xheW91dDxEb3VibGVBUEZsb2F0Pigqc2VtYW50aWNzKSkgeworICAgICAgICBEb3VibGUufkRvdWJsZUFQRmxvYXQoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBzZW1hbnRpY3MiKTsKKyAgICB9CisKKyAgICBTdG9yYWdlKGNvbnN0IFN0b3JhZ2UgJlJIUykgeworICAgICAgaWYgKHVzZXNMYXlvdXQ8SUVFRUZsb2F0PigqUkhTLnNlbWFudGljcykpIHsKKyAgICAgICAgbmV3ICh0aGlzKSBJRUVFRmxvYXQoUkhTLklFRUUpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAodXNlc0xheW91dDxEb3VibGVBUEZsb2F0PigqUkhTLnNlbWFudGljcykpIHsKKyAgICAgICAgbmV3ICh0aGlzKSBEb3VibGVBUEZsb2F0KFJIUy5Eb3VibGUpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHNlbWFudGljcyIpOworICAgIH0KKworICAgIFN0b3JhZ2UoU3RvcmFnZSAmJlJIUykgeworICAgICAgaWYgKHVzZXNMYXlvdXQ8SUVFRUZsb2F0PigqUkhTLnNlbWFudGljcykpIHsKKyAgICAgICAgbmV3ICh0aGlzKSBJRUVFRmxvYXQoc3RkOjptb3ZlKFJIUy5JRUVFKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmICh1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KCpSSFMuc2VtYW50aWNzKSkgeworICAgICAgICBuZXcgKHRoaXMpIERvdWJsZUFQRmxvYXQoc3RkOjptb3ZlKFJIUy5Eb3VibGUpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBzZW1hbnRpY3MiKTsKKyAgICB9CisKKyAgICBTdG9yYWdlICZvcGVyYXRvcj0oY29uc3QgU3RvcmFnZSAmUkhTKSB7CisgICAgICBpZiAodXNlc0xheW91dDxJRUVFRmxvYXQ+KCpzZW1hbnRpY3MpICYmCisgICAgICAgICAgdXNlc0xheW91dDxJRUVFRmxvYXQ+KCpSSFMuc2VtYW50aWNzKSkgeworICAgICAgICBJRUVFID0gUkhTLklFRUU7CisgICAgICB9IGVsc2UgaWYgKHVzZXNMYXlvdXQ8RG91YmxlQVBGbG9hdD4oKnNlbWFudGljcykgJiYKKyAgICAgICAgICAgICAgICAgdXNlc0xheW91dDxEb3VibGVBUEZsb2F0PigqUkhTLnNlbWFudGljcykpIHsKKyAgICAgICAgRG91YmxlID0gUkhTLkRvdWJsZTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcyAhPSAmUkhTKSB7CisgICAgICAgIHRoaXMtPn5TdG9yYWdlKCk7CisgICAgICAgIG5ldyAodGhpcykgU3RvcmFnZShSSFMpOworICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFN0b3JhZ2UgJm9wZXJhdG9yPShTdG9yYWdlICYmUkhTKSB7CisgICAgICBpZiAodXNlc0xheW91dDxJRUVFRmxvYXQ+KCpzZW1hbnRpY3MpICYmCisgICAgICAgICAgdXNlc0xheW91dDxJRUVFRmxvYXQ+KCpSSFMuc2VtYW50aWNzKSkgeworICAgICAgICBJRUVFID0gc3RkOjptb3ZlKFJIUy5JRUVFKTsKKyAgICAgIH0gZWxzZSBpZiAodXNlc0xheW91dDxEb3VibGVBUEZsb2F0Pigqc2VtYW50aWNzKSAmJgorICAgICAgICAgICAgICAgICB1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KCpSSFMuc2VtYW50aWNzKSkgeworICAgICAgICBEb3VibGUgPSBzdGQ6Om1vdmUoUkhTLkRvdWJsZSk7CisgICAgICB9IGVsc2UgaWYgKHRoaXMgIT0gJlJIUykgeworICAgICAgICB0aGlzLT5+U3RvcmFnZSgpOworICAgICAgICBuZXcgKHRoaXMpIFN0b3JhZ2Uoc3RkOjptb3ZlKFJIUykpOworICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgfSBVOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGF0aWMgYm9vbCB1c2VzTGF5b3V0KGNvbnN0IGZsdFNlbWFudGljcyAmU2VtYW50aWNzKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8VCwgSUVFRUZsb2F0Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBEb3VibGVBUEZsb2F0Pjo6dmFsdWUsICIiKTsKKyAgICBpZiAoc3RkOjppc19zYW1lPFQsIERvdWJsZUFQRmxvYXQ+Ojp2YWx1ZSkgeworICAgICAgcmV0dXJuICZTZW1hbnRpY3MgPT0gJlBQQ0RvdWJsZURvdWJsZSgpOworICAgIH0KKyAgICByZXR1cm4gJlNlbWFudGljcyAhPSAmUFBDRG91YmxlRG91YmxlKCk7CisgIH0KKworICBJRUVFRmxvYXQgJmdldElFRUUoKSB7CisgICAgaWYgKHVzZXNMYXlvdXQ8SUVFRUZsb2F0PigqVS5zZW1hbnRpY3MpKQorICAgICAgcmV0dXJuIFUuSUVFRTsKKyAgICBpZiAodXNlc0xheW91dDxEb3VibGVBUEZsb2F0PigqVS5zZW1hbnRpY3MpKQorICAgICAgcmV0dXJuIFUuRG91YmxlLmdldEZpcnN0KCkuVS5JRUVFOworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgc2VtYW50aWNzIik7CisgIH0KKworICBjb25zdCBJRUVFRmxvYXQgJmdldElFRUUoKSBjb25zdCB7CisgICAgaWYgKHVzZXNMYXlvdXQ8SUVFRUZsb2F0PigqVS5zZW1hbnRpY3MpKQorICAgICAgcmV0dXJuIFUuSUVFRTsKKyAgICBpZiAodXNlc0xheW91dDxEb3VibGVBUEZsb2F0PigqVS5zZW1hbnRpY3MpKQorICAgICAgcmV0dXJuIFUuRG91YmxlLmdldEZpcnN0KCkuVS5JRUVFOworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgc2VtYW50aWNzIik7CisgIH0KKworICB2b2lkIG1ha2VaZXJvKGJvb2wgTmVnKSB7IEFQRkxPQVRfRElTUEFUQ0hfT05fU0VNQU5USUNTKG1ha2VaZXJvKE5lZykpOyB9CisKKyAgdm9pZCBtYWtlSW5mKGJvb2wgTmVnKSB7IEFQRkxPQVRfRElTUEFUQ0hfT05fU0VNQU5USUNTKG1ha2VJbmYoTmVnKSk7IH0KKworICB2b2lkIG1ha2VOYU4oYm9vbCBTTmFOLCBib29sIE5lZywgY29uc3QgQVBJbnQgKmZpbGwpIHsKKyAgICBBUEZMT0FUX0RJU1BBVENIX09OX1NFTUFOVElDUyhtYWtlTmFOKFNOYU4sIE5lZywgZmlsbCkpOworICB9CisKKyAgdm9pZCBtYWtlTGFyZ2VzdChib29sIE5lZykgeworICAgIEFQRkxPQVRfRElTUEFUQ0hfT05fU0VNQU5USUNTKG1ha2VMYXJnZXN0KE5lZykpOworICB9CisKKyAgdm9pZCBtYWtlU21hbGxlc3QoYm9vbCBOZWcpIHsKKyAgICBBUEZMT0FUX0RJU1BBVENIX09OX1NFTUFOVElDUyhtYWtlU21hbGxlc3QoTmVnKSk7CisgIH0KKworICB2b2lkIG1ha2VTbWFsbGVzdE5vcm1hbGl6ZWQoYm9vbCBOZWcpIHsKKyAgICBBUEZMT0FUX0RJU1BBVENIX09OX1NFTUFOVElDUyhtYWtlU21hbGxlc3ROb3JtYWxpemVkKE5lZykpOworICB9CisKKyAgLy8gRklYTUU6IFRoaXMgaXMgZHVlIHRvIGNsYW5nIDMuMyAob3Igb2xkZXIgdmVyc2lvbikgYWx3YXlzIGNoZWNrcyBmb3IgdGhlCisgIC8vIGRlZmF1bHQgY29uc3RydWN0b3IgaW4gYW4gYXJyYXkgYWdncmVnYXRlIGluaXRpYWxpemF0aW9uLCBldmVuIGlmIG5vCisgIC8vIGVsZW1lbnRzIGluIHRoZSBhcnJheSBpcyBkZWZhdWx0IGluaXRpYWxpemVkLgorICBBUEZsb2F0KCkgOiBVKElFRUVkb3VibGUoKSkgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBvbGQgY2xhbmcuIik7CisgIH0KKworICBleHBsaWNpdCBBUEZsb2F0KElFRUVGbG9hdCBGLCBjb25zdCBmbHRTZW1hbnRpY3MgJlMpIDogVShzdGQ6Om1vdmUoRiksIFMpIHt9CisgIGV4cGxpY2l0IEFQRmxvYXQoRG91YmxlQVBGbG9hdCBGLCBjb25zdCBmbHRTZW1hbnRpY3MgJlMpCisgICAgICA6IFUoc3RkOjptb3ZlKEYpLCBTKSB7fQorCisgIGNtcFJlc3VsdCBjb21wYXJlQWJzb2x1dGVWYWx1ZShjb25zdCBBUEZsb2F0ICZSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoJmdldFNlbWFudGljcygpID09ICZSSFMuZ2V0U2VtYW50aWNzKCkgJiYKKyAgICAgICAgICAgIlNob3VsZCBvbmx5IGNvbXBhcmUgQVBGbG9hdHMgd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MiKTsKKyAgICBpZiAodXNlc0xheW91dDxJRUVFRmxvYXQ+KGdldFNlbWFudGljcygpKSkKKyAgICAgIHJldHVybiBVLklFRUUuY29tcGFyZUFic29sdXRlVmFsdWUoUkhTLlUuSUVFRSk7CisgICAgaWYgKHVzZXNMYXlvdXQ8RG91YmxlQVBGbG9hdD4oZ2V0U2VtYW50aWNzKCkpKQorICAgICAgcmV0dXJuIFUuRG91YmxlLmNvbXBhcmVBYnNvbHV0ZVZhbHVlKFJIUy5VLkRvdWJsZSk7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBzZW1hbnRpY3MiKTsKKyAgfQorCitwdWJsaWM6CisgIEFQRmxvYXQoY29uc3QgZmx0U2VtYW50aWNzICZTZW1hbnRpY3MpIDogVShTZW1hbnRpY3MpIHt9CisgIEFQRmxvYXQoY29uc3QgZmx0U2VtYW50aWNzICZTZW1hbnRpY3MsIFN0cmluZ1JlZiBTKTsKKyAgQVBGbG9hdChjb25zdCBmbHRTZW1hbnRpY3MgJlNlbWFudGljcywgaW50ZWdlclBhcnQgSSkgOiBVKFNlbWFudGljcywgSSkge30KKyAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgY29uc3RydWN0b3IuIFRoaXMgaXNuJ3QgZmFzdGVyIHRoYW4gdGhlIGZpcnN0IG9uZS4KKyAgQVBGbG9hdChjb25zdCBmbHRTZW1hbnRpY3MgJlNlbWFudGljcywgdW5pbml0aWFsaXplZFRhZykKKyAgICAgIDogVShTZW1hbnRpY3MsIHVuaW5pdGlhbGl6ZWQpIHt9CisgIEFQRmxvYXQoY29uc3QgZmx0U2VtYW50aWNzICZTZW1hbnRpY3MsIGNvbnN0IEFQSW50ICZJKSA6IFUoU2VtYW50aWNzLCBJKSB7fQorICBleHBsaWNpdCBBUEZsb2F0KGRvdWJsZSBkKSA6IFUoSUVFRUZsb2F0KGQpLCBJRUVFZG91YmxlKCkpIHt9CisgIGV4cGxpY2l0IEFQRmxvYXQoZmxvYXQgZikgOiBVKElFRUVGbG9hdChmKSwgSUVFRXNpbmdsZSgpKSB7fQorICBBUEZsb2F0KGNvbnN0IEFQRmxvYXQgJlJIUykgPSBkZWZhdWx0OworICBBUEZsb2F0KEFQRmxvYXQgJiZSSFMpID0gZGVmYXVsdDsKKworICB+QVBGbG9hdCgpID0gZGVmYXVsdDsKKworICBib29sIG5lZWRzQ2xlYW51cCgpIGNvbnN0IHsgQVBGTE9BVF9ESVNQQVRDSF9PTl9TRU1BTlRJQ1MobmVlZHNDbGVhbnVwKCkpOyB9CisKKyAgLy8vIEZhY3RvcnkgZm9yIFBvc2l0aXZlIGFuZCBOZWdhdGl2ZSBaZXJvLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOZWdhdGl2ZSBUcnVlIGlmZiB0aGUgbnVtYmVyIHNob3VsZCBiZSBuZWdhdGl2ZS4KKyAgc3RhdGljIEFQRmxvYXQgZ2V0WmVybyhjb25zdCBmbHRTZW1hbnRpY3MgJlNlbSwgYm9vbCBOZWdhdGl2ZSA9IGZhbHNlKSB7CisgICAgQVBGbG9hdCBWYWwoU2VtLCB1bmluaXRpYWxpemVkKTsKKyAgICBWYWwubWFrZVplcm8oTmVnYXRpdmUpOworICAgIHJldHVybiBWYWw7CisgIH0KKworICAvLy8gRmFjdG9yeSBmb3IgUG9zaXRpdmUgYW5kIE5lZ2F0aXZlIEluZmluaXR5LgorICAvLy8KKyAgLy8vIFxwYXJhbSBOZWdhdGl2ZSBUcnVlIGlmZiB0aGUgbnVtYmVyIHNob3VsZCBiZSBuZWdhdGl2ZS4KKyAgc3RhdGljIEFQRmxvYXQgZ2V0SW5mKGNvbnN0IGZsdFNlbWFudGljcyAmU2VtLCBib29sIE5lZ2F0aXZlID0gZmFsc2UpIHsKKyAgICBBUEZsb2F0IFZhbChTZW0sIHVuaW5pdGlhbGl6ZWQpOworICAgIFZhbC5tYWtlSW5mKE5lZ2F0aXZlKTsKKyAgICByZXR1cm4gVmFsOworICB9CisKKyAgLy8vIEZhY3RvcnkgZm9yIE5hTiB2YWx1ZXMuCisgIC8vLworICAvLy8gXHBhcmFtIE5lZ2F0aXZlIC0gVHJ1ZSBpZmYgdGhlIE5hTiBnZW5lcmF0ZWQgc2hvdWxkIGJlIG5lZ2F0aXZlLgorICAvLy8gXHBhcmFtIHR5cGUgLSBUaGUgdW5zcGVjaWZpZWQgZmlsbCBiaXRzIGZvciBjcmVhdGluZyB0aGUgTmFOLCAwIGJ5CisgIC8vLyBkZWZhdWx0LiAgVGhlIHZhbHVlIGlzIHRydW5jYXRlZCBhcyBuZWNlc3NhcnkuCisgIHN0YXRpYyBBUEZsb2F0IGdldE5hTihjb25zdCBmbHRTZW1hbnRpY3MgJlNlbSwgYm9vbCBOZWdhdGl2ZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdHlwZSA9IDApIHsKKyAgICBpZiAodHlwZSkgeworICAgICAgQVBJbnQgZmlsbCg2NCwgdHlwZSk7CisgICAgICByZXR1cm4gZ2V0UU5hTihTZW0sIE5lZ2F0aXZlLCAmZmlsbCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBnZXRRTmFOKFNlbSwgTmVnYXRpdmUsIG51bGxwdHIpOworICAgIH0KKyAgfQorCisgIC8vLyBGYWN0b3J5IGZvciBRTmFOIHZhbHVlcy4KKyAgc3RhdGljIEFQRmxvYXQgZ2V0UU5hTihjb25zdCBmbHRTZW1hbnRpY3MgJlNlbSwgYm9vbCBOZWdhdGl2ZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQSW50ICpwYXlsb2FkID0gbnVsbHB0cikgeworICAgIEFQRmxvYXQgVmFsKFNlbSwgdW5pbml0aWFsaXplZCk7CisgICAgVmFsLm1ha2VOYU4oZmFsc2UsIE5lZ2F0aXZlLCBwYXlsb2FkKTsKKyAgICByZXR1cm4gVmFsOworICB9CisKKyAgLy8vIEZhY3RvcnkgZm9yIFNOYU4gdmFsdWVzLgorICBzdGF0aWMgQVBGbG9hdCBnZXRTTmFOKGNvbnN0IGZsdFNlbWFudGljcyAmU2VtLCBib29sIE5lZ2F0aXZlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBJbnQgKnBheWxvYWQgPSBudWxscHRyKSB7CisgICAgQVBGbG9hdCBWYWwoU2VtLCB1bmluaXRpYWxpemVkKTsKKyAgICBWYWwubWFrZU5hTih0cnVlLCBOZWdhdGl2ZSwgcGF5bG9hZCk7CisgICAgcmV0dXJuIFZhbDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBsYXJnZXN0IGZpbml0ZSBudW1iZXIgaW4gdGhlIGdpdmVuIHNlbWFudGljcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gTmVnYXRpdmUgLSBUcnVlIGlmZiB0aGUgbnVtYmVyIHNob3VsZCBiZSBuZWdhdGl2ZQorICBzdGF0aWMgQVBGbG9hdCBnZXRMYXJnZXN0KGNvbnN0IGZsdFNlbWFudGljcyAmU2VtLCBib29sIE5lZ2F0aXZlID0gZmFsc2UpIHsKKyAgICBBUEZsb2F0IFZhbChTZW0sIHVuaW5pdGlhbGl6ZWQpOworICAgIFZhbC5tYWtlTGFyZ2VzdChOZWdhdGl2ZSk7CisgICAgcmV0dXJuIFZhbDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBzbWFsbGVzdCAoYnkgbWFnbml0dWRlKSBmaW5pdGUgbnVtYmVyIGluIHRoZSBnaXZlbiBzZW1hbnRpY3MuCisgIC8vLyBNaWdodCBiZSBkZW5vcm1hbGl6ZWQsIHdoaWNoIGltcGxpZXMgYSByZWxhdGl2ZSBsb3NzIG9mIHByZWNpc2lvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gTmVnYXRpdmUgLSBUcnVlIGlmZiB0aGUgbnVtYmVyIHNob3VsZCBiZSBuZWdhdGl2ZQorICBzdGF0aWMgQVBGbG9hdCBnZXRTbWFsbGVzdChjb25zdCBmbHRTZW1hbnRpY3MgJlNlbSwgYm9vbCBOZWdhdGl2ZSA9IGZhbHNlKSB7CisgICAgQVBGbG9hdCBWYWwoU2VtLCB1bmluaXRpYWxpemVkKTsKKyAgICBWYWwubWFrZVNtYWxsZXN0KE5lZ2F0aXZlKTsKKyAgICByZXR1cm4gVmFsOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHNtYWxsZXN0IChieSBtYWduaXR1ZGUpIG5vcm1hbGl6ZWQgZmluaXRlIG51bWJlciBpbiB0aGUgZ2l2ZW4KKyAgLy8vIHNlbWFudGljcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gTmVnYXRpdmUgLSBUcnVlIGlmZiB0aGUgbnVtYmVyIHNob3VsZCBiZSBuZWdhdGl2ZQorICBzdGF0aWMgQVBGbG9hdCBnZXRTbWFsbGVzdE5vcm1hbGl6ZWQoY29uc3QgZmx0U2VtYW50aWNzICZTZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE5lZ2F0aXZlID0gZmFsc2UpIHsKKyAgICBBUEZsb2F0IFZhbChTZW0sIHVuaW5pdGlhbGl6ZWQpOworICAgIFZhbC5tYWtlU21hbGxlc3ROb3JtYWxpemVkKE5lZ2F0aXZlKTsKKyAgICByZXR1cm4gVmFsOworICB9CisKKyAgLy8vIFJldHVybnMgYSBmbG9hdCB3aGljaCBpcyBiaXRjYXN0ZWQgZnJvbSBhbiBhbGwgb25lIHZhbHVlIGludC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQml0V2lkdGggLSBTZWxlY3QgZmxvYXQgdHlwZQorICAvLy8gXHBhcmFtIGlzSUVFRSAgIC0gSWYgMTI4IGJpdCBudW1iZXIsIHNlbGVjdCBiZXR3ZWVuIFBQQyBhbmQgSUVFRQorICBzdGF0aWMgQVBGbG9hdCBnZXRBbGxPbmVzVmFsdWUodW5zaWduZWQgQml0V2lkdGgsIGJvb2wgaXNJRUVFID0gZmFsc2UpOworCisgIC8vLyBVc2VkIHRvIGluc2VydCBBUEZsb2F0IG9iamVjdHMsIG9yIG9iamVjdHMgdGhhdCBjb250YWluIEFQRmxvYXQgb2JqZWN0cywKKyAgLy8vIGludG8gRm9sZGluZ1NldHMuCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZOSUQpIGNvbnN0OworCisgIG9wU3RhdHVzIGFkZChjb25zdCBBUEZsb2F0ICZSSFMsIHJvdW5kaW5nTW9kZSBSTSkgeworICAgIGFzc2VydCgmZ2V0U2VtYW50aWNzKCkgPT0gJlJIUy5nZXRTZW1hbnRpY3MoKSAmJgorICAgICAgICAgICAiU2hvdWxkIG9ubHkgY2FsbCBvbiB0d28gQVBGbG9hdHMgd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MiKTsKKyAgICBpZiAodXNlc0xheW91dDxJRUVFRmxvYXQ+KGdldFNlbWFudGljcygpKSkKKyAgICAgIHJldHVybiBVLklFRUUuYWRkKFJIUy5VLklFRUUsIFJNKTsKKyAgICBpZiAodXNlc0xheW91dDxEb3VibGVBUEZsb2F0PihnZXRTZW1hbnRpY3MoKSkpCisgICAgICByZXR1cm4gVS5Eb3VibGUuYWRkKFJIUy5VLkRvdWJsZSwgUk0pOworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgc2VtYW50aWNzIik7CisgIH0KKyAgb3BTdGF0dXMgc3VidHJhY3QoY29uc3QgQVBGbG9hdCAmUkhTLCByb3VuZGluZ01vZGUgUk0pIHsKKyAgICBhc3NlcnQoJmdldFNlbWFudGljcygpID09ICZSSFMuZ2V0U2VtYW50aWNzKCkgJiYKKyAgICAgICAgICAgIlNob3VsZCBvbmx5IGNhbGwgb24gdHdvIEFQRmxvYXRzIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIik7CisgICAgaWYgKHVzZXNMYXlvdXQ8SUVFRUZsb2F0PihnZXRTZW1hbnRpY3MoKSkpCisgICAgICByZXR1cm4gVS5JRUVFLnN1YnRyYWN0KFJIUy5VLklFRUUsIFJNKTsKKyAgICBpZiAodXNlc0xheW91dDxEb3VibGVBUEZsb2F0PihnZXRTZW1hbnRpY3MoKSkpCisgICAgICByZXR1cm4gVS5Eb3VibGUuc3VidHJhY3QoUkhTLlUuRG91YmxlLCBSTSk7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBzZW1hbnRpY3MiKTsKKyAgfQorICBvcFN0YXR1cyBtdWx0aXBseShjb25zdCBBUEZsb2F0ICZSSFMsIHJvdW5kaW5nTW9kZSBSTSkgeworICAgIGFzc2VydCgmZ2V0U2VtYW50aWNzKCkgPT0gJlJIUy5nZXRTZW1hbnRpY3MoKSAmJgorICAgICAgICAgICAiU2hvdWxkIG9ubHkgY2FsbCBvbiB0d28gQVBGbG9hdHMgd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MiKTsKKyAgICBpZiAodXNlc0xheW91dDxJRUVFRmxvYXQ+KGdldFNlbWFudGljcygpKSkKKyAgICAgIHJldHVybiBVLklFRUUubXVsdGlwbHkoUkhTLlUuSUVFRSwgUk0pOworICAgIGlmICh1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KGdldFNlbWFudGljcygpKSkKKyAgICAgIHJldHVybiBVLkRvdWJsZS5tdWx0aXBseShSSFMuVS5Eb3VibGUsIFJNKTsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHNlbWFudGljcyIpOworICB9CisgIG9wU3RhdHVzIGRpdmlkZShjb25zdCBBUEZsb2F0ICZSSFMsIHJvdW5kaW5nTW9kZSBSTSkgeworICAgIGFzc2VydCgmZ2V0U2VtYW50aWNzKCkgPT0gJlJIUy5nZXRTZW1hbnRpY3MoKSAmJgorICAgICAgICAgICAiU2hvdWxkIG9ubHkgY2FsbCBvbiB0d28gQVBGbG9hdHMgd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MiKTsKKyAgICBpZiAodXNlc0xheW91dDxJRUVFRmxvYXQ+KGdldFNlbWFudGljcygpKSkKKyAgICAgIHJldHVybiBVLklFRUUuZGl2aWRlKFJIUy5VLklFRUUsIFJNKTsKKyAgICBpZiAodXNlc0xheW91dDxEb3VibGVBUEZsb2F0PihnZXRTZW1hbnRpY3MoKSkpCisgICAgICByZXR1cm4gVS5Eb3VibGUuZGl2aWRlKFJIUy5VLkRvdWJsZSwgUk0pOworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgc2VtYW50aWNzIik7CisgIH0KKyAgb3BTdGF0dXMgcmVtYWluZGVyKGNvbnN0IEFQRmxvYXQgJlJIUykgeworICAgIGFzc2VydCgmZ2V0U2VtYW50aWNzKCkgPT0gJlJIUy5nZXRTZW1hbnRpY3MoKSAmJgorICAgICAgICAgICAiU2hvdWxkIG9ubHkgY2FsbCBvbiB0d28gQVBGbG9hdHMgd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MiKTsKKyAgICBpZiAodXNlc0xheW91dDxJRUVFRmxvYXQ+KGdldFNlbWFudGljcygpKSkKKyAgICAgIHJldHVybiBVLklFRUUucmVtYWluZGVyKFJIUy5VLklFRUUpOworICAgIGlmICh1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KGdldFNlbWFudGljcygpKSkKKyAgICAgIHJldHVybiBVLkRvdWJsZS5yZW1haW5kZXIoUkhTLlUuRG91YmxlKTsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHNlbWFudGljcyIpOworICB9CisgIG9wU3RhdHVzIG1vZChjb25zdCBBUEZsb2F0ICZSSFMpIHsKKyAgICBhc3NlcnQoJmdldFNlbWFudGljcygpID09ICZSSFMuZ2V0U2VtYW50aWNzKCkgJiYKKyAgICAgICAgICAgIlNob3VsZCBvbmx5IGNhbGwgb24gdHdvIEFQRmxvYXRzIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIik7CisgICAgaWYgKHVzZXNMYXlvdXQ8SUVFRUZsb2F0PihnZXRTZW1hbnRpY3MoKSkpCisgICAgICByZXR1cm4gVS5JRUVFLm1vZChSSFMuVS5JRUVFKTsKKyAgICBpZiAodXNlc0xheW91dDxEb3VibGVBUEZsb2F0PihnZXRTZW1hbnRpY3MoKSkpCisgICAgICByZXR1cm4gVS5Eb3VibGUubW9kKFJIUy5VLkRvdWJsZSk7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBzZW1hbnRpY3MiKTsKKyAgfQorICBvcFN0YXR1cyBmdXNlZE11bHRpcGx5QWRkKGNvbnN0IEFQRmxvYXQgJk11bHRpcGxpY2FuZCwgY29uc3QgQVBGbG9hdCAmQWRkZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kaW5nTW9kZSBSTSkgeworICAgIGFzc2VydCgmZ2V0U2VtYW50aWNzKCkgPT0gJk11bHRpcGxpY2FuZC5nZXRTZW1hbnRpY3MoKSAmJgorICAgICAgICAgICAiU2hvdWxkIG9ubHkgY2FsbCBvbiBBUEZsb2F0cyB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyIpOworICAgIGFzc2VydCgmZ2V0U2VtYW50aWNzKCkgPT0gJkFkZGVuZC5nZXRTZW1hbnRpY3MoKSAmJgorICAgICAgICAgICAiU2hvdWxkIG9ubHkgY2FsbCBvbiBBUEZsb2F0cyB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyIpOworICAgIGlmICh1c2VzTGF5b3V0PElFRUVGbG9hdD4oZ2V0U2VtYW50aWNzKCkpKQorICAgICAgcmV0dXJuIFUuSUVFRS5mdXNlZE11bHRpcGx5QWRkKE11bHRpcGxpY2FuZC5VLklFRUUsIEFkZGVuZC5VLklFRUUsIFJNKTsKKyAgICBpZiAodXNlc0xheW91dDxEb3VibGVBUEZsb2F0PihnZXRTZW1hbnRpY3MoKSkpCisgICAgICByZXR1cm4gVS5Eb3VibGUuZnVzZWRNdWx0aXBseUFkZChNdWx0aXBsaWNhbmQuVS5Eb3VibGUsIEFkZGVuZC5VLkRvdWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJNKTsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHNlbWFudGljcyIpOworICB9CisgIG9wU3RhdHVzIHJvdW5kVG9JbnRlZ3JhbChyb3VuZGluZ01vZGUgUk0pIHsKKyAgICBBUEZMT0FUX0RJU1BBVENIX09OX1NFTUFOVElDUyhyb3VuZFRvSW50ZWdyYWwoUk0pKTsKKyAgfQorCisgIC8vIFRPRE86IGJvb2wgcGFyYW1ldGVycyBhcmUgbm90IHJlYWRhYmxlIGFuZCBhIHNvdXJjZSBvZiBidWdzLgorICAvLyBEbyBzb21ldGhpbmcuCisgIG9wU3RhdHVzIG5leHQoYm9vbCBuZXh0RG93bikgeworICAgIEFQRkxPQVRfRElTUEFUQ0hfT05fU0VNQU5USUNTKG5leHQobmV4dERvd24pKTsKKyAgfQorCisgIC8vLyBBZGQgdHdvIEFQRmxvYXRzLCByb3VuZGluZyB0aWVzIHRvIHRoZSBuZWFyZXN0IGV2ZW4uCisgIC8vLyBObyBlcnJvciBjaGVja2luZy4KKyAgQVBGbG9hdCBvcGVyYXRvcisoY29uc3QgQVBGbG9hdCAmUkhTKSBjb25zdCB7CisgICAgQVBGbG9hdCBSZXN1bHQoKnRoaXMpOworICAgICh2b2lkKVJlc3VsdC5hZGQoUkhTLCBybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgLy8vIFN1YnRyYWN0IHR3byBBUEZsb2F0cywgcm91bmRpbmcgdGllcyB0byB0aGUgbmVhcmVzdCBldmVuLgorICAvLy8gTm8gZXJyb3IgY2hlY2tpbmcuCisgIEFQRmxvYXQgb3BlcmF0b3ItKGNvbnN0IEFQRmxvYXQgJlJIUykgY29uc3QgeworICAgIEFQRmxvYXQgUmVzdWx0KCp0aGlzKTsKKyAgICAodm9pZClSZXN1bHQuc3VidHJhY3QoUkhTLCBybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgLy8vIE11bHRpcGx5IHR3byBBUEZsb2F0cywgcm91bmRpbmcgdGllcyB0byB0aGUgbmVhcmVzdCBldmVuLgorICAvLy8gTm8gZXJyb3IgY2hlY2tpbmcuCisgIEFQRmxvYXQgb3BlcmF0b3IqKGNvbnN0IEFQRmxvYXQgJlJIUykgY29uc3QgeworICAgIEFQRmxvYXQgUmVzdWx0KCp0aGlzKTsKKyAgICAodm9pZClSZXN1bHQubXVsdGlwbHkoUkhTLCBybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgLy8vIERpdmlkZSB0aGUgZmlyc3QgQVBGbG9hdCBieSB0aGUgc2Vjb25kLCByb3VuZGluZyB0aWVzIHRvIHRoZSBuZWFyZXN0IGV2ZW4uCisgIC8vLyBObyBlcnJvciBjaGVja2luZy4KKyAgQVBGbG9hdCBvcGVyYXRvci8oY29uc3QgQVBGbG9hdCAmUkhTKSBjb25zdCB7CisgICAgQVBGbG9hdCBSZXN1bHQoKnRoaXMpOworICAgICh2b2lkKVJlc3VsdC5kaXZpZGUoUkhTLCBybU5lYXJlc3RUaWVzVG9FdmVuKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgdm9pZCBjaGFuZ2VTaWduKCkgeyBBUEZMT0FUX0RJU1BBVENIX09OX1NFTUFOVElDUyhjaGFuZ2VTaWduKCkpOyB9CisgIHZvaWQgY2xlYXJTaWduKCkgeworICAgIGlmIChpc05lZ2F0aXZlKCkpCisgICAgICBjaGFuZ2VTaWduKCk7CisgIH0KKyAgdm9pZCBjb3B5U2lnbihjb25zdCBBUEZsb2F0ICZSSFMpIHsKKyAgICBpZiAoaXNOZWdhdGl2ZSgpICE9IFJIUy5pc05lZ2F0aXZlKCkpCisgICAgICBjaGFuZ2VTaWduKCk7CisgIH0KKworICAvLy8gQSBzdGF0aWMgaGVscGVyIHRvIHByb2R1Y2UgYSBjb3B5IG9mIGFuIEFQRmxvYXQgdmFsdWUgd2l0aCBpdHMgc2lnbgorICAvLy8gY29waWVkIGZyb20gc29tZSBvdGhlciBBUEZsb2F0LgorICBzdGF0aWMgQVBGbG9hdCBjb3B5U2lnbihBUEZsb2F0IFZhbHVlLCBjb25zdCBBUEZsb2F0ICZTaWduKSB7CisgICAgVmFsdWUuY29weVNpZ24oU2lnbik7CisgICAgcmV0dXJuIFZhbHVlOworICB9CisKKyAgb3BTdGF0dXMgY29udmVydChjb25zdCBmbHRTZW1hbnRpY3MgJlRvU2VtYW50aWNzLCByb3VuZGluZ01vZGUgUk0sCisgICAgICAgICAgICAgICAgICAgYm9vbCAqbG9zZXNJbmZvKTsKKyAgb3BTdGF0dXMgY29udmVydFRvSW50ZWdlcihNdXRhYmxlQXJyYXlSZWY8aW50ZWdlclBhcnQ+IElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBXaWR0aCwgYm9vbCBJc1NpZ25lZCwgcm91bmRpbmdNb2RlIFJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKklzRXhhY3QpIGNvbnN0IHsKKyAgICBBUEZMT0FUX0RJU1BBVENIX09OX1NFTUFOVElDUygKKyAgICAgICAgY29udmVydFRvSW50ZWdlcihJbnB1dCwgV2lkdGgsIElzU2lnbmVkLCBSTSwgSXNFeGFjdCkpOworICB9CisgIG9wU3RhdHVzIGNvbnZlcnRUb0ludGVnZXIoQVBTSW50ICZSZXN1bHQsIHJvdW5kaW5nTW9kZSBSTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpJc0V4YWN0KSBjb25zdDsKKyAgb3BTdGF0dXMgY29udmVydEZyb21BUEludChjb25zdCBBUEludCAmSW5wdXQsIGJvb2wgSXNTaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRpbmdNb2RlIFJNKSB7CisgICAgQVBGTE9BVF9ESVNQQVRDSF9PTl9TRU1BTlRJQ1MoY29udmVydEZyb21BUEludChJbnB1dCwgSXNTaWduZWQsIFJNKSk7CisgIH0KKyAgb3BTdGF0dXMgY29udmVydEZyb21TaWduRXh0ZW5kZWRJbnRlZ2VyKGNvbnN0IGludGVnZXJQYXJ0ICpJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBJbnB1dFNpemUsIGJvb2wgSXNTaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZGluZ01vZGUgUk0pIHsKKyAgICBBUEZMT0FUX0RJU1BBVENIX09OX1NFTUFOVElDUygKKyAgICAgICAgY29udmVydEZyb21TaWduRXh0ZW5kZWRJbnRlZ2VyKElucHV0LCBJbnB1dFNpemUsIElzU2lnbmVkLCBSTSkpOworICB9CisgIG9wU3RhdHVzIGNvbnZlcnRGcm9tWmVyb0V4dGVuZGVkSW50ZWdlcihjb25zdCBpbnRlZ2VyUGFydCAqSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgSW5wdXRTaXplLCBib29sIElzU2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRpbmdNb2RlIFJNKSB7CisgICAgQVBGTE9BVF9ESVNQQVRDSF9PTl9TRU1BTlRJQ1MoCisgICAgICAgIGNvbnZlcnRGcm9tWmVyb0V4dGVuZGVkSW50ZWdlcihJbnB1dCwgSW5wdXRTaXplLCBJc1NpZ25lZCwgUk0pKTsKKyAgfQorICBvcFN0YXR1cyBjb252ZXJ0RnJvbVN0cmluZyhTdHJpbmdSZWYsIHJvdW5kaW5nTW9kZSk7CisgIEFQSW50IGJpdGNhc3RUb0FQSW50KCkgY29uc3QgeworICAgIEFQRkxPQVRfRElTUEFUQ0hfT05fU0VNQU5USUNTKGJpdGNhc3RUb0FQSW50KCkpOworICB9CisgIGRvdWJsZSBjb252ZXJ0VG9Eb3VibGUoKSBjb25zdCB7IHJldHVybiBnZXRJRUVFKCkuY29udmVydFRvRG91YmxlKCk7IH0KKyAgZmxvYXQgY29udmVydFRvRmxvYXQoKSBjb25zdCB7IHJldHVybiBnZXRJRUVFKCkuY29udmVydFRvRmxvYXQoKTsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBUEZsb2F0ICYpIGNvbnN0ID0gZGVsZXRlOworCisgIGNtcFJlc3VsdCBjb21wYXJlKGNvbnN0IEFQRmxvYXQgJlJIUykgY29uc3QgeworICAgIGFzc2VydCgmZ2V0U2VtYW50aWNzKCkgPT0gJlJIUy5nZXRTZW1hbnRpY3MoKSAmJgorICAgICAgICAgICAiU2hvdWxkIG9ubHkgY29tcGFyZSBBUEZsb2F0cyB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyIpOworICAgIGlmICh1c2VzTGF5b3V0PElFRUVGbG9hdD4oZ2V0U2VtYW50aWNzKCkpKQorICAgICAgcmV0dXJuIFUuSUVFRS5jb21wYXJlKFJIUy5VLklFRUUpOworICAgIGlmICh1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KGdldFNlbWFudGljcygpKSkKKyAgICAgIHJldHVybiBVLkRvdWJsZS5jb21wYXJlKFJIUy5VLkRvdWJsZSk7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBzZW1hbnRpY3MiKTsKKyAgfQorCisgIGJvb2wgYml0d2lzZUlzRXF1YWwoY29uc3QgQVBGbG9hdCAmUkhTKSBjb25zdCB7CisgICAgaWYgKCZnZXRTZW1hbnRpY3MoKSAhPSAmUkhTLmdldFNlbWFudGljcygpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh1c2VzTGF5b3V0PElFRUVGbG9hdD4oZ2V0U2VtYW50aWNzKCkpKQorICAgICAgcmV0dXJuIFUuSUVFRS5iaXR3aXNlSXNFcXVhbChSSFMuVS5JRUVFKTsKKyAgICBpZiAodXNlc0xheW91dDxEb3VibGVBUEZsb2F0PihnZXRTZW1hbnRpY3MoKSkpCisgICAgICByZXR1cm4gVS5Eb3VibGUuYml0d2lzZUlzRXF1YWwoUkhTLlUuRG91YmxlKTsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHNlbWFudGljcyIpOworICB9CisKKyAgLy8vIFdlIGRvbid0IHJlbHkgb24gb3BlcmF0b3I9PSB3b3JraW5nIG9uIGRvdWJsZSB2YWx1ZXMsIGFzCisgIC8vLyBpdCByZXR1cm5zIHRydWUgZm9yIHRoaW5ncyB0aGF0IGFyZSBjbGVhcmx5IG5vdCBlcXVhbCwgbGlrZSAtMC4wIGFuZCAwLjAuCisgIC8vLyBBcyBzdWNoLCB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBkbyBhbiBleGFjdCBiaXQtZm9yLWJpdCBjb21wYXJpc29uIG9mCisgIC8vLyB0d28gZmxvYXRpbmcgcG9pbnQgdmFsdWVzLgorICAvLy8KKyAgLy8vIFdlIGxlYXZlIHRoZSB2ZXJzaW9uIHdpdGggdGhlIGRvdWJsZSBhcmd1bWVudCBoZXJlIGJlY2F1c2UgaXQncyBqdXN0IHNvCisgIC8vLyBjb252ZW5pZW50IHRvIHdyaXRlICIyLjAiIGFuZCB0aGUgbGlrZS4gIFdpdGhvdXQgdGhpcyBmdW5jdGlvbiB3ZSdkCisgIC8vLyBoYXZlIHRvIGR1cGxpY2F0ZSBpdHMgbG9naWMgZXZlcnl3aGVyZSBpdCdzIGNhbGxlZC4KKyAgYm9vbCBpc0V4YWN0bHlWYWx1ZShkb3VibGUgVikgY29uc3QgeworICAgIGJvb2wgaWdub3JlZDsKKyAgICBBUEZsb2F0IFRtcChWKTsKKyAgICBUbXAuY29udmVydChnZXRTZW1hbnRpY3MoKSwgQVBGbG9hdDo6cm1OZWFyZXN0VGllc1RvRXZlbiwgJmlnbm9yZWQpOworICAgIHJldHVybiBiaXR3aXNlSXNFcXVhbChUbXApOworICB9CisKKyAgdW5zaWduZWQgaW50IGNvbnZlcnRUb0hleFN0cmluZyhjaGFyICpEU1QsIHVuc2lnbmVkIGludCBIZXhEaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVcHBlckNhc2UsIHJvdW5kaW5nTW9kZSBSTSkgY29uc3QgeworICAgIEFQRkxPQVRfRElTUEFUQ0hfT05fU0VNQU5USUNTKAorICAgICAgICBjb252ZXJ0VG9IZXhTdHJpbmcoRFNULCBIZXhEaWdpdHMsIFVwcGVyQ2FzZSwgUk0pKTsKKyAgfQorCisgIGJvb2wgaXNaZXJvKCkgY29uc3QgeyByZXR1cm4gZ2V0Q2F0ZWdvcnkoKSA9PSBmY1plcm87IH0KKyAgYm9vbCBpc0luZmluaXR5KCkgY29uc3QgeyByZXR1cm4gZ2V0Q2F0ZWdvcnkoKSA9PSBmY0luZmluaXR5OyB9CisgIGJvb2wgaXNOYU4oKSBjb25zdCB7IHJldHVybiBnZXRDYXRlZ29yeSgpID09IGZjTmFOOyB9CisKKyAgYm9vbCBpc05lZ2F0aXZlKCkgY29uc3QgeyByZXR1cm4gZ2V0SUVFRSgpLmlzTmVnYXRpdmUoKTsgfQorICBib29sIGlzRGVub3JtYWwoKSBjb25zdCB7IEFQRkxPQVRfRElTUEFUQ0hfT05fU0VNQU5USUNTKGlzRGVub3JtYWwoKSk7IH0KKyAgYm9vbCBpc1NpZ25hbGluZygpIGNvbnN0IHsgcmV0dXJuIGdldElFRUUoKS5pc1NpZ25hbGluZygpOyB9CisKKyAgYm9vbCBpc05vcm1hbCgpIGNvbnN0IHsgcmV0dXJuICFpc0Rlbm9ybWFsKCkgJiYgaXNGaW5pdGVOb25aZXJvKCk7IH0KKyAgYm9vbCBpc0Zpbml0ZSgpIGNvbnN0IHsgcmV0dXJuICFpc05hTigpICYmICFpc0luZmluaXR5KCk7IH0KKworICBmbHRDYXRlZ29yeSBnZXRDYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJuIGdldElFRUUoKS5nZXRDYXRlZ29yeSgpOyB9CisgIGNvbnN0IGZsdFNlbWFudGljcyAmZ2V0U2VtYW50aWNzKCkgY29uc3QgeyByZXR1cm4gKlUuc2VtYW50aWNzOyB9CisgIGJvb2wgaXNOb25aZXJvKCkgY29uc3QgeyByZXR1cm4gIWlzWmVybygpOyB9CisgIGJvb2wgaXNGaW5pdGVOb25aZXJvKCkgY29uc3QgeyByZXR1cm4gaXNGaW5pdGUoKSAmJiAhaXNaZXJvKCk7IH0KKyAgYm9vbCBpc1Bvc1plcm8oKSBjb25zdCB7IHJldHVybiBpc1plcm8oKSAmJiAhaXNOZWdhdGl2ZSgpOyB9CisgIGJvb2wgaXNOZWdaZXJvKCkgY29uc3QgeyByZXR1cm4gaXNaZXJvKCkgJiYgaXNOZWdhdGl2ZSgpOyB9CisgIGJvb2wgaXNTbWFsbGVzdCgpIGNvbnN0IHsgQVBGTE9BVF9ESVNQQVRDSF9PTl9TRU1BTlRJQ1MoaXNTbWFsbGVzdCgpKTsgfQorICBib29sIGlzTGFyZ2VzdCgpIGNvbnN0IHsgQVBGTE9BVF9ESVNQQVRDSF9PTl9TRU1BTlRJQ1MoaXNMYXJnZXN0KCkpOyB9CisgIGJvb2wgaXNJbnRlZ2VyKCkgY29uc3QgeyBBUEZMT0FUX0RJU1BBVENIX09OX1NFTUFOVElDUyhpc0ludGVnZXIoKSk7IH0KKworICBBUEZsb2F0ICZvcGVyYXRvcj0oY29uc3QgQVBGbG9hdCAmUkhTKSA9IGRlZmF1bHQ7CisgIEFQRmxvYXQgJm9wZXJhdG9yPShBUEZsb2F0ICYmUkhTKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCB0b1N0cmluZyhTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlN0ciwgdW5zaWduZWQgRm9ybWF0UHJlY2lzaW9uID0gMCwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBGb3JtYXRNYXhQYWRkaW5nID0gMywgYm9vbCBUcnVuY2F0ZVplcm8gPSB0cnVlKSBjb25zdCB7CisgICAgQVBGTE9BVF9ESVNQQVRDSF9PTl9TRU1BTlRJQ1MoCisgICAgICAgIHRvU3RyaW5nKFN0ciwgRm9ybWF0UHJlY2lzaW9uLCBGb3JtYXRNYXhQYWRkaW5nLCBUcnVuY2F0ZVplcm8pKTsKKyAgfQorCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJikgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIGJvb2wgZ2V0RXhhY3RJbnZlcnNlKEFQRmxvYXQgKmludikgY29uc3QgeworICAgIEFQRkxPQVRfRElTUEFUQ0hfT05fU0VNQU5USUNTKGdldEV4YWN0SW52ZXJzZShpbnYpKTsKKyAgfQorCisgIGZyaWVuZCBoYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBBUEZsb2F0ICZBcmcpOworICBmcmllbmQgaW50IGlsb2diKGNvbnN0IEFQRmxvYXQgJkFyZykgeyByZXR1cm4gaWxvZ2IoQXJnLmdldElFRUUoKSk7IH0KKyAgZnJpZW5kIEFQRmxvYXQgc2NhbGJuKEFQRmxvYXQgWCwgaW50IEV4cCwgcm91bmRpbmdNb2RlIFJNKTsKKyAgZnJpZW5kIEFQRmxvYXQgZnJleHAoY29uc3QgQVBGbG9hdCAmWCwgaW50ICZFeHAsIHJvdW5kaW5nTW9kZSBSTSk7CisgIGZyaWVuZCBJRUVFRmxvYXQ7CisgIGZyaWVuZCBEb3VibGVBUEZsb2F0OworfTsKKworLy8vIFNlZSBmcmllbmQgZGVjbGFyYXRpb25zIGFib3ZlLgorLy8vCisvLy8gVGhlc2UgYWRkaXRpb25hbCBkZWNsYXJhdGlvbnMgYXJlIHJlcXVpcmVkIGluIG9yZGVyIHRvIGNvbXBpbGUgTExWTSB3aXRoIElCTQorLy8vIHhsQyBjb21waWxlci4KK2hhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IEFQRmxvYXQgJkFyZyk7CitpbmxpbmUgQVBGbG9hdCBzY2FsYm4oQVBGbG9hdCBYLCBpbnQgRXhwLCBBUEZsb2F0Ojpyb3VuZGluZ01vZGUgUk0pIHsKKyAgaWYgKEFQRmxvYXQ6OnVzZXNMYXlvdXQ8ZGV0YWlsOjpJRUVFRmxvYXQ+KFguZ2V0U2VtYW50aWNzKCkpKQorICAgIHJldHVybiBBUEZsb2F0KHNjYWxibihYLlUuSUVFRSwgRXhwLCBSTSksIFguZ2V0U2VtYW50aWNzKCkpOworICBpZiAoQVBGbG9hdDo6dXNlc0xheW91dDxkZXRhaWw6OkRvdWJsZUFQRmxvYXQ+KFguZ2V0U2VtYW50aWNzKCkpKQorICAgIHJldHVybiBBUEZsb2F0KHNjYWxibihYLlUuRG91YmxlLCBFeHAsIFJNKSwgWC5nZXRTZW1hbnRpY3MoKSk7CisgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgc2VtYW50aWNzIik7Cit9CisKKy8vLyBFcXVpdmFsZW50IG9mIEMgc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbi4KKy8vLworLy8vIFdoaWxlIHRoZSBDIHN0YW5kYXJkIHNheXMgRXhwIGlzIGFuIHVuc3BlY2lmaWVkIHZhbHVlIGZvciBpbmZpbml0eSBhbmQgbmFuLAorLy8vIHRoaXMgcmV0dXJucyBJTlRfTUFYIGZvciBpbmZpbml0aWVzLCBhbmQgSU5UX01JTiBmb3IgTmFOcy4KK2lubGluZSBBUEZsb2F0IGZyZXhwKGNvbnN0IEFQRmxvYXQgJlgsIGludCAmRXhwLCBBUEZsb2F0Ojpyb3VuZGluZ01vZGUgUk0pIHsKKyAgaWYgKEFQRmxvYXQ6OnVzZXNMYXlvdXQ8ZGV0YWlsOjpJRUVFRmxvYXQ+KFguZ2V0U2VtYW50aWNzKCkpKQorICAgIHJldHVybiBBUEZsb2F0KGZyZXhwKFguVS5JRUVFLCBFeHAsIFJNKSwgWC5nZXRTZW1hbnRpY3MoKSk7CisgIGlmIChBUEZsb2F0Ojp1c2VzTGF5b3V0PGRldGFpbDo6RG91YmxlQVBGbG9hdD4oWC5nZXRTZW1hbnRpY3MoKSkpCisgICAgcmV0dXJuIEFQRmxvYXQoZnJleHAoWC5VLkRvdWJsZSwgRXhwLCBSTSksIFguZ2V0U2VtYW50aWNzKCkpOworICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHNlbWFudGljcyIpOworfQorLy8vIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBhcmd1bWVudC4KK2lubGluZSBBUEZsb2F0IGFicyhBUEZsb2F0IFgpIHsKKyAgWC5jbGVhclNpZ24oKTsKKyAgcmV0dXJuIFg7Cit9CisKKy8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbmVnYXRlZCB2YWx1ZSBvZiB0aGUgYXJndW1lbnQuCitpbmxpbmUgQVBGbG9hdCBuZWcoQVBGbG9hdCBYKSB7CisgIFguY2hhbmdlU2lnbigpOworICByZXR1cm4gWDsKK30KKworLy8vIEltcGxlbWVudHMgSUVFRSBtaW5OdW0gc2VtYW50aWNzLiBSZXR1cm5zIHRoZSBzbWFsbGVyIG9mIHRoZSAyIGFyZ3VtZW50cyBpZgorLy8vIGJvdGggYXJlIG5vdCBOYU4uIElmIGVpdGhlciBhcmd1bWVudCBpcyBhIE5hTiwgcmV0dXJucyB0aGUgb3RoZXIgYXJndW1lbnQuCitMTFZNX1JFQURPTkxZCitpbmxpbmUgQVBGbG9hdCBtaW5udW0oY29uc3QgQVBGbG9hdCAmQSwgY29uc3QgQVBGbG9hdCAmQikgeworICBpZiAoQS5pc05hTigpKQorICAgIHJldHVybiBCOworICBpZiAoQi5pc05hTigpKQorICAgIHJldHVybiBBOworICByZXR1cm4gKEIuY29tcGFyZShBKSA9PSBBUEZsb2F0OjpjbXBMZXNzVGhhbikgPyBCIDogQTsKK30KKworLy8vIEltcGxlbWVudHMgSUVFRSBtYXhOdW0gc2VtYW50aWNzLiBSZXR1cm5zIHRoZSBsYXJnZXIgb2YgdGhlIDIgYXJndW1lbnRzIGlmCisvLy8gYm90aCBhcmUgbm90IE5hTi4gSWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgTmFOLCByZXR1cm5zIHRoZSBvdGhlciBhcmd1bWVudC4KK0xMVk1fUkVBRE9OTFkKK2lubGluZSBBUEZsb2F0IG1heG51bShjb25zdCBBUEZsb2F0ICZBLCBjb25zdCBBUEZsb2F0ICZCKSB7CisgIGlmIChBLmlzTmFOKCkpCisgICAgcmV0dXJuIEI7CisgIGlmIChCLmlzTmFOKCkpCisgICAgcmV0dXJuIEE7CisgIHJldHVybiAoQS5jb21wYXJlKEIpID09IEFQRmxvYXQ6OmNtcExlc3NUaGFuKSA/IEIgOiBBOworfQorCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyN1bmRlZiBBUEZMT0FUX0RJU1BBVENIX09OX1NFTUFOVElDUworI2VuZGlmIC8vIExMVk1fQURUX0FQRkxPQVRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQVBJbnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0FQSW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4YzYyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0FQSW50LmgKQEAgLTAsMCArMSwyMTU2IEBACisvLz09PS0tIGxsdm0vQURUL0FQSW50LmggLSBGb3IgQXJiaXRyYXJ5IFByZWNpc2lvbiBJbnRlZ2VyIC0tLS0tKi0gQysrIC0qLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgVGhpcyBmaWxlIGltcGxlbWVudHMgYSBjbGFzcyB0byByZXByZXNlbnQgYXJiaXRyYXJ5IHByZWNpc2lvbgorLy8vIGludGVncmFsIGNvbnN0YW50IHZhbHVlcyBhbmQgb3BlcmF0aW9ucyBvbiB0aGVtLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0FQSU5UX0gKKyNkZWZpbmUgTExWTV9BRFRfQVBJTlRfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEZvbGRpbmdTZXROb2RlSUQ7CitjbGFzcyBTdHJpbmdSZWY7CitjbGFzcyBoYXNoX2NvZGU7CitjbGFzcyByYXdfb3N0cmVhbTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKKworY2xhc3MgQVBJbnQ7CisKK2lubGluZSBBUEludCBvcGVyYXRvci0oQVBJbnQpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFxicmllZiBDbGFzcyBmb3IgYXJiaXRyYXJ5IHByZWNpc2lvbiBpbnRlZ2Vycy4KKy8vLworLy8vIEFQSW50IGlzIGEgZnVuY3Rpb25hbCByZXBsYWNlbWVudCBmb3IgY29tbW9uIGNhc2UgdW5zaWduZWQgaW50ZWdlciB0eXBlIGxpa2UKKy8vLyAidW5zaWduZWQiLCAidW5zaWduZWQgbG9uZyIgb3IgInVpbnQ2NF90IiwgYnV0IGFsc28gYWxsb3dzIG5vbi1ieXRlLXdpZHRoCisvLy8gaW50ZWdlciBzaXplcyBhbmQgbGFyZ2UgaW50ZWdlciB2YWx1ZSB0eXBlcyBzdWNoIGFzIDMtYml0cywgMTUtYml0cywgb3IgbW9yZQorLy8vIHRoYW4gNjQtYml0cyBvZiBwcmVjaXNpb24uIEFQSW50IHByb3ZpZGVzIGEgdmFyaWV0eSBvZiBhcml0aG1ldGljIG9wZXJhdG9ycworLy8vIGFuZCBtZXRob2RzIHRvIG1hbmlwdWxhdGUgaW50ZWdlciB2YWx1ZXMgb2YgYW55IGJpdC13aWR0aC4gSXQgc3VwcG9ydHMgYm90aAorLy8vIHRoZSB0eXBpY2FsIGludGVnZXIgYXJpdGhtZXRpYyBhbmQgY29tcGFyaXNvbiBvcGVyYXRpb25zIGFzIHdlbGwgYXMgYml0d2lzZQorLy8vIG1hbmlwdWxhdGlvbi4KKy8vLworLy8vIFRoZSBjbGFzcyBoYXMgc2V2ZXJhbCBpbnZhcmlhbnRzIHdvcnRoIG5vdGluZzoKKy8vLyAgICogQWxsIGJpdCwgYnl0ZSwgYW5kIHdvcmQgcG9zaXRpb25zIGFyZSB6ZXJvLWJhc2VkLgorLy8vICAgKiBPbmNlIHRoZSBiaXQgd2lkdGggaXMgc2V0LCBpdCBkb2Vzbid0IGNoYW5nZSBleGNlcHQgYnkgdGhlIFRydW5jYXRlLAorLy8vICAgICBTaWduRXh0ZW5kLCBvciBaZXJvRXh0ZW5kIG9wZXJhdGlvbnMuCisvLy8gICAqIEFsbCBiaW5hcnkgb3BlcmF0b3JzIG11c3QgYmUgb24gQVBJbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGJpdCB3aWR0aC4KKy8vLyAgICAgQXR0ZW1wdGluZyB0byB1c2UgdGhlc2Ugb3BlcmF0b3JzIG9uIGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBiaXQKKy8vLyAgICAgd2lkdGhzIHdpbGwgeWllbGQgYW4gYXNzZXJ0aW9uLgorLy8vICAgKiBUaGUgdmFsdWUgaXMgc3RvcmVkIGNhbm9uaWNhbGx5IGFzIGFuIHVuc2lnbmVkIHZhbHVlLiBGb3Igb3BlcmF0aW9ucworLy8vICAgICB3aGVyZSBpdCBtYWtlcyBhIGRpZmZlcmVuY2UsIHRoZXJlIGFyZSBib3RoIHNpZ25lZCBhbmQgdW5zaWduZWQgdmFyaWFudHMKKy8vLyAgICAgb2YgdGhlIG9wZXJhdGlvbi4gRm9yIGV4YW1wbGUsIHNkaXYgYW5kIHVkaXYuIEhvd2V2ZXIsIGJlY2F1c2UgdGhlIGJpdAorLy8vICAgICB3aWR0aHMgbXVzdCBiZSB0aGUgc2FtZSwgb3BlcmF0aW9ucyBzdWNoIGFzIE11bCBhbmQgQWRkIHByb2R1Y2UgdGhlIHNhbWUKKy8vLyAgICAgcmVzdWx0cyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWQgYXMgc2lnbmVkIG9yCisvLy8gICAgIG5vdC4KKy8vLyAgICogSW4gZ2VuZXJhbCwgdGhlIGNsYXNzIHRyaWVzIHRvIGZvbGxvdyB0aGUgc3R5bGUgb2YgY29tcHV0YXRpb24gdGhhdCBMTFZNCisvLy8gICAgIHVzZXMgaW4gaXRzIElSLiBUaGlzIHNpbXBsaWZpZXMgaXRzIHVzZSBmb3IgTExWTS4KKy8vLworY2xhc3MgTExWTV9OT0RJU0NBUkQgQVBJbnQgeworcHVibGljOgorICB0eXBlZGVmIHVpbnQ2NF90IFdvcmRUeXBlOworCisgIC8vLyBUaGlzIGVudW0gaXMgdXNlZCB0byBob2xkIHRoZSBjb25zdGFudHMgd2UgbmVlZGVkIGZvciBBUEludC4KKyAgZW51bSA6IHVuc2lnbmVkIHsKKyAgICAvLy8gQnl0ZSBzaXplIG9mIGEgd29yZC4KKyAgICBBUElOVF9XT1JEX1NJWkUgPSBzaXplb2YoV29yZFR5cGUpLAorICAgIC8vLyBCaXRzIGluIGEgd29yZC4KKyAgICBBUElOVF9CSVRTX1BFUl9XT1JEID0gQVBJTlRfV09SRF9TSVpFICogQ0hBUl9CSVQKKyAgfTsKKworICBzdGF0aWMgY29uc3QgV29yZFR5cGUgV09SRF9NQVggPSB+V29yZFR5cGUoMCk7CisKK3ByaXZhdGU6CisgIC8vLyBUaGlzIHVuaW9uIGlzIHVzZWQgdG8gc3RvcmUgdGhlIGludGVnZXIgdmFsdWUuIFdoZW4gdGhlCisgIC8vLyBpbnRlZ2VyIGJpdC13aWR0aCA8PSA2NCwgaXQgdXNlcyBWQUwsIG90aGVyd2lzZSBpdCB1c2VzIHBWYWwuCisgIHVuaW9uIHsKKyAgICB1aW50NjRfdCBWQUw7ICAgLy8vPCBVc2VkIHRvIHN0b3JlIHRoZSA8PSA2NCBiaXRzIGludGVnZXIgdmFsdWUuCisgICAgdWludDY0X3QgKnBWYWw7IC8vLzwgVXNlZCB0byBzdG9yZSB0aGUgPjY0IGJpdHMgaW50ZWdlciB2YWx1ZS4KKyAgfSBVOworCisgIHVuc2lnbmVkIEJpdFdpZHRoOyAvLy88IFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGlzIEFQSW50LgorCisgIGZyaWVuZCBzdHJ1Y3QgRGVuc2VNYXBBUEludEtleUluZm87CisKKyAgZnJpZW5kIGNsYXNzIEFQU0ludDsKKworICAvLy8gXGJyaWVmIEZhc3QgaW50ZXJuYWwgY29uc3RydWN0b3IKKyAgLy8vCisgIC8vLyBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgb25seSBpbnRlcm5hbGx5IGZvciBzcGVlZCBvZiBjb25zdHJ1Y3Rpb24gb2YKKyAgLy8vIHRlbXBvcmFyaWVzLiBJdCBpcyB1bnNhZmUgZm9yIGdlbmVyYWwgdXNlIHNvIGl0IGlzIG5vdCBwdWJsaWMuCisgIEFQSW50KHVpbnQ2NF90ICp2YWwsIHVuc2lnbmVkIGJpdHMpIDogQml0V2lkdGgoYml0cykgeworICAgIFUucFZhbCA9IHZhbDsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIHRoaXMgQVBJbnQganVzdCBoYXMgb25lIHdvcmQgdG8gc3RvcmUgdmFsdWUuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIGJpdHMgPD0gNjQsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBpc1NpbmdsZVdvcmQoKSBjb25zdCB7IHJldHVybiBCaXRXaWR0aCA8PSBBUElOVF9CSVRTX1BFUl9XT1JEOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hpY2ggd29yZCBhIGJpdCBpcyBpbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgd29yZCBwb3NpdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBiaXQgcG9zaXRpb24uCisgIHN0YXRpYyB1bnNpZ25lZCB3aGljaFdvcmQodW5zaWduZWQgYml0UG9zaXRpb24pIHsKKyAgICByZXR1cm4gYml0UG9zaXRpb24gLyBBUElOVF9CSVRTX1BFUl9XT1JEOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hpY2ggYml0IGluIGEgd29yZCBhIGJpdCBpcyBpbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgYml0IHBvc2l0aW9uIGluIGEgd29yZCBmb3IgdGhlIHNwZWNpZmllZCBiaXQgcG9zaXRpb24KKyAgLy8vIGluIHRoZSBBUEludC4KKyAgc3RhdGljIHVuc2lnbmVkIHdoaWNoQml0KHVuc2lnbmVkIGJpdFBvc2l0aW9uKSB7CisgICAgcmV0dXJuIGJpdFBvc2l0aW9uICUgQVBJTlRfQklUU19QRVJfV09SRDsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGEgc2luZ2xlIGJpdCBtYXNrLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgdWludDY0X3Qgd2l0aCBvbmx5IGJpdCBhdCAid2hpY2hCaXQoYml0UG9zaXRpb24pIiBzZXQKKyAgLy8vIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyBhbmQgcmV0dXJucyBhIHVpbnQ2NF90ICh3b3JkKSBtYXNrIGZvciBhIHNpbmdsZQorICAvLy8gYml0IGF0IGEgc3BlY2lmaWMgYml0IHBvc2l0aW9uLiBUaGlzIGlzIHVzZWQgdG8gbWFzayB0aGUgYml0IGluIHRoZQorICAvLy8gY29ycmVzcG9uZGluZyB3b3JkLgorICBzdGF0aWMgdWludDY0X3QgbWFza0JpdCh1bnNpZ25lZCBiaXRQb3NpdGlvbikgeworICAgIHJldHVybiAxVUxMIDw8IHdoaWNoQml0KGJpdFBvc2l0aW9uKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2xlYXIgdW51c2VkIGhpZ2ggb3JkZXIgYml0cworICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW50ZXJuYWxseSB0byBjbGVhciB0aGUgdG9wICJOIiBiaXRzIGluIHRoZSBoaWdoIG9yZGVyCisgIC8vLyB3b3JkIHRoYXQgYXJlIG5vdCB1c2VkIGJ5IHRoZSBBUEludC4gVGhpcyBpcyBuZWVkZWQgYWZ0ZXIgdGhlIG1vc3QKKyAgLy8vIHNpZ25pZmljYW50IHdvcmQgaXMgYXNzaWduZWQgYSB2YWx1ZSB0byBlbnN1cmUgdGhhdCB0aG9zZSBiaXRzIGFyZQorICAvLy8gemVybydkIG91dC4KKyAgQVBJbnQgJmNsZWFyVW51c2VkQml0cygpIHsKKyAgICAvLyBDb21wdXRlIGhvdyBtYW55IGJpdHMgYXJlIHVzZWQgaW4gdGhlIGZpbmFsIHdvcmQKKyAgICB1bnNpZ25lZCBXb3JkQml0cyA9ICgoQml0V2lkdGgtMSkgJSBBUElOVF9CSVRTX1BFUl9XT1JEKSArIDE7CisKKyAgICAvLyBNYXNrIG91dCB0aGUgaGlnaCBiaXRzLgorICAgIHVpbnQ2NF90IG1hc2sgPSBXT1JEX01BWCA+PiAoQVBJTlRfQklUU19QRVJfV09SRCAtIFdvcmRCaXRzKTsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICBVLlZBTCAmPSBtYXNrOworICAgIGVsc2UKKyAgICAgIFUucFZhbFtnZXROdW1Xb3JkcygpIC0gMV0gJj0gbWFzazsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgd29yZCBjb3JyZXNwb25kaW5nIHRvIGEgYml0IHBvc2l0aW9uCisgIC8vLyBccmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyB3b3JkIGZvciB0aGUgc3BlY2lmaWVkIGJpdCBwb3NpdGlvbi4KKyAgdWludDY0X3QgZ2V0V29yZCh1bnNpZ25lZCBiaXRQb3NpdGlvbikgY29uc3QgeworICAgIHJldHVybiBpc1NpbmdsZVdvcmQoKSA/IFUuVkFMIDogVS5wVmFsW3doaWNoV29yZChiaXRQb3NpdGlvbildOworICB9CisKKyAgLy8vIFV0aWxpdHkgbWV0aG9kIHRvIGNoYW5nZSB0aGUgYml0IHdpZHRoIG9mIHRoaXMgQVBJbnQgdG8gbmV3IGJpdCB3aWR0aCwKKyAgLy8vIGFsbG9jYXRpbmcgYW5kL29yIGRlYWxsb2NhdGluZyBhcyBuZWNlc3NhcnkuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSBvbiB0aGUKKyAgLy8vIHZhbHVlIG9mIGFueSBiaXRzIHVwb24gcmV0dXJuLiBDYWxsZXIgc2hvdWxkIHBvcHVsYXRlIHRoZSBiaXRzIGFmdGVyLgorICB2b2lkIHJlYWxsb2NhdGUodW5zaWduZWQgTmV3Qml0V2lkdGgpOworCisgIC8vLyBcYnJpZWYgQ29udmVydCBhIGNoYXIgYXJyYXkgaW50byBhbiBBUEludAorICAvLy8KKyAgLy8vIFxwYXJhbSByYWRpeCAyLCA4LCAxMCwgMTYsIG9yIDM2CisgIC8vLyBDb252ZXJ0cyBhIHN0cmluZyBpbnRvIGEgbnVtYmVyLiAgVGhlIHN0cmluZyBtdXN0IGJlIG5vbi1lbXB0eQorICAvLy8gYW5kIHdlbGwtZm9ybWVkIGFzIGEgbnVtYmVyIG9mIHRoZSBnaXZlbiBiYXNlLiBUaGUgYml0LXdpZHRoCisgIC8vLyBtdXN0IGJlIHN1ZmZpY2llbnQgdG8gaG9sZCB0aGUgcmVzdWx0LgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCBieSB0aGUgY29uc3RydWN0b3JzIHRoYXQgdGFrZSBzdHJpbmcgYXJndW1lbnRzLgorICAvLy8KKyAgLy8vIFN0cmluZ1JlZjo6Z2V0QXNJbnRlZ2VyIGlzIHN1cGVyZmljaWFsbHkgc2ltaWxhciBidXQgKDEpIGRvZXMKKyAgLy8vIG5vdCBhc3N1bWUgdGhhdCB0aGUgc3RyaW5nIGlzIHdlbGwtZm9ybWVkIGFuZCAoMikgZ3Jvd3MgdGhlCisgIC8vLyByZXN1bHQgdG8gaG9sZCB0aGUgaW5wdXQuCisgIHZvaWQgZnJvbVN0cmluZyh1bnNpZ25lZCBudW1CaXRzLCBTdHJpbmdSZWYgc3RyLCB1aW50OF90IHJhZGl4KTsKKworICAvLy8gXGJyaWVmIEFuIGludGVybmFsIGRpdmlzaW9uIGZ1bmN0aW9uIGZvciBkaXZpZGluZyBBUEludHMuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSB0b1N0cmluZyBtZXRob2QgdG8gZGl2aWRlIGJ5IHRoZSByYWRpeC4gSXQgc2ltcGx5CisgIC8vLyBwcm92aWRlcyBhIG1vcmUgY29udmVuaWVudCBmb3JtIG9mIGRpdmlkZSBmb3IgaW50ZXJuYWwgdXNlIHNpbmNlIEtudXRoRGl2CisgIC8vLyBoYXMgc3BlY2lmaWMgY29uc3RyYWludHMgb24gaXRzIGlucHV0cy4gSWYgdGhvc2UgY29uc3RyYWludHMgYXJlIG5vdCBtZXQKKyAgLy8vIHRoZW4gaXQgcHJvdmlkZXMgYSBzaW1wbGVyIGZvcm0gb2YgZGl2aWRlLgorICBzdGF0aWMgdm9pZCBkaXZpZGUoY29uc3QgV29yZFR5cGUgKkxIUywgdW5zaWduZWQgbGhzV29yZHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkVHlwZSAqUkhTLCB1bnNpZ25lZCByaHNXb3JkcywgV29yZFR5cGUgKlF1b3RpZW50LAorICAgICAgICAgICAgICAgICAgICAgV29yZFR5cGUgKlJlbWFpbmRlcik7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3IgaW5saW5lIGNvbnN0cnVjdG9yCisgIHZvaWQgaW5pdFNsb3dDYXNlKHVpbnQ2NF90IHZhbCwgYm9vbCBpc1NpZ25lZCk7CisKKyAgLy8vIHNoYXJlZCBjb2RlIGJldHdlZW4gdHdvIGFycmF5IGNvbnN0cnVjdG9ycworICB2b2lkIGluaXRGcm9tQXJyYXkoQXJyYXlSZWY8dWludDY0X3Q+IGFycmF5KTsKKworICAvLy8gb3V0LW9mLWxpbmUgc2xvdyBjYXNlIGZvciBpbmxpbmUgY29weSBjb25zdHJ1Y3RvcgorICB2b2lkIGluaXRTbG93Q2FzZShjb25zdCBBUEludCAmdGhhdCk7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3Igc2hsCisgIHZvaWQgc2hsU2xvd0Nhc2UodW5zaWduZWQgU2hpZnRBbXQpOworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIGxzaHIuCisgIHZvaWQgbHNoclNsb3dDYXNlKHVuc2lnbmVkIFNoaWZ0QW10KTsKKworICAvLy8gb3V0LW9mLWxpbmUgc2xvdyBjYXNlIGZvciBhc2hyLgorICB2b2lkIGFzaHJTbG93Q2FzZSh1bnNpZ25lZCBTaGlmdEFtdCk7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3Igb3BlcmF0b3I9CisgIHZvaWQgQXNzaWduU2xvd0Nhc2UoY29uc3QgQVBJbnQgJlJIUyk7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3Igb3BlcmF0b3I9PQorICBib29sIEVxdWFsU2xvd0Nhc2UoY29uc3QgQVBJbnQgJlJIUykgY29uc3QgTExWTV9SRUFET05MWTsKKworICAvLy8gb3V0LW9mLWxpbmUgc2xvdyBjYXNlIGZvciBjb3VudExlYWRpbmdaZXJvcworICB1bnNpZ25lZCBjb3VudExlYWRpbmdaZXJvc1Nsb3dDYXNlKCkgY29uc3QgTExWTV9SRUFET05MWTsKKworICAvLy8gb3V0LW9mLWxpbmUgc2xvdyBjYXNlIGZvciBjb3VudExlYWRpbmdPbmVzLgorICB1bnNpZ25lZCBjb3VudExlYWRpbmdPbmVzU2xvd0Nhc2UoKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIGNvdW50VHJhaWxpbmdaZXJvcy4KKyAgdW5zaWduZWQgY291bnRUcmFpbGluZ1plcm9zU2xvd0Nhc2UoKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIGNvdW50VHJhaWxpbmdPbmVzCisgIHVuc2lnbmVkIGNvdW50VHJhaWxpbmdPbmVzU2xvd0Nhc2UoKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIGNvdW50UG9wdWxhdGlvbgorICB1bnNpZ25lZCBjb3VudFBvcHVsYXRpb25TbG93Q2FzZSgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3IgaW50ZXJzZWN0cy4KKyAgYm9vbCBpbnRlcnNlY3RzU2xvd0Nhc2UoY29uc3QgQVBJbnQgJlJIUykgY29uc3QgTExWTV9SRUFET05MWTsKKworICAvLy8gb3V0LW9mLWxpbmUgc2xvdyBjYXNlIGZvciBpc1N1YnNldE9mLgorICBib29sIGlzU3Vic2V0T2ZTbG93Q2FzZShjb25zdCBBUEludCAmUkhTKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIHNldEJpdHMuCisgIHZvaWQgc2V0Qml0c1Nsb3dDYXNlKHVuc2lnbmVkIGxvQml0LCB1bnNpZ25lZCBoaUJpdCk7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3IgZmxpcEFsbEJpdHMuCisgIHZvaWQgZmxpcEFsbEJpdHNTbG93Q2FzZSgpOworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIG9wZXJhdG9yJj0uCisgIHZvaWQgQW5kQXNzaWduU2xvd0Nhc2UoY29uc3QgQVBJbnQmIFJIUyk7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3Igb3BlcmF0b3J8PS4KKyAgdm9pZCBPckFzc2lnblNsb3dDYXNlKGNvbnN0IEFQSW50JiBSSFMpOworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIG9wZXJhdG9yXj0uCisgIHZvaWQgWG9yQXNzaWduU2xvd0Nhc2UoY29uc3QgQVBJbnQmIFJIUyk7CisKKyAgLy8vIFVuc2lnbmVkIGNvbXBhcmlzb24uIFJldHVybnMgLTEsIDAsIG9yIDEgaWYgdGhpcyBBUEludCBpcyBsZXNzIHRoYW4sIGVxdWFsCisgIC8vLyB0bywgb3IgZ3JlYXRlciB0aGFuIFJIUy4KKyAgaW50IGNvbXBhcmUoY29uc3QgQVBJbnQgJlJIUykgY29uc3QgTExWTV9SRUFET05MWTsKKworICAvLy8gU2lnbmVkIGNvbXBhcmlzb24uIFJldHVybnMgLTEsIDAsIG9yIDEgaWYgdGhpcyBBUEludCBpcyBsZXNzIHRoYW4sIGVxdWFsCisgIC8vLyB0bywgb3IgZ3JlYXRlciB0aGFuIFJIUy4KKyAgaW50IGNvbXBhcmVTaWduZWQoY29uc3QgQVBJbnQgJlJIUykgY29uc3QgTExWTV9SRUFET05MWTsKKworcHVibGljOgorICAvLy8gXG5hbWUgQ29uc3RydWN0b3JzCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbmV3IEFQSW50IG9mIG51bUJpdHMgd2lkdGgsIGluaXRpYWxpemVkIGFzIHZhbC4KKyAgLy8vCisgIC8vLyBJZiBpc1NpZ25lZCBpcyB0cnVlIHRoZW4gdmFsIGlzIHRyZWF0ZWQgYXMgaWYgaXQgd2VyZSBhIHNpZ25lZCB2YWx1ZQorICAvLy8gKGkuZS4gYXMgYW4gaW50NjRfdCkgYW5kIHRoZSBhcHByb3ByaWF0ZSBzaWduIGV4dGVuc2lvbiB0byB0aGUgYml0IHdpZHRoCisgIC8vLyB3aWxsIGJlIGRvbmUuIE90aGVyd2lzZSwgbm8gc2lnbiBleHRlbnNpb24gb2NjdXJzIChoaWdoIG9yZGVyIGJpdHMgYmV5b25kCisgIC8vLyB0aGUgcmFuZ2Ugb2YgdmFsIGFyZSB6ZXJvIGZpbGxlZCkuCisgIC8vLworICAvLy8gXHBhcmFtIG51bUJpdHMgdGhlIGJpdCB3aWR0aCBvZiB0aGUgY29uc3RydWN0ZWQgQVBJbnQKKyAgLy8vIFxwYXJhbSB2YWwgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIEFQSW50CisgIC8vLyBccGFyYW0gaXNTaWduZWQgaG93IHRvIHRyZWF0IHNpZ25lZG5lc3Mgb2YgdmFsCisgIEFQSW50KHVuc2lnbmVkIG51bUJpdHMsIHVpbnQ2NF90IHZhbCwgYm9vbCBpc1NpZ25lZCA9IGZhbHNlKQorICAgICAgOiBCaXRXaWR0aChudW1CaXRzKSB7CisgICAgYXNzZXJ0KEJpdFdpZHRoICYmICJiaXR3aWR0aCB0b28gc21hbGwiKTsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpIHsKKyAgICAgIFUuVkFMID0gdmFsOworICAgICAgY2xlYXJVbnVzZWRCaXRzKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluaXRTbG93Q2FzZSh2YWwsIGlzU2lnbmVkKTsKKyAgICB9CisgIH0KKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBBUEludCBvZiBudW1CaXRzIHdpZHRoLCBpbml0aWFsaXplZCBhcyBiaWdWYWxbXS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgYmlnVmFsLnNpemUoKSBjYW4gYmUgc21hbGxlciBvciBsYXJnZXIgdGhhbiB0aGUgY29ycmVzcG9uZGluZworICAvLy8gYml0IHdpZHRoIGJ1dCBhbnkgZXh0cmFuZW91cyBiaXRzIHdpbGwgYmUgZHJvcHBlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gbnVtQml0cyB0aGUgYml0IHdpZHRoIG9mIHRoZSBjb25zdHJ1Y3RlZCBBUEludAorICAvLy8gXHBhcmFtIGJpZ1ZhbCBhIHNlcXVlbmNlIG9mIHdvcmRzIHRvIGZvcm0gdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIEFQSW50CisgIEFQSW50KHVuc2lnbmVkIG51bUJpdHMsIEFycmF5UmVmPHVpbnQ2NF90PiBiaWdWYWwpOworCisgIC8vLyBFcXVpdmFsZW50IHRvIEFQSW50KG51bUJpdHMsIEFycmF5UmVmPHVpbnQ2NF90PihiaWdWYWwsIG51bVdvcmRzKSksIGJ1dAorICAvLy8gZGVwcmVjYXRlZCBiZWNhdXNlIHRoaXMgY29uc3RydWN0b3IgaXMgcHJvbmUgdG8gYW1iaWd1aXR5IHdpdGggdGhlCisgIC8vLyBBUEludCh1bnNpZ25lZCwgdWludDY0X3QsIGJvb2wpIGNvbnN0cnVjdG9yLgorICAvLy8KKyAgLy8vIElmIHRoaXMgb3ZlcmxvYWQgaXMgZXZlciBkZWxldGVkLCBjYXJlIHNob3VsZCBiZSB0YWtlbiB0byBwcmV2ZW50IGNhbGxzCisgIC8vLyBmcm9tIGJlaW5nIGluY29ycmVjdGx5IGNhcHR1cmVkIGJ5IHRoZSBBUEludCh1bnNpZ25lZCwgdWludDY0X3QsIGJvb2wpCisgIC8vLyBjb25zdHJ1Y3Rvci4KKyAgQVBJbnQodW5zaWduZWQgbnVtQml0cywgdW5zaWduZWQgbnVtV29yZHMsIGNvbnN0IHVpbnQ2NF90IGJpZ1ZhbFtdKTsKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBBUEludCBmcm9tIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgY29uc3RydWN0b3IgaW50ZXJwcmV0cyB0aGUgc3RyaW5nIFxwIHN0ciBpbiB0aGUgZ2l2ZW4gcmFkaXguIFRoZQorICAvLy8gaW50ZXJwcmV0YXRpb24gc3RvcHMgd2hlbiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRoYXQgaXMgbm90IHN1aXRhYmxlIGZvciB0aGUKKyAgLy8vIHJhZGl4IGlzIGVuY291bnRlcmVkLCBvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuIEFjY2VwdGFibGUgcmFkaXggdmFsdWVzCisgIC8vLyBhcmUgMiwgOCwgMTAsIDE2LCBhbmQgMzYuIEl0IGlzIGFuIGVycm9yIGZvciB0aGUgdmFsdWUgaW1wbGllZCBieSB0aGUKKyAgLy8vIHN0cmluZyB0byByZXF1aXJlIG1vcmUgYml0cyB0aGFuIG51bUJpdHMuCisgIC8vLworICAvLy8gXHBhcmFtIG51bUJpdHMgdGhlIGJpdCB3aWR0aCBvZiB0aGUgY29uc3RydWN0ZWQgQVBJbnQKKyAgLy8vIFxwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBiZSBpbnRlcnByZXRlZAorICAvLy8gXHBhcmFtIHJhZGl4IHRoZSByYWRpeCB0byB1c2UgZm9yIHRoZSBjb252ZXJzaW9uCisgIEFQSW50KHVuc2lnbmVkIG51bUJpdHMsIFN0cmluZ1JlZiBzdHIsIHVpbnQ4X3QgcmFkaXgpOworCisgIC8vLyBTaW1wbHkgbWFrZXMgKnRoaXMgYSBjb3B5IG9mIHRoYXQuCisgIC8vLyBAYnJpZWYgQ29weSBDb25zdHJ1Y3Rvci4KKyAgQVBJbnQoY29uc3QgQVBJbnQgJnRoYXQpIDogQml0V2lkdGgodGhhdC5CaXRXaWR0aCkgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIFUuVkFMID0gdGhhdC5VLlZBTDsKKyAgICBlbHNlCisgICAgICBpbml0U2xvd0Nhc2UodGhhdCk7CisgIH0KKworICAvLy8gXGJyaWVmIE1vdmUgQ29uc3RydWN0b3IuCisgIEFQSW50KEFQSW50ICYmdGhhdCkgOiBCaXRXaWR0aCh0aGF0LkJpdFdpZHRoKSB7CisgICAgbWVtY3B5KCZVLCAmdGhhdC5VLCBzaXplb2YoVSkpOworICAgIHRoYXQuQml0V2lkdGggPSAwOworICB9CisKKyAgLy8vIFxicmllZiBEZXN0cnVjdG9yLgorICB+QVBJbnQoKSB7CisgICAgaWYgKG5lZWRzQ2xlYW51cCgpKQorICAgICAgZGVsZXRlW10gVS5wVmFsOworICB9CisKKyAgLy8vIFxicmllZiBEZWZhdWx0IGNvbnN0cnVjdG9yIHRoYXQgY3JlYXRlcyBhbiB1bmludGVyZXN0aW5nIEFQSW50CisgIC8vLyByZXByZXNlbnRpbmcgYSAxLWJpdCB6ZXJvIHZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZnVsIGZvciBvYmplY3QgZGVzZXJpYWxpemF0aW9uIChwYWlyIHRoaXMgd2l0aCB0aGUgc3RhdGljCisgIC8vLyAgbWV0aG9kIFJlYWQpLgorICBleHBsaWNpdCBBUEludCgpIDogQml0V2lkdGgoMSkgeyBVLlZBTCA9IDA7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgd2hldGhlciB0aGlzIGluc3RhbmNlIGFsbG9jYXRlZCBtZW1vcnkuCisgIGJvb2wgbmVlZHNDbGVhbnVwKCkgY29uc3QgeyByZXR1cm4gIWlzU2luZ2xlV29yZCgpOyB9CisKKyAgLy8vIFVzZWQgdG8gaW5zZXJ0IEFQSW50IG9iamVjdHMsIG9yIG9iamVjdHMgdGhhdCBjb250YWluIEFQSW50IG9iamVjdHMsIGludG8KKyAgLy8vICBGb2xkaW5nU2V0cy4KKyAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJmlkKSBjb25zdDsKKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIFZhbHVlIFRlc3RzCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHNpZ24gb2YgdGhpcyBBUEludC4KKyAgLy8vCisgIC8vLyBUaGlzIHRlc3RzIHRoZSBoaWdoIGJpdCBvZiB0aGlzIEFQSW50IHRvIGRldGVybWluZSBpZiBpdCBpcyBzZXQuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGlzIEFQSW50IGlzIG5lZ2F0aXZlLCBmYWxzZSBvdGhlcndpc2UKKyAgYm9vbCBpc05lZ2F0aXZlKCkgY29uc3QgeyByZXR1cm4gKCp0aGlzKVtCaXRXaWR0aCAtIDFdOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBBUEludCBWYWx1ZSBpcyBub24tbmVnYXRpdmUgKD49IDApCisgIC8vLworICAvLy8gVGhpcyB0ZXN0cyB0aGUgaGlnaCBiaXQgb2YgdGhlIEFQSW50IHRvIGRldGVybWluZSBpZiBpdCBpcyB1bnNldC4KKyAgYm9vbCBpc05vbk5lZ2F0aXZlKCkgY29uc3QgeyByZXR1cm4gIWlzTmVnYXRpdmUoKTsgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIHNpZ24gYml0IG9mIHRoaXMgQVBJbnQgaXMgc2V0LgorICAvLy8KKyAgLy8vIFRoaXMgdGVzdHMgdGhlIGhpZ2ggYml0IG9mIHRoaXMgQVBJbnQgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIHNldC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoaXMgQVBJbnQgaGFzIGl0cyBzaWduIGJpdCBzZXQsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBpc1NpZ25CaXRTZXQoKSBjb25zdCB7IHJldHVybiAoKnRoaXMpW0JpdFdpZHRoLTFdOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgaWYgc2lnbiBiaXQgb2YgdGhpcyBBUEludCBpcyBjbGVhci4KKyAgLy8vCisgIC8vLyBUaGlzIHRlc3RzIHRoZSBoaWdoIGJpdCBvZiB0aGlzIEFQSW50IHRvIGRldGVybWluZSBpZiBpdCBpcyBjbGVhci4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoaXMgQVBJbnQgaGFzIGl0cyBzaWduIGJpdCBjbGVhciwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGlzU2lnbkJpdENsZWFyKCkgY29uc3QgeyByZXR1cm4gIWlzU2lnbkJpdFNldCgpOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBBUEludCBWYWx1ZSBpcyBwb3NpdGl2ZS4KKyAgLy8vCisgIC8vLyBUaGlzIHRlc3RzIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIEFQSW50IGlzIHBvc2l0aXZlICg+IDApLiBOb3RlCisgIC8vLyB0aGF0IDAgaXMgbm90IGEgcG9zaXRpdmUgdmFsdWUuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGlzIEFQSW50IGlzIHBvc2l0aXZlLgorICBib29sIGlzU3RyaWN0bHlQb3NpdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIGlzTm9uTmVnYXRpdmUoKSAmJiAhaXNOdWxsVmFsdWUoKTsgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIGFsbCBiaXRzIGFyZSBzZXQKKyAgLy8vCisgIC8vLyBUaGlzIGNoZWNrcyB0byBzZWUgaWYgdGhlIHZhbHVlIGhhcyBhbGwgYml0cyBvZiB0aGUgQVBJbnQgYXJlIHNldCBvciBub3QuCisgIGJvb2wgaXNBbGxPbmVzVmFsdWUoKSBjb25zdCB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgcmV0dXJuIFUuVkFMID09IFdPUkRfTUFYID4+IChBUElOVF9CSVRTX1BFUl9XT1JEIC0gQml0V2lkdGgpOworICAgIHJldHVybiBjb3VudFRyYWlsaW5nT25lc1Nsb3dDYXNlKCkgPT0gQml0V2lkdGg7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSBpZiBhbGwgYml0cyBhcmUgY2xlYXIKKyAgLy8vCisgIC8vLyBUaGlzIGNoZWNrcyB0byBzZWUgaWYgdGhlIHZhbHVlIGhhcyBhbGwgYml0cyBvZiB0aGUgQVBJbnQgYXJlIGNsZWFyIG9yCisgIC8vLyBub3QuCisgIGJvb2wgaXNOdWxsVmFsdWUoKSBjb25zdCB7IHJldHVybiAhKnRoaXM7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSBpZiB0aGlzIGlzIGEgdmFsdWUgb2YgMS4KKyAgLy8vCisgIC8vLyBUaGlzIGNoZWNrcyB0byBzZWUgaWYgdGhlIHZhbHVlIG9mIHRoaXMgQVBJbnQgaXMgb25lLgorICBib29sIGlzT25lVmFsdWUoKSBjb25zdCB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgcmV0dXJuIFUuVkFMID09IDE7CisgICAgcmV0dXJuIGNvdW50TGVhZGluZ1plcm9zU2xvd0Nhc2UoKSA9PSBCaXRXaWR0aCAtIDE7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSBpZiB0aGlzIGlzIHRoZSBsYXJnZXN0IHVuc2lnbmVkIHZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgY2hlY2tzIHRvIHNlZSBpZiB0aGUgdmFsdWUgb2YgdGhpcyBBUEludCBpcyB0aGUgbWF4aW11bSB1bnNpZ25lZAorICAvLy8gdmFsdWUgZm9yIHRoZSBBUEludCdzIGJpdCB3aWR0aC4KKyAgYm9vbCBpc01heFZhbHVlKCkgY29uc3QgeyByZXR1cm4gaXNBbGxPbmVzVmFsdWUoKTsgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIHRoaXMgaXMgdGhlIGxhcmdlc3Qgc2lnbmVkIHZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgY2hlY2tzIHRvIHNlZSBpZiB0aGUgdmFsdWUgb2YgdGhpcyBBUEludCBpcyB0aGUgbWF4aW11bSBzaWduZWQKKyAgLy8vIHZhbHVlIGZvciB0aGUgQVBJbnQncyBiaXQgd2lkdGguCisgIGJvb2wgaXNNYXhTaWduZWRWYWx1ZSgpIGNvbnN0IHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICByZXR1cm4gVS5WQUwgPT0gKChXb3JkVHlwZSgxKSA8PCAoQml0V2lkdGggLSAxKSkgLSAxKTsKKyAgICByZXR1cm4gIWlzTmVnYXRpdmUoKSAmJiBjb3VudFRyYWlsaW5nT25lc1Nsb3dDYXNlKCkgPT0gQml0V2lkdGggLSAxOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBpcyB0aGUgc21hbGxlc3QgdW5zaWduZWQgdmFsdWUuCisgIC8vLworICAvLy8gVGhpcyBjaGVja3MgdG8gc2VlIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIEFQSW50IGlzIHRoZSBtaW5pbXVtIHVuc2lnbmVkCisgIC8vLyB2YWx1ZSBmb3IgdGhlIEFQSW50J3MgYml0IHdpZHRoLgorICBib29sIGlzTWluVmFsdWUoKSBjb25zdCB7IHJldHVybiBpc051bGxWYWx1ZSgpOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBpcyB0aGUgc21hbGxlc3Qgc2lnbmVkIHZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgY2hlY2tzIHRvIHNlZSBpZiB0aGUgdmFsdWUgb2YgdGhpcyBBUEludCBpcyB0aGUgbWluaW11bSBzaWduZWQKKyAgLy8vIHZhbHVlIGZvciB0aGUgQVBJbnQncyBiaXQgd2lkdGguCisgIGJvb2wgaXNNaW5TaWduZWRWYWx1ZSgpIGNvbnN0IHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICByZXR1cm4gVS5WQUwgPT0gKFdvcmRUeXBlKDEpIDw8IChCaXRXaWR0aCAtIDEpKTsKKyAgICByZXR1cm4gaXNOZWdhdGl2ZSgpICYmIGNvdW50VHJhaWxpbmdaZXJvc1Nsb3dDYXNlKCkgPT0gQml0V2lkdGggLSAxOworICB9CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiB0aGlzIEFQSW50IGhhcyBhbiBOLWJpdHMgdW5zaWduZWQgaW50ZWdlciB2YWx1ZS4KKyAgYm9vbCBpc0ludE4odW5zaWduZWQgTikgY29uc3QgeworICAgIGFzc2VydChOICYmICJOID09IDAgPz8/Iik7CisgICAgcmV0dXJuIGdldEFjdGl2ZUJpdHMoKSA8PSBOOworICB9CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiB0aGlzIEFQSW50IGhhcyBhbiBOLWJpdHMgc2lnbmVkIGludGVnZXIgdmFsdWUuCisgIGJvb2wgaXNTaWduZWRJbnROKHVuc2lnbmVkIE4pIGNvbnN0IHsKKyAgICBhc3NlcnQoTiAmJiAiTiA9PSAwID8/PyIpOworICAgIHJldHVybiBnZXRNaW5TaWduZWRCaXRzKCkgPD0gTjsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2hlY2sgaWYgdGhpcyBBUEludCdzIHZhbHVlIGlzIGEgcG93ZXIgb2YgdHdvIGdyZWF0ZXIgdGhhbiB6ZXJvLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlIGFyZ3VtZW50IEFQSW50IHZhbHVlIGlzIGEgcG93ZXIgb2YgdHdvID4gMC4KKyAgYm9vbCBpc1Bvd2VyT2YyKCkgY29uc3QgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIHJldHVybiBpc1Bvd2VyT2YyXzY0KFUuVkFMKTsKKyAgICByZXR1cm4gY291bnRQb3B1bGF0aW9uU2xvd0Nhc2UoKSA9PSAxOworICB9CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiB0aGUgQVBJbnQncyB2YWx1ZSBpcyByZXR1cm5lZCBieSBnZXRTaWduTWFzay4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGdldFNpZ25NYXNrLgorICBib29sIGlzU2lnbk1hc2soKSBjb25zdCB7IHJldHVybiBpc01pblNpZ25lZFZhbHVlKCk7IH0KKworICAvLy8gXGJyaWVmIENvbnZlcnQgQVBJbnQgdG8gYSBib29sZWFuIHZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgY29udmVydHMgdGhlIEFQSW50IHRvIGEgYm9vbGVhbiB2YWx1ZSBhcyBhIHRlc3QgYWdhaW5zdCB6ZXJvLgorICBib29sIGdldEJvb2xWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuICEhKnRoaXM7IH0KKworICAvLy8gSWYgdGhpcyB2YWx1ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsaW1pdCwgcmV0dXJuIGl0LCBvdGhlcndpc2UKKyAgLy8vIHJldHVybiB0aGUgbGltaXQgdmFsdWUuICBUaGlzIGNhdXNlcyB0aGUgdmFsdWUgdG8gc2F0dXJhdGUgdG8gdGhlIGxpbWl0LgorICB1aW50NjRfdCBnZXRMaW1pdGVkVmFsdWUodWludDY0X3QgTGltaXQgPSBVSU5UNjRfTUFYKSBjb25zdCB7CisgICAgcmV0dXJuIHVndChMaW1pdCkgPyBMaW1pdCA6IGdldFpFeHRWYWx1ZSgpOworICB9CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiB0aGUgQVBJbnQgY29uc2lzdHMgb2YgYSByZXBlYXRlZCBiaXQgcGF0dGVybi4KKyAgLy8vCisgIC8vLyBlLmcuIDB4MDEwMTAxMDEgc2F0aXNmaWVzIGlzU3BsYXQoOCkuCisgIC8vLyBccGFyYW0gU3BsYXRTaXplSW5CaXRzIFRoZSBzaXplIG9mIHRoZSBwYXR0ZXJuIGluIGJpdHMuIE11c3QgZGl2aWRlIGJpdAorICAvLy8gd2lkdGggd2l0aG91dCByZW1haW5kZXIuCisgIGJvb2wgaXNTcGxhdCh1bnNpZ25lZCBTcGxhdFNpemVJbkJpdHMpIGNvbnN0OworCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoaXMgQVBJbnQgdmFsdWUgaXMgYSBzZXF1ZW5jZSBvZiBccGFyYW0gbnVtQml0cyBvbmVzCisgIC8vLyBzdGFydGluZyBhdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHdpdGggdGhlIHJlbWFpbmRlciB6ZXJvLgorICBib29sIGlzTWFzayh1bnNpZ25lZCBudW1CaXRzKSBjb25zdCB7CisgICAgYXNzZXJ0KG51bUJpdHMgIT0gMCAmJiAibnVtQml0cyBtdXN0IGJlIG5vbi16ZXJvIik7CisgICAgYXNzZXJ0KG51bUJpdHMgPD0gQml0V2lkdGggJiYgIm51bUJpdHMgb3V0IG9mIHJhbmdlIik7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgcmV0dXJuIFUuVkFMID09IChXT1JEX01BWCA+PiAoQVBJTlRfQklUU19QRVJfV09SRCAtIG51bUJpdHMpKTsKKyAgICB1bnNpZ25lZCBPbmVzID0gY291bnRUcmFpbGluZ09uZXNTbG93Q2FzZSgpOworICAgIHJldHVybiAobnVtQml0cyA9PSBPbmVzKSAmJgorICAgICAgICAgICAoKE9uZXMgKyBjb3VudExlYWRpbmdaZXJvc1Nsb3dDYXNlKCkpID09IEJpdFdpZHRoKTsKKyAgfQorCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoaXMgQVBJbnQgaXMgYSBub24tZW1wdHkgc2VxdWVuY2Ugb2Ygb25lcyBzdGFydGluZyBhdAorICAvLy8gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB3aXRoIHRoZSByZW1haW5kZXIgemVyby4KKyAgLy8vIEV4LiBpc01hc2soMHgwMDAwRkZGRlUpID09IHRydWUuCisgIGJvb2wgaXNNYXNrKCkgY29uc3QgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIHJldHVybiBpc01hc2tfNjQoVS5WQUwpOworICAgIHVuc2lnbmVkIE9uZXMgPSBjb3VudFRyYWlsaW5nT25lc1Nsb3dDYXNlKCk7CisgICAgcmV0dXJuIChPbmVzID4gMCkgJiYgKChPbmVzICsgY291bnRMZWFkaW5nWmVyb3NTbG93Q2FzZSgpKSA9PSBCaXRXaWR0aCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgQVBJbnQgdmFsdWUgY29udGFpbnMgYSBzZXF1ZW5jZSBvZiBvbmVzIHdpdGgKKyAgLy8vIHRoZSByZW1haW5kZXIgemVyby4KKyAgYm9vbCBpc1NoaWZ0ZWRNYXNrKCkgY29uc3QgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIHJldHVybiBpc1NoaWZ0ZWRNYXNrXzY0KFUuVkFMKTsKKyAgICB1bnNpZ25lZCBPbmVzID0gY291bnRQb3B1bGF0aW9uU2xvd0Nhc2UoKTsKKyAgICB1bnNpZ25lZCBMZWFkWiA9IGNvdW50TGVhZGluZ1plcm9zU2xvd0Nhc2UoKTsKKyAgICByZXR1cm4gKE9uZXMgKyBMZWFkWiArIGNvdW50VHJhaWxpbmdaZXJvcygpKSA9PSBCaXRXaWR0aDsKKyAgfQorCisgIC8vLyBAfQorICAvLy8gXG5hbWUgVmFsdWUgR2VuZXJhdG9ycworICAvLy8gQHsKKworICAvLy8gXGJyaWVmIEdldHMgbWF4aW11bSB1bnNpZ25lZCB2YWx1ZSBvZiBBUEludCBmb3Igc3BlY2lmaWMgYml0IHdpZHRoLgorICBzdGF0aWMgQVBJbnQgZ2V0TWF4VmFsdWUodW5zaWduZWQgbnVtQml0cykgeworICAgIHJldHVybiBnZXRBbGxPbmVzVmFsdWUobnVtQml0cyk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldHMgbWF4aW11bSBzaWduZWQgdmFsdWUgb2YgQVBJbnQgZm9yIGEgc3BlY2lmaWMgYml0IHdpZHRoLgorICBzdGF0aWMgQVBJbnQgZ2V0U2lnbmVkTWF4VmFsdWUodW5zaWduZWQgbnVtQml0cykgeworICAgIEFQSW50IEFQSSA9IGdldEFsbE9uZXNWYWx1ZShudW1CaXRzKTsKKyAgICBBUEkuY2xlYXJCaXQobnVtQml0cyAtIDEpOworICAgIHJldHVybiBBUEk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldHMgbWluaW11bSB1bnNpZ25lZCB2YWx1ZSBvZiBBUEludCBmb3IgYSBzcGVjaWZpYyBiaXQgd2lkdGguCisgIHN0YXRpYyBBUEludCBnZXRNaW5WYWx1ZSh1bnNpZ25lZCBudW1CaXRzKSB7IHJldHVybiBBUEludChudW1CaXRzLCAwKTsgfQorCisgIC8vLyBcYnJpZWYgR2V0cyBtaW5pbXVtIHNpZ25lZCB2YWx1ZSBvZiBBUEludCBmb3IgYSBzcGVjaWZpYyBiaXQgd2lkdGguCisgIHN0YXRpYyBBUEludCBnZXRTaWduZWRNaW5WYWx1ZSh1bnNpZ25lZCBudW1CaXRzKSB7CisgICAgQVBJbnQgQVBJKG51bUJpdHMsIDApOworICAgIEFQSS5zZXRCaXQobnVtQml0cyAtIDEpOworICAgIHJldHVybiBBUEk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgU2lnbk1hc2sgZm9yIGEgc3BlY2lmaWMgYml0IHdpZHRoLgorICAvLy8KKyAgLy8vIFRoaXMgaXMganVzdCBhIHdyYXBwZXIgZnVuY3Rpb24gb2YgZ2V0U2lnbmVkTWluVmFsdWUoKSwgYW5kIGl0IGhlbHBzIGNvZGUKKyAgLy8vIHJlYWRhYmlsaXR5IHdoZW4gd2Ugd2FudCB0byBnZXQgYSBTaWduTWFzay4KKyAgc3RhdGljIEFQSW50IGdldFNpZ25NYXNrKHVuc2lnbmVkIEJpdFdpZHRoKSB7CisgICAgcmV0dXJuIGdldFNpZ25lZE1pblZhbHVlKEJpdFdpZHRoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBhbGwtb25lcyB2YWx1ZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgYWxsLW9uZXMgdmFsdWUgZm9yIGFuIEFQSW50IG9mIHRoZSBzcGVjaWZpZWQgYml0LXdpZHRoLgorICBzdGF0aWMgQVBJbnQgZ2V0QWxsT25lc1ZhbHVlKHVuc2lnbmVkIG51bUJpdHMpIHsKKyAgICByZXR1cm4gQVBJbnQobnVtQml0cywgV09SRF9NQVgsIHRydWUpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlICcwJyB2YWx1ZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgJzAnIHZhbHVlIGZvciBhbiBBUEludCBvZiB0aGUgc3BlY2lmaWVkIGJpdC13aWR0aC4KKyAgc3RhdGljIEFQSW50IGdldE51bGxWYWx1ZSh1bnNpZ25lZCBudW1CaXRzKSB7IHJldHVybiBBUEludChudW1CaXRzLCAwKTsgfQorCisgIC8vLyBcYnJpZWYgQ29tcHV0ZSBhbiBBUEludCBjb250YWluaW5nIG51bUJpdHMgaGlnaGJpdHMgZnJvbSB0aGlzIEFQSW50LgorICAvLy8KKyAgLy8vIEdldCBhbiBBUEludCB3aXRoIHRoZSBzYW1lIEJpdFdpZHRoIGFzIHRoaXMgQVBJbnQsIGp1c3QgemVybyBtYXNrCisgIC8vLyB0aGUgbG93IGJpdHMgYW5kIHJpZ2h0IHNoaWZ0IHRvIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuCisgIC8vLworICAvLy8gXHJldHVybnMgdGhlIGhpZ2ggIm51bUJpdHMiIGJpdHMgb2YgdGhpcyBBUEludC4KKyAgQVBJbnQgZ2V0SGlCaXRzKHVuc2lnbmVkIG51bUJpdHMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQ29tcHV0ZSBhbiBBUEludCBjb250YWluaW5nIG51bUJpdHMgbG93Yml0cyBmcm9tIHRoaXMgQVBJbnQuCisgIC8vLworICAvLy8gR2V0IGFuIEFQSW50IHdpdGggdGhlIHNhbWUgQml0V2lkdGggYXMgdGhpcyBBUEludCwganVzdCB6ZXJvIG1hc2sKKyAgLy8vIHRoZSBoaWdoIGJpdHMuCisgIC8vLworICAvLy8gXHJldHVybnMgdGhlIGxvdyAibnVtQml0cyIgYml0cyBvZiB0aGlzIEFQSW50LgorICBBUEludCBnZXRMb0JpdHModW5zaWduZWQgbnVtQml0cykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYW4gQVBJbnQgd2l0aCBleGFjdGx5IG9uZSBiaXQgc2V0IGluIHRoZSByZXN1bHQuCisgIHN0YXRpYyBBUEludCBnZXRPbmVCaXRTZXQodW5zaWduZWQgbnVtQml0cywgdW5zaWduZWQgQml0Tm8pIHsKKyAgICBBUEludCBSZXMobnVtQml0cywgMCk7CisgICAgUmVzLnNldEJpdChCaXRObyk7CisgICAgcmV0dXJuIFJlczsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGEgdmFsdWUgd2l0aCBhIGJsb2NrIG9mIGJpdHMgc2V0LgorICAvLy8KKyAgLy8vIENvbnN0cnVjdHMgYW4gQVBJbnQgdmFsdWUgdGhhdCBoYXMgYSBjb250aWd1b3VzIHJhbmdlIG9mIGJpdHMgc2V0LiBUaGUKKyAgLy8vIGJpdHMgZnJvbSBsb0JpdCAoaW5jbHVzaXZlKSB0byBoaUJpdCAoZXhjbHVzaXZlKSB3aWxsIGJlIHNldC4gQWxsIG90aGVyCisgIC8vLyBiaXRzIHdpbGwgYmUgemVyby4gRm9yIGV4YW1wbGUsIHdpdGggcGFyYW1ldGVycygzMiwgMCwgMTYpIHlvdSB3b3VsZCBnZXQKKyAgLy8vIDB4MDAwMEZGRkYuIElmIGhpQml0IGlzIGxlc3MgdGhhbiBsb0JpdCB0aGVuIHRoZSBzZXQgYml0cyAid3JhcCIuIEZvcgorICAvLy8gZXhhbXBsZSwgd2l0aCBwYXJhbWV0ZXJzICgzMiwgMjgsIDQpLCB5b3Ugd291bGQgZ2V0IDB4RjAwMDAwMEYuCisgIC8vLworICAvLy8gXHBhcmFtIG51bUJpdHMgdGhlIGludGVuZGVkIGJpdCB3aWR0aCBvZiB0aGUgcmVzdWx0CisgIC8vLyBccGFyYW0gbG9CaXQgdGhlIGluZGV4IG9mIHRoZSBsb3dlc3QgYml0IHNldC4KKyAgLy8vIFxwYXJhbSBoaUJpdCB0aGUgaW5kZXggb2YgdGhlIGhpZ2hlc3QgYml0IHNldC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBBbiBBUEludCB2YWx1ZSB3aXRoIHRoZSByZXF1ZXN0ZWQgYml0cyBzZXQuCisgIHN0YXRpYyBBUEludCBnZXRCaXRzU2V0KHVuc2lnbmVkIG51bUJpdHMsIHVuc2lnbmVkIGxvQml0LCB1bnNpZ25lZCBoaUJpdCkgeworICAgIEFQSW50IFJlcyhudW1CaXRzLCAwKTsKKyAgICBSZXMuc2V0Qml0cyhsb0JpdCwgaGlCaXQpOworICAgIHJldHVybiBSZXM7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBhIHZhbHVlIHdpdGggdXBwZXIgYml0cyBzdGFydGluZyBhdCBsb0JpdCBzZXQuCisgIC8vLworICAvLy8gQ29uc3RydWN0cyBhbiBBUEludCB2YWx1ZSB0aGF0IGhhcyBhIGNvbnRpZ3VvdXMgcmFuZ2Ugb2YgYml0cyBzZXQuIFRoZQorICAvLy8gYml0cyBmcm9tIGxvQml0IChpbmNsdXNpdmUpIHRvIG51bUJpdHMgKGV4Y2x1c2l2ZSkgd2lsbCBiZSBzZXQuIEFsbCBvdGhlcgorICAvLy8gYml0cyB3aWxsIGJlIHplcm8uIEZvciBleGFtcGxlLCB3aXRoIHBhcmFtZXRlcnMoMzIsIDEyKSB5b3Ugd291bGQgZ2V0CisgIC8vLyAweEZGRkZGMDAwLgorICAvLy8KKyAgLy8vIFxwYXJhbSBudW1CaXRzIHRoZSBpbnRlbmRlZCBiaXQgd2lkdGggb2YgdGhlIHJlc3VsdAorICAvLy8gXHBhcmFtIGxvQml0IHRoZSBpbmRleCBvZiB0aGUgbG93ZXN0IGJpdCB0byBzZXQuCisgIC8vLworICAvLy8gXHJldHVybnMgQW4gQVBJbnQgdmFsdWUgd2l0aCB0aGUgcmVxdWVzdGVkIGJpdHMgc2V0LgorICBzdGF0aWMgQVBJbnQgZ2V0Qml0c1NldEZyb20odW5zaWduZWQgbnVtQml0cywgdW5zaWduZWQgbG9CaXQpIHsKKyAgICBBUEludCBSZXMobnVtQml0cywgMCk7CisgICAgUmVzLnNldEJpdHNGcm9tKGxvQml0KTsKKyAgICByZXR1cm4gUmVzOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYSB2YWx1ZSB3aXRoIGhpZ2ggYml0cyBzZXQKKyAgLy8vCisgIC8vLyBDb25zdHJ1Y3RzIGFuIEFQSW50IHZhbHVlIHRoYXQgaGFzIHRoZSB0b3AgaGlCaXRzU2V0IGJpdHMgc2V0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBudW1CaXRzIHRoZSBiaXR3aWR0aCBvZiB0aGUgcmVzdWx0CisgIC8vLyBccGFyYW0gaGlCaXRzU2V0IHRoZSBudW1iZXIgb2YgaGlnaC1vcmRlciBiaXRzIHNldCBpbiB0aGUgcmVzdWx0LgorICBzdGF0aWMgQVBJbnQgZ2V0SGlnaEJpdHNTZXQodW5zaWduZWQgbnVtQml0cywgdW5zaWduZWQgaGlCaXRzU2V0KSB7CisgICAgQVBJbnQgUmVzKG51bUJpdHMsIDApOworICAgIFJlcy5zZXRIaWdoQml0cyhoaUJpdHNTZXQpOworICAgIHJldHVybiBSZXM7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBhIHZhbHVlIHdpdGggbG93IGJpdHMgc2V0CisgIC8vLworICAvLy8gQ29uc3RydWN0cyBhbiBBUEludCB2YWx1ZSB0aGF0IGhhcyB0aGUgYm90dG9tIGxvQml0c1NldCBiaXRzIHNldC4KKyAgLy8vCisgIC8vLyBccGFyYW0gbnVtQml0cyB0aGUgYml0d2lkdGggb2YgdGhlIHJlc3VsdAorICAvLy8gXHBhcmFtIGxvQml0c1NldCB0aGUgbnVtYmVyIG9mIGxvdy1vcmRlciBiaXRzIHNldCBpbiB0aGUgcmVzdWx0LgorICBzdGF0aWMgQVBJbnQgZ2V0TG93Qml0c1NldCh1bnNpZ25lZCBudW1CaXRzLCB1bnNpZ25lZCBsb0JpdHNTZXQpIHsKKyAgICBBUEludCBSZXMobnVtQml0cywgMCk7CisgICAgUmVzLnNldExvd0JpdHMobG9CaXRzU2V0KTsKKyAgICByZXR1cm4gUmVzOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSB2YWx1ZSBjb250YWluaW5nIFYgYnJvYWRjYXN0ZWQgb3ZlciBOZXdMZW4gYml0cy4KKyAgc3RhdGljIEFQSW50IGdldFNwbGF0KHVuc2lnbmVkIE5ld0xlbiwgY29uc3QgQVBJbnQgJlYpOworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIHR3byBBUEludHMgaGF2ZSB0aGUgc2FtZSB2YWx1ZSwgYWZ0ZXIgemVyby1leHRlbmRpbmcKKyAgLy8vIG9uZSBvZiB0aGVtIChpZiBuZWVkZWQhKSB0byBlbnN1cmUgdGhhdCB0aGUgYml0LXdpZHRocyBtYXRjaC4KKyAgc3RhdGljIGJvb2wgaXNTYW1lVmFsdWUoY29uc3QgQVBJbnQgJkkxLCBjb25zdCBBUEludCAmSTIpIHsKKyAgICBpZiAoSTEuZ2V0Qml0V2lkdGgoKSA9PSBJMi5nZXRCaXRXaWR0aCgpKQorICAgICAgcmV0dXJuIEkxID09IEkyOworCisgICAgaWYgKEkxLmdldEJpdFdpZHRoKCkgPiBJMi5nZXRCaXRXaWR0aCgpKQorICAgICAgcmV0dXJuIEkxID09IEkyLnpleHQoSTEuZ2V0Qml0V2lkdGgoKSk7CisKKyAgICByZXR1cm4gSTEuemV4dChJMi5nZXRCaXRXaWR0aCgpKSA9PSBJMjsKKyAgfQorCisgIC8vLyBcYnJpZWYgT3ZlcmxvYWQgdG8gY29tcHV0ZSBhIGhhc2hfY29kZSBmb3IgYW4gQVBJbnQgdmFsdWUuCisgIGZyaWVuZCBoYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBBUEludCAmQXJnKTsKKworICAvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgc3RvcmFnZSBvZiB0aGUgQVBJbnQuCisgIC8vLyBUaGlzIGlzIHVzZWZ1bCBmb3Igd3JpdGluZyBvdXQgdGhlIEFQSW50IGluIGJpbmFyeSBmb3JtIHdpdGhvdXQgYW55CisgIC8vLyBjb252ZXJzaW9ucy4KKyAgY29uc3QgdWludDY0X3QgKmdldFJhd0RhdGEoKSBjb25zdCB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgcmV0dXJuICZVLlZBTDsKKyAgICByZXR1cm4gJlUucFZhbFswXTsKKyAgfQorCisgIC8vLyBAfQorICAvLy8gXG5hbWUgVW5hcnkgT3BlcmF0b3JzCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgUG9zdGZpeCBpbmNyZW1lbnQgb3BlcmF0b3IuCisgIC8vLworICAvLy8gSW5jcmVtZW50cyAqdGhpcyBieSAxLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgbmV3IEFQSW50IHZhbHVlIHJlcHJlc2VudGluZyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgKnRoaXMuCisgIGNvbnN0IEFQSW50IG9wZXJhdG9yKysoaW50KSB7CisgICAgQVBJbnQgQVBJKCp0aGlzKTsKKyAgICArKygqdGhpcyk7CisgICAgcmV0dXJuIEFQSTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUHJlZml4IGluY3JlbWVudCBvcGVyYXRvci4KKyAgLy8vCisgIC8vLyBccmV0dXJucyAqdGhpcyBpbmNyZW1lbnRlZCBieSBvbmUKKyAgQVBJbnQgJm9wZXJhdG9yKysoKTsKKworICAvLy8gXGJyaWVmIFBvc3RmaXggZGVjcmVtZW50IG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIERlY3JlbWVudHMgKnRoaXMgYnkgMS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIG5ldyBBUEludCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG9yaWdpbmFsIHZhbHVlIG9mICp0aGlzLgorICBjb25zdCBBUEludCBvcGVyYXRvci0tKGludCkgeworICAgIEFQSW50IEFQSSgqdGhpcyk7CisgICAgLS0oKnRoaXMpOworICAgIHJldHVybiBBUEk7CisgIH0KKworICAvLy8gXGJyaWVmIFByZWZpeCBkZWNyZW1lbnQgb3BlcmF0b3IuCisgIC8vLworICAvLy8gXHJldHVybnMgKnRoaXMgZGVjcmVtZW50ZWQgYnkgb25lLgorICBBUEludCAmb3BlcmF0b3ItLSgpOworCisgIC8vLyBcYnJpZWYgTG9naWNhbCBuZWdhdGlvbiBvcGVyYXRvci4KKyAgLy8vCisgIC8vLyBQZXJmb3JtcyBsb2dpY2FsIG5lZ2F0aW9uIG9wZXJhdGlvbiBvbiB0aGlzIEFQSW50LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgaXMgemVybywgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICByZXR1cm4gVS5WQUwgPT0gMDsKKyAgICByZXR1cm4gY291bnRMZWFkaW5nWmVyb3NTbG93Q2FzZSgpID09IEJpdFdpZHRoOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBBc3NpZ25tZW50IE9wZXJhdG9ycworICAvLy8gQHsKKworICAvLy8gXGJyaWVmIENvcHkgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgLy8vCisgIC8vLyBccmV0dXJucyAqdGhpcyBhZnRlciBhc3NpZ25tZW50IG9mIFJIUy4KKyAgQVBJbnQgJm9wZXJhdG9yPShjb25zdCBBUEludCAmUkhTKSB7CisgICAgLy8gSWYgdGhlIGJpdHdpZHRocyBhcmUgdGhlIHNhbWUsIHdlIGNhbiBhdm9pZCBtdWNraW5nIHdpdGggbWVtb3J5CisgICAgaWYgKGlzU2luZ2xlV29yZCgpICYmIFJIUy5pc1NpbmdsZVdvcmQoKSkgeworICAgICAgVS5WQUwgPSBSSFMuVS5WQUw7CisgICAgICBCaXRXaWR0aCA9IFJIUy5CaXRXaWR0aDsKKyAgICAgIHJldHVybiBjbGVhclVudXNlZEJpdHMoKTsKKyAgICB9CisKKyAgICBBc3NpZ25TbG93Q2FzZShSSFMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBAYnJpZWYgTW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICBBUEludCAmb3BlcmF0b3I9KEFQSW50ICYmdGhhdCkgeworICAgIGFzc2VydCh0aGlzICE9ICZ0aGF0ICYmICJTZWxmLW1vdmUgbm90IHN1cHBvcnRlZCIpOworICAgIGlmICghaXNTaW5nbGVXb3JkKCkpCisgICAgICBkZWxldGVbXSBVLnBWYWw7CisKKyAgICAvLyBVc2UgbWVtY3B5IHNvIHRoYXQgdHlwZSBiYXNlZCBhbGlhcyBhbmFseXNpcyBzZWVzIGJvdGggVkFMIGFuZCBwVmFsCisgICAgLy8gYXMgbW9kaWZpZWQuCisgICAgbWVtY3B5KCZVLCAmdGhhdC5VLCBzaXplb2YoVSkpOworCisgICAgQml0V2lkdGggPSB0aGF0LkJpdFdpZHRoOworICAgIHRoYXQuQml0V2lkdGggPSAwOworCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBBc3NpZ25tZW50IG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIFRoZSBSSFMgdmFsdWUgaXMgYXNzaWduZWQgdG8gKnRoaXMuIElmIHRoZSBzaWduaWZpY2FudCBiaXRzIGluIFJIUyBleGNlZWQKKyAgLy8vIHRoZSBiaXQgd2lkdGgsIHRoZSBleGNlc3MgYml0cyBhcmUgdHJ1bmNhdGVkLiBJZiB0aGUgYml0IHdpZHRoIGlzIGxhcmdlcgorICAvLy8gdGhhbiA2NCwgdGhlIHZhbHVlIGlzIHplcm8gZmlsbGVkIGluIHRoZSB1bnNwZWNpZmllZCBoaWdoIG9yZGVyIGJpdHMuCisgIC8vLworICAvLy8gXHJldHVybnMgKnRoaXMgYWZ0ZXIgYXNzaWdubWVudCBvZiBSSFMgdmFsdWUuCisgIEFQSW50ICZvcGVyYXRvcj0odWludDY0X3QgUkhTKSB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKSB7CisgICAgICBVLlZBTCA9IFJIUzsKKyAgICAgIGNsZWFyVW51c2VkQml0cygpOworICAgIH0gZWxzZSB7CisgICAgICBVLnBWYWxbMF0gPSBSSFM7CisgICAgICBtZW1zZXQoVS5wVmFsKzEsIDAsIChnZXROdW1Xb3JkcygpIC0gMSkgKiBBUElOVF9XT1JEX1NJWkUpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIEJpdHdpc2UgQU5EIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIC8vLworICAvLy8gUGVyZm9ybXMgYSBiaXR3aXNlIEFORCBvcGVyYXRpb24gb24gdGhpcyBBUEludCBhbmQgUkhTLiBUaGUgcmVzdWx0IGlzCisgIC8vLyBhc3NpZ25lZCB0byAqdGhpcy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyAqdGhpcyBhZnRlciBBTkRpbmcgd2l0aCBSSFMuCisgIEFQSW50ICZvcGVyYXRvciY9KGNvbnN0IEFQSW50ICZSSFMpIHsKKyAgICBhc3NlcnQoQml0V2lkdGggPT0gUkhTLkJpdFdpZHRoICYmICJCaXQgd2lkdGhzIG11c3QgYmUgdGhlIHNhbWUiKTsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICBVLlZBTCAmPSBSSFMuVS5WQUw7CisgICAgZWxzZQorICAgICAgQW5kQXNzaWduU2xvd0Nhc2UoUkhTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIEJpdHdpc2UgQU5EIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIC8vLworICAvLy8gUGVyZm9ybXMgYSBiaXR3aXNlIEFORCBvcGVyYXRpb24gb24gdGhpcyBBUEludCBhbmQgUkhTLiBSSFMgaXMKKyAgLy8vIGxvZ2ljYWxseSB6ZXJvLWV4dGVuZGVkIG9yIHRydW5jYXRlZCB0byBtYXRjaCB0aGUgYml0LXdpZHRoIG9mCisgIC8vLyB0aGUgTEhTLgorICBBUEludCAmb3BlcmF0b3ImPSh1aW50NjRfdCBSSFMpIHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpIHsKKyAgICAgIFUuVkFMICY9IFJIUzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgVS5wVmFsWzBdICY9IFJIUzsKKyAgICBtZW1zZXQoVS5wVmFsKzEsIDAsIChnZXROdW1Xb3JkcygpIC0gMSkgKiBBUElOVF9XT1JEX1NJWkUpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBcYnJpZWYgQml0d2lzZSBPUiBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIFBlcmZvcm1zIGEgYml0d2lzZSBPUiBvcGVyYXRpb24gb24gdGhpcyBBUEludCBhbmQgUkhTLiBUaGUgcmVzdWx0IGlzCisgIC8vLyBhc3NpZ25lZCAqdGhpczsKKyAgLy8vCisgIC8vLyBccmV0dXJucyAqdGhpcyBhZnRlciBPUmluZyB3aXRoIFJIUy4KKyAgQVBJbnQgJm9wZXJhdG9yfD0oY29uc3QgQVBJbnQgJlJIUykgeworICAgIGFzc2VydChCaXRXaWR0aCA9PSBSSFMuQml0V2lkdGggJiYgIkJpdCB3aWR0aHMgbXVzdCBiZSB0aGUgc2FtZSIpOworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIFUuVkFMIHw9IFJIUy5VLlZBTDsKKyAgICBlbHNlCisgICAgICBPckFzc2lnblNsb3dDYXNlKFJIUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBCaXR3aXNlIE9SIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIC8vLworICAvLy8gUGVyZm9ybXMgYSBiaXR3aXNlIE9SIG9wZXJhdGlvbiBvbiB0aGlzIEFQSW50IGFuZCBSSFMuIFJIUyBpcworICAvLy8gbG9naWNhbGx5IHplcm8tZXh0ZW5kZWQgb3IgdHJ1bmNhdGVkIHRvIG1hdGNoIHRoZSBiaXQtd2lkdGggb2YKKyAgLy8vIHRoZSBMSFMuCisgIEFQSW50ICZvcGVyYXRvcnw9KHVpbnQ2NF90IFJIUykgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkgeworICAgICAgVS5WQUwgfD0gUkhTOworICAgICAgY2xlYXJVbnVzZWRCaXRzKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFUucFZhbFswXSB8PSBSSFM7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBcYnJpZWYgQml0d2lzZSBYT1IgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgLy8vCisgIC8vLyBQZXJmb3JtcyBhIGJpdHdpc2UgWE9SIG9wZXJhdGlvbiBvbiB0aGlzIEFQSW50IGFuZCBSSFMuIFRoZSByZXN1bHQgaXMKKyAgLy8vIGFzc2lnbmVkIHRvICp0aGlzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zICp0aGlzIGFmdGVyIFhPUmluZyB3aXRoIFJIUy4KKyAgQVBJbnQgJm9wZXJhdG9yXj0oY29uc3QgQVBJbnQgJlJIUykgeworICAgIGFzc2VydChCaXRXaWR0aCA9PSBSSFMuQml0V2lkdGggJiYgIkJpdCB3aWR0aHMgbXVzdCBiZSB0aGUgc2FtZSIpOworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIFUuVkFMIF49IFJIUy5VLlZBTDsKKyAgICBlbHNlCisgICAgICBYb3JBc3NpZ25TbG93Q2FzZShSSFMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBcYnJpZWYgQml0d2lzZSBYT1IgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgLy8vCisgIC8vLyBQZXJmb3JtcyBhIGJpdHdpc2UgWE9SIG9wZXJhdGlvbiBvbiB0aGlzIEFQSW50IGFuZCBSSFMuIFJIUyBpcworICAvLy8gbG9naWNhbGx5IHplcm8tZXh0ZW5kZWQgb3IgdHJ1bmNhdGVkIHRvIG1hdGNoIHRoZSBiaXQtd2lkdGggb2YKKyAgLy8vIHRoZSBMSFMuCisgIEFQSW50ICZvcGVyYXRvcl49KHVpbnQ2NF90IFJIUykgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkgeworICAgICAgVS5WQUwgXj0gUkhTOworICAgICAgY2xlYXJVbnVzZWRCaXRzKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFUucFZhbFswXSBePSBSSFM7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBcYnJpZWYgTXVsdGlwbGljYXRpb24gYXNzaWdubWVudCBvcGVyYXRvci4KKyAgLy8vCisgIC8vLyBNdWx0aXBsaWVzIHRoaXMgQVBJbnQgYnkgUkhTIGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gKnRoaXMuCisgIC8vLworICAvLy8gXHJldHVybnMgKnRoaXMKKyAgQVBJbnQgJm9wZXJhdG9yKj0oY29uc3QgQVBJbnQgJlJIUyk7CisgIEFQSW50ICZvcGVyYXRvcio9KHVpbnQ2NF90IFJIUyk7CisKKyAgLy8vIFxicmllZiBBZGRpdGlvbiBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIEFkZHMgUkhTIHRvICp0aGlzIGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gKnRoaXMuCisgIC8vLworICAvLy8gXHJldHVybnMgKnRoaXMKKyAgQVBJbnQgJm9wZXJhdG9yKz0oY29uc3QgQVBJbnQgJlJIUyk7CisgIEFQSW50ICZvcGVyYXRvcis9KHVpbnQ2NF90IFJIUyk7CisKKyAgLy8vIFxicmllZiBTdWJ0cmFjdGlvbiBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIFN1YnRyYWN0cyBSSFMgZnJvbSAqdGhpcyBhbmQgYXNzaWducyB0aGUgcmVzdWx0IHRvICp0aGlzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zICp0aGlzCisgIEFQSW50ICZvcGVyYXRvci09KGNvbnN0IEFQSW50ICZSSFMpOworICBBUEludCAmb3BlcmF0b3ItPSh1aW50NjRfdCBSSFMpOworCisgIC8vLyBcYnJpZWYgTGVmdC1zaGlmdCBhc3NpZ25tZW50IGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFNoaWZ0cyAqdGhpcyBsZWZ0IGJ5IHNoaWZ0QW10IGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gKnRoaXMuCisgIC8vLworICAvLy8gXHJldHVybnMgKnRoaXMgYWZ0ZXIgc2hpZnRpbmcgbGVmdCBieSBTaGlmdEFtdAorICBBUEludCAmb3BlcmF0b3I8PD0odW5zaWduZWQgU2hpZnRBbXQpIHsKKyAgICBhc3NlcnQoU2hpZnRBbXQgPD0gQml0V2lkdGggJiYgIkludmFsaWQgc2hpZnQgYW1vdW50Iik7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKSB7CisgICAgICBpZiAoU2hpZnRBbXQgPT0gQml0V2lkdGgpCisgICAgICAgIFUuVkFMID0gMDsKKyAgICAgIGVsc2UKKyAgICAgICAgVS5WQUwgPDw9IFNoaWZ0QW10OworICAgICAgcmV0dXJuIGNsZWFyVW51c2VkQml0cygpOworICAgIH0KKyAgICBzaGxTbG93Q2FzZShTaGlmdEFtdCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBMZWZ0LXNoaWZ0IGFzc2lnbm1lbnQgZnVuY3Rpb24uCisgIC8vLworICAvLy8gU2hpZnRzICp0aGlzIGxlZnQgYnkgc2hpZnRBbXQgYW5kIGFzc2lnbnMgdGhlIHJlc3VsdCB0byAqdGhpcy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyAqdGhpcyBhZnRlciBzaGlmdGluZyBsZWZ0IGJ5IFNoaWZ0QW10CisgIEFQSW50ICZvcGVyYXRvcjw8PShjb25zdCBBUEludCAmU2hpZnRBbXQpOworCisgIC8vLyBAfQorICAvLy8gXG5hbWUgQmluYXJ5IE9wZXJhdG9ycworICAvLy8gQHsKKworICAvLy8gXGJyaWVmIE11bHRpcGxpY2F0aW9uIG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIE11bHRpcGxpZXMgdGhpcyBBUEludCBieSBSSFMgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAgQVBJbnQgb3BlcmF0b3IqKGNvbnN0IEFQSW50ICZSSFMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgTGVmdCBsb2dpY2FsIHNoaWZ0IG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIFNoaWZ0cyB0aGlzIEFQSW50IGxlZnQgYnkgXHAgQml0cyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICBBUEludCBvcGVyYXRvcjw8KHVuc2lnbmVkIEJpdHMpIGNvbnN0IHsgcmV0dXJuIHNobChCaXRzKTsgfQorCisgIC8vLyBcYnJpZWYgTGVmdCBsb2dpY2FsIHNoaWZ0IG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIFNoaWZ0cyB0aGlzIEFQSW50IGxlZnQgYnkgXHAgQml0cyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICBBUEludCBvcGVyYXRvcjw8KGNvbnN0IEFQSW50ICZCaXRzKSBjb25zdCB7IHJldHVybiBzaGwoQml0cyk7IH0KKworICAvLy8gXGJyaWVmIEFyaXRobWV0aWMgcmlnaHQtc2hpZnQgZnVuY3Rpb24uCisgIC8vLworICAvLy8gQXJpdGhtZXRpYyByaWdodC1zaGlmdCB0aGlzIEFQSW50IGJ5IHNoaWZ0QW10LgorICBBUEludCBhc2hyKHVuc2lnbmVkIFNoaWZ0QW10KSBjb25zdCB7CisgICAgQVBJbnQgUigqdGhpcyk7CisgICAgUi5hc2hySW5QbGFjZShTaGlmdEFtdCk7CisgICAgcmV0dXJuIFI7CisgIH0KKworICAvLy8gQXJpdGhtZXRpYyByaWdodC1zaGlmdCB0aGlzIEFQSW50IGJ5IFNoaWZ0QW10IGluIHBsYWNlLgorICB2b2lkIGFzaHJJblBsYWNlKHVuc2lnbmVkIFNoaWZ0QW10KSB7CisgICAgYXNzZXJ0KFNoaWZ0QW10IDw9IEJpdFdpZHRoICYmICJJbnZhbGlkIHNoaWZ0IGFtb3VudCIpOworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkgeworICAgICAgaW50NjRfdCBTRXh0VkFMID0gU2lnbkV4dGVuZDY0KFUuVkFMLCBCaXRXaWR0aCk7CisgICAgICBpZiAoU2hpZnRBbXQgPT0gQml0V2lkdGgpCisgICAgICAgIFUuVkFMID0gU0V4dFZBTCA+PiAoQVBJTlRfQklUU19QRVJfV09SRCAtIDEpOyAvLyBGaWxsIHdpdGggc2lnbiBiaXQuCisgICAgICBlbHNlCisgICAgICAgIFUuVkFMID0gU0V4dFZBTCA+PiBTaGlmdEFtdDsKKyAgICAgIGNsZWFyVW51c2VkQml0cygpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhc2hyU2xvd0Nhc2UoU2hpZnRBbXQpOworICB9CisKKyAgLy8vIFxicmllZiBMb2dpY2FsIHJpZ2h0LXNoaWZ0IGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIExvZ2ljYWwgcmlnaHQtc2hpZnQgdGhpcyBBUEludCBieSBzaGlmdEFtdC4KKyAgQVBJbnQgbHNocih1bnNpZ25lZCBzaGlmdEFtdCkgY29uc3QgeworICAgIEFQSW50IFIoKnRoaXMpOworICAgIFIubHNockluUGxhY2Uoc2hpZnRBbXQpOworICAgIHJldHVybiBSOworICB9CisKKyAgLy8vIExvZ2ljYWwgcmlnaHQtc2hpZnQgdGhpcyBBUEludCBieSBTaGlmdEFtdCBpbiBwbGFjZS4KKyAgdm9pZCBsc2hySW5QbGFjZSh1bnNpZ25lZCBTaGlmdEFtdCkgeworICAgIGFzc2VydChTaGlmdEFtdCA8PSBCaXRXaWR0aCAmJiAiSW52YWxpZCBzaGlmdCBhbW91bnQiKTsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpIHsKKyAgICAgIGlmIChTaGlmdEFtdCA9PSBCaXRXaWR0aCkKKyAgICAgICAgVS5WQUwgPSAwOworICAgICAgZWxzZQorICAgICAgICBVLlZBTCA+Pj0gU2hpZnRBbXQ7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGxzaHJTbG93Q2FzZShTaGlmdEFtdCk7CisgIH0KKworICAvLy8gXGJyaWVmIExlZnQtc2hpZnQgZnVuY3Rpb24uCisgIC8vLworICAvLy8gTGVmdC1zaGlmdCB0aGlzIEFQSW50IGJ5IHNoaWZ0QW10LgorICBBUEludCBzaGwodW5zaWduZWQgc2hpZnRBbXQpIGNvbnN0IHsKKyAgICBBUEludCBSKCp0aGlzKTsKKyAgICBSIDw8PSBzaGlmdEFtdDsKKyAgICByZXR1cm4gUjsKKyAgfQorCisgIC8vLyBcYnJpZWYgUm90YXRlIGxlZnQgYnkgcm90YXRlQW10LgorICBBUEludCByb3RsKHVuc2lnbmVkIHJvdGF0ZUFtdCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSb3RhdGUgcmlnaHQgYnkgcm90YXRlQW10LgorICBBUEludCByb3RyKHVuc2lnbmVkIHJvdGF0ZUFtdCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBBcml0aG1ldGljIHJpZ2h0LXNoaWZ0IGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIEFyaXRobWV0aWMgcmlnaHQtc2hpZnQgdGhpcyBBUEludCBieSBzaGlmdEFtdC4KKyAgQVBJbnQgYXNocihjb25zdCBBUEludCAmU2hpZnRBbXQpIGNvbnN0IHsKKyAgICBBUEludCBSKCp0aGlzKTsKKyAgICBSLmFzaHJJblBsYWNlKFNoaWZ0QW10KTsKKyAgICByZXR1cm4gUjsKKyAgfQorCisgIC8vLyBBcml0aG1ldGljIHJpZ2h0LXNoaWZ0IHRoaXMgQVBJbnQgYnkgc2hpZnRBbXQgaW4gcGxhY2UuCisgIHZvaWQgYXNockluUGxhY2UoY29uc3QgQVBJbnQgJnNoaWZ0QW10KTsKKworICAvLy8gXGJyaWVmIExvZ2ljYWwgcmlnaHQtc2hpZnQgZnVuY3Rpb24uCisgIC8vLworICAvLy8gTG9naWNhbCByaWdodC1zaGlmdCB0aGlzIEFQSW50IGJ5IHNoaWZ0QW10LgorICBBUEludCBsc2hyKGNvbnN0IEFQSW50ICZTaGlmdEFtdCkgY29uc3QgeworICAgIEFQSW50IFIoKnRoaXMpOworICAgIFIubHNockluUGxhY2UoU2hpZnRBbXQpOworICAgIHJldHVybiBSOworICB9CisKKyAgLy8vIExvZ2ljYWwgcmlnaHQtc2hpZnQgdGhpcyBBUEludCBieSBTaGlmdEFtdCBpbiBwbGFjZS4KKyAgdm9pZCBsc2hySW5QbGFjZShjb25zdCBBUEludCAmU2hpZnRBbXQpOworCisgIC8vLyBcYnJpZWYgTGVmdC1zaGlmdCBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBMZWZ0LXNoaWZ0IHRoaXMgQVBJbnQgYnkgc2hpZnRBbXQuCisgIEFQSW50IHNobChjb25zdCBBUEludCAmU2hpZnRBbXQpIGNvbnN0IHsKKyAgICBBUEludCBSKCp0aGlzKTsKKyAgICBSIDw8PSBTaGlmdEFtdDsKKyAgICByZXR1cm4gUjsKKyAgfQorCisgIC8vLyBcYnJpZWYgUm90YXRlIGxlZnQgYnkgcm90YXRlQW10LgorICBBUEludCByb3RsKGNvbnN0IEFQSW50ICZyb3RhdGVBbXQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUm90YXRlIHJpZ2h0IGJ5IHJvdGF0ZUFtdC4KKyAgQVBJbnQgcm90cihjb25zdCBBUEludCAmcm90YXRlQW10KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFVuc2lnbmVkIGRpdmlzaW9uIG9wZXJhdGlvbi4KKyAgLy8vCisgIC8vLyBQZXJmb3JtIGFuIHVuc2lnbmVkIGRpdmlkZSBvcGVyYXRpb24gb24gdGhpcyBBUEludCBieSBSSFMuIEJvdGggdGhpcyBhbmQKKyAgLy8vIFJIUyBhcmUgdHJlYXRlZCBhcyB1bnNpZ25lZCBxdWFudGl0aWVzIGZvciBwdXJwb3NlcyBvZiB0aGlzIGRpdmlzaW9uLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgbmV3IEFQSW50IHZhbHVlIGNvbnRhaW5pbmcgdGhlIGRpdmlzaW9uIHJlc3VsdAorICBBUEludCB1ZGl2KGNvbnN0IEFQSW50ICZSSFMpIGNvbnN0OworICBBUEludCB1ZGl2KHVpbnQ2NF90IFJIUykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTaWduZWQgZGl2aXNpb24gZnVuY3Rpb24gZm9yIEFQSW50LgorICAvLy8KKyAgLy8vIFNpZ25lZCBkaXZpZGUgdGhpcyBBUEludCBieSBBUEludCBSSFMuCisgIEFQSW50IHNkaXYoY29uc3QgQVBJbnQgJlJIUykgY29uc3Q7CisgIEFQSW50IHNkaXYoaW50NjRfdCBSSFMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVW5zaWduZWQgcmVtYWluZGVyIG9wZXJhdGlvbi4KKyAgLy8vCisgIC8vLyBQZXJmb3JtIGFuIHVuc2lnbmVkIHJlbWFpbmRlciBvcGVyYXRpb24gb24gdGhpcyBBUEludCB3aXRoIFJIUyBiZWluZyB0aGUKKyAgLy8vIGRpdmlzb3IuIEJvdGggdGhpcyBhbmQgUkhTIGFyZSB0cmVhdGVkIGFzIHVuc2lnbmVkIHF1YW50aXRpZXMgZm9yIHB1cnBvc2VzCisgIC8vLyBvZiB0aGlzIG9wZXJhdGlvbi4gTm90ZSB0aGF0IHRoaXMgaXMgYSB0cnVlIHJlbWFpbmRlciBvcGVyYXRpb24gYW5kIG5vdCBhCisgIC8vLyBtb2R1bG8gb3BlcmF0aW9uIGJlY2F1c2UgdGhlIHNpZ24gZm9sbG93cyB0aGUgc2lnbiBvZiB0aGUgZGl2aWRlbmQgd2hpY2gKKyAgLy8vIGlzICp0aGlzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgbmV3IEFQSW50IHZhbHVlIGNvbnRhaW5pbmcgdGhlIHJlbWFpbmRlciByZXN1bHQKKyAgQVBJbnQgdXJlbShjb25zdCBBUEludCAmUkhTKSBjb25zdDsKKyAgdWludDY0X3QgdXJlbSh1aW50NjRfdCBSSFMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRnVuY3Rpb24gZm9yIHNpZ25lZCByZW1haW5kZXIgb3BlcmF0aW9uLgorICAvLy8KKyAgLy8vIFNpZ25lZCByZW1haW5kZXIgb3BlcmF0aW9uIG9uIEFQSW50LgorICBBUEludCBzcmVtKGNvbnN0IEFQSW50ICZSSFMpIGNvbnN0OworICBpbnQ2NF90IHNyZW0oaW50NjRfdCBSSFMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRHVhbCBkaXZpc2lvbi9yZW1haW5kZXIgaW50ZXJmYWNlLgorICAvLy8KKyAgLy8vIFNvbWV0aW1lcyBpdCBpcyBjb252ZW5pZW50IHRvIGRpdmlkZSB0d28gQVBJbnQgdmFsdWVzIGFuZCBvYnRhaW4gYm90aCB0aGUKKyAgLy8vIHF1b3RpZW50IGFuZCByZW1haW5kZXIuIFRoaXMgZnVuY3Rpb24gZG9lcyBib3RoIG9wZXJhdGlvbnMgaW4gdGhlIHNhbWUKKyAgLy8vIGNvbXB1dGF0aW9uIG1ha2luZyBpdCBhIGxpdHRsZSBtb3JlIGVmZmljaWVudC4gVGhlIHBhaXIgb2YgaW5wdXQgYXJndW1lbnRzCisgIC8vLyBtYXkgb3ZlcmxhcCB3aXRoIHRoZSBwYWlyIG9mIG91dHB1dCBhcmd1bWVudHMuIEl0IGlzIHNhZmUgdG8gY2FsbAorICAvLy8gdWRpdnJlbShYLCBZLCBYLCBZKSwgZm9yIGV4YW1wbGUuCisgIHN0YXRpYyB2b2lkIHVkaXZyZW0oY29uc3QgQVBJbnQgJkxIUywgY29uc3QgQVBJbnQgJlJIUywgQVBJbnQgJlF1b3RpZW50LAorICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZSZW1haW5kZXIpOworICBzdGF0aWMgdm9pZCB1ZGl2cmVtKGNvbnN0IEFQSW50ICZMSFMsIHVpbnQ2NF90IFJIUywgQVBJbnQgJlF1b3RpZW50LAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICZSZW1haW5kZXIpOworCisgIHN0YXRpYyB2b2lkIHNkaXZyZW0oY29uc3QgQVBJbnQgJkxIUywgY29uc3QgQVBJbnQgJlJIUywgQVBJbnQgJlF1b3RpZW50LAorICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZSZW1haW5kZXIpOworICBzdGF0aWMgdm9pZCBzZGl2cmVtKGNvbnN0IEFQSW50ICZMSFMsIGludDY0X3QgUkhTLCBBUEludCAmUXVvdGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAmUmVtYWluZGVyKTsKKworICAvLyBPcGVyYXRpb25zIHRoYXQgcmV0dXJuIG92ZXJmbG93IGluZGljYXRvcnMuCisgIEFQSW50IHNhZGRfb3YoY29uc3QgQVBJbnQgJlJIUywgYm9vbCAmT3ZlcmZsb3cpIGNvbnN0OworICBBUEludCB1YWRkX292KGNvbnN0IEFQSW50ICZSSFMsIGJvb2wgJk92ZXJmbG93KSBjb25zdDsKKyAgQVBJbnQgc3N1Yl9vdihjb25zdCBBUEludCAmUkhTLCBib29sICZPdmVyZmxvdykgY29uc3Q7CisgIEFQSW50IHVzdWJfb3YoY29uc3QgQVBJbnQgJlJIUywgYm9vbCAmT3ZlcmZsb3cpIGNvbnN0OworICBBUEludCBzZGl2X292KGNvbnN0IEFQSW50ICZSSFMsIGJvb2wgJk92ZXJmbG93KSBjb25zdDsKKyAgQVBJbnQgc211bF9vdihjb25zdCBBUEludCAmUkhTLCBib29sICZPdmVyZmxvdykgY29uc3Q7CisgIEFQSW50IHVtdWxfb3YoY29uc3QgQVBJbnQgJlJIUywgYm9vbCAmT3ZlcmZsb3cpIGNvbnN0OworICBBUEludCBzc2hsX292KGNvbnN0IEFQSW50ICZBbXQsIGJvb2wgJk92ZXJmbG93KSBjb25zdDsKKyAgQVBJbnQgdXNobF9vdihjb25zdCBBUEludCAmQW10LCBib29sICZPdmVyZmxvdykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBBcnJheS1pbmRleGluZyBzdXBwb3J0LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSBiaXQgdmFsdWUgYXQgYml0UG9zaXRpb24KKyAgYm9vbCBvcGVyYXRvcltdKHVuc2lnbmVkIGJpdFBvc2l0aW9uKSBjb25zdCB7CisgICAgYXNzZXJ0KGJpdFBvc2l0aW9uIDwgZ2V0Qml0V2lkdGgoKSAmJiAiQml0IHBvc2l0aW9uIG91dCBvZiBib3VuZHMhIik7CisgICAgcmV0dXJuIChtYXNrQml0KGJpdFBvc2l0aW9uKSAmIGdldFdvcmQoYml0UG9zaXRpb24pKSAhPSAwOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBDb21wYXJpc29uIE9wZXJhdG9ycworICAvLy8gQHsKKworICAvLy8gXGJyaWVmIEVxdWFsaXR5IG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIENvbXBhcmVzIHRoaXMgQVBJbnQgd2l0aCBSSFMgZm9yIHRoZSB2YWxpZGl0eSBvZiB0aGUgZXF1YWxpdHkKKyAgLy8vIHJlbGF0aW9uc2hpcC4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFQSW50ICZSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoQml0V2lkdGggPT0gUkhTLkJpdFdpZHRoICYmICJDb21wYXJpc29uIHJlcXVpcmVzIGVxdWFsIGJpdCB3aWR0aHMiKTsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICByZXR1cm4gVS5WQUwgPT0gUkhTLlUuVkFMOworICAgIHJldHVybiBFcXVhbFNsb3dDYXNlKFJIUyk7CisgIH0KKworICAvLy8gXGJyaWVmIEVxdWFsaXR5IG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIENvbXBhcmVzIHRoaXMgQVBJbnQgd2l0aCBhIHVpbnQ2NF90IGZvciB0aGUgdmFsaWRpdHkgb2YgdGhlIGVxdWFsaXR5CisgIC8vLyByZWxhdGlvbnNoaXAuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiAqdGhpcyA9PSBWYWwKKyAgYm9vbCBvcGVyYXRvcj09KHVpbnQ2NF90IFZhbCkgY29uc3QgeworICAgIHJldHVybiAoaXNTaW5nbGVXb3JkKCkgfHwgZ2V0QWN0aXZlQml0cygpIDw9IDY0KSAmJiBnZXRaRXh0VmFsdWUoKSA9PSBWYWw7CisgIH0KKworICAvLy8gXGJyaWVmIEVxdWFsaXR5IGNvbXBhcmlzb24uCisgIC8vLworICAvLy8gQ29tcGFyZXMgdGhpcyBBUEludCB3aXRoIFJIUyBmb3IgdGhlIHZhbGlkaXR5IG9mIHRoZSBlcXVhbGl0eQorICAvLy8gcmVsYXRpb25zaGlwLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgPT0gVmFsCisgIGJvb2wgZXEoY29uc3QgQVBJbnQgJlJIUykgY29uc3QgeyByZXR1cm4gKCp0aGlzKSA9PSBSSFM7IH0KKworICAvLy8gXGJyaWVmIEluZXF1YWxpdHkgb3BlcmF0b3IuCisgIC8vLworICAvLy8gQ29tcGFyZXMgdGhpcyBBUEludCB3aXRoIFJIUyBmb3IgdGhlIHZhbGlkaXR5IG9mIHRoZSBpbmVxdWFsaXR5CisgIC8vLyByZWxhdGlvbnNoaXAuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiAqdGhpcyAhPSBWYWwKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFQSW50ICZSSFMpIGNvbnN0IHsgcmV0dXJuICEoKCp0aGlzKSA9PSBSSFMpOyB9CisKKyAgLy8vIFxicmllZiBJbmVxdWFsaXR5IG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIENvbXBhcmVzIHRoaXMgQVBJbnQgd2l0aCBhIHVpbnQ2NF90IGZvciB0aGUgdmFsaWRpdHkgb2YgdGhlIGluZXF1YWxpdHkKKyAgLy8vIHJlbGF0aW9uc2hpcC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmICp0aGlzICE9IFZhbAorICBib29sIG9wZXJhdG9yIT0odWludDY0X3QgVmFsKSBjb25zdCB7IHJldHVybiAhKCgqdGhpcykgPT0gVmFsKTsgfQorCisgIC8vLyBcYnJpZWYgSW5lcXVhbGl0eSBjb21wYXJpc29uCisgIC8vLworICAvLy8gQ29tcGFyZXMgdGhpcyBBUEludCB3aXRoIFJIUyBmb3IgdGhlIHZhbGlkaXR5IG9mIHRoZSBpbmVxdWFsaXR5CisgIC8vLyByZWxhdGlvbnNoaXAuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiAqdGhpcyAhPSBWYWwKKyAgYm9vbCBuZShjb25zdCBBUEludCAmUkhTKSBjb25zdCB7IHJldHVybiAhKCgqdGhpcykgPT0gUkhTKTsgfQorCisgIC8vLyBcYnJpZWYgVW5zaWduZWQgbGVzcyB0aGFuIGNvbXBhcmlzb24KKyAgLy8vCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYW5kIFJIUyBhcyB1bnNpZ25lZCBxdWFudGl0aWVzIGFuZCBjb21wYXJlcyB0aGVtIGZvcgorICAvLy8gdGhlIHZhbGlkaXR5IG9mIHRoZSBsZXNzLXRoYW4gcmVsYXRpb25zaGlwLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgPCBSSFMgd2hlbiBib3RoIGFyZSBjb25zaWRlcmVkIHVuc2lnbmVkLgorICBib29sIHVsdChjb25zdCBBUEludCAmUkhTKSBjb25zdCB7IHJldHVybiBjb21wYXJlKFJIUykgPCAwOyB9CisKKyAgLy8vIFxicmllZiBVbnNpZ25lZCBsZXNzIHRoYW4gY29tcGFyaXNvbgorICAvLy8KKyAgLy8vIFJlZ2FyZHMgYm90aCAqdGhpcyBhcyBhbiB1bnNpZ25lZCBxdWFudGl0eSBhbmQgY29tcGFyZXMgaXQgd2l0aCBSSFMgZm9yCisgIC8vLyB0aGUgdmFsaWRpdHkgb2YgdGhlIGxlc3MtdGhhbiByZWxhdGlvbnNoaXAuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiAqdGhpcyA8IFJIUyB3aGVuIGNvbnNpZGVyZWQgdW5zaWduZWQuCisgIGJvb2wgdWx0KHVpbnQ2NF90IFJIUykgY29uc3QgeworICAgIC8vIE9ubHkgbmVlZCB0byBjaGVjayBhY3RpdmUgYml0cyBpZiBub3QgYSBzaW5nbGUgd29yZC4KKyAgICByZXR1cm4gKGlzU2luZ2xlV29yZCgpIHx8IGdldEFjdGl2ZUJpdHMoKSA8PSA2NCkgJiYgZ2V0WkV4dFZhbHVlKCkgPCBSSFM7CisgIH0KKworICAvLy8gXGJyaWVmIFNpZ25lZCBsZXNzIHRoYW4gY29tcGFyaXNvbgorICAvLy8KKyAgLy8vIFJlZ2FyZHMgYm90aCAqdGhpcyBhbmQgUkhTIGFzIHNpZ25lZCBxdWFudGl0aWVzIGFuZCBjb21wYXJlcyB0aGVtIGZvcgorICAvLy8gdmFsaWRpdHkgb2YgdGhlIGxlc3MtdGhhbiByZWxhdGlvbnNoaXAuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiAqdGhpcyA8IFJIUyB3aGVuIGJvdGggYXJlIGNvbnNpZGVyZWQgc2lnbmVkLgorICBib29sIHNsdChjb25zdCBBUEludCAmUkhTKSBjb25zdCB7IHJldHVybiBjb21wYXJlU2lnbmVkKFJIUykgPCAwOyB9CisKKyAgLy8vIFxicmllZiBTaWduZWQgbGVzcyB0aGFuIGNvbXBhcmlzb24KKyAgLy8vCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYXMgYSBzaWduZWQgcXVhbnRpdHkgYW5kIGNvbXBhcmVzIGl0IHdpdGggUkhTIGZvcgorICAvLy8gdGhlIHZhbGlkaXR5IG9mIHRoZSBsZXNzLXRoYW4gcmVsYXRpb25zaGlwLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgPCBSSFMgd2hlbiBjb25zaWRlcmVkIHNpZ25lZC4KKyAgYm9vbCBzbHQoaW50NjRfdCBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gKCFpc1NpbmdsZVdvcmQoKSAmJiBnZXRNaW5TaWduZWRCaXRzKCkgPiA2NCkgPyBpc05lZ2F0aXZlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRTRXh0VmFsdWUoKSA8IFJIUzsKKyAgfQorCisgIC8vLyBcYnJpZWYgVW5zaWduZWQgbGVzcyBvciBlcXVhbCBjb21wYXJpc29uCisgIC8vLworICAvLy8gUmVnYXJkcyBib3RoICp0aGlzIGFuZCBSSFMgYXMgdW5zaWduZWQgcXVhbnRpdGllcyBhbmQgY29tcGFyZXMgdGhlbSBmb3IKKyAgLy8vIHZhbGlkaXR5IG9mIHRoZSBsZXNzLW9yLWVxdWFsIHJlbGF0aW9uc2hpcC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmICp0aGlzIDw9IFJIUyB3aGVuIGJvdGggYXJlIGNvbnNpZGVyZWQgdW5zaWduZWQuCisgIGJvb2wgdWxlKGNvbnN0IEFQSW50ICZSSFMpIGNvbnN0IHsgcmV0dXJuIGNvbXBhcmUoUkhTKSA8PSAwOyB9CisKKyAgLy8vIFxicmllZiBVbnNpZ25lZCBsZXNzIG9yIGVxdWFsIGNvbXBhcmlzb24KKyAgLy8vCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYXMgYW4gdW5zaWduZWQgcXVhbnRpdHkgYW5kIGNvbXBhcmVzIGl0IHdpdGggUkhTIGZvcgorICAvLy8gdGhlIHZhbGlkaXR5IG9mIHRoZSBsZXNzLW9yLWVxdWFsIHJlbGF0aW9uc2hpcC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmICp0aGlzIDw9IFJIUyB3aGVuIGNvbnNpZGVyZWQgdW5zaWduZWQuCisgIGJvb2wgdWxlKHVpbnQ2NF90IFJIUykgY29uc3QgeyByZXR1cm4gIXVndChSSFMpOyB9CisKKyAgLy8vIFxicmllZiBTaWduZWQgbGVzcyBvciBlcXVhbCBjb21wYXJpc29uCisgIC8vLworICAvLy8gUmVnYXJkcyBib3RoICp0aGlzIGFuZCBSSFMgYXMgc2lnbmVkIHF1YW50aXRpZXMgYW5kIGNvbXBhcmVzIHRoZW0gZm9yCisgIC8vLyB2YWxpZGl0eSBvZiB0aGUgbGVzcy1vci1lcXVhbCByZWxhdGlvbnNoaXAuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiAqdGhpcyA8PSBSSFMgd2hlbiBib3RoIGFyZSBjb25zaWRlcmVkIHNpZ25lZC4KKyAgYm9vbCBzbGUoY29uc3QgQVBJbnQgJlJIUykgY29uc3QgeyByZXR1cm4gY29tcGFyZVNpZ25lZChSSFMpIDw9IDA7IH0KKworICAvLy8gXGJyaWVmIFNpZ25lZCBsZXNzIG9yIGVxdWFsIGNvbXBhcmlzb24KKyAgLy8vCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYXMgYSBzaWduZWQgcXVhbnRpdHkgYW5kIGNvbXBhcmVzIGl0IHdpdGggUkhTIGZvciB0aGUKKyAgLy8vIHZhbGlkaXR5IG9mIHRoZSBsZXNzLW9yLWVxdWFsIHJlbGF0aW9uc2hpcC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmICp0aGlzIDw9IFJIUyB3aGVuIGNvbnNpZGVyZWQgc2lnbmVkLgorICBib29sIHNsZSh1aW50NjRfdCBSSFMpIGNvbnN0IHsgcmV0dXJuICFzZ3QoUkhTKTsgfQorCisgIC8vLyBcYnJpZWYgVW5zaWduZWQgZ3JlYXRoZXIgdGhhbiBjb21wYXJpc29uCisgIC8vLworICAvLy8gUmVnYXJkcyBib3RoICp0aGlzIGFuZCBSSFMgYXMgdW5zaWduZWQgcXVhbnRpdGllcyBhbmQgY29tcGFyZXMgdGhlbSBmb3IKKyAgLy8vIHRoZSB2YWxpZGl0eSBvZiB0aGUgZ3JlYXRlci10aGFuIHJlbGF0aW9uc2hpcC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmICp0aGlzID4gUkhTIHdoZW4gYm90aCBhcmUgY29uc2lkZXJlZCB1bnNpZ25lZC4KKyAgYm9vbCB1Z3QoY29uc3QgQVBJbnQgJlJIUykgY29uc3QgeyByZXR1cm4gIXVsZShSSFMpOyB9CisKKyAgLy8vIFxicmllZiBVbnNpZ25lZCBncmVhdGVyIHRoYW4gY29tcGFyaXNvbgorICAvLy8KKyAgLy8vIFJlZ2FyZHMgYm90aCAqdGhpcyBhcyBhbiB1bnNpZ25lZCBxdWFudGl0eSBhbmQgY29tcGFyZXMgaXQgd2l0aCBSSFMgZm9yCisgIC8vLyB0aGUgdmFsaWRpdHkgb2YgdGhlIGdyZWF0ZXItdGhhbiByZWxhdGlvbnNoaXAuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiAqdGhpcyA+IFJIUyB3aGVuIGNvbnNpZGVyZWQgdW5zaWduZWQuCisgIGJvb2wgdWd0KHVpbnQ2NF90IFJIUykgY29uc3QgeworICAgIC8vIE9ubHkgbmVlZCB0byBjaGVjayBhY3RpdmUgYml0cyBpZiBub3QgYSBzaW5nbGUgd29yZC4KKyAgICByZXR1cm4gKCFpc1NpbmdsZVdvcmQoKSAmJiBnZXRBY3RpdmVCaXRzKCkgPiA2NCkgfHwgZ2V0WkV4dFZhbHVlKCkgPiBSSFM7CisgIH0KKworICAvLy8gXGJyaWVmIFNpZ25lZCBncmVhdGhlciB0aGFuIGNvbXBhcmlzb24KKyAgLy8vCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYW5kIFJIUyBhcyBzaWduZWQgcXVhbnRpdGllcyBhbmQgY29tcGFyZXMgdGhlbSBmb3IgdGhlCisgIC8vLyB2YWxpZGl0eSBvZiB0aGUgZ3JlYXRlci10aGFuIHJlbGF0aW9uc2hpcC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmICp0aGlzID4gUkhTIHdoZW4gYm90aCBhcmUgY29uc2lkZXJlZCBzaWduZWQuCisgIGJvb2wgc2d0KGNvbnN0IEFQSW50ICZSSFMpIGNvbnN0IHsgcmV0dXJuICFzbGUoUkhTKTsgfQorCisgIC8vLyBcYnJpZWYgU2lnbmVkIGdyZWF0ZXIgdGhhbiBjb21wYXJpc29uCisgIC8vLworICAvLy8gUmVnYXJkcyBib3RoICp0aGlzIGFzIGEgc2lnbmVkIHF1YW50aXR5IGFuZCBjb21wYXJlcyBpdCB3aXRoIFJIUyBmb3IKKyAgLy8vIHRoZSB2YWxpZGl0eSBvZiB0aGUgZ3JlYXRlci10aGFuIHJlbGF0aW9uc2hpcC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmICp0aGlzID4gUkhTIHdoZW4gY29uc2lkZXJlZCBzaWduZWQuCisgIGJvb2wgc2d0KGludDY0X3QgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuICghaXNTaW5nbGVXb3JkKCkgJiYgZ2V0TWluU2lnbmVkQml0cygpID4gNjQpID8gIWlzTmVnYXRpdmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldFNFeHRWYWx1ZSgpID4gUkhTOworICB9CisKKyAgLy8vIFxicmllZiBVbnNpZ25lZCBncmVhdGVyIG9yIGVxdWFsIGNvbXBhcmlzb24KKyAgLy8vCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYW5kIFJIUyBhcyB1bnNpZ25lZCBxdWFudGl0aWVzIGFuZCBjb21wYXJlcyB0aGVtIGZvcgorICAvLy8gdmFsaWRpdHkgb2YgdGhlIGdyZWF0ZXItb3ItZXF1YWwgcmVsYXRpb25zaGlwLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgPj0gUkhTIHdoZW4gYm90aCBhcmUgY29uc2lkZXJlZCB1bnNpZ25lZC4KKyAgYm9vbCB1Z2UoY29uc3QgQVBJbnQgJlJIUykgY29uc3QgeyByZXR1cm4gIXVsdChSSFMpOyB9CisKKyAgLy8vIFxicmllZiBVbnNpZ25lZCBncmVhdGVyIG9yIGVxdWFsIGNvbXBhcmlzb24KKyAgLy8vCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYXMgYW4gdW5zaWduZWQgcXVhbnRpdHkgYW5kIGNvbXBhcmVzIGl0IHdpdGggUkhTIGZvcgorICAvLy8gdGhlIHZhbGlkaXR5IG9mIHRoZSBncmVhdGVyLW9yLWVxdWFsIHJlbGF0aW9uc2hpcC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmICp0aGlzID49IFJIUyB3aGVuIGNvbnNpZGVyZWQgdW5zaWduZWQuCisgIGJvb2wgdWdlKHVpbnQ2NF90IFJIUykgY29uc3QgeyByZXR1cm4gIXVsdChSSFMpOyB9CisKKyAgLy8vIFxicmllZiBTaWduZWQgZ3JlYXRlciBvciBlcXVhbCBjb21wYXJpc29uCisgIC8vLworICAvLy8gUmVnYXJkcyBib3RoICp0aGlzIGFuZCBSSFMgYXMgc2lnbmVkIHF1YW50aXRpZXMgYW5kIGNvbXBhcmVzIHRoZW0gZm9yCisgIC8vLyB2YWxpZGl0eSBvZiB0aGUgZ3JlYXRlci1vci1lcXVhbCByZWxhdGlvbnNoaXAuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiAqdGhpcyA+PSBSSFMgd2hlbiBib3RoIGFyZSBjb25zaWRlcmVkIHNpZ25lZC4KKyAgYm9vbCBzZ2UoY29uc3QgQVBJbnQgJlJIUykgY29uc3QgeyByZXR1cm4gIXNsdChSSFMpOyB9CisKKyAgLy8vIFxicmllZiBTaWduZWQgZ3JlYXRlciBvciBlcXVhbCBjb21wYXJpc29uCisgIC8vLworICAvLy8gUmVnYXJkcyBib3RoICp0aGlzIGFzIGEgc2lnbmVkIHF1YW50aXR5IGFuZCBjb21wYXJlcyBpdCB3aXRoIFJIUyBmb3IKKyAgLy8vIHRoZSB2YWxpZGl0eSBvZiB0aGUgZ3JlYXRlci1vci1lcXVhbCByZWxhdGlvbnNoaXAuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiAqdGhpcyA+PSBSSFMgd2hlbiBjb25zaWRlcmVkIHNpZ25lZC4KKyAgYm9vbCBzZ2UoaW50NjRfdCBSSFMpIGNvbnN0IHsgcmV0dXJuICFzbHQoUkhTKTsgfQorCisgIC8vLyBUaGlzIG9wZXJhdGlvbiB0ZXN0cyBpZiB0aGVyZSBhcmUgYW55IHBhaXJzIG9mIGNvcnJlc3BvbmRpbmcgYml0cworICAvLy8gYmV0d2VlbiB0aGlzIEFQSW50IGFuZCBSSFMgdGhhdCBhcmUgYm90aCBzZXQuCisgIGJvb2wgaW50ZXJzZWN0cyhjb25zdCBBUEludCAmUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KEJpdFdpZHRoID09IFJIUy5CaXRXaWR0aCAmJiAiQml0IHdpZHRocyBtdXN0IGJlIHRoZSBzYW1lIik7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgcmV0dXJuIChVLlZBTCAmIFJIUy5VLlZBTCkgIT0gMDsKKyAgICByZXR1cm4gaW50ZXJzZWN0c1Nsb3dDYXNlKFJIUyk7CisgIH0KKworICAvLy8gVGhpcyBvcGVyYXRpb24gY2hlY2tzIHRoYXQgYWxsIGJpdHMgc2V0IGluIHRoaXMgQVBJbnQgYXJlIGFsc28gc2V0IGluIFJIUy4KKyAgYm9vbCBpc1N1YnNldE9mKGNvbnN0IEFQSW50ICZSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoQml0V2lkdGggPT0gUkhTLkJpdFdpZHRoICYmICJCaXQgd2lkdGhzIG11c3QgYmUgdGhlIHNhbWUiKTsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICByZXR1cm4gKFUuVkFMICYgflJIUy5VLlZBTCkgPT0gMDsKKyAgICByZXR1cm4gaXNTdWJzZXRPZlNsb3dDYXNlKFJIUyk7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIFJlc2l6aW5nIE9wZXJhdG9ycworICAvLy8gQHsKKworICAvLy8gXGJyaWVmIFRydW5jYXRlIHRvIG5ldyB3aWR0aC4KKyAgLy8vCisgIC8vLyBUcnVuY2F0ZSB0aGUgQVBJbnQgdG8gYSBzcGVjaWZpZWQgd2lkdGguIEl0IGlzIGFuIGVycm9yIHRvIHNwZWNpZnkgYSB3aWR0aAorICAvLy8gdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgd2lkdGguCisgIEFQSW50IHRydW5jKHVuc2lnbmVkIHdpZHRoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFNpZ24gZXh0ZW5kIHRvIGEgbmV3IHdpZHRoLgorICAvLy8KKyAgLy8vIFRoaXMgb3BlcmF0aW9uIHNpZ24gZXh0ZW5kcyB0aGUgQVBJbnQgdG8gYSBuZXcgd2lkdGguIElmIHRoZSBoaWdoIG9yZGVyCisgIC8vLyBiaXQgaXMgc2V0LCB0aGUgZmlsbCBvbiB0aGUgbGVmdCB3aWxsIGJlIGRvbmUgd2l0aCAxIGJpdHMsIG90aGVyd2lzZSB6ZXJvLgorICAvLy8gSXQgaXMgYW4gZXJyb3IgdG8gc3BlY2lmeSBhIHdpZHRoIHRoYXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZQorICAvLy8gY3VycmVudCB3aWR0aC4KKyAgQVBJbnQgc2V4dCh1bnNpZ25lZCB3aWR0aCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBaZXJvIGV4dGVuZCB0byBhIG5ldyB3aWR0aC4KKyAgLy8vCisgIC8vLyBUaGlzIG9wZXJhdGlvbiB6ZXJvIGV4dGVuZHMgdGhlIEFQSW50IHRvIGEgbmV3IHdpZHRoLiBUaGUgaGlnaCBvcmRlciBiaXRzCisgIC8vLyBhcmUgZmlsbGVkIHdpdGggMCBiaXRzLiAgSXQgaXMgYW4gZXJyb3IgdG8gc3BlY2lmeSBhIHdpZHRoIHRoYXQgaXMgbGVzcworICAvLy8gdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCB3aWR0aC4KKyAgQVBJbnQgemV4dCh1bnNpZ25lZCB3aWR0aCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTaWduIGV4dGVuZCBvciB0cnVuY2F0ZSB0byB3aWR0aAorICAvLy8KKyAgLy8vIE1ha2UgdGhpcyBBUEludCBoYXZlIHRoZSBiaXQgd2lkdGggZ2l2ZW4gYnkgXHAgd2lkdGguIFRoZSB2YWx1ZSBpcyBzaWduCisgIC8vLyBleHRlbmRlZCwgdHJ1bmNhdGVkLCBvciBsZWZ0IGFsb25lIHRvIG1ha2UgaXQgdGhhdCB3aWR0aC4KKyAgQVBJbnQgc2V4dE9yVHJ1bmModW5zaWduZWQgd2lkdGgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgWmVybyBleHRlbmQgb3IgdHJ1bmNhdGUgdG8gd2lkdGgKKyAgLy8vCisgIC8vLyBNYWtlIHRoaXMgQVBJbnQgaGF2ZSB0aGUgYml0IHdpZHRoIGdpdmVuIGJ5IFxwIHdpZHRoLiBUaGUgdmFsdWUgaXMgemVybworICAvLy8gZXh0ZW5kZWQsIHRydW5jYXRlZCwgb3IgbGVmdCBhbG9uZSB0byBtYWtlIGl0IHRoYXQgd2lkdGguCisgIEFQSW50IHpleHRPclRydW5jKHVuc2lnbmVkIHdpZHRoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFNpZ24gZXh0ZW5kIG9yIHRydW5jYXRlIHRvIHdpZHRoCisgIC8vLworICAvLy8gTWFrZSB0aGlzIEFQSW50IGhhdmUgdGhlIGJpdCB3aWR0aCBnaXZlbiBieSBccCB3aWR0aC4gVGhlIHZhbHVlIGlzIHNpZ24KKyAgLy8vIGV4dGVuZGVkLCBvciBsZWZ0IGFsb25lIHRvIG1ha2UgaXQgdGhhdCB3aWR0aC4KKyAgQVBJbnQgc2V4dE9yU2VsZih1bnNpZ25lZCB3aWR0aCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBaZXJvIGV4dGVuZCBvciB0cnVuY2F0ZSB0byB3aWR0aAorICAvLy8KKyAgLy8vIE1ha2UgdGhpcyBBUEludCBoYXZlIHRoZSBiaXQgd2lkdGggZ2l2ZW4gYnkgXHAgd2lkdGguIFRoZSB2YWx1ZSBpcyB6ZXJvCisgIC8vLyBleHRlbmRlZCwgb3IgbGVmdCBhbG9uZSB0byBtYWtlIGl0IHRoYXQgd2lkdGguCisgIEFQSW50IHpleHRPclNlbGYodW5zaWduZWQgd2lkdGgpIGNvbnN0OworCisgIC8vLyBAfQorICAvLy8gXG5hbWUgQml0IE1hbmlwdWxhdGlvbiBPcGVyYXRvcnMKKyAgLy8vIEB7CisKKyAgLy8vIFxicmllZiBTZXQgZXZlcnkgYml0IHRvIDEuCisgIHZvaWQgc2V0QWxsQml0cygpIHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICBVLlZBTCA9IFdPUkRfTUFYOworICAgIGVsc2UKKyAgICAgIC8vIFNldCBhbGwgdGhlIGJpdHMgaW4gYWxsIHRoZSB3b3Jkcy4KKyAgICAgIG1lbXNldChVLnBWYWwsIC0xLCBnZXROdW1Xb3JkcygpICogQVBJTlRfV09SRF9TSVpFKTsKKyAgICAvLyBDbGVhciB0aGUgdW51c2VkIG9uZXMKKyAgICBjbGVhclVudXNlZEJpdHMoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IGEgZ2l2ZW4gYml0IHRvIDEuCisgIC8vLworICAvLy8gU2V0IHRoZSBnaXZlbiBiaXQgdG8gMSB3aG9zZSBwb3NpdGlvbiBpcyBnaXZlbiBhcyAiYml0UG9zaXRpb24iLgorICB2b2lkIHNldEJpdCh1bnNpZ25lZCBCaXRQb3NpdGlvbikgeworICAgIGFzc2VydChCaXRQb3NpdGlvbiA8PSBCaXRXaWR0aCAmJiAiQml0UG9zaXRpb24gb3V0IG9mIHJhbmdlIik7CisgICAgV29yZFR5cGUgTWFzayA9IG1hc2tCaXQoQml0UG9zaXRpb24pOworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIFUuVkFMIHw9IE1hc2s7CisgICAgZWxzZQorICAgICAgVS5wVmFsW3doaWNoV29yZChCaXRQb3NpdGlvbildIHw9IE1hc2s7CisgIH0KKworICAvLy8gU2V0IHRoZSBzaWduIGJpdCB0byAxLgorICB2b2lkIHNldFNpZ25CaXQoKSB7CisgICAgc2V0Qml0KEJpdFdpZHRoIC0gMSk7CisgIH0KKworICAvLy8gU2V0IHRoZSBiaXRzIGZyb20gbG9CaXQgKGluY2x1c2l2ZSkgdG8gaGlCaXQgKGV4Y2x1c2l2ZSkgdG8gMS4KKyAgdm9pZCBzZXRCaXRzKHVuc2lnbmVkIGxvQml0LCB1bnNpZ25lZCBoaUJpdCkgeworICAgIGFzc2VydChoaUJpdCA8PSBCaXRXaWR0aCAmJiAiaGlCaXQgb3V0IG9mIHJhbmdlIik7CisgICAgYXNzZXJ0KGxvQml0IDw9IEJpdFdpZHRoICYmICJsb0JpdCBvdXQgb2YgcmFuZ2UiKTsKKyAgICBhc3NlcnQobG9CaXQgPD0gaGlCaXQgJiYgImxvQml0IGdyZWF0ZXIgdGhhbiBoaUJpdCIpOworICAgIGlmIChsb0JpdCA9PSBoaUJpdCkKKyAgICAgIHJldHVybjsKKyAgICBpZiAobG9CaXQgPCBBUElOVF9CSVRTX1BFUl9XT1JEICYmIGhpQml0IDw9IEFQSU5UX0JJVFNfUEVSX1dPUkQpIHsKKyAgICAgIHVpbnQ2NF90IG1hc2sgPSBXT1JEX01BWCA+PiAoQVBJTlRfQklUU19QRVJfV09SRCAtIChoaUJpdCAtIGxvQml0KSk7CisgICAgICBtYXNrIDw8PSBsb0JpdDsKKyAgICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgICAgVS5WQUwgfD0gbWFzazsKKyAgICAgIGVsc2UKKyAgICAgICAgVS5wVmFsWzBdIHw9IG1hc2s7CisgICAgfSBlbHNlIHsKKyAgICAgIHNldEJpdHNTbG93Q2FzZShsb0JpdCwgaGlCaXQpOworICAgIH0KKyAgfQorCisgIC8vLyBTZXQgdGhlIHRvcCBiaXRzIHN0YXJ0aW5nIGZyb20gbG9CaXQuCisgIHZvaWQgc2V0Qml0c0Zyb20odW5zaWduZWQgbG9CaXQpIHsKKyAgICByZXR1cm4gc2V0Qml0cyhsb0JpdCwgQml0V2lkdGgpOworICB9CisKKyAgLy8vIFNldCB0aGUgYm90dG9tIGxvQml0cyBiaXRzLgorICB2b2lkIHNldExvd0JpdHModW5zaWduZWQgbG9CaXRzKSB7CisgICAgcmV0dXJuIHNldEJpdHMoMCwgbG9CaXRzKTsKKyAgfQorCisgIC8vLyBTZXQgdGhlIHRvcCBoaUJpdHMgYml0cy4KKyAgdm9pZCBzZXRIaWdoQml0cyh1bnNpZ25lZCBoaUJpdHMpIHsKKyAgICByZXR1cm4gc2V0Qml0cyhCaXRXaWR0aCAtIGhpQml0cywgQml0V2lkdGgpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgZXZlcnkgYml0IHRvIDAuCisgIHZvaWQgY2xlYXJBbGxCaXRzKCkgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIFUuVkFMID0gMDsKKyAgICBlbHNlCisgICAgICBtZW1zZXQoVS5wVmFsLCAwLCBnZXROdW1Xb3JkcygpICogQVBJTlRfV09SRF9TSVpFKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IGEgZ2l2ZW4gYml0IHRvIDAuCisgIC8vLworICAvLy8gU2V0IHRoZSBnaXZlbiBiaXQgdG8gMCB3aG9zZSBwb3NpdGlvbiBpcyBnaXZlbiBhcyAiYml0UG9zaXRpb24iLgorICB2b2lkIGNsZWFyQml0KHVuc2lnbmVkIEJpdFBvc2l0aW9uKSB7CisgICAgYXNzZXJ0KEJpdFBvc2l0aW9uIDw9IEJpdFdpZHRoICYmICJCaXRQb3NpdGlvbiBvdXQgb2YgcmFuZ2UiKTsKKyAgICBXb3JkVHlwZSBNYXNrID0gfm1hc2tCaXQoQml0UG9zaXRpb24pOworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIFUuVkFMICY9IE1hc2s7CisgICAgZWxzZQorICAgICAgVS5wVmFsW3doaWNoV29yZChCaXRQb3NpdGlvbildICY9IE1hc2s7CisgIH0KKworICAvLy8gU2V0IHRoZSBzaWduIGJpdCB0byAwLgorICB2b2lkIGNsZWFyU2lnbkJpdCgpIHsKKyAgICBjbGVhckJpdChCaXRXaWR0aCAtIDEpOworICB9CisKKyAgLy8vIFxicmllZiBUb2dnbGUgZXZlcnkgYml0IHRvIGl0cyBvcHBvc2l0ZSB2YWx1ZS4KKyAgdm9pZCBmbGlwQWxsQml0cygpIHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpIHsKKyAgICAgIFUuVkFMIF49IFdPUkRfTUFYOworICAgICAgY2xlYXJVbnVzZWRCaXRzKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZsaXBBbGxCaXRzU2xvd0Nhc2UoKTsKKyAgICB9CisgIH0KKworICAvLy8gXGJyaWVmIFRvZ2dsZXMgYSBnaXZlbiBiaXQgdG8gaXRzIG9wcG9zaXRlIHZhbHVlLgorICAvLy8KKyAgLy8vIFRvZ2dsZSBhIGdpdmVuIGJpdCB0byBpdHMgb3Bwb3NpdGUgdmFsdWUgd2hvc2UgcG9zaXRpb24gaXMgZ2l2ZW4KKyAgLy8vIGFzICJiaXRQb3NpdGlvbiIuCisgIHZvaWQgZmxpcEJpdCh1bnNpZ25lZCBiaXRQb3NpdGlvbik7CisKKyAgLy8vIE5lZ2F0ZSB0aGlzIEFQSW50IGluIHBsYWNlLgorICB2b2lkIG5lZ2F0ZSgpIHsKKyAgICBmbGlwQWxsQml0cygpOworICAgICsrKCp0aGlzKTsKKyAgfQorCisgIC8vLyBJbnNlcnQgdGhlIGJpdHMgZnJvbSBhIHNtYWxsZXIgQVBJbnQgc3RhcnRpbmcgYXQgYml0UG9zaXRpb24uCisgIHZvaWQgaW5zZXJ0Qml0cyhjb25zdCBBUEludCAmU3ViQml0cywgdW5zaWduZWQgYml0UG9zaXRpb24pOworCisgIC8vLyBSZXR1cm4gYW4gQVBJbnQgd2l0aCB0aGUgZXh0cmFjdGVkIGJpdHMgW2JpdFBvc2l0aW9uLGJpdFBvc2l0aW9uK251bUJpdHMpLgorICBBUEludCBleHRyYWN0Qml0cyh1bnNpZ25lZCBudW1CaXRzLCB1bnNpZ25lZCBiaXRQb3NpdGlvbikgY29uc3Q7CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBWYWx1ZSBDaGFyYWN0ZXJpemF0aW9uIEZ1bmN0aW9ucworICAvLy8gQHsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIEFQSW50LgorICB1bnNpZ25lZCBnZXRCaXRXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIEJpdFdpZHRoOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG51bWJlciBvZiB3b3Jkcy4KKyAgLy8vCisgIC8vLyBIZXJlIG9uZSB3b3JkJ3MgYml0d2lkdGggZXF1YWxzIHRvIHRoYXQgb2YgdWludDY0X3QuCisgIC8vLworICAvLy8gXHJldHVybnMgdGhlIG51bWJlciBvZiB3b3JkcyB0byBob2xkIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgQVBJbnQuCisgIHVuc2lnbmVkIGdldE51bVdvcmRzKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtV29yZHMoQml0V2lkdGgpOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG51bWJlciBvZiB3b3Jkcy4KKyAgLy8vCisgIC8vLyAqTk9URSogSGVyZSBvbmUgd29yZCdzIGJpdHdpZHRoIGVxdWFscyB0byB0aGF0IG9mIHVpbnQ2NF90LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygd29yZHMgdG8gaG9sZCB0aGUgaW50ZWdlciB2YWx1ZSB3aXRoIGEgZ2l2ZW4gYml0CisgIC8vLyB3aWR0aC4KKyAgc3RhdGljIHVuc2lnbmVkIGdldE51bVdvcmRzKHVuc2lnbmVkIEJpdFdpZHRoKSB7CisgICAgcmV0dXJuICgodWludDY0X3QpQml0V2lkdGggKyBBUElOVF9CSVRTX1BFUl9XT1JEIC0gMSkgLyBBUElOVF9CSVRTX1BFUl9XT1JEOworICB9CisKKyAgLy8vIFxicmllZiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYWN0aXZlIGJpdHMgaW4gdGhlIHZhbHVlCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYWN0aXZlIGJpdHMgd2hpY2ggaXMgZGVmaW5lZCBhcyB0aGUKKyAgLy8vIGJpdCB3aWR0aCBtaW51cyB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgemVyb3MuIFRoaXMgaXMgdXNlZCBpbiBzZXZlcmFsCisgIC8vLyBjb21wdXRhdGlvbnMgdG8gc2VlIGhvdyAid2lkZSIgdGhlIHZhbHVlIGlzLgorICB1bnNpZ25lZCBnZXRBY3RpdmVCaXRzKCkgY29uc3QgeyByZXR1cm4gQml0V2lkdGggLSBjb3VudExlYWRpbmdaZXJvcygpOyB9CisKKyAgLy8vIFxicmllZiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYWN0aXZlIHdvcmRzIGluIHRoZSB2YWx1ZSBvZiB0aGlzIEFQSW50LgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGdldEFjdGl2ZURhdGEgdG8gZXh0cmFjdCB0aGUgcmF3IHZhbHVlIG9mCisgIC8vLyB0aGUgQVBJbnQuCisgIHVuc2lnbmVkIGdldEFjdGl2ZVdvcmRzKCkgY29uc3QgeworICAgIHVuc2lnbmVkIG51bUFjdGl2ZUJpdHMgPSBnZXRBY3RpdmVCaXRzKCk7CisgICAgcmV0dXJuIG51bUFjdGl2ZUJpdHMgPyB3aGljaFdvcmQobnVtQWN0aXZlQml0cyAtIDEpICsgMSA6IDE7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbWluaW11bSBiaXQgc2l6ZSBmb3IgdGhpcyBzaWduZWQgQVBJbnQKKyAgLy8vCisgIC8vLyBDb21wdXRlcyB0aGUgbWluaW11bSBiaXQgd2lkdGggZm9yIHRoaXMgQVBJbnQgd2hpbGUgY29uc2lkZXJpbmcgaXQgdG8gYmUgYQorICAvLy8gc2lnbmVkIChhbmQgcHJvYmFibHkgbmVnYXRpdmUpIHZhbHVlLiBJZiB0aGUgdmFsdWUgaXMgbm90IG5lZ2F0aXZlLCB0aGlzCisgIC8vLyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzYW1lIHZhbHVlIGFzIGdldEFjdGl2ZUJpdHMoKSsxLiBPdGhlcndpc2UsIGl0CisgIC8vLyByZXR1cm5zIHRoZSBzbWFsbGVzdCBiaXQgd2lkdGggdGhhdCB3aWxsIHJldGFpbiB0aGUgbmVnYXRpdmUgdmFsdWUuIEZvcgorICAvLy8gZXhhbXBsZSwgLTEgY2FuIGJlIHdyaXR0ZW4gYXMgMGIxIG9yIDB4RkZGRkZGRkZGRi4gMGIxIGlzIHNob3J0ZXIgYW5kIHNvCisgIC8vLyBmb3IgLTEsIHRoaXMgZnVuY3Rpb24gd2lsbCBhbHdheXMgcmV0dXJuIDEuCisgIHVuc2lnbmVkIGdldE1pblNpZ25lZEJpdHMoKSBjb25zdCB7CisgICAgaWYgKGlzTmVnYXRpdmUoKSkKKyAgICAgIHJldHVybiBCaXRXaWR0aCAtIGNvdW50TGVhZGluZ09uZXMoKSArIDE7CisgICAgcmV0dXJuIGdldEFjdGl2ZUJpdHMoKSArIDE7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB6ZXJvIGV4dGVuZGVkIHZhbHVlCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGlzIEFQSW50IGFzIGEgemVybyBleHRlbmRlZAorICAvLy8gdWludDY0X3QuIFRoZSBiaXR3aWR0aCBtdXN0IGJlIDw9IDY0IG9yIHRoZSB2YWx1ZSBtdXN0IGZpdCB3aXRoaW4gYQorICAvLy8gdWludDY0X3QuIE90aGVyd2lzZSBhbiBhc3NlcnRpb24gd2lsbCByZXN1bHQuCisgIHVpbnQ2NF90IGdldFpFeHRWYWx1ZSgpIGNvbnN0IHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICByZXR1cm4gVS5WQUw7CisgICAgYXNzZXJ0KGdldEFjdGl2ZUJpdHMoKSA8PSA2NCAmJiAiVG9vIG1hbnkgYml0cyBmb3IgdWludDY0X3QiKTsKKyAgICByZXR1cm4gVS5wVmFsWzBdOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgc2lnbiBleHRlbmRlZCB2YWx1ZQorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhpcyBBUEludCBhcyBhIHNpZ24gZXh0ZW5kZWQKKyAgLy8vIGludDY0X3QuIFRoZSBiaXQgd2lkdGggbXVzdCBiZSA8PSA2NCBvciB0aGUgdmFsdWUgbXVzdCBmaXQgd2l0aGluIGFuCisgIC8vLyBpbnQ2NF90LiBPdGhlcndpc2UgYW4gYXNzZXJ0aW9uIHdpbGwgcmVzdWx0LgorICBpbnQ2NF90IGdldFNFeHRWYWx1ZSgpIGNvbnN0IHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICByZXR1cm4gU2lnbkV4dGVuZDY0KFUuVkFMLCBCaXRXaWR0aCk7CisgICAgYXNzZXJ0KGdldE1pblNpZ25lZEJpdHMoKSA8PSA2NCAmJiAiVG9vIG1hbnkgYml0cyBmb3IgaW50NjRfdCIpOworICAgIHJldHVybiBpbnQ2NF90KFUucFZhbFswXSk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBiaXRzIHJlcXVpcmVkIGZvciBzdHJpbmcgdmFsdWUuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyBob3cgbWFueSBiaXRzIGFyZSByZXF1aXJlZCB0byBob2xkIHRoZSBBUEludAorICAvLy8gZXF1aXZhbGVudCBvZiB0aGUgc3RyaW5nIGdpdmVuIGJ5IFxwIHN0ci4KKyAgc3RhdGljIHVuc2lnbmVkIGdldEJpdHNOZWVkZWQoU3RyaW5nUmVmIHN0ciwgdWludDhfdCByYWRpeCk7CisKKyAgLy8vIFxicmllZiBUaGUgQVBJbnQgdmVyc2lvbiBvZiB0aGUgY291bnRMZWFkaW5nWmVyb3MgZnVuY3Rpb25zIGluCisgIC8vLyAgIE1hdGhFeHRyYXMuaC4KKyAgLy8vCisgIC8vLyBJdCBjb3VudHMgdGhlIG51bWJlciBvZiB6ZXJvcyBmcm9tIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgZmlyc3QKKyAgLy8vIG9uZSBiaXQuCisgIC8vLworICAvLy8gXHJldHVybnMgQml0V2lkdGggaWYgdGhlIHZhbHVlIGlzIHplcm8sIG90aGVyd2lzZSByZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgLy8vICAgemVyb3MgZnJvbSB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgdG8gdGhlIGZpcnN0IG9uZSBiaXRzLgorICB1bnNpZ25lZCBjb3VudExlYWRpbmdaZXJvcygpIGNvbnN0IHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpIHsKKyAgICAgIHVuc2lnbmVkIHVudXNlZEJpdHMgPSBBUElOVF9CSVRTX1BFUl9XT1JEIC0gQml0V2lkdGg7CisgICAgICByZXR1cm4gbGx2bTo6Y291bnRMZWFkaW5nWmVyb3MoVS5WQUwpIC0gdW51c2VkQml0czsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50TGVhZGluZ1plcm9zU2xvd0Nhc2UoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ291bnQgdGhlIG51bWJlciBvZiBsZWFkaW5nIG9uZSBiaXRzLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgYW4gQVBJbnQgdmVyc2lvbiBvZiB0aGUgY291bnRMZWFkaW5nT25lcworICAvLy8gZnVuY3Rpb25zIGluIE1hdGhFeHRyYXMuaC4gSXQgY291bnRzIHRoZSBudW1iZXIgb2Ygb25lcyBmcm9tIHRoZSBtb3N0CisgIC8vLyBzaWduaWZpY2FudCBiaXQgdG8gdGhlIGZpcnN0IHplcm8gYml0LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIDAgaWYgdGhlIGhpZ2ggb3JkZXIgYml0IGlzIG5vdCBzZXQsIG90aGVyd2lzZSByZXR1cm5zIHRoZSBudW1iZXIKKyAgLy8vIG9mIDEgYml0cyBmcm9tIHRoZSBtb3N0IHNpZ25pZmljYW50IHRvIHRoZSBsZWFzdAorICB1bnNpZ25lZCBjb3VudExlYWRpbmdPbmVzKCkgY29uc3QgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIHJldHVybiBsbHZtOjpjb3VudExlYWRpbmdPbmVzKFUuVkFMIDw8IChBUElOVF9CSVRTX1BFUl9XT1JEIC0gQml0V2lkdGgpKTsKKyAgICByZXR1cm4gY291bnRMZWFkaW5nT25lc1Nsb3dDYXNlKCk7CisgIH0KKworICAvLy8gQ29tcHV0ZXMgdGhlIG51bWJlciBvZiBsZWFkaW5nIGJpdHMgb2YgdGhpcyBBUEludCB0aGF0IGFyZSBlcXVhbCB0byBpdHMKKyAgLy8vIHNpZ24gYml0LgorICB1bnNpZ25lZCBnZXROdW1TaWduQml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNOZWdhdGl2ZSgpID8gY291bnRMZWFkaW5nT25lcygpIDogY291bnRMZWFkaW5nWmVyb3MoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ291bnQgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvIGJpdHMuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBpcyBhbiBBUEludCB2ZXJzaW9uIG9mIHRoZSBjb3VudFRyYWlsaW5nWmVyb3MKKyAgLy8vIGZ1bmN0aW9ucyBpbiBNYXRoRXh0cmFzLmguIEl0IGNvdW50cyB0aGUgbnVtYmVyIG9mIHplcm9zIGZyb20gdGhlIGxlYXN0CisgIC8vLyBzaWduaWZpY2FudCBiaXQgdG8gdGhlIGZpcnN0IHNldCBiaXQuCisgIC8vLworICAvLy8gXHJldHVybnMgQml0V2lkdGggaWYgdGhlIHZhbHVlIGlzIHplcm8sIG90aGVyd2lzZSByZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgLy8vIHplcm9zIGZyb20gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgZmlyc3Qgb25lIGJpdC4KKyAgdW5zaWduZWQgY291bnRUcmFpbGluZ1plcm9zKCkgY29uc3QgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIHJldHVybiBzdGQ6Om1pbih1bnNpZ25lZChsbHZtOjpjb3VudFRyYWlsaW5nWmVyb3MoVS5WQUwpKSwgQml0V2lkdGgpOworICAgIHJldHVybiBjb3VudFRyYWlsaW5nWmVyb3NTbG93Q2FzZSgpOworICB9CisKKyAgLy8vIFxicmllZiBDb3VudCB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIG9uZSBiaXRzLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgYW4gQVBJbnQgdmVyc2lvbiBvZiB0aGUgY291bnRUcmFpbGluZ09uZXMKKyAgLy8vIGZ1bmN0aW9ucyBpbiBNYXRoRXh0cmFzLmguIEl0IGNvdW50cyB0aGUgbnVtYmVyIG9mIG9uZXMgZnJvbSB0aGUgbGVhc3QKKyAgLy8vIHNpZ25pZmljYW50IGJpdCB0byB0aGUgZmlyc3QgemVybyBiaXQuCisgIC8vLworICAvLy8gXHJldHVybnMgQml0V2lkdGggaWYgdGhlIHZhbHVlIGlzIGFsbCBvbmVzLCBvdGhlcndpc2UgcmV0dXJucyB0aGUgbnVtYmVyCisgIC8vLyBvZiBvbmVzIGZyb20gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgZmlyc3QgemVybyBiaXQuCisgIHVuc2lnbmVkIGNvdW50VHJhaWxpbmdPbmVzKCkgY29uc3QgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIHJldHVybiBsbHZtOjpjb3VudFRyYWlsaW5nT25lcyhVLlZBTCk7CisgICAgcmV0dXJuIGNvdW50VHJhaWxpbmdPbmVzU2xvd0Nhc2UoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ291bnQgdGhlIG51bWJlciBvZiBiaXRzIHNldC4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIGFuIEFQSW50IHZlcnNpb24gb2YgdGhlIGNvdW50UG9wdWxhdGlvbiBmdW5jdGlvbnMKKyAgLy8vIGluIE1hdGhFeHRyYXMuaC4gSXQgY291bnRzIHRoZSBudW1iZXIgb2YgMSBiaXRzIGluIHRoZSBBUEludCB2YWx1ZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyAwIGlmIHRoZSB2YWx1ZSBpcyB6ZXJvLCBvdGhlcndpc2UgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNldCBiaXRzLgorICB1bnNpZ25lZCBjb3VudFBvcHVsYXRpb24oKSBjb25zdCB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgcmV0dXJuIGxsdm06OmNvdW50UG9wdWxhdGlvbihVLlZBTCk7CisgICAgcmV0dXJuIGNvdW50UG9wdWxhdGlvblNsb3dDYXNlKCk7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIENvbnZlcnNpb24gRnVuY3Rpb25zCisgIC8vLyBAeworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgYm9vbCBpc1NpZ25lZCkgY29uc3Q7CisKKyAgLy8vIENvbnZlcnRzIGFuIEFQSW50IHRvIGEgc3RyaW5nIGFuZCBhcHBlbmQgaXQgdG8gU3RyLiAgU3RyIGlzIGNvbW1vbmx5IGEKKyAgLy8vIFNtYWxsU3RyaW5nLgorICB2b2lkIHRvU3RyaW5nKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmU3RyLCB1bnNpZ25lZCBSYWRpeCwgYm9vbCBTaWduZWQsCisgICAgICAgICAgICAgICAgYm9vbCBmb3JtYXRBc0NMaXRlcmFsID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyBDb25zaWRlcnMgdGhlIEFQSW50IHRvIGJlIHVuc2lnbmVkIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgc3RyaW5nIGluIHRoZQorICAvLy8gcmFkaXggZ2l2ZW4uIFRoZSByYWRpeCBjYW4gYmUgMiwgOCwgMTAgMTYsIG9yIDM2LgorICB2b2lkIHRvU3RyaW5nVW5zaWduZWQoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZTdHIsIHVuc2lnbmVkIFJhZGl4ID0gMTApIGNvbnN0IHsKKyAgICB0b1N0cmluZyhTdHIsIFJhZGl4LCBmYWxzZSwgZmFsc2UpOworICB9CisKKyAgLy8vIENvbnNpZGVycyB0aGUgQVBJbnQgdG8gYmUgc2lnbmVkIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgc3RyaW5nIGluIHRoZQorICAvLy8gcmFkaXggZ2l2ZW4uIFRoZSByYWRpeCBjYW4gYmUgMiwgOCwgMTAsIDE2LCBvciAzNi4KKyAgdm9pZCB0b1N0cmluZ1NpZ25lZChTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlN0ciwgdW5zaWduZWQgUmFkaXggPSAxMCkgY29uc3QgeworICAgIHRvU3RyaW5nKFN0ciwgUmFkaXgsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBBUEludCBhcyBhIHN0ZDo6c3RyaW5nLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGlzIGFuIGluZWZmaWNpZW50IG1ldGhvZC4gIEl0IGlzIGJldHRlciB0byBwYXNzIGluIGEKKyAgLy8vIFNtYWxsVmVjdG9yL1NtYWxsU3RyaW5nIHRvIHRoZSBtZXRob2RzIGFib3ZlIHRvIGF2b2lkIHRocmFzaGluZyB0aGUgaGVhcAorICAvLy8gZm9yIHRoZSBzdHJpbmcuCisgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKHVuc2lnbmVkIFJhZGl4LCBib29sIFNpZ25lZCkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIGEgYnl0ZS1zd2FwcGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgQVBJbnQgVmFsdWUuCisgIEFQSW50IGJ5dGVTd2FwKCkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIHRoZSB2YWx1ZSB3aXRoIHRoZSBiaXQgcmVwcmVzZW50YXRpb24gcmV2ZXJzZWQgb2YgdGhpcyBBUEludAorICAvLy8gVmFsdWUuCisgIEFQSW50IHJldmVyc2VCaXRzKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDb252ZXJ0cyB0aGlzIEFQSW50IHRvIGEgZG91YmxlIHZhbHVlLgorICBkb3VibGUgcm91bmRUb0RvdWJsZShib29sIGlzU2lnbmVkKSBjb25zdDsKKworICAvLy8gXGJyaWVmIENvbnZlcnRzIHRoaXMgdW5zaWduZWQgQVBJbnQgdG8gYSBkb3VibGUgdmFsdWUuCisgIGRvdWJsZSByb3VuZFRvRG91YmxlKCkgY29uc3QgeyByZXR1cm4gcm91bmRUb0RvdWJsZShmYWxzZSk7IH0KKworICAvLy8gXGJyaWVmIENvbnZlcnRzIHRoaXMgc2lnbmVkIEFQSW50IHRvIGEgZG91YmxlIHZhbHVlLgorICBkb3VibGUgc2lnbmVkUm91bmRUb0RvdWJsZSgpIGNvbnN0IHsgcmV0dXJuIHJvdW5kVG9Eb3VibGUodHJ1ZSk7IH0KKworICAvLy8gXGJyaWVmIENvbnZlcnRzIEFQSW50IGJpdHMgdG8gYSBkb3VibGUKKyAgLy8vCisgIC8vLyBUaGUgY29udmVyc2lvbiBkb2VzIG5vdCBkbyBhIHRyYW5zbGF0aW9uIGZyb20gaW50ZWdlciB0byBkb3VibGUsIGl0IGp1c3QKKyAgLy8vIHJlLWludGVycHJldHMgdGhlIGJpdHMgYXMgYSBkb3VibGUuIE5vdGUgdGhhdCBpdCBpcyB2YWxpZCB0byBkbyB0aGlzIG9uCisgIC8vLyBhbnkgYml0IHdpZHRoLiBFeGFjdGx5IDY0IGJpdHMgd2lsbCBiZSB0cmFuc2xhdGVkLgorICBkb3VibGUgYml0c1RvRG91YmxlKCkgY29uc3QgeworICAgIHJldHVybiBCaXRzVG9Eb3VibGUoZ2V0V29yZCgwKSk7CisgIH0KKworICAvLy8gXGJyaWVmIENvbnZlcnRzIEFQSW50IGJpdHMgdG8gYSBkb3VibGUKKyAgLy8vCisgIC8vLyBUaGUgY29udmVyc2lvbiBkb2VzIG5vdCBkbyBhIHRyYW5zbGF0aW9uIGZyb20gaW50ZWdlciB0byBmbG9hdCwgaXQganVzdAorICAvLy8gcmUtaW50ZXJwcmV0cyB0aGUgYml0cyBhcyBhIGZsb2F0LiBOb3RlIHRoYXQgaXQgaXMgdmFsaWQgdG8gZG8gdGhpcyBvbgorICAvLy8gYW55IGJpdCB3aWR0aC4gRXhhY3RseSAzMiBiaXRzIHdpbGwgYmUgdHJhbnNsYXRlZC4KKyAgZmxvYXQgYml0c1RvRmxvYXQoKSBjb25zdCB7CisgICAgcmV0dXJuIEJpdHNUb0Zsb2F0KGdldFdvcmQoMCkpOworICB9CisKKyAgLy8vIFxicmllZiBDb252ZXJ0cyBhIGRvdWJsZSB0byBBUEludCBiaXRzLgorICAvLy8KKyAgLy8vIFRoZSBjb252ZXJzaW9uIGRvZXMgbm90IGRvIGEgdHJhbnNsYXRpb24gZnJvbSBkb3VibGUgdG8gaW50ZWdlciwgaXQganVzdAorICAvLy8gcmUtaW50ZXJwcmV0cyB0aGUgYml0cyBvZiB0aGUgZG91YmxlLgorICBzdGF0aWMgQVBJbnQgZG91YmxlVG9CaXRzKGRvdWJsZSBWKSB7CisgICAgcmV0dXJuIEFQSW50KHNpemVvZihkb3VibGUpICogQ0hBUl9CSVQsIERvdWJsZVRvQml0cyhWKSk7CisgIH0KKworICAvLy8gXGJyaWVmIENvbnZlcnRzIGEgZmxvYXQgdG8gQVBJbnQgYml0cy4KKyAgLy8vCisgIC8vLyBUaGUgY29udmVyc2lvbiBkb2VzIG5vdCBkbyBhIHRyYW5zbGF0aW9uIGZyb20gZmxvYXQgdG8gaW50ZWdlciwgaXQganVzdAorICAvLy8gcmUtaW50ZXJwcmV0cyB0aGUgYml0cyBvZiB0aGUgZmxvYXQuCisgIHN0YXRpYyBBUEludCBmbG9hdFRvQml0cyhmbG9hdCBWKSB7CisgICAgcmV0dXJuIEFQSW50KHNpemVvZihmbG9hdCkgKiBDSEFSX0JJVCwgRmxvYXRUb0JpdHMoVikpOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBNYXRoZW1hdGljcyBPcGVyYXRpb25zCisgIC8vLyBAeworCisgIC8vLyBccmV0dXJucyB0aGUgZmxvb3IgbG9nIGJhc2UgMiBvZiB0aGlzIEFQSW50LgorICB1bnNpZ25lZCBsb2dCYXNlMigpIGNvbnN0IHsgcmV0dXJuIGdldEFjdGl2ZUJpdHMoKSAtICAxOyB9CisKKyAgLy8vIFxyZXR1cm5zIHRoZSBjZWlsIGxvZyBiYXNlIDIgb2YgdGhpcyBBUEludC4KKyAgdW5zaWduZWQgY2VpbExvZ0Jhc2UyKCkgY29uc3QgeworICAgIEFQSW50IHRlbXAoKnRoaXMpOworICAgIC0tdGVtcDsKKyAgICByZXR1cm4gdGVtcC5nZXRBY3RpdmVCaXRzKCk7CisgIH0KKworICAvLy8gXHJldHVybnMgdGhlIG5lYXJlc3QgbG9nIGJhc2UgMiBvZiB0aGlzIEFQSW50LiBUaWVzIHJvdW5kIHVwLgorICAvLy8KKyAgLy8vIE5PVEU6IFdoZW4gd2UgaGF2ZSBhIEJpdFdpZHRoIG9mIDEsIHdlIGRlZmluZToKKyAgLy8vCisgIC8vLyAgIGxvZzIoMCkgPSBVSU5UMzJfTUFYCisgIC8vLyAgIGxvZzIoMSkgPSAwCisgIC8vLworICAvLy8gdG8gZ2V0IGFyb3VuZCBhbnkgbWF0aGVtYXRpY2FsIGNvbmNlcm5zIHJlc3VsdGluZyBmcm9tCisgIC8vLyByZWZlcmVuY2luZyAyIGluIGEgc3BhY2Ugd2hlcmUgMiBkb2VzIG5vIGV4aXN0LgorICB1bnNpZ25lZCBuZWFyZXN0TG9nQmFzZTIoKSBjb25zdCB7CisgICAgLy8gU3BlY2lhbCBjYXNlIHdoZW4gd2UgaGF2ZSBhIGJpdHdpZHRoIG9mIDEuIElmIFZBTCBpcyAxLCB0aGVuIHdlCisgICAgLy8gZ2V0IDAuIElmIFZBTCBpcyAwLCB3ZSBnZXQgV09SRF9NQVggd2hpY2ggZ2V0cyB0cnVuY2F0ZWQgdG8KKyAgICAvLyBVSU5UMzJfTUFYLgorICAgIGlmIChCaXRXaWR0aCA9PSAxKQorICAgICAgcmV0dXJuIFUuVkFMIC0gMTsKKworICAgIC8vIEhhbmRsZSB0aGUgemVybyBjYXNlLgorICAgIGlmIChpc051bGxWYWx1ZSgpKQorICAgICAgcmV0dXJuIFVJTlQzMl9NQVg7CisKKyAgICAvLyBUaGUgbm9uLXplcm8gY2FzZSBpcyBoYW5kbGVkIGJ5IGNvbXB1dGluZzoKKyAgICAvLworICAgIC8vICAgbmVhcmVzdExvZ0Jhc2UyKHgpID0gbG9nQmFzZTIoeCkgKyB4W2xvZ0Jhc2UyKHgpLTFdLgorICAgIC8vCisgICAgLy8gd2hlcmUgeFtpXSBpcyByZWZlcnJpbmcgdG8gdGhlIHZhbHVlIG9mIHRoZSBpdGggYml0IG9mIHguCisgICAgdW5zaWduZWQgbGcgPSBsb2dCYXNlMigpOworICAgIHJldHVybiBsZyArIHVuc2lnbmVkKCgqdGhpcylbbGcgLSAxXSk7CisgIH0KKworICAvLy8gXHJldHVybnMgdGhlIGxvZyBiYXNlIDIgb2YgdGhpcyBBUEludCBpZiBpdHMgYW4gZXhhY3QgcG93ZXIgb2YgdHdvLCAtMQorICAvLy8gb3RoZXJ3aXNlCisgIGludDMyX3QgZXhhY3RMb2dCYXNlMigpIGNvbnN0IHsKKyAgICBpZiAoIWlzUG93ZXJPZjIoKSkKKyAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gbG9nQmFzZTIoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29tcHV0ZSB0aGUgc3F1YXJlIHJvb3QKKyAgQVBJbnQgc3FydCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBhYnNvbHV0ZSB2YWx1ZTsKKyAgLy8vCisgIC8vLyBJZiAqdGhpcyBpcyA8IDAgdGhlbiByZXR1cm4gLSgqdGhpcyksIG90aGVyd2lzZSAqdGhpczsKKyAgQVBJbnQgYWJzKCkgY29uc3QgeworICAgIGlmIChpc05lZ2F0aXZlKCkpCisgICAgICByZXR1cm4gLSgqdGhpcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxyZXR1cm5zIHRoZSBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIGZvciBhIGdpdmVuIG1vZHVsby4KKyAgQVBJbnQgbXVsdGlwbGljYXRpdmVJbnZlcnNlKGNvbnN0IEFQSW50ICZtb2R1bG8pIGNvbnN0OworCisgIC8vLyBAfQorICAvLy8gXG5hbWUgU3VwcG9ydCBmb3IgZGl2aXNpb24gYnkgY29uc3RhbnQKKyAgLy8vIEB7CisKKyAgLy8vIENhbGN1bGF0ZSB0aGUgbWFnaWMgbnVtYmVyIGZvciBzaWduZWQgZGl2aXNpb24gYnkgYSBjb25zdGFudC4KKyAgc3RydWN0IG1zOworICBtcyBtYWdpYygpIGNvbnN0OworCisgIC8vLyBDYWxjdWxhdGUgdGhlIG1hZ2ljIG51bWJlciBmb3IgdW5zaWduZWQgZGl2aXNpb24gYnkgYSBjb25zdGFudC4KKyAgc3RydWN0IG11OworICBtdSBtYWdpY3UodW5zaWduZWQgTGVhZGluZ1plcm9zID0gMCkgY29uc3Q7CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBCdWlsZGluZy1ibG9jayBPcGVyYXRpb25zIGZvciBBUEludCBhbmQgQVBGbG9hdAorICAvLy8gQHsKKworICAvLyBUaGVzZSBidWlsZGluZyBibG9jayBvcGVyYXRpb25zIG9wZXJhdGUgb24gYSByZXByZXNlbnRhdGlvbiBvZiBhcmJpdHJhcnkKKyAgLy8gcHJlY2lzaW9uLCB0d28ncy1jb21wbGVtZW50LCBiaWdudW0gaW50ZWdlciB2YWx1ZXMuIFRoZXkgc2hvdWxkIGJlCisgIC8vIHN1ZmZpY2llbnQgdG8gaW1wbGVtZW50IEFQSW50IGFuZCBBUEZsb2F0IGJpZ251bSByZXF1aXJlbWVudHMuIElucHV0cyBhcmUKKyAgLy8gZ2VuZXJhbGx5IGEgcG9pbnRlciB0byB0aGUgYmFzZSBvZiBhbiBhcnJheSBvZiBpbnRlZ2VyIHBhcnRzLCByZXByZXNlbnRpbmcKKyAgLy8gYW4gdW5zaWduZWQgYmlnbnVtLCBhbmQgYSBjb3VudCBvZiBob3cgbWFueSBwYXJ0cyB0aGVyZSBhcmUuCisKKyAgLy8vIFNldHMgdGhlIGxlYXN0IHNpZ25pZmljYW50IHBhcnQgb2YgYSBiaWdudW0gdG8gdGhlIGlucHV0IHZhbHVlLCBhbmQgemVyb2VzCisgIC8vLyBvdXQgaGlnaGVyIHBhcnRzLgorICBzdGF0aWMgdm9pZCB0Y1NldChXb3JkVHlwZSAqLCBXb3JkVHlwZSwgdW5zaWduZWQpOworCisgIC8vLyBBc3NpZ24gb25lIGJpZ251bSB0byBhbm90aGVyLgorICBzdGF0aWMgdm9pZCB0Y0Fzc2lnbihXb3JkVHlwZSAqLCBjb25zdCBXb3JkVHlwZSAqLCB1bnNpZ25lZCk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhIGJpZ251bSBpcyB6ZXJvLCBmYWxzZSBvdGhlcndpc2UuCisgIHN0YXRpYyBib29sIHRjSXNaZXJvKGNvbnN0IFdvcmRUeXBlICosIHVuc2lnbmVkKTsKKworICAvLy8gRXh0cmFjdCB0aGUgZ2l2ZW4gYml0IG9mIGEgYmlnbnVtOyByZXR1cm5zIDAgb3IgMS4gIFplcm8tYmFzZWQuCisgIHN0YXRpYyBpbnQgdGNFeHRyYWN0Qml0KGNvbnN0IFdvcmRUeXBlICosIHVuc2lnbmVkIGJpdCk7CisKKyAgLy8vIENvcHkgdGhlIGJpdCB2ZWN0b3Igb2Ygd2lkdGggc3JjQklUUyBmcm9tIFNSQywgc3RhcnRpbmcgYXQgYml0IHNyY0xTQiwgdG8KKyAgLy8vIERTVCwgb2YgZHN0Q09VTlQgcGFydHMsIHN1Y2ggdGhhdCB0aGUgYml0IHNyY0xTQiBiZWNvbWVzIHRoZSBsZWFzdAorICAvLy8gc2lnbmlmaWNhbnQgYml0IG9mIERTVC4gIEFsbCBoaWdoIGJpdHMgYWJvdmUgc3JjQklUUyBpbiBEU1QgYXJlCisgIC8vLyB6ZXJvLWZpbGxlZC4KKyAgc3RhdGljIHZvaWQgdGNFeHRyYWN0KFdvcmRUeXBlICosIHVuc2lnbmVkIGRzdENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZFR5cGUgKiwgdW5zaWduZWQgc3JjQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNyY0xTQik7CisKKyAgLy8vIFNldCB0aGUgZ2l2ZW4gYml0IG9mIGEgYmlnbnVtLiAgWmVyby1iYXNlZC4KKyAgc3RhdGljIHZvaWQgdGNTZXRCaXQoV29yZFR5cGUgKiwgdW5zaWduZWQgYml0KTsKKworICAvLy8gQ2xlYXIgdGhlIGdpdmVuIGJpdCBvZiBhIGJpZ251bS4gIFplcm8tYmFzZWQuCisgIHN0YXRpYyB2b2lkIHRjQ2xlYXJCaXQoV29yZFR5cGUgKiwgdW5zaWduZWQgYml0KTsKKworICAvLy8gUmV0dXJucyB0aGUgYml0IG51bWJlciBvZiB0aGUgbGVhc3Qgb3IgbW9zdCBzaWduaWZpY2FudCBzZXQgYml0IG9mIGEKKyAgLy8vIG51bWJlci4gIElmIHRoZSBpbnB1dCBudW1iZXIgaGFzIG5vIGJpdHMgc2V0IC0xVSBpcyByZXR1cm5lZC4KKyAgc3RhdGljIHVuc2lnbmVkIHRjTFNCKGNvbnN0IFdvcmRUeXBlICosIHVuc2lnbmVkIG4pOworICBzdGF0aWMgdW5zaWduZWQgdGNNU0IoY29uc3QgV29yZFR5cGUgKnBhcnRzLCB1bnNpZ25lZCBuKTsKKworICAvLy8gTmVnYXRlIGEgYmlnbnVtIGluLXBsYWNlLgorICBzdGF0aWMgdm9pZCB0Y05lZ2F0ZShXb3JkVHlwZSAqLCB1bnNpZ25lZCk7CisKKyAgLy8vIERTVCArPSBSSFMgKyBDQVJSWSB3aGVyZSBDQVJSWSBpcyB6ZXJvIG9yIG9uZS4gIFJldHVybnMgdGhlIGNhcnJ5IGZsYWcuCisgIHN0YXRpYyBXb3JkVHlwZSB0Y0FkZChXb3JkVHlwZSAqLCBjb25zdCBXb3JkVHlwZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZFR5cGUgY2FycnksIHVuc2lnbmVkKTsKKyAgLy8vIERTVCArPSBSSFMuICBSZXR1cm5zIHRoZSBjYXJyeSBmbGFnLgorICBzdGF0aWMgV29yZFR5cGUgdGNBZGRQYXJ0KFdvcmRUeXBlICosIFdvcmRUeXBlLCB1bnNpZ25lZCk7CisKKyAgLy8vIERTVCAtPSBSSFMgKyBDQVJSWSB3aGVyZSBDQVJSWSBpcyB6ZXJvIG9yIG9uZS4gUmV0dXJucyB0aGUgY2FycnkgZmxhZy4KKyAgc3RhdGljIFdvcmRUeXBlIHRjU3VidHJhY3QoV29yZFR5cGUgKiwgY29uc3QgV29yZFR5cGUgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZFR5cGUgY2FycnksIHVuc2lnbmVkKTsKKyAgLy8vIERTVCAtPSBSSFMuICBSZXR1cm5zIHRoZSBjYXJyeSBmbGFnLgorICBzdGF0aWMgV29yZFR5cGUgdGNTdWJ0cmFjdFBhcnQoV29yZFR5cGUgKiwgV29yZFR5cGUsIHVuc2lnbmVkKTsKKworICAvLy8gRFNUICs9IFNSQyAqIE1VTFRJUExJRVIgKyBQQVJUICAgaWYgYWRkIGlzIHRydWUKKyAgLy8vIERTVCAgPSBTUkMgKiBNVUxUSVBMSUVSICsgUEFSVCAgIGlmIGFkZCBpcyBmYWxzZQorICAvLy8KKyAgLy8vIFJlcXVpcmVzIDAgPD0gRFNUUEFSVFMgPD0gU1JDUEFSVFMgKyAxLiAgSWYgRFNUIG92ZXJsYXBzIFNSQyB0aGV5IG11c3QKKyAgLy8vIHN0YXJ0IGF0IHRoZSBzYW1lIHBvaW50LCBpLmUuIERTVCA9PSBTUkMuCisgIC8vLworICAvLy8gSWYgRFNUUEFSVFMgPT0gU1JDX1BBUlRTICsgMSBubyBvdmVyZmxvdyBvY2N1cnMgYW5kIHplcm8gaXMgcmV0dXJuZWQuCisgIC8vLyBPdGhlcndpc2UgRFNUIGlzIGZpbGxlZCB3aXRoIHRoZSBsZWFzdCBzaWduaWZpY2FudCBEU1RQQVJUUyBwYXJ0cyBvZiB0aGUKKyAgLy8vIHJlc3VsdCwgYW5kIGlmIGFsbCBvZiB0aGUgb21pdHRlZCBoaWdoZXIgcGFydHMgd2VyZSB6ZXJvIHJldHVybiB6ZXJvLAorICAvLy8gb3RoZXJ3aXNlIG92ZXJmbG93IG9jY3VycmVkIGFuZCByZXR1cm4gb25lLgorICBzdGF0aWMgaW50IHRjTXVsdGlwbHlQYXJ0KFdvcmRUeXBlICpkc3QsIGNvbnN0IFdvcmRUeXBlICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZFR5cGUgbXVsdGlwbGllciwgV29yZFR5cGUgY2FycnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc3JjUGFydHMsIHVuc2lnbmVkIGRzdFBhcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkKTsKKworICAvLy8gRFNUID0gTEhTICogUkhTLCB3aGVyZSBEU1QgaGFzIHRoZSBzYW1lIHdpZHRoIGFzIHRoZSBvcGVyYW5kcyBhbmQgaXMKKyAgLy8vIGZpbGxlZCB3aXRoIHRoZSBsZWFzdCBzaWduaWZpY2FudCBwYXJ0cyBvZiB0aGUgcmVzdWx0LiAgUmV0dXJucyBvbmUgaWYKKyAgLy8vIG92ZXJmbG93IG9jY3VycmVkLCBvdGhlcndpc2UgemVyby4gIERTVCBtdXN0IGJlIGRpc2pvaW50IGZyb20gYm90aAorICAvLy8gb3BlcmFuZHMuCisgIHN0YXRpYyBpbnQgdGNNdWx0aXBseShXb3JkVHlwZSAqLCBjb25zdCBXb3JkVHlwZSAqLCBjb25zdCBXb3JkVHlwZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQpOworCisgIC8vLyBEU1QgPSBMSFMgKiBSSFMsIHdoZXJlIERTVCBoYXMgd2lkdGggdGhlIHN1bSBvZiB0aGUgd2lkdGhzIG9mIHRoZQorICAvLy8gb3BlcmFuZHMuIE5vIG92ZXJmbG93IG9jY3Vycy4gRFNUIG11c3QgYmUgZGlzam9pbnQgZnJvbSBib3RoIG9wZXJhbmRzLgorICBzdGF0aWMgdm9pZCB0Y0Z1bGxNdWx0aXBseShXb3JkVHlwZSAqLCBjb25zdCBXb3JkVHlwZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkVHlwZSAqLCB1bnNpZ25lZCwgdW5zaWduZWQpOworCisgIC8vLyBJZiBSSFMgaXMgemVybyBMSFMgYW5kIFJFTUFJTkRFUiBhcmUgbGVmdCB1bmNoYW5nZWQsIHJldHVybiBvbmUuCisgIC8vLyBPdGhlcndpc2Ugc2V0IExIUyB0byBMSFMgLyBSSFMgd2l0aCB0aGUgZnJhY3Rpb25hbCBwYXJ0IGRpc2NhcmRlZCwgc2V0CisgIC8vLyBSRU1BSU5ERVIgdG8gdGhlIHJlbWFpbmRlciwgcmV0dXJuIHplcm8uICBpLmUuCisgIC8vLworICAvLy8gIE9MRF9MSFMgPSBSSFMgKiBMSFMgKyBSRU1BSU5ERVIKKyAgLy8vCisgIC8vLyBTQ1JBVENIIGlzIGEgYmlnbnVtIG9mIHRoZSBzYW1lIHNpemUgYXMgdGhlIG9wZXJhbmRzIGFuZCByZXN1bHQgZm9yIHVzZSBieQorICAvLy8gdGhlIHJvdXRpbmU7IGl0cyBjb250ZW50cyBuZWVkIG5vdCBiZSBpbml0aWFsaXplZCBhbmQgYXJlIGRlc3Ryb3llZC4gIExIUywKKyAgLy8vIFJFTUFJTkRFUiBhbmQgU0NSQVRDSCBtdXN0IGJlIGRpc3RpbmN0LgorICBzdGF0aWMgaW50IHRjRGl2aWRlKFdvcmRUeXBlICpsaHMsIGNvbnN0IFdvcmRUeXBlICpyaHMsCisgICAgICAgICAgICAgICAgICAgICAgV29yZFR5cGUgKnJlbWFpbmRlciwgV29yZFR5cGUgKnNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcGFydHMpOworCisgIC8vLyBTaGlmdCBhIGJpZ251bSBsZWZ0IENvdW50IGJpdHMuIFNoaWZ0ZWQgaW4gYml0cyBhcmUgemVyby4gVGhlcmUgYXJlIG5vCisgIC8vLyByZXN0cmljdGlvbnMgb24gQ291bnQuCisgIHN0YXRpYyB2b2lkIHRjU2hpZnRMZWZ0KFdvcmRUeXBlICosIHVuc2lnbmVkIFdvcmRzLCB1bnNpZ25lZCBDb3VudCk7CisKKyAgLy8vIFNoaWZ0IGEgYmlnbnVtIHJpZ2h0IENvdW50IGJpdHMuICBTaGlmdGVkIGluIGJpdHMgYXJlIHplcm8uICBUaGVyZSBhcmUgbm8KKyAgLy8vIHJlc3RyaWN0aW9ucyBvbiBDb3VudC4KKyAgc3RhdGljIHZvaWQgdGNTaGlmdFJpZ2h0KFdvcmRUeXBlICosIHVuc2lnbmVkIFdvcmRzLCB1bnNpZ25lZCBDb3VudCk7CisKKyAgLy8vIFRoZSBvYnZpb3VzIEFORCwgT1IgYW5kIFhPUiBhbmQgY29tcGxlbWVudCBvcGVyYXRpb25zLgorICBzdGF0aWMgdm9pZCB0Y0FuZChXb3JkVHlwZSAqLCBjb25zdCBXb3JkVHlwZSAqLCB1bnNpZ25lZCk7CisgIHN0YXRpYyB2b2lkIHRjT3IoV29yZFR5cGUgKiwgY29uc3QgV29yZFR5cGUgKiwgdW5zaWduZWQpOworICBzdGF0aWMgdm9pZCB0Y1hvcihXb3JkVHlwZSAqLCBjb25zdCBXb3JkVHlwZSAqLCB1bnNpZ25lZCk7CisgIHN0YXRpYyB2b2lkIHRjQ29tcGxlbWVudChXb3JkVHlwZSAqLCB1bnNpZ25lZCk7CisKKyAgLy8vIENvbXBhcmlzb24gKHVuc2lnbmVkKSBvZiB0d28gYmlnbnVtcy4KKyAgc3RhdGljIGludCB0Y0NvbXBhcmUoY29uc3QgV29yZFR5cGUgKiwgY29uc3QgV29yZFR5cGUgKiwgdW5zaWduZWQpOworCisgIC8vLyBJbmNyZW1lbnQgYSBiaWdudW0gaW4tcGxhY2UuICBSZXR1cm4gdGhlIGNhcnJ5IGZsYWcuCisgIHN0YXRpYyBXb3JkVHlwZSB0Y0luY3JlbWVudChXb3JkVHlwZSAqZHN0LCB1bnNpZ25lZCBwYXJ0cykgeworICAgIHJldHVybiB0Y0FkZFBhcnQoZHN0LCAxLCBwYXJ0cyk7CisgIH0KKworICAvLy8gRGVjcmVtZW50IGEgYmlnbnVtIGluLXBsYWNlLiAgUmV0dXJuIHRoZSBib3Jyb3cgZmxhZy4KKyAgc3RhdGljIFdvcmRUeXBlIHRjRGVjcmVtZW50KFdvcmRUeXBlICpkc3QsIHVuc2lnbmVkIHBhcnRzKSB7CisgICAgcmV0dXJuIHRjU3VidHJhY3RQYXJ0KGRzdCwgMSwgcGFydHMpOworICB9CisKKyAgLy8vIFNldCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgQklUUyBhbmQgY2xlYXIgdGhlIHJlc3QuCisgIHN0YXRpYyB2b2lkIHRjU2V0TGVhc3RTaWduaWZpY2FudEJpdHMoV29yZFR5cGUgKiwgdW5zaWduZWQsIHVuc2lnbmVkIGJpdHMpOworCisgIC8vLyBcYnJpZWYgZGVidWcgbWV0aG9kCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBAfQorfTsKKworLy8vIE1hZ2ljIGRhdGEgZm9yIG9wdGltaXNpbmcgc2lnbmVkIGRpdmlzaW9uIGJ5IGEgY29uc3RhbnQuCitzdHJ1Y3QgQVBJbnQ6Om1zIHsKKyAgQVBJbnQgbTsgICAgLy8vPCBtYWdpYyBudW1iZXIKKyAgdW5zaWduZWQgczsgLy8vPCBzaGlmdCBhbW91bnQKK307CisKKy8vLyBNYWdpYyBkYXRhIGZvciBvcHRpbWlzaW5nIHVuc2lnbmVkIGRpdmlzaW9uIGJ5IGEgY29uc3RhbnQuCitzdHJ1Y3QgQVBJbnQ6Om11IHsKKyAgQVBJbnQgbTsgICAgLy8vPCBtYWdpYyBudW1iZXIKKyAgYm9vbCBhOyAgICAgLy8vPCBhZGQgaW5kaWNhdG9yCisgIHVuc2lnbmVkIHM7IC8vLzwgc2hpZnQgYW1vdW50Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KHVpbnQ2NF90IFYxLCBjb25zdCBBUEludCAmVjIpIHsgcmV0dXJuIFYyID09IFYxOyB9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0odWludDY0X3QgVjEsIGNvbnN0IEFQSW50ICZWMikgeyByZXR1cm4gVjIgIT0gVjE7IH0KKworLy8vIFxicmllZiBVbmFyeSBiaXR3aXNlIGNvbXBsZW1lbnQgb3BlcmF0b3IuCisvLy8KKy8vLyBccmV0dXJucyBhbiBBUEludCB0aGF0IGlzIHRoZSBiaXR3aXNlIGNvbXBsZW1lbnQgb2YgXHAgdi4KK2lubGluZSBBUEludCBvcGVyYXRvcn4oQVBJbnQgdikgeworICB2LmZsaXBBbGxCaXRzKCk7CisgIHJldHVybiB2OworfQorCitpbmxpbmUgQVBJbnQgb3BlcmF0b3ImKEFQSW50IGEsIGNvbnN0IEFQSW50ICZiKSB7CisgIGEgJj0gYjsKKyAgcmV0dXJuIGE7Cit9CisKK2lubGluZSBBUEludCBvcGVyYXRvciYoY29uc3QgQVBJbnQgJmEsIEFQSW50ICYmYikgeworICBiICY9IGE7CisgIHJldHVybiBzdGQ6Om1vdmUoYik7Cit9CisKK2lubGluZSBBUEludCBvcGVyYXRvciYoQVBJbnQgYSwgdWludDY0X3QgUkhTKSB7CisgIGEgJj0gUkhTOworICByZXR1cm4gYTsKK30KKworaW5saW5lIEFQSW50IG9wZXJhdG9yJih1aW50NjRfdCBMSFMsIEFQSW50IGIpIHsKKyAgYiAmPSBMSFM7CisgIHJldHVybiBiOworfQorCitpbmxpbmUgQVBJbnQgb3BlcmF0b3J8KEFQSW50IGEsIGNvbnN0IEFQSW50ICZiKSB7CisgIGEgfD0gYjsKKyAgcmV0dXJuIGE7Cit9CisKK2lubGluZSBBUEludCBvcGVyYXRvcnwoY29uc3QgQVBJbnQgJmEsIEFQSW50ICYmYikgeworICBiIHw9IGE7CisgIHJldHVybiBzdGQ6Om1vdmUoYik7Cit9CisKK2lubGluZSBBUEludCBvcGVyYXRvcnwoQVBJbnQgYSwgdWludDY0X3QgUkhTKSB7CisgIGEgfD0gUkhTOworICByZXR1cm4gYTsKK30KKworaW5saW5lIEFQSW50IG9wZXJhdG9yfCh1aW50NjRfdCBMSFMsIEFQSW50IGIpIHsKKyAgYiB8PSBMSFM7CisgIHJldHVybiBiOworfQorCitpbmxpbmUgQVBJbnQgb3BlcmF0b3JeKEFQSW50IGEsIGNvbnN0IEFQSW50ICZiKSB7CisgIGEgXj0gYjsKKyAgcmV0dXJuIGE7Cit9CisKK2lubGluZSBBUEludCBvcGVyYXRvcl4oY29uc3QgQVBJbnQgJmEsIEFQSW50ICYmYikgeworICBiIF49IGE7CisgIHJldHVybiBzdGQ6Om1vdmUoYik7Cit9CisKK2lubGluZSBBUEludCBvcGVyYXRvcl4oQVBJbnQgYSwgdWludDY0X3QgUkhTKSB7CisgIGEgXj0gUkhTOworICByZXR1cm4gYTsKK30KKworaW5saW5lIEFQSW50IG9wZXJhdG9yXih1aW50NjRfdCBMSFMsIEFQSW50IGIpIHsKKyAgYiBePSBMSFM7CisgIHJldHVybiBiOworfQorCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBBUEludCAmSSkgeworICBJLnByaW50KE9TLCB0cnVlKTsKKyAgcmV0dXJuIE9TOworfQorCitpbmxpbmUgQVBJbnQgb3BlcmF0b3ItKEFQSW50IHYpIHsKKyAgdi5uZWdhdGUoKTsKKyAgcmV0dXJuIHY7Cit9CisKK2lubGluZSBBUEludCBvcGVyYXRvcisoQVBJbnQgYSwgY29uc3QgQVBJbnQgJmIpIHsKKyAgYSArPSBiOworICByZXR1cm4gYTsKK30KKworaW5saW5lIEFQSW50IG9wZXJhdG9yKyhjb25zdCBBUEludCAmYSwgQVBJbnQgJiZiKSB7CisgIGIgKz0gYTsKKyAgcmV0dXJuIHN0ZDo6bW92ZShiKTsKK30KKworaW5saW5lIEFQSW50IG9wZXJhdG9yKyhBUEludCBhLCB1aW50NjRfdCBSSFMpIHsKKyAgYSArPSBSSFM7CisgIHJldHVybiBhOworfQorCitpbmxpbmUgQVBJbnQgb3BlcmF0b3IrKHVpbnQ2NF90IExIUywgQVBJbnQgYikgeworICBiICs9IExIUzsKKyAgcmV0dXJuIGI7Cit9CisKK2lubGluZSBBUEludCBvcGVyYXRvci0oQVBJbnQgYSwgY29uc3QgQVBJbnQgJmIpIHsKKyAgYSAtPSBiOworICByZXR1cm4gYTsKK30KKworaW5saW5lIEFQSW50IG9wZXJhdG9yLShjb25zdCBBUEludCAmYSwgQVBJbnQgJiZiKSB7CisgIGIubmVnYXRlKCk7CisgIGIgKz0gYTsKKyAgcmV0dXJuIHN0ZDo6bW92ZShiKTsKK30KKworaW5saW5lIEFQSW50IG9wZXJhdG9yLShBUEludCBhLCB1aW50NjRfdCBSSFMpIHsKKyAgYSAtPSBSSFM7CisgIHJldHVybiBhOworfQorCitpbmxpbmUgQVBJbnQgb3BlcmF0b3ItKHVpbnQ2NF90IExIUywgQVBJbnQgYikgeworICBiLm5lZ2F0ZSgpOworICBiICs9IExIUzsKKyAgcmV0dXJuIGI7Cit9CisKK2lubGluZSBBUEludCBvcGVyYXRvciooQVBJbnQgYSwgdWludDY0X3QgUkhTKSB7CisgIGEgKj0gUkhTOworICByZXR1cm4gYTsKK30KKworaW5saW5lIEFQSW50IG9wZXJhdG9yKih1aW50NjRfdCBMSFMsIEFQSW50IGIpIHsKKyAgYiAqPSBMSFM7CisgIHJldHVybiBiOworfQorCisKK25hbWVzcGFjZSBBUEludE9wcyB7CisKKy8vLyBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBzbWFsbGVyIG9mIHR3byBBUEludHMgY29uc2lkZXJlZCB0byBiZSBzaWduZWQuCitpbmxpbmUgY29uc3QgQVBJbnQgJnNtaW4oY29uc3QgQVBJbnQgJkEsIGNvbnN0IEFQSW50ICZCKSB7CisgIHJldHVybiBBLnNsdChCKSA/IEEgOiBCOworfQorCisvLy8gXGJyaWVmIERldGVybWluZSB0aGUgbGFyZ2VyIG9mIHR3byBBUEludHMgY29uc2lkZXJlZCB0byBiZSBzaWduZWQuCitpbmxpbmUgY29uc3QgQVBJbnQgJnNtYXgoY29uc3QgQVBJbnQgJkEsIGNvbnN0IEFQSW50ICZCKSB7CisgIHJldHVybiBBLnNndChCKSA/IEEgOiBCOworfQorCisvLy8gXGJyaWVmIERldGVybWluZSB0aGUgc21hbGxlciBvZiB0d28gQVBJbnRzIGNvbnNpZGVyZWQgdG8gYmUgc2lnbmVkLgoraW5saW5lIGNvbnN0IEFQSW50ICZ1bWluKGNvbnN0IEFQSW50ICZBLCBjb25zdCBBUEludCAmQikgeworICByZXR1cm4gQS51bHQoQikgPyBBIDogQjsKK30KKworLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIGxhcmdlciBvZiB0d28gQVBJbnRzIGNvbnNpZGVyZWQgdG8gYmUgdW5zaWduZWQuCitpbmxpbmUgY29uc3QgQVBJbnQgJnVtYXgoY29uc3QgQVBJbnQgJkEsIGNvbnN0IEFQSW50ICZCKSB7CisgIHJldHVybiBBLnVndChCKSA/IEEgOiBCOworfQorCisvLy8gXGJyaWVmIENvbXB1dGUgR0NEIG9mIHR3byB1bnNpZ25lZCBBUEludCB2YWx1ZXMuCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIHRoZSB0d28gQVBJbnQgdmFsdWVzCisvLy8gdXNpbmcgU3RlaW4ncyBhbGdvcml0aG0uCisvLy8KKy8vLyBccmV0dXJucyB0aGUgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3Igb2YgQSBhbmQgQi4KK0FQSW50IEdyZWF0ZXN0Q29tbW9uRGl2aXNvcihBUEludCBBLCBBUEludCBCKTsKKworLy8vIFxicmllZiBDb252ZXJ0cyB0aGUgZ2l2ZW4gQVBJbnQgdG8gYSBkb3VibGUgdmFsdWUuCisvLy8KKy8vLyBUcmVhdHMgdGhlIEFQSW50IGFzIGFuIHVuc2lnbmVkIHZhbHVlIGZvciBjb252ZXJzaW9uIHB1cnBvc2VzLgoraW5saW5lIGRvdWJsZSBSb3VuZEFQSW50VG9Eb3VibGUoY29uc3QgQVBJbnQgJkFQSVZhbCkgeworICByZXR1cm4gQVBJVmFsLnJvdW5kVG9Eb3VibGUoKTsKK30KKworLy8vIFxicmllZiBDb252ZXJ0cyB0aGUgZ2l2ZW4gQVBJbnQgdG8gYSBkb3VibGUgdmFsdWUuCisvLy8KKy8vLyBUcmVhdHMgdGhlIEFQSW50IGFzIGEgc2lnbmVkIHZhbHVlIGZvciBjb252ZXJzaW9uIHB1cnBvc2VzLgoraW5saW5lIGRvdWJsZSBSb3VuZFNpZ25lZEFQSW50VG9Eb3VibGUoY29uc3QgQVBJbnQgJkFQSVZhbCkgeworICByZXR1cm4gQVBJVmFsLnNpZ25lZFJvdW5kVG9Eb3VibGUoKTsKK30KKworLy8vIFxicmllZiBDb252ZXJ0cyB0aGUgZ2l2ZW4gQVBJbnQgdG8gYSBmbG9hdCB2bGFsdWUuCitpbmxpbmUgZmxvYXQgUm91bmRBUEludFRvRmxvYXQoY29uc3QgQVBJbnQgJkFQSVZhbCkgeworICByZXR1cm4gZmxvYXQoUm91bmRBUEludFRvRG91YmxlKEFQSVZhbCkpOworfQorCisvLy8gXGJyaWVmIENvbnZlcnRzIHRoZSBnaXZlbiBBUEludCB0byBhIGZsb2F0IHZhbHVlLgorLy8vCisvLy8gVHJlYXN0IHRoZSBBUEludCBhcyBhIHNpZ25lZCB2YWx1ZSBmb3IgY29udmVyc2lvbiBwdXJwb3Nlcy4KK2lubGluZSBmbG9hdCBSb3VuZFNpZ25lZEFQSW50VG9GbG9hdChjb25zdCBBUEludCAmQVBJVmFsKSB7CisgIHJldHVybiBmbG9hdChBUElWYWwuc2lnbmVkUm91bmRUb0RvdWJsZSgpKTsKK30KKworLy8vIFxicmllZiBDb252ZXJ0cyB0aGUgZ2l2ZW4gZG91YmxlIHZhbHVlIGludG8gYSBBUEludC4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gY29udmVydCBhIGRvdWJsZSB2YWx1ZSB0byBhbiBBUEludCB2YWx1ZS4KK0FQSW50IFJvdW5kRG91YmxlVG9BUEludChkb3VibGUgRG91YmxlLCB1bnNpZ25lZCB3aWR0aCk7CisKKy8vLyBcYnJpZWYgQ29udmVydHMgYSBmbG9hdCB2YWx1ZSBpbnRvIGEgQVBJbnQuCisvLy8KKy8vLyBDb252ZXJ0cyBhIGZsb2F0IHZhbHVlIGludG8gYW4gQVBJbnQgdmFsdWUuCitpbmxpbmUgQVBJbnQgUm91bmRGbG9hdFRvQVBJbnQoZmxvYXQgRmxvYXQsIHVuc2lnbmVkIHdpZHRoKSB7CisgIHJldHVybiBSb3VuZERvdWJsZVRvQVBJbnQoZG91YmxlKEZsb2F0KSwgd2lkdGgpOworfQorCit9IC8vIEVuZCBvZiBBUEludE9wcyBuYW1lc3BhY2UKKworLy8gU2VlIGZyaWVuZCBkZWNsYXJhdGlvbiBhYm92ZS4gVGhpcyBhZGRpdGlvbmFsIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGluCisvLyBvcmRlciB0byBjb21waWxlIExMVk0gd2l0aCBJQk0geGxDIGNvbXBpbGVyLgoraGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3QgQVBJbnQgJkFyZyk7Cit9IC8vIEVuZCBvZiBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0FQU0ludC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQVBTSW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFiYmYzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0FQU0ludC5oCkBAIC0wLDAgKzEsMzM2IEBACisvLz09PS0tIGxsdm0vQURUL0FQU0ludC5oIC0gQXJiaXRyYXJ5IFByZWNpc2lvbiBTaWduZWQgSW50IC0tLS0tKi0gQysrIC0qLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBBUFNJbnQgY2xhc3MsIHdoaWNoIGlzIGEgc2ltcGxlIGNsYXNzIHRoYXQKKy8vIHJlcHJlc2VudHMgYW4gYXJiaXRyYXJ5IHNpemVkIGludGVnZXIgdGhhdCBrbm93cyBpdHMgc2lnbmVkbmVzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0FQU0lOVF9ICisjZGVmaW5lIExMVk1fQURUX0FQU0lOVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEludC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExMVk1fTk9ESVNDQVJEIEFQU0ludCA6IHB1YmxpYyBBUEludCB7CisgIGJvb2wgSXNVbnNpZ25lZDsKKworcHVibGljOgorICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciB0aGF0IGNyZWF0ZXMgYW4gdW5pbml0aWFsaXplZCBBUEludC4KKyAgZXhwbGljaXQgQVBTSW50KCkgOiBJc1Vuc2lnbmVkKGZhbHNlKSB7fQorCisgIC8vLyBBUFNJbnQgY3RvciAtIENyZWF0ZSBhbiBBUFNJbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoLCBkZWZhdWx0IHRvCisgIC8vLyB1bnNpZ25lZC4KKyAgZXhwbGljaXQgQVBTSW50KHVpbnQzMl90IEJpdFdpZHRoLCBib29sIGlzVW5zaWduZWQgPSB0cnVlKQorICAgOiBBUEludChCaXRXaWR0aCwgMCksIElzVW5zaWduZWQoaXNVbnNpZ25lZCkge30KKworICBleHBsaWNpdCBBUFNJbnQoQVBJbnQgSSwgYm9vbCBpc1Vuc2lnbmVkID0gdHJ1ZSkKKyAgIDogQVBJbnQoc3RkOjptb3ZlKEkpKSwgSXNVbnNpZ25lZChpc1Vuc2lnbmVkKSB7fQorCisgIC8vLyBDb25zdHJ1Y3QgYW4gQVBTSW50IGZyb20gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgIC8vLworICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBpbnRlcnByZXRzIHRoZSBzdHJpbmcgXHAgU3RyIHVzaW5nIHRoZSByYWRpeCBvZiAxMC4KKyAgLy8vIFRoZSBpbnRlcnByZXRhdGlvbiBzdG9wcyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuIFRoZSBiaXQgd2lkdGggb2YgdGhlCisgIC8vLyBjb25zdHJ1Y3RlZCBBUFNJbnQgaXMgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5LgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdHIgdGhlIHN0cmluZyB0byBiZSBpbnRlcnByZXRlZC4KKyAgZXhwbGljaXQgQVBTSW50KFN0cmluZ1JlZiBTdHIpOworCisgIEFQU0ludCAmb3BlcmF0b3I9KEFQSW50IFJIUykgeworICAgIC8vIFJldGFpbiBvdXIgY3VycmVudCBzaWduLgorICAgIEFQSW50OjpvcGVyYXRvcj0oc3RkOjptb3ZlKFJIUykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEFQU0ludCAmb3BlcmF0b3I9KHVpbnQ2NF90IFJIUykgeworICAgIC8vIFJldGFpbiBvdXIgY3VycmVudCBzaWduLgorICAgIEFQSW50OjpvcGVyYXRvcj0oUkhTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBRdWVyeSBzaWduIGluZm9ybWF0aW9uLgorICBib29sIGlzU2lnbmVkKCkgY29uc3QgeyByZXR1cm4gIUlzVW5zaWduZWQ7IH0KKyAgYm9vbCBpc1Vuc2lnbmVkKCkgY29uc3QgeyByZXR1cm4gSXNVbnNpZ25lZDsgfQorICB2b2lkIHNldElzVW5zaWduZWQoYm9vbCBWYWwpIHsgSXNVbnNpZ25lZCA9IFZhbDsgfQorICB2b2lkIHNldElzU2lnbmVkKGJvb2wgVmFsKSB7IElzVW5zaWduZWQgPSAhVmFsOyB9CisKKyAgLy8vIHRvU3RyaW5nIC0gQXBwZW5kIHRoaXMgQVBTSW50IHRvIHRoZSBzcGVjaWZpZWQgU21hbGxTdHJpbmcuCisgIHZvaWQgdG9TdHJpbmcoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZTdHIsIHVuc2lnbmVkIFJhZGl4ID0gMTApIGNvbnN0IHsKKyAgICBBUEludDo6dG9TdHJpbmcoU3RyLCBSYWRpeCwgaXNTaWduZWQoKSk7CisgIH0KKyAgLy8vIHRvU3RyaW5nIC0gQ29udmVydHMgYW4gQVBJbnQgdG8gYSBzdGQ6OnN0cmluZy4gIFRoaXMgaXMgYW4gaW5lZmZpY2llbnQKKyAgLy8vIG1ldGhvZDsgeW91IHNob3VsZCBwcmVmZXIgcGFzc2luZyBpbiBhIFNtYWxsU3RyaW5nIGluc3RlYWQuCisgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKHVuc2lnbmVkIFJhZGl4KSBjb25zdCB7CisgICAgcmV0dXJuIEFQSW50Ojp0b1N0cmluZyhSYWRpeCwgaXNTaWduZWQoKSk7CisgIH0KKyAgdXNpbmcgQVBJbnQ6OnRvU3RyaW5nOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBjb3JyZWN0bHktZXh0ZW5kZWQgXGMgaW50NjRfdCB2YWx1ZS4KKyAgaW50NjRfdCBnZXRFeHRWYWx1ZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0TWluU2lnbmVkQml0cygpIDw9IDY0ICYmICJUb28gbWFueSBiaXRzIGZvciBpbnQ2NF90Iik7CisgICAgcmV0dXJuIGlzU2lnbmVkKCkgPyBnZXRTRXh0VmFsdWUoKSA6IGdldFpFeHRWYWx1ZSgpOworICB9CisKKyAgQVBTSW50IHRydW5jKHVpbnQzMl90IHdpZHRoKSBjb25zdCB7CisgICAgcmV0dXJuIEFQU0ludChBUEludDo6dHJ1bmMod2lkdGgpLCBJc1Vuc2lnbmVkKTsKKyAgfQorCisgIEFQU0ludCBleHRlbmQodWludDMyX3Qgd2lkdGgpIGNvbnN0IHsKKyAgICBpZiAoSXNVbnNpZ25lZCkKKyAgICAgIHJldHVybiBBUFNJbnQoemV4dCh3aWR0aCksIElzVW5zaWduZWQpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBBUFNJbnQoc2V4dCh3aWR0aCksIElzVW5zaWduZWQpOworICB9CisKKyAgQVBTSW50IGV4dE9yVHJ1bmModWludDMyX3Qgd2lkdGgpIGNvbnN0IHsKKyAgICBpZiAoSXNVbnNpZ25lZCkKKyAgICAgIHJldHVybiBBUFNJbnQoemV4dE9yVHJ1bmMod2lkdGgpLCBJc1Vuc2lnbmVkKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gQVBTSW50KHNleHRPclRydW5jKHdpZHRoKSwgSXNVbnNpZ25lZCk7CisgIH0KKworICBjb25zdCBBUFNJbnQgJm9wZXJhdG9yJT0oY29uc3QgQVBTSW50ICZSSFMpIHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICBpZiAoSXNVbnNpZ25lZCkKKyAgICAgICp0aGlzID0gdXJlbShSSFMpOworICAgIGVsc2UKKyAgICAgICp0aGlzID0gc3JlbShSSFMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBjb25zdCBBUFNJbnQgJm9wZXJhdG9yLz0oY29uc3QgQVBTSW50ICZSSFMpIHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICBpZiAoSXNVbnNpZ25lZCkKKyAgICAgICp0aGlzID0gdWRpdihSSFMpOworICAgIGVsc2UKKyAgICAgICp0aGlzID0gc2RpdihSSFMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBBUFNJbnQgb3BlcmF0b3IlKGNvbnN0IEFQU0ludCAmUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgcmV0dXJuIElzVW5zaWduZWQgPyBBUFNJbnQodXJlbShSSFMpLCB0cnVlKSA6IEFQU0ludChzcmVtKFJIUyksIGZhbHNlKTsKKyAgfQorICBBUFNJbnQgb3BlcmF0b3IvKGNvbnN0IEFQU0ludCAmUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgcmV0dXJuIElzVW5zaWduZWQgPyBBUFNJbnQodWRpdihSSFMpLCB0cnVlKSA6IEFQU0ludChzZGl2KFJIUyksIGZhbHNlKTsKKyAgfQorCisgIEFQU0ludCBvcGVyYXRvcj4+KHVuc2lnbmVkIEFtdCkgY29uc3QgeworICAgIHJldHVybiBJc1Vuc2lnbmVkID8gQVBTSW50KGxzaHIoQW10KSwgdHJ1ZSkgOiBBUFNJbnQoYXNocihBbXQpLCBmYWxzZSk7CisgIH0KKyAgQVBTSW50JiBvcGVyYXRvcj4+PSh1bnNpZ25lZCBBbXQpIHsKKyAgICBpZiAoSXNVbnNpZ25lZCkKKyAgICAgIGxzaHJJblBsYWNlKEFtdCk7CisgICAgZWxzZQorICAgICAgYXNockluUGxhY2UoQW10KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgQVBTSW50JiBSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICByZXR1cm4gSXNVbnNpZ25lZCA/IHVsdChSSFMpIDogc2x0KFJIUyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEFQU0ludCYgUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgcmV0dXJuIElzVW5zaWduZWQgPyB1Z3QoUkhTKSA6IHNndChSSFMpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgQVBTSW50JiBSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICByZXR1cm4gSXNVbnNpZ25lZCA/IHVsZShSSFMpIDogc2xlKFJIUyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBBUFNJbnQmIFJIUykgY29uc3QgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIHJldHVybiBJc1Vuc2lnbmVkID8gdWdlKFJIUykgOiBzZ2UoUkhTKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFQU0ludCYgUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgcmV0dXJuIGVxKFJIUyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBUFNJbnQmIFJIUykgY29uc3QgeworICAgIHJldHVybiAhKCgqdGhpcykgPT0gUkhTKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShpbnQ2NF90IFJIUykgY29uc3QgeworICAgIHJldHVybiBjb21wYXJlVmFsdWVzKCp0aGlzLCBnZXQoUkhTKSkgPT0gMDsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oaW50NjRfdCBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gY29tcGFyZVZhbHVlcygqdGhpcywgZ2V0KFJIUykpICE9IDA7CisgIH0KKyAgYm9vbCBvcGVyYXRvcjw9KGludDY0X3QgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZXMoKnRoaXMsIGdldChSSFMpKSA8PSAwOworICB9CisgIGJvb2wgb3BlcmF0b3I+PShpbnQ2NF90IFJIUykgY29uc3QgeworICAgIHJldHVybiBjb21wYXJlVmFsdWVzKCp0aGlzLCBnZXQoUkhTKSkgPj0gMDsKKyAgfQorICBib29sIG9wZXJhdG9yPChpbnQ2NF90IFJIUykgY29uc3QgeworICAgIHJldHVybiBjb21wYXJlVmFsdWVzKCp0aGlzLCBnZXQoUkhTKSkgPCAwOworICB9CisgIGJvb2wgb3BlcmF0b3I+KGludDY0X3QgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZXMoKnRoaXMsIGdldChSSFMpKSA+IDA7CisgIH0KKworICAvLyBUaGUgcmVtYWluaW5nIG9wZXJhdG9ycyBqdXN0IHdyYXAgdGhlIGxvZ2ljIG9mIEFQSW50LCBidXQgcmV0YWluIHRoZQorICAvLyBzaWduZWRuZXNzIGluZm9ybWF0aW9uLgorCisgIEFQU0ludCBvcGVyYXRvcjw8KHVuc2lnbmVkIEJpdHMpIGNvbnN0IHsKKyAgICByZXR1cm4gQVBTSW50KHN0YXRpY19jYXN0PGNvbnN0IEFQSW50Jj4oKnRoaXMpIDw8IEJpdHMsIElzVW5zaWduZWQpOworICB9CisgIEFQU0ludCYgb3BlcmF0b3I8PD0odW5zaWduZWQgQW10KSB7CisgICAgc3RhdGljX2Nhc3Q8QVBJbnQmPigqdGhpcykgPDw9IEFtdDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBBUFNJbnQmIG9wZXJhdG9yKysoKSB7CisgICAgKysoc3RhdGljX2Nhc3Q8QVBJbnQmPigqdGhpcykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBBUFNJbnQmIG9wZXJhdG9yLS0oKSB7CisgICAgLS0oc3RhdGljX2Nhc3Q8QVBJbnQmPigqdGhpcykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBBUFNJbnQgb3BlcmF0b3IrKyhpbnQpIHsKKyAgICByZXR1cm4gQVBTSW50KCsrc3RhdGljX2Nhc3Q8QVBJbnQmPigqdGhpcyksIElzVW5zaWduZWQpOworICB9CisgIEFQU0ludCBvcGVyYXRvci0tKGludCkgeworICAgIHJldHVybiBBUFNJbnQoLS1zdGF0aWNfY2FzdDxBUEludCY+KCp0aGlzKSwgSXNVbnNpZ25lZCk7CisgIH0KKyAgQVBTSW50IG9wZXJhdG9yLSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQVBTSW50KC1zdGF0aWNfY2FzdDxjb25zdCBBUEludCY+KCp0aGlzKSwgSXNVbnNpZ25lZCk7CisgIH0KKyAgQVBTSW50JiBvcGVyYXRvcis9KGNvbnN0IEFQU0ludCYgUkhTKSB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgc3RhdGljX2Nhc3Q8QVBJbnQmPigqdGhpcykgKz0gUkhTOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBBUFNJbnQmIG9wZXJhdG9yLT0oY29uc3QgQVBTSW50JiBSSFMpIHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICBzdGF0aWNfY2FzdDxBUEludCY+KCp0aGlzKSAtPSBSSFM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEFQU0ludCYgb3BlcmF0b3IqPShjb25zdCBBUFNJbnQmIFJIUykgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIHN0YXRpY19jYXN0PEFQSW50Jj4oKnRoaXMpICo9IFJIUzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQVBTSW50JiBvcGVyYXRvciY9KGNvbnN0IEFQU0ludCYgUkhTKSB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgc3RhdGljX2Nhc3Q8QVBJbnQmPigqdGhpcykgJj0gUkhTOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBBUFNJbnQmIG9wZXJhdG9yfD0oY29uc3QgQVBTSW50JiBSSFMpIHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICBzdGF0aWNfY2FzdDxBUEludCY+KCp0aGlzKSB8PSBSSFM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEFQU0ludCYgb3BlcmF0b3JePShjb25zdCBBUFNJbnQmIFJIUykgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIHN0YXRpY19jYXN0PEFQSW50Jj4oKnRoaXMpIF49IFJIUzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBBUFNJbnQgb3BlcmF0b3ImKGNvbnN0IEFQU0ludCYgUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgcmV0dXJuIEFQU0ludChzdGF0aWNfY2FzdDxjb25zdCBBUEludCY+KCp0aGlzKSAmIFJIUywgSXNVbnNpZ25lZCk7CisgIH0KKworICBBUFNJbnQgb3BlcmF0b3J8KGNvbnN0IEFQU0ludCYgUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgcmV0dXJuIEFQU0ludChzdGF0aWNfY2FzdDxjb25zdCBBUEludCY+KCp0aGlzKSB8IFJIUywgSXNVbnNpZ25lZCk7CisgIH0KKworICBBUFNJbnQgb3BlcmF0b3JeKGNvbnN0IEFQU0ludCAmUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgcmV0dXJuIEFQU0ludChzdGF0aWNfY2FzdDxjb25zdCBBUEludCY+KCp0aGlzKSBeIFJIUywgSXNVbnNpZ25lZCk7CisgIH0KKworICBBUFNJbnQgb3BlcmF0b3IqKGNvbnN0IEFQU0ludCYgUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgcmV0dXJuIEFQU0ludChzdGF0aWNfY2FzdDxjb25zdCBBUEludCY+KCp0aGlzKSAqIFJIUywgSXNVbnNpZ25lZCk7CisgIH0KKyAgQVBTSW50IG9wZXJhdG9yKyhjb25zdCBBUFNJbnQmIFJIUykgY29uc3QgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIHJldHVybiBBUFNJbnQoc3RhdGljX2Nhc3Q8Y29uc3QgQVBJbnQmPigqdGhpcykgKyBSSFMsIElzVW5zaWduZWQpOworICB9CisgIEFQU0ludCBvcGVyYXRvci0oY29uc3QgQVBTSW50JiBSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICByZXR1cm4gQVBTSW50KHN0YXRpY19jYXN0PGNvbnN0IEFQSW50Jj4oKnRoaXMpIC0gUkhTLCBJc1Vuc2lnbmVkKTsKKyAgfQorICBBUFNJbnQgb3BlcmF0b3J+KCkgY29uc3QgeworICAgIHJldHVybiBBUFNJbnQofnN0YXRpY19jYXN0PGNvbnN0IEFQSW50Jj4oKnRoaXMpLCBJc1Vuc2lnbmVkKTsKKyAgfQorCisgIC8vLyBnZXRNYXhWYWx1ZSAtIFJldHVybiB0aGUgQVBTSW50IHJlcHJlc2VudGluZyB0aGUgbWF4aW11bSBpbnRlZ2VyIHZhbHVlCisgIC8vLyAgd2l0aCB0aGUgZ2l2ZW4gYml0IHdpZHRoIGFuZCBzaWduZWRuZXNzLgorICBzdGF0aWMgQVBTSW50IGdldE1heFZhbHVlKHVpbnQzMl90IG51bUJpdHMsIGJvb2wgVW5zaWduZWQpIHsKKyAgICByZXR1cm4gQVBTSW50KFVuc2lnbmVkID8gQVBJbnQ6OmdldE1heFZhbHVlKG51bUJpdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFQSW50OjpnZXRTaWduZWRNYXhWYWx1ZShudW1CaXRzKSwgVW5zaWduZWQpOworICB9CisKKyAgLy8vIGdldE1pblZhbHVlIC0gUmV0dXJuIHRoZSBBUFNJbnQgcmVwcmVzZW50aW5nIHRoZSBtaW5pbXVtIGludGVnZXIgdmFsdWUKKyAgLy8vICB3aXRoIHRoZSBnaXZlbiBiaXQgd2lkdGggYW5kIHNpZ25lZG5lc3MuCisgIHN0YXRpYyBBUFNJbnQgZ2V0TWluVmFsdWUodWludDMyX3QgbnVtQml0cywgYm9vbCBVbnNpZ25lZCkgeworICAgIHJldHVybiBBUFNJbnQoVW5zaWduZWQgPyBBUEludDo6Z2V0TWluVmFsdWUobnVtQml0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVBJbnQ6OmdldFNpZ25lZE1pblZhbHVlKG51bUJpdHMpLCBVbnNpZ25lZCk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSBpZiB0d28gQVBTSW50cyBoYXZlIHRoZSBzYW1lIHZhbHVlLCB6ZXJvLSBvcgorICAvLy8gc2lnbi1leHRlbmRpbmcgYXMgbmVlZGVkLgorICBzdGF0aWMgYm9vbCBpc1NhbWVWYWx1ZShjb25zdCBBUFNJbnQgJkkxLCBjb25zdCBBUFNJbnQgJkkyKSB7CisgICAgcmV0dXJuICFjb21wYXJlVmFsdWVzKEkxLCBJMik7CisgIH0KKworICAvLy8gXGJyaWVmIENvbXBhcmUgdW5kZXJseWluZyB2YWx1ZXMgb2YgdHdvIG51bWJlcnMuCisgIHN0YXRpYyBpbnQgY29tcGFyZVZhbHVlcyhjb25zdCBBUFNJbnQgJkkxLCBjb25zdCBBUFNJbnQgJkkyKSB7CisgICAgaWYgKEkxLmdldEJpdFdpZHRoKCkgPT0gSTIuZ2V0Qml0V2lkdGgoKSAmJiBJMS5pc1NpZ25lZCgpID09IEkyLmlzU2lnbmVkKCkpCisgICAgICByZXR1cm4gSTEuSXNVbnNpZ25lZCA/IEkxLmNvbXBhcmUoSTIpIDogSTEuY29tcGFyZVNpZ25lZChJMik7CisKKyAgICAvLyBDaGVjayBmb3IgYSBiaXQtd2lkdGggbWlzbWF0Y2guCisgICAgaWYgKEkxLmdldEJpdFdpZHRoKCkgPiBJMi5nZXRCaXRXaWR0aCgpKQorICAgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZXMoSTEsIEkyLmV4dGVuZChJMS5nZXRCaXRXaWR0aCgpKSk7CisgICAgaWYgKEkyLmdldEJpdFdpZHRoKCkgPiBJMS5nZXRCaXRXaWR0aCgpKQorICAgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZXMoSTEuZXh0ZW5kKEkyLmdldEJpdFdpZHRoKCkpLCBJMik7CisKKyAgICAvLyBXZSBoYXZlIGEgc2lnbmVkbmVzcyBtaXNtYXRjaC4gQ2hlY2sgZm9yIG5lZ2F0aXZlIHZhbHVlcyBhbmQgZG8gYW4KKyAgICAvLyB1bnNpZ25lZCBjb21wYXJlIGlmIGJvdGggYXJlIHBvc2l0aXZlLgorICAgIGlmIChJMS5pc1NpZ25lZCgpKSB7CisgICAgICBhc3NlcnQoIUkyLmlzU2lnbmVkKCkgJiYgIkV4cGVjdGVkIHNpZ25lZCBtaXNtYXRjaCIpOworICAgICAgaWYgKEkxLmlzTmVnYXRpdmUoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoSTIuaXNTaWduZWQoKSAmJiAiRXhwZWN0ZWQgc2lnbmVkIG1pc21hdGNoIik7CisgICAgICBpZiAoSTIuaXNOZWdhdGl2ZSgpKQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gSTEuY29tcGFyZShJMik7CisgIH0KKworICBzdGF0aWMgQVBTSW50IGdldChpbnQ2NF90IFgpIHsgcmV0dXJuIEFQU0ludChBUEludCg2NCwgWCksIGZhbHNlKTsgfQorICBzdGF0aWMgQVBTSW50IGdldFVuc2lnbmVkKHVpbnQ2NF90IFgpIHsgcmV0dXJuIEFQU0ludChBUEludCg2NCwgWCksIHRydWUpOyB9CisKKyAgLy8vIFByb2ZpbGUgLSBVc2VkIHRvIGluc2VydCBBUFNJbnQgb2JqZWN0cywgb3Igb2JqZWN0cyB0aGF0IGNvbnRhaW4gQVBTSW50CisgIC8vLyAgb2JqZWN0cywgaW50byBGb2xkaW5nU2V0cy4KKyAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdDsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oaW50NjRfdCBWMSwgY29uc3QgQVBTSW50ICZWMikgeyByZXR1cm4gVjIgPT0gVjE7IH0KK2lubGluZSBib29sIG9wZXJhdG9yIT0oaW50NjRfdCBWMSwgY29uc3QgQVBTSW50ICZWMikgeyByZXR1cm4gVjIgIT0gVjE7IH0KK2lubGluZSBib29sIG9wZXJhdG9yPD0oaW50NjRfdCBWMSwgY29uc3QgQVBTSW50ICZWMikgeyByZXR1cm4gVjIgPj0gVjE7IH0KK2lubGluZSBib29sIG9wZXJhdG9yPj0oaW50NjRfdCBWMSwgY29uc3QgQVBTSW50ICZWMikgeyByZXR1cm4gVjIgPD0gVjE7IH0KK2lubGluZSBib29sIG9wZXJhdG9yPChpbnQ2NF90IFYxLCBjb25zdCBBUFNJbnQgJlYyKSB7IHJldHVybiBWMiA+IFYxOyB9CitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oaW50NjRfdCBWMSwgY29uc3QgQVBTSW50ICZWMikgeyByZXR1cm4gVjIgPCBWMTsgfQorCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBBUFNJbnQgJkkpIHsKKyAgSS5wcmludChPUywgSS5pc1NpZ25lZCgpKTsKKyAgcmV0dXJuIE9TOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0FsbG9jYXRvckxpc3QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0FsbG9jYXRvckxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzhjNjc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQWxsb2NhdG9yTGlzdC5oCkBAIC0wLDAgKzEsMjQxIEBACisvLz09PS0gbGx2bS9BRFQvQWxsb2NhdG9yTGlzdC5oIC0gQ3VzdG9tIGFsbG9jYXRvciBsaXN0IC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0FMTE9DQVRPUkxJU1RfSAorI2RlZmluZSBMTFZNX0FEVF9BTExPQ0FUT1JMSVNUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL3NpbXBsZV9pbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEEgbGlua2VkLWxpc3Qgd2l0aCBhIGN1c3RvbSwgbG9jYWwgYWxsb2NhdG9yLgorLy8vCisvLy8gRXhwb3NlIGEgc3RkOjpsaXN0LWxpa2UgaW50ZXJmYWNlIHRoYXQgb3ducyBhbmQgdXNlcyBhIGN1c3RvbSBMTFZNLXN0eWxlCisvLy8gYWxsb2NhdG9yIChlLmcuLCBCdW1wUHRyQWxsb2NhdG9yKSwgbGV2ZXJhZ2luZyBcYSBzaW1wbGVfaWxpc3QgZm9yIHRoZQorLy8vIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCisvLy8KKy8vLyBCZWNhdXNlIHRoaXMgbGlzdCBvd25zIHRoZSBhbGxvY2F0b3IsIGNhbGxpbmcgXGEgc3BsaWNlKCkgd2l0aCBhIGRpZmZlcmVudAorLy8vIGxpc3QgaXNuJ3QgZ2VuZXJhbGx5IHNhZmUuICBBcyBzdWNoLCBcYSBzcGxpY2UgaGFzIGJlZW4gbGVmdCBvdXQgb2YgdGhlCisvLy8gaW50ZXJmYWNlIGVudGlyZWx5LgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEFsbG9jYXRvclQ+IGNsYXNzIEFsbG9jYXRvckxpc3QgOiBBbGxvY2F0b3JUIHsKKyAgc3RydWN0IE5vZGUgOiBpbGlzdF9ub2RlPE5vZGU+IHsKKyAgICBOb2RlKE5vZGUgJiYpID0gZGVsZXRlOworICAgIE5vZGUoY29uc3QgTm9kZSAmKSA9IGRlbGV0ZTsKKyAgICBOb2RlICZvcGVyYXRvcj0oTm9kZSAmJikgPSBkZWxldGU7CisgICAgTm9kZSAmb3BlcmF0b3I9KGNvbnN0IE5vZGUgJikgPSBkZWxldGU7CisKKyAgICBOb2RlKFQgJiZWKSA6IFYoc3RkOjptb3ZlKFYpKSB7fQorICAgIE5vZGUoY29uc3QgVCAmVikgOiBWKFYpIHt9CisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIFRzPiBOb2RlKFRzICYmLi4uIFZzKSA6IFYoc3RkOjpmb3J3YXJkPFRzPihWcykuLi4pIHt9CisgICAgVCBWOworICB9OworCisgIHVzaW5nIGxpc3RfdHlwZSA9IHNpbXBsZV9pbGlzdDxOb2RlPjsKKworICBsaXN0X3R5cGUgTGlzdDsKKworICBBbGxvY2F0b3JUICZnZXRBbGxvYygpIHsgcmV0dXJuICp0aGlzOyB9CisgIGNvbnN0IEFsbG9jYXRvclQgJmdldEFsbG9jKCkgY29uc3QgeyByZXR1cm4gKnRoaXM7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJnVHM+IE5vZGUgKmNyZWF0ZShBcmdUcyAmJi4uLiBBcmdzKSB7CisgICAgcmV0dXJuIG5ldyAoZ2V0QWxsb2MoKSkgTm9kZShzdGQ6OmZvcndhcmQ8QXJnVHM+KEFyZ3MpLi4uKTsKKyAgfQorCisgIHN0cnVjdCBDbG9uZXIgeworICAgIEFsbG9jYXRvckxpc3QgJkFMOworCisgICAgQ2xvbmVyKEFsbG9jYXRvckxpc3QgJkFMKSA6IEFMKEFMKSB7fQorCisgICAgTm9kZSAqb3BlcmF0b3IoKShjb25zdCBOb2RlICZOKSBjb25zdCB7IHJldHVybiBBTC5jcmVhdGUoTi5WKTsgfQorICB9OworCisgIHN0cnVjdCBEaXNwb3NlciB7CisgICAgQWxsb2NhdG9yTGlzdCAmQUw7CisKKyAgICBEaXNwb3NlcihBbGxvY2F0b3JMaXN0ICZBTCkgOiBBTChBTCkge30KKworICAgIHZvaWQgb3BlcmF0b3IoKShOb2RlICpOKSBjb25zdCB7CisgICAgICBOLT5+Tm9kZSgpOworICAgICAgQUwuZ2V0QWxsb2MoKS5EZWFsbG9jYXRlKE4pOworICAgIH0KKyAgfTsKKworcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0gVDsKKyAgdXNpbmcgcG9pbnRlciA9IFQgKjsKKyAgdXNpbmcgcmVmZXJlbmNlID0gVCAmOworICB1c2luZyBjb25zdF9wb2ludGVyID0gY29uc3QgVCAqOworICB1c2luZyBjb25zdF9yZWZlcmVuY2UgPSBjb25zdCBUICY7CisgIHVzaW5nIHNpemVfdHlwZSA9IHR5cGVuYW1lIGxpc3RfdHlwZTo6c2l6ZV90eXBlOworICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSB0eXBlbmFtZSBsaXN0X3R5cGU6OmRpZmZlcmVuY2VfdHlwZTsKKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIFZhbHVlVCwgY2xhc3MgSXRlcmF0b3JCYXNlPgorICBjbGFzcyBJdGVyYXRvckltcGwKKyAgICAgIDogcHVibGljIGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTxJdGVyYXRvckltcGw8VmFsdWVULCBJdGVyYXRvckJhc2U+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnLCBWYWx1ZVQ+IHsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgT3RoZXJWYWx1ZVQsIGNsYXNzIE90aGVySXRlcmF0b3JCYXNlPgorICAgIGZyaWVuZCBjbGFzcyBJdGVyYXRvckltcGw7CisgICAgZnJpZW5kIEFsbG9jYXRvckxpc3Q7CisKKyAgICB1c2luZyBiYXNlX3R5cGUgPQorICAgICAgICBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8SXRlcmF0b3JJbXBsPFZhbHVlVCwgSXRlcmF0b3JCYXNlPiwgSXRlcmF0b3JCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywgVmFsdWVUPjsKKworICBwdWJsaWM6CisgICAgdXNpbmcgdmFsdWVfdHlwZSA9IFZhbHVlVDsKKyAgICB1c2luZyBwb2ludGVyID0gVmFsdWVUICo7CisgICAgdXNpbmcgcmVmZXJlbmNlID0gVmFsdWVUICY7CisKKyAgICBJdGVyYXRvckltcGwoKSA9IGRlZmF1bHQ7CisgICAgSXRlcmF0b3JJbXBsKGNvbnN0IEl0ZXJhdG9ySW1wbCAmKSA9IGRlZmF1bHQ7CisgICAgSXRlcmF0b3JJbXBsICZvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3JJbXBsICYpID0gZGVmYXVsdDsKKworICAgIGV4cGxpY2l0IEl0ZXJhdG9ySW1wbChjb25zdCBJdGVyYXRvckJhc2UgJkkpIDogYmFzZV90eXBlKEkpIHt9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgT3RoZXJWYWx1ZVQsIGNsYXNzIE90aGVySXRlcmF0b3JCYXNlPgorICAgIEl0ZXJhdG9ySW1wbChjb25zdCBJdGVyYXRvckltcGw8T3RoZXJWYWx1ZVQsIE90aGVySXRlcmF0b3JCYXNlPiAmWCwKKyAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTwKKyAgICAgICAgICAgICAgICAgICAgIE90aGVySXRlcmF0b3JCYXNlLCBJdGVyYXRvckJhc2U+Ojp2YWx1ZT46OnR5cGUgKiA9IG51bGxwdHIpCisgICAgICAgIDogYmFzZV90eXBlKFgud3JhcHBlZCgpKSB7fQorCisgICAgfkl0ZXJhdG9ySW1wbCgpID0gZGVmYXVsdDsKKworICAgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBiYXNlX3R5cGU6OndyYXBwZWQoKS0+VjsgfQorICAgIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZvcGVyYXRvciooKTsgfQorCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJdGVyYXRvckltcGwgJkwsIGNvbnN0IEl0ZXJhdG9ySW1wbCAmUikgeworICAgICAgcmV0dXJuIEwud3JhcHBlZCgpID09IFIud3JhcHBlZCgpOworICAgIH0KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEl0ZXJhdG9ySW1wbCAmTCwgY29uc3QgSXRlcmF0b3JJbXBsICZSKSB7CisgICAgICByZXR1cm4gIShMID09IFIpOworICAgIH0KKyAgfTsKKworcHVibGljOgorICB1c2luZyBpdGVyYXRvciA9IEl0ZXJhdG9ySW1wbDxULCB0eXBlbmFtZSBsaXN0X3R5cGU6Oml0ZXJhdG9yPjsKKyAgdXNpbmcgcmV2ZXJzZV9pdGVyYXRvciA9CisgICAgICBJdGVyYXRvckltcGw8VCwgdHlwZW5hbWUgbGlzdF90eXBlOjpyZXZlcnNlX2l0ZXJhdG9yPjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPQorICAgICAgSXRlcmF0b3JJbXBsPGNvbnN0IFQsIHR5cGVuYW1lIGxpc3RfdHlwZTo6Y29uc3RfaXRlcmF0b3I+OworICB1c2luZyBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yID0KKyAgICAgIEl0ZXJhdG9ySW1wbDxjb25zdCBULCB0eXBlbmFtZSBsaXN0X3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3I+OworCisgIEFsbG9jYXRvckxpc3QoKSA9IGRlZmF1bHQ7CisgIEFsbG9jYXRvckxpc3QoQWxsb2NhdG9yTGlzdCAmJlgpCisgICAgICA6IEFsbG9jYXRvclQoc3RkOjptb3ZlKFguZ2V0QWxsb2MoKSkpLCBMaXN0KHN0ZDo6bW92ZShYLkxpc3QpKSB7fQorCisgIEFsbG9jYXRvckxpc3QoY29uc3QgQWxsb2NhdG9yTGlzdCAmWCkgeworICAgIExpc3QuY2xvbmVGcm9tKFguTGlzdCwgQ2xvbmVyKCp0aGlzKSwgRGlzcG9zZXIoKnRoaXMpKTsKKyAgfQorCisgIEFsbG9jYXRvckxpc3QgJm9wZXJhdG9yPShBbGxvY2F0b3JMaXN0ICYmWCkgeworICAgIGNsZWFyKCk7IC8vIERpc3Bvc2Ugb2YgY3VycmVudCBub2RlcyBleHBsaWNpdGx5LgorICAgIExpc3QgPSBzdGQ6Om1vdmUoWC5MaXN0KTsKKyAgICBnZXRBbGxvYygpID0gc3RkOjptb3ZlKFguZ2V0QWxsb2MoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQWxsb2NhdG9yTGlzdCAmb3BlcmF0b3I9KGNvbnN0IEFsbG9jYXRvckxpc3QgJlgpIHsKKyAgICBMaXN0LmNsb25lRnJvbShYLkxpc3QsIENsb25lcigqdGhpcyksIERpc3Bvc2VyKCp0aGlzKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgfkFsbG9jYXRvckxpc3QoKSB7IGNsZWFyKCk7IH0KKworICB2b2lkIHN3YXAoQWxsb2NhdG9yTGlzdCAmUkhTKSB7CisgICAgTGlzdC5zd2FwKFJIUy5MaXN0KTsKKyAgICBzdGQ6OnN3YXAoZ2V0QWxsb2MoKSwgUkhTLmdldEFsbG9jKCkpOworICB9CisKKyAgYm9vbCBlbXB0eSgpIHsgcmV0dXJuIExpc3QuZW1wdHkoKTsgfQorICBzaXplX3Qgc2l6ZSgpIHsgcmV0dXJuIExpc3Quc2l6ZSgpOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBpdGVyYXRvcihMaXN0LmJlZ2luKCkpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGl0ZXJhdG9yKExpc3QuZW5kKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoTGlzdC5iZWdpbigpKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihMaXN0LmVuZCgpKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoTGlzdC5yYmVnaW4oKSk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihMaXN0LnJlbmQoKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoTGlzdC5yYmVnaW4oKSk7CisgIH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKExpc3QucmVuZCgpKTsKKyAgfQorCisgIFQgJmJhY2soKSB7IHJldHVybiBMaXN0LmJhY2soKS5WOyB9CisgIFQgJmZyb250KCkgeyByZXR1cm4gTGlzdC5mcm9udCgpLlY7IH0KKyAgY29uc3QgVCAmYmFjaygpIGNvbnN0IHsgcmV0dXJuIExpc3QuYmFjaygpLlY7IH0KKyAgY29uc3QgVCAmZnJvbnQoKSBjb25zdCB7IHJldHVybiBMaXN0LmZyb250KCkuVjsgfQorCisgIHRlbXBsYXRlIDxjbGFzcy4uLiBUcz4gaXRlcmF0b3IgZW1wbGFjZShpdGVyYXRvciBJLCBUcyAmJi4uLiBWcykgeworICAgIHJldHVybiBpdGVyYXRvcihMaXN0Lmluc2VydChJLndyYXBwZWQoKSwgKmNyZWF0ZShzdGQ6OmZvcndhcmQ8VHM+KFZzKS4uLikpKTsKKyAgfQorCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBJLCBUICYmVikgeworICAgIHJldHVybiBpdGVyYXRvcihMaXN0Lmluc2VydChJLndyYXBwZWQoKSwgKmNyZWF0ZShzdGQ6Om1vdmUoVikpKSk7CisgIH0KKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIEksIGNvbnN0IFQgJlYpIHsKKyAgICByZXR1cm4gaXRlcmF0b3IoTGlzdC5pbnNlcnQoSS53cmFwcGVkKCksICpjcmVhdGUoVikpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgSSwgSXRlcmF0b3IgRmlyc3QsIEl0ZXJhdG9yIExhc3QpIHsKKyAgICBmb3IgKDsgRmlyc3QgIT0gTGFzdDsgKytGaXJzdCkKKyAgICAgIExpc3QuaW5zZXJ0KEkud3JhcHBlZCgpLCAqY3JlYXRlKCpGaXJzdCkpOworICB9CisKKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgSSkgeworICAgIHJldHVybiBpdGVyYXRvcihMaXN0LmVyYXNlQW5kRGlzcG9zZShJLndyYXBwZWQoKSwgRGlzcG9zZXIoKnRoaXMpKSk7CisgIH0KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBGaXJzdCwgaXRlcmF0b3IgTGFzdCkgeworICAgIHJldHVybiBpdGVyYXRvcigKKyAgICAgICAgTGlzdC5lcmFzZUFuZERpc3Bvc2UoRmlyc3Qud3JhcHBlZCgpLCBMYXN0LndyYXBwZWQoKSwgRGlzcG9zZXIoKnRoaXMpKSk7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeyBMaXN0LmNsZWFyQW5kRGlzcG9zZShEaXNwb3NlcigqdGhpcykpOyB9CisgIHZvaWQgcG9wX2JhY2soKSB7IExpc3QuZXJhc2VBbmREaXNwb3NlKC0tTGlzdC5lbmQoKSwgRGlzcG9zZXIoKnRoaXMpKTsgfQorICB2b2lkIHBvcF9mcm9udCgpIHsgTGlzdC5lcmFzZUFuZERpc3Bvc2UoTGlzdC5iZWdpbigpLCBEaXNwb3NlcigqdGhpcykpOyB9CisgIHZvaWQgcHVzaF9iYWNrKFQgJiZWKSB7IGluc2VydChlbmQoKSwgc3RkOjptb3ZlKFYpKTsgfQorICB2b2lkIHB1c2hfZnJvbnQoVCAmJlYpIHsgaW5zZXJ0KGJlZ2luKCksIHN0ZDo6bW92ZShWKSk7IH0KKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgVCAmVikgeyBpbnNlcnQoZW5kKCksIFYpOyB9CisgIHZvaWQgcHVzaF9mcm9udChjb25zdCBUICZWKSB7IGluc2VydChiZWdpbigpLCBWKTsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gVHM+IHZvaWQgZW1wbGFjZV9iYWNrKFRzICYmLi4uIFZzKSB7CisgICAgZW1wbGFjZShlbmQoKSwgc3RkOjpmb3J3YXJkPFRzPihWcykuLi4pOworICB9CisgIHRlbXBsYXRlIDxjbGFzcy4uLiBUcz4gdm9pZCBlbXBsYWNlX2Zyb250KFRzICYmLi4uIFZzKSB7CisgICAgZW1wbGFjZShiZWdpbigpLCBzdGQ6OmZvcndhcmQ8VHM+KFZzKS4uLik7CisgIH0KKworICAvLy8gUmVzZXQgdGhlIHVuZGVybHlpbmcgYWxsb2NhdG9yLgorICAvLy8KKyAgLy8vIFxwcmUgXGMgZW1wdHkoKQorICB2b2lkIHJlc2V0QWxsb2MoKSB7CisgICAgYXNzZXJ0KGVtcHR5KCkgJiYgIkNhbm5vdCByZXNldCBhbGxvY2F0b3IgaWYgbm90IGVtcHR5Iik7CisgICAgZ2V0QWxsb2MoKS5SZXNldCgpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gdXNpbmcgQnVtcFB0ckxpc3QgPSBBbGxvY2F0b3JMaXN0PFQsIEJ1bXBQdHJBbGxvY2F0b3I+OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfQUxMT0NBVE9STElTVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9BcnJheVJlZi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQXJyYXlSZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjdhNzY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQXJyYXlSZWYuaApAQCAtMCwwICsxLDU0MSBAQAorLy89PT0tIEFycmF5UmVmLmggLSBBcnJheSBSZWZlcmVuY2UgV3JhcHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9BUlJBWVJFRl9ICisjZGVmaW5lIExMVk1fQURUX0FSUkFZUkVGX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0hhc2hpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisgIC8vLyBBcnJheVJlZiAtIFJlcHJlc2VudCBhIGNvbnN0YW50IHJlZmVyZW5jZSB0byBhbiBhcnJheSAoMCBvciBtb3JlIGVsZW1lbnRzCisgIC8vLyBjb25zZWN1dGl2ZWx5IGluIG1lbW9yeSksIGkuZS4gYSBzdGFydCBwb2ludGVyIGFuZCBhIGxlbmd0aC4gIEl0IGFsbG93cworICAvLy8gdmFyaW91cyBBUElzIHRvIHRha2UgY29uc2VjdXRpdmUgZWxlbWVudHMgZWFzaWx5IGFuZCBjb252ZW5pZW50bHkuCisgIC8vLworICAvLy8gVGhpcyBjbGFzcyBkb2VzIG5vdCBvd24gdGhlIHVuZGVybHlpbmcgZGF0YSwgaXQgaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBpbgorICAvLy8gc2l0dWF0aW9ucyB3aGVyZSB0aGUgZGF0YSByZXNpZGVzIGluIHNvbWUgb3RoZXIgYnVmZmVyLCB3aG9zZSBsaWZldGltZQorICAvLy8gZXh0ZW5kcyBwYXN0IHRoYXQgb2YgdGhlIEFycmF5UmVmLiBGb3IgdGhpcyByZWFzb24sIGl0IGlzIG5vdCBpbiBnZW5lcmFsCisgIC8vLyBzYWZlIHRvIHN0b3JlIGFuIEFycmF5UmVmLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdHJpdmlhbGx5IGNvcHlhYmxlLCBzbyBpdCBzaG91bGQgYmUgcGFzc2VkIGJ5CisgIC8vLyB2YWx1ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgY2xhc3MgTExWTV9OT0RJU0NBUkQgQXJyYXlSZWYgeworICBwdWJsaWM6CisgICAgdXNpbmcgaXRlcmF0b3IgPSBjb25zdCBUICo7CisgICAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBjb25zdCBUICo7CisgICAgdXNpbmcgc2l6ZV90eXBlID0gc2l6ZV90OworICAgIHVzaW5nIHJldmVyc2VfaXRlcmF0b3IgPSBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+OworCisgIHByaXZhdGU6CisgICAgLy8vIFRoZSBzdGFydCBvZiB0aGUgYXJyYXksIGluIGFuIGV4dGVybmFsIGJ1ZmZlci4KKyAgICBjb25zdCBUICpEYXRhID0gbnVsbHB0cjsKKworICAgIC8vLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgIHNpemVfdHlwZSBMZW5ndGggPSAwOworCisgIHB1YmxpYzoKKyAgICAvLy8gQG5hbWUgQ29uc3RydWN0b3JzCisgICAgLy8vIEB7CisKKyAgICAvLy8gQ29uc3RydWN0IGFuIGVtcHR5IEFycmF5UmVmLgorICAgIC8qaW1wbGljaXQqLyBBcnJheVJlZigpID0gZGVmYXVsdDsKKworICAgIC8vLyBDb25zdHJ1Y3QgYW4gZW1wdHkgQXJyYXlSZWYgZnJvbSBOb25lLgorICAgIC8qaW1wbGljaXQqLyBBcnJheVJlZihOb25lVHlwZSkge30KKworICAgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIHNpbmdsZSBlbGVtZW50LgorICAgIC8qaW1wbGljaXQqLyBBcnJheVJlZihjb25zdCBUICZPbmVFbHQpCisgICAgICA6IERhdGEoJk9uZUVsdCksIExlbmd0aCgxKSB7fQorCisgICAgLy8vIENvbnN0cnVjdCBhbiBBcnJheVJlZiBmcm9tIGEgcG9pbnRlciBhbmQgbGVuZ3RoLgorICAgIC8qaW1wbGljaXQqLyBBcnJheVJlZihjb25zdCBUICpkYXRhLCBzaXplX3QgbGVuZ3RoKQorICAgICAgOiBEYXRhKGRhdGEpLCBMZW5ndGgobGVuZ3RoKSB7fQorCisgICAgLy8vIENvbnN0cnVjdCBhbiBBcnJheVJlZiBmcm9tIGEgcmFuZ2UuCisgICAgQXJyYXlSZWYoY29uc3QgVCAqYmVnaW4sIGNvbnN0IFQgKmVuZCkKKyAgICAgIDogRGF0YShiZWdpbiksIExlbmd0aChlbmQgLSBiZWdpbikge30KKworICAgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIFNtYWxsVmVjdG9yLiBUaGlzIGlzIHRlbXBsYXRlZCBpbiBvcmRlciB0bworICAgIC8vLyBhdm9pZCBpbnN0YW50aWF0aW5nIFNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248VD4gd2hlbmV2ZXIgd2UKKyAgICAvLy8gY29weS1jb25zdHJ1Y3QgYW4gQXJyYXlSZWYuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KKyAgICAvKmltcGxpY2l0Ki8gQXJyYXlSZWYoY29uc3QgU21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxULCBVPiAmVmVjKQorICAgICAgOiBEYXRhKFZlYy5kYXRhKCkpLCBMZW5ndGgoVmVjLnNpemUoKSkgeworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIHN0ZDo6dmVjdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEE+CisgICAgLyppbXBsaWNpdCovIEFycmF5UmVmKGNvbnN0IHN0ZDo6dmVjdG9yPFQsIEE+ICZWZWMpCisgICAgICA6IERhdGEoVmVjLmRhdGEoKSksIExlbmd0aChWZWMuc2l6ZSgpKSB7fQorCisgICAgLy8vIENvbnN0cnVjdCBhbiBBcnJheVJlZiBmcm9tIGEgc3RkOjphcnJheQorICAgIHRlbXBsYXRlIDxzaXplX3QgTj4KKyAgICAvKmltcGxpY2l0Ki8gY29uc3RleHByIEFycmF5UmVmKGNvbnN0IHN0ZDo6YXJyYXk8VCwgTj4gJkFycikKKyAgICAgICAgOiBEYXRhKEFyci5kYXRhKCkpLCBMZW5ndGgoTikge30KKworICAgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIEMgYXJyYXkuCisgICAgdGVtcGxhdGUgPHNpemVfdCBOPgorICAgIC8qaW1wbGljaXQqLyBjb25zdGV4cHIgQXJyYXlSZWYoY29uc3QgVCAoJkFycilbTl0pIDogRGF0YShBcnIpLCBMZW5ndGgoTikge30KKworICAgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAvKmltcGxpY2l0Ki8gQXJyYXlSZWYoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+ICZWZWMpCisgICAgOiBEYXRhKFZlYy5iZWdpbigpID09IFZlYy5lbmQoKSA/IChUKiludWxscHRyIDogVmVjLmJlZ2luKCkpLAorICAgICAgTGVuZ3RoKFZlYy5zaXplKCkpIHt9CisKKyAgICAvLy8gQ29uc3RydWN0IGFuIEFycmF5UmVmPGNvbnN0IFQqPiBmcm9tIEFycmF5UmVmPFQqPi4gVGhpcyB1c2VzIFNGSU5BRSB0bworICAgIC8vLyBlbnN1cmUgdGhhdCBvbmx5IEFycmF5UmVmcyBvZiBwb2ludGVycyBjYW4gYmUgY29udmVydGVkLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICAgIEFycmF5UmVmKAorICAgICAgICBjb25zdCBBcnJheVJlZjxVICo+ICZBLAorICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgc3RkOjppc19jb252ZXJ0aWJsZTxVICpjb25zdCAqLCBUIGNvbnN0ICo+Ojp2YWx1ZT46OnR5cGUgKiA9IG51bGxwdHIpCisgICAgICA6IERhdGEoQS5kYXRhKCkpLCBMZW5ndGgoQS5zaXplKCkpIHt9CisKKyAgICAvLy8gQ29uc3RydWN0IGFuIEFycmF5UmVmPGNvbnN0IFQqPiBmcm9tIGEgU21hbGxWZWN0b3I8VCo+LiBUaGlzIGlzCisgICAgLy8vIHRlbXBsYXRlZCBpbiBvcmRlciB0byBhdm9pZCBpbnN0YW50aWF0aW5nIFNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248VD4KKyAgICAvLy8gd2hlbmV2ZXIgd2UgY29weS1jb25zdHJ1Y3QgYW4gQXJyYXlSZWYuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRHVtbXlUPgorICAgIC8qaW1wbGljaXQqLyBBcnJheVJlZigKKyAgICAgIGNvbnN0IFNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248VSAqLCBEdW1teVQ+ICZWZWMsCisgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICBzdGQ6OmlzX2NvbnZlcnRpYmxlPFUgKmNvbnN0ICosIFQgY29uc3QgKj46OnZhbHVlPjo6dHlwZSAqID0gbnVsbHB0cikKKyAgICAgIDogRGF0YShWZWMuZGF0YSgpKSwgTGVuZ3RoKFZlYy5zaXplKCkpIHsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGFuIEFycmF5UmVmPGNvbnN0IFQqPiBmcm9tIHN0ZDo6dmVjdG9yPFQqPi4gVGhpcyB1c2VzIFNGSU5BRQorICAgIC8vLyB0byBlbnN1cmUgdGhhdCBvbmx5IHZlY3RvcnMgb2YgcG9pbnRlcnMgY2FuIGJlIGNvbnZlcnRlZC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBBPgorICAgIEFycmF5UmVmKGNvbnN0IHN0ZDo6dmVjdG9yPFUgKiwgQT4gJlZlYywKKyAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgc3RkOjppc19jb252ZXJ0aWJsZTxVICpjb25zdCAqLCBUIGNvbnN0ICo+Ojp2YWx1ZT46OnR5cGUqID0gMCkKKyAgICAgIDogRGF0YShWZWMuZGF0YSgpKSwgTGVuZ3RoKFZlYy5zaXplKCkpIHt9CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgU2ltcGxlIE9wZXJhdGlvbnMKKyAgICAvLy8gQHsKKworICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIERhdGEgKyBMZW5ndGg7IH0KKworICAgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAvLy8gZW1wdHkgLSBDaGVjayBpZiB0aGUgYXJyYXkgaXMgZW1wdHkuCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIExlbmd0aCA9PSAwOyB9CisKKyAgICBjb25zdCBUICpkYXRhKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorCisgICAgLy8vIHNpemUgLSBHZXQgdGhlIGFycmF5IHNpemUuCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBMZW5ndGg7IH0KKworICAgIC8vLyBmcm9udCAtIEdldCB0aGUgZmlyc3QgZWxlbWVudC4KKyAgICBjb25zdCBUICZmcm9udCgpIGNvbnN0IHsKKyAgICAgIGFzc2VydCghZW1wdHkoKSk7CisgICAgICByZXR1cm4gRGF0YVswXTsKKyAgICB9CisKKyAgICAvLy8gYmFjayAtIEdldCB0aGUgbGFzdCBlbGVtZW50LgorICAgIGNvbnN0IFQgJmJhY2soKSBjb25zdCB7CisgICAgICBhc3NlcnQoIWVtcHR5KCkpOworICAgICAgcmV0dXJuIERhdGFbTGVuZ3RoLTFdOworICAgIH0KKworICAgIC8vIGNvcHkgLSBBbGxvY2F0ZSBjb3B5IGluIEFsbG9jYXRvciBhbmQgcmV0dXJuIEFycmF5UmVmPFQ+IHRvIGl0LgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBBbGxvY2F0b3I+IEFycmF5UmVmPFQ+IGNvcHkoQWxsb2NhdG9yICZBKSB7CisgICAgICBUICpCdWZmID0gQS50ZW1wbGF0ZSBBbGxvY2F0ZTxUPihMZW5ndGgpOworICAgICAgc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoYmVnaW4oKSwgZW5kKCksIEJ1ZmYpOworICAgICAgcmV0dXJuIEFycmF5UmVmPFQ+KEJ1ZmYsIExlbmd0aCk7CisgICAgfQorCisgICAgLy8vIGVxdWFscyAtIENoZWNrIGZvciBlbGVtZW50LXdpc2UgZXF1YWxpdHkuCisgICAgYm9vbCBlcXVhbHMoQXJyYXlSZWYgUkhTKSBjb25zdCB7CisgICAgICBpZiAoTGVuZ3RoICE9IFJIUy5MZW5ndGgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiBzdGQ6OmVxdWFsKGJlZ2luKCksIGVuZCgpLCBSSFMuYmVnaW4oKSk7CisgICAgfQorCisgICAgLy8vIHNsaWNlKG4sIG0pIC0gQ2hvcCBvZmYgdGhlIGZpcnN0IE4gZWxlbWVudHMgb2YgdGhlIGFycmF5LCBhbmQga2VlcCBNCisgICAgLy8vIGVsZW1lbnRzIGluIHRoZSBhcnJheS4KKyAgICBBcnJheVJlZjxUPiBzbGljZShzaXplX3QgTiwgc2l6ZV90IE0pIGNvbnN0IHsKKyAgICAgIGFzc2VydChOK00gPD0gc2l6ZSgpICYmICJJbnZhbGlkIHNwZWNpZmllciIpOworICAgICAgcmV0dXJuIEFycmF5UmVmPFQ+KGRhdGEoKStOLCBNKTsKKyAgICB9CisKKyAgICAvLy8gc2xpY2UobikgLSBDaG9wIG9mZiB0aGUgZmlyc3QgTiBlbGVtZW50cyBvZiB0aGUgYXJyYXkuCisgICAgQXJyYXlSZWY8VD4gc2xpY2Uoc2l6ZV90IE4pIGNvbnN0IHsgcmV0dXJuIHNsaWNlKE4sIHNpemUoKSAtIE4pOyB9CisKKyAgICAvLy8gXGJyaWVmIERyb3AgdGhlIGZpcnN0IFxwIE4gZWxlbWVudHMgb2YgdGhlIGFycmF5LgorICAgIEFycmF5UmVmPFQ+IGRyb3BfZnJvbnQoc2l6ZV90IE4gPSAxKSBjb25zdCB7CisgICAgICBhc3NlcnQoc2l6ZSgpID49IE4gJiYgIkRyb3BwaW5nIG1vcmUgZWxlbWVudHMgdGhhbiBleGlzdCIpOworICAgICAgcmV0dXJuIHNsaWNlKE4sIHNpemUoKSAtIE4pOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgRHJvcCB0aGUgbGFzdCBccCBOIGVsZW1lbnRzIG9mIHRoZSBhcnJheS4KKyAgICBBcnJheVJlZjxUPiBkcm9wX2JhY2soc2l6ZV90IE4gPSAxKSBjb25zdCB7CisgICAgICBhc3NlcnQoc2l6ZSgpID49IE4gJiYgIkRyb3BwaW5nIG1vcmUgZWxlbWVudHMgdGhhbiBleGlzdCIpOworICAgICAgcmV0dXJuIHNsaWNlKDAsIHNpemUoKSAtIE4pOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIGEgY29weSBvZiAqdGhpcyB3aXRoIHRoZSBmaXJzdCBOIGVsZW1lbnRzIHNhdGlzZnlpbmcgdGhlCisgICAgLy8vIGdpdmVuIHByZWRpY2F0ZSByZW1vdmVkLgorICAgIHRlbXBsYXRlIDxjbGFzcyBQcmVkaWNhdGVUPiBBcnJheVJlZjxUPiBkcm9wX3doaWxlKFByZWRpY2F0ZVQgUHJlZCkgY29uc3QgeworICAgICAgcmV0dXJuIEFycmF5UmVmPFQ+KGZpbmRfaWZfbm90KCp0aGlzLCBQcmVkKSwgZW5kKCkpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIGEgY29weSBvZiAqdGhpcyB3aXRoIHRoZSBmaXJzdCBOIGVsZW1lbnRzIG5vdCBzYXRpc2Z5aW5nCisgICAgLy8vIHRoZSBnaXZlbiBwcmVkaWNhdGUgcmVtb3ZlZC4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUHJlZGljYXRlVD4gQXJyYXlSZWY8VD4gZHJvcF91bnRpbChQcmVkaWNhdGVUIFByZWQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBBcnJheVJlZjxUPihmaW5kX2lmKCp0aGlzLCBQcmVkKSwgZW5kKCkpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIGEgY29weSBvZiAqdGhpcyB3aXRoIG9ubHkgdGhlIGZpcnN0IFxwIE4gZWxlbWVudHMuCisgICAgQXJyYXlSZWY8VD4gdGFrZV9mcm9udChzaXplX3QgTiA9IDEpIGNvbnN0IHsKKyAgICAgIGlmIChOID49IHNpemUoKSkKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgcmV0dXJuIGRyb3BfYmFjayhzaXplKCkgLSBOKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJldHVybiBhIGNvcHkgb2YgKnRoaXMgd2l0aCBvbmx5IHRoZSBsYXN0IFxwIE4gZWxlbWVudHMuCisgICAgQXJyYXlSZWY8VD4gdGFrZV9iYWNrKHNpemVfdCBOID0gMSkgY29uc3QgeworICAgICAgaWYgKE4gPj0gc2l6ZSgpKQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICByZXR1cm4gZHJvcF9mcm9udChzaXplKCkgLSBOKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZmlyc3QgTiBlbGVtZW50cyBvZiB0aGlzIEFycmF5IHRoYXQgc2F0aXNmeSB0aGUgZ2l2ZW4KKyAgICAvLy8gcHJlZGljYXRlLgorICAgIHRlbXBsYXRlIDxjbGFzcyBQcmVkaWNhdGVUPiBBcnJheVJlZjxUPiB0YWtlX3doaWxlKFByZWRpY2F0ZVQgUHJlZCkgY29uc3QgeworICAgICAgcmV0dXJuIEFycmF5UmVmPFQ+KGJlZ2luKCksIGZpbmRfaWZfbm90KCp0aGlzLCBQcmVkKSk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGZpcnN0IE4gZWxlbWVudHMgb2YgdGhpcyBBcnJheSB0aGF0IGRvbid0IHNhdGlzZnkgdGhlCisgICAgLy8vIGdpdmVuIHByZWRpY2F0ZS4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUHJlZGljYXRlVD4gQXJyYXlSZWY8VD4gdGFrZV91bnRpbChQcmVkaWNhdGVUIFByZWQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBBcnJheVJlZjxUPihiZWdpbigpLCBmaW5kX2lmKCp0aGlzLCBQcmVkKSk7CisgICAgfQorCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIE9wZXJhdG9yIE92ZXJsb2FkcworICAgIC8vLyBAeworICAgIGNvbnN0IFQgJm9wZXJhdG9yW10oc2l6ZV90IEluZGV4KSBjb25zdCB7CisgICAgICBhc3NlcnQoSW5kZXggPCBMZW5ndGggJiYgIkludmFsaWQgaW5kZXghIik7CisgICAgICByZXR1cm4gRGF0YVtJbmRleF07CisgICAgfQorCisgICAgLy8vIERpc2FsbG93IGFjY2lkZW50YWwgYXNzaWdubWVudCBmcm9tIGEgdGVtcG9yYXJ5LgorICAgIC8vLworICAgIC8vLyBUaGUgZGVjbGFyYXRpb24gaGVyZSBpcyBleHRyYSBjb21wbGljYXRlZCBzbyB0aGF0ICJhcnJheVJlZiA9IHt9IgorICAgIC8vLyBjb250aW51ZXMgdG8gc2VsZWN0IHRoZSBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19zYW1lPFUsIFQ+Ojp2YWx1ZSwgQXJyYXlSZWY8VD4+Ojp0eXBlICYKKyAgICBvcGVyYXRvcj0oVSAmJlRlbXBvcmFyeSkgPSBkZWxldGU7CisKKyAgICAvLy8gRGlzYWxsb3cgYWNjaWRlbnRhbCBhc3NpZ25tZW50IGZyb20gYSB0ZW1wb3JhcnkuCisgICAgLy8vCisgICAgLy8vIFRoZSBkZWNsYXJhdGlvbiBoZXJlIGlzIGV4dHJhIGNvbXBsaWNhdGVkIHNvIHRoYXQgImFycmF5UmVmID0ge30iCisgICAgLy8vIGNvbnRpbnVlcyB0byBzZWxlY3QgdGhlIG1vdmUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8VSwgVD46OnZhbHVlLCBBcnJheVJlZjxUPj46OnR5cGUgJgorICAgIG9wZXJhdG9yPShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VT4pID0gZGVsZXRlOworCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIEV4cGVuc2l2ZSBPcGVyYXRpb25zCisgICAgLy8vIEB7CisgICAgc3RkOjp2ZWN0b3I8VD4gdmVjKCkgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPFQ+KERhdGEsIERhdGErTGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgQ29udmVyc2lvbiBvcGVyYXRvcnMKKyAgICAvLy8gQHsKKyAgICBvcGVyYXRvciBzdGQ6OnZlY3RvcjxUPigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGQ6OnZlY3RvcjxUPihEYXRhLCBEYXRhK0xlbmd0aCk7CisgICAgfQorCisgICAgLy8vIEB9CisgIH07CisKKyAgLy8vIE11dGFibGVBcnJheVJlZiAtIFJlcHJlc2VudCBhIG11dGFibGUgcmVmZXJlbmNlIHRvIGFuIGFycmF5ICgwIG9yIG1vcmUKKyAgLy8vIGVsZW1lbnRzIGNvbnNlY3V0aXZlbHkgaW4gbWVtb3J5KSwgaS5lLiBhIHN0YXJ0IHBvaW50ZXIgYW5kIGEgbGVuZ3RoLiAgSXQKKyAgLy8vIGFsbG93cyB2YXJpb3VzIEFQSXMgdG8gdGFrZSBhbmQgbW9kaWZ5IGNvbnNlY3V0aXZlIGVsZW1lbnRzIGVhc2lseSBhbmQKKyAgLy8vIGNvbnZlbmllbnRseS4KKyAgLy8vCisgIC8vLyBUaGlzIGNsYXNzIGRvZXMgbm90IG93biB0aGUgdW5kZXJseWluZyBkYXRhLCBpdCBpcyBleHBlY3RlZCB0byBiZSB1c2VkIGluCisgIC8vLyBzaXR1YXRpb25zIHdoZXJlIHRoZSBkYXRhIHJlc2lkZXMgaW4gc29tZSBvdGhlciBidWZmZXIsIHdob3NlIGxpZmV0aW1lCisgIC8vLyBleHRlbmRzIHBhc3QgdGhhdCBvZiB0aGUgTXV0YWJsZUFycmF5UmVmLiBGb3IgdGhpcyByZWFzb24sIGl0IGlzIG5vdCBpbgorICAvLy8gZ2VuZXJhbCBzYWZlIHRvIHN0b3JlIGEgTXV0YWJsZUFycmF5UmVmLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdHJpdmlhbGx5IGNvcHlhYmxlLCBzbyBpdCBzaG91bGQgYmUgcGFzc2VkIGJ5CisgIC8vLyB2YWx1ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgY2xhc3MgTExWTV9OT0RJU0NBUkQgTXV0YWJsZUFycmF5UmVmIDogcHVibGljIEFycmF5UmVmPFQ+IHsKKyAgcHVibGljOgorICAgIHVzaW5nIGl0ZXJhdG9yID0gVCAqOworICAgIHVzaW5nIHJldmVyc2VfaXRlcmF0b3IgPSBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+OworCisgICAgLy8vIENvbnN0cnVjdCBhbiBlbXB0eSBNdXRhYmxlQXJyYXlSZWYuCisgICAgLyppbXBsaWNpdCovIE11dGFibGVBcnJheVJlZigpID0gZGVmYXVsdDsKKworICAgIC8vLyBDb25zdHJ1Y3QgYW4gZW1wdHkgTXV0YWJsZUFycmF5UmVmIGZyb20gTm9uZS4KKyAgICAvKmltcGxpY2l0Ki8gTXV0YWJsZUFycmF5UmVmKE5vbmVUeXBlKSA6IEFycmF5UmVmPFQ+KCkge30KKworICAgIC8vLyBDb25zdHJ1Y3QgYW4gTXV0YWJsZUFycmF5UmVmIGZyb20gYSBzaW5nbGUgZWxlbWVudC4KKyAgICAvKmltcGxpY2l0Ki8gTXV0YWJsZUFycmF5UmVmKFQgJk9uZUVsdCkgOiBBcnJheVJlZjxUPihPbmVFbHQpIHt9CisKKyAgICAvLy8gQ29uc3RydWN0IGFuIE11dGFibGVBcnJheVJlZiBmcm9tIGEgcG9pbnRlciBhbmQgbGVuZ3RoLgorICAgIC8qaW1wbGljaXQqLyBNdXRhYmxlQXJyYXlSZWYoVCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKKyAgICAgIDogQXJyYXlSZWY8VD4oZGF0YSwgbGVuZ3RoKSB7fQorCisgICAgLy8vIENvbnN0cnVjdCBhbiBNdXRhYmxlQXJyYXlSZWYgZnJvbSBhIHJhbmdlLgorICAgIE11dGFibGVBcnJheVJlZihUICpiZWdpbiwgVCAqZW5kKSA6IEFycmF5UmVmPFQ+KGJlZ2luLCBlbmQpIHt9CisKKyAgICAvLy8gQ29uc3RydWN0IGFuIE11dGFibGVBcnJheVJlZiBmcm9tIGEgU21hbGxWZWN0b3IuCisgICAgLyppbXBsaWNpdCovIE11dGFibGVBcnJheVJlZihTbWFsbFZlY3RvckltcGw8VD4gJlZlYykKKyAgICA6IEFycmF5UmVmPFQ+KFZlYykge30KKworICAgIC8vLyBDb25zdHJ1Y3QgYSBNdXRhYmxlQXJyYXlSZWYgZnJvbSBhIHN0ZDo6dmVjdG9yLgorICAgIC8qaW1wbGljaXQqLyBNdXRhYmxlQXJyYXlSZWYoc3RkOjp2ZWN0b3I8VD4gJlZlYykKKyAgICA6IEFycmF5UmVmPFQ+KFZlYykge30KKworICAgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIHN0ZDo6YXJyYXkKKyAgICB0ZW1wbGF0ZSA8c2l6ZV90IE4+CisgICAgLyppbXBsaWNpdCovIGNvbnN0ZXhwciBNdXRhYmxlQXJyYXlSZWYoc3RkOjphcnJheTxULCBOPiAmQXJyKQorICAgICAgICA6IEFycmF5UmVmPFQ+KEFycikge30KKworICAgIC8vLyBDb25zdHJ1Y3QgYW4gTXV0YWJsZUFycmF5UmVmIGZyb20gYSBDIGFycmF5LgorICAgIHRlbXBsYXRlIDxzaXplX3QgTj4KKyAgICAvKmltcGxpY2l0Ki8gY29uc3RleHByIE11dGFibGVBcnJheVJlZihUICgmQXJyKVtOXSkgOiBBcnJheVJlZjxUPihBcnIpIHt9CisKKyAgICBUICpkYXRhKCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxUKj4oQXJyYXlSZWY8VD46OmRhdGEoKSk7IH0KKworICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gZGF0YSgpOyB9CisgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gZGF0YSgpICsgdGhpcy0+c2l6ZSgpOyB9CisKKyAgICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgICAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgLy8vIGZyb250IC0gR2V0IHRoZSBmaXJzdCBlbGVtZW50LgorICAgIFQgJmZyb250KCkgY29uc3QgeworICAgICAgYXNzZXJ0KCF0aGlzLT5lbXB0eSgpKTsKKyAgICAgIHJldHVybiBkYXRhKClbMF07CisgICAgfQorCisgICAgLy8vIGJhY2sgLSBHZXQgdGhlIGxhc3QgZWxlbWVudC4KKyAgICBUICZiYWNrKCkgY29uc3QgeworICAgICAgYXNzZXJ0KCF0aGlzLT5lbXB0eSgpKTsKKyAgICAgIHJldHVybiBkYXRhKClbdGhpcy0+c2l6ZSgpLTFdOworICAgIH0KKworICAgIC8vLyBzbGljZShuLCBtKSAtIENob3Agb2ZmIHRoZSBmaXJzdCBOIGVsZW1lbnRzIG9mIHRoZSBhcnJheSwgYW5kIGtlZXAgTQorICAgIC8vLyBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCisgICAgTXV0YWJsZUFycmF5UmVmPFQ+IHNsaWNlKHNpemVfdCBOLCBzaXplX3QgTSkgY29uc3QgeworICAgICAgYXNzZXJ0KE4gKyBNIDw9IHRoaXMtPnNpemUoKSAmJiAiSW52YWxpZCBzcGVjaWZpZXIiKTsKKyAgICAgIHJldHVybiBNdXRhYmxlQXJyYXlSZWY8VD4odGhpcy0+ZGF0YSgpICsgTiwgTSk7CisgICAgfQorCisgICAgLy8vIHNsaWNlKG4pIC0gQ2hvcCBvZmYgdGhlIGZpcnN0IE4gZWxlbWVudHMgb2YgdGhlIGFycmF5LgorICAgIE11dGFibGVBcnJheVJlZjxUPiBzbGljZShzaXplX3QgTikgY29uc3QgeworICAgICAgcmV0dXJuIHNsaWNlKE4sIHRoaXMtPnNpemUoKSAtIE4pOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgRHJvcCB0aGUgZmlyc3QgXHAgTiBlbGVtZW50cyBvZiB0aGUgYXJyYXkuCisgICAgTXV0YWJsZUFycmF5UmVmPFQ+IGRyb3BfZnJvbnQoc2l6ZV90IE4gPSAxKSBjb25zdCB7CisgICAgICBhc3NlcnQodGhpcy0+c2l6ZSgpID49IE4gJiYgIkRyb3BwaW5nIG1vcmUgZWxlbWVudHMgdGhhbiBleGlzdCIpOworICAgICAgcmV0dXJuIHNsaWNlKE4sIHRoaXMtPnNpemUoKSAtIE4pOworICAgIH0KKworICAgIE11dGFibGVBcnJheVJlZjxUPiBkcm9wX2JhY2soc2l6ZV90IE4gPSAxKSBjb25zdCB7CisgICAgICBhc3NlcnQodGhpcy0+c2l6ZSgpID49IE4gJiYgIkRyb3BwaW5nIG1vcmUgZWxlbWVudHMgdGhhbiBleGlzdCIpOworICAgICAgcmV0dXJuIHNsaWNlKDAsIHRoaXMtPnNpemUoKSAtIE4pOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIGEgY29weSBvZiAqdGhpcyB3aXRoIHRoZSBmaXJzdCBOIGVsZW1lbnRzIHNhdGlzZnlpbmcgdGhlCisgICAgLy8vIGdpdmVuIHByZWRpY2F0ZSByZW1vdmVkLgorICAgIHRlbXBsYXRlIDxjbGFzcyBQcmVkaWNhdGVUPgorICAgIE11dGFibGVBcnJheVJlZjxUPiBkcm9wX3doaWxlKFByZWRpY2F0ZVQgUHJlZCkgY29uc3QgeworICAgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxUPihmaW5kX2lmX25vdCgqdGhpcywgUHJlZCksIGVuZCgpKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJldHVybiBhIGNvcHkgb2YgKnRoaXMgd2l0aCB0aGUgZmlyc3QgTiBlbGVtZW50cyBub3Qgc2F0aXNmeWluZworICAgIC8vLyB0aGUgZ2l2ZW4gcHJlZGljYXRlIHJlbW92ZWQuCisgICAgdGVtcGxhdGUgPGNsYXNzIFByZWRpY2F0ZVQ+CisgICAgTXV0YWJsZUFycmF5UmVmPFQ+IGRyb3BfdW50aWwoUHJlZGljYXRlVCBQcmVkKSBjb25zdCB7CisgICAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPFQ+KGZpbmRfaWYoKnRoaXMsIFByZWQpLCBlbmQoKSk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm4gYSBjb3B5IG9mICp0aGlzIHdpdGggb25seSB0aGUgZmlyc3QgXHAgTiBlbGVtZW50cy4KKyAgICBNdXRhYmxlQXJyYXlSZWY8VD4gdGFrZV9mcm9udChzaXplX3QgTiA9IDEpIGNvbnN0IHsKKyAgICAgIGlmIChOID49IHRoaXMtPnNpemUoKSkKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgcmV0dXJuIGRyb3BfYmFjayh0aGlzLT5zaXplKCkgLSBOKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJldHVybiBhIGNvcHkgb2YgKnRoaXMgd2l0aCBvbmx5IHRoZSBsYXN0IFxwIE4gZWxlbWVudHMuCisgICAgTXV0YWJsZUFycmF5UmVmPFQ+IHRha2VfYmFjayhzaXplX3QgTiA9IDEpIGNvbnN0IHsKKyAgICAgIGlmIChOID49IHRoaXMtPnNpemUoKSkKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgcmV0dXJuIGRyb3BfZnJvbnQodGhpcy0+c2l6ZSgpIC0gTik7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGZpcnN0IE4gZWxlbWVudHMgb2YgdGhpcyBBcnJheSB0aGF0IHNhdGlzZnkgdGhlIGdpdmVuCisgICAgLy8vIHByZWRpY2F0ZS4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUHJlZGljYXRlVD4KKyAgICBNdXRhYmxlQXJyYXlSZWY8VD4gdGFrZV93aGlsZShQcmVkaWNhdGVUIFByZWQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBNdXRhYmxlQXJyYXlSZWY8VD4oYmVnaW4oKSwgZmluZF9pZl9ub3QoKnRoaXMsIFByZWQpKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZmlyc3QgTiBlbGVtZW50cyBvZiB0aGlzIEFycmF5IHRoYXQgZG9uJ3Qgc2F0aXNmeSB0aGUKKyAgICAvLy8gZ2l2ZW4gcHJlZGljYXRlLgorICAgIHRlbXBsYXRlIDxjbGFzcyBQcmVkaWNhdGVUPgorICAgIE11dGFibGVBcnJheVJlZjxUPiB0YWtlX3VudGlsKFByZWRpY2F0ZVQgUHJlZCkgY29uc3QgeworICAgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxUPihiZWdpbigpLCBmaW5kX2lmKCp0aGlzLCBQcmVkKSk7CisgICAgfQorCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIE9wZXJhdG9yIE92ZXJsb2FkcworICAgIC8vLyBAeworICAgIFQgJm9wZXJhdG9yW10oc2l6ZV90IEluZGV4KSBjb25zdCB7CisgICAgICBhc3NlcnQoSW5kZXggPCB0aGlzLT5zaXplKCkgJiYgIkludmFsaWQgaW5kZXghIik7CisgICAgICByZXR1cm4gZGF0YSgpW0luZGV4XTsKKyAgICB9CisgIH07CisKKyAgLy8vIFRoaXMgaXMgYSBNdXRhYmxlQXJyYXlSZWYgdGhhdCBvd25zIGl0cyBhcnJheS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIE93bmluZ0FycmF5UmVmIDogcHVibGljIE11dGFibGVBcnJheVJlZjxUPiB7CisgIHB1YmxpYzoKKyAgICBPd25pbmdBcnJheVJlZigpID0gZGVmYXVsdDsKKyAgICBPd25pbmdBcnJheVJlZihzaXplX3QgU2l6ZSkgOiBNdXRhYmxlQXJyYXlSZWY8VD4obmV3IFRbU2l6ZV0sIFNpemUpIHt9CisKKyAgICBPd25pbmdBcnJheVJlZihBcnJheVJlZjxUPiBEYXRhKQorICAgICAgICA6IE11dGFibGVBcnJheVJlZjxUPihuZXcgVFtEYXRhLnNpemUoKV0sIERhdGEuc2l6ZSgpKSB7CisgICAgICBzdGQ6OmNvcHkoRGF0YS5iZWdpbigpLCBEYXRhLmVuZCgpLCB0aGlzLT5iZWdpbigpKTsKKyAgICB9CisKKyAgICBPd25pbmdBcnJheVJlZihPd25pbmdBcnJheVJlZiAmJk90aGVyKSB7ICp0aGlzID0gT3RoZXI7IH0KKworICAgIE93bmluZ0FycmF5UmVmICZvcGVyYXRvcj0oT3duaW5nQXJyYXlSZWYgJiZPdGhlcikgeworICAgICAgZGVsZXRlW10gdGhpcy0+ZGF0YSgpOworICAgICAgdGhpcy0+TXV0YWJsZUFycmF5UmVmPFQ+OjpvcGVyYXRvcj0oT3RoZXIpOworICAgICAgT3RoZXIuTXV0YWJsZUFycmF5UmVmPFQ+OjpvcGVyYXRvcj0oTXV0YWJsZUFycmF5UmVmPFQ+KCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIH5Pd25pbmdBcnJheVJlZigpIHsgZGVsZXRlW10gdGhpcy0+ZGF0YSgpOyB9CisgIH07CisKKyAgLy8vIEBuYW1lIEFycmF5UmVmIENvbnZlbmllbmNlIGNvbnN0cnVjdG9ycworICAvLy8gQHsKKworICAvLy8gQ29uc3RydWN0IGFuIEFycmF5UmVmIGZyb20gYSBzaW5nbGUgZWxlbWVudC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgQXJyYXlSZWY8VD4gbWFrZUFycmF5UmVmKGNvbnN0IFQgJk9uZUVsdCkgeworICAgIHJldHVybiBPbmVFbHQ7CisgIH0KKworICAvLy8gQ29uc3RydWN0IGFuIEFycmF5UmVmIGZyb20gYSBwb2ludGVyIGFuZCBsZW5ndGguCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIEFycmF5UmVmPFQ+IG1ha2VBcnJheVJlZihjb25zdCBUICpkYXRhLCBzaXplX3QgbGVuZ3RoKSB7CisgICAgcmV0dXJuIEFycmF5UmVmPFQ+KGRhdGEsIGxlbmd0aCk7CisgIH0KKworICAvLy8gQ29uc3RydWN0IGFuIEFycmF5UmVmIGZyb20gYSByYW5nZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgQXJyYXlSZWY8VD4gbWFrZUFycmF5UmVmKGNvbnN0IFQgKmJlZ2luLCBjb25zdCBUICplbmQpIHsKKyAgICByZXR1cm4gQXJyYXlSZWY8VD4oYmVnaW4sIGVuZCk7CisgIH0KKworICAvLy8gQ29uc3RydWN0IGFuIEFycmF5UmVmIGZyb20gYSBTbWFsbFZlY3Rvci4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIEFycmF5UmVmPFQ+IG1ha2VBcnJheVJlZihjb25zdCBTbWFsbFZlY3RvckltcGw8VD4gJlZlYykgeworICAgIHJldHVybiBWZWM7CisgIH0KKworICAvLy8gQ29uc3RydWN0IGFuIEFycmF5UmVmIGZyb20gYSBTbWFsbFZlY3Rvci4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4+CisgIEFycmF5UmVmPFQ+IG1ha2VBcnJheVJlZihjb25zdCBTbWFsbFZlY3RvcjxULCBOPiAmVmVjKSB7CisgICAgcmV0dXJuIFZlYzsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIHN0ZDo6dmVjdG9yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBBcnJheVJlZjxUPiBtYWtlQXJyYXlSZWYoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJlZlYykgeworICAgIHJldHVybiBWZWM7CisgIH0KKworICAvLy8gQ29uc3RydWN0IGFuIEFycmF5UmVmIGZyb20gYW4gQXJyYXlSZWYgKG5vLW9wKSAoY29uc3QpCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBBcnJheVJlZjxUPiBtYWtlQXJyYXlSZWYoY29uc3QgQXJyYXlSZWY8VD4gJlZlYykgeworICAgIHJldHVybiBWZWM7CisgIH0KKworICAvLy8gQ29uc3RydWN0IGFuIEFycmF5UmVmIGZyb20gYW4gQXJyYXlSZWYgKG5vLW9wKQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gQXJyYXlSZWY8VD4gJm1ha2VBcnJheVJlZihBcnJheVJlZjxUPiAmVmVjKSB7CisgICAgcmV0dXJuIFZlYzsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIEMgYXJyYXkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorICBBcnJheVJlZjxUPiBtYWtlQXJyYXlSZWYoY29uc3QgVCAoJkFycilbTl0pIHsKKyAgICByZXR1cm4gQXJyYXlSZWY8VD4oQXJyKTsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3QgYSBNdXRhYmxlQXJyYXlSZWYgZnJvbSBhIHNpbmdsZSBlbGVtZW50LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBNdXRhYmxlQXJyYXlSZWY8VD4gbWFrZU11dGFibGVBcnJheVJlZihUICZPbmVFbHQpIHsKKyAgICByZXR1cm4gT25lRWx0OworICB9CisKKyAgLy8vIENvbnN0cnVjdCBhIE11dGFibGVBcnJheVJlZiBmcm9tIGEgcG9pbnRlciBhbmQgbGVuZ3RoLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBNdXRhYmxlQXJyYXlSZWY8VD4gbWFrZU11dGFibGVBcnJheVJlZihUICpkYXRhLCBzaXplX3QgbGVuZ3RoKSB7CisgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxUPihkYXRhLCBsZW5ndGgpOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBBcnJheVJlZiBDb21wYXJpc29uIE9wZXJhdG9ycworICAvLy8gQHsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KEFycmF5UmVmPFQ+IExIUywgQXJyYXlSZWY8VD4gUkhTKSB7CisgICAgcmV0dXJuIExIUy5lcXVhbHMoUkhTKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oQXJyYXlSZWY8VD4gTEhTLCBBcnJheVJlZjxUPiBSSFMpIHsKKyAgICByZXR1cm4gIShMSFMgPT0gUkhTKTsKKyAgfQorCisgIC8vLyBAfQorCisgIC8vIEFycmF5UmVmcyBjYW4gYmUgdHJlYXRlZCBsaWtlIGEgUE9EIHR5cGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNQb2RMaWtlOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlzUG9kTGlrZTxBcnJheVJlZjxUPj4geworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKKyAgfTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaGFzaF9jb2RlIGhhc2hfdmFsdWUoQXJyYXlSZWY8VD4gUykgeworICAgIHJldHVybiBoYXNoX2NvbWJpbmVfcmFuZ2UoUy5iZWdpbigpLCBTLmVuZCgpKTsKKyAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfQVJSQVlSRUZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQml0VmVjdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9CaXRWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjRjMmE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQml0VmVjdG9yLmgKQEAgLTAsMCArMSw5MjkgQEAKKy8vPT09LSBsbHZtL0FEVC9CaXRWZWN0b3IuaCAtIEJpdCB2ZWN0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEJpdFZlY3RvciBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0JJVFZFQ1RPUl9ICisjZGVmaW5lIExMVk1fQURUX0JJVFZFQ1RPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEZvcndhcmRJdGVyYXRvciBmb3IgdGhlIGJpdHMgdGhhdCBhcmUgc2V0LgorLy8vIEl0ZXJhdG9ycyBnZXQgaW52YWxpZGF0ZWQgd2hlbiByZXNpemUgLyByZXNlcnZlIGlzIGNhbGxlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBCaXRWZWN0b3JUPiBjbGFzcyBjb25zdF9zZXRfYml0c19pdGVyYXRvcl9pbXBsIHsKKyAgY29uc3QgQml0VmVjdG9yVCAmUGFyZW50OworICBpbnQgQ3VycmVudCA9IDA7CisKKyAgdm9pZCBhZHZhbmNlKCkgeworICAgIGFzc2VydChDdXJyZW50ICE9IC0xICYmICJUcnlpbmcgdG8gYWR2YW5jZSBwYXN0IGVuZC4iKTsKKyAgICBDdXJyZW50ID0gUGFyZW50LmZpbmRfbmV4dChDdXJyZW50KTsKKyAgfQorCitwdWJsaWM6CisgIGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yX2ltcGwoY29uc3QgQml0VmVjdG9yVCAmUGFyZW50LCBpbnQgQ3VycmVudCkKKyAgICAgIDogUGFyZW50KFBhcmVudCksIEN1cnJlbnQoQ3VycmVudCkge30KKyAgZXhwbGljaXQgY29uc3Rfc2V0X2JpdHNfaXRlcmF0b3JfaW1wbChjb25zdCBCaXRWZWN0b3JUICZQYXJlbnQpCisgICAgICA6IGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yX2ltcGwoUGFyZW50LCBQYXJlbnQuZmluZF9maXJzdCgpKSB7fQorICBjb25zdF9zZXRfYml0c19pdGVyYXRvcl9pbXBsKGNvbnN0IGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yX2ltcGwgJikgPSBkZWZhdWx0OworCisgIGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yX2ltcGwgb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBhdXRvIFByZXYgPSAqdGhpczsKKyAgICBhZHZhbmNlKCk7CisgICAgcmV0dXJuIFByZXY7CisgIH0KKworICBjb25zdF9zZXRfYml0c19pdGVyYXRvcl9pbXBsICZvcGVyYXRvcisrKCkgeworICAgIGFkdmFuY2UoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB1bnNpZ25lZCBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBDdXJyZW50OyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yX2ltcGwgJk90aGVyKSBjb25zdCB7CisgICAgYXNzZXJ0KCZQYXJlbnQgPT0gJk90aGVyLlBhcmVudCAmJgorICAgICAgICAgICAiQ29tcGFyaW5nIGl0ZXJhdG9ycyBmcm9tIGRpZmZlcmVudCBCaXRWZWN0b3JzIik7CisgICAgcmV0dXJuIEN1cnJlbnQgPT0gT3RoZXIuQ3VycmVudDsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBjb25zdF9zZXRfYml0c19pdGVyYXRvcl9pbXBsICZPdGhlcikgY29uc3QgeworICAgIGFzc2VydCgmUGFyZW50ID09ICZPdGhlci5QYXJlbnQgJiYKKyAgICAgICAgICAgIkNvbXBhcmluZyBpdGVyYXRvcnMgZnJvbSBkaWZmZXJlbnQgQml0VmVjdG9ycyIpOworICAgIHJldHVybiBDdXJyZW50ICE9IE90aGVyLkN1cnJlbnQ7CisgIH0KK307CisKK2NsYXNzIEJpdFZlY3RvciB7CisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBCaXRXb3JkOworCisgIGVudW0geyBCSVRXT1JEX1NJWkUgPSAodW5zaWduZWQpc2l6ZW9mKEJpdFdvcmQpICogQ0hBUl9CSVQgfTsKKworICBzdGF0aWNfYXNzZXJ0KEJJVFdPUkRfU0laRSA9PSA2NCB8fCBCSVRXT1JEX1NJWkUgPT0gMzIsCisgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHdvcmQgc2l6ZSIpOworCisgIE11dGFibGVBcnJheVJlZjxCaXRXb3JkPiBCaXRzOyAvLyBBY3R1YWwgYml0cy4KKyAgdW5zaWduZWQgU2l6ZTsgICAgICAgICAgICAgICAgIC8vIFNpemUgb2YgYml0dmVjdG9yIGluIGJpdHMuCisKK3B1YmxpYzoKKyAgdHlwZWRlZiB1bnNpZ25lZCBzaXplX3R5cGU7CisgIC8vIEVuY2Fwc3VsYXRpb24gb2YgYSBzaW5nbGUgYml0LgorICBjbGFzcyByZWZlcmVuY2UgeworICAgIGZyaWVuZCBjbGFzcyBCaXRWZWN0b3I7CisKKyAgICBCaXRXb3JkICpXb3JkUmVmOworICAgIHVuc2lnbmVkIEJpdFBvczsKKworICBwdWJsaWM6CisgICAgcmVmZXJlbmNlKEJpdFZlY3RvciAmYiwgdW5zaWduZWQgSWR4KSB7CisgICAgICBXb3JkUmVmID0gJmIuQml0c1tJZHggLyBCSVRXT1JEX1NJWkVdOworICAgICAgQml0UG9zID0gSWR4ICUgQklUV09SRF9TSVpFOworICAgIH0KKworICAgIHJlZmVyZW5jZSgpID0gZGVsZXRlOworICAgIHJlZmVyZW5jZShjb25zdCByZWZlcmVuY2UmKSA9IGRlZmF1bHQ7CisKKyAgICByZWZlcmVuY2UgJm9wZXJhdG9yPShyZWZlcmVuY2UgdCkgeworICAgICAgKnRoaXMgPSBib29sKHQpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHJlZmVyZW5jZSYgb3BlcmF0b3I9KGJvb2wgdCkgeworICAgICAgaWYgKHQpCisgICAgICAgICpXb3JkUmVmIHw9IEJpdFdvcmQoMSkgPDwgQml0UG9zOworICAgICAgZWxzZQorICAgICAgICAqV29yZFJlZiAmPSB+KEJpdFdvcmQoMSkgPDwgQml0UG9zKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAgcmV0dXJuICgoKldvcmRSZWYpICYgKEJpdFdvcmQoMSkgPDwgQml0UG9zKSkgIT0gMDsKKyAgICB9CisgIH07CisKKyAgdHlwZWRlZiBjb25zdF9zZXRfYml0c19pdGVyYXRvcl9pbXBsPEJpdFZlY3Rvcj4gY29uc3Rfc2V0X2JpdHNfaXRlcmF0b3I7CisgIHR5cGVkZWYgY29uc3Rfc2V0X2JpdHNfaXRlcmF0b3Igc2V0X2l0ZXJhdG9yOworCisgIGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yIHNldF9iaXRzX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9zZXRfYml0c19pdGVyYXRvcigqdGhpcyk7CisgIH0KKyAgY29uc3Rfc2V0X2JpdHNfaXRlcmF0b3Igc2V0X2JpdHNfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9zZXRfYml0c19pdGVyYXRvcigqdGhpcywgLTEpOworICB9CisgIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yPiBzZXRfYml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShzZXRfYml0c19iZWdpbigpLCBzZXRfYml0c19lbmQoKSk7CisgIH0KKworICAvLy8gQml0VmVjdG9yIGRlZmF1bHQgY3RvciAtIENyZWF0ZXMgYW4gZW1wdHkgYml0dmVjdG9yLgorICBCaXRWZWN0b3IoKSA6IFNpemUoMCkge30KKworICAvLy8gQml0VmVjdG9yIGN0b3IgLSBDcmVhdGVzIGEgYml0dmVjdG9yIG9mIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cy4gQWxsCisgIC8vLyBiaXRzIGFyZSBpbml0aWFsaXplZCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICBleHBsaWNpdCBCaXRWZWN0b3IodW5zaWduZWQgcywgYm9vbCB0ID0gZmFsc2UpIDogU2l6ZShzKSB7CisgICAgc2l6ZV90IENhcGFjaXR5ID0gTnVtQml0V29yZHMocyk7CisgICAgQml0cyA9IGFsbG9jYXRlKENhcGFjaXR5KTsKKyAgICBpbml0X3dvcmRzKEJpdHMsIHQpOworICAgIGlmICh0KQorICAgICAgY2xlYXJfdW51c2VkX2JpdHMoKTsKKyAgfQorCisgIC8vLyBCaXRWZWN0b3IgY29weSBjdG9yLgorICBCaXRWZWN0b3IoY29uc3QgQml0VmVjdG9yICZSSFMpIDogU2l6ZShSSFMuc2l6ZSgpKSB7CisgICAgaWYgKFNpemUgPT0gMCkgeworICAgICAgQml0cyA9IE11dGFibGVBcnJheVJlZjxCaXRXb3JkPigpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBDYXBhY2l0eSA9IE51bUJpdFdvcmRzKFJIUy5zaXplKCkpOworICAgIEJpdHMgPSBhbGxvY2F0ZShDYXBhY2l0eSk7CisgICAgc3RkOjptZW1jcHkoQml0cy5kYXRhKCksIFJIUy5CaXRzLmRhdGEoKSwgQ2FwYWNpdHkgKiBzaXplb2YoQml0V29yZCkpOworICB9CisKKyAgQml0VmVjdG9yKEJpdFZlY3RvciAmJlJIUykgOiBCaXRzKFJIUy5CaXRzKSwgU2l6ZShSSFMuU2l6ZSkgeworICAgIFJIUy5CaXRzID0gTXV0YWJsZUFycmF5UmVmPEJpdFdvcmQ+KCk7CisgICAgUkhTLlNpemUgPSAwOworICB9CisKKyAgfkJpdFZlY3RvcigpIHsgc3RkOjpmcmVlKEJpdHMuZGF0YSgpKTsgfQorCisgIC8vLyBlbXB0eSAtIFRlc3RzIHdoZXRoZXIgdGhlcmUgYXJlIG5vIGJpdHMgaW4gdGhpcyBiaXR2ZWN0b3IuCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBTaXplID09IDA7IH0KKworICAvLy8gc2l6ZSAtIFJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoaXMgYml0dmVjdG9yLgorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKworICAvLy8gY291bnQgLSBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyB3aGljaCBhcmUgc2V0LgorICBzaXplX3R5cGUgY291bnQoKSBjb25zdCB7CisgICAgdW5zaWduZWQgTnVtQml0cyA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bUJpdFdvcmRzKHNpemUoKSk7ICsraSkKKyAgICAgIE51bUJpdHMgKz0gY291bnRQb3B1bGF0aW9uKEJpdHNbaV0pOworICAgIHJldHVybiBOdW1CaXRzOworICB9CisKKyAgLy8vIGFueSAtIFJldHVybnMgdHJ1ZSBpZiBhbnkgYml0IGlzIHNldC4KKyAgYm9vbCBhbnkoKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bUJpdFdvcmRzKHNpemUoKSk7ICsraSkKKyAgICAgIGlmIChCaXRzW2ldICE9IDApCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBhbGwgLSBSZXR1cm5zIHRydWUgaWYgYWxsIGJpdHMgYXJlIHNldC4KKyAgYm9vbCBhbGwoKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFNpemUgLyBCSVRXT1JEX1NJWkU7ICsraSkKKyAgICAgIGlmIChCaXRzW2ldICE9IH4wVUwpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIElmIGJpdHMgcmVtYWluIGNoZWNrIHRoYXQgdGhleSBhcmUgb25lcy4gVGhlIHVudXNlZCBiaXRzIGFyZSBhbHdheXMgemVyby4KKyAgICBpZiAodW5zaWduZWQgUmVtYWluZGVyID0gU2l6ZSAlIEJJVFdPUkRfU0laRSkKKyAgICAgIHJldHVybiBCaXRzW1NpemUgLyBCSVRXT1JEX1NJWkVdID09ICgxVUwgPDwgUmVtYWluZGVyKSAtIDE7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBub25lIC0gUmV0dXJucyB0cnVlIGlmIG5vbmUgb2YgdGhlIGJpdHMgYXJlIHNldC4KKyAgYm9vbCBub25lKCkgY29uc3QgeworICAgIHJldHVybiAhYW55KCk7CisgIH0KKworICAvLy8gZmluZF9maXJzdF9pbiAtIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzZXQgYml0IGluIHRoZSByYW5nZQorICAvLy8gW0JlZ2luLCBFbmQpLiAgUmV0dXJucyAtMSBpZiBhbGwgYml0cyBpbiB0aGUgcmFuZ2UgYXJlIHVuc2V0LgorICBpbnQgZmluZF9maXJzdF9pbih1bnNpZ25lZCBCZWdpbiwgdW5zaWduZWQgRW5kKSBjb25zdCB7CisgICAgYXNzZXJ0KEJlZ2luIDw9IEVuZCAmJiBFbmQgPD0gU2l6ZSk7CisgICAgaWYgKEJlZ2luID09IEVuZCkKKyAgICAgIHJldHVybiAtMTsKKworICAgIHVuc2lnbmVkIEZpcnN0V29yZCA9IEJlZ2luIC8gQklUV09SRF9TSVpFOworICAgIHVuc2lnbmVkIExhc3RXb3JkID0gKEVuZCAtIDEpIC8gQklUV09SRF9TSVpFOworCisgICAgLy8gQ2hlY2sgc3Vic2VxdWVudCB3b3Jkcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBGaXJzdFdvcmQ7IGkgPD0gTGFzdFdvcmQ7ICsraSkgeworICAgICAgQml0V29yZCBDb3B5ID0gQml0c1tpXTsKKworICAgICAgaWYgKGkgPT0gRmlyc3RXb3JkKSB7CisgICAgICAgIHVuc2lnbmVkIEZpcnN0Qml0ID0gQmVnaW4gJSBCSVRXT1JEX1NJWkU7CisgICAgICAgIENvcHkgJj0gbWFza1RyYWlsaW5nWmVyb3M8Qml0V29yZD4oRmlyc3RCaXQpOworICAgICAgfQorCisgICAgICBpZiAoaSA9PSBMYXN0V29yZCkgeworICAgICAgICB1bnNpZ25lZCBMYXN0Qml0ID0gKEVuZCAtIDEpICUgQklUV09SRF9TSVpFOworICAgICAgICBDb3B5ICY9IG1hc2tUcmFpbGluZ09uZXM8Qml0V29yZD4oTGFzdEJpdCArIDEpOworICAgICAgfQorICAgICAgaWYgKENvcHkgIT0gMCkKKyAgICAgICAgcmV0dXJuIGkgKiBCSVRXT1JEX1NJWkUgKyBjb3VudFRyYWlsaW5nWmVyb3MoQ29weSk7CisgICAgfQorICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vLyBmaW5kX2xhc3RfaW4gLSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzZXQgYml0IGluIHRoZSByYW5nZQorICAvLy8gW0JlZ2luLCBFbmQpLiAgUmV0dXJucyAtMSBpZiBhbGwgYml0cyBpbiB0aGUgcmFuZ2UgYXJlIHVuc2V0LgorICBpbnQgZmluZF9sYXN0X2luKHVuc2lnbmVkIEJlZ2luLCB1bnNpZ25lZCBFbmQpIGNvbnN0IHsKKyAgICBhc3NlcnQoQmVnaW4gPD0gRW5kICYmIEVuZCA8PSBTaXplKTsKKyAgICBpZiAoQmVnaW4gPT0gRW5kKQorICAgICAgcmV0dXJuIC0xOworCisgICAgdW5zaWduZWQgTGFzdFdvcmQgPSAoRW5kIC0gMSkgLyBCSVRXT1JEX1NJWkU7CisgICAgdW5zaWduZWQgRmlyc3RXb3JkID0gQmVnaW4gLyBCSVRXT1JEX1NJWkU7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBMYXN0V29yZCArIDE7IGkgPj0gRmlyc3RXb3JkICsgMTsgLS1pKSB7CisgICAgICB1bnNpZ25lZCBDdXJyZW50V29yZCA9IGkgLSAxOworCisgICAgICBCaXRXb3JkIENvcHkgPSBCaXRzW0N1cnJlbnRXb3JkXTsKKyAgICAgIGlmIChDdXJyZW50V29yZCA9PSBMYXN0V29yZCkgeworICAgICAgICB1bnNpZ25lZCBMYXN0Qml0ID0gKEVuZCAtIDEpICUgQklUV09SRF9TSVpFOworICAgICAgICBDb3B5ICY9IG1hc2tUcmFpbGluZ09uZXM8Qml0V29yZD4oTGFzdEJpdCArIDEpOworICAgICAgfQorCisgICAgICBpZiAoQ3VycmVudFdvcmQgPT0gRmlyc3RXb3JkKSB7CisgICAgICAgIHVuc2lnbmVkIEZpcnN0Qml0ID0gQmVnaW4gJSBCSVRXT1JEX1NJWkU7CisgICAgICAgIENvcHkgJj0gbWFza1RyYWlsaW5nWmVyb3M8Qml0V29yZD4oRmlyc3RCaXQpOworICAgICAgfQorCisgICAgICBpZiAoQ29weSAhPSAwKQorICAgICAgICByZXR1cm4gKEN1cnJlbnRXb3JkICsgMSkgKiBCSVRXT1JEX1NJWkUgLSBjb3VudExlYWRpbmdaZXJvcyhDb3B5KSAtIDE7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLy8vIGZpbmRfZmlyc3RfdW5zZXRfaW4gLSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5zZXQgYml0IGluIHRoZQorICAvLy8gcmFuZ2UgW0JlZ2luLCBFbmQpLiAgUmV0dXJucyAtMSBpZiBhbGwgYml0cyBpbiB0aGUgcmFuZ2UgYXJlIHNldC4KKyAgaW50IGZpbmRfZmlyc3RfdW5zZXRfaW4odW5zaWduZWQgQmVnaW4sIHVuc2lnbmVkIEVuZCkgY29uc3QgeworICAgIGFzc2VydChCZWdpbiA8PSBFbmQgJiYgRW5kIDw9IFNpemUpOworICAgIGlmIChCZWdpbiA9PSBFbmQpCisgICAgICByZXR1cm4gLTE7CisKKyAgICB1bnNpZ25lZCBGaXJzdFdvcmQgPSBCZWdpbiAvIEJJVFdPUkRfU0laRTsKKyAgICB1bnNpZ25lZCBMYXN0V29yZCA9IChFbmQgLSAxKSAvIEJJVFdPUkRfU0laRTsKKworICAgIC8vIENoZWNrIHN1YnNlcXVlbnQgd29yZHMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gRmlyc3RXb3JkOyBpIDw9IExhc3RXb3JkOyArK2kpIHsKKyAgICAgIEJpdFdvcmQgQ29weSA9IEJpdHNbaV07CisKKyAgICAgIGlmIChpID09IEZpcnN0V29yZCkgeworICAgICAgICB1bnNpZ25lZCBGaXJzdEJpdCA9IEJlZ2luICUgQklUV09SRF9TSVpFOworICAgICAgICBDb3B5IHw9IG1hc2tUcmFpbGluZ09uZXM8Qml0V29yZD4oRmlyc3RCaXQpOworICAgICAgfQorCisgICAgICBpZiAoaSA9PSBMYXN0V29yZCkgeworICAgICAgICB1bnNpZ25lZCBMYXN0Qml0ID0gKEVuZCAtIDEpICUgQklUV09SRF9TSVpFOworICAgICAgICBDb3B5IHw9IG1hc2tUcmFpbGluZ1plcm9zPEJpdFdvcmQ+KExhc3RCaXQgKyAxKTsKKyAgICAgIH0KKyAgICAgIGlmIChDb3B5ICE9IH4wVUwpIHsKKyAgICAgICAgdW5zaWduZWQgUmVzdWx0ID0gaSAqIEJJVFdPUkRfU0laRSArIGNvdW50VHJhaWxpbmdPbmVzKENvcHkpOworICAgICAgICByZXR1cm4gUmVzdWx0IDwgc2l6ZSgpID8gUmVzdWx0IDogLTE7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vLyBmaW5kX2xhc3RfdW5zZXRfaW4gLSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB1bnNldCBiaXQgaW4gdGhlCisgIC8vLyByYW5nZSBbQmVnaW4sIEVuZCkuICBSZXR1cm5zIC0xIGlmIGFsbCBiaXRzIGluIHRoZSByYW5nZSBhcmUgc2V0LgorICBpbnQgZmluZF9sYXN0X3Vuc2V0X2luKHVuc2lnbmVkIEJlZ2luLCB1bnNpZ25lZCBFbmQpIGNvbnN0IHsKKyAgICBhc3NlcnQoQmVnaW4gPD0gRW5kICYmIEVuZCA8PSBTaXplKTsKKyAgICBpZiAoQmVnaW4gPT0gRW5kKQorICAgICAgcmV0dXJuIC0xOworCisgICAgdW5zaWduZWQgTGFzdFdvcmQgPSAoRW5kIC0gMSkgLyBCSVRXT1JEX1NJWkU7CisgICAgdW5zaWduZWQgRmlyc3RXb3JkID0gQmVnaW4gLyBCSVRXT1JEX1NJWkU7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBMYXN0V29yZCArIDE7IGkgPj0gRmlyc3RXb3JkICsgMTsgLS1pKSB7CisgICAgICB1bnNpZ25lZCBDdXJyZW50V29yZCA9IGkgLSAxOworCisgICAgICBCaXRXb3JkIENvcHkgPSBCaXRzW0N1cnJlbnRXb3JkXTsKKyAgICAgIGlmIChDdXJyZW50V29yZCA9PSBMYXN0V29yZCkgeworICAgICAgICB1bnNpZ25lZCBMYXN0Qml0ID0gKEVuZCAtIDEpICUgQklUV09SRF9TSVpFOworICAgICAgICBDb3B5IHw9IG1hc2tUcmFpbGluZ1plcm9zPEJpdFdvcmQ+KExhc3RCaXQgKyAxKTsKKyAgICAgIH0KKworICAgICAgaWYgKEN1cnJlbnRXb3JkID09IEZpcnN0V29yZCkgeworICAgICAgICB1bnNpZ25lZCBGaXJzdEJpdCA9IEJlZ2luICUgQklUV09SRF9TSVpFOworICAgICAgICBDb3B5IHw9IG1hc2tUcmFpbGluZ09uZXM8Qml0V29yZD4oRmlyc3RCaXQpOworICAgICAgfQorCisgICAgICBpZiAoQ29weSAhPSB+MFVMKSB7CisgICAgICAgIHVuc2lnbmVkIFJlc3VsdCA9CisgICAgICAgICAgICAoQ3VycmVudFdvcmQgKyAxKSAqIEJJVFdPUkRfU0laRSAtIGNvdW50TGVhZGluZ09uZXMoQ29weSkgLSAxOworICAgICAgICByZXR1cm4gUmVzdWx0IDwgU2l6ZSA/IFJlc3VsdCA6IC0xOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLy8gZmluZF9maXJzdCAtIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzZXQgYml0LCAtMSBpZiBub25lCisgIC8vLyBvZiB0aGUgYml0cyBhcmUgc2V0LgorICBpbnQgZmluZF9maXJzdCgpIGNvbnN0IHsgcmV0dXJuIGZpbmRfZmlyc3RfaW4oMCwgU2l6ZSk7IH0KKworICAvLy8gZmluZF9sYXN0IC0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgc2V0IGJpdCwgLTEgaWYgbm9uZSBvZiB0aGUgYml0cworICAvLy8gYXJlIHNldC4KKyAgaW50IGZpbmRfbGFzdCgpIGNvbnN0IHsgcmV0dXJuIGZpbmRfbGFzdF9pbigwLCBTaXplKTsgfQorCisgIC8vLyBmaW5kX25leHQgLSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBzZXQgYml0IGZvbGxvd2luZyB0aGUKKyAgLy8vICJQcmV2IiBiaXQuIFJldHVybnMgLTEgaWYgdGhlIG5leHQgc2V0IGJpdCBpcyBub3QgZm91bmQuCisgIGludCBmaW5kX25leHQodW5zaWduZWQgUHJldikgY29uc3QgeyByZXR1cm4gZmluZF9maXJzdF9pbihQcmV2ICsgMSwgU2l6ZSk7IH0KKworICAvLy8gZmluZF9wcmV2IC0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHNldCBiaXQgdGhhdCBwcmVjZWRlcyB0aGUKKyAgLy8vIHRoZSBiaXQgYXQgXHAgUHJpb3JUby4gIFJldHVybnMgLTEgaWYgYWxsIHByZXZpb3VzIGJpdHMgYXJlIHVuc2V0LgorICBpbnQgZmluZF9wcmV2KHVuc2lnbmVkIFByaW9yVG8pIGNvbnN0IHsgcmV0dXJuIGZpbmRfbGFzdF9pbigwLCBQcmlvclRvKTsgfQorCisgIC8vLyBmaW5kX2ZpcnN0X3Vuc2V0IC0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHVuc2V0IGJpdCwgLTEgaWYgYWxsCisgIC8vLyBvZiB0aGUgYml0cyBhcmUgc2V0LgorICBpbnQgZmluZF9maXJzdF91bnNldCgpIGNvbnN0IHsgcmV0dXJuIGZpbmRfZmlyc3RfdW5zZXRfaW4oMCwgU2l6ZSk7IH0KKworICAvLy8gZmluZF9uZXh0X3Vuc2V0IC0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5leHQgdW5zZXQgYml0IGZvbGxvd2luZyB0aGUKKyAgLy8vICJQcmV2IiBiaXQuICBSZXR1cm5zIC0xIGlmIGFsbCByZW1haW5pbmcgYml0cyBhcmUgc2V0LgorICBpbnQgZmluZF9uZXh0X3Vuc2V0KHVuc2lnbmVkIFByZXYpIGNvbnN0IHsKKyAgICByZXR1cm4gZmluZF9maXJzdF91bnNldF9pbihQcmV2ICsgMSwgU2l6ZSk7CisgIH0KKworICAvLy8gZmluZF9sYXN0X3Vuc2V0IC0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgdW5zZXQgYml0LCAtMSBpZiBhbGwgb2YKKyAgLy8vIHRoZSBiaXRzIGFyZSBzZXQuCisgIGludCBmaW5kX2xhc3RfdW5zZXQoKSBjb25zdCB7IHJldHVybiBmaW5kX2xhc3RfdW5zZXRfaW4oMCwgU2l6ZSk7IH0KKworICAvLy8gZmluZF9wcmV2X3Vuc2V0IC0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHVuc2V0IGJpdCB0aGF0IHByZWNlZGVzCisgIC8vLyB0aGUgYml0IGF0IFxwIFByaW9yVG8uICBSZXR1cm5zIC0xIGlmIGFsbCBwcmV2aW91cyBiaXRzIGFyZSBzZXQuCisgIGludCBmaW5kX3ByZXZfdW5zZXQodW5zaWduZWQgUHJpb3JUbykgeworICAgIHJldHVybiBmaW5kX2xhc3RfdW5zZXRfaW4oMCwgUHJpb3JUbyk7CisgIH0KKworICAvLy8gY2xlYXIgLSBSZW1vdmVzIGFsbCBiaXRzIGZyb20gdGhlIGJpdHZlY3Rvci4gRG9lcyBub3QgY2hhbmdlIGNhcGFjaXR5LgorICB2b2lkIGNsZWFyKCkgeworICAgIFNpemUgPSAwOworICB9CisKKyAgLy8vIHJlc2l6ZSAtIEdyb3cgb3Igc2hyaW5rIHRoZSBiaXR2ZWN0b3IuCisgIHZvaWQgcmVzaXplKHVuc2lnbmVkIE4sIGJvb2wgdCA9IGZhbHNlKSB7CisgICAgaWYgKE4gPiBnZXRCaXRDYXBhY2l0eSgpKSB7CisgICAgICB1bnNpZ25lZCBPbGRDYXBhY2l0eSA9IEJpdHMuc2l6ZSgpOworICAgICAgZ3JvdyhOKTsKKyAgICAgIGluaXRfd29yZHMoQml0cy5kcm9wX2Zyb250KE9sZENhcGFjaXR5KSwgdCk7CisgICAgfQorCisgICAgLy8gU2V0IGFueSBvbGQgdW51c2VkIGJpdHMgdGhhdCBhcmUgbm93IGluY2x1ZGVkIGluIHRoZSBCaXRWZWN0b3IuIFRoaXMKKyAgICAvLyBtYXkgc2V0IGJpdHMgdGhhdCBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBuZXcgdmVjdG9yLCBidXQgd2Ugd2lsbCBjbGVhcgorICAgIC8vIHRoZW0gYmFjayBvdXQgYmVsb3cuCisgICAgaWYgKE4gPiBTaXplKQorICAgICAgc2V0X3VudXNlZF9iaXRzKHQpOworCisgICAgLy8gVXBkYXRlIHRoZSBzaXplLCBhbmQgY2xlYXIgb3V0IGFueSBiaXRzIHRoYXQgYXJlIG5vdyB1bnVzZWQKKyAgICB1bnNpZ25lZCBPbGRTaXplID0gU2l6ZTsKKyAgICBTaXplID0gTjsKKyAgICBpZiAodCB8fCBOIDwgT2xkU2l6ZSkKKyAgICAgIGNsZWFyX3VudXNlZF9iaXRzKCk7CisgIH0KKworICB2b2lkIHJlc2VydmUodW5zaWduZWQgTikgeworICAgIGlmIChOID4gZ2V0Qml0Q2FwYWNpdHkoKSkKKyAgICAgIGdyb3coTik7CisgIH0KKworICAvLyBTZXQsIHJlc2V0LCBmbGlwCisgIEJpdFZlY3RvciAmc2V0KCkgeworICAgIGluaXRfd29yZHMoQml0cywgdHJ1ZSk7CisgICAgY2xlYXJfdW51c2VkX2JpdHMoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBCaXRWZWN0b3IgJnNldCh1bnNpZ25lZCBJZHgpIHsKKyAgICBhc3NlcnQoQml0cy5kYXRhKCkgJiYgIkJpdHMgbmV2ZXIgYWxsb2NhdGVkIik7CisgICAgQml0c1tJZHggLyBCSVRXT1JEX1NJWkVdIHw9IEJpdFdvcmQoMSkgPDwgKElkeCAlIEJJVFdPUkRfU0laRSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIHNldCAtIEVmZmljaWVudGx5IHNldCBhIHJhbmdlIG9mIGJpdHMgaW4gW0ksIEUpCisgIEJpdFZlY3RvciAmc2V0KHVuc2lnbmVkIEksIHVuc2lnbmVkIEUpIHsKKyAgICBhc3NlcnQoSSA8PSBFICYmICJBdHRlbXB0ZWQgdG8gc2V0IGJhY2t3YXJkcyByYW5nZSEiKTsKKyAgICBhc3NlcnQoRSA8PSBzaXplKCkgJiYgIkF0dGVtcHRlZCB0byBzZXQgb3V0LW9mLWJvdW5kcyByYW5nZSEiKTsKKworICAgIGlmIChJID09IEUpIHJldHVybiAqdGhpczsKKworICAgIGlmIChJIC8gQklUV09SRF9TSVpFID09IEUgLyBCSVRXT1JEX1NJWkUpIHsKKyAgICAgIEJpdFdvcmQgRU1hc2sgPSAxVUwgPDwgKEUgJSBCSVRXT1JEX1NJWkUpOworICAgICAgQml0V29yZCBJTWFzayA9IDFVTCA8PCAoSSAlIEJJVFdPUkRfU0laRSk7CisgICAgICBCaXRXb3JkIE1hc2sgPSBFTWFzayAtIElNYXNrOworICAgICAgQml0c1tJIC8gQklUV09SRF9TSVpFXSB8PSBNYXNrOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJpdFdvcmQgUHJlZml4TWFzayA9IH4wVUwgPDwgKEkgJSBCSVRXT1JEX1NJWkUpOworICAgIEJpdHNbSSAvIEJJVFdPUkRfU0laRV0gfD0gUHJlZml4TWFzazsKKyAgICBJID0gYWxpZ25UbyhJLCBCSVRXT1JEX1NJWkUpOworCisgICAgZm9yICg7IEkgKyBCSVRXT1JEX1NJWkUgPD0gRTsgSSArPSBCSVRXT1JEX1NJWkUpCisgICAgICBCaXRzW0kgLyBCSVRXT1JEX1NJWkVdID0gfjBVTDsKKworICAgIEJpdFdvcmQgUG9zdGZpeE1hc2sgPSAoMVVMIDw8IChFICUgQklUV09SRF9TSVpFKSkgLSAxOworICAgIGlmIChJIDwgRSkKKyAgICAgIEJpdHNbSSAvIEJJVFdPUkRfU0laRV0gfD0gUG9zdGZpeE1hc2s7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBCaXRWZWN0b3IgJnJlc2V0KCkgeworICAgIGluaXRfd29yZHMoQml0cywgZmFsc2UpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEJpdFZlY3RvciAmcmVzZXQodW5zaWduZWQgSWR4KSB7CisgICAgQml0c1tJZHggLyBCSVRXT1JEX1NJWkVdICY9IH4oQml0V29yZCgxKSA8PCAoSWR4ICUgQklUV09SRF9TSVpFKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIHJlc2V0IC0gRWZmaWNpZW50bHkgcmVzZXQgYSByYW5nZSBvZiBiaXRzIGluIFtJLCBFKQorICBCaXRWZWN0b3IgJnJlc2V0KHVuc2lnbmVkIEksIHVuc2lnbmVkIEUpIHsKKyAgICBhc3NlcnQoSSA8PSBFICYmICJBdHRlbXB0ZWQgdG8gcmVzZXQgYmFja3dhcmRzIHJhbmdlISIpOworICAgIGFzc2VydChFIDw9IHNpemUoKSAmJiAiQXR0ZW1wdGVkIHRvIHJlc2V0IG91dC1vZi1ib3VuZHMgcmFuZ2UhIik7CisKKyAgICBpZiAoSSA9PSBFKSByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAoSSAvIEJJVFdPUkRfU0laRSA9PSBFIC8gQklUV09SRF9TSVpFKSB7CisgICAgICBCaXRXb3JkIEVNYXNrID0gMVVMIDw8IChFICUgQklUV09SRF9TSVpFKTsKKyAgICAgIEJpdFdvcmQgSU1hc2sgPSAxVUwgPDwgKEkgJSBCSVRXT1JEX1NJWkUpOworICAgICAgQml0V29yZCBNYXNrID0gRU1hc2sgLSBJTWFzazsKKyAgICAgIEJpdHNbSSAvIEJJVFdPUkRfU0laRV0gJj0gfk1hc2s7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQml0V29yZCBQcmVmaXhNYXNrID0gfjBVTCA8PCAoSSAlIEJJVFdPUkRfU0laRSk7CisgICAgQml0c1tJIC8gQklUV09SRF9TSVpFXSAmPSB+UHJlZml4TWFzazsKKyAgICBJID0gYWxpZ25UbyhJLCBCSVRXT1JEX1NJWkUpOworCisgICAgZm9yICg7IEkgKyBCSVRXT1JEX1NJWkUgPD0gRTsgSSArPSBCSVRXT1JEX1NJWkUpCisgICAgICBCaXRzW0kgLyBCSVRXT1JEX1NJWkVdID0gMFVMOworCisgICAgQml0V29yZCBQb3N0Zml4TWFzayA9ICgxVUwgPDwgKEUgJSBCSVRXT1JEX1NJWkUpKSAtIDE7CisgICAgaWYgKEkgPCBFKQorICAgICAgQml0c1tJIC8gQklUV09SRF9TSVpFXSAmPSB+UG9zdGZpeE1hc2s7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBCaXRWZWN0b3IgJmZsaXAoKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bUJpdFdvcmRzKHNpemUoKSk7ICsraSkKKyAgICAgIEJpdHNbaV0gPSB+Qml0c1tpXTsKKyAgICBjbGVhcl91bnVzZWRfYml0cygpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEJpdFZlY3RvciAmZmxpcCh1bnNpZ25lZCBJZHgpIHsKKyAgICBCaXRzW0lkeCAvIEJJVFdPUkRfU0laRV0gXj0gQml0V29yZCgxKSA8PCAoSWR4ICUgQklUV09SRF9TSVpFKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBJbmRleGluZy4KKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10odW5zaWduZWQgSWR4KSB7CisgICAgYXNzZXJ0IChJZHggPCBTaXplICYmICJPdXQtb2YtYm91bmRzIEJpdCBhY2Nlc3MuIik7CisgICAgcmV0dXJuIHJlZmVyZW5jZSgqdGhpcywgSWR4KTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3JbXSh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQgKElkeCA8IFNpemUgJiYgIk91dC1vZi1ib3VuZHMgQml0IGFjY2Vzcy4iKTsKKyAgICBCaXRXb3JkIE1hc2sgPSBCaXRXb3JkKDEpIDw8IChJZHggJSBCSVRXT1JEX1NJWkUpOworICAgIHJldHVybiAoQml0c1tJZHggLyBCSVRXT1JEX1NJWkVdICYgTWFzaykgIT0gMDsKKyAgfQorCisgIGJvb2wgdGVzdCh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gKCp0aGlzKVtJZHhdOworICB9CisKKyAgLy8vIFRlc3QgaWYgYW55IGNvbW1vbiBiaXRzIGFyZSBzZXQuCisgIGJvb2wgYW55Q29tbW9uKGNvbnN0IEJpdFZlY3RvciAmUkhTKSBjb25zdCB7CisgICAgdW5zaWduZWQgVGhpc1dvcmRzID0gTnVtQml0V29yZHMoc2l6ZSgpKTsKKyAgICB1bnNpZ25lZCBSSFNXb3JkcyAgPSBOdW1CaXRXb3JkcyhSSFMuc2l6ZSgpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gc3RkOjptaW4oVGhpc1dvcmRzLCBSSFNXb3Jkcyk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKEJpdHNbaV0gJiBSSFMuQml0c1tpXSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQ29tcGFyaXNvbiBvcGVyYXRvcnMuCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBCaXRWZWN0b3IgJlJIUykgY29uc3QgeworICAgIHVuc2lnbmVkIFRoaXNXb3JkcyA9IE51bUJpdFdvcmRzKHNpemUoKSk7CisgICAgdW5zaWduZWQgUkhTV29yZHMgID0gTnVtQml0V29yZHMoUkhTLnNpemUoKSk7CisgICAgdW5zaWduZWQgaTsKKyAgICBmb3IgKGkgPSAwOyBpICE9IHN0ZDo6bWluKFRoaXNXb3JkcywgUkhTV29yZHMpOyArK2kpCisgICAgICBpZiAoQml0c1tpXSAhPSBSSFMuQml0c1tpXSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVmVyaWZ5IHRoYXQgYW55IGV4dHJhIHdvcmRzIGFyZSBhbGwgemVyb3MuCisgICAgaWYgKGkgIT0gVGhpc1dvcmRzKSB7CisgICAgICBmb3IgKDsgaSAhPSBUaGlzV29yZHM7ICsraSkKKyAgICAgICAgaWYgKEJpdHNbaV0pCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoaSAhPSBSSFNXb3JkcykgeworICAgICAgZm9yICg7IGkgIT0gUkhTV29yZHM7ICsraSkKKyAgICAgICAgaWYgKFJIUy5CaXRzW2ldKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgQml0VmVjdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBSSFMpOworICB9CisKKyAgLy8vIEludGVyc2VjdGlvbiwgdW5pb24sIGRpc2pvaW50IHVuaW9uLgorICBCaXRWZWN0b3IgJm9wZXJhdG9yJj0oY29uc3QgQml0VmVjdG9yICZSSFMpIHsKKyAgICB1bnNpZ25lZCBUaGlzV29yZHMgPSBOdW1CaXRXb3JkcyhzaXplKCkpOworICAgIHVuc2lnbmVkIFJIU1dvcmRzICA9IE51bUJpdFdvcmRzKFJIUy5zaXplKCkpOworICAgIHVuc2lnbmVkIGk7CisgICAgZm9yIChpID0gMDsgaSAhPSBzdGQ6Om1pbihUaGlzV29yZHMsIFJIU1dvcmRzKTsgKytpKQorICAgICAgQml0c1tpXSAmPSBSSFMuQml0c1tpXTsKKworICAgIC8vIEFueSBiaXRzIHRoYXQgYXJlIGp1c3QgaW4gdGhpcyBiaXR2ZWN0b3IgYmVjb21lIHplcm8sIGJlY2F1c2UgdGhleSBhcmVuJ3QKKyAgICAvLyBpbiB0aGUgUkhTIGJpdCB2ZWN0b3IuICBBbnkgd29yZHMgb25seSBpbiBSSFMgYXJlIGlnbm9yZWQgYmVjYXVzZSB0aGV5CisgICAgLy8gYXJlIGFscmVhZHkgemVybyBpbiB0aGUgTEhTLgorICAgIGZvciAoOyBpICE9IFRoaXNXb3JkczsgKytpKQorICAgICAgQml0c1tpXSA9IDA7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gcmVzZXQgLSBSZXNldCBiaXRzIHRoYXQgYXJlIHNldCBpbiBSSFMuIFNhbWUgYXMgKnRoaXMgJj0gflJIUy4KKyAgQml0VmVjdG9yICZyZXNldChjb25zdCBCaXRWZWN0b3IgJlJIUykgeworICAgIHVuc2lnbmVkIFRoaXNXb3JkcyA9IE51bUJpdFdvcmRzKHNpemUoKSk7CisgICAgdW5zaWduZWQgUkhTV29yZHMgID0gTnVtQml0V29yZHMoUkhTLnNpemUoKSk7CisgICAgdW5zaWduZWQgaTsKKyAgICBmb3IgKGkgPSAwOyBpICE9IHN0ZDo6bWluKFRoaXNXb3JkcywgUkhTV29yZHMpOyArK2kpCisgICAgICBCaXRzW2ldICY9IH5SSFMuQml0c1tpXTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gdGVzdCAtIENoZWNrIGlmIChUaGlzIC0gUkhTKSBpcyB6ZXJvLgorICAvLy8gVGhpcyBpcyB0aGUgc2FtZSBhcyByZXNldChSSFMpIGFuZCBhbnkoKS4KKyAgYm9vbCB0ZXN0KGNvbnN0IEJpdFZlY3RvciAmUkhTKSBjb25zdCB7CisgICAgdW5zaWduZWQgVGhpc1dvcmRzID0gTnVtQml0V29yZHMoc2l6ZSgpKTsKKyAgICB1bnNpZ25lZCBSSFNXb3JkcyAgPSBOdW1CaXRXb3JkcyhSSFMuc2l6ZSgpKTsKKyAgICB1bnNpZ25lZCBpOworICAgIGZvciAoaSA9IDA7IGkgIT0gc3RkOjptaW4oVGhpc1dvcmRzLCBSSFNXb3Jkcyk7ICsraSkKKyAgICAgIGlmICgoQml0c1tpXSAmIH5SSFMuQml0c1tpXSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBmb3IgKDsgaSAhPSBUaGlzV29yZHMgOyArK2kpCisgICAgICBpZiAoQml0c1tpXSAhPSAwKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEJpdFZlY3RvciAmb3BlcmF0b3J8PShjb25zdCBCaXRWZWN0b3IgJlJIUykgeworICAgIGlmIChzaXplKCkgPCBSSFMuc2l6ZSgpKQorICAgICAgcmVzaXplKFJIUy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gTnVtQml0V29yZHMoUkhTLnNpemUoKSk7IGkgIT0gZTsgKytpKQorICAgICAgQml0c1tpXSB8PSBSSFMuQml0c1tpXTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBCaXRWZWN0b3IgJm9wZXJhdG9yXj0oY29uc3QgQml0VmVjdG9yICZSSFMpIHsKKyAgICBpZiAoc2l6ZSgpIDwgUkhTLnNpemUoKSkKKyAgICAgIHJlc2l6ZShSSFMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IE51bUJpdFdvcmRzKFJIUy5zaXplKCkpOyBpICE9IGU7ICsraSkKKyAgICAgIEJpdHNbaV0gXj0gUkhTLkJpdHNbaV07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQml0VmVjdG9yICZvcGVyYXRvcj4+PSh1bnNpZ25lZCBOKSB7CisgICAgYXNzZXJ0KE4gPD0gU2l6ZSk7CisgICAgaWYgKExMVk1fVU5MSUtFTFkoZW1wdHkoKSB8fCBOID09IDApKQorICAgICAgcmV0dXJuICp0aGlzOworCisgICAgdW5zaWduZWQgTnVtV29yZHMgPSBOdW1CaXRXb3JkcyhTaXplKTsKKyAgICBhc3NlcnQoTnVtV29yZHMgPj0gMSk7CisKKyAgICB3b3JkU2hyKE4gLyBCSVRXT1JEX1NJWkUpOworCisgICAgdW5zaWduZWQgQml0RGlzdGFuY2UgPSBOICUgQklUV09SRF9TSVpFOworICAgIGlmIChCaXREaXN0YW5jZSA9PSAwKQorICAgICAgcmV0dXJuICp0aGlzOworCisgICAgLy8gV2hlbiB0aGUgc2hpZnQgc2l6ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgd29yZCBzaXplLCB0aGVuIHdlIGhhdmUKKyAgICAvLyBhIHRyaWNreSBzaXR1YXRpb24gd2hlcmUgZWFjaCB3b3JkIGluIHN1Y2Nlc3Npb24gbmVlZHMgdG8gZXh0cmFjdCBzb21lCisgICAgLy8gb2YgdGhlIGJpdHMgZnJvbSB0aGUgbmV4dCB3b3JkIGFuZCBvciB0aGVtIGludG8gdGhpcyB3b3JkIHdoaWxlCisgICAgLy8gc2hpZnRpbmcgdGhpcyB3b3JkIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBiaXRzLiAgVGhpcyBoYXMgdG8gYmUgZG9uZQorICAgIC8vIGZvciBldmVyeSB3b3JkIGluIHRoZSBhcnJheS4KKworICAgIC8vIFNpbmNlIHdlJ3JlIHNoaWZ0aW5nIGVhY2ggd29yZCByaWdodCwgc29tZSBiaXRzIHdpbGwgZmFsbCBvZmYgdGhlIGVuZAorICAgIC8vIG9mIGVhY2ggd29yZCB0byB0aGUgcmlnaHQsIGFuZCBlbXB0eSBzcGFjZSB3aWxsIGJlIGNyZWF0ZWQgb24gdGhlIGxlZnQuCisgICAgLy8gVGhlIGZpbmFsIHdvcmQgaW4gdGhlIGFycmF5IHdpbGwgbG9zZSBiaXRzIHBlcm1hbmVudGx5LCBzbyBzdGFydGluZyBhdAorICAgIC8vIHRoZSBiZWdpbm5pbmcsIHdvcmsgZm9yd2FyZHMgc2hpZnRpbmcgZWFjaCB3b3JkIHRvIHRoZSByaWdodCwgYW5kCisgICAgLy8gT1InaW5nIGluIHRoZSBiaXRzIGZyb20gdGhlIGVuZCBvZiB0aGUgbmV4dCB3b3JkIHRvIHRoZSBiZWdpbm5pbmcgb2YKKyAgICAvLyB0aGUgY3VycmVudCB3b3JkLgorCisgICAgLy8gRXhhbXBsZToKKyAgICAvLyAgIFN0YXJ0aW5nIHdpdGggezB4QUFCQkNDREQsIDB4RUVGRjAwMTEsIDB4MjIzMzQ0NTV9IGFuZCBzaGlmdGluZyByaWdodAorICAgIC8vICAgYnkgNCBiaXRzLgorICAgIC8vIFN0ZXAgMTogV29yZFswXSA+Pj0gNCAgICAgICAgICAgOyAweDBBQkJDQ0RECisgICAgLy8gU3RlcCAyOiBXb3JkWzBdIHw9IDB4MTAwMDAwMDAgICA7IDB4MUFCQkNDREQKKyAgICAvLyBTdGVwIDM6IFdvcmRbMV0gPj49IDQgICAgICAgICAgIDsgMHgwRUVGRjAwMQorICAgIC8vIFN0ZXAgNDogV29yZFsxXSB8PSAweDUwMDAwMDAwICAgOyAweDVFRUZGMDAxCisgICAgLy8gU3RlcCA1OiBXb3JkWzJdID4+PSA0ICAgICAgICAgICA7IDB4MDIzMzQ0NTUKKyAgICAvLyBSZXN1bHQ6IHsgMHgxQUJCQ0NERCwgMHg1RUVGRjAwMSwgMHgwMjMzNDQ1NSB9CisgICAgY29uc3QgQml0V29yZCBNYXNrID0gbWFza1RyYWlsaW5nT25lczxCaXRXb3JkPihCaXREaXN0YW5jZSk7CisgICAgY29uc3QgdW5zaWduZWQgTFNIID0gQklUV09SRF9TSVpFIC0gQml0RGlzdGFuY2U7CisKKyAgICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJIDwgTnVtV29yZHMgLSAxOyArK0kpIHsKKyAgICAgIEJpdHNbSV0gPj49IEJpdERpc3RhbmNlOworICAgICAgQml0c1tJXSB8PSAoQml0c1tJICsgMV0gJiBNYXNrKSA8PCBMU0g7CisgICAgfQorCisgICAgQml0c1tOdW1Xb3JkcyAtIDFdID4+PSBCaXREaXN0YW5jZTsKKworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEJpdFZlY3RvciAmb3BlcmF0b3I8PD0odW5zaWduZWQgTikgeworICAgIGFzc2VydChOIDw9IFNpemUpOworICAgIGlmIChMTFZNX1VOTElLRUxZKGVtcHR5KCkgfHwgTiA9PSAwKSkKKyAgICAgIHJldHVybiAqdGhpczsKKworICAgIHVuc2lnbmVkIE51bVdvcmRzID0gTnVtQml0V29yZHMoU2l6ZSk7CisgICAgYXNzZXJ0KE51bVdvcmRzID49IDEpOworCisgICAgd29yZFNobChOIC8gQklUV09SRF9TSVpFKTsKKworICAgIHVuc2lnbmVkIEJpdERpc3RhbmNlID0gTiAlIEJJVFdPUkRfU0laRTsKKyAgICBpZiAoQml0RGlzdGFuY2UgPT0gMCkKKyAgICAgIHJldHVybiAqdGhpczsKKworICAgIC8vIFdoZW4gdGhlIHNoaWZ0IHNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIHdvcmQgc2l6ZSwgdGhlbiB3ZSBoYXZlCisgICAgLy8gYSB0cmlja3kgc2l0dWF0aW9uIHdoZXJlIGVhY2ggd29yZCBpbiBzdWNjZXNzaW9uIG5lZWRzIHRvIGV4dHJhY3Qgc29tZQorICAgIC8vIG9mIHRoZSBiaXRzIGZyb20gdGhlIHByZXZpb3VzIHdvcmQgYW5kIG9yIHRoZW0gaW50byB0aGlzIHdvcmQgd2hpbGUKKyAgICAvLyBzaGlmdGluZyB0aGlzIHdvcmQgdG8gbWFrZSByb29tIGZvciB0aGUgbmV3IGJpdHMuICBUaGlzIGhhcyB0byBiZSBkb25lCisgICAgLy8gZm9yIGV2ZXJ5IHdvcmQgaW4gdGhlIGFycmF5LiAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBhbGdvcml0aG0gb3V0bGluZWQKKyAgICAvLyBpbiBvcGVyYXRvcj4+PSwgYnV0IGJhY2t3YXJkcy4KKworICAgIC8vIFNpbmNlIHdlJ3JlIHNoaWZ0aW5nIGVhY2ggd29yZCBsZWZ0LCBzb21lIGJpdHMgd2lsbCBmYWxsIG9mZiB0aGUgZW5kCisgICAgLy8gb2YgZWFjaCB3b3JkIHRvIHRoZSBsZWZ0LCBhbmQgZW1wdHkgc3BhY2Ugd2lsbCBiZSBjcmVhdGVkIG9uIHRoZSByaWdodC4KKyAgICAvLyBUaGUgZmlyc3Qgd29yZCBpbiB0aGUgYXJyYXkgd2lsbCBsb3NlIGJpdHMgcGVybWFuZW50bHksIHNvIHN0YXJ0aW5nIGF0CisgICAgLy8gdGhlIGVuZCwgd29yayBiYWNrd2FyZHMgc2hpZnRpbmcgZWFjaCB3b3JkIHRvIHRoZSBsZWZ0LCBhbmQgT1InaW5nCisgICAgLy8gaW4gdGhlIGJpdHMgZnJvbSB0aGUgZW5kIG9mIHRoZSBuZXh0IHdvcmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAvLyBjdXJyZW50IHdvcmQuCisKKyAgICAvLyBFeGFtcGxlOgorICAgIC8vICAgU3RhcnRpbmcgd2l0aCB7MHhBQUJCQ0NERCwgMHhFRUZGMDAxMSwgMHgyMjMzNDQ1NX0gYW5kIHNoaWZ0aW5nIGxlZnQKKyAgICAvLyAgIGJ5IDQgYml0cy4KKyAgICAvLyBTdGVwIDE6IFdvcmRbMl0gPDw9IDQgICAgICAgICAgIDsgMHgyMzM0NDU1MAorICAgIC8vIFN0ZXAgMjogV29yZFsyXSB8PSAweDAwMDAwMDBFICAgOyAweDIzMzQ0NTVFCisgICAgLy8gU3RlcCAzOiBXb3JkWzFdIDw8PSA0ICAgICAgICAgICA7IDB4RUZGMDAxMTAKKyAgICAvLyBTdGVwIDQ6IFdvcmRbMV0gfD0gMHgwMDAwMDAwQSAgIDsgMHhFRkYwMDExQQorICAgIC8vIFN0ZXAgNTogV29yZFswXSA8PD0gNCAgICAgICAgICAgOyAweEFCQkNDREQwCisgICAgLy8gUmVzdWx0OiB7IDB4QUJCQ0NERDAsIDB4RUZGMDAxMUEsIDB4MjMzNDQ1NUUgfQorICAgIGNvbnN0IEJpdFdvcmQgTWFzayA9IG1hc2tMZWFkaW5nT25lczxCaXRXb3JkPihCaXREaXN0YW5jZSk7CisgICAgY29uc3QgdW5zaWduZWQgUlNIID0gQklUV09SRF9TSVpFIC0gQml0RGlzdGFuY2U7CisKKyAgICBmb3IgKGludCBJID0gTnVtV29yZHMgLSAxOyBJID4gMDsgLS1JKSB7CisgICAgICBCaXRzW0ldIDw8PSBCaXREaXN0YW5jZTsKKyAgICAgIEJpdHNbSV0gfD0gKEJpdHNbSSAtIDFdICYgTWFzaykgPj4gUlNIOworICAgIH0KKyAgICBCaXRzWzBdIDw8PSBCaXREaXN0YW5jZTsKKyAgICBjbGVhcl91bnVzZWRfYml0cygpOworCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gQXNzaWdubWVudCBvcGVyYXRvci4KKyAgY29uc3QgQml0VmVjdG9yICZvcGVyYXRvcj0oY29uc3QgQml0VmVjdG9yICZSSFMpIHsKKyAgICBpZiAodGhpcyA9PSAmUkhTKSByZXR1cm4gKnRoaXM7CisKKyAgICBTaXplID0gUkhTLnNpemUoKTsKKyAgICB1bnNpZ25lZCBSSFNXb3JkcyA9IE51bUJpdFdvcmRzKFNpemUpOworICAgIGlmIChTaXplIDw9IGdldEJpdENhcGFjaXR5KCkpIHsKKyAgICAgIGlmIChTaXplKQorICAgICAgICBzdGQ6Om1lbWNweShCaXRzLmRhdGEoKSwgUkhTLkJpdHMuZGF0YSgpLCBSSFNXb3JkcyAqIHNpemVvZihCaXRXb3JkKSk7CisgICAgICBjbGVhcl91bnVzZWRfYml0cygpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vIEdyb3cgdGhlIGJpdHZlY3RvciB0byBoYXZlIGVub3VnaCBlbGVtZW50cy4KKyAgICB1bnNpZ25lZCBOZXdDYXBhY2l0eSA9IFJIU1dvcmRzOworICAgIGFzc2VydChOZXdDYXBhY2l0eSA+IDAgJiYgIm5lZ2F0aXZlIGNhcGFjaXR5PyIpOworICAgIGF1dG8gTmV3Qml0cyA9IGFsbG9jYXRlKE5ld0NhcGFjaXR5KTsKKyAgICBzdGQ6Om1lbWNweShOZXdCaXRzLmRhdGEoKSwgUkhTLkJpdHMuZGF0YSgpLCBOZXdDYXBhY2l0eSAqIHNpemVvZihCaXRXb3JkKSk7CisKKyAgICAvLyBEZXN0cm95IHRoZSBvbGQgYml0cy4KKyAgICBzdGQ6OmZyZWUoQml0cy5kYXRhKCkpOworICAgIEJpdHMgPSBOZXdCaXRzOworCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgQml0VmVjdG9yICZvcGVyYXRvcj0oQml0VmVjdG9yICYmUkhTKSB7CisgICAgaWYgKHRoaXMgPT0gJlJIUykgcmV0dXJuICp0aGlzOworCisgICAgc3RkOjpmcmVlKEJpdHMuZGF0YSgpKTsKKyAgICBCaXRzID0gUkhTLkJpdHM7CisgICAgU2l6ZSA9IFJIUy5TaXplOworCisgICAgUkhTLkJpdHMgPSBNdXRhYmxlQXJyYXlSZWY8Qml0V29yZD4oKTsKKyAgICBSSFMuU2l6ZSA9IDA7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIHN3YXAoQml0VmVjdG9yICZSSFMpIHsKKyAgICBzdGQ6OnN3YXAoQml0cywgUkhTLkJpdHMpOworICAgIHN0ZDo6c3dhcChTaXplLCBSSFMuU2l6ZSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUG9ydGFibGUgYml0IG1hc2sgb3BlcmF0aW9ucy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIFRoZXNlIG1ldGhvZHMgYWxsIG9wZXJhdGUgb24gYXJyYXlzIG9mIHVpbnQzMl90LCBlYWNoIGhvbGRpbmcgMzIgYml0cy4gVGhlCisgIC8vIGZpeGVkIHdvcmQgc2l6ZSBtYWtlcyBpdCBlYXNpZXIgdG8gd29yayB3aXRoIGxpdGVyYWwgYml0IHZlY3RvciBjb25zdGFudHMKKyAgLy8gaW4gcG9ydGFibGUgY29kZS4KKyAgLy8KKyAgLy8gVGhlIExTQiBpbiBlYWNoIHdvcmQgaXMgdGhlIGxvd2VzdCBudW1iZXJlZCBiaXQuICBUaGUgc2l6ZSBvZiBhIHBvcnRhYmxlCisgIC8vIGJpdCBtYXNrIGlzIGFsd2F5cyBhIHdob2xlIG11bHRpcGxlIG9mIDMyIGJpdHMuICBJZiBubyBiaXQgbWFzayBzaXplIGlzCisgIC8vIGdpdmVuLCB0aGUgYml0IG1hc2sgaXMgYXNzdW1lZCB0byBjb3ZlciB0aGUgZW50aXJlIEJpdFZlY3Rvci4KKworICAvLy8gc2V0Qml0c0luTWFzayAtIEFkZCAnMScgYml0cyBmcm9tIE1hc2sgdG8gdGhpcyB2ZWN0b3IuIERvbid0IHJlc2l6ZS4KKyAgLy8vIFRoaXMgY29tcHV0ZXMgIip0aGlzIHw9IE1hc2siLgorICB2b2lkIHNldEJpdHNJbk1hc2soY29uc3QgdWludDMyX3QgKk1hc2ssIHVuc2lnbmVkIE1hc2tXb3JkcyA9IH4wdSkgeworICAgIGFwcGx5TWFzazx0cnVlLCBmYWxzZT4oTWFzaywgTWFza1dvcmRzKTsKKyAgfQorCisgIC8vLyBjbGVhckJpdHNJbk1hc2sgLSBDbGVhciBhbnkgYml0cyBpbiB0aGlzIHZlY3RvciB0aGF0IGFyZSBzZXQgaW4gTWFzay4KKyAgLy8vIERvbid0IHJlc2l6ZS4gVGhpcyBjb21wdXRlcyAiKnRoaXMgJj0gfk1hc2siLgorICB2b2lkIGNsZWFyQml0c0luTWFzayhjb25zdCB1aW50MzJfdCAqTWFzaywgdW5zaWduZWQgTWFza1dvcmRzID0gfjB1KSB7CisgICAgYXBwbHlNYXNrPGZhbHNlLCBmYWxzZT4oTWFzaywgTWFza1dvcmRzKTsKKyAgfQorCisgIC8vLyBzZXRCaXRzTm90SW5NYXNrIC0gQWRkIGEgYml0IHRvIHRoaXMgdmVjdG9yIGZvciBldmVyeSAnMCcgYml0IGluIE1hc2suCisgIC8vLyBEb24ndCByZXNpemUuICBUaGlzIGNvbXB1dGVzICIqdGhpcyB8PSB+TWFzayIuCisgIHZvaWQgc2V0Qml0c05vdEluTWFzayhjb25zdCB1aW50MzJfdCAqTWFzaywgdW5zaWduZWQgTWFza1dvcmRzID0gfjB1KSB7CisgICAgYXBwbHlNYXNrPHRydWUsIHRydWU+KE1hc2ssIE1hc2tXb3Jkcyk7CisgIH0KKworICAvLy8gY2xlYXJCaXRzTm90SW5NYXNrIC0gQ2xlYXIgYSBiaXQgaW4gdGhpcyB2ZWN0b3IgZm9yIGV2ZXJ5ICcwJyBiaXQgaW4gTWFzay4KKyAgLy8vIERvbid0IHJlc2l6ZS4gIFRoaXMgY29tcHV0ZXMgIip0aGlzICY9IE1hc2siLgorICB2b2lkIGNsZWFyQml0c05vdEluTWFzayhjb25zdCB1aW50MzJfdCAqTWFzaywgdW5zaWduZWQgTWFza1dvcmRzID0gfjB1KSB7CisgICAgYXBwbHlNYXNrPGZhbHNlLCB0cnVlPihNYXNrLCBNYXNrV29yZHMpOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgUGVyZm9ybSBhIGxvZ2ljYWwgbGVmdCBzaGlmdCBvZiBccCBDb3VudCB3b3JkcyBieSBtb3ZpbmcgZXZlcnl0aGluZworICAvLy8gXHAgQ291bnQgd29yZHMgdG8gdGhlIHJpZ2h0IGluIG1lbW9yeS4KKyAgLy8vCisgIC8vLyBXaGlsZSBjb25mdXNpbmcsIHdvcmRzIGFyZSBzdG9yZWQgZnJvbSBsZWFzdCBzaWduaWZpY2FudCBhdCBCaXRzWzBdIHRvCisgIC8vLyBtb3N0IHNpZ25pZmljYW50IGF0IEJpdHNbTnVtV29yZHMtMV0uICBBIGxvZ2ljYWwgc2hpZnQgbGVmdCwgaG93ZXZlciwKKyAgLy8vIG1vdmVzIHRoZSBjdXJyZW50IGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byBhIGhpZ2hlciBsb2dpY2FsIGluZGV4LCBhbmQKKyAgLy8vIGZpbGxzIHRoZSBwcmV2aW91cyBsZWFzdCBzaWduaWZpY2FudCBiaXRzIHdpdGggMC4gIFRodXMsIHdlIGFjdHVhbGx5CisgIC8vLyBuZWVkIHRvIG1vdmUgdGhlIGJ5dGVzIG9mIHRoZSBtZW1vcnkgdG8gdGhlIHJpZ2h0LCBub3QgdG8gdGhlIGxlZnQuCisgIC8vLyBFeGFtcGxlOgorICAvLy8gICBXb3JkcyA9IFsweEJCQkJBQUFBLCAweERERERGRkZGLCAweDAwMDAwMDAwLCAweEREREQwMDAwXQorICAvLy8gcmVwcmVzZW50cyBhIEJpdFZlY3RvciB3aGVyZSAweEJCQkJBQUFBIGNvbnRhaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50CisgIC8vLyBiaXRzLiAgU28gaWYgd2Ugd2FudCB0byBzaGlmdCB0aGUgQml0VmVjdG9yIGxlZnQgYnkgMiB3b3Jkcywgd2UgbmVlZCB0bworICAvLy8gdHVybiB0aGlzIGludG8gMHgwMDAwMDAwMCAweDAwMDAwMDAwIDB4QkJCQkFBQUEgMHhERERERkZGRiBieSB1c2luZyBhCisgIC8vLyBtZW1tb3ZlIHdoaWNoIG1vdmVzIHJpZ2h0LCBub3QgbGVmdC4KKyAgdm9pZCB3b3JkU2hsKHVpbnQzMl90IENvdW50KSB7CisgICAgaWYgKENvdW50ID09IDApCisgICAgICByZXR1cm47CisKKyAgICB1aW50MzJfdCBOdW1Xb3JkcyA9IE51bUJpdFdvcmRzKFNpemUpOworCisgICAgYXV0byBTcmMgPSBCaXRzLnRha2VfZnJvbnQoTnVtV29yZHMpLmRyb3BfYmFjayhDb3VudCk7CisgICAgYXV0byBEZXN0ID0gQml0cy50YWtlX2Zyb250KE51bVdvcmRzKS5kcm9wX2Zyb250KENvdW50KTsKKworICAgIC8vIFNpbmNlIHdlIGFsd2F5cyBtb3ZlIFdvcmQtc2l6ZWQgY2h1bmtzIG9mIGRhdGEgd2l0aCBzcmMgYW5kIGRlc3QgYm90aAorICAgIC8vIGFsaWduZWQgdG8gYSB3b3JkLWJvdW5kYXJ5LCB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGVuZGlhbm5lc3MKKyAgICAvLyBoZXJlLgorICAgIHN0ZDo6bWVtbW92ZShEZXN0LmJlZ2luKCksIFNyYy5iZWdpbigpLCBEZXN0LnNpemUoKSAqIHNpemVvZihCaXRXb3JkKSk7CisgICAgc3RkOjptZW1zZXQoQml0cy5kYXRhKCksIDAsIENvdW50ICogc2l6ZW9mKEJpdFdvcmQpKTsKKyAgICBjbGVhcl91bnVzZWRfYml0cygpOworICB9CisKKyAgLy8vIFxicmllZiBQZXJmb3JtIGEgbG9naWNhbCByaWdodCBzaGlmdCBvZiBccCBDb3VudCB3b3JkcyBieSBtb3ZpbmcgdGhvc2UKKyAgLy8vIHdvcmRzIHRvIHRoZSBsZWZ0IGluIG1lbW9yeS4gIFNlZSB3b3JkU2hsIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAvLy8KKyAgdm9pZCB3b3JkU2hyKHVpbnQzMl90IENvdW50KSB7CisgICAgaWYgKENvdW50ID09IDApCisgICAgICByZXR1cm47CisKKyAgICB1aW50MzJfdCBOdW1Xb3JkcyA9IE51bUJpdFdvcmRzKFNpemUpOworCisgICAgYXV0byBTcmMgPSBCaXRzLnRha2VfZnJvbnQoTnVtV29yZHMpLmRyb3BfZnJvbnQoQ291bnQpOworICAgIGF1dG8gRGVzdCA9IEJpdHMudGFrZV9mcm9udChOdW1Xb3JkcykuZHJvcF9iYWNrKENvdW50KTsKKyAgICBhc3NlcnQoRGVzdC5zaXplKCkgPT0gU3JjLnNpemUoKSk7CisKKyAgICBzdGQ6Om1lbW1vdmUoRGVzdC5iZWdpbigpLCBTcmMuYmVnaW4oKSwgRGVzdC5zaXplKCkgKiBzaXplb2YoQml0V29yZCkpOworICAgIHN0ZDo6bWVtc2V0KERlc3QuZW5kKCksIDAsIENvdW50ICogc2l6ZW9mKEJpdFdvcmQpKTsKKyAgfQorCisgIE11dGFibGVBcnJheVJlZjxCaXRXb3JkPiBhbGxvY2F0ZShzaXplX3QgTnVtV29yZHMpIHsKKyAgICBCaXRXb3JkICpSYXdCaXRzID0gc3RhdGljX2Nhc3Q8Qml0V29yZCAqPigKKyAgICAgICAgc2FmZV9tYWxsb2MoTnVtV29yZHMgKiBzaXplb2YoQml0V29yZCkpKTsKKyAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPEJpdFdvcmQ+KFJhd0JpdHMsIE51bVdvcmRzKTsKKyAgfQorCisgIGludCBuZXh0X3Vuc2V0X2luX3dvcmQoaW50IFdvcmRJbmRleCwgQml0V29yZCBXb3JkKSBjb25zdCB7CisgICAgdW5zaWduZWQgUmVzdWx0ID0gV29yZEluZGV4ICogQklUV09SRF9TSVpFICsgY291bnRUcmFpbGluZ09uZXMoV29yZCk7CisgICAgcmV0dXJuIFJlc3VsdCA8IHNpemUoKSA/IFJlc3VsdCA6IC0xOworICB9CisKKyAgdW5zaWduZWQgTnVtQml0V29yZHModW5zaWduZWQgUykgY29uc3QgeworICAgIHJldHVybiAoUyArIEJJVFdPUkRfU0laRS0xKSAvIEJJVFdPUkRfU0laRTsKKyAgfQorCisgIC8vIFNldCB0aGUgdW51c2VkIGJpdHMgaW4gdGhlIGhpZ2ggd29yZHMuCisgIHZvaWQgc2V0X3VudXNlZF9iaXRzKGJvb2wgdCA9IHRydWUpIHsKKyAgICAvLyAgU2V0IGhpZ2ggd29yZHMgZmlyc3QuCisgICAgdW5zaWduZWQgVXNlZFdvcmRzID0gTnVtQml0V29yZHMoU2l6ZSk7CisgICAgaWYgKEJpdHMuc2l6ZSgpID4gVXNlZFdvcmRzKQorICAgICAgaW5pdF93b3JkcyhCaXRzLmRyb3BfZnJvbnQoVXNlZFdvcmRzKSwgdCk7CisKKyAgICAvLyAgVGhlbiBzZXQgYW55IHN0cmF5IGhpZ2ggYml0cyBvZiB0aGUgbGFzdCB1c2VkIHdvcmQuCisgICAgdW5zaWduZWQgRXh0cmFCaXRzID0gU2l6ZSAlIEJJVFdPUkRfU0laRTsKKyAgICBpZiAoRXh0cmFCaXRzKSB7CisgICAgICBCaXRXb3JkIEV4dHJhQml0TWFzayA9IH4wVUwgPDwgRXh0cmFCaXRzOworICAgICAgaWYgKHQpCisgICAgICAgIEJpdHNbVXNlZFdvcmRzLTFdIHw9IEV4dHJhQml0TWFzazsKKyAgICAgIGVsc2UKKyAgICAgICAgQml0c1tVc2VkV29yZHMtMV0gJj0gfkV4dHJhQml0TWFzazsKKyAgICB9CisgIH0KKworICAvLyBDbGVhciB0aGUgdW51c2VkIGJpdHMgaW4gdGhlIGhpZ2ggd29yZHMuCisgIHZvaWQgY2xlYXJfdW51c2VkX2JpdHMoKSB7CisgICAgc2V0X3VudXNlZF9iaXRzKGZhbHNlKTsKKyAgfQorCisgIHZvaWQgZ3Jvdyh1bnNpZ25lZCBOZXdTaXplKSB7CisgICAgc2l6ZV90IE5ld0NhcGFjaXR5ID0gc3RkOjptYXg8c2l6ZV90PihOdW1CaXRXb3JkcyhOZXdTaXplKSwgQml0cy5zaXplKCkgKiAyKTsKKyAgICBhc3NlcnQoTmV3Q2FwYWNpdHkgPiAwICYmICJyZWFsbG9jLWluZyB6ZXJvIHNwYWNlIik7CisgICAgQml0V29yZCAqTmV3Qml0cyA9IHN0YXRpY19jYXN0PEJpdFdvcmQgKj4oCisgICAgICAgIHNhZmVfcmVhbGxvYyhCaXRzLmRhdGEoKSwgTmV3Q2FwYWNpdHkgKiBzaXplb2YoQml0V29yZCkpKTsKKyAgICBCaXRzID0gTXV0YWJsZUFycmF5UmVmPEJpdFdvcmQ+KE5ld0JpdHMsIE5ld0NhcGFjaXR5KTsKKyAgICBjbGVhcl91bnVzZWRfYml0cygpOworICB9CisKKyAgdm9pZCBpbml0X3dvcmRzKE11dGFibGVBcnJheVJlZjxCaXRXb3JkPiBCLCBib29sIHQpIHsKKyAgICBpZiAoQi5zaXplKCkgPiAwKQorICAgICAgbWVtc2V0KEIuZGF0YSgpLCAwIC0gKGludCl0LCBCLnNpemUoKSAqIHNpemVvZihCaXRXb3JkKSk7CisgIH0KKworICB0ZW1wbGF0ZTxib29sIEFkZEJpdHMsIGJvb2wgSW52ZXJ0TWFzaz4KKyAgdm9pZCBhcHBseU1hc2soY29uc3QgdWludDMyX3QgKk1hc2ssIHVuc2lnbmVkIE1hc2tXb3JkcykgeworICAgIHN0YXRpY19hc3NlcnQoQklUV09SRF9TSVpFICUgMzIgPT0gMCwgIlVuc3VwcG9ydGVkIEJpdFdvcmQgc2l6ZS4iKTsKKyAgICBNYXNrV29yZHMgPSBzdGQ6Om1pbihNYXNrV29yZHMsIChzaXplKCkgKyAzMSkgLyAzMik7CisgICAgY29uc3QgdW5zaWduZWQgU2NhbGUgPSBCSVRXT1JEX1NJWkUgLyAzMjsKKyAgICB1bnNpZ25lZCBpOworICAgIGZvciAoaSA9IDA7IE1hc2tXb3JkcyA+PSBTY2FsZTsgKytpLCBNYXNrV29yZHMgLT0gU2NhbGUpIHsKKyAgICAgIEJpdFdvcmQgQlcgPSBCaXRzW2ldOworICAgICAgLy8gVGhpcyBpbm5lciBsb29wIHNob3VsZCB1bnJvbGwgY29tcGxldGVseSB3aGVuIEJJVFdPUkRfU0laRSA+IDMyLgorICAgICAgZm9yICh1bnNpZ25lZCBiID0gMDsgYiAhPSBCSVRXT1JEX1NJWkU7IGIgKz0gMzIpIHsKKyAgICAgICAgdWludDMyX3QgTSA9ICpNYXNrKys7CisgICAgICAgIGlmIChJbnZlcnRNYXNrKSBNID0gfk07CisgICAgICAgIGlmIChBZGRCaXRzKSBCVyB8PSAgIEJpdFdvcmQoTSkgPDwgYjsKKyAgICAgICAgZWxzZSAgICAgICAgIEJXICY9IH4oQml0V29yZChNKSA8PCBiKTsKKyAgICAgIH0KKyAgICAgIEJpdHNbaV0gPSBCVzsKKyAgICB9CisgICAgZm9yICh1bnNpZ25lZCBiID0gMDsgTWFza1dvcmRzOyBiICs9IDMyLCAtLU1hc2tXb3JkcykgeworICAgICAgdWludDMyX3QgTSA9ICpNYXNrKys7CisgICAgICBpZiAoSW52ZXJ0TWFzaykgTSA9IH5NOworICAgICAgaWYgKEFkZEJpdHMpIEJpdHNbaV0gfD0gICBCaXRXb3JkKE0pIDw8IGI7CisgICAgICBlbHNlICAgICAgICAgQml0c1tpXSAmPSB+KEJpdFdvcmQoTSkgPDwgYik7CisgICAgfQorICAgIGlmIChBZGRCaXRzKQorICAgICAgY2xlYXJfdW51c2VkX2JpdHMoKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBSZXR1cm4gdGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgYml0IHZlY3Rvci4KKyAgc2l6ZV90IGdldE1lbW9yeVNpemUoKSBjb25zdCB7IHJldHVybiBCaXRzLnNpemUoKSAqIHNpemVvZihCaXRXb3JkKTsgfQorICBzaXplX3QgZ2V0Qml0Q2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBCaXRzLnNpemUoKSAqIEJJVFdPUkRfU0laRTsgfQorfTsKKworaW5saW5lIHNpemVfdCBjYXBhY2l0eV9pbl9ieXRlcyhjb25zdCBCaXRWZWN0b3IgJlgpIHsKKyAgcmV0dXJuIFguZ2V0TWVtb3J5U2l6ZSgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCituYW1lc3BhY2Ugc3RkIHsKKyAgLy8vIEltcGxlbWVudCBzdGQ6OnN3YXAgaW4gdGVybXMgb2YgQml0VmVjdG9yIHN3YXAuCisgIGlubGluZSB2b2lkCisgIHN3YXAobGx2bTo6Qml0VmVjdG9yICZMSFMsIGxsdm06OkJpdFZlY3RvciAmUkhTKSB7CisgICAgTEhTLnN3YXAoUkhTKTsKKyAgfQorfSAvLyBlbmQgbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gTExWTV9BRFRfQklUVkVDVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0JpdG1hc2tFbnVtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9CaXRtYXNrRW51bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YzZiYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9CaXRtYXNrRW51bS5oCkBAIC0wLDAgKzEsMTUzIEBACisvLz09PS0tIGxsdm0vQURUL0JpdG1hc2tFbnVtLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0JJVE1BU0tFTlVNX0gKKyNkZWZpbmUgTExWTV9BRFRfQklUTUFTS0VOVU1fSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKworLy8vIExMVk1fTUFSS19BU19CSVRNQVNLX0VOVU0gbGV0cyB5b3Ugb3B0IGluIGFuIGluZGl2aWR1YWwgZW51bSB0eXBlIHNvIHlvdSBjYW4KKy8vLyBwZXJmb3JtIGJpdHdpc2Ugb3BlcmF0aW9ucyBvbiBpdCB3aXRob3V0IHB1dHRpbmcgc3RhdGljX2Nhc3QgZXZlcnl3aGVyZS4KKy8vLworLy8vIFxjb2RlCisvLy8gICBlbnVtIE15RW51bSB7CisvLy8gICAgIEUxID0gMSwgRTIgPSAyLCBFMyA9IDQsIEU0ID0gOCwKKy8vLyAgICAgTExWTV9NQVJLX0FTX0JJVE1BU0tfRU5VTSgvKiBMYXJnZXN0VmFsdWUgPSAqLyBFNCkKKy8vLyAgIH07CisvLy8KKy8vLyAgIHZvaWQgRm9vKCkgeworLy8vICAgICBNeUVudW0gQSA9IChFMSB8IEUyKSAmIEUzIF4gfkU0OyAvLyBMb29rLCBtYTogTm8gc3RhdGljX2Nhc3QhCisvLy8gICB9CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIE5vcm1hbGx5IHdoZW4geW91IGRvIGEgYml0d2lzZSBvcGVyYXRpb24gb24gYW4gZW51bSB2YWx1ZSwgeW91IGdldCBiYWNrIGFuCisvLy8gaW5zdGFuY2Ugb2YgdGhlIHVuZGVybHlpbmcgdHlwZSAoZS5nLiBpbnQpLiAgQnV0IHVzaW5nIHRoaXMgbWFjcm8sIGJpdHdpc2UKKy8vLyBvcHMgb24geW91ciBlbnVtIHdpbGwgcmV0dXJuIHlvdSBiYWNrIGluc3RhbmNlcyBvZiB0aGUgZW51bS4gIFRoaXMgaXMKKy8vLyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBlbnVtcyB3aGljaCByZXByZXNlbnQgYSBjb21iaW5hdGlvbiBvZiBmbGFncy4KKy8vLworLy8vIFRoZSBwYXJhbWV0ZXIgdG8gTExWTV9NQVJLX0FTX0JJVE1BU0tfRU5VTSBzaG91bGQgYmUgdGhlIGxhcmdlc3QgaW5kaXZpZHVhbAorLy8vIHZhbHVlIGluIHlvdXIgZW51bS4KKy8vLworLy8vIEFsbCBvZiB0aGUgZW51bSdzIHZhbHVlcyBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4KKyNkZWZpbmUgTExWTV9NQVJLX0FTX0JJVE1BU0tfRU5VTShMYXJnZXN0VmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIExMVk1fQklUTUFTS19MQVJHRVNUX0VOVU1FUkFUT1IgPSBMYXJnZXN0VmFsdWUKKworLy8vIExMVk1fRU5BQkxFX0JJVE1BU0tfRU5VTVNfSU5fTkFNRVNQQUNFKCkgcHVsbHMgdGhlIG9wZXJhdG9yIG92ZXJsb2FkcyB1c2VkCisvLy8gYnkgTExWTV9NQVJLX0FTX0JJVE1BU0tfRU5VTSBpbnRvIHRoZSBjdXJyZW50IG5hbWVzcGFjZS4KKy8vLworLy8vIFN1cHBvc2UgeW91IGhhdmUgYW4gZW51bSBmb286OmJhcjo6TXlFbnVtLiAgQmVmb3JlIHVzaW5nCisvLy8gTExWTV9NQVJLX0FTX0JJVE1BU0tfRU5VTSBvbiBNeUVudW0sIHlvdSBtdXN0IHB1dAorLy8vIExMVk1fRU5BQkxFX0JJVE1BU0tfRU5VTVNfSU5fTkFNRVNQQUNFKCkgc29tZXdoZXJlIGluc2lkZSBuYW1lc3BhY2UgZm9vIG9yCisvLy8gbmFtZXNwYWNlIGZvbzo6YmFyLiAgVGhpcyBhbGxvd3MgdGhlIHJlbGV2YW50IG9wZXJhdG9yIG92ZXJsb2FkcyB0byBiZSBmb3VuZAorLy8vIGJ5IEFETC4KKy8vLworLy8vIFlvdSBkb24ndCBuZWVkIHRvIHVzZSB0aGlzIG1hY3JvIGluIG5hbWVzcGFjZSBsbHZtOyBpdCdzIGRvbmUgYXQgdGhlIGJvdHRvbQorLy8vIG9mIHRoaXMgZmlsZS4KKyNkZWZpbmUgTExWTV9FTkFCTEVfQklUTUFTS19FTlVNU19JTl9OQU1FU1BBQ0UoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVzaW5nIDo6bGx2bTo6Qml0bWFza0VudW1EZXRhaWw6Om9wZXJhdG9yfjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1c2luZyA6Omxsdm06OkJpdG1hc2tFbnVtRGV0YWlsOjpvcGVyYXRvcnw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdXNpbmcgOjpsbHZtOjpCaXRtYXNrRW51bURldGFpbDo6b3BlcmF0b3ImOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVzaW5nIDo6bGx2bTo6Qml0bWFza0VudW1EZXRhaWw6Om9wZXJhdG9yXjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1c2luZyA6Omxsdm06OkJpdG1hc2tFbnVtRGV0YWlsOjpvcGVyYXRvcnw9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdXNpbmcgOjpsbHZtOjpCaXRtYXNrRW51bURldGFpbDo6b3BlcmF0b3ImPTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIEZvcmNlIGEgc2VtaWNvbG9uIGF0IHRoZSBlbmQgb2YgdGhpcyBtYWNyby4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1c2luZyA6Omxsdm06OkJpdG1hc2tFbnVtRGV0YWlsOjpvcGVyYXRvcl49CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFRyYWl0cyBjbGFzcyB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBlbnVtIGhhcyBhCisvLy8gTExWTV9CSVRNQVNLX0xBUkdFU1RfRU5VTUVSQVRPUiBlbnVtZXJhdG9yLgordGVtcGxhdGUgPHR5cGVuYW1lIEUsIHR5cGVuYW1lIEVuYWJsZSA9IHZvaWQ+CitzdHJ1Y3QgaXNfYml0bWFza19lbnVtIDogc3RkOjpmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KK3N0cnVjdCBpc19iaXRtYXNrX2VudW08CisgICAgRSwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c2l6ZW9mKEU6OkxMVk1fQklUTUFTS19MQVJHRVNUX0VOVU1FUkFUT1IpID49CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD46OnR5cGU+IDogc3RkOjp0cnVlX3R5cGUge307CituYW1lc3BhY2UgQml0bWFza0VudW1EZXRhaWwgeworCisvLy8gR2V0IGEgYml0bWFzayB3aXRoIDFzIGluIGFsbCBwbGFjZXMgdXAgdG8gdGhlIGhpZ2gtb3JkZXIgYml0IG9mIEUncyBsYXJnZXN0CisvLy8gdmFsdWUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4gdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8RT46OnR5cGUgTWFzaygpIHsKKyAgLy8gT24gb3ZlcmZsb3csIE5leHRQb3dlck9mMiByZXR1cm5zIHplcm8gd2l0aCB0aGUgdHlwZSB1aW50NjRfdCwgc28KKyAgLy8gc3VidHJhY3RpbmcgMSBnaXZlcyB1cyB0aGUgbWFzayB3aXRoIGFsbCBiaXRzIHNldCwgbGlrZSB3ZSB3YW50LgorICByZXR1cm4gTmV4dFBvd2VyT2YyKHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlPigKKyAgICAgICAgICAgICBFOjpMTFZNX0JJVE1BU0tfTEFSR0VTVF9FTlVNRVJBVE9SKSkgLQorICAgICAgICAgMTsKK30KKworLy8vIENoZWNrIHRoYXQgVmFsIGlzIGluIHJhbmdlIGZvciBFLCBhbmQgcmV0dXJuIFZhbCBjYXN0IHRvIEUncyB1bmRlcmx5aW5nCisvLy8gdHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFPiB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZSBVbmRlcmx5aW5nKEUgVmFsKSB7CisgIGF1dG8gVSA9IHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlPihWYWwpOworICBhc3NlcnQoVSA+PSAwICYmICJOZWdhdGl2ZSBlbnVtIHZhbHVlcyBhcmUgbm90IGFsbG93ZWQuIik7CisgIGFzc2VydChVIDw9IE1hc2s8RT4oKSAmJiAiRW51bSB2YWx1ZSB0b28gbGFyZ2UgKG9yIGxhcmdlc3QgdmFsIHRvbyBzbWFsbD8pIik7CisgIHJldHVybiBVOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRSwKKyAgICAgICAgICB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGlzX2JpdG1hc2tfZW51bTxFPjo6dmFsdWU+Ojp0eXBlPgorRSBvcGVyYXRvcn4oRSBWYWwpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEU+KH5VbmRlcmx5aW5nKFZhbCkgJiBNYXNrPEU+KCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRSwKKyAgICAgICAgICB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGlzX2JpdG1hc2tfZW51bTxFPjo6dmFsdWU+Ojp0eXBlPgorRSBvcGVyYXRvcnwoRSBMSFMsIEUgUkhTKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxFPihVbmRlcmx5aW5nKExIUykgfCBVbmRlcmx5aW5nKFJIUykpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRSwKKyAgICAgICAgICB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGlzX2JpdG1hc2tfZW51bTxFPjo6dmFsdWU+Ojp0eXBlPgorRSBvcGVyYXRvciYoRSBMSFMsIEUgUkhTKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxFPihVbmRlcmx5aW5nKExIUykgJiBVbmRlcmx5aW5nKFJIUykpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRSwKKyAgICAgICAgICB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGlzX2JpdG1hc2tfZW51bTxFPjo6dmFsdWU+Ojp0eXBlPgorRSBvcGVyYXRvcl4oRSBMSFMsIEUgUkhTKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxFPihVbmRlcmx5aW5nKExIUykgXiBVbmRlcmx5aW5nKFJIUykpOworfQorCisvLyB8PSwgJj0sIGFuZCBePSByZXR1cm4gYSByZWZlcmVuY2UgdG8gTEhTLCB0byBtYXRjaCB0aGUgYmVoYXZpb3Igb2YgdGhlCisvLyBvcGVyYXRvcnMgb24gYnVpbHRpbiB0eXBlcy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIEUsCisgICAgICAgICAgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxpc19iaXRtYXNrX2VudW08RT46OnZhbHVlPjo6dHlwZT4KK0UgJm9wZXJhdG9yfD0oRSAmTEhTLCBFIFJIUykgeworICBMSFMgPSBMSFMgfCBSSFM7CisgIHJldHVybiBMSFM7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFLAorICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aXNfYml0bWFza19lbnVtPEU+Ojp2YWx1ZT46OnR5cGU+CitFICZvcGVyYXRvciY9KEUgJkxIUywgRSBSSFMpIHsKKyAgTEhTID0gTEhTICYgUkhTOworICByZXR1cm4gTEhTOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRSwKKyAgICAgICAgICB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGlzX2JpdG1hc2tfZW51bTxFPjo6dmFsdWU+Ojp0eXBlPgorRSAmb3BlcmF0b3JePShFICZMSFMsIEUgUkhTKSB7CisgIExIUyA9IExIUyBeIFJIUzsKKyAgcmV0dXJuIExIUzsKK30KKworfSAvLyBuYW1lc3BhY2UgQml0bWFza0VudW1EZXRhaWwKKworLy8gRW5hYmxlIGJpdG1hc2sgZW51bXMgaW4gbmFtZXNwYWNlIDo6bGx2bSBhbmQgYWxsIG5lc3RlZCBuYW1lc3BhY2VzLgorTExWTV9FTkFCTEVfQklUTUFTS19FTlVNU19JTl9OQU1FU1BBQ0UoKTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0JyZWFkdGhGaXJzdEl0ZXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9CcmVhZHRoRmlyc3RJdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYzYzYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9CcmVhZHRoRmlyc3RJdGVyYXRvci5oCkBAIC0wLDAgKzEsMTYzIEBACisvLz09PS0gbGx2bS9BRFQvQnJlYWR0aEZpcnN0SXRlcmF0b3IuaCAtIEJyZWFkdGggRmlyc3QgaXRlcmF0b3IgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBidWlsZHMgb24gdGhlIEFEVC9HcmFwaFRyYWl0cy5oIGZpbGUgdG8gYnVpbGQgYSBnZW5lcmljIGJyZWFkdGgKKy8vIGZpcnN0IGdyYXBoIGl0ZXJhdG9yLiAgVGhpcyBmaWxlIGV4cG9zZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMvdHlwZXM6CisvLworLy8gYmZfYmVnaW4vYmZfZW5kL2JmX2l0ZXJhdG9yCisvLyAgICogTm9ybWFsIGJyZWFkdGgtZmlyc3QgaXRlcmF0aW9uIC0gdmlzaXQgYSBncmFwaCBsZXZlbC1ieS1sZXZlbC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0JSRUFEVEhGSVJTVElURVJBVE9SX0gKKyNkZWZpbmUgTExWTV9BRFRfQlJFQURUSEZJUlNUSVRFUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLyBiZl9pdGVyYXRvcl9zdG9yYWdlIC0gQSBwcml2YXRlIGNsYXNzIHdoaWNoIGlzIHVzZWQgdG8gZmlndXJlIG91dCB3aGVyZSB0bworLy8gc3RvcmUgdGhlIHZpc2l0ZWQgc2V0LiBXZSBvbmx5IHByb3ZpZGUgYSBub24tZXh0ZXJuYWwgdmFyaWFudCBmb3Igbm93LgordGVtcGxhdGUgPGNsYXNzIFNldFR5cGU+IGNsYXNzIGJmX2l0ZXJhdG9yX3N0b3JhZ2UgeworcHVibGljOgorICBTZXRUeXBlIFZpc2l0ZWQ7Cit9OworCisvLyBUaGUgdmlzaXRlZCBzdGF0ZSBmb3IgdGhlIGl0ZXJhdGlvbiBpcyBhIHNpbXBsZSBzZXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVJlZiwgdW5zaWduZWQgU21hbGxTaXplID0gOD4KK3VzaW5nIGJmX2l0ZXJhdG9yX2RlZmF1bHRfc2V0ID0gU21hbGxQdHJTZXQ8Tm9kZVJlZiwgU21hbGxTaXplPjsKKworLy8gR2VuZXJpYyBCcmVhZHRoIGZpcnN0IHNlYXJjaCBpdGVyYXRvci4KK3RlbXBsYXRlIDxjbGFzcyBHcmFwaFQsCisgICAgICAgICAgY2xhc3MgU2V0VHlwZSA9CisgICAgICAgICAgICAgIGJmX2l0ZXJhdG9yX2RlZmF1bHRfc2V0PHR5cGVuYW1lIEdyYXBoVHJhaXRzPEdyYXBoVD46Ok5vZGVSZWY+LAorICAgICAgICAgIGNsYXNzIEdUID0gR3JhcGhUcmFpdHM8R3JhcGhUPj4KK2NsYXNzIGJmX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCB0eXBlbmFtZSBHVDo6Tm9kZVJlZj4sCisgICAgICBwdWJsaWMgYmZfaXRlcmF0b3Jfc3RvcmFnZTxTZXRUeXBlPiB7CisgIHVzaW5nIHN1cGVyID0gc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCB0eXBlbmFtZSBHVDo6Tm9kZVJlZj47CisKKyAgdXNpbmcgTm9kZVJlZiA9IHR5cGVuYW1lIEdUOjpOb2RlUmVmOworICB1c2luZyBDaGlsZEl0VHkgPSB0eXBlbmFtZSBHVDo6Q2hpbGRJdGVyYXRvclR5cGU7CisKKyAgLy8gRmlyc3QgZWxlbWVudCBpcyB0aGUgbm9kZSByZWZlcmVuY2UsIHNlY29uZCBpcyB0aGUgbmV4dCBjaGlsZCB0byB2aXNpdC4KKyAgdXNpbmcgUXVldWVFbGVtZW50ID0gc3RkOjpwYWlyPE5vZGVSZWYsIE9wdGlvbmFsPENoaWxkSXRUeT4+OworCisgIC8vIFZpc2l0IHF1ZXVlIC0gdXNlZCB0byBtYWludGFpbiBCRlMgb3JkZXJpbmcuCisgIC8vIE9wdGlvbmFsPD4gYmVjYXVzZSB3ZSBuZWVkIG1hcmtlcnMgZm9yIGxldmVscy4KKyAgc3RkOjpxdWV1ZTxPcHRpb25hbDxRdWV1ZUVsZW1lbnQ+PiBWaXNpdFF1ZXVlOworCisgIC8vIEN1cnJlbnQgbGV2ZWwuCisgIHVuc2lnbmVkIExldmVsOworCitwcml2YXRlOgorICBpbmxpbmUgYmZfaXRlcmF0b3IoTm9kZVJlZiBOb2RlKSB7CisgICAgdGhpcy0+VmlzaXRlZC5pbnNlcnQoTm9kZSk7CisgICAgTGV2ZWwgPSAwOworCisgICAgLy8gQWxzbywgaW5zZXJ0IGEgZHVtbXkgbm9kZSBhcyBtYXJrZXIuCisgICAgVmlzaXRRdWV1ZS5wdXNoKFF1ZXVlRWxlbWVudChOb2RlLCBOb25lKSk7CisgICAgVmlzaXRRdWV1ZS5wdXNoKE5vbmUpOworICB9CisKKyAgaW5saW5lIGJmX2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgIGlubGluZSB2b2lkIHRvTmV4dCgpIHsKKyAgICBPcHRpb25hbDxRdWV1ZUVsZW1lbnQ+IEhlYWQgPSBWaXNpdFF1ZXVlLmZyb250KCk7CisgICAgUXVldWVFbGVtZW50IEggPSBIZWFkLmdldFZhbHVlKCk7CisgICAgTm9kZVJlZiBOb2RlID0gSC5maXJzdDsKKyAgICBPcHRpb25hbDxDaGlsZEl0VHk+ICZDaGlsZEl0ID0gSC5zZWNvbmQ7CisKKyAgICBpZiAoIUNoaWxkSXQpCisgICAgICBDaGlsZEl0LmVtcGxhY2UoR1Q6OmNoaWxkX2JlZ2luKE5vZGUpKTsKKyAgICB3aGlsZSAoKkNoaWxkSXQgIT0gR1Q6OmNoaWxkX2VuZChOb2RlKSkgeworICAgICAgTm9kZVJlZiBOZXh0ID0gKigqQ2hpbGRJdCkrKzsKKworICAgICAgLy8gQWxyZWFkeSB2aXNpdGVkPworICAgICAgaWYgKHRoaXMtPlZpc2l0ZWQuaW5zZXJ0KE5leHQpLnNlY29uZCkKKyAgICAgICAgVmlzaXRRdWV1ZS5wdXNoKFF1ZXVlRWxlbWVudChOZXh0LCBOb25lKSk7CisgICAgfQorICAgIFZpc2l0UXVldWUucG9wKCk7CisKKyAgICAvLyBHbyB0byB0aGUgbmV4dCBlbGVtZW50IHNraXBwaW5nIG1hcmtlcnMgaWYgbmVlZGVkLgorICAgIGlmICghVmlzaXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICBIZWFkID0gVmlzaXRRdWV1ZS5mcm9udCgpOworICAgICAgaWYgKEhlYWQgIT0gTm9uZSkKKyAgICAgICAgcmV0dXJuOworICAgICAgTGV2ZWwgKz0gMTsKKyAgICAgIFZpc2l0UXVldWUucG9wKCk7CisKKyAgICAgIC8vIERvbid0IHB1c2ggYW5vdGhlciBtYXJrZXIgaWYgdGhpcyBpcyB0aGUgbGFzdAorICAgICAgLy8gZWxlbWVudC4KKyAgICAgIGlmICghVmlzaXRRdWV1ZS5lbXB0eSgpKQorICAgICAgICBWaXNpdFF1ZXVlLnB1c2goTm9uZSk7CisgICAgfQorICB9CisKK3B1YmxpYzoKKyAgdXNpbmcgcG9pbnRlciA9IHR5cGVuYW1lIHN1cGVyOjpwb2ludGVyOworCisgIC8vIFByb3ZpZGUgc3RhdGljIGJlZ2luIGFuZCBlbmQgbWV0aG9kcyBhcyBvdXIgcHVibGljICJjb25zdHJ1Y3RvcnMiCisgIHN0YXRpYyBiZl9pdGVyYXRvciBiZWdpbihjb25zdCBHcmFwaFQgJkcpIHsKKyAgICByZXR1cm4gYmZfaXRlcmF0b3IoR1Q6OmdldEVudHJ5Tm9kZShHKSk7CisgIH0KKworICBzdGF0aWMgYmZfaXRlcmF0b3IgZW5kKGNvbnN0IEdyYXBoVCAmRykgeyByZXR1cm4gYmZfaXRlcmF0b3IoKTsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBiZl9pdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFZpc2l0UXVldWUgPT0gUkhTLlZpc2l0UXVldWU7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgYmZfaXRlcmF0b3IgJlJIUykgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBSSFMpOyB9CisKKyAgY29uc3QgTm9kZVJlZiAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gVmlzaXRRdWV1ZS5mcm9udCgpLT5maXJzdDsgfQorCisgIC8vIFRoaXMgaXMgYSBub25zdGFuZGFyZCBvcGVyYXRvci0+IHRoYXQgZGVyZWZlcmVuZmNlcyB0aGUgcG9pbnRlciBhbiBleHRyYQorICAvLyB0aW1lIHNvIHRoYXQgeW91IGNhbiBhY3R1YWxseSBjYWxsIG1ldGhvZHMgb24gdGhlIG5vZGUsIGJlY2F1c2UgdGhlCisgIC8vIGNvbnRhaW5lZCB0eXBlIGlzIGEgcG9pbnRlci4KKyAgTm9kZVJlZiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gKip0aGlzOyB9CisKKyAgYmZfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7IC8vIFByZS1pbmNyZW1lbnQKKyAgICB0b05leHQoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBiZl9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAvLyBQb3N0LWluY3JlbWVudAorICAgIGJmX2l0ZXJhdG9yIEl0Q29weSA9ICp0aGlzOworICAgICsrKnRoaXM7CisgICAgcmV0dXJuIEl0Q29weTsKKyAgfQorCisgIHVuc2lnbmVkIGdldExldmVsKCkgY29uc3QgeyByZXR1cm4gTGV2ZWw7IH0KK307CisKKy8vIFByb3ZpZGUgZ2xvYmFsIGNvbnN0cnVjdG9ycyB0aGF0IGF1dG9tYXRpY2FsbHkgZmlndXJlIG91dCBjb3JyZWN0IHR5cGVzLgordGVtcGxhdGUgPGNsYXNzIFQ+IGJmX2l0ZXJhdG9yPFQ+IGJmX2JlZ2luKGNvbnN0IFQgJkcpIHsKKyAgcmV0dXJuIGJmX2l0ZXJhdG9yPFQ+OjpiZWdpbihHKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+IGJmX2l0ZXJhdG9yPFQ+IGJmX2VuZChjb25zdCBUICZHKSB7CisgIHJldHVybiBiZl9pdGVyYXRvcjxUPjo6ZW5kKEcpOworfQorCisvLyBQcm92aWRlIGFuIGFjY2Vzc29yIG1ldGhvZCB0byB1c2UgdGhlbSBpbiByYW5nZS1iYXNlZCBwYXR0ZXJucy4KK3RlbXBsYXRlIDxjbGFzcyBUPiBpdGVyYXRvcl9yYW5nZTxiZl9pdGVyYXRvcjxUPj4gYnJlYWR0aF9maXJzdChjb25zdCBUICZHKSB7CisgIHJldHVybiBtYWtlX3JhbmdlKGJmX2JlZ2luKEcpLCBiZl9lbmQoRykpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfQlJFQURUSEZJUlNUSVRFUkFUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQ2FjaGVkSGFzaFN0cmluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQ2FjaGVkSGFzaFN0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NmE2MjEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9DYWNoZWRIYXNoU3RyaW5nLmgKQEAgLTAsMCArMSwxODQgQEAKKy8vPT09LSBsbHZtL0FEVC9DYWNoZWRIYXNoU3RyaW5nLmggLSBQcmVoYXNoZWQgc3RyaW5nL1N0cmluZ1JlZiAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgQ2FjaGVkSGFzaFN0cmluZyBhbmQgQ2FjaGVkSGFzaFN0cmluZ1JlZi4gIFRoZXNlIGFyZSBvd25pbmcKKy8vIGFuZCBub3Qtb3duaW5nIHN0cmluZyB0eXBlcyB0aGF0IHN0b3JlIHRoZWlyIGhhc2ggaW4gYWRkaXRpb24gdG8gdGhlaXIgc3RyaW5nCisvLyBkYXRhLgorLy8KKy8vIFVubGlrZSBzdGQ6OnN0cmluZywgQ2FjaGVkSGFzaFN0cmluZyBjYW4gYmUgdXNlZCBpbiBEZW5zZVNldC9EZW5zZU1hcAorLy8gKGJlY2F1c2UsIHVubGlrZSBzdGQ6OnN0cmluZywgQ2FjaGVkSGFzaFN0cmluZyBsZXRzIHVzIGhhdmUgZW1wdHkgYW5kCisvLyB0b21ic3RvbmUgdmFsdWVzKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0NBQ0hFRF9IQVNIX1NUUklOR19ICisjZGVmaW5lIExMVk1fQURUX0NBQ0hFRF9IQVNIX1NUUklOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBIGNvbnRhaW5lciB3aGljaCBjb250YWlucyBhIFN0cmluZ1JlZiBwbHVzIGEgcHJlY29tcHV0ZWQgaGFzaC4KK2NsYXNzIENhY2hlZEhhc2hTdHJpbmdSZWYgeworICBjb25zdCBjaGFyICpQOworICB1aW50MzJfdCBTaXplOworICB1aW50MzJfdCBIYXNoOworCitwdWJsaWM6CisgIC8vIEV4cGxpY2l0IGJlY2F1c2UgaGFzaGluZyBhIHN0cmluZyBpc24ndCBmcmVlLgorICBleHBsaWNpdCBDYWNoZWRIYXNoU3RyaW5nUmVmKFN0cmluZ1JlZiBTKQorICAgICAgOiBDYWNoZWRIYXNoU3RyaW5nUmVmKFMsIERlbnNlTWFwSW5mbzxTdHJpbmdSZWY+OjpnZXRIYXNoVmFsdWUoUykpIHt9CisKKyAgQ2FjaGVkSGFzaFN0cmluZ1JlZihTdHJpbmdSZWYgUywgdWludDMyX3QgSGFzaCkKKyAgICAgIDogUChTLmRhdGEoKSksIFNpemUoUy5zaXplKCkpLCBIYXNoKEhhc2gpIHsKKyAgICBhc3NlcnQoUy5zaXplKCkgPD0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpKTsKKyAgfQorCisgIFN0cmluZ1JlZiB2YWwoKSBjb25zdCB7IHJldHVybiBTdHJpbmdSZWYoUCwgU2l6ZSk7IH0KKyAgdWludDMyX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKyAgdWludDMyX3QgaGFzaCgpIGNvbnN0IHsgcmV0dXJuIEhhc2g7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88Q2FjaGVkSGFzaFN0cmluZ1JlZj4geworICBzdGF0aWMgQ2FjaGVkSGFzaFN0cmluZ1JlZiBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gQ2FjaGVkSGFzaFN0cmluZ1JlZihEZW5zZU1hcEluZm88U3RyaW5nUmVmPjo6Z2V0RW1wdHlLZXkoKSwgMCk7CisgIH0KKyAgc3RhdGljIENhY2hlZEhhc2hTdHJpbmdSZWYgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiBDYWNoZWRIYXNoU3RyaW5nUmVmKERlbnNlTWFwSW5mbzxTdHJpbmdSZWY+OjpnZXRUb21ic3RvbmVLZXkoKSwgMSk7CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBDYWNoZWRIYXNoU3RyaW5nUmVmICZTKSB7CisgICAgYXNzZXJ0KCFpc0VxdWFsKFMsIGdldEVtcHR5S2V5KCkpICYmICJDYW5ub3QgaGFzaCB0aGUgZW1wdHkga2V5ISIpOworICAgIGFzc2VydCghaXNFcXVhbChTLCBnZXRUb21ic3RvbmVLZXkoKSkgJiYgIkNhbm5vdCBoYXNoIHRoZSB0b21ic3RvbmUga2V5ISIpOworICAgIHJldHVybiBTLmhhc2goKTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IENhY2hlZEhhc2hTdHJpbmdSZWYgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWNoZWRIYXNoU3RyaW5nUmVmICZSSFMpIHsKKyAgICByZXR1cm4gTEhTLmhhc2goKSA9PSBSSFMuaGFzaCgpICYmCisgICAgICAgICAgIERlbnNlTWFwSW5mbzxTdHJpbmdSZWY+Ojppc0VxdWFsKExIUy52YWwoKSwgUkhTLnZhbCgpKTsKKyAgfQorfTsKKworLy8vIEEgY29udGFpbmVyIHdoaWNoIGNvbnRhaW5zIGEgc3RyaW5nLCB3aGljaCBpdCBvd25zLCBwbHVzIGEgcHJlY29tcHV0ZWQgaGFzaC4KKy8vLworLy8vIFdlIGRvIG5vdCBudWxsLXRlcm1pbmF0ZSB0aGUgc3RyaW5nLgorY2xhc3MgQ2FjaGVkSGFzaFN0cmluZyB7CisgIGZyaWVuZCBzdHJ1Y3QgRGVuc2VNYXBJbmZvPENhY2hlZEhhc2hTdHJpbmc+OworCisgIGNoYXIgKlA7CisgIHVpbnQzMl90IFNpemU7CisgIHVpbnQzMl90IEhhc2g7CisKKyAgc3RhdGljIGNoYXIgKmdldEVtcHR5S2V5UHRyKCkgeyByZXR1cm4gRGVuc2VNYXBJbmZvPGNoYXIgKj46OmdldEVtcHR5S2V5KCk7IH0KKyAgc3RhdGljIGNoYXIgKmdldFRvbWJzdG9uZUtleVB0cigpIHsKKyAgICByZXR1cm4gRGVuc2VNYXBJbmZvPGNoYXIgKj46OmdldFRvbWJzdG9uZUtleSgpOworICB9CisKKyAgYm9vbCBpc0VtcHR5T3JUb21ic3RvbmUoKSBjb25zdCB7CisgICAgcmV0dXJuIFAgPT0gZ2V0RW1wdHlLZXlQdHIoKSB8fCBQID09IGdldFRvbWJzdG9uZUtleVB0cigpOworICB9CisKKyAgc3RydWN0IENvbnN0cnVjdEVtcHR5T3JUb21ic3RvbmVUeSB7fTsKKworICBDYWNoZWRIYXNoU3RyaW5nKENvbnN0cnVjdEVtcHR5T3JUb21ic3RvbmVUeSwgY2hhciAqRW1wdHlPclRvbWJzdG9uZVB0cikKKyAgICAgIDogUChFbXB0eU9yVG9tYnN0b25lUHRyKSwgU2l6ZSgwKSwgSGFzaCgwKSB7CisgICAgYXNzZXJ0KGlzRW1wdHlPclRvbWJzdG9uZSgpKTsKKyAgfQorCisgIC8vIFRPRE86IFVzZSBzbWFsbC1zdHJpbmcgb3B0aW1pemF0aW9uIHRvIGF2b2lkIGFsbG9jYXRpbmcuCisKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ2FjaGVkSGFzaFN0cmluZyhjb25zdCBjaGFyICpTKSA6IENhY2hlZEhhc2hTdHJpbmcoU3RyaW5nUmVmKFMpKSB7fQorCisgIC8vIEV4cGxpY2l0IGJlY2F1c2UgY29weWluZyBhbmQgaGFzaGluZyBhIHN0cmluZyBpc24ndCBmcmVlLgorICBleHBsaWNpdCBDYWNoZWRIYXNoU3RyaW5nKFN0cmluZ1JlZiBTKQorICAgICAgOiBDYWNoZWRIYXNoU3RyaW5nKFMsIERlbnNlTWFwSW5mbzxTdHJpbmdSZWY+OjpnZXRIYXNoVmFsdWUoUykpIHt9CisKKyAgQ2FjaGVkSGFzaFN0cmluZyhTdHJpbmdSZWYgUywgdWludDMyX3QgSGFzaCkKKyAgICAgIDogUChuZXcgY2hhcltTLnNpemUoKV0pLCBTaXplKFMuc2l6ZSgpKSwgSGFzaChIYXNoKSB7CisgICAgbWVtY3B5KFAsIFMuZGF0YSgpLCBTLnNpemUoKSk7CisgIH0KKworICAvLyBJZGVhbGx5IHRoaXMgY2xhc3Mgd291bGQgbm90IGJlIGNvcHlhYmxlLiAgQnV0IFNldFZlY3RvciByZXF1aXJlcyBjb3B5YWJsZQorICAvLyBrZXlzLCBhbmQgd2Ugd2FudCB0aGlzIHRvIGJlIHVzYWJsZSB0aGVyZS4KKyAgQ2FjaGVkSGFzaFN0cmluZyhjb25zdCBDYWNoZWRIYXNoU3RyaW5nICZPdGhlcikKKyAgICAgIDogU2l6ZShPdGhlci5TaXplKSwgSGFzaChPdGhlci5IYXNoKSB7CisgICAgaWYgKE90aGVyLmlzRW1wdHlPclRvbWJzdG9uZSgpKSB7CisgICAgICBQID0gT3RoZXIuUDsKKyAgICB9IGVsc2UgeworICAgICAgUCA9IG5ldyBjaGFyW1NpemVdOworICAgICAgbWVtY3B5KFAsIE90aGVyLlAsIFNpemUpOworICAgIH0KKyAgfQorCisgIENhY2hlZEhhc2hTdHJpbmcgJm9wZXJhdG9yPShDYWNoZWRIYXNoU3RyaW5nIE90aGVyKSB7CisgICAgc3dhcCgqdGhpcywgT3RoZXIpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIENhY2hlZEhhc2hTdHJpbmcoQ2FjaGVkSGFzaFN0cmluZyAmJk90aGVyKSBub2V4Y2VwdAorICAgICAgOiBQKE90aGVyLlApLCBTaXplKE90aGVyLlNpemUpLCBIYXNoKE90aGVyLkhhc2gpIHsKKyAgICBPdGhlci5QID0gZ2V0RW1wdHlLZXlQdHIoKTsKKyAgfQorCisgIH5DYWNoZWRIYXNoU3RyaW5nKCkgeworICAgIGlmICghaXNFbXB0eU9yVG9tYnN0b25lKCkpCisgICAgICBkZWxldGVbXSBQOworICB9CisKKyAgU3RyaW5nUmVmIHZhbCgpIGNvbnN0IHsgcmV0dXJuIFN0cmluZ1JlZihQLCBTaXplKTsgfQorICB1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorICB1aW50MzJfdCBoYXNoKCkgY29uc3QgeyByZXR1cm4gSGFzaDsgfQorCisgIG9wZXJhdG9yIFN0cmluZ1JlZigpIGNvbnN0IHsgcmV0dXJuIHZhbCgpOyB9CisgIG9wZXJhdG9yIENhY2hlZEhhc2hTdHJpbmdSZWYoKSBjb25zdCB7CisgICAgcmV0dXJuIENhY2hlZEhhc2hTdHJpbmdSZWYodmFsKCksIEhhc2gpOworICB9CisKKyAgZnJpZW5kIHZvaWQgc3dhcChDYWNoZWRIYXNoU3RyaW5nICZMSFMsIENhY2hlZEhhc2hTdHJpbmcgJlJIUykgeworICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgICBzd2FwKExIUy5QLCBSSFMuUCk7CisgICAgc3dhcChMSFMuU2l6ZSwgUkhTLlNpemUpOworICAgIHN3YXAoTEhTLkhhc2gsIFJIUy5IYXNoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IERlbnNlTWFwSW5mbzxDYWNoZWRIYXNoU3RyaW5nPiB7CisgIHN0YXRpYyBDYWNoZWRIYXNoU3RyaW5nIGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBDYWNoZWRIYXNoU3RyaW5nKENhY2hlZEhhc2hTdHJpbmc6OkNvbnN0cnVjdEVtcHR5T3JUb21ic3RvbmVUeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlZEhhc2hTdHJpbmc6OmdldEVtcHR5S2V5UHRyKCkpOworICB9CisgIHN0YXRpYyBDYWNoZWRIYXNoU3RyaW5nIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gQ2FjaGVkSGFzaFN0cmluZyhDYWNoZWRIYXNoU3RyaW5nOjpDb25zdHJ1Y3RFbXB0eU9yVG9tYnN0b25lVHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZWRIYXNoU3RyaW5nOjpnZXRUb21ic3RvbmVLZXlQdHIoKSk7CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBDYWNoZWRIYXNoU3RyaW5nICZTKSB7CisgICAgYXNzZXJ0KCFpc0VxdWFsKFMsIGdldEVtcHR5S2V5KCkpICYmICJDYW5ub3QgaGFzaCB0aGUgZW1wdHkga2V5ISIpOworICAgIGFzc2VydCghaXNFcXVhbChTLCBnZXRUb21ic3RvbmVLZXkoKSkgJiYgIkNhbm5vdCBoYXNoIHRoZSB0b21ic3RvbmUga2V5ISIpOworICAgIHJldHVybiBTLmhhc2goKTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IENhY2hlZEhhc2hTdHJpbmcgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWNoZWRIYXNoU3RyaW5nICZSSFMpIHsKKyAgICBpZiAoTEhTLmhhc2goKSAhPSBSSFMuaGFzaCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChMSFMuUCA9PSBDYWNoZWRIYXNoU3RyaW5nOjpnZXRFbXB0eUtleVB0cigpKQorICAgICAgcmV0dXJuIFJIUy5QID09IENhY2hlZEhhc2hTdHJpbmc6OmdldEVtcHR5S2V5UHRyKCk7CisgICAgaWYgKExIUy5QID09IENhY2hlZEhhc2hTdHJpbmc6OmdldFRvbWJzdG9uZUtleVB0cigpKQorICAgICAgcmV0dXJuIFJIUy5QID09IENhY2hlZEhhc2hTdHJpbmc6OmdldFRvbWJzdG9uZUtleVB0cigpOworCisgICAgLy8gVGhpcyBpcyBzYWZlIGJlY2F1c2UgaWYgUkhTLlAgaXMgdGhlIGVtcHR5IG9yIHRvbWJzdG9uZSBrZXksIGl0IHdpbGwgaGF2ZQorICAgIC8vIGxlbmd0aCAwLCBzbyB3ZSdsbCBuZXZlciBkZXJlZmVyZW5jZSBpdHMgcG9pbnRlci4KKyAgICByZXR1cm4gTEhTLnZhbCgpID09IFJIUy52YWwoKTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0RBR0RlbHRhQWxnb3JpdGhtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9EQUdEZWx0YUFsZ29yaXRobS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZmRkNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9EQUdEZWx0YUFsZ29yaXRobS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8vPT09LSBEQUdEZWx0YUFsZ29yaXRobS5oIC0gQSBEQUcgTWluaW1pemF0aW9uIEFsZ29yaXRobSAtLS0tLS0qLSBDKysgLSotLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9EQUdERUxUQUFMR09SSVRITV9ICisjZGVmaW5lIExMVk1fQURUX0RBR0RFTFRBQUxHT1JJVEhNX0gKKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gREFHRGVsdGFBbGdvcml0aG0gLSBJbXBsZW1lbnRzIGEgImRlbHRhIGRlYnVnZ2luZyIgYWxnb3JpdGhtIGZvciBtaW5pbWl6aW5nCisvLy8gZGlyZWN0ZWQgYWN5Y2xpYyBncmFwaHMgdXNpbmcgYSBwcmVkaWNhdGUgZnVuY3Rpb24uCisvLy8KKy8vLyBUaGUgcmVzdWx0IG9mIHRoZSBhbGdvcml0aG0gaXMgYSBzdWJzZXQgb2YgdGhlIGlucHV0IGNoYW5nZSBzZXQgd2hpY2ggaXMKKy8vLyBndWFyYW50ZWVkIHRvIHNhdGlzZnkgdGhlIHByZWRpY2F0ZSwgYXNzdW1pbmcgdGhhdCB0aGUgaW5wdXQgc2V0IGRpZC4gRm9yCisvLy8gd2VsbCBmb3JtZWQgcHJlZGljYXRlcywgdGhlIHJlc3VsdCBzZXQgaXMgZ3VhcmFudGVlZCB0byBiZSBzdWNoIHRoYXQKKy8vLyByZW1vdmluZyBhbnkgc2luZ2xlIGVsZW1lbnQgbm90IHJlcXVpcmVkIGJ5IHRoZSBkZXBlbmRlbmNpZXMgb24gdGhlIG90aGVyCisvLy8gZWxlbWVudHMgd291bGQgZmFsc2lmeSB0aGUgcHJlZGljYXRlLgorLy8vCisvLy8gVGhlIERBRyBzaG91bGQgYmUgdXNlZCB0byByZXByZXNlbnQgZGVwZW5kZW5jaWVzIGluIHRoZSBjaGFuZ2VzIHdoaWNoIGFyZQorLy8vIGxpa2VseSB0byBob2xkIGFjcm9zcyB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uLiBUaGF0IGlzLCBmb3IgYSBwYXJ0aWN1bGFyCisvLy8gY2hhbmdlc2V0IFMgYW5kIHByZWRpY2F0ZSBQOgorLy8vCisvLy8gICBQKFMpID0+IFAoUyB1bmlvbiBwcmVkKFMpKQorLy8vCisvLy8gVGhlIG1pbml6YXRpb24gYWxnb3JpdGhtIHVzZXMgdGhpcyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIHRvIGF0dGVtcHQgdG8KKy8vLyBlYWdlcmx5IHBydW5lIGxhcmdlIHN1YnNldHMgb2YgY2hhbmdlcy4gQXMgd2l0aCBcc2VlIERlbHRhQWxnb3JpdGhtLCB0aGUgREFHCisvLy8gaXMgbm90IHJlcXVpcmVkIHRvIHNhdGlzZnkgdGhpcyBwcm9wZXJ0eSwgYnV0IHRoZSBhbGdvcml0aG0gd2lsbCBydW4KKy8vLyBzdWJzdGFudGlhbGx5IGZld2VyIHRlc3RzIHdpdGggYXBwcm9wcmlhdGUgZGVwZW5kZW5jaWVzLiBcc2VlIERlbHRhQWxnb3JpdGhtCisvLy8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHByb3BlcnRpZXMgd2hpY2ggdGhlIHByZWRpY2F0ZSBmdW5jdGlvbiBpdHNlbGYKKy8vLyBzaG91bGQgc2F0aXNmeS4KK2NsYXNzIERBR0RlbHRhQWxnb3JpdGhtIHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIHVzaW5nIGNoYW5nZV90eSA9IHVuc2lnbmVkOworICB1c2luZyBlZGdlX3R5ID0gc3RkOjpwYWlyPGNoYW5nZV90eSwgY2hhbmdlX3R5PjsKKworICAvLyBGSVhNRTogVXNlIGEgZGVjZW50IGRhdGEgc3RydWN0dXJlLgorICB1c2luZyBjaGFuZ2VzZXRfdHkgPSBzdGQ6OnNldDxjaGFuZ2VfdHk+OworICB1c2luZyBjaGFuZ2VzZXRsaXN0X3R5ID0gc3RkOjp2ZWN0b3I8Y2hhbmdlc2V0X3R5PjsKKworcHVibGljOgorICB2aXJ0dWFsIH5EQUdEZWx0YUFsZ29yaXRobSgpID0gZGVmYXVsdDsKKworICAvLy8gUnVuIC0gTWluaW1pemUgdGhlIERBRyBmb3JtZWQgYnkgdGhlIFxwIENoYW5nZXMgdmVydGljZXMgYW5kIHRoZQorICAvLy8gXHAgRGVwZW5kZW5jaWVzIGVkZ2VzIGJ5IGV4ZWN1dGluZyBcc2VlIEV4ZWN1dGVPbmVUZXN0KCkgb24gc3Vic2V0cyBvZgorICAvLy8gY2hhbmdlcyBhbmQgcmV0dXJuaW5nIHRoZSBzbWFsbGVzdCBzZXQgd2hpY2ggc3RpbGwgc2F0aXNmaWVzIHRoZSB0ZXN0CisgIC8vLyBwcmVkaWNhdGUgYW5kIHRoZSBpbnB1dCBccCBEZXBlbmRlbmNpZXMuCisgIC8vLworICAvLy8gXHBhcmFtIENoYW5nZXMgVGhlIGxpc3Qgb2YgY2hhbmdlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gRGVwZW5kZW5jaWVzIFRoZSBsaXN0IG9mIGRlcGVuZGVuY2llcyBhbW9uZ3N0IGNoYW5nZXMuIEZvciBlYWNoCisgIC8vLyAoeCx5KSBpbiBccCBEZXBlbmRlbmNpZXMsIGJvdGggeCBhbmQgeSBtdXN0IGJlIGluIFxwIENoYW5nZXMuIFRoZQorICAvLy8gbWluaW1pemF0aW9uIGFsZ29yaXRobSBndWFyYW50ZWVzIHRoYXQgZm9yIGVhY2ggdGVzdGVkIGNoYW5nZWQgc2V0IFMsCisgIC8vLyBcZiQgeCBcaW4gUyBcZiQgaW1wbGllcyBcZiQgeSBcaW4gUyBcZiQuIEl0IGlzIGFuIGVycm9yIHRvIGhhdmUgY3ljbGljCisgIC8vLyBkZXBlbmRlbmNpZXMuCisgIGNoYW5nZXNldF90eSBSdW4oY29uc3QgY2hhbmdlc2V0X3R5ICZDaGFuZ2VzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGVkZ2VfdHk+ICZEZXBlbmRlbmNpZXMpOworCisgIC8vLyBVcGRhdGVkU2VhcmNoU3RhdGUgLSBDYWxsYmFjayB1c2VkIHdoZW4gdGhlIHNlYXJjaCBzdGF0ZSBjaGFuZ2VzLgorICB2aXJ0dWFsIHZvaWQgVXBkYXRlZFNlYXJjaFN0YXRlKGNvbnN0IGNoYW5nZXNldF90eSAmQ2hhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VzZXRsaXN0X3R5ICZTZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZXNldF90eSAmUmVxdWlyZWQpIHt9CisKKyAgLy8vIEV4ZWN1dGVPbmVUZXN0IC0gRXhlY3V0ZSBhIHNpbmdsZSB0ZXN0IHByZWRpY2F0ZSBvbiB0aGUgY2hhbmdlIHNldCBccCBTLgorICB2aXJ0dWFsIGJvb2wgRXhlY3V0ZU9uZVRlc3QoY29uc3QgY2hhbmdlc2V0X3R5ICZTKSA9IDA7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfREFHREVMVEFBTEdPUklUSE1fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvRGVsdGFBbGdvcml0aG0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0RlbHRhQWxnb3JpdGhtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlY2IyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0RlbHRhQWxnb3JpdGhtLmgKQEAgLTAsMCArMSw5MyBAQAorLy89PT0tIERlbHRhQWxnb3JpdGhtLmggLSBBIFNldCBNaW5pbWl6YXRpb24gQWxnb3JpdGhtIC0tLS0tLS0tLSotIEMrKyAtKi0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0RFTFRBQUxHT1JJVEhNX0gKKyNkZWZpbmUgTExWTV9BRFRfREVMVEFBTEdPUklUSE1fSAorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gRGVsdGFBbGdvcml0aG0gLSBJbXBsZW1lbnRzIHRoZSBkZWx0YSBkZWJ1Z2dpbmcgYWxnb3JpdGhtIChBLiBaZWxsZXIgJzk5KQorLy8vIGZvciBtaW5pbWl6aW5nIGFyYml0cmFyeSBzZXRzIHVzaW5nIGEgcHJlZGljYXRlIGZ1bmN0aW9uLgorLy8vCisvLy8gVGhlIHJlc3VsdCBvZiB0aGUgYWxnb3JpdGhtIGlzIGEgc3Vic2V0IG9mIHRoZSBpbnB1dCBjaGFuZ2Ugc2V0IHdoaWNoIGlzCisvLy8gZ3VhcmFudGVlZCB0byBzYXRpc2Z5IHRoZSBwcmVkaWNhdGUsIGFzc3VtaW5nIHRoYXQgdGhlIGlucHV0IHNldCBkaWQuIEZvcgorLy8vIHdlbGwgZm9ybWVkIHByZWRpY2F0ZXMsIHRoZSByZXN1bHQgc2V0IGlzIGd1YXJhbnRlZWQgdG8gYmUgc3VjaCB0aGF0CisvLy8gcmVtb3ZpbmcgYW55IHNpbmdsZSBlbGVtZW50IHdvdWxkIGZhbHNpZnkgdGhlIHByZWRpY2F0ZS4KKy8vLworLy8vIEZvciBiZXN0IHJlc3VsdHMgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbiAqc2hvdWxkKiAoYnV0IG5lZWQgbm90KSBzYXRpc2Z5CisvLy8gY2VydGFpbiBwcm9wZXJ0aWVzLCBpbiBwYXJ0aWN1bGFyOgorLy8vICAoMSkgVGhlIHByZWRpY2F0ZSBzaG91bGQgcmV0dXJuIGZhbHNlIG9uIGFuIGVtcHR5IHNldCBhbmQgdHJ1ZSBvbiB0aGUgZnVsbAorLy8vICBzZXQuCisvLy8gICgyKSBJZiB0aGUgcHJlZGljYXRlIHJldHVybnMgdHJ1ZSBmb3IgYSBzZXQgb2YgY2hhbmdlcywgaXQgc2hvdWxkIHJldHVybgorLy8vICB0cnVlIGZvciBhbGwgc3VwZXJzZXRzIG9mIHRoYXQgc2V0LgorLy8vCisvLy8gSXQgaXMgbm90IGFuIGVycm9yIHRvIHByb3ZpZGUgYSBwcmVkaWNhdGUgdGhhdCBkb2VzIG5vdCBzYXRpc2Z5IHRoZXNlCisvLy8gcmVxdWlyZW1lbnRzLCBhbmQgdGhlIGFsZ29yaXRobSB3aWxsIGdlbmVyYWxseSBwcm9kdWNlIHJlYXNvbmFibGUKKy8vLyByZXN1bHRzLiBIb3dldmVyLCBpdCBtYXkgcnVuIHN1YnN0YW50aWFsbHkgbW9yZSB0ZXN0cyB0aGFuIHdpdGggYSBnb29kCisvLy8gcHJlZGljYXRlLgorY2xhc3MgRGVsdGFBbGdvcml0aG0geworcHVibGljOgorICB1c2luZyBjaGFuZ2VfdHkgPSB1bnNpZ25lZDsKKyAgLy8gRklYTUU6IFVzZSBhIGRlY2VudCBkYXRhIHN0cnVjdHVyZS4KKyAgdXNpbmcgY2hhbmdlc2V0X3R5ID0gc3RkOjpzZXQ8Y2hhbmdlX3R5PjsKKyAgdXNpbmcgY2hhbmdlc2V0bGlzdF90eSA9IHN0ZDo6dmVjdG9yPGNoYW5nZXNldF90eT47CisKK3ByaXZhdGU6CisgIC8vLyBDYWNoZSBvZiBmYWlsZWQgdGVzdCByZXN1bHRzLiBTdWNjZXNzZnVsIHRlc3QgcmVzdWx0cyBhcmUgbmV2ZXIgY2FjaGVkCisgIC8vLyBzaW5jZSB3ZSBhbHdheXMgcmVkdWNlIGZvbGxvd2luZyBhIHN1Y2Nlc3MuCisgIHN0ZDo6c2V0PGNoYW5nZXNldF90eT4gRmFpbGVkVGVzdHNDYWNoZTsKKworICAvLy8gR2V0VGVzdFJlc3VsdCAtIEdldCB0aGUgdGVzdCByZXN1bHQgZm9yIHRoZSBccCBDaGFuZ2VzIGZyb20gdGhlCisgIC8vLyBjYWNoZSwgZXhlY3V0aW5nIHRoZSB0ZXN0IGlmIG5lY2Vzc2FyeS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ2hhbmdlcyAtIFRoZSBjaGFuZ2Ugc2V0IHRvIHRlc3QuCisgIC8vLyBccmV0dXJuIC0gVGhlIHRlc3QgcmVzdWx0LgorICBib29sIEdldFRlc3RSZXN1bHQoY29uc3QgY2hhbmdlc2V0X3R5ICZDaGFuZ2VzKTsKKworICAvLy8gU3BsaXQgLSBQYXJ0aXRpb24gYSBzZXQgb2YgY2hhbmdlcyBccCBTIGludG8gb25lIG9yIHR3byBzdWJzZXRzLgorICB2b2lkIFNwbGl0KGNvbnN0IGNoYW5nZXNldF90eSAmUywgY2hhbmdlc2V0bGlzdF90eSAmUmVzKTsKKworICAvLy8gRGVsdGEgLSBNaW5pbWl6ZSBhIHNldCBvZiBccCBDaGFuZ2VzIHdoaWNoIGhhcyBiZWVuIHBhcnRpb25lZCBpbnRvCisgIC8vLyBzbWFsbGVyIHNldHMsIGJ5IGF0dGVtcHRpbmcgdG8gcmVtb3ZlIGluZGl2aWR1YWwgc3Vic2V0cy4KKyAgY2hhbmdlc2V0X3R5IERlbHRhKGNvbnN0IGNoYW5nZXNldF90eSAmQ2hhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZXNldGxpc3RfdHkgJlNldHMpOworCisgIC8vLyBTZWFyY2ggLSBTZWFyY2ggZm9yIGEgc3Vic2V0IChvciBzdWJzZXRzKSBpbiBccCBTZXRzIHdoaWNoIGNhbiBiZQorICAvLy8gcmVtb3ZlZCBmcm9tIFxwIENoYW5nZXMgd2hpbGUgc3RpbGwgc2F0aXNmeWluZyB0aGUgcHJlZGljYXRlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSZXMgLSBPbiBzdWNjZXNzLCBhIHN1YnNldCBvZiBDaGFuZ2VzIHdoaWNoIHNhdGlzZmllcyB0aGUKKyAgLy8vIHByZWRpY2F0ZS4KKyAgLy8vIFxyZXR1cm4gLSBUcnVlIG9uIHN1Y2Nlc3MuCisgIGJvb2wgU2VhcmNoKGNvbnN0IGNoYW5nZXNldF90eSAmQ2hhbmdlcywgY29uc3QgY2hhbmdlc2V0bGlzdF90eSAmU2V0cywKKyAgICAgICAgICAgICAgY2hhbmdlc2V0X3R5ICZSZXMpOworCitwcm90ZWN0ZWQ6CisgIC8vLyBVcGRhdGVkU2VhcmNoU3RhdGUgLSBDYWxsYmFjayB1c2VkIHdoZW4gdGhlIHNlYXJjaCBzdGF0ZSBjaGFuZ2VzLgorICB2aXJ0dWFsIHZvaWQgVXBkYXRlZFNlYXJjaFN0YXRlKGNvbnN0IGNoYW5nZXNldF90eSAmQ2hhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VzZXRsaXN0X3R5ICZTZXRzKSB7fQorCisgIC8vLyBFeGVjdXRlT25lVGVzdCAtIEV4ZWN1dGUgYSBzaW5nbGUgdGVzdCBwcmVkaWNhdGUgb24gdGhlIGNoYW5nZSBzZXQgXHAgUy4KKyAgdmlydHVhbCBib29sIEV4ZWN1dGVPbmVUZXN0KGNvbnN0IGNoYW5nZXNldF90eSAmUykgPSAwOworCisgIERlbHRhQWxnb3JpdGhtJiBvcGVyYXRvcj0oY29uc3QgRGVsdGFBbGdvcml0aG0mKSA9IGRlZmF1bHQ7CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+RGVsdGFBbGdvcml0aG0oKTsKKworICAvLy8gUnVuIC0gTWluaW1pemUgdGhlIHNldCBccCBDaGFuZ2VzIGJ5IGV4ZWN1dGluZyBcc2VlIEV4ZWN1dGVPbmVUZXN0KCkgb24KKyAgLy8vIHN1YnNldHMgb2YgY2hhbmdlcyBhbmQgcmV0dXJuaW5nIHRoZSBzbWFsbGVzdCBzZXQgd2hpY2ggc3RpbGwgc2F0aXNmaWVzCisgIC8vLyB0aGUgdGVzdCBwcmVkaWNhdGUuCisgIGNoYW5nZXNldF90eSBSdW4oY29uc3QgY2hhbmdlc2V0X3R5ICZDaGFuZ2VzKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9ERUxUQUFMR09SSVRITV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9EZW5zZU1hcC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvRGVuc2VNYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTYwYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvRGVuc2VNYXAuaApAQCAtMCwwICsxLDEyMjQgQEAKKy8vPT09LSBsbHZtL0FEVC9EZW5zZU1hcC5oIC0gRGVuc2UgcHJvYmVkIGhhc2ggdGFibGUgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIERlbnNlTWFwIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfREVOU0VNQVBfSAorI2RlZmluZSBMTFZNX0FEVF9ERU5TRU1BUF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9FcG9jaFRyYWNrZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxpZ25PZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1JldmVyc2VJdGVyYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIGRldGFpbCB7CisKKy8vIFdlIGV4dGVuZCBhIHBhaXIgdG8gYWxsb3cgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlIGJ1Y2tldCB0eXBlIHdpdGggdGhlaXIgb3duCisvLyBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IHJlcXVpcmluZyB0d28gbWVtYmVycy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQ+CitzdHJ1Y3QgRGVuc2VNYXBQYWlyIDogcHVibGljIHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+IHsKKyAgS2V5VCAmZ2V0Rmlyc3QoKSB7IHJldHVybiBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPjo6Zmlyc3Q7IH0KKyAgY29uc3QgS2V5VCAmZ2V0Rmlyc3QoKSBjb25zdCB7IHJldHVybiBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPjo6Zmlyc3Q7IH0KKyAgVmFsdWVUICZnZXRTZWNvbmQoKSB7IHJldHVybiBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPjo6c2Vjb25kOyB9CisgIGNvbnN0IFZhbHVlVCAmZ2V0U2Vjb25kKCkgY29uc3QgeyByZXR1cm4gc3RkOjpwYWlyPEtleVQsIFZhbHVlVD46OnNlY29uZDsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCit0ZW1wbGF0ZSA8CisgICAgdHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsdWVULCB0eXBlbmFtZSBLZXlJbmZvVCA9IERlbnNlTWFwSW5mbzxLZXlUPiwKKyAgICB0eXBlbmFtZSBCdWNrZXQgPSBkZXRhaWw6OkRlbnNlTWFwUGFpcjxLZXlULCBWYWx1ZVQ+LCBib29sIElzQ29uc3QgPSBmYWxzZT4KK2NsYXNzIERlbnNlTWFwSXRlcmF0b3I7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkVCwgdHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsdWVULCB0eXBlbmFtZSBLZXlJbmZvVCwKKyAgICAgICAgICB0eXBlbmFtZSBCdWNrZXRUPgorY2xhc3MgRGVuc2VNYXBCYXNlIDogcHVibGljIERlYnVnRXBvY2hCYXNlIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHVzaW5nIGNvbnN0X2FyZ190eXBlX3QgPSB0eXBlbmFtZSBjb25zdF9wb2ludGVyX29yX2NvbnN0X3JlZjxUPjo6dHlwZTsKKworcHVibGljOgorICB1c2luZyBzaXplX3R5cGUgPSB1bnNpZ25lZDsKKyAgdXNpbmcga2V5X3R5cGUgPSBLZXlUOworICB1c2luZyBtYXBwZWRfdHlwZSA9IFZhbHVlVDsKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IEJ1Y2tldFQ7CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBEZW5zZU1hcEl0ZXJhdG9yPEtleVQsIFZhbHVlVCwgS2V5SW5mb1QsIEJ1Y2tldFQ+OworICB1c2luZyBjb25zdF9pdGVyYXRvciA9CisgICAgICBEZW5zZU1hcEl0ZXJhdG9yPEtleVQsIFZhbHVlVCwgS2V5SW5mb1QsIEJ1Y2tldFQsIHRydWU+OworCisgIGlubGluZSBpdGVyYXRvciBiZWdpbigpIHsKKyAgICAvLyBXaGVuIHRoZSBtYXAgaXMgZW1wdHksIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBhZHZhbmNpbmcvcmV0cmVhdGluZyBwYXN0CisgICAgLy8gZW1wdHkgYnVja2V0cy4KKyAgICBpZiAoZW1wdHkoKSkKKyAgICAgIHJldHVybiBlbmQoKTsKKyAgICBpZiAoc2hvdWxkUmV2ZXJzZUl0ZXJhdGU8S2V5VD4oKSkKKyAgICAgIHJldHVybiBtYWtlSXRlcmF0b3IoZ2V0QnVja2V0c0VuZCgpIC0gMSwgZ2V0QnVja2V0cygpLCAqdGhpcyk7CisgICAgcmV0dXJuIG1ha2VJdGVyYXRvcihnZXRCdWNrZXRzKCksIGdldEJ1Y2tldHNFbmQoKSwgKnRoaXMpOworICB9CisgIGlubGluZSBpdGVyYXRvciBlbmQoKSB7CisgICAgcmV0dXJuIG1ha2VJdGVyYXRvcihnZXRCdWNrZXRzRW5kKCksIGdldEJ1Y2tldHNFbmQoKSwgKnRoaXMsIHRydWUpOworICB9CisgIGlubGluZSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKKyAgICBpZiAoZW1wdHkoKSkKKyAgICAgIHJldHVybiBlbmQoKTsKKyAgICBpZiAoc2hvdWxkUmV2ZXJzZUl0ZXJhdGU8S2V5VD4oKSkKKyAgICAgIHJldHVybiBtYWtlQ29uc3RJdGVyYXRvcihnZXRCdWNrZXRzRW5kKCkgLSAxLCBnZXRCdWNrZXRzKCksICp0aGlzKTsKKyAgICByZXR1cm4gbWFrZUNvbnN0SXRlcmF0b3IoZ2V0QnVja2V0cygpLCBnZXRCdWNrZXRzRW5kKCksICp0aGlzKTsKKyAgfQorICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlQ29uc3RJdGVyYXRvcihnZXRCdWNrZXRzRW5kKCksIGdldEJ1Y2tldHNFbmQoKSwgKnRoaXMsIHRydWUpOworICB9CisKKyAgTExWTV9OT0RJU0NBUkQgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TnVtRW50cmllcygpID09IDA7CisgIH0KKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGdldE51bUVudHJpZXMoKTsgfQorCisgIC8vLyBHcm93IHRoZSBkZW5zZW1hcCBzbyB0aGF0IGl0IGNhbiBjb250YWluIGF0IGxlYXN0IFxwIE51bUVudHJpZXMgaXRlbXMKKyAgLy8vIGJlZm9yZSByZXNpemluZyBhZ2Fpbi4KKyAgdm9pZCByZXNlcnZlKHNpemVfdHlwZSBOdW1FbnRyaWVzKSB7CisgICAgYXV0byBOdW1CdWNrZXRzID0gZ2V0TWluQnVja2V0VG9SZXNlcnZlRm9yRW50cmllcyhOdW1FbnRyaWVzKTsKKyAgICBpbmNyZW1lbnRFcG9jaCgpOworICAgIGlmIChOdW1CdWNrZXRzID4gZ2V0TnVtQnVja2V0cygpKQorICAgICAgZ3JvdyhOdW1CdWNrZXRzKTsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgaW5jcmVtZW50RXBvY2goKTsKKyAgICBpZiAoZ2V0TnVtRW50cmllcygpID09IDAgJiYgZ2V0TnVtVG9tYnN0b25lcygpID09IDApIHJldHVybjsKKworICAgIC8vIElmIHRoZSBjYXBhY2l0eSBvZiB0aGUgYXJyYXkgaXMgaHVnZSwgYW5kIHRoZSAjIGVsZW1lbnRzIHVzZWQgaXMgc21hbGwsCisgICAgLy8gc2hyaW5rIHRoZSBhcnJheS4KKyAgICBpZiAoZ2V0TnVtRW50cmllcygpICogNCA8IGdldE51bUJ1Y2tldHMoKSAmJiBnZXROdW1CdWNrZXRzKCkgPiA2NCkgeworICAgICAgc2hyaW5rX2FuZF9jbGVhcigpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IEtleVQgRW1wdHlLZXkgPSBnZXRFbXB0eUtleSgpLCBUb21ic3RvbmVLZXkgPSBnZXRUb21ic3RvbmVLZXkoKTsKKyAgICBpZiAoaXNQb2RMaWtlPEtleVQ+Ojp2YWx1ZSAmJiBpc1BvZExpa2U8VmFsdWVUPjo6dmFsdWUpIHsKKyAgICAgIC8vIFVzZSBhIHNpbXBsZXIgbG9vcCB3aGVuIHRoZXNlIGFyZSB0cml2aWFsIHR5cGVzLgorICAgICAgZm9yIChCdWNrZXRUICpQID0gZ2V0QnVja2V0cygpLCAqRSA9IGdldEJ1Y2tldHNFbmQoKTsgUCAhPSBFOyArK1ApCisgICAgICAgIFAtPmdldEZpcnN0KCkgPSBFbXB0eUtleTsKKyAgICB9IGVsc2UgeworICAgICAgdW5zaWduZWQgTnVtRW50cmllcyA9IGdldE51bUVudHJpZXMoKTsKKyAgICAgIGZvciAoQnVja2V0VCAqUCA9IGdldEJ1Y2tldHMoKSwgKkUgPSBnZXRCdWNrZXRzRW5kKCk7IFAgIT0gRTsgKytQKSB7CisgICAgICAgIGlmICghS2V5SW5mb1Q6OmlzRXF1YWwoUC0+Z2V0Rmlyc3QoKSwgRW1wdHlLZXkpKSB7CisgICAgICAgICAgaWYgKCFLZXlJbmZvVDo6aXNFcXVhbChQLT5nZXRGaXJzdCgpLCBUb21ic3RvbmVLZXkpKSB7CisgICAgICAgICAgICBQLT5nZXRTZWNvbmQoKS5+VmFsdWVUKCk7CisgICAgICAgICAgICAtLU51bUVudHJpZXM7CisgICAgICAgICAgfQorICAgICAgICAgIFAtPmdldEZpcnN0KCkgPSBFbXB0eUtleTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYXNzZXJ0KE51bUVudHJpZXMgPT0gMCAmJiAiTm9kZSBjb3VudCBpbWJhbGFuY2UhIik7CisgICAgfQorICAgIHNldE51bUVudHJpZXMoMCk7CisgICAgc2V0TnVtVG9tYnN0b25lcygwKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gMSBpZiB0aGUgc3BlY2lmaWVkIGtleSBpcyBpbiB0aGUgbWFwLCAwIG90aGVyd2lzZS4KKyAgc2l6ZV90eXBlIGNvdW50KGNvbnN0X2FyZ190eXBlX3Q8S2V5VD4gVmFsKSBjb25zdCB7CisgICAgY29uc3QgQnVja2V0VCAqVGhlQnVja2V0OworICAgIHJldHVybiBMb29rdXBCdWNrZXRGb3IoVmFsLCBUaGVCdWNrZXQpID8gMSA6IDA7CisgIH0KKworICBpdGVyYXRvciBmaW5kKGNvbnN0X2FyZ190eXBlX3Q8S2V5VD4gVmFsKSB7CisgICAgQnVja2V0VCAqVGhlQnVja2V0OworICAgIGlmIChMb29rdXBCdWNrZXRGb3IoVmFsLCBUaGVCdWNrZXQpKQorICAgICAgcmV0dXJuIG1ha2VJdGVyYXRvcihUaGVCdWNrZXQsIGdldEJ1Y2tldHNFbmQoKSwgKnRoaXMsIHRydWUpOworICAgIHJldHVybiBlbmQoKTsKKyAgfQorICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0X2FyZ190eXBlX3Q8S2V5VD4gVmFsKSBjb25zdCB7CisgICAgY29uc3QgQnVja2V0VCAqVGhlQnVja2V0OworICAgIGlmIChMb29rdXBCdWNrZXRGb3IoVmFsLCBUaGVCdWNrZXQpKQorICAgICAgcmV0dXJuIG1ha2VDb25zdEl0ZXJhdG9yKFRoZUJ1Y2tldCwgZ2V0QnVja2V0c0VuZCgpLCAqdGhpcywgdHJ1ZSk7CisgICAgcmV0dXJuIGVuZCgpOworICB9CisKKyAgLy8vIEFsdGVybmF0ZSB2ZXJzaW9uIG9mIGZpbmQoKSB3aGljaCBhbGxvd3MgYSBkaWZmZXJlbnQsIGFuZCBwb3NzaWJseQorICAvLy8gbGVzcyBleHBlbnNpdmUsIGtleSB0eXBlLgorICAvLy8gVGhlIERlbnNlTWFwSW5mbyBpcyByZXNwb25zaWJsZSBmb3Igc3VwcGx5aW5nIG1ldGhvZHMKKyAgLy8vIGdldEhhc2hWYWx1ZShMb29rdXBLZXlUKSBhbmQgaXNFcXVhbChMb29rdXBLZXlULCBLZXlUKSBmb3IgZWFjaCBrZXkKKyAgLy8vIHR5cGUgdXNlZC4KKyAgdGVtcGxhdGU8Y2xhc3MgTG9va3VwS2V5VD4KKyAgaXRlcmF0b3IgZmluZF9hcyhjb25zdCBMb29rdXBLZXlUICZWYWwpIHsKKyAgICBCdWNrZXRUICpUaGVCdWNrZXQ7CisgICAgaWYgKExvb2t1cEJ1Y2tldEZvcihWYWwsIFRoZUJ1Y2tldCkpCisgICAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKFRoZUJ1Y2tldCwgZ2V0QnVja2V0c0VuZCgpLCAqdGhpcywgdHJ1ZSk7CisgICAgcmV0dXJuIGVuZCgpOworICB9CisgIHRlbXBsYXRlPGNsYXNzIExvb2t1cEtleVQ+CisgIGNvbnN0X2l0ZXJhdG9yIGZpbmRfYXMoY29uc3QgTG9va3VwS2V5VCAmVmFsKSBjb25zdCB7CisgICAgY29uc3QgQnVja2V0VCAqVGhlQnVja2V0OworICAgIGlmIChMb29rdXBCdWNrZXRGb3IoVmFsLCBUaGVCdWNrZXQpKQorICAgICAgcmV0dXJuIG1ha2VDb25zdEl0ZXJhdG9yKFRoZUJ1Y2tldCwgZ2V0QnVja2V0c0VuZCgpLCAqdGhpcywgdHJ1ZSk7CisgICAgcmV0dXJuIGVuZCgpOworICB9CisKKyAgLy8vIGxvb2t1cCAtIFJldHVybiB0aGUgZW50cnkgZm9yIHRoZSBzcGVjaWZpZWQga2V5LCBvciBhIGRlZmF1bHQKKyAgLy8vIGNvbnN0cnVjdGVkIHZhbHVlIGlmIG5vIHN1Y2ggZW50cnkgZXhpc3RzLgorICBWYWx1ZVQgbG9va3VwKGNvbnN0X2FyZ190eXBlX3Q8S2V5VD4gVmFsKSBjb25zdCB7CisgICAgY29uc3QgQnVja2V0VCAqVGhlQnVja2V0OworICAgIGlmIChMb29rdXBCdWNrZXRGb3IoVmFsLCBUaGVCdWNrZXQpKQorICAgICAgcmV0dXJuIFRoZUJ1Y2tldC0+Z2V0U2Vjb25kKCk7CisgICAgcmV0dXJuIFZhbHVlVCgpOworICB9CisKKyAgLy8gSW5zZXJ0cyBrZXksdmFsdWUgcGFpciBpbnRvIHRoZSBtYXAgaWYgdGhlIGtleSBpc24ndCBhbHJlYWR5IGluIHRoZSBtYXAuCisgIC8vIElmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiB0aGUgbWFwLCBpdCByZXR1cm5zIGZhbHNlIGFuZCBkb2Vzbid0IHVwZGF0ZSB0aGUKKyAgLy8gdmFsdWUuCisgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KGNvbnN0IHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+ICZLVikgeworICAgIHJldHVybiB0cnlfZW1wbGFjZShLVi5maXJzdCwgS1Yuc2Vjb25kKTsKKyAgfQorCisgIC8vIEluc2VydHMga2V5LHZhbHVlIHBhaXIgaW50byB0aGUgbWFwIGlmIHRoZSBrZXkgaXNuJ3QgYWxyZWFkeSBpbiB0aGUgbWFwLgorICAvLyBJZiB0aGUga2V5IGlzIGFscmVhZHkgaW4gdGhlIG1hcCwgaXQgcmV0dXJucyBmYWxzZSBhbmQgZG9lc24ndCB1cGRhdGUgdGhlCisgIC8vIHZhbHVlLgorICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydChzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPiAmJktWKSB7CisgICAgcmV0dXJuIHRyeV9lbXBsYWNlKHN0ZDo6bW92ZShLVi5maXJzdCksIHN0ZDo6bW92ZShLVi5zZWNvbmQpKTsKKyAgfQorCisgIC8vIEluc2VydHMga2V5LHZhbHVlIHBhaXIgaW50byB0aGUgbWFwIGlmIHRoZSBrZXkgaXNuJ3QgYWxyZWFkeSBpbiB0aGUgbWFwLgorICAvLyBUaGUgdmFsdWUgaXMgY29uc3RydWN0ZWQgaW4tcGxhY2UgaWYgdGhlIGtleSBpcyBub3QgaW4gdGhlIG1hcCwgb3RoZXJ3aXNlCisgIC8vIGl0IGlzIG5vdCBtb3ZlZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFRzPgorICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IHRyeV9lbXBsYWNlKEtleVQgJiZLZXksIFRzICYmLi4uIEFyZ3MpIHsKKyAgICBCdWNrZXRUICpUaGVCdWNrZXQ7CisgICAgaWYgKExvb2t1cEJ1Y2tldEZvcihLZXksIFRoZUJ1Y2tldCkpCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICBtYWtlSXRlcmF0b3IoVGhlQnVja2V0LCBnZXRCdWNrZXRzRW5kKCksICp0aGlzLCB0cnVlKSwKKyAgICAgICAgICAgICAgIGZhbHNlKTsgLy8gQWxyZWFkeSBpbiBtYXAuCisKKyAgICAvLyBPdGhlcndpc2UsIGluc2VydCB0aGUgbmV3IGVsZW1lbnQuCisgICAgVGhlQnVja2V0ID0KKyAgICAgICAgSW5zZXJ0SW50b0J1Y2tldChUaGVCdWNrZXQsIHN0ZDo6bW92ZShLZXkpLCBzdGQ6OmZvcndhcmQ8VHM+KEFyZ3MpLi4uKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgbWFrZUl0ZXJhdG9yKFRoZUJ1Y2tldCwgZ2V0QnVja2V0c0VuZCgpLCAqdGhpcywgdHJ1ZSksCisgICAgICAgICAgICAgdHJ1ZSk7CisgIH0KKworICAvLyBJbnNlcnRzIGtleSx2YWx1ZSBwYWlyIGludG8gdGhlIG1hcCBpZiB0aGUga2V5IGlzbid0IGFscmVhZHkgaW4gdGhlIG1hcC4KKyAgLy8gVGhlIHZhbHVlIGlzIGNvbnN0cnVjdGVkIGluLXBsYWNlIGlmIHRoZSBrZXkgaXMgbm90IGluIHRoZSBtYXAsIG90aGVyd2lzZQorICAvLyBpdCBpcyBub3QgbW92ZWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUcz4KKyAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiB0cnlfZW1wbGFjZShjb25zdCBLZXlUICZLZXksIFRzICYmLi4uIEFyZ3MpIHsKKyAgICBCdWNrZXRUICpUaGVCdWNrZXQ7CisgICAgaWYgKExvb2t1cEJ1Y2tldEZvcihLZXksIFRoZUJ1Y2tldCkpCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICBtYWtlSXRlcmF0b3IoVGhlQnVja2V0LCBnZXRCdWNrZXRzRW5kKCksICp0aGlzLCB0cnVlKSwKKyAgICAgICAgICAgICAgIGZhbHNlKTsgLy8gQWxyZWFkeSBpbiBtYXAuCisKKyAgICAvLyBPdGhlcndpc2UsIGluc2VydCB0aGUgbmV3IGVsZW1lbnQuCisgICAgVGhlQnVja2V0ID0gSW5zZXJ0SW50b0J1Y2tldChUaGVCdWNrZXQsIEtleSwgc3RkOjpmb3J3YXJkPFRzPihBcmdzKS4uLik7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgIG1ha2VJdGVyYXRvcihUaGVCdWNrZXQsIGdldEJ1Y2tldHNFbmQoKSwgKnRoaXMsIHRydWUpLAorICAgICAgICAgICAgIHRydWUpOworICB9CisKKyAgLy8vIEFsdGVybmF0ZSB2ZXJzaW9uIG9mIGluc2VydCgpIHdoaWNoIGFsbG93cyBhIGRpZmZlcmVudCwgYW5kIHBvc3NpYmx5CisgIC8vLyBsZXNzIGV4cGVuc2l2ZSwga2V5IHR5cGUuCisgIC8vLyBUaGUgRGVuc2VNYXBJbmZvIGlzIHJlc3BvbnNpYmxlIGZvciBzdXBwbHlpbmcgbWV0aG9kcworICAvLy8gZ2V0SGFzaFZhbHVlKExvb2t1cEtleVQpIGFuZCBpc0VxdWFsKExvb2t1cEtleVQsIEtleVQpIGZvciBlYWNoIGtleQorICAvLy8gdHlwZSB1c2VkLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9va3VwS2V5VD4KKyAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnRfYXMoc3RkOjpwYWlyPEtleVQsIFZhbHVlVD4gJiZLViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9va3VwS2V5VCAmVmFsKSB7CisgICAgQnVja2V0VCAqVGhlQnVja2V0OworICAgIGlmIChMb29rdXBCdWNrZXRGb3IoVmFsLCBUaGVCdWNrZXQpKQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgbWFrZUl0ZXJhdG9yKFRoZUJ1Y2tldCwgZ2V0QnVja2V0c0VuZCgpLCAqdGhpcywgdHJ1ZSksCisgICAgICAgICAgICAgICBmYWxzZSk7IC8vIEFscmVhZHkgaW4gbWFwLgorCisgICAgLy8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIG5ldyBlbGVtZW50LgorICAgIFRoZUJ1Y2tldCA9IEluc2VydEludG9CdWNrZXRXaXRoTG9va3VwKFRoZUJ1Y2tldCwgc3RkOjptb3ZlKEtWLmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoS1Yuc2Vjb25kKSwgVmFsKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgbWFrZUl0ZXJhdG9yKFRoZUJ1Y2tldCwgZ2V0QnVja2V0c0VuZCgpLCAqdGhpcywgdHJ1ZSksCisgICAgICAgICAgICAgdHJ1ZSk7CisgIH0KKworICAvLy8gaW5zZXJ0IC0gUmFuZ2UgaW5zZXJ0aW9uIG9mIHBhaXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0PgorICB2b2lkIGluc2VydChJbnB1dEl0IEksIElucHV0SXQgRSkgeworICAgIGZvciAoOyBJICE9IEU7ICsrSSkKKyAgICAgIGluc2VydCgqSSk7CisgIH0KKworICBib29sIGVyYXNlKGNvbnN0IEtleVQgJlZhbCkgeworICAgIEJ1Y2tldFQgKlRoZUJ1Y2tldDsKKyAgICBpZiAoIUxvb2t1cEJ1Y2tldEZvcihWYWwsIFRoZUJ1Y2tldCkpCisgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vdCBpbiBtYXAuCisKKyAgICBUaGVCdWNrZXQtPmdldFNlY29uZCgpLn5WYWx1ZVQoKTsKKyAgICBUaGVCdWNrZXQtPmdldEZpcnN0KCkgPSBnZXRUb21ic3RvbmVLZXkoKTsKKyAgICBkZWNyZW1lbnROdW1FbnRyaWVzKCk7CisgICAgaW5jcmVtZW50TnVtVG9tYnN0b25lcygpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgSSkgeworICAgIEJ1Y2tldFQgKlRoZUJ1Y2tldCA9ICYqSTsKKyAgICBUaGVCdWNrZXQtPmdldFNlY29uZCgpLn5WYWx1ZVQoKTsKKyAgICBUaGVCdWNrZXQtPmdldEZpcnN0KCkgPSBnZXRUb21ic3RvbmVLZXkoKTsKKyAgICBkZWNyZW1lbnROdW1FbnRyaWVzKCk7CisgICAgaW5jcmVtZW50TnVtVG9tYnN0b25lcygpOworICB9CisKKyAgdmFsdWVfdHlwZSYgRmluZEFuZENvbnN0cnVjdChjb25zdCBLZXlUICZLZXkpIHsKKyAgICBCdWNrZXRUICpUaGVCdWNrZXQ7CisgICAgaWYgKExvb2t1cEJ1Y2tldEZvcihLZXksIFRoZUJ1Y2tldCkpCisgICAgICByZXR1cm4gKlRoZUJ1Y2tldDsKKworICAgIHJldHVybiAqSW5zZXJ0SW50b0J1Y2tldChUaGVCdWNrZXQsIEtleSk7CisgIH0KKworICBWYWx1ZVQgJm9wZXJhdG9yW10oY29uc3QgS2V5VCAmS2V5KSB7CisgICAgcmV0dXJuIEZpbmRBbmRDb25zdHJ1Y3QoS2V5KS5zZWNvbmQ7CisgIH0KKworICB2YWx1ZV90eXBlJiBGaW5kQW5kQ29uc3RydWN0KEtleVQgJiZLZXkpIHsKKyAgICBCdWNrZXRUICpUaGVCdWNrZXQ7CisgICAgaWYgKExvb2t1cEJ1Y2tldEZvcihLZXksIFRoZUJ1Y2tldCkpCisgICAgICByZXR1cm4gKlRoZUJ1Y2tldDsKKworICAgIHJldHVybiAqSW5zZXJ0SW50b0J1Y2tldChUaGVCdWNrZXQsIHN0ZDo6bW92ZShLZXkpKTsKKyAgfQorCisgIFZhbHVlVCAmb3BlcmF0b3JbXShLZXlUICYmS2V5KSB7CisgICAgcmV0dXJuIEZpbmRBbmRDb25zdHJ1Y3Qoc3RkOjptb3ZlKEtleSkpLnNlY29uZDsKKyAgfQorCisgIC8vLyBpc1BvaW50ZXJJbnRvQnVja2V0c0FycmF5IC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBwb2ludGVyIHBvaW50cworICAvLy8gc29tZXdoZXJlIGludG8gdGhlIERlbnNlTWFwJ3MgYXJyYXkgb2YgYnVja2V0cyAoaS5lLiBlaXRoZXIgdG8gYSBrZXkgb3IKKyAgLy8vIHZhbHVlIGluIHRoZSBEZW5zZU1hcCkuCisgIGJvb2wgaXNQb2ludGVySW50b0J1Y2tldHNBcnJheShjb25zdCB2b2lkICpQdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gUHRyID49IGdldEJ1Y2tldHMoKSAmJiBQdHIgPCBnZXRCdWNrZXRzRW5kKCk7CisgIH0KKworICAvLy8gZ2V0UG9pbnRlckludG9CdWNrZXRzQXJyYXkoKSAtIFJldHVybiBhbiBvcGFxdWUgcG9pbnRlciBpbnRvIHRoZSBidWNrZXRzCisgIC8vLyBhcnJheS4gIEluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHByZXZpb3VzIG1ldGhvZCwgdGhpcyBjYW4gYmUgdXNlZCB0bworICAvLy8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gaW5zZXJ0aW9uIGNhdXNlZCB0aGUgRGVuc2VNYXAgdG8gcmVhbGxvY2F0ZS4KKyAgY29uc3Qgdm9pZCAqZ2V0UG9pbnRlckludG9CdWNrZXRzQXJyYXkoKSBjb25zdCB7IHJldHVybiBnZXRCdWNrZXRzKCk7IH0KKworcHJvdGVjdGVkOgorICBEZW5zZU1hcEJhc2UoKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBkZXN0cm95QWxsKCkgeworICAgIGlmIChnZXROdW1CdWNrZXRzKCkgPT0gMCkgLy8gTm90aGluZyB0byBkby4KKyAgICAgIHJldHVybjsKKworICAgIGNvbnN0IEtleVQgRW1wdHlLZXkgPSBnZXRFbXB0eUtleSgpLCBUb21ic3RvbmVLZXkgPSBnZXRUb21ic3RvbmVLZXkoKTsKKyAgICBmb3IgKEJ1Y2tldFQgKlAgPSBnZXRCdWNrZXRzKCksICpFID0gZ2V0QnVja2V0c0VuZCgpOyBQICE9IEU7ICsrUCkgeworICAgICAgaWYgKCFLZXlJbmZvVDo6aXNFcXVhbChQLT5nZXRGaXJzdCgpLCBFbXB0eUtleSkgJiYKKyAgICAgICAgICAhS2V5SW5mb1Q6OmlzRXF1YWwoUC0+Z2V0Rmlyc3QoKSwgVG9tYnN0b25lS2V5KSkKKyAgICAgICAgUC0+Z2V0U2Vjb25kKCkuflZhbHVlVCgpOworICAgICAgUC0+Z2V0Rmlyc3QoKS5+S2V5VCgpOworICAgIH0KKyAgfQorCisgIHZvaWQgaW5pdEVtcHR5KCkgeworICAgIHNldE51bUVudHJpZXMoMCk7CisgICAgc2V0TnVtVG9tYnN0b25lcygwKTsKKworICAgIGFzc2VydCgoZ2V0TnVtQnVja2V0cygpICYgKGdldE51bUJ1Y2tldHMoKS0xKSkgPT0gMCAmJgorICAgICAgICAgICAiIyBpbml0aWFsIGJ1Y2tldHMgbXVzdCBiZSBhIHBvd2VyIG9mIHR3byEiKTsKKyAgICBjb25zdCBLZXlUIEVtcHR5S2V5ID0gZ2V0RW1wdHlLZXkoKTsKKyAgICBmb3IgKEJ1Y2tldFQgKkIgPSBnZXRCdWNrZXRzKCksICpFID0gZ2V0QnVja2V0c0VuZCgpOyBCICE9IEU7ICsrQikKKyAgICAgIDo6bmV3ICgmQi0+Z2V0Rmlyc3QoKSkgS2V5VChFbXB0eUtleSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgdG8gYWxsb2NhdGUgdG8gZW5zdXJlIHRoYXQgdGhlIERlbnNlTWFwIGNhbgorICAvLy8gYWNjb21tb2RhdGUgXHAgTnVtRW50cmllcyB3aXRob3V0IG5lZWQgdG8gZ3JvdygpLgorICB1bnNpZ25lZCBnZXRNaW5CdWNrZXRUb1Jlc2VydmVGb3JFbnRyaWVzKHVuc2lnbmVkIE51bUVudHJpZXMpIHsKKyAgICAvLyBFbnN1cmUgdGhhdCAiTnVtRW50cmllcyAqIDQgPCBOdW1CdWNrZXRzICogMyIKKyAgICBpZiAoTnVtRW50cmllcyA9PSAwKQorICAgICAgcmV0dXJuIDA7CisgICAgLy8gKzEgaXMgcmVxdWlyZWQgYmVjYXVzZSBvZiB0aGUgc3RyaWN0IGVxdWFsaXR5LgorICAgIC8vIEZvciBleGFtcGxlIGlmIE51bUVudHJpZXMgaXMgNDgsIHdlIG5lZWQgdG8gcmV0dXJuIDQwMS4KKyAgICByZXR1cm4gTmV4dFBvd2VyT2YyKE51bUVudHJpZXMgKiA0IC8gMyArIDEpOworICB9CisKKyAgdm9pZCBtb3ZlRnJvbU9sZEJ1Y2tldHMoQnVja2V0VCAqT2xkQnVja2V0c0JlZ2luLCBCdWNrZXRUICpPbGRCdWNrZXRzRW5kKSB7CisgICAgaW5pdEVtcHR5KCk7CisKKyAgICAvLyBJbnNlcnQgYWxsIHRoZSBvbGQgZWxlbWVudHMuCisgICAgY29uc3QgS2V5VCBFbXB0eUtleSA9IGdldEVtcHR5S2V5KCk7CisgICAgY29uc3QgS2V5VCBUb21ic3RvbmVLZXkgPSBnZXRUb21ic3RvbmVLZXkoKTsKKyAgICBmb3IgKEJ1Y2tldFQgKkIgPSBPbGRCdWNrZXRzQmVnaW4sICpFID0gT2xkQnVja2V0c0VuZDsgQiAhPSBFOyArK0IpIHsKKyAgICAgIGlmICghS2V5SW5mb1Q6OmlzRXF1YWwoQi0+Z2V0Rmlyc3QoKSwgRW1wdHlLZXkpICYmCisgICAgICAgICAgIUtleUluZm9UOjppc0VxdWFsKEItPmdldEZpcnN0KCksIFRvbWJzdG9uZUtleSkpIHsKKyAgICAgICAgLy8gSW5zZXJ0IHRoZSBrZXkvdmFsdWUgaW50byB0aGUgbmV3IHRhYmxlLgorICAgICAgICBCdWNrZXRUICpEZXN0QnVja2V0OworICAgICAgICBib29sIEZvdW5kVmFsID0gTG9va3VwQnVja2V0Rm9yKEItPmdldEZpcnN0KCksIERlc3RCdWNrZXQpOworICAgICAgICAodm9pZClGb3VuZFZhbDsgLy8gc2lsZW5jZSB3YXJuaW5nLgorICAgICAgICBhc3NlcnQoIUZvdW5kVmFsICYmICJLZXkgYWxyZWFkeSBpbiBuZXcgbWFwPyIpOworICAgICAgICBEZXN0QnVja2V0LT5nZXRGaXJzdCgpID0gc3RkOjptb3ZlKEItPmdldEZpcnN0KCkpOworICAgICAgICA6Om5ldyAoJkRlc3RCdWNrZXQtPmdldFNlY29uZCgpKSBWYWx1ZVQoc3RkOjptb3ZlKEItPmdldFNlY29uZCgpKSk7CisgICAgICAgIGluY3JlbWVudE51bUVudHJpZXMoKTsKKworICAgICAgICAvLyBGcmVlIHRoZSB2YWx1ZS4KKyAgICAgICAgQi0+Z2V0U2Vjb25kKCkuflZhbHVlVCgpOworICAgICAgfQorICAgICAgQi0+Z2V0Rmlyc3QoKS5+S2V5VCgpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdGhlckJhc2VUPgorICB2b2lkIGNvcHlGcm9tKAorICAgICAgY29uc3QgRGVuc2VNYXBCYXNlPE90aGVyQmFzZVQsIEtleVQsIFZhbHVlVCwgS2V5SW5mb1QsIEJ1Y2tldFQ+ICZvdGhlcikgeworICAgIGFzc2VydCgmb3RoZXIgIT0gdGhpcyk7CisgICAgYXNzZXJ0KGdldE51bUJ1Y2tldHMoKSA9PSBvdGhlci5nZXROdW1CdWNrZXRzKCkpOworCisgICAgc2V0TnVtRW50cmllcyhvdGhlci5nZXROdW1FbnRyaWVzKCkpOworICAgIHNldE51bVRvbWJzdG9uZXMob3RoZXIuZ2V0TnVtVG9tYnN0b25lcygpKTsKKworICAgIGlmIChpc1BvZExpa2U8S2V5VD46OnZhbHVlICYmIGlzUG9kTGlrZTxWYWx1ZVQ+Ojp2YWx1ZSkKKyAgICAgIG1lbWNweShnZXRCdWNrZXRzKCksIG90aGVyLmdldEJ1Y2tldHMoKSwKKyAgICAgICAgICAgICBnZXROdW1CdWNrZXRzKCkgKiBzaXplb2YoQnVja2V0VCkpOworICAgIGVsc2UKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZ2V0TnVtQnVja2V0cygpOyArK2kpIHsKKyAgICAgICAgOjpuZXcgKCZnZXRCdWNrZXRzKClbaV0uZ2V0Rmlyc3QoKSkKKyAgICAgICAgICAgIEtleVQob3RoZXIuZ2V0QnVja2V0cygpW2ldLmdldEZpcnN0KCkpOworICAgICAgICBpZiAoIUtleUluZm9UOjppc0VxdWFsKGdldEJ1Y2tldHMoKVtpXS5nZXRGaXJzdCgpLCBnZXRFbXB0eUtleSgpKSAmJgorICAgICAgICAgICAgIUtleUluZm9UOjppc0VxdWFsKGdldEJ1Y2tldHMoKVtpXS5nZXRGaXJzdCgpLCBnZXRUb21ic3RvbmVLZXkoKSkpCisgICAgICAgICAgOjpuZXcgKCZnZXRCdWNrZXRzKClbaV0uZ2V0U2Vjb25kKCkpCisgICAgICAgICAgICAgIFZhbHVlVChvdGhlci5nZXRCdWNrZXRzKClbaV0uZ2V0U2Vjb25kKCkpOworICAgICAgfQorICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBLZXlUICZWYWwpIHsKKyAgICByZXR1cm4gS2V5SW5mb1Q6OmdldEhhc2hWYWx1ZShWYWwpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTG9va3VwS2V5VD4KKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBMb29rdXBLZXlUICZWYWwpIHsKKyAgICByZXR1cm4gS2V5SW5mb1Q6OmdldEhhc2hWYWx1ZShWYWwpOworICB9CisKKyAgc3RhdGljIGNvbnN0IEtleVQgZ2V0RW1wdHlLZXkoKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Jhc2Vfb2Y8RGVuc2VNYXBCYXNlLCBEZXJpdmVkVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIk11c3QgcGFzcyB0aGUgZGVyaXZlZCB0eXBlIHRvIHRoaXMgdGVtcGxhdGUhIik7CisgICAgcmV0dXJuIEtleUluZm9UOjpnZXRFbXB0eUtleSgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IEtleVQgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiBLZXlJbmZvVDo6Z2V0VG9tYnN0b25lS2V5KCk7CisgIH0KKworcHJpdmF0ZToKKyAgaXRlcmF0b3IgbWFrZUl0ZXJhdG9yKEJ1Y2tldFQgKlAsIEJ1Y2tldFQgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0Vwb2NoQmFzZSAmRXBvY2gsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIE5vQWR2YW5jZT1mYWxzZSkgeworICAgIGlmIChzaG91bGRSZXZlcnNlSXRlcmF0ZTxLZXlUPigpKSB7CisgICAgICBCdWNrZXRUICpCID0gUCA9PSBnZXRCdWNrZXRzRW5kKCkgPyBnZXRCdWNrZXRzKCkgOiBQICsgMTsKKyAgICAgIHJldHVybiBpdGVyYXRvcihCLCBFLCBFcG9jaCwgTm9BZHZhbmNlKTsKKyAgICB9CisgICAgcmV0dXJuIGl0ZXJhdG9yKFAsIEUsIEVwb2NoLCBOb0FkdmFuY2UpOworICB9CisKKyAgY29uc3RfaXRlcmF0b3IgbWFrZUNvbnN0SXRlcmF0b3IoY29uc3QgQnVja2V0VCAqUCwgY29uc3QgQnVja2V0VCAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdFcG9jaEJhc2UgJkVwb2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIE5vQWR2YW5jZT1mYWxzZSkgY29uc3QgeworICAgIGlmIChzaG91bGRSZXZlcnNlSXRlcmF0ZTxLZXlUPigpKSB7CisgICAgICBjb25zdCBCdWNrZXRUICpCID0gUCA9PSBnZXRCdWNrZXRzRW5kKCkgPyBnZXRCdWNrZXRzKCkgOiBQICsgMTsKKyAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihCLCBFLCBFcG9jaCwgTm9BZHZhbmNlKTsKKyAgICB9CisgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKFAsIEUsIEVwb2NoLCBOb0FkdmFuY2UpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtRW50cmllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZFQgKj4odGhpcyktPmdldE51bUVudHJpZXMoKTsKKyAgfQorCisgIHZvaWQgc2V0TnVtRW50cmllcyh1bnNpZ25lZCBOdW0pIHsKKyAgICBzdGF0aWNfY2FzdDxEZXJpdmVkVCAqPih0aGlzKS0+c2V0TnVtRW50cmllcyhOdW0pOworICB9CisKKyAgdm9pZCBpbmNyZW1lbnROdW1FbnRyaWVzKCkgeworICAgIHNldE51bUVudHJpZXMoZ2V0TnVtRW50cmllcygpICsgMSk7CisgIH0KKworICB2b2lkIGRlY3JlbWVudE51bUVudHJpZXMoKSB7CisgICAgc2V0TnVtRW50cmllcyhnZXROdW1FbnRyaWVzKCkgLSAxKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bVRvbWJzdG9uZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWRUICo+KHRoaXMpLT5nZXROdW1Ub21ic3RvbmVzKCk7CisgIH0KKworICB2b2lkIHNldE51bVRvbWJzdG9uZXModW5zaWduZWQgTnVtKSB7CisgICAgc3RhdGljX2Nhc3Q8RGVyaXZlZFQgKj4odGhpcyktPnNldE51bVRvbWJzdG9uZXMoTnVtKTsKKyAgfQorCisgIHZvaWQgaW5jcmVtZW50TnVtVG9tYnN0b25lcygpIHsKKyAgICBzZXROdW1Ub21ic3RvbmVzKGdldE51bVRvbWJzdG9uZXMoKSArIDEpOworICB9CisKKyAgdm9pZCBkZWNyZW1lbnROdW1Ub21ic3RvbmVzKCkgeworICAgIHNldE51bVRvbWJzdG9uZXMoZ2V0TnVtVG9tYnN0b25lcygpIC0gMSk7CisgIH0KKworICBjb25zdCBCdWNrZXRUICpnZXRCdWNrZXRzKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkVCAqPih0aGlzKS0+Z2V0QnVja2V0cygpOworICB9CisKKyAgQnVja2V0VCAqZ2V0QnVja2V0cygpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVyaXZlZFQgKj4odGhpcyktPmdldEJ1Y2tldHMoKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUJ1Y2tldHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWRUICo+KHRoaXMpLT5nZXROdW1CdWNrZXRzKCk7CisgIH0KKworICBCdWNrZXRUICpnZXRCdWNrZXRzRW5kKCkgeworICAgIHJldHVybiBnZXRCdWNrZXRzKCkgKyBnZXROdW1CdWNrZXRzKCk7CisgIH0KKworICBjb25zdCBCdWNrZXRUICpnZXRCdWNrZXRzRW5kKCkgY29uc3QgeworICAgIHJldHVybiBnZXRCdWNrZXRzKCkgKyBnZXROdW1CdWNrZXRzKCk7CisgIH0KKworICB2b2lkIGdyb3codW5zaWduZWQgQXRMZWFzdCkgeworICAgIHN0YXRpY19jYXN0PERlcml2ZWRUICo+KHRoaXMpLT5ncm93KEF0TGVhc3QpOworICB9CisKKyAgdm9pZCBzaHJpbmtfYW5kX2NsZWFyKCkgeworICAgIHN0YXRpY19jYXN0PERlcml2ZWRUICo+KHRoaXMpLT5zaHJpbmtfYW5kX2NsZWFyKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5QXJnLCB0eXBlbmFtZS4uLiBWYWx1ZUFyZ3M+CisgIEJ1Y2tldFQgKkluc2VydEludG9CdWNrZXQoQnVja2V0VCAqVGhlQnVja2V0LCBLZXlBcmcgJiZLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVBcmdzICYmLi4uIFZhbHVlcykgeworICAgIFRoZUJ1Y2tldCA9IEluc2VydEludG9CdWNrZXRJbXBsKEtleSwgS2V5LCBUaGVCdWNrZXQpOworCisgICAgVGhlQnVja2V0LT5nZXRGaXJzdCgpID0gc3RkOjpmb3J3YXJkPEtleUFyZz4oS2V5KTsKKyAgICA6Om5ldyAoJlRoZUJ1Y2tldC0+Z2V0U2Vjb25kKCkpIFZhbHVlVChzdGQ6OmZvcndhcmQ8VmFsdWVBcmdzPihWYWx1ZXMpLi4uKTsKKyAgICByZXR1cm4gVGhlQnVja2V0OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIExvb2t1cEtleVQ+CisgIEJ1Y2tldFQgKkluc2VydEludG9CdWNrZXRXaXRoTG9va3VwKEJ1Y2tldFQgKlRoZUJ1Y2tldCwgS2V5VCAmJktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVUICYmVmFsdWUsIExvb2t1cEtleVQgJkxvb2t1cCkgeworICAgIFRoZUJ1Y2tldCA9IEluc2VydEludG9CdWNrZXRJbXBsKEtleSwgTG9va3VwLCBUaGVCdWNrZXQpOworCisgICAgVGhlQnVja2V0LT5nZXRGaXJzdCgpID0gc3RkOjptb3ZlKEtleSk7CisgICAgOjpuZXcgKCZUaGVCdWNrZXQtPmdldFNlY29uZCgpKSBWYWx1ZVQoc3RkOjptb3ZlKFZhbHVlKSk7CisgICAgcmV0dXJuIFRoZUJ1Y2tldDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBMb29rdXBLZXlUPgorICBCdWNrZXRUICpJbnNlcnRJbnRvQnVja2V0SW1wbChjb25zdCBLZXlUICZLZXksIGNvbnN0IExvb2t1cEtleVQgJkxvb2t1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVja2V0VCAqVGhlQnVja2V0KSB7CisgICAgaW5jcmVtZW50RXBvY2goKTsKKworICAgIC8vIElmIHRoZSBsb2FkIG9mIHRoZSBoYXNoIHRhYmxlIGlzIG1vcmUgdGhhbiAzLzQsIG9yIGlmIGZld2VyIHRoYW4gMS84IG9mCisgICAgLy8gdGhlIGJ1Y2tldHMgYXJlIGVtcHR5IChtZWFuaW5nIHRoYXQgbWFueSBhcmUgZmlsbGVkIHdpdGggdG9tYnN0b25lcyksCisgICAgLy8gZ3JvdyB0aGUgdGFibGUuCisgICAgLy8KKyAgICAvLyBUaGUgbGF0ZXIgY2FzZSBpcyB0cmlja3kuICBGb3IgZXhhbXBsZSwgaWYgd2UgaGFkIG9uZSBlbXB0eSBidWNrZXQgd2l0aAorICAgIC8vIHRvbnMgb2YgdG9tYnN0b25lcywgZmFpbGluZyBsb29rdXBzIChlLmcuIGZvciBpbnNlcnRpb24pIHdvdWxkIGhhdmUgdG8KKyAgICAvLyBwcm9iZSBhbG1vc3QgdGhlIGVudGlyZSB0YWJsZSB1bnRpbCBpdCBmb3VuZCB0aGUgZW1wdHkgYnVja2V0LiAgSWYgdGhlCisgICAgLy8gdGFibGUgY29tcGxldGVseSBmaWxsZWQgd2l0aCB0b21ic3RvbmVzLCBubyBsb29rdXAgd291bGQgZXZlciBzdWNjZWVkLAorICAgIC8vIGNhdXNpbmcgaW5maW5pdGUgbG9vcHMgaW4gbG9va3VwLgorICAgIHVuc2lnbmVkIE5ld051bUVudHJpZXMgPSBnZXROdW1FbnRyaWVzKCkgKyAxOworICAgIHVuc2lnbmVkIE51bUJ1Y2tldHMgPSBnZXROdW1CdWNrZXRzKCk7CisgICAgaWYgKExMVk1fVU5MSUtFTFkoTmV3TnVtRW50cmllcyAqIDQgPj0gTnVtQnVja2V0cyAqIDMpKSB7CisgICAgICB0aGlzLT5ncm93KE51bUJ1Y2tldHMgKiAyKTsKKyAgICAgIExvb2t1cEJ1Y2tldEZvcihMb29rdXAsIFRoZUJ1Y2tldCk7CisgICAgICBOdW1CdWNrZXRzID0gZ2V0TnVtQnVja2V0cygpOworICAgIH0gZWxzZSBpZiAoTExWTV9VTkxJS0VMWShOdW1CdWNrZXRzLShOZXdOdW1FbnRyaWVzK2dldE51bVRvbWJzdG9uZXMoKSkgPD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQnVja2V0cy84KSkgeworICAgICAgdGhpcy0+Z3JvdyhOdW1CdWNrZXRzKTsKKyAgICAgIExvb2t1cEJ1Y2tldEZvcihMb29rdXAsIFRoZUJ1Y2tldCk7CisgICAgfQorICAgIGFzc2VydChUaGVCdWNrZXQpOworCisgICAgLy8gT25seSB1cGRhdGUgdGhlIHN0YXRlIGFmdGVyIHdlJ3ZlIGdyb3duIG91ciBidWNrZXQgc3BhY2UgYXBwcm9wcmlhdGVseQorICAgIC8vIHNvIHRoYXQgd2hlbiBncm93aW5nIGJ1Y2tldHMgd2UgaGF2ZSBzZWxmLWNvbnNpc3RlbnQgZW50cnkgY291bnQuCisgICAgaW5jcmVtZW50TnVtRW50cmllcygpOworCisgICAgLy8gSWYgd2UgYXJlIHdyaXRpbmcgb3ZlciBhIHRvbWJzdG9uZSwgcmVtZW1iZXIgdGhpcy4KKyAgICBjb25zdCBLZXlUIEVtcHR5S2V5ID0gZ2V0RW1wdHlLZXkoKTsKKyAgICBpZiAoIUtleUluZm9UOjppc0VxdWFsKFRoZUJ1Y2tldC0+Z2V0Rmlyc3QoKSwgRW1wdHlLZXkpKQorICAgICAgZGVjcmVtZW50TnVtVG9tYnN0b25lcygpOworCisgICAgcmV0dXJuIFRoZUJ1Y2tldDsKKyAgfQorCisgIC8vLyBMb29rdXBCdWNrZXRGb3IgLSBMb29rdXAgdGhlIGFwcHJvcHJpYXRlIGJ1Y2tldCBmb3IgVmFsLCByZXR1cm5pbmcgaXQgaW4KKyAgLy8vIEZvdW5kQnVja2V0LiAgSWYgdGhlIGJ1Y2tldCBjb250YWlucyB0aGUga2V5IGFuZCBhIHZhbHVlLCB0aGlzIHJldHVybnMKKyAgLy8vIHRydWUsIG90aGVyd2lzZSBpdCByZXR1cm5zIGEgYnVja2V0IHdpdGggYW4gZW1wdHkgbWFya2VyIG9yIHRvbWJzdG9uZSBhbmQKKyAgLy8vIHJldHVybnMgZmFsc2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIExvb2t1cEtleVQ+CisgIGJvb2wgTG9va3VwQnVja2V0Rm9yKGNvbnN0IExvb2t1cEtleVQgJlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVja2V0VCAqJkZvdW5kQnVja2V0KSBjb25zdCB7CisgICAgY29uc3QgQnVja2V0VCAqQnVja2V0c1B0ciA9IGdldEJ1Y2tldHMoKTsKKyAgICBjb25zdCB1bnNpZ25lZCBOdW1CdWNrZXRzID0gZ2V0TnVtQnVja2V0cygpOworCisgICAgaWYgKE51bUJ1Y2tldHMgPT0gMCkgeworICAgICAgRm91bmRCdWNrZXQgPSBudWxscHRyOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEZvdW5kVG9tYnN0b25lIC0gS2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlIGZpbmQgYSB0b21ic3RvbmUgd2hpbGUgcHJvYmluZy4KKyAgICBjb25zdCBCdWNrZXRUICpGb3VuZFRvbWJzdG9uZSA9IG51bGxwdHI7CisgICAgY29uc3QgS2V5VCBFbXB0eUtleSA9IGdldEVtcHR5S2V5KCk7CisgICAgY29uc3QgS2V5VCBUb21ic3RvbmVLZXkgPSBnZXRUb21ic3RvbmVLZXkoKTsKKyAgICBhc3NlcnQoIUtleUluZm9UOjppc0VxdWFsKFZhbCwgRW1wdHlLZXkpICYmCisgICAgICAgICAgICFLZXlJbmZvVDo6aXNFcXVhbChWYWwsIFRvbWJzdG9uZUtleSkgJiYKKyAgICAgICAgICAgIkVtcHR5L1RvbWJzdG9uZSB2YWx1ZSBzaG91bGRuJ3QgYmUgaW5zZXJ0ZWQgaW50byBtYXAhIik7CisKKyAgICB1bnNpZ25lZCBCdWNrZXRObyA9IGdldEhhc2hWYWx1ZShWYWwpICYgKE51bUJ1Y2tldHMtMSk7CisgICAgdW5zaWduZWQgUHJvYmVBbXQgPSAxOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBjb25zdCBCdWNrZXRUICpUaGlzQnVja2V0ID0gQnVja2V0c1B0ciArIEJ1Y2tldE5vOworICAgICAgLy8gRm91bmQgVmFsJ3MgYnVja2V0PyAgSWYgc28sIHJldHVybiBpdC4KKyAgICAgIGlmIChMTFZNX0xJS0VMWShLZXlJbmZvVDo6aXNFcXVhbChWYWwsIFRoaXNCdWNrZXQtPmdldEZpcnN0KCkpKSkgeworICAgICAgICBGb3VuZEJ1Y2tldCA9IFRoaXNCdWNrZXQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICAvLyBJZiB3ZSBmb3VuZCBhbiBlbXB0eSBidWNrZXQsIHRoZSBrZXkgZG9lc24ndCBleGlzdCBpbiB0aGUgc2V0LgorICAgICAgLy8gSW5zZXJ0IGl0IGFuZCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgICBpZiAoTExWTV9MSUtFTFkoS2V5SW5mb1Q6OmlzRXF1YWwoVGhpc0J1Y2tldC0+Z2V0Rmlyc3QoKSwgRW1wdHlLZXkpKSkgeworICAgICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gYSB0b21ic3RvbmUgd2hpbGUgcHJvYmluZywgZmlsbCBpdCBpbiBpbnN0ZWFkCisgICAgICAgIC8vIG9mIHRoZSBlbXB0eSBidWNrZXQgd2UgZXZlbnR1YWxseSBwcm9iZWQgdG8uCisgICAgICAgIEZvdW5kQnVja2V0ID0gRm91bmRUb21ic3RvbmUgPyBGb3VuZFRvbWJzdG9uZSA6IFRoaXNCdWNrZXQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgLy8gSWYgdGhpcyBpcyBhIHRvbWJzdG9uZSwgcmVtZW1iZXIgaXQuICBJZiBWYWwgZW5kcyB1cCBub3QgaW4gdGhlIG1hcCwgd2UKKyAgICAgIC8vIHByZWZlciB0byByZXR1cm4gaXQgdGhhbiBzb21ldGhpbmcgdGhhdCB3b3VsZCByZXF1aXJlIG1vcmUgcHJvYmluZy4KKyAgICAgIGlmIChLZXlJbmZvVDo6aXNFcXVhbChUaGlzQnVja2V0LT5nZXRGaXJzdCgpLCBUb21ic3RvbmVLZXkpICYmCisgICAgICAgICAgIUZvdW5kVG9tYnN0b25lKQorICAgICAgICBGb3VuZFRvbWJzdG9uZSA9IFRoaXNCdWNrZXQ7ICAvLyBSZW1lbWJlciB0aGUgZmlyc3QgdG9tYnN0b25lIGZvdW5kLgorCisgICAgICAvLyBPdGhlcndpc2UsIGl0J3MgYSBoYXNoIGNvbGxpc2lvbiBvciBhIHRvbWJzdG9uZSwgY29udGludWUgcXVhZHJhdGljCisgICAgICAvLyBwcm9iaW5nLgorICAgICAgQnVja2V0Tm8gKz0gUHJvYmVBbXQrKzsKKyAgICAgIEJ1Y2tldE5vICY9IChOdW1CdWNrZXRzLTEpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBMb29rdXBLZXlUPgorICBib29sIExvb2t1cEJ1Y2tldEZvcihjb25zdCBMb29rdXBLZXlUICZWYWwsIEJ1Y2tldFQgKiZGb3VuZEJ1Y2tldCkgeworICAgIGNvbnN0IEJ1Y2tldFQgKkNvbnN0Rm91bmRCdWNrZXQ7CisgICAgYm9vbCBSZXN1bHQgPSBjb25zdF9jYXN0PGNvbnN0IERlbnNlTWFwQmFzZSAqPih0aGlzKQorICAgICAgLT5Mb29rdXBCdWNrZXRGb3IoVmFsLCBDb25zdEZvdW5kQnVja2V0KTsKKyAgICBGb3VuZEJ1Y2tldCA9IGNvbnN0X2Nhc3Q8QnVja2V0VCAqPihDb25zdEZvdW5kQnVja2V0KTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKK3B1YmxpYzoKKyAgLy8vIFJldHVybiB0aGUgYXBwcm94aW1hdGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBhY3R1YWwgbWFwLgorICAvLy8gVGhpcyBpcyBqdXN0IHRoZSByYXcgbWVtb3J5IHVzZWQgYnkgRGVuc2VNYXAuCisgIC8vLyBJZiBlbnRyaWVzIGFyZSBwb2ludGVycyB0byBvYmplY3RzLCB0aGUgc2l6ZSBvZiB0aGUgcmVmZXJlbmNlZCBvYmplY3RzCisgIC8vLyBhcmUgbm90IGluY2x1ZGVkLgorICBzaXplX3QgZ2V0TWVtb3J5U2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TnVtQnVja2V0cygpICogc2l6ZW9mKEJ1Y2tldFQpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsdWVULAorICAgICAgICAgIHR5cGVuYW1lIEtleUluZm9UID0gRGVuc2VNYXBJbmZvPEtleVQ+LAorICAgICAgICAgIHR5cGVuYW1lIEJ1Y2tldFQgPSBkZXRhaWw6OkRlbnNlTWFwUGFpcjxLZXlULCBWYWx1ZVQ+PgorY2xhc3MgRGVuc2VNYXAgOiBwdWJsaWMgRGVuc2VNYXBCYXNlPERlbnNlTWFwPEtleVQsIFZhbHVlVCwgS2V5SW5mb1QsIEJ1Y2tldFQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleVQsIFZhbHVlVCwgS2V5SW5mb1QsIEJ1Y2tldFQ+IHsKKyAgZnJpZW5kIGNsYXNzIERlbnNlTWFwQmFzZTxEZW5zZU1hcCwgS2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0VD47CisKKyAgLy8gTGlmdCBzb21lIHR5cGVzIGZyb20gdGhlIGRlcGVuZGVudCBiYXNlIGNsYXNzIGludG8gdGhpcyBjbGFzcyBmb3IKKyAgLy8gc2ltcGxpY2l0eSBvZiByZWZlcnJpbmcgdG8gdGhlbS4KKyAgdXNpbmcgQmFzZVQgPSBEZW5zZU1hcEJhc2U8RGVuc2VNYXAsIEtleVQsIFZhbHVlVCwgS2V5SW5mb1QsIEJ1Y2tldFQ+OworCisgIEJ1Y2tldFQgKkJ1Y2tldHM7CisgIHVuc2lnbmVkIE51bUVudHJpZXM7CisgIHVuc2lnbmVkIE51bVRvbWJzdG9uZXM7CisgIHVuc2lnbmVkIE51bUJ1Y2tldHM7CisKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZSBhIERlbnNlTWFwIHd0aCBhbiBvcHRpb25hbCBccCBJbml0aWFsUmVzZXJ2ZSB0aGF0IGd1YXJhbnRlZSB0aGF0CisgIC8vLyB0aGlzIG51bWJlciBvZiBlbGVtZW50cyBjYW4gYmUgaW5zZXJ0ZWQgaW4gdGhlIG1hcCB3aXRob3V0IGdyb3coKQorICBleHBsaWNpdCBEZW5zZU1hcCh1bnNpZ25lZCBJbml0aWFsUmVzZXJ2ZSA9IDApIHsgaW5pdChJbml0aWFsUmVzZXJ2ZSk7IH0KKworICBEZW5zZU1hcChjb25zdCBEZW5zZU1hcCAmb3RoZXIpIDogQmFzZVQoKSB7CisgICAgaW5pdCgwKTsKKyAgICBjb3B5RnJvbShvdGhlcik7CisgIH0KKworICBEZW5zZU1hcChEZW5zZU1hcCAmJm90aGVyKSA6IEJhc2VUKCkgeworICAgIGluaXQoMCk7CisgICAgc3dhcChvdGhlcik7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0PgorICBEZW5zZU1hcChjb25zdCBJbnB1dEl0ICZJLCBjb25zdCBJbnB1dEl0ICZFKSB7CisgICAgaW5pdChzdGQ6OmRpc3RhbmNlKEksIEUpKTsKKyAgICB0aGlzLT5pbnNlcnQoSSwgRSk7CisgIH0KKworICB+RGVuc2VNYXAoKSB7CisgICAgdGhpcy0+ZGVzdHJveUFsbCgpOworICAgIG9wZXJhdG9yIGRlbGV0ZShCdWNrZXRzKTsKKyAgfQorCisgIHZvaWQgc3dhcChEZW5zZU1hcCYgUkhTKSB7CisgICAgdGhpcy0+aW5jcmVtZW50RXBvY2goKTsKKyAgICBSSFMuaW5jcmVtZW50RXBvY2goKTsKKyAgICBzdGQ6OnN3YXAoQnVja2V0cywgUkhTLkJ1Y2tldHMpOworICAgIHN0ZDo6c3dhcChOdW1FbnRyaWVzLCBSSFMuTnVtRW50cmllcyk7CisgICAgc3RkOjpzd2FwKE51bVRvbWJzdG9uZXMsIFJIUy5OdW1Ub21ic3RvbmVzKTsKKyAgICBzdGQ6OnN3YXAoTnVtQnVja2V0cywgUkhTLk51bUJ1Y2tldHMpOworICB9CisKKyAgRGVuc2VNYXAmIG9wZXJhdG9yPShjb25zdCBEZW5zZU1hcCYgb3RoZXIpIHsKKyAgICBpZiAoJm90aGVyICE9IHRoaXMpCisgICAgICBjb3B5RnJvbShvdGhlcik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgRGVuc2VNYXAmIG9wZXJhdG9yPShEZW5zZU1hcCAmJm90aGVyKSB7CisgICAgdGhpcy0+ZGVzdHJveUFsbCgpOworICAgIG9wZXJhdG9yIGRlbGV0ZShCdWNrZXRzKTsKKyAgICBpbml0KDApOworICAgIHN3YXAob3RoZXIpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZvaWQgY29weUZyb20oY29uc3QgRGVuc2VNYXAmIG90aGVyKSB7CisgICAgdGhpcy0+ZGVzdHJveUFsbCgpOworICAgIG9wZXJhdG9yIGRlbGV0ZShCdWNrZXRzKTsKKyAgICBpZiAoYWxsb2NhdGVCdWNrZXRzKG90aGVyLk51bUJ1Y2tldHMpKSB7CisgICAgICB0aGlzLT5CYXNlVDo6Y29weUZyb20ob3RoZXIpOworICAgIH0gZWxzZSB7CisgICAgICBOdW1FbnRyaWVzID0gMDsKKyAgICAgIE51bVRvbWJzdG9uZXMgPSAwOworICAgIH0KKyAgfQorCisgIHZvaWQgaW5pdCh1bnNpZ25lZCBJbml0TnVtRW50cmllcykgeworICAgIGF1dG8gSW5pdEJ1Y2tldHMgPSBCYXNlVDo6Z2V0TWluQnVja2V0VG9SZXNlcnZlRm9yRW50cmllcyhJbml0TnVtRW50cmllcyk7CisgICAgaWYgKGFsbG9jYXRlQnVja2V0cyhJbml0QnVja2V0cykpIHsKKyAgICAgIHRoaXMtPkJhc2VUOjppbml0RW1wdHkoKTsKKyAgICB9IGVsc2UgeworICAgICAgTnVtRW50cmllcyA9IDA7CisgICAgICBOdW1Ub21ic3RvbmVzID0gMDsKKyAgICB9CisgIH0KKworICB2b2lkIGdyb3codW5zaWduZWQgQXRMZWFzdCkgeworICAgIHVuc2lnbmVkIE9sZE51bUJ1Y2tldHMgPSBOdW1CdWNrZXRzOworICAgIEJ1Y2tldFQgKk9sZEJ1Y2tldHMgPSBCdWNrZXRzOworCisgICAgYWxsb2NhdGVCdWNrZXRzKHN0ZDo6bWF4PHVuc2lnbmVkPig2NCwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KE5leHRQb3dlck9mMihBdExlYXN0LTEpKSkpOworICAgIGFzc2VydChCdWNrZXRzKTsKKyAgICBpZiAoIU9sZEJ1Y2tldHMpIHsKKyAgICAgIHRoaXMtPkJhc2VUOjppbml0RW1wdHkoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLT5tb3ZlRnJvbU9sZEJ1Y2tldHMoT2xkQnVja2V0cywgT2xkQnVja2V0cytPbGROdW1CdWNrZXRzKTsKKworICAgIC8vIEZyZWUgdGhlIG9sZCB0YWJsZS4KKyAgICBvcGVyYXRvciBkZWxldGUoT2xkQnVja2V0cyk7CisgIH0KKworICB2b2lkIHNocmlua19hbmRfY2xlYXIoKSB7CisgICAgdW5zaWduZWQgT2xkTnVtRW50cmllcyA9IE51bUVudHJpZXM7CisgICAgdGhpcy0+ZGVzdHJveUFsbCgpOworCisgICAgLy8gUmVkdWNlIHRoZSBudW1iZXIgb2YgYnVja2V0cy4KKyAgICB1bnNpZ25lZCBOZXdOdW1CdWNrZXRzID0gMDsKKyAgICBpZiAoT2xkTnVtRW50cmllcykKKyAgICAgIE5ld051bUJ1Y2tldHMgPSBzdGQ6Om1heCg2NCwgMSA8PCAoTG9nMl8zMl9DZWlsKE9sZE51bUVudHJpZXMpICsgMSkpOworICAgIGlmIChOZXdOdW1CdWNrZXRzID09IE51bUJ1Y2tldHMpIHsKKyAgICAgIHRoaXMtPkJhc2VUOjppbml0RW1wdHkoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBvcGVyYXRvciBkZWxldGUoQnVja2V0cyk7CisgICAgaW5pdChOZXdOdW1CdWNrZXRzKTsKKyAgfQorCitwcml2YXRlOgorICB1bnNpZ25lZCBnZXROdW1FbnRyaWVzKCkgY29uc3QgeworICAgIHJldHVybiBOdW1FbnRyaWVzOworICB9CisKKyAgdm9pZCBzZXROdW1FbnRyaWVzKHVuc2lnbmVkIE51bSkgeworICAgIE51bUVudHJpZXMgPSBOdW07CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1Ub21ic3RvbmVzKCkgY29uc3QgeworICAgIHJldHVybiBOdW1Ub21ic3RvbmVzOworICB9CisKKyAgdm9pZCBzZXROdW1Ub21ic3RvbmVzKHVuc2lnbmVkIE51bSkgeworICAgIE51bVRvbWJzdG9uZXMgPSBOdW07CisgIH0KKworICBCdWNrZXRUICpnZXRCdWNrZXRzKCkgY29uc3QgeworICAgIHJldHVybiBCdWNrZXRzOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtQnVja2V0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtQnVja2V0czsKKyAgfQorCisgIGJvb2wgYWxsb2NhdGVCdWNrZXRzKHVuc2lnbmVkIE51bSkgeworICAgIE51bUJ1Y2tldHMgPSBOdW07CisgICAgaWYgKE51bUJ1Y2tldHMgPT0gMCkgeworICAgICAgQnVja2V0cyA9IG51bGxwdHI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVja2V0cyA9IHN0YXRpY19jYXN0PEJ1Y2tldFQqPihvcGVyYXRvciBuZXcoc2l6ZW9mKEJ1Y2tldFQpICogTnVtQnVja2V0cykpOworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsdWVULCB1bnNpZ25lZCBJbmxpbmVCdWNrZXRzID0gNCwKKyAgICAgICAgICB0eXBlbmFtZSBLZXlJbmZvVCA9IERlbnNlTWFwSW5mbzxLZXlUPiwKKyAgICAgICAgICB0eXBlbmFtZSBCdWNrZXRUID0gZGV0YWlsOjpEZW5zZU1hcFBhaXI8S2V5VCwgVmFsdWVUPj4KK2NsYXNzIFNtYWxsRGVuc2VNYXAKKyAgICA6IHB1YmxpYyBEZW5zZU1hcEJhc2U8CisgICAgICAgICAgU21hbGxEZW5zZU1hcDxLZXlULCBWYWx1ZVQsIElubGluZUJ1Y2tldHMsIEtleUluZm9ULCBCdWNrZXRUPiwgS2V5VCwKKyAgICAgICAgICBWYWx1ZVQsIEtleUluZm9ULCBCdWNrZXRUPiB7CisgIGZyaWVuZCBjbGFzcyBEZW5zZU1hcEJhc2U8U21hbGxEZW5zZU1hcCwgS2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0VD47CisKKyAgLy8gTGlmdCBzb21lIHR5cGVzIGZyb20gdGhlIGRlcGVuZGVudCBiYXNlIGNsYXNzIGludG8gdGhpcyBjbGFzcyBmb3IKKyAgLy8gc2ltcGxpY2l0eSBvZiByZWZlcnJpbmcgdG8gdGhlbS4KKyAgdXNpbmcgQmFzZVQgPSBEZW5zZU1hcEJhc2U8U21hbGxEZW5zZU1hcCwgS2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0VD47CisKKyAgc3RhdGljX2Fzc2VydChpc1Bvd2VyT2YyXzY0KElubGluZUJ1Y2tldHMpLAorICAgICAgICAgICAgICAgICJJbmxpbmVCdWNrZXRzIG11c3QgYmUgYSBwb3dlciBvZiAyLiIpOworCisgIHVuc2lnbmVkIFNtYWxsIDogMTsKKyAgdW5zaWduZWQgTnVtRW50cmllcyA6IDMxOworICB1bnNpZ25lZCBOdW1Ub21ic3RvbmVzOworCisgIHN0cnVjdCBMYXJnZVJlcCB7CisgICAgQnVja2V0VCAqQnVja2V0czsKKyAgICB1bnNpZ25lZCBOdW1CdWNrZXRzOworICB9OworCisgIC8vLyBBICJ1bmlvbiIgb2YgYW4gaW5saW5lIGJ1Y2tldCBhcnJheSBhbmQgdGhlIHN0cnVjdCByZXByZXNlbnRpbmcKKyAgLy8vIGEgbGFyZ2UgYnVja2V0LiBUaGlzIHVuaW9uIHdpbGwgYmUgZGlzY3JpbWluYXRlZCBieSB0aGUgJ1NtYWxsJyBiaXQuCisgIEFsaWduZWRDaGFyQXJyYXlVbmlvbjxCdWNrZXRUW0lubGluZUJ1Y2tldHNdLCBMYXJnZVJlcD4gc3RvcmFnZTsKKworcHVibGljOgorICBleHBsaWNpdCBTbWFsbERlbnNlTWFwKHVuc2lnbmVkIE51bUluaXRCdWNrZXRzID0gMCkgeworICAgIGluaXQoTnVtSW5pdEJ1Y2tldHMpOworICB9CisKKyAgU21hbGxEZW5zZU1hcChjb25zdCBTbWFsbERlbnNlTWFwICZvdGhlcikgOiBCYXNlVCgpIHsKKyAgICBpbml0KDApOworICAgIGNvcHlGcm9tKG90aGVyKTsKKyAgfQorCisgIFNtYWxsRGVuc2VNYXAoU21hbGxEZW5zZU1hcCAmJm90aGVyKSA6IEJhc2VUKCkgeworICAgIGluaXQoMCk7CisgICAgc3dhcChvdGhlcik7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0PgorICBTbWFsbERlbnNlTWFwKGNvbnN0IElucHV0SXQgJkksIGNvbnN0IElucHV0SXQgJkUpIHsKKyAgICBpbml0KE5leHRQb3dlck9mMihzdGQ6OmRpc3RhbmNlKEksIEUpKSk7CisgICAgdGhpcy0+aW5zZXJ0KEksIEUpOworICB9CisKKyAgflNtYWxsRGVuc2VNYXAoKSB7CisgICAgdGhpcy0+ZGVzdHJveUFsbCgpOworICAgIGRlYWxsb2NhdGVCdWNrZXRzKCk7CisgIH0KKworICB2b2lkIHN3YXAoU21hbGxEZW5zZU1hcCYgUkhTKSB7CisgICAgdW5zaWduZWQgVG1wTnVtRW50cmllcyA9IFJIUy5OdW1FbnRyaWVzOworICAgIFJIUy5OdW1FbnRyaWVzID0gTnVtRW50cmllczsKKyAgICBOdW1FbnRyaWVzID0gVG1wTnVtRW50cmllczsKKyAgICBzdGQ6OnN3YXAoTnVtVG9tYnN0b25lcywgUkhTLk51bVRvbWJzdG9uZXMpOworCisgICAgY29uc3QgS2V5VCBFbXB0eUtleSA9IHRoaXMtPmdldEVtcHR5S2V5KCk7CisgICAgY29uc3QgS2V5VCBUb21ic3RvbmVLZXkgPSB0aGlzLT5nZXRUb21ic3RvbmVLZXkoKTsKKyAgICBpZiAoU21hbGwgJiYgUkhTLlNtYWxsKSB7CisgICAgICAvLyBJZiB3ZSdyZSBzd2FwcGluZyBpbmxpbmUgYnVja2V0IGFycmF5cywgd2UgaGF2ZSB0byBjb3BlIHdpdGggc29tZSBvZgorICAgICAgLy8gdGhlIHRyaWNreSBiaXRzIG9mIERlbnNlTWFwJ3Mgc3RvcmFnZSBzeXN0ZW06IHRoZSBidWNrZXRzIGFyZSBub3QKKyAgICAgIC8vIGZ1bGx5IGluaXRpYWxpemVkLiBUaHVzIHdlIHN3YXAgZXZlcnkga2V5LCBidXQgd2UgbWF5IGhhdmUKKyAgICAgIC8vIGEgb25lLWRpcmVjdGlvbmFsIG1vdmUgb2YgdGhlIHZhbHVlLgorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IElubGluZUJ1Y2tldHM7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIEJ1Y2tldFQgKkxIU0IgPSAmZ2V0SW5saW5lQnVja2V0cygpW2ldLAorICAgICAgICAgICAgICAgICpSSFNCID0gJlJIUy5nZXRJbmxpbmVCdWNrZXRzKClbaV07CisgICAgICAgIGJvb2wgaGFzTEhTVmFsdWUgPSAoIUtleUluZm9UOjppc0VxdWFsKExIU0ItPmdldEZpcnN0KCksIEVtcHR5S2V5KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFLZXlJbmZvVDo6aXNFcXVhbChMSFNCLT5nZXRGaXJzdCgpLCBUb21ic3RvbmVLZXkpKTsKKyAgICAgICAgYm9vbCBoYXNSSFNWYWx1ZSA9ICghS2V5SW5mb1Q6OmlzRXF1YWwoUkhTQi0+Z2V0Rmlyc3QoKSwgRW1wdHlLZXkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIUtleUluZm9UOjppc0VxdWFsKFJIU0ItPmdldEZpcnN0KCksIFRvbWJzdG9uZUtleSkpOworICAgICAgICBpZiAoaGFzTEhTVmFsdWUgJiYgaGFzUkhTVmFsdWUpIHsKKyAgICAgICAgICAvLyBTd2FwIHRvZ2V0aGVyIGlmIHdlIGNhbi4uLgorICAgICAgICAgIHN0ZDo6c3dhcCgqTEhTQiwgKlJIU0IpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIFN3YXAgc2VwYXJhdGVseSBhbmQgaGFuZGxlIGFueSBhc3N5bWV0cnkuCisgICAgICAgIHN0ZDo6c3dhcChMSFNCLT5nZXRGaXJzdCgpLCBSSFNCLT5nZXRGaXJzdCgpKTsKKyAgICAgICAgaWYgKGhhc0xIU1ZhbHVlKSB7CisgICAgICAgICAgOjpuZXcgKCZSSFNCLT5nZXRTZWNvbmQoKSkgVmFsdWVUKHN0ZDo6bW92ZShMSFNCLT5nZXRTZWNvbmQoKSkpOworICAgICAgICAgIExIU0ItPmdldFNlY29uZCgpLn5WYWx1ZVQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChoYXNSSFNWYWx1ZSkgeworICAgICAgICAgIDo6bmV3ICgmTEhTQi0+Z2V0U2Vjb25kKCkpIFZhbHVlVChzdGQ6Om1vdmUoUkhTQi0+Z2V0U2Vjb25kKCkpKTsKKyAgICAgICAgICBSSFNCLT5nZXRTZWNvbmQoKS5+VmFsdWVUKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFTbWFsbCAmJiAhUkhTLlNtYWxsKSB7CisgICAgICBzdGQ6OnN3YXAoZ2V0TGFyZ2VSZXAoKS0+QnVja2V0cywgUkhTLmdldExhcmdlUmVwKCktPkJ1Y2tldHMpOworICAgICAgc3RkOjpzd2FwKGdldExhcmdlUmVwKCktPk51bUJ1Y2tldHMsIFJIUy5nZXRMYXJnZVJlcCgpLT5OdW1CdWNrZXRzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTbWFsbERlbnNlTWFwICZTbWFsbFNpZGUgPSBTbWFsbCA/ICp0aGlzIDogUkhTOworICAgIFNtYWxsRGVuc2VNYXAgJkxhcmdlU2lkZSA9IFNtYWxsID8gUkhTIDogKnRoaXM7CisKKyAgICAvLyBGaXJzdCBzdGFzaCB0aGUgbGFyZ2Ugc2lkZSdzIHJlcCBhbmQgbW92ZSB0aGUgc21hbGwgc2lkZSBhY3Jvc3MuCisgICAgTGFyZ2VSZXAgVG1wUmVwID0gc3RkOjptb3ZlKCpMYXJnZVNpZGUuZ2V0TGFyZ2VSZXAoKSk7CisgICAgTGFyZ2VTaWRlLmdldExhcmdlUmVwKCktPn5MYXJnZVJlcCgpOworICAgIExhcmdlU2lkZS5TbWFsbCA9IHRydWU7CisgICAgLy8gVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBzdGFuZGFyZCBtb3ZlLWZyb20tb2xkLWJ1Y2tldHMsIGJ1dCB0aGUgYnVja2V0CisgICAgLy8gY291bnQgaGFzbid0IGFjdHVhbGx5IHJvdGF0ZWQgaW4gdGhpcyBjYXNlLiBTbyB3ZSBoYXZlIHRvIGNhcmVmdWxseQorICAgIC8vIG1vdmUgY29uc3RydWN0IHRoZSBrZXlzIGFuZCB2YWx1ZXMgaW50byB0aGVpciBuZXcgbG9jYXRpb25zLCBidXQgdGhlcmUKKyAgICAvLyBpcyBubyBuZWVkIHRvIHJlLWhhc2ggdGhpbmdzLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJbmxpbmVCdWNrZXRzOyBpICE9IGU7ICsraSkgeworICAgICAgQnVja2V0VCAqTmV3QiA9ICZMYXJnZVNpZGUuZ2V0SW5saW5lQnVja2V0cygpW2ldLAorICAgICAgICAgICAgICAqT2xkQiA9ICZTbWFsbFNpZGUuZ2V0SW5saW5lQnVja2V0cygpW2ldOworICAgICAgOjpuZXcgKCZOZXdCLT5nZXRGaXJzdCgpKSBLZXlUKHN0ZDo6bW92ZShPbGRCLT5nZXRGaXJzdCgpKSk7CisgICAgICBPbGRCLT5nZXRGaXJzdCgpLn5LZXlUKCk7CisgICAgICBpZiAoIUtleUluZm9UOjppc0VxdWFsKE5ld0ItPmdldEZpcnN0KCksIEVtcHR5S2V5KSAmJgorICAgICAgICAgICFLZXlJbmZvVDo6aXNFcXVhbChOZXdCLT5nZXRGaXJzdCgpLCBUb21ic3RvbmVLZXkpKSB7CisgICAgICAgIDo6bmV3ICgmTmV3Qi0+Z2V0U2Vjb25kKCkpIFZhbHVlVChzdGQ6Om1vdmUoT2xkQi0+Z2V0U2Vjb25kKCkpKTsKKyAgICAgICAgT2xkQi0+Z2V0U2Vjb25kKCkuflZhbHVlVCgpOworICAgICAgfQorICAgIH0KKworICAgIC8vIFRoZSBoYXJkIHBhcnQgb2YgbW92aW5nIHRoZSBzbWFsbCBidWNrZXRzIGFjcm9zcyBpcyBkb25lLCBqdXN0IG1vdmUKKyAgICAvLyB0aGUgVG1wUmVwIGludG8gaXRzIG5ldyBob21lLgorICAgIFNtYWxsU2lkZS5TbWFsbCA9IGZhbHNlOworICAgIG5ldyAoU21hbGxTaWRlLmdldExhcmdlUmVwKCkpIExhcmdlUmVwKHN0ZDo6bW92ZShUbXBSZXApKTsKKyAgfQorCisgIFNtYWxsRGVuc2VNYXAmIG9wZXJhdG9yPShjb25zdCBTbWFsbERlbnNlTWFwJiBvdGhlcikgeworICAgIGlmICgmb3RoZXIgIT0gdGhpcykKKyAgICAgIGNvcHlGcm9tKG90aGVyKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBTbWFsbERlbnNlTWFwJiBvcGVyYXRvcj0oU21hbGxEZW5zZU1hcCAmJm90aGVyKSB7CisgICAgdGhpcy0+ZGVzdHJveUFsbCgpOworICAgIGRlYWxsb2NhdGVCdWNrZXRzKCk7CisgICAgaW5pdCgwKTsKKyAgICBzd2FwKG90aGVyKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIGNvcHlGcm9tKGNvbnN0IFNtYWxsRGVuc2VNYXAmIG90aGVyKSB7CisgICAgdGhpcy0+ZGVzdHJveUFsbCgpOworICAgIGRlYWxsb2NhdGVCdWNrZXRzKCk7CisgICAgU21hbGwgPSB0cnVlOworICAgIGlmIChvdGhlci5nZXROdW1CdWNrZXRzKCkgPiBJbmxpbmVCdWNrZXRzKSB7CisgICAgICBTbWFsbCA9IGZhbHNlOworICAgICAgbmV3IChnZXRMYXJnZVJlcCgpKSBMYXJnZVJlcChhbGxvY2F0ZUJ1Y2tldHMob3RoZXIuZ2V0TnVtQnVja2V0cygpKSk7CisgICAgfQorICAgIHRoaXMtPkJhc2VUOjpjb3B5RnJvbShvdGhlcik7CisgIH0KKworICB2b2lkIGluaXQodW5zaWduZWQgSW5pdEJ1Y2tldHMpIHsKKyAgICBTbWFsbCA9IHRydWU7CisgICAgaWYgKEluaXRCdWNrZXRzID4gSW5saW5lQnVja2V0cykgeworICAgICAgU21hbGwgPSBmYWxzZTsKKyAgICAgIG5ldyAoZ2V0TGFyZ2VSZXAoKSkgTGFyZ2VSZXAoYWxsb2NhdGVCdWNrZXRzKEluaXRCdWNrZXRzKSk7CisgICAgfQorICAgIHRoaXMtPkJhc2VUOjppbml0RW1wdHkoKTsKKyAgfQorCisgIHZvaWQgZ3Jvdyh1bnNpZ25lZCBBdExlYXN0KSB7CisgICAgaWYgKEF0TGVhc3QgPj0gSW5saW5lQnVja2V0cykKKyAgICAgIEF0TGVhc3QgPSBzdGQ6Om1heDx1bnNpZ25lZD4oNjQsIE5leHRQb3dlck9mMihBdExlYXN0LTEpKTsKKworICAgIGlmIChTbWFsbCkgeworICAgICAgaWYgKEF0TGVhc3QgPCBJbmxpbmVCdWNrZXRzKQorICAgICAgICByZXR1cm47IC8vIE5vdGhpbmcgdG8gZG8uCisKKyAgICAgIC8vIEZpcnN0IG1vdmUgdGhlIGlubGluZSBidWNrZXRzIGludG8gYSB0ZW1wb3Jhcnkgc3RvcmFnZS4KKyAgICAgIEFsaWduZWRDaGFyQXJyYXlVbmlvbjxCdWNrZXRUW0lubGluZUJ1Y2tldHNdPiBUbXBTdG9yYWdlOworICAgICAgQnVja2V0VCAqVG1wQmVnaW4gPSByZWludGVycHJldF9jYXN0PEJ1Y2tldFQgKj4oVG1wU3RvcmFnZS5idWZmZXIpOworICAgICAgQnVja2V0VCAqVG1wRW5kID0gVG1wQmVnaW47CisKKyAgICAgIC8vIExvb3Agb3ZlciB0aGUgYnVja2V0cywgbW92aW5nIG5vbi1lbXB0eSwgbm9uLXRvbWJzdG9uZXMgaW50byB0aGUKKyAgICAgIC8vIHRlbXBvcmFyeSBzdG9yYWdlLiBIYXZlIHRoZSBsb29wIG1vdmUgdGhlIFRtcEVuZCBmb3J3YXJkIGFzIGl0IGdvZXMuCisgICAgICBjb25zdCBLZXlUIEVtcHR5S2V5ID0gdGhpcy0+Z2V0RW1wdHlLZXkoKTsKKyAgICAgIGNvbnN0IEtleVQgVG9tYnN0b25lS2V5ID0gdGhpcy0+Z2V0VG9tYnN0b25lS2V5KCk7CisgICAgICBmb3IgKEJ1Y2tldFQgKlAgPSBnZXRCdWNrZXRzKCksICpFID0gUCArIElubGluZUJ1Y2tldHM7IFAgIT0gRTsgKytQKSB7CisgICAgICAgIGlmICghS2V5SW5mb1Q6OmlzRXF1YWwoUC0+Z2V0Rmlyc3QoKSwgRW1wdHlLZXkpICYmCisgICAgICAgICAgICAhS2V5SW5mb1Q6OmlzRXF1YWwoUC0+Z2V0Rmlyc3QoKSwgVG9tYnN0b25lS2V5KSkgeworICAgICAgICAgIGFzc2VydChzaXplX3QoVG1wRW5kIC0gVG1wQmVnaW4pIDwgSW5saW5lQnVja2V0cyAmJgorICAgICAgICAgICAgICAgICAiVG9vIG1hbnkgaW5saW5lIGJ1Y2tldHMhIik7CisgICAgICAgICAgOjpuZXcgKCZUbXBFbmQtPmdldEZpcnN0KCkpIEtleVQoc3RkOjptb3ZlKFAtPmdldEZpcnN0KCkpKTsKKyAgICAgICAgICA6Om5ldyAoJlRtcEVuZC0+Z2V0U2Vjb25kKCkpIFZhbHVlVChzdGQ6Om1vdmUoUC0+Z2V0U2Vjb25kKCkpKTsKKyAgICAgICAgICArK1RtcEVuZDsKKyAgICAgICAgICBQLT5nZXRTZWNvbmQoKS5+VmFsdWVUKCk7CisgICAgICAgIH0KKyAgICAgICAgUC0+Z2V0Rmlyc3QoKS5+S2V5VCgpOworICAgICAgfQorCisgICAgICAvLyBOb3cgbWFrZSB0aGlzIG1hcCB1c2UgdGhlIGxhcmdlIHJlcCwgYW5kIG1vdmUgYWxsIHRoZSBlbnRyaWVzIGJhY2sKKyAgICAgIC8vIGludG8gaXQuCisgICAgICBTbWFsbCA9IGZhbHNlOworICAgICAgbmV3IChnZXRMYXJnZVJlcCgpKSBMYXJnZVJlcChhbGxvY2F0ZUJ1Y2tldHMoQXRMZWFzdCkpOworICAgICAgdGhpcy0+bW92ZUZyb21PbGRCdWNrZXRzKFRtcEJlZ2luLCBUbXBFbmQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExhcmdlUmVwIE9sZFJlcCA9IHN0ZDo6bW92ZSgqZ2V0TGFyZ2VSZXAoKSk7CisgICAgZ2V0TGFyZ2VSZXAoKS0+fkxhcmdlUmVwKCk7CisgICAgaWYgKEF0TGVhc3QgPD0gSW5saW5lQnVja2V0cykgeworICAgICAgU21hbGwgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBuZXcgKGdldExhcmdlUmVwKCkpIExhcmdlUmVwKGFsbG9jYXRlQnVja2V0cyhBdExlYXN0KSk7CisgICAgfQorCisgICAgdGhpcy0+bW92ZUZyb21PbGRCdWNrZXRzKE9sZFJlcC5CdWNrZXRzLCBPbGRSZXAuQnVja2V0cytPbGRSZXAuTnVtQnVja2V0cyk7CisKKyAgICAvLyBGcmVlIHRoZSBvbGQgdGFibGUuCisgICAgb3BlcmF0b3IgZGVsZXRlKE9sZFJlcC5CdWNrZXRzKTsKKyAgfQorCisgIHZvaWQgc2hyaW5rX2FuZF9jbGVhcigpIHsKKyAgICB1bnNpZ25lZCBPbGRTaXplID0gdGhpcy0+c2l6ZSgpOworICAgIHRoaXMtPmRlc3Ryb3lBbGwoKTsKKworICAgIC8vIFJlZHVjZSB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMuCisgICAgdW5zaWduZWQgTmV3TnVtQnVja2V0cyA9IDA7CisgICAgaWYgKE9sZFNpemUpIHsKKyAgICAgIE5ld051bUJ1Y2tldHMgPSAxIDw8IChMb2cyXzMyX0NlaWwoT2xkU2l6ZSkgKyAxKTsKKyAgICAgIGlmIChOZXdOdW1CdWNrZXRzID4gSW5saW5lQnVja2V0cyAmJiBOZXdOdW1CdWNrZXRzIDwgNjR1KQorICAgICAgICBOZXdOdW1CdWNrZXRzID0gNjQ7CisgICAgfQorICAgIGlmICgoU21hbGwgJiYgTmV3TnVtQnVja2V0cyA8PSBJbmxpbmVCdWNrZXRzKSB8fAorICAgICAgICAoIVNtYWxsICYmIE5ld051bUJ1Y2tldHMgPT0gZ2V0TGFyZ2VSZXAoKS0+TnVtQnVja2V0cykpIHsKKyAgICAgIHRoaXMtPkJhc2VUOjppbml0RW1wdHkoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZWFsbG9jYXRlQnVja2V0cygpOworICAgIGluaXQoTmV3TnVtQnVja2V0cyk7CisgIH0KKworcHJpdmF0ZToKKyAgdW5zaWduZWQgZ2V0TnVtRW50cmllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtRW50cmllczsKKyAgfQorCisgIHZvaWQgc2V0TnVtRW50cmllcyh1bnNpZ25lZCBOdW0pIHsKKyAgICAvLyBOdW1FbnRyaWVzIGlzIGhhcmRjb2RlZCB0byBiZSAzMSBiaXRzIHdpZGUuCisgICAgYXNzZXJ0KE51bSA8ICgxVSA8PCAzMSkgJiYgIkNhbm5vdCBzdXBwb3J0IG1vcmUgdGhhbiAxPDwzMSBlbnRyaWVzIik7CisgICAgTnVtRW50cmllcyA9IE51bTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bVRvbWJzdG9uZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIE51bVRvbWJzdG9uZXM7CisgIH0KKworICB2b2lkIHNldE51bVRvbWJzdG9uZXModW5zaWduZWQgTnVtKSB7CisgICAgTnVtVG9tYnN0b25lcyA9IE51bTsKKyAgfQorCisgIGNvbnN0IEJ1Y2tldFQgKmdldElubGluZUJ1Y2tldHMoKSBjb25zdCB7CisgICAgYXNzZXJ0KFNtYWxsKTsKKyAgICAvLyBOb3RlIHRoYXQgdGhpcyBjYXN0IGRvZXMgbm90IHZpb2xhdGUgYWxpYXNpbmcgcnVsZXMgYXMgd2UgYXNzZXJ0IHRoYXQKKyAgICAvLyB0aGUgbWVtb3J5J3MgZHluYW1pYyB0eXBlIGlzIHRoZSBzbWFsbCwgaW5saW5lIGJ1Y2tldCBidWZmZXIsIGFuZCB0aGUKKyAgICAvLyAnc3RvcmFnZS5idWZmZXInIHN0YXRpYyB0eXBlIGlzICdjaGFyIConLgorICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEJ1Y2tldFQgKj4oc3RvcmFnZS5idWZmZXIpOworICB9CisKKyAgQnVja2V0VCAqZ2V0SW5saW5lQnVja2V0cygpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxCdWNrZXRUICo+KAorICAgICAgY29uc3RfY2FzdDxjb25zdCBTbWFsbERlbnNlTWFwICo+KHRoaXMpLT5nZXRJbmxpbmVCdWNrZXRzKCkpOworICB9CisKKyAgY29uc3QgTGFyZ2VSZXAgKmdldExhcmdlUmVwKCkgY29uc3QgeworICAgIGFzc2VydCghU21hbGwpOworICAgIC8vIE5vdGUsIHNhbWUgcnVsZSBhYm91dCBhbGlhc2luZyBhcyB3aXRoIGdldElubGluZUJ1Y2tldHMuCisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTGFyZ2VSZXAgKj4oc3RvcmFnZS5idWZmZXIpOworICB9CisKKyAgTGFyZ2VSZXAgKmdldExhcmdlUmVwKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PExhcmdlUmVwICo+KAorICAgICAgY29uc3RfY2FzdDxjb25zdCBTbWFsbERlbnNlTWFwICo+KHRoaXMpLT5nZXRMYXJnZVJlcCgpKTsKKyAgfQorCisgIGNvbnN0IEJ1Y2tldFQgKmdldEJ1Y2tldHMoKSBjb25zdCB7CisgICAgcmV0dXJuIFNtYWxsID8gZ2V0SW5saW5lQnVja2V0cygpIDogZ2V0TGFyZ2VSZXAoKS0+QnVja2V0czsKKyAgfQorCisgIEJ1Y2tldFQgKmdldEJ1Y2tldHMoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QnVja2V0VCAqPigKKyAgICAgIGNvbnN0X2Nhc3Q8Y29uc3QgU21hbGxEZW5zZU1hcCAqPih0aGlzKS0+Z2V0QnVja2V0cygpKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUJ1Y2tldHMoKSBjb25zdCB7CisgICAgcmV0dXJuIFNtYWxsID8gSW5saW5lQnVja2V0cyA6IGdldExhcmdlUmVwKCktPk51bUJ1Y2tldHM7CisgIH0KKworICB2b2lkIGRlYWxsb2NhdGVCdWNrZXRzKCkgeworICAgIGlmIChTbWFsbCkKKyAgICAgIHJldHVybjsKKworICAgIG9wZXJhdG9yIGRlbGV0ZShnZXRMYXJnZVJlcCgpLT5CdWNrZXRzKTsKKyAgICBnZXRMYXJnZVJlcCgpLT5+TGFyZ2VSZXAoKTsKKyAgfQorCisgIExhcmdlUmVwIGFsbG9jYXRlQnVja2V0cyh1bnNpZ25lZCBOdW0pIHsKKyAgICBhc3NlcnQoTnVtID4gSW5saW5lQnVja2V0cyAmJiAiTXVzdCBhbGxvY2F0ZSBtb3JlIGJ1Y2tldHMgdGhhbiBhcmUgaW5saW5lIik7CisgICAgTGFyZ2VSZXAgUmVwID0geworICAgICAgc3RhdGljX2Nhc3Q8QnVja2V0VCo+KG9wZXJhdG9yIG5ldyhzaXplb2YoQnVja2V0VCkgKiBOdW0pKSwgTnVtCisgICAgfTsKKyAgICByZXR1cm4gUmVwOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsdWVULCB0eXBlbmFtZSBLZXlJbmZvVCwgdHlwZW5hbWUgQnVja2V0LAorICAgICAgICAgIGJvb2wgSXNDb25zdD4KK2NsYXNzIERlbnNlTWFwSXRlcmF0b3IgOiBEZWJ1Z0Vwb2NoQmFzZTo6SGFuZGxlQmFzZSB7CisgIGZyaWVuZCBjbGFzcyBEZW5zZU1hcEl0ZXJhdG9yPEtleVQsIFZhbHVlVCwgS2V5SW5mb1QsIEJ1Y2tldCwgdHJ1ZT47CisgIGZyaWVuZCBjbGFzcyBEZW5zZU1hcEl0ZXJhdG9yPEtleVQsIFZhbHVlVCwgS2V5SW5mb1QsIEJ1Y2tldCwgZmFsc2U+OworCisgIHVzaW5nIENvbnN0SXRlcmF0b3IgPSBEZW5zZU1hcEl0ZXJhdG9yPEtleVQsIFZhbHVlVCwgS2V5SW5mb1QsIEJ1Y2tldCwgdHJ1ZT47CisKK3B1YmxpYzoKKyAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gcHRyZGlmZl90OworICB1c2luZyB2YWx1ZV90eXBlID0KKyAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8SXNDb25zdCwgY29uc3QgQnVja2V0LCBCdWNrZXQ+Ojp0eXBlOworICB1c2luZyBwb2ludGVyID0gdmFsdWVfdHlwZSAqOworICB1c2luZyByZWZlcmVuY2UgPSB2YWx1ZV90eXBlICY7CisgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZzsKKworcHJpdmF0ZToKKyAgcG9pbnRlciBQdHIgPSBudWxscHRyOworICBwb2ludGVyIEVuZCA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgRGVuc2VNYXBJdGVyYXRvcigpID0gZGVmYXVsdDsKKworICBEZW5zZU1hcEl0ZXJhdG9yKHBvaW50ZXIgUG9zLCBwb2ludGVyIEUsIGNvbnN0IERlYnVnRXBvY2hCYXNlICZFcG9jaCwKKyAgICAgICAgICAgICAgICAgICBib29sIE5vQWR2YW5jZSA9IGZhbHNlKQorICAgICAgOiBEZWJ1Z0Vwb2NoQmFzZTo6SGFuZGxlQmFzZSgmRXBvY2gpLCBQdHIoUG9zKSwgRW5kKEUpIHsKKyAgICBhc3NlcnQoaXNIYW5kbGVJblN5bmMoKSAmJiAiaW52YWxpZCBjb25zdHJ1Y3Rpb24hIik7CisKKyAgICBpZiAoTm9BZHZhbmNlKSByZXR1cm47CisgICAgaWYgKHNob3VsZFJldmVyc2VJdGVyYXRlPEtleVQ+KCkpIHsKKyAgICAgIFJldHJlYXRQYXN0RW1wdHlCdWNrZXRzKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIEFkdmFuY2VQYXN0RW1wdHlCdWNrZXRzKCk7CisgIH0KKworICAvLyBDb252ZXJ0aW5nIGN0b3IgZnJvbSBub24tY29uc3QgaXRlcmF0b3JzIHRvIGNvbnN0IGl0ZXJhdG9ycy4gU0ZJTkFFJ2Qgb3V0CisgIC8vIGZvciBjb25zdCBpdGVyYXRvciBkZXN0aW5hdGlvbnMgc28gaXQgZG9lc24ndCBlbmQgdXAgYXMgYSB1c2VyIGRlZmluZWQgY29weQorICAvLyBjb25zdHJ1Y3Rvci4KKyAgdGVtcGxhdGUgPGJvb2wgSXNDb25zdFNyYywKKyAgICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IUlzQ29uc3RTcmMgJiYgSXNDb25zdD46OnR5cGU+CisgIERlbnNlTWFwSXRlcmF0b3IoCisgICAgICBjb25zdCBEZW5zZU1hcEl0ZXJhdG9yPEtleVQsIFZhbHVlVCwgS2V5SW5mb1QsIEJ1Y2tldCwgSXNDb25zdFNyYz4gJkkpCisgICAgICA6IERlYnVnRXBvY2hCYXNlOjpIYW5kbGVCYXNlKEkpLCBQdHIoSS5QdHIpLCBFbmQoSS5FbmQpIHt9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNIYW5kbGVJblN5bmMoKSAmJiAiaW52YWxpZCBpdGVyYXRvciBhY2Nlc3MhIik7CisgICAgaWYgKHNob3VsZFJldmVyc2VJdGVyYXRlPEtleVQ+KCkpCisgICAgICByZXR1cm4gUHRyWy0xXTsKKyAgICByZXR1cm4gKlB0cjsKKyAgfQorICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzSGFuZGxlSW5TeW5jKCkgJiYgImludmFsaWQgaXRlcmF0b3IgYWNjZXNzISIpOworICAgIGlmIChzaG91bGRSZXZlcnNlSXRlcmF0ZTxLZXlUPigpKQorICAgICAgcmV0dXJuICYoUHRyWy0xXSk7CisgICAgcmV0dXJuIFB0cjsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDb25zdEl0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoKCFQdHIgfHwgaXNIYW5kbGVJblN5bmMoKSkgJiYgImhhbmRsZSBub3QgaW4gc3luYyEiKTsKKyAgICBhc3NlcnQoKCFSSFMuUHRyIHx8IFJIUy5pc0hhbmRsZUluU3luYygpKSAmJiAiaGFuZGxlIG5vdCBpbiBzeW5jISIpOworICAgIGFzc2VydChnZXRFcG9jaEFkZHJlc3MoKSA9PSBSSFMuZ2V0RXBvY2hBZGRyZXNzKCkgJiYKKyAgICAgICAgICAgImNvbXBhcmluZyBpbmNvbXBhcmFibGUgaXRlcmF0b3JzISIpOworICAgIHJldHVybiBQdHIgPT0gUkhTLlB0cjsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ29uc3RJdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KCghUHRyIHx8IGlzSGFuZGxlSW5TeW5jKCkpICYmICJoYW5kbGUgbm90IGluIHN5bmMhIik7CisgICAgYXNzZXJ0KCghUkhTLlB0ciB8fCBSSFMuaXNIYW5kbGVJblN5bmMoKSkgJiYgImhhbmRsZSBub3QgaW4gc3luYyEiKTsKKyAgICBhc3NlcnQoZ2V0RXBvY2hBZGRyZXNzKCkgPT0gUkhTLmdldEVwb2NoQWRkcmVzcygpICYmCisgICAgICAgICAgICJjb21wYXJpbmcgaW5jb21wYXJhYmxlIGl0ZXJhdG9ycyEiKTsKKyAgICByZXR1cm4gUHRyICE9IFJIUy5QdHI7CisgIH0KKworICBpbmxpbmUgRGVuc2VNYXBJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgIC8vIFByZWluY3JlbWVudAorICAgIGFzc2VydChpc0hhbmRsZUluU3luYygpICYmICJpbnZhbGlkIGl0ZXJhdG9yIGFjY2VzcyEiKTsKKyAgICBpZiAoc2hvdWxkUmV2ZXJzZUl0ZXJhdGU8S2V5VD4oKSkgeworICAgICAgLS1QdHI7CisgICAgICBSZXRyZWF0UGFzdEVtcHR5QnVja2V0cygpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICArK1B0cjsKKyAgICBBZHZhbmNlUGFzdEVtcHR5QnVja2V0cygpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBEZW5zZU1hcEl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7ICAvLyBQb3N0aW5jcmVtZW50CisgICAgYXNzZXJ0KGlzSGFuZGxlSW5TeW5jKCkgJiYgImludmFsaWQgaXRlcmF0b3IgYWNjZXNzISIpOworICAgIERlbnNlTWFwSXRlcmF0b3IgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBBZHZhbmNlUGFzdEVtcHR5QnVja2V0cygpIHsKKyAgICBhc3NlcnQoUHRyIDw9IEVuZCk7CisgICAgY29uc3QgS2V5VCBFbXB0eSA9IEtleUluZm9UOjpnZXRFbXB0eUtleSgpOworICAgIGNvbnN0IEtleVQgVG9tYnN0b25lID0gS2V5SW5mb1Q6OmdldFRvbWJzdG9uZUtleSgpOworCisgICAgd2hpbGUgKFB0ciAhPSBFbmQgJiYgKEtleUluZm9UOjppc0VxdWFsKFB0ci0+Z2V0Rmlyc3QoKSwgRW1wdHkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUluZm9UOjppc0VxdWFsKFB0ci0+Z2V0Rmlyc3QoKSwgVG9tYnN0b25lKSkpCisgICAgICArK1B0cjsKKyAgfQorCisgIHZvaWQgUmV0cmVhdFBhc3RFbXB0eUJ1Y2tldHMoKSB7CisgICAgYXNzZXJ0KFB0ciA+PSBFbmQpOworICAgIGNvbnN0IEtleVQgRW1wdHkgPSBLZXlJbmZvVDo6Z2V0RW1wdHlLZXkoKTsKKyAgICBjb25zdCBLZXlUIFRvbWJzdG9uZSA9IEtleUluZm9UOjpnZXRUb21ic3RvbmVLZXkoKTsKKworICAgIHdoaWxlIChQdHIgIT0gRW5kICYmIChLZXlJbmZvVDo6aXNFcXVhbChQdHJbLTFdLmdldEZpcnN0KCksIEVtcHR5KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJbmZvVDo6aXNFcXVhbChQdHJbLTFdLmdldEZpcnN0KCksIFRvbWJzdG9uZSkpKQorICAgICAgLS1QdHI7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQsIHR5cGVuYW1lIEtleUluZm9UPgoraW5saW5lIHNpemVfdCBjYXBhY2l0eV9pbl9ieXRlcyhjb25zdCBEZW5zZU1hcDxLZXlULCBWYWx1ZVQsIEtleUluZm9UPiAmWCkgeworICByZXR1cm4gWC5nZXRNZW1vcnlTaXplKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9ERU5TRU1BUF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9EZW5zZU1hcEluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0RlbnNlTWFwSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NjkwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9EZW5zZU1hcEluZm8uaApAQCAtMCwwICsxLDI2NyBAQAorLy89PT0tIGxsdm0vQURUL0RlbnNlTWFwSW5mby5oIC0gVHlwZSB0cmFpdHMgZm9yIERlbnNlTWFwIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBEZW5zZU1hcEluZm8gdHJhaXRzIGZvciBEZW5zZU1hcC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0RFTlNFTUFQSU5GT19ICisjZGVmaW5lIExMVk1fQURUX0RFTlNFTUFQSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0hhc2hpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IERlbnNlTWFwSW5mbyB7CisgIC8vc3RhdGljIGlubGluZSBUIGdldEVtcHR5S2V5KCk7CisgIC8vc3RhdGljIGlubGluZSBUIGdldFRvbWJzdG9uZUtleSgpOworICAvL3N0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgVCAmVmFsKTsKKyAgLy9zdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IFQgJkxIUywgY29uc3QgVCAmUkhTKTsKK307CisKKy8vIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciBhbGwgcG9pbnRlcnMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IERlbnNlTWFwSW5mbzxUKj4geworICBzdGF0aWMgaW5saW5lIFQqIGdldEVtcHR5S2V5KCkgeworICAgIHVpbnRwdHJfdCBWYWwgPSBzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KC0xKTsKKyAgICBWYWwgPDw9IFBvaW50ZXJMaWtlVHlwZVRyYWl0czxUKj46Ok51bUxvd0JpdHNBdmFpbGFibGU7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KFZhbCk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIFQqIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICB1aW50cHRyX3QgVmFsID0gc3RhdGljX2Nhc3Q8dWludHB0cl90PigtMik7CisgICAgVmFsIDw8PSBQb2ludGVyTGlrZVR5cGVUcmFpdHM8VCo+OjpOdW1Mb3dCaXRzQXZhaWxhYmxlOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFQqPihWYWwpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBUICpQdHJWYWwpIHsKKyAgICByZXR1cm4gKHVuc2lnbmVkKCh1aW50cHRyX3QpUHRyVmFsKSA+PiA0KSBeCisgICAgICAgICAgICh1bnNpZ25lZCgodWludHB0cl90KVB0clZhbCkgPj4gOSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IFQgKkxIUywgY29uc3QgVCAqUkhTKSB7IHJldHVybiBMSFMgPT0gUkhTOyB9Cit9OworCisvLyBQcm92aWRlIERlbnNlTWFwSW5mbyBmb3IgY2hhcnMuCit0ZW1wbGF0ZTw+IHN0cnVjdCBEZW5zZU1hcEluZm88Y2hhcj4geworICBzdGF0aWMgaW5saW5lIGNoYXIgZ2V0RW1wdHlLZXkoKSB7IHJldHVybiB+MDsgfQorICBzdGF0aWMgaW5saW5lIGNoYXIgZ2V0VG9tYnN0b25lS2V5KCkgeyByZXR1cm4gfjAgLSAxOyB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgY2hhciYgVmFsKSB7IHJldHVybiBWYWwgKiAzN1U7IH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IGNoYXIgJkxIUywgY29uc3QgY2hhciAmUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKKy8vIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciB1bnNpZ25lZCBzaG9ydHMuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPHVuc2lnbmVkIHNob3J0PiB7CisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0RW1wdHlLZXkoKSB7IHJldHVybiAweEZGRkY7IH0KKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiAweEZGRkYgLSAxOyB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgdW5zaWduZWQgc2hvcnQgJlZhbCkgeyByZXR1cm4gVmFsICogMzdVOyB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCB1bnNpZ25lZCBzaG9ydCAmTEhTLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAmUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKKy8vIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciB1bnNpZ25lZCBpbnRzLgordGVtcGxhdGU8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPHVuc2lnbmVkPiB7CisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0RW1wdHlLZXkoKSB7IHJldHVybiB+MFU7IH0KKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiB+MFUgLSAxOyB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgdW5zaWduZWQmIFZhbCkgeyByZXR1cm4gVmFsICogMzdVOyB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCB1bnNpZ25lZCYgTEhTLCBjb25zdCB1bnNpZ25lZCYgUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKKy8vIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciB1bnNpZ25lZCBsb25ncy4KK3RlbXBsYXRlPD4gc3RydWN0IERlbnNlTWFwSW5mbzx1bnNpZ25lZCBsb25nPiB7CisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIH4wVUw7IH0KKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldFRvbWJzdG9uZUtleSgpIHsgcmV0dXJuIH4wVUwgLSAxTDsgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgdW5zaWduZWQgbG9uZyYgVmFsKSB7CisgICAgcmV0dXJuICh1bnNpZ25lZCkoVmFsICogMzdVTCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IHVuc2lnbmVkIGxvbmcmIExIUywgY29uc3QgdW5zaWduZWQgbG9uZyYgUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKKy8vIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciB1bnNpZ25lZCBsb25nIGxvbmdzLgordGVtcGxhdGU8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPHVuc2lnbmVkIGxvbmcgbG9uZz4geworICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIH4wVUxMOyB9CisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIGdldFRvbWJzdG9uZUtleSgpIHsgcmV0dXJuIH4wVUxMIC0gMVVMTDsgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgdW5zaWduZWQgbG9uZyBsb25nJiBWYWwpIHsKKyAgICByZXR1cm4gKHVuc2lnbmVkKShWYWwgKiAzN1VMTCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyYgTEhTLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyYgUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKKy8vIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciBzaG9ydHMuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPHNob3J0PiB7CisgIHN0YXRpYyBpbmxpbmUgc2hvcnQgZ2V0RW1wdHlLZXkoKSB7IHJldHVybiAweDdGRkY7IH0KKyAgc3RhdGljIGlubGluZSBzaG9ydCBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiAtMHg3RkZGIC0gMTsgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IHNob3J0ICZWYWwpIHsgcmV0dXJuIFZhbCAqIDM3VTsgfQorICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IHNob3J0ICZMSFMsIGNvbnN0IHNob3J0ICZSSFMpIHsgcmV0dXJuIExIUyA9PSBSSFM7IH0KK307CisKKy8vIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciBpbnRzLgordGVtcGxhdGU8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPGludD4geworICBzdGF0aWMgaW5saW5lIGludCBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIDB4N2ZmZmZmZmY7IH0KKyAgc3RhdGljIGlubGluZSBpbnQgZ2V0VG9tYnN0b25lS2V5KCkgeyByZXR1cm4gLTB4N2ZmZmZmZmYgLSAxOyB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgaW50JiBWYWwpIHsgcmV0dXJuICh1bnNpZ25lZCkoVmFsICogMzdVKTsgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgaW50JiBMSFMsIGNvbnN0IGludCYgUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKKy8vIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciBsb25ncy4KK3RlbXBsYXRlPD4gc3RydWN0IERlbnNlTWFwSW5mbzxsb25nPiB7CisgIHN0YXRpYyBpbmxpbmUgbG9uZyBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gKDFVTCA8PCAoc2l6ZW9mKGxvbmcpICogOCAtIDEpKSAtIDFVTDsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgbG9uZyBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiBnZXRFbXB0eUtleSgpIC0gMUw7IH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IGxvbmcmIFZhbCkgeworICAgIHJldHVybiAodW5zaWduZWQpKFZhbCAqIDM3VUwpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBsb25nJiBMSFMsIGNvbnN0IGxvbmcmIFJIUykgeworICAgIHJldHVybiBMSFMgPT0gUkhTOworICB9Cit9OworCisvLyBQcm92aWRlIERlbnNlTWFwSW5mbyBmb3IgbG9uZyBsb25ncy4KK3RlbXBsYXRlPD4gc3RydWN0IERlbnNlTWFwSW5mbzxsb25nIGxvbmc+IHsKKyAgc3RhdGljIGlubGluZSBsb25nIGxvbmcgZ2V0RW1wdHlLZXkoKSB7IHJldHVybiAweDdmZmZmZmZmZmZmZmZmZmZMTDsgfQorICBzdGF0aWMgaW5saW5lIGxvbmcgbG9uZyBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiAtMHg3ZmZmZmZmZmZmZmZmZmZmTEwtMTsgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgbG9uZyBsb25nJiBWYWwpIHsKKyAgICByZXR1cm4gKHVuc2lnbmVkKShWYWwgKiAzN1VMTCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IGxvbmcgbG9uZyYgTEhTLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyYgUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKKy8vIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciBhbGwgcGFpcnMgd2hvc2UgbWVtYmVycyBoYXZlIGluZm8uCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc3RydWN0IERlbnNlTWFwSW5mbzxzdGQ6OnBhaXI8VCwgVT4+IHsKKyAgdXNpbmcgUGFpciA9IHN0ZDo6cGFpcjxULCBVPjsKKyAgdXNpbmcgRmlyc3RJbmZvID0gRGVuc2VNYXBJbmZvPFQ+OworICB1c2luZyBTZWNvbmRJbmZvID0gRGVuc2VNYXBJbmZvPFU+OworCisgIHN0YXRpYyBpbmxpbmUgUGFpciBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoRmlyc3RJbmZvOjpnZXRFbXB0eUtleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTZWNvbmRJbmZvOjpnZXRFbXB0eUtleSgpKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgUGFpciBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEZpcnN0SW5mbzo6Z2V0VG9tYnN0b25lS2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZEluZm86OmdldFRvbWJzdG9uZUtleSgpKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgUGFpciYgUGFpclZhbCkgeworICAgIHVpbnQ2NF90IGtleSA9ICh1aW50NjRfdClGaXJzdEluZm86OmdldEhhc2hWYWx1ZShQYWlyVmFsLmZpcnN0KSA8PCAzMgorICAgICAgICAgIHwgKHVpbnQ2NF90KVNlY29uZEluZm86OmdldEhhc2hWYWx1ZShQYWlyVmFsLnNlY29uZCk7CisgICAga2V5ICs9IH4oa2V5IDw8IDMyKTsKKyAgICBrZXkgXj0gKGtleSA+PiAyMik7CisgICAga2V5ICs9IH4oa2V5IDw8IDEzKTsKKyAgICBrZXkgXj0gKGtleSA+PiA4KTsKKyAgICBrZXkgKz0gKGtleSA8PCAzKTsKKyAgICBrZXkgXj0gKGtleSA+PiAxNSk7CisgICAga2V5ICs9IH4oa2V5IDw8IDI3KTsKKyAgICBrZXkgXj0gKGtleSA+PiAzMSk7CisgICAgcmV0dXJuICh1bnNpZ25lZClrZXk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IFBhaXIgJkxIUywgY29uc3QgUGFpciAmUkhTKSB7CisgICAgcmV0dXJuIEZpcnN0SW5mbzo6aXNFcXVhbChMSFMuZmlyc3QsIFJIUy5maXJzdCkgJiYKKyAgICAgICAgICAgU2Vjb25kSW5mbzo6aXNFcXVhbChMSFMuc2Vjb25kLCBSSFMuc2Vjb25kKTsKKyAgfQorfTsKKworLy8gUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIFN0cmluZ1JlZnMuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPFN0cmluZ1JlZj4geworICBzdGF0aWMgaW5saW5lIFN0cmluZ1JlZiBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gU3RyaW5nUmVmKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPih+c3RhdGljX2Nhc3Q8dWludHB0cl90PigwKSksCisgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgU3RyaW5nUmVmIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gU3RyaW5nUmVmKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPih+c3RhdGljX2Nhc3Q8dWludHB0cl90PigxKSksCisgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoU3RyaW5nUmVmIFZhbCkgeworICAgIGFzc2VydChWYWwuZGF0YSgpICE9IGdldEVtcHR5S2V5KCkuZGF0YSgpICYmICJDYW5ub3QgaGFzaCB0aGUgZW1wdHkga2V5ISIpOworICAgIGFzc2VydChWYWwuZGF0YSgpICE9IGdldFRvbWJzdG9uZUtleSgpLmRhdGEoKSAmJgorICAgICAgICAgICAiQ2Fubm90IGhhc2ggdGhlIHRvbWJzdG9uZSBrZXkhIik7CisgICAgcmV0dXJuICh1bnNpZ25lZCkoaGFzaF92YWx1ZShWYWwpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoU3RyaW5nUmVmIExIUywgU3RyaW5nUmVmIFJIUykgeworICAgIGlmIChSSFMuZGF0YSgpID09IGdldEVtcHR5S2V5KCkuZGF0YSgpKQorICAgICAgcmV0dXJuIExIUy5kYXRhKCkgPT0gZ2V0RW1wdHlLZXkoKS5kYXRhKCk7CisgICAgaWYgKFJIUy5kYXRhKCkgPT0gZ2V0VG9tYnN0b25lS2V5KCkuZGF0YSgpKQorICAgICAgcmV0dXJuIExIUy5kYXRhKCkgPT0gZ2V0VG9tYnN0b25lS2V5KCkuZGF0YSgpOworICAgIHJldHVybiBMSFMgPT0gUkhTOworICB9Cit9OworCisvLyBQcm92aWRlIERlbnNlTWFwSW5mbyBmb3IgQXJyYXlSZWZzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBEZW5zZU1hcEluZm88QXJyYXlSZWY8VD4+IHsKKyAgc3RhdGljIGlubGluZSBBcnJheVJlZjxUPiBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gQXJyYXlSZWY8VD4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBUICo+KH5zdGF0aWNfY2FzdDx1aW50cHRyX3Q+KDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KDApKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgQXJyYXlSZWY8VD4gZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiBBcnJheVJlZjxUPihyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4ofnN0YXRpY19jYXN0PHVpbnRwdHJfdD4oMSkpLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QoMCkpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShBcnJheVJlZjxUPiBWYWwpIHsKKyAgICBhc3NlcnQoVmFsLmRhdGEoKSAhPSBnZXRFbXB0eUtleSgpLmRhdGEoKSAmJiAiQ2Fubm90IGhhc2ggdGhlIGVtcHR5IGtleSEiKTsKKyAgICBhc3NlcnQoVmFsLmRhdGEoKSAhPSBnZXRUb21ic3RvbmVLZXkoKS5kYXRhKCkgJiYKKyAgICAgICAgICAgIkNhbm5vdCBoYXNoIHRoZSB0b21ic3RvbmUga2V5ISIpOworICAgIHJldHVybiAodW5zaWduZWQpKGhhc2hfdmFsdWUoVmFsKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKEFycmF5UmVmPFQ+IExIUywgQXJyYXlSZWY8VD4gUkhTKSB7CisgICAgaWYgKFJIUy5kYXRhKCkgPT0gZ2V0RW1wdHlLZXkoKS5kYXRhKCkpCisgICAgICByZXR1cm4gTEhTLmRhdGEoKSA9PSBnZXRFbXB0eUtleSgpLmRhdGEoKTsKKyAgICBpZiAoUkhTLmRhdGEoKSA9PSBnZXRUb21ic3RvbmVLZXkoKS5kYXRhKCkpCisgICAgICByZXR1cm4gTEhTLmRhdGEoKSA9PSBnZXRUb21ic3RvbmVLZXkoKS5kYXRhKCk7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9ERU5TRU1BUElORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvRGVuc2VTZXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0RlbnNlU2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U1MTcxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0RlbnNlU2V0LmgKQEAgLTAsMCArMSwyNTUgQEAKKy8vPT09LSBsbHZtL0FEVC9EZW5zZVNldC5oIC0gRGVuc2UgcHJvYmVkIGhhc2ggdGFibGUgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIERlbnNlU2V0IGFuZCBTbWFsbERlbnNlU2V0IGNsYXNzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9ERU5TRVNFVF9ICisjZGVmaW5lIExMVk1fQURUX0RFTlNFU0VUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPiAKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgZGV0YWlsIHsKKworc3RydWN0IERlbnNlU2V0RW1wdHkge307CisKKy8vIFVzZSB0aGUgZW1wdHkgYmFzZSBjbGFzcyB0cmljayBzbyB3ZSBjYW4gY3JlYXRlIGEgRGVuc2VNYXAgd2hlcmUgdGhlIGJ1Y2tldHMKKy8vIGNvbnRhaW4gb25seSBhIHNpbmdsZSBpdGVtLgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQ+IGNsYXNzIERlbnNlU2V0UGFpciA6IHB1YmxpYyBEZW5zZVNldEVtcHR5IHsKKyAgS2V5VCBrZXk7CisKK3B1YmxpYzoKKyAgS2V5VCAmZ2V0Rmlyc3QoKSB7IHJldHVybiBrZXk7IH0KKyAgY29uc3QgS2V5VCAmZ2V0Rmlyc3QoKSBjb25zdCB7IHJldHVybiBrZXk7IH0KKyAgRGVuc2VTZXRFbXB0eSAmZ2V0U2Vjb25kKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgY29uc3QgRGVuc2VTZXRFbXB0eSAmZ2V0U2Vjb25kKCkgY29uc3QgeyByZXR1cm4gKnRoaXM7IH0KK307CisKKy8vLyBCYXNlIGNsYXNzIGZvciBEZW5zZVNldCBhbmQgRGVuc2VTbWFsbFNldC4KKy8vLworLy8vIE1hcFR5IHNob3VsZCBiZSBlaXRoZXIKKy8vLworLy8vICAgRGVuc2VNYXA8VmFsdWVULCBkZXRhaWw6OkRlbnNlU2V0RW1wdHksIFZhbHVlSW5mb1QsCisvLy8gICAgICAgICAgICBkZXRhaWw6OkRlbnNlU2V0UGFpcjxWYWx1ZVQ+PgorLy8vCisvLy8gb3IgdGhlIGVxdWl2YWxlbnQgU21hbGxEZW5zZU1hcCB0eXBlLiAgVmFsdWVJbmZvVCBtdXN0IGltcGxlbWVudCB0aGUKKy8vLyBEZW5zZU1hcEluZm8gImNvbmNlcHQiLgordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUgTWFwVHksIHR5cGVuYW1lIFZhbHVlSW5mb1Q+CitjbGFzcyBEZW5zZVNldEltcGwgeworICBzdGF0aWNfYXNzZXJ0KHNpemVvZih0eXBlbmFtZSBNYXBUeTo6dmFsdWVfdHlwZSkgPT0gc2l6ZW9mKFZhbHVlVCksCisgICAgICAgICAgICAgICAgIkRlbnNlTWFwIGJ1Y2tldHMgdW5leHBlY3RlZGx5IGxhcmdlISIpOworICBNYXBUeSBUaGVNYXA7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHVzaW5nIGNvbnN0X2FyZ190eXBlX3QgPSB0eXBlbmFtZSBjb25zdF9wb2ludGVyX29yX2NvbnN0X3JlZjxUPjo6dHlwZTsKKworcHVibGljOgorICB1c2luZyBrZXlfdHlwZSA9IFZhbHVlVDsKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IFZhbHVlVDsKKyAgdXNpbmcgc2l6ZV90eXBlID0gdW5zaWduZWQ7CisKKyAgZXhwbGljaXQgRGVuc2VTZXRJbXBsKHVuc2lnbmVkIEluaXRpYWxSZXNlcnZlID0gMCkgOiBUaGVNYXAoSW5pdGlhbFJlc2VydmUpIHt9CisKKyAgRGVuc2VTZXRJbXBsKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxWYWx1ZVQ+IEVsZW1zKQorICAgICAgOiBEZW5zZVNldEltcGwoRWxlbXMuc2l6ZSgpKSB7CisgICAgaW5zZXJ0KEVsZW1zLmJlZ2luKCksIEVsZW1zLmVuZCgpKTsKKyAgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBUaGVNYXAuZW1wdHkoKTsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFRoZU1hcC5zaXplKCk7IH0KKyAgc2l6ZV90IGdldE1lbW9yeVNpemUoKSBjb25zdCB7IHJldHVybiBUaGVNYXAuZ2V0TWVtb3J5U2l6ZSgpOyB9CisKKyAgLy8vIEdyb3cgdGhlIERlbnNlU2V0IHNvIHRoYXQgaXQgaGFzIGF0IGxlYXN0IFNpemUgYnVja2V0cy4gV2lsbCBub3Qgc2hyaW5rCisgIC8vLyB0aGUgU2l6ZSBvZiB0aGUgc2V0LgorICB2b2lkIHJlc2l6ZShzaXplX3QgU2l6ZSkgeyBUaGVNYXAucmVzaXplKFNpemUpOyB9CisKKyAgLy8vIEdyb3cgdGhlIERlbnNlU2V0IHNvIHRoYXQgaXQgY2FuIGNvbnRhaW4gYXQgbGVhc3QgXHAgTnVtRW50cmllcyBpdGVtcworICAvLy8gYmVmb3JlIHJlc2l6aW5nIGFnYWluLgorICB2b2lkIHJlc2VydmUoc2l6ZV90IFNpemUpIHsgVGhlTWFwLnJlc2VydmUoU2l6ZSk7IH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIFRoZU1hcC5jbGVhcigpOworICB9CisKKyAgLy8vIFJldHVybiAxIGlmIHRoZSBzcGVjaWZpZWQga2V5IGlzIGluIHRoZSBzZXQsIDAgb3RoZXJ3aXNlLgorICBzaXplX3R5cGUgY291bnQoY29uc3RfYXJnX3R5cGVfdDxWYWx1ZVQ+IFYpIGNvbnN0IHsKKyAgICByZXR1cm4gVGhlTWFwLmNvdW50KFYpOworICB9CisKKyAgYm9vbCBlcmFzZShjb25zdCBWYWx1ZVQgJlYpIHsKKyAgICByZXR1cm4gVGhlTWFwLmVyYXNlKFYpOworICB9CisKKyAgdm9pZCBzd2FwKERlbnNlU2V0SW1wbCAmUkhTKSB7IFRoZU1hcC5zd2FwKFJIUy5UaGVNYXApOyB9CisKKyAgLy8gSXRlcmF0b3JzLgorCisgIGNsYXNzIENvbnN0SXRlcmF0b3I7CisKKyAgY2xhc3MgSXRlcmF0b3IgeworICAgIHR5cGVuYW1lIE1hcFR5OjppdGVyYXRvciBJOworICAgIGZyaWVuZCBjbGFzcyBEZW5zZVNldEltcGw7CisgICAgZnJpZW5kIGNsYXNzIENvbnN0SXRlcmF0b3I7CisKKyAgcHVibGljOgorICAgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHR5cGVuYW1lIE1hcFR5OjppdGVyYXRvcjo6ZGlmZmVyZW5jZV90eXBlOworICAgIHVzaW5nIHZhbHVlX3R5cGUgPSBWYWx1ZVQ7CisgICAgdXNpbmcgcG9pbnRlciA9IHZhbHVlX3R5cGUgKjsKKyAgICB1c2luZyByZWZlcmVuY2UgPSB2YWx1ZV90eXBlICY7CisgICAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworCisgICAgSXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgICAgSXRlcmF0b3IoY29uc3QgdHlwZW5hbWUgTWFwVHk6Oml0ZXJhdG9yICZpKSA6IEkoaSkge30KKworICAgIFZhbHVlVCAmb3BlcmF0b3IqKCkgeyByZXR1cm4gSS0+Z2V0Rmlyc3QoKTsgfQorICAgIGNvbnN0IFZhbHVlVCAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gSS0+Z2V0Rmlyc3QoKTsgfQorICAgIFZhbHVlVCAqb3BlcmF0b3ItPigpIHsgcmV0dXJuICZJLT5nZXRGaXJzdCgpOyB9CisgICAgY29uc3QgVmFsdWVUICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJkktPmdldEZpcnN0KCk7IH0KKworICAgIEl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyArK0k7IHJldHVybiAqdGhpczsgfQorICAgIEl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7IGF1dG8gVCA9ICp0aGlzOyArK0k7IHJldHVybiBUOyB9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENvbnN0SXRlcmF0b3ImIFgpIGNvbnN0IHsgcmV0dXJuIEkgPT0gWC5JOyB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENvbnN0SXRlcmF0b3ImIFgpIGNvbnN0IHsgcmV0dXJuIEkgIT0gWC5JOyB9CisgIH07CisKKyAgY2xhc3MgQ29uc3RJdGVyYXRvciB7CisgICAgdHlwZW5hbWUgTWFwVHk6OmNvbnN0X2l0ZXJhdG9yIEk7CisgICAgZnJpZW5kIGNsYXNzIERlbnNlU2V0OworICAgIGZyaWVuZCBjbGFzcyBJdGVyYXRvcjsKKworICBwdWJsaWM6CisgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gdHlwZW5hbWUgTWFwVHk6OmNvbnN0X2l0ZXJhdG9yOjpkaWZmZXJlbmNlX3R5cGU7CisgICAgdXNpbmcgdmFsdWVfdHlwZSA9IFZhbHVlVDsKKyAgICB1c2luZyBwb2ludGVyID0gdmFsdWVfdHlwZSAqOworICAgIHVzaW5nIHJlZmVyZW5jZSA9IHZhbHVlX3R5cGUgJjsKKyAgICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc7CisKKyAgICBDb25zdEl0ZXJhdG9yKCkgPSBkZWZhdWx0OworICAgIENvbnN0SXRlcmF0b3IoY29uc3QgSXRlcmF0b3IgJkIpIDogSShCLkkpIHt9CisgICAgQ29uc3RJdGVyYXRvcihjb25zdCB0eXBlbmFtZSBNYXBUeTo6Y29uc3RfaXRlcmF0b3IgJmkpIDogSShpKSB7fQorCisgICAgY29uc3QgVmFsdWVUICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBJLT5nZXRGaXJzdCgpOyB9CisgICAgY29uc3QgVmFsdWVUICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJkktPmdldEZpcnN0KCk7IH0KKworICAgIENvbnN0SXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7ICsrSTsgcmV0dXJuICp0aGlzOyB9CisgICAgQ29uc3RJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyBhdXRvIFQgPSAqdGhpczsgKytJOyByZXR1cm4gVDsgfQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDb25zdEl0ZXJhdG9yJiBYKSBjb25zdCB7IHJldHVybiBJID09IFguSTsgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDb25zdEl0ZXJhdG9yJiBYKSBjb25zdCB7IHJldHVybiBJICE9IFguSTsgfQorICB9OworCisgIHVzaW5nIGl0ZXJhdG9yID0gSXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gQ29uc3RJdGVyYXRvcjsKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIEl0ZXJhdG9yKFRoZU1hcC5iZWdpbigpKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBJdGVyYXRvcihUaGVNYXAuZW5kKCkpOyB9CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBDb25zdEl0ZXJhdG9yKFRoZU1hcC5iZWdpbigpKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBDb25zdEl0ZXJhdG9yKFRoZU1hcC5lbmQoKSk7IH0KKworICBpdGVyYXRvciBmaW5kKGNvbnN0X2FyZ190eXBlX3Q8VmFsdWVUPiBWKSB7IHJldHVybiBJdGVyYXRvcihUaGVNYXAuZmluZChWKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdF9hcmdfdHlwZV90PFZhbHVlVD4gVikgY29uc3QgeworICAgIHJldHVybiBDb25zdEl0ZXJhdG9yKFRoZU1hcC5maW5kKFYpKTsKKyAgfQorCisgIC8vLyBBbHRlcm5hdGl2ZSB2ZXJzaW9uIG9mIGZpbmQoKSB3aGljaCBhbGxvd3MgYSBkaWZmZXJlbnQsIGFuZCBwb3NzaWJseSBsZXNzCisgIC8vLyBleHBlbnNpdmUsIGtleSB0eXBlLgorICAvLy8gVGhlIERlbnNlTWFwSW5mbyBpcyByZXNwb25zaWJsZSBmb3Igc3VwcGx5aW5nIG1ldGhvZHMKKyAgLy8vIGdldEhhc2hWYWx1ZShMb29rdXBLZXlUKSBhbmQgaXNFcXVhbChMb29rdXBLZXlULCBLZXlUKSBmb3IgZWFjaCBrZXkgdHlwZQorICAvLy8gdXNlZC4KKyAgdGVtcGxhdGUgPGNsYXNzIExvb2t1cEtleVQ+CisgIGl0ZXJhdG9yIGZpbmRfYXMoY29uc3QgTG9va3VwS2V5VCAmVmFsKSB7CisgICAgcmV0dXJuIEl0ZXJhdG9yKFRoZU1hcC5maW5kX2FzKFZhbCkpOworICB9CisgIHRlbXBsYXRlIDxjbGFzcyBMb29rdXBLZXlUPgorICBjb25zdF9pdGVyYXRvciBmaW5kX2FzKGNvbnN0IExvb2t1cEtleVQgJlZhbCkgY29uc3QgeworICAgIHJldHVybiBDb25zdEl0ZXJhdG9yKFRoZU1hcC5maW5kX2FzKFZhbCkpOworICB9CisKKyAgdm9pZCBlcmFzZShJdGVyYXRvciBJKSB7IHJldHVybiBUaGVNYXAuZXJhc2UoSS5JKTsgfQorICB2b2lkIGVyYXNlKENvbnN0SXRlcmF0b3IgQ0kpIHsgcmV0dXJuIFRoZU1hcC5lcmFzZShDSS5JKTsgfQorCisgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KGNvbnN0IFZhbHVlVCAmVikgeworICAgIGRldGFpbDo6RGVuc2VTZXRFbXB0eSBFbXB0eTsKKyAgICByZXR1cm4gVGhlTWFwLnRyeV9lbXBsYWNlKFYsIEVtcHR5KTsKKyAgfQorCisgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KFZhbHVlVCAmJlYpIHsKKyAgICBkZXRhaWw6OkRlbnNlU2V0RW1wdHkgRW1wdHk7CisgICAgcmV0dXJuIFRoZU1hcC50cnlfZW1wbGFjZShzdGQ6Om1vdmUoViksIEVtcHR5KTsKKyAgfQorCisgIC8vLyBBbHRlcm5hdGl2ZSB2ZXJzaW9uIG9mIGluc2VydCB0aGF0IHVzZXMgYSBkaWZmZXJlbnQgKGFuZCBwb3NzaWJseSBsZXNzCisgIC8vLyBleHBlbnNpdmUpIGtleSB0eXBlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9va3VwS2V5VD4KKyAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnRfYXMoY29uc3QgVmFsdWVUICZWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29rdXBLZXlUICZMb29rdXBLZXkpIHsKKyAgICByZXR1cm4gVGhlTWFwLmluc2VydF9hcyh7ViwgZGV0YWlsOjpEZW5zZVNldEVtcHR5KCl9LCBMb29rdXBLZXkpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBMb29rdXBLZXlUPgorICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydF9hcyhWYWx1ZVQgJiZWLCBjb25zdCBMb29rdXBLZXlUICZMb29rdXBLZXkpIHsKKyAgICByZXR1cm4gVGhlTWFwLmluc2VydF9hcyh7c3RkOjptb3ZlKFYpLCBkZXRhaWw6OkRlbnNlU2V0RW1wdHkoKX0sIExvb2t1cEtleSk7CisgIH0KKworICAvLyBSYW5nZSBpbnNlcnRpb24gb2YgdmFsdWVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0PgorICB2b2lkIGluc2VydChJbnB1dEl0IEksIElucHV0SXQgRSkgeworICAgIGZvciAoOyBJICE9IEU7ICsrSSkKKyAgICAgIGluc2VydCgqSSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKworLy8vIEltcGxlbWVudHMgYSBkZW5zZSBwcm9iZWQgaGFzaC10YWJsZSBiYXNlZCBzZXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVULCB0eXBlbmFtZSBWYWx1ZUluZm9UID0gRGVuc2VNYXBJbmZvPFZhbHVlVD4+CitjbGFzcyBEZW5zZVNldCA6IHB1YmxpYyBkZXRhaWw6OkRlbnNlU2V0SW1wbDwKKyAgICAgICAgICAgICAgICAgICAgIFZhbHVlVCwgRGVuc2VNYXA8VmFsdWVULCBkZXRhaWw6OkRlbnNlU2V0RW1wdHksIFZhbHVlSW5mb1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDo6RGVuc2VTZXRQYWlyPFZhbHVlVD4+LAorICAgICAgICAgICAgICAgICAgICAgVmFsdWVJbmZvVD4geworICB1c2luZyBCYXNlVCA9CisgICAgICBkZXRhaWw6OkRlbnNlU2V0SW1wbDxWYWx1ZVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxWYWx1ZVQsIGRldGFpbDo6RGVuc2VTZXRFbXB0eSwgVmFsdWVJbmZvVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDo6RGVuc2VTZXRQYWlyPFZhbHVlVD4+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVJbmZvVD47CisKK3B1YmxpYzoKKyAgdXNpbmcgQmFzZVQ6OkJhc2VUOworfTsKKworLy8vIEltcGxlbWVudHMgYSBkZW5zZSBwcm9iZWQgaGFzaC10YWJsZSBiYXNlZCBzZXQgd2l0aCBzb21lIG51bWJlciBvZiBidWNrZXRzCisvLy8gc3RvcmVkIGlubGluZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVQsIHVuc2lnbmVkIElubGluZUJ1Y2tldHMgPSA0LAorICAgICAgICAgIHR5cGVuYW1lIFZhbHVlSW5mb1QgPSBEZW5zZU1hcEluZm88VmFsdWVUPj4KK2NsYXNzIFNtYWxsRGVuc2VTZXQKKyAgICA6IHB1YmxpYyBkZXRhaWw6OkRlbnNlU2V0SW1wbDwKKyAgICAgICAgICBWYWx1ZVQsIFNtYWxsRGVuc2VNYXA8VmFsdWVULCBkZXRhaWw6OkRlbnNlU2V0RW1wdHksIElubGluZUJ1Y2tldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlSW5mb1QsIGRldGFpbDo6RGVuc2VTZXRQYWlyPFZhbHVlVD4+LAorICAgICAgICAgIFZhbHVlSW5mb1Q+IHsKKyAgdXNpbmcgQmFzZVQgPSBkZXRhaWw6OkRlbnNlU2V0SW1wbDwKKyAgICAgIFZhbHVlVCwgU21hbGxEZW5zZU1hcDxWYWx1ZVQsIGRldGFpbDo6RGVuc2VTZXRFbXB0eSwgSW5saW5lQnVja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUluZm9ULCBkZXRhaWw6OkRlbnNlU2V0UGFpcjxWYWx1ZVQ+PiwKKyAgICAgIFZhbHVlSW5mb1Q+OworCitwdWJsaWM6CisgIHVzaW5nIEJhc2VUOjpCYXNlVDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9ERU5TRVNFVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9EZXB0aEZpcnN0SXRlcmF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NjRkN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9EZXB0aEZpcnN0SXRlcmF0b3IuaApAQCAtMCwwICsxLDMwOCBAQAorLy89PT0tIGxsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oIC0gRGVwdGggRmlyc3QgaXRlcmF0b3IgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgYnVpbGRzIG9uIHRoZSBBRFQvR3JhcGhUcmFpdHMuaCBmaWxlIHRvIGJ1aWxkIGdlbmVyaWMgZGVwdGgKKy8vIGZpcnN0IGdyYXBoIGl0ZXJhdG9yLiAgVGhpcyBmaWxlIGV4cG9zZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMvdHlwZXM6CisvLworLy8gZGZfYmVnaW4vZGZfZW5kL2RmX2l0ZXJhdG9yCisvLyAgICogTm9ybWFsIGRlcHRoLWZpcnN0IGl0ZXJhdGlvbiAtIHZpc2l0IGEgbm9kZSBhbmQgdGhlbiBhbGwgb2YgaXRzIGNoaWxkcmVuLgorLy8KKy8vIGlkZl9iZWdpbi9pZGZfZW5kL2lkZl9pdGVyYXRvcgorLy8gICAqIERlcHRoLWZpcnN0IGl0ZXJhdGlvbiBvbiB0aGUgJ2ludmVyc2UnIGdyYXBoLgorLy8KKy8vIGRmX2V4dF9iZWdpbi9kZl9leHRfZW5kL2RmX2V4dF9pdGVyYXRvcgorLy8gICAqIE5vcm1hbCBkZXB0aC1maXJzdCBpdGVyYXRpb24gLSB2aXNpdCBhIG5vZGUgYW5kIHRoZW4gYWxsIG9mIGl0cyBjaGlsZHJlbi4KKy8vICAgICBUaGlzIGl0ZXJhdG9yIHN0b3JlcyB0aGUgJ3Zpc2l0ZWQnIHNldCBpbiBhbiBleHRlcm5hbCBzZXQsIHdoaWNoIGFsbG93cworLy8gICAgIGl0IHRvIGJlIG1vcmUgZWZmaWNpZW50LCBhbmQgYWxsb3dzIGV4dGVybmFsIGNsaWVudHMgdG8gdXNlIHRoZSBzZXQgZm9yCisvLyAgICAgb3RoZXIgcHVycG9zZXMuCisvLworLy8gaWRmX2V4dF9iZWdpbi9pZGZfZXh0X2VuZC9pZGZfZXh0X2l0ZXJhdG9yCisvLyAgICogRGVwdGgtZmlyc3QgaXRlcmF0aW9uIG9uIHRoZSAnaW52ZXJzZScgZ3JhcGguCisvLyAgICAgVGhpcyBpdGVyYXRvciBzdG9yZXMgdGhlICd2aXNpdGVkJyBzZXQgaW4gYW4gZXh0ZXJuYWwgc2V0LCB3aGljaCBhbGxvd3MKKy8vICAgICBpdCB0byBiZSBtb3JlIGVmZmljaWVudCwgYW5kIGFsbG93cyBleHRlcm5hbCBjbGllbnRzIHRvIHVzZSB0aGUgc2V0IGZvcgorLy8gICAgIG90aGVyIHB1cnBvc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfREVQVEhGSVJTVElURVJBVE9SX0gKKyNkZWZpbmUgTExWTV9BRFRfREVQVEhGSVJTVElURVJBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLyBkZl9pdGVyYXRvcl9zdG9yYWdlIC0gQSBwcml2YXRlIGNsYXNzIHdoaWNoIGlzIHVzZWQgdG8gZmlndXJlIG91dCB3aGVyZSB0bworLy8gc3RvcmUgdGhlIHZpc2l0ZWQgc2V0LgordGVtcGxhdGU8Y2xhc3MgU2V0VHlwZSwgYm9vbCBFeHRlcm5hbD4gICAvLyBOb24tZXh0ZXJuYWwgc2V0CitjbGFzcyBkZl9pdGVyYXRvcl9zdG9yYWdlIHsKK3B1YmxpYzoKKyAgU2V0VHlwZSBWaXNpdGVkOworfTsKKwordGVtcGxhdGU8Y2xhc3MgU2V0VHlwZT4KK2NsYXNzIGRmX2l0ZXJhdG9yX3N0b3JhZ2U8U2V0VHlwZSwgdHJ1ZT4geworcHVibGljOgorICBkZl9pdGVyYXRvcl9zdG9yYWdlKFNldFR5cGUgJlZTZXQpIDogVmlzaXRlZChWU2V0KSB7fQorICBkZl9pdGVyYXRvcl9zdG9yYWdlKGNvbnN0IGRmX2l0ZXJhdG9yX3N0b3JhZ2UgJlMpIDogVmlzaXRlZChTLlZpc2l0ZWQpIHt9CisKKyAgU2V0VHlwZSAmVmlzaXRlZDsKK307CisKKy8vIFRoZSB2aXNpdGVkIHN0YXRlZCBmb3IgdGhlIGl0ZXJhdGlvbiBpcyBhIHNpbXBsZSBzZXQgYXVnbWVudGVkIHdpdGgKKy8vIG9uZSBtb3JlIG1ldGhvZCwgY29tcGxldGVkLCB3aGljaCBpcyBpbnZva2VkIHdoZW4gYWxsIGNoaWxkcmVuIG9mIGEKKy8vIG5vZGUgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gSXQgaXMgaW50ZW5kZWQgdG8gZGlzdGluZ3Vpc2ggb2YgYmFjayBhbmQKKy8vIGNyb3NzIGVkZ2VzIGluIHRoZSBzcGFubmluZyB0cmVlIGJ1dCBpcyBub3QgdXNlZCBpbiB0aGUgY29tbW9uIGNhc2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVJlZiwgdW5zaWduZWQgU21hbGxTaXplPTg+CitzdHJ1Y3QgZGZfaXRlcmF0b3JfZGVmYXVsdF9zZXQgOiBwdWJsaWMgU21hbGxQdHJTZXQ8Tm9kZVJlZiwgU21hbGxTaXplPiB7CisgIHVzaW5nIEJhc2VTZXQgPSBTbWFsbFB0clNldDxOb2RlUmVmLCBTbWFsbFNpemU+OworICB1c2luZyBpdGVyYXRvciA9IHR5cGVuYW1lIEJhc2VTZXQ6Oml0ZXJhdG9yOworCisgIHN0ZDo6cGFpcjxpdGVyYXRvcixib29sPiBpbnNlcnQoTm9kZVJlZiBOKSB7IHJldHVybiBCYXNlU2V0OjppbnNlcnQoTik7IH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJUPgorICB2b2lkIGluc2VydChJdGVyVCBCZWdpbiwgSXRlclQgRW5kKSB7IEJhc2VTZXQ6Omluc2VydChCZWdpbixFbmQpOyB9CisKKyAgdm9pZCBjb21wbGV0ZWQoTm9kZVJlZikge30KK307CisKKy8vIEdlbmVyaWMgRGVwdGggRmlyc3QgSXRlcmF0b3IKK3RlbXBsYXRlIDxjbGFzcyBHcmFwaFQsCisgICAgICAgICAgY2xhc3MgU2V0VHlwZSA9CisgICAgICAgICAgICAgIGRmX2l0ZXJhdG9yX2RlZmF1bHRfc2V0PHR5cGVuYW1lIEdyYXBoVHJhaXRzPEdyYXBoVD46Ok5vZGVSZWY+LAorICAgICAgICAgIGJvb2wgRXh0U3RvcmFnZSA9IGZhbHNlLCBjbGFzcyBHVCA9IEdyYXBoVHJhaXRzPEdyYXBoVD4+CitjbGFzcyBkZl9pdGVyYXRvcgorICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgdHlwZW5hbWUgR1Q6Ok5vZGVSZWY+LAorICAgICAgcHVibGljIGRmX2l0ZXJhdG9yX3N0b3JhZ2U8U2V0VHlwZSwgRXh0U3RvcmFnZT4geworICB1c2luZyBzdXBlciA9IHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgdHlwZW5hbWUgR1Q6Ok5vZGVSZWY+OworICB1c2luZyBOb2RlUmVmID0gdHlwZW5hbWUgR1Q6Ok5vZGVSZWY7CisgIHVzaW5nIENoaWxkSXRUeSA9IHR5cGVuYW1lIEdUOjpDaGlsZEl0ZXJhdG9yVHlwZTsKKworICAvLyBGaXJzdCBlbGVtZW50IGlzIG5vZGUgcmVmZXJlbmNlLCBzZWNvbmQgaXMgdGhlICduZXh0IGNoaWxkJyB0byB2aXNpdC4KKyAgLy8gVGhlIHNlY29uZCBjaGlsZCBpcyBpbml0aWFsaXplZCBsYXppbHkgdG8gcGljayB1cCBncmFwaCBjaGFuZ2VzIGR1cmluZyB0aGUKKyAgLy8gREZTLgorICB1c2luZyBTdGFja0VsZW1lbnQgPSBzdGQ6OnBhaXI8Tm9kZVJlZiwgT3B0aW9uYWw8Q2hpbGRJdFR5Pj47CisKKyAgLy8gVmlzaXRTdGFjayAtIFVzZWQgdG8gbWFpbnRhaW4gdGhlIG9yZGVyaW5nLiAgVG9wID0gY3VycmVudCBibG9jaworICBzdGQ6OnZlY3RvcjxTdGFja0VsZW1lbnQ+IFZpc2l0U3RhY2s7CisKK3ByaXZhdGU6CisgIGlubGluZSBkZl9pdGVyYXRvcihOb2RlUmVmIE5vZGUpIHsKKyAgICB0aGlzLT5WaXNpdGVkLmluc2VydChOb2RlKTsKKyAgICBWaXNpdFN0YWNrLnB1c2hfYmFjayhTdGFja0VsZW1lbnQoTm9kZSwgTm9uZSkpOworICB9CisKKyAgaW5saW5lIGRmX2l0ZXJhdG9yKCkgPSBkZWZhdWx0OyAvLyBFbmQgaXMgd2hlbiBzdGFjayBpcyBlbXB0eQorCisgIGlubGluZSBkZl9pdGVyYXRvcihOb2RlUmVmIE5vZGUsIFNldFR5cGUgJlMpCisgICAgICA6IGRmX2l0ZXJhdG9yX3N0b3JhZ2U8U2V0VHlwZSwgRXh0U3RvcmFnZT4oUykgeworICAgIGlmICh0aGlzLT5WaXNpdGVkLmluc2VydChOb2RlKS5zZWNvbmQpCisgICAgICBWaXNpdFN0YWNrLnB1c2hfYmFjayhTdGFja0VsZW1lbnQoTm9kZSwgTm9uZSkpOworICB9CisKKyAgaW5saW5lIGRmX2l0ZXJhdG9yKFNldFR5cGUgJlMpCisgICAgOiBkZl9pdGVyYXRvcl9zdG9yYWdlPFNldFR5cGUsIEV4dFN0b3JhZ2U+KFMpIHsKKyAgICAvLyBFbmQgaXMgd2hlbiBzdGFjayBpcyBlbXB0eQorICB9CisKKyAgaW5saW5lIHZvaWQgdG9OZXh0KCkgeworICAgIGRvIHsKKyAgICAgIE5vZGVSZWYgTm9kZSA9IFZpc2l0U3RhY2suYmFjaygpLmZpcnN0OworICAgICAgT3B0aW9uYWw8Q2hpbGRJdFR5PiAmT3B0ID0gVmlzaXRTdGFjay5iYWNrKCkuc2Vjb25kOworCisgICAgICBpZiAoIU9wdCkKKyAgICAgICAgT3B0LmVtcGxhY2UoR1Q6OmNoaWxkX2JlZ2luKE5vZGUpKTsKKworICAgICAgLy8gTm90aWNlIHRoYXQgd2UgZGlyZWN0bHkgbXV0YXRlICpPcHQgaGVyZSwgc28gdGhhdAorICAgICAgLy8gVmlzaXRTdGFjay5iYWNrKCkuc2Vjb25kIGFjdHVhbGx5IGdldHMgdXBkYXRlZCBhcyB0aGUgaXRlcmF0b3IKKyAgICAgIC8vIGluY3JlYXNlcy4KKyAgICAgIHdoaWxlICgqT3B0ICE9IEdUOjpjaGlsZF9lbmQoTm9kZSkpIHsKKyAgICAgICAgTm9kZVJlZiBOZXh0ID0gKigqT3B0KSsrOworICAgICAgICAvLyBIYXMgb3VyIG5leHQgc2libGluZyBiZWVuIHZpc2l0ZWQ/CisgICAgICAgIGlmICh0aGlzLT5WaXNpdGVkLmluc2VydChOZXh0KS5zZWNvbmQpIHsKKyAgICAgICAgICAvLyBObywgZG8gaXQgbm93LgorICAgICAgICAgIFZpc2l0U3RhY2sucHVzaF9iYWNrKFN0YWNrRWxlbWVudChOZXh0LCBOb25lKSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgICB0aGlzLT5WaXNpdGVkLmNvbXBsZXRlZChOb2RlKTsKKworICAgICAgLy8gT29wcywgcmFuIG91dCBvZiBzdWNjZXNzb3JzLi4uIGdvIHVwIGEgbGV2ZWwgb24gdGhlIHN0YWNrLgorICAgICAgVmlzaXRTdGFjay5wb3BfYmFjaygpOworICAgIH0gd2hpbGUgKCFWaXNpdFN0YWNrLmVtcHR5KCkpOworICB9CisKK3B1YmxpYzoKKyAgdXNpbmcgcG9pbnRlciA9IHR5cGVuYW1lIHN1cGVyOjpwb2ludGVyOworCisgIC8vIFByb3ZpZGUgc3RhdGljIGJlZ2luIGFuZCBlbmQgbWV0aG9kcyBhcyBvdXIgcHVibGljICJjb25zdHJ1Y3RvcnMiCisgIHN0YXRpYyBkZl9pdGVyYXRvciBiZWdpbihjb25zdCBHcmFwaFQgJkcpIHsKKyAgICByZXR1cm4gZGZfaXRlcmF0b3IoR1Q6OmdldEVudHJ5Tm9kZShHKSk7CisgIH0KKyAgc3RhdGljIGRmX2l0ZXJhdG9yIGVuZChjb25zdCBHcmFwaFQgJkcpIHsgcmV0dXJuIGRmX2l0ZXJhdG9yKCk7IH0KKworICAvLyBTdGF0aWMgYmVnaW4gYW5kIGVuZCBtZXRob2RzIGFzIG91ciBwdWJsaWMgY3RvcnMgZm9yIGV4dGVybmFsIGl0ZXJhdG9ycworICBzdGF0aWMgZGZfaXRlcmF0b3IgYmVnaW4oY29uc3QgR3JhcGhUICZHLCBTZXRUeXBlICZTKSB7CisgICAgcmV0dXJuIGRmX2l0ZXJhdG9yKEdUOjpnZXRFbnRyeU5vZGUoRyksIFMpOworICB9CisgIHN0YXRpYyBkZl9pdGVyYXRvciBlbmQoY29uc3QgR3JhcGhUICZHLCBTZXRUeXBlICZTKSB7IHJldHVybiBkZl9pdGVyYXRvcihTKTsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBkZl9pdGVyYXRvciAmeCkgY29uc3QgeworICAgIHJldHVybiBWaXNpdFN0YWNrID09IHguVmlzaXRTdGFjazsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgZGZfaXRlcmF0b3IgJngpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0geCk7IH0KKworICBjb25zdCBOb2RlUmVmICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBWaXNpdFN0YWNrLmJhY2soKS5maXJzdDsgfQorCisgIC8vIFRoaXMgaXMgYSBub25zdGFuZGFyZCBvcGVyYXRvci0+IHRoYXQgZGVyZWZlcmVuY2VzIHRoZSBwb2ludGVyIGFuIGV4dHJhCisgIC8vIHRpbWUuLi4gc28gdGhhdCB5b3UgY2FuIGFjdHVhbGx5IGNhbGwgbWV0aG9kcyBPTiB0aGUgTm9kZSwgYmVjYXVzZQorICAvLyB0aGUgY29udGFpbmVkIHR5cGUgaXMgYSBwb2ludGVyLiAgVGhpcyBhbGxvd3MgQkJJdC0+Z2V0VGVybWluYXRvcigpIGYuZS4KKyAgLy8KKyAgTm9kZVJlZiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gKip0aGlzOyB9CisKKyAgZGZfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7IC8vIFByZWluY3JlbWVudAorICAgIHRvTmV4dCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2tpcHMgYWxsIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IG5vZGUgYW5kIHRyYXZlcnNlcyB0byBuZXh0IG5vZGUKKyAgLy8vCisgIC8vLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgaW5jcmVtZW50aW5nIHRoZSBpdGVyYXRvci4gSWYgeW91CisgIC8vLyBhbHdheXMgaW5jcmVtZW50IGFuZCBjYWxsIHRoaXMgZnVuY3Rpb24sIHlvdSByaXNrIHdhbGtpbmcgb2ZmIHRoZSBlbmQuCisgIGRmX2l0ZXJhdG9yICZza2lwQ2hpbGRyZW4oKSB7CisgICAgVmlzaXRTdGFjay5wb3BfYmFjaygpOworICAgIGlmICghVmlzaXRTdGFjay5lbXB0eSgpKQorICAgICAgdG9OZXh0KCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgZGZfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgLy8gUG9zdGluY3JlbWVudAorICAgIGRmX2l0ZXJhdG9yIHRtcCA9ICp0aGlzOworICAgICsrKnRoaXM7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorCisgIC8vIG5vZGVWaXNpdGVkIC0gcmV0dXJuIHRydWUgaWYgdGhpcyBpdGVyYXRvciBoYXMgYWxyZWFkeSB2aXNpdGVkIHRoZQorICAvLyBzcGVjaWZpZWQgbm9kZS4gIFRoaXMgaXMgcHVibGljLCBhbmQgd2lsbCBwcm9iYWJseSBiZSB1c2VkIHRvIGl0ZXJhdGUgb3ZlcgorICAvLyBub2RlcyB0aGF0IGEgZGVwdGggZmlyc3QgaXRlcmF0aW9uIGRpZCBub3QgZmluZDogaWUgdW5yZWFjaGFibGUgbm9kZXMuCisgIC8vCisgIGJvb2wgbm9kZVZpc2l0ZWQoTm9kZVJlZiBOb2RlKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPlZpc2l0ZWQuY291bnQoTm9kZSkgIT0gMDsKKyAgfQorCisgIC8vLyBnZXRQYXRoTGVuZ3RoIC0gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHBhdGggZnJvbSB0aGUgZW50cnkgbm9kZSB0byB0aGUKKyAgLy8vIGN1cnJlbnQgbm9kZSwgY291bnRpbmcgYm90aCBub2Rlcy4KKyAgdW5zaWduZWQgZ2V0UGF0aExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIFZpc2l0U3RhY2suc2l6ZSgpOyB9CisKKyAgLy8vIGdldFBhdGggLSBSZXR1cm4gdGhlIG4ndGggbm9kZSBpbiB0aGUgcGF0aCBmcm9tIHRoZSBlbnRyeSBub2RlIHRvIHRoZQorICAvLy8gY3VycmVudCBub2RlLgorICBOb2RlUmVmIGdldFBhdGgodW5zaWduZWQgbikgY29uc3QgeyByZXR1cm4gVmlzaXRTdGFja1tuXS5maXJzdDsgfQorfTsKKworLy8gUHJvdmlkZSBnbG9iYWwgY29uc3RydWN0b3JzIHRoYXQgYXV0b21hdGljYWxseSBmaWd1cmUgb3V0IGNvcnJlY3QgdHlwZXMuLi4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2RmX2l0ZXJhdG9yPFQ+IGRmX2JlZ2luKGNvbnN0IFQmIEcpIHsKKyAgcmV0dXJuIGRmX2l0ZXJhdG9yPFQ+OjpiZWdpbihHKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitkZl9pdGVyYXRvcjxUPiBkZl9lbmQoY29uc3QgVCYgRykgeworICByZXR1cm4gZGZfaXRlcmF0b3I8VD46OmVuZChHKTsKK30KKworLy8gUHJvdmlkZSBhbiBhY2Nlc3NvciBtZXRob2QgdG8gdXNlIHRoZW0gaW4gcmFuZ2UtYmFzZWQgcGF0dGVybnMuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2l0ZXJhdG9yX3JhbmdlPGRmX2l0ZXJhdG9yPFQ+PiBkZXB0aF9maXJzdChjb25zdCBUJiBHKSB7CisgIHJldHVybiBtYWtlX3JhbmdlKGRmX2JlZ2luKEcpLCBkZl9lbmQoRykpOworfQorCisvLyBQcm92aWRlIGdsb2JhbCBkZWZpbml0aW9ucyBvZiBleHRlcm5hbCBkZXB0aCBmaXJzdCBpdGVyYXRvcnMuLi4KK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBTZXRUeSA9IHN0ZDo6c2V0PHR5cGVuYW1lIEdyYXBoVHJhaXRzPFQ+OjpOb2RlUmVmPj4KK3N0cnVjdCBkZl9leHRfaXRlcmF0b3IgOiBwdWJsaWMgZGZfaXRlcmF0b3I8VCwgU2V0VHksIHRydWU+IHsKKyAgZGZfZXh0X2l0ZXJhdG9yKGNvbnN0IGRmX2l0ZXJhdG9yPFQsIFNldFR5LCB0cnVlPiAmVikKKyAgICA6IGRmX2l0ZXJhdG9yPFQsIFNldFR5LCB0cnVlPihWKSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFNldFR5PgorZGZfZXh0X2l0ZXJhdG9yPFQsIFNldFR5PiBkZl9leHRfYmVnaW4oY29uc3QgVCYgRywgU2V0VHkgJlMpIHsKKyAgcmV0dXJuIGRmX2V4dF9pdGVyYXRvcjxULCBTZXRUeT46OmJlZ2luKEcsIFMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgU2V0VHk+CitkZl9leHRfaXRlcmF0b3I8VCwgU2V0VHk+IGRmX2V4dF9lbmQoY29uc3QgVCYgRywgU2V0VHkgJlMpIHsKKyAgcmV0dXJuIGRmX2V4dF9pdGVyYXRvcjxULCBTZXRUeT46OmVuZChHLCBTKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFNldFR5PgoraXRlcmF0b3JfcmFuZ2U8ZGZfZXh0X2l0ZXJhdG9yPFQsIFNldFR5Pj4gZGVwdGhfZmlyc3RfZXh0KGNvbnN0IFQmIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0VHkgJlMpIHsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoZGZfZXh0X2JlZ2luKEcsIFMpLCBkZl9leHRfZW5kKEcsIFMpKTsKK30KKworLy8gUHJvdmlkZSBnbG9iYWwgZGVmaW5pdGlvbnMgb2YgaW52ZXJzZSBkZXB0aCBmaXJzdCBpdGVyYXRvcnMuLi4KK3RlbXBsYXRlIDxjbGFzcyBULAorICAgICAgICAgIGNsYXNzIFNldFR5ID0KKyAgICAgICAgICAgICAgZGZfaXRlcmF0b3JfZGVmYXVsdF9zZXQ8dHlwZW5hbWUgR3JhcGhUcmFpdHM8VD46Ok5vZGVSZWY+LAorICAgICAgICAgIGJvb2wgRXh0ZXJuYWwgPSBmYWxzZT4KK3N0cnVjdCBpZGZfaXRlcmF0b3IgOiBwdWJsaWMgZGZfaXRlcmF0b3I8SW52ZXJzZTxUPiwgU2V0VHksIEV4dGVybmFsPiB7CisgIGlkZl9pdGVyYXRvcihjb25zdCBkZl9pdGVyYXRvcjxJbnZlcnNlPFQ+LCBTZXRUeSwgRXh0ZXJuYWw+ICZWKQorICAgIDogZGZfaXRlcmF0b3I8SW52ZXJzZTxUPiwgU2V0VHksIEV4dGVybmFsPihWKSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpZGZfaXRlcmF0b3I8VD4gaWRmX2JlZ2luKGNvbnN0IFQmIEcpIHsKKyAgcmV0dXJuIGlkZl9pdGVyYXRvcjxUPjo6YmVnaW4oSW52ZXJzZTxUPihHKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraWRmX2l0ZXJhdG9yPFQ+IGlkZl9lbmQoY29uc3QgVCYgRyl7CisgIHJldHVybiBpZGZfaXRlcmF0b3I8VD46OmVuZChJbnZlcnNlPFQ+KEcpKTsKK30KKworLy8gUHJvdmlkZSBhbiBhY2Nlc3NvciBtZXRob2QgdG8gdXNlIHRoZW0gaW4gcmFuZ2UtYmFzZWQgcGF0dGVybnMuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2l0ZXJhdG9yX3JhbmdlPGlkZl9pdGVyYXRvcjxUPj4gaW52ZXJzZV9kZXB0aF9maXJzdChjb25zdCBUJiBHKSB7CisgIHJldHVybiBtYWtlX3JhbmdlKGlkZl9iZWdpbihHKSwgaWRmX2VuZChHKSk7Cit9CisKKy8vIFByb3ZpZGUgZ2xvYmFsIGRlZmluaXRpb25zIG9mIGV4dGVybmFsIGludmVyc2UgZGVwdGggZmlyc3QgaXRlcmF0b3JzLi4uCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgU2V0VHkgPSBzdGQ6OnNldDx0eXBlbmFtZSBHcmFwaFRyYWl0czxUPjo6Tm9kZVJlZj4+CitzdHJ1Y3QgaWRmX2V4dF9pdGVyYXRvciA6IHB1YmxpYyBpZGZfaXRlcmF0b3I8VCwgU2V0VHksIHRydWU+IHsKKyAgaWRmX2V4dF9pdGVyYXRvcihjb25zdCBpZGZfaXRlcmF0b3I8VCwgU2V0VHksIHRydWU+ICZWKQorICAgIDogaWRmX2l0ZXJhdG9yPFQsIFNldFR5LCB0cnVlPihWKSB7fQorICBpZGZfZXh0X2l0ZXJhdG9yKGNvbnN0IGRmX2l0ZXJhdG9yPEludmVyc2U8VD4sIFNldFR5LCB0cnVlPiAmVikKKyAgICA6IGlkZl9pdGVyYXRvcjxULCBTZXRUeSwgdHJ1ZT4oVikge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBTZXRUeT4KK2lkZl9leHRfaXRlcmF0b3I8VCwgU2V0VHk+IGlkZl9leHRfYmVnaW4oY29uc3QgVCYgRywgU2V0VHkgJlMpIHsKKyAgcmV0dXJuIGlkZl9leHRfaXRlcmF0b3I8VCwgU2V0VHk+OjpiZWdpbihJbnZlcnNlPFQ+KEcpLCBTKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFNldFR5PgoraWRmX2V4dF9pdGVyYXRvcjxULCBTZXRUeT4gaWRmX2V4dF9lbmQoY29uc3QgVCYgRywgU2V0VHkgJlMpIHsKKyAgcmV0dXJuIGlkZl9leHRfaXRlcmF0b3I8VCwgU2V0VHk+OjplbmQoSW52ZXJzZTxUPihHKSwgUyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBTZXRUeT4KK2l0ZXJhdG9yX3JhbmdlPGlkZl9leHRfaXRlcmF0b3I8VCwgU2V0VHk+PiBpbnZlcnNlX2RlcHRoX2ZpcnN0X2V4dChjb25zdCBUJiBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldFR5ICZTKSB7CisgIHJldHVybiBtYWtlX3JhbmdlKGlkZl9leHRfYmVnaW4oRywgUyksIGlkZl9leHRfZW5kKEcsIFMpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX0RFUFRIRklSU1RJVEVSQVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9FcG9jaFRyYWNrZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0Vwb2NoVHJhY2tlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMzliYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9FcG9jaFRyYWNrZXIuaApAQCAtMCwwICsxLDEwMCBAQAorLy89PT0tIGxsdm0vQURUL0Vwb2NoVHJhY2tlci5oIC0gQURUIGVwb2NoIHRyYWNraW5nIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRGVidWdFcG9jaEJhc2UgYW5kIERlYnVnRXBvY2hCYXNlOjpIYW5kbGVCYXNlIGNsYXNzZXMuCisvLyBUaGVzZSBjYW4gYmUgdXNlZCB0byB3cml0ZSBpdGVyYXRvcnMgdGhhdCBhcmUgZmFpbC1mYXN0IHdoZW4gTExWTSBpcyBidWlsdAorLy8gd2l0aCBhc3NlcnRzIGVuYWJsZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9FUE9DSF9UUkFDS0VSX0gKKyNkZWZpbmUgTExWTV9BRFRfRVBPQ0hfVFJBQ0tFUl9ICisKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9hYmktYnJlYWtpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9sbHZtLWNvbmZpZy5oIgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCisjaWYgTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUworCisvLy8gXGJyaWVmIEEgYmFzZSBjbGFzcyBmb3IgZGF0YSBzdHJ1Y3R1cmUgY2xhc3NlcyB3aXNoaW5nIHRvIG1ha2UgaXRlcmF0b3JzCisvLy8gKCJoYW5kbGVzIikgcG9pbnRpbmcgaW50byB0aGVtc2VsdmVzIGZhaWwtZmFzdC4gIFdoZW4gYnVpbGRpbmcgd2l0aG91dAorLy8vIGFzc2VydHMsIHRoaXMgY2xhc3MgaXMgZW1wdHkgYW5kIGRvZXMgbm90aGluZy4KKy8vLworLy8vIERlYnVnRXBvY2hCYXNlIGRvZXMgbm90IGJ5IGl0c2VsZiB0cmFjayBoYW5kbGVzIHBvaW50aW5nIGludG8gaXRzZWxmLiAgVGhlCisvLy8gZXhwZWN0YXRpb24gaXMgdGhhdCByb3V0aW5lcyB0b3VjaGluZyB0aGUgaGFuZGxlcyB3aWxsIHBvbGwgb24KKy8vLyBpc0hhbmRsZUluU3luYyBhdCBhcHByb3ByaWF0ZSBwb2ludHMgdG8gYXNzZXJ0IHRoYXQgdGhlIGhhbmRsZSB0aGV5J3JlIHVzaW5nCisvLy8gaXMgc3RpbGwgdmFsaWQuCisvLy8KK2NsYXNzIERlYnVnRXBvY2hCYXNlIHsKKyAgdWludDY0X3QgRXBvY2g7CisKK3B1YmxpYzoKKyAgRGVidWdFcG9jaEJhc2UoKSA6IEVwb2NoKDApIHt9CisKKyAgLy8vIFxicmllZiBDYWxsaW5nIGluY3JlbWVudEVwb2NoIGludmFsaWRhdGVzIGFsbCBoYW5kbGVzIHBvaW50aW5nIGludG8gdGhlCisgIC8vLyBjYWxsaW5nIGluc3RhbmNlLgorICB2b2lkIGluY3JlbWVudEVwb2NoKCkgeyArK0Vwb2NoOyB9CisKKyAgLy8vIFxicmllZiBUaGUgZGVzdHJ1Y3RvciBjYWxscyBpbmNyZW1lbnRFcG9jaCB0byBtYWtlIHVzZS1hZnRlci1mcmVlIGJ1Z3MKKyAgLy8vIG1vcmUgbGlrZWx5IHRvIGNyYXNoIGRldGVybWluaXN0aWNhbGx5LgorICB+RGVidWdFcG9jaEJhc2UoKSB7IGluY3JlbWVudEVwb2NoKCk7IH0KKworICAvLy8gXGJyaWVmIEEgYmFzZSBjbGFzcyBmb3IgaXRlcmF0b3IgY2xhc3NlcyAoImhhbmRsZXMiKSB0aGF0IHdpc2ggdG8gcG9sbCBmb3IKKyAgLy8vIGl0ZXJhdG9yIGludmFsaWRhdGluZyBtb2RpZmljYXRpb25zIGluIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlLgorICAvLy8gV2hlbiBMTFZNIGlzIGJ1aWx0IHdpdGhvdXQgYXNzZXJ0cywgdGhpcyBjbGFzcyBpcyBlbXB0eSBhbmQgZG9lcyBub3RoaW5nLgorICAvLy8KKyAgLy8vIEhhbmRsZUJhc2UgZG9lcyBub3QgdHJhY2sgdGhlIHBhcmVudCBkYXRhIHN0cnVjdHVyZSBieSBpdHNlbGYuICBJdCBleHBlY3RzCisgIC8vLyB0aGUgcm91dGluZXMgbW9kaWZ5aW5nIHRoZSBkYXRhIHN0cnVjdHVyZSB0byBjYWxsIGluY3JlbWVudEVwb2NoIHdoZW4gdGhleQorICAvLy8gbWFrZSBhbiBpdGVyYXRvci1pbnZhbGlkYXRpbmcgbW9kaWZpY2F0aW9uLgorICAvLy8KKyAgY2xhc3MgSGFuZGxlQmFzZSB7CisgICAgY29uc3QgdWludDY0X3QgKkVwb2NoQWRkcmVzczsKKyAgICB1aW50NjRfdCBFcG9jaEF0Q3JlYXRpb247CisKKyAgcHVibGljOgorICAgIEhhbmRsZUJhc2UoKSA6IEVwb2NoQWRkcmVzcyhudWxscHRyKSwgRXBvY2hBdENyZWF0aW9uKFVJTlQ2NF9NQVgpIHt9CisKKyAgICBleHBsaWNpdCBIYW5kbGVCYXNlKGNvbnN0IERlYnVnRXBvY2hCYXNlICpQYXJlbnQpCisgICAgICAgIDogRXBvY2hBZGRyZXNzKCZQYXJlbnQtPkVwb2NoKSwgRXBvY2hBdENyZWF0aW9uKFBhcmVudC0+RXBvY2gpIHt9CisKKyAgICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgRGVidWdFcG9jaEJhc2UgdGhpcyBIYW5kbGUgaXMgbGlua2VkIHRvIGhhcworICAgIC8vLyBub3QgY2FsbGVkIGluY3JlbWVudEVwb2NoIG9uIGl0c2VsZiBzaW5jZSB0aGUgY3JlYXRpb24gb2YgdGhpcworICAgIC8vLyBIYW5kbGVCYXNlIGluc3RhbmNlLgorICAgIGJvb2wgaXNIYW5kbGVJblN5bmMoKSBjb25zdCB7IHJldHVybiAqRXBvY2hBZGRyZXNzID09IEVwb2NoQXRDcmVhdGlvbjsgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZXBvY2ggd29yZCBzdG9yZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlCisgICAgLy8vIHRoaXMgaGFuZGxlIHBvaW50cyBpbnRvLiAgQ2FuIGJlIHVzZWQgdG8gY2hlY2sgaWYgdHdvIGl0ZXJhdG9ycyBwb2ludAorICAgIC8vLyBpbnRvIHRoZSBzYW1lIGRhdGEgc3RydWN0dXJlLgorICAgIGNvbnN0IHZvaWQgKmdldEVwb2NoQWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIEVwb2NoQWRkcmVzczsgfQorICB9OworfTsKKworI2Vsc2UKKworY2xhc3MgRGVidWdFcG9jaEJhc2UgeworcHVibGljOgorICB2b2lkIGluY3JlbWVudEVwb2NoKCkge30KKworICBjbGFzcyBIYW5kbGVCYXNlIHsKKyAgcHVibGljOgorICAgIEhhbmRsZUJhc2UoKSA9IGRlZmF1bHQ7CisgICAgZXhwbGljaXQgSGFuZGxlQmFzZShjb25zdCBEZWJ1Z0Vwb2NoQmFzZSAqKSB7fQorICAgIGJvb2wgaXNIYW5kbGVJblN5bmMoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgICAgY29uc3Qgdm9pZCAqZ2V0RXBvY2hBZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQorICB9OworfTsKKworI2VuZGlmIC8vIExMVk1fRU5BQkxFX0FCSV9CUkVBS0lOR19DSEVDS1MKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0VxdWl2YWxlbmNlQ2xhc3Nlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvRXF1aXZhbGVuY2VDbGFzc2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmNDg0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0VxdWl2YWxlbmNlQ2xhc3Nlcy5oCkBAIC0wLDAgKzEsMjk4IEBACisvLz09PS0gbGx2bS9BRFQvRXF1aXZhbGVuY2VDbGFzc2VzLmggLSBHZW5lcmljIEVxdWl2LiBDbGFzc2VzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgZXF1aXZhbGVuY2UgY2xhc3NlcyB0aHJvdWdoIHRoZSB1c2UgVGFyamFuJ3MKKy8vIGVmZmljaWVudCB1bmlvbi1maW5kIGFsZ29yaXRobS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0VRVUlWQUxFTkNFQ0xBU1NFU19ICisjZGVmaW5lIExMVk1fQURUX0VRVUlWQUxFTkNFQ0xBU1NFU19ICisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEVxdWl2YWxlbmNlQ2xhc3NlcyAtIFRoaXMgcmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgZXF1aXZhbGVuY2UgY2xhc3NlcyBhbmQKKy8vLyBzdXBwb3J0cyB0aHJlZSBlZmZpY2llbnQgb3BlcmF0aW9uczogaW5zZXJ0IGFuIGVsZW1lbnQgaW50byBhIGNsYXNzIG9mIGl0cworLy8vIG93biwgdW5pb24gdHdvIGNsYXNzZXMsIGFuZCBmaW5kIHRoZSBjbGFzcyBmb3IgYSBnaXZlbiBlbGVtZW50LiAgSW4KKy8vLyBhZGRpdGlvbiB0byB0aGVzZSBtb2RpZmljYXRpb24gbWV0aG9kcywgaXQgaXMgcG9zc2libGUgdG8gaXRlcmF0ZSBvdmVyIGFsbAorLy8vIG9mIHRoZSBlcXVpdmFsZW5jZSBjbGFzc2VzIGFuZCBhbGwgb2YgdGhlIGVsZW1lbnRzIGluIGEgY2xhc3MuCisvLy8KKy8vLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGFuIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiB0aGF0IG9ubHkgc3RvcmVzIG9uZSBjb3B5CisvLy8gb2YgdGhlIGVsZW1lbnQgYmVpbmcgaW5kZXhlZCBwZXIgZW50cnkgaW4gdGhlIHNldCwgYW5kIGFsbG93cyBhbnkgYXJiaXRyYXJ5CisvLy8gdHlwZSB0byBiZSBpbmRleGVkIChhcyBsb25nIGFzIGl0IGNhbiBiZSBvcmRlcmVkIHdpdGggb3BlcmF0b3I8KS4KKy8vLworLy8vIEhlcmUgaXMgYSBzaW1wbGUgZXhhbXBsZSB1c2luZyBpbnRlZ2VyczoKKy8vLworLy8vIFxjb2RlCisvLy8gIEVxdWl2YWxlbmNlQ2xhc3NlczxpbnQ+IEVDOworLy8vICBFQy51bmlvblNldHMoMSwgMik7ICAgICAgICAgICAgICAgIC8vIGluc2VydCAxLCAyIGludG8gdGhlIHNhbWUgc2V0CisvLy8gIEVDLmluc2VydCg0KTsgRUMuaW5zZXJ0KDUpOyAgICAgICAgLy8gaW5zZXJ0IDQsIDUgaW50byBvd24gc2V0cworLy8vICBFQy51bmlvblNldHMoNSwgMSk7ICAgICAgICAgICAgICAgIC8vIG1lcmdlIHRoZSBzZXQgZm9yIDEgd2l0aCA1J3Mgc2V0LgorLy8vCisvLy8gIGZvciAoRXF1aXZhbGVuY2VDbGFzc2VzPGludD46Oml0ZXJhdG9yIEkgPSBFQy5iZWdpbigpLCBFID0gRUMuZW5kKCk7CisvLy8gICAgICAgSSAhPSBFOyArK0kpIHsgICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgb2YgdGhlIGVxdWl2YWxlbmNlIHNldHMuCisvLy8gICAgaWYgKCFJLT5pc0xlYWRlcigpKSBjb250aW51ZTsgICAvLyBJZ25vcmUgbm9uLWxlYWRlciBzZXRzLgorLy8vICAgIGZvciAoRXF1aXZhbGVuY2VDbGFzc2VzPGludD46Om1lbWJlcl9pdGVyYXRvciBNSSA9IEVDLm1lbWJlcl9iZWdpbihJKTsKKy8vLyAgICAgICAgIE1JICE9IEVDLm1lbWJlcl9lbmQoKTsgKytNSSkgICAvLyBMb29wIG92ZXIgbWVtYmVycyBpbiB0aGlzIHNldC4KKy8vLyAgICAgIGNlcnIgPDwgKk1JIDw8ICIgIjsgIC8vIFByaW50IG1lbWJlci4KKy8vLyAgICBjZXJyIDw8ICJcbiI7ICAgLy8gRmluaXNoIHNldC4KKy8vLyAgfQorLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGV4YW1wbGUgcHJpbnRzOgorLy8vICAgNAorLy8vICAgNSAxIDIKKy8vLwordGVtcGxhdGUgPGNsYXNzIEVsZW1UeT4KK2NsYXNzIEVxdWl2YWxlbmNlQ2xhc3NlcyB7CisgIC8vLyBFQ1ZhbHVlIC0gVGhlIEVxdWl2YWxlbmNlQ2xhc3NlcyBkYXRhIHN0cnVjdHVyZSBpcyBqdXN0IGEgc2V0IG9mIHRoZXNlLgorICAvLy8gRWFjaCBvZiB0aGVzZSByZXByZXNlbnRzIGEgcmVsYXRpb24gZm9yIGEgdmFsdWUuICBGaXJzdCBpdCBzdG9yZXMgdGhlCisgIC8vLyB2YWx1ZSBpdHNlbGYsIHdoaWNoIHByb3ZpZGVzIHRoZSBvcmRlcmluZyB0aGF0IHRoZSBzZXQgcXVlcmllcy4gIE5leHQsIGl0CisgIC8vLyBwcm92aWRlcyBhICJuZXh0IHBvaW50ZXIiLCB3aGljaCBpcyB1c2VkIHRvIGVudW1lcmF0ZSBhbGwgb2YgdGhlIGVsZW1lbnRzCisgIC8vLyBpbiB0aGUgdW5pb25lZCBzZXQuICBGaW5hbGx5LCBpdCBkZWZpbmVzIGVpdGhlciBhICJlbmQgb2YgbGlzdCBwb2ludGVyIiBvcgorICAvLy8gImxlYWRlciBwb2ludGVyIiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgdmFsdWUgaXRzZWxmIGlzIGEgbGVhZGVyLiAgQQorICAvLy8gImxlYWRlciBwb2ludGVyIiBwb2ludHMgdG8gdGhlIG5vZGUgdGhhdCBpcyB0aGUgbGVhZGVyIGZvciB0aGlzIGVsZW1lbnQsCisgIC8vLyBpZiB0aGUgbm9kZSBpcyBub3QgYSBsZWFkZXIuICBBICJlbmQgb2YgbGlzdCBwb2ludGVyIiBwb2ludHMgdG8gdGhlIGxhc3QKKyAgLy8vIG5vZGUgaW4gdGhlIGxpc3Qgb2YgbWVtYmVycyBvZiB0aGlzIGxpc3QuICBXaGV0aGVyIG9yIG5vdCBhIG5vZGUgaXMgYQorICAvLy8gbGVhZGVyIGlzIGRldGVybWluZWQgYnkgYSBiaXQgc3RvbGVuIGZyb20gb25lIG9mIHRoZSBwb2ludGVycy4KKyAgY2xhc3MgRUNWYWx1ZSB7CisgICAgZnJpZW5kIGNsYXNzIEVxdWl2YWxlbmNlQ2xhc3NlczsKKworICAgIG11dGFibGUgY29uc3QgRUNWYWx1ZSAqTGVhZGVyLCAqTmV4dDsKKyAgICBFbGVtVHkgRGF0YTsKKworICAgIC8vIEVDVmFsdWUgY3RvciAtIFN0YXJ0IG91dCB3aXRoIEVuZE9mTGlzdCBwb2ludGluZyB0byB0aGlzIG5vZGUsIE5leHQgaXMKKyAgICAvLyBOdWxsLCBpc0xlYWRlciA9IHRydWUuCisgICAgRUNWYWx1ZShjb25zdCBFbGVtVHkgJkVsdCkKKyAgICAgIDogTGVhZGVyKHRoaXMpLCBOZXh0KChFQ1ZhbHVlKikoaW50cHRyX3QpMSksIERhdGEoRWx0KSB7fQorCisgICAgY29uc3QgRUNWYWx1ZSAqZ2V0TGVhZGVyKCkgY29uc3QgeworICAgICAgaWYgKGlzTGVhZGVyKCkpIHJldHVybiB0aGlzOworICAgICAgaWYgKExlYWRlci0+aXNMZWFkZXIoKSkgcmV0dXJuIExlYWRlcjsKKyAgICAgIC8vIFBhdGggY29tcHJlc3Npb24uCisgICAgICByZXR1cm4gTGVhZGVyID0gTGVhZGVyLT5nZXRMZWFkZXIoKTsKKyAgICB9CisKKyAgICBjb25zdCBFQ1ZhbHVlICpnZXRFbmRPZkxpc3QoKSBjb25zdCB7CisgICAgICBhc3NlcnQoaXNMZWFkZXIoKSAmJiAiQ2Fubm90IGdldCB0aGUgZW5kIG9mIGEgbGlzdCBmb3IgYSBub24tbGVhZGVyISIpOworICAgICAgcmV0dXJuIExlYWRlcjsKKyAgICB9CisKKyAgICB2b2lkIHNldE5leHQoY29uc3QgRUNWYWx1ZSAqTmV3TmV4dCkgY29uc3QgeworICAgICAgYXNzZXJ0KGdldE5leHQoKSA9PSBudWxscHRyICYmICJBbHJlYWR5IGhhcyBhIG5leHQgcG9pbnRlciEiKTsKKyAgICAgIE5leHQgPSAoY29uc3QgRUNWYWx1ZSopKChpbnRwdHJfdClOZXdOZXh0IHwgKGludHB0cl90KWlzTGVhZGVyKCkpOworICAgIH0KKworICBwdWJsaWM6CisgICAgRUNWYWx1ZShjb25zdCBFQ1ZhbHVlICZSSFMpIDogTGVhZGVyKHRoaXMpLCBOZXh0KChFQ1ZhbHVlKikoaW50cHRyX3QpMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YShSSFMuRGF0YSkgeworICAgICAgLy8gT25seSBzdXBwb3J0IGNvcHlpbmcgb2Ygc2luZ2xldG9uIG5vZGVzLgorICAgICAgYXNzZXJ0KFJIUy5pc0xlYWRlcigpICYmIFJIUy5nZXROZXh0KCkgPT0gbnVsbHB0ciAmJiAiTm90IGEgc2luZ2xldG9uISIpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEVDVmFsdWUgJlVGTikgY29uc3QgeyByZXR1cm4gRGF0YSA8IFVGTi5EYXRhOyB9CisKKyAgICBib29sIGlzTGVhZGVyKCkgY29uc3QgeyByZXR1cm4gKGludHB0cl90KU5leHQgJiAxOyB9CisgICAgY29uc3QgRWxlbVR5ICZnZXREYXRhKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorCisgICAgY29uc3QgRUNWYWx1ZSAqZ2V0TmV4dCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoRUNWYWx1ZSopKChpbnRwdHJfdClOZXh0ICYgfihpbnRwdHJfdCkxKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFQgJlZhbCkgY29uc3QgeyByZXR1cm4gRGF0YSA8IFZhbDsgfQorICB9OworCisgIC8vLyBUaGVNYXBwaW5nIC0gVGhpcyBpbXBsaWNpdGx5IHByb3ZpZGVzIGEgbWFwcGluZyBmcm9tIEVsZW1UeSB2YWx1ZXMgdG8gdGhlCisgIC8vLyBFQ1ZhbHVlcywgaXQganVzdCBrZWVwcyB0aGUga2V5IGFzIHBhcnQgb2YgdGhlIHZhbHVlLgorICBzdGQ6OnNldDxFQ1ZhbHVlPiBUaGVNYXBwaW5nOworCitwdWJsaWM6CisgIEVxdWl2YWxlbmNlQ2xhc3NlcygpID0gZGVmYXVsdDsKKyAgRXF1aXZhbGVuY2VDbGFzc2VzKGNvbnN0IEVxdWl2YWxlbmNlQ2xhc3NlcyAmUkhTKSB7CisgICAgb3BlcmF0b3I9KFJIUyk7CisgIH0KKworICBjb25zdCBFcXVpdmFsZW5jZUNsYXNzZXMgJm9wZXJhdG9yPShjb25zdCBFcXVpdmFsZW5jZUNsYXNzZXMgJlJIUykgeworICAgIFRoZU1hcHBpbmcuY2xlYXIoKTsKKyAgICBmb3IgKGl0ZXJhdG9yIEkgPSBSSFMuYmVnaW4oKSwgRSA9IFJIUy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBpZiAoSS0+aXNMZWFkZXIoKSkgeworICAgICAgICBtZW1iZXJfaXRlcmF0b3IgTUkgPSBSSFMubWVtYmVyX2JlZ2luKEkpOworICAgICAgICBtZW1iZXJfaXRlcmF0b3IgTGVhZGVySXQgPSBtZW1iZXJfYmVnaW4oaW5zZXJ0KCpNSSkpOworICAgICAgICBmb3IgKCsrTUk7IE1JICE9IG1lbWJlcl9lbmQoKTsgKytNSSkKKyAgICAgICAgICB1bmlvblNldHMoTGVhZGVySXQsIG1lbWJlcl9iZWdpbihpbnNlcnQoKk1JKSkpOworICAgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnNwZWN0aW9uIG1ldGhvZHMKKyAgLy8KKworICAvLy8gaXRlcmF0b3IqIC0gUHJvdmlkZXMgYSB3YXkgdG8gaXRlcmF0ZSBvdmVyIGFsbCB2YWx1ZXMgaW4gdGhlIHNldC4KKyAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBzdGQ6OnNldDxFQ1ZhbHVlPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBUaGVNYXBwaW5nLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gVGhlTWFwcGluZy5lbmQoKTsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBUaGVNYXBwaW5nLmVtcHR5KCk7IH0KKworICAvLy8gbWVtYmVyXyogSXRlcmF0ZSBvdmVyIHRoZSBtZW1iZXJzIG9mIGFuIGVxdWl2YWxlbmNlIGNsYXNzLgorICBjbGFzcyBtZW1iZXJfaXRlcmF0b3I7CisgIG1lbWJlcl9pdGVyYXRvciBtZW1iZXJfYmVnaW4oaXRlcmF0b3IgSSkgY29uc3QgeworICAgIC8vIE9ubHkgbGVhZGVycyBwcm92aWRlIGFueXRoaW5nIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICByZXR1cm4gbWVtYmVyX2l0ZXJhdG9yKEktPmlzTGVhZGVyKCkgPyAmKkkgOiBudWxscHRyKTsKKyAgfQorICBtZW1iZXJfaXRlcmF0b3IgbWVtYmVyX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWVtYmVyX2l0ZXJhdG9yKG51bGxwdHIpOworICB9CisKKyAgLy8vIGZpbmRWYWx1ZSAtIFJldHVybiBhbiBpdGVyYXRvciB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiAgSWYgaXQgZG9lcyBub3QKKyAgLy8vIGV4aXN0LCBlbmQoKSBpcyByZXR1cm5lZC4KKyAgaXRlcmF0b3IgZmluZFZhbHVlKGNvbnN0IEVsZW1UeSAmVikgY29uc3QgeworICAgIHJldHVybiBUaGVNYXBwaW5nLmZpbmQoVik7CisgIH0KKworICAvLy8gZ2V0TGVhZGVyVmFsdWUgLSBSZXR1cm4gdGhlIGxlYWRlciBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSB0aGF0IGlzIGluIHRoZQorICAvLy8gc2V0LiAgSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIG1ldGhvZCBmb3IgYSB2YWx1ZSB0aGF0IGlzIG5vdCB5ZXQgaW4KKyAgLy8vIHRoZSBzZXQuICBGb3IgdGhhdCwgY2FsbCBnZXRPckluc2VydExlYWRlclZhbHVlKFYpLgorICBjb25zdCBFbGVtVHkgJmdldExlYWRlclZhbHVlKGNvbnN0IEVsZW1UeSAmVikgY29uc3QgeworICAgIG1lbWJlcl9pdGVyYXRvciBNSSA9IGZpbmRMZWFkZXIoVik7CisgICAgYXNzZXJ0KE1JICE9IG1lbWJlcl9lbmQoKSAmJiAiVmFsdWUgaXMgbm90IGluIHRoZSBzZXQhIik7CisgICAgcmV0dXJuICpNSTsKKyAgfQorCisgIC8vLyBnZXRPckluc2VydExlYWRlclZhbHVlIC0gUmV0dXJuIHRoZSBsZWFkZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgdGhhdCBpcworICAvLy8gaW4gdGhlIHNldC4gIElmIHRoZSBtZW1iZXIgaXMgbm90IGluIHRoZSBzZXQsIGl0IGlzIGluc2VydGVkLCB0aGVuCisgIC8vLyByZXR1cm5lZC4KKyAgY29uc3QgRWxlbVR5ICZnZXRPckluc2VydExlYWRlclZhbHVlKGNvbnN0IEVsZW1UeSAmVikgeworICAgIG1lbWJlcl9pdGVyYXRvciBNSSA9IGZpbmRMZWFkZXIoaW5zZXJ0KFYpKTsKKyAgICBhc3NlcnQoTUkgIT0gbWVtYmVyX2VuZCgpICYmICJWYWx1ZSBpcyBub3QgaW4gdGhlIHNldCEiKTsKKyAgICByZXR1cm4gKk1JOworICB9CisKKyAgLy8vIGdldE51bUNsYXNzZXMgLSBSZXR1cm4gdGhlIG51bWJlciBvZiBlcXVpdmFsZW5jZSBjbGFzc2VzIGluIHRoaXMgc2V0LgorICAvLy8gTm90ZSB0aGF0IHRoaXMgaXMgYSBsaW5lYXIgdGltZSBvcGVyYXRpb24uCisgIHVuc2lnbmVkIGdldE51bUNsYXNzZXMoKSBjb25zdCB7CisgICAgdW5zaWduZWQgTkMgPSAwOworICAgIGZvciAoaXRlcmF0b3IgSSA9IGJlZ2luKCksIEUgPSBlbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBpZiAoSS0+aXNMZWFkZXIoKSkgKytOQzsKKyAgICByZXR1cm4gTkM7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTXV0YXRpb24gbWV0aG9kcworCisgIC8vLyBpbnNlcnQgLSBJbnNlcnQgYSBuZXcgdmFsdWUgaW50byB0aGUgdW5pb24vZmluZCBzZXQsIGlnbm9yaW5nIHRoZSByZXF1ZXN0CisgIC8vLyBpZiB0aGUgdmFsdWUgYWxyZWFkeSBleGlzdHMuCisgIGl0ZXJhdG9yIGluc2VydChjb25zdCBFbGVtVHkgJkRhdGEpIHsKKyAgICByZXR1cm4gVGhlTWFwcGluZy5pbnNlcnQoRUNWYWx1ZShEYXRhKSkuZmlyc3Q7CisgIH0KKworICAvLy8gZmluZExlYWRlciAtIEdpdmVuIGEgdmFsdWUgaW4gdGhlIHNldCwgcmV0dXJuIGEgbWVtYmVyIGl0ZXJhdG9yIGZvciB0aGUKKyAgLy8vIGVxdWl2YWxlbmNlIGNsYXNzIGl0IGlzIGluLiAgVGhpcyBkb2VzIHRoZSBwYXRoLWNvbXByZXNzaW9uIHBhcnQgdGhhdAorICAvLy8gbWFrZXMgdW5pb24tZmluZCAidW5pb24gZmluZHkiLiAgVGhpcyByZXR1cm5zIGFuIGVuZCBpdGVyYXRvciBpZiB0aGUgdmFsdWUKKyAgLy8vIGlzIG5vdCBpbiB0aGUgZXF1aXZhbGVuY2UgY2xhc3MuCisgIG1lbWJlcl9pdGVyYXRvciBmaW5kTGVhZGVyKGl0ZXJhdG9yIEkpIGNvbnN0IHsKKyAgICBpZiAoSSA9PSBUaGVNYXBwaW5nLmVuZCgpKSByZXR1cm4gbWVtYmVyX2VuZCgpOworICAgIHJldHVybiBtZW1iZXJfaXRlcmF0b3IoSS0+Z2V0TGVhZGVyKCkpOworICB9CisgIG1lbWJlcl9pdGVyYXRvciBmaW5kTGVhZGVyKGNvbnN0IEVsZW1UeSAmVikgY29uc3QgeworICAgIHJldHVybiBmaW5kTGVhZGVyKFRoZU1hcHBpbmcuZmluZChWKSk7CisgIH0KKworICAvLy8gdW5pb24gLSBNZXJnZSB0aGUgdHdvIGVxdWl2YWxlbmNlIHNldHMgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWVzLCBpbnNlcnRpbmcKKyAgLy8vIHRoZW0gaWYgdGhleSBkbyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgZXF1aXZhbGVuY2Ugc2V0LgorICBtZW1iZXJfaXRlcmF0b3IgdW5pb25TZXRzKGNvbnN0IEVsZW1UeSAmVjEsIGNvbnN0IEVsZW1UeSAmVjIpIHsKKyAgICBpdGVyYXRvciBWMUkgPSBpbnNlcnQoVjEpLCBWMkkgPSBpbnNlcnQoVjIpOworICAgIHJldHVybiB1bmlvblNldHMoZmluZExlYWRlcihWMUkpLCBmaW5kTGVhZGVyKFYySSkpOworICB9CisgIG1lbWJlcl9pdGVyYXRvciB1bmlvblNldHMobWVtYmVyX2l0ZXJhdG9yIEwxLCBtZW1iZXJfaXRlcmF0b3IgTDIpIHsKKyAgICBhc3NlcnQoTDEgIT0gbWVtYmVyX2VuZCgpICYmIEwyICE9IG1lbWJlcl9lbmQoKSAmJiAiSWxsZWdhbCBpbnB1dHMhIik7CisgICAgaWYgKEwxID09IEwyKSByZXR1cm4gTDE7ICAgLy8gVW5pZnlpbmcgdGhlIHNhbWUgdHdvIHNldHMsIG5vb3AuCisKKyAgICAvLyBPdGhlcndpc2UsIHRoaXMgaXMgYSByZWFsIHVuaW9uIG9wZXJhdGlvbi4gIFNldCB0aGUgZW5kIG9mIHRoZSBMMSBsaXN0IHRvCisgICAgLy8gcG9pbnQgdG8gdGhlIEwyIGxlYWRlciBub2RlLgorICAgIGNvbnN0IEVDVmFsdWUgJkwxTFYgPSAqTDEuTm9kZSwgJkwyTFYgPSAqTDIuTm9kZTsKKyAgICBMMUxWLmdldEVuZE9mTGlzdCgpLT5zZXROZXh0KCZMMkxWKTsKKworICAgIC8vIFVwZGF0ZSBMMUxWJ3MgZW5kIG9mIGxpc3QgcG9pbnRlci4KKyAgICBMMUxWLkxlYWRlciA9IEwyTFYuZ2V0RW5kT2ZMaXN0KCk7CisKKyAgICAvLyBDbGVhciBMMidzIGxlYWRlciBmbGFnOgorICAgIEwyTFYuTmV4dCA9IEwyTFYuZ2V0TmV4dCgpOworCisgICAgLy8gTDIncyBsZWFkZXIgaXMgbm93IEwxLgorICAgIEwyTFYuTGVhZGVyID0gJkwxTFY7CisgICAgcmV0dXJuIEwxOworICB9CisKKyAgLy8gaXNFcXVpdmFsZW50IC0gUmV0dXJuIHRydWUgaWYgVjEgaXMgZXF1aXZhbGVudCB0byBWMi4gVGhpcyBjYW4gaGFwcGVuIGlmCisgIC8vIFYxIGlzIGVxdWFsIHRvIFYyIG9yIGlmIHRoZXkgYmVsb25nIHRvIG9uZSBlcXVpdmFsZW5jZSBjbGFzcy4KKyAgYm9vbCBpc0VxdWl2YWxlbnQoY29uc3QgRWxlbVR5ICZWMSwgY29uc3QgRWxlbVR5ICZWMikgY29uc3QgeworICAgIC8vIEZhc3QgcGF0aDogYW55IGVsZW1lbnQgaXMgZXF1aXZhbGVudCB0byBpdHNlbGYuCisgICAgaWYgKFYxID09IFYyKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgYXV0byBJdCA9IGZpbmRMZWFkZXIoVjEpOworICAgIHJldHVybiBJdCAhPSBtZW1iZXJfZW5kKCkgJiYgSXQgPT0gZmluZExlYWRlcihWMik7CisgIH0KKworICBjbGFzcyBtZW1iZXJfaXRlcmF0b3IgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbGVtVHksIHB0cmRpZmZfdD4geworICAgIGZyaWVuZCBjbGFzcyBFcXVpdmFsZW5jZUNsYXNzZXM7CisKKyAgICB1c2luZyBzdXBlciA9IHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRWxlbVR5LCBwdHJkaWZmX3Q+OworCisgICAgY29uc3QgRUNWYWx1ZSAqTm9kZTsKKworICBwdWJsaWM6CisgICAgdXNpbmcgc2l6ZV90eXBlID0gc2l6ZV90OworICAgIHVzaW5nIHBvaW50ZXIgPSB0eXBlbmFtZSBzdXBlcjo6cG9pbnRlcjsKKyAgICB1c2luZyByZWZlcmVuY2UgPSB0eXBlbmFtZSBzdXBlcjo6cmVmZXJlbmNlOworCisgICAgZXhwbGljaXQgbWVtYmVyX2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IG1lbWJlcl9pdGVyYXRvcihjb25zdCBFQ1ZhbHVlICpOKSA6IE5vZGUoTikge30KKworICAgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgICBhc3NlcnQoTm9kZSAhPSBudWxscHRyICYmICJEZXJlZmVyZW5jaW5nIGVuZCgpISIpOworICAgICAgcmV0dXJuIE5vZGUtPmdldERhdGEoKTsKKyAgICB9CisgICAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJm9wZXJhdG9yKigpOyB9CisKKyAgICBtZW1iZXJfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgICBhc3NlcnQoTm9kZSAhPSBudWxscHRyICYmICIrKydkIG9mZiB0aGUgZW5kIG9mIHRoZSBsaXN0ISIpOworICAgICAgTm9kZSA9IE5vZGUtPmdldE5leHQoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBtZW1iZXJfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgICAgLy8gcG9zdGluY3JlbWVudCBvcGVyYXRvcnMuCisgICAgICBtZW1iZXJfaXRlcmF0b3IgdG1wID0gKnRoaXM7CisgICAgICArKyp0aGlzOworICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgbWVtYmVyX2l0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBOb2RlID09IFJIUy5Ob2RlOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgbWVtYmVyX2l0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBOb2RlICE9IFJIUy5Ob2RlOworICAgIH0KKyAgfTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9FUVVJVkFMRU5DRUNMQVNTRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvRm9sZGluZ1NldC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvRm9sZGluZ1NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNjNlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Gb2xkaW5nU2V0LmgKQEAgLTAsMCArMSw3NjIgQEAKKy8vPT09LSBsbHZtL0FEVC9Gb2xkaW5nU2V0LmggLSBVbmlxdWluZyBIYXNoIFNldCAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBoYXNoIHNldCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlbW92ZSBkdXBsaWNhdGlvbiBvZiBub2RlcworLy8gaW4gYSBncmFwaC4gIFRoaXMgY29kZSB3YXMgb3JpZ2luYWxseSBjcmVhdGVkIGJ5IENocmlzIExhdHRuZXIgZm9yIHVzZSB3aXRoCisvLyBTZWxlY3Rpb25EQUdDU0VNYXAsIGJ1dCB3YXMgaXNvbGF0ZWQgdG8gcHJvdmlkZSB1c2UgYWNyb3NzIHRoZSBsbHZtIGNvZGUgc2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfRk9MRElOR1NFVF9ICisjZGVmaW5lIExMVk1fQURUX0ZPTERJTkdTRVRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUaGlzIGZvbGRpbmcgc2V0IHVzZWQgZm9yIHR3byBwdXJwb3NlczoKKy8vLyAgIDEuIEdpdmVuIGluZm9ybWF0aW9uIGFib3V0IGEgbm9kZSB3ZSB3YW50IHRvIGNyZWF0ZSwgbG9vayB1cCB0aGUgdW5pcXVlCisvLy8gICAgICBpbnN0YW5jZSBvZiB0aGUgbm9kZSBpbiB0aGUgc2V0LiAgSWYgdGhlIG5vZGUgYWxyZWFkeSBleGlzdHMsIHJldHVybgorLy8vICAgICAgaXQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGJ1Y2tldCBpdCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50by4KKy8vLyAgIDIuIEdpdmVuIGEgbm9kZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgcmVtb3ZlIGl0IGZyb20gdGhlIHNldC4KKy8vLworLy8vIFRoaXMgY2xhc3MgaXMgaW1wbGVtZW50ZWQgYXMgYSBzaW5nbGUtbGluayBjaGFpbmVkIGhhc2ggdGFibGUsIHdoZXJlIHRoZQorLy8vICJidWNrZXRzIiBhcmUgYWN0dWFsbHkgdGhlIG5vZGVzIHRoZW1zZWx2ZXMgKHRoZSBuZXh0IHBvaW50ZXIgaXMgaW4gdGhlCisvLy8gbm9kZSkuICBUaGUgbGFzdCBub2RlIHBvaW50cyBiYWNrIHRvIHRoZSBidWNrZXQgdG8gc2ltcGxpZnkgbm9kZSByZW1vdmFsLgorLy8vCisvLy8gQW55IG5vZGUgdGhhdCBpcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZm9sZGluZyBzZXQgbXVzdCBiZSBhIHN1YmNsYXNzIG9mCisvLy8gRm9sZGluZ1NldE5vZGUuICBUaGUgbm9kZSBjbGFzcyBtdXN0IGFsc28gZGVmaW5lIGEgUHJvZmlsZSBtZXRob2QgdXNlZCB0bworLy8vIGVzdGFibGlzaCB0aGUgdW5pcXVlIGJpdHMgb2YgZGF0YSBmb3IgdGhlIG5vZGUuICBUaGUgUHJvZmlsZSBtZXRob2QgaXMKKy8vLyBwYXNzZWQgYSBGb2xkaW5nU2V0Tm9kZUlEIG9iamVjdCB3aGljaCBpcyB1c2VkIHRvIGdhdGhlciB0aGUgYml0cy4gIEp1c3QKKy8vLyBjYWxsIG9uZSBvZiB0aGUgQWRkKiBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgRm9sZGluZ1NldEJhc2U6Ok5vZGVJRCBjbGFzcy4KKy8vLyBOT1RFOiBUaGF0IHRoZSBmb2xkaW5nIHNldCBkb2VzIG5vdCBvd24gdGhlIG5vZGVzIGFuZCBpdCBpcyB0aGUKKy8vLyByZXNwb25zaWJpbGl0eSBvZiB0aGUgdXNlciB0byBkaXNwb3NlIG9mIHRoZSBub2Rlcy4KKy8vLworLy8vIEVnLgorLy8vICAgIGNsYXNzIE15Tm9kZSA6IHB1YmxpYyBGb2xkaW5nU2V0Tm9kZSB7CisvLy8gICAgcHJpdmF0ZToKKy8vLyAgICAgIHN0ZDo6c3RyaW5nIE5hbWU7CisvLy8gICAgICB1bnNpZ25lZCBWYWx1ZTsKKy8vLyAgICBwdWJsaWM6CisvLy8gICAgICBNeU5vZGUoY29uc3QgY2hhciAqTiwgdW5zaWduZWQgVikgOiBOYW1lKE4pLCBWYWx1ZShWKSB7fQorLy8vICAgICAgIC4uLgorLy8vICAgICAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7CisvLy8gICAgICAgIElELkFkZFN0cmluZyhOYW1lKTsKKy8vLyAgICAgICAgSUQuQWRkSW50ZWdlcihWYWx1ZSk7CisvLy8gICAgICB9CisvLy8gICAgICAuLi4KKy8vLyAgICB9OworLy8vCisvLy8gVG8gZGVmaW5lIHRoZSBmb2xkaW5nIHNldCBpdHNlbGYgdXNlIHRoZSBGb2xkaW5nU2V0IHRlbXBsYXRlOworLy8vCisvLy8gRWcuCisvLy8gICAgRm9sZGluZ1NldDxNeU5vZGU+IE15Rm9sZGluZ1NldDsKKy8vLworLy8vIEZvdXIgcHVibGljIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB0byBtYW5pcHVsYXRlIHRoZSBmb2xkaW5nIHNldDsKKy8vLworLy8vIDEpIElmIHlvdSBoYXZlIGFuIGV4aXN0aW5nIG5vZGUgdGhhdCB5b3Ugd2FudCBhZGQgdG8gdGhlIHNldCBidXQgdW5zdXJlCisvLy8gdGhhdCB0aGUgbm9kZSBtaWdodCBhbHJlYWR5IGV4aXN0IHRoZW4gY2FsbDsKKy8vLworLy8vICAgIE15Tm9kZSAqTSA9IE15Rm9sZGluZ1NldC5HZXRPckluc2VydE5vZGUoTik7CisvLy8KKy8vLyBJZiBUaGUgcmVzdWx0IGlzIGVxdWFsIHRvIHRoZSBpbnB1dCB0aGVuIHRoZSBub2RlIGhhcyBiZWVuIGluc2VydGVkLgorLy8vIE90aGVyd2lzZSwgdGhlIHJlc3VsdCBpcyB0aGUgbm9kZSBleGlzdGluZyBpbiB0aGUgZm9sZGluZyBzZXQsIGFuZCB0aGUKKy8vLyBpbnB1dCBjYW4gYmUgZGlzY2FyZGVkICh1c2UgdGhlIHJlc3VsdCBpbnN0ZWFkLikKKy8vLworLy8vIDIpIElmIHlvdSBhcmUgcmVhZHkgdG8gY29uc3RydWN0IGEgbm9kZSBidXQgd2FudCB0byBjaGVjayBpZiBpdCBhbHJlYWR5CisvLy8gZXhpc3RzLCB0aGVuIGNhbGwgRmluZE5vZGVPckluc2VydFBvcyB3aXRoIGEgRm9sZGluZ1NldE5vZGVJRCBvZiB0aGUgYml0cyB0bworLy8vIGNoZWNrOworLy8vCisvLy8gICBGb2xkaW5nU2V0Tm9kZUlEIElEOworLy8vICAgSUQuQWRkU3RyaW5nKE5hbWUpOworLy8vICAgSUQuQWRkSW50ZWdlcihWYWx1ZSk7CisvLy8gICB2b2lkICpJbnNlcnRQb2ludDsKKy8vLworLy8vICAgIE15Tm9kZSAqTSA9IE15Rm9sZGluZ1NldC5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJbnNlcnRQb2ludCk7CisvLy8KKy8vLyBJZiBmb3VuZCB0aGVuIE0gd2l0aCBiZSBub24tTlVMTCwgZWxzZSBJbnNlcnRQb2ludCB3aWxsIHBvaW50IHRvIHdoZXJlIGl0CisvLy8gc2hvdWxkIGJlIGluc2VydGVkIHVzaW5nIEluc2VydE5vZGUuCisvLy8KKy8vLyAzKSBJZiB5b3UgZ2V0IGEgTlVMTCByZXN1bHQgZnJvbSBGaW5kTm9kZU9ySW5zZXJ0UG9zIHRoZW4geW91IGNhbiBhcyBhIG5ldworLy8vIG5vZGUgd2l0aCBGaW5kTm9kZU9ySW5zZXJ0UG9zOworLy8vCisvLy8gICAgSW5zZXJ0Tm9kZShOLCBJbnNlcnRQb2ludCk7CisvLy8KKy8vLyA0KSBGaW5hbGx5LCBpZiB5b3Ugd2FudCB0byByZW1vdmUgYSBub2RlIGZyb20gdGhlIGZvbGRpbmcgc2V0IGNhbGw7CisvLy8KKy8vLyAgICBib29sIFdhc1JlbW92ZWQgPSBSZW1vdmVOb2RlKE4pOworLy8vCisvLy8gVGhlIHJlc3VsdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgbm9kZSBleGlzdGVkIGluIHRoZSBmb2xkaW5nIHNldC4KKworY2xhc3MgRm9sZGluZ1NldE5vZGVJRDsKK2NsYXNzIFN0cmluZ1JlZjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBGb2xkaW5nU2V0QmFzZSAtIEltcGxlbWVudHMgdGhlIGZvbGRpbmcgc2V0IGZ1bmN0aW9uYWxpdHkuICBUaGUgbWFpbgorLy8vIHN0cnVjdHVyZSBpcyBhbiBhcnJheSBvZiBidWNrZXRzLiAgRWFjaCBidWNrZXQgaXMgaW5kZXhlZCBieSB0aGUgaGFzaCBvZgorLy8vIHRoZSBub2RlcyBpdCBjb250YWlucy4gIFRoZSBidWNrZXQgaXRzZWxmIHBvaW50cyB0byB0aGUgbm9kZXMgY29udGFpbmVkCisvLy8gaW4gdGhlIGJ1Y2tldCB2aWEgYSBzaW5nbHkgbGlua2VkIGxpc3QuICBUaGUgbGFzdCBub2RlIGluIHRoZSBsaXN0IHBvaW50cworLy8vIGJhY2sgdG8gdGhlIGJ1Y2tldCB0byBmYWNpbGl0YXRlIG5vZGUgcmVtb3ZhbC4KKy8vLworY2xhc3MgRm9sZGluZ1NldEJhc2UgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7IC8vIE91dCBvZiBsaW5lIHZpcnR1YWwgbWV0aG9kLgorCitwcm90ZWN0ZWQ6CisgIC8vLyBCdWNrZXRzIC0gQXJyYXkgb2YgYnVja2V0IGNoYWlucy4KKyAgdm9pZCAqKkJ1Y2tldHM7CisKKyAgLy8vIE51bUJ1Y2tldHMgLSBMZW5ndGggb2YgdGhlIEJ1Y2tldHMgYXJyYXkuICBBbHdheXMgYSBwb3dlciBvZiAyLgorICB1bnNpZ25lZCBOdW1CdWNrZXRzOworCisgIC8vLyBOdW1Ob2RlcyAtIE51bWJlciBvZiBub2RlcyBpbiB0aGUgZm9sZGluZyBzZXQuIEdyb3d0aCBvY2N1cnMgd2hlbiBOdW1Ob2RlcworICAvLy8gaXMgZ3JlYXRlciB0aGFuIHR3aWNlIHRoZSBudW1iZXIgb2YgYnVja2V0cy4KKyAgdW5zaWduZWQgTnVtTm9kZXM7CisKKyAgZXhwbGljaXQgRm9sZGluZ1NldEJhc2UodW5zaWduZWQgTG9nMkluaXRTaXplID0gNik7CisgIEZvbGRpbmdTZXRCYXNlKEZvbGRpbmdTZXRCYXNlICYmQXJnKTsKKyAgRm9sZGluZ1NldEJhc2UgJm9wZXJhdG9yPShGb2xkaW5nU2V0QmFzZSAmJlJIUyk7CisgIH5Gb2xkaW5nU2V0QmFzZSgpOworCitwdWJsaWM6CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gTm9kZSAtIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBtYWludGFpbiB0aGUgc2luZ2x5IGxpbmtlZCBidWNrZXQgbGlzdCBpbgorICAvLy8gYSBmb2xkaW5nIHNldC4KKyAgY2xhc3MgTm9kZSB7CisgIHByaXZhdGU6CisgICAgLy8gTmV4dEluRm9sZGluZ1NldEJ1Y2tldCAtIG5leHQgbGluayBpbiB0aGUgYnVja2V0IGxpc3QuCisgICAgdm9pZCAqTmV4dEluRm9sZGluZ1NldEJ1Y2tldCA9IG51bGxwdHI7CisKKyAgcHVibGljOgorICAgIE5vZGUoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBBY2Nlc3NvcnMKKyAgICB2b2lkICpnZXROZXh0SW5CdWNrZXQoKSBjb25zdCB7IHJldHVybiBOZXh0SW5Gb2xkaW5nU2V0QnVja2V0OyB9CisgICAgdm9pZCBTZXROZXh0SW5CdWNrZXQodm9pZCAqTikgeyBOZXh0SW5Gb2xkaW5nU2V0QnVja2V0ID0gTjsgfQorICB9OworCisgIC8vLyBjbGVhciAtIFJlbW92ZSBhbGwgbm9kZXMgZnJvbSB0aGUgZm9sZGluZyBzZXQuCisgIHZvaWQgY2xlYXIoKTsKKworICAvLy8gc2l6ZSAtIFJldHVybnMgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgZm9sZGluZyBzZXQuCisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBOdW1Ob2RlczsgfQorCisgIC8vLyBlbXB0eSAtIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gbm9kZXMgaW4gdGhlIGZvbGRpbmcgc2V0LgorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gTnVtTm9kZXMgPT0gMDsgfQorCisgIC8vLyByZXNlcnZlIC0gSW5jcmVhc2UgdGhlIG51bWJlciBvZiBidWNrZXRzIHN1Y2ggdGhhdCBhZGRpbmcgdGhlCisgIC8vLyBFbHRDb3VudC10aCBub2RlIHdvbid0IGNhdXNlIGEgcmVidWNrZXQgb3BlcmF0aW9uLiByZXNlcnZlIGlzIHBlcm1pdHRlZAorICAvLy8gdG8gYWxsb2NhdGUgbW9yZSBzcGFjZSB0aGFuIHJlcXVlc3RlZCBieSBFbHRDb3VudC4KKyAgdm9pZCByZXNlcnZlKHVuc2lnbmVkIEVsdENvdW50KTsKKworICAvLy8gY2FwYWNpdHkgLSBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9kZXMgcGVybWl0dGVkIGluIHRoZSBmb2xkaW5nIHNldAorICAvLy8gYmVmb3JlIGEgcmVidWNrZXQgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC4KKyAgdW5zaWduZWQgY2FwYWNpdHkoKSB7CisgICAgLy8gV2UgYWxsb3cgYSBsb2FkIGZhY3RvciBvZiB1cCB0byAyLjAsCisgICAgLy8gc28gdGhhdCBtZWFucyBvdXIgY2FwYWNpdHkgaXMgTnVtQnVja2V0cyAqIDIKKyAgICByZXR1cm4gTnVtQnVja2V0cyAqIDI7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIEdyb3dIYXNoVGFibGUgLSBEb3VibGUgdGhlIHNpemUgb2YgdGhlIGhhc2ggdGFibGUgYW5kIHJlaGFzaCBldmVyeXRoaW5nLgorICB2b2lkIEdyb3dIYXNoVGFibGUoKTsKKworICAvLy8gR3Jvd0J1Y2tldENvdW50IC0gcmVzaXplIHRoZSBoYXNoIHRhYmxlIGFuZCByZWhhc2ggZXZlcnl0aGluZy4KKyAgLy8vIE5ld0J1Y2tldENvdW50IG11c3QgYmUgYSBwb3dlciBvZiB0d28sIGFuZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgb2xkCisgIC8vLyBidWNrZXQgY291bnQuCisgIHZvaWQgR3Jvd0J1Y2tldENvdW50KHVuc2lnbmVkIE5ld0J1Y2tldENvdW50KTsKKworcHJvdGVjdGVkOgorICAvLy8gR2V0Tm9kZVByb2ZpbGUgLSBJbnN0YW50aWF0aW9ucyBvZiB0aGUgRm9sZGluZ1NldCB0ZW1wbGF0ZSBpbXBsZW1lbnQKKyAgLy8vIHRoaXMgZnVuY3Rpb24gdG8gZ2F0aGVyIGRhdGEgYml0cyBmb3IgdGhlIGdpdmVuIG5vZGUuCisgIHZpcnR1YWwgdm9pZCBHZXROb2RlUHJvZmlsZShOb2RlICpOLCBGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3QgPSAwOworCisgIC8vLyBOb2RlRXF1YWxzIC0gSW5zdGFudGlhdGlvbnMgb2YgdGhlIEZvbGRpbmdTZXQgdGVtcGxhdGUgaW1wbGVtZW50CisgIC8vLyB0aGlzIGZ1bmN0aW9uIHRvIGNvbXBhcmUgdGhlIGdpdmVuIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gSUQuCisgIHZpcnR1YWwgYm9vbCBOb2RlRXF1YWxzKE5vZGUgKk4sIGNvbnN0IEZvbGRpbmdTZXROb2RlSUQgJklELCB1bnNpZ25lZCBJREhhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbGRpbmdTZXROb2RlSUQgJlRlbXBJRCkgY29uc3Q9MDsKKworICAvLy8gQ29tcHV0ZU5vZGVIYXNoIC0gSW5zdGFudGlhdGlvbnMgb2YgdGhlIEZvbGRpbmdTZXQgdGVtcGxhdGUgaW1wbGVtZW50CisgIC8vLyB0aGlzIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYSBoYXNoIHZhbHVlIGZvciB0aGUgZ2l2ZW4gbm9kZS4KKyAgdmlydHVhbCB1bnNpZ25lZCBDb21wdXRlTm9kZUhhc2goTm9kZSAqTiwgRm9sZGluZ1NldE5vZGVJRCAmVGVtcElEKSBjb25zdCA9IDA7CisKKyAgLy8gVGhlIGJlbG93IG1ldGhvZHMgYXJlIHByb3RlY3RlZCB0byBlbmNvdXJhZ2Ugc3ViY2xhc3NlcyB0byBwcm92aWRlIGEgbW9yZQorICAvLyB0eXBlLXNhZmUgQVBJLgorCisgIC8vLyBSZW1vdmVOb2RlIC0gUmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSBmb2xkaW5nIHNldCwgcmV0dXJuaW5nIHRydWUgaWYgb25lCisgIC8vLyB3YXMgcmVtb3ZlZCBvciBmYWxzZSBpZiB0aGUgbm9kZSB3YXMgbm90IGluIHRoZSBmb2xkaW5nIHNldC4KKyAgYm9vbCBSZW1vdmVOb2RlKE5vZGUgKk4pOworCisgIC8vLyBHZXRPckluc2VydE5vZGUgLSBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBzaW1wbGUgTm9kZSBleGFjdGx5CisgIC8vLyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIG5vZGUsIHJldHVybiBpdC4gIE90aGVyd2lzZSwgaW5zZXJ0ICdOJyBhbmQgcmV0dXJuCisgIC8vLyBpdCBpbnN0ZWFkLgorICBOb2RlICpHZXRPckluc2VydE5vZGUoTm9kZSAqTik7CisKKyAgLy8vIEZpbmROb2RlT3JJbnNlcnRQb3MgLSBMb29rIHVwIHRoZSBub2RlIHNwZWNpZmllZCBieSBJRC4gIElmIGl0IGV4aXN0cywKKyAgLy8vIHJldHVybiBpdC4gIElmIG5vdCwgcmV0dXJuIHRoZSBpbnNlcnRpb24gdG9rZW4gdGhhdCB3aWxsIG1ha2UgaW5zZXJ0aW9uCisgIC8vLyBmYXN0ZXIuCisgIE5vZGUgKkZpbmROb2RlT3JJbnNlcnRQb3MoY29uc3QgRm9sZGluZ1NldE5vZGVJRCAmSUQsIHZvaWQgKiZJbnNlcnRQb3MpOworCisgIC8vLyBJbnNlcnROb2RlIC0gSW5zZXJ0IHRoZSBzcGVjaWZpZWQgbm9kZSBpbnRvIHRoZSBmb2xkaW5nIHNldCwga25vd2luZyB0aGF0CisgIC8vLyBpdCBpcyBub3QgYWxyZWFkeSBpbiB0aGUgZm9sZGluZyBzZXQuICBJbnNlcnRQb3MgbXVzdCBiZSBvYnRhaW5lZCBmcm9tCisgIC8vLyBGaW5kTm9kZU9ySW5zZXJ0UG9zLgorICB2b2lkIEluc2VydE5vZGUoTm9kZSAqTiwgdm9pZCAqSW5zZXJ0UG9zKTsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBEZWZhdWx0Rm9sZGluZ1NldFRyYWl0IC0gVGhpcyBjbGFzcyBwcm92aWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucworLy8vIGZvciBGb2xkaW5nU2V0VHJhaXQgaW1wbGVtZW50YXRpb25zLgordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IERlZmF1bHRGb2xkaW5nU2V0VHJhaXQgeworICBzdGF0aWMgdm9pZCBQcm9maWxlKGNvbnN0IFQgJlgsIEZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgWC5Qcm9maWxlKElEKTsKKyAgfQorICBzdGF0aWMgdm9pZCBQcm9maWxlKFQgJlgsIEZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgWC5Qcm9maWxlKElEKTsKKyAgfQorCisgIC8vIEVxdWFscyAtIFRlc3QgaWYgdGhlIHByb2ZpbGUgZm9yIFggd291bGQgbWF0Y2ggSUQsIHVzaW5nIFRlbXBJRAorICAvLyB0byBjb21wdXRlIGEgdGVtcG9yYXJ5IElEIGlmIG5lY2Vzc2FyeS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgLy8ganVzdCBjYWxscyBQcm9maWxlIGFuZCBkb2VzIGEgcmVndWxhciBjb21wYXJpc29uLiBJbXBsZW1lbnRhdGlvbnMKKyAgLy8gY2FuIG92ZXJyaWRlIHRoaXMgdG8gcHJvdmlkZSBtb3JlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbnMuCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBFcXVhbHMoVCAmWCwgY29uc3QgRm9sZGluZ1NldE5vZGVJRCAmSUQsIHVuc2lnbmVkIElESGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xkaW5nU2V0Tm9kZUlEICZUZW1wSUQpOworCisgIC8vIENvbXB1dGVIYXNoIC0gQ29tcHV0ZSBhIGhhc2ggdmFsdWUgZm9yIFgsIHVzaW5nIFRlbXBJRCB0bworICAvLyBjb21wdXRlIGEgdGVtcG9yYXJ5IElEIGlmIG5lY2Vzc2FyeS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgLy8ganVzdCBjYWxscyBQcm9maWxlIGFuZCBkb2VzIGEgcmVndWxhciBoYXNoIGNvbXB1dGF0aW9uLgorICAvLyBJbXBsZW1lbnRhdGlvbnMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gcHJvdmlkZSBtb3JlIGVmZmljaWVudAorICAvLyBpbXBsZW1lbnRhdGlvbnMuCisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgQ29tcHV0ZUhhc2goVCAmWCwgRm9sZGluZ1NldE5vZGVJRCAmVGVtcElEKTsKK307CisKKy8vLyBGb2xkaW5nU2V0VHJhaXQgLSBUaGlzIHRyYWl0IGNsYXNzIGlzIHVzZWQgdG8gZGVmaW5lIGJlaGF2aW9yIG9mIGhvdworLy8vIHRvICJwcm9maWxlIiAoaW4gdGhlIEZvbGRpbmdTZXQgcGFybGFuY2UpIGFuIG9iamVjdCBvZiBhIGdpdmVuIHR5cGUuCisvLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gaW52b2tlIGEgJ1Byb2ZpbGUnIG1ldGhvZCBvbiBhbiBvYmplY3QsIGJ1dAorLy8vIHRocm91Z2ggdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdGhlIGJlaGF2aW9yIGNhbiBiZSB0YWlsb3JlZCBmb3Igc3BlY2lmaWMKKy8vLyB0eXBlcy4gIENvbWJpbmVkIHdpdGggdGhlIEZvbGRpbmdTZXROb2RlV3JhcHBlciBjbGFzcywgb25lIGNhbiBhZGQgb2JqZWN0cworLy8vIHRvIEZvbGRpbmdTZXRzIHRoYXQgd2VyZSBub3Qgb3JpZ2luYWxseSBkZXNpZ25lZCB0byBoYXZlIHRoYXQgYmVoYXZpb3IuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgRm9sZGluZ1NldFRyYWl0CisgIDogcHVibGljIERlZmF1bHRGb2xkaW5nU2V0VHJhaXQ8VD4ge307CisKKy8vLyBEZWZhdWx0Q29udGV4dHVhbEZvbGRpbmdTZXRUcmFpdCAtIExpa2UgRGVmYXVsdEZvbGRpbmdTZXRUcmFpdCwgYnV0CisvLy8gZm9yIENvbnRleHR1YWxGb2xkaW5nU2V0cy4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEN0eD4KK3N0cnVjdCBEZWZhdWx0Q29udGV4dHVhbEZvbGRpbmdTZXRUcmFpdCB7CisgIHN0YXRpYyB2b2lkIFByb2ZpbGUoVCAmWCwgRm9sZGluZ1NldE5vZGVJRCAmSUQsIEN0eCBDb250ZXh0KSB7CisgICAgWC5Qcm9maWxlKElELCBDb250ZXh0KTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBFcXVhbHMoVCAmWCwgY29uc3QgRm9sZGluZ1NldE5vZGVJRCAmSUQsIHVuc2lnbmVkIElESGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xkaW5nU2V0Tm9kZUlEICZUZW1wSUQsIEN0eCBDb250ZXh0KTsKKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBDb21wdXRlSGFzaChUICZYLCBGb2xkaW5nU2V0Tm9kZUlEICZUZW1wSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3R4IENvbnRleHQpOworfTsKKworLy8vIENvbnRleHR1YWxGb2xkaW5nU2V0VHJhaXQgLSBMaWtlIEZvbGRpbmdTZXRUcmFpdCwgYnV0IGZvcgorLy8vIENvbnRleHR1YWxGb2xkaW5nU2V0cy4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEN0eD4gc3RydWN0IENvbnRleHR1YWxGb2xkaW5nU2V0VHJhaXQKKyAgOiBwdWJsaWMgRGVmYXVsdENvbnRleHR1YWxGb2xkaW5nU2V0VHJhaXQ8VCwgQ3R4PiB7fTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRm9sZGluZ1NldE5vZGVJRFJlZiAtIFRoaXMgY2xhc3MgZGVzY3JpYmVzIGEgcmVmZXJlbmNlIHRvIGFuIGludGVybmVkCisvLy8gRm9sZGluZ1NldE5vZGVJRCwgd2hpY2ggY2FuIGJlIGEgdXNlZnVsIHRvIHN0b3JlIG5vZGUgaWQgZGF0YSByYXRoZXIKKy8vLyB0aGFuIHVzaW5nIHBsYWluIEZvbGRpbmdTZXROb2RlSURzLCBzaW5jZSB0aGUgMzItZWxlbWVudCBTbWFsbFZlY3RvcgorLy8vIGlzIG9mdGVuIG11Y2ggbGFyZ2VyIHRoYW4gbmVjZXNzYXJ5LCBhbmQgdGhlIHBvc3NpYmlsaXR5IG9mIGhlYXAKKy8vLyBhbGxvY2F0aW9uIG1lYW5zIGl0IHJlcXVpcmVzIGEgbm9uLXRyaXZpYWwgZGVzdHJ1Y3RvciBjYWxsLgorY2xhc3MgRm9sZGluZ1NldE5vZGVJRFJlZiB7CisgIGNvbnN0IHVuc2lnbmVkICpEYXRhID0gbnVsbHB0cjsKKyAgc2l6ZV90IFNpemUgPSAwOworCitwdWJsaWM6CisgIEZvbGRpbmdTZXROb2RlSURSZWYoKSA9IGRlZmF1bHQ7CisgIEZvbGRpbmdTZXROb2RlSURSZWYoY29uc3QgdW5zaWduZWQgKkQsIHNpemVfdCBTKSA6IERhdGEoRCksIFNpemUoUykge30KKworICAvLy8gQ29tcHV0ZUhhc2ggLSBDb21wdXRlIGEgc3Ryb25nIGhhc2ggdmFsdWUgZm9yIHRoaXMgRm9sZGluZ1NldE5vZGVJRFJlZiwKKyAgLy8vIHVzZWQgdG8gbG9va3VwIHRoZSBub2RlIGluIHRoZSBGb2xkaW5nU2V0QmFzZS4KKyAgdW5zaWduZWQgQ29tcHV0ZUhhc2goKSBjb25zdDsKKworICBib29sIG9wZXJhdG9yPT0oRm9sZGluZ1NldE5vZGVJRFJlZikgY29uc3Q7CisKKyAgYm9vbCBvcGVyYXRvciE9KEZvbGRpbmdTZXROb2RlSURSZWYgUkhTKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IFJIUyk7IH0KKworICAvLy8gVXNlZCB0byBjb21wYXJlIHRoZSAib3JkZXJpbmciIG9mIHR3byBub2RlcyBhcyBkZWZpbmVkIGJ5IHRoZQorICAvLy8gcHJvZmlsZWQgYml0cyBhbmQgdGhlaXIgb3JkZXJpbmcgZGVmaW5lZCBieSBtZW1jbXAoKS4KKyAgYm9vbCBvcGVyYXRvcjwoRm9sZGluZ1NldE5vZGVJRFJlZikgY29uc3Q7CisKKyAgY29uc3QgdW5zaWduZWQgKmdldERhdGEoKSBjb25zdCB7IHJldHVybiBEYXRhOyB9CisgIHNpemVfdCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRm9sZGluZ1NldE5vZGVJRCAtIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBnYXRoZXIgYWxsIHRoZSB1bmlxdWUgZGF0YSBiaXRzIG9mCisvLy8gYSBub2RlLiAgV2hlbiBhbGwgdGhlIGJpdHMgYXJlIGdhdGhlcmVkIHRoaXMgY2xhc3MgaXMgdXNlZCB0byBwcm9kdWNlIGEKKy8vLyBoYXNoIHZhbHVlIGZvciB0aGUgbm9kZS4KK2NsYXNzIEZvbGRpbmdTZXROb2RlSUQgeworICAvLy8gQml0cyAtIFZlY3RvciBvZiBhbGwgdGhlIGRhdGEgYml0cyB0aGF0IG1ha2UgdGhlIG5vZGUgdW5pcXVlLgorICAvLy8gVXNlIGEgU21hbGxWZWN0b3IgdG8gYXZvaWQgYSBoZWFwIGFsbG9jYXRpb24gaW4gdGhlIGNvbW1vbiBjYXNlLgorICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMzI+IEJpdHM7CisKK3B1YmxpYzoKKyAgRm9sZGluZ1NldE5vZGVJRCgpID0gZGVmYXVsdDsKKworICBGb2xkaW5nU2V0Tm9kZUlEKEZvbGRpbmdTZXROb2RlSURSZWYgUmVmKQorICAgIDogQml0cyhSZWYuZ2V0RGF0YSgpLCBSZWYuZ2V0RGF0YSgpICsgUmVmLmdldFNpemUoKSkge30KKworICAvLy8gQWRkKiAtIEFkZCB2YXJpb3VzIGRhdGEgdHlwZXMgdG8gQml0IGRhdGEuCisgIHZvaWQgQWRkUG9pbnRlcihjb25zdCB2b2lkICpQdHIpOworICB2b2lkIEFkZEludGVnZXIoc2lnbmVkIEkpOworICB2b2lkIEFkZEludGVnZXIodW5zaWduZWQgSSk7CisgIHZvaWQgQWRkSW50ZWdlcihsb25nIEkpOworICB2b2lkIEFkZEludGVnZXIodW5zaWduZWQgbG9uZyBJKTsKKyAgdm9pZCBBZGRJbnRlZ2VyKGxvbmcgbG9uZyBJKTsKKyAgdm9pZCBBZGRJbnRlZ2VyKHVuc2lnbmVkIGxvbmcgbG9uZyBJKTsKKyAgdm9pZCBBZGRCb29sZWFuKGJvb2wgQikgeyBBZGRJbnRlZ2VyKEIgPyAxVSA6IDBVKTsgfQorICB2b2lkIEFkZFN0cmluZyhTdHJpbmdSZWYgU3RyaW5nKTsKKyAgdm9pZCBBZGROb2RlSUQoY29uc3QgRm9sZGluZ1NldE5vZGVJRCAmSUQpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgdm9pZCBBZGQoY29uc3QgVCAmeCkgeyBGb2xkaW5nU2V0VHJhaXQ8VD46OlByb2ZpbGUoeCwgKnRoaXMpOyB9CisKKyAgLy8vIGNsZWFyIC0gQ2xlYXIgdGhlIGFjY3VtdWxhdGVkIHByb2ZpbGUsIGFsbG93aW5nIHRoaXMgRm9sZGluZ1NldE5vZGVJRAorICAvLy8gb2JqZWN0IHRvIGJlIHVzZWQgdG8gY29tcHV0ZSBhIG5ldyBwcm9maWxlLgorICBpbmxpbmUgdm9pZCBjbGVhcigpIHsgQml0cy5jbGVhcigpOyB9CisKKyAgLy8vIENvbXB1dGVIYXNoIC0gQ29tcHV0ZSBhIHN0cm9uZyBoYXNoIHZhbHVlIGZvciB0aGlzIEZvbGRpbmdTZXROb2RlSUQsIHVzZWQKKyAgLy8vIHRvIGxvb2t1cCB0aGUgbm9kZSBpbiB0aGUgRm9sZGluZ1NldEJhc2UuCisgIHVuc2lnbmVkIENvbXB1dGVIYXNoKCkgY29uc3Q7CisKKyAgLy8vIG9wZXJhdG9yPT0gLSBVc2VkIHRvIGNvbXBhcmUgdHdvIG5vZGVzIHRvIGVhY2ggb3RoZXIuCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZSSFMpIGNvbnN0OworICBib29sIG9wZXJhdG9yPT0oY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBSSFMpIGNvbnN0OworCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZSSFMpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gUkhTKTsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBSSFMpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT1SSFMpO30KKworICAvLy8gVXNlZCB0byBjb21wYXJlIHRoZSAib3JkZXJpbmciIG9mIHR3byBub2RlcyBhcyBkZWZpbmVkIGJ5IHRoZQorICAvLy8gcHJvZmlsZWQgYml0cyBhbmQgdGhlaXIgb3JkZXJpbmcgZGVmaW5lZCBieSBtZW1jbXAoKS4KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRm9sZGluZ1NldE5vZGVJRCAmUkhTKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBSSFMpIGNvbnN0OworCisgIC8vLyBJbnRlcm4gLSBDb3B5IHRoaXMgbm9kZSdzIGRhdGEgdG8gYSBtZW1vcnkgcmVnaW9uIGFsbG9jYXRlZCBmcm9tIHRoZQorICAvLy8gZ2l2ZW4gYWxsb2NhdG9yIGFuZCByZXR1cm4gYSBGb2xkaW5nU2V0Tm9kZUlEUmVmIGRlc2NyaWJpbmcgdGhlCisgIC8vLyBpbnRlcm5lZCBkYXRhLgorICBGb2xkaW5nU2V0Tm9kZUlEUmVmIEludGVybihCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IpIGNvbnN0OworfTsKKworLy8gQ29udmVuaWVuY2UgdHlwZSB0byBoaWRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZm9sZGluZyBzZXQuCit1c2luZyBGb2xkaW5nU2V0Tm9kZSA9IEZvbGRpbmdTZXRCYXNlOjpOb2RlOwordGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9sZGluZ1NldEl0ZXJhdG9yOwordGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9yOworCisvLyBEZWZpbml0aW9ucyBvZiBGb2xkaW5nU2V0VHJhaXQgYW5kIENvbnRleHR1YWxGb2xkaW5nU2V0VHJhaXQgZnVuY3Rpb25zLCB3aGljaAorLy8gcmVxdWlyZSB0aGUgZGVmaW5pdGlvbiBvZiBGb2xkaW5nU2V0Tm9kZUlELgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2lubGluZSBib29sCitEZWZhdWx0Rm9sZGluZ1NldFRyYWl0PFQ+OjpFcXVhbHMoVCAmWCwgY29uc3QgRm9sZGluZ1NldE5vZGVJRCAmSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgLypJREhhc2gqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xkaW5nU2V0Tm9kZUlEICZUZW1wSUQpIHsKKyAgRm9sZGluZ1NldFRyYWl0PFQ+OjpQcm9maWxlKFgsIFRlbXBJRCk7CisgIHJldHVybiBUZW1wSUQgPT0gSUQ7Cit9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIHVuc2lnbmVkCitEZWZhdWx0Rm9sZGluZ1NldFRyYWl0PFQ+OjpDb21wdXRlSGFzaChUICZYLCBGb2xkaW5nU2V0Tm9kZUlEICZUZW1wSUQpIHsKKyAgRm9sZGluZ1NldFRyYWl0PFQ+OjpQcm9maWxlKFgsIFRlbXBJRCk7CisgIHJldHVybiBUZW1wSUQuQ29tcHV0ZUhhc2goKTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEN0eD4KK2lubGluZSBib29sCitEZWZhdWx0Q29udGV4dHVhbEZvbGRpbmdTZXRUcmFpdDxULCBDdHg+OjpFcXVhbHMoVCAmWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAvKklESGFzaCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbGRpbmdTZXROb2RlSUQgJlRlbXBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdHggQ29udGV4dCkgeworICBDb250ZXh0dWFsRm9sZGluZ1NldFRyYWl0PFQsIEN0eD46OlByb2ZpbGUoWCwgVGVtcElELCBDb250ZXh0KTsKKyAgcmV0dXJuIFRlbXBJRCA9PSBJRDsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEN0eD4KK2lubGluZSB1bnNpZ25lZAorRGVmYXVsdENvbnRleHR1YWxGb2xkaW5nU2V0VHJhaXQ8VCwgQ3R4Pjo6Q29tcHV0ZUhhc2goVCAmWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbGRpbmdTZXROb2RlSUQgJlRlbXBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0eCBDb250ZXh0KSB7CisgIENvbnRleHR1YWxGb2xkaW5nU2V0VHJhaXQ8VCwgQ3R4Pjo6UHJvZmlsZShYLCBUZW1wSUQsIENvbnRleHQpOworICByZXR1cm4gVGVtcElELkNvbXB1dGVIYXNoKCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRm9sZGluZ1NldEltcGwgLSBBbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgdGhhdCBsZXRzIHVzIHNoYXJlIGNvZGUgYmV0d2VlbgorLy8vIEZvbGRpbmdTZXQgYW5kIENvbnRleHR1YWxGb2xkaW5nU2V0LgordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIEZvbGRpbmdTZXRJbXBsIDogcHVibGljIEZvbGRpbmdTZXRCYXNlIHsKK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgRm9sZGluZ1NldEltcGwodW5zaWduZWQgTG9nMkluaXRTaXplKQorICAgICAgOiBGb2xkaW5nU2V0QmFzZShMb2cySW5pdFNpemUpIHt9CisKKyAgRm9sZGluZ1NldEltcGwoRm9sZGluZ1NldEltcGwgJiZBcmcpID0gZGVmYXVsdDsKKyAgRm9sZGluZ1NldEltcGwgJm9wZXJhdG9yPShGb2xkaW5nU2V0SW1wbCAmJlJIUykgPSBkZWZhdWx0OworICB+Rm9sZGluZ1NldEltcGwoKSA9IGRlZmF1bHQ7CisKK3B1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3IgPSBGb2xkaW5nU2V0SXRlcmF0b3I8VD47CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBpdGVyYXRvcihCdWNrZXRzKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcihCdWNrZXRzK051bUJ1Y2tldHMpOyB9CisKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBGb2xkaW5nU2V0SXRlcmF0b3I8Y29uc3QgVD47CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihCdWNrZXRzKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihCdWNrZXRzK051bUJ1Y2tldHMpOyB9CisKKyAgdXNpbmcgYnVja2V0X2l0ZXJhdG9yID0gRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9yPFQ+OworCisgIGJ1Y2tldF9pdGVyYXRvciBidWNrZXRfYmVnaW4odW5zaWduZWQgaGFzaCkgeworICAgIHJldHVybiBidWNrZXRfaXRlcmF0b3IoQnVja2V0cyArIChoYXNoICYgKE51bUJ1Y2tldHMtMSkpKTsKKyAgfQorCisgIGJ1Y2tldF9pdGVyYXRvciBidWNrZXRfZW5kKHVuc2lnbmVkIGhhc2gpIHsKKyAgICByZXR1cm4gYnVja2V0X2l0ZXJhdG9yKEJ1Y2tldHMgKyAoaGFzaCAmIChOdW1CdWNrZXRzLTEpKSwgdHJ1ZSk7CisgIH0KKworICAvLy8gUmVtb3ZlTm9kZSAtIFJlbW92ZSBhIG5vZGUgZnJvbSB0aGUgZm9sZGluZyBzZXQsIHJldHVybmluZyB0cnVlIGlmIG9uZQorICAvLy8gd2FzIHJlbW92ZWQgb3IgZmFsc2UgaWYgdGhlIG5vZGUgd2FzIG5vdCBpbiB0aGUgZm9sZGluZyBzZXQuCisgIGJvb2wgUmVtb3ZlTm9kZShUICpOKSB7IHJldHVybiBGb2xkaW5nU2V0QmFzZTo6UmVtb3ZlTm9kZShOKTsgfQorCisgIC8vLyBHZXRPckluc2VydE5vZGUgLSBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBzaW1wbGUgTm9kZSBleGFjdGx5CisgIC8vLyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIG5vZGUsIHJldHVybiBpdC4gIE90aGVyd2lzZSwgaW5zZXJ0ICdOJyBhbmQKKyAgLy8vIHJldHVybiBpdCBpbnN0ZWFkLgorICBUICpHZXRPckluc2VydE5vZGUoVCAqTikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KEZvbGRpbmdTZXRCYXNlOjpHZXRPckluc2VydE5vZGUoTikpOworICB9CisKKyAgLy8vIEZpbmROb2RlT3JJbnNlcnRQb3MgLSBMb29rIHVwIHRoZSBub2RlIHNwZWNpZmllZCBieSBJRC4gIElmIGl0IGV4aXN0cywKKyAgLy8vIHJldHVybiBpdC4gIElmIG5vdCwgcmV0dXJuIHRoZSBpbnNlcnRpb24gdG9rZW4gdGhhdCB3aWxsIG1ha2UgaW5zZXJ0aW9uCisgIC8vLyBmYXN0ZXIuCisgIFQgKkZpbmROb2RlT3JJbnNlcnRQb3MoY29uc3QgRm9sZGluZ1NldE5vZGVJRCAmSUQsIHZvaWQgKiZJbnNlcnRQb3MpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPihGb2xkaW5nU2V0QmFzZTo6RmluZE5vZGVPckluc2VydFBvcyhJRCwgSW5zZXJ0UG9zKSk7CisgIH0KKworICAvLy8gSW5zZXJ0Tm9kZSAtIEluc2VydCB0aGUgc3BlY2lmaWVkIG5vZGUgaW50byB0aGUgZm9sZGluZyBzZXQsIGtub3dpbmcgdGhhdAorICAvLy8gaXQgaXMgbm90IGFscmVhZHkgaW4gdGhlIGZvbGRpbmcgc2V0LiAgSW5zZXJ0UG9zIG11c3QgYmUgb2J0YWluZWQgZnJvbQorICAvLy8gRmluZE5vZGVPckluc2VydFBvcy4KKyAgdm9pZCBJbnNlcnROb2RlKFQgKk4sIHZvaWQgKkluc2VydFBvcykgeworICAgIEZvbGRpbmdTZXRCYXNlOjpJbnNlcnROb2RlKE4sIEluc2VydFBvcyk7CisgIH0KKworICAvLy8gSW5zZXJ0Tm9kZSAtIEluc2VydCB0aGUgc3BlY2lmaWVkIG5vZGUgaW50byB0aGUgZm9sZGluZyBzZXQsIGtub3dpbmcgdGhhdAorICAvLy8gaXQgaXMgbm90IGFscmVhZHkgaW4gdGhlIGZvbGRpbmcgc2V0LgorICB2b2lkIEluc2VydE5vZGUoVCAqTikgeworICAgIFQgKkluc2VydGVkID0gR2V0T3JJbnNlcnROb2RlKE4pOworICAgICh2b2lkKUluc2VydGVkOworICAgIGFzc2VydChJbnNlcnRlZCA9PSBOICYmICJOb2RlIGFscmVhZHkgaW5zZXJ0ZWQhIik7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRm9sZGluZ1NldCAtIFRoaXMgdGVtcGxhdGUgY2xhc3MgaXMgdXNlZCB0byBpbnN0YW50aWF0ZSBhIHNwZWNpYWxpemVkCisvLy8gaW1wbGVtZW50YXRpb24gb2YgdGhlIGZvbGRpbmcgc2V0IHRvIHRoZSBub2RlIGNsYXNzIFQuICBUIG11c3QgYmUgYQorLy8vIHN1YmNsYXNzIG9mIEZvbGRpbmdTZXROb2RlIGFuZCBpbXBsZW1lbnQgYSBQcm9maWxlIGZ1bmN0aW9uLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgc2V0IHR5cGUgaXMgbW92YWJsZSBhbmQgbW92ZS1hc3NpZ25hYmxlLiBIb3dldmVyLCBpdHMKKy8vLyBtb3ZlZC1mcm9tIHN0YXRlIGlzIG5vdCBhIHZhbGlkIHN0YXRlIGZvciBhbnl0aGluZyBvdGhlciB0aGFuCisvLy8gbW92ZS1hc3NpZ25pbmcgYW5kIGRlc3Ryb3lpbmcuIFRoaXMgaXMgcHJpbWFyaWx5IHRvIGVuYWJsZSBtb3ZhYmxlIEFQSXMKKy8vLyB0aGF0IGluY29ycG9yYXRlIHRoZXNlIG9iamVjdHMuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgRm9sZGluZ1NldCBmaW5hbCA6IHB1YmxpYyBGb2xkaW5nU2V0SW1wbDxUPiB7CisgIHVzaW5nIFN1cGVyID0gRm9sZGluZ1NldEltcGw8VD47CisgIHVzaW5nIE5vZGUgPSB0eXBlbmFtZSBTdXBlcjo6Tm9kZTsKKworICAvLy8gR2V0Tm9kZVByb2ZpbGUgLSBFYWNoIGluc3RhbnRpYXRhdGlvbiBvZiB0aGUgRm9sZGluZ1NldCBuZWVkcyB0byBwcm92aWRlIGEKKyAgLy8vIHdheSB0byBjb252ZXJ0IG5vZGVzIGludG8gYSB1bmlxdWUgc3BlY2lmaWVyLgorICB2b2lkIEdldE5vZGVQcm9maWxlKE5vZGUgKk4sIEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCBvdmVycmlkZSB7CisgICAgVCAqVE4gPSBzdGF0aWNfY2FzdDxUICo+KE4pOworICAgIEZvbGRpbmdTZXRUcmFpdDxUPjo6UHJvZmlsZSgqVE4sIElEKTsKKyAgfQorCisgIC8vLyBOb2RlRXF1YWxzIC0gSW5zdGFudGlhdGlvbnMgbWF5IG9wdGlvbmFsbHkgcHJvdmlkZSBhIHdheSB0byBjb21wYXJlIGEKKyAgLy8vIG5vZGUgd2l0aCBhIHNwZWNpZmllZCBJRC4KKyAgYm9vbCBOb2RlRXF1YWxzKE5vZGUgKk4sIGNvbnN0IEZvbGRpbmdTZXROb2RlSUQgJklELCB1bnNpZ25lZCBJREhhc2gsCisgICAgICAgICAgICAgICAgICBGb2xkaW5nU2V0Tm9kZUlEICZUZW1wSUQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBUICpUTiA9IHN0YXRpY19jYXN0PFQgKj4oTik7CisgICAgcmV0dXJuIEZvbGRpbmdTZXRUcmFpdDxUPjo6RXF1YWxzKCpUTiwgSUQsIElESGFzaCwgVGVtcElEKTsKKyAgfQorCisgIC8vLyBDb21wdXRlTm9kZUhhc2ggLSBJbnN0YW50aWF0aW9ucyBtYXkgb3B0aW9uYWxseSBwcm92aWRlIGEgd2F5IHRvIGNvbXB1dGUgYQorICAvLy8gaGFzaCB2YWx1ZSBkaXJlY3RseSBmcm9tIGEgbm9kZS4KKyAgdW5zaWduZWQgQ29tcHV0ZU5vZGVIYXNoKE5vZGUgKk4sIEZvbGRpbmdTZXROb2RlSUQgJlRlbXBJRCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIFQgKlROID0gc3RhdGljX2Nhc3Q8VCAqPihOKTsKKyAgICByZXR1cm4gRm9sZGluZ1NldFRyYWl0PFQ+OjpDb21wdXRlSGFzaCgqVE4sIFRlbXBJRCk7CisgIH0KKworcHVibGljOgorICBleHBsaWNpdCBGb2xkaW5nU2V0KHVuc2lnbmVkIExvZzJJbml0U2l6ZSA9IDYpIDogU3VwZXIoTG9nMkluaXRTaXplKSB7fQorICBGb2xkaW5nU2V0KEZvbGRpbmdTZXQgJiZBcmcpID0gZGVmYXVsdDsKKyAgRm9sZGluZ1NldCAmb3BlcmF0b3I9KEZvbGRpbmdTZXQgJiZSSFMpID0gZGVmYXVsdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQ29udGV4dHVhbEZvbGRpbmdTZXQgLSBUaGlzIHRlbXBsYXRlIGNsYXNzIGlzIGEgZnVydGhlciByZWZpbmVtZW50CisvLy8gb2YgRm9sZGluZ1NldCB3aGljaCBwcm92aWRlcyBhIGNvbnRleHQgYXJndW1lbnQgd2hlbiBjYWxsaW5nCisvLy8gUHJvZmlsZSBvbiBpdHMgbm9kZXMuICBDdXJyZW50bHksIHRoYXQgYXJndW1lbnQgaXMgZml4ZWQgYXQKKy8vLyBpbml0aWFsaXphdGlvbiB0aW1lLgorLy8vCisvLy8gVCBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgRm9sZGluZ1NldE5vZGUgYW5kIGltcGxlbWVudCBhIFByb2ZpbGUKKy8vLyBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZQorLy8vICAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJiwgQ3R4KTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDdHg+CitjbGFzcyBDb250ZXh0dWFsRm9sZGluZ1NldCBmaW5hbCA6IHB1YmxpYyBGb2xkaW5nU2V0SW1wbDxUPiB7CisgIC8vIFVuZm9ydHVuYXRlbHksIHRoaXMgY2FuJ3QgZGVyaXZlIGZyb20gRm9sZGluZ1NldDxUPiBiZWNhdXNlIHRoZQorICAvLyBjb25zdHJ1Y3Rpb24gb2YgdGhlIHZ0YWJsZSBmb3IgRm9sZGluZ1NldDxUPiByZXF1aXJlcworICAvLyBGb2xkaW5nU2V0PFQ+OjpHZXROb2RlUHJvZmlsZSB0byBiZSBpbnN0YW50aWF0ZWQsIHdoaWNoIGluIHR1cm4KKyAgLy8gcmVxdWlyZXMgYSBzaW5nbGUtYXJndW1lbnQgVDo6UHJvZmlsZSgpLgorCisgIHVzaW5nIFN1cGVyID0gRm9sZGluZ1NldEltcGw8VD47CisgIHVzaW5nIE5vZGUgPSB0eXBlbmFtZSBTdXBlcjo6Tm9kZTsKKworICBDdHggQ29udGV4dDsKKworICAvLy8gR2V0Tm9kZVByb2ZpbGUgLSBFYWNoIGluc3RhbnRpYXRhdGlvbiBvZiB0aGUgRm9sZGluZ1NldCBuZWVkcyB0byBwcm92aWRlIGEKKyAgLy8vIHdheSB0byBjb252ZXJ0IG5vZGVzIGludG8gYSB1bmlxdWUgc3BlY2lmaWVyLgorICB2b2lkIEdldE5vZGVQcm9maWxlKE5vZGUgKk4sIEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCBvdmVycmlkZSB7CisgICAgVCAqVE4gPSBzdGF0aWNfY2FzdDxUICo+KE4pOworICAgIENvbnRleHR1YWxGb2xkaW5nU2V0VHJhaXQ8VCwgQ3R4Pjo6UHJvZmlsZSgqVE4sIElELCBDb250ZXh0KTsKKyAgfQorCisgIGJvb2wgTm9kZUVxdWFscyhOb2RlICpOLCBjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCwgdW5zaWduZWQgSURIYXNoLAorICAgICAgICAgICAgICAgICAgRm9sZGluZ1NldE5vZGVJRCAmVGVtcElEKSBjb25zdCBvdmVycmlkZSB7CisgICAgVCAqVE4gPSBzdGF0aWNfY2FzdDxUICo+KE4pOworICAgIHJldHVybiBDb250ZXh0dWFsRm9sZGluZ1NldFRyYWl0PFQsIEN0eD46OkVxdWFscygqVE4sIElELCBJREhhc2gsIFRlbXBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCk7CisgIH0KKworICB1bnNpZ25lZCBDb21wdXRlTm9kZUhhc2goTm9kZSAqTiwgRm9sZGluZ1NldE5vZGVJRCAmVGVtcElEKSBjb25zdCBvdmVycmlkZSB7CisgICAgVCAqVE4gPSBzdGF0aWNfY2FzdDxUICo+KE4pOworICAgIHJldHVybiBDb250ZXh0dWFsRm9sZGluZ1NldFRyYWl0PFQsIEN0eD46OkNvbXB1dGVIYXNoKCpUTiwgVGVtcElELCBDb250ZXh0KTsKKyAgfQorCitwdWJsaWM6CisgIGV4cGxpY2l0IENvbnRleHR1YWxGb2xkaW5nU2V0KEN0eCBDb250ZXh0LCB1bnNpZ25lZCBMb2cySW5pdFNpemUgPSA2KQorICAgICAgOiBTdXBlcihMb2cySW5pdFNpemUpLCBDb250ZXh0KENvbnRleHQpIHt9CisKKyAgQ3R4IGdldENvbnRleHQoKSBjb25zdCB7IHJldHVybiBDb250ZXh0OyB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEZvbGRpbmdTZXRWZWN0b3IgLSBUaGlzIHRlbXBsYXRlIGNsYXNzIGNvbWJpbmVzIGEgRm9sZGluZ1NldCBhbmQgYSB2ZWN0b3IKKy8vLyB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2Ugb2YgRm9sZGluZ1NldCBidXQgd2l0aCBkZXRlcm1pbmlzdGljIGl0ZXJhdGlvbgorLy8vIG9yZGVyIGJhc2VkIG9uIHRoZSBpbnNlcnRpb24gb3JkZXIuIFQgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIEZvbGRpbmdTZXROb2RlCisvLy8gYW5kIGltcGxlbWVudCBhIFByb2ZpbGUgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVmVjdG9yVCA9IFNtYWxsVmVjdG9yPFQqLCA4Pj4KK2NsYXNzIEZvbGRpbmdTZXRWZWN0b3IgeworICBGb2xkaW5nU2V0PFQ+IFNldDsKKyAgVmVjdG9yVCBWZWN0b3I7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgRm9sZGluZ1NldFZlY3Rvcih1bnNpZ25lZCBMb2cySW5pdFNpemUgPSA2KSA6IFNldChMb2cySW5pdFNpemUpIHt9CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBwb2ludGVlX2l0ZXJhdG9yPHR5cGVuYW1lIFZlY3RvclQ6Oml0ZXJhdG9yPjsKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIFZlY3Rvci5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpICAgeyByZXR1cm4gVmVjdG9yLmVuZCgpOyB9CisKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBwb2ludGVlX2l0ZXJhdG9yPHR5cGVuYW1lIFZlY3RvclQ6OmNvbnN0X2l0ZXJhdG9yPjsKKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFZlY3Rvci5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpICAgY29uc3QgeyByZXR1cm4gVmVjdG9yLmVuZCgpOyB9CisKKyAgLy8vIGNsZWFyIC0gUmVtb3ZlIGFsbCBub2RlcyBmcm9tIHRoZSBmb2xkaW5nIHNldC4KKyAgdm9pZCBjbGVhcigpIHsgU2V0LmNsZWFyKCk7IFZlY3Rvci5jbGVhcigpOyB9CisKKyAgLy8vIEZpbmROb2RlT3JJbnNlcnRQb3MgLSBMb29rIHVwIHRoZSBub2RlIHNwZWNpZmllZCBieSBJRC4gIElmIGl0IGV4aXN0cywKKyAgLy8vIHJldHVybiBpdC4gIElmIG5vdCwgcmV0dXJuIHRoZSBpbnNlcnRpb24gdG9rZW4gdGhhdCB3aWxsIG1ha2UgaW5zZXJ0aW9uCisgIC8vLyBmYXN0ZXIuCisgIFQgKkZpbmROb2RlT3JJbnNlcnRQb3MoY29uc3QgRm9sZGluZ1NldE5vZGVJRCAmSUQsIHZvaWQgKiZJbnNlcnRQb3MpIHsKKyAgICByZXR1cm4gU2V0LkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIEluc2VydFBvcyk7CisgIH0KKworICAvLy8gR2V0T3JJbnNlcnROb2RlIC0gSWYgdGhlcmUgaXMgYW4gZXhpc3Rpbmcgc2ltcGxlIE5vZGUgZXhhY3RseQorICAvLy8gZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBub2RlLCByZXR1cm4gaXQuICBPdGhlcndpc2UsIGluc2VydCAnTicgYW5kCisgIC8vLyByZXR1cm4gaXQgaW5zdGVhZC4KKyAgVCAqR2V0T3JJbnNlcnROb2RlKFQgKk4pIHsKKyAgICBUICpSZXN1bHQgPSBTZXQuR2V0T3JJbnNlcnROb2RlKE4pOworICAgIGlmIChSZXN1bHQgPT0gTikgVmVjdG9yLnB1c2hfYmFjayhOKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgLy8vIEluc2VydE5vZGUgLSBJbnNlcnQgdGhlIHNwZWNpZmllZCBub2RlIGludG8gdGhlIGZvbGRpbmcgc2V0LCBrbm93aW5nIHRoYXQKKyAgLy8vIGl0IGlzIG5vdCBhbHJlYWR5IGluIHRoZSBmb2xkaW5nIHNldC4gIEluc2VydFBvcyBtdXN0IGJlIG9idGFpbmVkIGZyb20KKyAgLy8vIEZpbmROb2RlT3JJbnNlcnRQb3MuCisgIHZvaWQgSW5zZXJ0Tm9kZShUICpOLCB2b2lkICpJbnNlcnRQb3MpIHsKKyAgICBTZXQuSW5zZXJ0Tm9kZShOLCBJbnNlcnRQb3MpOworICAgIFZlY3Rvci5wdXNoX2JhY2soTik7CisgIH0KKworICAvLy8gSW5zZXJ0Tm9kZSAtIEluc2VydCB0aGUgc3BlY2lmaWVkIG5vZGUgaW50byB0aGUgZm9sZGluZyBzZXQsIGtub3dpbmcgdGhhdAorICAvLy8gaXQgaXMgbm90IGFscmVhZHkgaW4gdGhlIGZvbGRpbmcgc2V0LgorICB2b2lkIEluc2VydE5vZGUoVCAqTikgeworICAgIFNldC5JbnNlcnROb2RlKE4pOworICAgIFZlY3Rvci5wdXNoX2JhY2soTik7CisgIH0KKworICAvLy8gc2l6ZSAtIFJldHVybnMgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgZm9sZGluZyBzZXQuCisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBTZXQuc2l6ZSgpOyB9CisKKyAgLy8vIGVtcHR5IC0gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBubyBub2RlcyBpbiB0aGUgZm9sZGluZyBzZXQuCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBTZXQuZW1wdHkoKTsgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBGb2xkaW5nU2V0SXRlcmF0b3JJbXBsIC0gVGhpcyBpcyB0aGUgY29tbW9uIGl0ZXJhdG9yIHN1cHBvcnQgc2hhcmVkIGJ5IGFsbAorLy8vIGZvbGRpbmcgc2V0cywgd2hpY2gga25vd3MgaG93IHRvIHdhbGsgdGhlIGZvbGRpbmcgc2V0IGhhc2ggdGFibGUuCitjbGFzcyBGb2xkaW5nU2V0SXRlcmF0b3JJbXBsIHsKK3Byb3RlY3RlZDoKKyAgRm9sZGluZ1NldE5vZGUgKk5vZGVQdHI7CisKKyAgRm9sZGluZ1NldEl0ZXJhdG9ySW1wbCh2b2lkICoqQnVja2V0KTsKKworICB2b2lkIGFkdmFuY2UoKTsKKworcHVibGljOgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgRm9sZGluZ1NldEl0ZXJhdG9ySW1wbCAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIE5vZGVQdHIgPT0gUkhTLk5vZGVQdHI7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZvbGRpbmdTZXRJdGVyYXRvckltcGwgJlJIUykgY29uc3QgeworICAgIHJldHVybiBOb2RlUHRyICE9IFJIUy5Ob2RlUHRyOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgRm9sZGluZ1NldEl0ZXJhdG9yIDogcHVibGljIEZvbGRpbmdTZXRJdGVyYXRvckltcGwgeworcHVibGljOgorICBleHBsaWNpdCBGb2xkaW5nU2V0SXRlcmF0b3Iodm9pZCAqKkJ1Y2tldCkgOiBGb2xkaW5nU2V0SXRlcmF0b3JJbXBsKEJ1Y2tldCkge30KKworICBUICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxUKj4oTm9kZVB0cik7CisgIH0KKworICBUICpvcGVyYXRvci0+KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUKj4oTm9kZVB0cik7CisgIH0KKworICBpbmxpbmUgRm9sZGluZ1NldEl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeyAgICAgICAgICAvLyBQcmVpbmNyZW1lbnQKKyAgICBhZHZhbmNlKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEZvbGRpbmdTZXRJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAgICAgICAgLy8gUG9zdGluY3JlbWVudAorICAgIEZvbGRpbmdTZXRJdGVyYXRvciB0bXAgPSAqdGhpczsgKysqdGhpczsgcmV0dXJuIHRtcDsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBGb2xkaW5nU2V0QnVja2V0SXRlcmF0b3JJbXBsIC0gVGhpcyBpcyB0aGUgY29tbW9uIGJ1Y2tldCBpdGVyYXRvciBzdXBwb3J0CisvLy8gc2hhcmVkIGJ5IGFsbCBmb2xkaW5nIHNldHMsIHdoaWNoIGtub3dzIGhvdyB0byB3YWxrIGEgcGFydGljdWxhciBidWNrZXQKKy8vLyBvZiBhIGZvbGRpbmcgc2V0IGhhc2ggdGFibGUuCitjbGFzcyBGb2xkaW5nU2V0QnVja2V0SXRlcmF0b3JJbXBsIHsKK3Byb3RlY3RlZDoKKyAgdm9pZCAqUHRyOworCisgIGV4cGxpY2l0IEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvckltcGwodm9pZCAqKkJ1Y2tldCk7CisKKyAgRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9ySW1wbCh2b2lkICoqQnVja2V0LCBib29sKSA6IFB0cihCdWNrZXQpIHt9CisKKyAgdm9pZCBhZHZhbmNlKCkgeworICAgIHZvaWQgKlByb2JlID0gc3RhdGljX2Nhc3Q8Rm9sZGluZ1NldE5vZGUqPihQdHIpLT5nZXROZXh0SW5CdWNrZXQoKTsKKyAgICB1aW50cHRyX3QgeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihQcm9iZSkgJiB+MHgxOworICAgIFB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHgpOworICB9CisKK3B1YmxpYzoKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvckltcGwgJlJIUykgY29uc3QgeworICAgIHJldHVybiBQdHIgPT0gUkhTLlB0cjsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9ySW1wbCAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFB0ciAhPSBSSFMuUHRyOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NsYXNzIEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvciA6IHB1YmxpYyBGb2xkaW5nU2V0QnVja2V0SXRlcmF0b3JJbXBsIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9yKHZvaWQgKipCdWNrZXQpIDoKKyAgICBGb2xkaW5nU2V0QnVja2V0SXRlcmF0b3JJbXBsKEJ1Y2tldCkge30KKworICBGb2xkaW5nU2V0QnVja2V0SXRlcmF0b3Iodm9pZCAqKkJ1Y2tldCwgYm9vbCkgOgorICAgIEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvckltcGwoQnVja2V0LCB0cnVlKSB7fQorCisgIFQgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpzdGF0aWNfY2FzdDxUKj4oUHRyKTsgfQorICBUICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KFB0cik7IH0KKworICBpbmxpbmUgRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeyAvLyBQcmVpbmNyZW1lbnQKKyAgICBhZHZhbmNlKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAgICAgIC8vIFBvc3RpbmNyZW1lbnQKKyAgICBGb2xkaW5nU2V0QnVja2V0SXRlcmF0b3IgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRm9sZGluZ1NldE5vZGVXcmFwcGVyIC0gVGhpcyB0ZW1wbGF0ZSBjbGFzcyBpcyB1c2VkIHRvICJ3cmFwIiBhcmJpdHJhcnkKKy8vLyB0eXBlcyBpbiBhbiBlbmNsb3Npbmcgb2JqZWN0IHNvIHRoYXQgdGhleSBjYW4gYmUgaW5zZXJ0ZWQgaW50byBGb2xkaW5nU2V0cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgRm9sZGluZ1NldE5vZGVXcmFwcGVyIDogcHVibGljIEZvbGRpbmdTZXROb2RlIHsKKyAgVCBkYXRhOworCitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUcz4KKyAgZXhwbGljaXQgRm9sZGluZ1NldE5vZGVXcmFwcGVyKFRzICYmLi4uIEFyZ3MpCisgICAgICA6IGRhdGEoc3RkOjpmb3J3YXJkPFRzPihBcmdzKS4uLikge30KKworICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIHsgRm9sZGluZ1NldFRyYWl0PFQ+OjpQcm9maWxlKGRhdGEsIElEKTsgfQorCisgIFQgJmdldFZhbHVlKCkgeyByZXR1cm4gZGF0YTsgfQorICBjb25zdCBUICZnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGRhdGE7IH0KKworICBvcGVyYXRvciBUJigpIHsgcmV0dXJuIGRhdGE7IH0KKyAgb3BlcmF0b3IgY29uc3QgVCYoKSBjb25zdCB7IHJldHVybiBkYXRhOyB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEZhc3RGb2xkaW5nU2V0Tm9kZSAtIFRoaXMgaXMgYSBzdWJjbGFzcyBvZiBGb2xkaW5nU2V0Tm9kZSB3aGljaCBzdG9yZXMKKy8vLyBhIEZvbGRpbmdTZXROb2RlSUQgdmFsdWUgcmF0aGVyIHRoYW4gcmVxdWlyaW5nIHRoZSBub2RlIHRvIHJlY29tcHV0ZSBpdAorLy8vIGVhY2ggdGltZSBpdCBpcyBuZWVkZWQuIFRoaXMgdHJhZGVzIHNwYWNlIGZvciBzcGVlZCAod2hpY2ggY2FuIGJlCisvLy8gc2lnbmlmaWNhbnQgaWYgdGhlIElEIGlzIGxvbmcpLCBhbmQgaXQgYWxzbyBwZXJtaXRzIG5vZGVzIHRvIGRyb3AKKy8vLyBpbmZvcm1hdGlvbiB0aGF0IHdvdWxkIG90aGVyd2lzZSBvbmx5IGJlIHJlcXVpcmVkIGZvciByZWNvbXB1dGluZyBhbiBJRC4KK2NsYXNzIEZhc3RGb2xkaW5nU2V0Tm9kZSA6IHB1YmxpYyBGb2xkaW5nU2V0Tm9kZSB7CisgIEZvbGRpbmdTZXROb2RlSUQgRmFzdElEOworCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEZhc3RGb2xkaW5nU2V0Tm9kZShjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCkgOiBGYXN0SUQoSUQpIHt9CisKK3B1YmxpYzoKKyAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7IElELkFkZE5vZGVJRChGYXN0SUQpOyB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbnMgb2YgRm9sZGluZ1NldFRyYWl0LgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgRm9sZGluZ1NldFRyYWl0PFQqPiB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBQcm9maWxlKFQgKlgsIEZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgSUQuQWRkUG9pbnRlcihYKTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgRm9sZGluZ1NldFRyYWl0PHN0ZDo6cGFpcjxUMSwgVDI+PiB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBQcm9maWxlKGNvbnN0IHN0ZDo6cGFpcjxUMSwgVDI+ICZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIElELkFkZChQLmZpcnN0KTsKKyAgICBJRC5BZGQoUC5zZWNvbmQpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfRk9MRElOR1NFVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9HcmFwaFRyYWl0cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvR3JhcGhUcmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2M2NDdmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvR3JhcGhUcmFpdHMuaApAQCAtMCwwICsxLDEzNiBAQAorLy89PT0tIGxsdm0vQURUL0dyYXBoVHJhaXRzLmggLSBHcmFwaCB0cmFpdHMgdGVtcGxhdGUgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgbGl0dGxlIEdyYXBoVHJhaXRzPFg+IHRlbXBsYXRlIGNsYXNzIHRoYXQgc2hvdWxkIGJlCisvLyBzcGVjaWFsaXplZCBieSBjbGFzc2VzIHRoYXQgd2FudCB0byBiZSBpdGVyYXRhYmxlIGJ5IGdlbmVyaWMgZ3JhcGggaXRlcmF0b3JzLgorLy8KKy8vIFRoaXMgZmlsZSBhbHNvIGRlZmluZXMgdGhlIG1hcmtlciBjbGFzcyBJbnZlcnNlIHRoYXQgaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIKKy8vIGdyYXBocyBpbiBhIGdyYXBoIGRlZmluZWQsIGludmVyc2Ugb3JkZXJpbmcuLi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0dSQVBIVFJBSVRTX0gKKyNkZWZpbmUgTExWTV9BRFRfR1JBUEhUUkFJVFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLyBHcmFwaFRyYWl0cyAtIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHNwZWNpYWxpemVkIGJ5IGRpZmZlcmVudCBncmFwaCB0eXBlcy4uLgorLy8gd2hpY2ggaXMgd2h5IHRoZSBkZWZhdWx0IHZlcnNpb24gaXMgZW1wdHkuCisvLwordGVtcGxhdGU8Y2xhc3MgR3JhcGhUeXBlPgorc3RydWN0IEdyYXBoVHJhaXRzIHsKKyAgLy8gRWxlbWVudHMgdG8gcHJvdmlkZToKKworICAvLyB0eXBlZGVmIE5vZGVSZWYgICAgICAgICAgIC0gVHlwZSBvZiBOb2RlIHRva2VuIGluIHRoZSBncmFwaCwgd2hpY2ggc2hvdWxkCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjaGVhcCB0byBjb3B5LgorICAvLyB0eXBlZGVmIENoaWxkSXRlcmF0b3JUeXBlIC0gVHlwZSB1c2VkIHRvIGl0ZXJhdGUgb3ZlciBjaGlsZHJlbiBpbiBncmFwaCwKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVmZXJlbmNlIHRvIGEgTm9kZVJlZi4KKworICAvLyBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoY29uc3QgR3JhcGhUeXBlICYpCisgIC8vICAgIFJldHVybiB0aGUgZW50cnkgbm9kZSBvZiB0aGUgZ3JhcGgKKworICAvLyBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZikKKyAgLy8gc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZCAgKE5vZGVSZWYpCisgIC8vICAgIFJldHVybiBpdGVyYXRvcnMgdGhhdCBwb2ludCB0byB0aGUgYmVnaW5uaW5nIGFuZCBlbmRpbmcgb2YgdGhlIGNoaWxkCisgIC8vICAgIG5vZGUgbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBub2RlLgorCisgIC8vIHR5cGVkZWYgIC4uLml0ZXJhdG9yIG5vZGVzX2l0ZXJhdG9yOyAtIGRlcmVmZXJlbmNlIHRvIGEgTm9kZVJlZgorICAvLyBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oR3JhcGhUeXBlICpHKQorICAvLyBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kICAoR3JhcGhUeXBlICpHKQorICAvLyAgICBub2Rlc19pdGVyYXRvci9iZWdpbi9lbmQgLSBBbGxvdyBpdGVyYXRpb24gb3ZlciBhbGwgbm9kZXMgaW4gdGhlIGdyYXBoCisKKyAgLy8gdHlwZWRlZiBFZGdlUmVmICAgICAgICAgICAtIFR5cGUgb2YgRWRnZSB0b2tlbiBpbiB0aGUgZ3JhcGgsIHdoaWNoIHNob3VsZAorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2hlYXAgdG8gY29weS4KKyAgLy8gdHlwZWRlZiBDaGlsZEVkZ2VJdGVyYXRvclR5cGUgLSBUeXBlIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIGNoaWxkcmVuIGVkZ2VzIGluCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaCwgZGVyZWZlcmVuY2UgdG8gYSBFZGdlUmVmLgorCisgIC8vIHN0YXRpYyBDaGlsZEVkZ2VJdGVyYXRvclR5cGUgY2hpbGRfZWRnZV9iZWdpbihOb2RlUmVmKQorICAvLyBzdGF0aWMgQ2hpbGRFZGdlSXRlcmF0b3JUeXBlIGNoaWxkX2VkZ2VfZW5kKE5vZGVSZWYpCisgIC8vICAgICBSZXR1cm4gaXRlcmF0b3JzIHRoYXQgcG9pbnQgdG8gdGhlIGJlZ2lubmluZyBhbmQgZW5kaW5nIG9mIHRoZQorICAvLyAgICAgZWRnZSBsaXN0IGZvciB0aGUgZ2l2ZW4gY2FsbGdyYXBoIG5vZGUuCisgIC8vCisgIC8vIHN0YXRpYyBOb2RlUmVmIGVkZ2VfZGVzdChFZGdlUmVmKQorICAvLyAgICAgUmV0dXJuIHRoZSBkZXN0aW5hdGlvbiBub2RlIG9mIGFuIGVkZ2UuCisKKyAgLy8gc3RhdGljIHVuc2lnbmVkICAgICAgIHNpemUgICAgICAgKEdyYXBoVHlwZSAqRykKKyAgLy8gICAgUmV0dXJuIHRvdGFsIG51bWJlciBvZiBub2RlcyBpbiB0aGUgZ3JhcGgKKworICAvLyBJZiBhbnlvbmUgdHJpZXMgdG8gdXNlIHRoaXMgY2xhc3Mgd2l0aG91dCBoYXZpbmcgYW4gYXBwcm9wcmlhdGUKKyAgLy8gc3BlY2lhbGl6YXRpb24sIG1ha2UgYW4gZXJyb3IuICBJZiB5b3UgZ2V0IHRoaXMgZXJyb3IsIGl0J3MgYmVjYXVzZSB5b3UKKyAgLy8gbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBzcGVjaWFsaXphdGlvbiBvZiBHcmFwaFRyYWl0czw+IGZvciB5b3VyCisgIC8vIGdyYXBoLCBvciB5b3UgbmVlZCB0byBkZWZpbmUgaXQgZm9yIGEgbmV3IGdyYXBoIHR5cGUuIEVpdGhlciB0aGF0IG9yCisgIC8vIHlvdXIgYXJndW1lbnQgdG8gWFhYX2JlZ2luKC4uLikgaXMgdW5rbm93biBvciBuZWVkcyB0byBoYXZlIHRoZSBwcm9wZXIgLmgKKyAgLy8gZmlsZSAjaW5jbHVkZSdkLgorICB1c2luZyBOb2RlUmVmID0gdHlwZW5hbWUgR3JhcGhUeXBlOjpVbmtub3duR3JhcGhUeXBlRXJyb3I7Cit9OworCisvLyBJbnZlcnNlIC0gVGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgbGl0dGxlIG1hcmtlciBjbGFzcyB0byB0ZWxsIHRoZSBncmFwaAorLy8gaXRlcmF0b3IgdG8gaXRlcmF0ZSBvdmVyIHRoZSBncmFwaCBpbiBhIGdyYXBoIGRlZmluZWQgIkludmVyc2UiIG9yZGVyaW5nLgorLy8gTm90IGFsbCBncmFwaHMgZGVmaW5lIGFuIGludmVyc2Ugb3JkZXJpbmcsIGFuZCBpZiB0aGV5IGRvLCBpdCBkZXBlbmRzIG9uCisvLyB0aGUgZ3JhcGggZXhhY3RseSB3aGF0IHRoYXQgaXMuICBIZXJlJ3MgYW4gZXhhbXBsZSBvZiB1c2FnZSB3aXRoIHRoZQorLy8gZGZfaXRlcmF0b3I6CisvLworLy8gaWRmX2l0ZXJhdG9yPE1ldGhvZCo+IEkgPSBpZGZfYmVnaW4oTSksIEUgPSBpZGZfZW5kKE0pOworLy8gZm9yICg7IEkgIT0gRTsgKytJKSB7IC4uLiB9CisvLworLy8gV2hpY2ggaXMgZXF1aXZhbGVudCB0bzoKKy8vIGRmX2l0ZXJhdG9yPEludmVyc2U8TWV0aG9kKj4+IEkgPSBpZGZfYmVnaW4oTSksIEUgPSBpZGZfZW5kKE0pOworLy8gZm9yICg7IEkgIT0gRTsgKytJKSB7IC4uLiB9CisvLwordGVtcGxhdGUgPGNsYXNzIEdyYXBoVHlwZT4KK3N0cnVjdCBJbnZlcnNlIHsKKyAgY29uc3QgR3JhcGhUeXBlICZHcmFwaDsKKworICBpbmxpbmUgSW52ZXJzZShjb25zdCBHcmFwaFR5cGUgJkcpIDogR3JhcGgoRykge30KK307CisKKy8vIFByb3ZpZGUgYSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIEdyYXBoVHJhaXRzIHNvIHRoYXQgdGhlIGludmVyc2Ugb2YgYW4KKy8vIGludmVyc2UgZmFsbHMgYmFjayB0byB0aGUgb3JpZ2luYWwgZ3JhcGguCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IEdyYXBoVHJhaXRzPEludmVyc2U8SW52ZXJzZTxUPj4+IDogR3JhcGhUcmFpdHM8VD4ge307CisKKy8vIFByb3ZpZGUgaXRlcmF0b3IgcmFuZ2VzIGZvciB0aGUgZ3JhcGggdHJhaXRzIG5vZGVzIGFuZCBjaGlsZHJlbgordGVtcGxhdGUgPGNsYXNzIEdyYXBoVHlwZT4KK2l0ZXJhdG9yX3JhbmdlPHR5cGVuYW1lIEdyYXBoVHJhaXRzPEdyYXBoVHlwZT46Om5vZGVzX2l0ZXJhdG9yPgorbm9kZXMoY29uc3QgR3JhcGhUeXBlICZHKSB7CisgIHJldHVybiBtYWtlX3JhbmdlKEdyYXBoVHJhaXRzPEdyYXBoVHlwZT46Om5vZGVzX2JlZ2luKEcpLAorICAgICAgICAgICAgICAgICAgICBHcmFwaFRyYWl0czxHcmFwaFR5cGU+Ojpub2Rlc19lbmQoRykpOworfQordGVtcGxhdGUgPGNsYXNzIEdyYXBoVHlwZT4KK2l0ZXJhdG9yX3JhbmdlPHR5cGVuYW1lIEdyYXBoVHJhaXRzPEludmVyc2U8R3JhcGhUeXBlPj46Om5vZGVzX2l0ZXJhdG9yPgoraW52ZXJzZV9ub2Rlcyhjb25zdCBHcmFwaFR5cGUgJkcpIHsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoR3JhcGhUcmFpdHM8SW52ZXJzZTxHcmFwaFR5cGU+Pjo6bm9kZXNfYmVnaW4oRyksCisgICAgICAgICAgICAgICAgICAgIEdyYXBoVHJhaXRzPEludmVyc2U8R3JhcGhUeXBlPj46Om5vZGVzX2VuZChHKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBHcmFwaFR5cGU+CitpdGVyYXRvcl9yYW5nZTx0eXBlbmFtZSBHcmFwaFRyYWl0czxHcmFwaFR5cGU+OjpDaGlsZEl0ZXJhdG9yVHlwZT4KK2NoaWxkcmVuKGNvbnN0IHR5cGVuYW1lIEdyYXBoVHJhaXRzPEdyYXBoVHlwZT46Ok5vZGVSZWYgJkcpIHsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoR3JhcGhUcmFpdHM8R3JhcGhUeXBlPjo6Y2hpbGRfYmVnaW4oRyksCisgICAgICAgICAgICAgICAgICAgIEdyYXBoVHJhaXRzPEdyYXBoVHlwZT46OmNoaWxkX2VuZChHKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBHcmFwaFR5cGU+CitpdGVyYXRvcl9yYW5nZTx0eXBlbmFtZSBHcmFwaFRyYWl0czxJbnZlcnNlPEdyYXBoVHlwZT4+OjpDaGlsZEl0ZXJhdG9yVHlwZT4KK2ludmVyc2VfY2hpbGRyZW4oY29uc3QgdHlwZW5hbWUgR3JhcGhUcmFpdHM8R3JhcGhUeXBlPjo6Tm9kZVJlZiAmRykgeworICByZXR1cm4gbWFrZV9yYW5nZShHcmFwaFRyYWl0czxJbnZlcnNlPEdyYXBoVHlwZT4+OjpjaGlsZF9iZWdpbihHKSwKKyAgICAgICAgICAgICAgICAgICAgR3JhcGhUcmFpdHM8SW52ZXJzZTxHcmFwaFR5cGU+Pjo6Y2hpbGRfZW5kKEcpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEdyYXBoVHlwZT4KK2l0ZXJhdG9yX3JhbmdlPHR5cGVuYW1lIEdyYXBoVHJhaXRzPEdyYXBoVHlwZT46OkNoaWxkRWRnZUl0ZXJhdG9yVHlwZT4KK2NoaWxkcmVuX2VkZ2VzKGNvbnN0IHR5cGVuYW1lIEdyYXBoVHJhaXRzPEdyYXBoVHlwZT46Ok5vZGVSZWYgJkcpIHsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoR3JhcGhUcmFpdHM8R3JhcGhUeXBlPjo6Y2hpbGRfZWRnZV9iZWdpbihHKSwKKyAgICAgICAgICAgICAgICAgICAgR3JhcGhUcmFpdHM8R3JhcGhUeXBlPjo6Y2hpbGRfZWRnZV9lbmQoRykpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfR1JBUEhUUkFJVFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvSGFzaGluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvSGFzaGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYjU3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9IYXNoaW5nLmgKQEAgLTAsMCArMSw2NjEgQEAKKy8vPT09LS0gbGx2bS9BRFQvSGFzaGluZy5oIC0gVXRpbGl0aWVzIGZvciBoYXNoaW5nIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIG5ld2x5IHByb3Bvc2VkIHN0YW5kYXJkIEMrKyBpbnRlcmZhY2VzIGZvciBoYXNoaW5nCisvLyBhcmJpdHJhcnkgZGF0YSBhbmQgYnVpbGRpbmcgaGFzaCBmdW5jdGlvbnMgZm9yIHVzZXItZGVmaW5lZCB0eXBlcy4gVGhpcworLy8gaW50ZXJmYWNlIHdhcyBvcmlnaW5hbGx5IHByb3Bvc2VkIGluIE4zMzMzWzFdIGFuZCBpcyBjdXJyZW50bHkgdW5kZXIgcmV2aWV3CisvLyBmb3IgaW5jbHVzaW9uIGluIGEgZnV0dXJlIFRSIGFuZC9vciBzdGFuZGFyZC4KKy8vCisvLyBUaGUgcHJpbWFyeSBpbnRlcmZhY2VzIHByb3ZpZGUgYXJlIGNvbXByaXNlZCBvZiBvbmUgdHlwZSBhbmQgdGhyZWUgZnVuY3Rpb25zOgorLy8KKy8vICAtLSAnaGFzaF9jb2RlJyBjbGFzcyBpcyBhbiBvcGFxdWUgdHlwZSByZXByZXNlbnRpbmcgdGhlIGhhc2ggY29kZSBmb3Igc29tZQorLy8gICAgIGRhdGEuIEl0IGlzIHRoZSBpbnRlbmRlZCBwcm9kdWN0IG9mIGhhc2hpbmcsIGFuZCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQKKy8vICAgICBoYXNoIHRhYmxlcywgY2hlY2tzdW1taW5nLCBhbmQgb3RoZXIgY29tbW9uIHVzZXMgb2YgaGFzaGVzLiBJdCBpcyBub3QgYW4KKy8vICAgICBpbnRlZ2VyIHR5cGUgKGFsdGhvdWdoIGl0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gb25lKSBiZWNhdXNlIGl0IGlzIHJpc2t5CisvLyAgICAgdG8gYXNzdW1lIG11Y2ggYWJvdXQgdGhlIGludGVybmFscyBvZiBhIGhhc2hfY29kZS4gSW4gcGFydGljdWxhciwgZWFjaAorLy8gICAgIGV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSBoYXMgYSBoaWdoIHByb2JhYmlsaXR5IG9mIHByb2R1Y2luZyBhIGRpZmZlcmVudAorLy8gICAgIGhhc2hfY29kZSBmb3IgYSBnaXZlbiBpbnB1dC4gVGh1cyB0aGVpciB2YWx1ZXMgYXJlIG5vdCBzdGFibGUgdG8gc2F2ZSBvcgorLy8gICAgIHBlcnNpc3QsIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGR1cmluZyB0aGUgZXhlY3V0aW9uIGZvciB0aGUKKy8vICAgICBjb25zdHJ1Y3Rpb24gb2YgaGFzaGluZyBkYXRhc3RydWN0dXJlcy4KKy8vCisvLyAgLS0gJ2hhc2hfdmFsdWUnIGlzIGEgZnVuY3Rpb24gZGVzaWduZWQgdG8gYmUgb3ZlcmxvYWRlZCBmb3IgZWFjaAorLy8gICAgIHVzZXItZGVmaW5lZCB0eXBlIHdoaWNoIHdpc2hlcyB0byBiZSB1c2VkIHdpdGhpbiBhIGhhc2hpbmcgY29udGV4dC4gSXQKKy8vICAgICBzaG91bGQgYmUgb3ZlcmxvYWRlZCB3aXRoaW4gdGhlIHVzZXItZGVmaW5lZCB0eXBlJ3MgbmFtZXNwYWNlIGFuZCBmb3VuZAorLy8gICAgIHZpYSBBREwuIE92ZXJsb2FkcyBmb3IgcHJpbWl0aXZlIHR5cGVzIGFyZSBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkuCisvLworLy8gIC0tICdoYXNoX2NvbWJpbmUnIGFuZCAnaGFzaF9jb21iaW5lX3JhbmdlJyBhcmUgZnVuY3Rpb25zIGRlc2lnbmVkIHRvIGFpZAorLy8gICAgICBwcm9ncmFtbWVycyBpbiBlYXNpbHkgYW5kIGludHVpdGl2ZWx5IGNvbWJpbmluZyBhIHNldCBvZiBkYXRhIGludG8KKy8vICAgICAgYSBzaW5nbGUgaGFzaF9jb2RlIGZvciB0aGVpciBvYmplY3QuIFRoZXkgc2hvdWxkIG9ubHkgbG9naWNhbGx5IGJlIHVzZWQKKy8vICAgICAgd2l0aGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhICdoYXNoX3ZhbHVlJyByb3V0aW5lIG9yIHNpbWlsYXIgY29udGV4dC4KKy8vCisvLyBOb3RlIHRoYXQgJ2hhc2hfY29tYmluZV9yYW5nZScgY29udGFpbnMgdmVyeSBzcGVjaWFsIGxvZ2ljIGZvciBoYXNoaW5nCisvLyBhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgaW50ZWdlcnMgb3IgcG9pbnRlcnMuIFRoaXMgbG9naWMgaXMgKmV4dHJlbWVseSogZmFzdCwKKy8vIG9uIGEgbW9kZXJuIEludGVsICJHYWluZXN0b3duIiBYZW9uIChOZWhhbGVtIHVhcmNoKSBAMi4yIEdIeiwgdGhlc2Ugd2VyZQorLy8gYmVuY2htYXJrZWQgYXQgb3ZlciA2LjUgR2lCL3MgZm9yIGxhcmdlIGtleXMsIGFuZCA8MjAgY3ljbGVzL2hhc2ggZm9yIGtleXMKKy8vIHVuZGVyIDMyLWJ5dGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfSEFTSElOR19ICisjZGVmaW5lIExMVk1fQURUX0hBU0hJTkdfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Ib3N0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1N3YXBCeXRlT3JkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgQW4gb3BhcXVlIG9iamVjdCByZXByZXNlbnRpbmcgYSBoYXNoIGNvZGUuCisvLy8KKy8vLyBUaGlzIG9iamVjdCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgaGFzaGluZyBzb21lIGVudGl0eS4gSXQgaXMgaW50ZW5kZWQgdG8KKy8vLyBiZSB1c2VkIHRvIGltcGxlbWVudCBoYXNodGFibGVzIG9yIG90aGVyIGhhc2hpbmctYmFzZWQgZGF0YSBzdHJ1Y3R1cmVzLgorLy8vIFdoaWxlIGl0IHdyYXBzIGFuZCBleHBvc2VzIGEgbnVtZXJpYyB2YWx1ZSwgdGhpcyB2YWx1ZSBzaG91bGQgbm90IGJlCisvLy8gdHJ1c3RlZCB0byBiZSBzdGFibGUgb3IgcHJlZGljdGFibGUgYWNyb3NzIHByb2Nlc3NlcyBvciBleGVjdXRpb25zLgorLy8vCisvLy8gSW4gb3JkZXIgdG8gb2J0YWluIHRoZSBoYXNoX2NvZGUgZm9yIGFuIG9iamVjdCAneCc6CisvLy8gXGNvZGUKKy8vLyAgIHVzaW5nIGxsdm06Omhhc2hfdmFsdWU7CisvLy8gICBsbHZtOjpoYXNoX2NvZGUgY29kZSA9IGhhc2hfdmFsdWUoeCk7CisvLy8gXGVuZGNvZGUKK2NsYXNzIGhhc2hfY29kZSB7CisgIHNpemVfdCB2YWx1ZTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIERlZmF1bHQgY29uc3RydWN0IGEgaGFzaF9jb2RlLgorICAvLy8gTm90ZSB0aGF0IHRoaXMgbGVhdmVzIHRoZSB2YWx1ZSB1bmluaXRpYWxpemVkLgorICBoYXNoX2NvZGUoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBGb3JtIGEgaGFzaCBjb2RlIGRpcmVjdGx5IGZyb20gYSBudW1lcmljYWwgdmFsdWUuCisgIGhhc2hfY29kZShzaXplX3QgdmFsdWUpIDogdmFsdWUodmFsdWUpIHt9CisKKyAgLy8vIFxicmllZiBDb252ZXJ0IHRoZSBoYXNoIGNvZGUgdG8gaXRzIG51bWVyaWNhbCB2YWx1ZSBmb3IgdXNlLgorICAvKmV4cGxpY2l0Ki8gb3BlcmF0b3Igc2l6ZV90KCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGhhc2hfY29kZSAmbGhzLCBjb25zdCBoYXNoX2NvZGUgJnJocykgeworICAgIHJldHVybiBsaHMudmFsdWUgPT0gcmhzLnZhbHVlOworICB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgaGFzaF9jb2RlICZsaHMsIGNvbnN0IGhhc2hfY29kZSAmcmhzKSB7CisgICAgcmV0dXJuIGxocy52YWx1ZSAhPSByaHMudmFsdWU7CisgIH0KKworICAvLy8gXGJyaWVmIEFsbG93IGEgaGFzaF9jb2RlIHRvIGJlIGRpcmVjdGx5IHJ1biB0aHJvdWdoIGhhc2hfdmFsdWUuCisgIGZyaWVuZCBzaXplX3QgaGFzaF92YWx1ZShjb25zdCBoYXNoX2NvZGUgJmNvZGUpIHsgcmV0dXJuIGNvZGUudmFsdWU7IH0KK307CisKKy8vLyBcYnJpZWYgQ29tcHV0ZSBhIGhhc2hfY29kZSBmb3IgYW55IGludGVnZXIgdmFsdWUuCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBjb21wdXRlIHRoZSBzYW1lIGhhc2hfY29kZSBmb3IKKy8vLyBhIHBhcnRpY3VsYXIgdmFsdWUgd2l0aG91dCByZWdhcmQgdG8gdGhlIHByZS1wcm9tb3Rpb24gdHlwZS4gVGhpcyBpcyBpbgorLy8vIGNvbnRyYXN0IHRvIGhhc2hfY29tYmluZSB3aGljaCBtYXkgcHJvZHVjZSBkaWZmZXJlbnQgaGFzaF9jb2RlcyBmb3IKKy8vLyBkaWZmZXJpbmcgYXJndW1lbnQgdHlwZXMgZXZlbiBpZiB0aGV5IHdvdWxkIGltcGxpY2l0IHByb21vdGUgdG8gYSBjb21tb24KKy8vLyB0eXBlIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZhbHVlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxpc19pbnRlZ3JhbF9vcl9lbnVtPFQ+Ojp2YWx1ZSwgaGFzaF9jb2RlPjo6dHlwZQoraGFzaF92YWx1ZShUIHZhbHVlKTsKKworLy8vIFxicmllZiBDb21wdXRlIGEgaGFzaF9jb2RlIGZvciBhIHBvaW50ZXIncyBhZGRyZXNzLgorLy8vCisvLy8gTi5CLjogVGhpcyBoYXNoZXMgdGhlICphZGRyZXNzKi4gTm90IHRoZSB2YWx1ZSBhbmQgbm90IHRoZSB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGhhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IFQgKnB0cik7CisKKy8vLyBcYnJpZWYgQ29tcHV0ZSBhIGhhc2hfY29kZSBmb3IgYSBwYWlyIG9mIG9iamVjdHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2hhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IHN0ZDo6cGFpcjxULCBVPiAmYXJnKTsKKworLy8vIFxicmllZiBDb21wdXRlIGEgaGFzaF9jb2RlIGZvciBhIHN0YW5kYXJkIHN0cmluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8VD4gJmFyZyk7CisKKworLy8vIFxicmllZiBPdmVycmlkZSB0aGUgZXhlY3V0aW9uIHNlZWQgd2l0aCBhIGZpeGVkIHZhbHVlLgorLy8vCisvLy8gVGhpcyBoYXNoaW5nIGxpYnJhcnkgdXNlcyBhIHBlci1leGVjdXRpb24gc2VlZCBkZXNpZ25lZCB0byBjaGFuZ2Ugb24gZWFjaAorLy8vIHJ1biB3aXRoIGhpZ2ggcHJvYmFiaWxpdHkgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGhhc2ggY29kZXMgYXJlIG5vdAorLy8vIGF0dGFja2FibGUgYW5kIHRvIGVuc3VyZSB0aGF0IG91dHB1dCB3aGljaCBpcyBpbnRlbmRlZCB0byBiZSBzdGFibGUgZG9lcworLy8vIG5vdCByZWx5IG9uIHRoZSBwYXJ0aWN1bGFycyBvZiB0aGUgaGFzaCBjb2RlcyBwcm9kdWNlZC4KKy8vLworLy8vIFRoYXQgc2FpZCwgdGhlcmUgYXJlIHVzZSBjYXNlcyB3aGVyZSBpdCBpcyBpbXBvcnRhbnQgdG8gYmUgYWJsZSB0bworLy8vIHJlcHJvZHVjZSAqZXhhY3RseSogYSBzcGVjaWZpYyBiZWhhdmlvci4gVG8gdGhhdCBlbmQsIHdlIHByb3ZpZGUgYSBmdW5jdGlvbgorLy8vIHdoaWNoIHdpbGwgZm9yY2libHkgc2V0IHRoZSBzZWVkIHRvIGEgZml4ZWQgdmFsdWUuIFRoaXMgbXVzdCBiZSBkb25lIGF0IHRoZQorLy8vIHN0YXJ0IG9mIHRoZSBwcm9ncmFtLCBiZWZvcmUgYW55IGhhc2hlcyBhcmUgY29tcHV0ZWQuIEFsc28sIGl0IGNhbm5vdCBiZQorLy8vIHVuZG9uZS4gVGhpcyBtYWtlcyBpdCB0aHJlYWQtaG9zdGlsZSBhbmQgdmVyeSBoYXJkIHRvIHVzZSBvdXRzaWRlIG9mCisvLy8gaW1tZWRpYXRlbHkgb24gc3RhcnQgb2YgYSBzaW1wbGUgcHJvZ3JhbSBkZXNpZ25lZCBmb3IgcmVwcm9kdWNpYmxlCisvLy8gYmVoYXZpb3IuCit2b2lkIHNldF9maXhlZF9leGVjdXRpb25faGFzaF9zZWVkKHNpemVfdCBmaXhlZF92YWx1ZSk7CisKKworLy8gQWxsIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIGFjdHVhbGx5IGNvbXB1dGluZyB0aGUgdmFyaW91cyBoYXNoCisvLyBjb2RlIHZhbHVlcyBhcmUgaGVsZCB3aXRoaW4gdGhpcyBuYW1lc3BhY2UuIFRoZXNlIHJvdXRpbmVzIGFyZSBpbmNsdWRlZCBpbgorLy8gdGhlIGhlYWRlciBmaWxlIG1haW5seSB0byBhbGxvdyBpbmxpbmluZyBhbmQgY29uc3RhbnQgcHJvcGFnYXRpb24uCituYW1lc3BhY2UgaGFzaGluZyB7CituYW1lc3BhY2UgZGV0YWlsIHsKKworaW5saW5lIHVpbnQ2NF90IGZldGNoNjQoY29uc3QgY2hhciAqcCkgeworICB1aW50NjRfdCByZXN1bHQ7CisgIG1lbWNweSgmcmVzdWx0LCBwLCBzaXplb2YocmVzdWx0KSk7CisgIGlmIChzeXM6OklzQmlnRW5kaWFuSG9zdCkKKyAgICBzeXM6OnN3YXBCeXRlT3JkZXIocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW5saW5lIHVpbnQzMl90IGZldGNoMzIoY29uc3QgY2hhciAqcCkgeworICB1aW50MzJfdCByZXN1bHQ7CisgIG1lbWNweSgmcmVzdWx0LCBwLCBzaXplb2YocmVzdWx0KSk7CisgIGlmIChzeXM6OklzQmlnRW5kaWFuSG9zdCkKKyAgICBzeXM6OnN3YXBCeXRlT3JkZXIocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8vIFNvbWUgcHJpbWVzIGJldHdlZW4gMl42MyBhbmQgMl42NCBmb3IgdmFyaW91cyB1c2VzLgorc3RhdGljIGNvbnN0IHVpbnQ2NF90IGswID0gMHhjM2E1Yzg1Yzk3Y2IzMTI3VUxMOworc3RhdGljIGNvbnN0IHVpbnQ2NF90IGsxID0gMHhiNDkyYjY2ZmJlOThmMjczVUxMOworc3RhdGljIGNvbnN0IHVpbnQ2NF90IGsyID0gMHg5YWUxNmEzYjJmOTA0MDRmVUxMOworc3RhdGljIGNvbnN0IHVpbnQ2NF90IGszID0gMHhjOTQ5ZDdjNzUwOWU2NTU3VUxMOworCisvLy8gXGJyaWVmIEJpdHdpc2UgcmlnaHQgcm90YXRlLgorLy8vIE5vcm1hbGx5IHRoaXMgd2lsbCBjb21waWxlIHRvIGEgc2luZ2xlIGluc3RydWN0aW9uLCBlc3BlY2lhbGx5IGlmIHRoZQorLy8vIHNoaWZ0IGlzIGEgbWFuaWZlc3QgY29uc3RhbnQuCitpbmxpbmUgdWludDY0X3Qgcm90YXRlKHVpbnQ2NF90IHZhbCwgc2l6ZV90IHNoaWZ0KSB7CisgIC8vIEF2b2lkIHNoaWZ0aW5nIGJ5IDY0OiBkb2luZyBzbyB5aWVsZHMgYW4gdW5kZWZpbmVkIHJlc3VsdC4KKyAgcmV0dXJuIHNoaWZ0ID09IDAgPyB2YWwgOiAoKHZhbCA+PiBzaGlmdCkgfCAodmFsIDw8ICg2NCAtIHNoaWZ0KSkpOworfQorCitpbmxpbmUgdWludDY0X3Qgc2hpZnRfbWl4KHVpbnQ2NF90IHZhbCkgeworICByZXR1cm4gdmFsIF4gKHZhbCA+PiA0Nyk7Cit9CisKK2lubGluZSB1aW50NjRfdCBoYXNoXzE2X2J5dGVzKHVpbnQ2NF90IGxvdywgdWludDY0X3QgaGlnaCkgeworICAvLyBNdXJtdXItaW5zcGlyZWQgaGFzaGluZy4KKyAgY29uc3QgdWludDY0X3Qga011bCA9IDB4OWRkZmVhMDhlYjM4MmQ2OVVMTDsKKyAgdWludDY0X3QgYSA9IChsb3cgXiBoaWdoKSAqIGtNdWw7CisgIGEgXj0gKGEgPj4gNDcpOworICB1aW50NjRfdCBiID0gKGhpZ2ggXiBhKSAqIGtNdWw7CisgIGIgXj0gKGIgPj4gNDcpOworICBiICo9IGtNdWw7CisgIHJldHVybiBiOworfQorCitpbmxpbmUgdWludDY0X3QgaGFzaF8xdG8zX2J5dGVzKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4sIHVpbnQ2NF90IHNlZWQpIHsKKyAgdWludDhfdCBhID0gc1swXTsKKyAgdWludDhfdCBiID0gc1tsZW4gPj4gMV07CisgIHVpbnQ4X3QgYyA9IHNbbGVuIC0gMV07CisgIHVpbnQzMl90IHkgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYSkgKyAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGIpIDw8IDgpOworICB1aW50MzJfdCB6ID0gbGVuICsgKHN0YXRpY19jYXN0PHVpbnQzMl90PihjKSA8PCAyKTsKKyAgcmV0dXJuIHNoaWZ0X21peCh5ICogazIgXiB6ICogazMgXiBzZWVkKSAqIGsyOworfQorCitpbmxpbmUgdWludDY0X3QgaGFzaF80dG84X2J5dGVzKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4sIHVpbnQ2NF90IHNlZWQpIHsKKyAgdWludDY0X3QgYSA9IGZldGNoMzIocyk7CisgIHJldHVybiBoYXNoXzE2X2J5dGVzKGxlbiArIChhIDw8IDMpLCBzZWVkIF4gZmV0Y2gzMihzICsgbGVuIC0gNCkpOworfQorCitpbmxpbmUgdWludDY0X3QgaGFzaF85dG8xNl9ieXRlcyhjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuLCB1aW50NjRfdCBzZWVkKSB7CisgIHVpbnQ2NF90IGEgPSBmZXRjaDY0KHMpOworICB1aW50NjRfdCBiID0gZmV0Y2g2NChzICsgbGVuIC0gOCk7CisgIHJldHVybiBoYXNoXzE2X2J5dGVzKHNlZWQgXiBhLCByb3RhdGUoYiArIGxlbiwgbGVuKSkgXiBiOworfQorCitpbmxpbmUgdWludDY0X3QgaGFzaF8xN3RvMzJfYnl0ZXMoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgdWludDY0X3Qgc2VlZCkgeworICB1aW50NjRfdCBhID0gZmV0Y2g2NChzKSAqIGsxOworICB1aW50NjRfdCBiID0gZmV0Y2g2NChzICsgOCk7CisgIHVpbnQ2NF90IGMgPSBmZXRjaDY0KHMgKyBsZW4gLSA4KSAqIGsyOworICB1aW50NjRfdCBkID0gZmV0Y2g2NChzICsgbGVuIC0gMTYpICogazA7CisgIHJldHVybiBoYXNoXzE2X2J5dGVzKHJvdGF0ZShhIC0gYiwgNDMpICsgcm90YXRlKGMgXiBzZWVkLCAzMCkgKyBkLAorICAgICAgICAgICAgICAgICAgICAgICBhICsgcm90YXRlKGIgXiBrMywgMjApIC0gYyArIGxlbiArIHNlZWQpOworfQorCitpbmxpbmUgdWludDY0X3QgaGFzaF8zM3RvNjRfYnl0ZXMoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgdWludDY0X3Qgc2VlZCkgeworICB1aW50NjRfdCB6ID0gZmV0Y2g2NChzICsgMjQpOworICB1aW50NjRfdCBhID0gZmV0Y2g2NChzKSArIChsZW4gKyBmZXRjaDY0KHMgKyBsZW4gLSAxNikpICogazA7CisgIHVpbnQ2NF90IGIgPSByb3RhdGUoYSArIHosIDUyKTsKKyAgdWludDY0X3QgYyA9IHJvdGF0ZShhLCAzNyk7CisgIGEgKz0gZmV0Y2g2NChzICsgOCk7CisgIGMgKz0gcm90YXRlKGEsIDcpOworICBhICs9IGZldGNoNjQocyArIDE2KTsKKyAgdWludDY0X3QgdmYgPSBhICsgejsKKyAgdWludDY0X3QgdnMgPSBiICsgcm90YXRlKGEsIDMxKSArIGM7CisgIGEgPSBmZXRjaDY0KHMgKyAxNikgKyBmZXRjaDY0KHMgKyBsZW4gLSAzMik7CisgIHogPSBmZXRjaDY0KHMgKyBsZW4gLSA4KTsKKyAgYiA9IHJvdGF0ZShhICsgeiwgNTIpOworICBjID0gcm90YXRlKGEsIDM3KTsKKyAgYSArPSBmZXRjaDY0KHMgKyBsZW4gLSAyNCk7CisgIGMgKz0gcm90YXRlKGEsIDcpOworICBhICs9IGZldGNoNjQocyArIGxlbiAtIDE2KTsKKyAgdWludDY0X3Qgd2YgPSBhICsgejsKKyAgdWludDY0X3Qgd3MgPSBiICsgcm90YXRlKGEsIDMxKSArIGM7CisgIHVpbnQ2NF90IHIgPSBzaGlmdF9taXgoKHZmICsgd3MpICogazIgKyAod2YgKyB2cykgKiBrMCk7CisgIHJldHVybiBzaGlmdF9taXgoKHNlZWQgXiAociAqIGswKSkgKyB2cykgKiBrMjsKK30KKworaW5saW5lIHVpbnQ2NF90IGhhc2hfc2hvcnQoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbmd0aCwgdWludDY0X3Qgc2VlZCkgeworICBpZiAobGVuZ3RoID49IDQgJiYgbGVuZ3RoIDw9IDgpCisgICAgcmV0dXJuIGhhc2hfNHRvOF9ieXRlcyhzLCBsZW5ndGgsIHNlZWQpOworICBpZiAobGVuZ3RoID4gOCAmJiBsZW5ndGggPD0gMTYpCisgICAgcmV0dXJuIGhhc2hfOXRvMTZfYnl0ZXMocywgbGVuZ3RoLCBzZWVkKTsKKyAgaWYgKGxlbmd0aCA+IDE2ICYmIGxlbmd0aCA8PSAzMikKKyAgICByZXR1cm4gaGFzaF8xN3RvMzJfYnl0ZXMocywgbGVuZ3RoLCBzZWVkKTsKKyAgaWYgKGxlbmd0aCA+IDMyKQorICAgIHJldHVybiBoYXNoXzMzdG82NF9ieXRlcyhzLCBsZW5ndGgsIHNlZWQpOworICBpZiAobGVuZ3RoICE9IDApCisgICAgcmV0dXJuIGhhc2hfMXRvM19ieXRlcyhzLCBsZW5ndGgsIHNlZWQpOworCisgIHJldHVybiBrMiBeIHNlZWQ7Cit9CisKKy8vLyBcYnJpZWYgVGhlIGludGVybWVkaWF0ZSBzdGF0ZSB1c2VkIGR1cmluZyBoYXNoaW5nLgorLy8vIEN1cnJlbnRseSwgdGhlIGFsZ29yaXRobSBmb3IgY29tcHV0aW5nIGhhc2ggY29kZXMgaXMgYmFzZWQgb24gQ2l0eUhhc2ggYW5kCisvLy8ga2VlcHMgNTYgYnl0ZXMgb2YgYXJiaXRyYXJ5IHN0YXRlLgorc3RydWN0IGhhc2hfc3RhdGUgeworICB1aW50NjRfdCBoMCwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNjsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyBoYXNoX3N0YXRlIHN0cnVjdHVyZSBhbmQgaW5pdGlhbGl6ZSBpdCBiYXNlZCBvbiB0aGUKKyAgLy8vIHNlZWQgYW5kIHRoZSBmaXJzdCA2NC1ieXRlIGNodW5rLgorICAvLy8gVGhpcyBlZmZlY3RpdmVseSBwZXJmb3JtcyB0aGUgaW5pdGlhbCBtaXguCisgIHN0YXRpYyBoYXNoX3N0YXRlIGNyZWF0ZShjb25zdCBjaGFyICpzLCB1aW50NjRfdCBzZWVkKSB7CisgICAgaGFzaF9zdGF0ZSBzdGF0ZSA9IHsKKyAgICAgIDAsIHNlZWQsIGhhc2hfMTZfYnl0ZXMoc2VlZCwgazEpLCByb3RhdGUoc2VlZCBeIGsxLCA0OSksCisgICAgICBzZWVkICogazEsIHNoaWZ0X21peChzZWVkKSwgMCB9OworICAgIHN0YXRlLmg2ID0gaGFzaF8xNl9ieXRlcyhzdGF0ZS5oNCwgc3RhdGUuaDUpOworICAgIHN0YXRlLm1peChzKTsKKyAgICByZXR1cm4gc3RhdGU7CisgIH0KKworICAvLy8gXGJyaWVmIE1peCAzMi1ieXRlcyBmcm9tIHRoZSBpbnB1dCBzZXF1ZW5jZSBpbnRvIHRoZSAxNi1ieXRlcyBvZiAnYScKKyAgLy8vIGFuZCAnYicsIGluY2x1ZGluZyB3aGF0ZXZlciBpcyBhbHJlYWR5IGluICdhJyBhbmQgJ2InLgorICBzdGF0aWMgdm9pZCBtaXhfMzJfYnl0ZXMoY29uc3QgY2hhciAqcywgdWludDY0X3QgJmEsIHVpbnQ2NF90ICZiKSB7CisgICAgYSArPSBmZXRjaDY0KHMpOworICAgIHVpbnQ2NF90IGMgPSBmZXRjaDY0KHMgKyAyNCk7CisgICAgYiA9IHJvdGF0ZShiICsgYSArIGMsIDIxKTsKKyAgICB1aW50NjRfdCBkID0gYTsKKyAgICBhICs9IGZldGNoNjQocyArIDgpICsgZmV0Y2g2NChzICsgMTYpOworICAgIGIgKz0gcm90YXRlKGEsIDQ0KSArIGQ7CisgICAgYSArPSBjOworICB9CisKKyAgLy8vIFxicmllZiBNaXggaW4gYSA2NC1ieXRlIGJ1ZmZlciBvZiBkYXRhLgorICAvLy8gV2UgbWl4IGFsbCA2NCBieXRlcyBldmVuIHdoZW4gdGhlIGNodW5rIGxlbmd0aCBpcyBzbWFsbGVyLCBidXQgd2UKKyAgLy8vIHJlY29yZCB0aGUgYWN0dWFsIGxlbmd0aC4KKyAgdm9pZCBtaXgoY29uc3QgY2hhciAqcykgeworICAgIGgwID0gcm90YXRlKGgwICsgaDEgKyBoMyArIGZldGNoNjQocyArIDgpLCAzNykgKiBrMTsKKyAgICBoMSA9IHJvdGF0ZShoMSArIGg0ICsgZmV0Y2g2NChzICsgNDgpLCA0MikgKiBrMTsKKyAgICBoMCBePSBoNjsKKyAgICBoMSArPSBoMyArIGZldGNoNjQocyArIDQwKTsKKyAgICBoMiA9IHJvdGF0ZShoMiArIGg1LCAzMykgKiBrMTsKKyAgICBoMyA9IGg0ICogazE7CisgICAgaDQgPSBoMCArIGg1OworICAgIG1peF8zMl9ieXRlcyhzLCBoMywgaDQpOworICAgIGg1ID0gaDIgKyBoNjsKKyAgICBoNiA9IGgxICsgZmV0Y2g2NChzICsgMTYpOworICAgIG1peF8zMl9ieXRlcyhzICsgMzIsIGg1LCBoNik7CisgICAgc3RkOjpzd2FwKGgyLCBoMCk7CisgIH0KKworICAvLy8gXGJyaWVmIENvbXB1dGUgdGhlIGZpbmFsIDY0LWJpdCBoYXNoIGNvZGUgdmFsdWUgYmFzZWQgb24gdGhlIGN1cnJlbnQKKyAgLy8vIHN0YXRlIGFuZCB0aGUgbGVuZ3RoIG9mIGJ5dGVzIGhhc2hlZC4KKyAgdWludDY0X3QgZmluYWxpemUoc2l6ZV90IGxlbmd0aCkgeworICAgIHJldHVybiBoYXNoXzE2X2J5dGVzKGhhc2hfMTZfYnl0ZXMoaDMsIGg1KSArIHNoaWZ0X21peChoMSkgKiBrMSArIGgyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfMTZfYnl0ZXMoaDQsIGg2KSArIHNoaWZ0X21peChsZW5ndGgpICogazEgKyBoMCk7CisgIH0KK307CisKKworLy8vIFxicmllZiBBIGdsb2JhbCwgZml4ZWQgc2VlZC1vdmVycmlkZSB2YXJpYWJsZS4KKy8vLworLy8vIFRoaXMgdmFyaWFibGUgY2FuIGJlIHNldCB1c2luZyB0aGUgXHNlZSBsbHZtOjpzZXRfZml4ZWRfZXhlY3V0aW9uX3NlZWQKKy8vLyBmdW5jdGlvbi4gU2VlIHRoYXQgZnVuY3Rpb24gZm9yIGRldGFpbHMuIERvIG5vdCwgdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMsCisvLy8gc2V0IG9yIHJlYWQgdGhpcyB2YXJpYWJsZS4KK2V4dGVybiBzaXplX3QgZml4ZWRfc2VlZF9vdmVycmlkZTsKKworaW5saW5lIHNpemVfdCBnZXRfZXhlY3V0aW9uX3NlZWQoKSB7CisgIC8vIEZJWE1FOiBUaGlzIG5lZWRzIHRvIGJlIGEgcGVyLWV4ZWN1dGlvbiBzZWVkLiBUaGlzIGlzIGp1c3QgYSBwbGFjZWhvbGRlcgorICAvLyBpbXBsZW1lbnRhdGlvbi4gU3dpdGNoaW5nIHRvIGEgcGVyLWV4ZWN1dGlvbiBzZWVkIGlzIGxpa2VseSB0byBmbHVzaCBvdXQKKyAgLy8gaW5zdGFiaWxpdHkgYnVncyBhbmQgc28gd2lsbCBoYXBwZW4gYXMgaXRzIG93biBjb21taXQuCisgIC8vCisgIC8vIEhvd2V2ZXIsIGlmIHRoZXJlIGlzIGEgZml4ZWQgc2VlZCBvdmVycmlkZSBzZXQgdGhlIGZpcnN0IHRpbWUgdGhpcyBpcworICAvLyBjYWxsZWQsIHJldHVybiB0aGF0IGluc3RlYWQgb2YgdGhlIHBlci1leGVjdXRpb24gc2VlZC4KKyAgY29uc3QgdWludDY0X3Qgc2VlZF9wcmltZSA9IDB4ZmY1MWFmZDdlZDU1OGNjZFVMTDsKKyAgc3RhdGljIHNpemVfdCBzZWVkID0gZml4ZWRfc2VlZF9vdmVycmlkZSA/IGZpeGVkX3NlZWRfb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChzaXplX3Qpc2VlZF9wcmltZTsKKyAgcmV0dXJuIHNlZWQ7Cit9CisKKworLy8vIFxicmllZiBUcmFpdCB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgdHlwZSdzIGJpdHMgY2FuIGJlIGhhc2hlZCBkaXJlY3RseS4KKy8vLworLy8vIEEgdHlwZSB0cmFpdCB3aGljaCBpcyB0cnVlIGlmIHdlIHdhbnQgdG8gY29tYmluZSB2YWx1ZXMgZm9yIGhhc2hpbmcgYnkKKy8vLyByZWFkaW5nIHRoZSB1bmRlcmx5aW5nIGRhdGEuIEl0IGlzIGZhbHNlIGlmIHZhbHVlcyBvZiB0aGlzIHR5cGUgbXVzdAorLy8vIGZpcnN0IGJlIHBhc3NlZCB0byBoYXNoX3ZhbHVlLCBhbmQgdGhlIHJlc3VsdGluZyBoYXNoX2NvZGVzIGNvbWJpbmVkLgorLy8KKy8vIEZJWE1FOiBXZSB3YW50IHRvIHJlcGxhY2UgaXNfaW50ZWdyYWxfb3JfZW51bSBhbmQgaXNfcG9pbnRlciBoZXJlIHdpdGgKKy8vIGEgcHJlZGljYXRlIHdoaWNoIGFzc2VydHMgdGhhdCBjb21wYXJpbmcgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBvZiB0d28KKy8vIHZhbHVlcyBvZiB0aGUgdHlwZSBmb3IgZXF1YWxpdHkgaXMgZXF1aXZhbGVudCB0byBjb21wYXJpbmcgdGhlIHR3byB2YWx1ZXMKKy8vIGZvciBlcXVhbGl0eS4gRm9yIGFsbCB0aGUgcGxhdGZvcm1zIHdlIGNhcmUgYWJvdXQsIHRoaXMgaG9sZHMgZm9yIGludGVnZXJzCisvLyBhbmQgcG9pbnRlcnMsIGJ1dCB0aGVyZSBhcmUgcGxhdGZvcm1zIHdoZXJlIGl0IGRvZXNuJ3QgYW5kIHdlIHdvdWxkIGxpa2UgdG8KKy8vIHN1cHBvcnQgdXNlci1kZWZpbmVkIHR5cGVzIHdoaWNoIGhhcHBlbiB0byBzYXRpc2Z5IHRoaXMgcHJvcGVydHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlzX2hhc2hhYmxlX2RhdGEKKyAgOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsICgoaXNfaW50ZWdyYWxfb3JfZW51bTxUPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19wb2ludGVyPFQ+Ojp2YWx1ZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCAlIHNpemVvZihUKSA9PSAwKT4ge307CisKKy8vIFNwZWNpYWwgY2FzZSBzdGQ6OnBhaXIgdG8gZGV0ZWN0IHdoZW4gYm90aCB0eXBlcyBhcmUgdmlhYmxlIGFuZCB3aGVuIHRoZXJlCisvLyBpcyBubyBhbGlnbm1lbnQtZGVyaXZlZCBwYWRkaW5nIGluIHRoZSBwYWlyLiBUaGlzIGlzIGEgYml0IG9mIGEgbGllIGJlY2F1c2UKKy8vIHN0ZDo6cGFpciBpc24ndCB0cnVseSBQT0QsIGJ1dCBpdCdzIGNsb3NlIGVub3VnaCBpbiBhbGwgcmVhc29uYWJsZQorLy8gaW1wbGVtZW50YXRpb25zIGZvciBvdXIgdXNlIGNhc2Ugb2YgaGFzaGluZyB0aGUgdW5kZXJseWluZyBkYXRhLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHN0cnVjdCBpc19oYXNoYWJsZV9kYXRhPHN0ZDo6cGFpcjxULCBVPiA+CisgIDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCAoaXNfaGFzaGFibGVfZGF0YTxUPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19oYXNoYWJsZV9kYXRhPFU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoVCkgKyBzaXplb2YoVSkpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdGQ6OnBhaXI8VCwgVT4pKT4ge307CisKKy8vLyBcYnJpZWYgSGVscGVyIHRvIGdldCB0aGUgaGFzaGFibGUgZGF0YSByZXByZXNlbnRhdGlvbiBmb3IgYSB0eXBlLgorLy8vIFRoaXMgdmFyaWFudCBpcyBlbmFibGVkIHdoZW4gdGhlIHR5cGUgaXRzZWxmIGNhbiBiZSB1c2VkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxpc19oYXNoYWJsZV9kYXRhPFQ+Ojp2YWx1ZSwgVD46OnR5cGUKK2dldF9oYXNoYWJsZV9kYXRhKGNvbnN0IFQgJnZhbHVlKSB7CisgIHJldHVybiB2YWx1ZTsKK30KKy8vLyBcYnJpZWYgSGVscGVyIHRvIGdldCB0aGUgaGFzaGFibGUgZGF0YSByZXByZXNlbnRhdGlvbiBmb3IgYSB0eXBlLgorLy8vIFRoaXMgdmFyaWFudCBpcyBlbmFibGVkIHdoZW4gd2UgbXVzdCBmaXJzdCBjYWxsIGhhc2hfdmFsdWUgYW5kIHVzZSB0aGUKKy8vLyByZXN1bHQgYXMgb3VyIGRhdGEuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFpc19oYXNoYWJsZV9kYXRhPFQ+Ojp2YWx1ZSwgc2l6ZV90Pjo6dHlwZQorZ2V0X2hhc2hhYmxlX2RhdGEoY29uc3QgVCAmdmFsdWUpIHsKKyAgdXNpbmcgOjpsbHZtOjpoYXNoX3ZhbHVlOworICByZXR1cm4gaGFzaF92YWx1ZSh2YWx1ZSk7Cit9CisKKy8vLyBcYnJpZWYgSGVscGVyIHRvIHN0b3JlIGRhdGEgZnJvbSBhIHZhbHVlIGludG8gYSBidWZmZXIgYW5kIGFkdmFuY2UgdGhlCisvLy8gcG9pbnRlciBpbnRvIHRoYXQgYnVmZmVyLgorLy8vCisvLy8gVGhpcyByb3V0aW5lIGZpcnN0IGNoZWNrcyB3aGV0aGVyIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBpbiB0aGUgcHJvdmlkZWQKKy8vLyBidWZmZXIsIGFuZCBpZiBub3QgaW1tZWRpYXRlbHkgcmV0dXJucyBmYWxzZS4gSWYgdGhlcmUgaXMgc3BhY2UsIGl0CisvLy8gY29waWVzIHRoZSB1bmRlcmx5aW5nIGJ5dGVzIG9mIHZhbHVlIGludG8gdGhlIGJ1ZmZlciwgYWR2YW5jZXMgdGhlCisvLy8gYnVmZmVyX3B0ciBwYXN0IHRoZSBjb3BpZWQgYnl0ZXMsIGFuZCByZXR1cm5zIHRydWUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgc3RvcmVfYW5kX2FkdmFuY2UoY2hhciAqJmJ1ZmZlcl9wdHIsIGNoYXIgKmJ1ZmZlcl9lbmQsIGNvbnN0IFQmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMCkgeworICBzaXplX3Qgc3RvcmVfc2l6ZSA9IHNpemVvZih2YWx1ZSkgLSBvZmZzZXQ7CisgIGlmIChidWZmZXJfcHRyICsgc3RvcmVfc2l6ZSA+IGJ1ZmZlcl9lbmQpCisgICAgcmV0dXJuIGZhbHNlOworICBjb25zdCBjaGFyICp2YWx1ZV9kYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZ2YWx1ZSk7CisgIG1lbWNweShidWZmZXJfcHRyLCB2YWx1ZV9kYXRhICsgb2Zmc2V0LCBzdG9yZV9zaXplKTsKKyAgYnVmZmVyX3B0ciArPSBzdG9yZV9zaXplOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFxicmllZiBJbXBsZW1lbnQgdGhlIGNvbWJpbmluZyBvZiBpbnRlZ3JhbCB2YWx1ZXMgaW50byBhIGhhc2hfY29kZS4KKy8vLworLy8vIFRoaXMgb3ZlcmxvYWQgaXMgc2VsZWN0ZWQgd2hlbiB0aGUgdmFsdWUgdHlwZSBvZiB0aGUgaXRlcmF0b3IgaXMKKy8vLyBpbnRlZ3JhbC4gUmF0aGVyIHRoYW4gY29tcHV0aW5nIGEgaGFzaF9jb2RlIGZvciBlYWNoIG9iamVjdCBhbmQgdGhlbgorLy8vIGNvbWJpbmluZyB0aGVtLCB0aGlzIChhcyBhbiBvcHRpbWl6YXRpb24pIGRpcmVjdGx5IGNvbWJpbmVzIHRoZSBpbnRlZ2Vycy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yVD4KK2hhc2hfY29kZSBoYXNoX2NvbWJpbmVfcmFuZ2VfaW1wbChJbnB1dEl0ZXJhdG9yVCBmaXJzdCwgSW5wdXRJdGVyYXRvclQgbGFzdCkgeworICBjb25zdCBzaXplX3Qgc2VlZCA9IGdldF9leGVjdXRpb25fc2VlZCgpOworICBjaGFyIGJ1ZmZlcls2NF0sICpidWZmZXJfcHRyID0gYnVmZmVyOworICBjaGFyICpjb25zdCBidWZmZXJfZW5kID0gc3RkOjplbmQoYnVmZmVyKTsKKyAgd2hpbGUgKGZpcnN0ICE9IGxhc3QgJiYgc3RvcmVfYW5kX2FkdmFuY2UoYnVmZmVyX3B0ciwgYnVmZmVyX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2hhc2hhYmxlX2RhdGEoKmZpcnN0KSkpCisgICAgKytmaXJzdDsKKyAgaWYgKGZpcnN0ID09IGxhc3QpCisgICAgcmV0dXJuIGhhc2hfc2hvcnQoYnVmZmVyLCBidWZmZXJfcHRyIC0gYnVmZmVyLCBzZWVkKTsKKyAgYXNzZXJ0KGJ1ZmZlcl9wdHIgPT0gYnVmZmVyX2VuZCk7CisKKyAgaGFzaF9zdGF0ZSBzdGF0ZSA9IHN0YXRlLmNyZWF0ZShidWZmZXIsIHNlZWQpOworICBzaXplX3QgbGVuZ3RoID0gNjQ7CisgIHdoaWxlIChmaXJzdCAhPSBsYXN0KSB7CisgICAgLy8gRmlsbCB1cCB0aGUgYnVmZmVyLiBXZSBkb24ndCBjbGVhciBpdCwgd2hpY2ggcmUtbWl4ZXMgdGhlIGxhc3Qgcm91bmQKKyAgICAvLyB3aGVuIG9ubHkgYSBwYXJ0aWFsIDY0LWJ5dGUgY2h1bmsgaXMgbGVmdC4KKyAgICBidWZmZXJfcHRyID0gYnVmZmVyOworICAgIHdoaWxlIChmaXJzdCAhPSBsYXN0ICYmIHN0b3JlX2FuZF9hZHZhbmNlKGJ1ZmZlcl9wdHIsIGJ1ZmZlcl9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2hhc2hhYmxlX2RhdGEoKmZpcnN0KSkpCisgICAgICArK2ZpcnN0OworCisgICAgLy8gUm90YXRlIHRoZSBidWZmZXIgaWYgd2UgZGlkIGEgcGFydGlhbCBmaWxsIGluIG9yZGVyIHRvIHNpbXVsYXRlIGRvaW5nCisgICAgLy8gYSBtaXggb2YgdGhlIGxhc3QgNjQtYnl0ZXMuIFRoYXQgaXMgaG93IHRoZSBhbGdvcml0aG0gd29ya3Mgd2hlbiB3ZQorICAgIC8vIGhhdmUgYSBjb250aWd1b3VzIGJ5dGUgc2VxdWVuY2UsIGFuZCB3ZSB3YW50IHRvIGVtdWxhdGUgdGhhdCBoZXJlLgorICAgIHN0ZDo6cm90YXRlKGJ1ZmZlciwgYnVmZmVyX3B0ciwgYnVmZmVyX2VuZCk7CisKKyAgICAvLyBNaXggdGhpcyBjaHVuayBpbnRvIHRoZSBjdXJyZW50IHN0YXRlLgorICAgIHN0YXRlLm1peChidWZmZXIpOworICAgIGxlbmd0aCArPSBidWZmZXJfcHRyIC0gYnVmZmVyOworICB9OworCisgIHJldHVybiBzdGF0ZS5maW5hbGl6ZShsZW5ndGgpOworfQorCisvLy8gXGJyaWVmIEltcGxlbWVudCB0aGUgY29tYmluaW5nIG9mIGludGVncmFsIHZhbHVlcyBpbnRvIGEgaGFzaF9jb2RlLgorLy8vCisvLy8gVGhpcyBvdmVybG9hZCBpcyBzZWxlY3RlZCB3aGVuIHRoZSB2YWx1ZSB0eXBlIG9mIHRoZSBpdGVyYXRvciBpcyBpbnRlZ3JhbAorLy8vIGFuZCB3aGVuIHRoZSBpbnB1dCBpdGVyYXRvciBpcyBhY3R1YWxseSBhIHBvaW50ZXIuIFJhdGhlciB0aGFuIGNvbXB1dGluZworLy8vIGEgaGFzaF9jb2RlIGZvciBlYWNoIG9iamVjdCBhbmQgdGhlbiBjb21iaW5pbmcgdGhlbSwgdGhpcyAoYXMgYW4KKy8vLyBvcHRpbWl6YXRpb24pIGRpcmVjdGx5IGNvbWJpbmVzIHRoZSBpbnRlZ2Vycy4gQWxzbywgYmVjYXVzZSB0aGUgaW50ZWdlcnMKKy8vLyBhcmUgc3RvcmVkIGluIGNvbnRpZ3VvdXMgbWVtb3J5LCB0aGlzIHJvdXRpbmUgYXZvaWRzIGNvcHlpbmcgZWFjaCB2YWx1ZQorLy8vIGFuZCBkaXJlY3RseSByZWFkcyBmcm9tIHRoZSB1bmRlcmx5aW5nIG1lbW9yeS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxpc19oYXNoYWJsZV9kYXRhPFZhbHVlVD46OnZhbHVlLCBoYXNoX2NvZGU+Ojp0eXBlCitoYXNoX2NvbWJpbmVfcmFuZ2VfaW1wbChWYWx1ZVQgKmZpcnN0LCBWYWx1ZVQgKmxhc3QpIHsKKyAgY29uc3Qgc2l6ZV90IHNlZWQgPSBnZXRfZXhlY3V0aW9uX3NlZWQoKTsKKyAgY29uc3QgY2hhciAqc19iZWdpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihmaXJzdCk7CisgIGNvbnN0IGNoYXIgKnNfZW5kID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KGxhc3QpOworICBjb25zdCBzaXplX3QgbGVuZ3RoID0gc3RkOjpkaXN0YW5jZShzX2JlZ2luLCBzX2VuZCk7CisgIGlmIChsZW5ndGggPD0gNjQpCisgICAgcmV0dXJuIGhhc2hfc2hvcnQoc19iZWdpbiwgbGVuZ3RoLCBzZWVkKTsKKworICBjb25zdCBjaGFyICpzX2FsaWduZWRfZW5kID0gc19iZWdpbiArIChsZW5ndGggJiB+NjMpOworICBoYXNoX3N0YXRlIHN0YXRlID0gc3RhdGUuY3JlYXRlKHNfYmVnaW4sIHNlZWQpOworICBzX2JlZ2luICs9IDY0OworICB3aGlsZSAoc19iZWdpbiAhPSBzX2FsaWduZWRfZW5kKSB7CisgICAgc3RhdGUubWl4KHNfYmVnaW4pOworICAgIHNfYmVnaW4gKz0gNjQ7CisgIH0KKyAgaWYgKGxlbmd0aCAmIDYzKQorICAgIHN0YXRlLm1peChzX2VuZCAtIDY0KTsKKworICByZXR1cm4gc3RhdGUuZmluYWxpemUobGVuZ3RoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBoYXNoaW5nCisKKworLy8vIFxicmllZiBDb21wdXRlIGEgaGFzaF9jb2RlIGZvciBhIHNlcXVlbmNlIG9mIHZhbHVlcy4KKy8vLworLy8vIFRoaXMgaGFzaGVzIGEgc2VxdWVuY2Ugb2YgdmFsdWVzLiBJdCBwcm9kdWNlcyB0aGUgc2FtZSBoYXNoX2NvZGUgYXMKKy8vLyAnaGFzaF9jb21iaW5lKGEsIGIsIGMsIC4uLiknLCBidXQgY2FuIHJ1biBvdmVyIGFyYml0cmFyeSBzaXplZCBzZXF1ZW5jZXMKKy8vLyBhbmQgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZ2l2ZW4gcG9pbnRlcnMgYW5kIHR5cGVzIHdoaWNoIGNhbiBiZSBoYXNoZWQgYXMKKy8vLyBhIHNlcXVlbmNlIG9mIGJ5dGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIElucHV0SXRlcmF0b3JUPgoraGFzaF9jb2RlIGhhc2hfY29tYmluZV9yYW5nZShJbnB1dEl0ZXJhdG9yVCBmaXJzdCwgSW5wdXRJdGVyYXRvclQgbGFzdCkgeworICByZXR1cm4gOjpsbHZtOjpoYXNoaW5nOjpkZXRhaWw6Omhhc2hfY29tYmluZV9yYW5nZV9pbXBsKGZpcnN0LCBsYXN0KTsKK30KKworCisvLyBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGZvciBoYXNoX2NvbWJpbmUuCituYW1lc3BhY2UgaGFzaGluZyB7CituYW1lc3BhY2UgZGV0YWlsIHsKKworLy8vIFxicmllZiBIZWxwZXIgY2xhc3MgdG8gbWFuYWdlIHRoZSByZWN1cnNpdmUgY29tYmluaW5nIG9mIGhhc2hfY29tYmluZQorLy8vIGFyZ3VtZW50cy4KKy8vLworLy8vIFRoaXMgY2xhc3MgZXhpc3RzIHRvIG1hbmFnZSB0aGUgc3RhdGUgYW5kIHZhcmlvdXMgY2FsbHMgaW52b2x2ZWQgaW4gdGhlCisvLy8gcmVjdXJzaXZlIGNvbWJpbmluZyBvZiBhcmd1bWVudHMgdXNlZCBpbiBoYXNoX2NvbWJpbmUuIEl0IGlzIHBhcnRpY3VsYXJseQorLy8vIHVzZWZ1bCBhdCBtaW5pbWl6aW5nIHRoZSBjb2RlIGluIHRoZSByZWN1cnNpdmUgY2FsbHMgdG8gZWFzZSB0aGUgcGFpbgorLy8vIGNhdXNlZCBieSBhIGxhY2sgb2YgdmFyaWFkaWMgZnVuY3Rpb25zLgorc3RydWN0IGhhc2hfY29tYmluZV9yZWN1cnNpdmVfaGVscGVyIHsKKyAgY2hhciBidWZmZXJbNjRdOworICBoYXNoX3N0YXRlIHN0YXRlOworICBjb25zdCBzaXplX3Qgc2VlZDsKKworcHVibGljOgorICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIHJlY3Vyc2l2ZSBoYXNoIGNvbWJpbmluZyBoZWxwZXIuCisgIC8vLworICAvLy8gVGhpcyBzZXRzIHVwIHRoZSBzdGF0ZSBmb3IgYSByZWN1cnNpdmUgaGFzaCBjb21iaW5lLCBpbmNsdWRpbmcgZ2V0dGluZworICAvLy8gdGhlIHNlZWQgYW5kIGJ1ZmZlciBzZXR1cC4KKyAgaGFzaF9jb21iaW5lX3JlY3Vyc2l2ZV9oZWxwZXIoKQorICAgIDogc2VlZChnZXRfZXhlY3V0aW9uX3NlZWQoKSkge30KKworICAvLy8gXGJyaWVmIENvbWJpbmUgb25lIGNodW5rIG9mIGRhdGEgaW50byB0aGUgY3VycmVudCBpbi1mbGlnaHQgaGFzaC4KKyAgLy8vCisgIC8vLyBUaGlzIG1lcmdlcyBvbmUgY2h1bmsgb2YgZGF0YSBpbnRvIHRoZSBoYXNoLiBGaXJzdCBpdCB0cmllcyB0byBidWZmZXIKKyAgLy8vIHRoZSBkYXRhLiBJZiB0aGUgYnVmZmVyIGlzIGZ1bGwsIGl0IGhhc2hlcyB0aGUgYnVmZmVyIGludG8gaXRzCisgIC8vLyBoYXNoX3N0YXRlLCBlbXB0aWVzIGl0LCBhbmQgdGhlbiBtZXJnZXMgdGhlIG5ldyBjaHVuayBpbi4gVGhpcyBhbHNvCisgIC8vLyBoYW5kbGVzIGNhc2VzIHdoZXJlIHRoZSBkYXRhIHN0cmFkZGxlcyB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBjaGFyICpjb21iaW5lX2RhdGEoc2l6ZV90ICZsZW5ndGgsIGNoYXIgKmJ1ZmZlcl9wdHIsIGNoYXIgKmJ1ZmZlcl9lbmQsIFQgZGF0YSkgeworICAgIGlmICghc3RvcmVfYW5kX2FkdmFuY2UoYnVmZmVyX3B0ciwgYnVmZmVyX2VuZCwgZGF0YSkpIHsKKyAgICAgIC8vIENoZWNrIGZvciBza2V3IHdoaWNoIHByZXZlbnRzIHRoZSBidWZmZXIgZnJvbSBiZWluZyBwYWNrZWQsIGFuZCBkbworICAgICAgLy8gYSBwYXJ0aWFsIHN0b3JlIGludG8gdGhlIGJ1ZmZlciB0byBmaWxsIGl0LiBUaGlzIGlzIG9ubHkgYSBjb25jZXJuCisgICAgICAvLyB3aXRoIHRoZSB2YXJpYWRpYyBjb21iaW5lIGJlY2F1c2UgdGhhdCBmb3JtYXRpb24gY2FuIGhhdmUgdmFyeWluZworICAgICAgLy8gYXJndW1lbnQgdHlwZXMuCisgICAgICBzaXplX3QgcGFydGlhbF9zdG9yZV9zaXplID0gYnVmZmVyX2VuZCAtIGJ1ZmZlcl9wdHI7CisgICAgICBtZW1jcHkoYnVmZmVyX3B0ciwgJmRhdGEsIHBhcnRpYWxfc3RvcmVfc2l6ZSk7CisKKyAgICAgIC8vIElmIHRoZSBzdG9yZSBmYWlscywgb3VyIGJ1ZmZlciBpcyBmdWxsIGFuZCByZWFkeSB0byBoYXNoLiBXZSBoYXZlIHRvCisgICAgICAvLyBlaXRoZXIgaW5pdGlhbGl6ZSB0aGUgaGFzaCBzdGF0ZSAob24gdGhlIGZpcnN0IGZ1bGwgYnVmZmVyKSBvciBtaXgKKyAgICAgIC8vIHRoaXMgYnVmZmVyIGludG8gdGhlIGV4aXN0aW5nIGhhc2ggc3RhdGUuIExlbmd0aCB0cmFja3MgdGhlICpoYXNoZWQqCisgICAgICAvLyBsZW5ndGgsIG5vdCB0aGUgYnVmZmVyZWQgbGVuZ3RoLgorICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgIHN0YXRlID0gc3RhdGUuY3JlYXRlKGJ1ZmZlciwgc2VlZCk7CisgICAgICAgIGxlbmd0aCA9IDY0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTWl4IHRoaXMgY2h1bmsgaW50byB0aGUgY3VycmVudCBzdGF0ZSBhbmQgYnVtcCBsZW5ndGggdXAgYnkgNjQuCisgICAgICAgIHN0YXRlLm1peChidWZmZXIpOworICAgICAgICBsZW5ndGggKz0gNjQ7CisgICAgICB9CisgICAgICAvLyBSZXNldCB0aGUgYnVmZmVyX3B0ciB0byB0aGUgaGVhZCBvZiB0aGUgYnVmZmVyIGZvciB0aGUgbmV4dCBjaHVuayBvZgorICAgICAgLy8gZGF0YS4KKyAgICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7CisKKyAgICAgIC8vIFRyeSBhZ2FpbiB0byBzdG9yZSBpbnRvIHRoZSBidWZmZXIgLS0gdGhpcyBjYW5ub3QgZmFpbCBhcyB3ZSBvbmx5CisgICAgICAvLyBzdG9yZSB0eXBlcyBzbWFsbGVyIHRoYW4gdGhlIGJ1ZmZlci4KKyAgICAgIGlmICghc3RvcmVfYW5kX2FkdmFuY2UoYnVmZmVyX3B0ciwgYnVmZmVyX2VuZCwgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbF9zdG9yZV9zaXplKSkKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9CisgICAgcmV0dXJuIGJ1ZmZlcl9wdHI7CisgIH0KKworICAvLy8gXGJyaWVmIFJlY3Vyc2l2ZSwgdmFyaWFkaWMgY29tYmluaW5nIG1ldGhvZC4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJlY3Vyc2VzIHRocm91Z2ggZWFjaCBhcmd1bWVudCwgY29tYmluaW5nIHRoYXQgYXJndW1lbnQKKyAgLy8vIGludG8gYSBzaW5nbGUgaGFzaC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLlRzPgorICBoYXNoX2NvZGUgY29tYmluZShzaXplX3QgbGVuZ3RoLCBjaGFyICpidWZmZXJfcHRyLCBjaGFyICpidWZmZXJfZW5kLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUICZhcmcsIGNvbnN0IFRzICYuLi5hcmdzKSB7CisgICAgYnVmZmVyX3B0ciA9IGNvbWJpbmVfZGF0YShsZW5ndGgsIGJ1ZmZlcl9wdHIsIGJ1ZmZlcl9lbmQsIGdldF9oYXNoYWJsZV9kYXRhKGFyZykpOworCisgICAgLy8gUmVjdXJzZSB0byB0aGUgbmV4dCBhcmd1bWVudC4KKyAgICByZXR1cm4gY29tYmluZShsZW5ndGgsIGJ1ZmZlcl9wdHIsIGJ1ZmZlcl9lbmQsIGFyZ3MuLi4pOworICB9CisKKyAgLy8vIFxicmllZiBCYXNlIGNhc2UgZm9yIHJlY3Vyc2l2ZSwgdmFyaWFkaWMgY29tYmluaW5nLgorICAvLy8KKyAgLy8vIFRoZSBiYXNlIGNhc2Ugd2hlbiBjb21iaW5pbmcgYXJndW1lbnRzIHJlY3Vyc2l2ZWx5IGlzIHJlYWNoZWQgd2hlbiBhbGwKKyAgLy8vIGFyZ3VtZW50cyBoYXZlIGJlZW4gaGFuZGxlZC4gSXQgZmx1c2hlcyB0aGUgcmVtYWluaW5nIGJ1ZmZlciBhbmQKKyAgLy8vIGNvbnN0cnVjdHMgYSBoYXNoX2NvZGUuCisgIGhhc2hfY29kZSBjb21iaW5lKHNpemVfdCBsZW5ndGgsIGNoYXIgKmJ1ZmZlcl9wdHIsIGNoYXIgKmJ1ZmZlcl9lbmQpIHsKKyAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBlbnRpcmUgc2V0IG9mIHZhbHVlcyBmaXQgaW4gdGhlIGJ1ZmZlci4gSWYgc28sIHdlJ2xsCisgICAgLy8gdXNlIHRoZSBvcHRpbWl6ZWQgc2hvcnQgaGFzaGluZyByb3V0aW5lIGFuZCBza2lwIHN0YXRlIGVudGlyZWx5LgorICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgIHJldHVybiBoYXNoX3Nob3J0KGJ1ZmZlciwgYnVmZmVyX3B0ciAtIGJ1ZmZlciwgc2VlZCk7CisKKyAgICAvLyBNaXggdGhlIGZpbmFsIGJ1ZmZlciwgcm90YXRpbmcgaXQgaWYgd2UgZGlkIGEgcGFydGlhbCBmaWxsIGluIG9yZGVyIHRvCisgICAgLy8gc2ltdWxhdGUgZG9pbmcgYSBtaXggb2YgdGhlIGxhc3QgNjQtYnl0ZXMuIFRoYXQgaXMgaG93IHRoZSBhbGdvcml0aG0KKyAgICAvLyB3b3JrcyB3aGVuIHdlIGhhdmUgYSBjb250aWd1b3VzIGJ5dGUgc2VxdWVuY2UsIGFuZCB3ZSB3YW50IHRvIGVtdWxhdGUKKyAgICAvLyB0aGF0IGhlcmUuCisgICAgc3RkOjpyb3RhdGUoYnVmZmVyLCBidWZmZXJfcHRyLCBidWZmZXJfZW5kKTsKKworICAgIC8vIE1peCB0aGlzIGNodW5rIGludG8gdGhlIGN1cnJlbnQgc3RhdGUuCisgICAgc3RhdGUubWl4KGJ1ZmZlcik7CisgICAgbGVuZ3RoICs9IGJ1ZmZlcl9wdHIgLSBidWZmZXI7CisKKyAgICByZXR1cm4gc3RhdGUuZmluYWxpemUobGVuZ3RoKTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBoYXNoaW5nCisKKy8vLyBcYnJpZWYgQ29tYmluZSB2YWx1ZXMgaW50byBhIHNpbmdsZSBoYXNoX2NvZGUuCisvLy8KKy8vLyBUaGlzIHJvdXRpbmUgYWNjZXB0cyBhIHZhcnlpbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBvZiBhbnkgdHlwZS4gSXQgd2lsbAorLy8vIGF0dGVtcHQgdG8gY29tYmluZSB0aGVtIGludG8gYSBzaW5nbGUgaGFzaF9jb2RlLiBGb3IgdXNlci1kZWZpbmVkIHR5cGVzIGl0CisvLy8gYXR0ZW1wdHMgdG8gY2FsbCBhIFxzZWUgaGFzaF92YWx1ZSBvdmVybG9hZCAodmlhIEFETCkgZm9yIHRoZSB0eXBlLiBGb3IKKy8vLyBpbnRlZ2VyIGFuZCBwb2ludGVyIHR5cGVzIGl0IGRpcmVjdGx5IGNvbWJpbmVzIHRoZWlyIGRhdGEgaW50byB0aGUKKy8vLyByZXN1bHRpbmcgaGFzaF9jb2RlLgorLy8vCisvLy8gVGhlIHJlc3VsdCBpcyBzdWl0YWJsZSBmb3IgcmV0dXJuaW5nIGZyb20gYSB1c2VyJ3MgaGFzaF92YWx1ZQorLy8vICppbXBsZW1lbnRhdGlvbiogZm9yIHRoZWlyIHVzZXItZGVmaW5lZCB0eXBlLiBDb25zdW1lcnMgb2YgYSB0eXBlIHNob3VsZAorLy8vICpub3QqIGNhbGwgdGhpcyByb3V0aW5lLCB0aGV5IHNob3VsZCBpbnN0ZWFkIGNhbGwgJ2hhc2hfdmFsdWUnLgordGVtcGxhdGUgPHR5cGVuYW1lIC4uLlRzPiBoYXNoX2NvZGUgaGFzaF9jb21iaW5lKGNvbnN0IFRzICYuLi5hcmdzKSB7CisgIC8vIFJlY3Vyc2l2ZWx5IGhhc2ggZWFjaCBhcmd1bWVudCB1c2luZyBhIGhlbHBlciBjbGFzcy4KKyAgOjpsbHZtOjpoYXNoaW5nOjpkZXRhaWw6Omhhc2hfY29tYmluZV9yZWN1cnNpdmVfaGVscGVyIGhlbHBlcjsKKyAgcmV0dXJuIGhlbHBlci5jb21iaW5lKDAsIGhlbHBlci5idWZmZXIsIGhlbHBlci5idWZmZXIgKyA2NCwgYXJncy4uLik7Cit9CisKKy8vIEltcGxlbWVudGF0aW9uIGRldGFpbHMgZm9yIGltcGxlbWVudGF0aW9ucyBvZiBoYXNoX3ZhbHVlIG92ZXJsb2FkcyBwcm92aWRlZAorLy8gaGVyZS4KK25hbWVzcGFjZSBoYXNoaW5nIHsKK25hbWVzcGFjZSBkZXRhaWwgeworCisvLy8gXGJyaWVmIEhlbHBlciB0byBoYXNoIHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSBpbnRlZ2VyLgorLy8vCisvLy8gT3ZlcmxvYWRzIGZvciBzbWFsbGVyIGludGVnZXIgdHlwZXMgYXJlIG5vdCBwcm92aWRlZCB0byBlbnN1cmUgY29uc2lzdGVudAorLy8vIGJlaGF2aW9yIGluIHRoZSBwcmVzZW5jZSBvZiBpbnRlZ3JhbCBwcm9tb3Rpb25zLiBFc3NlbnRpYWxseSwKKy8vLyAiaGFzaF92YWx1ZSgnNCcpIiBhbmQgImhhc2hfdmFsdWUoJzAnICsgNCkiIHNob3VsZCBiZSB0aGUgc2FtZS4KK2lubGluZSBoYXNoX2NvZGUgaGFzaF9pbnRlZ2VyX3ZhbHVlKHVpbnQ2NF90IHZhbHVlKSB7CisgIC8vIFNpbWlsYXIgdG8gaGFzaF80dG84X2J5dGVzIGJ1dCB1c2luZyBhIHNlZWQgaW5zdGVhZCBvZiBsZW5ndGguCisgIGNvbnN0IHVpbnQ2NF90IHNlZWQgPSBnZXRfZXhlY3V0aW9uX3NlZWQoKTsKKyAgY29uc3QgY2hhciAqcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmdmFsdWUpOworICBjb25zdCB1aW50NjRfdCBhID0gZmV0Y2gzMihzKTsKKyAgcmV0dXJuIGhhc2hfMTZfYnl0ZXMoc2VlZCArIChhIDw8IDMpLCBmZXRjaDMyKHMgKyA0KSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgaGFzaGluZworCisvLyBEZWNsYXJlZCBhbmQgZG9jdW1lbnRlZCBhYm92ZSwgYnV0IGRlZmluZWQgaGVyZSBzbyB0aGF0IGFueSBvZiB0aGUgaGFzaGluZworLy8gaW5mcmFzdHJ1Y3R1cmUgaXMgYXZhaWxhYmxlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxpc19pbnRlZ3JhbF9vcl9lbnVtPFQ+Ojp2YWx1ZSwgaGFzaF9jb2RlPjo6dHlwZQoraGFzaF92YWx1ZShUIHZhbHVlKSB7CisgIHJldHVybiA6Omxsdm06Omhhc2hpbmc6OmRldGFpbDo6aGFzaF9pbnRlZ2VyX3ZhbHVlKAorICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHZhbHVlKSk7Cit9CisKKy8vIERlY2xhcmVkIGFuZCBkb2N1bWVudGVkIGFib3ZlLCBidXQgZGVmaW5lZCBoZXJlIHNvIHRoYXQgYW55IG9mIHRoZSBoYXNoaW5nCisvLyBpbmZyYXN0cnVjdHVyZSBpcyBhdmFpbGFibGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3QgVCAqcHRyKSB7CisgIHJldHVybiA6Omxsdm06Omhhc2hpbmc6OmRldGFpbDo6aGFzaF9pbnRlZ2VyX3ZhbHVlKAorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihwdHIpKTsKK30KKworLy8gRGVjbGFyZWQgYW5kIGRvY3VtZW50ZWQgYWJvdmUsIGJ1dCBkZWZpbmVkIGhlcmUgc28gdGhhdCBhbnkgb2YgdGhlIGhhc2hpbmcKKy8vIGluZnJhc3RydWN0dXJlIGlzIGF2YWlsYWJsZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoraGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3Qgc3RkOjpwYWlyPFQsIFU+ICZhcmcpIHsKKyAgcmV0dXJuIGhhc2hfY29tYmluZShhcmcuZmlyc3QsIGFyZy5zZWNvbmQpOworfQorCisvLyBEZWNsYXJlZCBhbmQgZG9jdW1lbnRlZCBhYm92ZSwgYnV0IGRlZmluZWQgaGVyZSBzbyB0aGF0IGFueSBvZiB0aGUgaGFzaGluZworLy8gaW5mcmFzdHJ1Y3R1cmUgaXMgYXZhaWxhYmxlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitoYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxUPiAmYXJnKSB7CisgIHJldHVybiBoYXNoX2NvbWJpbmVfcmFuZ2UoYXJnLmJlZ2luKCksIGFyZy5lbmQoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9JbW11dGFibGVMaXN0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9JbW11dGFibGVMaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBkNjNlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0ltbXV0YWJsZUxpc3QuaApAQCAtMCwwICsxLDIzNSBAQAorLy89PS0tLSBJbW11dGFibGVMaXN0LmggLSBJbW11dGFibGUgKGZ1bmN0aW9uYWwpIGxpc3QgaW50ZXJmYWNlIC0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgSW1tdXRhYmxlTGlzdCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0lNTVVUQUJMRUxJU1RfSAorI2RlZmluZSBMTFZNX0FEVF9JTU1VVEFCTEVMSVNUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG5ldz4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgSW1tdXRhYmxlTGlzdEZhY3Rvcnk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgSW1tdXRhYmxlTGlzdEltcGwgOiBwdWJsaWMgRm9sZGluZ1NldE5vZGUgeworICBmcmllbmQgY2xhc3MgSW1tdXRhYmxlTGlzdEZhY3Rvcnk8VD47CisKKyAgVCBIZWFkOworICBjb25zdCBJbW11dGFibGVMaXN0SW1wbCogVGFpbDsKKworICBJbW11dGFibGVMaXN0SW1wbChjb25zdCBUJiBoZWFkLCBjb25zdCBJbW11dGFibGVMaXN0SW1wbCogdGFpbCA9IG51bGxwdHIpCisgICAgOiBIZWFkKGhlYWQpLCBUYWlsKHRhaWwpIHt9CisKK3B1YmxpYzoKKyAgSW1tdXRhYmxlTGlzdEltcGwoY29uc3QgSW1tdXRhYmxlTGlzdEltcGwgJikgPSBkZWxldGU7CisgIEltbXV0YWJsZUxpc3RJbXBsICZvcGVyYXRvcj0oY29uc3QgSW1tdXRhYmxlTGlzdEltcGwgJikgPSBkZWxldGU7CisKKyAgY29uc3QgVCYgZ2V0SGVhZCgpIGNvbnN0IHsgcmV0dXJuIEhlYWQ7IH0KKyAgY29uc3QgSW1tdXRhYmxlTGlzdEltcGwqIGdldFRhaWwoKSBjb25zdCB7IHJldHVybiBUYWlsOyB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCYgSUQsIGNvbnN0IFQmIEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEltbXV0YWJsZUxpc3RJbXBsKiBMKXsKKyAgICBJRC5BZGRQb2ludGVyKEwpOworICAgIElELkFkZChIKTsKKyAgfQorCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgeworICAgIFByb2ZpbGUoSUQsIEhlYWQsIFRhaWwpOworICB9Cit9OworCisvLy8gSW1tdXRhYmxlTGlzdCAtIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBpbW11dGFibGUgKGZ1bmN0aW9uYWwpIGxpc3QuCisvLy8gIEl0IGlzIGltcGxlbWVudGVkIGFzIGEgc21hcnQgcG9pbnRlciAod3JhcHMgSW1tdXRhYmxlTGlzdEltcGwpLCBzbyBpdAorLy8vICBpdCBpcyBpbnRlbmRlZCB0byBhbHdheXMgYmUgY29waWVkIGJ5IHZhbHVlIGFzIGlmIGl0IHdlcmUgYSBwb2ludGVyLgorLy8vICBUaGlzIGludGVyZmFjZSBtYXRjaGVzIEltbXV0YWJsZVNldCBhbmQgSW1tdXRhYmxlTWFwLiAgSW1tdXRhYmxlTGlzdAorLy8vICBvYmplY3RzIHNob3VsZCBhbG1vc3QgbmV2ZXIgYmUgY3JlYXRlZCBkaXJlY3RseSwgYW5kIGluc3RlYWQgc2hvdWxkCisvLy8gIGJlIGNyZWF0ZWQgYnkgSW1tdXRhYmxlTGlzdEZhY3Rvcnkgb2JqZWN0cyB0aGF0IG1hbmFnZSB0aGUgbGlmZXRpbWUKKy8vLyAgb2YgYSBncm91cCBvZiBsaXN0cy4gIFdoZW4gdGhlIGZhY3Rvcnkgb2JqZWN0IGlzIHJlY2xhaW1lZCwgYWxsIGxpc3RzCisvLy8gIGNyZWF0ZWQgYnkgdGhhdCBmYWN0b3J5IGFyZSByZWxlYXNlZCBhcyB3ZWxsLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBJbW11dGFibGVMaXN0IHsKK3B1YmxpYzoKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IFQ7CisgIHVzaW5nIEZhY3RvcnkgPSBJbW11dGFibGVMaXN0RmFjdG9yeTxUPjsKKworcHJpdmF0ZToKKyAgY29uc3QgSW1tdXRhYmxlTGlzdEltcGw8VD4qIFg7CisKK3B1YmxpYzoKKyAgLy8gVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgbm9ybWFsbHkgb25seSBiZSBjYWxsZWQgYnkgSW1tdXRhYmxlTGlzdEZhY3Rvcnk8VD4uCisgIC8vIFRoZXJlIG1heSBiZSBjYXNlcywgaG93ZXZlciwgd2hlbiBvbmUgbmVlZHMgdG8gZXh0cmFjdCB0aGUgaW50ZXJuYWwgcG9pbnRlcgorICAvLyBhbmQgcmVjb25zdHJ1Y3QgYSBsaXN0IG9iamVjdCBmcm9tIHRoYXQgcG9pbnRlci4KKyAgSW1tdXRhYmxlTGlzdChjb25zdCBJbW11dGFibGVMaXN0SW1wbDxUPiogeCA9IG51bGxwdHIpIDogWCh4KSB7fQorCisgIGNvbnN0IEltbXV0YWJsZUxpc3RJbXBsPFQ+KiBnZXRJbnRlcm5hbFBvaW50ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFg7CisgIH0KKworICBjbGFzcyBpdGVyYXRvciB7CisgICAgY29uc3QgSW1tdXRhYmxlTGlzdEltcGw8VD4qIEwgPSBudWxscHRyOworCisgIHB1YmxpYzoKKyAgICBpdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgICBpdGVyYXRvcihJbW11dGFibGVMaXN0IGwpIDogTChsLmdldEludGVybmFsUG9pbnRlcigpKSB7fQorCisgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7IEwgPSBMLT5nZXRUYWlsKCk7IHJldHVybiAqdGhpczsgfQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgSSkgY29uc3QgeyByZXR1cm4gTCA9PSBJLkw7IH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIEkpIGNvbnN0IHsgcmV0dXJuIEwgIT0gSS5MOyB9CisgICAgY29uc3QgdmFsdWVfdHlwZSYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gTC0+Z2V0SGVhZCgpOyB9CisKKyAgICBJbW11dGFibGVMaXN0IGdldExpc3QoKSBjb25zdCB7IHJldHVybiBMOyB9CisgIH07CisKKyAgLy8vIGJlZ2luIC0gUmV0dXJucyBhbiBpdGVyYXRvciByZWZlcnJpbmcgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yCisgIC8vLyAgYW4gaXRlcmF0b3IgZGVub3RpbmcgdGhlIGVuZCBvZiB0aGUgbGlzdCBpZiB0aGUgbGlzdCBpcyBlbXB0eS4KKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihYKTsgfQorCisgIC8vLyBlbmQgLSBSZXR1cm5zIGFuIGl0ZXJhdG9yIGRlbm90aW5nIHRoZSBlbmQgb2YgdGhlIGxpc3QuICBUaGlzIGl0ZXJhdG9yCisgIC8vLyAgZG9lcyBub3QgcmVmZXIgdG8gYSB2YWxpZCBsaXN0IGVsZW1lbnQuCisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCk7IH0KKworICAvLy8gaXNFbXB0eSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGlzdCBpcyBlbXB0eS4KKyAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIVg7IH0KKworICBib29sIGNvbnRhaW5zKGNvbnN0IFQmIFYpIGNvbnN0IHsKKyAgICBmb3IgKGl0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoKkkgPT0gVikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBpc0VxdWFsIC0gUmV0dXJucyB0cnVlIGlmIHR3byBsaXN0cyBhcmUgZXF1YWwuICBCZWNhdXNlIGFsbCBsaXN0cyBjcmVhdGVkCisgIC8vLyAgZnJvbSB0aGUgc2FtZSBJbW11dGFibGVMaXN0RmFjdG9yeSBhcmUgdW5pcXVlZCwgdGhpcyBoYXMgTygxKSBjb21wbGV4aXR5CisgIC8vLyAgYmVjYXVzZSBpdCB0aGUgY29udGVudHMgb2YgdGhlIGxpc3QgZG8gbm90IG5lZWQgdG8gYmUgY29tcGFyZWQuICBOb3RlCisgIC8vLyAgdGhhdCB5b3Ugc2hvdWxkIG9ubHkgY29tcGFyZSB0d28gbGlzdHMgY3JlYXRlZCBmcm9tIHRoZSBzYW1lCisgIC8vLyAgSW1tdXRhYmxlTGlzdEZhY3RvcnkuCisgIGJvb2wgaXNFcXVhbChjb25zdCBJbW11dGFibGVMaXN0JiBMKSBjb25zdCB7IHJldHVybiBYID09IEwuWDsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbW11dGFibGVMaXN0JiBMKSBjb25zdCB7IHJldHVybiBpc0VxdWFsKEwpOyB9CisKKyAgLy8vIGdldEhlYWQgLSBSZXR1cm5zIHRoZSBoZWFkIG9mIHRoZSBsaXN0LgorICBjb25zdCBUJiBnZXRIZWFkKCkgeworICAgIGFzc2VydCghaXNFbXB0eSgpICYmICJDYW5ub3QgZ2V0IHRoZSBoZWFkIG9mIGFuIGVtcHR5IGxpc3QuIik7CisgICAgcmV0dXJuIFgtPmdldEhlYWQoKTsKKyAgfQorCisgIC8vLyBnZXRUYWlsIC0gUmV0dXJucyB0aGUgdGFpbCBvZiB0aGUgbGlzdCwgd2hpY2ggaXMgYW5vdGhlciAocG9zc2libHkgZW1wdHkpCisgIC8vLyAgSW1tdXRhYmxlTGlzdC4KKyAgSW1tdXRhYmxlTGlzdCBnZXRUYWlsKCkgeworICAgIHJldHVybiBYID8gWC0+Z2V0VGFpbCgpIDogbnVsbHB0cjsKKyAgfQorCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgY29uc3QgeworICAgIElELkFkZFBvaW50ZXIoWCk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgSW1tdXRhYmxlTGlzdEZhY3RvcnkgeworICB1c2luZyBMaXN0VHkgPSBJbW11dGFibGVMaXN0SW1wbDxUPjsKKyAgdXNpbmcgQ2FjaGVUeSA9IEZvbGRpbmdTZXQ8TGlzdFR5PjsKKworICBDYWNoZVR5IENhY2hlOworICB1aW50cHRyX3QgQWxsb2NhdG9yOworCisgIGJvb2wgb3duc0FsbG9jYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gKEFsbG9jYXRvciAmIDB4MSkgPT0gMDsKKyAgfQorCisgIEJ1bXBQdHJBbGxvY2F0b3ImIGdldEFsbG9jYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVtcFB0ckFsbG9jYXRvcio+KEFsbG9jYXRvciAmIH4weDEpOworICB9CisKK3B1YmxpYzoKKyAgSW1tdXRhYmxlTGlzdEZhY3RvcnkoKQorICAgIDogQWxsb2NhdG9yKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihuZXcgQnVtcFB0ckFsbG9jYXRvcigpKSkge30KKworICBJbW11dGFibGVMaXN0RmFjdG9yeShCdW1wUHRyQWxsb2NhdG9yJiBBbGxvYykKKyAgOiBBbGxvY2F0b3IocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KCZBbGxvYykgfCAweDEpIHt9CisKKyAgfkltbXV0YWJsZUxpc3RGYWN0b3J5KCkgeworICAgIGlmIChvd25zQWxsb2NhdG9yKCkpIGRlbGV0ZSAmZ2V0QWxsb2NhdG9yKCk7CisgIH0KKworICBJbW11dGFibGVMaXN0PFQ+IGNvbmNhdChjb25zdCBUJiBIZWFkLCBJbW11dGFibGVMaXN0PFQ+IFRhaWwpIHsKKyAgICAvLyBQcm9maWxlIHRoZSBuZXcgbGlzdCB0byBzZWUgaWYgaXQgYWxyZWFkeSBleGlzdHMgaW4gb3VyIGNhY2hlLgorICAgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisgICAgdm9pZCogSW5zZXJ0UG9zOworCisgICAgY29uc3QgTGlzdFR5KiBUYWlsSW1wbCA9IFRhaWwuZ2V0SW50ZXJuYWxQb2ludGVyKCk7CisgICAgTGlzdFR5OjpQcm9maWxlKElELCBIZWFkLCBUYWlsSW1wbCk7CisgICAgTGlzdFR5KiBMID0gQ2FjaGUuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSW5zZXJ0UG9zKTsKKworICAgIGlmICghTCkgeworICAgICAgLy8gVGhlIGxpc3QgZG9lcyBub3QgZXhpc3QgaW4gb3VyIGNhY2hlLiAgQ3JlYXRlIGl0LgorICAgICAgQnVtcFB0ckFsbG9jYXRvciYgQSA9IGdldEFsbG9jYXRvcigpOworICAgICAgTCA9IChMaXN0VHkqKSBBLkFsbG9jYXRlPExpc3RUeT4oKTsKKyAgICAgIG5ldyAoTCkgTGlzdFR5KEhlYWQsIFRhaWxJbXBsKTsKKworICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgbGlzdCBpbnRvIHRoZSBjYWNoZS4KKyAgICAgIENhY2hlLkluc2VydE5vZGUoTCwgSW5zZXJ0UG9zKTsKKyAgICB9CisKKyAgICByZXR1cm4gTDsKKyAgfQorCisgIEltbXV0YWJsZUxpc3Q8VD4gYWRkKGNvbnN0IFQmIEQsIEltbXV0YWJsZUxpc3Q8VD4gTCkgeworICAgIHJldHVybiBjb25jYXQoRCwgTCk7CisgIH0KKworICBJbW11dGFibGVMaXN0PFQ+IGdldEVtcHR5TGlzdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW1tdXRhYmxlTGlzdDxUPihudWxscHRyKTsKKyAgfQorCisgIEltbXV0YWJsZUxpc3Q8VD4gY3JlYXRlKGNvbnN0IFQmIFgpIHsKKyAgICByZXR1cm4gQ29uY2F0KFgsIGdldEVtcHR5TGlzdCgpKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBhcnRpYWxseS1zcGVjaWFsaXplZCBUcmFpdHMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgRGVuc2VNYXBJbmZvOwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IERlbnNlTWFwSW5mbzxJbW11dGFibGVMaXN0PFQ+PiB7CisgIHN0YXRpYyBpbmxpbmUgSW1tdXRhYmxlTGlzdDxUPiBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxJbW11dGFibGVMaXN0SW1wbDxUPio+KC0xKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgSW1tdXRhYmxlTGlzdDxUPiBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8SW1tdXRhYmxlTGlzdEltcGw8VD4qPigtMik7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKEltbXV0YWJsZUxpc3Q8VD4gWCkgeworICAgIHVpbnRwdHJfdCBQdHJWYWwgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oWC5nZXRJbnRlcm5hbFBvaW50ZXIoKSk7CisgICAgcmV0dXJuICh1bnNpZ25lZCgodWludHB0cl90KVB0clZhbCkgPj4gNCkgXgorICAgICAgICAgICAodW5zaWduZWQoKHVpbnRwdHJfdClQdHJWYWwpID4+IDkpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChJbW11dGFibGVMaXN0PFQ+IFgxLCBJbW11dGFibGVMaXN0PFQ+IFgyKSB7CisgICAgcmV0dXJuIFgxID09IFgyOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlzUG9kTGlrZTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGlzUG9kTGlrZTxJbW11dGFibGVMaXN0PFQ+PiB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX0lNTVVUQUJMRUxJU1RfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvSW1tdXRhYmxlTWFwLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9JbW11dGFibGVNYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGQxZTFmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvSW1tdXRhYmxlTWFwLmgKQEAgLTAsMCArMSw0MTQgQEAKKy8vPT09LS0tIEltbXV0YWJsZU1hcC5oIC0gSW1tdXRhYmxlIChmdW5jdGlvbmFsKSBtYXAgaW50ZXJmYWNlIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEltbXV0YWJsZU1hcCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0lNTVVUQUJMRU1BUF9ICisjZGVmaW5lIExMVk1fQURUX0lNTVVUQUJMRU1BUF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW1tdXRhYmxlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEltdXRLZXlWYWx1ZUluZm8gLVRyYWl0cyBjbGFzcyB1c2VkIGJ5IEltbXV0YWJsZU1hcC4gIFdoaWxlIGJvdGggdGhlIGZpcnN0CisvLy8gYW5kIHNlY29uZCBlbGVtZW50cyBpbiBhIHBhaXIgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgcHJvZmlsZSBpbmZvcm1hdGlvbiwKKy8vLyBvbmx5IHRoZSBmaXJzdCBlbGVtZW50ICh0aGUga2V5KSBpcyB1c2VkIGJ5IGlzRXF1YWwgYW5kIGlzTGVzcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBTPgorc3RydWN0IEltdXRLZXlWYWx1ZUluZm8geworICB1c2luZyB2YWx1ZV90eXBlID0gY29uc3Qgc3RkOjpwYWlyPFQsUz47CisgIHVzaW5nIHZhbHVlX3R5cGVfcmVmID0gY29uc3QgdmFsdWVfdHlwZSY7CisgIHVzaW5nIGtleV90eXBlID0gY29uc3QgVDsKKyAgdXNpbmcga2V5X3R5cGVfcmVmID0gY29uc3QgVCY7CisgIHVzaW5nIGRhdGFfdHlwZSA9IGNvbnN0IFM7CisgIHVzaW5nIGRhdGFfdHlwZV9yZWYgPSBjb25zdCBTJjsKKworICBzdGF0aWMgaW5saW5lIGtleV90eXBlX3JlZiBLZXlPZlZhbHVlKHZhbHVlX3R5cGVfcmVmIFYpIHsKKyAgICByZXR1cm4gVi5maXJzdDsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgZGF0YV90eXBlX3JlZiBEYXRhT2ZWYWx1ZSh2YWx1ZV90eXBlX3JlZiBWKSB7CisgICAgcmV0dXJuIFYuc2Vjb25kOworICB9CisKKyAgc3RhdGljIGlubGluZSBib29sIGlzRXF1YWwoa2V5X3R5cGVfcmVmIEwsIGtleV90eXBlX3JlZiBSKSB7CisgICAgcmV0dXJuIEltdXRDb250YWluZXJJbmZvPFQ+Ojppc0VxdWFsKEwsUik7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGlzTGVzcyhrZXlfdHlwZV9yZWYgTCwga2V5X3R5cGVfcmVmIFIpIHsKKyAgICByZXR1cm4gSW11dENvbnRhaW5lckluZm88VD46OmlzTGVzcyhMLFIpOworICB9CisKKyAgc3RhdGljIGlubGluZSBib29sIGlzRGF0YUVxdWFsKGRhdGFfdHlwZV9yZWYgTCwgZGF0YV90eXBlX3JlZiBSKSB7CisgICAgcmV0dXJuIEltdXRDb250YWluZXJJbmZvPFM+Ojppc0VxdWFsKEwsUik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEJiBJRCwgdmFsdWVfdHlwZV9yZWYgVikgeworICAgIEltdXRDb250YWluZXJJbmZvPFQ+OjpQcm9maWxlKElELCBWLmZpcnN0KTsKKyAgICBJbXV0Q29udGFpbmVySW5mbzxTPjo6UHJvZmlsZShJRCwgVi5zZWNvbmQpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwKKyAgICAgICAgICB0eXBlbmFtZSBWYWxJbmZvID0gSW11dEtleVZhbHVlSW5mbzxLZXlULFZhbFQ+PgorY2xhc3MgSW1tdXRhYmxlTWFwIHsKK3B1YmxpYzoKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIFZhbEluZm86OnZhbHVlX3R5cGU7CisgIHVzaW5nIHZhbHVlX3R5cGVfcmVmID0gdHlwZW5hbWUgVmFsSW5mbzo6dmFsdWVfdHlwZV9yZWY7CisgIHVzaW5nIGtleV90eXBlID0gdHlwZW5hbWUgVmFsSW5mbzo6a2V5X3R5cGU7CisgIHVzaW5nIGtleV90eXBlX3JlZiA9IHR5cGVuYW1lIFZhbEluZm86OmtleV90eXBlX3JlZjsKKyAgdXNpbmcgZGF0YV90eXBlID0gdHlwZW5hbWUgVmFsSW5mbzo6ZGF0YV90eXBlOworICB1c2luZyBkYXRhX3R5cGVfcmVmID0gdHlwZW5hbWUgVmFsSW5mbzo6ZGF0YV90eXBlX3JlZjsKKyAgdXNpbmcgVHJlZVR5ID0gSW11dEFWTFRyZWU8VmFsSW5mbz47CisKK3Byb3RlY3RlZDoKKyAgVHJlZVR5KiBSb290OworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3RzIGEgbWFwIGZyb20gYSBwb2ludGVyIHRvIGEgdHJlZSByb290LiAgSW4gZ2VuZXJhbCBvbmUKKyAgLy8vIHNob3VsZCB1c2UgYSBGYWN0b3J5IG9iamVjdCB0byBjcmVhdGUgbWFwcyBpbnN0ZWFkIG9mIGRpcmVjdGx5CisgIC8vLyBpbnZva2luZyB0aGUgY29uc3RydWN0b3IsIGJ1dCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgbWFrZSB0aGlzCisgIC8vLyBjb25zdHJ1Y3RvciBwdWJsaWMgaXMgdXNlZnVsLgorICBleHBsaWNpdCBJbW11dGFibGVNYXAoY29uc3QgVHJlZVR5KiBSKSA6IFJvb3QoY29uc3RfY2FzdDxUcmVlVHkqPihSKSkgeworICAgIGlmIChSb290KSB7IFJvb3QtPnJldGFpbigpOyB9CisgIH0KKworICBJbW11dGFibGVNYXAoY29uc3QgSW1tdXRhYmxlTWFwICZYKSA6IFJvb3QoWC5Sb290KSB7CisgICAgaWYgKFJvb3QpIHsgUm9vdC0+cmV0YWluKCk7IH0KKyAgfQorCisgIH5JbW11dGFibGVNYXAoKSB7CisgICAgaWYgKFJvb3QpIHsgUm9vdC0+cmVsZWFzZSgpOyB9CisgIH0KKworICBJbW11dGFibGVNYXAgJm9wZXJhdG9yPShjb25zdCBJbW11dGFibGVNYXAgJlgpIHsKKyAgICBpZiAoUm9vdCAhPSBYLlJvb3QpIHsKKyAgICAgIGlmIChYLlJvb3QpIHsgWC5Sb290LT5yZXRhaW4oKTsgfQorICAgICAgaWYgKFJvb3QpIHsgUm9vdC0+cmVsZWFzZSgpOyB9CisgICAgICBSb290ID0gWC5Sb290OworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjbGFzcyBGYWN0b3J5IHsKKyAgICB0eXBlbmFtZSBUcmVlVHk6OkZhY3RvcnkgRjsKKyAgICBjb25zdCBib29sIENhbm9uaWNhbGl6ZTsKKworICBwdWJsaWM6CisgICAgRmFjdG9yeShib29sIGNhbm9uaWNhbGl6ZSA9IHRydWUpIDogQ2Fub25pY2FsaXplKGNhbm9uaWNhbGl6ZSkge30KKworICAgIEZhY3RvcnkoQnVtcFB0ckFsbG9jYXRvciAmQWxsb2MsIGJvb2wgY2Fub25pY2FsaXplID0gdHJ1ZSkKKyAgICAgICAgOiBGKEFsbG9jKSwgQ2Fub25pY2FsaXplKGNhbm9uaWNhbGl6ZSkge30KKworICAgIEZhY3RvcnkoY29uc3QgRmFjdG9yeSAmKSA9IGRlbGV0ZTsKKyAgICBGYWN0b3J5ICZvcGVyYXRvcj0oY29uc3QgRmFjdG9yeSAmKSA9IGRlbGV0ZTsKKworICAgIEltbXV0YWJsZU1hcCBnZXRFbXB0eU1hcCgpIHsgcmV0dXJuIEltbXV0YWJsZU1hcChGLmdldEVtcHR5VHJlZSgpKTsgfQorCisgICAgSW1tdXRhYmxlTWFwIGFkZChJbW11dGFibGVNYXAgT2xkLCBrZXlfdHlwZV9yZWYgSywgZGF0YV90eXBlX3JlZiBEKSB7CisgICAgICBUcmVlVHkgKlQgPSBGLmFkZChPbGQuUm9vdCwgc3RkOjpwYWlyPGtleV90eXBlLGRhdGFfdHlwZT4oSyxEKSk7CisgICAgICByZXR1cm4gSW1tdXRhYmxlTWFwKENhbm9uaWNhbGl6ZSA/IEYuZ2V0Q2Fub25pY2FsVHJlZShUKTogVCk7CisgICAgfQorCisgICAgSW1tdXRhYmxlTWFwIHJlbW92ZShJbW11dGFibGVNYXAgT2xkLCBrZXlfdHlwZV9yZWYgSykgeworICAgICAgVHJlZVR5ICpUID0gRi5yZW1vdmUoT2xkLlJvb3QsSyk7CisgICAgICByZXR1cm4gSW1tdXRhYmxlTWFwKENhbm9uaWNhbGl6ZSA/IEYuZ2V0Q2Fub25pY2FsVHJlZShUKTogVCk7CisgICAgfQorCisgICAgdHlwZW5hbWUgVHJlZVR5OjpGYWN0b3J5ICpnZXRUcmVlRmFjdG9yeSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjb25zdF9jYXN0PHR5cGVuYW1lIFRyZWVUeTo6RmFjdG9yeSAqPigmRik7CisgICAgfQorICB9OworCisgIGJvb2wgY29udGFpbnMoa2V5X3R5cGVfcmVmIEspIGNvbnN0IHsKKyAgICByZXR1cm4gUm9vdCA/IFJvb3QtPmNvbnRhaW5zKEspIDogZmFsc2U7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW1tdXRhYmxlTWFwICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gUm9vdCAmJiBSSFMuUm9vdCA/IFJvb3QtPmlzRXF1YWwoKlJIUy5Sb290KSA6IFJvb3QgPT0gUkhTLlJvb3Q7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgSW1tdXRhYmxlTWFwICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gUm9vdCAmJiBSSFMuUm9vdCA/IFJvb3QtPmlzTm90RXF1YWwoKlJIUy5Sb290KSA6IFJvb3QgIT0gUkhTLlJvb3Q7CisgIH0KKworICBUcmVlVHkgKmdldFJvb3QoKSBjb25zdCB7CisgICAgaWYgKFJvb3QpIHsgUm9vdC0+cmV0YWluKCk7IH0KKyAgICByZXR1cm4gUm9vdDsKKyAgfQorCisgIFRyZWVUeSAqZ2V0Um9vdFdpdGhvdXRSZXRhaW4oKSBjb25zdCB7IHJldHVybiBSb290OyB9CisKKyAgdm9pZCBtYW51YWxSZXRhaW4oKSB7CisgICAgaWYgKFJvb3QpIFJvb3QtPnJldGFpbigpOworICB9CisKKyAgdm9pZCBtYW51YWxSZWxlYXNlKCkgeworICAgIGlmIChSb290KSBSb290LT5yZWxlYXNlKCk7CisgIH0KKworICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiAhUm9vdDsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBGb3JlYWNoIC0gQSBsaW1pdGVkIGZvcm0gb2YgbWFwIGl0ZXJhdGlvbi4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYWxsYmFjaz4KKyAgc3RydWN0IENCV3JhcHBlciB7CisgICAgQ2FsbGJhY2sgQzsKKworICAgIHZvaWQgb3BlcmF0b3IoKSh2YWx1ZV90eXBlX3JlZiBWKSB7IEMoVi5maXJzdCxWLnNlY29uZCk7IH0KKyAgfTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FsbGJhY2s+CisgIHN0cnVjdCBDQldyYXBwZXJSZWYgeworICAgIENhbGxiYWNrICZDOworCisgICAgQ0JXcmFwcGVyUmVmKENhbGxiYWNrJiBjKSA6IEMoYykge30KKworICAgIHZvaWQgb3BlcmF0b3IoKSh2YWx1ZV90eXBlX3JlZiBWKSB7IEMoVi5maXJzdCxWLnNlY29uZCk7IH0KKyAgfTsKKworcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FsbGJhY2s+CisgIHZvaWQgZm9yZWFjaChDYWxsYmFjayYgQykgeworICAgIGlmIChSb290KSB7CisgICAgICBDQldyYXBwZXJSZWY8Q2FsbGJhY2s+IENCKEMpOworICAgICAgUm9vdC0+Zm9yZWFjaChDQik7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENhbGxiYWNrPgorICB2b2lkIGZvcmVhY2goKSB7CisgICAgaWYgKFJvb3QpIHsKKyAgICAgIENCV3JhcHBlcjxDYWxsYmFjaz4gQ0I7CisgICAgICBSb290LT5mb3JlYWNoKENCKTsKKyAgICB9CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gRm9yIHRlc3RpbmcuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIHZvaWQgdmVyaWZ5KCkgY29uc3QgeyBpZiAoUm9vdCkgUm9vdC0+dmVyaWZ5KCk7IH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSXRlcmF0b3JzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBjbGFzcyBpdGVyYXRvciA6IHB1YmxpYyBJbXV0QVZMVmFsdWVJdGVyYXRvcjxJbW11dGFibGVNYXA+IHsKKyAgICBmcmllbmQgY2xhc3MgSW1tdXRhYmxlTWFwOworCisgICAgaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgICAgZXhwbGljaXQgaXRlcmF0b3IoVHJlZVR5ICpUcmVlKSA6IGl0ZXJhdG9yOjpJbXV0QVZMVmFsdWVJdGVyYXRvcihUcmVlKSB7fQorCisgIHB1YmxpYzoKKyAgICBrZXlfdHlwZV9yZWYgZ2V0S2V5KCkgY29uc3QgeyByZXR1cm4gKCp0aGlzKS0+Zmlyc3Q7IH0KKyAgICBkYXRhX3R5cGVfcmVmIGdldERhdGEoKSBjb25zdCB7IHJldHVybiAoKnRoaXMpLT5zZWNvbmQ7IH0KKyAgfTsKKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKFJvb3QpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCk7IH0KKworICBkYXRhX3R5cGUqIGxvb2t1cChrZXlfdHlwZV9yZWYgSykgY29uc3QgeworICAgIGlmIChSb290KSB7CisgICAgICBUcmVlVHkqIFQgPSBSb290LT5maW5kKEspOworICAgICAgaWYgKFQpIHJldHVybiAmVC0+Z2V0VmFsdWUoKS5zZWNvbmQ7CisgICAgfQorCisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gZ2V0TWF4RWxlbWVudCAtIFJldHVybnMgdGhlIDxrZXksdmFsdWU+IHBhaXIgaW4gdGhlIEltbXV0YWJsZU1hcCBmb3IKKyAgLy8vICB3aGljaCBrZXkgaXMgdGhlIGhpZ2hlc3QgaW4gdGhlIG9yZGVyaW5nIG9mIGtleXMgaW4gdGhlIG1hcC4gIFRoaXMKKyAgLy8vICBtZXRob2QgcmV0dXJucyBOVUxMIGlmIHRoZSBtYXAgaXMgZW1wdHkuCisgIHZhbHVlX3R5cGUqIGdldE1heEVsZW1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIFJvb3QgPyAmKFJvb3QtPmdldE1heEVsZW1lbnQoKS0+Z2V0VmFsdWUoKSkgOiBudWxscHRyOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFV0aWxpdHkgbWV0aG9kcy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgdW5zaWduZWQgZ2V0SGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gUm9vdCA/IFJvb3QtPmdldEhlaWdodCgpIDogMDsgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQmIElELCBjb25zdCBJbW11dGFibGVNYXAmIE0pIHsKKyAgICBJRC5BZGRQb2ludGVyKE0uUm9vdCk7CisgIH0KKworICBpbmxpbmUgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdCB7CisgICAgcmV0dXJuIFByb2ZpbGUoSUQsKnRoaXMpOworICB9Cit9OworCisvLyBOT1RFOiBUaGlzIHdpbGwgcG9zc2libHkgYmVjb21lIHRoZSBuZXcgaW1wbGVtZW50YXRpb24gb2YgSW1tdXRhYmxlTWFwIHNvbWUgZGF5LgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsCit0eXBlbmFtZSBWYWxJbmZvID0gSW11dEtleVZhbHVlSW5mbzxLZXlULFZhbFQ+PgorY2xhc3MgSW1tdXRhYmxlTWFwUmVmIHsKK3B1YmxpYzoKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIFZhbEluZm86OnZhbHVlX3R5cGU7CisgIHVzaW5nIHZhbHVlX3R5cGVfcmVmID0gdHlwZW5hbWUgVmFsSW5mbzo6dmFsdWVfdHlwZV9yZWY7CisgIHVzaW5nIGtleV90eXBlID0gdHlwZW5hbWUgVmFsSW5mbzo6a2V5X3R5cGU7CisgIHVzaW5nIGtleV90eXBlX3JlZiA9IHR5cGVuYW1lIFZhbEluZm86OmtleV90eXBlX3JlZjsKKyAgdXNpbmcgZGF0YV90eXBlID0gdHlwZW5hbWUgVmFsSW5mbzo6ZGF0YV90eXBlOworICB1c2luZyBkYXRhX3R5cGVfcmVmID0gdHlwZW5hbWUgVmFsSW5mbzo6ZGF0YV90eXBlX3JlZjsKKyAgdXNpbmcgVHJlZVR5ID0gSW11dEFWTFRyZWU8VmFsSW5mbz47CisgIHVzaW5nIEZhY3RvcnlUeSA9IHR5cGVuYW1lIFRyZWVUeTo6RmFjdG9yeTsKKworcHJvdGVjdGVkOgorICBUcmVlVHkgKlJvb3Q7CisgIEZhY3RvcnlUeSAqRmFjdG9yeTsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0cyBhIG1hcCBmcm9tIGEgcG9pbnRlciB0byBhIHRyZWUgcm9vdC4gIEluIGdlbmVyYWwgb25lCisgIC8vLyBzaG91bGQgdXNlIGEgRmFjdG9yeSBvYmplY3QgdG8gY3JlYXRlIG1hcHMgaW5zdGVhZCBvZiBkaXJlY3RseQorICAvLy8gaW52b2tpbmcgdGhlIGNvbnN0cnVjdG9yLCBidXQgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIG1ha2UgdGhpcworICAvLy8gY29uc3RydWN0b3IgcHVibGljIGlzIHVzZWZ1bC4KKyAgZXhwbGljaXQgSW1tdXRhYmxlTWFwUmVmKGNvbnN0IFRyZWVUeSAqUiwgRmFjdG9yeVR5ICpGKQorICAgICAgOiBSb290KGNvbnN0X2Nhc3Q8VHJlZVR5ICo+KFIpKSwgRmFjdG9yeShGKSB7CisgICAgaWYgKFJvb3QpIHsKKyAgICAgIFJvb3QtPnJldGFpbigpOworICAgIH0KKyAgfQorCisgIGV4cGxpY2l0IEltbXV0YWJsZU1hcFJlZihjb25zdCBJbW11dGFibGVNYXA8S2V5VCwgVmFsVD4gJlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBJbW11dGFibGVNYXA8S2V5VCwgVmFsVD46OkZhY3RvcnkgJkYpCisgICAgOiBSb290KFguZ2V0Um9vdFdpdGhvdXRSZXRhaW4oKSksCisgICAgICBGYWN0b3J5KEYuZ2V0VHJlZUZhY3RvcnkoKSkgeworICAgIGlmIChSb290KSB7IFJvb3QtPnJldGFpbigpOyB9CisgIH0KKworICBJbW11dGFibGVNYXBSZWYoY29uc3QgSW1tdXRhYmxlTWFwUmVmICZYKSA6IFJvb3QoWC5Sb290KSwgRmFjdG9yeShYLkZhY3RvcnkpIHsKKyAgICBpZiAoUm9vdCkgeworICAgICAgUm9vdC0+cmV0YWluKCk7CisgICAgfQorICB9CisKKyAgfkltbXV0YWJsZU1hcFJlZigpIHsKKyAgICBpZiAoUm9vdCkKKyAgICAgIFJvb3QtPnJlbGVhc2UoKTsKKyAgfQorCisgIEltbXV0YWJsZU1hcFJlZiAmb3BlcmF0b3I9KGNvbnN0IEltbXV0YWJsZU1hcFJlZiAmWCkgeworICAgIGlmIChSb290ICE9IFguUm9vdCkgeworICAgICAgaWYgKFguUm9vdCkKKyAgICAgICAgWC5Sb290LT5yZXRhaW4oKTsKKworICAgICAgaWYgKFJvb3QpCisgICAgICAgIFJvb3QtPnJlbGVhc2UoKTsKKworICAgICAgUm9vdCA9IFguUm9vdDsKKyAgICAgIEZhY3RvcnkgPSBYLkZhY3Rvcnk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgSW1tdXRhYmxlTWFwUmVmIGdldEVtcHR5TWFwKEZhY3RvcnlUeSAqRikgeworICAgIHJldHVybiBJbW11dGFibGVNYXBSZWYoMCwgRik7CisgIH0KKworICB2b2lkIG1hbnVhbFJldGFpbigpIHsKKyAgICBpZiAoUm9vdCkgUm9vdC0+cmV0YWluKCk7CisgIH0KKworICB2b2lkIG1hbnVhbFJlbGVhc2UoKSB7CisgICAgaWYgKFJvb3QpIFJvb3QtPnJlbGVhc2UoKTsKKyAgfQorCisgIEltbXV0YWJsZU1hcFJlZiBhZGQoa2V5X3R5cGVfcmVmIEssIGRhdGFfdHlwZV9yZWYgRCkgY29uc3QgeworICAgIFRyZWVUeSAqTmV3VCA9IEZhY3RvcnktPmFkZChSb290LCBzdGQ6OnBhaXI8a2V5X3R5cGUsIGRhdGFfdHlwZT4oSywgRCkpOworICAgIHJldHVybiBJbW11dGFibGVNYXBSZWYoTmV3VCwgRmFjdG9yeSk7CisgIH0KKworICBJbW11dGFibGVNYXBSZWYgcmVtb3ZlKGtleV90eXBlX3JlZiBLKSBjb25zdCB7CisgICAgVHJlZVR5ICpOZXdUID0gRmFjdG9yeS0+cmVtb3ZlKFJvb3QsIEspOworICAgIHJldHVybiBJbW11dGFibGVNYXBSZWYoTmV3VCwgRmFjdG9yeSk7CisgIH0KKworICBib29sIGNvbnRhaW5zKGtleV90eXBlX3JlZiBLKSBjb25zdCB7CisgICAgcmV0dXJuIFJvb3QgPyBSb290LT5jb250YWlucyhLKSA6IGZhbHNlOworICB9CisKKyAgSW1tdXRhYmxlTWFwPEtleVQsIFZhbFQ+IGFzSW1tdXRhYmxlTWFwKCkgY29uc3QgeworICAgIHJldHVybiBJbW11dGFibGVNYXA8S2V5VCwgVmFsVD4oRmFjdG9yeS0+Z2V0Q2Fub25pY2FsVHJlZShSb290KSk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW1tdXRhYmxlTWFwUmVmICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gUm9vdCAmJiBSSFMuUm9vdCA/IFJvb3QtPmlzRXF1YWwoKlJIUy5Sb290KSA6IFJvb3QgPT0gUkhTLlJvb3Q7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgSW1tdXRhYmxlTWFwUmVmICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gUm9vdCAmJiBSSFMuUm9vdCA/IFJvb3QtPmlzTm90RXF1YWwoKlJIUy5Sb290KSA6IFJvb3QgIT0gUkhTLlJvb3Q7CisgIH0KKworICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiAhUm9vdDsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBGb3IgdGVzdGluZy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgdm9pZCB2ZXJpZnkoKSBjb25zdCB7CisgICAgaWYgKFJvb3QpCisgICAgICBSb290LT52ZXJpZnkoKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJdGVyYXRvcnMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIGNsYXNzIGl0ZXJhdG9yIDogcHVibGljIEltdXRBVkxWYWx1ZUl0ZXJhdG9yPEltbXV0YWJsZU1hcFJlZj4geworICAgIGZyaWVuZCBjbGFzcyBJbW11dGFibGVNYXBSZWY7CisKKyAgICBpdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCBpdGVyYXRvcihUcmVlVHkgKlRyZWUpIDogaXRlcmF0b3I6OkltdXRBVkxWYWx1ZUl0ZXJhdG9yKFRyZWUpIHt9CisKKyAgcHVibGljOgorICAgIGtleV90eXBlX3JlZiBnZXRLZXkoKSBjb25zdCB7IHJldHVybiAoKnRoaXMpLT5maXJzdDsgfQorICAgIGRhdGFfdHlwZV9yZWYgZ2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuICgqdGhpcyktPnNlY29uZDsgfQorICB9OworCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoUm9vdCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKTsgfQorCisgIGRhdGFfdHlwZSAqbG9va3VwKGtleV90eXBlX3JlZiBLKSBjb25zdCB7CisgICAgaWYgKFJvb3QpIHsKKyAgICAgIFRyZWVUeSogVCA9IFJvb3QtPmZpbmQoSyk7CisgICAgICBpZiAoVCkgcmV0dXJuICZULT5nZXRWYWx1ZSgpLnNlY29uZDsKKyAgICB9CisKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBnZXRNYXhFbGVtZW50IC0gUmV0dXJucyB0aGUgPGtleSx2YWx1ZT4gcGFpciBpbiB0aGUgSW1tdXRhYmxlTWFwIGZvcgorICAvLy8gIHdoaWNoIGtleSBpcyB0aGUgaGlnaGVzdCBpbiB0aGUgb3JkZXJpbmcgb2Yga2V5cyBpbiB0aGUgbWFwLiAgVGhpcworICAvLy8gIG1ldGhvZCByZXR1cm5zIE5VTEwgaWYgdGhlIG1hcCBpcyBlbXB0eS4KKyAgdmFsdWVfdHlwZSogZ2V0TWF4RWxlbWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUm9vdCA/ICYoUm9vdC0+Z2V0TWF4RWxlbWVudCgpLT5nZXRWYWx1ZSgpKSA6IDA7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVXRpbGl0eSBtZXRob2RzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICB1bnNpZ25lZCBnZXRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBSb290ID8gUm9vdC0+Z2V0SGVpZ2h0KCkgOiAwOyB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQsIGNvbnN0IEltbXV0YWJsZU1hcFJlZiAmTSkgeworICAgIElELkFkZFBvaW50ZXIoTS5Sb290KTsKKyAgfQorCisgIGlubGluZSB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IHsgcmV0dXJuIFByb2ZpbGUoSUQsICp0aGlzKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX0lNTVVUQUJMRU1BUF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9JbW11dGFibGVTZXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0ltbXV0YWJsZVNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTgwYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9JbW11dGFibGVTZXQuaApAQCAtMCwwICsxLDEyMjQgQEAKKy8vPT09LS0tIEltbXV0YWJsZVNldC5oIC0gSW1tdXRhYmxlIChmdW5jdGlvbmFsKSBzZXQgaW50ZXJmYWNlIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEltdXRBVkxUcmVlIGFuZCBJbW11dGFibGVTZXQgY2xhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0lNTVVUQUJMRVNFVF9ICisjZGVmaW5lIExMVk1fQURUX0lNTVVUQUJMRVNFVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW1tdXRhYmxlIEFWTC1UcmVlIERlZmluaXRpb24uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW11dEluZm8+IGNsYXNzIEltdXRBVkxGYWN0b3J5OwordGVtcGxhdGUgPHR5cGVuYW1lIEltdXRJbmZvPiBjbGFzcyBJbXV0SW50ZXJ2YWxBVkxGYWN0b3J5OwordGVtcGxhdGUgPHR5cGVuYW1lIEltdXRJbmZvPiBjbGFzcyBJbXV0QVZMVHJlZUluT3JkZXJJdGVyYXRvcjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXV0SW5mbz4gY2xhc3MgSW11dEFWTFRyZWVHZW5lcmljSXRlcmF0b3I7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXV0SW5mbyA+CitjbGFzcyBJbXV0QVZMVHJlZSB7CitwdWJsaWM6CisgIHVzaW5nIGtleV90eXBlX3JlZiA9IHR5cGVuYW1lIEltdXRJbmZvOjprZXlfdHlwZV9yZWY7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBJbXV0SW5mbzo6dmFsdWVfdHlwZTsKKyAgdXNpbmcgdmFsdWVfdHlwZV9yZWYgPSB0eXBlbmFtZSBJbXV0SW5mbzo6dmFsdWVfdHlwZV9yZWY7CisgIHVzaW5nIEZhY3RvcnkgPSBJbXV0QVZMRmFjdG9yeTxJbXV0SW5mbz47CisgIHVzaW5nIGl0ZXJhdG9yID0gSW11dEFWTFRyZWVJbk9yZGVySXRlcmF0b3I8SW11dEluZm8+OworCisgIGZyaWVuZCBjbGFzcyBJbXV0QVZMRmFjdG9yeTxJbXV0SW5mbz47CisgIGZyaWVuZCBjbGFzcyBJbXV0SW50ZXJ2YWxBVkxGYWN0b3J5PEltdXRJbmZvPjsKKyAgZnJpZW5kIGNsYXNzIEltdXRBVkxUcmVlR2VuZXJpY0l0ZXJhdG9yPEltdXRJbmZvPjsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBQdWJsaWMgSW50ZXJmYWNlLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBsZWZ0IHN1YnRyZWUuICBUaGlzIHZhbHVlCisgIC8vLyAgaXMgTlVMTCBpZiB0aGVyZSBpcyBubyBsZWZ0IHN1YnRyZWUuCisgIEltdXRBVkxUcmVlICpnZXRMZWZ0KCkgY29uc3QgeyByZXR1cm4gbGVmdDsgfQorCisgIC8vLyBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByaWdodCBzdWJ0cmVlLiAgVGhpcyB2YWx1ZSBpcworICAvLy8gIE5VTEwgaWYgdGhlcmUgaXMgbm8gcmlnaHQgc3VidHJlZS4KKyAgSW11dEFWTFRyZWUgKmdldFJpZ2h0KCkgY29uc3QgeyByZXR1cm4gcmlnaHQ7IH0KKworICAvLy8gZ2V0SGVpZ2h0IC0gUmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSB0cmVlLiAgQSB0cmVlIHdpdGggbm8gc3VidHJlZXMKKyAgLy8vICBoYXMgYSBoZWlnaHQgb2YgMS4KKyAgdW5zaWduZWQgZ2V0SGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gaGVpZ2h0OyB9CisKKyAgLy8vIGdldFZhbHVlIC0gUmV0dXJucyB0aGUgZGF0YSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyZWUgbm9kZS4KKyAgY29uc3QgdmFsdWVfdHlwZSYgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZTsgfQorCisgIC8vLyBmaW5kIC0gRmluZHMgdGhlIHN1YnRyZWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IHZhbHVlLgorICAvLy8gIFRoaXMgbWV0aG9kIHJldHVybnMgTlVMTCBpZiBubyBtYXRjaGluZyBzdWJ0cmVlIGlzIGZvdW5kLgorICBJbXV0QVZMVHJlZSogZmluZChrZXlfdHlwZV9yZWYgSykgeworICAgIEltdXRBVkxUcmVlICpUID0gdGhpczsKKyAgICB3aGlsZSAoVCkgeworICAgICAga2V5X3R5cGVfcmVmIEN1cnJlbnRLZXkgPSBJbXV0SW5mbzo6S2V5T2ZWYWx1ZShULT5nZXRWYWx1ZSgpKTsKKyAgICAgIGlmIChJbXV0SW5mbzo6aXNFcXVhbChLLEN1cnJlbnRLZXkpKQorICAgICAgICByZXR1cm4gVDsKKyAgICAgIGVsc2UgaWYgKEltdXRJbmZvOjppc0xlc3MoSyxDdXJyZW50S2V5KSkKKyAgICAgICAgVCA9IFQtPmdldExlZnQoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgVCA9IFQtPmdldFJpZ2h0KCk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIGdldE1heEVsZW1lbnQgLSBGaW5kIHRoZSBzdWJ0cmVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGlnaGVzdCByYW5nZWQKKyAgLy8vICBrZXkgdmFsdWUuCisgIEltdXRBVkxUcmVlKiBnZXRNYXhFbGVtZW50KCkgeworICAgIEltdXRBVkxUcmVlICpUID0gdGhpczsKKyAgICBJbXV0QVZMVHJlZSAqUmlnaHQgPSBULT5nZXRSaWdodCgpOworICAgIHdoaWxlIChSaWdodCkgeyBUID0gUmlnaHQ7IFJpZ2h0ID0gVC0+Z2V0UmlnaHQoKTsgfQorICAgIHJldHVybiBUOworICB9CisKKyAgLy8vIHNpemUgLSBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIHRyZWUsIHdoaWNoIGluY2x1ZGVzCisgIC8vLyAgYm90aCBsZWF2ZXMgYW5kIG5vbi1sZWFmIG5vZGVzLgorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeworICAgIHVuc2lnbmVkIG4gPSAxOworICAgIGlmIChjb25zdCBJbXV0QVZMVHJlZSogTCA9IGdldExlZnQoKSkKKyAgICAgIG4gKz0gTC0+c2l6ZSgpOworICAgIGlmIChjb25zdCBJbXV0QVZMVHJlZSogUiA9IGdldFJpZ2h0KCkpCisgICAgICBuICs9IFItPnNpemUoKTsKKyAgICByZXR1cm4gbjsKKyAgfQorCisgIC8vLyBiZWdpbiAtIFJldHVybnMgYW4gaXRlcmF0b3IgdGhhdCBpdGVyYXRlcyBvdmVyIHRoZSBub2RlcyBvZiB0aGUgdHJlZQorICAvLy8gIGluIGFuIGlub3JkZXIgdHJhdmVyc2FsLiAgVGhlIHJldHVybmVkIGl0ZXJhdG9yIHRodXMgcmVmZXJzIHRvIHRoZQorICAvLy8gIHRoZSB0cmVlIG5vZGUgd2l0aCB0aGUgbWluaW11bSBkYXRhIGVsZW1lbnQuCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IodGhpcyk7IH0KKworICAvLy8gZW5kIC0gUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgdGhlIHRyZWUgdGhhdCBkZW5vdGVzIHRoZSBlbmQgb2YgYW4KKyAgLy8vICBpbm9yZGVyIHRyYXZlcnNhbC4KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKTsgfQorCisgIGJvb2wgaXNFbGVtZW50RXF1YWwodmFsdWVfdHlwZV9yZWYgVikgY29uc3QgeworICAgIC8vIENvbXBhcmUgdGhlIGtleXMuCisgICAgaWYgKCFJbXV0SW5mbzo6aXNFcXVhbChJbXV0SW5mbzo6S2V5T2ZWYWx1ZShnZXRWYWx1ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEltdXRJbmZvOjpLZXlPZlZhbHVlKFYpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEFsc28gY29tcGFyZSB0aGUgZGF0YSB2YWx1ZXMuCisgICAgaWYgKCFJbXV0SW5mbzo6aXNEYXRhRXF1YWwoSW11dEluZm86OkRhdGFPZlZhbHVlKGdldFZhbHVlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltdXRJbmZvOjpEYXRhT2ZWYWx1ZShWKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgaXNFbGVtZW50RXF1YWwoY29uc3QgSW11dEFWTFRyZWUqIFJIUykgY29uc3QgeworICAgIHJldHVybiBpc0VsZW1lbnRFcXVhbChSSFMtPmdldFZhbHVlKCkpOworICB9CisKKyAgLy8vIGlzRXF1YWwgLSBDb21wYXJlcyB0d28gdHJlZXMgZm9yIHN0cnVjdHVyYWwgZXF1YWxpdHkgYW5kIHJldHVybnMgdHJ1ZQorICAvLy8gICBpZiB0aGV5IGFyZSBlcXVhbC4gIFRoaXMgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBvZiB0aGlzIG9wZXJhdGlvbiBpcworICAvLyAgICBsaW5lYXIgaW4gdGhlIHNpemVzIG9mIHRoZSB0cmVlcy4KKyAgYm9vbCBpc0VxdWFsKGNvbnN0IEltdXRBVkxUcmVlJiBSSFMpIGNvbnN0IHsKKyAgICBpZiAoJlJIUyA9PSB0aGlzKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpdGVyYXRvciBMSXRyID0gYmVnaW4oKSwgTEVuZCA9IGVuZCgpOworICAgIGl0ZXJhdG9yIFJJdHIgPSBSSFMuYmVnaW4oKSwgUkVuZCA9IFJIUy5lbmQoKTsKKworICAgIHdoaWxlIChMSXRyICE9IExFbmQgJiYgUkl0ciAhPSBSRW5kKSB7CisgICAgICBpZiAoJipMSXRyID09ICYqUkl0cikgeworICAgICAgICBMSXRyLnNraXBTdWJUcmVlKCk7CisgICAgICAgIFJJdHIuc2tpcFN1YlRyZWUoKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmICghTEl0ci0+aXNFbGVtZW50RXF1YWwoJipSSXRyKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICArK0xJdHI7CisgICAgICArK1JJdHI7CisgICAgfQorCisgICAgcmV0dXJuIExJdHIgPT0gTEVuZCAmJiBSSXRyID09IFJFbmQ7CisgIH0KKworICAvLy8gaXNOb3RFcXVhbCAtIENvbXBhcmVzIHR3byB0cmVlcyBmb3Igc3RydWN0dXJhbCBpbmVxdWFsaXR5LiAgUGVyZm9ybWFuY2UKKyAgLy8vICBpcyB0aGUgc2FtZSBpcyBpc0VxdWFsLgorICBib29sIGlzTm90RXF1YWwoY29uc3QgSW11dEFWTFRyZWUmIFJIUykgY29uc3QgeyByZXR1cm4gIWlzRXF1YWwoUkhTKTsgfQorCisgIC8vLyBjb250YWlucyAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRyZWUgY29udGFpbnMgYSBzdWJ0cmVlIChub2RlKSB0aGF0CisgIC8vLyAgaGFzIGFuIGRhdGEgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBrZXkuICBDb21wbGV4aXR5CisgIC8vLyAgaXMgbG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIHRyZWUuCisgIGJvb2wgY29udGFpbnMoa2V5X3R5cGVfcmVmIEspIHsgcmV0dXJuIChib29sKSBmaW5kKEspOyB9CisKKyAgLy8vIGZvcmVhY2ggLSBBIG1lbWJlciB0ZW1wbGF0ZSB0aGUgYWNjZXB0cyBpbnZva2VzIG9wZXJhdG9yKCkgb24gYSBmdW5jdG9yCisgIC8vLyAgb2JqZWN0IChzcGVjaWZlZCBieSBDYWxsYmFjaykgZm9yIGV2ZXJ5IG5vZGUvc3VidHJlZSBpbiB0aGUgdHJlZS4KKyAgLy8vICBOb2RlcyBhcmUgdmlzaXRlZCB1c2luZyBhbiBpbm9yZGVyIHRyYXZlcnNhbC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENhbGxiYWNrPgorICB2b2lkIGZvcmVhY2goQ2FsbGJhY2smIEMpIHsKKyAgICBpZiAoSW11dEFWTFRyZWUqIEwgPSBnZXRMZWZ0KCkpCisgICAgICBMLT5mb3JlYWNoKEMpOworCisgICAgQyh2YWx1ZSk7CisKKyAgICBpZiAoSW11dEFWTFRyZWUqIFIgPSBnZXRSaWdodCgpKQorICAgICAgUi0+Zm9yZWFjaChDKTsKKyAgfQorCisgIC8vLyB2YWxpZGF0ZVRyZWUgLSBBIHV0aWxpdHkgbWV0aG9kIHRoYXQgY2hlY2tzIHRoYXQgdGhlIGJhbGFuY2luZyBhbmQKKyAgLy8vICBvcmRlcmluZyBpbnZhcmlhbnRzIG9mIHRoZSB0cmVlIGFyZSBzYXRpc2lmZWQuICBJdCBpcyBhIHJlY3Vyc2l2ZQorICAvLy8gIG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgdHJlZSwgd2hpY2ggaXMgdGhlbiBjb25zdW1lZAorICAvLy8gIGJ5IHRoZSBlbmNsb3NpbmcgdmFsaWRhdGVUcmVlIGNhbGwuICBFeHRlcm5hbCBjYWxsZXJzIHNob3VsZCBpZ25vcmUgdGhlCisgIC8vLyAgcmV0dXJuIHZhbHVlLiAgQW4gaW52YWxpZCB0cmVlIHdpbGwgY2F1c2UgYW4gYXNzZXJ0aW9uIHRvIGZpcmUgaW4KKyAgLy8vICBhIGRlYnVnIGJ1aWxkLgorICB1bnNpZ25lZCB2YWxpZGF0ZVRyZWUoKSBjb25zdCB7CisgICAgdW5zaWduZWQgSEwgPSBnZXRMZWZ0KCkgPyBnZXRMZWZ0KCktPnZhbGlkYXRlVHJlZSgpIDogMDsKKyAgICB1bnNpZ25lZCBIUiA9IGdldFJpZ2h0KCkgPyBnZXRSaWdodCgpLT52YWxpZGF0ZVRyZWUoKSA6IDA7CisgICAgKHZvaWQpIEhMOworICAgICh2b2lkKSBIUjsKKworICAgIGFzc2VydChnZXRIZWlnaHQoKSA9PSAoIEhMID4gSFIgPyBITCA6IEhSICkgKyAxCisgICAgICAgICAgICAmJiAiSGVpZ2h0IGNhbGN1bGF0aW9uIHdyb25nIik7CisKKyAgICBhc3NlcnQoKEhMID4gSFIgPyBITC1IUiA6IEhSLUhMKSA8PSAyCisgICAgICAgICAgICYmICJCYWxhbmNpbmcgaW52YXJpYW50IHZpb2xhdGVkIik7CisKKyAgICBhc3NlcnQoKCFnZXRMZWZ0KCkgfHwKKyAgICAgICAgICAgIEltdXRJbmZvOjppc0xlc3MoSW11dEluZm86OktleU9mVmFsdWUoZ2V0TGVmdCgpLT5nZXRWYWx1ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW11dEluZm86OktleU9mVmFsdWUoZ2V0VmFsdWUoKSkpKSAmJgorICAgICAgICAgICAiVmFsdWUgaW4gbGVmdCBjaGlsZCBpcyBub3QgbGVzcyB0aGF0IGN1cnJlbnQgdmFsdWUiKTsKKworCisgICAgYXNzZXJ0KCEoZ2V0UmlnaHQoKSB8fAorICAgICAgICAgICAgIEltdXRJbmZvOjppc0xlc3MoSW11dEluZm86OktleU9mVmFsdWUoZ2V0VmFsdWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXV0SW5mbzo6S2V5T2ZWYWx1ZShnZXRSaWdodCgpLT5nZXRWYWx1ZSgpKSkpICYmCisgICAgICAgICAgICJDdXJyZW50IHZhbHVlIGlzIG5vdCBsZXNzIHRoYXQgdmFsdWUgb2YgcmlnaHQgY2hpbGQiKTsKKworICAgIHJldHVybiBnZXRIZWlnaHQoKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEludGVybmFsIHZhbHVlcy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworcHJpdmF0ZToKKyAgRmFjdG9yeSAqZmFjdG9yeTsKKyAgSW11dEFWTFRyZWUgKmxlZnQ7CisgIEltdXRBVkxUcmVlICpyaWdodDsKKyAgSW11dEFWTFRyZWUgKnByZXYgPSBudWxscHRyOworICBJbXV0QVZMVHJlZSAqbmV4dCA9IG51bGxwdHI7CisKKyAgdW5zaWduZWQgaGVpZ2h0IDogMjg7CisgIGJvb2wgSXNNdXRhYmxlIDogMTsKKyAgYm9vbCBJc0RpZ2VzdENhY2hlZCA6IDE7CisgIGJvb2wgSXNDYW5vbmljYWxpemVkIDogMTsKKworICB2YWx1ZV90eXBlIHZhbHVlOworICB1aW50MzJfdCBkaWdlc3QgPSAwOworICB1aW50MzJfdCByZWZDb3VudCA9IDA7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSW50ZXJuYWwgbWV0aG9kcyAobm9kZSBtYW5pcHVsYXRpb247IHVzZWQgYnkgRmFjdG9yeSkuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ByaXZhdGU6CisgIC8vLyBJbXV0QVZMVHJlZSAtIEludGVybmFsIGNvbnN0cnVjdG9yIHRoYXQgaXMgb25seSBjYWxsZWQgYnkKKyAgLy8vICAgSW11dEFWTEZhY3RvcnkuCisgIEltdXRBVkxUcmVlKEZhY3RvcnkgKmYsIEltdXRBVkxUcmVlKiBsLCBJbXV0QVZMVHJlZSogciwgdmFsdWVfdHlwZV9yZWYgdiwKKyAgICAgICAgICAgICAgdW5zaWduZWQgaGVpZ2h0KQorICAgIDogZmFjdG9yeShmKSwgbGVmdChsKSwgcmlnaHQociksIGhlaWdodChoZWlnaHQpLCBJc011dGFibGUodHJ1ZSksCisgICAgICBJc0RpZ2VzdENhY2hlZChmYWxzZSksIElzQ2Fub25pY2FsaXplZChmYWxzZSksIHZhbHVlKHYpCisgIHsKKyAgICBpZiAobGVmdCkgbGVmdC0+cmV0YWluKCk7CisgICAgaWYgKHJpZ2h0KSByaWdodC0+cmV0YWluKCk7CisgIH0KKworICAvLy8gaXNNdXRhYmxlIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0IGFuZCByaWdodCBzdWJ0cmVlIHJlZmVyZW5jZXMKKyAgLy8vICAoYXMgd2VsbCBhcyBoZWlnaHQpIGNhbiBiZSBjaGFuZ2VkLiAgSWYgdGhpcyBtZXRob2QgcmV0dXJucyBmYWxzZSwKKyAgLy8vICB0aGUgdHJlZSBpcyB0cnVseSBpbW11dGFibGUuICBUcmVlcyByZXR1cm5lZCBmcm9tIGFuIEltdXRBVkxGYWN0b3J5CisgIC8vLyAgb2JqZWN0IHNob3VsZCBhbHdheXMgaGF2ZSB0aGlzIG1ldGhvZCByZXR1cm4gdHJ1ZS4gIEZ1cnRoZXIsIGlmIHRoaXMKKyAgLy8vICBtZXRob2QgcmV0dXJucyBmYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgSW11dEFWTFRyZWUsIGFsbCBzdWJ0cmVlcworICAvLy8gIHdpbGwgYWxzbyBoYXZlIHRoaXMgbWV0aG9kIHJldHVybiBmYWxzZS4gIFRoZSBjb252ZXJzZSBpcyBub3QgdHJ1ZS4KKyAgYm9vbCBpc011dGFibGUoKSBjb25zdCB7IHJldHVybiBJc011dGFibGU7IH0KKworICAvLy8gaGFzQ2FjaGVkRGlnZXN0IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBkaWdlc3QgZm9yIHRoaXMgdHJlZSBpcyBjYWNoZWQuCisgIC8vLyAgVGhpcyBjYW4gb25seSBiZSB0cnVlIGlmIHRoZSB0cmVlIGlzIGltbXV0YWJsZS4KKyAgYm9vbCBoYXNDYWNoZWREaWdlc3QoKSBjb25zdCB7IHJldHVybiBJc0RpZ2VzdENhY2hlZDsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE11dGF0aW5nIG9wZXJhdGlvbnMuICBBIHRyZWUgcm9vdCBjYW4gYmUgbWFuaXB1bGF0ZWQgYXMKKyAgLy8gbG9uZyBhcyBpdHMgcmVmZXJlbmNlIGhhcyBub3QgImVzY2FwZWQiIGZyb20gaW50ZXJuYWwKKyAgLy8gbWV0aG9kcyBvZiBhIGZhY3Rvcnkgb2JqZWN0IChzZWUgYmVsb3cpLiAgV2hlbiBhIHRyZWUKKyAgLy8gcG9pbnRlciBpcyBleHRlcm5hbGx5IHZpZXdhYmxlIGJ5IGNsaWVudCBjb2RlLCB0aGUKKyAgLy8gaW50ZXJuYWwgIm11dGFibGUgYml0IiBpcyBjbGVhcmVkIHRvIG1hcmsgdGhlIHRyZWUKKyAgLy8gaW1tdXRhYmxlLiAgTm90ZSB0aGF0IGEgdHJlZSB0aGF0IHN0aWxsIGhhcyBpdHMgbXV0YWJsZQorICAvLyBiaXQgc2V0IG1heSBoYXZlIGNoaWxkcmVuIChzdWJ0cmVlcykgdGhhdCBhcmUgdGhlbXNlbHZlcworICAvLyBpbW11dGFibGUuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIG1hcmtJbW11dGFibGUgLSBDbGVhcnMgdGhlIG11dGFibGUgZmxhZyBmb3IgYSB0cmVlLiAgQWZ0ZXIgdGhpcyBoYXBwZW5zLAorICAvLy8gICBpdCBpcyBhbiBlcnJvciB0byBjYWxsIHNldExlZnQoKSwgc2V0UmlnaHQoKSwgYW5kIHNldEhlaWdodCgpLgorICB2b2lkIG1hcmtJbW11dGFibGUoKSB7CisgICAgYXNzZXJ0KGlzTXV0YWJsZSgpICYmICJNdXRhYmxlIGZsYWcgYWxyZWFkeSByZW1vdmVkLiIpOworICAgIElzTXV0YWJsZSA9IGZhbHNlOworICB9CisKKyAgLy8vIG1hcmtlZENhY2hlZERpZ2VzdCAtIENsZWFycyB0aGUgTm9DYWNoZWREaWdlc3QgZmxhZyBmb3IgYSB0cmVlLgorICB2b2lkIG1hcmtlZENhY2hlZERpZ2VzdCgpIHsKKyAgICBhc3NlcnQoIWhhc0NhY2hlZERpZ2VzdCgpICYmICJOb0NhY2hlZERpZ2VzdCBmbGFnIGFscmVhZHkgcmVtb3ZlZC4iKTsKKyAgICBJc0RpZ2VzdENhY2hlZCA9IHRydWU7CisgIH0KKworICAvLy8gc2V0SGVpZ2h0IC0gQ2hhbmdlcyB0aGUgaGVpZ2h0IG9mIHRoZSB0cmVlLiAgVXNlZCBpbnRlcm5hbGx5IGJ5CisgIC8vLyAgSW11dEFWTEZhY3RvcnkuCisgIHZvaWQgc2V0SGVpZ2h0KHVuc2lnbmVkIGgpIHsKKyAgICBhc3NlcnQoaXNNdXRhYmxlKCkgJiYgIk9ubHkgYSBtdXRhYmxlIHRyZWUgY2FuIGhhdmUgaXRzIGhlaWdodCBjaGFuZ2VkLiIpOworICAgIGhlaWdodCA9IGg7CisgIH0KKworICBzdGF0aWMgdWludDMyX3QgY29tcHV0ZURpZ2VzdChJbXV0QVZMVHJlZSAqTCwgSW11dEFWTFRyZWUgKlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGVfcmVmIFYpIHsKKyAgICB1aW50MzJfdCBkaWdlc3QgPSAwOworCisgICAgaWYgKEwpCisgICAgICBkaWdlc3QgKz0gTC0+Y29tcHV0ZURpZ2VzdCgpOworCisgICAgLy8gQ29tcHV0ZSBkaWdlc3Qgb2Ygc3RvcmVkIGRhdGEuCisgICAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgICBJbXV0SW5mbzo6UHJvZmlsZShJRCxWKTsKKyAgICBkaWdlc3QgKz0gSUQuQ29tcHV0ZUhhc2goKTsKKworICAgIGlmIChSKQorICAgICAgZGlnZXN0ICs9IFItPmNvbXB1dGVEaWdlc3QoKTsKKworICAgIHJldHVybiBkaWdlc3Q7CisgIH0KKworICB1aW50MzJfdCBjb21wdXRlRGlnZXN0KCkgeworICAgIC8vIENoZWNrIHRoZSBsb3dlc3QgYml0IHRvIGRldGVybWluZSBpZiBkaWdlc3QgaGFzIGFjdHVhbGx5IGJlZW4KKyAgICAvLyBwcmUtY29tcHV0ZWQuCisgICAgaWYgKGhhc0NhY2hlZERpZ2VzdCgpKQorICAgICAgcmV0dXJuIGRpZ2VzdDsKKworICAgIHVpbnQzMl90IFggPSBjb21wdXRlRGlnZXN0KGdldExlZnQoKSwgZ2V0UmlnaHQoKSwgZ2V0VmFsdWUoKSk7CisgICAgZGlnZXN0ID0gWDsKKyAgICBtYXJrZWRDYWNoZWREaWdlc3QoKTsKKyAgICByZXR1cm4gWDsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFJlZmVyZW5jZSBjb3VudCBvcGVyYXRpb25zLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitwdWJsaWM6CisgIHZvaWQgcmV0YWluKCkgeyArK3JlZkNvdW50OyB9CisKKyAgdm9pZCByZWxlYXNlKCkgeworICAgIGFzc2VydChyZWZDb3VudCA+IDApOworICAgIGlmICgtLXJlZkNvdW50ID09IDApCisgICAgICBkZXN0cm95KCk7CisgIH0KKworICB2b2lkIGRlc3Ryb3koKSB7CisgICAgaWYgKGxlZnQpCisgICAgICBsZWZ0LT5yZWxlYXNlKCk7CisgICAgaWYgKHJpZ2h0KQorICAgICAgcmlnaHQtPnJlbGVhc2UoKTsKKyAgICBpZiAoSXNDYW5vbmljYWxpemVkKSB7CisgICAgICBpZiAobmV4dCkKKyAgICAgICAgbmV4dC0+cHJldiA9IHByZXY7CisKKyAgICAgIGlmIChwcmV2KQorICAgICAgICBwcmV2LT5uZXh0ID0gbmV4dDsKKyAgICAgIGVsc2UKKyAgICAgICAgZmFjdG9yeS0+Q2FjaGVbZmFjdG9yeS0+bWFza0NhY2hlSW5kZXgoY29tcHV0ZURpZ2VzdCgpKV0gPSBuZXh0OworICAgIH0KKworICAgIC8vIFdlIG5lZWQgdG8gY2xlYXIgdGhlIG11dGFiaWxpdHkgYml0IGluIGNhc2Ugd2UgYXJlCisgICAgLy8gZGVzdHJveWluZyB0aGUgbm9kZSBhcyBwYXJ0IG9mIGEgc3dlZXAgaW4gSW11dEFWTEZhY3Rvcnk6OnJlY292ZXJOb2RlcygpLgorICAgIElzTXV0YWJsZSA9IGZhbHNlOworICAgIGZhY3RvcnktPmZyZWVOb2Rlcy5wdXNoX2JhY2sodGhpcyk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbW11dGFibGUgQVZMLVRyZWUgRmFjdG9yeSBjbGFzcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXV0SW5mbyA+CitjbGFzcyBJbXV0QVZMRmFjdG9yeSB7CisgIGZyaWVuZCBjbGFzcyBJbXV0QVZMVHJlZTxJbXV0SW5mbz47CisKKyAgdXNpbmcgVHJlZVR5ID0gSW11dEFWTFRyZWU8SW11dEluZm8+OworICB1c2luZyB2YWx1ZV90eXBlX3JlZiA9IHR5cGVuYW1lIFRyZWVUeTo6dmFsdWVfdHlwZV9yZWY7CisgIHVzaW5nIGtleV90eXBlX3JlZiA9IHR5cGVuYW1lIFRyZWVUeTo6a2V5X3R5cGVfcmVmOworICB1c2luZyBDYWNoZVR5ID0gRGVuc2VNYXA8dW5zaWduZWQsIFRyZWVUeSo+OworCisgIENhY2hlVHkgQ2FjaGU7CisgIHVpbnRwdHJfdCBBbGxvY2F0b3I7CisgIHN0ZDo6dmVjdG9yPFRyZWVUeSo+IGNyZWF0ZWROb2RlczsKKyAgc3RkOjp2ZWN0b3I8VHJlZVR5Kj4gZnJlZU5vZGVzOworCisgIGJvb2wgb3duc0FsbG9jYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gKEFsbG9jYXRvciAmIDB4MSkgPT0gMDsKKyAgfQorCisgIEJ1bXBQdHJBbGxvY2F0b3ImIGdldEFsbG9jYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVtcFB0ckFsbG9jYXRvcio+KEFsbG9jYXRvciAmIH4weDEpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitwdWJsaWM6CisgIEltdXRBVkxGYWN0b3J5KCkKKyAgICA6IEFsbG9jYXRvcihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4obmV3IEJ1bXBQdHJBbGxvY2F0b3IoKSkpIHt9CisKKyAgSW11dEFWTEZhY3RvcnkoQnVtcFB0ckFsbG9jYXRvciYgQWxsb2MpCisgICAgOiBBbGxvY2F0b3IocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KCZBbGxvYykgfCAweDEpIHt9CisKKyAgfkltdXRBVkxGYWN0b3J5KCkgeworICAgIGlmIChvd25zQWxsb2NhdG9yKCkpIGRlbGV0ZSAmZ2V0QWxsb2NhdG9yKCk7CisgIH0KKworICBUcmVlVHkqIGFkZChUcmVlVHkqIFQsIHZhbHVlX3R5cGVfcmVmIFYpIHsKKyAgICBUID0gYWRkX2ludGVybmFsKFYsVCk7CisgICAgbWFya0ltbXV0YWJsZShUKTsKKyAgICByZWNvdmVyTm9kZXMoKTsKKyAgICByZXR1cm4gVDsKKyAgfQorCisgIFRyZWVUeSogcmVtb3ZlKFRyZWVUeSogVCwga2V5X3R5cGVfcmVmIFYpIHsKKyAgICBUID0gcmVtb3ZlX2ludGVybmFsKFYsVCk7CisgICAgbWFya0ltbXV0YWJsZShUKTsKKyAgICByZWNvdmVyTm9kZXMoKTsKKyAgICByZXR1cm4gVDsKKyAgfQorCisgIFRyZWVUeSogZ2V0RW1wdHlUcmVlKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQorCitwcm90ZWN0ZWQ6CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBIGJ1bmNoIG9mIHF1aWNrIGhlbHBlciBmdW5jdGlvbnMgdXNlZCBmb3IgcmVhc29uaW5nCisgIC8vIGFib3V0IHRoZSBwcm9wZXJ0aWVzIG9mIHRyZWVzIGFuZCB0aGVpciBjaGlsZHJlbi4KKyAgLy8gVGhlc2UgaGF2ZSBzdWNjaW5jdCBuYW1lcyBzbyB0aGF0IHRoZSBiYWxhbmNpbmcgY29kZQorICAvLyBpcyBhcyB0ZXJzZSAoYW5kIHJlYWRhYmxlKSBhcyBwb3NzaWJsZS4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgYm9vbCAgICAgICAgICAgIGlzRW1wdHkoVHJlZVR5KiBUKSBjb25zdCB7IHJldHVybiAhVDsgfQorICB1bnNpZ25lZCAgICAgICAgZ2V0SGVpZ2h0KFRyZWVUeSogVCkgY29uc3QgeyByZXR1cm4gVCA/IFQtPmdldEhlaWdodCgpIDogMDsgfQorICBUcmVlVHkqICAgICAgICAgZ2V0TGVmdChUcmVlVHkqIFQpIGNvbnN0IHsgcmV0dXJuIFQtPmdldExlZnQoKTsgfQorICBUcmVlVHkqICAgICAgICAgZ2V0UmlnaHQoVHJlZVR5KiBUKSBjb25zdCB7IHJldHVybiBULT5nZXRSaWdodCgpOyB9CisgIHZhbHVlX3R5cGVfcmVmICBnZXRWYWx1ZShUcmVlVHkqIFQpIGNvbnN0IHsgcmV0dXJuIFQtPnZhbHVlOyB9CisKKyAgLy8gTWFrZSBzdXJlIHRoZSBpbmRleCBpcyBub3QgdGhlIFRvbWJzdG9uZSBvciBFbnRyeSBrZXkgb2YgdGhlIERlbnNlTWFwLgorICBzdGF0aWMgdW5zaWduZWQgbWFza0NhY2hlSW5kZXgodW5zaWduZWQgSSkgeyByZXR1cm4gKEkgJiB+MHgwMik7IH0KKworICB1bnNpZ25lZCBpbmNyZW1lbnRIZWlnaHQoVHJlZVR5KiBMLCBUcmVlVHkqIFIpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBobCA9IGdldEhlaWdodChMKTsKKyAgICB1bnNpZ25lZCBociA9IGdldEhlaWdodChSKTsKKyAgICByZXR1cm4gKGhsID4gaHIgPyBobCA6IGhyKSArIDE7CisgIH0KKworICBzdGF0aWMgYm9vbCBjb21wYXJlVHJlZVdpdGhTZWN0aW9uKFRyZWVUeSogVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcmVlVHk6Oml0ZXJhdG9yJiBUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcmVlVHk6Oml0ZXJhdG9yJiBURSkgeworICAgIHR5cGVuYW1lIFRyZWVUeTo6aXRlcmF0b3IgSSA9IFQtPmJlZ2luKCksIEUgPSBULT5lbmQoKTsKKyAgICBmb3IgKCA7IEkhPUUgOyArK0ksICsrVEkpIHsKKyAgICAgIGlmIChUSSA9PSBURSB8fCAhSS0+aXNFbGVtZW50RXF1YWwoJipUSSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gImNyZWF0ZU5vZGUiIGlzIHVzZWQgdG8gZ2VuZXJhdGUgbmV3IHRyZWUgcm9vdHMgdGhhdCBsaW5rCisgIC8vIHRvIG90aGVyIHRyZWVzLiAgVGhlIGZ1bmN0b24gbWF5IGFsc28gc2ltcGx5IG1vdmUgbGlua3MKKyAgLy8gaW4gYW4gZXhpc3Rpbmcgcm9vdCBpZiB0aGF0IHJvb3QgaXMgc3RpbGwgbWFya2VkIG11dGFibGUuCisgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb3RoZXJ3aXNlIG91ciBiYWxhbmNpbmcgY29kZQorICAvLyB3b3VsZCBsZWFrIG1lbW9yeSBhcyBpdCB3b3VsZCBjcmVhdGUgbm9kZXMgdGhhdCBhcmUKKyAgLy8gdGhlbiBkaXNjYXJkZWQgbGF0ZXIgYmVmb3JlIHRoZSBmaW5pc2hlZCB0cmVlIGlzCisgIC8vIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIFRyZWVUeSogY3JlYXRlTm9kZShUcmVlVHkqIEwsIHZhbHVlX3R5cGVfcmVmIFYsIFRyZWVUeSogUikgeworICAgIEJ1bXBQdHJBbGxvY2F0b3ImIEEgPSBnZXRBbGxvY2F0b3IoKTsKKyAgICBUcmVlVHkqIFQ7CisgICAgaWYgKCFmcmVlTm9kZXMuZW1wdHkoKSkgeworICAgICAgVCA9IGZyZWVOb2Rlcy5iYWNrKCk7CisgICAgICBmcmVlTm9kZXMucG9wX2JhY2soKTsKKyAgICAgIGFzc2VydChUICE9IEwpOworICAgICAgYXNzZXJ0KFQgIT0gUik7CisgICAgfSBlbHNlIHsKKyAgICAgIFQgPSAoVHJlZVR5KikgQS5BbGxvY2F0ZTxUcmVlVHk+KCk7CisgICAgfQorICAgIG5ldyAoVCkgVHJlZVR5KHRoaXMsIEwsIFIsIFYsIGluY3JlbWVudEhlaWdodChMLFIpKTsKKyAgICBjcmVhdGVkTm9kZXMucHVzaF9iYWNrKFQpOworICAgIHJldHVybiBUOworICB9CisKKyAgVHJlZVR5KiBjcmVhdGVOb2RlKFRyZWVUeSogbmV3TGVmdCwgVHJlZVR5KiBvbGRUcmVlLCBUcmVlVHkqIG5ld1JpZ2h0KSB7CisgICAgcmV0dXJuIGNyZWF0ZU5vZGUobmV3TGVmdCwgZ2V0VmFsdWUob2xkVHJlZSksIG5ld1JpZ2h0KTsKKyAgfQorCisgIHZvaWQgcmVjb3Zlck5vZGVzKCkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIG4gPSBjcmVhdGVkTm9kZXMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7CisgICAgICBUcmVlVHkgKk4gPSBjcmVhdGVkTm9kZXNbaV07CisgICAgICBpZiAoTi0+aXNNdXRhYmxlKCkgJiYgTi0+cmVmQ291bnQgPT0gMCkKKyAgICAgICAgTi0+ZGVzdHJveSgpOworICAgIH0KKyAgICBjcmVhdGVkTm9kZXMuY2xlYXIoKTsKKyAgfQorCisgIC8vLyBiYWxhbmNlVHJlZSAtIFVzZWQgYnkgYWRkX2ludGVybmFsIGFuZCByZW1vdmVfaW50ZXJuYWwgdG8KKyAgLy8vICBiYWxhbmNlIGEgbmV3bHkgY3JlYXRlZCB0cmVlLgorICBUcmVlVHkqIGJhbGFuY2VUcmVlKFRyZWVUeSogTCwgdmFsdWVfdHlwZV9yZWYgViwgVHJlZVR5KiBSKSB7CisgICAgdW5zaWduZWQgaGwgPSBnZXRIZWlnaHQoTCk7CisgICAgdW5zaWduZWQgaHIgPSBnZXRIZWlnaHQoUik7CisKKyAgICBpZiAoaGwgPiBociArIDIpIHsKKyAgICAgIGFzc2VydCghaXNFbXB0eShMKSAmJiAiTGVmdCB0cmVlIGNhbm5vdCBiZSBlbXB0eSB0byBoYXZlIGEgaGVpZ2h0ID49IDIiKTsKKworICAgICAgVHJlZVR5ICpMTCA9IGdldExlZnQoTCk7CisgICAgICBUcmVlVHkgKkxSID0gZ2V0UmlnaHQoTCk7CisKKyAgICAgIGlmIChnZXRIZWlnaHQoTEwpID49IGdldEhlaWdodChMUikpCisgICAgICAgIHJldHVybiBjcmVhdGVOb2RlKExMLCBMLCBjcmVhdGVOb2RlKExSLFYsUikpOworCisgICAgICBhc3NlcnQoIWlzRW1wdHkoTFIpICYmICJMUiBjYW5ub3QgYmUgZW1wdHkgYmVjYXVzZSBpdCBoYXMgYSBoZWlnaHQgPj0gMSIpOworCisgICAgICBUcmVlVHkgKkxSTCA9IGdldExlZnQoTFIpOworICAgICAgVHJlZVR5ICpMUlIgPSBnZXRSaWdodChMUik7CisKKyAgICAgIHJldHVybiBjcmVhdGVOb2RlKGNyZWF0ZU5vZGUoTEwsTCxMUkwpLCBMUiwgY3JlYXRlTm9kZShMUlIsVixSKSk7CisgICAgfQorCisgICAgaWYgKGhyID4gaGwgKyAyKSB7CisgICAgICBhc3NlcnQoIWlzRW1wdHkoUikgJiYgIlJpZ2h0IHRyZWUgY2Fubm90IGJlIGVtcHR5IHRvIGhhdmUgYSBoZWlnaHQgPj0gMiIpOworCisgICAgICBUcmVlVHkgKlJMID0gZ2V0TGVmdChSKTsKKyAgICAgIFRyZWVUeSAqUlIgPSBnZXRSaWdodChSKTsKKworICAgICAgaWYgKGdldEhlaWdodChSUikgPj0gZ2V0SGVpZ2h0KFJMKSkKKyAgICAgICAgcmV0dXJuIGNyZWF0ZU5vZGUoY3JlYXRlTm9kZShMLFYsUkwpLCBSLCBSUik7CisKKyAgICAgIGFzc2VydCghaXNFbXB0eShSTCkgJiYgIlJMIGNhbm5vdCBiZSBlbXB0eSBiZWNhdXNlIGl0IGhhcyBhIGhlaWdodCA+PSAxIik7CisKKyAgICAgIFRyZWVUeSAqUkxMID0gZ2V0TGVmdChSTCk7CisgICAgICBUcmVlVHkgKlJMUiA9IGdldFJpZ2h0KFJMKTsKKworICAgICAgcmV0dXJuIGNyZWF0ZU5vZGUoY3JlYXRlTm9kZShMLFYsUkxMKSwgUkwsIGNyZWF0ZU5vZGUoUkxSLFIsUlIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gY3JlYXRlTm9kZShMLFYsUik7CisgIH0KKworICAvLy8gYWRkX2ludGVybmFsIC0gQ3JlYXRlcyBhIG5ldyB0cmVlIHRoYXQgaW5jbHVkZXMgdGhlIHNwZWNpZmllZAorICAvLy8gIGRhdGEgYW5kIHRoZSBkYXRhIGZyb20gdGhlIG9yaWdpbmFsIHRyZWUuICBJZiB0aGUgb3JpZ2luYWwgdHJlZQorICAvLy8gIGFscmVhZHkgY29udGFpbmVkIHRoZSBkYXRhIGl0ZW0sIHRoZSBvcmlnaW5hbCB0cmVlIGlzIHJldHVybmVkLgorICBUcmVlVHkqIGFkZF9pbnRlcm5hbCh2YWx1ZV90eXBlX3JlZiBWLCBUcmVlVHkqIFQpIHsKKyAgICBpZiAoaXNFbXB0eShUKSkKKyAgICAgIHJldHVybiBjcmVhdGVOb2RlKFQsIFYsIFQpOworICAgIGFzc2VydCghVC0+aXNNdXRhYmxlKCkpOworCisgICAga2V5X3R5cGVfcmVmIEsgPSBJbXV0SW5mbzo6S2V5T2ZWYWx1ZShWKTsKKyAgICBrZXlfdHlwZV9yZWYgS0N1cnJlbnQgPSBJbXV0SW5mbzo6S2V5T2ZWYWx1ZShnZXRWYWx1ZShUKSk7CisKKyAgICBpZiAoSW11dEluZm86OmlzRXF1YWwoSyxLQ3VycmVudCkpCisgICAgICByZXR1cm4gY3JlYXRlTm9kZShnZXRMZWZ0KFQpLCBWLCBnZXRSaWdodChUKSk7CisgICAgZWxzZSBpZiAoSW11dEluZm86OmlzTGVzcyhLLEtDdXJyZW50KSkKKyAgICAgIHJldHVybiBiYWxhbmNlVHJlZShhZGRfaW50ZXJuYWwoViwgZ2V0TGVmdChUKSksIGdldFZhbHVlKFQpLCBnZXRSaWdodChUKSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGJhbGFuY2VUcmVlKGdldExlZnQoVCksIGdldFZhbHVlKFQpLCBhZGRfaW50ZXJuYWwoViwgZ2V0UmlnaHQoVCkpKTsKKyAgfQorCisgIC8vLyByZW1vdmVfaW50ZXJuYWwgLSBDcmVhdGVzIGEgbmV3IHRyZWUgdGhhdCBpbmNsdWRlcyBhbGwgdGhlIGRhdGEKKyAgLy8vICBmcm9tIHRoZSBvcmlnaW5hbCB0cmVlIGV4Y2VwdCB0aGUgc3BlY2lmaWVkIGRhdGEuICBJZiB0aGUKKyAgLy8vICBzcGVjaWZpZWQgZGF0YSBkaWQgbm90IGV4aXN0IGluIHRoZSBvcmlnaW5hbCB0cmVlLCB0aGUgb3JpZ2luYWwKKyAgLy8vICB0cmVlIGlzIHJldHVybmVkLgorICBUcmVlVHkqIHJlbW92ZV9pbnRlcm5hbChrZXlfdHlwZV9yZWYgSywgVHJlZVR5KiBUKSB7CisgICAgaWYgKGlzRW1wdHkoVCkpCisgICAgICByZXR1cm4gVDsKKworICAgIGFzc2VydCghVC0+aXNNdXRhYmxlKCkpOworCisgICAga2V5X3R5cGVfcmVmIEtDdXJyZW50ID0gSW11dEluZm86OktleU9mVmFsdWUoZ2V0VmFsdWUoVCkpOworCisgICAgaWYgKEltdXRJbmZvOjppc0VxdWFsKEssS0N1cnJlbnQpKSB7CisgICAgICByZXR1cm4gY29tYmluZVRyZWVzKGdldExlZnQoVCksIGdldFJpZ2h0KFQpKTsKKyAgICB9IGVsc2UgaWYgKEltdXRJbmZvOjppc0xlc3MoSyxLQ3VycmVudCkpIHsKKyAgICAgIHJldHVybiBiYWxhbmNlVHJlZShyZW1vdmVfaW50ZXJuYWwoSywgZ2V0TGVmdChUKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKFQpLCBnZXRSaWdodChUKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBiYWxhbmNlVHJlZShnZXRMZWZ0KFQpLCBnZXRWYWx1ZShUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfaW50ZXJuYWwoSywgZ2V0UmlnaHQoVCkpKTsKKyAgICB9CisgIH0KKworICBUcmVlVHkqIGNvbWJpbmVUcmVlcyhUcmVlVHkqIEwsIFRyZWVUeSogUikgeworICAgIGlmIChpc0VtcHR5KEwpKQorICAgICAgcmV0dXJuIFI7CisgICAgaWYgKGlzRW1wdHkoUikpCisgICAgICByZXR1cm4gTDsKKyAgICBUcmVlVHkqIE9sZE5vZGU7CisgICAgVHJlZVR5KiBuZXdSaWdodCA9IHJlbW92ZU1pbkJpbmRpbmcoUixPbGROb2RlKTsKKyAgICByZXR1cm4gYmFsYW5jZVRyZWUoTCwgZ2V0VmFsdWUoT2xkTm9kZSksIG5ld1JpZ2h0KTsKKyAgfQorCisgIFRyZWVUeSogcmVtb3ZlTWluQmluZGluZyhUcmVlVHkqIFQsIFRyZWVUeSomIE5vZGVyZW1vdmVkKSB7CisgICAgYXNzZXJ0KCFpc0VtcHR5KFQpKTsKKyAgICBpZiAoaXNFbXB0eShnZXRMZWZ0KFQpKSkgeworICAgICAgTm9kZXJlbW92ZWQgPSBUOworICAgICAgcmV0dXJuIGdldFJpZ2h0KFQpOworICAgIH0KKyAgICByZXR1cm4gYmFsYW5jZVRyZWUocmVtb3ZlTWluQmluZGluZyhnZXRMZWZ0KFQpLCBOb2RlcmVtb3ZlZCksCisgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKFQpLCBnZXRSaWdodChUKSk7CisgIH0KKworICAvLy8gbWFya0ltbXV0YWJsZSAtIENsZWFycyB0aGUgbXV0YWJsZSBiaXRzIG9mIGEgcm9vdCBhbmQgYWxsIG9mIGl0cworICAvLy8gIGRlc2NlbmRhbnRzLgorICB2b2lkIG1hcmtJbW11dGFibGUoVHJlZVR5KiBUKSB7CisgICAgaWYgKCFUIHx8ICFULT5pc011dGFibGUoKSkKKyAgICAgIHJldHVybjsKKyAgICBULT5tYXJrSW1tdXRhYmxlKCk7CisgICAgbWFya0ltbXV0YWJsZShnZXRMZWZ0KFQpKTsKKyAgICBtYXJrSW1tdXRhYmxlKGdldFJpZ2h0KFQpKTsKKyAgfQorCitwdWJsaWM6CisgIFRyZWVUeSAqZ2V0Q2Fub25pY2FsVHJlZShUcmVlVHkgKlROZXcpIHsKKyAgICBpZiAoIVROZXcpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIGlmIChUTmV3LT5Jc0Nhbm9uaWNhbGl6ZWQpCisgICAgICByZXR1cm4gVE5ldzsKKworICAgIC8vIFNlYXJjaCB0aGUgaGFzaHRhYmxlIGZvciBhbm90aGVyIHRyZWUgd2l0aCB0aGUgc2FtZSBkaWdlc3QsIGFuZAorICAgIC8vIGlmIGZpbmQgYSBjb2xsaXNpb24gY29tcGFyZSB0aG9zZSB0cmVlcyBieSB0aGVpciBjb250ZW50cy4KKyAgICB1bnNpZ25lZCBkaWdlc3QgPSBUTmV3LT5jb21wdXRlRGlnZXN0KCk7CisgICAgVHJlZVR5IComZW50cnkgPSBDYWNoZVttYXNrQ2FjaGVJbmRleChkaWdlc3QpXTsKKyAgICBkbyB7CisgICAgICBpZiAoIWVudHJ5KQorICAgICAgICBicmVhazsKKyAgICAgIGZvciAoVHJlZVR5ICpUID0gZW50cnkgOyBUICE9IG51bGxwdHI7IFQgPSBULT5uZXh0KSB7CisgICAgICAgIC8vIENvbXBhcmUgdGhlIENvbnRlbnRzKCdUJykgd2l0aCBDb250ZW50cygnVE5ldycpCisgICAgICAgIHR5cGVuYW1lIFRyZWVUeTo6aXRlcmF0b3IgVEkgPSBULT5iZWdpbigpLCBURSA9IFQtPmVuZCgpOworICAgICAgICBpZiAoIWNvbXBhcmVUcmVlV2l0aFNlY3Rpb24oVE5ldywgVEksIFRFKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKFRJICE9IFRFKQorICAgICAgICAgIGNvbnRpbnVlOyAvLyBUIGhhcyBtb3JlIGNvbnRlbnRzIHRoYW4gVE5ldy4KKyAgICAgICAgLy8gVHJlZXMgZGlkIG1hdGNoISAgUmV0dXJuICdUJy4KKyAgICAgICAgaWYgKFROZXctPnJlZkNvdW50ID09IDApCisgICAgICAgICAgVE5ldy0+ZGVzdHJveSgpOworICAgICAgICByZXR1cm4gVDsKKyAgICAgIH0KKyAgICAgIGVudHJ5LT5wcmV2ID0gVE5ldzsKKyAgICAgIFROZXctPm5leHQgPSBlbnRyeTsKKyAgICB9CisgICAgd2hpbGUgKGZhbHNlKTsKKworICAgIGVudHJ5ID0gVE5ldzsKKyAgICBUTmV3LT5Jc0Nhbm9uaWNhbGl6ZWQgPSB0cnVlOworICAgIHJldHVybiBUTmV3OworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW1tdXRhYmxlIEFWTC1UcmVlIEl0ZXJhdG9ycy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXV0SW5mbz4KK2NsYXNzIEltdXRBVkxUcmVlR2VuZXJpY0l0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW11dEFWTFRyZWU8SW11dEluZm8+PiB7CisgIFNtYWxsVmVjdG9yPHVpbnRwdHJfdCwyMD4gc3RhY2s7CisKK3B1YmxpYzoKKyAgZW51bSBWaXNpdEZsYWcgeyBWaXNpdGVkTm9uZT0weDAsIFZpc2l0ZWRMZWZ0PTB4MSwgVmlzaXRlZFJpZ2h0PTB4MywKKyAgICAgICAgICAgICAgICAgICBGbGFncz0weDMgfTsKKworICB1c2luZyBUcmVlVHkgPSBJbXV0QVZMVHJlZTxJbXV0SW5mbz47CisKKyAgSW11dEFWTFRyZWVHZW5lcmljSXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgIEltdXRBVkxUcmVlR2VuZXJpY0l0ZXJhdG9yKGNvbnN0IFRyZWVUeSAqUm9vdCkgeworICAgIGlmIChSb290KSBzdGFjay5wdXNoX2JhY2socmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFJvb3QpKTsKKyAgfQorCisgIFRyZWVUeSAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGFzc2VydCghc3RhY2suZW1wdHkoKSk7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFRyZWVUeSAqPihzdGFjay5iYWNrKCkgJiB+RmxhZ3MpOworICB9CisgIFRyZWVUeSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYqdGhpczsgfQorCisgIHVpbnRwdHJfdCBnZXRWaXNpdFN0YXRlKCkgY29uc3QgeworICAgIGFzc2VydCghc3RhY2suZW1wdHkoKSk7CisgICAgcmV0dXJuIHN0YWNrLmJhY2soKSAmIEZsYWdzOworICB9CisKKyAgYm9vbCBhdEVuZCgpIGNvbnN0IHsgcmV0dXJuIHN0YWNrLmVtcHR5KCk7IH0KKworICBib29sIGF0QmVnaW5uaW5nKCkgY29uc3QgeworICAgIHJldHVybiBzdGFjay5zaXplKCkgPT0gMSAmJiBnZXRWaXNpdFN0YXRlKCkgPT0gVmlzaXRlZE5vbmU7CisgIH0KKworICB2b2lkIHNraXBUb1BhcmVudCgpIHsKKyAgICBhc3NlcnQoIXN0YWNrLmVtcHR5KCkpOworICAgIHN0YWNrLnBvcF9iYWNrKCk7CisgICAgaWYgKHN0YWNrLmVtcHR5KCkpCisgICAgICByZXR1cm47CisgICAgc3dpdGNoIChnZXRWaXNpdFN0YXRlKCkpIHsKKyAgICAgIGNhc2UgVmlzaXRlZE5vbmU6CisgICAgICAgIHN0YWNrLmJhY2soKSB8PSBWaXNpdGVkTGVmdDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFZpc2l0ZWRMZWZ0OgorICAgICAgICBzdGFjay5iYWNrKCkgfD0gVmlzaXRlZFJpZ2h0OworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVucmVhY2hhYmxlLiIpOworICAgIH0KKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbXV0QVZMVHJlZUdlbmVyaWNJdGVyYXRvciAmeCkgY29uc3QgeworICAgIHJldHVybiBzdGFjayA9PSB4LnN0YWNrOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEltdXRBVkxUcmVlR2VuZXJpY0l0ZXJhdG9yICZ4KSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0geCk7CisgIH0KKworICBJbXV0QVZMVHJlZUdlbmVyaWNJdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICBhc3NlcnQoIXN0YWNrLmVtcHR5KCkpOworICAgIFRyZWVUeSogQ3VycmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VHJlZVR5Kj4oc3RhY2suYmFjaygpICYgfkZsYWdzKTsKKyAgICBhc3NlcnQoQ3VycmVudCk7CisgICAgc3dpdGNoIChnZXRWaXNpdFN0YXRlKCkpIHsKKyAgICAgIGNhc2UgVmlzaXRlZE5vbmU6CisgICAgICAgIGlmIChUcmVlVHkqIEwgPSBDdXJyZW50LT5nZXRMZWZ0KCkpCisgICAgICAgICAgc3RhY2sucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihMKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdGFjay5iYWNrKCkgfD0gVmlzaXRlZExlZnQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBWaXNpdGVkTGVmdDoKKyAgICAgICAgaWYgKFRyZWVUeSogUiA9IEN1cnJlbnQtPmdldFJpZ2h0KCkpCisgICAgICAgICAgc3RhY2sucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihSKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdGFjay5iYWNrKCkgfD0gVmlzaXRlZFJpZ2h0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVmlzaXRlZFJpZ2h0OgorICAgICAgICBza2lwVG9QYXJlbnQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbnJlYWNoYWJsZS4iKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgSW11dEFWTFRyZWVHZW5lcmljSXRlcmF0b3IgJm9wZXJhdG9yLS0oKSB7CisgICAgYXNzZXJ0KCFzdGFjay5lbXB0eSgpKTsKKyAgICBUcmVlVHkqIEN1cnJlbnQgPSByZWludGVycHJldF9jYXN0PFRyZWVUeSo+KHN0YWNrLmJhY2soKSAmIH5GbGFncyk7CisgICAgYXNzZXJ0KEN1cnJlbnQpOworICAgIHN3aXRjaCAoZ2V0VmlzaXRTdGF0ZSgpKSB7CisgICAgICBjYXNlIFZpc2l0ZWROb25lOgorICAgICAgICBzdGFjay5wb3BfYmFjaygpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVmlzaXRlZExlZnQ6CisgICAgICAgIHN0YWNrLmJhY2soKSAmPSB+RmxhZ3M7IC8vIFNldCBzdGF0ZSB0byAiVmlzaXRlZE5vbmUuIgorICAgICAgICBpZiAoVHJlZVR5KiBMID0gQ3VycmVudC0+Z2V0TGVmdCgpKQorICAgICAgICAgIHN0YWNrLnB1c2hfYmFjayhyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oTCkgfCBWaXNpdGVkUmlnaHQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVmlzaXRlZFJpZ2h0OgorICAgICAgICBzdGFjay5iYWNrKCkgJj0gfkZsYWdzOworICAgICAgICBzdGFjay5iYWNrKCkgfD0gVmlzaXRlZExlZnQ7CisgICAgICAgIGlmIChUcmVlVHkqIFIgPSBDdXJyZW50LT5nZXRSaWdodCgpKQorICAgICAgICAgIHN0YWNrLnB1c2hfYmFjayhyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oUikgfCBWaXNpdGVkUmlnaHQpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVucmVhY2hhYmxlLiIpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXV0SW5mbz4KK2NsYXNzIEltdXRBVkxUcmVlSW5PcmRlckl0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW11dEFWTFRyZWU8SW11dEluZm8+PiB7CisgIHVzaW5nIEludGVybmFsSXRlcmF0b3JUeSA9IEltdXRBVkxUcmVlR2VuZXJpY0l0ZXJhdG9yPEltdXRJbmZvPjsKKworICBJbnRlcm5hbEl0ZXJhdG9yVHkgSW50ZXJuYWxJdHI7CisKK3B1YmxpYzoKKyAgdXNpbmcgVHJlZVR5ID0gSW11dEFWTFRyZWU8SW11dEluZm8+OworCisgIEltdXRBVkxUcmVlSW5PcmRlckl0ZXJhdG9yKGNvbnN0IFRyZWVUeSogUm9vdCkgOiBJbnRlcm5hbEl0cihSb290KSB7CisgICAgaWYgKFJvb3QpCisgICAgICArKyp0aGlzOyAvLyBBZHZhbmNlIHRvIGZpcnN0IGVsZW1lbnQuCisgIH0KKworICBJbXV0QVZMVHJlZUluT3JkZXJJdGVyYXRvcigpIDogSW50ZXJuYWxJdHIoKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbXV0QVZMVHJlZUluT3JkZXJJdGVyYXRvciAmeCkgY29uc3QgeworICAgIHJldHVybiBJbnRlcm5hbEl0ciA9PSB4LkludGVybmFsSXRyOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEltdXRBVkxUcmVlSW5PcmRlckl0ZXJhdG9yICZ4KSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0geCk7CisgIH0KKworICBUcmVlVHkgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpJbnRlcm5hbEl0cjsgfQorICBUcmVlVHkgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmKkludGVybmFsSXRyOyB9CisKKyAgSW11dEFWTFRyZWVJbk9yZGVySXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgZG8gKytJbnRlcm5hbEl0cjsKKyAgICB3aGlsZSAoIUludGVybmFsSXRyLmF0RW5kKCkgJiYKKyAgICAgICAgICAgSW50ZXJuYWxJdHIuZ2V0VmlzaXRTdGF0ZSgpICE9IEludGVybmFsSXRlcmF0b3JUeTo6VmlzaXRlZExlZnQpOworCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgSW11dEFWTFRyZWVJbk9yZGVySXRlcmF0b3IgJm9wZXJhdG9yLS0oKSB7CisgICAgZG8gLS1JbnRlcm5hbEl0cjsKKyAgICB3aGlsZSAoIUludGVybmFsSXRyLmF0QmVnaW5uaW5nKCkgJiYKKyAgICAgICAgICAgSW50ZXJuYWxJdHIuZ2V0VmlzaXRTdGF0ZSgpICE9IEludGVybmFsSXRlcmF0b3JUeTo6VmlzaXRlZExlZnQpOworCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCBza2lwU3ViVHJlZSgpIHsKKyAgICBJbnRlcm5hbEl0ci5za2lwVG9QYXJlbnQoKTsKKworICAgIHdoaWxlICghSW50ZXJuYWxJdHIuYXRFbmQoKSAmJgorICAgICAgICAgICBJbnRlcm5hbEl0ci5nZXRWaXNpdFN0YXRlKCkgIT0gSW50ZXJuYWxJdGVyYXRvclR5OjpWaXNpdGVkTGVmdCkKKyAgICAgICsrSW50ZXJuYWxJdHI7CisgIH0KK307CisKKy8vLyBHZW5lcmljIGl0ZXJhdG9yIHRoYXQgd3JhcHMgYSBUOjpUcmVlVHk6Oml0ZXJhdG9yIGFuZCBleHBvc2VzCisvLy8gaXRlcmF0b3I6OmdldFZhbHVlKCkgb24gZGVyZWZlcmVuY2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJbXV0QVZMVmFsdWVJdGVyYXRvcgorICAgIDogaXRlcmF0b3JfYWRhcHRvcl9iYXNlPAorICAgICAgICAgIEltdXRBVkxWYWx1ZUl0ZXJhdG9yPFQ+LCB0eXBlbmFtZSBUOjpUcmVlVHk6Oml0ZXJhdG9yLAorICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPAorICAgICAgICAgICAgICB0eXBlbmFtZSBUOjpUcmVlVHk6Oml0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnksCisgICAgICAgICAgY29uc3QgdHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4geworICBJbXV0QVZMVmFsdWVJdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgSW11dEFWTFZhbHVlSXRlcmF0b3IodHlwZW5hbWUgVDo6VHJlZVR5ICpUcmVlKQorICAgICAgOiBJbXV0QVZMVmFsdWVJdGVyYXRvcjo6aXRlcmF0b3JfYWRhcHRvcl9iYXNlKFRyZWUpIHt9CisKKyAgdHlwZW5hbWUgSW11dEFWTFZhbHVlSXRlcmF0b3I6OnJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPkktPmdldFZhbHVlKCk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUcmFpdCBjbGFzc2VzIGZvciBQcm9maWxlIGluZm9ybWF0aW9uLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEdlbmVyaWMgcHJvZmlsZSB0ZW1wbGF0ZS4gIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGludm9rZSB0aGUKKy8vLyBwcm9maWxlIG1ldGhvZCBvZiBhbiBvYmplY3QuICBTcGVjaWFsaXphdGlvbnMgZm9yIHByaW1pdGl2ZSBpbnRlZ2VycworLy8vIGFuZCBnZW5lcmljIGhhbmRsaW5nIG9mIHBvaW50ZXJzIGlzIGRvbmUgYmVsb3cuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJbXV0UHJvZmlsZUluZm8geworICB1c2luZyB2YWx1ZV90eXBlID0gY29uc3QgVDsKKyAgdXNpbmcgdmFsdWVfdHlwZV9yZWYgPSBjb25zdCBUJjsKKworICBzdGF0aWMgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklELCB2YWx1ZV90eXBlX3JlZiBYKSB7CisgICAgRm9sZGluZ1NldFRyYWl0PFQ+OjpQcm9maWxlKFgsSUQpOworICB9Cit9OworCisvLy8gUHJvZmlsZSB0cmFpdHMgZm9yIGludGVnZXJzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSW11dFByb2ZpbGVJbnRlZ2VyIHsKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IGNvbnN0IFQ7CisgIHVzaW5nIHZhbHVlX3R5cGVfcmVmID0gY29uc3QgVCY7CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCwgdmFsdWVfdHlwZV9yZWYgWCkgeworICAgIElELkFkZEludGVnZXIoWCk7CisgIH0KK307CisKKyNkZWZpbmUgUFJPRklMRV9JTlRFR0VSX0lORk8oWClcCit0ZW1wbGF0ZTw+IHN0cnVjdCBJbXV0UHJvZmlsZUluZm88WD4gOiBJbXV0UHJvZmlsZUludGVnZXI8WD4ge307CisKK1BST0ZJTEVfSU5URUdFUl9JTkZPKGNoYXIpCitQUk9GSUxFX0lOVEVHRVJfSU5GTyh1bnNpZ25lZCBjaGFyKQorUFJPRklMRV9JTlRFR0VSX0lORk8oc2hvcnQpCitQUk9GSUxFX0lOVEVHRVJfSU5GTyh1bnNpZ25lZCBzaG9ydCkKK1BST0ZJTEVfSU5URUdFUl9JTkZPKHVuc2lnbmVkKQorUFJPRklMRV9JTlRFR0VSX0lORk8oc2lnbmVkKQorUFJPRklMRV9JTlRFR0VSX0lORk8obG9uZykKK1BST0ZJTEVfSU5URUdFUl9JTkZPKHVuc2lnbmVkIGxvbmcpCitQUk9GSUxFX0lOVEVHRVJfSU5GTyhsb25nIGxvbmcpCitQUk9GSUxFX0lOVEVHRVJfSU5GTyh1bnNpZ25lZCBsb25nIGxvbmcpCisKKyN1bmRlZiBQUk9GSUxFX0lOVEVHRVJfSU5GTworCisvLy8gUHJvZmlsZSB0cmFpdHMgZm9yIGJvb2xlYW5zLgordGVtcGxhdGUgPD4KK3N0cnVjdCBJbXV0UHJvZmlsZUluZm88Ym9vbD4geworICB1c2luZyB2YWx1ZV90eXBlID0gY29uc3QgYm9vbDsKKyAgdXNpbmcgdmFsdWVfdHlwZV9yZWYgPSBjb25zdCBib29sJjsKKworICBzdGF0aWMgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklELCB2YWx1ZV90eXBlX3JlZiBYKSB7CisgICAgSUQuQWRkQm9vbGVhbihYKTsKKyAgfQorfTsKKworLy8vIEdlbmVyaWMgcHJvZmlsZSB0cmFpdCBmb3IgcG9pbnRlciB0eXBlcy4gIFdlIHRyZWF0IHBvaW50ZXJzIGFzCisvLy8gcmVmZXJlbmNlcyB0byB1bmlxdWUgb2JqZWN0cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEltdXRQcm9maWxlSW5mbzxUKj4geworICB1c2luZyB2YWx1ZV90eXBlID0gY29uc3QgVCo7CisgIHVzaW5nIHZhbHVlX3R5cGVfcmVmID0gdmFsdWVfdHlwZTsKKworICBzdGF0aWMgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklELCB2YWx1ZV90eXBlX3JlZiBYKSB7CisgICAgSUQuQWRkUG9pbnRlcihYKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRyYWl0IGNsYXNzZXMgdGhhdCBjb250YWluIGVsZW1lbnQgY29tcGFyaXNvbiBvcGVyYXRvcnMgYW5kIHR5cGUKKy8vICBkZWZpbml0aW9ucyB1c2VkIGJ5IEltdXRBVkxUcmVlLCBJbW11dGFibGVTZXQsIGFuZCBJbW11dGFibGVNYXAuICBUaGVzZQorLy8gIGluaGVyaXQgZnJvbSB0aGUgcHJvZmlsZSB0cmFpdHMgKEltdXRQcm9maWxlSW5mbykgdG8gaW5jbHVkZSBvcGVyYXRpb25zCisvLyAgZm9yIGVsZW1lbnQgcHJvZmlsaW5nLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEltdXRDb250YWluZXJJbmZvIC0gR2VuZXJpYyBkZWZpbml0aW9uIG9mIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBmb3IKKy8vLyAgIGVsZW1lbnRzIG9mIGltbXV0YWJsZSBjb250YWluZXJzIHRoYXQgZGVmYXVsdHMgdG8gdXNpbmcKKy8vLyAgIHN0ZDo6ZXF1YWxfdG88PiBhbmQgc3RkOjpsZXNzPD4gdG8gcGVyZm9ybSBjb21wYXJpc29uIG9mIGVsZW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSW11dENvbnRhaW5lckluZm8gOiBwdWJsaWMgSW11dFByb2ZpbGVJbmZvPFQ+IHsKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIEltdXRQcm9maWxlSW5mbzxUPjo6dmFsdWVfdHlwZTsKKyAgdXNpbmcgdmFsdWVfdHlwZV9yZWYgPSB0eXBlbmFtZSBJbXV0UHJvZmlsZUluZm88VD46OnZhbHVlX3R5cGVfcmVmOworICB1c2luZyBrZXlfdHlwZSA9IHZhbHVlX3R5cGU7CisgIHVzaW5nIGtleV90eXBlX3JlZiA9IHZhbHVlX3R5cGVfcmVmOworICB1c2luZyBkYXRhX3R5cGUgPSBib29sOworICB1c2luZyBkYXRhX3R5cGVfcmVmID0gYm9vbDsKKworICBzdGF0aWMga2V5X3R5cGVfcmVmIEtleU9mVmFsdWUodmFsdWVfdHlwZV9yZWYgRCkgeyByZXR1cm4gRDsgfQorICBzdGF0aWMgZGF0YV90eXBlX3JlZiBEYXRhT2ZWYWx1ZSh2YWx1ZV90eXBlX3JlZikgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoa2V5X3R5cGVfcmVmIExIUywga2V5X3R5cGVfcmVmIFJIUykgeworICAgIHJldHVybiBzdGQ6OmVxdWFsX3RvPGtleV90eXBlPigpKExIUyxSSFMpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNMZXNzKGtleV90eXBlX3JlZiBMSFMsIGtleV90eXBlX3JlZiBSSFMpIHsKKyAgICByZXR1cm4gc3RkOjpsZXNzPGtleV90eXBlPigpKExIUyxSSFMpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNEYXRhRXF1YWwoZGF0YV90eXBlX3JlZiwgZGF0YV90eXBlX3JlZikgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworLy8vIEltdXRDb250YWluZXJJbmZvIC0gU3BlY2lhbGl6YXRpb24gZm9yIHBvaW50ZXIgdmFsdWVzIHRvIHRyZWF0IHBvaW50ZXJzCisvLy8gIGFzIHJlZmVyZW5jZXMgdG8gdW5pcXVlIG9iamVjdHMuICBQb2ludGVycyBhcmUgdGh1cyBjb21wYXJlZCBieQorLy8vICB0aGVpciBhZGRyZXNzZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJbXV0Q29udGFpbmVySW5mbzxUKj4gOiBwdWJsaWMgSW11dFByb2ZpbGVJbmZvPFQqPiB7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBJbXV0UHJvZmlsZUluZm88VCo+Ojp2YWx1ZV90eXBlOworICB1c2luZyB2YWx1ZV90eXBlX3JlZiA9IHR5cGVuYW1lIEltdXRQcm9maWxlSW5mbzxUKj46OnZhbHVlX3R5cGVfcmVmOworICB1c2luZyBrZXlfdHlwZSA9IHZhbHVlX3R5cGU7CisgIHVzaW5nIGtleV90eXBlX3JlZiA9IHZhbHVlX3R5cGVfcmVmOworICB1c2luZyBkYXRhX3R5cGUgPSBib29sOworICB1c2luZyBkYXRhX3R5cGVfcmVmID0gYm9vbDsKKworICBzdGF0aWMga2V5X3R5cGVfcmVmIEtleU9mVmFsdWUodmFsdWVfdHlwZV9yZWYgRCkgeyByZXR1cm4gRDsgfQorICBzdGF0aWMgZGF0YV90eXBlX3JlZiBEYXRhT2ZWYWx1ZSh2YWx1ZV90eXBlX3JlZikgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoa2V5X3R5cGVfcmVmIExIUywga2V5X3R5cGVfcmVmIFJIUykgeyByZXR1cm4gTEhTID09IFJIUzsgfQorCisgIHN0YXRpYyBib29sIGlzTGVzcyhrZXlfdHlwZV9yZWYgTEhTLCBrZXlfdHlwZV9yZWYgUkhTKSB7IHJldHVybiBMSFMgPCBSSFM7IH0KKworICBzdGF0aWMgYm9vbCBpc0RhdGFFcXVhbChkYXRhX3R5cGVfcmVmLCBkYXRhX3R5cGVfcmVmKSB7IHJldHVybiB0cnVlOyB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW1tdXRhYmxlIFNldAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbFQsIHR5cGVuYW1lIFZhbEluZm8gPSBJbXV0Q29udGFpbmVySW5mbzxWYWxUPj4KK2NsYXNzIEltbXV0YWJsZVNldCB7CitwdWJsaWM6CisgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBWYWxJbmZvOjp2YWx1ZV90eXBlOworICB1c2luZyB2YWx1ZV90eXBlX3JlZiA9IHR5cGVuYW1lIFZhbEluZm86OnZhbHVlX3R5cGVfcmVmOworICB1c2luZyBUcmVlVHkgPSBJbXV0QVZMVHJlZTxWYWxJbmZvPjsKKworcHJpdmF0ZToKKyAgVHJlZVR5ICpSb290OworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3RzIGEgc2V0IGZyb20gYSBwb2ludGVyIHRvIGEgdHJlZSByb290LiAgSW4gZ2VuZXJhbCBvbmUKKyAgLy8vIHNob3VsZCB1c2UgYSBGYWN0b3J5IG9iamVjdCB0byBjcmVhdGUgc2V0cyBpbnN0ZWFkIG9mIGRpcmVjdGx5CisgIC8vLyBpbnZva2luZyB0aGUgY29uc3RydWN0b3IsIGJ1dCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgbWFrZSB0aGlzCisgIC8vLyBjb25zdHJ1Y3RvciBwdWJsaWMgaXMgdXNlZnVsLgorICBleHBsaWNpdCBJbW11dGFibGVTZXQoVHJlZVR5KiBSKSA6IFJvb3QoUikgeworICAgIGlmIChSb290KSB7IFJvb3QtPnJldGFpbigpOyB9CisgIH0KKworICBJbW11dGFibGVTZXQoY29uc3QgSW1tdXRhYmxlU2V0ICZYKSA6IFJvb3QoWC5Sb290KSB7CisgICAgaWYgKFJvb3QpIHsgUm9vdC0+cmV0YWluKCk7IH0KKyAgfQorCisgIH5JbW11dGFibGVTZXQoKSB7CisgICAgaWYgKFJvb3QpIHsgUm9vdC0+cmVsZWFzZSgpOyB9CisgIH0KKworICBJbW11dGFibGVTZXQgJm9wZXJhdG9yPShjb25zdCBJbW11dGFibGVTZXQgJlgpIHsKKyAgICBpZiAoUm9vdCAhPSBYLlJvb3QpIHsKKyAgICAgIGlmIChYLlJvb3QpIHsgWC5Sb290LT5yZXRhaW4oKTsgfQorICAgICAgaWYgKFJvb3QpIHsgUm9vdC0+cmVsZWFzZSgpOyB9CisgICAgICBSb290ID0gWC5Sb290OworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjbGFzcyBGYWN0b3J5IHsKKyAgICB0eXBlbmFtZSBUcmVlVHk6OkZhY3RvcnkgRjsKKyAgICBjb25zdCBib29sIENhbm9uaWNhbGl6ZTsKKworICBwdWJsaWM6CisgICAgRmFjdG9yeShib29sIGNhbm9uaWNhbGl6ZSA9IHRydWUpCisgICAgICA6IENhbm9uaWNhbGl6ZShjYW5vbmljYWxpemUpIHt9CisKKyAgICBGYWN0b3J5KEJ1bXBQdHJBbGxvY2F0b3ImIEFsbG9jLCBib29sIGNhbm9uaWNhbGl6ZSA9IHRydWUpCisgICAgICA6IEYoQWxsb2MpLCBDYW5vbmljYWxpemUoY2Fub25pY2FsaXplKSB7fQorCisgICAgRmFjdG9yeShjb25zdCBGYWN0b3J5JiBSSFMpID0gZGVsZXRlOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEZhY3RvcnkmIFJIUykgPSBkZWxldGU7CisKKyAgICAvLy8gZ2V0RW1wdHlTZXQgLSBSZXR1cm5zIGFuIGltbXV0YWJsZSBzZXQgdGhhdCBjb250YWlucyBubyBlbGVtZW50cy4KKyAgICBJbW11dGFibGVTZXQgZ2V0RW1wdHlTZXQoKSB7CisgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0KEYuZ2V0RW1wdHlUcmVlKCkpOworICAgIH0KKworICAgIC8vLyBhZGQgLSBDcmVhdGVzIGEgbmV3IGltbXV0YWJsZSBzZXQgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIHZhbHVlcworICAgIC8vLyAgb2YgdGhlIG9yaWdpbmFsIHNldCB3aXRoIHRoZSBhZGRpdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLiAgSWYKKyAgICAvLy8gIHRoZSBvcmlnaW5hbCBzZXQgYWxyZWFkeSBpbmNsdWRlZCB0aGUgdmFsdWUsIHRoZW4gdGhlIG9yaWdpbmFsIHNldCBpcworICAgIC8vLyAgcmV0dXJuZWQgYW5kIG5vIG1lbW9yeSBpcyBhbGxvY2F0ZWQuICBUaGUgdGltZSBhbmQgc3BhY2UgY29tcGxleGl0eQorICAgIC8vLyAgb2YgdGhpcyBvcGVyYXRpb24gaXMgbG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIG9yaWdpbmFsIHNldC4KKyAgICAvLy8gIFRoZSBtZW1vcnkgYWxsb2NhdGVkIHRvIHJlcHJlc2VudCB0aGUgc2V0IGlzIHJlbGVhc2VkIHdoZW4gdGhlCisgICAgLy8vICBmYWN0b3J5IG9iamVjdCB0aGF0IGNyZWF0ZWQgdGhlIHNldCBpcyBkZXN0cm95ZWQuCisgICAgSW1tdXRhYmxlU2V0IGFkZChJbW11dGFibGVTZXQgT2xkLCB2YWx1ZV90eXBlX3JlZiBWKSB7CisgICAgICBUcmVlVHkgKk5ld1QgPSBGLmFkZChPbGQuUm9vdCwgVik7CisgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0KENhbm9uaWNhbGl6ZSA/IEYuZ2V0Q2Fub25pY2FsVHJlZShOZXdUKSA6IE5ld1QpOworICAgIH0KKworICAgIC8vLyByZW1vdmUgLSBDcmVhdGVzIGEgbmV3IGltbXV0YWJsZSBzZXQgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIHZhbHVlcworICAgIC8vLyAgb2YgdGhlIG9yaWdpbmFsIHNldCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHNwZWNpZmllZCB2YWx1ZS4gIElmCisgICAgLy8vICB0aGUgb3JpZ2luYWwgc2V0IGRpZCBub3QgY29udGFpbiB0aGUgdmFsdWUsIHRoZSBvcmlnaW5hbCBzZXQgaXMKKyAgICAvLy8gIHJldHVybmVkIGFuZCBubyBtZW1vcnkgaXMgYWxsb2NhdGVkLiAgVGhlIHRpbWUgYW5kIHNwYWNlIGNvbXBsZXhpdHkKKyAgICAvLy8gIG9mIHRoaXMgb3BlcmF0aW9uIGlzIGxvZ2FyaXRobWljIGluIHRoZSBzaXplIG9mIHRoZSBvcmlnaW5hbCBzZXQuCisgICAgLy8vICBUaGUgbWVtb3J5IGFsbG9jYXRlZCB0byByZXByZXNlbnQgdGhlIHNldCBpcyByZWxlYXNlZCB3aGVuIHRoZQorICAgIC8vLyAgZmFjdG9yeSBvYmplY3QgdGhhdCBjcmVhdGVkIHRoZSBzZXQgaXMgZGVzdHJveWVkLgorICAgIEltbXV0YWJsZVNldCByZW1vdmUoSW1tdXRhYmxlU2V0IE9sZCwgdmFsdWVfdHlwZV9yZWYgVikgeworICAgICAgVHJlZVR5ICpOZXdUID0gRi5yZW1vdmUoT2xkLlJvb3QsIFYpOworICAgICAgcmV0dXJuIEltbXV0YWJsZVNldChDYW5vbmljYWxpemUgPyBGLmdldENhbm9uaWNhbFRyZWUoTmV3VCkgOiBOZXdUKTsKKyAgICB9CisKKyAgICBCdW1wUHRyQWxsb2NhdG9yJiBnZXRBbGxvY2F0b3IoKSB7IHJldHVybiBGLmdldEFsbG9jYXRvcigpOyB9CisKKyAgICB0eXBlbmFtZSBUcmVlVHk6OkZhY3RvcnkgKmdldFRyZWVGYWN0b3J5KCkgY29uc3QgeworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8dHlwZW5hbWUgVHJlZVR5OjpGYWN0b3J5ICo+KCZGKTsKKyAgICB9CisgIH07CisKKyAgZnJpZW5kIGNsYXNzIEZhY3Rvcnk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2V0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgIGJvb2wgY29udGFpbnModmFsdWVfdHlwZV9yZWYgVikgY29uc3QgeworICAgIHJldHVybiBSb290ID8gUm9vdC0+Y29udGFpbnMoVikgOiBmYWxzZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbW11dGFibGVTZXQgJlJIUykgY29uc3QgeworICAgIHJldHVybiBSb290ICYmIFJIUy5Sb290ID8gUm9vdC0+aXNFcXVhbCgqUkhTLlJvb3QpIDogUm9vdCA9PSBSSFMuUm9vdDsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbW11dGFibGVTZXQgJlJIUykgY29uc3QgeworICAgIHJldHVybiBSb290ICYmIFJIUy5Sb290ID8gUm9vdC0+aXNOb3RFcXVhbCgqUkhTLlJvb3QpIDogUm9vdCAhPSBSSFMuUm9vdDsKKyAgfQorCisgIFRyZWVUeSAqZ2V0Um9vdCgpIHsKKyAgICBpZiAoUm9vdCkgeyBSb290LT5yZXRhaW4oKTsgfQorICAgIHJldHVybiBSb290OworICB9CisKKyAgVHJlZVR5ICpnZXRSb290V2l0aG91dFJldGFpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gUm9vdDsKKyAgfQorCisgIC8vLyBpc0VtcHR5IC0gUmV0dXJuIHRydWUgaWYgdGhlIHNldCBjb250YWlucyBubyBlbGVtZW50cy4KKyAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIVJvb3Q7IH0KKworICAvLy8gaXNTaW5nbGV0b24gLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc2V0IGNvbnRhaW5zIGV4YWN0bHkgb25lIGVsZW1lbnQuCisgIC8vLyAgIFRoaXMgbWV0aG9kIHJ1bnMgaW4gY29uc3RhbnQgdGltZS4KKyAgYm9vbCBpc1NpbmdsZXRvbigpIGNvbnN0IHsgcmV0dXJuIGdldEhlaWdodCgpID09IDE7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FsbGJhY2s+CisgIHZvaWQgZm9yZWFjaChDYWxsYmFjayYgQykgeyBpZiAoUm9vdCkgUm9vdC0+Zm9yZWFjaChDKTsgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYWxsYmFjaz4KKyAgdm9pZCBmb3JlYWNoKCkgeyBpZiAoUm9vdCkgeyBDYWxsYmFjayBDOyBSb290LT5mb3JlYWNoKEMpOyB9IH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSXRlcmF0b3JzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICB1c2luZyBpdGVyYXRvciA9IEltdXRBVkxWYWx1ZUl0ZXJhdG9yPEltbXV0YWJsZVNldD47CisKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihSb290KTsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigpOyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFV0aWxpdHkgbWV0aG9kcy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgdW5zaWduZWQgZ2V0SGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gUm9vdCA/IFJvb3QtPmdldEhlaWdodCgpIDogMDsgfQorCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQsIGNvbnN0IEltbXV0YWJsZVNldCAmUykgeworICAgIElELkFkZFBvaW50ZXIoUy5Sb290KTsKKyAgfQorCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3QgeyByZXR1cm4gUHJvZmlsZShJRCwgKnRoaXMpOyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEZvciB0ZXN0aW5nLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICB2b2lkIHZhbGlkYXRlVHJlZSgpIGNvbnN0IHsgaWYgKFJvb3QpIFJvb3QtPnZhbGlkYXRlVHJlZSgpOyB9Cit9OworCisvLyBOT1RFOiBUaGlzIG1heSBzb21lIGRheSByZXBsYWNlIHRoZSBjdXJyZW50IEltbXV0YWJsZVNldC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWxULCB0eXBlbmFtZSBWYWxJbmZvID0gSW11dENvbnRhaW5lckluZm88VmFsVD4+CitjbGFzcyBJbW11dGFibGVTZXRSZWYgeworcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgVmFsSW5mbzo6dmFsdWVfdHlwZTsKKyAgdXNpbmcgdmFsdWVfdHlwZV9yZWYgPSB0eXBlbmFtZSBWYWxJbmZvOjp2YWx1ZV90eXBlX3JlZjsKKyAgdXNpbmcgVHJlZVR5ID0gSW11dEFWTFRyZWU8VmFsSW5mbz47CisgIHVzaW5nIEZhY3RvcnlUeSA9IHR5cGVuYW1lIFRyZWVUeTo6RmFjdG9yeTsKKworcHJpdmF0ZToKKyAgVHJlZVR5ICpSb290OworICBGYWN0b3J5VHkgKkZhY3Rvcnk7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdHMgYSBzZXQgZnJvbSBhIHBvaW50ZXIgdG8gYSB0cmVlIHJvb3QuICBJbiBnZW5lcmFsIG9uZQorICAvLy8gc2hvdWxkIHVzZSBhIEZhY3Rvcnkgb2JqZWN0IHRvIGNyZWF0ZSBzZXRzIGluc3RlYWQgb2YgZGlyZWN0bHkKKyAgLy8vIGludm9raW5nIHRoZSBjb25zdHJ1Y3RvciwgYnV0IHRoZXJlIGFyZSBjYXNlcyB3aGVyZSBtYWtlIHRoaXMKKyAgLy8vIGNvbnN0cnVjdG9yIHB1YmxpYyBpcyB1c2VmdWwuCisgIGV4cGxpY2l0IEltbXV0YWJsZVNldFJlZihUcmVlVHkqIFIsIEZhY3RvcnlUeSAqRikKKyAgICA6IFJvb3QoUiksCisgICAgICBGYWN0b3J5KEYpIHsKKyAgICBpZiAoUm9vdCkgeyBSb290LT5yZXRhaW4oKTsgfQorICB9CisKKyAgSW1tdXRhYmxlU2V0UmVmKGNvbnN0IEltbXV0YWJsZVNldFJlZiAmWCkKKyAgICA6IFJvb3QoWC5Sb290KSwKKyAgICAgIEZhY3RvcnkoWC5GYWN0b3J5KSB7CisgICAgaWYgKFJvb3QpIHsgUm9vdC0+cmV0YWluKCk7IH0KKyAgfQorCisgIH5JbW11dGFibGVTZXRSZWYoKSB7CisgICAgaWYgKFJvb3QpIHsgUm9vdC0+cmVsZWFzZSgpOyB9CisgIH0KKworICBJbW11dGFibGVTZXRSZWYgJm9wZXJhdG9yPShjb25zdCBJbW11dGFibGVTZXRSZWYgJlgpIHsKKyAgICBpZiAoUm9vdCAhPSBYLlJvb3QpIHsKKyAgICAgIGlmIChYLlJvb3QpIHsgWC5Sb290LT5yZXRhaW4oKTsgfQorICAgICAgaWYgKFJvb3QpIHsgUm9vdC0+cmVsZWFzZSgpOyB9CisgICAgICBSb290ID0gWC5Sb290OworICAgICAgRmFjdG9yeSA9IFguRmFjdG9yeTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIEltbXV0YWJsZVNldFJlZiBnZXRFbXB0eVNldChGYWN0b3J5VHkgKkYpIHsKKyAgICByZXR1cm4gSW1tdXRhYmxlU2V0UmVmKDAsIEYpOworICB9CisKKyAgSW1tdXRhYmxlU2V0UmVmIGFkZCh2YWx1ZV90eXBlX3JlZiBWKSB7CisgICAgcmV0dXJuIEltbXV0YWJsZVNldFJlZihGYWN0b3J5LT5hZGQoUm9vdCwgViksIEZhY3RvcnkpOworICB9CisKKyAgSW1tdXRhYmxlU2V0UmVmIHJlbW92ZSh2YWx1ZV90eXBlX3JlZiBWKSB7CisgICAgcmV0dXJuIEltbXV0YWJsZVNldFJlZihGYWN0b3J5LT5yZW1vdmUoUm9vdCwgViksIEZhY3RvcnkpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2V0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgIGJvb2wgY29udGFpbnModmFsdWVfdHlwZV9yZWYgVikgY29uc3QgeworICAgIHJldHVybiBSb290ID8gUm9vdC0+Y29udGFpbnMoVikgOiBmYWxzZTsKKyAgfQorCisgIEltbXV0YWJsZVNldDxWYWxUPiBhc0ltbXV0YWJsZVNldChib29sIGNhbm9uaWNhbGl6ZSA9IHRydWUpIGNvbnN0IHsKKyAgICByZXR1cm4gSW1tdXRhYmxlU2V0PFZhbFQ+KGNhbm9uaWNhbGl6ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5LT5nZXRDYW5vbmljYWxUcmVlKFJvb3QpIDogUm9vdCk7CisgIH0KKworICBUcmVlVHkgKmdldFJvb3RXaXRob3V0UmV0YWluKCkgY29uc3QgeworICAgIHJldHVybiBSb290OworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEltbXV0YWJsZVNldFJlZiAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFJvb3QgJiYgUkhTLlJvb3QgPyBSb290LT5pc0VxdWFsKCpSSFMuUm9vdCkgOiBSb290ID09IFJIUy5Sb290OworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEltbXV0YWJsZVNldFJlZiAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFJvb3QgJiYgUkhTLlJvb3QgPyBSb290LT5pc05vdEVxdWFsKCpSSFMuUm9vdCkgOiBSb290ICE9IFJIUy5Sb290OworICB9CisKKyAgLy8vIGlzRW1wdHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc2V0IGNvbnRhaW5zIG5vIGVsZW1lbnRzLgorICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiAhUm9vdDsgfQorCisgIC8vLyBpc1NpbmdsZXRvbiAtIFJldHVybiB0cnVlIGlmIHRoZSBzZXQgY29udGFpbnMgZXhhY3RseSBvbmUgZWxlbWVudC4KKyAgLy8vICAgVGhpcyBtZXRob2QgcnVucyBpbiBjb25zdGFudCB0aW1lLgorICBib29sIGlzU2luZ2xldG9uKCkgY29uc3QgeyByZXR1cm4gZ2V0SGVpZ2h0KCkgPT0gMTsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJdGVyYXRvcnMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIHVzaW5nIGl0ZXJhdG9yID0gSW11dEFWTFZhbHVlSXRlcmF0b3I8SW1tdXRhYmxlU2V0UmVmPjsKKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKFJvb3QpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCk7IH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVXRpbGl0eSBtZXRob2RzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICB1bnNpZ25lZCBnZXRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBSb290ID8gUm9vdC0+Z2V0SGVpZ2h0KCkgOiAwOyB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCwgY29uc3QgSW1tdXRhYmxlU2V0UmVmICZTKSB7CisgICAgSUQuQWRkUG9pbnRlcihTLlJvb3QpOworICB9CisKKyAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7IHJldHVybiBQcm9maWxlKElELCAqdGhpcyk7IH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gRm9yIHRlc3RpbmcuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIHZvaWQgdmFsaWRhdGVUcmVlKCkgY29uc3QgeyBpZiAoUm9vdCkgUm9vdC0+dmFsaWRhdGVUcmVlKCk7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9JTU1VVEFCTEVTRVRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvSW5kZXhlZE1hcC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvSW5kZXhlZE1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZTgwZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9JbmRleGVkTWFwLmgKQEAgLTAsMCArMSw4NSBAQAorLy89PT0tIGxsdm0vQURUL0luZGV4ZWRNYXAuaCAtIEFuIGluZGV4IG1hcCBpbXBsZW1lbnRhdGlvbiAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhbiBpbmRleGVkIG1hcC4gVGhlIGluZGV4IG1hcCB0ZW1wbGF0ZSB0YWtlcyB0d28KKy8vIHR5cGVzLiBUaGUgZmlyc3QgaXMgdGhlIG1hcHBlZCB0eXBlIGFuZCB0aGUgc2Vjb25kIGlzIGEgZnVuY3RvcgorLy8gdGhhdCBtYXBzIGl0cyBhcmd1bWVudCB0byBhIHNpemVfdC4gT24gaW5zdGFudGlhdGlvbiBhICJudWxsIiB2YWx1ZQorLy8gY2FuIGJlIHByb3ZpZGVkIHRvIGJlIHVzZWQgYXMgYSAiZG9lcyBub3QgZXhpc3QiIGluZGljYXRvciBpbiB0aGUKKy8vIG1hcC4gQSBtZW1iZXIgZnVuY3Rpb24gZ3JvdygpIGlzIHByb3ZpZGVkIHRoYXQgZ2l2ZW4gdGhlIHZhbHVlIG9mCisvLyB0aGUgbWF4aW1hbGx5IGluZGV4ZWQga2V5ICh0aGUgYXJndW1lbnQgb2YgdGhlIGZ1bmN0b3IpIG1ha2VzIHN1cmUKKy8vIHRoZSBtYXAgaGFzIGVub3VnaCBzcGFjZSBmb3IgaXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9JTkRFWEVETUFQX0gKKyNkZWZpbmUgTExWTV9BRFRfSU5ERVhFRE1BUF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFRvSW5kZXhUID0gaWRlbnRpdHk8dW5zaWduZWQ+PgorICBjbGFzcyBJbmRleGVkTWFwIHsKKyAgICB1c2luZyBJbmRleFQgPSB0eXBlbmFtZSBUb0luZGV4VDo6YXJndW1lbnRfdHlwZTsKKyAgICAvLyBQcmVmZXIgU21hbGxWZWN0b3Igd2l0aCB6ZXJvIGlubGluZSBzdG9yYWdlIG92ZXIgc3RkOjp2ZWN0b3IuIEluZGV4ZWRNYXBzCisgICAgLy8gY2FuIGdyb3cgdmVyeSBsYXJnZSBhbmQgU21hbGxWZWN0b3IgZ3Jvd3MgbW9yZSBlZmZpY2llbnRseSBhcyBsb25nIGFzIFQKKyAgICAvLyBpcyB0cml2aWFsbHkgY29weWFibGUuCisgICAgdXNpbmcgU3RvcmFnZVQgPSBTbWFsbFZlY3RvcjxULCAwPjsKKworICAgIFN0b3JhZ2VUIHN0b3JhZ2VfOworICAgIFQgbnVsbFZhbF87CisgICAgVG9JbmRleFQgdG9JbmRleF87CisKKyAgcHVibGljOgorICAgIEluZGV4ZWRNYXAoKSA6IG51bGxWYWxfKFQoKSkge30KKworICAgIGV4cGxpY2l0IEluZGV4ZWRNYXAoY29uc3QgVCYgdmFsKSA6IG51bGxWYWxfKHZhbCkge30KKworICAgIHR5cGVuYW1lIFN0b3JhZ2VUOjpyZWZlcmVuY2Ugb3BlcmF0b3JbXShJbmRleFQgbikgeworICAgICAgYXNzZXJ0KHRvSW5kZXhfKG4pIDwgc3RvcmFnZV8uc2l6ZSgpICYmICJpbmRleCBvdXQgb2YgYm91bmRzISIpOworICAgICAgcmV0dXJuIHN0b3JhZ2VfW3RvSW5kZXhfKG4pXTsKKyAgICB9CisKKyAgICB0eXBlbmFtZSBTdG9yYWdlVDo6Y29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oSW5kZXhUIG4pIGNvbnN0IHsKKyAgICAgIGFzc2VydCh0b0luZGV4XyhuKSA8IHN0b3JhZ2VfLnNpemUoKSAmJiAiaW5kZXggb3V0IG9mIGJvdW5kcyEiKTsKKyAgICAgIHJldHVybiBzdG9yYWdlX1t0b0luZGV4XyhuKV07CisgICAgfQorCisgICAgdm9pZCByZXNlcnZlKHR5cGVuYW1lIFN0b3JhZ2VUOjpzaXplX3R5cGUgcykgeworICAgICAgc3RvcmFnZV8ucmVzZXJ2ZShzKTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2l6ZSh0eXBlbmFtZSBTdG9yYWdlVDo6c2l6ZV90eXBlIHMpIHsKKyAgICAgIHN0b3JhZ2VfLnJlc2l6ZShzLCBudWxsVmFsXyk7CisgICAgfQorCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgIHN0b3JhZ2VfLmNsZWFyKCk7CisgICAgfQorCisgICAgdm9pZCBncm93KEluZGV4VCBuKSB7CisgICAgICB1bnNpZ25lZCBOZXdTaXplID0gdG9JbmRleF8obikgKyAxOworICAgICAgaWYgKE5ld1NpemUgPiBzdG9yYWdlXy5zaXplKCkpCisgICAgICAgIHJlc2l6ZShOZXdTaXplKTsKKyAgICB9CisKKyAgICBib29sIGluQm91bmRzKEluZGV4VCBuKSBjb25zdCB7CisgICAgICByZXR1cm4gdG9JbmRleF8obikgPCBzdG9yYWdlXy5zaXplKCk7CisgICAgfQorCisgICAgdHlwZW5hbWUgU3RvcmFnZVQ6OnNpemVfdHlwZSBzaXplKCkgY29uc3QgeworICAgICAgcmV0dXJuIHN0b3JhZ2VfLnNpemUoKTsKKyAgICB9CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9JTkRFWEVETUFQX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0ludEVxQ2xhc3Nlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvSW50RXFDbGFzc2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhZWUyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0ludEVxQ2xhc3Nlcy5oCkBAIC0wLDAgKzEsODggQEAKKy8vPT09LS0gbGx2bS9BRFQvSW50RXFDbGFzc2VzLmggLSBFcXVpdi4gQ2xhc3NlcyBvZiBJbnRlZ2VycyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRXF1aXZhbGVuY2UgY2xhc3NlcyBmb3Igc21hbGwgaW50ZWdlcnMuIFRoaXMgaXMgYSBtYXBwaW5nIG9mIHRoZSBpbnRlZ2VycworLy8gMCAuLiBOLTEgaW50byBNIGVxdWl2YWxlbmNlIGNsYXNzZXMgbnVtYmVyZWQgMCAuLiBNLTEuCisvLworLy8gSW5pdGlhbGx5IGVhY2ggaW50ZWdlciBoYXMgaXRzIG93biBlcXVpdmFsZW5jZSBjbGFzcy4gQ2xhc3NlcyBhcmUgam9pbmVkIGJ5CisvLyBwYXNzaW5nIGEgcmVwcmVzZW50YXRpdmUgbWVtYmVyIG9mIGVhY2ggY2xhc3MgdG8gam9pbigpLgorLy8KKy8vIE9uY2UgdGhlIGNsYXNzZXMgYXJlIGJ1aWx0LCBjb21wcmVzcygpIHdpbGwgbnVtYmVyIHRoZW0gMCAuLiBNLTEgYW5kIHByZXZlbnQKKy8vIGZ1cnRoZXIgY2hhbmdlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0lOVEVRQ0xBU1NFU19ICisjZGVmaW5lIExMVk1fQURUX0lOVEVRQ0xBU1NFU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEludEVxQ2xhc3NlcyB7CisgIC8vLyBFQyAtIFdoZW4gdW5jb21wcmVzc2VkLCBtYXAgZWFjaCBpbnRlZ2VyIHRvIGEgc21hbGxlciBtZW1iZXIgb2YgaXRzCisgIC8vLyBlcXVpdmFsZW5jZSBjbGFzcy4gVGhlIGNsYXNzIGxlYWRlciBpcyB0aGUgc21hbGxlc3QgbWVtYmVyIGFuZCBtYXBzIHRvCisgIC8vLyBpdHNlbGYuCisgIC8vLworICAvLy8gV2hlbiBjb21wcmVzc2VkLCBFQ1tpXSBpcyB0aGUgZXF1aXZhbGVuY2UgY2xhc3Mgb2YgaS4KKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDg+IEVDOworCisgIC8vLyBOdW1DbGFzc2VzIC0gVGhlIG51bWJlciBvZiBlcXVpdmFsZW5jZSBjbGFzc2VzIHdoZW4gY29tcHJlc3NlZCwgb3IgMCB3aGVuCisgIC8vLyB1bmNvbXByZXNzZWQuCisgIHVuc2lnbmVkIE51bUNsYXNzZXM7CisKK3B1YmxpYzoKKyAgLy8vIEludEVxQ2xhc3NlcyAtIENyZWF0ZSBhbiBlcXVpdmFsZW5jZSBjbGFzcyBtYXBwaW5nIGZvciAwIC4uIE4tMS4KKyAgSW50RXFDbGFzc2VzKHVuc2lnbmVkIE4gPSAwKSA6IE51bUNsYXNzZXMoMCkgeyBncm93KE4pOyB9CisKKyAgLy8vIGdyb3cgLSBJbmNyZWFzZSBjYXBhY2l0eSB0byBob2xkIDAgLi4gTi0xLCBwdXR0aW5nIG5ldyBpbnRlZ2VycyBpbiB1bmlxdWUKKyAgLy8vIGVxdWl2YWxlbmNlIGNsYXNzZXMuCisgIC8vLyBUaGlzIHJlcXVpcmVzIGFuIHVuY29tcHJlc3NlZCBtYXAuCisgIHZvaWQgZ3Jvdyh1bnNpZ25lZCBOKTsKKworICAvLy8gY2xlYXIgLSBDbGVhciBhbGwgY2xhc3NlcyBzbyB0aGF0IGdyb3coKSB3aWxsIGFzc2lnbiBhIHVuaXF1ZSBjbGFzcyB0bworICAvLy8gZXZlcnkgaW50ZWdlci4KKyAgdm9pZCBjbGVhcigpIHsKKyAgICBFQy5jbGVhcigpOworICAgIE51bUNsYXNzZXMgPSAwOworICB9CisKKyAgLy8vIEpvaW4gdGhlIGVxdWl2YWxlbmNlIGNsYXNzZXMgb2YgYSBhbmQgYi4gQWZ0ZXIgam9pbmluZyBjbGFzc2VzLAorICAvLy8gZmluZExlYWRlcihhKSA9PSBmaW5kTGVhZGVyKGIpLiBUaGlzIHJlcXVpcmVzIGFuIHVuY29tcHJlc3NlZCBtYXAuCisgIC8vLyBSZXR1cm5zIHRoZSBuZXcgbGVhZGVyLgorICB1bnNpZ25lZCBqb2luKHVuc2lnbmVkIGEsIHVuc2lnbmVkIGIpOworCisgIC8vLyBmaW5kTGVhZGVyIC0gQ29tcHV0ZSB0aGUgbGVhZGVyIG9mIGEncyBlcXVpdmFsZW5jZSBjbGFzcy4gVGhpcyBpcyB0aGUKKyAgLy8vIHNtYWxsZXN0IG1lbWJlciBvZiB0aGUgY2xhc3MuCisgIC8vLyBUaGlzIHJlcXVpcmVzIGFuIHVuY29tcHJlc3NlZCBtYXAuCisgIHVuc2lnbmVkIGZpbmRMZWFkZXIodW5zaWduZWQgYSkgY29uc3Q7CisKKyAgLy8vIGNvbXByZXNzIC0gQ29tcHJlc3MgZXF1aXZhbGVuY2UgY2xhc3NlcyBieSBudW1iZXJpbmcgdGhlbSAwIC4uIE0uCisgIC8vLyBUaGlzIG1ha2VzIHRoZSBlcXVpdmFsZW5jZSBjbGFzcyBtYXAgaW1tdXRhYmxlLgorICB2b2lkIGNvbXByZXNzKCk7CisKKyAgLy8vIGdldE51bUNsYXNzZXMgLSBSZXR1cm4gdGhlIG51bWJlciBvZiBlcXVpdmFsZW5jZSBjbGFzc2VzIGFmdGVyIGNvbXByZXNzKCkKKyAgLy8vIHdhcyBjYWxsZWQuCisgIHVuc2lnbmVkIGdldE51bUNsYXNzZXMoKSBjb25zdCB7IHJldHVybiBOdW1DbGFzc2VzOyB9CisKKyAgLy8vIG9wZXJhdG9yW10gLSBSZXR1cm4gYSdzIGVxdWl2YWxlbmNlIGNsYXNzIG51bWJlciwgMCAuLiBnZXROdW1DbGFzc2VzKCktMS4KKyAgLy8vIFRoaXMgcmVxdWlyZXMgYSBjb21wcmVzc2VkIG1hcC4KKyAgdW5zaWduZWQgb3BlcmF0b3JbXSh1bnNpZ25lZCBhKSBjb25zdCB7CisgICAgYXNzZXJ0KE51bUNsYXNzZXMgJiYgIm9wZXJhdG9yW10gY2FsbGVkIGJlZm9yZSBjb21wcmVzcygpIik7CisgICAgcmV0dXJuIEVDW2FdOworICB9CisKKyAgLy8vIHVuY29tcHJlc3MgLSBDaGFuZ2UgYmFjayB0byB0aGUgdW5jb21wcmVzc2VkIHJlcHJlc2VudGF0aW9uIHRoYXQgYWxsb3dzCisgIC8vLyBlZGl0aW5nLgorICB2b2lkIHVuY29tcHJlc3MoKTsKK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvSW50ZXJ2YWxNYXAuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0ludGVydmFsTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcxMzY2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0ludGVydmFsTWFwLmgKQEAgLTAsMCArMSwyMTU4IEBACisvLz09PS0gbGx2bS9BRFQvSW50ZXJ2YWxNYXAuaCAtIEEgc29ydGVkIGludGVydmFsIG1hcCAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgY29hbGVzY2luZyBpbnRlcnZhbCBtYXAgZm9yIHNtYWxsIG9iamVjdHMuCisvLworLy8gS2V5VCBvYmplY3RzIGFyZSBtYXBwZWQgdG8gVmFsVCBvYmplY3RzLiBJbnRlcnZhbHMgb2Yga2V5cyB0aGF0IG1hcCB0byB0aGUKKy8vIHNhbWUgdmFsdWUgYXJlIHJlcHJlc2VudGVkIGluIGEgY29tcHJlc3NlZCBmb3JtLgorLy8KKy8vIEl0ZXJhdG9ycyBwcm92aWRlIG9yZGVyZWQgYWNjZXNzIHRvIHRoZSBjb21wcmVzc2VkIGludGVydmFscyByYXRoZXIgdGhhbiB0aGUKKy8vIGluZGl2aWR1YWwga2V5cywgYW5kIGluc2VydCBhbmQgZXJhc2Ugb3BlcmF0aW9ucyB1c2Uga2V5IGludGVydmFscyBhcyB3ZWxsLgorLy8KKy8vIExpa2UgU21hbGxWZWN0b3IsIEludGVydmFsTWFwIHdpbGwgc3RvcmUgdGhlIGZpcnN0IE4gaW50ZXJ2YWxzIGluIHRoZSBtYXAKKy8vIG9iamVjdCBpdHNlbGYgd2l0aG91dCBhbnkgYWxsb2NhdGlvbnMuIFdoZW4gc3BhY2UgaXMgZXhoYXVzdGVkIGl0IHN3aXRjaGVzIHRvCisvLyBhIEIrLXRyZWUgcmVwcmVzZW50YXRpb24gd2l0aCB2ZXJ5IHNtYWxsIG92ZXJoZWFkIGZvciBzbWFsbCBrZXkgYW5kIHZhbHVlCisvLyBvYmplY3RzLgorLy8KKy8vIEEgVHJhaXRzIGNsYXNzIHNwZWNpZmllcyBob3cga2V5cyBhcmUgY29tcGFyZWQuIEl0IGFsc28gYWxsb3dzIEludGVydmFsTWFwIHRvCisvLyB3b3JrIHdpdGggYm90aCBjbG9zZWQgYW5kIGhhbGYtb3BlbiBpbnRlcnZhbHMuCisvLworLy8gS2V5cyBhbmQgdmFsdWVzIGFyZSBub3Qgc3RvcmVkIG5leHQgdG8gZWFjaCBvdGhlciBpbiBhIHN0ZDo6cGFpciwgc28gd2UgZG9uJ3QKKy8vIHByb3ZpZGUgc3VjaCBhIHZhbHVlX3R5cGUuIERlcmVmZXJlbmNpbmcgaXRlcmF0b3JzIG9ubHkgcmV0dXJucyB0aGUgbWFwcGVkCisvLyB2YWx1ZS4gVGhlIGludGVydmFsIGJvdW5kcyBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBzdGFydCgpIGFuZCBzdG9wKCkKKy8vIGl0ZXJhdG9yIG1ldGhvZHMuCisvLworLy8gSW50ZXJ2YWxNYXAgaXMgb3B0aW1pemVkIGZvciBzbWFsbCBrZXkgYW5kIHZhbHVlIG9iamVjdHMsIDQgb3IgOCBieXRlcyBlYWNoCisvLyBpcyB0aGUgb3B0aW1hbCBzaXplLiBGb3IgbGFyZ2Ugb2JqZWN0cyB1c2Ugc3RkOjptYXAgaW5zdGVhZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFN5bm9wc2lzOgorLy8KKy8vIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+CisvLyBjbGFzcyBJbnRlcnZhbE1hcCB7CisvLyBwdWJsaWM6CisvLyAgIHR5cGVkZWYgS2V5VCBrZXlfdHlwZTsKKy8vICAgdHlwZWRlZiBWYWxUIG1hcHBlZF90eXBlOworLy8gICB0eXBlZGVmIFJlY3ljbGluZ0FsbG9jYXRvcjwuLi4+IEFsbG9jYXRvcjsKKy8vICAgY2xhc3MgaXRlcmF0b3I7CisvLyAgIGNsYXNzIGNvbnN0X2l0ZXJhdG9yOworLy8KKy8vICAgZXhwbGljaXQgSW50ZXJ2YWxNYXAoQWxsb2NhdG9yJik7CisvLyAgIH5JbnRlcnZhbE1hcCgpOgorLy8KKy8vICAgYm9vbCBlbXB0eSgpIGNvbnN0OworLy8gICBLZXlUIHN0YXJ0KCkgY29uc3Q7CisvLyAgIEtleVQgc3RvcCgpIGNvbnN0OworLy8gICBWYWxUIGxvb2t1cChLZXlUIHgsIFZhbHVlIE5vdEZvdW5kID0gVmFsdWUoKSkgY29uc3Q7CisvLworLy8gICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0OworLy8gICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdDsKKy8vICAgaXRlcmF0b3IgYmVnaW4oKTsKKy8vICAgaXRlcmF0b3IgZW5kKCk7CisvLyAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoS2V5VCB4KSBjb25zdDsKKy8vICAgaXRlcmF0b3IgZmluZChLZXlUIHgpOworLy8KKy8vICAgdm9pZCBpbnNlcnQoS2V5VCBhLCBLZXlUIGIsIFZhbFQgeSk7CisvLyAgIHZvaWQgY2xlYXIoKTsKKy8vIH07CisvLworLy8gdGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KKy8vIGNsYXNzIEludGVydmFsTWFwOjpjb25zdF9pdGVyYXRvciA6CisvLyAgIHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcsIFZhbFQ+IHsKKy8vIHB1YmxpYzoKKy8vICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNvbnN0X2l0ZXJhdG9yICYpIGNvbnN0OworLy8gICBib29sIG9wZXJhdG9yIT0oY29uc3QgY29uc3RfaXRlcmF0b3IgJikgY29uc3Q7CisvLyAgIGJvb2wgdmFsaWQoKSBjb25zdDsKKy8vCisvLyAgIGNvbnN0IEtleVQgJnN0YXJ0KCkgY29uc3Q7CisvLyAgIGNvbnN0IEtleVQgJnN0b3AoKSBjb25zdDsKKy8vICAgY29uc3QgVmFsVCAmdmFsdWUoKSBjb25zdDsKKy8vICAgY29uc3QgVmFsVCAmb3BlcmF0b3IqKCkgY29uc3Q7CisvLyAgIGNvbnN0IFZhbFQgKm9wZXJhdG9yLT4oKSBjb25zdDsKKy8vCisvLyAgIGNvbnN0X2l0ZXJhdG9yICZvcGVyYXRvcisrKCk7CisvLyAgIGNvbnN0X2l0ZXJhdG9yICZvcGVyYXRvcisrKGludCk7CisvLyAgIGNvbnN0X2l0ZXJhdG9yICZvcGVyYXRvci0tKCk7CisvLyAgIGNvbnN0X2l0ZXJhdG9yICZvcGVyYXRvci0tKGludCk7CisvLyAgIHZvaWQgZ29Ub0JlZ2luKCk7CisvLyAgIHZvaWQgZ29Ub0VuZCgpOworLy8gICB2b2lkIGZpbmQoS2V5VCB4KTsKKy8vICAgdm9pZCBhZHZhbmNlVG8oS2V5VCB4KTsKKy8vIH07CisvLworLy8gdGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KKy8vIGNsYXNzIEludGVydmFsTWFwOjppdGVyYXRvciA6IHB1YmxpYyBjb25zdF9pdGVyYXRvciB7CisvLyBwdWJsaWM6CisvLyAgIHZvaWQgaW5zZXJ0KEtleVQgYSwgS2V5VCBiLCBWYWx1ZSB5KTsKKy8vICAgdm9pZCBlcmFzZSgpOworLy8gfTsKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0lOVEVSVkFMTUFQX0gKKyNkZWZpbmUgTExWTV9BRFRfSU5URVJWQUxNQVBfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGlnbk9mLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9SZWN5Y2xpbmdBbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSB0cmFpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGUgSW50ZXJ2YWxNYXAgd29ya3Mgd2l0aCBjbG9zZWQgb3IgaGFsZi1vcGVuIGludGVydmFscy4KKy8vIEFkamFjZW50IGludGVydmFscyB0aGF0IG1hcCB0byB0aGUgc2FtZSB2YWx1ZSBhcmUgY29hbGVzY2VkLgorLy8KKy8vIFRoZSBJbnRlcnZhbE1hcEluZm8gdHJhaXRzIGNsYXNzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEga2V5IGlzIGNvbnRhaW5lZAorLy8gaW4gYW4gaW50ZXJ2YWwsIGFuZCBpZiB0d28gaW50ZXJ2YWxzIGFyZSBhZGphY2VudCBzbyB0aGV5IGNhbiBiZSBjb2FsZXNjZWQuCisvLyBUaGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gd29ya3MgZm9yIGNsb3NlZCBpbnRlZ2VyIGludGVydmFscywgb3RoZXIga2V5cworLy8gcHJvYmFibHkgbmVlZCBhIHNwZWNpYWxpemVkIHZlcnNpb24uCisvLworLy8gVGhlIHBvaW50IHggaXMgY29udGFpbmVkIGluIFthO2JdIHdoZW4gIXN0YXJ0TGVzcyh4LCBhKSAmJiAhc3RvcExlc3MoYiwgeCkuCisvLworLy8gSXQgaXMgYXNzdW1lZCB0aGF0IChhO2JdIGhhbGYtb3BlbiBpbnRlcnZhbHMgYXJlIG5vdCB1c2VkLCBvbmx5IFthO2IpIGlzCisvLyBhbGxvd2VkLiBUaGlzIGlzIHNvIHRoYXQgc3RvcExlc3MoYSwgYikgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHR3bworLy8gaW50ZXJ2YWxzIG92ZXJsYXAuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSW50ZXJ2YWxNYXBJbmZvIHsKKyAgLy8vIHN0YXJ0TGVzcyAtIFJldHVybiB0cnVlIGlmIHggaXMgbm90IGluIFthO2JdLgorICAvLy8gVGhpcyBpcyB4IDwgYSBib3RoIGZvciBjbG9zZWQgaW50ZXJ2YWxzIGFuZCBmb3IgW2E7YikgaGFsZi1vcGVuIGludGVydmFscy4KKyAgc3RhdGljIGlubGluZSBib29sIHN0YXJ0TGVzcyhjb25zdCBUICZ4LCBjb25zdCBUICZhKSB7CisgICAgcmV0dXJuIHggPCBhOworICB9CisKKyAgLy8vIHN0b3BMZXNzIC0gUmV0dXJuIHRydWUgaWYgeCBpcyBub3QgaW4gW2E7Yl0uCisgIC8vLyBUaGlzIGlzIGIgPCB4IGZvciBhIGNsb3NlZCBpbnRlcnZhbCwgYiA8PSB4IGZvciBbYTtiKSBoYWxmLW9wZW4gaW50ZXJ2YWxzLgorICBzdGF0aWMgaW5saW5lIGJvb2wgc3RvcExlc3MoY29uc3QgVCAmYiwgY29uc3QgVCAmeCkgeworICAgIHJldHVybiBiIDwgeDsKKyAgfQorCisgIC8vLyBhZGphY2VudCAtIFJldHVybiB0cnVlIHdoZW4gdGhlIGludGVydmFscyBbeDthXSBhbmQgW2I7eV0gY2FuIGNvYWxlc2NlLgorICAvLy8gVGhpcyBpcyBhKzEgPT0gYiBmb3IgY2xvc2VkIGludGVydmFscywgYSA9PSBiIGZvciBoYWxmLW9wZW4gaW50ZXJ2YWxzLgorICBzdGF0aWMgaW5saW5lIGJvb2wgYWRqYWNlbnQoY29uc3QgVCAmYSwgY29uc3QgVCAmYikgeworICAgIHJldHVybiBhKzEgPT0gYjsKKyAgfQorCisgIC8vLyBub25FbXB0eSAtIFJldHVybiB0cnVlIGlmIFthO2JdIGlzIG5vbi1lbXB0eS4KKyAgLy8vIFRoaXMgaXMgYSA8PSBiIGZvciBhIGNsb3NlZCBpbnRlcnZhbCwgYSA8IGIgZm9yIFthO2IpIGhhbGYtb3BlbiBpbnRlcnZhbHMuCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBub25FbXB0eShjb25zdCBUICZhLCBjb25zdCBUICZiKSB7CisgICAgcmV0dXJuIGEgPD0gYjsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSW50ZXJ2YWxNYXBIYWxmT3BlbkluZm8geworICAvLy8gc3RhcnRMZXNzIC0gUmV0dXJuIHRydWUgaWYgeCBpcyBub3QgaW4gW2E7YikuCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBzdGFydExlc3MoY29uc3QgVCAmeCwgY29uc3QgVCAmYSkgeworICAgIHJldHVybiB4IDwgYTsKKyAgfQorCisgIC8vLyBzdG9wTGVzcyAtIFJldHVybiB0cnVlIGlmIHggaXMgbm90IGluIFthO2IpLgorICBzdGF0aWMgaW5saW5lIGJvb2wgc3RvcExlc3MoY29uc3QgVCAmYiwgY29uc3QgVCAmeCkgeworICAgIHJldHVybiBiIDw9IHg7CisgIH0KKworICAvLy8gYWRqYWNlbnQgLSBSZXR1cm4gdHJ1ZSB3aGVuIHRoZSBpbnRlcnZhbHMgW3g7YSkgYW5kIFtiO3kpIGNhbiBjb2FsZXNjZS4KKyAgc3RhdGljIGlubGluZSBib29sIGFkamFjZW50KGNvbnN0IFQgJmEsIGNvbnN0IFQgJmIpIHsKKyAgICByZXR1cm4gYSA9PSBiOworICB9CisKKyAgLy8vIG5vbkVtcHR5IC0gUmV0dXJuIHRydWUgaWYgW2E7YikgaXMgbm9uLWVtcHR5LgorICBzdGF0aWMgaW5saW5lIGJvb2wgbm9uRW1wdHkoY29uc3QgVCAmYSwgY29uc3QgVCAmYikgeworICAgIHJldHVybiBhIDwgYjsKKyAgfQorfTsKKworLy8vIEludGVydmFsTWFwSW1wbCAtIE5hbWVzcGFjZSB1c2VkIGZvciBJbnRlcnZhbE1hcCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorLy8vIEl0IHNob3VsZCBiZSBjb25zaWRlcmVkIHByaXZhdGUgdG8gdGhlIGltcGxlbWVudGF0aW9uLgorbmFtZXNwYWNlIEludGVydmFsTWFwSW1wbCB7CisKK3VzaW5nIElkeFBhaXIgPSBzdGQ6OnBhaXI8dW5zaWduZWQsdW5zaWduZWQ+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8tLS0gICAgICAgICAgICAgICAgICAgIEludGVydmFsTWFwSW1wbDo6Tm9kZUJhc2UgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQm90aCBsZWFmIGFuZCBicmFuY2ggbm9kZXMgc3RvcmUgdmVjdG9ycyBvZiBwYWlycy4KKy8vIExlYXZlcyBzdG9yZSAoKEtleVQsIEtleVQpLCBWYWxUKSBwYWlycywgYnJhbmNoZXMgdXNlIChOb2RlUmVmLCBLZXlUKS4KKy8vCisvLyBLZXlzIGFuZCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiBzZXBhcmF0ZSBhcnJheXMgdG8gYXZvaWQgcGFkZGluZyBjYXVzZWQgYnkKKy8vIGRpZmZlcmVudCBvYmplY3QgYWxpZ25tZW50cy4gVGhpcyBhbHNvIGhlbHBzIGltcHJvdmUgbG9jYWxpdHkgb2YgcmVmZXJlbmNlCisvLyB3aGVuIHNlYXJjaGluZyB0aGUga2V5cy4KKy8vCisvLyBUaGUgbm9kZXMgZG9uJ3Qga25vdyBob3cgbWFueSBlbGVtZW50cyB0aGV5IGNvbnRhaW4gLSB0aGF0IGluZm9ybWF0aW9uIGlzCisvLyBzdG9yZWQgZWxzZXdoZXJlLiBPbWl0dGluZyB0aGUgc2l6ZSBmaWVsZCBwcmV2ZW50cyBwYWRkaW5nIGFuZCBhbGxvd3MgYSBub2RlCisvLyB0byBmaWxsIHRoZSBhbGxvY2F0ZWQgY2FjaGUgbGluZXMgY29tcGxldGVseS4KKy8vCisvLyBUaGVzZSBhcmUgdHlwaWNhbCBrZXkgYW5kIHZhbHVlIHNpemVzLCB0aGUgbm9kZSBicmFuY2hpbmcgZmFjdG9yIChOKSwgYW5kCisvLyB3YXN0ZWQgc3BhY2Ugd2hlbiBub2RlcyBhcmUgc2l6ZWQgdG8gZml0IGluIHRocmVlIGNhY2hlIGxpbmVzICgxOTIgYnl0ZXMpOgorLy8KKy8vICAgVDEgIFQyICAgTiBXYXN0ZSAgVXNlZCBieQorLy8gICAgNCAgIDQgIDI0ICAgMCAgICBCcmFuY2g8ND4gKDMyLWJpdCBwb2ludGVycykKKy8vICAgIDggICA0ICAxNiAgIDAgICAgTGVhZjw0LDQ+LCBCcmFuY2g8ND4KKy8vICAgIDggICA4ICAxMiAgIDAgICAgTGVhZjw0LDg+LCBCcmFuY2g8OD4KKy8vICAgMTYgICA0ICAgOSAgMTIgICAgTGVhZjw4LDQ+CisvLyAgIDE2ICAgOCAgIDggICAwICAgIExlYWY8OCw4PgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHVuc2lnbmVkIE4+CitjbGFzcyBOb2RlQmFzZSB7CitwdWJsaWM6CisgIGVudW0geyBDYXBhY2l0eSA9IE4gfTsKKworICBUMSBmaXJzdFtOXTsKKyAgVDIgc2Vjb25kW05dOworCisgIC8vLyBjb3B5IC0gQ29weSBlbGVtZW50cyBmcm9tIGFub3RoZXIgbm9kZS4KKyAgLy8vIEBwYXJhbSBPdGhlciBOb2RlIGVsZW1lbnRzIGFyZSBjb3BpZWQgZnJvbS4KKyAgLy8vIEBwYXJhbSBpICAgICBCZWdpbm5pbmcgb2YgdGhlIHNvdXJjZSByYW5nZSBpbiBvdGhlci4KKyAgLy8vIEBwYXJhbSBqICAgICBCZWdpbm5pbmcgb2YgdGhlIGRlc3RpbmF0aW9uIHJhbmdlIGluIHRoaXMuCisgIC8vLyBAcGFyYW0gQ291bnQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGNvcHkuCisgIHRlbXBsYXRlIDx1bnNpZ25lZCBNPgorICB2b2lkIGNvcHkoY29uc3QgTm9kZUJhc2U8VDEsIFQyLCBNPiAmT3RoZXIsIHVuc2lnbmVkIGksCisgICAgICAgICAgICB1bnNpZ25lZCBqLCB1bnNpZ25lZCBDb3VudCkgeworICAgIGFzc2VydChpICsgQ291bnQgPD0gTSAmJiAiSW52YWxpZCBzb3VyY2UgcmFuZ2UiKTsKKyAgICBhc3NlcnQoaiArIENvdW50IDw9IE4gJiYgIkludmFsaWQgZGVzdCByYW5nZSIpOworICAgIGZvciAodW5zaWduZWQgZSA9IGkgKyBDb3VudDsgaSAhPSBlOyArK2ksICsraikgeworICAgICAgZmlyc3Rbal0gID0gT3RoZXIuZmlyc3RbaV07CisgICAgICBzZWNvbmRbal0gPSBPdGhlci5zZWNvbmRbaV07CisgICAgfQorICB9CisKKyAgLy8vIG1vdmVMZWZ0IC0gTW92ZSBlbGVtZW50cyB0byB0aGUgbGVmdC4KKyAgLy8vIEBwYXJhbSBpICAgICBCZWdpbm5pbmcgb2YgdGhlIHNvdXJjZSByYW5nZS4KKyAgLy8vIEBwYXJhbSBqICAgICBCZWdpbm5pbmcgb2YgdGhlIGRlc3RpbmF0aW9uIHJhbmdlLgorICAvLy8gQHBhcmFtIENvdW50IE51bWJlciBvZiBlbGVtZW50cyB0byBjb3B5LgorICB2b2lkIG1vdmVMZWZ0KHVuc2lnbmVkIGksIHVuc2lnbmVkIGosIHVuc2lnbmVkIENvdW50KSB7CisgICAgYXNzZXJ0KGogPD0gaSAmJiAiVXNlIG1vdmVSaWdodCBzaGlmdCBlbGVtZW50cyByaWdodCIpOworICAgIGNvcHkoKnRoaXMsIGksIGosIENvdW50KTsKKyAgfQorCisgIC8vLyBtb3ZlUmlnaHQgLSBNb3ZlIGVsZW1lbnRzIHRvIHRoZSByaWdodC4KKyAgLy8vIEBwYXJhbSBpICAgICBCZWdpbm5pbmcgb2YgdGhlIHNvdXJjZSByYW5nZS4KKyAgLy8vIEBwYXJhbSBqICAgICBCZWdpbm5pbmcgb2YgdGhlIGRlc3RpbmF0aW9uIHJhbmdlLgorICAvLy8gQHBhcmFtIENvdW50IE51bWJlciBvZiBlbGVtZW50cyB0byBjb3B5LgorICB2b2lkIG1vdmVSaWdodCh1bnNpZ25lZCBpLCB1bnNpZ25lZCBqLCB1bnNpZ25lZCBDb3VudCkgeworICAgIGFzc2VydChpIDw9IGogJiYgIlVzZSBtb3ZlTGVmdCBzaGlmdCBlbGVtZW50cyBsZWZ0Iik7CisgICAgYXNzZXJ0KGogKyBDb3VudCA8PSBOICYmICJJbnZhbGlkIHJhbmdlIik7CisgICAgd2hpbGUgKENvdW50LS0pIHsKKyAgICAgIGZpcnN0W2ogKyBDb3VudF0gID0gZmlyc3RbaSArIENvdW50XTsKKyAgICAgIHNlY29uZFtqICsgQ291bnRdID0gc2Vjb25kW2kgKyBDb3VudF07CisgICAgfQorICB9CisKKyAgLy8vIGVyYXNlIC0gRXJhc2UgZWxlbWVudHMgW2k7aikuCisgIC8vLyBAcGFyYW0gaSAgICBCZWdpbm5pbmcgb2YgdGhlIHJhbmdlIHRvIGVyYXNlLgorICAvLy8gQHBhcmFtIGogICAgRW5kIG9mIHRoZSByYW5nZS4gKEV4Y2x1c2l2ZSkuCisgIC8vLyBAcGFyYW0gU2l6ZSBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbm9kZS4KKyAgdm9pZCBlcmFzZSh1bnNpZ25lZCBpLCB1bnNpZ25lZCBqLCB1bnNpZ25lZCBTaXplKSB7CisgICAgbW92ZUxlZnQoaiwgaSwgU2l6ZSAtIGopOworICB9CisKKyAgLy8vIGVyYXNlIC0gRXJhc2UgZWxlbWVudCBhdCBpLgorICAvLy8gQHBhcmFtIGkgICAgSW5kZXggb2YgZWxlbWVudCB0byBlcmFzZS4KKyAgLy8vIEBwYXJhbSBTaXplIE51bWJlciBvZiBlbGVtZW50cyBpbiBub2RlLgorICB2b2lkIGVyYXNlKHVuc2lnbmVkIGksIHVuc2lnbmVkIFNpemUpIHsKKyAgICBlcmFzZShpLCBpKzEsIFNpemUpOworICB9CisKKyAgLy8vIHNoaWZ0IC0gU2hpZnQgZWxlbWVudHMgW2k7c2l6ZSkgMSBwb3NpdGlvbiB0byB0aGUgcmlnaHQuCisgIC8vLyBAcGFyYW0gaSAgICBCZWdpbm5pbmcgb2YgdGhlIHJhbmdlIHRvIG1vdmUuCisgIC8vLyBAcGFyYW0gU2l6ZSBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbm9kZS4KKyAgdm9pZCBzaGlmdCh1bnNpZ25lZCBpLCB1bnNpZ25lZCBTaXplKSB7CisgICAgbW92ZVJpZ2h0KGksIGkgKyAxLCBTaXplIC0gaSk7CisgIH0KKworICAvLy8gdHJhbnNmZXJUb0xlZnRTaWIgLSBUcmFuc2ZlciBlbGVtZW50cyB0byBhIGxlZnQgc2libGluZyBub2RlLgorICAvLy8gQHBhcmFtIFNpemUgIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzLgorICAvLy8gQHBhcmFtIFNpYiAgIExlZnQgc2libGluZyBub2RlLgorICAvLy8gQHBhcmFtIFNTaXplIE51bWJlciBvZiBlbGVtZW50cyBpbiBzaWIuCisgIC8vLyBAcGFyYW0gQ291bnQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRyYW5zZmVyLgorICB2b2lkIHRyYW5zZmVyVG9MZWZ0U2liKHVuc2lnbmVkIFNpemUsIE5vZGVCYXNlICZTaWIsIHVuc2lnbmVkIFNTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvdW50KSB7CisgICAgU2liLmNvcHkoKnRoaXMsIDAsIFNTaXplLCBDb3VudCk7CisgICAgZXJhc2UoMCwgQ291bnQsIFNpemUpOworICB9CisKKyAgLy8vIHRyYW5zZmVyVG9SaWdodFNpYiAtIFRyYW5zZmVyIGVsZW1lbnRzIHRvIGEgcmlnaHQgc2libGluZyBub2RlLgorICAvLy8gQHBhcmFtIFNpemUgIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzLgorICAvLy8gQHBhcmFtIFNpYiAgIFJpZ2h0IHNpYmxpbmcgbm9kZS4KKyAgLy8vIEBwYXJhbSBTU2l6ZSBOdW1iZXIgb2YgZWxlbWVudHMgaW4gc2liLgorICAvLy8gQHBhcmFtIENvdW50IE51bWJlciBvZiBlbGVtZW50cyB0byB0cmFuc2Zlci4KKyAgdm9pZCB0cmFuc2ZlclRvUmlnaHRTaWIodW5zaWduZWQgU2l6ZSwgTm9kZUJhc2UgJlNpYiwgdW5zaWduZWQgU1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvdW50KSB7CisgICAgU2liLm1vdmVSaWdodCgwLCBDb3VudCwgU1NpemUpOworICAgIFNpYi5jb3B5KCp0aGlzLCBTaXplLUNvdW50LCAwLCBDb3VudCk7CisgIH0KKworICAvLy8gYWRqdXN0RnJvbUxlZnRTaWIgLSBBZGp1c3QgdGhlIG51bWJlciBpZiBlbGVtZW50cyBpbiB0aGlzIG5vZGUgYnkgbW92aW5nCisgIC8vLyBlbGVtZW50cyB0byBvciBmcm9tIGEgbGVmdCBzaWJsaW5nIG5vZGUuCisgIC8vLyBAcGFyYW0gU2l6ZSAgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMuCisgIC8vLyBAcGFyYW0gU2liICAgUmlnaHQgc2libGluZyBub2RlLgorICAvLy8gQHBhcmFtIFNTaXplIE51bWJlciBvZiBlbGVtZW50cyBpbiBzaWIuCisgIC8vLyBAcGFyYW0gQWRkICAgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBhZGQgdG8gdGhpcyBub2RlLCBwb3NzaWJseSA8IDAuCisgIC8vLyBAcmV0dXJuICAgICAgTnVtYmVyIG9mIGVsZW1lbnRzIGFkZGVkIHRvIHRoaXMgbm9kZSwgcG9zc2libHkgbmVnYXRpdmUuCisgIGludCBhZGp1c3RGcm9tTGVmdFNpYih1bnNpZ25lZCBTaXplLCBOb2RlQmFzZSAmU2liLCB1bnNpZ25lZCBTU2l6ZSwgaW50IEFkZCkgeworICAgIGlmIChBZGQgPiAwKSB7CisgICAgICAvLyBXZSB3YW50IHRvIGdyb3csIGNvcHkgZnJvbSBzaWIuCisgICAgICB1bnNpZ25lZCBDb3VudCA9IHN0ZDo6bWluKHN0ZDo6bWluKHVuc2lnbmVkKEFkZCksIFNTaXplKSwgTiAtIFNpemUpOworICAgICAgU2liLnRyYW5zZmVyVG9SaWdodFNpYihTU2l6ZSwgKnRoaXMsIFNpemUsIENvdW50KTsKKyAgICAgIHJldHVybiBDb3VudDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV2Ugd2FudCB0byBzaHJpbmssIGNvcHkgdG8gc2liLgorICAgICAgdW5zaWduZWQgQ291bnQgPSBzdGQ6Om1pbihzdGQ6Om1pbih1bnNpZ25lZCgtQWRkKSwgU2l6ZSksIE4gLSBTU2l6ZSk7CisgICAgICB0cmFuc2ZlclRvTGVmdFNpYihTaXplLCBTaWIsIFNTaXplLCBDb3VudCk7CisgICAgICByZXR1cm4gLUNvdW50OworICAgIH0KKyAgfQorfTsKKworLy8vIEludGVydmFsTWFwSW1wbDo6YWRqdXN0U2libGluZ1NpemVzIC0gTW92ZSBlbGVtZW50cyBiZXR3ZWVuIHNpYmxpbmcgbm9kZXMuCisvLy8gQHBhcmFtIE5vZGUgIEFycmF5IG9mIHBvaW50ZXJzIHRvIHNpYmxpbmcgbm9kZXMuCisvLy8gQHBhcmFtIE5vZGVzIE51bWJlciBvZiBub2Rlcy4KKy8vLyBAcGFyYW0gQ3VyU2l6ZSBBcnJheSBvZiBjdXJyZW50IG5vZGUgc2l6ZXMsIHdpbGwgYmUgb3ZlcndyaXR0ZW4uCisvLy8gQHBhcmFtIE5ld1NpemUgQXJyYXkgb2YgZGVzaXJlZCBub2RlIHNpemVzLgordGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVUPgordm9pZCBhZGp1c3RTaWJsaW5nU2l6ZXMoTm9kZVQgKk5vZGVbXSwgdW5zaWduZWQgTm9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDdXJTaXplW10sIGNvbnN0IHVuc2lnbmVkIE5ld1NpemVbXSkgeworICAvLyBNb3ZlIGVsZW1lbnRzIHJpZ2h0LgorICBmb3IgKGludCBuID0gTm9kZXMgLSAxOyBuOyAtLW4pIHsKKyAgICBpZiAoQ3VyU2l6ZVtuXSA9PSBOZXdTaXplW25dKQorICAgICAgY29udGludWU7CisgICAgZm9yIChpbnQgbSA9IG4gLSAxOyBtICE9IC0xOyAtLW0pIHsKKyAgICAgIGludCBkID0gTm9kZVtuXS0+YWRqdXN0RnJvbUxlZnRTaWIoQ3VyU2l6ZVtuXSwgKk5vZGVbbV0sIEN1clNpemVbbV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1NpemVbbl0gLSBDdXJTaXplW25dKTsKKyAgICAgIEN1clNpemVbbV0gLT0gZDsKKyAgICAgIEN1clNpemVbbl0gKz0gZDsKKyAgICAgIC8vIEtlZXAgZ29pbmcgaWYgdGhlIGN1cnJlbnQgbm9kZSB3YXMgZXhoYXVzdGVkLgorICAgICAgaWYgKEN1clNpemVbbl0gPj0gTmV3U2l6ZVtuXSkKKyAgICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoTm9kZXMgPT0gMCkKKyAgICByZXR1cm47CisKKyAgLy8gTW92ZSBlbGVtZW50cyBsZWZ0LgorICBmb3IgKHVuc2lnbmVkIG4gPSAwOyBuICE9IE5vZGVzIC0gMTsgKytuKSB7CisgICAgaWYgKEN1clNpemVbbl0gPT0gTmV3U2l6ZVtuXSkKKyAgICAgIGNvbnRpbnVlOworICAgIGZvciAodW5zaWduZWQgbSA9IG4gKyAxOyBtICE9IE5vZGVzOyArK20pIHsKKyAgICAgIGludCBkID0gTm9kZVttXS0+YWRqdXN0RnJvbUxlZnRTaWIoQ3VyU2l6ZVttXSwgKk5vZGVbbl0sIEN1clNpemVbbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyU2l6ZVtuXSAtICBOZXdTaXplW25dKTsKKyAgICAgIEN1clNpemVbbV0gKz0gZDsKKyAgICAgIEN1clNpemVbbl0gLT0gZDsKKyAgICAgIC8vIEtlZXAgZ29pbmcgaWYgdGhlIGN1cnJlbnQgbm9kZSB3YXMgZXhoYXVzdGVkLgorICAgICAgaWYgKEN1clNpemVbbl0gPj0gTmV3U2l6ZVtuXSkKKyAgICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworI2lmbmRlZiBOREVCVUcKKyAgZm9yICh1bnNpZ25lZCBuID0gMDsgbiAhPSBOb2RlczsgbisrKQorICAgIGFzc2VydChDdXJTaXplW25dID09IE5ld1NpemVbbl0gJiYgIkluc3VmZmljaWVudCBlbGVtZW50IHNodWZmbGUiKTsKKyNlbmRpZgorfQorCisvLy8gSW50ZXJ2YWxNYXBJbXBsOjpkaXN0cmlidXRlIC0gQ29tcHV0ZSBhIG5ldyBkaXN0cmlidXRpb24gb2Ygbm9kZSBlbGVtZW50cworLy8vIGFmdGVyIGFuIG92ZXJmbG93IG9yIHVuZGVyZmxvdy4gUmVzZXJ2ZSBzcGFjZSBmb3IgYSBuZXcgZWxlbWVudCBhdCBQb3NpdGlvbiwKKy8vLyBhbmQgY29tcHV0ZSB0aGUgbm9kZSB0aGF0IHdpbGwgaG9sZCBQb3NpdGlvbiBhZnRlciByZWRpc3RyaWJ1dGluZyBub2RlCisvLy8gZWxlbWVudHMuCisvLy8KKy8vLyBJdCBpcyByZXF1aXJlZCB0aGF0CisvLy8KKy8vLyAgIEVsZW1lbnRzID09IHN1bShDdXJTaXplKSwgYW5kCisvLy8gICBFbGVtZW50cyArIEdyb3cgPD0gTm9kZXMgKiBDYXBhY2l0eS4KKy8vLworLy8vIE5ld1NpemVbXSB3aWxsIGJlIGZpbGxlZCBpbiBzdWNoIHRoYXQ6CisvLy8KKy8vLyAgIHN1bShOZXdTaXplKSA9PSBFbGVtZW50cywgYW5kCisvLy8gICBOZXdTaXplW2ldIDw9IENhcGFjaXR5LgorLy8vCisvLy8gVGhlIHJldHVybmVkIGluZGV4IGlzIHRoZSBub2RlIHdoZXJlIFBvc2l0aW9uIHdpbGwgZ28sIHNvOgorLy8vCisvLy8gICBzdW0oTmV3U2l6ZVswLi5pZHgtMV0pIDw9IFBvc2l0aW9uCisvLy8gICBzdW0oTmV3U2l6ZVswLi5pZHhdKSAgID49IFBvc2l0aW9uCisvLy8KKy8vLyBUaGUgbGFzdCBlcXVhbGl0eSwgc3VtKE5ld1NpemVbMC4uaWR4XSkgPT0gUG9zaXRpb24sIGNhbiBvbmx5IGhhcHBlbiB3aGVuCisvLy8gR3JvdyBpcyBzZXQgYW5kIE5ld1NpemVbaWR4XSA9PSBDYXBhY2l0eS0xLiBUaGUgaW5kZXggcG9pbnRzIHRvIHRoZSBub2RlCisvLy8gYmVmb3JlIHRoZSBvbmUgaG9sZGluZyB0aGUgUG9zaXRpb24ndGggZWxlbWVudCB3aGVyZSB0aGVyZSBpcyByb29tIGZvciBhbgorLy8vIGluc2VydGlvbi4KKy8vLworLy8vIEBwYXJhbSBOb2RlcyAgICBUaGUgbnVtYmVyIG9mIG5vZGVzLgorLy8vIEBwYXJhbSBFbGVtZW50cyBUb3RhbCBlbGVtZW50cyBpbiBhbGwgbm9kZXMuCisvLy8gQHBhcmFtIENhcGFjaXR5IFRoZSBjYXBhY2l0eSBvZiBlYWNoIG5vZGUuCisvLy8gQHBhcmFtIEN1clNpemUgIEFycmF5W05vZGVzXSBvZiBjdXJyZW50IG5vZGUgc2l6ZXMsIG9yIE5VTEwuCisvLy8gQHBhcmFtIE5ld1NpemUgIEFycmF5W05vZGVzXSB0byByZWNlaXZlIHRoZSBuZXcgbm9kZSBzaXplcy4KKy8vLyBAcGFyYW0gUG9zaXRpb24gSW5zZXJ0IHBvc2l0aW9uLgorLy8vIEBwYXJhbSBHcm93ICAgICBSZXNlcnZlIHNwYWNlIGZvciBhIG5ldyBlbGVtZW50IGF0IFBvc2l0aW9uLgorLy8vIEByZXR1cm4gICAgICAgICAobm9kZSwgb2Zmc2V0KSBmb3IgUG9zaXRpb24uCitJZHhQYWlyIGRpc3RyaWJ1dGUodW5zaWduZWQgTm9kZXMsIHVuc2lnbmVkIEVsZW1lbnRzLCB1bnNpZ25lZCBDYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCAqQ3VyU2l6ZSwgdW5zaWduZWQgTmV3U2l6ZVtdLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBvc2l0aW9uLCBib29sIEdyb3cpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8tLS0gICAgICAgICAgICAgICAgICAgSW50ZXJ2YWxNYXBJbXBsOjpOb2RlU2l6ZXIgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ29tcHV0ZSBub2RlIHNpemVzIGZyb20ga2V5IGFuZCB2YWx1ZSB0eXBlcy4KKy8vCisvLyBUaGUgYnJhbmNoaW5nIGZhY3RvcnMgYXJlIGNob3NlbiB0byBtYWtlIG5vZGVzIGZpdCBpbiB0aHJlZSBjYWNoZSBsaW5lcy4KKy8vIFRoaXMgbWF5IG5vdCBiZSBwb3NzaWJsZSBpZiBrZXlzIG9yIHZhbHVlcyBhcmUgdmVyeSBsYXJnZS4gU3VjaCBsYXJnZSBvYmplY3RzCisvLyBhcmUgaGFuZGxlZCBjb3JyZWN0bHksIGJ1dCBhIHN0ZDo6bWFwIHdvdWxkIHByb2JhYmx5IGdpdmUgYmV0dGVyIHBlcmZvcm1hbmNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2VudW0geworICAvLyBDYWNoZSBsaW5lIHNpemUuIE1vc3QgYXJjaGl0ZWN0dXJlcyBoYXZlIDMyIG9yIDY0IGJ5dGUgY2FjaGUgbGluZXMuCisgIC8vIFdlIHVzZSA2NCBieXRlcyBoZXJlIGJlY2F1c2UgaXQgcHJvdmlkZXMgZ29vZCBicmFuY2hpbmcgZmFjdG9ycy4KKyAgTG9nMkNhY2hlTGluZSA9IDYsCisgIENhY2hlTGluZUJ5dGVzID0gMSA8PCBMb2cyQ2FjaGVMaW5lLAorICBEZXNpcmVkTm9kZUJ5dGVzID0gMyAqIENhY2hlTGluZUJ5dGVzCit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVD4KK3N0cnVjdCBOb2RlU2l6ZXIgeworICBlbnVtIHsKKyAgICAvLyBDb21wdXRlIHRoZSBsZWFmIG5vZGUgYnJhbmNoaW5nIGZhY3RvciB0aGF0IG1ha2VzIGEgbm9kZSBmaXQgaW4gdGhyZWUKKyAgICAvLyBjYWNoZSBsaW5lcy4gVGhlIGJyYW5jaGluZyBmYWN0b3IgbXVzdCBiZSBhdCBsZWFzdCAzLCBvciBzb21lIEIrLXRyZWUKKyAgICAvLyBiYWxhbmNpbmcgYWxnb3JpdGhtcyB3b24ndCB3b3JrLgorICAgIC8vIExlYWZTaXplIGNhbid0IGJlIGxhcmdlciB0aGFuIENhY2hlTGluZUJ5dGVzLiBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZQorICAgIC8vIFBvaW50ZXJJbnRQYWlyIHVzZWQgYnkgTm9kZVJlZi4KKyAgICBEZXNpcmVkTGVhZlNpemUgPSBEZXNpcmVkTm9kZUJ5dGVzIC8KKyAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPigyKnNpemVvZihLZXlUKStzaXplb2YoVmFsVCkpLAorICAgIE1pbkxlYWZTaXplID0gMywKKyAgICBMZWFmU2l6ZSA9IERlc2lyZWRMZWFmU2l6ZSA+IE1pbkxlYWZTaXplID8gRGVzaXJlZExlYWZTaXplIDogTWluTGVhZlNpemUKKyAgfTsKKworICB1c2luZyBMZWFmQmFzZSA9IE5vZGVCYXNlPHN0ZDo6cGFpcjxLZXlULCBLZXlUPiwgVmFsVCwgTGVhZlNpemU+OworCisgIGVudW0geworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgdGhlIGxlYWYgYnJhbmNoaW5nIGZhY3RvciwgY29tcHV0ZSB0aGUgYWN0dWFsIGFsbG9jYXRpb24KKyAgICAvLyB1bml0IHNpemUgYnkgcm91bmRpbmcgdXAgdG8gYSB3aG9sZSBudW1iZXIgb2YgY2FjaGUgbGluZXMuCisgICAgQWxsb2NCeXRlcyA9IChzaXplb2YoTGVhZkJhc2UpICsgQ2FjaGVMaW5lQnl0ZXMtMSkgJiB+KENhY2hlTGluZUJ5dGVzLTEpLAorCisgICAgLy8gRGV0ZXJtaW5lIHRoZSBicmFuY2hpbmcgZmFjdG9yIGZvciBicmFuY2ggbm9kZXMuCisgICAgQnJhbmNoU2l6ZSA9IEFsbG9jQnl0ZXMgLworICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHNpemVvZihLZXlUKSArIHNpemVvZih2b2lkKikpCisgIH07CisKKyAgLy8vIEFsbG9jYXRvciAtIFRoZSByZWN5Y2xpbmcgYWxsb2NhdG9yIHVzZWQgZm9yIGJvdGggYnJhbmNoIGFuZCBsZWFmIG5vZGVzLgorICAvLy8gVGhpcyB0eXBlZGVmIGlzIHZlcnkgbGlrZWx5IHRvIGJlIGlkZW50aWNhbCBmb3IgYWxsIEludGVydmFsTWFwcyB3aXRoCisgIC8vLyByZWFzb25hYmx5IHNpemVkIGVudHJpZXMsIHNvIHRoZSBzYW1lIGFsbG9jYXRvciBjYW4gYmUgc2hhcmVkIGFtb25nCisgIC8vLyBkaWZmZXJlbnQga2luZHMgb2YgbWFwcy4KKyAgdXNpbmcgQWxsb2NhdG9yID0KKyAgICAgIFJlY3ljbGluZ0FsbG9jYXRvcjxCdW1wUHRyQWxsb2NhdG9yLCBjaGFyLCBBbGxvY0J5dGVzLCBDYWNoZUxpbmVCeXRlcz47Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8tLS0gICAgICAgICAgICAgICAgICAgICBJbnRlcnZhbE1hcEltcGw6Ok5vZGVSZWYgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQistdHJlZSBub2RlcyBjYW4gYmUgbGVhdmVzIG9yIGJyYW5jaGVzLCBzbyB3ZSBuZWVkIGEgcG9seW1vcnBoaWMgbm9kZQorLy8gcG9pbnRlciB0aGF0IGNhbiBwb2ludCB0byBib3RoIGtpbmRzLgorLy8KKy8vIEFsbCBub2RlcyBhcmUgY2FjaGUgbGluZSBhbGlnbmVkIGFuZCB0aGUgbG93IDYgYml0cyBvZiBhIG5vZGUgcG9pbnRlciBhcmUKKy8vIGFsd2F5cyAwLiBUaGVzZSBiaXRzIGFyZSB1c2VkIHRvIHN0b3JlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlCisvLyByZWZlcmVuY2VkIG5vZGUuIEJlc2lkZXMgc2F2aW5nIHNwYWNlLCBwbGFjaW5nIG5vZGUgc2l6ZXMgaW4gdGhlIHBhcmVudHMKKy8vIGFsbG93IHRyZWUgYmFsYW5jaW5nIGFsZ29yaXRobXMgdG8gcnVuIHdpdGhvdXQgZmF1bHRpbmcgY2FjaGUgbGluZXMgZm9yIG5vZGVzCisvLyB0aGF0IG1heSBub3QgbmVlZCB0byBiZSBtb2RpZmllZC4KKy8vCisvLyBBIE5vZGVSZWYgZG9lc24ndCBrbm93IHdoZXRoZXIgaXQgcmVmZXJlbmNlcyBhIGxlYWYgbm9kZSBvciBhIGJyYW5jaCBub2RlLgorLy8gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gdXNlIHRoZSBjb3JyZWN0IHR5cGVzLgorLy8KKy8vIE5vZGVzIGFyZSBuZXZlciBzdXBwb3NlZCB0byBiZSBlbXB0eSwgYW5kIGl0IGlzIGludmFsaWQgdG8gc3RvcmUgYSBub2RlIHNpemUKKy8vIG9mIDAgaW4gYSBOb2RlUmVmLiBUaGUgdmFsaWQgcmFuZ2Ugb2Ygc2l6ZXMgaXMgMS02NC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBOb2RlUmVmIHsKKyAgc3RydWN0IENhY2hlQWxpZ25lZFBvaW50ZXJUcmFpdHMgeworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0QXNWb2lkUG9pbnRlcih2b2lkICpQKSB7IHJldHVybiBQOyB9CisgICAgc3RhdGljIGlubGluZSB2b2lkICpnZXRGcm9tVm9pZFBvaW50ZXIodm9pZCAqUCkgeyByZXR1cm4gUDsgfQorICAgIGVudW0geyBOdW1Mb3dCaXRzQXZhaWxhYmxlID0gTG9nMkNhY2hlTGluZSB9OworICB9OworICBQb2ludGVySW50UGFpcjx2b2lkKiwgTG9nMkNhY2hlTGluZSwgdW5zaWduZWQsIENhY2hlQWxpZ25lZFBvaW50ZXJUcmFpdHM+IHBpcDsKKworcHVibGljOgorICAvLy8gTm9kZVJlZiAtIENyZWF0ZSBhIG51bGwgcmVmLgorICBOb2RlUmVmKCkgPSBkZWZhdWx0OworCisgIC8vLyBvcGVyYXRvciBib29sIC0gRGV0ZWN0IGEgbnVsbCByZWYuCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBwaXAuZ2V0T3BhcXVlVmFsdWUoKTsgfQorCisgIC8vLyBOb2RlUmVmIC0gQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIHRoZSBub2RlIHAgd2l0aCBuIGVsZW1lbnRzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVQ+CisgIE5vZGVSZWYoTm9kZVQgKnAsIHVuc2lnbmVkIG4pIDogcGlwKHAsIG4gLSAxKSB7CisgICAgYXNzZXJ0KG4gPD0gTm9kZVQ6OkNhcGFjaXR5ICYmICJTaXplIHRvbyBiaWcgZm9yIG5vZGUiKTsKKyAgfQorCisgIC8vLyBzaXplIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHJlZmVyZW5jZWQgbm9kZS4KKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHBpcC5nZXRJbnQoKSArIDE7IH0KKworICAvLy8gc2V0U2l6ZSAtIFVwZGF0ZSB0aGUgbm9kZSBzaXplLgorICB2b2lkIHNldFNpemUodW5zaWduZWQgbikgeyBwaXAuc2V0SW50KG4gLSAxKTsgfQorCisgIC8vLyBzdWJ0cmVlIC0gQWNjZXNzIHRoZSBpJ3RoIHN1YnRyZWUgcmVmZXJlbmNlIGluIGEgYnJhbmNoIG5vZGUuCisgIC8vLyBUaGlzIGRlcGVuZHMgb24gYnJhbmNoIG5vZGVzIHN0b3JpbmcgdGhlIE5vZGVSZWYgYXJyYXkgYXMgdGhlaXIgZmlyc3QKKyAgLy8vIG1lbWJlci4KKyAgTm9kZVJlZiAmc3VidHJlZSh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Tm9kZVJlZio+KHBpcC5nZXRQb2ludGVyKCkpW2ldOworICB9CisKKyAgLy8vIGdldCAtIERlcmVmZXJlbmNlIGFzIGEgTm9kZVQgcmVmZXJlbmNlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVQ+CisgIE5vZGVUICZnZXQoKSBjb25zdCB7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PE5vZGVUKj4ocGlwLmdldFBvaW50ZXIoKSk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTm9kZVJlZiAmUkhTKSBjb25zdCB7CisgICAgaWYgKHBpcCA9PSBSSFMucGlwKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgYXNzZXJ0KHBpcC5nZXRQb2ludGVyKCkgIT0gUkhTLnBpcC5nZXRQb2ludGVyKCkgJiYgIkluY29uc2lzdGVudCBOb2RlUmVmcyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBOb2RlUmVmICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gIW9wZXJhdG9yPT0oUkhTKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLS0tICAgICAgICAgICAgICAgICAgICAgIEludGVydmFsTWFwSW1wbDo6TGVhZk5vZGUgICAgICAgICAgICAgICAgICAgICAgIC0tLS8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExlYWYgbm9kZXMgc3RvcmUgdXAgdG8gTiBkaXNqb2ludCBpbnRlcnZhbHMgd2l0aCBjb3JyZXNwb25kaW5nIHZhbHVlcy4KKy8vCisvLyBUaGUgaW50ZXJ2YWxzIGFyZSBrZXB0IHNvcnRlZCBhbmQgZnVsbHkgY29hbGVzY2VkIHNvIHRoZXJlIGFyZSBubyBhZGphY2VudAorLy8gaW50ZXJ2YWxzIG1hcHBpbmcgdG8gdGhlIHNhbWUgdmFsdWUuCisvLworLy8gVGhlc2UgY29uc3RyYWludHMgYXJlIGFsd2F5cyBzYXRpc2ZpZWQ6CisvLworLy8gLSBUcmFpdHM6OnN0b3BMZXNzKHN0YXJ0KGkpLCBzdG9wKGkpKSAgICAtIE5vbi1lbXB0eSwgc2FuZSBpbnRlcnZhbHMuCisvLworLy8gLSBUcmFpdHM6OnN0b3BMZXNzKHN0b3AoaSksIHN0YXJ0KGkgKyAxKSAtIFNvcnRlZC4KKy8vCisvLyAtIHZhbHVlKGkpICE9IHZhbHVlKGkgKyAxKSB8fCAhVHJhaXRzOjphZGphY2VudChzdG9wKGkpLCBzdGFydChpICsgMSkpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRnVsbHkgY29hbGVzY2VkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+CitjbGFzcyBMZWFmTm9kZSA6IHB1YmxpYyBOb2RlQmFzZTxzdGQ6OnBhaXI8S2V5VCwgS2V5VD4sIFZhbFQsIE4+IHsKK3B1YmxpYzoKKyAgY29uc3QgS2V5VCAmc3RhcnQodW5zaWduZWQgaSkgY29uc3QgeyByZXR1cm4gdGhpcy0+Zmlyc3RbaV0uZmlyc3Q7IH0KKyAgY29uc3QgS2V5VCAmc3RvcCh1bnNpZ25lZCBpKSBjb25zdCB7IHJldHVybiB0aGlzLT5maXJzdFtpXS5zZWNvbmQ7IH0KKyAgY29uc3QgVmFsVCAmdmFsdWUodW5zaWduZWQgaSkgY29uc3QgeyByZXR1cm4gdGhpcy0+c2Vjb25kW2ldOyB9CisKKyAgS2V5VCAmc3RhcnQodW5zaWduZWQgaSkgeyByZXR1cm4gdGhpcy0+Zmlyc3RbaV0uZmlyc3Q7IH0KKyAgS2V5VCAmc3RvcCh1bnNpZ25lZCBpKSB7IHJldHVybiB0aGlzLT5maXJzdFtpXS5zZWNvbmQ7IH0KKyAgVmFsVCAmdmFsdWUodW5zaWduZWQgaSkgeyByZXR1cm4gdGhpcy0+c2Vjb25kW2ldOyB9CisKKyAgLy8vIGZpbmRGcm9tIC0gRmluZCB0aGUgZmlyc3QgaW50ZXJ2YWwgYWZ0ZXIgaSB0aGF0IG1heSBjb250YWluIHguCisgIC8vLyBAcGFyYW0gaSAgICBTdGFydGluZyBpbmRleCBmb3IgdGhlIHNlYXJjaC4KKyAgLy8vIEBwYXJhbSBTaXplIE51bWJlciBvZiBlbGVtZW50cyBpbiBub2RlLgorICAvLy8gQHBhcmFtIHggICAgS2V5IHRvIHNlYXJjaCBmb3IuCisgIC8vLyBAcmV0dXJuICAgICBGaXJzdCBpbmRleCB3aXRoICFzdG9wTGVzcyhrZXlbaV0uc3RvcCwgeCksIG9yIHNpemUuCisgIC8vLyAgICAgICAgICAgICBUaGlzIGlzIHRoZSBmaXJzdCBpbnRlcnZhbCB0aGF0IGNhbiBwb3NzaWJseSBjb250YWluIHguCisgIHVuc2lnbmVkIGZpbmRGcm9tKHVuc2lnbmVkIGksIHVuc2lnbmVkIFNpemUsIEtleVQgeCkgY29uc3QgeworICAgIGFzc2VydChpIDw9IFNpemUgJiYgU2l6ZSA8PSBOICYmICJCYWQgaW5kaWNlcyIpOworICAgIGFzc2VydCgoaSA9PSAwIHx8IFRyYWl0czo6c3RvcExlc3Moc3RvcChpIC0gMSksIHgpKSAmJgorICAgICAgICAgICAiSW5kZXggaXMgcGFzdCB0aGUgbmVlZGVkIHBvaW50Iik7CisgICAgd2hpbGUgKGkgIT0gU2l6ZSAmJiBUcmFpdHM6OnN0b3BMZXNzKHN0b3AoaSksIHgpKSArK2k7CisgICAgcmV0dXJuIGk7CisgIH0KKworICAvLy8gc2FmZUZpbmQgLSBGaW5kIGFuIGludGVydmFsIHRoYXQgaXMga25vd24gdG8gZXhpc3QuIFRoaXMgaXMgdGhlIHNhbWUgYXMKKyAgLy8vIGZpbmRGcm9tIGV4Y2VwdCBpcyBpdCBhc3N1bWVkIHRoYXQgeCBpcyBhdCBsZWFzdCB3aXRoaW4gcmFuZ2Ugb2YgdGhlIGxhc3QKKyAgLy8vIGludGVydmFsLgorICAvLy8gQHBhcmFtIGkgU3RhcnRpbmcgaW5kZXggZm9yIHRoZSBzZWFyY2guCisgIC8vLyBAcGFyYW0geCBLZXkgdG8gc2VhcmNoIGZvci4KKyAgLy8vIEByZXR1cm4gIEZpcnN0IGluZGV4IHdpdGggIXN0b3BMZXNzKGtleVtpXS5zdG9wLCB4KSwgbmV2ZXIgc2l6ZS4KKyAgLy8vICAgICAgICAgIFRoaXMgaXMgdGhlIGZpcnN0IGludGVydmFsIHRoYXQgY2FuIHBvc3NpYmx5IGNvbnRhaW4geC4KKyAgdW5zaWduZWQgc2FmZUZpbmQodW5zaWduZWQgaSwgS2V5VCB4KSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBOICYmICJCYWQgaW5kZXgiKTsKKyAgICBhc3NlcnQoKGkgPT0gMCB8fCBUcmFpdHM6OnN0b3BMZXNzKHN0b3AoaSAtIDEpLCB4KSkgJiYKKyAgICAgICAgICAgIkluZGV4IGlzIHBhc3QgdGhlIG5lZWRlZCBwb2ludCIpOworICAgIHdoaWxlIChUcmFpdHM6OnN0b3BMZXNzKHN0b3AoaSksIHgpKSArK2k7CisgICAgYXNzZXJ0KGkgPCBOICYmICJVbnNhZmUgaW50ZXJ2YWxzIik7CisgICAgcmV0dXJuIGk7CisgIH0KKworICAvLy8gc2FmZUxvb2t1cCAtIExvb2t1cCBtYXBwZWQgdmFsdWUgZm9yIGEgc2FmZSBrZXkuCisgIC8vLyBJdCBpcyBhc3N1bWVkIHRoYXQgeCBpcyB3aXRoaW4gcmFuZ2Ugb2YgdGhlIGxhc3QgZW50cnkuCisgIC8vLyBAcGFyYW0geCAgICAgICAgS2V5IHRvIHNlYXJjaCBmb3IuCisgIC8vLyBAcGFyYW0gTm90Rm91bmQgVmFsdWUgdG8gcmV0dXJuIGlmIHggaXMgbm90IGluIGFueSBpbnRlcnZhbC4KKyAgLy8vIEByZXR1cm4gICAgICAgICBUaGUgbWFwcGVkIHZhbHVlIGF0IHggb3IgTm90Rm91bmQuCisgIFZhbFQgc2FmZUxvb2t1cChLZXlUIHgsIFZhbFQgTm90Rm91bmQpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBpID0gc2FmZUZpbmQoMCwgeCk7CisgICAgcmV0dXJuIFRyYWl0czo6c3RhcnRMZXNzKHgsIHN0YXJ0KGkpKSA/IE5vdEZvdW5kIDogdmFsdWUoaSk7CisgIH0KKworICB1bnNpZ25lZCBpbnNlcnRGcm9tKHVuc2lnbmVkICZQb3MsIHVuc2lnbmVkIFNpemUsIEtleVQgYSwgS2V5VCBiLCBWYWxUIHkpOworfTsKKworLy8vIGluc2VydEZyb20gLSBBZGQgbWFwcGluZyBvZiBbYTtiXSB0byB5IGlmIHBvc3NpYmxlLCBjb2FsZXNjaW5nIGFzIG11Y2ggYXMKKy8vLyBwb3NzaWJsZS4gVGhpcyBtYXkgY2F1c2UgdGhlIG5vZGUgdG8gZ3JvdyBieSAxLCBvciBpdCBtYXkgY2F1c2UgdGhlIG5vZGUKKy8vLyB0byBzaHJpbmsgYmVjYXVzZSBvZiBjb2FsZXNjaW5nLgorLy8vIEBwYXJhbSBQb3MgIFN0YXJ0aW5nIGluZGV4ID0gaW5zZXJ0RnJvbSgwLCBzaXplLCBhKQorLy8vIEBwYXJhbSBTaXplIE51bWJlciBvZiBlbGVtZW50cyBpbiBub2RlLgorLy8vIEBwYXJhbSBhICAgIEludGVydmFsIHN0YXJ0LgorLy8vIEBwYXJhbSBiICAgIEludGVydmFsIHN0b3AuCisvLy8gQHBhcmFtIHkgICAgVmFsdWUgYmUgbWFwcGVkLgorLy8vIEByZXR1cm4gICAgIChpbnNlcnQgcG9zaXRpb24sIG5ldyBzaXplKSwgb3IgKGksIENhcGFjaXR5KzEpIG9uIG92ZXJmbG93LgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK3Vuc2lnbmVkIExlYWZOb2RlPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgoraW5zZXJ0RnJvbSh1bnNpZ25lZCAmUG9zLCB1bnNpZ25lZCBTaXplLCBLZXlUIGEsIEtleVQgYiwgVmFsVCB5KSB7CisgIHVuc2lnbmVkIGkgPSBQb3M7CisgIGFzc2VydChpIDw9IFNpemUgJiYgU2l6ZSA8PSBOICYmICJJbnZhbGlkIGluZGV4Iik7CisgIGFzc2VydCghVHJhaXRzOjpzdG9wTGVzcyhiLCBhKSAmJiAiSW52YWxpZCBpbnRlcnZhbCIpOworCisgIC8vIFZlcmlmeSB0aGUgZmluZEZyb20gaW52YXJpYW50LgorICBhc3NlcnQoKGkgPT0gMCB8fCBUcmFpdHM6OnN0b3BMZXNzKHN0b3AoaSAtIDEpLCBhKSkpOworICBhc3NlcnQoKGkgPT0gU2l6ZSB8fCAhVHJhaXRzOjpzdG9wTGVzcyhzdG9wKGkpLCBhKSkpOworICBhc3NlcnQoKGkgPT0gU2l6ZSB8fCBUcmFpdHM6OnN0b3BMZXNzKGIsIHN0YXJ0KGkpKSkgJiYgIk92ZXJsYXBwaW5nIGluc2VydCIpOworCisgIC8vIENvYWxlc2NlIHdpdGggcHJldmlvdXMgaW50ZXJ2YWwuCisgIGlmIChpICYmIHZhbHVlKGkgLSAxKSA9PSB5ICYmIFRyYWl0czo6YWRqYWNlbnQoc3RvcChpIC0gMSksIGEpKSB7CisgICAgUG9zID0gaSAtIDE7CisgICAgLy8gQWxzbyBjb2FsZXNjZSB3aXRoIG5leHQgaW50ZXJ2YWw/CisgICAgaWYgKGkgIT0gU2l6ZSAmJiB2YWx1ZShpKSA9PSB5ICYmIFRyYWl0czo6YWRqYWNlbnQoYiwgc3RhcnQoaSkpKSB7CisgICAgICBzdG9wKGkgLSAxKSA9IHN0b3AoaSk7CisgICAgICB0aGlzLT5lcmFzZShpLCBTaXplKTsKKyAgICAgIHJldHVybiBTaXplIC0gMTsKKyAgICB9CisgICAgc3RvcChpIC0gMSkgPSBiOworICAgIHJldHVybiBTaXplOworICB9CisKKyAgLy8gRGV0ZWN0IG92ZXJmbG93LgorICBpZiAoaSA9PSBOKQorICAgIHJldHVybiBOICsgMTsKKworICAvLyBBZGQgbmV3IGludGVydmFsIGF0IGVuZC4KKyAgaWYgKGkgPT0gU2l6ZSkgeworICAgIHN0YXJ0KGkpID0gYTsKKyAgICBzdG9wKGkpID0gYjsKKyAgICB2YWx1ZShpKSA9IHk7CisgICAgcmV0dXJuIFNpemUgKyAxOworICB9CisKKyAgLy8gVHJ5IHRvIGNvYWxlc2NlIHdpdGggZm9sbG93aW5nIGludGVydmFsLgorICBpZiAodmFsdWUoaSkgPT0geSAmJiBUcmFpdHM6OmFkamFjZW50KGIsIHN0YXJ0KGkpKSkgeworICAgIHN0YXJ0KGkpID0gYTsKKyAgICByZXR1cm4gU2l6ZTsKKyAgfQorCisgIC8vIFdlIG11c3QgaW5zZXJ0IGJlZm9yZSBpLiBEZXRlY3Qgb3ZlcmZsb3cuCisgIGlmIChTaXplID09IE4pCisgICAgcmV0dXJuIE4gKyAxOworCisgIC8vIEluc2VydCBiZWZvcmUgaS4KKyAgdGhpcy0+c2hpZnQoaSwgU2l6ZSk7CisgIHN0YXJ0KGkpID0gYTsKKyAgc3RvcChpKSA9IGI7CisgIHZhbHVlKGkpID0geTsKKyAgcmV0dXJuIFNpemUgKyAxOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8tLS0gICAgICAgICAgICAgICAgICAgSW50ZXJ2YWxNYXBJbXBsOjpCcmFuY2hOb2RlICAgICAgICAgICAgICAgICAgICAgICAgLS0tLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQSBicmFuY2ggbm9kZSBzdG9yZXMgcmVmZXJlbmNlcyB0byAxLS1OIHN1YnRyZWVzIGFsbCBvZiB0aGUgc2FtZSBoZWlnaHQuCisvLworLy8gVGhlIGtleSBhcnJheSBpbiBhIGJyYW5jaCBub2RlIGhvbGRzIHRoZSByaWdodG1vc3Qgc3RvcCBrZXkgb2YgZWFjaCBzdWJ0cmVlLgorLy8gSXQgaXMgcmVkdW5kYW50IHRvIHN0b3JlIHRoZSBsYXN0IHN0b3Aga2V5IHNpbmNlIGl0IGNhbiBiZSBmb3VuZCBpbiB0aGUKKy8vIHBhcmVudCBub2RlLCBidXQgZG9pbmcgc28gbWFrZXMgdHJlZSBiYWxhbmNpbmcgYSBsb3Qgc2ltcGxlci4KKy8vCisvLyBJdCBpcyB1bnVzdWFsIGZvciBhIGJyYW5jaCBub2RlIHRvIG9ubHkgaGF2ZSBvbmUgc3VidHJlZSwgYnV0IGl0IGNhbiBoYXBwZW4KKy8vIGluIHRoZSByb290IG5vZGUgaWYgaXQgaXMgc21hbGxlciB0aGFuIHRoZSBub3JtYWwgbm9kZXMuCisvLworLy8gV2hlbiBhbGwgb2YgdGhlIGxlYWYgbm9kZXMgZnJvbSBhbGwgdGhlIHN1YnRyZWVzIGFyZSBjb25jYXRlbmF0ZWQsIHRoZXkgbXVzdAorLy8gc2F0aXNmeSB0aGUgc2FtZSBjb25zdHJhaW50cyBhcyBhIHNpbmdsZSBsZWFmIG5vZGUuIFRoZXkgbXVzdCBiZSBzb3J0ZWQsCisvLyBzYW5lLCBhbmQgZnVsbHkgY29hbGVzY2VkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+CitjbGFzcyBCcmFuY2hOb2RlIDogcHVibGljIE5vZGVCYXNlPE5vZGVSZWYsIEtleVQsIE4+IHsKK3B1YmxpYzoKKyAgY29uc3QgS2V5VCAmc3RvcCh1bnNpZ25lZCBpKSBjb25zdCB7IHJldHVybiB0aGlzLT5zZWNvbmRbaV07IH0KKyAgY29uc3QgTm9kZVJlZiAmc3VidHJlZSh1bnNpZ25lZCBpKSBjb25zdCB7IHJldHVybiB0aGlzLT5maXJzdFtpXTsgfQorCisgIEtleVQgJnN0b3AodW5zaWduZWQgaSkgeyByZXR1cm4gdGhpcy0+c2Vjb25kW2ldOyB9CisgIE5vZGVSZWYgJnN1YnRyZWUodW5zaWduZWQgaSkgeyByZXR1cm4gdGhpcy0+Zmlyc3RbaV07IH0KKworICAvLy8gZmluZEZyb20gLSBGaW5kIHRoZSBmaXJzdCBzdWJ0cmVlIGFmdGVyIGkgdGhhdCBtYXkgY29udGFpbiB4LgorICAvLy8gQHBhcmFtIGkgICAgU3RhcnRpbmcgaW5kZXggZm9yIHRoZSBzZWFyY2guCisgIC8vLyBAcGFyYW0gU2l6ZSBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbm9kZS4KKyAgLy8vIEBwYXJhbSB4ICAgIEtleSB0byBzZWFyY2ggZm9yLgorICAvLy8gQHJldHVybiAgICAgRmlyc3QgaW5kZXggd2l0aCAhc3RvcExlc3Moa2V5W2ldLCB4KSwgb3Igc2l6ZS4KKyAgLy8vICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGZpcnN0IHN1YnRyZWUgdGhhdCBjYW4gcG9zc2libHkgY29udGFpbiB4LgorICB1bnNpZ25lZCBmaW5kRnJvbSh1bnNpZ25lZCBpLCB1bnNpZ25lZCBTaXplLCBLZXlUIHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8PSBTaXplICYmIFNpemUgPD0gTiAmJiAiQmFkIGluZGljZXMiKTsKKyAgICBhc3NlcnQoKGkgPT0gMCB8fCBUcmFpdHM6OnN0b3BMZXNzKHN0b3AoaSAtIDEpLCB4KSkgJiYKKyAgICAgICAgICAgIkluZGV4IHRvIGZpbmRGcm9tIGlzIHBhc3QgdGhlIG5lZWRlZCBwb2ludCIpOworICAgIHdoaWxlIChpICE9IFNpemUgJiYgVHJhaXRzOjpzdG9wTGVzcyhzdG9wKGkpLCB4KSkgKytpOworICAgIHJldHVybiBpOworICB9CisKKyAgLy8vIHNhZmVGaW5kIC0gRmluZCBhIHN1YnRyZWUgdGhhdCBpcyBrbm93biB0byBleGlzdC4gVGhpcyBpcyB0aGUgc2FtZSBhcworICAvLy8gZmluZEZyb20gZXhjZXB0IGlzIGl0IGFzc3VtZWQgdGhhdCB4IGlzIGluIHJhbmdlLgorICAvLy8gQHBhcmFtIGkgU3RhcnRpbmcgaW5kZXggZm9yIHRoZSBzZWFyY2guCisgIC8vLyBAcGFyYW0geCBLZXkgdG8gc2VhcmNoIGZvci4KKyAgLy8vIEByZXR1cm4gIEZpcnN0IGluZGV4IHdpdGggIXN0b3BMZXNzKGtleVtpXSwgeCksIG5ldmVyIHNpemUuCisgIC8vLyAgICAgICAgICBUaGlzIGlzIHRoZSBmaXJzdCBzdWJ0cmVlIHRoYXQgY2FuIHBvc3NpYmx5IGNvbnRhaW4geC4KKyAgdW5zaWduZWQgc2FmZUZpbmQodW5zaWduZWQgaSwgS2V5VCB4KSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBOICYmICJCYWQgaW5kZXgiKTsKKyAgICBhc3NlcnQoKGkgPT0gMCB8fCBUcmFpdHM6OnN0b3BMZXNzKHN0b3AoaSAtIDEpLCB4KSkgJiYKKyAgICAgICAgICAgIkluZGV4IGlzIHBhc3QgdGhlIG5lZWRlZCBwb2ludCIpOworICAgIHdoaWxlIChUcmFpdHM6OnN0b3BMZXNzKHN0b3AoaSksIHgpKSArK2k7CisgICAgYXNzZXJ0KGkgPCBOICYmICJVbnNhZmUgaW50ZXJ2YWxzIik7CisgICAgcmV0dXJuIGk7CisgIH0KKworICAvLy8gc2FmZUxvb2t1cCAtIEdldCB0aGUgc3VidHJlZSBjb250YWluaW5nIHgsIEFzc3VtaW5nIHRoYXQgeCBpcyBpbiByYW5nZS4KKyAgLy8vIEBwYXJhbSB4IEtleSB0byBzZWFyY2ggZm9yLgorICAvLy8gQHJldHVybiAgU3VidHJlZSBjb250YWluaW5nIHgKKyAgTm9kZVJlZiBzYWZlTG9va3VwKEtleVQgeCkgY29uc3QgeworICAgIHJldHVybiBzdWJ0cmVlKHNhZmVGaW5kKDAsIHgpKTsKKyAgfQorCisgIC8vLyBpbnNlcnQgLSBJbnNlcnQgYSBuZXcgKHN1YnRyZWUsIHN0b3ApIHBhaXIuCisgIC8vLyBAcGFyYW0gaSAgICBJbnNlcnQgcG9zaXRpb24sIGZvbGxvd2luZyBlbnRyaWVzIHdpbGwgYmUgc2hpZnRlZC4KKyAgLy8vIEBwYXJhbSBTaXplIE51bWJlciBvZiBlbGVtZW50cyBpbiBub2RlLgorICAvLy8gQHBhcmFtIE5vZGUgU3VidHJlZSB0byBpbnNlcnQuCisgIC8vLyBAcGFyYW0gU3RvcCBMYXN0IGtleSBpbiBzdWJ0cmVlLgorICB2b2lkIGluc2VydCh1bnNpZ25lZCBpLCB1bnNpZ25lZCBTaXplLCBOb2RlUmVmIE5vZGUsIEtleVQgU3RvcCkgeworICAgIGFzc2VydChTaXplIDwgTiAmJiAiYnJhbmNoIG5vZGUgb3ZlcmZsb3ciKTsKKyAgICBhc3NlcnQoaSA8PSBTaXplICYmICJCYWQgaW5zZXJ0IHBvc2l0aW9uIik7CisgICAgdGhpcy0+c2hpZnQoaSwgU2l6ZSk7CisgICAgc3VidHJlZShpKSA9IE5vZGU7CisgICAgc3RvcChpKSA9IFN0b3A7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy0tLSAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnZhbE1hcEltcGw6OlBhdGggICAgICAgICAgICAgICAgICAgICAgICAtLS0vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBBIFBhdGggaXMgdXNlZCBieSBpdGVyYXRvcnMgdG8gcmVwcmVzZW50IGEgcG9zaXRpb24gaW4gYSBCKy10cmVlLCBhbmQgdGhlCisvLyBwYXRoIHRvIGdldCB0aGVyZSBmcm9tIHRoZSByb290LgorLy8KKy8vIFRoZSBQYXRoIGNsYXNzIGFsc28gY29udGFpbnMgdGhlIHRyZWUgbmF2aWdhdGlvbiBjb2RlIHRoYXQgZG9lc24ndCBoYXZlIHRvCisvLyBiZSB0ZW1wbGF0aXplZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBQYXRoIHsKKyAgLy8vIEVudHJ5IC0gRWFjaCBzdGVwIGluIHRoZSBwYXRoIGlzIGEgbm9kZSBwb2ludGVyIGFuZCBhbiBvZmZzZXQgaW50byB0aGF0CisgIC8vLyBub2RlLgorICBzdHJ1Y3QgRW50cnkgeworICAgIHZvaWQgKm5vZGU7CisgICAgdW5zaWduZWQgc2l6ZTsKKyAgICB1bnNpZ25lZCBvZmZzZXQ7CisKKyAgICBFbnRyeSh2b2lkICpOb2RlLCB1bnNpZ25lZCBTaXplLCB1bnNpZ25lZCBPZmZzZXQpCisgICAgICA6IG5vZGUoTm9kZSksIHNpemUoU2l6ZSksIG9mZnNldChPZmZzZXQpIHt9CisKKyAgICBFbnRyeShOb2RlUmVmIE5vZGUsIHVuc2lnbmVkIE9mZnNldCkKKyAgICAgIDogbm9kZSgmTm9kZS5zdWJ0cmVlKDApKSwgc2l6ZShOb2RlLnNpemUoKSksIG9mZnNldChPZmZzZXQpIHt9CisKKyAgICBOb2RlUmVmICZzdWJ0cmVlKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PE5vZGVSZWYqPihub2RlKVtpXTsKKyAgICB9CisgIH07CisKKyAgLy8vIHBhdGggLSBUaGUgcGF0aCBlbnRyaWVzLCBwYXRoWzBdIGlzIHRoZSByb290IG5vZGUsIHBhdGguYmFjaygpIGlzIGEgbGVhZi4KKyAgU21hbGxWZWN0b3I8RW50cnksIDQ+IHBhdGg7CisKK3B1YmxpYzoKKyAgLy8gTm9kZSBhY2Nlc3NvcnMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVD4gTm9kZVQgJm5vZGUodW5zaWduZWQgTGV2ZWwpIGNvbnN0IHsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Tm9kZVQqPihwYXRoW0xldmVsXS5ub2RlKTsKKyAgfQorICB1bnNpZ25lZCBzaXplKHVuc2lnbmVkIExldmVsKSBjb25zdCB7IHJldHVybiBwYXRoW0xldmVsXS5zaXplOyB9CisgIHVuc2lnbmVkIG9mZnNldCh1bnNpZ25lZCBMZXZlbCkgY29uc3QgeyByZXR1cm4gcGF0aFtMZXZlbF0ub2Zmc2V0OyB9CisgIHVuc2lnbmVkICZvZmZzZXQodW5zaWduZWQgTGV2ZWwpIHsgcmV0dXJuIHBhdGhbTGV2ZWxdLm9mZnNldDsgfQorCisgIC8vIExlYWYgYWNjZXNzb3JzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVQ+IE5vZGVUICZsZWFmKCkgY29uc3QgeworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxOb2RlVCo+KHBhdGguYmFjaygpLm5vZGUpOworICB9CisgIHVuc2lnbmVkIGxlYWZTaXplKCkgY29uc3QgeyByZXR1cm4gcGF0aC5iYWNrKCkuc2l6ZTsgfQorICB1bnNpZ25lZCBsZWFmT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gcGF0aC5iYWNrKCkub2Zmc2V0OyB9CisgIHVuc2lnbmVkICZsZWFmT2Zmc2V0KCkgeyByZXR1cm4gcGF0aC5iYWNrKCkub2Zmc2V0OyB9CisKKyAgLy8vIHZhbGlkIC0gUmV0dXJuIHRydWUgaWYgcGF0aCBpcyBhdCBhIHZhbGlkIG5vZGUsIG5vdCBhdCBlbmQoKS4KKyAgYm9vbCB2YWxpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gIXBhdGguZW1wdHkoKSAmJiBwYXRoLmZyb250KCkub2Zmc2V0IDwgcGF0aC5mcm9udCgpLnNpemU7CisgIH0KKworICAvLy8gaGVpZ2h0IC0gUmV0dXJuIHRoZSBoZWlnaHQgb2YgdGhlIHRyZWUgY29ycmVzcG9uZGluZyB0byB0aGlzIHBhdGguCisgIC8vLyBUaGlzIG1hdGNoZXMgbWFwLT5oZWlnaHQgaW4gYSBmdWxsIHBhdGguCisgIHVuc2lnbmVkIGhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIHBhdGguc2l6ZSgpIC0gMTsgfQorCisgIC8vLyBzdWJ0cmVlIC0gR2V0IHRoZSBzdWJ0cmVlIHJlZmVyZW5jZWQgZnJvbSBMZXZlbC4gV2hlbiB0aGUgcGF0aCBpcworICAvLy8gY29uc2lzdGVudCwgbm9kZShMZXZlbCArIDEpID09IHN1YnRyZWUoTGV2ZWwpLgorICAvLy8gQHBhcmFtIExldmVsIDAuLmhlaWdodC0xLiBUaGUgbGVhdmVzIGhhdmUgbm8gc3VidHJlZXMuCisgIE5vZGVSZWYgJnN1YnRyZWUodW5zaWduZWQgTGV2ZWwpIGNvbnN0IHsKKyAgICByZXR1cm4gcGF0aFtMZXZlbF0uc3VidHJlZShwYXRoW0xldmVsXS5vZmZzZXQpOworICB9CisKKyAgLy8vIHJlc2V0IC0gUmVzZXQgY2FjaGVkIGluZm9ybWF0aW9uIGFib3V0IG5vZGUoTGV2ZWwpIGZyb20gc3VidHJlZShMZXZlbCAtMSkuCisgIC8vLyBAcGFyYW0gTGV2ZWwgMS4uaGVpZ2h0LiBUSGUgbm9kZSB0byB1cGRhdGUgYWZ0ZXIgcGFyZW50IG5vZGUgY2hhbmdlZC4KKyAgdm9pZCByZXNldCh1bnNpZ25lZCBMZXZlbCkgeworICAgIHBhdGhbTGV2ZWxdID0gRW50cnkoc3VidHJlZShMZXZlbCAtIDEpLCBvZmZzZXQoTGV2ZWwpKTsKKyAgfQorCisgIC8vLyBwdXNoIC0gQWRkIGVudHJ5IHRvIHBhdGguCisgIC8vLyBAcGFyYW0gTm9kZSBOb2RlIHRvIGFkZCwgc2hvdWxkIGJlIHN1YnRyZWUocGF0aC5zaXplKCktMSkuCisgIC8vLyBAcGFyYW0gT2Zmc2V0IE9mZnNldCBpbnRvIE5vZGUuCisgIHZvaWQgcHVzaChOb2RlUmVmIE5vZGUsIHVuc2lnbmVkIE9mZnNldCkgeworICAgIHBhdGgucHVzaF9iYWNrKEVudHJ5KE5vZGUsIE9mZnNldCkpOworICB9CisKKyAgLy8vIHBvcCAtIFJlbW92ZSB0aGUgbGFzdCBwYXRoIGVudHJ5LgorICB2b2lkIHBvcCgpIHsKKyAgICBwYXRoLnBvcF9iYWNrKCk7CisgIH0KKworICAvLy8gc2V0U2l6ZSAtIFNldCB0aGUgc2l6ZSBvZiBhIG5vZGUgYm90aCBpbiB0aGUgcGF0aCBhbmQgaW4gdGhlIHRyZWUuCisgIC8vLyBAcGFyYW0gTGV2ZWwgMC4uaGVpZ2h0LiBOb3RlIHRoYXQgc2V0dGluZyB0aGUgcm9vdCBzaXplIHdvbid0IGNoYW5nZQorICAvLy8gICAgICAgICAgICAgIG1hcC0+cm9vdFNpemUuCisgIC8vLyBAcGFyYW0gU2l6ZSBOZXcgbm9kZSBzaXplLgorICB2b2lkIHNldFNpemUodW5zaWduZWQgTGV2ZWwsIHVuc2lnbmVkIFNpemUpIHsKKyAgICBwYXRoW0xldmVsXS5zaXplID0gU2l6ZTsKKyAgICBpZiAoTGV2ZWwpCisgICAgICBzdWJ0cmVlKExldmVsIC0gMSkuc2V0U2l6ZShTaXplKTsKKyAgfQorCisgIC8vLyBzZXRSb290IC0gQ2xlYXIgdGhlIHBhdGggYW5kIHNldCBhIG5ldyByb290IG5vZGUuCisgIC8vLyBAcGFyYW0gTm9kZSBOZXcgcm9vdCBub2RlLgorICAvLy8gQHBhcmFtIFNpemUgTmV3IHJvb3Qgc2l6ZS4KKyAgLy8vIEBwYXJhbSBPZmZzZXQgT2Zmc2V0IGludG8gcm9vdCBub2RlLgorICB2b2lkIHNldFJvb3Qodm9pZCAqTm9kZSwgdW5zaWduZWQgU2l6ZSwgdW5zaWduZWQgT2Zmc2V0KSB7CisgICAgcGF0aC5jbGVhcigpOworICAgIHBhdGgucHVzaF9iYWNrKEVudHJ5KE5vZGUsIFNpemUsIE9mZnNldCkpOworICB9CisKKyAgLy8vIHJlcGxhY2VSb290IC0gUmVwbGFjZSB0aGUgY3VycmVudCByb290IG5vZGUgd2l0aCB0d28gbmV3IGVudHJpZXMgYWZ0ZXIgdGhlCisgIC8vLyB0cmVlIGhlaWdodCBoYXMgaW5jcmVhc2VkLgorICAvLy8gQHBhcmFtIFJvb3QgVGhlIG5ldyByb290IG5vZGUuCisgIC8vLyBAcGFyYW0gU2l6ZSBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbmV3IHJvb3QuCisgIC8vLyBAcGFyYW0gT2Zmc2V0cyBPZmZzZXRzIGludG8gdGhlIHJvb3QgYW5kIGZpcnN0IGJyYW5jaCBub2Rlcy4KKyAgdm9pZCByZXBsYWNlUm9vdCh2b2lkICpSb290LCB1bnNpZ25lZCBTaXplLCBJZHhQYWlyIE9mZnNldHMpOworCisgIC8vLyBnZXRMZWZ0U2libGluZyAtIEdldCB0aGUgbGVmdCBzaWJsaW5nIG5vZGUgYXQgTGV2ZWwsIG9yIGEgbnVsbCBOb2RlUmVmLgorICAvLy8gQHBhcmFtIExldmVsIEdldCB0aGUgc2libGluZyB0byBub2RlKExldmVsKS4KKyAgLy8vIEByZXR1cm4gTGVmdCBzaWJsaW5nLCBvciBOb2RlUmVmKCkuCisgIE5vZGVSZWYgZ2V0TGVmdFNpYmxpbmcodW5zaWduZWQgTGV2ZWwpIGNvbnN0OworCisgIC8vLyBtb3ZlTGVmdCAtIE1vdmUgcGF0aCB0byB0aGUgbGVmdCBzaWJsaW5nIGF0IExldmVsLiBMZWF2ZSBub2RlcyBiZWxvdyBMZXZlbAorICAvLy8gdW5hbHRlcmVkLgorICAvLy8gQHBhcmFtIExldmVsIE1vdmUgbm9kZShMZXZlbCkuCisgIHZvaWQgbW92ZUxlZnQodW5zaWduZWQgTGV2ZWwpOworCisgIC8vLyBmaWxsTGVmdCAtIEdyb3cgcGF0aCB0byBIZWlnaHQgYnkgdGFraW5nIGxlZnRtb3N0IGJyYW5jaGVzLgorICAvLy8gQHBhcmFtIEhlaWdodCBUaGUgdGFyZ2V0IGhlaWdodC4KKyAgdm9pZCBmaWxsTGVmdCh1bnNpZ25lZCBIZWlnaHQpIHsKKyAgICB3aGlsZSAoaGVpZ2h0KCkgPCBIZWlnaHQpCisgICAgICBwdXNoKHN1YnRyZWUoaGVpZ2h0KCkpLCAwKTsKKyAgfQorCisgIC8vLyBnZXRMZWZ0U2libGluZyAtIEdldCB0aGUgbGVmdCBzaWJsaW5nIG5vZGUgYXQgTGV2ZWwsIG9yIGEgbnVsbCBOb2RlUmVmLgorICAvLy8gQHBhcmFtIExldmVsIEdldCB0aGUgc2luYmxpbmcgdG8gbm9kZShMZXZlbCkuCisgIC8vLyBAcmV0dXJuIExlZnQgc2libGluZywgb3IgTm9kZVJlZigpLgorICBOb2RlUmVmIGdldFJpZ2h0U2libGluZyh1bnNpZ25lZCBMZXZlbCkgY29uc3Q7CisKKyAgLy8vIG1vdmVSaWdodCAtIE1vdmUgcGF0aCB0byB0aGUgbGVmdCBzaWJsaW5nIGF0IExldmVsLiBMZWF2ZSBub2RlcyBiZWxvdworICAvLy8gTGV2ZWwgdW5hbHRlcmVkLgorICAvLy8gQHBhcmFtIExldmVsIE1vdmUgbm9kZShMZXZlbCkuCisgIHZvaWQgbW92ZVJpZ2h0KHVuc2lnbmVkIExldmVsKTsKKworICAvLy8gYXRCZWdpbiAtIFJldHVybiB0cnVlIGlmIHBhdGggaXMgYXQgYmVnaW4oKS4KKyAgYm9vbCBhdEJlZ2luKCkgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBwYXRoLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAocGF0aFtpXS5vZmZzZXQgIT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIGF0TGFzdEVudHJ5IC0gUmV0dXJuIHRydWUgaWYgdGhlIHBhdGggaXMgYXQgdGhlIGxhc3QgZW50cnkgb2YgdGhlIG5vZGUgYXQKKyAgLy8vIExldmVsLgorICAvLy8gQHBhcmFtIExldmVsIE5vZGUgdG8gZXhhbWluZS4KKyAgYm9vbCBhdExhc3RFbnRyeSh1bnNpZ25lZCBMZXZlbCkgY29uc3QgeworICAgIHJldHVybiBwYXRoW0xldmVsXS5vZmZzZXQgPT0gcGF0aFtMZXZlbF0uc2l6ZSAtIDE7CisgIH0KKworICAvLy8gbGVnYWxpemVGb3JJbnNlcnQgLSBQcmVwYXJlIHRoZSBwYXRoIGZvciBhbiBpbnNlcnRpb24gYXQgTGV2ZWwuIFdoZW4gdGhlCisgIC8vLyBwYXRoIGlzIGF0IGVuZCgpLCBub2RlKExldmVsKSBtYXkgbm90IGJlIGEgbGVnYWwgbm9kZS4gbGVnYWxpemVGb3JJbnNlcnQKKyAgLy8vIGVuc3VyZXMgdGhhdCBub2RlKExldmVsKSBpcyByZWFsIGJ5IG1vdmluZyBiYWNrIHRvIHRoZSBsYXN0IG5vZGUgYXQgTGV2ZWwsCisgIC8vLyBhbmQgc2V0dGluZyBvZmZzZXQoTGV2ZWwpIHRvIHNpemUoTGV2ZWwpIGlmIHJlcXVpcmVkLgorICAvLy8gQHBhcmFtIExldmVsIFRoZSBsZXZlbCB3aGVyZSBhbiBpbnNlcnRpb24gaXMgYWJvdXQgdG8gdGFrZSBwbGFjZS4KKyAgdm9pZCBsZWdhbGl6ZUZvckluc2VydCh1bnNpZ25lZCBMZXZlbCkgeworICAgIGlmICh2YWxpZCgpKQorICAgICAgcmV0dXJuOworICAgIG1vdmVMZWZ0KExldmVsKTsKKyAgICArK3BhdGhbTGV2ZWxdLm9mZnNldDsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEludGVydmFsTWFwSW1wbAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8tLS0gICAgICAgICAgICAgICAgICAgICAgICAgIEludGVydmFsTWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULAorICAgICAgICAgIHVuc2lnbmVkIE4gPSBJbnRlcnZhbE1hcEltcGw6Ok5vZGVTaXplcjxLZXlULCBWYWxUPjo6TGVhZlNpemUsCisgICAgICAgICAgdHlwZW5hbWUgVHJhaXRzID0gSW50ZXJ2YWxNYXBJbmZvPEtleVQ+PgorY2xhc3MgSW50ZXJ2YWxNYXAgeworICB1c2luZyBTaXplciA9IEludGVydmFsTWFwSW1wbDo6Tm9kZVNpemVyPEtleVQsIFZhbFQ+OworICB1c2luZyBMZWFmID0gSW50ZXJ2YWxNYXBJbXBsOjpMZWFmTm9kZTxLZXlULCBWYWxULCBTaXplcjo6TGVhZlNpemUsIFRyYWl0cz47CisgIHVzaW5nIEJyYW5jaCA9CisgICAgICBJbnRlcnZhbE1hcEltcGw6OkJyYW5jaE5vZGU8S2V5VCwgVmFsVCwgU2l6ZXI6OkJyYW5jaFNpemUsIFRyYWl0cz47CisgIHVzaW5nIFJvb3RMZWFmID0gSW50ZXJ2YWxNYXBJbXBsOjpMZWFmTm9kZTxLZXlULCBWYWxULCBOLCBUcmFpdHM+OworICB1c2luZyBJZHhQYWlyID0gSW50ZXJ2YWxNYXBJbXBsOjpJZHhQYWlyOworCisgIC8vIFRoZSBSb290TGVhZiBjYXBhY2l0eSBpcyBnaXZlbiBhcyBhIHRlbXBsYXRlIHBhcmFtZXRlci4gV2UgbXVzdCBjb21wdXRlIHRoZQorICAvLyBjb3JyZXNwb25kaW5nIFJvb3RCcmFuY2ggY2FwYWNpdHkuCisgIGVudW0geworICAgIERlc2lyZWRSb290QnJhbmNoQ2FwID0gKHNpemVvZihSb290TGVhZikgLSBzaXplb2YoS2V5VCkpIC8KKyAgICAgIChzaXplb2YoS2V5VCkgKyBzaXplb2YoSW50ZXJ2YWxNYXBJbXBsOjpOb2RlUmVmKSksCisgICAgUm9vdEJyYW5jaENhcCA9IERlc2lyZWRSb290QnJhbmNoQ2FwID8gRGVzaXJlZFJvb3RCcmFuY2hDYXAgOiAxCisgIH07CisKKyAgdXNpbmcgUm9vdEJyYW5jaCA9CisgICAgICBJbnRlcnZhbE1hcEltcGw6OkJyYW5jaE5vZGU8S2V5VCwgVmFsVCwgUm9vdEJyYW5jaENhcCwgVHJhaXRzPjsKKworICAvLyBXaGVuIGJyYW5jaGVkLCB3ZSBzdG9yZSBhIGdsb2JhbCBzdGFydCBrZXkgYXMgd2VsbCBhcyB0aGUgYnJhbmNoIG5vZGUuCisgIHN0cnVjdCBSb290QnJhbmNoRGF0YSB7CisgICAgS2V5VCBzdGFydDsKKyAgICBSb290QnJhbmNoIG5vZGU7CisgIH07CisKK3B1YmxpYzoKKyAgdXNpbmcgQWxsb2NhdG9yID0gdHlwZW5hbWUgU2l6ZXI6OkFsbG9jYXRvcjsKKyAgdXNpbmcgS2V5VHlwZSA9IEtleVQ7CisgIHVzaW5nIFZhbHVlVHlwZSA9IFZhbFQ7CisgIHVzaW5nIEtleVRyYWl0cyA9IFRyYWl0czsKKworcHJpdmF0ZToKKyAgLy8gVGhlIHJvb3QgZGF0YSBpcyBlaXRoZXIgYSBSb290TGVhZiBvciBhIFJvb3RCcmFuY2hEYXRhIGluc3RhbmNlLgorICBBbGlnbmVkQ2hhckFycmF5VW5pb248Um9vdExlYWYsIFJvb3RCcmFuY2hEYXRhPiBkYXRhOworCisgIC8vIFRyZWUgaGVpZ2h0LgorICAvLyAwOiBMZWF2ZXMgaW4gcm9vdC4KKyAgLy8gMTogUm9vdCBwb2ludHMgdG8gbGVhZi4KKyAgLy8gMjogcm9vdC0+YnJhbmNoLT5sZWFmIC4uLgorICB1bnNpZ25lZCBoZWlnaHQ7CisKKyAgLy8gTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHJvb3Qgbm9kZS4KKyAgdW5zaWduZWQgcm9vdFNpemU7CisKKyAgLy8gQWxsb2NhdG9yIHVzZWQgZm9yIGNyZWF0aW5nIGV4dGVybmFsIG5vZGVzLgorICBBbGxvY2F0b3IgJmFsbG9jYXRvcjsKKworICAvLy8gZGF0YUFzIC0gUmVwcmVzZW50IGRhdGEgYXMgYSBub2RlIHR5cGUgd2l0aG91dCBicmVha2luZyBhbGlhc2luZyBydWxlcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFQgJmRhdGFBcygpIGNvbnN0IHsKKyAgICB1bmlvbiB7CisgICAgICBjb25zdCBjaGFyICpkOworICAgICAgVCAqdDsKKyAgICB9IHU7CisgICAgdS5kID0gZGF0YS5idWZmZXI7CisgICAgcmV0dXJuICp1LnQ7CisgIH0KKworICBjb25zdCBSb290TGVhZiAmcm9vdExlYWYoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFicmFuY2hlZCgpICYmICJDYW5ub3QgYWNjZXMgbGVhZiBkYXRhIGluIGJyYW5jaGVkIHJvb3QiKTsKKyAgICByZXR1cm4gZGF0YUFzPFJvb3RMZWFmPigpOworICB9CisgIFJvb3RMZWFmICZyb290TGVhZigpIHsKKyAgICBhc3NlcnQoIWJyYW5jaGVkKCkgJiYgIkNhbm5vdCBhY2NlcyBsZWFmIGRhdGEgaW4gYnJhbmNoZWQgcm9vdCIpOworICAgIHJldHVybiBkYXRhQXM8Um9vdExlYWY+KCk7CisgIH0KKworICBSb290QnJhbmNoRGF0YSAmcm9vdEJyYW5jaERhdGEoKSBjb25zdCB7CisgICAgYXNzZXJ0KGJyYW5jaGVkKCkgJiYgIkNhbm5vdCBhY2Nlc3MgYnJhbmNoIGRhdGEgaW4gbm9uLWJyYW5jaGVkIHJvb3QiKTsKKyAgICByZXR1cm4gZGF0YUFzPFJvb3RCcmFuY2hEYXRhPigpOworICB9CisgIFJvb3RCcmFuY2hEYXRhICZyb290QnJhbmNoRGF0YSgpIHsKKyAgICBhc3NlcnQoYnJhbmNoZWQoKSAmJiAiQ2Fubm90IGFjY2VzcyBicmFuY2ggZGF0YSBpbiBub24tYnJhbmNoZWQgcm9vdCIpOworICAgIHJldHVybiBkYXRhQXM8Um9vdEJyYW5jaERhdGE+KCk7CisgIH0KKworICBjb25zdCBSb290QnJhbmNoICZyb290QnJhbmNoKCkgY29uc3QgeyByZXR1cm4gcm9vdEJyYW5jaERhdGEoKS5ub2RlOyB9CisgIFJvb3RCcmFuY2ggJnJvb3RCcmFuY2goKSAgICAgICAgICAgICB7IHJldHVybiByb290QnJhbmNoRGF0YSgpLm5vZGU7IH0KKyAgS2V5VCByb290QnJhbmNoU3RhcnQoKSBjb25zdCB7IHJldHVybiByb290QnJhbmNoRGF0YSgpLnN0YXJ0OyB9CisgIEtleVQgJnJvb3RCcmFuY2hTdGFydCgpICAgICAgeyByZXR1cm4gcm9vdEJyYW5jaERhdGEoKS5zdGFydDsgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVD4gTm9kZVQgKm5ld05vZGUoKSB7CisgICAgcmV0dXJuIG5ldyhhbGxvY2F0b3IudGVtcGxhdGUgQWxsb2NhdGU8Tm9kZVQ+KCkpIE5vZGVUKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVQ+IHZvaWQgZGVsZXRlTm9kZShOb2RlVCAqUCkgeworICAgIFAtPn5Ob2RlVCgpOworICAgIGFsbG9jYXRvci5EZWFsbG9jYXRlKFApOworICB9CisKKyAgSWR4UGFpciBicmFuY2hSb290KHVuc2lnbmVkIFBvc2l0aW9uKTsKKyAgSWR4UGFpciBzcGxpdFJvb3QodW5zaWduZWQgUG9zaXRpb24pOworCisgIHZvaWQgc3dpdGNoUm9vdFRvQnJhbmNoKCkgeworICAgIHJvb3RMZWFmKCkuflJvb3RMZWFmKCk7CisgICAgaGVpZ2h0ID0gMTsKKyAgICBuZXcgKCZyb290QnJhbmNoRGF0YSgpKSBSb290QnJhbmNoRGF0YSgpOworICB9CisKKyAgdm9pZCBzd2l0Y2hSb290VG9MZWFmKCkgeworICAgIHJvb3RCcmFuY2hEYXRhKCkuflJvb3RCcmFuY2hEYXRhKCk7CisgICAgaGVpZ2h0ID0gMDsKKyAgICBuZXcoJnJvb3RMZWFmKCkpIFJvb3RMZWFmKCk7CisgIH0KKworICBib29sIGJyYW5jaGVkKCkgY29uc3QgeyByZXR1cm4gaGVpZ2h0ID4gMDsgfQorCisgIFZhbFQgdHJlZVNhZmVMb29rdXAoS2V5VCB4LCBWYWxUIE5vdEZvdW5kKSBjb25zdDsKKyAgdm9pZCB2aXNpdE5vZGVzKHZvaWQgKEludGVydmFsTWFwOjoqZikoSW50ZXJ2YWxNYXBJbXBsOjpOb2RlUmVmLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGV2ZWwpKTsKKyAgdm9pZCBkZWxldGVOb2RlKEludGVydmFsTWFwSW1wbDo6Tm9kZVJlZiBOb2RlLCB1bnNpZ25lZCBMZXZlbCk7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgSW50ZXJ2YWxNYXAoQWxsb2NhdG9yICZhKSA6IGhlaWdodCgwKSwgcm9vdFNpemUoMCksIGFsbG9jYXRvcihhKSB7CisgICAgYXNzZXJ0KCh1aW50cHRyX3QoZGF0YS5idWZmZXIpICYgKGFsaWdub2YoUm9vdExlYWYpIC0gMSkpID09IDAgJiYKKyAgICAgICAgICAgIkluc3VmZmljaWVudCBhbGlnbm1lbnQiKTsKKyAgICBuZXcoJnJvb3RMZWFmKCkpIFJvb3RMZWFmKCk7CisgIH0KKworICB+SW50ZXJ2YWxNYXAoKSB7CisgICAgY2xlYXIoKTsKKyAgICByb290TGVhZigpLn5Sb290TGVhZigpOworICB9CisKKyAgLy8vIGVtcHR5IC0gIFJldHVybiB0cnVlIHdoZW4gbm8gaW50ZXJ2YWxzIGFyZSBtYXBwZWQuCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIHJvb3RTaXplID09IDA7CisgIH0KKworICAvLy8gc3RhcnQgLSBSZXR1cm4gdGhlIHNtYWxsZXN0IG1hcHBlZCBrZXkgaW4gYSBub24tZW1wdHkgbWFwLgorICBLZXlUIHN0YXJ0KCkgY29uc3QgeworICAgIGFzc2VydCghZW1wdHkoKSAmJiAiRW1wdHkgSW50ZXJ2YWxNYXAgaGFzIG5vIHN0YXJ0Iik7CisgICAgcmV0dXJuICFicmFuY2hlZCgpID8gcm9vdExlYWYoKS5zdGFydCgwKSA6IHJvb3RCcmFuY2hTdGFydCgpOworICB9CisKKyAgLy8vIHN0b3AgLSBSZXR1cm4gdGhlIGxhcmdlc3QgbWFwcGVkIGtleSBpbiBhIG5vbi1lbXB0eSBtYXAuCisgIEtleVQgc3RvcCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWVtcHR5KCkgJiYgIkVtcHR5IEludGVydmFsTWFwIGhhcyBubyBzdG9wIik7CisgICAgcmV0dXJuICFicmFuY2hlZCgpID8gcm9vdExlYWYoKS5zdG9wKHJvb3RTaXplIC0gMSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RCcmFuY2goKS5zdG9wKHJvb3RTaXplIC0gMSk7CisgIH0KKworICAvLy8gbG9va3VwIC0gUmV0dXJuIHRoZSBtYXBwZWQgdmFsdWUgYXQgeCBvciBOb3RGb3VuZC4KKyAgVmFsVCBsb29rdXAoS2V5VCB4LCBWYWxUIE5vdEZvdW5kID0gVmFsVCgpKSBjb25zdCB7CisgICAgaWYgKGVtcHR5KCkgfHwgVHJhaXRzOjpzdGFydExlc3MoeCwgc3RhcnQoKSkgfHwgVHJhaXRzOjpzdG9wTGVzcyhzdG9wKCksIHgpKQorICAgICAgcmV0dXJuIE5vdEZvdW5kOworICAgIHJldHVybiBicmFuY2hlZCgpID8gdHJlZVNhZmVMb29rdXAoeCwgTm90Rm91bmQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RMZWFmKCkuc2FmZUxvb2t1cCh4LCBOb3RGb3VuZCk7CisgIH0KKworICAvLy8gaW5zZXJ0IC0gQWRkIGEgbWFwcGluZyBvZiBbYTtiXSB0byB5LCBjb2FsZXNjZSB3aXRoIGFkamFjZW50IGludGVydmFscy4KKyAgLy8vIEl0IGlzIGFzc3VtZWQgdGhhdCBubyBrZXkgaW4gdGhlIGludGVydmFsIGlzIG1hcHBlZCB0byBhbm90aGVyIHZhbHVlLCBidXQKKyAgLy8vIG92ZXJsYXBwaW5nIGludGVydmFscyBhbHJlYWR5IG1hcHBlZCB0byB5IHdpbGwgYmUgY29hbGVzY2VkLgorICB2b2lkIGluc2VydChLZXlUIGEsIEtleVQgYiwgVmFsVCB5KSB7CisgICAgaWYgKGJyYW5jaGVkKCkgfHwgcm9vdFNpemUgPT0gUm9vdExlYWY6OkNhcGFjaXR5KQorICAgICAgcmV0dXJuIGZpbmQoYSkuaW5zZXJ0KGEsIGIsIHkpOworCisgICAgLy8gRWFzeSBpbnNlcnQgaW50byByb290IGxlYWYuCisgICAgdW5zaWduZWQgcCA9IHJvb3RMZWFmKCkuZmluZEZyb20oMCwgcm9vdFNpemUsIGEpOworICAgIHJvb3RTaXplID0gcm9vdExlYWYoKS5pbnNlcnRGcm9tKHAsIHJvb3RTaXplLCBhLCBiLCB5KTsKKyAgfQorCisgIC8vLyBjbGVhciAtIFJlbW92ZSBhbGwgZW50cmllcy4KKyAgdm9pZCBjbGVhcigpOworCisgIGNsYXNzIGNvbnN0X2l0ZXJhdG9yOworICBjbGFzcyBpdGVyYXRvcjsKKyAgZnJpZW5kIGNsYXNzIGNvbnN0X2l0ZXJhdG9yOworICBmcmllbmQgY2xhc3MgaXRlcmF0b3I7CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7CisgICAgY29uc3RfaXRlcmF0b3IgSSgqdGhpcyk7CisgICAgSS5nb1RvQmVnaW4oKTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeworICAgIGl0ZXJhdG9yIEkoKnRoaXMpOworICAgIEkuZ29Ub0JlZ2luKCk7CisgICAgcmV0dXJuIEk7CisgIH0KKworICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7CisgICAgY29uc3RfaXRlcmF0b3IgSSgqdGhpcyk7CisgICAgSS5nb1RvRW5kKCk7CisgICAgcmV0dXJuIEk7CisgIH0KKworICBpdGVyYXRvciBlbmQoKSB7CisgICAgaXRlcmF0b3IgSSgqdGhpcyk7CisgICAgSS5nb1RvRW5kKCk7CisgICAgcmV0dXJuIEk7CisgIH0KKworICAvLy8gZmluZCAtIFJldHVybiBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgaW50ZXJ2YWwgZW5kaW5nIGF0IG9yCisgIC8vLyBhZnRlciB4LCBvciBlbmQoKS4KKyAgY29uc3RfaXRlcmF0b3IgZmluZChLZXlUIHgpIGNvbnN0IHsKKyAgICBjb25zdF9pdGVyYXRvciBJKCp0aGlzKTsKKyAgICBJLmZpbmQoeCk7CisgICAgcmV0dXJuIEk7CisgIH0KKworICBpdGVyYXRvciBmaW5kKEtleVQgeCkgeworICAgIGl0ZXJhdG9yIEkoKnRoaXMpOworICAgIEkuZmluZCh4KTsKKyAgICByZXR1cm4gSTsKKyAgfQorfTsKKworLy8vIHRyZWVTYWZlTG9va3VwIC0gUmV0dXJuIHRoZSBtYXBwZWQgdmFsdWUgYXQgeCBvciBOb3RGb3VuZCwgYXNzdW1pbmcgYQorLy8vIGJyYW5jaGVkIHJvb3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgorVmFsVCBJbnRlcnZhbE1hcDxLZXlULCBWYWxULCBOLCBUcmFpdHM+OjoKK3RyZWVTYWZlTG9va3VwKEtleVQgeCwgVmFsVCBOb3RGb3VuZCkgY29uc3QgeworICBhc3NlcnQoYnJhbmNoZWQoKSAmJiAidHJlZUxvb2t1cCBhc3N1bWVzIGEgYnJhbmNoZWQgcm9vdCIpOworCisgIEludGVydmFsTWFwSW1wbDo6Tm9kZVJlZiBOUiA9IHJvb3RCcmFuY2goKS5zYWZlTG9va3VwKHgpOworICBmb3IgKHVuc2lnbmVkIGggPSBoZWlnaHQtMTsgaDsgLS1oKQorICAgIE5SID0gTlIuZ2V0PEJyYW5jaD4oKS5zYWZlTG9va3VwKHgpOworICByZXR1cm4gTlIuZ2V0PExlYWY+KCkuc2FmZUxvb2t1cCh4LCBOb3RGb3VuZCk7Cit9CisKKy8vIGJyYW5jaFJvb3QgLSBTd2l0Y2ggZnJvbSBhIGxlYWYgcm9vdCB0byBhIGJyYW5jaGVkIHJvb3QuCisvLyBSZXR1cm4gdGhlIG5ldyAocm9vdCBvZmZzZXQsIG5vZGUgb2Zmc2V0KSBjb3JyZXNwb25kaW5nIHRvIFBvc2l0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK0ludGVydmFsTWFwSW1wbDo6SWR4UGFpciBJbnRlcnZhbE1hcDxLZXlULCBWYWxULCBOLCBUcmFpdHM+OjoKK2JyYW5jaFJvb3QodW5zaWduZWQgUG9zaXRpb24pIHsKKyAgdXNpbmcgbmFtZXNwYWNlIEludGVydmFsTWFwSW1wbDsKKyAgLy8gSG93IG1hbnkgZXh0ZXJuYWwgbGVhZiBub2RlcyB0byBob2xkIFJvb3RMZWFmKzE/CisgIGNvbnN0IHVuc2lnbmVkIE5vZGVzID0gUm9vdExlYWY6OkNhcGFjaXR5IC8gTGVhZjo6Q2FwYWNpdHkgKyAxOworCisgIC8vIENvbXB1dGUgZWxlbWVudCBkaXN0cmlidXRpb24gYW1vbmcgbmV3IG5vZGVzLgorICB1bnNpZ25lZCBzaXplW05vZGVzXTsKKyAgSWR4UGFpciBOZXdPZmZzZXQoMCwgUG9zaXRpb24pOworCisgIC8vIElzIGlzIHZlcnkgY29tbW9uIGZvciB0aGUgcm9vdCBub2RlIHRvIGJlIHNtYWxsZXIgdGhhbiBleHRlcm5hbCBub2Rlcy4KKyAgaWYgKE5vZGVzID09IDEpCisgICAgc2l6ZVswXSA9IHJvb3RTaXplOworICBlbHNlCisgICAgTmV3T2Zmc2V0ID0gZGlzdHJpYnV0ZShOb2Rlcywgcm9vdFNpemUsIExlYWY6OkNhcGFjaXR5LCAgbnVsbHB0ciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc2l0aW9uLCB0cnVlKTsKKworICAvLyBBbGxvY2F0ZSBuZXcgbm9kZXMuCisgIHVuc2lnbmVkIHBvcyA9IDA7CisgIE5vZGVSZWYgbm9kZVtOb2Rlc107CisgIGZvciAodW5zaWduZWQgbiA9IDA7IG4gIT0gTm9kZXM7ICsrbikgeworICAgIExlYWYgKkwgPSBuZXdOb2RlPExlYWY+KCk7CisgICAgTC0+Y29weShyb290TGVhZigpLCBwb3MsIDAsIHNpemVbbl0pOworICAgIG5vZGVbbl0gPSBOb2RlUmVmKEwsIHNpemVbbl0pOworICAgIHBvcyArPSBzaXplW25dOworICB9CisKKyAgLy8gRGVzdHJveSB0aGUgb2xkIGxlYWYgbm9kZSwgY29uc3RydWN0IGJyYW5jaCBub2RlIGluc3RlYWQuCisgIHN3aXRjaFJvb3RUb0JyYW5jaCgpOworICBmb3IgKHVuc2lnbmVkIG4gPSAwOyBuICE9IE5vZGVzOyArK24pIHsKKyAgICByb290QnJhbmNoKCkuc3RvcChuKSA9IG5vZGVbbl0udGVtcGxhdGUgZ2V0PExlYWY+KCkuc3RvcChzaXplW25dLTEpOworICAgIHJvb3RCcmFuY2goKS5zdWJ0cmVlKG4pID0gbm9kZVtuXTsKKyAgfQorICByb290QnJhbmNoU3RhcnQoKSA9IG5vZGVbMF0udGVtcGxhdGUgZ2V0PExlYWY+KCkuc3RhcnQoMCk7CisgIHJvb3RTaXplID0gTm9kZXM7CisgIHJldHVybiBOZXdPZmZzZXQ7Cit9CisKKy8vIHNwbGl0Um9vdCAtIFNwbGl0IHRoZSBjdXJyZW50IEJyYW5jaFJvb3QgaW50byBtdWx0aXBsZSBCcmFuY2ggbm9kZXMuCisvLyBSZXR1cm4gdGhlIG5ldyAocm9vdCBvZmZzZXQsIG5vZGUgb2Zmc2V0KSBjb3JyZXNwb25kaW5nIHRvIFBvc2l0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK0ludGVydmFsTWFwSW1wbDo6SWR4UGFpciBJbnRlcnZhbE1hcDxLZXlULCBWYWxULCBOLCBUcmFpdHM+OjoKK3NwbGl0Um9vdCh1bnNpZ25lZCBQb3NpdGlvbikgeworICB1c2luZyBuYW1lc3BhY2UgSW50ZXJ2YWxNYXBJbXBsOworICAvLyBIb3cgbWFueSBleHRlcm5hbCBsZWFmIG5vZGVzIHRvIGhvbGQgUm9vdEJyYW5jaCsxPworICBjb25zdCB1bnNpZ25lZCBOb2RlcyA9IFJvb3RCcmFuY2g6OkNhcGFjaXR5IC8gQnJhbmNoOjpDYXBhY2l0eSArIDE7CisKKyAgLy8gQ29tcHV0ZSBlbGVtZW50IGRpc3RyaWJ1dGlvbiBhbW9uZyBuZXcgbm9kZXMuCisgIHVuc2lnbmVkIFNpemVbTm9kZXNdOworICBJZHhQYWlyIE5ld09mZnNldCgwLCBQb3NpdGlvbik7CisKKyAgLy8gSXMgaXMgdmVyeSBjb21tb24gZm9yIHRoZSByb290IG5vZGUgdG8gYmUgc21hbGxlciB0aGFuIGV4dGVybmFsIG5vZGVzLgorICBpZiAoTm9kZXMgPT0gMSkKKyAgICBTaXplWzBdID0gcm9vdFNpemU7CisgIGVsc2UKKyAgICBOZXdPZmZzZXQgPSBkaXN0cmlidXRlKE5vZGVzLCByb290U2l6ZSwgTGVhZjo6Q2FwYWNpdHksICBudWxscHRyLCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zaXRpb24sIHRydWUpOworCisgIC8vIEFsbG9jYXRlIG5ldyBub2Rlcy4KKyAgdW5zaWduZWQgUG9zID0gMDsKKyAgTm9kZVJlZiBOb2RlW05vZGVzXTsKKyAgZm9yICh1bnNpZ25lZCBuID0gMDsgbiAhPSBOb2RlczsgKytuKSB7CisgICAgQnJhbmNoICpCID0gbmV3Tm9kZTxCcmFuY2g+KCk7CisgICAgQi0+Y29weShyb290QnJhbmNoKCksIFBvcywgMCwgU2l6ZVtuXSk7CisgICAgTm9kZVtuXSA9IE5vZGVSZWYoQiwgU2l6ZVtuXSk7CisgICAgUG9zICs9IFNpemVbbl07CisgIH0KKworICBmb3IgKHVuc2lnbmVkIG4gPSAwOyBuICE9IE5vZGVzOyArK24pIHsKKyAgICByb290QnJhbmNoKCkuc3RvcChuKSA9IE5vZGVbbl0udGVtcGxhdGUgZ2V0PEJyYW5jaD4oKS5zdG9wKFNpemVbbl0tMSk7CisgICAgcm9vdEJyYW5jaCgpLnN1YnRyZWUobikgPSBOb2RlW25dOworICB9CisgIHJvb3RTaXplID0gTm9kZXM7CisgICsraGVpZ2h0OworICByZXR1cm4gTmV3T2Zmc2V0OworfQorCisvLy8gdmlzaXROb2RlcyAtIFZpc2l0IGVhY2ggZXh0ZXJuYWwgbm9kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+Cit2b2lkIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgordmlzaXROb2Rlcyh2b2lkIChJbnRlcnZhbE1hcDo6KmYpKEludGVydmFsTWFwSW1wbDo6Tm9kZVJlZiwgdW5zaWduZWQgSGVpZ2h0KSkgeworICBpZiAoIWJyYW5jaGVkKCkpCisgICAgcmV0dXJuOworICBTbWFsbFZlY3RvcjxJbnRlcnZhbE1hcEltcGw6Ok5vZGVSZWYsIDQ+IFJlZnMsIE5leHRSZWZzOworCisgIC8vIENvbGxlY3QgbGV2ZWwgMCBub2RlcyBmcm9tIHRoZSByb290LgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IHJvb3RTaXplOyArK2kpCisgICAgUmVmcy5wdXNoX2JhY2socm9vdEJyYW5jaCgpLnN1YnRyZWUoaSkpOworCisgIC8vIFZpc2l0IGFsbCBicmFuY2ggbm9kZXMuCisgIGZvciAodW5zaWduZWQgaCA9IGhlaWdodCAtIDE7IGg7IC0taCkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSZWZzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDAsIHMgPSBSZWZzW2ldLnNpemUoKTsgaiAhPSBzOyArK2opCisgICAgICAgIE5leHRSZWZzLnB1c2hfYmFjayhSZWZzW2ldLnN1YnRyZWUoaikpOworICAgICAgKHRoaXMtPipmKShSZWZzW2ldLCBoKTsKKyAgICB9CisgICAgUmVmcy5jbGVhcigpOworICAgIFJlZnMuc3dhcChOZXh0UmVmcyk7CisgIH0KKworICAvLyBWaXNpdCBhbGwgbGVhZiBub2Rlcy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZnMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAodGhpcy0+KmYpKFJlZnNbaV0sIDApOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgordm9pZCBJbnRlcnZhbE1hcDxLZXlULCBWYWxULCBOLCBUcmFpdHM+OjoKK2RlbGV0ZU5vZGUoSW50ZXJ2YWxNYXBJbXBsOjpOb2RlUmVmIE5vZGUsIHVuc2lnbmVkIExldmVsKSB7CisgIGlmIChMZXZlbCkKKyAgICBkZWxldGVOb2RlKCZOb2RlLmdldDxCcmFuY2g+KCkpOworICBlbHNlCisgICAgZGVsZXRlTm9kZSgmTm9kZS5nZXQ8TGVhZj4oKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+Cit2b2lkIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgorY2xlYXIoKSB7CisgIGlmIChicmFuY2hlZCgpKSB7CisgICAgdmlzaXROb2RlcygmSW50ZXJ2YWxNYXA6OmRlbGV0ZU5vZGUpOworICAgIHN3aXRjaFJvb3RUb0xlYWYoKTsKKyAgfQorICByb290U2l6ZSA9IDA7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy0tLSAgICAgICAgICAgICAgICAgICBJbnRlcnZhbE1hcDo6Y29uc3RfaXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgIC0tLS0vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK2NsYXNzIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OmNvbnN0X2l0ZXJhdG9yIDoKKyAgcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywgVmFsVD4geworCitwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBJbnRlcnZhbE1hcDsKKworICAvLyBUaGUgbWFwIHJlZmVycmVkIHRvLgorICBJbnRlcnZhbE1hcCAqbWFwID0gbnVsbHB0cjsKKworICAvLyBXZSBzdG9yZSBhIGZ1bGwgcGF0aCBmcm9tIHRoZSByb290IHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAvLyBUaGUgcGF0aCBtYXkgYmUgcGFydGlhbGx5IGZpbGxlZCwgYnV0IG5ldmVyIGJldHdlZW4gaXRlcmF0b3IgY2FsbHMuCisgIEludGVydmFsTWFwSW1wbDo6UGF0aCBwYXRoOworCisgIGV4cGxpY2l0IGNvbnN0X2l0ZXJhdG9yKGNvbnN0IEludGVydmFsTWFwICZtYXApIDoKKyAgICBtYXAoY29uc3RfY2FzdDxJbnRlcnZhbE1hcCo+KCZtYXApKSB7fQorCisgIGJvb2wgYnJhbmNoZWQoKSBjb25zdCB7CisgICAgYXNzZXJ0KG1hcCAmJiAiSW52YWxpZCBpdGVyYXRvciIpOworICAgIHJldHVybiBtYXAtPmJyYW5jaGVkKCk7CisgIH0KKworICB2b2lkIHNldFJvb3QodW5zaWduZWQgT2Zmc2V0KSB7CisgICAgaWYgKGJyYW5jaGVkKCkpCisgICAgICBwYXRoLnNldFJvb3QoJm1hcC0+cm9vdEJyYW5jaCgpLCBtYXAtPnJvb3RTaXplLCBPZmZzZXQpOworICAgIGVsc2UKKyAgICAgIHBhdGguc2V0Um9vdCgmbWFwLT5yb290TGVhZigpLCBtYXAtPnJvb3RTaXplLCBPZmZzZXQpOworICB9CisKKyAgdm9pZCBwYXRoRmlsbEZpbmQoS2V5VCB4KTsKKyAgdm9pZCB0cmVlRmluZChLZXlUIHgpOworICB2b2lkIHRyZWVBZHZhbmNlVG8oS2V5VCB4KTsKKworICAvLy8gdW5zYWZlU3RhcnQgLSBXcml0YWJsZSBhY2Nlc3MgdG8gc3RhcnQoKSBmb3IgaXRlcmF0b3IuCisgIEtleVQgJnVuc2FmZVN0YXJ0KCkgY29uc3QgeworICAgIGFzc2VydCh2YWxpZCgpICYmICJDYW5ub3QgYWNjZXNzIGludmFsaWQgaXRlcmF0b3IiKTsKKyAgICByZXR1cm4gYnJhbmNoZWQoKSA/IHBhdGgubGVhZjxMZWFmPigpLnN0YXJ0KHBhdGgubGVhZk9mZnNldCgpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmxlYWY8Um9vdExlYWY+KCkuc3RhcnQocGF0aC5sZWFmT2Zmc2V0KCkpOworICB9CisKKyAgLy8vIHVuc2FmZVN0b3AgLSBXcml0YWJsZSBhY2Nlc3MgdG8gc3RvcCgpIGZvciBpdGVyYXRvci4KKyAgS2V5VCAmdW5zYWZlU3RvcCgpIGNvbnN0IHsKKyAgICBhc3NlcnQodmFsaWQoKSAmJiAiQ2Fubm90IGFjY2VzcyBpbnZhbGlkIGl0ZXJhdG9yIik7CisgICAgcmV0dXJuIGJyYW5jaGVkKCkgPyBwYXRoLmxlYWY8TGVhZj4oKS5zdG9wKHBhdGgubGVhZk9mZnNldCgpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmxlYWY8Um9vdExlYWY+KCkuc3RvcChwYXRoLmxlYWZPZmZzZXQoKSk7CisgIH0KKworICAvLy8gdW5zYWZlVmFsdWUgLSBXcml0YWJsZSBhY2Nlc3MgdG8gdmFsdWUoKSBmb3IgaXRlcmF0b3IuCisgIFZhbFQgJnVuc2FmZVZhbHVlKCkgY29uc3QgeworICAgIGFzc2VydCh2YWxpZCgpICYmICJDYW5ub3QgYWNjZXNzIGludmFsaWQgaXRlcmF0b3IiKTsKKyAgICByZXR1cm4gYnJhbmNoZWQoKSA/IHBhdGgubGVhZjxMZWFmPigpLnZhbHVlKHBhdGgubGVhZk9mZnNldCgpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmxlYWY8Um9vdExlYWY+KCkudmFsdWUocGF0aC5sZWFmT2Zmc2V0KCkpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIGNvbnN0X2l0ZXJhdG9yIC0gQ3JlYXRlIGFuIGl0ZXJhdG9yIHRoYXQgaXNuJ3QgcG9pbnRpbmcgYW55d2hlcmUuCisgIGNvbnN0X2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgIC8vLyBzZXRNYXAgLSBDaGFuZ2UgdGhlIG1hcCBpdGVyYXRlZCBvdmVyLiBUaGlzIGNhbGwgbXVzdCBiZSBmb2xsb3dlZCBieSBhCisgIC8vLyBjYWxsIHRvIGdvVG9CZWdpbigpLCBnb1RvRW5kKCksIG9yIGZpbmQoKQorICB2b2lkIHNldE1hcChjb25zdCBJbnRlcnZhbE1hcCAmbSkgeyBtYXAgPSBjb25zdF9jYXN0PEludGVydmFsTWFwKj4oJm0pOyB9CisKKyAgLy8vIHZhbGlkIC0gUmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgdmFsaWQsIGZhbHNlIGZvciBlbmQoKS4KKyAgYm9vbCB2YWxpZCgpIGNvbnN0IHsgcmV0dXJuIHBhdGgudmFsaWQoKTsgfQorCisgIC8vLyBhdEJlZ2luIC0gUmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgdGhlIGZpcnN0IG1hcCBlbnRyeS4KKyAgYm9vbCBhdEJlZ2luKCkgY29uc3QgeyByZXR1cm4gcGF0aC5hdEJlZ2luKCk7IH0KKworICAvLy8gc3RhcnQgLSBSZXR1cm4gdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBpbnRlcnZhbC4KKyAgY29uc3QgS2V5VCAmc3RhcnQoKSBjb25zdCB7IHJldHVybiB1bnNhZmVTdGFydCgpOyB9CisKKyAgLy8vIHN0b3AgLSBSZXR1cm4gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBpbnRlcnZhbC4KKyAgY29uc3QgS2V5VCAmc3RvcCgpIGNvbnN0IHsgcmV0dXJuIHVuc2FmZVN0b3AoKTsgfQorCisgIC8vLyB2YWx1ZSAtIFJldHVybiB0aGUgbWFwcGVkIHZhbHVlIGF0IHRoZSBjdXJyZW50IGludGVydmFsLgorICBjb25zdCBWYWxUICZ2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHVuc2FmZVZhbHVlKCk7IH0KKworICBjb25zdCBWYWxUICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiB2YWx1ZSgpOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNvbnN0X2l0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQobWFwID09IFJIUy5tYXAgJiYgIkNhbm5vdCBjb21wYXJlIGl0ZXJhdG9ycyBmcm9tIGRpZmZlcmVudCBtYXBzIik7CisgICAgaWYgKCF2YWxpZCgpKQorICAgICAgcmV0dXJuICFSSFMudmFsaWQoKTsKKyAgICBpZiAocGF0aC5sZWFmT2Zmc2V0KCkgIT0gUkhTLnBhdGgubGVhZk9mZnNldCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAmcGF0aC50ZW1wbGF0ZSBsZWFmPExlYWY+KCkgPT0gJlJIUy5wYXRoLnRlbXBsYXRlIGxlYWY8TGVhZj4oKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBjb25zdF9pdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuICFvcGVyYXRvcj09KFJIUyk7CisgIH0KKworICAvLy8gZ29Ub0JlZ2luIC0gTW92ZSB0byB0aGUgZmlyc3QgaW50ZXJ2YWwgaW4gbWFwLgorICB2b2lkIGdvVG9CZWdpbigpIHsKKyAgICBzZXRSb290KDApOworICAgIGlmIChicmFuY2hlZCgpKQorICAgICAgcGF0aC5maWxsTGVmdChtYXAtPmhlaWdodCk7CisgIH0KKworICAvLy8gZ29Ub0VuZCAtIE1vdmUgYmV5b25kIHRoZSBsYXN0IGludGVydmFsIGluIG1hcC4KKyAgdm9pZCBnb1RvRW5kKCkgeworICAgIHNldFJvb3QobWFwLT5yb290U2l6ZSk7CisgIH0KKworICAvLy8gcHJlaW5jcmVtZW50IC0gbW92ZSB0byB0aGUgbmV4dCBpbnRlcnZhbC4KKyAgY29uc3RfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgYXNzZXJ0KHZhbGlkKCkgJiYgIkNhbm5vdCBpbmNyZW1lbnQgZW5kKCkiKTsKKyAgICBpZiAoKytwYXRoLmxlYWZPZmZzZXQoKSA9PSBwYXRoLmxlYWZTaXplKCkgJiYgYnJhbmNoZWQoKSkKKyAgICAgIHBhdGgubW92ZVJpZ2h0KG1hcC0+aGVpZ2h0KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gcG9zdGluY3JlbWVudCAtIERvbnQgZG8gdGhhdCEKKyAgY29uc3RfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBjb25zdF9pdGVyYXRvciB0bXAgPSAqdGhpczsKKyAgICBvcGVyYXRvcisrKCk7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorCisgIC8vLyBwcmVkZWNyZW1lbnQgLSBtb3ZlIHRvIHRoZSBwcmV2aW91cyBpbnRlcnZhbC4KKyAgY29uc3RfaXRlcmF0b3IgJm9wZXJhdG9yLS0oKSB7CisgICAgaWYgKHBhdGgubGVhZk9mZnNldCgpICYmICh2YWxpZCgpIHx8ICFicmFuY2hlZCgpKSkKKyAgICAgIC0tcGF0aC5sZWFmT2Zmc2V0KCk7CisgICAgZWxzZQorICAgICAgcGF0aC5tb3ZlTGVmdChtYXAtPmhlaWdodCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIHBvc3RkZWNyZW1lbnQgLSBEb250IGRvIHRoYXQhCisgIGNvbnN0X2l0ZXJhdG9yIG9wZXJhdG9yLS0oaW50KSB7CisgICAgY29uc3RfaXRlcmF0b3IgdG1wID0gKnRoaXM7CisgICAgb3BlcmF0b3ItLSgpOworICAgIHJldHVybiB0bXA7CisgIH0KKworICAvLy8gZmluZCAtIE1vdmUgdG8gdGhlIGZpcnN0IGludGVydmFsIHdpdGggc3RvcCA+PSB4LCBvciBlbmQoKS4KKyAgLy8vIFRoaXMgaXMgYSBmdWxsIHNlYXJjaCBmcm9tIHRoZSByb290LCB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyBpZ25vcmVkLgorICB2b2lkIGZpbmQoS2V5VCB4KSB7CisgICAgaWYgKGJyYW5jaGVkKCkpCisgICAgICB0cmVlRmluZCh4KTsKKyAgICBlbHNlCisgICAgICBzZXRSb290KG1hcC0+cm9vdExlYWYoKS5maW5kRnJvbSgwLCBtYXAtPnJvb3RTaXplLCB4KSk7CisgIH0KKworICAvLy8gYWR2YW5jZVRvIC0gTW92ZSB0byB0aGUgZmlyc3QgaW50ZXJ2YWwgd2l0aCBzdG9wID49IHgsIG9yIGVuZCgpLgorICAvLy8gVGhlIHNlYXJjaCBpcyBzdGFydGVkIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24sIGFuZCBubyBlYXJsaWVyIHBvc2l0aW9ucworICAvLy8gY2FuIGJlIGZvdW5kLiBUaGlzIGlzIG11Y2ggZmFzdGVyIHRoYW4gZmluZCgpIGZvciBzbWFsbCBtb3Zlcy4KKyAgdm9pZCBhZHZhbmNlVG8oS2V5VCB4KSB7CisgICAgaWYgKCF2YWxpZCgpKQorICAgICAgcmV0dXJuOworICAgIGlmIChicmFuY2hlZCgpKQorICAgICAgdHJlZUFkdmFuY2VUbyh4KTsKKyAgICBlbHNlCisgICAgICBwYXRoLmxlYWZPZmZzZXQoKSA9CisgICAgICAgIG1hcC0+cm9vdExlYWYoKS5maW5kRnJvbShwYXRoLmxlYWZPZmZzZXQoKSwgbWFwLT5yb290U2l6ZSwgeCk7CisgIH0KK307CisKKy8vLyBwYXRoRmlsbEZpbmQgLSBDb21wbGV0ZSBwYXRoIGJ5IHNlYXJjaGluZyBmb3IgeC4KKy8vLyBAcGFyYW0geCBLZXkgdG8gc2VhcmNoIGZvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+Cit2b2lkIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgorY29uc3RfaXRlcmF0b3I6OnBhdGhGaWxsRmluZChLZXlUIHgpIHsKKyAgSW50ZXJ2YWxNYXBJbXBsOjpOb2RlUmVmIE5SID0gcGF0aC5zdWJ0cmVlKHBhdGguaGVpZ2h0KCkpOworICBmb3IgKHVuc2lnbmVkIGkgPSBtYXAtPmhlaWdodCAtIHBhdGguaGVpZ2h0KCkgLSAxOyBpOyAtLWkpIHsKKyAgICB1bnNpZ25lZCBwID0gTlIuZ2V0PEJyYW5jaD4oKS5zYWZlRmluZCgwLCB4KTsKKyAgICBwYXRoLnB1c2goTlIsIHApOworICAgIE5SID0gTlIuc3VidHJlZShwKTsKKyAgfQorICBwYXRoLnB1c2goTlIsIE5SLmdldDxMZWFmPigpLnNhZmVGaW5kKDAsIHgpKTsKK30KKworLy8vIHRyZWVGaW5kIC0gRmluZCBpbiBhIGJyYW5jaGVkIHRyZWUuCisvLy8gQHBhcmFtIHggS2V5IHRvIHNlYXJjaCBmb3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgordm9pZCBJbnRlcnZhbE1hcDxLZXlULCBWYWxULCBOLCBUcmFpdHM+OjoKK2NvbnN0X2l0ZXJhdG9yOjp0cmVlRmluZChLZXlUIHgpIHsKKyAgc2V0Um9vdChtYXAtPnJvb3RCcmFuY2goKS5maW5kRnJvbSgwLCBtYXAtPnJvb3RTaXplLCB4KSk7CisgIGlmICh2YWxpZCgpKQorICAgIHBhdGhGaWxsRmluZCh4KTsKK30KKworLy8vIHRyZWVBZHZhbmNlVG8gLSBGaW5kIHBvc2l0aW9uIGFmdGVyIHRoZSBjdXJyZW50IG9uZS4KKy8vLyBAcGFyYW0geCBLZXkgdG8gc2VhcmNoIGZvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+Cit2b2lkIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgorY29uc3RfaXRlcmF0b3I6OnRyZWVBZHZhbmNlVG8oS2V5VCB4KSB7CisgIC8vIENhbiB3ZSBzdGF5IG9uIHRoZSBzYW1lIGxlYWYgbm9kZT8KKyAgaWYgKCFUcmFpdHM6OnN0b3BMZXNzKHBhdGgubGVhZjxMZWFmPigpLnN0b3AocGF0aC5sZWFmU2l6ZSgpIC0gMSksIHgpKSB7CisgICAgcGF0aC5sZWFmT2Zmc2V0KCkgPSBwYXRoLmxlYWY8TGVhZj4oKS5zYWZlRmluZChwYXRoLmxlYWZPZmZzZXQoKSwgeCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gRHJvcCB0aGUgY3VycmVudCBsZWFmLgorICBwYXRoLnBvcCgpOworCisgIC8vIFNlYXJjaCB0b3dhcmRzIHRoZSByb290IGZvciBhIHVzYWJsZSBzdWJ0cmVlLgorICBpZiAocGF0aC5oZWlnaHQoKSkgeworICAgIGZvciAodW5zaWduZWQgbCA9IHBhdGguaGVpZ2h0KCkgLSAxOyBsOyAtLWwpIHsKKyAgICAgIGlmICghVHJhaXRzOjpzdG9wTGVzcyhwYXRoLm5vZGU8QnJhbmNoPihsKS5zdG9wKHBhdGgub2Zmc2V0KGwpKSwgeCkpIHsKKyAgICAgICAgLy8gVGhlIGJyYW5jaCBub2RlIGF0IGwrMSBpcyB1c2FibGUKKyAgICAgICAgcGF0aC5vZmZzZXQobCArIDEpID0KKyAgICAgICAgICBwYXRoLm5vZGU8QnJhbmNoPihsICsgMSkuc2FmZUZpbmQocGF0aC5vZmZzZXQobCArIDEpLCB4KTsKKyAgICAgICAgcmV0dXJuIHBhdGhGaWxsRmluZCh4KTsKKyAgICAgIH0KKyAgICAgIHBhdGgucG9wKCk7CisgICAgfQorICAgIC8vIElzIHRoZSBsZXZlbC0xIEJyYW5jaCB1c2FibGU/CisgICAgaWYgKCFUcmFpdHM6OnN0b3BMZXNzKG1hcC0+cm9vdEJyYW5jaCgpLnN0b3AocGF0aC5vZmZzZXQoMCkpLCB4KSkgeworICAgICAgcGF0aC5vZmZzZXQoMSkgPSBwYXRoLm5vZGU8QnJhbmNoPigxKS5zYWZlRmluZChwYXRoLm9mZnNldCgxKSwgeCk7CisgICAgICByZXR1cm4gcGF0aEZpbGxGaW5kKHgpOworICAgIH0KKyAgfQorCisgIC8vIFdlIHJlYWNoZWQgdGhlIHJvb3QuCisgIHNldFJvb3QobWFwLT5yb290QnJhbmNoKCkuZmluZEZyb20ocGF0aC5vZmZzZXQoMCksIG1hcC0+cm9vdFNpemUsIHgpKTsKKyAgaWYgKHZhbGlkKCkpCisgICAgcGF0aEZpbGxGaW5kKHgpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8tLS0gICAgICAgICAgICAgICAgICAgICAgIEludGVydmFsTWFwOjppdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+CitjbGFzcyBJbnRlcnZhbE1hcDxLZXlULCBWYWxULCBOLCBUcmFpdHM+OjppdGVyYXRvciA6IHB1YmxpYyBjb25zdF9pdGVyYXRvciB7CisgIGZyaWVuZCBjbGFzcyBJbnRlcnZhbE1hcDsKKworICB1c2luZyBJZHhQYWlyID0gSW50ZXJ2YWxNYXBJbXBsOjpJZHhQYWlyOworCisgIGV4cGxpY2l0IGl0ZXJhdG9yKEludGVydmFsTWFwICZtYXApIDogY29uc3RfaXRlcmF0b3IobWFwKSB7fQorCisgIHZvaWQgc2V0Tm9kZVN0b3AodW5zaWduZWQgTGV2ZWwsIEtleVQgU3RvcCk7CisgIGJvb2wgaW5zZXJ0Tm9kZSh1bnNpZ25lZCBMZXZlbCwgSW50ZXJ2YWxNYXBJbXBsOjpOb2RlUmVmIE5vZGUsIEtleVQgU3RvcCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVD4gYm9vbCBvdmVyZmxvdyh1bnNpZ25lZCBMZXZlbCk7CisgIHZvaWQgdHJlZUluc2VydChLZXlUIGEsIEtleVQgYiwgVmFsVCB5KTsKKyAgdm9pZCBlcmFzZU5vZGUodW5zaWduZWQgTGV2ZWwpOworICB2b2lkIHRyZWVFcmFzZShib29sIFVwZGF0ZVJvb3QgPSB0cnVlKTsKKyAgYm9vbCBjYW5Db2FsZXNjZUxlZnQoS2V5VCBTdGFydCwgVmFsVCB4KTsKKyAgYm9vbCBjYW5Db2FsZXNjZVJpZ2h0KEtleVQgU3RvcCwgVmFsVCB4KTsKKworcHVibGljOgorICAvLy8gaXRlcmF0b3IgLSBDcmVhdGUgbnVsbCBpdGVyYXRvci4KKyAgaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIHNldFN0YXJ0IC0gTW92ZSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgaW50ZXJ2YWwuCisgIC8vLyBUaGlzIG1heSBjYXVzZSBjb2FsZXNjaW5nIHdpdGggdGhlIHByZXZpb3VzIGludGVydmFsLgorICAvLy8gQHBhcmFtIGEgTmV3IHN0YXJ0IGtleSwgbXVzdCBub3Qgb3ZlcmxhcCB0aGUgcHJldmlvdXMgaW50ZXJ2YWwuCisgIHZvaWQgc2V0U3RhcnQoS2V5VCBhKTsKKworICAvLy8gc2V0U3RvcCAtIE1vdmUgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBpbnRlcnZhbC4KKyAgLy8vIFRoaXMgbWF5IGNhdXNlIGNvYWxlc2Npbmcgd2l0aCB0aGUgZm9sbG93aW5nIGludGVydmFsLgorICAvLy8gQHBhcmFtIGIgTmV3IHN0b3Aga2V5LCBtdXN0IG5vdCBvdmVybGFwIHRoZSBmb2xsb3dpbmcgaW50ZXJ2YWwuCisgIHZvaWQgc2V0U3RvcChLZXlUIGIpOworCisgIC8vLyBzZXRWYWx1ZSAtIENoYW5nZSB0aGUgbWFwcGVkIHZhbHVlIG9mIHRoZSBjdXJyZW50IGludGVydmFsLgorICAvLy8gVGhpcyBtYXkgY2F1c2UgY29hbGVzY2luZyB3aXRoIHRoZSBwcmV2aW91cyBhbmQgZm9sbG93aW5nIGludGVydmFscy4KKyAgLy8vIEBwYXJhbSB4IE5ldyB2YWx1ZS4KKyAgdm9pZCBzZXRWYWx1ZShWYWxUIHgpOworCisgIC8vLyBzZXRTdGFydFVuY2hlY2tlZCAtIE1vdmUgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGludGVydmFsIHdpdGhvdXQKKyAgLy8vIGNoZWNraW5nIGZvciBjb2FsZXNjaW5nIG9yIG92ZXJsYXBzLgorICAvLy8gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gaXQgaXMga25vd24gdGhhdCBjb2FsZXNjaW5nIGlzIG5vdCByZXF1aXJlZC4KKyAgLy8vIEBwYXJhbSBhIE5ldyBzdGFydCBrZXkuCisgIHZvaWQgc2V0U3RhcnRVbmNoZWNrZWQoS2V5VCBhKSB7IHRoaXMtPnVuc2FmZVN0YXJ0KCkgPSBhOyB9CisKKyAgLy8vIHNldFN0b3BVbmNoZWNrZWQgLSBNb3ZlIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgaW50ZXJ2YWwgd2l0aG91dCBjaGVja2luZworICAvLy8gZm9yIGNvYWxlc2Npbmcgb3Igb3ZlcmxhcHMuCisgIC8vLyBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBpdCBpcyBrbm93biB0aGF0IGNvYWxlc2NpbmcgaXMgbm90IHJlcXVpcmVkLgorICAvLy8gQHBhcmFtIGIgTmV3IHN0b3Aga2V5LgorICB2b2lkIHNldFN0b3BVbmNoZWNrZWQoS2V5VCBiKSB7CisgICAgdGhpcy0+dW5zYWZlU3RvcCgpID0gYjsKKyAgICAvLyBVcGRhdGUga2V5cyBpbiBicmFuY2ggbm9kZXMgYXMgd2VsbC4KKyAgICBpZiAodGhpcy0+cGF0aC5hdExhc3RFbnRyeSh0aGlzLT5wYXRoLmhlaWdodCgpKSkKKyAgICAgIHNldE5vZGVTdG9wKHRoaXMtPnBhdGguaGVpZ2h0KCksIGIpOworICB9CisKKyAgLy8vIHNldFZhbHVlVW5jaGVja2VkIC0gQ2hhbmdlIHRoZSBtYXBwZWQgdmFsdWUgb2YgdGhlIGN1cnJlbnQgaW50ZXJ2YWwKKyAgLy8vIHdpdGhvdXQgY2hlY2tpbmcgZm9yIGNvYWxlc2NpbmcuCisgIC8vLyBAcGFyYW0geCBOZXcgdmFsdWUuCisgIHZvaWQgc2V0VmFsdWVVbmNoZWNrZWQoVmFsVCB4KSB7IHRoaXMtPnVuc2FmZVZhbHVlKCkgPSB4OyB9CisKKyAgLy8vIGluc2VydCAtIEluc2VydCBtYXBwaW5nIFthO2JdIC0+IHkgYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICB2b2lkIGluc2VydChLZXlUIGEsIEtleVQgYiwgVmFsVCB5KTsKKworICAvLy8gZXJhc2UgLSBFcmFzZSB0aGUgY3VycmVudCBpbnRlcnZhbC4KKyAgdm9pZCBlcmFzZSgpOworCisgIGl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgIGNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvcisrKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBpdGVyYXRvciB0bXAgPSAqdGhpczsKKyAgICBvcGVyYXRvcisrKCk7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorCisgIGl0ZXJhdG9yICZvcGVyYXRvci0tKCkgeworICAgIGNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvci0tKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaXRlcmF0b3Igb3BlcmF0b3ItLShpbnQpIHsKKyAgICBpdGVyYXRvciB0bXAgPSAqdGhpczsKKyAgICBvcGVyYXRvci0tKCk7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorfTsKKworLy8vIGNhbkNvYWxlc2NlTGVmdCAtIENhbiB0aGUgY3VycmVudCBpbnRlcnZhbCBjb2FsZXNjZSB0byB0aGUgbGVmdCBhZnRlcgorLy8vIGNoYW5naW5nIHN0YXJ0IG9yIHZhbHVlPworLy8vIEBwYXJhbSBTdGFydCBOZXcgc3RhcnQgb2YgY3VycmVudCBpbnRlcnZhbC4KKy8vLyBAcGFyYW0gVmFsdWUgTmV3IHZhbHVlIGZvciBjdXJyZW50IGludGVydmFsLgorLy8vIEByZXR1cm4gVHJ1ZSB3aGVuIHVwZGF0aW5nIHRoZSBjdXJyZW50IGludGVydmFsIHdvdWxkIGVuYWJsZSBjb2FsZXNjaW5nLgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK2Jvb2wgSW50ZXJ2YWxNYXA8S2V5VCwgVmFsVCwgTiwgVHJhaXRzPjo6CitpdGVyYXRvcjo6Y2FuQ29hbGVzY2VMZWZ0KEtleVQgU3RhcnQsIFZhbFQgVmFsdWUpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIEludGVydmFsTWFwSW1wbDsKKyAgUGF0aCAmUCA9IHRoaXMtPnBhdGg7CisgIGlmICghdGhpcy0+YnJhbmNoZWQoKSkgeworICAgIHVuc2lnbmVkIGkgPSBQLmxlYWZPZmZzZXQoKTsKKyAgICBSb290TGVhZiAmTm9kZSA9IFAubGVhZjxSb290TGVhZj4oKTsKKyAgICByZXR1cm4gaSAmJiBOb2RlLnZhbHVlKGktMSkgPT0gVmFsdWUgJiYKKyAgICAgICAgICAgICAgICBUcmFpdHM6OmFkamFjZW50KE5vZGUuc3RvcChpLTEpLCBTdGFydCk7CisgIH0KKyAgLy8gQnJhbmNoZWQuCisgIGlmICh1bnNpZ25lZCBpID0gUC5sZWFmT2Zmc2V0KCkpIHsKKyAgICBMZWFmICZOb2RlID0gUC5sZWFmPExlYWY+KCk7CisgICAgcmV0dXJuIE5vZGUudmFsdWUoaS0xKSA9PSBWYWx1ZSAmJiBUcmFpdHM6OmFkamFjZW50KE5vZGUuc3RvcChpLTEpLCBTdGFydCk7CisgIH0gZWxzZSBpZiAoTm9kZVJlZiBOUiA9IFAuZ2V0TGVmdFNpYmxpbmcoUC5oZWlnaHQoKSkpIHsKKyAgICB1bnNpZ25lZCBpID0gTlIuc2l6ZSgpIC0gMTsKKyAgICBMZWFmICZOb2RlID0gTlIuZ2V0PExlYWY+KCk7CisgICAgcmV0dXJuIE5vZGUudmFsdWUoaSkgPT0gVmFsdWUgJiYgVHJhaXRzOjphZGphY2VudChOb2RlLnN0b3AoaSksIFN0YXJ0KTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBjYW5Db2FsZXNjZVJpZ2h0IC0gQ2FuIHRoZSBjdXJyZW50IGludGVydmFsIGNvYWxlc2NlIHRvIHRoZSByaWdodCBhZnRlcgorLy8vIGNoYW5naW5nIHN0b3Agb3IgdmFsdWU/CisvLy8gQHBhcmFtIFN0b3AgTmV3IHN0b3Agb2YgY3VycmVudCBpbnRlcnZhbC4KKy8vLyBAcGFyYW0gVmFsdWUgTmV3IHZhbHVlIGZvciBjdXJyZW50IGludGVydmFsLgorLy8vIEByZXR1cm4gVHJ1ZSB3aGVuIHVwZGF0aW5nIHRoZSBjdXJyZW50IGludGVydmFsIHdvdWxkIGVuYWJsZSBjb2FsZXNjaW5nLgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK2Jvb2wgSW50ZXJ2YWxNYXA8S2V5VCwgVmFsVCwgTiwgVHJhaXRzPjo6CitpdGVyYXRvcjo6Y2FuQ29hbGVzY2VSaWdodChLZXlUIFN0b3AsIFZhbFQgVmFsdWUpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIEludGVydmFsTWFwSW1wbDsKKyAgUGF0aCAmUCA9IHRoaXMtPnBhdGg7CisgIHVuc2lnbmVkIGkgPSBQLmxlYWZPZmZzZXQoKSArIDE7CisgIGlmICghdGhpcy0+YnJhbmNoZWQoKSkgeworICAgIGlmIChpID49IFAubGVhZlNpemUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBSb290TGVhZiAmTm9kZSA9IFAubGVhZjxSb290TGVhZj4oKTsKKyAgICByZXR1cm4gTm9kZS52YWx1ZShpKSA9PSBWYWx1ZSAmJiBUcmFpdHM6OmFkamFjZW50KFN0b3AsIE5vZGUuc3RhcnQoaSkpOworICB9CisgIC8vIEJyYW5jaGVkLgorICBpZiAoaSA8IFAubGVhZlNpemUoKSkgeworICAgIExlYWYgJk5vZGUgPSBQLmxlYWY8TGVhZj4oKTsKKyAgICByZXR1cm4gTm9kZS52YWx1ZShpKSA9PSBWYWx1ZSAmJiBUcmFpdHM6OmFkamFjZW50KFN0b3AsIE5vZGUuc3RhcnQoaSkpOworICB9IGVsc2UgaWYgKE5vZGVSZWYgTlIgPSBQLmdldFJpZ2h0U2libGluZyhQLmhlaWdodCgpKSkgeworICAgIExlYWYgJk5vZGUgPSBOUi5nZXQ8TGVhZj4oKTsKKyAgICByZXR1cm4gTm9kZS52YWx1ZSgwKSA9PSBWYWx1ZSAmJiBUcmFpdHM6OmFkamFjZW50KFN0b3AsIE5vZGUuc3RhcnQoMCkpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIHNldE5vZGVTdG9wIC0gVXBkYXRlIHRoZSBzdG9wIGtleSBvZiB0aGUgY3VycmVudCBub2RlIGF0IGxldmVsIGFuZCBhYm92ZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+Cit2b2lkIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgoraXRlcmF0b3I6OnNldE5vZGVTdG9wKHVuc2lnbmVkIExldmVsLCBLZXlUIFN0b3ApIHsKKyAgLy8gVGhlcmUgYXJlIG5vIHJlZmVyZW5jZXMgdG8gdGhlIHJvb3Qgbm9kZSwgc28gbm90aGluZyB0byB1cGRhdGUuCisgIGlmICghTGV2ZWwpCisgICAgcmV0dXJuOworICBJbnRlcnZhbE1hcEltcGw6OlBhdGggJlAgPSB0aGlzLT5wYXRoOworICAvLyBVcGRhdGUgbm9kZXMgcG9pbnRpbmcgdG8gdGhlIGN1cnJlbnQgbm9kZS4KKyAgd2hpbGUgKC0tTGV2ZWwpIHsKKyAgICBQLm5vZGU8QnJhbmNoPihMZXZlbCkuc3RvcChQLm9mZnNldChMZXZlbCkpID0gU3RvcDsKKyAgICBpZiAoIVAuYXRMYXN0RW50cnkoTGV2ZWwpKQorICAgICAgcmV0dXJuOworICB9CisgIC8vIFVwZGF0ZSByb290IHNlcGFyYXRlbHkgc2luY2UgaXQgaGFzIGEgZGlmZmVyZW50IGxheW91dC4KKyAgUC5ub2RlPFJvb3RCcmFuY2g+KExldmVsKS5zdG9wKFAub2Zmc2V0KExldmVsKSkgPSBTdG9wOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgordm9pZCBJbnRlcnZhbE1hcDxLZXlULCBWYWxULCBOLCBUcmFpdHM+OjoKK2l0ZXJhdG9yOjpzZXRTdGFydChLZXlUIGEpIHsKKyAgYXNzZXJ0KFRyYWl0czo6bm9uRW1wdHkoYSwgdGhpcy0+c3RvcCgpKSAmJiAiQ2Fubm90IG1vdmUgc3RhcnQgYmV5b25kIHN0b3AiKTsKKyAgS2V5VCAmQ3VyU3RhcnQgPSB0aGlzLT51bnNhZmVTdGFydCgpOworICBpZiAoIVRyYWl0czo6c3RhcnRMZXNzKGEsIEN1clN0YXJ0KSB8fCAhY2FuQ29hbGVzY2VMZWZ0KGEsIHRoaXMtPnZhbHVlKCkpKSB7CisgICAgQ3VyU3RhcnQgPSBhOworICAgIHJldHVybjsKKyAgfQorICAvLyBDb2FsZXNjZSB3aXRoIHRoZSBpbnRlcnZhbCB0byB0aGUgbGVmdC4KKyAgLS0qdGhpczsKKyAgYSA9IHRoaXMtPnN0YXJ0KCk7CisgIGVyYXNlKCk7CisgIHNldFN0YXJ0VW5jaGVja2VkKGEpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgordm9pZCBJbnRlcnZhbE1hcDxLZXlULCBWYWxULCBOLCBUcmFpdHM+OjoKK2l0ZXJhdG9yOjpzZXRTdG9wKEtleVQgYikgeworICBhc3NlcnQoVHJhaXRzOjpub25FbXB0eSh0aGlzLT5zdGFydCgpLCBiKSAmJiAiQ2Fubm90IG1vdmUgc3RvcCBiZXlvbmQgc3RhcnQiKTsKKyAgaWYgKFRyYWl0czo6c3RhcnRMZXNzKGIsIHRoaXMtPnN0b3AoKSkgfHwKKyAgICAgICFjYW5Db2FsZXNjZVJpZ2h0KGIsIHRoaXMtPnZhbHVlKCkpKSB7CisgICAgc2V0U3RvcFVuY2hlY2tlZChiKTsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gQ29hbGVzY2Ugd2l0aCBpbnRlcnZhbCB0byB0aGUgcmlnaHQuCisgIEtleVQgYSA9IHRoaXMtPnN0YXJ0KCk7CisgIGVyYXNlKCk7CisgIHNldFN0YXJ0VW5jaGVja2VkKGEpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgordm9pZCBJbnRlcnZhbE1hcDxLZXlULCBWYWxULCBOLCBUcmFpdHM+OjoKK2l0ZXJhdG9yOjpzZXRWYWx1ZShWYWxUIHgpIHsKKyAgc2V0VmFsdWVVbmNoZWNrZWQoeCk7CisgIGlmIChjYW5Db2FsZXNjZVJpZ2h0KHRoaXMtPnN0b3AoKSwgeCkpIHsKKyAgICBLZXlUIGEgPSB0aGlzLT5zdGFydCgpOworICAgIGVyYXNlKCk7CisgICAgc2V0U3RhcnRVbmNoZWNrZWQoYSk7CisgIH0KKyAgaWYgKGNhbkNvYWxlc2NlTGVmdCh0aGlzLT5zdGFydCgpLCB4KSkgeworICAgIC0tKnRoaXM7CisgICAgS2V5VCBhID0gdGhpcy0+c3RhcnQoKTsKKyAgICBlcmFzZSgpOworICAgIHNldFN0YXJ0VW5jaGVja2VkKGEpOworICB9Cit9CisKKy8vLyBpbnNlcnROb2RlIC0gaW5zZXJ0IGEgbm9kZSBiZWZvcmUgdGhlIGN1cnJlbnQgcGF0aCBhdCBsZXZlbC4KKy8vLyBMZWF2ZSB0aGUgY3VycmVudCBwYXRoIHBvaW50aW5nIGF0IHRoZSBuZXcgbm9kZS4KKy8vLyBAcGFyYW0gTGV2ZWwgcGF0aCBpbmRleCBvZiB0aGUgbm9kZSB0byBiZSBpbnNlcnRlZC4KKy8vLyBAcGFyYW0gTm9kZSBUaGUgbm9kZSB0byBiZSBpbnNlcnRlZC4KKy8vLyBAcGFyYW0gU3RvcCBUaGUgbGFzdCBpbmRleCBpbiB0aGUgbmV3IG5vZGUuCisvLy8gQHJldHVybiBUcnVlIGlmIHRoZSB0cmVlIGhlaWdodCB3YXMgaW5jcmVhc2VkLgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK2Jvb2wgSW50ZXJ2YWxNYXA8S2V5VCwgVmFsVCwgTiwgVHJhaXRzPjo6CitpdGVyYXRvcjo6aW5zZXJ0Tm9kZSh1bnNpZ25lZCBMZXZlbCwgSW50ZXJ2YWxNYXBJbXBsOjpOb2RlUmVmIE5vZGUsIEtleVQgU3RvcCkgeworICBhc3NlcnQoTGV2ZWwgJiYgIkNhbm5vdCBpbnNlcnQgbmV4dCB0byB0aGUgcm9vdCIpOworICBib29sIFNwbGl0Um9vdCA9IGZhbHNlOworICBJbnRlcnZhbE1hcCAmSU0gPSAqdGhpcy0+bWFwOworICBJbnRlcnZhbE1hcEltcGw6OlBhdGggJlAgPSB0aGlzLT5wYXRoOworCisgIGlmIChMZXZlbCA9PSAxKSB7CisgICAgLy8gSW5zZXJ0IGludG8gdGhlIHJvb3QgYnJhbmNoIG5vZGUuCisgICAgaWYgKElNLnJvb3RTaXplIDwgUm9vdEJyYW5jaDo6Q2FwYWNpdHkpIHsKKyAgICAgIElNLnJvb3RCcmFuY2goKS5pbnNlcnQoUC5vZmZzZXQoMCksIElNLnJvb3RTaXplLCBOb2RlLCBTdG9wKTsKKyAgICAgIFAuc2V0U2l6ZSgwLCArK0lNLnJvb3RTaXplKTsKKyAgICAgIFAucmVzZXQoTGV2ZWwpOworICAgICAgcmV0dXJuIFNwbGl0Um9vdDsKKyAgICB9CisKKyAgICAvLyBXZSBuZWVkIHRvIHNwbGl0IHRoZSByb290IHdoaWxlIGtlZXBpbmcgb3VyIHBvc2l0aW9uLgorICAgIFNwbGl0Um9vdCA9IHRydWU7CisgICAgSWR4UGFpciBPZmZzZXQgPSBJTS5zcGxpdFJvb3QoUC5vZmZzZXQoMCkpOworICAgIFAucmVwbGFjZVJvb3QoJklNLnJvb3RCcmFuY2goKSwgSU0ucm9vdFNpemUsIE9mZnNldCk7CisKKyAgICAvLyBGYWxsIHRocm91Z2ggdG8gaW5zZXJ0IGF0IHRoZSBuZXcgaGlnaGVyIGxldmVsLgorICAgICsrTGV2ZWw7CisgIH0KKworICAvLyBXaGVuIGluc2VydGluZyBiZWZvcmUgZW5kKCksIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgcGF0aC4KKyAgUC5sZWdhbGl6ZUZvckluc2VydCgtLUxldmVsKTsKKworICAvLyBJbnNlcnQgaW50byB0aGUgYnJhbmNoIG5vZGUgYXQgTGV2ZWwtMS4KKyAgaWYgKFAuc2l6ZShMZXZlbCkgPT0gQnJhbmNoOjpDYXBhY2l0eSkgeworICAgIC8vIEJyYW5jaCBub2RlIGlzIGZ1bGwsIGhhbmRsZSBoYW5kbGUgdGhlIG92ZXJmbG93LgorICAgIGFzc2VydCghU3BsaXRSb290ICYmICJDYW5ub3Qgb3ZlcmZsb3cgYWZ0ZXIgc3BsaXR0aW5nIHRoZSByb290Iik7CisgICAgU3BsaXRSb290ID0gb3ZlcmZsb3c8QnJhbmNoPihMZXZlbCk7CisgICAgTGV2ZWwgKz0gU3BsaXRSb290OworICB9CisgIFAubm9kZTxCcmFuY2g+KExldmVsKS5pbnNlcnQoUC5vZmZzZXQoTGV2ZWwpLCBQLnNpemUoTGV2ZWwpLCBOb2RlLCBTdG9wKTsKKyAgUC5zZXRTaXplKExldmVsLCBQLnNpemUoTGV2ZWwpICsgMSk7CisgIGlmIChQLmF0TGFzdEVudHJ5KExldmVsKSkKKyAgICBzZXROb2RlU3RvcChMZXZlbCwgU3RvcCk7CisgIFAucmVzZXQoTGV2ZWwgKyAxKTsKKyAgcmV0dXJuIFNwbGl0Um9vdDsKK30KKworLy8gaW5zZXJ0Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgordm9pZCBJbnRlcnZhbE1hcDxLZXlULCBWYWxULCBOLCBUcmFpdHM+OjoKK2l0ZXJhdG9yOjppbnNlcnQoS2V5VCBhLCBLZXlUIGIsIFZhbFQgeSkgeworICBpZiAodGhpcy0+YnJhbmNoZWQoKSkKKyAgICByZXR1cm4gdHJlZUluc2VydChhLCBiLCB5KTsKKyAgSW50ZXJ2YWxNYXAgJklNID0gKnRoaXMtPm1hcDsKKyAgSW50ZXJ2YWxNYXBJbXBsOjpQYXRoICZQID0gdGhpcy0+cGF0aDsKKworICAvLyBUcnkgc2ltcGxlIHJvb3QgbGVhZiBpbnNlcnQuCisgIHVuc2lnbmVkIFNpemUgPSBJTS5yb290TGVhZigpLmluc2VydEZyb20oUC5sZWFmT2Zmc2V0KCksIElNLnJvb3RTaXplLCBhLCBiLCB5KTsKKworICAvLyBXYXMgdGhlIHJvb3Qgbm9kZSBpbnNlcnQgc3VjY2Vzc2Z1bD8KKyAgaWYgKFNpemUgPD0gUm9vdExlYWY6OkNhcGFjaXR5KSB7CisgICAgUC5zZXRTaXplKDAsIElNLnJvb3RTaXplID0gU2l6ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gUm9vdCBsZWFmIG5vZGUgaXMgZnVsbCwgd2UgbXVzdCBicmFuY2guCisgIElkeFBhaXIgT2Zmc2V0ID0gSU0uYnJhbmNoUm9vdChQLmxlYWZPZmZzZXQoKSk7CisgIFAucmVwbGFjZVJvb3QoJklNLnJvb3RCcmFuY2goKSwgSU0ucm9vdFNpemUsIE9mZnNldCk7CisKKyAgLy8gTm93IGl0IGZpdHMgaW4gdGhlIG5ldyBsZWFmLgorICB0cmVlSW5zZXJ0KGEsIGIsIHkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgordm9pZCBJbnRlcnZhbE1hcDxLZXlULCBWYWxULCBOLCBUcmFpdHM+OjoKK2l0ZXJhdG9yOjp0cmVlSW5zZXJ0KEtleVQgYSwgS2V5VCBiLCBWYWxUIHkpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIEludGVydmFsTWFwSW1wbDsKKyAgUGF0aCAmUCA9IHRoaXMtPnBhdGg7CisKKyAgaWYgKCFQLnZhbGlkKCkpCisgICAgUC5sZWdhbGl6ZUZvckluc2VydCh0aGlzLT5tYXAtPmhlaWdodCk7CisKKyAgLy8gQ2hlY2sgaWYgdGhpcyBpbnNlcnRpb24gd2lsbCBleHRlbmQgdGhlIG5vZGUgdG8gdGhlIGxlZnQuCisgIGlmIChQLmxlYWZPZmZzZXQoKSA9PSAwICYmIFRyYWl0czo6c3RhcnRMZXNzKGEsIFAubGVhZjxMZWFmPigpLnN0YXJ0KDApKSkgeworICAgIC8vIE5vZGUgaXMgZ3Jvd2luZyB0byB0aGUgbGVmdCwgd2lsbCBpdCBhZmZlY3QgYSBsZWZ0IHNpYmxpbmcgbm9kZT8KKyAgICBpZiAoTm9kZVJlZiBTaWIgPSBQLmdldExlZnRTaWJsaW5nKFAuaGVpZ2h0KCkpKSB7CisgICAgICBMZWFmICZTaWJMZWFmID0gU2liLmdldDxMZWFmPigpOworICAgICAgdW5zaWduZWQgU2liT2ZzID0gU2liLnNpemUoKSAtIDE7CisgICAgICBpZiAoU2liTGVhZi52YWx1ZShTaWJPZnMpID09IHkgJiYKKyAgICAgICAgICBUcmFpdHM6OmFkamFjZW50KFNpYkxlYWYuc3RvcChTaWJPZnMpLCBhKSkgeworICAgICAgICAvLyBUaGlzIGluc2VydGlvbiB3aWxsIGNvYWxlc2NlIHdpdGggdGhlIGxhc3QgZW50cnkgaW4gU2liTGVhZi4gV2UgY2FuCisgICAgICAgIC8vIGhhbmRsZSBpdCBpbiB0d28gd2F5czoKKyAgICAgICAgLy8gIDEuIEV4dGVuZCBTaWJMZWFmLnN0b3AgdG8gYiBhbmQgYmUgZG9uZSwgb3IKKyAgICAgICAgLy8gIDIuIEV4dGVuZCBhIHRvIFNpYkxlYWYsIGVyYXNlIHRoZSBTaWJMZWFmIGVudHJ5IGFuZCBjb250aW51ZS4KKyAgICAgICAgLy8gV2UgcHJlZmVyIDEuLCBidXQgbmVlZCAyIHdoZW4gY29hbGVzY2luZyB0byB0aGUgcmlnaHQgYXMgd2VsbC4KKyAgICAgICAgTGVhZiAmQ3VyTGVhZiA9IFAubGVhZjxMZWFmPigpOworICAgICAgICBQLm1vdmVMZWZ0KFAuaGVpZ2h0KCkpOworICAgICAgICBpZiAoVHJhaXRzOjpzdG9wTGVzcyhiLCBDdXJMZWFmLnN0YXJ0KDApKSAmJgorICAgICAgICAgICAgKHkgIT0gQ3VyTGVhZi52YWx1ZSgwKSB8fCAhVHJhaXRzOjphZGphY2VudChiLCBDdXJMZWFmLnN0YXJ0KDApKSkpIHsKKyAgICAgICAgICAvLyBFYXN5LCBqdXN0IGV4dGVuZCBTaWJMZWFmIGFuZCB3ZSdyZSBkb25lLgorICAgICAgICAgIHNldE5vZGVTdG9wKFAuaGVpZ2h0KCksIFNpYkxlYWYuc3RvcChTaWJPZnMpID0gYik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFdlIGhhdmUgYm90aCBsZWZ0IGFuZCByaWdodCBjb2FsZXNjaW5nLiBFcmFzZSB0aGUgb2xkIFNpYkxlYWYgZW50cnkKKyAgICAgICAgICAvLyBhbmQgY29udGludWUgaW5zZXJ0aW5nIHRoZSBsYXJnZXIgaW50ZXJ2YWwuCisgICAgICAgICAgYSA9IFNpYkxlYWYuc3RhcnQoU2liT2ZzKTsKKyAgICAgICAgICB0cmVlRXJhc2UoLyogVXBkYXRlUm9vdD0gKi9mYWxzZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gTm8gbGVmdCBzaWJsaW5nIG1lYW5zIHdlIGFyZSBhdCBiZWdpbigpLiBVcGRhdGUgY2FjaGVkIGJvdW5kLgorICAgICAgdGhpcy0+bWFwLT5yb290QnJhbmNoU3RhcnQoKSA9IGE7CisgICAgfQorICB9CisKKyAgLy8gV2hlbiB3ZSBhcmUgaW5zZXJ0aW5nIGF0IHRoZSBlbmQgb2YgYSBsZWFmIG5vZGUsIHdlIG11c3QgdXBkYXRlIHN0b3BzLgorICB1bnNpZ25lZCBTaXplID0gUC5sZWFmU2l6ZSgpOworICBib29sIEdyb3cgPSBQLmxlYWZPZmZzZXQoKSA9PSBTaXplOworICBTaXplID0gUC5sZWFmPExlYWY+KCkuaW5zZXJ0RnJvbShQLmxlYWZPZmZzZXQoKSwgU2l6ZSwgYSwgYiwgeSk7CisKKyAgLy8gTGVhZiBpbnNlcnRpb24gdW5zdWNjZXNzZnVsPyBPdmVyZmxvdyBhbmQgdHJ5IGFnYWluLgorICBpZiAoU2l6ZSA+IExlYWY6OkNhcGFjaXR5KSB7CisgICAgb3ZlcmZsb3c8TGVhZj4oUC5oZWlnaHQoKSk7CisgICAgR3JvdyA9IFAubGVhZk9mZnNldCgpID09IFAubGVhZlNpemUoKTsKKyAgICBTaXplID0gUC5sZWFmPExlYWY+KCkuaW5zZXJ0RnJvbShQLmxlYWZPZmZzZXQoKSwgUC5sZWFmU2l6ZSgpLCBhLCBiLCB5KTsKKyAgICBhc3NlcnQoU2l6ZSA8PSBMZWFmOjpDYXBhY2l0eSAmJiAib3ZlcmZsb3coKSBkaWRuJ3QgbWFrZSByb29tIik7CisgIH0KKworICAvLyBJbnNlcnRlZCwgdXBkYXRlIG9mZnNldCBhbmQgbGVhZiBzaXplLgorICBQLnNldFNpemUoUC5oZWlnaHQoKSwgU2l6ZSk7CisKKyAgLy8gSW5zZXJ0IHdhcyB0aGUgbGFzdCBub2RlIGVudHJ5LCB1cGRhdGUgc3RvcHMuCisgIGlmIChHcm93KQorICAgIHNldE5vZGVTdG9wKFAuaGVpZ2h0KCksIGIpOworfQorCisvLy8gZXJhc2UgLSBlcmFzZSB0aGUgY3VycmVudCBpbnRlcnZhbCBhbmQgbW92ZSB0byB0aGUgbmV4dCBwb3NpdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+Cit2b2lkIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgoraXRlcmF0b3I6OmVyYXNlKCkgeworICBJbnRlcnZhbE1hcCAmSU0gPSAqdGhpcy0+bWFwOworICBJbnRlcnZhbE1hcEltcGw6OlBhdGggJlAgPSB0aGlzLT5wYXRoOworICBhc3NlcnQoUC52YWxpZCgpICYmICJDYW5ub3QgZXJhc2UgZW5kKCkiKTsKKyAgaWYgKHRoaXMtPmJyYW5jaGVkKCkpCisgICAgcmV0dXJuIHRyZWVFcmFzZSgpOworICBJTS5yb290TGVhZigpLmVyYXNlKFAubGVhZk9mZnNldCgpLCBJTS5yb290U2l6ZSk7CisgIFAuc2V0U2l6ZSgwLCAtLUlNLnJvb3RTaXplKTsKK30KKworLy8vIHRyZWVFcmFzZSAtIGVyYXNlKCkgZm9yIGEgYnJhbmNoZWQgdHJlZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+Cit2b2lkIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgoraXRlcmF0b3I6OnRyZWVFcmFzZShib29sIFVwZGF0ZVJvb3QpIHsKKyAgSW50ZXJ2YWxNYXAgJklNID0gKnRoaXMtPm1hcDsKKyAgSW50ZXJ2YWxNYXBJbXBsOjpQYXRoICZQID0gdGhpcy0+cGF0aDsKKyAgTGVhZiAmTm9kZSA9IFAubGVhZjxMZWFmPigpOworCisgIC8vIE5vZGVzIGFyZSBub3QgYWxsb3dlZCB0byBiZWNvbWUgZW1wdHkuCisgIGlmIChQLmxlYWZTaXplKCkgPT0gMSkgeworICAgIElNLmRlbGV0ZU5vZGUoJk5vZGUpOworICAgIGVyYXNlTm9kZShJTS5oZWlnaHQpOworICAgIC8vIFVwZGF0ZSByb290QnJhbmNoU3RhcnQgaWYgd2UgZXJhc2VkIGJlZ2luKCkuCisgICAgaWYgKFVwZGF0ZVJvb3QgJiYgSU0uYnJhbmNoZWQoKSAmJiBQLnZhbGlkKCkgJiYgUC5hdEJlZ2luKCkpCisgICAgICBJTS5yb290QnJhbmNoU3RhcnQoKSA9IFAubGVhZjxMZWFmPigpLnN0YXJ0KDApOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEVyYXNlIGN1cnJlbnQgZW50cnkuCisgIE5vZGUuZXJhc2UoUC5sZWFmT2Zmc2V0KCksIFAubGVhZlNpemUoKSk7CisgIHVuc2lnbmVkIE5ld1NpemUgPSBQLmxlYWZTaXplKCkgLSAxOworICBQLnNldFNpemUoSU0uaGVpZ2h0LCBOZXdTaXplKTsKKyAgLy8gV2hlbiB3ZSBlcmFzZSB0aGUgbGFzdCBlbnRyeSwgdXBkYXRlIHN0b3AgYW5kIG1vdmUgdG8gYSBsZWdhbCBwb3NpdGlvbi4KKyAgaWYgKFAubGVhZk9mZnNldCgpID09IE5ld1NpemUpIHsKKyAgICBzZXROb2RlU3RvcChJTS5oZWlnaHQsIE5vZGUuc3RvcChOZXdTaXplIC0gMSkpOworICAgIFAubW92ZVJpZ2h0KElNLmhlaWdodCk7CisgIH0gZWxzZSBpZiAoVXBkYXRlUm9vdCAmJiBQLmF0QmVnaW4oKSkKKyAgICBJTS5yb290QnJhbmNoU3RhcnQoKSA9IFAubGVhZjxMZWFmPigpLnN0YXJ0KDApOworfQorCisvLy8gZXJhc2VOb2RlIC0gRXJhc2UgdGhlIGN1cnJlbnQgbm9kZSBhdCBMZXZlbCBmcm9tIGl0cyBwYXJlbnQgYW5kIG1vdmUgcGF0aCB0bworLy8vIHRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgbmV4dCBzaWJsaW5nIG5vZGUuCisvLy8gVGhlIG5vZGUgbXVzdCBiZSBkZWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgorLy8vIEBwYXJhbSBMZXZlbCAxLi5oZWlnaHQsIHRoZSByb290IG5vZGUgY2Fubm90IGJlIGVyYXNlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+Cit2b2lkIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgoraXRlcmF0b3I6OmVyYXNlTm9kZSh1bnNpZ25lZCBMZXZlbCkgeworICBhc3NlcnQoTGV2ZWwgJiYgIkNhbm5vdCBlcmFzZSByb290IG5vZGUiKTsKKyAgSW50ZXJ2YWxNYXAgJklNID0gKnRoaXMtPm1hcDsKKyAgSW50ZXJ2YWxNYXBJbXBsOjpQYXRoICZQID0gdGhpcy0+cGF0aDsKKworICBpZiAoLS1MZXZlbCA9PSAwKSB7CisgICAgSU0ucm9vdEJyYW5jaCgpLmVyYXNlKFAub2Zmc2V0KDApLCBJTS5yb290U2l6ZSk7CisgICAgUC5zZXRTaXplKDAsIC0tSU0ucm9vdFNpemUpOworICAgIC8vIElmIHRoaXMgY2xlYXJlZCB0aGUgcm9vdCwgc3dpdGNoIHRvIGhlaWdodD0wLgorICAgIGlmIChJTS5lbXB0eSgpKSB7CisgICAgICBJTS5zd2l0Y2hSb290VG9MZWFmKCk7CisgICAgICB0aGlzLT5zZXRSb290KDApOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBSZW1vdmUgbm9kZSByZWYgZnJvbSBicmFuY2ggbm9kZSBhdCBMZXZlbC4KKyAgICBCcmFuY2ggJlBhcmVudCA9IFAubm9kZTxCcmFuY2g+KExldmVsKTsKKyAgICBpZiAoUC5zaXplKExldmVsKSA9PSAxKSB7CisgICAgICAvLyBCcmFuY2ggbm9kZSBiZWNhbWUgZW1wdHksIHJlbW92ZSBpdCByZWN1cnNpdmVseS4KKyAgICAgIElNLmRlbGV0ZU5vZGUoJlBhcmVudCk7CisgICAgICBlcmFzZU5vZGUoTGV2ZWwpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBCcmFuY2ggbm9kZSB3b24ndCBiZWNvbWUgZW1wdHkuCisgICAgICBQYXJlbnQuZXJhc2UoUC5vZmZzZXQoTGV2ZWwpLCBQLnNpemUoTGV2ZWwpKTsKKyAgICAgIHVuc2lnbmVkIE5ld1NpemUgPSBQLnNpemUoTGV2ZWwpIC0gMTsKKyAgICAgIFAuc2V0U2l6ZShMZXZlbCwgTmV3U2l6ZSk7CisgICAgICAvLyBJZiB3ZSByZW1vdmVkIHRoZSBsYXN0IGJyYW5jaCwgdXBkYXRlIHN0b3AgYW5kIG1vdmUgdG8gYSBsZWdhbCBwb3MuCisgICAgICBpZiAoUC5vZmZzZXQoTGV2ZWwpID09IE5ld1NpemUpIHsKKyAgICAgICAgc2V0Tm9kZVN0b3AoTGV2ZWwsIFBhcmVudC5zdG9wKE5ld1NpemUgLSAxKSk7CisgICAgICAgIFAubW92ZVJpZ2h0KExldmVsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gVXBkYXRlIHBhdGggY2FjaGUgZm9yIHRoZSBuZXcgcmlnaHQgc2libGluZyBwb3NpdGlvbi4KKyAgaWYgKFAudmFsaWQoKSkgeworICAgIFAucmVzZXQoTGV2ZWwgKyAxKTsKKyAgICBQLm9mZnNldChMZXZlbCArIDEpID0gMDsKKyAgfQorfQorCisvLy8gb3ZlcmZsb3cgLSBEaXN0cmlidXRlIGVudHJpZXMgb2YgdGhlIGN1cnJlbnQgbm9kZSBldmVubHkgYW1vbmcKKy8vLyBpdHMgc2libGluZ3MgYW5kIGVuc3VyZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgbm90IGZ1bGwuCisvLy8gVGhpcyBtYXkgcmVxdWlyZSBhbGxvY2F0aW5nIGEgbmV3IG5vZGUuCisvLy8gQHRwYXJhbSBOb2RlVCBUaGUgdHlwZSBvZiBub2RlIGF0IExldmVsIChMZWFmIG9yIEJyYW5jaCkuCisvLy8gQHBhcmFtIExldmVsIHBhdGggaW5kZXggb2YgdGhlIG92ZXJmbG93aW5nIG5vZGUuCisvLy8gQHJldHVybiBUcnVlIHdoZW4gdGhlIHRyZWUgaGVpZ2h0IHdhcyBjaGFuZ2VkLgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK3RlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVD4KK2Jvb2wgSW50ZXJ2YWxNYXA8S2V5VCwgVmFsVCwgTiwgVHJhaXRzPjo6CitpdGVyYXRvcjo6b3ZlcmZsb3codW5zaWduZWQgTGV2ZWwpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIEludGVydmFsTWFwSW1wbDsKKyAgUGF0aCAmUCA9IHRoaXMtPnBhdGg7CisgIHVuc2lnbmVkIEN1clNpemVbNF07CisgIE5vZGVUICpOb2RlWzRdOworICB1bnNpZ25lZCBOb2RlcyA9IDA7CisgIHVuc2lnbmVkIEVsZW1lbnRzID0gMDsKKyAgdW5zaWduZWQgT2Zmc2V0ID0gUC5vZmZzZXQoTGV2ZWwpOworCisgIC8vIERvIHdlIGhhdmUgYSBsZWZ0IHNpYmxpbmc/CisgIE5vZGVSZWYgTGVmdFNpYiA9IFAuZ2V0TGVmdFNpYmxpbmcoTGV2ZWwpOworICBpZiAoTGVmdFNpYikgeworICAgIE9mZnNldCArPSBFbGVtZW50cyA9IEN1clNpemVbTm9kZXNdID0gTGVmdFNpYi5zaXplKCk7CisgICAgTm9kZVtOb2RlcysrXSA9ICZMZWZ0U2liLmdldDxOb2RlVD4oKTsKKyAgfQorCisgIC8vIEN1cnJlbnQgbm9kZS4KKyAgRWxlbWVudHMgKz0gQ3VyU2l6ZVtOb2Rlc10gPSBQLnNpemUoTGV2ZWwpOworICBOb2RlW05vZGVzKytdID0gJlAubm9kZTxOb2RlVD4oTGV2ZWwpOworCisgIC8vIERvIHdlIGhhdmUgYSByaWdodCBzaWJsaW5nPworICBOb2RlUmVmIFJpZ2h0U2liID0gUC5nZXRSaWdodFNpYmxpbmcoTGV2ZWwpOworICBpZiAoUmlnaHRTaWIpIHsKKyAgICBFbGVtZW50cyArPSBDdXJTaXplW05vZGVzXSA9IFJpZ2h0U2liLnNpemUoKTsKKyAgICBOb2RlW05vZGVzKytdID0gJlJpZ2h0U2liLmdldDxOb2RlVD4oKTsKKyAgfQorCisgIC8vIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgbm9kZT8KKyAgdW5zaWduZWQgTmV3Tm9kZSA9IDA7CisgIGlmIChFbGVtZW50cyArIDEgPiBOb2RlcyAqIE5vZGVUOjpDYXBhY2l0eSkgeworICAgIC8vIEluc2VydCBOZXdOb2RlIGF0IHRoZSBwZW51bHRpbWF0ZSBwb3NpdGlvbiwgb3IgYWZ0ZXIgYSBzaW5nbGUgbm9kZS4KKyAgICBOZXdOb2RlID0gTm9kZXMgPT0gMSA/IDEgOiBOb2RlcyAtIDE7CisgICAgQ3VyU2l6ZVtOb2Rlc10gPSBDdXJTaXplW05ld05vZGVdOworICAgIE5vZGVbTm9kZXNdID0gTm9kZVtOZXdOb2RlXTsKKyAgICBDdXJTaXplW05ld05vZGVdID0gMDsKKyAgICBOb2RlW05ld05vZGVdID0gdGhpcy0+bWFwLT50ZW1wbGF0ZSBuZXdOb2RlPE5vZGVUPigpOworICAgICsrTm9kZXM7CisgIH0KKworICAvLyBDb21wdXRlIHRoZSBuZXcgZWxlbWVudCBkaXN0cmlidXRpb24uCisgIHVuc2lnbmVkIE5ld1NpemVbNF07CisgIElkeFBhaXIgTmV3T2Zmc2V0ID0gZGlzdHJpYnV0ZShOb2RlcywgRWxlbWVudHMsIE5vZGVUOjpDYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1clNpemUsIE5ld1NpemUsIE9mZnNldCwgdHJ1ZSk7CisgIGFkanVzdFNpYmxpbmdTaXplcyhOb2RlLCBOb2RlcywgQ3VyU2l6ZSwgTmV3U2l6ZSk7CisKKyAgLy8gTW92ZSBjdXJyZW50IGxvY2F0aW9uIHRvIHRoZSBsZWZ0bW9zdCBub2RlLgorICBpZiAoTGVmdFNpYikKKyAgICBQLm1vdmVMZWZ0KExldmVsKTsKKworICAvLyBFbGVtZW50cyBoYXZlIGJlZW4gcmVhcnJhbmdlZCwgbm93IHVwZGF0ZSBub2RlIHNpemVzIGFuZCBzdG9wcy4KKyAgYm9vbCBTcGxpdFJvb3QgPSBmYWxzZTsKKyAgdW5zaWduZWQgUG9zID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBLZXlUIFN0b3AgPSBOb2RlW1Bvc10tPnN0b3AoTmV3U2l6ZVtQb3NdLTEpOworICAgIGlmIChOZXdOb2RlICYmIFBvcyA9PSBOZXdOb2RlKSB7CisgICAgICBTcGxpdFJvb3QgPSBpbnNlcnROb2RlKExldmVsLCBOb2RlUmVmKE5vZGVbUG9zXSwgTmV3U2l6ZVtQb3NdKSwgU3RvcCk7CisgICAgICBMZXZlbCArPSBTcGxpdFJvb3Q7CisgICAgfSBlbHNlIHsKKyAgICAgIFAuc2V0U2l6ZShMZXZlbCwgTmV3U2l6ZVtQb3NdKTsKKyAgICAgIHNldE5vZGVTdG9wKExldmVsLCBTdG9wKTsKKyAgICB9CisgICAgaWYgKFBvcyArIDEgPT0gTm9kZXMpCisgICAgICBicmVhazsKKyAgICBQLm1vdmVSaWdodChMZXZlbCk7CisgICAgKytQb3M7CisgIH0KKworICAvLyBXaGVyZSB3YXMgST8gRmluZCBOZXdPZmZzZXQuCisgIHdoaWxlKFBvcyAhPSBOZXdPZmZzZXQuZmlyc3QpIHsKKyAgICBQLm1vdmVMZWZ0KExldmVsKTsKKyAgICAtLVBvczsKKyAgfQorICBQLm9mZnNldChMZXZlbCkgPSBOZXdPZmZzZXQuc2Vjb25kOworICByZXR1cm4gU3BsaXRSb290OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8tLS0gICAgICAgICAgICAgICAgICAgICAgIEludGVydmFsTWFwT3ZlcmxhcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBJbnRlcnZhbE1hcE92ZXJsYXBzIC0gSXRlcmF0ZSBvdmVyIHRoZSBvdmVybGFwcyBvZiBtYXBwZWQgaW50ZXJ2YWxzIGluIHR3bworLy8vIEludGVydmFsTWFwcy4gVGhlIG1hcHMgbWF5IGJlIGRpZmZlcmVudCwgYnV0IHRoZSBLZXlUIGFuZCBUcmFpdHMgdHlwZXMKKy8vLyBzaG91bGQgYmUgdGhlIHNhbWUuCisvLy8KKy8vLyBUeXBpY2FsIHVzZXM6CisvLy8KKy8vLyAxLiBUZXN0IGZvciBvdmVybGFwOgorLy8vICAgIGJvb2wgb3ZlcmxhcCA9IEludGVydmFsTWFwT3ZlcmxhcHMoYSwgYikudmFsaWQoKTsKKy8vLworLy8vIDIuIEVudW1lcmF0ZSBvdmVybGFwczoKKy8vLyAgICBmb3IgKEludGVydmFsTWFwT3ZlcmxhcHMgSShhLCBiKTsgSS52YWxpZCgpIDsgKytJKSB7IC4uLiB9CisvLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXBBLCB0eXBlbmFtZSBNYXBCPgorY2xhc3MgSW50ZXJ2YWxNYXBPdmVybGFwcyB7CisgIHVzaW5nIEtleVR5cGUgPSB0eXBlbmFtZSBNYXBBOjpLZXlUeXBlOworICB1c2luZyBUcmFpdHMgPSB0eXBlbmFtZSBNYXBBOjpLZXlUcmFpdHM7CisKKyAgdHlwZW5hbWUgTWFwQTo6Y29uc3RfaXRlcmF0b3IgcG9zQTsKKyAgdHlwZW5hbWUgTWFwQjo6Y29uc3RfaXRlcmF0b3IgcG9zQjsKKworICAvLy8gYWR2YW5jZSAtIE1vdmUgcG9zQSBhbmQgcG9zQiBmb3J3YXJkIHVudGlsIHJlYWNoaW5nIGFuIG92ZXJsYXAsIG9yIHVudGlsCisgIC8vLyBlaXRoZXIgbWVldHMgZW5kLgorICAvLy8gRG9uJ3QgbW92ZSB0aGUgaXRlcmF0b3JzIGlmIHRoZXkgYXJlIGFscmVhZHkgb3ZlcmxhcHBpbmcuCisgIHZvaWQgYWR2YW5jZSgpIHsKKyAgICBpZiAoIXZhbGlkKCkpCisgICAgICByZXR1cm47CisKKyAgICBpZiAoVHJhaXRzOjpzdG9wTGVzcyhwb3NBLnN0b3AoKSwgcG9zQi5zdGFydCgpKSkgeworICAgICAgLy8gQSBlbmRzIGJlZm9yZSBCIGJlZ2lucy4gQ2F0Y2ggdXAuCisgICAgICBwb3NBLmFkdmFuY2VUbyhwb3NCLnN0YXJ0KCkpOworICAgICAgaWYgKCFwb3NBLnZhbGlkKCkgfHwgIVRyYWl0czo6c3RvcExlc3MocG9zQi5zdG9wKCksIHBvc0Euc3RhcnQoKSkpCisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKFRyYWl0czo6c3RvcExlc3MocG9zQi5zdG9wKCksIHBvc0Euc3RhcnQoKSkpIHsKKyAgICAgIC8vIEIgZW5kcyBiZWZvcmUgQSBiZWdpbnMuIENhdGNoIHVwLgorICAgICAgcG9zQi5hZHZhbmNlVG8ocG9zQS5zdGFydCgpKTsKKyAgICAgIGlmICghcG9zQi52YWxpZCgpIHx8ICFUcmFpdHM6OnN0b3BMZXNzKHBvc0Euc3RvcCgpLCBwb3NCLnN0YXJ0KCkpKQorICAgICAgICByZXR1cm47CisgICAgfSBlbHNlCisgICAgICAvLyBBbHJlYWR5IG92ZXJsYXBwaW5nLgorICAgICAgcmV0dXJuOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIC8vIE1ha2UgYS5lbmQgPiBiLnN0YXJ0LgorICAgICAgcG9zQS5hZHZhbmNlVG8ocG9zQi5zdGFydCgpKTsKKyAgICAgIGlmICghcG9zQS52YWxpZCgpIHx8ICFUcmFpdHM6OnN0b3BMZXNzKHBvc0Iuc3RvcCgpLCBwb3NBLnN0YXJ0KCkpKQorICAgICAgICByZXR1cm47CisgICAgICAvLyBNYWtlIGIuZW5kID4gYS5zdGFydC4KKyAgICAgIHBvc0IuYWR2YW5jZVRvKHBvc0Euc3RhcnQoKSk7CisgICAgICBpZiAoIXBvc0IudmFsaWQoKSB8fCAhVHJhaXRzOjpzdG9wTGVzcyhwb3NBLnN0b3AoKSwgcG9zQi5zdGFydCgpKSkKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCitwdWJsaWM6CisgIC8vLyBJbnRlcnZhbE1hcE92ZXJsYXBzIC0gQ3JlYXRlIGFuIGl0ZXJhdG9yIGZvciB0aGUgb3ZlcmxhcHMgb2YgYSBhbmQgYi4KKyAgSW50ZXJ2YWxNYXBPdmVybGFwcyhjb25zdCBNYXBBICZhLCBjb25zdCBNYXBCICZiKQorICAgIDogcG9zQShiLmVtcHR5KCkgPyBhLmVuZCgpIDogYS5maW5kKGIuc3RhcnQoKSkpLAorICAgICAgcG9zQihwb3NBLnZhbGlkKCkgPyBiLmZpbmQocG9zQS5zdGFydCgpKSA6IGIuZW5kKCkpIHsgYWR2YW5jZSgpOyB9CisKKyAgLy8vIHZhbGlkIC0gUmV0dXJuIHRydWUgaWYgaXRlcmF0b3IgaXMgYXQgYW4gb3ZlcmxhcC4KKyAgYm9vbCB2YWxpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcG9zQS52YWxpZCgpICYmIHBvc0IudmFsaWQoKTsKKyAgfQorCisgIC8vLyBhIC0gYWNjZXNzIHRoZSBsZWZ0IGhhbmQgc2lkZSBpbiB0aGUgb3ZlcmxhcC4KKyAgY29uc3QgdHlwZW5hbWUgTWFwQTo6Y29uc3RfaXRlcmF0b3IgJmEoKSBjb25zdCB7IHJldHVybiBwb3NBOyB9CisKKyAgLy8vIGIgLSBhY2Nlc3MgdGhlIHJpZ2h0IGhhbmQgc2lkZSBpbiB0aGUgb3ZlcmxhcC4KKyAgY29uc3QgdHlwZW5hbWUgTWFwQjo6Y29uc3RfaXRlcmF0b3IgJmIoKSBjb25zdCB7IHJldHVybiBwb3NCOyB9CisKKyAgLy8vIHN0YXJ0IC0gQmVnaW5uaW5nIG9mIHRoZSBvdmVybGFwcGluZyBpbnRlcnZhbC4KKyAgS2V5VHlwZSBzdGFydCgpIGNvbnN0IHsKKyAgICBLZXlUeXBlIGFrID0gYSgpLnN0YXJ0KCk7CisgICAgS2V5VHlwZSBiayA9IGIoKS5zdGFydCgpOworICAgIHJldHVybiBUcmFpdHM6OnN0YXJ0TGVzcyhhaywgYmspID8gYmsgOiBhazsKKyAgfQorCisgIC8vLyBzdG9wIC0gRW5kIG9mIHRoZSBvdmVybGFwcGluZyBpbnRlcnZhbC4KKyAgS2V5VHlwZSBzdG9wKCkgY29uc3QgeworICAgIEtleVR5cGUgYWsgPSBhKCkuc3RvcCgpOworICAgIEtleVR5cGUgYmsgPSBiKCkuc3RvcCgpOworICAgIHJldHVybiBUcmFpdHM6OnN0YXJ0TGVzcyhhaywgYmspID8gYWsgOiBiazsKKyAgfQorCisgIC8vLyBza2lwQSAtIE1vdmUgdG8gdGhlIG5leHQgb3ZlcmxhcCB0aGF0IGRvZXNuJ3QgaW52b2x2ZSBhKCkuCisgIHZvaWQgc2tpcEEoKSB7CisgICAgKytwb3NBOworICAgIGFkdmFuY2UoKTsKKyAgfQorCisgIC8vLyBza2lwQiAtIE1vdmUgdG8gdGhlIG5leHQgb3ZlcmxhcCB0aGF0IGRvZXNuJ3QgaW52b2x2ZSBiKCkuCisgIHZvaWQgc2tpcEIoKSB7CisgICAgKytwb3NCOworICAgIGFkdmFuY2UoKTsKKyAgfQorCisgIC8vLyBQcmVpbmNyZW1lbnQgLSBNb3ZlIHRvIHRoZSBuZXh0IG92ZXJsYXAuCisgIEludGVydmFsTWFwT3ZlcmxhcHMgJm9wZXJhdG9yKysoKSB7CisgICAgLy8gQnVtcCB0aGUgaXRlcmF0b3IgdGhhdCBlbmRzIGZpcnN0LiBUaGUgb3RoZXIgb25lIG1heSBoYXZlIG1vcmUgb3ZlcmxhcHMuCisgICAgaWYgKFRyYWl0czo6c3RhcnRMZXNzKHBvc0Iuc3RvcCgpLCBwb3NBLnN0b3AoKSkpCisgICAgICBza2lwQigpOworICAgIGVsc2UKKyAgICAgIHNraXBBKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIGFkdmFuY2VUbyAtIE1vdmUgdG8gdGhlIGZpcnN0IG92ZXJsYXBwaW5nIGludGVydmFsIHdpdGgKKyAgLy8vIHN0b3BMZXNzKHgsIHN0b3AoKSkuCisgIHZvaWQgYWR2YW5jZVRvKEtleVR5cGUgeCkgeworICAgIGlmICghdmFsaWQoKSkKKyAgICAgIHJldHVybjsKKyAgICAvLyBNYWtlIHN1cmUgYWR2YW5jZVRvIHNlZXMgbW9ub3RvbmljIGtleXMuCisgICAgaWYgKFRyYWl0czo6c3RvcExlc3MocG9zQS5zdG9wKCksIHgpKQorICAgICAgcG9zQS5hZHZhbmNlVG8oeCk7CisgICAgaWYgKFRyYWl0czo6c3RvcExlc3MocG9zQi5zdG9wKCksIHgpKQorICAgICAgcG9zQi5hZHZhbmNlVG8oeCk7CisgICAgYWR2YW5jZSgpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfSU5URVJWQUxNQVBfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzBlZjg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgKQEAgLTAsMCArMSwyNzAgQEAKKy8vPT0tIGxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIC0gU21hcnQgUmVmY291bnRpbmcgUG9pbnRlciAtLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFJlZkNvdW50ZWRCYXNlLCBUaHJlYWRTYWZlUmVmQ291bnRlZEJhc2UsIGFuZAorLy8gSW50cnVzaXZlUmVmQ250UHRyIGNsYXNzZXMuCisvLworLy8gSW50cnVzaXZlUmVmQ250UHRyIGlzIGEgc21hcnQgcG9pbnRlciB0byBhbiBvYmplY3Qgd2hpY2ggbWFpbnRhaW5zIGEKKy8vIHJlZmVyZW5jZSBjb3VudC4gIChUaHJlYWRTYWZlKVJlZkNvdW50ZWRCYXNlIGlzIGEgbWl4aW4gY2xhc3MgdGhhdCBhZGRzIGEKKy8vIHJlZmNvdW50IG1lbWJlciB2YXJpYWJsZSBhbmQgbWV0aG9kcyBmb3IgdXBkYXRpbmcgdGhlIHJlZmNvdW50LiAgQW4gb2JqZWN0CisvLyB0aGF0IGluaGVyaXRzIGZyb20gKFRocmVhZFNhZmUpUmVmQ291bnRlZEJhc2UgZGVsZXRlcyBpdHNlbGYgd2hlbiBpdHMKKy8vIHJlZmNvdW50IGhpdHMgemVyby4KKy8vCisvLyBGb3IgZXhhbXBsZToKKy8vCisvLyAgIGNsYXNzIE15Q2xhc3MgOiBwdWJsaWMgUmVmQ291bnRlZEJhc2U8TXlDbGFzcz4ge307CisvLworLy8gICB2b2lkIGZvbygpIHsKKy8vICAgICAvLyBDb25zdHJ1Y3RpbmcgYW4gSW50cnVzaXZlUmVmQ250UHRyIGluY3JlYXNlcyB0aGUgcG9pbnRlZSdzIHJlZmNvdW50IGJ5CisvLyAgICAgLy8gMSAoZnJvbSAwIGluIHRoaXMgY2FzZSkuCisvLyAgICAgSW50cnVzaXZlUmVmQ250UHRyPE15Q2xhc3M+IFB0cjEobmV3IE15Q2xhc3MoKSk7CisvLworLy8gICAgIC8vIENvcHlpbmcgYW4gSW50cnVzaXZlUmVmQ250UHRyIGluY3JlYXNlcyB0aGUgcG9pbnRlZSdzIHJlZmNvdW50IGJ5IDEuCisvLyAgICAgSW50cnVzaXZlUmVmQ250UHRyPE15Q2xhc3M+IFB0cjIoUHRyMSk7CisvLworLy8gICAgIC8vIENvbnN0cnVjdGluZyBhbiBJbnRydXNpdmVSZWZDbnRQdHIgaGFzIG5vIGVmZmVjdCBvbiB0aGUgb2JqZWN0J3MKKy8vICAgICAvLyByZWZjb3VudC4gIEFmdGVyIGEgbW92ZSwgdGhlIG1vdmVkLWZyb20gcG9pbnRlciBpcyBudWxsLgorLy8gICAgIEludHJ1c2l2ZVJlZkNudFB0cjxNeUNsYXNzPiBQdHIzKHN0ZDo6bW92ZShQdHIxKSk7CisvLyAgICAgYXNzZXJ0KFB0cjEgPT0gbnVsbHB0cik7CisvLworLy8gICAgIC8vIENsZWFyaW5nIGFuIEludHJ1c2l2ZVJlZkNudFB0ciBkZWNyZWFzZXMgdGhlIHBvaW50ZWUncyByZWZjb3VudCBieSAxLgorLy8gICAgIFB0cjIucmVzZXQoKTsKKy8vCisvLyAgICAgLy8gVGhlIG9iamVjdCBkZWxldGVzIGl0c2VsZiB3aGVuIHdlIHJldHVybiBmcm9tIHRoZSBmdW5jdGlvbiwgYmVjYXVzZQorLy8gICAgIC8vIFB0cjMncyBkZXN0cnVjdG9yIGRlY3JlbWVudHMgaXRzIHJlZmNvdW50IHRvIDAuCisvLyAgIH0KKy8vCisvLyBZb3UgY2FuIHVzZSBJbnRydXNpdmVSZWZDbnRQdHIgd2l0aCBpc2E8VD4oKSwgZHluX2Nhc3Q8VD4oKSwgZXRjLjoKKy8vCisvLyAgIEludHJ1c2l2ZVJlZkNudFB0cjxNeUNsYXNzPiBQdHIobmV3IE15Q2xhc3MoKSk7CisvLyAgIE90aGVyQ2xhc3MgKk90aGVyID0gZHluX2Nhc3Q8T3RoZXJDbGFzcz4oUHRyKTsgIC8vIFB0ci5nZXQoKSBub3QgcmVxdWlyZWQKKy8vCisvLyBJbnRydXNpdmVSZWZDbnRQdHIgd29ya3Mgd2l0aCBhbnkgY2xhc3MgdGhhdAorLy8KKy8vICAtIGluaGVyaXRzIGZyb20gKFRocmVhZFNhZmUpUmVmQ291bnRlZEJhc2UsCisvLyAgLSBoYXMgUmV0YWluKCkgYW5kIFJlbGVhc2UoKSBtZXRob2RzLCBvcgorLy8gIC0gc3BlY2lhbGl6ZXMgSW50cnVzaXZlUmVmQ250UHRySW5mby4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0lOVFJVU0lWRVJFRkNOVFBUUl9ICisjZGVmaW5lIExMVk1fQURUX0lOVFJVU0lWRVJFRkNOVFBUUl9ICisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBIENSVFAgbWl4aW4gY2xhc3MgdGhhdCBhZGRzIHJlZmVyZW5jZSBjb3VudGluZyB0byBhIHR5cGUuCisvLy8KKy8vLyBUaGUgbGlmZXRpbWUgb2YgYW4gb2JqZWN0IHdoaWNoIGluaGVyaXRzIGZyb20gUmVmQ291bnRlZEJhc2UgaXMgbWFuYWdlZCBieQorLy8vIGNhbGxzIHRvIFJlbGVhc2UoKSBhbmQgUmV0YWluKCksIHdoaWNoIGluY3JlbWVudCBhbmQgZGVjcmVtZW50IHRoZSBvYmplY3QncworLy8vIHJlZmNvdW50LCByZXNwZWN0aXZlbHkuICBXaGVuIGEgUmVsZWFzZSgpIGNhbGwgZGVjcmVtZW50cyB0aGUgcmVmY291bnQgdG8gMCwKKy8vLyB0aGUgb2JqZWN0IGRlbGV0ZXMgaXRzZWxmLgordGVtcGxhdGUgPGNsYXNzIERlcml2ZWQ+IGNsYXNzIFJlZkNvdW50ZWRCYXNlIHsKKyAgbXV0YWJsZSB1bnNpZ25lZCBSZWZDb3VudCA9IDA7CisKK3B1YmxpYzoKKyAgUmVmQ291bnRlZEJhc2UoKSA9IGRlZmF1bHQ7CisgIFJlZkNvdW50ZWRCYXNlKGNvbnN0IFJlZkNvdW50ZWRCYXNlICYpIHt9CisKKyAgdm9pZCBSZXRhaW4oKSBjb25zdCB7ICsrUmVmQ291bnQ7IH0KKworICB2b2lkIFJlbGVhc2UoKSBjb25zdCB7CisgICAgYXNzZXJ0KFJlZkNvdW50ID4gMCAmJiAiUmVmZXJlbmNlIGNvdW50IGlzIGFscmVhZHkgemVyby4iKTsKKyAgICBpZiAoLS1SZWZDb3VudCA9PSAwKQorICAgICAgZGVsZXRlIHN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQgKj4odGhpcyk7CisgIH0KK307CisKKy8vLyBBIHRocmVhZC1zYWZlIHZlcnNpb24gb2YgXGMgUmVmQ291bnRlZEJhc2UuCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZD4gY2xhc3MgVGhyZWFkU2FmZVJlZkNvdW50ZWRCYXNlIHsKKyAgbXV0YWJsZSBzdGQ6OmF0b21pYzxpbnQ+IFJlZkNvdW50OworCitwcm90ZWN0ZWQ6CisgIFRocmVhZFNhZmVSZWZDb3VudGVkQmFzZSgpIDogUmVmQ291bnQoMCkge30KKworcHVibGljOgorICB2b2lkIFJldGFpbigpIGNvbnN0IHsgUmVmQ291bnQuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOyB9CisKKyAgdm9pZCBSZWxlYXNlKCkgY29uc3QgeworICAgIGludCBOZXdSZWZDb3VudCA9IFJlZkNvdW50LmZldGNoX3N1YigxLCBzdGQ6Om1lbW9yeV9vcmRlcl9hY3FfcmVsKSAtIDE7CisgICAgYXNzZXJ0KE5ld1JlZkNvdW50ID49IDAgJiYgIlJlZmVyZW5jZSBjb3VudCB3YXMgYWxyZWFkeSB6ZXJvLiIpOworICAgIGlmIChOZXdSZWZDb3VudCA9PSAwKQorICAgICAgZGVsZXRlIHN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQgKj4odGhpcyk7CisgIH0KK307CisKKy8vLyBDbGFzcyB5b3UgY2FuIHNwZWNpYWxpemUgdG8gcHJvdmlkZSBjdXN0b20gcmV0YWluL3JlbGVhc2UgZnVuY3Rpb25hbGl0eSBmb3IKKy8vLyBhIHR5cGUuCisvLy8KKy8vLyBVc3VhbGx5IHNwZWNpYWxpemluZyB0aGlzIGNsYXNzIGlzIG5vdCBuZWNlc3NhcnksIGFzIEludHJ1c2l2ZVJlZkNudFB0cgorLy8vIHdvcmtzIHdpdGggYW55IHR5cGUgd2hpY2ggZGVmaW5lcyBSZXRhaW4oKSBhbmQgUmVsZWFzZSgpIGZ1bmN0aW9ucyAtLSB5b3UKKy8vLyBjYW4gZGVmaW5lIHRob3NlIGZ1bmN0aW9ucyB5b3Vyc2VsZiBpZiBSZWZDb3VudGVkQmFzZSBkb2Vzbid0IHdvcmsgZm9yIHlvdS4KKy8vLworLy8vIE9uZSBjYXNlIHdoZW4geW91IG1pZ2h0IHdhbnQgdG8gc3BlY2lhbGl6ZSB0aGlzIHR5cGUgaXMgaWYgeW91IGhhdmUKKy8vLyAgLSBGb28uaCBkZWZpbmVzIHR5cGUgRm9vIGFuZCBpbmNsdWRlcyBCYXIuaCwgYW5kCisvLy8gIC0gQmFyLmggdXNlcyBJbnRydXNpdmVSZWZDbnRQdHI8Rm9vPiBpbiBpbmxpbmUgZnVuY3Rpb25zLgorLy8vCisvLy8gQmVjYXVzZSBGb28uaCBpbmNsdWRlcyBCYXIuaCwgQmFyLmggY2FuJ3QgaW5jbHVkZSBGb28uaCBpbiBvcmRlciB0byBwdWxsIGluCisvLy8gdGhlIGRlY2xhcmF0aW9uIG9mIEZvby4gIFdpdGhvdXQgdGhlIGRlY2xhcmF0aW9uIG9mIEZvbywgbm9ybWFsbHkgQmFyLmgKKy8vLyB3b3VsZG4ndCBiZSBhYmxlIHRvIHVzZSBJbnRydXNpdmVSZWZDbnRQdHI8Rm9vPiwgd2hpY2ggd2FudHMgdG8gY2FsbAorLy8vIFQ6OlJldGFpbiBhbmQgVDo6UmVsZWFzZS4KKy8vLworLy8vIFRvIHJlc29sdmUgdGhpcywgQmFyLmggY291bGQgaW5jbHVkZSBhIHRoaXJkIGhlYWRlciwgRm9vRndkLmgsIHdoaWNoCisvLy8gZm9yd2FyZC1kZWNsYXJlcyBGb28gYW5kIHNwZWNpYWxpemVzIEludHJ1c2l2ZVJlZkNudFB0ckluZm88Rm9vPi4gIFRoZW4KKy8vLyBCYXIuaCBjb3VsZCB1c2UgSW50cnVzaXZlUmVmQ250UHRyPEZvbz4sIGFsdGhvdWdoIGl0IHN0aWxsIGNvdWxkbid0IGNhbGwgYW55CisvLy8gZnVuY3Rpb25zIG9uIEZvbyBpdHNlbGYsIGJlY2F1c2UgRm9vIHdvdWxkIGJlIGFuIGluY29tcGxldGUgdHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgSW50cnVzaXZlUmVmQ250UHRySW5mbyB7CisgIHN0YXRpYyB2b2lkIHJldGFpbihUICpvYmopIHsgb2JqLT5SZXRhaW4oKTsgfQorICBzdGF0aWMgdm9pZCByZWxlYXNlKFQgKm9iaikgeyBvYmotPlJlbGVhc2UoKTsgfQorfTsKKworLy8vIEEgc21hcnQgcG9pbnRlciB0byBhIHJlZmVyZW5jZS1jb3VudGVkIG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20KKy8vLyBSZWZDb3VudGVkQmFzZSBvciBUaHJlYWRTYWZlUmVmQ291bnRlZEJhc2UuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGluY3JlbWVudHMgaXRzIHBvaW50ZWUncyByZWZlcmVuY2UgY291bnQgd2hlbiBpdCBpcyBjcmVhdGVkLCBhbmQKKy8vLyBkZWNyZW1lbnRzIGl0cyByZWZjb3VudCB3aGVuIGl0J3MgZGVzdHJveWVkIChvciBpcyBjaGFuZ2VkIHRvIHBvaW50IHRvIGEKKy8vLyBkaWZmZXJlbnQgb2JqZWN0KS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBJbnRydXNpdmVSZWZDbnRQdHIgeworICBUICpPYmogPSBudWxscHRyOworCitwdWJsaWM6CisgIHVzaW5nIGVsZW1lbnRfdHlwZSA9IFQ7CisKKyAgZXhwbGljaXQgSW50cnVzaXZlUmVmQ250UHRyKCkgPSBkZWZhdWx0OworICBJbnRydXNpdmVSZWZDbnRQdHIoVCAqb2JqKSA6IE9iaihvYmopIHsgcmV0YWluKCk7IH0KKyAgSW50cnVzaXZlUmVmQ250UHRyKGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0ciAmUykgOiBPYmooUy5PYmopIHsgcmV0YWluKCk7IH0KKyAgSW50cnVzaXZlUmVmQ250UHRyKEludHJ1c2l2ZVJlZkNudFB0ciAmJlMpIDogT2JqKFMuT2JqKSB7IFMuT2JqID0gbnVsbHB0cjsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBYPgorICBJbnRydXNpdmVSZWZDbnRQdHIoSW50cnVzaXZlUmVmQ250UHRyPFg+ICYmUykgOiBPYmooUy5nZXQoKSkgeworICAgIFMuT2JqID0gbnVsbHB0cjsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBYPgorICBJbnRydXNpdmVSZWZDbnRQdHIoY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFg+ICZTKSA6IE9iaihTLmdldCgpKSB7CisgICAgcmV0YWluKCk7CisgIH0KKworICB+SW50cnVzaXZlUmVmQ250UHRyKCkgeyByZWxlYXNlKCk7IH0KKworICBJbnRydXNpdmVSZWZDbnRQdHIgJm9wZXJhdG9yPShJbnRydXNpdmVSZWZDbnRQdHIgUykgeworICAgIHN3YXAoUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVCAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKk9iajsgfQorICBUICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gT2JqOyB9CisgIFQgKmdldCgpIGNvbnN0IHsgcmV0dXJuIE9iajsgfQorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gT2JqOyB9CisKKyAgdm9pZCBzd2FwKEludHJ1c2l2ZVJlZkNudFB0ciAmb3RoZXIpIHsKKyAgICBUICp0bXAgPSBvdGhlci5PYmo7CisgICAgb3RoZXIuT2JqID0gT2JqOworICAgIE9iaiA9IHRtcDsKKyAgfQorCisgIHZvaWQgcmVzZXQoKSB7CisgICAgcmVsZWFzZSgpOworICAgIE9iaiA9IG51bGxwdHI7CisgIH0KKworICB2b2lkIHJlc2V0V2l0aG91dFJlbGVhc2UoKSB7IE9iaiA9IG51bGxwdHI7IH0KKworcHJpdmF0ZToKKyAgdm9pZCByZXRhaW4oKSB7CisgICAgaWYgKE9iaikKKyAgICAgIEludHJ1c2l2ZVJlZkNudFB0ckluZm88VD46OnJldGFpbihPYmopOworICB9CisKKyAgdm9pZCByZWxlYXNlKCkgeworICAgIGlmIChPYmopCisgICAgICBJbnRydXNpdmVSZWZDbnRQdHJJbmZvPFQ+OjpyZWxlYXNlKE9iaik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgWD4gZnJpZW5kIGNsYXNzIEludHJ1c2l2ZVJlZkNudFB0cjsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgoraW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8VD4gJkEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxVPiAmQikgeworICByZXR1cm4gQS5nZXQoKSA9PSBCLmdldCgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFQ+ICZBLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8VT4gJkIpIHsKKyAgcmV0dXJuIEEuZ2V0KCkgIT0gQi5nZXQoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxUPiAmQSwgVSAqQikgeworICByZXR1cm4gQS5nZXQoKSA9PSBCOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFQ+ICZBLCBVICpCKSB7CisgIHJldHVybiBBLmdldCgpICE9IEI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgoraW5saW5lIGJvb2wgb3BlcmF0b3I9PShUICpBLCBjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8VT4gJkIpIHsKKyAgcmV0dXJuIEEgPT0gQi5nZXQoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+CitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KFQgKkEsIGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxVPiAmQikgeworICByZXR1cm4gQSAhPSBCLmdldCgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgb3BlcmF0b3I9PShzdGQ6Om51bGxwdHJfdCBBLCBjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8VD4gJkIpIHsKKyAgcmV0dXJuICFCOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8VD4gJkEsIHN0ZDo6bnVsbHB0cl90IEIpIHsKKyAgcmV0dXJuIEIgPT0gQTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIG9wZXJhdG9yIT0oc3RkOjpudWxscHRyX3QgQSwgY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFQ+ICZCKSB7CisgIHJldHVybiAhKEEgPT0gQik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorYm9vbCBvcGVyYXRvciE9KGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxUPiAmQSwgc3RkOjpudWxscHRyX3QgQikgeworICByZXR1cm4gIShBID09IEIpOworfQorCisvLyBNYWtlIEludHJ1c2l2ZVJlZkNudFB0ciB3b3JrIHdpdGggZHluX2Nhc3QsIGlzYSwgYW5kIHRoZSBvdGhlciBpZGlvbXMgZnJvbQorLy8gQ2FzdGluZy5oLgordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+IHN0cnVjdCBzaW1wbGlmeV90eXBlOworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8SW50cnVzaXZlUmVmQ250UHRyPFQ+PiB7CisgIHVzaW5nIFNpbXBsZVR5cGUgPSBUICo7CisKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKEludHJ1c2l2ZVJlZkNudFB0cjxUPiAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXQoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBzaW1wbGlmeV90eXBlPGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxUPj4geworICB1c2luZyBTaW1wbGVUeXBlID0gLypjb25zdCovIFQgKjsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFQ+ICZWYWwpIHsKKyAgICByZXR1cm4gVmFsLmdldCgpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfSU5UUlVTSVZFUkVGQ05UUFRSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL01hcFZlY3Rvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvTWFwVmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5ZjhmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL01hcFZlY3Rvci5oCkBAIC0wLDAgKzEsMjM2IEBACisvLz09PS0gbGx2bS9BRFQvTWFwVmVjdG9yLmggLSBNYXAgdy8gZGV0ZXJtaW5pc3RpYyB2YWx1ZSBvcmRlciAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgbWFwIHRoYXQgcHJvdmlkZXMgaW5zZXJ0aW9uIG9yZGVyIGl0ZXJhdGlvbi4gVGhlCisvLyBpbnRlcmZhY2UgaXMgcHVycG9zZWZ1bGx5IG1pbmltYWwuIFRoZSBrZXkgaXMgYXNzdW1lZCB0byBiZSBjaGVhcCB0byBjb3B5CisvLyBhbmQgMiBjb3BpZXMgYXJlIGtlcHQsIG9uZSBmb3IgaW5kZXhpbmcgaW4gYSBEZW5zZU1hcCwgb25lIGZvciBpdGVyYXRpb24gaW4KKy8vIGEgc3RkOjp2ZWN0b3IuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9NQVBWRUNUT1JfSAorI2RlZmluZSBMTFZNX0FEVF9NQVBWRUNUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIG1hcCB0aGF0IGFsc28gcHJvdmlkZXMgYWNjZXNzIHRvIGFsbCBzdG9yZWQgdmFsdWVzCisvLy8gaW4gYSBkZXRlcm1pbmlzdGljIG9yZGVyLiBUaGUgdmFsdWVzIGFyZSBrZXB0IGluIGEgc3RkOjp2ZWN0b3IgYW5kIHRoZQorLy8vIG1hcHBpbmcgaXMgZG9uZSB3aXRoIERlbnNlTWFwIGZyb20gS2V5cyB0byBpbmRleGVzIGluIHRoYXQgdmVjdG9yLgordGVtcGxhdGU8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsdWVULAorICAgICAgICAgdHlwZW5hbWUgTWFwVHlwZSA9IERlbnNlTWFwPEtleVQsIHVuc2lnbmVkPiwKKyAgICAgICAgIHR5cGVuYW1lIFZlY3RvclR5cGUgPSBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPj4+CitjbGFzcyBNYXBWZWN0b3IgeworICBNYXBUeXBlIE1hcDsKKyAgVmVjdG9yVHlwZSBWZWN0b3I7CisKK3B1YmxpYzoKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIFZlY3RvclR5cGU6OnZhbHVlX3R5cGU7CisgIHVzaW5nIHNpemVfdHlwZSA9IHR5cGVuYW1lIFZlY3RvclR5cGU6OnNpemVfdHlwZTsKKworICB1c2luZyBpdGVyYXRvciA9IHR5cGVuYW1lIFZlY3RvclR5cGU6Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IHR5cGVuYW1lIFZlY3RvclR5cGU6OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyByZXZlcnNlX2l0ZXJhdG9yID0gdHlwZW5hbWUgVmVjdG9yVHlwZTo6cmV2ZXJzZV9pdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciA9IHR5cGVuYW1lIFZlY3RvclR5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgLy8vIENsZWFyIHRoZSBNYXBWZWN0b3IgYW5kIHJldHVybiB0aGUgdW5kZXJseWluZyB2ZWN0b3IuCisgIFZlY3RvclR5cGUgdGFrZVZlY3RvcigpIHsKKyAgICBNYXAuY2xlYXIoKTsKKyAgICByZXR1cm4gc3RkOjptb3ZlKFZlY3Rvcik7CisgIH0KKworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFZlY3Rvci5zaXplKCk7IH0KKworICAvLy8gR3JvdyB0aGUgTWFwVmVjdG9yIHNvIHRoYXQgaXQgY2FuIGNvbnRhaW4gYXQgbGVhc3QgXHAgTnVtRW50cmllcyBpdGVtcworICAvLy8gYmVmb3JlIHJlc2l6aW5nIGFnYWluLgorICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIE51bUVudHJpZXMpIHsKKyAgICBNYXAucmVzZXJ2ZShOdW1FbnRyaWVzKTsKKyAgICBWZWN0b3IucmVzZXJ2ZShOdW1FbnRyaWVzKTsKKyAgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gVmVjdG9yLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBWZWN0b3IuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBWZWN0b3IuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gVmVjdG9yLmVuZCgpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiBWZWN0b3IucmJlZ2luKCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiBWZWN0b3IucmJlZ2luKCk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gVmVjdG9yLnJlbmQoKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiBWZWN0b3IucmVuZCgpOyB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVjdG9yLmVtcHR5KCk7CisgIH0KKworICBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPiAgICAgICAmZnJvbnQoKSAgICAgICB7IHJldHVybiBWZWN0b3IuZnJvbnQoKTsgfQorICBjb25zdCBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPiAmZnJvbnQoKSBjb25zdCB7IHJldHVybiBWZWN0b3IuZnJvbnQoKTsgfQorICBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPiAgICAgICAmYmFjaygpICAgICAgICB7IHJldHVybiBWZWN0b3IuYmFjaygpOyB9CisgIGNvbnN0IHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+ICZiYWNrKCkgIGNvbnN0IHsgcmV0dXJuIFZlY3Rvci5iYWNrKCk7IH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIE1hcC5jbGVhcigpOworICAgIFZlY3Rvci5jbGVhcigpOworICB9CisKKyAgdm9pZCBzd2FwKE1hcFZlY3RvciAmUkhTKSB7CisgICAgc3RkOjpzd2FwKE1hcCwgUkhTLk1hcCk7CisgICAgc3RkOjpzd2FwKFZlY3RvciwgUkhTLlZlY3Rvcik7CisgIH0KKworICBWYWx1ZVQgJm9wZXJhdG9yW10oY29uc3QgS2V5VCAmS2V5KSB7CisgICAgc3RkOjpwYWlyPEtleVQsIHVuc2lnbmVkPiBQYWlyID0gc3RkOjptYWtlX3BhaXIoS2V5LCAwKTsKKyAgICBzdGQ6OnBhaXI8dHlwZW5hbWUgTWFwVHlwZTo6aXRlcmF0b3IsIGJvb2w+IFJlc3VsdCA9IE1hcC5pbnNlcnQoUGFpcik7CisgICAgdW5zaWduZWQgJkkgPSBSZXN1bHQuZmlyc3QtPnNlY29uZDsKKyAgICBpZiAoUmVzdWx0LnNlY29uZCkgeworICAgICAgVmVjdG9yLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihLZXksIFZhbHVlVCgpKSk7CisgICAgICBJID0gVmVjdG9yLnNpemUoKSAtIDE7CisgICAgfQorICAgIHJldHVybiBWZWN0b3JbSV0uc2Vjb25kOworICB9CisKKyAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIHZhbHVlLiAgT25seSBhbGxvd2VkIGlmIFZhbHVlVCBpcyBjb3B5YWJsZS4KKyAgVmFsdWVUIGxvb2t1cChjb25zdCBLZXlUICZLZXkpIGNvbnN0IHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfY29weV9jb25zdHJ1Y3RpYmxlPFZhbHVlVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjYWxsIGxvb2t1cCgpIGlmIFZhbHVlVCBpcyBub3QgY29weWFibGUuIik7CisgICAgdHlwZW5hbWUgTWFwVHlwZTo6Y29uc3RfaXRlcmF0b3IgUG9zID0gTWFwLmZpbmQoS2V5KTsKKyAgICByZXR1cm4gUG9zID09IE1hcC5lbmQoKT8gVmFsdWVUKCkgOiBWZWN0b3JbUG9zLT5zZWNvbmRdLnNlY29uZDsKKyAgfQorCisgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KGNvbnN0IHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+ICZLVikgeworICAgIHN0ZDo6cGFpcjxLZXlULCB1bnNpZ25lZD4gUGFpciA9IHN0ZDo6bWFrZV9wYWlyKEtWLmZpcnN0LCAwKTsKKyAgICBzdGQ6OnBhaXI8dHlwZW5hbWUgTWFwVHlwZTo6aXRlcmF0b3IsIGJvb2w+IFJlc3VsdCA9IE1hcC5pbnNlcnQoUGFpcik7CisgICAgdW5zaWduZWQgJkkgPSBSZXN1bHQuZmlyc3QtPnNlY29uZDsKKyAgICBpZiAoUmVzdWx0LnNlY29uZCkgeworICAgICAgVmVjdG9yLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihLVi5maXJzdCwgS1Yuc2Vjb25kKSk7CisgICAgICBJID0gVmVjdG9yLnNpemUoKSAtIDE7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoc3RkOjpwcmV2KGVuZCgpKSwgdHJ1ZSk7CisgICAgfQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihiZWdpbigpICsgSSwgZmFsc2UpOworICB9CisKKyAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnQoc3RkOjpwYWlyPEtleVQsIFZhbHVlVD4gJiZLVikgeworICAgIC8vIENvcHkgS1YuZmlyc3QgaW50byB0aGUgbWFwLCB0aGVuIG1vdmUgaXQgaW50byB0aGUgdmVjdG9yLgorICAgIHN0ZDo6cGFpcjxLZXlULCB1bnNpZ25lZD4gUGFpciA9IHN0ZDo6bWFrZV9wYWlyKEtWLmZpcnN0LCAwKTsKKyAgICBzdGQ6OnBhaXI8dHlwZW5hbWUgTWFwVHlwZTo6aXRlcmF0b3IsIGJvb2w+IFJlc3VsdCA9IE1hcC5pbnNlcnQoUGFpcik7CisgICAgdW5zaWduZWQgJkkgPSBSZXN1bHQuZmlyc3QtPnNlY29uZDsKKyAgICBpZiAoUmVzdWx0LnNlY29uZCkgeworICAgICAgVmVjdG9yLnB1c2hfYmFjayhzdGQ6Om1vdmUoS1YpKTsKKyAgICAgIEkgPSBWZWN0b3Iuc2l6ZSgpIC0gMTsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihzdGQ6OnByZXYoZW5kKCkpLCB0cnVlKTsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGJlZ2luKCkgKyBJLCBmYWxzZSk7CisgIH0KKworICBzaXplX3R5cGUgY291bnQoY29uc3QgS2V5VCAmS2V5KSBjb25zdCB7CisgICAgdHlwZW5hbWUgTWFwVHlwZTo6Y29uc3RfaXRlcmF0b3IgUG9zID0gTWFwLmZpbmQoS2V5KTsKKyAgICByZXR1cm4gUG9zID09IE1hcC5lbmQoKT8gMCA6IDE7CisgIH0KKworICBpdGVyYXRvciBmaW5kKGNvbnN0IEtleVQgJktleSkgeworICAgIHR5cGVuYW1lIE1hcFR5cGU6OmNvbnN0X2l0ZXJhdG9yIFBvcyA9IE1hcC5maW5kKEtleSk7CisgICAgcmV0dXJuIFBvcyA9PSBNYXAuZW5kKCk/IFZlY3Rvci5lbmQoKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZlY3Rvci5iZWdpbigpICsgUG9zLT5zZWNvbmQpOworICB9CisKKyAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBLZXlUICZLZXkpIGNvbnN0IHsKKyAgICB0eXBlbmFtZSBNYXBUeXBlOjpjb25zdF9pdGVyYXRvciBQb3MgPSBNYXAuZmluZChLZXkpOworICAgIHJldHVybiBQb3MgPT0gTWFwLmVuZCgpPyBWZWN0b3IuZW5kKCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWZWN0b3IuYmVnaW4oKSArIFBvcy0+c2Vjb25kKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVtb3ZlIHRoZSBsYXN0IGVsZW1lbnQgZnJvbSB0aGUgdmVjdG9yLgorICB2b2lkIHBvcF9iYWNrKCkgeworICAgIHR5cGVuYW1lIE1hcFR5cGU6Oml0ZXJhdG9yIFBvcyA9IE1hcC5maW5kKFZlY3Rvci5iYWNrKCkuZmlyc3QpOworICAgIE1hcC5lcmFzZShQb3MpOworICAgIFZlY3Rvci5wb3BfYmFjaygpOworICB9CisKKyAgLy8vIFxicmllZiBSZW1vdmUgdGhlIGVsZW1lbnQgZ2l2ZW4gYnkgSXRlcmF0b3IuCisgIC8vLworICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZWxlbWVudCBmb2xsb3dpbmcgdGhlIG9uZSB3aGljaCB3YXMgcmVtb3ZlZCwKKyAgLy8vIHdoaWNoIG1heSBiZSBlbmQoKS4KKyAgLy8vCisgIC8vLyBcbm90ZSBUaGlzIGlzIGEgZGVjZWl2aW5nbHkgZXhwZW5zaXZlIG9wZXJhdGlvbiAobGluZWFyIHRpbWUpLiAgSXQncworICAvLy8gdXN1YWxseSBiZXR0ZXIgdG8gdXNlIFxhIHJlbW92ZV9pZigpIGlmIHBvc3NpYmxlLgorICB0eXBlbmFtZSBWZWN0b3JUeXBlOjppdGVyYXRvciBlcmFzZSh0eXBlbmFtZSBWZWN0b3JUeXBlOjppdGVyYXRvciBJdGVyYXRvcikgeworICAgIE1hcC5lcmFzZShJdGVyYXRvci0+Zmlyc3QpOworICAgIGF1dG8gTmV4dCA9IFZlY3Rvci5lcmFzZShJdGVyYXRvcik7CisgICAgaWYgKE5leHQgPT0gVmVjdG9yLmVuZCgpKQorICAgICAgcmV0dXJuIE5leHQ7CisKKyAgICAvLyBVcGRhdGUgaW5kaWNlcyBpbiB0aGUgbWFwLgorICAgIHNpemVfdCBJbmRleCA9IE5leHQgLSBWZWN0b3IuYmVnaW4oKTsKKyAgICBmb3IgKGF1dG8gJkkgOiBNYXApIHsKKyAgICAgIGFzc2VydChJLnNlY29uZCAhPSBJbmRleCAmJiAiSW5kZXggd2FzIGFscmVhZHkgZXJhc2VkISIpOworICAgICAgaWYgKEkuc2Vjb25kID4gSW5kZXgpCisgICAgICAgIC0tSS5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBOZXh0OworICB9CisKKyAgLy8vIFxicmllZiBSZW1vdmUgYWxsIGVsZW1lbnRzIHdpdGggdGhlIGtleSB2YWx1ZSBLZXkuCisgIC8vLworICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJlbW92ZWQuCisgIHNpemVfdHlwZSBlcmFzZShjb25zdCBLZXlUICZLZXkpIHsKKyAgICBhdXRvIEl0ZXJhdG9yID0gZmluZChLZXkpOworICAgIGlmIChJdGVyYXRvciA9PSBlbmQoKSkKKyAgICAgIHJldHVybiAwOworICAgIGVyYXNlKEl0ZXJhdG9yKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVtb3ZlIHRoZSBlbGVtZW50cyB0aGF0IG1hdGNoIHRoZSBwcmVkaWNhdGUuCisgIC8vLworICAvLy8gRXJhc2UgYWxsIGVsZW1lbnRzIHRoYXQgbWF0Y2ggXGMgUHJlZCBpbiBhIHNpbmdsZSBwYXNzLiAgVGFrZXMgbGluZWFyCisgIC8vLyB0aW1lLgorICB0ZW1wbGF0ZSA8Y2xhc3MgUHJlZGljYXRlPiB2b2lkIHJlbW92ZV9pZihQcmVkaWNhdGUgUHJlZCk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsdWVULCB0eXBlbmFtZSBNYXBUeXBlLCB0eXBlbmFtZSBWZWN0b3JUeXBlPgordGVtcGxhdGUgPGNsYXNzIEZ1bmN0aW9uPgordm9pZCBNYXBWZWN0b3I8S2V5VCwgVmFsdWVULCBNYXBUeXBlLCBWZWN0b3JUeXBlPjo6cmVtb3ZlX2lmKEZ1bmN0aW9uIFByZWQpIHsKKyAgYXV0byBPID0gVmVjdG9yLmJlZ2luKCk7CisgIGZvciAoYXV0byBJID0gTywgRSA9IFZlY3Rvci5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoUHJlZCgqSSkpIHsKKyAgICAgIC8vIEVyYXNlIGZyb20gdGhlIG1hcC4KKyAgICAgIE1hcC5lcmFzZShJLT5maXJzdCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAoSSAhPSBPKSB7CisgICAgICAvLyBNb3ZlIHRoZSB2YWx1ZSBhbmQgdXBkYXRlIHRoZSBpbmRleCBpbiB0aGUgbWFwLgorICAgICAgKk8gPSBzdGQ6Om1vdmUoKkkpOworICAgICAgTWFwW08tPmZpcnN0XSA9IE8gLSBWZWN0b3IuYmVnaW4oKTsKKyAgICB9CisgICAgKytPOworICB9CisgIC8vIEVyYXNlIHRyYWlsaW5nIGVudHJpZXMgaW4gdGhlIHZlY3Rvci4KKyAgVmVjdG9yLmVyYXNlKE8sIFZlY3Rvci5lbmQoKSk7Cit9CisKKy8vLyBcYnJpZWYgQSBNYXBWZWN0b3IgdGhhdCBwZXJmb3JtcyBubyBhbGxvY2F0aW9ucyBpZiBzbWFsbGVyIHRoYW4gYSBjZXJ0YWluCisvLy8gc2l6ZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQsIHVuc2lnbmVkIE4+CitzdHJ1Y3QgU21hbGxNYXBWZWN0b3IKKyAgICA6IE1hcFZlY3RvcjxLZXlULCBWYWx1ZVQsIFNtYWxsRGVuc2VNYXA8S2V5VCwgdW5zaWduZWQsIE4+LAorICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+LCBOPj4geworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX01BUFZFQ1RPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Ob25lLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Ob25lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhOTljNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL05vbmUuaApAQCAtMCwwICsxLDI3IEBACisvLz09PS0tIE5vbmUuaCAtIFNpbXBsZSBudWxsIHZhbHVlIGZvciBpbXBsaWNpdCBjb25zdHJ1Y3Rpb24gLS0tLS0tKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgcHJvdmlkZXMgTm9uZSwgYW4gZW51bWVyYXRvciBmb3IgdXNlIGluIGltcGxpY2l0IGNvbnN0cnVjdG9ycworLy8gIG9mIHZhcmlvdXMgKHVzdWFsbHkgdGVtcGxhdGVkKSB0eXBlcyB0byBtYWtlIHN1Y2ggY29uc3RydWN0aW9uIG1vcmUKKy8vICB0ZXJzZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX05PTkVfSAorI2RlZmluZSBMTFZNX0FEVF9OT05FX0gKKworbmFtZXNwYWNlIGxsdm0geworLy8vIFxicmllZiBBIHNpbXBsZSBudWxsIG9iamVjdCB0byBhbGxvdyBpbXBsaWNpdCBjb25zdHJ1Y3Rpb24gb2YgT3B0aW9uYWw8VD4KKy8vLyBhbmQgc2ltaWxhciB0eXBlcyB3aXRob3V0IGhhdmluZyB0byBzcGVsbCBvdXQgdGhlIHNwZWNpYWxpemF0aW9uJ3MgbmFtZS4KKy8vIChjb25zdGFudCB2YWx1ZSAxIGluIGFuIGF0dGVtcHQgdG8gd29ya2Fyb3VuZCBNU1ZDIGJ1aWxkIGlzc3VlLi4uICkKK2VudW0gY2xhc3MgTm9uZVR5cGUgeyBOb25lID0gMSB9OworY29uc3QgTm9uZVR5cGUgTm9uZSA9IE5vbmVUeXBlOjpOb25lOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL09wdGlvbmFsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9PcHRpb25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1M2U1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9PcHRpb25hbC5oCkBAIC0wLDAgKzEsMzQ2IEBACisvLz09PS0gT3B0aW9uYWwuaCAtIFNpbXBsZSB2YXJpYW50IGZvciBwYXNzaW5nIG9wdGlvbmFsIHZhbHVlcyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgcHJvdmlkZXMgT3B0aW9uYWwsIGEgdGVtcGxhdGUgY2xhc3MgbW9kZWxlZCBpbiB0aGUgc3Bpcml0IG9mCisvLyAgT0NhbWwncyAnb3B0JyB2YXJpYW50LiAgVGhlIGlkZWEgaXMgdG8gc3Ryb25nbHkgdHlwZSB3aGV0aGVyIG9yIG5vdAorLy8gIGEgdmFsdWUgY2FuIGJlIG9wdGlvbmFsLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfT1BUSU9OQUxfSAorI2RlZmluZSBMTFZNX0FEVF9PUFRJT05BTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsaWduT2YuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2Ugb3B0aW9uYWxfZGV0YWlsIHsKKy8vLyBTdG9yYWdlIGZvciBhbnkgdHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIElzUG9kTGlrZT4gc3RydWN0IE9wdGlvbmFsU3RvcmFnZSB7CisgIEFsaWduZWRDaGFyQXJyYXlVbmlvbjxUPiBzdG9yYWdlOworICBib29sIGhhc1ZhbCA9IGZhbHNlOworCisgIE9wdGlvbmFsU3RvcmFnZSgpID0gZGVmYXVsdDsKKworICBPcHRpb25hbFN0b3JhZ2UoY29uc3QgVCAmeSkgOiBoYXNWYWwodHJ1ZSkgeyBuZXcgKHN0b3JhZ2UuYnVmZmVyKSBUKHkpOyB9CisgIE9wdGlvbmFsU3RvcmFnZShjb25zdCBPcHRpb25hbFN0b3JhZ2UgJk8pIDogaGFzVmFsKE8uaGFzVmFsKSB7CisgICAgaWYgKGhhc1ZhbCkKKyAgICAgIG5ldyAoc3RvcmFnZS5idWZmZXIpIFQoKk8uZ2V0UG9pbnRlcigpKTsKKyAgfQorICBPcHRpb25hbFN0b3JhZ2UoVCAmJnkpIDogaGFzVmFsKHRydWUpIHsKKyAgICBuZXcgKHN0b3JhZ2UuYnVmZmVyKSBUKHN0ZDo6Zm9yd2FyZDxUPih5KSk7CisgIH0KKyAgT3B0aW9uYWxTdG9yYWdlKE9wdGlvbmFsU3RvcmFnZSAmJk8pIDogaGFzVmFsKE8uaGFzVmFsKSB7CisgICAgaWYgKE8uaGFzVmFsKSB7CisgICAgICBuZXcgKHN0b3JhZ2UuYnVmZmVyKSBUKHN0ZDo6bW92ZSgqTy5nZXRQb2ludGVyKCkpKTsKKyAgICB9CisgIH0KKworICBPcHRpb25hbFN0b3JhZ2UgJm9wZXJhdG9yPShUICYmeSkgeworICAgIGlmIChoYXNWYWwpCisgICAgICAqZ2V0UG9pbnRlcigpID0gc3RkOjptb3ZlKHkpOworICAgIGVsc2UgeworICAgICAgbmV3IChzdG9yYWdlLmJ1ZmZlcikgVChzdGQ6Om1vdmUoeSkpOworICAgICAgaGFzVmFsID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIE9wdGlvbmFsU3RvcmFnZSAmb3BlcmF0b3I9KE9wdGlvbmFsU3RvcmFnZSAmJk8pIHsKKyAgICBpZiAoIU8uaGFzVmFsKQorICAgICAgcmVzZXQoKTsKKyAgICBlbHNlIHsKKyAgICAgICp0aGlzID0gc3RkOjptb3ZlKCpPLmdldFBvaW50ZXIoKSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEZJWE1FOiB0aGVzZSBhc3NpZ25tZW50cyAoJiB0aGUgZXF1aXZhbGVudCBjb25zdCBUJi9jb25zdCBPcHRpb25hbCYgY3RvcnMpCisgIC8vIGNvdWxkIGJlIG1hZGUgbW9yZSBlZmZpY2llbnQgYnkgcGFzc2luZyBieSB2YWx1ZSwgcG9zc2libHkgdW5pZnlpbmcgdGhlbQorICAvLyB3aXRoIHRoZSBydmFsdWUgdmVyc2lvbnMgYWJvdmUgLSBidXQgdGhpcyBjb3VsZCBwbGFjZSBhIGRpZmZlcmVudCBzZXQgb2YKKyAgLy8gcmVxdWlyZW1lbnRzIChub3RhYmx5OiB0aGUgZXhpc3RlbmNlIG9mIGEgZGVmYXVsdCBjdG9yKSB3aGVuIGltcGxlbWVudGVkCisgIC8vIGluIHRoYXQgd2F5LiBDYXJlZnVsIFNGSU5BRSB0byBhdm9pZCBzdWNoIHBpdGZhbGxzIHdvdWxkIGJlIHJlcXVpcmVkLgorICBPcHRpb25hbFN0b3JhZ2UgJm9wZXJhdG9yPShjb25zdCBUICZ5KSB7CisgICAgaWYgKGhhc1ZhbCkKKyAgICAgICpnZXRQb2ludGVyKCkgPSB5OworICAgIGVsc2UgeworICAgICAgbmV3IChzdG9yYWdlLmJ1ZmZlcikgVCh5KTsKKyAgICAgIGhhc1ZhbCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorICBPcHRpb25hbFN0b3JhZ2UgJm9wZXJhdG9yPShjb25zdCBPcHRpb25hbFN0b3JhZ2UgJk8pIHsKKyAgICBpZiAoIU8uaGFzVmFsKQorICAgICAgcmVzZXQoKTsKKyAgICBlbHNlCisgICAgICAqdGhpcyA9ICpPLmdldFBvaW50ZXIoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB+T3B0aW9uYWxTdG9yYWdlKCkgeyByZXNldCgpOyB9CisKKyAgdm9pZCByZXNldCgpIHsKKyAgICBpZiAoaGFzVmFsKSB7CisgICAgICAoKmdldFBvaW50ZXIoKSkuflQoKTsKKyAgICAgIGhhc1ZhbCA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIFQgKmdldFBvaW50ZXIoKSB7CisgICAgYXNzZXJ0KGhhc1ZhbCk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCAqPihzdG9yYWdlLmJ1ZmZlcik7CisgIH0KKyAgY29uc3QgVCAqZ2V0UG9pbnRlcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaGFzVmFsKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUICo+KHN0b3JhZ2UuYnVmZmVyKTsKKyAgfQorfTsKKworI2lmICFkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykgLy8gR0NDIHVwIHRvIEdDQzcgbWlzY29tcGlsZXMgdGhpcy4KKy8vLyBTdG9yYWdlIGZvciB0cml2aWFsbHkgY29weWFibGUgdHlwZXMgb25seS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgT3B0aW9uYWxTdG9yYWdlPFQsIHRydWU+IHsKKyAgQWxpZ25lZENoYXJBcnJheVVuaW9uPFQ+IHN0b3JhZ2U7CisgIGJvb2wgaGFzVmFsID0gZmFsc2U7CisKKyAgT3B0aW9uYWxTdG9yYWdlKCkgPSBkZWZhdWx0OworCisgIE9wdGlvbmFsU3RvcmFnZShjb25zdCBUICZ5KSA6IGhhc1ZhbCh0cnVlKSB7IG5ldyAoc3RvcmFnZS5idWZmZXIpIFQoeSk7IH0KKyAgT3B0aW9uYWxTdG9yYWdlICZvcGVyYXRvcj0oY29uc3QgVCAmeSkgeworICAgICpyZWludGVycHJldF9jYXN0PFQgKj4oc3RvcmFnZS5idWZmZXIpID0geTsKKyAgICBoYXNWYWwgPSB0cnVlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZvaWQgcmVzZXQoKSB7IGhhc1ZhbCA9IGZhbHNlOyB9Cit9OworI2VuZGlmCit9IC8vIG5hbWVzcGFjZSBvcHRpb25hbF9kZXRhaWwKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIE9wdGlvbmFsIHsKKyAgb3B0aW9uYWxfZGV0YWlsOjpPcHRpb25hbFN0b3JhZ2U8VCwgaXNQb2RMaWtlPFQ+Ojp2YWx1ZT4gU3RvcmFnZTsKKworcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0gVDsKKworICBjb25zdGV4cHIgT3B0aW9uYWwoKSB7fQorICBjb25zdGV4cHIgT3B0aW9uYWwoTm9uZVR5cGUpIHt9CisKKyAgT3B0aW9uYWwoY29uc3QgVCAmeSkgOiBTdG9yYWdlKHkpIHt9CisgIE9wdGlvbmFsKGNvbnN0IE9wdGlvbmFsICZPKSA9IGRlZmF1bHQ7CisKKyAgT3B0aW9uYWwoVCAmJnkpIDogU3RvcmFnZShzdGQ6OmZvcndhcmQ8VD4oeSkpIHt9CisgIE9wdGlvbmFsKE9wdGlvbmFsICYmTykgPSBkZWZhdWx0OworCisgIE9wdGlvbmFsICZvcGVyYXRvcj0oVCAmJnkpIHsKKyAgICBTdG9yYWdlID0gc3RkOjptb3ZlKHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBPcHRpb25hbCAmb3BlcmF0b3I9KE9wdGlvbmFsICYmTykgPSBkZWZhdWx0OworCisgIC8vLyBDcmVhdGUgYSBuZXcgb2JqZWN0IGJ5IGNvbnN0cnVjdGluZyBpdCBpbiBwbGFjZSB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdUeXBlcz4gdm9pZCBlbXBsYWNlKEFyZ1R5cGVzICYmLi4uIEFyZ3MpIHsKKyAgICByZXNldCgpOworICAgIFN0b3JhZ2UuaGFzVmFsID0gdHJ1ZTsKKyAgICBuZXcgKGdldFBvaW50ZXIoKSkgVChzdGQ6OmZvcndhcmQ8QXJnVHlwZXM+KEFyZ3MpLi4uKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgT3B0aW9uYWwgY3JlYXRlKGNvbnN0IFQgKnkpIHsKKyAgICByZXR1cm4geSA/IE9wdGlvbmFsKCp5KSA6IE9wdGlvbmFsKCk7CisgIH0KKworICBPcHRpb25hbCAmb3BlcmF0b3I9KGNvbnN0IFQgJnkpIHsKKyAgICBTdG9yYWdlID0geTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgT3B0aW9uYWwgJm9wZXJhdG9yPShjb25zdCBPcHRpb25hbCAmTykgPSBkZWZhdWx0OworCisgIHZvaWQgcmVzZXQoKSB7IFN0b3JhZ2UucmVzZXQoKTsgfQorCisgIGNvbnN0IFQgKmdldFBvaW50ZXIoKSBjb25zdCB7CisgICAgYXNzZXJ0KFN0b3JhZ2UuaGFzVmFsKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUICo+KFN0b3JhZ2Uuc3RvcmFnZS5idWZmZXIpOworICB9CisgIFQgKmdldFBvaW50ZXIoKSB7CisgICAgYXNzZXJ0KFN0b3JhZ2UuaGFzVmFsKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUICo+KFN0b3JhZ2Uuc3RvcmFnZS5idWZmZXIpOworICB9CisgIGNvbnN0IFQgJmdldFZhbHVlKCkgY29uc3QgTExWTV9MVkFMVUVfRlVOQ1RJT04geyByZXR1cm4gKmdldFBvaW50ZXIoKTsgfQorICBUICZnZXRWYWx1ZSgpIExMVk1fTFZBTFVFX0ZVTkNUSU9OIHsgcmV0dXJuICpnZXRQb2ludGVyKCk7IH0KKworICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gU3RvcmFnZS5oYXNWYWw7IH0KKyAgYm9vbCBoYXNWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFN0b3JhZ2UuaGFzVmFsOyB9CisgIGNvbnN0IFQgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBnZXRQb2ludGVyKCk7IH0KKyAgVCAqb3BlcmF0b3ItPigpIHsgcmV0dXJuIGdldFBvaW50ZXIoKTsgfQorICBjb25zdCBUICZvcGVyYXRvciooKSBjb25zdCBMTFZNX0xWQUxVRV9GVU5DVElPTiB7IHJldHVybiAqZ2V0UG9pbnRlcigpOyB9CisgIFQgJm9wZXJhdG9yKigpIExMVk1fTFZBTFVFX0ZVTkNUSU9OIHsgcmV0dXJuICpnZXRQb2ludGVyKCk7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgY29uc3RleHByIFQgZ2V0VmFsdWVPcihVICYmdmFsdWUpIGNvbnN0IExMVk1fTFZBTFVFX0ZVTkNUSU9OIHsKKyAgICByZXR1cm4gaGFzVmFsdWUoKSA/IGdldFZhbHVlKCkgOiBzdGQ6OmZvcndhcmQ8VT4odmFsdWUpOworICB9CisKKyNpZiBMTFZNX0hBU19SVkFMVUVfUkVGRVJFTkNFX1RISVMKKyAgVCAmJmdldFZhbHVlKCkgJiYgeyByZXR1cm4gc3RkOjptb3ZlKCpnZXRQb2ludGVyKCkpOyB9CisgIFQgJiZvcGVyYXRvciooKSAmJiB7IHJldHVybiBzdGQ6Om1vdmUoKmdldFBvaW50ZXIoKSk7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgVCBnZXRWYWx1ZU9yKFUgJiZ2YWx1ZSkgJiYgeworICAgIHJldHVybiBoYXNWYWx1ZSgpID8gc3RkOjptb3ZlKGdldFZhbHVlKCkpIDogc3RkOjpmb3J3YXJkPFU+KHZhbHVlKTsKKyAgfQorI2VuZGlmCit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlzUG9kTGlrZTxPcHRpb25hbDxUPj4geworICAvLyBBbiBPcHRpb25hbDxUPiBpcyBwb2QtbGlrZSBpZiBUIGlzLgorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGlzUG9kTGlrZTxUPjo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBPcHRpb25hbDxUPiAmWCwgY29uc3QgT3B0aW9uYWw8VT4gJlkpIHsKKyAgaWYgKFggJiYgWSkKKyAgICByZXR1cm4gKlggPT0gKlk7CisgIHJldHVybiBYLmhhc1ZhbHVlKCkgPT0gWS5oYXNWYWx1ZSgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBPcHRpb25hbDxUPiAmWCwgY29uc3QgT3B0aW9uYWw8VT4gJlkpIHsKKyAgcmV0dXJuICEoWCA9PSBZKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Citib29sIG9wZXJhdG9yPChjb25zdCBPcHRpb25hbDxUPiAmWCwgY29uc3QgT3B0aW9uYWw8VT4gJlkpIHsKKyAgaWYgKFggJiYgWSkKKyAgICByZXR1cm4gKlggPCAqWTsKKyAgcmV0dXJuIFguaGFzVmFsdWUoKSA8IFkuaGFzVmFsdWUoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Citib29sIG9wZXJhdG9yPD0oY29uc3QgT3B0aW9uYWw8VD4gJlgsIGNvbnN0IE9wdGlvbmFsPFU+ICZZKSB7CisgIHJldHVybiAhKFkgPCBYKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Citib29sIG9wZXJhdG9yPihjb25zdCBPcHRpb25hbDxUPiAmWCwgY29uc3QgT3B0aW9uYWw8VT4gJlkpIHsKKyAgcmV0dXJuIFkgPCBYOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2Jvb2wgb3BlcmF0b3I+PShjb25zdCBPcHRpb25hbDxUPiAmWCwgY29uc3QgT3B0aW9uYWw8VT4gJlkpIHsKKyAgcmV0dXJuICEoWCA8IFkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBvcGVyYXRvcj09KGNvbnN0IE9wdGlvbmFsPFQ+ICZYLCBOb25lVHlwZSkgeworICByZXR1cm4gIVg7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIG9wZXJhdG9yPT0oTm9uZVR5cGUsIGNvbnN0IE9wdGlvbmFsPFQ+ICZYKSB7CisgIHJldHVybiBYID09IE5vbmU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIG9wZXJhdG9yIT0oY29uc3QgT3B0aW9uYWw8VD4gJlgsIE5vbmVUeXBlKSB7CisgIHJldHVybiAhKFggPT0gTm9uZSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIG9wZXJhdG9yIT0oTm9uZVR5cGUsIGNvbnN0IE9wdGlvbmFsPFQ+ICZYKSB7CisgIHJldHVybiBYICE9IE5vbmU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBib29sIG9wZXJhdG9yPChjb25zdCBPcHRpb25hbDxUPiAmWCwgTm9uZVR5cGUpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYm9vbCBvcGVyYXRvcjwoTm9uZVR5cGUsIGNvbnN0IE9wdGlvbmFsPFQ+ICZYKSB7CisgIHJldHVybiBYLmhhc1ZhbHVlKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBib29sIG9wZXJhdG9yPD0oY29uc3QgT3B0aW9uYWw8VD4gJlgsIE5vbmVUeXBlKSB7CisgIHJldHVybiAhKE5vbmUgPCBYKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3I8PShOb25lVHlwZSwgY29uc3QgT3B0aW9uYWw8VD4gJlgpIHsKKyAgcmV0dXJuICEoWCA8IE5vbmUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYm9vbCBvcGVyYXRvcj4oY29uc3QgT3B0aW9uYWw8VD4gJlgsIE5vbmVUeXBlKSB7CisgIHJldHVybiBOb25lIDwgWDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3I+KE5vbmVUeXBlLCBjb25zdCBPcHRpb25hbDxUPiAmWCkgeworICByZXR1cm4gWCA8IE5vbmU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBib29sIG9wZXJhdG9yPj0oY29uc3QgT3B0aW9uYWw8VD4gJlgsIE5vbmVUeXBlKSB7CisgIHJldHVybiBOb25lIDw9IFg7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBib29sIG9wZXJhdG9yPj0oTm9uZVR5cGUsIGNvbnN0IE9wdGlvbmFsPFQ+ICZYKSB7CisgIHJldHVybiBYIDw9IE5vbmU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBib29sIG9wZXJhdG9yPT0oY29uc3QgT3B0aW9uYWw8VD4gJlgsIGNvbnN0IFQgJlkpIHsKKyAgcmV0dXJuIFggJiYgKlggPT0gWTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3I9PShjb25zdCBUICZYLCBjb25zdCBPcHRpb25hbDxUPiAmWSkgeworICByZXR1cm4gWSAmJiBYID09ICpZOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYm9vbCBvcGVyYXRvciE9KGNvbnN0IE9wdGlvbmFsPFQ+ICZYLCBjb25zdCBUICZZKSB7CisgIHJldHVybiAhKFggPT0gWSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBib29sIG9wZXJhdG9yIT0oY29uc3QgVCAmWCwgY29uc3QgT3B0aW9uYWw8VD4gJlkpIHsKKyAgcmV0dXJuICEoWCA9PSBZKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3I8KGNvbnN0IE9wdGlvbmFsPFQ+ICZYLCBjb25zdCBUICZZKSB7CisgIHJldHVybiAhWCB8fCAqWCA8IFk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBib29sIG9wZXJhdG9yPChjb25zdCBUICZYLCBjb25zdCBPcHRpb25hbDxUPiAmWSkgeworICByZXR1cm4gWSAmJiBYIDwgKlk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBib29sIG9wZXJhdG9yPD0oY29uc3QgT3B0aW9uYWw8VD4gJlgsIGNvbnN0IFQgJlkpIHsKKyAgcmV0dXJuICEoWSA8IFgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFQgJlgsIGNvbnN0IE9wdGlvbmFsPFQ+ICZZKSB7CisgIHJldHVybiAhKFkgPCBYKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3I+KGNvbnN0IE9wdGlvbmFsPFQ+ICZYLCBjb25zdCBUICZZKSB7CisgIHJldHVybiBZIDwgWDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3I+KGNvbnN0IFQgJlgsIGNvbnN0IE9wdGlvbmFsPFQ+ICZZKSB7CisgIHJldHVybiBZIDwgWDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3I+PShjb25zdCBPcHRpb25hbDxUPiAmWCwgY29uc3QgVCAmWSkgeworICByZXR1cm4gIShYIDwgWSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBib29sIG9wZXJhdG9yPj0oY29uc3QgVCAmWCwgY29uc3QgT3B0aW9uYWw8VD4gJlkpIHsKKyAgcmV0dXJuICEoWCA8IFkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfT1BUSU9OQUxfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUGFja2VkVmVjdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9QYWNrZWRWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWFkYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUGFja2VkVmVjdG9yLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8vPT09LSBsbHZtL0FEVC9QYWNrZWRWZWN0b3IuaCAtIFBhY2tlZCB2YWx1ZXMgdmVjdG9yIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFBhY2tlZFZlY3RvciBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1BBQ0tFRFZFQ1RPUl9ICisjZGVmaW5lIExMVk1fQURUX1BBQ0tFRFZFQ1RPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdW5zaWduZWQgQml0TnVtLCB0eXBlbmFtZSBCaXRWZWN0b3JUeSwgYm9vbCBpc1NpZ25lZD4KK2NsYXNzIFBhY2tlZFZlY3RvckJhc2U7CisKKy8vIFRoaXMgd29uJ3QgYmUgbmVjZXNzYXJ5IGlmIHdlIGNhbiBzcGVjaWFsaXplIG1lbWJlcnMgd2l0aG91dCBzcGVjaWFsaXppbmcKKy8vIHRoZSBwYXJlbnQgdGVtcGxhdGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdW5zaWduZWQgQml0TnVtLCB0eXBlbmFtZSBCaXRWZWN0b3JUeT4KK2NsYXNzIFBhY2tlZFZlY3RvckJhc2U8VCwgQml0TnVtLCBCaXRWZWN0b3JUeSwgZmFsc2U+IHsKK3Byb3RlY3RlZDoKKyAgc3RhdGljIFQgZ2V0VmFsdWUoY29uc3QgQml0VmVjdG9yVHkgJkJpdHMsIHVuc2lnbmVkIElkeCkgeworICAgIFQgdmFsID0gVCgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gQml0TnVtOyArK2kpCisgICAgICB2YWwgPSBUKHZhbCB8ICgoQml0c1soSWR4IDw8IChCaXROdW0tMSkpICsgaV0gPyAxVUwgOiAwVUwpIDw8IGkpKTsKKyAgICByZXR1cm4gdmFsOworICB9CisKKyAgc3RhdGljIHZvaWQgc2V0VmFsdWUoQml0VmVjdG9yVHkgJkJpdHMsIHVuc2lnbmVkIElkeCwgVCB2YWwpIHsKKyAgICBhc3NlcnQoKHZhbCA+PiBCaXROdW0pID09IDAgJiYgInZhbHVlIGlzIHRvbyBiaWciKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IEJpdE51bTsgKytpKQorICAgICAgQml0c1soSWR4IDw8IChCaXROdW0tMSkpICsgaV0gPSB2YWwgJiAoVCgxKSA8PCBpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHVuc2lnbmVkIEJpdE51bSwgdHlwZW5hbWUgQml0VmVjdG9yVHk+CitjbGFzcyBQYWNrZWRWZWN0b3JCYXNlPFQsIEJpdE51bSwgQml0VmVjdG9yVHksIHRydWU+IHsKK3Byb3RlY3RlZDoKKyAgc3RhdGljIFQgZ2V0VmFsdWUoY29uc3QgQml0VmVjdG9yVHkgJkJpdHMsIHVuc2lnbmVkIElkeCkgeworICAgIFQgdmFsID0gVCgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gQml0TnVtLTE7ICsraSkKKyAgICAgIHZhbCA9IFQodmFsIHwgKChCaXRzWyhJZHggPDwgKEJpdE51bS0xKSkgKyBpXSA/IDFVTCA6IDBVTCkgPDwgaSkpOworICAgIGlmIChCaXRzWyhJZHggPDwgKEJpdE51bS0xKSkgKyBCaXROdW0tMV0pCisgICAgICB2YWwgPSB+dmFsOworICAgIHJldHVybiB2YWw7CisgIH0KKworICBzdGF0aWMgdm9pZCBzZXRWYWx1ZShCaXRWZWN0b3JUeSAmQml0cywgdW5zaWduZWQgSWR4LCBUIHZhbCkgeworICAgIGlmICh2YWwgPCAwKSB7CisgICAgICB2YWwgPSB+dmFsOworICAgICAgQml0cy5zZXQoKElkeCA8PCAoQml0TnVtLTEpKSArIEJpdE51bS0xKTsKKyAgICB9CisgICAgYXNzZXJ0KCh2YWwgPj4gKEJpdE51bS0xKSkgPT0gMCAmJiAidmFsdWUgaXMgdG9vIGJpZyIpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gQml0TnVtLTE7ICsraSkKKyAgICAgIEJpdHNbKElkeCA8PCAoQml0TnVtLTEpKSArIGldID0gdmFsICYgKFQoMSkgPDwgaSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgU3RvcmUgYSB2ZWN0b3Igb2YgdmFsdWVzIHVzaW5nIGEgc3BlY2lmaWMgbnVtYmVyIG9mIGJpdHMgZm9yIGVhY2gKKy8vLyB2YWx1ZS4gQm90aCBzaWduZWQgYW5kIHVuc2lnbmVkIHR5cGVzIGNhbiBiZSB1c2VkLCBlLmcKKy8vLyBAY29kZQorLy8vICAgUGFja2VkVmVjdG9yPHNpZ25lZCwgMj4gdmVjOworLy8vIEBlbmRjb2RlCisvLy8gd2lsbCBjcmVhdGUgYSB2ZWN0b3IgYWNjZXB0aW5nIHZhbHVlcyAtMiwgLTEsIDAsIDEuIEFueSBvdGhlciB2YWx1ZSB3aWxsIGhpdAorLy8vIGFuIGFzc2VydGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB1bnNpZ25lZCBCaXROdW0sIHR5cGVuYW1lIEJpdFZlY3RvclR5ID0gQml0VmVjdG9yPgorY2xhc3MgUGFja2VkVmVjdG9yIDogcHVibGljIFBhY2tlZFZlY3RvckJhc2U8VCwgQml0TnVtLCBCaXRWZWN0b3JUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkPiB7CisgIEJpdFZlY3RvclR5IEJpdHM7CisgIHVzaW5nIGJhc2UgPSBQYWNrZWRWZWN0b3JCYXNlPFQsIEJpdE51bSwgQml0VmVjdG9yVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZD47CisKK3B1YmxpYzoKKyAgY2xhc3MgcmVmZXJlbmNlIHsKKyAgICBQYWNrZWRWZWN0b3IgJlZlYzsKKyAgICBjb25zdCB1bnNpZ25lZCBJZHg7CisKKyAgcHVibGljOgorICAgIHJlZmVyZW5jZSgpID0gZGVsZXRlOworICAgIHJlZmVyZW5jZShQYWNrZWRWZWN0b3IgJnZlYywgdW5zaWduZWQgaWR4KSA6IFZlYyh2ZWMpLCBJZHgoaWR4KSB7fQorCisgICAgcmVmZXJlbmNlICZvcGVyYXRvcj0oVCB2YWwpIHsKKyAgICAgIFZlYy5zZXRWYWx1ZShWZWMuQml0cywgSWR4LCB2YWwpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIFQoKSBjb25zdCB7CisgICAgICByZXR1cm4gVmVjLmdldFZhbHVlKFZlYy5CaXRzLCBJZHgpOworICAgIH0KKyAgfTsKKworICBQYWNrZWRWZWN0b3IoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFBhY2tlZFZlY3Rvcih1bnNpZ25lZCBzaXplKSA6IEJpdHMoc2l6ZSA8PCAoQml0TnVtLTEpKSB7fQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBCaXRzLmVtcHR5KCk7IH0KKworICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gQml0cy5zaXplKCkgPj4gKEJpdE51bSAtIDEpOyB9CisKKyAgdm9pZCBjbGVhcigpIHsgQml0cy5jbGVhcigpOyB9CisKKyAgdm9pZCByZXNpemUodW5zaWduZWQgTikgeyBCaXRzLnJlc2l6ZShOIDw8IChCaXROdW0gLSAxKSk7IH0KKworICB2b2lkIHJlc2VydmUodW5zaWduZWQgTikgeyBCaXRzLnJlc2VydmUoTiA8PCAoQml0TnVtLTEpKTsgfQorCisgIFBhY2tlZFZlY3RvciAmcmVzZXQoKSB7CisgICAgQml0cy5yZXNldCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZvaWQgcHVzaF9iYWNrKFQgdmFsKSB7CisgICAgcmVzaXplKHNpemUoKSsxKTsKKyAgICAoKnRoaXMpW3NpemUoKS0xXSA9IHZhbDsKKyAgfQorCisgIHJlZmVyZW5jZSBvcGVyYXRvcltdKHVuc2lnbmVkIElkeCkgeworICAgIHJldHVybiByZWZlcmVuY2UoKnRoaXMsIElkeCk7CisgIH0KKworICBUIG9wZXJhdG9yW10odW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIGJhc2U6OmdldFZhbHVlKEJpdHMsIElkeCk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgUGFja2VkVmVjdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQml0cyA9PSBSSFMuQml0czsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBQYWNrZWRWZWN0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiBCaXRzICE9IFJIUy5CaXRzOworICB9CisKKyAgUGFja2VkVmVjdG9yICZvcGVyYXRvcnw9KGNvbnN0IFBhY2tlZFZlY3RvciAmUkhTKSB7CisgICAgQml0cyB8PSBSSFMuQml0czsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KK307CisKKy8vIExlYXZlIEJpdE51bT0wIHVuZGVmaW5lZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBQYWNrZWRWZWN0b3I8VCwgMD47CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9QQUNLRURWRUNUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUG9pbnRlckVtYmVkZGVkSW50LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Qb2ludGVyRW1iZWRkZWRJbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjRlMTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUG9pbnRlckVtYmVkZGVkSW50LmgKQEAgLTAsMCArMSwxMjAgQEAKKy8vPT09LSBsbHZtL0FEVC9Qb2ludGVyRW1iZWRkZWRJbnQuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfUE9JTlRFUkVNQkVEREVESU5UX0gKKyNkZWZpbmUgTExWTV9BRFRfUE9JTlRFUkVNQkVEREVESU5UX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwSW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BvaW50ZXJMaWtlVHlwZVRyYWl0cy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBVdGlsaXR5IHRvIGVtYmVkIGFuIGludGVnZXIgaW50byBhIHBvaW50ZXItbGlrZSB0eXBlLiBUaGlzIGlzIHNwZWNpZmljYWxseQorLy8vIGludGVuZGVkIHRvIGFsbG93IGVtYmVkZGluZyBpbnRlZ2VycyB3aGVyZSBmZXdlciBiaXRzIGFyZSByZXF1aXJlZCB0aGFuCisvLy8gZXhpc3QgaW4gYSBwb2ludGVyLCBhbmQgdGhlIGludGVnZXIgY2FuIHBhcnRpY2lwYXRlIGluIGFic3RyYWN0aW9ucyBhbG9uZworLy8vIHNpZGUgb3RoZXIgcG9pbnRlci1saWtlIHR5cGVzLiBGb3IgZXhhbXBsZSBpdCBjYW4gYmUgcGxhY2VkIGludG8gYSBcYworLy8vIFBvaW50ZXJTdW1UeXBlIG9yIFxjIFBvaW50ZXJVbmlvbi4KKy8vLworLy8vIE5vdGUgdGhhdCBtdWNoIGxpa2UgcG9pbnRlcnMsIGFuIGludGVnZXIgdmFsdWUgb2YgemVybyBoYXMgc3BlY2lhbCB1dGlsaXR5CisvLy8gZHVlIHRvIGJvb2xlYW4gY29udmVyc2lvbnMuIEZvciBleGFtcGxlLCBhIG5vbi1udWxsIHZhbHVlIGNhbiBiZSB0ZXN0ZWQgZm9yCisvLy8gaW4gdGhlIGFib3ZlIGFic3RyYWN0aW9ucyB3aXRob3V0IHRlc3RpbmcgdGhlIHBhcnRpY3VsYXIgYWN0aXZlIG1lbWJlci4KKy8vLyBBbHNvLCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RlZCB2YWx1ZSB6ZXJvIGluaXRpYWxpemVzIHRoZSBpbnRlZ2VyLgordGVtcGxhdGUgPHR5cGVuYW1lIEludFQsIGludCBCaXRzID0gc2l6ZW9mKEludFQpICogQ0hBUl9CSVQ+CitjbGFzcyBQb2ludGVyRW1iZWRkZWRJbnQgeworICB1aW50cHRyX3QgVmFsdWUgPSAwOworCisgIC8vIE5vdGU6IFRoaXMgJzwnIGlzIGNvcnJlY3Q7IHVzaW5nICc8PScgd291bGQgcmVzdWx0IGluIHNvbWUgc2hpZnRzCisgIC8vIG92ZXJmbG93aW5nIHRoZWlyIHN0b3JhZ2UgdHlwZXMuCisgIHN0YXRpY19hc3NlcnQoQml0cyA8IHNpemVvZih1aW50cHRyX3QpICogQ0hBUl9CSVQsCisgICAgICAgICAgICAgICAgIkNhbm5vdCBlbWJlZCBtb3JlIGJpdHMgdGhhbiB3ZSBoYXZlIGluIGEgcG9pbnRlciEiKTsKKworICBlbnVtIDogdWludHB0cl90IHsKKyAgICAvLyBXZSBzaGlmdCBhcyBtYW55IHplcm9zIGludG8gdGhlIHZhbHVlIGFzIHdlIGNhbiB3aGlsZSBwcmVzZXJ2aW5nIHRoZQorICAgIC8vIG51bWJlciBvZiBiaXRzIGRlc2lyZWQgZm9yIHRoZSBpbnRlZ2VyLgorICAgIFNoaWZ0ID0gc2l6ZW9mKHVpbnRwdHJfdCkgKiBDSEFSX0JJVCAtIEJpdHMsCisKKyAgICAvLyBXZSBhbHNvIHdhbnQgdG8gYmUgYWJsZSB0byBtYXNrIG91dCB0aGUgcHJlc2VydmVkIGJpdHMgZm9yIGFzc2VydHMuCisgICAgTWFzayA9IHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oLTEpIDw8IEJpdHMKKyAgfTsKKworICBzdHJ1Y3QgUmF3VmFsdWVUYWcgeworICAgIGV4cGxpY2l0IFJhd1ZhbHVlVGFnKCkgPSBkZWZhdWx0OworICB9OworCisgIGZyaWVuZCBzdHJ1Y3QgUG9pbnRlckxpa2VUeXBlVHJhaXRzPFBvaW50ZXJFbWJlZGRlZEludD47CisKKyAgZXhwbGljaXQgUG9pbnRlckVtYmVkZGVkSW50KHVpbnRwdHJfdCBWYWx1ZSwgUmF3VmFsdWVUYWcpIDogVmFsdWUoVmFsdWUpIHt9CisKK3B1YmxpYzoKKyAgUG9pbnRlckVtYmVkZGVkSW50KCkgPSBkZWZhdWx0OworCisgIFBvaW50ZXJFbWJlZGRlZEludChJbnRUIEkpIHsgKnRoaXMgPSBJOyB9CisKKyAgUG9pbnRlckVtYmVkZGVkSW50ICZvcGVyYXRvcj0oSW50VCBJKSB7CisgICAgYXNzZXJ0KChzdGQ6OmlzX3NpZ25lZDxJbnRUPjo6dmFsdWUgPyBpc0ludDxCaXRzPihJKSA6IGlzVUludDxCaXRzPihJKSkgJiYKKyAgICAgICAgICAgIkludGVnZXIgaGFzIGJpdHMgb3V0c2lkZSB0aG9zZSBwcmVzZXJ2ZWQhIik7CisgICAgVmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KEkpIDw8IFNoaWZ0OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIE5vdGUgdGhhdCB0aGlzIGltcGxpY2l0IGNvbnZlcnNpb24gYWRkaXRpb25hbGx5IGFsbG93cyBhbGwgb2YgdGhlIGJhc2ljCisgIC8vIGNvbXBhcmlzb24gb3BlcmF0b3JzIHRvIHdvcmsgdHJhbnNwYXJlbnRseSwgZXRjLgorICBvcGVyYXRvciBJbnRUKCkgY29uc3QgeworICAgIGlmIChzdGQ6OmlzX3NpZ25lZDxJbnRUPjo6dmFsdWUpCisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SW50VD4oc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KFZhbHVlKSA+PiBTaGlmdCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEludFQ+KFZhbHVlID4+IFNoaWZ0KTsKKyAgfQorfTsKKworLy8gUHJvdmlkZSBwb2ludGVyIGxpa2UgdHJhaXRzIHRvIHN1cHBvcnQgdXNlIHdpdGggcG9pbnRlciB1bmlvbnMgYW5kIHN1bQorLy8gdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW50VCwgaW50IEJpdHM+CitzdHJ1Y3QgUG9pbnRlckxpa2VUeXBlVHJhaXRzPFBvaW50ZXJFbWJlZGRlZEludDxJbnRULCBCaXRzPj4geworICB1c2luZyBUID0gUG9pbnRlckVtYmVkZGVkSW50PEludFQsIEJpdHM+OworCisgIHN0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0QXNWb2lkUG9pbnRlcihjb25zdCBUICZQKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihQLlZhbHVlKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgVCBnZXRGcm9tVm9pZFBvaW50ZXIodm9pZCAqUCkgeworICAgIHJldHVybiBUKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihQKSwgdHlwZW5hbWUgVDo6UmF3VmFsdWVUYWcoKSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIFQgZ2V0RnJvbVZvaWRQb2ludGVyKGNvbnN0IHZvaWQgKlApIHsKKyAgICByZXR1cm4gVChyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oUCksIHR5cGVuYW1lIFQ6OlJhd1ZhbHVlVGFnKCkpOworICB9CisKKyAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSBUOjpTaGlmdCB9OworfTsKKworLy8gVGVhY2ggRGVuc2VNYXAgaG93IHRvIHVzZSBQb2ludGVyRW1iZWRkZWRJbnQgb2JqZWN0cyBhcyBrZXlzIGlmIHRoZSBJbnQgdHlwZQorLy8gaXRzZWxmIGNhbiBiZSBhIGtleS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbnRULCBpbnQgQml0cz4KK3N0cnVjdCBEZW5zZU1hcEluZm88UG9pbnRlckVtYmVkZGVkSW50PEludFQsIEJpdHM+PiB7CisgIHVzaW5nIFQgPSBQb2ludGVyRW1iZWRkZWRJbnQ8SW50VCwgQml0cz47CisgIHVzaW5nIEludEluZm8gPSBEZW5zZU1hcEluZm88SW50VD47CisKKyAgc3RhdGljIGlubGluZSBUIGdldEVtcHR5S2V5KCkgeyByZXR1cm4gSW50SW5mbzo6Z2V0RW1wdHlLZXkoKTsgfQorICBzdGF0aWMgaW5saW5lIFQgZ2V0VG9tYnN0b25lS2V5KCkgeyByZXR1cm4gSW50SW5mbzo6Z2V0VG9tYnN0b25lS2V5KCk7IH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IFQgJkFyZykgeworICAgIHJldHVybiBJbnRJbmZvOjpnZXRIYXNoVmFsdWUoQXJnKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgVCAmTEhTLCBjb25zdCBUICZSSFMpIHsgcmV0dXJuIExIUyA9PSBSSFM7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9QT0lOVEVSRU1CRURERURJTlRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg0ZDA1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgKQEAgLTAsMCArMSwyMzMgQEAKKy8vPT09LSBsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIC0gUGFpciBmb3IgcG9pbnRlciBhbmQgaW50IC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFBvaW50ZXJJbnRQYWlyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfUE9JTlRFUklOVFBBSVJfSAorI2RlZmluZSBMTFZNX0FEVF9QT0lOVEVSSU5UUEFJUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IERlbnNlTWFwSW5mbzsKK3RlbXBsYXRlIDx0eXBlbmFtZSBQb2ludGVyVCwgdW5zaWduZWQgSW50Qml0cywgdHlwZW5hbWUgUHRyVHJhaXRzPgorc3RydWN0IFBvaW50ZXJJbnRQYWlySW5mbzsKKworLy8vIFBvaW50ZXJJbnRQYWlyIC0gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgcGFpciBvZiBhIHBvaW50ZXIgYW5kIHNtYWxsCisvLy8gaW50ZWdlci4gIEl0IGlzIGRlc2lnbmVkIHRvIHJlcHJlc2VudCB0aGlzIGluIHRoZSBzcGFjZSByZXF1aXJlZCBieSBvbmUKKy8vLyBwb2ludGVyIGJ5IGJpdG1hbmdsaW5nIHRoZSBpbnRlZ2VyIGludG8gdGhlIGxvdyBwYXJ0IG9mIHRoZSBwb2ludGVyLiAgVGhpcworLy8vIGNhbiBvbmx5IGJlIGRvbmUgZm9yIHNtYWxsIGludGVnZXJzOiB0eXBpY2FsbHkgdXAgdG8gMyBiaXRzLCBidXQgaXQgZGVwZW5kcworLy8vIG9uIHRoZSBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgYWNjb3JkaW5nIHRvIFBvaW50ZXJMaWtlVHlwZVRyYWl0cyBmb3IgdGhlCisvLy8gdHlwZS4KKy8vLworLy8vIE5vdGUgdGhhdCBQb2ludGVySW50UGFpciBhbHdheXMgcHV0cyB0aGUgSW50VmFsIHBhcnQgaW4gdGhlIGhpZ2hlc3QgYml0cworLy8vIHBvc3NpYmxlLiAgRm9yIGV4YW1wbGUsIFBvaW50ZXJJbnRQYWlyPHZvaWQqLCAxLCBib29sPiB3aWxsIHB1dCB0aGUgYml0IGZvcgorLy8vIHRoZSBib29sIGludG8gYml0ICMyLCBub3QgYml0ICMwLCB3aGljaCBhbGxvd3MgdGhlIGxvdyB0d28gYml0cyB0byBiZSB1c2VkCisvLy8gZm9yIHNvbWV0aGluZyBlbHNlLiAgRm9yIGV4YW1wbGUsIHRoaXMgYWxsb3dzOgorLy8vICAgUG9pbnRlckludFBhaXI8UG9pbnRlckludFBhaXI8dm9pZCosIDEsIGJvb2w+LCAxLCBib29sPgorLy8vIC4uLiBhbmQgdGhlIHR3byBib29scyB3aWxsIGxhbmQgaW4gZGlmZmVyZW50IGJpdHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlclR5LCB1bnNpZ25lZCBJbnRCaXRzLCB0eXBlbmFtZSBJbnRUeXBlID0gdW5zaWduZWQsCisgICAgICAgICAgdHlwZW5hbWUgUHRyVHJhaXRzID0gUG9pbnRlckxpa2VUeXBlVHJhaXRzPFBvaW50ZXJUeT4sCisgICAgICAgICAgdHlwZW5hbWUgSW5mbyA9IFBvaW50ZXJJbnRQYWlySW5mbzxQb2ludGVyVHksIEludEJpdHMsIFB0clRyYWl0cz4+CitjbGFzcyBQb2ludGVySW50UGFpciB7CisgIGludHB0cl90IFZhbHVlID0gMDsKKworcHVibGljOgorICBjb25zdGV4cHIgUG9pbnRlckludFBhaXIoKSA9IGRlZmF1bHQ7CisKKyAgUG9pbnRlckludFBhaXIoUG9pbnRlclR5IFB0clZhbCwgSW50VHlwZSBJbnRWYWwpIHsKKyAgICBzZXRQb2ludGVyQW5kSW50KFB0clZhbCwgSW50VmFsKTsKKyAgfQorCisgIGV4cGxpY2l0IFBvaW50ZXJJbnRQYWlyKFBvaW50ZXJUeSBQdHJWYWwpIHsgaW5pdFdpdGhQb2ludGVyKFB0clZhbCk7IH0KKworICBQb2ludGVyVHkgZ2V0UG9pbnRlcigpIGNvbnN0IHsgcmV0dXJuIEluZm86OmdldFBvaW50ZXIoVmFsdWUpOyB9CisKKyAgSW50VHlwZSBnZXRJbnQoKSBjb25zdCB7IHJldHVybiAoSW50VHlwZSlJbmZvOjpnZXRJbnQoVmFsdWUpOyB9CisKKyAgdm9pZCBzZXRQb2ludGVyKFBvaW50ZXJUeSBQdHJWYWwpIHsKKyAgICBWYWx1ZSA9IEluZm86OnVwZGF0ZVBvaW50ZXIoVmFsdWUsIFB0clZhbCk7CisgIH0KKworICB2b2lkIHNldEludChJbnRUeXBlIEludFZhbCkgeworICAgIFZhbHVlID0gSW5mbzo6dXBkYXRlSW50KFZhbHVlLCBzdGF0aWNfY2FzdDxpbnRwdHJfdD4oSW50VmFsKSk7CisgIH0KKworICB2b2lkIGluaXRXaXRoUG9pbnRlcihQb2ludGVyVHkgUHRyVmFsKSB7CisgICAgVmFsdWUgPSBJbmZvOjp1cGRhdGVQb2ludGVyKDAsIFB0clZhbCk7CisgIH0KKworICB2b2lkIHNldFBvaW50ZXJBbmRJbnQoUG9pbnRlclR5IFB0clZhbCwgSW50VHlwZSBJbnRWYWwpIHsKKyAgICBWYWx1ZSA9IEluZm86OnVwZGF0ZUludChJbmZvOjp1cGRhdGVQb2ludGVyKDAsIFB0clZhbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KEludFZhbCkpOworICB9CisKKyAgUG9pbnRlclR5IGNvbnN0ICpnZXRBZGRyT2ZQb2ludGVyKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PFBvaW50ZXJJbnRQYWlyICo+KHRoaXMpLT5nZXRBZGRyT2ZQb2ludGVyKCk7CisgIH0KKworICBQb2ludGVyVHkgKmdldEFkZHJPZlBvaW50ZXIoKSB7CisgICAgYXNzZXJ0KFZhbHVlID09IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGdldFBvaW50ZXIoKSkgJiYKKyAgICAgICAgICAgIkNhbiBvbmx5IHJldHVybiB0aGUgYWRkcmVzcyBpZiBJbnRCaXRzIGlzIGNsZWFyZWQgYW5kICIKKyAgICAgICAgICAgIlB0clRyYWl0cyBkb2Vzbid0IGNoYW5nZSB0aGUgcG9pbnRlciIpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFBvaW50ZXJUeSAqPigmVmFsdWUpOworICB9CisKKyAgdm9pZCAqZ2V0T3BhcXVlVmFsdWUoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQgKj4oVmFsdWUpOyB9CisKKyAgdm9pZCBzZXRGcm9tT3BhcXVlVmFsdWUodm9pZCAqVmFsKSB7CisgICAgVmFsdWUgPSByZWludGVycHJldF9jYXN0PGludHB0cl90PihWYWwpOworICB9CisKKyAgc3RhdGljIFBvaW50ZXJJbnRQYWlyIGdldEZyb21PcGFxdWVWYWx1ZSh2b2lkICpWKSB7CisgICAgUG9pbnRlckludFBhaXIgUDsKKyAgICBQLnNldEZyb21PcGFxdWVWYWx1ZShWKTsKKyAgICByZXR1cm4gUDsKKyAgfQorCisgIC8vIEFsbG93IFBvaW50ZXJJbnRQYWlycyB0byBiZSBjcmVhdGVkIGZyb20gY29uc3Qgdm9pZCAqIGlmIGFuZCBvbmx5IGlmIHRoZQorICAvLyBwb2ludGVyIHR5cGUgY291bGQgYmUgY3JlYXRlZCBmcm9tIGEgY29uc3Qgdm9pZCAqLgorICBzdGF0aWMgUG9pbnRlckludFBhaXIgZ2V0RnJvbU9wYXF1ZVZhbHVlKGNvbnN0IHZvaWQgKlYpIHsKKyAgICAodm9pZClQdHJUcmFpdHM6OmdldEZyb21Wb2lkUG9pbnRlcihWKTsKKyAgICByZXR1cm4gZ2V0RnJvbU9wYXF1ZVZhbHVlKGNvbnN0X2Nhc3Q8dm9pZCAqPihWKSk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgUG9pbnRlckludFBhaXIgJlJIUykgY29uc3QgeworICAgIHJldHVybiBWYWx1ZSA9PSBSSFMuVmFsdWU7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgUG9pbnRlckludFBhaXIgJlJIUykgY29uc3QgeworICAgIHJldHVybiBWYWx1ZSAhPSBSSFMuVmFsdWU7CisgIH0KKworICBib29sIG9wZXJhdG9yPChjb25zdCBQb2ludGVySW50UGFpciAmUkhTKSBjb25zdCB7IHJldHVybiBWYWx1ZSA8IFJIUy5WYWx1ZTsgfQorICBib29sIG9wZXJhdG9yPihjb25zdCBQb2ludGVySW50UGFpciAmUkhTKSBjb25zdCB7IHJldHVybiBWYWx1ZSA+IFJIUy5WYWx1ZTsgfQorCisgIGJvb2wgb3BlcmF0b3I8PShjb25zdCBQb2ludGVySW50UGFpciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlIDw9IFJIUy5WYWx1ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBQb2ludGVySW50UGFpciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlID49IFJIUy5WYWx1ZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50ZXJULCB1bnNpZ25lZCBJbnRCaXRzLCB0eXBlbmFtZSBQdHJUcmFpdHM+CitzdHJ1Y3QgUG9pbnRlckludFBhaXJJbmZvIHsKKyAgc3RhdGljX2Fzc2VydChQdHJUcmFpdHM6Ok51bUxvd0JpdHNBdmFpbGFibGUgPAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnRwdHJfdD46OmRpZ2l0cywKKyAgICAgICAgICAgICAgICAiY2Fubm90IHVzZSBhIHBvaW50ZXIgdHlwZSB0aGF0IGhhcyBhbGwgYml0cyBmcmVlIik7CisgIHN0YXRpY19hc3NlcnQoSW50Qml0cyA8PSBQdHJUcmFpdHM6Ok51bUxvd0JpdHNBdmFpbGFibGUsCisgICAgICAgICAgICAgICAgIlBvaW50ZXJJbnRQYWlyIHdpdGggaW50ZWdlciBzaXplIHRvbyBsYXJnZSBmb3IgcG9pbnRlciIpOworICBlbnVtIDogdWludHB0cl90IHsKKyAgICAvLy8gUG9pbnRlckJpdE1hc2sgLSBUaGUgYml0cyB0aGF0IGNvbWUgZnJvbSB0aGUgcG9pbnRlci4KKyAgICBQb2ludGVyQml0TWFzayA9CisgICAgICAgIH4odWludHB0cl90KSgoKGludHB0cl90KTEgPDwgUHRyVHJhaXRzOjpOdW1Mb3dCaXRzQXZhaWxhYmxlKSAtIDEpLAorCisgICAgLy8vIEludFNoaWZ0IC0gVGhlIG51bWJlciBvZiBsb3cgYml0cyB0aGF0IHdlIHJlc2VydmUgZm9yIG90aGVyIHVzZXMsIGFuZAorICAgIC8vLyBrZWVwIHplcm8uCisgICAgSW50U2hpZnQgPSAodWludHB0cl90KVB0clRyYWl0czo6TnVtTG93Qml0c0F2YWlsYWJsZSAtIEludEJpdHMsCisKKyAgICAvLy8gSW50TWFzayAtIFRoaXMgaXMgdGhlIHVuc2hpZnRlZCBtYXNrIGZvciB2YWxpZCBiaXRzIG9mIHRoZSBpbnQgdHlwZS4KKyAgICBJbnRNYXNrID0gKHVpbnRwdHJfdCkoKChpbnRwdHJfdCkxIDw8IEludEJpdHMpIC0gMSksCisKKyAgICAvLyBTaGlmdGVkSW50TWFzayAtIFRoaXMgaXMgdGhlIGJpdHMgZm9yIHRoZSBpbnRlZ2VyIHNoaWZ0ZWQgaW4gcGxhY2UuCisgICAgU2hpZnRlZEludE1hc2sgPSAodWludHB0cl90KShJbnRNYXNrIDw8IEludFNoaWZ0KQorICB9OworCisgIHN0YXRpYyBQb2ludGVyVCBnZXRQb2ludGVyKGludHB0cl90IFZhbHVlKSB7CisgICAgcmV0dXJuIFB0clRyYWl0czo6Z2V0RnJvbVZvaWRQb2ludGVyKAorICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQgKj4oVmFsdWUgJiBQb2ludGVyQml0TWFzaykpOworICB9CisKKyAgc3RhdGljIGludHB0cl90IGdldEludChpbnRwdHJfdCBWYWx1ZSkgeworICAgIHJldHVybiAoVmFsdWUgPj4gSW50U2hpZnQpICYgSW50TWFzazsKKyAgfQorCisgIHN0YXRpYyBpbnRwdHJfdCB1cGRhdGVQb2ludGVyKGludHB0cl90IE9yaWdWYWx1ZSwgUG9pbnRlclQgUHRyKSB7CisgICAgaW50cHRyX3QgUHRyV29yZCA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KFB0clRyYWl0czo6Z2V0QXNWb2lkUG9pbnRlcihQdHIpKTsKKyAgICBhc3NlcnQoKFB0cldvcmQgJiB+UG9pbnRlckJpdE1hc2spID09IDAgJiYKKyAgICAgICAgICAgIlBvaW50ZXIgaXMgbm90IHN1ZmZpY2llbnRseSBhbGlnbmVkIik7CisgICAgLy8gUHJlc2VydmUgYWxsIGxvdyBiaXRzLCBqdXN0IHVwZGF0ZSB0aGUgcG9pbnRlci4KKyAgICByZXR1cm4gUHRyV29yZCB8IChPcmlnVmFsdWUgJiB+UG9pbnRlckJpdE1hc2spOworICB9CisKKyAgc3RhdGljIGludHB0cl90IHVwZGF0ZUludChpbnRwdHJfdCBPcmlnVmFsdWUsIGludHB0cl90IEludCkgeworICAgIGludHB0cl90IEludFdvcmQgPSBzdGF0aWNfY2FzdDxpbnRwdHJfdD4oSW50KTsKKyAgICBhc3NlcnQoKEludFdvcmQgJiB+SW50TWFzaykgPT0gMCAmJiAiSW50ZWdlciB0b28gbGFyZ2UgZm9yIGZpZWxkIik7CisKKyAgICAvLyBQcmVzZXJ2ZSBhbGwgYml0cyBvdGhlciB0aGFuIHRoZSBvbmVzIHdlIGFyZSB1cGRhdGluZy4KKyAgICByZXR1cm4gKE9yaWdWYWx1ZSAmIH5TaGlmdGVkSW50TWFzaykgfCBJbnRXb3JkIDw8IEludFNoaWZ0OworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlzUG9kTGlrZTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBQb2ludGVyVHksIHVuc2lnbmVkIEludEJpdHMsIHR5cGVuYW1lIEludFR5cGU+CitzdHJ1Y3QgaXNQb2RMaWtlPFBvaW50ZXJJbnRQYWlyPFBvaW50ZXJUeSwgSW50Qml0cywgSW50VHlwZT4+IHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKworLy8gUHJvdmlkZSBzcGVjaWFsaXphdGlvbiBvZiBEZW5zZU1hcEluZm8gZm9yIFBvaW50ZXJJbnRQYWlyLgordGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50ZXJUeSwgdW5zaWduZWQgSW50Qml0cywgdHlwZW5hbWUgSW50VHlwZT4KK3N0cnVjdCBEZW5zZU1hcEluZm88UG9pbnRlckludFBhaXI8UG9pbnRlclR5LCBJbnRCaXRzLCBJbnRUeXBlPj4geworICB1c2luZyBUeSA9IFBvaW50ZXJJbnRQYWlyPFBvaW50ZXJUeSwgSW50Qml0cywgSW50VHlwZT47CisKKyAgc3RhdGljIFR5IGdldEVtcHR5S2V5KCkgeworICAgIHVpbnRwdHJfdCBWYWwgPSBzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KC0xKTsKKyAgICBWYWwgPDw9IFBvaW50ZXJMaWtlVHlwZVRyYWl0czxUeT46Ok51bUxvd0JpdHNBdmFpbGFibGU7CisgICAgcmV0dXJuIFR5OjpnZXRGcm9tT3BhcXVlVmFsdWUocmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KFZhbCkpOworICB9CisKKyAgc3RhdGljIFR5IGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICB1aW50cHRyX3QgVmFsID0gc3RhdGljX2Nhc3Q8dWludHB0cl90PigtMik7CisgICAgVmFsIDw8PSBQb2ludGVyTGlrZVR5cGVUcmFpdHM8UG9pbnRlclR5Pjo6TnVtTG93Qml0c0F2YWlsYWJsZTsKKyAgICByZXR1cm4gVHk6OmdldEZyb21PcGFxdWVWYWx1ZShyZWludGVycHJldF9jYXN0PHZvaWQgKj4oVmFsKSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKFR5IFYpIHsKKyAgICB1aW50cHRyX3QgSVYgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oVi5nZXRPcGFxdWVWYWx1ZSgpKTsKKyAgICByZXR1cm4gdW5zaWduZWQoSVYpIF4gdW5zaWduZWQoSVYgPj4gOSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IFR5ICZMSFMsIGNvbnN0IFR5ICZSSFMpIHsgcmV0dXJuIExIUyA9PSBSSFM7IH0KK307CisKKy8vIFRlYWNoIFNtYWxsUHRyU2V0IHRoYXQgUG9pbnRlckludFBhaXIgaXMgImJhc2ljYWxseSBhIHBvaW50ZXIiLgordGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50ZXJUeSwgdW5zaWduZWQgSW50Qml0cywgdHlwZW5hbWUgSW50VHlwZSwKKyAgICAgICAgICB0eXBlbmFtZSBQdHJUcmFpdHM+CitzdHJ1Y3QgUG9pbnRlckxpa2VUeXBlVHJhaXRzPAorICAgIFBvaW50ZXJJbnRQYWlyPFBvaW50ZXJUeSwgSW50Qml0cywgSW50VHlwZSwgUHRyVHJhaXRzPj4geworICBzdGF0aWMgaW5saW5lIHZvaWQgKgorICBnZXRBc1ZvaWRQb2ludGVyKGNvbnN0IFBvaW50ZXJJbnRQYWlyPFBvaW50ZXJUeSwgSW50Qml0cywgSW50VHlwZT4gJlApIHsKKyAgICByZXR1cm4gUC5nZXRPcGFxdWVWYWx1ZSgpOworICB9CisKKyAgc3RhdGljIGlubGluZSBQb2ludGVySW50UGFpcjxQb2ludGVyVHksIEludEJpdHMsIEludFR5cGU+CisgIGdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7CisgICAgcmV0dXJuIFBvaW50ZXJJbnRQYWlyPFBvaW50ZXJUeSwgSW50Qml0cywgSW50VHlwZT46OmdldEZyb21PcGFxdWVWYWx1ZShQKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgUG9pbnRlckludFBhaXI8UG9pbnRlclR5LCBJbnRCaXRzLCBJbnRUeXBlPgorICBnZXRGcm9tVm9pZFBvaW50ZXIoY29uc3Qgdm9pZCAqUCkgeworICAgIHJldHVybiBQb2ludGVySW50UGFpcjxQb2ludGVyVHksIEludEJpdHMsIEludFR5cGU+OjpnZXRGcm9tT3BhcXVlVmFsdWUoUCk7CisgIH0KKworICBlbnVtIHsgTnVtTG93Qml0c0F2YWlsYWJsZSA9IFB0clRyYWl0czo6TnVtTG93Qml0c0F2YWlsYWJsZSAtIEludEJpdHMgfTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9QT0lOVEVSSU5UUEFJUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Qb2ludGVyU3VtVHlwZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUG9pbnRlclN1bVR5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzc5NTcxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUG9pbnRlclN1bVR5cGUuaApAQCAtMCwwICsxLDIwNyBAQAorLy89PT0tIGxsdm0vQURUL1BvaW50ZXJTdW1UeXBlLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9QT0lOVEVSU1VNVFlQRV9ICisjZGVmaW5lIExMVk1fQURUX1BPSU5URVJTVU1UWVBFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwSW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Qb2ludGVyTGlrZVR5cGVUcmFpdHMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEEgY29tcGlsZSB0aW1lIHBhaXIgb2YgYW4gaW50ZWdlciB0YWcgYW5kIHRoZSBwb2ludGVyLWxpa2UgdHlwZSB3aGljaCBpdAorLy8vIGluZGV4ZXMgd2l0aGluIGEgc3VtIHR5cGUuIEFsc28gYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyCisvLy8gdHJhaXRzIGNsYXNzIGZvciBwb2ludGVyIHR5cGVzIHdpdGggY3VzdG9tIGJlaGF2aW9yIHN1Y2ggYXMgb3Zlci1hbGlnbmVkCisvLy8gYWxsb2NhdGlvbi4KK3RlbXBsYXRlIDx1aW50cHRyX3QgTiwgdHlwZW5hbWUgUG9pbnRlckFyZ1QsCisgICAgICAgICAgdHlwZW5hbWUgVHJhaXRzQXJnVCA9IFBvaW50ZXJMaWtlVHlwZVRyYWl0czxQb2ludGVyQXJnVD4+CitzdHJ1Y3QgUG9pbnRlclN1bVR5cGVNZW1iZXIgeworICBlbnVtIHsgVGFnID0gTiB9OworICB1c2luZyBQb2ludGVyVCA9IFBvaW50ZXJBcmdUOworICB1c2luZyBUcmFpdHNUID0gVHJhaXRzQXJnVDsKK307CisKK25hbWVzcGFjZSBkZXRhaWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGFnVCwgdHlwZW5hbWUuLi4gTWVtYmVyVHM+IHN0cnVjdCBQb2ludGVyU3VtVHlwZUhlbHBlcjsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCisvLy8gQSBzdW0gdHlwZSBvdmVyIHBvaW50ZXItbGlrZSB0eXBlcy4KKy8vLworLy8vIFRoaXMgaXMgYSBub3JtYWwgdGFnZ2VkIHVuaW9uIGFjcm9zcyBwb2ludGVyLWxpa2UgdHlwZXMgdGhhdCB1c2VzIHRoZSBsb3cKKy8vLyBiaXRzIG9mIHRoZSBwb2ludGVycyB0byBzdG9yZSB0aGUgdGFnLgorLy8vCisvLy8gRWFjaCBtZW1iZXIgb2YgdGhlIHN1bSB0eXBlIGlzIHNwZWNpZmllZCBieSBwYXNzaW5nIGEgXGMKKy8vLyBQb2ludGVyU3VtVHlwZU1lbWJlciBzcGVjaWFsaXphdGlvbiBpbiB0aGUgdmFyaWFkaWMgbWVtYmVyIGFyZ3VtZW50IGxpc3QuCisvLy8gVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gY29udHJvbCB0aGUgcGFydGljdWxhciB0YWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoCisvLy8gYSBwYXJ0aWN1bGFyIHR5cGUsIHVzZSB0aGUgc2FtZSB0eXBlIGZvciBtdWx0aXBsZSBkaWZmZXJlbnQgdGFncywgYW5kCisvLy8gY3VzdG9taXplIHRoZSBwb2ludGVyLWxpa2UgdHJhaXRzIHVzZWQgZm9yIGEgcGFydGljdWxhciBtZW1iZXIuIE5vdGUgdGhhdAorLy8vIHRoZXNlICptdXN0KiBiZSBzcGVjaWFsaXphdGlvbnMgb2YgXGMgUG9pbnRlclN1bVR5cGVNZW1iZXIsIG5vIG90aGVyIHR5cGUKKy8vLyB3aWxsIHN1ZmZpY2UsIGV2ZW4gaWYgaXQgcHJvdmlkZXMgYSBjb21wYXRpYmxlIGludGVyZmFjZS4KKy8vLworLy8vIFRoaXMgdHlwZSBpbXBsZW1lbnRzIGFsbCBvZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgYW5kIGV2ZW4gaGFzaCB0YWJsZQorLy8vIHN1cHBvcnQgYnkgY29tcGFyaW5nIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2Ugb2YgdGhlIHBvaW50ZXIgdmFsdWVzLiBJdAorLy8vIGRvZXNuJ3Qgc3VwcG9ydCBkZWxlZ2F0aW5nIHRvIHBhcnRpY3VsYXIgbWVtYmVycyBmb3IgY29tcGFyaXNvbnMuCisvLy8KKy8vLyBJdCBhbHNvIGRlZmF1bHQgY29uc3RydWN0cyB0byBhIHplcm8gdGFnIHdpdGggYSBudWxsIHBvaW50ZXIsIHdoYXRldmVyIHRoYXQKKy8vLyB3b3VsZCBiZS4gVGhpcyBtZWFucyB0aGF0IHRoZSB6ZXJvIHZhbHVlIGZvciB0aGUgdGFnIHR5cGUgaXMgc2lnbmlmaWNhbnQKKy8vLyBhbmQgbWF5IGJlIGRlc2lyYWJsZSB0byBzZXQgdG8gYSBzdGF0ZSB0aGF0IGlzIHBhcnRpY3VsYXJseSBkZXNpcmFibGUgdG8KKy8vLyBkZWZhdWx0IGNvbnN0cnVjdC4KKy8vLworLy8vIFRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIGNvbnN0cnVjdGluZyBvciBhY2Nlc3Npbmcgd2l0aCBhIGR5bmFtaWMgdGFnIGFzCisvLy8gdGhhdCB3b3VsZCBmdW5kYW1lbnRhbGx5IHZpb2xhdGUgdGhlIHR5cGUgc2FmZXR5IHByb3ZpZGVkIGJ5IHRoZSBzdW0gdHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUYWdULCB0eXBlbmFtZS4uLiBNZW1iZXJUcz4gY2xhc3MgUG9pbnRlclN1bVR5cGUgeworICB1aW50cHRyX3QgVmFsdWUgPSAwOworCisgIHVzaW5nIEhlbHBlclQgPSBkZXRhaWw6OlBvaW50ZXJTdW1UeXBlSGVscGVyPFRhZ1QsIE1lbWJlclRzLi4uPjsKKworcHVibGljOgorICBjb25zdGV4cHIgUG9pbnRlclN1bVR5cGUoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIEEgdHlwZWQgY29uc3RydWN0b3IgZm9yIGEgc3BlY2lmaWMgdGFnZ2VkIG1lbWJlciBvZiB0aGUgc3VtIHR5cGUuCisgIHRlbXBsYXRlIDxUYWdUIE4+CisgIHN0YXRpYyBQb2ludGVyU3VtVHlwZQorICBjcmVhdGUodHlwZW5hbWUgSGVscGVyVDo6dGVtcGxhdGUgTG9va3VwPE4+OjpQb2ludGVyVCBQb2ludGVyKSB7CisgICAgUG9pbnRlclN1bVR5cGUgUmVzdWx0OworICAgIHZvaWQgKlYgPSBIZWxwZXJUOjp0ZW1wbGF0ZSBMb29rdXA8Tj46OlRyYWl0c1Q6OmdldEFzVm9pZFBvaW50ZXIoUG9pbnRlcik7CisgICAgYXNzZXJ0KChyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oVikgJiBIZWxwZXJUOjpUYWdNYXNrKSA9PSAwICYmCisgICAgICAgICAgICJQb2ludGVyIGlzIGluc3VmZmljaWVudGx5IGFsaWduZWQgdG8gc3RvcmUgdGhlIGRpc2NyaW1pbmFudCEiKTsKKyAgICBSZXN1bHQuVmFsdWUgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oVikgfCBOOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICBUYWdUIGdldFRhZygpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PFRhZ1Q+KFZhbHVlICYgSGVscGVyVDo6VGFnTWFzayk7IH0KKworICB0ZW1wbGF0ZSA8VGFnVCBOPiBib29sIGlzKCkgY29uc3QgeyByZXR1cm4gTiA9PSBnZXRUYWcoKTsgfQorCisgIHRlbXBsYXRlIDxUYWdUIE4+IHR5cGVuYW1lIEhlbHBlclQ6OnRlbXBsYXRlIExvb2t1cDxOPjo6UG9pbnRlclQgZ2V0KCkgY29uc3QgeworICAgIHZvaWQgKlAgPSBpczxOPigpID8gZ2V0SW1wbCgpIDogbnVsbHB0cjsKKyAgICByZXR1cm4gSGVscGVyVDo6dGVtcGxhdGUgTG9va3VwPE4+OjpUcmFpdHNUOjpnZXRGcm9tVm9pZFBvaW50ZXIoUCk7CisgIH0KKworICB0ZW1wbGF0ZSA8VGFnVCBOPgorICB0eXBlbmFtZSBIZWxwZXJUOjp0ZW1wbGF0ZSBMb29rdXA8Tj46OlBvaW50ZXJUIGNhc3QoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzPE4+KCkgJiYgIlRoaXMgaW5zdGFuY2UgaGFzIGEgZGlmZmVyZW50IGFjdGl2ZSBtZW1iZXIuIik7CisgICAgcmV0dXJuIEhlbHBlclQ6OnRlbXBsYXRlIExvb2t1cDxOPjo6VHJhaXRzVDo6Z2V0RnJvbVZvaWRQb2ludGVyKGdldEltcGwoKSk7CisgIH0KKworICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gVmFsdWUgJiBIZWxwZXJUOjpQb2ludGVyTWFzazsgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgUG9pbnRlclN1bVR5cGUgJlIpIGNvbnN0IHsgcmV0dXJuIFZhbHVlID09IFIuVmFsdWU7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFBvaW50ZXJTdW1UeXBlICZSKSBjb25zdCB7IHJldHVybiBWYWx1ZSAhPSBSLlZhbHVlOyB9CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFBvaW50ZXJTdW1UeXBlICZSKSBjb25zdCB7IHJldHVybiBWYWx1ZSA8IFIuVmFsdWU7IH0KKyAgYm9vbCBvcGVyYXRvcj4oY29uc3QgUG9pbnRlclN1bVR5cGUgJlIpIGNvbnN0IHsgcmV0dXJuIFZhbHVlID4gUi5WYWx1ZTsgfQorICBib29sIG9wZXJhdG9yPD0oY29uc3QgUG9pbnRlclN1bVR5cGUgJlIpIGNvbnN0IHsgcmV0dXJuIFZhbHVlIDw9IFIuVmFsdWU7IH0KKyAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFBvaW50ZXJTdW1UeXBlICZSKSBjb25zdCB7IHJldHVybiBWYWx1ZSA+PSBSLlZhbHVlOyB9CisKKyAgdWludHB0cl90IGdldE9wYXF1ZVZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKworcHJvdGVjdGVkOgorICB2b2lkICpnZXRJbXBsKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQgKj4oVmFsdWUgJiBIZWxwZXJUOjpQb2ludGVyTWFzayk7CisgIH0KK307CisKK25hbWVzcGFjZSBkZXRhaWwgeworCisvLy8gQSBoZWxwZXIgdGVtcGxhdGUgZm9yIGltcGxlbWVudGluZyBcYyBQb2ludGVyU3VtVHlwZS4gSXQgcHJvdmlkZXMgZmFzdAorLy8vIGNvbXBpbGUtdGltZSBsb29rdXAgb2YgdGhlIG1lbWJlciBmcm9tIGEgcGFydGljdWxhciB0YWcgdmFsdWUsIGFsb25nIHdpdGgKKy8vLyB1c2VmdWwgY29uc3RhbnRzIGFuZCBjb21waWxlIHRpbWUgY2hlY2tpbmcgaW5mcmFzdHJ1Y3R1cmUuLgordGVtcGxhdGUgPHR5cGVuYW1lIFRhZ1QsIHR5cGVuYW1lLi4uIE1lbWJlclRzPgorc3RydWN0IFBvaW50ZXJTdW1UeXBlSGVscGVyIDogTWVtYmVyVHMuLi4geworICAvLyBGaXJzdCB3ZSB1c2UgYSB0cmljayB0byBhbGxvdyBxdWlja2x5IGxvb2tpbmcgdXAgaW5mb3JtYXRpb24gYWJvdXQKKyAgLy8gYSBwYXJ0aWN1bGFyIG1lbWJlciBvZiB0aGUgc3VtIHR5cGUuIFRoaXMgd29ya3MgYmVjYXVzZSB3ZSBhcnJhbmdlZCB0bworICAvLyBoYXZlIHRoaXMgdHlwZSBkZXJpdmUgZnJvbSBhbGwgb2YgdGhlIG1lbWJlciB0eXBlIHRlbXBsYXRlcy4gV2UgY2FuIHNlbGVjdAorICAvLyB0aGUgbWF0Y2hpbmcgbWVtYmVyIGZvciBhIHRhZyB1c2luZyB0eXBlIGRlZHVjdGlvbiBkdXJpbmcgb3ZlcmxvYWQKKyAgLy8gcmVzb2x1dGlvbi4KKyAgdGVtcGxhdGUgPFRhZ1QgTiwgdHlwZW5hbWUgUG9pbnRlclQsIHR5cGVuYW1lIFRyYWl0c1Q+CisgIHN0YXRpYyBQb2ludGVyU3VtVHlwZU1lbWJlcjxOLCBQb2ludGVyVCwgVHJhaXRzVD4KKyAgTG9va3VwT3ZlcmxvYWQoUG9pbnRlclN1bVR5cGVNZW1iZXI8TiwgUG9pbnRlclQsIFRyYWl0c1Q+ICopOworICB0ZW1wbGF0ZSA8VGFnVCBOPiBzdGF0aWMgdm9pZCBMb29rdXBPdmVybG9hZCguLi4pOworICB0ZW1wbGF0ZSA8VGFnVCBOPiBzdHJ1Y3QgTG9va3VwIHsKKyAgICAvLyBDb21wdXRlIGEgcGFydGljdWxhciBtZW1iZXIgdHlwZSBieSByZXNvbHZpbmcgdGhlIGxvb2t1cCBoZWxwZXIgb3ZvcmxvYWQuCisgICAgdXNpbmcgTWVtYmVyVCA9IGRlY2x0eXBlKAorICAgICAgICBMb29rdXBPdmVybG9hZDxOPihzdGF0aWNfY2FzdDxQb2ludGVyU3VtVHlwZUhlbHBlciAqPihudWxscHRyKSkpOworCisgICAgLy8vIFRoZSBOdGggbWVtYmVyJ3MgcG9pbnRlciB0eXBlLgorICAgIHVzaW5nIFBvaW50ZXJUID0gdHlwZW5hbWUgTWVtYmVyVDo6UG9pbnRlclQ7CisKKyAgICAvLy8gVGhlIE50aCBtZW1iZXIncyB0cmFpdHMgdHlwZS4KKyAgICB1c2luZyBUcmFpdHNUID0gdHlwZW5hbWUgTWVtYmVyVDo6VHJhaXRzVDsKKyAgfTsKKworICAvLyBOZXh0IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJpdHMgYXZhaWxhYmxlIGZvciB0aGUgZGlzY3JpbWluYW50CisgIC8vIGJ5IHRha2luZyB0aGUgbWluIG9mIHRoZSBiaXRzIGF2YWlsYWJsZSBmb3IgZWFjaCBtZW1iZXIuIE11Y2ggb2YgdGhpcworICAvLyB3b3VsZCBiZSBhbWF6aW5nbHkgZWFzaWVyIHdpdGggZ29vZCBjb25zdGV4cHIgc3VwcG9ydC4KKyAgdGVtcGxhdGUgPHVpbnRwdHJfdCBWLCB1aW50cHRyX3QuLi4gVnM+CisgIHN0cnVjdCBNaW4gOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PAorICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCwgKFYgPCBNaW48VnMuLi4+Ojp2YWx1ZSA/IFYgOiBNaW48VnMuLi4+Ojp2YWx1ZSk+IHsKKyAgfTsKKyAgdGVtcGxhdGUgPHVpbnRwdHJfdCBWPgorICBzdHJ1Y3QgTWluPFY+IDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDx1aW50cHRyX3QsIFY+IHt9OworICBlbnVtIHsgTnVtVGFnQml0cyA9IE1pbjxNZW1iZXJUczo6VHJhaXRzVDo6TnVtTG93Qml0c0F2YWlsYWJsZS4uLj46OnZhbHVlIH07CisKKyAgLy8gQWxzbyBjb21wdXRlIHRoZSBzbWFsbGVzdCBkaXNjcmltaW5hbnQgYW5kIHZhcmlvdXMgbWFza3MgZm9yIGNvbnZlbmllbmNlLgorICBlbnVtIDogdWludDY0X3QgeworICAgIE1pblRhZyA9IE1pbjxNZW1iZXJUczo6VGFnLi4uPjo6dmFsdWUsCisgICAgUG9pbnRlck1hc2sgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oLTEpIDw8IE51bVRhZ0JpdHMsCisgICAgVGFnTWFzayA9IH5Qb2ludGVyTWFzaworICB9OworCisgIC8vIEZpbmFsbHkgd2UgbmVlZCBhIHJlY3Vyc2l2ZSB0ZW1wbGF0ZSB0byBkbyBzdGF0aWMgY2hlY2tzIG9mIGVhY2gKKyAgLy8gbWVtYmVyLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWVtYmVyVCwgdHlwZW5hbWUuLi4gSW5uZXJNZW1iZXJUcz4KKyAgc3RydWN0IENoZWNrZXIgOiBDaGVja2VyPElubmVyTWVtYmVyVHMuLi4+IHsKKyAgICBzdGF0aWNfYXNzZXJ0KE1lbWJlclQ6OlRhZyA8ICgxIDw8IE51bVRhZ0JpdHMpLAorICAgICAgICAgICAgICAgICAgIlRoaXMgZGlzY3JpbWluYW50IHZhbHVlIHJlcXVpcmVzIHRvbyBtYW55IGJpdHMhIik7CisgIH07CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNZW1iZXJUPiBzdHJ1Y3QgQ2hlY2tlcjxNZW1iZXJUPiA6IHN0ZDo6dHJ1ZV90eXBlIHsKKyAgICBzdGF0aWNfYXNzZXJ0KE1lbWJlclQ6OlRhZyA8ICgxIDw8IE51bVRhZ0JpdHMpLAorICAgICAgICAgICAgICAgICAgIlRoaXMgZGlzY3JpbWluYW50IHZhbHVlIHJlcXVpcmVzIHRvbyBtYW55IGJpdHMhIik7CisgIH07CisgIHN0YXRpY19hc3NlcnQoQ2hlY2tlcjxNZW1iZXJUcy4uLj46OnZhbHVlLAorICAgICAgICAgICAgICAgICJFYWNoIG1lbWJlciBtdXN0IHBhc3MgdGhlIGNoZWNrZXIuIik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKKy8vIFRlYWNoIERlbnNlTWFwIGhvdyB0byB1c2UgUG9pbnRlclN1bVR5cGVzIGFzIGtleXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGFnVCwgdHlwZW5hbWUuLi4gTWVtYmVyVHM+CitzdHJ1Y3QgRGVuc2VNYXBJbmZvPFBvaW50ZXJTdW1UeXBlPFRhZ1QsIE1lbWJlclRzLi4uPj4geworICB1c2luZyBTdW1UeXBlID0gUG9pbnRlclN1bVR5cGU8VGFnVCwgTWVtYmVyVHMuLi4+OworICB1c2luZyBIZWxwZXJUID0gZGV0YWlsOjpQb2ludGVyU3VtVHlwZUhlbHBlcjxUYWdULCBNZW1iZXJUcy4uLj47CisgIGVudW0geyBTb21lVGFnID0gSGVscGVyVDo6TWluVGFnIH07CisgIHVzaW5nIFNvbWVQb2ludGVyVCA9CisgICAgICB0eXBlbmFtZSBIZWxwZXJUOjp0ZW1wbGF0ZSBMb29rdXA8SGVscGVyVDo6TWluVGFnPjo6UG9pbnRlclQ7CisgIHVzaW5nIFNvbWVQb2ludGVySW5mbyA9IERlbnNlTWFwSW5mbzxTb21lUG9pbnRlclQ+OworCisgIHN0YXRpYyBpbmxpbmUgU3VtVHlwZSBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gU3VtVHlwZTo6Y3JlYXRlPFNvbWVUYWc+KFNvbWVQb2ludGVySW5mbzo6Z2V0RW1wdHlLZXkoKSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIFN1bVR5cGUgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiBTdW1UeXBlOjpjcmVhdGU8U29tZVRhZz4oU29tZVBvaW50ZXJJbmZvOjpnZXRUb21ic3RvbmVLZXkoKSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IFN1bVR5cGUgJkFyZykgeworICAgIHVpbnRwdHJfdCBPcGFxdWVWYWx1ZSA9IEFyZy5nZXRPcGFxdWVWYWx1ZSgpOworICAgIHJldHVybiBEZW5zZU1hcEluZm88dWludHB0cl90Pjo6Z2V0SGFzaFZhbHVlKE9wYXF1ZVZhbHVlKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgU3VtVHlwZSAmTEhTLCBjb25zdCBTdW1UeXBlICZSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1BPSU5URVJTVU1UWVBFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1BvaW50ZXJVbmlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUG9pbnRlclVuaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1ZTU4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1BvaW50ZXJVbmlvbi5oCkBAIC0wLDAgKzEsNDkxIEBACisvLz09PS0gbGx2bS9BRFQvUG9pbnRlclVuaW9uLmggLSBEaXNjcmltaW5hdGVkIFVuaW9uIG9mIDIgUHRycyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBQb2ludGVyVW5pb24gY2xhc3MsIHdoaWNoIGlzIGEgZGlzY3JpbWluYXRlZCB1bmlvbiBvZgorLy8gcG9pbnRlciB0eXBlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1BPSU5URVJVTklPTl9ICisjZGVmaW5lIExMVk1fQURUX1BPSU5URVJVTklPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Qb2ludGVyTGlrZVR5cGVUcmFpdHMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFBvaW50ZXJVbmlvblR5cGVTZWxlY3RvclJldHVybiB7CisgIHVzaW5nIFJldHVybiA9IFQ7Cit9OworCisvLy8gR2V0IGEgdHlwZSBiYXNlZCBvbiB3aGV0aGVyIHR3byB0eXBlcyBhcmUgdGhlIHNhbWUgb3Igbm90LgorLy8vCisvLy8gRm9yOgorLy8vCisvLy8gXGNvZGUKKy8vLyAgIHVzaW5nIFJldCA9IHR5cGVuYW1lIFBvaW50ZXJVbmlvblR5cGVTZWxlY3RvcjxUMSwgVDIsIEVRLCBORT46OlJldHVybjsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gUmV0IHdpbGwgYmUgRVEgdHlwZSBpZiBUMSBpcyBzYW1lIGFzIFQyIG9yIE5FIHR5cGUgb3RoZXJ3aXNlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgUkVUX0VRLCB0eXBlbmFtZSBSRVRfTkU+CitzdHJ1Y3QgUG9pbnRlclVuaW9uVHlwZVNlbGVjdG9yIHsKKyAgdXNpbmcgUmV0dXJuID0gdHlwZW5hbWUgUG9pbnRlclVuaW9uVHlwZVNlbGVjdG9yUmV0dXJuPFJFVF9ORT46OlJldHVybjsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBSRVRfRVEsIHR5cGVuYW1lIFJFVF9ORT4KK3N0cnVjdCBQb2ludGVyVW5pb25UeXBlU2VsZWN0b3I8VCwgVCwgUkVUX0VRLCBSRVRfTkU+IHsKKyAgdXNpbmcgUmV0dXJuID0gdHlwZW5hbWUgUG9pbnRlclVuaW9uVHlwZVNlbGVjdG9yUmV0dXJuPFJFVF9FUT46OlJldHVybjsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFJFVF9FUSwgdHlwZW5hbWUgUkVUX05FPgorc3RydWN0IFBvaW50ZXJVbmlvblR5cGVTZWxlY3RvclJldHVybjwKKyAgICBQb2ludGVyVW5pb25UeXBlU2VsZWN0b3I8VDEsIFQyLCBSRVRfRVEsIFJFVF9ORT4+IHsKKyAgdXNpbmcgUmV0dXJuID0KKyAgICAgIHR5cGVuYW1lIFBvaW50ZXJVbmlvblR5cGVTZWxlY3RvcjxUMSwgVDIsIFJFVF9FUSwgUkVUX05FPjo6UmV0dXJuOworfTsKKworLy8vIFByb3ZpZGUgUG9pbnRlckxpa2VUeXBlVHJhaXRzIGZvciB2b2lkKiB0aGF0IGlzIHVzZWQgYnkgUG9pbnRlclVuaW9uCisvLy8gZm9yIHRoZSB0d28gdGVtcGxhdGUgYXJndW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIFBUMSwgdHlwZW5hbWUgUFQyPiBjbGFzcyBQb2ludGVyVW5pb25VSW50VHJhaXRzIHsKK3B1YmxpYzoKKyAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKHZvaWQgKlApIHsgcmV0dXJuIFA7IH0KKyAgc3RhdGljIGlubGluZSB2b2lkICpnZXRGcm9tVm9pZFBvaW50ZXIodm9pZCAqUCkgeyByZXR1cm4gUDsgfQorCisgIGVudW0geworICAgIFBUMUJpdHNBdiA9IChpbnQpKFBvaW50ZXJMaWtlVHlwZVRyYWl0czxQVDE+OjpOdW1Mb3dCaXRzQXZhaWxhYmxlKSwKKyAgICBQVDJCaXRzQXYgPSAoaW50KShQb2ludGVyTGlrZVR5cGVUcmFpdHM8UFQyPjo6TnVtTG93Qml0c0F2YWlsYWJsZSksCisgICAgTnVtTG93Qml0c0F2YWlsYWJsZSA9IFBUMUJpdHNBdiA8IFBUMkJpdHNBdiA/IFBUMUJpdHNBdiA6IFBUMkJpdHNBdgorICB9OworfTsKKworLy8vIEEgZGlzY3JpbWluYXRlZCB1bmlvbiBvZiB0d28gcG9pbnRlciB0eXBlcywgd2l0aCB0aGUgZGlzY3JpbWluYXRvciBpbiB0aGUKKy8vLyBsb3cgYml0IG9mIHRoZSBwb2ludGVyLgorLy8vCisvLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBleHRyZW1lbHkgZWZmaWNpZW50IGluIHNwYWNlIGR1ZSB0byBsZXZlcmFnaW5nIHRoZQorLy8vIGxvdyBiaXRzIG9mIHRoZSBwb2ludGVyLCB3aGlsZSBleHBvc2luZyBhIG5hdHVyYWwgYW5kIHR5cGUtc2FmZSBBUEkuCisvLy8KKy8vLyBDb21tb24gdXNlIHBhdHRlcm5zIHdvdWxkIGJlIHNvbWV0aGluZyBsaWtlIHRoaXM6CisvLy8gICAgUG9pbnRlclVuaW9uPGludCosIGZsb2F0Kj4gUDsKKy8vLyAgICBQID0gKGludCopMDsKKy8vLyAgICBwcmludGYoIiVkICVkIiwgUC5pczxpbnQqPigpLCBQLmlzPGZsb2F0Kj4oKSk7ICAvLyBwcmludHMgIjEgMCIKKy8vLyAgICBYID0gUC5nZXQ8aW50Kj4oKTsgICAgIC8vIG9rLgorLy8vICAgIFkgPSBQLmdldDxmbG9hdCo+KCk7ICAgLy8gcnVudGltZSBhc3NlcnRpb24gZmFpbHVyZS4KKy8vLyAgICBaID0gUC5nZXQ8ZG91YmxlKj4oKTsgIC8vIGNvbXBpbGUgdGltZSBmYWlsdXJlLgorLy8vICAgIFAgPSAoZmxvYXQqKTA7CisvLy8gICAgWSA9IFAuZ2V0PGZsb2F0Kj4oKTsgICAvLyBvay4KKy8vLyAgICBYID0gUC5nZXQ8aW50Kj4oKTsgICAgIC8vIHJ1bnRpbWUgYXNzZXJ0aW9uIGZhaWx1cmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUFQxLCB0eXBlbmFtZSBQVDI+IGNsYXNzIFBvaW50ZXJVbmlvbiB7CitwdWJsaWM6CisgIHVzaW5nIFZhbFR5ID0KKyAgICAgIFBvaW50ZXJJbnRQYWlyPHZvaWQgKiwgMSwgYm9vbCwgUG9pbnRlclVuaW9uVUludFRyYWl0czxQVDEsIFBUMj4+OworCitwcml2YXRlOgorICBWYWxUeSBWYWw7CisKKyAgc3RydWN0IElzUFQxIHsKKyAgICBzdGF0aWMgY29uc3QgaW50IE51bSA9IDA7CisgIH07CisgIHN0cnVjdCBJc1BUMiB7CisgICAgc3RhdGljIGNvbnN0IGludCBOdW0gPSAxOworICB9OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFVOSU9OX0RPRVNOVF9DT05UQUlOX1RZUEUge307CisKK3B1YmxpYzoKKyAgUG9pbnRlclVuaW9uKCkgPSBkZWZhdWx0OworICBQb2ludGVyVW5pb24oUFQxIFYpCisgICAgICA6IFZhbChjb25zdF9jYXN0PHZvaWQgKj4oCisgICAgICAgICAgICBQb2ludGVyTGlrZVR5cGVUcmFpdHM8UFQxPjo6Z2V0QXNWb2lkUG9pbnRlcihWKSkpIHt9CisgIFBvaW50ZXJVbmlvbihQVDIgVikKKyAgICAgIDogVmFsKGNvbnN0X2Nhc3Q8dm9pZCAqPihQb2ludGVyTGlrZVR5cGVUcmFpdHM8UFQyPjo6Z2V0QXNWb2lkUG9pbnRlcihWKSksCisgICAgICAgICAgICAxKSB7fQorCisgIC8vLyBUZXN0IGlmIHRoZSBwb2ludGVyIGhlbGQgaW4gdGhlIHVuaW9uIGlzIG51bGwsIHJlZ2FyZGxlc3Mgb2YKKyAgLy8vIHdoaWNoIHR5cGUgaXQgaXMuCisgIGJvb2wgaXNOdWxsKCkgY29uc3QgeworICAgIC8vIENvbnZlcnQgZnJvbSB0aGUgdm9pZCogdG8gb25lIG9mIHRoZSBwb2ludGVyIHR5cGVzLCB0byBtYWtlIHN1cmUgdGhhdAorICAgIC8vIHdlIHJlY3Vyc2l2ZWx5IHN0cmlwIG9mZiBsb3cgYml0cyBpZiB3ZSBoYXZlIGEgbmVzdGVkIFBvaW50ZXJVbmlvbi4KKyAgICByZXR1cm4gIVBvaW50ZXJMaWtlVHlwZVRyYWl0czxQVDE+OjpnZXRGcm9tVm9pZFBvaW50ZXIoVmFsLmdldFBvaW50ZXIoKSk7CisgIH0KKworICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gIWlzTnVsbCgpOyB9CisKKyAgLy8vIFRlc3QgaWYgdGhlIFVuaW9uIGN1cnJlbnRseSBob2xkcyB0aGUgdHlwZSBtYXRjaGluZyBULgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaW50IGlzKCkgY29uc3QgeworICAgIHVzaW5nIFR5ID0gdHlwZW5hbWUgOjpsbHZtOjpQb2ludGVyVW5pb25UeXBlU2VsZWN0b3I8CisgICAgICAgIFBUMSwgVCwgSXNQVDEsCisgICAgICAgIDo6bGx2bTo6UG9pbnRlclVuaW9uVHlwZVNlbGVjdG9yPFBUMiwgVCwgSXNQVDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOSU9OX0RPRVNOVF9DT05UQUlOX1RZUEU8VD4+Pjo6UmV0dXJuOworICAgIGludCBUeU5vID0gVHk6Ok51bTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihWYWwuZ2V0SW50KCkpID09IFR5Tm87CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwb2ludGVyIHR5cGUuCisgIC8vLworICAvLy8gSWYgdGhlIHNwZWNpZmllZCBwb2ludGVyIHR5cGUgaXMgaW5jb3JyZWN0LCBhc3NlcnQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGdldCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXM8VD4oKSAmJiAiSW52YWxpZCBhY2Nlc3NvciBjYWxsZWQiKTsKKyAgICByZXR1cm4gUG9pbnRlckxpa2VUeXBlVHJhaXRzPFQ+OjpnZXRGcm9tVm9pZFBvaW50ZXIoVmFsLmdldFBvaW50ZXIoKSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCBwb2ludGVyIGlmIGl0IGlzIG9mIHRoZSBzcGVjaWZpZWQgcG9pbnRlciB0eXBlLAorICAvLy8gb3RoZXJ3aXNlcyByZXR1cm5zIG51bGwuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGR5bl9jYXN0KCkgY29uc3QgeworICAgIGlmIChpczxUPigpKQorICAgICAgcmV0dXJuIGdldDxUPigpOworICAgIHJldHVybiBUKCk7CisgIH0KKworICAvLy8gSWYgdGhlIHVuaW9uIGlzIHNldCB0byB0aGUgZmlyc3QgcG9pbnRlciB0eXBlIGdldCBhbiBhZGRyZXNzIHBvaW50aW5nIHRvCisgIC8vLyBpdC4KKyAgUFQxIGNvbnN0ICpnZXRBZGRyT2ZQdHIxKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PFBvaW50ZXJVbmlvbiAqPih0aGlzKS0+Z2V0QWRkck9mUHRyMSgpOworICB9CisKKyAgLy8vIElmIHRoZSB1bmlvbiBpcyBzZXQgdG8gdGhlIGZpcnN0IHBvaW50ZXIgdHlwZSBnZXQgYW4gYWRkcmVzcyBwb2ludGluZyB0bworICAvLy8gaXQuCisgIFBUMSAqZ2V0QWRkck9mUHRyMSgpIHsKKyAgICBhc3NlcnQoaXM8UFQxPigpICYmICJWYWwgaXMgbm90IHRoZSBmaXJzdCBwb2ludGVyIik7CisgICAgYXNzZXJ0KAorICAgICAgICBnZXQ8UFQxPigpID09IFZhbC5nZXRQb2ludGVyKCkgJiYKKyAgICAgICAgIkNhbid0IGdldCB0aGUgYWRkcmVzcyBiZWNhdXNlIFBvaW50ZXJMaWtlVHlwZVRyYWl0cyBjaGFuZ2VzIHRoZSBwdHIiKTsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxQVDEgKj4oCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUFQxICo+KFZhbC5nZXRBZGRyT2ZQb2ludGVyKCkpKTsKKyAgfQorCisgIC8vLyBBc3NpZ25tZW50IGZyb20gbnVsbHB0ciB3aGljaCBqdXN0IGNsZWFycyB0aGUgdW5pb24uCisgIGNvbnN0IFBvaW50ZXJVbmlvbiAmb3BlcmF0b3I9KHN0ZDo6bnVsbHB0cl90KSB7CisgICAgVmFsLmluaXRXaXRoUG9pbnRlcihudWxscHRyKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gQXNzaWdubWVudCBvcGVyYXRvcnMgLSBBbGxvdyBhc3NpZ25pbmcgaW50byB0aGlzIHVuaW9uIGZyb20gZWl0aGVyCisgIC8vLyBwb2ludGVyIHR5cGUsIHNldHRpbmcgdGhlIGRpc2NyaW1pbmF0b3IgdG8gcmVtZW1iZXIgd2hhdCBpdCBjYW1lIGZyb20uCisgIGNvbnN0IFBvaW50ZXJVbmlvbiAmb3BlcmF0b3I9KGNvbnN0IFBUMSAmUkhTKSB7CisgICAgVmFsLmluaXRXaXRoUG9pbnRlcigKKyAgICAgICAgY29uc3RfY2FzdDx2b2lkICo+KFBvaW50ZXJMaWtlVHlwZVRyYWl0czxQVDE+OjpnZXRBc1ZvaWRQb2ludGVyKFJIUykpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgY29uc3QgUG9pbnRlclVuaW9uICZvcGVyYXRvcj0oY29uc3QgUFQyICZSSFMpIHsKKyAgICBWYWwuc2V0UG9pbnRlckFuZEludCgKKyAgICAgICAgY29uc3RfY2FzdDx2b2lkICo+KFBvaW50ZXJMaWtlVHlwZVRyYWl0czxQVDI+OjpnZXRBc1ZvaWRQb2ludGVyKFJIUykpLAorICAgICAgICAxKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkICpnZXRPcGFxdWVWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbC5nZXRPcGFxdWVWYWx1ZSgpOyB9CisgIHN0YXRpYyBpbmxpbmUgUG9pbnRlclVuaW9uIGdldEZyb21PcGFxdWVWYWx1ZSh2b2lkICpWUCkgeworICAgIFBvaW50ZXJVbmlvbiBWOworICAgIFYuVmFsID0gVmFsVHk6OmdldEZyb21PcGFxdWVWYWx1ZShWUCk7CisgICAgcmV0dXJuIFY7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBQVDEsIHR5cGVuYW1lIFBUMj4KK2Jvb2wgb3BlcmF0b3I9PShQb2ludGVyVW5pb248UFQxLCBQVDI+IGxocywgUG9pbnRlclVuaW9uPFBUMSwgUFQyPiByaHMpIHsKKyAgcmV0dXJuIGxocy5nZXRPcGFxdWVWYWx1ZSgpID09IHJocy5nZXRPcGFxdWVWYWx1ZSgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUFQxLCB0eXBlbmFtZSBQVDI+Citib29sIG9wZXJhdG9yIT0oUG9pbnRlclVuaW9uPFBUMSwgUFQyPiBsaHMsIFBvaW50ZXJVbmlvbjxQVDEsIFBUMj4gcmhzKSB7CisgIHJldHVybiBsaHMuZ2V0T3BhcXVlVmFsdWUoKSAhPSByaHMuZ2V0T3BhcXVlVmFsdWUoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFBUMSwgdHlwZW5hbWUgUFQyPgorYm9vbCBvcGVyYXRvcjwoUG9pbnRlclVuaW9uPFBUMSwgUFQyPiBsaHMsIFBvaW50ZXJVbmlvbjxQVDEsIFBUMj4gcmhzKSB7CisgIHJldHVybiBsaHMuZ2V0T3BhcXVlVmFsdWUoKSA8IHJocy5nZXRPcGFxdWVWYWx1ZSgpOworfQorCisvLyBUZWFjaCBTbWFsbFB0clNldCB0aGF0IFBvaW50ZXJVbmlvbiBpcyAiYmFzaWNhbGx5IGEgcG9pbnRlciIsIHRoYXQgaGFzCisvLyAjIGxvdyBiaXRzIGF2YWlsYWJsZSA9IG1pbihQVDFiaXRzLFBUMmJpdHMpLTEuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUFQxLCB0eXBlbmFtZSBQVDI+CitzdHJ1Y3QgUG9pbnRlckxpa2VUeXBlVHJhaXRzPFBvaW50ZXJVbmlvbjxQVDEsIFBUMj4+IHsKKyAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKGNvbnN0IFBvaW50ZXJVbmlvbjxQVDEsIFBUMj4gJlApIHsKKyAgICByZXR1cm4gUC5nZXRPcGFxdWVWYWx1ZSgpOworICB9CisKKyAgc3RhdGljIGlubGluZSBQb2ludGVyVW5pb248UFQxLCBQVDI+IGdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7CisgICAgcmV0dXJuIFBvaW50ZXJVbmlvbjxQVDEsIFBUMj46OmdldEZyb21PcGFxdWVWYWx1ZShQKTsKKyAgfQorCisgIC8vIFRoZSBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgYXJlIHRoZSBtaW4gb2YgdGhlIHR3byBwb2ludGVyIHR5cGVzLgorICBlbnVtIHsKKyAgICBOdW1Mb3dCaXRzQXZhaWxhYmxlID0gUG9pbnRlckxpa2VUeXBlVHJhaXRzPAorICAgICAgICB0eXBlbmFtZSBQb2ludGVyVW5pb248UFQxLCBQVDI+OjpWYWxUeT46Ok51bUxvd0JpdHNBdmFpbGFibGUKKyAgfTsKK307CisKKy8vLyBBIHBvaW50ZXIgdW5pb24gb2YgdGhyZWUgcG9pbnRlciB0eXBlcy4gU2VlIGRvY3VtZW50YXRpb24gZm9yIFBvaW50ZXJVbmlvbgorLy8vIGZvciB1c2FnZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQVDEsIHR5cGVuYW1lIFBUMiwgdHlwZW5hbWUgUFQzPiBjbGFzcyBQb2ludGVyVW5pb24zIHsKK3B1YmxpYzoKKyAgdXNpbmcgSW5uZXJVbmlvbiA9IFBvaW50ZXJVbmlvbjxQVDEsIFBUMj47CisgIHVzaW5nIFZhbFR5ID0gUG9pbnRlclVuaW9uPElubmVyVW5pb24sIFBUMz47CisKK3ByaXZhdGU6CisgIFZhbFR5IFZhbDsKKworICBzdHJ1Y3QgSXNJbm5lclVuaW9uIHsKKyAgICBWYWxUeSBWYWw7CisKKyAgICBJc0lubmVyVW5pb24oVmFsVHkgdmFsKSA6IFZhbCh2YWwpIHt9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaW50IGlzKCkgY29uc3QgeworICAgICAgcmV0dXJuIFZhbC50ZW1wbGF0ZSBpczxJbm5lclVuaW9uPigpICYmCisgICAgICAgICAgICAgVmFsLnRlbXBsYXRlIGdldDxJbm5lclVuaW9uPigpLnRlbXBsYXRlIGlzPFQ+KCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgZ2V0KCkgY29uc3QgeworICAgICAgcmV0dXJuIFZhbC50ZW1wbGF0ZSBnZXQ8SW5uZXJVbmlvbj4oKS50ZW1wbGF0ZSBnZXQ8VD4oKTsKKyAgICB9CisgIH07CisKKyAgc3RydWN0IElzUFQzIHsKKyAgICBWYWxUeSBWYWw7CisKKyAgICBJc1BUMyhWYWxUeSB2YWwpIDogVmFsKHZhbCkge30KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBpbnQgaXMoKSBjb25zdCB7IHJldHVybiBWYWwudGVtcGxhdGUgaXM8VD4oKTsgfQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGdldCgpIGNvbnN0IHsgcmV0dXJuIFZhbC50ZW1wbGF0ZSBnZXQ8VD4oKTsgfQorICB9OworCitwdWJsaWM6CisgIFBvaW50ZXJVbmlvbjMoKSA9IGRlZmF1bHQ7CisgIFBvaW50ZXJVbmlvbjMoUFQxIFYpIHsgVmFsID0gSW5uZXJVbmlvbihWKTsgfQorICBQb2ludGVyVW5pb24zKFBUMiBWKSB7IFZhbCA9IElubmVyVW5pb24oVik7IH0KKyAgUG9pbnRlclVuaW9uMyhQVDMgVikgeyBWYWwgPSBWOyB9CisKKyAgLy8vIFRlc3QgaWYgdGhlIHBvaW50ZXIgaGVsZCBpbiB0aGUgdW5pb24gaXMgbnVsbCwgcmVnYXJkbGVzcyBvZgorICAvLy8gd2hpY2ggdHlwZSBpdCBpcy4KKyAgYm9vbCBpc051bGwoKSBjb25zdCB7IHJldHVybiBWYWwuaXNOdWxsKCk7IH0KKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuICFpc051bGwoKTsgfQorCisgIC8vLyBUZXN0IGlmIHRoZSBVbmlvbiBjdXJyZW50bHkgaG9sZHMgdGhlIHR5cGUgbWF0Y2hpbmcgVC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGludCBpcygpIGNvbnN0IHsKKyAgICAvLyBJZiBUIGlzIFBUMS9QVDIgY2hvb3NlIElzSW5uZXJVbmlvbiBvdGhlcndpc2UgY2hvb3NlIElzUFQzLgorICAgIHVzaW5nIFR5ID0gdHlwZW5hbWUgOjpsbHZtOjpQb2ludGVyVW5pb25UeXBlU2VsZWN0b3I8CisgICAgICAgIFBUMSwgVCwgSXNJbm5lclVuaW9uLAorICAgICAgICA6Omxsdm06OlBvaW50ZXJVbmlvblR5cGVTZWxlY3RvcjxQVDIsIFQsIElzSW5uZXJVbmlvbiwgSXNQVDM+Pjo6UmV0dXJuOworICAgIHJldHVybiBUeShWYWwpLnRlbXBsYXRlIGlzPFQ+KCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwb2ludGVyIHR5cGUuCisgIC8vLworICAvLy8gSWYgdGhlIHNwZWNpZmllZCBwb2ludGVyIHR5cGUgaXMgaW5jb3JyZWN0LCBhc3NlcnQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGdldCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXM8VD4oKSAmJiAiSW52YWxpZCBhY2Nlc3NvciBjYWxsZWQiKTsKKyAgICAvLyBJZiBUIGlzIFBUMS9QVDIgY2hvb3NlIElzSW5uZXJVbmlvbiBvdGhlcndpc2UgY2hvb3NlIElzUFQzLgorICAgIHVzaW5nIFR5ID0gdHlwZW5hbWUgOjpsbHZtOjpQb2ludGVyVW5pb25UeXBlU2VsZWN0b3I8CisgICAgICAgIFBUMSwgVCwgSXNJbm5lclVuaW9uLAorICAgICAgICA6Omxsdm06OlBvaW50ZXJVbmlvblR5cGVTZWxlY3RvcjxQVDIsIFQsIElzSW5uZXJVbmlvbiwgSXNQVDM+Pjo6UmV0dXJuOworICAgIHJldHVybiBUeShWYWwpLnRlbXBsYXRlIGdldDxUPigpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGN1cnJlbnQgcG9pbnRlciBpZiBpdCBpcyBvZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgdHlwZSwKKyAgLy8vIG90aGVyd2lzZXMgcmV0dXJucyBudWxsLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBkeW5fY2FzdCgpIGNvbnN0IHsKKyAgICBpZiAoaXM8VD4oKSkKKyAgICAgIHJldHVybiBnZXQ8VD4oKTsKKyAgICByZXR1cm4gVCgpOworICB9CisKKyAgLy8vIEFzc2lnbm1lbnQgZnJvbSBudWxscHRyIHdoaWNoIGp1c3QgY2xlYXJzIHRoZSB1bmlvbi4KKyAgY29uc3QgUG9pbnRlclVuaW9uMyAmb3BlcmF0b3I9KHN0ZDo6bnVsbHB0cl90KSB7CisgICAgVmFsID0gbnVsbHB0cjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gQXNzaWdubWVudCBvcGVyYXRvcnMgLSBBbGxvdyBhc3NpZ25pbmcgaW50byB0aGlzIHVuaW9uIGZyb20gZWl0aGVyCisgIC8vLyBwb2ludGVyIHR5cGUsIHNldHRpbmcgdGhlIGRpc2NyaW1pbmF0b3IgdG8gcmVtZW1iZXIgd2hhdCBpdCBjYW1lIGZyb20uCisgIGNvbnN0IFBvaW50ZXJVbmlvbjMgJm9wZXJhdG9yPShjb25zdCBQVDEgJlJIUykgeworICAgIFZhbCA9IElubmVyVW5pb24oUkhTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgY29uc3QgUG9pbnRlclVuaW9uMyAmb3BlcmF0b3I9KGNvbnN0IFBUMiAmUkhTKSB7CisgICAgVmFsID0gSW5uZXJVbmlvbihSSFMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBjb25zdCBQb2ludGVyVW5pb24zICZvcGVyYXRvcj0oY29uc3QgUFQzICZSSFMpIHsKKyAgICBWYWwgPSBSSFM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCAqZ2V0T3BhcXVlVmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWwuZ2V0T3BhcXVlVmFsdWUoKTsgfQorICBzdGF0aWMgaW5saW5lIFBvaW50ZXJVbmlvbjMgZ2V0RnJvbU9wYXF1ZVZhbHVlKHZvaWQgKlZQKSB7CisgICAgUG9pbnRlclVuaW9uMyBWOworICAgIFYuVmFsID0gVmFsVHk6OmdldEZyb21PcGFxdWVWYWx1ZShWUCk7CisgICAgcmV0dXJuIFY7CisgIH0KK307CisKKy8vIFRlYWNoIFNtYWxsUHRyU2V0IHRoYXQgUG9pbnRlclVuaW9uMyBpcyAiYmFzaWNhbGx5IGEgcG9pbnRlciIsIHRoYXQgaGFzCisvLyAjIGxvdyBiaXRzIGF2YWlsYWJsZSA9IG1pbihQVDFiaXRzLFBUMmJpdHMsUFQyYml0cyktMi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQVDEsIHR5cGVuYW1lIFBUMiwgdHlwZW5hbWUgUFQzPgorc3RydWN0IFBvaW50ZXJMaWtlVHlwZVRyYWl0czxQb2ludGVyVW5pb24zPFBUMSwgUFQyLCBQVDM+PiB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0QXNWb2lkUG9pbnRlcihjb25zdCBQb2ludGVyVW5pb24zPFBUMSwgUFQyLCBQVDM+ICZQKSB7CisgICAgcmV0dXJuIFAuZ2V0T3BhcXVlVmFsdWUoKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgUG9pbnRlclVuaW9uMzxQVDEsIFBUMiwgUFQzPiBnZXRGcm9tVm9pZFBvaW50ZXIodm9pZCAqUCkgeworICAgIHJldHVybiBQb2ludGVyVW5pb24zPFBUMSwgUFQyLCBQVDM+OjpnZXRGcm9tT3BhcXVlVmFsdWUoUCk7CisgIH0KKworICAvLyBUaGUgbnVtYmVyIG9mIGJpdHMgYXZhaWxhYmxlIGFyZSB0aGUgbWluIG9mIHRoZSB0d28gcG9pbnRlciB0eXBlcy4KKyAgZW51bSB7CisgICAgTnVtTG93Qml0c0F2YWlsYWJsZSA9IFBvaW50ZXJMaWtlVHlwZVRyYWl0czwKKyAgICAgICAgdHlwZW5hbWUgUG9pbnRlclVuaW9uMzxQVDEsIFBUMiwgUFQzPjo6VmFsVHk+OjpOdW1Mb3dCaXRzQXZhaWxhYmxlCisgIH07Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUFQxLCB0eXBlbmFtZSBQVDIsIHR5cGVuYW1lIFBUMz4KK2Jvb2wgb3BlcmF0b3I8KFBvaW50ZXJVbmlvbjM8UFQxLCBQVDIsIFBUMz4gbGhzLAorICAgICAgICAgICAgICAgUG9pbnRlclVuaW9uMzxQVDEsIFBUMiwgUFQzPiByaHMpIHsKKyAgcmV0dXJuIGxocy5nZXRPcGFxdWVWYWx1ZSgpIDwgcmhzLmdldE9wYXF1ZVZhbHVlKCk7Cit9CisKKy8vLyBBIHBvaW50ZXIgdW5pb24gb2YgZm91ciBwb2ludGVyIHR5cGVzLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgUG9pbnRlclVuaW9uCisvLy8gZm9yIHVzYWdlLgordGVtcGxhdGUgPHR5cGVuYW1lIFBUMSwgdHlwZW5hbWUgUFQyLCB0eXBlbmFtZSBQVDMsIHR5cGVuYW1lIFBUND4KK2NsYXNzIFBvaW50ZXJVbmlvbjQgeworcHVibGljOgorICB1c2luZyBJbm5lclVuaW9uMSA9IFBvaW50ZXJVbmlvbjxQVDEsIFBUMj47CisgIHVzaW5nIElubmVyVW5pb24yID0gUG9pbnRlclVuaW9uPFBUMywgUFQ0PjsKKyAgdXNpbmcgVmFsVHkgPSBQb2ludGVyVW5pb248SW5uZXJVbmlvbjEsIElubmVyVW5pb24yPjsKKworcHJpdmF0ZToKKyAgVmFsVHkgVmFsOworCitwdWJsaWM6CisgIFBvaW50ZXJVbmlvbjQoKSA9IGRlZmF1bHQ7CisgIFBvaW50ZXJVbmlvbjQoUFQxIFYpIHsgVmFsID0gSW5uZXJVbmlvbjEoVik7IH0KKyAgUG9pbnRlclVuaW9uNChQVDIgVikgeyBWYWwgPSBJbm5lclVuaW9uMShWKTsgfQorICBQb2ludGVyVW5pb240KFBUMyBWKSB7IFZhbCA9IElubmVyVW5pb24yKFYpOyB9CisgIFBvaW50ZXJVbmlvbjQoUFQ0IFYpIHsgVmFsID0gSW5uZXJVbmlvbjIoVik7IH0KKworICAvLy8gVGVzdCBpZiB0aGUgcG9pbnRlciBoZWxkIGluIHRoZSB1bmlvbiBpcyBudWxsLCByZWdhcmRsZXNzIG9mCisgIC8vLyB3aGljaCB0eXBlIGl0IGlzLgorICBib29sIGlzTnVsbCgpIGNvbnN0IHsgcmV0dXJuIFZhbC5pc051bGwoKTsgfQorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gIWlzTnVsbCgpOyB9CisKKyAgLy8vIFRlc3QgaWYgdGhlIFVuaW9uIGN1cnJlbnRseSBob2xkcyB0aGUgdHlwZSBtYXRjaGluZyBULgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaW50IGlzKCkgY29uc3QgeworICAgIC8vIElmIFQgaXMgUFQxL1BUMiBjaG9vc2UgSW5uZXJVbmlvbjEgb3RoZXJ3aXNlIGNob29zZSBJbm5lclVuaW9uMi4KKyAgICB1c2luZyBUeSA9IHR5cGVuYW1lIDo6bGx2bTo6UG9pbnRlclVuaW9uVHlwZVNlbGVjdG9yPAorICAgICAgICBQVDEsIFQsIElubmVyVW5pb24xLAorICAgICAgICA6Omxsdm06OlBvaW50ZXJVbmlvblR5cGVTZWxlY3RvcjxQVDIsIFQsIElubmVyVW5pb24xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbm5lclVuaW9uMj4+OjpSZXR1cm47CisgICAgcmV0dXJuIFZhbC50ZW1wbGF0ZSBpczxUeT4oKSAmJiBWYWwudGVtcGxhdGUgZ2V0PFR5PigpLnRlbXBsYXRlIGlzPFQ+KCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwb2ludGVyIHR5cGUuCisgIC8vLworICAvLy8gSWYgdGhlIHNwZWNpZmllZCBwb2ludGVyIHR5cGUgaXMgaW5jb3JyZWN0LCBhc3NlcnQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGdldCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXM8VD4oKSAmJiAiSW52YWxpZCBhY2Nlc3NvciBjYWxsZWQiKTsKKyAgICAvLyBJZiBUIGlzIFBUMS9QVDIgY2hvb3NlIElubmVyVW5pb24xIG90aGVyd2lzZSBjaG9vc2UgSW5uZXJVbmlvbjIuCisgICAgdXNpbmcgVHkgPSB0eXBlbmFtZSA6Omxsdm06OlBvaW50ZXJVbmlvblR5cGVTZWxlY3RvcjwKKyAgICAgICAgUFQxLCBULCBJbm5lclVuaW9uMSwKKyAgICAgICAgOjpsbHZtOjpQb2ludGVyVW5pb25UeXBlU2VsZWN0b3I8UFQyLCBULCBJbm5lclVuaW9uMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5uZXJVbmlvbjI+Pjo6UmV0dXJuOworICAgIHJldHVybiBWYWwudGVtcGxhdGUgZ2V0PFR5PigpLnRlbXBsYXRlIGdldDxUPigpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGN1cnJlbnQgcG9pbnRlciBpZiBpdCBpcyBvZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgdHlwZSwKKyAgLy8vIG90aGVyd2lzZXMgcmV0dXJucyBudWxsLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBkeW5fY2FzdCgpIGNvbnN0IHsKKyAgICBpZiAoaXM8VD4oKSkKKyAgICAgIHJldHVybiBnZXQ8VD4oKTsKKyAgICByZXR1cm4gVCgpOworICB9CisKKyAgLy8vIEFzc2lnbm1lbnQgZnJvbSBudWxscHRyIHdoaWNoIGp1c3QgY2xlYXJzIHRoZSB1bmlvbi4KKyAgY29uc3QgUG9pbnRlclVuaW9uNCAmb3BlcmF0b3I9KHN0ZDo6bnVsbHB0cl90KSB7CisgICAgVmFsID0gbnVsbHB0cjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gQXNzaWdubWVudCBvcGVyYXRvcnMgLSBBbGxvdyBhc3NpZ25pbmcgaW50byB0aGlzIHVuaW9uIGZyb20gZWl0aGVyCisgIC8vLyBwb2ludGVyIHR5cGUsIHNldHRpbmcgdGhlIGRpc2NyaW1pbmF0b3IgdG8gcmVtZW1iZXIgd2hhdCBpdCBjYW1lIGZyb20uCisgIGNvbnN0IFBvaW50ZXJVbmlvbjQgJm9wZXJhdG9yPShjb25zdCBQVDEgJlJIUykgeworICAgIFZhbCA9IElubmVyVW5pb24xKFJIUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGNvbnN0IFBvaW50ZXJVbmlvbjQgJm9wZXJhdG9yPShjb25zdCBQVDIgJlJIUykgeworICAgIFZhbCA9IElubmVyVW5pb24xKFJIUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGNvbnN0IFBvaW50ZXJVbmlvbjQgJm9wZXJhdG9yPShjb25zdCBQVDMgJlJIUykgeworICAgIFZhbCA9IElubmVyVW5pb24yKFJIUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGNvbnN0IFBvaW50ZXJVbmlvbjQgJm9wZXJhdG9yPShjb25zdCBQVDQgJlJIUykgeworICAgIFZhbCA9IElubmVyVW5pb24yKFJIUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCAqZ2V0T3BhcXVlVmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWwuZ2V0T3BhcXVlVmFsdWUoKTsgfQorICBzdGF0aWMgaW5saW5lIFBvaW50ZXJVbmlvbjQgZ2V0RnJvbU9wYXF1ZVZhbHVlKHZvaWQgKlZQKSB7CisgICAgUG9pbnRlclVuaW9uNCBWOworICAgIFYuVmFsID0gVmFsVHk6OmdldEZyb21PcGFxdWVWYWx1ZShWUCk7CisgICAgcmV0dXJuIFY7CisgIH0KK307CisKKy8vIFRlYWNoIFNtYWxsUHRyU2V0IHRoYXQgUG9pbnRlclVuaW9uNCBpcyAiYmFzaWNhbGx5IGEgcG9pbnRlciIsIHRoYXQgaGFzCisvLyAjIGxvdyBiaXRzIGF2YWlsYWJsZSA9IG1pbihQVDFiaXRzLFBUMmJpdHMsUFQyYml0cyktMi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQVDEsIHR5cGVuYW1lIFBUMiwgdHlwZW5hbWUgUFQzLCB0eXBlbmFtZSBQVDQ+CitzdHJ1Y3QgUG9pbnRlckxpa2VUeXBlVHJhaXRzPFBvaW50ZXJVbmlvbjQ8UFQxLCBQVDIsIFBUMywgUFQ0Pj4geworICBzdGF0aWMgaW5saW5lIHZvaWQgKgorICBnZXRBc1ZvaWRQb2ludGVyKGNvbnN0IFBvaW50ZXJVbmlvbjQ8UFQxLCBQVDIsIFBUMywgUFQ0PiAmUCkgeworICAgIHJldHVybiBQLmdldE9wYXF1ZVZhbHVlKCk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIFBvaW50ZXJVbmlvbjQ8UFQxLCBQVDIsIFBUMywgUFQ0PiBnZXRGcm9tVm9pZFBvaW50ZXIodm9pZCAqUCkgeworICAgIHJldHVybiBQb2ludGVyVW5pb240PFBUMSwgUFQyLCBQVDMsIFBUND46OmdldEZyb21PcGFxdWVWYWx1ZShQKTsKKyAgfQorCisgIC8vIFRoZSBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgYXJlIHRoZSBtaW4gb2YgdGhlIHR3byBwb2ludGVyIHR5cGVzLgorICBlbnVtIHsKKyAgICBOdW1Mb3dCaXRzQXZhaWxhYmxlID0gUG9pbnRlckxpa2VUeXBlVHJhaXRzPAorICAgICAgICB0eXBlbmFtZSBQb2ludGVyVW5pb240PFBUMSwgUFQyLCBQVDMsIFBUND46OlZhbFR5Pjo6TnVtTG93Qml0c0F2YWlsYWJsZQorICB9OworfTsKKworLy8gVGVhY2ggRGVuc2VNYXAgaG93IHRvIHVzZSBQb2ludGVyVW5pb25zIGFzIGtleXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4gc3RydWN0IERlbnNlTWFwSW5mbzxQb2ludGVyVW5pb248VCwgVT4+IHsKKyAgdXNpbmcgUGFpciA9IFBvaW50ZXJVbmlvbjxULCBVPjsKKyAgdXNpbmcgRmlyc3RJbmZvID0gRGVuc2VNYXBJbmZvPFQ+OworICB1c2luZyBTZWNvbmRJbmZvID0gRGVuc2VNYXBJbmZvPFU+OworCisgIHN0YXRpYyBpbmxpbmUgUGFpciBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIFBhaXIoRmlyc3RJbmZvOjpnZXRFbXB0eUtleSgpKTsgfQorCisgIHN0YXRpYyBpbmxpbmUgUGFpciBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgcmV0dXJuIFBhaXIoRmlyc3RJbmZvOjpnZXRUb21ic3RvbmVLZXkoKSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IFBhaXIgJlBhaXJWYWwpIHsKKyAgICBpbnRwdHJfdCBrZXkgPSAoaW50cHRyX3QpUGFpclZhbC5nZXRPcGFxdWVWYWx1ZSgpOworICAgIHJldHVybiBEZW5zZU1hcEluZm88aW50cHRyX3Q+OjpnZXRIYXNoVmFsdWUoa2V5KTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgUGFpciAmTEhTLCBjb25zdCBQYWlyICZSSFMpIHsKKyAgICByZXR1cm4gTEhTLnRlbXBsYXRlIGlzPFQ+KCkgPT0gUkhTLnRlbXBsYXRlIGlzPFQ+KCkgJiYKKyAgICAgICAgICAgKExIUy50ZW1wbGF0ZSBpczxUPigpID8gRmlyc3RJbmZvOjppc0VxdWFsKExIUy50ZW1wbGF0ZSBnZXQ8VD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIUy50ZW1wbGF0ZSBnZXQ8VD4oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU2Vjb25kSW5mbzo6aXNFcXVhbChMSFMudGVtcGxhdGUgZ2V0PFU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTLnRlbXBsYXRlIGdldDxVPigpKSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9QT0lOVEVSVU5JT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUG9zdE9yZGVySXRlcmF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1Bvc3RPcmRlckl0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM4YTliNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1Bvc3RPcmRlckl0ZXJhdG9yLmgKQEAgLTAsMCArMSwzMDkgQEAKKy8vPT09LSBsbHZtL0FEVC9Qb3N0T3JkZXJJdGVyYXRvci5oIC0gUG9zdE9yZGVyIGl0ZXJhdG9yIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGJ1aWxkcyBvbiB0aGUgQURUL0dyYXBoVHJhaXRzLmggZmlsZSB0byBidWlsZCBhIGdlbmVyaWMgZ3JhcGgKKy8vIHBvc3Qgb3JkZXIgaXRlcmF0b3IuICBUaGlzIHNob3VsZCB3b3JrIG92ZXIgYW55IGdyYXBoIHR5cGUgdGhhdCBoYXMgYQorLy8gR3JhcGhUcmFpdHMgc3BlY2lhbGl6YXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9QT1NUT1JERVJJVEVSQVRPUl9ICisjZGVmaW5lIExMVk1fQURUX1BPU1RPUkRFUklURVJBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vIFRoZSBwb19pdGVyYXRvcl9zdG9yYWdlIHRlbXBsYXRlIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgc2V0IG9mIGFscmVhZHkKKy8vIHZpc2l0ZWQgbm9kZXMgZHVyaW5nIHRoZSBwb19pdGVyYXRvcidzIGRlcHRoLWZpcnN0IHRyYXZlcnNhbC4KKy8vCisvLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgY29udGFpbnMgYSBzZXQgb2YgdmlzaXRlZCBub2Rlcywgd2hpbGUKKy8vIHRoZSBFeHRlcm5hbD10cnVlIHZlcnNpb24gdXNlcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzZXQuCisvLworLy8gSXQgaXMgcG9zc2libGUgdG8gcHJ1bmUgdGhlIGRlcHRoLWZpcnN0IHRyYXZlcnNhbCBpbiBzZXZlcmFsIHdheXM6CisvLworLy8gLSBXaGVuIHByb3ZpZGluZyBhbiBleHRlcm5hbCBzZXQgdGhhdCBhbHJlYWR5IGNvbnRhaW5zIHNvbWUgZ3JhcGggbm9kZXMsCisvLyAgIHRob3NlIG5vZGVzIHdvbid0IGJlIHZpc2l0ZWQgYWdhaW4uIFRoaXMgaXMgdXNlZnVsIGZvciByZXN0YXJ0aW5nIGEKKy8vICAgcG9zdC1vcmRlciB0cmF2ZXJzYWwgb24gYSBncmFwaCB3aXRoIG5vZGVzIHRoYXQgYXJlbid0IGRvbWluYXRlZCBieSBhCisvLyAgIHNpbmdsZSBub2RlLgorLy8KKy8vIC0gQnkgcHJvdmlkaW5nIGEgY3VzdG9tIFNldFR5cGUgY2xhc3MsIHVud2FudGVkIGdyYXBoIG5vZGVzIGNhbiBiZSBleGNsdWRlZAorLy8gICBieSBoYXZpbmcgdGhlIGluc2VydCgpIGZ1bmN0aW9uIHJldHVybiBmYWxzZS4gVGhpcyBjb3VsZCBmb3IgZXhhbXBsZQorLy8gICBjb25maW5lIGEgQ0ZHIHRyYXZlcnNhbCB0byBibG9ja3MgaW4gYSBzcGVjaWZpYyBsb29wLgorLy8KKy8vIC0gRmluYWxseSwgYnkgc3BlY2lhbGl6aW5nIHRoZSBwb19pdGVyYXRvcl9zdG9yYWdlIHRlbXBsYXRlIGl0c2VsZiwgZ3JhcGgKKy8vICAgZWRnZXMgY2FuIGJlIHBydW5lZCBieSByZXR1cm5pbmcgZmFsc2UgaW4gdGhlIGluc2VydEVkZ2UoKSBmdW5jdGlvbi4gVGhpcworLy8gICBjb3VsZCBiZSB1c2VkIHRvIHJlbW92ZSBsb29wIGJhY2stZWRnZXMgZnJvbSB0aGUgQ0ZHIHNlZW4gYnkgcG9faXRlcmF0b3IuCisvLworLy8gQSBzcGVjaWFsaXplZCBwb19pdGVyYXRvcl9zdG9yYWdlIGNsYXNzIGNhbiBvYnNlcnZlIGJvdGggdGhlIHByZS1vcmRlciBhbmQKKy8vIHRoZSBwb3N0LW9yZGVyLiBUaGUgaW5zZXJ0RWRnZSgpIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBhIHByZS1vcmRlciwgd2hpbGUKKy8vIHRoZSBmaW5pc2hQb3N0b3JkZXIoKSBmdW5jdGlvbiBpcyBjYWxsZWQganVzdCBiZWZvcmUgdGhlIHBvX2l0ZXJhdG9yIG1vdmVzCisvLyBvbiB0byB0aGUgbmV4dCBub2RlLgorCisvLy8gRGVmYXVsdCBwb19pdGVyYXRvcl9zdG9yYWdlIGltcGxlbWVudGF0aW9uIHdpdGggYW4gaW50ZXJuYWwgc2V0IG9iamVjdC4KK3RlbXBsYXRlPGNsYXNzIFNldFR5cGUsIGJvb2wgRXh0ZXJuYWw+CitjbGFzcyBwb19pdGVyYXRvcl9zdG9yYWdlIHsKKyAgU2V0VHlwZSBWaXNpdGVkOworCitwdWJsaWM6CisgIC8vIFJldHVybiB0cnVlIGlmIGVkZ2UgZGVzdGluYXRpb24gc2hvdWxkIGJlIHZpc2l0ZWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBOb2RlUmVmPgorICBib29sIGluc2VydEVkZ2UoT3B0aW9uYWw8Tm9kZVJlZj4gRnJvbSwgTm9kZVJlZiBUbykgeworICAgIHJldHVybiBWaXNpdGVkLmluc2VydChUbykuc2Vjb25kOworICB9CisKKyAgLy8gQ2FsbGVkIGFmdGVyIGFsbCBjaGlsZHJlbiBvZiBCQiBoYXZlIGJlZW4gdmlzaXRlZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVSZWY+IHZvaWQgZmluaXNoUG9zdG9yZGVyKE5vZGVSZWYgQkIpIHt9Cit9OworCisvLy8gU3BlY2lhbGl6YXRpb24gb2YgcG9faXRlcmF0b3Jfc3RvcmFnZSB0aGF0IHJlZmVyZW5jZXMgYW4gZXh0ZXJuYWwgc2V0LgordGVtcGxhdGU8Y2xhc3MgU2V0VHlwZT4KK2NsYXNzIHBvX2l0ZXJhdG9yX3N0b3JhZ2U8U2V0VHlwZSwgdHJ1ZT4geworICBTZXRUeXBlICZWaXNpdGVkOworCitwdWJsaWM6CisgIHBvX2l0ZXJhdG9yX3N0b3JhZ2UoU2V0VHlwZSAmVlNldCkgOiBWaXNpdGVkKFZTZXQpIHt9CisgIHBvX2l0ZXJhdG9yX3N0b3JhZ2UoY29uc3QgcG9faXRlcmF0b3Jfc3RvcmFnZSAmUykgOiBWaXNpdGVkKFMuVmlzaXRlZCkge30KKworICAvLyBSZXR1cm4gdHJ1ZSBpZiBlZGdlIGRlc3RpbmF0aW9uIHNob3VsZCBiZSB2aXNpdGVkLCBjYWxsZWQgd2l0aCBGcm9tID0gMCBmb3IKKyAgLy8gdGhlIHJvb3Qgbm9kZS4KKyAgLy8gR3JhcGggZWRnZXMgY2FuIGJlIHBydW5lZCBieSBzcGVjaWFsaXppbmcgdGhpcyBmdW5jdGlvbi4KKyAgdGVtcGxhdGUgPGNsYXNzIE5vZGVSZWY+IGJvb2wgaW5zZXJ0RWRnZShPcHRpb25hbDxOb2RlUmVmPiBGcm9tLCBOb2RlUmVmIFRvKSB7CisgICAgcmV0dXJuIFZpc2l0ZWQuaW5zZXJ0KFRvKS5zZWNvbmQ7CisgIH0KKworICAvLyBDYWxsZWQgYWZ0ZXIgYWxsIGNoaWxkcmVuIG9mIEJCIGhhdmUgYmVlbiB2aXNpdGVkLgorICB0ZW1wbGF0ZSA8Y2xhc3MgTm9kZVJlZj4gdm9pZCBmaW5pc2hQb3N0b3JkZXIoTm9kZVJlZiBCQikge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBHcmFwaFQsCisgICAgICAgICAgY2xhc3MgU2V0VHlwZSA9CisgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PHR5cGVuYW1lIEdyYXBoVHJhaXRzPEdyYXBoVD46Ok5vZGVSZWYsIDg+LAorICAgICAgICAgIGJvb2wgRXh0U3RvcmFnZSA9IGZhbHNlLCBjbGFzcyBHVCA9IEdyYXBoVHJhaXRzPEdyYXBoVD4+CitjbGFzcyBwb19pdGVyYXRvcgorICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgdHlwZW5hbWUgR1Q6Ok5vZGVSZWY+LAorICAgICAgcHVibGljIHBvX2l0ZXJhdG9yX3N0b3JhZ2U8U2V0VHlwZSwgRXh0U3RvcmFnZT4geworICB1c2luZyBzdXBlciA9IHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgdHlwZW5hbWUgR1Q6Ok5vZGVSZWY+OworICB1c2luZyBOb2RlUmVmID0gdHlwZW5hbWUgR1Q6Ok5vZGVSZWY7CisgIHVzaW5nIENoaWxkSXRUeSA9IHR5cGVuYW1lIEdUOjpDaGlsZEl0ZXJhdG9yVHlwZTsKKworICAvLyBWaXNpdFN0YWNrIC0gVXNlZCB0byBtYWludGFpbiB0aGUgb3JkZXJpbmcuICBUb3AgPSBjdXJyZW50IGJsb2NrCisgIC8vIEZpcnN0IGVsZW1lbnQgaXMgYmFzaWMgYmxvY2sgcG9pbnRlciwgc2Vjb25kIGlzIHRoZSAnbmV4dCBjaGlsZCcgdG8gdmlzaXQKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPE5vZGVSZWYsIENoaWxkSXRUeT4+IFZpc2l0U3RhY2s7CisKKyAgcG9faXRlcmF0b3IoTm9kZVJlZiBCQikgeworICAgIHRoaXMtPmluc2VydEVkZ2UoT3B0aW9uYWw8Tm9kZVJlZj4oKSwgQkIpOworICAgIFZpc2l0U3RhY2sucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEJCLCBHVDo6Y2hpbGRfYmVnaW4oQkIpKSk7CisgICAgdHJhdmVyc2VDaGlsZCgpOworICB9CisKKyAgcG9faXRlcmF0b3IoKSA9IGRlZmF1bHQ7IC8vIEVuZCBpcyB3aGVuIHN0YWNrIGlzIGVtcHR5LgorCisgIHBvX2l0ZXJhdG9yKE5vZGVSZWYgQkIsIFNldFR5cGUgJlMpCisgICAgICA6IHBvX2l0ZXJhdG9yX3N0b3JhZ2U8U2V0VHlwZSwgRXh0U3RvcmFnZT4oUykgeworICAgIGlmICh0aGlzLT5pbnNlcnRFZGdlKE9wdGlvbmFsPE5vZGVSZWY+KCksIEJCKSkgeworICAgICAgVmlzaXRTdGFjay5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoQkIsIEdUOjpjaGlsZF9iZWdpbihCQikpKTsKKyAgICAgIHRyYXZlcnNlQ2hpbGQoKTsKKyAgICB9CisgIH0KKworICBwb19pdGVyYXRvcihTZXRUeXBlICZTKQorICAgICAgOiBwb19pdGVyYXRvcl9zdG9yYWdlPFNldFR5cGUsIEV4dFN0b3JhZ2U+KFMpIHsKKyAgfSAvLyBFbmQgaXMgd2hlbiBzdGFjayBpcyBlbXB0eS4KKworICB2b2lkIHRyYXZlcnNlQ2hpbGQoKSB7CisgICAgd2hpbGUgKFZpc2l0U3RhY2suYmFjaygpLnNlY29uZCAhPSBHVDo6Y2hpbGRfZW5kKFZpc2l0U3RhY2suYmFjaygpLmZpcnN0KSkgeworICAgICAgTm9kZVJlZiBCQiA9ICpWaXNpdFN0YWNrLmJhY2soKS5zZWNvbmQrKzsKKyAgICAgIGlmICh0aGlzLT5pbnNlcnRFZGdlKE9wdGlvbmFsPE5vZGVSZWY+KFZpc2l0U3RhY2suYmFjaygpLmZpcnN0KSwgQkIpKSB7CisgICAgICAgIC8vIElmIHRoZSBibG9jayBpcyBub3QgdmlzaXRlZC4uLgorICAgICAgICBWaXNpdFN0YWNrLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihCQiwgR1Q6OmNoaWxkX2JlZ2luKEJCKSkpOworICAgICAgfQorICAgIH0KKyAgfQorCitwdWJsaWM6CisgIHVzaW5nIHBvaW50ZXIgPSB0eXBlbmFtZSBzdXBlcjo6cG9pbnRlcjsKKworICAvLyBQcm92aWRlIHN0YXRpYyAiY29uc3RydWN0b3JzIi4uLgorICBzdGF0aWMgcG9faXRlcmF0b3IgYmVnaW4oR3JhcGhUIEcpIHsKKyAgICByZXR1cm4gcG9faXRlcmF0b3IoR1Q6OmdldEVudHJ5Tm9kZShHKSk7CisgIH0KKyAgc3RhdGljIHBvX2l0ZXJhdG9yIGVuZChHcmFwaFQgRykgeyByZXR1cm4gcG9faXRlcmF0b3IoKTsgfQorCisgIHN0YXRpYyBwb19pdGVyYXRvciBiZWdpbihHcmFwaFQgRywgU2V0VHlwZSAmUykgeworICAgIHJldHVybiBwb19pdGVyYXRvcihHVDo6Z2V0RW50cnlOb2RlKEcpLCBTKTsKKyAgfQorICBzdGF0aWMgcG9faXRlcmF0b3IgZW5kKEdyYXBoVCBHLCBTZXRUeXBlICZTKSB7IHJldHVybiBwb19pdGVyYXRvcihTKTsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwb19pdGVyYXRvciAmeCkgY29uc3QgeworICAgIHJldHVybiBWaXNpdFN0YWNrID09IHguVmlzaXRTdGFjazsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgcG9faXRlcmF0b3IgJngpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0geCk7IH0KKworICBjb25zdCBOb2RlUmVmICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBWaXNpdFN0YWNrLmJhY2soKS5maXJzdDsgfQorCisgIC8vIFRoaXMgaXMgYSBub25zdGFuZGFyZCBvcGVyYXRvci0+IHRoYXQgZGVyZWZlcmVuY2VzIHRoZSBwb2ludGVyIGFuIGV4dHJhCisgIC8vIHRpbWUuLi4gc28gdGhhdCB5b3UgY2FuIGFjdHVhbGx5IGNhbGwgbWV0aG9kcyBPTiB0aGUgQmFzaWNCbG9jaywgYmVjYXVzZQorICAvLyB0aGUgY29udGFpbmVkIHR5cGUgaXMgYSBwb2ludGVyLiAgVGhpcyBhbGxvd3MgQkJJdC0+Z2V0VGVybWluYXRvcigpIGYuZS4KKyAgLy8KKyAgTm9kZVJlZiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gKip0aGlzOyB9CisKKyAgcG9faXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7IC8vIFByZWluY3JlbWVudAorICAgIHRoaXMtPmZpbmlzaFBvc3RvcmRlcihWaXNpdFN0YWNrLmJhY2soKS5maXJzdCk7CisgICAgVmlzaXRTdGFjay5wb3BfYmFjaygpOworICAgIGlmICghVmlzaXRTdGFjay5lbXB0eSgpKQorICAgICAgdHJhdmVyc2VDaGlsZCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHBvX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7IC8vIFBvc3RpbmNyZW1lbnQKKyAgICBwb19pdGVyYXRvciB0bXAgPSAqdGhpczsKKyAgICArKyp0aGlzOworICAgIHJldHVybiB0bXA7CisgIH0KK307CisKKy8vIFByb3ZpZGUgZ2xvYmFsIGNvbnN0cnVjdG9ycyB0aGF0IGF1dG9tYXRpY2FsbHkgZmlndXJlIG91dCBjb3JyZWN0IHR5cGVzLi4uCisvLwordGVtcGxhdGUgPGNsYXNzIFQ+Citwb19pdGVyYXRvcjxUPiBwb19iZWdpbihjb25zdCBUICZHKSB7IHJldHVybiBwb19pdGVyYXRvcjxUPjo6YmVnaW4oRyk7IH0KK3RlbXBsYXRlIDxjbGFzcyBUPgorcG9faXRlcmF0b3I8VD4gcG9fZW5kICAoY29uc3QgVCAmRykgeyByZXR1cm4gcG9faXRlcmF0b3I8VD46OmVuZChHKTsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gaXRlcmF0b3JfcmFuZ2U8cG9faXRlcmF0b3I8VD4+IHBvc3Rfb3JkZXIoY29uc3QgVCAmRykgeworICByZXR1cm4gbWFrZV9yYW5nZShwb19iZWdpbihHKSwgcG9fZW5kKEcpKTsKK30KKworLy8gUHJvdmlkZSBnbG9iYWwgZGVmaW5pdGlvbnMgb2YgZXh0ZXJuYWwgcG9zdG9yZGVyIGl0ZXJhdG9ycy4uLgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFNldFR5cGUgPSBzdGQ6OnNldDx0eXBlbmFtZSBHcmFwaFRyYWl0czxUPjo6Tm9kZVJlZj4+CitzdHJ1Y3QgcG9fZXh0X2l0ZXJhdG9yIDogcHVibGljIHBvX2l0ZXJhdG9yPFQsIFNldFR5cGUsIHRydWU+IHsKKyAgcG9fZXh0X2l0ZXJhdG9yKGNvbnN0IHBvX2l0ZXJhdG9yPFQsIFNldFR5cGUsIHRydWU+ICZWKSA6CisgIHBvX2l0ZXJhdG9yPFQsIFNldFR5cGUsIHRydWU+KFYpIHt9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBTZXRUeXBlPgorcG9fZXh0X2l0ZXJhdG9yPFQsIFNldFR5cGU+IHBvX2V4dF9iZWdpbihUIEcsIFNldFR5cGUgJlMpIHsKKyAgcmV0dXJuIHBvX2V4dF9pdGVyYXRvcjxULCBTZXRUeXBlPjo6YmVnaW4oRywgUyk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFNldFR5cGU+Citwb19leHRfaXRlcmF0b3I8VCwgU2V0VHlwZT4gcG9fZXh0X2VuZChUIEcsIFNldFR5cGUgJlMpIHsKKyAgcmV0dXJuIHBvX2V4dF9pdGVyYXRvcjxULCBTZXRUeXBlPjo6ZW5kKEcsIFMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgU2V0VHlwZT4KK2l0ZXJhdG9yX3JhbmdlPHBvX2V4dF9pdGVyYXRvcjxULCBTZXRUeXBlPj4gcG9zdF9vcmRlcl9leHQoY29uc3QgVCAmRywgU2V0VHlwZSAmUykgeworICByZXR1cm4gbWFrZV9yYW5nZShwb19leHRfYmVnaW4oRywgUyksIHBvX2V4dF9lbmQoRywgUykpOworfQorCisvLyBQcm92aWRlIGdsb2JhbCBkZWZpbml0aW9ucyBvZiBpbnZlcnNlIHBvc3Qgb3JkZXIgaXRlcmF0b3JzLi4uCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgU2V0VHlwZSA9IHN0ZDo6c2V0PHR5cGVuYW1lIEdyYXBoVHJhaXRzPFQ+OjpOb2RlUmVmPiwKKyAgICAgICAgICBib29sIEV4dGVybmFsID0gZmFsc2U+CitzdHJ1Y3QgaXBvX2l0ZXJhdG9yIDogcHVibGljIHBvX2l0ZXJhdG9yPEludmVyc2U8VD4sIFNldFR5cGUsIEV4dGVybmFsPiB7CisgIGlwb19pdGVyYXRvcihjb25zdCBwb19pdGVyYXRvcjxJbnZlcnNlPFQ+LCBTZXRUeXBlLCBFeHRlcm5hbD4gJlYpIDoKKyAgICAgcG9faXRlcmF0b3I8SW52ZXJzZTxUPiwgU2V0VHlwZSwgRXh0ZXJuYWw+IChWKSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpcG9faXRlcmF0b3I8VD4gaXBvX2JlZ2luKGNvbnN0IFQgJkcpIHsKKyAgcmV0dXJuIGlwb19pdGVyYXRvcjxUPjo6YmVnaW4oRyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraXBvX2l0ZXJhdG9yPFQ+IGlwb19lbmQoY29uc3QgVCAmRyl7CisgIHJldHVybiBpcG9faXRlcmF0b3I8VD46OmVuZChHKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpdGVyYXRvcl9yYW5nZTxpcG9faXRlcmF0b3I8VD4+IGludmVyc2VfcG9zdF9vcmRlcihjb25zdCBUICZHKSB7CisgIHJldHVybiBtYWtlX3JhbmdlKGlwb19iZWdpbihHKSwgaXBvX2VuZChHKSk7Cit9CisKKy8vIFByb3ZpZGUgZ2xvYmFsIGRlZmluaXRpb25zIG9mIGV4dGVybmFsIGludmVyc2UgcG9zdG9yZGVyIGl0ZXJhdG9ycy4uLgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFNldFR5cGUgPSBzdGQ6OnNldDx0eXBlbmFtZSBHcmFwaFRyYWl0czxUPjo6Tm9kZVJlZj4+CitzdHJ1Y3QgaXBvX2V4dF9pdGVyYXRvciA6IHB1YmxpYyBpcG9faXRlcmF0b3I8VCwgU2V0VHlwZSwgdHJ1ZT4geworICBpcG9fZXh0X2l0ZXJhdG9yKGNvbnN0IGlwb19pdGVyYXRvcjxULCBTZXRUeXBlLCB0cnVlPiAmVikgOgorICAgIGlwb19pdGVyYXRvcjxULCBTZXRUeXBlLCB0cnVlPihWKSB7fQorICBpcG9fZXh0X2l0ZXJhdG9yKGNvbnN0IHBvX2l0ZXJhdG9yPEludmVyc2U8VD4sIFNldFR5cGUsIHRydWU+ICZWKSA6CisgICAgaXBvX2l0ZXJhdG9yPFQsIFNldFR5cGUsIHRydWU+KFYpIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgU2V0VHlwZT4KK2lwb19leHRfaXRlcmF0b3I8VCwgU2V0VHlwZT4gaXBvX2V4dF9iZWdpbihjb25zdCBUICZHLCBTZXRUeXBlICZTKSB7CisgIHJldHVybiBpcG9fZXh0X2l0ZXJhdG9yPFQsIFNldFR5cGU+OjpiZWdpbihHLCBTKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFNldFR5cGU+CitpcG9fZXh0X2l0ZXJhdG9yPFQsIFNldFR5cGU+IGlwb19leHRfZW5kKGNvbnN0IFQgJkcsIFNldFR5cGUgJlMpIHsKKyAgcmV0dXJuIGlwb19leHRfaXRlcmF0b3I8VCwgU2V0VHlwZT46OmVuZChHLCBTKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFNldFR5cGU+CitpdGVyYXRvcl9yYW5nZTxpcG9fZXh0X2l0ZXJhdG9yPFQsIFNldFR5cGU+PgoraW52ZXJzZV9wb3N0X29yZGVyX2V4dChjb25zdCBUICZHLCBTZXRUeXBlICZTKSB7CisgIHJldHVybiBtYWtlX3JhbmdlKGlwb19leHRfYmVnaW4oRywgUyksIGlwb19leHRfZW5kKEcsIFMpKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBSZXZlcnNlIFBvc3QgT3JkZXIgQ0ZHIGl0ZXJhdG9yIGNvZGUKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaXMgdXNlZCB0byB2aXNpdCBiYXNpYyBibG9ja3MgaW4gYSBtZXRob2QgaW4gcmV2ZXJzZSBwb3N0IG9yZGVyLiAgVGhpcworLy8gY2xhc3MgaXMgYXdrd2FyZCB0byB1c2UgYmVjYXVzZSBJIGRvbid0IGtub3cgYSBnb29kIGluY3JlbWVudGFsIGFsZ29yaXRobSB0bworLy8gY29tcHV0ZXIgUlBPIGZyb20gYSBncmFwaC4gIEJlY2F1c2Ugb2YgdGhpcywgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUKKy8vIFJldmVyc2VQb3N0T3JkZXJUcmF2ZXJzYWwgb2JqZWN0IGlzIGV4cGVuc2l2ZSAoaXQgbXVzdCB3YWxrIHRoZSBlbnRpcmUgZ3JhcGgKKy8vIHdpdGggYSBwb3N0b3JkZXIgaXRlcmF0b3IgdG8gYnVpbGQgdGhlIGRhdGEgc3RydWN0dXJlcykuICBUaGUgbW9yYWwgb2YgdGhpcworLy8gc3RvcnkgaXM6IERvbid0IGNyZWF0ZSBtb3JlIFJldmVyc2VQb3N0T3JkZXJUcmF2ZXJzYWwgY2xhc3NlcyB0aGFuIG5lY2Vzc2FyeS4KKy8vCisvLyBCZWNhdXNlIGl0IGRvZXMgdGhlIHRyYXZlcnNhbCBpbiBpdHMgY29uc3RydWN0b3IsIGl0IHdvbid0IGludmFsaWRhdGUgd2hlbgorLy8gQmFzaWNCbG9ja3MgYXJlIHJlbW92ZWQsICpidXQqIGl0IG1heSBjb250YWluIGVyYXNlZCBibG9ja3MuIFNvbWUgcGxhY2VzCisvLyByZWx5IG9uIHRoaXMgYmVoYXZpb3IgKGkuZS4gR1ZOKS4KKy8vCisvLyBUaGlzIGNsYXNzIHNob3VsZCBiZSB1c2VkIGxpa2UgdGhpczoKKy8vIHsKKy8vICAgUmV2ZXJzZVBvc3RPcmRlclRyYXZlcnNhbDxGdW5jdGlvbio+IFJQT1QoRnVuY1B0cik7IC8vIEV4cGVuc2l2ZSB0byBjcmVhdGUKKy8vICAgZm9yIChycG9faXRlcmF0b3IgSSA9IFJQT1QuYmVnaW4oKTsgSSAhPSBSUE9ULmVuZCgpOyArK0kpIHsKKy8vICAgICAgLi4uCisvLyAgIH0KKy8vICAgZm9yIChycG9faXRlcmF0b3IgSSA9IFJQT1QuYmVnaW4oKTsgSSAhPSBSUE9ULmVuZCgpOyArK0kpIHsKKy8vICAgICAgLi4uCisvLyAgIH0KKy8vIH0KKy8vCisKK3RlbXBsYXRlPGNsYXNzIEdyYXBoVCwgY2xhc3MgR1QgPSBHcmFwaFRyYWl0czxHcmFwaFQ+PgorY2xhc3MgUmV2ZXJzZVBvc3RPcmRlclRyYXZlcnNhbCB7CisgIHVzaW5nIE5vZGVSZWYgPSB0eXBlbmFtZSBHVDo6Tm9kZVJlZjsKKworICBzdGQ6OnZlY3RvcjxOb2RlUmVmPiBCbG9ja3M7IC8vIEJsb2NrIGxpc3QgaW4gbm9ybWFsIFBPIG9yZGVyCisKKyAgdm9pZCBJbml0aWFsaXplKE5vZGVSZWYgQkIpIHsKKyAgICBzdGQ6OmNvcHkocG9fYmVnaW4oQkIpLCBwb19lbmQoQkIpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoQmxvY2tzKSk7CisgIH0KKworcHVibGljOgorICB1c2luZyBycG9faXRlcmF0b3IgPSB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxOb2RlUmVmPjo6cmV2ZXJzZV9pdGVyYXRvcjsKKworICBSZXZlcnNlUG9zdE9yZGVyVHJhdmVyc2FsKEdyYXBoVCBHKSB7IEluaXRpYWxpemUoR1Q6OmdldEVudHJ5Tm9kZShHKSk7IH0KKworICAvLyBCZWNhdXNlIHdlIHdhbnQgYSByZXZlcnNlIHBvc3Qgb3JkZXIsIHVzZSByZXZlcnNlIGl0ZXJhdG9ycyBmcm9tIHRoZSB2ZWN0b3IKKyAgcnBvX2l0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gQmxvY2tzLnJiZWdpbigpOyB9CisgIHJwb19pdGVyYXRvciBlbmQoKSB7IHJldHVybiBCbG9ja3MucmVuZCgpOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfUE9TVE9SREVSSVRFUkFUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUHJpb3JpdHlRdWV1ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUHJpb3JpdHlRdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYTg3MWUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Qcmlvcml0eVF1ZXVlLmgKQEAgLTAsMCArMSw4MyBAQAorLy89PT0tIGxsdm0vQURUL1ByaW9yaXR5UXVldWUuaCAtIFByaW9yaXR5IHF1ZXVlcyAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUHJpb3JpdHlRdWV1ZSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1BSSU9SSVRZUVVFVUVfSAorI2RlZmluZSBMTFZNX0FEVF9QUklPUklUWVFVRVVFX0gKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxxdWV1ZT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gUHJpb3JpdHlRdWV1ZSAtIFRoaXMgY2xhc3MgYmVoYXZlcyBsaWtlIHN0ZDo6cHJpb3JpdHlfcXVldWUgYW5kCisvLy8gcHJvdmlkZXMgYSBmZXcgYWRkaXRpb25hbCBjb252ZW5pZW5jZSBmdW5jdGlvbnMuCisvLy8KK3RlbXBsYXRlPGNsYXNzIFQsCisgICAgICAgICBjbGFzcyBTZXF1ZW5jZSA9IHN0ZDo6dmVjdG9yPFQ+LAorICAgICAgICAgY2xhc3MgQ29tcGFyZSA9IHN0ZDo6bGVzczx0eXBlbmFtZSBTZXF1ZW5jZTo6dmFsdWVfdHlwZT4gPgorY2xhc3MgUHJpb3JpdHlRdWV1ZSA6IHB1YmxpYyBzdGQ6OnByaW9yaXR5X3F1ZXVlPFQsIFNlcXVlbmNlLCBDb21wYXJlPiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFByaW9yaXR5UXVldWUoY29uc3QgQ29tcGFyZSAmY29tcGFyZSA9IENvbXBhcmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXF1ZW5jZSAmc2VxdWVuY2UgPSBTZXF1ZW5jZSgpKQorICAgIDogc3RkOjpwcmlvcml0eV9xdWV1ZTxULCBTZXF1ZW5jZSwgQ29tcGFyZT4oY29tcGFyZSwgc2VxdWVuY2UpCisgIHt9CisKKyAgdGVtcGxhdGU8Y2xhc3MgSXRlcmF0b3I+CisgIFByaW9yaXR5UXVldWUoSXRlcmF0b3IgYmVnaW4sIEl0ZXJhdG9yIGVuZCwKKyAgICAgICAgICAgICAgICBjb25zdCBDb21wYXJlICZjb21wYXJlID0gQ29tcGFyZSgpLAorICAgICAgICAgICAgICAgIGNvbnN0IFNlcXVlbmNlICZzZXF1ZW5jZSA9IFNlcXVlbmNlKCkpCisgICAgOiBzdGQ6OnByaW9yaXR5X3F1ZXVlPFQsIFNlcXVlbmNlLCBDb21wYXJlPihiZWdpbiwgZW5kLCBjb21wYXJlLCBzZXF1ZW5jZSkKKyAge30KKworICAvLy8gZXJhc2Vfb25lIC0gRXJhc2Ugb25lIGVsZW1lbnQgZnJvbSB0aGUgcXVldWUsIHJlZ2FyZGxlc3Mgb2YgaXRzCisgIC8vLyBwb3NpdGlvbi4gVGhpcyBvcGVyYXRpb24gcGVyZm9ybXMgYSBsaW5lYXIgc2VhcmNoIHRvIGZpbmQgYW4gZWxlbWVudAorICAvLy8gZXF1YWwgdG8gdCwgYnV0IHRoZW4gdXNlcyBhbGwgbG9nYXJpdGhtaWMtdGltZSBhbGdvcml0aG1zIHRvIGRvCisgIC8vLyB0aGUgZXJhc2Ugb3BlcmF0aW9uLgorICAvLy8KKyAgdm9pZCBlcmFzZV9vbmUoY29uc3QgVCAmdCkgeworICAgIC8vIExpbmVhci1zZWFyY2ggdG8gZmluZCB0aGUgZWxlbWVudC4KKyAgICB0eXBlbmFtZSBTZXF1ZW5jZTo6c2l6ZV90eXBlIGkgPSBmaW5kKHRoaXMtPmMsIHQpIC0gdGhpcy0+Yy5iZWdpbigpOworCisgICAgLy8gTG9nYXJpdGhtaWMtdGltZSBoZWFwIGJ1YmJsZS11cC4KKyAgICB3aGlsZSAoaSAhPSAwKSB7CisgICAgICB0eXBlbmFtZSBTZXF1ZW5jZTo6c2l6ZV90eXBlIHBhcmVudCA9IChpIC0gMSkgLyAyOworICAgICAgdGhpcy0+Y1tpXSA9IHRoaXMtPmNbcGFyZW50XTsKKyAgICAgIGkgPSBwYXJlbnQ7CisgICAgfQorCisgICAgLy8gVGhlIGVsZW1lbnQgd2Ugd2FudCB0byByZW1vdmUgaXMgbm93IGF0IHRoZSByb290LCBzbyB3ZSBjYW4gdXNlCisgICAgLy8gcHJpb3JpdHlfcXVldWUncyBwbGFpbiBwb3AgdG8gcmVtb3ZlIGl0LgorICAgIHRoaXMtPnBvcCgpOworICB9CisKKyAgLy8vIHJlaGVhcGlmeSAtIElmIGFuIGVsZW1lbnQgaW4gdGhlIHF1ZXVlIGhhcyBjaGFuZ2VkIGluIGEgd2F5IHRoYXQKKyAgLy8vIGFmZmVjdHMgaXRzIHN0YW5kaW5nIGluIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uLCB0aGUgcXVldWUncworICAvLy8gaW50ZXJuYWwgc3RhdGUgYmVjb21lcyBpbnZhbGlkLiBDYWxsaW5nIHJlaGVhcGlmeSgpIHJlc2V0cyB0aGUKKyAgLy8vIHF1ZXVlJ3Mgc3RhdGUsIG1ha2luZyBpdCB2YWxpZCBhZ2Fpbi4gVGhpcyBvcGVyYXRpb24gaGFzIHRpbWUKKyAgLy8vIGNvbXBsZXhpdHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlLAorICAvLy8gc28gZG9uJ3QgcGxhbiB0byB1c2UgaXQgYSBsb3QuCisgIC8vLworICB2b2lkIHJlaGVhcGlmeSgpIHsKKyAgICBzdGQ6Om1ha2VfaGVhcCh0aGlzLT5jLmJlZ2luKCksIHRoaXMtPmMuZW5kKCksIHRoaXMtPmNvbXApOworICB9CisKKyAgLy8vIGNsZWFyIC0gRXJhc2UgYWxsIGVsZW1lbnRzIGZyb20gdGhlIHF1ZXVlLgorICAvLy8KKyAgdm9pZCBjbGVhcigpIHsKKyAgICB0aGlzLT5jLmNsZWFyKCk7CisgIH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUHJpb3JpdHlXb3JrbGlzdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUHJpb3JpdHlXb3JrbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNTMxZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Qcmlvcml0eVdvcmtsaXN0LmgKQEAgLTAsMCArMSwyNjYgQEAKKy8vPT09LSBQcmlvcml0eVdvcmtsaXN0LmggLSBXb3JrbGlzdCB3aXRoIGluc2VydGlvbiBwcmlvcml0eSAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vCisvLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGEgcHJpb3JpdHkgd29ya2xpc3QuIFNlZSB0aGUgY2xhc3MgY29tbWVudHMgZm9yIGRldGFpbHMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfUFJJT1JJVFlXT1JLTElTVF9ICisjZGVmaW5lIExMVk1fQURUX1BSSU9SSVRZV09SS0xJU1RfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBIEZJTE8gd29ya2xpc3QgdGhhdCBwcmlvcml0aXplcyBvbiByZS1pbnNlcnRpb24gd2l0aG91dCBkdXBsaWNhdGlvbi4KKy8vLworLy8vIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIGEgXGMgU2V0VmVjdG9yIHdpdGggdGhlIHByaW1hcnkgZGlmZmVyZW5jZSB0aGF0CisvLy8gd2hpbGUgcmUtaW5zZXJ0aW9uIGRvZXMgbm90IGNyZWF0ZSBhIGR1cGxpY2F0ZSwgaXQgZG9lcyBhZGp1c3QgdGhlCisvLy8gdmlzaXRhdGlvbiBvcmRlciB0byByZXNwZWN0IHRoZSBsYXN0IGluc2VydGlvbiBwb2ludC4gVGhpcyBjYW4gYmUgdXNlZnVsCisvLy8gd2hlbiB0aGUgdmlzaXQgb3JkZXIgbmVlZHMgdG8gYmUgcHJpb3JpdGl6ZWQgYmFzZWQgb24gaW5zZXJ0aW9uIHBvaW50CisvLy8gd2l0aG91dCBhY3R1YWxseSBoYXZpbmcgZHVwbGljYXRlIHZpc2l0cy4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgcHJldmVudCByZS1pbnNlcnRpb24gb2YgZWxlbWVudHMgd2hpY2ggaGF2ZSBiZWVuCisvLy8gdmlzaXRlZCAtLSBpZiB5b3UgbmVlZCB0byBicmVhayBjeWNsZXMsIGEgc2V0IHdpbGwgc3RpbGwgYmUgbmVjZXNzYXJ5LgorLy8vCisvLy8gVGhlIHR5cGUgXGMgVCBtdXN0IGJlIGRlZmF1bHQgY29uc3RydWN0YWJsZSB0byBhIG51bGwgdmFsdWUgdGhhdCB3aWxsIGJlCisvLy8gaWdub3JlZC4gSXQgaXMgYW4gZXJyb3IgdG8gaW5zZXJ0IHN1Y2ggYSB2YWx1ZSwgYW5kIHBvcHBpbmcgZWxlbWVudHMgd2lsbAorLy8vIG5ldmVyIHByb2R1Y2Ugc3VjaCBhIHZhbHVlLiBJdCBpcyBleHBlY3RlZCB0byBiZSB1c2VkIHdpdGggY29tbW9uIG51bGxhYmxlCisvLy8gdHlwZXMgbGlrZSBwb2ludGVycyBvciBvcHRpb25hbHMuCisvLy8KKy8vLyBJbnRlcm5hbGx5IHRoaXMgdXNlcyBhIHZlY3RvciB0byBzdG9yZSB0aGUgd29ya2xpc3QgYW5kIGEgbWFwIHRvIGlkZW50aWZ5CisvLy8gZXhpc3RpbmcgZWxlbWVudHMgaW4gdGhlIHdvcmtsaXN0LiBCb3RoIG9mIHRoZXNlIG1heSBiZSBjdXN0b21pemVkLCBidXQgdGhlCisvLy8gbWFwIG11c3Qgc3VwcG9ydCB0aGUgYmFzaWMgRGVuc2VNYXAgQVBJIGZvciBtYXBwaW5nIGZyb20gYSBUIHRvIGFuIGludGVnZXIKKy8vLyBpbmRleCBpbnRvIHRoZSB2ZWN0b3IuCisvLy8KKy8vLyBBIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaXMgcHJvdmlkZWQgdG8gYXV0b21hdGljYWxseSBzZWxlY3QgYSBTbWFsbFZlY3RvcgorLy8vIGFuZCBhIFNtYWxsRGVuc2VNYXAgaWYgY3VzdG9tIGRhdGEgc3RydWN0dXJlcyBhcmUgbm90IHByb3ZpZGVkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFZlY3RvclQgPSBzdGQ6OnZlY3RvcjxUPiwKKyAgICAgICAgICB0eXBlbmFtZSBNYXBUID0gRGVuc2VNYXA8VCwgcHRyZGlmZl90Pj4KK2NsYXNzIFByaW9yaXR5V29ya2xpc3QgeworcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0gVDsKKyAgdXNpbmcga2V5X3R5cGUgPSBUOworICB1c2luZyByZWZlcmVuY2UgPSBUJjsKKyAgdXNpbmcgY29uc3RfcmVmZXJlbmNlID0gY29uc3QgVCY7CisgIHVzaW5nIHNpemVfdHlwZSA9IHR5cGVuYW1lIE1hcFQ6OnNpemVfdHlwZTsKKworICAvLy8gQ29uc3RydWN0IGFuIGVtcHR5IFByaW9yaXR5V29ya2xpc3QKKyAgUHJpb3JpdHlXb3JrbGlzdCgpID0gZGVmYXVsdDsKKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBQcmlvcml0eVdvcmtsaXN0IGlzIGVtcHR5IG9yIG5vdC4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVi5lbXB0eSgpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgd29ya2xpc3QuCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeworICAgIHJldHVybiBNLnNpemUoKTsKKyAgfQorCisgIC8vLyBDb3VudCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGEgZ2l2ZW4ga2V5IGluIHRoZSBQcmlvcml0eVdvcmtsaXN0LgorICAvLy8gXHJldHVybnMgMCBpZiB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIFByaW9yaXR5V29ya2xpc3QsIDEgaWYgaXQgaXMuCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBrZXlfdHlwZSAma2V5KSBjb25zdCB7CisgICAgcmV0dXJuIE0uY291bnQoa2V5KTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgUHJpb3JpdHlXb3JrbGlzdC4KKyAgY29uc3QgVCAmYmFjaygpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWVtcHR5KCkgJiYgIkNhbm5vdCBjYWxsIGJhY2soKSBvbiBlbXB0eSBQcmlvcml0eVdvcmtsaXN0ISIpOworICAgIHJldHVybiBWLmJhY2soKTsKKyAgfQorCisgIC8vLyBJbnNlcnQgYSBuZXcgZWxlbWVudCBpbnRvIHRoZSBQcmlvcml0eVdvcmtsaXN0LgorICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCB3YXMgaW5zZXJ0ZWQgaW50byB0aGUgUHJpb3JpdHlXb3JrbGlzdC4KKyAgYm9vbCBpbnNlcnQoY29uc3QgVCAmWCkgeworICAgIGFzc2VydChYICE9IFQoKSAmJiAiQ2Fubm90IGluc2VydCBhIG51bGwgKGRlZmF1bHQgY29uc3RydWN0ZWQpIHZhbHVlISIpOworICAgIGF1dG8gSW5zZXJ0UmVzdWx0ID0gTS5pbnNlcnQoe1gsIFYuc2l6ZSgpfSk7CisgICAgaWYgKEluc2VydFJlc3VsdC5zZWNvbmQpIHsKKyAgICAgIC8vIEZyZXNoIHZhbHVlLCBqdXN0IGFwcGVuZCBpdCB0byB0aGUgdmVjdG9yLgorICAgICAgVi5wdXNoX2JhY2soWCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBhdXRvICZJbmRleCA9IEluc2VydFJlc3VsdC5maXJzdC0+c2Vjb25kOworICAgIGFzc2VydChWW0luZGV4XSA9PSBYICYmICJWYWx1ZSBub3QgYWN0dWFsbHkgYXQgaW5kZXggaW4gbWFwISIpOworICAgIGlmIChJbmRleCAhPSAocHRyZGlmZl90KShWLnNpemUoKSAtIDEpKSB7CisgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpc24ndCBhdCB0aGUgYmFjaywgbnVsbCBpdCBvdXQgYW5kIGFwcGVuZCBhIGZyZXNoIG9uZS4KKyAgICAgIFZbSW5kZXhdID0gVCgpOworICAgICAgSW5kZXggPSAocHRyZGlmZl90KVYuc2l6ZSgpOworICAgICAgVi5wdXNoX2JhY2soWCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBJbnNlcnQgYSBzZXF1ZW5jZSBvZiBuZXcgZWxlbWVudHMgaW50byB0aGUgUHJpb3JpdHlXb3JrbGlzdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFNlcXVlbmNlVD4KKyAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfY29udmVydGlibGU8U2VxdWVuY2VULCBUPjo6dmFsdWU+Ojp0eXBlCisgIGluc2VydChTZXF1ZW5jZVQgJiZJbnB1dCkgeworICAgIGlmIChzdGQ6OmJlZ2luKElucHV0KSA9PSBzdGQ6OmVuZChJbnB1dCkpCisgICAgICAvLyBOb3RoaW5nIHRvIGRvIGZvciBhbiBlbXB0eSBpbnB1dCBzZXF1ZW5jZS4KKyAgICAgIHJldHVybjsKKworICAgIC8vIEZpcnN0IHB1bGwgdGhlIGlucHV0IHNlcXVlbmNlIGludG8gdGhlIHZlY3RvciBhcyBhIGJ1bGsgYXBwZW5kCisgICAgLy8gb3BlcmF0aW9uLgorICAgIHB0cmRpZmZfdCBTdGFydEluZGV4ID0gVi5zaXplKCk7CisgICAgVi5pbnNlcnQoVi5lbmQoKSwgc3RkOjpiZWdpbihJbnB1dCksIHN0ZDo6ZW5kKElucHV0KSk7CisgICAgLy8gTm93IHdhbGsgYmFja3dhcmRzIGZpeGluZyB1cCB0aGUgaW5kZXggbWFwIGFuZCBkZWxldGluZyBhbnkgZHVwbGljYXRlcy4KKyAgICBmb3IgKHB0cmRpZmZfdCBpID0gVi5zaXplKCkgLSAxOyBpID49IFN0YXJ0SW5kZXg7IC0taSkgeworICAgICAgYXV0byBJbnNlcnRSZXN1bHQgPSBNLmluc2VydCh7VltpXSwgaX0pOworICAgICAgaWYgKEluc2VydFJlc3VsdC5zZWNvbmQpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBJZiB0aGUgZXhpc3RpbmcgaW5kZXggaXMgYmVmb3JlIHRoaXMgaW5zZXJ0J3Mgc3RhcnQsIG51a2UgdGhhdCBvbmUgYW5kCisgICAgICAvLyBtb3ZlIGl0IHVwLgorICAgICAgcHRyZGlmZl90ICZJbmRleCA9IEluc2VydFJlc3VsdC5maXJzdC0+c2Vjb25kOworICAgICAgaWYgKEluZGV4IDwgU3RhcnRJbmRleCkgeworICAgICAgICBWW0luZGV4XSA9IFQoKTsKKyAgICAgICAgSW5kZXggPSBpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gT3RoZXJ3aXNlIHRoZSBleGlzdGluZyBvbmUgY29tZXMgZmlyc3Qgc28ganVzdCBjbGVhciBvdXQgdGhlIHZhbHVlIGluCisgICAgICAvLyB0aGlzIHNsb3QuCisgICAgICBWW2ldID0gVCgpOworICAgIH0KKyAgfQorCisgIC8vLyBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgUHJpb3JpdHlXb3JrbGlzdC4KKyAgdm9pZCBwb3BfYmFjaygpIHsKKyAgICBhc3NlcnQoIWVtcHR5KCkgJiYgIkNhbm5vdCByZW1vdmUgYW4gZWxlbWVudCB3aGVuIGVtcHR5ISIpOworICAgIGFzc2VydChiYWNrKCkgIT0gVCgpICYmICJDYW5ub3QgaGF2ZSBhIG51bGwgZWxlbWVudCBhdCB0aGUgYmFjayEiKTsKKyAgICBNLmVyYXNlKGJhY2soKSk7CisgICAgZG8geworICAgICAgVi5wb3BfYmFjaygpOworICAgIH0gd2hpbGUgKCFWLmVtcHR5KCkgJiYgVi5iYWNrKCkgPT0gVCgpKTsKKyAgfQorCisgIExMVk1fTk9ESVNDQVJEIFQgcG9wX2JhY2tfdmFsKCkgeworICAgIFQgUmV0ID0gYmFjaygpOworICAgIHBvcF9iYWNrKCk7CisgICAgcmV0dXJuIFJldDsKKyAgfQorCisgIC8vLyBFcmFzZSBhbiBpdGVtIGZyb20gdGhlIHdvcmtsaXN0LgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGlzIGNvbnN0YW50IHRpbWUgZHVlIHRvIHRoZSBuYXR1cmUgb2YgdGhlIHdvcmtsaXN0IGltcGxlbWVudGF0aW9uLgorICBib29sIGVyYXNlKGNvbnN0IFQmIFgpIHsKKyAgICBhdXRvIEkgPSBNLmZpbmQoWCk7CisgICAgaWYgKEkgPT0gTS5lbmQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGFzc2VydChWW0ktPnNlY29uZF0gPT0gWCAmJiAiVmFsdWUgbm90IGFjdHVhbGx5IGF0IGluZGV4IGluIG1hcCEiKTsKKyAgICBpZiAoSS0+c2Vjb25kID09IChwdHJkaWZmX3QpKFYuc2l6ZSgpIC0gMSkpIHsKKyAgICAgIGRvIHsKKyAgICAgICAgVi5wb3BfYmFjaygpOworICAgICAgfSB3aGlsZSAoIVYuZW1wdHkoKSAmJiBWLmJhY2soKSA9PSBUKCkpOworICAgIH0gZWxzZSB7CisgICAgICBWW0ktPnNlY29uZF0gPSBUKCk7CisgICAgfQorICAgIE0uZXJhc2UoSSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gRXJhc2UgaXRlbXMgZnJvbSB0aGUgc2V0IHZlY3RvciBiYXNlZCBvbiBhIHByZWRpY2F0ZSBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBjb2RlLCBpZiB3ZSBjb3VsZAorICAvLy8gd3JpdGUgaXQ6CisgIC8vLworICAvLy8gXGNvZGUKKyAgLy8vICAgVi5lcmFzZShyZW1vdmVfaWYoViwgUCksIFYuZW5kKCkpOworICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBIb3dldmVyLCBQcmlvcml0eVdvcmtsaXN0IGRvZXNuJ3QgZXhwb3NlIG5vbi1jb25zdCBpdGVyYXRvcnMsIG1ha2luZyBhbnkKKyAgLy8vIGFsZ29yaXRobSBsaWtlIHJlbW92ZV9pZiBpbXBvc3NpYmxlIHRvIHVzZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGFueSBlbGVtZW50IGlzIHJlbW92ZWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVbmFyeVByZWRpY2F0ZT4KKyAgYm9vbCBlcmFzZV9pZihVbmFyeVByZWRpY2F0ZSBQKSB7CisgICAgdHlwZW5hbWUgVmVjdG9yVDo6aXRlcmF0b3IgRSA9CisgICAgICAgIHJlbW92ZV9pZihWLCBUZXN0QW5kRXJhc2VGcm9tTWFwPFVuYXJ5UHJlZGljYXRlPihQLCBNKSk7CisgICAgaWYgKEUgPT0gVi5lbmQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBmb3IgKGF1dG8gSSA9IFYuYmVnaW4oKTsgSSAhPSBFOyArK0kpCisgICAgICBpZiAoKkkgIT0gVCgpKQorICAgICAgICBNWypJXSA9IEkgLSBWLmJlZ2luKCk7CisgICAgVi5lcmFzZShFLCBWLmVuZCgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBSZXZlcnNlIHRoZSBpdGVtcyBpbiB0aGUgUHJpb3JpdHlXb3JrbGlzdC4KKyAgLy8vCisgIC8vLyBUaGlzIGRvZXMgYW4gaW4tcGxhY2UgcmV2ZXJzYWwuIE90aGVyIGtpbmRzIG9mIHJldmVyc2UgYXJlbid0IGVhc3kgdG8KKyAgLy8vIHN1cHBvcnQgaW4gdGhlIGZhY2Ugb2YgdGhlIHdvcmtsaXN0IHNlbWFudGljcy4KKworICAvLy8gQ29tcGxldGVseSBjbGVhciB0aGUgUHJpb3JpdHlXb3JrbGlzdAorICB2b2lkIGNsZWFyKCkgeworICAgIE0uY2xlYXIoKTsKKyAgICBWLmNsZWFyKCk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIEEgd3JhcHBlciBwcmVkaWNhdGUgZGVzaWduZWQgZm9yIHVzZSB3aXRoIHN0ZDo6cmVtb3ZlX2lmLgorICAvLy8KKyAgLy8vIFRoaXMgcHJlZGljYXRlIHdyYXBzIGEgcHJlZGljYXRlIHN1aXRhYmxlIGZvciB1c2Ugd2l0aCBzdGQ6OnJlbW92ZV9pZiB0bworICAvLy8gY2FsbCBNLmVyYXNlKHgpIG9uIGVhY2ggZWxlbWVudCB3aGljaCBpcyBzbGF0ZWQgZm9yIHJlbW92YWwuIFRoaXMganVzdAorICAvLy8gYWxsb3dzIHRoZSBwcmVkaWNhdGUgdG8gYmUgbW92ZSBvbmx5IHdoaWNoIHdlIGNhbid0IGRvIHdpdGggbGFtYmRhcworICAvLy8gdG9kYXkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVbmFyeVByZWRpY2F0ZVQ+CisgIGNsYXNzIFRlc3RBbmRFcmFzZUZyb21NYXAgeworICAgIFVuYXJ5UHJlZGljYXRlVCBQOworICAgIE1hcFQgJk07CisKKyAgcHVibGljOgorICAgIFRlc3RBbmRFcmFzZUZyb21NYXAoVW5hcnlQcmVkaWNhdGVUIFAsIE1hcFQgJk0pCisgICAgICAgIDogUChzdGQ6Om1vdmUoUCkpLCBNKE0pIHt9CisKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgVCAmQXJnKSB7CisgICAgICBpZiAoQXJnID09IFQoKSkKKyAgICAgICAgLy8gU2tpcCBudWxsIHZhbHVlcyBpbiB0aGUgUHJpb3JpdHlXb3JrbGlzdC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoUChBcmcpKSB7CisgICAgICAgIE0uZXJhc2UoQXJnKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9OworCisgIC8vLyBUaGUgbWFwIGZyb20gdmFsdWUgdG8gaW5kZXggaW4gdGhlIHZlY3Rvci4KKyAgTWFwVCBNOworCisgIC8vLyBUaGUgdmVjdG9yIG9mIGVsZW1lbnRzIGluIGluc2VydGlvbiBvcmRlci4KKyAgVmVjdG9yVCBWOworfTsKKworLy8vIEEgdmVyc2lvbiBvZiBcYyBQcmlvcml0eVdvcmtsaXN0IHRoYXQgc2VsZWN0cyBzbWFsbCBzaXplIG9wdGltaXplZCBkYXRhCisvLy8gc3RydWN0dXJlcyBmb3IgdGhlIHZlY3RvciBhbmQgbWFwLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4+CitjbGFzcyBTbWFsbFByaW9yaXR5V29ya2xpc3QKKyAgICA6IHB1YmxpYyBQcmlvcml0eVdvcmtsaXN0PFQsIFNtYWxsVmVjdG9yPFQsIE4+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxEZW5zZU1hcDxULCBwdHJkaWZmX3Q+PiB7CitwdWJsaWM6CisgIFNtYWxsUHJpb3JpdHlXb3JrbGlzdCgpID0gZGVmYXVsdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9QUklPUklUWVdPUktMSVNUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NDQ0l0ZXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TQ0NJdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NGE1OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TQ0NJdGVyYXRvci5oCkBAIC0wLDAgKzEsMjM3IEBACisvLz09PS0gQURUL1NDQ0l0ZXJhdG9yLmggLSBTdHJvbmdseSBDb25uZWN0ZWQgQ29tcC4gSXRlci4gLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8KKy8vLyBUaGlzIGJ1aWxkcyBvbiB0aGUgbGx2bS9BRFQvR3JhcGhUcmFpdHMuaCBmaWxlIHRvIGZpbmQgdGhlIHN0cm9uZ2x5CisvLy8gY29ubmVjdGVkIGNvbXBvbmVudHMgKFNDQ3MpIG9mIGEgZ3JhcGggaW4gTyhOK0UpIHRpbWUgdXNpbmcgVGFyamFuJ3MgREZTCisvLy8gYWxnb3JpdGhtLgorLy8vCisvLy8gVGhlIFNDQyBpdGVyYXRvciBoYXMgdGhlIGltcG9ydGFudCBwcm9wZXJ0eSB0aGF0IGlmIGEgbm9kZSBpbiBTQ0MgUzEgaGFzIGFuCisvLy8gZWRnZSB0byBhIG5vZGUgaW4gU0NDIFMyLCB0aGVuIGl0IHZpc2l0cyBTMSAqYWZ0ZXIqIFMyLgorLy8vCisvLy8gVG8gdmlzaXQgUzEgKmJlZm9yZSogUzIsIHVzZSB0aGUgc2NjX2l0ZXJhdG9yIG9uIHRoZSBJbnZlcnNlIGdyYXBoLiAoTk9URToKKy8vLyBUaGlzIHJlcXVpcmVzIHNvbWUgc2ltcGxlIHdyYXBwZXJzIGFuZCBpcyBub3Qgc3VwcG9ydGVkIHlldC4pCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU0NDSVRFUkFUT1JfSAorI2RlZmluZSBMTFZNX0FEVF9TQ0NJVEVSQVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgRW51bWVyYXRlIHRoZSBTQ0NzIG9mIGEgZGlyZWN0ZWQgZ3JhcGggaW4gcmV2ZXJzZSB0b3BvbG9naWNhbCBvcmRlcgorLy8vIG9mIHRoZSBTQ0MgREFHLgorLy8vCisvLy8gVGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyBUYXJqYW4ncyBERlMgYWxnb3JpdGhtIHVzaW5nIGFuIGludGVybmFsIHN0YWNrIHRvCisvLy8gYnVpbGQgdXAgYSB2ZWN0b3Igb2Ygbm9kZXMgaW4gYSBwYXJ0aWN1bGFyIFNDQy4gTm90ZSB0aGF0IGl0IGlzIGEgZm9yd2FyZAorLy8vIGl0ZXJhdG9yIGFuZCB0aHVzIHlvdSBjYW5ub3QgYmFja3RyYWNrIG9yIHJlLXZpc2l0IG5vZGVzLgordGVtcGxhdGUgPGNsYXNzIEdyYXBoVCwgY2xhc3MgR1QgPSBHcmFwaFRyYWl0czxHcmFwaFQ+PgorY2xhc3Mgc2NjX2l0ZXJhdG9yIDogcHVibGljIGl0ZXJhdG9yX2ZhY2FkZV9iYXNlPAorICAgICAgICAgICAgICAgICAgICAgICAgIHNjY19pdGVyYXRvcjxHcmFwaFQsIEdUPiwgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBHVDo6Tm9kZVJlZj4sIHB0cmRpZmZfdD4geworICB1c2luZyBOb2RlUmVmID0gdHlwZW5hbWUgR1Q6Ok5vZGVSZWY7CisgIHVzaW5nIENoaWxkSXRUeSA9IHR5cGVuYW1lIEdUOjpDaGlsZEl0ZXJhdG9yVHlwZTsKKyAgdXNpbmcgU2NjVHkgPSBzdGQ6OnZlY3RvcjxOb2RlUmVmPjsKKyAgdXNpbmcgcmVmZXJlbmNlID0gdHlwZW5hbWUgc2NjX2l0ZXJhdG9yOjpyZWZlcmVuY2U7CisKKyAgLy8vIEVsZW1lbnQgb2YgVmlzaXRTdGFjayBkdXJpbmcgREZTLgorICBzdHJ1Y3QgU3RhY2tFbGVtZW50IHsKKyAgICBOb2RlUmVmIE5vZGU7ICAgICAgICAgLy8vPCBUaGUgY3VycmVudCBub2RlIHBvaW50ZXIuCisgICAgQ2hpbGRJdFR5IE5leHRDaGlsZDsgIC8vLzwgVGhlIG5leHQgY2hpbGQsIG1vZGlmaWVkIGlucGxhY2UgZHVyaW5nIERGUy4KKyAgICB1bnNpZ25lZCBNaW5WaXNpdGVkOyAgLy8vPCBNaW5pbXVtIHVwbGluayB2YWx1ZSBvZiBhbGwgY2hpbGRyZW4gb2YgTm9kZS4KKworICAgIFN0YWNrRWxlbWVudChOb2RlUmVmIE5vZGUsIGNvbnN0IENoaWxkSXRUeSAmQ2hpbGQsIHVuc2lnbmVkIE1pbikKKyAgICAgICAgOiBOb2RlKE5vZGUpLCBOZXh0Q2hpbGQoQ2hpbGQpLCBNaW5WaXNpdGVkKE1pbikge30KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTdGFja0VsZW1lbnQgJk90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gTm9kZSA9PSBPdGhlci5Ob2RlICYmCisgICAgICAgICAgICAgTmV4dENoaWxkID09IE90aGVyLk5leHRDaGlsZCAmJgorICAgICAgICAgICAgIE1pblZpc2l0ZWQgPT0gT3RoZXIuTWluVmlzaXRlZDsKKyAgICB9CisgIH07CisKKyAgLy8vIFRoZSB2aXNpdCBjb3VudGVycyB1c2VkIHRvIGRldGVjdCB3aGVuIGEgY29tcGxldGUgU0NDIGlzIG9uIHRoZSBzdGFjay4KKyAgLy8vIHZpc2l0TnVtIGlzIHRoZSBnbG9iYWwgY291bnRlci4KKyAgLy8vCisgIC8vLyBub2RlVmlzaXROdW1iZXJzIGFyZSBwZXItbm9kZSB2aXNpdCBudW1iZXJzLCBhbHNvIHVzZWQgYXMgREZTIGZsYWdzLgorICB1bnNpZ25lZCB2aXNpdE51bTsKKyAgRGVuc2VNYXA8Tm9kZVJlZiwgdW5zaWduZWQ+IG5vZGVWaXNpdE51bWJlcnM7CisKKyAgLy8vIFN0YWNrIGhvbGRpbmcgbm9kZXMgb2YgdGhlIFNDQy4KKyAgc3RkOjp2ZWN0b3I8Tm9kZVJlZj4gU0NDTm9kZVN0YWNrOworCisgIC8vLyBUaGUgY3VycmVudCBTQ0MsIHJldHJpZXZlZCB1c2luZyBvcGVyYXRvciooKS4KKyAgU2NjVHkgQ3VycmVudFNDQzsKKworICAvLy8gREZTIHN0YWNrLCBVc2VkIHRvIG1haW50YWluIHRoZSBvcmRlcmluZy4gIFRoZSB0b3AgY29udGFpbnMgdGhlIGN1cnJlbnQKKyAgLy8vIG5vZGUsIHRoZSBuZXh0IGNoaWxkIHRvIHZpc2l0LCBhbmQgdGhlIG1pbmltdW0gdXBsaW5rIHZhbHVlIG9mIGFsbCBjaGlsZAorICBzdGQ6OnZlY3RvcjxTdGFja0VsZW1lbnQ+IFZpc2l0U3RhY2s7CisKKyAgLy8vIEEgc2luZ2xlICJ2aXNpdCIgd2l0aGluIHRoZSBub24tcmVjdXJzaXZlIERGUyB0cmF2ZXJzYWwuCisgIHZvaWQgREZTVmlzaXRPbmUoTm9kZVJlZiBOKTsKKworICAvLy8gVGhlIHN0YWNrLWJhc2VkIERGUyB0cmF2ZXJzYWw7IGRlZmluZWQgYmVsb3cuCisgIHZvaWQgREZTVmlzaXRDaGlsZHJlbigpOworCisgIC8vLyBDb21wdXRlIHRoZSBuZXh0IFNDQyB1c2luZyB0aGUgREZTIHRyYXZlcnNhbC4KKyAgdm9pZCBHZXROZXh0U0NDKCk7CisKKyAgc2NjX2l0ZXJhdG9yKE5vZGVSZWYgZW50cnlOKSA6IHZpc2l0TnVtKDApIHsKKyAgICBERlNWaXNpdE9uZShlbnRyeU4pOworICAgIEdldE5leHRTQ0MoKTsKKyAgfQorCisgIC8vLyBFbmQgaXMgd2hlbiB0aGUgREZTIHN0YWNrIGlzIGVtcHR5LgorICBzY2NfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKK3B1YmxpYzoKKyAgc3RhdGljIHNjY19pdGVyYXRvciBiZWdpbihjb25zdCBHcmFwaFQgJkcpIHsKKyAgICByZXR1cm4gc2NjX2l0ZXJhdG9yKEdUOjpnZXRFbnRyeU5vZGUoRykpOworICB9CisgIHN0YXRpYyBzY2NfaXRlcmF0b3IgZW5kKGNvbnN0IEdyYXBoVCAmKSB7IHJldHVybiBzY2NfaXRlcmF0b3IoKTsgfQorCisgIC8vLyBcYnJpZWYgRGlyZWN0IGxvb3AgdGVybWluYXRpb24gdGVzdCB3aGljaCBpcyBtb3JlIGVmZmljaWVudCB0aGFuCisgIC8vLyBjb21wYXJpc29uIHdpdGggXGMgZW5kKCkuCisgIGJvb2wgaXNBdEVuZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIUN1cnJlbnRTQ0MuZW1wdHkoKSB8fCBWaXNpdFN0YWNrLmVtcHR5KCkpOworICAgIHJldHVybiBDdXJyZW50U0NDLmVtcHR5KCk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3Qgc2NjX2l0ZXJhdG9yICZ4KSBjb25zdCB7CisgICAgcmV0dXJuIFZpc2l0U3RhY2sgPT0geC5WaXNpdFN0YWNrICYmIEN1cnJlbnRTQ0MgPT0geC5DdXJyZW50U0NDOworICB9CisKKyAgc2NjX2l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgIEdldE5leHRTQ0MoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGFzc2VydCghQ3VycmVudFNDQy5lbXB0eSgpICYmICJEZXJlZmVyZW5jaW5nIEVORCBTQ0MgaXRlcmF0b3IhIik7CisgICAgcmV0dXJuIEN1cnJlbnRTQ0M7CisgIH0KKworICAvLy8gXGJyaWVmIFRlc3QgaWYgdGhlIGN1cnJlbnQgU0NDIGhhcyBhIGxvb3AuCisgIC8vLworICAvLy8gSWYgdGhlIFNDQyBoYXMgbW9yZSB0aGFuIG9uZSBub2RlLCB0aGlzIGlzIHRyaXZpYWxseSB0cnVlLiAgSWYgbm90LCBpdCBtYXkKKyAgLy8vIHN0aWxsIGNvbnRhaW4gYSBsb29wIGlmIHRoZSBub2RlIGhhcyBhbiBlZGdlIGJhY2sgdG8gaXRzZWxmLgorICBib29sIGhhc0xvb3AoKSBjb25zdDsKKworICAvLy8gVGhpcyBpbmZvcm1zIHRoZSBcYyBzY2NfaXRlcmF0b3IgdGhhdCB0aGUgc3BlY2lmaWVkIFxjIE9sZCBub2RlCisgIC8vLyBoYXMgYmVlbiBkZWxldGVkLCBhbmQgXGMgTmV3IGlzIHRvIGJlIHVzZWQgaW4gaXRzIHBsYWNlLgorICB2b2lkIFJlcGxhY2VOb2RlKE5vZGVSZWYgT2xkLCBOb2RlUmVmIE5ldykgeworICAgIGFzc2VydChub2RlVmlzaXROdW1iZXJzLmNvdW50KE9sZCkgJiYgIk9sZCBub3QgaW4gc2NjX2l0ZXJhdG9yPyIpOworICAgIG5vZGVWaXNpdE51bWJlcnNbTmV3XSA9IG5vZGVWaXNpdE51bWJlcnNbT2xkXTsKKyAgICBub2RlVmlzaXROdW1iZXJzLmVyYXNlKE9sZCk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBHcmFwaFQsIGNsYXNzIEdUPgordm9pZCBzY2NfaXRlcmF0b3I8R3JhcGhULCBHVD46OkRGU1Zpc2l0T25lKE5vZGVSZWYgTikgeworICArK3Zpc2l0TnVtOworICBub2RlVmlzaXROdW1iZXJzW05dID0gdmlzaXROdW07CisgIFNDQ05vZGVTdGFjay5wdXNoX2JhY2soTik7CisgIFZpc2l0U3RhY2sucHVzaF9iYWNrKFN0YWNrRWxlbWVudChOLCBHVDo6Y2hpbGRfYmVnaW4oTiksIHZpc2l0TnVtKSk7CisjaWYgMCAvLyBFbmFibGUgaWYgbmVlZGVkIHdoZW4gZGVidWdnaW5nLgorICBkYmdzKCkgPDwgIlRhcmphblNDQzogTm9kZSAiIDw8IE4gPDwKKyAgICAgICAgIiA6IHZpc2l0TnVtID0gIiA8PCB2aXNpdE51bSA8PCAiXG4iOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBHcmFwaFQsIGNsYXNzIEdUPgordm9pZCBzY2NfaXRlcmF0b3I8R3JhcGhULCBHVD46OkRGU1Zpc2l0Q2hpbGRyZW4oKSB7CisgIGFzc2VydCghVmlzaXRTdGFjay5lbXB0eSgpKTsKKyAgd2hpbGUgKFZpc2l0U3RhY2suYmFjaygpLk5leHRDaGlsZCAhPSBHVDo6Y2hpbGRfZW5kKFZpc2l0U3RhY2suYmFjaygpLk5vZGUpKSB7CisgICAgLy8gVE9TIGhhcyBhdCBsZWFzdCBvbmUgbW9yZSBjaGlsZCBzbyBjb250aW51ZSBERlMKKyAgICBOb2RlUmVmIGNoaWxkTiA9ICpWaXNpdFN0YWNrLmJhY2soKS5OZXh0Q2hpbGQrKzsKKyAgICB0eXBlbmFtZSBEZW5zZU1hcDxOb2RlUmVmLCB1bnNpZ25lZD46Oml0ZXJhdG9yIFZpc2l0ZWQgPQorICAgICAgICBub2RlVmlzaXROdW1iZXJzLmZpbmQoY2hpbGROKTsKKyAgICBpZiAoVmlzaXRlZCA9PSBub2RlVmlzaXROdW1iZXJzLmVuZCgpKSB7CisgICAgICAvLyB0aGlzIG5vZGUgaGFzIG5ldmVyIGJlZW4gc2Vlbi4KKyAgICAgIERGU1Zpc2l0T25lKGNoaWxkTik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBjaGlsZE51bSA9IFZpc2l0ZWQtPnNlY29uZDsKKyAgICBpZiAoVmlzaXRTdGFjay5iYWNrKCkuTWluVmlzaXRlZCA+IGNoaWxkTnVtKQorICAgICAgVmlzaXRTdGFjay5iYWNrKCkuTWluVmlzaXRlZCA9IGNoaWxkTnVtOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBHcmFwaFQsIGNsYXNzIEdUPiB2b2lkIHNjY19pdGVyYXRvcjxHcmFwaFQsIEdUPjo6R2V0TmV4dFNDQygpIHsKKyAgQ3VycmVudFNDQy5jbGVhcigpOyAvLyBQcmVwYXJlIHRvIGNvbXB1dGUgdGhlIG5leHQgU0NDCisgIHdoaWxlICghVmlzaXRTdGFjay5lbXB0eSgpKSB7CisgICAgREZTVmlzaXRDaGlsZHJlbigpOworCisgICAgLy8gUG9wIHRoZSBsZWFmIG9uIHRvcCBvZiB0aGUgVmlzaXRTdGFjay4KKyAgICBOb2RlUmVmIHZpc2l0aW5nTiA9IFZpc2l0U3RhY2suYmFjaygpLk5vZGU7CisgICAgdW5zaWduZWQgbWluVmlzaXROdW0gPSBWaXNpdFN0YWNrLmJhY2soKS5NaW5WaXNpdGVkOworICAgIGFzc2VydChWaXNpdFN0YWNrLmJhY2soKS5OZXh0Q2hpbGQgPT0gR1Q6OmNoaWxkX2VuZCh2aXNpdGluZ04pKTsKKyAgICBWaXNpdFN0YWNrLnBvcF9iYWNrKCk7CisKKyAgICAvLyBQcm9wYWdhdGUgTWluVmlzaXROdW0gdG8gcGFyZW50IHNvIHdlIGNhbiBkZXRlY3QgdGhlIFNDQyBzdGFydGluZyBub2RlLgorICAgIGlmICghVmlzaXRTdGFjay5lbXB0eSgpICYmIFZpc2l0U3RhY2suYmFjaygpLk1pblZpc2l0ZWQgPiBtaW5WaXNpdE51bSkKKyAgICAgIFZpc2l0U3RhY2suYmFjaygpLk1pblZpc2l0ZWQgPSBtaW5WaXNpdE51bTsKKworI2lmIDAgLy8gRW5hYmxlIGlmIG5lZWRlZCB3aGVuIGRlYnVnZ2luZy4KKyAgICBkYmdzKCkgPDwgIlRhcmphblNDQzogUG9wcGVkIG5vZGUgIiA8PCB2aXNpdGluZ04gPDwKKyAgICAgICAgICAiIDogbWluVmlzaXROdW0gPSAiIDw8IG1pblZpc2l0TnVtIDw8ICI7IE5vZGUgdmlzaXQgbnVtID0gIiA8PAorICAgICAgICAgIG5vZGVWaXNpdE51bWJlcnNbdmlzaXRpbmdOXSA8PCAiXG4iOworI2VuZGlmCisKKyAgICBpZiAobWluVmlzaXROdW0gIT0gbm9kZVZpc2l0TnVtYmVyc1t2aXNpdGluZ05dKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBBIGZ1bGwgU0NDIGlzIG9uIHRoZSBTQ0NOb2RlU3RhY2shICBJdCBpbmNsdWRlcyBhbGwgbm9kZXMgYmVsb3cKKyAgICAvLyB2aXNpdGluZ04gb24gdGhlIHN0YWNrLiAgQ29weSB0aG9zZSBub2RlcyB0byBDdXJyZW50U0NDLAorICAgIC8vIHJlc2V0IHRoZWlyIG1pblZpc2l0IHZhbHVlcywgYW5kIHJldHVybiAodGhpcyBzdXNwZW5kcworICAgIC8vIHRoZSBERlMgdHJhdmVyc2FsIHRpbGwgdGhlIG5leHQgKyspLgorICAgIGRvIHsKKyAgICAgIEN1cnJlbnRTQ0MucHVzaF9iYWNrKFNDQ05vZGVTdGFjay5iYWNrKCkpOworICAgICAgU0NDTm9kZVN0YWNrLnBvcF9iYWNrKCk7CisgICAgICBub2RlVmlzaXROdW1iZXJzW0N1cnJlbnRTQ0MuYmFjaygpXSA9IH4wVTsKKyAgICB9IHdoaWxlIChDdXJyZW50U0NDLmJhY2soKSAhPSB2aXNpdGluZ04pOworICAgIHJldHVybjsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgR3JhcGhULCBjbGFzcyBHVD4KK2Jvb2wgc2NjX2l0ZXJhdG9yPEdyYXBoVCwgR1Q+OjpoYXNMb29wKCkgY29uc3QgeworICAgIGFzc2VydCghQ3VycmVudFNDQy5lbXB0eSgpICYmICJEZXJlZmVyZW5jaW5nIEVORCBTQ0MgaXRlcmF0b3IhIik7CisgICAgaWYgKEN1cnJlbnRTQ0Muc2l6ZSgpID4gMSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIE5vZGVSZWYgTiA9IEN1cnJlbnRTQ0MuZnJvbnQoKTsKKyAgICBmb3IgKENoaWxkSXRUeSBDSSA9IEdUOjpjaGlsZF9iZWdpbihOKSwgQ0UgPSBHVDo6Y2hpbGRfZW5kKE4pOyBDSSAhPSBDRTsKKyAgICAgICAgICsrQ0kpCisgICAgICBpZiAoKkNJID09IE4pCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisvLy8gXGJyaWVmIENvbnN0cnVjdCB0aGUgYmVnaW4gaXRlcmF0b3IgZm9yIGEgZGVkdWNlZCBncmFwaCB0eXBlIFQuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc2NjX2l0ZXJhdG9yPFQ+IHNjY19iZWdpbihjb25zdCBUICZHKSB7CisgIHJldHVybiBzY2NfaXRlcmF0b3I8VD46OmJlZ2luKEcpOworfQorCisvLy8gXGJyaWVmIENvbnN0cnVjdCB0aGUgZW5kIGl0ZXJhdG9yIGZvciBhIGRlZHVjZWQgZ3JhcGggdHlwZSBULgordGVtcGxhdGUgPGNsYXNzIFQ+IHNjY19pdGVyYXRvcjxUPiBzY2NfZW5kKGNvbnN0IFQgJkcpIHsKKyAgcmV0dXJuIHNjY19pdGVyYXRvcjxUPjo6ZW5kKEcpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfU0NDSVRFUkFUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU1RMRXh0cmFzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TVExFeHRyYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTFiOTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU1RMRXh0cmFzLmgKQEAgLTAsMCArMSwxMTgxIEBACisvLz09PS0gbGx2bS9BRFQvU1RMRXh0cmFzLmggLSBVc2VmdWwgU1RMIHJlbGF0ZWQgZnVuY3Rpb25zIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBzb21lIHRlbXBsYXRlcyB0aGF0IGFyZSB1c2VmdWwgaWYgeW91IGFyZSB3b3JraW5nIHdpdGggdGhlCisvLyBTVEwgYXQgYWxsLgorLy8KKy8vIE5vIGxpYnJhcnkgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyB0aGVzZSBmdW5jdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9TVExFWFRSQVNfSAorI2RlZmluZSBMTFZNX0FEVF9TVExFWFRSQVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpZmRlZiBFWFBFTlNJVkVfQ0hFQ0tTCisjaW5jbHVkZSA8cmFuZG9tPiAvLyBmb3Igc3RkOjptdDE5OTM3CisjZW5kaWYKKworbmFtZXNwYWNlIGxsdm0geworCisvLyBPbmx5IHVzZWQgYnkgY29tcGlsZXIgaWYgYm90aCB0ZW1wbGF0ZSB0eXBlcyBhcmUgdGhlIHNhbWUuICBVc2VmdWwgd2hlbgorLy8gdXNpbmcgU0ZJTkFFIHRvIHRlc3QgZm9yIHRoZSBleGlzdGVuY2Ugb2YgbWVtYmVyIGZ1bmN0aW9ucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBUPiBzdHJ1Y3QgU2FtZVR5cGU7CisKK25hbWVzcGFjZSBkZXRhaWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmFuZ2VUPgordXNpbmcgSXRlck9mUmFuZ2UgPSBkZWNsdHlwZShzdGQ6OmJlZ2luKHN0ZDo6ZGVjbHZhbDxSYW5nZVQgJj4oKSkpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmFuZ2VUPgordXNpbmcgVmFsdWVPZlJhbmdlID0gdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPGRlY2x0eXBlKAorICAgICpzdGQ6OmJlZ2luKHN0ZDo6ZGVjbHZhbDxSYW5nZVQgJj4oKSkpPjo6dHlwZTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgIEV4dHJhIGFkZGl0aW9ucyB0byA8ZnVuY3Rpb25hbD4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3RlbXBsYXRlIDxjbGFzcyBUeT4gc3RydWN0IGlkZW50aXR5IHsKKyAgdXNpbmcgYXJndW1lbnRfdHlwZSA9IFR5OworCisgIFR5ICZvcGVyYXRvcigpKFR5ICZzZWxmKSBjb25zdCB7CisgICAgcmV0dXJuIHNlbGY7CisgIH0KKyAgY29uc3QgVHkgJm9wZXJhdG9yKCkoY29uc3QgVHkgJnNlbGYpIGNvbnN0IHsKKyAgICByZXR1cm4gc2VsZjsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFR5PiBzdHJ1Y3QgbGVzc19wdHIgeworICBib29sIG9wZXJhdG9yKCkoY29uc3QgVHkqIGxlZnQsIGNvbnN0IFR5KiByaWdodCkgY29uc3QgeworICAgIHJldHVybiAqbGVmdCA8ICpyaWdodDsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFR5PiBzdHJ1Y3QgZ3JlYXRlcl9wdHIgeworICBib29sIG9wZXJhdG9yKCkoY29uc3QgVHkqIGxlZnQsIGNvbnN0IFR5KiByaWdodCkgY29uc3QgeworICAgIHJldHVybiAqcmlnaHQgPCAqbGVmdDsKKyAgfQorfTsKKworLy8vIEFuIGVmZmljaWVudCwgdHlwZS1lcmFzaW5nLCBub24tb3duaW5nIHJlZmVyZW5jZSB0byBhIGNhbGxhYmxlLiBUaGlzIGlzCisvLy8gaW50ZW5kZWQgZm9yIHVzZSBhcyB0aGUgdHlwZSBvZiBhIGZ1bmN0aW9uIHBhcmFtZXRlciB0aGF0IGlzIG5vdCB1c2VkCisvLy8gYWZ0ZXIgdGhlIGZ1bmN0aW9uIGluIHF1ZXN0aW9uIHJldHVybnMuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGRvZXMgbm90IG93biB0aGUgY2FsbGFibGUsIHNvIGl0IGlzIG5vdCBpbiBnZW5lcmFsIHNhZmUgdG8gc3RvcmUKKy8vLyBhIGZ1bmN0aW9uX3JlZi4KK3RlbXBsYXRlPHR5cGVuYW1lIEZuPiBjbGFzcyBmdW5jdGlvbl9yZWY7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJldCwgdHlwZW5hbWUgLi4uUGFyYW1zPgorY2xhc3MgZnVuY3Rpb25fcmVmPFJldChQYXJhbXMuLi4pPiB7CisgIFJldCAoKmNhbGxiYWNrKShpbnRwdHJfdCBjYWxsYWJsZSwgUGFyYW1zIC4uLnBhcmFtcykgPSBudWxscHRyOworICBpbnRwdHJfdCBjYWxsYWJsZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBDYWxsYWJsZT4KKyAgc3RhdGljIFJldCBjYWxsYmFja19mbihpbnRwdHJfdCBjYWxsYWJsZSwgUGFyYW1zIC4uLnBhcmFtcykgeworICAgIHJldHVybiAoKnJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbGFibGUqPihjYWxsYWJsZSkpKAorICAgICAgICBzdGQ6OmZvcndhcmQ8UGFyYW1zPihwYXJhbXMpLi4uKTsKKyAgfQorCitwdWJsaWM6CisgIGZ1bmN0aW9uX3JlZigpID0gZGVmYXVsdDsKKyAgZnVuY3Rpb25fcmVmKHN0ZDo6bnVsbHB0cl90KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYWxsYWJsZT4KKyAgZnVuY3Rpb25fcmVmKENhbGxhYmxlICYmY2FsbGFibGUsCisgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgICAhc3RkOjppc19zYW1lPHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxDYWxsYWJsZT46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9yZWY+Ojp2YWx1ZT46OnR5cGUgKiA9IG51bGxwdHIpCisgICAgICA6IGNhbGxiYWNrKGNhbGxiYWNrX2ZuPHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxDYWxsYWJsZT46OnR5cGU+KSwKKyAgICAgICAgY2FsbGFibGUocmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJmNhbGxhYmxlKSkge30KKworICBSZXQgb3BlcmF0b3IoKShQYXJhbXMgLi4ucGFyYW1zKSBjb25zdCB7CisgICAgcmV0dXJuIGNhbGxiYWNrKGNhbGxhYmxlLCBzdGQ6OmZvcndhcmQ8UGFyYW1zPihwYXJhbXMpLi4uKTsKKyAgfQorCisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBjYWxsYmFjazsgfQorfTsKKworLy8gZGVsZXRlciAtIFZlcnkgdmVyeSB2ZXJ5IHNpbXBsZSBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGludm9rZSBvcGVyYXRvcgorLy8gZGVsZXRlIG9uIHNvbWV0aGluZy4gIEl0IGlzIHVzZWQgbGlrZSB0aGlzOgorLy8KKy8vICAgZm9yX2VhY2goVi5iZWdpbigpLCBCLmVuZCgpLCBkZWxldGVyPEludGVydmFsPik7Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSB2b2lkIGRlbGV0ZXIoVCAqUHRyKSB7CisgIGRlbGV0ZSBQdHI7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgRXh0cmEgYWRkaXRpb25zIHRvIDxpdGVyYXRvcj4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK25hbWVzcGFjZSBhZGxfZGV0YWlsIHsKKwordXNpbmcgc3RkOjpiZWdpbjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lclR5PgorYXV0byBhZGxfYmVnaW4oQ29udGFpbmVyVHkgJiZjb250YWluZXIpCisgICAgLT4gZGVjbHR5cGUoYmVnaW4oc3RkOjpmb3J3YXJkPENvbnRhaW5lclR5Pihjb250YWluZXIpKSkgeworICByZXR1cm4gYmVnaW4oc3RkOjpmb3J3YXJkPENvbnRhaW5lclR5Pihjb250YWluZXIpKTsKK30KKwordXNpbmcgc3RkOjplbmQ7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXJUeT4KK2F1dG8gYWRsX2VuZChDb250YWluZXJUeSAmJmNvbnRhaW5lcikKKyAgICAtPiBkZWNsdHlwZShlbmQoc3RkOjpmb3J3YXJkPENvbnRhaW5lclR5Pihjb250YWluZXIpKSkgeworICByZXR1cm4gZW5kKHN0ZDo6Zm9yd2FyZDxDb250YWluZXJUeT4oY29udGFpbmVyKSk7Cit9CisKK3VzaW5nIHN0ZDo6c3dhcDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIGFkbF9zd2FwKFQgJiZsaHMsIFQgJiZyaHMpIG5vZXhjZXB0KG5vZXhjZXB0KHN3YXAoc3RkOjpkZWNsdmFsPFQ+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpkZWNsdmFsPFQ+KCkpKSkgeworICBzd2FwKHN0ZDo6Zm9yd2FyZDxUPihsaHMpLCBzdGQ6OmZvcndhcmQ8VD4ocmhzKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBhZGxfZGV0YWlsCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXJUeT4KK2F1dG8gYWRsX2JlZ2luKENvbnRhaW5lclR5ICYmY29udGFpbmVyKQorICAgIC0+IGRlY2x0eXBlKGFkbF9kZXRhaWw6OmFkbF9iZWdpbihzdGQ6OmZvcndhcmQ8Q29udGFpbmVyVHk+KGNvbnRhaW5lcikpKSB7CisgIHJldHVybiBhZGxfZGV0YWlsOjphZGxfYmVnaW4oc3RkOjpmb3J3YXJkPENvbnRhaW5lclR5Pihjb250YWluZXIpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lclR5PgorYXV0byBhZGxfZW5kKENvbnRhaW5lclR5ICYmY29udGFpbmVyKQorICAgIC0+IGRlY2x0eXBlKGFkbF9kZXRhaWw6OmFkbF9lbmQoc3RkOjpmb3J3YXJkPENvbnRhaW5lclR5Pihjb250YWluZXIpKSkgeworICByZXR1cm4gYWRsX2RldGFpbDo6YWRsX2VuZChzdGQ6OmZvcndhcmQ8Q29udGFpbmVyVHk+KGNvbnRhaW5lcikpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgYWRsX3N3YXAoVCAmJmxocywgVCAmJnJocykgbm9leGNlcHQoCisgICAgbm9leGNlcHQoYWRsX2RldGFpbDo6YWRsX3N3YXAoc3RkOjpkZWNsdmFsPFQ+KCksIHN0ZDo6ZGVjbHZhbDxUPigpKSkpIHsKKyAgYWRsX2RldGFpbDo6YWRsX3N3YXAoc3RkOjpmb3J3YXJkPFQ+KGxocyksIHN0ZDo6Zm9yd2FyZDxUPihyaHMpKTsKK30KKworLy8gbWFwcGVkX2l0ZXJhdG9yIC0gVGhpcyBpcyBhIHNpbXBsZSBpdGVyYXRvciBhZGFwdGVyIHRoYXQgY2F1c2VzIGEgZnVuY3Rpb24gdG8KKy8vIGJlIGFwcGxpZWQgd2hlbmV2ZXIgb3BlcmF0b3IqIGlzIGludm9rZWQgb24gdGhlIGl0ZXJhdG9yLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRUeSwgdHlwZW5hbWUgRnVuY1R5LAorICAgICAgICAgIHR5cGVuYW1lIEZ1bmNSZXR1cm5UeSA9CisgICAgICAgICAgICBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8RnVuY1R5PigpKCpzdGQ6OmRlY2x2YWw8SXRUeT4oKSkpPgorY2xhc3MgbWFwcGVkX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3JfYWRhcHRvcl9iYXNlPAorICAgICAgICAgICAgIG1hcHBlZF9pdGVyYXRvcjxJdFR5LCBGdW5jVHk+LCBJdFR5LAorICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0VHk+OjppdGVyYXRvcl9jYXRlZ29yeSwKKyAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8RnVuY1JldHVyblR5Pjo6dHlwZT4geworcHVibGljOgorICBtYXBwZWRfaXRlcmF0b3IoSXRUeSBVLCBGdW5jVHkgRikKKyAgICA6IG1hcHBlZF9pdGVyYXRvcjo6aXRlcmF0b3JfYWRhcHRvcl9iYXNlKHN0ZDo6bW92ZShVKSksIEYoc3RkOjptb3ZlKEYpKSB7fQorCisgIEl0VHkgZ2V0Q3VycmVudCgpIHsgcmV0dXJuIHRoaXMtPkk7IH0KKworICBGdW5jUmV0dXJuVHkgb3BlcmF0b3IqKCkgeyByZXR1cm4gRigqdGhpcy0+SSk7IH0KKworcHJpdmF0ZToKKyAgRnVuY1R5IEY7Cit9OworCisvLyBtYXBfaXRlcmF0b3IgLSBQcm92aWRlIGEgY29udmVuaWVudCB3YXkgdG8gY3JlYXRlIG1hcHBlZF9pdGVyYXRvcnMsIGp1c3QgbGlrZQorLy8gbWFrZV9wYWlyIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgcGFpcnMuLi4KK3RlbXBsYXRlIDxjbGFzcyBJdFR5LCBjbGFzcyBGdW5jVHk+CitpbmxpbmUgbWFwcGVkX2l0ZXJhdG9yPEl0VHksIEZ1bmNUeT4gbWFwX2l0ZXJhdG9yKEl0VHkgSSwgRnVuY1R5IEYpIHsKKyAgcmV0dXJuIG1hcHBlZF9pdGVyYXRvcjxJdFR5LCBGdW5jVHk+KHN0ZDo6bW92ZShJKSwgc3RkOjptb3ZlKEYpKTsKK30KKworLy8vIEhlbHBlciB0byBkZXRlcm1pbmUgaWYgdHlwZSBUIGhhcyBhIG1lbWJlciBjYWxsZWQgcmJlZ2luKCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHk+IGNsYXNzIGhhc19yYmVnaW5faW1wbCB7CisgIHVzaW5nIHllcyA9IGNoYXJbMV07CisgIHVzaW5nIG5vID0gY2hhclsyXTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXI+CisgIHN0YXRpYyB5ZXMmIHRlc3QoSW5uZXIgKkksIGRlY2x0eXBlKEktPnJiZWdpbigpKSAqID0gbnVsbHB0cik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lPgorICBzdGF0aWMgbm8mIHRlc3QoLi4uKTsKKworcHVibGljOgorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHNpemVvZih0ZXN0PFR5PihudWxscHRyKSkgPT0gc2l6ZW9mKHllcyk7Cit9OworCisvLy8gTWV0YWZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBUJiBvciBUIGhhcyBhIG1lbWJlciBjYWxsZWQgcmJlZ2luKCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHk+CitzdHJ1Y3QgaGFzX3JiZWdpbiA6IGhhc19yYmVnaW5faW1wbDx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VHk+Ojp0eXBlPiB7Cit9OworCisvLyBSZXR1cm5zIGFuIGl0ZXJhdG9yX3JhbmdlIG92ZXIgdGhlIGdpdmVuIGNvbnRhaW5lciB3aGljaCBpdGVyYXRlcyBpbiByZXZlcnNlLgorLy8gTm90ZSB0aGF0IHRoZSBjb250YWluZXIgbXVzdCBoYXZlIHJiZWdpbigpL3JlbmQoKSBtZXRob2RzIGZvciB0aGlzIHRvIHdvcmsuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyVHk+CithdXRvIHJldmVyc2UoQ29udGFpbmVyVHkgJiZDLAorICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGhhc19yYmVnaW48Q29udGFpbmVyVHk+Ojp2YWx1ZT46OnR5cGUgKiA9CisgICAgICAgICAgICAgICAgIG51bGxwdHIpIC0+IGRlY2x0eXBlKG1ha2VfcmFuZ2UoQy5yYmVnaW4oKSwgQy5yZW5kKCkpKSB7CisgIHJldHVybiBtYWtlX3JhbmdlKEMucmJlZ2luKCksIEMucmVuZCgpKTsKK30KKworLy8gUmV0dXJucyBhIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvciB3cmFwcGVkIGFyb3VuZCB0aGUgZ2l2ZW4gaXRlcmF0b3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3JUeT4KK3N0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxJdGVyYXRvclR5PiBtYWtlX3JldmVyc2VfaXRlcmF0b3IoSXRlcmF0b3JUeSBJdCkgeworICByZXR1cm4gc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPEl0ZXJhdG9yVHk+KEl0KTsKK30KKworLy8gUmV0dXJucyBhbiBpdGVyYXRvcl9yYW5nZSBvdmVyIHRoZSBnaXZlbiBjb250YWluZXIgd2hpY2ggaXRlcmF0ZXMgaW4gcmV2ZXJzZS4KKy8vIE5vdGUgdGhhdCB0aGUgY29udGFpbmVyIG11c3QgaGF2ZSBiZWdpbigpL2VuZCgpIG1ldGhvZHMgd2hpY2ggcmV0dXJuCisvLyBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9ycyBmb3IgdGhpcyB0byB3b3JrLgordGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lclR5PgorYXV0byByZXZlcnNlKAorICAgIENvbnRhaW5lclR5ICYmQywKKyAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhaGFzX3JiZWdpbjxDb250YWluZXJUeT46OnZhbHVlPjo6dHlwZSAqID0gbnVsbHB0cikKKyAgICAtPiBkZWNsdHlwZShtYWtlX3JhbmdlKGxsdm06Om1ha2VfcmV2ZXJzZV9pdGVyYXRvcihzdGQ6OmVuZChDKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjptYWtlX3JldmVyc2VfaXRlcmF0b3Ioc3RkOjpiZWdpbihDKSkpKSB7CisgIHJldHVybiBtYWtlX3JhbmdlKGxsdm06Om1ha2VfcmV2ZXJzZV9pdGVyYXRvcihzdGQ6OmVuZChDKSksCisgICAgICAgICAgICAgICAgICAgIGxsdm06Om1ha2VfcmV2ZXJzZV9pdGVyYXRvcihzdGQ6OmJlZ2luKEMpKSk7Cit9CisKKy8vLyBBbiBpdGVyYXRvciBhZGFwdG9yIHRoYXQgZmlsdGVycyB0aGUgZWxlbWVudHMgb2YgZ2l2ZW4gaW5uZXIgaXRlcmF0b3JzLgorLy8vCisvLy8gVGhlIHByZWRpY2F0ZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgYWNjZXB0cyB0aGUgd3JhcHBlZAorLy8vIGl0ZXJhdG9yJ3MgcmVmZXJlbmNlIHR5cGUgYW5kIHJldHVybnMgYSBib29sLiBXaGVuIGluY3JlbWVudGluZyBvcgorLy8vIGRlY3JlbWVudGluZyB0aGUgaXRlcmF0b3IsIGl0IHdpbGwgY2FsbCB0aGUgcHJlZGljYXRlIG9uIGVhY2ggZWxlbWVudCBhbmQKKy8vLyBza2lwIGFueSB3aGVyZSBpdCByZXR1cm5zIGZhbHNlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAgIGludCBBW10gPSB7IDEsIDIsIDMsIDQgfTsKKy8vLyAgIGF1dG8gUiA9IG1ha2VfZmlsdGVyX3JhbmdlKEEsIFtdKGludCBOKSB7IHJldHVybiBOICUgMiA9PSAxOyB9KTsKKy8vLyAgIC8vIFIgY29udGFpbnMgeyAxLCAzIH0uCisvLy8gXGVuZGNvZGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBXcmFwcGVkSXRlcmF0b3JULCB0eXBlbmFtZSBQcmVkaWNhdGVUPgorY2xhc3MgZmlsdGVyX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3JfYWRhcHRvcl9iYXNlPAorICAgICAgICAgIGZpbHRlcl9pdGVyYXRvcjxXcmFwcGVkSXRlcmF0b3JULCBQcmVkaWNhdGVUPiwgV3JhcHBlZEl0ZXJhdG9yVCwKKyAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmNvbW1vbl90eXBlPAorICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czwKKyAgICAgICAgICAgICAgICAgIFdyYXBwZWRJdGVyYXRvclQ+OjppdGVyYXRvcl9jYXRlZ29yeT46OnR5cGU+IHsKKyAgdXNpbmcgQmFzZVQgPSBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8CisgICAgICBmaWx0ZXJfaXRlcmF0b3I8V3JhcHBlZEl0ZXJhdG9yVCwgUHJlZGljYXRlVD4sIFdyYXBwZWRJdGVyYXRvclQsCisgICAgICB0eXBlbmFtZSBzdGQ6OmNvbW1vbl90eXBlPAorICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8V3JhcHBlZEl0ZXJhdG9yVD46Oml0ZXJhdG9yX2NhdGVnb3J5Pjo6CisgICAgICAgICAgdHlwZT47CisKKyAgc3RydWN0IFBheWxvYWRUeXBlIHsKKyAgICBXcmFwcGVkSXRlcmF0b3JUIEVuZDsKKyAgICBQcmVkaWNhdGVUIFByZWQ7CisgIH07CisKKyAgT3B0aW9uYWw8UGF5bG9hZFR5cGU+IFBheWxvYWQ7CisKKyAgdm9pZCBmaW5kTmV4dFZhbGlkKCkgeworICAgIGFzc2VydChQYXlsb2FkICYmICJQYXlsb2FkIHNob3VsZCBiZSBlbmdhZ2VkIHdoZW4gZmluZE5leHRWYWxpZCBpcyBjYWxsZWQiKTsKKyAgICB3aGlsZSAodGhpcy0+SSAhPSBQYXlsb2FkLT5FbmQgJiYgIVBheWxvYWQtPlByZWQoKnRoaXMtPkkpKQorICAgICAgQmFzZVQ6Om9wZXJhdG9yKysoKTsKKyAgfQorCisgIC8vIENvbnN0cnVjdCB0aGUgYmVnaW4gaXRlcmF0b3IuIFRoZSBiZWdpbiBpdGVyYXRvciByZXF1aXJlcyB0byBrbm93IHdoZXJlIGVuZAorICAvLyBpcywgc28gdGhhdCBpdCBjYW4gcHJvcGVybHkgc3RvcCB3aGVuIGl0IGhpdHMgZW5kLgorICBmaWx0ZXJfaXRlcmF0b3IoV3JhcHBlZEl0ZXJhdG9yVCBCZWdpbiwgV3JhcHBlZEl0ZXJhdG9yVCBFbmQsIFByZWRpY2F0ZVQgUHJlZCkKKyAgICAgIDogQmFzZVQoc3RkOjptb3ZlKEJlZ2luKSksCisgICAgICAgIFBheWxvYWQoUGF5bG9hZFR5cGV7c3RkOjptb3ZlKEVuZCksIHN0ZDo6bW92ZShQcmVkKX0pIHsKKyAgICBmaW5kTmV4dFZhbGlkKCk7CisgIH0KKworICAvLyBDb25zdHJ1Y3QgdGhlIGVuZCBpdGVyYXRvci4gSXQncyBub3QgaW5jcmVtZW50YWJsZSwgc28gUGF5bG9hZCBkb2Vzbid0CisgIC8vIGhhdmUgdG8gYmUgZW5nYWdlZC4KKyAgZmlsdGVyX2l0ZXJhdG9yKFdyYXBwZWRJdGVyYXRvclQgRW5kKSA6IEJhc2VUKEVuZCkge30KKworcHVibGljOgorICB1c2luZyBCYXNlVDo6b3BlcmF0b3IrKzsKKworICBmaWx0ZXJfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgQmFzZVQ6Om9wZXJhdG9yKysoKTsKKyAgICBmaW5kTmV4dFZhbGlkKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJULCB0eXBlbmFtZSBQVD4KKyAgZnJpZW5kIGl0ZXJhdG9yX3JhbmdlPGZpbHRlcl9pdGVyYXRvcjxkZXRhaWw6Okl0ZXJPZlJhbmdlPFJUPiwgUFQ+PgorICBtYWtlX2ZpbHRlcl9yYW5nZShSVCAmJiwgUFQpOworfTsKKworLy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSByYW5nZSBvZiBlbGVtZW50cyBhbmQgYSBwcmVkaWNhdGUsCisvLy8gYW5kIHJldHVybiBhIG5ldyBmaWx0ZXJfaXRlcmF0b3IgcmFuZ2UuCisvLy8KKy8vLyBGSVhNRTogQ3VycmVudGx5IGlmIFJhbmdlVCAmJiBpcyBhIHJ2YWx1ZSByZWZlcmVuY2UgdG8gYSB0ZW1wb3JhcnksIHRoZQorLy8vIGxpZmV0aW1lIG9mIHRoYXQgdGVtcG9yYXJ5IGlzIG5vdCBrZXB0IGJ5IHRoZSByZXR1cm5lZCByYW5nZSBvYmplY3QsIGFuZCB0aGUKKy8vLyB0ZW1wb3JhcnkgaXMgZ29pbmcgdG8gYmUgZHJvcHBlZCBvbiB0aGUgZmxvb3IgYWZ0ZXIgdGhlIG1ha2VfaXRlcmF0b3JfcmFuZ2UKKy8vLyBmdWxsIGV4cHJlc3Npb24gdGhhdCBjb250YWlucyB0aGlzIGZ1bmN0aW9uIGNhbGwuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmFuZ2VULCB0eXBlbmFtZSBQcmVkaWNhdGVUPgoraXRlcmF0b3JfcmFuZ2U8ZmlsdGVyX2l0ZXJhdG9yPGRldGFpbDo6SXRlck9mUmFuZ2U8UmFuZ2VUPiwgUHJlZGljYXRlVD4+CittYWtlX2ZpbHRlcl9yYW5nZShSYW5nZVQgJiZSYW5nZSwgUHJlZGljYXRlVCBQcmVkKSB7CisgIHVzaW5nIEZpbHRlckl0ZXJhdG9yVCA9CisgICAgICBmaWx0ZXJfaXRlcmF0b3I8ZGV0YWlsOjpJdGVyT2ZSYW5nZTxSYW5nZVQ+LCBQcmVkaWNhdGVUPjsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoRmlsdGVySXRlcmF0b3JUKHN0ZDo6YmVnaW4oc3RkOjpmb3J3YXJkPFJhbmdlVD4oUmFuZ2UpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZW5kKHN0ZDo6Zm9yd2FyZDxSYW5nZVQ+KFJhbmdlKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoUHJlZCkpLAorICAgICAgICAgICAgICAgICAgICBGaWx0ZXJJdGVyYXRvclQoc3RkOjplbmQoc3RkOjpmb3J3YXJkPFJhbmdlVD4oUmFuZ2UpKSkpOworfQorCisvLyBmb3J3YXJkIGRlY2xhcmF0aW9ucyByZXF1aXJlZCBieSB6aXBfc2hvcnRlc3QvemlwX2ZpcnN0Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVW5hcnlQcmVkaWNhdGU+Citib29sIGFsbF9vZihSICYmcmFuZ2UsIFVuYXJ5UHJlZGljYXRlIFApOworCit0ZW1wbGF0ZSA8c2l6ZV90Li4uIEk+IHN0cnVjdCBpbmRleF9zZXF1ZW5jZTsKKwordGVtcGxhdGUgPGNsYXNzLi4uIFRzPiBzdHJ1Y3QgaW5kZXhfc2VxdWVuY2VfZm9yOworCituYW1lc3BhY2UgZGV0YWlsIHsKKwordXNpbmcgc3RkOjpkZWNsdmFsOworCisvLyBXZSBoYXZlIHRvIGFsaWFzIHRoaXMgc2luY2UgaW5saW5pbmcgdGhlIGFjdHVhbCB0eXBlIGF0IHRoZSB1c2FnZSBzaXRlCisvLyBpbiB0aGUgcGFyYW1ldGVyIGxpc3Qgb2YgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8PiBiZWxvdyBJQ0VzIE1TVkMgMjAxNy4KK3RlbXBsYXRlPHR5cGVuYW1lLi4uIEl0ZXJzPiBzdHJ1Y3QgWmlwVHVwbGVUeXBlIHsKKyAgdXNpbmcgdHlwZSA9IHN0ZDo6dHVwbGU8ZGVjbHR5cGUoKmRlY2x2YWw8SXRlcnM+KCkpLi4uPjsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBaaXBUeXBlLCB0eXBlbmFtZS4uLiBJdGVycz4KK3VzaW5nIHppcF90cmFpdHMgPSBpdGVyYXRvcl9mYWNhZGVfYmFzZTwKKyAgICBaaXBUeXBlLCB0eXBlbmFtZSBzdGQ6OmNvbW1vbl90eXBlPHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVycz46Oml0ZXJhdG9yX2NhdGVnb3J5Li4uPjo6dHlwZSwKKyAgICAvLyBeIFRPRE86IEltcGxlbWVudCByYW5kb20gYWNjZXNzIG1ldGhvZHMuCisgICAgdHlwZW5hbWUgWmlwVHVwbGVUeXBlPEl0ZXJzLi4uPjo6dHlwZSwKKyAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czx0eXBlbmFtZSBzdGQ6OnR1cGxlX2VsZW1lbnQ8CisgICAgICAgIDAsIHN0ZDo6dHVwbGU8SXRlcnMuLi4+Pjo6dHlwZT46OmRpZmZlcmVuY2VfdHlwZSwKKyAgICAvLyBeIEZJWE1FOiBUaGlzIGZvbGxvd3MgYm9vc3Q6Om1ha2VfemlwX2l0ZXJhdG9yJ3MgYXNzdW1wdGlvbiB0aGF0IGFsbAorICAgIC8vIGlubmVyIGl0ZXJhdG9ycyBoYXZlIHRoZSBzYW1lIGRpZmZlcmVuY2VfdHlwZS4gSXQgd291bGQgZmFpbCBpZiwgZm9yCisgICAgLy8gaW5zdGFuY2UsIHRoZSBzZWNvbmQgZmllbGQncyBkaWZmZXJlbmNlX3R5cGUgd2VyZSBub24tbnVtZXJpYyB3aGlsZSB0aGUKKyAgICAvLyBmaXJzdCBpcy4KKyAgICB0eXBlbmFtZSBaaXBUdXBsZVR5cGU8SXRlcnMuLi4+Ojp0eXBlICosCisgICAgdHlwZW5hbWUgWmlwVHVwbGVUeXBlPEl0ZXJzLi4uPjo6dHlwZT47CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBaaXBUeXBlLCB0eXBlbmFtZS4uLiBJdGVycz4KK3N0cnVjdCB6aXBfY29tbW9uIDogcHVibGljIHppcF90cmFpdHM8WmlwVHlwZSwgSXRlcnMuLi4+IHsKKyAgdXNpbmcgQmFzZSA9IHppcF90cmFpdHM8WmlwVHlwZSwgSXRlcnMuLi4+OworICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgQmFzZTo6dmFsdWVfdHlwZTsKKworICBzdGQ6OnR1cGxlPEl0ZXJzLi4uPiBpdGVyYXRvcnM7CisKK3Byb3RlY3RlZDoKKyAgdGVtcGxhdGUgPHNpemVfdC4uLiBOcz4gdmFsdWVfdHlwZSBkZXJlZihpbmRleF9zZXF1ZW5jZTxOcy4uLj4pIGNvbnN0IHsKKyAgICByZXR1cm4gdmFsdWVfdHlwZSgqc3RkOjpnZXQ8TnM+KGl0ZXJhdG9ycykuLi4pOworICB9CisKKyAgdGVtcGxhdGUgPHNpemVfdC4uLiBOcz4KKyAgZGVjbHR5cGUoaXRlcmF0b3JzKSB0dXBfaW5jKGluZGV4X3NlcXVlbmNlPE5zLi4uPikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnR1cGxlPEl0ZXJzLi4uPihzdGQ6Om5leHQoc3RkOjpnZXQ8TnM+KGl0ZXJhdG9ycykpLi4uKTsKKyAgfQorCisgIHRlbXBsYXRlIDxzaXplX3QuLi4gTnM+CisgIGRlY2x0eXBlKGl0ZXJhdG9ycykgdHVwX2RlYyhpbmRleF9zZXF1ZW5jZTxOcy4uLj4pIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0dXBsZTxJdGVycy4uLj4oc3RkOjpwcmV2KHN0ZDo6Z2V0PE5zPihpdGVyYXRvcnMpKS4uLik7CisgIH0KKworcHVibGljOgorICB6aXBfY29tbW9uKEl0ZXJzICYmLi4uIHRzKSA6IGl0ZXJhdG9ycyhzdGQ6OmZvcndhcmQ8SXRlcnM+KHRzKS4uLikge30KKworICB2YWx1ZV90eXBlIG9wZXJhdG9yKigpIHsgcmV0dXJuIGRlcmVmKGluZGV4X3NlcXVlbmNlX2ZvcjxJdGVycy4uLj57fSk7IH0KKworICBjb25zdCB2YWx1ZV90eXBlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gZGVyZWYoaW5kZXhfc2VxdWVuY2VfZm9yPEl0ZXJzLi4uPnt9KTsKKyAgfQorCisgIFppcFR5cGUgJm9wZXJhdG9yKysoKSB7CisgICAgaXRlcmF0b3JzID0gdHVwX2luYyhpbmRleF9zZXF1ZW5jZV9mb3I8SXRlcnMuLi4+e30pOworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxaaXBUeXBlICo+KHRoaXMpOworICB9CisKKyAgWmlwVHlwZSAmb3BlcmF0b3ItLSgpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KEJhc2U6OklzQmlkaXJlY3Rpb25hbCwKKyAgICAgICAgICAgICAgICAgICJBbGwgaW5uZXIgaXRlcmF0b3JzIG11c3QgYmUgYXQgbGVhc3QgYmlkaXJlY3Rpb25hbC4iKTsKKyAgICBpdGVyYXRvcnMgPSB0dXBfZGVjKGluZGV4X3NlcXVlbmNlX2ZvcjxJdGVycy4uLj57fSk7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFppcFR5cGUgKj4odGhpcyk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBJdGVycz4KK3N0cnVjdCB6aXBfZmlyc3QgOiBwdWJsaWMgemlwX2NvbW1vbjx6aXBfZmlyc3Q8SXRlcnMuLi4+LCBJdGVycy4uLj4geworICB1c2luZyBCYXNlID0gemlwX2NvbW1vbjx6aXBfZmlyc3Q8SXRlcnMuLi4+LCBJdGVycy4uLj47CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHppcF9maXJzdDxJdGVycy4uLj4gJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6Z2V0PDA+KHRoaXMtPml0ZXJhdG9ycykgPT0gc3RkOjpnZXQ8MD4ob3RoZXIuaXRlcmF0b3JzKTsKKyAgfQorCisgIHppcF9maXJzdChJdGVycyAmJi4uLiB0cykgOiBCYXNlKHN0ZDo6Zm9yd2FyZDxJdGVycz4odHMpLi4uKSB7fQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lLi4uIEl0ZXJzPgorY2xhc3MgemlwX3Nob3J0ZXN0IDogcHVibGljIHppcF9jb21tb248emlwX3Nob3J0ZXN0PEl0ZXJzLi4uPiwgSXRlcnMuLi4+IHsKKyAgdGVtcGxhdGUgPHNpemVfdC4uLiBOcz4KKyAgYm9vbCB0ZXN0KGNvbnN0IHppcF9zaG9ydGVzdDxJdGVycy4uLj4gJm90aGVyLCBpbmRleF9zZXF1ZW5jZTxOcy4uLj4pIGNvbnN0IHsKKyAgICByZXR1cm4gYWxsX29mKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxib29sPntzdGQ6OmdldDxOcz4odGhpcy0+aXRlcmF0b3JzKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PE5zPihvdGhlci5pdGVyYXRvcnMpLi4ufSwKKyAgICAgICAgICAgICAgICAgIGlkZW50aXR5PGJvb2w+e30pOworICB9CisKK3B1YmxpYzoKKyAgdXNpbmcgQmFzZSA9IHppcF9jb21tb248emlwX3Nob3J0ZXN0PEl0ZXJzLi4uPiwgSXRlcnMuLi4+OworCisgIHppcF9zaG9ydGVzdChJdGVycyAmJi4uLiB0cykgOiBCYXNlKHN0ZDo6Zm9yd2FyZDxJdGVycz4odHMpLi4uKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCB6aXBfc2hvcnRlc3Q8SXRlcnMuLi4+ICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiAhdGVzdChvdGhlciwgaW5kZXhfc2VxdWVuY2VfZm9yPEl0ZXJzLi4uPnt9KTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHRlbXBsYXRlIDx0eXBlbmFtZS4uLj4gY2xhc3MgSXRUeXBlLCB0eXBlbmFtZS4uLiBBcmdzPiBjbGFzcyB6aXBweSB7CitwdWJsaWM6CisgIHVzaW5nIGl0ZXJhdG9yID0gSXRUeXBlPGRlY2x0eXBlKHN0ZDo6YmVnaW4oc3RkOjpkZWNsdmFsPEFyZ3M+KCkpKS4uLj47CisgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gdHlwZW5hbWUgaXRlcmF0b3I6Oml0ZXJhdG9yX2NhdGVnb3J5OworICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgaXRlcmF0b3I6OnZhbHVlX3R5cGU7CisgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHR5cGVuYW1lIGl0ZXJhdG9yOjpkaWZmZXJlbmNlX3R5cGU7CisgIHVzaW5nIHBvaW50ZXIgPSB0eXBlbmFtZSBpdGVyYXRvcjo6cG9pbnRlcjsKKyAgdXNpbmcgcmVmZXJlbmNlID0gdHlwZW5hbWUgaXRlcmF0b3I6OnJlZmVyZW5jZTsKKworcHJpdmF0ZToKKyAgc3RkOjp0dXBsZTxBcmdzLi4uPiB0czsKKworICB0ZW1wbGF0ZSA8c2l6ZV90Li4uIE5zPiBpdGVyYXRvciBiZWdpbl9pbXBsKGluZGV4X3NlcXVlbmNlPE5zLi4uPikgY29uc3QgeworICAgIHJldHVybiBpdGVyYXRvcihzdGQ6OmJlZ2luKHN0ZDo6Z2V0PE5zPih0cykpLi4uKTsKKyAgfQorICB0ZW1wbGF0ZSA8c2l6ZV90Li4uIE5zPiBpdGVyYXRvciBlbmRfaW1wbChpbmRleF9zZXF1ZW5jZTxOcy4uLj4pIGNvbnN0IHsKKyAgICByZXR1cm4gaXRlcmF0b3Ioc3RkOjplbmQoc3RkOjpnZXQ8TnM+KHRzKSkuLi4pOworICB9CisKK3B1YmxpYzoKKyAgemlwcHkoQXJncyAmJi4uLiB0c18pIDogdHMoc3RkOjpmb3J3YXJkPEFyZ3M+KHRzXykuLi4pIHt9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBiZWdpbl9pbXBsKGluZGV4X3NlcXVlbmNlX2ZvcjxBcmdzLi4uPnt9KTsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBlbmRfaW1wbChpbmRleF9zZXF1ZW5jZV9mb3I8QXJncy4uLj57fSk7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKworLy8vIHppcCBpdGVyYXRvciBmb3IgdHdvIG9yIG1vcmUgaXRlcmF0YWJsZSB0eXBlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBBcmdzPgorZGV0YWlsOjp6aXBweTxkZXRhaWw6OnppcF9zaG9ydGVzdCwgVCwgVSwgQXJncy4uLj4gemlwKFQgJiZ0LCBVICYmdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzICYmLi4uIGFyZ3MpIHsKKyAgcmV0dXJuIGRldGFpbDo6emlwcHk8ZGV0YWlsOjp6aXBfc2hvcnRlc3QsIFQsIFUsIEFyZ3MuLi4+KAorICAgICAgc3RkOjpmb3J3YXJkPFQ+KHQpLCBzdGQ6OmZvcndhcmQ8VT4odSksIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7Cit9CisKKy8vLyB6aXAgaXRlcmF0b3IgdGhhdCwgZm9yIHRoZSBzYWtlIG9mIGVmZmljaWVuY3ksIGFzc3VtZXMgdGhlIGZpcnN0IGl0ZXJhdGVlIHRvCisvLy8gYmUgdGhlIHNob3J0ZXN0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lLi4uIEFyZ3M+CitkZXRhaWw6OnppcHB5PGRldGFpbDo6emlwX2ZpcnN0LCBULCBVLCBBcmdzLi4uPiB6aXBfZmlyc3QoVCAmJnQsIFUgJiZ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3MgJiYuLi4gYXJncykgeworICByZXR1cm4gZGV0YWlsOjp6aXBweTxkZXRhaWw6OnppcF9maXJzdCwgVCwgVSwgQXJncy4uLj4oCisgICAgICBzdGQ6OmZvcndhcmQ8VD4odCksIHN0ZDo6Zm9yd2FyZDxVPih1KSwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKK30KKworLy8vIEl0ZXJhdG9yIHdyYXBwZXIgdGhhdCBjb25jYXRlbmF0ZXMgc2VxdWVuY2VzIHRvZ2V0aGVyLgorLy8vCisvLy8gVGhpcyBjYW4gY29uY2F0ZW5hdGUgZGlmZmVyZW50IGl0ZXJhdG9ycywgZXZlbiB3aXRoIGRpZmZlcmVudCB0eXBlcywgaW50bworLy8vIGEgc2luZ2xlIGl0ZXJhdG9yIHByb3ZpZGVkIHRoZSB2YWx1ZSB0eXBlcyBvZiBhbGwgdGhlIGNvbmNhdGVuYXRlZAorLy8vIGl0ZXJhdG9ycyBleHBvc2UgYHJlZmVyZW5jZWAgYW5kIGBwb2ludGVyYCB0eXBlcyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8KKy8vLyBgVmFsdWVUICZgIGFuZCBgVmFsdWVUICpgIHJlc3BlY3RpdmVseS4gSXQgZG9lc24ndCBzdXBwb3J0IG1vcmUKKy8vLyBpbnRlcmVzdGluZy9jdXN0b21pemVkIHBvaW50ZXIgb3IgcmVmZXJlbmNlIHR5cGVzLgorLy8vCisvLy8gQ3VycmVudGx5IHRoaXMgb25seSBzdXBwb3J0cyBmb3J3YXJkIG9yIGhpZ2hlciBpdGVyYXRvciBjYXRlZ29yaWVzIGFzCisvLy8gaW5wdXRzIGFuZCBhbHdheXMgZXhwb3NlcyBhIGZvcndhcmQgaXRlcmF0b3IgaW50ZXJmYWNlLgordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUuLi4gSXRlclRzPgorY2xhc3MgY29uY2F0X2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8Y29uY2F0X2l0ZXJhdG9yPFZhbHVlVCwgSXRlclRzLi4uPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBWYWx1ZVQ+IHsKKyAgdXNpbmcgQmFzZVQgPSB0eXBlbmFtZSBjb25jYXRfaXRlcmF0b3I6Oml0ZXJhdG9yX2ZhY2FkZV9iYXNlOworCisgIC8vLyBXZSBzdG9yZSBib3RoIHRoZSBjdXJyZW50IGFuZCBlbmQgaXRlcmF0b3JzIGZvciBlYWNoIGNvbmNhdGVuYXRlZAorICAvLy8gc2VxdWVuY2UgaW4gYSB0dXBsZSBvZiBwYWlycy4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgc29tZXRoaW5nIGxpa2UgaXRlcmF0b3JfcmFuZ2Ugc2VlbXMgbmljZSBhdCBmaXJzdCBoZXJlLCBidXQgdGhlCisgIC8vLyByYW5nZSBwcm9wZXJ0aWVzIGFyZSBvZiBsaXR0bGUgYmVuZWZpdCBhbmQgZW5kIHVwIGdldHRpbmcgaW4gdGhlIHdheQorICAvLy8gYmVjYXVzZSB3ZSBuZWVkIHRvIGRvIG11dGF0aW9uIG9uIHRoZSBjdXJyZW50IGl0ZXJhdG9ycy4KKyAgc3RkOjp0dXBsZTxzdGQ6OnBhaXI8SXRlclRzLCBJdGVyVHM+Li4uPiBJdGVyUGFpcnM7CisKKyAgLy8vIEF0dGVtcHRzIHRvIGluY3JlbWVudCBhIHNwZWNpZmljIGl0ZXJhdG9yLgorICAvLy8KKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgYWJsZSB0byBpbmNyZW1lbnQgdGhlIGl0ZXJhdG9yLiBSZXR1cm5zIGZhbHNlIGlmCisgIC8vLyB0aGUgaXRlcmF0b3IgaXMgYWxyZWFkeSBhdCB0aGUgZW5kIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8c2l6ZV90IEluZGV4PiBib29sIGluY3JlbWVudEhlbHBlcigpIHsKKyAgICBhdXRvICZJdGVyUGFpciA9IHN0ZDo6Z2V0PEluZGV4PihJdGVyUGFpcnMpOworICAgIGlmIChJdGVyUGFpci5maXJzdCA9PSBJdGVyUGFpci5zZWNvbmQpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICArK0l0ZXJQYWlyLmZpcnN0OworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIEluY3JlbWVudHMgdGhlIGZpcnN0IG5vbi1lbmQgaXRlcmF0b3IuCisgIC8vLworICAvLy8gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIHdpdGggYWxsIGl0ZXJhdG9ycyBhdCB0aGUgZW5kLgorICB0ZW1wbGF0ZSA8c2l6ZV90Li4uIE5zPiB2b2lkIGluY3JlbWVudChpbmRleF9zZXF1ZW5jZTxOcy4uLj4pIHsKKyAgICAvLyBCdWlsZCBhIHNlcXVlbmNlIG9mIGZ1bmN0aW9ucyB0byBpbmNyZW1lbnQgZWFjaCBpdGVyYXRvciBpZiBwb3NzaWJsZS4KKyAgICBib29sIChjb25jYXRfaXRlcmF0b3I6OipJbmNyZW1lbnRIZWxwZXJGbnNbXSkoKSA9IHsKKyAgICAgICAgJmNvbmNhdF9pdGVyYXRvcjo6aW5jcmVtZW50SGVscGVyPE5zPi4uLn07CisKKyAgICAvLyBMb29wIG92ZXIgdGhlbSwgYW5kIHN0b3AgYXMgc29vbiBhcyB3ZSBzdWNjZWVkIGF0IGluY3JlbWVudGluZyBvbmUuCisgICAgZm9yIChhdXRvICZJbmNyZW1lbnRIZWxwZXJGbiA6IEluY3JlbWVudEhlbHBlckZucykKKyAgICAgIGlmICgodGhpcy0+KkluY3JlbWVudEhlbHBlckZuKSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJBdHRlbXB0ZWQgdG8gaW5jcmVtZW50IGFuIGVuZCBjb25jYXQgaXRlcmF0b3IhIik7CisgIH0KKworICAvLy8gUmV0dXJucyBudWxsIGlmIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgaXMgYXQgdGhlIGVuZC4gT3RoZXJ3aXNlLAorICAvLy8gZGVyZWZlcmVuY2VzIHRoZSBpdGVyYXRvciBhbmQgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVzdWx0aW5nCisgIC8vLyByZWZlcmVuY2UuCisgIHRlbXBsYXRlIDxzaXplX3QgSW5kZXg+IFZhbHVlVCAqZ2V0SGVscGVyKCkgY29uc3QgeworICAgIGF1dG8gJkl0ZXJQYWlyID0gc3RkOjpnZXQ8SW5kZXg+KEl0ZXJQYWlycyk7CisgICAgaWYgKEl0ZXJQYWlyLmZpcnN0ID09IEl0ZXJQYWlyLnNlY29uZCkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgcmV0dXJuICYqSXRlclBhaXIuZmlyc3Q7CisgIH0KKworICAvLy8gRmluZHMgdGhlIGZpcnN0IG5vbi1lbmQgaXRlcmF0b3IsIGRlcmVmZXJlbmNlcywgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZworICAvLy8gcmVmZXJlbmNlLgorICAvLy8KKyAgLy8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyB3aXRoIGFsbCBpdGVyYXRvcnMgYXQgdGhlIGVuZC4KKyAgdGVtcGxhdGUgPHNpemVfdC4uLiBOcz4gVmFsdWVUICZnZXQoaW5kZXhfc2VxdWVuY2U8TnMuLi4+KSBjb25zdCB7CisgICAgLy8gQnVpbGQgYSBzZXF1ZW5jZSBvZiBmdW5jdGlvbnMgdG8gZ2V0IGZyb20gaXRlcmF0b3IgaWYgcG9zc2libGUuCisgICAgVmFsdWVUICooY29uY2F0X2l0ZXJhdG9yOjoqR2V0SGVscGVyRm5zW10pKCkgY29uc3QgPSB7CisgICAgICAgICZjb25jYXRfaXRlcmF0b3I6OmdldEhlbHBlcjxOcz4uLi59OworCisgICAgLy8gTG9vcCBvdmVyIHRoZW0sIGFuZCByZXR1cm4gdGhlIGZpcnN0IHJlc3VsdCB3ZSBmaW5kLgorICAgIGZvciAoYXV0byAmR2V0SGVscGVyRm4gOiBHZXRIZWxwZXJGbnMpCisgICAgICBpZiAoVmFsdWVUICpQID0gKHRoaXMtPipHZXRIZWxwZXJGbikoKSkKKyAgICAgICAgcmV0dXJuICpQOworCisgICAgbGx2bV91bnJlYWNoYWJsZSgiQXR0ZW1wdGVkIHRvIGdldCBhIHBvaW50ZXIgZnJvbSBhbiBlbmQgY29uY2F0IGl0ZXJhdG9yISIpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdHMgYW4gaXRlcmF0b3IgZnJvbSBhIHNxdWVuY2Ugb2YgcmFuZ2VzLgorICAvLy8KKyAgLy8vIFdlIG5lZWQgdGhlIGZ1bGwgcmFuZ2UgdG8ga25vdyBob3cgdG8gc3dpdGNoIGJldHdlZW4gZWFjaCBvZiB0aGUKKyAgLy8vIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFJhbmdlVHM+CisgIGV4cGxpY2l0IGNvbmNhdF9pdGVyYXRvcihSYW5nZVRzICYmLi4uIFJhbmdlcykKKyAgICAgIDogSXRlclBhaXJzKHtzdGQ6OmJlZ2luKFJhbmdlcyksIHN0ZDo6ZW5kKFJhbmdlcyl9Li4uKSB7fQorCisgIHVzaW5nIEJhc2VUOjpvcGVyYXRvcisrOworCisgIGNvbmNhdF9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICBpbmNyZW1lbnQoaW5kZXhfc2VxdWVuY2VfZm9yPEl0ZXJUcy4uLj4oKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVmFsdWVUICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBnZXQoaW5kZXhfc2VxdWVuY2VfZm9yPEl0ZXJUcy4uLj4oKSk7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgY29uY2F0X2l0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gSXRlclBhaXJzID09IFJIUy5JdGVyUGFpcnM7CisgIH0KK307CisKK25hbWVzcGFjZSBkZXRhaWwgeworCisvLy8gSGVscGVyIHRvIHN0b3JlIGEgc2VxdWVuY2Ugb2YgcmFuZ2VzIGJlaW5nIGNvbmNhdGVuYXRlZCBhbmQgYWNjZXNzIHRoZW0uCisvLy8KKy8vLyBUaGlzIGlzIGRlc2lnbmVkIHRvIGZhY2lsaXRhdGUgcHJvdmlkaW5nIGFjdHVhbCBzdG9yYWdlIHdoZW4gdGVtcG9yYXJpZXMKKy8vLyBhcmUgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yIHN1Y2ggdGhhdCB3ZSBjYW4gdXNlIGl0IGFzIHBhcnQgb2YgcmFuZ2UKKy8vLyBiYXNlZCBmb3IgbG9vcHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVULCB0eXBlbmFtZS4uLiBSYW5nZVRzPiBjbGFzcyBjb25jYXRfcmFuZ2UgeworcHVibGljOgorICB1c2luZyBpdGVyYXRvciA9CisgICAgICBjb25jYXRfaXRlcmF0b3I8VmFsdWVULAorICAgICAgICAgICAgICAgICAgICAgIGRlY2x0eXBlKHN0ZDo6YmVnaW4oc3RkOjpkZWNsdmFsPFJhbmdlVHMgJj4oKSkpLi4uPjsKKworcHJpdmF0ZToKKyAgc3RkOjp0dXBsZTxSYW5nZVRzLi4uPiBSYW5nZXM7CisKKyAgdGVtcGxhdGUgPHNpemVfdC4uLiBOcz4gaXRlcmF0b3IgYmVnaW5faW1wbChpbmRleF9zZXF1ZW5jZTxOcy4uLj4pIHsKKyAgICByZXR1cm4gaXRlcmF0b3Ioc3RkOjpnZXQ8TnM+KFJhbmdlcykuLi4pOworICB9CisgIHRlbXBsYXRlIDxzaXplX3QuLi4gTnM+IGl0ZXJhdG9yIGVuZF9pbXBsKGluZGV4X3NlcXVlbmNlPE5zLi4uPikgeworICAgIHJldHVybiBpdGVyYXRvcihtYWtlX3JhbmdlKHN0ZDo6ZW5kKHN0ZDo6Z2V0PE5zPihSYW5nZXMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZChzdGQ6OmdldDxOcz4oUmFuZ2VzKSkpLi4uKTsKKyAgfQorCitwdWJsaWM6CisgIGNvbmNhdF9yYW5nZShSYW5nZVRzICYmLi4uIFJhbmdlcykKKyAgICAgIDogUmFuZ2VzKHN0ZDo6Zm9yd2FyZDxSYW5nZVRzPihSYW5nZXMpLi4uKSB7fQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gYmVnaW5faW1wbChpbmRleF9zZXF1ZW5jZV9mb3I8UmFuZ2VUcy4uLj57fSk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gZW5kX2ltcGwoaW5kZXhfc2VxdWVuY2VfZm9yPFJhbmdlVHMuLi4+e30pOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKKy8vLyBDb25jYXRlbmF0ZWQgcmFuZ2UgYWNyb3NzIHR3byBvciBtb3JlIHJhbmdlcy4KKy8vLworLy8vIFRoZSBkZXNpcmVkIHZhbHVlIHR5cGUgbXVzdCBiZSBleHBsaWNpdGx5IHNwZWNpZmllZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVQsIHR5cGVuYW1lLi4uIFJhbmdlVHM+CitkZXRhaWw6OmNvbmNhdF9yYW5nZTxWYWx1ZVQsIFJhbmdlVHMuLi4+IGNvbmNhdChSYW5nZVRzICYmLi4uIFJhbmdlcykgeworICBzdGF0aWNfYXNzZXJ0KHNpemVvZi4uLihSYW5nZVRzKSA+IDEsCisgICAgICAgICAgICAgICAgIk5lZWQgbW9yZSB0aGFuIG9uZSByYW5nZSB0byBjb25jYXRlbmF0ZSEiKTsKKyAgcmV0dXJuIGRldGFpbDo6Y29uY2F0X3JhbmdlPFZhbHVlVCwgUmFuZ2VUcy4uLj4oCisgICAgICBzdGQ6OmZvcndhcmQ8UmFuZ2VUcz4oUmFuZ2VzKS4uLik7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgRXh0cmEgYWRkaXRpb25zIHRvIDx1dGlsaXR5PgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFxicmllZiBGdW5jdGlvbiBvYmplY3QgdG8gY2hlY2sgd2hldGhlciB0aGUgZmlyc3QgY29tcG9uZW50IG9mIGEgc3RkOjpwYWlyCisvLy8gY29tcGFyZXMgbGVzcyB0aGFuIHRoZSBmaXJzdCBjb21wb25lbnQgb2YgYW5vdGhlciBzdGQ6OnBhaXIuCitzdHJ1Y3QgbGVzc19maXJzdCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBib29sIG9wZXJhdG9yKCkoY29uc3QgVCAmbGhzLCBjb25zdCBUICZyaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gbGhzLmZpcnN0IDwgcmhzLmZpcnN0OworICB9Cit9OworCisvLy8gXGJyaWVmIEZ1bmN0aW9uIG9iamVjdCB0byBjaGVjayB3aGV0aGVyIHRoZSBzZWNvbmQgY29tcG9uZW50IG9mIGEgc3RkOjpwYWlyCisvLy8gY29tcGFyZXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQgY29tcG9uZW50IG9mIGFub3RoZXIgc3RkOjpwYWlyLgorc3RydWN0IGxlc3Nfc2Vjb25kIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3IoKShjb25zdCBUICZsaHMsIGNvbnN0IFQgJnJocykgY29uc3QgeworICAgIHJldHVybiBsaHMuc2Vjb25kIDwgcmhzLnNlY29uZDsKKyAgfQorfTsKKworLy8gQSBzdWJzZXQgb2YgTjM2NTguIE1vcmUgc3R1ZmYgY2FuIGJlIGFkZGVkIGFzLW5lZWRlZC4KKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgY29tcGlsZS10aW1lIHNlcXVlbmNlIG9mIGludGVnZXJzLgordGVtcGxhdGUgPGNsYXNzIFQsIFQuLi4gST4gc3RydWN0IGludGVnZXJfc2VxdWVuY2UgeworICB1c2luZyB2YWx1ZV90eXBlID0gVDsKKworICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBzaXplKCkgeyByZXR1cm4gc2l6ZW9mLi4uKEkpOyB9Cit9OworCisvLy8gXGJyaWVmIEFsaWFzIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgYSBzZXF1ZW5jZSBvZiBzaXplX3RzLgordGVtcGxhdGUgPHNpemVfdC4uLiBJPgorc3RydWN0IGluZGV4X3NlcXVlbmNlIDogaW50ZWdlcl9zZXF1ZW5jZTxzdGQ6OnNpemVfdCwgSS4uLj4ge307CisKK3RlbXBsYXRlIDxzdGQ6OnNpemVfdCBOLCBzdGQ6OnNpemVfdC4uLiBJPgorc3RydWN0IGJ1aWxkX2luZGV4X2ltcGwgOiBidWlsZF9pbmRleF9pbXBsPE4gLSAxLCBOIC0gMSwgSS4uLj4ge307Cit0ZW1wbGF0ZSA8c3RkOjpzaXplX3QuLi4gST4KK3N0cnVjdCBidWlsZF9pbmRleF9pbXBsPDAsIEkuLi4+IDogaW5kZXhfc2VxdWVuY2U8SS4uLj4ge307CisKKy8vLyBcYnJpZWYgQ3JlYXRlcyBhIGNvbXBpbGUtdGltZSBpbnRlZ2VyIHNlcXVlbmNlIGZvciBhIHBhcmFtZXRlciBwYWNrLgordGVtcGxhdGUgPGNsYXNzLi4uIFRzPgorc3RydWN0IGluZGV4X3NlcXVlbmNlX2ZvciA6IGJ1aWxkX2luZGV4X2ltcGw8c2l6ZW9mLi4uKFRzKT4ge307CisKKy8vLyBVdGlsaXR5IHR5cGUgdG8gYnVpbGQgYW4gaW5oZXJpdGFuY2UgY2hhaW4gdGhhdCBtYWtlcyBpdCBlYXN5IHRvIHJhbmsKKy8vLyBvdmVybG9hZCBjYW5kaWRhdGVzLgordGVtcGxhdGUgPGludCBOPiBzdHJ1Y3QgcmFuayA6IHJhbms8TiAtIDE+IHt9OwordGVtcGxhdGUgPD4gc3RydWN0IHJhbms8MD4ge307CisKKy8vLyBcYnJpZWYgdHJhaXRzIGNsYXNzIGZvciBjaGVja2luZyB3aGV0aGVyIHR5cGUgVCBpcyBvbmUgb2YgYW55IG9mIHRoZSBnaXZlbgorLy8vIHR5cGVzIGluIHRoZSB2YXJpYWRpYyBsaXN0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFRzPiBzdHJ1Y3QgaXNfb25lX29mIHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBUcz4KK3N0cnVjdCBpc19vbmVfb2Y8VCwgVSwgVHMuLi4+IHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPQorICAgICAgc3RkOjppc19zYW1lPFQsIFU+Ojp2YWx1ZSB8fCBpc19vbmVfb2Y8VCwgVHMuLi4+Ojp2YWx1ZTsKK307CisKKy8vLyBcYnJpZWYgdHJhaXRzIGNsYXNzIGZvciBjaGVja2luZyB3aGV0aGVyIHR5cGUgVCBpcyBhIGJhc2UgY2xhc3MgZm9yIGFsbAorLy8vICB0aGUgZ2l2ZW4gdHlwZXMgaW4gdGhlIHZhcmlhZGljIGxpc3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gVHM+IHN0cnVjdCBhcmVfYmFzZV9vZiB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBUcz4KK3N0cnVjdCBhcmVfYmFzZV9vZjxULCBVLCBUcy4uLj4geworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9CisgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8VCwgVT46OnZhbHVlICYmIGFyZV9iYXNlX29mPFQsIFRzLi4uPjo6dmFsdWU7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgIEV4dHJhIGFkZGl0aW9ucyBmb3IgYXJyYXlzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gRmluZCB0aGUgbGVuZ3RoIG9mIGFuIGFycmF5LgordGVtcGxhdGUgPGNsYXNzIFQsIHN0ZDo6c2l6ZV90IE4+Citjb25zdGV4cHIgaW5saW5lIHNpemVfdCBhcnJheV9sZW5ndGhvZihUICgmKVtOXSkgeworICByZXR1cm4gTjsKK30KKworLy8vIEFkYXB0IHN0ZDo6bGVzczxUPiBmb3IgYXJyYXlfcG9kX3NvcnQuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIGludCBhcnJheV9wb2Rfc29ydF9jb21wYXJhdG9yKGNvbnN0IHZvaWQgKlAxLCBjb25zdCB2b2lkICpQMikgeworICBpZiAoc3RkOjpsZXNzPFQ+KCkoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KFAxKSwKKyAgICAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQqPihQMikpKQorICAgIHJldHVybiAtMTsKKyAgaWYgKHN0ZDo6bGVzczxUPigpKCpyZWludGVycHJldF9jYXN0PGNvbnN0IFQqPihQMiksCisgICAgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4oUDEpKSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vLyBnZXRfYXJyYXlfcG9kX3NvcnRfY29tcGFyYXRvciAtIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8KKy8vLyBnZXQgdHlwZSBkZWR1Y3Rpb24gb2YgVCByaWdodC4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgaW50ICgqZ2V0X2FycmF5X3BvZF9zb3J0X2NvbXBhcmF0b3IoY29uc3QgVCAmKSkKKyAgICAgICAgICAgICAoY29uc3Qgdm9pZCosIGNvbnN0IHZvaWQqKSB7CisgIHJldHVybiBhcnJheV9wb2Rfc29ydF9jb21wYXJhdG9yPFQ+OworfQorCisvLy8gYXJyYXlfcG9kX3NvcnQgLSBUaGlzIHNvcnRzIGFuIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBzdGFydCBhbmQgZW5kCisvLy8gZXh0ZW50LiAgVGhpcyBpcyBqdXN0IGxpa2Ugc3RkOjpzb3J0LCBleGNlcHQgdGhhdCBpdCBjYWxscyBxc29ydCBpbnN0ZWFkIG9mCisvLy8gdXNpbmcgYW4gaW5saW5lZCB0ZW1wbGF0ZS4gIHFzb3J0IGlzIHNsaWdodGx5IHNsb3dlciB0aGFuIHN0ZDo6c29ydCwgYnV0CisvLy8gbW9zdCBzb3J0cyBhcmUgbm90IHBlcmZvcm1hbmNlIGNyaXRpY2FsIGluIExMVk0gYW5kIHN0ZDo6c29ydCBoYXMgdG8gYmUKKy8vLyB0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQgZm9yIGVhY2ggdHlwZSwgbGVhZGluZyB0byBzaWduaWZpY2FudCBtZWFzdXJlZCBjb2RlCisvLy8gYmxvYXQuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBnZW5lcmFsbHkgYmUgdXNlZCBpbnN0ZWFkIG9mIHN0ZDo6c29ydCB3aGVyZQorLy8vIHBvc3NpYmxlLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgeW91IGhhdmUgc2ltcGxlIFBPRC1saWtlIHR5cGVzIHRoYXQgY2FuIGJlCisvLy8gY29tcGFyZWQgd2l0aCBzdGQ6Omxlc3MgYW5kIGNhbiBiZSBtb3ZlZCB3aXRoIG1lbWNweS4gIElmIHRoaXMgaXNuJ3QgdHJ1ZSwKKy8vLyB5b3Ugc2hvdWxkIHVzZSBzdGQ6OnNvcnQuCisvLy8KKy8vLyBOT1RFOiBJZiBxc29ydF9yIHdlcmUgcG9ydGFibGUsIHdlIGNvdWxkIGFsbG93IGEgY3VzdG9tIGNvbXBhcmF0b3IgYW5kCisvLy8gZGVmYXVsdCB0byBzdGQ6Omxlc3MuCit0ZW1wbGF0ZTxjbGFzcyBJdGVyYXRvclR5PgoraW5saW5lIHZvaWQgYXJyYXlfcG9kX3NvcnQoSXRlcmF0b3JUeSBTdGFydCwgSXRlcmF0b3JUeSBFbmQpIHsKKyAgLy8gRG9uJ3QgaW5lZmZpY2llbnRseSBjYWxsIHFzb3J0IHdpdGggb25lIGVsZW1lbnQgb3IgdHJpZ2dlciB1bmRlZmluZWQKKyAgLy8gYmVoYXZpb3Igd2l0aCBhbiBlbXB0eSBzZXF1ZW5jZS4KKyAgYXV0byBORWx0cyA9IEVuZCAtIFN0YXJ0OworICBpZiAoTkVsdHMgPD0gMSkgcmV0dXJuOworI2lmZGVmIEVYUEVOU0lWRV9DSEVDS1MKKyAgc3RkOjptdDE5OTM3IEdlbmVyYXRvcihzdGQ6OnJhbmRvbV9kZXZpY2V7fSgpKTsKKyAgc3RkOjpzaHVmZmxlKFN0YXJ0LCBFbmQsIEdlbmVyYXRvcik7CisjZW5kaWYKKyAgcXNvcnQoJipTdGFydCwgTkVsdHMsIHNpemVvZigqU3RhcnQpLCBnZXRfYXJyYXlfcG9kX3NvcnRfY29tcGFyYXRvcigqU3RhcnQpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yVHk+CitpbmxpbmUgdm9pZCBhcnJheV9wb2Rfc29ydCgKKyAgICBJdGVyYXRvclR5IFN0YXJ0LCBJdGVyYXRvclR5IEVuZCwKKyAgICBpbnQgKCpDb21wYXJlKSgKKyAgICAgICAgY29uc3QgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SXRlcmF0b3JUeT46OnZhbHVlX3R5cGUgKiwKKyAgICAgICAgY29uc3QgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SXRlcmF0b3JUeT46OnZhbHVlX3R5cGUgKikpIHsKKyAgLy8gRG9uJ3QgaW5lZmZpY2llbnRseSBjYWxsIHFzb3J0IHdpdGggb25lIGVsZW1lbnQgb3IgdHJpZ2dlciB1bmRlZmluZWQKKyAgLy8gYmVoYXZpb3Igd2l0aCBhbiBlbXB0eSBzZXF1ZW5jZS4KKyAgYXV0byBORWx0cyA9IEVuZCAtIFN0YXJ0OworICBpZiAoTkVsdHMgPD0gMSkgcmV0dXJuOworI2lmZGVmIEVYUEVOU0lWRV9DSEVDS1MKKyAgc3RkOjptdDE5OTM3IEdlbmVyYXRvcihzdGQ6OnJhbmRvbV9kZXZpY2V7fSgpKTsKKyAgc3RkOjpzaHVmZmxlKFN0YXJ0LCBFbmQsIEdlbmVyYXRvcik7CisjZW5kaWYKKyAgcXNvcnQoJipTdGFydCwgTkVsdHMsIHNpemVvZigqU3RhcnQpLAorICAgICAgICByZWludGVycHJldF9jYXN0PGludCAoKikoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopPihDb21wYXJlKSk7Cit9CisKKy8vIFByb3ZpZGUgd3JhcHBlcnMgdG8gc3RkOjpzb3J0IHdoaWNoIHNodWZmbGUgdGhlIGVsZW1lbnRzIGJlZm9yZSBzb3J0aW5nCisvLyB0byBoZWxwIHVuY292ZXIgbm9uLWRldGVybWluaXN0aWMgYmVoYXZpb3IgKFBSMzUxMzUpLgordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yVHk+CitpbmxpbmUgdm9pZCBzb3J0KEl0ZXJhdG9yVHkgU3RhcnQsIEl0ZXJhdG9yVHkgRW5kKSB7CisjaWZkZWYgRVhQRU5TSVZFX0NIRUNLUworICBzdGQ6Om10MTk5MzcgR2VuZXJhdG9yKHN0ZDo6cmFuZG9tX2RldmljZXt9KCkpOworICBzdGQ6OnNodWZmbGUoU3RhcnQsIEVuZCwgR2VuZXJhdG9yKTsKKyNlbmRpZgorICBzdGQ6OnNvcnQoU3RhcnQsIEVuZCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvclR5LCB0eXBlbmFtZSBDb21wYXJlPgoraW5saW5lIHZvaWQgc29ydChJdGVyYXRvclR5IFN0YXJ0LCBJdGVyYXRvclR5IEVuZCwgQ29tcGFyZSBDb21wKSB7CisjaWZkZWYgRVhQRU5TSVZFX0NIRUNLUworICBzdGQ6Om10MTk5MzcgR2VuZXJhdG9yKHN0ZDo6cmFuZG9tX2RldmljZXt9KCkpOworICBzdGQ6OnNodWZmbGUoU3RhcnQsIEVuZCwgR2VuZXJhdG9yKTsKKyNlbmRpZgorICBzdGQ6OnNvcnQoU3RhcnQsIEVuZCwgQ29tcCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgRXh0cmEgYWRkaXRpb25zIHRvIDxhbGdvcml0aG0+CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gRm9yIGEgY29udGFpbmVyIG9mIHBvaW50ZXJzLCBkZWxldGVzIHRoZSBwb2ludGVycyBhbmQgdGhlbiBjbGVhcnMgdGhlCisvLy8gY29udGFpbmVyLgordGVtcGxhdGU8dHlwZW5hbWUgQ29udGFpbmVyPgordm9pZCBEZWxldGVDb250YWluZXJQb2ludGVycyhDb250YWluZXIgJkMpIHsKKyAgZm9yIChhdXRvIFYgOiBDKQorICAgIGRlbGV0ZSBWOworICBDLmNsZWFyKCk7Cit9CisKKy8vLyBJbiBhIGNvbnRhaW5lciBvZiBwYWlycyAodXN1YWxseSBhIG1hcCkgd2hvc2Ugc2Vjb25kIGVsZW1lbnQgaXMgYSBwb2ludGVyLAorLy8vIGRlbGV0ZXMgdGhlIHNlY29uZCBlbGVtZW50cyBhbmQgdGhlbiBjbGVhcnMgdGhlIGNvbnRhaW5lci4KK3RlbXBsYXRlPHR5cGVuYW1lIENvbnRhaW5lcj4KK3ZvaWQgRGVsZXRlQ29udGFpbmVyU2Vjb25kcyhDb250YWluZXIgJkMpIHsKKyAgZm9yIChhdXRvICZWIDogQykKKyAgICBkZWxldGUgVi5zZWNvbmQ7CisgIEMuY2xlYXIoKTsKK30KKworLy8vIFByb3ZpZGUgd3JhcHBlcnMgdG8gc3RkOjpmb3JfZWFjaCB3aGljaCB0YWtlIHJhbmdlcyBpbnN0ZWFkIG9mIGhhdmluZyB0bworLy8vIHBhc3MgYmVnaW4vZW5kIGV4cGxpY2l0bHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVW5hcnlQcmVkaWNhdGU+CitVbmFyeVByZWRpY2F0ZSBmb3JfZWFjaChSICYmUmFuZ2UsIFVuYXJ5UHJlZGljYXRlIFApIHsKKyAgcmV0dXJuIHN0ZDo6Zm9yX2VhY2goYWRsX2JlZ2luKFJhbmdlKSwgYWRsX2VuZChSYW5nZSksIFApOworfQorCisvLy8gUHJvdmlkZSB3cmFwcGVycyB0byBzdGQ6OmFsbF9vZiB3aGljaCB0YWtlIHJhbmdlcyBpbnN0ZWFkIG9mIGhhdmluZyB0byBwYXNzCisvLy8gYmVnaW4vZW5kIGV4cGxpY2l0bHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVW5hcnlQcmVkaWNhdGU+Citib29sIGFsbF9vZihSICYmUmFuZ2UsIFVuYXJ5UHJlZGljYXRlIFApIHsKKyAgcmV0dXJuIHN0ZDo6YWxsX29mKGFkbF9iZWdpbihSYW5nZSksIGFkbF9lbmQoUmFuZ2UpLCBQKTsKK30KKworLy8vIFByb3ZpZGUgd3JhcHBlcnMgdG8gc3RkOjphbnlfb2Ygd2hpY2ggdGFrZSByYW5nZXMgaW5zdGVhZCBvZiBoYXZpbmcgdG8gcGFzcworLy8vIGJlZ2luL2VuZCBleHBsaWNpdGx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFVuYXJ5UHJlZGljYXRlPgorYm9vbCBhbnlfb2YoUiAmJlJhbmdlLCBVbmFyeVByZWRpY2F0ZSBQKSB7CisgIHJldHVybiBzdGQ6OmFueV9vZihhZGxfYmVnaW4oUmFuZ2UpLCBhZGxfZW5kKFJhbmdlKSwgUCk7Cit9CisKKy8vLyBQcm92aWRlIHdyYXBwZXJzIHRvIHN0ZDo6bm9uZV9vZiB3aGljaCB0YWtlIHJhbmdlcyBpbnN0ZWFkIG9mIGhhdmluZyB0byBwYXNzCisvLy8gYmVnaW4vZW5kIGV4cGxpY2l0bHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVW5hcnlQcmVkaWNhdGU+Citib29sIG5vbmVfb2YoUiAmJlJhbmdlLCBVbmFyeVByZWRpY2F0ZSBQKSB7CisgIHJldHVybiBzdGQ6Om5vbmVfb2YoYWRsX2JlZ2luKFJhbmdlKSwgYWRsX2VuZChSYW5nZSksIFApOworfQorCisvLy8gUHJvdmlkZSB3cmFwcGVycyB0byBzdGQ6OmZpbmQgd2hpY2ggdGFrZSByYW5nZXMgaW5zdGVhZCBvZiBoYXZpbmcgdG8gcGFzcworLy8vIGJlZ2luL2VuZCBleHBsaWNpdGx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQ+CithdXRvIGZpbmQoUiAmJlJhbmdlLCBjb25zdCBUICZWYWwpIC0+IGRlY2x0eXBlKGFkbF9iZWdpbihSYW5nZSkpIHsKKyAgcmV0dXJuIHN0ZDo6ZmluZChhZGxfYmVnaW4oUmFuZ2UpLCBhZGxfZW5kKFJhbmdlKSwgVmFsKTsKK30KKworLy8vIFByb3ZpZGUgd3JhcHBlcnMgdG8gc3RkOjpmaW5kX2lmIHdoaWNoIHRha2UgcmFuZ2VzIGluc3RlYWQgb2YgaGF2aW5nIHRvIHBhc3MKKy8vLyBiZWdpbi9lbmQgZXhwbGljaXRseS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBVbmFyeVByZWRpY2F0ZT4KK2F1dG8gZmluZF9pZihSICYmUmFuZ2UsIFVuYXJ5UHJlZGljYXRlIFApIC0+IGRlY2x0eXBlKGFkbF9iZWdpbihSYW5nZSkpIHsKKyAgcmV0dXJuIHN0ZDo6ZmluZF9pZihhZGxfYmVnaW4oUmFuZ2UpLCBhZGxfZW5kKFJhbmdlKSwgUCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBVbmFyeVByZWRpY2F0ZT4KK2F1dG8gZmluZF9pZl9ub3QoUiAmJlJhbmdlLCBVbmFyeVByZWRpY2F0ZSBQKSAtPiBkZWNsdHlwZShhZGxfYmVnaW4oUmFuZ2UpKSB7CisgIHJldHVybiBzdGQ6OmZpbmRfaWZfbm90KGFkbF9iZWdpbihSYW5nZSksIGFkbF9lbmQoUmFuZ2UpLCBQKTsKK30KKworLy8vIFByb3ZpZGUgd3JhcHBlcnMgdG8gc3RkOjpyZW1vdmVfaWYgd2hpY2ggdGFrZSByYW5nZXMgaW5zdGVhZCBvZiBoYXZpbmcgdG8KKy8vLyBwYXNzIGJlZ2luL2VuZCBleHBsaWNpdGx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFVuYXJ5UHJlZGljYXRlPgorYXV0byByZW1vdmVfaWYoUiAmJlJhbmdlLCBVbmFyeVByZWRpY2F0ZSBQKSAtPiBkZWNsdHlwZShhZGxfYmVnaW4oUmFuZ2UpKSB7CisgIHJldHVybiBzdGQ6OnJlbW92ZV9pZihhZGxfYmVnaW4oUmFuZ2UpLCBhZGxfZW5kKFJhbmdlKSwgUCk7Cit9CisKKy8vLyBQcm92aWRlIHdyYXBwZXJzIHRvIHN0ZDo6Y29weV9pZiB3aGljaCB0YWtlIHJhbmdlcyBpbnN0ZWFkIG9mIGhhdmluZyB0bworLy8vIHBhc3MgYmVnaW4vZW5kIGV4cGxpY2l0bHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgT3V0cHV0SXQsIHR5cGVuYW1lIFVuYXJ5UHJlZGljYXRlPgorT3V0cHV0SXQgY29weV9pZihSICYmUmFuZ2UsIE91dHB1dEl0IE91dCwgVW5hcnlQcmVkaWNhdGUgUCkgeworICByZXR1cm4gc3RkOjpjb3B5X2lmKGFkbF9iZWdpbihSYW5nZSksIGFkbF9lbmQoUmFuZ2UpLCBPdXQsIFApOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgT3V0cHV0SXQ+CitPdXRwdXRJdCBjb3B5KFIgJiZSYW5nZSwgT3V0cHV0SXQgT3V0KSB7CisgIHJldHVybiBzdGQ6OmNvcHkoYWRsX2JlZ2luKFJhbmdlKSwgYWRsX2VuZChSYW5nZSksIE91dCk7Cit9CisKKy8vLyBXcmFwcGVyIGZ1bmN0aW9uIGFyb3VuZCBzdGQ6OmZpbmQgdG8gZGV0ZWN0IGlmIGFuIGVsZW1lbnQgZXhpc3RzCisvLy8gaW4gYSBjb250YWluZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgRT4KK2Jvb2wgaXNfY29udGFpbmVkKFIgJiZSYW5nZSwgY29uc3QgRSAmRWxlbWVudCkgeworICByZXR1cm4gc3RkOjpmaW5kKGFkbF9iZWdpbihSYW5nZSksIGFkbF9lbmQoUmFuZ2UpLCBFbGVtZW50KSAhPSBhZGxfZW5kKFJhbmdlKTsKK30KKworLy8vIFdyYXBwZXIgZnVuY3Rpb24gYXJvdW5kIHN0ZDo6Y291bnQgdG8gY291bnQgdGhlIG51bWJlciBvZiB0aW1lcyBhbiBlbGVtZW50CisvLy8gXHAgRWxlbWVudCBvY2N1cnMgaW4gdGhlIGdpdmVuIHJhbmdlIFxwIFJhbmdlLgordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEU+CithdXRvIGNvdW50KFIgJiZSYW5nZSwgY29uc3QgRSAmRWxlbWVudCkgLT4KKyAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxkZWNsdHlwZShhZGxfYmVnaW4oUmFuZ2UpKT46OmRpZmZlcmVuY2VfdHlwZSB7CisgIHJldHVybiBzdGQ6OmNvdW50KGFkbF9iZWdpbihSYW5nZSksIGFkbF9lbmQoUmFuZ2UpLCBFbGVtZW50KTsKK30KKworLy8vIFdyYXBwZXIgZnVuY3Rpb24gYXJvdW5kIHN0ZDo6Y291bnRfaWYgdG8gY291bnQgdGhlIG51bWJlciBvZiB0aW1lcyBhbgorLy8vIGVsZW1lbnQgc2F0aXNmeWluZyBhIGdpdmVuIHByZWRpY2F0ZSBvY2N1cnMgaW4gYSByYW5nZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBVbmFyeVByZWRpY2F0ZT4KK2F1dG8gY291bnRfaWYoUiAmJlJhbmdlLCBVbmFyeVByZWRpY2F0ZSBQKSAtPgorICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPGRlY2x0eXBlKGFkbF9iZWdpbihSYW5nZSkpPjo6ZGlmZmVyZW5jZV90eXBlIHsKKyAgcmV0dXJuIHN0ZDo6Y291bnRfaWYoYWRsX2JlZ2luKFJhbmdlKSwgYWRsX2VuZChSYW5nZSksIFApOworfQorCisvLy8gV3JhcHBlciBmdW5jdGlvbiBhcm91bmQgc3RkOjp0cmFuc2Zvcm0gdG8gYXBwbHkgYSBmdW5jdGlvbiB0byBhIHJhbmdlIGFuZAorLy8vIHN0b3JlIHRoZSByZXN1bHQgZWxzZXdoZXJlLgordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIE91dHB1dEl0LCB0eXBlbmFtZSBVbmFyeVByZWRpY2F0ZT4KK091dHB1dEl0IHRyYW5zZm9ybShSICYmUmFuZ2UsIE91dHB1dEl0IGRfZmlyc3QsIFVuYXJ5UHJlZGljYXRlIFApIHsKKyAgcmV0dXJuIHN0ZDo6dHJhbnNmb3JtKGFkbF9iZWdpbihSYW5nZSksIGFkbF9lbmQoUmFuZ2UpLCBkX2ZpcnN0LCBQKTsKK30KKworLy8vIFByb3ZpZGUgd3JhcHBlcnMgdG8gc3RkOjpwYXJ0aXRpb24gd2hpY2ggdGFrZSByYW5nZXMgaW5zdGVhZCBvZiBoYXZpbmcgdG8KKy8vLyBwYXNzIGJlZ2luL2VuZCBleHBsaWNpdGx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFVuYXJ5UHJlZGljYXRlPgorYXV0byBwYXJ0aXRpb24oUiAmJlJhbmdlLCBVbmFyeVByZWRpY2F0ZSBQKSAtPiBkZWNsdHlwZShhZGxfYmVnaW4oUmFuZ2UpKSB7CisgIHJldHVybiBzdGQ6OnBhcnRpdGlvbihhZGxfYmVnaW4oUmFuZ2UpLCBhZGxfZW5kKFJhbmdlKSwgUCk7Cit9CisKKy8vLyBQcm92aWRlIHdyYXBwZXJzIHRvIHN0ZDo6bG93ZXJfYm91bmQgd2hpY2ggdGFrZSByYW5nZXMgaW5zdGVhZCBvZiBoYXZpbmcgdG8KKy8vLyBwYXNzIGJlZ2luL2VuZCBleHBsaWNpdGx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEZvcndhcmRJdD4KK2F1dG8gbG93ZXJfYm91bmQoUiAmJlJhbmdlLCBGb3J3YXJkSXQgSSkgLT4gZGVjbHR5cGUoYWRsX2JlZ2luKFJhbmdlKSkgeworICByZXR1cm4gc3RkOjpsb3dlcl9ib3VuZChhZGxfYmVnaW4oUmFuZ2UpLCBhZGxfZW5kKFJhbmdlKSwgSSk7Cit9CisKKy8vLyBcYnJpZWYgR2l2ZW4gYSByYW5nZSBvZiB0eXBlIFIsIGl0ZXJhdGUgdGhlIGVudGlyZSByYW5nZSBhbmQgcmV0dXJuIGEKKy8vLyBTbWFsbFZlY3RvciB3aXRoIGVsZW1lbnRzIG9mIHRoZSB2ZWN0b3IuICBUaGlzIGlzIHVzZWZ1bCwgZm9yIGV4YW1wbGUsCisvLy8gd2hlbiB5b3Ugd2FudCB0byBpdGVyYXRlIGEgcmFuZ2UgYW5kIHRoZW4gc29ydCB0aGUgcmVzdWx0cy4KK3RlbXBsYXRlIDx1bnNpZ25lZCBTaXplLCB0eXBlbmFtZSBSPgorU21hbGxWZWN0b3I8dHlwZW5hbWUgc3RkOjpyZW1vdmVfY29uc3Q8ZGV0YWlsOjpWYWx1ZU9mUmFuZ2U8Uj4+Ojp0eXBlLCBTaXplPgordG9fdmVjdG9yKFIgJiZSYW5nZSkgeworICByZXR1cm4ge2FkbF9iZWdpbihSYW5nZSksIGFkbF9lbmQoUmFuZ2UpfTsKK30KKworLy8vIFByb3ZpZGUgYSBjb250YWluZXIgYWxnb3JpdGhtIHNpbWlsYXIgdG8gQysrIExpYnJhcnkgRnVuZGFtZW50YWxzIHYyJ3MKKy8vLyBgZXJhc2VfaWZgIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG86CisvLy8KKy8vLyAgIEMuZXJhc2UocmVtb3ZlX2lmKEMsIHByZWQpLCBDLmVuZCgpKTsKKy8vLworLy8vIFRoaXMgdmVyc2lvbiB3b3JrcyBmb3IgYW55IGNvbnRhaW5lciB3aXRoIGFuIGVyYXNlIG1ldGhvZCBjYWxsIGFjY2VwdGluZworLy8vIHR3byBpdGVyYXRvcnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyLCB0eXBlbmFtZSBVbmFyeVByZWRpY2F0ZT4KK3ZvaWQgZXJhc2VfaWYoQ29udGFpbmVyICZDLCBVbmFyeVByZWRpY2F0ZSBQKSB7CisgIEMuZXJhc2UocmVtb3ZlX2lmKEMsIFApLCBDLmVuZCgpKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICBFeHRyYSBhZGRpdGlvbnMgdG8gPG1lbW9yeT4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIEltcGxlbWVudCBtYWtlX3VuaXF1ZSBhY2NvcmRpbmcgdG8gTjM2NTYuCisKKy8vLyBcYnJpZWYgQ29uc3RydWN0cyBhIGBuZXcgVCgpYCB3aXRoIHRoZSBnaXZlbiBhcmdzIGFuZCByZXR1cm5zIGEKKy8vLyAgICAgICAgYHVuaXF1ZV9wdHI8VD5gIHdoaWNoIG93bnMgdGhlIG9iamVjdC4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8KKy8vLyAgICAgYXV0byBwID0gbWFrZV91bmlxdWU8aW50PigpOworLy8vICAgICBhdXRvIHAgPSBtYWtlX3VuaXF1ZTxzdGQ6OnR1cGxlPGludCwgaW50Pj4oMCwgMSk7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MuLi4gQXJncz4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSwgc3RkOjp1bmlxdWVfcHRyPFQ+Pjo6dHlwZQorbWFrZV91bmlxdWUoQXJncyAmJi4uLiBhcmdzKSB7CisgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8VD4obmV3IFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSk7Cit9CisKKy8vLyBcYnJpZWYgQ29uc3RydWN0cyBhIGBuZXcgVFtuXWAgd2l0aCB0aGUgZ2l2ZW4gYXJncyBhbmQgcmV0dXJucyBhCisvLy8gICAgICAgIGB1bmlxdWVfcHRyPFRbXT5gIHdoaWNoIG93bnMgdGhlIG9iamVjdC4KKy8vLworLy8vIFxwYXJhbSBuIHNpemUgb2YgdGhlIG5ldyBhcnJheS4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8KKy8vLyAgICAgYXV0byBwID0gbWFrZV91bmlxdWU8aW50W10+KDIpOyAvLyB2YWx1ZS1pbml0aWFsaXplcyB0aGUgYXJyYXkgd2l0aCAwJ3MuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlICYmIHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFQ+Pjo6dHlwZQorbWFrZV91bmlxdWUoc2l6ZV90IG4pIHsKKyAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxUPihuZXcgdHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlW25dKCkpOworfQorCisvLy8gVGhpcyBmdW5jdGlvbiBpc24ndCB1c2VkIGFuZCBpcyBvbmx5IGhlcmUgdG8gcHJvdmlkZSBiZXR0ZXIgY29tcGlsZSBlcnJvcnMuCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MuLi4gQXJncz4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSAhPSAwPjo6dHlwZQorbWFrZV91bmlxdWUoQXJncyAmJi4uLikgPSBkZWxldGU7CisKK3N0cnVjdCBGcmVlRGVsZXRlciB7CisgIHZvaWQgb3BlcmF0b3IoKSh2b2lkKiB2KSB7CisgICAgOjpmcmVlKHYpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGaXJzdCwgdHlwZW5hbWUgU2Vjb25kPgorc3RydWN0IHBhaXJfaGFzaCB7CisgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6cGFpcjxGaXJzdCwgU2Vjb25kPiAmUCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6Omhhc2g8Rmlyc3Q+KCkoUC5maXJzdCkgKiAzMSArIHN0ZDo6aGFzaDxTZWNvbmQ+KCkoUC5zZWNvbmQpOworICB9Cit9OworCisvLy8gQSBmdW5jdG9yIGxpa2UgQysrMTQncyBzdGQ6Omxlc3M8dm9pZD4gaW4gaXRzIGFic2VuY2UuCitzdHJ1Y3QgbGVzcyB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBib29sIG9wZXJhdG9yKCkoQSAmJmEsIEIgJiZiKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxBPihhKSA8IHN0ZDo6Zm9yd2FyZDxCPihiKTsKKyAgfQorfTsKKworLy8vIEEgZnVuY3RvciBsaWtlIEMrKzE0J3Mgc3RkOjplcXVhbDx2b2lkPiBpbiBpdHMgYWJzZW5jZS4KK3N0cnVjdCBlcXVhbCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBib29sIG9wZXJhdG9yKCkoQSAmJmEsIEIgJiZiKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxBPihhKSA9PSBzdGQ6OmZvcndhcmQ8Qj4oYik7CisgIH0KK307CisKKy8vLyBCaW5hcnkgZnVuY3RvciB0aGF0IGFkYXB0cyB0byBhbnkgb3RoZXIgYmluYXJ5IGZ1bmN0b3IgYWZ0ZXIgZGVyZWZlcmVuY2luZworLy8vIG9wZXJhbmRzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBkZXJlZiB7CisgIFQgZnVuYzsKKworICAvLyBDb3VsZCBiZSBmdXJ0aGVyIGltcHJvdmVkIHRvIGNvcGUgd2l0aCBub24tZGVyaXZhYmxlIGZ1bmN0b3JzIGFuZAorICAvLyBub24tYmluYXJ5IGZ1bmN0b3JzIChzaG91bGQgYmUgYSB2YXJpYWRpYyB0ZW1wbGF0ZSBtZW1iZXIgZnVuY3Rpb24KKyAgLy8gb3BlcmF0b3IoKSkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgorICBhdXRvIG9wZXJhdG9yKCkoQSAmbGhzLCBCICZyaHMpIGNvbnN0IC0+IGRlY2x0eXBlKGZ1bmMoKmxocywgKnJocykpIHsKKyAgICBhc3NlcnQobGhzKTsKKyAgICBhc3NlcnQocmhzKTsKKyAgICByZXR1cm4gZnVuYygqbGhzLCAqcmhzKTsKKyAgfQorfTsKKworbmFtZXNwYWNlIGRldGFpbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSPiBjbGFzcyBlbnVtZXJhdG9yX2l0ZXI7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSPiBzdHJ1Y3QgcmVzdWx0X3BhaXIgeworICBmcmllbmQgY2xhc3MgZW51bWVyYXRvcl9pdGVyPFI+OworCisgIHJlc3VsdF9wYWlyKCkgPSBkZWZhdWx0OworICByZXN1bHRfcGFpcihzdGQ6OnNpemVfdCBJbmRleCwgSXRlck9mUmFuZ2U8Uj4gSXRlcikKKyAgICAgIDogSW5kZXgoSW5kZXgpLCBJdGVyKEl0ZXIpIHt9CisKKyAgcmVzdWx0X3BhaXI8Uj4gJm9wZXJhdG9yPShjb25zdCByZXN1bHRfcGFpcjxSPiAmT3RoZXIpIHsKKyAgICBJbmRleCA9IE90aGVyLkluZGV4OworICAgIEl0ZXIgPSBPdGhlci5JdGVyOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHN0ZDo6c2l6ZV90IGluZGV4KCkgY29uc3QgeyByZXR1cm4gSW5kZXg7IH0KKyAgY29uc3QgVmFsdWVPZlJhbmdlPFI+ICZ2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuICpJdGVyOyB9CisgIFZhbHVlT2ZSYW5nZTxSPiAmdmFsdWUoKSB7IHJldHVybiAqSXRlcjsgfQorCitwcml2YXRlOgorICBzdGQ6OnNpemVfdCBJbmRleCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8c3RkOjpzaXplX3Q+OjptYXgoKTsKKyAgSXRlck9mUmFuZ2U8Uj4gSXRlcjsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSPgorY2xhc3MgZW51bWVyYXRvcl9pdGVyCisgICAgOiBwdWJsaWMgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8CisgICAgICAgICAgZW51bWVyYXRvcl9pdGVyPFI+LCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCByZXN1bHRfcGFpcjxSPiwKKyAgICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyT2ZSYW5nZTxSPj46OmRpZmZlcmVuY2VfdHlwZSwKKyAgICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyT2ZSYW5nZTxSPj46OnBvaW50ZXIsCisgICAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SXRlck9mUmFuZ2U8Uj4+OjpyZWZlcmVuY2U+IHsKKyAgdXNpbmcgcmVzdWx0X3R5cGUgPSByZXN1bHRfcGFpcjxSPjsKKworcHVibGljOgorICBleHBsaWNpdCBlbnVtZXJhdG9yX2l0ZXIoSXRlck9mUmFuZ2U8Uj4gRW5kSXRlcikKKyAgICAgIDogUmVzdWx0KHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCksIEVuZEl0ZXIpIHt9CisKKyAgZW51bWVyYXRvcl9pdGVyKHN0ZDo6c2l6ZV90IEluZGV4LCBJdGVyT2ZSYW5nZTxSPiBJdGVyKQorICAgICAgOiBSZXN1bHQoSW5kZXgsIEl0ZXIpIHt9CisKKyAgcmVzdWx0X3R5cGUgJm9wZXJhdG9yKigpIHsgcmV0dXJuIFJlc3VsdDsgfQorICBjb25zdCByZXN1bHRfdHlwZSAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gUmVzdWx0OyB9CisKKyAgZW51bWVyYXRvcl9pdGVyPFI+ICZvcGVyYXRvcisrKCkgeworICAgIGFzc2VydChSZXN1bHQuSW5kZXggIT0gc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSk7CisgICAgKytSZXN1bHQuSXRlcjsKKyAgICArK1Jlc3VsdC5JbmRleDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgZW51bWVyYXRvcl9pdGVyPFI+ICZSSFMpIGNvbnN0IHsKKyAgICAvLyBEb24ndCBjb21wYXJlIGluZGljZXMgaGVyZSwgb25seSBpdGVyYXRvcnMuICBJdCdzIHBvc3NpYmxlIGZvciBhbiBlbmQKKyAgICAvLyBpdGVyYXRvciB0byBoYXZlIGRpZmZlcmVudCBpbmRpY2VzIGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0IHdhcyBjcmVhdGVkCisgICAgLy8gYnkgY2FsbGluZyBzdGQ6OmVuZCgpIHZlcnN1cyBpbmNyZW1lbnRpbmcgYSB2YWxpZCBpdGVyYXRvci4KKyAgICByZXR1cm4gUmVzdWx0Lkl0ZXIgPT0gUkhTLlJlc3VsdC5JdGVyOworICB9CisKKyAgZW51bWVyYXRvcl9pdGVyPFI+ICZvcGVyYXRvcj0oY29uc3QgZW51bWVyYXRvcl9pdGVyPFI+ICZPdGhlcikgeworICAgIFJlc3VsdCA9IE90aGVyLlJlc3VsdDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworcHJpdmF0ZToKKyAgcmVzdWx0X3R5cGUgUmVzdWx0OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFI+IGNsYXNzIGVudW1lcmF0b3IgeworcHVibGljOgorICBleHBsaWNpdCBlbnVtZXJhdG9yKFIgJiZSYW5nZSkgOiBUaGVSYW5nZShzdGQ6OmZvcndhcmQ8Uj4oUmFuZ2UpKSB7fQorCisgIGVudW1lcmF0b3JfaXRlcjxSPiBiZWdpbigpIHsKKyAgICByZXR1cm4gZW51bWVyYXRvcl9pdGVyPFI+KDAsIHN0ZDo6YmVnaW4oVGhlUmFuZ2UpKTsKKyAgfQorCisgIGVudW1lcmF0b3JfaXRlcjxSPiBlbmQoKSB7CisgICAgcmV0dXJuIGVudW1lcmF0b3JfaXRlcjxSPihzdGQ6OmVuZChUaGVSYW5nZSkpOworICB9CisKK3ByaXZhdGU6CisgIFIgVGhlUmFuZ2U7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKKy8vLyBHaXZlbiBhbiBpbnB1dCByYW5nZSwgcmV0dXJucyBhIG5ldyByYW5nZSB3aG9zZSB2YWx1ZXMgYXJlIGFyZSBwYWlyIChBLEIpCisvLy8gc3VjaCB0aGF0IEEgaXMgdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIGl0ZW0gaW4gdGhlIHNlcXVlbmNlLCBhbmQgQiBpcworLy8vIHRoZSB2YWx1ZSBmcm9tIHRoZSBvcmlnaW5hbCBzZXF1ZW5jZS4gIEV4YW1wbGU6CisvLy8KKy8vLyBzdGQ6OnZlY3RvcjxjaGFyPiBJdGVtcyA9IHsnQScsICdCJywgJ0MnLCAnRCd9OworLy8vIGZvciAoYXV0byBYIDogZW51bWVyYXRlKEl0ZW1zKSkgeworLy8vICAgcHJpbnRmKCJJdGVtICVkIC0gJWNcbiIsIFguaW5kZXgoKSwgWC52YWx1ZSgpKTsKKy8vLyB9CisvLy8KKy8vLyBPdXRwdXQ6CisvLy8gICBJdGVtIDAgLSBBCisvLy8gICBJdGVtIDEgLSBCCisvLy8gICBJdGVtIDIgLSBDCisvLy8gICBJdGVtIDMgLSBECisvLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBSPiBkZXRhaWw6OmVudW1lcmF0b3I8Uj4gZW51bWVyYXRlKFIgJiZUaGVSYW5nZSkgeworICByZXR1cm4gZGV0YWlsOjplbnVtZXJhdG9yPFI+KHN0ZDo6Zm9yd2FyZDxSPihUaGVSYW5nZSkpOworfQorCituYW1lc3BhY2UgZGV0YWlsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEYsIHR5cGVuYW1lIFR1cGxlLCBzdGQ6OnNpemVfdC4uLiBJPgorYXV0byBhcHBseV90dXBsZV9pbXBsKEYgJiZmLCBUdXBsZSAmJnQsIGluZGV4X3NlcXVlbmNlPEkuLi4+KQorICAgIC0+IGRlY2x0eXBlKHN0ZDo6Zm9yd2FyZDxGPihmKShzdGQ6OmdldDxJPihzdGQ6OmZvcndhcmQ8VHVwbGU+KHQpKS4uLikpIHsKKyAgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxGPihmKShzdGQ6OmdldDxJPihzdGQ6OmZvcndhcmQ8VHVwbGU+KHQpKS4uLik7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKworLy8vIEdpdmVuIGFuIGlucHV0IHR1cGxlIChhMSwgYTIsIC4uLiwgYW4pLCBwYXNzIHRoZSBhcmd1bWVudHMgb2YgdGhlCisvLy8gdHVwbGUgdmFyaWFkaWNhbGx5IHRvIGYgYXMgaWYgYnkgY2FsbGluZyBmKGExLCBhMiwgLi4uLCBhbikgYW5kCisvLy8gcmV0dXJuIHRoZSByZXN1bHQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRiwgdHlwZW5hbWUgVHVwbGU+CithdXRvIGFwcGx5X3R1cGxlKEYgJiZmLCBUdXBsZSAmJnQpIC0+IGRlY2x0eXBlKGRldGFpbDo6YXBwbHlfdHVwbGVfaW1wbCgKKyAgICBzdGQ6OmZvcndhcmQ8Rj4oZiksIHN0ZDo6Zm9yd2FyZDxUdXBsZT4odCksCisgICAgYnVpbGRfaW5kZXhfaW1wbDwKKyAgICAgICAgc3RkOjp0dXBsZV9zaXplPHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VHVwbGU+Ojp0eXBlPjo6dmFsdWU+e30pKSB7CisgIHVzaW5nIEluZGljZXMgPSBidWlsZF9pbmRleF9pbXBsPAorICAgICAgc3RkOjp0dXBsZV9zaXplPHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VHVwbGU+Ojp0eXBlPjo6dmFsdWU+OworCisgIHJldHVybiBkZXRhaWw6OmFwcGx5X3R1cGxlX2ltcGwoc3RkOjpmb3J3YXJkPEY+KGYpLCBzdGQ6OmZvcndhcmQ8VHVwbGU+KHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGljZXN7fSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9TVExFWFRSQVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU2NvcGVFeGl0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TY29wZUV4aXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDEzNzU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU2NvcGVFeGl0LmgKQEAgLTAsMCArMSw2NiBAQAorLy89PT0tIGxsdm0vQURUL1Njb3BlRXhpdC5oIC0gRXhlY3V0ZSBjb2RlIGF0IHNjb3BlIGV4aXQgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgbWFrZV9zY29wZV9leGl0IGZ1bmN0aW9uLCB3aGljaCBleGVjdXRlcyB1c2VyLWRlZmluZWQKKy8vIGNsZWFudXAgbG9naWMgYXQgc2NvcGUgZXhpdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NDT1BFX0VYSVRfSAorI2RlZmluZSBMTFZNX0FEVF9TQ09QRV9FWElUX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGRldGFpbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDYWxsYWJsZT4gY2xhc3Mgc2NvcGVfZXhpdCB7CisgIENhbGxhYmxlIEV4aXRGdW5jdGlvbjsKKyAgYm9vbCBFbmdhZ2VkID0gdHJ1ZTsgLy8gRmFsc2Ugb25jZSBtb3ZlZC1mcm9tIG9yIHJlbGVhc2UoKWQuCisKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZwPgorICBleHBsaWNpdCBzY29wZV9leGl0KEZwICYmRikgOiBFeGl0RnVuY3Rpb24oc3RkOjpmb3J3YXJkPEZwPihGKSkge30KKworICBzY29wZV9leGl0KHNjb3BlX2V4aXQgJiZSaHMpCisgICAgICA6IEV4aXRGdW5jdGlvbihzdGQ6Om1vdmUoUmhzLkV4aXRGdW5jdGlvbikpLCBFbmdhZ2VkKFJocy5FbmdhZ2VkKSB7CisgICAgUmhzLnJlbGVhc2UoKTsKKyAgfQorICBzY29wZV9leGl0KGNvbnN0IHNjb3BlX2V4aXQgJikgPSBkZWxldGU7CisgIHNjb3BlX2V4aXQgJm9wZXJhdG9yPShzY29wZV9leGl0ICYmKSA9IGRlbGV0ZTsKKyAgc2NvcGVfZXhpdCAmb3BlcmF0b3I9KGNvbnN0IHNjb3BlX2V4aXQgJikgPSBkZWxldGU7CisKKyAgdm9pZCByZWxlYXNlKCkgeyBFbmdhZ2VkID0gZmFsc2U7IH0KKworICB+c2NvcGVfZXhpdCgpIHsKKyAgICBpZiAoRW5nYWdlZCkKKyAgICAgIEV4aXRGdW5jdGlvbigpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKKy8vIEtlZXBzIHRoZSBjYWxsYWJsZSBvYmplY3QgdGhhdCBpcyBwYXNzZWQgaW4sIGFuZCBleGVjdXRlIGl0IGF0IHRoZQorLy8gZGVzdHJ1Y3Rpb24gb2YgdGhlIHJldHVybmVkIG9iamVjdCAodXN1YWxseSBhdCB0aGUgc2NvcGUgZXhpdCB3aGVyZSB0aGUKKy8vIHJldHVybmVkIG9iamVjdCBpcyBrZXB0KS4KKy8vCisvLyBJbnRlcmZhY2UgaXMgc3BlY2lmaWVkIGJ5IHAwMDUycjIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FsbGFibGU+CitMTFZNX05PRElTQ0FSRCBkZXRhaWw6OnNjb3BlX2V4aXQ8dHlwZW5hbWUgc3RkOjpkZWNheTxDYWxsYWJsZT46OnR5cGU+CittYWtlX3Njb3BlX2V4aXQoQ2FsbGFibGUgJiZGKSB7CisgIHJldHVybiBkZXRhaWw6OnNjb3BlX2V4aXQ8dHlwZW5hbWUgc3RkOjpkZWNheTxDYWxsYWJsZT46OnR5cGU+KAorICAgICAgc3RkOjpmb3J3YXJkPENhbGxhYmxlPihGKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU2NvcGVkSGFzaFRhYmxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TY29wZWRIYXNoVGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmIwYzFiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU2NvcGVkSGFzaFRhYmxlLmgKQEAgLTAsMCArMSwyNjQgQEAKKy8vPT09LSBTY29wZWRIYXNoVGFibGUuaCAtIEEgc2ltcGxlIHNjb3BlZCBoYXNoIHRhYmxlIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYW4gZWZmaWNpZW50IHNjb3BlZCBoYXNoIHRhYmxlLCB3aGljaCBpcyB1c2VmdWwgZm9yCisvLyB0aGluZ3MgbGlrZSBkb21pbmF0b3ItYmFzZWQgb3B0aW1pemF0aW9ucy4gIFRoaXMgYWxsb3dzIGNsaWVudHMgdG8gZG8gdGhpbmdzCisvLyBsaWtlIHRoaXM6CisvLworLy8gIFNjb3BlZEhhc2hUYWJsZTxpbnQsIGludD4gSFQ7CisvLyAgeworLy8gICAgU2NvcGVkSGFzaFRhYmxlU2NvcGU8aW50LCBpbnQ+IFNjb3BlMShIVCk7CisvLyAgICBIVC5pbnNlcnQoMCwgMCk7CisvLyAgICBIVC5pbnNlcnQoMSwgMSk7CisvLyAgICB7CisvLyAgICAgIFNjb3BlZEhhc2hUYWJsZVNjb3BlPGludCwgaW50PiBTY29wZTIoSFQpOworLy8gICAgICBIVC5pbnNlcnQoMCwgNDIpOworLy8gICAgfQorLy8gIH0KKy8vCisvLyBMb29raW5nIHVwIHRoZSB2YWx1ZSBmb3IgIjAiIGluIHRoZSBTY29wZTIgYmxvY2sgd2lsbCByZXR1cm4gNDIuICBMb29raW5nCisvLyB1cCB0aGUgdmFsdWUgZm9yIDAgYmVmb3JlIDQyIGlzIGluc2VydGVkIG9yIGFmdGVyIFNjb3BlMiBpcyBwb3BwZWQgd2lsbAorLy8gcmV0dXJuIDAuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9TQ09QRURIQVNIVEFCTEVfSAorI2RlZmluZSBMTFZNX0FEVF9TQ09QRURIQVNIVEFCTEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxuZXc+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFYsIHR5cGVuYW1lIEtJbmZvID0gRGVuc2VNYXBJbmZvPEs+LAorICAgICAgICAgIHR5cGVuYW1lIEFsbG9jYXRvclR5ID0gTWFsbG9jQWxsb2NhdG9yPgorY2xhc3MgU2NvcGVkSGFzaFRhYmxlOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK2NsYXNzIFNjb3BlZEhhc2hUYWJsZVZhbCB7CisgIFNjb3BlZEhhc2hUYWJsZVZhbCAqTmV4dEluU2NvcGU7CisgIFNjb3BlZEhhc2hUYWJsZVZhbCAqTmV4dEZvcktleTsKKyAgSyBLZXk7CisgIFYgVmFsOworCisgIFNjb3BlZEhhc2hUYWJsZVZhbChjb25zdCBLICZrZXksIGNvbnN0IFYgJnZhbCkgOiBLZXkoa2V5KSwgVmFsKHZhbCkge30KKworcHVibGljOgorICBjb25zdCBLICZnZXRLZXkoKSBjb25zdCB7IHJldHVybiBLZXk7IH0KKyAgY29uc3QgViAmZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKyAgViAmZ2V0VmFsdWUoKSB7IHJldHVybiBWYWw7IH0KKworICBTY29wZWRIYXNoVGFibGVWYWwgKmdldE5leHRGb3JLZXkoKSB7IHJldHVybiBOZXh0Rm9yS2V5OyB9CisgIGNvbnN0IFNjb3BlZEhhc2hUYWJsZVZhbCAqZ2V0TmV4dEZvcktleSgpIGNvbnN0IHsgcmV0dXJuIE5leHRGb3JLZXk7IH0KKyAgU2NvcGVkSGFzaFRhYmxlVmFsICpnZXROZXh0SW5TY29wZSgpIHsgcmV0dXJuIE5leHRJblNjb3BlOyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFsbG9jYXRvclR5PgorICBzdGF0aWMgU2NvcGVkSGFzaFRhYmxlVmFsICpDcmVhdGUoU2NvcGVkSGFzaFRhYmxlVmFsICpuZXh0SW5TY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlZEhhc2hUYWJsZVZhbCAqbmV4dEZvcktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEsgJmtleSwgY29uc3QgViAmdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdG9yVHkgJkFsbG9jYXRvcikgeworICAgIFNjb3BlZEhhc2hUYWJsZVZhbCAqTmV3ID0gQWxsb2NhdG9yLnRlbXBsYXRlIEFsbG9jYXRlPFNjb3BlZEhhc2hUYWJsZVZhbD4oKTsKKyAgICAvLyBTZXQgdXAgdGhlIHZhbHVlLgorICAgIG5ldyAoTmV3KSBTY29wZWRIYXNoVGFibGVWYWwoa2V5LCB2YWwpOworICAgIE5ldy0+TmV4dEluU2NvcGUgPSBuZXh0SW5TY29wZTsKKyAgICBOZXctPk5leHRGb3JLZXkgPSBuZXh0Rm9yS2V5OworICAgIHJldHVybiBOZXc7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQWxsb2NhdG9yVHk+IHZvaWQgRGVzdHJveShBbGxvY2F0b3JUeSAmQWxsb2NhdG9yKSB7CisgICAgLy8gRnJlZSBtZW1vcnkgcmVmZXJlbmNlZCBieSB0aGUgaXRlbS4KKyAgICB0aGlzLT5+U2NvcGVkSGFzaFRhYmxlVmFsKCk7CisgICAgQWxsb2NhdG9yLkRlYWxsb2NhdGUodGhpcyk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBLSW5mbyA9IERlbnNlTWFwSW5mbzxLPiwKKyAgICAgICAgICB0eXBlbmFtZSBBbGxvY2F0b3JUeSA9IE1hbGxvY0FsbG9jYXRvcj4KK2NsYXNzIFNjb3BlZEhhc2hUYWJsZVNjb3BlIHsKKyAgLy8vIEhUIC0gVGhlIGhhc2h0YWJsZSB0aGF0IHdlIGFyZSBhY3RpdmUgZm9yLgorICBTY29wZWRIYXNoVGFibGU8SywgViwgS0luZm8sIEFsbG9jYXRvclR5PiAmSFQ7CisKKyAgLy8vIFByZXZTY29wZSAtIFRoaXMgaXMgdGhlIHNjb3BlIHRoYXQgd2UgYXJlIHNoYWRvd2luZyBpbiBIVC4KKyAgU2NvcGVkSGFzaFRhYmxlU2NvcGUgKlByZXZTY29wZTsKKworICAvLy8gTGFzdFZhbEluU2NvcGUgLSBUaGlzIGlzIHRoZSBsYXN0IHZhbHVlIHRoYXQgd2FzIGluc2VydGVkIGZvciB0aGlzIHNjb3BlCisgIC8vLyBvciBudWxsIGlmIG5vbmUgaGF2ZSBiZWVuIGluc2VydGVkIHlldC4KKyAgU2NvcGVkSGFzaFRhYmxlVmFsPEssIFY+ICpMYXN0VmFsSW5TY29wZTsKKworcHVibGljOgorICBTY29wZWRIYXNoVGFibGVTY29wZShTY29wZWRIYXNoVGFibGU8SywgViwgS0luZm8sIEFsbG9jYXRvclR5PiAmSFQpOworICBTY29wZWRIYXNoVGFibGVTY29wZShTY29wZWRIYXNoVGFibGVTY29wZSAmKSA9IGRlbGV0ZTsKKyAgU2NvcGVkSGFzaFRhYmxlU2NvcGUgJm9wZXJhdG9yPShTY29wZWRIYXNoVGFibGVTY29wZSAmKSA9IGRlbGV0ZTsKKyAgflNjb3BlZEhhc2hUYWJsZVNjb3BlKCk7CisKKyAgU2NvcGVkSGFzaFRhYmxlU2NvcGUgKmdldFBhcmVudFNjb3BlKCkgeyByZXR1cm4gUHJldlNjb3BlOyB9CisgIGNvbnN0IFNjb3BlZEhhc2hUYWJsZVNjb3BlICpnZXRQYXJlbnRTY29wZSgpIGNvbnN0IHsgcmV0dXJuIFByZXZTY29wZTsgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU2NvcGVkSGFzaFRhYmxlPEssIFYsIEtJbmZvLCBBbGxvY2F0b3JUeT47CisKKyAgU2NvcGVkSGFzaFRhYmxlVmFsPEssIFY+ICpnZXRMYXN0VmFsSW5TY29wZSgpIHsKKyAgICByZXR1cm4gTGFzdFZhbEluU2NvcGU7CisgIH0KKworICB2b2lkIHNldExhc3RWYWxJblNjb3BlKFNjb3BlZEhhc2hUYWJsZVZhbDxLLCBWPiAqVmFsKSB7CisgICAgTGFzdFZhbEluU2NvcGUgPSBWYWw7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBLSW5mbyA9IERlbnNlTWFwSW5mbzxLPj4KK2NsYXNzIFNjb3BlZEhhc2hUYWJsZUl0ZXJhdG9yIHsKKyAgU2NvcGVkSGFzaFRhYmxlVmFsPEssIFY+ICpOb2RlOworCitwdWJsaWM6CisgIFNjb3BlZEhhc2hUYWJsZUl0ZXJhdG9yKFNjb3BlZEhhc2hUYWJsZVZhbDxLLCBWPiAqbm9kZSkgOiBOb2RlKG5vZGUpIHt9CisKKyAgViAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGFzc2VydChOb2RlICYmICJEZXJlZmVyZW5jZSBlbmQoKSIpOworICAgIHJldHVybiBOb2RlLT5nZXRWYWx1ZSgpOworICB9CisgIFYgKm9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgcmV0dXJuICZOb2RlLT5nZXRWYWx1ZSgpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNjb3BlZEhhc2hUYWJsZUl0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9kZSA9PSBSSFMuTm9kZTsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgU2NvcGVkSGFzaFRhYmxlSXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiBOb2RlICE9IFJIUy5Ob2RlOworICB9CisKKyAgaW5saW5lIFNjb3BlZEhhc2hUYWJsZUl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyAgICAgICAgICAvLyBQcmVpbmNyZW1lbnQKKyAgICBhc3NlcnQoTm9kZSAmJiAiaW5jcmVtZW50aW5nIHBhc3QgZW5kKCkiKTsKKyAgICBOb2RlID0gTm9kZS0+Z2V0TmV4dEZvcktleSgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBTY29wZWRIYXNoVGFibGVJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAgICAgICAgLy8gUG9zdGluY3JlbWVudAorICAgIFNjb3BlZEhhc2hUYWJsZUl0ZXJhdG9yIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgViwgdHlwZW5hbWUgS0luZm8sIHR5cGVuYW1lIEFsbG9jYXRvclR5PgorY2xhc3MgU2NvcGVkSGFzaFRhYmxlIHsKK3B1YmxpYzoKKyAgLy8vIFNjb3BlVHkgLSBUaGlzIGlzIGEgaGVscGZ1bCB0eXBlZGVmIHRoYXQgYWxsb3dzIGNsaWVudHMgdG8gZ2V0IGVhc3kgYWNjZXNzCisgIC8vLyB0byB0aGUgbmFtZSBvZiB0aGUgc2NvcGUgZm9yIHRoaXMgaGFzaCB0YWJsZS4KKyAgdXNpbmcgU2NvcGVUeSA9IFNjb3BlZEhhc2hUYWJsZVNjb3BlPEssIFYsIEtJbmZvLCBBbGxvY2F0b3JUeT47CisgIHVzaW5nIHNpemVfdHlwZSA9IHVuc2lnbmVkOworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU2NvcGVkSGFzaFRhYmxlU2NvcGU8SywgViwgS0luZm8sIEFsbG9jYXRvclR5PjsKKworICB1c2luZyBWYWxUeSA9IFNjb3BlZEhhc2hUYWJsZVZhbDxLLCBWPjsKKworICBEZW5zZU1hcDxLLCBWYWxUeSosIEtJbmZvPiBUb3BMZXZlbE1hcDsKKyAgU2NvcGVUeSAqQ3VyU2NvcGUgPSBudWxscHRyOworCisgIEFsbG9jYXRvclR5IEFsbG9jYXRvcjsKKworcHVibGljOgorICBTY29wZWRIYXNoVGFibGUoKSA9IGRlZmF1bHQ7CisgIFNjb3BlZEhhc2hUYWJsZShBbGxvY2F0b3JUeSBBKSA6IEFsbG9jYXRvcihBKSB7fQorICBTY29wZWRIYXNoVGFibGUoY29uc3QgU2NvcGVkSGFzaFRhYmxlICYpID0gZGVsZXRlOworICBTY29wZWRIYXNoVGFibGUgJm9wZXJhdG9yPShjb25zdCBTY29wZWRIYXNoVGFibGUgJikgPSBkZWxldGU7CisKKyAgflNjb3BlZEhhc2hUYWJsZSgpIHsKKyAgICBhc3NlcnQoIUN1clNjb3BlICYmIFRvcExldmVsTWFwLmVtcHR5KCkgJiYgIlNjb3BlIGltYmFsYW5jZSEiKTsKKyAgfQorCisgIC8vLyBBY2Nlc3MgdG8gdGhlIGFsbG9jYXRvci4KKyAgQWxsb2NhdG9yVHkgJmdldEFsbG9jYXRvcigpIHsgcmV0dXJuIEFsbG9jYXRvcjsgfQorICBjb25zdCBBbGxvY2F0b3JUeSAmZ2V0QWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gQWxsb2NhdG9yOyB9CisKKyAgLy8vIFJldHVybiAxIGlmIHRoZSBzcGVjaWZpZWQga2V5IGlzIGluIHRoZSB0YWJsZSwgMCBvdGhlcndpc2UuCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBLICZLZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gVG9wTGV2ZWxNYXAuY291bnQoS2V5KTsKKyAgfQorCisgIFYgbG9va3VwKGNvbnN0IEsgJktleSkgY29uc3QgeworICAgIGF1dG8gSSA9IFRvcExldmVsTWFwLmZpbmQoS2V5KTsKKyAgICBpZiAoSSAhPSBUb3BMZXZlbE1hcC5lbmQoKSkKKyAgICAgIHJldHVybiBJLT5zZWNvbmQtPmdldFZhbHVlKCk7CisKKyAgICByZXR1cm4gVigpOworICB9CisKKyAgdm9pZCBpbnNlcnQoY29uc3QgSyAmS2V5LCBjb25zdCBWICZWYWwpIHsKKyAgICBpbnNlcnRJbnRvU2NvcGUoQ3VyU2NvcGUsIEtleSwgVmFsKTsKKyAgfQorCisgIHVzaW5nIGl0ZXJhdG9yID0gU2NvcGVkSGFzaFRhYmxlSXRlcmF0b3I8SywgViwgS0luZm8+OworCisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGl0ZXJhdG9yKDApOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oY29uc3QgSyAmS2V5KSB7CisgICAgdHlwZW5hbWUgRGVuc2VNYXA8SywgVmFsVHkqLCBLSW5mbz46Oml0ZXJhdG9yIEkgPQorICAgICAgVG9wTGV2ZWxNYXAuZmluZChLZXkpOworICAgIGlmIChJID09IFRvcExldmVsTWFwLmVuZCgpKSByZXR1cm4gZW5kKCk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKEktPnNlY29uZCk7CisgIH0KKworICBTY29wZVR5ICpnZXRDdXJTY29wZSgpIHsgcmV0dXJuIEN1clNjb3BlOyB9CisgIGNvbnN0IFNjb3BlVHkgKmdldEN1clNjb3BlKCkgY29uc3QgeyByZXR1cm4gQ3VyU2NvcGU7IH0KKworICAvLy8gaW5zZXJ0SW50b1Njb3BlIC0gVGhpcyBpbnNlcnRzIHRoZSBzcGVjaWZpZWQga2V5L3ZhbHVlIGF0IHRoZSBzcGVjaWZpZWQKKyAgLy8vIChwb3NzaWJseSBub3QgdGhlIGN1cnJlbnQpIHNjb3BlLiAgV2hpbGUgaXQgaXMgb2sgdG8gaW5zZXJ0IGludG8gYSBzY29wZQorICAvLy8gdGhhdCBpc24ndCB0aGUgY3VycmVudCBvbmUsIGl0IGlzbid0IG9rIHRvIGluc2VydCAqdW5kZXJuZWF0aCogYW4gZXhpc3RpbmcKKyAgLy8vIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQga2V5LgorICB2b2lkIGluc2VydEludG9TY29wZShTY29wZVR5ICpTLCBjb25zdCBLICZLZXksIGNvbnN0IFYgJlZhbCkgeworICAgIGFzc2VydChTICYmICJObyBzY29wZSBhY3RpdmUhIik7CisgICAgU2NvcGVkSGFzaFRhYmxlVmFsPEssIFY+IComS2V5RW50cnkgPSBUb3BMZXZlbE1hcFtLZXldOworICAgIEtleUVudHJ5ID0gVmFsVHk6OkNyZWF0ZShTLT5nZXRMYXN0VmFsSW5TY29wZSgpLCBLZXlFbnRyeSwgS2V5LCBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRvcik7CisgICAgUy0+c2V0TGFzdFZhbEluU2NvcGUoS2V5RW50cnkpOworICB9Cit9OworCisvLy8gU2NvcGVkSGFzaFRhYmxlU2NvcGUgY3RvciAtIEluc3RhbGwgdGhpcyBhcyB0aGUgY3VycmVudCBzY29wZSBmb3IgdGhlIGhhc2gKKy8vLyB0YWJsZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBLSW5mbywgdHlwZW5hbWUgQWxsb2NhdG9yPgorU2NvcGVkSGFzaFRhYmxlU2NvcGU8SywgViwgS0luZm8sIEFsbG9jYXRvcj46OgorICBTY29wZWRIYXNoVGFibGVTY29wZShTY29wZWRIYXNoVGFibGU8SywgViwgS0luZm8sIEFsbG9jYXRvcj4gJmh0KSA6IEhUKGh0KSB7CisgIFByZXZTY29wZSA9IEhULkN1clNjb3BlOworICBIVC5DdXJTY29wZSA9IHRoaXM7CisgIExhc3RWYWxJblNjb3BlID0gbnVsbHB0cjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFYsIHR5cGVuYW1lIEtJbmZvLCB0eXBlbmFtZSBBbGxvY2F0b3I+CitTY29wZWRIYXNoVGFibGVTY29wZTxLLCBWLCBLSW5mbywgQWxsb2NhdG9yPjo6flNjb3BlZEhhc2hUYWJsZVNjb3BlKCkgeworICBhc3NlcnQoSFQuQ3VyU2NvcGUgPT0gdGhpcyAmJiAiU2NvcGUgaW1iYWxhbmNlISIpOworICBIVC5DdXJTY29wZSA9IFByZXZTY29wZTsKKworICAvLyBQb3AgYW5kIGRlbGV0ZSBhbGwgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzY29wZS4KKyAgd2hpbGUgKFNjb3BlZEhhc2hUYWJsZVZhbDxLLCBWPiAqVGhpc0VudHJ5ID0gTGFzdFZhbEluU2NvcGUpIHsKKyAgICAvLyBQb3AgdGhpcyB2YWx1ZSBvdXQgb2YgdGhlIFRvcExldmVsTWFwLgorICAgIGlmICghVGhpc0VudHJ5LT5nZXROZXh0Rm9yS2V5KCkpIHsKKyAgICAgIGFzc2VydChIVC5Ub3BMZXZlbE1hcFtUaGlzRW50cnktPmdldEtleSgpXSA9PSBUaGlzRW50cnkgJiYKKyAgICAgICAgICAgICAiU2NvcGUgaW1iYWxhbmNlISIpOworICAgICAgSFQuVG9wTGV2ZWxNYXAuZXJhc2UoVGhpc0VudHJ5LT5nZXRLZXkoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFNjb3BlZEhhc2hUYWJsZVZhbDxLLCBWPiAqJktleUVudHJ5ID0gSFQuVG9wTGV2ZWxNYXBbVGhpc0VudHJ5LT5nZXRLZXkoKV07CisgICAgICBhc3NlcnQoS2V5RW50cnkgPT0gVGhpc0VudHJ5ICYmICJTY29wZSBpbWJhbGFuY2UhIik7CisgICAgICBLZXlFbnRyeSA9IFRoaXNFbnRyeS0+Z2V0TmV4dEZvcktleSgpOworICAgIH0KKworICAgIC8vIFBvcCB0aGlzIHZhbHVlIG91dCBvZiB0aGUgc2NvcGUuCisgICAgTGFzdFZhbEluU2NvcGUgPSBUaGlzRW50cnktPmdldE5leHRJblNjb3BlKCk7CisKKyAgICAvLyBEZWxldGUgdGhpcyBlbnRyeS4KKyAgICBUaGlzRW50cnktPkRlc3Ryb3koSFQuZ2V0QWxsb2NhdG9yKCkpOworICB9Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9TQ09QRURIQVNIVEFCTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU2VxdWVuY2UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NlcXVlbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0YTg5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NlcXVlbmNlLmgKQEAgLTAsMCArMSw4NCBAQAorLy89PT0tIFNlcXVlbmNlLmggLSBVdGlsaXR5IGZvciBwcm9kdWNpbmcgc2VxdWVuY2VzIG9mIHZhbHVlcyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFRoaXMgcm91dGluZSBwcm92aWRlcyBzb21lIHN5bnRoZXNpcyB1dGlsaXRpZXMgdG8gcHJvZHVjZSBzZXF1ZW5jZXMgb2YKKy8vLyB2YWx1ZXMuIFRoZSBuYW1lcyBhcmUgaW50ZW50aW9uYWxseSBrZXB0IHZlcnkgc2hvcnQgYXMgdGhleSB0ZW5kIHRvIG9jY3VyCisvLy8gaW4gY29tbW9uIGFuZCB3aWRlbHkgdXNlZCBjb250ZXh0cy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9TRVFVRU5DRV9ICisjZGVmaW5lIExMVk1fQURUX1NFUVVFTkNFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgZGV0YWlsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVD4KK2NsYXNzIHZhbHVlX3NlcXVlbmNlX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8dmFsdWVfc2VxdWVuY2VfaXRlcmF0b3I8VmFsdWVUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVD4geworICB1c2luZyBCYXNlVCA9IHR5cGVuYW1lIHZhbHVlX3NlcXVlbmNlX2l0ZXJhdG9yOjppdGVyYXRvcl9mYWNhZGVfYmFzZTsKKworICBWYWx1ZVQgVmFsdWU7CisKK3B1YmxpYzoKKyAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gdHlwZW5hbWUgQmFzZVQ6OmRpZmZlcmVuY2VfdHlwZTsKKyAgdXNpbmcgcmVmZXJlbmNlID0gdHlwZW5hbWUgQmFzZVQ6OnJlZmVyZW5jZTsKKworICB2YWx1ZV9zZXF1ZW5jZV9pdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgdmFsdWVfc2VxdWVuY2VfaXRlcmF0b3IoY29uc3QgdmFsdWVfc2VxdWVuY2VfaXRlcmF0b3IgJikgPSBkZWZhdWx0OworICB2YWx1ZV9zZXF1ZW5jZV9pdGVyYXRvcih2YWx1ZV9zZXF1ZW5jZV9pdGVyYXRvciAmJkFyZykKKyAgICAgIDogVmFsdWUoc3RkOjptb3ZlKEFyZy5WYWx1ZSkpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEVuYWJsZXIgPSBkZWNsdHlwZShWYWx1ZVQoc3RkOjpkZWNsdmFsPFU+KCkpKT4KKyAgdmFsdWVfc2VxdWVuY2VfaXRlcmF0b3IoVSAmJlZhbHVlKSA6IFZhbHVlKHN0ZDo6Zm9yd2FyZDxVPihWYWx1ZSkpIHt9CisKKyAgdmFsdWVfc2VxdWVuY2VfaXRlcmF0b3IgJm9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIE4pIHsKKyAgICBWYWx1ZSArPSBOOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICB2YWx1ZV9zZXF1ZW5jZV9pdGVyYXRvciAmb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgTikgeworICAgIFZhbHVlIC09IE47CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIHVzaW5nIEJhc2VUOjpvcGVyYXRvci07CisgIGRpZmZlcmVuY2VfdHlwZSBvcGVyYXRvci0oY29uc3QgdmFsdWVfc2VxdWVuY2VfaXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiBWYWx1ZSAtIFJIUy5WYWx1ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCB2YWx1ZV9zZXF1ZW5jZV9pdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlID09IFJIUy5WYWx1ZTsKKyAgfQorICBib29sIG9wZXJhdG9yPChjb25zdCB2YWx1ZV9zZXF1ZW5jZV9pdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlIDwgUkhTLlZhbHVlOworICB9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVQ+CitpdGVyYXRvcl9yYW5nZTxkZXRhaWw6OnZhbHVlX3NlcXVlbmNlX2l0ZXJhdG9yPFZhbHVlVD4+IHNlcShWYWx1ZVQgQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVQgRW5kKSB7CisgIHJldHVybiBtYWtlX3JhbmdlKGRldGFpbDo6dmFsdWVfc2VxdWVuY2VfaXRlcmF0b3I8VmFsdWVUPihCZWdpbiksCisgICAgICAgICAgICAgICAgICAgIGRldGFpbDo6dmFsdWVfc2VxdWVuY2VfaXRlcmF0b3I8VmFsdWVUPihFbmQpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1NFUVVFTkNFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NldE9wZXJhdGlvbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NldE9wZXJhdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzlmMmZiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU2V0T3BlcmF0aW9ucy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vPT09LS0gbGx2bS9BRFQvU2V0T3BlcmF0aW9ucy5oIC0gR2VuZXJpYyBTZXQgT3BlcmF0aW9ucyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgZ2VuZXJpYyBzZXQgb3BlcmF0aW9ucyB0aGF0IG1heSBiZSB1c2VkIG9uIHNldCdzIG9mCisvLyBkaWZmZXJlbnQgdHlwZXMsIGFuZCBkaWZmZXJlbnQgZWxlbWVudCB0eXBlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NFVE9QRVJBVElPTlNfSAorI2RlZmluZSBMTFZNX0FEVF9TRVRPUEVSQVRJT05TX0gKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gc2V0X3VuaW9uKEEsIEIpIC0gQ29tcHV0ZSBBIDo9IEEgdSBCLCByZXR1cm4gd2hldGhlciBBIGNoYW5nZWQuCisvLy8KK3RlbXBsYXRlIDxjbGFzcyBTMVR5LCBjbGFzcyBTMlR5PgorYm9vbCBzZXRfdW5pb24oUzFUeSAmUzEsIGNvbnN0IFMyVHkgJlMyKSB7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworCisgIGZvciAodHlwZW5hbWUgUzJUeTo6Y29uc3RfaXRlcmF0b3IgU0kgPSBTMi5iZWdpbigpLCBTRSA9IFMyLmVuZCgpOworICAgICAgIFNJICE9IFNFOyArK1NJKQorICAgIGlmIChTMS5pbnNlcnQoKlNJKS5zZWNvbmQpCisgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKworICByZXR1cm4gQ2hhbmdlZDsKK30KKworLy8vIHNldF9pbnRlcnNlY3QoQSwgQikgLSBDb21wdXRlIEEgOj0gQSBeIEIKKy8vLyBJZGVudGljYWwgdG8gc2V0X2ludGVyc2VjdGlvbiwgZXhjZXB0IHRoYXQgaXQgd29ya3Mgb24gc2V0PD4ncyBhbmQKKy8vLyBpcyBuaWNlciB0byB1c2UuICBGdW5jdGlvbmFsbHksIHRoaXMgaXRlcmF0ZXMgdGhyb3VnaCBTMSwgcmVtb3ZpbmcKKy8vLyBlbGVtZW50cyB0aGF0IGFyZSBub3QgY29udGFpbmVkIGluIFMyLgorLy8vCit0ZW1wbGF0ZSA8Y2xhc3MgUzFUeSwgY2xhc3MgUzJUeT4KK3ZvaWQgc2V0X2ludGVyc2VjdChTMVR5ICZTMSwgY29uc3QgUzJUeSAmUzIpIHsKKyAgIGZvciAodHlwZW5hbWUgUzFUeTo6aXRlcmF0b3IgSSA9IFMxLmJlZ2luKCk7IEkgIT0gUzEuZW5kKCk7KSB7CisgICAgIGNvbnN0IGF1dG8gJkUgPSAqSTsKKyAgICAgKytJOworICAgICBpZiAoIVMyLmNvdW50KEUpKSBTMS5lcmFzZShFKTsgICAvLyBFcmFzZSBlbGVtZW50IGlmIG5vdCBpbiBTMgorICAgfQorfQorCisvLy8gc2V0X2RpZmZlcmVuY2UoQSwgQikgLSBSZXR1cm4gQSAtIEIKKy8vLwordGVtcGxhdGUgPGNsYXNzIFMxVHksIGNsYXNzIFMyVHk+CitTMVR5IHNldF9kaWZmZXJlbmNlKGNvbnN0IFMxVHkgJlMxLCBjb25zdCBTMlR5ICZTMikgeworICBTMVR5IFJlc3VsdDsKKyAgZm9yICh0eXBlbmFtZSBTMVR5Ojpjb25zdF9pdGVyYXRvciBTSSA9IFMxLmJlZ2luKCksIFNFID0gUzEuZW5kKCk7CisgICAgICAgU0kgIT0gU0U7ICsrU0kpCisgICAgaWYgKCFTMi5jb3VudCgqU0kpKSAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBpcyBub3QgaW4gc2V0MgorICAgICAgUmVzdWx0Lmluc2VydCgqU0kpOworICByZXR1cm4gUmVzdWx0OworfQorCisvLy8gc2V0X3N1YnRyYWN0KEEsIEIpIC0gQ29tcHV0ZSBBIDo9IEEgLSBCCisvLy8KK3RlbXBsYXRlIDxjbGFzcyBTMVR5LCBjbGFzcyBTMlR5Pgordm9pZCBzZXRfc3VidHJhY3QoUzFUeSAmUzEsIGNvbnN0IFMyVHkgJlMyKSB7CisgIGZvciAodHlwZW5hbWUgUzJUeTo6Y29uc3RfaXRlcmF0b3IgU0kgPSBTMi5iZWdpbigpLCBTRSA9IFMyLmVuZCgpOworICAgICAgIFNJICE9IFNFOyArK1NJKQorICAgIFMxLmVyYXNlKCpTSSk7Cit9CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU2V0VmVjdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TZXRWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGVkNTJmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU2V0VmVjdG9yLmgKQEAgLTAsMCArMSwzMTIgQEAKKy8vPT09LSBsbHZtL0FEVC9TZXRWZWN0b3IuaCAtIFNldCB3aXRoIGluc2VydCBvcmRlciBpdGVyYXRpb24gLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSBzZXQgdGhhdCBoYXMgaW5zZXJ0aW9uIG9yZGVyIGl0ZXJhdGlvbgorLy8gY2hhcmFjdGVyaXN0aWNzLiBUaGlzIGlzIHVzZWZ1bCBmb3Iga2VlcGluZyBhIHNldCBvZiB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlCisvLyB2aXNpdGVkIGxhdGVyIGJ1dCBpbiBhIGRldGVybWluaXN0aWMgb3JkZXIgKGluc2VydGlvbiBvcmRlcikuIFRoZSBpbnRlcmZhY2UKKy8vIGlzIHB1cnBvc2VmdWxseSBtaW5pbWFsLgorLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIFNldFZlY3RvciBhbmQgU21hbGxTZXRWZWN0b3IsIHdoaWNoIHBlcmZvcm1zIG5vIGFsbG9jYXRpb25zCisvLyBpZiB0aGUgU2V0VmVjdG9yIGhhcyBsZXNzIHRoYW4gYSBjZXJ0YWluIG51bWJlciBvZiBlbGVtZW50cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NFVFZFQ1RPUl9ICisjZGVmaW5lIExMVk1fQURUX1NFVFZFQ1RPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgQSB2ZWN0b3IgdGhhdCBoYXMgc2V0IGluc2VydGlvbiBzZW1hbnRpY3MuCisvLy8KKy8vLyBUaGlzIGFkYXB0ZXIgY2xhc3MgcHJvdmlkZXMgYSB3YXkgdG8ga2VlcCBhIHNldCBvZiB0aGluZ3MgdGhhdCBhbHNvIGhhcyB0aGUKKy8vLyBwcm9wZXJ0eSBvZiBhIGRldGVybWluaXN0aWMgaXRlcmF0aW9uIG9yZGVyLiBUaGUgb3JkZXIgb2YgaXRlcmF0aW9uIGlzIHRoZQorLy8vIG9yZGVyIG9mIGluc2VydGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBWZWN0b3IgPSBzdGQ6OnZlY3RvcjxUPiwKKyAgICAgICAgICB0eXBlbmFtZSBTZXQgPSBEZW5zZVNldDxUPj4KK2NsYXNzIFNldFZlY3RvciB7CitwdWJsaWM6CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBUOworICB1c2luZyBrZXlfdHlwZSA9IFQ7CisgIHVzaW5nIHJlZmVyZW5jZSA9IFQmOworICB1c2luZyBjb25zdF9yZWZlcmVuY2UgPSBjb25zdCBUJjsKKyAgdXNpbmcgc2V0X3R5cGUgPSBTZXQ7CisgIHVzaW5nIHZlY3Rvcl90eXBlID0gVmVjdG9yOworICB1c2luZyBpdGVyYXRvciA9IHR5cGVuYW1lIHZlY3Rvcl90eXBlOjpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSB0eXBlbmFtZSB2ZWN0b3JfdHlwZTo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIHJldmVyc2VfaXRlcmF0b3IgPSB0eXBlbmFtZSB2ZWN0b3JfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciA9IHR5cGVuYW1lIHZlY3Rvcl90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICB1c2luZyBzaXplX3R5cGUgPSB0eXBlbmFtZSB2ZWN0b3JfdHlwZTo6c2l6ZV90eXBlOworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIGVtcHR5IFNldFZlY3RvcgorICBTZXRWZWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBJbml0aWFsaXplIGEgU2V0VmVjdG9yIHdpdGggYSByYW5nZSBvZiBlbGVtZW50cworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgU2V0VmVjdG9yKEl0IFN0YXJ0LCBJdCBFbmQpIHsKKyAgICBpbnNlcnQoU3RhcnQsIEVuZCk7CisgIH0KKworICBBcnJheVJlZjxUPiBnZXRBcnJheVJlZigpIGNvbnN0IHsgcmV0dXJuIHZlY3Rvcl87IH0KKworICAvLy8gQ2xlYXIgdGhlIFNldFZlY3RvciBhbmQgcmV0dXJuIHRoZSB1bmRlcmx5aW5nIHZlY3Rvci4KKyAgVmVjdG9yIHRha2VWZWN0b3IoKSB7CisgICAgc2V0Xy5jbGVhcigpOworICAgIHJldHVybiBzdGQ6Om1vdmUodmVjdG9yXyk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSBpZiB0aGUgU2V0VmVjdG9yIGlzIGVtcHR5IG9yIG5vdC4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdmVjdG9yXy5lbXB0eSgpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgU2V0VmVjdG9yLgorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdmVjdG9yXy5zaXplKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBTZXRWZWN0b3IuCisgIGl0ZXJhdG9yIGJlZ2luKCkgeworICAgIHJldHVybiB2ZWN0b3JfLmJlZ2luKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBhIGNvbnN0X2l0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFNldFZlY3Rvci4KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIHZlY3Rvcl8uYmVnaW4oKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGFuIGl0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIFNldFZlY3Rvci4KKyAgaXRlcmF0b3IgZW5kKCkgeworICAgIHJldHVybiB2ZWN0b3JfLmVuZCgpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYSBjb25zdF9pdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBTZXRWZWN0b3IuCisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gdmVjdG9yXy5lbmQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGFuIHJldmVyc2VfaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgU2V0VmVjdG9yLgorICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsKKyAgICByZXR1cm4gdmVjdG9yXy5yYmVnaW4oKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGEgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBTZXRWZWN0b3IuCisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiB2ZWN0b3JfLnJiZWdpbigpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYSByZXZlcnNlX2l0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFNldFZlY3Rvci4KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeworICAgIHJldHVybiB2ZWN0b3JfLnJlbmQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGEgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBTZXRWZWN0b3IuCisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gdmVjdG9yXy5yZW5kKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgU2V0VmVjdG9yLgorICBjb25zdCBUICZmcm9udCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWVtcHR5KCkgJiYgIkNhbm5vdCBjYWxsIGZyb250KCkgb24gZW1wdHkgU2V0VmVjdG9yISIpOworICAgIHJldHVybiB2ZWN0b3JfLmZyb250KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBTZXRWZWN0b3IuCisgIGNvbnN0IFQgJmJhY2soKSBjb25zdCB7CisgICAgYXNzZXJ0KCFlbXB0eSgpICYmICJDYW5ub3QgY2FsbCBiYWNrKCkgb24gZW1wdHkgU2V0VmVjdG9yISIpOworICAgIHJldHVybiB2ZWN0b3JfLmJhY2soKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSW5kZXggaW50byB0aGUgU2V0VmVjdG9yLgorICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgbikgY29uc3QgeworICAgIGFzc2VydChuIDwgdmVjdG9yXy5zaXplKCkgJiYgIlNldFZlY3RvciBhY2Nlc3Mgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiB2ZWN0b3JfW25dOworICB9CisKKyAgLy8vIFxicmllZiBJbnNlcnQgYSBuZXcgZWxlbWVudCBpbnRvIHRoZSBTZXRWZWN0b3IuCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZSBlbGVtZW50IHdhcyBpbnNlcnRlZCBpbnRvIHRoZSBTZXRWZWN0b3IuCisgIGJvb2wgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUgJlgpIHsKKyAgICBib29sIHJlc3VsdCA9IHNldF8uaW5zZXJ0KFgpLnNlY29uZDsKKyAgICBpZiAocmVzdWx0KQorICAgICAgdmVjdG9yXy5wdXNoX2JhY2soWCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vLyBcYnJpZWYgSW5zZXJ0IGEgcmFuZ2Ugb2YgZWxlbWVudHMgaW50byB0aGUgU2V0VmVjdG9yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgdm9pZCBpbnNlcnQoSXQgU3RhcnQsIEl0IEVuZCkgeworICAgIGZvciAoOyBTdGFydCAhPSBFbmQ7ICsrU3RhcnQpCisgICAgICBpZiAoc2V0Xy5pbnNlcnQoKlN0YXJ0KS5zZWNvbmQpCisgICAgICAgIHZlY3Rvcl8ucHVzaF9iYWNrKCpTdGFydCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlbW92ZSBhbiBpdGVtIGZyb20gdGhlIHNldCB2ZWN0b3IuCisgIGJvb2wgcmVtb3ZlKGNvbnN0IHZhbHVlX3R5cGUmIFgpIHsKKyAgICBpZiAoc2V0Xy5lcmFzZShYKSkgeworICAgICAgdHlwZW5hbWUgdmVjdG9yX3R5cGU6Oml0ZXJhdG9yIEkgPSBmaW5kKHZlY3Rvcl8sIFgpOworICAgICAgYXNzZXJ0KEkgIT0gdmVjdG9yXy5lbmQoKSAmJiAiQ29ycnVwdGVkIFNldFZlY3RvciBpbnN0YW5jZXMhIik7CisgICAgICB2ZWN0b3JfLmVyYXNlKEkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBFcmFzZSBhIHNpbmdsZSBlbGVtZW50IGZyb20gdGhlIHNldCB2ZWN0b3IuCisgIC8vLyBccmV0dXJucyBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbmV4dCBlbGVtZW50IHRoYXQgZm9sbG93ZWQgdGhlCisgIC8vLyBlbGVtZW50IGVyYXNlZC4gVGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBTZXRWZWN0b3IgaWYgdGhlIGxhc3QgZWxlbWVudCBpcworICAvLy8gZXJhc2VkLgorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBJKSB7CisgICAgY29uc3Qga2V5X3R5cGUgJlYgPSAqSTsKKyAgICBhc3NlcnQoc2V0Xy5jb3VudChWKSAmJiAiQ29ycnVwdGVkIFNldFZlY3RvciBpbnN0YW5jZXMhIik7CisgICAgc2V0Xy5lcmFzZShWKTsKKworICAgIC8vIEZJWE1FOiBObyBuZWVkIHRvIHVzZSB0aGUgbm9uLWNvbnN0IGl0ZXJhdG9yIHdoZW4gYnVpbHQgd2l0aAorICAgIC8vIHN0ZDp2ZWN0b3IuZXJhc2UoY29uc3RfaXRlcmF0b3IpIGFzIGRlZmluZWQgaW4gQysrMTEuIFRoaXMgaXMgZm9yCisgICAgLy8gY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1zdGFuZGFyZCBsaWJzdGRjKysgdXAgdG8gNC44IChmaXhlZCBpbiA0LjkpLgorICAgIGF1dG8gTkkgPSB2ZWN0b3JfLmJlZ2luKCk7CisgICAgc3RkOjphZHZhbmNlKE5JLCBzdGQ6OmRpc3RhbmNlPGl0ZXJhdG9yPihOSSwgSSkpOworCisgICAgcmV0dXJuIHZlY3Rvcl8uZXJhc2UoTkkpOworICB9CisKKyAgLy8vIFxicmllZiBSZW1vdmUgaXRlbXMgZnJvbSB0aGUgc2V0IHZlY3RvciBiYXNlZCBvbiBhIHByZWRpY2F0ZSBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBjb2RlLCBpZiB3ZSBjb3VsZAorICAvLy8gd3JpdGUgaXQ6CisgIC8vLworICAvLy8gXGNvZGUKKyAgLy8vICAgVi5lcmFzZShyZW1vdmVfaWYoViwgUCksIFYuZW5kKCkpOworICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBIb3dldmVyLCBTZXRWZWN0b3IgZG9lc24ndCBleHBvc2Ugbm9uLWNvbnN0IGl0ZXJhdG9ycywgbWFraW5nIGFueQorICAvLy8gYWxnb3JpdGhtIGxpa2UgcmVtb3ZlX2lmIGltcG9zc2libGUgdG8gdXNlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgYW55IGVsZW1lbnQgaXMgcmVtb3ZlZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFVuYXJ5UHJlZGljYXRlPgorICBib29sIHJlbW92ZV9pZihVbmFyeVByZWRpY2F0ZSBQKSB7CisgICAgdHlwZW5hbWUgdmVjdG9yX3R5cGU6Oml0ZXJhdG9yIEkgPQorICAgICAgICBsbHZtOjpyZW1vdmVfaWYodmVjdG9yXywgVGVzdEFuZEVyYXNlRnJvbVNldDxVbmFyeVByZWRpY2F0ZT4oUCwgc2V0XykpOworICAgIGlmIChJID09IHZlY3Rvcl8uZW5kKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgdmVjdG9yXy5lcmFzZShJLCB2ZWN0b3JfLmVuZCgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ291bnQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiBhIGdpdmVuIGtleSBpbiB0aGUgU2V0VmVjdG9yLgorICAvLy8gXHJldHVybnMgMCBpZiB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIFNldFZlY3RvciwgMSBpZiBpdCBpcy4KKyAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IGtleV90eXBlICZrZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gc2V0Xy5jb3VudChrZXkpOworICB9CisKKyAgLy8vIFxicmllZiBDb21wbGV0ZWx5IGNsZWFyIHRoZSBTZXRWZWN0b3IKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBzZXRfLmNsZWFyKCk7CisgICAgdmVjdG9yXy5jbGVhcigpOworICB9CisKKyAgLy8vIFxicmllZiBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgU2V0VmVjdG9yLgorICB2b2lkIHBvcF9iYWNrKCkgeworICAgIGFzc2VydCghZW1wdHkoKSAmJiAiQ2Fubm90IHJlbW92ZSBhbiBlbGVtZW50IGZyb20gYW4gZW1wdHkgU2V0VmVjdG9yISIpOworICAgIHNldF8uZXJhc2UoYmFjaygpKTsKKyAgICB2ZWN0b3JfLnBvcF9iYWNrKCk7CisgIH0KKworICBMTFZNX05PRElTQ0FSRCBUIHBvcF9iYWNrX3ZhbCgpIHsKKyAgICBUIFJldCA9IGJhY2soKTsKKyAgICBwb3BfYmFjaygpOworICAgIHJldHVybiBSZXQ7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgU2V0VmVjdG9yICZ0aGF0KSBjb25zdCB7CisgICAgcmV0dXJuIHZlY3Rvcl8gPT0gdGhhdC52ZWN0b3JfOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNldFZlY3RvciAmdGhhdCkgY29uc3QgeworICAgIHJldHVybiB2ZWN0b3JfICE9IHRoYXQudmVjdG9yXzsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29tcHV0ZSBUaGlzIDo9IFRoaXMgdSBTLCByZXR1cm4gd2hldGhlciAnVGhpcycgY2hhbmdlZC4KKyAgLy8vIFRPRE86IFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSBzZXRfdW5pb24gZnJvbSBTZXRPcGVyYXRpb25zLmgsIGJ1dAorICAvLy8gICAgICAgU2V0VmVjdG9yIGludGVyZmFjZSBpcyBpbmNvbnNpc3RlbnQgd2l0aCBEZW5zZVNldC4KKyAgdGVtcGxhdGUgPGNsYXNzIFNUeT4KKyAgYm9vbCBzZXRfdW5pb24oY29uc3QgU1R5ICZTKSB7CisgICAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisKKyAgICBmb3IgKHR5cGVuYW1lIFNUeTo6Y29uc3RfaXRlcmF0b3IgU0kgPSBTLmJlZ2luKCksIFNFID0gUy5lbmQoKTsgU0kgIT0gU0U7CisgICAgICAgICArK1NJKQorICAgICAgaWYgKGluc2VydCgqU0kpKQorICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKworICAgIHJldHVybiBDaGFuZ2VkOworICB9CisKKyAgLy8vIFxicmllZiBDb21wdXRlIFRoaXMgOj0gVGhpcyAtIEIKKyAgLy8vIFRPRE86IFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSBzZXRfc3VidHJhY3QgZnJvbSBTZXRPcGVyYXRpb25zLmgsIGJ1dAorICAvLy8gICAgICAgU2V0VmVjdG9yIGludGVyZmFjZSBpcyBpbmNvbnNpc3RlbnQgd2l0aCBEZW5zZVNldC4KKyAgdGVtcGxhdGUgPGNsYXNzIFNUeT4KKyAgdm9pZCBzZXRfc3VidHJhY3QoY29uc3QgU1R5ICZTKSB7CisgICAgZm9yICh0eXBlbmFtZSBTVHk6OmNvbnN0X2l0ZXJhdG9yIFNJID0gUy5iZWdpbigpLCBTRSA9IFMuZW5kKCk7IFNJICE9IFNFOworICAgICAgICAgKytTSSkKKyAgICAgIHJlbW92ZSgqU0kpOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgQSB3cmFwcGVyIHByZWRpY2F0ZSBkZXNpZ25lZCBmb3IgdXNlIHdpdGggc3RkOjpyZW1vdmVfaWYuCisgIC8vLworICAvLy8gVGhpcyBwcmVkaWNhdGUgd3JhcHMgYSBwcmVkaWNhdGUgc3VpdGFibGUgZm9yIHVzZSB3aXRoIHN0ZDo6cmVtb3ZlX2lmIHRvCisgIC8vLyBjYWxsIHNldF8uZXJhc2UoeCkgb24gZWFjaCBlbGVtZW50IHdoaWNoIGlzIHNsYXRlZCBmb3IgcmVtb3ZhbC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFVuYXJ5UHJlZGljYXRlPgorICBjbGFzcyBUZXN0QW5kRXJhc2VGcm9tU2V0IHsKKyAgICBVbmFyeVByZWRpY2F0ZSBQOworICAgIHNldF90eXBlICZzZXRfOworCisgIHB1YmxpYzoKKyAgICBUZXN0QW5kRXJhc2VGcm9tU2V0KFVuYXJ5UHJlZGljYXRlIFAsIHNldF90eXBlICZzZXRfKQorICAgICAgICA6IFAoc3RkOjptb3ZlKFApKSwgc2V0XyhzZXRfKSB7fQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ3VtZW50VD4KKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgQXJndW1lbnRUICZBcmcpIHsKKyAgICAgIGlmIChQKEFyZykpIHsKKyAgICAgICAgc2V0Xy5lcmFzZShBcmcpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH07CisKKyAgc2V0X3R5cGUgc2V0XzsgICAgICAgICAvLy88IFRoZSBzZXQuCisgIHZlY3Rvcl90eXBlIHZlY3Rvcl87ICAgLy8vPCBUaGUgdmVjdG9yLgorfTsKKworLy8vIFxicmllZiBBIFNldFZlY3RvciB0aGF0IHBlcmZvcm1zIG5vIGFsbG9jYXRpb25zIGlmIHNtYWxsZXIgdGhhbgorLy8vIGEgY2VydGFpbiBzaXplLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4+CitjbGFzcyBTbWFsbFNldFZlY3RvcgorICAgIDogcHVibGljIFNldFZlY3RvcjxULCBTbWFsbFZlY3RvcjxULCBOPiwgU21hbGxEZW5zZVNldDxULCBOPj4geworcHVibGljOgorICBTbWFsbFNldFZlY3RvcigpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIEluaXRpYWxpemUgYSBTbWFsbFNldFZlY3RvciB3aXRoIGEgcmFuZ2Ugb2YgZWxlbWVudHMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgIFNtYWxsU2V0VmVjdG9yKEl0IFN0YXJ0LCBJdCBFbmQpIHsKKyAgICB0aGlzLT5pbnNlcnQoU3RhcnQsIEVuZCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9TRVRWRUNUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxCaXRWZWN0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NtYWxsQml0VmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzOTE3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NtYWxsQml0VmVjdG9yLmgKQEAgLTAsMCArMSw3MDIgQEAKKy8vPT09LSBsbHZtL0FEVC9TbWFsbEJpdFZlY3Rvci5oIC0gJ05vcm1hbGx5IHNtYWxsJyBiaXQgdmVjdG9ycyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFNtYWxsQml0VmVjdG9yIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU01BTExCSVRWRUNUT1JfSAorI2RlZmluZSBMTFZNX0FEVF9TTUFMTEJJVFZFQ1RPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFRoaXMgaXMgYSAnYml0dmVjdG9yJyAocmVhbGx5LCBhIHZhcmlhYmxlLXNpemVkIGJpdCBhcnJheSksIG9wdGltaXplZCBmb3IKKy8vLyB0aGUgY2FzZSB3aGVuIHRoZSBhcnJheSBpcyBzbWFsbC4gSXQgY29udGFpbnMgb25lIHBvaW50ZXItc2l6ZWQgZmllbGQsIHdoaWNoCisvLy8gaXMgZGlyZWN0bHkgdXNlZCBhcyBhIHBsYWluIGNvbGxlY3Rpb24gb2YgYml0cyB3aGVuIHBvc3NpYmxlLCBvciBhcyBhCisvLy8gcG9pbnRlciB0byBhIGxhcmdlciBoZWFwLWFsbG9jYXRlZCBhcnJheSB3aGVuIG5lY2Vzc2FyeS4gVGhpcyBhbGxvd3Mgbm9ybWFsCisvLy8gInNtYWxsIiBjYXNlcyB0byBiZSBmYXN0IHdpdGhvdXQgbG9zaW5nIGdlbmVyYWxpdHkgZm9yIGxhcmdlIGlucHV0cy4KK2NsYXNzIFNtYWxsQml0VmVjdG9yIHsKKyAgLy8gVE9ETzogSW4gImxhcmdlIiBtb2RlLCBhIHBvaW50ZXIgdG8gYSBCaXRWZWN0b3IgaXMgdXNlZCwgbGVhZGluZyB0byBhbgorICAvLyB1bm5lY2Vzc2FyeSBsZXZlbCBvZiBpbmRpcmVjdGlvbi4gSXQgd291bGQgYmUgbW9yZSBlZmZpY2llbnQgdG8gdXNlIGEKKyAgLy8gcG9pbnRlciB0byBtZW1vcnkgY29udGFpbmluZyBzaXplLCBhbGxvY2F0aW9uIHNpemUsIGFuZCB0aGUgYXJyYXkgb2YgYml0cy4KKyAgdWludHB0cl90IFggPSAxOworCisgIGVudW0geworICAgIC8vIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGlzIGNsYXNzLgorICAgIE51bUJhc2VCaXRzID0gc2l6ZW9mKHVpbnRwdHJfdCkgKiBDSEFSX0JJVCwKKworICAgIC8vIE9uZSBiaXQgaXMgdXNlZCB0byBkaXNjcmltaW5hdGUgYmV0d2VlbiBzbWFsbCBhbmQgbGFyZ2UgbW9kZS4gVGhlCisgICAgLy8gcmVtYWluaW5nIGJpdHMgYXJlIHVzZWQgZm9yIHRoZSBzbWFsbC1tb2RlIHJlcHJlc2VudGF0aW9uLgorICAgIFNtYWxsTnVtUmF3Qml0cyA9IE51bUJhc2VCaXRzIC0gMSwKKworICAgIC8vIEEgZmV3IG1vcmUgYml0cyBhcmUgdXNlZCB0byBzdG9yZSB0aGUgc2l6ZSBvZiB0aGUgYml0IHNldCBpbiBzbWFsbCBtb2RlLgorICAgIC8vIFRoZW9yZXRpY2FsbHkgdGhpcyBpcyBhIGNlaWwtbG9nMi4gVGhlc2UgYml0cyBhcmUgZW5jb2RlZCBpbiB0aGUgbW9zdAorICAgIC8vIHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIHJhdyBiaXRzLgorICAgIFNtYWxsTnVtU2l6ZUJpdHMgPSAoTnVtQmFzZUJpdHMgPT0gMzIgPyA1IDoKKyAgICAgICAgICAgICAgICAgICAgICAgIE51bUJhc2VCaXRzID09IDY0ID8gNiA6CisgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbE51bVJhd0JpdHMpLAorCisgICAgLy8gVGhlIHJlbWFpbmluZyBiaXRzIGFyZSB1c2VkIHRvIHN0b3JlIHRoZSBhY3R1YWwgc2V0IGluIHNtYWxsIG1vZGUuCisgICAgU21hbGxOdW1EYXRhQml0cyA9IFNtYWxsTnVtUmF3Qml0cyAtIFNtYWxsTnVtU2l6ZUJpdHMKKyAgfTsKKworICBzdGF0aWNfYXNzZXJ0KE51bUJhc2VCaXRzID09IDY0IHx8IE51bUJhc2VCaXRzID09IDMyLAorICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCB3b3JkIHNpemUiKTsKKworcHVibGljOgorICB1c2luZyBzaXplX3R5cGUgPSB1bnNpZ25lZDsKKworICAvLyBFbmNhcHN1bGF0aW9uIG9mIGEgc2luZ2xlIGJpdC4KKyAgY2xhc3MgcmVmZXJlbmNlIHsKKyAgICBTbWFsbEJpdFZlY3RvciAmVGhlVmVjdG9yOworICAgIHVuc2lnbmVkIEJpdFBvczsKKworICBwdWJsaWM6CisgICAgcmVmZXJlbmNlKFNtYWxsQml0VmVjdG9yICZiLCB1bnNpZ25lZCBJZHgpIDogVGhlVmVjdG9yKGIpLCBCaXRQb3MoSWR4KSB7fQorCisgICAgcmVmZXJlbmNlKGNvbnN0IHJlZmVyZW5jZSYpID0gZGVmYXVsdDsKKworICAgIHJlZmVyZW5jZSYgb3BlcmF0b3I9KHJlZmVyZW5jZSB0KSB7CisgICAgICAqdGhpcyA9IGJvb2wodCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgcmVmZXJlbmNlJiBvcGVyYXRvcj0oYm9vbCB0KSB7CisgICAgICBpZiAodCkKKyAgICAgICAgVGhlVmVjdG9yLnNldChCaXRQb3MpOworICAgICAgZWxzZQorICAgICAgICBUaGVWZWN0b3IucmVzZXQoQml0UG9zKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y29uc3QgU21hbGxCaXRWZWN0b3IgJj4oVGhlVmVjdG9yKS5vcGVyYXRvcltdKEJpdFBvcyk7CisgICAgfQorICB9OworCitwcml2YXRlOgorICBib29sIGlzU21hbGwoKSBjb25zdCB7CisgICAgcmV0dXJuIFggJiB1aW50cHRyX3QoMSk7CisgIH0KKworICBCaXRWZWN0b3IgKmdldFBvaW50ZXIoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpc1NtYWxsKCkpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEJpdFZlY3RvciAqPihYKTsKKyAgfQorCisgIHZvaWQgc3dpdGNoVG9TbWFsbCh1aW50cHRyX3QgTmV3U21hbGxCaXRzLCBzaXplX3QgTmV3U2l6ZSkgeworICAgIFggPSAxOworICAgIHNldFNtYWxsU2l6ZShOZXdTaXplKTsKKyAgICBzZXRTbWFsbEJpdHMoTmV3U21hbGxCaXRzKTsKKyAgfQorCisgIHZvaWQgc3dpdGNoVG9MYXJnZShCaXRWZWN0b3IgKkJWKSB7CisgICAgWCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihCVik7CisgICAgYXNzZXJ0KCFpc1NtYWxsKCkgJiYgIlRyaWVkIHRvIHVzZSBhbiB1bmFsaWduZWQgcG9pbnRlciIpOworICB9CisKKyAgLy8gUmV0dXJuIGFsbCB0aGUgYml0cyB1c2VkIGZvciB0aGUgInNtYWxsIiByZXByZXNlbnRhdGlvbjsgdGhpcyBpbmNsdWRlcworICAvLyBiaXRzIGZvciB0aGUgc2l6ZSBhcyB3ZWxsIGFzIHRoZSBlbGVtZW50IGJpdHMuCisgIHVpbnRwdHJfdCBnZXRTbWFsbFJhd0JpdHMoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzU21hbGwoKSk7CisgICAgcmV0dXJuIFggPj4gMTsKKyAgfQorCisgIHZvaWQgc2V0U21hbGxSYXdCaXRzKHVpbnRwdHJfdCBOZXdSYXdCaXRzKSB7CisgICAgYXNzZXJ0KGlzU21hbGwoKSk7CisgICAgWCA9IChOZXdSYXdCaXRzIDw8IDEpIHwgdWludHB0cl90KDEpOworICB9CisKKyAgLy8gUmV0dXJuIHRoZSBzaXplLgorICBzaXplX3QgZ2V0U21hbGxTaXplKCkgY29uc3QgeyByZXR1cm4gZ2V0U21hbGxSYXdCaXRzKCkgPj4gU21hbGxOdW1EYXRhQml0czsgfQorCisgIHZvaWQgc2V0U21hbGxTaXplKHNpemVfdCBTaXplKSB7CisgICAgc2V0U21hbGxSYXdCaXRzKGdldFNtYWxsQml0cygpIHwgKFNpemUgPDwgU21hbGxOdW1EYXRhQml0cykpOworICB9CisKKyAgLy8gUmV0dXJuIHRoZSBlbGVtZW50IGJpdHMuCisgIHVpbnRwdHJfdCBnZXRTbWFsbEJpdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFNtYWxsUmF3Qml0cygpICYgfih+dWludHB0cl90KDApIDw8IGdldFNtYWxsU2l6ZSgpKTsKKyAgfQorCisgIHZvaWQgc2V0U21hbGxCaXRzKHVpbnRwdHJfdCBOZXdCaXRzKSB7CisgICAgc2V0U21hbGxSYXdCaXRzKChOZXdCaXRzICYgfih+dWludHB0cl90KDApIDw8IGdldFNtYWxsU2l6ZSgpKSkgfAorICAgICAgICAgICAgICAgICAgICAoZ2V0U21hbGxTaXplKCkgPDwgU21hbGxOdW1EYXRhQml0cykpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZXMgYW4gZW1wdHkgYml0dmVjdG9yLgorICBTbWFsbEJpdFZlY3RvcigpID0gZGVmYXVsdDsKKworICAvLy8gQ3JlYXRlcyBhIGJpdHZlY3RvciBvZiBzcGVjaWZpZWQgbnVtYmVyIG9mIGJpdHMuIEFsbCBiaXRzIGFyZSBpbml0aWFsaXplZAorICAvLy8gdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgZXhwbGljaXQgU21hbGxCaXRWZWN0b3IodW5zaWduZWQgcywgYm9vbCB0ID0gZmFsc2UpIHsKKyAgICBpZiAocyA8PSBTbWFsbE51bURhdGFCaXRzKQorICAgICAgc3dpdGNoVG9TbWFsbCh0ID8gfnVpbnRwdHJfdCgwKSA6IDAsIHMpOworICAgIGVsc2UKKyAgICAgIHN3aXRjaFRvTGFyZ2UobmV3IEJpdFZlY3RvcihzLCB0KSk7CisgIH0KKworICAvLy8gU21hbGxCaXRWZWN0b3IgY29weSBjdG9yLgorICBTbWFsbEJpdFZlY3Rvcihjb25zdCBTbWFsbEJpdFZlY3RvciAmUkhTKSB7CisgICAgaWYgKFJIUy5pc1NtYWxsKCkpCisgICAgICBYID0gUkhTLlg7CisgICAgZWxzZQorICAgICAgc3dpdGNoVG9MYXJnZShuZXcgQml0VmVjdG9yKCpSSFMuZ2V0UG9pbnRlcigpKSk7CisgIH0KKworICBTbWFsbEJpdFZlY3RvcihTbWFsbEJpdFZlY3RvciAmJlJIUykgOiBYKFJIUy5YKSB7CisgICAgUkhTLlggPSAxOworICB9CisKKyAgflNtYWxsQml0VmVjdG9yKCkgeworICAgIGlmICghaXNTbWFsbCgpKQorICAgICAgZGVsZXRlIGdldFBvaW50ZXIoKTsKKyAgfQorCisgIHVzaW5nIGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yID0gY29uc3Rfc2V0X2JpdHNfaXRlcmF0b3JfaW1wbDxTbWFsbEJpdFZlY3Rvcj47CisgIHVzaW5nIHNldF9pdGVyYXRvciA9IGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yOworCisgIGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yIHNldF9iaXRzX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9zZXRfYml0c19pdGVyYXRvcigqdGhpcyk7CisgIH0KKworICBjb25zdF9zZXRfYml0c19pdGVyYXRvciBzZXRfYml0c19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yKCp0aGlzLCAtMSk7CisgIH0KKworICBpdGVyYXRvcl9yYW5nZTxjb25zdF9zZXRfYml0c19pdGVyYXRvcj4gc2V0X2JpdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2Uoc2V0X2JpdHNfYmVnaW4oKSwgc2V0X2JpdHNfZW5kKCkpOworICB9CisKKyAgLy8vIFRlc3RzIHdoZXRoZXIgdGhlcmUgYXJlIG5vIGJpdHMgaW4gdGhpcyBiaXR2ZWN0b3IuCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzU21hbGwoKSA/IGdldFNtYWxsU2l6ZSgpID09IDAgOiBnZXRQb2ludGVyKCktPmVtcHR5KCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhpcyBiaXR2ZWN0b3IuCisgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgIHJldHVybiBpc1NtYWxsKCkgPyBnZXRTbWFsbFNpemUoKSA6IGdldFBvaW50ZXIoKS0+c2l6ZSgpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIHdoaWNoIGFyZSBzZXQuCisgIHNpemVfdHlwZSBjb3VudCgpIGNvbnN0IHsKKyAgICBpZiAoaXNTbWFsbCgpKSB7CisgICAgICB1aW50cHRyX3QgQml0cyA9IGdldFNtYWxsQml0cygpOworICAgICAgcmV0dXJuIGNvdW50UG9wdWxhdGlvbihCaXRzKTsKKyAgICB9CisgICAgcmV0dXJuIGdldFBvaW50ZXIoKS0+Y291bnQoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW55IGJpdCBpcyBzZXQuCisgIGJvb2wgYW55KCkgY29uc3QgeworICAgIGlmIChpc1NtYWxsKCkpCisgICAgICByZXR1cm4gZ2V0U21hbGxCaXRzKCkgIT0gMDsKKyAgICByZXR1cm4gZ2V0UG9pbnRlcigpLT5hbnkoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYWxsIGJpdHMgYXJlIHNldC4KKyAgYm9vbCBhbGwoKSBjb25zdCB7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIHJldHVybiBnZXRTbWFsbEJpdHMoKSA9PSAodWludHB0cl90KDEpIDw8IGdldFNtYWxsU2l6ZSgpKSAtIDE7CisgICAgcmV0dXJuIGdldFBvaW50ZXIoKS0+YWxsKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIG5vbmUgb2YgdGhlIGJpdHMgYXJlIHNldC4KKyAgYm9vbCBub25lKCkgY29uc3QgeworICAgIGlmIChpc1NtYWxsKCkpCisgICAgICByZXR1cm4gZ2V0U21hbGxCaXRzKCkgPT0gMDsKKyAgICByZXR1cm4gZ2V0UG9pbnRlcigpLT5ub25lKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHNldCBiaXQsIC0xIGlmIG5vbmUgb2YgdGhlIGJpdHMgYXJlIHNldC4KKyAgaW50IGZpbmRfZmlyc3QoKSBjb25zdCB7CisgICAgaWYgKGlzU21hbGwoKSkgeworICAgICAgdWludHB0cl90IEJpdHMgPSBnZXRTbWFsbEJpdHMoKTsKKyAgICAgIGlmIChCaXRzID09IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIHJldHVybiBjb3VudFRyYWlsaW5nWmVyb3MoQml0cyk7CisgICAgfQorICAgIHJldHVybiBnZXRQb2ludGVyKCktPmZpbmRfZmlyc3QoKTsKKyAgfQorCisgIGludCBmaW5kX2xhc3QoKSBjb25zdCB7CisgICAgaWYgKGlzU21hbGwoKSkgeworICAgICAgdWludHB0cl90IEJpdHMgPSBnZXRTbWFsbEJpdHMoKTsKKyAgICAgIGlmIChCaXRzID09IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIHJldHVybiBOdW1CYXNlQml0cyAtIGNvdW50TGVhZGluZ1plcm9zKEJpdHMpOworICAgIH0KKyAgICByZXR1cm4gZ2V0UG9pbnRlcigpLT5maW5kX2xhc3QoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5zZXQgYml0LCAtMSBpZiBhbGwgb2YgdGhlIGJpdHMgYXJlIHNldC4KKyAgaW50IGZpbmRfZmlyc3RfdW5zZXQoKSBjb25zdCB7CisgICAgaWYgKGlzU21hbGwoKSkgeworICAgICAgaWYgKGNvdW50KCkgPT0gZ2V0U21hbGxTaXplKCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgICAgdWludHB0cl90IEJpdHMgPSBnZXRTbWFsbEJpdHMoKTsKKyAgICAgIHJldHVybiBjb3VudFRyYWlsaW5nT25lcyhCaXRzKTsKKyAgICB9CisgICAgcmV0dXJuIGdldFBvaW50ZXIoKS0+ZmluZF9maXJzdF91bnNldCgpOworICB9CisKKyAgaW50IGZpbmRfbGFzdF91bnNldCgpIGNvbnN0IHsKKyAgICBpZiAoaXNTbWFsbCgpKSB7CisgICAgICBpZiAoY291bnQoKSA9PSBnZXRTbWFsbFNpemUoKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgICB1aW50cHRyX3QgQml0cyA9IGdldFNtYWxsQml0cygpOworICAgICAgcmV0dXJuIE51bUJhc2VCaXRzIC0gY291bnRMZWFkaW5nT25lcyhCaXRzKTsKKyAgICB9CisgICAgcmV0dXJuIGdldFBvaW50ZXIoKS0+ZmluZF9sYXN0X3Vuc2V0KCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5leHQgc2V0IGJpdCBmb2xsb3dpbmcgdGhlICJQcmV2IiBiaXQuCisgIC8vLyBSZXR1cm5zIC0xIGlmIHRoZSBuZXh0IHNldCBiaXQgaXMgbm90IGZvdW5kLgorICBpbnQgZmluZF9uZXh0KHVuc2lnbmVkIFByZXYpIGNvbnN0IHsKKyAgICBpZiAoaXNTbWFsbCgpKSB7CisgICAgICB1aW50cHRyX3QgQml0cyA9IGdldFNtYWxsQml0cygpOworICAgICAgLy8gTWFzayBvZmYgcHJldmlvdXMgYml0cy4KKyAgICAgIEJpdHMgJj0gfnVpbnRwdHJfdCgwKSA8PCAoUHJldiArIDEpOworICAgICAgaWYgKEJpdHMgPT0gMCB8fCBQcmV2ICsgMSA+PSBnZXRTbWFsbFNpemUoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgcmV0dXJuIGNvdW50VHJhaWxpbmdaZXJvcyhCaXRzKTsKKyAgICB9CisgICAgcmV0dXJuIGdldFBvaW50ZXIoKS0+ZmluZF9uZXh0KFByZXYpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHVuc2V0IGJpdCBmb2xsb3dpbmcgdGhlICJQcmV2IiBiaXQuCisgIC8vLyBSZXR1cm5zIC0xIGlmIHRoZSBuZXh0IHVuc2V0IGJpdCBpcyBub3QgZm91bmQuCisgIGludCBmaW5kX25leHRfdW5zZXQodW5zaWduZWQgUHJldikgY29uc3QgeworICAgIGlmIChpc1NtYWxsKCkpIHsKKyAgICAgICsrUHJldjsKKyAgICAgIHVpbnRwdHJfdCBCaXRzID0gZ2V0U21hbGxCaXRzKCk7CisgICAgICAvLyBNYXNrIGluIHByZXZpb3VzIGJpdHMuCisgICAgICB1aW50cHRyX3QgTWFzayA9ICgxIDw8IFByZXYpIC0gMTsKKyAgICAgIEJpdHMgfD0gTWFzazsKKworICAgICAgaWYgKEJpdHMgPT0gfnVpbnRwdHJfdCgwKSB8fCBQcmV2ICsgMSA+PSBnZXRTbWFsbFNpemUoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgcmV0dXJuIGNvdW50VHJhaWxpbmdPbmVzKEJpdHMpOworICAgIH0KKyAgICByZXR1cm4gZ2V0UG9pbnRlcigpLT5maW5kX25leHRfdW5zZXQoUHJldik7CisgIH0KKworICAvLy8gZmluZF9wcmV2IC0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHNldCBiaXQgdGhhdCBwcmVjZWRlcyB0aGUKKyAgLy8vIHRoZSBiaXQgYXQgXHAgUHJpb3JUby4gIFJldHVybnMgLTEgaWYgYWxsIHByZXZpb3VzIGJpdHMgYXJlIHVuc2V0LgorICBpbnQgZmluZF9wcmV2KHVuc2lnbmVkIFByaW9yVG8pIGNvbnN0IHsKKyAgICBpZiAoaXNTbWFsbCgpKSB7CisgICAgICBpZiAoUHJpb3JUbyA9PSAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgIC0tUHJpb3JUbzsKKyAgICAgIHVpbnRwdHJfdCBCaXRzID0gZ2V0U21hbGxCaXRzKCk7CisgICAgICBCaXRzICY9IG1hc2tUcmFpbGluZ09uZXM8dWludHB0cl90PihQcmlvclRvICsgMSk7CisgICAgICBpZiAoQml0cyA9PSAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgIHJldHVybiBOdW1CYXNlQml0cyAtIGNvdW50TGVhZGluZ1plcm9zKEJpdHMpIC0gMTsKKyAgICB9CisgICAgcmV0dXJuIGdldFBvaW50ZXIoKS0+ZmluZF9wcmV2KFByaW9yVG8pOworICB9CisKKyAgLy8vIENsZWFyIGFsbCBiaXRzLgorICB2b2lkIGNsZWFyKCkgeworICAgIGlmICghaXNTbWFsbCgpKQorICAgICAgZGVsZXRlIGdldFBvaW50ZXIoKTsKKyAgICBzd2l0Y2hUb1NtYWxsKDAsIDApOworICB9CisKKyAgLy8vIEdyb3cgb3Igc2hyaW5rIHRoZSBiaXR2ZWN0b3IuCisgIHZvaWQgcmVzaXplKHVuc2lnbmVkIE4sIGJvb2wgdCA9IGZhbHNlKSB7CisgICAgaWYgKCFpc1NtYWxsKCkpIHsKKyAgICAgIGdldFBvaW50ZXIoKS0+cmVzaXplKE4sIHQpOworICAgIH0gZWxzZSBpZiAoU21hbGxOdW1EYXRhQml0cyA+PSBOKSB7CisgICAgICB1aW50cHRyX3QgTmV3Qml0cyA9IHQgPyB+dWludHB0cl90KDApIDw8IGdldFNtYWxsU2l6ZSgpIDogMDsKKyAgICAgIHNldFNtYWxsU2l6ZShOKTsKKyAgICAgIHNldFNtYWxsQml0cyhOZXdCaXRzIHwgZ2V0U21hbGxCaXRzKCkpOworICAgIH0gZWxzZSB7CisgICAgICBCaXRWZWN0b3IgKkJWID0gbmV3IEJpdFZlY3RvcihOLCB0KTsKKyAgICAgIHVpbnRwdHJfdCBPbGRCaXRzID0gZ2V0U21hbGxCaXRzKCk7CisgICAgICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IGdldFNtYWxsU2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgKCpCVilbaV0gPSAoT2xkQml0cyA+PiBpKSAmIDE7CisgICAgICBzd2l0Y2hUb0xhcmdlKEJWKTsKKyAgICB9CisgIH0KKworICB2b2lkIHJlc2VydmUodW5zaWduZWQgTikgeworICAgIGlmIChpc1NtYWxsKCkpIHsKKyAgICAgIGlmIChOID4gU21hbGxOdW1EYXRhQml0cykgeworICAgICAgICB1aW50cHRyX3QgT2xkQml0cyA9IGdldFNtYWxsUmF3Qml0cygpOworICAgICAgICBzaXplX3QgU21hbGxTaXplID0gZ2V0U21hbGxTaXplKCk7CisgICAgICAgIEJpdFZlY3RvciAqQlYgPSBuZXcgQml0VmVjdG9yKFNtYWxsU2l6ZSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgU21hbGxTaXplOyArK2kpCisgICAgICAgICAgaWYgKChPbGRCaXRzID4+IGkpICYgMSkKKyAgICAgICAgICAgIEJWLT5zZXQoaSk7CisgICAgICAgIEJWLT5yZXNlcnZlKE4pOworICAgICAgICBzd2l0Y2hUb0xhcmdlKEJWKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZ2V0UG9pbnRlcigpLT5yZXNlcnZlKE4pOworICAgIH0KKyAgfQorCisgIC8vIFNldCwgcmVzZXQsIGZsaXAKKyAgU21hbGxCaXRWZWN0b3IgJnNldCgpIHsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgc2V0U21hbGxCaXRzKH51aW50cHRyX3QoMCkpOworICAgIGVsc2UKKyAgICAgIGdldFBvaW50ZXIoKS0+c2V0KCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgU21hbGxCaXRWZWN0b3IgJnNldCh1bnNpZ25lZCBJZHgpIHsKKyAgICBpZiAoaXNTbWFsbCgpKSB7CisgICAgICBhc3NlcnQoSWR4IDw9IHN0YXRpY19jYXN0PHVuc2lnbmVkPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludHB0cl90Pjo6ZGlnaXRzKSAmJgorICAgICAgICAgICAgICJ1bmRlZmluZWQgYmVoYXZpb3IiKTsKKyAgICAgIHNldFNtYWxsQml0cyhnZXRTbWFsbEJpdHMoKSB8ICh1aW50cHRyX3QoMSkgPDwgSWR4KSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGdldFBvaW50ZXIoKS0+c2V0KElkeCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIEVmZmljaWVudGx5IHNldCBhIHJhbmdlIG9mIGJpdHMgaW4gW0ksIEUpCisgIFNtYWxsQml0VmVjdG9yICZzZXQodW5zaWduZWQgSSwgdW5zaWduZWQgRSkgeworICAgIGFzc2VydChJIDw9IEUgJiYgIkF0dGVtcHRlZCB0byBzZXQgYmFja3dhcmRzIHJhbmdlISIpOworICAgIGFzc2VydChFIDw9IHNpemUoKSAmJiAiQXR0ZW1wdGVkIHRvIHNldCBvdXQtb2YtYm91bmRzIHJhbmdlISIpOworICAgIGlmIChJID09IEUpIHJldHVybiAqdGhpczsKKyAgICBpZiAoaXNTbWFsbCgpKSB7CisgICAgICB1aW50cHRyX3QgRU1hc2sgPSAoKHVpbnRwdHJfdCkxKSA8PCBFOworICAgICAgdWludHB0cl90IElNYXNrID0gKCh1aW50cHRyX3QpMSkgPDwgSTsKKyAgICAgIHVpbnRwdHJfdCBNYXNrID0gRU1hc2sgLSBJTWFzazsKKyAgICAgIHNldFNtYWxsQml0cyhnZXRTbWFsbEJpdHMoKSB8IE1hc2spOworICAgIH0gZWxzZQorICAgICAgZ2V0UG9pbnRlcigpLT5zZXQoSSwgRSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgU21hbGxCaXRWZWN0b3IgJnJlc2V0KCkgeworICAgIGlmIChpc1NtYWxsKCkpCisgICAgICBzZXRTbWFsbEJpdHMoMCk7CisgICAgZWxzZQorICAgICAgZ2V0UG9pbnRlcigpLT5yZXNldCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFNtYWxsQml0VmVjdG9yICZyZXNldCh1bnNpZ25lZCBJZHgpIHsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgc2V0U21hbGxCaXRzKGdldFNtYWxsQml0cygpICYgfih1aW50cHRyX3QoMSkgPDwgSWR4KSk7CisgICAgZWxzZQorICAgICAgZ2V0UG9pbnRlcigpLT5yZXNldChJZHgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBFZmZpY2llbnRseSByZXNldCBhIHJhbmdlIG9mIGJpdHMgaW4gW0ksIEUpCisgIFNtYWxsQml0VmVjdG9yICZyZXNldCh1bnNpZ25lZCBJLCB1bnNpZ25lZCBFKSB7CisgICAgYXNzZXJ0KEkgPD0gRSAmJiAiQXR0ZW1wdGVkIHRvIHJlc2V0IGJhY2t3YXJkcyByYW5nZSEiKTsKKyAgICBhc3NlcnQoRSA8PSBzaXplKCkgJiYgIkF0dGVtcHRlZCB0byByZXNldCBvdXQtb2YtYm91bmRzIHJhbmdlISIpOworICAgIGlmIChJID09IEUpIHJldHVybiAqdGhpczsKKyAgICBpZiAoaXNTbWFsbCgpKSB7CisgICAgICB1aW50cHRyX3QgRU1hc2sgPSAoKHVpbnRwdHJfdCkxKSA8PCBFOworICAgICAgdWludHB0cl90IElNYXNrID0gKCh1aW50cHRyX3QpMSkgPDwgSTsKKyAgICAgIHVpbnRwdHJfdCBNYXNrID0gRU1hc2sgLSBJTWFzazsKKyAgICAgIHNldFNtYWxsQml0cyhnZXRTbWFsbEJpdHMoKSAmIH5NYXNrKTsKKyAgICB9IGVsc2UKKyAgICAgIGdldFBvaW50ZXIoKS0+cmVzZXQoSSwgRSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgU21hbGxCaXRWZWN0b3IgJmZsaXAoKSB7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIHNldFNtYWxsQml0cyh+Z2V0U21hbGxCaXRzKCkpOworICAgIGVsc2UKKyAgICAgIGdldFBvaW50ZXIoKS0+ZmxpcCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFNtYWxsQml0VmVjdG9yICZmbGlwKHVuc2lnbmVkIElkeCkgeworICAgIGlmIChpc1NtYWxsKCkpCisgICAgICBzZXRTbWFsbEJpdHMoZ2V0U21hbGxCaXRzKCkgXiAodWludHB0cl90KDEpIDw8IElkeCkpOworICAgIGVsc2UKKyAgICAgIGdldFBvaW50ZXIoKS0+ZmxpcChJZHgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIE5vIGFyZ3VtZW50IGZsaXAuCisgIFNtYWxsQml0VmVjdG9yIG9wZXJhdG9yfigpIGNvbnN0IHsKKyAgICByZXR1cm4gU21hbGxCaXRWZWN0b3IoKnRoaXMpLmZsaXAoKTsKKyAgfQorCisgIC8vIEluZGV4aW5nLgorICByZWZlcmVuY2Ugb3BlcmF0b3JbXSh1bnNpZ25lZCBJZHgpIHsKKyAgICBhc3NlcnQoSWR4IDwgc2l6ZSgpICYmICJPdXQtb2YtYm91bmRzIEJpdCBhY2Nlc3MuIik7CisgICAgcmV0dXJuIHJlZmVyZW5jZSgqdGhpcywgSWR4KTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3JbXSh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSWR4IDwgc2l6ZSgpICYmICJPdXQtb2YtYm91bmRzIEJpdCBhY2Nlc3MuIik7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIHJldHVybiAoKGdldFNtYWxsQml0cygpID4+IElkeCkgJiAxKSAhPSAwOworICAgIHJldHVybiBnZXRQb2ludGVyKCktPm9wZXJhdG9yW10oSWR4KTsKKyAgfQorCisgIGJvb2wgdGVzdCh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gKCp0aGlzKVtJZHhdOworICB9CisKKyAgLy8vIFRlc3QgaWYgYW55IGNvbW1vbiBiaXRzIGFyZSBzZXQuCisgIGJvb2wgYW55Q29tbW9uKGNvbnN0IFNtYWxsQml0VmVjdG9yICZSSFMpIGNvbnN0IHsKKyAgICBpZiAoaXNTbWFsbCgpICYmIFJIUy5pc1NtYWxsKCkpCisgICAgICByZXR1cm4gKGdldFNtYWxsQml0cygpICYgUkhTLmdldFNtYWxsQml0cygpKSAhPSAwOworICAgIGlmICghaXNTbWFsbCgpICYmICFSSFMuaXNTbWFsbCgpKQorICAgICAgcmV0dXJuIGdldFBvaW50ZXIoKS0+YW55Q29tbW9uKCpSSFMuZ2V0UG9pbnRlcigpKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBzdGQ6Om1pbihzaXplKCksIFJIUy5zaXplKCkpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmICh0ZXN0KGkpICYmIFJIUy50ZXN0KGkpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBDb21wYXJpc29uIG9wZXJhdG9ycy4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNtYWxsQml0VmVjdG9yICZSSFMpIGNvbnN0IHsKKyAgICBpZiAoc2l6ZSgpICE9IFJIUy5zaXplKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIHJldHVybiBnZXRTbWFsbEJpdHMoKSA9PSBSSFMuZ2V0U21hbGxCaXRzKCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuICpnZXRQb2ludGVyKCkgPT0gKlJIUy5nZXRQb2ludGVyKCk7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgU21hbGxCaXRWZWN0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IFJIUyk7CisgIH0KKworICAvLyBJbnRlcnNlY3Rpb24sIHVuaW9uLCBkaXNqb2ludCB1bmlvbi4KKyAgU21hbGxCaXRWZWN0b3IgJm9wZXJhdG9yJj0oY29uc3QgU21hbGxCaXRWZWN0b3IgJlJIUykgeworICAgIHJlc2l6ZShzdGQ6Om1heChzaXplKCksIFJIUy5zaXplKCkpKTsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgc2V0U21hbGxCaXRzKGdldFNtYWxsQml0cygpICYgUkhTLmdldFNtYWxsQml0cygpKTsKKyAgICBlbHNlIGlmICghUkhTLmlzU21hbGwoKSkKKyAgICAgIGdldFBvaW50ZXIoKS0+b3BlcmF0b3ImPSgqUkhTLmdldFBvaW50ZXIoKSk7CisgICAgZWxzZSB7CisgICAgICBTbWFsbEJpdFZlY3RvciBDb3B5ID0gUkhTOworICAgICAgQ29weS5yZXNpemUoc2l6ZSgpKTsKKyAgICAgIGdldFBvaW50ZXIoKS0+b3BlcmF0b3ImPSgqQ29weS5nZXRQb2ludGVyKCkpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gUmVzZXQgYml0cyB0aGF0IGFyZSBzZXQgaW4gUkhTLiBTYW1lIGFzICp0aGlzICY9IH5SSFMuCisgIFNtYWxsQml0VmVjdG9yICZyZXNldChjb25zdCBTbWFsbEJpdFZlY3RvciAmUkhTKSB7CisgICAgaWYgKGlzU21hbGwoKSAmJiBSSFMuaXNTbWFsbCgpKQorICAgICAgc2V0U21hbGxCaXRzKGdldFNtYWxsQml0cygpICYgflJIUy5nZXRTbWFsbEJpdHMoKSk7CisgICAgZWxzZSBpZiAoIWlzU21hbGwoKSAmJiAhUkhTLmlzU21hbGwoKSkKKyAgICAgIGdldFBvaW50ZXIoKS0+cmVzZXQoKlJIUy5nZXRQb2ludGVyKCkpOworICAgIGVsc2UKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBzdGQ6Om1pbihzaXplKCksIFJIUy5zaXplKCkpOyBpICE9IGU7ICsraSkKKyAgICAgICAgaWYgKFJIUy50ZXN0KGkpKQorICAgICAgICAgIHJlc2V0KGkpOworCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIENoZWNrIGlmIChUaGlzIC0gUkhTKSBpcyB6ZXJvLiBUaGlzIGlzIHRoZSBzYW1lIGFzIHJlc2V0KFJIUykgYW5kIGFueSgpLgorICBib29sIHRlc3QoY29uc3QgU21hbGxCaXRWZWN0b3IgJlJIUykgY29uc3QgeworICAgIGlmIChpc1NtYWxsKCkgJiYgUkhTLmlzU21hbGwoKSkKKyAgICAgIHJldHVybiAoZ2V0U21hbGxCaXRzKCkgJiB+UkhTLmdldFNtYWxsQml0cygpKSAhPSAwOworICAgIGlmICghaXNTbWFsbCgpICYmICFSSFMuaXNTbWFsbCgpKQorICAgICAgcmV0dXJuIGdldFBvaW50ZXIoKS0+dGVzdCgqUkhTLmdldFBvaW50ZXIoKSk7CisKKyAgICB1bnNpZ25lZCBpLCBlOworICAgIGZvciAoaSA9IDAsIGUgPSBzdGQ6Om1pbihzaXplKCksIFJIUy5zaXplKCkpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmICh0ZXN0KGkpICYmICFSSFMudGVzdChpKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBmb3IgKGUgPSBzaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKHRlc3QoaSkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgU21hbGxCaXRWZWN0b3IgJm9wZXJhdG9yfD0oY29uc3QgU21hbGxCaXRWZWN0b3IgJlJIUykgeworICAgIHJlc2l6ZShzdGQ6Om1heChzaXplKCksIFJIUy5zaXplKCkpKTsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgc2V0U21hbGxCaXRzKGdldFNtYWxsQml0cygpIHwgUkhTLmdldFNtYWxsQml0cygpKTsKKyAgICBlbHNlIGlmICghUkhTLmlzU21hbGwoKSkKKyAgICAgIGdldFBvaW50ZXIoKS0+b3BlcmF0b3J8PSgqUkhTLmdldFBvaW50ZXIoKSk7CisgICAgZWxzZSB7CisgICAgICBTbWFsbEJpdFZlY3RvciBDb3B5ID0gUkhTOworICAgICAgQ29weS5yZXNpemUoc2l6ZSgpKTsKKyAgICAgIGdldFBvaW50ZXIoKS0+b3BlcmF0b3J8PSgqQ29weS5nZXRQb2ludGVyKCkpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBTbWFsbEJpdFZlY3RvciAmb3BlcmF0b3JePShjb25zdCBTbWFsbEJpdFZlY3RvciAmUkhTKSB7CisgICAgcmVzaXplKHN0ZDo6bWF4KHNpemUoKSwgUkhTLnNpemUoKSkpOworICAgIGlmIChpc1NtYWxsKCkpCisgICAgICBzZXRTbWFsbEJpdHMoZ2V0U21hbGxCaXRzKCkgXiBSSFMuZ2V0U21hbGxCaXRzKCkpOworICAgIGVsc2UgaWYgKCFSSFMuaXNTbWFsbCgpKQorICAgICAgZ2V0UG9pbnRlcigpLT5vcGVyYXRvcl49KCpSSFMuZ2V0UG9pbnRlcigpKTsKKyAgICBlbHNlIHsKKyAgICAgIFNtYWxsQml0VmVjdG9yIENvcHkgPSBSSFM7CisgICAgICBDb3B5LnJlc2l6ZShzaXplKCkpOworICAgICAgZ2V0UG9pbnRlcigpLT5vcGVyYXRvcl49KCpDb3B5LmdldFBvaW50ZXIoKSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFNtYWxsQml0VmVjdG9yICZvcGVyYXRvcjw8PSh1bnNpZ25lZCBOKSB7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIHNldFNtYWxsQml0cyhnZXRTbWFsbEJpdHMoKSA8PCBOKTsKKyAgICBlbHNlCisgICAgICBnZXRQb2ludGVyKCktPm9wZXJhdG9yPDw9KE4pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFNtYWxsQml0VmVjdG9yICZvcGVyYXRvcj4+PSh1bnNpZ25lZCBOKSB7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIHNldFNtYWxsQml0cyhnZXRTbWFsbEJpdHMoKSA+PiBOKTsKKyAgICBlbHNlCisgICAgICBnZXRQb2ludGVyKCktPm9wZXJhdG9yPj49KE4pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIGNvbnN0IFNtYWxsQml0VmVjdG9yICZvcGVyYXRvcj0oY29uc3QgU21hbGxCaXRWZWN0b3IgJlJIUykgeworICAgIGlmIChpc1NtYWxsKCkpIHsKKyAgICAgIGlmIChSSFMuaXNTbWFsbCgpKQorICAgICAgICBYID0gUkhTLlg7CisgICAgICBlbHNlCisgICAgICAgIHN3aXRjaFRvTGFyZ2UobmV3IEJpdFZlY3RvcigqUkhTLmdldFBvaW50ZXIoKSkpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIVJIUy5pc1NtYWxsKCkpCisgICAgICAgICpnZXRQb2ludGVyKCkgPSAqUkhTLmdldFBvaW50ZXIoKTsKKyAgICAgIGVsc2UgeworICAgICAgICBkZWxldGUgZ2V0UG9pbnRlcigpOworICAgICAgICBYID0gUkhTLlg7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IFNtYWxsQml0VmVjdG9yICZvcGVyYXRvcj0oU21hbGxCaXRWZWN0b3IgJiZSSFMpIHsKKyAgICBpZiAodGhpcyAhPSAmUkhTKSB7CisgICAgICBjbGVhcigpOworICAgICAgc3dhcChSSFMpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIHN3YXAoU21hbGxCaXRWZWN0b3IgJlJIUykgeworICAgIHN0ZDo6c3dhcChYLCBSSFMuWCk7CisgIH0KKworICAvLy8gQWRkICcxJyBiaXRzIGZyb20gTWFzayB0byB0aGlzIHZlY3Rvci4gRG9uJ3QgcmVzaXplLgorICAvLy8gVGhpcyBjb21wdXRlcyAiKnRoaXMgfD0gTWFzayIuCisgIHZvaWQgc2V0Qml0c0luTWFzayhjb25zdCB1aW50MzJfdCAqTWFzaywgdW5zaWduZWQgTWFza1dvcmRzID0gfjB1KSB7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIGFwcGx5TWFzazx0cnVlLCBmYWxzZT4oTWFzaywgTWFza1dvcmRzKTsKKyAgICBlbHNlCisgICAgICBnZXRQb2ludGVyKCktPnNldEJpdHNJbk1hc2soTWFzaywgTWFza1dvcmRzKTsKKyAgfQorCisgIC8vLyBDbGVhciBhbnkgYml0cyBpbiB0aGlzIHZlY3RvciB0aGF0IGFyZSBzZXQgaW4gTWFzay4gRG9uJ3QgcmVzaXplLgorICAvLy8gVGhpcyBjb21wdXRlcyAiKnRoaXMgJj0gfk1hc2siLgorICB2b2lkIGNsZWFyQml0c0luTWFzayhjb25zdCB1aW50MzJfdCAqTWFzaywgdW5zaWduZWQgTWFza1dvcmRzID0gfjB1KSB7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIGFwcGx5TWFzazxmYWxzZSwgZmFsc2U+KE1hc2ssIE1hc2tXb3Jkcyk7CisgICAgZWxzZQorICAgICAgZ2V0UG9pbnRlcigpLT5jbGVhckJpdHNJbk1hc2soTWFzaywgTWFza1dvcmRzKTsKKyAgfQorCisgIC8vLyBBZGQgYSBiaXQgdG8gdGhpcyB2ZWN0b3IgZm9yIGV2ZXJ5ICcwJyBiaXQgaW4gTWFzay4gRG9uJ3QgcmVzaXplLgorICAvLy8gVGhpcyBjb21wdXRlcyAiKnRoaXMgfD0gfk1hc2siLgorICB2b2lkIHNldEJpdHNOb3RJbk1hc2soY29uc3QgdWludDMyX3QgKk1hc2ssIHVuc2lnbmVkIE1hc2tXb3JkcyA9IH4wdSkgeworICAgIGlmIChpc1NtYWxsKCkpCisgICAgICBhcHBseU1hc2s8dHJ1ZSwgdHJ1ZT4oTWFzaywgTWFza1dvcmRzKTsKKyAgICBlbHNlCisgICAgICBnZXRQb2ludGVyKCktPnNldEJpdHNOb3RJbk1hc2soTWFzaywgTWFza1dvcmRzKTsKKyAgfQorCisgIC8vLyBDbGVhciBhIGJpdCBpbiB0aGlzIHZlY3RvciBmb3IgZXZlcnkgJzAnIGJpdCBpbiBNYXNrLiBEb24ndCByZXNpemUuCisgIC8vLyBUaGlzIGNvbXB1dGVzICIqdGhpcyAmPSBNYXNrIi4KKyAgdm9pZCBjbGVhckJpdHNOb3RJbk1hc2soY29uc3QgdWludDMyX3QgKk1hc2ssIHVuc2lnbmVkIE1hc2tXb3JkcyA9IH4wdSkgeworICAgIGlmIChpc1NtYWxsKCkpCisgICAgICBhcHBseU1hc2s8ZmFsc2UsIHRydWU+KE1hc2ssIE1hc2tXb3Jkcyk7CisgICAgZWxzZQorICAgICAgZ2V0UG9pbnRlcigpLT5jbGVhckJpdHNOb3RJbk1hc2soTWFzaywgTWFza1dvcmRzKTsKKyAgfQorCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8Ym9vbCBBZGRCaXRzLCBib29sIEludmVydE1hc2s+CisgIHZvaWQgYXBwbHlNYXNrKGNvbnN0IHVpbnQzMl90ICpNYXNrLCB1bnNpZ25lZCBNYXNrV29yZHMpIHsKKyAgICBhc3NlcnQoTWFza1dvcmRzIDw9IHNpemVvZih1aW50cHRyX3QpICYmICJNYXNrIGlzIGxhcmdlciB0aGFuIGJhc2UhIik7CisgICAgdWludHB0cl90IE0gPSBNYXNrWzBdOworICAgIGlmIChOdW1CYXNlQml0cyA9PSA2NCkKKyAgICAgIE0gfD0gdWludDY0X3QoTWFza1sxXSkgPDwgMzI7CisgICAgaWYgKEludmVydE1hc2spCisgICAgICBNID0gfk07CisgICAgaWYgKEFkZEJpdHMpCisgICAgICBzZXRTbWFsbEJpdHMoZ2V0U21hbGxCaXRzKCkgfCBNKTsKKyAgICBlbHNlCisgICAgICBzZXRTbWFsbEJpdHMoZ2V0U21hbGxCaXRzKCkgJiB+TSk7CisgIH0KK307CisKK2lubGluZSBTbWFsbEJpdFZlY3Rvcgorb3BlcmF0b3ImKGNvbnN0IFNtYWxsQml0VmVjdG9yICZMSFMsIGNvbnN0IFNtYWxsQml0VmVjdG9yICZSSFMpIHsKKyAgU21hbGxCaXRWZWN0b3IgUmVzdWx0KExIUyk7CisgIFJlc3VsdCAmPSBSSFM7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKK2lubGluZSBTbWFsbEJpdFZlY3Rvcgorb3BlcmF0b3J8KGNvbnN0IFNtYWxsQml0VmVjdG9yICZMSFMsIGNvbnN0IFNtYWxsQml0VmVjdG9yICZSSFMpIHsKKyAgU21hbGxCaXRWZWN0b3IgUmVzdWx0KExIUyk7CisgIFJlc3VsdCB8PSBSSFM7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKK2lubGluZSBTbWFsbEJpdFZlY3Rvcgorb3BlcmF0b3JeKGNvbnN0IFNtYWxsQml0VmVjdG9yICZMSFMsIGNvbnN0IFNtYWxsQml0VmVjdG9yICZSSFMpIHsKKyAgU21hbGxCaXRWZWN0b3IgUmVzdWx0KExIUyk7CisgIFJlc3VsdCBePSBSSFM7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBzdGQgeworCisvLy8gSW1wbGVtZW50IHN0ZDo6c3dhcCBpbiB0ZXJtcyBvZiBCaXRWZWN0b3Igc3dhcC4KK2lubGluZSB2b2lkCitzd2FwKGxsdm06OlNtYWxsQml0VmVjdG9yICZMSFMsIGxsdm06OlNtYWxsQml0VmVjdG9yICZSSFMpIHsKKyAgTEhTLnN3YXAoUkhTKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gTExWTV9BRFRfU01BTExCSVRWRUNUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxQdHJTZXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NtYWxsUHRyU2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlYTYxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NtYWxsUHRyU2V0LmgKQEAgLTAsMCArMSw0ODYgQEAKKy8vPT09LSBsbHZtL0FEVC9TbWFsbFB0clNldC5oIC0gJ05vcm1hbGx5IHNtYWxsJyBwb2ludGVyIHNldCAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFNtYWxsUHRyU2V0IGNsYXNzLiAgU2VlIHRoZSBkb3h5Z2VuIGNvbW1lbnQgZm9yCisvLyBTbWFsbFB0clNldEltcGxCYXNlIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGFsZ29yaXRobSB1c2VkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU01BTExQVFJTRVRfSAorI2RlZmluZSBMTFZNX0FEVF9TTUFMTFBUUlNFVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9FcG9jaFRyYWNrZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUmV2ZXJzZUl0ZXJhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBTbWFsbFB0clNldEltcGxCYXNlIC0gVGhpcyBpcyB0aGUgY29tbW9uIGNvZGUgc2hhcmVkIGFtb25nIGFsbCB0aGUKKy8vLyBTbWFsbFB0clNldDw+J3MsIHdoaWNoIGlzIGFsbW9zdCBldmVyeXRoaW5nLiAgU21hbGxQdHJTZXQgaGFzIHR3byBtb2Rlcywgb25lCisvLy8gZm9yIHNtYWxsIGFuZCBvbmUgZm9yIGxhcmdlIHNldHMuCisvLy8KKy8vLyBTbWFsbCBzZXRzIHVzZSBhbiBhcnJheSBvZiBwb2ludGVycyBhbGxvY2F0ZWQgaW4gdGhlIFNtYWxsUHRyU2V0IG9iamVjdCwKKy8vLyB3aGljaCBpcyB0cmVhdGVkIGFzIGEgc2ltcGxlIGFycmF5IG9mIHBvaW50ZXJzLiAgV2hlbiBhIHBvaW50ZXIgaXMgYWRkZWQgdG8KKy8vLyB0aGUgc2V0LCB0aGUgYXJyYXkgaXMgc2Nhbm5lZCB0byBzZWUgaWYgdGhlIGVsZW1lbnQgYWxyZWFkeSBleGlzdHMsIGlmIG5vdAorLy8vIHRoZSBlbGVtZW50IGlzICdwdXNoZWQgYmFjaycgb250byB0aGUgYXJyYXkuICBJZiB3ZSBydW4gb3V0IG9mIHNwYWNlIGluIHRoZQorLy8vIGFycmF5LCB3ZSBncm93IGludG8gdGhlICdsYXJnZSBzZXQnIGNhc2UuICBTbWFsbFNldCBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZQorLy8vIHNldHMgYXJlIG9mdGVuIHNtYWxsLiAgSW4gdGhpcyBjYXNlLCBubyBtZW1vcnkgYWxsb2NhdGlvbiBpcyB1c2VkLCBhbmQgb25seQorLy8vIGxpZ2h0LXdlaWdodCBhbmQgY2FjaGUtZWZmaWNpZW50IHNjYW5uaW5nIGlzIHVzZWQuCisvLy8KKy8vLyBMYXJnZSBzZXRzIHVzZSBhIGNsYXNzaWMgZXhwb25lbnRpYWxseS1wcm9iZWQgaGFzaCB0YWJsZS4gIEVtcHR5IGJ1Y2tldHMgYXJlCisvLy8gcmVwcmVzZW50ZWQgd2l0aCBhbiBpbGxlZ2FsIHBvaW50ZXIgdmFsdWUgKC0xKSB0byBhbGxvdyBudWxsIHBvaW50ZXJzIHRvIGJlCisvLy8gaW5zZXJ0ZWQuICBUb21ic3RvbmVzIGFyZSByZXByZXNlbnRlZCB3aXRoIGFub3RoZXIgaWxsZWdhbCBwb2ludGVyIHZhbHVlCisvLy8gKC0yKSwgdG8gYWxsb3cgZGVsZXRpb24uICBUaGUgaGFzaCB0YWJsZSBpcyByZXNpemVkIHdoZW4gdGhlIHRhYmxlIGlzIDMvNCBvcgorLy8vIG1vcmUuICBXaGVuIHRoaXMgaGFwcGVucywgdGhlIHRhYmxlIGlzIGRvdWJsZWQgaW4gc2l6ZS4KKy8vLworY2xhc3MgU21hbGxQdHJTZXRJbXBsQmFzZSA6IHB1YmxpYyBEZWJ1Z0Vwb2NoQmFzZSB7CisgIGZyaWVuZCBjbGFzcyBTbWFsbFB0clNldEl0ZXJhdG9ySW1wbDsKKworcHJvdGVjdGVkOgorICAvLy8gU21hbGxBcnJheSAtIFBvaW50cyB0byBhIGZpeGVkIHNpemUgc2V0IG9mIGJ1Y2tldHMsIHVzZWQgaW4gJ3NtYWxsIG1vZGUnLgorICBjb25zdCB2b2lkICoqU21hbGxBcnJheTsKKyAgLy8vIEN1ckFycmF5IC0gVGhpcyBpcyB0aGUgY3VycmVudCBzZXQgb2YgYnVja2V0cy4gIElmIGVxdWFsIHRvIFNtYWxsQXJyYXksCisgIC8vLyB0aGVuIHRoZSBzZXQgaXMgaW4gJ3NtYWxsIG1vZGUnLgorICBjb25zdCB2b2lkICoqQ3VyQXJyYXk7CisgIC8vLyBDdXJBcnJheVNpemUgLSBUaGUgYWxsb2NhdGVkIHNpemUgb2YgQ3VyQXJyYXksIGFsd2F5cyBhIHBvd2VyIG9mIHR3by4KKyAgdW5zaWduZWQgQ3VyQXJyYXlTaXplOworCisgIC8vLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gQ3VyQXJyYXkgdGhhdCBjb250YWluIGEgdmFsdWUgb3IgYXJlIGEgdG9tYnN0b25lLgorICAvLy8gSWYgc21hbGwsIGFsbCB0aGVzZSBlbGVtZW50cyBhcmUgYXQgdGhlIGJlZ2lubmluZyBvZiBDdXJBcnJheSBhbmQgdGhlIHJlc3QKKyAgLy8vIGlzIHVuaW5pdGlhbGl6ZWQuCisgIHVuc2lnbmVkIE51bU5vbkVtcHR5OworICAvLy8gTnVtYmVyIG9mIHRvbWJzdG9uZXMgaW4gQ3VyQXJyYXkuCisgIHVuc2lnbmVkIE51bVRvbWJzdG9uZXM7CisKKyAgLy8gSGVscGVycyB0byBjb3B5IGFuZCBtb3ZlIGNvbnN0cnVjdCBhIFNtYWxsUHRyU2V0LgorICBTbWFsbFB0clNldEltcGxCYXNlKGNvbnN0IHZvaWQgKipTbWFsbFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxQdHJTZXRJbXBsQmFzZSAmdGhhdCk7CisgIFNtYWxsUHRyU2V0SW1wbEJhc2UoY29uc3Qgdm9pZCAqKlNtYWxsU3RvcmFnZSwgdW5zaWduZWQgU21hbGxTaXplLAorICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0SW1wbEJhc2UgJiZ0aGF0KTsKKworICBleHBsaWNpdCBTbWFsbFB0clNldEltcGxCYXNlKGNvbnN0IHZvaWQgKipTbWFsbFN0b3JhZ2UsIHVuc2lnbmVkIFNtYWxsU2l6ZSkKKyAgICAgIDogU21hbGxBcnJheShTbWFsbFN0b3JhZ2UpLCBDdXJBcnJheShTbWFsbFN0b3JhZ2UpLAorICAgICAgICBDdXJBcnJheVNpemUoU21hbGxTaXplKSwgTnVtTm9uRW1wdHkoMCksIE51bVRvbWJzdG9uZXMoMCkgeworICAgIGFzc2VydChTbWFsbFNpemUgJiYgKFNtYWxsU2l6ZSAmIChTbWFsbFNpemUtMSkpID09IDAgJiYKKyAgICAgICAgICAgIkluaXRpYWwgc2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvISIpOworICB9CisKKyAgflNtYWxsUHRyU2V0SW1wbEJhc2UoKSB7CisgICAgaWYgKCFpc1NtYWxsKCkpCisgICAgICBmcmVlKEN1ckFycmF5KTsKKyAgfQorCitwdWJsaWM6CisgIHVzaW5nIHNpemVfdHlwZSA9IHVuc2lnbmVkOworCisgIFNtYWxsUHRyU2V0SW1wbEJhc2UgJm9wZXJhdG9yPShjb25zdCBTbWFsbFB0clNldEltcGxCYXNlICYpID0gZGVsZXRlOworCisgIExMVk1fTk9ESVNDQVJEIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBzaXplKCkgPT0gMDsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE51bU5vbkVtcHR5IC0gTnVtVG9tYnN0b25lczsgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgaW5jcmVtZW50RXBvY2goKTsKKyAgICAvLyBJZiB0aGUgY2FwYWNpdHkgb2YgdGhlIGFycmF5IGlzIGh1Z2UsIGFuZCB0aGUgIyBlbGVtZW50cyB1c2VkIGlzIHNtYWxsLAorICAgIC8vIHNocmluayB0aGUgYXJyYXkuCisgICAgaWYgKCFpc1NtYWxsKCkpIHsKKyAgICAgIGlmIChzaXplKCkgKiA0IDwgQ3VyQXJyYXlTaXplICYmIEN1ckFycmF5U2l6ZSA+IDMyKQorICAgICAgICByZXR1cm4gc2hyaW5rX2FuZF9jbGVhcigpOworICAgICAgLy8gRmlsbCB0aGUgYXJyYXkgd2l0aCBlbXB0eSBtYXJrZXJzLgorICAgICAgbWVtc2V0KEN1ckFycmF5LCAtMSwgQ3VyQXJyYXlTaXplICogc2l6ZW9mKHZvaWQgKikpOworICAgIH0KKworICAgIE51bU5vbkVtcHR5ID0gMDsKKyAgICBOdW1Ub21ic3RvbmVzID0gMDsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkICpnZXRUb21ic3RvbmVNYXJrZXIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPigtMik7IH0KKworICBzdGF0aWMgdm9pZCAqZ2V0RW1wdHlNYXJrZXIoKSB7CisgICAgLy8gTm90ZSB0aGF0IC0xIGlzIGNob3NlbiB0byBtYWtlIGNsZWFyKCkgZWZmaWNpZW50bHkgaW1wbGVtZW50YWJsZSB3aXRoCisgICAgLy8gbWVtc2V0IGFuZCBiZWNhdXNlIGl0J3Mgbm90IGEgdmFsaWQgcG9pbnRlciB2YWx1ZS4KKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oLTEpOworICB9CisKKyAgY29uc3Qgdm9pZCAqKkVuZFBvaW50ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzU21hbGwoKSA/IEN1ckFycmF5ICsgTnVtTm9uRW1wdHkgOiBDdXJBcnJheSArIEN1ckFycmF5U2l6ZTsKKyAgfQorCisgIC8vLyBpbnNlcnRfaW1wIC0gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIHBvaW50ZXIgd2FzIG5ldyB0byB0aGUgc2V0LCBmYWxzZSBpZgorICAvLy8gaXQgd2FzIGFscmVhZHkgaW4gdGhlIHNldC4gIFRoaXMgaXMgaGlkZGVuIGZyb20gdGhlIGNsaWVudCBzbyB0aGF0IHRoZQorICAvLy8gZGVyaXZlZCBjbGFzcyBjYW4gY2hlY2sgdGhhdCB0aGUgcmlnaHQgdHlwZSBvZiBwb2ludGVyIGlzIHBhc3NlZCBpbi4KKyAgc3RkOjpwYWlyPGNvbnN0IHZvaWQgKmNvbnN0ICosIGJvb2w+IGluc2VydF9pbXAoY29uc3Qgdm9pZCAqUHRyKSB7CisgICAgaWYgKGlzU21hbGwoKSkgeworICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGl0IGlzIGFscmVhZHkgaW4gdGhlIHNldC4KKyAgICAgIGNvbnN0IHZvaWQgKipMYXN0VG9tYnN0b25lID0gbnVsbHB0cjsKKyAgICAgIGZvciAoY29uc3Qgdm9pZCAqKkFQdHIgPSBTbWFsbEFycmF5LCAqKkUgPSBTbWFsbEFycmF5ICsgTnVtTm9uRW1wdHk7CisgICAgICAgICAgIEFQdHIgIT0gRTsgKytBUHRyKSB7CisgICAgICAgIGNvbnN0IHZvaWQgKlZhbHVlID0gKkFQdHI7CisgICAgICAgIGlmIChWYWx1ZSA9PSBQdHIpCisgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEFQdHIsIGZhbHNlKTsKKyAgICAgICAgaWYgKFZhbHVlID09IGdldFRvbWJzdG9uZU1hcmtlcigpKQorICAgICAgICAgIExhc3RUb21ic3RvbmUgPSBBUHRyOworICAgICAgfQorCisgICAgICAvLyBEaWQgd2UgZmluZCBhbnkgdG9tYnN0b25lIG1hcmtlcj8KKyAgICAgIGlmIChMYXN0VG9tYnN0b25lICE9IG51bGxwdHIpIHsKKyAgICAgICAgKkxhc3RUb21ic3RvbmUgPSBQdHI7CisgICAgICAgIC0tTnVtVG9tYnN0b25lczsKKyAgICAgICAgaW5jcmVtZW50RXBvY2goKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKExhc3RUb21ic3RvbmUsIHRydWUpOworICAgICAgfQorCisgICAgICAvLyBOb3BlLCB0aGVyZSBpc24ndC4gIElmIHdlIHN0YXkgc21hbGwsIGp1c3QgJ3B1c2hiYWNrJyBub3cuCisgICAgICBpZiAoTnVtTm9uRW1wdHkgPCBDdXJBcnJheVNpemUpIHsKKyAgICAgICAgU21hbGxBcnJheVtOdW1Ob25FbXB0eSsrXSA9IFB0cjsKKyAgICAgICAgaW5jcmVtZW50RXBvY2goKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFNtYWxsQXJyYXkgKyAoTnVtTm9uRW1wdHkgLSAxKSwgdHJ1ZSk7CisgICAgICB9CisgICAgICAvLyBPdGhlcndpc2UsIGhpdCB0aGUgYmlnIHNldCBjYXNlLCB3aGljaCB3aWxsIGNhbGwgZ3Jvdy4KKyAgICB9CisgICAgcmV0dXJuIGluc2VydF9pbXBfYmlnKFB0cik7CisgIH0KKworICAvLy8gZXJhc2VfaW1wIC0gSWYgdGhlIHNldCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHBvaW50ZXIsIHJlbW92ZSBpdCBhbmQKKyAgLy8vIHJldHVybiB0cnVlLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLiAgVGhpcyBpcyBoaWRkZW4gZnJvbSB0aGUgY2xpZW50IHNvCisgIC8vLyB0aGF0IHRoZSBkZXJpdmVkIGNsYXNzIGNhbiBjaGVjayB0aGF0IHRoZSByaWdodCB0eXBlIG9mIHBvaW50ZXIgaXMgcGFzc2VkCisgIC8vLyBpbi4KKyAgYm9vbCBlcmFzZV9pbXAoY29uc3Qgdm9pZCAqIFB0cikgeworICAgIGNvbnN0IHZvaWQgKmNvbnN0ICpQID0gZmluZF9pbXAoUHRyKTsKKyAgICBpZiAoUCA9PSBFbmRQb2ludGVyKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjb25zdCB2b2lkICoqTG9jID0gY29uc3RfY2FzdDxjb25zdCB2b2lkICoqPihQKTsKKyAgICBhc3NlcnQoKkxvYyA9PSBQdHIgJiYgImJyb2tlbiBmaW5kISIpOworICAgICpMb2MgPSBnZXRUb21ic3RvbmVNYXJrZXIoKTsKKyAgICBOdW1Ub21ic3RvbmVzKys7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgcmF3IHBvaW50ZXIgbmVlZGVkIHRvIGNvbnN0cnVjdCBhbiBpdGVyYXRvci4gIElmIGVsZW1lbnQgbm90CisgIC8vLyBmb3VuZCwgdGhpcyB3aWxsIGJlIEVuZFBvaW50ZXIuICBPdGhlcndpc2UsIGl0IHdpbGwgYmUgYSBwb2ludGVyIHRvIHRoZQorICAvLy8gc2xvdCB3aGljaCBzdG9yZXMgUHRyOworICBjb25zdCB2b2lkICpjb25zdCAqIGZpbmRfaW1wKGNvbnN0IHZvaWQgKiBQdHIpIGNvbnN0IHsKKyAgICBpZiAoaXNTbWFsbCgpKSB7CisgICAgICAvLyBMaW5lYXIgc2VhcmNoIGZvciB0aGUgaXRlbS4KKyAgICAgIGZvciAoY29uc3Qgdm9pZCAqY29uc3QgKkFQdHIgPSBTbWFsbEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICpjb25zdCAqRSA9IFNtYWxsQXJyYXkgKyBOdW1Ob25FbXB0eTsgQVB0ciAhPSBFOyArK0FQdHIpCisgICAgICAgIGlmICgqQVB0ciA9PSBQdHIpCisgICAgICAgICAgcmV0dXJuIEFQdHI7CisgICAgICByZXR1cm4gRW5kUG9pbnRlcigpOworICAgIH0KKworICAgIC8vIEJpZyBzZXQgY2FzZS4KKyAgICBhdXRvICpCdWNrZXQgPSBGaW5kQnVja2V0Rm9yKFB0cik7CisgICAgaWYgKCpCdWNrZXQgPT0gUHRyKQorICAgICAgcmV0dXJuIEJ1Y2tldDsKKyAgICByZXR1cm4gRW5kUG9pbnRlcigpOworICB9CisKK3ByaXZhdGU6CisgIGJvb2wgaXNTbWFsbCgpIGNvbnN0IHsgcmV0dXJuIEN1ckFycmF5ID09IFNtYWxsQXJyYXk7IH0KKworICBzdGQ6OnBhaXI8Y29uc3Qgdm9pZCAqY29uc3QgKiwgYm9vbD4gaW5zZXJ0X2ltcF9iaWcoY29uc3Qgdm9pZCAqUHRyKTsKKworICBjb25zdCB2b2lkICogY29uc3QgKkZpbmRCdWNrZXRGb3IoY29uc3Qgdm9pZCAqUHRyKSBjb25zdDsKKyAgdm9pZCBzaHJpbmtfYW5kX2NsZWFyKCk7CisKKyAgLy8vIEdyb3cgLSBBbGxvY2F0ZSBhIGxhcmdlciBiYWNraW5nIHN0b3JlIGZvciB0aGUgYnVja2V0cyBhbmQgbW92ZSBpdCBvdmVyLgorICB2b2lkIEdyb3codW5zaWduZWQgTmV3U2l6ZSk7CisKK3Byb3RlY3RlZDoKKyAgLy8vIHN3YXAgLSBTd2FwcyB0aGUgZWxlbWVudHMgb2YgdHdvIHNldHMuCisgIC8vLyBOb3RlOiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgYm90aCBzZXRzIGhhdmUgdGhlIHNhbWUgc21hbGwgc2l6ZS4KKyAgdm9pZCBzd2FwKFNtYWxsUHRyU2V0SW1wbEJhc2UgJlJIUyk7CisKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBTbWFsbFB0clNldEltcGxCYXNlICZSSFMpOworICB2b2lkIE1vdmVGcm9tKHVuc2lnbmVkIFNtYWxsU2l6ZSwgU21hbGxQdHJTZXRJbXBsQmFzZSAmJlJIUyk7CisKK3ByaXZhdGU6CisgIC8vLyBDb2RlIHNoYXJlZCBieSBNb3ZlRnJvbSgpIGFuZCBtb3ZlIGNvbnN0cnVjdG9yLgorICB2b2lkIE1vdmVIZWxwZXIodW5zaWduZWQgU21hbGxTaXplLCBTbWFsbFB0clNldEltcGxCYXNlICYmUkhTKTsKKyAgLy8vIENvZGUgc2hhcmVkIGJ5IENvcHlGcm9tKCkgYW5kIGNvcHkgY29uc3RydWN0b3IuCisgIHZvaWQgQ29weUhlbHBlcihjb25zdCBTbWFsbFB0clNldEltcGxCYXNlICZSSFMpOworfTsKKworLy8vIFNtYWxsUHRyU2V0SXRlcmF0b3JJbXBsIC0gVGhpcyBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3Mgc2hhcmVkIGJldHdlZW4gYWxsCisvLy8gaW5zdGFuY2VzIG9mIFNtYWxsUHRyU2V0SXRlcmF0b3IuCitjbGFzcyBTbWFsbFB0clNldEl0ZXJhdG9ySW1wbCB7Citwcm90ZWN0ZWQ6CisgIGNvbnN0IHZvaWQgKmNvbnN0ICpCdWNrZXQ7CisgIGNvbnN0IHZvaWQgKmNvbnN0ICpFbmQ7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgU21hbGxQdHJTZXRJdGVyYXRvckltcGwoY29uc3Qgdm9pZCAqY29uc3QgKkJQLCBjb25zdCB2b2lkKmNvbnN0ICpFKQorICAgIDogQnVja2V0KEJQKSwgRW5kKEUpIHsKKyAgICBpZiAoc2hvdWxkUmV2ZXJzZUl0ZXJhdGUoKSkgeworICAgICAgUmV0cmVhdElmTm90VmFsaWQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgQWR2YW5jZUlmTm90VmFsaWQoKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTbWFsbFB0clNldEl0ZXJhdG9ySW1wbCAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJ1Y2tldCA9PSBSSFMuQnVja2V0OworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTbWFsbFB0clNldEl0ZXJhdG9ySW1wbCAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJ1Y2tldCAhPSBSSFMuQnVja2V0OworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8vIEFkdmFuY2VJZk5vdFZhbGlkIC0gSWYgdGhlIGN1cnJlbnQgYnVja2V0IGlzbid0IHZhbGlkLCBhZHZhbmNlIHRvIGEgYnVja2V0CisgIC8vLyB0aGF0IGlzLiAgIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBzdG9wIGJlY2F1c2UgdGhlIGVuZCgpIGJ1Y2tldCBpcyBtYXJrZWQKKyAgLy8vIHZhbGlkLgorICB2b2lkIEFkdmFuY2VJZk5vdFZhbGlkKCkgeworICAgIGFzc2VydChCdWNrZXQgPD0gRW5kKTsKKyAgICB3aGlsZSAoQnVja2V0ICE9IEVuZCAmJgorICAgICAgICAgICAoKkJ1Y2tldCA9PSBTbWFsbFB0clNldEltcGxCYXNlOjpnZXRFbXB0eU1hcmtlcigpIHx8CisgICAgICAgICAgICAqQnVja2V0ID09IFNtYWxsUHRyU2V0SW1wbEJhc2U6OmdldFRvbWJzdG9uZU1hcmtlcigpKSkKKyAgICAgICsrQnVja2V0OworICB9CisgIHZvaWQgUmV0cmVhdElmTm90VmFsaWQoKSB7CisgICAgYXNzZXJ0KEJ1Y2tldCA+PSBFbmQpOworICAgIHdoaWxlIChCdWNrZXQgIT0gRW5kICYmCisgICAgICAgICAgIChCdWNrZXRbLTFdID09IFNtYWxsUHRyU2V0SW1wbEJhc2U6OmdldEVtcHR5TWFya2VyKCkgfHwKKyAgICAgICAgICAgIEJ1Y2tldFstMV0gPT0gU21hbGxQdHJTZXRJbXBsQmFzZTo6Z2V0VG9tYnN0b25lTWFya2VyKCkpKSB7CisgICAgICAtLUJ1Y2tldDsKKyAgICB9CisgIH0KK307CisKKy8vLyBTbWFsbFB0clNldEl0ZXJhdG9yIC0gVGhpcyBpbXBsZW1lbnRzIGEgY29uc3RfaXRlcmF0b3IgZm9yIFNtYWxsUHRyU2V0LgordGVtcGxhdGUgPHR5cGVuYW1lIFB0clR5PgorY2xhc3MgU21hbGxQdHJTZXRJdGVyYXRvciA6IHB1YmxpYyBTbWFsbFB0clNldEl0ZXJhdG9ySW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0Vwb2NoQmFzZTo6SGFuZGxlQmFzZSB7CisgIHVzaW5nIFB0clRyYWl0cyA9IFBvaW50ZXJMaWtlVHlwZVRyYWl0czxQdHJUeT47CisKK3B1YmxpYzoKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IFB0clR5OworICB1c2luZyByZWZlcmVuY2UgPSBQdHJUeTsKKyAgdXNpbmcgcG9pbnRlciA9IFB0clR5OworICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBzdGQ6OnB0cmRpZmZfdDsKKyAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworCisgIGV4cGxpY2l0IFNtYWxsUHRyU2V0SXRlcmF0b3IoY29uc3Qgdm9pZCAqY29uc3QgKkJQLCBjb25zdCB2b2lkICpjb25zdCAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z0Vwb2NoQmFzZSAmRXBvY2gpCisgICAgICA6IFNtYWxsUHRyU2V0SXRlcmF0b3JJbXBsKEJQLCBFKSwgRGVidWdFcG9jaEJhc2U6OkhhbmRsZUJhc2UoJkVwb2NoKSB7fQorCisgIC8vIE1vc3QgbWV0aG9kcyBwcm92aWRlZCBieSBiYXNlY2xhc3MuCisKKyAgY29uc3QgUHRyVHkgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGFzc2VydChpc0hhbmRsZUluU3luYygpICYmICJpbnZhbGlkIGl0ZXJhdG9yIGFjY2VzcyEiKTsKKyAgICBpZiAoc2hvdWxkUmV2ZXJzZUl0ZXJhdGUoKSkgeworICAgICAgYXNzZXJ0KEJ1Y2tldCA+IEVuZCk7CisgICAgICByZXR1cm4gUHRyVHJhaXRzOjpnZXRGcm9tVm9pZFBvaW50ZXIoY29uc3RfY2FzdDx2b2lkICo+KEJ1Y2tldFstMV0pKTsKKyAgICB9CisgICAgYXNzZXJ0KEJ1Y2tldCA8IEVuZCk7CisgICAgcmV0dXJuIFB0clRyYWl0czo6Z2V0RnJvbVZvaWRQb2ludGVyKGNvbnN0X2Nhc3Q8dm9pZCo+KCpCdWNrZXQpKTsKKyAgfQorCisgIGlubGluZSBTbWFsbFB0clNldEl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyAgICAgICAgICAvLyBQcmVpbmNyZW1lbnQKKyAgICBhc3NlcnQoaXNIYW5kbGVJblN5bmMoKSAmJiAiaW52YWxpZCBpdGVyYXRvciBhY2Nlc3MhIik7CisgICAgaWYgKHNob3VsZFJldmVyc2VJdGVyYXRlKCkpIHsKKyAgICAgIC0tQnVja2V0OworICAgICAgUmV0cmVhdElmTm90VmFsaWQoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgKytCdWNrZXQ7CisgICAgQWR2YW5jZUlmTm90VmFsaWQoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBTbWFsbFB0clNldEl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7ICAgICAgICAvLyBQb3N0aW5jcmVtZW50CisgICAgU21hbGxQdHJTZXRJdGVyYXRvciB0bXAgPSAqdGhpczsKKyAgICArKyp0aGlzOworICAgIHJldHVybiB0bXA7CisgIH0KK307CisKKy8vLyBSb3VuZFVwVG9Qb3dlck9mVHdvIC0gVGhpcyBpcyBhIGhlbHBlciB0ZW1wbGF0ZSB0aGF0IHJvdW5kcyBOIHVwIHRvIHRoZSBuZXh0CisvLy8gcG93ZXIgb2YgdHdvICh3aGljaCBtZWFucyBOIGl0c2VsZiBpZiBOIGlzIGFscmVhZHkgYSBwb3dlciBvZiB0d28pLgordGVtcGxhdGU8dW5zaWduZWQgTj4KK3N0cnVjdCBSb3VuZFVwVG9Qb3dlck9mVHdvOworCisvLy8gUm91bmRVcFRvUG93ZXJPZlR3b0ggLSBJZiBOIGlzIG5vdCBhIHBvd2VyIG9mIHR3bywgaW5jcmVhc2UgaXQuICBUaGlzIGlzIGEKKy8vLyBoZWxwZXIgdGVtcGxhdGUgdXNlZCB0byBpbXBsZW1lbnQgUm91bmRVcFRvUG93ZXJPZlR3by4KK3RlbXBsYXRlPHVuc2lnbmVkIE4sIGJvb2wgaXNQb3dlclR3bz4KK3N0cnVjdCBSb3VuZFVwVG9Qb3dlck9mVHdvSCB7CisgIGVudW0geyBWYWwgPSBOIH07Cit9OwordGVtcGxhdGU8dW5zaWduZWQgTj4KK3N0cnVjdCBSb3VuZFVwVG9Qb3dlck9mVHdvSDxOLCBmYWxzZT4geworICBlbnVtIHsKKyAgICAvLyBXZSBjb3VsZCBqdXN0IHVzZSBOZXh0VmFsID0gTisxLCBidXQgdGhpcyBjb252ZXJnZXMgZmFzdGVyLiAgTnwoTi0xKSBzZXRzCisgICAgLy8gdGhlIHJpZ2h0LW1vc3QgemVybyBiaXRzIHRvIG9uZSBhbGwgYXQgb25jZSwgZS5nLiAwYjAwMTEwMDAgLT4gMGIwMDExMTExLgorICAgIFZhbCA9IFJvdW5kVXBUb1Bvd2VyT2ZUd288KE58KE4tMSkpICsgMT46OlZhbAorICB9OworfTsKKwordGVtcGxhdGU8dW5zaWduZWQgTj4KK3N0cnVjdCBSb3VuZFVwVG9Qb3dlck9mVHdvIHsKKyAgZW51bSB7IFZhbCA9IFJvdW5kVXBUb1Bvd2VyT2ZUd29IPE4sIChOJihOLTEpKSA9PSAwPjo6VmFsIH07Cit9OworCisvLy8gXGJyaWVmIEEgdGVtcGxhdGVkIGJhc2UgY2xhc3MgZm9yIFxjIFNtYWxsUHRyU2V0IHdoaWNoIHByb3ZpZGVzIHRoZQorLy8vIHR5cGVzYWZlIGludGVyZmFjZSB0aGF0IGlzIGNvbW1vbiBhY3Jvc3MgYWxsIHNtYWxsIHNpemVzLgorLy8vCisvLy8gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBwYXNzaW5nIGFyb3VuZCBiZXR3ZWVuIGludGVyZmFjZSBib3VuZGFyaWVzCisvLy8gdG8gYXZvaWQgZW5jb2RpbmcgYSBwYXJ0aWN1bGFyIHNtYWxsIHNpemUgaW4gdGhlIGludGVyZmFjZSBib3VuZGFyeS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQdHJUeXBlPgorY2xhc3MgU21hbGxQdHJTZXRJbXBsIDogcHVibGljIFNtYWxsUHRyU2V0SW1wbEJhc2UgeworICB1c2luZyBDb25zdFB0clR5cGUgPSB0eXBlbmFtZSBhZGRfY29uc3RfcGFzdF9wb2ludGVyPFB0clR5cGU+Ojp0eXBlOworICB1c2luZyBQdHJUcmFpdHMgPSBQb2ludGVyTGlrZVR5cGVUcmFpdHM8UHRyVHlwZT47CisgIHVzaW5nIENvbnN0UHRyVHJhaXRzID0gUG9pbnRlckxpa2VUeXBlVHJhaXRzPENvbnN0UHRyVHlwZT47CisKK3Byb3RlY3RlZDoKKyAgLy8gQ29uc3RydWN0b3JzIHRoYXQgZm9yd2FyZCB0byB0aGUgYmFzZS4KKyAgU21hbGxQdHJTZXRJbXBsKGNvbnN0IHZvaWQgKipTbWFsbFN0b3JhZ2UsIGNvbnN0IFNtYWxsUHRyU2V0SW1wbCAmdGhhdCkKKyAgICAgIDogU21hbGxQdHJTZXRJbXBsQmFzZShTbWFsbFN0b3JhZ2UsIHRoYXQpIHt9CisgIFNtYWxsUHRyU2V0SW1wbChjb25zdCB2b2lkICoqU21hbGxTdG9yYWdlLCB1bnNpZ25lZCBTbWFsbFNpemUsCisgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldEltcGwgJiZ0aGF0KQorICAgICAgOiBTbWFsbFB0clNldEltcGxCYXNlKFNtYWxsU3RvcmFnZSwgU21hbGxTaXplLCBzdGQ6Om1vdmUodGhhdCkpIHt9CisgIGV4cGxpY2l0IFNtYWxsUHRyU2V0SW1wbChjb25zdCB2b2lkICoqU21hbGxTdG9yYWdlLCB1bnNpZ25lZCBTbWFsbFNpemUpCisgICAgICA6IFNtYWxsUHRyU2V0SW1wbEJhc2UoU21hbGxTdG9yYWdlLCBTbWFsbFNpemUpIHt9CisKK3B1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3IgPSBTbWFsbFB0clNldEl0ZXJhdG9yPFB0clR5cGU+OworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IFNtYWxsUHRyU2V0SXRlcmF0b3I8UHRyVHlwZT47CisgIHVzaW5nIGtleV90eXBlID0gQ29uc3RQdHJUeXBlOworICB1c2luZyB2YWx1ZV90eXBlID0gUHRyVHlwZTsKKworICBTbWFsbFB0clNldEltcGwoY29uc3QgU21hbGxQdHJTZXRJbXBsICYpID0gZGVsZXRlOworCisgIC8vLyBJbnNlcnRzIFB0ciBpZiBhbmQgb25seSBpZiB0aGVyZSBpcyBubyBlbGVtZW50IGluIHRoZSBjb250YWluZXIgZXF1YWwgdG8KKyAgLy8vIFB0ci4gVGhlIGJvb2wgY29tcG9uZW50IG9mIHRoZSByZXR1cm5lZCBwYWlyIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlCisgIC8vLyBpbnNlcnRpb24gdGFrZXMgcGxhY2UsIGFuZCB0aGUgaXRlcmF0b3IgY29tcG9uZW50IG9mIHRoZSBwYWlyIHBvaW50cyB0bworICAvLy8gdGhlIGVsZW1lbnQgZXF1YWwgdG8gUHRyLgorICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydChQdHJUeXBlIFB0cikgeworICAgIGF1dG8gcCA9IGluc2VydF9pbXAoUHRyVHJhaXRzOjpnZXRBc1ZvaWRQb2ludGVyKFB0cikpOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihtYWtlSXRlcmF0b3IocC5maXJzdCksIHAuc2Vjb25kKTsKKyAgfQorCisgIC8vLyBlcmFzZSAtIElmIHRoZSBzZXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBwb2ludGVyLCByZW1vdmUgaXQgYW5kIHJldHVybgorICAvLy8gdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KKyAgYm9vbCBlcmFzZShQdHJUeXBlIFB0cikgeworICAgIHJldHVybiBlcmFzZV9pbXAoUHRyVHJhaXRzOjpnZXRBc1ZvaWRQb2ludGVyKFB0cikpOworICB9CisgIC8vLyBjb3VudCAtIFJldHVybiAxIGlmIHRoZSBzcGVjaWZpZWQgcG9pbnRlciBpcyBpbiB0aGUgc2V0LCAwIG90aGVyd2lzZS4KKyAgc2l6ZV90eXBlIGNvdW50KENvbnN0UHRyVHlwZSBQdHIpIGNvbnN0IHsgcmV0dXJuIGZpbmQoUHRyKSAhPSBlbmQoKSA/IDEgOiAwOyB9CisgIGl0ZXJhdG9yIGZpbmQoQ29uc3RQdHJUeXBlIFB0cikgY29uc3QgeworICAgIHJldHVybiBtYWtlSXRlcmF0b3IoZmluZF9pbXAoQ29uc3RQdHJUcmFpdHM6OmdldEFzVm9pZFBvaW50ZXIoUHRyKSkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJUPgorICB2b2lkIGluc2VydChJdGVyVCBJLCBJdGVyVCBFKSB7CisgICAgZm9yICg7IEkgIT0gRTsgKytJKQorICAgICAgaW5zZXJ0KCpJKTsKKyAgfQorCisgIHZvaWQgaW5zZXJ0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxQdHJUeXBlPiBJTCkgeworICAgIGluc2VydChJTC5iZWdpbigpLCBJTC5lbmQoKSk7CisgIH0KKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKKyAgICBpZiAoc2hvdWxkUmV2ZXJzZUl0ZXJhdGUoKSkKKyAgICAgIHJldHVybiBtYWtlSXRlcmF0b3IoRW5kUG9pbnRlcigpIC0gMSk7CisgICAgcmV0dXJuIG1ha2VJdGVyYXRvcihDdXJBcnJheSk7CisgIH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbWFrZUl0ZXJhdG9yKEVuZFBvaW50ZXIoKSk7IH0KKworcHJpdmF0ZToKKyAgLy8vIENyZWF0ZSBhbiBpdGVyYXRvciB0aGF0IGRlcmVmZXJlbmNlcyB0byBzYW1lIHBsYWNlIGFzIHRoZSBnaXZlbiBwb2ludGVyLgorICBpdGVyYXRvciBtYWtlSXRlcmF0b3IoY29uc3Qgdm9pZCAqY29uc3QgKlApIGNvbnN0IHsKKyAgICBpZiAoc2hvdWxkUmV2ZXJzZUl0ZXJhdGUoKSkKKyAgICAgIHJldHVybiBpdGVyYXRvcihQID09IEVuZFBvaW50ZXIoKSA/IEN1ckFycmF5IDogUCArIDEsIEN1ckFycmF5LCAqdGhpcyk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKFAsIEVuZFBvaW50ZXIoKSwgKnRoaXMpOworICB9Cit9OworCisvLy8gU21hbGxQdHJTZXQgLSBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzZXQgd2hpY2ggaXMgb3B0aW1pemVkIGZvciBob2xkaW5nCisvLy8gU21hbGxTaXplIG9yIGxlc3MgZWxlbWVudHMuICBUaGlzIGludGVybmFsbHkgcm91bmRzIHVwIFNtYWxsU2l6ZSB0byB0aGUgbmV4dAorLy8vIHBvd2VyIG9mIHR3byBpZiBpdCBpcyBub3QgYWxyZWFkeSBhIHBvd2VyIG9mIHR3by4gIFNlZSB0aGUgY29tbWVudHMgYWJvdmUKKy8vLyBTbWFsbFB0clNldEltcGxCYXNlIGZvciBkZXRhaWxzIG9mIHRoZSBhbGdvcml0aG0uCit0ZW1wbGF0ZTxjbGFzcyBQdHJUeXBlLCB1bnNpZ25lZCBTbWFsbFNpemU+CitjbGFzcyBTbWFsbFB0clNldCA6IHB1YmxpYyBTbWFsbFB0clNldEltcGw8UHRyVHlwZT4geworICAvLyBJbiBzbWFsbCBtb2RlIFNtYWxsUHRyU2V0IHVzZXMgbGluZWFyIHNlYXJjaCBmb3IgdGhlIGVsZW1lbnRzLCBzbyBpdCBpcworICAvLyBub3QgYSBnb29kIGlkZWEgdG8gY2hvb3NlIHRoaXMgdmFsdWUgdG9vIGhpZ2guIFlvdSBtYXkgY29uc2lkZXIgdXNpbmcgYQorICAvLyBEZW5zZVNldDw+IGluc3RlYWQgaWYgeW91IGV4cGVjdCBtYW55IGVsZW1lbnRzIGluIHRoZSBzZXQuCisgIHN0YXRpY19hc3NlcnQoU21hbGxTaXplIDw9IDMyLCAiU21hbGxTaXplIHNob3VsZCBiZSBzbWFsbCIpOworCisgIHVzaW5nIEJhc2VUID0gU21hbGxQdHJTZXRJbXBsPFB0clR5cGU+OworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IFNtYWxsU2l6ZSBpcyBhIHBvd2VyIG9mIHR3bywgcm91bmQgdXAgaWYgbm90LgorICBlbnVtIHsgU21hbGxTaXplUG93VHdvID0gUm91bmRVcFRvUG93ZXJPZlR3bzxTbWFsbFNpemU+OjpWYWwgfTsKKyAgLy8vIFNtYWxsU3RvcmFnZSAtIEZpeGVkIHNpemUgc3RvcmFnZSB1c2VkIGluICdzbWFsbCBtb2RlJy4KKyAgY29uc3Qgdm9pZCAqU21hbGxTdG9yYWdlW1NtYWxsU2l6ZVBvd1R3b107CisKK3B1YmxpYzoKKyAgU21hbGxQdHJTZXQoKSA6IEJhc2VUKFNtYWxsU3RvcmFnZSwgU21hbGxTaXplUG93VHdvKSB7fQorICBTbWFsbFB0clNldChjb25zdCBTbWFsbFB0clNldCAmdGhhdCkgOiBCYXNlVChTbWFsbFN0b3JhZ2UsIHRoYXQpIHt9CisgIFNtYWxsUHRyU2V0KFNtYWxsUHRyU2V0ICYmdGhhdCkKKyAgICAgIDogQmFzZVQoU21hbGxTdG9yYWdlLCBTbWFsbFNpemVQb3dUd28sIHN0ZDo6bW92ZSh0aGF0KSkge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgU21hbGxQdHJTZXQoSXQgSSwgSXQgRSkgOiBCYXNlVChTbWFsbFN0b3JhZ2UsIFNtYWxsU2l6ZVBvd1R3bykgeworICAgIHRoaXMtPmluc2VydChJLCBFKTsKKyAgfQorCisgIFNtYWxsUHRyU2V0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxQdHJUeXBlPiBJTCkKKyAgICAgIDogQmFzZVQoU21hbGxTdG9yYWdlLCBTbWFsbFNpemVQb3dUd28pIHsKKyAgICB0aGlzLT5pbnNlcnQoSUwuYmVnaW4oKSwgSUwuZW5kKCkpOworICB9CisKKyAgU21hbGxQdHJTZXQ8UHRyVHlwZSwgU21hbGxTaXplPiAmCisgIG9wZXJhdG9yPShjb25zdCBTbWFsbFB0clNldDxQdHJUeXBlLCBTbWFsbFNpemU+ICZSSFMpIHsKKyAgICBpZiAoJlJIUyAhPSB0aGlzKQorICAgICAgdGhpcy0+Q29weUZyb20oUkhTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBTbWFsbFB0clNldDxQdHJUeXBlLCBTbWFsbFNpemU+ICYKKyAgb3BlcmF0b3I9KFNtYWxsUHRyU2V0PFB0clR5cGUsIFNtYWxsU2l6ZT4gJiZSSFMpIHsKKyAgICBpZiAoJlJIUyAhPSB0aGlzKQorICAgICAgdGhpcy0+TW92ZUZyb20oU21hbGxTaXplUG93VHdvLCBzdGQ6Om1vdmUoUkhTKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgU21hbGxQdHJTZXQ8UHRyVHlwZSwgU21hbGxTaXplPiAmCisgIG9wZXJhdG9yPShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8UHRyVHlwZT4gSUwpIHsKKyAgICB0aGlzLT5jbGVhcigpOworICAgIHRoaXMtPmluc2VydChJTC5iZWdpbigpLCBJTC5lbmQoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIHN3YXAgLSBTd2FwcyB0aGUgZWxlbWVudHMgb2YgdHdvIHNldHMuCisgIHZvaWQgc3dhcChTbWFsbFB0clNldDxQdHJUeXBlLCBTbWFsbFNpemU+ICZSSFMpIHsKKyAgICBTbWFsbFB0clNldEltcGxCYXNlOjpzd2FwKFJIUyk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBzdGQgeworCisgIC8vLyBJbXBsZW1lbnQgc3RkOjpzd2FwIGluIHRlcm1zIG9mIFNtYWxsUHRyU2V0IHN3YXAuCisgIHRlbXBsYXRlPGNsYXNzIFQsIHVuc2lnbmVkIE4+CisgIGlubGluZSB2b2lkIHN3YXAobGx2bTo6U21hbGxQdHJTZXQ8VCwgTj4gJkxIUywgbGx2bTo6U21hbGxQdHJTZXQ8VCwgTj4gJlJIUykgeworICAgIExIUy5zd2FwKFJIUyk7CisgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gTExWTV9BRFRfU01BTExQVFJTRVRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxTZXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NtYWxsU2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyZDBmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NtYWxsU2V0LmgKQEAgLTAsMCArMSwxNDIgQEAKKy8vPT09LSBsbHZtL0FEVC9TbWFsbFNldC5oIC0gJ05vcm1hbGx5IHNtYWxsJyBzZXRzIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFNtYWxsU2V0IGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU01BTExTRVRfSAorI2RlZmluZSBMTFZNX0FEVF9TTUFMTFNFVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gU21hbGxTZXQgLSBUaGlzIG1haW50YWlucyBhIHNldCBvZiB1bmlxdWUgdmFsdWVzLCBvcHRpbWl6aW5nIGZvciB0aGUgY2FzZQorLy8vIHdoZW4gdGhlIHNldCBpcyBzbWFsbCAobGVzcyB0aGFuIE4pLiAgSW4gdGhpcyBjYXNlLCB0aGUgc2V0IGNhbiBiZQorLy8vIG1haW50YWluZWQgd2l0aCBubyBtYWxsb2NzLiAgSWYgdGhlIHNldCBnZXRzIGxhcmdlLCB3ZSBleHBhbmQgdG8gdXNpbmcgYW4KKy8vLyBzdGQ6OnNldCB0byBtYWludGFpbiByZWFzb25hYmxlIGxvb2t1cCB0aW1lcy4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIHNldCBkb2VzIG5vdCBwcm92aWRlIGEgd2F5IHRvIGl0ZXJhdGUgb3ZlciBtZW1iZXJzIGluIHRoZQorLy8vIHNldC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBDID0gc3RkOjpsZXNzPFQ+PgorY2xhc3MgU21hbGxTZXQgeworICAvLy8gVXNlIGEgU21hbGxWZWN0b3IgdG8gaG9sZCB0aGUgZWxlbWVudHMgaGVyZSAoZXZlbiB0aG91Z2ggaXQgd2lsbCBuZXZlcgorICAvLy8gcmVhY2ggaXRzICdsYXJnZScgc3RhZ2UpIHRvIGF2b2lkIGNhbGxpbmcgdGhlIGRlZmF1bHQgY3RvcnMgb2YgZWxlbWVudHMKKyAgLy8vIHdlIHdpbGwgbmV2ZXIgdXNlLgorICBTbWFsbFZlY3RvcjxULCBOPiBWZWN0b3I7CisgIHN0ZDo6c2V0PFQsIEM+IFNldDsKKworICB1c2luZyBWSXRlcmF0b3IgPSB0eXBlbmFtZSBTbWFsbFZlY3RvcjxULCBOPjo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIG11dGFibGVfaXRlcmF0b3IgPSB0eXBlbmFtZSBTbWFsbFZlY3RvcjxULCBOPjo6aXRlcmF0b3I7CisKKyAgLy8gSW4gc21hbGwgbW9kZSBTbWFsbFB0clNldCB1c2VzIGxpbmVhciBzZWFyY2ggZm9yIHRoZSBlbGVtZW50cywgc28gaXQgaXMKKyAgLy8gbm90IGEgZ29vZCBpZGVhIHRvIGNob29zZSB0aGlzIHZhbHVlIHRvbyBoaWdoLiBZb3UgbWF5IGNvbnNpZGVyIHVzaW5nIGEKKyAgLy8gRGVuc2VTZXQ8PiBpbnN0ZWFkIGlmIHlvdSBleHBlY3QgbWFueSBlbGVtZW50cyBpbiB0aGUgc2V0LgorICBzdGF0aWNfYXNzZXJ0KE4gPD0gMzIsICJOIHNob3VsZCBiZSBzbWFsbCIpOworCitwdWJsaWM6CisgIHVzaW5nIHNpemVfdHlwZSA9IHNpemVfdDsKKworICBTbWFsbFNldCgpID0gZGVmYXVsdDsKKworICBMTFZNX05PRElTQ0FSRCBib29sIGVtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBWZWN0b3IuZW1wdHkoKSAmJiBTZXQuZW1wdHkoKTsKKyAgfQorCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeworICAgIHJldHVybiBpc1NtYWxsKCkgPyBWZWN0b3Iuc2l6ZSgpIDogU2V0LnNpemUoKTsKKyAgfQorCisgIC8vLyBjb3VudCAtIFJldHVybiAxIGlmIHRoZSBlbGVtZW50IGlzIGluIHRoZSBzZXQsIDAgb3RoZXJ3aXNlLgorICBzaXplX3R5cGUgY291bnQoY29uc3QgVCAmVikgY29uc3QgeworICAgIGlmIChpc1NtYWxsKCkpIHsKKyAgICAgIC8vIFNpbmNlIHRoZSBjb2xsZWN0aW9uIGlzIHNtYWxsLCBqdXN0IGRvIGEgbGluZWFyIHNlYXJjaC4KKyAgICAgIHJldHVybiB2ZmluZChWKSA9PSBWZWN0b3IuZW5kKCkgPyAwIDogMTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFNldC5jb3VudChWKTsKKyAgICB9CisgIH0KKworICAvLy8gaW5zZXJ0IC0gSW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgc2V0IGlmIGl0IGlzbid0IGFscmVhZHkgdGhlcmUuCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgaW5zZXJ0ZWQgKGl0IHdhcyBub3QgaW4gdGhlIHNldCBiZWZvcmUpLgorICAvLy8gVGhlIGZpcnN0IHZhbHVlIG9mIHRoZSByZXR1cm5lZCBwYWlyIGlzIHVudXNlZCBhbmQgcHJvdmlkZWQgZm9yCisgIC8vLyBwYXJ0aWFsIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgc3RhbmRhcmQgbGlicmFyeSBzZWxmLWFzc29jaWF0aXZlIGNvbnRhaW5lcgorICAvLy8gY29uY2VwdC4KKyAgLy8gRklYTUU6IEFkZCBpdGVyYXRvcnMgdGhhdCBhYnN0cmFjdCBvdmVyIHRoZSBzbWFsbCBhbmQgbGFyZ2UgZm9ybSwgYW5kIHRoZW4KKyAgLy8gcmV0dXJuIHRob3NlIGhlcmUuCisgIHN0ZDo6cGFpcjxOb25lVHlwZSwgYm9vbD4gaW5zZXJ0KGNvbnN0IFQgJlYpIHsKKyAgICBpZiAoIWlzU21hbGwoKSkKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihOb25lLCBTZXQuaW5zZXJ0KFYpLnNlY29uZCk7CisKKyAgICBWSXRlcmF0b3IgSSA9IHZmaW5kKFYpOworICAgIGlmIChJICE9IFZlY3Rvci5lbmQoKSkgICAgLy8gRG9uJ3QgcmVpbnNlcnQgaWYgaXQgYWxyZWFkeSBleGlzdHMuCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoTm9uZSwgZmFsc2UpOworICAgIGlmIChWZWN0b3Iuc2l6ZSgpIDwgTikgeworICAgICAgVmVjdG9yLnB1c2hfYmFjayhWKTsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihOb25lLCB0cnVlKTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIGdyb3cgZnJvbSB2ZWN0b3IgdG8gc2V0LgorICAgIHdoaWxlICghVmVjdG9yLmVtcHR5KCkpIHsKKyAgICAgIFNldC5pbnNlcnQoVmVjdG9yLmJhY2soKSk7CisgICAgICBWZWN0b3IucG9wX2JhY2soKTsKKyAgICB9CisgICAgU2V0Lmluc2VydChWKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoTm9uZSwgdHJ1ZSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlclQ+CisgIHZvaWQgaW5zZXJ0KEl0ZXJUIEksIEl0ZXJUIEUpIHsKKyAgICBmb3IgKDsgSSAhPSBFOyArK0kpCisgICAgICBpbnNlcnQoKkkpOworICB9CisKKyAgYm9vbCBlcmFzZShjb25zdCBUICZWKSB7CisgICAgaWYgKCFpc1NtYWxsKCkpCisgICAgICByZXR1cm4gU2V0LmVyYXNlKFYpOworICAgIGZvciAobXV0YWJsZV9pdGVyYXRvciBJID0gVmVjdG9yLmJlZ2luKCksIEUgPSBWZWN0b3IuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgaWYgKCpJID09IFYpIHsKKyAgICAgICAgVmVjdG9yLmVyYXNlKEkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIFZlY3Rvci5jbGVhcigpOworICAgIFNldC5jbGVhcigpOworICB9CisKK3ByaXZhdGU6CisgIGJvb2wgaXNTbWFsbCgpIGNvbnN0IHsgcmV0dXJuIFNldC5lbXB0eSgpOyB9CisKKyAgVkl0ZXJhdG9yIHZmaW5kKGNvbnN0IFQgJlYpIGNvbnN0IHsKKyAgICBmb3IgKFZJdGVyYXRvciBJID0gVmVjdG9yLmJlZ2luKCksIEUgPSBWZWN0b3IuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgaWYgKCpJID09IFYpCisgICAgICAgIHJldHVybiBJOworICAgIHJldHVybiBWZWN0b3IuZW5kKCk7CisgIH0KK307CisKKy8vLyBJZiB0aGlzIHNldCBpcyBvZiBwb2ludGVyIHZhbHVlcywgdHJhbnNwYXJlbnRseSBzd2l0Y2ggb3ZlciB0byB1c2luZworLy8vIFNtYWxsUHRyU2V0IGZvciBwZXJmb3JtYW5jZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQb2ludGVlVHlwZSwgdW5zaWduZWQgTj4KK2NsYXNzIFNtYWxsU2V0PFBvaW50ZWVUeXBlKiwgTj4gOiBwdWJsaWMgU21hbGxQdHJTZXQ8UG9pbnRlZVR5cGUqLCBOPiB7fTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1NNQUxMU0VUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NtYWxsU3RyaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFN0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNDZlODUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFN0cmluZy5oCkBAIC0wLDAgKzEsMjk3IEBACisvLz09PS0gbGx2bS9BRFQvU21hbGxTdHJpbmcuaCAtICdOb3JtYWxseSBzbWFsbCcgc3RyaW5ncyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBTbWFsbFN0cmluZyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NNQUxMU1RSSU5HX0gKKyNkZWZpbmUgTExWTV9BRFRfU01BTExTVFJJTkdfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBTbWFsbFN0cmluZyAtIEEgU21hbGxTdHJpbmcgaXMganVzdCBhIFNtYWxsVmVjdG9yIHdpdGggbWV0aG9kcyBhbmQgYWNjZXNzb3JzCisvLy8gdGhhdCBtYWtlIGl0IHdvcmsgYmV0dGVyIGFzIGEgc3RyaW5nIChlLmcuIG9wZXJhdG9yKyBldGMpLgordGVtcGxhdGU8dW5zaWduZWQgSW50ZXJuYWxMZW4+CitjbGFzcyBTbWFsbFN0cmluZyA6IHB1YmxpYyBTbWFsbFZlY3RvcjxjaGFyLCBJbnRlcm5hbExlbj4geworcHVibGljOgorICAvLy8gRGVmYXVsdCBjdG9yIC0gSW5pdGlhbGl6ZSB0byBlbXB0eS4KKyAgU21hbGxTdHJpbmcoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIEluaXRpYWxpemUgZnJvbSBhIFN0cmluZ1JlZi4KKyAgU21hbGxTdHJpbmcoU3RyaW5nUmVmIFMpIDogU21hbGxWZWN0b3I8Y2hhciwgSW50ZXJuYWxMZW4+KFMuYmVnaW4oKSwgUy5lbmQoKSkge30KKworICAvLy8gSW5pdGlhbGl6ZSB3aXRoIGEgcmFuZ2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEl0VHk+CisgIFNtYWxsU3RyaW5nKEl0VHkgUywgSXRUeSBFKSA6IFNtYWxsVmVjdG9yPGNoYXIsIEludGVybmFsTGVuPihTLCBFKSB7fQorCisgIC8vIE5vdGUgdGhhdCBpbiBvcmRlciB0byBhZGQgbmV3IG92ZXJsb2FkcyBmb3IgYXBwZW5kICYgYXNzaWduLCB3ZSBoYXZlIHRvCisgIC8vIGR1cGxpY2F0ZSB0aGUgaW5oZXJpdGVkIHZlcnNpb25zIHNvIGFzIG5vdCB0byBpbmFkdmVydGVudGx5IGhpZGUgdGhlbS4KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIFN0cmluZyBBc3NpZ25tZW50CisgIC8vLyBAeworCisgIC8vLyBBc3NpZ24gZnJvbSBhIHJlcGVhdGVkIGVsZW1lbnQuCisgIHZvaWQgYXNzaWduKHNpemVfdCBOdW1FbHRzLCBjaGFyIEVsdCkgeworICAgIHRoaXMtPlNtYWxsVmVjdG9ySW1wbDxjaGFyPjo6YXNzaWduKE51bUVsdHMsIEVsdCk7CisgIH0KKworICAvLy8gQXNzaWduIGZyb20gYW4gaXRlcmF0b3IgcGFpci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgaW5faXRlcj4KKyAgdm9pZCBhc3NpZ24oaW5faXRlciBTLCBpbl9pdGVyIEUpIHsKKyAgICB0aGlzLT5jbGVhcigpOworICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPjo6YXBwZW5kKFMsIEUpOworICB9CisKKyAgLy8vIEFzc2lnbiBmcm9tIGEgU3RyaW5nUmVmLgorICB2b2lkIGFzc2lnbihTdHJpbmdSZWYgUkhTKSB7CisgICAgdGhpcy0+Y2xlYXIoKTsKKyAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj46OmFwcGVuZChSSFMuYmVnaW4oKSwgUkhTLmVuZCgpKTsKKyAgfQorCisgIC8vLyBBc3NpZ24gZnJvbSBhIFNtYWxsVmVjdG9yLgorICB2b2lkIGFzc2lnbihjb25zdCBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlJIUykgeworICAgIHRoaXMtPmNsZWFyKCk7CisgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+OjphcHBlbmQoUkhTLmJlZ2luKCksIFJIUy5lbmQoKSk7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIFN0cmluZyBDb25jYXRlbmF0aW9uCisgIC8vLyBAeworCisgIC8vLyBBcHBlbmQgZnJvbSBhbiBpdGVyYXRvciBwYWlyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBpbl9pdGVyPgorICB2b2lkIGFwcGVuZChpbl9pdGVyIFMsIGluX2l0ZXIgRSkgeworICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPjo6YXBwZW5kKFMsIEUpOworICB9CisKKyAgdm9pZCBhcHBlbmQoc2l6ZV90IE51bUlucHV0cywgY2hhciBFbHQpIHsKKyAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj46OmFwcGVuZChOdW1JbnB1dHMsIEVsdCk7CisgIH0KKworICAvLy8gQXBwZW5kIGZyb20gYSBTdHJpbmdSZWYuCisgIHZvaWQgYXBwZW5kKFN0cmluZ1JlZiBSSFMpIHsKKyAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj46OmFwcGVuZChSSFMuYmVnaW4oKSwgUkhTLmVuZCgpKTsKKyAgfQorCisgIC8vLyBBcHBlbmQgZnJvbSBhIFNtYWxsVmVjdG9yLgorICB2b2lkIGFwcGVuZChjb25zdCBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlJIUykgeworICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPjo6YXBwZW5kKFJIUy5iZWdpbigpLCBSSFMuZW5kKCkpOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBTdHJpbmcgQ29tcGFyaXNvbgorICAvLy8gQHsKKworICAvLy8gQ2hlY2sgZm9yIHN0cmluZyBlcXVhbGl0eS4gIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBjb21wYXJlKCkgd2hlbgorICAvLy8gdGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIGluZXF1YWwgc3RyaW5ncyBpc24ndCBuZWVkZWQuCisgIGJvb2wgZXF1YWxzKFN0cmluZ1JlZiBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyKCkuZXF1YWxzKFJIUyk7CisgIH0KKworICAvLy8gQ2hlY2sgZm9yIHN0cmluZyBlcXVhbGl0eSwgaWdub3JpbmcgY2FzZS4KKyAgYm9vbCBlcXVhbHNfbG93ZXIoU3RyaW5nUmVmIFJIUykgY29uc3QgeworICAgIHJldHVybiBzdHIoKS5lcXVhbHNfbG93ZXIoUkhTKTsKKyAgfQorCisgIC8vLyBDb21wYXJlIHR3byBzdHJpbmdzOyB0aGUgcmVzdWx0IGlzIC0xLCAwLCBvciAxIGlmIHRoaXMgc3RyaW5nIGlzCisgIC8vLyBsZXhpY29ncmFwaGljYWxseSBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIFxwIFJIUy4KKyAgaW50IGNvbXBhcmUoU3RyaW5nUmVmIFJIUykgY29uc3QgeworICAgIHJldHVybiBzdHIoKS5jb21wYXJlKFJIUyk7CisgIH0KKworICAvLy8gY29tcGFyZV9sb3dlciAtIENvbXBhcmUgdHdvIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuCisgIGludCBjb21wYXJlX2xvd2VyKFN0cmluZ1JlZiBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyKCkuY29tcGFyZV9sb3dlcihSSFMpOworICB9CisKKyAgLy8vIGNvbXBhcmVfbnVtZXJpYyAtIENvbXBhcmUgdHdvIHN0cmluZ3MsIHRyZWF0aW5nIHNlcXVlbmNlcyBvZiBkaWdpdHMgYXMKKyAgLy8vIG51bWJlcnMuCisgIGludCBjb21wYXJlX251bWVyaWMoU3RyaW5nUmVmIFJIUykgY29uc3QgeworICAgIHJldHVybiBzdHIoKS5jb21wYXJlX251bWVyaWMoUkhTKTsKKyAgfQorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgU3RyaW5nIFByZWRpY2F0ZXMKKyAgLy8vIEB7CisKKyAgLy8vIHN0YXJ0c3dpdGggLSBDaGVjayBpZiB0aGlzIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gXHAgUHJlZml4LgorICBib29sIHN0YXJ0c3dpdGgoU3RyaW5nUmVmIFByZWZpeCkgY29uc3QgeworICAgIHJldHVybiBzdHIoKS5zdGFydHN3aXRoKFByZWZpeCk7CisgIH0KKworICAvLy8gZW5kc3dpdGggLSBDaGVjayBpZiB0aGlzIHN0cmluZyBlbmRzIHdpdGggdGhlIGdpdmVuIFxwIFN1ZmZpeC4KKyAgYm9vbCBlbmRzd2l0aChTdHJpbmdSZWYgU3VmZml4KSBjb25zdCB7CisgICAgcmV0dXJuIHN0cigpLmVuZHN3aXRoKFN1ZmZpeCk7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIFN0cmluZyBTZWFyY2hpbmcKKyAgLy8vIEB7CisKKyAgLy8vIGZpbmQgLSBTZWFyY2ggZm9yIHRoZSBmaXJzdCBjaGFyYWN0ZXIgXHAgQyBpbiB0aGUgc3RyaW5nLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gLSBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgXHAgQywgb3IgbnBvcyBpZiBub3QKKyAgLy8vIGZvdW5kLgorICBzaXplX3QgZmluZChjaGFyIEMsIHNpemVfdCBGcm9tID0gMCkgY29uc3QgeworICAgIHJldHVybiBzdHIoKS5maW5kKEMsIEZyb20pOworICB9CisKKyAgLy8vIFNlYXJjaCBmb3IgdGhlIGZpcnN0IHN0cmluZyBccCBTdHIgaW4gdGhlIHN0cmluZy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgXHAgU3RyLCBvciBucG9zIGlmIG5vdAorICAvLy8gZm91bmQuCisgIHNpemVfdCBmaW5kKFN0cmluZ1JlZiBTdHIsIHNpemVfdCBGcm9tID0gMCkgY29uc3QgeworICAgIHJldHVybiBzdHIoKS5maW5kKFN0ciwgRnJvbSk7CisgIH0KKworICAvLy8gU2VhcmNoIGZvciB0aGUgbGFzdCBjaGFyYWN0ZXIgXHAgQyBpbiB0aGUgc3RyaW5nLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIFxwIEMsIG9yIG5wb3MgaWYgbm90CisgIC8vLyBmb3VuZC4KKyAgc2l6ZV90IHJmaW5kKGNoYXIgQywgc2l6ZV90IEZyb20gPSBTdHJpbmdSZWY6Om5wb3MpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyKCkucmZpbmQoQywgRnJvbSk7CisgIH0KKworICAvLy8gU2VhcmNoIGZvciB0aGUgbGFzdCBzdHJpbmcgXHAgU3RyIGluIHRoZSBzdHJpbmcuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgXHAgU3RyLCBvciBucG9zIGlmIG5vdAorICAvLy8gZm91bmQuCisgIHNpemVfdCByZmluZChTdHJpbmdSZWYgU3RyKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cigpLnJmaW5kKFN0cik7CisgIH0KKworICAvLy8gRmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBccCBDLCBvciBucG9zIGlmIG5vdAorICAvLy8gZm91bmQuIFNhbWUgYXMgZmluZC4KKyAgc2l6ZV90IGZpbmRfZmlyc3Rfb2YoY2hhciBDLCBzaXplX3QgRnJvbSA9IDApIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyKCkuZmluZF9maXJzdF9vZihDLCBGcm9tKTsKKyAgfQorCisgIC8vLyBGaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIGluIFxwIENoYXJzLCBvciBucG9zIGlmCisgIC8vLyBub3QgZm91bmQuCisgIC8vLworICAvLy8gQ29tcGxleGl0eTogTyhzaXplKCkgKyBDaGFycy5zaXplKCkpCisgIHNpemVfdCBmaW5kX2ZpcnN0X29mKFN0cmluZ1JlZiBDaGFycywgc2l6ZV90IEZyb20gPSAwKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cigpLmZpbmRfZmlyc3Rfb2YoQ2hhcnMsIEZyb20pOworICB9CisKKyAgLy8vIEZpbmQgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIHRoYXQgaXMgbm90IFxwIEMgb3IgbnBvcyBpZiBub3QKKyAgLy8vIGZvdW5kLgorICBzaXplX3QgZmluZF9maXJzdF9ub3Rfb2YoY2hhciBDLCBzaXplX3QgRnJvbSA9IDApIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyKCkuZmluZF9maXJzdF9ub3Rfb2YoQywgRnJvbSk7CisgIH0KKworICAvLy8gRmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBub3QgaW4gdGhlIHN0cmluZworICAvLy8gXHAgQ2hhcnMsIG9yIG5wb3MgaWYgbm90IGZvdW5kLgorICAvLy8KKyAgLy8vIENvbXBsZXhpdHk6IE8oc2l6ZSgpICsgQ2hhcnMuc2l6ZSgpKQorICBzaXplX3QgZmluZF9maXJzdF9ub3Rfb2YoU3RyaW5nUmVmIENoYXJzLCBzaXplX3QgRnJvbSA9IDApIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyKCkuZmluZF9maXJzdF9ub3Rfb2YoQ2hhcnMsIEZyb20pOworICB9CisKKyAgLy8vIEZpbmQgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBccCBDLCBvciBucG9zIGlmIG5vdAorICAvLy8gZm91bmQuCisgIHNpemVfdCBmaW5kX2xhc3Rfb2YoY2hhciBDLCBzaXplX3QgRnJvbSA9IFN0cmluZ1JlZjo6bnBvcykgY29uc3QgeworICAgIHJldHVybiBzdHIoKS5maW5kX2xhc3Rfb2YoQywgRnJvbSk7CisgIH0KKworICAvLy8gRmluZCB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIGluIFxwIEMsIG9yIG5wb3MgaWYgbm90CisgIC8vLyBmb3VuZC4KKyAgLy8vCisgIC8vLyBDb21wbGV4aXR5OiBPKHNpemUoKSArIENoYXJzLnNpemUoKSkKKyAgc2l6ZV90IGZpbmRfbGFzdF9vZigKKyAgICAgIFN0cmluZ1JlZiBDaGFycywgc2l6ZV90IEZyb20gPSBTdHJpbmdSZWY6Om5wb3MpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyKCkuZmluZF9sYXN0X29mKENoYXJzLCBGcm9tKTsKKyAgfQorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgSGVscGZ1bCBBbGdvcml0aG1zCisgIC8vLyBAeworCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiBccCBDIGluIHRoZSBzdHJpbmcuCisgIHNpemVfdCBjb3VudChjaGFyIEMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyKCkuY291bnQoQyk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwZWQgb2NjdXJyZW5jZXMgb2YgXHAgU3RyIGluIHRoZQorICAvLy8gc3RyaW5nLgorICBzaXplX3QgY291bnQoU3RyaW5nUmVmIFN0cikgY29uc3QgeworICAgIHJldHVybiBzdHIoKS5jb3VudChTdHIpOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBTdWJzdHJpbmcgT3BlcmF0aW9ucworICAvLy8gQHsKKworICAvLy8gUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBzdWJzdHJpbmcgZnJvbSBbU3RhcnQsIFN0YXJ0ICsgTikuCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0IFRoZSBpbmRleCBvZiB0aGUgc3RhcnRpbmcgY2hhcmFjdGVyIGluIHRoZSBzdWJzdHJpbmc7IGlmCisgIC8vLyB0aGUgaW5kZXggaXMgbnBvcyBvciBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRoZW4gdGhlCisgIC8vLyBlbXB0eSBzdWJzdHJpbmcgd2lsbCBiZSByZXR1cm5lZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gTiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gaW5jbHVkZWQgaW4gdGhlIHN1YnN0cmluZy4gSWYgXHAgTgorICAvLy8gZXhjZWVkcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVtYWluaW5nIGluIHRoZSBzdHJpbmcsIHRoZSBzdHJpbmcKKyAgLy8vIHN1ZmZpeCAoc3RhcnRpbmcgd2l0aCBccCBTdGFydCkgd2lsbCBiZSByZXR1cm5lZC4KKyAgU3RyaW5nUmVmIHN1YnN0cihzaXplX3QgU3RhcnQsIHNpemVfdCBOID0gU3RyaW5nUmVmOjpucG9zKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cigpLnN1YnN0cihTdGFydCwgTik7CisgIH0KKworICAvLy8gUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBzdWJzdHJpbmcgZnJvbSBbU3RhcnQsIEVuZCkuCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0IFRoZSBpbmRleCBvZiB0aGUgc3RhcnRpbmcgY2hhcmFjdGVyIGluIHRoZSBzdWJzdHJpbmc7IGlmCisgIC8vLyB0aGUgaW5kZXggaXMgbnBvcyBvciBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRoZW4gdGhlCisgIC8vLyBlbXB0eSBzdWJzdHJpbmcgd2lsbCBiZSByZXR1cm5lZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRW5kIFRoZSBpbmRleCBmb2xsb3dpbmcgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIGluY2x1ZGUgaW4gdGhlCisgIC8vLyBzdWJzdHJpbmcuIElmIHRoaXMgaXMgbnBvcywgb3IgbGVzcyB0aGFuIFxwIFN0YXJ0LCBvciBleGNlZWRzIHRoZQorICAvLy8gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVtYWluaW5nIGluIHRoZSBzdHJpbmcsIHRoZSBzdHJpbmcgc3VmZml4CisgIC8vLyAoc3RhcnRpbmcgd2l0aCBccCBTdGFydCkgd2lsbCBiZSByZXR1cm5lZC4KKyAgU3RyaW5nUmVmIHNsaWNlKHNpemVfdCBTdGFydCwgc2l6ZV90IEVuZCkgY29uc3QgeworICAgIHJldHVybiBzdHIoKS5zbGljZShTdGFydCwgRW5kKTsKKyAgfQorCisgIC8vIEV4dHJhIG1ldGhvZHMuCisKKyAgLy8vIEV4cGxpY2l0IGNvbnZlcnNpb24gdG8gU3RyaW5nUmVmLgorICBTdHJpbmdSZWYgc3RyKCkgY29uc3QgeyByZXR1cm4gU3RyaW5nUmVmKHRoaXMtPmJlZ2luKCksIHRoaXMtPnNpemUoKSk7IH0KKworICAvLyBUT0RPOiBNYWtlIHRoaXMgY29uc3QsIGlmIGl0J3Mgc2FmZS4uLgorICBjb25zdCBjaGFyKiBjX3N0cigpIHsKKyAgICB0aGlzLT5wdXNoX2JhY2soMCk7CisgICAgdGhpcy0+cG9wX2JhY2soKTsKKyAgICByZXR1cm4gdGhpcy0+ZGF0YSgpOworICB9CisKKyAgLy8vIEltcGxpY2l0IGNvbnZlcnNpb24gdG8gU3RyaW5nUmVmLgorICBvcGVyYXRvciBTdHJpbmdSZWYoKSBjb25zdCB7IHJldHVybiBzdHIoKTsgfQorCisgIC8vIEV4dHJhIG9wZXJhdG9ycy4KKyAgY29uc3QgU21hbGxTdHJpbmcgJm9wZXJhdG9yPShTdHJpbmdSZWYgUkhTKSB7CisgICAgdGhpcy0+Y2xlYXIoKTsKKyAgICByZXR1cm4gKnRoaXMgKz0gUkhTOworICB9CisKKyAgU21hbGxTdHJpbmcgJm9wZXJhdG9yKz0oU3RyaW5nUmVmIFJIUykgeworICAgIHRoaXMtPmFwcGVuZChSSFMuYmVnaW4oKSwgUkhTLmVuZCgpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgU21hbGxTdHJpbmcgJm9wZXJhdG9yKz0oY2hhciBDKSB7CisgICAgdGhpcy0+cHVzaF9iYWNrKEMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1NNQUxMU1RSSU5HX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMTdlNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFZlY3Rvci5oCkBAIC0wLDAgKzEsOTU4IEBACisvLz09PS0gbGx2bS9BRFQvU21hbGxWZWN0b3IuaCAtICdOb3JtYWxseSBzbWFsbCcgdmVjdG9ycyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBTbWFsbFZlY3RvciBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NNQUxMVkVDVE9SX0gKKyNkZWZpbmUgTExWTV9BRFRfU01BTExWRUNUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxpZ25PZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVGhpcyBpcyBhbGwgdGhlIG5vbi10ZW1wbGF0ZWQgc3R1ZmYgY29tbW9uIHRvIGFsbCBTbWFsbFZlY3RvcnMuCitjbGFzcyBTbWFsbFZlY3RvckJhc2UgeworcHJvdGVjdGVkOgorICB2b2lkICpCZWdpblgsICpFbmRYLCAqQ2FwYWNpdHlYOworCitwcm90ZWN0ZWQ6CisgIFNtYWxsVmVjdG9yQmFzZSh2b2lkICpGaXJzdEVsLCBzaXplX3QgU2l6ZSkKKyAgICA6IEJlZ2luWChGaXJzdEVsKSwgRW5kWChGaXJzdEVsKSwgQ2FwYWNpdHlYKChjaGFyKilGaXJzdEVsK1NpemUpIHt9CisKKyAgLy8vIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGdyb3coKSBtZXRob2Qgd2hpY2ggb25seSB3b3JrcworICAvLy8gb24gUE9ELWxpa2UgZGF0YSB0eXBlcyBhbmQgaXMgb3V0IG9mIGxpbmUgdG8gcmVkdWNlIGNvZGUgZHVwbGljYXRpb24uCisgIHZvaWQgZ3Jvd19wb2Qodm9pZCAqRmlyc3RFbCwgc2l6ZV90IE1pblNpemVJbkJ5dGVzLCBzaXplX3QgVFNpemUpOworCitwdWJsaWM6CisgIC8vLyBUaGlzIHJldHVybnMgc2l6ZSgpKnNpemVvZihUKS4KKyAgc2l6ZV90IHNpemVfaW5fYnl0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHNpemVfdCgoY2hhciopRW5kWCAtIChjaGFyKilCZWdpblgpOworICB9CisKKyAgLy8vIGNhcGFjaXR5X2luX2J5dGVzIC0gVGhpcyByZXR1cm5zIGNhcGFjaXR5KCkqc2l6ZW9mKFQpLgorICBzaXplX3QgY2FwYWNpdHlfaW5fYnl0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHNpemVfdCgoY2hhciopQ2FwYWNpdHlYIC0gKGNoYXIqKUJlZ2luWCk7CisgIH0KKworICBMTFZNX05PRElTQ0FSRCBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gQmVnaW5YID09IEVuZFg7IH0KK307CisKKy8vLyBUaGlzIGlzIHRoZSBwYXJ0IG9mIFNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlIHdoaWNoIGRvZXMgbm90IGRlcGVuZCBvbiB3aGV0aGVyCisvLy8gdGhlIHR5cGUgVCBpcyBhIFBPRC4gVGhlIGV4dHJhIGR1bW15IHRlbXBsYXRlIGFyZ3VtZW50IGlzIHVzZWQgYnkgQXJyYXlSZWYKKy8vLyB0byBhdm9pZCB1bm5lY2Vzc2FyaWx5IHJlcXVpcmluZyBUIHRvIGJlIGNvbXBsZXRlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdm9pZD4KK2NsYXNzIFNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb24gOiBwdWJsaWMgU21hbGxWZWN0b3JCYXNlIHsKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdW5zaWduZWQ+IGZyaWVuZCBzdHJ1Y3QgU21hbGxWZWN0b3JTdG9yYWdlOworCisgIC8vIEFsbG9jYXRlIHJhdyBzcGFjZSBmb3IgTiBlbGVtZW50cyBvZiB0eXBlIFQuICBJZiBUIGhhcyBhIGN0b3Igb3IgZHRvciwgd2UKKyAgLy8gZG9uJ3Qgd2FudCBpdCB0byBiZSBhdXRvbWF0aWNhbGx5IHJ1biwgc28gd2UgbmVlZCB0byByZXByZXNlbnQgdGhlIHNwYWNlIGFzCisgIC8vIHNvbWV0aGluZyBlbHNlLiAgVXNlIGFuIGFycmF5IG9mIGNoYXIgb2Ygc3VmZmljaWVudCBhbGlnbm1lbnQuCisgIHVzaW5nIFUgPSBBbGlnbmVkQ2hhckFycmF5VW5pb248VD47CisgIFUgRmlyc3RFbDsKKyAgLy8gU3BhY2UgYWZ0ZXIgJ0ZpcnN0RWwnIGlzIGNsb2JiZXJlZCwgZG8gbm90IGFkZCBhbnkgaW5zdGFuY2UgdmFycyBhZnRlciBpdC4KKworcHJvdGVjdGVkOgorICBTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uKHNpemVfdCBTaXplKSA6IFNtYWxsVmVjdG9yQmFzZSgmRmlyc3RFbCwgU2l6ZSkge30KKworICB2b2lkIGdyb3dfcG9kKHNpemVfdCBNaW5TaXplSW5CeXRlcywgc2l6ZV90IFRTaXplKSB7CisgICAgU21hbGxWZWN0b3JCYXNlOjpncm93X3BvZCgmRmlyc3RFbCwgTWluU2l6ZUluQnl0ZXMsIFRTaXplKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgc21hbGx2ZWN0b3Igd2hpY2ggaGFzIG5vdCBoYWQgZHluYW1pYworICAvLy8gbWVtb3J5IGFsbG9jYXRlZCBmb3IgaXQuCisgIGJvb2wgaXNTbWFsbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQmVnaW5YID09IHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPigmRmlyc3RFbCk7CisgIH0KKworICAvLy8gUHV0IHRoaXMgdmVjdG9yIGluIGEgc3RhdGUgb2YgYmVpbmcgc21hbGwuCisgIHZvaWQgcmVzZXRUb1NtYWxsKCkgeworICAgIEJlZ2luWCA9IEVuZFggPSBDYXBhY2l0eVggPSAmRmlyc3RFbDsKKyAgfQorCisgIHZvaWQgc2V0RW5kKFQgKlApIHsgdGhpcy0+RW5kWCA9IFA7IH0KKworcHVibGljOgorICB1c2luZyBzaXplX3R5cGUgPSBzaXplX3Q7CisgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHB0cmRpZmZfdDsKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IFQ7CisgIHVzaW5nIGl0ZXJhdG9yID0gVCAqOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IGNvbnN0IFQgKjsKKworICB1c2luZyBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yID0gc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPjsKKyAgdXNpbmcgcmV2ZXJzZV9pdGVyYXRvciA9IHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj47CisKKyAgdXNpbmcgcmVmZXJlbmNlID0gVCAmOworICB1c2luZyBjb25zdF9yZWZlcmVuY2UgPSBjb25zdCBUICY7CisgIHVzaW5nIHBvaW50ZXIgPSBUICo7CisgIHVzaW5nIGNvbnN0X3BvaW50ZXIgPSBjb25zdCBUICo7CisKKyAgLy8gZm9yd2FyZCBpdGVyYXRvciBjcmVhdGlvbiBtZXRob2RzLgorICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gKGl0ZXJhdG9yKXRoaXMtPkJlZ2luWDsgfQorICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0X2l0ZXJhdG9yKXRoaXMtPkJlZ2luWDsgfQorICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIChpdGVyYXRvcil0aGlzLT5FbmRYOyB9CisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0X2l0ZXJhdG9yKXRoaXMtPkVuZFg7IH0KKworcHJvdGVjdGVkOgorICBpdGVyYXRvciBjYXBhY2l0eV9wdHIoKSB7IHJldHVybiAoaXRlcmF0b3IpdGhpcy0+Q2FwYWNpdHlYOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGNhcGFjaXR5X3B0cigpIGNvbnN0IHsgcmV0dXJuIChjb25zdF9pdGVyYXRvcil0aGlzLT5DYXBhY2l0eVg7fQorCitwdWJsaWM6CisgIC8vIHJldmVyc2UgaXRlcmF0b3IgY3JlYXRpb24gbWV0aG9kcy4KKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSAgICAgICAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3R7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSAgICAgICAgICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpO30KKworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gZW5kKCktYmVnaW4oKTsgfQorICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBzaXplX3R5cGUoLTEpIC8gc2l6ZW9mKFQpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgc2l6ZV90IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gY2FwYWNpdHlfcHRyKCkgLSBiZWdpbigpOyB9CisKKyAgLy8vIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHZlY3RvcidzIGJ1ZmZlciwgZXZlbiBpZiBlbXB0eSgpLgorICBwb2ludGVyIGRhdGEoKSB7IHJldHVybiBwb2ludGVyKGJlZ2luKCkpOyB9CisgIC8vLyBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB2ZWN0b3IncyBidWZmZXIsIGV2ZW4gaWYgZW1wdHkoKS4KKyAgY29uc3RfcG9pbnRlciBkYXRhKCkgY29uc3QgeyByZXR1cm4gY29uc3RfcG9pbnRlcihiZWdpbigpKTsgfQorCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIGlkeCkgeworICAgIGFzc2VydChpZHggPCBzaXplKCkpOworICAgIHJldHVybiBiZWdpbigpW2lkeF07CisgIH0KKyAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgaWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KGlkeCA8IHNpemUoKSk7CisgICAgcmV0dXJuIGJlZ2luKClbaWR4XTsKKyAgfQorCisgIHJlZmVyZW5jZSBmcm9udCgpIHsKKyAgICBhc3NlcnQoIWVtcHR5KCkpOworICAgIHJldHVybiBiZWdpbigpWzBdOworICB9CisgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWVtcHR5KCkpOworICAgIHJldHVybiBiZWdpbigpWzBdOworICB9CisKKyAgcmVmZXJlbmNlIGJhY2soKSB7CisgICAgYXNzZXJ0KCFlbXB0eSgpKTsKKyAgICByZXR1cm4gZW5kKClbLTFdOworICB9CisgIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgeworICAgIGFzc2VydCghZW1wdHkoKSk7CisgICAgcmV0dXJuIGVuZCgpWy0xXTsKKyAgfQorfTsKKworLy8vIFNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlPGlzUG9kTGlrZSA9IGZhbHNlPiAtIFRoaXMgaXMgd2hlcmUgd2UgcHV0IG1ldGhvZAorLy8vIGltcGxlbWVudGF0aW9ucyB0aGF0IGFyZSBkZXNpZ25lZCB0byB3b3JrIHdpdGggbm9uLVBPRC1saWtlIFQncy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIGlzUG9kTGlrZT4KK2NsYXNzIFNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlIDogcHVibGljIFNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248VD4geworcHJvdGVjdGVkOgorICBTbWFsbFZlY3RvclRlbXBsYXRlQmFzZShzaXplX3QgU2l6ZSkgOiBTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPFQ+KFNpemUpIHt9CisKKyAgc3RhdGljIHZvaWQgZGVzdHJveV9yYW5nZShUICpTLCBUICpFKSB7CisgICAgd2hpbGUgKFMgIT0gRSkgeworICAgICAgLS1FOworICAgICAgRS0+flQoKTsKKyAgICB9CisgIH0KKworICAvLy8gTW92ZSB0aGUgcmFuZ2UgW0ksIEUpIGludG8gdGhlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHN0YXJ0aW5nIHdpdGggIkRlc3QiLAorICAvLy8gY29uc3RydWN0aW5nIGVsZW1lbnRzIGFzIG5lZWRlZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSXQxLCB0eXBlbmFtZSBJdDI+CisgIHN0YXRpYyB2b2lkIHVuaW5pdGlhbGl6ZWRfbW92ZShJdDEgSSwgSXQxIEUsIEl0MiBEZXN0KSB7CisgICAgc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoc3RkOjptYWtlX21vdmVfaXRlcmF0b3IoSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3IoRSksIERlc3QpOworICB9CisKKyAgLy8vIENvcHkgdGhlIHJhbmdlIFtJLCBFKSBvbnRvIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSBzdGFydGluZyB3aXRoICJEZXN0IiwKKyAgLy8vIGNvbnN0cnVjdGluZyBlbGVtZW50cyBhcyBuZWVkZWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEl0MSwgdHlwZW5hbWUgSXQyPgorICBzdGF0aWMgdm9pZCB1bmluaXRpYWxpemVkX2NvcHkoSXQxIEksIEl0MSBFLCBJdDIgRGVzdCkgeworICAgIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KEksIEUsIERlc3QpOworICB9CisKKyAgLy8vIEdyb3cgdGhlIGFsbG9jYXRlZCBtZW1vcnkgKHdpdGhvdXQgaW5pdGlhbGl6aW5nIG5ldyBlbGVtZW50cyksIGRvdWJsaW5nCisgIC8vLyB0aGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeS4gR3VhcmFudGVlcyBzcGFjZSBmb3IgYXQgbGVhc3Qgb25lIG1vcmUKKyAgLy8vIGVsZW1lbnQsIG9yIE1pblNpemUgbW9yZSBlbGVtZW50cyBpZiBzcGVjaWZpZWQuCisgIHZvaWQgZ3JvdyhzaXplX3QgTWluU2l6ZSA9IDApOworCitwdWJsaWM6CisgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IFQgJkVsdCkgeworICAgIGlmIChMTFZNX1VOTElLRUxZKHRoaXMtPkVuZFggPj0gdGhpcy0+Q2FwYWNpdHlYKSkKKyAgICAgIHRoaXMtPmdyb3coKTsKKyAgICA6Om5ldyAoKHZvaWQqKSB0aGlzLT5lbmQoKSkgVChFbHQpOworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSsxKTsKKyAgfQorCisgIHZvaWQgcHVzaF9iYWNrKFQgJiZFbHQpIHsKKyAgICBpZiAoTExWTV9VTkxJS0VMWSh0aGlzLT5FbmRYID49IHRoaXMtPkNhcGFjaXR5WCkpCisgICAgICB0aGlzLT5ncm93KCk7CisgICAgOjpuZXcgKCh2b2lkKikgdGhpcy0+ZW5kKCkpIFQoOjpzdGQ6Om1vdmUoRWx0KSk7CisgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmVuZCgpKzEpOworICB9CisKKyAgdm9pZCBwb3BfYmFjaygpIHsKKyAgICB0aGlzLT5zZXRFbmQodGhpcy0+ZW5kKCktMSk7CisgICAgdGhpcy0+ZW5kKCktPn5UKCk7CisgIH0KK307CisKKy8vIERlZmluZSB0aGlzIG91dC1vZi1saW5lIHRvIGRpc3N1YWRlIHRoZSBDKysgY29tcGlsZXIgZnJvbSBpbmxpbmluZyBpdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIGlzUG9kTGlrZT4KK3ZvaWQgU21hbGxWZWN0b3JUZW1wbGF0ZUJhc2U8VCwgaXNQb2RMaWtlPjo6Z3JvdyhzaXplX3QgTWluU2l6ZSkgeworICBzaXplX3QgQ3VyQ2FwYWNpdHkgPSB0aGlzLT5jYXBhY2l0eSgpOworICBzaXplX3QgQ3VyU2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgLy8gQWx3YXlzIGdyb3csIGV2ZW4gZnJvbSB6ZXJvLgorICBzaXplX3QgTmV3Q2FwYWNpdHkgPSBzaXplX3QoTmV4dFBvd2VyT2YyKEN1ckNhcGFjaXR5KzIpKTsKKyAgaWYgKE5ld0NhcGFjaXR5IDwgTWluU2l6ZSkKKyAgICBOZXdDYXBhY2l0eSA9IE1pblNpemU7CisgIFQgKk5ld0VsdHMgPSBzdGF0aWNfY2FzdDxUKj4obWFsbG9jKE5ld0NhcGFjaXR5KnNpemVvZihUKSkpOworICBpZiAoTmV3RWx0cyA9PSBudWxscHRyKQorICAgIHJlcG9ydF9iYWRfYWxsb2NfZXJyb3IoIkFsbG9jYXRpb24gb2YgU21hbGxWZWN0b3IgZWxlbWVudCBmYWlsZWQuIik7CisKKyAgLy8gTW92ZSB0aGUgZWxlbWVudHMgb3Zlci4KKyAgdGhpcy0+dW5pbml0aWFsaXplZF9tb3ZlKHRoaXMtPmJlZ2luKCksIHRoaXMtPmVuZCgpLCBOZXdFbHRzKTsKKworICAvLyBEZXN0cm95IHRoZSBvcmlnaW5hbCBlbGVtZW50cy4KKyAgZGVzdHJveV9yYW5nZSh0aGlzLT5iZWdpbigpLCB0aGlzLT5lbmQoKSk7CisKKyAgLy8gSWYgdGhpcyB3YXNuJ3QgZ3Jvd24gZnJvbSB0aGUgaW5saW5lIGNvcHksIGRlYWxsb2NhdGUgdGhlIG9sZCBzcGFjZS4KKyAgaWYgKCF0aGlzLT5pc1NtYWxsKCkpCisgICAgZnJlZSh0aGlzLT5iZWdpbigpKTsKKworICB0aGlzLT5zZXRFbmQoTmV3RWx0cytDdXJTaXplKTsKKyAgdGhpcy0+QmVnaW5YID0gTmV3RWx0czsKKyAgdGhpcy0+Q2FwYWNpdHlYID0gdGhpcy0+YmVnaW4oKStOZXdDYXBhY2l0eTsKK30KKworCisvLy8gU21hbGxWZWN0b3JUZW1wbGF0ZUJhc2U8aXNQb2RMaWtlID0gdHJ1ZT4gLSBUaGlzIGlzIHdoZXJlIHdlIHB1dCBtZXRob2QKKy8vLyBpbXBsZW1lbnRhdGlvbnMgdGhhdCBhcmUgZGVzaWduZWQgdG8gd29yayB3aXRoIFBPRC1saWtlIFQncy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgU21hbGxWZWN0b3JUZW1wbGF0ZUJhc2U8VCwgdHJ1ZT4gOiBwdWJsaWMgU21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxUPiB7Citwcm90ZWN0ZWQ6CisgIFNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlKHNpemVfdCBTaXplKSA6IFNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248VD4oU2l6ZSkge30KKworICAvLyBObyBuZWVkIHRvIGRvIGEgZGVzdHJveSBsb29wIGZvciBQT0Qncy4KKyAgc3RhdGljIHZvaWQgZGVzdHJveV9yYW5nZShUICosIFQgKikge30KKworICAvLy8gTW92ZSB0aGUgcmFuZ2UgW0ksIEUpIG9udG8gdGhlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5CisgIC8vLyBzdGFydGluZyB3aXRoICJEZXN0IiwgY29uc3RydWN0aW5nIGVsZW1lbnRzIGludG8gaXQgYXMgbmVlZGVkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdDEsIHR5cGVuYW1lIEl0Mj4KKyAgc3RhdGljIHZvaWQgdW5pbml0aWFsaXplZF9tb3ZlKEl0MSBJLCBJdDEgRSwgSXQyIERlc3QpIHsKKyAgICAvLyBKdXN0IGRvIGEgY29weS4KKyAgICB1bmluaXRpYWxpemVkX2NvcHkoSSwgRSwgRGVzdCk7CisgIH0KKworICAvLy8gQ29weSB0aGUgcmFuZ2UgW0ksIEUpIG9udG8gdGhlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5CisgIC8vLyBzdGFydGluZyB3aXRoICJEZXN0IiwgY29uc3RydWN0aW5nIGVsZW1lbnRzIGludG8gaXQgYXMgbmVlZGVkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdDEsIHR5cGVuYW1lIEl0Mj4KKyAgc3RhdGljIHZvaWQgdW5pbml0aWFsaXplZF9jb3B5KEl0MSBJLCBJdDEgRSwgSXQyIERlc3QpIHsKKyAgICAvLyBBcmJpdHJhcnkgaXRlcmF0b3IgdHlwZXM7IGp1c3QgdXNlIHRoZSBiYXNpYyBpbXBsZW1lbnRhdGlvbi4KKyAgICBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weShJLCBFLCBEZXN0KTsKKyAgfQorCisgIC8vLyBDb3B5IHRoZSByYW5nZSBbSSwgRSkgb250byB0aGUgdW5pbml0aWFsaXplZCBtZW1vcnkKKyAgLy8vIHN0YXJ0aW5nIHdpdGggIkRlc3QiLCBjb25zdHJ1Y3RpbmcgZWxlbWVudHMgaW50byBpdCBhcyBuZWVkZWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgIHN0YXRpYyB2b2lkIHVuaW5pdGlhbGl6ZWRfY29weSgKKyAgICAgIFQxICpJLCBUMSAqRSwgVDIgKkRlc3QsCisgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8dHlwZW5hbWUgc3RkOjpyZW1vdmVfY29uc3Q8VDE+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQyPjo6dmFsdWU+Ojp0eXBlICogPSBudWxscHRyKSB7CisgICAgLy8gVXNlIG1lbWNweSBmb3IgUE9EcyBpdGVyYXRlZCBieSBwb2ludGVycyAod2hpY2ggaW5jbHVkZXMgU21hbGxWZWN0b3IKKyAgICAvLyBpdGVyYXRvcnMpOiBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weSBvcHRpbWl6ZXMgdG8gbWVtbW92ZSwgYnV0IHdlIGNhbgorICAgIC8vIHVzZSBtZW1jcHkgaGVyZS4gTm90ZSB0aGF0IEkgYW5kIEUgYXJlIGl0ZXJhdG9ycyBhbmQgdGh1cyBtaWdodCBiZQorICAgIC8vIGludmFsaWQgZm9yIG1lbWNweSBpZiB0aGV5IGFyZSBlcXVhbC4KKyAgICBpZiAoSSAhPSBFKQorICAgICAgbWVtY3B5KERlc3QsIEksIChFIC0gSSkgKiBzaXplb2YoVCkpOworICB9CisKKyAgLy8vIERvdWJsZSB0aGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSwgZ3VhcmFudGVlaW5nIHNwYWNlIGZvciBhdAorICAvLy8gbGVhc3Qgb25lIG1vcmUgZWxlbWVudCBvciBNaW5TaXplIGlmIHNwZWNpZmllZC4KKyAgdm9pZCBncm93KHNpemVfdCBNaW5TaXplID0gMCkgeworICAgIHRoaXMtPmdyb3dfcG9kKE1pblNpemUqc2l6ZW9mKFQpLCBzaXplb2YoVCkpOworICB9CisKK3B1YmxpYzoKKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgVCAmRWx0KSB7CisgICAgaWYgKExMVk1fVU5MSUtFTFkodGhpcy0+RW5kWCA+PSB0aGlzLT5DYXBhY2l0eVgpKQorICAgICAgdGhpcy0+Z3JvdygpOworICAgIG1lbWNweSh0aGlzLT5lbmQoKSwgJkVsdCwgc2l6ZW9mKFQpKTsKKyAgICB0aGlzLT5zZXRFbmQodGhpcy0+ZW5kKCkrMSk7CisgIH0KKworICB2b2lkIHBvcF9iYWNrKCkgeworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKS0xKTsKKyAgfQorfTsKKworLy8vIFRoaXMgY2xhc3MgY29uc2lzdHMgb2YgY29tbW9uIGNvZGUgZmFjdG9yZWQgb3V0IG9mIHRoZSBTbWFsbFZlY3RvciBjbGFzcyB0bworLy8vIHJlZHVjZSBjb2RlIGR1cGxpY2F0aW9uIGJhc2VkIG9uIHRoZSBTbWFsbFZlY3RvciAnTicgdGVtcGxhdGUgcGFyYW1ldGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBTbWFsbFZlY3RvckltcGwgOiBwdWJsaWMgU21hbGxWZWN0b3JUZW1wbGF0ZUJhc2U8VCwgaXNQb2RMaWtlPFQ+Ojp2YWx1ZT4geworICB1c2luZyBTdXBlckNsYXNzID0gU21hbGxWZWN0b3JUZW1wbGF0ZUJhc2U8VCwgaXNQb2RMaWtlPFQ+Ojp2YWx1ZT47CisKK3B1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBTdXBlckNsYXNzOjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSB0eXBlbmFtZSBTdXBlckNsYXNzOjpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgc2l6ZV90eXBlID0gdHlwZW5hbWUgU3VwZXJDbGFzczo6c2l6ZV90eXBlOworCitwcm90ZWN0ZWQ6CisgIC8vIERlZmF1bHQgY3RvciAtIEluaXRpYWxpemUgdG8gZW1wdHkuCisgIGV4cGxpY2l0IFNtYWxsVmVjdG9ySW1wbCh1bnNpZ25lZCBOKQorICAgIDogU21hbGxWZWN0b3JUZW1wbGF0ZUJhc2U8VCwgaXNQb2RMaWtlPFQ+Ojp2YWx1ZT4oTipzaXplb2YoVCkpIHsKKyAgfQorCitwdWJsaWM6CisgIFNtYWxsVmVjdG9ySW1wbChjb25zdCBTbWFsbFZlY3RvckltcGwgJikgPSBkZWxldGU7CisKKyAgflNtYWxsVmVjdG9ySW1wbCgpIHsKKyAgICAvLyBTdWJjbGFzcyBoYXMgYWxyZWFkeSBkZXN0cnVjdGVkIHRoaXMgdmVjdG9yJ3MgZWxlbWVudHMuCisgICAgLy8gSWYgdGhpcyB3YXNuJ3QgZ3Jvd24gZnJvbSB0aGUgaW5saW5lIGNvcHksIGRlYWxsb2NhdGUgdGhlIG9sZCBzcGFjZS4KKyAgICBpZiAoIXRoaXMtPmlzU21hbGwoKSkKKyAgICAgIGZyZWUodGhpcy0+YmVnaW4oKSk7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UodGhpcy0+YmVnaW4oKSwgdGhpcy0+ZW5kKCkpOworICAgIHRoaXMtPkVuZFggPSB0aGlzLT5CZWdpblg7CisgIH0KKworICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgTikgeworICAgIGlmIChOIDwgdGhpcy0+c2l6ZSgpKSB7CisgICAgICB0aGlzLT5kZXN0cm95X3JhbmdlKHRoaXMtPmJlZ2luKCkrTiwgdGhpcy0+ZW5kKCkpOworICAgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmJlZ2luKCkrTik7CisgICAgfSBlbHNlIGlmIChOID4gdGhpcy0+c2l6ZSgpKSB7CisgICAgICBpZiAodGhpcy0+Y2FwYWNpdHkoKSA8IE4pCisgICAgICAgIHRoaXMtPmdyb3coTik7CisgICAgICBmb3IgKGF1dG8gSSA9IHRoaXMtPmVuZCgpLCBFID0gdGhpcy0+YmVnaW4oKSArIE47IEkgIT0gRTsgKytJKQorICAgICAgICBuZXcgKCYqSSkgVCgpOworICAgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmJlZ2luKCkrTik7CisgICAgfQorICB9CisKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIE4sIGNvbnN0IFQgJk5WKSB7CisgICAgaWYgKE4gPCB0aGlzLT5zaXplKCkpIHsKKyAgICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UodGhpcy0+YmVnaW4oKStOLCB0aGlzLT5lbmQoKSk7CisgICAgICB0aGlzLT5zZXRFbmQodGhpcy0+YmVnaW4oKStOKTsKKyAgICB9IGVsc2UgaWYgKE4gPiB0aGlzLT5zaXplKCkpIHsKKyAgICAgIGlmICh0aGlzLT5jYXBhY2l0eSgpIDwgTikKKyAgICAgICAgdGhpcy0+Z3JvdyhOKTsKKyAgICAgIHN0ZDo6dW5pbml0aWFsaXplZF9maWxsKHRoaXMtPmVuZCgpLCB0aGlzLT5iZWdpbigpK04sIE5WKTsKKyAgICAgIHRoaXMtPnNldEVuZCh0aGlzLT5iZWdpbigpK04pOworICAgIH0KKyAgfQorCisgIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgTikgeworICAgIGlmICh0aGlzLT5jYXBhY2l0eSgpIDwgTikKKyAgICAgIHRoaXMtPmdyb3coTik7CisgIH0KKworICBMTFZNX05PRElTQ0FSRCBUIHBvcF9iYWNrX3ZhbCgpIHsKKyAgICBUIFJlc3VsdCA9IDo6c3RkOjptb3ZlKHRoaXMtPmJhY2soKSk7CisgICAgdGhpcy0+cG9wX2JhY2soKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgdm9pZCBzd2FwKFNtYWxsVmVjdG9ySW1wbCAmUkhTKTsKKworICAvLy8gQWRkIHRoZSBzcGVjaWZpZWQgcmFuZ2UgdG8gdGhlIGVuZCBvZiB0aGUgU21hbGxWZWN0b3IuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBpbl9pdGVyLAorICAgICAgICAgICAgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPGluX2l0ZXI+OjppdGVyYXRvcl9jYXRlZ29yeSwKKyAgICAgICAgICAgICAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZz46OnZhbHVlPjo6dHlwZT4KKyAgdm9pZCBhcHBlbmQoaW5faXRlciBpbl9zdGFydCwgaW5faXRlciBpbl9lbmQpIHsKKyAgICBzaXplX3R5cGUgTnVtSW5wdXRzID0gc3RkOjpkaXN0YW5jZShpbl9zdGFydCwgaW5fZW5kKTsKKyAgICAvLyBHcm93IGFsbG9jYXRlZCBzcGFjZSBpZiBuZWVkZWQuCisgICAgaWYgKE51bUlucHV0cyA+IHNpemVfdHlwZSh0aGlzLT5jYXBhY2l0eV9wdHIoKS10aGlzLT5lbmQoKSkpCisgICAgICB0aGlzLT5ncm93KHRoaXMtPnNpemUoKStOdW1JbnB1dHMpOworCisgICAgLy8gQ29weSB0aGUgbmV3IGVsZW1lbnRzIG92ZXIuCisgICAgdGhpcy0+dW5pbml0aWFsaXplZF9jb3B5KGluX3N0YXJ0LCBpbl9lbmQsIHRoaXMtPmVuZCgpKTsKKyAgICB0aGlzLT5zZXRFbmQodGhpcy0+ZW5kKCkgKyBOdW1JbnB1dHMpOworICB9CisKKyAgLy8vIEFkZCB0aGUgc3BlY2lmaWVkIHJhbmdlIHRvIHRoZSBlbmQgb2YgdGhlIFNtYWxsVmVjdG9yLgorICB2b2lkIGFwcGVuZChzaXplX3R5cGUgTnVtSW5wdXRzLCBjb25zdCBUICZFbHQpIHsKKyAgICAvLyBHcm93IGFsbG9jYXRlZCBzcGFjZSBpZiBuZWVkZWQuCisgICAgaWYgKE51bUlucHV0cyA+IHNpemVfdHlwZSh0aGlzLT5jYXBhY2l0eV9wdHIoKS10aGlzLT5lbmQoKSkpCisgICAgICB0aGlzLT5ncm93KHRoaXMtPnNpemUoKStOdW1JbnB1dHMpOworCisgICAgLy8gQ29weSB0aGUgbmV3IGVsZW1lbnRzIG92ZXIuCisgICAgc3RkOjp1bmluaXRpYWxpemVkX2ZpbGxfbih0aGlzLT5lbmQoKSwgTnVtSW5wdXRzLCBFbHQpOworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSArIE51bUlucHV0cyk7CisgIH0KKworICB2b2lkIGFwcGVuZChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gSUwpIHsKKyAgICBhcHBlbmQoSUwuYmVnaW4oKSwgSUwuZW5kKCkpOworICB9CisKKyAgLy8gRklYTUU6IENvbnNpZGVyIGFzc2lnbmluZyBvdmVyIGV4aXN0aW5nIGVsZW1lbnRzLCByYXRoZXIgdGhhbiBjbGVhcmluZyAmCisgIC8vIHJlLWluaXRpYWxpemluZyB0aGVtIC0gZm9yIGFsbCBhc3NpZ24oLi4uKSB2YXJpYW50cy4KKworICB2b2lkIGFzc2lnbihzaXplX3R5cGUgTnVtRWx0cywgY29uc3QgVCAmRWx0KSB7CisgICAgY2xlYXIoKTsKKyAgICBpZiAodGhpcy0+Y2FwYWNpdHkoKSA8IE51bUVsdHMpCisgICAgICB0aGlzLT5ncm93KE51bUVsdHMpOworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5iZWdpbigpK051bUVsdHMpOworICAgIHN0ZDo6dW5pbml0aWFsaXplZF9maWxsKHRoaXMtPmJlZ2luKCksIHRoaXMtPmVuZCgpLCBFbHQpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGluX2l0ZXIsCisgICAgICAgICAgICB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8aW5faXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5LAorICAgICAgICAgICAgICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnPjo6dmFsdWU+Ojp0eXBlPgorICB2b2lkIGFzc2lnbihpbl9pdGVyIGluX3N0YXJ0LCBpbl9pdGVyIGluX2VuZCkgeworICAgIGNsZWFyKCk7CisgICAgYXBwZW5kKGluX3N0YXJ0LCBpbl9lbmQpOworICB9CisKKyAgdm9pZCBhc3NpZ24oc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IElMKSB7CisgICAgY2xlYXIoKTsKKyAgICBhcHBlbmQoSUwpOworICB9CisKKyAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgQ0kpIHsKKyAgICAvLyBKdXN0IGNhc3QgYXdheSBjb25zdG5lc3MgYmVjYXVzZSB0aGlzIGlzIGEgbm9uLWNvbnN0IG1lbWJlciBmdW5jdGlvbi4KKyAgICBpdGVyYXRvciBJID0gY29uc3RfY2FzdDxpdGVyYXRvcj4oQ0kpOworCisgICAgYXNzZXJ0KEkgPj0gdGhpcy0+YmVnaW4oKSAmJiAiSXRlcmF0b3IgdG8gZXJhc2UgaXMgb3V0IG9mIGJvdW5kcy4iKTsKKyAgICBhc3NlcnQoSSA8IHRoaXMtPmVuZCgpICYmICJFcmFzaW5nIGF0IHBhc3QtdGhlLWVuZCBpdGVyYXRvci4iKTsKKworICAgIGl0ZXJhdG9yIE4gPSBJOworICAgIC8vIFNoaWZ0IGFsbCBlbHRzIGRvd24gb25lLgorICAgIHN0ZDo6bW92ZShJKzEsIHRoaXMtPmVuZCgpLCBJKTsKKyAgICAvLyBEcm9wIHRoZSBsYXN0IGVsdC4KKyAgICB0aGlzLT5wb3BfYmFjaygpOworICAgIHJldHVybihOKTsKKyAgfQorCisgIGl0ZXJhdG9yIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIENTLCBjb25zdF9pdGVyYXRvciBDRSkgeworICAgIC8vIEp1c3QgY2FzdCBhd2F5IGNvbnN0bmVzcyBiZWNhdXNlIHRoaXMgaXMgYSBub24tY29uc3QgbWVtYmVyIGZ1bmN0aW9uLgorICAgIGl0ZXJhdG9yIFMgPSBjb25zdF9jYXN0PGl0ZXJhdG9yPihDUyk7CisgICAgaXRlcmF0b3IgRSA9IGNvbnN0X2Nhc3Q8aXRlcmF0b3I+KENFKTsKKworICAgIGFzc2VydChTID49IHRoaXMtPmJlZ2luKCkgJiYgIlJhbmdlIHRvIGVyYXNlIGlzIG91dCBvZiBib3VuZHMuIik7CisgICAgYXNzZXJ0KFMgPD0gRSAmJiAiVHJ5aW5nIHRvIGVyYXNlIGludmFsaWQgcmFuZ2UuIik7CisgICAgYXNzZXJ0KEUgPD0gdGhpcy0+ZW5kKCkgJiYgIlRyeWluZyB0byBlcmFzZSBwYXN0IHRoZSBlbmQuIik7CisKKyAgICBpdGVyYXRvciBOID0gUzsKKyAgICAvLyBTaGlmdCBhbGwgZWx0cyBkb3duLgorICAgIGl0ZXJhdG9yIEkgPSBzdGQ6Om1vdmUoRSwgdGhpcy0+ZW5kKCksIFMpOworICAgIC8vIERyb3AgdGhlIGxhc3QgZWx0cy4KKyAgICB0aGlzLT5kZXN0cm95X3JhbmdlKEksIHRoaXMtPmVuZCgpKTsKKyAgICB0aGlzLT5zZXRFbmQoSSk7CisgICAgcmV0dXJuKE4pOworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIEksIFQgJiZFbHQpIHsKKyAgICBpZiAoSSA9PSB0aGlzLT5lbmQoKSkgeyAgLy8gSW1wb3J0YW50IHNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgdmVjdG9yLgorICAgICAgdGhpcy0+cHVzaF9iYWNrKDo6c3RkOjptb3ZlKEVsdCkpOworICAgICAgcmV0dXJuIHRoaXMtPmVuZCgpLTE7CisgICAgfQorCisgICAgYXNzZXJ0KEkgPj0gdGhpcy0+YmVnaW4oKSAmJiAiSW5zZXJ0aW9uIGl0ZXJhdG9yIGlzIG91dCBvZiBib3VuZHMuIik7CisgICAgYXNzZXJ0KEkgPD0gdGhpcy0+ZW5kKCkgJiYgIkluc2VydGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIHZlY3Rvci4iKTsKKworICAgIGlmICh0aGlzLT5FbmRYID49IHRoaXMtPkNhcGFjaXR5WCkgeworICAgICAgc2l6ZV90IEVsdE5vID0gSS10aGlzLT5iZWdpbigpOworICAgICAgdGhpcy0+Z3JvdygpOworICAgICAgSSA9IHRoaXMtPmJlZ2luKCkrRWx0Tm87CisgICAgfQorCisgICAgOjpuZXcgKCh2b2lkKikgdGhpcy0+ZW5kKCkpIFQoOjpzdGQ6Om1vdmUodGhpcy0+YmFjaygpKSk7CisgICAgLy8gUHVzaCBldmVyeXRoaW5nIGVsc2Ugb3Zlci4KKyAgICBzdGQ6Om1vdmVfYmFja3dhcmQoSSwgdGhpcy0+ZW5kKCktMSwgdGhpcy0+ZW5kKCkpOworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSsxKTsKKworICAgIC8vIElmIHdlIGp1c3QgbW92ZWQgdGhlIGVsZW1lbnQgd2UncmUgaW5zZXJ0aW5nLCBiZSBzdXJlIHRvIHVwZGF0ZQorICAgIC8vIHRoZSByZWZlcmVuY2UuCisgICAgVCAqRWx0UHRyID0gJkVsdDsKKyAgICBpZiAoSSA8PSBFbHRQdHIgJiYgRWx0UHRyIDwgdGhpcy0+RW5kWCkKKyAgICAgICsrRWx0UHRyOworCisgICAgKkkgPSA6OnN0ZDo6bW92ZSgqRWx0UHRyKTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBJLCBjb25zdCBUICZFbHQpIHsKKyAgICBpZiAoSSA9PSB0aGlzLT5lbmQoKSkgeyAgLy8gSW1wb3J0YW50IHNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgdmVjdG9yLgorICAgICAgdGhpcy0+cHVzaF9iYWNrKEVsdCk7CisgICAgICByZXR1cm4gdGhpcy0+ZW5kKCktMTsKKyAgICB9CisKKyAgICBhc3NlcnQoSSA+PSB0aGlzLT5iZWdpbigpICYmICJJbnNlcnRpb24gaXRlcmF0b3IgaXMgb3V0IG9mIGJvdW5kcy4iKTsKKyAgICBhc3NlcnQoSSA8PSB0aGlzLT5lbmQoKSAmJiAiSW5zZXJ0aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgdmVjdG9yLiIpOworCisgICAgaWYgKHRoaXMtPkVuZFggPj0gdGhpcy0+Q2FwYWNpdHlYKSB7CisgICAgICBzaXplX3QgRWx0Tm8gPSBJLXRoaXMtPmJlZ2luKCk7CisgICAgICB0aGlzLT5ncm93KCk7CisgICAgICBJID0gdGhpcy0+YmVnaW4oKStFbHRObzsKKyAgICB9CisgICAgOjpuZXcgKCh2b2lkKikgdGhpcy0+ZW5kKCkpIFQoc3RkOjptb3ZlKHRoaXMtPmJhY2soKSkpOworICAgIC8vIFB1c2ggZXZlcnl0aGluZyBlbHNlIG92ZXIuCisgICAgc3RkOjptb3ZlX2JhY2t3YXJkKEksIHRoaXMtPmVuZCgpLTEsIHRoaXMtPmVuZCgpKTsKKyAgICB0aGlzLT5zZXRFbmQodGhpcy0+ZW5kKCkrMSk7CisKKyAgICAvLyBJZiB3ZSBqdXN0IG1vdmVkIHRoZSBlbGVtZW50IHdlJ3JlIGluc2VydGluZywgYmUgc3VyZSB0byB1cGRhdGUKKyAgICAvLyB0aGUgcmVmZXJlbmNlLgorICAgIGNvbnN0IFQgKkVsdFB0ciA9ICZFbHQ7CisgICAgaWYgKEkgPD0gRWx0UHRyICYmIEVsdFB0ciA8IHRoaXMtPkVuZFgpCisgICAgICArK0VsdFB0cjsKKworICAgICpJID0gKkVsdFB0cjsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBJLCBzaXplX3R5cGUgTnVtVG9JbnNlcnQsIGNvbnN0IFQgJkVsdCkgeworICAgIC8vIENvbnZlcnQgaXRlcmF0b3IgdG8gZWx0IyB0byBhdm9pZCBpbnZhbGlkYXRpbmcgaXRlcmF0b3Igd2hlbiB3ZSByZXNlcnZlKCkKKyAgICBzaXplX3QgSW5zZXJ0RWx0ID0gSSAtIHRoaXMtPmJlZ2luKCk7CisKKyAgICBpZiAoSSA9PSB0aGlzLT5lbmQoKSkgeyAgLy8gSW1wb3J0YW50IHNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgdmVjdG9yLgorICAgICAgYXBwZW5kKE51bVRvSW5zZXJ0LCBFbHQpOworICAgICAgcmV0dXJuIHRoaXMtPmJlZ2luKCkrSW5zZXJ0RWx0OworICAgIH0KKworICAgIGFzc2VydChJID49IHRoaXMtPmJlZ2luKCkgJiYgIkluc2VydGlvbiBpdGVyYXRvciBpcyBvdXQgb2YgYm91bmRzLiIpOworICAgIGFzc2VydChJIDw9IHRoaXMtPmVuZCgpICYmICJJbnNlcnRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSB2ZWN0b3IuIik7CisKKyAgICAvLyBFbnN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlLgorICAgIHJlc2VydmUodGhpcy0+c2l6ZSgpICsgTnVtVG9JbnNlcnQpOworCisgICAgLy8gVW5pbnZhbGlkYXRlIHRoZSBpdGVyYXRvci4KKyAgICBJID0gdGhpcy0+YmVnaW4oKStJbnNlcnRFbHQ7CisKKyAgICAvLyBJZiB0aGVyZSBhcmUgbW9yZSBlbGVtZW50cyBiZXR3ZWVuIHRoZSBpbnNlcnRpb24gcG9pbnQgYW5kIHRoZSBlbmQgb2YgdGhlCisgICAgLy8gcmFuZ2UgdGhhbiB0aGVyZSBhcmUgYmVpbmcgaW5zZXJ0ZWQsIHdlIGNhbiB1c2UgYSBzaW1wbGUgYXBwcm9hY2ggdG8KKyAgICAvLyBpbnNlcnRpb24uICBTaW5jZSB3ZSBhbHJlYWR5IHJlc2VydmVkIHNwYWNlLCB3ZSBrbm93IHRoYXQgdGhpcyB3b24ndAorICAgIC8vIHJlYWxsb2NhdGUgdGhlIHZlY3Rvci4KKyAgICBpZiAoc2l6ZV90KHRoaXMtPmVuZCgpLUkpID49IE51bVRvSW5zZXJ0KSB7CisgICAgICBUICpPbGRFbmQgPSB0aGlzLT5lbmQoKTsKKyAgICAgIGFwcGVuZChzdGQ6Om1vdmVfaXRlcmF0b3I8aXRlcmF0b3I+KHRoaXMtPmVuZCgpIC0gTnVtVG9JbnNlcnQpLAorICAgICAgICAgICAgIHN0ZDo6bW92ZV9pdGVyYXRvcjxpdGVyYXRvcj4odGhpcy0+ZW5kKCkpKTsKKworICAgICAgLy8gQ29weSB0aGUgZXhpc3RpbmcgZWxlbWVudHMgdGhhdCBnZXQgcmVwbGFjZWQuCisgICAgICBzdGQ6Om1vdmVfYmFja3dhcmQoSSwgT2xkRW5kLU51bVRvSW5zZXJ0LCBPbGRFbmQpOworCisgICAgICBzdGQ6OmZpbGxfbihJLCBOdW1Ub0luc2VydCwgRWx0KTsKKyAgICAgIHJldHVybiBJOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSwgd2UncmUgaW5zZXJ0aW5nIG1vcmUgZWxlbWVudHMgdGhhbiBleGlzdCBhbHJlYWR5LCBhbmQgd2UncmUKKyAgICAvLyBub3QgaW5zZXJ0aW5nIGF0IHRoZSBlbmQuCisKKyAgICAvLyBNb3ZlIG92ZXIgdGhlIGVsZW1lbnRzIHRoYXQgd2UncmUgYWJvdXQgdG8gb3ZlcndyaXRlLgorICAgIFQgKk9sZEVuZCA9IHRoaXMtPmVuZCgpOworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSArIE51bVRvSW5zZXJ0KTsKKyAgICBzaXplX3QgTnVtT3ZlcndyaXR0ZW4gPSBPbGRFbmQtSTsKKyAgICB0aGlzLT51bmluaXRpYWxpemVkX21vdmUoSSwgT2xkRW5kLCB0aGlzLT5lbmQoKS1OdW1PdmVyd3JpdHRlbik7CisKKyAgICAvLyBSZXBsYWNlIHRoZSBvdmVyd3JpdHRlbiBwYXJ0LgorICAgIHN0ZDo6ZmlsbF9uKEksIE51bU92ZXJ3cml0dGVuLCBFbHQpOworCisgICAgLy8gSW5zZXJ0IHRoZSBub24tb3ZlcndyaXR0ZW4gbWlkZGxlIHBhcnQuCisgICAgc3RkOjp1bmluaXRpYWxpemVkX2ZpbGxfbihPbGRFbmQsIE51bVRvSW5zZXJ0LU51bU92ZXJ3cml0dGVuLCBFbHQpOworICAgIHJldHVybiBJOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0VHksCisgICAgICAgICAgICB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SXRUeT46Oml0ZXJhdG9yX2NhdGVnb3J5LAorICAgICAgICAgICAgICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnPjo6dmFsdWU+Ojp0eXBlPgorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgSSwgSXRUeSBGcm9tLCBJdFR5IFRvKSB7CisgICAgLy8gQ29udmVydCBpdGVyYXRvciB0byBlbHQjIHRvIGF2b2lkIGludmFsaWRhdGluZyBpdGVyYXRvciB3aGVuIHdlIHJlc2VydmUoKQorICAgIHNpemVfdCBJbnNlcnRFbHQgPSBJIC0gdGhpcy0+YmVnaW4oKTsKKworICAgIGlmIChJID09IHRoaXMtPmVuZCgpKSB7ICAvLyBJbXBvcnRhbnQgc3BlY2lhbCBjYXNlIGZvciBlbXB0eSB2ZWN0b3IuCisgICAgICBhcHBlbmQoRnJvbSwgVG8pOworICAgICAgcmV0dXJuIHRoaXMtPmJlZ2luKCkrSW5zZXJ0RWx0OworICAgIH0KKworICAgIGFzc2VydChJID49IHRoaXMtPmJlZ2luKCkgJiYgIkluc2VydGlvbiBpdGVyYXRvciBpcyBvdXQgb2YgYm91bmRzLiIpOworICAgIGFzc2VydChJIDw9IHRoaXMtPmVuZCgpICYmICJJbnNlcnRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSB2ZWN0b3IuIik7CisKKyAgICBzaXplX3QgTnVtVG9JbnNlcnQgPSBzdGQ6OmRpc3RhbmNlKEZyb20sIFRvKTsKKworICAgIC8vIEVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UuCisgICAgcmVzZXJ2ZSh0aGlzLT5zaXplKCkgKyBOdW1Ub0luc2VydCk7CisKKyAgICAvLyBVbmludmFsaWRhdGUgdGhlIGl0ZXJhdG9yLgorICAgIEkgPSB0aGlzLT5iZWdpbigpK0luc2VydEVsdDsKKworICAgIC8vIElmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIGJldHdlZW4gdGhlIGluc2VydGlvbiBwb2ludCBhbmQgdGhlIGVuZCBvZiB0aGUKKyAgICAvLyByYW5nZSB0aGFuIHRoZXJlIGFyZSBiZWluZyBpbnNlcnRlZCwgd2UgY2FuIHVzZSBhIHNpbXBsZSBhcHByb2FjaCB0bworICAgIC8vIGluc2VydGlvbi4gIFNpbmNlIHdlIGFscmVhZHkgcmVzZXJ2ZWQgc3BhY2UsIHdlIGtub3cgdGhhdCB0aGlzIHdvbid0CisgICAgLy8gcmVhbGxvY2F0ZSB0aGUgdmVjdG9yLgorICAgIGlmIChzaXplX3QodGhpcy0+ZW5kKCktSSkgPj0gTnVtVG9JbnNlcnQpIHsKKyAgICAgIFQgKk9sZEVuZCA9IHRoaXMtPmVuZCgpOworICAgICAgYXBwZW5kKHN0ZDo6bW92ZV9pdGVyYXRvcjxpdGVyYXRvcj4odGhpcy0+ZW5kKCkgLSBOdW1Ub0luc2VydCksCisgICAgICAgICAgICAgc3RkOjptb3ZlX2l0ZXJhdG9yPGl0ZXJhdG9yPih0aGlzLT5lbmQoKSkpOworCisgICAgICAvLyBDb3B5IHRoZSBleGlzdGluZyBlbGVtZW50cyB0aGF0IGdldCByZXBsYWNlZC4KKyAgICAgIHN0ZDo6bW92ZV9iYWNrd2FyZChJLCBPbGRFbmQtTnVtVG9JbnNlcnQsIE9sZEVuZCk7CisKKyAgICAgIHN0ZDo6Y29weShGcm9tLCBUbywgSSk7CisgICAgICByZXR1cm4gSTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIHdlJ3JlIGluc2VydGluZyBtb3JlIGVsZW1lbnRzIHRoYW4gZXhpc3QgYWxyZWFkeSwgYW5kIHdlJ3JlCisgICAgLy8gbm90IGluc2VydGluZyBhdCB0aGUgZW5kLgorCisgICAgLy8gTW92ZSBvdmVyIHRoZSBlbGVtZW50cyB0aGF0IHdlJ3JlIGFib3V0IHRvIG92ZXJ3cml0ZS4KKyAgICBUICpPbGRFbmQgPSB0aGlzLT5lbmQoKTsKKyAgICB0aGlzLT5zZXRFbmQodGhpcy0+ZW5kKCkgKyBOdW1Ub0luc2VydCk7CisgICAgc2l6ZV90IE51bU92ZXJ3cml0dGVuID0gT2xkRW5kLUk7CisgICAgdGhpcy0+dW5pbml0aWFsaXplZF9tb3ZlKEksIE9sZEVuZCwgdGhpcy0+ZW5kKCktTnVtT3ZlcndyaXR0ZW4pOworCisgICAgLy8gUmVwbGFjZSB0aGUgb3ZlcndyaXR0ZW4gcGFydC4KKyAgICBmb3IgKFQgKkogPSBJOyBOdW1PdmVyd3JpdHRlbiA+IDA7IC0tTnVtT3ZlcndyaXR0ZW4pIHsKKyAgICAgICpKID0gKkZyb207CisgICAgICArK0o7ICsrRnJvbTsKKyAgICB9CisKKyAgICAvLyBJbnNlcnQgdGhlIG5vbi1vdmVyd3JpdHRlbiBtaWRkbGUgcGFydC4KKyAgICB0aGlzLT51bmluaXRpYWxpemVkX2NvcHkoRnJvbSwgVG8sIE9sZEVuZCk7CisgICAgcmV0dXJuIEk7CisgIH0KKworICB2b2lkIGluc2VydChpdGVyYXRvciBJLCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gSUwpIHsKKyAgICBpbnNlcnQoSSwgSUwuYmVnaW4oKSwgSUwuZW5kKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ1R5cGVzPiB2b2lkIGVtcGxhY2VfYmFjayhBcmdUeXBlcyAmJi4uLiBBcmdzKSB7CisgICAgaWYgKExMVk1fVU5MSUtFTFkodGhpcy0+RW5kWCA+PSB0aGlzLT5DYXBhY2l0eVgpKQorICAgICAgdGhpcy0+Z3JvdygpOworICAgIDo6bmV3ICgodm9pZCAqKXRoaXMtPmVuZCgpKSBUKHN0ZDo6Zm9yd2FyZDxBcmdUeXBlcz4oQXJncykuLi4pOworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSArIDEpOworICB9CisKKyAgU21hbGxWZWN0b3JJbXBsICZvcGVyYXRvcj0oY29uc3QgU21hbGxWZWN0b3JJbXBsICZSSFMpOworCisgIFNtYWxsVmVjdG9ySW1wbCAmb3BlcmF0b3I9KFNtYWxsVmVjdG9ySW1wbCAmJlJIUyk7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNtYWxsVmVjdG9ySW1wbCAmUkhTKSBjb25zdCB7CisgICAgaWYgKHRoaXMtPnNpemUoKSAhPSBSSFMuc2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHN0ZDo6ZXF1YWwodGhpcy0+YmVnaW4oKSwgdGhpcy0+ZW5kKCksIFJIUy5iZWdpbigpKTsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgU21hbGxWZWN0b3JJbXBsICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBSSFMpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU21hbGxWZWN0b3JJbXBsICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSh0aGlzLT5iZWdpbigpLCB0aGlzLT5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFMuYmVnaW4oKSwgUkhTLmVuZCgpKTsKKyAgfQorCisgIC8vLyBTZXQgdGhlIGFycmF5IHNpemUgdG8gXHAgTiwgd2hpY2ggdGhlIGN1cnJlbnQgYXJyYXkgbXVzdCBoYXZlIGVub3VnaAorICAvLy8gY2FwYWNpdHkgZm9yLgorICAvLy8KKyAgLy8vIFRoaXMgZG9lcyBub3QgY29uc3RydWN0IG9yIGRlc3Ryb3kgYW55IGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuCisgIC8vLworICAvLy8gQ2xpZW50cyBjYW4gdXNlIHRoaXMgaW4gY29uanVuY3Rpb24gd2l0aCBjYXBhY2l0eSgpIHRvIHdyaXRlIHBhc3QgdGhlIGVuZAorICAvLy8gb2YgdGhlIGJ1ZmZlciB3aGVuIHRoZXkga25vdyB0aGF0IG1vcmUgZWxlbWVudHMgYXJlIGF2YWlsYWJsZSwgYW5kIG9ubHkKKyAgLy8vIHVwZGF0ZSB0aGUgc2l6ZSBsYXRlci4gVGhpcyBhdm9pZHMgdGhlIGNvc3Qgb2YgdmFsdWUgaW5pdGlhbGl6aW5nIGVsZW1lbnRzCisgIC8vLyB3aGljaCB3aWxsIG9ubHkgYmUgb3ZlcndyaXR0ZW4uCisgIHZvaWQgc2V0X3NpemUoc2l6ZV90eXBlIE4pIHsKKyAgICBhc3NlcnQoTiA8PSB0aGlzLT5jYXBhY2l0eSgpKTsKKyAgICB0aGlzLT5zZXRFbmQodGhpcy0+YmVnaW4oKSArIE4pOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgU21hbGxWZWN0b3JJbXBsPFQ+Ojpzd2FwKFNtYWxsVmVjdG9ySW1wbDxUPiAmUkhTKSB7CisgIGlmICh0aGlzID09ICZSSFMpIHJldHVybjsKKworICAvLyBXZSBjYW4gb25seSBhdm9pZCBjb3B5aW5nIGVsZW1lbnRzIGlmIG5laXRoZXIgdmVjdG9yIGlzIHNtYWxsLgorICBpZiAoIXRoaXMtPmlzU21hbGwoKSAmJiAhUkhTLmlzU21hbGwoKSkgeworICAgIHN0ZDo6c3dhcCh0aGlzLT5CZWdpblgsIFJIUy5CZWdpblgpOworICAgIHN0ZDo6c3dhcCh0aGlzLT5FbmRYLCBSSFMuRW5kWCk7CisgICAgc3RkOjpzd2FwKHRoaXMtPkNhcGFjaXR5WCwgUkhTLkNhcGFjaXR5WCk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChSSFMuc2l6ZSgpID4gdGhpcy0+Y2FwYWNpdHkoKSkKKyAgICB0aGlzLT5ncm93KFJIUy5zaXplKCkpOworICBpZiAodGhpcy0+c2l6ZSgpID4gUkhTLmNhcGFjaXR5KCkpCisgICAgUkhTLmdyb3codGhpcy0+c2l6ZSgpKTsKKworICAvLyBTd2FwIHRoZSBzaGFyZWQgZWxlbWVudHMuCisgIHNpemVfdCBOdW1TaGFyZWQgPSB0aGlzLT5zaXplKCk7CisgIGlmIChOdW1TaGFyZWQgPiBSSFMuc2l6ZSgpKSBOdW1TaGFyZWQgPSBSSFMuc2l6ZSgpOworICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSAhPSBOdW1TaGFyZWQ7ICsraSkKKyAgICBzdGQ6OnN3YXAoKCp0aGlzKVtpXSwgUkhTW2ldKTsKKworICAvLyBDb3B5IG92ZXIgdGhlIGV4dHJhIGVsdHMuCisgIGlmICh0aGlzLT5zaXplKCkgPiBSSFMuc2l6ZSgpKSB7CisgICAgc2l6ZV90IEVsdERpZmYgPSB0aGlzLT5zaXplKCkgLSBSSFMuc2l6ZSgpOworICAgIHRoaXMtPnVuaW5pdGlhbGl6ZWRfY29weSh0aGlzLT5iZWdpbigpK051bVNoYXJlZCwgdGhpcy0+ZW5kKCksIFJIUy5lbmQoKSk7CisgICAgUkhTLnNldEVuZChSSFMuZW5kKCkrRWx0RGlmZik7CisgICAgdGhpcy0+ZGVzdHJveV9yYW5nZSh0aGlzLT5iZWdpbigpK051bVNoYXJlZCwgdGhpcy0+ZW5kKCkpOworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5iZWdpbigpK051bVNoYXJlZCk7CisgIH0gZWxzZSBpZiAoUkhTLnNpemUoKSA+IHRoaXMtPnNpemUoKSkgeworICAgIHNpemVfdCBFbHREaWZmID0gUkhTLnNpemUoKSAtIHRoaXMtPnNpemUoKTsKKyAgICB0aGlzLT51bmluaXRpYWxpemVkX2NvcHkoUkhTLmJlZ2luKCkrTnVtU2hhcmVkLCBSSFMuZW5kKCksIHRoaXMtPmVuZCgpKTsKKyAgICB0aGlzLT5zZXRFbmQodGhpcy0+ZW5kKCkgKyBFbHREaWZmKTsKKyAgICB0aGlzLT5kZXN0cm95X3JhbmdlKFJIUy5iZWdpbigpK051bVNoYXJlZCwgUkhTLmVuZCgpKTsKKyAgICBSSFMuc2V0RW5kKFJIUy5iZWdpbigpK051bVNoYXJlZCk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitTbWFsbFZlY3RvckltcGw8VD4gJlNtYWxsVmVjdG9ySW1wbDxUPjo6CisgIG9wZXJhdG9yPShjb25zdCBTbWFsbFZlY3RvckltcGw8VD4gJlJIUykgeworICAvLyBBdm9pZCBzZWxmLWFzc2lnbm1lbnQuCisgIGlmICh0aGlzID09ICZSSFMpIHJldHVybiAqdGhpczsKKworICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgc3VmZmljaWVudCBzcGFjZSwgYXNzaWduIHRoZSBjb21tb24gZWxlbWVudHMsIHRoZW4KKyAgLy8gZGVzdHJveSBhbnkgZXhjZXNzLgorICBzaXplX3QgUkhTU2l6ZSA9IFJIUy5zaXplKCk7CisgIHNpemVfdCBDdXJTaXplID0gdGhpcy0+c2l6ZSgpOworICBpZiAoQ3VyU2l6ZSA+PSBSSFNTaXplKSB7CisgICAgLy8gQXNzaWduIGNvbW1vbiBlbGVtZW50cy4KKyAgICBpdGVyYXRvciBOZXdFbmQ7CisgICAgaWYgKFJIU1NpemUpCisgICAgICBOZXdFbmQgPSBzdGQ6OmNvcHkoUkhTLmJlZ2luKCksIFJIUy5iZWdpbigpK1JIU1NpemUsIHRoaXMtPmJlZ2luKCkpOworICAgIGVsc2UKKyAgICAgIE5ld0VuZCA9IHRoaXMtPmJlZ2luKCk7CisKKyAgICAvLyBEZXN0cm95IGV4Y2VzcyBlbGVtZW50cy4KKyAgICB0aGlzLT5kZXN0cm95X3JhbmdlKE5ld0VuZCwgdGhpcy0+ZW5kKCkpOworCisgICAgLy8gVHJpbS4KKyAgICB0aGlzLT5zZXRFbmQoTmV3RW5kKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBJZiB3ZSBoYXZlIHRvIGdyb3cgdG8gaGF2ZSBlbm91Z2ggZWxlbWVudHMsIGRlc3Ryb3kgdGhlIGN1cnJlbnQgZWxlbWVudHMuCisgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIGF2b2lkIGNvcHlpbmcgdGhlbSBkdXJpbmcgdGhlIGdyb3cuCisgIC8vIEZJWE1FOiBkb24ndCBkbyB0aGlzIGlmIHRoZXkncmUgZWZmaWNpZW50bHkgbW92ZWFibGUuCisgIGlmICh0aGlzLT5jYXBhY2l0eSgpIDwgUkhTU2l6ZSkgeworICAgIC8vIERlc3Ryb3kgY3VycmVudCBlbGVtZW50cy4KKyAgICB0aGlzLT5kZXN0cm95X3JhbmdlKHRoaXMtPmJlZ2luKCksIHRoaXMtPmVuZCgpKTsKKyAgICB0aGlzLT5zZXRFbmQodGhpcy0+YmVnaW4oKSk7CisgICAgQ3VyU2l6ZSA9IDA7CisgICAgdGhpcy0+Z3JvdyhSSFNTaXplKTsKKyAgfSBlbHNlIGlmIChDdXJTaXplKSB7CisgICAgLy8gT3RoZXJ3aXNlLCB1c2UgYXNzaWdubWVudCBmb3IgdGhlIGFscmVhZHktY29uc3RydWN0ZWQgZWxlbWVudHMuCisgICAgc3RkOjpjb3B5KFJIUy5iZWdpbigpLCBSSFMuYmVnaW4oKStDdXJTaXplLCB0aGlzLT5iZWdpbigpKTsKKyAgfQorCisgIC8vIENvcHkgY29uc3RydWN0IHRoZSBuZXcgZWxlbWVudHMgaW4gcGxhY2UuCisgIHRoaXMtPnVuaW5pdGlhbGl6ZWRfY29weShSSFMuYmVnaW4oKStDdXJTaXplLCBSSFMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5iZWdpbigpK0N1clNpemUpOworCisgIC8vIFNldCBlbmQuCisgIHRoaXMtPnNldEVuZCh0aGlzLT5iZWdpbigpK1JIU1NpemUpOworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorU21hbGxWZWN0b3JJbXBsPFQ+ICZTbWFsbFZlY3RvckltcGw8VD46Om9wZXJhdG9yPShTbWFsbFZlY3RvckltcGw8VD4gJiZSSFMpIHsKKyAgLy8gQXZvaWQgc2VsZi1hc3NpZ25tZW50LgorICBpZiAodGhpcyA9PSAmUkhTKSByZXR1cm4gKnRoaXM7CisKKyAgLy8gSWYgdGhlIFJIUyBpc24ndCBzbWFsbCwgY2xlYXIgdGhpcyB2ZWN0b3IgYW5kIHRoZW4gc3RlYWwgaXRzIGJ1ZmZlci4KKyAgaWYgKCFSSFMuaXNTbWFsbCgpKSB7CisgICAgdGhpcy0+ZGVzdHJveV9yYW5nZSh0aGlzLT5iZWdpbigpLCB0aGlzLT5lbmQoKSk7CisgICAgaWYgKCF0aGlzLT5pc1NtYWxsKCkpIGZyZWUodGhpcy0+YmVnaW4oKSk7CisgICAgdGhpcy0+QmVnaW5YID0gUkhTLkJlZ2luWDsKKyAgICB0aGlzLT5FbmRYID0gUkhTLkVuZFg7CisgICAgdGhpcy0+Q2FwYWNpdHlYID0gUkhTLkNhcGFjaXR5WDsKKyAgICBSSFMucmVzZXRUb1NtYWxsKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIHN1ZmZpY2llbnQgc3BhY2UsIGFzc2lnbiB0aGUgY29tbW9uIGVsZW1lbnRzLCB0aGVuCisgIC8vIGRlc3Ryb3kgYW55IGV4Y2Vzcy4KKyAgc2l6ZV90IFJIU1NpemUgPSBSSFMuc2l6ZSgpOworICBzaXplX3QgQ3VyU2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgaWYgKEN1clNpemUgPj0gUkhTU2l6ZSkgeworICAgIC8vIEFzc2lnbiBjb21tb24gZWxlbWVudHMuCisgICAgaXRlcmF0b3IgTmV3RW5kID0gdGhpcy0+YmVnaW4oKTsKKyAgICBpZiAoUkhTU2l6ZSkKKyAgICAgIE5ld0VuZCA9IHN0ZDo6bW92ZShSSFMuYmVnaW4oKSwgUkhTLmVuZCgpLCBOZXdFbmQpOworCisgICAgLy8gRGVzdHJveSBleGNlc3MgZWxlbWVudHMgYW5kIHRyaW0gdGhlIGJvdW5kcy4KKyAgICB0aGlzLT5kZXN0cm95X3JhbmdlKE5ld0VuZCwgdGhpcy0+ZW5kKCkpOworICAgIHRoaXMtPnNldEVuZChOZXdFbmQpOworCisgICAgLy8gQ2xlYXIgdGhlIFJIUy4KKyAgICBSSFMuY2xlYXIoKTsKKworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIElmIHdlIGhhdmUgdG8gZ3JvdyB0byBoYXZlIGVub3VnaCBlbGVtZW50cywgZGVzdHJveSB0aGUgY3VycmVudCBlbGVtZW50cy4KKyAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gYXZvaWQgY29weWluZyB0aGVtIGR1cmluZyB0aGUgZ3Jvdy4KKyAgLy8gRklYTUU6IHRoaXMgbWF5IG5vdCBhY3R1YWxseSBtYWtlIGFueSBzZW5zZSBpZiB3ZSBjYW4gZWZmaWNpZW50bHkgbW92ZQorICAvLyBlbGVtZW50cy4KKyAgaWYgKHRoaXMtPmNhcGFjaXR5KCkgPCBSSFNTaXplKSB7CisgICAgLy8gRGVzdHJveSBjdXJyZW50IGVsZW1lbnRzLgorICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UodGhpcy0+YmVnaW4oKSwgdGhpcy0+ZW5kKCkpOworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5iZWdpbigpKTsKKyAgICBDdXJTaXplID0gMDsKKyAgICB0aGlzLT5ncm93KFJIU1NpemUpOworICB9IGVsc2UgaWYgKEN1clNpemUpIHsKKyAgICAvLyBPdGhlcndpc2UsIHVzZSBhc3NpZ25tZW50IGZvciB0aGUgYWxyZWFkeS1jb25zdHJ1Y3RlZCBlbGVtZW50cy4KKyAgICBzdGQ6Om1vdmUoUkhTLmJlZ2luKCksIFJIUy5iZWdpbigpK0N1clNpemUsIHRoaXMtPmJlZ2luKCkpOworICB9CisKKyAgLy8gTW92ZS1jb25zdHJ1Y3QgdGhlIG5ldyBlbGVtZW50cyBpbiBwbGFjZS4KKyAgdGhpcy0+dW5pbml0aWFsaXplZF9tb3ZlKFJIUy5iZWdpbigpK0N1clNpemUsIFJIUy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmJlZ2luKCkrQ3VyU2l6ZSk7CisKKyAgLy8gU2V0IGVuZC4KKyAgdGhpcy0+c2V0RW5kKHRoaXMtPmJlZ2luKCkrUkhTU2l6ZSk7CisKKyAgUkhTLmNsZWFyKCk7CisgIHJldHVybiAqdGhpczsKK30KKworLy8vIFN0b3JhZ2UgZm9yIHRoZSBTbWFsbFZlY3RvciBlbGVtZW50cyB3aGljaCBhcmVuJ3QgY29udGFpbmVkIGluCisvLy8gU21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbi4gVGhlcmUgYXJlICdOLTEnIGVsZW1lbnRzIGhlcmUuIFRoZSByZW1haW5pbmcgJzEnCisvLy8gZWxlbWVudCBpcyBpbiB0aGUgYmFzZSBjbGFzcy4gVGhpcyBpcyBzcGVjaWFsaXplZCBmb3IgdGhlIE49MSBhbmQgTj0wIGNhc2VzCisvLy8gdG8gYXZvaWQgYWxsb2NhdGluZyB1bm5lY2Vzc2FyeSBzdG9yYWdlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4+CitzdHJ1Y3QgU21hbGxWZWN0b3JTdG9yYWdlIHsKKyAgdHlwZW5hbWUgU21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxUPjo6VSBJbmxpbmVFbHRzW04gLSAxXTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFNtYWxsVmVjdG9yU3RvcmFnZTxULCAxPiB7fTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgU21hbGxWZWN0b3JTdG9yYWdlPFQsIDA+IHt9OworCisvLy8gVGhpcyBpcyBhICd2ZWN0b3InIChyZWFsbHksIGEgdmFyaWFibGUtc2l6ZWQgYXJyYXkpLCBvcHRpbWl6ZWQKKy8vLyBmb3IgdGhlIGNhc2Ugd2hlbiB0aGUgYXJyYXkgaXMgc21hbGwuICBJdCBjb250YWlucyBzb21lIG51bWJlciBvZiBlbGVtZW50cworLy8vIGluLXBsYWNlLCB3aGljaCBhbGxvd3MgaXQgdG8gYXZvaWQgaGVhcCBhbGxvY2F0aW9uIHdoZW4gdGhlIGFjdHVhbCBudW1iZXIgb2YKKy8vLyBlbGVtZW50cyBpcyBiZWxvdyB0aGF0IHRocmVzaG9sZC4gIFRoaXMgYWxsb3dzIG5vcm1hbCAic21hbGwiIGNhc2VzIHRvIGJlCisvLy8gZmFzdCB3aXRob3V0IGxvc2luZyBnZW5lcmFsaXR5IGZvciBsYXJnZSBpbnB1dHMuCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhdHRlbXB0IHRvIGJlIGV4Y2VwdGlvbiBzYWZlLgorLy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdW5zaWduZWQgTj4KK2NsYXNzIFNtYWxsVmVjdG9yIDogcHVibGljIFNtYWxsVmVjdG9ySW1wbDxUPiB7CisgIC8vLyBJbmxpbmUgc3BhY2UgZm9yIGVsZW1lbnRzIHdoaWNoIGFyZW4ndCBzdG9yZWQgaW4gdGhlIGJhc2UgY2xhc3MuCisgIFNtYWxsVmVjdG9yU3RvcmFnZTxULCBOPiBTdG9yYWdlOworCitwdWJsaWM6CisgIFNtYWxsVmVjdG9yKCkgOiBTbWFsbFZlY3RvckltcGw8VD4oTikge30KKworICB+U21hbGxWZWN0b3IoKSB7CisgICAgLy8gRGVzdHJveSB0aGUgY29uc3RydWN0ZWQgZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KKyAgICB0aGlzLT5kZXN0cm95X3JhbmdlKHRoaXMtPmJlZ2luKCksIHRoaXMtPmVuZCgpKTsKKyAgfQorCisgIGV4cGxpY2l0IFNtYWxsVmVjdG9yKHNpemVfdCBTaXplLCBjb25zdCBUICZWYWx1ZSA9IFQoKSkKKyAgICA6IFNtYWxsVmVjdG9ySW1wbDxUPihOKSB7CisgICAgdGhpcy0+YXNzaWduKFNpemUsIFZhbHVlKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJdFR5LAorICAgICAgICAgICAgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0VHk+OjppdGVyYXRvcl9jYXRlZ29yeSwKKyAgICAgICAgICAgICAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZz46OnZhbHVlPjo6dHlwZT4KKyAgU21hbGxWZWN0b3IoSXRUeSBTLCBJdFR5IEUpIDogU21hbGxWZWN0b3JJbXBsPFQ+KE4pIHsKKyAgICB0aGlzLT5hcHBlbmQoUywgRSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmFuZ2VUeT4KKyAgZXhwbGljaXQgU21hbGxWZWN0b3IoY29uc3QgaXRlcmF0b3JfcmFuZ2U8UmFuZ2VUeT4gJlIpCisgICAgICA6IFNtYWxsVmVjdG9ySW1wbDxUPihOKSB7CisgICAgdGhpcy0+YXBwZW5kKFIuYmVnaW4oKSwgUi5lbmQoKSk7CisgIH0KKworICBTbWFsbFZlY3RvcihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gSUwpIDogU21hbGxWZWN0b3JJbXBsPFQ+KE4pIHsKKyAgICB0aGlzLT5hc3NpZ24oSUwpOworICB9CisKKyAgU21hbGxWZWN0b3IoY29uc3QgU21hbGxWZWN0b3IgJlJIUykgOiBTbWFsbFZlY3RvckltcGw8VD4oTikgeworICAgIGlmICghUkhTLmVtcHR5KCkpCisgICAgICBTbWFsbFZlY3RvckltcGw8VD46Om9wZXJhdG9yPShSSFMpOworICB9CisKKyAgY29uc3QgU21hbGxWZWN0b3IgJm9wZXJhdG9yPShjb25zdCBTbWFsbFZlY3RvciAmUkhTKSB7CisgICAgU21hbGxWZWN0b3JJbXBsPFQ+OjpvcGVyYXRvcj0oUkhTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBTbWFsbFZlY3RvcihTbWFsbFZlY3RvciAmJlJIUykgOiBTbWFsbFZlY3RvckltcGw8VD4oTikgeworICAgIGlmICghUkhTLmVtcHR5KCkpCisgICAgICBTbWFsbFZlY3RvckltcGw8VD46Om9wZXJhdG9yPSg6OnN0ZDo6bW92ZShSSFMpKTsKKyAgfQorCisgIFNtYWxsVmVjdG9yKFNtYWxsVmVjdG9ySW1wbDxUPiAmJlJIUykgOiBTbWFsbFZlY3RvckltcGw8VD4oTikgeworICAgIGlmICghUkhTLmVtcHR5KCkpCisgICAgICBTbWFsbFZlY3RvckltcGw8VD46Om9wZXJhdG9yPSg6OnN0ZDo6bW92ZShSSFMpKTsKKyAgfQorCisgIGNvbnN0IFNtYWxsVmVjdG9yICZvcGVyYXRvcj0oU21hbGxWZWN0b3IgJiZSSFMpIHsKKyAgICBTbWFsbFZlY3RvckltcGw8VD46Om9wZXJhdG9yPSg6OnN0ZDo6bW92ZShSSFMpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBTbWFsbFZlY3RvciAmb3BlcmF0b3I9KFNtYWxsVmVjdG9ySW1wbDxUPiAmJlJIUykgeworICAgIFNtYWxsVmVjdG9ySW1wbDxUPjo6b3BlcmF0b3I9KDo6c3RkOjptb3ZlKFJIUykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IFNtYWxsVmVjdG9yICZvcGVyYXRvcj0oc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IElMKSB7CisgICAgdGhpcy0+YXNzaWduKElMKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB1bnNpZ25lZCBOPgoraW5saW5lIHNpemVfdCBjYXBhY2l0eV9pbl9ieXRlcyhjb25zdCBTbWFsbFZlY3RvcjxULCBOPiAmWCkgeworICByZXR1cm4gWC5jYXBhY2l0eV9pbl9ieXRlcygpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCituYW1lc3BhY2Ugc3RkIHsKKworICAvLy8gSW1wbGVtZW50IHN0ZDo6c3dhcCBpbiB0ZXJtcyBvZiBTbWFsbFZlY3RvciBzd2FwLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBpbmxpbmUgdm9pZAorICBzd2FwKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxUPiAmTEhTLCBsbHZtOjpTbWFsbFZlY3RvckltcGw8VD4gJlJIUykgeworICAgIExIUy5zd2FwKFJIUyk7CisgIH0KKworICAvLy8gSW1wbGVtZW50IHN0ZDo6c3dhcCBpbiB0ZXJtcyBvZiBTbWFsbFZlY3RvciBzd2FwLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB1bnNpZ25lZCBOPgorICBpbmxpbmUgdm9pZAorICBzd2FwKGxsdm06OlNtYWxsVmVjdG9yPFQsIE4+ICZMSFMsIGxsdm06OlNtYWxsVmVjdG9yPFQsIE4+ICZSSFMpIHsKKyAgICBMSFMuc3dhcChSSFMpOworICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIExMVk1fQURUX1NNQUxMVkVDVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NwYXJzZUJpdFZlY3Rvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3BhcnNlQml0VmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiZjQwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NwYXJzZUJpdFZlY3Rvci5oCkBAIC0wLDAgKzEsODg4IEBACisvLz09PS0gbGx2bS9BRFQvU3BhcnNlQml0VmVjdG9yLmggLSBFZmZpY2llbnQgU3BhcnNlIEJpdFZlY3RvciAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBTcGFyc2VCaXRWZWN0b3IgY2xhc3MuICBTZWUgdGhlIGRveHlnZW4gY29tbWVudCBmb3IKKy8vIFNwYXJzZUJpdFZlY3RvciBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBhbGdvcml0aG0gdXNlZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NQQVJTRUJJVFZFQ1RPUl9ICisjZGVmaW5lIExMVk1fQURUX1NQQVJTRUJJVFZFQ1RPUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGlzdD4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gU3BhcnNlQml0VmVjdG9yIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgYml0dmVjdG9yIHRoYXQgaXMgc3BhcnNlIGJ5IG9ubHkKKy8vLyBzdG9yaW5nIHRoZSBlbGVtZW50cyB0aGF0IGhhdmUgbm9uLXplcm8gYml0cyBzZXQuICBJbiBvcmRlciB0byBtYWtlIHRoaXMKKy8vLyBmYXN0IGZvciB0aGUgbW9zdCBjb21tb24gY2FzZXMsIFNwYXJzZUJpdFZlY3RvciBpcyBpbXBsZW1lbnRlZCBhcyBhIGxpbmtlZAorLy8vIGxpc3Qgb2YgU3BhcnNlQml0VmVjdG9yRWxlbWVudHMuICBXZSBtYWludGFpbiBhIHBvaW50ZXIgdG8gdGhlIGxhc3QKKy8vLyBTcGFyc2VCaXRWZWN0b3JFbGVtZW50IGFjY2Vzc2VkIChpbiB0aGUgZm9ybSBvZiBhIGxpc3QgaXRlcmF0b3IpLCBpbiBvcmRlcgorLy8vIHRvIG1ha2UgbXVsdGlwbGUgaW4tb3JkZXIgdGVzdC9zZXQgY29uc3RhbnQgdGltZSBhZnRlciB0aGUgZmlyc3Qgb25lIGlzCisvLy8gZXhlY3V0ZWQuICBOb3RlIHRoYXQgdXNpbmcgdmVjdG9ycyB0byBzdG9yZSBTcGFyc2VCaXRWZWN0b3JFbGVtZW50J3MgZG9lcworLy8vIG5vdCB3b3JrIG91dCB2ZXJ5IHdlbGwgYmVjYXVzZSBpdCBjYXVzZXMgaW5zZXJ0aW9uIGluIHRoZSBtaWRkbGUgdG8gdGFrZQorLy8vIGVub3Jtb3VzIGFtb3VudHMgb2YgdGltZSB3aXRoIGEgbGFyZ2UgYW1vdW50IG9mIGJpdHMuICBPdGhlciBzdHJ1Y3R1cmVzIHRoYXQKKy8vLyBoYXZlIGJldHRlciB3b3JzdCBjYXNlcyBmb3IgaW5zZXJ0aW9uIGluIHRoZSBtaWRkbGUgKHZhcmlvdXMgYmFsYW5jZWQgdHJlZXMsCisvLy8gZXRjKSBkbyBub3QgcGVyZm9ybSBhcyB3ZWxsIGluIHByYWN0aWNlIGFzIGEgbGlua2VkIGxpc3Qgd2l0aCB0aGlzIGl0ZXJhdG9yCisvLy8ga2VwdCB1cCB0byBkYXRlLiAgVGhleSBhcmUgYWxzbyBzaWduaWZpY2FudGx5IG1vcmUgbWVtb3J5IGludGVuc2l2ZS4KKwordGVtcGxhdGUgPHVuc2lnbmVkIEVsZW1lbnRTaXplID0gMTI4PiBzdHJ1Y3QgU3BhcnNlQml0VmVjdG9yRWxlbWVudCB7CitwdWJsaWM6CisgIHVzaW5nIEJpdFdvcmQgPSB1bnNpZ25lZCBsb25nOworICB1c2luZyBzaXplX3R5cGUgPSB1bnNpZ25lZDsKKyAgZW51bSB7CisgICAgQklUV09SRF9TSVpFID0gc2l6ZW9mKEJpdFdvcmQpICogQ0hBUl9CSVQsCisgICAgQklUV09SRFNfUEVSX0VMRU1FTlQgPSAoRWxlbWVudFNpemUgKyBCSVRXT1JEX1NJWkUgLSAxKSAvIEJJVFdPUkRfU0laRSwKKyAgICBCSVRTX1BFUl9FTEVNRU5UID0gRWxlbWVudFNpemUKKyAgfTsKKworcHJpdmF0ZToKKyAgLy8gSW5kZXggb2YgRWxlbWVudCBpbiB0ZXJtcyBvZiB3aGVyZSBmaXJzdCBiaXQgc3RhcnRzLgorICB1bnNpZ25lZCBFbGVtZW50SW5kZXg7CisgIEJpdFdvcmQgQml0c1tCSVRXT1JEU19QRVJfRUxFTUVOVF07CisKKyAgU3BhcnNlQml0VmVjdG9yRWxlbWVudCgpIHsKKyAgICBFbGVtZW50SW5kZXggPSB+MFU7CisgICAgbWVtc2V0KCZCaXRzWzBdLCAwLCBzaXplb2YgKEJpdFdvcmQpICogQklUV09SRFNfUEVSX0VMRU1FTlQpOworICB9CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgU3BhcnNlQml0VmVjdG9yRWxlbWVudCh1bnNpZ25lZCBJZHgpIHsKKyAgICBFbGVtZW50SW5kZXggPSBJZHg7CisgICAgbWVtc2V0KCZCaXRzWzBdLCAwLCBzaXplb2YgKEJpdFdvcmQpICogQklUV09SRFNfUEVSX0VMRU1FTlQpOworICB9CisKKyAgLy8gQ29tcGFyaXNvbi4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNwYXJzZUJpdFZlY3RvckVsZW1lbnQgJlJIUykgY29uc3QgeworICAgIGlmIChFbGVtZW50SW5kZXggIT0gUkhTLkVsZW1lbnRJbmRleCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgQklUV09SRFNfUEVSX0VMRU1FTlQ7ICsraSkKKyAgICAgIGlmIChCaXRzW2ldICE9IFJIUy5CaXRzW2ldKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgU3BhcnNlQml0VmVjdG9yRWxlbWVudCAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gUkhTKTsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgYml0cyB0aGF0IG1ha2UgdXAgd29yZCBJZHggaW4gb3VyIGVsZW1lbnQuCisgIEJpdFdvcmQgd29yZCh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSWR4IDwgQklUV09SRFNfUEVSX0VMRU1FTlQpOworICAgIHJldHVybiBCaXRzW0lkeF07CisgIH0KKworICB1bnNpZ25lZCBpbmRleCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRWxlbWVudEluZGV4OworICB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgQklUV09SRFNfUEVSX0VMRU1FTlQ7ICsraSkKKyAgICAgIGlmIChCaXRzW2ldKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2b2lkIHNldCh1bnNpZ25lZCBJZHgpIHsKKyAgICBCaXRzW0lkeCAvIEJJVFdPUkRfU0laRV0gfD0gMUwgPDwgKElkeCAlIEJJVFdPUkRfU0laRSk7CisgIH0KKworICBib29sIHRlc3RfYW5kX3NldCh1bnNpZ25lZCBJZHgpIHsKKyAgICBib29sIG9sZCA9IHRlc3QoSWR4KTsKKyAgICBpZiAoIW9sZCkgeworICAgICAgc2V0KElkeCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdm9pZCByZXNldCh1bnNpZ25lZCBJZHgpIHsKKyAgICBCaXRzW0lkeCAvIEJJVFdPUkRfU0laRV0gJj0gfigxTCA8PCAoSWR4ICUgQklUV09SRF9TSVpFKSk7CisgIH0KKworICBib29sIHRlc3QodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIEJpdHNbSWR4IC8gQklUV09SRF9TSVpFXSAmICgxTCA8PCAoSWR4ICUgQklUV09SRF9TSVpFKSk7CisgIH0KKworICBzaXplX3R5cGUgY291bnQoKSBjb25zdCB7CisgICAgdW5zaWduZWQgTnVtQml0cyA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEJJVFdPUkRTX1BFUl9FTEVNRU5UOyArK2kpCisgICAgICBOdW1CaXRzICs9IGNvdW50UG9wdWxhdGlvbihCaXRzW2ldKTsKKyAgICByZXR1cm4gTnVtQml0czsKKyAgfQorCisgIC8vLyBmaW5kX2ZpcnN0IC0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHNldCBiaXQuCisgIGludCBmaW5kX2ZpcnN0KCkgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBCSVRXT1JEU19QRVJfRUxFTUVOVDsgKytpKQorICAgICAgaWYgKEJpdHNbaV0gIT0gMCkKKyAgICAgICAgcmV0dXJuIGkgKiBCSVRXT1JEX1NJWkUgKyBjb3VudFRyYWlsaW5nWmVyb3MoQml0c1tpXSk7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiSWxsZWdhbCBlbXB0eSBlbGVtZW50Iik7CisgIH0KKworICAvLy8gZmluZF9sYXN0IC0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgc2V0IGJpdC4KKyAgaW50IGZpbmRfbGFzdCgpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJIDwgQklUV09SRFNfUEVSX0VMRU1FTlQ7ICsrSSkgeworICAgICAgdW5zaWduZWQgSWR4ID0gQklUV09SRFNfUEVSX0VMRU1FTlQgLSBJIC0gMTsKKyAgICAgIGlmIChCaXRzW0lkeF0gIT0gMCkKKyAgICAgICAgcmV0dXJuIElkeCAqIEJJVFdPUkRfU0laRSArIEJJVFdPUkRfU0laRSAtCisgICAgICAgICAgICAgICBjb3VudExlYWRpbmdaZXJvcyhCaXRzW0lkeF0pIC0gMTsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiSWxsZWdhbCBlbXB0eSBlbGVtZW50Iik7CisgIH0KKworICAvLy8gZmluZF9uZXh0IC0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5leHQgc2V0IGJpdCBzdGFydGluZyBmcm9tIHRoZQorICAvLy8gIkN1cnIiIGJpdC4gUmV0dXJucyAtMSBpZiB0aGUgbmV4dCBzZXQgYml0IGlzIG5vdCBmb3VuZC4KKyAgaW50IGZpbmRfbmV4dCh1bnNpZ25lZCBDdXJyKSBjb25zdCB7CisgICAgaWYgKEN1cnIgPj0gQklUU19QRVJfRUxFTUVOVCkKKyAgICAgIHJldHVybiAtMTsKKworICAgIHVuc2lnbmVkIFdvcmRQb3MgPSBDdXJyIC8gQklUV09SRF9TSVpFOworICAgIHVuc2lnbmVkIEJpdFBvcyA9IEN1cnIgJSBCSVRXT1JEX1NJWkU7CisgICAgQml0V29yZCBDb3B5ID0gQml0c1tXb3JkUG9zXTsKKyAgICBhc3NlcnQoV29yZFBvcyA8PSBCSVRXT1JEU19QRVJfRUxFTUVOVAorICAgICAgICAgICAmJiAiV29yZCBQb3NpdGlvbiBvdXRzaWRlIG9mIGVsZW1lbnQiKTsKKworICAgIC8vIE1hc2sgb2ZmIHByZXZpb3VzIGJpdHMuCisgICAgQ29weSAmPSB+MFVMIDw8IEJpdFBvczsKKworICAgIGlmIChDb3B5ICE9IDApCisgICAgICByZXR1cm4gV29yZFBvcyAqIEJJVFdPUkRfU0laRSArIGNvdW50VHJhaWxpbmdaZXJvcyhDb3B5KTsKKworICAgIC8vIENoZWNrIHN1YnNlcXVlbnQgd29yZHMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gV29yZFBvcysxOyBpIDwgQklUV09SRFNfUEVSX0VMRU1FTlQ7ICsraSkKKyAgICAgIGlmIChCaXRzW2ldICE9IDApCisgICAgICAgIHJldHVybiBpICogQklUV09SRF9TSVpFICsgY291bnRUcmFpbGluZ1plcm9zKEJpdHNbaV0pOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vIFVuaW9uIHRoaXMgZWxlbWVudCB3aXRoIFJIUyBhbmQgcmV0dXJuIHRydWUgaWYgdGhpcyBvbmUgY2hhbmdlZC4KKyAgYm9vbCB1bmlvbldpdGgoY29uc3QgU3BhcnNlQml0VmVjdG9yRWxlbWVudCAmUkhTKSB7CisgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEJJVFdPUkRTX1BFUl9FTEVNRU5UOyArK2kpIHsKKyAgICAgIEJpdFdvcmQgb2xkID0gY2hhbmdlZCA/IDAgOiBCaXRzW2ldOworCisgICAgICBCaXRzW2ldIHw9IFJIUy5CaXRzW2ldOworICAgICAgaWYgKCFjaGFuZ2VkICYmIG9sZCAhPSBCaXRzW2ldKQorICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGNoYW5nZWQ7CisgIH0KKworICAvLyBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIGFueSBiaXRzIGluIGNvbW1vbiB3aXRoIFJIUworICBib29sIGludGVyc2VjdHMoY29uc3QgU3BhcnNlQml0VmVjdG9yRWxlbWVudCAmUkhTKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEJJVFdPUkRTX1BFUl9FTEVNRU5UOyArK2kpIHsKKyAgICAgIGlmIChSSFMuQml0c1tpXSAmIEJpdHNbaV0pCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJbnRlcnNlY3QgdGhpcyBFbGVtZW50IHdpdGggUkhTIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGlzIG9uZSBjaGFuZ2VkLgorICAvLyBCZWNhbWVaZXJvIGlzIHNldCB0byB0cnVlIGlmIHRoaXMgZWxlbWVudCBiZWNhbWUgYWxsLXplcm8gYml0cy4KKyAgYm9vbCBpbnRlcnNlY3RXaXRoKGNvbnN0IFNwYXJzZUJpdFZlY3RvckVsZW1lbnQgJlJIUywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkJlY2FtZVplcm8pIHsKKyAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICBib29sIGFsbHplcm8gPSB0cnVlOworCisgICAgQmVjYW1lWmVybyA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBCSVRXT1JEU19QRVJfRUxFTUVOVDsgKytpKSB7CisgICAgICBCaXRXb3JkIG9sZCA9IGNoYW5nZWQgPyAwIDogQml0c1tpXTsKKworICAgICAgQml0c1tpXSAmPSBSSFMuQml0c1tpXTsKKyAgICAgIGlmIChCaXRzW2ldICE9IDApCisgICAgICAgIGFsbHplcm8gPSBmYWxzZTsKKworICAgICAgaWYgKCFjaGFuZ2VkICYmIG9sZCAhPSBCaXRzW2ldKQorICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgICAgQmVjYW1lWmVybyA9IGFsbHplcm87CisgICAgcmV0dXJuIGNoYW5nZWQ7CisgIH0KKworICAvLyBJbnRlcnNlY3QgdGhpcyBFbGVtZW50IHdpdGggdGhlIGNvbXBsZW1lbnQgb2YgUkhTIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGlzCisgIC8vIG9uZSBjaGFuZ2VkLiAgQmVjYW1lWmVybyBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgYmVjYW1lIGFsbC16ZXJvCisgIC8vIGJpdHMuCisgIGJvb2wgaW50ZXJzZWN0V2l0aENvbXBsZW1lbnQoY29uc3QgU3BhcnNlQml0VmVjdG9yRWxlbWVudCAmUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkJlY2FtZVplcm8pIHsKKyAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICBib29sIGFsbHplcm8gPSB0cnVlOworCisgICAgQmVjYW1lWmVybyA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBCSVRXT1JEU19QRVJfRUxFTUVOVDsgKytpKSB7CisgICAgICBCaXRXb3JkIG9sZCA9IGNoYW5nZWQgPyAwIDogQml0c1tpXTsKKworICAgICAgQml0c1tpXSAmPSB+UkhTLkJpdHNbaV07CisgICAgICBpZiAoQml0c1tpXSAhPSAwKQorICAgICAgICBhbGx6ZXJvID0gZmFsc2U7CisKKyAgICAgIGlmICghY2hhbmdlZCAmJiBvbGQgIT0gQml0c1tpXSkKKyAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgfQorICAgIEJlY2FtZVplcm8gPSBhbGx6ZXJvOworICAgIHJldHVybiBjaGFuZ2VkOworICB9CisKKyAgLy8gVGhyZWUgYXJndW1lbnQgdmVyc2lvbiBvZiBpbnRlcnNlY3RXaXRoQ29tcGxlbWVudCB0aGF0IGludGVyc2VjdHMKKyAgLy8gUkhTMSAmIH5SSFMyIGludG8gdGhpcyBlbGVtZW50CisgIHZvaWQgaW50ZXJzZWN0V2l0aENvbXBsZW1lbnQoY29uc3QgU3BhcnNlQml0VmVjdG9yRWxlbWVudCAmUkhTMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTcGFyc2VCaXRWZWN0b3JFbGVtZW50ICZSSFMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkJlY2FtZVplcm8pIHsKKyAgICBib29sIGFsbHplcm8gPSB0cnVlOworCisgICAgQmVjYW1lWmVybyA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBCSVRXT1JEU19QRVJfRUxFTUVOVDsgKytpKSB7CisgICAgICBCaXRzW2ldID0gUkhTMS5CaXRzW2ldICYgflJIUzIuQml0c1tpXTsKKyAgICAgIGlmIChCaXRzW2ldICE9IDApCisgICAgICAgIGFsbHplcm8gPSBmYWxzZTsKKyAgICB9CisgICAgQmVjYW1lWmVybyA9IGFsbHplcm87CisgIH0KK307CisKK3RlbXBsYXRlIDx1bnNpZ25lZCBFbGVtZW50U2l6ZSA9IDEyOD4KK2NsYXNzIFNwYXJzZUJpdFZlY3RvciB7CisgIHVzaW5nIEVsZW1lbnRMaXN0ID0gc3RkOjpsaXN0PFNwYXJzZUJpdFZlY3RvckVsZW1lbnQ8RWxlbWVudFNpemU+PjsKKyAgdXNpbmcgRWxlbWVudExpc3RJdGVyID0gdHlwZW5hbWUgRWxlbWVudExpc3Q6Oml0ZXJhdG9yOworICB1c2luZyBFbGVtZW50TGlzdENvbnN0SXRlciA9IHR5cGVuYW1lIEVsZW1lbnRMaXN0Ojpjb25zdF9pdGVyYXRvcjsKKyAgZW51bSB7CisgICAgQklUV09SRF9TSVpFID0gU3BhcnNlQml0VmVjdG9yRWxlbWVudDxFbGVtZW50U2l6ZT46OkJJVFdPUkRfU0laRQorICB9OworCisgIC8vIFBvaW50ZXIgdG8gb3VyIGN1cnJlbnQgRWxlbWVudC4KKyAgRWxlbWVudExpc3RJdGVyIEN1cnJFbGVtZW50SXRlcjsKKyAgRWxlbWVudExpc3QgRWxlbWVudHM7CisKKyAgLy8gVGhpcyBpcyBsaWtlIHN0ZDo6bG93ZXJfYm91bmQsIGV4Y2VwdCB3ZSBkbyBsaW5lYXIgc2VhcmNoaW5nIGZyb20gdGhlCisgIC8vIGN1cnJlbnQgcG9zaXRpb24uCisgIEVsZW1lbnRMaXN0SXRlciBGaW5kTG93ZXJCb3VuZCh1bnNpZ25lZCBFbGVtZW50SW5kZXgpIHsKKworICAgIGlmIChFbGVtZW50cy5lbXB0eSgpKSB7CisgICAgICBDdXJyRWxlbWVudEl0ZXIgPSBFbGVtZW50cy5iZWdpbigpOworICAgICAgcmV0dXJuIEVsZW1lbnRzLmJlZ2luKCk7CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIG91ciBjdXJyZW50IGl0ZXJhdG9yIGlzIHZhbGlkLgorICAgIGlmIChDdXJyRWxlbWVudEl0ZXIgPT0gRWxlbWVudHMuZW5kKCkpCisgICAgICAtLUN1cnJFbGVtZW50SXRlcjsKKworICAgIC8vIFNlYXJjaCBmcm9tIG91ciBjdXJyZW50IGl0ZXJhdG9yLCBlaXRoZXIgYmFja3dhcmRzIG9yIGZvcndhcmRzLAorICAgIC8vIGRlcGVuZGluZyBvbiB3aGF0IGVsZW1lbnQgd2UgYXJlIGxvb2tpbmcgZm9yLgorICAgIEVsZW1lbnRMaXN0SXRlciBFbGVtZW50SXRlciA9IEN1cnJFbGVtZW50SXRlcjsKKyAgICBpZiAoQ3VyckVsZW1lbnRJdGVyLT5pbmRleCgpID09IEVsZW1lbnRJbmRleCkgeworICAgICAgcmV0dXJuIEVsZW1lbnRJdGVyOworICAgIH0gZWxzZSBpZiAoQ3VyckVsZW1lbnRJdGVyLT5pbmRleCgpID4gRWxlbWVudEluZGV4KSB7CisgICAgICB3aGlsZSAoRWxlbWVudEl0ZXIgIT0gRWxlbWVudHMuYmVnaW4oKQorICAgICAgICAgICAgICYmIEVsZW1lbnRJdGVyLT5pbmRleCgpID4gRWxlbWVudEluZGV4KQorICAgICAgICAtLUVsZW1lbnRJdGVyOworICAgIH0gZWxzZSB7CisgICAgICB3aGlsZSAoRWxlbWVudEl0ZXIgIT0gRWxlbWVudHMuZW5kKCkgJiYKKyAgICAgICAgICAgICBFbGVtZW50SXRlci0+aW5kZXgoKSA8IEVsZW1lbnRJbmRleCkKKyAgICAgICAgKytFbGVtZW50SXRlcjsKKyAgICB9CisgICAgQ3VyckVsZW1lbnRJdGVyID0gRWxlbWVudEl0ZXI7CisgICAgcmV0dXJuIEVsZW1lbnRJdGVyOworICB9CisKKyAgLy8gSXRlcmF0b3IgdG8gd2FsayBzZXQgYml0cyBpbiB0aGUgYml0bWFwLiAgVGhpcyBpdGVyYXRvciBpcyBhIGxvdCB1Z2xpZXIKKyAgLy8gdGhhbiBpdCB3b3VsZCBiZSwgaW4gb3JkZXIgdG8gYmUgZWZmaWNpZW50LgorICBjbGFzcyBTcGFyc2VCaXRWZWN0b3JJdGVyYXRvciB7CisgIHByaXZhdGU6CisgICAgYm9vbCBBdEVuZDsKKworICAgIGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gKkJpdFZlY3RvciA9IG51bGxwdHI7CisKKyAgICAvLyBDdXJyZW50IGVsZW1lbnQgaW5zaWRlIG9mIGJpdG1hcC4KKyAgICBFbGVtZW50TGlzdENvbnN0SXRlciBJdGVyOworCisgICAgLy8gQ3VycmVudCBiaXQgbnVtYmVyIGluc2lkZSBvZiBvdXIgYml0bWFwLgorICAgIHVuc2lnbmVkIEJpdE51bWJlcjsKKworICAgIC8vIEN1cnJlbnQgd29yZCBudW1iZXIgaW5zaWRlIG9mIG91ciBlbGVtZW50LgorICAgIHVuc2lnbmVkIFdvcmROdW1iZXI7CisKKyAgICAvLyBDdXJyZW50IGJpdHMgZnJvbSB0aGUgZWxlbWVudC4KKyAgICB0eXBlbmFtZSBTcGFyc2VCaXRWZWN0b3JFbGVtZW50PEVsZW1lbnRTaXplPjo6Qml0V29yZCBCaXRzOworCisgICAgLy8gTW92ZSBvdXIgaXRlcmF0b3IgdG8gdGhlIGZpcnN0IG5vbi16ZXJvIGJpdCBpbiB0aGUgYml0bWFwLgorICAgIHZvaWQgQWR2YW5jZVRvRmlyc3ROb25aZXJvKCkgeworICAgICAgaWYgKEF0RW5kKQorICAgICAgICByZXR1cm47CisgICAgICBpZiAoQml0VmVjdG9yLT5FbGVtZW50cy5lbXB0eSgpKSB7CisgICAgICAgIEF0RW5kID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgSXRlciA9IEJpdFZlY3Rvci0+RWxlbWVudHMuYmVnaW4oKTsKKyAgICAgIEJpdE51bWJlciA9IEl0ZXItPmluZGV4KCkgKiBFbGVtZW50U2l6ZTsKKyAgICAgIHVuc2lnbmVkIEJpdFBvcyA9IEl0ZXItPmZpbmRfZmlyc3QoKTsKKyAgICAgIEJpdE51bWJlciArPSBCaXRQb3M7CisgICAgICBXb3JkTnVtYmVyID0gKEJpdE51bWJlciAlIEVsZW1lbnRTaXplKSAvIEJJVFdPUkRfU0laRTsKKyAgICAgIEJpdHMgPSBJdGVyLT53b3JkKFdvcmROdW1iZXIpOworICAgICAgQml0cyA+Pj0gQml0UG9zICUgQklUV09SRF9TSVpFOworICAgIH0KKworICAgIC8vIE1vdmUgb3VyIGl0ZXJhdG9yIHRvIHRoZSBuZXh0IG5vbi16ZXJvIGJpdC4KKyAgICB2b2lkIEFkdmFuY2VUb05leHROb25aZXJvKCkgeworICAgICAgaWYgKEF0RW5kKQorICAgICAgICByZXR1cm47CisKKyAgICAgIHdoaWxlIChCaXRzICYmICEoQml0cyAmIDEpKSB7CisgICAgICAgIEJpdHMgPj49IDE7CisgICAgICAgIEJpdE51bWJlciArPSAxOworICAgICAgfQorCisgICAgICAvLyBTZWUgaWYgd2UgcmFuIG91dCBvZiBCaXRzIGluIHRoaXMgd29yZC4KKyAgICAgIGlmICghQml0cykgeworICAgICAgICBpbnQgTmV4dFNldEJpdE51bWJlciA9IEl0ZXItPmZpbmRfbmV4dChCaXROdW1iZXIgJSBFbGVtZW50U2l6ZSkgOworICAgICAgICAvLyBJZiB3ZSByYW4gb3V0IG9mIHNldCBiaXRzIGluIHRoaXMgZWxlbWVudCwgbW92ZSB0byBuZXh0IGVsZW1lbnQuCisgICAgICAgIGlmIChOZXh0U2V0Qml0TnVtYmVyID09IC0xIHx8IChCaXROdW1iZXIgJSBFbGVtZW50U2l6ZSA9PSAwKSkgeworICAgICAgICAgICsrSXRlcjsKKyAgICAgICAgICBXb3JkTnVtYmVyID0gMDsKKworICAgICAgICAgIC8vIFdlIG1heSBydW4gb3V0IG9mIGVsZW1lbnRzIGluIHRoZSBiaXRtYXAuCisgICAgICAgICAgaWYgKEl0ZXIgPT0gQml0VmVjdG9yLT5FbGVtZW50cy5lbmQoKSkgeworICAgICAgICAgICAgQXRFbmQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBTZXQgdXAgZm9yIG5leHQgbm9uLXplcm8gd29yZCBpbiBiaXRtYXAuCisgICAgICAgICAgQml0TnVtYmVyID0gSXRlci0+aW5kZXgoKSAqIEVsZW1lbnRTaXplOworICAgICAgICAgIE5leHRTZXRCaXROdW1iZXIgPSBJdGVyLT5maW5kX2ZpcnN0KCk7CisgICAgICAgICAgQml0TnVtYmVyICs9IE5leHRTZXRCaXROdW1iZXI7CisgICAgICAgICAgV29yZE51bWJlciA9IChCaXROdW1iZXIgJSBFbGVtZW50U2l6ZSkgLyBCSVRXT1JEX1NJWkU7CisgICAgICAgICAgQml0cyA9IEl0ZXItPndvcmQoV29yZE51bWJlcik7CisgICAgICAgICAgQml0cyA+Pj0gTmV4dFNldEJpdE51bWJlciAlIEJJVFdPUkRfU0laRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBXb3JkTnVtYmVyID0gKE5leHRTZXRCaXROdW1iZXIgJSBFbGVtZW50U2l6ZSkgLyBCSVRXT1JEX1NJWkU7CisgICAgICAgICAgQml0cyA9IEl0ZXItPndvcmQoV29yZE51bWJlcik7CisgICAgICAgICAgQml0cyA+Pj0gTmV4dFNldEJpdE51bWJlciAlIEJJVFdPUkRfU0laRTsKKyAgICAgICAgICBCaXROdW1iZXIgPSBJdGVyLT5pbmRleCgpICogRWxlbWVudFNpemU7CisgICAgICAgICAgQml0TnVtYmVyICs9IE5leHRTZXRCaXROdW1iZXI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgcHVibGljOgorICAgIFNwYXJzZUJpdFZlY3Rvckl0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgICAgU3BhcnNlQml0VmVjdG9ySXRlcmF0b3IoY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5kID0gZmFsc2UpOkJpdFZlY3RvcihSSFMpIHsKKyAgICAgIEl0ZXIgPSBCaXRWZWN0b3ItPkVsZW1lbnRzLmJlZ2luKCk7CisgICAgICBCaXROdW1iZXIgPSAwOworICAgICAgQml0cyA9IDA7CisgICAgICBXb3JkTnVtYmVyID0gfjA7CisgICAgICBBdEVuZCA9IGVuZDsKKyAgICAgIEFkdmFuY2VUb0ZpcnN0Tm9uWmVybygpOworICAgIH0KKworICAgIC8vIFByZWluY3JlbWVudC4KKyAgICBpbmxpbmUgU3BhcnNlQml0VmVjdG9ySXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgICArK0JpdE51bWJlcjsKKyAgICAgIEJpdHMgPj49IDE7CisgICAgICBBZHZhbmNlVG9OZXh0Tm9uWmVybygpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vIFBvc3RpbmNyZW1lbnQuCisgICAgaW5saW5lIFNwYXJzZUJpdFZlY3Rvckl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CisgICAgICBTcGFyc2VCaXRWZWN0b3JJdGVyYXRvciB0bXAgPSAqdGhpczsKKyAgICAgICsrKnRoaXM7CisgICAgICByZXR1cm4gdG1wOworICAgIH0KKworICAgIC8vIFJldHVybiB0aGUgY3VycmVudCBzZXQgYml0IG51bWJlci4KKyAgICB1bnNpZ25lZCBvcGVyYXRvciooKSBjb25zdCB7CisgICAgICByZXR1cm4gQml0TnVtYmVyOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTcGFyc2VCaXRWZWN0b3JJdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgICAvLyBJZiB0aGV5IGFyZSBib3RoIGF0IHRoZSBlbmQsIGlnbm9yZSB0aGUgcmVzdCBvZiB0aGUgZmllbGRzLgorICAgICAgaWYgKEF0RW5kICYmIFJIUy5BdEVuZCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAvLyBPdGhlcndpc2UgdGhleSBhcmUgdGhlIHNhbWUgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGJpdCBudW1iZXIgYW5kCisgICAgICAvLyBiaXRtYXAuCisgICAgICByZXR1cm4gQXRFbmQgPT0gUkhTLkF0RW5kICYmIFJIUy5CaXROdW1iZXIgPT0gQml0TnVtYmVyOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTcGFyc2VCaXRWZWN0b3JJdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgICByZXR1cm4gISgqdGhpcyA9PSBSSFMpOworICAgIH0KKyAgfTsKKworcHVibGljOgorICB1c2luZyBpdGVyYXRvciA9IFNwYXJzZUJpdFZlY3Rvckl0ZXJhdG9yOworCisgIFNwYXJzZUJpdFZlY3RvcigpIHsKKyAgICBDdXJyRWxlbWVudEl0ZXIgPSBFbGVtZW50cy5iZWdpbigpOworICB9CisKKyAgLy8gU3BhcnNlQml0VmVjdG9yIGNvcHkgY3Rvci4KKyAgU3BhcnNlQml0VmVjdG9yKGNvbnN0IFNwYXJzZUJpdFZlY3RvciAmUkhTKSB7CisgICAgRWxlbWVudExpc3RDb25zdEl0ZXIgRWxlbWVudEl0ZXIgPSBSSFMuRWxlbWVudHMuYmVnaW4oKTsKKyAgICB3aGlsZSAoRWxlbWVudEl0ZXIgIT0gUkhTLkVsZW1lbnRzLmVuZCgpKSB7CisgICAgICBFbGVtZW50cy5wdXNoX2JhY2soU3BhcnNlQml0VmVjdG9yRWxlbWVudDxFbGVtZW50U2l6ZT4oKkVsZW1lbnRJdGVyKSk7CisgICAgICArK0VsZW1lbnRJdGVyOworICAgIH0KKworICAgIEN1cnJFbGVtZW50SXRlciA9IEVsZW1lbnRzLmJlZ2luICgpOworICB9CisKKyAgflNwYXJzZUJpdFZlY3RvcigpID0gZGVmYXVsdDsKKworICAvLyBDbGVhci4KKyAgdm9pZCBjbGVhcigpIHsKKyAgICBFbGVtZW50cy5jbGVhcigpOworICB9CisKKyAgLy8gQXNzaWdubWVudAorICBTcGFyc2VCaXRWZWN0b3ImIG9wZXJhdG9yPShjb25zdCBTcGFyc2VCaXRWZWN0b3ImIFJIUykgeworICAgIGlmICh0aGlzID09ICZSSFMpCisgICAgICByZXR1cm4gKnRoaXM7CisKKyAgICBFbGVtZW50cy5jbGVhcigpOworCisgICAgRWxlbWVudExpc3RDb25zdEl0ZXIgRWxlbWVudEl0ZXIgPSBSSFMuRWxlbWVudHMuYmVnaW4oKTsKKyAgICB3aGlsZSAoRWxlbWVudEl0ZXIgIT0gUkhTLkVsZW1lbnRzLmVuZCgpKSB7CisgICAgICBFbGVtZW50cy5wdXNoX2JhY2soU3BhcnNlQml0VmVjdG9yRWxlbWVudDxFbGVtZW50U2l6ZT4oKkVsZW1lbnRJdGVyKSk7CisgICAgICArK0VsZW1lbnRJdGVyOworICAgIH0KKworICAgIEN1cnJFbGVtZW50SXRlciA9IEVsZW1lbnRzLmJlZ2luICgpOworCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gVGVzdCwgUmVzZXQsIGFuZCBTZXQgYSBiaXQgaW4gdGhlIGJpdG1hcC4KKyAgYm9vbCB0ZXN0KHVuc2lnbmVkIElkeCkgeworICAgIGlmIChFbGVtZW50cy5lbXB0eSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgRWxlbWVudEluZGV4ID0gSWR4IC8gRWxlbWVudFNpemU7CisgICAgRWxlbWVudExpc3RJdGVyIEVsZW1lbnRJdGVyID0gRmluZExvd2VyQm91bmQoRWxlbWVudEluZGV4KTsKKworICAgIC8vIElmIHdlIGNhbid0IGZpbmQgYW4gZWxlbWVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGNvbnRhaW4gdGhpcyBiaXQsIHRoZXJlCisgICAgLy8gaXMgbm90aGluZyBtb3JlIHRvIGRvLgorICAgIGlmIChFbGVtZW50SXRlciA9PSBFbGVtZW50cy5lbmQoKSB8fAorICAgICAgICBFbGVtZW50SXRlci0+aW5kZXgoKSAhPSBFbGVtZW50SW5kZXgpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEVsZW1lbnRJdGVyLT50ZXN0KElkeCAlIEVsZW1lbnRTaXplKTsKKyAgfQorCisgIHZvaWQgcmVzZXQodW5zaWduZWQgSWR4KSB7CisgICAgaWYgKEVsZW1lbnRzLmVtcHR5KCkpCisgICAgICByZXR1cm47CisKKyAgICB1bnNpZ25lZCBFbGVtZW50SW5kZXggPSBJZHggLyBFbGVtZW50U2l6ZTsKKyAgICBFbGVtZW50TGlzdEl0ZXIgRWxlbWVudEl0ZXIgPSBGaW5kTG93ZXJCb3VuZChFbGVtZW50SW5kZXgpOworCisgICAgLy8gSWYgd2UgY2FuJ3QgZmluZCBhbiBlbGVtZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gY29udGFpbiB0aGlzIGJpdCwgdGhlcmUKKyAgICAvLyBpcyBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgaWYgKEVsZW1lbnRJdGVyID09IEVsZW1lbnRzLmVuZCgpIHx8CisgICAgICAgIEVsZW1lbnRJdGVyLT5pbmRleCgpICE9IEVsZW1lbnRJbmRleCkKKyAgICAgIHJldHVybjsKKyAgICBFbGVtZW50SXRlci0+cmVzZXQoSWR4ICUgRWxlbWVudFNpemUpOworCisgICAgLy8gV2hlbiB0aGUgZWxlbWVudCBpcyB6ZXJvZWQgb3V0LCBkZWxldGUgaXQuCisgICAgaWYgKEVsZW1lbnRJdGVyLT5lbXB0eSgpKSB7CisgICAgICArK0N1cnJFbGVtZW50SXRlcjsKKyAgICAgIEVsZW1lbnRzLmVyYXNlKEVsZW1lbnRJdGVyKTsKKyAgICB9CisgIH0KKworICB2b2lkIHNldCh1bnNpZ25lZCBJZHgpIHsKKyAgICB1bnNpZ25lZCBFbGVtZW50SW5kZXggPSBJZHggLyBFbGVtZW50U2l6ZTsKKyAgICBFbGVtZW50TGlzdEl0ZXIgRWxlbWVudEl0ZXI7CisgICAgaWYgKEVsZW1lbnRzLmVtcHR5KCkpIHsKKyAgICAgIEVsZW1lbnRJdGVyID0gRWxlbWVudHMuZW1wbGFjZShFbGVtZW50cy5lbmQoKSwgRWxlbWVudEluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgRWxlbWVudEl0ZXIgPSBGaW5kTG93ZXJCb3VuZChFbGVtZW50SW5kZXgpOworCisgICAgICBpZiAoRWxlbWVudEl0ZXIgPT0gRWxlbWVudHMuZW5kKCkgfHwKKyAgICAgICAgICBFbGVtZW50SXRlci0+aW5kZXgoKSAhPSBFbGVtZW50SW5kZXgpIHsKKyAgICAgICAgLy8gV2UgbWF5IGhhdmUgaGl0IHRoZSBiZWdpbm5pbmcgb2Ygb3VyIFNwYXJzZUJpdFZlY3RvciwgaW4gd2hpY2ggY2FzZSwKKyAgICAgICAgLy8gd2UgbWF5IG5lZWQgdG8gaW5zZXJ0IHJpZ2h0IGFmdGVyIHRoaXMgZWxlbWVudCwgd2hpY2ggcmVxdWlyZXMgbW92aW5nCisgICAgICAgIC8vIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGZvcndhcmQgb25lLCBiZWNhdXNlIGluc2VydCBkb2VzIGluc2VydCBiZWZvcmUuCisgICAgICAgIGlmIChFbGVtZW50SXRlciAhPSBFbGVtZW50cy5lbmQoKSAmJgorICAgICAgICAgICAgRWxlbWVudEl0ZXItPmluZGV4KCkgPCBFbGVtZW50SW5kZXgpCisgICAgICAgICAgKytFbGVtZW50SXRlcjsKKyAgICAgICAgRWxlbWVudEl0ZXIgPSBFbGVtZW50cy5lbXBsYWNlKEVsZW1lbnRJdGVyLCBFbGVtZW50SW5kZXgpOworICAgICAgfQorICAgIH0KKyAgICBDdXJyRWxlbWVudEl0ZXIgPSBFbGVtZW50SXRlcjsKKworICAgIEVsZW1lbnRJdGVyLT5zZXQoSWR4ICUgRWxlbWVudFNpemUpOworICB9CisKKyAgYm9vbCB0ZXN0X2FuZF9zZXQodW5zaWduZWQgSWR4KSB7CisgICAgYm9vbCBvbGQgPSB0ZXN0KElkeCk7CisgICAgaWYgKCFvbGQpIHsKKyAgICAgIHNldChJZHgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTcGFyc2VCaXRWZWN0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IFJIUyk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgU3BhcnNlQml0VmVjdG9yICZSSFMpIGNvbnN0IHsKKyAgICBFbGVtZW50TGlzdENvbnN0SXRlciBJdGVyMSA9IEVsZW1lbnRzLmJlZ2luKCk7CisgICAgRWxlbWVudExpc3RDb25zdEl0ZXIgSXRlcjIgPSBSSFMuRWxlbWVudHMuYmVnaW4oKTsKKworICAgIGZvciAoOyBJdGVyMSAhPSBFbGVtZW50cy5lbmQoKSAmJiBJdGVyMiAhPSBSSFMuRWxlbWVudHMuZW5kKCk7CisgICAgICAgICArK0l0ZXIxLCArK0l0ZXIyKSB7CisgICAgICBpZiAoKkl0ZXIxICE9ICpJdGVyMikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gSXRlcjEgPT0gRWxlbWVudHMuZW5kKCkgJiYgSXRlcjIgPT0gUkhTLkVsZW1lbnRzLmVuZCgpOworICB9CisKKyAgLy8gVW5pb24gb3VyIGJpdG1hcCB3aXRoIHRoZSBSSFMgYW5kIHJldHVybiB0cnVlIGlmIHdlIGNoYW5nZWQuCisgIGJvb2wgb3BlcmF0b3J8PShjb25zdCBTcGFyc2VCaXRWZWN0b3IgJlJIUykgeworICAgIGlmICh0aGlzID09ICZSSFMpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICBFbGVtZW50TGlzdEl0ZXIgSXRlcjEgPSBFbGVtZW50cy5iZWdpbigpOworICAgIEVsZW1lbnRMaXN0Q29uc3RJdGVyIEl0ZXIyID0gUkhTLkVsZW1lbnRzLmJlZ2luKCk7CisKKyAgICAvLyBJZiBSSFMgaXMgZW1wdHksIHdlIGFyZSBkb25lCisgICAgaWYgKFJIUy5FbGVtZW50cy5lbXB0eSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgd2hpbGUgKEl0ZXIyICE9IFJIUy5FbGVtZW50cy5lbmQoKSkgeworICAgICAgaWYgKEl0ZXIxID09IEVsZW1lbnRzLmVuZCgpIHx8IEl0ZXIxLT5pbmRleCgpID4gSXRlcjItPmluZGV4KCkpIHsKKyAgICAgICAgRWxlbWVudHMuaW5zZXJ0KEl0ZXIxLCAqSXRlcjIpOworICAgICAgICArK0l0ZXIyOworICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoSXRlcjEtPmluZGV4KCkgPT0gSXRlcjItPmluZGV4KCkpIHsKKyAgICAgICAgY2hhbmdlZCB8PSBJdGVyMS0+dW5pb25XaXRoKCpJdGVyMik7CisgICAgICAgICsrSXRlcjE7CisgICAgICAgICsrSXRlcjI7CisgICAgICB9IGVsc2UgeworICAgICAgICArK0l0ZXIxOworICAgICAgfQorICAgIH0KKyAgICBDdXJyRWxlbWVudEl0ZXIgPSBFbGVtZW50cy5iZWdpbigpOworICAgIHJldHVybiBjaGFuZ2VkOworICB9CisKKyAgLy8gSW50ZXJzZWN0IG91ciBiaXRtYXAgd2l0aCB0aGUgUkhTIGFuZCByZXR1cm4gdHJ1ZSBpZiBvdXJzIGNoYW5nZWQuCisgIGJvb2wgb3BlcmF0b3ImPShjb25zdCBTcGFyc2VCaXRWZWN0b3IgJlJIUykgeworICAgIGlmICh0aGlzID09ICZSSFMpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICBFbGVtZW50TGlzdEl0ZXIgSXRlcjEgPSBFbGVtZW50cy5iZWdpbigpOworICAgIEVsZW1lbnRMaXN0Q29uc3RJdGVyIEl0ZXIyID0gUkhTLkVsZW1lbnRzLmJlZ2luKCk7CisKKyAgICAvLyBDaGVjayBpZiBib3RoIGJpdG1hcHMgYXJlIGVtcHR5LgorICAgIGlmIChFbGVtZW50cy5lbXB0eSgpICYmIFJIUy5FbGVtZW50cy5lbXB0eSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gTG9vcCB0aHJvdWdoLCBpbnRlcnNlY3RpbmcgYXMgd2UgZ28sIGVyYXNpbmcgZWxlbWVudHMgd2hlbiBuZWNlc3NhcnkuCisgICAgd2hpbGUgKEl0ZXIyICE9IFJIUy5FbGVtZW50cy5lbmQoKSkgeworICAgICAgaWYgKEl0ZXIxID09IEVsZW1lbnRzLmVuZCgpKSB7CisgICAgICAgIEN1cnJFbGVtZW50SXRlciA9IEVsZW1lbnRzLmJlZ2luKCk7CisgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgICAgfQorCisgICAgICBpZiAoSXRlcjEtPmluZGV4KCkgPiBJdGVyMi0+aW5kZXgoKSkgeworICAgICAgICArK0l0ZXIyOworICAgICAgfSBlbHNlIGlmIChJdGVyMS0+aW5kZXgoKSA9PSBJdGVyMi0+aW5kZXgoKSkgeworICAgICAgICBib29sIEJlY2FtZVplcm87CisgICAgICAgIGNoYW5nZWQgfD0gSXRlcjEtPmludGVyc2VjdFdpdGgoKkl0ZXIyLCBCZWNhbWVaZXJvKTsKKyAgICAgICAgaWYgKEJlY2FtZVplcm8pIHsKKyAgICAgICAgICBFbGVtZW50TGlzdEl0ZXIgSXRlclRtcCA9IEl0ZXIxOworICAgICAgICAgICsrSXRlcjE7CisgICAgICAgICAgRWxlbWVudHMuZXJhc2UoSXRlclRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKytJdGVyMTsKKyAgICAgICAgfQorICAgICAgICArK0l0ZXIyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRWxlbWVudExpc3RJdGVyIEl0ZXJUbXAgPSBJdGVyMTsKKyAgICAgICAgKytJdGVyMTsKKyAgICAgICAgRWxlbWVudHMuZXJhc2UoSXRlclRtcCk7CisgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgICBpZiAoSXRlcjEgIT0gRWxlbWVudHMuZW5kKCkpIHsKKyAgICAgIEVsZW1lbnRzLmVyYXNlKEl0ZXIxLCBFbGVtZW50cy5lbmQoKSk7CisgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgICAgQ3VyckVsZW1lbnRJdGVyID0gRWxlbWVudHMuYmVnaW4oKTsKKyAgICByZXR1cm4gY2hhbmdlZDsKKyAgfQorCisgIC8vIEludGVyc2VjdCBvdXIgYml0bWFwIHdpdGggdGhlIGNvbXBsZW1lbnQgb2YgdGhlIFJIUyBhbmQgcmV0dXJuIHRydWUKKyAgLy8gaWYgb3VycyBjaGFuZ2VkLgorICBib29sIGludGVyc2VjdFdpdGhDb21wbGVtZW50KGNvbnN0IFNwYXJzZUJpdFZlY3RvciAmUkhTKSB7CisgICAgaWYgKHRoaXMgPT0gJlJIUykgeworICAgICAgaWYgKCFlbXB0eSgpKSB7CisgICAgICAgIGNsZWFyKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgIEVsZW1lbnRMaXN0SXRlciBJdGVyMSA9IEVsZW1lbnRzLmJlZ2luKCk7CisgICAgRWxlbWVudExpc3RDb25zdEl0ZXIgSXRlcjIgPSBSSFMuRWxlbWVudHMuYmVnaW4oKTsKKworICAgIC8vIElmIGVpdGhlciBvdXIgYml0bWFwIG9yIFJIUyBpcyBlbXB0eSwgd2UgYXJlIGRvbmUKKyAgICBpZiAoRWxlbWVudHMuZW1wdHkoKSB8fCBSSFMuRWxlbWVudHMuZW1wdHkoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIExvb3AgdGhyb3VnaCwgaW50ZXJzZWN0aW5nIGFzIHdlIGdvLCBlcmFzaW5nIGVsZW1lbnRzIHdoZW4gbmVjZXNzYXJ5LgorICAgIHdoaWxlIChJdGVyMiAhPSBSSFMuRWxlbWVudHMuZW5kKCkpIHsKKyAgICAgIGlmIChJdGVyMSA9PSBFbGVtZW50cy5lbmQoKSkgeworICAgICAgICBDdXJyRWxlbWVudEl0ZXIgPSBFbGVtZW50cy5iZWdpbigpOworICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAgICAgIH0KKworICAgICAgaWYgKEl0ZXIxLT5pbmRleCgpID4gSXRlcjItPmluZGV4KCkpIHsKKyAgICAgICAgKytJdGVyMjsKKyAgICAgIH0gZWxzZSBpZiAoSXRlcjEtPmluZGV4KCkgPT0gSXRlcjItPmluZGV4KCkpIHsKKyAgICAgICAgYm9vbCBCZWNhbWVaZXJvOworICAgICAgICBjaGFuZ2VkIHw9IEl0ZXIxLT5pbnRlcnNlY3RXaXRoQ29tcGxlbWVudCgqSXRlcjIsIEJlY2FtZVplcm8pOworICAgICAgICBpZiAoQmVjYW1lWmVybykgeworICAgICAgICAgIEVsZW1lbnRMaXN0SXRlciBJdGVyVG1wID0gSXRlcjE7CisgICAgICAgICAgKytJdGVyMTsKKyAgICAgICAgICBFbGVtZW50cy5lcmFzZShJdGVyVG1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICArK0l0ZXIxOworICAgICAgICB9CisgICAgICAgICsrSXRlcjI7CisgICAgICB9IGVsc2UgeworICAgICAgICArK0l0ZXIxOworICAgICAgfQorICAgIH0KKyAgICBDdXJyRWxlbWVudEl0ZXIgPSBFbGVtZW50cy5iZWdpbigpOworICAgIHJldHVybiBjaGFuZ2VkOworICB9CisKKyAgYm9vbCBpbnRlcnNlY3RXaXRoQ29tcGxlbWVudChjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJzZWN0V2l0aENvbXBsZW1lbnQoKlJIUyk7CisgIH0KKworICAvLyAgVGhyZWUgYXJndW1lbnQgdmVyc2lvbiBvZiBpbnRlcnNlY3RXaXRoQ29tcGxlbWVudC4KKyAgLy8gIFJlc3VsdCBvZiBSSFMxICYgflJIUzIgaXMgc3RvcmVkIGludG8gdGhpcyBiaXRtYXAuCisgIHZvaWQgaW50ZXJzZWN0V2l0aENvbXBsZW1lbnQoY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmUkhTMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICZSSFMyKQorICB7CisgICAgaWYgKHRoaXMgPT0gJlJIUzEpIHsKKyAgICAgIGludGVyc2VjdFdpdGhDb21wbGVtZW50KFJIUzIpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAodGhpcyA9PSAmUkhTMikgeworICAgICAgU3BhcnNlQml0VmVjdG9yIFJIUzJDb3B5KFJIUzIpOworICAgICAgaW50ZXJzZWN0V2l0aENvbXBsZW1lbnQoUkhTMSwgUkhTMkNvcHkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEVsZW1lbnRzLmNsZWFyKCk7CisgICAgQ3VyckVsZW1lbnRJdGVyID0gRWxlbWVudHMuYmVnaW4oKTsKKyAgICBFbGVtZW50TGlzdENvbnN0SXRlciBJdGVyMSA9IFJIUzEuRWxlbWVudHMuYmVnaW4oKTsKKyAgICBFbGVtZW50TGlzdENvbnN0SXRlciBJdGVyMiA9IFJIUzIuRWxlbWVudHMuYmVnaW4oKTsKKworICAgIC8vIElmIFJIUzEgaXMgZW1wdHksIHdlIGFyZSBkb25lCisgICAgLy8gSWYgUkhTMiBpcyBlbXB0eSwgd2Ugc3RpbGwgaGF2ZSB0byBjb3B5IFJIUzEKKyAgICBpZiAoUkhTMS5FbGVtZW50cy5lbXB0eSgpKQorICAgICAgcmV0dXJuOworCisgICAgLy8gTG9vcCB0aHJvdWdoLCBpbnRlcnNlY3RpbmcgYXMgd2UgZ28sIGVyYXNpbmcgZWxlbWVudHMgd2hlbiBuZWNlc3NhcnkuCisgICAgd2hpbGUgKEl0ZXIyICE9IFJIUzIuRWxlbWVudHMuZW5kKCkpIHsKKyAgICAgIGlmIChJdGVyMSA9PSBSSFMxLkVsZW1lbnRzLmVuZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAgIGlmIChJdGVyMS0+aW5kZXgoKSA+IEl0ZXIyLT5pbmRleCgpKSB7CisgICAgICAgICsrSXRlcjI7CisgICAgICB9IGVsc2UgaWYgKEl0ZXIxLT5pbmRleCgpID09IEl0ZXIyLT5pbmRleCgpKSB7CisgICAgICAgIGJvb2wgQmVjYW1lWmVybyA9IGZhbHNlOworICAgICAgICBFbGVtZW50cy5lbXBsYWNlX2JhY2soSXRlcjEtPmluZGV4KCkpOworICAgICAgICBFbGVtZW50cy5iYWNrKCkuaW50ZXJzZWN0V2l0aENvbXBsZW1lbnQoKkl0ZXIxLCAqSXRlcjIsIEJlY2FtZVplcm8pOworICAgICAgICBpZiAoQmVjYW1lWmVybykKKyAgICAgICAgICBFbGVtZW50cy5wb3BfYmFjaygpOworICAgICAgICArK0l0ZXIxOworICAgICAgICArK0l0ZXIyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRWxlbWVudHMucHVzaF9iYWNrKCpJdGVyMSsrKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjb3B5IHRoZSByZW1haW5pbmcgZWxlbWVudHMKKyAgICBzdGQ6OmNvcHkoSXRlcjEsIFJIUzEuRWxlbWVudHMuZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcihFbGVtZW50cykpOworICB9CisKKyAgdm9pZCBpbnRlcnNlY3RXaXRoQ29tcGxlbWVudChjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICpSSFMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gKlJIUzIpIHsKKyAgICBpbnRlcnNlY3RXaXRoQ29tcGxlbWVudCgqUkhTMSwgKlJIUzIpOworICB9CisKKyAgYm9vbCBpbnRlcnNlY3RzKGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gKlJIUykgY29uc3QgeworICAgIHJldHVybiBpbnRlcnNlY3RzKCpSSFMpOworICB9CisKKyAgLy8gUmV0dXJuIHRydWUgaWYgd2Ugc2hhcmUgYW55IGJpdHMgaW4gY29tbW9uIHdpdGggUkhTCisgIGJvb2wgaW50ZXJzZWN0cyhjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICZSSFMpIGNvbnN0IHsKKyAgICBFbGVtZW50TGlzdENvbnN0SXRlciBJdGVyMSA9IEVsZW1lbnRzLmJlZ2luKCk7CisgICAgRWxlbWVudExpc3RDb25zdEl0ZXIgSXRlcjIgPSBSSFMuRWxlbWVudHMuYmVnaW4oKTsKKworICAgIC8vIENoZWNrIGlmIGJvdGggYml0bWFwcyBhcmUgZW1wdHkuCisgICAgaWYgKEVsZW1lbnRzLmVtcHR5KCkgJiYgUkhTLkVsZW1lbnRzLmVtcHR5KCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBMb29wIHRocm91Z2gsIGludGVyc2VjdGluZyBzdG9wcGluZyB3aGVuIHdlIGhpdCBiaXRzIGluIGNvbW1vbi4KKyAgICB3aGlsZSAoSXRlcjIgIT0gUkhTLkVsZW1lbnRzLmVuZCgpKSB7CisgICAgICBpZiAoSXRlcjEgPT0gRWxlbWVudHMuZW5kKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgaWYgKEl0ZXIxLT5pbmRleCgpID4gSXRlcjItPmluZGV4KCkpIHsKKyAgICAgICAgKytJdGVyMjsKKyAgICAgIH0gZWxzZSBpZiAoSXRlcjEtPmluZGV4KCkgPT0gSXRlcjItPmluZGV4KCkpIHsKKyAgICAgICAgaWYgKEl0ZXIxLT5pbnRlcnNlY3RzKCpJdGVyMikpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICsrSXRlcjE7CisgICAgICAgICsrSXRlcjI7CisgICAgICB9IGVsc2UgeworICAgICAgICArK0l0ZXIxOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBSZXR1cm4gdHJ1ZSBpZmYgYWxsIGJpdHMgc2V0IGluIHRoaXMgU3BhcnNlQml0VmVjdG9yIGFyZQorICAvLyBhbHNvIHNldCBpbiBSSFMuCisgIGJvb2wgY29udGFpbnMoY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmUkhTKSBjb25zdCB7CisgICAgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiBSZXN1bHQoKnRoaXMpOworICAgIFJlc3VsdCAmPSBSSFM7CisgICAgcmV0dXJuIChSZXN1bHQgPT0gUkhTKTsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgZmlyc3Qgc2V0IGJpdCBpbiB0aGUgYml0bWFwLiAgUmV0dXJuIC0xIGlmIG5vIGJpdHMgYXJlIHNldC4KKyAgaW50IGZpbmRfZmlyc3QoKSBjb25zdCB7CisgICAgaWYgKEVsZW1lbnRzLmVtcHR5KCkpCisgICAgICByZXR1cm4gLTE7CisgICAgY29uc3QgU3BhcnNlQml0VmVjdG9yRWxlbWVudDxFbGVtZW50U2l6ZT4gJkZpcnN0ID0gKihFbGVtZW50cy5iZWdpbigpKTsKKyAgICByZXR1cm4gKEZpcnN0LmluZGV4KCkgKiBFbGVtZW50U2l6ZSkgKyBGaXJzdC5maW5kX2ZpcnN0KCk7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIGxhc3Qgc2V0IGJpdCBpbiB0aGUgYml0bWFwLiAgUmV0dXJuIC0xIGlmIG5vIGJpdHMgYXJlIHNldC4KKyAgaW50IGZpbmRfbGFzdCgpIGNvbnN0IHsKKyAgICBpZiAoRWxlbWVudHMuZW1wdHkoKSkKKyAgICAgIHJldHVybiAtMTsKKyAgICBjb25zdCBTcGFyc2VCaXRWZWN0b3JFbGVtZW50PEVsZW1lbnRTaXplPiAmTGFzdCA9ICooRWxlbWVudHMucmJlZ2luKCkpOworICAgIHJldHVybiAoTGFzdC5pbmRleCgpICogRWxlbWVudFNpemUpICsgTGFzdC5maW5kX2xhc3QoKTsKKyAgfQorCisgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBTcGFyc2VCaXRWZWN0b3IgaXMgZW1wdHkKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRWxlbWVudHMuZW1wdHkoKTsKKyAgfQorCisgIHVuc2lnbmVkIGNvdW50KCkgY29uc3QgeworICAgIHVuc2lnbmVkIEJpdENvdW50ID0gMDsKKyAgICBmb3IgKEVsZW1lbnRMaXN0Q29uc3RJdGVyIEl0ZXIgPSBFbGVtZW50cy5iZWdpbigpOworICAgICAgICAgSXRlciAhPSBFbGVtZW50cy5lbmQoKTsKKyAgICAgICAgICsrSXRlcikKKyAgICAgIEJpdENvdW50ICs9IEl0ZXItPmNvdW50KCk7CisKKyAgICByZXR1cm4gQml0Q291bnQ7CisgIH0KKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gaXRlcmF0b3IodGhpcyk7CisgIH0KKworICBpdGVyYXRvciBlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGl0ZXJhdG9yKHRoaXMsIHRydWUpOworICB9Cit9OworCisvLyBDb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gYWxsb3cgT3IgYW5kIEFuZCB3aXRob3V0IGRlcmVmZXJlbmNpbmcgaW4gdGhlIHVzZXIKKy8vIGNvZGUuCisKK3RlbXBsYXRlIDx1bnNpZ25lZCBFbGVtZW50U2l6ZT4KK2lubGluZSBib29sIG9wZXJhdG9yIHw9KFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gKlJIUykgeworICByZXR1cm4gTEhTIHw9ICpSSFM7Cit9CisKK3RlbXBsYXRlIDx1bnNpZ25lZCBFbGVtZW50U2l6ZT4KK2lubGluZSBib29sIG9wZXJhdG9yIHw9KFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gJlJIUykgeworICByZXR1cm4gTEhTLT5vcGVyYXRvcnw9KFJIUyk7Cit9CisKK3RlbXBsYXRlIDx1bnNpZ25lZCBFbGVtZW50U2l6ZT4KK2lubGluZSBib29sIG9wZXJhdG9yICY9KFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gJlJIUykgeworICByZXR1cm4gTEhTLT5vcGVyYXRvciY9KFJIUyk7Cit9CisKK3RlbXBsYXRlIDx1bnNpZ25lZCBFbGVtZW50U2l6ZT4KK2lubGluZSBib29sIG9wZXJhdG9yICY9KFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gKlJIUykgeworICByZXR1cm4gTEhTICY9ICpSSFM7Cit9CisKKy8vIENvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgaW5maXggdW5pb24sIGludGVyc2VjdGlvbiwgZGlmZmVyZW5jZSBvcGVyYXRvcnMuCisKK3RlbXBsYXRlIDx1bnNpZ25lZCBFbGVtZW50U2l6ZT4KK2lubGluZSBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+CitvcGVyYXRvcnwoY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmTEhTLAorICAgICAgICAgIGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gJlJIUykgeworICBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+IFJlc3VsdChMSFMpOworICBSZXN1bHQgfD0gUkhTOworICByZXR1cm4gUmVzdWx0OworfQorCit0ZW1wbGF0ZSA8dW5zaWduZWQgRWxlbWVudFNpemU+CitpbmxpbmUgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPgorb3BlcmF0b3ImKGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gJkxIUywKKyAgICAgICAgICBjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICZSSFMpIHsKKyAgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiBSZXN1bHQoTEhTKTsKKyAgUmVzdWx0ICY9IFJIUzsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKwordGVtcGxhdGUgPHVuc2lnbmVkIEVsZW1lbnRTaXplPgoraW5saW5lIFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4KK29wZXJhdG9yLShjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICZMSFMsCisgICAgICAgICAgY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmUkhTKSB7CisgIFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gUmVzdWx0OworICBSZXN1bHQuaW50ZXJzZWN0V2l0aENvbXBsZW1lbnQoTEhTLCBSSFMpOworICByZXR1cm4gUmVzdWx0OworfQorCisvLyBEdW1wIGEgU3BhcnNlQml0VmVjdG9yIHRvIGEgc3RyZWFtCit0ZW1wbGF0ZSA8dW5zaWduZWQgRWxlbWVudFNpemU+Cit2b2lkIGR1bXAoY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmTEhTLCByYXdfb3N0cmVhbSAmb3V0KSB7CisgIG91dCA8PCAiWyI7CisKKyAgdHlwZW5hbWUgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPjo6aXRlcmF0b3IgYmkgPSBMSFMuYmVnaW4oKSwKKyAgICBiZSA9IExIUy5lbmQoKTsKKyAgaWYgKGJpICE9IGJlKSB7CisgICAgb3V0IDw8ICpiaTsKKyAgICBmb3IgKCsrYmk7IGJpICE9IGJlOyArK2JpKSB7CisgICAgICBvdXQgPDwgIiAiIDw8ICpiaTsKKyAgICB9CisgIH0KKyAgb3V0IDw8ICJdXG4iOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfU1BBUlNFQklUVkVDVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NwYXJzZU11bHRpU2V0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TcGFyc2VNdWx0aVNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjODYzNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TcGFyc2VNdWx0aVNldC5oCkBAIC0wLDAgKzEsNTIzIEBACisvLz09PS0gbGx2bS9BRFQvU3BhcnNlTXVsdGlTZXQuaCAtIFNwYXJzZSBtdWx0aXNldCAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBTcGFyc2VNdWx0aVNldCBjbGFzcywgd2hpY2ggYWRkcyBtdWx0aXNldCBiZWhhdmlvciB0bworLy8gdGhlIFNwYXJzZVNldC4KKy8vCisvLyBBIHNwYXJzZSBtdWx0aXNldCBob2xkcyBhIHNtYWxsIG51bWJlciBvZiBvYmplY3RzIGlkZW50aWZpZWQgYnkgaW50ZWdlciBrZXlzCisvLyBmcm9tIGEgbW9kZXJhdGVseSBzaXplZCB1bml2ZXJzZS4gVGhlIHNwYXJzZSBtdWx0aXNldCB1c2VzIG1vcmUgbWVtb3J5IHRoYW4KKy8vIG90aGVyIGNvbnRhaW5lcnMgaW4gb3JkZXIgdG8gcHJvdmlkZSBmYXN0ZXIgb3BlcmF0aW9ucy4gQW55IGtleSBjYW4gbWFwIHRvCisvLyBtdWx0aXBsZSB2YWx1ZXMuIEEgU3BhcnNlTXVsdGlTZXROb2RlIGNsYXNzIGlzIHByb3ZpZGVkLCB3aGljaCBzZXJ2ZXMgYXMgYQorLy8gY29udmVuaWVudCBiYXNlIGNsYXNzIGZvciB0aGUgY29udGVudHMgb2YgYSBTcGFyc2VNdWx0aVNldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NQQVJTRU1VTFRJU0VUX0gKKyNkZWZpbmUgTExWTV9BRFRfU1BBUlNFTVVMVElTRVRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TcGFyc2VTZXQuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gRmFzdCBtdWx0aXNldCBpbXBsZW1lbnRhdGlvbiBmb3Igb2JqZWN0cyB0aGF0IGNhbiBiZSBpZGVudGlmaWVkIGJ5IHNtYWxsCisvLy8gdW5zaWduZWQga2V5cy4KKy8vLworLy8vIFNwYXJzZU11bHRpU2V0IGFsbG9jYXRlcyBtZW1vcnkgcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBrZXkKKy8vLyB1bml2ZXJzZSwgc28gaXQgaXMgbm90IHJlY29tbWVuZGVkIGZvciBidWlsZGluZyBjb21wb3NpdGUgZGF0YSBzdHJ1Y3R1cmVzLgorLy8vIEl0IGlzIHVzZWZ1bCBmb3IgYWxnb3JpdGhtcyB0aGF0IHJlcXVpcmUgYSBzaW5nbGUgc2V0IHdpdGggZmFzdCBvcGVyYXRpb25zLgorLy8vCisvLy8gQ29tcGFyZWQgdG8gRGVuc2VTZXQgYW5kIERlbnNlTWFwLCBTcGFyc2VNdWx0aVNldCBwcm92aWRlcyBjb25zdGFudC10aW1lCisvLy8gZmFzdCBjbGVhcigpIGFzIGZhc3QgYXMgYSB2ZWN0b3IuICBUaGUgZmluZCgpLCBpbnNlcnQoKSwgYW5kIGVyYXNlKCkKKy8vLyBvcGVyYXRpb25zIGFyZSBhbGwgY29uc3RhbnQgdGltZSwgYW5kIHR5cGljYWxseSBmYXN0ZXIgdGhhbiBhIGhhc2ggdGFibGUuCisvLy8gVGhlIGl0ZXJhdGlvbiBvcmRlciBkb2Vzbid0IGRlcGVuZCBvbiBudW1lcmljYWwga2V5IHZhbHVlcywgaXQgb25seSBkZXBlbmRzCisvLy8gb24gdGhlIG9yZGVyIG9mIGluc2VydCgpIGFuZCBlcmFzZSgpIG9wZXJhdGlvbnMuICBJdGVyYXRpb24gb3JkZXIgaXMgdGhlCisvLy8gaW5zZXJ0aW9uIG9yZGVyLiBJdGVyYXRpb24gaXMgb25seSBwcm92aWRlZCBvdmVyIGVsZW1lbnRzIG9mIGVxdWl2YWxlbnQKKy8vLyBrZXlzLCBidXQgaXRlcmF0b3JzIGFyZSBiaWRpcmVjdGlvbmFsLgorLy8vCisvLy8gQ29tcGFyZWQgdG8gQml0VmVjdG9yLCBTcGFyc2VNdWx0aVNldDx1bnNpZ25lZD4gdXNlcyA4eC00MHggbW9yZSBtZW1vcnksIGJ1dAorLy8vIG9mZmVycyBjb25zdGFudC10aW1lIGNsZWFyKCkgYW5kIHNpemUoKSBvcGVyYXRpb25zIGFzIHdlbGwgYXMgZmFzdCBpdGVyYXRpb24KKy8vLyBpbmRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgdW5pdmVyc2UuCisvLy8KKy8vLyBTcGFyc2VNdWx0aVNldCBjb250YWlucyBhIGRlbnNlIHZlY3RvciBob2xkaW5nIGFsbCB0aGUgb2JqZWN0cyBhbmQgYSBzcGFyc2UKKy8vLyBhcnJheSBob2xkaW5nIGluZGV4ZXMgaW50byB0aGUgZGVuc2UgdmVjdG9yLiAgTW9zdCBvZiB0aGUgbWVtb3J5IGlzIHVzZWQgYnkKKy8vLyB0aGUgc3BhcnNlIGFycmF5IHdoaWNoIGlzIHRoZSBzaXplIG9mIHRoZSBrZXkgdW5pdmVyc2UuIFRoZSBTcGFyc2VUIHRlbXBsYXRlCisvLy8gcGFyYW1ldGVyIHByb3ZpZGVzIGEgc3BhY2Uvc3BlZWQgdHJhZGVvZmYgZm9yIHNldHMgaG9sZGluZyBtYW55IGVsZW1lbnRzLgorLy8vCisvLy8gV2hlbiBTcGFyc2VUIGlzIHVpbnQzMl90LCBmaW5kKCkgb25seSB0b3VjaGVzIHVwIHRvIDMgY2FjaGUgbGluZXMsIGJ1dCB0aGUKKy8vLyBzcGFyc2UgYXJyYXkgdXNlcyA0IHggVW5pdmVyc2UgYnl0ZXMuCisvLy8KKy8vLyBXaGVuIFNwYXJzZVQgaXMgdWludDhfdCAodGhlIGRlZmF1bHQpLCBmaW5kKCkgdG91Y2hlcyB1cCB0byAzK1tOLzI1Nl0gY2FjaGUKKy8vLyBsaW5lcywgYnV0IHRoZSBzcGFyc2UgYXJyYXkgaXMgNHggc21hbGxlci4gIE4gaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbgorLy8vIHRoZSBzZXQuCisvLy8KKy8vLyBGb3Igc2V0cyB0aGF0IG1heSBncm93IHRvIHRob3VzYW5kcyBvZiBlbGVtZW50cywgU3BhcnNlVCBzaG91bGQgYmUgc2V0IHRvCisvLy8gdWludDE2X3Qgb3IgdWludDMyX3QuCisvLy8KKy8vLyBNdWx0aXNldCBiZWhhdmlvciBpcyBwcm92aWRlZCBieSBwcm92aWRpbmcgZG91Ymx5IGxpbmtlZCBsaXN0cyBmb3IgdmFsdWVzCisvLy8gdGhhdCBhcmUgaW5saW5lZCBpbiB0aGUgZGVuc2UgdmVjdG9yLiBTcGFyc2VNdWx0aVNldCBpcyBhIGdvb2QgY2hvaWNlIHdoZW4KKy8vLyBvbmUgZGVzaXJlcyBhIGdyb3dhYmxlIG51bWJlciBvZiBlbnRyaWVzIHBlciBrZXksIGFzIGl0IHdpbGwgcmV0YWluIHRoZQorLy8vIFNwYXJzZVNldCBhbGdvcml0aG1pYyBwcm9wZXJ0aWVzIGRlc3BpdGUgYmVpbmcgZ3Jvd2FibGUuIFRodXMsIGl0IGlzIG9mdGVuIGEKKy8vLyBiZXR0ZXIgY2hvaWNlIHRoYW4gYSBTcGFyc2VTZXQgb2YgZ3Jvd2FibGUgY29udGFpbmVycyBvciBhIHZlY3RvciBvZgorLy8vIHZlY3RvcnMuIFNwYXJzZU11bHRpU2V0IGFsc28ga2VlcHMgaXRlcmF0b3JzIHZhbGlkIGFmdGVyIGVyYXN1cmUgKHByb3ZpZGVkCisvLy8gdGhlIGl0ZXJhdG9ycyBkb24ndCBwb2ludCB0byB0aGUgZWxlbWVudCBlcmFzZWQpLCBhbGxvd2luZyBmb3IgbW9yZQorLy8vIGludHVpdGl2ZSBhbmQgZmFzdCByZW1vdmFsLgorLy8vCisvLy8gQHRwYXJhbSBWYWx1ZVQgICAgICBUaGUgdHlwZSBvZiBvYmplY3RzIGluIHRoZSBzZXQuCisvLy8gQHRwYXJhbSBLZXlGdW5jdG9yVCBBIGZ1bmN0b3IgdGhhdCBjb21wdXRlcyBhbiB1bnNpZ25lZCBpbmRleCBmcm9tIEtleVQuCisvLy8gQHRwYXJhbSBTcGFyc2VUICAgICBBbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuIFNlZSBhYm92ZS4KKy8vLwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVULAorICAgICAgICAgdHlwZW5hbWUgS2V5RnVuY3RvclQgPSBpZGVudGl0eTx1bnNpZ25lZD4sCisgICAgICAgICB0eXBlbmFtZSBTcGFyc2VUID0gdWludDhfdD4KK2NsYXNzIFNwYXJzZU11bHRpU2V0IHsKKyAgc3RhdGljX2Fzc2VydChzdGQ6Om51bWVyaWNfbGltaXRzPFNwYXJzZVQ+Ojppc19pbnRlZ2VyICYmCisgICAgICAgICAgICAgICAgIXN0ZDo6bnVtZXJpY19saW1pdHM8U3BhcnNlVD46OmlzX3NpZ25lZCwKKyAgICAgICAgICAgICAgICAiU3BhcnNlVCBtdXN0IGJlIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSIpOworCisgIC8vLyBUaGUgYWN0dWFsIGRhdGEgdGhhdCdzIHN0b3JlZCwgYXMgYSBkb3VibHktbGlua2VkIGxpc3QgaW1wbGVtZW50ZWQgdmlhCisgIC8vLyBpbmRpY2VzIGludG8gdGhlIERlbnNlVmVjdG9yLiAgVGhlIGRvdWJseSBsaW5rZWQgbGlzdCBpcyBpbXBsZW1lbnRlZAorICAvLy8gY2lyY3VsYXIgaW4gUHJldiBpbmRpY2VzLCBhbmQgSU5WQUxJRC10ZXJtaW5hdGVkIGluIE5leHQgaW5kaWNlcy4gVGhpcworICAvLy8gcHJvdmlkZXMgZWZmaWNpZW50IGFjY2VzcyB0byBsaXN0IHRhaWxzLiBUaGVzZSBub2RlcyBjYW4gYWxzbyBiZQorICAvLy8gdG9tYnN0b25lcywgaW4gd2hpY2ggY2FzZSB0aGV5IGFyZSBhY3R1YWxseSBub2RlcyBpbiBhIHNpbmdsZS1saW5rZWQKKyAgLy8vIGZyZWVsaXN0IG9mIHJlY3ljbGFibGUgc2xvdHMuCisgIHN0cnVjdCBTTVNOb2RlIHsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgSU5WQUxJRCA9IH4wVTsKKworICAgIFZhbHVlVCBEYXRhOworICAgIHVuc2lnbmVkIFByZXY7CisgICAgdW5zaWduZWQgTmV4dDsKKworICAgIFNNU05vZGUoVmFsdWVUIEQsIHVuc2lnbmVkIFAsIHVuc2lnbmVkIE4pIDogRGF0YShEKSwgUHJldihQKSwgTmV4dChOKSB7fQorCisgICAgLy8vIExpc3QgdGFpbHMgaGF2ZSBpbnZhbGlkIE5leHRzLgorICAgIGJvb2wgaXNUYWlsKCkgY29uc3QgeworICAgICAgcmV0dXJuIE5leHQgPT0gSU5WQUxJRDsKKyAgICB9CisKKyAgICAvLy8gV2hldGhlciB0aGlzIG5vZGUgaXMgYSB0b21ic3RvbmUgbm9kZSwgYW5kIHRodXMgaXMgaW4gb3VyIGZyZWVsaXN0LgorICAgIGJvb2wgaXNUb21ic3RvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gUHJldiA9PSBJTlZBTElEOworICAgIH0KKworICAgIC8vLyBTaW5jZSB0aGUgbGlzdCBpcyBjaXJjdWxhciBpbiBQcmV2LCBhbGwgbm9uLXRvbWJzdG9uZSBub2RlcyBoYXZlIGEgdmFsaWQKKyAgICAvLy8gUHJldi4KKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBQcmV2ICE9IElOVkFMSUQ7IH0KKyAgfTsKKworICB1c2luZyBLZXlUID0gdHlwZW5hbWUgS2V5RnVuY3RvclQ6OmFyZ3VtZW50X3R5cGU7CisgIHVzaW5nIERlbnNlVCA9IFNtYWxsVmVjdG9yPFNNU05vZGUsIDg+OworICBEZW5zZVQgRGVuc2U7CisgIFNwYXJzZVQgKlNwYXJzZSA9IG51bGxwdHI7CisgIHVuc2lnbmVkIFVuaXZlcnNlID0gMDsKKyAgS2V5RnVuY3RvclQgS2V5SW5kZXhPZjsKKyAgU3BhcnNlU2V0VmFsRnVuY3RvcjxLZXlULCBWYWx1ZVQsIEtleUZ1bmN0b3JUPiBWYWxJbmRleE9mOworCisgIC8vLyBXZSBoYXZlIGEgYnVpbHQtaW4gcmVjeWNsZXIgZm9yIHJldXNpbmcgdG9tYnN0b25lIHNsb3RzLiBUaGlzIHJlY3ljbGVyCisgIC8vLyBwdXRzIGEgc2luZ2x5LWxpbmtlZCBmcmVlIGxpc3QgaW50byB0b21ic3RvbmUgc2xvdHMsIGFsbG93aW5nIHVzIHF1aWNrCisgIC8vLyBlcmFzdXJlLCBpdGVyYXRvciBwcmVzZXJ2YXRpb24sIGFuZCBkZW5zZSBzaXplLgorICB1bnNpZ25lZCBGcmVlbGlzdElkeCA9IFNNU05vZGU6OklOVkFMSUQ7CisgIHVuc2lnbmVkIE51bUZyZWUgPSAwOworCisgIHVuc2lnbmVkIHNwYXJzZUluZGV4KGNvbnN0IFZhbHVlVCAmVmFsKSBjb25zdCB7CisgICAgYXNzZXJ0KFZhbEluZGV4T2YoVmFsKSA8IFVuaXZlcnNlICYmCisgICAgICAgICAgICJJbnZhbGlkIGtleSBpbiBzZXQuIERpZCBvYmplY3QgbXV0YXRlPyIpOworICAgIHJldHVybiBWYWxJbmRleE9mKFZhbCk7CisgIH0KKyAgdW5zaWduZWQgc3BhcnNlSW5kZXgoY29uc3QgU01TTm9kZSAmTikgY29uc3QgeyByZXR1cm4gc3BhcnNlSW5kZXgoTi5EYXRhKTsgfQorCisgIC8vLyBXaGV0aGVyIHRoZSBnaXZlbiBlbnRyeSBpcyB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gTGlzdCBoZWFkcydzIHByZXZpb3VzCisgIC8vLyBwb2ludGVycyBhcmUgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QsIGFsbG93aW5nIGZvciBlZmZpY2llbnQgYWNjZXNzIHRvIHRoZQorICAvLy8gbGlzdCB0YWlsLiBEIG11c3QgYmUgYSB2YWxpZCBlbnRyeSBub2RlLgorICBib29sIGlzSGVhZChjb25zdCBTTVNOb2RlICZEKSBjb25zdCB7CisgICAgYXNzZXJ0KEQuaXNWYWxpZCgpICYmICJJbnZhbGlkIG5vZGUgZm9yIGhlYWQiKTsKKyAgICByZXR1cm4gRGVuc2VbRC5QcmV2XS5pc1RhaWwoKTsKKyAgfQorCisgIC8vLyBXaGV0aGVyIHRoZSBnaXZlbiBlbnRyeSBpcyBhIHNpbmdsZXRvbiBlbnRyeSwgaS5lLiB0aGUgb25seSBlbnRyeSB3aXRoCisgIC8vLyB0aGF0IGtleS4KKyAgYm9vbCBpc1NpbmdsZXRvbihjb25zdCBTTVNOb2RlICZOKSBjb25zdCB7CisgICAgYXNzZXJ0KE4uaXNWYWxpZCgpICYmICJJbnZhbGlkIG5vZGUgZm9yIHNpbmdsZXRvbiIpOworICAgIC8vIElzIE4gaXRzIG93biBwcmVkZWNlc3Nvcj8KKyAgICByZXR1cm4gJkRlbnNlW04uUHJldl0gPT0gJk47CisgIH0KKworICAvLy8gQWRkIGluIHRoZSBnaXZlbiBTTVNOb2RlLiBVc2VzIGEgZnJlZSBlbnRyeSBpbiBvdXIgZnJlZWxpc3QgaWYKKyAgLy8vIGF2YWlsYWJsZS4gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGFkZGVkIG5vZGUuCisgIHVuc2lnbmVkIGFkZFZhbHVlKGNvbnN0IFZhbHVlVCYgViwgdW5zaWduZWQgUHJldiwgdW5zaWduZWQgTmV4dCkgeworICAgIGlmIChOdW1GcmVlID09IDApIHsKKyAgICAgIERlbnNlLnB1c2hfYmFjayhTTVNOb2RlKFYsIFByZXYsIE5leHQpKTsKKyAgICAgIHJldHVybiBEZW5zZS5zaXplKCkgLSAxOworICAgIH0KKworICAgIC8vIFBlZWwgb2ZmIGEgZnJlZSBzbG90CisgICAgdW5zaWduZWQgSWR4ID0gRnJlZWxpc3RJZHg7CisgICAgdW5zaWduZWQgTmV4dEZyZWUgPSBEZW5zZVtJZHhdLk5leHQ7CisgICAgYXNzZXJ0KERlbnNlW0lkeF0uaXNUb21ic3RvbmUoKSAmJiAiTm9uLXRvbWJzdG9uZSBmcmVlPyIpOworCisgICAgRGVuc2VbSWR4XSA9IFNNU05vZGUoViwgUHJldiwgTmV4dCk7CisgICAgRnJlZWxpc3RJZHggPSBOZXh0RnJlZTsKKyAgICAtLU51bUZyZWU7CisgICAgcmV0dXJuIElkeDsKKyAgfQorCisgIC8vLyBNYWtlIHRoZSBjdXJyZW50IGluZGV4IGEgbmV3IHRvbWJzdG9uZS4gUHVzaGVzIGl0IG9udG8gdGhlIGZyZWVsaXN0LgorICB2b2lkIG1ha2VUb21ic3RvbmUodW5zaWduZWQgSWR4KSB7CisgICAgRGVuc2VbSWR4XS5QcmV2ID0gU01TTm9kZTo6SU5WQUxJRDsKKyAgICBEZW5zZVtJZHhdLk5leHQgPSBGcmVlbGlzdElkeDsKKyAgICBGcmVlbGlzdElkeCA9IElkeDsKKyAgICArK051bUZyZWU7CisgIH0KKworcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0gVmFsdWVUOworICB1c2luZyByZWZlcmVuY2UgPSBWYWx1ZVQgJjsKKyAgdXNpbmcgY29uc3RfcmVmZXJlbmNlID0gY29uc3QgVmFsdWVUICY7CisgIHVzaW5nIHBvaW50ZXIgPSBWYWx1ZVQgKjsKKyAgdXNpbmcgY29uc3RfcG9pbnRlciA9IGNvbnN0IFZhbHVlVCAqOworICB1c2luZyBzaXplX3R5cGUgPSB1bnNpZ25lZDsKKworICBTcGFyc2VNdWx0aVNldCgpID0gZGVmYXVsdDsKKyAgU3BhcnNlTXVsdGlTZXQoY29uc3QgU3BhcnNlTXVsdGlTZXQgJikgPSBkZWxldGU7CisgIFNwYXJzZU11bHRpU2V0ICZvcGVyYXRvcj0oY29uc3QgU3BhcnNlTXVsdGlTZXQgJikgPSBkZWxldGU7CisgIH5TcGFyc2VNdWx0aVNldCgpIHsgZnJlZShTcGFyc2UpOyB9CisKKyAgLy8vIFNldCB0aGUgdW5pdmVyc2Ugc2l6ZSB3aGljaCBkZXRlcm1pbmVzIHRoZSBsYXJnZXN0IGtleSB0aGUgc2V0IGNhbiBob2xkLgorICAvLy8gVGhlIHVuaXZlcnNlIG11c3QgYmUgc2l6ZWQgYmVmb3JlIGFueSBlbGVtZW50cyBjYW4gYmUgYWRkZWQuCisgIC8vLworICAvLy8gQHBhcmFtIFUgVW5pdmVyc2Ugc2l6ZS4gQWxsIG9iamVjdCBrZXlzIG11c3QgYmUgbGVzcyB0aGFuIFUuCisgIC8vLworICB2b2lkIHNldFVuaXZlcnNlKHVuc2lnbmVkIFUpIHsKKyAgICAvLyBJdCdzIG5vdCBoYXJkIHRvIHJlc2l6ZSB0aGUgdW5pdmVyc2Ugb24gYSBub24tZW1wdHkgc2V0LCBidXQgaXQgZG9lc24ndAorICAgIC8vIHNlZW0gbGlrZSBhIGxpa2VseSB1c2UgY2FzZSwgc28gd2UgY2FuIGFkZCB0aGF0IGNvZGUgd2hlbiB3ZSBuZWVkIGl0LgorICAgIGFzc2VydChlbXB0eSgpICYmICJDYW4gb25seSByZXNpemUgdW5pdmVyc2Ugb24gYW4gZW1wdHkgbWFwIik7CisgICAgLy8gSHlzdGVyZXNpcyBwcmV2ZW50cyBuZWVkbGVzcyByZWFsbG9jYXRpb25zLgorICAgIGlmIChVID49IFVuaXZlcnNlLzQgJiYgVSA8PSBVbml2ZXJzZSkKKyAgICAgIHJldHVybjsKKyAgICBmcmVlKFNwYXJzZSk7CisgICAgLy8gVGhlIFNwYXJzZSBhcnJheSBkb2Vzbid0IGFjdHVhbGx5IG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQsIHNvIG1hbGxvYworICAgIC8vIHdvdWxkIGJlIGVub3VnaCBoZXJlLCBidXQgdGhhdCB3aWxsIGNhdXNlIHRvb2xzIGxpa2UgdmFsZ3JpbmQgdG8KKyAgICAvLyBjb21wbGFpbiBhYm91dCBicmFuY2hpbmcgb24gdW5pbml0aWFsaXplZCBkYXRhLgorICAgIFNwYXJzZSA9IHN0YXRpY19jYXN0PFNwYXJzZVQqPihzYWZlX2NhbGxvYyhVLCBzaXplb2YoU3BhcnNlVCkpKTsKKyAgICBVbml2ZXJzZSA9IFU7CisgIH0KKworICAvLy8gT3VyIGl0ZXJhdG9ycyBhcmUgaXRlcmF0b3JzIG92ZXIgdGhlIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0aGF0IHNoYXJlIGEKKyAgLy8vIGtleS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgU01TUHRyVHk+CisgIGNsYXNzIGl0ZXJhdG9yX2Jhc2UgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVUPiB7CisgICAgZnJpZW5kIGNsYXNzIFNwYXJzZU11bHRpU2V0OworCisgICAgU01TUHRyVHkgU01TOworICAgIHVuc2lnbmVkIElkeDsKKyAgICB1bnNpZ25lZCBTcGFyc2VJZHg7CisKKyAgICBpdGVyYXRvcl9iYXNlKFNNU1B0clR5IFAsIHVuc2lnbmVkIEksIHVuc2lnbmVkIFNJKQorICAgICAgOiBTTVMoUCksIElkeChJKSwgU3BhcnNlSWR4KFNJKSB7fQorCisgICAgLy8vIFdoZXRoZXIgb3VyIGl0ZXJhdG9yIGhhcyBmYWxsZW4gb3V0c2lkZSBvdXIgZGVuc2UgdmVjdG9yLgorICAgIGJvb2wgaXNFbmQoKSBjb25zdCB7CisgICAgICBpZiAoSWR4ID09IFNNU05vZGU6OklOVkFMSUQpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBhc3NlcnQoSWR4IDwgU01TLT5EZW5zZS5zaXplKCkgJiYgIk91dCBvZiByYW5nZSwgbm9uLUlOVkFMSUQgSWR4PyIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vLyBXaGV0aGVyIG91ciBpdGVyYXRvciBpcyBwcm9wZXJseSBrZXllZCwgaS5lLiB0aGUgU3BhcnNlSWR4IGlzIHZhbGlkCisgICAgYm9vbCBpc0tleWVkKCkgY29uc3QgeyByZXR1cm4gU3BhcnNlSWR4IDwgU01TLT5Vbml2ZXJzZTsgfQorCisgICAgdW5zaWduZWQgUHJldigpIGNvbnN0IHsgcmV0dXJuIFNNUy0+RGVuc2VbSWR4XS5QcmV2OyB9CisgICAgdW5zaWduZWQgTmV4dCgpIGNvbnN0IHsgcmV0dXJuIFNNUy0+RGVuc2VbSWR4XS5OZXh0OyB9CisKKyAgICB2b2lkIHNldFByZXYodW5zaWduZWQgUCkgeyBTTVMtPkRlbnNlW0lkeF0uUHJldiA9IFA7IH0KKyAgICB2b2lkIHNldE5leHQodW5zaWduZWQgTikgeyBTTVMtPkRlbnNlW0lkeF0uTmV4dCA9IE47IH0KKworICBwdWJsaWM6CisgICAgdXNpbmcgc3VwZXIgPSBzdGQ6Oml0ZXJhdG9yPHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcsIFZhbHVlVD47CisgICAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIHN1cGVyOjp2YWx1ZV90eXBlOworICAgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHR5cGVuYW1lIHN1cGVyOjpkaWZmZXJlbmNlX3R5cGU7CisgICAgdXNpbmcgcG9pbnRlciA9IHR5cGVuYW1lIHN1cGVyOjpwb2ludGVyOworICAgIHVzaW5nIHJlZmVyZW5jZSA9IHR5cGVuYW1lIHN1cGVyOjpyZWZlcmVuY2U7CisKKyAgICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgYXNzZXJ0KGlzS2V5ZWQoKSAmJiBTTVMtPnNwYXJzZUluZGV4KFNNUy0+RGVuc2VbSWR4XS5EYXRhKSA9PSBTcGFyc2VJZHggJiYKKyAgICAgICAgICAgICAiRGVyZWZlcmVuY2luZyBpdGVyYXRvciBvZiBpbnZhbGlkIGtleSBvciBpbmRleCIpOworCisgICAgICByZXR1cm4gU01TLT5EZW5zZVtJZHhdLkRhdGE7CisgICAgfQorICAgIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZvcGVyYXRvciooKTsgfQorCisgICAgLy8vIENvbXBhcmlzb24gb3BlcmF0b3JzCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yX2Jhc2UgJlJIUykgY29uc3QgeworICAgICAgLy8gZW5kIGNvbXBhcmVzIGVxdWFsCisgICAgICBpZiAoU01TID09IFJIUy5TTVMgJiYgSWR4ID09IFJIUy5JZHgpIHsKKyAgICAgICAgYXNzZXJ0KChpc0VuZCgpIHx8IFNwYXJzZUlkeCA9PSBSSFMuU3BhcnNlSWR4KSAmJgorICAgICAgICAgICAgICAgIlNhbWUgZGVuc2UgZW50cnksIGJ1dCBkaWZmZXJlbnQga2V5cz8iKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3JfYmFzZSAmUkhTKSBjb25zdCB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oUkhTKTsKKyAgICB9CisKKyAgICAvLy8gSW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgb3BlcmF0b3JzCisgICAgaXRlcmF0b3JfYmFzZSAmb3BlcmF0b3ItLSgpIHsgLy8gcHJlZGVjcmVtZW50IC0gQmFjayB1cAorICAgICAgYXNzZXJ0KGlzS2V5ZWQoKSAmJiAiRGVjcmVtZW50aW5nIGFuIGludmFsaWQgaXRlcmF0b3IiKTsKKyAgICAgIGFzc2VydCgoaXNFbmQoKSB8fCAhU01TLT5pc0hlYWQoU01TLT5EZW5zZVtJZHhdKSkgJiYKKyAgICAgICAgICAgICAiRGVjcmVtZW50aW5nIGhlYWQgb2YgbGlzdCIpOworCisgICAgICAvLyBJZiB3ZSdyZSBhdCB0aGUgZW5kLCB0aGVuIGlzc3VlIGEgbmV3IGZpbmQoKQorICAgICAgaWYgKGlzRW5kKCkpCisgICAgICAgIElkeCA9IFNNUy0+ZmluZEluZGV4KFNwYXJzZUlkeCkuUHJldigpOworICAgICAgZWxzZQorICAgICAgICBJZHggPSBQcmV2KCk7CisKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgaXRlcmF0b3JfYmFzZSAmb3BlcmF0b3IrKygpIHsgLy8gcHJlaW5jcmVtZW50IC0gQWR2YW5jZQorICAgICAgYXNzZXJ0KCFpc0VuZCgpICYmIGlzS2V5ZWQoKSAmJiAiSW5jcmVtZW50aW5nIGFuIGludmFsaWQvZW5kIGl0ZXJhdG9yIik7CisgICAgICBJZHggPSBOZXh0KCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIGl0ZXJhdG9yX2Jhc2Ugb3BlcmF0b3ItLShpbnQpIHsgLy8gcG9zdGRlY3JlbWVudAorICAgICAgaXRlcmF0b3JfYmFzZSBJKCp0aGlzKTsKKyAgICAgIC0tKnRoaXM7CisgICAgICByZXR1cm4gSTsKKyAgICB9CisgICAgaXRlcmF0b3JfYmFzZSBvcGVyYXRvcisrKGludCkgeyAvLyBwb3N0aW5jcmVtZW50CisgICAgICBpdGVyYXRvcl9iYXNlIEkoKnRoaXMpOworICAgICAgKysqdGhpczsKKyAgICAgIHJldHVybiBJOworICAgIH0KKyAgfTsKKworICB1c2luZyBpdGVyYXRvciA9IGl0ZXJhdG9yX2Jhc2U8U3BhcnNlTXVsdGlTZXQgKj47CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gaXRlcmF0b3JfYmFzZTxjb25zdCBTcGFyc2VNdWx0aVNldCAqPjsKKworICAvLyBDb252ZW5pZW5jZSB0eXBlcworICB1c2luZyBSYW5nZVBhaXIgPSBzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPjsKKworICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciBwYXN0IHRoaXMgY29udGFpbmVyLiBOb3RlIHRoYXQgc3VjaCBhbiBpdGVyYXRvciBjYW5ub3QKKyAgLy8vIGJlIGRlY3JlbWVudGVkLCBidXQgd2lsbCBjb21wYXJlIGVxdWFsIHRvIG90aGVyIGVuZCBpdGVyYXRvcnMuCisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGl0ZXJhdG9yKHRoaXMsIFNNU05vZGU6OklOVkFMSUQsIFNNU05vZGU6OklOVkFMSUQpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcywgU01TTm9kZTo6SU5WQUxJRCwgU01TTm9kZTo6SU5WQUxJRCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzZXQgaXMgZW1wdHkuCisgIC8vLworICAvLy8gVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgQml0VmVjdG9yOjplbXB0eSgpLgorICAvLy8KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc2V0LgorICAvLy8KKyAgLy8vIFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIEJpdFZlY3Rvcjo6c2l6ZSgpIHdoaWNoIHJldHVybnMgdGhlIHNpemUgb2YgdGhlCisgIC8vLyB1bml2ZXJzZS4KKyAgLy8vCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeworICAgIGFzc2VydChOdW1GcmVlIDw9IERlbnNlLnNpemUoKSAmJiAiT3V0LW9mLWJvdW5kcyBmcmVlIGVudHJpZXMiKTsKKyAgICByZXR1cm4gRGVuc2Uuc2l6ZSgpIC0gTnVtRnJlZTsKKyAgfQorCisgIC8vLyBDbGVhcnMgdGhlIHNldC4gIFRoaXMgaXMgYSB2ZXJ5IGZhc3QgY29uc3RhbnQgdGltZSBvcGVyYXRpb24uCisgIC8vLworICB2b2lkIGNsZWFyKCkgeworICAgIC8vIFNwYXJzZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGNsZWFyZWQsIHNlZSBmaW5kKCkuCisgICAgRGVuc2UuY2xlYXIoKTsKKyAgICBOdW1GcmVlID0gMDsKKyAgICBGcmVlbGlzdElkeCA9IFNNU05vZGU6OklOVkFMSUQ7CisgIH0KKworICAvLy8gRmluZCBhbiBlbGVtZW50IGJ5IGl0cyBpbmRleC4KKyAgLy8vCisgIC8vLyBAcGFyYW0gICBJZHggQSB2YWxpZCBpbmRleCB0byBmaW5kLgorICAvLy8gQHJldHVybnMgQW4gaXRlcmF0b3IgdG8gdGhlIGVsZW1lbnQgaWRlbnRpZmllZCBieSBrZXksIG9yIGVuZCgpLgorICAvLy8KKyAgaXRlcmF0b3IgZmluZEluZGV4KHVuc2lnbmVkIElkeCkgeworICAgIGFzc2VydChJZHggPCBVbml2ZXJzZSAmJiAiS2V5IG91dCBvZiByYW5nZSIpOworICAgIGNvbnN0IHVuc2lnbmVkIFN0cmlkZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8U3BhcnNlVD46Om1heCgpICsgMXU7CisgICAgZm9yICh1bnNpZ25lZCBpID0gU3BhcnNlW0lkeF0sIGUgPSBEZW5zZS5zaXplKCk7IGkgPCBlOyBpICs9IFN0cmlkZSkgeworICAgICAgY29uc3QgdW5zaWduZWQgRm91bmRJZHggPSBzcGFyc2VJbmRleChEZW5zZVtpXSk7CisgICAgICAvLyBDaGVjayB0aGF0IHdlJ3JlIHBvaW50aW5nIGF0IHRoZSBjb3JyZWN0IGVudHJ5IGFuZCB0aGF0IGl0IGlzIHRoZSBoZWFkCisgICAgICAvLyBvZiBhIHZhbGlkIGxpc3QuCisgICAgICBpZiAoSWR4ID09IEZvdW5kSWR4ICYmIERlbnNlW2ldLmlzVmFsaWQoKSAmJiBpc0hlYWQoRGVuc2VbaV0pKQorICAgICAgICByZXR1cm4gaXRlcmF0b3IodGhpcywgaSwgSWR4KTsKKyAgICAgIC8vIFN0cmlkZSBpcyAwIHdoZW4gU3BhcnNlVCA+PSB1bnNpZ25lZC4gIFdlIGRvbid0IG5lZWQgdG8gbG9vcC4KKyAgICAgIGlmICghU3RyaWRlKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGVuZCgpOworICB9CisKKyAgLy8vIEZpbmQgYW4gZWxlbWVudCBieSBpdHMga2V5LgorICAvLy8KKyAgLy8vIEBwYXJhbSAgIEtleSBBIHZhbGlkIGtleSB0byBmaW5kLgorICAvLy8gQHJldHVybnMgQW4gaXRlcmF0b3IgdG8gdGhlIGVsZW1lbnQgaWRlbnRpZmllZCBieSBrZXksIG9yIGVuZCgpLgorICAvLy8KKyAgaXRlcmF0b3IgZmluZChjb25zdCBLZXlUICZLZXkpIHsKKyAgICByZXR1cm4gZmluZEluZGV4KEtleUluZGV4T2YoS2V5KSk7CisgIH0KKworICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IEtleVQgJktleSkgY29uc3QgeworICAgIGl0ZXJhdG9yIEkgPSBjb25zdF9jYXN0PFNwYXJzZU11bHRpU2V0Kj4odGhpcyktPmZpbmRJbmRleChLZXlJbmRleE9mKEtleSkpOworICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihJLlNNUywgSS5JZHgsIEtleUluZGV4T2YoS2V5KSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGlkZW50aWZpZWQgYnkgS2V5LiBUaGlzIHdpbGwgYmUgbGluZWFyIGluCisgIC8vLyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHRoYXQga2V5LgorICBzaXplX3R5cGUgY291bnQoY29uc3QgS2V5VCAmS2V5KSBjb25zdCB7CisgICAgdW5zaWduZWQgUmV0ID0gMDsKKyAgICBmb3IgKGNvbnN0X2l0ZXJhdG9yIEl0ID0gZmluZChLZXkpOyBJdCAhPSBlbmQoKTsgKytJdCkKKyAgICAgICsrUmV0OworCisgICAgcmV0dXJuIFJldDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZXQgY29udGFpbnMgYW4gZWxlbWVudCBpZGVudGlmaWVkIGJ5IEtleS4KKyAgYm9vbCBjb250YWlucyhjb25zdCBLZXlUICZLZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmluZChLZXkpICE9IGVuZCgpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgaGVhZCBhbmQgdGFpbCBvZiB0aGUgc3Vic2V0J3MgbGlzdCwgb3RoZXJ3aXNlIHJldHVybnMgZW5kKCkuCisgIGl0ZXJhdG9yIGdldEhlYWQoY29uc3QgS2V5VCAmS2V5KSB7IHJldHVybiBmaW5kKEtleSk7IH0KKyAgaXRlcmF0b3IgZ2V0VGFpbChjb25zdCBLZXlUICZLZXkpIHsKKyAgICBpdGVyYXRvciBJID0gZmluZChLZXkpOworICAgIGlmIChJICE9IGVuZCgpKQorICAgICAgSSA9IGl0ZXJhdG9yKHRoaXMsIEkuUHJldigpLCBLZXlJbmRleE9mKEtleSkpOworICAgIHJldHVybiBJOworICB9CisKKyAgLy8vIFRoZSBib3VuZHMgb2YgdGhlIHJhbmdlIG9mIGl0ZW1zIHNoYXJpbmcgS2V5IEsuIEZpcnN0IG1lbWJlciBpcyB0aGUgaGVhZAorICAvLy8gb2YgdGhlIGxpc3QsIGFuZCB0aGUgc2Vjb25kIG1lbWJlciBpcyBhIGRlY3JlbWVudGFibGUgZW5kIGl0ZXJhdG9yIGZvcgorICAvLy8gdGhhdCBrZXkuCisgIFJhbmdlUGFpciBlcXVhbF9yYW5nZShjb25zdCBLZXlUICZLKSB7CisgICAgaXRlcmF0b3IgQiA9IGZpbmQoSyk7CisgICAgaXRlcmF0b3IgRSA9IGl0ZXJhdG9yKHRoaXMsIFNNU05vZGU6OklOVkFMSUQsIEIuU3BhcnNlSWR4KTsKKyAgICByZXR1cm4gbWFrZV9wYWlyKEIsIEUpOworICB9CisKKyAgLy8vIEluc2VydCBhIG5ldyBlbGVtZW50IGF0IHRoZSB0YWlsIG9mIHRoZSBzdWJzZXQgbGlzdC4gUmV0dXJucyBhbiBpdGVyYXRvcgorICAvLy8gdG8gdGhlIG5ld2x5IGFkZGVkIGVudHJ5LgorICBpdGVyYXRvciBpbnNlcnQoY29uc3QgVmFsdWVUICZWYWwpIHsKKyAgICB1bnNpZ25lZCBJZHggPSBzcGFyc2VJbmRleChWYWwpOworICAgIGl0ZXJhdG9yIEkgPSBmaW5kSW5kZXgoSWR4KTsKKworICAgIHVuc2lnbmVkIE5vZGVJZHggPSBhZGRWYWx1ZShWYWwsIFNNU05vZGU6OklOVkFMSUQsIFNNU05vZGU6OklOVkFMSUQpOworCisgICAgaWYgKEkgPT0gZW5kKCkpIHsKKyAgICAgIC8vIE1ha2UgYSBzaW5nbGV0b24gbGlzdAorICAgICAgU3BhcnNlW0lkeF0gPSBOb2RlSWR4OworICAgICAgRGVuc2VbTm9kZUlkeF0uUHJldiA9IE5vZGVJZHg7CisgICAgICByZXR1cm4gaXRlcmF0b3IodGhpcywgTm9kZUlkeCwgSWR4KTsKKyAgICB9CisKKyAgICAvLyBTdGljayBpdCBhdCB0aGUgZW5kLgorICAgIHVuc2lnbmVkIEhlYWRJZHggPSBJLklkeDsKKyAgICB1bnNpZ25lZCBUYWlsSWR4ID0gSS5QcmV2KCk7CisgICAgRGVuc2VbVGFpbElkeF0uTmV4dCA9IE5vZGVJZHg7CisgICAgRGVuc2VbSGVhZElkeF0uUHJldiA9IE5vZGVJZHg7CisgICAgRGVuc2VbTm9kZUlkeF0uUHJldiA9IFRhaWxJZHg7CisKKyAgICByZXR1cm4gaXRlcmF0b3IodGhpcywgTm9kZUlkeCwgSWR4KTsKKyAgfQorCisgIC8vLyBFcmFzZXMgYW4gZXhpc3RpbmcgZWxlbWVudCBpZGVudGlmaWVkIGJ5IGEgdmFsaWQgaXRlcmF0b3IuCisgIC8vLworICAvLy8gVGhpcyBpbnZhbGlkYXRlcyBpdGVyYXRvcnMgcG9pbnRpbmcgYXQgdGhlIHNhbWUgZW50cnksIGJ1dCBlcmFzZSgpIHJldHVybnMKKyAgLy8vIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIHN1YnNldCdzIGxpc3QuIFRoaXMgbWFrZXMKKyAgLy8vIGl0IHBvc3NpYmxlIHRvIGVyYXNlIHNlbGVjdGVkIGVsZW1lbnRzIHdoaWxlIGl0ZXJhdGluZyBvdmVyIHRoZSBzdWJzZXQ6CisgIC8vLworICAvLy8gICB0aWUoSSwgRSkgPSBTZXQuZXF1YWxfcmFuZ2UoS2V5KTsKKyAgLy8vICAgd2hpbGUgKEkgIT0gRSkKKyAgLy8vICAgICBpZiAodGVzdCgqSSkpCisgIC8vLyAgICAgICBJID0gU2V0LmVyYXNlKEkpOworICAvLy8gICAgIGVsc2UKKyAgLy8vICAgICAgICsrSTsKKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgaWYgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgc3Vic2V0IGxpc3QgaXMgZXJhc2VkLCB0aGlzIHdpbGwKKyAgLy8vIHJldHVybiBhbiBlbmQgaXRlcmF0b3Igd2hpY2ggY2FuIGJlIGRlY3JlbWVudGVkIHRvIGdldCB0aGUgbmV3IHRhaWwgKGlmIGl0CisgIC8vLyBleGlzdHMpOgorICAvLy8KKyAgLy8vICB0aWUoQiwgSSkgPSBTZXQuZXF1YWxfcmFuZ2UoS2V5KTsKKyAgLy8vICBmb3IgKGJvb2wgaXNCZWdpbiA9IEIgPT0gSTsgIWlzQmVnaW47IC8qIGVtcHR5ICovKSB7CisgIC8vLyAgICBpc0JlZ2luID0gKC0tSSkgPT0gQjsKKyAgLy8vICAgIGlmICh0ZXN0KEkpKQorICAvLy8gICAgICBicmVhazsKKyAgLy8vICAgIEkgPSBlcmFzZShJKTsKKyAgLy8vICB9CisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIEkpIHsKKyAgICBhc3NlcnQoSS5pc0tleWVkKCkgJiYgIUkuaXNFbmQoKSAmJiAhRGVuc2VbSS5JZHhdLmlzVG9tYnN0b25lKCkgJiYKKyAgICAgICAgICAgImVyYXNpbmcgaW52YWxpZC9lbmQvdG9tYnN0b25lIGl0ZXJhdG9yIik7CisKKyAgICAvLyBGaXJzdCwgdW5saW5rIHRoZSBub2RlIGZyb20gaXRzIGxpc3QuIFRoZW4gc3dhcCB0aGUgbm9kZSBvdXQgd2l0aCB0aGUKKyAgICAvLyBkZW5zZSB2ZWN0b3IncyBsYXN0IGVudHJ5CisgICAgaXRlcmF0b3IgTmV4dEkgPSB1bmxpbmsoRGVuc2VbSS5JZHhdKTsKKworICAgIC8vIFB1dCBpbiBhIHRvbWJzdG9uZS4KKyAgICBtYWtlVG9tYnN0b25lKEkuSWR4KTsKKworICAgIHJldHVybiBOZXh0STsKKyAgfQorCisgIC8vLyBFcmFzZSBhbGwgZWxlbWVudHMgd2l0aCB0aGUgZ2l2ZW4ga2V5LiBUaGlzIGludmFsaWRhdGVzIGFsbAorICAvLy8gaXRlcmF0b3JzIG9mIHRoYXQga2V5LgorICB2b2lkIGVyYXNlQWxsKGNvbnN0IEtleVQgJkspIHsKKyAgICBmb3IgKGl0ZXJhdG9yIEkgPSBmaW5kKEspOyBJICE9IGVuZCgpOyAvKiBlbXB0eSAqLykKKyAgICAgIEkgPSBlcmFzZShJKTsKKyAgfQorCitwcml2YXRlOgorICAvLy8gVW5saW5rIHRoZSBub2RlIGZyb20gaXRzIGxpc3QuIFJldHVybnMgdGhlIG5leHQgbm9kZSBpbiB0aGUgbGlzdC4KKyAgaXRlcmF0b3IgdW5saW5rKGNvbnN0IFNNU05vZGUgJk4pIHsKKyAgICBpZiAoaXNTaW5nbGV0b24oTikpIHsKKyAgICAgIC8vIFNpbmdsZXRvbiBpcyBhbHJlYWR5IHVubGlua2VkCisgICAgICBhc3NlcnQoTi5OZXh0ID09IFNNU05vZGU6OklOVkFMSUQgJiYgIlNpbmdsZXRvbiBoYXMgbmV4dD8iKTsKKyAgICAgIHJldHVybiBpdGVyYXRvcih0aGlzLCBTTVNOb2RlOjpJTlZBTElELCBWYWxJbmRleE9mKE4uRGF0YSkpOworICAgIH0KKworICAgIGlmIChpc0hlYWQoTikpIHsKKyAgICAgIC8vIElmIHdlJ3JlIHRoZSBoZWFkLCB0aGVuIHVwZGF0ZSB0aGUgc3BhcnNlIGFycmF5IGFuZCBvdXIgbmV4dC4KKyAgICAgIFNwYXJzZVtzcGFyc2VJbmRleChOKV0gPSBOLk5leHQ7CisgICAgICBEZW5zZVtOLk5leHRdLlByZXYgPSBOLlByZXY7CisgICAgICByZXR1cm4gaXRlcmF0b3IodGhpcywgTi5OZXh0LCBWYWxJbmRleE9mKE4uRGF0YSkpOworICAgIH0KKworICAgIGlmIChOLmlzVGFpbCgpKSB7CisgICAgICAvLyBJZiB3ZSdyZSB0aGUgdGFpbCwgdGhlbiB1cGRhdGUgb3VyIGhlYWQgYW5kIG91ciBwcmV2aW91cy4KKyAgICAgIGZpbmRJbmRleChzcGFyc2VJbmRleChOKSkuc2V0UHJldihOLlByZXYpOworICAgICAgRGVuc2VbTi5QcmV2XS5OZXh0ID0gTi5OZXh0OworCisgICAgICAvLyBHaXZlIGJhY2sgYW4gZW5kIGl0ZXJhdG9yIHRoYXQgY2FuIGJlIGRlY3JlbWVudGVkCisgICAgICBpdGVyYXRvciBJKHRoaXMsIE4uUHJldiwgVmFsSW5kZXhPZihOLkRhdGEpKTsKKyAgICAgIHJldHVybiArK0k7CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlLCBqdXN0IGRyb3AgdXMKKyAgICBEZW5zZVtOLk5leHRdLlByZXYgPSBOLlByZXY7CisgICAgRGVuc2VbTi5QcmV2XS5OZXh0ID0gTi5OZXh0OworICAgIHJldHVybiBpdGVyYXRvcih0aGlzLCBOLk5leHQsIFZhbEluZGV4T2YoTi5EYXRhKSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9TUEFSU0VNVUxUSVNFVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TcGFyc2VTZXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NwYXJzZVNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Y2M2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TcGFyc2VTZXQuaApAQCAtMCwwICsxLDMxNiBAQAorLy89PT0tIGxsdm0vQURUL1NwYXJzZVNldC5oIC0gU3BhcnNlIHNldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgU3BhcnNlU2V0IGNsYXNzIGRlcml2ZWQgZnJvbSB0aGUgdmVyc2lvbiBkZXNjcmliZWQgaW4KKy8vIEJyaWdncywgVG9yY3pvbiwgIkFuIGVmZmljaWVudCByZXByZXNlbnRhdGlvbiBmb3Igc3BhcnNlIHNldHMiLCBBQ00gTGV0dGVycworLy8gb24gUHJvZ3JhbW1pbmcgTGFuZ3VhZ2VzIGFuZCBTeXN0ZW1zLCBWb2x1bWUgMiBJc3N1ZSAxLTQsIE1hcmNoLURlYy4gIDE5OTMuCisvLworLy8gQSBzcGFyc2Ugc2V0IGhvbGRzIGEgc21hbGwgbnVtYmVyIG9mIG9iamVjdHMgaWRlbnRpZmllZCBieSBpbnRlZ2VyIGtleXMgZnJvbQorLy8gYSBtb2RlcmF0ZWx5IHNpemVkIHVuaXZlcnNlLiBUaGUgc3BhcnNlIHNldCB1c2VzIG1vcmUgbWVtb3J5IHRoYW4gb3RoZXIKKy8vIGNvbnRhaW5lcnMgaW4gb3JkZXIgdG8gcHJvdmlkZSBmYXN0ZXIgb3BlcmF0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NQQVJTRVNFVF9ICisjZGVmaW5lIExMVk1fQURUX1NQQVJTRVNFVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gU3BhcnNlU2V0VmFsVHJhaXRzIC0gT2JqZWN0cyBpbiBhIFNwYXJzZVNldCBhcmUgaWRlbnRpZmllZCBieSBrZXlzIHRoYXQgY2FuCisvLy8gYmUgdW5pcXVlbHkgY29udmVydGVkIHRvIGEgc21hbGwgaW50ZWdlciBsZXNzIHRoYW4gdGhlIHNldCdzIHVuaXZlcnNlLiBUaGlzCisvLy8gY2xhc3MgYWxsb3dzIHRoZSBzZXQgdG8gaG9sZCB2YWx1ZXMgdGhhdCBkaWZmZXIgZnJvbSB0aGUgc2V0J3Mga2V5IHR5cGUgYXMKKy8vLyBsb25nIGFzIGFuIGluZGV4IGNhbiBzdGlsbCBiZSBkZXJpdmVkIGZyb20gdGhlIHZhbHVlLiBTcGFyc2VTZXQgbmV2ZXIKKy8vLyBkaXJlY3RseSBjb21wYXJlcyBWYWx1ZVQsIG9ubHkgdGhlaXIgaW5kaWNlcywgc28gaXQgY2FuIG1hcCBrZXlzIHRvCisvLy8gYXJiaXRyYXJ5IHZhbHVlcy4gU3BhcnNlU2V0VmFsVHJhaXRzIGNvbXB1dGVzIHRoZSBpbmRleCBmcm9tIHRoZSB2YWx1ZQorLy8vIG9iamVjdC4gVG8gY29tcHV0ZSB0aGUgaW5kZXggZnJvbSBhIGtleSwgU3BhcnNlU2V0IHVzZXMgYSBzZXBhcmF0ZQorLy8vIEtleUZ1bmN0b3JUIHRlbXBsYXRlIGFyZ3VtZW50LgorLy8vCisvLy8gQSBzaW1wbGUgdHlwZSBkZWNsYXJhdGlvbiwgU3BhcnNlU2V0PFR5cGU+LCBoYW5kbGVzIHRoZXNlIGNhc2VzOgorLy8vIC0gdW5zaWduZWQga2V5LCBpZGVudGl0eSBpbmRleCwgaWRlbnRpdHkgdmFsdWUKKy8vLyAtIHVuc2lnbmVkIGtleSwgaWRlbnRpdHkgaW5kZXgsIGZhdCB2YWx1ZSBwcm92aWRpbmcgZ2V0U3BhcnNlU2V0SW5kZXgoKQorLy8vCisvLy8gVGhlIHR5cGUgZGVjbGFyYXRpb24gU3BhcnNlU2V0PFR5cGUsIFVuYXJ5RnVuY3Rpb24+IGhhbmRsZXM6CisvLy8gLSB1bnNpZ25lZCBrZXksIHJlbWFwcGVkIGluZGV4LCBpZGVudGl0eSB2YWx1ZSAodmlydHVhbCByZWdpc3RlcnMpCisvLy8gLSBwb2ludGVyIGtleSwgcG9pbnRlci1kZXJpdmVkIGluZGV4LCBpZGVudGl0eSB2YWx1ZSAobm9kZStJRCkKKy8vLyAtIHBvaW50ZXIga2V5LCBwb2ludGVyLWRlcml2ZWQgaW5kZXgsIGZhdCB2YWx1ZSB3aXRoIGdldFNwYXJzZVNldEluZGV4KCkKKy8vLworLy8vIE9ubHkgb3RoZXIsIHVuZXhwZWN0ZWQgY2FzZXMgcmVxdWlyZSBzcGVjaWFsaXppbmcgU3BhcnNlU2V0VmFsVHJhaXRzLgorLy8vCisvLy8gRm9yIGJlc3QgcmVzdWx0cywgVmFsdWVUIHNob3VsZCBub3QgcmVxdWlyZSBhIGRlc3RydWN0b3IuCisvLy8KK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVD4KK3N0cnVjdCBTcGFyc2VTZXRWYWxUcmFpdHMgeworICBzdGF0aWMgdW5zaWduZWQgZ2V0VmFsSW5kZXgoY29uc3QgVmFsdWVUICZWYWwpIHsKKyAgICByZXR1cm4gVmFsLmdldFNwYXJzZVNldEluZGV4KCk7CisgIH0KK307CisKKy8vLyBTcGFyc2VTZXRWYWxGdW5jdG9yIC0gSGVscGVyIGNsYXNzIGZvciBzZWxlY3RpbmcgU3BhcnNlU2V0VmFsVHJhaXRzLiBUaGUKKy8vLyBnZW5lcmljIGltcGxlbWVudGF0aW9uIGhhbmRsZXMgVmFsdWVUIGNsYXNzZXMgd2hpY2ggZWl0aGVyIHByb3ZpZGUKKy8vLyBnZXRTcGFyc2VTZXRJbmRleCgpIG9yIHNwZWNpYWxpemUgU3BhcnNlU2V0VmFsVHJhaXRzPD4uCisvLy8KK3RlbXBsYXRlPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUgS2V5RnVuY3RvclQ+CitzdHJ1Y3QgU3BhcnNlU2V0VmFsRnVuY3RvciB7CisgIHVuc2lnbmVkIG9wZXJhdG9yKCkoY29uc3QgVmFsdWVUICZWYWwpIGNvbnN0IHsKKyAgICByZXR1cm4gU3BhcnNlU2V0VmFsVHJhaXRzPFZhbHVlVD46OmdldFZhbEluZGV4KFZhbCk7CisgIH0KK307CisKKy8vLyBTcGFyc2VTZXRWYWxGdW5jdG9yPEtleVQsIEtleVQ+IC0gSGVscGVyIGNsYXNzIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YKKy8vLyBpZGVudGl0eSBrZXkvdmFsdWUgc2V0cy4KK3RlbXBsYXRlPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIEtleUZ1bmN0b3JUPgorc3RydWN0IFNwYXJzZVNldFZhbEZ1bmN0b3I8S2V5VCwgS2V5VCwgS2V5RnVuY3RvclQ+IHsKKyAgdW5zaWduZWQgb3BlcmF0b3IoKShjb25zdCBLZXlUICZLZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gS2V5RnVuY3RvclQoKShLZXkpOworICB9Cit9OworCisvLy8gU3BhcnNlU2V0IC0gRmFzdCBzZXQgaW1wbG1lbnRhdGlvbiBmb3Igb2JqZWN0cyB0aGF0IGNhbiBiZSBpZGVudGlmaWVkIGJ5CisvLy8gc21hbGwgdW5zaWduZWQga2V5cy4KKy8vLworLy8vIFNwYXJzZVNldCBhbGxvY2F0ZXMgbWVtb3J5IHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUga2V5IHVuaXZlcnNlLCBzbworLy8vIGl0IGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgYnVpbGRpbmcgY29tcG9zaXRlIGRhdGEgc3RydWN0dXJlcy4gIEl0IGlzIHVzZWZ1bAorLy8vIGZvciBhbGdvcml0aG1zIHRoYXQgcmVxdWlyZSBhIHNpbmdsZSBzZXQgd2l0aCBmYXN0IG9wZXJhdGlvbnMuCisvLy8KKy8vLyBDb21wYXJlZCB0byBEZW5zZVNldCBhbmQgRGVuc2VNYXAsIFNwYXJzZVNldCBwcm92aWRlcyBjb25zdGFudC10aW1lIGZhc3QKKy8vLyBjbGVhcigpIGFuZCBpdGVyYXRpb24gYXMgZmFzdCBhcyBhIHZlY3Rvci4gIFRoZSBmaW5kKCksIGluc2VydCgpLCBhbmQKKy8vLyBlcmFzZSgpIG9wZXJhdGlvbnMgYXJlIGFsbCBjb25zdGFudCB0aW1lLCBhbmQgdHlwaWNhbGx5IGZhc3RlciB0aGFuIGEgaGFzaAorLy8vIHRhYmxlLiAgVGhlIGl0ZXJhdGlvbiBvcmRlciBkb2Vzbid0IGRlcGVuZCBvbiBudW1lcmljYWwga2V5IHZhbHVlcywgaXQgb25seQorLy8vIGRlcGVuZHMgb24gdGhlIG9yZGVyIG9mIGluc2VydCgpIGFuZCBlcmFzZSgpIG9wZXJhdGlvbnMuICBXaGVuIG5vIGVsZW1lbnRzCisvLy8gaGF2ZSBiZWVuIGVyYXNlZCwgdGhlIGl0ZXJhdGlvbiBvcmRlciBpcyB0aGUgaW5zZXJ0aW9uIG9yZGVyLgorLy8vCisvLy8gQ29tcGFyZWQgdG8gQml0VmVjdG9yLCBTcGFyc2VTZXQ8dW5zaWduZWQ+IHVzZXMgOHgtNDB4IG1vcmUgbWVtb3J5LCBidXQKKy8vLyBvZmZlcnMgY29uc3RhbnQtdGltZSBjbGVhcigpIGFuZCBzaXplKCkgb3BlcmF0aW9ucyBhcyB3ZWxsIGFzIGZhc3QKKy8vLyBpdGVyYXRpb24gaW5kZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIHVuaXZlcnNlLgorLy8vCisvLy8gU3BhcnNlU2V0IGNvbnRhaW5zIGEgZGVuc2UgdmVjdG9yIGhvbGRpbmcgYWxsIHRoZSBvYmplY3RzIGFuZCBhIHNwYXJzZQorLy8vIGFycmF5IGhvbGRpbmcgaW5kZXhlcyBpbnRvIHRoZSBkZW5zZSB2ZWN0b3IuICBNb3N0IG9mIHRoZSBtZW1vcnkgaXMgdXNlZCBieQorLy8vIHRoZSBzcGFyc2UgYXJyYXkgd2hpY2ggaXMgdGhlIHNpemUgb2YgdGhlIGtleSB1bml2ZXJzZS4gIFRoZSBTcGFyc2VUCisvLy8gdGVtcGxhdGUgcGFyYW1ldGVyIHByb3ZpZGVzIGEgc3BhY2Uvc3BlZWQgdHJhZGVvZmYgZm9yIHNldHMgaG9sZGluZyBtYW55CisvLy8gZWxlbWVudHMuCisvLy8KKy8vLyBXaGVuIFNwYXJzZVQgaXMgdWludDMyX3QsIGZpbmQoKSBvbmx5IHRvdWNoZXMgMiBjYWNoZSBsaW5lcywgYnV0IHRoZSBzcGFyc2UKKy8vLyBhcnJheSB1c2VzIDQgeCBVbml2ZXJzZSBieXRlcy4KKy8vLworLy8vIFdoZW4gU3BhcnNlVCBpcyB1aW50OF90ICh0aGUgZGVmYXVsdCksIGZpbmQoKSB0b3VjaGVzIHVwIHRvIDIrW04vMjU2XSBjYWNoZQorLy8vIGxpbmVzLCBidXQgdGhlIHNwYXJzZSBhcnJheSBpcyA0eCBzbWFsbGVyLiAgTiBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluCisvLy8gdGhlIHNldC4KKy8vLworLy8vIEZvciBzZXRzIHRoYXQgbWF5IGdyb3cgdG8gdGhvdXNhbmRzIG9mIGVsZW1lbnRzLCBTcGFyc2VUIHNob3VsZCBiZSBzZXQgdG8KKy8vLyB1aW50MTZfdCBvciB1aW50MzJfdC4KKy8vLworLy8vIEB0cGFyYW0gVmFsdWVUICAgICAgVGhlIHR5cGUgb2Ygb2JqZWN0cyBpbiB0aGUgc2V0LgorLy8vIEB0cGFyYW0gS2V5RnVuY3RvclQgQSBmdW5jdG9yIHRoYXQgY29tcHV0ZXMgYW4gdW5zaWduZWQgaW5kZXggZnJvbSBLZXlULgorLy8vIEB0cGFyYW0gU3BhcnNlVCAgICAgQW4gdW5zaWduZWQgaW50ZWdlciB0eXBlLiBTZWUgYWJvdmUuCisvLy8KK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVCwKKyAgICAgICAgIHR5cGVuYW1lIEtleUZ1bmN0b3JUID0gaWRlbnRpdHk8dW5zaWduZWQ+LAorICAgICAgICAgdHlwZW5hbWUgU3BhcnNlVCA9IHVpbnQ4X3Q+CitjbGFzcyBTcGFyc2VTZXQgeworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8U3BhcnNlVD46OmlzX2ludGVnZXIgJiYKKyAgICAgICAgICAgICAgICAhc3RkOjpudW1lcmljX2xpbWl0czxTcGFyc2VUPjo6aXNfc2lnbmVkLAorICAgICAgICAgICAgICAgICJTcGFyc2VUIG11c3QgYmUgYW4gdW5zaWduZWQgaW50ZWdlciB0eXBlIik7CisKKyAgdXNpbmcgS2V5VCA9IHR5cGVuYW1lIEtleUZ1bmN0b3JUOjphcmd1bWVudF90eXBlOworICB1c2luZyBEZW5zZVQgPSBTbWFsbFZlY3RvcjxWYWx1ZVQsIDg+OworICB1c2luZyBzaXplX3R5cGUgPSB1bnNpZ25lZDsKKyAgRGVuc2VUIERlbnNlOworICBTcGFyc2VUICpTcGFyc2UgPSBudWxscHRyOworICB1bnNpZ25lZCBVbml2ZXJzZSA9IDA7CisgIEtleUZ1bmN0b3JUIEtleUluZGV4T2Y7CisgIFNwYXJzZVNldFZhbEZ1bmN0b3I8S2V5VCwgVmFsdWVULCBLZXlGdW5jdG9yVD4gVmFsSW5kZXhPZjsKKworcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0gVmFsdWVUOworICB1c2luZyByZWZlcmVuY2UgPSBWYWx1ZVQgJjsKKyAgdXNpbmcgY29uc3RfcmVmZXJlbmNlID0gY29uc3QgVmFsdWVUICY7CisgIHVzaW5nIHBvaW50ZXIgPSBWYWx1ZVQgKjsKKyAgdXNpbmcgY29uc3RfcG9pbnRlciA9IGNvbnN0IFZhbHVlVCAqOworCisgIFNwYXJzZVNldCgpID0gZGVmYXVsdDsKKyAgU3BhcnNlU2V0KGNvbnN0IFNwYXJzZVNldCAmKSA9IGRlbGV0ZTsKKyAgU3BhcnNlU2V0ICZvcGVyYXRvcj0oY29uc3QgU3BhcnNlU2V0ICYpID0gZGVsZXRlOworICB+U3BhcnNlU2V0KCkgeyBmcmVlKFNwYXJzZSk7IH0KKworICAvLy8gc2V0VW5pdmVyc2UgLSBTZXQgdGhlIHVuaXZlcnNlIHNpemUgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgbGFyZ2VzdCBrZXkgdGhlCisgIC8vLyBzZXQgY2FuIGhvbGQuICBUaGUgdW5pdmVyc2UgbXVzdCBiZSBzaXplZCBiZWZvcmUgYW55IGVsZW1lbnRzIGNhbiBiZQorICAvLy8gYWRkZWQuCisgIC8vLworICAvLy8gQHBhcmFtIFUgVW5pdmVyc2Ugc2l6ZS4gQWxsIG9iamVjdCBrZXlzIG11c3QgYmUgbGVzcyB0aGFuIFUuCisgIC8vLworICB2b2lkIHNldFVuaXZlcnNlKHVuc2lnbmVkIFUpIHsKKyAgICAvLyBJdCdzIG5vdCBoYXJkIHRvIHJlc2l6ZSB0aGUgdW5pdmVyc2Ugb24gYSBub24tZW1wdHkgc2V0LCBidXQgaXQgZG9lc24ndAorICAgIC8vIHNlZW0gbGlrZSBhIGxpa2VseSB1c2UgY2FzZSwgc28gd2UgY2FuIGFkZCB0aGF0IGNvZGUgd2hlbiB3ZSBuZWVkIGl0LgorICAgIGFzc2VydChlbXB0eSgpICYmICJDYW4gb25seSByZXNpemUgdW5pdmVyc2Ugb24gYW4gZW1wdHkgbWFwIik7CisgICAgLy8gSHlzdGVyZXNpcyBwcmV2ZW50cyBuZWVkbGVzcyByZWFsbG9jYXRpb25zLgorICAgIGlmIChVID49IFVuaXZlcnNlLzQgJiYgVSA8PSBVbml2ZXJzZSkKKyAgICAgIHJldHVybjsKKyAgICBmcmVlKFNwYXJzZSk7CisgICAgLy8gVGhlIFNwYXJzZSBhcnJheSBkb2Vzbid0IGFjdHVhbGx5IG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQsIHNvIG1hbGxvYworICAgIC8vIHdvdWxkIGJlIGVub3VnaCBoZXJlLCBidXQgdGhhdCB3aWxsIGNhdXNlIHRvb2xzIGxpa2UgdmFsZ3JpbmQgdG8KKyAgICAvLyBjb21wbGFpbiBhYm91dCBicmFuY2hpbmcgb24gdW5pbml0aWFsaXplZCBkYXRhLgorICAgIFNwYXJzZSA9IHN0YXRpY19jYXN0PFNwYXJzZVQqPihzYWZlX2NhbGxvYyhVLCBzaXplb2YoU3BhcnNlVCkpKTsKKyAgICBVbml2ZXJzZSA9IFU7CisgIH0KKworICAvLyBJbXBvcnQgdHJpdmlhbCB2ZWN0b3Igc3R1ZmYgZnJvbSBEZW5zZVQuCisgIHVzaW5nIGl0ZXJhdG9yID0gdHlwZW5hbWUgRGVuc2VUOjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSB0eXBlbmFtZSBEZW5zZVQ6OmNvbnN0X2l0ZXJhdG9yOworCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gRGVuc2UuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBEZW5zZS5lbmQoKTsgfQorICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIERlbnNlLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gRGVuc2UuZW5kKCk7IH0KKworICAvLy8gZW1wdHkgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHNldCBpcyBlbXB0eS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBCaXRWZWN0b3I6OmVtcHR5KCkuCisgIC8vLworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gRGVuc2UuZW1wdHkoKTsgfQorCisgIC8vLyBzaXplIC0gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzZXQuCisgIC8vLworICAvLy8gVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgQml0VmVjdG9yOjpzaXplKCkgd2hpY2ggcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUKKyAgLy8vIHVuaXZlcnNlLgorICAvLy8KKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBEZW5zZS5zaXplKCk7IH0KKworICAvLy8gY2xlYXIgLSBDbGVhcnMgdGhlIHNldC4gIFRoaXMgaXMgYSB2ZXJ5IGZhc3QgY29uc3RhbnQgdGltZSBvcGVyYXRpb24uCisgIC8vLworICB2b2lkIGNsZWFyKCkgeworICAgIC8vIFNwYXJzZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGNsZWFyZWQsIHNlZSBmaW5kKCkuCisgICAgRGVuc2UuY2xlYXIoKTsKKyAgfQorCisgIC8vLyBmaW5kSW5kZXggLSBGaW5kIGFuIGVsZW1lbnQgYnkgaXRzIGluZGV4LgorICAvLy8KKyAgLy8vIEBwYXJhbSAgIElkeCBBIHZhbGlkIGluZGV4IHRvIGZpbmQuCisgIC8vLyBAcmV0dXJucyBBbiBpdGVyYXRvciB0byB0aGUgZWxlbWVudCBpZGVudGlmaWVkIGJ5IGtleSwgb3IgZW5kKCkuCisgIC8vLworICBpdGVyYXRvciBmaW5kSW5kZXgodW5zaWduZWQgSWR4KSB7CisgICAgYXNzZXJ0KElkeCA8IFVuaXZlcnNlICYmICJLZXkgb3V0IG9mIHJhbmdlIik7CisgICAgY29uc3QgdW5zaWduZWQgU3RyaWRlID0gc3RkOjpudW1lcmljX2xpbWl0czxTcGFyc2VUPjo6bWF4KCkgKyAxdTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBTcGFyc2VbSWR4XSwgZSA9IHNpemUoKTsgaSA8IGU7IGkgKz0gU3RyaWRlKSB7CisgICAgICBjb25zdCB1bnNpZ25lZCBGb3VuZElkeCA9IFZhbEluZGV4T2YoRGVuc2VbaV0pOworICAgICAgYXNzZXJ0KEZvdW5kSWR4IDwgVW5pdmVyc2UgJiYgIkludmFsaWQga2V5IGluIHNldC4gRGlkIG9iamVjdCBtdXRhdGU/Iik7CisgICAgICBpZiAoSWR4ID09IEZvdW5kSWR4KQorICAgICAgICByZXR1cm4gYmVnaW4oKSArIGk7CisgICAgICAvLyBTdHJpZGUgaXMgMCB3aGVuIFNwYXJzZVQgPj0gdW5zaWduZWQuICBXZSBkb24ndCBuZWVkIHRvIGxvb3AuCisgICAgICBpZiAoIVN0cmlkZSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBlbmQoKTsKKyAgfQorCisgIC8vLyBmaW5kIC0gRmluZCBhbiBlbGVtZW50IGJ5IGl0cyBrZXkuCisgIC8vLworICAvLy8gQHBhcmFtICAgS2V5IEEgdmFsaWQga2V5IHRvIGZpbmQuCisgIC8vLyBAcmV0dXJucyBBbiBpdGVyYXRvciB0byB0aGUgZWxlbWVudCBpZGVudGlmaWVkIGJ5IGtleSwgb3IgZW5kKCkuCisgIC8vLworICBpdGVyYXRvciBmaW5kKGNvbnN0IEtleVQgJktleSkgeworICAgIHJldHVybiBmaW5kSW5kZXgoS2V5SW5kZXhPZihLZXkpKTsKKyAgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgS2V5VCAmS2V5KSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8U3BhcnNlU2V0Kj4odGhpcyktPmZpbmRJbmRleChLZXlJbmRleE9mKEtleSkpOworICB9CisKKyAgLy8vIGNvdW50IC0gUmV0dXJucyAxIGlmIHRoaXMgc2V0IGNvbnRhaW5zIGFuIGVsZW1lbnQgaWRlbnRpZmllZCBieSBLZXksCisgIC8vLyAwIG90aGVyd2lzZS4KKyAgLy8vCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBLZXlUICZLZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmluZChLZXkpID09IGVuZCgpID8gMCA6IDE7CisgIH0KKworICAvLy8gaW5zZXJ0IC0gQXR0ZW1wdHMgdG8gaW5zZXJ0IGEgbmV3IGVsZW1lbnQuCisgIC8vLworICAvLy8gSWYgVmFsIGlzIHN1Y2Nlc3NmdWxseSBpbnNlcnRlZCwgcmV0dXJuIChJLCB0cnVlKSwgd2hlcmUgSSBpcyBhbiBpdGVyYXRvcgorICAvLy8gcG9pbnRpbmcgdG8gdGhlIG5ld2x5IGluc2VydGVkIGVsZW1lbnQuCisgIC8vLworICAvLy8gSWYgdGhlIHNldCBhbHJlYWR5IGNvbnRhaW5zIGFuIGVsZW1lbnQgd2l0aCB0aGUgc2FtZSBrZXkgYXMgVmFsLCByZXR1cm4KKyAgLy8vIChJLCBmYWxzZSksIHdoZXJlIEkgaXMgYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGV4aXN0aW5nIGVsZW1lbnQuCisgIC8vLworICAvLy8gSW5zZXJ0aW9uIGludmFsaWRhdGVzIGFsbCBpdGVyYXRvcnMuCisgIC8vLworICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydChjb25zdCBWYWx1ZVQgJlZhbCkgeworICAgIHVuc2lnbmVkIElkeCA9IFZhbEluZGV4T2YoVmFsKTsKKyAgICBpdGVyYXRvciBJID0gZmluZEluZGV4KElkeCk7CisgICAgaWYgKEkgIT0gZW5kKCkpCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoSSwgZmFsc2UpOworICAgIFNwYXJzZVtJZHhdID0gc2l6ZSgpOworICAgIERlbnNlLnB1c2hfYmFjayhWYWwpOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihlbmQoKSAtIDEsIHRydWUpOworICB9CisKKyAgLy8vIGFycmF5IHN1YnNjcmlwdCAtIElmIGFuIGVsZW1lbnQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGlzIGtleSwgcmV0dXJuIGl0LgorICAvLy8gT3RoZXJ3aXNlLCBhdXRvbWF0aWNhbGx5IGNvbnN0cnVjdCBhIG5ldyB2YWx1ZSBmcm9tIEtleSwgaW5zZXJ0IGl0LAorICAvLy8gYW5kIHJldHVybiB0aGUgbmV3bHkgaW5zZXJ0ZWQgZWxlbWVudC4KKyAgVmFsdWVUICZvcGVyYXRvcltdKGNvbnN0IEtleVQgJktleSkgeworICAgIHJldHVybiAqaW5zZXJ0KFZhbHVlVChLZXkpKS5maXJzdDsKKyAgfQorCisgIFZhbHVlVCBwb3BfYmFja192YWwoKSB7CisgICAgLy8gU3BhcnNlIGRvZXMgbm90IG5lZWQgdG8gYmUgY2xlYXJlZCwgc2VlIGZpbmQoKS4KKyAgICByZXR1cm4gRGVuc2UucG9wX2JhY2tfdmFsKCk7CisgIH0KKworICAvLy8gZXJhc2UgLSBFcmFzZXMgYW4gZXhpc3RpbmcgZWxlbWVudCBpZGVudGlmaWVkIGJ5IGEgdmFsaWQgaXRlcmF0b3IuCisgIC8vLworICAvLy8gVGhpcyBpbnZhbGlkYXRlcyBhbGwgaXRlcmF0b3JzLCBidXQgZXJhc2UoKSByZXR1cm5zIGFuIGl0ZXJhdG9yIHBvaW50aW5nCisgIC8vLyB0byB0aGUgbmV4dCBlbGVtZW50LiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBlcmFzZSBzZWxlY3RlZCBlbGVtZW50cworICAvLy8gd2hpbGUgaXRlcmF0aW5nIG92ZXIgdGhlIHNldDoKKyAgLy8vCisgIC8vLyAgIGZvciAoU3BhcnNlU2V0OjppdGVyYXRvciBJID0gU2V0LmJlZ2luKCk7IEkgIT0gU2V0LmVuZCgpOykKKyAgLy8vICAgICBpZiAodGVzdCgqSSkpCisgIC8vLyAgICAgICBJID0gU2V0LmVyYXNlKEkpOworICAvLy8gICAgIGVsc2UKKyAgLy8vICAgICAgICsrSTsKKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgZW5kKCkgY2hhbmdlcyB3aGVuIGVsZW1lbnRzIGFyZSBlcmFzZWQsIHVubGlrZSBzdGQ6Omxpc3QuCisgIC8vLworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBJKSB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKEkgLSBiZWdpbigpKSA8IHNpemUoKSAmJiAiSW52YWxpZCBpdGVyYXRvciIpOworICAgIGlmIChJICE9IGVuZCgpIC0gMSkgeworICAgICAgKkkgPSBEZW5zZS5iYWNrKCk7CisgICAgICB1bnNpZ25lZCBCYWNrSWR4ID0gVmFsSW5kZXhPZihEZW5zZS5iYWNrKCkpOworICAgICAgYXNzZXJ0KEJhY2tJZHggPCBVbml2ZXJzZSAmJiAiSW52YWxpZCBrZXkgaW4gc2V0LiBEaWQgb2JqZWN0IG11dGF0ZT8iKTsKKyAgICAgIFNwYXJzZVtCYWNrSWR4XSA9IEkgLSBiZWdpbigpOworICAgIH0KKyAgICAvLyBUaGlzIGRlcGVuZHMgb24gU21hbGxWZWN0b3I6OnBvcF9iYWNrKCkgbm90IGludmFsaWRhdGluZyBpdGVyYXRvcnMuCisgICAgLy8gc3RkOjp2ZWN0b3I6OnBvcF9iYWNrKCkgZG9lc24ndCBnaXZlIHRoYXQgZ3VhcmFudGVlLgorICAgIERlbnNlLnBvcF9iYWNrKCk7CisgICAgcmV0dXJuIEk7CisgIH0KKworICAvLy8gZXJhc2UgLSBFcmFzZXMgYW4gZWxlbWVudCBpZGVudGlmaWVkIGJ5IEtleSwgaWYgaXQgZXhpc3RzLgorICAvLy8KKyAgLy8vIEBwYXJhbSAgIEtleSBUaGUga2V5IGlkZW50aWZ5aW5nIHRoZSBlbGVtZW50IHRvIGVyYXNlLgorICAvLy8gQHJldHVybnMgVHJ1ZSB3aGVuIGFuIGVsZW1lbnQgd2FzIGVyYXNlZCwgZmFsc2UgaWYgbm8gZWxlbWVudCB3YXMgZm91bmQuCisgIC8vLworICBib29sIGVyYXNlKGNvbnN0IEtleVQgJktleSkgeworICAgIGl0ZXJhdG9yIEkgPSBmaW5kKEtleSk7CisgICAgaWYgKEkgPT0gZW5kKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgZXJhc2UoSSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9TUEFSU0VTRVRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3RhdGlzdGljLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TdGF0aXN0aWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTA4OTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3RhdGlzdGljLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8vPT09LS0gbGx2bS9BRFQvU3RhdGlzdGljLmggLSBFYXN5IHdheSB0byBleHBvc2Ugc3RhdHMgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlICdTdGF0aXN0aWMnIGNsYXNzLCB3aGljaCBpcyBkZXNpZ25lZCB0byBiZSBhbiBlYXN5IHdheQorLy8gdG8gZXhwb3NlIHZhcmlvdXMgbWV0cmljcyBmcm9tIHBhc3Nlcy4gIFRoZXNlIHN0YXRpc3RpY3MgYXJlIHByaW50ZWQgYXQgdGhlCisvLyBlbmQgb2YgYSBydW4gKGZyb20gbGx2bV9zaHV0ZG93biksIHdoZW4gdGhlIC1zdGF0cyBjb21tYW5kIGxpbmUgb3B0aW9uIGlzCisvLyBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKy8vCisvLyBUaGlzIGlzIHVzZWZ1bCBmb3IgcmVwb3J0aW5nIGluZm9ybWF0aW9uIGxpa2UgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMKKy8vIHNpbXBsaWZpZWQsIG9wdGltaXplZCBvciByZW1vdmVkIGJ5IHZhcmlvdXMgdHJhbnNmb3JtYXRpb25zLCBsaWtlIHRoaXM6CisvLworLy8gc3RhdGljIFN0YXRpc3RpYyBOdW1JbnN0c0tpbGxlZCgiZ2NzZSIsICJOdW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGtpbGxlZCIpOworLy8KKy8vIExhdGVyLCBpbiB0aGUgY29kZTogKytOdW1JbnN0c0tpbGxlZDsKKy8vCisvLyBOT1RFOiBTdGF0aXN0aWNzICptdXN0KiBiZSBkZWNsYXJlZCBhcyBnbG9iYWwgdmFyaWFibGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU1RBVElTVElDX0gKKyNkZWZpbmUgTExWTV9BRFRfU1RBVElTVElDX0gKKworI2luY2x1ZGUgImxsdm0vQ29uZmlnL2xsdm0tY29uZmlnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIERldGVybWluZSB3aGV0aGVyIHN0YXRpc3RpY3Mgc2hvdWxkIGJlIGVuYWJsZWQuIFdlIG11c3QgZG8gaXQgaGVyZSByYXRoZXIKKy8vIHRoYW4gaW4gQ01ha2UgYmVjYXVzZSBtdWx0aS1jb25maWcgZ2VuZXJhdG9ycyBjYW5ub3QgZGV0ZXJtaW5lIHRoaXMgYXQKKy8vIGNvbmZpZ3VyZSB0aW1lLgorI2lmICFkZWZpbmVkKE5ERUJVRykgfHwgTExWTV9GT1JDRV9FTkFCTEVfU1RBVFMKKyNkZWZpbmUgTExWTV9FTkFCTEVfU1RBVFMgMQorI2VuZGlmCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyByYXdfZmRfb3N0cmVhbTsKK2NsYXNzIFN0cmluZ1JlZjsKKworY2xhc3MgU3RhdGlzdGljIHsKK3B1YmxpYzoKKyAgY29uc3QgY2hhciAqRGVidWdUeXBlOworICBjb25zdCBjaGFyICpOYW1lOworICBjb25zdCBjaGFyICpEZXNjOworICBzdGQ6OmF0b21pYzx1bnNpZ25lZD4gVmFsdWU7CisgIHN0ZDo6YXRvbWljPGJvb2w+IEluaXRpYWxpemVkOworCisgIHVuc2lnbmVkIGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWUubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsgfQorICBjb25zdCBjaGFyICpnZXREZWJ1Z1R5cGUoKSBjb25zdCB7IHJldHVybiBEZWJ1Z1R5cGU7IH0KKyAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKyAgY29uc3QgY2hhciAqZ2V0RGVzYygpIGNvbnN0IHsgcmV0dXJuIERlc2M7IH0KKworICAvLy8gY29uc3RydWN0IC0gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZm9yIG5vbi1nbG9iYWwgc3RhdGlzdGljcy4KKyAgdm9pZCBjb25zdHJ1Y3QoY29uc3QgY2hhciAqZGVidWd0eXBlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkZXNjKSB7CisgICAgRGVidWdUeXBlID0gZGVidWd0eXBlOworICAgIE5hbWUgPSBuYW1lOworICAgIERlc2MgPSBkZXNjOworICAgIFZhbHVlID0gMDsKKyAgICBJbml0aWFsaXplZCA9IGZhbHNlOworICB9CisKKyAgLy8gQWxsb3cgdXNlIG9mIHRoaXMgY2xhc3MgYXMgdGhlIHZhbHVlIGl0c2VsZi4KKyAgb3BlcmF0b3IgdW5zaWduZWQoKSBjb25zdCB7IHJldHVybiBnZXRWYWx1ZSgpOyB9CisKKyNpZiBMTFZNX0VOQUJMRV9TVEFUUworICAgY29uc3QgU3RhdGlzdGljICZvcGVyYXRvcj0odW5zaWduZWQgVmFsKSB7CisgICAgVmFsdWUuc3RvcmUoVmFsLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICByZXR1cm4gaW5pdCgpOworICB9CisKKyAgY29uc3QgU3RhdGlzdGljICZvcGVyYXRvcisrKCkgeworICAgIFZhbHVlLmZldGNoX2FkZCgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICByZXR1cm4gaW5pdCgpOworICB9CisKKyAgdW5zaWduZWQgb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBpbml0KCk7CisgICAgcmV0dXJuIFZhbHVlLmZldGNoX2FkZCgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgfQorCisgIGNvbnN0IFN0YXRpc3RpYyAmb3BlcmF0b3ItLSgpIHsKKyAgICBWYWx1ZS5mZXRjaF9zdWIoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgcmV0dXJuIGluaXQoKTsKKyAgfQorCisgIHVuc2lnbmVkIG9wZXJhdG9yLS0oaW50KSB7CisgICAgaW5pdCgpOworICAgIHJldHVybiBWYWx1ZS5mZXRjaF9zdWIoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIH0KKworICBjb25zdCBTdGF0aXN0aWMgJm9wZXJhdG9yKz0odW5zaWduZWQgVikgeworICAgIGlmIChWID09IDApCisgICAgICByZXR1cm4gKnRoaXM7CisgICAgVmFsdWUuZmV0Y2hfYWRkKFYsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIHJldHVybiBpbml0KCk7CisgIH0KKworICBjb25zdCBTdGF0aXN0aWMgJm9wZXJhdG9yLT0odW5zaWduZWQgVikgeworICAgIGlmIChWID09IDApCisgICAgICByZXR1cm4gKnRoaXM7CisgICAgVmFsdWUuZmV0Y2hfc3ViKFYsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIHJldHVybiBpbml0KCk7CisgIH0KKworICB2b2lkIHVwZGF0ZU1heCh1bnNpZ25lZCBWKSB7CisgICAgdW5zaWduZWQgUHJldk1heCA9IFZhbHVlLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgLy8gS2VlcCB0cnlpbmcgdG8gdXBkYXRlIG1heCB1bnRpbCB3ZSBzdWNjZWVkIG9yIGFub3RoZXIgdGhyZWFkIHByb2R1Y2VzCisgICAgLy8gYSBiaWdnZXIgbWF4IHRoYW4gdXMuCisgICAgd2hpbGUgKFYgPiBQcmV2TWF4ICYmICFWYWx1ZS5jb21wYXJlX2V4Y2hhbmdlX3dlYWsoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2TWF4LCBWLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSkgeworICAgIH0KKyAgICBpbml0KCk7CisgIH0KKworI2Vsc2UgIC8vIFN0YXRpc3RpY3MgYXJlIGRpc2FibGVkIGluIHJlbGVhc2UgYnVpbGRzLgorCisgIGNvbnN0IFN0YXRpc3RpYyAmb3BlcmF0b3I9KHVuc2lnbmVkIFZhbCkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IFN0YXRpc3RpYyAmb3BlcmF0b3IrKygpIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB1bnNpZ25lZCBvcGVyYXRvcisrKGludCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgY29uc3QgU3RhdGlzdGljICZvcGVyYXRvci0tKCkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHVuc2lnbmVkIG9wZXJhdG9yLS0oaW50KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBjb25zdCBTdGF0aXN0aWMgJm9wZXJhdG9yKz0oY29uc3QgdW5zaWduZWQgJlYpIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBTdGF0aXN0aWMgJm9wZXJhdG9yLT0oY29uc3QgdW5zaWduZWQgJlYpIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIHVwZGF0ZU1heCh1bnNpZ25lZCBWKSB7fQorCisjZW5kaWYgIC8vIExMVk1fRU5BQkxFX1NUQVRTCisKK3Byb3RlY3RlZDoKKyAgU3RhdGlzdGljICZpbml0KCkgeworICAgIGlmICghSW5pdGlhbGl6ZWQubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKSkKKyAgICAgIFJlZ2lzdGVyU3RhdGlzdGljKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCBSZWdpc3RlclN0YXRpc3RpYygpOworfTsKKworLy8gU1RBVElTVElDIC0gQSBtYWNybyB0byBtYWtlIGRlZmluaXRpb24gb2Ygc3RhdGlzdGljcyByZWFsbHkgc2ltcGxlLiAgVGhpcworLy8gYXV0b21hdGljYWxseSBwYXNzZXMgdGhlIERFQlVHX1RZUEUgb2YgdGhlIGZpbGUgaW50byB0aGUgc3RhdGlzdGljLgorI2RlZmluZSBTVEFUSVNUSUMoVkFSTkFNRSwgREVTQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGxsdm06OlN0YXRpc3RpYyBWQVJOQU1FID0ge0RFQlVHX1RZUEUsICNWQVJOQU1FLCBERVNDLCB7MH0sIHtmYWxzZX19CisKKy8vLyBcYnJpZWYgRW5hYmxlIHRoZSBjb2xsZWN0aW9uIGFuZCBwcmludGluZyBvZiBzdGF0aXN0aWNzLgordm9pZCBFbmFibGVTdGF0aXN0aWNzKGJvb2wgUHJpbnRPbkV4aXQgPSB0cnVlKTsKKworLy8vIFxicmllZiBDaGVjayBpZiBzdGF0aXN0aWNzIGFyZSBlbmFibGVkLgorYm9vbCBBcmVTdGF0aXN0aWNzRW5hYmxlZCgpOworCisvLy8gXGJyaWVmIFJldHVybiBhIGZpbGUgc3RyZWFtIHRvIHByaW50IG91ciBvdXRwdXQgb24uCitzdGQ6OnVuaXF1ZV9wdHI8cmF3X2ZkX29zdHJlYW0+IENyZWF0ZUluZm9PdXRwdXRGaWxlKCk7CisKKy8vLyBcYnJpZWYgUHJpbnQgc3RhdGlzdGljcyB0byB0aGUgZmlsZSByZXR1cm5lZCBieSBDcmVhdGVJbmZvT3V0cHV0RmlsZSgpLgordm9pZCBQcmludFN0YXRpc3RpY3MoKTsKKworLy8vIFxicmllZiBQcmludCBzdGF0aXN0aWNzIHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLgordm9pZCBQcmludFN0YXRpc3RpY3MocmF3X29zdHJlYW0gJk9TKTsKKworLy8vIFByaW50IHN0YXRpc3RpY3MgaW4gSlNPTiBmb3JtYXQuIFRoaXMgZG9lcyBpbmNsdWRlIGFsbCBnbG9iYWwgdGltZXJzIChcc2VlCisvLy8gVGltZXIsIFRpbWVyR3JvdXApLiBOb3RlIHRoYXQgdGhlIHRpbWVycyBhcmUgY2xlYXJlZCBhZnRlciBwcmludGluZyBhbmQgd2lsbAorLy8vIG5vdCBiZSBwcmludGVkIGluIGh1bWFuIHJlYWRhYmxlIGZvcm0gb3IgaW4gYSBzZWNvbmQgY2FsbCBvZgorLy8vIFByaW50U3RhdGlzdGljc0pTT04oKS4KK3ZvaWQgUHJpbnRTdGF0aXN0aWNzSlNPTihyYXdfb3N0cmVhbSAmT1MpOworCisvLy8gXGJyaWVmIEdldCB0aGUgc3RhdGlzdGljcy4gVGhpcyBjYW4gYmUgdXNlZCB0byBsb29rIHVwIHRoZSB2YWx1ZSBvZgorLy8vIHN0YXRpc3RpY3Mgd2l0aG91dCBuZWVkaW5nIHRvIHBhcnNlIEpTT04uCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHByZXZlbnQgc3RhdGlzdGljcyBiZWluZyB1cGRhdGVkIGJ5IG90aGVyIHRocmVhZHMKKy8vLyBkdXJpbmcgaXQncyBleGVjdXRpb24uIEl0IHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBhdCB0aGUgcG9pbnQgdGhhdCBpdCBpcworLy8vIHJlYWQuIEhvd2V2ZXIsIGl0IHdpbGwgcHJldmVudCBuZXcgc3RhdGlzdGljcyBmcm9tIHJlZ2lzdGVyaW5nIHVudGlsIGl0CisvLy8gY29tcGxldGVzLgorY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFN0cmluZ1JlZiwgdW5zaWduZWQ+PiBHZXRTdGF0aXN0aWNzKCk7CisKKy8vLyBcYnJpZWYgUmVzZXQgdGhlIHN0YXRpc3RpY3MuIFRoaXMgY2FuIGJlIHVzZWQgdG8gemVybyBhbmQgZGUtcmVnaXN0ZXIgdGhlCisvLy8gc3RhdGlzdGljcyBpbiBvcmRlciB0byBtZWFzdXJlIGEgY29tcGlsYXRpb24uCisvLy8KKy8vLyBXaGVuIHRoaXMgZnVuY3Rpb24gYmVnaW5zIHRvIGNhbGwgZGVzdHJ1Y3RvcnMgcHJpb3IgdG8gcmV0dXJuaW5nLCBhbGwKKy8vLyBzdGF0aXN0aWNzIHdpbGwgYmUgemVybyBhbmQgdW5yZWdpc3RlcmVkLiBIb3dldmVyLCB0aGF0IG1pZ2h0IG5vdCByZW1haW4gdGhlCisvLy8gY2FzZSBieSB0aGUgdGltZSB0aGlzIGZ1bmN0aW9uIGZpbmlzaGVzIHJldHVybmluZy4gV2hldGhlciB1cGRhdGUgZnJvbSBvdGhlcgorLy8vIHRocmVhZHMgYXJlIGxvc3Qgb3IgbWVyZWx5IGRlZmVycmVkIHVudGlsIGR1cmluZyB0aGUgZnVuY3Rpb24gcmV0dXJuIGlzCisvLy8gdGltaW5nIHNlbnNpdGl2ZS4KKy8vLworLy8vIENhbGxlcnMgd2hvIGludGVuZCB0byB1c2UgdGhpcyB0byBtZWFzdXJlIHN0YXRpc3RpY3MgZm9yIGEgc2luZ2xlCisvLy8gY29tcGlsYXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IG5vIGNvbXBpbGF0aW9ucyBhcmUgaW4gcHJvZ3Jlc3MgYXQgdGhlIHBvaW50CisvLy8gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYW5kIHRoYXQgb25seSBvbmUgY29tcGlsYXRpb24gZXhlY3V0ZXMgdW50aWwgY2FsbGluZworLy8vIEdldFN0YXRpc3RpY3MoKS4KK3ZvaWQgUmVzZXRTdGF0aXN0aWNzKCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9TVEFUSVNUSUNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nRXh0cmFzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TdHJpbmdFeHRyYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWY2Njc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgKQEAgLTAsMCArMSwzNjcgQEAKKy8vPT09LSBsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCAtIFVzZWZ1bCBzdHJpbmcgZnVuY3Rpb25zIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWZ1bCB3aGVuIGRlYWxpbmcgd2l0aCBzdHJpbmdzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU1RSSU5HRVhUUkFTX0gKKyNkZWZpbmUgTExWTV9BRFRfU1RSSU5HRVhUUkFTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBTbWFsbFZlY3RvckltcGw7CitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIGhleGRpZ2l0IC0gUmV0dXJuIHRoZSBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIgZm9yIHRoZQorLy8vIGdpdmVuIG51bWJlciBccCBYICh3aGljaCBzaG91bGQgYmUgbGVzcyB0aGFuIDE2KS4KK2lubGluZSBjaGFyIGhleGRpZ2l0KHVuc2lnbmVkIFgsIGJvb2wgTG93ZXJDYXNlID0gZmFsc2UpIHsKKyAgY29uc3QgY2hhciBIZXhDaGFyID0gTG93ZXJDYXNlID8gJ2EnIDogJ0EnOworICByZXR1cm4gWCA8IDEwID8gJzAnICsgWCA6IEhleENoYXIgKyBYIC0gMTA7Cit9CisKKy8vLyBDb25zdHJ1Y3QgYSBzdHJpbmcgcmVmIGZyb20gYSBib29sZWFuLgoraW5saW5lIFN0cmluZ1JlZiB0b1N0cmluZ1JlZihib29sIEIpIHsgcmV0dXJuIFN0cmluZ1JlZihCID8gInRydWUiIDogImZhbHNlIik7IH0KKworLy8vIENvbnN0cnVjdCBhIHN0cmluZyByZWYgZnJvbSBhbiBhcnJheSByZWYgb2YgdW5zaWduZWQgY2hhcnMuCitpbmxpbmUgU3RyaW5nUmVmIHRvU3RyaW5nUmVmKEFycmF5UmVmPHVpbnQ4X3Q+IElucHV0KSB7CisgIHJldHVybiBTdHJpbmdSZWYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KElucHV0LmJlZ2luKCkpLCBJbnB1dC5zaXplKCkpOworfQorCisvLy8gQ29uc3RydWN0IGEgc3RyaW5nIHJlZiBmcm9tIGFuIGFycmF5IHJlZiBvZiB1bnNpZ25lZCBjaGFycy4KK2lubGluZSBBcnJheVJlZjx1aW50OF90PiBhcnJheVJlZkZyb21TdHJpbmdSZWYoU3RyaW5nUmVmIElucHV0KSB7CisgIHJldHVybiB7SW5wdXQuYnl0ZXNfYmVnaW4oKSwgSW5wdXQuYnl0ZXNfZW5kKCl9OworfQorCisvLy8gSW50ZXJwcmV0IHRoZSBnaXZlbiBjaGFyYWN0ZXIgXHAgQyBhcyBhIGhleGFkZWNpbWFsIGRpZ2l0IGFuZCByZXR1cm4gaXRzCisvLy8gdmFsdWUuCisvLy8KKy8vLyBJZiBccCBDIGlzIG5vdCBhIHZhbGlkIGhleCBkaWdpdCwgLTFVIGlzIHJldHVybmVkLgoraW5saW5lIHVuc2lnbmVkIGhleERpZ2l0VmFsdWUoY2hhciBDKSB7CisgIGlmIChDID49ICcwJyAmJiBDIDw9ICc5JykgcmV0dXJuIEMtJzAnOworICBpZiAoQyA+PSAnYScgJiYgQyA8PSAnZicpIHJldHVybiBDLSdhJysxMFU7CisgIGlmIChDID49ICdBJyAmJiBDIDw9ICdGJykgcmV0dXJuIEMtJ0EnKzEwVTsKKyAgcmV0dXJuIC0xVTsKK30KKworLy8vIENoZWNrcyBpZiBjaGFyYWN0ZXIgXHAgQyBpcyBvbmUgb2YgdGhlIDEwIGRlY2ltYWwgZGlnaXRzLgoraW5saW5lIGJvb2wgaXNEaWdpdChjaGFyIEMpIHsgcmV0dXJuIEMgPj0gJzAnICYmIEMgPD0gJzknOyB9CisKKy8vLyBDaGVja3MgaWYgY2hhcmFjdGVyIFxwIEMgaXMgYSBoZXhhZGVjaW1hbCBudW1lcmljIGNoYXJhY3Rlci4KK2lubGluZSBib29sIGlzSGV4RGlnaXQoY2hhciBDKSB7IHJldHVybiBoZXhEaWdpdFZhbHVlKEMpICE9IC0xVTsgfQorCisvLy8gQ2hlY2tzIGlmIGNoYXJhY3RlciBccCBDIGlzIGEgdmFsaWQgbGV0dGVyIGFzIGNsYXNzaWZpZWQgYnkgIkMiIGxvY2FsZS4KK2lubGluZSBib29sIGlzQWxwaGEoY2hhciBDKSB7CisgIHJldHVybiAoJ2EnIDw9IEMgJiYgQyA8PSAneicpIHx8ICgnQScgPD0gQyAmJiBDIDw9ICdaJyk7Cit9CisKKy8vLyBDaGVja3Mgd2hldGhlciBjaGFyYWN0ZXIgXHAgQyBpcyBlaXRoZXIgYSBkZWNpbWFsIGRpZ2l0IG9yIGFuIHVwcGVyY2FzZSBvcgorLy8vIGxvd2VyY2FzZSBsZXR0ZXIgYXMgY2xhc3NpZmllZCBieSAiQyIgbG9jYWxlLgoraW5saW5lIGJvb2wgaXNBbG51bShjaGFyIEMpIHsgcmV0dXJuIGlzQWxwaGEoQykgfHwgaXNEaWdpdChDKTsgfQorCisvLy8gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBsb3dlcmNhc2UgY2hhcmFjdGVyIGlmIFxwIHggaXMgdXBwZXJjYXNlLgoraW5saW5lIGNoYXIgdG9Mb3dlcihjaGFyIHgpIHsKKyAgaWYgKHggPj0gJ0EnICYmIHggPD0gJ1onKQorICAgIHJldHVybiB4IC0gJ0EnICsgJ2EnOworICByZXR1cm4geDsKK30KKworLy8vIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgdXBwZXJjYXNlIGNoYXJhY3RlciBpZiBccCB4IGlzIGxvd2VyY2FzZS4KK2lubGluZSBjaGFyIHRvVXBwZXIoY2hhciB4KSB7CisgIGlmICh4ID49ICdhJyAmJiB4IDw9ICd6JykKKyAgICByZXR1cm4geCAtICdhJyArICdBJzsKKyAgcmV0dXJuIHg7Cit9CisKK2lubGluZSBzdGQ6OnN0cmluZyB1dG9oZXhzdHIodWludDY0X3QgWCwgYm9vbCBMb3dlckNhc2UgPSBmYWxzZSkgeworICBjaGFyIEJ1ZmZlclsxN107CisgIGNoYXIgKkJ1ZlB0ciA9IHN0ZDo6ZW5kKEJ1ZmZlcik7CisKKyAgaWYgKFggPT0gMCkgKi0tQnVmUHRyID0gJzAnOworCisgIHdoaWxlIChYKSB7CisgICAgdW5zaWduZWQgY2hhciBNb2QgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihYKSAmIDE1OworICAgICotLUJ1ZlB0ciA9IGhleGRpZ2l0KE1vZCwgTG93ZXJDYXNlKTsKKyAgICBYID4+PSA0OworICB9CisKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKEJ1ZlB0ciwgc3RkOjplbmQoQnVmZmVyKSk7Cit9CisKKy8vLyBDb252ZXJ0IGJ1ZmZlciBccCBJbnB1dCB0byBpdHMgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24uCisvLy8gVGhlIHJldHVybmVkIHN0cmluZyBpcyBkb3VibGUgdGhlIHNpemUgb2YgXHAgSW5wdXQuCitpbmxpbmUgc3RkOjpzdHJpbmcgdG9IZXgoU3RyaW5nUmVmIElucHV0KSB7CisgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBMVVQgPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisgIHNpemVfdCBMZW5ndGggPSBJbnB1dC5zaXplKCk7CisKKyAgc3RkOjpzdHJpbmcgT3V0cHV0OworICBPdXRwdXQucmVzZXJ2ZSgyICogTGVuZ3RoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBMZW5ndGg7ICsraSkgeworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgYyA9IElucHV0W2ldOworICAgIE91dHB1dC5wdXNoX2JhY2soTFVUW2MgPj4gNF0pOworICAgIE91dHB1dC5wdXNoX2JhY2soTFVUW2MgJiAxNV0pOworICB9CisgIHJldHVybiBPdXRwdXQ7Cit9CisKK2lubGluZSBzdGQ6OnN0cmluZyB0b0hleChBcnJheVJlZjx1aW50OF90PiBJbnB1dCkgeworICByZXR1cm4gdG9IZXgodG9TdHJpbmdSZWYoSW5wdXQpKTsKK30KKworaW5saW5lIHVpbnQ4X3QgaGV4RnJvbU5pYmJsZXMoY2hhciBNU0IsIGNoYXIgTFNCKSB7CisgIHVuc2lnbmVkIFUxID0gaGV4RGlnaXRWYWx1ZShNU0IpOworICB1bnNpZ25lZCBVMiA9IGhleERpZ2l0VmFsdWUoTFNCKTsKKyAgYXNzZXJ0KFUxICE9IC0xVSAmJiBVMiAhPSAtMVUpOworCisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90PigoVTEgPDwgNCkgfCBVMik7Cit9CisKKy8vLyBDb252ZXJ0IGhleGFkZWNpbWFsIHN0cmluZyBccCBJbnB1dCB0byBpdHMgYmluYXJ5IHJlcHJlc2VudGF0aW9uLgorLy8vIFRoZSByZXR1cm4gc3RyaW5nIGlzIGhhbGYgdGhlIHNpemUgb2YgXHAgSW5wdXQuCitpbmxpbmUgc3RkOjpzdHJpbmcgZnJvbUhleChTdHJpbmdSZWYgSW5wdXQpIHsKKyAgaWYgKElucHV0LmVtcHR5KCkpCisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisKKyAgc3RkOjpzdHJpbmcgT3V0cHV0OworICBPdXRwdXQucmVzZXJ2ZSgoSW5wdXQuc2l6ZSgpICsgMSkgLyAyKTsKKyAgaWYgKElucHV0LnNpemUoKSAlIDIgPT0gMSkgeworICAgIE91dHB1dC5wdXNoX2JhY2soaGV4RnJvbU5pYmJsZXMoJzAnLCBJbnB1dC5mcm9udCgpKSk7CisgICAgSW5wdXQgPSBJbnB1dC5kcm9wX2Zyb250KCk7CisgIH0KKworICBhc3NlcnQoSW5wdXQuc2l6ZSgpICUgMiA9PSAwKTsKKyAgd2hpbGUgKCFJbnB1dC5lbXB0eSgpKSB7CisgICAgdWludDhfdCBIZXggPSBoZXhGcm9tTmliYmxlcyhJbnB1dFswXSwgSW5wdXRbMV0pOworICAgIE91dHB1dC5wdXNoX2JhY2soSGV4KTsKKyAgICBJbnB1dCA9IElucHV0LmRyb3BfZnJvbnQoMik7CisgIH0KKyAgcmV0dXJuIE91dHB1dDsKK30KKworLy8vIFxicmllZiBDb252ZXJ0IHRoZSBzdHJpbmcgXHAgUyB0byBhbiBpbnRlZ2VyIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB1c2luZworLy8vIHRoZSByYWRpeCBccCBCYXNlLiAgSWYgXHAgQmFzZSBpcyAwLCBhdXRvLWRldGVjdHMgdGhlIHJhZGl4LgorLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbnVtYmVyIHdhcyBzdWNjZXNzZnVsbHkgY29udmVydGVkLCBmYWxzZSBvdGhlcndpc2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTj4gYm9vbCB0b19pbnRlZ2VyKFN0cmluZ1JlZiBTLCBOICZOdW0sIHVuc2lnbmVkIEJhc2UgPSAwKSB7CisgIHJldHVybiAhUy5nZXRBc0ludGVnZXIoQmFzZSwgTnVtKTsKK30KKworbmFtZXNwYWNlIGRldGFpbCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTj4KK2lubGluZSBib29sIHRvX2Zsb2F0KGNvbnN0IFR3aW5lICZULCBOICZOdW0sIE4gKCpTdHJUbykoY29uc3QgY2hhciAqLCBjaGFyICoqKSkgeworICBTbWFsbFN0cmluZzwzMj4gU3RvcmFnZTsKKyAgU3RyaW5nUmVmIFMgPSBULnRvTnVsbFRlcm1pbmF0ZWRTdHJpbmdSZWYoU3RvcmFnZSk7CisgIGNoYXIgKkVuZDsKKyAgTiBUZW1wID0gU3RyVG8oUy5kYXRhKCksICZFbmQpOworICBpZiAoKkVuZCAhPSAnXDAnKQorICAgIHJldHVybiBmYWxzZTsKKyAgTnVtID0gVGVtcDsKKyAgcmV0dXJuIHRydWU7Cit9Cit9CisKK2lubGluZSBib29sIHRvX2Zsb2F0KGNvbnN0IFR3aW5lICZULCBmbG9hdCAmTnVtKSB7CisgIHJldHVybiBkZXRhaWw6OnRvX2Zsb2F0KFQsIE51bSwgc3RydG9mKTsKK30KKworaW5saW5lIGJvb2wgdG9fZmxvYXQoY29uc3QgVHdpbmUgJlQsIGRvdWJsZSAmTnVtKSB7CisgIHJldHVybiBkZXRhaWw6OnRvX2Zsb2F0KFQsIE51bSwgc3RydG9kKTsKK30KKworaW5saW5lIGJvb2wgdG9fZmxvYXQoY29uc3QgVHdpbmUgJlQsIGxvbmcgZG91YmxlICZOdW0pIHsKKyAgcmV0dXJuIGRldGFpbDo6dG9fZmxvYXQoVCwgTnVtLCBzdHJ0b2xkKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIHV0b3N0cih1aW50NjRfdCBYLCBib29sIGlzTmVnID0gZmFsc2UpIHsKKyAgY2hhciBCdWZmZXJbMjFdOworICBjaGFyICpCdWZQdHIgPSBzdGQ6OmVuZChCdWZmZXIpOworCisgIGlmIChYID09IDApICotLUJ1ZlB0ciA9ICcwJzsgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2UuLi4KKworICB3aGlsZSAoWCkgeworICAgICotLUJ1ZlB0ciA9ICcwJyArIGNoYXIoWCAlIDEwKTsKKyAgICBYIC89IDEwOworICB9CisKKyAgaWYgKGlzTmVnKSAqLS1CdWZQdHIgPSAnLSc7ICAgLy8gQWRkIG5lZ2F0aXZlIHNpZ24uLi4KKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKEJ1ZlB0ciwgc3RkOjplbmQoQnVmZmVyKSk7Cit9CisKK2lubGluZSBzdGQ6OnN0cmluZyBpdG9zdHIoaW50NjRfdCBYKSB7CisgIGlmIChYIDwgMCkKKyAgICByZXR1cm4gdXRvc3RyKHN0YXRpY19jYXN0PHVpbnQ2NF90PigtWCksIHRydWUpOworICBlbHNlCisgICAgcmV0dXJuIHV0b3N0cihzdGF0aWNfY2FzdDx1aW50NjRfdD4oWCkpOworfQorCisvLy8gU3RySW5TdHJOb0Nhc2UgLSBQb3J0YWJsZSB2ZXJzaW9uIG9mIHN0cmNhc2VzdHIuICBMb2NhdGVzIHRoZSBmaXJzdAorLy8vIG9jY3VycmVuY2Ugb2Ygc3RyaW5nICdzMScgaW4gc3RyaW5nICdzMicsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zCisvLy8gdGhlIG9mZnNldCBvZiBzMiBpbiBzMSBvciBucG9zIGlmIHMyIGNhbm5vdCBiZSBmb3VuZC4KK1N0cmluZ1JlZjo6c2l6ZV90eXBlIFN0ckluU3RyTm9DYXNlKFN0cmluZ1JlZiBzMSwgU3RyaW5nUmVmIHMyKTsKKworLy8vIGdldFRva2VuIC0gVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBvbmUgdG9rZW4gZnJvbSBzb3VyY2UsIGlnbm9yaW5nIGFueQorLy8vIGxlYWRpbmcgY2hhcmFjdGVycyB0aGF0IGFwcGVhciBpbiB0aGUgRGVsaW1pdGVycyBzdHJpbmcsIGFuZCBlbmRpbmcgdGhlCisvLy8gdG9rZW4gYXQgYW55IG9mIHRoZSBjaGFyYWN0ZXJzIHRoYXQgYXBwZWFyIGluIHRoZSBEZWxpbWl0ZXJzIHN0cmluZy4gIElmCisvLy8gdGhlcmUgYXJlIG5vIHRva2VucyBpbiB0aGUgc291cmNlIHN0cmluZywgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgorLy8vIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgcGFpciBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgdG9rZW4gYW5kIHRoZQorLy8vIHJlbWFpbmluZyB0YWlsIHN0cmluZy4KK3N0ZDo6cGFpcjxTdHJpbmdSZWYsIFN0cmluZ1JlZj4gZ2V0VG9rZW4oU3RyaW5nUmVmIFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERlbGltaXRlcnMgPSAiIFx0XG5cdlxmXHIiKTsKKworLy8vIFNwbGl0U3RyaW5nIC0gU3BsaXQgdXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKy8vLyBkZWxpbWl0ZXJzLCBhcHBlbmRpbmcgdGhlIHJlc3VsdCBmcmFnbWVudHMgdG8gdGhlIG91dHB1dCBsaXN0Lgordm9pZCBTcGxpdFN0cmluZyhTdHJpbmdSZWYgU291cmNlLAorICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmT3V0RnJhZ21lbnRzLAorICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGVsaW1pdGVycyA9ICIgXHRcblx2XGZcciIpOworCisvLy8gUmV0dXJucyB0aGUgRW5nbGlzaCBzdWZmaXggZm9yIGFuIG9yZGluYWwgaW50ZWdlciAoLXN0LCAtbmQsIC1yZCwgLXRoKS4KK2lubGluZSBTdHJpbmdSZWYgZ2V0T3JkaW5hbFN1ZmZpeCh1bnNpZ25lZCBWYWwpIHsKKyAgLy8gSXQgaXMgY3JpdGljYWxseSBpbXBvcnRhbnQgdGhhdCB3ZSBkbyB0aGlzIHBlcmZlY3RseSBmb3IKKyAgLy8gdXNlci13cml0dGVuIHNlcXVlbmNlcyB3aXRoIG92ZXIgMTAwIGVsZW1lbnRzLgorICBzd2l0Y2ggKFZhbCAlIDEwMCkgeworICBjYXNlIDExOgorICBjYXNlIDEyOgorICBjYXNlIDEzOgorICAgIHJldHVybiAidGgiOworICBkZWZhdWx0OgorICAgIHN3aXRjaCAoVmFsICUgMTApIHsKKyAgICAgIGNhc2UgMTogcmV0dXJuICJzdCI7CisgICAgICBjYXNlIDI6IHJldHVybiAibmQiOworICAgICAgY2FzZSAzOiByZXR1cm4gInJkIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAidGgiOworICAgIH0KKyAgfQorfQorCisvLy8gUHJpbnRFc2NhcGVkU3RyaW5nIC0gUHJpbnQgZWFjaCBjaGFyYWN0ZXIgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcsIGVzY2FwaW5nCisvLy8gaXQgaWYgaXQgaXMgbm90IHByaW50YWJsZSBvciBpZiBpdCBpcyBhbiBlc2NhcGUgY2hhci4KK3ZvaWQgUHJpbnRFc2NhcGVkU3RyaW5nKFN0cmluZ1JlZiBOYW1lLCByYXdfb3N0cmVhbSAmT3V0KTsKKworLy8vIHByaW50TG93ZXJDYXNlIC0gUHJpbnQgZWFjaCBjaGFyYWN0ZXIgYXMgbG93ZXJjYXNlIGlmIGl0IGlzIHVwcGVyY2FzZS4KK3ZvaWQgcHJpbnRMb3dlckNhc2UoU3RyaW5nUmVmIFN0cmluZywgcmF3X29zdHJlYW0gJk91dCk7CisKK25hbWVzcGFjZSBkZXRhaWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3JUPgoraW5saW5lIHN0ZDo6c3RyaW5nIGpvaW5faW1wbChJdGVyYXRvclQgQmVnaW4sIEl0ZXJhdG9yVCBFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTZXBhcmF0b3IsIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKSB7CisgIHN0ZDo6c3RyaW5nIFM7CisgIGlmIChCZWdpbiA9PSBFbmQpCisgICAgcmV0dXJuIFM7CisKKyAgUyArPSAoKkJlZ2luKTsKKyAgd2hpbGUgKCsrQmVnaW4gIT0gRW5kKSB7CisgICAgUyArPSBTZXBhcmF0b3I7CisgICAgUyArPSAoKkJlZ2luKTsKKyAgfQorICByZXR1cm4gUzsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yVD4KK2lubGluZSBzdGQ6OnN0cmluZyBqb2luX2ltcGwoSXRlcmF0b3JUIEJlZ2luLCBJdGVyYXRvclQgRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VwYXJhdG9yLCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKSB7CisgIHN0ZDo6c3RyaW5nIFM7CisgIGlmIChCZWdpbiA9PSBFbmQpCisgICAgcmV0dXJuIFM7CisKKyAgc2l6ZV90IExlbiA9IChzdGQ6OmRpc3RhbmNlKEJlZ2luLCBFbmQpIC0gMSkgKiBTZXBhcmF0b3Iuc2l6ZSgpOworICBmb3IgKEl0ZXJhdG9yVCBJID0gQmVnaW47IEkgIT0gRW5kOyArK0kpCisgICAgTGVuICs9ICgqQmVnaW4pLnNpemUoKTsKKyAgUy5yZXNlcnZlKExlbik7CisgIFMgKz0gKCpCZWdpbik7CisgIHdoaWxlICgrK0JlZ2luICE9IEVuZCkgeworICAgIFMgKz0gU2VwYXJhdG9yOworICAgIFMgKz0gKCpCZWdpbik7CisgIH0KKyAgcmV0dXJuIFM7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXA+CitpbmxpbmUgdm9pZCBqb2luX2l0ZW1zX2ltcGwoc3RkOjpzdHJpbmcgJlJlc3VsdCwgU2VwIFNlcGFyYXRvcikge30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlcCwgdHlwZW5hbWUgQXJnPgoraW5saW5lIHZvaWQgam9pbl9pdGVtc19pbXBsKHN0ZDo6c3RyaW5nICZSZXN1bHQsIFNlcCBTZXBhcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnICZJdGVtKSB7CisgIFJlc3VsdCArPSBJdGVtOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VwLCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZS4uLiBBcmdzPgoraW5saW5lIHZvaWQgam9pbl9pdGVtc19pbXBsKHN0ZDo6c3RyaW5nICZSZXN1bHQsIFNlcCBTZXBhcmF0b3IsIGNvbnN0IEFyZzEgJkExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3MgJiYuLi4gSXRlbXMpIHsKKyAgUmVzdWx0ICs9IEExOworICBSZXN1bHQgKz0gU2VwYXJhdG9yOworICBqb2luX2l0ZW1zX2ltcGwoUmVzdWx0LCBTZXBhcmF0b3IsIHN0ZDo6Zm9yd2FyZDxBcmdzPihJdGVtcykuLi4pOworfQorCitpbmxpbmUgc2l6ZV90IGpvaW5fb25lX2l0ZW1fc2l6ZShjaGFyIEMpIHsgcmV0dXJuIDE7IH0KK2lubGluZSBzaXplX3Qgam9pbl9vbmVfaXRlbV9zaXplKGNvbnN0IGNoYXIgKlMpIHsgcmV0dXJuIFMgPyA6OnN0cmxlbihTKSA6IDA7IH0KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGlubGluZSBzaXplX3Qgam9pbl9vbmVfaXRlbV9zaXplKGNvbnN0IFQgJlN0cikgeworICByZXR1cm4gU3RyLnNpemUoKTsKK30KKworaW5saW5lIHNpemVfdCBqb2luX2l0ZW1zX3NpemUoKSB7IHJldHVybiAwOyB9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBMT4gaW5saW5lIHNpemVfdCBqb2luX2l0ZW1zX3NpemUoY29uc3QgQTEgJkEpIHsKKyAgcmV0dXJuIGpvaW5fb25lX2l0ZW1fc2l6ZShBKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUuLi4gQXJncz4KK2lubGluZSBzaXplX3Qgam9pbl9pdGVtc19zaXplKGNvbnN0IEExICZBLCBBcmdzICYmLi4uIEl0ZW1zKSB7CisgIHJldHVybiBqb2luX29uZV9pdGVtX3NpemUoQSkgKyBqb2luX2l0ZW1zX3NpemUoc3RkOjpmb3J3YXJkPEFyZ3M+KEl0ZW1zKS4uLik7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKworLy8vIEpvaW5zIHRoZSBzdHJpbmdzIGluIHRoZSByYW5nZSBbQmVnaW4sIEVuZCksIGFkZGluZyBTZXBhcmF0b3IgYmV0d2VlbgorLy8vIHRoZSBlbGVtZW50cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvclQ+CitpbmxpbmUgc3RkOjpzdHJpbmcgam9pbihJdGVyYXRvclQgQmVnaW4sIEl0ZXJhdG9yVCBFbmQsIFN0cmluZ1JlZiBTZXBhcmF0b3IpIHsKKyAgdXNpbmcgdGFnID0gdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SXRlcmF0b3JUPjo6aXRlcmF0b3JfY2F0ZWdvcnk7CisgIHJldHVybiBkZXRhaWw6OmpvaW5faW1wbChCZWdpbiwgRW5kLCBTZXBhcmF0b3IsIHRhZygpKTsKK30KKworLy8vIEpvaW5zIHRoZSBzdHJpbmdzIGluIHRoZSByYW5nZSBbUi5iZWdpbigpLCBSLmVuZCgpKSwgYWRkaW5nIFNlcGFyYXRvcgorLy8vIGJldHdlZW4gdGhlIGVsZW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIFJhbmdlPgoraW5saW5lIHN0ZDo6c3RyaW5nIGpvaW4oUmFuZ2UgJiZSLCBTdHJpbmdSZWYgU2VwYXJhdG9yKSB7CisgIHJldHVybiBqb2luKFIuYmVnaW4oKSwgUi5lbmQoKSwgU2VwYXJhdG9yKTsKK30KKworLy8vIEpvaW5zIHRoZSBzdHJpbmdzIGluIHRoZSBwYXJhbWV0ZXIgcGFjayBccCBJdGVtcywgYWRkaW5nIFxwIFNlcGFyYXRvcgorLy8vIGJldHdlZW4gdGhlIGVsZW1lbnRzLiAgQWxsIGFyZ3VtZW50cyBtdXN0IGJlIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8KKy8vLyBzdGQ6OnN0cmluZywgb3IgdGhlcmUgc2hvdWxkIGJlIGFuIG92ZXJsb2FkIG9mIHN0ZDo6c3RyaW5nOjpvcGVyYXRvcis9KCkKKy8vLyB0aGF0IGFjY2VwdHMgdGhlIGFyZ3VtZW50IGV4cGxpY2l0bHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VwLCB0eXBlbmFtZS4uLiBBcmdzPgoraW5saW5lIHN0ZDo6c3RyaW5nIGpvaW5faXRlbXMoU2VwIFNlcGFyYXRvciwgQXJncyAmJi4uLiBJdGVtcykgeworICBzdGQ6OnN0cmluZyBSZXN1bHQ7CisgIGlmIChzaXplb2YuLi4oSXRlbXMpID09IDApCisgICAgcmV0dXJuIFJlc3VsdDsKKworICBzaXplX3QgTlMgPSBkZXRhaWw6OmpvaW5fb25lX2l0ZW1fc2l6ZShTZXBhcmF0b3IpOworICBzaXplX3QgTkkgPSBkZXRhaWw6OmpvaW5faXRlbXNfc2l6ZShzdGQ6OmZvcndhcmQ8QXJncz4oSXRlbXMpLi4uKTsKKyAgUmVzdWx0LnJlc2VydmUoTkkgKyAoc2l6ZW9mLi4uKEl0ZW1zKSAtIDEpICogTlMgKyAxKTsKKyAgZGV0YWlsOjpqb2luX2l0ZW1zX2ltcGwoUmVzdWx0LCBTZXBhcmF0b3IsIHN0ZDo6Zm9yd2FyZDxBcmdzPihJdGVtcykuLi4pOworICByZXR1cm4gUmVzdWx0OworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfU1RSSU5HRVhUUkFTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1N0cmluZ01hcC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM0ZDVlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1N0cmluZ01hcC5oCkBAIC0wLDAgKzEsNTU4IEBACisvLz09PS0gU3RyaW5nTWFwLmggLSBTdHJpbmcgSGFzaCB0YWJsZSBtYXAgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBTdHJpbmdNYXAgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9TVFJJTkdNQVBfSAorI2RlZmluZSBMTFZNX0FEVF9TVFJJTkdNQVBfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeT4gY2xhc3MgU3RyaW5nTWFwQ29uc3RJdGVyYXRvcjsKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHk+IGNsYXNzIFN0cmluZ01hcEl0ZXJhdG9yOwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeT4gY2xhc3MgU3RyaW5nTWFwS2V5SXRlcmF0b3I7CisKKy8vLyBTdHJpbmdNYXBFbnRyeUJhc2UgLSBTaGFyZWQgYmFzZSBjbGFzcyBvZiBTdHJpbmdNYXBFbnRyeSBpbnN0YW5jZXMuCitjbGFzcyBTdHJpbmdNYXBFbnRyeUJhc2UgeworICBzaXplX3QgU3RyTGVuOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFN0cmluZ01hcEVudHJ5QmFzZShzaXplX3QgTGVuKSA6IFN0ckxlbihMZW4pIHt9CisKKyAgc2l6ZV90IGdldEtleUxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIFN0ckxlbjsgfQorfTsKKworLy8vIFN0cmluZ01hcEltcGwgLSBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIG9mIFN0cmluZ01hcCB0aGF0IGlzIHNoYXJlZCBhbW9uZworLy8vIGFsbCBvZiBpdHMgaW5zdGFudGlhdGlvbnMuCitjbGFzcyBTdHJpbmdNYXBJbXBsIHsKK3Byb3RlY3RlZDoKKyAgLy8gQXJyYXkgb2YgTnVtQnVja2V0cyBwb2ludGVycyB0byBlbnRyaWVzLCBudWxsIHBvaW50ZXJzIGFyZSBob2xlcy4KKyAgLy8gVGhlVGFibGVbTnVtQnVja2V0c10gY29udGFpbnMgYSBzZW50aW5lbCB2YWx1ZSBmb3IgZWFzeSBpdGVyYXRpb24uIEZvbGxvd2VkCisgIC8vIGJ5IGFuIGFycmF5IG9mIHRoZSBhY3R1YWwgaGFzaCB2YWx1ZXMgYXMgdW5zaWduZWQgaW50ZWdlcnMuCisgIFN0cmluZ01hcEVudHJ5QmFzZSAqKlRoZVRhYmxlID0gbnVsbHB0cjsKKyAgdW5zaWduZWQgTnVtQnVja2V0cyA9IDA7CisgIHVuc2lnbmVkIE51bUl0ZW1zID0gMDsKKyAgdW5zaWduZWQgTnVtVG9tYnN0b25lcyA9IDA7CisgIHVuc2lnbmVkIEl0ZW1TaXplOworCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IFN0cmluZ01hcEltcGwodW5zaWduZWQgaXRlbVNpemUpCisgICAgICA6IEl0ZW1TaXplKGl0ZW1TaXplKSB7fQorICBTdHJpbmdNYXBJbXBsKFN0cmluZ01hcEltcGwgJiZSSFMpCisgICAgICA6IFRoZVRhYmxlKFJIUy5UaGVUYWJsZSksIE51bUJ1Y2tldHMoUkhTLk51bUJ1Y2tldHMpLAorICAgICAgICBOdW1JdGVtcyhSSFMuTnVtSXRlbXMpLCBOdW1Ub21ic3RvbmVzKFJIUy5OdW1Ub21ic3RvbmVzKSwKKyAgICAgICAgSXRlbVNpemUoUkhTLkl0ZW1TaXplKSB7CisgICAgUkhTLlRoZVRhYmxlID0gbnVsbHB0cjsKKyAgICBSSFMuTnVtQnVja2V0cyA9IDA7CisgICAgUkhTLk51bUl0ZW1zID0gMDsKKyAgICBSSFMuTnVtVG9tYnN0b25lcyA9IDA7CisgIH0KKworICBTdHJpbmdNYXBJbXBsKHVuc2lnbmVkIEluaXRTaXplLCB1bnNpZ25lZCBJdGVtU2l6ZSk7CisgIHVuc2lnbmVkIFJlaGFzaFRhYmxlKHVuc2lnbmVkIEJ1Y2tldE5vID0gMCk7CisKKyAgLy8vIExvb2t1cEJ1Y2tldEZvciAtIExvb2sgdXAgdGhlIGJ1Y2tldCB0aGF0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHNob3VsZCBlbmQKKyAgLy8vIHVwIGluLiAgSWYgaXQgYWxyZWFkeSBleGlzdHMgYXMgYSBrZXkgaW4gdGhlIG1hcCwgdGhlIEl0ZW0gcG9pbnRlciBmb3IgdGhlCisgIC8vLyBzcGVjaWZpZWQgYnVja2V0IHdpbGwgYmUgbm9uLW51bGwuICBPdGhlcndpc2UsIGl0IHdpbGwgYmUgbnVsbC4gIEluIGVpdGhlcgorICAvLy8gY2FzZSwgdGhlIEZ1bGxIYXNoVmFsdWUgZmllbGQgb2YgdGhlIGJ1Y2tldCB3aWxsIGJlIHNldCB0byB0aGUgaGFzaCB2YWx1ZQorICAvLy8gb2YgdGhlIHN0cmluZy4KKyAgdW5zaWduZWQgTG9va3VwQnVja2V0Rm9yKFN0cmluZ1JlZiBLZXkpOworCisgIC8vLyBGaW5kS2V5IC0gTG9vayB1cCB0aGUgYnVja2V0IHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBrZXkuIElmIGl0IGV4aXN0cworICAvLy8gaW4gdGhlIG1hcCwgcmV0dXJuIHRoZSBidWNrZXQgbnVtYmVyIG9mIHRoZSBrZXkuICBPdGhlcndpc2UgcmV0dXJuIC0xLgorICAvLy8gVGhpcyBkb2VzIG5vdCBtb2RpZnkgdGhlIG1hcC4KKyAgaW50IEZpbmRLZXkoU3RyaW5nUmVmIEtleSkgY29uc3Q7CisKKyAgLy8vIFJlbW92ZUtleSAtIFJlbW92ZSB0aGUgc3BlY2lmaWVkIFN0cmluZ01hcEVudHJ5IGZyb20gdGhlIHRhYmxlLCBidXQgZG8gbm90CisgIC8vLyBkZWxldGUgaXQuICBUaGlzIGFib3J0cyBpZiB0aGUgdmFsdWUgaXNuJ3QgaW4gdGhlIHRhYmxlLgorICB2b2lkIFJlbW92ZUtleShTdHJpbmdNYXBFbnRyeUJhc2UgKlYpOworCisgIC8vLyBSZW1vdmVLZXkgLSBSZW1vdmUgdGhlIFN0cmluZ01hcEVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGtleSBmcm9tIHRoZQorICAvLy8gdGFibGUsIHJldHVybmluZyBpdC4gIElmIHRoZSBrZXkgaXMgbm90IGluIHRoZSB0YWJsZSwgdGhpcyByZXR1cm5zIG51bGwuCisgIFN0cmluZ01hcEVudHJ5QmFzZSAqUmVtb3ZlS2V5KFN0cmluZ1JlZiBLZXkpOworCisgIC8vLyBBbGxvY2F0ZSB0aGUgdGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBidWNrZXRzIGFuZCBvdGhlcndpc2UKKyAgLy8vIHNldHVwIHRoZSBtYXAgYXMgZW1wdHkuCisgIHZvaWQgaW5pdCh1bnNpZ25lZCBTaXplKTsKKworcHVibGljOgorICBzdGF0aWMgU3RyaW5nTWFwRW50cnlCYXNlICpnZXRUb21ic3RvbmVWYWwoKSB7CisgICAgdWludHB0cl90IFZhbCA9IHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oLTEpOworICAgIFZhbCA8PD0gUG9pbnRlckxpa2VUeXBlVHJhaXRzPFN0cmluZ01hcEVudHJ5QmFzZSAqPjo6TnVtTG93Qml0c0F2YWlsYWJsZTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTdHJpbmdNYXBFbnRyeUJhc2UgKj4oVmFsKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUJ1Y2tldHMoKSBjb25zdCB7IHJldHVybiBOdW1CdWNrZXRzOyB9CisgIHVuc2lnbmVkIGdldE51bUl0ZW1zKCkgY29uc3QgeyByZXR1cm4gTnVtSXRlbXM7IH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gTnVtSXRlbXMgPT0gMDsgfQorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gTnVtSXRlbXM7IH0KKworICB2b2lkIHN3YXAoU3RyaW5nTWFwSW1wbCAmT3RoZXIpIHsKKyAgICBzdGQ6OnN3YXAoVGhlVGFibGUsIE90aGVyLlRoZVRhYmxlKTsKKyAgICBzdGQ6OnN3YXAoTnVtQnVja2V0cywgT3RoZXIuTnVtQnVja2V0cyk7CisgICAgc3RkOjpzd2FwKE51bUl0ZW1zLCBPdGhlci5OdW1JdGVtcyk7CisgICAgc3RkOjpzd2FwKE51bVRvbWJzdG9uZXMsIE90aGVyLk51bVRvbWJzdG9uZXMpOworICB9Cit9OworCisvLy8gU3RyaW5nTWFwRW50cnkgLSBUaGlzIGlzIHVzZWQgdG8gcmVwcmVzZW50IG9uZSB2YWx1ZSB0aGF0IGlzIGluc2VydGVkIGludG8KKy8vLyBhIFN0cmluZ01hcC4gIEl0IGNvbnRhaW5zIHRoZSBWYWx1ZSBpdHNlbGYgYW5kIHRoZSBrZXk6IHRoZSBzdHJpbmcgbGVuZ3RoCisvLy8gYW5kIGRhdGEuCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5PgorY2xhc3MgU3RyaW5nTWFwRW50cnkgOiBwdWJsaWMgU3RyaW5nTWFwRW50cnlCYXNlIHsKK3B1YmxpYzoKKyAgVmFsdWVUeSBzZWNvbmQ7CisKKyAgZXhwbGljaXQgU3RyaW5nTWFwRW50cnkoc2l6ZV90IHN0ckxlbikKKyAgICA6IFN0cmluZ01hcEVudHJ5QmFzZShzdHJMZW4pLCBzZWNvbmQoKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gSW5pdFR5PgorICBTdHJpbmdNYXBFbnRyeShzaXplX3Qgc3RyTGVuLCBJbml0VHkgJiYuLi4gSW5pdFZhbHMpCisgICAgICA6IFN0cmluZ01hcEVudHJ5QmFzZShzdHJMZW4pLCBzZWNvbmQoc3RkOjpmb3J3YXJkPEluaXRUeT4oSW5pdFZhbHMpLi4uKSB7fQorICBTdHJpbmdNYXBFbnRyeShTdHJpbmdNYXBFbnRyeSAmRSkgPSBkZWxldGU7CisKKyAgU3RyaW5nUmVmIGdldEtleSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RyaW5nUmVmKGdldEtleURhdGEoKSwgZ2V0S2V5TGVuZ3RoKCkpOworICB9CisKKyAgY29uc3QgVmFsdWVUeSAmZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBzZWNvbmQ7IH0KKyAgVmFsdWVUeSAmZ2V0VmFsdWUoKSB7IHJldHVybiBzZWNvbmQ7IH0KKworICB2b2lkIHNldFZhbHVlKGNvbnN0IFZhbHVlVHkgJlYpIHsgc2Vjb25kID0gVjsgfQorCisgIC8vLyBnZXRLZXlEYXRhIC0gUmV0dXJuIHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nIGRhdGEgdGhhdCBpcyB0aGUga2V5IGZvciB0aGlzCisgIC8vLyB2YWx1ZS4gIFRoZSBzdHJpbmcgZGF0YSBpcyBhbHdheXMgc3RvcmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQorICAvLy8gU3RyaW5nTWFwRW50cnkgb2JqZWN0LgorICBjb25zdCBjaGFyICpnZXRLZXlEYXRhKCkgY29uc3Qge3JldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih0aGlzKzEpO30KKworICBTdHJpbmdSZWYgZmlyc3QoKSBjb25zdCB7IHJldHVybiBTdHJpbmdSZWYoZ2V0S2V5RGF0YSgpLCBnZXRLZXlMZW5ndGgoKSk7IH0KKworICAvLy8gQ3JlYXRlIGEgU3RyaW5nTWFwRW50cnkgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGNvbnN0cnVjdCB0aGUgdmFsdWUgdXNpbmcKKyAgLy8vIFxwIEluaXRpVmFscy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFsbG9jYXRvclR5LCB0eXBlbmFtZS4uLiBJbml0VHk+CisgIHN0YXRpYyBTdHJpbmdNYXBFbnRyeSAqQ3JlYXRlKFN0cmluZ1JlZiBLZXksIEFsbG9jYXRvclR5ICZBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRUeSAmJi4uLiBJbml0VmFscykgeworICAgIHNpemVfdCBLZXlMZW5ndGggPSBLZXkuc2l6ZSgpOworCisgICAgLy8gQWxsb2NhdGUgYSBuZXcgaXRlbSB3aXRoIHNwYWNlIGZvciB0aGUgc3RyaW5nIGF0IHRoZSBlbmQgYW5kIGEgbnVsbAorICAgIC8vIHRlcm1pbmF0b3IuCisgICAgc2l6ZV90IEFsbG9jU2l6ZSA9IHNpemVvZihTdHJpbmdNYXBFbnRyeSkgKyBLZXlMZW5ndGggKyAxOworICAgIHNpemVfdCBBbGlnbm1lbnQgPSBhbGlnbm9mKFN0cmluZ01hcEVudHJ5KTsKKworICAgIFN0cmluZ01hcEVudHJ5ICpOZXdJdGVtID0KKyAgICAgIHN0YXRpY19jYXN0PFN0cmluZ01hcEVudHJ5Kj4oQWxsb2NhdG9yLkFsbG9jYXRlKEFsbG9jU2l6ZSxBbGlnbm1lbnQpKTsKKworICAgIGlmIChOZXdJdGVtID09IG51bGxwdHIpCisgICAgICByZXBvcnRfYmFkX2FsbG9jX2Vycm9yKCJBbGxvY2F0aW9uIG9mIFN0cmluZ01hcCBlbnRyeSBmYWlsZWQuIik7CisKKyAgICAvLyBDb25zdHJ1Y3QgdGhlIHZhbHVlLgorICAgIG5ldyAoTmV3SXRlbSkgU3RyaW5nTWFwRW50cnkoS2V5TGVuZ3RoLCBzdGQ6OmZvcndhcmQ8SW5pdFR5PihJbml0VmFscykuLi4pOworCisgICAgLy8gQ29weSB0aGUgc3RyaW5nIGluZm9ybWF0aW9uLgorICAgIGNoYXIgKlN0ckJ1ZmZlciA9IGNvbnN0X2Nhc3Q8Y2hhcio+KE5ld0l0ZW0tPmdldEtleURhdGEoKSk7CisgICAgaWYgKEtleUxlbmd0aCA+IDApCisgICAgICBtZW1jcHkoU3RyQnVmZmVyLCBLZXkuZGF0YSgpLCBLZXlMZW5ndGgpOworICAgIFN0ckJ1ZmZlcltLZXlMZW5ndGhdID0gMDsgIC8vIE51bGwgdGVybWluYXRlIGZvciBjb252ZW5pZW5jZSBvZiBjbGllbnRzLgorICAgIHJldHVybiBOZXdJdGVtOworICB9CisKKyAgLy8vIENyZWF0ZSAtIENyZWF0ZSBhIFN0cmluZ01hcEVudHJ5IHdpdGggbm9ybWFsIG1hbGxvYy9mcmVlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gSW5pdFR5cGU+CisgIHN0YXRpYyBTdHJpbmdNYXBFbnRyeSAqQ3JlYXRlKFN0cmluZ1JlZiBLZXksIEluaXRUeXBlICYmLi4uIEluaXRWYWwpIHsKKyAgICBNYWxsb2NBbGxvY2F0b3IgQTsKKyAgICByZXR1cm4gQ3JlYXRlKEtleSwgQSwgc3RkOjpmb3J3YXJkPEluaXRUeXBlPihJbml0VmFsKS4uLik7CisgIH0KKworICBzdGF0aWMgU3RyaW5nTWFwRW50cnkgKkNyZWF0ZShTdHJpbmdSZWYgS2V5KSB7CisgICAgcmV0dXJuIENyZWF0ZShLZXksIFZhbHVlVHkoKSk7CisgIH0KKworICAvLy8gR2V0U3RyaW5nTWFwRW50cnlGcm9tS2V5RGF0YSAtIEdpdmVuIGtleSBkYXRhIHRoYXQgaXMga25vd24gdG8gYmUgZW1iZWRkZWQKKyAgLy8vIGludG8gYSBTdHJpbmdNYXBFbnRyeSwgcmV0dXJuIHRoZSBTdHJpbmdNYXBFbnRyeSBpdHNlbGYuCisgIHN0YXRpYyBTdHJpbmdNYXBFbnRyeSAmR2V0U3RyaW5nTWFwRW50cnlGcm9tS2V5RGF0YShjb25zdCBjaGFyICpLZXlEYXRhKSB7CisgICAgY2hhciAqUHRyID0gY29uc3RfY2FzdDxjaGFyKj4oS2V5RGF0YSkgLSBzaXplb2YoU3RyaW5nTWFwRW50cnk8VmFsdWVUeT4pOworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxTdHJpbmdNYXBFbnRyeSo+KFB0cik7CisgIH0KKworICAvLy8gRGVzdHJveSAtIERlc3Ryb3kgdGhpcyBTdHJpbmdNYXBFbnRyeSwgcmVsZWFzaW5nIG1lbW9yeSBiYWNrIHRvIHRoZQorICAvLy8gc3BlY2lmaWVkIGFsbG9jYXRvci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yVHk+CisgIHZvaWQgRGVzdHJveShBbGxvY2F0b3JUeSAmQWxsb2NhdG9yKSB7CisgICAgLy8gRnJlZSBtZW1vcnkgcmVmZXJlbmNlZCBieSB0aGUgaXRlbS4KKyAgICBzaXplX3QgQWxsb2NTaXplID0gc2l6ZW9mKFN0cmluZ01hcEVudHJ5KSArIGdldEtleUxlbmd0aCgpICsgMTsKKyAgICB0aGlzLT5+U3RyaW5nTWFwRW50cnkoKTsKKyAgICBBbGxvY2F0b3IuRGVhbGxvY2F0ZShzdGF0aWNfY2FzdDx2b2lkICo+KHRoaXMpLCBBbGxvY1NpemUpOworICB9CisKKyAgLy8vIERlc3Ryb3kgdGhpcyBvYmplY3QsIHJlbGVhc2luZyBtZW1vcnkgYmFjayB0byB0aGUgbWFsbG9jIGFsbG9jYXRvci4KKyAgdm9pZCBEZXN0cm95KCkgeworICAgIE1hbGxvY0FsbG9jYXRvciBBOworICAgIERlc3Ryb3koQSk7CisgIH0KK307CisKKy8vLyBTdHJpbmdNYXAgLSBUaGlzIGlzIGFuIHVuY29udmVudGlvbmFsIG1hcCB0aGF0IGlzIHNwZWNpYWxpemVkIGZvciBoYW5kbGluZworLy8vIGtleXMgdGhhdCBhcmUgInN0cmluZ3MiLCB3aGljaCBhcmUgYmFzaWNhbGx5IHJhbmdlcyBvZiBieXRlcy4gVGhpcyBkb2VzIHNvbWUKKy8vLyBmdW5reSBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgaGFzaGluZyB0aGluZ3MgdG8gbWFrZSBpdCBleHRyZW1lbHkgZWZmaWNpZW50LAorLy8vIHN0b3JpbmcgdGhlIHN0cmluZyBkYXRhICphZnRlciogdGhlIHZhbHVlIGluIHRoZSBtYXAuCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5LCB0eXBlbmFtZSBBbGxvY2F0b3JUeSA9IE1hbGxvY0FsbG9jYXRvcj4KK2NsYXNzIFN0cmluZ01hcCA6IHB1YmxpYyBTdHJpbmdNYXBJbXBsIHsKKyAgQWxsb2NhdG9yVHkgQWxsb2NhdG9yOworCitwdWJsaWM6CisgIHVzaW5nIE1hcEVudHJ5VHkgPSBTdHJpbmdNYXBFbnRyeTxWYWx1ZVR5PjsKKworICBTdHJpbmdNYXAoKSA6IFN0cmluZ01hcEltcGwoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHNpemVvZihNYXBFbnRyeVR5KSkpIHt9CisKKyAgZXhwbGljaXQgU3RyaW5nTWFwKHVuc2lnbmVkIEluaXRpYWxTaXplKQorICAgIDogU3RyaW5nTWFwSW1wbChJbml0aWFsU2l6ZSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHNpemVvZihNYXBFbnRyeVR5KSkpIHt9CisKKyAgZXhwbGljaXQgU3RyaW5nTWFwKEFsbG9jYXRvclR5IEEpCisgICAgOiBTdHJpbmdNYXBJbXBsKHN0YXRpY19jYXN0PHVuc2lnbmVkPihzaXplb2YoTWFwRW50cnlUeSkpKSwgQWxsb2NhdG9yKEEpIHt9CisKKyAgU3RyaW5nTWFwKHVuc2lnbmVkIEluaXRpYWxTaXplLCBBbGxvY2F0b3JUeSBBKQorICAgIDogU3RyaW5nTWFwSW1wbChJbml0aWFsU2l6ZSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHNpemVvZihNYXBFbnRyeVR5KSkpLAorICAgICAgQWxsb2NhdG9yKEEpIHt9CisKKyAgU3RyaW5nTWFwKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OnBhaXI8U3RyaW5nUmVmLCBWYWx1ZVR5Pj4gTGlzdCkKKyAgICAgIDogU3RyaW5nTWFwSW1wbChMaXN0LnNpemUoKSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHNpemVvZihNYXBFbnRyeVR5KSkpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJlAgOiBMaXN0KSB7CisgICAgICBpbnNlcnQoUCk7CisgICAgfQorICB9CisKKyAgU3RyaW5nTWFwKFN0cmluZ01hcCAmJlJIUykKKyAgICAgIDogU3RyaW5nTWFwSW1wbChzdGQ6Om1vdmUoUkhTKSksIEFsbG9jYXRvcihzdGQ6Om1vdmUoUkhTLkFsbG9jYXRvcikpIHt9CisKKyAgU3RyaW5nTWFwKGNvbnN0IFN0cmluZ01hcCAmUkhTKSA6CisgICAgU3RyaW5nTWFwSW1wbChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oc2l6ZW9mKE1hcEVudHJ5VHkpKSksCisgICAgQWxsb2NhdG9yKFJIUy5BbGxvY2F0b3IpIHsKKyAgICBpZiAoUkhTLmVtcHR5KCkpCisgICAgICByZXR1cm47CisKKyAgICAvLyBBbGxvY2F0ZSBUaGVUYWJsZSBvZiB0aGUgc2FtZSBzaXplIGFzIFJIUydzIFRoZVRhYmxlLCBhbmQgc2V0IHRoZQorICAgIC8vIHNlbnRpbmVsIGFwcHJvcHJpYXRlbHkgKGFuZCBOdW1CdWNrZXRzKS4KKyAgICBpbml0KFJIUy5OdW1CdWNrZXRzKTsKKyAgICB1bnNpZ25lZCAqSGFzaFRhYmxlID0gKHVuc2lnbmVkICopKFRoZVRhYmxlICsgTnVtQnVja2V0cyArIDEpLAorICAgICAgICAgICAgICpSSFNIYXNoVGFibGUgPSAodW5zaWduZWQgKikoUkhTLlRoZVRhYmxlICsgTnVtQnVja2V0cyArIDEpOworCisgICAgTnVtSXRlbXMgPSBSSFMuTnVtSXRlbXM7CisgICAgTnVtVG9tYnN0b25lcyA9IFJIUy5OdW1Ub21ic3RvbmVzOworICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBOdW1CdWNrZXRzOyBJICE9IEU7ICsrSSkgeworICAgICAgU3RyaW5nTWFwRW50cnlCYXNlICpCdWNrZXQgPSBSSFMuVGhlVGFibGVbSV07CisgICAgICBpZiAoIUJ1Y2tldCB8fCBCdWNrZXQgPT0gZ2V0VG9tYnN0b25lVmFsKCkpIHsKKyAgICAgICAgVGhlVGFibGVbSV0gPSBCdWNrZXQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBUaGVUYWJsZVtJXSA9IE1hcEVudHJ5VHk6OkNyZWF0ZSgKKyAgICAgICAgICBzdGF0aWNfY2FzdDxNYXBFbnRyeVR5ICo+KEJ1Y2tldCktPmdldEtleSgpLCBBbGxvY2F0b3IsCisgICAgICAgICAgc3RhdGljX2Nhc3Q8TWFwRW50cnlUeSAqPihCdWNrZXQpLT5nZXRWYWx1ZSgpKTsKKyAgICAgIEhhc2hUYWJsZVtJXSA9IFJIU0hhc2hUYWJsZVtJXTsKKyAgICB9CisKKyAgICAvLyBOb3RlIHRoYXQgaGVyZSB3ZSd2ZSBjb3BpZWQgZXZlcnl0aGluZyBmcm9tIHRoZSBSSFMgaW50byB0aGlzIG9iamVjdCwKKyAgICAvLyB0b21ic3RvbmVzIGluY2x1ZGVkLiBXZSBjb3VsZCwgaW5zdGVhZCwgaGF2ZSByZS1wcm9iZWQgZm9yIGVhY2gga2V5IHRvCisgICAgLy8gaW5zdGFudGlhdGUgdGhpcyBuZXcgb2JqZWN0IHdpdGhvdXQgYW55IHRvbWJzdG9uZSBidWNrZXRzLiBUaGUKKyAgICAvLyBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCBpdGVtcyBhcmUgcmFyZWx5IGRlbGV0ZWQgZnJvbSBtb3N0IFN0cmluZ01hcHMsCisgICAgLy8gYW5kIHNvIHRvbWJzdG9uZXMgYXJlIHJhcmUsIHNvIHRoZSBjb3N0IG9mIHJlLXByb2JpbmcgZm9yIGFsbCBpbnB1dHMgaXMKKyAgICAvLyBub3Qgd29ydGh3aGlsZS4KKyAgfQorCisgIFN0cmluZ01hcCAmb3BlcmF0b3I9KFN0cmluZ01hcCBSSFMpIHsKKyAgICBTdHJpbmdNYXBJbXBsOjpzd2FwKFJIUyk7CisgICAgc3RkOjpzd2FwKEFsbG9jYXRvciwgUkhTLkFsbG9jYXRvcik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgflN0cmluZ01hcCgpIHsKKyAgICAvLyBEZWxldGUgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgbWFwLCBidXQgZG9uJ3QgcmVzZXQgdGhlIGVsZW1lbnRzCisgICAgLy8gdG8gZGVmYXVsdCB2YWx1ZXMuICBUaGlzIGlzIGEgY29weSBvZiBjbGVhcigpLCBidXQgYXZvaWRzIHVubmVjZXNzYXJ5CisgICAgLy8gd29yayBub3QgcmVxdWlyZWQgaW4gdGhlIGRlc3RydWN0b3IuCisgICAgaWYgKCFlbXB0eSgpKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gTnVtQnVja2V0czsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgU3RyaW5nTWFwRW50cnlCYXNlICpCdWNrZXQgPSBUaGVUYWJsZVtJXTsKKyAgICAgICAgaWYgKEJ1Y2tldCAmJiBCdWNrZXQgIT0gZ2V0VG9tYnN0b25lVmFsKCkpIHsKKyAgICAgICAgICBzdGF0aWNfY2FzdDxNYXBFbnRyeVR5Kj4oQnVja2V0KS0+RGVzdHJveShBbGxvY2F0b3IpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGZyZWUoVGhlVGFibGUpOworICB9CisKKyAgQWxsb2NhdG9yVHkgJmdldEFsbG9jYXRvcigpIHsgcmV0dXJuIEFsbG9jYXRvcjsgfQorICBjb25zdCBBbGxvY2F0b3JUeSAmZ2V0QWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gQWxsb2NhdG9yOyB9CisKKyAgdXNpbmcga2V5X3R5cGUgPSBjb25zdCBjaGFyKjsKKyAgdXNpbmcgbWFwcGVkX3R5cGUgPSBWYWx1ZVR5OworICB1c2luZyB2YWx1ZV90eXBlID0gU3RyaW5nTWFwRW50cnk8VmFsdWVUeT47CisgIHVzaW5nIHNpemVfdHlwZSA9IHNpemVfdDsKKworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IFN0cmluZ01hcENvbnN0SXRlcmF0b3I8VmFsdWVUeT47CisgIHVzaW5nIGl0ZXJhdG9yID0gU3RyaW5nTWFwSXRlcmF0b3I8VmFsdWVUeT47CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7CisgICAgcmV0dXJuIGl0ZXJhdG9yKFRoZVRhYmxlLCBOdW1CdWNrZXRzID09IDApOworICB9CisgIGl0ZXJhdG9yIGVuZCgpIHsKKyAgICByZXR1cm4gaXRlcmF0b3IoVGhlVGFibGUrTnVtQnVja2V0cywgdHJ1ZSk7CisgIH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKFRoZVRhYmxlLCBOdW1CdWNrZXRzID09IDApOworICB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoVGhlVGFibGUrTnVtQnVja2V0cywgdHJ1ZSk7CisgIH0KKworICBpdGVyYXRvcl9yYW5nZTxTdHJpbmdNYXBLZXlJdGVyYXRvcjxWYWx1ZVR5Pj4ga2V5cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShTdHJpbmdNYXBLZXlJdGVyYXRvcjxWYWx1ZVR5PihiZWdpbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdNYXBLZXlJdGVyYXRvcjxWYWx1ZVR5PihlbmQoKSkpOworICB9CisKKyAgaXRlcmF0b3IgZmluZChTdHJpbmdSZWYgS2V5KSB7CisgICAgaW50IEJ1Y2tldCA9IEZpbmRLZXkoS2V5KTsKKyAgICBpZiAoQnVja2V0ID09IC0xKSByZXR1cm4gZW5kKCk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKFRoZVRhYmxlK0J1Y2tldCwgdHJ1ZSk7CisgIH0KKworICBjb25zdF9pdGVyYXRvciBmaW5kKFN0cmluZ1JlZiBLZXkpIGNvbnN0IHsKKyAgICBpbnQgQnVja2V0ID0gRmluZEtleShLZXkpOworICAgIGlmIChCdWNrZXQgPT0gLTEpIHJldHVybiBlbmQoKTsKKyAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoVGhlVGFibGUrQnVja2V0LCB0cnVlKTsKKyAgfQorCisgIC8vLyBsb29rdXAgLSBSZXR1cm4gdGhlIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGtleSwgb3IgYSBkZWZhdWx0CisgIC8vLyBjb25zdHJ1Y3RlZCB2YWx1ZSBpZiBubyBzdWNoIGVudHJ5IGV4aXN0cy4KKyAgVmFsdWVUeSBsb29rdXAoU3RyaW5nUmVmIEtleSkgY29uc3QgeworICAgIGNvbnN0X2l0ZXJhdG9yIGl0ID0gZmluZChLZXkpOworICAgIGlmIChpdCAhPSBlbmQoKSkKKyAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIHJldHVybiBWYWx1ZVR5KCk7CisgIH0KKworICAvLy8gTG9va3VwIHRoZSBWYWx1ZVR5IGZvciB0aGUgXHAgS2V5LCBvciBjcmVhdGUgYSBkZWZhdWx0IGNvbnN0cnVjdGVkIHZhbHVlCisgIC8vLyBpZiB0aGUga2V5IGlzIG5vdCBpbiB0aGUgbWFwLgorICBWYWx1ZVR5ICZvcGVyYXRvcltdKFN0cmluZ1JlZiBLZXkpIHsgcmV0dXJuIHRyeV9lbXBsYWNlKEtleSkuZmlyc3QtPnNlY29uZDsgfQorCisgIC8vLyBjb3VudCAtIFJldHVybiAxIGlmIHRoZSBlbGVtZW50IGlzIGluIHRoZSBtYXAsIDAgb3RoZXJ3aXNlLgorICBzaXplX3R5cGUgY291bnQoU3RyaW5nUmVmIEtleSkgY29uc3QgeworICAgIHJldHVybiBmaW5kKEtleSkgPT0gZW5kKCkgPyAwIDogMTsKKyAgfQorCisgIC8vLyBpbnNlcnQgLSBJbnNlcnQgdGhlIHNwZWNpZmllZCBrZXkvdmFsdWUgcGFpciBpbnRvIHRoZSBtYXAuICBJZiB0aGUga2V5CisgIC8vLyBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbWFwLCByZXR1cm4gZmFsc2UgYW5kIGlnbm9yZSB0aGUgcmVxdWVzdCwgb3RoZXJ3aXNlCisgIC8vLyBpbnNlcnQgaXQgYW5kIHJldHVybiB0cnVlLgorICBib29sIGluc2VydChNYXBFbnRyeVR5ICpLZXlWYWx1ZSkgeworICAgIHVuc2lnbmVkIEJ1Y2tldE5vID0gTG9va3VwQnVja2V0Rm9yKEtleVZhbHVlLT5nZXRLZXkoKSk7CisgICAgU3RyaW5nTWFwRW50cnlCYXNlIComQnVja2V0ID0gVGhlVGFibGVbQnVja2V0Tm9dOworICAgIGlmIChCdWNrZXQgJiYgQnVja2V0ICE9IGdldFRvbWJzdG9uZVZhbCgpKQorICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gQWxyZWFkeSBleGlzdHMgaW4gbWFwLgorCisgICAgaWYgKEJ1Y2tldCA9PSBnZXRUb21ic3RvbmVWYWwoKSkKKyAgICAgIC0tTnVtVG9tYnN0b25lczsKKyAgICBCdWNrZXQgPSBLZXlWYWx1ZTsKKyAgICArK051bUl0ZW1zOworICAgIGFzc2VydChOdW1JdGVtcyArIE51bVRvbWJzdG9uZXMgPD0gTnVtQnVja2V0cyk7CisKKyAgICBSZWhhc2hUYWJsZSgpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIGluc2VydCAtIEluc2VydHMgdGhlIHNwZWNpZmllZCBrZXkvdmFsdWUgcGFpciBpbnRvIHRoZSBtYXAgaWYgdGhlIGtleQorICAvLy8gaXNuJ3QgYWxyZWFkeSBpbiB0aGUgbWFwLiBUaGUgYm9vbCBjb21wb25lbnQgb2YgdGhlIHJldHVybmVkIHBhaXIgaXMgdHJ1ZQorICAvLy8gaWYgYW5kIG9ubHkgaWYgdGhlIGluc2VydGlvbiB0YWtlcyBwbGFjZSwgYW5kIHRoZSBpdGVyYXRvciBjb21wb25lbnQgb2YKKyAgLy8vIHRoZSBwYWlyIHBvaW50cyB0byB0aGUgZWxlbWVudCB3aXRoIGtleSBlcXVpdmFsZW50IHRvIHRoZSBrZXkgb2YgdGhlIHBhaXIuCisgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KHN0ZDo6cGFpcjxTdHJpbmdSZWYsIFZhbHVlVHk+IEtWKSB7CisgICAgcmV0dXJuIHRyeV9lbXBsYWNlKEtWLmZpcnN0LCBzdGQ6Om1vdmUoS1Yuc2Vjb25kKSk7CisgIH0KKworICAvLy8gRW1wbGFjZSBhIG5ldyBlbGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIGtleSBpbnRvIHRoZSBtYXAgaWYgdGhlIGtleSBpc24ndAorICAvLy8gYWxyZWFkeSBpbiB0aGUgbWFwLiBUaGUgYm9vbCBjb21wb25lbnQgb2YgdGhlIHJldHVybmVkIHBhaXIgaXMgdHJ1ZQorICAvLy8gaWYgYW5kIG9ubHkgaWYgdGhlIGluc2VydGlvbiB0YWtlcyBwbGFjZSwgYW5kIHRoZSBpdGVyYXRvciBjb21wb25lbnQgb2YKKyAgLy8vIHRoZSBwYWlyIHBvaW50cyB0byB0aGUgZWxlbWVudCB3aXRoIGtleSBlcXVpdmFsZW50IHRvIHRoZSBrZXkgb2YgdGhlIHBhaXIuCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzVHk+CisgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gdHJ5X2VtcGxhY2UoU3RyaW5nUmVmIEtleSwgQXJnc1R5ICYmLi4uIEFyZ3MpIHsKKyAgICB1bnNpZ25lZCBCdWNrZXRObyA9IExvb2t1cEJ1Y2tldEZvcihLZXkpOworICAgIFN0cmluZ01hcEVudHJ5QmFzZSAqJkJ1Y2tldCA9IFRoZVRhYmxlW0J1Y2tldE5vXTsKKyAgICBpZiAoQnVja2V0ICYmIEJ1Y2tldCAhPSBnZXRUb21ic3RvbmVWYWwoKSkKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihUaGVUYWJsZSArIEJ1Y2tldE5vLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOyAvLyBBbHJlYWR5IGV4aXN0cyBpbiBtYXAuCisKKyAgICBpZiAoQnVja2V0ID09IGdldFRvbWJzdG9uZVZhbCgpKQorICAgICAgLS1OdW1Ub21ic3RvbmVzOworICAgIEJ1Y2tldCA9IE1hcEVudHJ5VHk6OkNyZWF0ZShLZXksIEFsbG9jYXRvciwgc3RkOjpmb3J3YXJkPEFyZ3NUeT4oQXJncykuLi4pOworICAgICsrTnVtSXRlbXM7CisgICAgYXNzZXJ0KE51bUl0ZW1zICsgTnVtVG9tYnN0b25lcyA8PSBOdW1CdWNrZXRzKTsKKworICAgIEJ1Y2tldE5vID0gUmVoYXNoVGFibGUoQnVja2V0Tm8pOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihUaGVUYWJsZSArIEJ1Y2tldE5vLCBmYWxzZSksIHRydWUpOworICB9CisKKyAgLy8gY2xlYXIgLSBFbXB0aWVzIG91dCB0aGUgU3RyaW5nTWFwCisgIHZvaWQgY2xlYXIoKSB7CisgICAgaWYgKGVtcHR5KCkpIHJldHVybjsKKworICAgIC8vIFphcCBhbGwgdmFsdWVzLCByZXNldHRpbmcgdGhlIGtleXMgYmFjayB0byBub24tcHJlc2VudCAobm90IHRvbWJzdG9uZSksCisgICAgLy8gd2hpY2ggaXMgc2FmZSBiZWNhdXNlIHdlJ3JlIHJlbW92aW5nIGFsbCBlbGVtZW50cy4KKyAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gTnVtQnVja2V0czsgSSAhPSBFOyArK0kpIHsKKyAgICAgIFN0cmluZ01hcEVudHJ5QmFzZSAqJkJ1Y2tldCA9IFRoZVRhYmxlW0ldOworICAgICAgaWYgKEJ1Y2tldCAmJiBCdWNrZXQgIT0gZ2V0VG9tYnN0b25lVmFsKCkpIHsKKyAgICAgICAgc3RhdGljX2Nhc3Q8TWFwRW50cnlUeSo+KEJ1Y2tldCktPkRlc3Ryb3koQWxsb2NhdG9yKTsKKyAgICAgIH0KKyAgICAgIEJ1Y2tldCA9IG51bGxwdHI7CisgICAgfQorCisgICAgTnVtSXRlbXMgPSAwOworICAgIE51bVRvbWJzdG9uZXMgPSAwOworICB9CisKKyAgLy8vIHJlbW92ZSAtIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGtleS92YWx1ZSBwYWlyIGZyb20gdGhlIG1hcCwgYnV0IGRvIG5vdAorICAvLy8gZXJhc2UgaXQuICBUaGlzIGFib3J0cyBpZiB0aGUga2V5IGlzIG5vdCBpbiB0aGUgbWFwLgorICB2b2lkIHJlbW92ZShNYXBFbnRyeVR5ICpLZXlWYWx1ZSkgeworICAgIFJlbW92ZUtleShLZXlWYWx1ZSk7CisgIH0KKworICB2b2lkIGVyYXNlKGl0ZXJhdG9yIEkpIHsKKyAgICBNYXBFbnRyeVR5ICZWID0gKkk7CisgICAgcmVtb3ZlKCZWKTsKKyAgICBWLkRlc3Ryb3koQWxsb2NhdG9yKTsKKyAgfQorCisgIGJvb2wgZXJhc2UoU3RyaW5nUmVmIEtleSkgeworICAgIGl0ZXJhdG9yIEkgPSBmaW5kKEtleSk7CisgICAgaWYgKEkgPT0gZW5kKCkpIHJldHVybiBmYWxzZTsKKyAgICBlcmFzZShJKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWRUeSwgdHlwZW5hbWUgVmFsdWVUeT4KK2NsYXNzIFN0cmluZ01hcEl0ZXJCYXNlCisgICAgOiBwdWJsaWMgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8RGVyaXZlZFR5LCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlVHk+IHsKK3Byb3RlY3RlZDoKKyAgU3RyaW5nTWFwRW50cnlCYXNlICoqUHRyID0gbnVsbHB0cjsKKworcHVibGljOgorICBTdHJpbmdNYXBJdGVyQmFzZSgpID0gZGVmYXVsdDsKKworICBleHBsaWNpdCBTdHJpbmdNYXBJdGVyQmFzZShTdHJpbmdNYXBFbnRyeUJhc2UgKipCdWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTm9BZHZhbmNlID0gZmFsc2UpCisgICAgICA6IFB0cihCdWNrZXQpIHsKKyAgICBpZiAoIU5vQWR2YW5jZSkgQWR2YW5jZVBhc3RFbXB0eUJ1Y2tldHMoKTsKKyAgfQorCisgIERlcml2ZWRUeSAmb3BlcmF0b3I9KGNvbnN0IERlcml2ZWRUeSAmT3RoZXIpIHsKKyAgICBQdHIgPSBPdGhlci5QdHI7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PERlcml2ZWRUeSAmPigqdGhpcyk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgRGVyaXZlZFR5ICZSSFMpIGNvbnN0IHsgcmV0dXJuIFB0ciA9PSBSSFMuUHRyOyB9CisKKyAgRGVyaXZlZFR5ICZvcGVyYXRvcisrKCkgeyAvLyBQcmVpbmNyZW1lbnQKKyAgICArK1B0cjsKKyAgICBBZHZhbmNlUGFzdEVtcHR5QnVja2V0cygpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkVHkgJj4oKnRoaXMpOworICB9CisKKyAgRGVyaXZlZFR5IG9wZXJhdG9yKysoaW50KSB7IC8vIFBvc3QtaW5jcmVtZW50CisgICAgRGVyaXZlZFR5IFRtcChQdHIpOworICAgICsrKnRoaXM7CisgICAgcmV0dXJuIFRtcDsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIEFkdmFuY2VQYXN0RW1wdHlCdWNrZXRzKCkgeworICAgIHdoaWxlICgqUHRyID09IG51bGxwdHIgfHwgKlB0ciA9PSBTdHJpbmdNYXBJbXBsOjpnZXRUb21ic3RvbmVWYWwoKSkKKyAgICAgICsrUHRyOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVUeT4KK2NsYXNzIFN0cmluZ01hcENvbnN0SXRlcmF0b3IKKyAgICA6IHB1YmxpYyBTdHJpbmdNYXBJdGVyQmFzZTxTdHJpbmdNYXBDb25zdEl0ZXJhdG9yPFZhbHVlVHk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ01hcEVudHJ5PFZhbHVlVHk+PiB7CisgIHVzaW5nIGJhc2UgPSBTdHJpbmdNYXBJdGVyQmFzZTxTdHJpbmdNYXBDb25zdEl0ZXJhdG9yPFZhbHVlVHk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nTWFwRW50cnk8VmFsdWVUeT4+OworCitwdWJsaWM6CisgIFN0cmluZ01hcENvbnN0SXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFN0cmluZ01hcENvbnN0SXRlcmF0b3IoU3RyaW5nTWFwRW50cnlCYXNlICoqQnVja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTm9BZHZhbmNlID0gZmFsc2UpCisgICAgICA6IGJhc2UoQnVja2V0LCBOb0FkdmFuY2UpIHt9CisKKyAgY29uc3QgU3RyaW5nTWFwRW50cnk8VmFsdWVUeT4gJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IFN0cmluZ01hcEVudHJ5PFZhbHVlVHk+ICo+KCp0aGlzLT5QdHIpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVUeT4KK2NsYXNzIFN0cmluZ01hcEl0ZXJhdG9yIDogcHVibGljIFN0cmluZ01hcEl0ZXJCYXNlPFN0cmluZ01hcEl0ZXJhdG9yPFZhbHVlVHk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTWFwRW50cnk8VmFsdWVUeT4+IHsKKyAgdXNpbmcgYmFzZSA9CisgICAgICBTdHJpbmdNYXBJdGVyQmFzZTxTdHJpbmdNYXBJdGVyYXRvcjxWYWx1ZVR5PiwgU3RyaW5nTWFwRW50cnk8VmFsdWVUeT4+OworCitwdWJsaWM6CisgIFN0cmluZ01hcEl0ZXJhdG9yKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBTdHJpbmdNYXBJdGVyYXRvcihTdHJpbmdNYXBFbnRyeUJhc2UgKipCdWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTm9BZHZhbmNlID0gZmFsc2UpCisgICAgICA6IGJhc2UoQnVja2V0LCBOb0FkdmFuY2UpIHt9CisKKyAgU3RyaW5nTWFwRW50cnk8VmFsdWVUeT4gJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gKnN0YXRpY19jYXN0PFN0cmluZ01hcEVudHJ5PFZhbHVlVHk+ICo+KCp0aGlzLT5QdHIpOworICB9CisKKyAgb3BlcmF0b3IgU3RyaW5nTWFwQ29uc3RJdGVyYXRvcjxWYWx1ZVR5PigpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RyaW5nTWFwQ29uc3RJdGVyYXRvcjxWYWx1ZVR5Pih0aGlzLT5QdHIsIHRydWUpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVUeT4KK2NsYXNzIFN0cmluZ01hcEtleUl0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3JfYWRhcHRvcl9iYXNlPFN0cmluZ01hcEtleUl0ZXJhdG9yPFZhbHVlVHk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdNYXBDb25zdEl0ZXJhdG9yPFZhbHVlVHk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBTdHJpbmdSZWY+IHsKKyAgdXNpbmcgYmFzZSA9IGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTxTdHJpbmdNYXBLZXlJdGVyYXRvcjxWYWx1ZVR5PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdNYXBDb25zdEl0ZXJhdG9yPFZhbHVlVHk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIFN0cmluZ1JlZj47CisKK3B1YmxpYzoKKyAgU3RyaW5nTWFwS2V5SXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFN0cmluZ01hcEtleUl0ZXJhdG9yKFN0cmluZ01hcENvbnN0SXRlcmF0b3I8VmFsdWVUeT4gSXRlcikKKyAgICAgIDogYmFzZShzdGQ6Om1vdmUoSXRlcikpIHt9CisKKyAgU3RyaW5nUmVmICZvcGVyYXRvciooKSB7CisgICAgS2V5ID0gdGhpcy0+d3JhcHBlZCgpLT5nZXRLZXkoKTsKKyAgICByZXR1cm4gS2V5OworICB9CisKK3ByaXZhdGU6CisgIFN0cmluZ1JlZiBLZXk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfU1RSSU5HTUFQX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1N0cmluZ1JlZi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nUmVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyNDE3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1N0cmluZ1JlZi5oCkBAIC0wLDAgKzEsOTI1IEBACisvLz09PS0gU3RyaW5nUmVmLmggLSBDb25zdGFudCBTdHJpbmcgUmVmZXJlbmNlIFdyYXBwZXIgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NUUklOR1JFRl9ICisjZGVmaW5lIExMVk1fQURUX1NUUklOR1JFRl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBBUEludDsKKyAgY2xhc3MgaGFzaF9jb2RlOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgU21hbGxWZWN0b3JJbXBsOworICBjbGFzcyBTdHJpbmdSZWY7CisKKyAgLy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIFN0cmluZ1JlZjo6Z2V0QXNJbnRlZ2VyLgorICBib29sIGdldEFzVW5zaWduZWRJbnRlZ2VyKFN0cmluZ1JlZiBTdHIsIHVuc2lnbmVkIFJhZGl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAmUmVzdWx0KTsKKworICBib29sIGdldEFzU2lnbmVkSW50ZWdlcihTdHJpbmdSZWYgU3RyLCB1bnNpZ25lZCBSYWRpeCwgbG9uZyBsb25nICZSZXN1bHQpOworCisgIGJvb2wgY29uc3VtZVVuc2lnbmVkSW50ZWdlcihTdHJpbmdSZWYgJlN0ciwgdW5zaWduZWQgUmFkaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgJlJlc3VsdCk7CisgIGJvb2wgY29uc3VtZVNpZ25lZEludGVnZXIoU3RyaW5nUmVmICZTdHIsIHVuc2lnbmVkIFJhZGl4LCBsb25nIGxvbmcgJlJlc3VsdCk7CisKKyAgLy8vIFN0cmluZ1JlZiAtIFJlcHJlc2VudCBhIGNvbnN0YW50IHJlZmVyZW5jZSB0byBhIHN0cmluZywgaS5lLiBhIGNoYXJhY3RlcgorICAvLy8gYXJyYXkgYW5kIGEgbGVuZ3RoLCB3aGljaCBuZWVkIG5vdCBiZSBudWxsIHRlcm1pbmF0ZWQuCisgIC8vLworICAvLy8gVGhpcyBjbGFzcyBkb2VzIG5vdCBvd24gdGhlIHN0cmluZyBkYXRhLCBpdCBpcyBleHBlY3RlZCB0byBiZSB1c2VkIGluCisgIC8vLyBzaXR1YXRpb25zIHdoZXJlIHRoZSBjaGFyYWN0ZXIgZGF0YSByZXNpZGVzIGluIHNvbWUgb3RoZXIgYnVmZmVyLCB3aG9zZQorICAvLy8gbGlmZXRpbWUgZXh0ZW5kcyBwYXN0IHRoYXQgb2YgdGhlIFN0cmluZ1JlZi4gRm9yIHRoaXMgcmVhc29uLCBpdCBpcyBub3QgaW4KKyAgLy8vIGdlbmVyYWwgc2FmZSB0byBzdG9yZSBhIFN0cmluZ1JlZi4KKyAgY2xhc3MgU3RyaW5nUmVmIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBzaXplX3QgbnBvcyA9IH5zaXplX3QoMCk7CisKKyAgICB1c2luZyBpdGVyYXRvciA9IGNvbnN0IGNoYXIgKjsKKyAgICB1c2luZyBjb25zdF9pdGVyYXRvciA9IGNvbnN0IGNoYXIgKjsKKyAgICB1c2luZyBzaXplX3R5cGUgPSBzaXplX3Q7CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gVGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcsIGluIGFuIGV4dGVybmFsIGJ1ZmZlci4KKyAgICBjb25zdCBjaGFyICpEYXRhID0gbnVsbHB0cjsKKworICAgIC8vLyBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuCisgICAgc2l6ZV90IExlbmd0aCA9IDA7CisKKyAgICAvLyBXb3JrYXJvdW5kIG1lbWNtcCBpc3N1ZSB3aXRoIG51bGwgcG9pbnRlcnMgKHVuZGVmaW5lZCBiZWhhdmlvcikKKyAgICAvLyBieSBwcm92aWRpbmcgYSBzcGVjaWFsaXplZCB2ZXJzaW9uCisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIHN0YXRpYyBpbnQgY29tcGFyZU1lbW9yeShjb25zdCBjaGFyICpMaHMsIGNvbnN0IGNoYXIgKlJocywgc2l6ZV90IExlbmd0aCkgeworICAgICAgaWYgKExlbmd0aCA9PSAwKSB7IHJldHVybiAwOyB9CisgICAgICByZXR1cm4gOjptZW1jbXAoTGhzLFJocyxMZW5ndGgpOworICAgIH0KKworICBwdWJsaWM6CisgICAgLy8vIEBuYW1lIENvbnN0cnVjdG9ycworICAgIC8vLyBAeworCisgICAgLy8vIENvbnN0cnVjdCBhbiBlbXB0eSBzdHJpbmcgcmVmLgorICAgIC8qaW1wbGljaXQqLyBTdHJpbmdSZWYoKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gRGlzYWJsZSBjb252ZXJzaW9uIGZyb20gbnVsbHB0ci4gIFRoaXMgcHJldmVudHMgdGhpbmdzIGxpa2UKKyAgICAvLy8gaWYgKFMgPT0gbnVsbHB0cikKKyAgICBTdHJpbmdSZWYoc3RkOjpudWxscHRyX3QpID0gZGVsZXRlOworCisgICAgLy8vIENvbnN0cnVjdCBhIHN0cmluZyByZWYgZnJvbSBhIGNzdHJpbmcuCisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIC8qaW1wbGljaXQqLyBTdHJpbmdSZWYoY29uc3QgY2hhciAqU3RyKQorICAgICAgICA6IERhdGEoU3RyKSwgTGVuZ3RoKFN0ciA/IDo6c3RybGVuKFN0cikgOiAwKSB7fQorCisgICAgLy8vIENvbnN0cnVjdCBhIHN0cmluZyByZWYgZnJvbSBhIHBvaW50ZXIgYW5kIGxlbmd0aC4KKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgLyppbXBsaWNpdCovIGNvbnN0ZXhwciBTdHJpbmdSZWYoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKKyAgICAgICAgOiBEYXRhKGRhdGEpLCBMZW5ndGgobGVuZ3RoKSB7fQorCisgICAgLy8vIENvbnN0cnVjdCBhIHN0cmluZyByZWYgZnJvbSBhbiBzdGQ6OnN0cmluZy4KKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgLyppbXBsaWNpdCovIFN0cmluZ1JlZihjb25zdCBzdGQ6OnN0cmluZyAmU3RyKQorICAgICAgOiBEYXRhKFN0ci5kYXRhKCkpLCBMZW5ndGgoU3RyLmxlbmd0aCgpKSB7fQorCisgICAgc3RhdGljIFN0cmluZ1JlZiB3aXRoTnVsbEFzRW1wdHkoY29uc3QgY2hhciAqZGF0YSkgeworICAgICAgcmV0dXJuIFN0cmluZ1JlZihkYXRhID8gZGF0YSA6ICIiKTsKKyAgICB9CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgSXRlcmF0b3JzCisgICAgLy8vIEB7CisKKyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIERhdGE7IH0KKworICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIERhdGEgKyBMZW5ndGg7IH0KKworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzX2JlZ2luKCkgY29uc3QgeworICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhciAqPihiZWdpbigpKTsKKyAgICB9CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXNfZW5kKCkgY29uc3QgeworICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhciAqPihlbmQoKSk7CisgICAgfQorICAgIGl0ZXJhdG9yX3JhbmdlPGNvbnN0IHVuc2lnbmVkIGNoYXIgKj4gYnl0ZXMoKSBjb25zdCB7CisgICAgICByZXR1cm4gbWFrZV9yYW5nZShieXRlc19iZWdpbigpLCBieXRlc19lbmQoKSk7CisgICAgfQorCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIFN0cmluZyBPcGVyYXRpb25zCisgICAgLy8vIEB7CisKKyAgICAvLy8gZGF0YSAtIEdldCBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcgKHdoaWNoIG1heSBub3QgYmUgbnVsbAorICAgIC8vLyB0ZXJtaW5hdGVkKS4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICBjb25zdCBjaGFyICpkYXRhKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorCisgICAgLy8vIGVtcHR5IC0gQ2hlY2sgaWYgdGhlIHN0cmluZyBpcyBlbXB0eS4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gTGVuZ3RoID09IDA7IH0KKworICAgIC8vLyBzaXplIC0gR2V0IHRoZSBzdHJpbmcgc2l6ZS4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIExlbmd0aDsgfQorCisgICAgLy8vIGZyb250IC0gR2V0IHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIGNoYXIgZnJvbnQoKSBjb25zdCB7CisgICAgICBhc3NlcnQoIWVtcHR5KCkpOworICAgICAgcmV0dXJuIERhdGFbMF07CisgICAgfQorCisgICAgLy8vIGJhY2sgLSBHZXQgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBjaGFyIGJhY2soKSBjb25zdCB7CisgICAgICBhc3NlcnQoIWVtcHR5KCkpOworICAgICAgcmV0dXJuIERhdGFbTGVuZ3RoLTFdOworICAgIH0KKworICAgIC8vIGNvcHkgLSBBbGxvY2F0ZSBjb3B5IGluIEFsbG9jYXRvciBhbmQgcmV0dXJuIFN0cmluZ1JlZiB0byBpdC4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIExMVk1fTk9ESVNDQVJEIFN0cmluZ1JlZiBjb3B5KEFsbG9jYXRvciAmQSkgY29uc3QgeworICAgICAgLy8gRG9uJ3QgcmVxdWVzdCBhIGxlbmd0aCAwIGNvcHkgZnJvbSB0aGUgYWxsb2NhdG9yLgorICAgICAgaWYgKGVtcHR5KCkpCisgICAgICAgIHJldHVybiBTdHJpbmdSZWYoKTsKKyAgICAgIGNoYXIgKlMgPSBBLnRlbXBsYXRlIEFsbG9jYXRlPGNoYXI+KExlbmd0aCk7CisgICAgICBzdGQ6OmNvcHkoYmVnaW4oKSwgZW5kKCksIFMpOworICAgICAgcmV0dXJuIFN0cmluZ1JlZihTLCBMZW5ndGgpOworICAgIH0KKworICAgIC8vLyBlcXVhbHMgLSBDaGVjayBmb3Igc3RyaW5nIGVxdWFsaXR5LCB0aGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4KKyAgICAvLy8gY29tcGFyZSgpIHdoZW4gdGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIGluZXF1YWwgc3RyaW5ncyBpc24ndCBuZWVkZWQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgYm9vbCBlcXVhbHMoU3RyaW5nUmVmIFJIUykgY29uc3QgeworICAgICAgcmV0dXJuIChMZW5ndGggPT0gUkhTLkxlbmd0aCAmJgorICAgICAgICAgICAgICBjb21wYXJlTWVtb3J5KERhdGEsIFJIUy5EYXRhLCBSSFMuTGVuZ3RoKSA9PSAwKTsKKyAgICB9CisKKyAgICAvLy8gZXF1YWxzX2xvd2VyIC0gQ2hlY2sgZm9yIHN0cmluZyBlcXVhbGl0eSwgaWdub3JpbmcgY2FzZS4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIGJvb2wgZXF1YWxzX2xvd2VyKFN0cmluZ1JlZiBSSFMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMZW5ndGggPT0gUkhTLkxlbmd0aCAmJiBjb21wYXJlX2xvd2VyKFJIUykgPT0gMDsKKyAgICB9CisKKyAgICAvLy8gY29tcGFyZSAtIENvbXBhcmUgdHdvIHN0cmluZ3M7IHRoZSByZXN1bHQgaXMgLTEsIDAsIG9yIDEgaWYgdGhpcyBzdHJpbmcKKyAgICAvLy8gaXMgbGV4aWNvZ3JhcGhpY2FsbHkgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBccCBSSFMuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgaW50IGNvbXBhcmUoU3RyaW5nUmVmIFJIUykgY29uc3QgeworICAgICAgLy8gQ2hlY2sgdGhlIHByZWZpeCBmb3IgYSBtaXNtYXRjaC4KKyAgICAgIGlmIChpbnQgUmVzID0gY29tcGFyZU1lbW9yeShEYXRhLCBSSFMuRGF0YSwgc3RkOjptaW4oTGVuZ3RoLCBSSFMuTGVuZ3RoKSkpCisgICAgICAgIHJldHVybiBSZXMgPCAwID8gLTEgOiAxOworCisgICAgICAvLyBPdGhlcndpc2UgdGhlIHByZWZpeGVzIG1hdGNoLCBzbyB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlIGxlbmd0aHMuCisgICAgICBpZiAoTGVuZ3RoID09IFJIUy5MZW5ndGgpCisgICAgICAgIHJldHVybiAwOworICAgICAgcmV0dXJuIExlbmd0aCA8IFJIUy5MZW5ndGggPyAtMSA6IDE7CisgICAgfQorCisgICAgLy8vIGNvbXBhcmVfbG93ZXIgLSBDb21wYXJlIHR3byBzdHJpbmdzLCBpZ25vcmluZyBjYXNlLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgaW50IGNvbXBhcmVfbG93ZXIoU3RyaW5nUmVmIFJIUykgY29uc3Q7CisKKyAgICAvLy8gY29tcGFyZV9udW1lcmljIC0gQ29tcGFyZSB0d28gc3RyaW5ncywgdHJlYXRpbmcgc2VxdWVuY2VzIG9mIGRpZ2l0cyBhcworICAgIC8vLyBudW1iZXJzLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgaW50IGNvbXBhcmVfbnVtZXJpYyhTdHJpbmdSZWYgUkhTKSBjb25zdDsKKworICAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBlZGl0IGRpc3RhbmNlIGJldHdlZW4gdGhpcyBzdHJpbmcgYW5kIGFub3RoZXIKKyAgICAvLy8gc3RyaW5nLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gT3RoZXIgdGhlIHN0cmluZyB0byBjb21wYXJlIHRoaXMgc3RyaW5nIGFnYWluc3QuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBBbGxvd1JlcGxhY2VtZW50cyB3aGV0aGVyIHRvIGFsbG93IGNoYXJhY3RlcgorICAgIC8vLyByZXBsYWNlbWVudHMgKGNoYW5nZSBvbmUgY2hhcmFjdGVyIGludG8gYW5vdGhlcikgYXMgYSBzaW5nbGUKKyAgICAvLy8gb3BlcmF0aW9uLCByYXRoZXIgdGhhbiBhcyB0d28gb3BlcmF0aW9ucyAoYW4gaW5zZXJ0aW9uIGFuZCBhCisgICAgLy8vIHJlbW92YWwpLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gTWF4RWRpdERpc3RhbmNlIElmIG5vbi16ZXJvLCB0aGUgbWF4aW11bSBlZGl0IGRpc3RhbmNlIHRoYXQKKyAgICAvLy8gdGhpcyByb3V0aW5lIGlzIGFsbG93ZWQgdG8gY29tcHV0ZS4gSWYgdGhlIGVkaXQgZGlzdGFuY2Ugd2lsbCBleGNlZWQKKyAgICAvLy8gdGhhdCBtYXhpbXVtLCByZXR1cm5zIFxjIE1heEVkaXREaXN0YW5jZSsxLgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVyIGluc2VydGlvbnMsIHJlbW92YWxzLAorICAgIC8vLyBvciAoaWYgXHAgQWxsb3dSZXBsYWNlbWVudHMgaXMgXGMgdHJ1ZSkgcmVwbGFjZW1lbnRzIG5lZWRlZCB0bworICAgIC8vLyB0cmFuc2Zvcm0gb25lIG9mIHRoZSBnaXZlbiBzdHJpbmdzIGludG8gdGhlIG90aGVyLiBJZiB6ZXJvLAorICAgIC8vLyB0aGUgc3RyaW5ncyBhcmUgaWRlbnRpY2FsLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgdW5zaWduZWQgZWRpdF9kaXN0YW5jZShTdHJpbmdSZWYgT3RoZXIsIGJvb2wgQWxsb3dSZXBsYWNlbWVudHMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4RWRpdERpc3RhbmNlID0gMCkgY29uc3Q7CisKKyAgICAvLy8gc3RyIC0gR2V0IHRoZSBjb250ZW50cyBhcyBhbiBzdGQ6OnN0cmluZy4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0IHsKKyAgICAgIGlmICghRGF0YSkgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoRGF0YSwgTGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgT3BlcmF0b3IgT3ZlcmxvYWRzCisgICAgLy8vIEB7CisKKyAgICBMTFZNX05PRElTQ0FSRAorICAgIGNoYXIgb3BlcmF0b3JbXShzaXplX3QgSW5kZXgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChJbmRleCA8IExlbmd0aCAmJiAiSW52YWxpZCBpbmRleCEiKTsKKyAgICAgIHJldHVybiBEYXRhW0luZGV4XTsKKyAgICB9CisKKyAgICAvLy8gRGlzYWxsb3cgYWNjaWRlbnRhbCBhc3NpZ25tZW50IGZyb20gYSB0ZW1wb3Jhcnkgc3RkOjpzdHJpbmcuCisgICAgLy8vCisgICAgLy8vIFRoZSBkZWNsYXJhdGlvbiBoZXJlIGlzIGV4dHJhIGNvbXBsaWNhdGVkIHNvIHRoYXQgYHN0cmluZ1JlZiA9IHt9YAorICAgIC8vLyBhbmQgYHN0cmluZ1JlZiA9ICJhYmMiYCBjb250aW51ZSB0byBzZWxlY3QgdGhlIG1vdmUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8VCwgc3RkOjpzdHJpbmc+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWY+Ojp0eXBlICYKKyAgICBvcGVyYXRvcj0oVCAmJlN0cikgPSBkZWxldGU7CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgVHlwZSBDb252ZXJzaW9ucworICAgIC8vLyBAeworCisgICAgb3BlcmF0b3Igc3RkOjpzdHJpbmcoKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RyKCk7CisgICAgfQorCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIFN0cmluZyBQcmVkaWNhdGVzCisgICAgLy8vIEB7CisKKyAgICAvLy8gQ2hlY2sgaWYgdGhpcyBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIGdpdmVuIFxwIFByZWZpeC4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICBib29sIHN0YXJ0c3dpdGgoU3RyaW5nUmVmIFByZWZpeCkgY29uc3QgeworICAgICAgcmV0dXJuIExlbmd0aCA+PSBQcmVmaXguTGVuZ3RoICYmCisgICAgICAgICAgICAgY29tcGFyZU1lbW9yeShEYXRhLCBQcmVmaXguRGF0YSwgUHJlZml4Lkxlbmd0aCkgPT0gMDsKKyAgICB9CisKKyAgICAvLy8gQ2hlY2sgaWYgdGhpcyBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIGdpdmVuIFxwIFByZWZpeCwgaWdub3JpbmcgY2FzZS4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIGJvb2wgc3RhcnRzd2l0aF9sb3dlcihTdHJpbmdSZWYgUHJlZml4KSBjb25zdDsKKworICAgIC8vLyBDaGVjayBpZiB0aGlzIHN0cmluZyBlbmRzIHdpdGggdGhlIGdpdmVuIFxwIFN1ZmZpeC4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICBib29sIGVuZHN3aXRoKFN0cmluZ1JlZiBTdWZmaXgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMZW5ndGggPj0gU3VmZml4Lkxlbmd0aCAmJgorICAgICAgICBjb21wYXJlTWVtb3J5KGVuZCgpIC0gU3VmZml4Lkxlbmd0aCwgU3VmZml4LkRhdGEsIFN1ZmZpeC5MZW5ndGgpID09IDA7CisgICAgfQorCisgICAgLy8vIENoZWNrIGlmIHRoaXMgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gXHAgU3VmZml4LCBpZ25vcmluZyBjYXNlLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgYm9vbCBlbmRzd2l0aF9sb3dlcihTdHJpbmdSZWYgU3VmZml4KSBjb25zdDsKKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBTdHJpbmcgU2VhcmNoaW5nCisgICAgLy8vIEB7CisKKyAgICAvLy8gU2VhcmNoIGZvciB0aGUgZmlyc3QgY2hhcmFjdGVyIFxwIEMgaW4gdGhlIHN0cmluZy4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIFxwIEMsIG9yIG5wb3MgaWYgbm90CisgICAgLy8vIGZvdW5kLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIHNpemVfdCBmaW5kKGNoYXIgQywgc2l6ZV90IEZyb20gPSAwKSBjb25zdCB7CisgICAgICBzaXplX3QgRmluZEJlZ2luID0gc3RkOjptaW4oRnJvbSwgTGVuZ3RoKTsKKyAgICAgIGlmIChGaW5kQmVnaW4gPCBMZW5ndGgpIHsgLy8gQXZvaWQgY2FsbGluZyBtZW1jaHIgd2l0aCBudWxscHRyLgorICAgICAgICAvLyBKdXN0IGZvcndhcmQgdG8gbWVtY2hyLCB3aGljaCBpcyBmYXN0ZXIgdGhhbiBhIGhhbmQtcm9sbGVkIGxvb3AuCisgICAgICAgIGlmIChjb25zdCB2b2lkICpQID0gOjptZW1jaHIoRGF0YSArIEZpbmRCZWdpbiwgQywgTGVuZ3RoIC0gRmluZEJlZ2luKSkKKyAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhciAqPihQKSAtIERhdGE7CisgICAgICB9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgICAvLy8gU2VhcmNoIGZvciB0aGUgZmlyc3QgY2hhcmFjdGVyIFxwIEMgaW4gdGhlIHN0cmluZywgaWdub3JpbmcgY2FzZS4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIFxwIEMsIG9yIG5wb3MgaWYgbm90CisgICAgLy8vIGZvdW5kLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgc2l6ZV90IGZpbmRfbG93ZXIoY2hhciBDLCBzaXplX3QgRnJvbSA9IDApIGNvbnN0OworCisgICAgLy8vIFNlYXJjaCBmb3IgdGhlIGZpcnN0IGNoYXJhY3RlciBzYXRpc2Z5aW5nIHRoZSBwcmVkaWNhdGUgXHAgRgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBzYXRpc2Z5aW5nIFxwIEYgc3RhcnRpbmcgZnJvbQorICAgIC8vLyBccCBGcm9tLCBvciBucG9zIGlmIG5vdCBmb3VuZC4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICBzaXplX3QgZmluZF9pZihmdW5jdGlvbl9yZWY8Ym9vbChjaGFyKT4gRiwgc2l6ZV90IEZyb20gPSAwKSBjb25zdCB7CisgICAgICBTdHJpbmdSZWYgUyA9IGRyb3BfZnJvbnQoRnJvbSk7CisgICAgICB3aGlsZSAoIVMuZW1wdHkoKSkgeworICAgICAgICBpZiAoRihTLmZyb250KCkpKQorICAgICAgICAgIHJldHVybiBzaXplKCkgLSBTLnNpemUoKTsKKyAgICAgICAgUyA9IFMuZHJvcF9mcm9udCgpOworICAgICAgfQorICAgICAgcmV0dXJuIG5wb3M7CisgICAgfQorCisgICAgLy8vIFNlYXJjaCBmb3IgdGhlIGZpcnN0IGNoYXJhY3RlciBub3Qgc2F0aXNmeWluZyB0aGUgcHJlZGljYXRlIFxwIEYKKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgbm90IHNhdGlzZnlpbmcgXHAgRiBzdGFydGluZworICAgIC8vLyBmcm9tIFxwIEZyb20sIG9yIG5wb3MgaWYgbm90IGZvdW5kLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIHNpemVfdCBmaW5kX2lmX25vdChmdW5jdGlvbl9yZWY8Ym9vbChjaGFyKT4gRiwgc2l6ZV90IEZyb20gPSAwKSBjb25zdCB7CisgICAgICByZXR1cm4gZmluZF9pZihbRl0oY2hhciBjKSB7IHJldHVybiAhRihjKTsgfSwgRnJvbSk7CisgICAgfQorCisgICAgLy8vIFNlYXJjaCBmb3IgdGhlIGZpcnN0IHN0cmluZyBccCBTdHIgaW4gdGhlIHN0cmluZy4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIFxwIFN0ciwgb3IgbnBvcyBpZiBub3QKKyAgICAvLy8gZm91bmQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBzaXplX3QgZmluZChTdHJpbmdSZWYgU3RyLCBzaXplX3QgRnJvbSA9IDApIGNvbnN0OworCisgICAgLy8vIFNlYXJjaCBmb3IgdGhlIGZpcnN0IHN0cmluZyBccCBTdHIgaW4gdGhlIHN0cmluZywgaWdub3JpbmcgY2FzZS4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIFxwIFN0ciwgb3IgbnBvcyBpZiBub3QKKyAgICAvLy8gZm91bmQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBzaXplX3QgZmluZF9sb3dlcihTdHJpbmdSZWYgU3RyLCBzaXplX3QgRnJvbSA9IDApIGNvbnN0OworCisgICAgLy8vIFNlYXJjaCBmb3IgdGhlIGxhc3QgY2hhcmFjdGVyIFxwIEMgaW4gdGhlIHN0cmluZy4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgXHAgQywgb3IgbnBvcyBpZiBub3QKKyAgICAvLy8gZm91bmQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBzaXplX3QgcmZpbmQoY2hhciBDLCBzaXplX3QgRnJvbSA9IG5wb3MpIGNvbnN0IHsKKyAgICAgIEZyb20gPSBzdGQ6Om1pbihGcm9tLCBMZW5ndGgpOworICAgICAgc2l6ZV90IGkgPSBGcm9tOworICAgICAgd2hpbGUgKGkgIT0gMCkgeworICAgICAgICAtLWk7CisgICAgICAgIGlmIChEYXRhW2ldID09IEMpCisgICAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgICAvLy8gU2VhcmNoIGZvciB0aGUgbGFzdCBjaGFyYWN0ZXIgXHAgQyBpbiB0aGUgc3RyaW5nLCBpZ25vcmluZyBjYXNlLgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyBUaGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBccCBDLCBvciBucG9zIGlmIG5vdAorICAgIC8vLyBmb3VuZC4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIHNpemVfdCByZmluZF9sb3dlcihjaGFyIEMsIHNpemVfdCBGcm9tID0gbnBvcykgY29uc3Q7CisKKyAgICAvLy8gU2VhcmNoIGZvciB0aGUgbGFzdCBzdHJpbmcgXHAgU3RyIGluIHRoZSBzdHJpbmcuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm5zIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIFxwIFN0ciwgb3IgbnBvcyBpZiBub3QKKyAgICAvLy8gZm91bmQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBzaXplX3QgcmZpbmQoU3RyaW5nUmVmIFN0cikgY29uc3Q7CisKKyAgICAvLy8gU2VhcmNoIGZvciB0aGUgbGFzdCBzdHJpbmcgXHAgU3RyIGluIHRoZSBzdHJpbmcsIGlnbm9yaW5nIGNhc2UuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm5zIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIFxwIFN0ciwgb3IgbnBvcyBpZiBub3QKKyAgICAvLy8gZm91bmQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBzaXplX3QgcmZpbmRfbG93ZXIoU3RyaW5nUmVmIFN0cikgY29uc3Q7CisKKyAgICAvLy8gRmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBccCBDLCBvciBucG9zIGlmIG5vdAorICAgIC8vLyBmb3VuZC4gU2FtZSBhcyBmaW5kLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgc2l6ZV90IGZpbmRfZmlyc3Rfb2YoY2hhciBDLCBzaXplX3QgRnJvbSA9IDApIGNvbnN0IHsKKyAgICAgIHJldHVybiBmaW5kKEMsIEZyb20pOworICAgIH0KKworICAgIC8vLyBGaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIGluIFxwIENoYXJzLCBvciBucG9zIGlmCisgICAgLy8vIG5vdCBmb3VuZC4KKyAgICAvLy8KKyAgICAvLy8gQ29tcGxleGl0eTogTyhzaXplKCkgKyBDaGFycy5zaXplKCkpCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBzaXplX3QgZmluZF9maXJzdF9vZihTdHJpbmdSZWYgQ2hhcnMsIHNpemVfdCBGcm9tID0gMCkgY29uc3Q7CisKKyAgICAvLy8gRmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBub3QgXHAgQyBvciBucG9zIGlmIG5vdAorICAgIC8vLyBmb3VuZC4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIHNpemVfdCBmaW5kX2ZpcnN0X25vdF9vZihjaGFyIEMsIHNpemVfdCBGcm9tID0gMCkgY29uc3Q7CisKKyAgICAvLy8gRmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBub3QgaW4gdGhlIHN0cmluZworICAgIC8vLyBccCBDaGFycywgb3IgbnBvcyBpZiBub3QgZm91bmQuCisgICAgLy8vCisgICAgLy8vIENvbXBsZXhpdHk6IE8oc2l6ZSgpICsgQ2hhcnMuc2l6ZSgpKQorICAgIExMVk1fTk9ESVNDQVJECisgICAgc2l6ZV90IGZpbmRfZmlyc3Rfbm90X29mKFN0cmluZ1JlZiBDaGFycywgc2l6ZV90IEZyb20gPSAwKSBjb25zdDsKKworICAgIC8vLyBGaW5kIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIHRoYXQgaXMgXHAgQywgb3IgbnBvcyBpZiBub3QKKyAgICAvLy8gZm91bmQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBzaXplX3QgZmluZF9sYXN0X29mKGNoYXIgQywgc2l6ZV90IEZyb20gPSBucG9zKSBjb25zdCB7CisgICAgICByZXR1cm4gcmZpbmQoQywgRnJvbSk7CisgICAgfQorCisgICAgLy8vIEZpbmQgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBpbiBccCBDLCBvciBucG9zIGlmIG5vdAorICAgIC8vLyBmb3VuZC4KKyAgICAvLy8KKyAgICAvLy8gQ29tcGxleGl0eTogTyhzaXplKCkgKyBDaGFycy5zaXplKCkpCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBzaXplX3QgZmluZF9sYXN0X29mKFN0cmluZ1JlZiBDaGFycywgc2l6ZV90IEZyb20gPSBucG9zKSBjb25zdDsKKworICAgIC8vLyBGaW5kIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIHRoYXQgaXMgbm90IFxwIEMsIG9yIG5wb3MgaWYgbm90CisgICAgLy8vIGZvdW5kLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgc2l6ZV90IGZpbmRfbGFzdF9ub3Rfb2YoY2hhciBDLCBzaXplX3QgRnJvbSA9IG5wb3MpIGNvbnN0OworCisgICAgLy8vIEZpbmQgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBub3QgaW4gXHAgQ2hhcnMsIG9yCisgICAgLy8vIG5wb3MgaWYgbm90IGZvdW5kLgorICAgIC8vLworICAgIC8vLyBDb21wbGV4aXR5OiBPKHNpemUoKSArIENoYXJzLnNpemUoKSkKKyAgICBMTFZNX05PRElTQ0FSRAorICAgIHNpemVfdCBmaW5kX2xhc3Rfbm90X29mKFN0cmluZ1JlZiBDaGFycywgc2l6ZV90IEZyb20gPSBucG9zKSBjb25zdDsKKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgc3Vic3RyaW5nIG9mICp0aGlzLCBhbmQgZmFsc2UKKyAgICAvLy8gb3RoZXJ3aXNlLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIGJvb2wgY29udGFpbnMoU3RyaW5nUmVmIE90aGVyKSBjb25zdCB7IHJldHVybiBmaW5kKE90aGVyKSAhPSBucG9zOyB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyBjb250YWluZWQgaW4gKnRoaXMsIGFuZCBmYWxzZQorICAgIC8vLyBvdGhlcndpc2UuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgYm9vbCBjb250YWlucyhjaGFyIEMpIGNvbnN0IHsgcmV0dXJuIGZpbmRfZmlyc3Rfb2YoQykgIT0gbnBvczsgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBzdWJzdHJpbmcgb2YgKnRoaXMsIGFuZCBmYWxzZQorICAgIC8vLyBvdGhlcndpc2UuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgYm9vbCBjb250YWluc19sb3dlcihTdHJpbmdSZWYgT3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBmaW5kX2xvd2VyKE90aGVyKSAhPSBucG9zOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIGNvbnRhaW5lZCBpbiAqdGhpcywgYW5kIGZhbHNlCisgICAgLy8vIG90aGVyd2lzZS4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICBib29sIGNvbnRhaW5zX2xvd2VyKGNoYXIgQykgY29uc3QgeyByZXR1cm4gZmluZF9sb3dlcihDKSAhPSBucG9zOyB9CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgSGVscGZ1bCBBbGdvcml0aG1zCisgICAgLy8vIEB7CisKKyAgICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgXHAgQyBpbiB0aGUgc3RyaW5nLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgc2l6ZV90IGNvdW50KGNoYXIgQykgY29uc3QgeworICAgICAgc2l6ZV90IENvdW50ID0gMDsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gTGVuZ3RoOyBpICE9IGU7ICsraSkKKyAgICAgICAgaWYgKERhdGFbaV0gPT0gQykKKyAgICAgICAgICArK0NvdW50OworICAgICAgcmV0dXJuIENvdW50OworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBlZCBvY2N1cnJlbmNlcyBvZiBccCBTdHIgaW4KKyAgICAvLy8gdGhlIHN0cmluZy4KKyAgICBzaXplX3QgY291bnQoU3RyaW5nUmVmIFN0cikgY29uc3Q7CisKKyAgICAvLy8gUGFyc2UgdGhlIGN1cnJlbnQgc3RyaW5nIGFzIGFuIGludGVnZXIgb2YgdGhlIHNwZWNpZmllZCByYWRpeC4gIElmCisgICAgLy8vIFxwIFJhZGl4IGlzIHNwZWNpZmllZCBhcyB6ZXJvLCB0aGlzIGRvZXMgcmFkaXggYXV0b3NlbnNpbmcgdXNpbmcKKyAgICAvLy8gZXh0ZW5kZWQgQyBydWxlczogMCBpcyBvY3RhbCwgMHggaXMgaGV4LCAwYiBpcyBiaW5hcnkuCisgICAgLy8vCisgICAgLy8vIElmIHRoZSBzdHJpbmcgaXMgaW52YWxpZCBvciBpZiBvbmx5IGEgc3Vic2V0IG9mIHRoZSBzdHJpbmcgaXMgdmFsaWQsCisgICAgLy8vIHRoaXMgcmV0dXJucyB0cnVlIHRvIHNpZ25pZnkgdGhlIGVycm9yLiAgVGhlIHN0cmluZyBpcyBjb25zaWRlcmVkCisgICAgLy8vIGVycm9uZW91cyBpZiBlbXB0eSBvciBpZiBpdCBvdmVyZmxvd3MgVC4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQsIGJvb2w+Ojp0eXBlCisgICAgZ2V0QXNJbnRlZ2VyKHVuc2lnbmVkIFJhZGl4LCBUICZSZXN1bHQpIGNvbnN0IHsKKyAgICAgIGxvbmcgbG9uZyBMTFZhbDsKKyAgICAgIGlmIChnZXRBc1NpZ25lZEludGVnZXIoKnRoaXMsIFJhZGl4LCBMTFZhbCkgfHwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PFQ+KExMVmFsKSAhPSBMTFZhbCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBSZXN1bHQgPSBMTFZhbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkLCBib29sPjo6dHlwZQorICAgIGdldEFzSW50ZWdlcih1bnNpZ25lZCBSYWRpeCwgVCAmUmVzdWx0KSBjb25zdCB7CisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgVUxMVmFsOworICAgICAgLy8gVGhlIGFkZGl0aW9uYWwgY2FzdCB0byB1bnNpZ25lZCBsb25nIGxvbmcgaXMgcmVxdWlyZWQgdG8gYXZvaWQgdGhlCisgICAgICAvLyBWaXN1YWwgQysrIHdhcm5pbmcgQzQ4MDU6ICchPScgOiB1bnNhZmUgbWl4IG9mIHR5cGUgJ2Jvb2wnIGFuZCB0eXBlCisgICAgICAvLyAndW5zaWduZWQgX19pbnQ2NCcgd2hlbiBpbnN0YW50aWF0aW5nIGdldEFzSW50ZWdlciB3aXRoIFQgPSBib29sLgorICAgICAgaWYgKGdldEFzVW5zaWduZWRJbnRlZ2VyKCp0aGlzLCBSYWRpeCwgVUxMVmFsKSB8fAorICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oc3RhdGljX2Nhc3Q8VD4oVUxMVmFsKSkgIT0gVUxMVmFsKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIFJlc3VsdCA9IFVMTFZhbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLy8gUGFyc2UgdGhlIGN1cnJlbnQgc3RyaW5nIGFzIGFuIGludGVnZXIgb2YgdGhlIHNwZWNpZmllZCByYWRpeC4gIElmCisgICAgLy8vIFxwIFJhZGl4IGlzIHNwZWNpZmllZCBhcyB6ZXJvLCB0aGlzIGRvZXMgcmFkaXggYXV0b3NlbnNpbmcgdXNpbmcKKyAgICAvLy8gZXh0ZW5kZWQgQyBydWxlczogMCBpcyBvY3RhbCwgMHggaXMgaGV4LCAwYiBpcyBiaW5hcnkuCisgICAgLy8vCisgICAgLy8vIElmIHRoZSBzdHJpbmcgZG9lcyBub3QgYmVnaW4gd2l0aCBhIG51bWJlciBvZiB0aGUgc3BlY2lmaWVkIHJhZGl4LAorICAgIC8vLyB0aGlzIHJldHVybnMgdHJ1ZSB0byBzaWduaWZ5IHRoZSBlcnJvci4gVGhlIHN0cmluZyBpcyBjb25zaWRlcmVkCisgICAgLy8vIGVycm9uZW91cyBpZiBlbXB0eSBvciBpZiBpdCBvdmVyZmxvd3MgVC4KKyAgICAvLy8gVGhlIHBvcnRpb24gb2YgdGhlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRpc2NvdmVyZWQgbnVtZXJpYyB2YWx1ZQorICAgIC8vLyBpcyByZW1vdmVkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCwgYm9vbD46OnR5cGUKKyAgICBjb25zdW1lSW50ZWdlcih1bnNpZ25lZCBSYWRpeCwgVCAmUmVzdWx0KSB7CisgICAgICBsb25nIGxvbmcgTExWYWw7CisgICAgICBpZiAoY29uc3VtZVNpZ25lZEludGVnZXIoKnRoaXMsIFJhZGl4LCBMTFZhbCkgfHwKKyAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHN0YXRpY19jYXN0PFQ+KExMVmFsKSkgIT0gTExWYWwpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgUmVzdWx0ID0gTExWYWw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCwgYm9vbD46OnR5cGUKKyAgICBjb25zdW1lSW50ZWdlcih1bnNpZ25lZCBSYWRpeCwgVCAmUmVzdWx0KSB7CisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgVUxMVmFsOworICAgICAgaWYgKGNvbnN1bWVVbnNpZ25lZEludGVnZXIoKnRoaXMsIFJhZGl4LCBVTExWYWwpIHx8CisgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPihzdGF0aWNfY2FzdDxUPihVTExWYWwpKSAhPSBVTExWYWwpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgUmVzdWx0ID0gVUxMVmFsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vLyBQYXJzZSB0aGUgY3VycmVudCBzdHJpbmcgYXMgYW4gaW50ZWdlciBvZiB0aGUgc3BlY2lmaWVkIFxwIFJhZGl4LCBvciBvZgorICAgIC8vLyBhbiBhdXRvc2Vuc2VkIHJhZGl4IGlmIHRoZSBccCBSYWRpeCBnaXZlbiBpcyAwLiAgVGhlIGN1cnJlbnQgdmFsdWUgaW4KKyAgICAvLy8gXHAgUmVzdWx0IGlzIGRpc2NhcmRlZCwgYW5kIHRoZSBzdG9yYWdlIGlzIGNoYW5nZWQgdG8gYmUgd2lkZSBlbm91Z2ggdG8KKyAgICAvLy8gc3RvcmUgdGhlIHBhcnNlZCBpbnRlZ2VyLgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZSBzdHJpbmcgZG9lcyBub3Qgc29sZWx5IGNvbnNpc3Qgb2YgYSB2YWxpZAorICAgIC8vLyBub24tZW1wdHkgbnVtYmVyIGluIHRoZSBhcHByb3ByaWF0ZSBiYXNlLgorICAgIC8vLworICAgIC8vLyBBUEludDo6ZnJvbVN0cmluZyBpcyBzdXBlcmZpY2lhbGx5IHNpbWlsYXIgYnV0IGFzc3VtZXMgdGhlCisgICAgLy8vIHN0cmluZyBpcyB3ZWxsLWZvcm1lZCBpbiB0aGUgZ2l2ZW4gcmFkaXguCisgICAgYm9vbCBnZXRBc0ludGVnZXIodW5zaWduZWQgUmFkaXgsIEFQSW50ICZSZXN1bHQpIGNvbnN0OworCisgICAgLy8vIFBhcnNlIHRoZSBjdXJyZW50IHN0cmluZyBhcyBhbiBJRUVFIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmcKKyAgICAvLy8gcG9pbnQgdmFsdWUuICBUaGUgc3RyaW5nIG11c3QgYmUgYSB3ZWxsLWZvcm1lZCBkb3VibGUuCisgICAgLy8vCisgICAgLy8vIElmIFxwIEFsbG93SW5leGFjdCBpcyBmYWxzZSwgdGhlIGZ1bmN0aW9uIHdpbGwgZmFpbCBpZiB0aGUgc3RyaW5nCisgICAgLy8vIGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5LiAgT3RoZXJ3aXNlLCB0aGUgZnVuY3Rpb24gb25seSBmYWlscworICAgIC8vLyBpbiBjYXNlIG9mIGFuIG92ZXJmbG93IG9yIHVuZGVyZmxvdy4KKyAgICBib29sIGdldEFzRG91YmxlKGRvdWJsZSAmUmVzdWx0LCBib29sIEFsbG93SW5leGFjdCA9IHRydWUpIGNvbnN0OworCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIFN0cmluZyBPcGVyYXRpb25zCisgICAgLy8vIEB7CisKKyAgICAvLyBDb252ZXJ0IHRoZSBnaXZlbiBBU0NJSSBzdHJpbmcgdG8gbG93ZXJjYXNlLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgc3RkOjpzdHJpbmcgbG93ZXIoKSBjb25zdDsKKworICAgIC8vLyBDb252ZXJ0IHRoZSBnaXZlbiBBU0NJSSBzdHJpbmcgdG8gdXBwZXJjYXNlLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgc3RkOjpzdHJpbmcgdXBwZXIoKSBjb25zdDsKKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBTdWJzdHJpbmcgT3BlcmF0aW9ucworICAgIC8vLyBAeworCisgICAgLy8vIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgc3Vic3RyaW5nIGZyb20gW1N0YXJ0LCBTdGFydCArIE4pLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gU3RhcnQgVGhlIGluZGV4IG9mIHRoZSBzdGFydGluZyBjaGFyYWN0ZXIgaW4gdGhlIHN1YnN0cmluZzsgaWYKKyAgICAvLy8gdGhlIGluZGV4IGlzIG5wb3Mgb3IgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0aGVuIHRoZQorICAgIC8vLyBlbXB0eSBzdWJzdHJpbmcgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIE4gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluY2x1ZGVkIGluIHRoZSBzdWJzdHJpbmcuIElmIE4KKyAgICAvLy8gZXhjZWVkcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVtYWluaW5nIGluIHRoZSBzdHJpbmcsIHRoZSBzdHJpbmcKKyAgICAvLy8gc3VmZml4IChzdGFydGluZyB3aXRoIFxwIFN0YXJ0KSB3aWxsIGJlIHJldHVybmVkLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIFN0cmluZ1JlZiBzdWJzdHIoc2l6ZV90IFN0YXJ0LCBzaXplX3QgTiA9IG5wb3MpIGNvbnN0IHsKKyAgICAgIFN0YXJ0ID0gc3RkOjptaW4oU3RhcnQsIExlbmd0aCk7CisgICAgICByZXR1cm4gU3RyaW5nUmVmKERhdGEgKyBTdGFydCwgc3RkOjptaW4oTiwgTGVuZ3RoIC0gU3RhcnQpKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIGEgU3RyaW5nUmVmIGVxdWFsIHRvICd0aGlzJyBidXQgd2l0aCBvbmx5IHRoZSBmaXJzdCBccCBOCisgICAgLy8vIGVsZW1lbnRzIHJlbWFpbmluZy4gIElmIFxwIE4gaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlCisgICAgLy8vIHN0cmluZywgdGhlIGVudGlyZSBzdHJpbmcgaXMgcmV0dXJuZWQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgU3RyaW5nUmVmIHRha2VfZnJvbnQoc2l6ZV90IE4gPSAxKSBjb25zdCB7CisgICAgICBpZiAoTiA+PSBzaXplKCkpCisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIHJldHVybiBkcm9wX2JhY2soc2l6ZSgpIC0gTik7CisgICAgfQorCisgICAgLy8vIFJldHVybiBhIFN0cmluZ1JlZiBlcXVhbCB0byAndGhpcycgYnV0IHdpdGggb25seSB0aGUgbGFzdCBccCBOCisgICAgLy8vIGVsZW1lbnRzIHJlbWFpbmluZy4gIElmIFxwIE4gaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlCisgICAgLy8vIHN0cmluZywgdGhlIGVudGlyZSBzdHJpbmcgaXMgcmV0dXJuZWQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgU3RyaW5nUmVmIHRha2VfYmFjayhzaXplX3QgTiA9IDEpIGNvbnN0IHsKKyAgICAgIGlmIChOID49IHNpemUoKSkKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgcmV0dXJuIGRyb3BfZnJvbnQoc2l6ZSgpIC0gTik7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgbG9uZ2VzdCBwcmVmaXggb2YgJ3RoaXMnIHN1Y2ggdGhhdCBldmVyeSBjaGFyYWN0ZXIKKyAgICAvLy8gaW4gdGhlIHByZWZpeCBzYXRpc2ZpZXMgdGhlIGdpdmVuIHByZWRpY2F0ZS4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICBTdHJpbmdSZWYgdGFrZV93aGlsZShmdW5jdGlvbl9yZWY8Ym9vbChjaGFyKT4gRikgY29uc3QgeworICAgICAgcmV0dXJuIHN1YnN0cigwLCBmaW5kX2lmX25vdChGKSk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgbG9uZ2VzdCBwcmVmaXggb2YgJ3RoaXMnIHN1Y2ggdGhhdCBubyBjaGFyYWN0ZXIgaW4KKyAgICAvLy8gdGhlIHByZWZpeCBzYXRpc2ZpZXMgdGhlIGdpdmVuIHByZWRpY2F0ZS4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICBTdHJpbmdSZWYgdGFrZV91bnRpbChmdW5jdGlvbl9yZWY8Ym9vbChjaGFyKT4gRikgY29uc3QgeworICAgICAgcmV0dXJuIHN1YnN0cigwLCBmaW5kX2lmKEYpKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIGEgU3RyaW5nUmVmIGVxdWFsIHRvICd0aGlzJyBidXQgd2l0aCB0aGUgZmlyc3QgXHAgTiBlbGVtZW50cworICAgIC8vLyBkcm9wcGVkLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIFN0cmluZ1JlZiBkcm9wX2Zyb250KHNpemVfdCBOID0gMSkgY29uc3QgeworICAgICAgYXNzZXJ0KHNpemUoKSA+PSBOICYmICJEcm9wcGluZyBtb3JlIGVsZW1lbnRzIHRoYW4gZXhpc3QiKTsKKyAgICAgIHJldHVybiBzdWJzdHIoTik7CisgICAgfQorCisgICAgLy8vIFJldHVybiBhIFN0cmluZ1JlZiBlcXVhbCB0byAndGhpcycgYnV0IHdpdGggdGhlIGxhc3QgXHAgTiBlbGVtZW50cworICAgIC8vLyBkcm9wcGVkLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIFN0cmluZ1JlZiBkcm9wX2JhY2soc2l6ZV90IE4gPSAxKSBjb25zdCB7CisgICAgICBhc3NlcnQoc2l6ZSgpID49IE4gJiYgIkRyb3BwaW5nIG1vcmUgZWxlbWVudHMgdGhhbiBleGlzdCIpOworICAgICAgcmV0dXJuIHN1YnN0cigwLCBzaXplKCktTik7CisgICAgfQorCisgICAgLy8vIFJldHVybiBhIFN0cmluZ1JlZiBlcXVhbCB0byAndGhpcycsIGJ1dCB3aXRoIGFsbCBjaGFyYWN0ZXJzIHNhdGlzZnlpbmcKKyAgICAvLy8gdGhlIGdpdmVuIHByZWRpY2F0ZSBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIFN0cmluZ1JlZiBkcm9wX3doaWxlKGZ1bmN0aW9uX3JlZjxib29sKGNoYXIpPiBGKSBjb25zdCB7CisgICAgICByZXR1cm4gc3Vic3RyKGZpbmRfaWZfbm90KEYpKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIGEgU3RyaW5nUmVmIGVxdWFsIHRvICd0aGlzJywgYnV0IHdpdGggYWxsIGNoYXJhY3RlcnMgbm90CisgICAgLy8vIHNhdGlzZnlpbmcgdGhlIGdpdmVuIHByZWRpY2F0ZSBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIFN0cmluZ1JlZiBkcm9wX3VudGlsKGZ1bmN0aW9uX3JlZjxib29sKGNoYXIpPiBGKSBjb25zdCB7CisgICAgICByZXR1cm4gc3Vic3RyKGZpbmRfaWYoRikpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBTdHJpbmdSZWYgaGFzIHRoZSBnaXZlbiBwcmVmaXggYW5kIHJlbW92ZXMgdGhhdAorICAgIC8vLyBwcmVmaXguCisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIGJvb2wgY29uc3VtZV9mcm9udChTdHJpbmdSZWYgUHJlZml4KSB7CisgICAgICBpZiAoIXN0YXJ0c3dpdGgoUHJlZml4KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAqdGhpcyA9IGRyb3BfZnJvbnQoUHJlZml4LnNpemUoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgU3RyaW5nUmVmIGhhcyB0aGUgZ2l2ZW4gc3VmZml4IGFuZCByZW1vdmVzIHRoYXQKKyAgICAvLy8gc3VmZml4LgorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICBib29sIGNvbnN1bWVfYmFjayhTdHJpbmdSZWYgU3VmZml4KSB7CisgICAgICBpZiAoIWVuZHN3aXRoKFN1ZmZpeCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgKnRoaXMgPSBkcm9wX2JhY2soU3VmZml4LnNpemUoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBzdWJzdHJpbmcgZnJvbSBbU3RhcnQsIEVuZCkuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBTdGFydCBUaGUgaW5kZXggb2YgdGhlIHN0YXJ0aW5nIGNoYXJhY3RlciBpbiB0aGUgc3Vic3RyaW5nOyBpZgorICAgIC8vLyB0aGUgaW5kZXggaXMgbnBvcyBvciBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRoZW4gdGhlCisgICAgLy8vIGVtcHR5IHN1YnN0cmluZyB3aWxsIGJlIHJldHVybmVkLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gRW5kIFRoZSBpbmRleCBmb2xsb3dpbmcgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIGluY2x1ZGUgaW4gdGhlCisgICAgLy8vIHN1YnN0cmluZy4gSWYgdGhpcyBpcyBucG9zIG9yIGV4Y2VlZHMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzCisgICAgLy8vIHJlbWFpbmluZyBpbiB0aGUgc3RyaW5nLCB0aGUgc3RyaW5nIHN1ZmZpeCAoc3RhcnRpbmcgd2l0aCBccCBTdGFydCkKKyAgICAvLy8gd2lsbCBiZSByZXR1cm5lZC4gSWYgdGhpcyBpcyBsZXNzIHRoYW4gXHAgU3RhcnQsIGFuIGVtcHR5IHN0cmluZyB3aWxsCisgICAgLy8vIGJlIHJldHVybmVkLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIFN0cmluZ1JlZiBzbGljZShzaXplX3QgU3RhcnQsIHNpemVfdCBFbmQpIGNvbnN0IHsKKyAgICAgIFN0YXJ0ID0gc3RkOjptaW4oU3RhcnQsIExlbmd0aCk7CisgICAgICBFbmQgPSBzdGQ6Om1pbihzdGQ6Om1heChTdGFydCwgRW5kKSwgTGVuZ3RoKTsKKyAgICAgIHJldHVybiBTdHJpbmdSZWYoRGF0YSArIFN0YXJ0LCBFbmQgLSBTdGFydCk7CisgICAgfQorCisgICAgLy8vIFNwbGl0IGludG8gdHdvIHN1YnN0cmluZ3MgYXJvdW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgc2VwYXJhdG9yCisgICAgLy8vIGNoYXJhY3Rlci4KKyAgICAvLy8KKyAgICAvLy8gSWYgXHAgU2VwYXJhdG9yIGlzIGluIHRoZSBzdHJpbmcsIHRoZW4gdGhlIHJlc3VsdCBpcyBhIHBhaXIgKExIUywgUkhTKQorICAgIC8vLyBzdWNoIHRoYXQgKCp0aGlzID09IExIUyArIFNlcGFyYXRvciArIFJIUykgaXMgdHJ1ZSBhbmQgUkhTIGlzCisgICAgLy8vIG1heGltYWwuIElmIFxwIFNlcGFyYXRvciBpcyBub3QgaW4gdGhlIHN0cmluZywgdGhlbiB0aGUgcmVzdWx0IGlzIGEKKyAgICAvLy8gcGFpciAoTEhTLCBSSFMpIHdoZXJlICgqdGhpcyA9PSBMSFMpIGFuZCAoUkhTID09ICIiKS4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIFNlcGFyYXRvciBUaGUgY2hhcmFjdGVyIHRvIHNwbGl0IG9uLgorICAgIC8vLyBccmV0dXJucyBUaGUgc3BsaXQgc3Vic3RyaW5ncy4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIHN0ZDo6cGFpcjxTdHJpbmdSZWYsIFN0cmluZ1JlZj4gc3BsaXQoY2hhciBTZXBhcmF0b3IpIGNvbnN0IHsKKyAgICAgIHNpemVfdCBJZHggPSBmaW5kKFNlcGFyYXRvcik7CisgICAgICBpZiAoSWR4ID09IG5wb3MpCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigqdGhpcywgU3RyaW5nUmVmKCkpOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHNsaWNlKDAsIElkeCksIHNsaWNlKElkeCsxLCBucG9zKSk7CisgICAgfQorCisgICAgLy8vIFNwbGl0IGludG8gdHdvIHN1YnN0cmluZ3MgYXJvdW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgc2VwYXJhdG9yCisgICAgLy8vIHN0cmluZy4KKyAgICAvLy8KKyAgICAvLy8gSWYgXHAgU2VwYXJhdG9yIGlzIGluIHRoZSBzdHJpbmcsIHRoZW4gdGhlIHJlc3VsdCBpcyBhIHBhaXIgKExIUywgUkhTKQorICAgIC8vLyBzdWNoIHRoYXQgKCp0aGlzID09IExIUyArIFNlcGFyYXRvciArIFJIUykgaXMgdHJ1ZSBhbmQgUkhTIGlzCisgICAgLy8vIG1heGltYWwuIElmIFxwIFNlcGFyYXRvciBpcyBub3QgaW4gdGhlIHN0cmluZywgdGhlbiB0aGUgcmVzdWx0IGlzIGEKKyAgICAvLy8gcGFpciAoTEhTLCBSSFMpIHdoZXJlICgqdGhpcyA9PSBMSFMpIGFuZCAoUkhTID09ICIiKS4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIFNlcGFyYXRvciAtIFRoZSBzdHJpbmcgdG8gc3BsaXQgb24uCisgICAgLy8vIFxyZXR1cm4gLSBUaGUgc3BsaXQgc3Vic3RyaW5ncy4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIHN0ZDo6cGFpcjxTdHJpbmdSZWYsIFN0cmluZ1JlZj4gc3BsaXQoU3RyaW5nUmVmIFNlcGFyYXRvcikgY29uc3QgeworICAgICAgc2l6ZV90IElkeCA9IGZpbmQoU2VwYXJhdG9yKTsKKyAgICAgIGlmIChJZHggPT0gbnBvcykKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKCp0aGlzLCBTdHJpbmdSZWYoKSk7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoc2xpY2UoMCwgSWR4KSwgc2xpY2UoSWR4ICsgU2VwYXJhdG9yLnNpemUoKSwgbnBvcykpOworICAgIH0KKworICAgIC8vLyBTcGxpdCBpbnRvIHN1YnN0cmluZ3MgYXJvdW5kIHRoZSBvY2N1cnJlbmNlcyBvZiBhIHNlcGFyYXRvciBzdHJpbmcuCisgICAgLy8vCisgICAgLy8vIEVhY2ggc3Vic3RyaW5nIGlzIHN0b3JlZCBpbiBccCBBLiBJZiBccCBNYXhTcGxpdCBpcyA+PSAwLCBhdCBtb3N0CisgICAgLy8vIFxwIE1heFNwbGl0IHNwbGl0cyBhcmUgZG9uZSBhbmQgY29uc2VxdWVudGx5IDw9IFxwIE1heFNwbGl0ICsgMQorICAgIC8vLyBlbGVtZW50cyBhcmUgYWRkZWQgdG8gQS4KKyAgICAvLy8gSWYgXHAgS2VlcEVtcHR5IGlzIGZhbHNlLCBlbXB0eSBzdHJpbmdzIGFyZSBub3QgYWRkZWQgdG8gXHAgQS4gVGhleQorICAgIC8vLyBzdGlsbCBjb3VudCB3aGVuIGNvbnNpZGVyaW5nIFxwIE1heFNwbGl0CisgICAgLy8vIEFuIHVzZWZ1bCBpbnZhcmlhbnQgaXMgdGhhdAorICAgIC8vLyBTZXBhcmF0b3Iuam9pbihBKSA9PSAqdGhpcyBpZiBNYXhTcGxpdCA9PSAtMSBhbmQgS2VlcEVtcHR5ID09IHRydWUKKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIEEgLSBXaGVyZSB0byBwdXQgdGhlIHN1YnN0cmluZ3MuCisgICAgLy8vIFxwYXJhbSBTZXBhcmF0b3IgLSBUaGUgc3RyaW5nIHRvIHNwbGl0IG9uLgorICAgIC8vLyBccGFyYW0gTWF4U3BsaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIHN0cmluZyBpcyBzcGxpdC4KKyAgICAvLy8gXHBhcmFtIEtlZXBFbXB0eSAtIFRydWUgaWYgZW1wdHkgc3Vic3RyaW5nIHNob3VsZCBiZSBhZGRlZC4KKyAgICB2b2lkIHNwbGl0KFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICZBLAorICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNlcGFyYXRvciwgaW50IE1heFNwbGl0ID0gLTEsCisgICAgICAgICAgICAgICBib29sIEtlZXBFbXB0eSA9IHRydWUpIGNvbnN0OworCisgICAgLy8vIFNwbGl0IGludG8gc3Vic3RyaW5ncyBhcm91bmQgdGhlIG9jY3VycmVuY2VzIG9mIGEgc2VwYXJhdG9yIGNoYXJhY3Rlci4KKyAgICAvLy8KKyAgICAvLy8gRWFjaCBzdWJzdHJpbmcgaXMgc3RvcmVkIGluIFxwIEEuIElmIFxwIE1heFNwbGl0IGlzID49IDAsIGF0IG1vc3QKKyAgICAvLy8gXHAgTWF4U3BsaXQgc3BsaXRzIGFyZSBkb25lIGFuZCBjb25zZXF1ZW50bHkgPD0gXHAgTWF4U3BsaXQgKyAxCisgICAgLy8vIGVsZW1lbnRzIGFyZSBhZGRlZCB0byBBLgorICAgIC8vLyBJZiBccCBLZWVwRW1wdHkgaXMgZmFsc2UsIGVtcHR5IHN0cmluZ3MgYXJlIG5vdCBhZGRlZCB0byBccCBBLiBUaGV5CisgICAgLy8vIHN0aWxsIGNvdW50IHdoZW4gY29uc2lkZXJpbmcgXHAgTWF4U3BsaXQKKyAgICAvLy8gQW4gdXNlZnVsIGludmFyaWFudCBpcyB0aGF0CisgICAgLy8vIFNlcGFyYXRvci5qb2luKEEpID09ICp0aGlzIGlmIE1heFNwbGl0ID09IC0xIGFuZCBLZWVwRW1wdHkgPT0gdHJ1ZQorICAgIC8vLworICAgIC8vLyBccGFyYW0gQSAtIFdoZXJlIHRvIHB1dCB0aGUgc3Vic3RyaW5ncy4KKyAgICAvLy8gXHBhcmFtIFNlcGFyYXRvciAtIFRoZSBzdHJpbmcgdG8gc3BsaXQgb24uCisgICAgLy8vIFxwYXJhbSBNYXhTcGxpdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGUgc3RyaW5nIGlzIHNwbGl0LgorICAgIC8vLyBccGFyYW0gS2VlcEVtcHR5IC0gVHJ1ZSBpZiBlbXB0eSBzdWJzdHJpbmcgc2hvdWxkIGJlIGFkZGVkLgorICAgIHZvaWQgc3BsaXQoU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gJkEsIGNoYXIgU2VwYXJhdG9yLCBpbnQgTWF4U3BsaXQgPSAtMSwKKyAgICAgICAgICAgICAgIGJvb2wgS2VlcEVtcHR5ID0gdHJ1ZSkgY29uc3Q7CisKKyAgICAvLy8gU3BsaXQgaW50byB0d28gc3Vic3RyaW5ncyBhcm91bmQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBhIHNlcGFyYXRvcgorICAgIC8vLyBjaGFyYWN0ZXIuCisgICAgLy8vCisgICAgLy8vIElmIFxwIFNlcGFyYXRvciBpcyBpbiB0aGUgc3RyaW5nLCB0aGVuIHRoZSByZXN1bHQgaXMgYSBwYWlyIChMSFMsIFJIUykKKyAgICAvLy8gc3VjaCB0aGF0ICgqdGhpcyA9PSBMSFMgKyBTZXBhcmF0b3IgKyBSSFMpIGlzIHRydWUgYW5kIFJIUyBpcworICAgIC8vLyBtaW5pbWFsLiBJZiBccCBTZXBhcmF0b3IgaXMgbm90IGluIHRoZSBzdHJpbmcsIHRoZW4gdGhlIHJlc3VsdCBpcyBhCisgICAgLy8vIHBhaXIgKExIUywgUkhTKSB3aGVyZSAoKnRoaXMgPT0gTEhTKSBhbmQgKFJIUyA9PSAiIikuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBTZXBhcmF0b3IgLSBUaGUgY2hhcmFjdGVyIHRvIHNwbGl0IG9uLgorICAgIC8vLyBccmV0dXJuIC0gVGhlIHNwbGl0IHN1YnN0cmluZ3MuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBzdGQ6OnBhaXI8U3RyaW5nUmVmLCBTdHJpbmdSZWY+IHJzcGxpdChjaGFyIFNlcGFyYXRvcikgY29uc3QgeworICAgICAgc2l6ZV90IElkeCA9IHJmaW5kKFNlcGFyYXRvcik7CisgICAgICBpZiAoSWR4ID09IG5wb3MpCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigqdGhpcywgU3RyaW5nUmVmKCkpOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHNsaWNlKDAsIElkeCksIHNsaWNlKElkeCsxLCBucG9zKSk7CisgICAgfQorCisgICAgLy8vIFJldHVybiBzdHJpbmcgd2l0aCBjb25zZWN1dGl2ZSBccCBDaGFyIGNoYXJhY3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUKKyAgICAvLy8gdGhlIGxlZnQgcmVtb3ZlZC4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIFN0cmluZ1JlZiBsdHJpbShjaGFyIENoYXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBkcm9wX2Zyb250KHN0ZDo6bWluKExlbmd0aCwgZmluZF9maXJzdF9ub3Rfb2YoQ2hhcikpKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHN0cmluZyB3aXRoIGNvbnNlY3V0aXZlIGNoYXJhY3RlcnMgaW4gXHAgQ2hhcnMgc3RhcnRpbmcgZnJvbQorICAgIC8vLyB0aGUgbGVmdCByZW1vdmVkLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgU3RyaW5nUmVmIGx0cmltKFN0cmluZ1JlZiBDaGFycyA9ICIgXHRcblx2XGZcciIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBkcm9wX2Zyb250KHN0ZDo6bWluKExlbmd0aCwgZmluZF9maXJzdF9ub3Rfb2YoQ2hhcnMpKSk7CisgICAgfQorCisgICAgLy8vIFJldHVybiBzdHJpbmcgd2l0aCBjb25zZWN1dGl2ZSBccCBDaGFyIGNoYXJhY3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUKKyAgICAvLy8gcmlnaHQgcmVtb3ZlZC4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIFN0cmluZ1JlZiBydHJpbShjaGFyIENoYXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBkcm9wX2JhY2soTGVuZ3RoIC0gc3RkOjptaW4oTGVuZ3RoLCBmaW5kX2xhc3Rfbm90X29mKENoYXIpICsgMSkpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gc3RyaW5nIHdpdGggY29uc2VjdXRpdmUgY2hhcmFjdGVycyBpbiBccCBDaGFycyBzdGFydGluZyBmcm9tCisgICAgLy8vIHRoZSByaWdodCByZW1vdmVkLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgU3RyaW5nUmVmIHJ0cmltKFN0cmluZ1JlZiBDaGFycyA9ICIgXHRcblx2XGZcciIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBkcm9wX2JhY2soTGVuZ3RoIC0gc3RkOjptaW4oTGVuZ3RoLCBmaW5kX2xhc3Rfbm90X29mKENoYXJzKSArIDEpKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHN0cmluZyB3aXRoIGNvbnNlY3V0aXZlIFxwIENoYXIgY2hhcmFjdGVycyBzdGFydGluZyBmcm9tIHRoZQorICAgIC8vLyBsZWZ0IGFuZCByaWdodCByZW1vdmVkLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgU3RyaW5nUmVmIHRyaW0oY2hhciBDaGFyKSBjb25zdCB7CisgICAgICByZXR1cm4gbHRyaW0oQ2hhcikucnRyaW0oQ2hhcik7CisgICAgfQorCisgICAgLy8vIFJldHVybiBzdHJpbmcgd2l0aCBjb25zZWN1dGl2ZSBjaGFyYWN0ZXJzIGluIFxwIENoYXJzIHN0YXJ0aW5nIGZyb20KKyAgICAvLy8gdGhlIGxlZnQgYW5kIHJpZ2h0IHJlbW92ZWQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBTdHJpbmdSZWYgdHJpbShTdHJpbmdSZWYgQ2hhcnMgPSAiIFx0XG5cdlxmXHIiKSBjb25zdCB7CisgICAgICByZXR1cm4gbHRyaW0oQ2hhcnMpLnJ0cmltKENoYXJzKTsKKyAgICB9CisKKyAgICAvLy8gQH0KKyAgfTsKKworICAvLy8gQSB3cmFwcGVyIGFyb3VuZCBhIHN0cmluZyBsaXRlcmFsIHRoYXQgc2VydmVzIGFzIGEgcHJveHkgZm9yIGNvbnN0cnVjdGluZworICAvLy8gZ2xvYmFsIHRhYmxlcyBvZiBTdHJpbmdSZWZzIHdpdGggdGhlIGxlbmd0aCBjb21wdXRlZCBhdCBjb21waWxlIHRpbWUuCisgIC8vLyBJbiBvcmRlciB0byBhdm9pZCB0aGUgaW52b2NhdGlvbiBvZiBhIGdsb2JhbCBjb25zdHJ1Y3RvciwgU3RyaW5nTGl0ZXJhbAorICAvLy8gc2hvdWxkICpvbmx5KiBiZSB1c2VkIGluIGEgY29uc3RleHByIGNvbnRleHQsIGFzIHN1Y2g6CisgIC8vLworICAvLy8gY29uc3RleHByIFN0cmluZ0xpdGVyYWwgUygidGVzdCIpOworICAvLy8KKyAgY2xhc3MgU3RyaW5nTGl0ZXJhbCA6IHB1YmxpYyBTdHJpbmdSZWYgeworICBwcml2YXRlOgorICAgIGNvbnN0ZXhwciBTdHJpbmdMaXRlcmFsKGNvbnN0IGNoYXIgKlN0ciwgc2l6ZV90IE4pIDogU3RyaW5nUmVmKFN0ciwgTikgeworICAgIH0KKworICBwdWJsaWM6CisgICAgdGVtcGxhdGUgPHNpemVfdCBOPgorICAgIGNvbnN0ZXhwciBTdHJpbmdMaXRlcmFsKGNvbnN0IGNoYXIgKCZTdHIpW05dKQorI2lmIGRlZmluZWQoX19jbGFuZ19fKSAmJiBfX2hhc19hdHRyaWJ1dGUoZW5hYmxlX2lmKQorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2djYy1jb21wYXQiCisgICAgICAgIF9fYXR0cmlidXRlKChlbmFibGVfaWYoX19idWlsdGluX3N0cmxlbihTdHIpID09IE4gLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0cmluZyBsaXRlcmFsIikpKQorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisgICAgICAgIDogU3RyaW5nUmVmKFN0ciwgTiAtIDEpIHsKKyAgICB9CisKKyAgICAvLyBFeHBsaWNpdCBjb25zdHJ1Y3Rpb24gZm9yIHN0cmluZ3MgbGlrZSAiZm9vXDBiYXIiLgorICAgIHRlbXBsYXRlIDxzaXplX3QgTj4KKyAgICBzdGF0aWMgY29uc3RleHByIFN0cmluZ0xpdGVyYWwgd2l0aElubmVyTlVMKGNvbnN0IGNoYXIgKCZTdHIpW05dKSB7CisgICAgICByZXR1cm4gU3RyaW5nTGl0ZXJhbChTdHIsIE4gLSAxKTsKKyAgICB9CisgIH07CisKKyAgLy8vIEBuYW1lIFN0cmluZ1JlZiBDb21wYXJpc29uIE9wZXJhdG9ycworICAvLy8gQHsKKworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oU3RyaW5nUmVmIExIUywgU3RyaW5nUmVmIFJIUykgeworICAgIHJldHVybiBMSFMuZXF1YWxzKFJIUyk7CisgIH0KKworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oU3RyaW5nUmVmIExIUywgU3RyaW5nUmVmIFJIUykgeyByZXR1cm4gIShMSFMgPT0gUkhTKTsgfQorCisgIGlubGluZSBib29sIG9wZXJhdG9yPChTdHJpbmdSZWYgTEhTLCBTdHJpbmdSZWYgUkhTKSB7CisgICAgcmV0dXJuIExIUy5jb21wYXJlKFJIUykgPT0gLTE7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KFN0cmluZ1JlZiBMSFMsIFN0cmluZ1JlZiBSSFMpIHsKKyAgICByZXR1cm4gTEhTLmNvbXBhcmUoUkhTKSAhPSAxOworICB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KFN0cmluZ1JlZiBMSFMsIFN0cmluZ1JlZiBSSFMpIHsKKyAgICByZXR1cm4gTEhTLmNvbXBhcmUoUkhTKSA9PSAxOworICB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShTdHJpbmdSZWYgTEhTLCBTdHJpbmdSZWYgUkhTKSB7CisgICAgcmV0dXJuIExIUy5jb21wYXJlKFJIUykgIT0gLTE7CisgIH0KKworICBpbmxpbmUgc3RkOjpzdHJpbmcgJm9wZXJhdG9yKz0oc3RkOjpzdHJpbmcgJmJ1ZmZlciwgU3RyaW5nUmVmIHN0cmluZykgeworICAgIHJldHVybiBidWZmZXIuYXBwZW5kKHN0cmluZy5kYXRhKCksIHN0cmluZy5zaXplKCkpOworICB9CisKKyAgLy8vIEB9CisKKyAgLy8vIFxicmllZiBDb21wdXRlIGEgaGFzaF9jb2RlIGZvciBhIFN0cmluZ1JlZi4KKyAgTExWTV9OT0RJU0NBUkQKKyAgaGFzaF9jb2RlIGhhc2hfdmFsdWUoU3RyaW5nUmVmIFMpOworCisgIC8vIFN0cmluZ1JlZnMgY2FuIGJlIHRyZWF0ZWQgbGlrZSBhIFBPRCB0eXBlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlzUG9kTGlrZTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzUG9kTGlrZTxTdHJpbmdSZWY+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfU1RSSU5HUkVGX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1N0cmluZ1NldC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nU2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmNDRjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1N0cmluZ1NldC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vPT09LSBTdHJpbmdTZXQuaCAtIFRoZSBMTFZNIENvbXBpbGVyIERyaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFN0cmluZ1NldCAtIEEgc2V0LWxpa2Ugd3JhcHBlciBmb3IgdGhlIFN0cmluZ01hcC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NUUklOR1NFVF9ICisjZGVmaW5lIExMVk1fQURUX1NUUklOR1NFVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICAvLy8gU3RyaW5nU2V0IC0gQSB3cmFwcGVyIGZvciBTdHJpbmdNYXAgdGhhdCBwcm92aWRlcyBzZXQtbGlrZSBmdW5jdGlvbmFsaXR5LgorICB0ZW1wbGF0ZSA8Y2xhc3MgQWxsb2NhdG9yVHkgPSBNYWxsb2NBbGxvY2F0b3I+CisgIGNsYXNzIFN0cmluZ1NldCA6IHB1YmxpYyBTdHJpbmdNYXA8Y2hhciwgQWxsb2NhdG9yVHk+IHsKKyAgICB1c2luZyBiYXNlID0gU3RyaW5nTWFwPGNoYXIsIEFsbG9jYXRvclR5PjsKKworICBwdWJsaWM6CisgICAgU3RyaW5nU2V0KCkgPSBkZWZhdWx0OworICAgIFN0cmluZ1NldChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8U3RyaW5nUmVmPiBTKSB7CisgICAgICBmb3IgKFN0cmluZ1JlZiBYIDogUykKKyAgICAgICAgaW5zZXJ0KFgpOworICAgIH0KKworICAgIHN0ZDo6cGFpcjx0eXBlbmFtZSBiYXNlOjppdGVyYXRvciwgYm9vbD4gaW5zZXJ0KFN0cmluZ1JlZiBLZXkpIHsKKyAgICAgIGFzc2VydCghS2V5LmVtcHR5KCkpOworICAgICAgcmV0dXJuIGJhc2U6Omluc2VydChzdGQ6Om1ha2VfcGFpcihLZXksICdcMCcpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRJdD4KKyAgICB2b2lkIGluc2VydChjb25zdCBJbnB1dEl0ICZCZWdpbiwgY29uc3QgSW5wdXRJdCAmRW5kKSB7CisgICAgICBmb3IgKGF1dG8gSXQgPSBCZWdpbjsgSXQgIT0gRW5kOyArK0l0KQorICAgICAgICBiYXNlOjppbnNlcnQoc3RkOjptYWtlX3BhaXIoKkl0LCAnXDAnKSk7CisgICAgfQorICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfU1RSSU5HU0VUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1N0cmluZ1N3aXRjaC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nU3dpdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwNzMwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1N0cmluZ1N3aXRjaC5oCkBAIC0wLDAgKzEsMjE5IEBACisvLz09PS0tLSBTdHJpbmdTd2l0Y2guaCAtIFN3aXRjaC1vbi1saXRlcmFsLXN0cmluZyBDb25zdHJ1Y3QgLS0tLS0tLS0tLS0tLS09PT0vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09LworLy8KKy8vICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgU3RyaW5nU3dpdGNoIHRlbXBsYXRlLCB3aGljaCBtaW1pY3MgYSBzd2l0Y2goKQorLy8gIHN0YXRlbWVudCB3aG9zZSBjYXNlcyBhcmUgc3RyaW5nIGxpdGVyYWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8KKyNpZm5kZWYgTExWTV9BRFRfU1RSSU5HU1dJVENIX0gKKyNkZWZpbmUgTExWTV9BRFRfU1RSSU5HU1dJVENIX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gXGJyaWVmIEEgc3dpdGNoKCktbGlrZSBzdGF0ZW1lbnQgd2hvc2UgY2FzZXMgYXJlIHN0cmluZyBsaXRlcmFscy4KKy8vLworLy8vIFRoZSBTdHJpbmdTd2l0Y2ggY2xhc3MgaXMgYSBzaW1wbGUgZm9ybSBvZiBhIHN3aXRjaCgpIHN0YXRlbWVudCB0aGF0CisvLy8gZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBzdHJpbmcgbWF0Y2hlcyBvbmUgb2YgdGhlIGdpdmVuIHN0cmluZworLy8vIGxpdGVyYWxzLiBUaGUgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXIgXHAgVCBpcyB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgdGhhdAorLy8vIHdpbGwgYmUgcmV0dXJuZWQgZnJvbSB0aGUgc3RyaW5nLXN3aXRjaCBleHByZXNzaW9uLiBGb3IgZXhhbXBsZSwKKy8vLyB0aGUgZm9sbG93aW5nIGNvZGUgc3dpdGNoZXMgb24gdGhlIG5hbWUgb2YgYSBjb2xvciBpbiBcYyBhcmd2W2ldOgorLy8vCisvLy8gXGNvZGUKKy8vLyBDb2xvciBjb2xvciA9IFN0cmluZ1N3aXRjaDxDb2xvcj4oYXJndltpXSkKKy8vLyAgIC5DYXNlKCJyZWQiLCBSZWQpCisvLy8gICAuQ2FzZSgib3JhbmdlIiwgT3JhbmdlKQorLy8vICAgLkNhc2UoInllbGxvdyIsIFllbGxvdykKKy8vLyAgIC5DYXNlKCJncmVlbiIsIEdyZWVuKQorLy8vICAgLkNhc2UoImJsdWUiLCBCbHVlKQorLy8vICAgLkNhc2UoImluZGlnbyIsIEluZGlnbykKKy8vLyAgIC5DYXNlcygidmlvbGV0IiwgInB1cnBsZSIsIFZpb2xldCkKKy8vLyAgIC5EZWZhdWx0KFVua25vd25Db2xvcik7CisvLy8gXGVuZGNvZGUKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFIgPSBUPgorY2xhc3MgU3RyaW5nU3dpdGNoIHsKKyAgLy8vIFxicmllZiBUaGUgc3RyaW5nIHdlIGFyZSBtYXRjaGluZy4KKyAgY29uc3QgU3RyaW5nUmVmIFN0cjsKKworICAvLy8gXGJyaWVmIFRoZSBwb2ludGVyIHRvIHRoZSByZXN1bHQgb2YgdGhpcyBzd2l0Y2ggc3RhdGVtZW50LCBvbmNlIGtub3duLAorICAvLy8gbnVsbCBiZWZvcmUgdGhhdC4KKyAgT3B0aW9uYWw8VD4gUmVzdWx0OworCitwdWJsaWM6CisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgZXhwbGljaXQgU3RyaW5nU3dpdGNoKFN0cmluZ1JlZiBTKQorICA6IFN0cihTKSwgUmVzdWx0KCkgeyB9CisKKyAgLy8gU3RyaW5nU3dpdGNoIGlzIG5vdCBjb3B5YWJsZS4KKyAgU3RyaW5nU3dpdGNoKGNvbnN0IFN0cmluZ1N3aXRjaCAmKSA9IGRlbGV0ZTsKKworICAvLyBTdHJpbmdTd2l0Y2ggaXMgbm90IGFzc2lnbmFibGUgZHVlIHRvICdTdHInIGJlaW5nICdjb25zdCcuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFN0cmluZ1N3aXRjaCAmKSA9IGRlbGV0ZTsKKyAgdm9pZCBvcGVyYXRvcj0oU3RyaW5nU3dpdGNoICYmb3RoZXIpID0gZGVsZXRlOworCisgIFN0cmluZ1N3aXRjaChTdHJpbmdTd2l0Y2ggJiZvdGhlcikKKyAgICA6IFN0cihvdGhlci5TdHIpLCBSZXN1bHQoc3RkOjptb3ZlKG90aGVyLlJlc3VsdCkpIHsgfQorCisgIH5TdHJpbmdTd2l0Y2goKSA9IGRlZmF1bHQ7CisKKyAgLy8gQ2FzZS1zZW5zaXRpdmUgY2FzZSBtYXRjaGVycworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFN0cmluZ1N3aXRjaCAmQ2FzZShTdHJpbmdMaXRlcmFsIFMsIFQgVmFsdWUpIHsKKyAgICBpZiAoIVJlc3VsdCAmJiBTdHIgPT0gUykgeworICAgICAgUmVzdWx0ID0gc3RkOjptb3ZlKFZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICBTdHJpbmdTd2l0Y2gmIEVuZHNXaXRoKFN0cmluZ0xpdGVyYWwgUywgVCBWYWx1ZSkgeworICAgIGlmICghUmVzdWx0ICYmIFN0ci5lbmRzd2l0aChTKSkgeworICAgICAgUmVzdWx0ID0gc3RkOjptb3ZlKFZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICBTdHJpbmdTd2l0Y2gmIFN0YXJ0c1dpdGgoU3RyaW5nTGl0ZXJhbCBTLCBUIFZhbHVlKSB7CisgICAgaWYgKCFSZXN1bHQgJiYgU3RyLnN0YXJ0c3dpdGgoUykpIHsKKyAgICAgIFJlc3VsdCA9IHN0ZDo6bW92ZShWYWx1ZSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgU3RyaW5nU3dpdGNoICZDYXNlcyhTdHJpbmdMaXRlcmFsIFMwLCBTdHJpbmdMaXRlcmFsIFMxLCBUIFZhbHVlKSB7CisgICAgcmV0dXJuIENhc2UoUzAsIFZhbHVlKS5DYXNlKFMxLCBWYWx1ZSk7CisgIH0KKworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFN0cmluZ1N3aXRjaCAmQ2FzZXMoU3RyaW5nTGl0ZXJhbCBTMCwgU3RyaW5nTGl0ZXJhbCBTMSwgU3RyaW5nTGl0ZXJhbCBTMiwKKyAgICAgICAgICAgICAgICAgICAgICBUIFZhbHVlKSB7CisgICAgcmV0dXJuIENhc2UoUzAsIFZhbHVlKS5DYXNlcyhTMSwgUzIsIFZhbHVlKTsKKyAgfQorCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgU3RyaW5nU3dpdGNoICZDYXNlcyhTdHJpbmdMaXRlcmFsIFMwLCBTdHJpbmdMaXRlcmFsIFMxLCBTdHJpbmdMaXRlcmFsIFMyLAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgUzMsIFQgVmFsdWUpIHsKKyAgICByZXR1cm4gQ2FzZShTMCwgVmFsdWUpLkNhc2VzKFMxLCBTMiwgUzMsIFZhbHVlKTsKKyAgfQorCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgU3RyaW5nU3dpdGNoICZDYXNlcyhTdHJpbmdMaXRlcmFsIFMwLCBTdHJpbmdMaXRlcmFsIFMxLCBTdHJpbmdMaXRlcmFsIFMyLAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgUzMsIFN0cmluZ0xpdGVyYWwgUzQsIFQgVmFsdWUpIHsKKyAgICByZXR1cm4gQ2FzZShTMCwgVmFsdWUpLkNhc2VzKFMxLCBTMiwgUzMsIFM0LCBWYWx1ZSk7CisgIH0KKworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFN0cmluZ1N3aXRjaCAmQ2FzZXMoU3RyaW5nTGl0ZXJhbCBTMCwgU3RyaW5nTGl0ZXJhbCBTMSwgU3RyaW5nTGl0ZXJhbCBTMiwKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsIFMzLCBTdHJpbmdMaXRlcmFsIFM0LCBTdHJpbmdMaXRlcmFsIFM1LAorICAgICAgICAgICAgICAgICAgICAgIFQgVmFsdWUpIHsKKyAgICByZXR1cm4gQ2FzZShTMCwgVmFsdWUpLkNhc2VzKFMxLCBTMiwgUzMsIFM0LCBTNSwgVmFsdWUpOworICB9CisKKyAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICBTdHJpbmdTd2l0Y2ggJkNhc2VzKFN0cmluZ0xpdGVyYWwgUzAsIFN0cmluZ0xpdGVyYWwgUzEsIFN0cmluZ0xpdGVyYWwgUzIsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCBTMywgU3RyaW5nTGl0ZXJhbCBTNCwgU3RyaW5nTGl0ZXJhbCBTNSwKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsIFM2LCBUIFZhbHVlKSB7CisgICAgcmV0dXJuIENhc2UoUzAsIFZhbHVlKS5DYXNlcyhTMSwgUzIsIFMzLCBTNCwgUzUsIFM2LCBWYWx1ZSk7CisgIH0KKworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFN0cmluZ1N3aXRjaCAmQ2FzZXMoU3RyaW5nTGl0ZXJhbCBTMCwgU3RyaW5nTGl0ZXJhbCBTMSwgU3RyaW5nTGl0ZXJhbCBTMiwKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsIFMzLCBTdHJpbmdMaXRlcmFsIFM0LCBTdHJpbmdMaXRlcmFsIFM1LAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgUzYsIFN0cmluZ0xpdGVyYWwgUzcsIFQgVmFsdWUpIHsKKyAgICByZXR1cm4gQ2FzZShTMCwgVmFsdWUpLkNhc2VzKFMxLCBTMiwgUzMsIFM0LCBTNSwgUzYsIFM3LCBWYWx1ZSk7CisgIH0KKworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFN0cmluZ1N3aXRjaCAmQ2FzZXMoU3RyaW5nTGl0ZXJhbCBTMCwgU3RyaW5nTGl0ZXJhbCBTMSwgU3RyaW5nTGl0ZXJhbCBTMiwKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsIFMzLCBTdHJpbmdMaXRlcmFsIFM0LCBTdHJpbmdMaXRlcmFsIFM1LAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgUzYsIFN0cmluZ0xpdGVyYWwgUzcsIFN0cmluZ0xpdGVyYWwgUzgsCisgICAgICAgICAgICAgICAgICAgICAgVCBWYWx1ZSkgeworICAgIHJldHVybiBDYXNlKFMwLCBWYWx1ZSkuQ2FzZXMoUzEsIFMyLCBTMywgUzQsIFM1LCBTNiwgUzcsIFM4LCBWYWx1ZSk7CisgIH0KKworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFN0cmluZ1N3aXRjaCAmQ2FzZXMoU3RyaW5nTGl0ZXJhbCBTMCwgU3RyaW5nTGl0ZXJhbCBTMSwgU3RyaW5nTGl0ZXJhbCBTMiwKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsIFMzLCBTdHJpbmdMaXRlcmFsIFM0LCBTdHJpbmdMaXRlcmFsIFM1LAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgUzYsIFN0cmluZ0xpdGVyYWwgUzcsIFN0cmluZ0xpdGVyYWwgUzgsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCBTOSwgVCBWYWx1ZSkgeworICAgIHJldHVybiBDYXNlKFMwLCBWYWx1ZSkuQ2FzZXMoUzEsIFMyLCBTMywgUzQsIFM1LCBTNiwgUzcsIFM4LCBTOSwgVmFsdWUpOworICB9CisKKyAgLy8gQ2FzZS1pbnNlbnNpdGl2ZSBjYXNlIG1hdGNoZXJzLgorICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFN0cmluZ1N3aXRjaCAmQ2FzZUxvd2VyKFN0cmluZ0xpdGVyYWwgUywgVCBWYWx1ZSkgeworICAgIGlmICghUmVzdWx0ICYmIFN0ci5lcXVhbHNfbG93ZXIoUykpCisgICAgICBSZXN1bHQgPSBzdGQ6Om1vdmUoVmFsdWUpOworCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICBTdHJpbmdTd2l0Y2ggJkVuZHNXaXRoTG93ZXIoU3RyaW5nTGl0ZXJhbCBTLCBUIFZhbHVlKSB7CisgICAgaWYgKCFSZXN1bHQgJiYgU3RyLmVuZHN3aXRoX2xvd2VyKFMpKQorICAgICAgUmVzdWx0ID0gVmFsdWU7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFN0cmluZ1N3aXRjaCAmU3RhcnRzV2l0aExvd2VyKFN0cmluZ0xpdGVyYWwgUywgVCBWYWx1ZSkgeworICAgIGlmICghUmVzdWx0ICYmIFN0ci5zdGFydHN3aXRoX2xvd2VyKFMpKQorICAgICAgUmVzdWx0ID0gc3RkOjptb3ZlKFZhbHVlKTsKKworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgU3RyaW5nU3dpdGNoICZDYXNlc0xvd2VyKFN0cmluZ0xpdGVyYWwgUzAsIFN0cmluZ0xpdGVyYWwgUzEsIFQgVmFsdWUpIHsKKyAgICByZXR1cm4gQ2FzZUxvd2VyKFMwLCBWYWx1ZSkuQ2FzZUxvd2VyKFMxLCBWYWx1ZSk7CisgIH0KKworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFN0cmluZ1N3aXRjaCAmQ2FzZXNMb3dlcihTdHJpbmdMaXRlcmFsIFMwLCBTdHJpbmdMaXRlcmFsIFMxLCBTdHJpbmdMaXRlcmFsIFMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVCBWYWx1ZSkgeworICAgIHJldHVybiBDYXNlTG93ZXIoUzAsIFZhbHVlKS5DYXNlc0xvd2VyKFMxLCBTMiwgVmFsdWUpOworICB9CisKKyAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICBTdHJpbmdTd2l0Y2ggJkNhc2VzTG93ZXIoU3RyaW5nTGl0ZXJhbCBTMCwgU3RyaW5nTGl0ZXJhbCBTMSwgU3RyaW5nTGl0ZXJhbCBTMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgUzMsIFQgVmFsdWUpIHsKKyAgICByZXR1cm4gQ2FzZUxvd2VyKFMwLCBWYWx1ZSkuQ2FzZXNMb3dlcihTMSwgUzIsIFMzLCBWYWx1ZSk7CisgIH0KKworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFN0cmluZ1N3aXRjaCAmQ2FzZXNMb3dlcihTdHJpbmdMaXRlcmFsIFMwLCBTdHJpbmdMaXRlcmFsIFMxLCBTdHJpbmdMaXRlcmFsIFMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCBTMywgU3RyaW5nTGl0ZXJhbCBTNCwgVCBWYWx1ZSkgeworICAgIHJldHVybiBDYXNlTG93ZXIoUzAsIFZhbHVlKS5DYXNlc0xvd2VyKFMxLCBTMiwgUzMsIFM0LCBWYWx1ZSk7CisgIH0KKworICBMTFZNX05PRElTQ0FSRAorICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFIgRGVmYXVsdChUIFZhbHVlKSB7CisgICAgaWYgKFJlc3VsdCkKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoKlJlc3VsdCk7CisgICAgcmV0dXJuIFZhbHVlOworICB9CisKKyAgTExWTV9OT0RJU0NBUkQKKyAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICBvcGVyYXRvciBSKCkgeworICAgIGFzc2VydChSZXN1bHQgJiYgIkZlbGwgb2ZmIHRoZSBlbmQgb2YgYSBzdHJpbmctc3dpdGNoIik7CisgICAgcmV0dXJuIHN0ZDo6bW92ZSgqUmVzdWx0KTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1NUUklOR1NXSVRDSF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9UaW55UHRyVmVjdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9UaW55UHRyVmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM1NzNkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1RpbnlQdHJWZWN0b3IuaApAQCAtMCwwICsxLDM0NyBAQAorLy89PT0tIGxsdm0vQURUL1RpbnlQdHJWZWN0b3IuaCAtICdOb3JtYWxseSB0aW55JyB2ZWN0b3JzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9USU5ZUFRSVkVDVE9SX0gKKyNkZWZpbmUgTExWTV9BRFRfVElOWVBUUlZFQ1RPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVGlueVB0clZlY3RvciAtIFRoaXMgY2xhc3MgaXMgc3BlY2lhbGl6ZWQgZm9yIGNhc2VzIHdoZXJlIHRoZXJlIGFyZQorLy8vIG5vcm1hbGx5IDAgb3IgMSBlbGVtZW50IGluIGEgdmVjdG9yLCBidXQgaXMgZ2VuZXJhbCBlbm91Z2ggdG8gZ28gYmV5b25kIHRoYXQKKy8vLyB3aGVuIHJlcXVpcmVkLgorLy8vCisvLy8gTk9URTogVGhpcyBjb250YWluZXIgZG9lc24ndCBhbGxvdyB5b3UgdG8gc3RvcmUgYSBudWxsIHBvaW50ZXIgaW50byBpdC4KKy8vLwordGVtcGxhdGUgPHR5cGVuYW1lIEVsdFR5PgorY2xhc3MgVGlueVB0clZlY3RvciB7CitwdWJsaWM6CisgIHVzaW5nIFZlY1R5ID0gU21hbGxWZWN0b3I8RWx0VHksIDQ+OworICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgVmVjVHk6OnZhbHVlX3R5cGU7CisgIHVzaW5nIFB0clVuaW9uID0gUG9pbnRlclVuaW9uPEVsdFR5LCBWZWNUeSAqPjsKKworcHJpdmF0ZToKKyAgUHRyVW5pb24gVmFsOworCitwdWJsaWM6CisgIFRpbnlQdHJWZWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgflRpbnlQdHJWZWN0b3IoKSB7CisgICAgaWYgKFZlY1R5ICpWID0gVmFsLnRlbXBsYXRlIGR5bl9jYXN0PFZlY1R5Kj4oKSkKKyAgICAgIGRlbGV0ZSBWOworICB9CisKKyAgVGlueVB0clZlY3Rvcihjb25zdCBUaW55UHRyVmVjdG9yICZSSFMpIDogVmFsKFJIUy5WYWwpIHsKKyAgICBpZiAoVmVjVHkgKlYgPSBWYWwudGVtcGxhdGUgZHluX2Nhc3Q8VmVjVHkqPigpKQorICAgICAgVmFsID0gbmV3IFZlY1R5KCpWKTsKKyAgfQorCisgIFRpbnlQdHJWZWN0b3IgJm9wZXJhdG9yPShjb25zdCBUaW55UHRyVmVjdG9yICZSSFMpIHsKKyAgICBpZiAodGhpcyA9PSAmUkhTKQorICAgICAgcmV0dXJuICp0aGlzOworICAgIGlmIChSSFMuZW1wdHkoKSkgeworICAgICAgdGhpcy0+Y2xlYXIoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLyBUcnkgdG8gc3F1ZWV6ZSBpbnRvIHRoZSBzaW5nbGUgc2xvdC4gSWYgaXQgd29uJ3QgZml0LCBhbGxvY2F0ZSBhIGNvcGllZAorICAgIC8vIHZlY3Rvci4KKyAgICBpZiAoVmFsLnRlbXBsYXRlIGlzPEVsdFR5PigpKSB7CisgICAgICBpZiAoUkhTLnNpemUoKSA9PSAxKQorICAgICAgICBWYWwgPSBSSFMuZnJvbnQoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgVmFsID0gbmV3IFZlY1R5KCpSSFMuVmFsLnRlbXBsYXRlIGdldDxWZWNUeSo+KCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vIElmIHdlIGhhdmUgYSBmdWxsIHZlY3RvciBhbGxvY2F0ZWQsIHRyeSB0byByZS11c2UgaXQuCisgICAgaWYgKFJIUy5WYWwudGVtcGxhdGUgaXM8RWx0VHk+KCkpIHsKKyAgICAgIFZhbC50ZW1wbGF0ZSBnZXQ8VmVjVHkqPigpLT5jbGVhcigpOworICAgICAgVmFsLnRlbXBsYXRlIGdldDxWZWNUeSo+KCktPnB1c2hfYmFjayhSSFMuZnJvbnQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICpWYWwudGVtcGxhdGUgZ2V0PFZlY1R5Kj4oKSA9ICpSSFMuVmFsLnRlbXBsYXRlIGdldDxWZWNUeSo+KCk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFRpbnlQdHJWZWN0b3IoVGlueVB0clZlY3RvciAmJlJIUykgOiBWYWwoUkhTLlZhbCkgeworICAgIFJIUy5WYWwgPSAoRWx0VHkpbnVsbHB0cjsKKyAgfQorCisgIFRpbnlQdHJWZWN0b3IgJm9wZXJhdG9yPShUaW55UHRyVmVjdG9yICYmUkhTKSB7CisgICAgaWYgKHRoaXMgPT0gJlJIUykKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICBpZiAoUkhTLmVtcHR5KCkpIHsKKyAgICAgIHRoaXMtPmNsZWFyKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8gSWYgdGhpcyB2ZWN0b3IgaGFzIGJlZW4gYWxsb2NhdGVkIG9uIHRoZSBoZWFwLCByZS11c2UgaXQgaWYgY2hlYXAuIElmIGl0CisgICAgLy8gd291bGQgcmVxdWlyZSBtb3JlIGNvcHlpbmcsIGp1c3QgZGVsZXRlIGl0IGFuZCB3ZSdsbCBzdGVhbCB0aGUgb3RoZXIKKyAgICAvLyBzaWRlLgorICAgIGlmIChWZWNUeSAqViA9IFZhbC50ZW1wbGF0ZSBkeW5fY2FzdDxWZWNUeSo+KCkpIHsKKyAgICAgIGlmIChSSFMuVmFsLnRlbXBsYXRlIGlzPEVsdFR5PigpKSB7CisgICAgICAgIFYtPmNsZWFyKCk7CisgICAgICAgIFYtPnB1c2hfYmFjayhSSFMuZnJvbnQoKSk7CisgICAgICAgIFJIUy5WYWwgPSAoRWx0VHkpbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorICAgICAgZGVsZXRlIFY7CisgICAgfQorCisgICAgVmFsID0gUkhTLlZhbDsKKyAgICBSSFMuVmFsID0gKEVsdFR5KW51bGxwdHI7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIENvbnN0cnVjdG9yIGZyb20gYW4gQXJyYXlSZWYuCisgIC8vLworICAvLy8gVGhpcyBhbHNvIGlzIGEgY29uc3RydWN0b3IgZm9yIGluZGl2aWR1YWwgYXJyYXkgZWxlbWVudHMgZHVlIHRvIHRoZSBzaW5nbGUKKyAgLy8vIGVsZW1lbnQgY29uc3RydWN0b3IgZm9yIEFycmF5UmVmLgorICBleHBsaWNpdCBUaW55UHRyVmVjdG9yKEFycmF5UmVmPEVsdFR5PiBFbHRzKQorICAgICAgOiBWYWwoRWx0cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgPyBQdHJVbmlvbigpCisgICAgICAgICAgICAgICAgOiBFbHRzLnNpemUoKSA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgPyBQdHJVbmlvbihFbHRzWzBdKQorICAgICAgICAgICAgICAgICAgICAgIDogUHRyVW5pb24obmV3IFZlY1R5KEVsdHMuYmVnaW4oKSwgRWx0cy5lbmQoKSkpKSB7fQorCisgIFRpbnlQdHJWZWN0b3Ioc2l6ZV90IENvdW50LCBFbHRUeSBWYWx1ZSkKKyAgICAgIDogVmFsKENvdW50ID09IDAgPyBQdHJVbmlvbigpCisgICAgICAgICAgICAgICAgICAgICAgIDogQ291bnQgPT0gMSA/IFB0clVuaW9uKFZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQdHJVbmlvbihuZXcgVmVjVHkoQ291bnQsIFZhbHVlKSkpIHt9CisKKyAgLy8gaW1wbGljaXQgY29udmVyc2lvbiBvcGVyYXRvciB0byBBcnJheVJlZi4KKyAgb3BlcmF0b3IgQXJyYXlSZWY8RWx0VHk+KCkgY29uc3QgeworICAgIGlmIChWYWwuaXNOdWxsKCkpCisgICAgICByZXR1cm4gTm9uZTsKKyAgICBpZiAoVmFsLnRlbXBsYXRlIGlzPEVsdFR5PigpKQorICAgICAgcmV0dXJuICpWYWwuZ2V0QWRkck9mUHRyMSgpOworICAgIHJldHVybiAqVmFsLnRlbXBsYXRlIGdldDxWZWNUeSo+KCk7CisgIH0KKworICAvLyBpbXBsaWNpdCBjb252ZXJzaW9uIG9wZXJhdG9yIHRvIE11dGFibGVBcnJheVJlZi4KKyAgb3BlcmF0b3IgTXV0YWJsZUFycmF5UmVmPEVsdFR5PigpIHsKKyAgICBpZiAoVmFsLmlzTnVsbCgpKQorICAgICAgcmV0dXJuIE5vbmU7CisgICAgaWYgKFZhbC50ZW1wbGF0ZSBpczxFbHRUeT4oKSkKKyAgICAgIHJldHVybiAqVmFsLmdldEFkZHJPZlB0cjEoKTsKKyAgICByZXR1cm4gKlZhbC50ZW1wbGF0ZSBnZXQ8VmVjVHkqPigpOworICB9CisKKyAgLy8gSW1wbGljaXQgY29udmVyc2lvbiB0byBBcnJheVJlZjxVPiBpZiBFbHRUeSogaW1wbGljaXRseSBjb252ZXJ0cyB0byBVKi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVSwKKyAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICBzdGQ6OmlzX2NvbnZlcnRpYmxlPEFycmF5UmVmPEVsdFR5PiwgQXJyYXlSZWY8VT4+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgIGJvb2w+Ojp0eXBlID0gZmFsc2U+CisgIG9wZXJhdG9yIEFycmF5UmVmPFU+KCkgY29uc3QgeworICAgIHJldHVybiBvcGVyYXRvciBBcnJheVJlZjxFbHRUeT4oKTsKKyAgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgLy8gVGhpcyB2ZWN0b3IgY2FuIGJlIGVtcHR5IGlmIGl0IGNvbnRhaW5zIG5vIGVsZW1lbnQsIG9yIGlmIGl0CisgICAgLy8gY29udGFpbnMgYSBwb2ludGVyIHRvIGFuIGVtcHR5IHZlY3Rvci4KKyAgICBpZiAoVmFsLmlzTnVsbCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoVmVjVHkgKlZlYyA9IFZhbC50ZW1wbGF0ZSBkeW5fY2FzdDxWZWNUeSo+KCkpCisgICAgICByZXR1cm4gVmVjLT5lbXB0eSgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7CisgICAgaWYgKGVtcHR5KCkpCisgICAgICByZXR1cm4gMDsKKyAgICBpZiAoVmFsLnRlbXBsYXRlIGlzPEVsdFR5PigpKQorICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIFZhbC50ZW1wbGF0ZSBnZXQ8VmVjVHkqPigpLT5zaXplKCk7CisgIH0KKworICB1c2luZyBpdGVyYXRvciA9IEVsdFR5ICo7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gY29uc3QgRWx0VHkgKjsKKyAgdXNpbmcgcmV2ZXJzZV9pdGVyYXRvciA9IHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj47CisgIHVzaW5nIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgPSBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+OworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeworICAgIGlmIChWYWwudGVtcGxhdGUgaXM8RWx0VHk+KCkpCisgICAgICByZXR1cm4gVmFsLmdldEFkZHJPZlB0cjEoKTsKKworICAgIHJldHVybiBWYWwudGVtcGxhdGUgZ2V0PFZlY1R5ICo+KCktPmJlZ2luKCk7CisgIH0KKworICBpdGVyYXRvciBlbmQoKSB7CisgICAgaWYgKFZhbC50ZW1wbGF0ZSBpczxFbHRUeT4oKSkKKyAgICAgIHJldHVybiBiZWdpbigpICsgKFZhbC5pc051bGwoKSA/IDAgOiAxKTsKKworICAgIHJldHVybiBWYWwudGVtcGxhdGUgZ2V0PFZlY1R5ICo+KCktPmVuZCgpOworICB9CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIChjb25zdF9pdGVyYXRvciljb25zdF9jYXN0PFRpbnlQdHJWZWN0b3IqPih0aGlzKS0+YmVnaW4oKTsKKyAgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGNvbnN0X2l0ZXJhdG9yKWNvbnN0X2Nhc3Q8VGlueVB0clZlY3Rvcio+KHRoaXMpLT5lbmQoKTsKKyAgfQorCisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsKKyAgfQorCisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsKKyAgfQorCisgIEVsdFR5IG9wZXJhdG9yW10odW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydCghVmFsLmlzTnVsbCgpICYmICJjYW4ndCBpbmRleCBpbnRvIGFuIGVtcHR5IHZlY3RvciIpOworICAgIGlmIChFbHRUeSBWID0gVmFsLnRlbXBsYXRlIGR5bl9jYXN0PEVsdFR5PigpKSB7CisgICAgICBhc3NlcnQoaSA9PSAwICYmICJ0aW55dmVjdG9yIGluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgcmV0dXJuIFY7CisgICAgfQorCisgICAgYXNzZXJ0KGkgPCBWYWwudGVtcGxhdGUgZ2V0PFZlY1R5Kj4oKS0+c2l6ZSgpICYmCisgICAgICAgICAgICJ0aW55dmVjdG9yIGluZGV4IG91dCBvZiByYW5nZSIpOworICAgIHJldHVybiAoKlZhbC50ZW1wbGF0ZSBnZXQ8VmVjVHkqPigpKVtpXTsKKyAgfQorCisgIEVsdFR5IGZyb250KCkgY29uc3QgeworICAgIGFzc2VydCghZW1wdHkoKSAmJiAidmVjdG9yIGVtcHR5Iik7CisgICAgaWYgKEVsdFR5IFYgPSBWYWwudGVtcGxhdGUgZHluX2Nhc3Q8RWx0VHk+KCkpCisgICAgICByZXR1cm4gVjsKKyAgICByZXR1cm4gVmFsLnRlbXBsYXRlIGdldDxWZWNUeSo+KCktPmZyb250KCk7CisgIH0KKworICBFbHRUeSBiYWNrKCkgY29uc3QgeworICAgIGFzc2VydCghZW1wdHkoKSAmJiAidmVjdG9yIGVtcHR5Iik7CisgICAgaWYgKEVsdFR5IFYgPSBWYWwudGVtcGxhdGUgZHluX2Nhc3Q8RWx0VHk+KCkpCisgICAgICByZXR1cm4gVjsKKyAgICByZXR1cm4gVmFsLnRlbXBsYXRlIGdldDxWZWNUeSo+KCktPmJhY2soKTsKKyAgfQorCisgIHZvaWQgcHVzaF9iYWNrKEVsdFR5IE5ld1ZhbCkgeworICAgIGFzc2VydChOZXdWYWwgJiYgIkNhbid0IGFkZCBhIG51bGwgdmFsdWUiKTsKKworICAgIC8vIElmIHdlIGhhdmUgbm90aGluZywgYWRkIHNvbWV0aGluZy4KKyAgICBpZiAoVmFsLmlzTnVsbCgpKSB7CisgICAgICBWYWwgPSBOZXdWYWw7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgd2UgaGF2ZSBhIHNpbmdsZSB2YWx1ZSwgY29udmVydCB0byBhIHZlY3Rvci4KKyAgICBpZiAoRWx0VHkgViA9IFZhbC50ZW1wbGF0ZSBkeW5fY2FzdDxFbHRUeT4oKSkgeworICAgICAgVmFsID0gbmV3IFZlY1R5KCk7CisgICAgICBWYWwudGVtcGxhdGUgZ2V0PFZlY1R5Kj4oKS0+cHVzaF9iYWNrKFYpOworICAgIH0KKworICAgIC8vIEFkZCB0aGUgbmV3IHZhbHVlLCB3ZSBrbm93IHdlIGhhdmUgYSB2ZWN0b3IuCisgICAgVmFsLnRlbXBsYXRlIGdldDxWZWNUeSo+KCktPnB1c2hfYmFjayhOZXdWYWwpOworICB9CisKKyAgdm9pZCBwb3BfYmFjaygpIHsKKyAgICAvLyBJZiB3ZSBoYXZlIGEgc2luZ2xlIHZhbHVlLCBjb252ZXJ0IHRvIGVtcHR5LgorICAgIGlmIChWYWwudGVtcGxhdGUgaXM8RWx0VHk+KCkpCisgICAgICBWYWwgPSAoRWx0VHkpbnVsbHB0cjsKKyAgICBlbHNlIGlmIChWZWNUeSAqVmVjID0gVmFsLnRlbXBsYXRlIGdldDxWZWNUeSo+KCkpCisgICAgICBWZWMtPnBvcF9iYWNrKCk7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIC8vIElmIHdlIGhhdmUgYSBzaW5nbGUgdmFsdWUsIGNvbnZlcnQgdG8gZW1wdHkuCisgICAgaWYgKFZhbC50ZW1wbGF0ZSBpczxFbHRUeT4oKSkgeworICAgICAgVmFsID0gKEVsdFR5KW51bGxwdHI7CisgICAgfSBlbHNlIGlmIChWZWNUeSAqVmVjID0gVmFsLnRlbXBsYXRlIGR5bl9jYXN0PFZlY1R5Kj4oKSkgeworICAgICAgLy8gSWYgd2UgaGF2ZSBhIHZlY3RvciBmb3JtLCBqdXN0IGNsZWFyIGl0LgorICAgICAgVmVjLT5jbGVhcigpOworICAgIH0KKyAgICAvLyBPdGhlcndpc2UsIHdlJ3JlIGFscmVhZHkgZW1wdHkuCisgIH0KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBJKSB7CisgICAgYXNzZXJ0KEkgPj0gYmVnaW4oKSAmJiAiSXRlcmF0b3IgdG8gZXJhc2UgaXMgb3V0IG9mIGJvdW5kcy4iKTsKKyAgICBhc3NlcnQoSSA8IGVuZCgpICYmICJFcmFzaW5nIGF0IHBhc3QtdGhlLWVuZCBpdGVyYXRvci4iKTsKKworICAgIC8vIElmIHdlIGhhdmUgYSBzaW5nbGUgdmFsdWUsIGNvbnZlcnQgdG8gZW1wdHkuCisgICAgaWYgKFZhbC50ZW1wbGF0ZSBpczxFbHRUeT4oKSkgeworICAgICAgaWYgKEkgPT0gYmVnaW4oKSkKKyAgICAgICAgVmFsID0gKEVsdFR5KW51bGxwdHI7CisgICAgfSBlbHNlIGlmIChWZWNUeSAqVmVjID0gVmFsLnRlbXBsYXRlIGR5bl9jYXN0PFZlY1R5Kj4oKSkgeworICAgICAgLy8gbXVsdGlwbGUgaXRlbXMgaW4gYSB2ZWN0b3I7IGp1c3QgZG8gdGhlIGVyYXNlLCB0aGVyZSBpcyBubworICAgICAgLy8gYmVuZWZpdCB0byBjb2xsYXBzaW5nIGJhY2sgdG8gYSBwb2ludGVyCisgICAgICByZXR1cm4gVmVjLT5lcmFzZShJKTsKKyAgICB9CisgICAgcmV0dXJuIGVuZCgpOworICB9CisKKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgUywgaXRlcmF0b3IgRSkgeworICAgIGFzc2VydChTID49IGJlZ2luKCkgJiYgIlJhbmdlIHRvIGVyYXNlIGlzIG91dCBvZiBib3VuZHMuIik7CisgICAgYXNzZXJ0KFMgPD0gRSAmJiAiVHJ5aW5nIHRvIGVyYXNlIGludmFsaWQgcmFuZ2UuIik7CisgICAgYXNzZXJ0KEUgPD0gZW5kKCkgJiYgIlRyeWluZyB0byBlcmFzZSBwYXN0IHRoZSBlbmQuIik7CisKKyAgICBpZiAoVmFsLnRlbXBsYXRlIGlzPEVsdFR5PigpKSB7CisgICAgICBpZiAoUyA9PSBiZWdpbigpICYmIFMgIT0gRSkKKyAgICAgICAgVmFsID0gKEVsdFR5KW51bGxwdHI7CisgICAgfSBlbHNlIGlmIChWZWNUeSAqVmVjID0gVmFsLnRlbXBsYXRlIGR5bl9jYXN0PFZlY1R5Kj4oKSkgeworICAgICAgcmV0dXJuIFZlYy0+ZXJhc2UoUywgRSk7CisgICAgfQorICAgIHJldHVybiBlbmQoKTsKKyAgfQorCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBJLCBjb25zdCBFbHRUeSAmRWx0KSB7CisgICAgYXNzZXJ0KEkgPj0gdGhpcy0+YmVnaW4oKSAmJiAiSW5zZXJ0aW9uIGl0ZXJhdG9yIGlzIG91dCBvZiBib3VuZHMuIik7CisgICAgYXNzZXJ0KEkgPD0gdGhpcy0+ZW5kKCkgJiYgIkluc2VydGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIHZlY3Rvci4iKTsKKyAgICBpZiAoSSA9PSBlbmQoKSkgeworICAgICAgcHVzaF9iYWNrKEVsdCk7CisgICAgICByZXR1cm4gc3RkOjpwcmV2KGVuZCgpKTsKKyAgICB9CisgICAgYXNzZXJ0KCFWYWwuaXNOdWxsKCkgJiYgIk51bGwgdmFsdWUgd2l0aCBub24tZW5kIGluc2VydCBpdGVyYXRvci4iKTsKKyAgICBpZiAoRWx0VHkgViA9IFZhbC50ZW1wbGF0ZSBkeW5fY2FzdDxFbHRUeT4oKSkgeworICAgICAgYXNzZXJ0KEkgPT0gYmVnaW4oKSk7CisgICAgICBWYWwgPSBFbHQ7CisgICAgICBwdXNoX2JhY2soVik7CisgICAgICByZXR1cm4gYmVnaW4oKTsKKyAgICB9CisKKyAgICByZXR1cm4gVmFsLnRlbXBsYXRlIGdldDxWZWNUeSo+KCktPmluc2VydChJLCBFbHQpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSXRUeT4KKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIEksIEl0VHkgRnJvbSwgSXRUeSBUbykgeworICAgIGFzc2VydChJID49IHRoaXMtPmJlZ2luKCkgJiYgIkluc2VydGlvbiBpdGVyYXRvciBpcyBvdXQgb2YgYm91bmRzLiIpOworICAgIGFzc2VydChJIDw9IHRoaXMtPmVuZCgpICYmICJJbnNlcnRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSB2ZWN0b3IuIik7CisgICAgaWYgKEZyb20gPT0gVG8pCisgICAgICByZXR1cm4gSTsKKworICAgIC8vIElmIHdlIGhhdmUgYSBzaW5nbGUgdmFsdWUsIGNvbnZlcnQgdG8gYSB2ZWN0b3IuCisgICAgcHRyZGlmZl90IE9mZnNldCA9IEkgLSBiZWdpbigpOworICAgIGlmIChWYWwuaXNOdWxsKCkpIHsKKyAgICAgIGlmIChzdGQ6Om5leHQoRnJvbSkgPT0gVG8pIHsKKyAgICAgICAgVmFsID0gKkZyb207CisgICAgICAgIHJldHVybiBiZWdpbigpOworICAgICAgfQorCisgICAgICBWYWwgPSBuZXcgVmVjVHkoKTsKKyAgICB9IGVsc2UgaWYgKEVsdFR5IFYgPSBWYWwudGVtcGxhdGUgZHluX2Nhc3Q8RWx0VHk+KCkpIHsKKyAgICAgIFZhbCA9IG5ldyBWZWNUeSgpOworICAgICAgVmFsLnRlbXBsYXRlIGdldDxWZWNUeSo+KCktPnB1c2hfYmFjayhWKTsKKyAgICB9CisgICAgcmV0dXJuIFZhbC50ZW1wbGF0ZSBnZXQ8VmVjVHkqPigpLT5pbnNlcnQoYmVnaW4oKSArIE9mZnNldCwgRnJvbSwgVG8pOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfVElOWVBUUlZFQ1RPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9UcmlwbGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1RyaXBsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYTUwZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9UcmlwbGUuaApAQCAtMCwwICsxLDgwOSBAQAorLy89PT0tLSBsbHZtL0FEVC9UcmlwbGUuaCAtIFRhcmdldCB0cmlwbGUgaGVscGVyIGNsYXNzIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9UUklQTEVfSAorI2RlZmluZSBMTFZNX0FEVF9UUklQTEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKworLy8gU29tZSBzeXN0ZW0gaGVhZGVycyBvciBHQ0MgcHJlZGVmaW5lZCBtYWNyb3MgY29uZmxpY3Qgd2l0aCBpZGVudGlmaWVycyBpbgorLy8gdGhpcyBmaWxlLiAgVW5kZWZpbmUgdGhlbSBoZXJlLgorI3VuZGVmIE5ldEJTRAorI3VuZGVmIG1pcHMKKyN1bmRlZiBzcGFyYworCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUcmlwbGUgLSBIZWxwZXIgY2xhc3MgZm9yIHdvcmtpbmcgd2l0aCBhdXRvY29uZiBjb25maWd1cmF0aW9uIG5hbWVzLiBGb3IKKy8vLyBoaXN0b3JpY2FsIHJlYXNvbnMsIHdlIGFsc28gY2FsbCB0aGVzZSAndHJpcGxlcycgKHRoZXkgdXNlZCB0byBjb250YWluCisvLy8gZXhhY3RseSB0aHJlZSBmaWVsZHMpLgorLy8vCisvLy8gQ29uZmlndXJhdGlvbiBuYW1lcyBhcmUgc3RyaW5ncyBpbiB0aGUgY2Fub25pY2FsIGZvcm06CisvLy8gICBBUkNISVRFQ1RVUkUtVkVORE9SLU9QRVJBVElOR19TWVNURU0KKy8vLyBvcgorLy8vICAgQVJDSElURUNUVVJFLVZFTkRPUi1PUEVSQVRJTkdfU1lTVEVNLUVOVklST05NRU5UCisvLy8KKy8vLyBUaGlzIGNsYXNzIGlzIHVzZWQgZm9yIGNsaWVudHMgd2hpY2ggd2FudCB0byBzdXBwb3J0IGFyYml0cmFyeQorLy8vIGNvbmZpZ3VyYXRpb24gbmFtZXMsIGJ1dCBhbHNvIHdhbnQgdG8gaW1wbGVtZW50IGNlcnRhaW4gc3BlY2lhbAorLy8vIGJlaGF2aW9yIGZvciBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb25zLiBUaGlzIGNsYXNzIGlzb2xhdGVzIHRoZSBtYXBwaW5nCisvLy8gZnJvbSB0aGUgY29tcG9uZW50cyBvZiB0aGUgY29uZmlndXJhdGlvbiBuYW1lIHRvIHdlbGwga25vd24gSURzLgorLy8vCisvLy8gQXQgaXRzIGNvcmUgdGhlIFRyaXBsZSBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSBhIHdyYXBwZXIgZm9yIGEgdHJpcGxlCisvLy8gc3RyaW5nOyB0aGUgY29uc3RydWN0b3IgZG9lcyBub3QgY2hhbmdlIG9yIG5vcm1hbGl6ZSB0aGUgdHJpcGxlIHN0cmluZy4KKy8vLyBDbGllbnRzIHRoYXQgbmVlZCB0byBoYW5kbGUgdGhlIG5vbi1jYW5vbmljYWwgdHJpcGxlcyB0aGF0IHVzZXJzIG9mdGVuCisvLy8gc3BlY2lmeSBzaG91bGQgdXNlIHRoZSBub3JtYWxpemUgbWV0aG9kLgorLy8vCisvLy8gU2VlIGF1dG9jb25mL2NvbmZpZy5ndWVzcyBmb3IgYSBnbGltcHNlIGludG8gd2hhdCBjb25maWd1cmF0aW9uIG5hbWVzCisvLy8gbG9vayBsaWtlIGluIHByYWN0aWNlLgorY2xhc3MgVHJpcGxlIHsKK3B1YmxpYzoKKyAgZW51bSBBcmNoVHlwZSB7CisgICAgVW5rbm93bkFyY2gsCisKKyAgICBhcm0sICAgICAgICAgICAgLy8gQVJNIChsaXR0bGUgZW5kaWFuKTogYXJtLCBhcm12LiosIHhzY2FsZQorICAgIGFybWViLCAgICAgICAgICAvLyBBUk0gKGJpZyBlbmRpYW4pOiBhcm1lYgorICAgIGFhcmNoNjQsICAgICAgICAvLyBBQXJjaDY0IChsaXR0bGUgZW5kaWFuKTogYWFyY2g2NAorICAgIGFhcmNoNjRfYmUsICAgICAvLyBBQXJjaDY0IChiaWcgZW5kaWFuKTogYWFyY2g2NF9iZQorICAgIGFyYywgICAgICAgICAgICAvLyBBUkM6IFN5bm9wc3lzIEFSQworICAgIGF2ciwgICAgICAgICAgICAvLyBBVlI6IEF0bWVsIEFWUiBtaWNyb2NvbnRyb2xsZXIKKyAgICBicGZlbCwgICAgICAgICAgLy8gZUJQRiBvciBleHRlbmRlZCBCUEYgb3IgNjQtYml0IEJQRiAobGl0dGxlIGVuZGlhbikKKyAgICBicGZlYiwgICAgICAgICAgLy8gZUJQRiBvciBleHRlbmRlZCBCUEYgb3IgNjQtYml0IEJQRiAoYmlnIGVuZGlhbikKKyAgICBoZXhhZ29uLCAgICAgICAgLy8gSGV4YWdvbjogaGV4YWdvbgorICAgIG1pcHMsICAgICAgICAgICAvLyBNSVBTOiBtaXBzLCBtaXBzYWxsZWdyZXgKKyAgICBtaXBzZWwsICAgICAgICAgLy8gTUlQU0VMOiBtaXBzZWwsIG1pcHNhbGxlZ3JleGVsCisgICAgbWlwczY0LCAgICAgICAgIC8vIE1JUFM2NDogbWlwczY0CisgICAgbWlwczY0ZWwsICAgICAgIC8vIE1JUFM2NEVMOiBtaXBzNjRlbAorICAgIG1zcDQzMCwgICAgICAgICAvLyBNU1A0MzA6IG1zcDQzMAorICAgIG5pb3MyLCAgICAgICAgICAvLyBOSU9TSUk6IG5pb3MyCisgICAgcHBjLCAgICAgICAgICAgIC8vIFBQQzogcG93ZXJwYworICAgIHBwYzY0LCAgICAgICAgICAvLyBQUEM2NDogcG93ZXJwYzY0LCBwcHUKKyAgICBwcGM2NGxlLCAgICAgICAgLy8gUFBDNjRMRTogcG93ZXJwYzY0bGUKKyAgICByNjAwLCAgICAgICAgICAgLy8gUjYwMDogQU1EIEdQVXMgSEQyWFhYIC0gSEQ2WFhYCisgICAgYW1kZ2NuLCAgICAgICAgIC8vIEFNREdDTjogQU1EIEdDTiBHUFVzCisgICAgcmlzY3YzMiwgICAgICAgIC8vIFJJU0MtViAoMzItYml0KTogcmlzY3YzMgorICAgIHJpc2N2NjQsICAgICAgICAvLyBSSVNDLVYgKDY0LWJpdCk6IHJpc2N2NjQKKyAgICBzcGFyYywgICAgICAgICAgLy8gU3BhcmM6IHNwYXJjCisgICAgc3BhcmN2OSwgICAgICAgIC8vIFNwYXJjdjk6IFNwYXJjdjkKKyAgICBzcGFyY2VsLCAgICAgICAgLy8gU3BhcmM6IChlbmRpYW5uZXNzID0gbGl0dGxlKS4gTkI6ICdTcGFyY2xlJyBpcyBhIENQVSB2YXJpYW50CisgICAgc3lzdGVteiwgICAgICAgIC8vIFN5c3RlbVo6IHMzOTB4CisgICAgdGNlLCAgICAgICAgICAgIC8vIFRDRSAoaHR0cDovL3RjZS5jcy50dXQuZmkvKTogdGNlCisgICAgdGNlbGUsICAgICAgICAgIC8vIFRDRSBsaXR0bGUgZW5kaWFuIChodHRwOi8vdGNlLmNzLnR1dC5maS8pOiB0Y2VsZQorICAgIHRodW1iLCAgICAgICAgICAvLyBUaHVtYiAobGl0dGxlIGVuZGlhbik6IHRodW1iLCB0aHVtYnYuKgorICAgIHRodW1iZWIsICAgICAgICAvLyBUaHVtYiAoYmlnIGVuZGlhbik6IHRodW1iZWIKKyAgICB4ODYsICAgICAgICAgICAgLy8gWDg2OiBpWzMtOV04NgorICAgIHg4Nl82NCwgICAgICAgICAvLyBYODYtNjQ6IGFtZDY0LCB4ODZfNjQKKyAgICB4Y29yZSwgICAgICAgICAgLy8gWENvcmU6IHhjb3JlCisgICAgbnZwdHgsICAgICAgICAgIC8vIE5WUFRYOiAzMi1iaXQKKyAgICBudnB0eDY0LCAgICAgICAgLy8gTlZQVFg6IDY0LWJpdAorICAgIGxlMzIsICAgICAgICAgICAvLyBsZTMyOiBnZW5lcmljIGxpdHRsZS1lbmRpYW4gMzItYml0IENQVSAoUE5hQ2wpCisgICAgbGU2NCwgICAgICAgICAgIC8vIGxlNjQ6IGdlbmVyaWMgbGl0dGxlLWVuZGlhbiA2NC1iaXQgQ1BVIChQTmFDbCkKKyAgICBhbWRpbCwgICAgICAgICAgLy8gQU1ESUwKKyAgICBhbWRpbDY0LCAgICAgICAgLy8gQU1ESUwgd2l0aCA2NC1iaXQgcG9pbnRlcnMKKyAgICBoc2FpbCwgICAgICAgICAgLy8gQU1EIEhTQUlMCisgICAgaHNhaWw2NCwgICAgICAgIC8vIEFNRCBIU0FJTCB3aXRoIDY0LWJpdCBwb2ludGVycworICAgIHNwaXIsICAgICAgICAgICAvLyBTUElSOiBzdGFuZGFyZCBwb3J0YWJsZSBJUiBmb3IgT3BlbkNMIDMyLWJpdCB2ZXJzaW9uCisgICAgc3BpcjY0LCAgICAgICAgIC8vIFNQSVI6IHN0YW5kYXJkIHBvcnRhYmxlIElSIGZvciBPcGVuQ0wgNjQtYml0IHZlcnNpb24KKyAgICBrYWxpbWJhLCAgICAgICAgLy8gS2FsaW1iYTogZ2VuZXJpYyBrYWxpbWJhCisgICAgc2hhdmUsICAgICAgICAgIC8vIFNIQVZFOiBNb3ZpZGl1cyB2ZWN0b3IgVkxJVyBwcm9jZXNzb3JzCisgICAgbGFuYWksICAgICAgICAgIC8vIExhbmFpOiBMYW5haSAzMi1iaXQKKyAgICB3YXNtMzIsICAgICAgICAgLy8gV2ViQXNzZW1ibHkgd2l0aCAzMi1iaXQgcG9pbnRlcnMKKyAgICB3YXNtNjQsICAgICAgICAgLy8gV2ViQXNzZW1ibHkgd2l0aCA2NC1iaXQgcG9pbnRlcnMKKyAgICByZW5kZXJzY3JpcHQzMiwgLy8gMzItYml0IFJlbmRlclNjcmlwdAorICAgIHJlbmRlcnNjcmlwdDY0LCAvLyA2NC1iaXQgUmVuZGVyU2NyaXB0CisgICAgTGFzdEFyY2hUeXBlID0gcmVuZGVyc2NyaXB0NjQKKyAgfTsKKyAgZW51bSBTdWJBcmNoVHlwZSB7CisgICAgTm9TdWJBcmNoLAorCisgICAgQVJNU3ViQXJjaF92OF8zYSwKKyAgICBBUk1TdWJBcmNoX3Y4XzJhLAorICAgIEFSTVN1YkFyY2hfdjhfMWEsCisgICAgQVJNU3ViQXJjaF92OCwKKyAgICBBUk1TdWJBcmNoX3Y4ciwKKyAgICBBUk1TdWJBcmNoX3Y4bV9iYXNlbGluZSwKKyAgICBBUk1TdWJBcmNoX3Y4bV9tYWlubGluZSwKKyAgICBBUk1TdWJBcmNoX3Y3LAorICAgIEFSTVN1YkFyY2hfdjdlbSwKKyAgICBBUk1TdWJBcmNoX3Y3bSwKKyAgICBBUk1TdWJBcmNoX3Y3cywKKyAgICBBUk1TdWJBcmNoX3Y3aywKKyAgICBBUk1TdWJBcmNoX3Y3dmUsCisgICAgQVJNU3ViQXJjaF92NiwKKyAgICBBUk1TdWJBcmNoX3Y2bSwKKyAgICBBUk1TdWJBcmNoX3Y2aywKKyAgICBBUk1TdWJBcmNoX3Y2dDIsCisgICAgQVJNU3ViQXJjaF92NSwKKyAgICBBUk1TdWJBcmNoX3Y1dGUsCisgICAgQVJNU3ViQXJjaF92NHQsCisKKyAgICBLYWxpbWJhU3ViQXJjaF92MywKKyAgICBLYWxpbWJhU3ViQXJjaF92NCwKKyAgICBLYWxpbWJhU3ViQXJjaF92NQorICB9OworICBlbnVtIFZlbmRvclR5cGUgeworICAgIFVua25vd25WZW5kb3IsCisKKyAgICBBcHBsZSwKKyAgICBQQywKKyAgICBTQ0VJLAorICAgIEJHUCwKKyAgICBCR1EsCisgICAgRnJlZXNjYWxlLAorICAgIElCTSwKKyAgICBJbWFnaW5hdGlvblRlY2hub2xvZ2llcywKKyAgICBNaXBzVGVjaG5vbG9naWVzLAorICAgIE5WSURJQSwKKyAgICBDU1IsCisgICAgTXlyaWFkLAorICAgIEFNRCwKKyAgICBNZXNhLAorICAgIFNVU0UsCisgICAgTGFzdFZlbmRvclR5cGUgPSBTVVNFCisgIH07CisgIGVudW0gT1NUeXBlIHsKKyAgICBVbmtub3duT1MsCisKKyAgICBBbmFuYXMsCisgICAgQ2xvdWRBQkksCisgICAgRGFyd2luLAorICAgIERyYWdvbkZseSwKKyAgICBGcmVlQlNELAorICAgIEZ1Y2hzaWEsCisgICAgSU9TLAorICAgIEtGcmVlQlNELAorICAgIExpbnV4LAorICAgIEx2MiwgICAgICAgIC8vIFBTMworICAgIE1hY09TWCwKKyAgICBOZXRCU0QsCisgICAgT3BlbkJTRCwKKyAgICBTb2xhcmlzLAorICAgIFdpbjMyLAorICAgIEhhaWt1LAorICAgIE1pbml4LAorICAgIFJURU1TLAorICAgIE5hQ2wsICAgICAgIC8vIE5hdGl2ZSBDbGllbnQKKyAgICBDTkssICAgICAgICAvLyBCRy9QIENvbXB1dGUtTm9kZSBLZXJuZWwKKyAgICBBSVgsCisgICAgQ1VEQSwgICAgICAgLy8gTlZJRElBIENVREEKKyAgICBOVkNMLCAgICAgICAvLyBOVklESUEgT3BlbkNMCisgICAgQU1ESFNBLCAgICAgLy8gQU1EIEhTQSBSdW50aW1lCisgICAgUFM0LAorICAgIEVMRklBTUNVLAorICAgIFR2T1MsICAgICAgIC8vIEFwcGxlIHR2T1MKKyAgICBXYXRjaE9TLCAgICAvLyBBcHBsZSB3YXRjaE9TCisgICAgTWVzYTNELAorICAgIENvbnRpa2ksCisgICAgQU1EUEFMLCAgICAgLy8gQU1EIFBBTCBSdW50aW1lCisgICAgTGFzdE9TVHlwZSA9IEFNRFBBTAorICB9OworICBlbnVtIEVudmlyb25tZW50VHlwZSB7CisgICAgVW5rbm93bkVudmlyb25tZW50LAorCisgICAgR05VLAorICAgIEdOVUFCSU4zMiwKKyAgICBHTlVBQkk2NCwKKyAgICBHTlVFQUJJLAorICAgIEdOVUVBQklIRiwKKyAgICBHTlVYMzIsCisgICAgQ09ERTE2LAorICAgIEVBQkksCisgICAgRUFCSUhGLAorICAgIEFuZHJvaWQsCisgICAgTXVzbCwKKyAgICBNdXNsRUFCSSwKKyAgICBNdXNsRUFCSUhGLAorCisgICAgTVNWQywKKyAgICBJdGFuaXVtLAorICAgIEN5Z251cywKKyAgICBDb3JlQ0xSLAorICAgIFNpbXVsYXRvciwgIC8vIFNpbXVsYXRvciB2YXJpYW50cyBvZiBvdGhlciBzeXN0ZW1zLCBlLmcuLCBBcHBsZSdzIGlPUworICAgIExhc3RFbnZpcm9ubWVudFR5cGUgPSBTaW11bGF0b3IKKyAgfTsKKyAgZW51bSBPYmplY3RGb3JtYXRUeXBlIHsKKyAgICBVbmtub3duT2JqZWN0Rm9ybWF0LAorCisgICAgQ09GRiwKKyAgICBFTEYsCisgICAgTWFjaE8sCisgICAgV2FzbSwKKyAgfTsKKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgRGF0YTsKKworICAvLy8gVGhlIHBhcnNlZCBhcmNoIHR5cGUuCisgIEFyY2hUeXBlIEFyY2g7CisKKyAgLy8vIFRoZSBwYXJzZWQgc3ViYXJjaGl0ZWN0dXJlIHR5cGUuCisgIFN1YkFyY2hUeXBlIFN1YkFyY2g7CisKKyAgLy8vIFRoZSBwYXJzZWQgdmVuZG9yIHR5cGUuCisgIFZlbmRvclR5cGUgVmVuZG9yOworCisgIC8vLyBUaGUgcGFyc2VkIE9TIHR5cGUuCisgIE9TVHlwZSBPUzsKKworICAvLy8gVGhlIHBhcnNlZCBFbnZpcm9ubWVudCB0eXBlLgorICBFbnZpcm9ubWVudFR5cGUgRW52aXJvbm1lbnQ7CisKKyAgLy8vIFRoZSBvYmplY3QgZm9ybWF0IHR5cGUuCisgIE9iamVjdEZvcm1hdFR5cGUgT2JqZWN0Rm9ybWF0OworCitwdWJsaWM6CisgIC8vLyBAbmFtZSBDb25zdHJ1Y3RvcnMKKyAgLy8vIEB7CisKKyAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IgaXMgdGhlIHNhbWUgYXMgYW4gZW1wdHkgc3RyaW5nIGFuZCBsZWF2ZXMgYWxsCisgIC8vLyB0cmlwbGUgZmllbGRzIHVua25vd24uCisgIFRyaXBsZSgpCisgICAgICA6IERhdGEoKSwgQXJjaCgpLCBTdWJBcmNoKCksIFZlbmRvcigpLCBPUygpLCBFbnZpcm9ubWVudCgpLAorICAgICAgICBPYmplY3RGb3JtYXQoKSB7fQorCisgIGV4cGxpY2l0IFRyaXBsZShjb25zdCBUd2luZSAmU3RyKTsKKyAgVHJpcGxlKGNvbnN0IFR3aW5lICZBcmNoU3RyLCBjb25zdCBUd2luZSAmVmVuZG9yU3RyLCBjb25zdCBUd2luZSAmT1NTdHIpOworICBUcmlwbGUoY29uc3QgVHdpbmUgJkFyY2hTdHIsIGNvbnN0IFR3aW5lICZWZW5kb3JTdHIsIGNvbnN0IFR3aW5lICZPU1N0ciwKKyAgICAgICAgIGNvbnN0IFR3aW5lICZFbnZpcm9ubWVudFN0cik7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRyaXBsZSAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gQXJjaCA9PSBPdGhlci5BcmNoICYmIFN1YkFyY2ggPT0gT3RoZXIuU3ViQXJjaCAmJgorICAgICAgICAgICBWZW5kb3IgPT0gT3RoZXIuVmVuZG9yICYmIE9TID09IE90aGVyLk9TICYmCisgICAgICAgICAgIEVudmlyb25tZW50ID09IE90aGVyLkVudmlyb25tZW50ICYmCisgICAgICAgICAgIE9iamVjdEZvcm1hdCA9PSBPdGhlci5PYmplY3RGb3JtYXQ7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgVHJpcGxlICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IE90aGVyKTsKKyAgfQorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgTm9ybWFsaXphdGlvbgorICAvLy8gQHsKKworICAvLy8gbm9ybWFsaXplIC0gVHVybiBhbiBhcmJpdHJhcnkgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gdGhlIGNhbm9uaWNhbAorICAvLy8gdHJpcGxlIGZvcm0gKG9yIHNvbWV0aGluZyBzZW5zaWJsZSB0aGF0IHRoZSBUcmlwbGUgY2xhc3MgdW5kZXJzdGFuZHMgaWYKKyAgLy8vIG5vdGhpbmcgYmV0dGVyIGNhbiByZWFzb25hYmx5IGJlIGRvbmUpLiAgSW4gcGFydGljdWxhciwgaXQgaGFuZGxlcyB0aGUKKyAgLy8vIGNvbW1vbiBjYXNlIGluIHdoaWNoIG90aGVyd2lzZSB2YWxpZCBjb21wb25lbnRzIGFyZSBpbiB0aGUgd3Jvbmcgb3JkZXIuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBub3JtYWxpemUoU3RyaW5nUmVmIFN0cik7CisKKyAgLy8vIFJldHVybiB0aGUgbm9ybWFsaXplZCBmb3JtIG9mIHRoaXMgdHJpcGxlJ3Mgc3RyaW5nLgorICBzdGQ6OnN0cmluZyBub3JtYWxpemUoKSBjb25zdCB7IHJldHVybiBub3JtYWxpemUoRGF0YSk7IH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIFR5cGVkIENvbXBvbmVudCBBY2Nlc3MKKyAgLy8vIEB7CisKKyAgLy8vIGdldEFyY2ggLSBHZXQgdGhlIHBhcnNlZCBhcmNoaXRlY3R1cmUgdHlwZSBvZiB0aGlzIHRyaXBsZS4KKyAgQXJjaFR5cGUgZ2V0QXJjaCgpIGNvbnN0IHsgcmV0dXJuIEFyY2g7IH0KKworICAvLy8gZ2V0U3ViQXJjaCAtIGdldCB0aGUgcGFyc2VkIHN1YmFyY2hpdGVjdHVyZSB0eXBlIGZvciB0aGlzIHRyaXBsZS4KKyAgU3ViQXJjaFR5cGUgZ2V0U3ViQXJjaCgpIGNvbnN0IHsgcmV0dXJuIFN1YkFyY2g7IH0KKworICAvLy8gZ2V0VmVuZG9yIC0gR2V0IHRoZSBwYXJzZWQgdmVuZG9yIHR5cGUgb2YgdGhpcyB0cmlwbGUuCisgIFZlbmRvclR5cGUgZ2V0VmVuZG9yKCkgY29uc3QgeyByZXR1cm4gVmVuZG9yOyB9CisKKyAgLy8vIGdldE9TIC0gR2V0IHRoZSBwYXJzZWQgb3BlcmF0aW5nIHN5c3RlbSB0eXBlIG9mIHRoaXMgdHJpcGxlLgorICBPU1R5cGUgZ2V0T1MoKSBjb25zdCB7IHJldHVybiBPUzsgfQorCisgIC8vLyBoYXNFbnZpcm9ubWVudCAtIERvZXMgdGhpcyB0cmlwbGUgaGF2ZSB0aGUgb3B0aW9uYWwgZW52aXJvbm1lbnQKKyAgLy8vIChmb3VydGgpIGNvbXBvbmVudD8KKyAgYm9vbCBoYXNFbnZpcm9ubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RW52aXJvbm1lbnROYW1lKCkgIT0gIiI7CisgIH0KKworICAvLy8gZ2V0RW52aXJvbm1lbnQgLSBHZXQgdGhlIHBhcnNlZCBlbnZpcm9ubWVudCB0eXBlIG9mIHRoaXMgdHJpcGxlLgorICBFbnZpcm9ubWVudFR5cGUgZ2V0RW52aXJvbm1lbnQoKSBjb25zdCB7IHJldHVybiBFbnZpcm9ubWVudDsgfQorCisgIC8vLyBQYXJzZSB0aGUgdmVyc2lvbiBudW1iZXIgZnJvbSB0aGUgT1MgbmFtZSBjb21wb25lbnQgb2YgdGhlCisgIC8vLyB0cmlwbGUsIGlmIHByZXNlbnQuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsICJmb29vczEuMi4zIiB3b3VsZCByZXR1cm4gKDEsIDIsIDMpLgorICAvLy8KKyAgLy8vIElmIGFuIGVudHJ5IGlzIG5vdCBkZWZpbmVkLCBpdCB3aWxsIGJlIHJldHVybmVkIGFzIDAuCisgIHZvaWQgZ2V0RW52aXJvbm1lbnRWZXJzaW9uKHVuc2lnbmVkICZNYWpvciwgdW5zaWduZWQgJk1pbm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTWljcm8pIGNvbnN0OworCisgIC8vLyBnZXRGb3JtYXQgLSBHZXQgdGhlIG9iamVjdCBmb3JtYXQgZm9yIHRoaXMgdHJpcGxlLgorICBPYmplY3RGb3JtYXRUeXBlIGdldE9iamVjdEZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIE9iamVjdEZvcm1hdDsgfQorCisgIC8vLyBnZXRPU1ZlcnNpb24gLSBQYXJzZSB0aGUgdmVyc2lvbiBudW1iZXIgZnJvbSB0aGUgT1MgbmFtZSBjb21wb25lbnQgb2YgdGhlCisgIC8vLyB0cmlwbGUsIGlmIHByZXNlbnQuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsICJmb29vczEuMi4zIiB3b3VsZCByZXR1cm4gKDEsIDIsIDMpLgorICAvLy8KKyAgLy8vIElmIGFuIGVudHJ5IGlzIG5vdCBkZWZpbmVkLCBpdCB3aWxsIGJlIHJldHVybmVkIGFzIDAuCisgIHZvaWQgZ2V0T1NWZXJzaW9uKHVuc2lnbmVkICZNYWpvciwgdW5zaWduZWQgJk1pbm9yLCB1bnNpZ25lZCAmTWljcm8pIGNvbnN0OworCisgIC8vLyBnZXRPU01ham9yVmVyc2lvbiAtIFJldHVybiBqdXN0IHRoZSBtYWpvciB2ZXJzaW9uIG51bWJlciwgdGhpcyBpcworICAvLy8gc3BlY2lhbGl6ZWQgYmVjYXVzZSBpdCBpcyBhIGNvbW1vbiBxdWVyeS4KKyAgdW5zaWduZWQgZ2V0T1NNYWpvclZlcnNpb24oKSBjb25zdCB7CisgICAgdW5zaWduZWQgTWFqLCBNaW4sIE1pY3JvOworICAgIGdldE9TVmVyc2lvbihNYWosIE1pbiwgTWljcm8pOworICAgIHJldHVybiBNYWo7CisgIH0KKworICAvLy8gZ2V0TWFjT1NYVmVyc2lvbiAtIFBhcnNlIHRoZSB2ZXJzaW9uIG51bWJlciBhcyB3aXRoIGdldE9TVmVyc2lvbiBhbmQgdGhlbgorICAvLy8gdHJhbnNsYXRlIGdlbmVyaWMgImRhcndpbiIgdmVyc2lvbnMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgT1MgWCB2ZXJzaW9ucy4KKyAgLy8vIFRoaXMgbWF5IGFsc28gYmUgY2FsbGVkIHdpdGggSU9TIHRyaXBsZXMgYnV0IHRoZSBPUyBYIHZlcnNpb24gbnVtYmVyIGlzCisgIC8vLyBqdXN0IHNldCB0byBhIGNvbnN0YW50IDEwLjQuMCBpbiB0aGF0IGNhc2UuICBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bC4KKyAgYm9vbCBnZXRNYWNPU1hWZXJzaW9uKHVuc2lnbmVkICZNYWpvciwgdW5zaWduZWQgJk1pbm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk1pY3JvKSBjb25zdDsKKworICAvLy8gZ2V0aU9TVmVyc2lvbiAtIFBhcnNlIHRoZSB2ZXJzaW9uIG51bWJlciBhcyB3aXRoIGdldE9TVmVyc2lvbi4gIFRoaXMgc2hvdWxkCisgIC8vLyBvbmx5IGJlIGNhbGxlZCB3aXRoIElPUyBvciBnZW5lcmljIHRyaXBsZXMuCisgIHZvaWQgZ2V0aU9TVmVyc2lvbih1bnNpZ25lZCAmTWFqb3IsIHVuc2lnbmVkICZNaW5vciwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZNaWNybykgY29uc3Q7CisKKyAgLy8vIGdldFdhdGNoT1NWZXJzaW9uIC0gUGFyc2UgdGhlIHZlcnNpb24gbnVtYmVyIGFzIHdpdGggZ2V0T1NWZXJzaW9uLiAgVGhpcworICAvLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdpdGggV2F0Y2hPUyBvciBnZW5lcmljIHRyaXBsZXMuCisgIHZvaWQgZ2V0V2F0Y2hPU1ZlcnNpb24odW5zaWduZWQgJk1ham9yLCB1bnNpZ25lZCAmTWlub3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk1pY3JvKSBjb25zdDsKKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIERpcmVjdCBDb21wb25lbnQgQWNjZXNzCisgIC8vLyBAeworCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIoKSBjb25zdCB7IHJldHVybiBEYXRhOyB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldFRyaXBsZSgpIGNvbnN0IHsgcmV0dXJuIERhdGE7IH0KKworICAvLy8gZ2V0QXJjaE5hbWUgLSBHZXQgdGhlIGFyY2hpdGVjdHVyZSAoZmlyc3QpIGNvbXBvbmVudCBvZiB0aGUKKyAgLy8vIHRyaXBsZS4KKyAgU3RyaW5nUmVmIGdldEFyY2hOYW1lKCkgY29uc3Q7CisKKyAgLy8vIGdldFZlbmRvck5hbWUgLSBHZXQgdGhlIHZlbmRvciAoc2Vjb25kKSBjb21wb25lbnQgb2YgdGhlIHRyaXBsZS4KKyAgU3RyaW5nUmVmIGdldFZlbmRvck5hbWUoKSBjb25zdDsKKworICAvLy8gZ2V0T1NOYW1lIC0gR2V0IHRoZSBvcGVyYXRpbmcgc3lzdGVtICh0aGlyZCkgY29tcG9uZW50IG9mIHRoZQorICAvLy8gdHJpcGxlLgorICBTdHJpbmdSZWYgZ2V0T1NOYW1lKCkgY29uc3Q7CisKKyAgLy8vIGdldEVudmlyb25tZW50TmFtZSAtIEdldCB0aGUgb3B0aW9uYWwgZW52aXJvbm1lbnQgKGZvdXJ0aCkKKyAgLy8vIGNvbXBvbmVudCBvZiB0aGUgdHJpcGxlLCBvciAiIiBpZiBlbXB0eS4KKyAgU3RyaW5nUmVmIGdldEVudmlyb25tZW50TmFtZSgpIGNvbnN0OworCisgIC8vLyBnZXRPU0FuZEVudmlyb25tZW50TmFtZSAtIEdldCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBhbmQgb3B0aW9uYWwKKyAgLy8vIGVudmlyb25tZW50IGNvbXBvbmVudHMgYXMgYSBzaW5nbGUgc3RyaW5nIChzZXBhcmF0ZWQgYnkgYSAnLScKKyAgLy8vIGlmIHRoZSBlbnZpcm9ubWVudCBjb21wb25lbnQgaXMgcHJlc2VudCkuCisgIFN0cmluZ1JlZiBnZXRPU0FuZEVudmlyb25tZW50TmFtZSgpIGNvbnN0OworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgQ29udmVuaWVuY2UgUHJlZGljYXRlcworICAvLy8gQHsKKworICAvLy8gVGVzdCB3aGV0aGVyIHRoZSBhcmNoaXRlY3R1cmUgaXMgNjQtYml0CisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgdGVzdHMgZm9yIDY0LWJpdCBwb2ludGVyIHdpZHRoLCBhbmQgbm90aGluZyBlbHNlLiBOb3RlCisgIC8vLyB0aGF0IHdlIGludGVudGlvbmFsbHkgZXhwb3NlIG9ubHkgdGhyZWUgcHJlZGljYXRlcywgNjQtYml0LCAzMi1iaXQsIGFuZAorICAvLy8gMTYtYml0LiBUaGUgaW5uZXIgZGV0YWlscyBvZiBwb2ludGVyIHdpZHRoIGZvciBwYXJ0aWN1bGFyIGFyY2hpdGVjdHVyZXMKKyAgLy8vIGlzIG5vdCBzdW1tZWQgdXAgaW4gdGhlIHRyaXBsZSwgYW5kIHNvIG9ubHkgYSBjb2Fyc2UgZ3JhaW5lZCBwcmVkaWNhdGUKKyAgLy8vIHN5c3RlbSBpcyBwcm92aWRlZC4KKyAgYm9vbCBpc0FyY2g2NEJpdCgpIGNvbnN0OworCisgIC8vLyBUZXN0IHdoZXRoZXIgdGhlIGFyY2hpdGVjdHVyZSBpcyAzMi1iaXQKKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyB0ZXN0cyBmb3IgMzItYml0IHBvaW50ZXIgd2lkdGgsIGFuZCBub3RoaW5nIGVsc2UuCisgIGJvb2wgaXNBcmNoMzJCaXQoKSBjb25zdDsKKworICAvLy8gVGVzdCB3aGV0aGVyIHRoZSBhcmNoaXRlY3R1cmUgaXMgMTYtYml0CisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgdGVzdHMgZm9yIDE2LWJpdCBwb2ludGVyIHdpZHRoLCBhbmQgbm90aGluZyBlbHNlLgorICBib29sIGlzQXJjaDE2Qml0KCkgY29uc3Q7CisKKyAgLy8vIGlzT1NWZXJzaW9uTFQgLSBIZWxwZXIgZnVuY3Rpb24gZm9yIGRvaW5nIGNvbXBhcmlzb25zIGFnYWluc3QgdmVyc2lvbgorICAvLy8gbnVtYmVycyBpbmNsdWRlZCBpbiB0aGUgdGFyZ2V0IHRyaXBsZS4KKyAgYm9vbCBpc09TVmVyc2lvbkxUKHVuc2lnbmVkIE1ham9yLCB1bnNpZ25lZCBNaW5vciA9IDAsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNaWNybyA9IDApIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBMSFNbM107CisgICAgZ2V0T1NWZXJzaW9uKExIU1swXSwgTEhTWzFdLCBMSFNbMl0pOworCisgICAgaWYgKExIU1swXSAhPSBNYWpvcikKKyAgICAgIHJldHVybiBMSFNbMF0gPCBNYWpvcjsKKyAgICBpZiAoTEhTWzFdICE9IE1pbm9yKQorICAgICAgcmV0dXJuIExIU1sxXSA8IE1pbm9yOworICAgIGlmIChMSFNbMl0gIT0gTWljcm8pCisgICAgICByZXR1cm4gTEhTWzFdIDwgTWljcm87CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIGlzT1NWZXJzaW9uTFQoY29uc3QgVHJpcGxlICZPdGhlcikgY29uc3QgeworICAgIHVuc2lnbmVkIFJIU1szXTsKKyAgICBPdGhlci5nZXRPU1ZlcnNpb24oUkhTWzBdLCBSSFNbMV0sIFJIU1syXSk7CisgICAgcmV0dXJuIGlzT1NWZXJzaW9uTFQoUkhTWzBdLCBSSFNbMV0sIFJIU1syXSk7CisgIH0KKworICAvLy8gaXNNYWNPU1hWZXJzaW9uTFQgLSBDb21wYXJpc29uIGZ1bmN0aW9uIGZvciBjaGVja2luZyBPUyBYIHZlcnNpb24KKyAgLy8vIGNvbXBhdGliaWxpdHksIHdoaWNoIGhhbmRsZXMgc3VwcG9ydGluZyBza2V3ZWQgdmVyc2lvbiBudW1iZXJpbmcgc2NoZW1lcworICAvLy8gdXNlZCBieSB0aGUgImRhcndpbiIgdHJpcGxlcy4KKyAgYm9vbCBpc01hY09TWFZlcnNpb25MVCh1bnNpZ25lZCBNYWpvciwgdW5zaWduZWQgTWlub3IgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1pY3JvID0gMCkgY29uc3QgeworICAgIGFzc2VydChpc01hY09TWCgpICYmICJOb3QgYW4gT1MgWCB0cmlwbGUhIik7CisKKyAgICAvLyBJZiB0aGlzIGlzIE9TIFgsIGV4cGVjdCBhIHNhbmUgdmVyc2lvbiBudW1iZXIuCisgICAgaWYgKGdldE9TKCkgPT0gVHJpcGxlOjpNYWNPU1gpCisgICAgICByZXR1cm4gaXNPU1ZlcnNpb25MVChNYWpvciwgTWlub3IsIE1pY3JvKTsKKworICAgIC8vIE90aGVyd2lzZSwgY29tcGFyZSB0byB0aGUgIkRhcndpbiIgbnVtYmVyLgorICAgIGFzc2VydChNYWpvciA9PSAxMCAmJiAiVW5leHBlY3RlZCBtYWpvciB2ZXJzaW9uIik7CisgICAgcmV0dXJuIGlzT1NWZXJzaW9uTFQoTWlub3IgKyA0LCBNaWNybywgMCk7CisgIH0KKworICAvLy8gaXNNYWNPU1ggLSBJcyB0aGlzIGEgTWFjIE9TIFggdHJpcGxlLiBGb3IgbGVnYWN5IHJlYXNvbnMsIHdlIHN1cHBvcnQgYm90aAorICAvLy8gImRhcndpbiIgYW5kICJvc3giIGFzIE9TIFggdHJpcGxlcy4KKyAgYm9vbCBpc01hY09TWCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T1MoKSA9PSBUcmlwbGU6OkRhcndpbiB8fCBnZXRPUygpID09IFRyaXBsZTo6TWFjT1NYOworICB9CisKKyAgLy8vIElzIHRoaXMgYW4gaU9TIHRyaXBsZS4KKyAgLy8vIE5vdGU6IFRoaXMgaWRlbnRpZmllcyB0dk9TIGFzIGEgdmFyaWFudCBvZiBpT1MuIElmIHRoYXQgZXZlcgorICAvLy8gY2hhbmdlcywgaS5lLiwgaWYgdGhlIHR3byBvcGVyYXRpbmcgc3lzdGVtcyBkaXZlcmdlIG9yIHRoZWlyIHZlcnNpb24KKyAgLy8vIG51bWJlcnMgZ2V0IG91dCBvZiBzeW5jLCB0aGF0IHdpbGwgbmVlZCB0byBiZSBjaGFuZ2VkLgorICAvLy8gd2F0Y2hPUyBoYXMgY29tcGxldGVseSBkaWZmZXJlbnQgdmVyc2lvbiBudW1iZXJzIHNvIGl0IGlzIG5vdCBpbmNsdWRlZC4KKyAgYm9vbCBpc2lPUygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T1MoKSA9PSBUcmlwbGU6OklPUyB8fCBpc1R2T1MoKTsKKyAgfQorCisgIC8vLyBJcyB0aGlzIGFuIEFwcGxlIHR2T1MgdHJpcGxlLgorICBib29sIGlzVHZPUygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T1MoKSA9PSBUcmlwbGU6OlR2T1M7CisgIH0KKworICAvLy8gSXMgdGhpcyBhbiBBcHBsZSB3YXRjaE9TIHRyaXBsZS4KKyAgYm9vbCBpc1dhdGNoT1MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9TKCkgPT0gVHJpcGxlOjpXYXRjaE9TOworICB9CisKKyAgYm9vbCBpc1dhdGNoQUJJKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdWJBcmNoKCkgPT0gVHJpcGxlOjpBUk1TdWJBcmNoX3Y3azsKKyAgfQorCisgIC8vLyBpc09TRGFyd2luIC0gSXMgdGhpcyBhICJEYXJ3aW4iIE9TIChPUyBYLCBpT1MsIG9yIHdhdGNoT1MpLgorICBib29sIGlzT1NEYXJ3aW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGlzTWFjT1NYKCkgfHwgaXNpT1MoKSB8fCBpc1dhdGNoT1MoKTsKKyAgfQorCisgIGJvb2wgaXNTaW11bGF0b3JFbnZpcm9ubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RW52aXJvbm1lbnQoKSA9PSBUcmlwbGU6OlNpbXVsYXRvcjsKKyAgfQorCisgIGJvb2wgaXNPU05ldEJTRCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T1MoKSA9PSBUcmlwbGU6Ok5ldEJTRDsKKyAgfQorCisgIGJvb2wgaXNPU09wZW5CU0QoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9TKCkgPT0gVHJpcGxlOjpPcGVuQlNEOworICB9CisKKyAgYm9vbCBpc09TRnJlZUJTRCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T1MoKSA9PSBUcmlwbGU6OkZyZWVCU0Q7CisgIH0KKworICBib29sIGlzT1NGdWNoc2lhKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6RnVjaHNpYTsKKyAgfQorCisgIGJvb2wgaXNPU0RyYWdvbkZseSgpIGNvbnN0IHsgcmV0dXJuIGdldE9TKCkgPT0gVHJpcGxlOjpEcmFnb25GbHk7IH0KKworICBib29sIGlzT1NTb2xhcmlzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6U29sYXJpczsKKyAgfQorCisgIGJvb2wgaXNPU0lBTUNVKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6RUxGSUFNQ1U7CisgIH0KKworICBib29sIGlzT1NVbmtub3duKCkgY29uc3QgeyByZXR1cm4gZ2V0T1MoKSA9PSBUcmlwbGU6OlVua25vd25PUzsgfQorCisgIGJvb2wgaXNHTlVFbnZpcm9ubWVudCgpIGNvbnN0IHsKKyAgICBFbnZpcm9ubWVudFR5cGUgRW52ID0gZ2V0RW52aXJvbm1lbnQoKTsKKyAgICByZXR1cm4gRW52ID09IFRyaXBsZTo6R05VIHx8IEVudiA9PSBUcmlwbGU6OkdOVUFCSU4zMiB8fAorICAgICAgICAgICBFbnYgPT0gVHJpcGxlOjpHTlVBQkk2NCB8fCBFbnYgPT0gVHJpcGxlOjpHTlVFQUJJIHx8CisgICAgICAgICAgIEVudiA9PSBUcmlwbGU6OkdOVUVBQklIRiB8fCBFbnYgPT0gVHJpcGxlOjpHTlVYMzI7CisgIH0KKworICBib29sIGlzT1NDb250aWtpKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6Q29udGlraTsKKyAgfQorCisgIC8vLyBUZXN0cyB3aGV0aGVyIHRoZSBPUyBpcyBIYWlrdS4KKyAgYm9vbCBpc09TSGFpa3UoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9TKCkgPT0gVHJpcGxlOjpIYWlrdTsKKyAgfQorCisgIC8vLyBDaGVja3MgaWYgdGhlIGVudmlyb25tZW50IGNvdWxkIGJlIE1TVkMuCisgIGJvb2wgaXNXaW5kb3dzTVNWQ0Vudmlyb25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6V2luMzIgJiYKKyAgICAgICAgICAgKGdldEVudmlyb25tZW50KCkgPT0gVHJpcGxlOjpVbmtub3duRW52aXJvbm1lbnQgfHwKKyAgICAgICAgICAgIGdldEVudmlyb25tZW50KCkgPT0gVHJpcGxlOjpNU1ZDKTsKKyAgfQorCisgIC8vLyBDaGVja3MgaWYgdGhlIGVudmlyb25tZW50IGlzIE1TVkMuCisgIGJvb2wgaXNLbm93bldpbmRvd3NNU1ZDRW52aXJvbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9TKCkgPT0gVHJpcGxlOjpXaW4zMiAmJiBnZXRFbnZpcm9ubWVudCgpID09IFRyaXBsZTo6TVNWQzsKKyAgfQorCisgIGJvb2wgaXNXaW5kb3dzQ29yZUNMUkVudmlyb25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6V2luMzIgJiYgZ2V0RW52aXJvbm1lbnQoKSA9PSBUcmlwbGU6OkNvcmVDTFI7CisgIH0KKworICBib29sIGlzV2luZG93c0l0YW5pdW1FbnZpcm9ubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T1MoKSA9PSBUcmlwbGU6OldpbjMyICYmIGdldEVudmlyb25tZW50KCkgPT0gVHJpcGxlOjpJdGFuaXVtOworICB9CisKKyAgYm9vbCBpc1dpbmRvd3NDeWd3aW5FbnZpcm9ubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T1MoKSA9PSBUcmlwbGU6OldpbjMyICYmIGdldEVudmlyb25tZW50KCkgPT0gVHJpcGxlOjpDeWdudXM7CisgIH0KKworICBib29sIGlzV2luZG93c0dOVUVudmlyb25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6V2luMzIgJiYgZ2V0RW52aXJvbm1lbnQoKSA9PSBUcmlwbGU6OkdOVTsKKyAgfQorCisgIC8vLyBUZXN0cyBmb3IgZWl0aGVyIEN5Z3dpbiBvciBNaW5HVyBPUworICBib29sIGlzT1NDeWdNaW5nKCkgY29uc3QgeworICAgIHJldHVybiBpc1dpbmRvd3NDeWd3aW5FbnZpcm9ubWVudCgpIHx8IGlzV2luZG93c0dOVUVudmlyb25tZW50KCk7CisgIH0KKworICAvLy8gSXMgdGhpcyBhICJXaW5kb3dzIiBPUyB0YXJnZXRpbmcgYSAiTVNWQ1JULmRsbCIgZW52aXJvbm1lbnQuCisgIGJvb2wgaXNPU01TVkNSVCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNXaW5kb3dzTVNWQ0Vudmlyb25tZW50KCkgfHwgaXNXaW5kb3dzR05VRW52aXJvbm1lbnQoKSB8fAorICAgICAgICAgICBpc1dpbmRvd3NJdGFuaXVtRW52aXJvbm1lbnQoKTsKKyAgfQorCisgIC8vLyBUZXN0cyB3aGV0aGVyIHRoZSBPUyBpcyBXaW5kb3dzLgorICBib29sIGlzT1NXaW5kb3dzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6V2luMzI7CisgIH0KKworICAvLy8gVGVzdHMgd2hldGhlciB0aGUgT1MgaXMgTmFDbCAoTmF0aXZlIENsaWVudCkKKyAgYm9vbCBpc09TTmFDbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T1MoKSA9PSBUcmlwbGU6Ok5hQ2w7CisgIH0KKworICAvLy8gVGVzdHMgd2hldGhlciB0aGUgT1MgaXMgTGludXguCisgIGJvb2wgaXNPU0xpbnV4KCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6TGludXg7CisgIH0KKworICAvLy8gVGVzdHMgd2hldGhlciB0aGUgT1MgaXMga0ZyZWVCU0QuCisgIGJvb2wgaXNPU0tGcmVlQlNEKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6S0ZyZWVCU0Q7CisgIH0KKworICAvLy8gVGVzdHMgd2hldGhlciB0aGUgT1MgdXNlcyBnbGliYy4KKyAgYm9vbCBpc09TR2xpYmMoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRPUygpID09IFRyaXBsZTo6TGludXggfHwgZ2V0T1MoKSA9PSBUcmlwbGU6OktGcmVlQlNEKSAmJgorICAgICAgICAgICAhaXNBbmRyb2lkKCk7CisgIH0KKworICAvLy8gVGVzdHMgd2hldGhlciB0aGUgT1MgdXNlcyB0aGUgRUxGIGJpbmFyeSBmb3JtYXQuCisgIGJvb2wgaXNPU0JpbkZvcm1hdEVMRigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T2JqZWN0Rm9ybWF0KCkgPT0gVHJpcGxlOjpFTEY7CisgIH0KKworICAvLy8gVGVzdHMgd2hldGhlciB0aGUgT1MgdXNlcyB0aGUgQ09GRiBiaW5hcnkgZm9ybWF0LgorICBib29sIGlzT1NCaW5Gb3JtYXRDT0ZGKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPYmplY3RGb3JtYXQoKSA9PSBUcmlwbGU6OkNPRkY7CisgIH0KKworICAvLy8gVGVzdHMgd2hldGhlciB0aGUgZW52aXJvbm1lbnQgaXMgTWFjaE8uCisgIGJvb2wgaXNPU0JpbkZvcm1hdE1hY2hPKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPYmplY3RGb3JtYXQoKSA9PSBUcmlwbGU6Ok1hY2hPOworICB9CisKKyAgLy8vIFRlc3RzIHdoZXRoZXIgdGhlIE9TIHVzZXMgdGhlIFdhc20gYmluYXJ5IGZvcm1hdC4KKyAgYm9vbCBpc09TQmluRm9ybWF0V2FzbSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T2JqZWN0Rm9ybWF0KCkgPT0gVHJpcGxlOjpXYXNtOworICB9CisKKyAgLy8vIFRlc3RzIHdoZXRoZXIgdGhlIHRhcmdldCBpcyB0aGUgUFM0IENQVQorICBib29sIGlzUFM0Q1BVKCkgY29uc3QgeworICAgIHJldHVybiBnZXRBcmNoKCkgPT0gVHJpcGxlOjp4ODZfNjQgJiYKKyAgICAgICAgICAgZ2V0VmVuZG9yKCkgPT0gVHJpcGxlOjpTQ0VJICYmCisgICAgICAgICAgIGdldE9TKCkgPT0gVHJpcGxlOjpQUzQ7CisgIH0KKworICAvLy8gVGVzdHMgd2hldGhlciB0aGUgdGFyZ2V0IGlzIHRoZSBQUzQgcGxhdGZvcm0KKyAgYm9vbCBpc1BTNCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmVuZG9yKCkgPT0gVHJpcGxlOjpTQ0VJICYmCisgICAgICAgICAgIGdldE9TKCkgPT0gVHJpcGxlOjpQUzQ7CisgIH0KKworICAvLy8gVGVzdHMgd2hldGhlciB0aGUgdGFyZ2V0IGlzIEFuZHJvaWQKKyAgYm9vbCBpc0FuZHJvaWQoKSBjb25zdCB7IHJldHVybiBnZXRFbnZpcm9ubWVudCgpID09IFRyaXBsZTo6QW5kcm9pZDsgfQorCisgIGJvb2wgaXNBbmRyb2lkVmVyc2lvbkxUKHVuc2lnbmVkIE1ham9yKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQW5kcm9pZCgpICYmICJOb3QgYW4gQW5kcm9pZCB0cmlwbGUhIik7CisKKyAgICB1bnNpZ25lZCBFbnZbM107CisgICAgZ2V0RW52aXJvbm1lbnRWZXJzaW9uKEVudlswXSwgRW52WzFdLCBFbnZbMl0pOworCisgICAgLy8gNjQtYml0IHRhcmdldHMgZGlkIG5vdCBleGlzdCBiZWZvcmUgQVBJIGxldmVsIDIxIChMb2xsaXBvcCkuCisgICAgaWYgKGlzQXJjaDY0Qml0KCkgJiYgRW52WzBdIDwgMjEpCisgICAgICBFbnZbMF0gPSAyMTsKKworICAgIHJldHVybiBFbnZbMF0gPCBNYWpvcjsKKyAgfQorCisgIC8vLyBUZXN0cyB3aGV0aGVyIHRoZSBlbnZpcm9ubWVudCBpcyBtdXNsLWxpYmMKKyAgYm9vbCBpc011c2woKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEVudmlyb25tZW50KCkgPT0gVHJpcGxlOjpNdXNsIHx8CisgICAgICAgICAgIGdldEVudmlyb25tZW50KCkgPT0gVHJpcGxlOjpNdXNsRUFCSSB8fAorICAgICAgICAgICBnZXRFbnZpcm9ubWVudCgpID09IFRyaXBsZTo6TXVzbEVBQklIRjsKKyAgfQorCisgIC8vLyBUZXN0cyB3aGV0aGVyIHRoZSB0YXJnZXQgaXMgTlZQVFggKDMyLSBvciA2NC1iaXQpLgorICBib29sIGlzTlZQVFgoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEFyY2goKSA9PSBUcmlwbGU6Om52cHR4IHx8IGdldEFyY2goKSA9PSBUcmlwbGU6Om52cHR4NjQ7CisgIH0KKworICAvLy8gVGVzdHMgd2hldGhlciB0aGUgdGFyZ2V0IGlzIFRodW1iIChsaXR0bGUgYW5kIGJpZyBlbmRpYW4pLgorICBib29sIGlzVGh1bWIoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEFyY2goKSA9PSBUcmlwbGU6OnRodW1iIHx8IGdldEFyY2goKSA9PSBUcmlwbGU6OnRodW1iZWI7CisgIH0KKworICAvLy8gVGVzdHMgd2hldGhlciB0aGUgdGFyZ2V0IGlzIEFSTSAobGl0dGxlIGFuZCBiaWcgZW5kaWFuKS4KKyAgYm9vbCBpc0FSTSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QXJjaCgpID09IFRyaXBsZTo6YXJtIHx8IGdldEFyY2goKSA9PSBUcmlwbGU6OmFybWViOworICB9CisKKyAgLy8vIFRlc3RzIHdoZXRoZXIgdGhlIHRhcmdldCBpcyBBQXJjaDY0IChsaXR0bGUgYW5kIGJpZyBlbmRpYW4pLgorICBib29sIGlzQUFyY2g2NCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QXJjaCgpID09IFRyaXBsZTo6YWFyY2g2NCB8fCBnZXRBcmNoKCkgPT0gVHJpcGxlOjphYXJjaDY0X2JlOworICB9CisKKyAgLy8vIFRlc3RzIHdoZXRoZXIgdGhlIHRhcmdldCBzdXBwb3J0cyBjb21kYXQKKyAgYm9vbCBzdXBwb3J0c0NPTURBVCgpIGNvbnN0IHsKKyAgICByZXR1cm4gIWlzT1NCaW5Gb3JtYXRNYWNoTygpOworICB9CisKKyAgLy8vIFRlc3RzIHdoZXRoZXIgdGhlIHRhcmdldCB1c2VzIGVtdWxhdGVkIFRMUyBhcyBkZWZhdWx0LgorICBib29sIGhhc0RlZmF1bHRFbXVsYXRlZFRMUygpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNBbmRyb2lkKCkgfHwgaXNPU09wZW5CU0QoKSB8fCBpc1dpbmRvd3NDeWd3aW5FbnZpcm9ubWVudCgpOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBNdXRhdG9ycworICAvLy8gQHsKKworICAvLy8gc2V0QXJjaCAtIFNldCB0aGUgYXJjaGl0ZWN0dXJlIChmaXJzdCkgY29tcG9uZW50IG9mIHRoZSB0cmlwbGUKKyAgLy8vIHRvIGEga25vd24gdHlwZS4KKyAgdm9pZCBzZXRBcmNoKEFyY2hUeXBlIEtpbmQpOworCisgIC8vLyBzZXRWZW5kb3IgLSBTZXQgdGhlIHZlbmRvciAoc2Vjb25kKSBjb21wb25lbnQgb2YgdGhlIHRyaXBsZSB0byBhCisgIC8vLyBrbm93biB0eXBlLgorICB2b2lkIHNldFZlbmRvcihWZW5kb3JUeXBlIEtpbmQpOworCisgIC8vLyBzZXRPUyAtIFNldCB0aGUgb3BlcmF0aW5nIHN5c3RlbSAodGhpcmQpIGNvbXBvbmVudCBvZiB0aGUgdHJpcGxlCisgIC8vLyB0byBhIGtub3duIHR5cGUuCisgIHZvaWQgc2V0T1MoT1NUeXBlIEtpbmQpOworCisgIC8vLyBzZXRFbnZpcm9ubWVudCAtIFNldCB0aGUgZW52aXJvbm1lbnQgKGZvdXJ0aCkgY29tcG9uZW50IG9mIHRoZSB0cmlwbGUKKyAgLy8vIHRvIGEga25vd24gdHlwZS4KKyAgdm9pZCBzZXRFbnZpcm9ubWVudChFbnZpcm9ubWVudFR5cGUgS2luZCk7CisKKyAgLy8vIHNldE9iamVjdEZvcm1hdCAtIFNldCB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0CisgIHZvaWQgc2V0T2JqZWN0Rm9ybWF0KE9iamVjdEZvcm1hdFR5cGUgS2luZCk7CisKKyAgLy8vIHNldFRyaXBsZSAtIFNldCBhbGwgY29tcG9uZW50cyB0byB0aGUgbmV3IHRyaXBsZSBccCBTdHIuCisgIHZvaWQgc2V0VHJpcGxlKGNvbnN0IFR3aW5lICZTdHIpOworCisgIC8vLyBzZXRBcmNoTmFtZSAtIFNldCB0aGUgYXJjaGl0ZWN0dXJlIChmaXJzdCkgY29tcG9uZW50IG9mIHRoZQorICAvLy8gdHJpcGxlIGJ5IG5hbWUuCisgIHZvaWQgc2V0QXJjaE5hbWUoU3RyaW5nUmVmIFN0cik7CisKKyAgLy8vIHNldFZlbmRvck5hbWUgLSBTZXQgdGhlIHZlbmRvciAoc2Vjb25kKSBjb21wb25lbnQgb2YgdGhlIHRyaXBsZQorICAvLy8gYnkgbmFtZS4KKyAgdm9pZCBzZXRWZW5kb3JOYW1lKFN0cmluZ1JlZiBTdHIpOworCisgIC8vLyBzZXRPU05hbWUgLSBTZXQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gKHRoaXJkKSBjb21wb25lbnQgb2YgdGhlCisgIC8vLyB0cmlwbGUgYnkgbmFtZS4KKyAgdm9pZCBzZXRPU05hbWUoU3RyaW5nUmVmIFN0cik7CisKKyAgLy8vIHNldEVudmlyb25tZW50TmFtZSAtIFNldCB0aGUgb3B0aW9uYWwgZW52aXJvbm1lbnQgKGZvdXJ0aCkKKyAgLy8vIGNvbXBvbmVudCBvZiB0aGUgdHJpcGxlIGJ5IG5hbWUuCisgIHZvaWQgc2V0RW52aXJvbm1lbnROYW1lKFN0cmluZ1JlZiBTdHIpOworCisgIC8vLyBzZXRPU0FuZEVudmlyb25tZW50TmFtZSAtIFNldCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBhbmQgb3B0aW9uYWwKKyAgLy8vIGVudmlyb25tZW50IGNvbXBvbmVudHMgd2l0aCBhIHNpbmdsZSBzdHJpbmcuCisgIHZvaWQgc2V0T1NBbmRFbnZpcm9ubWVudE5hbWUoU3RyaW5nUmVmIFN0cik7CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBIZWxwZXJzIHRvIGJ1aWxkIHZhcmlhbnRzIG9mIGEgcGFydGljdWxhciB0cmlwbGUuCisgIC8vLyBAeworCisgIC8vLyBGb3JtIGEgdHJpcGxlIHdpdGggYSAzMi1iaXQgdmFyaWFudCBvZiB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUuCisgIC8vLworICAvLy8gVGhpcyBjYW4gYmUgdXNlZCB0byBtb3ZlIGFjcm9zcyAiZmFtaWxpZXMiIG9mIGFyY2hpdGVjdHVyZXMgd2hlcmUgdXNlZnVsLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIEEgbmV3IHRyaXBsZSB3aXRoIGEgMzItYml0IGFyY2hpdGVjdHVyZSBvciBhbiB1bmtub3duCisgIC8vLyAgICAgICAgICBhcmNoaXRlY3R1cmUgaWYgbm8gc3VjaCB2YXJpYW50IGNhbiBiZSBmb3VuZC4KKyAgbGx2bTo6VHJpcGxlIGdldDMyQml0QXJjaFZhcmlhbnQoKSBjb25zdDsKKworICAvLy8gRm9ybSBhIHRyaXBsZSB3aXRoIGEgNjQtYml0IHZhcmlhbnQgb2YgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlLgorICAvLy8KKyAgLy8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gbW92ZSBhY3Jvc3MgImZhbWlsaWVzIiBvZiBhcmNoaXRlY3R1cmVzIHdoZXJlIHVzZWZ1bC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBBIG5ldyB0cmlwbGUgd2l0aCBhIDY0LWJpdCBhcmNoaXRlY3R1cmUgb3IgYW4gdW5rbm93bgorICAvLy8gICAgICAgICAgYXJjaGl0ZWN0dXJlIGlmIG5vIHN1Y2ggdmFyaWFudCBjYW4gYmUgZm91bmQuCisgIGxsdm06OlRyaXBsZSBnZXQ2NEJpdEFyY2hWYXJpYW50KCkgY29uc3Q7CisKKyAgLy8vIEZvcm0gYSB0cmlwbGUgd2l0aCBhIGJpZyBlbmRpYW4gdmFyaWFudCBvZiB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUuCisgIC8vLworICAvLy8gVGhpcyBjYW4gYmUgdXNlZCB0byBtb3ZlIGFjcm9zcyAiZmFtaWxpZXMiIG9mIGFyY2hpdGVjdHVyZXMgd2hlcmUgdXNlZnVsLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIEEgbmV3IHRyaXBsZSB3aXRoIGEgYmlnIGVuZGlhbiBhcmNoaXRlY3R1cmUgb3IgYW4gdW5rbm93bgorICAvLy8gICAgICAgICAgYXJjaGl0ZWN0dXJlIGlmIG5vIHN1Y2ggdmFyaWFudCBjYW4gYmUgZm91bmQuCisgIGxsdm06OlRyaXBsZSBnZXRCaWdFbmRpYW5BcmNoVmFyaWFudCgpIGNvbnN0OworCisgIC8vLyBGb3JtIGEgdHJpcGxlIHdpdGggYSBsaXR0bGUgZW5kaWFuIHZhcmlhbnQgb2YgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlLgorICAvLy8KKyAgLy8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gbW92ZSBhY3Jvc3MgImZhbWlsaWVzIiBvZiBhcmNoaXRlY3R1cmVzIHdoZXJlIHVzZWZ1bC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBBIG5ldyB0cmlwbGUgd2l0aCBhIGxpdHRsZSBlbmRpYW4gYXJjaGl0ZWN0dXJlIG9yIGFuIHVua25vd24KKyAgLy8vICAgICAgICAgIGFyY2hpdGVjdHVyZSBpZiBubyBzdWNoIHZhcmlhbnQgY2FuIGJlIGZvdW5kLgorICBsbHZtOjpUcmlwbGUgZ2V0TGl0dGxlRW5kaWFuQXJjaFZhcmlhbnQoKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSAoTExWTSkgbmFtZSBvZiB0aGUgbWluaW11bSBBUk0gQ1BVIGZvciB0aGUgYXJjaCB3ZSBhcmUgdGFyZ2V0aW5nLgorICAvLy8KKyAgLy8vIFxwYXJhbSBBcmNoIHRoZSBhcmNoaXRlY3R1cmUgbmFtZSAoZS5nLiwgImFybXY3cyIpLiBJZiBpdCBpcyBhbiBlbXB0eQorICAvLy8gc3RyaW5nIHRoZW4gdGhlIHRyaXBsZSdzIGFyY2ggbmFtZSBpcyB1c2VkLgorICBTdHJpbmdSZWYgZ2V0QVJNQ1BVRm9yQXJjaChTdHJpbmdSZWYgQXJjaCA9IFN0cmluZ1JlZigpKSBjb25zdDsKKworICAvLy8gVGVzdHMgd2hldGhlciB0aGUgdGFyZ2V0IHRyaXBsZSBpcyBsaXR0bGUgZW5kaWFuLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlIHRyaXBsZSBpcyBsaXR0bGUgZW5kaWFuLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgaXNMaXR0bGVFbmRpYW4oKSBjb25zdDsKKworICAvLy8gVGVzdCB3aGV0aGVyIHRhcmdldCB0cmlwbGVzIGFyZSBjb21wYXRpYmxlLgorICBib29sIGlzQ29tcGF0aWJsZVdpdGgoY29uc3QgVHJpcGxlICZPdGhlcikgY29uc3Q7CisKKyAgLy8vIE1lcmdlIHRhcmdldCB0cmlwbGVzLgorICBzdGQ6OnN0cmluZyBtZXJnZShjb25zdCBUcmlwbGUgJk90aGVyKSBjb25zdDsKKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIFN0YXRpYyBoZWxwZXJzIGZvciBJRHMuCisgIC8vLyBAeworCisgIC8vLyBnZXRBcmNoVHlwZU5hbWUgLSBHZXQgdGhlIGNhbm9uaWNhbCBuYW1lIGZvciB0aGUgXHAgS2luZCBhcmNoaXRlY3R1cmUuCisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0QXJjaFR5cGVOYW1lKEFyY2hUeXBlIEtpbmQpOworCisgIC8vLyBnZXRBcmNoVHlwZVByZWZpeCAtIEdldCB0aGUgInByZWZpeCIgY2Fub25pY2FsIG5hbWUgZm9yIHRoZSBccCBLaW5kCisgIC8vLyBhcmNoaXRlY3R1cmUuIFRoaXMgaXMgdGhlIHByZWZpeCB1c2VkIGJ5IHRoZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMKKyAgLy8vIGJ1aWx0aW5zLCBhbmQgaXMgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gXHNlZQorICAvLy8gSW50cmluc2ljOjpnZXRJbnRyaW5zaWNGb3JHQ0NCdWlsdGluKCkuCisgIC8vLworICAvLy8gXHJldHVybiAtIFRoZSBhcmNoaXRlY3R1cmUgcHJlZml4LCBvciAwIGlmIG5vbmUgaXMgZGVmaW5lZC4KKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRBcmNoVHlwZVByZWZpeChBcmNoVHlwZSBLaW5kKTsKKworICAvLy8gZ2V0VmVuZG9yVHlwZU5hbWUgLSBHZXQgdGhlIGNhbm9uaWNhbCBuYW1lIGZvciB0aGUgXHAgS2luZCB2ZW5kb3IuCisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0VmVuZG9yVHlwZU5hbWUoVmVuZG9yVHlwZSBLaW5kKTsKKworICAvLy8gZ2V0T1NUeXBlTmFtZSAtIEdldCB0aGUgY2Fub25pY2FsIG5hbWUgZm9yIHRoZSBccCBLaW5kIG9wZXJhdGluZyBzeXN0ZW0uCisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0T1NUeXBlTmFtZShPU1R5cGUgS2luZCk7CisKKyAgLy8vIGdldEVudmlyb25tZW50VHlwZU5hbWUgLSBHZXQgdGhlIGNhbm9uaWNhbCBuYW1lIGZvciB0aGUgXHAgS2luZAorICAvLy8gZW52aXJvbm1lbnQuCisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0RW52aXJvbm1lbnRUeXBlTmFtZShFbnZpcm9ubWVudFR5cGUgS2luZCk7CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBTdGF0aWMgaGVscGVycyBmb3IgY29udmVydGluZyBhbHRlcm5hdGUgYXJjaGl0ZWN0dXJlIG5hbWVzLgorICAvLy8gQHsKKworICAvLy8gZ2V0QXJjaFR5cGVGb3JMTFZNTmFtZSAtIFRoZSBjYW5vbmljYWwgdHlwZSBmb3IgdGhlIGdpdmVuIExMVk0KKyAgLy8vIGFyY2hpdGVjdHVyZSBuYW1lIChlLmcuLCAieDg2IikuCisgIHN0YXRpYyBBcmNoVHlwZSBnZXRBcmNoVHlwZUZvckxMVk1OYW1lKFN0cmluZ1JlZiBTdHIpOworCisgIC8vLyBAfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1R3aW5lLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Ud2luZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MGZkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Ud2luZS5oCkBAIC0wLDAgKzEsNTQyIEBACisvLz09PS0gVHdpbmUuaCAtIEZhc3QgVGVtcG9yYXJ5IFN0cmluZyBDb25jYXRlbmF0aW9uIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1RXSU5FX0gKKyNkZWZpbmUgTExWTV9BRFRfVFdJTkVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBmb3JtYXR2X29iamVjdF9iYXNlOworICBjbGFzcyByYXdfb3N0cmVhbTsKKworICAvLy8gVHdpbmUgLSBBIGxpZ2h0d2VpZ2h0IGRhdGEgc3RydWN0dXJlIGZvciBlZmZpY2llbnRseSByZXByZXNlbnRpbmcgdGhlCisgIC8vLyBjb25jYXRlbmF0aW9uIG9mIHRlbXBvcmFyeSB2YWx1ZXMgYXMgc3RyaW5ncy4KKyAgLy8vCisgIC8vLyBBIFR3aW5lIGlzIGEga2luZCBvZiByb3BlLCBpdCByZXByZXNlbnRzIGEgY29uY2F0ZW5hdGVkIHN0cmluZyB1c2luZyBhCisgIC8vLyBiaW5hcnktdHJlZSwgd2hlcmUgdGhlIHN0cmluZyBpcyB0aGUgcHJlb3JkZXIgb2YgdGhlIG5vZGVzLiBTaW5jZSB0aGUKKyAgLy8vIFR3aW5lIGNhbiBiZSBlZmZpY2llbnRseSByZW5kZXJlZCBpbnRvIGEgYnVmZmVyIHdoZW4gaXRzIHJlc3VsdCBpcyB1c2VkLAorICAvLy8gaXQgYXZvaWRzIHRoZSBjb3N0IG9mIGdlbmVyYXRpbmcgdGVtcG9yYXJ5IHZhbHVlcyBmb3IgaW50ZXJtZWRpYXRlIHN0cmluZworICAvLy8gcmVzdWx0cyAtLSBwYXJ0aWN1bGFybHkgaW4gY2FzZXMgd2hlbiB0aGUgVHdpbmUgcmVzdWx0IGlzIG5ldmVyCisgIC8vLyByZXF1aXJlZC4gQnkgZXhwbGljaXRseSB0cmFja2luZyB0aGUgdHlwZSBvZiBsZWFmIG5vZGVzLCB3ZSBjYW4gYWxzbyBhdm9pZAorICAvLy8gdGhlIGNyZWF0aW9uIG9mIHRlbXBvcmFyeSBzdHJpbmdzIGZvciBjb252ZXJzaW9ucyBvcGVyYXRpb25zIChzdWNoIGFzCisgIC8vLyBhcHBlbmRpbmcgYW4gaW50ZWdlciB0byBhIHN0cmluZykuCisgIC8vLworICAvLy8gQSBUd2luZSBpcyBub3QgaW50ZW5kZWQgZm9yIHVzZSBkaXJlY3RseSBhbmQgc2hvdWxkIG5vdCBiZSBzdG9yZWQsIGl0cworICAvLy8gaW1wbGVtZW50YXRpb24gcmVsaWVzIG9uIHRoZSBhYmlsaXR5IHRvIHN0b3JlIHBvaW50ZXJzIHRvIHRlbXBvcmFyeSBzdGFjaworICAvLy8gb2JqZWN0cyB3aGljaCBtYXkgYmUgZGVhbGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiBhIHN0YXRlbWVudC4gVHdpbmVzIHNob3VsZAorICAvLy8gb25seSBiZSB1c2VkIGFjY2VwdGVkIGFzIGNvbnN0IHJlZmVyZW5jZXMgaW4gYXJndW1lbnRzLCB3aGVuIGFuIEFQSSB3aXNoZXMKKyAgLy8vIHRvIGFjY2VwdCBwb3NzaWJseS1jb25jYXRlbmF0ZWQgc3RyaW5ncy4KKyAgLy8vCisgIC8vLyBUd2luZXMgc3VwcG9ydCBhIHNwZWNpYWwgJ251bGwnIHZhbHVlLCB3aGljaCBhbHdheXMgY29uY2F0ZW5hdGVzIHRvIGZvcm0KKyAgLy8vIGl0c2VsZiwgYW5kIHJlbmRlcnMgYXMgYW4gZW1wdHkgc3RyaW5nLiBUaGlzIGNhbiBiZSByZXR1cm5lZCBmcm9tIEFQSXMgdG8KKyAgLy8vIGVmZmVjdGl2ZWx5IG51bGxpZnkgYW55IGNvbmNhdGVuYXRpb25zIHBlcmZvcm1lZCBvbiB0aGUgcmVzdWx0LgorICAvLy8KKyAgLy8vIFxiIEltcGxlbWVudGF0aW9uCisgIC8vLworICAvLy8gR2l2ZW4gdGhlIG5hdHVyZSBvZiBhIFR3aW5lLCBpdCBpcyBub3QgcG9zc2libGUgZm9yIHRoZSBUd2luZSdzCisgIC8vLyBjb25jYXRlbmF0aW9uIG1ldGhvZCB0byBjb25zdHJ1Y3QgaW50ZXJpb3Igbm9kZXM7IHRoZSByZXN1bHQgbXVzdCBiZQorICAvLy8gcmVwcmVzZW50ZWQgaW5zaWRlIHRoZSByZXR1cm5lZCB2YWx1ZS4gRm9yIHRoaXMgcmVhc29uIGEgVHdpbmUgb2JqZWN0CisgIC8vLyBhY3R1YWxseSBob2xkcyB0d28gdmFsdWVzLCB0aGUgbGVmdC0gYW5kIHJpZ2h0LWhhbmQgc2lkZXMgb2YgYQorICAvLy8gY29uY2F0ZW5hdGlvbi4gV2UgYWxzbyBoYXZlIG51bGxhcnkgVHdpbmUgb2JqZWN0cywgd2hpY2ggYXJlIGVmZmVjdGl2ZWx5CisgIC8vLyBzZW50aW5lbCB2YWx1ZXMgdGhhdCByZXByZXNlbnQgZW1wdHkgc3RyaW5ncy4KKyAgLy8vCisgIC8vLyBUaHVzLCBhIFR3aW5lIGNhbiBlZmZlY3RpdmVseSBoYXZlIHplcm8sIG9uZSwgb3IgdHdvIGNoaWxkcmVuLiBUaGUgXHNlZQorICAvLy8gaXNOdWxsYXJ5KCksIFxzZWUgaXNVbmFyeSgpLCBhbmQgXHNlZSBpc0JpbmFyeSgpIHByZWRpY2F0ZXMgZXhpc3QgZm9yCisgIC8vLyB0ZXN0aW5nIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4uCisgIC8vLworICAvLy8gV2UgbWFpbnRhaW4gYSBudW1iZXIgb2YgaW52YXJpYW50cyBvbiBUd2luZSBvYmplY3RzIChGSVhNRTogV2h5KToKKyAgLy8vICAtIE51bGxhcnkgdHdpbmVzIGFyZSBhbHdheXMgcmVwcmVzZW50ZWQgd2l0aCB0aGVpciBLaW5kIG9uIHRoZSBsZWZ0LWhhbmQKKyAgLy8vICAgIHNpZGUsIGFuZCB0aGUgRW1wdHkga2luZCBvbiB0aGUgcmlnaHQtaGFuZCBzaWRlLgorICAvLy8gIC0gVW5hcnkgdHdpbmVzIGFyZSBhbHdheXMgcmVwcmVzZW50ZWQgd2l0aCB0aGUgdmFsdWUgb24gdGhlIGxlZnQtaGFuZAorICAvLy8gICAgc2lkZSwgYW5kIHRoZSBFbXB0eSBraW5kIG9uIHRoZSByaWdodC1oYW5kIHNpZGUuCisgIC8vLyAgLSBJZiBhIFR3aW5lIGhhcyBhbm90aGVyIFR3aW5lIGFzIGEgY2hpbGQsIHRoYXQgY2hpbGQgc2hvdWxkIGFsd2F5cyBiZQorICAvLy8gICAgYmluYXJ5IChvdGhlcndpc2UgaXQgY291bGQgaGF2ZSBiZWVuIGZvbGRlZCBpbnRvIHRoZSBwYXJlbnQpLgorICAvLy8KKyAgLy8vIFRoZXNlIGludmFyaWFudHMgYXJlIGNoZWNrIGJ5IFxzZWUgaXNWYWxpZCgpLgorICAvLy8KKyAgLy8vIFxiIEVmZmljaWVuY3kgQ29uc2lkZXJhdGlvbnMKKyAgLy8vCisgIC8vLyBUaGUgVHdpbmUgaXMgZGVzaWduZWQgdG8geWllbGQgZWZmaWNpZW50IGFuZCBzbWFsbCBjb2RlIGZvciBjb21tb24KKyAgLy8vIHNpdHVhdGlvbnMuIEZvciB0aGlzIHJlYXNvbiwgdGhlIGNvbmNhdCgpIG1ldGhvZCBpcyBpbmxpbmVkIHNvIHRoYXQKKyAgLy8vIGNvbmNhdGVuYXRpb25zIG9mIGxlYWYgbm9kZXMgY2FuIGJlIG9wdGltaXplZCBpbnRvIHN0b3JlcyBkaXJlY3RseSBpbnRvIGEKKyAgLy8vIHNpbmdsZSBzdGFjayBhbGxvY2F0ZWQgb2JqZWN0LgorICAvLy8KKyAgLy8vIEluIHByYWN0aWNlLCBub3QgYWxsIGNvbXBpbGVycyBjYW4gYmUgdHJ1c3RlZCB0byBvcHRpbWl6ZSBjb25jYXQoKSBmdWxseSwKKyAgLy8vIHNvIHdlIHByb3ZpZGUgdHdvIGFkZGl0aW9uYWwgbWV0aG9kcyAoYW5kIGFjY29tcGFueWluZyBvcGVyYXRvcisKKyAgLy8vIG92ZXJsb2FkcykgdG8gZ3VhcmFudGVlIHRoYXQgcGFydGljdWxhcmx5IGltcG9ydGFudCBjYXNlcyAoY3N0cmluZyBwbHVzCisgIC8vLyBTdHJpbmdSZWYpIGNvZGVnZW4gYXMgZGVzaXJlZC4KKyAgY2xhc3MgVHdpbmUgeworICAgIC8vLyBOb2RlS2luZCAtIFJlcHJlc2VudCB0aGUgdHlwZSBvZiBhbiBhcmd1bWVudC4KKyAgICBlbnVtIE5vZGVLaW5kIDogdW5zaWduZWQgY2hhciB7CisgICAgICAvLy8gQW4gZW1wdHkgc3RyaW5nOyB0aGUgcmVzdWx0IG9mIGNvbmNhdGVuYXRpbmcgYW55dGhpbmcgd2l0aCBpdCBpcyBhbHNvCisgICAgICAvLy8gZW1wdHkuCisgICAgICBOdWxsS2luZCwKKworICAgICAgLy8vIFRoZSBlbXB0eSBzdHJpbmcuCisgICAgICBFbXB0eUtpbmQsCisKKyAgICAgIC8vLyBBIHBvaW50ZXIgdG8gYSBUd2luZSBpbnN0YW5jZS4KKyAgICAgIFR3aW5lS2luZCwKKworICAgICAgLy8vIEEgcG9pbnRlciB0byBhIEMgc3RyaW5nIGluc3RhbmNlLgorICAgICAgQ1N0cmluZ0tpbmQsCisKKyAgICAgIC8vLyBBIHBvaW50ZXIgdG8gYW4gc3RkOjpzdHJpbmcgaW5zdGFuY2UuCisgICAgICBTdGRTdHJpbmdLaW5kLAorCisgICAgICAvLy8gQSBwb2ludGVyIHRvIGEgU3RyaW5nUmVmIGluc3RhbmNlLgorICAgICAgU3RyaW5nUmVmS2luZCwKKworICAgICAgLy8vIEEgcG9pbnRlciB0byBhIFNtYWxsU3RyaW5nIGluc3RhbmNlLgorICAgICAgU21hbGxTdHJpbmdLaW5kLAorCisgICAgICAvLy8gQSBwb2ludGVyIHRvIGEgZm9ybWF0dl9vYmplY3RfYmFzZSBpbnN0YW5jZS4KKyAgICAgIEZvcm1hdHZPYmplY3RLaW5kLAorCisgICAgICAvLy8gQSBjaGFyIHZhbHVlLCB0byByZW5kZXIgYXMgYSBjaGFyYWN0ZXIuCisgICAgICBDaGFyS2luZCwKKworICAgICAgLy8vIEFuIHVuc2lnbmVkIGludCB2YWx1ZSwgdG8gcmVuZGVyIGFzIGFuIHVuc2lnbmVkIGRlY2ltYWwgaW50ZWdlci4KKyAgICAgIERlY1VJS2luZCwKKworICAgICAgLy8vIEFuIGludCB2YWx1ZSwgdG8gcmVuZGVyIGFzIGEgc2lnbmVkIGRlY2ltYWwgaW50ZWdlci4KKyAgICAgIERlY0lLaW5kLAorCisgICAgICAvLy8gQSBwb2ludGVyIHRvIGFuIHVuc2lnbmVkIGxvbmcgdmFsdWUsIHRvIHJlbmRlciBhcyBhbiB1bnNpZ25lZCBkZWNpbWFsCisgICAgICAvLy8gaW50ZWdlci4KKyAgICAgIERlY1VMS2luZCwKKworICAgICAgLy8vIEEgcG9pbnRlciB0byBhIGxvbmcgdmFsdWUsIHRvIHJlbmRlciBhcyBhIHNpZ25lZCBkZWNpbWFsIGludGVnZXIuCisgICAgICBEZWNMS2luZCwKKworICAgICAgLy8vIEEgcG9pbnRlciB0byBhbiB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUsIHRvIHJlbmRlciBhcyBhbiB1bnNpZ25lZAorICAgICAgLy8vIGRlY2ltYWwgaW50ZWdlci4KKyAgICAgIERlY1VMTEtpbmQsCisKKyAgICAgIC8vLyBBIHBvaW50ZXIgdG8gYSBsb25nIGxvbmcgdmFsdWUsIHRvIHJlbmRlciBhcyBhIHNpZ25lZCBkZWNpbWFsIGludGVnZXIuCisgICAgICBEZWNMTEtpbmQsCisKKyAgICAgIC8vLyBBIHBvaW50ZXIgdG8gYSB1aW50NjRfdCB2YWx1ZSwgdG8gcmVuZGVyIGFzIGFuIHVuc2lnbmVkIGhleGFkZWNpbWFsCisgICAgICAvLy8gaW50ZWdlci4KKyAgICAgIFVIZXhLaW5kCisgICAgfTsKKworICAgIHVuaW9uIENoaWxkCisgICAgeworICAgICAgY29uc3QgVHdpbmUgKnR3aW5lOworICAgICAgY29uc3QgY2hhciAqY1N0cmluZzsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICpzdGRTdHJpbmc7CisgICAgICBjb25zdCBTdHJpbmdSZWYgKnN0cmluZ1JlZjsKKyAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAqc21hbGxTdHJpbmc7CisgICAgICBjb25zdCBmb3JtYXR2X29iamVjdF9iYXNlICpmb3JtYXR2T2JqZWN0OworICAgICAgY2hhciBjaGFyYWN0ZXI7CisgICAgICB1bnNpZ25lZCBpbnQgZGVjVUk7CisgICAgICBpbnQgZGVjSTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmRlY1VMOworICAgICAgY29uc3QgbG9uZyAqZGVjTDsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqZGVjVUxMOworICAgICAgY29uc3QgbG9uZyBsb25nICpkZWNMTDsKKyAgICAgIGNvbnN0IHVpbnQ2NF90ICp1SGV4OworICAgIH07CisKKyAgICAvLy8gTEhTIC0gVGhlIHByZWZpeCBpbiB0aGUgY29uY2F0ZW5hdGlvbiwgd2hpY2ggbWF5IGJlIHVuaW5pdGlhbGl6ZWQgZm9yCisgICAgLy8vIE51bGwgb3IgRW1wdHkga2luZHMuCisgICAgQ2hpbGQgTEhTOworCisgICAgLy8vIFJIUyAtIFRoZSBzdWZmaXggaW4gdGhlIGNvbmNhdGVuYXRpb24sIHdoaWNoIG1heSBiZSB1bmluaXRpYWxpemVkIGZvcgorICAgIC8vLyBOdWxsIG9yIEVtcHR5IGtpbmRzLgorICAgIENoaWxkIFJIUzsKKworICAgIC8vLyBMSFNLaW5kIC0gVGhlIE5vZGVLaW5kIG9mIHRoZSBsZWZ0IGhhbmQgc2lkZSwgXHNlZSBnZXRMSFNLaW5kKCkuCisgICAgTm9kZUtpbmQgTEhTS2luZCA9IEVtcHR5S2luZDsKKworICAgIC8vLyBSSFNLaW5kIC0gVGhlIE5vZGVLaW5kIG9mIHRoZSByaWdodCBoYW5kIHNpZGUsIFxzZWUgZ2V0UkhTS2luZCgpLgorICAgIE5vZGVLaW5kIFJIU0tpbmQgPSBFbXB0eUtpbmQ7CisKKyAgICAvLy8gQ29uc3RydWN0IGEgbnVsbGFyeSB0d2luZTsgdGhlIGtpbmQgbXVzdCBiZSBOdWxsS2luZCBvciBFbXB0eUtpbmQuCisgICAgZXhwbGljaXQgVHdpbmUoTm9kZUtpbmQgS2luZCkgOiBMSFNLaW5kKEtpbmQpIHsKKyAgICAgIGFzc2VydChpc051bGxhcnkoKSAmJiAiSW52YWxpZCBraW5kISIpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgYSBiaW5hcnkgdHdpbmUuCisgICAgZXhwbGljaXQgVHdpbmUoY29uc3QgVHdpbmUgJkxIUywgY29uc3QgVHdpbmUgJlJIUykKKyAgICAgICAgOiBMSFNLaW5kKFR3aW5lS2luZCksIFJIU0tpbmQoVHdpbmVLaW5kKSB7CisgICAgICB0aGlzLT5MSFMudHdpbmUgPSAmTEhTOworICAgICAgdGhpcy0+UkhTLnR3aW5lID0gJlJIUzsKKyAgICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIkludmFsaWQgdHdpbmUhIik7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBhIHR3aW5lIGZyb20gZXhwbGljaXQgdmFsdWVzLgorICAgIGV4cGxpY2l0IFR3aW5lKENoaWxkIExIUywgTm9kZUtpbmQgTEhTS2luZCwgQ2hpbGQgUkhTLCBOb2RlS2luZCBSSFNLaW5kKQorICAgICAgICA6IExIUyhMSFMpLCBSSFMoUkhTKSwgTEhTS2luZChMSFNLaW5kKSwgUkhTS2luZChSSFNLaW5kKSB7CisgICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJJbnZhbGlkIHR3aW5lISIpOworICAgIH0KKworICAgIC8vLyBDaGVjayBmb3IgdGhlIG51bGwgdHdpbmUuCisgICAgYm9vbCBpc051bGwoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0TEhTS2luZCgpID09IE51bGxLaW5kOworICAgIH0KKworICAgIC8vLyBDaGVjayBmb3IgdGhlIGVtcHR5IHR3aW5lLgorICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRMSFNLaW5kKCkgPT0gRW1wdHlLaW5kOworICAgIH0KKworICAgIC8vLyBDaGVjayBpZiB0aGlzIGlzIGEgbnVsbGFyeSB0d2luZSAobnVsbCBvciBlbXB0eSkuCisgICAgYm9vbCBpc051bGxhcnkoKSBjb25zdCB7CisgICAgICByZXR1cm4gaXNOdWxsKCkgfHwgaXNFbXB0eSgpOworICAgIH0KKworICAgIC8vLyBDaGVjayBpZiB0aGlzIGlzIGEgdW5hcnkgdHdpbmUuCisgICAgYm9vbCBpc1VuYXJ5KCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFJIU0tpbmQoKSA9PSBFbXB0eUtpbmQgJiYgIWlzTnVsbGFyeSgpOworICAgIH0KKworICAgIC8vLyBDaGVjayBpZiB0aGlzIGlzIGEgYmluYXJ5IHR3aW5lLgorICAgIGJvb2wgaXNCaW5hcnkoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0TEhTS2luZCgpICE9IE51bGxLaW5kICYmIGdldFJIU0tpbmQoKSAhPSBFbXB0eUtpbmQ7CisgICAgfQorCisgICAgLy8vIENoZWNrIGlmIHRoaXMgaXMgYSB2YWxpZCB0d2luZSAoc2F0aXNmeWluZyB0aGUgaW52YXJpYW50cyBvbgorICAgIC8vLyBvcmRlciBhbmQgbnVtYmVyIG9mIGFyZ3VtZW50cykuCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgLy8gTnVsbGFyeSB0d2luZXMgYWx3YXlzIGhhdmUgRW1wdHkgb24gdGhlIFJIUy4KKyAgICAgIGlmIChpc051bGxhcnkoKSAmJiBnZXRSSFNLaW5kKCkgIT0gRW1wdHlLaW5kKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIC8vIE51bGwgc2hvdWxkIG5ldmVyIGFwcGVhciBvbiB0aGUgUkhTLgorICAgICAgaWYgKGdldFJIU0tpbmQoKSA9PSBOdWxsS2luZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAvLyBUaGUgUkhTIGNhbm5vdCBiZSBub24tZW1wdHkgaWYgdGhlIExIUyBpcyBlbXB0eS4KKyAgICAgIGlmIChnZXRSSFNLaW5kKCkgIT0gRW1wdHlLaW5kICYmIGdldExIU0tpbmQoKSA9PSBFbXB0eUtpbmQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgLy8gQSB0d2luZSBjaGlsZCBzaG91bGQgYWx3YXlzIGJlIGJpbmFyeS4KKyAgICAgIGlmIChnZXRMSFNLaW5kKCkgPT0gVHdpbmVLaW5kICYmCisgICAgICAgICAgIUxIUy50d2luZS0+aXNCaW5hcnkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKGdldFJIU0tpbmQoKSA9PSBUd2luZUtpbmQgJiYKKyAgICAgICAgICAhUkhTLnR3aW5lLT5pc0JpbmFyeSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vLyBHZXQgdGhlIE5vZGVLaW5kIG9mIHRoZSBsZWZ0LWhhbmQgc2lkZS4KKyAgICBOb2RlS2luZCBnZXRMSFNLaW5kKCkgY29uc3QgeyByZXR1cm4gTEhTS2luZDsgfQorCisgICAgLy8vIEdldCB0aGUgTm9kZUtpbmQgb2YgdGhlIHJpZ2h0LWhhbmQgc2lkZS4KKyAgICBOb2RlS2luZCBnZXRSSFNLaW5kKCkgY29uc3QgeyByZXR1cm4gUkhTS2luZDsgfQorCisgICAgLy8vIFByaW50IG9uZSBjaGlsZCBmcm9tIGEgdHdpbmUuCisgICAgdm9pZCBwcmludE9uZUNoaWxkKHJhd19vc3RyZWFtICZPUywgQ2hpbGQgUHRyLCBOb2RlS2luZCBLaW5kKSBjb25zdDsKKworICAgIC8vLyBQcmludCB0aGUgcmVwcmVzZW50YXRpb24gb2Ygb25lIGNoaWxkIGZyb20gYSB0d2luZS4KKyAgICB2b2lkIHByaW50T25lQ2hpbGRSZXByKHJhd19vc3RyZWFtICZPUywgQ2hpbGQgUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZUtpbmQgS2luZCkgY29uc3Q7CisKKyAgcHVibGljOgorICAgIC8vLyBAbmFtZSBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gQHsKKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhbiBlbXB0eSBzdHJpbmcuCisgICAgLyppbXBsaWNpdCovIFR3aW5lKCkgeworICAgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiSW52YWxpZCB0d2luZSEiKTsKKyAgICB9CisKKyAgICBUd2luZShjb25zdCBUd2luZSAmKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBDIHN0cmluZy4KKyAgICAvLy8KKyAgICAvLy8gV2UgdGFrZSBjYXJlIGhlcmUgdG8gb3B0aW1pemUgIiIgaW50byB0aGUgZW1wdHkgdHdpbmUgLS0gdGhpcyB3aWxsIGJlCisgICAgLy8vIG9wdGltaXplZCBvdXQgZm9yIHN0cmluZyBjb25zdGFudHMuIFRoaXMgYWxsb3dzIFR3aW5lIGFyZ3VtZW50cyBoYXZlCisgICAgLy8vIGRlZmF1bHQgIiIgdmFsdWVzLCB3aXRob3V0IGludHJvZHVjaW5nIHVubmVjZXNzYXJ5IHN0cmluZyBjb25zdGFudHMuCisgICAgLyppbXBsaWNpdCovIFR3aW5lKGNvbnN0IGNoYXIgKlN0cikgeworICAgICAgaWYgKFN0clswXSAhPSAnXDAnKSB7CisgICAgICAgIExIUy5jU3RyaW5nID0gU3RyOworICAgICAgICBMSFNLaW5kID0gQ1N0cmluZ0tpbmQ7CisgICAgICB9IGVsc2UKKyAgICAgICAgTEhTS2luZCA9IEVtcHR5S2luZDsKKworICAgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiSW52YWxpZCB0d2luZSEiKTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYW4gc3RkOjpzdHJpbmcuCisgICAgLyppbXBsaWNpdCovIFR3aW5lKGNvbnN0IHN0ZDo6c3RyaW5nICZTdHIpIDogTEhTS2luZChTdGRTdHJpbmdLaW5kKSB7CisgICAgICBMSFMuc3RkU3RyaW5nID0gJlN0cjsKKyAgICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIkludmFsaWQgdHdpbmUhIik7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBmcm9tIGEgU3RyaW5nUmVmLgorICAgIC8qaW1wbGljaXQqLyBUd2luZShjb25zdCBTdHJpbmdSZWYgJlN0cikgOiBMSFNLaW5kKFN0cmluZ1JlZktpbmQpIHsKKyAgICAgIExIUy5zdHJpbmdSZWYgPSAmU3RyOworICAgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiSW52YWxpZCB0d2luZSEiKTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBTbWFsbFN0cmluZy4KKyAgICAvKmltcGxpY2l0Ki8gVHdpbmUoY29uc3QgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZTdHIpCisgICAgICAgIDogTEhTS2luZChTbWFsbFN0cmluZ0tpbmQpIHsKKyAgICAgIExIUy5zbWFsbFN0cmluZyA9ICZTdHI7CisgICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJJbnZhbGlkIHR3aW5lISIpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhIGZvcm1hdHZfb2JqZWN0X2Jhc2UuCisgICAgLyppbXBsaWNpdCovIFR3aW5lKGNvbnN0IGZvcm1hdHZfb2JqZWN0X2Jhc2UgJkZtdCkKKyAgICAgICAgOiBMSFNLaW5kKEZvcm1hdHZPYmplY3RLaW5kKSB7CisgICAgICBMSFMuZm9ybWF0dk9iamVjdCA9ICZGbXQ7CisgICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJJbnZhbGlkIHR3aW5lISIpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhIGNoYXIuCisgICAgZXhwbGljaXQgVHdpbmUoY2hhciBWYWwpIDogTEhTS2luZChDaGFyS2luZCkgeworICAgICAgTEhTLmNoYXJhY3RlciA9IFZhbDsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBzaWduZWQgY2hhci4KKyAgICBleHBsaWNpdCBUd2luZShzaWduZWQgY2hhciBWYWwpIDogTEhTS2luZChDaGFyS2luZCkgeworICAgICAgTEhTLmNoYXJhY3RlciA9IHN0YXRpY19jYXN0PGNoYXI+KFZhbCk7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBmcm9tIGFuIHVuc2lnbmVkIGNoYXIuCisgICAgZXhwbGljaXQgVHdpbmUodW5zaWduZWQgY2hhciBWYWwpIDogTEhTS2luZChDaGFyS2luZCkgeworICAgICAgTEhTLmNoYXJhY3RlciA9IHN0YXRpY19jYXN0PGNoYXI+KFZhbCk7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBhIHR3aW5lIHRvIHByaW50IFxwIFZhbCBhcyBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIuCisgICAgZXhwbGljaXQgVHdpbmUodW5zaWduZWQgVmFsKSA6IExIU0tpbmQoRGVjVUlLaW5kKSB7CisgICAgICBMSFMuZGVjVUkgPSBWYWw7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBhIHR3aW5lIHRvIHByaW50IFxwIFZhbCBhcyBhIHNpZ25lZCBkZWNpbWFsIGludGVnZXIuCisgICAgZXhwbGljaXQgVHdpbmUoaW50IFZhbCkgOiBMSFNLaW5kKERlY0lLaW5kKSB7CisgICAgICBMSFMuZGVjSSA9IFZhbDsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGEgdHdpbmUgdG8gcHJpbnQgXHAgVmFsIGFzIGFuIHVuc2lnbmVkIGRlY2ltYWwgaW50ZWdlci4KKyAgICBleHBsaWNpdCBUd2luZShjb25zdCB1bnNpZ25lZCBsb25nICZWYWwpIDogTEhTS2luZChEZWNVTEtpbmQpIHsKKyAgICAgIExIUy5kZWNVTCA9ICZWYWw7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBhIHR3aW5lIHRvIHByaW50IFxwIFZhbCBhcyBhIHNpZ25lZCBkZWNpbWFsIGludGVnZXIuCisgICAgZXhwbGljaXQgVHdpbmUoY29uc3QgbG9uZyAmVmFsKSA6IExIU0tpbmQoRGVjTEtpbmQpIHsKKyAgICAgIExIUy5kZWNMID0gJlZhbDsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGEgdHdpbmUgdG8gcHJpbnQgXHAgVmFsIGFzIGFuIHVuc2lnbmVkIGRlY2ltYWwgaW50ZWdlci4KKyAgICBleHBsaWNpdCBUd2luZShjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgJlZhbCkgOiBMSFNLaW5kKERlY1VMTEtpbmQpIHsKKyAgICAgIExIUy5kZWNVTEwgPSAmVmFsOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgYSB0d2luZSB0byBwcmludCBccCBWYWwgYXMgYSBzaWduZWQgZGVjaW1hbCBpbnRlZ2VyLgorICAgIGV4cGxpY2l0IFR3aW5lKGNvbnN0IGxvbmcgbG9uZyAmVmFsKSA6IExIU0tpbmQoRGVjTExLaW5kKSB7CisgICAgICBMSFMuZGVjTEwgPSAmVmFsOworICAgIH0KKworICAgIC8vIEZJWE1FOiBVbmZvcnR1bmF0ZWx5LCB0byBtYWtlIHN1cmUgdGhpcyBpcyBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUgd2UKKyAgICAvLyBuZWVkIGV4dHJhIGJpbmFyeSBjb25zdHJ1Y3RvcnMgZnJvbSBwYXJ0aWN1bGFyIHR5cGVzLiBXZSBjYW4ndCByZWx5IG9uCisgICAgLy8gdGhlIGNvbXBpbGVyIHRvIGJlIHNtYXJ0IGVub3VnaCB0byBmb2xkIG9wZXJhdG9yKygpL2NvbmNhdCgpIGRvd24gdG8gdGhlCisgICAgLy8gcmlnaHQgdGhpbmcuIFlldC4KKworICAgIC8vLyBDb25zdHJ1Y3QgYXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgYSBDIHN0cmluZyBhbmQgYSBTdHJpbmdSZWYuCisgICAgLyppbXBsaWNpdCovIFR3aW5lKGNvbnN0IGNoYXIgKkxIUywgY29uc3QgU3RyaW5nUmVmICZSSFMpCisgICAgICAgIDogTEhTS2luZChDU3RyaW5nS2luZCksIFJIU0tpbmQoU3RyaW5nUmVmS2luZCkgeworICAgICAgdGhpcy0+TEhTLmNTdHJpbmcgPSBMSFM7CisgICAgICB0aGlzLT5SSFMuc3RyaW5nUmVmID0gJlJIUzsKKyAgICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIkludmFsaWQgdHdpbmUhIik7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBhcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiBhIFN0cmluZ1JlZiBhbmQgYSBDIHN0cmluZy4KKyAgICAvKmltcGxpY2l0Ki8gVHdpbmUoY29uc3QgU3RyaW5nUmVmICZMSFMsIGNvbnN0IGNoYXIgKlJIUykKKyAgICAgICAgOiBMSFNLaW5kKFN0cmluZ1JlZktpbmQpLCBSSFNLaW5kKENTdHJpbmdLaW5kKSB7CisgICAgICB0aGlzLT5MSFMuc3RyaW5nUmVmID0gJkxIUzsKKyAgICAgIHRoaXMtPlJIUy5jU3RyaW5nID0gUkhTOworICAgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiSW52YWxpZCB0d2luZSEiKTsKKyAgICB9CisKKyAgICAvLy8gU2luY2UgdGhlIGludGVuZGVkIHVzZSBvZiB0d2luZXMgaXMgYXMgdGVtcG9yYXJ5IG9iamVjdHMsIGFzc2lnbm1lbnRzCisgICAgLy8vIHdoZW4gY29uY2F0ZW5hdGluZyBtaWdodCBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3Igb3Igc3RhY2sgY29ycnVwdGlvbnMKKyAgICBUd2luZSAmb3BlcmF0b3I9KGNvbnN0IFR3aW5lICYpID0gZGVsZXRlOworCisgICAgLy8vIENyZWF0ZSBhICdudWxsJyBzdHJpbmcsIHdoaWNoIGlzIGFuIGVtcHR5IHN0cmluZyB0aGF0IGFsd2F5cworICAgIC8vLyBjb25jYXRlbmF0ZXMgdG8gZm9ybSBhbm90aGVyIGVtcHR5IHN0cmluZy4KKyAgICBzdGF0aWMgVHdpbmUgY3JlYXRlTnVsbCgpIHsKKyAgICAgIHJldHVybiBUd2luZShOdWxsS2luZCk7CisgICAgfQorCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIE51bWVyaWMgQ29udmVyc2lvbnMKKyAgICAvLy8gQHsKKworICAgIC8vIENvbnN0cnVjdCBhIHR3aW5lIHRvIHByaW50IFxwIFZhbCBhcyBhbiB1bnNpZ25lZCBoZXhhZGVjaW1hbCBpbnRlZ2VyLgorICAgIHN0YXRpYyBUd2luZSB1dG9oZXhzdHIoY29uc3QgdWludDY0X3QgJlZhbCkgeworICAgICAgQ2hpbGQgTEhTLCBSSFM7CisgICAgICBMSFMudUhleCA9ICZWYWw7CisgICAgICBSSFMudHdpbmUgPSBudWxscHRyOworICAgICAgcmV0dXJuIFR3aW5lKExIUywgVUhleEtpbmQsIFJIUywgRW1wdHlLaW5kKTsKKyAgICB9CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgUHJlZGljYXRlIE9wZXJhdGlvbnMKKyAgICAvLy8gQHsKKworICAgIC8vLyBDaGVjayBpZiB0aGlzIHR3aW5lIGlzIHRyaXZpYWxseSBlbXB0eTsgYSBmYWxzZSByZXR1cm4gdmFsdWUgZG9lcyBub3QKKyAgICAvLy8gbmVjZXNzYXJpbHkgbWVhbiB0aGUgdHdpbmUgaXMgZW1wdHkuCisgICAgYm9vbCBpc1RyaXZpYWxseUVtcHR5KCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzTnVsbGFyeSgpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHR3aW5lIGNhbiBiZSBkeW5hbWljYWxseSBhY2Nlc3NlZCBhcyBhIHNpbmdsZQorICAgIC8vLyBTdHJpbmdSZWYgdmFsdWUgd2l0aCBnZXRTaW5nbGVTdHJpbmdSZWYoKS4KKyAgICBib29sIGlzU2luZ2xlU3RyaW5nUmVmKCkgY29uc3QgeworICAgICAgaWYgKGdldFJIU0tpbmQoKSAhPSBFbXB0eUtpbmQpIHJldHVybiBmYWxzZTsKKworICAgICAgc3dpdGNoIChnZXRMSFNLaW5kKCkpIHsKKyAgICAgIGNhc2UgRW1wdHlLaW5kOgorICAgICAgY2FzZSBDU3RyaW5nS2luZDoKKyAgICAgIGNhc2UgU3RkU3RyaW5nS2luZDoKKyAgICAgIGNhc2UgU3RyaW5nUmVmS2luZDoKKyAgICAgIGNhc2UgU21hbGxTdHJpbmdLaW5kOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgU3RyaW5nIE9wZXJhdGlvbnMKKyAgICAvLy8gQHsKKworICAgIFR3aW5lIGNvbmNhdChjb25zdCBUd2luZSAmU3VmZml4KSBjb25zdDsKKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBPdXRwdXQgJiBDb252ZXJzaW9uLgorICAgIC8vLyBAeworCisgICAgLy8vIFJldHVybiB0aGUgdHdpbmUgY29udGVudHMgYXMgYSBzdGQ6OnN0cmluZy4KKyAgICBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdDsKKworICAgIC8vLyBBcHBlbmQgdGhlIGNvbmNhdGVuYXRlZCBzdHJpbmcgaW50byB0aGUgZ2l2ZW4gU21hbGxTdHJpbmcgb3IgU21hbGxWZWN0b3IuCisgICAgdm9pZCB0b1ZlY3RvcihTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk91dCkgY29uc3Q7CisKKyAgICAvLy8gVGhpcyByZXR1cm5zIHRoZSB0d2luZSBhcyBhIHNpbmdsZSBTdHJpbmdSZWYuICBUaGlzIG1ldGhvZCBpcyBvbmx5IHZhbGlkCisgICAgLy8vIGlmIGlzU2luZ2xlU3RyaW5nUmVmKCkgaXMgdHJ1ZS4KKyAgICBTdHJpbmdSZWYgZ2V0U2luZ2xlU3RyaW5nUmVmKCkgY29uc3QgeworICAgICAgYXNzZXJ0KGlzU2luZ2xlU3RyaW5nUmVmKCkgJiYiVGhpcyBjYW5ub3QgYmUgaGFkIGFzIGEgc2luZ2xlIHN0cmluZ3JlZiEiKTsKKyAgICAgIHN3aXRjaCAoZ2V0TEhTS2luZCgpKSB7CisgICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJPdXQgb2Ygc3luYyB3aXRoIGlzU2luZ2xlU3RyaW5nUmVmIik7CisgICAgICBjYXNlIEVtcHR5S2luZDogICAgICByZXR1cm4gU3RyaW5nUmVmKCk7CisgICAgICBjYXNlIENTdHJpbmdLaW5kOiAgICByZXR1cm4gU3RyaW5nUmVmKExIUy5jU3RyaW5nKTsKKyAgICAgIGNhc2UgU3RkU3RyaW5nS2luZDogIHJldHVybiBTdHJpbmdSZWYoKkxIUy5zdGRTdHJpbmcpOworICAgICAgY2FzZSBTdHJpbmdSZWZLaW5kOiAgcmV0dXJuICpMSFMuc3RyaW5nUmVmOworICAgICAgY2FzZSBTbWFsbFN0cmluZ0tpbmQ6CisgICAgICAgIHJldHVybiBTdHJpbmdSZWYoTEhTLnNtYWxsU3RyaW5nLT5kYXRhKCksIExIUy5zbWFsbFN0cmluZy0+c2l6ZSgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gVGhpcyByZXR1cm5zIHRoZSB0d2luZSBhcyBhIHNpbmdsZSBTdHJpbmdSZWYgaWYgaXQgY2FuIGJlCisgICAgLy8vIHJlcHJlc2VudGVkIGFzIHN1Y2guIE90aGVyd2lzZSB0aGUgdHdpbmUgaXMgd3JpdHRlbiBpbnRvIHRoZSBnaXZlbgorICAgIC8vLyBTbWFsbFZlY3RvciBhbmQgYSBTdHJpbmdSZWYgdG8gdGhlIFNtYWxsVmVjdG9yJ3MgZGF0YSBpcyByZXR1cm5lZC4KKyAgICBTdHJpbmdSZWYgdG9TdHJpbmdSZWYoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZPdXQpIGNvbnN0IHsKKyAgICAgIGlmIChpc1NpbmdsZVN0cmluZ1JlZigpKQorICAgICAgICByZXR1cm4gZ2V0U2luZ2xlU3RyaW5nUmVmKCk7CisgICAgICB0b1ZlY3RvcihPdXQpOworICAgICAgcmV0dXJuIFN0cmluZ1JlZihPdXQuZGF0YSgpLCBPdXQuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvLy8gVGhpcyByZXR1cm5zIHRoZSB0d2luZSBhcyBhIHNpbmdsZSBudWxsIHRlcm1pbmF0ZWQgU3RyaW5nUmVmIGlmIGl0CisgICAgLy8vIGNhbiBiZSByZXByZXNlbnRlZCBhcyBzdWNoLiBPdGhlcndpc2UgdGhlIHR3aW5lIGlzIHdyaXR0ZW4gaW50byB0aGUKKyAgICAvLy8gZ2l2ZW4gU21hbGxWZWN0b3IgYW5kIGEgU3RyaW5nUmVmIHRvIHRoZSBTbWFsbFZlY3RvcidzIGRhdGEgaXMgcmV0dXJuZWQuCisgICAgLy8vCisgICAgLy8vIFRoZSByZXR1cm5lZCBTdHJpbmdSZWYncyBzaXplIGRvZXMgbm90IGluY2x1ZGUgdGhlIG51bGwgdGVybWluYXRvci4KKyAgICBTdHJpbmdSZWYgdG9OdWxsVGVybWluYXRlZFN0cmluZ1JlZihTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk91dCkgY29uc3Q7CisKKyAgICAvLy8gV3JpdGUgdGhlIGNvbmNhdGVuYXRlZCBzdHJpbmcgcmVwcmVzZW50ZWQgYnkgdGhpcyB0d2luZSB0byB0aGUKKyAgICAvLy8gc3RyZWFtIFxwIE9TLgorICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAgIC8vLyBEdW1wIHRoZSBjb25jYXRlbmF0ZWQgc3RyaW5nIHJlcHJlc2VudGVkIGJ5IHRoaXMgdHdpbmUgdG8gc3RkZXJyLgorICAgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgICAgLy8vIFdyaXRlIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHR3aW5lIHRvIHRoZSBzdHJlYW0gXHAgT1MuCisgICAgdm9pZCBwcmludFJlcHIocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAgIC8vLyBEdW1wIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHR3aW5lIHRvIHN0ZGVyci4KKyAgICB2b2lkIGR1bXBSZXByKCkgY29uc3Q7CisKKyAgICAvLy8gQH0KKyAgfTsKKworICAvLy8gQG5hbWUgVHdpbmUgSW5saW5lIEltcGxlbWVudGF0aW9ucworICAvLy8gQHsKKworICBpbmxpbmUgVHdpbmUgVHdpbmU6OmNvbmNhdChjb25zdCBUd2luZSAmU3VmZml4KSBjb25zdCB7CisgICAgLy8gQ29uY2F0ZW5hdGlvbiB3aXRoIG51bGwgaXMgbnVsbC4KKyAgICBpZiAoaXNOdWxsKCkgfHwgU3VmZml4LmlzTnVsbCgpKQorICAgICAgcmV0dXJuIFR3aW5lKE51bGxLaW5kKTsKKworICAgIC8vIENvbmNhdGVuYXRpb24gd2l0aCBlbXB0eSB5aWVsZHMgdGhlIG90aGVyIHNpZGUuCisgICAgaWYgKGlzRW1wdHkoKSkKKyAgICAgIHJldHVybiBTdWZmaXg7CisgICAgaWYgKFN1ZmZpeC5pc0VtcHR5KCkpCisgICAgICByZXR1cm4gKnRoaXM7CisKKyAgICAvLyBPdGhlcndpc2Ugd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgbm9kZSwgdGFraW5nIGNhcmUgdG8gZm9sZCBpbiB1bmFyeQorICAgIC8vIHR3aW5lcy4KKyAgICBDaGlsZCBOZXdMSFMsIE5ld1JIUzsKKyAgICBOZXdMSFMudHdpbmUgPSB0aGlzOworICAgIE5ld1JIUy50d2luZSA9ICZTdWZmaXg7CisgICAgTm9kZUtpbmQgTmV3TEhTS2luZCA9IFR3aW5lS2luZCwgTmV3UkhTS2luZCA9IFR3aW5lS2luZDsKKyAgICBpZiAoaXNVbmFyeSgpKSB7CisgICAgICBOZXdMSFMgPSBMSFM7CisgICAgICBOZXdMSFNLaW5kID0gZ2V0TEhTS2luZCgpOworICAgIH0KKyAgICBpZiAoU3VmZml4LmlzVW5hcnkoKSkgeworICAgICAgTmV3UkhTID0gU3VmZml4LkxIUzsKKyAgICAgIE5ld1JIU0tpbmQgPSBTdWZmaXguZ2V0TEhTS2luZCgpOworICAgIH0KKworICAgIHJldHVybiBUd2luZShOZXdMSFMsIE5ld0xIU0tpbmQsIE5ld1JIUywgTmV3UkhTS2luZCk7CisgIH0KKworICBpbmxpbmUgVHdpbmUgb3BlcmF0b3IrKGNvbnN0IFR3aW5lICZMSFMsIGNvbnN0IFR3aW5lICZSSFMpIHsKKyAgICByZXR1cm4gTEhTLmNvbmNhdChSSFMpOworICB9CisKKyAgLy8vIEFkZGl0aW9uYWwgb3ZlcmxvYWQgdG8gZ3VhcmFudGVlIHNpbXBsaWZpZWQgY29kZWdlbjsgdGhpcyBpcyBlcXVpdmFsZW50IHRvCisgIC8vLyBjb25jYXQoKS4KKworICBpbmxpbmUgVHdpbmUgb3BlcmF0b3IrKGNvbnN0IGNoYXIgKkxIUywgY29uc3QgU3RyaW5nUmVmICZSSFMpIHsKKyAgICByZXR1cm4gVHdpbmUoTEhTLCBSSFMpOworICB9CisKKyAgLy8vIEFkZGl0aW9uYWwgb3ZlcmxvYWQgdG8gZ3VhcmFudGVlIHNpbXBsaWZpZWQgY29kZWdlbjsgdGhpcyBpcyBlcXVpdmFsZW50IHRvCisgIC8vLyBjb25jYXQoKS4KKworICBpbmxpbmUgVHdpbmUgb3BlcmF0b3IrKGNvbnN0IFN0cmluZ1JlZiAmTEhTLCBjb25zdCBjaGFyICpSSFMpIHsKKyAgICByZXR1cm4gVHdpbmUoTEhTLCBSSFMpOworICB9CisKKyAgaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgVHdpbmUgJlJIUykgeworICAgIFJIUy5wcmludChPUyk7CisgICAgcmV0dXJuIE9TOworICB9CisKKyAgLy8vIEB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9UV0lORV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9VbmlxdWVWZWN0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1VuaXF1ZVZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxN2ZiMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9VbmlxdWVWZWN0b3IuaApAQCAtMCwwICsxLDEwMiBAQAorLy89PT0tIGxsdm0vQURUL1VuaXF1ZVZlY3Rvci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9VTklRVUVWRUNUT1JfSAorI2RlZmluZSBMTFZNX0FEVF9VTklRVUVWRUNUT1JfSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBVbmlxdWVWZWN0b3IgLSBUaGlzIGNsYXNzIHByb2R1Y2VzIGEgc2VxdWVudGlhbCBJRCBudW1iZXIgKGJhc2UgMSkgZm9yIGVhY2gKKy8vLyB1bmlxdWUgZW50cnkgdGhhdCBpcyBhZGRlZC4gIFQgaXMgdGhlIHR5cGUgb2YgZW50cmllcyBpbiB0aGUgdmVjdG9yLiBUaGlzCisvLy8gY2xhc3Mgc2hvdWxkIGhhdmUgYW4gaW1wbGVtZW50YXRpb24gb2Ygb3BlcmF0b3I9PSBhbmQgb2Ygb3BlcmF0b3I8LgorLy8vIEVudHJpZXMgY2FuIGJlIGZldGNoZWQgdXNpbmcgb3BlcmF0b3JbXSB3aXRoIHRoZSBlbnRyeSBJRC4KK3RlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIFVuaXF1ZVZlY3RvciB7CitwdWJsaWM6CisgIHVzaW5nIFZlY3RvclR5cGUgPSB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxUPjsKKyAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBWZWN0b3JUeXBlOjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSB0eXBlbmFtZSBWZWN0b3JUeXBlOjpjb25zdF9pdGVyYXRvcjsKKworcHJpdmF0ZToKKyAgLy8gTWFwIC0gVXNlZCB0byBoYW5kbGUgdGhlIGNvcnJlc3BvbmRlbmNlIG9mIGVudHJ5IHRvIElELgorICBzdGQ6Om1hcDxULCB1bnNpZ25lZD4gTWFwOworCisgIC8vIFZlY3RvciAtIElEIG9yZGVyZWQgdmVjdG9yIG9mIGVudHJpZXMuIEVudHJpZXMgY2FuIGJlIGluZGV4ZWQgYnkgSUQgLSAxLgorICBWZWN0b3JUeXBlIFZlY3RvcjsKKworcHVibGljOgorICAvLy8gaW5zZXJ0IC0gQXBwZW5kIGVudHJ5IHRvIHRoZSB2ZWN0b3IgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LiAgUmV0dXJucworICAvLy8gdGhlIGVudHJ5J3MgaW5kZXggKyAxIHRvIGJlIHVzZWQgYXMgYSB1bmlxdWUgSUQuCisgIHVuc2lnbmVkIGluc2VydChjb25zdCBUICZFbnRyeSkgeworICAgIC8vIENoZWNrIGlmIHRoZSBlbnRyeSBpcyBhbHJlYWR5IGluIHRoZSBtYXAuCisgICAgdW5zaWduZWQgJlZhbCA9IE1hcFtFbnRyeV07CisKKyAgICAvLyBTZWUgaWYgZW50cnkgZXhpc3RzLCBpZiBzbyByZXR1cm4gcHJpb3IgSUQuCisgICAgaWYgKFZhbCkgcmV0dXJuIFZhbDsKKworICAgIC8vIENvbXB1dGUgSUQgZm9yIGVudHJ5LgorICAgIFZhbCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihWZWN0b3Iuc2l6ZSgpKSArIDE7CisKKyAgICAvLyBJbnNlcnQgaW4gdmVjdG9yLgorICAgIFZlY3Rvci5wdXNoX2JhY2soRW50cnkpOworICAgIHJldHVybiBWYWw7CisgIH0KKworICAvLy8gaWRGb3IgLSByZXR1cm4gdGhlIElEIGZvciBhbiBleGlzdGluZyBlbnRyeS4gIFJldHVybnMgMCBpZiB0aGUgZW50cnkgaXMKKyAgLy8vIG5vdCBmb3VuZC4KKyAgdW5zaWduZWQgaWRGb3IoY29uc3QgVCAmRW50cnkpIGNvbnN0IHsKKyAgICAvLyBTZWFyY2ggZm9yIGVudHJ5IGluIHRoZSBtYXAuCisgICAgdHlwZW5hbWUgc3RkOjptYXA8VCwgdW5zaWduZWQ+Ojpjb25zdF9pdGVyYXRvciBNSSA9IE1hcC5maW5kKEVudHJ5KTsKKworICAgIC8vIFNlZSBpZiBlbnRyeSBleGlzdHMsIGlmIHNvIHJldHVybiBJRC4KKyAgICBpZiAoTUkgIT0gTWFwLmVuZCgpKSByZXR1cm4gTUktPnNlY29uZDsKKworICAgIC8vIE5vIGx1Y2suCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gb3BlcmF0b3JbXSAtIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBJRC4KKyAgY29uc3QgVCAmb3BlcmF0b3JbXSh1bnNpZ25lZCBJRCkgY29uc3QgeworICAgIGFzc2VydChJRC0xIDwgc2l6ZSgpICYmICJJRCBpcyAwIG9yIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gVmVjdG9yW0lEIC0gMV07CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhbiBpdGVyYXRvciB0byB0aGUgc3RhcnQgb2YgdGhlIHZlY3Rvci4KKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBWZWN0b3IuYmVnaW4oKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGFuIGl0ZXJhdG9yIHRvIHRoZSBzdGFydCBvZiB0aGUgdmVjdG9yLgorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFZlY3Rvci5iZWdpbigpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYW4gaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgdmVjdG9yLgorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBWZWN0b3IuZW5kKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhbiBpdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSB2ZWN0b3IuCisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFZlY3Rvci5lbmQoKTsgfQorCisgIC8vLyBzaXplIC0gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHZlY3Rvci4KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBWZWN0b3Iuc2l6ZSgpOyB9CisKKyAgLy8vIGVtcHR5IC0gUmV0dXJucyB0cnVlIGlmIHRoZSB2ZWN0b3IgaXMgZW1wdHkuCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBWZWN0b3IuZW1wdHkoKTsgfQorCisgIC8vLyByZXNldCAtIENsZWFycyBhbGwgdGhlIGVudHJpZXMuCisgIHZvaWQgcmVzZXQoKSB7CisgICAgTWFwLmNsZWFyKCk7CisgICAgVmVjdG9yLnJlc2l6ZSgwLCAwKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1VOSVFVRVZFQ1RPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9WYXJpYWRpY0Z1bmN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9WYXJpYWRpY0Z1bmN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAzMTMwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1ZhcmlhZGljRnVuY3Rpb24uaApAQCAtMCwwICsxLDMzMSBAQAorLy89PT0tLS0gVmFyaWFkaWNGdW5jdGlvbnMuaCAtIFZhcmlhZGljIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGltcGxlbWVudHMgY29tcGlsZS10aW1lIHR5cGUtc2FmZSB2YXJpYWRpYyBmdW5jdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9WQVJJQURJQ0ZVTkNUSU9OX0gKKyNkZWZpbmUgTExWTV9BRFRfVkFSSUFESUNGVU5DVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vIERlZmluZSBtYWNyb3MgdG8gYWlkIGluIGV4cGFuZGluZyBhIGNvbW1hIHNlcGFyYXRlZCBzZXJpZXMgd2l0aCB0aGUgaW5kZXggb2YKKy8vIHRoZSBzZXJpZXMgcGFzdGVkIG9udG8gdGhlIGxhc3QgdG9rZW4uCisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjEoeCkgeCAjIyAwCisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjIoeCkgTExWTV9DT01NQV9KT0lOMSh4KSwgeCAjIyAxCisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjMoeCkgTExWTV9DT01NQV9KT0lOMih4KSwgeCAjIyAyCisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjQoeCkgTExWTV9DT01NQV9KT0lOMyh4KSwgeCAjIyAzCisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjUoeCkgTExWTV9DT01NQV9KT0lONCh4KSwgeCAjIyA0CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjYoeCkgTExWTV9DT01NQV9KT0lONSh4KSwgeCAjIyA1CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjcoeCkgTExWTV9DT01NQV9KT0lONih4KSwgeCAjIyA2CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjgoeCkgTExWTV9DT01NQV9KT0lONyh4KSwgeCAjIyA3CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjkoeCkgTExWTV9DT01NQV9KT0lOOCh4KSwgeCAjIyA4CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjEwKHgpIExMVk1fQ09NTUFfSk9JTjkoeCksIHggIyMgOQorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4xMSh4KSBMTFZNX0NPTU1BX0pPSU4xMCh4KSwgeCAjIyAxMAorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4xMih4KSBMTFZNX0NPTU1BX0pPSU4xMSh4KSwgeCAjIyAxMQorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4xMyh4KSBMTFZNX0NPTU1BX0pPSU4xMih4KSwgeCAjIyAxMgorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4xNCh4KSBMTFZNX0NPTU1BX0pPSU4xMyh4KSwgeCAjIyAxMworI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4xNSh4KSBMTFZNX0NPTU1BX0pPSU4xNCh4KSwgeCAjIyAxNAorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4xNih4KSBMTFZNX0NPTU1BX0pPSU4xNSh4KSwgeCAjIyAxNQorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4xNyh4KSBMTFZNX0NPTU1BX0pPSU4xNih4KSwgeCAjIyAxNgorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4xOCh4KSBMTFZNX0NPTU1BX0pPSU4xNyh4KSwgeCAjIyAxNworI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4xOSh4KSBMTFZNX0NPTU1BX0pPSU4xOCh4KSwgeCAjIyAxOAorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4yMCh4KSBMTFZNX0NPTU1BX0pPSU4xOSh4KSwgeCAjIyAxOQorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4yMSh4KSBMTFZNX0NPTU1BX0pPSU4yMCh4KSwgeCAjIyAyMAorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4yMih4KSBMTFZNX0NPTU1BX0pPSU4yMSh4KSwgeCAjIyAyMQorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4yMyh4KSBMTFZNX0NPTU1BX0pPSU4yMih4KSwgeCAjIyAyMgorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4yNCh4KSBMTFZNX0NPTU1BX0pPSU4yMyh4KSwgeCAjIyAyMworI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4yNSh4KSBMTFZNX0NPTU1BX0pPSU4yNCh4KSwgeCAjIyAyNAorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4yNih4KSBMTFZNX0NPTU1BX0pPSU4yNSh4KSwgeCAjIyAyNQorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4yNyh4KSBMTFZNX0NPTU1BX0pPSU4yNih4KSwgeCAjIyAyNgorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4yOCh4KSBMTFZNX0NPTU1BX0pPSU4yNyh4KSwgeCAjIyAyNworI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4yOSh4KSBMTFZNX0NPTU1BX0pPSU4yOCh4KSwgeCAjIyAyOAorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4zMCh4KSBMTFZNX0NPTU1BX0pPSU4yOSh4KSwgeCAjIyAyOQorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4zMSh4KSBMTFZNX0NPTU1BX0pPSU4zMCh4KSwgeCAjIyAzMAorI2RlZmluZSBMTFZNX0NPTU1BX0pPSU4zMih4KSBMTFZNX0NPTU1BX0pPSU4zMSh4KSwgeCAjIyAzMQorCisvLy8gXGJyaWVmIENsYXNzIHdoaWNoIGNhbiBzaW11bGF0ZSBhIHR5cGUtc2FmZSB2YXJpYWRpYyBmdW5jdGlvbi4KKy8vLworLy8vIFRoZSBWYXJpYWRpY0Z1bmN0aW9uIGNsYXNzIHRlbXBsYXRlIG1ha2VzIGl0IGVhc3kgdG8gZGVmaW5lCisvLy8gdHlwZS1zYWZlIHZhcmlhZGljIGZ1bmN0aW9ucyB3aGVyZSBhbGwgYXJndW1lbnRzIGhhdmUgdGhlIHNhbWUKKy8vLyB0eXBlLgorLy8vCisvLy8gU3VwcG9zZSB3ZSBuZWVkIGEgdmFyaWFkaWMgZnVuY3Rpb24gbGlrZSB0aGlzOgorLy8vCisvLy8gICBSZXN1bHRUIEZvbyhjb25zdCBBcmdUICZBXzAsIGNvbnN0IEFyZ1QgJkFfMSwgLi4uLCBjb25zdCBBcmdUICZBX04pOworLy8vCisvLy8gSW5zdGVhZCBvZiBtYW55IG92ZXJsb2FkcyBvZiBGb28oKSwgd2Ugb25seSBuZWVkIHRvIGRlZmluZSBhIGhlbHBlcgorLy8vIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gYXJyYXkgb2YgYXJndW1lbnRzOgorLy8vCisvLy8gICBSZXN1bHRUIEZvb0ltcGwoQXJyYXlSZWY8Y29uc3QgQXJnVCAqPiBBcmdzKSB7CisvLy8gICAgIC8vICdBcmdzW2ldJyBpcyBhIHBvaW50ZXIgdG8gdGhlIGktdGggYXJndW1lbnQgcGFzc2VkIHRvIEZvbygpLgorLy8vICAgICAuLi4KKy8vLyAgIH0KKy8vLworLy8vIGFuZCB0aGVuIGRlZmluZSBGb28oKSBsaWtlIHRoaXM6CisvLy8KKy8vLyAgIGNvbnN0IFZhcmlhZGljRnVuY3Rpb248UmVzdWx0VCwgQXJnVCwgRm9vSW1wbD4gRm9vOworLy8vCisvLy8gVmFyaWFkaWNGdW5jdGlvbiB0YWtlcyBjYXJlIG9mIGRlZmluaW5nIHRoZSBvdmVybG9hZHMgb2YgRm9vKCkuCisvLy8KKy8vLyBBY3R1YWxseSwgRm9vIGlzIGEgZnVuY3Rpb24gb2JqZWN0IChpLmUuIGZ1bmN0b3IpIGluc3RlYWQgb2YgYSBwbGFpbgorLy8vIGZ1bmN0aW9uLiAgVGhpcyBvYmplY3QgaXMgc3RhdGVsZXNzIGFuZCBpdHMgY29uc3RydWN0b3IvZGVzdHJ1Y3RvcgorLy8vIGRvZXMgbm90aGluZywgc28gaXQncyBzYWZlIHRvIGNyZWF0ZSBnbG9iYWwgb2JqZWN0cyBhbmQgY2FsbCBGb28oLi4uKSBhdAorLy8vIGFueSB0aW1lLgorLy8vCisvLy8gU29tZXRpbWVzIHdlIG5lZWQgYSB2YXJpYWRpYyBmdW5jdGlvbiB0byBoYXZlIHNvbWUgZml4ZWQgbGVhZGluZworLy8vIGFyZ3VtZW50cyB3aG9zZSB0eXBlcyBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhhdCBvZiB0aGUgb3B0aW9uYWwKKy8vLyBhcmd1bWVudHMuICBGb3IgZXhhbXBsZToKKy8vLworLy8vICAgYm9vbCBGdWxsTWF0Y2goY29uc3QgU3RyaW5nUmVmICZTLCBjb25zdCBSRSAmUmVnZXgsCisvLy8gICAgICAgICAgICAgICAgICBjb25zdCBBcmdUICZBXzAsIC4uLiwgY29uc3QgQXJnVCAmQV9OKTsKKy8vLworLy8vIFZhcmlhZGljRnVuY3Rpb25OIGlzIGZvciBzdWNoIGNhc2VzLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgZml4ZWQKKy8vLyBhcmd1bWVudHMuICBJdCBpcyBsaWtlIFZhcmlhZGljRnVuY3Rpb24sIGV4Y2VwdCB0aGF0IGl0IHRha2VzIE4gbW9yZQorLy8vIHRlbXBsYXRlIGFyZ3VtZW50cyBmb3IgdGhlIHR5cGVzIG9mIHRoZSBmaXhlZCBhcmd1bWVudHM6CisvLy8KKy8vLyAgIGJvb2wgRnVsbE1hdGNoSW1wbChjb25zdCBTdHJpbmdSZWYgJlMsIGNvbnN0IFJFICZSZWdleCwKKy8vLyAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBBcmdUICo+IEFyZ3MpIHsgLi4uIH0KKy8vLyAgIGNvbnN0IFZhcmlhZGljRnVuY3Rpb24yPGJvb2wsIGNvbnN0IFN0cmluZ1JlZiYsCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSRSYsIEFyZ1QsIEZ1bGxNYXRjaEltcGw+CisvLy8gICAgICAgRnVsbE1hdGNoOworLy8vCisvLy8gQ3VycmVudGx5IFZhcmlhZGljRnVuY3Rpb24gYW5kIGZyaWVuZHMgc3VwcG9ydCB1cC10byAzCisvLy8gZml4ZWQgbGVhZGluZyBhcmd1bWVudHMgYW5kIHVwLXRvIDMyIG9wdGlvbmFsIGFyZ3VtZW50cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRULCB0eXBlbmFtZSBBcmdULAorICAgICAgICAgIFJlc3VsdFQgKCpGdW5jKShBcnJheVJlZjxjb25zdCBBcmdUICo+KT4KK3N0cnVjdCBWYXJpYWRpY0Z1bmN0aW9uIHsKKyAgUmVzdWx0VCBvcGVyYXRvcigpKCkgY29uc3QgeworICAgIHJldHVybiBGdW5jKE5vbmUpOworICB9CisKKyNkZWZpbmUgTExWTV9ERUZJTkVfT1ZFUkxPQUQoTikgXAorICBSZXN1bHRUIG9wZXJhdG9yKCkoTExWTV9DT01NQV9KT0lOICMjIE4oY29uc3QgQXJnVCAmQSkpIGNvbnN0IHsgXAorICAgIGNvbnN0IEFyZ1QgKmNvbnN0IEFyZ3NbXSA9IHsgTExWTV9DT01NQV9KT0lOICMjIE4oJkEpIH07IFwKKyAgICByZXR1cm4gRnVuYyhtYWtlQXJyYXlSZWYoQXJncykpOyBcCisgIH0KKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMikKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMykKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoNCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoNSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoNikKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoNykKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoOCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoOSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTApCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDExKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxMikKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTMpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDE0KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxNSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTYpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDE3KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxOCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTkpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDIwKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyMSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjIpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDIzKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyNCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjUpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDI2KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyNykKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjgpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDI5KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgzMCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMzEpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDMyKQorI3VuZGVmIExMVk1fREVGSU5FX09WRVJMT0FECit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0VCwgdHlwZW5hbWUgUGFyYW0wVCwgdHlwZW5hbWUgQXJnVCwKKyAgICAgICAgICBSZXN1bHRUICgqRnVuYykoUGFyYW0wVCwgQXJyYXlSZWY8Y29uc3QgQXJnVCAqPik+CitzdHJ1Y3QgVmFyaWFkaWNGdW5jdGlvbjEgeworICBSZXN1bHRUIG9wZXJhdG9yKCkoUGFyYW0wVCBQMCkgY29uc3QgeworICAgIHJldHVybiBGdW5jKFAwLCBOb25lKTsKKyAgfQorCisjZGVmaW5lIExMVk1fREVGSU5FX09WRVJMT0FEKE4pIFwKKyAgUmVzdWx0VCBvcGVyYXRvcigpKFBhcmFtMFQgUDAsIExMVk1fQ09NTUFfSk9JTiAjIyBOKGNvbnN0IEFyZ1QgJkEpKSBjb25zdCB7IFwKKyAgICBjb25zdCBBcmdUICpjb25zdCBBcmdzW10gPSB7IExMVk1fQ09NTUFfSk9JTiAjIyBOKCZBKSB9OyBcCisgICAgcmV0dXJuIEZ1bmMoUDAsIG1ha2VBcnJheVJlZihBcmdzKSk7IFwKKyAgfQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgzKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg0KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg1KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg2KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg3KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg4KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg5KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxMCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTEpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDEyKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxMykKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTQpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDE1KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxNikKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTcpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDE4KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxOSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjApCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDIxKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyMikKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjMpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDI0KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyNSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjYpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDI3KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyOCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjkpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDMwKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgzMSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMzIpCisjdW5kZWYgTExWTV9ERUZJTkVfT1ZFUkxPQUQKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRULCB0eXBlbmFtZSBQYXJhbTBULCB0eXBlbmFtZSBQYXJhbTFULCB0eXBlbmFtZSBBcmdULAorICAgICAgICAgIFJlc3VsdFQgKCpGdW5jKShQYXJhbTBULCBQYXJhbTFULCBBcnJheVJlZjxjb25zdCBBcmdUICo+KT4KK3N0cnVjdCBWYXJpYWRpY0Z1bmN0aW9uMiB7CisgIFJlc3VsdFQgb3BlcmF0b3IoKShQYXJhbTBUIFAwLCBQYXJhbTFUIFAxKSBjb25zdCB7CisgICAgcmV0dXJuIEZ1bmMoUDAsIFAxLCBOb25lKTsKKyAgfQorCisjZGVmaW5lIExMVk1fREVGSU5FX09WRVJMT0FEKE4pIFwKKyAgUmVzdWx0VCBvcGVyYXRvcigpKFBhcmFtMFQgUDAsIFBhcmFtMVQgUDEsIFwKKyAgICAgICAgICAgICAgICAgICAgIExMVk1fQ09NTUFfSk9JTiAjIyBOKGNvbnN0IEFyZ1QgJkEpKSBjb25zdCB7IFwKKyAgICBjb25zdCBBcmdUICpjb25zdCBBcmdzW10gPSB7IExMVk1fQ09NTUFfSk9JTiAjIyBOKCZBKSB9OyBcCisgICAgcmV0dXJuIEZ1bmMoUDAsIFAxLCBtYWtlQXJyYXlSZWYoQXJncykpOyBcCisgIH0KKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMikKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMykKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoNCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoNSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoNikKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoNykKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoOCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoOSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTApCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDExKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxMikKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTMpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDE0KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxNSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTYpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDE3KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxOCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTkpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDIwKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyMSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjIpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDIzKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyNCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjUpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDI2KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyNykKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjgpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDI5KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgzMCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMzEpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDMyKQorI3VuZGVmIExMVk1fREVGSU5FX09WRVJMT0FECit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0VCwgdHlwZW5hbWUgUGFyYW0wVCwgdHlwZW5hbWUgUGFyYW0xVCwKKyAgICAgICAgICB0eXBlbmFtZSBQYXJhbTJULCB0eXBlbmFtZSBBcmdULAorICAgICAgICAgIFJlc3VsdFQgKCpGdW5jKShQYXJhbTBULCBQYXJhbTFULCBQYXJhbTJULCBBcnJheVJlZjxjb25zdCBBcmdUICo+KT4KK3N0cnVjdCBWYXJpYWRpY0Z1bmN0aW9uMyB7CisgIFJlc3VsdFQgb3BlcmF0b3IoKShQYXJhbTBUIFAwLCBQYXJhbTFUIFAxLCBQYXJhbTJUIFAyKSBjb25zdCB7CisgICAgcmV0dXJuIEZ1bmMoUDAsIFAxLCBQMiwgTm9uZSk7CisgIH0KKworI2RlZmluZSBMTFZNX0RFRklORV9PVkVSTE9BRChOKSBcCisgIFJlc3VsdFQgb3BlcmF0b3IoKShQYXJhbTBUIFAwLCBQYXJhbTFUIFAxLCBQYXJhbTJUIFAyLCBcCisgICAgICAgICAgICAgICAgICAgICBMTFZNX0NPTU1BX0pPSU4gIyMgTihjb25zdCBBcmdUICZBKSkgY29uc3QgeyBcCisgICAgY29uc3QgQXJnVCAqY29uc3QgQXJnc1tdID0geyBMTFZNX0NPTU1BX0pPSU4gIyMgTigmQSkgfTsgXAorICAgIHJldHVybiBGdW5jKFAwLCBQMSwgUDIsIG1ha2VBcnJheVJlZihBcmdzKSk7IFwKKyAgfQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgzKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg0KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg1KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg2KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg3KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg4KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg5KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxMCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTEpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDEyKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxMykKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTQpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDE1KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxNikKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTcpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDE4KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxOSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjApCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDIxKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyMikKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjMpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDI0KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyNSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjYpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDI3KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyOCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjkpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDMwKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgzMSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMzIpCisjdW5kZWYgTExWTV9ERUZJTkVfT1ZFUkxPQUQKK307CisKKy8vIENsZWFudXAgdGhlIG1hY3JvIG5hbWVzcGFjZS4KKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU4xCisjdW5kZWYgTExWTV9DT01NQV9KT0lOMgorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjMKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU40CisjdW5kZWYgTExWTV9DT01NQV9KT0lONQorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjYKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU43CisjdW5kZWYgTExWTV9DT01NQV9KT0lOOAorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjkKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU4xMAorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjExCisjdW5kZWYgTExWTV9DT01NQV9KT0lOMTIKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU4xMworI3VuZGVmIExMVk1fQ09NTUFfSk9JTjE0CisjdW5kZWYgTExWTV9DT01NQV9KT0lOMTUKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU4xNgorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjE3CisjdW5kZWYgTExWTV9DT01NQV9KT0lOMTgKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU4xOQorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjIwCisjdW5kZWYgTExWTV9DT01NQV9KT0lOMjEKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU4yMgorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjIzCisjdW5kZWYgTExWTV9DT01NQV9KT0lOMjQKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU4yNQorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjI2CisjdW5kZWYgTExWTV9DT01NQV9KT0lOMjcKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU4yOAorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjI5CisjdW5kZWYgTExWTV9DT01NQV9KT0lOMzAKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU4zMQorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjMyCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAgLy8gTExWTV9BRFRfVkFSSUFESUNGVU5DVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9lZGl0X2Rpc3RhbmNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9lZGl0X2Rpc3RhbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhMDFiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2VkaXRfZGlzdGFuY2UuaApAQCAtMCwwICsxLDEwMyBAQAorLy89PT0tLSBsbHZtL0FEVC9lZGl0X2Rpc3RhbmNlLmggLSBBcnJheSBlZGl0IGRpc3RhbmNlIGZ1bmN0aW9uIC0tLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIExldmVuc2h0ZWluIGRpc3RhbmNlIGZ1bmN0aW9uIHRoYXQgd29ya3MgZm9yIGFueSB0d28KKy8vIHNlcXVlbmNlcywgd2l0aCBlYWNoIGVsZW1lbnQgb2YgZWFjaCBzZXF1ZW5jZSBiZWluZyBhbmFsb2dvdXMgdG8gYSBjaGFyYWN0ZXIKKy8vIGluIGEgc3RyaW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfRURJVF9ESVNUQU5DRV9ICisjZGVmaW5lIExMVk1fQURUX0VESVRfRElTVEFOQ0VfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBlZGl0IGRpc3RhbmNlIGJldHdlZW4gdHdvIHNlcXVlbmNlcy4KKy8vLworLy8vIFxwYXJhbSBGcm9tQXJyYXkgdGhlIGZpcnN0IHNlcXVlbmNlIHRvIGNvbXBhcmUuCisvLy8KKy8vLyBccGFyYW0gVG9BcnJheSB0aGUgc2Vjb25kIHNlcXVlbmNlIHRvIGNvbXBhcmUuCisvLy8KKy8vLyBccGFyYW0gQWxsb3dSZXBsYWNlbWVudHMgd2hldGhlciB0byBhbGxvdyBlbGVtZW50IHJlcGxhY2VtZW50cyAoY2hhbmdlIG9uZQorLy8vIGVsZW1lbnQgaW50byBhbm90aGVyKSBhcyBhIHNpbmdsZSBvcGVyYXRpb24sIHJhdGhlciB0aGFuIGFzIHR3byBvcGVyYXRpb25zCisvLy8gKGFuIGluc2VydGlvbiBhbmQgYSByZW1vdmFsKS4KKy8vLworLy8vIFxwYXJhbSBNYXhFZGl0RGlzdGFuY2UgSWYgbm9uLXplcm8sIHRoZSBtYXhpbXVtIGVkaXQgZGlzdGFuY2UgdGhhdCB0aGlzCisvLy8gcm91dGluZSBpcyBhbGxvd2VkIHRvIGNvbXB1dGUuIElmIHRoZSBlZGl0IGRpc3RhbmNlIHdpbGwgZXhjZWVkIHRoYXQKKy8vLyBtYXhpbXVtLCByZXR1cm5zIFxjIE1heEVkaXREaXN0YW5jZSsxLgorLy8vCisvLy8gXHJldHVybnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGVsZW1lbnQgaW5zZXJ0aW9ucywgcmVtb3ZhbHMsIG9yIChpZgorLy8vIFxwIEFsbG93UmVwbGFjZW1lbnRzIGlzIFxjIHRydWUpIHJlcGxhY2VtZW50cyBuZWVkZWQgdG8gdHJhbnNmb3JtIG9uZSBvZgorLy8vIHRoZSBnaXZlbiBzZXF1ZW5jZXMgaW50byB0aGUgb3RoZXIuIElmIHplcm8sIHRoZSBzZXF1ZW5jZXMgYXJlIGlkZW50aWNhbC4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit1bnNpZ25lZCBDb21wdXRlRWRpdERpc3RhbmNlKEFycmF5UmVmPFQ+IEZyb21BcnJheSwgQXJyYXlSZWY8VD4gVG9BcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd1JlcGxhY2VtZW50cyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heEVkaXREaXN0YW5jZSA9IDApIHsKKyAgLy8gVGhlIGFsZ29yaXRobSBpbXBsZW1lbnRlZCBiZWxvdyBpcyB0aGUgImNsYXNzaWMiCisgIC8vIGR5bmFtaWMtcHJvZ3JhbW1pbmcgYWxnb3JpdGhtIGZvciBjb21wdXRpbmcgdGhlIExldmVuc2h0ZWluCisgIC8vIGRpc3RhbmNlLCB3aGljaCBpcyBkZXNjcmliZWQgaGVyZToKKyAgLy8KKyAgLy8gICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xldmVuc2h0ZWluX2Rpc3RhbmNlCisgIC8vCisgIC8vIEFsdGhvdWdoIHRoZSBhbGdvcml0aG0gaXMgdHlwaWNhbGx5IGRlc2NyaWJlZCB1c2luZyBhbiBtIHggbgorICAvLyBhcnJheSwgb25seSBvbmUgcm93IHBsdXMgb25lIGVsZW1lbnQgYXJlIHVzZWQgYXQgYSB0aW1lLCBzbyB0aGlzCisgIC8vIGltcGxlbWVudGF0aW9uIGp1c3Qga2VlcHMgb25lIHZlY3RvciBmb3IgdGhlIHJvdy4gIFRvIHVwZGF0ZSBvbmUgZW50cnksCisgIC8vIG9ubHkgdGhlIGVudHJpZXMgdG8gdGhlIGxlZnQsIHRvcCwgYW5kIHRvcC1sZWZ0IGFyZSBuZWVkZWQuICBUaGUgbGVmdAorICAvLyBlbnRyeSBpcyBpbiBSb3dbeC0xXSwgdGhlIHRvcCBlbnRyeSBpcyB3aGF0J3MgaW4gUm93W3hdIGZyb20gdGhlIGxhc3QKKyAgLy8gaXRlcmF0aW9uLCBhbmQgdGhlIHRvcC1sZWZ0IGVudHJ5IGlzIHN0b3JlZCBpbiBQcmV2aW91cy4KKyAgdHlwZW5hbWUgQXJyYXlSZWY8VD46OnNpemVfdHlwZSBtID0gRnJvbUFycmF5LnNpemUoKTsKKyAgdHlwZW5hbWUgQXJyYXlSZWY8VD46OnNpemVfdHlwZSBuID0gVG9BcnJheS5zaXplKCk7CisKKyAgY29uc3QgdW5zaWduZWQgU21hbGxCdWZmZXJTaXplID0gNjQ7CisgIHVuc2lnbmVkIFNtYWxsQnVmZmVyW1NtYWxsQnVmZmVyU2l6ZV07CisgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZFtdPiBBbGxvY2F0ZWQ7CisgIHVuc2lnbmVkICpSb3cgPSBTbWFsbEJ1ZmZlcjsKKyAgaWYgKG4gKyAxID4gU21hbGxCdWZmZXJTaXplKSB7CisgICAgUm93ID0gbmV3IHVuc2lnbmVkW24gKyAxXTsKKyAgICBBbGxvY2F0ZWQucmVzZXQoUm93KTsKKyAgfQorCisgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPD0gbjsgKytpKQorICAgIFJvd1tpXSA9IGk7CisKKyAgZm9yICh0eXBlbmFtZSBBcnJheVJlZjxUPjo6c2l6ZV90eXBlIHkgPSAxOyB5IDw9IG07ICsreSkgeworICAgIFJvd1swXSA9IHk7CisgICAgdW5zaWduZWQgQmVzdFRoaXNSb3cgPSBSb3dbMF07CisKKyAgICB1bnNpZ25lZCBQcmV2aW91cyA9IHkgLSAxOworICAgIGZvciAodHlwZW5hbWUgQXJyYXlSZWY8VD46OnNpemVfdHlwZSB4ID0gMTsgeCA8PSBuOyArK3gpIHsKKyAgICAgIGludCBPbGRSb3cgPSBSb3dbeF07CisgICAgICBpZiAoQWxsb3dSZXBsYWNlbWVudHMpIHsKKyAgICAgICAgUm93W3hdID0gc3RkOjptaW4oCisgICAgICAgICAgICBQcmV2aW91cyArIChGcm9tQXJyYXlbeS0xXSA9PSBUb0FycmF5W3gtMV0gPyAwdSA6IDF1KSwKKyAgICAgICAgICAgIHN0ZDo6bWluKFJvd1t4LTFdLCBSb3dbeF0pKzEpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmIChGcm9tQXJyYXlbeS0xXSA9PSBUb0FycmF5W3gtMV0pIFJvd1t4XSA9IFByZXZpb3VzOworICAgICAgICBlbHNlIFJvd1t4XSA9IHN0ZDo6bWluKFJvd1t4LTFdLCBSb3dbeF0pICsgMTsKKyAgICAgIH0KKyAgICAgIFByZXZpb3VzID0gT2xkUm93OworICAgICAgQmVzdFRoaXNSb3cgPSBzdGQ6Om1pbihCZXN0VGhpc1JvdywgUm93W3hdKTsKKyAgICB9CisKKyAgICBpZiAoTWF4RWRpdERpc3RhbmNlICYmIEJlc3RUaGlzUm93ID4gTWF4RWRpdERpc3RhbmNlKQorICAgICAgcmV0dXJuIE1heEVkaXREaXN0YW5jZSArIDE7CisgIH0KKworICB1bnNpZ25lZCBSZXN1bHQgPSBSb3dbbl07CisgIHJldHVybiBSZXN1bHQ7Cit9CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvaWxpc3QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2lsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4OGY4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2lsaXN0LmgKQEAgLTAsMCArMSw0MzQgQEAKKy8vPT0tLSBsbHZtL0FEVC9pbGlzdC5oIC0gSW50cnVzaXZlIExpbmtlZCBMaXN0IFRlbXBsYXRlIC0tLS0tLS0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgY2xhc3NlcyB0byBpbXBsZW1lbnQgYW4gaW50cnVzaXZlIGRvdWJseSBsaW5rZWQgbGlzdCBjbGFzcworLy8gKGkuZS4gZWFjaCBub2RlIG9mIHRoZSBsaXN0IG11c3QgY29udGFpbiBhIG5leHQgYW5kIHByZXZpb3VzIGZpZWxkIGZvciB0aGUKKy8vIGxpc3QuCisvLworLy8gVGhlIGlsaXN0IGNsYXNzIGl0c2VsZiBzaG91bGQgYmUgYSBwbHVnIGluIHJlcGxhY2VtZW50IGZvciBsaXN0LiAgVGhpcyBsaXN0CisvLyByZXBsYWNlbWVudCBkb2VzIG5vdCBwcm92aWRlIGEgY29uc3RhbnQgdGltZSBzaXplKCkgbWV0aG9kLCBzbyBiZSBjYXJlZnVsIHRvCisvLyB1c2UgZW1wdHkoKSB3aGVuIHlvdSByZWFsbHkgd2FudCB0byBrbm93IGlmIGl0J3MgZW1wdHkuCisvLworLy8gVGhlIGlsaXN0IGNsYXNzIGlzIGltcGxlbWVudGVkIGFzIGEgY2lyY3VsYXIgbGlzdC4gIFRoZSBsaXN0IGl0c2VsZiBjb250YWlucworLy8gYSBzZW50aW5lbCBub2RlLCB3aG9zZSBOZXh0IHBvaW50cyBhdCBiZWdpbigpIGFuZCB3aG9zZSBQcmV2IHBvaW50cyBhdAorLy8gcmJlZ2luKCkuICBUaGUgc2VudGluZWwgbm9kZSBpdHNlbGYgc2VydmVzIGFzIGVuZCgpIGFuZCByZW5kKCkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9JTElTVF9ICisjZGVmaW5lIExMVk1fQURUX0lMSVNUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL3NpbXBsZV9pbGlzdC5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVXNlIGRlbGV0ZSBieSBkZWZhdWx0IGZvciBpcGxpc3QgYW5kIGlsaXN0LgorLy8vCisvLy8gU3BlY2lhbGl6ZSB0aGlzIHRvIGdldCBkaWZmZXJlbnQgYmVoYXZpb3VyIGZvciBvd25lcnNoaXAtcmVsYXRlZCBBUEkuICAoSWYKKy8vLyB5b3UgcmVhbGx5IHdhbnQgb3duZXJzaGlwIHNlbWFudGljcywgY29uc2lkZXIgdXNpbmcgc3RkOjpsaXN0IG9yIGJ1aWxkaW5nCisvLy8gc29tZXRoaW5nIGxpa2UgXGEgQnVtcFB0ckxpc3QuKQorLy8vCisvLy8gXHNlZSBpbGlzdF9ub2FsbG9jX3RyYWl0cwordGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVUeT4gc3RydWN0IGlsaXN0X2FsbG9jX3RyYWl0cyB7CisgIHN0YXRpYyB2b2lkIGRlbGV0ZU5vZGUoTm9kZVR5ICpWKSB7IGRlbGV0ZSBWOyB9Cit9OworCisvLy8gQ3VzdG9tIHRyYWl0cyB0byBkbyBub3RoaW5nIG9uIGRlbGV0aW9uLgorLy8vCisvLy8gU3BlY2lhbGl6ZSBpbGlzdF9hbGxvY190cmFpdHMgdG8gaW5oZXJpdCBmcm9tIHRoaXMgdG8gZGlzYWJsZSB0aGUKKy8vLyBub24taW50cnVzaXZlIGRlbGV0aW9uIGluIGlwbGlzdCAod2hpY2ggaW1wbGllcyBvd25lcnNoaXApLgorLy8vCisvLy8gSWYgeW91IHdhbnQgcHVyZWx5IGludHJ1c2l2ZSBzZW1hbnRpY3Mgd2l0aCBubyBjYWxsYmFja3MsIGNvbnNpZGVyIHVzaW5nIFxhCisvLy8gc2ltcGxlX2lsaXN0IGluc3RlYWQuCisvLy8KKy8vLyBcY29kZQorLy8vIHRlbXBsYXRlIDw+CisvLy8gc3RydWN0IGlsaXN0X2FsbG9jX3RyYWl0czxNeVR5cGU+IDogaWxpc3Rfbm9hbGxvY190cmFpdHM8TXlUeXBlPiB7fTsKKy8vLyBcZW5kY29kZQordGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVUeT4gc3RydWN0IGlsaXN0X25vYWxsb2NfdHJhaXRzIHsKKyAgc3RhdGljIHZvaWQgZGVsZXRlTm9kZShOb2RlVHkgKlYpIHt9Cit9OworCisvLy8gQ2FsbGJhY2tzIGRvIG5vdGhpbmcgYnkgZGVmYXVsdCBpbiBpcGxpc3QgYW5kIGlsaXN0LgorLy8vCisvLy8gU3BlY2lhbGl6ZSB0aGlzIGZvciB0byB1c2UgY2FsbGJhY2tzIGZvciB3aGVuIG5vZGVzIGNoYW5nZSB0aGVpciBsaXN0CisvLy8gbWVtYmVyc2hpcC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVHk+IHN0cnVjdCBpbGlzdF9jYWxsYmFja190cmFpdHMgeworICB2b2lkIGFkZE5vZGVUb0xpc3QoTm9kZVR5ICopIHt9CisgIHZvaWQgcmVtb3ZlTm9kZUZyb21MaXN0KE5vZGVUeSAqKSB7fQorCisgIC8vLyBDYWxsYmFjayBiZWZvcmUgdHJhbnNmZXJyaW5nIG5vZGVzIHRvIHRoaXMgbGlzdC4KKyAgLy8vCisgIC8vLyBccHJlIFxjIHRoaXMhPSZPbGRMaXN0CisgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4KKyAgdm9pZCB0cmFuc2Zlck5vZGVzRnJvbUxpc3QoaWxpc3RfY2FsbGJhY2tfdHJhaXRzICZPbGRMaXN0LCBJdGVyYXRvciAvKmZpcnN0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIC8qbGFzdCovKSB7CisgICAgKHZvaWQpT2xkTGlzdDsKKyAgfQorfTsKKworLy8vIEEgZnJhZ21lbnQgZm9yIHRlbXBsYXRlIHRyYWl0cyBmb3IgaW50cnVzaXZlIGxpc3QgdGhhdCBwcm92aWRlcyBkZWZhdWx0CisvLy8gbm9kZSByZWxhdGVkIG9wZXJhdGlvbnMuCisvLy8KKy8vLyBUT0RPOiBSZW1vdmUgdGhpcyBsYXllciBvZiBpbmRpcmVjdGlvbi4gIEl0J3Mgbm90IG5lY2Vzc2FyeS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVHk+CitzdHJ1Y3QgaWxpc3Rfbm9kZV90cmFpdHMgOiBpbGlzdF9hbGxvY190cmFpdHM8Tm9kZVR5PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlsaXN0X2NhbGxiYWNrX3RyYWl0czxOb2RlVHk+IHt9OworCisvLy8gRGVmYXVsdCB0ZW1wbGF0ZSB0cmFpdHMgZm9yIGludHJ1c2l2ZSBsaXN0LgorLy8vCisvLy8gQnkgaW5oZXJpdGluZyBmcm9tIHRoaXMsIHlvdSBjYW4gZWFzaWx5IHVzZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBmb3IgYWxsCisvLy8gY29tbW9uIG9wZXJhdGlvbnMuCisvLy8KKy8vLyBUT0RPOiBSZW1vdmUgdGhpcyBjdXN0b21pemF0aW9uIHBvaW50LiAgU3BlY2lhbGl6aW5nIGlsaXN0X3RyYWl0cyBpcworLy8vIGFscmVhZHkgZnVsbHkgZ2VuZXJhbC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVHk+CitzdHJ1Y3QgaWxpc3RfZGVmYXVsdF90cmFpdHMgOiBwdWJsaWMgaWxpc3Rfbm9kZV90cmFpdHM8Tm9kZVR5PiB7fTsKKworLy8vIFRlbXBsYXRlIHRyYWl0cyBmb3IgaW50cnVzaXZlIGxpc3QuCisvLy8KKy8vLyBDdXN0b21pemUgY2FsbGJhY2tzIGFuZCBhbGxvY2F0aW9uIHNlbWFudGljcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVHk+CitzdHJ1Y3QgaWxpc3RfdHJhaXRzIDogcHVibGljIGlsaXN0X2RlZmF1bHRfdHJhaXRzPE5vZGVUeT4ge307CisKKy8vLyBDb25zdCB0cmFpdHMgc2hvdWxkIG5ldmVyIGJlIGluc3RhbnRpYXRlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUeT4gc3RydWN0IGlsaXN0X3RyYWl0czxjb25zdCBUeT4ge307CisKK25hbWVzcGFjZSBpbGlzdF9kZXRhaWwgeworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gVCAmbWFrZSgpOworCisvLy8gVHlwZSB0cmFpdCB0byBjaGVjayBmb3IgYSB0cmFpdHMgY2xhc3MgdGhhdCBoYXMgYSBnZXROZXh0IG1lbWJlciAoYXMgYQorLy8vIGNhbmFyeSBmb3IgYW55IG9mIHRoZSBpbGlzdF9uZXh0cHJldl90cmFpdHMgQVBJKS4KK3RlbXBsYXRlIDxjbGFzcyBUcmFpdHNULCBjbGFzcyBOb2RlVD4gc3RydWN0IEhhc0dldE5leHQgeworICB0eXBlZGVmIGNoYXIgWWVzWzFdOworICB0eXBlZGVmIGNoYXIgTm9bMl07CisgIHRlbXBsYXRlIDxzaXplX3QgTj4gc3RydWN0IFNGSU5BRSB7fTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVT4KKyAgc3RhdGljIFllcyAmdGVzdChVICpJLCBkZWNsdHlwZShJLT5nZXROZXh0KCZtYWtlPE5vZGVUPigpKSkgKiA9IDApOworICB0ZW1wbGF0ZSA8Y2xhc3M+IHN0YXRpYyBObyAmdGVzdCguLi4pOworCitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gc2l6ZW9mKHRlc3Q8VHJhaXRzVD4obnVsbHB0cikpID09IHNpemVvZihZZXMpOworfTsKKworLy8vIFR5cGUgdHJhaXQgdG8gY2hlY2sgZm9yIGEgdHJhaXRzIGNsYXNzIHRoYXQgaGFzIGEgY3JlYXRlU2VudGluZWwgbWVtYmVyIChhcworLy8vIGEgY2FuYXJ5IGZvciBhbnkgb2YgdGhlIGlsaXN0X3NlbnRpbmVsX3RyYWl0cyBBUEkpLgordGVtcGxhdGUgPGNsYXNzIFRyYWl0c1Q+IHN0cnVjdCBIYXNDcmVhdGVTZW50aW5lbCB7CisgIHR5cGVkZWYgY2hhciBZZXNbMV07CisgIHR5cGVkZWYgY2hhciBOb1syXTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVT4KKyAgc3RhdGljIFllcyAmdGVzdChVICpJLCBkZWNsdHlwZShJLT5jcmVhdGVTZW50aW5lbCgpKSAqID0gMCk7CisgIHRlbXBsYXRlIDxjbGFzcz4gc3RhdGljIE5vICZ0ZXN0KC4uLik7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBzaXplb2YodGVzdDxUcmFpdHNUPihudWxscHRyKSkgPT0gc2l6ZW9mKFllcyk7Cit9OworCisvLy8gVHlwZSB0cmFpdCB0byBjaGVjayBmb3IgYSB0cmFpdHMgY2xhc3MgdGhhdCBoYXMgYSBjcmVhdGVOb2RlIG1lbWJlci4KKy8vLyBBbGxvY2F0aW9uIHNob3VsZCBiZSBtYW5hZ2VkIGluIGEgd3JhcHBlciBjbGFzcywgaW5zdGVhZCBvZiBpbgorLy8vIGlsaXN0X3RyYWl0cy4KK3RlbXBsYXRlIDxjbGFzcyBUcmFpdHNULCBjbGFzcyBOb2RlVD4gc3RydWN0IEhhc0NyZWF0ZU5vZGUgeworICB0eXBlZGVmIGNoYXIgWWVzWzFdOworICB0eXBlZGVmIGNoYXIgTm9bMl07CisgIHRlbXBsYXRlIDxzaXplX3QgTj4gc3RydWN0IFNGSU5BRSB7fTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVT4KKyAgc3RhdGljIFllcyAmdGVzdChVICpJLCBkZWNsdHlwZShJLT5jcmVhdGVOb2RlKG1ha2U8Tm9kZVQ+KCkpKSAqID0gMCk7CisgIHRlbXBsYXRlIDxjbGFzcz4gc3RhdGljIE5vICZ0ZXN0KC4uLik7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBzaXplb2YodGVzdDxUcmFpdHNUPihudWxscHRyKSkgPT0gc2l6ZW9mKFllcyk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXRzVCwgY2xhc3MgTm9kZVQ+IHN0cnVjdCBIYXNPYnNvbGV0ZUN1c3RvbWl6YXRpb24geworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IEhhc0dldE5leHQ8VHJhaXRzVCwgTm9kZVQ+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc0NyZWF0ZVNlbnRpbmVsPFRyYWl0c1Q+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc0NyZWF0ZU5vZGU8VHJhaXRzVCwgTm9kZVQ+Ojp2YWx1ZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbGlzdF9kZXRhaWwKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gQSB3cmFwcGVyIGFyb3VuZCBhbiBpbnRydXNpdmUgbGlzdCB3aXRoIGNhbGxiYWNrcyBhbmQgbm9uLWludHJ1c2l2ZQorLy8vIG93bmVyc2hpcC4KKy8vLworLy8vIFRoaXMgd3JhcHMgYSBwdXJlbHkgaW50cnVzaXZlIGxpc3QgKGxpa2Ugc2ltcGxlX2lsaXN0KSB3aXRoIGEgY29uZmlndXJhYmxlCisvLy8gdHJhaXRzIGNsYXNzLiAgVGhlIHRyYWl0cyBjYW4gaW1wbGVtZW50IGNhbGxiYWNrcyBhbmQgY3VzdG9taXplIHRoZQorLy8vIG93bmVyc2hpcCBzZW1hbnRpY3MuCisvLy8KKy8vLyBUaGlzIGlzIGEgc3Vic2V0IG9mIGlsaXN0IGZ1bmN0aW9uYWxpdHkgdGhhdCBjYW4gc2FmZWx5IGJlIHVzZWQgb24gbm9kZXMgb2YKKy8vLyBwb2x5bW9ycGhpYyB0eXBlcywgaS5lLiBhIGhldGVyb2dlbmVvdXMgbGlzdCB3aXRoIGEgY29tbW9uIGJhc2UgY2xhc3MgdGhhdAorLy8vIGhvbGRzIHRoZSBuZXh0L3ByZXYgcG9pbnRlcnMuICBUaGUgb25seSBzdGF0ZSBvZiB0aGUgbGlzdCBpdHNlbGYgaXMgYW4KKy8vLyBpbGlzdF9zZW50aW5lbCwgd2hpY2ggaG9sZHMgcG9pbnRlcnMgdG8gdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGVzIGluIHRoZQorLy8vIGxpc3QuCit0ZW1wbGF0ZSA8Y2xhc3MgSW50cnVzaXZlTGlzdFQsIGNsYXNzIFRyYWl0c1Q+CitjbGFzcyBpcGxpc3RfaW1wbCA6IHB1YmxpYyBUcmFpdHNULCBJbnRydXNpdmVMaXN0VCB7CisgIHR5cGVkZWYgSW50cnVzaXZlTGlzdFQgYmFzZV9saXN0X3R5cGU7CisKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBpcGxpc3RfaW1wbCBpcGxpc3RfaW1wbF90eXBlOworCitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV9saXN0X3R5cGU6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX2xpc3RfdHlwZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfbGlzdF90eXBlOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfbGlzdF90eXBlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfbGlzdF90eXBlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV9saXN0X3R5cGU6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV9saXN0X3R5cGU6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV9saXN0X3R5cGU6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfbGlzdF90eXBlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX2xpc3RfdHlwZTo6cmV2ZXJzZV9pdGVyYXRvciByZXZlcnNlX2l0ZXJhdG9yOworICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBiYXNlX2xpc3RfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCitwcml2YXRlOgorICAvLyBUT0RPOiBEcm9wIHRoaXMgYXNzZXJ0aW9uIGFuZCB0aGUgdHJhbnNpdGl2ZSB0eXBlIHRyYWl0cyBhbnl0aW1lIGFmdGVyCisgIC8vIHY0LjAgaXMgYnJhbmNoZWQgKGkuZSwuIGtlZXAgdGhlbSBmb3Igb25lIHJlbGVhc2UgdG8gaGVscCBvdXQtb2YtdHJlZSBjb2RlCisgIC8vIHVwZGF0ZSkuCisgIHN0YXRpY19hc3NlcnQoCisgICAgICAhaWxpc3RfZGV0YWlsOjpIYXNPYnNvbGV0ZUN1c3RvbWl6YXRpb248VHJhaXRzVCwgdmFsdWVfdHlwZT46OnZhbHVlLAorICAgICAgImlsaXN0IGN1c3RvbWl6YXRpb24gcG9pbnRzIGhhdmUgY2hhbmdlZCEiKTsKKworICBzdGF0aWMgYm9vbCBvcF9sZXNzKGNvbnN0X3JlZmVyZW5jZSBMLCBjb25zdF9yZWZlcmVuY2UgUikgeyByZXR1cm4gTCA8IFI7IH0KKyAgc3RhdGljIGJvb2wgb3BfZXF1YWwoY29uc3RfcmVmZXJlbmNlIEwsIGNvbnN0X3JlZmVyZW5jZSBSKSB7IHJldHVybiBMID09IFI7IH0KKworcHVibGljOgorICBpcGxpc3RfaW1wbCgpID0gZGVmYXVsdDsKKworICBpcGxpc3RfaW1wbChjb25zdCBpcGxpc3RfaW1wbCAmKSA9IGRlbGV0ZTsKKyAgaXBsaXN0X2ltcGwgJm9wZXJhdG9yPShjb25zdCBpcGxpc3RfaW1wbCAmKSA9IGRlbGV0ZTsKKworICBpcGxpc3RfaW1wbChpcGxpc3RfaW1wbCAmJlgpCisgICAgICA6IFRyYWl0c1Qoc3RkOjptb3ZlKFgpKSwgSW50cnVzaXZlTGlzdFQoc3RkOjptb3ZlKFgpKSB7fQorICBpcGxpc3RfaW1wbCAmb3BlcmF0b3I9KGlwbGlzdF9pbXBsICYmWCkgeworICAgICpzdGF0aWNfY2FzdDxUcmFpdHNUICo+KHRoaXMpID0gc3RkOjptb3ZlKFgpOworICAgICpzdGF0aWNfY2FzdDxJbnRydXNpdmVMaXN0VCAqPih0aGlzKSA9IHN0ZDo6bW92ZShYKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB+aXBsaXN0X2ltcGwoKSB7IGNsZWFyKCk7IH0KKworICAvLyBNaXNjZWxsYW5lb3VzIGluc3BlY3Rpb24gcm91dGluZXMuCisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfdHlwZSgtMSk7IH0KKworICB1c2luZyBiYXNlX2xpc3RfdHlwZTo6YmVnaW47CisgIHVzaW5nIGJhc2VfbGlzdF90eXBlOjplbmQ7CisgIHVzaW5nIGJhc2VfbGlzdF90eXBlOjpyYmVnaW47CisgIHVzaW5nIGJhc2VfbGlzdF90eXBlOjpyZW5kOworICB1c2luZyBiYXNlX2xpc3RfdHlwZTo6ZW1wdHk7CisgIHVzaW5nIGJhc2VfbGlzdF90eXBlOjpmcm9udDsKKyAgdXNpbmcgYmFzZV9saXN0X3R5cGU6OmJhY2s7CisKKyAgdm9pZCBzd2FwKGlwbGlzdF9pbXBsICZSSFMpIHsKKyAgICBhc3NlcnQoMCAmJiAiU3dhcCBkb2VzIG5vdCB1c2UgbGlzdCB0cmFpdHMgY2FsbGJhY2sgY29ycmVjdGx5IHlldCEiKTsKKyAgICBiYXNlX2xpc3RfdHlwZTo6c3dhcChSSFMpOworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIHdoZXJlLCBwb2ludGVyIE5ldykgeworICAgIHRoaXMtPmFkZE5vZGVUb0xpc3QoTmV3KTsgLy8gTm90aWZ5IHRyYWl0cyB0aGF0IHdlIGFkZGVkIGEgbm9kZS4uLgorICAgIHJldHVybiBiYXNlX2xpc3RfdHlwZTo6aW5zZXJ0KHdoZXJlLCAqTmV3KTsKKyAgfQorCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciB3aGVyZSwgY29uc3RfcmVmZXJlbmNlIE5ldykgeworICAgIHJldHVybiB0aGlzLT5pbnNlcnQod2hlcmUsIG5ldyB2YWx1ZV90eXBlKE5ldykpOworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0QWZ0ZXIoaXRlcmF0b3Igd2hlcmUsIHBvaW50ZXIgTmV3KSB7CisgICAgaWYgKGVtcHR5KCkpCisgICAgICByZXR1cm4gaW5zZXJ0KGJlZ2luKCksIE5ldyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGluc2VydCgrK3doZXJlLCBOZXcpOworICB9CisKKyAgLy8vIENsb25lIGFub3RoZXIgbGlzdC4KKyAgdGVtcGxhdGUgPGNsYXNzIENsb25lcj4gdm9pZCBjbG9uZUZyb20oY29uc3QgaXBsaXN0X2ltcGwgJkwyLCBDbG9uZXIgY2xvbmUpIHsKKyAgICBjbGVhcigpOworICAgIGZvciAoY29uc3RfcmVmZXJlbmNlIFYgOiBMMikKKyAgICAgIHB1c2hfYmFjayhjbG9uZShWKSk7CisgIH0KKworICBwb2ludGVyIHJlbW92ZShpdGVyYXRvciAmSVQpIHsKKyAgICBwb2ludGVyIE5vZGUgPSAmKklUKys7CisgICAgdGhpcy0+cmVtb3ZlTm9kZUZyb21MaXN0KE5vZGUpOyAvLyBOb3RpZnkgdHJhaXRzIHRoYXQgd2UgcmVtb3ZlZCBhIG5vZGUuLi4KKyAgICBiYXNlX2xpc3RfdHlwZTo6cmVtb3ZlKCpOb2RlKTsKKyAgICByZXR1cm4gTm9kZTsKKyAgfQorCisgIHBvaW50ZXIgcmVtb3ZlKGNvbnN0IGl0ZXJhdG9yICZJVCkgeworICAgIGl0ZXJhdG9yIE11dEl0ID0gSVQ7CisgICAgcmV0dXJuIHJlbW92ZShNdXRJdCk7CisgIH0KKworICBwb2ludGVyIHJlbW92ZShwb2ludGVyIElUKSB7IHJldHVybiByZW1vdmUoaXRlcmF0b3IoSVQpKTsgfQorICBwb2ludGVyIHJlbW92ZShyZWZlcmVuY2UgSVQpIHsgcmV0dXJuIHJlbW92ZShpdGVyYXRvcihJVCkpOyB9CisKKyAgLy8gZXJhc2UgLSByZW1vdmUgYSBub2RlIGZyb20gdGhlIGNvbnRyb2xsZWQgc2VxdWVuY2UuLi4gYW5kIGRlbGV0ZSBpdC4KKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3Igd2hlcmUpIHsKKyAgICB0aGlzLT5kZWxldGVOb2RlKHJlbW92ZSh3aGVyZSkpOworICAgIHJldHVybiB3aGVyZTsKKyAgfQorCisgIGl0ZXJhdG9yIGVyYXNlKHBvaW50ZXIgSVQpIHsgcmV0dXJuIGVyYXNlKGl0ZXJhdG9yKElUKSk7IH0KKyAgaXRlcmF0b3IgZXJhc2UocmVmZXJlbmNlIElUKSB7IHJldHVybiBlcmFzZShpdGVyYXRvcihJVCkpOyB9CisKKyAgLy8vIFJlbW92ZSBhbGwgbm9kZXMgZnJvbSB0aGUgbGlzdCBsaWtlIGNsZWFyKCksIGJ1dCBkbyBub3QgY2FsbAorICAvLy8gcmVtb3ZlTm9kZUZyb21MaXN0KCkgb3IgZGVsZXRlTm9kZSgpLgorICAvLy8KKyAgLy8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbW1lZGlhdGVseSBiZWZvcmUgZnJlZWluZyBub2RlcyBpbiBidWxrIHRvCisgIC8vLyBhdm9pZCB0cmF2ZXJzaW5nIHRoZSBsaXN0IGFuZCBicmluZ2luZyBhbGwgdGhlIG5vZGVzIGludG8gY2FjaGUuCisgIHZvaWQgY2xlYXJBbmRMZWFrTm9kZXNVbnNhZmVseSgpIHsgYmFzZV9saXN0X3R5cGU6OmNsZWFyKCk7IH0KKworcHJpdmF0ZToKKyAgLy8gdHJhbnNmZXIgLSBUaGUgaGVhcnQgb2YgdGhlIHNwbGljZSBmdW5jdGlvbi4gIE1vdmUgbGlua2VkIGxpc3Qgbm9kZXMgZnJvbQorICAvLyBbZmlyc3QsIGxhc3QpIGludG8gcG9zaXRpb24uCisgIC8vCisgIHZvaWQgdHJhbnNmZXIoaXRlcmF0b3IgcG9zaXRpb24sIGlwbGlzdF9pbXBsICZMMiwgaXRlcmF0b3IgZmlyc3QsIGl0ZXJhdG9yIGxhc3QpIHsKKyAgICBpZiAocG9zaXRpb24gPT0gbGFzdCkKKyAgICAgIHJldHVybjsKKworICAgIGlmICh0aGlzICE9ICZMMikgLy8gTm90aWZ5IHRyYWl0cyB3ZSBtb3ZlZCB0aGUgbm9kZXMuLi4KKyAgICAgIHRoaXMtPnRyYW5zZmVyTm9kZXNGcm9tTGlzdChMMiwgZmlyc3QsIGxhc3QpOworCisgICAgYmFzZV9saXN0X3R5cGU6OnNwbGljZShwb3NpdGlvbiwgTDIsIGZpcnN0LCBsYXN0KTsKKyAgfQorCitwdWJsaWM6CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICAvLyBGdW5jdGlvbmFsaXR5IGRlcml2ZWQgZnJvbSBvdGhlciBmdW5jdGlvbnMgZGVmaW5lZCBhYm92ZS4uLgorICAvLworCisgIHVzaW5nIGJhc2VfbGlzdF90eXBlOjpzaXplOworCisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIGZpcnN0LCBpdGVyYXRvciBsYXN0KSB7CisgICAgd2hpbGUgKGZpcnN0ICE9IGxhc3QpCisgICAgICBmaXJzdCA9IGVyYXNlKGZpcnN0KTsKKyAgICByZXR1cm4gbGFzdDsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7IGVyYXNlKGJlZ2luKCksIGVuZCgpKTsgfQorCisgIC8vIEZyb250IGFuZCBiYWNrIGluc2VydGVycy4uLgorICB2b2lkIHB1c2hfZnJvbnQocG9pbnRlciB2YWwpIHsgaW5zZXJ0KGJlZ2luKCksIHZhbCk7IH0KKyAgdm9pZCBwdXNoX2JhY2socG9pbnRlciB2YWwpIHsgaW5zZXJ0KGVuZCgpLCB2YWwpOyB9CisgIHZvaWQgcG9wX2Zyb250KCkgeworICAgIGFzc2VydCghZW1wdHkoKSAmJiAicG9wX2Zyb250KCkgb24gZW1wdHkgbGlzdCEiKTsKKyAgICBlcmFzZShiZWdpbigpKTsKKyAgfQorICB2b2lkIHBvcF9iYWNrKCkgeworICAgIGFzc2VydCghZW1wdHkoKSAmJiAicG9wX2JhY2soKSBvbiBlbXB0eSBsaXN0ISIpOworICAgIGl0ZXJhdG9yIHQgPSBlbmQoKTsgZXJhc2UoLS10KTsKKyAgfQorCisgIC8vIFNwZWNpYWwgZm9ybXMgb2YgaW5zZXJ0Li4uCisgIHRlbXBsYXRlPGNsYXNzIEluSXQ+IHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIHdoZXJlLCBJbkl0IGZpcnN0LCBJbkl0IGxhc3QpIHsKKyAgICBmb3IgKDsgZmlyc3QgIT0gbGFzdDsgKytmaXJzdCkgaW5zZXJ0KHdoZXJlLCAqZmlyc3QpOworICB9CisKKyAgLy8gU3BsaWNlIG1lbWJlcnMgLSBkZWZpbmVkIGluIHRlcm1zIG9mIHRyYW5zZmVyLi4uCisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIHdoZXJlLCBpcGxpc3RfaW1wbCAmTDIpIHsKKyAgICBpZiAoIUwyLmVtcHR5KCkpCisgICAgICB0cmFuc2Zlcih3aGVyZSwgTDIsIEwyLmJlZ2luKCksIEwyLmVuZCgpKTsKKyAgfQorICB2b2lkIHNwbGljZShpdGVyYXRvciB3aGVyZSwgaXBsaXN0X2ltcGwgJkwyLCBpdGVyYXRvciBmaXJzdCkgeworICAgIGl0ZXJhdG9yIGxhc3QgPSBmaXJzdDsgKytsYXN0OworICAgIGlmICh3aGVyZSA9PSBmaXJzdCB8fCB3aGVyZSA9PSBsYXN0KSByZXR1cm47IC8vIE5vIGNoYW5nZQorICAgIHRyYW5zZmVyKHdoZXJlLCBMMiwgZmlyc3QsIGxhc3QpOworICB9CisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIHdoZXJlLCBpcGxpc3RfaW1wbCAmTDIsIGl0ZXJhdG9yIGZpcnN0LCBpdGVyYXRvciBsYXN0KSB7CisgICAgaWYgKGZpcnN0ICE9IGxhc3QpIHRyYW5zZmVyKHdoZXJlLCBMMiwgZmlyc3QsIGxhc3QpOworICB9CisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIHdoZXJlLCBpcGxpc3RfaW1wbCAmTDIsIHJlZmVyZW5jZSBOKSB7CisgICAgc3BsaWNlKHdoZXJlLCBMMiwgaXRlcmF0b3IoTikpOworICB9CisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIHdoZXJlLCBpcGxpc3RfaW1wbCAmTDIsIHBvaW50ZXIgTikgeworICAgIHNwbGljZSh3aGVyZSwgTDIsIGl0ZXJhdG9yKE4pKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDb21wYXJlPgorICB2b2lkIG1lcmdlKGlwbGlzdF9pbXBsICZSaWdodCwgQ29tcGFyZSBjb21wKSB7CisgICAgaWYgKHRoaXMgPT0gJlJpZ2h0KQorICAgICAgcmV0dXJuOworICAgIHRoaXMtPnRyYW5zZmVyTm9kZXNGcm9tTGlzdChSaWdodCwgUmlnaHQuYmVnaW4oKSwgUmlnaHQuZW5kKCkpOworICAgIGJhc2VfbGlzdF90eXBlOjptZXJnZShSaWdodCwgY29tcCk7CisgIH0KKyAgdm9pZCBtZXJnZShpcGxpc3RfaW1wbCAmUmlnaHQpIHsgcmV0dXJuIG1lcmdlKFJpZ2h0LCBvcF9sZXNzKTsgfQorCisgIHVzaW5nIGJhc2VfbGlzdF90eXBlOjpzb3J0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBwcmV2aW91cyBub2RlLCBvciBcYyBudWxscHRyIGZvciB0aGUgbGlzdCBoZWFkLgorICBwb2ludGVyIGdldFByZXZOb2RlKHJlZmVyZW5jZSBOKSBjb25zdCB7CisgICAgYXV0byBJID0gTi5nZXRJdGVyYXRvcigpOworICAgIGlmIChJID09IGJlZ2luKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gJipzdGQ6OnByZXYoSSk7CisgIH0KKyAgLy8vIFxicmllZiBHZXQgdGhlIHByZXZpb3VzIG5vZGUsIG9yIFxjIG51bGxwdHIgZm9yIHRoZSBsaXN0IGhlYWQuCisgIGNvbnN0X3BvaW50ZXIgZ2V0UHJldk5vZGUoY29uc3RfcmVmZXJlbmNlIE4pIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UHJldk5vZGUoY29uc3RfY2FzdDxyZWZlcmVuY2UgPihOKSk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbmV4dCBub2RlLCBvciBcYyBudWxscHRyIGZvciB0aGUgbGlzdCB0YWlsLgorICBwb2ludGVyIGdldE5leHROb2RlKHJlZmVyZW5jZSBOKSBjb25zdCB7CisgICAgYXV0byBOZXh0ID0gc3RkOjpuZXh0KE4uZ2V0SXRlcmF0b3IoKSk7CisgICAgaWYgKE5leHQgPT0gZW5kKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gJipOZXh0OworICB9CisgIC8vLyBcYnJpZWYgR2V0IHRoZSBuZXh0IG5vZGUsIG9yIFxjIG51bGxwdHIgZm9yIHRoZSBsaXN0IHRhaWwuCisgIGNvbnN0X3BvaW50ZXIgZ2V0TmV4dE5vZGUoY29uc3RfcmVmZXJlbmNlIE4pIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TmV4dE5vZGUoY29uc3RfY2FzdDxyZWZlcmVuY2UgPihOKSk7CisgIH0KK307CisKKy8vLyBBbiBpbnRydXNpdmUgbGlzdCB3aXRoIG93bmVyc2hpcCBhbmQgY2FsbGJhY2tzIHNwZWNpZmllZC9jb250cm9sbGVkIGJ5CisvLy8gaWxpc3RfdHJhaXRzLCBvbmx5IHdpdGggQVBJIHNhZmUgZm9yIHBvbHltb3JwaGljIHR5cGVzLgorLy8vCisvLy8gVGhlIFxwIE9wdGlvbnMgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgZm9yIFxhIHNpbXBsZV9pbGlzdC4gIFNlZQorLy8vIHRoZXJlIGZvciBhIGRlc2NyaXB0aW9uIG9mIHdoYXQncyBhdmFpbGFibGUuCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MuLi4gT3B0aW9ucz4KK2NsYXNzIGlwbGlzdAorICAgIDogcHVibGljIGlwbGlzdF9pbXBsPHNpbXBsZV9pbGlzdDxULCBPcHRpb25zLi4uPiwgaWxpc3RfdHJhaXRzPFQ+PiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgaXBsaXN0OjppcGxpc3RfaW1wbF90eXBlIGlwbGlzdF9pbXBsX3R5cGU7CisKK3B1YmxpYzoKKyAgaXBsaXN0KCkgPSBkZWZhdWx0OworCisgIGlwbGlzdChjb25zdCBpcGxpc3QgJlgpID0gZGVsZXRlOworICBpcGxpc3QgJm9wZXJhdG9yPShjb25zdCBpcGxpc3QgJlgpID0gZGVsZXRlOworCisgIGlwbGlzdChpcGxpc3QgJiZYKSA6IGlwbGlzdF9pbXBsX3R5cGUoc3RkOjptb3ZlKFgpKSB7fQorICBpcGxpc3QgJm9wZXJhdG9yPShpcGxpc3QgJiZYKSB7CisgICAgKnN0YXRpY19jYXN0PGlwbGlzdF9pbXBsX3R5cGUgKj4odGhpcykgPSBzdGQ6Om1vdmUoWCk7CisgICAgcmV0dXJuICp0aGlzOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MuLi4gT3B0aW9ucz4gdXNpbmcgaWxpc3QgPSBpcGxpc3Q8VCwgT3B0aW9ucy4uLj47CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBzdGQgeworCisgIC8vIEVuc3VyZSB0aGF0IHN3YXAgdXNlcyB0aGUgZmFzdCBsaXN0IHN3YXAuLi4KKyAgdGVtcGxhdGU8Y2xhc3MgVHk+CisgIHZvaWQgc3dhcChsbHZtOjppcGxpc3Q8VHk+ICZMZWZ0LCBsbHZtOjppcGxpc3Q8VHk+ICZSaWdodCkgeworICAgIExlZnQuc3dhcChSaWdodCk7CisgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gTExWTV9BRFRfSUxJU1RfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvaWxpc3RfYmFzZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvaWxpc3RfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkODE4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9pbGlzdF9iYXNlLmgKQEAgLTAsMCArMSw5MyBAQAorLy89PT0tIGxsdm0vQURUL2lsaXN0X2Jhc2UuaCAtIEludHJ1c2l2ZSBMaXN0IEJhc2UgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9JTElTVF9CQVNFX0gKKyNkZWZpbmUgTExWTV9BRFRfSUxJU1RfQkFTRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9ub2RlX2Jhc2UuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBJbXBsZW1lbnRhdGlvbnMgb2YgbGlzdCBhbGdvcml0aG1zIHVzaW5nIGlsaXN0X25vZGVfYmFzZS4KK3RlbXBsYXRlIDxib29sIEVuYWJsZVNlbnRpbmVsVHJhY2tpbmc+IGNsYXNzIGlsaXN0X2Jhc2UgeworcHVibGljOgorICB1c2luZyBub2RlX2Jhc2VfdHlwZSA9IGlsaXN0X25vZGVfYmFzZTxFbmFibGVTZW50aW5lbFRyYWNraW5nPjsKKworICBzdGF0aWMgdm9pZCBpbnNlcnRCZWZvcmVJbXBsKG5vZGVfYmFzZV90eXBlICZOZXh0LCBub2RlX2Jhc2VfdHlwZSAmTikgeworICAgIG5vZGVfYmFzZV90eXBlICZQcmV2ID0gKk5leHQuZ2V0UHJldigpOworICAgIE4uc2V0TmV4dCgmTmV4dCk7CisgICAgTi5zZXRQcmV2KCZQcmV2KTsKKyAgICBQcmV2LnNldE5leHQoJk4pOworICAgIE5leHQuc2V0UHJldigmTik7CisgIH0KKworICBzdGF0aWMgdm9pZCByZW1vdmVJbXBsKG5vZGVfYmFzZV90eXBlICZOKSB7CisgICAgbm9kZV9iYXNlX3R5cGUgKlByZXYgPSBOLmdldFByZXYoKTsKKyAgICBub2RlX2Jhc2VfdHlwZSAqTmV4dCA9IE4uZ2V0TmV4dCgpOworICAgIE5leHQtPnNldFByZXYoUHJldik7CisgICAgUHJldi0+c2V0TmV4dChOZXh0KTsKKworICAgIC8vIE5vdCBzdHJpY3RseSBuZWNlc3NhcnksIGJ1dCBoZWxwcyBjYXRjaCBhIGNsYXNzIG9mIGJ1Z3MuCisgICAgTi5zZXRQcmV2KG51bGxwdHIpOworICAgIE4uc2V0TmV4dChudWxscHRyKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIHJlbW92ZVJhbmdlSW1wbChub2RlX2Jhc2VfdHlwZSAmRmlyc3QsIG5vZGVfYmFzZV90eXBlICZMYXN0KSB7CisgICAgbm9kZV9iYXNlX3R5cGUgKlByZXYgPSBGaXJzdC5nZXRQcmV2KCk7CisgICAgbm9kZV9iYXNlX3R5cGUgKkZpbmFsID0gTGFzdC5nZXRQcmV2KCk7CisgICAgTGFzdC5zZXRQcmV2KFByZXYpOworICAgIFByZXYtPnNldE5leHQoJkxhc3QpOworCisgICAgLy8gTm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0IGhlbHBzIGNhdGNoIGEgY2xhc3Mgb2YgYnVncy4KKyAgICBGaXJzdC5zZXRQcmV2KG51bGxwdHIpOworICAgIEZpbmFsLT5zZXROZXh0KG51bGxwdHIpOworICB9CisKKyAgc3RhdGljIHZvaWQgdHJhbnNmZXJCZWZvcmVJbXBsKG5vZGVfYmFzZV90eXBlICZOZXh0LCBub2RlX2Jhc2VfdHlwZSAmRmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlX2Jhc2VfdHlwZSAmTGFzdCkgeworICAgIGlmICgmTmV4dCA9PSAmTGFzdCB8fCAmRmlyc3QgPT0gJkxhc3QpCisgICAgICByZXR1cm47CisKKyAgICAvLyBQb3NpdGlvbiBjYW5ub3QgYmUgY29udGFpbmVkIGluIHRoZSByYW5nZSB0byBiZSB0cmFuc2ZlcnJlZC4KKyAgICBhc3NlcnQoJk5leHQgIT0gJkZpcnN0ICYmCisgICAgICAgICAgIC8vIENoZWNrIGZvciB0aGUgbW9zdCBjb21tb24gbWlzdGFrZS4KKyAgICAgICAgICAgIkluc2VydGlvbiBwb2ludCBjYW4ndCBiZSBvbmUgb2YgdGhlIHRyYW5zZmVycmVkIG5vZGVzIik7CisKKyAgICBub2RlX2Jhc2VfdHlwZSAmRmluYWwgPSAqTGFzdC5nZXRQcmV2KCk7CisKKyAgICAvLyBEZXRhY2ggZnJvbSBvbGQgbGlzdC9wb3NpdGlvbi4KKyAgICBGaXJzdC5nZXRQcmV2KCktPnNldE5leHQoJkxhc3QpOworICAgIExhc3Quc2V0UHJldihGaXJzdC5nZXRQcmV2KCkpOworCisgICAgLy8gU3BsaWNlIFtGaXJzdCwgRmluYWxdIGludG8gaXRzIG5ldyBsaXN0L3Bvc2l0aW9uLgorICAgIG5vZGVfYmFzZV90eXBlICZQcmV2ID0gKk5leHQuZ2V0UHJldigpOworICAgIEZpbmFsLnNldE5leHQoJk5leHQpOworICAgIEZpcnN0LnNldFByZXYoJlByZXYpOworICAgIFByZXYuc2V0TmV4dCgmRmlyc3QpOworICAgIE5leHQuc2V0UHJldigmRmluYWwpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0YXRpYyB2b2lkIGluc2VydEJlZm9yZShUICZOZXh0LCBUICZOKSB7CisgICAgaW5zZXJ0QmVmb3JlSW1wbChOZXh0LCBOKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdGF0aWMgdm9pZCByZW1vdmUoVCAmTikgeyByZW1vdmVJbXBsKE4pOyB9CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdGF0aWMgdm9pZCByZW1vdmVSYW5nZShUICZGaXJzdCwgVCAmTGFzdCkgeworICAgIHJlbW92ZVJhbmdlSW1wbChGaXJzdCwgTGFzdCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RhdGljIHZvaWQgdHJhbnNmZXJCZWZvcmUoVCAmTmV4dCwgVCAmRmlyc3QsIFQgJkxhc3QpIHsKKyAgICB0cmFuc2ZlckJlZm9yZUltcGwoTmV4dCwgRmlyc3QsIExhc3QpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfSUxJU1RfQkFTRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9pbGlzdF9pdGVyYXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvaWxpc3RfaXRlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzFlNjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvaWxpc3RfaXRlcmF0b3IuaApAQCAtMCwwICsxLDE5OSBAQAorLy89PT0tIGxsdm0vQURUL2lsaXN0X2l0ZXJhdG9yLmggLSBJbnRydXNpdmUgTGlzdCBJdGVyYXRvciAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9JTElTVF9JVEVSQVRPUl9ICisjZGVmaW5lIExMVk1fQURUX0lMSVNUX0lURVJBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIGlsaXN0X2RldGFpbCB7CisKKy8vLyBGaW5kIGNvbnN0LWNvcnJlY3Qgbm9kZSB0eXBlcy4KK3RlbXBsYXRlIDxjbGFzcyBPcHRpb25zVCwgYm9vbCBJc0NvbnN0PiBzdHJ1Y3QgSXRlcmF0b3JUcmFpdHM7Cit0ZW1wbGF0ZSA8Y2xhc3MgT3B0aW9uc1Q+IHN0cnVjdCBJdGVyYXRvclRyYWl0czxPcHRpb25zVCwgZmFsc2U+IHsKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIE9wdGlvbnNUOjp2YWx1ZV90eXBlOworICB1c2luZyBwb2ludGVyID0gdHlwZW5hbWUgT3B0aW9uc1Q6OnBvaW50ZXI7CisgIHVzaW5nIHJlZmVyZW5jZSA9IHR5cGVuYW1lIE9wdGlvbnNUOjpyZWZlcmVuY2U7CisgIHVzaW5nIG5vZGVfcG9pbnRlciA9IGlsaXN0X25vZGVfaW1wbDxPcHRpb25zVD4gKjsKKyAgdXNpbmcgbm9kZV9yZWZlcmVuY2UgPSBpbGlzdF9ub2RlX2ltcGw8T3B0aW9uc1Q+ICY7Cit9OwordGVtcGxhdGUgPGNsYXNzIE9wdGlvbnNUPiBzdHJ1Y3QgSXRlcmF0b3JUcmFpdHM8T3B0aW9uc1QsIHRydWU+IHsKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IGNvbnN0IHR5cGVuYW1lIE9wdGlvbnNUOjp2YWx1ZV90eXBlOworICB1c2luZyBwb2ludGVyID0gdHlwZW5hbWUgT3B0aW9uc1Q6OmNvbnN0X3BvaW50ZXI7CisgIHVzaW5nIHJlZmVyZW5jZSA9IHR5cGVuYW1lIE9wdGlvbnNUOjpjb25zdF9yZWZlcmVuY2U7CisgIHVzaW5nIG5vZGVfcG9pbnRlciA9IGNvbnN0IGlsaXN0X25vZGVfaW1wbDxPcHRpb25zVD4gKjsKKyAgdXNpbmcgbm9kZV9yZWZlcmVuY2UgPSBjb25zdCBpbGlzdF9ub2RlX2ltcGw8T3B0aW9uc1Q+ICY7Cit9OworCit0ZW1wbGF0ZSA8Ym9vbCBJc1JldmVyc2U+IHN0cnVjdCBJdGVyYXRvckhlbHBlcjsKK3RlbXBsYXRlIDw+IHN0cnVjdCBJdGVyYXRvckhlbHBlcjxmYWxzZT4gOiBpbGlzdF9kZXRhaWw6Ok5vZGVBY2Nlc3MgeworICB1c2luZyBBY2Nlc3MgPSBpbGlzdF9kZXRhaWw6Ok5vZGVBY2Nlc3M7CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0YXRpYyB2b2lkIGluY3JlbWVudChUIComSSkgeyBJID0gQWNjZXNzOjpnZXROZXh0KCpJKTsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RhdGljIHZvaWQgZGVjcmVtZW50KFQgKiZJKSB7IEkgPSBBY2Nlc3M6OmdldFByZXYoKkkpOyB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IEl0ZXJhdG9ySGVscGVyPHRydWU+IDogaWxpc3RfZGV0YWlsOjpOb2RlQWNjZXNzIHsKKyAgdXNpbmcgQWNjZXNzID0gaWxpc3RfZGV0YWlsOjpOb2RlQWNjZXNzOworCisgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdGF0aWMgdm9pZCBpbmNyZW1lbnQoVCAqJkkpIHsgSSA9IEFjY2Vzczo6Z2V0UHJldigqSSk7IH0KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0YXRpYyB2b2lkIGRlY3JlbWVudChUIComSSkgeyBJID0gQWNjZXNzOjpnZXROZXh0KCpJKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGlsaXN0X2RldGFpbAorCisvLy8gSXRlcmF0b3IgZm9yIGludHJ1c2l2ZSBsaXN0cyAgYmFzZWQgb24gaWxpc3Rfbm9kZS4KK3RlbXBsYXRlIDxjbGFzcyBPcHRpb25zVCwgYm9vbCBJc1JldmVyc2UsIGJvb2wgSXNDb25zdD4KK2NsYXNzIGlsaXN0X2l0ZXJhdG9yIDogaWxpc3RfZGV0YWlsOjpTcGVjaWZpY05vZGVBY2Nlc3M8T3B0aW9uc1Q+IHsKKyAgZnJpZW5kIGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCBJc1JldmVyc2UsICFJc0NvbnN0PjsKKyAgZnJpZW5kIGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCAhSXNSZXZlcnNlLCBJc0NvbnN0PjsKKyAgZnJpZW5kIGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCAhSXNSZXZlcnNlLCAhSXNDb25zdD47CisKKyAgdXNpbmcgVHJhaXRzID0gaWxpc3RfZGV0YWlsOjpJdGVyYXRvclRyYWl0czxPcHRpb25zVCwgSXNDb25zdD47CisgIHVzaW5nIEFjY2VzcyA9IGlsaXN0X2RldGFpbDo6U3BlY2lmaWNOb2RlQWNjZXNzPE9wdGlvbnNUPjsKKworcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgVHJhaXRzOjp2YWx1ZV90eXBlOworICB1c2luZyBwb2ludGVyID0gdHlwZW5hbWUgVHJhaXRzOjpwb2ludGVyOworICB1c2luZyByZWZlcmVuY2UgPSB0eXBlbmFtZSBUcmFpdHM6OnJlZmVyZW5jZTsKKyAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gcHRyZGlmZl90OworICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWc7CisgIHVzaW5nIGNvbnN0X3BvaW50ZXIgPSB0eXBlbmFtZSBPcHRpb25zVDo6Y29uc3RfcG9pbnRlcjsKKyAgdXNpbmcgY29uc3RfcmVmZXJlbmNlID0gdHlwZW5hbWUgT3B0aW9uc1Q6OmNvbnN0X3JlZmVyZW5jZTsKKworcHJpdmF0ZToKKyAgdXNpbmcgbm9kZV9wb2ludGVyID0gdHlwZW5hbWUgVHJhaXRzOjpub2RlX3BvaW50ZXI7CisgIHVzaW5nIG5vZGVfcmVmZXJlbmNlID0gdHlwZW5hbWUgVHJhaXRzOjpub2RlX3JlZmVyZW5jZTsKKworICBub2RlX3BvaW50ZXIgTm9kZVB0ciA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZSBmcm9tIGFuIGlsaXN0X25vZGUuCisgIGV4cGxpY2l0IGlsaXN0X2l0ZXJhdG9yKG5vZGVfcmVmZXJlbmNlIE4pIDogTm9kZVB0cigmTikge30KKworICBleHBsaWNpdCBpbGlzdF9pdGVyYXRvcihwb2ludGVyIE5QKSA6IE5vZGVQdHIoQWNjZXNzOjpnZXROb2RlUHRyKE5QKSkge30KKyAgZXhwbGljaXQgaWxpc3RfaXRlcmF0b3IocmVmZXJlbmNlIE5SKSA6IE5vZGVQdHIoQWNjZXNzOjpnZXROb2RlUHRyKCZOUikpIHt9CisgIGlsaXN0X2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgIC8vIFRoaXMgaXMgdGVtcGxhdGVkIHNvIHRoYXQgd2UgY2FuIGFsbG93IGNvbnN0cnVjdGluZyBhIGNvbnN0IGl0ZXJhdG9yIGZyb20KKyAgLy8gYSBub25jb25zdCBpdGVyYXRvci4uLgorICB0ZW1wbGF0ZSA8Ym9vbCBSSFNJc0NvbnN0PgorICBpbGlzdF9pdGVyYXRvcigKKyAgICAgIGNvbnN0IGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCBJc1JldmVyc2UsIFJIU0lzQ29uc3Q+ICZSSFMsCisgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxJc0NvbnN0IHx8ICFSSFNJc0NvbnN0LCB2b2lkICo+Ojp0eXBlID0gbnVsbHB0cikKKyAgICAgIDogTm9kZVB0cihSSFMuTm9kZVB0cikge30KKworICAvLyBUaGlzIGlzIHRlbXBsYXRlZCBzbyB0aGF0IHdlIGNhbiBhbGxvdyBhc3NpZ25pbmcgdG8gYSBjb25zdCBpdGVyYXRvciBmcm9tCisgIC8vIGEgbm9uY29uc3QgaXRlcmF0b3IuLi4KKyAgdGVtcGxhdGUgPGJvb2wgUkhTSXNDb25zdD4KKyAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8SXNDb25zdCB8fCAhUkhTSXNDb25zdCwgaWxpc3RfaXRlcmF0b3IgJj46OnR5cGUKKyAgb3BlcmF0b3I9KGNvbnN0IGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCBJc1JldmVyc2UsIFJIU0lzQ29uc3Q+ICZSSFMpIHsKKyAgICBOb2RlUHRyID0gUkhTLk5vZGVQdHI7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIEV4cGxpY2l0IGNvbnZlcnNpb24gYmV0d2VlbiBmb3J3YXJkL3JldmVyc2UgaXRlcmF0b3JzLgorICAvLy8KKyAgLy8vIFRyYW5zbGF0ZSBiZXR3ZWVuIGZvcndhcmQgYW5kIHJldmVyc2UgaXRlcmF0b3JzIHdpdGhvdXQgY2hhbmdpbmcgcmFuZ2UKKyAgLy8vIGJvdW5kYXJpZXMuICBUaGUgcmVzdWx0aW5nIGl0ZXJhdG9yIHdpbGwgZGVyZWZlcmVuY2UgKGFuZCBoYXZlIGEgaGFuZGxlKQorICAvLy8gdG8gdGhlIHByZXZpb3VzIG5vZGUsIHdoaWNoIGlzIHNvbWV3aGF0IHVuZXhwZWN0ZWQ7IGJ1dCBjb252ZXJ0aW5nIHRoZQorICAvLy8gdHdvIGVuZHBvaW50cyBpbiBhIHJhbmdlIHdpbGwgZ2l2ZSB0aGUgc2FtZSByYW5nZSBpbiByZXZlcnNlLgorICAvLy8KKyAgLy8vIFRoaXMgbWF0Y2hlcyBzdGQ6OnJldmVyc2VfaXRlcmF0b3IgY29udmVyc2lvbnMuCisgIGV4cGxpY2l0IGlsaXN0X2l0ZXJhdG9yKAorICAgICAgY29uc3QgaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsICFJc1JldmVyc2UsIElzQ29uc3Q+ICZSSFMpCisgICAgICA6IGlsaXN0X2l0ZXJhdG9yKCsrUkhTLmdldFJldmVyc2UoKSkge30KKworICAvLy8gR2V0IGEgcmV2ZXJzZSBpdGVyYXRvciB0byB0aGUgc2FtZSBub2RlLgorICAvLy8KKyAgLy8vIEdpdmVzIGEgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHdpbGwgZGVyZWZlcmVuY2UgKGFuZCBoYXZlIGEgaGFuZGxlKSB0byB0aGUKKyAgLy8vIHNhbWUgbm9kZS4gIENvbnZlcnRpbmcgdGhlIGVuZHBvaW50IGl0ZXJhdG9ycyBpbiBhIHJhbmdlIHdpbGwgZ2l2ZSBhCisgIC8vLyBkaWZmZXJlbnQgcmFuZ2U7IGZvciByYW5nZSBvcGVyYXRpb25zLCB1c2UgdGhlIGV4cGxpY2l0IGNvbnZlcnNpb25zLgorICBpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgIUlzUmV2ZXJzZSwgSXNDb25zdD4gZ2V0UmV2ZXJzZSgpIGNvbnN0IHsKKyAgICBpZiAoTm9kZVB0cikKKyAgICAgIHJldHVybiBpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgIUlzUmV2ZXJzZSwgSXNDb25zdD4oKk5vZGVQdHIpOworICAgIHJldHVybiBpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgIUlzUmV2ZXJzZSwgSXNDb25zdD4oKTsKKyAgfQorCisgIC8vLyBDb25zdC1jYXN0LgorICBpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgSXNSZXZlcnNlLCBmYWxzZT4gZ2V0Tm9uQ29uc3QoKSBjb25zdCB7CisgICAgaWYgKE5vZGVQdHIpCisgICAgICByZXR1cm4gaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsIElzUmV2ZXJzZSwgZmFsc2U+KAorICAgICAgICAgIGNvbnN0X2Nhc3Q8dHlwZW5hbWUgaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsIElzUmV2ZXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlPjo6bm9kZV9yZWZlcmVuY2U+KCpOb2RlUHRyKSk7CisgICAgcmV0dXJuIGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCBJc1JldmVyc2UsIGZhbHNlPigpOworICB9CisKKyAgLy8gQWNjZXNzb3JzLi4uCisgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgYXNzZXJ0KCFOb2RlUHRyLT5pc0tub3duU2VudGluZWwoKSk7CisgICAgcmV0dXJuICpBY2Nlc3M6OmdldFZhbHVlUHRyKE5vZGVQdHIpOworICB9CisgIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZvcGVyYXRvciooKTsgfQorCisgIC8vIENvbXBhcmlzb24gb3BlcmF0b3JzCisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgaWxpc3RfaXRlcmF0b3IgJkxIUywgY29uc3QgaWxpc3RfaXRlcmF0b3IgJlJIUykgeworICAgIHJldHVybiBMSFMuTm9kZVB0ciA9PSBSSFMuTm9kZVB0cjsKKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGlsaXN0X2l0ZXJhdG9yICZMSFMsIGNvbnN0IGlsaXN0X2l0ZXJhdG9yICZSSFMpIHsKKyAgICByZXR1cm4gTEhTLk5vZGVQdHIgIT0gUkhTLk5vZGVQdHI7CisgIH0KKworICAvLyBJbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBvcGVyYXRvcnMuLi4KKyAgaWxpc3RfaXRlcmF0b3IgJm9wZXJhdG9yLS0oKSB7CisgICAgTm9kZVB0ciA9IElzUmV2ZXJzZSA/IE5vZGVQdHItPmdldE5leHQoKSA6IE5vZGVQdHItPmdldFByZXYoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaWxpc3RfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgTm9kZVB0ciA9IElzUmV2ZXJzZSA/IE5vZGVQdHItPmdldFByZXYoKSA6IE5vZGVQdHItPmdldE5leHQoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaWxpc3RfaXRlcmF0b3Igb3BlcmF0b3ItLShpbnQpIHsKKyAgICBpbGlzdF9pdGVyYXRvciB0bXAgPSAqdGhpczsKKyAgICAtLSp0aGlzOworICAgIHJldHVybiB0bXA7CisgIH0KKyAgaWxpc3RfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBpbGlzdF9pdGVyYXRvciB0bXAgPSAqdGhpczsKKyAgICArKyp0aGlzOworICAgIHJldHVybiB0bXA7CisgIH0KKworICAvLy8gR2V0IHRoZSB1bmRlcmx5aW5nIGlsaXN0X25vZGUuCisgIG5vZGVfcG9pbnRlciBnZXROb2RlUHRyKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8bm9kZV9wb2ludGVyPihOb2RlUHRyKTsgfQorCisgIC8vLyBDaGVjayBmb3IgZW5kLiAgT25seSB2YWxpZCBpZiBpbGlzdF9zZW50aW5lbF90cmFja2luZzx0cnVlPi4KKyAgYm9vbCBpc0VuZCgpIGNvbnN0IHsgcmV0dXJuIE5vZGVQdHIgPyBOb2RlUHRyLT5pc1NlbnRpbmVsKCkgOiBmYWxzZTsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+IHN0cnVjdCBzaW1wbGlmeV90eXBlOworCisvLy8gQWxsb3cgaWxpc3RfaXRlcmF0b3JzIHRvIGNvbnZlcnQgaW50byBwb2ludGVycyB0byBhIG5vZGUgYXV0b21hdGljYWxseSB3aGVuCisvLy8gdXNlZCBieSB0aGUgZHluX2Nhc3QsIGNhc3QsIGlzYSBtZWNoYW5pc21zLi4uCisvLy8KKy8vLyBGSVhNRTogcmVtb3ZlIHRoaXMsIHNpbmNlIHRoZXJlIGlzIG5vIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gTm9kZVR5LgordGVtcGxhdGUgPGNsYXNzIE9wdGlvbnNULCBib29sIElzQ29uc3Q+CitzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgZmFsc2UsIElzQ29uc3Q+PiB7CisgIHVzaW5nIGl0ZXJhdG9yID0gaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsIGZhbHNlLCBJc0NvbnN0PjsKKyAgdXNpbmcgU2ltcGxlVHlwZSA9IHR5cGVuYW1lIGl0ZXJhdG9yOjpwb2ludGVyOworCisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShjb25zdCBpdGVyYXRvciAmTm9kZSkgeyByZXR1cm4gJipOb2RlOyB9Cit9OwordGVtcGxhdGUgPGNsYXNzIE9wdGlvbnNULCBib29sIElzQ29uc3Q+CitzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxjb25zdCBpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgZmFsc2UsIElzQ29uc3Q+PgorICAgIDogc2ltcGxpZnlfdHlwZTxpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgZmFsc2UsIElzQ29uc3Q+PiB7fTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX0lMSVNUX0lURVJBVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2lsaXN0X25vZGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2lsaXN0X25vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzYyNjExCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvaWxpc3Rfbm9kZS5oCkBAIC0wLDAgKzEsMzA2IEBACisvLz09PS0gbGx2bS9BRFQvaWxpc3Rfbm9kZS5oIC0gSW50cnVzaXZlIExpbmtlZCBMaXN0IEhlbHBlciAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbGlzdF9ub2RlIGNsYXNzIHRlbXBsYXRlLCB3aGljaCBpcyBhIGNvbnZlbmllbnQKKy8vIGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIGNsYXNzZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGlsaXN0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0lMSVNUX05PREVfSAorI2RlZmluZSBMTFZNX0FEVF9JTElTVF9OT0RFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGVfYmFzZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGVfb3B0aW9ucy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBpbGlzdF9kZXRhaWwgeworCitzdHJ1Y3QgTm9kZUFjY2VzczsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGlsaXN0X2RldGFpbAorCit0ZW1wbGF0ZSA8Y2xhc3MgT3B0aW9uc1QsIGJvb2wgSXNSZXZlcnNlLCBib29sIElzQ29uc3Q+IGNsYXNzIGlsaXN0X2l0ZXJhdG9yOwordGVtcGxhdGUgPGNsYXNzIE9wdGlvbnNUPiBjbGFzcyBpbGlzdF9zZW50aW5lbDsKKworLy8vIEltcGxlbWVudGF0aW9uIGZvciBhbiBpbGlzdCBub2RlLgorLy8vCisvLy8gVGVtcGxhdGVkIG9uIGFuIGFwcHJvcHJpYXRlIFxhIGlsaXN0X2RldGFpbDo6bm9kZV9vcHRpb25zLCB1c3VhbGx5IGNvbXB1dGVkCisvLy8gYnkgXGEgaWxpc3RfZGV0YWlsOjpjb21wdXRlX25vZGVfb3B0aW9ucy4KKy8vLworLy8vIFRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCBcYSBpbGlzdF9ub2RlX2Jhc2Ugd2hvc2UgbWFpbiBwdXJwb3NlIGlzIHRvCisvLy8gcHJvdmlkZSB0eXBlIHNhZmV0eTogeW91IGNhbid0IGluc2VydCBub2RlcyBvZiBcYSBpbGlzdF9ub2RlX2ltcGwgaW50byB0aGUKKy8vLyB3cm9uZyBcYSBzaW1wbGVfaWxpc3Qgb3IgXGEgaXBsaXN0LgordGVtcGxhdGUgPGNsYXNzIE9wdGlvbnNUPiBjbGFzcyBpbGlzdF9ub2RlX2ltcGwgOiBPcHRpb25zVDo6bm9kZV9iYXNlX3R5cGUgeworICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgT3B0aW9uc1Q6OnZhbHVlX3R5cGU7CisgIHVzaW5nIG5vZGVfYmFzZV90eXBlID0gdHlwZW5hbWUgT3B0aW9uc1Q6Om5vZGVfYmFzZV90eXBlOworICB1c2luZyBsaXN0X2Jhc2VfdHlwZSA9IHR5cGVuYW1lIE9wdGlvbnNUOjpsaXN0X2Jhc2VfdHlwZTsKKworICBmcmllbmQgdHlwZW5hbWUgT3B0aW9uc1Q6Omxpc3RfYmFzZV90eXBlOworICBmcmllbmQgc3RydWN0IGlsaXN0X2RldGFpbDo6Tm9kZUFjY2VzczsKKyAgZnJpZW5kIGNsYXNzIGlsaXN0X3NlbnRpbmVsPE9wdGlvbnNUPjsKKyAgZnJpZW5kIGNsYXNzIGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCBmYWxzZSwgZmFsc2U+OworICBmcmllbmQgY2xhc3MgaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsIGZhbHNlLCB0cnVlPjsKKyAgZnJpZW5kIGNsYXNzIGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCB0cnVlLCBmYWxzZT47CisgIGZyaWVuZCBjbGFzcyBpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgdHJ1ZSwgdHJ1ZT47CisKK3Byb3RlY3RlZDoKKyAgdXNpbmcgc2VsZl9pdGVyYXRvciA9IGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCBmYWxzZSwgZmFsc2U+OworICB1c2luZyBjb25zdF9zZWxmX2l0ZXJhdG9yID0gaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsIGZhbHNlLCB0cnVlPjsKKyAgdXNpbmcgcmV2ZXJzZV9zZWxmX2l0ZXJhdG9yID0gaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsIHRydWUsIGZhbHNlPjsKKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9zZWxmX2l0ZXJhdG9yID0gaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsIHRydWUsIHRydWU+OworCisgIGlsaXN0X25vZGVfaW1wbCgpID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgaWxpc3Rfbm9kZV9pbXBsICpnZXRQcmV2KCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbGlzdF9ub2RlX2ltcGwgKj4obm9kZV9iYXNlX3R5cGU6OmdldFByZXYoKSk7CisgIH0KKworICBpbGlzdF9ub2RlX2ltcGwgKmdldE5leHQoKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGlsaXN0X25vZGVfaW1wbCAqPihub2RlX2Jhc2VfdHlwZTo6Z2V0TmV4dCgpKTsKKyAgfQorCisgIGNvbnN0IGlsaXN0X25vZGVfaW1wbCAqZ2V0UHJldigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aWxpc3Rfbm9kZV9pbXBsICo+KG5vZGVfYmFzZV90eXBlOjpnZXRQcmV2KCkpOworICB9CisKKyAgY29uc3QgaWxpc3Rfbm9kZV9pbXBsICpnZXROZXh0KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbGlzdF9ub2RlX2ltcGwgKj4obm9kZV9iYXNlX3R5cGU6OmdldE5leHQoKSk7CisgIH0KKworICB2b2lkIHNldFByZXYoaWxpc3Rfbm9kZV9pbXBsICpOKSB7IG5vZGVfYmFzZV90eXBlOjpzZXRQcmV2KE4pOyB9CisgIHZvaWQgc2V0TmV4dChpbGlzdF9ub2RlX2ltcGwgKk4pIHsgbm9kZV9iYXNlX3R5cGU6OnNldE5leHQoTik7IH0KKworcHVibGljOgorICBzZWxmX2l0ZXJhdG9yIGdldEl0ZXJhdG9yKCkgeyByZXR1cm4gc2VsZl9pdGVyYXRvcigqdGhpcyk7IH0KKyAgY29uc3Rfc2VsZl9pdGVyYXRvciBnZXRJdGVyYXRvcigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3NlbGZfaXRlcmF0b3IoKnRoaXMpOyB9CisKKyAgcmV2ZXJzZV9zZWxmX2l0ZXJhdG9yIGdldFJldmVyc2VJdGVyYXRvcigpIHsKKyAgICByZXR1cm4gcmV2ZXJzZV9zZWxmX2l0ZXJhdG9yKCp0aGlzKTsKKyAgfQorCisgIGNvbnN0X3JldmVyc2Vfc2VsZl9pdGVyYXRvciBnZXRSZXZlcnNlSXRlcmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2Vfc2VsZl9pdGVyYXRvcigqdGhpcyk7CisgIH0KKworICAvLyBVbmRlci1hcHByb3hpbWF0aW9uLCBidXQgYWx3YXlzIGF2YWlsYWJsZSBmb3IgYXNzZXJ0aW9ucy4KKyAgdXNpbmcgbm9kZV9iYXNlX3R5cGU6OmlzS25vd25TZW50aW5lbDsKKworICAvLy8gQ2hlY2sgd2hldGhlciB0aGlzIGlzIHRoZSBzZW50aW5lbCBub2RlLgorICAvLy8KKyAgLy8vIFRoaXMgcmVxdWlyZXMgc2VudGluZWwgdHJhY2tpbmcgdG8gYmUgZXhwbGljaXRseSBlbmFibGVkLiAgVXNlIHRoZQorICAvLy8gaWxpc3Rfc2VudGluZWxfdHJhY2tpbmc8dHJ1ZT4gb3B0aW9uIHRvIGdldCB0aGlzIEFQSS4KKyAgYm9vbCBpc1NlbnRpbmVsKCkgY29uc3QgeworICAgIHN0YXRpY19hc3NlcnQoT3B0aW9uc1Q6OmlzX3NlbnRpbmVsX3RyYWNraW5nX2V4cGxpY2l0LAorICAgICAgICAgICAgICAgICAgIlVzZSBpbGlzdF9zZW50aW5lbF90cmFja2luZzx0cnVlPiB0byBlbmFibGUgaXNTZW50aW5lbCgpIik7CisgICAgcmV0dXJuIG5vZGVfYmFzZV90eXBlOjppc1NlbnRpbmVsKCk7CisgIH0KK307CisKKy8vLyBBbiBpbnRydXNpdmUgbGlzdCBub2RlLgorLy8vCisvLy8gQSBiYXNlIGNsYXNzIHRvIGVuYWJsZSBtZW1iZXJzaGlwIGluIGludHJ1c2l2ZSBsaXN0cywgaW5jbHVkaW5nIFxhCisvLy8gc2ltcGxlX2lsaXN0LCBcYSBpcGxpc3QsIGFuZCBcYSBpbGlzdC4gIFRoZSBmaXJzdCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaXMgdGhlCisvLy8gXGEgdmFsdWVfdHlwZSBmb3IgdGhlIGxpc3QuCisvLy8KKy8vLyBBbiBpbGlzdCBub2RlIGNhbiBiZSBjb25maWd1cmVkIHdpdGggY29tcGlsZS10aW1lIG9wdGlvbnMgdG8gY2hhbmdlCisvLy8gYmVoYXZpb3VyIGFuZC9vciBhZGQgQVBJLgorLy8vCisvLy8gQnkgZGVmYXVsdCwgYW4gXGEgaWxpc3Rfbm9kZSBrbm93cyB3aGV0aGVyIGl0IGlzIHRoZSBsaXN0IHNlbnRpbmVsIChhbgorLy8vIGluc3RhbmNlIG9mIFxhIGlsaXN0X3NlbnRpbmVsKSBpZiBhbmQgb25seSBpZgorLy8vIExMVk1fRU5BQkxFX0FCSV9CUkVBS0lOR19DSEVDS1MuICBUaGUgZnVuY3Rpb24gXGEgaXNLbm93blNlbnRpbmVsKCkgYWx3YXlzCisvLy8gcmV0dXJucyBcYyBmYWxzZSB0cmFja2luZyBpcyBvZmYuICBTZW50aW5lbCB0cmFja2luZyBzdGVhbHMgYSBiaXQgZnJvbSB0aGUKKy8vLyAicHJldiIgbGluaywgd2hpY2ggYWRkcyBhIG1hc2sgb3BlcmF0aW9uIHdoZW4gZGVjcmVtZW50aW5nIGFuIGl0ZXJhdG9yLCBidXQKKy8vLyBlbmFibGVzIGJ1Zy1maW5kaW5nIGFzc2VydGlvbnMgaW4gXGEgaWxpc3RfaXRlcmF0b3IuCisvLy8KKy8vLyBUbyB0dXJuIHNlbnRpbmVsIHRyYWNraW5nIG9uIGFsbCB0aGUgdGltZSwgcGFzcyBpbiB0aGUKKy8vLyBpbGlzdF9zZW50aW5lbF90cmFja2luZzx0cnVlPiB0ZW1wbGF0ZSBwYXJhbWV0ZXIuICBUaGlzIGFsc28gZW5hYmxlcyB0aGUgXGEKKy8vLyBpc1NlbnRpbmVsKCkgZnVuY3Rpb24uICBUaGUgc2FtZSBvcHRpb24gbXVzdCBiZSBwYXNzZWQgdG8gdGhlIGludHJ1c2l2ZQorLy8vIGxpc3QuICAoaWxpc3Rfc2VudGluZWxfdHJhY2tpbmc8ZmFsc2U+IHR1cm5zIHNlbnRpbmVsIHRyYWNraW5nIG9mZiBhbGwgdGhlCisvLy8gdGltZS4pCisvLy8KKy8vLyBBIHR5cGUgY2FuIGluaGVyaXQgZnJvbSBpbGlzdF9ub2RlIG11bHRpcGxlIHRpbWVzIGJ5IHBhc3NpbmcgaW4gZGlmZmVyZW50CisvLy8gXGEgaWxpc3RfdGFnIG9wdGlvbnMuICBUaGlzIGFsbG93cyBhIHNpbmdsZSBpbnN0YW5jZSB0byBiZSBpbnNlcnRlZCBpbnRvCisvLy8gbXVsdGlwbGUgbGlzdHMgc2ltdWx0YW5lb3VzbHksIHdoZXJlIGVhY2ggbGlzdCBpcyBnaXZlbiB0aGUgc2FtZSB0YWcuCisvLy8KKy8vLyBcZXhhbXBsZQorLy8vIHN0cnVjdCBBIHt9OworLy8vIHN0cnVjdCBCIHt9OworLy8vIHN0cnVjdCBOIDogaWxpc3Rfbm9kZTxOLCBpbGlzdF90YWc8QT4+LCBpbGlzdF9ub2RlPE4sIGlsaXN0X3RhZzxCPj4ge307CisvLy8KKy8vLyB2b2lkIGZvbygpIHsKKy8vLyAgIHNpbXBsZV9pbGlzdDxOLCBpbGlzdF90YWc8QT4+IExpc3RBOworLy8vICAgc2ltcGxlX2lsaXN0PE4sIGlsaXN0X3RhZzxCPj4gTGlzdEI7CisvLy8gICBOIE4xOworLy8vICAgTGlzdEEucHVzaF9iYWNrKE4xKTsKKy8vLyAgIExpc3RCLnB1c2hfYmFjayhOMSk7CisvLy8gfQorLy8vIFxlbmRleGFtcGxlCisvLy8KKy8vLyBTZWUgXGEgaXNfdmFsaWRfb3B0aW9uIGZvciBzdGVwcyBvbiBhZGRpbmcgYSBuZXcgb3B0aW9uLgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzLi4uIE9wdGlvbnM+CitjbGFzcyBpbGlzdF9ub2RlCisgICAgOiBwdWJsaWMgaWxpc3Rfbm9kZV9pbXBsPAorICAgICAgICAgIHR5cGVuYW1lIGlsaXN0X2RldGFpbDo6Y29tcHV0ZV9ub2RlX29wdGlvbnM8VCwgT3B0aW9ucy4uLj46OnR5cGU+IHsKKyAgc3RhdGljX2Fzc2VydChpbGlzdF9kZXRhaWw6OmNoZWNrX29wdGlvbnM8T3B0aW9ucy4uLj46OnZhbHVlLAorICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgbm9kZSBvcHRpb24hIik7Cit9OworCituYW1lc3BhY2UgaWxpc3RfZGV0YWlsIHsKKworLy8vIEFuIGFjY2VzcyBjbGFzcyBmb3IgaWxpc3Rfbm9kZSBwcml2YXRlIEFQSS4KKy8vLworLy8vIFRoaXMgZ2l2ZXMgYWNjZXNzIHRvIHRoZSBwcml2YXRlIHBhcnRzIG9mIGlsaXN0IG5vZGVzLiAgTm9kZXMgZm9yIGFuIGlsaXN0CisvLy8gc2hvdWxkIGZyaWVuZCB0aGlzIGNsYXNzIGlmIHRoZXkgaW5oZXJpdCBwcml2YXRlbHkgZnJvbSBpbGlzdF9ub2RlLgorLy8vCisvLy8gVXNpbmcgdGhpcyBjbGFzcyBvdXRzaWRlIG9mIHRoZSBpbGlzdCBpbXBsZW1lbnRhdGlvbiBpcyB1bnN1cHBvcnRlZC4KK3N0cnVjdCBOb2RlQWNjZXNzIHsKK3Byb3RlY3RlZDoKKyAgdGVtcGxhdGUgPGNsYXNzIE9wdGlvbnNUPgorICBzdGF0aWMgaWxpc3Rfbm9kZV9pbXBsPE9wdGlvbnNUPiAqZ2V0Tm9kZVB0cih0eXBlbmFtZSBPcHRpb25zVDo6cG9pbnRlciBOKSB7CisgICAgcmV0dXJuIE47CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgT3B0aW9uc1Q+CisgIHN0YXRpYyBjb25zdCBpbGlzdF9ub2RlX2ltcGw8T3B0aW9uc1Q+ICoKKyAgZ2V0Tm9kZVB0cih0eXBlbmFtZSBPcHRpb25zVDo6Y29uc3RfcG9pbnRlciBOKSB7CisgICAgcmV0dXJuIE47CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgT3B0aW9uc1Q+CisgIHN0YXRpYyB0eXBlbmFtZSBPcHRpb25zVDo6cG9pbnRlciBnZXRWYWx1ZVB0cihpbGlzdF9ub2RlX2ltcGw8T3B0aW9uc1Q+ICpOKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIE9wdGlvbnNUOjpwb2ludGVyPihOKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBPcHRpb25zVD4KKyAgc3RhdGljIHR5cGVuYW1lIE9wdGlvbnNUOjpjb25zdF9wb2ludGVyCisgIGdldFZhbHVlUHRyKGNvbnN0IGlsaXN0X25vZGVfaW1wbDxPcHRpb25zVD4gKk4pIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dHlwZW5hbWUgT3B0aW9uc1Q6OmNvbnN0X3BvaW50ZXI+KE4pOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIE9wdGlvbnNUPgorICBzdGF0aWMgaWxpc3Rfbm9kZV9pbXBsPE9wdGlvbnNUPiAqZ2V0UHJldihpbGlzdF9ub2RlX2ltcGw8T3B0aW9uc1Q+ICZOKSB7CisgICAgcmV0dXJuIE4uZ2V0UHJldigpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIE9wdGlvbnNUPgorICBzdGF0aWMgaWxpc3Rfbm9kZV9pbXBsPE9wdGlvbnNUPiAqZ2V0TmV4dChpbGlzdF9ub2RlX2ltcGw8T3B0aW9uc1Q+ICZOKSB7CisgICAgcmV0dXJuIE4uZ2V0TmV4dCgpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIE9wdGlvbnNUPgorICBzdGF0aWMgY29uc3QgaWxpc3Rfbm9kZV9pbXBsPE9wdGlvbnNUPiAqCisgIGdldFByZXYoY29uc3QgaWxpc3Rfbm9kZV9pbXBsPE9wdGlvbnNUPiAmTikgeworICAgIHJldHVybiBOLmdldFByZXYoKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBPcHRpb25zVD4KKyAgc3RhdGljIGNvbnN0IGlsaXN0X25vZGVfaW1wbDxPcHRpb25zVD4gKgorICBnZXROZXh0KGNvbnN0IGlsaXN0X25vZGVfaW1wbDxPcHRpb25zVD4gJk4pIHsKKyAgICByZXR1cm4gTi5nZXROZXh0KCk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBPcHRpb25zVD4gc3RydWN0IFNwZWNpZmljTm9kZUFjY2VzcyA6IE5vZGVBY2Nlc3MgeworcHJvdGVjdGVkOgorICB1c2luZyBwb2ludGVyID0gdHlwZW5hbWUgT3B0aW9uc1Q6OnBvaW50ZXI7CisgIHVzaW5nIGNvbnN0X3BvaW50ZXIgPSB0eXBlbmFtZSBPcHRpb25zVDo6Y29uc3RfcG9pbnRlcjsKKyAgdXNpbmcgbm9kZV90eXBlID0gaWxpc3Rfbm9kZV9pbXBsPE9wdGlvbnNUPjsKKworICBzdGF0aWMgbm9kZV90eXBlICpnZXROb2RlUHRyKHBvaW50ZXIgTikgeworICAgIHJldHVybiBOb2RlQWNjZXNzOjpnZXROb2RlUHRyPE9wdGlvbnNUPihOKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBub2RlX3R5cGUgKmdldE5vZGVQdHIoY29uc3RfcG9pbnRlciBOKSB7CisgICAgcmV0dXJuIE5vZGVBY2Nlc3M6OmdldE5vZGVQdHI8T3B0aW9uc1Q+KE4pOworICB9CisKKyAgc3RhdGljIHBvaW50ZXIgZ2V0VmFsdWVQdHIobm9kZV90eXBlICpOKSB7CisgICAgcmV0dXJuIE5vZGVBY2Nlc3M6OmdldFZhbHVlUHRyPE9wdGlvbnNUPihOKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdF9wb2ludGVyIGdldFZhbHVlUHRyKGNvbnN0IG5vZGVfdHlwZSAqTikgeworICAgIHJldHVybiBOb2RlQWNjZXNzOjpnZXRWYWx1ZVB0cjxPcHRpb25zVD4oTik7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbGlzdF9kZXRhaWwKKwordGVtcGxhdGUgPGNsYXNzIE9wdGlvbnNUPgorY2xhc3MgaWxpc3Rfc2VudGluZWwgOiBwdWJsaWMgaWxpc3Rfbm9kZV9pbXBsPE9wdGlvbnNUPiB7CitwdWJsaWM6CisgIGlsaXN0X3NlbnRpbmVsKCkgeworICAgIHRoaXMtPmluaXRpYWxpemVTZW50aW5lbCgpOworICAgIHJlc2V0KCk7CisgIH0KKworICB2b2lkIHJlc2V0KCkgeworICAgIHRoaXMtPnNldFByZXYodGhpcyk7CisgICAgdGhpcy0+c2V0TmV4dCh0aGlzKTsKKyAgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiB0aGlzID09IHRoaXMtPmdldFByZXYoKTsgfQorfTsKKworLy8vIEFuIGlsaXN0IG5vZGUgdGhhdCBjYW4gYWNjZXNzIGl0cyBwYXJlbnQgbGlzdC4KKy8vLworLy8vIFJlcXVpcmVzIFxjIE5vZGVUeSB0byBoYXZlIFxhIGdldFBhcmVudCgpIHRvIGZpbmQgdGhlIHBhcmVudCBub2RlLCBhbmQgdGhlCisvLy8gXGMgUGFyZW50VHkgdG8gaGF2ZSBcYSBnZXRTdWJsaXN0QWNjZXNzKCkgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBsaXN0LgordGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVUeSwgdHlwZW5hbWUgUGFyZW50VHksIGNsYXNzLi4uIE9wdGlvbnM+CitjbGFzcyBpbGlzdF9ub2RlX3dpdGhfcGFyZW50IDogcHVibGljIGlsaXN0X25vZGU8Tm9kZVR5LCBPcHRpb25zLi4uPiB7Citwcm90ZWN0ZWQ6CisgIGlsaXN0X25vZGVfd2l0aF9wYXJlbnQoKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgIC8vLyBGb3J3YXJkIHRvIE5vZGVUeTo6Z2V0UGFyZW50KCkuCisgIC8vLworICAvLy8gTm90ZTogZG8gbm90IHVzZSB0aGUgbmFtZSAiZ2V0UGFyZW50KCkiLiAgV2Ugd2FudCBhIGNvbXBpbGUgZXJyb3IKKyAgLy8vIChpbnN0ZWFkIG9mIHJlY3Vyc2lvbikgd2hlbiB0aGUgc3ViY2xhc3MgZmFpbHMgdG8gaW1wbGVtZW50IFxhCisgIC8vLyBnZXRQYXJlbnQoKS4KKyAgY29uc3QgUGFyZW50VHkgKmdldE5vZGVQYXJlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IE5vZGVUeSAqPih0aGlzKS0+Z2V0UGFyZW50KCk7CisgIH0KKworcHVibGljOgorICAvLy8gQG5hbWUgQWRqYWNlbnQgTm9kZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisgIC8vLyBcYnJpZWYgR2V0IHRoZSBwcmV2aW91cyBub2RlLCBvciBcYyBudWxscHRyIGZvciB0aGUgbGlzdCBoZWFkLgorICBOb2RlVHkgKmdldFByZXZOb2RlKCkgeworICAgIC8vIFNob3VsZCBiZSBzZXBhcmF0ZWQgdG8gYSByZXVzZWQgZnVuY3Rpb24sIGJ1dCB0aGVuIHdlIGNvdWxkbid0IHVzZSBhdXRvCisgICAgLy8gKGFuZCB3b3VsZCBuZWVkIHRoZSB0eXBlIG9mIHRoZSBsaXN0KS4KKyAgICBjb25zdCBhdXRvICZMaXN0ID0KKyAgICAgICAgZ2V0Tm9kZVBhcmVudCgpLT4qKFBhcmVudFR5OjpnZXRTdWJsaXN0QWNjZXNzKChOb2RlVHkgKiludWxscHRyKSk7CisgICAgcmV0dXJuIExpc3QuZ2V0UHJldk5vZGUoKnN0YXRpY19jYXN0PE5vZGVUeSAqPih0aGlzKSk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgcHJldmlvdXMgbm9kZSwgb3IgXGMgbnVsbHB0ciBmb3IgdGhlIGxpc3QgaGVhZC4KKyAgY29uc3QgTm9kZVR5ICpnZXRQcmV2Tm9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxpbGlzdF9ub2RlX3dpdGhfcGFyZW50ICo+KHRoaXMpLT5nZXRQcmV2Tm9kZSgpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG5leHQgbm9kZSwgb3IgXGMgbnVsbHB0ciBmb3IgdGhlIGxpc3QgdGFpbC4KKyAgTm9kZVR5ICpnZXROZXh0Tm9kZSgpIHsKKyAgICAvLyBTaG91bGQgYmUgc2VwYXJhdGVkIHRvIGEgcmV1c2VkIGZ1bmN0aW9uLCBidXQgdGhlbiB3ZSBjb3VsZG4ndCB1c2UgYXV0bworICAgIC8vIChhbmQgd291bGQgbmVlZCB0aGUgdHlwZSBvZiB0aGUgbGlzdCkuCisgICAgY29uc3QgYXV0byAmTGlzdCA9CisgICAgICAgIGdldE5vZGVQYXJlbnQoKS0+KihQYXJlbnRUeTo6Z2V0U3VibGlzdEFjY2VzcygoTm9kZVR5ICopbnVsbHB0cikpOworICAgIHJldHVybiBMaXN0LmdldE5leHROb2RlKCpzdGF0aWNfY2FzdDxOb2RlVHkgKj4odGhpcykpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG5leHQgbm9kZSwgb3IgXGMgbnVsbHB0ciBmb3IgdGhlIGxpc3QgdGFpbC4KKyAgY29uc3QgTm9kZVR5ICpnZXROZXh0Tm9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxpbGlzdF9ub2RlX3dpdGhfcGFyZW50ICo+KHRoaXMpLT5nZXROZXh0Tm9kZSgpOworICB9CisgIC8vLyBAfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX0lMSVNUX05PREVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvaWxpc3Rfbm9kZV9iYXNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9pbGlzdF9ub2RlX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTA2MmFjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvaWxpc3Rfbm9kZV9iYXNlLmgKQEAgLTAsMCArMSw1MyBAQAorLy89PT0tIGxsdm0vQURUL2lsaXN0X25vZGVfYmFzZS5oIC0gSW50cnVzaXZlIExpc3QgTm9kZSBCYXNlIC0tLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9JTElTVF9OT0RFX0JBU0VfSAorI2RlZmluZSBMTFZNX0FEVF9JTElTVF9OT0RFX0JBU0VfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQmFzZSBjbGFzcyBmb3IgaWxpc3Qgbm9kZXMuCisvLy8KKy8vLyBPcHRpb25hbGx5IHRyYWNrcyB3aGV0aGVyIHRoaXMgbm9kZSBpcyB0aGUgc2VudGluZWwuCit0ZW1wbGF0ZSA8Ym9vbCBFbmFibGVTZW50aW5lbFRyYWNraW5nPiBjbGFzcyBpbGlzdF9ub2RlX2Jhc2U7CisKK3RlbXBsYXRlIDw+IGNsYXNzIGlsaXN0X25vZGVfYmFzZTxmYWxzZT4geworICBpbGlzdF9ub2RlX2Jhc2UgKlByZXYgPSBudWxscHRyOworICBpbGlzdF9ub2RlX2Jhc2UgKk5leHQgPSBudWxscHRyOworCitwdWJsaWM6CisgIHZvaWQgc2V0UHJldihpbGlzdF9ub2RlX2Jhc2UgKlByZXYpIHsgdGhpcy0+UHJldiA9IFByZXY7IH0KKyAgdm9pZCBzZXROZXh0KGlsaXN0X25vZGVfYmFzZSAqTmV4dCkgeyB0aGlzLT5OZXh0ID0gTmV4dDsgfQorICBpbGlzdF9ub2RlX2Jhc2UgKmdldFByZXYoKSBjb25zdCB7IHJldHVybiBQcmV2OyB9CisgIGlsaXN0X25vZGVfYmFzZSAqZ2V0TmV4dCgpIGNvbnN0IHsgcmV0dXJuIE5leHQ7IH0KKworICBib29sIGlzS25vd25TZW50aW5lbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZvaWQgaW5pdGlhbGl6ZVNlbnRpbmVsKCkge30KK307CisKK3RlbXBsYXRlIDw+IGNsYXNzIGlsaXN0X25vZGVfYmFzZTx0cnVlPiB7CisgIFBvaW50ZXJJbnRQYWlyPGlsaXN0X25vZGVfYmFzZSAqLCAxPiBQcmV2QW5kU2VudGluZWw7CisgIGlsaXN0X25vZGVfYmFzZSAqTmV4dCA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgdm9pZCBzZXRQcmV2KGlsaXN0X25vZGVfYmFzZSAqUHJldikgeyBQcmV2QW5kU2VudGluZWwuc2V0UG9pbnRlcihQcmV2KTsgfQorICB2b2lkIHNldE5leHQoaWxpc3Rfbm9kZV9iYXNlICpOZXh0KSB7IHRoaXMtPk5leHQgPSBOZXh0OyB9CisgIGlsaXN0X25vZGVfYmFzZSAqZ2V0UHJldigpIGNvbnN0IHsgcmV0dXJuIFByZXZBbmRTZW50aW5lbC5nZXRQb2ludGVyKCk7IH0KKyAgaWxpc3Rfbm9kZV9iYXNlICpnZXROZXh0KCkgY29uc3QgeyByZXR1cm4gTmV4dDsgfQorCisgIGJvb2wgaXNTZW50aW5lbCgpIGNvbnN0IHsgcmV0dXJuIFByZXZBbmRTZW50aW5lbC5nZXRJbnQoKTsgfQorICBib29sIGlzS25vd25TZW50aW5lbCgpIGNvbnN0IHsgcmV0dXJuIGlzU2VudGluZWwoKTsgfQorICB2b2lkIGluaXRpYWxpemVTZW50aW5lbCgpIHsgUHJldkFuZFNlbnRpbmVsLnNldEludCh0cnVlKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX0lMSVNUX05PREVfQkFTRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9pbGlzdF9ub2RlX29wdGlvbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2lsaXN0X25vZGVfb3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzM2RmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9pbGlzdF9ub2RlX29wdGlvbnMuaApAQCAtMCwwICsxLDEzMyBAQAorLy89PT0tIGxsdm0vQURUL2lsaXN0X25vZGVfb3B0aW9ucy5oIC0gaWxpc3Rfbm9kZSBPcHRpb25zIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9JTElTVF9OT0RFX09QVElPTlNfSAorI2RlZmluZSBMTFZNX0FEVF9JTElTVF9OT0RFX09QVElPTlNfSAorCisjaW5jbHVkZSAibGx2bS9Db25maWcvYWJpLWJyZWFraW5nLmgiCisjaW5jbHVkZSAibGx2bS9Db25maWcvbGx2bS1jb25maWcuaCIKKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDxib29sIEVuYWJsZVNlbnRpbmVsVHJhY2tpbmc+IGNsYXNzIGlsaXN0X25vZGVfYmFzZTsKK3RlbXBsYXRlIDxib29sIEVuYWJsZVNlbnRpbmVsVHJhY2tpbmc+IGNsYXNzIGlsaXN0X2Jhc2U7CisKKy8vLyBPcHRpb24gdG8gY2hvb3NlIHdoZXRoZXIgdG8gdHJhY2sgc2VudGluZWxzLgorLy8vCisvLy8gVGhpcyBvcHRpb24gYWZmZWN0cyB0aGUgQUJJIGZvciB0aGUgbm9kZXMuICBXaGVuIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseSwKKy8vLyB0aGUgQUJJIGRlcGVuZHMgb24gTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUy4gIFNwZWNpZnkgZXhwbGljaXRseSB0bworLy8vIGVuYWJsZSBcYSBpbGlzdF9ub2RlOjppc1NlbnRpbmVsKCkuCit0ZW1wbGF0ZSA8Ym9vbCBFbmFibGVTZW50aW5lbFRyYWNraW5nPiBzdHJ1Y3QgaWxpc3Rfc2VudGluZWxfdHJhY2tpbmcge307CisKKy8vLyBPcHRpb24gdG8gc3BlY2lmeSBhIHRhZyBmb3IgdGhlIG5vZGUgdHlwZS4KKy8vLworLy8vIFRoaXMgb3B0aW9uIGFsbG93cyBhIHNpbmdsZSB2YWx1ZSB0eXBlIHRvIGJlIGluc2VydGVkIGluIG11bHRpcGxlIGxpc3RzCisvLy8gc2ltdWx0YW5lb3VzbHkuICBTZWUgXGEgaWxpc3Rfbm9kZSBmb3IgdXNhZ2UgZXhhbXBsZXMuCit0ZW1wbGF0ZSA8Y2xhc3MgVGFnPiBzdHJ1Y3QgaWxpc3RfdGFnIHt9OworCituYW1lc3BhY2UgaWxpc3RfZGV0YWlsIHsKKworLy8vIEhlbHBlciB0cmFpdCBmb3IgcmVjb3JkaW5nIHdoZXRoZXIgYW4gb3B0aW9uIGlzIHNwZWNpZmllZCBleHBsaWNpdGx5LgordGVtcGxhdGUgPGJvb2wgSXNFeHBsaWNpdD4gc3RydWN0IGV4cGxpY2l0bmVzcyB7CisgIHN0YXRpYyBjb25zdCBib29sIGlzX2V4cGxpY2l0ID0gSXNFeHBsaWNpdDsKK307Cit0eXBlZGVmIGV4cGxpY2l0bmVzczx0cnVlPiBpc19leHBsaWNpdDsKK3R5cGVkZWYgZXhwbGljaXRuZXNzPGZhbHNlPiBpc19pbXBsaWNpdDsKKworLy8vIENoZWNrIHdoZXRoZXIgYW4gb3B0aW9uIGlzIHZhbGlkLgorLy8vCisvLy8gVGhlIHN0ZXBzIGZvciBhZGRpbmcgYW5kIGVuYWJsaW5nIGEgbmV3IGlsaXN0IG9wdGlvbiBpbmNsdWRlOgorLy8vIFxsaSBkZWZpbmUgdGhlIG9wdGlvbiwgaWxpc3RfZm9vPEJhcj4sIGFib3ZlOworLy8vIFxsaSBhZGQgbmV3IHBhcmFtZXRlcnMgZm9yIEJhciB0byBcYSBpbGlzdF9kZXRhaWw6Om5vZGVfb3B0aW9uczsKKy8vLyBcbGkgYWRkIGFuIGV4dHJhY3Rpb24gbWV0YS1mdW5jdGlvbiwgaWxpc3RfZGV0YWlsOjpleHRyYWN0X2ZvbzsKKy8vLyBcbGkgY2FsbCBleHRyYWN0X2ZvbyBmcm9tIFxhIGlsaXN0X2RldGFpbDo6Y29tcHV0ZV9ub2RlX29wdGlvbnMgYW5kIHBhc3MgaXQKKy8vLyBpbnRvIFxhIGlsaXN0X2RldGFpbDo6bm9kZV9vcHRpb25zOyBhbmQKKy8vLyBcbGkgc3BlY2lhbGl6ZSBcYyBpc192YWxpZF9vcHRpb248aWxpc3RfZm9vPEJhcj4+IHRvIGluaGVyaXQgZnJvbSBcYworLy8vIHN0ZDo6dHJ1ZV90eXBlIHRvIGdldCBzdGF0aWMgYXNzZXJ0aW9ucyBwYXNzaW5nIGluIFxhIHNpbXBsZV9pbGlzdCBhbmQgXGEKKy8vLyBpbGlzdF9ub2RlLgordGVtcGxhdGUgPGNsYXNzIE9wdGlvbj4gc3RydWN0IGlzX3ZhbGlkX29wdGlvbiA6IHN0ZDo6ZmFsc2VfdHlwZSB7fTsKKworLy8vIEV4dHJhY3Qgc2VudGluZWwgdHJhY2tpbmcgb3B0aW9uLgorLy8vCisvLy8gTG9vayB0aHJvdWdoIFxwIE9wdGlvbnMgZm9yIHRoZSBcYSBpbGlzdF9zZW50aW5lbF90cmFja2luZyBvcHRpb24sIHdpdGggdGhlCisvLy8gZGVmYXVsdCBkZXBlbmRpbmcgb24gTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUy4KK3RlbXBsYXRlIDxjbGFzcy4uLiBPcHRpb25zPiBzdHJ1Y3QgZXh0cmFjdF9zZW50aW5lbF90cmFja2luZzsKK3RlbXBsYXRlIDxib29sIEVuYWJsZVNlbnRpbmVsVHJhY2tpbmcsIGNsYXNzLi4uIE9wdGlvbnM+CitzdHJ1Y3QgZXh0cmFjdF9zZW50aW5lbF90cmFja2luZzwKKyAgICBpbGlzdF9zZW50aW5lbF90cmFja2luZzxFbmFibGVTZW50aW5lbFRyYWNraW5nPiwgT3B0aW9ucy4uLj4KKyAgICA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgRW5hYmxlU2VudGluZWxUcmFja2luZz4sIGlzX2V4cGxpY2l0IHt9OwordGVtcGxhdGUgPGNsYXNzIE9wdGlvbjEsIGNsYXNzLi4uIE9wdGlvbnM+CitzdHJ1Y3QgZXh0cmFjdF9zZW50aW5lbF90cmFja2luZzxPcHRpb24xLCBPcHRpb25zLi4uPgorICAgIDogZXh0cmFjdF9zZW50aW5lbF90cmFja2luZzxPcHRpb25zLi4uPiB7fTsKKyNpZiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgZXh0cmFjdF9zZW50aW5lbF90cmFja2luZzw+IDogc3RkOjp0cnVlX3R5cGUsIGlzX2ltcGxpY2l0IHt9OworI2Vsc2UKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZXh0cmFjdF9zZW50aW5lbF90cmFja2luZzw+IDogc3RkOjpmYWxzZV90eXBlLCBpc19pbXBsaWNpdCB7fTsKKyNlbmRpZgordGVtcGxhdGUgPGJvb2wgRW5hYmxlU2VudGluZWxUcmFja2luZz4KK3N0cnVjdCBpc192YWxpZF9vcHRpb248aWxpc3Rfc2VudGluZWxfdHJhY2tpbmc8RW5hYmxlU2VudGluZWxUcmFja2luZz4+CisgICAgOiBzdGQ6OnRydWVfdHlwZSB7fTsKKworLy8vIEV4dHJhY3QgY3VzdG9tIHRhZyBvcHRpb24uCisvLy8KKy8vLyBMb29rIHRocm91Z2ggXHAgT3B0aW9ucyBmb3IgdGhlIFxhIGlsaXN0X3RhZyBvcHRpb24sIHB1bGxpbmcgb3V0IHRoZQorLy8vIGN1c3RvbSB0YWcgdHlwZSwgdXNpbmcgdm9pZCBhcyBhIGRlZmF1bHQuCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gT3B0aW9ucz4gc3RydWN0IGV4dHJhY3RfdGFnOwordGVtcGxhdGUgPGNsYXNzIFRhZywgY2xhc3MuLi4gT3B0aW9ucz4KK3N0cnVjdCBleHRyYWN0X3RhZzxpbGlzdF90YWc8VGFnPiwgT3B0aW9ucy4uLj4geworICB0eXBlZGVmIFRhZyB0eXBlOworfTsKK3RlbXBsYXRlIDxjbGFzcyBPcHRpb24xLCBjbGFzcy4uLiBPcHRpb25zPgorc3RydWN0IGV4dHJhY3RfdGFnPE9wdGlvbjEsIE9wdGlvbnMuLi4+IDogZXh0cmFjdF90YWc8T3B0aW9ucy4uLj4ge307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgZXh0cmFjdF90YWc8PiB7IHR5cGVkZWYgdm9pZCB0eXBlOyB9OwordGVtcGxhdGUgPGNsYXNzIFRhZz4gc3RydWN0IGlzX3ZhbGlkX29wdGlvbjxpbGlzdF90YWc8VGFnPj4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKKworLy8vIENoZWNrIHdoZXRoZXIgb3B0aW9ucyBhcmUgdmFsaWQuCisvLy8KKy8vLyBUaGUgY29uanVuY3Rpb24gb2YgXGEgaXNfdmFsaWRfb3B0aW9uIG9uIGVhY2ggaW5kaXZpZHVhbCBvcHRpb24uCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gT3B0aW9ucz4gc3RydWN0IGNoZWNrX29wdGlvbnM7Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgY2hlY2tfb3B0aW9uczw+IDogc3RkOjp0cnVlX3R5cGUge307Cit0ZW1wbGF0ZSA8Y2xhc3MgT3B0aW9uMSwgY2xhc3MuLi4gT3B0aW9ucz4KK3N0cnVjdCBjaGVja19vcHRpb25zPE9wdGlvbjEsIE9wdGlvbnMuLi4+CisgICAgOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3ZhbGlkX29wdGlvbjxPcHRpb24xPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX29wdGlvbnM8T3B0aW9ucy4uLj46OnZhbHVlPiB7fTsKKworLy8vIFRyYWl0cyBmb3Igb3B0aW9ucyBmb3IgXGEgaWxpc3Rfbm9kZS4KKy8vLworLy8vIFRoaXMgaXMgdXN1YWxseSBjb21wdXRlZCB2aWEgXGEgY29tcHV0ZV9ub2RlX29wdGlvbnMuCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgYm9vbCBFbmFibGVTZW50aW5lbFRyYWNraW5nLCBib29sIElzU2VudGluZWxUcmFja2luZ0V4cGxpY2l0LAorICAgICAgICAgIGNsYXNzIFRhZ1Q+CitzdHJ1Y3Qgbm9kZV9vcHRpb25zIHsKKyAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgVCAqcG9pbnRlcjsKKyAgdHlwZWRlZiBUICZyZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgVCAqY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCBUICZjb25zdF9yZWZlcmVuY2U7CisKKyAgc3RhdGljIGNvbnN0IGJvb2wgZW5hYmxlX3NlbnRpbmVsX3RyYWNraW5nID0gRW5hYmxlU2VudGluZWxUcmFja2luZzsKKyAgc3RhdGljIGNvbnN0IGJvb2wgaXNfc2VudGluZWxfdHJhY2tpbmdfZXhwbGljaXQgPSBJc1NlbnRpbmVsVHJhY2tpbmdFeHBsaWNpdDsKKyAgdHlwZWRlZiBUYWdUIHRhZzsKKyAgdHlwZWRlZiBpbGlzdF9ub2RlX2Jhc2U8ZW5hYmxlX3NlbnRpbmVsX3RyYWNraW5nPiBub2RlX2Jhc2VfdHlwZTsKKyAgdHlwZWRlZiBpbGlzdF9iYXNlPGVuYWJsZV9zZW50aW5lbF90cmFja2luZz4gbGlzdF9iYXNlX3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MuLi4gT3B0aW9ucz4gc3RydWN0IGNvbXB1dGVfbm9kZV9vcHRpb25zIHsKKyAgdHlwZWRlZiBub2RlX29wdGlvbnM8VCwgZXh0cmFjdF9zZW50aW5lbF90cmFja2luZzxPcHRpb25zLi4uPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3Rfc2VudGluZWxfdHJhY2tpbmc8T3B0aW9ucy4uLj46OmlzX2V4cGxpY2l0LAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBleHRyYWN0X3RhZzxPcHRpb25zLi4uPjo6dHlwZT4KKyAgICAgIHR5cGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaWxpc3RfZGV0YWlsCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfSUxJU1RfTk9ERV9PUFRJT05TX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2l0ZXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9pdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMWY4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9pdGVyYXRvci5oCkBAIC0wLDAgKzEsMzM5IEBACisvLz09PS0gaXRlcmF0b3IuaCAtIFV0aWxpdGllcyBmb3IgdXNpbmcgYW5kIGRlZmluaW5nIGl0ZXJhdG9ycyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0lURVJBVE9SX0gKKyNkZWZpbmUgTExWTV9BRFRfSVRFUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgQ1JUUCBiYXNlIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIGVudGlyZSBzdGFuZGFyZCBpdGVyYXRvciBmYWNhZGUKKy8vLyBpbiB0ZXJtcyBvZiBhIG1pbmltYWwgc3Vic2V0IG9mIHRoZSBpbnRlcmZhY2UuCisvLy8KKy8vLyBVc2UgdGhpcyB3aGVuIGl0IGlzIHJlYXNvbmFibGUgdG8gaW1wbGVtZW50IG1vc3Qgb2YgdGhlIGl0ZXJhdG9yCisvLy8gZnVuY3Rpb25hbGl0eSBpbiB0ZXJtcyBvZiBhIGNvcmUgc3Vic2V0LiBJZiB5b3UgbmVlZCBzcGVjaWFsIGJlaGF2aW9yIG9yCisvLy8gdGhlcmUgYXJlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucyBmb3IgdGhpcywgeW91IG1heSB3YW50IHRvIG92ZXJyaWRlIHRoZQorLy8vIHJlbGV2YW50IG1lbWJlcnMgaW5zdGVhZC4KKy8vLworLy8vIE5vdGUsIG9uZSBhYnN0cmFjdGlvbiB0aGF0IHRoaXMgZG9lcyAqbm90KiBwcm92aWRlIGlzIGltcGxlbWVudGluZworLy8vIHN1YnRyYWN0aW9uIGluIHRlcm1zIG9mIGFkZGl0aW9uIGJ5IG5lZ2F0aW5nIHRoZSBkaWZmZXJlbmNlLiBOZWdhdGlvbiBpc24ndAorLy8vIGFsd2F5cyBpbmZvcm1hdGlvbiBwcmVzZXJ2aW5nLCBhbmQgSSBjYW4gc2VlIHZlcnkgcmVhc29uYWJsZSBpdGVyYXRvcgorLy8vIGRlc2lnbnMgd2hlcmUgdGhpcyBkb2Vzbid0IHdvcmsgd2VsbC4gSXQgZG9lc24ndCByZWFsbHkgZm9yY2UgbXVjaCBhZGRlZAorLy8vIGJvaWxlcnBsYXRlIGFueXdheXMuCisvLy8KKy8vLyBBbm90aGVyIGFic3RyYWN0aW9uIHRoYXQgdGhpcyBkb2Vzbid0IHByb3ZpZGUgaXMgaW1wbGVtZW50aW5nIGluY3JlbWVudCBpbgorLy8vIHRlcm1zIG9mIGFkZGl0aW9uIG9mIG9uZS4gVGhlc2UgYXJlbid0IGVxdWl2YWxlbnQgZm9yIGFsbCBpdGVyYXRvcgorLy8vIGNhdGVnb3JpZXMsIGFuZCByZXNwZWN0aW5nIHRoYXQgYWRkcyBhIGxvdCBvZiBjb21wbGV4aXR5IGZvciBsaXR0bGUgZ2Fpbi4KKy8vLworLy8vIENsYXNzZXMgd2lzaGluZyB0byB1c2UgYGl0ZXJhdG9yX2ZhY2FkZV9iYXNlYCBzaG91bGQgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcKKy8vLyBtZXRob2RzOgorLy8vCisvLy8gRm9yd2FyZCBJdGVyYXRvcnM6CisvLy8gICAoQWxsIG9mIHRoZSBmb2xsb3dpbmcgbWV0aG9kcykKKy8vLyAgIC0gRGVyaXZlZFQgJm9wZXJhdG9yPShjb25zdCBEZXJpdmVkVCAmUik7CisvLy8gICAtIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEZXJpdmVkVCAmUikgY29uc3Q7CisvLy8gICAtIGNvbnN0IFQgJm9wZXJhdG9yKigpIGNvbnN0OworLy8vICAgLSBUICZvcGVyYXRvciooKTsKKy8vLyAgIC0gRGVyaXZlZFQgJm9wZXJhdG9yKysoKTsKKy8vLworLy8vIEJpZGlyZWN0aW9uYWwgSXRlcmF0b3JzOgorLy8vICAgKEFsbCBtZXRob2RzIG9mIGZvcndhcmQgaXRlcmF0b3JzLCBwbHVzIHRoZSBmb2xsb3dpbmcpCisvLy8gICAtIERlcml2ZWRUICZvcGVyYXRvci0tKCk7CisvLy8KKy8vLyBSYW5kb20tYWNjZXNzIEl0ZXJhdG9yczoKKy8vLyAgIChBbGwgbWV0aG9kcyBvZiBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9ycyBleGNsdWRpbmcgdGhlIGZvbGxvd2luZykKKy8vLyAgIC0gRGVyaXZlZFQgJm9wZXJhdG9yKysoKTsKKy8vLyAgIC0gRGVyaXZlZFQgJm9wZXJhdG9yLS0oKTsKKy8vLyAgIChhbmQgcGx1cyB0aGUgZm9sbG93aW5nKQorLy8vICAgLSBib29sIG9wZXJhdG9yPChjb25zdCBEZXJpdmVkVCAmUkhTKSBjb25zdDsKKy8vLyAgIC0gRGlmZmVyZW5jZVR5cGVUIG9wZXJhdG9yLShjb25zdCBEZXJpdmVkVCAmUikgY29uc3Q7CisvLy8gICAtIERlcml2ZWRUICZvcGVyYXRvcis9KERpZmZlcmVuY2VUeXBlVCBOKTsKKy8vLyAgIC0gRGVyaXZlZFQgJm9wZXJhdG9yLT0oRGlmZmVyZW5jZVR5cGVUIE4pOworLy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZFQsIHR5cGVuYW1lIEl0ZXJhdG9yQ2F0ZWdvcnlULCB0eXBlbmFtZSBULAorICAgICAgICAgIHR5cGVuYW1lIERpZmZlcmVuY2VUeXBlVCA9IHN0ZDo6cHRyZGlmZl90LCB0eXBlbmFtZSBQb2ludGVyVCA9IFQgKiwKKyAgICAgICAgICB0eXBlbmFtZSBSZWZlcmVuY2VUID0gVCAmPgorY2xhc3MgaXRlcmF0b3JfZmFjYWRlX2Jhc2UKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPEl0ZXJhdG9yQ2F0ZWdvcnlULCBULCBEaWZmZXJlbmNlVHlwZVQsIFBvaW50ZXJULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlVD4geworcHJvdGVjdGVkOgorICBlbnVtIHsKKyAgICBJc1JhbmRvbUFjY2VzcyA9IHN0ZDo6aXNfYmFzZV9vZjxzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yQ2F0ZWdvcnlUPjo6dmFsdWUsCisgICAgSXNCaWRpcmVjdGlvbmFsID0gc3RkOjppc19iYXNlX29mPHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yQ2F0ZWdvcnlUPjo6dmFsdWUsCisgIH07CisKKyAgLy8vIEEgcHJveHkgb2JqZWN0IGZvciBjb21wdXRpbmcgYSByZWZlcmVuY2UgdmlhIGluZGlyZWN0aW5nIGEgY29weSBvZiBhbgorICAvLy8gaXRlcmF0b3IuIFRoaXMgaXMgdXNlZCBpbiBBUElzIHdoaWNoIG5lZWQgdG8gcHJvZHVjZSBhIHJlZmVyZW5jZSB2aWEKKyAgLy8vIGluZGlyZWN0aW9uIGJ1dCBmb3Igd2hpY2ggdGhlIGl0ZXJhdG9yIG9iamVjdCBtaWdodCBiZSBhIHRlbXBvcmFyeS4gVGhlCisgIC8vLyBwcm94eSBwcmVzZXJ2ZXMgdGhlIGl0ZXJhdG9yIGludGVybmFsbHkgYW5kIGV4cG9zZXMgdGhlIGluZGlyZWN0ZWQKKyAgLy8vIHJlZmVyZW5jZSB2aWEgYSBjb252ZXJzaW9uIG9wZXJhdG9yLgorICBjbGFzcyBSZWZlcmVuY2VQcm94eSB7CisgICAgZnJpZW5kIGl0ZXJhdG9yX2ZhY2FkZV9iYXNlOworCisgICAgRGVyaXZlZFQgSTsKKworICAgIFJlZmVyZW5jZVByb3h5KERlcml2ZWRUIEkpIDogSShzdGQ6Om1vdmUoSSkpIHt9CisKKyAgcHVibGljOgorICAgIG9wZXJhdG9yIFJlZmVyZW5jZVQoKSBjb25zdCB7IHJldHVybiAqSTsgfQorICB9OworCitwdWJsaWM6CisgIERlcml2ZWRUIG9wZXJhdG9yKyhEaWZmZXJlbmNlVHlwZVQgbikgY29uc3QgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19iYXNlX29mPGl0ZXJhdG9yX2ZhY2FkZV9iYXNlLCBEZXJpdmVkVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIk11c3QgcGFzcyB0aGUgZGVyaXZlZCB0eXBlIHRvIHRoaXMgdGVtcGxhdGUhIik7CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgSXNSYW5kb21BY2Nlc3MsCisgICAgICAgICJUaGUgJysnIG9wZXJhdG9yIGlzIG9ubHkgZGVmaW5lZCBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuIik7CisgICAgRGVyaXZlZFQgdG1wID0gKnN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWRUICo+KHRoaXMpOworICAgIHRtcCArPSBuOworICAgIHJldHVybiB0bXA7CisgIH0KKyAgZnJpZW5kIERlcml2ZWRUIG9wZXJhdG9yKyhEaWZmZXJlbmNlVHlwZVQgbiwgY29uc3QgRGVyaXZlZFQgJmkpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBJc1JhbmRvbUFjY2VzcywKKyAgICAgICAgIlRoZSAnKycgb3BlcmF0b3IgaXMgb25seSBkZWZpbmVkIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4iKTsKKyAgICByZXR1cm4gaSArIG47CisgIH0KKyAgRGVyaXZlZFQgb3BlcmF0b3ItKERpZmZlcmVuY2VUeXBlVCBuKSBjb25zdCB7CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgSXNSYW5kb21BY2Nlc3MsCisgICAgICAgICJUaGUgJy0nIG9wZXJhdG9yIGlzIG9ubHkgZGVmaW5lZCBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuIik7CisgICAgRGVyaXZlZFQgdG1wID0gKnN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWRUICo+KHRoaXMpOworICAgIHRtcCAtPSBuOworICAgIHJldHVybiB0bXA7CisgIH0KKworICBEZXJpdmVkVCAmb3BlcmF0b3IrKygpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfYmFzZV9vZjxpdGVyYXRvcl9mYWNhZGVfYmFzZSwgRGVyaXZlZFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJNdXN0IHBhc3MgdGhlIGRlcml2ZWQgdHlwZSB0byB0aGlzIHRlbXBsYXRlISIpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkVCAqPih0aGlzKS0+b3BlcmF0b3IrPSgxKTsKKyAgfQorICBEZXJpdmVkVCBvcGVyYXRvcisrKGludCkgeworICAgIERlcml2ZWRUIHRtcCA9ICpzdGF0aWNfY2FzdDxEZXJpdmVkVCAqPih0aGlzKTsKKyAgICArKypzdGF0aWNfY2FzdDxEZXJpdmVkVCAqPih0aGlzKTsKKyAgICByZXR1cm4gdG1wOworICB9CisgIERlcml2ZWRUICZvcGVyYXRvci0tKCkgeworICAgIHN0YXRpY19hc3NlcnQoCisgICAgICAgIElzQmlkaXJlY3Rpb25hbCwKKyAgICAgICAgIlRoZSBkZWNyZW1lbnQgb3BlcmF0b3IgaXMgb25seSBkZWZpbmVkIGZvciBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9ycy4iKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVyaXZlZFQgKj4odGhpcyktPm9wZXJhdG9yLT0oMSk7CisgIH0KKyAgRGVyaXZlZFQgb3BlcmF0b3ItLShpbnQpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBJc0JpZGlyZWN0aW9uYWwsCisgICAgICAgICJUaGUgZGVjcmVtZW50IG9wZXJhdG9yIGlzIG9ubHkgZGVmaW5lZCBmb3IgYmlkaXJlY3Rpb25hbCBpdGVyYXRvcnMuIik7CisgICAgRGVyaXZlZFQgdG1wID0gKnN0YXRpY19jYXN0PERlcml2ZWRUICo+KHRoaXMpOworICAgIC0tKnN0YXRpY19jYXN0PERlcml2ZWRUICo+KHRoaXMpOworICAgIHJldHVybiB0bXA7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgRGVyaXZlZFQgJlJIUykgY29uc3QgeworICAgIHJldHVybiAhc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZFQgKj4odGhpcyktPm9wZXJhdG9yPT0oUkhTKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IERlcml2ZWRUICZSSFMpIGNvbnN0IHsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBJc1JhbmRvbUFjY2VzcywKKyAgICAgICAgIlJlbGF0aW9uYWwgb3BlcmF0b3JzIGFyZSBvbmx5IGRlZmluZWQgZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLiIpOworICAgIHJldHVybiAhc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZFQgKj4odGhpcyktPm9wZXJhdG9yPChSSFMpICYmCisgICAgICAgICAgICFzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkVCAqPih0aGlzKS0+b3BlcmF0b3I9PShSSFMpOworICB9CisgIGJvb2wgb3BlcmF0b3I8PShjb25zdCBEZXJpdmVkVCAmUkhTKSBjb25zdCB7CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgSXNSYW5kb21BY2Nlc3MsCisgICAgICAgICJSZWxhdGlvbmFsIG9wZXJhdG9ycyBhcmUgb25seSBkZWZpbmVkIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4iKTsKKyAgICByZXR1cm4gIXN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWRUICo+KHRoaXMpLT5vcGVyYXRvcj4oUkhTKTsKKyAgfQorICBib29sIG9wZXJhdG9yPj0oY29uc3QgRGVyaXZlZFQgJlJIUykgY29uc3QgeworICAgIHN0YXRpY19hc3NlcnQoCisgICAgICAgIElzUmFuZG9tQWNjZXNzLAorICAgICAgICAiUmVsYXRpb25hbCBvcGVyYXRvcnMgYXJlIG9ubHkgZGVmaW5lZCBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuIik7CisgICAgcmV0dXJuICFzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkVCAqPih0aGlzKS0+b3BlcmF0b3I8KFJIUyk7CisgIH0KKworICBQb2ludGVyVCBvcGVyYXRvci0+KCkgeyByZXR1cm4gJnN0YXRpY19jYXN0PERlcml2ZWRUICo+KHRoaXMpLT5vcGVyYXRvciooKTsgfQorICBQb2ludGVyVCBvcGVyYXRvci0+KCkgY29uc3QgeworICAgIHJldHVybiAmc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZFQgKj4odGhpcyktPm9wZXJhdG9yKigpOworICB9CisgIFJlZmVyZW5jZVByb3h5IG9wZXJhdG9yW10oRGlmZmVyZW5jZVR5cGVUIG4pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KElzUmFuZG9tQWNjZXNzLAorICAgICAgICAgICAgICAgICAgIlN1YnNjcmlwdGluZyBpcyBvbmx5IGRlZmluZWQgZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLiIpOworICAgIHJldHVybiBSZWZlcmVuY2VQcm94eShzdGF0aWNfY2FzdDxEZXJpdmVkVCAqPih0aGlzKS0+b3BlcmF0b3IrKG4pKTsKKyAgfQorICBSZWZlcmVuY2VQcm94eSBvcGVyYXRvcltdKERpZmZlcmVuY2VUeXBlVCBuKSBjb25zdCB7CisgICAgc3RhdGljX2Fzc2VydChJc1JhbmRvbUFjY2VzcywKKyAgICAgICAgICAgICAgICAgICJTdWJzY3JpcHRpbmcgaXMgb25seSBkZWZpbmVkIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4iKTsKKyAgICByZXR1cm4gUmVmZXJlbmNlUHJveHkoc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZFQgKj4odGhpcyktPm9wZXJhdG9yKyhuKSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQ1JUUCBiYXNlIGNsYXNzIGZvciBhZGFwdGluZyBhbiBpdGVyYXRvciB0byBhIGRpZmZlcmVudCB0eXBlLgorLy8vCisvLy8gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0aHJvdWdoIENSVFAgdG8gYWRhcHQgb25lIGl0ZXJhdG9yIGludG8gYW5vdGhlci4KKy8vLyBUeXBpY2FsbHkgdGhpcyBpcyBkb25lIHRocm91Z2ggcHJvdmlkaW5nIGluIHRoZSBkZXJpdmVkIGNsYXNzIGEgY3VzdG9tIFxjCisvLy8gb3BlcmF0b3IqIGltcGxlbWVudGF0aW9uLiBPdGhlciBtZXRob2RzIGNhbiBiZSBvdmVycmlkZGVuIGFzIHdlbGwuCit0ZW1wbGF0ZSA8CisgICAgdHlwZW5hbWUgRGVyaXZlZFQsIHR5cGVuYW1lIFdyYXBwZWRJdGVyYXRvclQsCisgICAgdHlwZW5hbWUgSXRlcmF0b3JDYXRlZ29yeVQgPQorICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxXcmFwcGVkSXRlcmF0b3JUPjo6aXRlcmF0b3JfY2F0ZWdvcnksCisgICAgdHlwZW5hbWUgVCA9IHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPFdyYXBwZWRJdGVyYXRvclQ+Ojp2YWx1ZV90eXBlLAorICAgIHR5cGVuYW1lIERpZmZlcmVuY2VUeXBlVCA9CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPFdyYXBwZWRJdGVyYXRvclQ+OjpkaWZmZXJlbmNlX3R5cGUsCisgICAgdHlwZW5hbWUgUG9pbnRlclQgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPAorICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JhcHBlZEl0ZXJhdG9yVD46OnZhbHVlX3R5cGU+Ojp2YWx1ZSwKKyAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8V3JhcHBlZEl0ZXJhdG9yVD46OnBvaW50ZXIsIFQgKj46OnR5cGUsCisgICAgdHlwZW5hbWUgUmVmZXJlbmNlVCA9IHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8CisgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcmFwcGVkSXRlcmF0b3JUPjo6dmFsdWVfdHlwZT46OnZhbHVlLAorICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxXcmFwcGVkSXRlcmF0b3JUPjo6cmVmZXJlbmNlLCBUICY+Ojp0eXBlLAorICAgIC8vIERvbid0IHByb3ZpZGUgdGhlc2UsIHRoZXkgYXJlIG1vc3RseSB0byBhY3QgYXMgYWxpYXNlcyBiZWxvdy4KKyAgICB0eXBlbmFtZSBXcmFwcGVkVHJhaXRzVCA9IHN0ZDo6aXRlcmF0b3JfdHJhaXRzPFdyYXBwZWRJdGVyYXRvclQ+PgorY2xhc3MgaXRlcmF0b3JfYWRhcHRvcl9iYXNlCisgICAgOiBwdWJsaWMgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8RGVyaXZlZFQsIEl0ZXJhdG9yQ2F0ZWdvcnlULCBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpZmZlcmVuY2VUeXBlVCwgUG9pbnRlclQsIFJlZmVyZW5jZVQ+IHsKKyAgdXNpbmcgQmFzZVQgPSB0eXBlbmFtZSBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U6Oml0ZXJhdG9yX2ZhY2FkZV9iYXNlOworCitwcm90ZWN0ZWQ6CisgIFdyYXBwZWRJdGVyYXRvclQgSTsKKworICBpdGVyYXRvcl9hZGFwdG9yX2Jhc2UoKSA9IGRlZmF1bHQ7CisKKyAgZXhwbGljaXQgaXRlcmF0b3JfYWRhcHRvcl9iYXNlKFdyYXBwZWRJdGVyYXRvclQgdSkgOiBJKHN0ZDo6bW92ZSh1KSkgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19iYXNlX29mPGl0ZXJhdG9yX2FkYXB0b3JfYmFzZSwgRGVyaXZlZFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJNdXN0IHBhc3MgdGhlIGRlcml2ZWQgdHlwZSB0byB0aGlzIHRlbXBsYXRlISIpOworICB9CisKKyAgY29uc3QgV3JhcHBlZEl0ZXJhdG9yVCAmd3JhcHBlZCgpIGNvbnN0IHsgcmV0dXJuIEk7IH0KKworcHVibGljOgorICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBEaWZmZXJlbmNlVHlwZVQ7CisKKyAgRGVyaXZlZFQgJm9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIG4pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBCYXNlVDo6SXNSYW5kb21BY2Nlc3MsCisgICAgICAgICJUaGUgJys9JyBvcGVyYXRvciBpcyBvbmx5IGRlZmluZWQgZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLiIpOworICAgIEkgKz0gbjsKKyAgICByZXR1cm4gKnN0YXRpY19jYXN0PERlcml2ZWRUICo+KHRoaXMpOworICB9CisgIERlcml2ZWRUICZvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBuKSB7CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgQmFzZVQ6OklzUmFuZG9tQWNjZXNzLAorICAgICAgICAiVGhlICctPScgb3BlcmF0b3IgaXMgb25seSBkZWZpbmVkIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4iKTsKKyAgICBJIC09IG47CisgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxEZXJpdmVkVCAqPih0aGlzKTsKKyAgfQorICB1c2luZyBCYXNlVDo6b3BlcmF0b3ItOworICBkaWZmZXJlbmNlX3R5cGUgb3BlcmF0b3ItKGNvbnN0IERlcml2ZWRUICZSSFMpIGNvbnN0IHsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBCYXNlVDo6SXNSYW5kb21BY2Nlc3MsCisgICAgICAgICJUaGUgJy0nIG9wZXJhdG9yIGlzIG9ubHkgZGVmaW5lZCBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuIik7CisgICAgcmV0dXJuIEkgLSBSSFMuSTsKKyAgfQorCisgIC8vIFdlIGhhdmUgdG8gZXhwbGljaXRseSBwcm92aWRlICsrIGFuZCAtLSByYXRoZXIgdGhhbiBsZXR0aW5nIHRoZSBmYWNhZGUKKyAgLy8gZm9yd2FyZCB0byArPSBiZWNhdXNlIFdyYXBwZWRJdGVyYXRvclQgbWlnaHQgbm90IHN1cHBvcnQgKz0uCisgIHVzaW5nIEJhc2VUOjpvcGVyYXRvcisrOworICBEZXJpdmVkVCAmb3BlcmF0b3IrKygpIHsKKyAgICArK0k7CisgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxEZXJpdmVkVCAqPih0aGlzKTsKKyAgfQorICB1c2luZyBCYXNlVDo6b3BlcmF0b3ItLTsKKyAgRGVyaXZlZFQgJm9wZXJhdG9yLS0oKSB7CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgQmFzZVQ6OklzQmlkaXJlY3Rpb25hbCwKKyAgICAgICAgIlRoZSBkZWNyZW1lbnQgb3BlcmF0b3IgaXMgb25seSBkZWZpbmVkIGZvciBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9ycy4iKTsKKyAgICAtLUk7CisgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxEZXJpdmVkVCAqPih0aGlzKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEZXJpdmVkVCAmUkhTKSBjb25zdCB7IHJldHVybiBJID09IFJIUy5JOyB9CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IERlcml2ZWRUICZSSFMpIGNvbnN0IHsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBCYXNlVDo6SXNSYW5kb21BY2Nlc3MsCisgICAgICAgICJSZWxhdGlvbmFsIG9wZXJhdG9ycyBhcmUgb25seSBkZWZpbmVkIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4iKTsKKyAgICByZXR1cm4gSSA8IFJIUy5JOworICB9CisKKyAgUmVmZXJlbmNlVCBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqSTsgfQorfTsKKworLy8vIFxicmllZiBBbiBpdGVyYXRvciB0eXBlIHRoYXQgYWxsb3dzIGl0ZXJhdGluZyBvdmVyIHRoZSBwb2ludGVlcyB2aWEgc29tZQorLy8vIG90aGVyIGl0ZXJhdG9yLgorLy8vCisvLy8gVGhlIHR5cGljYWwgdXNhZ2Ugb2YgdGhpcyBpcyB0byBleHBvc2UgYSB0eXBlIHRoYXQgaXRlcmF0ZXMgb3ZlciBUcywgYnV0CisvLy8gd2hpY2ggaXMgaW1wbGVtZW50ZWQgd2l0aCBzb21lIGl0ZXJhdG9yIG92ZXIgVCpzOgorLy8vCisvLy8gXGNvZGUKKy8vLyAgIHVzaW5nIGl0ZXJhdG9yID0gcG9pbnRlZV9pdGVyYXRvcjxTbWFsbFZlY3RvckltcGw8VCAqPjo6aXRlcmF0b3I+OworLy8vIFxlbmRjb2RlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgV3JhcHBlZEl0ZXJhdG9yVCwKKyAgICAgICAgICB0eXBlbmFtZSBUID0gdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPAorICAgICAgICAgICAgICBkZWNsdHlwZSgqKnN0ZDo6ZGVjbHZhbDxXcmFwcGVkSXRlcmF0b3JUPigpKT46OnR5cGU+CitzdHJ1Y3QgcG9pbnRlZV9pdGVyYXRvcgorICAgIDogaXRlcmF0b3JfYWRhcHRvcl9iYXNlPAorICAgICAgICAgIHBvaW50ZWVfaXRlcmF0b3I8V3JhcHBlZEl0ZXJhdG9yVD4sIFdyYXBwZWRJdGVyYXRvclQsCisgICAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8V3JhcHBlZEl0ZXJhdG9yVD46Oml0ZXJhdG9yX2NhdGVnb3J5LAorICAgICAgICAgIFQ+IHsKKyAgcG9pbnRlZV9pdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHBvaW50ZWVfaXRlcmF0b3IoVSAmJnUpCisgICAgICA6IHBvaW50ZWVfaXRlcmF0b3I6Oml0ZXJhdG9yX2FkYXB0b3JfYmFzZShzdGQ6OmZvcndhcmQ8VSAmJj4odSkpIHt9CisKKyAgVCAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKip0aGlzLT5JOyB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmFuZ2VULCB0eXBlbmFtZSBXcmFwcGVkSXRlcmF0b3JUID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsdHlwZShzdGQ6OmJlZ2luKHN0ZDo6ZGVjbHZhbDxSYW5nZVQ+KCkpKT4KK2l0ZXJhdG9yX3JhbmdlPHBvaW50ZWVfaXRlcmF0b3I8V3JhcHBlZEl0ZXJhdG9yVD4+CittYWtlX3BvaW50ZWVfcmFuZ2UoUmFuZ2VUICYmUmFuZ2UpIHsKKyAgdXNpbmcgUG9pbnRlZUl0ZXJhdG9yVCA9IHBvaW50ZWVfaXRlcmF0b3I8V3JhcHBlZEl0ZXJhdG9yVD47CisgIHJldHVybiBtYWtlX3JhbmdlKFBvaW50ZWVJdGVyYXRvclQoc3RkOjpiZWdpbihzdGQ6OmZvcndhcmQ8UmFuZ2VUPihSYW5nZSkpKSwKKyAgICAgICAgICAgICAgICAgICAgUG9pbnRlZUl0ZXJhdG9yVChzdGQ6OmVuZChzdGQ6OmZvcndhcmQ8UmFuZ2VUPihSYW5nZSkpKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBXcmFwcGVkSXRlcmF0b3JULAorICAgICAgICAgIHR5cGVuYW1lIFQgPSBkZWNsdHlwZSgmKnN0ZDo6ZGVjbHZhbDxXcmFwcGVkSXRlcmF0b3JUPigpKT4KK2NsYXNzIHBvaW50ZXJfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8cG9pbnRlcl9pdGVyYXRvcjxXcmFwcGVkSXRlcmF0b3JUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JhcHBlZEl0ZXJhdG9yVCwgVD4geworICBtdXRhYmxlIFQgUHRyOworCitwdWJsaWM6CisgIHBvaW50ZXJfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgZXhwbGljaXQgcG9pbnRlcl9pdGVyYXRvcihXcmFwcGVkSXRlcmF0b3JUIHUpCisgICAgICA6IHBvaW50ZXJfaXRlcmF0b3I6Oml0ZXJhdG9yX2FkYXB0b3JfYmFzZShzdGQ6Om1vdmUodSkpIHt9CisKKyAgVCAmb3BlcmF0b3IqKCkgeyByZXR1cm4gUHRyID0gJip0aGlzLT5JOyB9CisgIGNvbnN0IFQgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIFB0ciA9ICYqdGhpcy0+STsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFJhbmdlVCwgdHlwZW5hbWUgV3JhcHBlZEl0ZXJhdG9yVCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbHR5cGUoc3RkOjpiZWdpbihzdGQ6OmRlY2x2YWw8UmFuZ2VUPigpKSk+CitpdGVyYXRvcl9yYW5nZTxwb2ludGVyX2l0ZXJhdG9yPFdyYXBwZWRJdGVyYXRvclQ+PgorbWFrZV9wb2ludGVyX3JhbmdlKFJhbmdlVCAmJlJhbmdlKSB7CisgIHVzaW5nIFBvaW50ZXJJdGVyYXRvclQgPSBwb2ludGVyX2l0ZXJhdG9yPFdyYXBwZWRJdGVyYXRvclQ+OworICByZXR1cm4gbWFrZV9yYW5nZShQb2ludGVySXRlcmF0b3JUKHN0ZDo6YmVnaW4oc3RkOjpmb3J3YXJkPFJhbmdlVD4oUmFuZ2UpKSksCisgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJJdGVyYXRvclQoc3RkOjplbmQoc3RkOjpmb3J3YXJkPFJhbmdlVD4oUmFuZ2UpKSkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfSVRFUkFUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NiZjYxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgKQEAgLTAsMCArMSw2OCBAQAorLy89PT0tIGl0ZXJhdG9yX3JhbmdlLmggLSBBIHJhbmdlIGFkYXB0b3IgZm9yIGl0ZXJhdG9ycyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFRoaXMgcHJvdmlkZXMgYSB2ZXJ5IHNpbXBsZSwgYm9yaW5nIGFkYXB0b3IgZm9yIGEgYmVnaW4gYW5kIGVuZCBpdGVyYXRvcgorLy8vIGludG8gYSByYW5nZSB0eXBlLiBUaGlzIHNob3VsZCBiZSB1c2VkIHRvIGJ1aWxkIHJhbmdlIHZpZXdzIHRoYXQgd29yayB3ZWxsCisvLy8gd2l0aCByYW5nZSBiYXNlZCBmb3IgbG9vcHMgYW5kIHJhbmdlIGJhc2VkIGNvbnN0cnVjdG9ycy4KKy8vLworLy8vIE5vdGUgdGhhdCBjb2RlIGhlcmUgZm9sbG93cyBtb3JlIHN0YW5kYXJkcy1iYXNlZCBjb2RpbmcgY29udmVudGlvbnMgYXMgaXQKKy8vLyBpcyBtaXJyb3JpbmcgcHJvcG9zZWQgaW50ZXJmYWNlcyBmb3Igc3RhbmRhcmRpemF0aW9uLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0lURVJBVE9SX1JBTkdFX0gKKyNkZWZpbmUgTExWTV9BRFRfSVRFUkFUT1JfUkFOR0VfSAorCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gXGJyaWVmIEEgcmFuZ2UgYWRhcHRvciBmb3IgYSBwYWlyIG9mIGl0ZXJhdG9ycy4KKy8vLworLy8vIFRoaXMganVzdCB3cmFwcyB0d28gaXRlcmF0b3JzIGludG8gYSByYW5nZS1jb21wYXRpYmxlIGludGVyZmFjZS4gTm90aGluZworLy8vIGZhbmN5IGF0IGFsbC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvclQ+CitjbGFzcyBpdGVyYXRvcl9yYW5nZSB7CisgIEl0ZXJhdG9yVCBiZWdpbl9pdGVyYXRvciwgZW5kX2l0ZXJhdG9yOworCitwdWJsaWM6CisgIC8vVE9ETzogQWRkIFNGSU5BRSB0byB0ZXN0IHRoYXQgdGhlIENvbnRhaW5lcidzIGl0ZXJhdG9ycyBtYXRjaCB0aGUgcmFuZ2UncworICAvLyAgICAgIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KKyAgaXRlcmF0b3JfcmFuZ2UoQ29udGFpbmVyICYmYykKKyAgLy9UT0RPOiBDb25zaWRlciBBREwvbm9uLW1lbWJlciBiZWdpbi9lbmQgY2FsbHMuCisgICAgICA6IGJlZ2luX2l0ZXJhdG9yKGMuYmVnaW4oKSksIGVuZF9pdGVyYXRvcihjLmVuZCgpKSB7fQorICBpdGVyYXRvcl9yYW5nZShJdGVyYXRvclQgYmVnaW5faXRlcmF0b3IsIEl0ZXJhdG9yVCBlbmRfaXRlcmF0b3IpCisgICAgICA6IGJlZ2luX2l0ZXJhdG9yKHN0ZDo6bW92ZShiZWdpbl9pdGVyYXRvcikpLAorICAgICAgICBlbmRfaXRlcmF0b3Ioc3RkOjptb3ZlKGVuZF9pdGVyYXRvcikpIHt9CisKKyAgSXRlcmF0b3JUIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gYmVnaW5faXRlcmF0b3I7IH0KKyAgSXRlcmF0b3JUIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGVuZF9pdGVyYXRvcjsgfQorfTsKKworLy8vIFxicmllZiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgaXRlcmF0aW5nIG92ZXIgc3ViLXJhbmdlcy4KKy8vLworLy8vIFRoaXMgcHJvdmlkZXMgYSBiaXQgb2Ygc3ludGFjdGljIHN1Z2FyIHRvIG1ha2UgdXNpbmcgc3ViLXJhbmdlcworLy8vIGluIGZvciBsb29wcyBhIGJpdCBlYXNpZXIuIEFuYWxvZ291cyB0byBzdGQ6Om1ha2VfcGFpcigpLgordGVtcGxhdGUgPGNsYXNzIFQ+IGl0ZXJhdG9yX3JhbmdlPFQ+IG1ha2VfcmFuZ2UoVCB4LCBUIHkpIHsKKyAgcmV0dXJuIGl0ZXJhdG9yX3JhbmdlPFQ+KHN0ZDo6bW92ZSh4KSwgc3RkOjptb3ZlKHkpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGl0ZXJhdG9yX3JhbmdlPFQ+IG1ha2VfcmFuZ2Uoc3RkOjpwYWlyPFQsIFQ+IHApIHsKKyAgcmV0dXJuIGl0ZXJhdG9yX3JhbmdlPFQ+KHN0ZDo6bW92ZShwLmZpcnN0KSwgc3RkOjptb3ZlKHAuc2Vjb25kKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpdGVyYXRvcl9yYW5nZTxkZWNsdHlwZShiZWdpbihzdGQ6OmRlY2x2YWw8VD4oKSkpPiBkcm9wX2JlZ2luKFQgJiZ0LCBpbnQgbikgeworICByZXR1cm4gbWFrZV9yYW5nZShzdGQ6Om5leHQoYmVnaW4odCksIG4pLCBlbmQodCkpOworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL3NpbXBsZV9pbGlzdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvc2ltcGxlX2lsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3NTk4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL3NpbXBsZV9pbGlzdC5oCkBAIC0wLDAgKzEsMzE1IEBACisvLz09PS0gbGx2bS9BRFQvc2ltcGxlX2lsaXN0LmggLSBTaW1wbGUgSW50cnVzaXZlIExpc3QgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NJTVBMRV9JTElTVF9ICisjZGVmaW5lIExMVk1fQURUX1NJTVBMRV9JTElTVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9iYXNlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3RfaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9ub2RlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZV9vcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEEgc2ltcGxlIGludHJ1c2l2ZSBsaXN0IGltcGxlbWVudGF0aW9uLgorLy8vCisvLy8gVGhpcyBpcyBhIHNpbXBsZSBpbnRydXNpdmUgbGlzdCBmb3IgYSBcYyBUIHRoYXQgaW5oZXJpdHMgZnJvbSBcYworLy8vIGlsaXN0X25vZGU8VD4uICBUaGUgbGlzdCBuZXZlciB0YWtlcyBvd25lcnNoaXAgb2YgYW55dGhpbmcgaW5zZXJ0ZWQgaW4gaXQuCisvLy8KKy8vLyBVbmxpa2UgXGEgaXBsaXN0PFQ+IGFuZCBcYSBpbGlzdDxUPiwgXGEgc2ltcGxlX2lsaXN0PFQ+IG5ldmVyIGFsbG9jYXRlcyBvcgorLy8vIGRlbGV0ZXMgdmFsdWVzLCBhbmQgaGFzIG5vIGNhbGxiYWNrIHRyYWl0cy4KKy8vLworLy8vIFRoZSBBUEkgZm9yIGFkZGluZyBub2RlcyBpbmNsdWRlIFxhIHB1c2hfZnJvbnQoKSwgXGEgcHVzaF9iYWNrKCksIGFuZCBcYQorLy8vIGluc2VydCgpLiAgVGhlc2UgYWxsIHRha2UgdmFsdWVzIGJ5IHJlZmVyZW5jZSAobm90IGJ5IHBvaW50ZXIpLCBleGNlcHQgZm9yCisvLy8gdGhlIHJhbmdlIHZlcnNpb24gb2YgXGEgaW5zZXJ0KCkuCisvLy8KKy8vLyBUaGVyZSBhcmUgdGhyZWUgc2V0cyBvZiBBUEkgZm9yIGRpc2NhcmRpbmcgbm9kZXMgZnJvbSB0aGUgbGlzdDogXGEKKy8vLyByZW1vdmUoKSwgd2hpY2ggdGFrZXMgYSByZWZlcmVuY2UgdG8gdGhlIG5vZGUgdG8gcmVtb3ZlLCBcYSBlcmFzZSgpLCB3aGljaAorLy8vIHRha2VzIGFuIGl0ZXJhdG9yIG9yIGl0ZXJhdG9yIHJhbmdlIGFuZCByZXR1cm5zIHRoZSBuZXh0IG9uZSwgYW5kIFxhCisvLy8gY2xlYXIoKSwgd2hpY2ggZW1wdGllcyBvdXQgdGhlIGNvbnRhaW5lci4gIEFsbCB0aHJlZSBhcmUgY29uc3RhbnQgdGltZQorLy8vIG9wZXJhdGlvbnMuICBOb25lIG9mIHRoZXNlIGRlbGV0ZXMgYW55IG5vZGVzOyBpbiBwYXJ0aWN1bGFyLCBpZiB0aGVyZSBpcyBhCisvLy8gc2luZ2xlIG5vZGUgaW4gdGhlIGxpc3QsIHRoZW4gdGhlc2UgaGF2ZSBpZGVudGljYWwgc2VtYW50aWNzOgorLy8vIFxsaSBcYyBMLnJlbW92ZShMLmZyb250KCkpOworLy8vIFxsaSBcYyBMLmVyYXNlKEwuYmVnaW4oKSk7CisvLy8gXGxpIFxjIEwuY2xlYXIoKTsKKy8vLworLy8vIEFzIGEgY29udmVuaWVuY2UgZm9yIGNhbGxlcnMsIHRoZXJlIGFyZSBwYXJhbGxlbCBBUElzIHRoYXQgdGFrZSBhIFxjCisvLy8gRGlzcG9zZXIgKHN1Y2ggYXMgXGMgc3RkOjpkZWZhdWx0X2RlbGV0ZTxUPik6IFxhIHJlbW92ZUFuZERpc3Bvc2UoKSwgXGEKKy8vLyBlcmFzZUFuZERpc3Bvc2UoKSwgYW5kIFxhIGNsZWFyQW5kRGlzcG9zZSgpLiAgVGhlc2UgaGF2ZSBkaWZmZXJlbnQgbmFtZXMKKy8vLyBiZWNhdXNlIHRoZSBleHRyYSBzZW1hbnRpYyBpcyBvdGhlcndpc2Ugbm9uLW9idmlvdXMuICBUaGV5IGFyZSBlcXVpdmFsZW50CisvLy8gdG8gY2FsbGluZyBcYSBzdGQ6OmZvcl9lYWNoKCkgb24gdGhlIHJhbmdlIHRvIGJlIGRpc2NhcmRlZC4KKy8vLworLy8vIFRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIFxwIE9wdGlvbnMgY3VzdG9taXplIHRoZSBub2RlcyBpbiB0aGUgbGlzdC4gIFRoZQorLy8vIHNhbWUgb3B0aW9ucyBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgXGEgaWxpc3Rfbm9kZSBpbnN0YW50YXRpb24gZm9yCisvLy8gY29tcGF0aWJpbGl0eSAoYWx0aG91Z2ggdGhlIG9yZGVyIGlzIGlycmVsZXZhbnQpLgorLy8vIFxsaSBVc2UgXGEgaWxpc3RfdGFnIHRvIGRlc2lnbmF0ZSB3aGljaCBpbGlzdF9ub2RlIGZvciBhIGdpdmVuIFxwIFQgdGhpcworLy8vIGxpc3Qgc2hvdWxkIHVzZS4gIFRoaXMgaXMgdXNlZnVsIGlmIGEgdHlwZSBccCBUIGlzIHBhcnQgb2YgbXVsdGlwbGUsCisvLy8gaW5kZXBlbmRlbnQgbGlzdHMgc2ltdWx0YW5lb3VzbHkuCisvLy8gXGxpIFVzZSBcYSBpbGlzdF9zZW50aW5lbF90cmFja2luZyB0byBhbHdheXMgKG9yIG5ldmVyKSB0cmFjayB3aGV0aGVyIGEKKy8vLyBub2RlIGlzIGEgc2VudGluZWwuICBTcGVjaWZ5aW5nIFxjIHRydWUgZW5hYmxlcyB0aGUgXGEKKy8vLyBpbGlzdF9ub2RlOjppc1NlbnRpbmVsKCkgQVBJLiAgVW5saWtlIFxhIGlsaXN0X25vZGU6OmlzS25vd25TZW50aW5lbCgpLAorLy8vIHdoaWNoIGlzIG9ubHkgYXBwcm9wcmlhdGUgZm9yIGFzc2VydGlvbnMsIFxhIGlsaXN0X25vZGU6OmlzU2VudGluZWwoKSBpcworLy8vIGFwcHJvcHJpYXRlIGZvciByZWFsIGxvZ2ljLgorLy8vCisvLy8gSGVyZSBhcmUgZXhhbXBsZXMgb2YgXHAgT3B0aW9ucyB1c2FnZToKKy8vLyBcbGkgXGMgc2ltcGxlX2lsaXN0PFQ+IGdpdmVzIHRoZSBkZWZhdWx0cy4gIFxsaSBcYworLy8vIHNpbXBsZV9pbGlzdDxULGlsaXN0X3NlbnRpbmVsX3RyYWNraW5nPHRydWU+PiBlbmFibGVzIHRoZSBcYQorLy8vIGlsaXN0X25vZGU6OmlzU2VudGluZWwoKSBBUEkuCisvLy8gXGxpIFxjIHNpbXBsZV9pbGlzdDxULGlsaXN0X3RhZzxBPixpbGlzdF9zZW50aW5lbF90cmFja2luZzxmYWxzZT4+CisvLy8gc3BlY2lmaWVzIGEgdGFnIG9mIEEgYW5kIHRoYXQgdHJhY2tpbmcgc2hvdWxkIGJlIG9mZiAoZXZlbiB3aGVuCisvLy8gTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUyBhcmUgZW5hYmxlZCkuCisvLy8gXGxpIFxjIHNpbXBsZV9pbGlzdDxULGlsaXN0X3NlbnRpbmVsX3RyYWNraW5nPGZhbHNlPixpbGlzdF90YWc8QT4+IGlzCisvLy8gZXF1aXZhbGVudCB0byB0aGUgbGFzdC4KKy8vLworLy8vIFNlZSBcYSBpc192YWxpZF9vcHRpb24gZm9yIHN0ZXBzIG9uIGFkZGluZyBhIG5ldyBvcHRpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgY2xhc3MuLi4gT3B0aW9ucz4KK2NsYXNzIHNpbXBsZV9pbGlzdAorICAgIDogaWxpc3RfZGV0YWlsOjpjb21wdXRlX25vZGVfb3B0aW9uczxULCBPcHRpb25zLi4uPjo6dHlwZTo6bGlzdF9iYXNlX3R5cGUsCisgICAgICBpbGlzdF9kZXRhaWw6OlNwZWNpZmljTm9kZUFjY2VzczwKKyAgICAgICAgICB0eXBlbmFtZSBpbGlzdF9kZXRhaWw6OmNvbXB1dGVfbm9kZV9vcHRpb25zPFQsIE9wdGlvbnMuLi4+Ojp0eXBlPiB7CisgIHN0YXRpY19hc3NlcnQoaWxpc3RfZGV0YWlsOjpjaGVja19vcHRpb25zPE9wdGlvbnMuLi4+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIG5vZGUgb3B0aW9uISIpOworICB1c2luZyBPcHRpb25zVCA9CisgICAgICB0eXBlbmFtZSBpbGlzdF9kZXRhaWw6OmNvbXB1dGVfbm9kZV9vcHRpb25zPFQsIE9wdGlvbnMuLi4+Ojp0eXBlOworICB1c2luZyBsaXN0X2Jhc2VfdHlwZSA9IHR5cGVuYW1lIE9wdGlvbnNUOjpsaXN0X2Jhc2VfdHlwZTsKKyAgaWxpc3Rfc2VudGluZWw8T3B0aW9uc1Q+IFNlbnRpbmVsOworCitwdWJsaWM6CisgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBPcHRpb25zVDo6dmFsdWVfdHlwZTsKKyAgdXNpbmcgcG9pbnRlciA9IHR5cGVuYW1lIE9wdGlvbnNUOjpwb2ludGVyOworICB1c2luZyByZWZlcmVuY2UgPSB0eXBlbmFtZSBPcHRpb25zVDo6cmVmZXJlbmNlOworICB1c2luZyBjb25zdF9wb2ludGVyID0gdHlwZW5hbWUgT3B0aW9uc1Q6OmNvbnN0X3BvaW50ZXI7CisgIHVzaW5nIGNvbnN0X3JlZmVyZW5jZSA9IHR5cGVuYW1lIE9wdGlvbnNUOjpjb25zdF9yZWZlcmVuY2U7CisgIHVzaW5nIGl0ZXJhdG9yID0gaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsIGZhbHNlLCBmYWxzZT47CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsIGZhbHNlLCB0cnVlPjsKKyAgdXNpbmcgcmV2ZXJzZV9pdGVyYXRvciA9IGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCB0cnVlLCBmYWxzZT47CisgIHVzaW5nIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgPSBpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgdHJ1ZSwgdHJ1ZT47CisgIHVzaW5nIHNpemVfdHlwZSA9IHNpemVfdDsKKyAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gcHRyZGlmZl90OworCisgIHNpbXBsZV9pbGlzdCgpID0gZGVmYXVsdDsKKyAgfnNpbXBsZV9pbGlzdCgpID0gZGVmYXVsdDsKKworICAvLyBObyBjb3B5IGNvbnN0cnVjdG9ycy4KKyAgc2ltcGxlX2lsaXN0KGNvbnN0IHNpbXBsZV9pbGlzdCAmKSA9IGRlbGV0ZTsKKyAgc2ltcGxlX2lsaXN0ICZvcGVyYXRvcj0oY29uc3Qgc2ltcGxlX2lsaXN0ICYpID0gZGVsZXRlOworCisgIC8vIE1vdmUgY29uc3RydWN0b3JzLgorICBzaW1wbGVfaWxpc3Qoc2ltcGxlX2lsaXN0ICYmWCkgeyBzcGxpY2UoZW5kKCksIFgpOyB9CisgIHNpbXBsZV9pbGlzdCAmb3BlcmF0b3I9KHNpbXBsZV9pbGlzdCAmJlgpIHsKKyAgICBjbGVhcigpOworICAgIHNwbGljZShlbmQoKSwgWCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiArK2l0ZXJhdG9yKFNlbnRpbmVsKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuICsrY29uc3RfaXRlcmF0b3IoU2VudGluZWwpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGl0ZXJhdG9yKFNlbnRpbmVsKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihTZW50aW5lbCk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiArK3JldmVyc2VfaXRlcmF0b3IoU2VudGluZWwpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiArK2NvbnN0X3JldmVyc2VfaXRlcmF0b3IoU2VudGluZWwpOworICB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoU2VudGluZWwpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihTZW50aW5lbCk7CisgIH0KKworICAvLy8gQ2hlY2sgaWYgdGhlIGxpc3QgaXMgZW1wdHkgaW4gY29uc3RhbnQgdGltZS4KKyAgTExWTV9OT0RJU0NBUkQgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFNlbnRpbmVsLmVtcHR5KCk7IH0KKworICAvLy8gQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBsaXN0IGluIGxpbmVhciB0aW1lLgorICBMTFZNX05PRElTQ0FSRCBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpkaXN0YW5jZShiZWdpbigpLCBlbmQoKSk7CisgIH0KKworICByZWZlcmVuY2UgZnJvbnQoKSB7IHJldHVybiAqYmVnaW4oKTsgfQorICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7IHJldHVybiAqYmVnaW4oKTsgfQorICByZWZlcmVuY2UgYmFjaygpIHsgcmV0dXJuICpyYmVnaW4oKTsgfQorICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0IHsgcmV0dXJuICpyYmVnaW4oKTsgfQorCisgIC8vLyBJbnNlcnQgYSBub2RlIGF0IHRoZSBmcm9udDsgbmV2ZXIgY29waWVzLgorICB2b2lkIHB1c2hfZnJvbnQocmVmZXJlbmNlIE5vZGUpIHsgaW5zZXJ0KGJlZ2luKCksIE5vZGUpOyB9CisKKyAgLy8vIEluc2VydCBhIG5vZGUgYXQgdGhlIGJhY2s7IG5ldmVyIGNvcGllcy4KKyAgdm9pZCBwdXNoX2JhY2socmVmZXJlbmNlIE5vZGUpIHsgaW5zZXJ0KGVuZCgpLCBOb2RlKTsgfQorCisgIC8vLyBSZW1vdmUgdGhlIG5vZGUgYXQgdGhlIGZyb250OyBuZXZlciBkZWxldGVzLgorICB2b2lkIHBvcF9mcm9udCgpIHsgZXJhc2UoYmVnaW4oKSk7IH0KKworICAvLy8gUmVtb3ZlIHRoZSBub2RlIGF0IHRoZSBiYWNrOyBuZXZlciBkZWxldGVzLgorICB2b2lkIHBvcF9iYWNrKCkgeyBlcmFzZSgtLWVuZCgpKTsgfQorCisgIC8vLyBTd2FwIHdpdGggYW5vdGhlciBsaXN0IGluIHBsYWNlIHVzaW5nIHN0ZDo6c3dhcC4KKyAgdm9pZCBzd2FwKHNpbXBsZV9pbGlzdCAmWCkgeyBzdGQ6OnN3YXAoKnRoaXMsIFgpOyB9CisKKyAgLy8vIEluc2VydCBhIG5vZGUgYnkgcmVmZXJlbmNlOyBuZXZlciBjb3BpZXMuCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBJLCByZWZlcmVuY2UgTm9kZSkgeworICAgIGxpc3RfYmFzZV90eXBlOjppbnNlcnRCZWZvcmUoKkkuZ2V0Tm9kZVB0cigpLCAqdGhpcy0+Z2V0Tm9kZVB0cigmTm9kZSkpOworICAgIHJldHVybiBpdGVyYXRvcigmTm9kZSk7CisgIH0KKworICAvLy8gSW5zZXJ0IGEgcmFuZ2Ugb2Ygbm9kZXM7IG5ldmVyIGNvcGllcy4KKyAgdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChpdGVyYXRvciBJLCBJdGVyYXRvciBGaXJzdCwgSXRlcmF0b3IgTGFzdCkgeworICAgIGZvciAoOyBGaXJzdCAhPSBMYXN0OyArK0ZpcnN0KQorICAgICAgaW5zZXJ0KEksICpGaXJzdCk7CisgIH0KKworICAvLy8gQ2xvbmUgYW5vdGhlciBsaXN0LgorICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xvbmVyLCBjbGFzcyBEaXNwb3Nlcj4KKyAgdm9pZCBjbG9uZUZyb20oY29uc3Qgc2ltcGxlX2lsaXN0ICZMMiwgQ2xvbmVyIGNsb25lLCBEaXNwb3NlciBkaXNwb3NlKSB7CisgICAgY2xlYXJBbmREaXNwb3NlKGRpc3Bvc2UpOworICAgIGZvciAoY29uc3RfcmVmZXJlbmNlIFYgOiBMMikKKyAgICAgIHB1c2hfYmFjaygqY2xvbmUoVikpOworICB9CisKKyAgLy8vIFJlbW92ZSBhIG5vZGUgYnkgcmVmZXJlbmNlOyBuZXZlciBkZWxldGVzLgorICAvLy8KKyAgLy8vIFxzZWUgXGEgZXJhc2UoKSBmb3IgcmVtb3ZpbmcgYnkgaXRlcmF0b3IuCisgIC8vLyBcc2VlIFxhIHJlbW92ZUFuZERpc3Bvc2UoKSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgZGVsZXRlZC4KKyAgdm9pZCByZW1vdmUocmVmZXJlbmNlIE4pIHsgbGlzdF9iYXNlX3R5cGU6OnJlbW92ZSgqdGhpcy0+Z2V0Tm9kZVB0cigmTikpOyB9CisKKyAgLy8vIFJlbW92ZSBhIG5vZGUgYnkgcmVmZXJlbmNlIGFuZCBkaXNwb3NlIG9mIGl0LgorICB0ZW1wbGF0ZSA8Y2xhc3MgRGlzcG9zZXI+CisgIHZvaWQgcmVtb3ZlQW5kRGlzcG9zZShyZWZlcmVuY2UgTiwgRGlzcG9zZXIgZGlzcG9zZSkgeworICAgIHJlbW92ZShOKTsKKyAgICBkaXNwb3NlKCZOKTsKKyAgfQorCisgIC8vLyBSZW1vdmUgYSBub2RlIGJ5IGl0ZXJhdG9yOyBuZXZlciBkZWxldGVzLgorICAvLy8KKyAgLy8vIFxzZWUgXGEgcmVtb3ZlKCkgZm9yIHJlbW92aW5nIGJ5IHJlZmVyZW5jZS4KKyAgLy8vIFxzZWUgXGEgZXJhc2VBbmREaXNwb3NlKCkgaXQgdGhlIG5vZGUgc2hvdWxkIGJlIGRlbGV0ZWQuCisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIEkpIHsKKyAgICBhc3NlcnQoSSAhPSBlbmQoKSAmJiAiQ2Fubm90IHJlbW92ZSBlbmQgb2YgbGlzdCEiKTsKKyAgICByZW1vdmUoKkkrKyk7CisgICAgcmV0dXJuIEk7CisgIH0KKworICAvLy8gUmVtb3ZlIGEgcmFuZ2Ugb2Ygbm9kZXM7IG5ldmVyIGRlbGV0ZXMuCisgIC8vLworICAvLy8gXHNlZSBcYSBlcmFzZUFuZERpc3Bvc2UoKSBpZiB0aGUgbm9kZXMgc2hvdWxkIGJlIGRlbGV0ZWQuCisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIEZpcnN0LCBpdGVyYXRvciBMYXN0KSB7CisgICAgbGlzdF9iYXNlX3R5cGU6OnJlbW92ZVJhbmdlKCpGaXJzdC5nZXROb2RlUHRyKCksICpMYXN0LmdldE5vZGVQdHIoKSk7CisgICAgcmV0dXJuIExhc3Q7CisgIH0KKworICAvLy8gUmVtb3ZlIGEgbm9kZSBieSBpdGVyYXRvciBhbmQgZGlzcG9zZSBvZiBpdC4KKyAgdGVtcGxhdGUgPGNsYXNzIERpc3Bvc2VyPgorICBpdGVyYXRvciBlcmFzZUFuZERpc3Bvc2UoaXRlcmF0b3IgSSwgRGlzcG9zZXIgZGlzcG9zZSkgeworICAgIGF1dG8gTmV4dCA9IHN0ZDo6bmV4dChJKTsKKyAgICBlcmFzZShJKTsKKyAgICBkaXNwb3NlKCYqSSk7CisgICAgcmV0dXJuIE5leHQ7CisgIH0KKworICAvLy8gUmVtb3ZlIGEgcmFuZ2Ugb2Ygbm9kZXMgYW5kIGRpc3Bvc2Ugb2YgdGhlbS4KKyAgdGVtcGxhdGUgPGNsYXNzIERpc3Bvc2VyPgorICBpdGVyYXRvciBlcmFzZUFuZERpc3Bvc2UoaXRlcmF0b3IgRmlyc3QsIGl0ZXJhdG9yIExhc3QsIERpc3Bvc2VyIGRpc3Bvc2UpIHsKKyAgICB3aGlsZSAoRmlyc3QgIT0gTGFzdCkKKyAgICAgIEZpcnN0ID0gZXJhc2VBbmREaXNwb3NlKEZpcnN0LCBkaXNwb3NlKTsKKyAgICByZXR1cm4gTGFzdDsKKyAgfQorCisgIC8vLyBDbGVhciB0aGUgbGlzdDsgbmV2ZXIgZGVsZXRlcy4KKyAgLy8vCisgIC8vLyBcc2VlIFxhIGNsZWFyQW5kRGlzcG9zZSgpIGlmIHRoZSBub2RlcyBzaG91bGQgYmUgZGVsZXRlZC4KKyAgdm9pZCBjbGVhcigpIHsgU2VudGluZWwucmVzZXQoKTsgfQorCisgIC8vLyBDbGVhciB0aGUgbGlzdCBhbmQgZGlzcG9zZSBvZiB0aGUgbm9kZXMuCisgIHRlbXBsYXRlIDxjbGFzcyBEaXNwb3Nlcj4gdm9pZCBjbGVhckFuZERpc3Bvc2UoRGlzcG9zZXIgZGlzcG9zZSkgeworICAgIGVyYXNlQW5kRGlzcG9zZShiZWdpbigpLCBlbmQoKSwgZGlzcG9zZSk7CisgIH0KKworICAvLy8gU3BsaWNlIGluIGFub3RoZXIgbGlzdC4KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgSSwgc2ltcGxlX2lsaXN0ICZMMikgeworICAgIHNwbGljZShJLCBMMiwgTDIuYmVnaW4oKSwgTDIuZW5kKCkpOworICB9CisKKyAgLy8vIFNwbGljZSBpbiBhIG5vZGUgZnJvbSBhbm90aGVyIGxpc3QuCisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIEksIHNpbXBsZV9pbGlzdCAmTDIsIGl0ZXJhdG9yIE5vZGUpIHsKKyAgICBzcGxpY2UoSSwgTDIsIE5vZGUsIHN0ZDo6bmV4dChOb2RlKSk7CisgIH0KKworICAvLy8gU3BsaWNlIGluIGEgcmFuZ2Ugb2Ygbm9kZXMgZnJvbSBhbm90aGVyIGxpc3QuCisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIEksIHNpbXBsZV9pbGlzdCAmLCBpdGVyYXRvciBGaXJzdCwgaXRlcmF0b3IgTGFzdCkgeworICAgIGxpc3RfYmFzZV90eXBlOjp0cmFuc2ZlckJlZm9yZSgqSS5nZXROb2RlUHRyKCksICpGaXJzdC5nZXROb2RlUHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpMYXN0LmdldE5vZGVQdHIoKSk7CisgIH0KKworICAvLy8gTWVyZ2UgaW4gYW5vdGhlciBsaXN0LgorICAvLy8KKyAgLy8vIFxwcmUgXGMgdGhpcyBhbmQgXHAgUkhTIGFyZSBzb3J0ZWQuCisgIC8vL0B7CisgIHZvaWQgbWVyZ2Uoc2ltcGxlX2lsaXN0ICZSSFMpIHsgbWVyZ2UoUkhTLCBzdGQ6Omxlc3M8VD4oKSk7IH0KKyAgdGVtcGxhdGUgPGNsYXNzIENvbXBhcmU+IHZvaWQgbWVyZ2Uoc2ltcGxlX2lsaXN0ICZSSFMsIENvbXBhcmUgY29tcCk7CisgIC8vL0B9CisKKyAgLy8vIFNvcnQgdGhlIGxpc3QuCisgIC8vL0B7CisgIHZvaWQgc29ydCgpIHsgc29ydChzdGQ6Omxlc3M8VD4oKSk7IH0KKyAgdGVtcGxhdGUgPGNsYXNzIENvbXBhcmU+IHZvaWQgc29ydChDb21wYXJlIGNvbXApOworICAvLy9AfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzLi4uIE9wdGlvbnM+Cit0ZW1wbGF0ZSA8Y2xhc3MgQ29tcGFyZT4KK3ZvaWQgc2ltcGxlX2lsaXN0PFQsIE9wdGlvbnMuLi4+OjptZXJnZShzaW1wbGVfaWxpc3QgJlJIUywgQ29tcGFyZSBjb21wKSB7CisgIGlmICh0aGlzID09ICZSSFMgfHwgUkhTLmVtcHR5KCkpCisgICAgcmV0dXJuOworICBpdGVyYXRvciBMSSA9IGJlZ2luKCksIExFID0gZW5kKCk7CisgIGl0ZXJhdG9yIFJJID0gUkhTLmJlZ2luKCksIFJFID0gUkhTLmVuZCgpOworICB3aGlsZSAoTEkgIT0gTEUpIHsKKyAgICBpZiAoY29tcCgqUkksICpMSSkpIHsKKyAgICAgIC8vIFRyYW5zZmVyIGEgcnVuIG9mIGF0IGxlYXN0IHNpemUgMSBmcm9tIFJIUyB0byBMSFMuCisgICAgICBpdGVyYXRvciBSdW5TdGFydCA9IFJJKys7CisgICAgICBSSSA9IHN0ZDo6ZmluZF9pZihSSSwgUkUsIFsmXShyZWZlcmVuY2UgUlYpIHsgcmV0dXJuICFjb21wKFJWLCAqTEkpOyB9KTsKKyAgICAgIHNwbGljZShMSSwgUkhTLCBSdW5TdGFydCwgUkkpOworICAgICAgaWYgKFJJID09IFJFKQorICAgICAgICByZXR1cm47CisgICAgfQorICAgICsrTEk7CisgIH0KKyAgLy8gVHJhbnNmZXIgdGhlIHJlbWFpbmluZyBSSFMgbm9kZXMgb25jZSBMSFMgaXMgZmluaXNoZWQuCisgIHNwbGljZShMRSwgUkhTLCBSSSwgUkUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MuLi4gT3B0aW9ucz4KK3RlbXBsYXRlIDxjbGFzcyBDb21wYXJlPgordm9pZCBzaW1wbGVfaWxpc3Q8VCwgT3B0aW9ucy4uLj46OnNvcnQoQ29tcGFyZSBjb21wKSB7CisgIC8vIFZhY3VvdXNseSBzb3J0ZWQuCisgIGlmIChlbXB0eSgpIHx8IHN0ZDo6bmV4dChiZWdpbigpKSA9PSBlbmQoKSkKKyAgICByZXR1cm47CisKKyAgLy8gU3BsaXQgdGhlIGxpc3QgaW4gdGhlIG1pZGRsZS4KKyAgaXRlcmF0b3IgQ2VudGVyID0gYmVnaW4oKSwgRW5kID0gYmVnaW4oKTsKKyAgd2hpbGUgKEVuZCAhPSBlbmQoKSAmJiArK0VuZCAhPSBlbmQoKSkgeworICAgICsrQ2VudGVyOworICAgICsrRW5kOworICB9CisgIHNpbXBsZV9pbGlzdCBSSFM7CisgIFJIUy5zcGxpY2UoUkhTLmVuZCgpLCAqdGhpcywgQ2VudGVyLCBlbmQoKSk7CisKKyAgLy8gU29ydCB0aGUgc3VibGlzdHMgYW5kIG1lcmdlIGJhY2sgdG9nZXRoZXIuCisgIHNvcnQoY29tcCk7CisgIFJIUy5zb3J0KGNvbXApOworICBtZXJnZShSSFMsIGNvbXApOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfU0lNUExFX0lMSVNUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0YTkwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oCkBAIC0wLDAgKzEsMTA5NiBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIC0gQWxpYXMgQW5hbHlzaXMgSW50ZXJmYWNlIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZ2VuZXJpYyBBbGlhc0FuYWx5c2lzIGludGVyZmFjZSwgd2hpY2ggaXMgdXNlZCBhcyB0aGUKKy8vIGNvbW1vbiBpbnRlcmZhY2UgdXNlZCBieSBhbGwgY2xpZW50cyBvZiBhbGlhcyBhbmFseXNpcyBpbmZvcm1hdGlvbiwgYW5kCisvLyBpbXBsZW1lbnRlZCBieSBhbGwgYWxpYXMgYW5hbHlzaXMgaW1wbGVtZW50YXRpb25zLiAgTW9kL1JlZiBpbmZvcm1hdGlvbiBpcworLy8gYWxzbyBjYXB0dXJlZCBieSB0aGlzIGludGVyZmFjZS4KKy8vCisvLyBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBpbnRlcmZhY2UgbXVzdCBpbXBsZW1lbnQgdGhlIHZhcmlvdXMgdmlydHVhbCBtZXRob2RzLAorLy8gd2hpY2ggYXV0b21hdGljYWxseSBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IGZvciB0aGUgZW50aXJlIHN1aXRlIG9mIGNsaWVudAorLy8gQVBJcy4KKy8vCisvLyBUaGlzIEFQSSBpZGVudGlmaWVzIG1lbW9yeSByZWdpb25zIHdpdGggdGhlIE1lbW9yeUxvY2F0aW9uIGNsYXNzLiBUaGUgcG9pbnRlcgorLy8gY29tcG9uZW50IHNwZWNpZmllcyB0aGUgYmFzZSBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgcmVnaW9uLiBUaGUgU2l6ZSBzcGVjaWZpZXMKKy8vIHRoZSBtYXhpbXVtIHNpemUgKGluIGFkZHJlc3MgdW5pdHMpIG9mIHRoZSBtZW1vcnkgcmVnaW9uLCBvcgorLy8gTWVtb3J5TG9jYXRpb246OlVua25vd25TaXplIGlmIHRoZSBzaXplIGlzIG5vdCBrbm93bi4gVGhlIFRCQUEgdGFnCisvLyBpZGVudGlmaWVzIHRoZSAidHlwZSIgb2YgdGhlIG1lbW9yeSByZWZlcmVuY2U7IHNlZSB0aGUKKy8vIFR5cGVCYXNlZEFsaWFzQW5hbHlzaXMgY2xhc3MgZm9yIGRldGFpbHMuCisvLworLy8gU29tZSBub24tb2J2aW91cyBkZXRhaWxzIGluY2x1ZGU6CisvLyAgLSBQb2ludGVycyB0aGF0IHBvaW50IHRvIHR3byBjb21wbGV0ZWx5IGRpZmZlcmVudCBvYmplY3RzIGluIG1lbW9yeSBuZXZlcgorLy8gICAgYWxpYXMsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHRoZSBTaXplIGNvbXBvbmVudC4KKy8vICAtIE5vQWxpYXMgZG9lc24ndCBpbXBseSBpbmVxdWFsIHBvaW50ZXJzLiBUaGUgbW9zdCBvYnZpb3VzIGV4YW1wbGUgb2YgdGhpcworLy8gICAgaXMgdHdvIHBvaW50ZXJzIHRvIGNvbnN0YW50IG1lbW9yeS4gRXZlbiBpZiB0aGV5IGFyZSBlcXVhbCwgY29uc3RhbnQKKy8vICAgIG1lbW9yeSBpcyBuZXZlciBzdG9yZWQgdG8sIHNvIHRoZXJlIHdpbGwgbmV2ZXIgYmUgYW55IGRlcGVuZGVuY2llcy4KKy8vICAgIEluIHRoaXMgYW5kIG90aGVyIHNpdHVhdGlvbnMsIHRoZSBwb2ludGVycyBtYXkgYmUgYm90aCBOb0FsaWFzIGFuZAorLy8gICAgTXVzdEFsaWFzIGF0IHRoZSBzYW1lIHRpbWUuIFRoZSBjdXJyZW50IEFQSSBjYW4gb25seSByZXR1cm4gb25lIHJlc3VsdCwKKy8vICAgIHRob3VnaCB0aGlzIGlzIHJhcmVseSBhIHByb2JsZW0gaW4gcHJhY3RpY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0FMSUFTQU5BTFlTSVNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0FMSUFTQU5BTFlTSVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL01lbW9yeUxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9UYXJnZXRMaWJyYXJ5SW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFuYWx5c2lzVXNhZ2U7CitjbGFzcyBCYXNpY0FBUmVzdWx0OworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBPcmRlcmVkQmFzaWNCbG9jazsKK2NsYXNzIFZhbHVlOworCisvLy8gVGhlIHBvc3NpYmxlIHJlc3VsdHMgb2YgYW4gYWxpYXMgcXVlcnkuCisvLy8KKy8vLyBUaGVzZSByZXN1bHRzIGFyZSBhbHdheXMgY29tcHV0ZWQgYmV0d2VlbiB0d28gTWVtb3J5TG9jYXRpb24gb2JqZWN0cyBhcworLy8vIGEgcXVlcnkgdG8gc29tZSBhbGlhcyBhbmFseXNpcy4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGVzZSBhcmUgdW5zY29wZWQgZW51bWVyYXRpb25zIGJlY2F1c2Ugd2Ugd291bGQgbGlrZSB0byBzdXBwb3J0CisvLy8gaW1wbGljaXRseSB0ZXN0aW5nIGEgcmVzdWx0IGZvciB0aGUgZXhpc3RlbmNlIG9mIGFueSBwb3NzaWJsZSBhbGlhc2luZyB3aXRoCisvLy8gYSBjb252ZXJzaW9uIHRvIGJvb2wsIGJ1dCBhbiAiZW51bSBjbGFzcyIgZG9lc24ndCBzdXBwb3J0IHRoaXMuIFRoZQorLy8vIGNhbm9uaWNhbCBuYW1lcyBmcm9tIHRoZSBsaXRlcmF0dXJlIGFyZSBzdWZmaXhlZCBhbmQgdW5pcXVlIGFueXdheXMsIGFuZCBzbworLy8vIHRoZXkgc2VydmUgYXMgZ2xvYmFsIGNvbnN0YW50cyBpbiBMTFZNIGZvciB0aGVzZSByZXN1bHRzLgorLy8vCisvLy8gU2VlIGRvY3MvQWxpYXNBbmFseXNpcy5odG1sIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBzcGVjaWZpYyBtZWFuaW5ncworLy8vIG9mIHRoZXNlIHZhbHVlcy4KK2VudW0gQWxpYXNSZXN1bHQgOiB1aW50OF90IHsKKyAgLy8vIFRoZSB0d28gbG9jYXRpb25zIGRvIG5vdCBhbGlhcyBhdCBhbGwuCisgIC8vLworICAvLy8gVGhpcyB2YWx1ZSBpcyBhcnJhbmdlZCB0byBjb252ZXJ0IHRvIGZhbHNlLCB3aGlsZSBhbGwgb3RoZXIgdmFsdWVzCisgIC8vLyBjb252ZXJ0IHRvIHRydWUuIFRoaXMgYWxsb3dzIGEgYm9vbGVhbiBjb250ZXh0IHRvIGNvbnZlcnQgdGhlIHJlc3VsdCB0bworICAvLy8gYSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlcmUgaXMgdGhlIHBvc3NpYmlsaXR5IG9mIGFsaWFzaW5nLgorICBOb0FsaWFzID0gMCwKKyAgLy8vIFRoZSB0d28gbG9jYXRpb25zIG1heSBvciBtYXkgbm90IGFsaWFzLiBUaGlzIGlzIHRoZSBsZWFzdCBwcmVjaXNlIHJlc3VsdC4KKyAgTWF5QWxpYXMsCisgIC8vLyBUaGUgdHdvIGxvY2F0aW9ucyBhbGlhcywgYnV0IG9ubHkgZHVlIHRvIGEgcGFydGlhbCBvdmVybGFwLgorICBQYXJ0aWFsQWxpYXMsCisgIC8vLyBUaGUgdHdvIGxvY2F0aW9ucyBwcmVjaXNlbHkgYWxpYXMgZWFjaCBvdGhlci4KKyAgTXVzdEFsaWFzLAorfTsKKworLy8vIEZsYWdzIGluZGljYXRpbmcgd2hldGhlciBhIG1lbW9yeSBhY2Nlc3MgbW9kaWZpZXMgb3IgcmVmZXJlbmNlcyBtZW1vcnkuCisvLy8KKy8vLyBUaGlzIGlzIG5vIGFjY2VzcyBhdCBhbGwsIGEgbW9kaWZpY2F0aW9uLCBhIHJlZmVyZW5jZSwgb3IgYm90aAorLy8vIGEgbW9kaWZpY2F0aW9uIGFuZCBhIHJlZmVyZW5jZS4gVGhlc2UgYXJlIHNwZWNpZmljYWxseSBzdHJ1Y3R1cmVkIHN1Y2ggdGhhdAorLy8vIHRoZXkgZm9ybSBhIHRocmVlIGJpdCBtYXRyaXggYW5kIGJpdC10ZXN0cyBmb3IgJ21vZCcgb3IgJ3JlZicgb3IgJ211c3QnCisvLy8gd29yayB3aXRoIGFueSBvZiB0aGUgcG9zc2libGUgdmFsdWVzLgorZW51bSBjbGFzcyBNb2RSZWZJbmZvIDogdWludDhfdCB7CisgIC8vLyBNdXN0IGlzIHByb3ZpZGVkIGZvciBjb21wbGV0ZW5lc3MsIGJ1dCBubyByb3V0aW5lcyB3aWxsIHJldHVybiBvbmx5CisgIC8vLyBNdXN0IHRvZGF5LiBTZWUgZGVmaW5pdGlvbiBvZiBNdXN0IGJlbG93LgorICBNdXN0ID0gMCwKKyAgLy8vIFRoZSBhY2Nlc3MgbWF5IHJlZmVyZW5jZSB0aGUgdmFsdWUgc3RvcmVkIGluIG1lbW9yeSwKKyAgLy8vIGEgbXVzdEFsaWFzIHJlbGF0aW9uIHdhcyBmb3VuZCwgYW5kIG5vIG1heUFsaWFzIG9yIHBhcnRpYWxBbGlhcyBmb3VuZC4KKyAgTXVzdFJlZiA9IDEsCisgIC8vLyBUaGUgYWNjZXNzIG1heSBtb2RpZnkgdGhlIHZhbHVlIHN0b3JlZCBpbiBtZW1vcnksCisgIC8vLyBhIG11c3RBbGlhcyByZWxhdGlvbiB3YXMgZm91bmQsIGFuZCBubyBtYXlBbGlhcyBvciBwYXJ0aWFsQWxpYXMgZm91bmQuCisgIE11c3RNb2QgPSAyLAorICAvLy8gVGhlIGFjY2VzcyBtYXkgcmVmZXJlbmNlLCBtb2RpZnkgb3IgYm90aCB0aGUgdmFsdWUgc3RvcmVkIGluIG1lbW9yeSwKKyAgLy8vIGEgbXVzdEFsaWFzIHJlbGF0aW9uIHdhcyBmb3VuZCwgYW5kIG5vIG1heUFsaWFzIG9yIHBhcnRpYWxBbGlhcyBmb3VuZC4KKyAgTXVzdE1vZFJlZiA9IE11c3RSZWYgfCBNdXN0TW9kLAorICAvLy8gVGhlIGFjY2VzcyBuZWl0aGVyIHJlZmVyZW5jZXMgbm9yIG1vZGlmaWVzIHRoZSB2YWx1ZSBzdG9yZWQgaW4gbWVtb3J5LgorICBOb01vZFJlZiA9IDQsCisgIC8vLyBUaGUgYWNjZXNzIG1heSByZWZlcmVuY2UgdGhlIHZhbHVlIHN0b3JlZCBpbiBtZW1vcnkuCisgIFJlZiA9IE5vTW9kUmVmIHwgTXVzdFJlZiwKKyAgLy8vIFRoZSBhY2Nlc3MgbWF5IG1vZGlmeSB0aGUgdmFsdWUgc3RvcmVkIGluIG1lbW9yeS4KKyAgTW9kID0gTm9Nb2RSZWYgfCBNdXN0TW9kLAorICAvLy8gVGhlIGFjY2VzcyBtYXkgcmVmZXJlbmNlIGFuZCBtYXkgbW9kaWZ5IHRoZSB2YWx1ZSBzdG9yZWQgaW4gbWVtb3J5LgorICBNb2RSZWYgPSBSZWYgfCBNb2QsCisKKyAgLy8vIEFib3V0IE11c3Q6CisgIC8vLyBNdXN0IGlzIHNldCBpbiBhIGJlc3QgZWZmb3J0IG1hbm5lci4KKyAgLy8vIFdlIHVzdWFsbHkgZG8gbm90IHRyeSBvdXIgYmVzdCB0byBpbmZlciBNdXN0LCBpbnN0ZWFkIGl0IGlzIG1lcmVseQorICAvLy8gYW5vdGhlciBwaWVjZSBvZiAiZnJlZSIgaW5mb3JtYXRpb24gdGhhdCBpcyBwcmVzZW50ZWQgd2hlbiBhdmFpbGFibGUuCisgIC8vLyBNdXN0IHNldCBtZWFucyB0aGVyZSB3YXMgY2VydGFpbmx5IGEgTXVzdEFsaWFzIGZvdW5kLiBGb3IgY2FsbHMsCisgIC8vLyB3aGVyZSBtdWx0aXBsZSBhcmd1bWVudHMgYXJlIGNoZWNrZWQgKGFyZ21lbW9ubHkpLCB0aGlzIHRyYW5zbGF0ZXMgdG8KKyAgLy8vIG9ubHkgTXVzdEFsaWFzIG9yIE5vQWxpYXMgd2FzIGZvdW5kLgorICAvLy8gTXVzdCBpcyBub3Qgc2V0IGZvciBSQVIgYWNjZXNzZXMsIGV2ZW4gaWYgdGhlIHR3byBsb2NhdGlvbnMgbXVzdAorICAvLy8gYWxpYXMuIFRoZSByZWFzb24gaXMgdGhhdCB0d28gcmVhZCBhY2Nlc3NlcyB0cmFuc2xhdGUgdG8gYW4gZWFybHkgcmV0dXJuCisgIC8vLyBvZiBOb01vZFJlZi4gQW4gYWRkaXRpb25hbCBhbGlhcyBjaGVjayB0byBzZXQgTXVzdCBtYXkgYmUKKyAgLy8vIGV4cGVuc2l2ZS4gT3RoZXIgY2FzZXMgbWF5IGFsc28gbm90IHNldCBNdXN0KGUuZy4gY2FsbENhcHR1cmVzQmVmb3JlKS4KKyAgLy8vIFdlIHJlZmVyIHRvIE11c3QgYmVpbmcgKnNldCogd2hlbiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgKmNsZWFyZWQqLgorICAvLy8gQ29udmVyc2VseSB3ZSAqY2xlYXIqIE11c3QgaW5mb3JtYXRpb24gYnkgKnNldHRpbmcqIHRoZSBNdXN0IGJpdCB0byAxLgorfTsKKworTExWTV9OT0RJU0NBUkQgaW5saW5lIGJvb2wgaXNOb01vZFJlZihjb25zdCBNb2RSZWZJbmZvIE1SSSkgeworICByZXR1cm4gKHN0YXRpY19jYXN0PGludD4oTVJJKSAmIHN0YXRpY19jYXN0PGludD4oTW9kUmVmSW5mbzo6TXVzdE1vZFJlZikpID09CisgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KE1vZFJlZkluZm86Ok11c3QpOworfQorTExWTV9OT0RJU0NBUkQgaW5saW5lIGJvb2wgaXNNb2RPclJlZlNldChjb25zdCBNb2RSZWZJbmZvIE1SSSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihNUkkpICYgc3RhdGljX2Nhc3Q8aW50PihNb2RSZWZJbmZvOjpNdXN0TW9kUmVmKTsKK30KK0xMVk1fTk9ESVNDQVJEIGlubGluZSBib29sIGlzTW9kQW5kUmVmU2V0KGNvbnN0IE1vZFJlZkluZm8gTVJJKSB7CisgIHJldHVybiAoc3RhdGljX2Nhc3Q8aW50PihNUkkpICYgc3RhdGljX2Nhc3Q8aW50PihNb2RSZWZJbmZvOjpNdXN0TW9kUmVmKSkgPT0KKyAgICAgICAgIHN0YXRpY19jYXN0PGludD4oTW9kUmVmSW5mbzo6TXVzdE1vZFJlZik7Cit9CitMTFZNX05PRElTQ0FSRCBpbmxpbmUgYm9vbCBpc01vZFNldChjb25zdCBNb2RSZWZJbmZvIE1SSSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihNUkkpICYgc3RhdGljX2Nhc3Q8aW50PihNb2RSZWZJbmZvOjpNdXN0TW9kKTsKK30KK0xMVk1fTk9ESVNDQVJEIGlubGluZSBib29sIGlzUmVmU2V0KGNvbnN0IE1vZFJlZkluZm8gTVJJKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KE1SSSkgJiBzdGF0aWNfY2FzdDxpbnQ+KE1vZFJlZkluZm86Ok11c3RSZWYpOworfQorTExWTV9OT0RJU0NBUkQgaW5saW5lIGJvb2wgaXNNdXN0U2V0KGNvbnN0IE1vZFJlZkluZm8gTVJJKSB7CisgIHJldHVybiAhKHN0YXRpY19jYXN0PGludD4oTVJJKSAmIHN0YXRpY19jYXN0PGludD4oTW9kUmVmSW5mbzo6Tm9Nb2RSZWYpKTsKK30KKworTExWTV9OT0RJU0NBUkQgaW5saW5lIE1vZFJlZkluZm8gc2V0TW9kKGNvbnN0IE1vZFJlZkluZm8gTVJJKSB7CisgIHJldHVybiBNb2RSZWZJbmZvKHN0YXRpY19jYXN0PGludD4oTVJJKSB8CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oTW9kUmVmSW5mbzo6TXVzdE1vZCkpOworfQorTExWTV9OT0RJU0NBUkQgaW5saW5lIE1vZFJlZkluZm8gc2V0UmVmKGNvbnN0IE1vZFJlZkluZm8gTVJJKSB7CisgIHJldHVybiBNb2RSZWZJbmZvKHN0YXRpY19jYXN0PGludD4oTVJJKSB8CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oTW9kUmVmSW5mbzo6TXVzdFJlZikpOworfQorTExWTV9OT0RJU0NBUkQgaW5saW5lIE1vZFJlZkluZm8gc2V0TXVzdChjb25zdCBNb2RSZWZJbmZvIE1SSSkgeworICByZXR1cm4gTW9kUmVmSW5mbyhzdGF0aWNfY2FzdDxpbnQ+KE1SSSkgJgorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KE1vZFJlZkluZm86Ok11c3RNb2RSZWYpKTsKK30KK0xMVk1fTk9ESVNDQVJEIGlubGluZSBNb2RSZWZJbmZvIHNldE1vZEFuZFJlZihjb25zdCBNb2RSZWZJbmZvIE1SSSkgeworICByZXR1cm4gTW9kUmVmSW5mbyhzdGF0aWNfY2FzdDxpbnQ+KE1SSSkgfAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KE1vZFJlZkluZm86Ok11c3RNb2RSZWYpKTsKK30KK0xMVk1fTk9ESVNDQVJEIGlubGluZSBNb2RSZWZJbmZvIGNsZWFyTW9kKGNvbnN0IE1vZFJlZkluZm8gTVJJKSB7CisgIHJldHVybiBNb2RSZWZJbmZvKHN0YXRpY19jYXN0PGludD4oTVJJKSAmIHN0YXRpY19jYXN0PGludD4oTW9kUmVmSW5mbzo6UmVmKSk7Cit9CitMTFZNX05PRElTQ0FSRCBpbmxpbmUgTW9kUmVmSW5mbyBjbGVhclJlZihjb25zdCBNb2RSZWZJbmZvIE1SSSkgeworICByZXR1cm4gTW9kUmVmSW5mbyhzdGF0aWNfY2FzdDxpbnQ+KE1SSSkgJiBzdGF0aWNfY2FzdDxpbnQ+KE1vZFJlZkluZm86Ok1vZCkpOworfQorTExWTV9OT0RJU0NBUkQgaW5saW5lIE1vZFJlZkluZm8gY2xlYXJNdXN0KGNvbnN0IE1vZFJlZkluZm8gTVJJKSB7CisgIHJldHVybiBNb2RSZWZJbmZvKHN0YXRpY19jYXN0PGludD4oTVJJKSB8CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oTW9kUmVmSW5mbzo6Tm9Nb2RSZWYpKTsKK30KK0xMVk1fTk9ESVNDQVJEIGlubGluZSBNb2RSZWZJbmZvIHVuaW9uTW9kUmVmKGNvbnN0IE1vZFJlZkluZm8gTVJJMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZFJlZkluZm8gTVJJMikgeworICByZXR1cm4gTW9kUmVmSW5mbyhzdGF0aWNfY2FzdDxpbnQ+KE1SSTEpIHwgc3RhdGljX2Nhc3Q8aW50PihNUkkyKSk7Cit9CitMTFZNX05PRElTQ0FSRCBpbmxpbmUgTW9kUmVmSW5mbyBpbnRlcnNlY3RNb2RSZWYoY29uc3QgTW9kUmVmSW5mbyBNUkkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZFJlZkluZm8gTVJJMikgeworICByZXR1cm4gTW9kUmVmSW5mbyhzdGF0aWNfY2FzdDxpbnQ+KE1SSTEpICYgc3RhdGljX2Nhc3Q8aW50PihNUkkyKSk7Cit9CisKKy8vLyBUaGUgbG9jYXRpb25zIGF0IHdoaWNoIGEgZnVuY3Rpb24gbWlnaHQgYWNjZXNzIG1lbW9yeS4KKy8vLworLy8vIFRoZXNlIGFyZSBwcmltYXJpbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBcYyBBY2Nlc3NLaW5kIGJpdHMgdG8KKy8vLyBkZXNjcmliZSBib3RoIHRoZSBuYXR1cmUgb2YgYWNjZXNzIGFuZCB0aGUgbG9jYXRpb25zIG9mIGFjY2VzcyBmb3IgYQorLy8vIGZ1bmN0aW9uIGNhbGwuCitlbnVtIEZ1bmN0aW9uTW9kUmVmTG9jYXRpb24geworICAvLy8gQmFzZSBjYXNlIGlzIG5vIGFjY2VzcyB0byBtZW1vcnkuCisgIEZNUkxfTm93aGVyZSA9IDAsCisgIC8vLyBBY2Nlc3MgdG8gbWVtb3J5IHZpYSBhcmd1bWVudCBwb2ludGVycy4KKyAgRk1STF9Bcmd1bWVudFBvaW50ZWVzID0gOCwKKyAgLy8vIE1lbW9yeSB0aGF0IGlzIGluYWNjZXNzaWJsZSB2aWEgTExWTSBJUi4KKyAgRk1STF9JbmFjY2Vzc2libGVNZW0gPSAxNiwKKyAgLy8vIEFjY2VzcyB0byBhbnkgbWVtb3J5LgorICBGTVJMX0FueXdoZXJlID0gMzIgfCBGTVJMX0luYWNjZXNzaWJsZU1lbSB8IEZNUkxfQXJndW1lbnRQb2ludGVlcworfTsKKworLy8vIFN1bW1hcnkgb2YgaG93IGEgZnVuY3Rpb24gYWZmZWN0cyBtZW1vcnkgaW4gdGhlIHByb2dyYW0uCisvLy8KKy8vLyBMb2FkcyBmcm9tIGNvbnN0YW50IGdsb2JhbHMgYXJlIG5vdCBjb25zaWRlcmVkIG1lbW9yeSBhY2Nlc3NlcyBmb3IgdGhpcworLy8vIGludGVyZmFjZS4gQWxzbywgZnVuY3Rpb25zIG1heSBmcmVlbHkgbW9kaWZ5IHN0YWNrIHNwYWNlIGxvY2FsIHRvIHRoZWlyCisvLy8gaW52b2NhdGlvbiB3aXRob3V0IGhhdmluZyB0byByZXBvcnQgaXQgdGhyb3VnaCB0aGVzZSBpbnRlcmZhY2VzLgorZW51bSBGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIHsKKyAgLy8vIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBhbnkgbm9uLWxvY2FsIGxvYWRzIG9yIHN0b3JlcyB0byBtZW1vcnkuCisgIC8vLworICAvLy8gVGhpcyBwcm9wZXJ0eSBjb3JyZXNwb25kcyB0byB0aGUgR0NDICdjb25zdCcgYXR0cmlidXRlLgorICAvLy8gVGhpcyBwcm9wZXJ0eSBjb3JyZXNwb25kcyB0byB0aGUgTExWTSBJUiAncmVhZG5vbmUnIGF0dHJpYnV0ZS4KKyAgLy8vIFRoaXMgcHJvcGVydHkgY29ycmVzcG9uZHMgdG8gdGhlIEludHJOb01lbSBMTFZNIGludHJpbnNpYyBmbGFnLgorICBGTVJCX0RvZXNOb3RBY2Nlc3NNZW1vcnkgPQorICAgICAgRk1STF9Ob3doZXJlIHwgc3RhdGljX2Nhc3Q8aW50PihNb2RSZWZJbmZvOjpOb01vZFJlZiksCisKKyAgLy8vIFRoZSBvbmx5IG1lbW9yeSByZWZlcmVuY2VzIGluIHRoaXMgZnVuY3Rpb24gKGlmIGl0IGhhcyBhbnkpIGFyZQorICAvLy8gbm9uLXZvbGF0aWxlIGxvYWRzIGZyb20gb2JqZWN0cyBwb2ludGVkIHRvIGJ5IGl0cyBwb2ludGVyLXR5cGVkCisgIC8vLyBhcmd1bWVudHMsIHdpdGggYXJiaXRyYXJ5IG9mZnNldHMuCisgIC8vLworICAvLy8gVGhpcyBwcm9wZXJ0eSBjb3JyZXNwb25kcyB0byB0aGUgSW50clJlYWRBcmdNZW0gTExWTSBpbnRyaW5zaWMgZmxhZy4KKyAgRk1SQl9Pbmx5UmVhZHNBcmd1bWVudFBvaW50ZWVzID0KKyAgICAgIEZNUkxfQXJndW1lbnRQb2ludGVlcyB8IHN0YXRpY19jYXN0PGludD4oTW9kUmVmSW5mbzo6UmVmKSwKKworICAvLy8gVGhlIG9ubHkgbWVtb3J5IHJlZmVyZW5jZXMgaW4gdGhpcyBmdW5jdGlvbiAoaWYgaXQgaGFzIGFueSkgYXJlCisgIC8vLyBub24tdm9sYXRpbGUgbG9hZHMgYW5kIHN0b3JlcyBmcm9tIG9iamVjdHMgcG9pbnRlZCB0byBieSBpdHMKKyAgLy8vIHBvaW50ZXItdHlwZWQgYXJndW1lbnRzLCB3aXRoIGFyYml0cmFyeSBvZmZzZXRzLgorICAvLy8KKyAgLy8vIFRoaXMgcHJvcGVydHkgY29ycmVzcG9uZHMgdG8gdGhlIEludHJBcmdNZW1Pbmx5IExMVk0gaW50cmluc2ljIGZsYWcuCisgIEZNUkJfT25seUFjY2Vzc2VzQXJndW1lbnRQb2ludGVlcyA9CisgICAgICBGTVJMX0FyZ3VtZW50UG9pbnRlZXMgfCBzdGF0aWNfY2FzdDxpbnQ+KE1vZFJlZkluZm86Ok1vZFJlZiksCisKKyAgLy8vIFRoZSBvbmx5IG1lbW9yeSByZWZlcmVuY2VzIGluIHRoaXMgZnVuY3Rpb24gKGlmIGl0IGhhcyBhbnkpIGFyZQorICAvLy8gcmVmZXJlbmNlcyBvZiBtZW1vcnkgdGhhdCBpcyBvdGhlcndpc2UgaW5hY2Nlc3NpYmxlIHZpYSBMTFZNIElSLgorICAvLy8KKyAgLy8vIFRoaXMgcHJvcGVydHkgY29ycmVzcG9uZHMgdG8gdGhlIExMVk0gSVIgaW5hY2Nlc3NpYmxlbWVtb25seSBhdHRyaWJ1dGUuCisgIEZNUkJfT25seUFjY2Vzc2VzSW5hY2Nlc3NpYmxlTWVtID0KKyAgICAgIEZNUkxfSW5hY2Nlc3NpYmxlTWVtIHwgc3RhdGljX2Nhc3Q8aW50PihNb2RSZWZJbmZvOjpNb2RSZWYpLAorCisgIC8vLyBUaGUgZnVuY3Rpb24gbWF5IHBlcmZvcm0gbm9uLXZvbGF0aWxlIGxvYWRzIGFuZCBzdG9yZXMgb2Ygb2JqZWN0cworICAvLy8gcG9pbnRlZCB0byBieSBpdHMgcG9pbnRlci10eXBlZCBhcmd1bWVudHMsIHdpdGggYXJiaXRyYXJ5IG9mZnNldHMsIGFuZAorICAvLy8gaXQgbWF5IGFsc28gcGVyZm9ybSBsb2FkcyBhbmQgc3RvcmVzIG9mIG1lbW9yeSB0aGF0IGlzIG90aGVyd2lzZQorICAvLy8gaW5hY2Nlc3NpYmxlIHZpYSBMTFZNIElSLgorICAvLy8KKyAgLy8vIFRoaXMgcHJvcGVydHkgY29ycmVzcG9uZHMgdG8gdGhlIExMVk0gSVIKKyAgLy8vIGluYWNjZXNzaWJsZW1lbV9vcl9hcmdtZW1vbmx5IGF0dHJpYnV0ZS4KKyAgRk1SQl9Pbmx5QWNjZXNzZXNJbmFjY2Vzc2libGVPckFyZ01lbSA9IEZNUkxfSW5hY2Nlc3NpYmxlTWVtIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZNUkxfQXJndW1lbnRQb2ludGVlcyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KE1vZFJlZkluZm86Ok1vZFJlZiksCisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBhbnkgbm9uLWxvY2FsIHN0b3JlcyBvciB2b2xhdGlsZSBsb2FkcywKKyAgLy8vIGJ1dCBtYXkgcmVhZCBmcm9tIGFueSBtZW1vcnkgbG9jYXRpb24uCisgIC8vLworICAvLy8gVGhpcyBwcm9wZXJ0eSBjb3JyZXNwb25kcyB0byB0aGUgR0NDICdwdXJlJyBhdHRyaWJ1dGUuCisgIC8vLyBUaGlzIHByb3BlcnR5IGNvcnJlc3BvbmRzIHRvIHRoZSBMTFZNIElSICdyZWFkb25seScgYXR0cmlidXRlLgorICAvLy8gVGhpcyBwcm9wZXJ0eSBjb3JyZXNwb25kcyB0byB0aGUgSW50clJlYWRNZW0gTExWTSBpbnRyaW5zaWMgZmxhZy4KKyAgRk1SQl9Pbmx5UmVhZHNNZW1vcnkgPSBGTVJMX0FueXdoZXJlIHwgc3RhdGljX2Nhc3Q8aW50PihNb2RSZWZJbmZvOjpSZWYpLAorCisgIC8vIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVhZCBmcm9tIG1lbW9yeSBhbnl3aGVyZSwgYnV0IG1heSB3cml0ZSB0byBhbnkKKyAgLy8gbWVtb3J5IGxvY2F0aW9uLgorICAvLworICAvLyBUaGlzIHByb3BlcnR5IGNvcnJlc3BvbmRzIHRvIHRoZSBMTFZNIElSICd3cml0ZW9ubHknIGF0dHJpYnV0ZS4KKyAgLy8gVGhpcyBwcm9wZXJ0eSBjb3JyZXNwb25kcyB0byB0aGUgSW50cldyaXRlTWVtIExMVk0gaW50cmluc2ljIGZsYWcuCisgIEZNUkJfRG9lc05vdFJlYWRNZW1vcnkgPSBGTVJMX0FueXdoZXJlIHwgc3RhdGljX2Nhc3Q8aW50PihNb2RSZWZJbmZvOjpNb2QpLAorCisgIC8vLyBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBmdW5jdGlvbiBjb3VsZCBub3QgYmUgY2xhc3NpZmllZCBpbnRvIG9uZSBvZiB0aGUKKyAgLy8vIGJlaGF2aW9ycyBhYm92ZS4KKyAgRk1SQl9Vbmtub3duTW9kUmVmQmVoYXZpb3IgPQorICAgICAgRk1STF9Bbnl3aGVyZSB8IHN0YXRpY19jYXN0PGludD4oTW9kUmVmSW5mbzo6TW9kUmVmKQorfTsKKworLy8gV3JhcHBlciBtZXRob2Qgc3RyaXBzIGJpdHMgc2lnbmlmaWNhbnQgb25seSBpbiBGdW5jdGlvbk1vZFJlZkJlaGF2aW9yLAorLy8gdG8gb2J0YWluIGEgdmFsaWQgTW9kUmVmSW5mby4gVGhlIGJlbmVmaXQgb2YgdXNpbmcgdGhlIHdyYXBwZXIgaXMgdGhhdCBpZgorLy8gTW9kUmVmSW5mbyBlbnVtIGNoYW5nZXMsIHRoZSB3cmFwcGVyIGNhbiBiZSB1cGRhdGVkIHRvICYgd2l0aCB0aGUgbmV3IGVudW0KKy8vIGVudHJ5IHdpdGggYWxsIGJpdHMgc2V0IHRvIDEuCitMTFZNX05PRElTQ0FSRCBpbmxpbmUgTW9kUmVmSW5mbworY3JlYXRlTW9kUmVmSW5mbyhjb25zdCBGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIEZNUkIpIHsKKyAgcmV0dXJuIE1vZFJlZkluZm8oRk1SQiAmIHN0YXRpY19jYXN0PGludD4oTW9kUmVmSW5mbzo6TW9kUmVmKSk7Cit9CisKK2NsYXNzIEFBUmVzdWx0cyB7CitwdWJsaWM6CisgIC8vIE1ha2UgdGhlc2UgcmVzdWx0cyBkZWZhdWx0IGNvbnN0cnVjdGFibGUgYW5kIG1vdmFibGUuIFdlIGhhdmUgdG8gc3BlbGwKKyAgLy8gdGhlc2Ugb3V0IGJlY2F1c2UgTVNWQyB3b24ndCBzeW50aGVzaXplIHRoZW0uCisgIEFBUmVzdWx0cyhjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAmVExJKSA6IFRMSShUTEkpIHt9CisgIEFBUmVzdWx0cyhBQVJlc3VsdHMgJiZBcmcpOworICB+QUFSZXN1bHRzKCk7CisKKyAgLy8vIFJlZ2lzdGVyIGEgc3BlY2lmaWMgQUEgcmVzdWx0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQUFSZXN1bHRUPiB2b2lkIGFkZEFBUmVzdWx0KEFBUmVzdWx0VCAmQUFSZXN1bHQpIHsKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHVzZSBhIG11Y2ggbGlnaHRlciB3ZWlnaHQgc3lzdGVtIHRoYW4gdGhlIHVzdWFsCisgICAgLy8gcG9seW1vcnBoaWMgcGF0dGVybiBiZWNhdXNlIHdlIGRvbid0IG93biBBQVJlc3VsdC4gSXQgc2hvdWxkCisgICAgLy8gaWRlYWxseSBpbnZvbHZlIHR3byBwb2ludGVycyBhbmQgbm8gc2VwYXJhdGUgYWxsb2NhdGlvbi4KKyAgICBBQXMuZW1wbGFjZV9iYWNrKG5ldyBNb2RlbDxBQVJlc3VsdFQ+KEFBUmVzdWx0LCAqdGhpcykpOworICB9CisKKyAgLy8vIFJlZ2lzdGVyIGEgZnVuY3Rpb24gYW5hbHlzaXMgSUQgdGhhdCB0aGUgcmVzdWx0cyBhZ2dyZWdhdGlvbiBkZXBlbmRzIG9uLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCBpbiB0aGUgbmV3IHBhc3MgbWFuYWdlciB0byBpbXBsZW1lbnQgdGhlIGludmFsaWRhdGlvbiBsb2dpYworICAvLy8gd2hlcmUgd2UgbXVzdCBpbnZhbGlkYXRlIHRoZSByZXN1bHRzIGFnZ3JlZ2F0aW9uIGlmIGFueSBvZiBvdXIgY29tcG9uZW50CisgIC8vLyBhbmFseXNlcyBiZWNvbWUgaW52YWxpZC4KKyAgdm9pZCBhZGRBQURlcGVuZGVuY3lJRChBbmFseXNpc0tleSAqSUQpIHsgQUFEZXBzLnB1c2hfYmFjayhJRCk7IH0KKworICAvLy8gSGFuZGxlIGludmFsaWRhdGlvbiBldmVudHMgaW4gdGhlIG5ldyBwYXNzIG1hbmFnZXIuCisgIC8vLworICAvLy8gVGhlIGFnZ3JlZ2F0aW9uIGlzIGludmFsaWRhdGVkIGlmIGFueSBvZiB0aGUgdW5kZXJseWluZyBhbmFseXNlcyBpcworICAvLy8gaW52YWxpZGF0ZWQuCisgIGJvb2wgaW52YWxpZGF0ZShGdW5jdGlvbiAmRiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJlBBLAorICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BbmFseXNpc01hbmFnZXI6OkludmFsaWRhdG9yICZJbnYpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gXG5hbWUgQWxpYXMgUXVlcmllcworICAvLy8gQHsKKworICAvLy8gVGhlIG1haW4gbG93IGxldmVsIGludGVyZmFjZSB0byB0aGUgYWxpYXMgYW5hbHlzaXMgaW1wbGVtZW50YXRpb24uCisgIC8vLyBSZXR1cm5zIGFuIEFsaWFzUmVzdWx0IGluZGljYXRpbmcgd2hldGhlciB0aGUgdHdvIHBvaW50ZXJzIGFyZSBhbGlhc2VkIHRvCisgIC8vLyBlYWNoIG90aGVyLiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHNwZWNpZmljCisgIC8vLyBhbGlhcyBhbmFseXNpcyBpbXBsZW1lbnRhdGlvbnMuCisgIEFsaWFzUmVzdWx0IGFsaWFzKGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NBLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQik7CisKKyAgLy8vIEEgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgdGhlIHByaW1hcnkgXGMgYWxpYXMgaW50ZXJmYWNlLgorICBBbGlhc1Jlc3VsdCBhbGlhcyhjb25zdCBWYWx1ZSAqVjEsIHVpbnQ2NF90IFYxU2l6ZSwgY29uc3QgVmFsdWUgKlYyLAorICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBWMlNpemUpIHsKKyAgICByZXR1cm4gYWxpYXMoTWVtb3J5TG9jYXRpb24oVjEsIFYxU2l6ZSksIE1lbW9yeUxvY2F0aW9uKFYyLCBWMlNpemUpKTsKKyAgfQorCisgIC8vLyBBIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBwcmltYXJ5IFxjIGFsaWFzIGludGVyZmFjZS4KKyAgQWxpYXNSZXN1bHQgYWxpYXMoY29uc3QgVmFsdWUgKlYxLCBjb25zdCBWYWx1ZSAqVjIpIHsKKyAgICByZXR1cm4gYWxpYXMoVjEsIE1lbW9yeUxvY2F0aW9uOjpVbmtub3duU2l6ZSwgVjIsCisgICAgICAgICAgICAgICAgIE1lbW9yeUxvY2F0aW9uOjpVbmtub3duU2l6ZSk7CisgIH0KKworICAvLy8gQSB0cml2aWFsIGhlbHBlciBmdW5jdGlvbiB0byBjaGVjayB0byBzZWUgaWYgdGhlIHNwZWNpZmllZCBwb2ludGVycyBhcmUKKyAgLy8vIG5vLWFsaWFzLgorICBib29sIGlzTm9BbGlhcyhjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQSwgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0IpIHsKKyAgICByZXR1cm4gYWxpYXMoTG9jQSwgTG9jQikgPT0gTm9BbGlhczsKKyAgfQorCisgIC8vLyBBIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBcYyBpc05vQWxpYXMgaGVscGVyIGludGVyZmFjZS4KKyAgYm9vbCBpc05vQWxpYXMoY29uc3QgVmFsdWUgKlYxLCB1aW50NjRfdCBWMVNpemUsIGNvbnN0IFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgdWludDY0X3QgVjJTaXplKSB7CisgICAgcmV0dXJuIGlzTm9BbGlhcyhNZW1vcnlMb2NhdGlvbihWMSwgVjFTaXplKSwgTWVtb3J5TG9jYXRpb24oVjIsIFYyU2l6ZSkpOworICB9CisKKyAgLy8vIEEgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgdGhlIFxjIGlzTm9BbGlhcyBoZWxwZXIgaW50ZXJmYWNlLgorICBib29sIGlzTm9BbGlhcyhjb25zdCBWYWx1ZSAqVjEsIGNvbnN0IFZhbHVlICpWMikgeworICAgIHJldHVybiBpc05vQWxpYXMoTWVtb3J5TG9jYXRpb24oVjEpLCBNZW1vcnlMb2NhdGlvbihWMikpOworICB9CisKKyAgLy8vIEEgdHJpdmlhbCBoZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgdG8gc2VlIGlmIHRoZSBzcGVjaWZpZWQgcG9pbnRlcnMgYXJlCisgIC8vLyBtdXN0LWFsaWFzLgorICBib29sIGlzTXVzdEFsaWFzKGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NBLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQikgeworICAgIHJldHVybiBhbGlhcyhMb2NBLCBMb2NCKSA9PSBNdXN0QWxpYXM7CisgIH0KKworICAvLy8gQSBjb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgXGMgaXNNdXN0QWxpYXMgaGVscGVyIGludGVyZmFjZS4KKyAgYm9vbCBpc011c3RBbGlhcyhjb25zdCBWYWx1ZSAqVjEsIGNvbnN0IFZhbHVlICpWMikgeworICAgIHJldHVybiBhbGlhcyhWMSwgMSwgVjIsIDEpID09IE11c3RBbGlhczsKKyAgfQorCisgIC8vLyBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbG9jYXRpb24gcG9pbnRzIHRvIGNvbnN0YW50IG1lbW9yeSwgb3IgaWYKKyAgLy8vIFxwIE9yTG9jYWwgaXMgdHJ1ZSB3aGV0aGVyIGl0IHBvaW50cyB0byBhIGxvY2FsIGFsbG9jYS4KKyAgYm9vbCBwb2ludHNUb0NvbnN0YW50TWVtb3J5KGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MsIGJvb2wgT3JMb2NhbCA9IGZhbHNlKTsKKworICAvLy8gQSBjb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgcHJpbWFyeSBcYyBwb2ludHNUb0NvbnN0YW50TWVtb3J5CisgIC8vLyBpbnRlcmZhY2UuCisgIGJvb2wgcG9pbnRzVG9Db25zdGFudE1lbW9yeShjb25zdCBWYWx1ZSAqUCwgYm9vbCBPckxvY2FsID0gZmFsc2UpIHsKKyAgICByZXR1cm4gcG9pbnRzVG9Db25zdGFudE1lbW9yeShNZW1vcnlMb2NhdGlvbihQKSwgT3JMb2NhbCk7CisgIH0KKworICAvLy8gQH0KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBcbmFtZSBTaW1wbGUgbW9kL3JlZiBpbmZvcm1hdGlvbgorICAvLy8gQHsKKworICAvLy8gR2V0IHRoZSBNb2RSZWYgaW5mbyBhc3NvY2lhdGVkIHdpdGggYSBwb2ludGVyIGFyZ3VtZW50IG9mIGEgY2FsbHNpdGUuIFRoZQorICAvLy8gcmVzdWx0J3MgYml0cyBhcmUgc2V0IHRvIGluZGljYXRlIHRoZSBhbGxvd2VkIGFsaWFzaW5nIE1vZFJlZiBraW5kcy4gTm90ZQorICAvLy8gdGhhdCB0aGVzZSBiaXRzIGRvIG5vdCBuZWNlc3NhcmlseSBhY2NvdW50IGZvciB0aGUgb3ZlcmFsbCBiZWhhdmlvciBvZgorICAvLy8gdGhlIGZ1bmN0aW9uLCBidXQgcmF0aGVyIG9ubHkgcHJvdmlkZSBhZGRpdGlvbmFsIHBlci1hcmd1bWVudAorICAvLy8gaW5mb3JtYXRpb24uIFRoaXMgbmV2ZXIgc2V0cyBNb2RSZWZJbmZvOjpNdXN0LgorICBNb2RSZWZJbmZvIGdldEFyZ01vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsIHVuc2lnbmVkIEFyZ0lkeCk7CisKKyAgLy8vIFJldHVybiB0aGUgYmVoYXZpb3Igb2YgdGhlIGdpdmVuIGNhbGwgc2l0ZS4KKyAgRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihJbW11dGFibGVDYWxsU2l0ZSBDUyk7CisKKyAgLy8vIFJldHVybiB0aGUgYmVoYXZpb3Igd2hlbiBjYWxsaW5nIHRoZSBnaXZlbiBmdW5jdGlvbi4KKyAgRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihjb25zdCBGdW5jdGlvbiAqRik7CisKKyAgLy8vIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIGNhbGwgaXMga25vd24gdG8gbmV2ZXIgcmVhZCBvciB3cml0ZSBtZW1vcnkuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IGlmIHRoZSBjYWxsIG9ubHkgcmVhZHMgZnJvbSBrbm93bi1jb25zdGFudCBtZW1vcnksIGl0IGlzIGFsc28KKyAgLy8vIGxlZ2FsIHRvIHJldHVybiB0cnVlLiBBbHNvLCBjYWxscyB0aGF0IHVud2luZCB0aGUgc3RhY2sgYXJlIGxlZ2FsIGZvcgorICAvLy8gdGhpcyBwcmVkaWNhdGUuCisgIC8vLworICAvLy8gTWFueSBvcHRpbWl6YXRpb25zIChzdWNoIGFzIENTRSBhbmQgTElDTSkgY2FuIGJlIHBlcmZvcm1lZCBvbiBzdWNoIGNhbGxzCisgIC8vLyB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGFsaWFzaW5nIHByb3BlcnRpZXMsIGFuZCBtYW55IGNhbGxzIGhhdmUgdGhpcworICAvLy8gcHJvcGVydHkgKGUuZy4gY2FsbHMgdG8gJ3NpbicgYW5kICdjb3MnKS4KKyAgLy8vCisgIC8vLyBUaGlzIHByb3BlcnR5IGNvcnJlc3BvbmRzIHRvIHRoZSBHQ0MgJ2NvbnN0JyBhdHRyaWJ1dGUuCisgIGJvb2wgZG9lc05vdEFjY2Vzc01lbW9yeShJbW11dGFibGVDYWxsU2l0ZSBDUykgeworICAgIHJldHVybiBnZXRNb2RSZWZCZWhhdmlvcihDUykgPT0gRk1SQl9Eb2VzTm90QWNjZXNzTWVtb3J5OworICB9CisKKyAgLy8vIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGlzIGtub3duIHRvIG5ldmVyIHJlYWQgb3Igd3JpdGUgbWVtb3J5LgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBpZiB0aGUgZnVuY3Rpb24gb25seSByZWFkcyBmcm9tIGtub3duLWNvbnN0YW50IG1lbW9yeSwgaXQgaXMKKyAgLy8vIGFsc28gbGVnYWwgdG8gcmV0dXJuIHRydWUuIEFsc28sIGZ1bmN0aW9uIHRoYXQgdW53aW5kIHRoZSBzdGFjayBhcmUgbGVnYWwKKyAgLy8vIGZvciB0aGlzIHByZWRpY2F0ZS4KKyAgLy8vCisgIC8vLyBNYW55IG9wdGltaXphdGlvbnMgKHN1Y2ggYXMgQ1NFIGFuZCBMSUNNKSBjYW4gYmUgcGVyZm9ybWVkIG9uIHN1Y2ggY2FsbHMKKyAgLy8vIHRvIHN1Y2ggZnVuY3Rpb25zIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgYWxpYXNpbmcgcHJvcGVydGllcywgYW5kIG1hbnkKKyAgLy8vIGZ1bmN0aW9ucyBoYXZlIHRoaXMgcHJvcGVydHkgKGUuZy4gJ3NpbicgYW5kICdjb3MnKS4KKyAgLy8vCisgIC8vLyBUaGlzIHByb3BlcnR5IGNvcnJlc3BvbmRzIHRvIHRoZSBHQ0MgJ2NvbnN0JyBhdHRyaWJ1dGUuCisgIGJvb2wgZG9lc05vdEFjY2Vzc01lbW9yeShjb25zdCBGdW5jdGlvbiAqRikgeworICAgIHJldHVybiBnZXRNb2RSZWZCZWhhdmlvcihGKSA9PSBGTVJCX0RvZXNOb3RBY2Nlc3NNZW1vcnk7CisgIH0KKworICAvLy8gQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgY2FsbCBpcyBrbm93biB0byBvbmx5IHJlYWQgZnJvbSBub24tdm9sYXRpbGUKKyAgLy8vIG1lbW9yeSAob3Igbm90IGFjY2VzcyBtZW1vcnkgYXQgYWxsKS4KKyAgLy8vCisgIC8vLyBDYWxscyB0aGF0IHVud2luZCB0aGUgc3RhY2sgYXJlIGxlZ2FsIGZvciB0aGlzIHByZWRpY2F0ZS4KKyAgLy8vCisgIC8vLyBUaGlzIHByb3BlcnR5IGFsbG93cyBtYW55IGNvbW1vbiBvcHRpbWl6YXRpb25zIHRvIGJlIHBlcmZvcm1lZCBpbiB0aGUKKyAgLy8vIGFic2VuY2Ugb2YgaW50ZXJmZXJpbmcgc3RvcmUgaW5zdHJ1Y3Rpb25zLCBzdWNoIGFzIENTRSBvZiBzdHJsZW4gY2FsbHMuCisgIC8vLworICAvLy8gVGhpcyBwcm9wZXJ0eSBjb3JyZXNwb25kcyB0byB0aGUgR0NDICdwdXJlJyBhdHRyaWJ1dGUuCisgIGJvb2wgb25seVJlYWRzTWVtb3J5KEltbXV0YWJsZUNhbGxTaXRlIENTKSB7CisgICAgcmV0dXJuIG9ubHlSZWFkc01lbW9yeShnZXRNb2RSZWZCZWhhdmlvcihDUykpOworICB9CisKKyAgLy8vIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGlzIGtub3duIHRvIG9ubHkgcmVhZCBmcm9tIG5vbi12b2xhdGlsZQorICAvLy8gbWVtb3J5IChvciBub3QgYWNjZXNzIG1lbW9yeSBhdCBhbGwpLgorICAvLy8KKyAgLy8vIEZ1bmN0aW9ucyB0aGF0IHVud2luZCB0aGUgc3RhY2sgYXJlIGxlZ2FsIGZvciB0aGlzIHByZWRpY2F0ZS4KKyAgLy8vCisgIC8vLyBUaGlzIHByb3BlcnR5IGFsbG93cyBtYW55IGNvbW1vbiBvcHRpbWl6YXRpb25zIHRvIGJlIHBlcmZvcm1lZCBpbiB0aGUKKyAgLy8vIGFic2VuY2Ugb2YgaW50ZXJmZXJpbmcgc3RvcmUgaW5zdHJ1Y3Rpb25zLCBzdWNoIGFzIENTRSBvZiBzdHJsZW4gY2FsbHMuCisgIC8vLworICAvLy8gVGhpcyBwcm9wZXJ0eSBjb3JyZXNwb25kcyB0byB0aGUgR0NDICdwdXJlJyBhdHRyaWJ1dGUuCisgIGJvb2wgb25seVJlYWRzTWVtb3J5KGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgICAgcmV0dXJuIG9ubHlSZWFkc01lbW9yeShnZXRNb2RSZWZCZWhhdmlvcihGKSk7CisgIH0KKworICAvLy8gQ2hlY2tzIGlmIGZ1bmN0aW9ucyB3aXRoIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3IgYXJlIGtub3duIHRvIG9ubHkgcmVhZAorICAvLy8gZnJvbSBub24tdm9sYXRpbGUgbWVtb3J5IChvciBub3QgYWNjZXNzIG1lbW9yeSBhdCBhbGwpLgorICBzdGF0aWMgYm9vbCBvbmx5UmVhZHNNZW1vcnkoRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBNUkIpIHsKKyAgICByZXR1cm4gIWlzTW9kU2V0KGNyZWF0ZU1vZFJlZkluZm8oTVJCKSk7CisgIH0KKworICAvLy8gQ2hlY2tzIGlmIGZ1bmN0aW9ucyB3aXRoIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3IgYXJlIGtub3duIHRvIG9ubHkgd3JpdGUKKyAgLy8vIG1lbW9yeSAob3Igbm90IGFjY2VzcyBtZW1vcnkgYXQgYWxsKS4KKyAgc3RhdGljIGJvb2wgZG9lc05vdFJlYWRNZW1vcnkoRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBNUkIpIHsKKyAgICByZXR1cm4gIWlzUmVmU2V0KGNyZWF0ZU1vZFJlZkluZm8oTVJCKSk7CisgIH0KKworICAvLy8gQ2hlY2tzIGlmIGZ1bmN0aW9ucyB3aXRoIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3IgYXJlIGtub3duIHRvIHJlYWQgYW5kCisgIC8vLyB3cml0ZSBhdCBtb3N0IGZyb20gb2JqZWN0cyBwb2ludGVkIHRvIGJ5IHRoZWlyIHBvaW50ZXItdHlwZWQgYXJndW1lbnRzCisgIC8vLyAod2l0aCBhcmJpdHJhcnkgb2Zmc2V0cykuCisgIHN0YXRpYyBib29sIG9ubHlBY2Nlc3Nlc0FyZ1BvaW50ZWVzKEZ1bmN0aW9uTW9kUmVmQmVoYXZpb3IgTVJCKSB7CisgICAgcmV0dXJuICEoTVJCICYgRk1STF9Bbnl3aGVyZSAmIH5GTVJMX0FyZ3VtZW50UG9pbnRlZXMpOworICB9CisKKyAgLy8vIENoZWNrcyBpZiBmdW5jdGlvbnMgd2l0aCB0aGUgc3BlY2lmaWVkIGJlaGF2aW9yIGFyZSBrbm93biB0byBwb3RlbnRpYWxseQorICAvLy8gcmVhZCBvciB3cml0ZSBmcm9tIG9iamVjdHMgcG9pbnRlZCB0byBiZSB0aGVpciBwb2ludGVyLXR5cGVkIGFyZ3VtZW50cworICAvLy8gKHdpdGggYXJiaXRyYXJ5IG9mZnNldHMpLgorICBzdGF0aWMgYm9vbCBkb2VzQWNjZXNzQXJnUG9pbnRlZXMoRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBNUkIpIHsKKyAgICByZXR1cm4gaXNNb2RPclJlZlNldChjcmVhdGVNb2RSZWZJbmZvKE1SQikpICYmCisgICAgICAgICAgIChNUkIgJiBGTVJMX0FyZ3VtZW50UG9pbnRlZXMpOworICB9CisKKyAgLy8vIENoZWNrcyBpZiBmdW5jdGlvbnMgd2l0aCB0aGUgc3BlY2lmaWVkIGJlaGF2aW9yIGFyZSBrbm93biB0byByZWFkIGFuZAorICAvLy8gd3JpdGUgYXQgbW9zdCBmcm9tIG1lbW9yeSB0aGF0IGlzIGluYWNjZXNzaWJsZSBmcm9tIExMVk0gSVIuCisgIHN0YXRpYyBib29sIG9ubHlBY2Nlc3Nlc0luYWNjZXNzaWJsZU1lbShGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIE1SQikgeworICAgIHJldHVybiAhKE1SQiAmIEZNUkxfQW55d2hlcmUgJiB+Rk1STF9JbmFjY2Vzc2libGVNZW0pOworICB9CisKKyAgLy8vIENoZWNrcyBpZiBmdW5jdGlvbnMgd2l0aCB0aGUgc3BlY2lmaWVkIGJlaGF2aW9yIGFyZSBrbm93biB0byBwb3RlbnRpYWxseQorICAvLy8gcmVhZCBvciB3cml0ZSBmcm9tIG1lbW9yeSB0aGF0IGlzIGluYWNjZXNzaWJsZSBmcm9tIExMVk0gSVIuCisgIHN0YXRpYyBib29sIGRvZXNBY2Nlc3NJbmFjY2Vzc2libGVNZW0oRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBNUkIpIHsKKyAgICByZXR1cm4gaXNNb2RPclJlZlNldChjcmVhdGVNb2RSZWZJbmZvKE1SQikpICYmIChNUkIgJiBGTVJMX0luYWNjZXNzaWJsZU1lbSk7CisgIH0KKworICAvLy8gQ2hlY2tzIGlmIGZ1bmN0aW9ucyB3aXRoIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3IgYXJlIGtub3duIHRvIHJlYWQgYW5kCisgIC8vLyB3cml0ZSBhdCBtb3N0IGZyb20gbWVtb3J5IHRoYXQgaXMgaW5hY2Nlc3NpYmxlIGZyb20gTExWTSBJUiBvciBvYmplY3RzCisgIC8vLyBwb2ludGVkIHRvIGJ5IHRoZWlyIHBvaW50ZXItdHlwZWQgYXJndW1lbnRzICh3aXRoIGFyYml0cmFyeSBvZmZzZXRzKS4KKyAgc3RhdGljIGJvb2wgb25seUFjY2Vzc2VzSW5hY2Nlc3NpYmxlT3JBcmdNZW0oRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBNUkIpIHsKKyAgICByZXR1cm4gIShNUkIgJiBGTVJMX0FueXdoZXJlICYKKyAgICAgICAgICAgICB+KEZNUkxfSW5hY2Nlc3NpYmxlTWVtIHwgRk1STF9Bcmd1bWVudFBvaW50ZWVzKSk7CisgIH0KKworICAvLy8gZ2V0TW9kUmVmSW5mbyAoZm9yIGNhbGwgc2l0ZXMpIC0gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIKKyAgLy8vIGEgcGFydGljdWxhciBjYWxsIHNpdGUgbW9kaWZpZXMgb3IgcmVhZHMgdGhlIHNwZWNpZmllZCBtZW1vcnkgbG9jYXRpb24uCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUywgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYyk7CisKKyAgLy8vIGdldE1vZFJlZkluZm8gKGZvciBjYWxsIHNpdGVzKSAtIEEgY29udmVuaWVuY2Ugd3JhcHBlci4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTLCBjb25zdCBWYWx1ZSAqUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUpIHsKKyAgICByZXR1cm4gZ2V0TW9kUmVmSW5mbyhDUywgTWVtb3J5TG9jYXRpb24oUCwgU2l6ZSkpOworICB9CisKKyAgLy8vIGdldE1vZFJlZkluZm8gKGZvciBjYWxscykgLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlcgorICAvLy8gYSBwYXJ0aWN1bGFyIGNhbGwgbW9kaWZpZXMgb3IgcmVhZHMgdGhlIHNwZWNpZmllZCBtZW1vcnkgbG9jYXRpb24uCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhjb25zdCBDYWxsSW5zdCAqQywgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYykgeworICAgIHJldHVybiBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlKEMpLCBMb2MpOworICB9CisKKyAgLy8vIGdldE1vZFJlZkluZm8gKGZvciBjYWxscykgLSBBIGNvbnZlbmllbmNlIHdyYXBwZXIuCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhjb25zdCBDYWxsSW5zdCAqQywgY29uc3QgVmFsdWUgKlAsIHVpbnQ2NF90IFNpemUpIHsKKyAgICByZXR1cm4gZ2V0TW9kUmVmSW5mbyhDLCBNZW1vcnlMb2NhdGlvbihQLCBTaXplKSk7CisgIH0KKworICAvLy8gZ2V0TW9kUmVmSW5mbyAoZm9yIGludm9rZXMpIC0gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIKKyAgLy8vIGEgcGFydGljdWxhciBpbnZva2UgbW9kaWZpZXMgb3IgcmVhZHMgdGhlIHNwZWNpZmllZCBtZW1vcnkgbG9jYXRpb24uCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhjb25zdCBJbnZva2VJbnN0ICpJLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jKSB7CisgICAgcmV0dXJuIGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUoSSksIExvYyk7CisgIH0KKworICAvLy8gZ2V0TW9kUmVmSW5mbyAoZm9yIGludm9rZXMpIC0gQSBjb252ZW5pZW5jZSB3cmFwcGVyLgorICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oY29uc3QgSW52b2tlSW5zdCAqSSwgY29uc3QgVmFsdWUgKlAsIHVpbnQ2NF90IFNpemUpIHsKKyAgICByZXR1cm4gZ2V0TW9kUmVmSW5mbyhJLCBNZW1vcnlMb2NhdGlvbihQLCBTaXplKSk7CisgIH0KKworICAvLy8gZ2V0TW9kUmVmSW5mbyAoZm9yIGxvYWRzKSAtIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyCisgIC8vLyBhIHBhcnRpY3VsYXIgbG9hZCBtb2RpZmllcyBvciByZWFkcyB0aGUgc3BlY2lmaWVkIG1lbW9yeSBsb2NhdGlvbi4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKGNvbnN0IExvYWRJbnN0ICpMLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jKTsKKworICAvLy8gZ2V0TW9kUmVmSW5mbyAoZm9yIGxvYWRzKSAtIEEgY29udmVuaWVuY2Ugd3JhcHBlci4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKGNvbnN0IExvYWRJbnN0ICpMLCBjb25zdCBWYWx1ZSAqUCwgdWludDY0X3QgU2l6ZSkgeworICAgIHJldHVybiBnZXRNb2RSZWZJbmZvKEwsIE1lbW9yeUxvY2F0aW9uKFAsIFNpemUpKTsKKyAgfQorCisgIC8vLyBnZXRNb2RSZWZJbmZvIChmb3Igc3RvcmVzKSAtIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyCisgIC8vLyBhIHBhcnRpY3VsYXIgc3RvcmUgbW9kaWZpZXMgb3IgcmVhZHMgdGhlIHNwZWNpZmllZCBtZW1vcnkgbG9jYXRpb24uCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhjb25zdCBTdG9yZUluc3QgKlMsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MpOworCisgIC8vLyBnZXRNb2RSZWZJbmZvIChmb3Igc3RvcmVzKSAtIEEgY29udmVuaWVuY2Ugd3JhcHBlci4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKGNvbnN0IFN0b3JlSW5zdCAqUywgY29uc3QgVmFsdWUgKlAsIHVpbnQ2NF90IFNpemUpIHsKKyAgICByZXR1cm4gZ2V0TW9kUmVmSW5mbyhTLCBNZW1vcnlMb2NhdGlvbihQLCBTaXplKSk7CisgIH0KKworICAvLy8gZ2V0TW9kUmVmSW5mbyAoZm9yIGZlbmNlcykgLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlcgorICAvLy8gYSBwYXJ0aWN1bGFyIHN0b3JlIG1vZGlmaWVzIG9yIHJlYWRzIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGxvY2F0aW9uLgorICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oY29uc3QgRmVuY2VJbnN0ICpTLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jKTsKKworICAvLy8gZ2V0TW9kUmVmSW5mbyAoZm9yIGZlbmNlcykgLSBBIGNvbnZlbmllbmNlIHdyYXBwZXIuCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhjb25zdCBGZW5jZUluc3QgKlMsIGNvbnN0IFZhbHVlICpQLCB1aW50NjRfdCBTaXplKSB7CisgICAgcmV0dXJuIGdldE1vZFJlZkluZm8oUywgTWVtb3J5TG9jYXRpb24oUCwgU2l6ZSkpOworICB9CisKKyAgLy8vIGdldE1vZFJlZkluZm8gKGZvciBjbXB4Y2hnZXMpIC0gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIKKyAgLy8vIGEgcGFydGljdWxhciBjbXB4Y2hnIG1vZGlmaWVzIG9yIHJlYWRzIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGxvY2F0aW9uLgorICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oY29uc3QgQXRvbWljQ21wWGNoZ0luc3QgKkNYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYyk7CisKKyAgLy8vIGdldE1vZFJlZkluZm8gKGZvciBjbXB4Y2hnZXMpIC0gQSBjb252ZW5pZW5jZSB3cmFwcGVyLgorICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oY29uc3QgQXRvbWljQ21wWGNoZ0luc3QgKkNYLCBjb25zdCBWYWx1ZSAqUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNpemUpIHsKKyAgICByZXR1cm4gZ2V0TW9kUmVmSW5mbyhDWCwgTWVtb3J5TG9jYXRpb24oUCwgU2l6ZSkpOworICB9CisKKyAgLy8vIGdldE1vZFJlZkluZm8gKGZvciBhdG9taWNybXdzKSAtIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyCisgIC8vLyBhIHBhcnRpY3VsYXIgYXRvbWljcm13IG1vZGlmaWVzIG9yIHJlYWRzIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGxvY2F0aW9uLgorICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oY29uc3QgQXRvbWljUk1XSW5zdCAqUk1XLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jKTsKKworICAvLy8gZ2V0TW9kUmVmSW5mbyAoZm9yIGF0b21pY3Jtd3MpIC0gQSBjb252ZW5pZW5jZSB3cmFwcGVyLgorICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oY29uc3QgQXRvbWljUk1XSW5zdCAqUk1XLCBjb25zdCBWYWx1ZSAqUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNpemUpIHsKKyAgICByZXR1cm4gZ2V0TW9kUmVmSW5mbyhSTVcsIE1lbW9yeUxvY2F0aW9uKFAsIFNpemUpKTsKKyAgfQorCisgIC8vLyBnZXRNb2RSZWZJbmZvIChmb3IgdmFfYXJncykgLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlcgorICAvLy8gYSBwYXJ0aWN1bGFyIHZhX2FyZyBtb2RpZmllcyBvciByZWFkcyB0aGUgc3BlY2lmaWVkIG1lbW9yeSBsb2NhdGlvbi4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKGNvbnN0IFZBQXJnSW5zdCAqSSwgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYyk7CisKKyAgLy8vIGdldE1vZFJlZkluZm8gKGZvciB2YV9hcmdzKSAtIEEgY29udmVuaWVuY2Ugd3JhcHBlci4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKGNvbnN0IFZBQXJnSW5zdCAqSSwgY29uc3QgVmFsdWUgKlAsIHVpbnQ2NF90IFNpemUpIHsKKyAgICByZXR1cm4gZ2V0TW9kUmVmSW5mbyhJLCBNZW1vcnlMb2NhdGlvbihQLCBTaXplKSk7CisgIH0KKworICAvLy8gZ2V0TW9kUmVmSW5mbyAoZm9yIGNhdGNocGFkcykgLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlcgorICAvLy8gYSBwYXJ0aWN1bGFyIGNhdGNocGFkIG1vZGlmaWVzIG9yIHJlYWRzIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGxvY2F0aW9uLgorICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oY29uc3QgQ2F0Y2hQYWRJbnN0ICpJLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jKTsKKworICAvLy8gZ2V0TW9kUmVmSW5mbyAoZm9yIGNhdGNocGFkcykgLSBBIGNvbnZlbmllbmNlIHdyYXBwZXIuCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhjb25zdCBDYXRjaFBhZEluc3QgKkksIGNvbnN0IFZhbHVlICpQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSkgeworICAgIHJldHVybiBnZXRNb2RSZWZJbmZvKEksIE1lbW9yeUxvY2F0aW9uKFAsIFNpemUpKTsKKyAgfQorCisgIC8vLyBnZXRNb2RSZWZJbmZvIChmb3IgY2F0Y2hyZXRzKSAtIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyCisgIC8vLyBhIHBhcnRpY3VsYXIgY2F0Y2hyZXQgbW9kaWZpZXMgb3IgcmVhZHMgdGhlIHNwZWNpZmllZCBtZW1vcnkgbG9jYXRpb24uCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhjb25zdCBDYXRjaFJldHVybkluc3QgKkksIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MpOworCisgIC8vLyBnZXRNb2RSZWZJbmZvIChmb3IgY2F0Y2hyZXRzKSAtIEEgY29udmVuaWVuY2Ugd3JhcHBlci4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKGNvbnN0IENhdGNoUmV0dXJuSW5zdCAqSSwgY29uc3QgVmFsdWUgKlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplKSB7CisgICAgcmV0dXJuIGdldE1vZFJlZkluZm8oSSwgTWVtb3J5TG9jYXRpb24oUCwgU2l6ZSkpOworICB9CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgb3Igbm90IGFuIGluc3RydWN0aW9uIG1heSByZWFkIG9yIHdyaXRlIHRoZSBvcHRpb25hbGx5CisgIC8vLyBzcGVjaWZpZWQgbWVtb3J5IGxvY2F0aW9uLgorICAvLy8KKyAgLy8vCisgIC8vLyBBbiBpbnN0cnVjdGlvbiB0aGF0IGRvZXNuJ3QgcmVhZCBvciB3cml0ZSBtZW1vcnkgbWF5IGJlIHRyaXZpYWxseSBMSUNNJ2QKKyAgLy8vIGZvciBleGFtcGxlLgorICAvLy8KKyAgLy8vIEZvciBmdW5jdGlvbiBjYWxscywgdGhpcyBkZWxlZ2F0ZXMgdG8gdGhlIGFsaWFzLWFuYWx5c2lzIHNwZWNpZmljCisgIC8vLyBjYWxsLXNpdGUgbW9kLXJlZiBiZWhhdmlvciBxdWVyaWVzLiBPdGhlcndpc2UgaXQgZGVsZWdhdGVzIHRvIHRoZSBzcGVjaWZpYworICAvLy8gaGVscGVycyBhYm92ZS4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKGNvbnN0IEluc3RydWN0aW9uICpJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uYWw8TWVtb3J5TG9jYXRpb24+ICZPcHRMb2MpIHsKKyAgICBpZiAoT3B0TG9jID09IE5vbmUpIHsKKyAgICAgIGlmIChhdXRvIENTID0gSW1tdXRhYmxlQ2FsbFNpdGUoSSkpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZU1vZFJlZkluZm8oZ2V0TW9kUmVmQmVoYXZpb3IoQ1MpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jID0gT3B0TG9jLmdldFZhbHVlT3IoTWVtb3J5TG9jYXRpb24oKSk7CisKKyAgICBzd2l0Y2ggKEktPmdldE9wY29kZSgpKSB7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VkFBcmc6ICByZXR1cm4gZ2V0TW9kUmVmSW5mbygoY29uc3QgVkFBcmdJbnN0KilJLCBMb2MpOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkxvYWQ6ICAgcmV0dXJuIGdldE1vZFJlZkluZm8oKGNvbnN0IExvYWRJbnN0KilJLCAgTG9jKTsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTdG9yZTogIHJldHVybiBnZXRNb2RSZWZJbmZvKChjb25zdCBTdG9yZUluc3QqKUksIExvYyk7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RmVuY2U6ICByZXR1cm4gZ2V0TW9kUmVmSW5mbygoY29uc3QgRmVuY2VJbnN0KilJLCBMb2MpOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkF0b21pY0NtcFhjaGc6CisgICAgICByZXR1cm4gZ2V0TW9kUmVmSW5mbygoY29uc3QgQXRvbWljQ21wWGNoZ0luc3QqKUksIExvYyk7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6QXRvbWljUk1XOgorICAgICAgcmV0dXJuIGdldE1vZFJlZkluZm8oKGNvbnN0IEF0b21pY1JNV0luc3QqKUksIExvYyk7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6Q2FsbDogICByZXR1cm4gZ2V0TW9kUmVmSW5mbygoY29uc3QgQ2FsbEluc3QqKUksICBMb2MpOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246Okludm9rZTogcmV0dXJuIGdldE1vZFJlZkluZm8oKGNvbnN0IEludm9rZUluc3QqKUksTG9jKTsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpDYXRjaFBhZDoKKyAgICAgIHJldHVybiBnZXRNb2RSZWZJbmZvKChjb25zdCBDYXRjaFBhZEluc3QgKilJLCBMb2MpOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkNhdGNoUmV0OgorICAgICAgcmV0dXJuIGdldE1vZFJlZkluZm8oKGNvbnN0IENhdGNoUmV0dXJuSW5zdCAqKUksIExvYyk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBNb2RSZWZJbmZvOjpOb01vZFJlZjsKKyAgICB9CisgIH0KKworICAvLy8gQSBjb252ZW5pZW5jZSB3cmFwcGVyIGZvciBjb25zdHJ1Y3RpbmcgdGhlIG1lbW9yeSBsb2NhdGlvbi4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKGNvbnN0IEluc3RydWN0aW9uICpJLCBjb25zdCBWYWx1ZSAqUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUpIHsKKyAgICByZXR1cm4gZ2V0TW9kUmVmSW5mbyhJLCBNZW1vcnlMb2NhdGlvbihQLCBTaXplKSk7CisgIH0KKworICAvLy8gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgYSBjYWxsIGFuZCBhbiBpbnN0cnVjdGlvbiBtYXkgcmVmZXIgdG8KKyAgLy8vIHRoZSBzYW1lIG1lbW9yeSBsb2NhdGlvbnMuCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhJbnN0cnVjdGlvbiAqSSwgSW1tdXRhYmxlQ2FsbFNpdGUgQ2FsbCk7CisKKyAgLy8vIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyIHR3byBjYWxsIHNpdGVzIG1heSByZWZlciB0byB0aGUgc2FtZSBzZXQKKyAgLy8vIG9mIG1lbW9yeSBsb2NhdGlvbnMuIFNlZSB0aGUgQUEgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlsczoKKyAgLy8vICAgaHR0cDovL2xsdm0ub3JnL2RvY3MvQWxpYXNBbmFseXNpcy5odG1sI01vZFJlZkluZm8KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTMSwgSW1tdXRhYmxlQ2FsbFNpdGUgQ1MyKTsKKworICAvLy8gXGJyaWVmIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyIGEgcGFydGljdWxhciBjYWxsIHNpdGUgbW9kaWZpZXMKKyAgLy8vIG9yIHJlYWRzIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGxvY2F0aW9uIFxwIE1lbUxvYyBiZWZvcmUgaW5zdHJ1Y3Rpb24gXHAgSQorICAvLy8gaW4gYSBCYXNpY0Jsb2NrLiBBbiBvcmRlcmVkIGJhc2ljIGJsb2NrIFxwIE9CQiBjYW4gYmUgdXNlZCB0byBzcGVlZCB1cAorICAvLy8gaW5zdHJ1Y3Rpb24gb3JkZXJpbmcgcXVlcmllcyBpbnNpZGUgdGhlIEJhc2ljQmxvY2sgY29udGFpbmluZyBccCBJLgorICAvLy8gRWFybHkgZXhpdHMgaW4gY2FsbENhcHR1cmVzQmVmb3JlIG1heSBsZWFkIHRvIE1vZFJlZkluZm86Ok11c3Qgbm90IGJlaW5nCisgIC8vLyBzZXQuCisgIE1vZFJlZkluZm8gY2FsbENhcHR1cmVzQmVmb3JlKGNvbnN0IEluc3RydWN0aW9uICpJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTWVtTG9jLCBEb21pbmF0b3JUcmVlICpEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JkZXJlZEJhc2ljQmxvY2sgKk9CQiA9IG51bGxwdHIpOworCisgIC8vLyBcYnJpZWYgQSBjb252ZW5pZW5jZSB3cmFwcGVyIHRvIHN5bnRoZXNpemUgYSBtZW1vcnkgbG9jYXRpb24uCisgIE1vZFJlZkluZm8gY2FsbENhcHR1cmVzQmVmb3JlKGNvbnN0IEluc3RydWN0aW9uICpJLCBjb25zdCBWYWx1ZSAqUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSwgRG9taW5hdG9yVHJlZSAqRFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yZGVyZWRCYXNpY0Jsb2NrICpPQkIgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIGNhbGxDYXB0dXJlc0JlZm9yZShJLCBNZW1vcnlMb2NhdGlvbihQLCBTaXplKSwgRFQsIE9CQik7CisgIH0KKworICAvLy8gQH0KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBcbmFtZSBIaWdoZXIgbGV2ZWwgbWV0aG9kcyBmb3IgcXVlcnlpbmcgbW9kL3JlZiBpbmZvcm1hdGlvbi4KKyAgLy8vIEB7CisKKyAgLy8vIENoZWNrIGlmIGl0IGlzIHBvc3NpYmxlIGZvciBleGVjdXRpb24gb2YgdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jayB0bworICAvLy8gbW9kaWZ5IHRoZSBsb2NhdGlvbiBMb2MuCisgIGJvb2wgY2FuQmFzaWNCbG9ja01vZGlmeShjb25zdCBCYXNpY0Jsb2NrICZCQiwgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYyk7CisKKyAgLy8vIEEgY29udmVuaWVuY2Ugd3JhcHBlciBzeW50aGVzaXppbmcgYSBtZW1vcnkgbG9jYXRpb24uCisgIGJvb2wgY2FuQmFzaWNCbG9ja01vZGlmeShjb25zdCBCYXNpY0Jsb2NrICZCQiwgY29uc3QgVmFsdWUgKlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplKSB7CisgICAgcmV0dXJuIGNhbkJhc2ljQmxvY2tNb2RpZnkoQkIsIE1lbW9yeUxvY2F0aW9uKFAsIFNpemUpKTsKKyAgfQorCisgIC8vLyBDaGVjayBpZiBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9ucworICAvLy8gdG8gbW9kXHJlZiAoYWNjb3JkaW5nIHRvIHRoZSBtb2RlKSB0aGUgbG9jYXRpb24gTG9jLgorICAvLy8KKyAgLy8vIFRoZSBpbnN0cnVjdGlvbnMgdG8gY29uc2lkZXIgYXJlIGFsbCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSByYW5nZSBvZgorICAvLy8gW0kxLEkyXSBJTkNMVVNJVkUuIEkxIGFuZCBJMiBtdXN0IGJlIGluIHRoZSBzYW1lIGJhc2ljIGJsb2NrLgorICBib29sIGNhbkluc3RydWN0aW9uUmFuZ2VNb2RSZWYoY29uc3QgSW5zdHJ1Y3Rpb24gJkkxLCBjb25zdCBJbnN0cnVjdGlvbiAmSTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTW9kUmVmSW5mbyBNb2RlKTsKKworICAvLy8gQSBjb252ZW5pZW5jZSB3cmFwcGVyIHN5bnRoZXNpemluZyBhIG1lbW9yeSBsb2NhdGlvbi4KKyAgYm9vbCBjYW5JbnN0cnVjdGlvblJhbmdlTW9kUmVmKGNvbnN0IEluc3RydWN0aW9uICZJMSwgY29uc3QgSW5zdHJ1Y3Rpb24gJkkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlB0ciwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZFJlZkluZm8gTW9kZSkgeworICAgIHJldHVybiBjYW5JbnN0cnVjdGlvblJhbmdlTW9kUmVmKEkxLCBJMiwgTWVtb3J5TG9jYXRpb24oUHRyLCBTaXplKSwgTW9kZSk7CisgIH0KKworcHJpdmF0ZToKKyAgY2xhc3MgQ29uY2VwdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgTW9kZWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyBBQVJlc3VsdEJhc2U7CisKKyAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJlRMSTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q29uY2VwdD4+IEFBczsKKworICBzdGQ6OnZlY3RvcjxBbmFseXNpc0tleSAqPiBBQURlcHM7Cit9OworCisvLy8gVGVtcG9yYXJ5IHR5cGVkZWYgZm9yIGxlZ2FjeSBjb2RlIHRoYXQgdXNlcyBhIGdlbmVyaWMgXGMgQWxpYXNBbmFseXNpcworLy8vIHBvaW50ZXIgb3IgcmVmZXJlbmNlLgordXNpbmcgQWxpYXNBbmFseXNpcyA9IEFBUmVzdWx0czsKKworLy8vIEEgcHJpdmF0ZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGRlc2NyaWJpbmcgdGhlIGNvbmNlcHQgb2YgYW4gaW5kaXZpZHVhbCBhbGlhcworLy8vIGFuYWx5c2lzIGltcGxlbWVudGF0aW9uLgorLy8vCisvLy8gVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgYW55IFxjIE1vZGVsIGluc3RhbnRpYXRpb24uIEl0IGlzIGFsc28gdGhlCisvLy8gaW50ZXJmYWNlIHdoaWNoIGEgdHlwZSB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSBtb2RlbCBtdXN0IHByb3ZpZGUuCisvLy8KKy8vLyBBbGwgb2YgdGhlc2UgbWV0aG9kcyBtb2RlbCBtZXRob2RzIGJ5IHRoZSBzYW1lIG5hbWUgaW4gdGhlIFxjCisvLy8gQUFSZXN1bHRzIGNsYXNzLiBPbmx5IGRpZmZlcmVuY2VzIGFuZCBzcGVjaWZpY3MgdG8gaG93IHRoZQorLy8vIGltcGxlbWVudGF0aW9ucyBhcmUgY2FsbGVkIGFyZSBkb2N1bWVudGVkIGhlcmUuCitjbGFzcyBBQVJlc3VsdHM6OkNvbmNlcHQgeworcHVibGljOgorICB2aXJ0dWFsIH5Db25jZXB0KCkgPSAwOworCisgIC8vLyBBbiB1cGRhdGUgQVBJIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgQUFSZXN1bHRzIHRvIHByb3ZpZGUKKyAgLy8vIGEgaGFuZGxlIGJhY2sgdG8gdGhlIHRvcCBsZXZlbCBhZ2dyZWdhdGlvbi4KKyAgdmlydHVhbCB2b2lkIHNldEFBUmVzdWx0cyhBQVJlc3VsdHMgKk5ld0FBUikgPSAwOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gXG5hbWUgQWxpYXMgUXVlcmllcworICAvLy8gQHsKKworICAvLy8gVGhlIG1haW4gbG93IGxldmVsIGludGVyZmFjZSB0byB0aGUgYWxpYXMgYW5hbHlzaXMgaW1wbGVtZW50YXRpb24uCisgIC8vLyBSZXR1cm5zIGFuIEFsaWFzUmVzdWx0IGluZGljYXRpbmcgd2hldGhlciB0aGUgdHdvIHBvaW50ZXJzIGFyZSBhbGlhc2VkIHRvCisgIC8vLyBlYWNoIG90aGVyLiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHNwZWNpZmljCisgIC8vLyBhbGlhcyBhbmFseXNpcyBpbXBsZW1lbnRhdGlvbnMuCisgIHZpcnR1YWwgQWxpYXNSZXN1bHQgYWxpYXMoY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0IpID0gMDsKKworICAvLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxvY2F0aW9uIHBvaW50cyB0byBjb25zdGFudCBtZW1vcnksIG9yIGlmCisgIC8vLyBccCBPckxvY2FsIGlzIHRydWUgd2hldGhlciBpdCBwb2ludHMgdG8gYSBsb2NhbCBhbGxvY2EuCisgIHZpcnR1YWwgYm9vbCBwb2ludHNUb0NvbnN0YW50TWVtb3J5KGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT3JMb2NhbCkgPSAwOworCisgIC8vLyBAfQorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFxuYW1lIFNpbXBsZSBtb2QvcmVmIGluZm9ybWF0aW9uCisgIC8vLyBAeworCisgIC8vLyBHZXQgdGhlIE1vZFJlZiBpbmZvIGFzc29jaWF0ZWQgd2l0aCBhIHBvaW50ZXIgYXJndW1lbnQgb2YgYSBjYWxsc2l0ZS4gVGhlCisgIC8vLyByZXN1bHQncyBiaXRzIGFyZSBzZXQgdG8gaW5kaWNhdGUgdGhlIGFsbG93ZWQgYWxpYXNpbmcgTW9kUmVmIGtpbmRzLiBOb3RlCisgIC8vLyB0aGF0IHRoZXNlIGJpdHMgZG8gbm90IG5lY2Vzc2FyaWx5IGFjY291bnQgZm9yIHRoZSBvdmVyYWxsIGJlaGF2aW9yIG9mCisgIC8vLyB0aGUgZnVuY3Rpb24sIGJ1dCByYXRoZXIgb25seSBwcm92aWRlIGFkZGl0aW9uYWwgcGVyLWFyZ3VtZW50CisgIC8vLyBpbmZvcm1hdGlvbi4KKyAgdmlydHVhbCBNb2RSZWZJbmZvIGdldEFyZ01vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFyZ0lkeCkgPSAwOworCisgIC8vLyBSZXR1cm4gdGhlIGJlaGF2aW9yIG9mIHRoZSBnaXZlbiBjYWxsIHNpdGUuCisgIHZpcnR1YWwgRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihJbW11dGFibGVDYWxsU2l0ZSBDUykgPSAwOworCisgIC8vLyBSZXR1cm4gdGhlIGJlaGF2aW9yIHdoZW4gY2FsbGluZyB0aGUgZ2l2ZW4gZnVuY3Rpb24uCisgIHZpcnR1YWwgRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihjb25zdCBGdW5jdGlvbiAqRikgPSAwOworCisgIC8vLyBnZXRNb2RSZWZJbmZvIChmb3IgY2FsbCBzaXRlcykgLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlcgorICAvLy8gYSBwYXJ0aWN1bGFyIGNhbGwgc2l0ZSBtb2RpZmllcyBvciByZWFkcyB0aGUgc3BlY2lmaWVkIG1lbW9yeSBsb2NhdGlvbi4KKyAgdmlydHVhbCBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MpID0gMDsKKworICAvLy8gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgdHdvIGNhbGwgc2l0ZXMgbWF5IHJlZmVyIHRvIHRoZSBzYW1lIHNldAorICAvLy8gb2YgbWVtb3J5IGxvY2F0aW9ucy4gU2VlIHRoZSBBQSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzOgorICAvLy8gICBodHRwOi8vbGx2bS5vcmcvZG9jcy9BbGlhc0FuYWx5c2lzLmh0bWwjTW9kUmVmSW5mbworICB2aXJ0dWFsIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUNhbGxTaXRlIENTMikgPSAwOworCisgIC8vLyBAfQorfTsKKworLy8vIEEgcHJpdmF0ZSBjbGFzcyB0ZW1wbGF0ZSB3aGljaCBkZXJpdmVzIGZyb20gXGMgQ29uY2VwdCBhbmQgd3JhcHMgc29tZSBvdGhlcgorLy8vIHR5cGUuCisvLy8KKy8vLyBUaGlzIG1vZGVscyB0aGUgY29uY2VwdCBieSBkaXJlY3RseSBmb3J3YXJkaW5nIGVhY2ggaW50ZXJmYWNlIHBvaW50IHRvIHRoZQorLy8vIHdyYXBwZWQgdHlwZSB3aGljaCBtdXN0IGltcGxlbWVudCBhIGNvbXBhdGlibGUgaW50ZXJmYWNlLiBUaGlzIHByb3ZpZGVzCisvLy8gYSB0eXBlIGVyYXNlZCBiaW5kaW5nLgordGVtcGxhdGUgPHR5cGVuYW1lIEFBUmVzdWx0VD4gY2xhc3MgQUFSZXN1bHRzOjpNb2RlbCBmaW5hbCA6IHB1YmxpYyBDb25jZXB0IHsKKyAgQUFSZXN1bHRUICZSZXN1bHQ7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgTW9kZWwoQUFSZXN1bHRUICZSZXN1bHQsIEFBUmVzdWx0cyAmQUFSKSA6IFJlc3VsdChSZXN1bHQpIHsKKyAgICBSZXN1bHQuc2V0QUFSZXN1bHRzKCZBQVIpOworICB9CisgIH5Nb2RlbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICB2b2lkIHNldEFBUmVzdWx0cyhBQVJlc3VsdHMgKk5ld0FBUikgb3ZlcnJpZGUgeyBSZXN1bHQuc2V0QUFSZXN1bHRzKE5ld0FBUik7IH0KKworICBBbGlhc1Jlc3VsdCBhbGlhcyhjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0IpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUmVzdWx0LmFsaWFzKExvY0EsIExvY0IpOworICB9CisKKyAgYm9vbCBwb2ludHNUb0NvbnN0YW50TWVtb3J5KGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9yTG9jYWwpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUmVzdWx0LnBvaW50c1RvQ29uc3RhbnRNZW1vcnkoTG9jLCBPckxvY2FsKTsKKyAgfQorCisgIE1vZFJlZkluZm8gZ2V0QXJnTW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUywgdW5zaWduZWQgQXJnSWR4KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIFJlc3VsdC5nZXRBcmdNb2RSZWZJbmZvKENTLCBBcmdJZHgpOworICB9CisKKyAgRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihJbW11dGFibGVDYWxsU2l0ZSBDUykgb3ZlcnJpZGUgeworICAgIHJldHVybiBSZXN1bHQuZ2V0TW9kUmVmQmVoYXZpb3IoQ1MpOworICB9CisKKyAgRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihjb25zdCBGdW5jdGlvbiAqRikgb3ZlcnJpZGUgeworICAgIHJldHVybiBSZXN1bHQuZ2V0TW9kUmVmQmVoYXZpb3IoRik7CisgIH0KKworICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIFJlc3VsdC5nZXRNb2RSZWZJbmZvKENTLCBMb2MpOworICB9CisKKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUNhbGxTaXRlIENTMikgb3ZlcnJpZGUgeworICAgIHJldHVybiBSZXN1bHQuZ2V0TW9kUmVmSW5mbyhDUzEsIENTMik7CisgIH0KK307CisKKy8vLyBBIENSVFAtZHJpdmVuICJtaXhpbiIgYmFzZSBjbGFzcyB0byBoZWxwIGltcGxlbWVudCB0aGUgZnVuY3Rpb24gYWxpYXMKKy8vLyBhbmFseXNpcyByZXN1bHRzIGNvbmNlcHQuCisvLy8KKy8vLyBCZWNhdXNlIG9mIHRoZSBuYXR1cmUgb2YgbWFueSBhbGlhcyBhbmFseXNpcyBpbXBsZW1lbnRhdGlvbnMsIHRoZXkgb2Z0ZW4KKy8vLyBvbmx5IGltcGxlbWVudCBhIHN1YnNldCBvZiB0aGUgaW50ZXJmYWNlLiBUaGlzIGJhc2UgY2xhc3Mgd2lsbCBhdHRlbXB0IHRvCisvLy8gaW1wbGVtZW50IHRoZSByZW1haW5pbmcgcG9ydGlvbnMgb2YgdGhlIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBzaW1wbGVyIGZvcm1zCisvLy8gb2YgdGhlIGludGVyZmFjZSB3aGVyZSBwb3NzaWJsZSwgYW5kIG90aGVyd2lzZSBwcm92aWRlIGNvbnNlcnZhdGl2ZWx5CisvLy8gY29ycmVjdCBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbnMuCisvLy8KKy8vLyBJbXBsZW1lbnRvcnMgb2YgYW4gYWxpYXMgYW5hbHlzaXMgc2hvdWxkIGRlcml2ZSBmcm9tIHRoaXMgQ1JUUCwgYW5kIHRoZW4KKy8vLyBvdmVycmlkZSBzcGVjaWZpYyBtZXRob2RzIHRoYXQgdGhleSB3aXNoIHRvIGN1c3RvbWl6ZS4gVGhlcmUgaXMgbm8gbmVlZCB0bworLy8vIHVzZSB2aXJ0dWFsIGFueXdoZXJlLCB0aGUgQ1JUUCBiYXNlIGNsYXNzIGRvZXMgc3RhdGljIGRpc3BhdGNoIHRvIHRoZQorLy8vIGRlcml2ZWQgdHlwZSBwYXNzZWQgaW50byBpdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkVD4gY2xhc3MgQUFSZXN1bHRCYXNlIHsKKyAgLy8gRXhwb3NlIHNvbWUgcGFydHMgb2YgdGhlIGludGVyZmFjZSBvbmx5IHRvIHRoZSBBQVJlc3VsdHM6Ok1vZGVsCisgIC8vIGZvciB3cmFwcGluZy4gU3BlY2lmaWNhbGx5LCB0aGlzIGFsbG93cyB0aGUgbW9kZWwgdG8gY2FsbCBvdXIKKyAgLy8gc2V0QUFSZXN1bHRzIG1ldGhvZCB3aXRob3V0IGV4cG9zaW5nIGl0IGFzIGEgZnVsbHkgcHVibGljIEFQSS4KKyAgZnJpZW5kIGNsYXNzIEFBUmVzdWx0czo6TW9kZWw8RGVyaXZlZFQ+OworCisgIC8vLyBBIHBvaW50ZXIgdG8gdGhlIEFBUmVzdWx0cyBvYmplY3QgdGhhdCB0aGlzIEFBUmVzdWx0IGlzCisgIC8vLyBhZ2dyZWdhdGVkIHdpdGhpbi4gTWF5IGJlIG51bGwgaWYgbm90IGFnZ3JlZ2F0ZWQuCisgIEFBUmVzdWx0cyAqQUFSOworCisgIC8vLyBIZWxwZXIgdG8gZGlzcGF0Y2ggY2FsbHMgYmFjayB0aHJvdWdoIHRoZSBkZXJpdmVkIHR5cGUuCisgIERlcml2ZWRUICZkZXJpdmVkKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8RGVyaXZlZFQgJj4oKnRoaXMpOyB9CisKKyAgLy8vIEEgc2V0dGVyIGZvciB0aGUgQUFSZXN1bHRzIHBvaW50ZXIsIHdoaWNoIGlzIHVzZWQgdG8gc2F0aXNmeSB0aGUKKyAgLy8vIEFBUmVzdWx0czo6TW9kZWwgY29udHJhY3QuCisgIHZvaWQgc2V0QUFSZXN1bHRzKEFBUmVzdWx0cyAqTmV3QUFSKSB7IEFBUiA9IE5ld0FBUjsgfQorCitwcm90ZWN0ZWQ6CisgIC8vLyBUaGlzIHByb3h5IGNsYXNzIG1vZGVscyBhIGNvbW1vbiBwYXR0ZXJuIHdoZXJlIHdlIGRlbGVnYXRlIHRvIGVpdGhlciB0aGUKKyAgLy8vIHRvcC1sZXZlbCBcYyBBQVJlc3VsdHMgYWdncmVnYXRpb24gaWYgb25lIGlzIHJlZ2lzdGVyZWQsIG9yIHRvIHRoZQorICAvLy8gY3VycmVudCByZXN1bHQgaWYgbm9uZSBhcmUgcmVnaXN0ZXJlZC4KKyAgY2xhc3MgQUFSZXN1bHRzUHJveHkgeworICAgIEFBUmVzdWx0cyAqQUFSOworICAgIERlcml2ZWRUICZDdXJyZW50UmVzdWx0OworCisgIHB1YmxpYzoKKyAgICBBQVJlc3VsdHNQcm94eShBQVJlc3VsdHMgKkFBUiwgRGVyaXZlZFQgJkN1cnJlbnRSZXN1bHQpCisgICAgICAgIDogQUFSKEFBUiksIEN1cnJlbnRSZXN1bHQoQ3VycmVudFJlc3VsdCkge30KKworICAgIEFsaWFzUmVzdWx0IGFsaWFzKGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NBLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQikgeworICAgICAgcmV0dXJuIEFBUiA/IEFBUi0+YWxpYXMoTG9jQSwgTG9jQikgOiBDdXJyZW50UmVzdWx0LmFsaWFzKExvY0EsIExvY0IpOworICAgIH0KKworICAgIGJvb2wgcG9pbnRzVG9Db25zdGFudE1lbW9yeShjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jLCBib29sIE9yTG9jYWwpIHsKKyAgICAgIHJldHVybiBBQVIgPyBBQVItPnBvaW50c1RvQ29uc3RhbnRNZW1vcnkoTG9jLCBPckxvY2FsKQorICAgICAgICAgICAgICAgICA6IEN1cnJlbnRSZXN1bHQucG9pbnRzVG9Db25zdGFudE1lbW9yeShMb2MsIE9yTG9jYWwpOworICAgIH0KKworICAgIE1vZFJlZkluZm8gZ2V0QXJnTW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUywgdW5zaWduZWQgQXJnSWR4KSB7CisgICAgICByZXR1cm4gQUFSID8gQUFSLT5nZXRBcmdNb2RSZWZJbmZvKENTLCBBcmdJZHgpIDogQ3VycmVudFJlc3VsdC5nZXRBcmdNb2RSZWZJbmZvKENTLCBBcmdJZHgpOworICAgIH0KKworICAgIEZ1bmN0aW9uTW9kUmVmQmVoYXZpb3IgZ2V0TW9kUmVmQmVoYXZpb3IoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MpIHsKKyAgICAgIHJldHVybiBBQVIgPyBBQVItPmdldE1vZFJlZkJlaGF2aW9yKENTKSA6IEN1cnJlbnRSZXN1bHQuZ2V0TW9kUmVmQmVoYXZpb3IoQ1MpOworICAgIH0KKworICAgIEZ1bmN0aW9uTW9kUmVmQmVoYXZpb3IgZ2V0TW9kUmVmQmVoYXZpb3IoY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgICAgIHJldHVybiBBQVIgPyBBQVItPmdldE1vZFJlZkJlaGF2aW9yKEYpIDogQ3VycmVudFJlc3VsdC5nZXRNb2RSZWZCZWhhdmlvcihGKTsKKyAgICB9CisKKyAgICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MpIHsKKyAgICAgIHJldHVybiBBQVIgPyBBQVItPmdldE1vZFJlZkluZm8oQ1MsIExvYykKKyAgICAgICAgICAgICAgICAgOiBDdXJyZW50UmVzdWx0LmdldE1vZFJlZkluZm8oQ1MsIExvYyk7CisgICAgfQorCisgICAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTMSwgSW1tdXRhYmxlQ2FsbFNpdGUgQ1MyKSB7CisgICAgICByZXR1cm4gQUFSID8gQUFSLT5nZXRNb2RSZWZJbmZvKENTMSwgQ1MyKSA6IEN1cnJlbnRSZXN1bHQuZ2V0TW9kUmVmSW5mbyhDUzEsIENTMik7CisgICAgfQorICB9OworCisgIGV4cGxpY2l0IEFBUmVzdWx0QmFzZSgpID0gZGVmYXVsdDsKKworICAvLyBQcm92aWRlIGFsbCB0aGUgY29weSBhbmQgbW92ZSBjb25zdHJ1Y3RvcnMgc28gdGhhdCBkZXJpdmVkIHR5cGVzIGFyZW4ndAorICAvLyBjb25zdHJhaW5lZC4KKyAgQUFSZXN1bHRCYXNlKGNvbnN0IEFBUmVzdWx0QmFzZSAmQXJnKSB7fQorICBBQVJlc3VsdEJhc2UoQUFSZXN1bHRCYXNlICYmQXJnKSB7fQorCisgIC8vLyBHZXQgYSBwcm94eSBmb3IgdGhlIGJlc3QgQUEgcmVzdWx0IHNldCB0byBxdWVyeSBhdCB0aGlzIHRpbWUuCisgIC8vLworICAvLy8gV2hlbiB0aGlzIHJlc3VsdCBpcyBwYXJ0IG9mIGEgbGFyZ2VyIGFnZ3JlZ2F0aW9uLCB0aGlzIHdpbGwgcHJveHkgdG8gdGhhdAorICAvLy8gYWdncmVnYXRpb24uIFdoZW4gdGhpcyByZXN1bHQgaXMgdXNlZCBpbiBpc29sYXRpb24sIGl0IHdpbGwganVzdCBkZWxlZ2F0ZQorICAvLy8gYmFjayB0byB0aGUgZGVyaXZlZCBjbGFzcydzIGltcGxlbWVudGF0aW9uLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBjYWxsZXJzIG9mIHRoaXMgbmVlZCB0byB0YWtlIGNvbnNpZGVyYWJsZSBjYXJlIHRvIG5vdCBjYXVzZQorICAvLy8gcGVyZm9ybWFuY2UgcHJvYmxlbXMgd2hlbiB0aGV5IHVzZSB0aGlzIHJvdXRpbmUsIGluIHRoZSBjYXNlIG9mIGEgbGFyZ2UKKyAgLy8vIG51bWJlciBvZiBhbGlhcyBhbmFseXNlcyBiZWluZyBhZ2dyZWdhdGVkLCBpdCBjYW4gYmUgZXhwZW5zaXZlIHRvIHdhbGsKKyAgLy8vIGJhY2sgYWNyb3NzIHRoZSBjaGFpbi4KKyAgQUFSZXN1bHRzUHJveHkgZ2V0QmVzdEFBUmVzdWx0cygpIHsgcmV0dXJuIEFBUmVzdWx0c1Byb3h5KEFBUiwgZGVyaXZlZCgpKTsgfQorCitwdWJsaWM6CisgIEFsaWFzUmVzdWx0IGFsaWFzKGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NBLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQikgeworICAgIHJldHVybiBNYXlBbGlhczsKKyAgfQorCisgIGJvb2wgcG9pbnRzVG9Db25zdGFudE1lbW9yeShjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jLCBib29sIE9yTG9jYWwpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBNb2RSZWZJbmZvIGdldEFyZ01vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsIHVuc2lnbmVkIEFyZ0lkeCkgeworICAgIHJldHVybiBNb2RSZWZJbmZvOjpNb2RSZWY7CisgIH0KKworICBGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIGdldE1vZFJlZkJlaGF2aW9yKEltbXV0YWJsZUNhbGxTaXRlIENTKSB7CisgICAgcmV0dXJuIEZNUkJfVW5rbm93bk1vZFJlZkJlaGF2aW9yOworICB9CisKKyAgRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihjb25zdCBGdW5jdGlvbiAqRikgeworICAgIHJldHVybiBGTVJCX1Vua25vd25Nb2RSZWZCZWhhdmlvcjsKKyAgfQorCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUywgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYykgeworICAgIHJldHVybiBNb2RSZWZJbmZvOjpNb2RSZWY7CisgIH0KKworICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MxLCBJbW11dGFibGVDYWxsU2l0ZSBDUzIpIHsKKyAgICByZXR1cm4gTW9kUmVmSW5mbzo6TW9kUmVmOworICB9Cit9OworCisvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBwb2ludGVyIGlzIHJldHVybmVkIGJ5IGEgbm9hbGlhcyBmdW5jdGlvbi4KK2Jvb2wgaXNOb0FsaWFzQ2FsbChjb25zdCBWYWx1ZSAqVik7CisKKy8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIGFyZ3VtZW50IHdpdGggdGhlIG5vYWxpYXMgYXR0cmlidXRlLgorYm9vbCBpc05vQWxpYXNBcmd1bWVudChjb25zdCBWYWx1ZSAqVik7CisKKy8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHBvaW50ZXIgcmVmZXJzIHRvIGEgZGlzdGluY3QgYW5kIGlkZW50aWZpYWJsZSBvYmplY3QuCisvLy8gVGhpcyByZXR1cm5zIHRydWUgZm9yOgorLy8vICAgIEdsb2JhbCBWYXJpYWJsZXMgYW5kIEZ1bmN0aW9ucyAoYnV0IG5vdCBHbG9iYWwgQWxpYXNlcykKKy8vLyAgICBBbGxvY2FzCisvLy8gICAgQnlWYWwgYW5kIE5vQWxpYXMgQXJndW1lbnRzCisvLy8gICAgTm9BbGlhcyByZXR1cm5zIChlLmcuIGNhbGxzIHRvIG1hbGxvYykKKy8vLworYm9vbCBpc0lkZW50aWZpZWRPYmplY3QoY29uc3QgVmFsdWUgKlYpOworCisvLy8gUmV0dXJuIHRydWUgaWYgViBpcyB1bWFiaWdvdXNseSBpZGVudGlmaWVkIGF0IHRoZSBmdW5jdGlvbi1sZXZlbC4KKy8vLyBEaWZmZXJlbnQgSWRlbnRpZmllZEZ1bmN0aW9uTG9jYWxzIGNhbid0IGFsaWFzLgorLy8vIEZ1cnRoZXIsIGFuIElkZW50aWZpZWRGdW5jdGlvbkxvY2FsIGNhbiBub3QgYWxpYXMgd2l0aCBhbnkgZnVuY3Rpb24KKy8vLyBhcmd1bWVudHMgb3RoZXIgdGhhbiBpdHNlbGYsIHdoaWNoIGlzIG5vdCBuZWNlc3NhcmlseSB0cnVlIGZvcgorLy8vIElkZW50aWZpZWRPYmplY3RzLgorYm9vbCBpc0lkZW50aWZpZWRGdW5jdGlvbkxvY2FsKGNvbnN0IFZhbHVlICpWKTsKKworLy8vIEEgbWFuYWdlciBmb3IgYWxpYXMgYW5hbHlzZXMuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGNhbiBoYXZlIGFuYWx5c2VzIHJlZ2lzdGVyZWQgd2l0aCBpdCBhbmQgd2hlbiBydW4sIGl0IHdpbGwgcnVuCisvLy8gYWxsIG9mIHRoZW0gYW5kIGFnZ3JlZ2F0ZSB0aGVpciByZXN1bHRzIGludG8gc2luZ2xlIEFBIHJlc3VsdHMgaW50ZXJmYWNlCisvLy8gdGhhdCBkaXNwYXRjaGVzIGFjcm9zcyBhbGwgb2YgdGhlIGFsaWFzIGFuYWx5c2lzIHJlc3VsdHMgYXZhaWxhYmxlLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoZSBvcmRlciBpbiB3aGljaCBhbmFseXNlcyBhcmUgcmVnaXN0ZXJlZCBpcyB2ZXJ5IHNpZ25pZmljYW50LgorLy8vIFRoYXQgaXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSByZXN1bHRzIHdpbGwgYmUgYWdncmVnYXRlZCBhbmQgcXVlcmllZC4KKy8vLworLy8vIFRoaXMgbWFuYWdlciBlZmZlY3RpdmVseSB3cmFwcyB0aGUgQW5hbHlzaXNNYW5hZ2VyIGZvciByZWdpc3RlcmluZyBhbGlhcworLy8vIGFuYWx5c2VzLiBXaGVuIHlvdSByZWdpc3RlciB5b3VyIGFsaWFzIGFuYWx5c2lzIHdpdGggdGhpcyBtYW5hZ2VyLCBpdCB3aWxsCisvLy8gZW5zdXJlIHRoZSBhbmFseXNpcyBpdHNlbGYgaXMgcmVnaXN0ZXJlZCB3aXRoIGl0cyBBbmFseXNpc01hbmFnZXIuCitjbGFzcyBBQU1hbmFnZXIgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48QUFNYW5hZ2VyPiB7CitwdWJsaWM6CisgIHVzaW5nIFJlc3VsdCA9IEFBUmVzdWx0czsKKworICAvLy8gUmVnaXN0ZXIgYSBzcGVjaWZpYyBBQSByZXN1bHQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBbmFseXNpc1Q+IHZvaWQgcmVnaXN0ZXJGdW5jdGlvbkFuYWx5c2lzKCkgeworICAgIFJlc3VsdEdldHRlcnMucHVzaF9iYWNrKCZnZXRGdW5jdGlvbkFBUmVzdWx0SW1wbDxBbmFseXNpc1Q+KTsKKyAgfQorCisgIC8vLyBSZWdpc3RlciBhIHNwZWNpZmljIEFBIHJlc3VsdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFuYWx5c2lzVD4gdm9pZCByZWdpc3Rlck1vZHVsZUFuYWx5c2lzKCkgeworICAgIFJlc3VsdEdldHRlcnMucHVzaF9iYWNrKCZnZXRNb2R1bGVBQVJlc3VsdEltcGw8QW5hbHlzaXNUPik7CisgIH0KKworICBSZXN1bHQgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pIHsKKyAgICBSZXN1bHQgUihBTS5nZXRSZXN1bHQ8VGFyZ2V0TGlicmFyeUFuYWx5c2lzPihGKSk7CisgICAgZm9yIChhdXRvICZHZXR0ZXIgOiBSZXN1bHRHZXR0ZXJzKQorICAgICAgKCpHZXR0ZXIpKEYsIEFNLCBSKTsKKyAgICByZXR1cm4gUjsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48QUFNYW5hZ2VyPjsKKworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCisgIFNtYWxsVmVjdG9yPHZvaWQgKCopKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgIEFBUmVzdWx0cyAmQUFSZXN1bHRzKSwKKyAgICAgICAgICAgICAgND4gUmVzdWx0R2V0dGVyczsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQW5hbHlzaXNUPgorICBzdGF0aWMgdm9pZCBnZXRGdW5jdGlvbkFBUmVzdWx0SW1wbChGdW5jdGlvbiAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVJlc3VsdHMgJkFBUmVzdWx0cykgeworICAgIEFBUmVzdWx0cy5hZGRBQVJlc3VsdChBTS50ZW1wbGF0ZSBnZXRSZXN1bHQ8QW5hbHlzaXNUPihGKSk7CisgICAgQUFSZXN1bHRzLmFkZEFBRGVwZW5kZW5jeUlEKEFuYWx5c2lzVDo6SUQoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQW5hbHlzaXNUPgorICBzdGF0aWMgdm9pZCBnZXRNb2R1bGVBQVJlc3VsdEltcGwoRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBUmVzdWx0cyAmQUFSZXN1bHRzKSB7CisgICAgYXV0byAmTUFNUHJveHkgPSBBTS5nZXRSZXN1bHQ8TW9kdWxlQW5hbHlzaXNNYW5hZ2VyRnVuY3Rpb25Qcm94eT4oRik7CisgICAgYXV0byAmTUFNID0gTUFNUHJveHkuZ2V0TWFuYWdlcigpOworICAgIGlmIChhdXRvICpSID0gTUFNLnRlbXBsYXRlIGdldENhY2hlZFJlc3VsdDxBbmFseXNpc1Q+KCpGLmdldFBhcmVudCgpKSkgeworICAgICAgQUFSZXN1bHRzLmFkZEFBUmVzdWx0KCpSKTsKKyAgICAgIE1BTVByb3h5CisgICAgICAgICAgLnRlbXBsYXRlIHJlZ2lzdGVyT3V0ZXJBbmFseXNpc0ludmFsaWRhdGlvbjxBbmFseXNpc1QsIEFBTWFuYWdlcj4oKTsKKyAgICB9CisgIH0KK307CisKKy8vLyBBIHdyYXBwZXIgcGFzcyB0byBwcm92aWRlIHRoZSBsZWdhY3kgcGFzcyBtYW5hZ2VyIGFjY2VzcyB0byBhIHN1aXRhYmx5CisvLy8gcHJlcGFyZWQgQUFSZXN1bHRzIG9iamVjdC4KK2NsYXNzIEFBUmVzdWx0c1dyYXBwZXJQYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgIHN0ZDo6dW5pcXVlX3B0cjxBQVJlc3VsdHM+IEFBUjsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBBQVJlc3VsdHNXcmFwcGVyUGFzcygpOworCisgIEFBUmVzdWx0cyAmZ2V0QUFSZXN1bHRzKCkgeyByZXR1cm4gKkFBUjsgfQorICBjb25zdCBBQVJlc3VsdHMgJmdldEFBUmVzdWx0cygpIGNvbnN0IHsgcmV0dXJuICpBQVI7IH0KKworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCitGdW5jdGlvblBhc3MgKmNyZWF0ZUFBUmVzdWx0c1dyYXBwZXJQYXNzKCk7CisKKy8vLyBBIHdyYXBwZXIgcGFzcyBhcm91bmQgYSBjYWxsYmFjayB3aGljaCBjYW4gYmUgdXNlZCB0byBwb3B1bGF0ZSB0aGUKKy8vLyBBQVJlc3VsdHMgaW4gdGhlIEFBUmVzdWx0c1dyYXBwZXJQYXNzIGZyb20gYW4gZXh0ZXJuYWwgQUEuCisvLy8KKy8vLyBUaGUgY2FsbGJhY2sgcHJvdmlkZWQgaGVyZSB3aWxsIGJlIHVzZWQgZWFjaCB0aW1lIHdlIHByZXBhcmUgYW4gQUFSZXN1bHRzCisvLy8gb2JqZWN0LCBhbmQgd2lsbCByZWNlaXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbiB3cmFwcGVyIHBhc3MsIHRoZQorLy8vIGZ1bmN0aW9uLCBhbmQgdGhlIEFBUmVzdWx0cyBvYmplY3QgdG8gcG9wdWxhdGUuIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2hlbgorLy8vIHNldHRpbmcgdXAgYSBjdXN0b20gcGFzcyBwaXBlbGluZSB0byBpbmplY3QgYSBob29rIGludG8gdGhlIEFBIHJlc3VsdHMuCitJbW11dGFibGVQYXNzICpjcmVhdGVFeHRlcm5hbEFBV3JhcHBlclBhc3MoCisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKFBhc3MgJiwgRnVuY3Rpb24gJiwgQUFSZXN1bHRzICYpPiBDYWxsYmFjayk7CisKKy8vLyBBIGhlbHBlciBmb3IgdGhlIGxlZ2FjeSBwYXNzIG1hbmFnZXIgdG8gY3JlYXRlIGEgXGMgQUFSZXN1bHRzCisvLy8gb2JqZWN0IHBvcHVsYXRlZCB0byB0aGUgYmVzdCBvZiBvdXIgYWJpbGl0eSBmb3IgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIHdoZW4KKy8vLyBpbnNpZGUgb2YgYSBcYyBNb2R1bGVQYXNzIG9yIGEgXGMgQ2FsbEdyYXBoU0NDUGFzcy4KKy8vLworLy8vIElmIGEgXGMgTW9kdWxlUGFzcyBvciBhIFxjIENhbGxHcmFwaFNDQ1Bhc3MgY2FsbHMgXHAKKy8vLyBjcmVhdGVMZWdhY3lQTUFBUmVzdWx0cywgaXQgYWxzbyBuZWVkcyB0byBjYWxsIFxwIGFkZFVzZWRBQUFuYWx5c2VzIGluIFxwCisvLy8gZ2V0QW5hbHlzaXNVc2FnZS4KK0FBUmVzdWx0cyBjcmVhdGVMZWdhY3lQTUFBUmVzdWx0cyhQYXNzICZQLCBGdW5jdGlvbiAmRiwgQmFzaWNBQVJlc3VsdCAmQkFSKTsKKworLy8vIEEgaGVscGVyIGZvciB0aGUgbGVnYWN5IHBhc3MgbWFuYWdlciB0byBwb3B1bGF0ZSBccCBBVSB0byBhZGQgdXNlcyB0byBtYWtlCisvLy8gc3VyZSB0aGUgYW5hbHlzZXMgcmVxdWlyZWQgYnkgXHAgY3JlYXRlTGVnYWN5UE1BQVJlc3VsdHMgYXJlIGF2YWlsYWJsZS4KK3ZvaWQgZ2V0QUFSZXN1bHRzQW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0FMSUFTQU5BTFlTSVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzRXZhbHVhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXNFdmFsdWF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDJmNjMxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzRXZhbHVhdG9yLmgKQEAgLTAsMCArMSw3NCBAQAorLy89PT0tIEFsaWFzQW5hbHlzaXNFdmFsdWF0b3IuaCAtIEFsaWFzIEFuYWx5c2lzIEFjY3VyYWN5IEV2YWx1YXRvciAtLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vCisvLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSBzaW1wbGUgTl4yIGFsaWFzIGFuYWx5c2lzIGFjY3VyYWN5IGV2YWx1YXRvci4gVGhlCisvLy8gYW5hbHlzaXMgcmVzdWx0IGlzIGEgc2V0IG9mIHN0YXRpc3RpY3Mgb2YgaG93IG1hbnkgdGltZXMgdGhlIEFBCisvLy8gaW5mcmFzdHJ1Y3R1cmUgcHJvdmlkZXMgZWFjaCBraW5kIG9mIGFsaWFzIHJlc3VsdCBhbmQgbW9kL3JlZiByZXN1bHQgd2hlbgorLy8vIHF1ZXJpZWQgd2l0aCBhbGwgcGFpcnMgb2YgcG9pbnRlcnMgaW4gdGhlIGZ1bmN0aW9uLgorLy8vCisvLy8gSXQgY2FuIGJlIHVzZWQgdG8gZXZhbHVhdGUgYSBjaGFuZ2UgaW4gYW4gYWxpYXMgYW5hbHlzaXMgaW1wbGVtZW50YXRpb24sCisvLy8gYWxnb3JpdGhtLCBvciB0aGUgQUEgcGlwZWxpbmUgaW5mcmFzdHJ1Y3R1cmUgaXRzZWxmLiBJdCBhY3RzIGxpa2UgYSBzdGFibGUKKy8vLyBhbmQgZWFzaWx5IHRlc3RlZCBjb25zdW1lciBvZiBhbGwgQUEgaW5mb3JtYXRpb24gZXhwb3NlZC4KKy8vLworLy8vIFRoaXMgaXMgaW5zcGlyZWQgYW5kIGFkYXB0ZWQgZnJvbSBjb2RlIGJ5OiBOYXZlZW4gTmVlbGFrYW50YW0sIEZyYW5jZXNjbworLy8vIFNwYWRpbmksIGFuZCBXb2pjaWVjaCBTdHJ5amV3c2tpLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfQUxJQVNBTkFMWVNJU0VWQUxVQVRPUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQUxJQVNBTkFMWVNJU0VWQUxVQVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBBQVJlc3VsdHM7CisKK2NsYXNzIEFBRXZhbHVhdG9yIDogcHVibGljIFBhc3NJbmZvTWl4aW48QUFFdmFsdWF0b3I+IHsKKyAgaW50NjRfdCBGdW5jdGlvbkNvdW50OworICBpbnQ2NF90IE5vQWxpYXNDb3VudCwgTWF5QWxpYXNDb3VudCwgUGFydGlhbEFsaWFzQ291bnQsIE11c3RBbGlhc0NvdW50OworICBpbnQ2NF90IE5vTW9kUmVmQ291bnQsIE1vZENvdW50LCBSZWZDb3VudCwgTW9kUmVmQ291bnQ7CisgIGludDY0X3QgTXVzdENvdW50LCBNdXN0UmVmQ291bnQsIE11c3RNb2RDb3VudCwgTXVzdE1vZFJlZkNvdW50OworCitwdWJsaWM6CisgIEFBRXZhbHVhdG9yKCkKKyAgICAgIDogRnVuY3Rpb25Db3VudCgpLCBOb0FsaWFzQ291bnQoKSwgTWF5QWxpYXNDb3VudCgpLCBQYXJ0aWFsQWxpYXNDb3VudCgpLAorICAgICAgICBNdXN0QWxpYXNDb3VudCgpLCBOb01vZFJlZkNvdW50KCksIE1vZENvdW50KCksIFJlZkNvdW50KCksCisgICAgICAgIE1vZFJlZkNvdW50KCksIE11c3RDb3VudCgpLCBNdXN0UmVmQ291bnQoKSwgTXVzdE1vZENvdW50KCksCisgICAgICAgIE11c3RNb2RSZWZDb3VudCgpIHt9CisgIEFBRXZhbHVhdG9yKEFBRXZhbHVhdG9yICYmQXJnKQorICAgICAgOiBGdW5jdGlvbkNvdW50KEFyZy5GdW5jdGlvbkNvdW50KSwgTm9BbGlhc0NvdW50KEFyZy5Ob0FsaWFzQ291bnQpLAorICAgICAgICBNYXlBbGlhc0NvdW50KEFyZy5NYXlBbGlhc0NvdW50KSwKKyAgICAgICAgUGFydGlhbEFsaWFzQ291bnQoQXJnLlBhcnRpYWxBbGlhc0NvdW50KSwKKyAgICAgICAgTXVzdEFsaWFzQ291bnQoQXJnLk11c3RBbGlhc0NvdW50KSwgTm9Nb2RSZWZDb3VudChBcmcuTm9Nb2RSZWZDb3VudCksCisgICAgICAgIE1vZENvdW50KEFyZy5Nb2RDb3VudCksIFJlZkNvdW50KEFyZy5SZWZDb3VudCksCisgICAgICAgIE1vZFJlZkNvdW50KEFyZy5Nb2RSZWZDb3VudCksIE11c3RDb3VudChBcmcuTXVzdENvdW50KSwKKyAgICAgICAgTXVzdFJlZkNvdW50KEFyZy5NdXN0UmVmQ291bnQpLCBNdXN0TW9kQ291bnQoQXJnLk11c3RNb2RDb3VudCksCisgICAgICAgIE11c3RNb2RSZWZDb3VudChBcmcuTXVzdE1vZFJlZkNvdW50KSB7CisgICAgQXJnLkZ1bmN0aW9uQ291bnQgPSAwOworICB9CisgIH5BQUV2YWx1YXRvcigpOworCisgIC8vLyBcYnJpZWYgUnVuIHRoZSBwYXNzIG92ZXIgdGhlIGZ1bmN0aW9uLgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7CisKK3ByaXZhdGU6CisgIC8vIEFsbG93IHRoZSBsZWdhY3kgcGFzcyB0byBydW4gdGhpcyB1c2luZyBhbiBpbnRlcm5hbCBBUEkuCisgIGZyaWVuZCBjbGFzcyBBQUV2YWxMZWdhY3lQYXNzOworCisgIHZvaWQgcnVuSW50ZXJuYWwoRnVuY3Rpb24gJkYsIEFBUmVzdWx0cyAmQUEpOworfTsKKworLy8vIENyZWF0ZSBhIHdyYXBwZXIgb2YgdGhlIGFib3ZlIGZvciB0aGUgbGVnYWN5IHBhc3MgbWFuYWdlci4KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlQUFFdmFsUGFzcygpOworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9BbGlhc1NldFRyYWNrZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQWxpYXNTZXRUcmFja2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhM2ViYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQWxpYXNTZXRUcmFja2VyLmgKQEAgLTAsMCArMSw0NjggQEAKKy8vPT09LSBsbHZtL0FuYWx5c2lzL0FsaWFzU2V0VHJhY2tlci5oIC0gQnVpbGQgQWxpYXMgU2V0cyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdHdvIGNsYXNzZXM6IEFsaWFzU2V0VHJhY2tlciBhbmQgQWxpYXNTZXQuIFRoZXNlIGludGVyZmFjZXMKKy8vIGFyZSB1c2VkIHRvIGNsYXNzaWZ5IGEgY29sbGVjdGlvbiBvZiBwb2ludGVyIHJlZmVyZW5jZXMgaW50byBhIG1heGltYWwgbnVtYmVyCisvLyBvZiBkaXNqb2ludCBzZXRzLiBFYWNoIEFsaWFzU2V0IG9iamVjdCBjb25zdHJ1Y3RlZCBieSB0aGUgQWxpYXNTZXRUcmFja2VyCisvLyBvYmplY3QgcmVmZXJzIHRvIG1lbW9yeSBkaXNqb2ludCBmcm9tIHRoZSBvdGhlciBzZXRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19BTElBU1NFVFRSQUNLRVJfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0FMSUFTU0VUVFJBQ0tFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL01ldGFkYXRhLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFsaWFzU2V0VHJhY2tlcjsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBMb2FkSW5zdDsKK2NsYXNzIE1lbVNldEluc3Q7CitjbGFzcyBNZW1UcmFuc2Zlckluc3Q7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFN0b3JlSW5zdDsKK2NsYXNzIFZBQXJnSW5zdDsKK2NsYXNzIFZhbHVlOworCitjbGFzcyBBbGlhc1NldCA6IHB1YmxpYyBpbGlzdF9ub2RlPEFsaWFzU2V0PiB7CisgIGZyaWVuZCBjbGFzcyBBbGlhc1NldFRyYWNrZXI7CisKKyAgY2xhc3MgUG9pbnRlclJlYyB7CisgICAgVmFsdWUgKlZhbDsgIC8vIFRoZSBwb2ludGVyIHRoaXMgcmVjb3JkIGNvcnJlc3BvbmRzIHRvLgorICAgIFBvaW50ZXJSZWMgKipQcmV2SW5MaXN0ID0gbnVsbHB0cjsKKyAgICBQb2ludGVyUmVjICpOZXh0SW5MaXN0ID0gbnVsbHB0cjsKKyAgICBBbGlhc1NldCAqQVMgPSBudWxscHRyOworICAgIHVpbnQ2NF90IFNpemUgPSAwOworICAgIEFBTUROb2RlcyBBQUluZm87CisKKyAgcHVibGljOgorICAgIFBvaW50ZXJSZWMoVmFsdWUgKlYpCisgICAgICA6IFZhbChWKSwgQUFJbmZvKERlbnNlTWFwSW5mbzxBQU1ETm9kZXM+OjpnZXRFbXB0eUtleSgpKSB7fQorCisgICAgVmFsdWUgKmdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsOyB9CisKKyAgICBQb2ludGVyUmVjICpnZXROZXh0KCkgY29uc3QgeyByZXR1cm4gTmV4dEluTGlzdDsgfQorICAgIGJvb2wgaGFzQWxpYXNTZXQoKSBjb25zdCB7IHJldHVybiBBUyAhPSBudWxscHRyOyB9CisKKyAgICBQb2ludGVyUmVjKiogc2V0UHJldkluTGlzdChQb2ludGVyUmVjICoqUElMKSB7CisgICAgICBQcmV2SW5MaXN0ID0gUElMOworICAgICAgcmV0dXJuICZOZXh0SW5MaXN0OworICAgIH0KKworICAgIGJvb2wgdXBkYXRlU2l6ZUFuZEFBSW5mbyh1aW50NjRfdCBOZXdTaXplLCBjb25zdCBBQU1ETm9kZXMgJk5ld0FBSW5mbykgeworICAgICAgYm9vbCBTaXplQ2hhbmdlZCA9IGZhbHNlOworICAgICAgaWYgKE5ld1NpemUgPiBTaXplKSB7CisgICAgICAgIFNpemUgPSBOZXdTaXplOworICAgICAgICBTaXplQ2hhbmdlZCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGlmIChBQUluZm8gPT0gRGVuc2VNYXBJbmZvPEFBTUROb2Rlcz46OmdldEVtcHR5S2V5KCkpCisgICAgICAgIC8vIFdlIGRvbid0IGhhdmUgYSBBQUluZm8geWV0LiBTZXQgaXQgdG8gTmV3QUFJbmZvLgorICAgICAgICBBQUluZm8gPSBOZXdBQUluZm87CisgICAgICBlbHNlIHsKKyAgICAgICAgQUFNRE5vZGVzIEludGVyc2VjdGlvbihBQUluZm8uaW50ZXJzZWN0KE5ld0FBSW5mbykpOworICAgICAgICBpZiAoIUludGVyc2VjdGlvbikgeworICAgICAgICAgIC8vIE5ld0FBSW5mbyBjb25mbGljdHMgd2l0aCBBQUluZm8uCisgICAgICAgICAgQUFJbmZvID0gRGVuc2VNYXBJbmZvPEFBTUROb2Rlcz46OmdldFRvbWJzdG9uZUtleSgpOworICAgICAgICAgIHJldHVybiBTaXplQ2hhbmdlZDsKKyAgICAgICAgfQorICAgICAgICBBQUluZm8gPSBJbnRlcnNlY3Rpb247CisgICAgICB9CisgICAgICByZXR1cm4gU2l6ZUNoYW5nZWQ7CisgICAgfQorCisgICAgdWludDY0X3QgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKworICAgIC8vLyBSZXR1cm4gdGhlIEFBSW5mbywgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBpbmZvcm1hdGlvbiBvciBjb25mbGljdGluZworICAgIC8vLyBpbmZvcm1hdGlvbi4KKyAgICBBQU1ETm9kZXMgZ2V0QUFJbmZvKCkgY29uc3QgeworICAgICAgLy8gSWYgd2UgaGF2ZSBtaXNzaW5nIG9yIGNvbmZsaWN0aW5nIEFBSW5mbywgcmV0dXJuIG51bGwuCisgICAgICBpZiAoQUFJbmZvID09IERlbnNlTWFwSW5mbzxBQU1ETm9kZXM+OjpnZXRFbXB0eUtleSgpIHx8CisgICAgICAgICAgQUFJbmZvID09IERlbnNlTWFwSW5mbzxBQU1ETm9kZXM+OjpnZXRUb21ic3RvbmVLZXkoKSkKKyAgICAgICAgcmV0dXJuIEFBTUROb2RlcygpOworICAgICAgcmV0dXJuIEFBSW5mbzsKKyAgICB9CisKKyAgICBBbGlhc1NldCAqZ2V0QWxpYXNTZXQoQWxpYXNTZXRUcmFja2VyICZBU1QpIHsKKyAgICAgIGFzc2VydChBUyAmJiAiTm8gQWxpYXNTZXQgeWV0ISIpOworICAgICAgaWYgKEFTLT5Gb3J3YXJkKSB7CisgICAgICAgIEFsaWFzU2V0ICpPbGRBUyA9IEFTOworICAgICAgICBBUyA9IE9sZEFTLT5nZXRGb3J3YXJkZWRUYXJnZXQoQVNUKTsKKyAgICAgICAgQVMtPmFkZFJlZigpOworICAgICAgICBPbGRBUy0+ZHJvcFJlZihBU1QpOworICAgICAgfQorICAgICAgcmV0dXJuIEFTOworICAgIH0KKworICAgIHZvaWQgc2V0QWxpYXNTZXQoQWxpYXNTZXQgKmFzKSB7CisgICAgICBhc3NlcnQoIUFTICYmICJBbHJlYWR5IGhhdmUgYW4gYWxpYXMgc2V0ISIpOworICAgICAgQVMgPSBhczsKKyAgICB9CisKKyAgICB2b2lkIGVyYXNlRnJvbUxpc3QoKSB7CisgICAgICBpZiAoTmV4dEluTGlzdCkgTmV4dEluTGlzdC0+UHJldkluTGlzdCA9IFByZXZJbkxpc3Q7CisgICAgICAqUHJldkluTGlzdCA9IE5leHRJbkxpc3Q7CisgICAgICBpZiAoQVMtPlB0ckxpc3RFbmQgPT0gJk5leHRJbkxpc3QpIHsKKyAgICAgICAgQVMtPlB0ckxpc3RFbmQgPSBQcmV2SW5MaXN0OworICAgICAgICBhc3NlcnQoKkFTLT5QdHJMaXN0RW5kID09IG51bGxwdHIgJiYgIkxpc3Qgbm90IHRlcm1pbmF0ZWQgcmlnaHQhIik7CisgICAgICB9CisgICAgICBkZWxldGUgdGhpczsKKyAgICB9CisgIH07CisKKyAgLy8gRG91Ymx5IGxpbmtlZCBsaXN0IG9mIG5vZGVzLgorICBQb2ludGVyUmVjICpQdHJMaXN0ID0gbnVsbHB0cjsKKyAgUG9pbnRlclJlYyAqKlB0ckxpc3RFbmQ7CisgIC8vIEZvcndhcmRpbmcgcG9pbnRlci4KKyAgQWxpYXNTZXQgKkZvcndhcmQgPSBudWxscHRyOworCisgIC8vLyBBbGwgaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgYSBzcGVjaWZpYyBhZGRyZXNzIGluIHRoaXMgYWxpYXMgc2V0LgorICAvLy8gSW4gcmFyZSBjYXNlcyB0aGlzIHZlY3RvciBjYW4gaGF2ZSBhIG51bGwnZWQgb3V0IFdlYWtWSAorICAvLy8gaW5zdGFuY2VzIChjYW4gaGFwcGVuIGlmIHNvbWUgb3RoZXIgbG9vcCBwYXNzIGRlbGV0ZXMgYW4KKyAgLy8vIGluc3RydWN0aW9uIGluIHRoaXMgbGlzdCkuCisgIHN0ZDo6dmVjdG9yPFdlYWtWSD4gVW5rbm93bkluc3RzOworCisgIC8vLyBOdW1iZXIgb2Ygbm9kZXMgcG9pbnRpbmcgdG8gdGhpcyBBbGlhc1NldCBwbHVzIHRoZSBudW1iZXIgb2YgQWxpYXNTZXRzCisgIC8vLyBmb3J3YXJkaW5nIHRvIGl0LgorICB1bnNpZ25lZCBSZWZDb3VudCA6IDI3OworCisgIC8vIFNpZ25pZmllcyB0aGF0IHRoaXMgc2V0IHNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGFsaWFzIGFueSBwb2ludGVyLgorICAvLyBVc2Ugd2hlbiB0aGUgdHJhY2tlciBob2xkaW5nIHRoaXMgc2V0IGlzIHNhdHVyYXRlZC4KKyAgdW5zaWduZWQgQWxpYXNBbnkgOiAxOworCisgIC8vLyBUaGUga2luZHMgb2YgYWNjZXNzIHRoaXMgYWxpYXMgc2V0IG1vZGVscy4KKyAgLy8vCisgIC8vLyBXZSBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhpcyBhbGlhcyBzZXQgbWVyZWx5IHJlZmVycyB0byB0aGUgbG9jYXRpb25zIG9mCisgIC8vLyBtZW1vcnkgKGFuZCBub3QgYW55IHBhcnRpY3VsYXIgYWNjZXNzKSwgd2hldGhlciBpdCBtb2RpZmllcyBvciByZWZlcmVuY2VzCisgIC8vLyB0aGUgbWVtb3J5LCBvciB3aGV0aGVyIGl0IGRvZXMgYm90aC4gVGhlIGxhdHRpY2UgZ29lcyBmcm9tICJOb0FjY2VzcyIgdG8KKyAgLy8vIGVpdGhlciBSZWZBY2Nlc3Mgb3IgTW9kQWNjZXNzLCB0aGVuIHRvIE1vZFJlZkFjY2VzcyBhcyBuZWNlc3NhcnkuCisgIGVudW0gQWNjZXNzTGF0dGljZSB7CisgICAgTm9BY2Nlc3MgPSAwLAorICAgIFJlZkFjY2VzcyA9IDEsCisgICAgTW9kQWNjZXNzID0gMiwKKyAgICBNb2RSZWZBY2Nlc3MgPSBSZWZBY2Nlc3MgfCBNb2RBY2Nlc3MKKyAgfTsKKyAgdW5zaWduZWQgQWNjZXNzIDogMjsKKworICAvLy8gVGhlIGtpbmQgb2YgYWxpYXMgcmVsYXRpb25zaGlwIGJldHdlZW4gcG9pbnRlcnMgb2YgdGhlIHNldC4KKyAgLy8vCisgIC8vLyBUaGVzZSByZXByZXNlbnQgY29uc2VydmF0aXZlbHkgY29ycmVjdCBhbGlhcyByZXN1bHRzIGJldHdlZW4gYW55IG1lbWJlcnMKKyAgLy8vIG9mIHRoZSBzZXQuIFdlIHJlcHJlc2VudCB0aGVzZSBpbmRlcGVuZGVudGx5IG9mIHRoZSB2YWx1ZXMgb2YgYWxpYXMKKyAgLy8vIHJlc3VsdHMgaW4gb3JkZXIgdG8gcGFjayBpdCBpbnRvIGEgc2luZ2xlIGJpdC4gTGF0dGljZSBnb2VzIGZyb20KKyAgLy8vIE11c3RBbGlhcyB0byBNYXlBbGlhcy4KKyAgZW51bSBBbGlhc0xhdHRpY2UgeworICAgIFNldE11c3RBbGlhcyA9IDAsIFNldE1heUFsaWFzID0gMQorICB9OworICB1bnNpZ25lZCBBbGlhcyA6IDE7CisKKyAgLy8vIFRydWUgaWYgdGhpcyBhbGlhcyBzZXQgY29udGFpbnMgdm9sYXRpbGUgbG9hZHMgb3Igc3RvcmVzLgorICB1bnNpZ25lZCBWb2xhdGlsZSA6IDE7CisKKyAgdW5zaWduZWQgU2V0U2l6ZSA9IDA7CisKKyAgdm9pZCBhZGRSZWYoKSB7ICsrUmVmQ291bnQ7IH0KKworICB2b2lkIGRyb3BSZWYoQWxpYXNTZXRUcmFja2VyICZBU1QpIHsKKyAgICBhc3NlcnQoUmVmQ291bnQgPj0gMSAmJiAiSW52YWxpZCByZWZlcmVuY2UgY291bnQgZGV0ZWN0ZWQhIik7CisgICAgaWYgKC0tUmVmQ291bnQgPT0gMCkKKyAgICAgIHJlbW92ZUZyb21UcmFja2VyKEFTVCk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqZ2V0VW5rbm93bkluc3QodW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgVW5rbm93bkluc3RzLnNpemUoKSk7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxJbnN0cnVjdGlvbj4oVW5rbm93bkluc3RzW2ldKTsKKyAgfQorCitwdWJsaWM6CisgIEFsaWFzU2V0KGNvbnN0IEFsaWFzU2V0ICYpID0gZGVsZXRlOworICBBbGlhc1NldCAmb3BlcmF0b3I9KGNvbnN0IEFsaWFzU2V0ICYpID0gZGVsZXRlOworCisgIC8vLyBBY2Nlc3NvcnMuLi4KKyAgYm9vbCBpc1JlZigpIGNvbnN0IHsgcmV0dXJuIEFjY2VzcyAmIFJlZkFjY2VzczsgfQorICBib29sIGlzTW9kKCkgY29uc3QgeyByZXR1cm4gQWNjZXNzICYgTW9kQWNjZXNzOyB9CisgIGJvb2wgaXNNdXN0QWxpYXMoKSBjb25zdCB7IHJldHVybiBBbGlhcyA9PSBTZXRNdXN0QWxpYXM7IH0KKyAgYm9vbCBpc01heUFsaWFzKCkgIGNvbnN0IHsgcmV0dXJuIEFsaWFzID09IFNldE1heUFsaWFzOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYWxpYXMgc2V0IGNvbnRhaW5zIHZvbGF0aWxlIGxvYWRzIG9yIHN0b3Jlcy4KKyAgYm9vbCBpc1ZvbGF0aWxlKCkgY29uc3QgeyByZXR1cm4gVm9sYXRpbGU7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBhbGlhcyBzZXQgc2hvdWxkIGJlIGlnbm9yZWQgYXMgcGFydCBvZiB0aGUKKyAgLy8vIEFsaWFzU2V0VHJhY2tlciBvYmplY3QuCisgIGJvb2wgaXNGb3J3YXJkaW5nQWxpYXNTZXQoKSBjb25zdCB7IHJldHVybiBGb3J3YXJkOyB9CisKKyAgLy8vIE1lcmdlIHRoZSBzcGVjaWZpZWQgYWxpYXMgc2V0IGludG8gdGhpcyBhbGlhcyBzZXQuCisgIHZvaWQgbWVyZ2VTZXRJbihBbGlhc1NldCAmQVMsIEFsaWFzU2V0VHJhY2tlciAmQVNUKTsKKworICAvLyBBbGlhcyBTZXQgaXRlcmF0aW9uIC0gQWxsb3cgYWNjZXNzIHRvIGFsbCBvZiB0aGUgcG9pbnRlcnMgd2hpY2ggYXJlIHBhcnQgb2YKKyAgLy8gdGhpcyBhbGlhcyBzZXQuCisgIGNsYXNzIGl0ZXJhdG9yOworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKFB0ckxpc3QpOyB9CisgIGl0ZXJhdG9yIGVuZCgpICAgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gUHRyTGlzdCA9PSBudWxscHRyOyB9CisKKyAgLy8gVW5mb3J0dW5hdGVseSwgaWxpc3Q6OnNpemUoKSBpcyBsaW5lYXIsIHNvIHdlIGhhdmUgdG8gYWRkIGNvZGUgdG8ga2VlcAorICAvLyB0cmFjayBvZiB0aGUgbGlzdCdzIGV4YWN0IHNpemUuCisgIHVuc2lnbmVkIHNpemUoKSB7IHJldHVybiBTZXRTaXplOyB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLy8gRGVmaW5lIGFuIGl0ZXJhdG9yIGZvciBhbGlhcyBzZXRzLi4uIHRoaXMgaXMganVzdCBhIGZvcndhcmQgaXRlcmF0b3IuCisgIGNsYXNzIGl0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyUmVjLCBwdHJkaWZmX3Q+IHsKKyAgICBQb2ludGVyUmVjICpDdXJOb2RlOworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBpdGVyYXRvcihQb2ludGVyUmVjICpDTiA9IG51bGxwdHIpIDogQ3VyTm9kZShDTikge30KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeworICAgICAgcmV0dXJuIEN1ck5vZGUgPT0geC5DdXJOb2RlOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KHgpOyB9CisKKyAgICB2YWx1ZV90eXBlICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgICBhc3NlcnQoQ3VyTm9kZSAmJiAiRGVyZWZlcmVuY2luZyBBbGlhc1NldC5lbmQoKSEiKTsKKyAgICAgIHJldHVybiAqQ3VyTm9kZTsKKyAgICB9CisgICAgdmFsdWVfdHlwZSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZvcGVyYXRvciooKTsgfQorCisgICAgVmFsdWUgKmdldFBvaW50ZXIoKSBjb25zdCB7IHJldHVybiBDdXJOb2RlLT5nZXRWYWx1ZSgpOyB9CisgICAgdWludDY0X3QgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEN1ck5vZGUtPmdldFNpemUoKTsgfQorICAgIEFBTUROb2RlcyBnZXRBQUluZm8oKSBjb25zdCB7IHJldHVybiBDdXJOb2RlLT5nZXRBQUluZm8oKTsgfQorCisgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7ICAgICAgICAgICAgICAgIC8vIFByZWluY3JlbWVudAorICAgICAgYXNzZXJ0KEN1ck5vZGUgJiYgIkFkdmFuY2luZyBwYXN0IEFsaWFzU2V0LmVuZCgpISIpOworICAgICAgQ3VyTm9kZSA9IEN1ck5vZGUtPmdldE5leHQoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgLy8gUG9zdGluY3JlbWVudAorICAgICAgaXRlcmF0b3IgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgICAgfQorICB9OworCitwcml2YXRlOgorICAvLyBDYW4gb25seSBiZSBjcmVhdGVkIGJ5IEFsaWFzU2V0VHJhY2tlci4KKyAgQWxpYXNTZXQoKQorICAgICAgOiBQdHJMaXN0RW5kKCZQdHJMaXN0KSwgUmVmQ291bnQoMCksICBBbGlhc0FueShmYWxzZSksIEFjY2VzcyhOb0FjY2VzcyksCisgICAgICAgIEFsaWFzKFNldE11c3RBbGlhcyksIFZvbGF0aWxlKGZhbHNlKSB7fQorCisgIFBvaW50ZXJSZWMgKmdldFNvbWVQb2ludGVyKCkgY29uc3QgeworICAgIHJldHVybiBQdHJMaXN0OworICB9CisKKyAgLy8vIFJldHVybiB0aGUgcmVhbCBhbGlhcyBzZXQgdGhpcyByZXByZXNlbnRzLiBJZiB0aGlzIGhhcyBiZWVuIG1lcmdlZCB3aXRoCisgIC8vLyBhbm90aGVyIHNldCBhbmQgaXMgZm9yd2FyZGluZywgcmV0dXJuIHRoZSB1bHRpbWF0ZSBkZXN0aW5hdGlvbiBzZXQuIFRoaXMKKyAgLy8vIGFsc28gaW1wbGVtZW50cyB0aGUgdW5pb24tZmluZCBjb2xsYXBzaW5nIGFzIHdlbGwuCisgIEFsaWFzU2V0ICpnZXRGb3J3YXJkZWRUYXJnZXQoQWxpYXNTZXRUcmFja2VyICZBU1QpIHsKKyAgICBpZiAoIUZvcndhcmQpIHJldHVybiB0aGlzOworCisgICAgQWxpYXNTZXQgKkRlc3QgPSBGb3J3YXJkLT5nZXRGb3J3YXJkZWRUYXJnZXQoQVNUKTsKKyAgICBpZiAoRGVzdCAhPSBGb3J3YXJkKSB7CisgICAgICBEZXN0LT5hZGRSZWYoKTsKKyAgICAgIEZvcndhcmQtPmRyb3BSZWYoQVNUKTsKKyAgICAgIEZvcndhcmQgPSBEZXN0OworICAgIH0KKyAgICByZXR1cm4gRGVzdDsKKyAgfQorCisgIHZvaWQgcmVtb3ZlRnJvbVRyYWNrZXIoQWxpYXNTZXRUcmFja2VyICZBU1QpOworCisgIHZvaWQgYWRkUG9pbnRlcihBbGlhc1NldFRyYWNrZXIgJkFTVCwgUG9pbnRlclJlYyAmRW50cnksIHVpbnQ2NF90IFNpemUsCisgICAgICAgICAgICAgICAgICBjb25zdCBBQU1ETm9kZXMgJkFBSW5mbywKKyAgICAgICAgICAgICAgICAgIGJvb2wgS25vd25NdXN0QWxpYXMgPSBmYWxzZSk7CisgIHZvaWQgYWRkVW5rbm93bkluc3QoSW5zdHJ1Y3Rpb24gKkksIEFsaWFzQW5hbHlzaXMgJkFBKTsKKworICB2b2lkIHJlbW92ZVVua25vd25JbnN0KEFsaWFzU2V0VHJhY2tlciAmQVNULCBJbnN0cnVjdGlvbiAqSSkgeworICAgIGJvb2wgV2FzRW1wdHkgPSBVbmtub3duSW5zdHMuZW1wdHkoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IFVua25vd25JbnN0cy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKFVua25vd25JbnN0c1tpXSA9PSBJKSB7CisgICAgICAgIFVua25vd25JbnN0c1tpXSA9IFVua25vd25JbnN0cy5iYWNrKCk7CisgICAgICAgIFVua25vd25JbnN0cy5wb3BfYmFjaygpOworICAgICAgICAtLWk7IC0tZTsgIC8vIFJldmlzaXQgdGhlIG1vdmVkIGVudHJ5LgorICAgICAgfQorICAgIGlmICghV2FzRW1wdHkgJiYgVW5rbm93bkluc3RzLmVtcHR5KCkpCisgICAgICBkcm9wUmVmKEFTVCk7CisgIH0KKworICB2b2lkIHNldFZvbGF0aWxlKCkgeyBWb2xhdGlsZSA9IHRydWU7IH0KKworcHVibGljOgorICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBwb2ludGVyICJtYXkiIChvciBtdXN0KSBhbGlhcyBvbmUgb2YgdGhlCisgIC8vLyBtZW1iZXJzIGluIHRoZSBzZXQuCisgIGJvb2wgYWxpYXNlc1BvaW50ZXIoY29uc3QgVmFsdWUgKlB0ciwgdWludDY0X3QgU2l6ZSwgY29uc3QgQUFNRE5vZGVzICZBQUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgQWxpYXNBbmFseXNpcyAmQUEpIGNvbnN0OworICBib29sIGFsaWFzZXNVbmtub3duSW5zdChjb25zdCBJbnN0cnVjdGlvbiAqSW5zdCwgQWxpYXNBbmFseXNpcyAmQUEpIGNvbnN0OworfTsKKworaW5saW5lIHJhd19vc3RyZWFtJiBvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgQWxpYXNTZXQgJkFTKSB7CisgIEFTLnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCitjbGFzcyBBbGlhc1NldFRyYWNrZXIgeworICAvLy8gQSBDYWxsYmFja1ZIIHRvIGFycmFuZ2UgZm9yIEFsaWFzU2V0VHJhY2tlciB0byBiZSBub3RpZmllZCB3aGVuZXZlciBhCisgIC8vLyBWYWx1ZSBpcyBkZWxldGVkLgorICBjbGFzcyBBU1RDYWxsYmFja1ZIIGZpbmFsIDogcHVibGljIENhbGxiYWNrVkggeworICAgIEFsaWFzU2V0VHJhY2tlciAqQVNUOworCisgICAgdm9pZCBkZWxldGVkKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBhbGxVc2VzUmVwbGFjZWRXaXRoKFZhbHVlICopIG92ZXJyaWRlOworCisgIHB1YmxpYzoKKyAgICBBU1RDYWxsYmFja1ZIKFZhbHVlICpWLCBBbGlhc1NldFRyYWNrZXIgKkFTVCA9IG51bGxwdHIpOworCisgICAgQVNUQ2FsbGJhY2tWSCAmb3BlcmF0b3I9KFZhbHVlICpWKTsKKyAgfTsKKyAgLy8vIFRyYWl0cyB0byB0ZWxsIERlbnNlTWFwIHRoYXQgdGVsbCB1cyBob3cgdG8gY29tcGFyZSBhbmQgaGFzaCB0aGUgdmFsdWUKKyAgLy8vIGhhbmRsZS4KKyAgc3RydWN0IEFTVENhbGxiYWNrVkhEZW5zZU1hcEluZm8gOiBwdWJsaWMgRGVuc2VNYXBJbmZvPFZhbHVlICo+IHt9OworCisgIEFsaWFzQW5hbHlzaXMgJkFBOworICBpbGlzdDxBbGlhc1NldD4gQWxpYXNTZXRzOworCisgIHVzaW5nIFBvaW50ZXJNYXBUeXBlID0gRGVuc2VNYXA8QVNUQ2FsbGJhY2tWSCwgQWxpYXNTZXQ6OlBvaW50ZXJSZWMgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RDYWxsYmFja1ZIRGVuc2VNYXBJbmZvPjsKKworICAvLyBNYXAgZnJvbSBwb2ludGVycyB0byB0aGVpciBub2RlCisgIFBvaW50ZXJNYXBUeXBlIFBvaW50ZXJNYXA7CisKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZSBhbiBlbXB0eSBjb2xsZWN0aW9uIG9mIEFsaWFzU2V0cywgYW5kIHVzZSB0aGUgc3BlY2lmaWVkIGFsaWFzCisgIC8vLyBhbmFseXNpcyBvYmplY3QgdG8gZGlzYW1iaWd1YXRlIGxvYWQgYW5kIHN0b3JlIGFkZHJlc3Nlcy4KKyAgZXhwbGljaXQgQWxpYXNTZXRUcmFja2VyKEFsaWFzQW5hbHlzaXMgJmFhKSA6IEFBKGFhKSB7fQorICB+QWxpYXNTZXRUcmFja2VyKCkgeyBjbGVhcigpOyB9CisKKyAgLy8vIFRoZXNlIG1ldGhvZHMgYXJlIHVzZWQgdG8gYWRkIGRpZmZlcmVudCB0eXBlcyBvZiBpbnN0cnVjdGlvbnMgdG8gdGhlIGFsaWFzCisgIC8vLyBzZXRzLiBBZGRpbmcgYSBuZXcgaW5zdHJ1Y3Rpb24gY2FuIHJlc3VsdCBpbiBvbmUgb2YgdGhyZWUgYWN0aW9ucworICAvLy8gaGFwcGVuaW5nOgorICAvLy8KKyAgLy8vICAgMS4gSWYgdGhlIGluc3RydWN0aW9uIGRvZXNuJ3QgYWxpYXMgYW55IG90aGVyIHNldHMsIGNyZWF0ZSBhIG5ldyBzZXQuCisgIC8vLyAgIDIuIElmIHRoZSBpbnN0cnVjdGlvbiBhbGlhc2VzIGV4YWN0bHkgb25lIHNldCwgYWRkIGl0IHRvIHRoZSBzZXQKKyAgLy8vICAgMy4gSWYgdGhlIGluc3RydWN0aW9uIGFsaWFzZXMgbXVsdGlwbGUgc2V0cywgbWVyZ2UgdGhlIHNldHMsIGFuZCBhZGQKKyAgLy8vICAgICAgdGhlIGluc3RydWN0aW9uIHRvIHRoZSByZXN1bHQuCisgIC8vLworICAvLy8gVGhlc2UgbWV0aG9kcyByZXR1cm4gdHJ1ZSBpZiBpbnNlcnRpbmcgdGhlIGluc3RydWN0aW9uIHJlc3VsdGVkIGluIHRoZQorICAvLy8gYWRkaXRpb24gb2YgYSBuZXcgYWxpYXMgc2V0IChpLmUuLCB0aGUgcG9pbnRlciBkaWQgbm90IGFsaWFzIGFueXRoaW5nKS4KKyAgLy8vCisgIHZvaWQgYWRkKFZhbHVlICpQdHIsIHVpbnQ2NF90IFNpemUsIGNvbnN0IEFBTUROb2RlcyAmQUFJbmZvKTsgLy8gQWRkIGEgbG9jLgorICB2b2lkIGFkZChMb2FkSW5zdCAqTEkpOworICB2b2lkIGFkZChTdG9yZUluc3QgKlNJKTsKKyAgdm9pZCBhZGQoVkFBcmdJbnN0ICpWQUFJKTsKKyAgdm9pZCBhZGQoTWVtU2V0SW5zdCAqTVNJKTsKKyAgdm9pZCBhZGQoTWVtVHJhbnNmZXJJbnN0ICpNVEkpOworICB2b2lkIGFkZChJbnN0cnVjdGlvbiAqSSk7ICAgICAgIC8vIERpc3BhdGNoIHRvIG9uZSBvZiB0aGUgb3RoZXIgYWRkIG1ldGhvZHMuLi4KKyAgdm9pZCBhZGQoQmFzaWNCbG9jayAmQkIpOyAgICAgICAvLyBBZGQgYWxsIGluc3RydWN0aW9ucyBpbiBiYXNpYyBibG9jaworICB2b2lkIGFkZChjb25zdCBBbGlhc1NldFRyYWNrZXIgJkFTVCk7IC8vIEFkZCBhbGlhcyByZWxhdGlvbnMgZnJvbSBhbm90aGVyIEFTVAorICB2b2lkIGFkZFVua25vd24oSW5zdHJ1Y3Rpb24gKkkpOworCisgIHZvaWQgY2xlYXIoKTsKKworICAvLy8gUmV0dXJuIHRoZSBhbGlhcyBzZXRzIHRoYXQgYXJlIGFjdGl2ZS4KKyAgY29uc3QgaWxpc3Q8QWxpYXNTZXQ+ICZnZXRBbGlhc1NldHMoKSBjb25zdCB7IHJldHVybiBBbGlhc1NldHM7IH0KKworICAvLy8gUmV0dXJuIHRoZSBhbGlhcyBzZXQgdGhhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgbGl2ZXMgaW4uIElmIHRoZSBOZXcKKyAgLy8vIGFyZ3VtZW50IGlzIG5vbi1udWxsLCB0aGlzIG1ldGhvZCBzZXRzIHRoZSB2YWx1ZSB0byB0cnVlIGlmIGEgbmV3IGFsaWFzCisgIC8vLyBzZXQgaXMgY3JlYXRlZCB0byBjb250YWluIHRoZSBwb2ludGVyIChiZWNhdXNlIHRoZSBwb2ludGVyIGRpZG4ndCBhbGlhcworICAvLy8gYW55dGhpbmcpLgorICBBbGlhc1NldCAmZ2V0QWxpYXNTZXRGb3JQb2ludGVyKFZhbHVlICpQLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBTUROb2RlcyAmQUFJbmZvKTsKKworICAvLy8gUmV0dXJuIHRoZSBhbGlhcyBzZXQgY29udGFpbmluZyB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGlmIG9uZSBleGlzdHMsCisgIC8vLyBvdGhlcndpc2UgcmV0dXJuIG51bGwuCisgIEFsaWFzU2V0ICpnZXRBbGlhc1NldEZvclBvaW50ZXJJZkV4aXN0cyhjb25zdCBWYWx1ZSAqUCwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBTUROb2RlcyAmQUFJbmZvKSB7CisgICAgcmV0dXJuIG1lcmdlQWxpYXNTZXRzRm9yUG9pbnRlcihQLCBTaXplLCBBQUluZm8pOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gIm1heSIgKG9yIG11c3QpIGFsaWFzIG9uZSBvZiB0aGUKKyAgLy8vIG1lbWJlcnMgaW4gYW55IG9mIHRoZSBzZXRzLgorICBib29sIGNvbnRhaW5zVW5rbm93bihjb25zdCBJbnN0cnVjdGlvbiAqSSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgdW5kZXJseWluZyBhbGlhcyBhbmFseXNpcyBvYmplY3QgdXNlZCBieSB0aGlzIHRyYWNrZXIuCisgIEFsaWFzQW5hbHlzaXMgJmdldEFsaWFzQW5hbHlzaXMoKSBjb25zdCB7IHJldHVybiBBQTsgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJlbW92ZSBhIHBvaW50ZXIgdmFsdWUgZnJvbSB0aGUgQWxpYXNTZXRUcmFja2VyCisgIC8vLyBlbnRpcmVseS4gSXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBhbiBpbnN0cnVjdGlvbiBpcyBkZWxldGVkIGZyb20gdGhlCisgIC8vLyBwcm9ncmFtIHRvIHVwZGF0ZSB0aGUgQVNULiBJZiB5b3UgZG9uJ3QgdXNlIHRoaXMsIHlvdSB3b3VsZCBoYXZlIGRhbmdsaW5nCisgIC8vLyBwb2ludGVycyB0byBkZWxldGVkIGluc3RydWN0aW9ucy4KKyAgdm9pZCBkZWxldGVWYWx1ZShWYWx1ZSAqUHRyVmFsKTsKKworICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgd2hlbmV2ZXIgYSBwcmVleGlzdGluZyB2YWx1ZSBpbiB0aGUgcHJvZ3JhbSBpcworICAvLy8gY29waWVkIG9yIGNsb25lZCwgaW50cm9kdWNpbmcgYSBuZXcgdmFsdWUuICBOb3RlIHRoYXQgaXQgaXMgb2sgZm9yIGNsaWVudHMKKyAgLy8vIHRoYXQgdXNlIHRoaXMgbWV0aG9kIHRvIGludHJvZHVjZSB0aGUgc2FtZSB2YWx1ZSBtdWx0aXBsZSB0aW1lczogaWYgdGhlCisgIC8vLyB0cmFja2VyIGFscmVhZHkga25vd3MgYWJvdXQgYSB2YWx1ZSwgaXQgd2lsbCBpZ25vcmUgdGhlIHJlcXVlc3QuCisgIHZvaWQgY29weVZhbHVlKFZhbHVlICpGcm9tLCBWYWx1ZSAqVG8pOworCisgIHVzaW5nIGl0ZXJhdG9yID0gaWxpc3Q8QWxpYXNTZXQ+OjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBpbGlzdDxBbGlhc1NldD46OmNvbnN0X2l0ZXJhdG9yOworCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gQWxpYXNTZXRzLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICBjb25zdCB7IHJldHVybiBBbGlhc1NldHMuZW5kKCk7IH0KKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIEFsaWFzU2V0cy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpICAgeyByZXR1cm4gQWxpYXNTZXRzLmVuZCgpOyB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEFsaWFzU2V0OworCisgIC8vIFRoZSB0b3RhbCBudW1iZXIgb2YgcG9pbnRlcnMgY29udGFpbmVkIGluIGFsbCAibWF5IiBhbGlhcyBzZXRzLgorICB1bnNpZ25lZCBUb3RhbE1heUFsaWFzU2V0U2l6ZSA9IDA7CisKKyAgLy8gQSBub24tbnVsbCB2YWx1ZSBzaWduaWZpZXMgdGhpcyBBU1QgaXMgc2F0dXJhdGVkLiBBIHNhdHVyYXRlZCBBU1QgbHVtcHMKKyAgLy8gYWxsIHBvaW50ZXJzIGludG8gYSBzaW5nbGUgIk1heSIgc2V0LgorICBBbGlhc1NldCAqQWxpYXNBbnlBUyA9IG51bGxwdHI7CisKKyAgdm9pZCByZW1vdmVBbGlhc1NldChBbGlhc1NldCAqQVMpOworCisgIC8vLyBKdXN0IGxpa2Ugb3BlcmF0b3JbXSBvbiB0aGUgbWFwLCBleGNlcHQgdGhhdCBpdCBjcmVhdGVzIGFuIGVudHJ5IGZvciB0aGUKKyAgLy8vIHBvaW50ZXIgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgorICBBbGlhc1NldDo6UG9pbnRlclJlYyAmZ2V0RW50cnlGb3IoVmFsdWUgKlYpIHsKKyAgICBBbGlhc1NldDo6UG9pbnRlclJlYyAqJkVudHJ5ID0gUG9pbnRlck1hcFtBU1RDYWxsYmFja1ZIKFYsIHRoaXMpXTsKKyAgICBpZiAoIUVudHJ5KQorICAgICAgRW50cnkgPSBuZXcgQWxpYXNTZXQ6OlBvaW50ZXJSZWMoVik7CisgICAgcmV0dXJuICpFbnRyeTsKKyAgfQorCisgIEFsaWFzU2V0ICZhZGRQb2ludGVyKFZhbHVlICpQLCB1aW50NjRfdCBTaXplLCBjb25zdCBBQU1ETm9kZXMgJkFBSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNTZXQ6OkFjY2Vzc0xhdHRpY2UgRSk7CisgIEFsaWFzU2V0ICptZXJnZUFsaWFzU2V0c0ZvclBvaW50ZXIoY29uc3QgVmFsdWUgKlB0ciwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQU1ETm9kZXMgJkFBSW5mbyk7CisKKyAgLy8vIE1lcmdlIGFsbCBhbGlhcyBzZXRzIGludG8gYSBzaW5nbGUgc2V0IHRoYXQgaXMgY29uc2lkZXJlZCB0byBhbGlhcyBhbnkKKyAgLy8vIHBvaW50ZXIuCisgIEFsaWFzU2V0ICZtZXJnZUFsbEFsaWFzU2V0cygpOworCisgIEFsaWFzU2V0ICpmaW5kQWxpYXNTZXRGb3JVbmtub3duSW5zdChJbnN0cnVjdGlvbiAqSW5zdCk7Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0mIG9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBBbGlhc1NldFRyYWNrZXIgJkFTVCkgeworICBBU1QucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0FMSUFTU0VUVFJBQ0tFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0Fzc3VtcHRpb25DYWNoZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Bc3N1bXB0aW9uQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTY1ZTYyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Bc3N1bXB0aW9uQ2FjaGUuaApAQCAtMCwwICsxLDIzMiBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvQXNzdW1wdGlvbkNhY2hlLmggLSBUcmFjayBAbGx2bS5hc3N1bWUgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgYSBwYXNzIHRoYXQga2VlcHMgdHJhY2sgb2YgQGxsdm0uYXNzdW1lIGludHJpbnNpY3MgaW4KKy8vIHRoZSBmdW5jdGlvbnMgb2YgYSBtb2R1bGUgKGFsbG93aW5nIGFzc3VtcHRpb25zIHdpdGhpbiBhbnkgZnVuY3Rpb24gdG8gYmUKKy8vIGZvdW5kIGNoZWFwbHkgYnkgb3RoZXIgcGFydHMgb2YgdGhlIG9wdGltaXplcikuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0FTU1VNUFRJT05DQUNIRV9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQVNTVU1QVElPTkNBQ0hFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIENhbGxJbnN0OworY2xhc3MgRnVuY3Rpb247CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFZhbHVlOworCisvLy8gXGJyaWVmIEEgY2FjaGUgb2YgQGxsdm0uYXNzdW1lIGNhbGxzIHdpdGhpbiBhIGZ1bmN0aW9uLgorLy8vCisvLy8gVGhpcyBjYWNoZSBwcm92aWRlcyBmYXN0IGxvb2t1cCBvZiBhc3N1bXB0aW9ucyB3aXRoaW4gYSBmdW5jdGlvbiBieSBjYWNoaW5nCisvLy8gdGhlbSBhbmQgYW1vcnRpemluZyB0aGUgY29zdCBvZiBzY2FubmluZyBmb3IgdGhlbSBhY3Jvc3MgYWxsIHF1ZXJpZXMuIFBhc3NlcworLy8vIHRoYXQgY3JlYXRlIG5ldyBhc3N1bXB0aW9ucyBhcmUgcmVxdWlyZWQgdG8gY2FsbCByZWdpc3RlckFzc3VtcHRpb24oKSB0bworLy8vIHJlZ2lzdGVyIGFueSBuZXcgQGxsdm0uYXNzdW1lIGNhbGxzIHRoYXQgdGhleSBjcmVhdGUuIERlbGV0aW9ucyBvZgorLy8vIEBsbHZtLmFzc3VtZSBjYWxscyBkbyBub3QgcmVxdWlyZSBzcGVjaWFsIGhhbmRsaW5nLgorY2xhc3MgQXNzdW1wdGlvbkNhY2hlIHsKKyAgLy8vIFxicmllZiBUaGUgZnVuY3Rpb24gZm9yIHdoaWNoIHRoaXMgY2FjaGUgaXMgaGFuZGxpbmcgYXNzdW1wdGlvbnMuCisgIC8vLworICAvLy8gV2UgdHJhY2sgdGhpcyB0byBsYXppbHkgcG9wdWxhdGUgb3VyIGFzc3VtcHRpb25zLgorICBGdW5jdGlvbiAmRjsKKworICAvLy8gXGJyaWVmIFZlY3RvciBvZiB3ZWFrIHZhbHVlIGhhbmRsZXMgdG8gY2FsbHMgb2YgdGhlIEBsbHZtLmFzc3VtZQorICAvLy8gaW50cmluc2ljLgorICBTbWFsbFZlY3RvcjxXZWFrVHJhY2tpbmdWSCwgND4gQXNzdW1lSGFuZGxlczsKKworICBjbGFzcyBBZmZlY3RlZFZhbHVlQ2FsbGJhY2tWSCBmaW5hbCA6IHB1YmxpYyBDYWxsYmFja1ZIIHsKKyAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDOworCisgICAgdm9pZCBkZWxldGVkKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBhbGxVc2VzUmVwbGFjZWRXaXRoKFZhbHVlICopIG92ZXJyaWRlOworCisgIHB1YmxpYzoKKyAgICB1c2luZyBETUkgPSBEZW5zZU1hcEluZm88VmFsdWUgKj47CisKKyAgICBBZmZlY3RlZFZhbHVlQ2FsbGJhY2tWSChWYWx1ZSAqViwgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHIpCisgICAgICAgIDogQ2FsbGJhY2tWSChWKSwgQUMoQUMpIHt9CisgIH07CisKKyAgZnJpZW5kIEFmZmVjdGVkVmFsdWVDYWxsYmFja1ZIOworCisgIC8vLyBcYnJpZWYgQSBtYXAgb2YgdmFsdWVzIGFib3V0IHdoaWNoIGFuIGFzc3VtcHRpb24gbWlnaHQgYmUgcHJvdmlkaW5nCisgIC8vLyBpbmZvcm1hdGlvbiB0byB0aGUgcmVsZXZhbnQgc2V0IG9mIGFzc3VtcHRpb25zLgorICB1c2luZyBBZmZlY3RlZFZhbHVlc01hcCA9CisgICAgICBEZW5zZU1hcDxBZmZlY3RlZFZhbHVlQ2FsbGJhY2tWSCwgU21hbGxWZWN0b3I8V2Vha1RyYWNraW5nVkgsIDE+LAorICAgICAgICAgICAgICAgQWZmZWN0ZWRWYWx1ZUNhbGxiYWNrVkg6OkRNST47CisgIEFmZmVjdGVkVmFsdWVzTWFwIEFmZmVjdGVkVmFsdWVzOworCisgIC8vLyBHZXQgdGhlIHZlY3RvciBvZiBhc3N1bXB0aW9ucyB3aGljaCBhZmZlY3QgYSB2YWx1ZSBmcm9tIHRoZSBjYWNoZS4KKyAgU21hbGxWZWN0b3I8V2Vha1RyYWNraW5nVkgsIDE+ICZnZXRPckluc2VydEFmZmVjdGVkVmFsdWVzKFZhbHVlICpWKTsKKworICAvLy8gQ29weSBhZmZlY3RlZCB2YWx1ZXMgaW4gdGhlIGNhY2hlIGZvciBPViB0byBiZSBhZmZlY3RlZCB2YWx1ZXMgZm9yIE5WLgorICB2b2lkIGNvcHlBZmZlY3RlZFZhbHVlc0luQ2FjaGUoVmFsdWUgKk9WLCBWYWx1ZSAqTlYpOworCisgIC8vLyBcYnJpZWYgRmxhZyB0cmFja2luZyB3aGV0aGVyIHdlIGhhdmUgc2Nhbm5lZCB0aGUgZnVuY3Rpb24geWV0LgorICAvLy8KKyAgLy8vIFdlIHdhbnQgdG8gYmUgYXMgbGF6eSBhYm91dCB0aGlzIGFzIHBvc3NpYmxlLCBhbmQgc28gd2Ugc2NhbiB0aGUgZnVuY3Rpb24KKyAgLy8vIGF0IHRoZSBsYXN0IG1vbWVudC4KKyAgYm9vbCBTY2FubmVkID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBTY2FuIHRoZSBmdW5jdGlvbiBmb3IgYXNzdW1wdGlvbnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBjYWNoZS4KKyAgdm9pZCBzY2FuRnVuY3Rpb24oKTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBBc3N1bXB0aW9uQ2FjaGUgZnJvbSBhIGZ1bmN0aW9uIGJ5IHNjYW5uaW5nIGFsbCBvZgorICAvLy8gaXRzIGluc3RydWN0aW9ucy4KKyAgQXNzdW1wdGlvbkNhY2hlKEZ1bmN0aW9uICZGKSA6IEYoRikge30KKworICAvLy8gVGhpcyBjYWNoZSBpcyBkZXNpZ25lZCB0byBiZSBzZWxmLXVwZGF0aW5nIGFuZCBzbyBpdCBzaG91bGQgbmV2ZXIgYmUKKyAgLy8vIGludmFsaWRhdGVkLgorICBib29sIGludmFsaWRhdGUoRnVuY3Rpb24gJiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJiwKKyAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBBZGQgYW4gQGxsdm0uYXNzdW1lIGludHJpbnNpYyB0byB0aGlzIGZ1bmN0aW9uJ3MgY2FjaGUuCisgIC8vLworICAvLy8gVGhlIGNhbGwgcGFzc2VkIGluIG11c3QgYmUgYW4gaW5zdHJ1Y3Rpb24gd2l0aGluIHRoaXMgZnVuY3Rpb24gYW5kIG11c3QKKyAgLy8vIG5vdCBhbHJlYWR5IGJlIGluIHRoZSBjYWNoZS4KKyAgdm9pZCByZWdpc3RlckFzc3VtcHRpb24oQ2FsbEluc3QgKkNJKTsKKworICAvLy8gXGJyaWVmIFVwZGF0ZSB0aGUgY2FjaGUgb2YgdmFsdWVzIGJlaW5nIGFmZmVjdGVkIGJ5IHRoaXMgYXNzdW1wdGlvbiAoaS5lLgorICAvLy8gdGhlIHZhbHVlcyBhYm91dCB3aGljaCB0aGlzIGFzc3VtcHRpb24gcHJvdmlkZXMgaW5mb3JtYXRpb24pLgorICB2b2lkIHVwZGF0ZUFmZmVjdGVkVmFsdWVzKENhbGxJbnN0ICpDSSk7CisKKyAgLy8vIFxicmllZiBDbGVhciB0aGUgY2FjaGUgb2YgQGxsdm0uYXNzdW1lIGludHJpbnNpY3MgZm9yIGEgZnVuY3Rpb24uCisgIC8vLworICAvLy8gSXQgd2lsbCBiZSByZS1zY2FubmVkIHRoZSBuZXh0IHRpbWUgaXQgaXMgcmVxdWVzdGVkLgorICB2b2lkIGNsZWFyKCkgeworICAgIEFzc3VtZUhhbmRsZXMuY2xlYXIoKTsKKyAgICBBZmZlY3RlZFZhbHVlcy5jbGVhcigpOworICAgIFNjYW5uZWQgPSBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWNjZXNzIHRoZSBsaXN0IG9mIGFzc3VtcHRpb24gaGFuZGxlcyBjdXJyZW50bHkgdHJhY2tlZCBmb3IgdGhpcworICAvLy8gZnVuY3Rpb24uCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoZXNlIHByb2R1Y2Ugd2VhayBoYW5kbGVzIHRoYXQgbWF5IGJlIG51bGwuIFRoZSBjYWxsZXIgbXVzdAorICAvLy8gaGFuZGxlIHRoYXQgY2FzZS4KKyAgLy8vIEZJWE1FOiBXZSBzaG91bGQgcmVwbGFjZSB0aGlzIHdpdGggcG9pbnRlZV9pdGVyYXRvcjxmaWx0ZXJfaXRlcmF0b3I8Li4uPj4KKyAgLy8vIHdoZW4gd2UgY2FuIHdyaXRlIHRoYXQgdG8gZmlsdGVyIG91dCB0aGUgbnVsbCB2YWx1ZXMuIFRoZW4gY2FsbGVyIGNvZGUKKyAgLy8vIHdpbGwgYmVjb21lIHNpbXBsZXIuCisgIE11dGFibGVBcnJheVJlZjxXZWFrVHJhY2tpbmdWSD4gYXNzdW1wdGlvbnMoKSB7CisgICAgaWYgKCFTY2FubmVkKQorICAgICAgc2NhbkZ1bmN0aW9uKCk7CisgICAgcmV0dXJuIEFzc3VtZUhhbmRsZXM7CisgIH0KKworICAvLy8gXGJyaWVmIEFjY2VzcyB0aGUgbGlzdCBvZiBhc3N1bXB0aW9ucyB3aGljaCBhZmZlY3QgdGhpcyB2YWx1ZS4KKyAgTXV0YWJsZUFycmF5UmVmPFdlYWtUcmFja2luZ1ZIPiBhc3N1bXB0aW9uc0Zvcihjb25zdCBWYWx1ZSAqVikgeworICAgIGlmICghU2Nhbm5lZCkKKyAgICAgIHNjYW5GdW5jdGlvbigpOworCisgICAgYXV0byBBVkkgPSBBZmZlY3RlZFZhbHVlcy5maW5kX2FzKGNvbnN0X2Nhc3Q8VmFsdWUgKj4oVikpOworICAgIGlmIChBVkkgPT0gQWZmZWN0ZWRWYWx1ZXMuZW5kKCkpCisgICAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPFdlYWtUcmFja2luZ1ZIPigpOworCisgICAgcmV0dXJuIEFWSS0+c2Vjb25kOworICB9Cit9OworCisvLy8gXGJyaWVmIEEgZnVuY3Rpb24gYW5hbHlzaXMgd2hpY2ggcHJvdmlkZXMgYW4gXGMgQXNzdW1wdGlvbkNhY2hlLgorLy8vCisvLy8gVGhpcyBhbmFseXNpcyBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggdGhlIG5ldyBwYXNzIG1hbmFnZXIgYW5kIHdpbGwgdmVuZAorLy8vIGFzc3VtcHRpb24gY2FjaGVzIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgorY2xhc3MgQXNzdW1wdGlvbkFuYWx5c2lzIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPEFzc3VtcHRpb25BbmFseXNpcz4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48QXNzdW1wdGlvbkFuYWx5c2lzPjsKKworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIHVzaW5nIFJlc3VsdCA9IEFzc3VtcHRpb25DYWNoZTsKKworICBBc3N1bXB0aW9uQ2FjaGUgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmKSB7CisgICAgcmV0dXJuIEFzc3VtcHRpb25DYWNoZShGKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBQcmludGVyIHBhc3MgZm9yIHRoZSBcYyBBc3N1bXB0aW9uQW5hbHlzaXMgcmVzdWx0cy4KK2NsYXNzIEFzc3VtcHRpb25QcmludGVyUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPEFzc3VtcHRpb25QcmludGVyUGFzcz4geworICByYXdfb3N0cmVhbSAmT1M7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgQXNzdW1wdGlvblByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPUykgOiBPUyhPUykge30KKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIEFuIGltbXV0YWJsZSBwYXNzIHRoYXQgdHJhY2tzIGxhemlseSBjcmVhdGVkIFxjIEFzc3VtcHRpb25DYWNoZQorLy8vIG9iamVjdHMuCisvLy8KKy8vLyBUaGlzIGlzIGVzc2VudGlhbGx5IGEgd29ya2Fyb3VuZCBmb3IgdGhlIGxlZ2FjeSBwYXNzIG1hbmFnZXIncyB3ZWFrbmVzc2VzCisvLy8gd2hpY2ggYXNzb2NpYXRlcyBlYWNoIGFzc3VtcHRpb24gY2FjaGUgd2l0aCBGdW5jdGlvbiBhbmQgY2xlYXJzIGl0IGlmIHRoZQorLy8vIGZ1bmN0aW9uIGlzIGRlbGV0ZWQuIFRoZSBuYXR1cmUgb2YgdGhlIEFzc3VtcHRpb25DYWNoZSBpcyB0aGF0IGl0IGlzIG5vdAorLy8vIGludmFsaWRhdGVkIGJ5IGFueSBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5IGFuZCBzbyB0aGlzIGlzIHN1ZmZpY2llbnQKKy8vLyB0byBiZSBjb25zZXJ2YXRpdmVseSBjb3JyZWN0LgorY2xhc3MgQXNzdW1wdGlvbkNhY2hlVHJhY2tlciA6IHB1YmxpYyBJbW11dGFibGVQYXNzIHsKKyAgLy8vIEEgY2FsbGJhY2sgdmFsdWUgaGFuZGxlIGFwcGxpZWQgdG8gZnVuY3Rpb24gb2JqZWN0cywgd2hpY2ggd2UgdXNlIHRvCisgIC8vLyBkZWxldGUgb3VyIGNhY2hlIG9mIGludHJpbnNpY3MgZm9yIGEgZnVuY3Rpb24gd2hlbiBpdCBpcyBkZWxldGVkLgorICBjbGFzcyBGdW5jdGlvbkNhbGxiYWNrVkggZmluYWwgOiBwdWJsaWMgQ2FsbGJhY2tWSCB7CisgICAgQXNzdW1wdGlvbkNhY2hlVHJhY2tlciAqQUNUOworCisgICAgdm9pZCBkZWxldGVkKCkgb3ZlcnJpZGU7CisKKyAgcHVibGljOgorICAgIHVzaW5nIERNSSA9IERlbnNlTWFwSW5mbzxWYWx1ZSAqPjsKKworICAgIEZ1bmN0aW9uQ2FsbGJhY2tWSChWYWx1ZSAqViwgQXNzdW1wdGlvbkNhY2hlVHJhY2tlciAqQUNUID0gbnVsbHB0cikKKyAgICAgICAgOiBDYWxsYmFja1ZIKFYpLCBBQ1QoQUNUKSB7fQorICB9OworCisgIGZyaWVuZCBGdW5jdGlvbkNhbGxiYWNrVkg7CisKKyAgdXNpbmcgRnVuY3Rpb25DYWxsc01hcCA9CisgICAgICBEZW5zZU1hcDxGdW5jdGlvbkNhbGxiYWNrVkgsIHN0ZDo6dW5pcXVlX3B0cjxBc3N1bXB0aW9uQ2FjaGU+LAorICAgICAgICAgICAgICAgRnVuY3Rpb25DYWxsYmFja1ZIOjpETUk+OworCisgIEZ1bmN0aW9uQ2FsbHNNYXAgQXNzdW1wdGlvbkNhY2hlczsKKworcHVibGljOgorICAvLy8gXGJyaWVmIEdldCB0aGUgY2FjaGVkIGFzc3VtcHRpb25zIGZvciBhIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIElmIG5vIGFzc3VtcHRpb25zIGFyZSBjYWNoZWQsIHRoaXMgd2lsbCBzY2FuIHRoZSBmdW5jdGlvbi4gT3RoZXJ3aXNlLCB0aGUKKyAgLy8vIGV4aXN0aW5nIGNhY2hlIHdpbGwgYmUgcmV0dXJuZWQuCisgIEFzc3VtcHRpb25DYWNoZSAmZ2V0QXNzdW1wdGlvbkNhY2hlKEZ1bmN0aW9uICZGKTsKKworICBBc3N1bXB0aW9uQ2FjaGVUcmFja2VyKCk7CisgIH5Bc3N1bXB0aW9uQ2FjaGVUcmFja2VyKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGUgeworICAgIHZlcmlmeUFuYWx5c2lzKCk7CisgICAgQXNzdW1wdGlvbkNhY2hlcy5zaHJpbmtfYW5kX2NsZWFyKCk7CisgIH0KKworICB2b2lkIHZlcmlmeUFuYWx5c2lzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBkb0ZpbmFsaXphdGlvbihNb2R1bGUgJikgb3ZlcnJpZGUgeworICAgIHZlcmlmeUFuYWx5c2lzKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0FTU1VNUFRJT05DQUNIRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0Jhc2ljQWxpYXNBbmFseXNpcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9CYXNpY0FsaWFzQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmU1ZTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9CYXNpY0FsaWFzQW5hbHlzaXMuaApAQCAtMCwwICsxLDI3MCBAQAorLy89PT0tIEJhc2ljQWxpYXNBbmFseXNpcy5oIC0gU3RhdGVsZXNzLCBsb2NhbCBBbGlhcyBBbmFseXNpcyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgTExWTSdzIHByaW1hcnkgc3RhdGVsZXNzIGFuZCBsb2NhbCBhbGlhcyBhbmFseXNpcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0JBU0lDQUxJQVNBTkFMWVNJU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQkFTSUNBTElBU0FOQUxZU0lTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Bc3N1bXB0aW9uQ2FjaGUuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL01lbW9yeUxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitzdHJ1Y3QgQUFNRE5vZGVzOworY2xhc3MgQVBJbnQ7CitjbGFzcyBBc3N1bXB0aW9uQ2FjaGU7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEdFUE9wZXJhdG9yOworY2xhc3MgTG9vcEluZm87CitjbGFzcyBQSElOb2RlOworY2xhc3MgU2VsZWN0SW5zdDsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworY2xhc3MgVmFsdWU7CisKKy8vLyBUaGlzIGlzIHRoZSBBQSByZXN1bHQgb2JqZWN0IGZvciB0aGUgYmFzaWMsIGxvY2FsLCBhbmQgc3RhdGVsZXNzIGFsaWFzCisvLy8gYW5hbHlzaXMuIEl0IGltcGxlbWVudHMgdGhlIEFBIHF1ZXJ5IGludGVyZmFjZSBpbiBhbiBlbnRpcmVseSBzdGF0ZWxlc3MKKy8vLyBtYW5uZXIuIEFzIG9uZSBjb25zZXF1ZW5jZSwgaXQgaXMgbmV2ZXIgaW52YWxpZGF0ZWQgZHVlIHRvIElSIGNoYW5nZXMuCisvLy8gV2hpbGUgaXQgZG9lcyByZXRhaW4gc29tZSBzdG9yYWdlLCB0aGF0IGlzIHVzZWQgYXMgYW4gb3B0aW1pemF0aW9uIGFuZCBub3QKKy8vLyB0byBwcmVzZXJ2ZSBpbmZvcm1hdGlvbiBmcm9tIHF1ZXJ5IHRvIHF1ZXJ5LiBIb3dldmVyIGl0IGRvZXMgcmV0YWluIGhhbmRsZXMKKy8vLyB0byB2YXJpb3VzIG90aGVyIGFuYWx5c2VzIGFuZCBtdXN0IGJlIHJlY29tcHV0ZWQgd2hlbiB0aG9zZSBhbmFseXNlcyBhcmUuCitjbGFzcyBCYXNpY0FBUmVzdWx0IDogcHVibGljIEFBUmVzdWx0QmFzZTxCYXNpY0FBUmVzdWx0PiB7CisgIGZyaWVuZCBBQVJlc3VsdEJhc2U8QmFzaWNBQVJlc3VsdD47CisKKyAgY29uc3QgRGF0YUxheW91dCAmREw7CisgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICZUTEk7CisgIEFzc3VtcHRpb25DYWNoZSAmQUM7CisgIERvbWluYXRvclRyZWUgKkRUOworICBMb29wSW5mbyAqTEk7CisKK3B1YmxpYzoKKyAgQmFzaWNBQVJlc3VsdChjb25zdCBEYXRhTGF5b3V0ICZETCwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJlRMSSwKKyAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgJkFDLCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgTG9vcEluZm8gKkxJID0gbnVsbHB0cikKKyAgICAgIDogQUFSZXN1bHRCYXNlKCksIERMKERMKSwgVExJKFRMSSksIEFDKEFDKSwgRFQoRFQpLCBMSShMSSkge30KKworICBCYXNpY0FBUmVzdWx0KGNvbnN0IEJhc2ljQUFSZXN1bHQgJkFyZykKKyAgICAgIDogQUFSZXN1bHRCYXNlKEFyZyksIERMKEFyZy5ETCksIFRMSShBcmcuVExJKSwgQUMoQXJnLkFDKSwgRFQoQXJnLkRUKSwKKyAgICAgICAgTEkoQXJnLkxJKSB7fQorICBCYXNpY0FBUmVzdWx0KEJhc2ljQUFSZXN1bHQgJiZBcmcpCisgICAgICA6IEFBUmVzdWx0QmFzZShzdGQ6Om1vdmUoQXJnKSksIERMKEFyZy5ETCksIFRMSShBcmcuVExJKSwgQUMoQXJnLkFDKSwKKyAgICAgICAgRFQoQXJnLkRUKSwgTEkoQXJnLkxJKSB7fQorCisgIC8vLyBIYW5kbGUgaW52YWxpZGF0aW9uIGV2ZW50cyBpbiB0aGUgbmV3IHBhc3MgbWFuYWdlci4KKyAgYm9vbCBpbnZhbGlkYXRlKEZ1bmN0aW9uICZGLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmUEEsCisgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJkludik7CisKKyAgQWxpYXNSZXN1bHQgYWxpYXMoY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0EsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NCKTsKKworICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MpOworCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUzEsIEltbXV0YWJsZUNhbGxTaXRlIENTMik7CisKKyAgLy8vIENoYXNlcyBwb2ludGVycyB1bnRpbCB3ZSBmaW5kIGEgKGNvbnN0YW50IGdsb2JhbCkgb3Igbm90LgorICBib29sIHBvaW50c1RvQ29uc3RhbnRNZW1vcnkoY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYywgYm9vbCBPckxvY2FsKTsKKworICAvLy8gR2V0IHRoZSBsb2NhdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBwb2ludGVyIGFyZ3VtZW50IG9mIGEgY2FsbHNpdGUuCisgIE1vZFJlZkluZm8gZ2V0QXJnTW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUywgdW5zaWduZWQgQXJnSWR4KTsKKworICAvLy8gUmV0dXJucyB0aGUgYmVoYXZpb3Igd2hlbiBjYWxsaW5nIHRoZSBnaXZlbiBjYWxsIHNpdGUuCisgIEZ1bmN0aW9uTW9kUmVmQmVoYXZpb3IgZ2V0TW9kUmVmQmVoYXZpb3IoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MpOworCisgIC8vLyBSZXR1cm5zIHRoZSBiZWhhdmlvciB3aGVuIGNhbGxpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uLiBGb3IgdXNlIHdoZW4gdGhlCisgIC8vLyBjYWxsIHNpdGUgaXMgbm90IGtub3duLgorICBGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIGdldE1vZFJlZkJlaGF2aW9yKGNvbnN0IEZ1bmN0aW9uICpGKTsKKworcHJpdmF0ZToKKyAgLy8gQSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gb2YgYSBWYWx1ZTsgdGhpcyBjbGFzcyByZXByZXNlbnRzIFpFeHQoU0V4dChWLAorICAvLyBTRXh0Qml0cyksIFpFeHRCaXRzKSAqIFNjYWxlICsgT2Zmc2V0LgorICBzdHJ1Y3QgVmFyaWFibGVHRVBJbmRleCB7CisgICAgLy8gQW4gb3BhcXVlIFZhbHVlIC0gd2UgY2FuJ3QgZGVjb21wb3NlIHRoaXMgZnVydGhlci4KKyAgICBjb25zdCBWYWx1ZSAqVjsKKworICAgIC8vIFdlIG5lZWQgdG8gdHJhY2sgd2hhdCBleHRlbnNpb25zIHdlJ3ZlIGRvbmUgYXMgd2UgY29uc2lkZXIgdGhlIHNhbWUgVmFsdWUKKyAgICAvLyB3aXRoIGRpZmZlcmVudCBleHRlbnNpb25zIGFzIGRpZmZlcmVudCB2YXJpYWJsZXMgaW4gYSBHRVAncyBsaW5lYXIKKyAgICAvLyBleHByZXNzaW9uOworICAgIC8vIGUuZy46IGlmIFYgPT0gLTEsIHRoZW4gc2V4dCh4KSAhPSB6ZXh0KHgpLgorICAgIHVuc2lnbmVkIFpFeHRCaXRzOworICAgIHVuc2lnbmVkIFNFeHRCaXRzOworCisgICAgaW50NjRfdCBTY2FsZTsKKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWYXJpYWJsZUdFUEluZGV4ICZPdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIFYgPT0gT3RoZXIuViAmJiBaRXh0Qml0cyA9PSBPdGhlci5aRXh0Qml0cyAmJgorICAgICAgICAgICAgIFNFeHRCaXRzID09IE90aGVyLlNFeHRCaXRzICYmIFNjYWxlID09IE90aGVyLlNjYWxlOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBWYXJpYWJsZUdFUEluZGV4ICZPdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KE90aGVyKTsKKyAgICB9CisgIH07CisKKyAgLy8gUmVwcmVzZW50cyB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mIGEgR0VQLCBkZWNvbXBvc2VkIGludG8gYSBiYXNlIHBvaW50ZXIsCisgIC8vIGNvbnN0YW50IG9mZnNldHMsIGFuZCB2YXJpYWJsZSBzY2FsZWQgaW5kaWNlcy4KKyAgc3RydWN0IERlY29tcG9zZWRHRVAgeworICAgIC8vIEJhc2UgcG9pbnRlciBvZiB0aGUgR0VQCisgICAgY29uc3QgVmFsdWUgKkJhc2U7CisgICAgLy8gVG90YWwgY29uc3RhbnQgb2Zmc2V0IHcuci50IHRoZSBiYXNlIGZyb20gaW5kZXhpbmcgaW50byBzdHJ1Y3RzCisgICAgaW50NjRfdCBTdHJ1Y3RPZmZzZXQ7CisgICAgLy8gVG90YWwgY29uc3RhbnQgb2Zmc2V0IHcuci50IHRoZSBiYXNlIGZyb20gaW5kZXhpbmcgdGhyb3VnaAorICAgIC8vIHBvaW50ZXJzL2FycmF5cy92ZWN0b3JzCisgICAgaW50NjRfdCBPdGhlck9mZnNldDsKKyAgICAvLyBTY2FsZWQgdmFyaWFibGUgKG5vbi1jb25zdGFudCkgaW5kaWNlcy4KKyAgICBTbWFsbFZlY3RvcjxWYXJpYWJsZUdFUEluZGV4LCA0PiBWYXJJbmRpY2VzOworICB9OworCisgIC8vLyBUcmFjayBhbGlhcyBxdWVyaWVzIHRvIGd1YXJkIGFnYWluc3QgcmVjdXJzaW9uLgorICB1c2luZyBMb2NQYWlyID0gc3RkOjpwYWlyPE1lbW9yeUxvY2F0aW9uLCBNZW1vcnlMb2NhdGlvbj47CisgIHVzaW5nIEFsaWFzQ2FjaGVUeSA9IFNtYWxsRGVuc2VNYXA8TG9jUGFpciwgQWxpYXNSZXN1bHQsIDg+OworICBBbGlhc0NhY2hlVHkgQWxpYXNDYWNoZTsKKworICAvLy8gVHJhY2tzIHBoaSBub2RlcyB3ZSBoYXZlIHZpc2l0ZWQuCisgIC8vLworICAvLy8gV2hlbiBpbnRlcnByZXQgIlZhbHVlIiBwb2ludGVyIGVxdWFsaXR5IGFzIHZhbHVlIGVxdWFsaXR5IHdlIG5lZWQgdG8gbWFrZQorICAvLy8gc3VyZSB0aGF0IHRoZSAiVmFsdWUiIGlzIG5vdCBwYXJ0IG9mIGEgY3ljbGUuIE90aGVyd2lzZSwgdHdvIHVzZXMgY291bGQKKyAgLy8vIGNvbWUgZnJvbSBkaWZmZXJlbnQgIml0ZXJhdGlvbnMiIG9mIGEgY3ljbGUgYW5kIHNlZSBkaWZmZXJlbnQgdmFsdWVzIGZvcgorICAvLy8gdGhlIHNhbWUgIlZhbHVlIiBwb2ludGVyLgorICAvLy8KKyAgLy8vIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB0aGUgcHJvYmxlbToKKyAgLy8vICAgJXAgPSBwaGkoJWFsbG9jYTEsICVhZGRyMikKKyAgLy8vICAgJWwgPSBsb2FkICVwdHIKKyAgLy8vICAgJWFkZHIxID0gZ2VwLCAlYWxsb2NhMiwgMCwgJWwKKyAgLy8vICAgJWFkZHIyID0gZ2VwICAlYWxsb2NhMiwgMCwgKCVsICsgMSkKKyAgLy8vICAgICAgYWxpYXMoJXAsICVhZGRyMSkgLT4gTWF5QWxpYXMgIQorICAvLy8gICBzdG9yZSAlbCwgLi4uCisgIFNtYWxsUHRyU2V0PGNvbnN0IEJhc2ljQmxvY2sgKiwgOD4gVmlzaXRlZFBoaUJCczsKKworICAvLy8gVHJhY2tzIGluc3RydWN0aW9ucyB2aXNpdGVkIGJ5IHBvaW50c1RvQ29uc3RhbnRNZW1vcnkuCisgIFNtYWxsUHRyU2V0PGNvbnN0IFZhbHVlICosIDE2PiBWaXNpdGVkOworCisgIHN0YXRpYyBjb25zdCBWYWx1ZSAqCisgIEdldExpbmVhckV4cHJlc3Npb24oY29uc3QgVmFsdWUgKlYsIEFQSW50ICZTY2FsZSwgQVBJbnQgJk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmWkV4dEJpdHMsIHVuc2lnbmVkICZTRXh0Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCwgdW5zaWduZWQgRGVwdGgsIEFzc3VtcHRpb25DYWNoZSAqQUMsCisgICAgICAgICAgICAgICAgICAgICAgRG9taW5hdG9yVHJlZSAqRFQsIGJvb2wgJk5TVywgYm9vbCAmTlVXKTsKKworICBzdGF0aWMgYm9vbCBEZWNvbXBvc2VHRVBFeHByZXNzaW9uKGNvbnN0IFZhbHVlICpWLCBEZWNvbXBvc2VkR0VQICZEZWNvbXBvc2VkLAorICAgICAgY29uc3QgRGF0YUxheW91dCAmREwsIEFzc3VtcHRpb25DYWNoZSAqQUMsIERvbWluYXRvclRyZWUgKkRUKTsKKworICBzdGF0aWMgYm9vbCBpc0dFUEJhc2VBdE5lZ2F0aXZlT2Zmc2V0KGNvbnN0IEdFUE9wZXJhdG9yICpHRVBPcCwKKyAgICAgIGNvbnN0IERlY29tcG9zZWRHRVAgJkRlY29tcEdFUCwgY29uc3QgRGVjb21wb3NlZEdFUCAmRGVjb21wT2JqZWN0LAorICAgICAgdWludDY0X3QgT2JqZWN0QWNjZXNzU2l6ZSk7CisKKyAgLy8vIFxicmllZiBBIEhldXJpc3RpYyBmb3IgYWxpYXNHRVAgdGhhdCBzZWFyY2hlcyBmb3IgYSBjb25zdGFudCBvZmZzZXQKKyAgLy8vIGJldHdlZW4gdGhlIHZhcmlhYmxlcy4KKyAgLy8vCisgIC8vLyBHZXRMaW5lYXJFeHByZXNzaW9uIGhhcyBzb21lIGxpbWl0YXRpb25zLCBhcyBnZW5lcmFsbHkgemV4dCgleCArIDEpCisgIC8vLyAhPSB6ZXh0KCV4KSArIHpleHQoMSkgaWYgdGhlIGFyaXRobWV0aWMgb3ZlcmZsb3dzLiBHZXRMaW5lYXJFeHByZXNzaW9uCisgIC8vLyB3aWxsIHRoZXJlZm9yZSBjb25zZXJ2YXRpdmVseSByZWZ1c2UgdG8gZGVjb21wb3NlIHRoZXNlIGV4cHJlc3Npb25zLgorICAvLy8gSG93ZXZlciwgd2Uga25vdyB0aGF0LCBmb3IgYWxsICV4LCB6ZXh0KCV4KSAhPSB6ZXh0KCV4ICsgMSksIGV2ZW4gaWYKKyAgLy8vIHRoZSBhZGRpdGlvbiBvdmVyZmxvd3MuCisgIGJvb2wKKyAgY29uc3RhbnRPZmZzZXRIZXVyaXN0aWMoY29uc3QgU21hbGxWZWN0b3JJbXBsPFZhcmlhYmxlR0VQSW5kZXg+ICZWYXJJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBWMVNpemUsIHVpbnQ2NF90IFYyU2l6ZSwgaW50NjRfdCBCYXNlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDLCBEb21pbmF0b3JUcmVlICpEVCk7CisKKyAgYm9vbCBpc1ZhbHVlRXF1YWxJblBvdGVudGlhbEN5Y2xlcyhjb25zdCBWYWx1ZSAqVjEsIGNvbnN0IFZhbHVlICpWMik7CisKKyAgdm9pZCBHZXRJbmRleERpZmZlcmVuY2UoU21hbGxWZWN0b3JJbXBsPFZhcmlhYmxlR0VQSW5kZXg+ICZEZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8VmFyaWFibGVHRVBJbmRleD4gJlNyYyk7CisKKyAgQWxpYXNSZXN1bHQgYWxpYXNHRVAoY29uc3QgR0VQT3BlcmF0b3IgKlYxLCB1aW50NjRfdCBWMVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBTUROb2RlcyAmVjFBQUluZm8sIGNvbnN0IFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVjJTaXplLCBjb25zdCBBQU1ETm9kZXMgJlYyQUFJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqVW5kZXJseWluZ1YxLCBjb25zdCBWYWx1ZSAqVW5kZXJseWluZ1YyKTsKKworICBBbGlhc1Jlc3VsdCBhbGlhc1BISShjb25zdCBQSElOb2RlICpQTiwgdWludDY0X3QgUE5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQU1ETm9kZXMgJlBOQUFJbmZvLCBjb25zdCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFYyU2l6ZSwgY29uc3QgQUFNRE5vZGVzICZWMkFBSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlVuZGVyVjIpOworCisgIEFsaWFzUmVzdWx0IGFsaWFzU2VsZWN0KGNvbnN0IFNlbGVjdEluc3QgKlNJLCB1aW50NjRfdCBTSVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBTUROb2RlcyAmU0lBQUluZm8sIGNvbnN0IFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVjJTaXplLCBjb25zdCBBQU1ETm9kZXMgJlYyQUFJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqVW5kZXJWMik7CisKKyAgQWxpYXNSZXN1bHQgYWxpYXNDaGVjayhjb25zdCBWYWx1ZSAqVjEsIHVpbnQ2NF90IFYxU2l6ZSwgQUFNRE5vZGVzIFYxQUFUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlYyLCB1aW50NjRfdCBWMlNpemUsIEFBTUROb2RlcyBWMkFBVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpPMSA9IG51bGxwdHIsIGNvbnN0IFZhbHVlICpPMiA9IG51bGxwdHIpOworfTsKKworLy8vIEFuYWx5c2lzIHBhc3MgcHJvdmlkaW5nIGEgbmV2ZXItaW52YWxpZGF0ZWQgYWxpYXMgYW5hbHlzaXMgcmVzdWx0LgorY2xhc3MgQmFzaWNBQSA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjxCYXNpY0FBPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxCYXNpY0FBPjsKKworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIHVzaW5nIFJlc3VsdCA9IEJhc2ljQUFSZXN1bHQ7CisKKyAgQmFzaWNBQVJlc3VsdCBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gTGVnYWN5IHdyYXBwZXIgcGFzcyB0byBwcm92aWRlIHRoZSBCYXNpY0FBUmVzdWx0IG9iamVjdC4KK2NsYXNzIEJhc2ljQUFXcmFwcGVyUGFzcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICBzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNBQVJlc3VsdD4gUmVzdWx0OworCisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBCYXNpY0FBV3JhcHBlclBhc3MoKTsKKworICBCYXNpY0FBUmVzdWx0ICZnZXRSZXN1bHQoKSB7IHJldHVybiAqUmVzdWx0OyB9CisgIGNvbnN0IEJhc2ljQUFSZXN1bHQgJmdldFJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuICpSZXN1bHQ7IH0KKworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworfTsKKworRnVuY3Rpb25QYXNzICpjcmVhdGVCYXNpY0FBV3JhcHBlclBhc3MoKTsKKworLy8vIEEgaGVscGVyIGZvciB0aGUgbGVnYWN5IHBhc3MgbWFuYWdlciB0byBjcmVhdGUgYSBcYyBCYXNpY0FBUmVzdWx0IG9iamVjdAorLy8vIHBvcHVsYXRlZCB0byB0aGUgYmVzdCBvZiBvdXIgYWJpbGl0eSBmb3IgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIHdoZW4gaW5zaWRlCisvLy8gb2YgYSBcYyBNb2R1bGVQYXNzIG9yIGEgXGMgQ2FsbEdyYXBoU0NDUGFzcy4KK0Jhc2ljQUFSZXN1bHQgY3JlYXRlTGVnYWN5UE1CYXNpY0FBUmVzdWx0KFBhc3MgJlAsIEZ1bmN0aW9uICZGKTsKKworLy8vIFRoaXMgY2xhc3MgaXMgYSBmdW5jdG9yIHRvIGJlIHVzZWQgaW4gbGVnYWN5IG1vZHVsZSBvciBTQ0MgcGFzc2VzIGZvcgorLy8vIGNvbXB1dGluZyBBQSByZXN1bHRzIGZvciBhIGZ1bmN0aW9uLiBXZSBzdG9yZSB0aGUgcmVzdWx0cyBpbiBmaWVsZHMgc28gdGhhdAorLy8vIHRoZXkgbGl2ZSBsb25nIGVub3VnaCB0byBiZSBxdWVyaWVkLCBidXQgd2UgcmUtdXNlIHRoZW0gZWFjaCB0aW1lLgorY2xhc3MgTGVnYWN5QUFSR2V0dGVyIHsKKyAgUGFzcyAmUDsKKyAgT3B0aW9uYWw8QmFzaWNBQVJlc3VsdD4gQkFSOworICBPcHRpb25hbDxBQVJlc3VsdHM+IEFBUjsKKworcHVibGljOgorICBMZWdhY3lBQVJHZXR0ZXIoUGFzcyAmUCkgOiBQKFApIHt9CisgIEFBUmVzdWx0cyAmb3BlcmF0b3IoKShGdW5jdGlvbiAmRikgeworICAgIEJBUi5lbXBsYWNlKGNyZWF0ZUxlZ2FjeVBNQmFzaWNBQVJlc3VsdChQLCBGKSk7CisgICAgQUFSLmVtcGxhY2UoY3JlYXRlTGVnYWN5UE1BQVJlc3VsdHMoUCwgRiwgKkJBUikpOworICAgIHJldHVybiAqQUFSOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19CQVNJQ0FMSUFTQU5BTFlTSVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9CbG9ja0ZyZXF1ZW5jeUluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQmxvY2tGcmVxdWVuY3lJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkzNzBjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQmxvY2tGcmVxdWVuY3lJbmZvLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8vPT09LSBCbG9ja0ZyZXF1ZW5jeUluZm8uaCAtIEJsb2NrIEZyZXF1ZW5jeSBBbmFseXNpcyAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG9vcHMgc2hvdWxkIGJlIHNpbXBsaWZpZWQgYmVmb3JlIHRoaXMgYW5hbHlzaXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0JMT0NLRlJFUVVFTkNZSU5GT19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQkxPQ0tGUkVRVUVOQ1lJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CbG9ja0ZyZXF1ZW5jeS5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBCcmFuY2hQcm9iYWJpbGl0eUluZm87CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIExvb3BJbmZvOworY2xhc3MgTW9kdWxlOworY2xhc3MgcmF3X29zdHJlYW07Cit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tUPiBjbGFzcyBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsOworCitlbnVtIFBHT1ZpZXdDb3VudHNUeXBlIHsgUEdPVkNUX05vbmUsIFBHT1ZDVF9HcmFwaCwgUEdPVkNUX1RleHQgfTsKKworLy8vIEJsb2NrRnJlcXVlbmN5SW5mbyBwYXNzIHVzZXMgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbCBpbXBsZW1lbnRhdGlvbiB0bworLy8vIGVzdGltYXRlIElSIGJhc2ljIGJsb2NrIGZyZXF1ZW5jaWVzLgorY2xhc3MgQmxvY2tGcmVxdWVuY3lJbmZvIHsKKyAgdXNpbmcgSW1wbFR5cGUgPSBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsPEJhc2ljQmxvY2s+OworCisgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsVHlwZT4gQkZJOworCitwdWJsaWM6CisgIEJsb2NrRnJlcXVlbmN5SW5mbygpOworICBCbG9ja0ZyZXF1ZW5jeUluZm8oY29uc3QgRnVuY3Rpb24gJkYsIGNvbnN0IEJyYW5jaFByb2JhYmlsaXR5SW5mbyAmQlBJLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcEluZm8gJkxJKTsKKyAgQmxvY2tGcmVxdWVuY3lJbmZvKGNvbnN0IEJsb2NrRnJlcXVlbmN5SW5mbyAmKSA9IGRlbGV0ZTsKKyAgQmxvY2tGcmVxdWVuY3lJbmZvICZvcGVyYXRvcj0oY29uc3QgQmxvY2tGcmVxdWVuY3lJbmZvICYpID0gZGVsZXRlOworICBCbG9ja0ZyZXF1ZW5jeUluZm8oQmxvY2tGcmVxdWVuY3lJbmZvICYmQXJnKTsKKyAgQmxvY2tGcmVxdWVuY3lJbmZvICZvcGVyYXRvcj0oQmxvY2tGcmVxdWVuY3lJbmZvICYmUkhTKTsKKyAgfkJsb2NrRnJlcXVlbmN5SW5mbygpOworCisgIC8vLyBIYW5kbGUgaW52YWxpZGF0aW9uIGV4cGxpY2l0bHkuCisgIGJvb2wgaW52YWxpZGF0ZShGdW5jdGlvbiAmRiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJlBBLAorICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BbmFseXNpc01hbmFnZXI6OkludmFsaWRhdG9yICYpOworCisgIGNvbnN0IEZ1bmN0aW9uICpnZXRGdW5jdGlvbigpIGNvbnN0OworICBjb25zdCBCcmFuY2hQcm9iYWJpbGl0eUluZm8gKmdldEJQSSgpIGNvbnN0OworICB2b2lkIHZpZXcoKSBjb25zdDsKKworICAvLy8gZ2V0YmxvY2tGcmVxIC0gUmV0dXJuIGJsb2NrIGZyZXF1ZW5jeS4gUmV0dXJuIDAgaWYgd2UgZG9uJ3QgaGF2ZSB0aGUKKyAgLy8vIGluZm9ybWF0aW9uLiBQbGVhc2Ugbm90ZSB0aGF0IGluaXRpYWwgZnJlcXVlbmN5IGlzIGVxdWFsIHRvIEVOVFJZX0ZSRVEuIEl0CisgIC8vLyBtZWFucyB0aGF0IHdlIHNob3VsZCBub3QgcmVseSBvbiB0aGUgdmFsdWUgaXRzZWxmLCBidXQgb25seSBvbiB0aGUKKyAgLy8vIGNvbXBhcmlzb24gdG8gdGhlIG90aGVyIGJsb2NrIGZyZXF1ZW5jaWVzLiBXZSBkbyB0aGlzIHRvIGF2b2lkIHVzaW5nIG9mCisgIC8vLyBmbG9hdGluZyBwb2ludHMuCisgIEJsb2NrRnJlcXVlbmN5IGdldEJsb2NrRnJlcShjb25zdCBCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBlc3RpbWF0ZWQgcHJvZmlsZSBjb3VudCBvZiBccCBCQi4KKyAgLy8vIFRoaXMgY29tcHV0ZXMgdGhlIHJlbGF0aXZlIGJsb2NrIGZyZXF1ZW5jeSBvZiBccCBCQiBhbmQgbXVsdGlwbGllcyBpdCBieQorICAvLy8gdGhlIGVuY2xvc2luZyBmdW5jdGlvbidzIGNvdW50IChpZiBhdmFpbGFibGUpIGFuZCByZXR1cm5zIHRoZSB2YWx1ZS4KKyAgT3B0aW9uYWw8dWludDY0X3Q+IGdldEJsb2NrUHJvZmlsZUNvdW50KGNvbnN0IEJhc2ljQmxvY2sgKkJCKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGVzdGltYXRlZCBwcm9maWxlIGNvdW50IG9mIFxwIEZyZXEuCisgIC8vLyBUaGlzIHVzZXMgdGhlIGZyZXF1ZW5jeSBccCBGcmVxIGFuZCBtdWx0aXBsaWVzIGl0IGJ5CisgIC8vLyB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uJ3MgY291bnQgKGlmIGF2YWlsYWJsZSkgYW5kIHJldHVybnMgdGhlIHZhbHVlLgorICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0UHJvZmlsZUNvdW50RnJvbUZyZXEodWludDY0X3QgRnJlcSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgXHAgQkIgaXMgYW4gaXJyZWR1Y2libGUgbG9vcCBoZWFkZXIKKyAgLy8vIGJsb2NrLiBPdGhlcndpc2UgZmFsc2UuCisgIGJvb2wgaXNJcnJMb29wSGVhZGVyKGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKKworICAvLyBTZXQgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgZ2l2ZW4gYmFzaWMgYmxvY2suCisgIHZvaWQgc2V0QmxvY2tGcmVxKGNvbnN0IEJhc2ljQmxvY2sgKkJCLCB1aW50NjRfdCBGcmVxKTsKKworICAvLy8gU2V0IHRoZSBmcmVxdWVuY3kgb2YgXHAgUmVmZXJlbmNlQkIgdG8gXHAgRnJlcSBhbmQgc2NhbGUgdGhlIGZyZXF1ZW5jaWVzCisgIC8vLyBvZiB0aGUgYmxvY2tzIGluIFxwIEJsb2Nrc1RvU2NhbGUgc3VjaCB0aGF0IHRoZWlyIGZyZXF1ZW5jaWVzIHJlbGF0aXZlCisgIC8vLyB0byBccCBSZWZlcmVuY2VCQiByZW1haW4gdW5jaGFuZ2VkLgorICB2b2lkIHNldEJsb2NrRnJlcUFuZFNjYWxlKGNvbnN0IEJhc2ljQmxvY2sgKlJlZmVyZW5jZUJCLCB1aW50NjRfdCBGcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0SW1wbDxCYXNpY0Jsb2NrICo+ICZCbG9ja3NUb1NjYWxlKTsKKworICAvLy8gY2FsY3VsYXRlIC0gY29tcHV0ZSBibG9jayBmcmVxdWVuY3kgaW5mbyBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uLgorICB2b2lkIGNhbGN1bGF0ZShjb25zdCBGdW5jdGlvbiAmRiwgY29uc3QgQnJhbmNoUHJvYmFiaWxpdHlJbmZvICZCUEksCisgICAgICAgICAgICAgICAgIGNvbnN0IExvb3BJbmZvICZMSSk7CisKKyAgLy8gUHJpbnQgdGhlIGJsb2NrIGZyZXF1ZW5jeSBGcmVxIHRvIE9TIHVzaW5nIHRoZSBjdXJyZW50IGZ1bmN0aW9ucyBlbnRyeQorICAvLyBmcmVxdWVuY3kgdG8gY29udmVydCBmcmVxIGludG8gYSByZWxhdGl2ZSBkZWNpbWFsIGZvcm0uCisgIHJhd19vc3RyZWFtICZwcmludEJsb2NrRnJlcShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEJsb2NrRnJlcXVlbmN5IEZyZXEpIGNvbnN0OworCisgIC8vIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGF0dGVtcHRzIHRvIGxvb2sgdXAgdGhlIGZyZXF1ZW5jeSBhc3NvY2lhdGVkIHdpdGgKKyAgLy8gQkIgYW5kIHByaW50IGl0IHRvIE9TLgorICByYXdfb3N0cmVhbSAmcHJpbnRCbG9ja0ZyZXEocmF3X29zdHJlYW0gJk9TLCBjb25zdCBCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgdWludDY0X3QgZ2V0RW50cnlGcmVxKCkgY29uc3Q7CisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpOworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7Cit9OworCisvLy8gXGJyaWVmIEFuYWx5c2lzIHBhc3Mgd2hpY2ggY29tcHV0ZXMgXGMgQmxvY2tGcmVxdWVuY3lJbmZvLgorY2xhc3MgQmxvY2tGcmVxdWVuY3lBbmFseXNpcworICAgIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPEJsb2NrRnJlcXVlbmN5QW5hbHlzaXM+IHsKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPEJsb2NrRnJlcXVlbmN5QW5hbHlzaXM+OworCisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBQcm92aWRlIHRoZSByZXN1bHQgdHlwZSBmb3IgdGhpcyBhbmFseXNpcyBwYXNzLgorICB1c2luZyBSZXN1bHQgPSBCbG9ja0ZyZXF1ZW5jeUluZm87CisKKyAgLy8vIFxicmllZiBSdW4gdGhlIGFuYWx5c2lzIHBhc3Mgb3ZlciBhIGZ1bmN0aW9uIGFuZCBwcm9kdWNlIEJGSS4KKyAgUmVzdWx0IHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBcYnJpZWYgUHJpbnRlciBwYXNzIGZvciB0aGUgXGMgQmxvY2tGcmVxdWVuY3lJbmZvIHJlc3VsdHMuCitjbGFzcyBCbG9ja0ZyZXF1ZW5jeVByaW50ZXJQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxCbG9ja0ZyZXF1ZW5jeVByaW50ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKworcHVibGljOgorICBleHBsaWNpdCBCbG9ja0ZyZXF1ZW5jeVByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPUykgOiBPUyhPUykge30KKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIExlZ2FjeSBhbmFseXNpcyBwYXNzIHdoaWNoIGNvbXB1dGVzIFxjIEJsb2NrRnJlcXVlbmN5SW5mby4KK2NsYXNzIEJsb2NrRnJlcXVlbmN5SW5mb1dyYXBwZXJQYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgIEJsb2NrRnJlcXVlbmN5SW5mbyBCRkk7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgQmxvY2tGcmVxdWVuY3lJbmZvV3JhcHBlclBhc3MoKTsKKyAgfkJsb2NrRnJlcXVlbmN5SW5mb1dyYXBwZXJQYXNzKCkgb3ZlcnJpZGU7CisKKyAgQmxvY2tGcmVxdWVuY3lJbmZvICZnZXRCRkkoKSB7IHJldHVybiBCRkk7IH0KKyAgY29uc3QgQmxvY2tGcmVxdWVuY3lJbmZvICZnZXRCRkkoKSBjb25zdCB7IHJldHVybiBCRkk7IH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlOworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICpNKSBjb25zdCBvdmVycmlkZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0JMT0NLRlJFUVVFTkNZSU5GT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0Jsb2NrRnJlcXVlbmN5SW5mb0ltcGwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQmxvY2tGcmVxdWVuY3lJbmZvSW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYzQwYjgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0Jsb2NrRnJlcXVlbmN5SW5mb0ltcGwuaApAQCAtMCwwICsxLDE0NzMgQEAKKy8vPT0tIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGwuaCAtIEJsb2NrIEZyZXF1ZW5jeSBJbXBsZW1lbnRhdGlvbiAtLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gU2hhcmVkIGltcGxlbWVudGF0aW9uIG9mIEJsb2NrRnJlcXVlbmN5IGZvciBJUiBhbmQgTWFjaGluZSBJbnN0cnVjdGlvbnMuCisvLyBTZWUgdGhlIGRvY3VtZW50YXRpb24gYmVsb3cgZm9yIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGwgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0JMT0NLRlJFUVVFTkNZSU5GT0lNUExfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0JMT0NLRlJFUVVFTkNZSU5GT0lNUExfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb3N0T3JkZXJJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3BhcnNlQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CbG9ja0ZyZXF1ZW5jeS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CcmFuY2hQcm9iYWJpbGl0eS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ET1RHcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TY2FsZWROdW1iZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjZGVmaW5lIERFQlVHX1RZUEUgImJsb2NrLWZyZXEiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQnJhbmNoUHJvYmFiaWxpdHlJbmZvOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBMb29wOworY2xhc3MgTG9vcEluZm87CitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIE1hY2hpbmVCcmFuY2hQcm9iYWJpbGl0eUluZm87CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lTG9vcDsKK2NsYXNzIE1hY2hpbmVMb29wSW5mbzsKKworbmFtZXNwYWNlIGJmaV9kZXRhaWwgeworCitzdHJ1Y3QgSXJyZWR1Y2libGVHcmFwaDsKKworLy8gVGhpcyBpcyBwYXJ0IG9mIGEgd29ya2Fyb3VuZCBmb3IgYSBHQ0MgNC43IGNyYXNoIG9uIGxhbWJkYXMuCit0ZW1wbGF0ZSA8Y2xhc3MgQlQ+IHN0cnVjdCBCbG9ja0VkZ2VzQWRkZXI7CisKKy8vLyBcYnJpZWYgTWFzcyBvZiBhIGJsb2NrLgorLy8vCisvLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgc29ydCBvZiBmaXhlZC1wb2ludCBmcmFjdGlvbiBhbHdheXMgYmV0d2VlbiAwLjAgYW5kCisvLy8gMS4wLiAgZ2V0TWFzcygpID09IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKSBpbmRpY2F0ZXMgYSB2YWx1ZSBvZgorLy8vIDEuMC4KKy8vLworLy8vIE1hc3NlcyBjYW4gYmUgYWRkZWQgYW5kIHN1YnRyYWN0ZWQuICBTaW1wbGUgc2F0dXJhdGlvbiBhcml0aG1ldGljIGlzIHVzZWQsCisvLy8gc28gYXJpdGhtZXRpYyBvcGVyYXRpb25zIG5ldmVyIG92ZXJmbG93IG9yIHVuZGVyZmxvdy4KKy8vLworLy8vIE1hc3NlcyBjYW4gYmUgbXVsdGlwbGllZC4gIE11bHRpcGxpY2F0aW9uIHRyZWF0cyBmdWxsIG1hc3MgYXMgMS4wIGFuZCB1c2VzCisvLy8gYW4gaW5leHBlbnNpdmUgZmxvYXRpbmctcG9pbnQgYWxnb3JpdGhtIHRoYXQncyBvZmYtYnktb25lIChhbG1vc3QsIGJ1dCBub3QKKy8vLyBxdWl0ZSwgbWF4aW11bSBwcmVjaXNpb24pLgorLy8vCisvLy8gTWFzc2VzIGNhbiBiZSBzY2FsZWQgYnkgXGEgQnJhbmNoUHJvYmFiaWxpdHkgYXQgbWF4aW11bSBwcmVjaXNpb24uCitjbGFzcyBCbG9ja01hc3MgeworICB1aW50NjRfdCBNYXNzID0gMDsKKworcHVibGljOgorICBCbG9ja01hc3MoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IEJsb2NrTWFzcyh1aW50NjRfdCBNYXNzKSA6IE1hc3MoTWFzcykge30KKworICBzdGF0aWMgQmxvY2tNYXNzIGdldEVtcHR5KCkgeyByZXR1cm4gQmxvY2tNYXNzKCk7IH0KKworICBzdGF0aWMgQmxvY2tNYXNzIGdldEZ1bGwoKSB7CisgICAgcmV0dXJuIEJsb2NrTWFzcyhzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkpOworICB9CisKKyAgdWludDY0X3QgZ2V0TWFzcygpIGNvbnN0IHsgcmV0dXJuIE1hc3M7IH0KKworICBib29sIGlzRnVsbCgpIGNvbnN0IHsgcmV0dXJuIE1hc3MgPT0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpOyB9CisgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFNYXNzOyB9CisKKyAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7IHJldHVybiBpc0VtcHR5KCk7IH0KKworICAvLy8gXGJyaWVmIEFkZCBhbm90aGVyIG1hc3MuCisgIC8vLworICAvLy8gQWRkcyBhbm90aGVyIG1hc3MsIHNhdHVyYXRpbmcgYXQgXGEgaXNGdWxsKCkgcmF0aGVyIHRoYW4gb3ZlcmZsb3dpbmcuCisgIEJsb2NrTWFzcyAmb3BlcmF0b3IrPShCbG9ja01hc3MgWCkgeworICAgIHVpbnQ2NF90IFN1bSA9IE1hc3MgKyBYLk1hc3M7CisgICAgTWFzcyA9IFN1bSA8IE1hc3MgPyBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkgOiBTdW07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBTdWJ0cmFjdCBhbm90aGVyIG1hc3MuCisgIC8vLworICAvLy8gU3VidHJhY3RzIGFub3RoZXIgbWFzcywgc2F0dXJhdGluZyBhdCBcYSBpc0VtcHR5KCkgcmF0aGVyIHRoYW4KKyAgLy8vIHVuZGVmbG93aW5nLgorICBCbG9ja01hc3MgJm9wZXJhdG9yLT0oQmxvY2tNYXNzIFgpIHsKKyAgICB1aW50NjRfdCBEaWZmID0gTWFzcyAtIFguTWFzczsKKyAgICBNYXNzID0gRGlmZiA+IE1hc3MgPyAwIDogRGlmZjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBCbG9ja01hc3MgJm9wZXJhdG9yKj0oQnJhbmNoUHJvYmFiaWxpdHkgUCkgeworICAgIE1hc3MgPSBQLnNjYWxlKE1hc3MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShCbG9ja01hc3MgWCkgY29uc3QgeyByZXR1cm4gTWFzcyA9PSBYLk1hc3M7IH0KKyAgYm9vbCBvcGVyYXRvciE9KEJsb2NrTWFzcyBYKSBjb25zdCB7IHJldHVybiBNYXNzICE9IFguTWFzczsgfQorICBib29sIG9wZXJhdG9yPD0oQmxvY2tNYXNzIFgpIGNvbnN0IHsgcmV0dXJuIE1hc3MgPD0gWC5NYXNzOyB9CisgIGJvb2wgb3BlcmF0b3I+PShCbG9ja01hc3MgWCkgY29uc3QgeyByZXR1cm4gTWFzcyA+PSBYLk1hc3M7IH0KKyAgYm9vbCBvcGVyYXRvcjwoQmxvY2tNYXNzIFgpIGNvbnN0IHsgcmV0dXJuIE1hc3MgPCBYLk1hc3M7IH0KKyAgYm9vbCBvcGVyYXRvcj4oQmxvY2tNYXNzIFgpIGNvbnN0IHsgcmV0dXJuIE1hc3MgPiBYLk1hc3M7IH0KKworICAvLy8gXGJyaWVmIENvbnZlcnQgdG8gc2NhbGVkIG51bWJlci4KKyAgLy8vCisgIC8vLyBDb252ZXJ0IHRvIFxhIFNjYWxlZE51bWJlci4gIFxhIGlzRnVsbCgpIGdpdmVzIDEuMCwgd2hpbGUgXGEgaXNFbXB0eSgpCisgIC8vLyBnaXZlcyBzbGlnaHRseSBhYm92ZSAwLjAuCisgIFNjYWxlZE51bWJlcjx1aW50NjRfdD4gdG9TY2FsZWQoKSBjb25zdDsKKworICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgcmF3X29zdHJlYW0gJnByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7Cit9OworCitpbmxpbmUgQmxvY2tNYXNzIG9wZXJhdG9yKyhCbG9ja01hc3MgTCwgQmxvY2tNYXNzIFIpIHsKKyAgcmV0dXJuIEJsb2NrTWFzcyhMKSArPSBSOworfQoraW5saW5lIEJsb2NrTWFzcyBvcGVyYXRvci0oQmxvY2tNYXNzIEwsIEJsb2NrTWFzcyBSKSB7CisgIHJldHVybiBCbG9ja01hc3MoTCkgLT0gUjsKK30KK2lubGluZSBCbG9ja01hc3Mgb3BlcmF0b3IqKEJsb2NrTWFzcyBMLCBCcmFuY2hQcm9iYWJpbGl0eSBSKSB7CisgIHJldHVybiBCbG9ja01hc3MoTCkgKj0gUjsKK30KK2lubGluZSBCbG9ja01hc3Mgb3BlcmF0b3IqKEJyYW5jaFByb2JhYmlsaXR5IEwsIEJsb2NrTWFzcyBSKSB7CisgIHJldHVybiBCbG9ja01hc3MoUikgKj0gTDsKK30KKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgQmxvY2tNYXNzIFgpIHsKKyAgcmV0dXJuIFgucHJpbnQoT1MpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgYmZpX2RldGFpbAorCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNQb2RMaWtlPGJmaV9kZXRhaWw6OkJsb2NrTWFzcz4geworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworCisvLy8gXGJyaWVmIEJhc2UgY2xhc3MgZm9yIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGwKKy8vLworLy8vIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGxCYXNlIGhhcyBzdXBwb3J0aW5nIGRhdGEgc3RydWN0dXJlcyBhbmQgc29tZQorLy8vIGFsZ29yaXRobXMgZm9yIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGxCYXNlLiAgT25seSBhbGdvcml0aG1zIHRoYXQgZGVwZW5kIG9uCisvLy8gdGhlIGJsb2NrIHR5cGUgKG9yIHRoYXQgY2FsbCBzdWNoIGFsZ29yaXRobXMpIGFyZSBza2lwcGVkIGhlcmUuCisvLy8KKy8vLyBOZXZlcnRoZWxlc3MsIHRoZSBtYWpvcml0eSBvZiB0aGUgb3ZlcmFsbCBhbGdvcml0aG0gZG9jdW1lbnRpb24gbGl2ZXMgd2l0aAorLy8vIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGwuICBTZWUgdGhlcmUgZm9yIGRldGFpbHMuCitjbGFzcyBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsQmFzZSB7CitwdWJsaWM6CisgIHVzaW5nIFNjYWxlZDY0ID0gU2NhbGVkTnVtYmVyPHVpbnQ2NF90PjsKKyAgdXNpbmcgQmxvY2tNYXNzID0gYmZpX2RldGFpbDo6QmxvY2tNYXNzOworCisgIC8vLyBcYnJpZWYgUmVwcmVzZW50YXRpdmUgb2YgYSBibG9jay4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIGFuIGluZGV4IGludG8gdGhlIHJldmVyc2UtcG9zdC1vcmRlcgorICAvLy8gdHJhdmVyc2FsIG9mIHRoZSBibG9ja3MuCisgIC8vLworICAvLy8gVW5saWtlIGEgYmxvY2sgcG9pbnRlciwgaXRzIG9yZGVyIGhhcyBtZWFuaW5nIChsb2NhdGlvbiBpbiB0aGUKKyAgLy8vIHRvcG9sb2dpY2FsIHNvcnQpIGFuZCBpdCdzIGNsYXNzIGlzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2YgYmxvY2sgdHlwZS4KKyAgc3RydWN0IEJsb2NrTm9kZSB7CisgICAgdXNpbmcgSW5kZXhUeXBlID0gdWludDMyX3Q7CisKKyAgICBJbmRleFR5cGUgSW5kZXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCk7CisKKyAgICBCbG9ja05vZGUoKSA9IGRlZmF1bHQ7CisgICAgQmxvY2tOb2RlKEluZGV4VHlwZSBJbmRleCkgOiBJbmRleChJbmRleCkge30KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBCbG9ja05vZGUgJlgpIGNvbnN0IHsgcmV0dXJuIEluZGV4ID09IFguSW5kZXg7IH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQmxvY2tOb2RlICZYKSBjb25zdCB7IHJldHVybiBJbmRleCAhPSBYLkluZGV4OyB9CisgICAgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEJsb2NrTm9kZSAmWCkgY29uc3QgeyByZXR1cm4gSW5kZXggPD0gWC5JbmRleDsgfQorICAgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBCbG9ja05vZGUgJlgpIGNvbnN0IHsgcmV0dXJuIEluZGV4ID49IFguSW5kZXg7IH0KKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBCbG9ja05vZGUgJlgpIGNvbnN0IHsgcmV0dXJuIEluZGV4IDwgWC5JbmRleDsgfQorICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEJsb2NrTm9kZSAmWCkgY29uc3QgeyByZXR1cm4gSW5kZXggPiBYLkluZGV4OyB9CisKKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBJbmRleCA8PSBnZXRNYXhJbmRleCgpOyB9CisKKyAgICBzdGF0aWMgc2l6ZV90IGdldE1heEluZGV4KCkgeworICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkgLSAxOworICAgIH0KKyAgfTsKKworICAvLy8gXGJyaWVmIFN0YXRzIGFib3V0IGEgYmxvY2sgaXRzZWxmLgorICBzdHJ1Y3QgRnJlcXVlbmN5RGF0YSB7CisgICAgU2NhbGVkNjQgU2NhbGVkOworICAgIHVpbnQ2NF90IEludGVnZXI7CisgIH07CisKKyAgLy8vIFxicmllZiBEYXRhIGFib3V0IGEgbG9vcC4KKyAgLy8vCisgIC8vLyBDb250YWlucyB0aGUgZGF0YSBuZWNlc3NhcnkgdG8gcmVwcmVzZW50IGEgbG9vcCBhcyBhIHBzZXVkby1ub2RlIG9uY2UgaXQncworICAvLy8gcGFja2FnZWQuCisgIHN0cnVjdCBMb29wRGF0YSB7CisgICAgdXNpbmcgRXhpdE1hcCA9IFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxCbG9ja05vZGUsIEJsb2NrTWFzcz4sIDQ+OworICAgIHVzaW5nIE5vZGVMaXN0ID0gU21hbGxWZWN0b3I8QmxvY2tOb2RlLCA0PjsKKyAgICB1c2luZyBIZWFkZXJNYXNzTGlzdCA9IFNtYWxsVmVjdG9yPEJsb2NrTWFzcywgMT47CisKKyAgICBMb29wRGF0YSAqUGFyZW50OyAgICAgICAgICAgIC8vLzwgVGhlIHBhcmVudCBsb29wLgorICAgIGJvb2wgSXNQYWNrYWdlZCA9IGZhbHNlOyAgICAgLy8vPCBXaGV0aGVyIHRoaXMgaGFzIGJlZW4gcGFja2FnZWQuCisgICAgdWludDMyX3QgTnVtSGVhZGVycyA9IDE7ICAgICAvLy88IE51bWJlciBvZiBoZWFkZXJzLgorICAgIEV4aXRNYXAgRXhpdHM7ICAgICAgICAgICAgICAgLy8vPCBTdWNjZXNzb3IgZWRnZXMgKGFuZCB3ZWlnaHRzKS4KKyAgICBOb2RlTGlzdCBOb2RlczsgICAgICAgICAgICAgIC8vLzwgSGVhZGVyIGFuZCB0aGUgbWVtYmVycyBvZiB0aGUgbG9vcC4KKyAgICBIZWFkZXJNYXNzTGlzdCBCYWNrZWRnZU1hc3M7IC8vLzwgTWFzcyByZXR1cm5lZCB0byBlYWNoIGxvb3AgaGVhZGVyLgorICAgIEJsb2NrTWFzcyBNYXNzOworICAgIFNjYWxlZDY0IFNjYWxlOworCisgICAgTG9vcERhdGEoTG9vcERhdGEgKlBhcmVudCwgY29uc3QgQmxvY2tOb2RlICZIZWFkZXIpCisgICAgICA6IFBhcmVudChQYXJlbnQpLCBOb2RlcygxLCBIZWFkZXIpLCBCYWNrZWRnZU1hc3MoMSkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBJdDEsIGNsYXNzIEl0Mj4KKyAgICBMb29wRGF0YShMb29wRGF0YSAqUGFyZW50LCBJdDEgRmlyc3RIZWFkZXIsIEl0MSBMYXN0SGVhZGVyLCBJdDIgRmlyc3RPdGhlciwKKyAgICAgICAgICAgICBJdDIgTGFzdE90aGVyKQorICAgICAgICA6IFBhcmVudChQYXJlbnQpLCBOb2RlcyhGaXJzdEhlYWRlciwgTGFzdEhlYWRlcikgeworICAgICAgTnVtSGVhZGVycyA9IE5vZGVzLnNpemUoKTsKKyAgICAgIE5vZGVzLmluc2VydChOb2Rlcy5lbmQoKSwgRmlyc3RPdGhlciwgTGFzdE90aGVyKTsKKyAgICAgIEJhY2tlZGdlTWFzcy5yZXNpemUoTnVtSGVhZGVycyk7CisgICAgfQorCisgICAgYm9vbCBpc0hlYWRlcihjb25zdCBCbG9ja05vZGUgJk5vZGUpIGNvbnN0IHsKKyAgICAgIGlmIChpc0lycmVkdWNpYmxlKCkpCisgICAgICAgIHJldHVybiBzdGQ6OmJpbmFyeV9zZWFyY2goTm9kZXMuYmVnaW4oKSwgTm9kZXMuYmVnaW4oKSArIE51bUhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSk7CisgICAgICByZXR1cm4gTm9kZSA9PSBOb2Rlc1swXTsKKyAgICB9CisKKyAgICBCbG9ja05vZGUgZ2V0SGVhZGVyKCkgY29uc3QgeyByZXR1cm4gTm9kZXNbMF07IH0KKyAgICBib29sIGlzSXJyZWR1Y2libGUoKSBjb25zdCB7IHJldHVybiBOdW1IZWFkZXJzID4gMTsgfQorCisgICAgSGVhZGVyTWFzc0xpc3Q6OmRpZmZlcmVuY2VfdHlwZSBnZXRIZWFkZXJJbmRleChjb25zdCBCbG9ja05vZGUgJkIpIHsKKyAgICAgIGFzc2VydChpc0hlYWRlcihCKSAmJiAidGhpcyBpcyBvbmx5IHZhbGlkIG9uIGxvb3AgaGVhZGVyIGJsb2NrcyIpOworICAgICAgaWYgKGlzSXJyZWR1Y2libGUoKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bG93ZXJfYm91bmQoTm9kZXMuYmVnaW4oKSwgTm9kZXMuYmVnaW4oKSArIE51bUhlYWRlcnMsIEIpIC0KKyAgICAgICAgICAgICAgIE5vZGVzLmJlZ2luKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBOb2RlTGlzdDo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyc19iZWdpbigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBOb2Rlcy5iZWdpbigpICsgTnVtSGVhZGVyczsKKyAgICB9CisKKyAgICBOb2RlTGlzdDo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyc19lbmQoKSBjb25zdCB7IHJldHVybiBOb2Rlcy5lbmQoKTsgfQorICAgIGl0ZXJhdG9yX3JhbmdlPE5vZGVMaXN0Ojpjb25zdF9pdGVyYXRvcj4gbWVtYmVycygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBtYWtlX3JhbmdlKG1lbWJlcnNfYmVnaW4oKSwgbWVtYmVyc19lbmQoKSk7CisgICAgfQorICB9OworCisgIC8vLyBcYnJpZWYgSW5kZXggb2YgbG9vcCBpbmZvcm1hdGlvbi4KKyAgc3RydWN0IFdvcmtpbmdEYXRhIHsKKyAgICBCbG9ja05vZGUgTm9kZTsgICAgICAgICAgIC8vLzwgVGhpcyBub2RlLgorICAgIExvb3BEYXRhICpMb29wID0gbnVsbHB0cjsgLy8vPCBUaGUgbG9vcCB0aGlzIGJsb2NrIGlzIGluc2lkZS4KKyAgICBCbG9ja01hc3MgTWFzczsgICAgICAgICAgIC8vLzwgTWFzcyBkaXN0cmlidXRpb24gZnJvbSB0aGUgZW50cnkgYmxvY2suCisKKyAgICBXb3JraW5nRGF0YShjb25zdCBCbG9ja05vZGUgJk5vZGUpIDogTm9kZShOb2RlKSB7fQorCisgICAgYm9vbCBpc0xvb3BIZWFkZXIoKSBjb25zdCB7IHJldHVybiBMb29wICYmIExvb3AtPmlzSGVhZGVyKE5vZGUpOyB9CisKKyAgICBib29sIGlzRG91YmxlTG9vcEhlYWRlcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpc0xvb3BIZWFkZXIoKSAmJiBMb29wLT5QYXJlbnQgJiYgTG9vcC0+UGFyZW50LT5pc0lycmVkdWNpYmxlKCkgJiYKKyAgICAgICAgICAgICBMb29wLT5QYXJlbnQtPmlzSGVhZGVyKE5vZGUpOworICAgIH0KKworICAgIExvb3BEYXRhICpnZXRDb250YWluaW5nTG9vcCgpIGNvbnN0IHsKKyAgICAgIGlmICghaXNMb29wSGVhZGVyKCkpCisgICAgICAgIHJldHVybiBMb29wOworICAgICAgaWYgKCFpc0RvdWJsZUxvb3BIZWFkZXIoKSkKKyAgICAgICAgcmV0dXJuIExvb3AtPlBhcmVudDsKKyAgICAgIHJldHVybiBMb29wLT5QYXJlbnQtPlBhcmVudDsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJlc29sdmUgYSBub2RlIHRvIGl0cyByZXByZXNlbnRhdGl2ZS4KKyAgICAvLy8KKyAgICAvLy8gR2V0IHRoZSBub2RlIGN1cnJlbnRseSByZXByZXNlbnRpbmcgTm9kZSwgd2hpY2ggY291bGQgYmUgYSBjb250YWluaW5nCisgICAgLy8vIGxvb3AuCisgICAgLy8vCisgICAgLy8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gZGlzdHJpYnV0aW5nIG1hc3MuICBBcyBsb25nIGFzCisgICAgLy8vIHRoZXJlIGFyZSBubyBpcnJlZHVjaWJsZSBlZGdlcyB0byBOb2RlLCB0aGVuIGl0IHdpbGwgaGF2ZSBjb21wbGV4aXR5CisgICAgLy8vIE8oMSkgaW4gdGhpcyBjb250ZXh0LgorICAgIC8vLworICAgIC8vLyBJbiBnZW5lcmFsLCB0aGUgY29tcGxleGl0eSBpcyBPKEwpLCB3aGVyZSBMIGlzIHRoZSBudW1iZXIgb2YgbG9vcAorICAgIC8vLyBoZWFkZXJzIE5vZGUgaGFzIGJlZW4gcGFja2FnZWQgaW50by4gIFNpbmNlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbgorICAgIC8vLyB0aGUgY29udGV4dCBvZiBkaXN0cmlidXRpbmcgbWFzcywgTCB3aWxsIGJlIHRoZSBudW1iZXIgb2YgbG9vcCBoZWFkZXJzCisgICAgLy8vIGFuIGVhcmx5IGV4aXQgZWRnZSBqdW1wcyBvdXQgb2YuCisgICAgQmxvY2tOb2RlIGdldFJlc29sdmVkTm9kZSgpIGNvbnN0IHsKKyAgICAgIGF1dG8gTCA9IGdldFBhY2thZ2VkTG9vcCgpOworICAgICAgcmV0dXJuIEwgPyBMLT5nZXRIZWFkZXIoKSA6IE5vZGU7CisgICAgfQorCisgICAgTG9vcERhdGEgKmdldFBhY2thZ2VkTG9vcCgpIGNvbnN0IHsKKyAgICAgIGlmICghTG9vcCB8fCAhTG9vcC0+SXNQYWNrYWdlZCkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICBhdXRvIEwgPSBMb29wOworICAgICAgd2hpbGUgKEwtPlBhcmVudCAmJiBMLT5QYXJlbnQtPklzUGFja2FnZWQpCisgICAgICAgIEwgPSBMLT5QYXJlbnQ7CisgICAgICByZXR1cm4gTDsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIEdldCB0aGUgYXBwcm9wcmlhdGUgbWFzcyBmb3IgYSBub2RlLgorICAgIC8vLworICAgIC8vLyBHZXQgYXBwcm9wcmlhdGUgbWFzcyBmb3IgTm9kZS4gIElmIE5vZGUgaXMgYSBsb29wLWhlYWRlciAod2hvc2UgbG9vcAorICAgIC8vLyBoYXMgYmVlbiBwYWNrYWdlZCksIHJldHVybnMgdGhlIG1hc3Mgb2YgaXRzIHBzZXVkby1ub2RlLiAgSWYgaXQncyBhCisgICAgLy8vIG5vZGUgaW5zaWRlIGEgcGFja2FnZWQgbG9vcCwgaXQgcmV0dXJucyB0aGUgbG9vcCdzIG1hc3MuCisgICAgQmxvY2tNYXNzICZnZXRNYXNzKCkgeworICAgICAgaWYgKCFpc0FQYWNrYWdlKCkpCisgICAgICAgIHJldHVybiBNYXNzOworICAgICAgaWYgKCFpc0FEb3VibGVQYWNrYWdlKCkpCisgICAgICAgIHJldHVybiBMb29wLT5NYXNzOworICAgICAgcmV0dXJuIExvb3AtPlBhcmVudC0+TWFzczsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIEhhcyBDb250YWluaW5nTG9vcCBiZWVuIHBhY2thZ2VkIHVwPworICAgIGJvb2wgaXNQYWNrYWdlZCgpIGNvbnN0IHsgcmV0dXJuIGdldFJlc29sdmVkTm9kZSgpICE9IE5vZGU7IH0KKworICAgIC8vLyBcYnJpZWYgSGFzIExvb3AgYmVlbiBwYWNrYWdlZCB1cD8KKyAgICBib29sIGlzQVBhY2thZ2UoKSBjb25zdCB7IHJldHVybiBpc0xvb3BIZWFkZXIoKSAmJiBMb29wLT5Jc1BhY2thZ2VkOyB9CisKKyAgICAvLy8gXGJyaWVmIEhhcyBMb29wIGJlZW4gcGFja2FnZWQgdXAgdHdpY2U/CisgICAgYm9vbCBpc0FEb3VibGVQYWNrYWdlKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzRG91YmxlTG9vcEhlYWRlcigpICYmIExvb3AtPlBhcmVudC0+SXNQYWNrYWdlZDsKKyAgICB9CisgIH07CisKKyAgLy8vIFxicmllZiBVbnNjYWxlZCBwcm9iYWJpbGl0eSB3ZWlnaHQuCisgIC8vLworICAvLy8gUHJvYmFiaWxpdHkgd2VpZ2h0IGZvciBhbiBlZGdlIGluIHRoZSBncmFwaCAoaW5jbHVkaW5nIHRoZQorICAvLy8gc3VjY2Vzc29yL3RhcmdldCBub2RlKS4KKyAgLy8vCisgIC8vLyBBbGwgZWRnZXMgaW4gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGFyZSAzMi1iaXQuICBIb3dldmVyLCBleGl0IGVkZ2VzIGZyb20KKyAgLy8vIGxvb3AgcGFja2FnZXMgYXJlIHRha2VuIGZyb20gNjQtYml0IGV4aXQgbWFzc2VzLCBzbyB3ZSBuZWVkIDY0LWJpdHMgb2YKKyAgLy8vIHNwYWNlIGluIGdlbmVyYWwuCisgIC8vLworICAvLy8gSW4gYWRkaXRpb24gdG8gdGhlIHJhdyB3ZWlnaHQgYW1vdW50LCBXZWlnaHQgc3RvcmVzIHRoZSB0eXBlIG9mIHRoZSBlZGdlCisgIC8vLyBpbiB0aGUgY3VycmVudCBjb250ZXh0IChpLmUuLCB0aGUgY29udGV4dCBvZiB0aGUgbG9vcCBiZWluZyBwcm9jZXNzZWQpLgorICAvLy8gSXMgdGhpcyBhIGxvY2FsIGVkZ2Ugd2l0aGluIHRoZSBsb29wLCBhbiBleGl0IGZyb20gdGhlIGxvb3AsIG9yIGEKKyAgLy8vIGJhY2tlZGdlIHRvIHRoZSBsb29wIGhlYWRlcj8KKyAgc3RydWN0IFdlaWdodCB7CisgICAgZW51bSBEaXN0VHlwZSB7IExvY2FsLCBFeGl0LCBCYWNrZWRnZSB9OworICAgIERpc3RUeXBlIFR5cGUgPSBMb2NhbDsKKyAgICBCbG9ja05vZGUgVGFyZ2V0Tm9kZTsKKyAgICB1aW50NjRfdCBBbW91bnQgPSAwOworCisgICAgV2VpZ2h0KCkgPSBkZWZhdWx0OworICAgIFdlaWdodChEaXN0VHlwZSBUeXBlLCBCbG9ja05vZGUgVGFyZ2V0Tm9kZSwgdWludDY0X3QgQW1vdW50KQorICAgICAgICA6IFR5cGUoVHlwZSksIFRhcmdldE5vZGUoVGFyZ2V0Tm9kZSksIEFtb3VudChBbW91bnQpIHt9CisgIH07CisKKyAgLy8vIFxicmllZiBEaXN0cmlidXRpb24gb2YgdW5zY2FsZWQgcHJvYmFiaWxpdHkgd2VpZ2h0LgorICAvLy8KKyAgLy8vIERpc3RyaWJ1dGlvbiBvZiB1bnNjYWxlZCBwcm9iYWJpbGl0eSB3ZWlnaHQgdG8gYSBzZXQgb2Ygc3VjY2Vzc29ycy4KKyAgLy8vCisgIC8vLyBUaGlzIGNsYXNzIGNvbGxhdGVzIHRoZSBzdWNjZXNzb3IgZWRnZSB3ZWlnaHRzIGZvciBsYXRlciBwcm9jZXNzaW5nLgorICAvLy8KKyAgLy8vIFxhIERpZE92ZXJmbG93IGluZGljYXRlcyB3aGV0aGVyIFxhIFRvdGFsIGRpZCBvdmVyZmxvdyB3aGlsZSBhZGRpbmcgdG8KKyAgLy8vIHRoZSBkaXN0cmlidXRpb24uICBJdCBzaG91bGQgbmV2ZXIgb3ZlcmZsb3cgdHdpY2UuCisgIHN0cnVjdCBEaXN0cmlidXRpb24geworICAgIHVzaW5nIFdlaWdodExpc3QgPSBTbWFsbFZlY3RvcjxXZWlnaHQsIDQ+OworCisgICAgV2VpZ2h0TGlzdCBXZWlnaHRzOyAgICAgICAvLy88IEluZGl2aWR1YWwgc3VjY2Vzc29yIHdlaWdodHMuCisgICAgdWludDY0X3QgVG90YWwgPSAwOyAgICAgICAvLy88IFN1bSBvZiBhbGwgd2VpZ2h0cy4KKyAgICBib29sIERpZE92ZXJmbG93ID0gZmFsc2U7IC8vLzwgV2hldGhlciBcYSBUb3RhbCBkaWQgb3ZlcmZsb3cuCisKKyAgICBEaXN0cmlidXRpb24oKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGFkZExvY2FsKGNvbnN0IEJsb2NrTm9kZSAmTm9kZSwgdWludDY0X3QgQW1vdW50KSB7CisgICAgICBhZGQoTm9kZSwgQW1vdW50LCBXZWlnaHQ6OkxvY2FsKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZEV4aXQoY29uc3QgQmxvY2tOb2RlICZOb2RlLCB1aW50NjRfdCBBbW91bnQpIHsKKyAgICAgIGFkZChOb2RlLCBBbW91bnQsIFdlaWdodDo6RXhpdCk7CisgICAgfQorCisgICAgdm9pZCBhZGRCYWNrZWRnZShjb25zdCBCbG9ja05vZGUgJk5vZGUsIHVpbnQ2NF90IEFtb3VudCkgeworICAgICAgYWRkKE5vZGUsIEFtb3VudCwgV2VpZ2h0OjpCYWNrZWRnZSk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBOb3JtYWxpemUgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAvLy8KKyAgICAvLy8gQ29tYmluZXMgbXVsdGlwbGUgZWRnZXMgdG8gdGhlIHNhbWUgXGEgV2VpZ2h0OjpUYXJnZXROb2RlIGFuZCBzY2FsZXMKKyAgICAvLy8gZG93biBzbyB0aGF0IFxhIFRvdGFsIGZpdHMgaW50byAzMi1iaXRzLgorICAgIC8vLworICAgIC8vLyBUaGlzIGlzIGxpbmVhciBpbiB0aGUgc2l6ZSBvZiBcYSBXZWlnaHRzLiAgRm9yIHRoZSB2YXN0IG1ham9yaXR5IG9mCisgICAgLy8vIGNhc2VzLCBhZGphY2VudCBlZGdlIHdlaWdodHMgYXJlIGNvbWJpbmVkIGJ5IHNvcnRpbmcgV2VpZ2h0TGlzdCBhbmQKKyAgICAvLy8gY29tYmluaW5nIGFkamFjZW50IHdlaWdodHMuICBIb3dldmVyLCBmb3IgdmVyeSBsYXJnZSBlZGdlIGxpc3RzIGFuCisgICAgLy8vIGF1eGlsaWFyeSBoYXNoIHRhYmxlIGlzIHVzZWQuCisgICAgdm9pZCBub3JtYWxpemUoKTsKKworICBwcml2YXRlOgorICAgIHZvaWQgYWRkKGNvbnN0IEJsb2NrTm9kZSAmTm9kZSwgdWludDY0X3QgQW1vdW50LCBXZWlnaHQ6OkRpc3RUeXBlIFR5cGUpOworICB9OworCisgIC8vLyBcYnJpZWYgRGF0YSBhYm91dCBlYWNoIGJsb2NrLiAgVGhpcyBpcyB1c2VkIGRvd25zdHJlYW0uCisgIHN0ZDo6dmVjdG9yPEZyZXF1ZW5jeURhdGE+IEZyZXFzOworCisgIC8vLyBcYnJpZWYgV2hldGhlciBlYWNoIGJsb2NrIGlzIGFuIGlycmVkdWNpYmxlIGxvb3AgaGVhZGVyLgorICAvLy8gVGhpcyBpcyB1c2VkIGRvd25zdHJlYW0uCisgIFNwYXJzZUJpdFZlY3Rvcjw+IElzSXJyTG9vcEhlYWRlcjsKKworICAvLy8gXGJyaWVmIExvb3AgZGF0YTogc2VlIGluaXRpYWxpemVMb29wcygpLgorICBzdGQ6OnZlY3RvcjxXb3JraW5nRGF0YT4gV29ya2luZzsKKworICAvLy8gXGJyaWVmIEluZGV4ZWQgaW5mb3JtYXRpb24gYWJvdXQgbG9vcHMuCisgIHN0ZDo6bGlzdDxMb29wRGF0YT4gTG9vcHM7CisKKyAgLy8vIFxicmllZiBWaXJ0dWFsIGRlc3RydWN0b3IuCisgIC8vLworICAvLy8gTmVlZCBhIHZpcnR1YWwgZGVzdHJ1Y3RvciB0byBtYXNrIHRoZSBjb21waWxlciB3YXJuaW5nIGFib3V0CisgIC8vLyBnZXRCbG9ja05hbWUoKS4KKyAgdmlydHVhbCB+QmxvY2tGcmVxdWVuY3lJbmZvSW1wbEJhc2UoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBBZGQgYWxsIGVkZ2VzIG91dCBvZiBhIHBhY2thZ2VkIGxvb3AgdG8gdGhlIGRpc3RyaWJ1dGlvbi4KKyAgLy8vCisgIC8vLyBBZGRzIGFsbCBlZGdlcyBmcm9tIExvY2FsTG9vcEhlYWQgdG8gRGlzdC4gIENhbGxzIGFkZFRvRGlzdCgpIHRvIGFkZCBlYWNoCisgIC8vLyBzdWNjZXNzb3IgZWRnZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFxjIHRydWUgdW5sZXNzIHRoZXJlJ3MgYW4gaXJyZWR1Y2libGUgYmFja2VkZ2UuCisgIGJvb2wgYWRkTG9vcFN1Y2Nlc3NvcnNUb0Rpc3QoY29uc3QgTG9vcERhdGEgKk91dGVyTG9vcCwgTG9vcERhdGEgJkxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzdHJpYnV0aW9uICZEaXN0KTsKKworICAvLy8gXGJyaWVmIEFkZCBhbiBlZGdlIHRvIHRoZSBkaXN0cmlidXRpb24uCisgIC8vLworICAvLy8gQWRkcyBhbiBlZGdlIHRvIFN1Y2MgdG8gRGlzdC4gIElmIFxjIExvb3BIZWFkLmlzVmFsaWQoKSwgdGhlbiB3aGV0aGVyIHRoZQorICAvLy8gZWRnZSBpcyBsb2NhbC9leGl0L2JhY2tlZGdlIGlzIGluIHRoZSBjb250ZXh0IG9mIExvb3BIZWFkLiAgT3RoZXJ3aXNlLAorICAvLy8gZXZlcnkgZWRnZSBzaG91bGQgYmUgYSBsb2NhbCBlZGdlIChzaW5jZSBhbGwgdGhlIGxvb3BzIGFyZSBwYWNrYWdlZCB1cCkuCisgIC8vLworICAvLy8gXHJldHVybiBcYyB0cnVlIHVubGVzcyBhYm9ydGVkIGR1ZSB0byBhbiBpcnJlZHVjaWJsZSBiYWNrZWRnZS4KKyAgYm9vbCBhZGRUb0Rpc3QoRGlzdHJpYnV0aW9uICZEaXN0LCBjb25zdCBMb29wRGF0YSAqT3V0ZXJMb29wLAorICAgICAgICAgICAgICAgICBjb25zdCBCbG9ja05vZGUgJlByZWQsIGNvbnN0IEJsb2NrTm9kZSAmU3VjYywgdWludDY0X3QgV2VpZ2h0KTsKKworICBMb29wRGF0YSAmZ2V0TG9vcFBhY2thZ2UoY29uc3QgQmxvY2tOb2RlICZIZWFkKSB7CisgICAgYXNzZXJ0KEhlYWQuSW5kZXggPCBXb3JraW5nLnNpemUoKSk7CisgICAgYXNzZXJ0KFdvcmtpbmdbSGVhZC5JbmRleF0uaXNMb29wSGVhZGVyKCkpOworICAgIHJldHVybiAqV29ya2luZ1tIZWFkLkluZGV4XS5Mb29wOworICB9CisKKyAgLy8vIFxicmllZiBBbmFseXplIGlycmVkdWNpYmxlIFNDQ3MuCisgIC8vLworICAvLy8gU2VwYXJhdGUgaXJyZWR1Y2libGUgU0NDcyBmcm9tIFxjIEcsIHdoaWNoIGlzIGFuIGV4cGxpY3QgZ3JhcGggb2YgXGMKKyAgLy8vIE91dGVyTG9vcCAob3IgdGhlIHRvcC1sZXZlbCBmdW5jdGlvbiwgaWYgXGMgT3V0ZXJMb29wIGlzIFxjIG51bGxwdHIpLgorICAvLy8gSW5zZXJ0IHRoZW0gaW50byBcYSBMb29wcyBiZWZvcmUgXGMgSW5zZXJ0LgorICAvLy8KKyAgLy8vIFxyZXR1cm4gdGhlIFxjIExvb3BEYXRhIG5vZGVzIHJlcHJlc2VudGluZyB0aGUgaXJyZWR1Y2libGUgU0NDcy4KKyAgaXRlcmF0b3JfcmFuZ2U8c3RkOjpsaXN0PExvb3BEYXRhPjo6aXRlcmF0b3I+CisgIGFuYWx5emVJcnJlZHVjaWJsZShjb25zdCBiZmlfZGV0YWlsOjpJcnJlZHVjaWJsZUdyYXBoICZHLCBMb29wRGF0YSAqT3V0ZXJMb29wLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PExvb3BEYXRhPjo6aXRlcmF0b3IgSW5zZXJ0KTsKKworICAvLy8gXGJyaWVmIFVwZGF0ZSBhIGxvb3AgYWZ0ZXIgcGFja2FnaW5nIGlycmVkdWNpYmxlIFNDQ3MgaW5zaWRlIG9mIGl0LgorICAvLy8KKyAgLy8vIFVwZGF0ZSBcYyBPdXRlckxvb3AuICBCZWZvcmUgZmluZGluZyBpcnJlZHVjaWJsZSBjb250cm9sIGZsb3csIGl0IHdhcworICAvLy8gcGFydHdheSB0aHJvdWdoIFxhIGNvbXB1dGVNYXNzSW5Mb29wKCksIHNvIFxhIExvb3BEYXRhOjpFeGl0cyBhbmQgXGEKKyAgLy8vIExvb3BEYXRhOjpCYWNrZWRnZU1hc3MgbmVlZCB0byBiZSByZXNldC4gIEFsc28sIG5vZGVzIHRoYXQgd2VyZSBwYWNrYWdlZAorICAvLy8gdXAgbmVlZCB0byBiZSByZW1vdmVkIGZyb20gXGEgT3V0ZXJMb29wOjpOb2Rlcy4KKyAgdm9pZCB1cGRhdGVMb29wV2l0aElycmVkdWNpYmxlKExvb3BEYXRhICZPdXRlckxvb3ApOworCisgIC8vLyBcYnJpZWYgRGlzdHJpYnV0ZSBtYXNzIGFjY29yZGluZyB0byBhIGRpc3RyaWJ1dGlvbi4KKyAgLy8vCisgIC8vLyBEaXN0cmlidXRlcyB0aGUgbWFzcyBpbiBTb3VyY2UgYWNjb3JkaW5nIHRvIERpc3QuICBJZiBMb29wSGVhZC5pc1ZhbGlkKCksCisgIC8vLyBiYWNrZWRnZXMgYW5kIGV4aXRzIGFyZSBzdG9yZWQgaW4gaXRzIGVudHJ5IGluIExvb3BzLgorICAvLy8KKyAgLy8vIE1hc3MgaXMgZGlzdHJpYnV0ZWQgaW4gcGFyYWxsZWwgZnJvbSB0d28gY29waWVzIG9mIHRoZSBzb3VyY2UgbWFzcy4KKyAgdm9pZCBkaXN0cmlidXRlTWFzcyhjb25zdCBCbG9ja05vZGUgJlNvdXJjZSwgTG9vcERhdGEgKk91dGVyTG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICBEaXN0cmlidXRpb24gJkRpc3QpOworCisgIC8vLyBcYnJpZWYgQ29tcHV0ZSB0aGUgbG9vcCBzY2FsZSBmb3IgYSBsb29wLgorICB2b2lkIGNvbXB1dGVMb29wU2NhbGUoTG9vcERhdGEgJkxvb3ApOworCisgIC8vLyBBZGp1c3QgdGhlIG1hc3Mgb2YgYWxsIGhlYWRlcnMgaW4gYW4gaXJyZWR1Y2libGUgbG9vcC4KKyAgLy8vCisgIC8vLyBJbml0aWFsbHksIGlycmVkdWNpYmxlIGxvb3BzIGFyZSBhc3N1bWVkIHRvIGRpc3RyaWJ1dGUgdGhlaXIgbWFzcworICAvLy8gZXF1YWxseSBhbW9uZyBpdHMgaGVhZGVycy4gVGhpcyBjYW4gbGVhZCB0byB3cm9uZyBmcmVxdWVuY3kgZXN0aW1hdGVzCisgIC8vLyBzaW5jZSBzb21lIGhlYWRlcnMgbWF5IGJlIGV4ZWN1dGVkIG1vcmUgZnJlcXVlbnRseSB0aGFuIG90aGVycy4KKyAgLy8vCisgIC8vLyBUaGlzIGFkanVzdHMgaGVhZGVyIG1hc3MgZGlzdHJpYnV0aW9uIHNvIGl0IG1hdGNoZXMgdGhlIHdlaWdodHMgb2YKKyAgLy8vIHRoZSBiYWNrZWRnZXMgZ29pbmcgaW50byBlYWNoIG9mIHRoZSBsb29wIGhlYWRlcnMuCisgIHZvaWQgYWRqdXN0TG9vcEhlYWRlck1hc3MoTG9vcERhdGEgJkxvb3ApOworCisgIHZvaWQgZGlzdHJpYnV0ZUlyckxvb3BIZWFkZXJNYXNzKERpc3RyaWJ1dGlvbiAmRGlzdCk7CisKKyAgLy8vIFxicmllZiBQYWNrYWdlIHVwIGEgbG9vcC4KKyAgdm9pZCBwYWNrYWdlTG9vcChMb29wRGF0YSAmTG9vcCk7CisKKyAgLy8vIFxicmllZiBVbndyYXAgbG9vcHMuCisgIHZvaWQgdW53cmFwTG9vcHMoKTsKKworICAvLy8gXGJyaWVmIEZpbmFsaXplIGZyZXF1ZW5jeSBtZXRyaWNzLgorICAvLy8KKyAgLy8vIENhbGN1bGF0ZXMgZmluYWwgZnJlcXVlbmNpZXMgYW5kIGNsZWFucyB1cCBuby1sb25nZXItbmVlZGVkIGRhdGEKKyAgLy8vIHN0cnVjdHVyZXMuCisgIHZvaWQgZmluYWxpemVNZXRyaWNzKCk7CisKKyAgLy8vIFxicmllZiBDbGVhciBhbGwgbWVtb3J5LgorICB2b2lkIGNsZWFyKCk7CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRCbG9ja05hbWUoY29uc3QgQmxvY2tOb2RlICZOb2RlKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgZ2V0TG9vcE5hbWUoY29uc3QgTG9vcERhdGEgJkxvb3ApIGNvbnN0OworCisgIHZpcnR1YWwgcmF3X29zdHJlYW0gJnByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeyByZXR1cm4gT1M7IH0KKyAgdm9pZCBkdW1wKCkgY29uc3QgeyBwcmludChkYmdzKCkpOyB9CisKKyAgU2NhbGVkNjQgZ2V0RmxvYXRpbmdCbG9ja0ZyZXEoY29uc3QgQmxvY2tOb2RlICZOb2RlKSBjb25zdDsKKworICBCbG9ja0ZyZXF1ZW5jeSBnZXRCbG9ja0ZyZXEoY29uc3QgQmxvY2tOb2RlICZOb2RlKSBjb25zdDsKKyAgT3B0aW9uYWw8dWludDY0X3Q+IGdldEJsb2NrUHJvZmlsZUNvdW50KGNvbnN0IEZ1bmN0aW9uICZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvY2tOb2RlICZOb2RlKSBjb25zdDsKKyAgT3B0aW9uYWw8dWludDY0X3Q+IGdldFByb2ZpbGVDb3VudEZyb21GcmVxKGNvbnN0IEZ1bmN0aW9uICZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgRnJlcSkgY29uc3Q7CisgIGJvb2wgaXNJcnJMb29wSGVhZGVyKGNvbnN0IEJsb2NrTm9kZSAmTm9kZSk7CisKKyAgdm9pZCBzZXRCbG9ja0ZyZXEoY29uc3QgQmxvY2tOb2RlICZOb2RlLCB1aW50NjRfdCBGcmVxKTsKKworICByYXdfb3N0cmVhbSAmcHJpbnRCbG9ja0ZyZXEocmF3X29zdHJlYW0gJk9TLCBjb25zdCBCbG9ja05vZGUgJk5vZGUpIGNvbnN0OworICByYXdfb3N0cmVhbSAmcHJpbnRCbG9ja0ZyZXEocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvY2tGcmVxdWVuY3kgJkZyZXEpIGNvbnN0OworCisgIHVpbnQ2NF90IGdldEVudHJ5RnJlcSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIUZyZXFzLmVtcHR5KCkpOworICAgIHJldHVybiBGcmVxc1swXS5JbnRlZ2VyOworICB9Cit9OworCituYW1lc3BhY2UgYmZpX2RldGFpbCB7CisKK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1Q+IHN0cnVjdCBUeXBlTWFwIHt9OwordGVtcGxhdGUgPD4gc3RydWN0IFR5cGVNYXA8QmFzaWNCbG9jaz4geworICB1c2luZyBCbG9ja1QgPSBCYXNpY0Jsb2NrOworICB1c2luZyBGdW5jdGlvblQgPSBGdW5jdGlvbjsKKyAgdXNpbmcgQnJhbmNoUHJvYmFiaWxpdHlJbmZvVCA9IEJyYW5jaFByb2JhYmlsaXR5SW5mbzsKKyAgdXNpbmcgTG9vcFQgPSBMb29wOworICB1c2luZyBMb29wSW5mb1QgPSBMb29wSW5mbzsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVHlwZU1hcDxNYWNoaW5lQmFzaWNCbG9jaz4geworICB1c2luZyBCbG9ja1QgPSBNYWNoaW5lQmFzaWNCbG9jazsKKyAgdXNpbmcgRnVuY3Rpb25UID0gTWFjaGluZUZ1bmN0aW9uOworICB1c2luZyBCcmFuY2hQcm9iYWJpbGl0eUluZm9UID0gTWFjaGluZUJyYW5jaFByb2JhYmlsaXR5SW5mbzsKKyAgdXNpbmcgTG9vcFQgPSBNYWNoaW5lTG9vcDsKKyAgdXNpbmcgTG9vcEluZm9UID0gTWFjaGluZUxvb3BJbmZvOworfTsKKworLy8vIFxicmllZiBHZXQgdGhlIG5hbWUgb2YgYSBNYWNoaW5lQmFzaWNCbG9jay4KKy8vLworLy8vIEdldCB0aGUgbmFtZSBvZiBhIE1hY2hpbmVCYXNpY0Jsb2NrLiAgSXQncyB0ZW1wbGF0ZWQgc28gdGhhdCBpbmNsdWRpbmcgZnJvbQorLy8vIENvZGVHZW4gaXMgdW5uZWNlc3NhcnkgKHRoYXQgd291bGQgYmUgYSBsYXllcmluZyBpc3N1ZSkuCisvLy8KKy8vLyBUaGlzIGlzIHVzZWQgbWFpbmx5IGZvciBkZWJ1ZyBvdXRwdXQuICBUaGUgbmFtZSBpcyBzaW1pbGFyIHRvCisvLy8gTWFjaGluZUJhc2ljQmxvY2s6OmdldEZ1bGxOYW1lKCksIGJ1dCBza2lwcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tUPiBzdGQ6OnN0cmluZyBnZXRCbG9ja05hbWUoY29uc3QgQmxvY2tUICpCQikgeworICBhc3NlcnQoQkIgJiYgIlVuZXhwZWN0ZWQgbnVsbHB0ciIpOworICBhdXRvIE1hY2hpbmVOYW1lID0gIkJCIiArIFR3aW5lKEJCLT5nZXROdW1iZXIoKSk7CisgIGlmIChCQi0+Z2V0QmFzaWNCbG9jaygpKQorICAgIHJldHVybiAoTWFjaGluZU5hbWUgKyAiWyIgKyBCQi0+Z2V0TmFtZSgpICsgIl0iKS5zdHIoKTsKKyAgcmV0dXJuIE1hY2hpbmVOYW1lLnN0cigpOworfQorLy8vIFxicmllZiBHZXQgdGhlIG5hbWUgb2YgYSBCYXNpY0Jsb2NrLgordGVtcGxhdGUgPD4gaW5saW5lIHN0ZDo6c3RyaW5nIGdldEJsb2NrTmFtZShjb25zdCBCYXNpY0Jsb2NrICpCQikgeworICBhc3NlcnQoQkIgJiYgIlVuZXhwZWN0ZWQgbnVsbHB0ciIpOworICByZXR1cm4gQkItPmdldE5hbWUoKS5zdHIoKTsKK30KKworLy8vIFxicmllZiBHcmFwaCBvZiBpcnJlZHVjaWJsZSBjb250cm9sIGZsb3cuCisvLy8KKy8vLyBUaGlzIGdyYXBoIGlzIHVzZWQgZm9yIGRldGVybWluaW5nIHRoZSBTQ0NzIGluIGEgbG9vcCAob3IgdG9wLWxldmVsCisvLy8gZnVuY3Rpb24pIHRoYXQgaGFzIGlycmVkdWNpYmxlIGNvbnRyb2wgZmxvdy4KKy8vLworLy8vIER1cmluZyB0aGUgYmxvY2sgZnJlcXVlbmN5IGFsZ29yaXRobSwgdGhlIGxvY2FsIGdyYXBocyBhcmUgZGVmaW5lZCBpbiBhCisvLy8gbGlnaHQtd2VpZ2h0IHdheSwgZGVmZXJyaW5nIHRvIHRoZSBcYSBCYXNpY0Jsb2NrIG9yIFxhIE1hY2hpbmVCYXNpY0Jsb2NrCisvLy8gZ3JhcGhzIGZvciBtb3N0IGVkZ2VzLCBidXQgZ2V0dGluZyBvdGhlcnMgZnJvbSBcYSBMb29wRGF0YTo6RXhpdE1hcC4gIFRoZQorLy8vIGxhdHRlciBvbmx5IGhhcyBzdWNjZXNzb3IgaW5mb3JtYXRpb24uCisvLy8KKy8vLyBcYSBJcnJlZHVjaWJsZUdyYXBoIG1ha2VzIHRoaXMgZ3JhcGggZXhwbGljaXQuICBJdCdzIGluIGEgZm9ybSB0aGF0IGNhbiB1c2UKKy8vLyBcYSBHcmFwaFRyYWl0cyAoc28gdGhhdCBcYSBhbmFseXplSXJyZWR1Y2libGUoKSBjYW4gdXNlIFxhIHNjY19pdGVyYXRvciksCisvLy8gYW5kIGl0IGV4cGxpY2l0bHkgbGlzdHMgcHJlZGVjZXNzb3JzIGFuZCBzdWNjZXNzb3JzLiAgVGhlIGluaXRpYWxpemF0aW9uCisvLy8gdGhhdCByZWxpZXMgb24gXGMgTWFjaGluZUJhc2ljQmxvY2sgaXMgZGVmaW5lZCBpbiB0aGUgaGVhZGVyLgorc3RydWN0IElycmVkdWNpYmxlR3JhcGggeworICB1c2luZyBCRklCYXNlID0gQmxvY2tGcmVxdWVuY3lJbmZvSW1wbEJhc2U7CisKKyAgQkZJQmFzZSAmQkZJOworCisgIHVzaW5nIEJsb2NrTm9kZSA9IEJGSUJhc2U6OkJsb2NrTm9kZTsKKyAgc3RydWN0IElyck5vZGUgeworICAgIEJsb2NrTm9kZSBOb2RlOworICAgIHVuc2lnbmVkIE51bUluID0gMDsKKyAgICBzdGQ6OmRlcXVlPGNvbnN0IElyck5vZGUgKj4gRWRnZXM7CisKKyAgICBJcnJOb2RlKGNvbnN0IEJsb2NrTm9kZSAmTm9kZSkgOiBOb2RlKE5vZGUpIHt9CisKKyAgICB1c2luZyBpdGVyYXRvciA9IHN0ZDo6ZGVxdWU8Y29uc3QgSXJyTm9kZSAqPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgICBpdGVyYXRvciBwcmVkX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gRWRnZXMuYmVnaW4oKTsgfQorICAgIGl0ZXJhdG9yIHN1Y2NfYmVnaW4oKSBjb25zdCB7IHJldHVybiBFZGdlcy5iZWdpbigpICsgTnVtSW47IH0KKyAgICBpdGVyYXRvciBwcmVkX2VuZCgpIGNvbnN0IHsgcmV0dXJuIHN1Y2NfYmVnaW4oKTsgfQorICAgIGl0ZXJhdG9yIHN1Y2NfZW5kKCkgY29uc3QgeyByZXR1cm4gRWRnZXMuZW5kKCk7IH0KKyAgfTsKKyAgQmxvY2tOb2RlIFN0YXJ0OworICBjb25zdCBJcnJOb2RlICpTdGFydElyciA9IG51bGxwdHI7CisgIHN0ZDo6dmVjdG9yPElyck5vZGU+IE5vZGVzOworICBTbWFsbERlbnNlTWFwPHVpbnQzMl90LCBJcnJOb2RlICosIDQ+IExvb2t1cDsKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBleHBsaWNpdCBncmFwaCBjb250YWluaW5nIGlycmVkdWNpYmxlIGNvbnRyb2wgZmxvdy4KKyAgLy8vCisgIC8vLyBDb25zdHJ1Y3QgYW4gZXhwbGljaXQgZ3JhcGggb2YgdGhlIGNvbnRyb2wgZmxvdyBpbiBcYyBPdXRlckxvb3AgKG9yIHRoZQorICAvLy8gdG9wLWxldmVsIGZ1bmN0aW9uLCBpZiBcYyBPdXRlckxvb3AgaXMgXGMgbnVsbHB0cikuICBVc2VzIFxjCisgIC8vLyBhZGRCbG9ja0VkZ2VzIHRvIGFkZCBibG9jayBzdWNjZXNzb3JzIHRoYXQgaGF2ZSBub3QgYmVlbiBwYWNrYWdlZCBpbnRvCisgIC8vLyBsb29wcy4KKyAgLy8vCisgIC8vLyBcYSBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsOjpjb21wdXRlSXJyZWR1Y2libGVNYXNzKCkgaXMgdGhlIG9ubHkgZXhwZWN0ZWQKKyAgLy8vIHVzZXIgb2YgdGhpcy4KKyAgdGVtcGxhdGUgPGNsYXNzIEJsb2NrRWRnZXNBZGRlcj4KKyAgSXJyZWR1Y2libGVHcmFwaChCRklCYXNlICZCRkksIGNvbnN0IEJGSUJhc2U6Okxvb3BEYXRhICpPdXRlckxvb3AsCisgICAgICAgICAgICAgICAgICAgQmxvY2tFZGdlc0FkZGVyIGFkZEJsb2NrRWRnZXMpIDogQkZJKEJGSSkgeworICAgIGluaXRpYWxpemUoT3V0ZXJMb29wLCBhZGRCbG9ja0VkZ2VzKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBCbG9ja0VkZ2VzQWRkZXI+CisgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBCRklCYXNlOjpMb29wRGF0YSAqT3V0ZXJMb29wLAorICAgICAgICAgICAgICAgICAgQmxvY2tFZGdlc0FkZGVyIGFkZEJsb2NrRWRnZXMpOworICB2b2lkIGFkZE5vZGVzSW5Mb29wKGNvbnN0IEJGSUJhc2U6Okxvb3BEYXRhICZPdXRlckxvb3ApOworICB2b2lkIGFkZE5vZGVzSW5GdW5jdGlvbigpOworCisgIHZvaWQgYWRkTm9kZShjb25zdCBCbG9ja05vZGUgJk5vZGUpIHsKKyAgICBOb2Rlcy5lbXBsYWNlX2JhY2soTm9kZSk7CisgICAgQkZJLldvcmtpbmdbTm9kZS5JbmRleF0uZ2V0TWFzcygpID0gQmxvY2tNYXNzOjpnZXRFbXB0eSgpOworICB9CisKKyAgdm9pZCBpbmRleE5vZGVzKCk7CisgIHRlbXBsYXRlIDxjbGFzcyBCbG9ja0VkZ2VzQWRkZXI+CisgIHZvaWQgYWRkRWRnZXMoY29uc3QgQmxvY2tOb2RlICZOb2RlLCBjb25zdCBCRklCYXNlOjpMb29wRGF0YSAqT3V0ZXJMb29wLAorICAgICAgICAgICAgICAgIEJsb2NrRWRnZXNBZGRlciBhZGRCbG9ja0VkZ2VzKTsKKyAgdm9pZCBhZGRFZGdlKElyck5vZGUgJklyciwgY29uc3QgQmxvY2tOb2RlICZTdWNjLAorICAgICAgICAgICAgICAgY29uc3QgQkZJQmFzZTo6TG9vcERhdGEgKk91dGVyTG9vcCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tFZGdlc0FkZGVyPgordm9pZCBJcnJlZHVjaWJsZUdyYXBoOjppbml0aWFsaXplKGNvbnN0IEJGSUJhc2U6Okxvb3BEYXRhICpPdXRlckxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tFZGdlc0FkZGVyIGFkZEJsb2NrRWRnZXMpIHsKKyAgaWYgKE91dGVyTG9vcCkgeworICAgIGFkZE5vZGVzSW5Mb29wKCpPdXRlckxvb3ApOworICAgIGZvciAoYXV0byBOIDogT3V0ZXJMb29wLT5Ob2RlcykKKyAgICAgIGFkZEVkZ2VzKE4sIE91dGVyTG9vcCwgYWRkQmxvY2tFZGdlcyk7CisgIH0gZWxzZSB7CisgICAgYWRkTm9kZXNJbkZ1bmN0aW9uKCk7CisgICAgZm9yICh1aW50MzJfdCBJbmRleCA9IDA7IEluZGV4IDwgQkZJLldvcmtpbmcuc2l6ZSgpOyArK0luZGV4KQorICAgICAgYWRkRWRnZXMoSW5kZXgsIE91dGVyTG9vcCwgYWRkQmxvY2tFZGdlcyk7CisgIH0KKyAgU3RhcnRJcnIgPSBMb29rdXBbU3RhcnQuSW5kZXhdOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tFZGdlc0FkZGVyPgordm9pZCBJcnJlZHVjaWJsZUdyYXBoOjphZGRFZGdlcyhjb25zdCBCbG9ja05vZGUgJk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJGSUJhc2U6Okxvb3BEYXRhICpPdXRlckxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrRWRnZXNBZGRlciBhZGRCbG9ja0VkZ2VzKSB7CisgIGF1dG8gTCA9IExvb2t1cC5maW5kKE5vZGUuSW5kZXgpOworICBpZiAoTCA9PSBMb29rdXAuZW5kKCkpCisgICAgcmV0dXJuOworICBJcnJOb2RlICZJcnIgPSAqTC0+c2Vjb25kOworICBjb25zdCBhdXRvICZXb3JraW5nID0gQkZJLldvcmtpbmdbTm9kZS5JbmRleF07CisKKyAgaWYgKFdvcmtpbmcuaXNBUGFja2FnZSgpKQorICAgIGZvciAoY29uc3QgYXV0byAmSSA6IFdvcmtpbmcuTG9vcC0+RXhpdHMpCisgICAgICBhZGRFZGdlKElyciwgSS5maXJzdCwgT3V0ZXJMb29wKTsKKyAgZWxzZQorICAgIGFkZEJsb2NrRWRnZXMoKnRoaXMsIElyciwgT3V0ZXJMb29wKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGJmaV9kZXRhaWwKKworLy8vIFxicmllZiBTaGFyZWQgaW1wbGVtZW50YXRpb24gZm9yIGJsb2NrIGZyZXF1ZW5jeSBhbmFseXNpcy4KKy8vLworLy8vIFRoaXMgaXMgYSBzaGFyZWQgaW1wbGVtZW50YXRpb24gb2YgQmxvY2tGcmVxdWVuY3lJbmZvIGFuZAorLy8vIE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8sIGFuZCBjYWxjdWxhdGVzIHRoZSByZWxhdGl2ZSBmcmVxdWVuY2llcyBvZgorLy8vIGJsb2Nrcy4KKy8vLworLy8vIExvb3BJbmZvIGRlZmluZXMgYSBsb29wIGFzIGEgIm5vbi10cml2aWFsIiBTQ0MgZG9taW5hdGVkIGJ5IGEgc2luZ2xlIGJsb2NrLAorLy8vIHdoaWNoIGlzIGNhbGxlZCB0aGUgaGVhZGVyLiAgQSBnaXZlbiBsb29wLCBMLCBjYW4gaGF2ZSBzdWItbG9vcHMsIHdoaWNoIGFyZQorLy8vIGxvb3BzIHdpdGhpbiB0aGUgc3ViZ3JhcGggb2YgTCB0aGF0IGV4Y2x1ZGUgaXRzIGhlYWRlci4gIChBICJ0cml2aWFsIiBTQ0MKKy8vLyBjb25zaXN0cyBvZiBhIHNpbmdsZSBibG9jayB0aGF0IGRvZXMgbm90IGhhdmUgYSBzZWxmLWVkZ2UuKQorLy8vCisvLy8gSW4gYWRkaXRpb24gdG8gbG9vcHMsIHRoaXMgYWxnb3JpdGhtIGhhcyBsaW1pdGVkIHN1cHBvcnQgZm9yIGlycmVkdWNpYmxlCisvLy8gU0NDcywgd2hpY2ggYXJlIFNDQ3Mgd2l0aCBtdWx0aXBsZSBlbnRyeSBibG9ja3MuICBJcnJlZHVjaWJsZSBTQ0NzIGFyZQorLy8vIGRpc2NvdmVyZWQgb24gdGhleSBmbHksIGFuZCBtb2RlbGxlZCBhcyBsb29wcyB3aXRoIG11bHRpcGxlIGhlYWRlcnMuCisvLy8KKy8vLyBUaGUgaGVhZGVycyBvZiBpcnJlZHVjaWJsZSBzdWItU0NDcyBjb25zaXN0IG9mIGl0cyBlbnRyeSBibG9ja3MgYW5kIGFsbAorLy8vIG5vZGVzIHRoYXQgYXJlIHRhcmdldHMgb2YgYSBiYWNrZWRnZSB3aXRoaW4gaXQgKGV4Y2x1ZGluZyBiYWNrZWRnZXMgd2l0aGluCisvLy8gdHJ1ZSBzdWItbG9vcHMpLiAgQmxvY2sgZnJlcXVlbmN5IGNhbGN1bGF0aW9ucyBhY3QgYXMgaWYgYSBibG9jayBpcworLy8vIGluc2VydGVkIHRoYXQgaW50ZXJjZXB0cyBhbGwgdGhlIGVkZ2VzIHRvIHRoZSBoZWFkZXJzLiAgQWxsIGJhY2tlZGdlcyBhbmQKKy8vLyBlbnRyaWVzIHBvaW50IHRvIHRoaXMgYmxvY2suICBJdHMgc3VjY2Vzc29ycyBhcmUgdGhlIGhlYWRlcnMsIHdoaWNoIHNwbGl0CisvLy8gdGhlIGZyZXF1ZW5jeSBldmVubHkuCisvLy8KKy8vLyBUaGlzIGFsZ29yaXRobSBsZXZlcmFnZXMgQmxvY2tNYXNzIGFuZCBTY2FsZWROdW1iZXIgdG8gbWFpbnRhaW4gcHJlY2lzaW9uLAorLy8vIHNlcGFyYXRlcyBtYXNzIGRpc3RyaWJ1dGlvbiBmcm9tIGxvb3Agc2NhbGluZywgYW5kIGRpdGhlcnMgdG8gZWxpbWluYXRlCisvLy8gcHJvYmFiaWxpdHkgbWFzcyBsb3NzLgorLy8vCisvLy8gVGhlIGltcGxlbWVudGF0aW9uIGlzIHNwbGl0IGJldHdlZW4gQmxvY2tGcmVxdWVuY3lJbmZvSW1wbCwgd2hpY2gga25vd3MgdGhlCisvLy8gdHlwZSBvZiBncmFwaCBiZWluZyBtb2RlbGxlZCAoQmFzaWNCbG9jayB2cy4gTWFjaGluZUJhc2ljQmxvY2spLCBhbmQKKy8vLyBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsQmFzZSwgd2hpY2ggZG9lc24ndC4gIFRoZSBiYXNlIGNsYXNzIHVzZXMgXGEKKy8vLyBCbG9ja05vZGUsIGEgd3JhcHBlciBhcm91bmQgYSB1aW50MzJfdC4gIEJsb2NrTm9kZSBpcyBudW1iZXJlZCBmcm9tIDAgaW4KKy8vLyByZXZlcnNlLXBvc3Qgb3JkZXIuICBUaGlzIGdpdmVzIHR3byBhZHZhbnRhZ2VzOiAgaXQncyBlYXN5IHRvIGNvbXBhcmUgdGhlCisvLy8gcmVsYXRpdmUgb3JkZXJpbmcgb2YgdHdvIG5vZGVzLCBhbmQgbWFwcyBrZXllZCBvbiBCbG9ja1QgY2FuIGJlIHJlcHJlc2VudGVkCisvLy8gYnkgdmVjdG9ycy4KKy8vLworLy8vIFRoaXMgYWxnb3JpdGhtIGlzIE8oVitFKSwgdW5sZXNzIHRoZXJlIGlzIGlycmVkdWNpYmxlIGNvbnRyb2wgZmxvdywgaW4KKy8vLyB3aGljaCBjYXNlIGl0J3MgTyhWKkUpIGluIHRoZSB3b3JzdCBjYXNlLgorLy8vCisvLy8gVGhlc2UgYXJlIHRoZSBtYWluIHN0YWdlczoKKy8vLworLy8vICAwLiBSZXZlcnNlIHBvc3Qtb3JkZXIgdHJhdmVyc2FsIChcYSBpbml0aWFsaXplUlBPVCgpKS4KKy8vLworLy8vICAgICBSdW4gYSBzaW5nbGUgcG9zdC1vcmRlciB0cmF2ZXJzYWwgYW5kIHNhdmUgaXQgKGluIHJldmVyc2UpIGluIFJQT1QuCisvLy8gICAgIEFsbCBvdGhlciBzdGFnZXMgbWFrZSB1c2Ugb2YgdGhpcyBvcmRlcmluZy4gIFNhdmUgYSBsb29rdXAgZnJvbSBCbG9ja1QKKy8vLyAgICAgdG8gQmxvY2tOb2RlICh0aGUgaW5kZXggaW50byBSUE9UKSBpbiBOb2Rlcy4KKy8vLworLy8vICAxLiBMb29wIGluaXRpYWxpemF0aW9uIChcYSBpbml0aWFsaXplTG9vcHMoKSkuCisvLy8KKy8vLyAgICAgVHJhbnNsYXRlIExvb3BJbmZvL01hY2hpbmVMb29wSW5mbyBpbnRvIGEgZm9ybSBzdWl0YWJsZSBmb3IgdGhlIHJlc3Qgb2YKKy8vLyAgICAgdGhlIGFsZ29yaXRobS4gIEluIHBhcnRpY3VsYXIsIHN0b3JlIHRoZSBpbW1lZGlhdGUgbWVtYmVycyBvZiBlYWNoIGxvb3AKKy8vLyAgICAgaW4gcmV2ZXJzZSBwb3N0LW9yZGVyLgorLy8vCisvLy8gIDIuIENhbGN1bGF0ZSBtYXNzIGFuZCBzY2FsZSBpbiBsb29wcyAoXGEgY29tcHV0ZU1hc3NJbkxvb3BzKCkpLgorLy8vCisvLy8gICAgIEZvciBlYWNoIGxvb3AgKGJvdHRvbS11cCksIGRpc3RyaWJ1dGUgbWFzcyB0aHJvdWdoIHRoZSBEQUcgcmVzdWx0aW5nCisvLy8gICAgIGZyb20gaWdub3JpbmcgYmFja2VkZ2VzIGFuZCB0cmVhdGluZyBzdWItbG9vcHMgYXMgYSBzaW5nbGUgcHNldWRvLW5vZGUuCisvLy8gICAgIFRyYWNrIHRoZSBiYWNrZWRnZSBtYXNzIGRpc3RyaWJ1dGVkIHRvIHRoZSBsb29wIGhlYWRlciwgYW5kIHVzZSBpdCB0bworLy8vICAgICBjYWxjdWxhdGUgdGhlIGxvb3Agc2NhbGUgKG51bWJlciBvZiBsb29wIGl0ZXJhdGlvbnMpLiAgSW1tZWRpYXRlCisvLy8gICAgIG1lbWJlcnMgdGhhdCByZXByZXNlbnQgc3ViLWxvb3BzIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gdmlzaXRlZCBhbmQKKy8vLyAgICAgcGFja2FnZWQgaW50byBhIHBzZXVkby1ub2RlLgorLy8vCisvLy8gICAgIERpc3RyaWJ1dGluZyBtYXNzIGluIGEgbG9vcCBpcyBhIHJldmVyc2UtcG9zdC1vcmRlciB0cmF2ZXJzYWwgdGhyb3VnaAorLy8vICAgICB0aGUgbG9vcC4gIFN0YXJ0IGJ5IGFzc2lnbmluZyBmdWxsIG1hc3MgdG8gdGhlIExvb3AgaGVhZGVyLiAgRm9yIGVhY2gKKy8vLyAgICAgbm9kZSBpbiB0aGUgbG9vcDoKKy8vLworLy8vICAgICAgICAgLSBGZXRjaCBhbmQgY2F0ZWdvcml6ZSB0aGUgd2VpZ2h0IGRpc3RyaWJ1dGlvbiBmb3IgaXRzIHN1Y2Nlc3NvcnMuCisvLy8gICAgICAgICAgIElmIHRoaXMgaXMgYSBwYWNrYWdlZC1zdWJsb29wLCB0aGUgd2VpZ2h0IGRpc3RyaWJ1dGlvbiBpcyBzdG9yZWQKKy8vLyAgICAgICAgICAgaW4gXGEgTG9vcERhdGE6OkV4aXRzLiAgT3RoZXJ3aXNlLCBmZXRjaCBpdCBmcm9tCisvLy8gICAgICAgICAgIEJyYW5jaFByb2JhYmlsaXR5SW5mby4KKy8vLworLy8vICAgICAgICAgLSBFYWNoIHN1Y2Nlc3NvciBpcyBjYXRlZ29yaXplZCBhcyBcYSBXZWlnaHQ6OkxvY2FsLCBhIGxvY2FsIGVkZ2UKKy8vLyAgICAgICAgICAgd2l0aGluIHRoZSBjdXJyZW50IGxvb3AsIFxhIFdlaWdodDo6QmFja2VkZ2UsIGEgYmFja2VkZ2UgdG8gdGhlCisvLy8gICAgICAgICAgIGxvb3AgaGVhZGVyLCBvciBcYSBXZWlnaHQ6OkV4aXQsIGFueSBzdWNjZXNzb3Igb3V0c2lkZSB0aGUgbG9vcC4KKy8vLyAgICAgICAgICAgVGhlIHdlaWdodCwgdGhlIHN1Y2Nlc3NvciwgYW5kIGl0cyBjYXRlZ29yeSBhcmUgc3RvcmVkIGluIFxhCisvLy8gICAgICAgICAgIERpc3RyaWJ1dGlvbi4gIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSBlZGdlcyB0byBlYWNoIHN1Y2Nlc3Nvci4KKy8vLworLy8vICAgICAgICAgLSBJZiB0aGVyZSdzIGEgYmFja2VkZ2UgdG8gYSBub24taGVhZGVyLCB0aGVyZSdzIGFuIGlycmVkdWNpYmxlIFNDQy4KKy8vLyAgICAgICAgICAgVGhlIHVzdWFsIGZsb3cgaXMgdGVtcG9yYXJpbHkgYWJvcnRlZC4gIFxhCisvLy8gICAgICAgICAgIGNvbXB1dGVJcnJlZHVjaWJsZU1hc3MoKSBmaW5kcyB0aGUgaXJyZWR1Y2libGUgU0NDcyB3aXRoaW4gdGhlCisvLy8gICAgICAgICAgIGxvb3AsIHBhY2thZ2VzIHRoZW0gdXAsIGFuZCByZXN0YXJ0cyB0aGUgZmxvdy4KKy8vLworLy8vICAgICAgICAgLSBOb3JtYWxpemUgdGhlIGRpc3RyaWJ1dGlvbjogIHNjYWxlIHdlaWdodHMgZG93biBzbyB0aGF0IHRoZWlyIHN1bQorLy8vICAgICAgICAgICBpcyAzMi1iaXRzLCBhbmQgY29hbGVzY2UgbXVsdGlwbGUgZWRnZXMgdG8gdGhlIHNhbWUgbm9kZS4KKy8vLworLy8vICAgICAgICAgLSBEaXN0cmlidXRlIHRoZSBtYXNzIGFjY29yZGluZ2x5LCBkaXRoZXJpbmcgdG8gbWluaW1pemUgbWFzcyBsb3NzLAorLy8vICAgICAgICAgICBhcyBkZXNjcmliZWQgaW4gXGEgZGlzdHJpYnV0ZU1hc3MoKS4KKy8vLworLy8vICAgICBJbiB0aGUgY2FzZSBvZiBpcnJlZHVjaWJsZSBsb29wcywgaW5zdGVhZCBvZiBhIHNpbmdsZSBsb29wIGhlYWRlciwKKy8vLyAgICAgdGhlcmUgd2lsbCBiZSBzZXZlcmFsLiBUaGUgY29tcHV0YXRpb24gb2YgYmFja2VkZ2UgbWFzc2VzIGlzIHNpbWlsYXIKKy8vLyAgICAgYnV0IGluc3RlYWQgb2YgaGF2aW5nIGEgc2luZ2xlIGJhY2tlZGdlIG1hc3MsIHRoZXJlIHdpbGwgYmUgb25lCisvLy8gICAgIGJhY2tlZGdlIHBlciBsb29wIGhlYWRlci4gSW4gdGhlc2UgY2FzZXMsIGVhY2ggYmFja2VkZ2Ugd2lsbCBjYXJyeQorLy8vICAgICBhIG1hc3MgcHJvcG9ydGlvbmFsIHRvIHRoZSBlZGdlIHdlaWdodHMgYWxvbmcgdGhlIGNvcnJlc3BvbmRpbmcKKy8vLyAgICAgcGF0aC4KKy8vLworLy8vICAgICBBdCB0aGUgZW5kIG9mIHByb3BhZ2F0aW9uLCB0aGUgZnVsbCBtYXNzIGFzc2lnbmVkIHRvIHRoZSBsb29wIHdpbGwgYmUKKy8vLyAgICAgZGlzdHJpYnV0ZWQgYW1vbmcgdGhlIGxvb3AgaGVhZGVycyBwcm9wb3J0aW9uYWxseSBhY2NvcmRpbmcgdG8gdGhlCisvLy8gICAgIG1hc3MgZmxvd2luZyB0aHJvdWdoIHRoZWlyIGJhY2tlZGdlcy4KKy8vLworLy8vICAgICBGaW5hbGx5LCBjYWxjdWxhdGUgdGhlIGxvb3Agc2NhbGUgZnJvbSB0aGUgYWNjdW11bGF0ZWQgYmFja2VkZ2UgbWFzcy4KKy8vLworLy8vICAzLiBEaXN0cmlidXRlIG1hc3MgaW4gdGhlIGZ1bmN0aW9uIChcYSBjb21wdXRlTWFzc0luRnVuY3Rpb24oKSkuCisvLy8KKy8vLyAgICAgRmluYWxseSwgZGlzdHJpYnV0ZSBtYXNzIHRocm91Z2ggdGhlIERBRyByZXN1bHRpbmcgZnJvbSBwYWNrYWdpbmcgYWxsCisvLy8gICAgIGxvb3BzIGluIHRoZSBmdW5jdGlvbi4gIFRoaXMgdXNlcyB0aGUgc2FtZSBhbGdvcml0aG0gYXMgZGlzdHJpYnV0aW5nCisvLy8gICAgIG1hc3MgaW4gYSBsb29wLCBleGNlcHQgdGhhdCB0aGVyZSBhcmUgbm8gZXhpdCBvciBiYWNrZWRnZSBlZGdlcy4KKy8vLworLy8vICA0LiBVbnBhY2thZ2UgbG9vcHMgKFxhIHVud3JhcExvb3BzKCkpLgorLy8vCisvLy8gICAgIEluaXRpYWxpemUgZWFjaCBibG9jaydzIGZyZXF1ZW5jeSB0byBhIGZsb2F0aW5nIHBvaW50IHJlcHJlc2VudGF0aW9uIG9mCisvLy8gICAgIGl0cyBtYXNzLgorLy8vCisvLy8gICAgIFZpc2l0IGxvb3BzIHRvcC1kb3duLCBzY2FsaW5nIHRoZSBmcmVxdWVuY2llcyBvZiBpdHMgaW1tZWRpYXRlIG1lbWJlcnMKKy8vLyAgICAgYnkgdGhlIGxvb3AncyBwc2V1ZG8tbm9kZSdzIGZyZXF1ZW5jeS4KKy8vLworLy8vICA1LiBDb252ZXJ0IGZyZXF1ZW5jaWVzIHRvIGEgNjQtYml0IHJhbmdlIChcYSBmaW5hbGl6ZU1ldHJpY3MoKSkuCisvLy8KKy8vLyAgICAgVXNpbmcgdGhlIG1pbiBhbmQgbWF4IGZyZXF1ZW5jaWVzIGFzIGEgZ3VpZGUsIHRyYW5zbGF0ZSBmbG9hdGluZyBwb2ludAorLy8vICAgICBmcmVxdWVuY2llcyB0byBhbiBhcHByb3ByaWF0ZSByYW5nZSBpbiB1aW50NjRfdC4KKy8vLworLy8vIEl0IGhhcyBzb21lIGtub3duIGZsYXdzLgorLy8vCisvLy8gICAtIFRoZSBtb2RlbCBvZiBpcnJlZHVjaWJsZSBjb250cm9sIGZsb3cgaXMgYSByb3VnaCBhcHByb3hpbWF0aW9uLgorLy8vCisvLy8gICAgIE1vZGVsbGluZyBpcnJlZHVjaWJsZSBjb250cm9sIGZsb3cgZXhhY3RseSBpbnZvbHZlcyBzZXR0aW5nIHVwIGFuZAorLy8vICAgICBzb2x2aW5nIGEgZ3JvdXAgb2YgaW5maW5pdGUgZ2VvbWV0cmljIHNlcmllcy4gIFN1Y2ggcHJlY2lzaW9uIGlzCisvLy8gICAgIHVubGlrZWx5IHRvIGJlIHdvcnRod2hpbGUsIHNpbmNlIG1vc3Qgb2Ygb3VyIGFsZ29yaXRobXMgZ2l2ZSB1cCBvbgorLy8vICAgICBpcnJlZHVjaWJsZSBjb250cm9sIGZsb3cgYW55d2F5LgorLy8vCisvLy8gICAgIE5ldmVydGhlbGVzcywgd2UgbWlnaHQgZmluZCB0aGF0IHdlIG5lZWQgdG8gZ2V0IGNsb3Nlci4gIEhlcmUncyBhIHNvcnQKKy8vLyAgICAgb2YgVE9ETyBsaXN0IGZvciB0aGUgbW9kZWwgd2l0aCBkaW1pbmlzaGluZyByZXR1cm5zLCB0byBiZSBjb21wbGV0ZWQgYXMKKy8vLyAgICAgbmVjZXNzYXJ5LgorLy8vCisvLy8gICAgICAgLSBUaGUgaGVhZGVycyBmb3IgdGhlIFxhIExvb3BEYXRhIHJlcHJlc2VudGluZyBhbiBpcnJlZHVjaWJsZSBTQ0MKKy8vLyAgICAgICAgIGluY2x1ZGUgbm9uLWVudHJ5IGJsb2Nrcy4gIFdoZW4gdGhlc2UgZXh0cmEgYmxvY2tzIGV4aXN0LCB0aGV5CisvLy8gICAgICAgICBpbmRpY2F0ZSBhIHNlbGYtY29udGFpbmVkIGlycmVkdWNpYmxlIHN1Yi1TQ0MuICBXZSBjb3VsZCB0cmVhdCB0aGVtCisvLy8gICAgICAgICBhcyBzdWItbG9vcHMsIHJhdGhlciB0aGFuIGFyYml0cmFyaWx5IHNob3ZpbmcgdGhlIHByb2JsZW1hdGljCisvLy8gICAgICAgICBibG9ja3MgaW50byB0aGUgaGVhZGVycyBvZiB0aGUgbWFpbiBpcnJlZHVjaWJsZSBTQ0MuCisvLy8KKy8vLyAgICAgICAtIEVudHJ5IGZyZXF1ZW5jaWVzIGFyZSBhc3N1bWVkIHRvIGJlIGV2ZW5seSBzcGxpdCBiZXR3ZWVuIHRoZQorLy8vICAgICAgICAgaGVhZGVycyBvZiBhIGdpdmVuIGlycmVkdWNpYmxlIFNDQywgd2hpY2ggaXMgdGhlIG9ubHkgb3B0aW9uIGlmIHdlCisvLy8gICAgICAgICBuZWVkIHRvIGNvbXB1dGUgbWFzcyBpbiB0aGUgU0NDIGJlZm9yZSBpdHMgcGFyZW50IGxvb3AuICBJbnN0ZWFkLAorLy8vICAgICAgICAgd2UgY291bGQgcGFydGlhbGx5IGNvbXB1dGUgbWFzcyBpbiB0aGUgcGFyZW50IGxvb3AsIGFuZCBzdG9wIHdoZW4KKy8vLyAgICAgICAgIHdlIGdldCB0byB0aGUgU0NDLiAgSGVyZSwgd2UgaGF2ZSB0aGUgY29ycmVjdCByYXRpbyBvZiBlbnRyeQorLy8vICAgICAgICAgbWFzc2VzLCB3aGljaCB3ZSBjYW4gdXNlIHRvIGFkanVzdCB0aGVpciByZWxhdGl2ZSBmcmVxdWVuY2llcy4KKy8vLyAgICAgICAgIENvbXB1dGUgbWFzcyBpbiB0aGUgU0NDLCBhbmQgdGhlbiBjb250aW51ZSBwcm9wYWdhdGlvbiBpbiB0aGUKKy8vLyAgICAgICAgIHBhcmVudC4KKy8vLworLy8vICAgICAgIC0gV2UgY2FuIHByb3BhZ2F0ZSBtYXNzIGl0ZXJhdGl2ZWx5IHRocm91Z2ggdGhlIFNDQywgZm9yIHNvbWUgZml4ZWQKKy8vLyAgICAgICAgIG51bWJlciBvZiBpdGVyYXRpb25zLiAgRWFjaCBpdGVyYXRpb24gc3RhcnRzIGJ5IGFzc2lnbmluZyB0aGUgZW50cnkKKy8vLyAgICAgICAgIGJsb2NrcyB0aGVpciBiYWNrZWRnZSBtYXNzIGZyb20gdGhlIHByaW9yIGl0ZXJhdGlvbi4gIFRoZSBmaW5hbAorLy8vICAgICAgICAgbWFzcyBmb3IgZWFjaCBibG9jayAoYW5kIGVhY2ggZXhpdCwgYW5kIHRoZSB0b3RhbCBiYWNrZWRnZSBtYXNzCisvLy8gICAgICAgICB1c2VkIGZvciBjb21wdXRpbmcgbG9vcCBzY2FsZSkgaXMgdGhlIHN1bSBvZiBhbGwgaXRlcmF0aW9ucy4KKy8vLyAgICAgICAgIChSdW5uaW5nIHRoaXMgdW50aWwgZml4ZWQgcG9pbnQgd291bGQgInNvbHZlIiB0aGUgZ2VvbWV0cmljCisvLy8gICAgICAgICBzZXJpZXMgYnkgc2ltdWxhdGlvbi4pCit0ZW1wbGF0ZSA8Y2xhc3MgQlQ+IGNsYXNzIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGwgOiBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsQmFzZSB7CisgIC8vIFRoaXMgaXMgcGFydCBvZiBhIHdvcmthcm91bmQgZm9yIGEgR0NDIDQuNyBjcmFzaCBvbiBsYW1iZGFzLgorICBmcmllbmQgc3RydWN0IGJmaV9kZXRhaWw6OkJsb2NrRWRnZXNBZGRlcjxCVD47CisKKyAgdXNpbmcgQmxvY2tUID0gdHlwZW5hbWUgYmZpX2RldGFpbDo6VHlwZU1hcDxCVD46OkJsb2NrVDsKKyAgdXNpbmcgRnVuY3Rpb25UID0gdHlwZW5hbWUgYmZpX2RldGFpbDo6VHlwZU1hcDxCVD46OkZ1bmN0aW9uVDsKKyAgdXNpbmcgQnJhbmNoUHJvYmFiaWxpdHlJbmZvVCA9CisgICAgICB0eXBlbmFtZSBiZmlfZGV0YWlsOjpUeXBlTWFwPEJUPjo6QnJhbmNoUHJvYmFiaWxpdHlJbmZvVDsKKyAgdXNpbmcgTG9vcFQgPSB0eXBlbmFtZSBiZmlfZGV0YWlsOjpUeXBlTWFwPEJUPjo6TG9vcFQ7CisgIHVzaW5nIExvb3BJbmZvVCA9IHR5cGVuYW1lIGJmaV9kZXRhaWw6OlR5cGVNYXA8QlQ+OjpMb29wSW5mb1Q7CisgIHVzaW5nIFN1Y2Nlc3NvciA9IEdyYXBoVHJhaXRzPGNvbnN0IEJsb2NrVCAqPjsKKyAgdXNpbmcgUHJlZGVjZXNzb3IgPSBHcmFwaFRyYWl0czxJbnZlcnNlPGNvbnN0IEJsb2NrVCAqPj47CisKKyAgY29uc3QgQnJhbmNoUHJvYmFiaWxpdHlJbmZvVCAqQlBJID0gbnVsbHB0cjsKKyAgY29uc3QgTG9vcEluZm9UICpMSSA9IG51bGxwdHI7CisgIGNvbnN0IEZ1bmN0aW9uVCAqRiA9IG51bGxwdHI7CisKKyAgLy8gQWxsIGJsb2NrcyBpbiByZXZlcnNlIHBvc3RvcmRlci4KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgQmxvY2tUICo+IFJQT1Q7CisgIERlbnNlTWFwPGNvbnN0IEJsb2NrVCAqLCBCbG9ja05vZGU+IE5vZGVzOworCisgIHVzaW5nIHJwb3RfaXRlcmF0b3IgPSB0eXBlbmFtZSBzdGQ6OnZlY3Rvcjxjb25zdCBCbG9ja1QgKj46OmNvbnN0X2l0ZXJhdG9yOworCisgIHJwb3RfaXRlcmF0b3IgcnBvdF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIFJQT1QuYmVnaW4oKTsgfQorICBycG90X2l0ZXJhdG9yIHJwb3RfZW5kKCkgY29uc3QgeyByZXR1cm4gUlBPVC5lbmQoKTsgfQorCisgIHNpemVfdCBnZXRJbmRleChjb25zdCBycG90X2l0ZXJhdG9yICZJKSBjb25zdCB7IHJldHVybiBJIC0gcnBvdF9iZWdpbigpOyB9CisKKyAgQmxvY2tOb2RlIGdldE5vZGUoY29uc3QgcnBvdF9pdGVyYXRvciAmSSkgY29uc3QgeworICAgIHJldHVybiBCbG9ja05vZGUoZ2V0SW5kZXgoSSkpOworICB9CisgIEJsb2NrTm9kZSBnZXROb2RlKGNvbnN0IEJsb2NrVCAqQkIpIGNvbnN0IHsgcmV0dXJuIE5vZGVzLmxvb2t1cChCQik7IH0KKworICBjb25zdCBCbG9ja1QgKmdldEJsb2NrKGNvbnN0IEJsb2NrTm9kZSAmTm9kZSkgY29uc3QgeworICAgIGFzc2VydChOb2RlLkluZGV4IDwgUlBPVC5zaXplKCkpOworICAgIHJldHVybiBSUE9UW05vZGUuSW5kZXhdOworICB9CisKKyAgLy8vIFxicmllZiBSdW4gKGFuZCBzYXZlKSBhIHBvc3Qtb3JkZXIgdHJhdmVyc2FsLgorICAvLy8KKyAgLy8vIFNhdmVzIGEgcmV2ZXJzZSBwb3N0LW9yZGVyIHRyYXZlcnNhbCBvZiBhbGwgdGhlIG5vZGVzIGluIFxhIEYuCisgIHZvaWQgaW5pdGlhbGl6ZVJQT1QoKTsKKworICAvLy8gXGJyaWVmIEluaXRpYWxpemUgbG9vcCBkYXRhLgorICAvLy8KKyAgLy8vIEJ1aWxkIHVwIFxhIExvb3BzIHVzaW5nIFxhIExvb3BJbmZvLiAgXGEgTG9vcEluZm8gZ2l2ZXMgdXMgYSBtYXBwaW5nIGZyb20KKyAgLy8vIGVhY2ggYmxvY2sgdG8gdGhlIGRlZXBlc3QgbG9vcCBpdCdzIGluLCBidXQgd2UgbmVlZCB0aGUgaW52ZXJzZS4gIEZvciBlYWNoCisgIC8vLyBsb29wLCB3ZSBzdG9yZSBpbiByZXZlcnNlIHBvc3Qtb3JkZXIgaXRzICJpbW1lZGlhdGUiIG1lbWJlcnMsIGRlZmluZWQgYXMKKyAgLy8vIHRoZSBoZWFkZXIsIHRoZSBoZWFkZXJzIG9mIGltbWVkaWF0ZSBzdWItbG9vcHMsIGFuZCBhbGwgb3RoZXIgYmxvY2tzIGluCisgIC8vLyB0aGUgbG9vcCB0aGF0IGFyZSBub3QgaW4gc3ViLWxvb3BzLgorICB2b2lkIGluaXRpYWxpemVMb29wcygpOworCisgIC8vLyBcYnJpZWYgUHJvcGFnYXRlIHRvIGEgYmxvY2sncyBzdWNjZXNzb3JzLgorICAvLy8KKyAgLy8vIEluIHRoZSBjb250ZXh0IG9mIGRpc3RyaWJ1dGluZyBtYXNzIHRocm91Z2ggXGMgT3V0ZXJMb29wLCBkaXZpZGUgdGhlIG1hc3MKKyAgLy8vIGN1cnJlbnRseSBhc3NpZ25lZCB0byBcYyBOb2RlIGJldHdlZW4gaXRzIHN1Y2Nlc3NvcnMuCisgIC8vLworICAvLy8gXHJldHVybiBcYyB0cnVlIHVubGVzcyB0aGVyZSdzIGFuIGlycmVkdWNpYmxlIGJhY2tlZGdlLgorICBib29sIHByb3BhZ2F0ZU1hc3NUb1N1Y2Nlc3NvcnMoTG9vcERhdGEgKk91dGVyTG9vcCwgY29uc3QgQmxvY2tOb2RlICZOb2RlKTsKKworICAvLy8gXGJyaWVmIENvbXB1dGUgbWFzcyBpbiBhIHBhcnRpY3VsYXIgbG9vcC4KKyAgLy8vCisgIC8vLyBBc3NpZ24gbWFzcyB0byBcYyBMb29wJ3MgaGVhZGVyLCBhbmQgdGhlbiBmb3IgZWFjaCBibG9jayBpbiBcYyBMb29wIGluCisgIC8vLyByZXZlcnNlIHBvc3Qtb3JkZXIsIGRpc3RyaWJ1dGUgbWFzcyB0byBpdHMgc3VjY2Vzc29ycy4gIE9ubHkgdmlzaXRzIG5vZGVzCisgIC8vLyB0aGF0IGhhdmUgbm90IGJlZW4gcGFja2FnZWQgaW50byBzdWItbG9vcHMuCisgIC8vLworICAvLy8gXHByZSBcYSBjb21wdXRlTWFzc0luTG9vcCgpIGhhcyBiZWVuIGNhbGxlZCBmb3IgZWFjaCBzdWJsb29wIG9mIFxjIExvb3AuCisgIC8vLyBccmV0dXJuIFxjIHRydWUgdW5sZXNzIHRoZXJlJ3MgYW4gaXJyZWR1Y2libGUgYmFja2VkZ2UuCisgIGJvb2wgY29tcHV0ZU1hc3NJbkxvb3AoTG9vcERhdGEgJkxvb3ApOworCisgIC8vLyBcYnJpZWYgVHJ5IHRvIGNvbXB1dGUgbWFzcyBpbiB0aGUgdG9wLWxldmVsIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIEFzc2lnbiBtYXNzIHRvIHRoZSBlbnRyeSBibG9jaywgYW5kIHRoZW4gZm9yIGVhY2ggYmxvY2sgaW4gcmV2ZXJzZQorICAvLy8gcG9zdC1vcmRlciwgZGlzdHJpYnV0ZSBtYXNzIHRvIGl0cyBzdWNjZXNzb3JzLiAgU2tpcHMgbm9kZXMgdGhhdCBoYXZlCisgIC8vLyBiZWVuIHBhY2thZ2VkIGludG8gbG9vcHMuCisgIC8vLworICAvLy8gXHByZSBcYSBjb21wdXRlTWFzc0luTG9vcHMoKSBoYXMgYmVlbiBjYWxsZWQuCisgIC8vLyBccmV0dXJuIFxjIHRydWUgdW5sZXNzIHRoZXJlJ3MgYW4gaXJyZWR1Y2libGUgYmFja2VkZ2UuCisgIGJvb2wgdHJ5VG9Db21wdXRlTWFzc0luRnVuY3Rpb24oKTsKKworICAvLy8gXGJyaWVmIENvbXB1dGUgbWFzcyBpbiAoYW5kIHBhY2thZ2UgdXApIGlycmVkdWNpYmxlIFNDQ3MuCisgIC8vLworICAvLy8gRmluZCB0aGUgaXJyZWR1Y2libGUgU0NDcyBpbiBcYyBPdXRlckxvb3AsIGFkZCB0aGVtIHRvIFxhIExvb3BzIChpbiBmcm9udAorICAvLy8gb2YgXGMgSW5zZXJ0KSwgYW5kIGNhbGwgXGEgY29tcHV0ZU1hc3NJbkxvb3AoKSBvbiBlYWNoIG9mIHRoZW0uCisgIC8vLworICAvLy8gSWYgXGMgT3V0ZXJMb29wIGlzIFxjIG51bGxwdHIsIGl0IHJlZmVycyB0byB0aGUgdG9wLWxldmVsIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFxwcmUgXGEgY29tcHV0ZU1hc3NJbkxvb3AoKSBoYXMgYmVlbiBjYWxsZWQgZm9yIGVhY2ggc3VibG9vcCBvZiBcYworICAvLy8gT3V0ZXJMb29wLgorICAvLy8gXHByZSBcYyBJbnNlcnQgcG9pbnRzIGF0IHRoZSBsYXN0IGxvb3Agc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBieSBcYQorICAvLy8gY29tcHV0ZU1hc3NJbkxvb3AoKS4KKyAgLy8vIFxwcmUgXGMgT3V0ZXJMb29wIGhhcyBpcnJlZHVjaWJsZSBTQ0NzLgorICB2b2lkIGNvbXB1dGVJcnJlZHVjaWJsZU1hc3MoTG9vcERhdGEgKk91dGVyTG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxMb29wRGF0YT46Oml0ZXJhdG9yIEluc2VydCk7CisKKyAgLy8vIFxicmllZiBDb21wdXRlIG1hc3MgaW4gYWxsIGxvb3BzLgorICAvLy8KKyAgLy8vIEZvciBlYWNoIGxvb3AgYm90dG9tLXVwLCBjYWxsIFxhIGNvbXB1dGVNYXNzSW5Mb29wKCkuCisgIC8vLworICAvLy8gXGEgY29tcHV0ZU1hc3NJbkxvb3AoKSBhYm9ydHMgKGFuZCByZXR1cm5zIFxjIGZhbHNlKSBvbiBsb29wcyB0aGF0CisgIC8vLyBjb250YWluIGEgaXJyZWR1Y2libGUgc3ViLVNDQ3MuICBVc2UgXGEgY29tcHV0ZUlycmVkdWNpYmxlTWFzcygpIGFuZCB0aGVuCisgIC8vLyByZS1lbnRlciBcYSBjb21wdXRlTWFzc0luTG9vcCgpLgorICAvLy8KKyAgLy8vIFxwb3N0IFxhIGNvbXB1dGVNYXNzSW5Mb29wKCkgaGFzIHJldHVybmVkIFxjIHRydWUgZm9yIGV2ZXJ5IGxvb3AuCisgIHZvaWQgY29tcHV0ZU1hc3NJbkxvb3BzKCk7CisKKyAgLy8vIFxicmllZiBDb21wdXRlIG1hc3MgaW4gdGhlIHRvcC1sZXZlbCBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBVc2VzIFxhIHRyeVRvQ29tcHV0ZU1hc3NJbkZ1bmN0aW9uKCkgYW5kIFxhIGNvbXB1dGVJcnJlZHVjaWJsZU1hc3MoKSB0bworICAvLy8gY29tcHV0ZSBtYXNzIGluIHRoZSB0b3AtbGV2ZWwgZnVuY3Rpb24uCisgIC8vLworICAvLy8gXHBvc3QgXGEgdHJ5VG9Db21wdXRlTWFzc0luRnVuY3Rpb24oKSBoYXMgcmV0dXJuZWQgXGMgdHJ1ZS4KKyAgdm9pZCBjb21wdXRlTWFzc0luRnVuY3Rpb24oKTsKKworICBzdGQ6OnN0cmluZyBnZXRCbG9ja05hbWUoY29uc3QgQmxvY2tOb2RlICZOb2RlKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGJmaV9kZXRhaWw6OmdldEJsb2NrTmFtZShnZXRCbG9jayhOb2RlKSk7CisgIH0KKworcHVibGljOgorICBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsKCkgPSBkZWZhdWx0OworCisgIGNvbnN0IEZ1bmN0aW9uVCAqZ2V0RnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBGOyB9CisKKyAgdm9pZCBjYWxjdWxhdGUoY29uc3QgRnVuY3Rpb25UICZGLCBjb25zdCBCcmFuY2hQcm9iYWJpbGl0eUluZm9UICZCUEksCisgICAgICAgICAgICAgICAgIGNvbnN0IExvb3BJbmZvVCAmTEkpOworCisgIHVzaW5nIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGxCYXNlOjpnZXRFbnRyeUZyZXE7CisKKyAgQmxvY2tGcmVxdWVuY3kgZ2V0QmxvY2tGcmVxKGNvbnN0IEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gQmxvY2tGcmVxdWVuY3lJbmZvSW1wbEJhc2U6OmdldEJsb2NrRnJlcShnZXROb2RlKEJCKSk7CisgIH0KKworICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0QmxvY2tQcm9maWxlQ291bnQoY29uc3QgRnVuY3Rpb24gJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCbG9ja1QgKkJCKSBjb25zdCB7CisgICAgcmV0dXJuIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGxCYXNlOjpnZXRCbG9ja1Byb2ZpbGVDb3VudChGLCBnZXROb2RlKEJCKSk7CisgIH0KKworICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0UHJvZmlsZUNvdW50RnJvbUZyZXEoY29uc3QgRnVuY3Rpb24gJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBGcmVxKSBjb25zdCB7CisgICAgcmV0dXJuIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGxCYXNlOjpnZXRQcm9maWxlQ291bnRGcm9tRnJlcShGLCBGcmVxKTsKKyAgfQorCisgIGJvb2wgaXNJcnJMb29wSGVhZGVyKGNvbnN0IEJsb2NrVCAqQkIpIHsKKyAgICByZXR1cm4gQmxvY2tGcmVxdWVuY3lJbmZvSW1wbEJhc2U6OmlzSXJyTG9vcEhlYWRlcihnZXROb2RlKEJCKSk7CisgIH0KKworICB2b2lkIHNldEJsb2NrRnJlcShjb25zdCBCbG9ja1QgKkJCLCB1aW50NjRfdCBGcmVxKTsKKworICBTY2FsZWQ2NCBnZXRGbG9hdGluZ0Jsb2NrRnJlcShjb25zdCBCbG9ja1QgKkJCKSBjb25zdCB7CisgICAgcmV0dXJuIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGxCYXNlOjpnZXRGbG9hdGluZ0Jsb2NrRnJlcShnZXROb2RlKEJCKSk7CisgIH0KKworICBjb25zdCBCcmFuY2hQcm9iYWJpbGl0eUluZm9UICZnZXRCUEkoKSBjb25zdCB7IHJldHVybiAqQlBJOyB9CisKKyAgLy8vIFxicmllZiBQcmludCB0aGUgZnJlcXVlbmNpZXMgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFByaW50cyB0aGUgZnJlcXVlbmNpZXMgZm9yIHRoZSBibG9ja3MgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIC8vLworICAvLy8gQmxvY2tzIGFyZSBwcmludGVkIGluIHRoZSBuYXR1cmFsIGl0ZXJhdGlvbiBvcmRlciBvZiB0aGUgZnVuY3Rpb24sIHJhdGhlcgorICAvLy8gdGhhbiByZXZlcnNlIHBvc3Qtb3JkZXIuICBUaGlzIHByb3ZpZGVzIHR3byBhZHZhbnRhZ2VzOiAgd3JpdGluZyAtYW5hbHl6ZQorICAvLy8gdGVzdHMgaXMgZWFzaWVyIChzaW5jZSBibG9ja3MgY29tZSBvdXQgaW4gc291cmNlIG9yZGVyKSwgYW5kIGV2ZW4KKyAgLy8vIHVucmVhY2hhYmxlIGJsb2NrcyBhcmUgcHJpbnRlZC4KKyAgLy8vCisgIC8vLyBcYSBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsQmFzZTo6cHJpbnQoKSBvbmx5IGtub3dzIHJldmVyc2UgcG9zdC1vcmRlciwgc28KKyAgLy8vIHdlIG5lZWQgdG8gb3ZlcnJpZGUgaXQgaGVyZS4KKyAgcmF3X29zdHJlYW0gJnByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdXNpbmcgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbEJhc2U6OmR1bXA7CisgIHVzaW5nIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGxCYXNlOjpwcmludEJsb2NrRnJlcTsKKworICByYXdfb3N0cmVhbSAmcHJpbnRCbG9ja0ZyZXEocmF3X29zdHJlYW0gJk9TLCBjb25zdCBCbG9ja1QgKkJCKSBjb25zdCB7CisgICAgcmV0dXJuIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGxCYXNlOjpwcmludEJsb2NrRnJlcShPUywgZ2V0Tm9kZShCQikpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgQlQ+Cit2b2lkIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGw8QlQ+OjpjYWxjdWxhdGUoY29uc3QgRnVuY3Rpb25UICZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJyYW5jaFByb2JhYmlsaXR5SW5mb1QgJkJQSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wSW5mb1QgJkxJKSB7CisgIC8vIFNhdmUgdGhlIHBhcmFtZXRlcnMuCisgIHRoaXMtPkJQSSA9ICZCUEk7CisgIHRoaXMtPkxJID0gJkxJOworICB0aGlzLT5GID0gJkY7CisKKyAgLy8gQ2xlYW4gdXAgbGVmdC1vdmVyIGRhdGEgc3RydWN0dXJlcy4KKyAgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbEJhc2U6OmNsZWFyKCk7CisgIFJQT1QuY2xlYXIoKTsKKyAgTm9kZXMuY2xlYXIoKTsKKworICAvLyBJbml0aWFsaXplLgorICBERUJVRyhkYmdzKCkgPDwgIlxuYmxvY2stZnJlcXVlbmN5OiAiIDw8IEYuZ2V0TmFtZSgpIDw8ICJcbj09PT09PT09PT09PT09PT09IgorICAgICAgICAgICAgICAgPDwgc3RkOjpzdHJpbmcoRi5nZXROYW1lKCkuc2l6ZSgpLCAnPScpIDw8ICJcbiIpOworICBpbml0aWFsaXplUlBPVCgpOworICBpbml0aWFsaXplTG9vcHMoKTsKKworICAvLyBWaXNpdCBsb29wcyBpbiBwb3N0LW9yZGVyIHRvIGZpbmQgdGhlIGxvY2FsIG1hc3MgZGlzdHJpYnV0aW9uLCBhbmQgdGhlbiBkbworICAvLyB0aGUgZnVsbCBmdW5jdGlvbi4KKyAgY29tcHV0ZU1hc3NJbkxvb3BzKCk7CisgIGNvbXB1dGVNYXNzSW5GdW5jdGlvbigpOworICB1bndyYXBMb29wcygpOworICBmaW5hbGl6ZU1ldHJpY3MoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJUPgordm9pZCBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsPEJUPjo6c2V0QmxvY2tGcmVxKGNvbnN0IEJsb2NrVCAqQkIsIHVpbnQ2NF90IEZyZXEpIHsKKyAgaWYgKE5vZGVzLmNvdW50KEJCKSkKKyAgICBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsQmFzZTo6c2V0QmxvY2tGcmVxKGdldE5vZGUoQkIpLCBGcmVxKTsKKyAgZWxzZSB7CisgICAgLy8gSWYgQkIgaXMgYSBuZXdseSBhZGRlZCBibG9jayBhZnRlciBCRkkgaXMgZG9uZSwgd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcKKyAgICAvLyBCbG9ja05vZGUgZm9yIGl0IGFzc2lnbmVkIHdpdGggYSBuZXcgaW5kZXguIFRoZSBpbmRleCBjYW4gYmUgZGV0ZXJtaW5lZAorICAgIC8vIGJ5IHRoZSBzaXplIG9mIEZyZXFzLgorICAgIEJsb2NrTm9kZSBOZXdOb2RlKEZyZXFzLnNpemUoKSk7CisgICAgTm9kZXNbQkJdID0gTmV3Tm9kZTsKKyAgICBGcmVxcy5lbXBsYWNlX2JhY2soKTsKKyAgICBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsQmFzZTo6c2V0QmxvY2tGcmVxKE5ld05vZGUsIEZyZXEpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCVD4gdm9pZCBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsPEJUPjo6aW5pdGlhbGl6ZVJQT1QoKSB7CisgIGNvbnN0IEJsb2NrVCAqRW50cnkgPSAmRi0+ZnJvbnQoKTsKKyAgUlBPVC5yZXNlcnZlKEYtPnNpemUoKSk7CisgIHN0ZDo6Y29weShwb19iZWdpbihFbnRyeSksIHBvX2VuZChFbnRyeSksIHN0ZDo6YmFja19pbnNlcnRlcihSUE9UKSk7CisgIHN0ZDo6cmV2ZXJzZShSUE9ULmJlZ2luKCksIFJQT1QuZW5kKCkpOworCisgIGFzc2VydChSUE9ULnNpemUoKSAtIDEgPD0gQmxvY2tOb2RlOjpnZXRNYXhJbmRleCgpICYmCisgICAgICAgICAiTW9yZSBub2RlcyBpbiBmdW5jdGlvbiB0aGFuIEJsb2NrIEZyZXF1ZW5jeSBJbmZvIHN1cHBvcnRzIik7CisKKyAgREVCVUcoZGJncygpIDw8ICJyZXZlcnNlLXBvc3Qtb3JkZXItdHJhdmVyc2FsXG4iKTsKKyAgZm9yIChycG90X2l0ZXJhdG9yIEkgPSBycG90X2JlZ2luKCksIEUgPSBycG90X2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIEJsb2NrTm9kZSBOb2RlID0gZ2V0Tm9kZShJKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAtICIgPDwgZ2V0SW5kZXgoSSkgPDwgIjogIiA8PCBnZXRCbG9ja05hbWUoTm9kZSkgPDwgIlxuIik7CisgICAgTm9kZXNbKkldID0gTm9kZTsKKyAgfQorCisgIFdvcmtpbmcucmVzZXJ2ZShSUE9ULnNpemUoKSk7CisgIGZvciAoc2l6ZV90IEluZGV4ID0gMDsgSW5kZXggPCBSUE9ULnNpemUoKTsgKytJbmRleCkKKyAgICBXb3JraW5nLmVtcGxhY2VfYmFjayhJbmRleCk7CisgIEZyZXFzLnJlc2l6ZShSUE9ULnNpemUoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCVD4gdm9pZCBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsPEJUPjo6aW5pdGlhbGl6ZUxvb3BzKCkgeworICBERUJVRyhkYmdzKCkgPDwgImxvb3AtZGV0ZWN0aW9uXG4iKTsKKyAgaWYgKExJLT5lbXB0eSgpKQorICAgIHJldHVybjsKKworICAvLyBWaXNpdCBsb29wcyB0b3AgZG93biBhbmQgYXNzaWduIHRoZW0gYW4gaW5kZXguCisgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPGNvbnN0IExvb3BUICosIExvb3BEYXRhICo+PiBROworICBmb3IgKGNvbnN0IExvb3BUICpMIDogKkxJKQorICAgIFEuZW1wbGFjZV9iYWNrKEwsIG51bGxwdHIpOworICB3aGlsZSAoIVEuZW1wdHkoKSkgeworICAgIGNvbnN0IExvb3BUICpMb29wID0gUS5mcm9udCgpLmZpcnN0OworICAgIExvb3BEYXRhICpQYXJlbnQgPSBRLmZyb250KCkuc2Vjb25kOworICAgIFEucG9wX2Zyb250KCk7CisKKyAgICBCbG9ja05vZGUgSGVhZGVyID0gZ2V0Tm9kZShMb29wLT5nZXRIZWFkZXIoKSk7CisgICAgYXNzZXJ0KEhlYWRlci5pc1ZhbGlkKCkpOworCisgICAgTG9vcHMuZW1wbGFjZV9iYWNrKFBhcmVudCwgSGVhZGVyKTsKKyAgICBXb3JraW5nW0hlYWRlci5JbmRleF0uTG9vcCA9ICZMb29wcy5iYWNrKCk7CisgICAgREVCVUcoZGJncygpIDw8ICIgLSBsb29wID0gIiA8PCBnZXRCbG9ja05hbWUoSGVhZGVyKSA8PCAiXG4iKTsKKworICAgIGZvciAoY29uc3QgTG9vcFQgKkwgOiAqTG9vcCkKKyAgICAgIFEuZW1wbGFjZV9iYWNrKEwsICZMb29wcy5iYWNrKCkpOworICB9CisKKyAgLy8gVmlzaXQgbm9kZXMgaW4gcmV2ZXJzZSBwb3N0LW9yZGVyIGFuZCBhZGQgdGhlbSB0byB0aGVpciBkZWVwZXN0IGNvbnRhaW5pbmcKKyAgLy8gbG9vcC4KKyAgZm9yIChzaXplX3QgSW5kZXggPSAwOyBJbmRleCA8IFJQT1Quc2l6ZSgpOyArK0luZGV4KSB7CisgICAgLy8gTG9vcCBoZWFkZXJzIGhhdmUgYWxyZWFkeSBiZWVuIG1vc3RseSBtYXBwZWQuCisgICAgaWYgKFdvcmtpbmdbSW5kZXhdLmlzTG9vcEhlYWRlcigpKSB7CisgICAgICBMb29wRGF0YSAqQ29udGFpbmluZ0xvb3AgPSBXb3JraW5nW0luZGV4XS5nZXRDb250YWluaW5nTG9vcCgpOworICAgICAgaWYgKENvbnRhaW5pbmdMb29wKQorICAgICAgICBDb250YWluaW5nTG9vcC0+Tm9kZXMucHVzaF9iYWNrKEluZGV4KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGNvbnN0IExvb3BUICpMb29wID0gTEktPmdldExvb3BGb3IoUlBPVFtJbmRleF0pOworICAgIGlmICghTG9vcCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gQWRkIHRoaXMgbm9kZSB0byBpdHMgY29udGFpbmluZyBsb29wJ3MgbWVtYmVyIGxpc3QuCisgICAgQmxvY2tOb2RlIEhlYWRlciA9IGdldE5vZGUoTG9vcC0+Z2V0SGVhZGVyKCkpOworICAgIGFzc2VydChIZWFkZXIuaXNWYWxpZCgpKTsKKyAgICBjb25zdCBhdXRvICZIZWFkZXJEYXRhID0gV29ya2luZ1tIZWFkZXIuSW5kZXhdOworICAgIGFzc2VydChIZWFkZXJEYXRhLmlzTG9vcEhlYWRlcigpKTsKKworICAgIFdvcmtpbmdbSW5kZXhdLkxvb3AgPSBIZWFkZXJEYXRhLkxvb3A7CisgICAgSGVhZGVyRGF0YS5Mb29wLT5Ob2Rlcy5wdXNoX2JhY2soSW5kZXgpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiIC0gbG9vcCA9ICIgPDwgZ2V0QmxvY2tOYW1lKEhlYWRlcikKKyAgICAgICAgICAgICAgICAgPDwgIjogbWVtYmVyID0gIiA8PCBnZXRCbG9ja05hbWUoSW5kZXgpIDw8ICJcbiIpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCVD4gdm9pZCBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsPEJUPjo6Y29tcHV0ZU1hc3NJbkxvb3BzKCkgeworICAvLyBWaXNpdCBsb29wcyB3aXRoIHRoZSBkZWVwZXN0IGZpcnN0LCBhbmQgdGhlIHRvcC1sZXZlbCBsb29wcyBsYXN0LgorICBmb3IgKGF1dG8gTCA9IExvb3BzLnJiZWdpbigpLCBFID0gTG9vcHMucmVuZCgpOyBMICE9IEU7ICsrTCkgeworICAgIGlmIChjb21wdXRlTWFzc0luTG9vcCgqTCkpCisgICAgICBjb250aW51ZTsKKyAgICBhdXRvIE5leHQgPSBzdGQ6Om5leHQoTCk7CisgICAgY29tcHV0ZUlycmVkdWNpYmxlTWFzcygmKkwsIEwuYmFzZSgpKTsKKyAgICBMID0gc3RkOjpwcmV2KE5leHQpOworICAgIGlmIChjb21wdXRlTWFzc0luTG9vcCgqTCkpCisgICAgICBjb250aW51ZTsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJ1bmhhbmRsZWQgaXJyZWR1Y2libGUgY29udHJvbCBmbG93Iik7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIEJUPgorYm9vbCBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsPEJUPjo6Y29tcHV0ZU1hc3NJbkxvb3AoTG9vcERhdGEgJkxvb3ApIHsKKyAgLy8gQ29tcHV0ZSBtYXNzIGluIGxvb3AuCisgIERFQlVHKGRiZ3MoKSA8PCAiY29tcHV0ZS1tYXNzLWluLWxvb3A6ICIgPDwgZ2V0TG9vcE5hbWUoTG9vcCkgPDwgIlxuIik7CisKKyAgaWYgKExvb3AuaXNJcnJlZHVjaWJsZSgpKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJpc0lycmVkdWNpYmxlID0gdHJ1ZVxuIik7CisgICAgRGlzdHJpYnV0aW9uIERpc3Q7CisgICAgdW5zaWduZWQgTnVtSGVhZGVyc1dpdGhXZWlnaHQgPSAwOworICAgIE9wdGlvbmFsPHVpbnQ2NF90PiBNaW5IZWFkZXJXZWlnaHQ7CisgICAgRGVuc2VTZXQ8dWludDMyX3Q+IEhlYWRlcnNXaXRob3V0V2VpZ2h0OworICAgIEhlYWRlcnNXaXRob3V0V2VpZ2h0LnJlc2VydmUoTG9vcC5OdW1IZWFkZXJzKTsKKyAgICBmb3IgKHVpbnQzMl90IEggPSAwOyBIIDwgTG9vcC5OdW1IZWFkZXJzOyArK0gpIHsKKyAgICAgIGF1dG8gJkhlYWRlck5vZGUgPSBMb29wLk5vZGVzW0hdOworICAgICAgY29uc3QgQmxvY2tUICpCbG9jayA9IGdldEJsb2NrKEhlYWRlck5vZGUpOworICAgICAgSXNJcnJMb29wSGVhZGVyLnNldChMb29wLk5vZGVzW0hdLkluZGV4KTsKKyAgICAgIE9wdGlvbmFsPHVpbnQ2NF90PiBIZWFkZXJXZWlnaHQgPSBCbG9jay0+Z2V0SXJyTG9vcEhlYWRlcldlaWdodCgpOworICAgICAgaWYgKCFIZWFkZXJXZWlnaHQpIHsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJNaXNzaW5nIGlyciBsb29wIGhlYWRlciBtZXRhZGF0YSBvbiAiCisgICAgICAgICAgICAgIDw8IGdldEJsb2NrTmFtZShIZWFkZXJOb2RlKSA8PCAiXG4iKTsKKyAgICAgICAgSGVhZGVyc1dpdGhvdXRXZWlnaHQuaW5zZXJ0KEgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIERFQlVHKGRiZ3MoKSA8PCBnZXRCbG9ja05hbWUoSGVhZGVyTm9kZSkKKyAgICAgICAgICAgIDw8ICIgaGFzIGlyciBsb29wIGhlYWRlciB3ZWlnaHQgIiA8PCBIZWFkZXJXZWlnaHQuZ2V0VmFsdWUoKQorICAgICAgICAgICAgPDwgIlxuIik7CisgICAgICBOdW1IZWFkZXJzV2l0aFdlaWdodCsrOworICAgICAgdWludDY0X3QgSGVhZGVyV2VpZ2h0VmFsdWUgPSBIZWFkZXJXZWlnaHQuZ2V0VmFsdWUoKTsKKyAgICAgIGlmICghTWluSGVhZGVyV2VpZ2h0IHx8IEhlYWRlcldlaWdodFZhbHVlIDwgTWluSGVhZGVyV2VpZ2h0KQorICAgICAgICBNaW5IZWFkZXJXZWlnaHQgPSBIZWFkZXJXZWlnaHRWYWx1ZTsKKyAgICAgIGlmIChIZWFkZXJXZWlnaHRWYWx1ZSkgeworICAgICAgICBEaXN0LmFkZExvY2FsKEhlYWRlck5vZGUsIEhlYWRlcldlaWdodFZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gQXMgYSBoZXVyaXN0aWMsIGlmIHNvbWUgaGVhZGVycyBkb24ndCBoYXZlIGEgd2VpZ2h0LCBnaXZlIHRoZW0gdGhlCisgICAgLy8gbWluaW1pdW0gd2VpZ2h0IHNlZW4gKG5vdCB0byBkaXNydXB0IHRoZSBleGlzdGluZyB0cmVuZHMgdG9vIG11Y2ggYnkKKyAgICAvLyB1c2luZyBhIHdlaWdodCB0aGF0J3MgaW4gdGhlIGdlbmVyYWwgcmFuZ2Ugb2YgdGhlIG90aGVyIGhlYWRlcnMnIHdlaWdodHMsCisgICAgLy8gYW5kIHRoZSBtaW5pbXVtIHNlZW1zIHRvIHBlcmZvcm0gYmV0dGVyIHRoYW4gdGhlIGF2ZXJhZ2UuKQorICAgIC8vIEZJWE1FOiBiZXR0ZXIgdXBkYXRlIGluIHRoZSBwYXNzZXMgdGhhdCBkcm9wIHRoZSBoZWFkZXIgd2VpZ2h0LgorICAgIC8vIElmIG5vIGhlYWRlcnMgaGF2ZSBhIHdlaWdodCwgZ2l2ZSB0aGVtIGV2ZW4gd2VpZ2h0ICh1c2Ugd2VpZ2h0IDEpLgorICAgIGlmICghTWluSGVhZGVyV2VpZ2h0KQorICAgICAgTWluSGVhZGVyV2VpZ2h0ID0gMTsKKyAgICBmb3IgKHVpbnQzMl90IEggOiBIZWFkZXJzV2l0aG91dFdlaWdodCkgeworICAgICAgYXV0byAmSGVhZGVyTm9kZSA9IExvb3AuTm9kZXNbSF07CisgICAgICBhc3NlcnQoIWdldEJsb2NrKEhlYWRlck5vZGUpLT5nZXRJcnJMb29wSGVhZGVyV2VpZ2h0KCkgJiYKKyAgICAgICAgICAgICAiU2hvdWxkbid0IGhhdmUgYSB3ZWlnaHQgbWV0YWRhdGEiKTsKKyAgICAgIHVpbnQ2NF90IE1pbldlaWdodCA9IE1pbkhlYWRlcldlaWdodC5nZXRWYWx1ZSgpOworICAgICAgREVCVUcoZGJncygpIDw8ICJHaXZpbmcgd2VpZ2h0ICIgPDwgTWluV2VpZ2h0CisgICAgICAgICAgICA8PCAiIHRvICIgPDwgZ2V0QmxvY2tOYW1lKEhlYWRlck5vZGUpIDw8ICJcbiIpOworICAgICAgaWYgKE1pbldlaWdodCkKKyAgICAgICAgRGlzdC5hZGRMb2NhbChIZWFkZXJOb2RlLCBNaW5XZWlnaHQpOworICAgIH0KKyAgICBkaXN0cmlidXRlSXJyTG9vcEhlYWRlck1hc3MoRGlzdCk7CisgICAgZm9yIChjb25zdCBCbG9ja05vZGUgJk0gOiBMb29wLk5vZGVzKQorICAgICAgaWYgKCFwcm9wYWdhdGVNYXNzVG9TdWNjZXNzb3JzKCZMb29wLCBNKSkKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgidW5oYW5kbGVkIGlycmVkdWNpYmxlIGNvbnRyb2wgZmxvdyIpOworICAgIGlmIChOdW1IZWFkZXJzV2l0aFdlaWdodCA9PSAwKQorICAgICAgLy8gTm8gaGVhZGVycyBoYXZlIGEgbWV0YWRhdGEuIEFkanVzdCBoZWFkZXIgbWFzcy4KKyAgICAgIGFkanVzdExvb3BIZWFkZXJNYXNzKExvb3ApOworICB9IGVsc2UgeworICAgIFdvcmtpbmdbTG9vcC5nZXRIZWFkZXIoKS5JbmRleF0uZ2V0TWFzcygpID0gQmxvY2tNYXNzOjpnZXRGdWxsKCk7CisgICAgaWYgKCFwcm9wYWdhdGVNYXNzVG9TdWNjZXNzb3JzKCZMb29wLCBMb29wLmdldEhlYWRlcigpKSkKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoImlycmVkdWNpYmxlIGNvbnRyb2wgZmxvdyB0byBsb29wIGhlYWRlciE/Iik7CisgICAgZm9yIChjb25zdCBCbG9ja05vZGUgJk0gOiBMb29wLm1lbWJlcnMoKSkKKyAgICAgIGlmICghcHJvcGFnYXRlTWFzc1RvU3VjY2Vzc29ycygmTG9vcCwgTSkpCisgICAgICAgIC8vIElycmVkdWNpYmxlIGJhY2tlZGdlLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb21wdXRlTG9vcFNjYWxlKExvb3ApOworICBwYWNrYWdlTG9vcChMb29wKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCVD4KK2Jvb2wgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbDxCVD46OnRyeVRvQ29tcHV0ZU1hc3NJbkZ1bmN0aW9uKCkgeworICAvLyBDb21wdXRlIG1hc3MgaW4gZnVuY3Rpb24uCisgIERFQlVHKGRiZ3MoKSA8PCAiY29tcHV0ZS1tYXNzLWluLWZ1bmN0aW9uXG4iKTsKKyAgYXNzZXJ0KCFXb3JraW5nLmVtcHR5KCkgJiYgIm5vIGJsb2NrcyBpbiBmdW5jdGlvbiIpOworICBhc3NlcnQoIVdvcmtpbmdbMF0uaXNMb29wSGVhZGVyKCkgJiYgImVudHJ5IGJsb2NrIGlzIGEgbG9vcCBoZWFkZXIiKTsKKworICBXb3JraW5nWzBdLmdldE1hc3MoKSA9IEJsb2NrTWFzczo6Z2V0RnVsbCgpOworICBmb3IgKHJwb3RfaXRlcmF0b3IgSSA9IHJwb3RfYmVnaW4oKSwgSUUgPSBycG90X2VuZCgpOyBJICE9IElFOyArK0kpIHsKKyAgICAvLyBDaGVjayBmb3Igbm9kZXMgdGhhdCBoYXZlIGJlZW4gcGFja2FnZWQuCisgICAgQmxvY2tOb2RlIE5vZGUgPSBnZXROb2RlKEkpOworICAgIGlmIChXb3JraW5nW05vZGUuSW5kZXhdLmlzUGFja2FnZWQoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKCFwcm9wYWdhdGVNYXNzVG9TdWNjZXNzb3JzKG51bGxwdHIsIE5vZGUpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQlQ+IHZvaWQgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbDxCVD46OmNvbXB1dGVNYXNzSW5GdW5jdGlvbigpIHsKKyAgaWYgKHRyeVRvQ29tcHV0ZU1hc3NJbkZ1bmN0aW9uKCkpCisgICAgcmV0dXJuOworICBjb21wdXRlSXJyZWR1Y2libGVNYXNzKG51bGxwdHIsIExvb3BzLmJlZ2luKCkpOworICBpZiAodHJ5VG9Db21wdXRlTWFzc0luRnVuY3Rpb24oKSkKKyAgICByZXR1cm47CisgIGxsdm1fdW5yZWFjaGFibGUoInVuaGFuZGxlZCBpcnJlZHVjaWJsZSBjb250cm9sIGZsb3ciKTsKK30KKworLy8vIFxub3RlIFRoaXMgc2hvdWxkIGJlIGEgbGFtYmRhLCBidXQgdGhhdCBjcmFzaGVzIEdDQyA0LjcuCituYW1lc3BhY2UgYmZpX2RldGFpbCB7CisKK3RlbXBsYXRlIDxjbGFzcyBCVD4gc3RydWN0IEJsb2NrRWRnZXNBZGRlciB7CisgIHVzaW5nIEJsb2NrVCA9IEJUOworICB1c2luZyBMb29wRGF0YSA9IEJsb2NrRnJlcXVlbmN5SW5mb0ltcGxCYXNlOjpMb29wRGF0YTsKKyAgdXNpbmcgU3VjY2Vzc29yID0gR3JhcGhUcmFpdHM8Y29uc3QgQmxvY2tUICo+OworCisgIGNvbnN0IEJsb2NrRnJlcXVlbmN5SW5mb0ltcGw8QlQ+ICZCRkk7CisKKyAgZXhwbGljaXQgQmxvY2tFZGdlc0FkZGVyKGNvbnN0IEJsb2NrRnJlcXVlbmN5SW5mb0ltcGw8QlQ+ICZCRkkpCisgICAgICA6IEJGSShCRkkpIHt9CisKKyAgdm9pZCBvcGVyYXRvcigpKElycmVkdWNpYmxlR3JhcGggJkcsIElycmVkdWNpYmxlR3JhcGg6Oklyck5vZGUgJklyciwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3BEYXRhICpPdXRlckxvb3ApIHsKKyAgICBjb25zdCBCbG9ja1QgKkJCID0gQkZJLlJQT1RbSXJyLk5vZGUuSW5kZXhdOworICAgIGZvciAoY29uc3QgYXV0byBTdWNjIDogY2hpbGRyZW48Y29uc3QgQmxvY2tUICo+KEJCKSkKKyAgICAgIEcuYWRkRWRnZShJcnIsIEJGSS5nZXROb2RlKFN1Y2MpLCBPdXRlckxvb3ApOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgYmZpX2RldGFpbAorCit0ZW1wbGF0ZSA8Y2xhc3MgQlQ+Cit2b2lkIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGw8QlQ+Ojpjb21wdXRlSXJyZWR1Y2libGVNYXNzKAorICAgIExvb3BEYXRhICpPdXRlckxvb3AsIHN0ZDo6bGlzdDxMb29wRGF0YT46Oml0ZXJhdG9yIEluc2VydCkgeworICBERUJVRyhkYmdzKCkgPDwgImFuYWx5emUtaXJyZWR1Y2libGUtaW4tIjsKKyAgICAgICAgaWYgKE91dGVyTG9vcCkgZGJncygpIDw8ICJsb29wOiAiIDw8IGdldExvb3BOYW1lKCpPdXRlckxvb3ApIDw8ICJcbiI7CisgICAgICAgIGVsc2UgZGJncygpIDw8ICJmdW5jdGlvblxuIik7CisKKyAgdXNpbmcgbmFtZXNwYWNlIGJmaV9kZXRhaWw7CisKKyAgLy8gSWRlYWxseSwgYWRkQmxvY2tFZGdlcygpIHdvdWxkIGJlIGRlY2xhcmVkIGhlcmUgYXMgYSBsYW1iZGEsIGJ1dCB0aGF0CisgIC8vIGNyYXNoZXMgR0NDIDQuNy4KKyAgQmxvY2tFZGdlc0FkZGVyPEJUPiBhZGRCbG9ja0VkZ2VzKCp0aGlzKTsKKyAgSXJyZWR1Y2libGVHcmFwaCBHKCp0aGlzLCBPdXRlckxvb3AsIGFkZEJsb2NrRWRnZXMpOworCisgIGZvciAoYXV0byAmTCA6IGFuYWx5emVJcnJlZHVjaWJsZShHLCBPdXRlckxvb3AsIEluc2VydCkpCisgICAgY29tcHV0ZU1hc3NJbkxvb3AoTCk7CisKKyAgaWYgKCFPdXRlckxvb3ApCisgICAgcmV0dXJuOworICB1cGRhdGVMb29wV2l0aElycmVkdWNpYmxlKCpPdXRlckxvb3ApOworfQorCisvLyBBIGhlbHBlciBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGEgYnJhbmNoIHByb2JhYmlsaXR5IGludG8gd2VpZ2h0LgoraW5saW5lIHVpbnQzMl90IGdldFdlaWdodEZyb21CcmFuY2hQcm9iKGNvbnN0IEJyYW5jaFByb2JhYmlsaXR5IFByb2IpIHsKKyAgcmV0dXJuIFByb2IuZ2V0TnVtZXJhdG9yKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCVD4KK2Jvb2wKK0Jsb2NrRnJlcXVlbmN5SW5mb0ltcGw8QlQ+Ojpwcm9wYWdhdGVNYXNzVG9TdWNjZXNzb3JzKExvb3BEYXRhICpPdXRlckxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCbG9ja05vZGUgJk5vZGUpIHsKKyAgREVCVUcoZGJncygpIDw8ICIgLSBub2RlOiAiIDw8IGdldEJsb2NrTmFtZShOb2RlKSA8PCAiXG4iKTsKKyAgLy8gQ2FsY3VsYXRlIHByb2JhYmlsaXR5IGZvciBzdWNjZXNzb3JzLgorICBEaXN0cmlidXRpb24gRGlzdDsKKyAgaWYgKGF1dG8gKkxvb3AgPSBXb3JraW5nW05vZGUuSW5kZXhdLmdldFBhY2thZ2VkTG9vcCgpKSB7CisgICAgYXNzZXJ0KExvb3AgIT0gT3V0ZXJMb29wICYmICJDYW5ub3QgcHJvcGFnYXRlIG1hc3MgaW4gYSBwYWNrYWdlZCBsb29wIik7CisgICAgaWYgKCFhZGRMb29wU3VjY2Vzc29yc1RvRGlzdChPdXRlckxvb3AsICpMb29wLCBEaXN0KSkKKyAgICAgIC8vIElycmVkdWNpYmxlIGJhY2tlZGdlLgorICAgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIGNvbnN0IEJsb2NrVCAqQkIgPSBnZXRCbG9jayhOb2RlKTsKKyAgICBmb3IgKGF1dG8gU0kgPSBHcmFwaFRyYWl0czxjb25zdCBCbG9ja1QgKj46OmNoaWxkX2JlZ2luKEJCKSwKKyAgICAgICAgICAgICAgU0UgPSBHcmFwaFRyYWl0czxjb25zdCBCbG9ja1QgKj46OmNoaWxkX2VuZChCQik7CisgICAgICAgICBTSSAhPSBTRTsgKytTSSkKKyAgICAgIGlmICghYWRkVG9EaXN0KAorICAgICAgICAgICAgICBEaXN0LCBPdXRlckxvb3AsIE5vZGUsIGdldE5vZGUoKlNJKSwKKyAgICAgICAgICAgICAgZ2V0V2VpZ2h0RnJvbUJyYW5jaFByb2IoQlBJLT5nZXRFZGdlUHJvYmFiaWxpdHkoQkIsIFNJKSkpKQorICAgICAgICAvLyBJcnJlZHVjaWJsZSBiYWNrZWRnZS4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gRGlzdHJpYnV0ZSBtYXNzIHRvIHN1Y2Nlc3NvcnMsIHNhdmluZyBleGl0IGFuZCBiYWNrZWRnZSBkYXRhIGluIHRoZQorICAvLyBsb29wIGhlYWRlci4KKyAgZGlzdHJpYnV0ZU1hc3MoTm9kZSwgT3V0ZXJMb29wLCBEaXN0KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCVD4KK3Jhd19vc3RyZWFtICZCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsPEJUPjo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIGlmICghRikKKyAgICByZXR1cm4gT1M7CisgIE9TIDw8ICJibG9jay1mcmVxdWVuY3ktaW5mbzogIiA8PCBGLT5nZXROYW1lKCkgPDwgIlxuIjsKKyAgZm9yIChjb25zdCBCbG9ja1QgJkJCIDogKkYpIHsKKyAgICBPUyA8PCAiIC0gIiA8PCBiZmlfZGV0YWlsOjpnZXRCbG9ja05hbWUoJkJCKSA8PCAiOiBmbG9hdCA9ICI7CisgICAgZ2V0RmxvYXRpbmdCbG9ja0ZyZXEoJkJCKS5wcmludChPUywgNSkKKyAgICAgICAgPDwgIiwgaW50ID0gIiA8PCBnZXRCbG9ja0ZyZXEoJkJCKS5nZXRGcmVxdWVuY3koKTsKKyAgICBpZiAoT3B0aW9uYWw8dWludDY0X3Q+IFByb2ZpbGVDb3VudCA9CisgICAgICAgIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGxCYXNlOjpnZXRCbG9ja1Byb2ZpbGVDb3VudCgKKyAgICAgICAgICAgIEYtPmdldEZ1bmN0aW9uKCksIGdldE5vZGUoJkJCKSkpCisgICAgICBPUyA8PCAiLCBjb3VudCA9ICIgPDwgUHJvZmlsZUNvdW50LmdldFZhbHVlKCk7CisgICAgaWYgKE9wdGlvbmFsPHVpbnQ2NF90PiBJcnJMb29wSGVhZGVyV2VpZ2h0ID0KKyAgICAgICAgQkIuZ2V0SXJyTG9vcEhlYWRlcldlaWdodCgpKQorICAgICAgT1MgPDwgIiwgaXJyX2xvb3BfaGVhZGVyX3dlaWdodCA9ICIgPDwgSXJyTG9vcEhlYWRlcldlaWdodC5nZXRWYWx1ZSgpOworICAgIE9TIDw8ICJcbiI7CisgIH0KKworICAvLyBBZGQgYW4gZXh0cmEgbmV3bGluZSBmb3IgcmVhZGFiaWxpdHkuCisgIE9TIDw8ICJcbiI7CisgIHJldHVybiBPUzsKK30KKworLy8gR3JhcGggdHJhaXQgYmFzZSBjbGFzcyBmb3IgYmxvY2sgZnJlcXVlbmN5IGluZm9ybWF0aW9uIGdyYXBoCisvLyB2aWV3ZXIuCisKK2VudW0gR1ZEQUdUeXBlIHsgR1ZEVF9Ob25lLCBHVkRUX0ZyYWN0aW9uLCBHVkRUX0ludGVnZXIsIEdWRFRfQ291bnQgfTsKKwordGVtcGxhdGUgPGNsYXNzIEJsb2NrRnJlcXVlbmN5SW5mb1QsIGNsYXNzIEJyYW5jaFByb2JhYmlsaXR5SW5mb1Q+CitzdHJ1Y3QgQkZJRE9UR3JhcGhUcmFpdHNCYXNlIDogcHVibGljIERlZmF1bHRET1RHcmFwaFRyYWl0cyB7CisgIHVzaW5nIEdUcmFpdHMgPSBHcmFwaFRyYWl0czxCbG9ja0ZyZXF1ZW5jeUluZm9UICo+OworICB1c2luZyBOb2RlUmVmID0gdHlwZW5hbWUgR1RyYWl0czo6Tm9kZVJlZjsKKyAgdXNpbmcgRWRnZUl0ZXIgPSB0eXBlbmFtZSBHVHJhaXRzOjpDaGlsZEl0ZXJhdG9yVHlwZTsKKyAgdXNpbmcgTm9kZUl0ZXIgPSB0eXBlbmFtZSBHVHJhaXRzOjpub2Rlc19pdGVyYXRvcjsKKworICB1aW50NjRfdCBNYXhGcmVxdWVuY3kgPSAwOworCisgIGV4cGxpY2l0IEJGSURPVEdyYXBoVHJhaXRzQmFzZShib29sIGlzU2ltcGxlID0gZmFsc2UpCisgICAgICA6IERlZmF1bHRET1RHcmFwaFRyYWl0cyhpc1NpbXBsZSkge30KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0R3JhcGhOYW1lKGNvbnN0IEJsb2NrRnJlcXVlbmN5SW5mb1QgKkcpIHsKKyAgICByZXR1cm4gRy0+Z2V0RnVuY3Rpb24oKS0+Z2V0TmFtZSgpOworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0Tm9kZUF0dHJpYnV0ZXMoTm9kZVJlZiBOb2RlLCBjb25zdCBCbG9ja0ZyZXF1ZW5jeUluZm9UICpHcmFwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSG90UGVyY2VudFRocmVzaG9sZCA9IDApIHsKKyAgICBzdGQ6OnN0cmluZyBSZXN1bHQ7CisgICAgaWYgKCFIb3RQZXJjZW50VGhyZXNob2xkKQorICAgICAgcmV0dXJuIFJlc3VsdDsKKworICAgIC8vIENvbXB1dGUgTWF4RnJlcXVlbmN5IG9uIHRoZSBmbHk6CisgICAgaWYgKCFNYXhGcmVxdWVuY3kpIHsKKyAgICAgIGZvciAoTm9kZUl0ZXIgSSA9IEdUcmFpdHM6Om5vZGVzX2JlZ2luKEdyYXBoKSwKKyAgICAgICAgICAgICAgICAgICAgRSA9IEdUcmFpdHM6Om5vZGVzX2VuZChHcmFwaCk7CisgICAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICAgIE5vZGVSZWYgTiA9ICpJOworICAgICAgICBNYXhGcmVxdWVuY3kgPQorICAgICAgICAgICAgc3RkOjptYXgoTWF4RnJlcXVlbmN5LCBHcmFwaC0+Z2V0QmxvY2tGcmVxKE4pLmdldEZyZXF1ZW5jeSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgQmxvY2tGcmVxdWVuY3kgRnJlcSA9IEdyYXBoLT5nZXRCbG9ja0ZyZXEoTm9kZSk7CisgICAgQmxvY2tGcmVxdWVuY3kgSG90RnJlcSA9CisgICAgICAgIChCbG9ja0ZyZXF1ZW5jeShNYXhGcmVxdWVuY3kpICoKKyAgICAgICAgIEJyYW5jaFByb2JhYmlsaXR5OjpnZXRCcmFuY2hQcm9iYWJpbGl0eShIb3RQZXJjZW50VGhyZXNob2xkLCAxMDApKTsKKworICAgIGlmIChGcmVxIDwgSG90RnJlcSkKKyAgICAgIHJldHVybiBSZXN1bHQ7CisKKyAgICByYXdfc3RyaW5nX29zdHJlYW0gT1MoUmVzdWx0KTsKKyAgICBPUyA8PCAiY29sb3I9XCJyZWRcIiI7CisgICAgT1MuZmx1c2goKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0Tm9kZUxhYmVsKE5vZGVSZWYgTm9kZSwgY29uc3QgQmxvY2tGcmVxdWVuY3lJbmZvVCAqR3JhcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHVkRBR1R5cGUgR1R5cGUsIGludCBsYXlvdXRfb3JkZXIgPSAtMSkgeworICAgIHN0ZDo6c3RyaW5nIFJlc3VsdDsKKyAgICByYXdfc3RyaW5nX29zdHJlYW0gT1MoUmVzdWx0KTsKKworICAgIGlmIChsYXlvdXRfb3JkZXIgIT0gLTEpCisgICAgICBPUyA8PCBOb2RlLT5nZXROYW1lKCkgPDwgIlsiIDw8IGxheW91dF9vcmRlciA8PCAiXSA6ICI7CisgICAgZWxzZQorICAgICAgT1MgPDwgTm9kZS0+Z2V0TmFtZSgpIDw8ICIgOiAiOworICAgIHN3aXRjaCAoR1R5cGUpIHsKKyAgICBjYXNlIEdWRFRfRnJhY3Rpb246CisgICAgICBHcmFwaC0+cHJpbnRCbG9ja0ZyZXEoT1MsIE5vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHVkRUX0ludGVnZXI6CisgICAgICBPUyA8PCBHcmFwaC0+Z2V0QmxvY2tGcmVxKE5vZGUpLmdldEZyZXF1ZW5jeSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHVkRUX0NvdW50OiB7CisgICAgICBhdXRvIENvdW50ID0gR3JhcGgtPmdldEJsb2NrUHJvZmlsZUNvdW50KE5vZGUpOworICAgICAgaWYgKENvdW50KQorICAgICAgICBPUyA8PCBDb3VudC5nZXRWYWx1ZSgpOworICAgICAgZWxzZQorICAgICAgICBPUyA8PCAiVW5rbm93biI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHVkRUX05vbmU6CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJJZiB3ZSBhcmUgbm90IHN1cHBvc2VkIHRvIHJlbmRlciBhIGdyYXBoIHdlIHNob3VsZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJuZXZlciByZWFjaCB0aGlzIHBvaW50LiIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0RWRnZUF0dHJpYnV0ZXMoTm9kZVJlZiBOb2RlLCBFZGdlSXRlciBFSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvY2tGcmVxdWVuY3lJbmZvVCAqQkZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCcmFuY2hQcm9iYWJpbGl0eUluZm9UICpCUEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEhvdFBlcmNlbnRUaHJlc2hvbGQgPSAwKSB7CisgICAgc3RkOjpzdHJpbmcgU3RyOworICAgIGlmICghQlBJKQorICAgICAgcmV0dXJuIFN0cjsKKworICAgIEJyYW5jaFByb2JhYmlsaXR5IEJQID0gQlBJLT5nZXRFZGdlUHJvYmFiaWxpdHkoTm9kZSwgRUkpOworICAgIHVpbnQzMl90IE4gPSBCUC5nZXROdW1lcmF0b3IoKTsKKyAgICB1aW50MzJfdCBEID0gQlAuZ2V0RGVub21pbmF0b3IoKTsKKyAgICBkb3VibGUgUGVyY2VudCA9IDEwMC4wICogTiAvIEQ7CisgICAgcmF3X3N0cmluZ19vc3RyZWFtIE9TKFN0cik7CisgICAgT1MgPDwgZm9ybWF0KCJsYWJlbD1cIiUuMWYlJVwiIiwgUGVyY2VudCk7CisKKyAgICBpZiAoSG90UGVyY2VudFRocmVzaG9sZCkgeworICAgICAgQmxvY2tGcmVxdWVuY3kgRUZyZXEgPSBCRkktPmdldEJsb2NrRnJlcShOb2RlKSAqIEJQOworICAgICAgQmxvY2tGcmVxdWVuY3kgSG90RnJlcSA9IEJsb2NrRnJlcXVlbmN5KE1heEZyZXF1ZW5jeSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyYW5jaFByb2JhYmlsaXR5KEhvdFBlcmNlbnRUaHJlc2hvbGQsIDEwMCk7CisKKyAgICAgIGlmIChFRnJlcSA+PSBIb3RGcmVxKSB7CisgICAgICAgIE9TIDw8ICIsY29sb3I9XCJyZWRcIiI7CisgICAgICB9CisgICAgfQorCisgICAgT1MuZmx1c2goKTsKKyAgICByZXR1cm4gU3RyOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjdW5kZWYgREVCVUdfVFlQRQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19CTE9DS0ZSRVFVRU5DWUlORk9JTVBMX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQnJhbmNoUHJvYmFiaWxpdHlJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0JyYW5jaFByb2JhYmlsaXR5SW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxN2I2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0JyYW5jaFByb2JhYmlsaXR5SW5mby5oCkBAIC0wLDAgKzEsMjUzIEBACisvLz09PS0gQnJhbmNoUHJvYmFiaWxpdHlJbmZvLmggLSBCcmFuY2ggUHJvYmFiaWxpdHkgQW5hbHlzaXMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBpcyB1c2VkIHRvIGV2YWx1YXRlIGJyYW5jaCBwcm9iYWJpbHRpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0JSQU5DSFBST0JBQklMSVRZSU5GT19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQlJBTkNIUFJPQkFCSUxJVFlJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vSVIvQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQnJhbmNoUHJvYmFiaWxpdHkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIExvb3BJbmZvOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbzsKK2NsYXNzIFZhbHVlOworCisvLy8gXGJyaWVmIEFuYWx5c2lzIHByb3ZpZGluZyBicmFuY2ggcHJvYmFiaWxpdHkgaW5mb3JtYXRpb24uCisvLy8KKy8vLyBUaGlzIGlzIGEgZnVuY3Rpb24gYW5hbHlzaXMgd2hpY2ggcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHJlbGF0aXZlCisvLy8gcHJvYmFiaWxpdGllcyBvZiBlYWNoICJlZGdlIiBpbiB0aGUgZnVuY3Rpb24ncyBDRkcgd2hlcmUgc3VjaCBhbiBlZGdlIGlzCisvLy8gZGVmaW5lZCBieSBhIHBhaXIgKFByZWRCbG9jayBhbmQgYW4gaW5kZXggaW4gdGhlIHN1Y2Nlc3NvcnMpLiBUaGUKKy8vLyBwcm9iYWJpbGl0eSBvZiBhbiBlZGdlIGZyb20gb25lIGJsb2NrIGlzIGFsd2F5cyByZWxhdGl2ZSB0byB0aGUKKy8vLyBwcm9iYWJpbGl0aWVzIG9mIG90aGVyIGVkZ2VzIGZyb20gdGhlIGJsb2NrLiBUaGUgcHJvYmFiaWxpdGVzIG9mIGFsbCBlZGdlcworLy8vIGZyb20gYSBibG9jayBzdW0gdG8gZXhhY3RseSBvbmUgKDEwMCUpLgorLy8vIFdlIHVzZSBhIHBhaXIgKFByZWRCbG9jayBhbmQgYW4gaW5kZXggaW4gdGhlIHN1Y2Nlc3NvcnMpIHRvIHVuaXF1ZWx5CisvLy8gaWRlbnRpZnkgYW4gZWRnZSwgc2luY2Ugd2UgY2FuIGhhdmUgbXVsdGlwbGUgZWRnZXMgZnJvbSBTcmMgdG8gRHN0LgorLy8vIEFzIGFuIGV4YW1wbGUsIHdlIGNhbiBoYXZlIGEgc3dpdGNoIHdoaWNoIGp1bXBzIHRvIERzdCB3aXRoIHZhbHVlIDAgYW5kCisvLy8gdmFsdWUgMTAuCitjbGFzcyBCcmFuY2hQcm9iYWJpbGl0eUluZm8geworcHVibGljOgorICBCcmFuY2hQcm9iYWJpbGl0eUluZm8oKSA9IGRlZmF1bHQ7CisKKyAgQnJhbmNoUHJvYmFiaWxpdHlJbmZvKGNvbnN0IEZ1bmN0aW9uICZGLCBjb25zdCBMb29wSW5mbyAmTEksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJID0gbnVsbHB0cikgeworICAgIGNhbGN1bGF0ZShGLCBMSSwgVExJKTsKKyAgfQorCisgIEJyYW5jaFByb2JhYmlsaXR5SW5mbyhCcmFuY2hQcm9iYWJpbGl0eUluZm8gJiZBcmcpCisgICAgICA6IFByb2JzKHN0ZDo6bW92ZShBcmcuUHJvYnMpKSwgTGFzdEYoQXJnLkxhc3RGKSwKKyAgICAgICAgUG9zdERvbWluYXRlZEJ5VW5yZWFjaGFibGUoc3RkOjptb3ZlKEFyZy5Qb3N0RG9taW5hdGVkQnlVbnJlYWNoYWJsZSkpLAorICAgICAgICBQb3N0RG9taW5hdGVkQnlDb2xkQ2FsbChzdGQ6Om1vdmUoQXJnLlBvc3REb21pbmF0ZWRCeUNvbGRDYWxsKSkge30KKworICBCcmFuY2hQcm9iYWJpbGl0eUluZm8oY29uc3QgQnJhbmNoUHJvYmFiaWxpdHlJbmZvICYpID0gZGVsZXRlOworICBCcmFuY2hQcm9iYWJpbGl0eUluZm8gJm9wZXJhdG9yPShjb25zdCBCcmFuY2hQcm9iYWJpbGl0eUluZm8gJikgPSBkZWxldGU7CisKKyAgQnJhbmNoUHJvYmFiaWxpdHlJbmZvICZvcGVyYXRvcj0oQnJhbmNoUHJvYmFiaWxpdHlJbmZvICYmUkhTKSB7CisgICAgcmVsZWFzZU1lbW9yeSgpOworICAgIFByb2JzID0gc3RkOjptb3ZlKFJIUy5Qcm9icyk7CisgICAgUG9zdERvbWluYXRlZEJ5Q29sZENhbGwgPSBzdGQ6Om1vdmUoUkhTLlBvc3REb21pbmF0ZWRCeUNvbGRDYWxsKTsKKyAgICBQb3N0RG9taW5hdGVkQnlVbnJlYWNoYWJsZSA9IHN0ZDo6bW92ZShSSFMuUG9zdERvbWluYXRlZEJ5VW5yZWFjaGFibGUpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpOworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCBhbiBlZGdlJ3MgcHJvYmFiaWxpdHksIHJlbGF0aXZlIHRvIG90aGVyIG91dC1lZGdlcyBvZiB0aGUgU3JjLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZyYWN0aW9uYWwgcHJvYmFiaWxpdHkgYmV0d2VlbiB6ZXJvCisgIC8vLyAoMCUpIGFuZCBvbmUgKDEwMCUpIG9mIHRoaXMgZWRnZSBleGVjdXRpbmcsIHJlbGF0aXZlIHRvIG90aGVyIGVkZ2VzCisgIC8vLyBsZWF2aW5nIHRoZSAnU3JjJyBibG9jay4gVGhlIHJldHVybmVkIHByb2JhYmlsaXR5IGlzIG5ldmVyIHplcm8sIGFuZCBjYW4KKyAgLy8vIG9ubHkgYmUgb25lIGlmIHRoZSBzb3VyY2UgYmxvY2sgaGFzIG9ubHkgb25lIHN1Y2Nlc3Nvci4KKyAgQnJhbmNoUHJvYmFiaWxpdHkgZ2V0RWRnZVByb2JhYmlsaXR5KGNvbnN0IEJhc2ljQmxvY2sgKlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGV4SW5TdWNjZXNzb3JzKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgcHJvYmFiaWxpdHkgb2YgZ29pbmcgZnJvbSBTcmMgdG8gRHN0LgorICAvLy8KKyAgLy8vIEl0IHJldHVybnMgdGhlIHN1bSBvZiBhbGwgcHJvYmFiaWxpdGllcyBmb3IgZWRnZXMgZnJvbSBTcmMgdG8gRHN0LgorICBCcmFuY2hQcm9iYWJpbGl0eSBnZXRFZGdlUHJvYmFiaWxpdHkoY29uc3QgQmFzaWNCbG9jayAqU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmFzaWNCbG9jayAqRHN0KSBjb25zdDsKKworICBCcmFuY2hQcm9iYWJpbGl0eSBnZXRFZGdlUHJvYmFiaWxpdHkoY29uc3QgQmFzaWNCbG9jayAqU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY19jb25zdF9pdGVyYXRvciBEc3QpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVGVzdCBpZiBhbiBlZGdlIGlzIGhvdCByZWxhdGl2ZSB0byBvdGhlciBvdXQtZWRnZXMgb2YgdGhlIFNyYy4KKyAgLy8vCisgIC8vLyBDaGVjayB3aGV0aGVyIHRoaXMgZWRnZSBvdXQgb2YgdGhlIHNvdXJjZSBibG9jayBpcyAnaG90Jy4gV2UgZGVmaW5lIGhvdAorICAvLy8gYXMgaGF2aW5nIGEgcmVsYXRpdmUgcHJvYmFiaWxpdHkgPj0gODAlLgorICBib29sIGlzRWRnZUhvdChjb25zdCBCYXNpY0Jsb2NrICpTcmMsIGNvbnN0IEJhc2ljQmxvY2sgKkRzdCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgaG90IHN1Y2Nlc3NvciBvZiBhIGJsb2NrIGlmIG9uZSBleGlzdHMuCisgIC8vLworICAvLy8gR2l2ZW4gYSBiYXNpYyBibG9jaywgbG9vayB0aHJvdWdoIGl0cyBzdWNjZXNzb3JzIGFuZCBpZiBvbmUgZXhpc3RzIGZvcgorICAvLy8gd2hpY2ggXHNlZSBpc0VkZ2VIb3Qgd291bGQgcmV0dXJuIHRydWUsIHJldHVybiB0aGF0IHN1Y2Nlc3NvciBibG9jay4KKyAgY29uc3QgQmFzaWNCbG9jayAqZ2V0SG90U3VjYyhjb25zdCBCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBQcmludCBhbiBlZGdlJ3MgcHJvYmFiaWxpdHkuCisgIC8vLworICAvLy8gUmV0cmlldmVzIGFuIGVkZ2UncyBwcm9iYWJpbGl0eSBzaW1pbGFybHkgdG8gXHNlZSBnZXRFZGdlUHJvYmFiaWxpdHksIGJ1dAorICAvLy8gdGhlbiBwcmludHMgdGhhdCBwcm9iYWJpbGl0eSB0byB0aGUgcHJvdmlkZWQgc3RyZWFtLiBUaGF0IHN0cmVhbSBpcyB0aGVuCisgIC8vLyByZXR1cm5lZC4KKyAgcmF3X29zdHJlYW0gJnByaW50RWRnZVByb2JhYmlsaXR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgQmFzaWNCbG9jayAqU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmFzaWNCbG9jayAqRHN0KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFNldCB0aGUgcmF3IGVkZ2UgcHJvYmFiaWxpdHkgZm9yIHRoZSBnaXZlbiBlZGdlLgorICAvLy8KKyAgLy8vIFRoaXMgYWxsb3dzIGEgcGFzcyB0byBleHBsaWNpdGx5IHNldCB0aGUgZWRnZSBwcm9iYWJpbGl0eSBmb3IgYW4gZWRnZS4gSXQKKyAgLy8vIGNhbiBiZSB1c2VkIHdoZW4gdXBkYXRpbmcgdGhlIENGRyB0byB1cGRhdGUgYW5kIHByZXNlcnZlIHRoZSBicmFuY2gKKyAgLy8vIHByb2JhYmlsaXR5IGluZm9ybWF0aW9uLiBSZWFkIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBob3cgdGhlc2UgZWRnZQorICAvLy8gcHJvYmFiaWxpdGllcyBhcmUgY2FsY3VsYXRlZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIQorICB2b2lkIHNldEVkZ2VQcm9iYWJpbGl0eShjb25zdCBCYXNpY0Jsb2NrICpTcmMsIHVuc2lnbmVkIEluZGV4SW5TdWNjZXNzb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCcmFuY2hQcm9iYWJpbGl0eSBQcm9iKTsKKworICBzdGF0aWMgQnJhbmNoUHJvYmFiaWxpdHkgZ2V0QnJhbmNoUHJvYlN0YWNrUHJvdGVjdG9yKGJvb2wgSXNMaWtlbHkpIHsKKyAgICBzdGF0aWMgY29uc3QgQnJhbmNoUHJvYmFiaWxpdHkgTGlrZWx5UHJvYigoMXUgPDwgMjApIC0gMSwgMXUgPDwgMjApOworICAgIHJldHVybiBJc0xpa2VseSA/IExpa2VseVByb2IgOiBMaWtlbHlQcm9iLmdldENvbXBsKCk7CisgIH0KKworICB2b2lkIGNhbGN1bGF0ZShjb25zdCBGdW5jdGlvbiAmRiwgY29uc3QgTG9vcEluZm8gJkxJLAorICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJID0gbnVsbHB0cik7CisKKyAgLy8vIEZvcmdldCBhbmFseXNpcyByZXN1bHRzIGZvciB0aGUgZ2l2ZW4gYmFzaWMgYmxvY2suCisgIHZvaWQgZXJhc2VCbG9jayhjb25zdCBCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8gVXNlIHRvIHRyYWNrIFNDQ3MgZm9yIGhhbmRsaW5nIGlycmVkdWNpYmxlIGxvb3BzLgorICB1c2luZyBTY2NNYXAgPSBEZW5zZU1hcDxjb25zdCBCYXNpY0Jsb2NrICosIGludD47CisgIHVzaW5nIFNjY0hlYWRlck1hcCA9IERlbnNlTWFwPGNvbnN0IEJhc2ljQmxvY2sgKiwgYm9vbD47CisgIHVzaW5nIFNjY0hlYWRlck1hcHMgPSBzdGQ6OnZlY3RvcjxTY2NIZWFkZXJNYXA+OworICBzdHJ1Y3QgU2NjSW5mbyB7CisgICAgU2NjTWFwIFNjY051bXM7CisgICAgU2NjSGVhZGVyTWFwcyBTY2NIZWFkZXJzOworICB9OworCitwcml2YXRlOgorICAvLyBXZSBuZWVkIHRvIHN0b3JlIENhbGxiYWNrVkgncyBpbiBvcmRlciB0byBjb3JyZWN0bHkgaGFuZGxlIGJhc2ljIGJsb2NrCisgIC8vIHJlbW92YWwuCisgIGNsYXNzIEJhc2ljQmxvY2tDYWxsYmFja1ZIIGZpbmFsIDogcHVibGljIENhbGxiYWNrVkggeworICAgIEJyYW5jaFByb2JhYmlsaXR5SW5mbyAqQlBJOworCisgICAgdm9pZCBkZWxldGVkKCkgb3ZlcnJpZGUgeworICAgICAgYXNzZXJ0KEJQSSAhPSBudWxscHRyKTsKKyAgICAgIEJQSS0+ZXJhc2VCbG9jayhjYXN0PEJhc2ljQmxvY2s+KGdldFZhbFB0cigpKSk7CisgICAgICBCUEktPkhhbmRsZXMuZXJhc2UoKnRoaXMpOworICAgIH0KKworICBwdWJsaWM6CisgICAgQmFzaWNCbG9ja0NhbGxiYWNrVkgoY29uc3QgVmFsdWUgKlYsIEJyYW5jaFByb2JhYmlsaXR5SW5mbyAqQlBJID0gbnVsbHB0cikKKyAgICAgICAgOiBDYWxsYmFja1ZIKGNvbnN0X2Nhc3Q8VmFsdWUgKj4oVikpLCBCUEkoQlBJKSB7fQorICB9OworCisgIERlbnNlU2V0PEJhc2ljQmxvY2tDYWxsYmFja1ZILCBEZW5zZU1hcEluZm88VmFsdWUqPj4gSGFuZGxlczsKKworICAvLyBTaW5jZSB3ZSBhbGxvdyBkdXBsaWNhdGUgZWRnZXMgZnJvbSBvbmUgYmFzaWMgYmxvY2sgdG8gYW5vdGhlciwgd2UgdXNlCisgIC8vIGEgcGFpciAoUHJlZEJsb2NrIGFuZCBhbiBpbmRleCBpbiB0aGUgc3VjY2Vzc29ycykgdG8gc3BlY2lmeSBhbiBlZGdlLgorICB1c2luZyBFZGdlID0gc3RkOjpwYWlyPGNvbnN0IEJhc2ljQmxvY2sgKiwgdW5zaWduZWQ+OworCisgIC8vIERlZmF1bHQgd2VpZ2h0IHZhbHVlLiBVc2VkIHdoZW4gd2UgZG9uJ3QgaGF2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZWRnZS4KKyAgLy8gVE9ETzogREVGQVVMVF9XRUlHSFQgbWFrZXMgc2Vuc2UgZHVyaW5nIHN0YXRpYyBwcmVkaWNhdGlvbiwgd2hlbiBub25lIG9mCisgIC8vIHRoZSBzdWNjZXNzb3JzIGhhdmUgYSB3ZWlnaHQgeWV0LiBCdXQgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHdoZW4gcHJvdmlkaW5nCisgIC8vIHdlaWdodCB0byBhbiBlZGdlIHRoYXQgbWF5IGhhdmUgc2libGluZ3Mgd2l0aCBub24temVybyB3ZWlnaHRzLiBUaGlzIGNhbgorICAvLyBiZSBoYW5kbGVkIHZhcmlvdXMgd2F5cywgYnV0IGl0J3MgcHJvYmFibHkgZmluZSBmb3IgYW4gZWRnZSB3aXRoIHVua25vd24KKyAgLy8gd2VpZ2h0IHRvIGp1c3QgImluaGVyaXQiIHRoZSBub24temVybyB3ZWlnaHQgb2YgYW4gYWRqYWNlbnQgc3VjY2Vzc29yLgorICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9XRUlHSFQgPSAxNjsKKworICBEZW5zZU1hcDxFZGdlLCBCcmFuY2hQcm9iYWJpbGl0eT4gUHJvYnM7CisKKyAgLy8vIFxicmllZiBUcmFjayB0aGUgbGFzdCBmdW5jdGlvbiB3ZSBydW4gb3ZlciBmb3IgcHJpbnRpbmcuCisgIGNvbnN0IEZ1bmN0aW9uICpMYXN0RjsKKworICAvLy8gXGJyaWVmIFRyYWNrIHRoZSBzZXQgb2YgYmxvY2tzIGRpcmVjdGx5IHN1Y2NlZWRlZCBieSBhIHJldHVybmluZyBibG9jay4KKyAgU21hbGxQdHJTZXQ8Y29uc3QgQmFzaWNCbG9jayAqLCAxNj4gUG9zdERvbWluYXRlZEJ5VW5yZWFjaGFibGU7CisKKyAgLy8vIFxicmllZiBUcmFjayB0aGUgc2V0IG9mIGJsb2NrcyB0aGF0IGFsd2F5cyBsZWFkIHRvIGEgY29sZCBjYWxsLgorICBTbWFsbFB0clNldDxjb25zdCBCYXNpY0Jsb2NrICosIDE2PiBQb3N0RG9taW5hdGVkQnlDb2xkQ2FsbDsKKworICB2b2lkIHVwZGF0ZVBvc3REb21pbmF0ZWRCeVVucmVhY2hhYmxlKGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKKyAgdm9pZCB1cGRhdGVQb3N0RG9taW5hdGVkQnlDb2xkQ2FsbChjb25zdCBCYXNpY0Jsb2NrICpCQik7CisgIGJvb2wgY2FsY1VucmVhY2hhYmxlSGV1cmlzdGljcyhjb25zdCBCYXNpY0Jsb2NrICpCQik7CisgIGJvb2wgY2FsY01ldGFkYXRhV2VpZ2h0cyhjb25zdCBCYXNpY0Jsb2NrICpCQik7CisgIGJvb2wgY2FsY0NvbGRDYWxsSGV1cmlzdGljcyhjb25zdCBCYXNpY0Jsb2NrICpCQik7CisgIGJvb2wgY2FsY1BvaW50ZXJIZXVyaXN0aWNzKGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKKyAgYm9vbCBjYWxjTG9vcEJyYW5jaEhldXJpc3RpY3MoY29uc3QgQmFzaWNCbG9jayAqQkIsIGNvbnN0IExvb3BJbmZvICZMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NjSW5mbyAmU2NjSSk7CisgIGJvb2wgY2FsY1plcm9IZXVyaXN0aWNzKGNvbnN0IEJhc2ljQmxvY2sgKkJCLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKKyAgYm9vbCBjYWxjRmxvYXRpbmdQb2ludEhldXJpc3RpY3MoY29uc3QgQmFzaWNCbG9jayAqQkIpOworICBib29sIGNhbGNJbnZva2VIZXVyaXN0aWNzKGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKK307CisKKy8vLyBcYnJpZWYgQW5hbHlzaXMgcGFzcyB3aGljaCBjb21wdXRlcyBcYyBCcmFuY2hQcm9iYWJpbGl0eUluZm8uCitjbGFzcyBCcmFuY2hQcm9iYWJpbGl0eUFuYWx5c2lzCisgICAgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48QnJhbmNoUHJvYmFiaWxpdHlBbmFseXNpcz4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48QnJhbmNoUHJvYmFiaWxpdHlBbmFseXNpcz47CisKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIFByb3ZpZGUgdGhlIHJlc3VsdCB0eXBlIGZvciB0aGlzIGFuYWx5c2lzIHBhc3MuCisgIHVzaW5nIFJlc3VsdCA9IEJyYW5jaFByb2JhYmlsaXR5SW5mbzsKKworICAvLy8gXGJyaWVmIFJ1biB0aGUgYW5hbHlzaXMgcGFzcyBvdmVyIGEgZnVuY3Rpb24gYW5kIHByb2R1Y2UgQlBJLgorICBCcmFuY2hQcm9iYWJpbGl0eUluZm8gcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIFxicmllZiBQcmludGVyIHBhc3MgZm9yIHRoZSBcYyBCcmFuY2hQcm9iYWJpbGl0eUFuYWx5c2lzIHJlc3VsdHMuCitjbGFzcyBCcmFuY2hQcm9iYWJpbGl0eVByaW50ZXJQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxCcmFuY2hQcm9iYWJpbGl0eVByaW50ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKworcHVibGljOgorICBleHBsaWNpdCBCcmFuY2hQcm9iYWJpbGl0eVByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPUykgOiBPUyhPUykge30KKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIExlZ2FjeSBhbmFseXNpcyBwYXNzIHdoaWNoIGNvbXB1dGVzIFxjIEJyYW5jaFByb2JhYmlsaXR5SW5mby4KK2NsYXNzIEJyYW5jaFByb2JhYmlsaXR5SW5mb1dyYXBwZXJQYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgIEJyYW5jaFByb2JhYmlsaXR5SW5mbyBCUEk7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgQnJhbmNoUHJvYmFiaWxpdHlJbmZvV3JhcHBlclBhc3MoKSA6IEZ1bmN0aW9uUGFzcyhJRCkgeworICAgIGluaXRpYWxpemVCcmFuY2hQcm9iYWJpbGl0eUluZm9XcmFwcGVyUGFzc1Bhc3MoCisgICAgICAgICpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpKTsKKyAgfQorCisgIEJyYW5jaFByb2JhYmlsaXR5SW5mbyAmZ2V0QlBJKCkgeyByZXR1cm4gQlBJOyB9CisgIGNvbnN0IEJyYW5jaFByb2JhYmlsaXR5SW5mbyAmZ2V0QlBJKCkgY29uc3QgeyByZXR1cm4gQlBJOyB9CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZTsKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGU7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUgKk0gPSBudWxscHRyKSBjb25zdCBvdmVycmlkZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0JSQU5DSFBST0JBQklMSVRZSU5GT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NGRy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DRkcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTY5NDY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DRkcuaApAQCAtMCwwICsxLDE2MSBAQAorLy89PT0tLSBBbmFseXNpcy9DRkcuaCAtIEJhc2ljQmxvY2sgQW5hbHlzZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZhbWlseSBvZiBmdW5jdGlvbnMgcGVyZm9ybXMgYW5hbHlzZXMgb24gYmFzaWMgYmxvY2tzLCBhbmQgaW5zdHJ1Y3Rpb25zCisvLyBjb250YWluZWQgd2l0aGluIGJhc2ljIGJsb2Nrcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfQ0ZHX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19DRkdfSAorCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DRkcuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBMb29wSW5mbzsKK2NsYXNzIFRlcm1pbmF0b3JJbnN0OworCisvLy8gQW5hbHl6ZSB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIHRvIGZpbmQgYWxsIG9mIHRoZSBsb29wIGJhY2tlZGdlcyBpbiB0aGUKKy8vLyBmdW5jdGlvbiBhbmQgcmV0dXJuIHRoZW0uICBUaGlzIGlzIGEgcmVsYXRpdmVseSBjaGVhcCAoY29tcGFyZWQgdG8KKy8vLyBjb21wdXRpbmcgZG9taW5hdG9ycyBhbmQgbG9vcCBpbmZvKSBhbmFseXNpcy4KKy8vLworLy8vIFRoZSBvdXRwdXQgaXMgYWRkZWQgdG8gUmVzdWx0LCBhcyBwYWlycyBvZiA8ZnJvbSx0bz4gZWRnZSBpbmZvLgordm9pZCBGaW5kRnVuY3Rpb25CYWNrZWRnZXMoCisgICAgY29uc3QgRnVuY3Rpb24gJkYsCisgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxjb25zdCBCYXNpY0Jsb2NrICosIGNvbnN0IEJhc2ljQmxvY2sgKj4gPiAmCisgICAgICAgIFJlc3VsdCk7CisKKy8vLyBTZWFyY2ggZm9yIHRoZSBzcGVjaWZpZWQgc3VjY2Vzc29yIG9mIGJhc2ljIGJsb2NrIEJCIGFuZCByZXR1cm4gaXRzIHBvc2l0aW9uCisvLy8gaW4gdGhlIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24ncyBsaXN0IG9mIHN1Y2Nlc3NvcnMuICBJdCBpcyBhbiBlcnJvciB0byBjYWxsCisvLy8gdGhpcyB3aXRoIGEgYmxvY2sgdGhhdCBpcyBub3QgYSBzdWNjZXNzb3IuCit1bnNpZ25lZCBHZXRTdWNjZXNzb3JOdW1iZXIoY29uc3QgQmFzaWNCbG9jayAqQkIsIGNvbnN0IEJhc2ljQmxvY2sgKlN1Y2MpOworCisvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBlZGdlIGlzIGEgY3JpdGljYWwgZWRnZS4gQ3JpdGljYWwgZWRnZXMgYXJlCisvLy8gZWRnZXMgZnJvbSBhIGJsb2NrIHdpdGggbXVsdGlwbGUgc3VjY2Vzc29ycyB0byBhIGJsb2NrIHdpdGggbXVsdGlwbGUKKy8vLyBwcmVkZWNlc3NvcnMuCisvLy8KK2Jvb2wgaXNDcml0aWNhbEVkZ2UoY29uc3QgVGVybWluYXRvckluc3QgKlRJLCB1bnNpZ25lZCBTdWNjTnVtLAorICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93SWRlbnRpY2FsRWRnZXMgPSBmYWxzZSk7CisKKy8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgaW5zdHJ1Y3Rpb24gJ1RvJyBpcyByZWFjaGFibGUgZnJvbSAnRnJvbScsCisvLy8gcmV0dXJuaW5nIHRydWUgaWYgdW5jZXJ0YWluLgorLy8vCisvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgaXMgYSBwYXRoIGZyb20gRnJvbSB0byBUbyB3aXRoaW4gYSBzaW5nbGUgZnVuY3Rpb24uCisvLy8gUmV0dXJucyBmYWxzZSBvbmx5IGlmIHdlIGNhbiBwcm92ZSB0aGF0IG9uY2UgJ0Zyb20nIGhhcyBiZWVuIGV4ZWN1dGVkIHRoZW4KKy8vLyAnVG8nIGNhbiBub3QgYmUgZXhlY3V0ZWQuIENvbnNlcnZhdGl2ZWx5IHJldHVybnMgdHJ1ZS4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gaXMgbGluZWFyIHdpdGggcmVzcGVjdCB0byB0aGUgbnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgQ0ZHLAorLy8vIHdhbGtpbmcgZG93biBzdWNjZXNzb3JzIGZyb20gRnJvbSB0byByZWFjaCBUbywgd2l0aCBhIGZpeGVkIHRocmVzaG9sZC4KKy8vLyBVc2luZyBEVCBvciBMSSBhbGxvd3MgdXMgdG8gYW5zd2VyIG1vcmUgcXVpY2tseS4gTEkgcmVkdWNlcyB0aGUgY29zdCBvZgorLy8vIGFuIGVudGlyZSBsb29wIG9mIGFueSBudW1iZXIgb2YgYmxvY2tzIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBjb3N0IG9mIGEKKy8vLyBzaW5nbGUgYmxvY2suIERUIHJlZHVjZXMgdGhlIGNvc3QgYnkgYWxsb3dpbmcgdGhlIHNlYXJjaCB0byB0ZXJtaW5hdGUgd2hlbgorLy8vIHdlIGZpbmQgYSBibG9jayB0aGF0IGRvbWluYXRlcyB0aGUgYmxvY2sgY29udGFpbmluZyAnVG8nLiBEVCBpcyBtb3N0IHVzZWZ1bAorLy8vIG9uIGJyYW5jaHkgY29kZSBidXQgbm90IGxvb3BzLCBhbmQgTEkgaXMgbW9zdCB1c2VmdWwgb24gY29kZSB3aXRoIGxvb3BzIGJ1dAorLy8vIGRvZXMgbm90IGhlbHAgb24gYnJhbmNoeSBjb2RlIG91dHNpZGUgbG9vcHMuCitib29sIGlzUG90ZW50aWFsbHlSZWFjaGFibGUoY29uc3QgSW5zdHJ1Y3Rpb24gKkZyb20sIGNvbnN0IEluc3RydWN0aW9uICpUbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcEluZm8gKkxJID0gbnVsbHB0cik7CisKKy8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgYmxvY2sgJ1RvJyBpcyByZWFjaGFibGUgZnJvbSAnRnJvbScsIHJldHVybmluZworLy8vIHRydWUgaWYgdW5jZXJ0YWluLgorLy8vCisvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgaXMgYSBwYXRoIGZyb20gRnJvbSB0byBUbyB3aXRoaW4gYSBzaW5nbGUgZnVuY3Rpb24uCisvLy8gUmV0dXJucyBmYWxzZSBvbmx5IGlmIHdlIGNhbiBwcm92ZSB0aGF0IG9uY2UgJ0Zyb20nIGhhcyBiZWVuIHJlYWNoZWQgdGhlbgorLy8vICdUbycgY2FuIG5vdCBiZSBleGVjdXRlZC4gQ29uc2VydmF0aXZlbHkgcmV0dXJucyB0cnVlLgorYm9vbCBpc1BvdGVudGlhbGx5UmVhY2hhYmxlKGNvbnN0IEJhc2ljQmxvY2sgKkZyb20sIGNvbnN0IEJhc2ljQmxvY2sgKlRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wSW5mbyAqTEkgPSBudWxscHRyKTsKKworLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcGF0aCBmcm9tIGEgYmxvY2sgaW4KKy8vLyAnV29ya2xpc3QnIHRvICdTdG9wQkInLCByZXR1cm5pbmcgdHJ1ZSBpZiB1bmNlcnRhaW4uCisvLy8KKy8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcyBhIHBhdGggZnJvbSBhdCBsZWFzdCBvbmUgYmxvY2sgaW4gV29ya2xpc3QgdG8KKy8vLyBTdG9wQkIgd2l0aGluIGEgc2luZ2xlIGZ1bmN0aW9uLiBSZXR1cm5zIGZhbHNlIG9ubHkgaWYgd2UgY2FuIHByb3ZlIHRoYXQKKy8vLyBvbmNlIGFueSBibG9jayBpbiAnV29ya2xpc3QnIGhhcyBiZWVuIHJlYWNoZWQgdGhlbiAnU3RvcEJCJyBjYW4gbm90IGJlCisvLy8gZXhlY3V0ZWQuIENvbnNlcnZhdGl2ZWx5IHJldHVybnMgdHJ1ZS4KK2Jvb2wgaXNQb3RlbnRpYWxseVJlYWNoYWJsZUZyb21NYW55KFNtYWxsVmVjdG9ySW1wbDxCYXNpY0Jsb2NrICo+ICZXb3JrbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKlN0b3BCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3BJbmZvICpMSSA9IG51bGxwdHIpOworCisvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBjb250cm9sIGZsb3cgaW4gXHAgUlBPVHJhdmVyc2FsIGlzIGlycmVkdWNpYmxlLgorLy8vCisvLy8gVGhpcyBpcyBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gdG8gZGV0ZWN0IENGRyBpcnJlZHVjaWJpbGl0eSBiYXNlZCBvbiBsb29wCisvLy8gaW5mbyBhbmFseXNpcy4gSXQgY2FuIGJlIHVzZWQgZm9yIGFueSBraW5kIG9mIENGRyAoTG9vcCwgTWFjaGluZUxvb3AsCisvLy8gRnVuY3Rpb24sIE1hY2hpbmVGdW5jdGlvbiwgZXRjLikgYnkgcHJvdmlkaW5nIGFuIFJQTyB0cmF2ZXJzYWwgKFxwCisvLy8gUlBPVHJhdmVyc2FsKSBhbmQgdGhlIGxvb3AgaW5mbyBhbmFseXNpcyAoXHAgTEkpIG9mIHRoZSBDRkcuIFRoaXMgdXRpbGl0eQorLy8vIGZ1bmN0aW9uIGlzIG9ubHkgcmVjb21tZW5kZWQgd2hlbiBsb29wIGluZm8gYW5hbHlzaXMgaXMgYXZhaWxhYmxlLiBJZiBsb29wCisvLy8gaW5mbyBhbmFseXNpcyBpc24ndCBhdmFpbGFibGUsIHBsZWFzZSwgZG9uJ3QgY29tcHV0ZSBpdCBleHBsaWNpdGx5IGZvciB0aGlzCisvLy8gcHVycG9zZS4gVGhlcmUgYXJlIG1vcmUgZWZmaWNpZW50IHdheXMgdG8gZGV0ZWN0IENGRyBpcnJlZHVjaWJpbGl0eSB0aGF0CisvLy8gZG9uJ3QgcmVxdWlyZSByZWNvbXB1dGluZyBsb29wIGluZm8gYW5hbHlzaXMgKGUuZy4sIFQxL1QyIG9yIFRhcmphbidzCisvLy8gYWxnb3JpdGhtKS4KKy8vLworLy8vIFJlcXVpcmVtZW50czoKKy8vLyAgIDEpIEdyYXBoVHJhaXRzIG11c3QgYmUgaW1wbGVtZW50ZWQgZm9yIE5vZGVUIHR5cGUuIEl0IGlzIHVzZWQgdG8gYWNjZXNzCisvLy8gICAgICBOb2RlVCBzdWNjZXNzb3JzLgorLy8gICAgMikgXHAgUlBPVHJhdmVyc2FsIG11c3QgYmUgYSB2YWxpZCByZXZlcnNlIHBvc3Qtb3JkZXIgdHJhdmVyc2FsIG9mIHRoZQorLy8vICAgICAgdGFyZ2V0IENGRyB3aXRoIGJlZ2luKCkvZW5kKCkgaXRlcmF0b3IgaW50ZXJmYWNlcy4KKy8vLyAgIDMpIFxwIExJIG11c3QgYmUgYSB2YWxpZCBMb29wSW5mb0Jhc2UgdGhhdCBjb250YWlucyB1cC10by1kYXRlIGxvb3AKKy8vLyAgICAgIGFuYWx5c2lzIGluZm9ybWF0aW9uIG9mIHRoZSBDRkcuCisvLy8KKy8vLyBUaGlzIGFsZ29yaXRobSB1c2VzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCByZWR1Y2libGUgbG9vcCBiYWNrLWVkZ2VzIGFscmVhZHkKKy8vLyBjb21wdXRlZCBpbiBccCBMSS4gV2hlbiBhIGJhY2stZWRnZSBpcyBmb3VuZCBkdXJpbmcgdGhlIFJQTyB0cmF2ZXJzYWwsIHRoZQorLy8vIGFsZ29yaXRobSBjaGVja3Mgd2hldGhlciB0aGUgYmFjay1lZGdlIGlzIG9uZSBvZiB0aGUgcmVkdWNpYmxlIGJhY2stZWRnZXMgaW4KKy8vLyBsb29wIGluZm8uIElmIGl0IGlzbid0LCB0aGUgQ0ZHIGlzIGlycmVkdWNpYmxlLiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBDRkcKKy8vLyBiZWxvdyAoY2Fub25pY2FsIGlycmVkdWNpYmxlIGdyYXBoKSBsb29wIGluZm8gd29uJ3QgY29udGFpbiBhbnkgbG9vcCwgc28gdGhlCisvLy8gYWxnb3JpdGhtIHdpbGwgcmV0dXJuIHRoYXQgdGhlIENGRyBpcyBpcnJlZHVjaWJsZSB3aGVuIGNoZWNraW5nIHRoZSBCIDwtCisvLy8gLT4gQyBiYWNrLWVkZ2UuCisvLy8KKy8vLyAoQS0+QiwgQS0+QywgQi0+QywgQy0+QiwgQy0+RCkKKy8vLyAgICBBCisvLy8gIC8gICBcCisvLy8gQjwtIC0+QworLy8vICAgICAgIHwKKy8vLyAgICAgICBECisvLy8KK3RlbXBsYXRlIDxjbGFzcyBOb2RlVCwgY2xhc3MgUlBPVHJhdmVyc2FsVCwgY2xhc3MgTG9vcEluZm9ULAorICAgICAgICAgIGNsYXNzIEdUID0gR3JhcGhUcmFpdHM8Tm9kZVQ+PgorYm9vbCBjb250YWluc0lycmVkdWNpYmxlQ0ZHKFJQT1RyYXZlcnNhbFQgJlJQT1RyYXZlcnNhbCwgY29uc3QgTG9vcEluZm9UICZMSSkgeworICAvLy8gQ2hlY2sgd2hldGhlciB0aGUgZWRnZSAoXHAgU3JjLCBccCBEc3QpIGlzIGEgcmVkdWNpYmxlIGxvb3AgYmFja2VkZ2UKKyAgLy8vIGFjY29yZGluZyB0byBMSS4gSS5lLiwgY2hlY2sgaWYgdGhlcmUgZXhpc3RzIGEgbG9vcCB0aGF0IGNvbnRhaW5zIFNyYyBhbmQKKyAgLy8vIHdoZXJlIERzdCBpcyB0aGUgbG9vcCBoZWFkZXIuCisgIGF1dG8gaXNQcm9wZXJCYWNrZWRnZSA9IFsmXShOb2RlVCBTcmMsIE5vZGVUIERzdCkgeworICAgIGZvciAoY29uc3QgYXV0byAqTHAgPSBMSS5nZXRMb29wRm9yKFNyYyk7IExwOyBMcCA9IExwLT5nZXRQYXJlbnRMb29wKCkpIHsKKyAgICAgIGlmIChMcC0+Z2V0SGVhZGVyKCkgPT0gRHN0KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9OworCisgIFNtYWxsUHRyU2V0PE5vZGVULCAzMj4gVmlzaXRlZDsKKyAgZm9yIChOb2RlVCBOb2RlIDogUlBPVHJhdmVyc2FsKSB7CisgICAgVmlzaXRlZC5pbnNlcnQoTm9kZSk7CisgICAgZm9yIChOb2RlVCBTdWNjIDogbWFrZV9yYW5nZShHVDo6Y2hpbGRfYmVnaW4oTm9kZSksIEdUOjpjaGlsZF9lbmQoTm9kZSkpKSB7CisgICAgICAvLyBTdWNjIGhhc24ndCBiZWVuIHZpc2l0ZWQgeWV0CisgICAgICBpZiAoIVZpc2l0ZWQuY291bnQoU3VjYykpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gV2UgYWxyZWFkeSB2aXNpdGVkIFN1Y2MsIHRodXMgTm9kZS0+U3VjYyBtdXN0IGJlIGEgYmFja2VkZ2UuIENoZWNrIHRoYXQKKyAgICAgIC8vIHRoZSBoZWFkIG1hdGNoZXMgd2hhdCB3ZSBoYXZlIGluIHRoZSBsb29wIGluZm9ybWF0aW9uLiBPdGhlcndpc2UsIHdlCisgICAgICAvLyBoYXZlIGFuIGlycmVkdWNpYmxlIGdyYXBoLgorICAgICAgaWYgKCFpc1Byb3BlckJhY2tlZGdlKE5vZGUsIFN1Y2MpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9Cit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ0ZHUHJpbnRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DRkdQcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc4Njc2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ0ZHUHJpbnRlci5oCkBAIC0wLDAgKzEsMTg3IEBACisvLz09PS0tIENGR1ByaW50ZXIuaCAtIENGRyBwcmludGVyIGV4dGVybmFsIGludGVyZmFjZSAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgJ2RvdC1jZmcnIGFuYWx5c2lzIHBhc3MsIHdoaWNoIGVtaXRzIHRoZQorLy8gY2ZnLjxmbm5hbWU+LmRvdCBmaWxlIGZvciBlYWNoIGZ1bmN0aW9uIGluIHRoZSBwcm9ncmFtLCB3aXRoIGEgZ3JhcGggb2YgdGhlCisvLyBDRkcgZm9yIHRoYXQgZnVuY3Rpb24uCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgZXh0ZXJuYWwgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIGNhbGxlZCB0byBleHBsaWNpdGx5CisvLyBpbnN0YW50aWF0ZSB0aGUgQ0ZHIHByaW50ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0NGR1BSSU5URVJfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0NGR1BSSU5URVJfSAorCisjaW5jbHVkZSAibGx2bS9JUi9DRkcuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvR3JhcGhXcml0ZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQ0ZHVmlld2VyUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48Q0ZHVmlld2VyUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCitjbGFzcyBDRkdPbmx5Vmlld2VyUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48Q0ZHT25seVZpZXdlclBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworY2xhc3MgQ0ZHUHJpbnRlclBhc3MKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPENGR1ByaW50ZXJQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK2NsYXNzIENGR09ubHlQcmludGVyUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48Q0ZHT25seVByaW50ZXJQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBET1RHcmFwaFRyYWl0czxjb25zdCBGdW5jdGlvbio+IDogcHVibGljIERlZmF1bHRET1RHcmFwaFRyYWl0cyB7CisKKyAgRE9UR3JhcGhUcmFpdHMgKGJvb2wgaXNTaW1wbGU9ZmFsc2UpIDogRGVmYXVsdERPVEdyYXBoVHJhaXRzKGlzU2ltcGxlKSB7fQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRHcmFwaE5hbWUoY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgICByZXR1cm4gIkNGRyBmb3IgJyIgKyBGLT5nZXROYW1lKCkuc3RyKCkgKyAiJyBmdW5jdGlvbiI7CisgIH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0U2ltcGxlTm9kZUxhYmVsKGNvbnN0IEJhc2ljQmxvY2sgKk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb24gKikgeworICAgIGlmICghTm9kZS0+Z2V0TmFtZSgpLmVtcHR5KCkpCisgICAgICByZXR1cm4gTm9kZS0+Z2V0TmFtZSgpLnN0cigpOworCisgICAgc3RkOjpzdHJpbmcgU3RyOworICAgIHJhd19zdHJpbmdfb3N0cmVhbSBPUyhTdHIpOworCisgICAgTm9kZS0+cHJpbnRBc09wZXJhbmQoT1MsIGZhbHNlKTsKKyAgICByZXR1cm4gT1Muc3RyKCk7CisgIH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0Q29tcGxldGVOb2RlTGFiZWwoY29uc3QgQmFzaWNCbG9jayAqTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uICopIHsKKyAgICBlbnVtIHsgTWF4Q29sdW1ucyA9IDgwIH07CisgICAgc3RkOjpzdHJpbmcgU3RyOworICAgIHJhd19zdHJpbmdfb3N0cmVhbSBPUyhTdHIpOworCisgICAgaWYgKE5vZGUtPmdldE5hbWUoKS5lbXB0eSgpKSB7CisgICAgICBOb2RlLT5wcmludEFzT3BlcmFuZChPUywgZmFsc2UpOworICAgICAgT1MgPDwgIjoiOworICAgIH0KKworICAgIE9TIDw8ICpOb2RlOworICAgIHN0ZDo6c3RyaW5nIE91dFN0ciA9IE9TLnN0cigpOworICAgIGlmIChPdXRTdHJbMF0gPT0gJ1xuJykgT3V0U3RyLmVyYXNlKE91dFN0ci5iZWdpbigpKTsKKworICAgIC8vIFByb2Nlc3Mgc3RyaW5nIG91dHB1dCB0byBtYWtlIGl0IG5pY2VyLi4uCisgICAgdW5zaWduZWQgQ29sTnVtID0gMDsKKyAgICB1bnNpZ25lZCBMYXN0U3BhY2UgPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gT3V0U3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgIGlmIChPdXRTdHJbaV0gPT0gJ1xuJykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZWZ0IGp1c3RpZnkKKyAgICAgICAgT3V0U3RyW2ldID0gJ1xcJzsKKyAgICAgICAgT3V0U3RyLmluc2VydChPdXRTdHIuYmVnaW4oKStpKzEsICdsJyk7CisgICAgICAgIENvbE51bSA9IDA7CisgICAgICAgIExhc3RTcGFjZSA9IDA7CisgICAgICB9IGVsc2UgaWYgKE91dFN0cltpXSA9PSAnOycpIHsgICAgICAgICAgICAgICAgICAgICAgLy8gRGVsZXRlIGNvbW1lbnRzIQorICAgICAgICB1bnNpZ25lZCBJZHggPSBPdXRTdHIuZmluZCgnXG4nLCBpKzEpOyAgICAgICAgICAgIC8vIEZpbmQgZW5kIG9mIGxpbmUKKyAgICAgICAgT3V0U3RyLmVyYXNlKE91dFN0ci5iZWdpbigpK2ksIE91dFN0ci5iZWdpbigpK0lkeCk7CisgICAgICAgIC0taTsKKyAgICAgIH0gZWxzZSBpZiAoQ29sTnVtID09IE1heENvbHVtbnMpIHsgICAgICAgICAgICAgICAgICAvLyBXcmFwIGxpbmVzLgorICAgICAgICAvLyBXcmFwIHZlcnkgbG9uZyBuYW1lcyBldmVuIHRob3VnaCB3ZSBjYW4ndCBmaW5kIGEgc3BhY2UuCisgICAgICAgIGlmICghTGFzdFNwYWNlKQorICAgICAgICAgIExhc3RTcGFjZSA9IGk7CisgICAgICAgIE91dFN0ci5pbnNlcnQoTGFzdFNwYWNlLCAiXFxsLi4uIik7CisgICAgICAgIENvbE51bSA9IGkgLSBMYXN0U3BhY2U7CisgICAgICAgIExhc3RTcGFjZSA9IDA7CisgICAgICAgIGkgKz0gMzsgLy8gVGhlIGxvb3Agd2lsbCBhZHZhbmNlICdpJyBhZ2Fpbi4KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgKytDb2xOdW07CisgICAgICBpZiAoT3V0U3RyW2ldID09ICcgJykKKyAgICAgICAgTGFzdFNwYWNlID0gaTsKKyAgICB9CisgICAgcmV0dXJuIE91dFN0cjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGdldE5vZGVMYWJlbChjb25zdCBCYXNpY0Jsb2NrICpOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb24gKkdyYXBoKSB7CisgICAgaWYgKGlzU2ltcGxlKCkpCisgICAgICByZXR1cm4gZ2V0U2ltcGxlTm9kZUxhYmVsKE5vZGUsIEdyYXBoKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gZ2V0Q29tcGxldGVOb2RlTGFiZWwoTm9kZSwgR3JhcGgpOworICB9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldEVkZ2VTb3VyY2VMYWJlbChjb25zdCBCYXNpY0Jsb2NrICpOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2NfY29uc3RfaXRlcmF0b3IgSSkgeworICAgIC8vIExhYmVsIHNvdXJjZSBvZiBjb25kaXRpb25hbCBicmFuY2hlcyB3aXRoICJUIiBvciAiRiIKKyAgICBpZiAoY29uc3QgQnJhbmNoSW5zdCAqQkkgPSBkeW5fY2FzdDxCcmFuY2hJbnN0PihOb2RlLT5nZXRUZXJtaW5hdG9yKCkpKQorICAgICAgaWYgKEJJLT5pc0NvbmRpdGlvbmFsKCkpCisgICAgICAgIHJldHVybiAoSSA9PSBzdWNjX2JlZ2luKE5vZGUpKSA/ICJUIiA6ICJGIjsKKworICAgIC8vIExhYmVsIHNvdXJjZSBvZiBzd2l0Y2ggZWRnZXMgd2l0aCB0aGUgYXNzb2NpYXRlZCB2YWx1ZS4KKyAgICBpZiAoY29uc3QgU3dpdGNoSW5zdCAqU0kgPSBkeW5fY2FzdDxTd2l0Y2hJbnN0PihOb2RlLT5nZXRUZXJtaW5hdG9yKCkpKSB7CisgICAgICB1bnNpZ25lZCBTdWNjTm8gPSBJLmdldFN1Y2Nlc3NvckluZGV4KCk7CisKKyAgICAgIGlmIChTdWNjTm8gPT0gMCkgcmV0dXJuICJkZWYiOworCisgICAgICBzdGQ6OnN0cmluZyBTdHI7CisgICAgICByYXdfc3RyaW5nX29zdHJlYW0gT1MoU3RyKTsKKyAgICAgIGF1dG8gQ2FzZSA9ICpTd2l0Y2hJbnN0OjpDb25zdENhc2VJdDo6ZnJvbVN1Y2Nlc3NvckluZGV4KFNJLCBTdWNjTm8pOworICAgICAgT1MgPDwgQ2FzZS5nZXRDYXNlVmFsdWUoKS0+Z2V0VmFsdWUoKTsKKyAgICAgIHJldHVybiBPUy5zdHIoKTsKKyAgICB9CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLy8vIERpc3BsYXkgdGhlIHJhdyBicmFuY2ggd2VpZ2h0cyBmcm9tIFBHTy4KKyAgc3RkOjpzdHJpbmcgZ2V0RWRnZUF0dHJpYnV0ZXMoY29uc3QgQmFzaWNCbG9jayAqTm9kZSwgc3VjY19jb25zdF9pdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiAqRikgeworICAgIGNvbnN0IFRlcm1pbmF0b3JJbnN0ICpUSSA9IE5vZGUtPmdldFRlcm1pbmF0b3IoKTsKKyAgICBpZiAoVEktPmdldE51bVN1Y2Nlc3NvcnMoKSA9PSAxKQorICAgICAgcmV0dXJuICIiOworCisgICAgTUROb2RlICpXZWlnaHRzTm9kZSA9IFRJLT5nZXRNZXRhZGF0YShMTFZNQ29udGV4dDo6TURfcHJvZik7CisgICAgaWYgKCFXZWlnaHRzTm9kZSkKKyAgICAgIHJldHVybiAiIjsKKworICAgIE1EU3RyaW5nICpNRE5hbWUgPSBjYXN0PE1EU3RyaW5nPihXZWlnaHRzTm9kZS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgaWYgKE1ETmFtZS0+Z2V0U3RyaW5nKCkgIT0gImJyYW5jaF93ZWlnaHRzIikKKyAgICAgIHJldHVybiAiIjsKKworICAgIHVuc2lnbmVkIE9wTm8gPSBJLmdldFN1Y2Nlc3NvckluZGV4KCkgKyAxOworICAgIGlmIChPcE5vID49IFdlaWdodHNOb2RlLT5nZXROdW1PcGVyYW5kcygpKQorICAgICAgcmV0dXJuICIiOworICAgIENvbnN0YW50SW50ICpXZWlnaHQgPQorICAgICAgICBtZGNvbnN0OjpkeW5fZXh0cmFjdDxDb25zdGFudEludD4oV2VpZ2h0c05vZGUtPmdldE9wZXJhbmQoT3BObykpOworICAgIGlmICghV2VpZ2h0KQorICAgICAgcmV0dXJuICIiOworCisgICAgLy8gUHJlcGVuZCBhICdXJyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYSB3ZWlnaHQgcmF0aGVyIHRoYW4gdGhlIGFjdHVhbAorICAgIC8vIHByb2ZpbGUgY291bnQgKGR1ZSB0byBzY2FsaW5nKS4KKyAgICBUd2luZSBBdHRycyA9ICJsYWJlbD1cIlc6IiArIFR3aW5lKFdlaWdodC0+Z2V0WkV4dFZhbHVlKCkpICsgIlwiIjsKKyAgICByZXR1cm4gQXR0cnMuc3RyKCk7CisgIH0KK307Cit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEZ1bmN0aW9uUGFzczsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVDRkdQcmludGVyTGVnYWN5UGFzc1Bhc3MgKCk7CisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlQ0ZHT25seVByaW50ZXJMZWdhY3lQYXNzUGFzcyAoKTsKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DRkxBbGlhc0FuYWx5c2lzVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ0ZMQWxpYXNBbmFseXNpc1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxYThkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ0ZMQWxpYXNBbmFseXNpc1V0aWxzLmgKQEAgLTAsMCArMSw1OCBAQAorLy89LSBDRkxBbGlhc0FuYWx5c2lzVXRpbHMuaCAtIFV0aWxpdGllcyBmb3IgQ0ZMIEFsaWFzIEFuYWx5c2lzIC0tLS0qLSBDKystKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFxmaWxlCisvLyBUaGVzZSBhcmUgdGhlIHV0aWxpdGllcy9oZWxwZXJzIHVzZWQgYnkgdGhlIENGTCBBbGlhcyBBbmFseXNlcyBhdmFpbGFibGUgaW4KKy8vIHRyZWUsIGkuZS4gU3RlZW5zZ2FhcmQncyBhbmQgQW5kZXJzZW5zJy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfQ0ZMQUxJQVNBTkFMWVNJU1VUSUxTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19DRkxBTElBU0FOQUxZU0lTVVRJTFNfSAorCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNmbGFhIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEFBUmVzdWx0PiBzdHJ1Y3QgRnVuY3Rpb25IYW5kbGUgZmluYWwgOiBwdWJsaWMgQ2FsbGJhY2tWSCB7CisgIEZ1bmN0aW9uSGFuZGxlKEZ1bmN0aW9uICpGbiwgQUFSZXN1bHQgKlJlc3VsdCkKKyAgICAgIDogQ2FsbGJhY2tWSChGbiksIFJlc3VsdChSZXN1bHQpIHsKKyAgICBhc3NlcnQoRm4gIT0gbnVsbHB0cik7CisgICAgYXNzZXJ0KFJlc3VsdCAhPSBudWxscHRyKTsKKyAgfQorCisgIHZvaWQgZGVsZXRlZCgpIG92ZXJyaWRlIHsgcmVtb3ZlU2VsZkZyb21DYWNoZSgpOyB9CisgIHZvaWQgYWxsVXNlc1JlcGxhY2VkV2l0aChWYWx1ZSAqKSBvdmVycmlkZSB7IHJlbW92ZVNlbGZGcm9tQ2FjaGUoKTsgfQorCitwcml2YXRlOgorICBBQVJlc3VsdCAqUmVzdWx0OworCisgIHZvaWQgcmVtb3ZlU2VsZkZyb21DYWNoZSgpIHsKKyAgICBhc3NlcnQoUmVzdWx0ICE9IG51bGxwdHIpOworICAgIGF1dG8gKlZhbCA9IGdldFZhbFB0cigpOworICAgIFJlc3VsdC0+ZXZpY3QoY2FzdDxGdW5jdGlvbj4oVmFsKSk7CisgICAgc2V0VmFsUHRyKG51bGxwdHIpOworICB9Cit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IEZ1bmN0aW9uICpwYXJlbnRGdW5jdGlvbk9mVmFsdWUoY29uc3QgVmFsdWUgKlZhbCkgeworICBpZiAoYXV0byAqSW5zdCA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWYWwpKSB7CisgICAgYXV0byAqQmIgPSBJbnN0LT5nZXRQYXJlbnQoKTsKKyAgICByZXR1cm4gQmItPmdldFBhcmVudCgpOworICB9CisKKyAgaWYgKGF1dG8gKkFyZyA9IGR5bl9jYXN0PEFyZ3VtZW50PihWYWwpKQorICAgIHJldHVybiBBcmctPmdldFBhcmVudCgpOworICByZXR1cm4gbnVsbHB0cjsKK30gLy8gbmFtZXNwYWNlIGNmbGFhCit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0NGTEFMSUFTQU5BTFlTSVNVVElMU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NGTEFuZGVyc0FsaWFzQW5hbHlzaXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ0ZMQW5kZXJzQWxpYXNBbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMzlkNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NGTEFuZGVyc0FsaWFzQW5hbHlzaXMuaApAQCAtMCwwICsxLDEyNiBAQAorLy89PS0gQ0ZMQW5kZXJzQWxpYXNBbmFseXNpcy5oIC0gVW5pZmljYXRpb24tYmFzZWQgQWxpYXMgQW5hbHlzaXMgLSotIEMrKy0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgTExWTSdzIGluY2x1c2lvbi1iYXNlZCBhbGlhcyBhbmFseXNpcworLy8vIGltcGxlbWVudGVkIHdpdGggQ0ZMIGdyYXBoIHJlYWNoYWJpbGl0eS4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0NGTEFOREVSU0FMSUFTQU5BTFlTSVNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0NGTEFOREVSU0FMSUFTQU5BTFlTSVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ0ZMQWxpYXNBbmFseXNpc1V0aWxzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgPGZvcndhcmRfbGlzdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBNZW1vcnlMb2NhdGlvbjsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworCituYW1lc3BhY2UgY2ZsYWEgeworCitzdHJ1Y3QgQWxpYXNTdW1tYXJ5OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY2ZsYWEKKworY2xhc3MgQ0ZMQW5kZXJzQUFSZXN1bHQgOiBwdWJsaWMgQUFSZXN1bHRCYXNlPENGTEFuZGVyc0FBUmVzdWx0PiB7CisgIGZyaWVuZCBBQVJlc3VsdEJhc2U8Q0ZMQW5kZXJzQUFSZXN1bHQ+OworCisgIGNsYXNzIEZ1bmN0aW9uSW5mbzsKKworcHVibGljOgorICBleHBsaWNpdCBDRkxBbmRlcnNBQVJlc3VsdChjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAmVExJKTsKKyAgQ0ZMQW5kZXJzQUFSZXN1bHQoQ0ZMQW5kZXJzQUFSZXN1bHQgJiZSSFMpOworICB+Q0ZMQW5kZXJzQUFSZXN1bHQoKTsKKworICAvLy8gSGFuZGxlIGludmFsaWRhdGlvbiBldmVudHMgZnJvbSB0aGUgbmV3IHBhc3MgbWFuYWdlci4KKyAgLy8vIEJ5IGRlZmluaXRpb24sIHRoaXMgcmVzdWx0IGlzIHN0YXRlbGVzcyBhbmQgc28gcmVtYWlucyB2YWxpZC4KKyAgYm9vbCBpbnZhbGlkYXRlKEZ1bmN0aW9uICYsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICYsCisgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBFdmljdCB0aGUgZ2l2ZW4gZnVuY3Rpb24gZnJvbSBjYWNoZQorICB2b2lkIGV2aWN0KGNvbnN0IEZ1bmN0aW9uICpGbik7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGFsaWFzIHN1bW1hcnkgZm9yIHRoZSBnaXZlbiBmdW5jdGlvbgorICAvLy8gUmV0dXJuIG51bGxwdHIgaWYgdGhlIHN1bW1hcnkgaXMgbm90IGZvdW5kIG9yIG5vdCBhdmFpbGFibGUKKyAgY29uc3QgY2ZsYWE6OkFsaWFzU3VtbWFyeSAqZ2V0QWxpYXNTdW1tYXJ5KGNvbnN0IEZ1bmN0aW9uICYpOworCisgIEFsaWFzUmVzdWx0IHF1ZXJ5KGNvbnN0IE1lbW9yeUxvY2F0aW9uICYsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICYpOworICBBbGlhc1Jlc3VsdCBhbGlhcyhjb25zdCBNZW1vcnlMb2NhdGlvbiAmLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmKTsKKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBFbnN1cmVzIHRoYXQgdGhlIGdpdmVuIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgY2FjaGUuCisgIC8vLyBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBlbnRyeSBmcm9tIHRoZSBjYWNoZS4KKyAgY29uc3QgT3B0aW9uYWw8RnVuY3Rpb25JbmZvPiAmZW5zdXJlQ2FjaGVkKGNvbnN0IEZ1bmN0aW9uICYpOworCisgIC8vLyBcYnJpZWYgSW5zZXJ0cyB0aGUgZ2l2ZW4gRnVuY3Rpb24gaW50byB0aGUgY2FjaGUuCisgIHZvaWQgc2Nhbihjb25zdCBGdW5jdGlvbiAmKTsKKworICAvLy8gXGJyaWVmIEJ1aWxkIHN1bW1hcnkgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24KKyAgRnVuY3Rpb25JbmZvIGJ1aWxkSW5mb0Zyb20oY29uc3QgRnVuY3Rpb24gJik7CisKKyAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJlRMSTsKKworICAvLy8gXGJyaWVmIENhY2hlZCBtYXBwaW5nIG9mIEZ1bmN0aW9ucyB0byB0aGVpciBTdHJhdGlmaWVkU2V0cy4KKyAgLy8vIElmIGEgZnVuY3Rpb24ncyBzZXRzIGFyZSBjdXJyZW50bHkgYmVpbmcgYnVpbHQsIGl0IGlzIG1hcmtlZAorICAvLy8gaW4gdGhlIGNhY2hlIGFzIGFuIE9wdGlvbmFsIHdpdGhvdXQgYSB2YWx1ZS4gVGhpcyB3YXksIGlmIHdlCisgIC8vLyBoYXZlIGFueSBraW5kIG9mIHJlY3Vyc2lvbiwgaXQgaXMgZGlzY2VybmFibGUgZnJvbSBhIGZ1bmN0aW9uCisgIC8vLyB0aGF0IHNpbXBseSBoYXMgZW1wdHkgc2V0cy4KKyAgRGVuc2VNYXA8Y29uc3QgRnVuY3Rpb24gKiwgT3B0aW9uYWw8RnVuY3Rpb25JbmZvPj4gQ2FjaGU7CisKKyAgc3RkOjpmb3J3YXJkX2xpc3Q8Y2ZsYWE6OkZ1bmN0aW9uSGFuZGxlPENGTEFuZGVyc0FBUmVzdWx0Pj4gSGFuZGxlczsKK307CisKKy8vLyBBbmFseXNpcyBwYXNzIHByb3ZpZGluZyBhIG5ldmVyLWludmFsaWRhdGVkIGFsaWFzIGFuYWx5c2lzIHJlc3VsdC4KKy8vLworLy8vIEZJWE1FOiBXZSByZWFsbHkgc2hvdWxkIHJlZmFjdG9yIENGTCB0byB1c2UgdGhlIGFuYWx5c2lzIG1vcmUgaGVhdmlseSwgYW5kCisvLy8gaW4gcGFydGljdWxhciB0byBsZXZlcmFnZSBpbnZhbGlkYXRpb24gdG8gdHJpZ2dlciByZS1jb21wdXRhdGlvbi4KK2NsYXNzIENGTEFuZGVyc0FBIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPENGTEFuZGVyc0FBPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxDRkxBbmRlcnNBQT47CisKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICB1c2luZyBSZXN1bHQgPSBDRkxBbmRlcnNBQVJlc3VsdDsKKworICBDRkxBbmRlcnNBQVJlc3VsdCBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gTGVnYWN5IHdyYXBwZXIgcGFzcyB0byBwcm92aWRlIHRoZSBDRkxBbmRlcnNBQVJlc3VsdCBvYmplY3QuCitjbGFzcyBDRkxBbmRlcnNBQVdyYXBwZXJQYXNzIDogcHVibGljIEltbXV0YWJsZVBhc3MgeworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZMQW5kZXJzQUFSZXN1bHQ+IFJlc3VsdDsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBDRkxBbmRlcnNBQVdyYXBwZXJQYXNzKCk7CisKKyAgQ0ZMQW5kZXJzQUFSZXN1bHQgJmdldFJlc3VsdCgpIHsgcmV0dXJuICpSZXN1bHQ7IH0KKyAgY29uc3QgQ0ZMQW5kZXJzQUFSZXN1bHQgJmdldFJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuICpSZXN1bHQ7IH0KKworICB2b2lkIGluaXRpYWxpemVQYXNzKCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLyBjcmVhdGVDRkxBbmRlcnNBQVdyYXBwZXJQYXNzIC0gVGhpcyBwYXNzIGltcGxlbWVudHMgYSBzZXQtYmFzZWQgYXBwcm9hY2ggdG8KKy8vIGFsaWFzIGFuYWx5c2lzLgorSW1tdXRhYmxlUGFzcyAqY3JlYXRlQ0ZMQW5kZXJzQUFXcmFwcGVyUGFzcygpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19DRkxBTkRFUlNBTElBU0FOQUxZU0lTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ0ZMU3RlZW5zQWxpYXNBbmFseXNpcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DRkxTdGVlbnNBbGlhc0FuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU5ZTI5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ0ZMU3RlZW5zQWxpYXNBbmFseXNpcy5oCkBAIC0wLDAgKzEsMTQzIEBACisvLz09LSBDRkxTdGVlbnNBbGlhc0FuYWx5c2lzLmggLSBVbmlmaWNhdGlvbi1iYXNlZCBBbGlhcyBBbmFseXNpcyAtKi0gQysrLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBMTFZNJ3MgdW5pZmljYXRpb24tYmFzZWQgYWxpYXMgYW5hbHlzaXMKKy8vLyBpbXBsZW1lbnRlZCB3aXRoIENGTCBncmFwaCByZWFjaGFiaWxpdHkuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19DRkxTVEVFTlNBTElBU0FOQUxZU0lTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19DRkxTVEVFTlNBTElBU0FOQUxZU0lTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NGTEFsaWFzQW5hbHlzaXNVdGlscy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTWVtb3J5TG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxmb3J3YXJkX2xpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CisKK25hbWVzcGFjZSBjZmxhYSB7CisKK3N0cnVjdCBBbGlhc1N1bW1hcnk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjZmxhYQorCitjbGFzcyBDRkxTdGVlbnNBQVJlc3VsdCA6IHB1YmxpYyBBQVJlc3VsdEJhc2U8Q0ZMU3RlZW5zQUFSZXN1bHQ+IHsKKyAgZnJpZW5kIEFBUmVzdWx0QmFzZTxDRkxTdGVlbnNBQVJlc3VsdD47CisKKyAgY2xhc3MgRnVuY3Rpb25JbmZvOworCitwdWJsaWM6CisgIGV4cGxpY2l0IENGTFN0ZWVuc0FBUmVzdWx0KGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICZUTEkpOworICBDRkxTdGVlbnNBQVJlc3VsdChDRkxTdGVlbnNBQVJlc3VsdCAmJkFyZyk7CisgIH5DRkxTdGVlbnNBQVJlc3VsdCgpOworCisgIC8vLyBIYW5kbGUgaW52YWxpZGF0aW9uIGV2ZW50cyBmcm9tIHRoZSBuZXcgcGFzcyBtYW5hZ2VyLgorICAvLy8KKyAgLy8vIEJ5IGRlZmluaXRpb24sIHRoaXMgcmVzdWx0IGlzIHN0YXRlbGVzcyBhbmQgc28gcmVtYWlucyB2YWxpZC4KKyAgYm9vbCBpbnZhbGlkYXRlKEZ1bmN0aW9uICYsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICYsCisgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSW5zZXJ0cyB0aGUgZ2l2ZW4gRnVuY3Rpb24gaW50byB0aGUgY2FjaGUuCisgIHZvaWQgc2NhbihGdW5jdGlvbiAqRm4pOworCisgIHZvaWQgZXZpY3QoRnVuY3Rpb24gKkZuKTsKKworICAvLy8gXGJyaWVmIEVuc3VyZXMgdGhhdCB0aGUgZ2l2ZW4gZnVuY3Rpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBjYWNoZS4KKyAgLy8vIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGVudHJ5IGZyb20gdGhlIGNhY2hlLgorICBjb25zdCBPcHRpb25hbDxGdW5jdGlvbkluZm8+ICZlbnN1cmVDYWNoZWQoRnVuY3Rpb24gKkZuKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgYWxpYXMgc3VtbWFyeSBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uCisgIC8vLyBSZXR1cm4gbnVsbHB0ciBpZiB0aGUgc3VtbWFyeSBpcyBub3QgZm91bmQgb3Igbm90IGF2YWlsYWJsZQorICBjb25zdCBjZmxhYTo6QWxpYXNTdW1tYXJ5ICpnZXRBbGlhc1N1bW1hcnkoRnVuY3Rpb24gJkZuKTsKKworICBBbGlhc1Jlc3VsdCBxdWVyeShjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQSwgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0IpOworCisgIEFsaWFzUmVzdWx0IGFsaWFzKGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NBLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQikgeworICAgIGlmIChMb2NBLlB0ciA9PSBMb2NCLlB0cikKKyAgICAgIHJldHVybiBNdXN0QWxpYXM7CisKKyAgICAvLyBDb21wYXJpc29ucyBiZXR3ZWVuIGdsb2JhbCB2YXJpYWJsZXMgYW5kIG90aGVyIGNvbnN0YW50cyBzaG91bGQgYmUKKyAgICAvLyBoYW5kbGVkIGJ5IEJhc2ljQUEuCisgICAgLy8gQ0ZMU3RlZW5zQUEgbWF5IHJlcG9ydCBOb0FsaWFzIHdoZW4gY29tcGFyaW5nIGEgR2xvYmFsVmFsdWUgYW5kCisgICAgLy8gQ29uc3RhbnRFeHByLCBidXQgZXZlcnkgcXVlcnkgbmVlZHMgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgVmFsdWUgdGllZCB0byBhCisgICAgLy8gRnVuY3Rpb24sIGFuZCBuZWl0aGVyIEdsb2JhbFZhbHVlcyBub3IgQ29uc3RhbnRFeHBycyBhcmUuCisgICAgaWYgKGlzYTxDb25zdGFudD4oTG9jQS5QdHIpICYmIGlzYTxDb25zdGFudD4oTG9jQi5QdHIpKQorICAgICAgcmV0dXJuIEFBUmVzdWx0QmFzZTo6YWxpYXMoTG9jQSwgTG9jQik7CisKKyAgICBBbGlhc1Jlc3VsdCBRdWVyeVJlc3VsdCA9IHF1ZXJ5KExvY0EsIExvY0IpOworICAgIGlmIChRdWVyeVJlc3VsdCA9PSBNYXlBbGlhcykKKyAgICAgIHJldHVybiBBQVJlc3VsdEJhc2U6OmFsaWFzKExvY0EsIExvY0IpOworCisgICAgcmV0dXJuIFF1ZXJ5UmVzdWx0OworICB9CisKK3ByaXZhdGU6CisgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICZUTEk7CisKKyAgLy8vIFxicmllZiBDYWNoZWQgbWFwcGluZyBvZiBGdW5jdGlvbnMgdG8gdGhlaXIgU3RyYXRpZmllZFNldHMuCisgIC8vLyBJZiBhIGZ1bmN0aW9uJ3Mgc2V0cyBhcmUgY3VycmVudGx5IGJlaW5nIGJ1aWx0LCBpdCBpcyBtYXJrZWQKKyAgLy8vIGluIHRoZSBjYWNoZSBhcyBhbiBPcHRpb25hbCB3aXRob3V0IGEgdmFsdWUuIFRoaXMgd2F5LCBpZiB3ZQorICAvLy8gaGF2ZSBhbnkga2luZCBvZiByZWN1cnNpb24sIGl0IGlzIGRpc2Nlcm5hYmxlIGZyb20gYSBmdW5jdGlvbgorICAvLy8gdGhhdCBzaW1wbHkgaGFzIGVtcHR5IHNldHMuCisgIERlbnNlTWFwPEZ1bmN0aW9uICosIE9wdGlvbmFsPEZ1bmN0aW9uSW5mbz4+IENhY2hlOworICBzdGQ6OmZvcndhcmRfbGlzdDxjZmxhYTo6RnVuY3Rpb25IYW5kbGU8Q0ZMU3RlZW5zQUFSZXN1bHQ+PiBIYW5kbGVzOworCisgIEZ1bmN0aW9uSW5mbyBidWlsZFNldHNGcm9tKEZ1bmN0aW9uICpGKTsKK307CisKKy8vLyBBbmFseXNpcyBwYXNzIHByb3ZpZGluZyBhIG5ldmVyLWludmFsaWRhdGVkIGFsaWFzIGFuYWx5c2lzIHJlc3VsdC4KKy8vLworLy8vIEZJWE1FOiBXZSByZWFsbHkgc2hvdWxkIHJlZmFjdG9yIENGTCB0byB1c2UgdGhlIGFuYWx5c2lzIG1vcmUgaGVhdmlseSwgYW5kCisvLy8gaW4gcGFydGljdWxhciB0byBsZXZlcmFnZSBpbnZhbGlkYXRpb24gdG8gdHJpZ2dlciByZS1jb21wdXRhdGlvbiBvZiBzZXRzLgorY2xhc3MgQ0ZMU3RlZW5zQUEgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48Q0ZMU3RlZW5zQUE+IHsKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPENGTFN0ZWVuc0FBPjsKKworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIHVzaW5nIFJlc3VsdCA9IENGTFN0ZWVuc0FBUmVzdWx0OworCisgIENGTFN0ZWVuc0FBUmVzdWx0IHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBMZWdhY3kgd3JhcHBlciBwYXNzIHRvIHByb3ZpZGUgdGhlIENGTFN0ZWVuc0FBUmVzdWx0IG9iamVjdC4KK2NsYXNzIENGTFN0ZWVuc0FBV3JhcHBlclBhc3MgOiBwdWJsaWMgSW1tdXRhYmxlUGFzcyB7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRkxTdGVlbnNBQVJlc3VsdD4gUmVzdWx0OworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIENGTFN0ZWVuc0FBV3JhcHBlclBhc3MoKTsKKworICBDRkxTdGVlbnNBQVJlc3VsdCAmZ2V0UmVzdWx0KCkgeyByZXR1cm4gKlJlc3VsdDsgfQorICBjb25zdCBDRkxTdGVlbnNBQVJlc3VsdCAmZ2V0UmVzdWx0KCkgY29uc3QgeyByZXR1cm4gKlJlc3VsdDsgfQorCisgIHZvaWQgaW5pdGlhbGl6ZVBhc3MoKSBvdmVycmlkZTsKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vIGNyZWF0ZUNGTFN0ZWVuc0FBV3JhcHBlclBhc3MgLSBUaGlzIHBhc3MgaW1wbGVtZW50cyBhIHNldC1iYXNlZCBhcHByb2FjaCB0bworLy8gYWxpYXMgYW5hbHlzaXMuCitJbW11dGFibGVQYXNzICpjcmVhdGVDRkxTdGVlbnNBQVdyYXBwZXJQYXNzKCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0NGTFNURUVOU0FMSUFTQU5BTFlTSVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DR1NDQ1Bhc3NNYW5hZ2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NHU0NDUGFzc01hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTdkNWEwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DR1NDQ1Bhc3NNYW5hZ2VyLmgKQEAgLTAsMCArMSw4NDAgQEAKKy8vPT09LSBDR1NDQ1Bhc3NNYW5hZ2VyLmggLSBDYWxsIGdyYXBoIHBhc3MgbWFuYWdlbWVudCAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLworLy8vIFRoaXMgaGVhZGVyIHByb3ZpZGVzIGNsYXNzZXMgZm9yIG1hbmFnaW5nIHBhc3NlcyBvdmVyIFNDQ3Mgb2YgdGhlIGNhbGwKKy8vLyBncmFwaC4gVGhlc2UgcGFzc2VzIGZvcm0gYW4gaW1wb3J0YW50IGNvbXBvbmVudCBvZiBMTFZNJ3MgaW50ZXJwcm9jZWR1cmFsCisvLy8gb3B0aW1pemF0aW9ucy4gQmVjYXVzZSB0aGV5IG9wZXJhdGUgb24gdGhlIFNDQ3Mgb2YgdGhlIGNhbGwgZ3JhcGgsIGFuZCB0aGV5CisvLy8gdHJhdmVyc2UgdGhlIGdyYXBoIGluIHBvc3Qtb3JkZXIsIHRoZXkgY2FuIGVmZmVjdGl2ZWx5IGRvIHBhaXItd2lzZQorLy8vIGludGVycHJvY2VkdXJhbCBvcHRpbWl6YXRpb25zIGZvciBhbGwgY2FsbCBlZGdlcyBpbiB0aGUgcHJvZ3JhbSB3aGlsZQorLy8vIGluY3JlbWVudGFsbHkgcmVmaW5pbmcgaXQgYW5kIGltcHJvdmluZyB0aGUgY29udGV4dCBvZiB0aGVzZSBwYWlyLXdpc2UKKy8vLyBvcHRpbWl6YXRpb25zLiBBdCBlYWNoIGNhbGwgc2l0ZSBlZGdlLCB0aGUgY2FsbGVlIGhhcyBhbHJlYWR5IGJlZW4KKy8vLyBvcHRpbWl6ZWQgYXMgbXVjaCBhcyBpcyBwb3NzaWJsZS4gVGhpcyBpbiB0dXJuIGFsbG93cyB2ZXJ5IGFjY3VyYXRlCisvLy8gYW5hbHlzaXMgb2YgaXQgZm9yIElQTy4KKy8vLworLy8vIEEgc2Vjb25kYXJ5IG1vcmUgZ2VuZXJhbCBnb2FsIGlzIHRvIGJlIGFibGUgdG8gaXNvbGF0ZSBvcHRpbWl6YXRpb24gb24KKy8vLyB1bnJlbGF0ZWQgcGFydHMgb2YgdGhlIElSIG1vZHVsZS4gVGhpcyBpcyB1c2VmdWwgdG8gZW5zdXJlIG91cgorLy8vIG9wdGltaXphdGlvbnMgYXJlIHByaW5jaXBsZWQgYW5kIGRvbid0IG1pc3Mgb3BvcnR1bml0aWVzIHdoZXJlIHJlZmluZW1lbnQKKy8vLyBvZiBvbmUgcGFydCBvZiB0aGUgbW9kdWxlIGluZmx1ZW5jZSB0cmFuc2Zvcm1hdGlvbnMgaW4gYW5vdGhlciBwYXJ0IG9mIHRoZQorLy8vIG1vZHVsZS4gQnV0IHRoaXMgaXMgYWxzbyB1c2VmdWwgaWYgd2Ugd2FudCB0byBwYXJhbGxlbGl6ZSB0aGUgb3B0aW1pemF0aW9ucworLy8vIGFjcm9zcyBjb21tb24gbGFyZ2UgbW9kdWxlIGdyYXBoIHNoYXBlcyB3aGljaCB0ZW5kIHRvIGJlIHZlcnkgd2lkZSBhbmQgaGF2ZQorLy8vIGxhcmdlIHJlZ2lvbnMgb2YgdW5yZWxhdGVkIGNsaXF1ZXMuCisvLy8KKy8vLyBUbyBzYXRpc2Z5IHRoZXNlIGdvYWxzLCB3ZSB1c2UgdGhlIExhenlDYWxsR3JhcGggd2hpY2ggcHJvdmlkZXMgdHdvIGdyYXBocworLy8vIG5lc3RlZCBpbnNpZGUgZWFjaCBvdGhlciAoYW5kIGJ1aWx0IGxhemlseSBmcm9tIHRoZSBib3R0b20tdXApOiB0aGUgY2FsbAorLy8vIGdyYXBoIHByb3BlciwgYW5kIGEgcmVmZXJlbmNlIGdyYXBoLiBUaGUgcmVmZXJlbmNlIGdyYXBoIGlzIHN1cGVyIHNldCBvZgorLy8vIHRoZSBjYWxsIGdyYXBoIGFuZCBpcyBhIGNvbnNlcnZhdGl2ZSBhcHByb3hpbWF0aW9uIG9mIHdoYXQgY291bGQgdGhyb3VnaAorLy8vIHNjYWxhciBvciBDR1NDQyB0cmFuc2Zvcm1zICpiZWNvbWUqIHRoZSBjYWxsIGdyYXBoLiBVc2luZyB0aGlzIGFsbG93cyB1cyB0bworLy8vIGVuc3VyZSB3ZSBvcHRpbWl6ZSBmdW5jdGlvbnMgcHJpb3IgdG8gdGhlbSBiZWluZyBpbnRyb2R1Y2VkIGludG8gdGhlIGNhbGwKKy8vLyBncmFwaCBieSBkZXZpcnR1YWxpemF0aW9uIG9yIG90aGVyIHRlY2huaXF1ZSwgYW5kIHRodXMgZW5zdXJlcyB0aGF0CisvLy8gc3Vic2VxdWVudCBwYWlyLXdpc2UgaW50ZXJwcm9jZWR1cmFsIG9wdGltaXphdGlvbnMgb2JzZXJ2ZSB0aGUgb3B0aW1pemVkCisvLy8gZm9ybSBvZiB0aGVzZSBmdW5jdGlvbnMuIFRoZSAocG90ZW50aWFsbHkgdHJhbnNpdGl2ZSkgcmVmZXJlbmNlCisvLy8gcmVhY2hhYmlsaXR5IHVzZWQgYnkgdGhlIHJlZmVyZW5jZSBncmFwaCBpcyBhIGNvbnNlcnZhdGl2ZSBhcHByb3hpbWF0aW9uCisvLy8gdGhhdCBzdGlsbCBhbGxvd3MgdXMgdG8gaGF2ZSBpbmRlcGVuZGVudCByZWdpb25zIG9mIHRoZSBncmFwaC4KKy8vLworLy8vIEZJWE1FOiBUaGVyZSBpcyBvbmUgbWFqb3IgZHJhd2JhY2sgb2YgdGhlIHJlZmVyZW5jZSBncmFwaDogaW4gaXRzIG5haXZlCisvLy8gZm9ybSBpdCBpcyBxdWFkcmF0aWMgYmVjYXVzZSBpdCBjb250YWlucyBhIGRpc3RpbmN0IGVkZ2UgZm9yIGVhY2gKKy8vLyAocG90ZW50aWFsbHkgaW5kaXJlY3QpIHJlZmVyZW5jZSwgZXZlbiBpZiBhcmUgYWxsIHRocm91Z2ggc29tZSBjb21tb24KKy8vLyBnbG9iYWwgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMuIFRoaXMgY2FuIGJlIGZpeGVkIGluIGEgbnVtYmVyIG9mIHdheXMKKy8vLyB0aGF0IGVzc2VudGlhbGx5IHByZXNlcnZlIGVub3VnaCBvZiB0aGUgbm9ybWFsaXphdGlvbi4gV2hpbGUgaXQgaXNuJ3QKKy8vLyBleHBlY3RlZCB0byBjb21wbGV0ZWx5IHByZWNsdWRlIHRoZSB1c2FiaWxpdHkgb2YgdGhpcywgaXQgd2lsbCBuZWVkIHRvIGJlCisvLy8gYWRkcmVzc2VkLgorLy8vCisvLy8KKy8vLyBBbGwgb2YgdGhlc2UgaXNzdWVzIGFyZSBtYWRlIHN1YnN0YW50aWFsbHkgbW9yZSBjb21wbGV4IGluIHRoZSBmYWNlIG9mCisvLy8gbXV0YXRpb25zIHRvIHRoZSBjYWxsIGdyYXBoIHdoaWxlIG9wdGltaXphdGlvbiBwYXNzZXMgYXJlIGJlaW5nIHJ1bi4gV2hlbgorLy8vIG11dGF0aW9ucyB0byB0aGUgY2FsbCBncmFwaCBvY2N1ciB3ZSB3YW50IHRvIGFjaGlldmUgdHdvIGRpZmZlcmVudCB0aGluZ3M6CisvLy8KKy8vLyAtIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBjYWxsIGdyYXBoIGluLWZsaWdodCBhbmQgaW52YWxpZGF0ZSBhbmFseXNlcworLy8vICAgY2FjaGVkIG9uIGVudGl0aWVzIGluIHRoZSBncmFwaC4gQmVjYXVzZSBvZiB0aGUgY2FjaGUtYmFzZWQgYW5hbHlzaXMKKy8vLyAgIGRlc2lnbiBvZiB0aGUgcGFzcyBtYW5hZ2VyLCBpdCBpcyBlc3NlbnRpYWwgdG8gaGF2ZSBzdGFibGUgaWRlbnRpdGllcyBmb3IKKy8vLyAgIHRoZSBlbGVtZW50cyBvZiB0aGUgSVIgdGhhdCBwYXNzZXMgdHJhdmVyc2UsIGFuZCB0byBpbnZhbGlkYXRlIGFueQorLy8vICAgYW5hbHlzZXMgY2FjaGVkIG9uIHRoZXNlIGVsZW1lbnRzIGFzIHRoZSBtdXRhdGlvbnMgdGFrZSBwbGFjZS4KKy8vLworLy8vIC0gV2Ugd2FudCB0byBwcmVzZXJ2ZSB0aGUgaW5jcmVtZW50YWwgYW5kIHBvc3Qtb3JkZXIgdHJhdmVyc2FsIG9mIHRoZQorLy8vICAgZ3JhcGggZXZlbiBhcyBpdCBpcyByZWZpbmVkIGFuZCBtdXRhdGVkLiBUaGlzIG1lYW5zIHdlIHdhbnQgb3B0aW1pemF0aW9uCisvLy8gICB0byBvYnNlcnZlIHRoZSBtb3N0IHJlZmluZWQgZm9ybSBvZiB0aGUgY2FsbCBncmFwaCBhbmQgdG8gZG8gc28gaW4KKy8vLyAgIHBvc3Qtb3JkZXIuCisvLy8KKy8vLyBUbyBhZGRyZXNzIHRoaXMsIHRoZSBDR1NDQyBtYW5hZ2VyIHVzZXMgYm90aCB3b3JrbGlzdHMgdGhhdCBjYW4gYmUgZXhwYW5kZWQKKy8vLyBieSBwYXNzZXMgd2hpY2ggdHJhbnNmb3JtIHRoZSBJUiwgYW5kIHByb3ZpZGVzIGludmFsaWRhdGlvbiB0ZXN0cyB0byBza2lwCisvLy8gZW50cmllcyB0aGF0IGJlY29tZSBkZWFkLiBUaGlzIGV4dHJhIGRhdGEgaXMgcHJvdmlkZWQgdG8gZXZlcnkgU0NDIHBhc3Mgc28KKy8vLyB0aGF0IGl0IGNhbiBjYXJlZnVsbHkgdXBkYXRlIHRoZSBtYW5hZ2VyJ3MgdHJhdmVyc2FsIGFzIHRoZSBjYWxsIGdyYXBoCisvLy8gbXV0YXRlcy4KKy8vLworLy8vIFdlIGFsc28gcHJvdmlkZSBzdXBwb3J0IGZvciBydW5uaW5nIGZ1bmN0aW9uIHBhc3NlcyB3aXRoaW4gdGhlIENHU0NDIHdhbGssCisvLy8gYW5kIHRoZXJlIHdlIHByb3ZpZGUgYXV0b21hdGljIHVwZGF0ZSBvZiB0aGUgY2FsbCBncmFwaCBpbmNsdWRpbmcgb2YgdGhlCisvLy8gcGFzcyBtYW5hZ2VyIHRvIHJlZmxlY3QgY2FsbCBncmFwaCBjaGFuZ2VzIHRoYXQgZmFsbCBvdXQgbmF0dXJhbGx5IGFzIHBhcnQKKy8vLyBvZiBzY2FsYXIgdHJhbnNmb3JtYXRpb25zLgorLy8vCisvLy8gVGhlIHBhdHRlcm5zIHVzZWQgdG8gZW5zdXJlIHRoZSBnb2FscyBvZiBwb3N0LW9yZGVyIHZpc2l0YXRpb24gb2YgdGhlIGZ1bGx5CisvLy8gcmVmaW5lZCBncmFwaDoKKy8vLworLy8vIDEpIFNpbmsgdG93YXJkIHRoZSAiYm90dG9tIiBhcyB0aGUgZ3JhcGggaXMgcmVmaW5lZC4gVGhpcyBtZWFucyB0aGF0IGFueQorLy8vICAgIGl0ZXJhdGlvbiBjb250aW51ZXMgaW4gc29tZSB2YWxpZCBwb3N0LW9yZGVyIHNlcXVlbmNlIGFmdGVyIHRoZSBtdXRhdGlvbgorLy8vICAgIGhhcyBhbHRlcmVkIHRoZSBzdHJ1Y3R1cmUuCisvLy8KKy8vLyAyKSBFbnF1ZXVlIGluIHBvc3Qtb3JkZXIsIGluY2x1ZGluZyB0aGUgY3VycmVudCBlbnRpdHkuIElmIHRoZSBjdXJyZW50CisvLy8gICAgZW50aXR5J3Mgc2hhcGUgY2hhbmdlcywgaXQgYW5kIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXQgaW4gcG9zdC1vcmRlciBuZWVkcworLy8vICAgIHRvIGJlIHZpc2l0ZWQgdG8gb2JzZXJ2ZSB0aGF0IHNoYXBlLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfQ0dTQ0NQQVNTTUFOQUdFUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQ0dTQ0NQQVNTTUFOQUdFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1ByaW9yaXR5V29ya2xpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9MYXp5Q2FsbEdyYXBoLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitzdHJ1Y3QgQ0dTQ0NVcGRhdGVSZXN1bHQ7CitjbGFzcyBNb2R1bGU7CisKKy8vIEFsbG93IGRlYnVnIGxvZ2dpbmcgaW4gdGhpcyBpbmxpbmUgZnVuY3Rpb24uCisjZGVmaW5lIERFQlVHX1RZUEUgImNnc2NjIgorCisvLy8gRXh0ZXJuIHRlbXBsYXRlIGRlY2xhcmF0aW9uIGZvciB0aGUgYW5hbHlzaXMgc2V0IGZvciB0aGlzIElSIHVuaXQuCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgQWxsQW5hbHlzZXNPbjxMYXp5Q2FsbEdyYXBoOjpTQ0M+OworCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgQW5hbHlzaXNNYW5hZ2VyPExhenlDYWxsR3JhcGg6OlNDQywgTGF6eUNhbGxHcmFwaCAmPjsKKworLy8vIFxicmllZiBUaGUgQ0dTQ0MgYW5hbHlzaXMgbWFuYWdlci4KKy8vLworLy8vIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFuYWx5c2lzTWFuYWdlciB0ZW1wbGF0ZSBmb3IgZGV0YWlsCisvLy8gZG9jdW1lbnRhdGlvbi4gVGhpcyB0eXBlIHNlcnZlcyBhcyBhIGNvbnZlbmllbnQgd2F5IHRvIHJlZmVyIHRvIHRoaXMKKy8vLyBjb25zdHJ1Y3QgaW4gdGhlIGFkYXB0b3JzIGFuZCBwcm94aWVzIHVzZWQgdG8gaW50ZWdyYXRlIHRoaXMgaW50byB0aGUgbGFyZ2VyCisvLy8gcGFzcyBtYW5hZ2VyIGluZnJhc3RydWN0dXJlLgordXNpbmcgQ0dTQ0NBbmFseXNpc01hbmFnZXIgPQorICAgIEFuYWx5c2lzTWFuYWdlcjxMYXp5Q2FsbEdyYXBoOjpTQ0MsIExhenlDYWxsR3JhcGggJj47CisKKy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGFuZCBpbnN0YW50aWF0aW9uIGRlY2xhcmF0aW9ucyBmb3IgdGhlIHBhc3MgbWFuYWdlci4KKy8vIFNlZSB0aGUgY29tbWVudHMgb24gdGhlIGRlZmluaXRpb24gb2YgdGhlIHNwZWNpYWxpemF0aW9uIGZvciBkZXRhaWxzIG9uIGhvdworLy8gaXQgZGlmZmVycyBmcm9tIHRoZSBwcmltYXJ5IHRlbXBsYXRlLgordGVtcGxhdGUgPD4KK1ByZXNlcnZlZEFuYWx5c2VzCitQYXNzTWFuYWdlcjxMYXp5Q2FsbEdyYXBoOjpTQ0MsIENHU0NDQW5hbHlzaXNNYW5hZ2VyLCBMYXp5Q2FsbEdyYXBoICYsCisgICAgICAgICAgICBDR1NDQ1VwZGF0ZVJlc3VsdCAmPjo6cnVuKExhenlDYWxsR3JhcGg6OlNDQyAmSW5pdGlhbEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHU0NDQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF6eUNhbGxHcmFwaCAmRywgQ0dTQ0NVcGRhdGVSZXN1bHQgJlVSKTsKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBQYXNzTWFuYWdlcjxMYXp5Q2FsbEdyYXBoOjpTQ0MsIENHU0NDQW5hbHlzaXNNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhenlDYWxsR3JhcGggJiwgQ0dTQ0NVcGRhdGVSZXN1bHQgJj47CisKKy8vLyBcYnJpZWYgVGhlIENHU0NDIHBhc3MgbWFuYWdlci4KKy8vLworLy8vIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIFBhc3NNYW5hZ2VyIHRlbXBsYXRlIGZvciBkZXRhaWxzLiBJdCBydW5zCisvLy8gYSBzZXF1ZW5jZSBvZiBTQ0MgcGFzc2VzIG92ZXIgZWFjaCBTQ0MgdGhhdCB0aGUgbWFuYWdlciBpcyBydW4gb3Zlci4gVGhpcworLy8vIHR5cGUgc2VydmVzIGFzIGEgY29udmVuaWVudCB3YXkgdG8gcmVmZXIgdG8gdGhpcyBjb25zdHJ1Y3QuCit1c2luZyBDR1NDQ1Bhc3NNYW5hZ2VyID0KKyAgICBQYXNzTWFuYWdlcjxMYXp5Q2FsbEdyYXBoOjpTQ0MsIENHU0NDQW5hbHlzaXNNYW5hZ2VyLCBMYXp5Q2FsbEdyYXBoICYsCisgICAgICAgICAgICAgICAgQ0dTQ0NVcGRhdGVSZXN1bHQgJj47CisKKy8vLyBBbiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiBvZiB0aGUgcmVxdWlyZSBhbmFseXNpcyB0ZW1wbGF0ZSBwYXNzLgordGVtcGxhdGUgPHR5cGVuYW1lIEFuYWx5c2lzVD4KK3N0cnVjdCBSZXF1aXJlQW5hbHlzaXNQYXNzPEFuYWx5c2lzVCwgTGF6eUNhbGxHcmFwaDo6U0NDLCBDR1NDQ0FuYWx5c2lzTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExhenlDYWxsR3JhcGggJiwgQ0dTQ0NVcGRhdGVSZXN1bHQgJj4KKyAgICA6IFBhc3NJbmZvTWl4aW48UmVxdWlyZUFuYWx5c2lzUGFzczxBbmFseXNpc1QsIExhenlDYWxsR3JhcGg6OlNDQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1NDQ0FuYWx5c2lzTWFuYWdlciwgTGF6eUNhbGxHcmFwaCAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHU0NDVXBkYXRlUmVzdWx0ICY+PiB7CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMYXp5Q2FsbEdyYXBoOjpTQ0MgJkMsIENHU0NDQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExhenlDYWxsR3JhcGggJkNHLCBDR1NDQ1VwZGF0ZVJlc3VsdCAmKSB7CisgICAgKHZvaWQpQU0udGVtcGxhdGUgZ2V0UmVzdWx0PEFuYWx5c2lzVD4oQywgQ0cpOworICAgIHJldHVybiBQcmVzZXJ2ZWRBbmFseXNlczo6YWxsKCk7CisgIH0KK307CisKKy8vLyBBIHByb3h5IGZyb20gYSBcYyBDR1NDQ0FuYWx5c2lzTWFuYWdlciB0byBhIFxjIE1vZHVsZS4KK3VzaW5nIENHU0NDQW5hbHlzaXNNYW5hZ2VyTW9kdWxlUHJveHkgPQorICAgIElubmVyQW5hbHlzaXNNYW5hZ2VyUHJveHk8Q0dTQ0NBbmFseXNpc01hbmFnZXIsIE1vZHVsZT47CisKKy8vLyBXZSBuZWVkIGEgc3BlY2lhbGl6ZWQgcmVzdWx0IGZvciB0aGUgXGMgQ0dTQ0NBbmFseXNpc01hbmFnZXJNb2R1bGVQcm94eSBzbworLy8vIGl0IGNhbiBoYXZlIGFjY2VzcyB0byB0aGUgY2FsbCBncmFwaCBpbiBvcmRlciB0byB3YWxrIGFsbCB0aGUgU0NDcyB3aGVuCisvLy8gaW52YWxpZGF0aW5nIHRoaW5ncy4KK3RlbXBsYXRlIDw+IGNsYXNzIENHU0NDQW5hbHlzaXNNYW5hZ2VyTW9kdWxlUHJveHk6OlJlc3VsdCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFJlc3VsdChDR1NDQ0FuYWx5c2lzTWFuYWdlciAmSW5uZXJBTSwgTGF6eUNhbGxHcmFwaCAmRykKKyAgICAgIDogSW5uZXJBTSgmSW5uZXJBTSksIEcoJkcpIHt9CisKKyAgLy8vIFxicmllZiBBY2Nlc3NvciBmb3IgdGhlIGFuYWx5c2lzIG1hbmFnZXIuCisgIENHU0NDQW5hbHlzaXNNYW5hZ2VyICZnZXRNYW5hZ2VyKCkgeyByZXR1cm4gKklubmVyQU07IH0KKworICAvLy8gXGJyaWVmIEhhbmRsZXIgZm9yIGludmFsaWRhdGlvbiBvZiB0aGUgTW9kdWxlLgorICAvLy8KKyAgLy8vIElmIHRoZSBwcm94eSBhbmFseXNpcyBpdHNlbGYgaXMgcHJlc2VydmVkLCB0aGVuIHdlIGFzc3VtZSB0aGF0IHRoZSBzZXQgb2YKKyAgLy8vIFNDQ3MgaW4gdGhlIE1vZHVsZSBoYXNuJ3QgY2hhbmdlZC4gVGh1cyBhbnkgcG9pbnRlcnMgdG8gU0NDcyBpbiB0aGUKKyAgLy8vIENHU0NDQW5hbHlzaXNNYW5hZ2VyIGFyZSBzdGlsbCB2YWxpZCwgYW5kIHdlIGRvbid0IG5lZWQgdG8gY2FsbCBcYyBjbGVhcgorICAvLy8gb24gdGhlIENHU0NDQW5hbHlzaXNNYW5hZ2VyLgorICAvLy8KKyAgLy8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIGFuYWx5c2lzIGlzIG1hcmtlZCBhcyBwcmVzZXJ2ZWQsIGFsbCBvZiB0aGUKKyAgLy8vIGFuYWx5c2VzIGluIHRoZSBcYyBDR1NDQ0FuYWx5c2lzTWFuYWdlciBhcmUgcG90ZW50aWFsbHkgaW52YWxpZGF0ZWQgYmFzZWQKKyAgLy8vIG9uIHRoZSBzZXQgb2YgcHJlc2VydmVkIGFuYWx5c2VzLgorICBib29sIGludmFsaWRhdGUoTW9kdWxlICZNLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmUEEsCisgICAgICAgICAgICAgICAgICBNb2R1bGVBbmFseXNpc01hbmFnZXI6OkludmFsaWRhdG9yICZJbnYpOworCitwcml2YXRlOgorICBDR1NDQ0FuYWx5c2lzTWFuYWdlciAqSW5uZXJBTTsKKyAgTGF6eUNhbGxHcmFwaCAqRzsKK307CisKKy8vLyBQcm92aWRlIGEgc3BlY2lhbGl6ZWQgcnVuIG1ldGhvZCBmb3IgdGhlIFxjIENHU0NDQW5hbHlzaXNNYW5hZ2VyTW9kdWxlUHJveHkKKy8vLyBzbyBpdCBjYW4gcGFzcyB0aGUgbGF6eSBjYWxsIGdyYXBoIHRvIHRoZSByZXN1bHQuCit0ZW1wbGF0ZSA8PgorQ0dTQ0NBbmFseXNpc01hbmFnZXJNb2R1bGVQcm94eTo6UmVzdWx0CitDR1NDQ0FuYWx5c2lzTWFuYWdlck1vZHVsZVByb3h5OjpydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJkFNKTsKKworLy8gRW5zdXJlIHRoZSBcYyBDR1NDQ0FuYWx5c2lzTWFuYWdlck1vZHVsZVByb3h5IGlzIHByb3ZpZGVkIGFzIGFuIGV4dGVybgorLy8gdGVtcGxhdGUuCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgSW5uZXJBbmFseXNpc01hbmFnZXJQcm94eTxDR1NDQ0FuYWx5c2lzTWFuYWdlciwgTW9kdWxlPjsKKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIE91dGVyQW5hbHlzaXNNYW5hZ2VyUHJveHk8CisgICAgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyLCBMYXp5Q2FsbEdyYXBoOjpTQ0MsIExhenlDYWxsR3JhcGggJj47CisKKy8vLyBBIHByb3h5IGZyb20gYSBcYyBNb2R1bGVBbmFseXNpc01hbmFnZXIgdG8gYW4gXGMgU0NDLgordXNpbmcgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyQ0dTQ0NQcm94eSA9CisgICAgT3V0ZXJBbmFseXNpc01hbmFnZXJQcm94eTxNb2R1bGVBbmFseXNpc01hbmFnZXIsIExhenlDYWxsR3JhcGg6OlNDQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhenlDYWxsR3JhcGggJj47CisKKy8vLyBTdXBwb3J0IHN0cnVjdHVyZSBmb3IgU0NDIHBhc3NlcyB0byBjb21tdW5pY2F0ZSB1cGRhdGVzIHRoZSBjYWxsIGdyYXBoIGJhY2sKKy8vLyB0byB0aGUgQ0dTQ0MgcGFzcyBtYW5hZ2VyIGluZnJzYXRydWN0dXJlLgorLy8vCisvLy8gVGhlIENHU0NDIHBhc3MgbWFuYWdlciBydW5zIFNDQyBwYXNzZXMgd2hpY2ggYXJlIGFsbG93ZWQgdG8gdXBkYXRlIHRoZSBjYWxsCisvLy8gZ3JhcGggYW5kIFNDQyBzdHJ1Y3R1cmVzLiBUaGlzIG1lYW5zIHRoZSBzdHJ1Y3R1cmUgdGhlIHBhc3MgbWFuYWdlciB3b3JrcworLy8vIG9uIGlzIG11dGF0aW5nIHVuZGVybmVhdGggaXQuIEluIG9yZGVyIHRvIHN1cHBvcnQgdGhhdCwgdGhlcmUgbmVlZHMgdG8gYmUKKy8vLyBjYXJlZnVsIGNvbW11bmljYXRpb24gYWJvdXQgdGhlIHByZWNpc2UgbmF0dXJlIGFuZCByYW1pZmljYXRpb25zIG9mIHRoZXNlCisvLy8gdXBkYXRlcyB0byB0aGUgcGFzcyBtYW5hZ2VtZW50IGluZnJhc3RydWN0dXJlLgorLy8vCisvLy8gQWxsIFNDQyBwYXNzZXMgd2lsbCBoYXZlIHRvIGFjY2VwdCBhIHJlZmVyZW5jZSB0byB0aGUgbWFuYWdlbWVudCBsYXllcidzCisvLy8gdXBkYXRlIHJlc3VsdCBzdHJ1Y3QgYW5kIHVzZSBpdCB0byByZWZsZWN0IHRoZSByZXN1bHRzIG9mIGFueSBDRyB1cGRhdGVzCisvLy8gcGVyZm9ybWVkLgorLy8vCisvLy8gUGFzc2VzIHdoaWNoIGRvIG5vdCBjaGFuZ2UgdGhlIGNhbGwgZ3JhcGggc3RydWN0dXJlIGluIGFueSB3YXkgY2FuIGp1c3QKKy8vLyBpZ25vcmUgdGhpcyBhcmd1bWVudCB0byB0aGVpciBydW4gbWV0aG9kLgorc3RydWN0IENHU0NDVXBkYXRlUmVzdWx0IHsKKyAgLy8vIFdvcmtsaXN0IG9mIHRoZSBSZWZTQ0NzIHF1ZXVlZCBmb3IgcHJvY2Vzc2luZy4KKyAgLy8vCisgIC8vLyBXaGVuIGEgcGFzcyByZWZpbmVzIHRoZSBncmFwaCBhbmQgY3JlYXRlcyBuZXcgUmVmU0NDcyBvciBjYXVzZXMgdGhlbSB0bworICAvLy8gaGF2ZSBhIGRpZmZlcmVudCBzaGFwZSBvciBzZXQgb2YgY29tcG9uZW50IFNDQ3MgaXQgc2hvdWxkIGFkZCB0aGUgUmVmU0NDcworICAvLy8gdG8gdGhpcyB3b3JrbGlzdCBzbyB0aGF0IHdlIHZpc2l0IHRoZW0gaW4gdGhlIHJlZmluZWQgZm9ybS4KKyAgLy8vCisgIC8vLyBUaGlzIHdvcmtsaXN0IGlzIGluIHJldmVyc2UgcG9zdC1vcmRlciwgYXMgd2UgcG9wIG9mZiB0aGUgYmFjayBpbiBvcmRlcgorICAvLy8gdG8gb2JzZXJ2ZSBSZWZTQ0NzIGluIHBvc3Qtb3JkZXIuIFdoZW4gYWRkaW5nIFJlZlNDQ3MsIGNsaWVudHMgc2hvdWxkIGFkZAorICAvLy8gdGhlbSBpbiByZXZlcnNlIHBvc3Qtb3JkZXIuCisgIFNtYWxsUHJpb3JpdHlXb3JrbGlzdDxMYXp5Q2FsbEdyYXBoOjpSZWZTQ0MgKiwgMT4gJlJDV29ya2xpc3Q7CisKKyAgLy8vIFdvcmtsaXN0IG9mIHRoZSBTQ0NzIHF1ZXVlZCBmb3IgcHJvY2Vzc2luZy4KKyAgLy8vCisgIC8vLyBXaGVuIGEgcGFzcyByZWZpbmVzIHRoZSBncmFwaCBhbmQgY3JlYXRlcyBuZXcgU0NDcyBvciBjYXVzZXMgdGhlbSB0byBoYXZlCisgIC8vLyBhIGRpZmZlcmVudCBzaGFwZSBvciBzZXQgb2YgY29tcG9uZW50IGZ1bmN0aW9ucyBpdCBzaG91bGQgYWRkIHRoZSBTQ0NzIHRvCisgIC8vLyB0aGlzIHdvcmtsaXN0IHNvIHRoYXQgd2UgdmlzaXQgdGhlbSBpbiB0aGUgcmVmaW5lZCBmb3JtLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBpZiB0aGUgU0NDcyBhcmUgcGFydCBvZiBhIFJlZlNDQyB0aGF0IGlzIGFkZGVkIHRvIHRoZSBcYworICAvLy8gUkNXb3JrbGlzdCwgdGhleSBkb24ndCBuZWVkIHRvIGJlIGFkZGVkIGhlcmUgYXMgdmlzaXRpbmcgdGhlIFJlZlNDQyB3aWxsCisgIC8vLyBiZSBzdWZmaWNpZW50IHRvIHJlLXZpc2l0IHRoZSBTQ0NzIHdpdGhpbiBpdC4KKyAgLy8vCisgIC8vLyBUaGlzIHdvcmtsaXN0IGlzIGluIHJldmVyc2UgcG9zdC1vcmRlciwgYXMgd2UgcG9wIG9mZiB0aGUgYmFjayBpbiBvcmRlcgorICAvLy8gdG8gb2JzZXJ2ZSBTQ0NzIGluIHBvc3Qtb3JkZXIuIFdoZW4gYWRkaW5nIFNDQ3MsIGNsaWVudHMgc2hvdWxkIGFkZCB0aGVtCisgIC8vLyBpbiByZXZlcnNlIHBvc3Qtb3JkZXIuCisgIFNtYWxsUHJpb3JpdHlXb3JrbGlzdDxMYXp5Q2FsbEdyYXBoOjpTQ0MgKiwgMT4gJkNXb3JrbGlzdDsKKworICAvLy8gVGhlIHNldCBvZiBpbnZhbGlkYXRlZCBSZWZTQ0NzIHdoaWNoIHNob3VsZCBiZSBza2lwcGVkIGlmIHRoZXkgYXJlIGZvdW5kCisgIC8vLyBpbiBcYyBSQ1dvcmtsaXN0LgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCB0byBxdWlja2x5IHBydW5lIG91dCBSZWZTQ0NzIHdoZW4gdGhleSBnZXQgZGVsZXRlZCBhbmQKKyAgLy8vIGhhcHBlbiB0byBhbHJlYWR5IGJlIG9uIHRoZSB3b3JrbGlzdC4gV2UgdXNlIHRoaXMgcHJpbWFyaWx5IHRvIGF2b2lkCisgIC8vLyBzY2FubmluZyB0aGUgbGlzdCBhbmQgcmVtb3ZpbmcgZW50cmllcyBmcm9tIGl0LgorICBTbWFsbFB0clNldEltcGw8TGF6eUNhbGxHcmFwaDo6UmVmU0NDICo+ICZJbnZhbGlkYXRlZFJlZlNDQ3M7CisKKyAgLy8vIFRoZSBzZXQgb2YgaW52YWxpZGF0ZWQgU0NDcyB3aGljaCBzaG91bGQgYmUgc2tpcHBlZCBpZiB0aGV5IGFyZSBmb3VuZAorICAvLy8gaW4gXGMgQ1dvcmtsaXN0LgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCB0byBxdWlja2x5IHBydW5lIG91dCBTQ0NzIHdoZW4gdGhleSBnZXQgZGVsZXRlZCBhbmQgaGFwcGVuCisgIC8vLyB0byBhbHJlYWR5IGJlIG9uIHRoZSB3b3JrbGlzdC4gV2UgdXNlIHRoaXMgcHJpbWFyaWx5IHRvIGF2b2lkIHNjYW5uaW5nCisgIC8vLyB0aGUgbGlzdCBhbmQgcmVtb3ZpbmcgZW50cmllcyBmcm9tIGl0LgorICBTbWFsbFB0clNldEltcGw8TGF6eUNhbGxHcmFwaDo6U0NDICo+ICZJbnZhbGlkYXRlZFNDQ3M7CisKKyAgLy8vIElmIG5vbi1udWxsLCB0aGUgdXBkYXRlZCBjdXJyZW50IFxjIFJlZlNDQyBiZWluZyBwcm9jZXNzZWQuCisgIC8vLworICAvLy8gVGhpcyBpcyBzZXQgd2hlbiBhIGdyYXBoIHJlZmluZW1lbnQgdGFrZXMgcGxhY2UgYW4gdGhlICJjdXJyZW50IiBwb2ludCBpbgorICAvLy8gdGhlIGdyYXBoIG1vdmVzICJkb3duIiBvciBlYXJsaWVyIGluIHRoZSBwb3N0LW9yZGVyIHdhbGsuIFRoaXMgd2lsbCBvZnRlbgorICAvLy8gY2F1c2UgdGhlICJjdXJyZW50IiBSZWZTQ0MgdG8gYmUgYSBuZXdseSBjcmVhdGVkIFJlZlNDQyBvYmplY3QgYW5kIHRoZQorICAvLy8gb2xkIG9uZSB0byBiZSBhZGRlZCB0byB0aGUgYWJvdmUgd29ya2xpc3QuIFdoZW4gdGhhdCBoYXBwZW5zLCB0aGlzCisgIC8vLyBwb2ludGVyIGlzIG5vbi1udWxsIGFuZCBjYW4gYmUgdXNlZCB0byBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSAidG9wIiBvZgorICAvLy8gdGhlIHBvc3Qtb3JkZXIgd2Fsay4KKyAgTGF6eUNhbGxHcmFwaDo6UmVmU0NDICpVcGRhdGVkUkM7CisKKyAgLy8vIElmIG5vbi1udWxsLCB0aGUgdXBkYXRlZCBjdXJyZW50IFxjIFNDQyBiZWluZyBwcm9jZXNzZWQuCisgIC8vLworICAvLy8gVGhpcyBpcyBzZXQgd2hlbiBhIGdyYXBoIHJlZmluZW1lbnQgdGFrZXMgcGxhY2UgYW4gdGhlICJjdXJyZW50IiBwb2ludCBpbgorICAvLy8gdGhlIGdyYXBoIG1vdmVzICJkb3duIiBvciBlYXJsaWVyIGluIHRoZSBwb3N0LW9yZGVyIHdhbGsuIFRoaXMgd2lsbCBvZnRlbgorICAvLy8gY2F1c2UgdGhlICJjdXJyZW50IiBTQ0MgdG8gYmUgYSBuZXdseSBjcmVhdGVkIFNDQyBvYmplY3QgYW5kIHRoZSBvbGQgb25lCisgIC8vLyB0byBiZSBhZGRlZCB0byB0aGUgYWJvdmUgd29ya2xpc3QuIFdoZW4gdGhhdCBoYXBwZW5zLCB0aGlzIHBvaW50ZXIgaXMKKyAgLy8vIG5vbi1udWxsIGFuZCBjYW4gYmUgdXNlZCB0byBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSAidG9wIiBvZiB0aGUKKyAgLy8vIHBvc3Qtb3JkZXIgd2Fsay4KKyAgTGF6eUNhbGxHcmFwaDo6U0NDICpVcGRhdGVkQzsKKworICAvLy8gQSBoYWNreSBhcmVhIHdoZXJlIHRoZSBpbmxpbmVyIGNhbiByZXRhaW4gaGlzdG9yeSBhYm91dCBpbmxpbmluZworICAvLy8gZGVjaXNpb25zIHRoYXQgbXV0YXRlZCB0aGUgY2FsbCBncmFwaCdzIFNDQyBzdHJ1Y3R1cmUgaW4gb3JkZXIgdG8gYXZvaWQKKyAgLy8vIGluZmluaXRlIGlubGluaW5nLiBTZWUgdGhlIGNvbW1lbnRzIGluIHRoZSBpbmxpbmVyJ3MgQ0cgdXBkYXRlIGxvZ2ljLgorICAvLy8KKyAgLy8vIEZJWE1FOiBLZWVwaW5nIHRoaXMgaGVyZSBzZWVtcyBsaWtlIGEgYmlnIGxheWVyaW5nIGlzc3VlLCB3ZSBzaG91bGQgbG9vaworICAvLy8gZm9yIGEgYmV0dGVyIHRlY2huaXF1ZS4KKyAgU21hbGxEZW5zZVNldDxzdGQ6OnBhaXI8TGF6eUNhbGxHcmFwaDo6Tm9kZSAqLCBMYXp5Q2FsbEdyYXBoOjpTQ0MgKj4sIDQ+CisgICAgICAmSW5saW5lZEludGVybmFsRWRnZXM7Cit9OworCisvLy8gXGJyaWVmIFRoZSBjb3JlIG1vZHVsZSBwYXNzIHdoaWNoIGRvZXMgYSBwb3N0LW9yZGVyIHdhbGsgb2YgdGhlIFNDQ3MgYW5kCisvLy8gcnVucyBhIENHU0NDIHBhc3Mgb3ZlciBlYWNoIG9uZS4KKy8vLworLy8vIERlc2lnbmVkIHRvIGFsbG93IGNvbXBvc2l0aW9uIG9mIGEgQ0dTQ0NQYXNzKE1hbmFnZXIpIGFuZAorLy8vIGEgTW9kdWxlUGFzc01hbmFnZXIuIE5vdGUgdGhhdCB0aGlzIHBhc3MgbXVzdCBiZSBydW4gd2l0aCBhIG1vZHVsZSBhbmFseXNpcworLy8vIG1hbmFnZXIgYXMgaXQgdXNlcyB0aGUgTGF6eUNhbGxHcmFwaCBhbmFseXNpcy4gSXQgd2lsbCBhbHNvIHJ1biB0aGUKKy8vLyBcYyBDR1NDQ0FuYWx5c2lzTWFuYWdlck1vZHVsZVByb3h5IGFuYWx5c2lzIHByaW9yIHRvIHJ1bm5pbmcgdGhlIENHU0NDCisvLy8gcGFzcyBvdmVyIHRoZSBtb2R1bGUgdG8gZW5hYmxlIGEgXGMgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgdG8gYmUgdXNlZAorLy8vIHdpdGhpbiB0aGlzIHJ1biBzYWZlbHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0dTQ0NQYXNzVD4KK2NsYXNzIE1vZHVsZVRvUG9zdE9yZGVyQ0dTQ0NQYXNzQWRhcHRvcgorICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48TW9kdWxlVG9Qb3N0T3JkZXJDR1NDQ1Bhc3NBZGFwdG9yPENHU0NDUGFzc1Q+PiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IE1vZHVsZVRvUG9zdE9yZGVyQ0dTQ0NQYXNzQWRhcHRvcihDR1NDQ1Bhc3NUIFBhc3MpCisgICAgICA6IFBhc3Moc3RkOjptb3ZlKFBhc3MpKSB7fQorCisgIC8vIFdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWZpbmUgYWxsIHRoZSBzcGVjaWFsIG1lbWJlciBmdW5jdGlvbnMgYmVjYXVzZSBNU1ZDCisgIC8vIHJlZnVzZXMgdG8gZ2VuZXJhdGUgdGhlbS4KKyAgTW9kdWxlVG9Qb3N0T3JkZXJDR1NDQ1Bhc3NBZGFwdG9yKAorICAgICAgY29uc3QgTW9kdWxlVG9Qb3N0T3JkZXJDR1NDQ1Bhc3NBZGFwdG9yICZBcmcpCisgICAgICA6IFBhc3MoQXJnLlBhc3MpIHt9CisKKyAgTW9kdWxlVG9Qb3N0T3JkZXJDR1NDQ1Bhc3NBZGFwdG9yKE1vZHVsZVRvUG9zdE9yZGVyQ0dTQ0NQYXNzQWRhcHRvciAmJkFyZykKKyAgICAgIDogUGFzcyhzdGQ6Om1vdmUoQXJnLlBhc3MpKSB7fQorCisgIGZyaWVuZCB2b2lkIHN3YXAoTW9kdWxlVG9Qb3N0T3JkZXJDR1NDQ1Bhc3NBZGFwdG9yICZMSFMsCisgICAgICAgICAgICAgICAgICAgTW9kdWxlVG9Qb3N0T3JkZXJDR1NDQ1Bhc3NBZGFwdG9yICZSSFMpIHsKKyAgICBzdGQ6OnN3YXAoTEhTLlBhc3MsIFJIUy5QYXNzKTsKKyAgfQorCisgIE1vZHVsZVRvUG9zdE9yZGVyQ0dTQ0NQYXNzQWRhcHRvciAmCisgIG9wZXJhdG9yPShNb2R1bGVUb1Bvc3RPcmRlckNHU0NDUGFzc0FkYXB0b3IgUkhTKSB7CisgICAgc3dhcCgqdGhpcywgUkhTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIFJ1bnMgdGhlIENHU0NDIHBhc3MgYWNyb3NzIGV2ZXJ5IFNDQyBpbiB0aGUgbW9kdWxlLgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJkFNKSB7CisgICAgLy8gU2V0dXAgdGhlIENHU0NDIGFuYWx5c2lzIG1hbmFnZXIgZnJvbSBpdHMgcHJveHkuCisgICAgQ0dTQ0NBbmFseXNpc01hbmFnZXIgJkNHQU0gPQorICAgICAgICBBTS5nZXRSZXN1bHQ8Q0dTQ0NBbmFseXNpc01hbmFnZXJNb2R1bGVQcm94eT4oTSkuZ2V0TWFuYWdlcigpOworCisgICAgLy8gR2V0IHRoZSBjYWxsIGdyYXBoIGZvciB0aGlzIG1vZHVsZS4KKyAgICBMYXp5Q2FsbEdyYXBoICZDRyA9IEFNLmdldFJlc3VsdDxMYXp5Q2FsbEdyYXBoQW5hbHlzaXM+KE0pOworCisgICAgLy8gV2Uga2VlcCB3b3JrbGlzdHMgdG8gYWxsb3cgdXMgdG8gcHVzaCBtb3JlIHdvcmsgb250byB0aGUgcGFzcyBtYW5hZ2VyIGFzCisgICAgLy8gdGhlIHBhc3NlcyBhcmUgcnVuLgorICAgIFNtYWxsUHJpb3JpdHlXb3JrbGlzdDxMYXp5Q2FsbEdyYXBoOjpSZWZTQ0MgKiwgMT4gUkNXb3JrbGlzdDsKKyAgICBTbWFsbFByaW9yaXR5V29ya2xpc3Q8TGF6eUNhbGxHcmFwaDo6U0NDICosIDE+IENXb3JrbGlzdDsKKworICAgIC8vIEtlZXAgc2V0cyBmb3IgaW52YWxpZGF0ZWQgU0NDcyBhbmQgUmVmU0NDcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIHdoZW4KKyAgICAvLyBpdGVyYXRpbmcgb2ZmIHRoZSB3b3JrbGlzdHMuCisgICAgU21hbGxQdHJTZXQ8TGF6eUNhbGxHcmFwaDo6UmVmU0NDICosIDQ+IEludmFsaWRSZWZTQ0NTZXQ7CisgICAgU21hbGxQdHJTZXQ8TGF6eUNhbGxHcmFwaDo6U0NDICosIDQ+IEludmFsaWRTQ0NTZXQ7CisKKyAgICBTbWFsbERlbnNlU2V0PHN0ZDo6cGFpcjxMYXp5Q2FsbEdyYXBoOjpOb2RlICosIExhenlDYWxsR3JhcGg6OlNDQyAqPiwgND4KKyAgICAgICAgSW5saW5lZEludGVybmFsRWRnZXM7CisKKyAgICBDR1NDQ1VwZGF0ZVJlc3VsdCBVUiA9IHtSQ1dvcmtsaXN0LCAgICAgICAgICBDV29ya2xpc3QsIEludmFsaWRSZWZTQ0NTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFNDQ1NldCwgICAgICAgbnVsbHB0ciwgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElubGluZWRJbnRlcm5hbEVkZ2VzfTsKKworICAgIFByZXNlcnZlZEFuYWx5c2VzIFBBID0gUHJlc2VydmVkQW5hbHlzZXM6OmFsbCgpOworICAgIENHLmJ1aWxkUmVmU0NDcygpOworICAgIGZvciAoYXV0byBSQ0kgPSBDRy5wb3N0b3JkZXJfcmVmX3NjY19iZWdpbigpLAorICAgICAgICAgICAgICBSQ0UgPSBDRy5wb3N0b3JkZXJfcmVmX3NjY19lbmQoKTsKKyAgICAgICAgIFJDSSAhPSBSQ0U7KSB7CisgICAgICBhc3NlcnQoUkNXb3JrbGlzdC5lbXB0eSgpICYmCisgICAgICAgICAgICAgIlNob3VsZCBhbHdheXMgc3RhcnQgd2l0aCBhbiBlbXB0eSBSZWZTQ0Mgd29ya2xpc3QiKTsKKyAgICAgIC8vIFRoZSBwb3N0b3JkZXJfcmVmX3NjY3MgcmFuZ2Ugd2UgYXJlIHdhbGtpbmcgaXMgbGF6aWx5IGNvbnN0cnVjdGVkLCBzbworICAgICAgLy8gd2Ugb25seSBwdXNoIHRoZSBmaXJzdCBvbmUgb250byB0aGUgd29ya2xpc3QuIFRoZSB3b3JrbGlzdCBhbGxvd3MgdXMKKyAgICAgIC8vIHRvIGNhcHR1cmUgKm5ldyogUmVmU0NDcyBjcmVhdGVkIGR1cmluZyB0cmFuc2Zvcm1hdGlvbnMuCisgICAgICAvLworICAgICAgLy8gV2UgcmVhbGx5IHdhbnQgdG8gZm9ybSBSZWZTQ0NzIGxhemlseSBiZWNhdXNlIHRoYXQgbWFrZXMgdGhlbSBjaGVhcGVyCisgICAgICAvLyB0byB1cGRhdGUgYXMgdGhlIHByb2dyYW0gaXMgc2ltcGxpZmllZCBhbmQgYWxsb3dzIHVzIHRvIGhhdmUgZ3JlYXRlcgorICAgICAgLy8gY2FjaGUgbG9jYWxpdHkgYXMgZm9ybWluZyBhIFJlZlNDQyB0b3VjaGVzIGFsbCB0aGUgcGFydHMgb2YgYWxsIHRoZQorICAgICAgLy8gZnVuY3Rpb25zIHdpdGhpbiB0aGF0IFJlZlNDQy4KKyAgICAgIC8vCisgICAgICAvLyBXZSBhbHNvIGVhZ2VybHkgaW5jcmVtZW50IHRoZSBpdGVyYXRvciB0byB0aGUgbmV4dCBwb3NpdGlvbiBiZWNhdXNlCisgICAgICAvLyB0aGUgQ0dTQ0MgcGFzc2VzIGJlbG93IG1heSBkZWxldGUgdGhlIGN1cnJlbnQgUmVmU0NDLgorICAgICAgUkNXb3JrbGlzdC5pbnNlcnQoJipSQ0krKyk7CisKKyAgICAgIGRvIHsKKyAgICAgICAgTGF6eUNhbGxHcmFwaDo6UmVmU0NDICpSQyA9IFJDV29ya2xpc3QucG9wX2JhY2tfdmFsKCk7CisgICAgICAgIGlmIChJbnZhbGlkUmVmU0NDU2V0LmNvdW50KFJDKSkgeworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiU2tpcHBpbmcgYW4gaW52YWxpZCBSZWZTQ0MuLi5cbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0KENXb3JrbGlzdC5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAiU2hvdWxkIGFsd2F5cyBzdGFydCB3aXRoIGFuIGVtcHR5IFNDQyB3b3JrbGlzdCIpOworCisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiUnVubmluZyBhbiBTQ0MgcGFzcyBhY3Jvc3MgdGhlIFJlZlNDQzogIiA8PCAqUkMKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIpOworCisgICAgICAgIC8vIFB1c2ggdGhlIGluaXRpYWwgU0NDcyBpbiByZXZlcnNlIHBvc3Qtb3JkZXIgYXMgd2UnbGwgcG9wIG9mZiB0aGUKKyAgICAgICAgLy8gYmFjayBhbmQgc28gc2VlIHRoaXMgaW4gcG9zdC1vcmRlci4KKyAgICAgICAgZm9yIChMYXp5Q2FsbEdyYXBoOjpTQ0MgJkMgOiBsbHZtOjpyZXZlcnNlKCpSQykpCisgICAgICAgICAgQ1dvcmtsaXN0Lmluc2VydCgmQyk7CisKKyAgICAgICAgZG8geworICAgICAgICAgIExhenlDYWxsR3JhcGg6OlNDQyAqQyA9IENXb3JrbGlzdC5wb3BfYmFja192YWwoKTsKKyAgICAgICAgICAvLyBEdWUgdG8gY2FsbCBncmFwaCBtdXRhdGlvbnMsIHdlIG1heSBoYXZlIGludmFsaWQgU0NDcyBvciBTQ0NzIGZyb20KKyAgICAgICAgICAvLyBvdGhlciBSZWZTQ0NzIGluIHRoZSB3b3JrbGlzdC4gVGhlIGludmFsaWQgb25lcyBhcmUgZGVhZCBhbmQgdGhlCisgICAgICAgICAgLy8gb3RoZXIgUmVmU0NDcyBzaG91bGQgYmUgcXVldWVkIGFib3ZlLCBzbyB3ZSBqdXN0IG5lZWQgdG8gc2tpcCBib3RoCisgICAgICAgICAgLy8gc2NlbmFyaW9zIGhlcmUuCisgICAgICAgICAgaWYgKEludmFsaWRTQ0NTZXQuY291bnQoQykpIHsKKyAgICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiU2tpcHBpbmcgYW4gaW52YWxpZCBTQ0MuLi5cbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgmQy0+Z2V0T3V0ZXJSZWZTQ0MoKSAhPSBSQykgeworICAgICAgICAgICAgREVCVUcoZGJncygpIDw8ICJTa2lwcGluZyBhbiBTQ0MgdGhhdCBpcyBub3cgcGFydCBvZiBzb21lIG90aGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVmU0NDLi4uXG4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IG1pc3MgYW55IHVwZGF0ZSBzY2VuYXJpby4KKyAgICAgICAgICAgIGFzc2VydCghSW52YWxpZFNDQ1NldC5jb3VudChDKSAmJiAiUHJvY2Vzc2luZyBhbiBpbnZhbGlkIFNDQyEiKTsKKyAgICAgICAgICAgIGFzc2VydChDLT5iZWdpbigpICE9IEMtPmVuZCgpICYmICJDYW5ub3QgaGF2ZSBhbiBlbXB0eSBTQ0MhIik7CisgICAgICAgICAgICBhc3NlcnQoJkMtPmdldE91dGVyUmVmU0NDKCkgPT0gUkMgJiYKKyAgICAgICAgICAgICAgICAgICAiUHJvY2Vzc2luZyBhbiBTQ0MgaW4gYSBkaWZmZXJlbnQgUmVmU0NDISIpOworCisgICAgICAgICAgICBVUi5VcGRhdGVkUkMgPSBudWxscHRyOworICAgICAgICAgICAgVVIuVXBkYXRlZEMgPSBudWxscHRyOworICAgICAgICAgICAgUHJlc2VydmVkQW5hbHlzZXMgUGFzc1BBID0gUGFzcy5ydW4oKkMsIENHQU0sIENHLCBVUik7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgU0NDIGFuZCBSZWZTQ0MgaWYgbmVjZXNzYXJ5LgorICAgICAgICAgICAgQyA9IFVSLlVwZGF0ZWRDID8gVVIuVXBkYXRlZEMgOiBDOworICAgICAgICAgICAgUkMgPSBVUi5VcGRhdGVkUkMgPyBVUi5VcGRhdGVkUkMgOiBSQzsKKworICAgICAgICAgICAgLy8gSWYgdGhlIENHU0NDIHBhc3Mgd2Fzbid0IGFibGUgdG8gcHJvdmlkZSBhIHZhbGlkIHVwZGF0ZWQgU0NDLAorICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgU0NDIG1heSBzaW1wbHkgbmVlZCB0byBiZSBza2lwcGVkIGlmIGludmFsaWQuCisgICAgICAgICAgICBpZiAoVVIuSW52YWxpZGF0ZWRTQ0NzLmNvdW50KEMpKSB7CisgICAgICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiU2tpcHBpbmcgaW52YWxpZGF0ZWQgcm9vdCBvciBpc2xhbmQgU0NDIVxuIik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgbWlzcyBhbnkgdXBkYXRlIHNjZW5hcmlvLgorICAgICAgICAgICAgYXNzZXJ0KEMtPmJlZ2luKCkgIT0gQy0+ZW5kKCkgJiYgIkNhbm5vdCBoYXZlIGFuIGVtcHR5IFNDQyEiKTsKKworICAgICAgICAgICAgLy8gV2UgaGFuZGxlIGludmFsaWRhdGluZyB0aGUgQ0dTQ0MgYW5hbHlzaXMgbWFuYWdlcidzIGluZm9ybWF0aW9uCisgICAgICAgICAgICAvLyBmb3IgdGhlIChwb3RlbnRpYWxseSB1cGRhdGVkKSBTQ0MgaGVyZS4gTm90ZSB0aGF0IGFueSBvdGhlciBTQ0NzCisgICAgICAgICAgICAvLyB3aG9zZSBzdHJ1Y3R1cmUgaGFzIGNoYW5nZWQgc2hvdWxkIGhhdmUgYmVlbiBpbnZhbGlkYXRlZCBieQorICAgICAgICAgICAgLy8gd2hhdGV2ZXIgd2FzIHVwZGF0aW5nIHRoZSBjYWxsIGdyYXBoLiBUaGlzIFNDQyBnZXRzIGludmFsaWRhdGVkCisgICAgICAgICAgICAvLyBsYXRlIGFzIGl0IGNvbnRhaW5zIHRoZSBub2RlcyB0aGF0IHdlcmUgYWN0aXZlbHkgYmVpbmcKKyAgICAgICAgICAgIC8vIHByb2Nlc3NlZC4KKyAgICAgICAgICAgIENHQU0uaW52YWxpZGF0ZSgqQywgUGFzc1BBKTsKKworICAgICAgICAgICAgLy8gVGhlbiBpbnRlcnNlY3QgdGhlIHByZXNlcnZlZCBzZXQgc28gdGhhdCBpbnZhbGlkYXRpb24gb2YgbW9kdWxlCisgICAgICAgICAgICAvLyBhbmFseXNlcyB3aWxsIGV2ZW50dWFsbHkgb2NjdXIgd2hlbiB0aGUgbW9kdWxlIHBhc3MgY29tcGxldGVzLgorICAgICAgICAgICAgUEEuaW50ZXJzZWN0KHN0ZDo6bW92ZShQYXNzUEEpKTsKKworICAgICAgICAgICAgLy8gVGhlIHBhc3MgbWF5IGhhdmUgcmVzdHJ1Y3R1cmVkIHRoZSBjYWxsIGdyYXBoIGFuZCByZWZpbmVkIHRoZQorICAgICAgICAgICAgLy8gY3VycmVudCBTQ0MgYW5kL29yIFJlZlNDQy4gV2UgbmVlZCB0byB1cGRhdGUgb3VyIGN1cnJlbnQgU0NDIGFuZAorICAgICAgICAgICAgLy8gUmVmU0NDIHBvaW50ZXJzIHRvIGZvbGxvdyB0aGVzZS4gQWxzbywgd2hlbiB0aGUgY3VycmVudCBTQ0MgaXMKKyAgICAgICAgICAgIC8vIHJlZmluZWQsIHJlLXJ1biB0aGUgU0NDIHBhc3Mgb3ZlciB0aGUgbmV3bHkgcmVmaW5lZCBTQ0MgaW4gb3JkZXIKKyAgICAgICAgICAgIC8vIHRvIG9ic2VydmUgdGhlIG1vc3QgcHJlY2lzZSBTQ0MgbW9kZWwgYXZhaWxhYmxlLiBUaGlzIGluaGVyZW50bHkKKyAgICAgICAgICAgIC8vIGNhbm5vdCBjeWNsZSBleGNlc3NpdmVseSBhcyBpdCBvbmx5IGhhcHBlbnMgd2hlbiB3ZSBzcGxpdCBTQ0NzCisgICAgICAgICAgICAvLyBhcGFydCwgYXQgbW9zdCBjb252ZXJnaW5nIG9uIGEgREFHIG9mIHNpbmdsZSBub2Rlcy4KKyAgICAgICAgICAgIC8vIEZJWE1FOiBJZiB3ZSBldmVyIHN0YXJ0IGhhdmluZyBSZWZTQ0MgcGFzc2VzLCB3ZSdsbCB3YW50IHRvCisgICAgICAgICAgICAvLyBpdGVyYXRlIHRoZXJlIHRvby4KKyAgICAgICAgICAgIGlmIChVUi5VcGRhdGVkQykKKyAgICAgICAgICAgICAgREVCVUcoZGJncygpIDw8ICJSZS1ydW5uaW5nIFNDQyBwYXNzZXMgYWZ0ZXIgYSByZWZpbmVtZW50IG9mIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3VycmVudCBTQ0M6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICpVUi5VcGRhdGVkQyA8PCAiXG4iKTsKKworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGJvdGggYENgIGFuZCBgUkNgIG1heSBhdCB0aGlzIHBvaW50IHJlZmVyIHRvIGRlbGV0ZWQsCisgICAgICAgICAgICAvLyBpbnZhbGlkIFNDQyBhbmQgUmVmU0NDcyByZXNwZWN0aXZlbHkuIEJ1dCB3ZSB3aWxsIHNob3J0IGNpcmN1aXQKKyAgICAgICAgICAgIC8vIHRoZSBwcm9jZXNzaW5nIHdoZW4gd2UgY2hlY2sgdGhlbSBpbiB0aGUgbG9vcCBhYm92ZS4KKyAgICAgICAgICB9IHdoaWxlIChVUi5VcGRhdGVkQyk7CisgICAgICAgIH0gd2hpbGUgKCFDV29ya2xpc3QuZW1wdHkoKSk7CisKKyAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIGtlZXAgaW50ZXJuYWwgaW5saW5lZCBlZGdlIGluZm9ybWF0aW9uIHdpdGhpbgorICAgICAgICAvLyBhIFJlZlNDQywgY2xlYXIgaXQgdG8gc2F2ZSBvbiBzcGFjZSBhbmQgbGV0IHRoZSBuZXh0IHRpbWUgd2UgdmlzaXQKKyAgICAgICAgLy8gYW55IG9mIHRoZXNlIGZ1bmN0aW9ucyBoYXZlIGEgZnJlc2ggc3RhcnQuCisgICAgICAgIElubGluZWRJbnRlcm5hbEVkZ2VzLmNsZWFyKCk7CisgICAgICB9IHdoaWxlICghUkNXb3JrbGlzdC5lbXB0eSgpKTsKKyAgICB9CisKKyAgICAvLyBCeSBkZWZpbml0aW9uIHdlIHByZXNlcnZlIHRoZSBjYWxsIGdhcnBoLCBhbGwgU0NDIGFuYWx5c2VzLCBhbmQgdGhlCisgICAgLy8gYW5hbHlzaXMgcHJveGllcyBieSBoYW5kbGluZyB0aGVtIGFib3ZlIGFuZCBpbiBhbnkgbmVzdGVkIHBhc3MgbWFuYWdlcnMuCisgICAgUEEucHJlc2VydmVTZXQ8QWxsQW5hbHlzZXNPbjxMYXp5Q2FsbEdyYXBoOjpTQ0M+PigpOworICAgIFBBLnByZXNlcnZlPExhenlDYWxsR3JhcGhBbmFseXNpcz4oKTsKKyAgICBQQS5wcmVzZXJ2ZTxDR1NDQ0FuYWx5c2lzTWFuYWdlck1vZHVsZVByb3h5PigpOworICAgIFBBLnByZXNlcnZlPEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyTW9kdWxlUHJveHk+KCk7CisgICAgcmV0dXJuIFBBOworICB9CisKK3ByaXZhdGU6CisgIENHU0NDUGFzc1QgUGFzczsKK307CisKKy8vLyBcYnJpZWYgQSBmdW5jdGlvbiB0byBkZWR1Y2UgYSBmdW5jdGlvbiBwYXNzIHR5cGUgYW5kIHdyYXAgaXQgaW4gdGhlCisvLy8gdGVtcGxhdGVkIGFkYXB0b3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0dTQ0NQYXNzVD4KK01vZHVsZVRvUG9zdE9yZGVyQ0dTQ0NQYXNzQWRhcHRvcjxDR1NDQ1Bhc3NUPgorY3JlYXRlTW9kdWxlVG9Qb3N0T3JkZXJDR1NDQ1Bhc3NBZGFwdG9yKENHU0NDUGFzc1QgUGFzcykgeworICByZXR1cm4gTW9kdWxlVG9Qb3N0T3JkZXJDR1NDQ1Bhc3NBZGFwdG9yPENHU0NDUGFzc1Q+KHN0ZDo6bW92ZShQYXNzKSk7Cit9CisKKy8vLyBBIHByb3h5IGZyb20gYSBcYyBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciB0byBhbiBcYyBTQ0MuCisvLy8KKy8vLyBXaGVuIGEgbW9kdWxlIHBhc3MgcnVucyBhbmQgdHJpZ2dlcnMgaW52YWxpZGF0aW9uLCBib3RoIHRoZSBDR1NDQyBhbmQKKy8vLyBGdW5jdGlvbiBhbmFseXNpcyBtYW5hZ2VyIHByb3hpZXMgb24gdGhlIG1vZHVsZSBnZXQgYW4gaW52YWxpZGF0aW9uIGV2ZW50LgorLy8vIFdlIGRvbid0IHdhbnQgdG8gZnVsbHkgZHVwbGljYXRlIHJlc3BvbnNpYmlsaXR5IGZvciBtb3N0IG9mIHRoZQorLy8vIGludmFsaWRhdGlvbiBsb2dpYy4gSW5zdGVhZCwgdGhpcyBsYXllciBpcyBvbmx5IHJlc3BvbnNpYmxlIGZvciBTQ0MtbG9jYWwKKy8vLyBpbnZhbGlkYXRpb24gZXZlbnRzLiBXZSB3b3JrIHdpdGggdGhlIG1vZHVsZSdzIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyIHRvCisvLy8gaW52YWxpZGF0ZSBmdW5jdGlvbiBhbmFseXNlcy4KK2NsYXNzIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyQ0dTQ0NQcm94eQorICAgIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyQ0dTQ0NQcm94eT4geworcHVibGljOgorICBjbGFzcyBSZXN1bHQgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgUmVzdWx0KEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZGQU0pIDogRkFNKCZGQU0pIHt9CisKKyAgICAvLy8gXGJyaWVmIEFjY2Vzc29yIGZvciB0aGUgYW5hbHlzaXMgbWFuYWdlci4KKyAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmZ2V0TWFuYWdlcigpIHsgcmV0dXJuICpGQU07IH0KKworICAgIGJvb2wgaW52YWxpZGF0ZShMYXp5Q2FsbEdyYXBoOjpTQ0MgJkMsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICZQQSwKKyAgICAgICAgICAgICAgICAgICAgQ0dTQ0NBbmFseXNpc01hbmFnZXI6OkludmFsaWRhdG9yICZJbnYpOworCisgIHByaXZhdGU6CisgICAgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgKkZBTTsKKyAgfTsKKworICAvLy8gQ29tcHV0ZXMgdGhlIFxjIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyIGFuZCBzdG9yZXMgaXQgaW4gdGhlIHJlc3VsdCBwcm94eS4KKyAgUmVzdWx0IHJ1bihMYXp5Q2FsbEdyYXBoOjpTQ0MgJkMsIENHU0NDQW5hbHlzaXNNYW5hZ2VyICZBTSwgTGF6eUNhbGxHcmFwaCAmKTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyQ0dTQ0NQcm94eT47CisKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKK307CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBPdXRlckFuYWx5c2lzTWFuYWdlclByb3h5PENHU0NDQW5hbHlzaXNNYW5hZ2VyLCBGdW5jdGlvbj47CisKKy8vLyBBIHByb3h5IGZyb20gYSBcYyBDR1NDQ0FuYWx5c2lzTWFuYWdlciB0byBhIFxjIEZ1bmN0aW9uLgordXNpbmcgQ0dTQ0NBbmFseXNpc01hbmFnZXJGdW5jdGlvblByb3h5ID0KKyAgICBPdXRlckFuYWx5c2lzTWFuYWdlclByb3h5PENHU0NDQW5hbHlzaXNNYW5hZ2VyLCBGdW5jdGlvbj47CisKKy8vLyBIZWxwZXIgdG8gdXBkYXRlIHRoZSBjYWxsIGdyYXBoIGFmdGVyIHJ1bm5pbmcgYSBmdW5jdGlvbiBwYXNzLgorLy8vCisvLy8gRnVuY3Rpb24gcGFzc2VzIGNhbiBvbmx5IG11dGF0ZSB0aGUgY2FsbCBncmFwaCBpbiBzcGVjaWZpYyB3YXlzLiBUaGlzCisvLy8gcm91dGluZSBwcm92aWRlcyBhIGhlbHBlciB0aGF0IHVwZGF0ZXMgdGhlIGNhbGwgZ3JhcGggaW4gdGhvc2Ugd2F5cworLy8vIGluY2x1ZGluZyByZXR1cm5pbmcgd2hldGhlciBhbnkgY2hhbmdlcyB3ZXJlIG1hZGUgYW5kIHBvcHVsYXRpbmcgYSBDRworLy8vIHVwZGF0ZSByZXN1bHQgc3RydWN0IGZvciB0aGUgb3ZlcmFsbCBDR1NDQyB3YWxrLgorTGF6eUNhbGxHcmFwaDo6U0NDICZ1cGRhdGVDR0FuZEFuYWx5c2lzTWFuYWdlckZvckZ1bmN0aW9uUGFzcygKKyAgICBMYXp5Q2FsbEdyYXBoICZHLCBMYXp5Q2FsbEdyYXBoOjpTQ0MgJkMsIExhenlDYWxsR3JhcGg6Ok5vZGUgJk4sCisgICAgQ0dTQ0NBbmFseXNpc01hbmFnZXIgJkFNLCBDR1NDQ1VwZGF0ZVJlc3VsdCAmVVIpOworCisvLy8gXGJyaWVmIEFkYXB0b3IgdGhhdCBtYXBzIGZyb20gYSBTQ0MgdG8gaXRzIGZ1bmN0aW9ucy4KKy8vLworLy8vIERlc2lnbmVkIHRvIGFsbG93IGNvbXBvc2l0aW9uIG9mIGEgRnVuY3Rpb25QYXNzKE1hbmFnZXIpIGFuZAorLy8vIGEgQ0dTQ0NQYXNzTWFuYWdlci4gTm90ZSB0aGF0IGlmIHRoaXMgcGFzcyBpcyBjb25zdHJ1Y3RlZCB3aXRoIGEgcG9pbnRlcgorLy8vIHRvIGEgXGMgQ0dTQ0NBbmFseXNpc01hbmFnZXIgaXQgd2lsbCBydW4gdGhlCisvLy8gXGMgRnVuY3Rpb25BbmFseXNpc01hbmFnZXJDR1NDQ1Byb3h5IGFuYWx5c2lzIHByaW9yIHRvIHJ1bm5pbmcgdGhlIGZ1bmN0aW9uCisvLy8gcGFzcyBvdmVyIHRoZSBTQ0MgdG8gZW5hYmxlIGEgXGMgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgdG8gYmUgdXNlZAorLy8vIHdpdGhpbiB0aGlzIHJ1biBzYWZlbHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb25QYXNzVD4KK2NsYXNzIENHU0NDVG9GdW5jdGlvblBhc3NBZGFwdG9yCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxDR1NDQ1RvRnVuY3Rpb25QYXNzQWRhcHRvcjxGdW5jdGlvblBhc3NUPj4geworcHVibGljOgorICBleHBsaWNpdCBDR1NDQ1RvRnVuY3Rpb25QYXNzQWRhcHRvcihGdW5jdGlvblBhc3NUIFBhc3MpCisgICAgICA6IFBhc3Moc3RkOjptb3ZlKFBhc3MpKSB7fQorCisgIC8vIFdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWZpbmUgYWxsIHRoZSBzcGVjaWFsIG1lbWJlciBmdW5jdGlvbnMgYmVjYXVzZSBNU1ZDCisgIC8vIHJlZnVzZXMgdG8gZ2VuZXJhdGUgdGhlbS4KKyAgQ0dTQ0NUb0Z1bmN0aW9uUGFzc0FkYXB0b3IoY29uc3QgQ0dTQ0NUb0Z1bmN0aW9uUGFzc0FkYXB0b3IgJkFyZykKKyAgICAgIDogUGFzcyhBcmcuUGFzcykge30KKworICBDR1NDQ1RvRnVuY3Rpb25QYXNzQWRhcHRvcihDR1NDQ1RvRnVuY3Rpb25QYXNzQWRhcHRvciAmJkFyZykKKyAgICAgIDogUGFzcyhzdGQ6Om1vdmUoQXJnLlBhc3MpKSB7fQorCisgIGZyaWVuZCB2b2lkIHN3YXAoQ0dTQ0NUb0Z1bmN0aW9uUGFzc0FkYXB0b3IgJkxIUywKKyAgICAgICAgICAgICAgICAgICBDR1NDQ1RvRnVuY3Rpb25QYXNzQWRhcHRvciAmUkhTKSB7CisgICAgc3RkOjpzd2FwKExIUy5QYXNzLCBSSFMuUGFzcyk7CisgIH0KKworICBDR1NDQ1RvRnVuY3Rpb25QYXNzQWRhcHRvciAmb3BlcmF0b3I9KENHU0NDVG9GdW5jdGlvblBhc3NBZGFwdG9yIFJIUykgeworICAgIHN3YXAoKnRoaXMsIFJIUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBSdW5zIHRoZSBmdW5jdGlvbiBwYXNzIGFjcm9zcyBldmVyeSBmdW5jdGlvbiBpbiB0aGUgbW9kdWxlLgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTGF6eUNhbGxHcmFwaDo6U0NDICZDLCBDR1NDQ0FuYWx5c2lzTWFuYWdlciAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICBMYXp5Q2FsbEdyYXBoICZDRywgQ0dTQ0NVcGRhdGVSZXN1bHQgJlVSKSB7CisgICAgLy8gU2V0dXAgdGhlIGZ1bmN0aW9uIGFuYWx5c2lzIG1hbmFnZXIgZnJvbSBpdHMgcHJveHkuCisgICAgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkZBTSA9CisgICAgICAgIEFNLmdldFJlc3VsdDxGdW5jdGlvbkFuYWx5c2lzTWFuYWdlckNHU0NDUHJveHk+KEMsIENHKS5nZXRNYW5hZ2VyKCk7CisKKyAgICBTbWFsbFZlY3RvcjxMYXp5Q2FsbEdyYXBoOjpOb2RlICosIDQ+IE5vZGVzOworICAgIGZvciAoTGF6eUNhbGxHcmFwaDo6Tm9kZSAmTiA6IEMpCisgICAgICBOb2Rlcy5wdXNoX2JhY2soJk4pOworCisgICAgLy8gVGhlIFNDQyBtYXkgZ2V0IHNwbGl0IHdoaWxlIHdlIGFyZSBvcHRpbWl6aW5nIGZ1bmN0aW9ucyBkdWUgdG8gZGVsZXRpbmcKKyAgICAvLyBlZGdlcy4gSWYgdGhpcyBoYXBwZW5zLCB0aGUgY3VycmVudCBTQ0MgY2FuIHNoaWZ0LCBzbyBrZWVwIHRyYWNrIG9mCisgICAgLy8gYSBwb2ludGVyIHdlIGNhbiBvdmVyd3JpdGUuCisgICAgTGF6eUNhbGxHcmFwaDo6U0NDICpDdXJyZW50QyA9ICZDOworCisgICAgREVCVUcoZGJncygpIDw8ICJSdW5uaW5nIGZ1bmN0aW9uIHBhc3NlcyBhY3Jvc3MgYW4gU0NDOiAiIDw8IEMgPDwgIlxuIik7CisKKyAgICBQcmVzZXJ2ZWRBbmFseXNlcyBQQSA9IFByZXNlcnZlZEFuYWx5c2VzOjphbGwoKTsKKyAgICBmb3IgKExhenlDYWxsR3JhcGg6Ok5vZGUgKk4gOiBOb2RlcykgeworICAgICAgLy8gU2tpcCBub2RlcyBmcm9tIG90aGVyIFNDQ3MuIFRoZXNlIG1heSBoYXZlIGJlZW4gc3BsaXQgb3V0IGR1cmluZworICAgICAgLy8gcHJvY2Vzc2luZy4gV2UnbGwgZXZlbnR1YWxseSB2aXNpdCB0aG9zZSBTQ0NzIGFuZCBwaWNrIHVwIHRoZSBub2RlcworICAgICAgLy8gdGhlcmUuCisgICAgICBpZiAoQ0cubG9va3VwU0NDKCpOKSAhPSBDdXJyZW50QykKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIFByZXNlcnZlZEFuYWx5c2VzIFBhc3NQQSA9IFBhc3MucnVuKE4tPmdldEZ1bmN0aW9uKCksIEZBTSk7CisKKyAgICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgZnVuY3Rpb24gcGFzcyBjb3VsZG4ndCBoYXZlIGludmFsaWRhdGVkIGFueSBvdGhlcgorICAgICAgLy8gZnVuY3Rpb24ncyBhbmFseXNlcyAodGhhdCdzIHRoZSBjb250cmFjdCBvZiBhIGZ1bmN0aW9uIHBhc3MpLCBzbworICAgICAgLy8gZGlyZWN0bHkgaGFuZGxlIHRoZSBmdW5jdGlvbiBhbmFseXNpcyBtYW5hZ2VyJ3MgaW52YWxpZGF0aW9uIGhlcmUuCisgICAgICBGQU0uaW52YWxpZGF0ZShOLT5nZXRGdW5jdGlvbigpLCBQYXNzUEEpOworCisgICAgICAvLyBUaGVuIGludGVyc2VjdCB0aGUgcHJlc2VydmVkIHNldCBzbyB0aGF0IGludmFsaWRhdGlvbiBvZiBtb2R1bGUKKyAgICAgIC8vIGFuYWx5c2VzIHdpbGwgZXZlbnR1YWxseSBvY2N1ciB3aGVuIHRoZSBtb2R1bGUgcGFzcyBjb21wbGV0ZXMuCisgICAgICBQQS5pbnRlcnNlY3Qoc3RkOjptb3ZlKFBhc3NQQSkpOworCisgICAgICAvLyBJZiB0aGUgY2FsbCBncmFwaCBoYXNuJ3QgYmVlbiBwcmVzZXJ2ZWQsIHVwZGF0ZSBpdCBiYXNlZCBvbiB0aGlzCisgICAgICAvLyBmdW5jdGlvbiBwYXNzLiBUaGlzIG1heSBhbHNvIHVwZGF0ZSB0aGUgY3VycmVudCBTQ0MgdG8gcG9pbnQgdG8KKyAgICAgIC8vIGEgc21hbGxlciwgbW9yZSByZWZpbmVkIFNDQy4KKyAgICAgIGF1dG8gUEFDID0gUEEuZ2V0Q2hlY2tlcjxMYXp5Q2FsbEdyYXBoQW5hbHlzaXM+KCk7CisgICAgICBpZiAoIVBBQy5wcmVzZXJ2ZWQoKSAmJiAhUEFDLnByZXNlcnZlZFNldDxBbGxBbmFseXNlc09uPE1vZHVsZT4+KCkpIHsKKyAgICAgICAgQ3VycmVudEMgPSAmdXBkYXRlQ0dBbmRBbmFseXNpc01hbmFnZXJGb3JGdW5jdGlvblBhc3MoQ0csICpDdXJyZW50QywgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNLCBVUik7CisgICAgICAgIGFzc2VydCgKKyAgICAgICAgICAgIENHLmxvb2t1cFNDQygqTikgPT0gQ3VycmVudEMgJiYKKyAgICAgICAgICAgICJDdXJyZW50IFNDQyBub3QgdXBkYXRlZCB0byB0aGUgU0NDIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgbm9kZSEiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBCeSBkZWZpbml0aW9uIHdlIHByZXNlcnZlIHRoZSBwcm94eS4gQW5kIHdlIHByZXNlcnZlIGFsbCBhbmFseXNlcyBvbgorICAgIC8vIEZ1bmN0aW9ucy4gVGhpcyBwcmVjbHVkZXMgKmFueSogaW52YWxpZGF0aW9uIG9mIGZ1bmN0aW9uIGFuYWx5c2VzIGJ5IHRoZQorICAgIC8vIHByb3h5LCBidXQgdGhhdCdzIE9LIGJlY2F1c2Ugd2UndmUgdGFrZW4gY2FyZSB0byBpbnZhbGlkYXRlIGFuYWx5c2VzIGluCisgICAgLy8gdGhlIGZ1bmN0aW9uIGFuYWx5c2lzIG1hbmFnZXIgaW5jcmVtZW50YWxseSBhYm92ZS4KKyAgICBQQS5wcmVzZXJ2ZVNldDxBbGxBbmFseXNlc09uPEZ1bmN0aW9uPj4oKTsKKyAgICBQQS5wcmVzZXJ2ZTxGdW5jdGlvbkFuYWx5c2lzTWFuYWdlckNHU0NDUHJveHk+KCk7CisKKyAgICAvLyBXZSd2ZSBhbHNvIGVuc3VyZWQgdGhhdCB3ZSB1cGRhdGVkIHRoZSBjYWxsIGdyYXBoIGFsb25nIHRoZSB3YXkuCisgICAgUEEucHJlc2VydmU8TGF6eUNhbGxHcmFwaEFuYWx5c2lzPigpOworCisgICAgcmV0dXJuIFBBOworICB9CisKK3ByaXZhdGU6CisgIEZ1bmN0aW9uUGFzc1QgUGFzczsKK307CisKKy8vLyBcYnJpZWYgQSBmdW5jdGlvbiB0byBkZWR1Y2UgYSBmdW5jdGlvbiBwYXNzIHR5cGUgYW5kIHdyYXAgaXQgaW4gdGhlCisvLy8gdGVtcGxhdGVkIGFkYXB0b3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb25QYXNzVD4KK0NHU0NDVG9GdW5jdGlvblBhc3NBZGFwdG9yPEZ1bmN0aW9uUGFzc1Q+CitjcmVhdGVDR1NDQ1RvRnVuY3Rpb25QYXNzQWRhcHRvcihGdW5jdGlvblBhc3NUIFBhc3MpIHsKKyAgcmV0dXJuIENHU0NDVG9GdW5jdGlvblBhc3NBZGFwdG9yPEZ1bmN0aW9uUGFzc1Q+KHN0ZDo6bW92ZShQYXNzKSk7Cit9CisKKy8vLyBBIGhlbHBlciB0aGF0IHJlcGVhdHMgYW4gU0NDIHBhc3MgZWFjaCB0aW1lIGFuIGluZGlyZWN0IGNhbGwgaXMgcmVmaW5lZCB0bworLy8vIGEgZGlyZWN0IGNhbGwgYnkgdGhhdCBwYXNzLgorLy8vCisvLy8gV2hpbGUgdGhlIENHU0NDIHBhc3MgbWFuYWdlciB3b3JrcyB0byByZS12aXNpdCBTQ0NzIGFuZCBSZWZTQ0NzIGFzIHRoZXkKKy8vLyBjaGFuZ2Ugc2hhcGUsIHdlIG1heSBhbHNvIHdhbnQgdG8gcmVwZWF0IGFuIFNDQyBwYXNzIGlmIGl0IHNpbXBseSByZWZpbmVzCisvLy8gYW4gaW5kaXJlY3QgY2FsbCB0byBhIGRpcmVjdCBjYWxsLCBldmVuIGlmIGRvaW5nIHNvIGRvZXMgbm90IGFsdGVyIHRoZQorLy8vIHNoYXBlIG9mIHRoZSBncmFwaC4gTm90ZSB0aGF0IHRoaXMgb25seSBwZXJ0YWlucyB0byBkaXJlY3QgY2FsbHMgdG8KKy8vLyBmdW5jdGlvbnMgd2hlcmUgSVBPIGFjcm9zcyB0aGUgU0NDIG1heSBiZSBhYmxlIHRvIGNvbXB1dGUgbW9yZSBwcmVjaXNlCisvLy8gcmVzdWx0cy4gRm9yIGludHJpbnNpY3MsIHdlIGFzc3VtZSBzY2FsYXIgb3B0aW1pemF0aW9ucyBhbHJlYWR5IGNhbiBmdWxseQorLy8vIHJlYXNvbiBhYm91dCB0aGVtLgorLy8vCisvLy8gVGhpcyByZXBldGl0aW9uIGhhcyB0aGUgcG90ZW50aWFsIHRvIGJlIHZlcnkgbGFyZ2UgaG93ZXZlciwgYXMgZWFjaCBvbmUKKy8vLyBtaWdodCByZWZpbmUgYSBzaW5nbGUgY2FsbCBzaXRlLiBBcyBhIGNvbnNlcXVlbmNlLCBpbiBwcmFjdGljZSB3ZSB1c2UgYW4KKy8vLyB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIHJlcGV0aXRpb25zIHRvIGxpbWl0IHRoaW5ncy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQYXNzVD4KK2NsYXNzIERldmlydFNDQ1JlcGVhdGVkUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48RGV2aXJ0U0NDUmVwZWF0ZWRQYXNzPFBhc3NUPj4geworcHVibGljOgorICBleHBsaWNpdCBEZXZpcnRTQ0NSZXBlYXRlZFBhc3MoUGFzc1QgUGFzcywgaW50IE1heEl0ZXJhdGlvbnMpCisgICAgICA6IFBhc3Moc3RkOjptb3ZlKFBhc3MpKSwgTWF4SXRlcmF0aW9ucyhNYXhJdGVyYXRpb25zKSB7fQorCisgIC8vLyBSdW5zIHRoZSB3cmFwcGVkIHBhc3MgdXAgdG8gXGMgTWF4SXRlcmF0aW9ucyBvbiB0aGUgU0NDLCBpdGVyYXRpbmcKKyAgLy8vIHdoZW5ldmVyIGFuIGluZGlyZWN0IGNhbGwgaXMgcmVmaW5lZC4KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKExhenlDYWxsR3JhcGg6OlNDQyAmSW5pdGlhbEMsIENHU0NDQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExhenlDYWxsR3JhcGggJkNHLCBDR1NDQ1VwZGF0ZVJlc3VsdCAmVVIpIHsKKyAgICBQcmVzZXJ2ZWRBbmFseXNlcyBQQSA9IFByZXNlcnZlZEFuYWx5c2VzOjphbGwoKTsKKworICAgIC8vIFRoZSBTQ0MgbWF5IGJlIHJlZmluZWQgd2hpbGUgd2UgYXJlIHJ1bm5pbmcgcGFzc2VzIG92ZXIgaXQsIHNvIHNldCB1cAorICAgIC8vIGEgcG9pbnRlciB0aGF0IHdlIGNhbiB1cGRhdGUuCisgICAgTGF6eUNhbGxHcmFwaDo6U0NDICpDID0gJkluaXRpYWxDOworCisgICAgLy8gQ29sbGVjdCB2YWx1ZSBoYW5kbGVzIGZvciBhbGwgb2YgdGhlIGluZGlyZWN0IGNhbGwgc2l0ZXMuCisgICAgU21hbGxWZWN0b3I8V2Vha1RyYWNraW5nVkgsIDg+IENhbGxIYW5kbGVzOworCisgICAgLy8gU3RydWN0IHRvIHRyYWNrIHRoZSBjb3VudHMgb2YgZGlyZWN0IGFuZCBpbmRpcmVjdCBjYWxscyBpbiBlYWNoIGZ1bmN0aW9uCisgICAgLy8gb2YgdGhlIFNDQy4KKyAgICBzdHJ1Y3QgQ2FsbENvdW50IHsKKyAgICAgIGludCBEaXJlY3Q7CisgICAgICBpbnQgSW5kaXJlY3Q7CisgICAgfTsKKworICAgIC8vIFB1dCB2YWx1ZSBoYW5kbGVzIG9uIGFsbCBvZiB0aGUgaW5kaXJlY3QgY2FsbHMgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mCisgICAgLy8gZGlyZWN0IGNhbGxzIGZvciBlYWNoIGZ1bmN0aW9uIGluIHRoZSBTQ0MuCisgICAgYXV0byBTY2FuU0NDID0gW10oTGF6eUNhbGxHcmFwaDo6U0NDICZDLAorICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxXZWFrVHJhY2tpbmdWSD4gJkNhbGxIYW5kbGVzKSB7CisgICAgICBhc3NlcnQoQ2FsbEhhbmRsZXMuZW1wdHkoKSAmJiAiTXVzdCBzdGFydCB3aXRoIGEgY2xlYXIgc2V0IG9mIGhhbmRsZXMuIik7CisKKyAgICAgIFNtYWxsVmVjdG9yPENhbGxDb3VudCwgND4gQ2FsbENvdW50czsKKyAgICAgIGZvciAoTGF6eUNhbGxHcmFwaDo6Tm9kZSAmTiA6IEMpIHsKKyAgICAgICAgQ2FsbENvdW50cy5wdXNoX2JhY2soezAsIDB9KTsKKyAgICAgICAgQ2FsbENvdW50ICZDb3VudCA9IENhbGxDb3VudHMuYmFjaygpOworICAgICAgICBmb3IgKEluc3RydWN0aW9uICZJIDogaW5zdHJ1Y3Rpb25zKE4uZ2V0RnVuY3Rpb24oKSkpCisgICAgICAgICAgaWYgKGF1dG8gQ1MgPSBDYWxsU2l0ZSgmSSkpIHsKKyAgICAgICAgICAgIGlmIChDUy5nZXRDYWxsZWRGdW5jdGlvbigpKSB7CisgICAgICAgICAgICAgICsrQ291bnQuRGlyZWN0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgKytDb3VudC5JbmRpcmVjdDsKKyAgICAgICAgICAgICAgQ2FsbEhhbmRsZXMucHVzaF9iYWNrKFdlYWtUcmFja2luZ1ZIKCZJKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gQ2FsbENvdW50czsKKyAgICB9OworCisgICAgLy8gUG9wdWxhdGUgdGhlIGluaXRpYWwgY2FsbCBoYW5kbGVzIGFuZCBnZXQgdGhlIGluaXRpYWwgY2FsbCBjb3VudHMuCisgICAgYXV0byBDYWxsQ291bnRzID0gU2NhblNDQygqQywgQ2FsbEhhbmRsZXMpOworCisgICAgZm9yIChpbnQgSXRlcmF0aW9uID0gMDs7ICsrSXRlcmF0aW9uKSB7CisgICAgICBQcmVzZXJ2ZWRBbmFseXNlcyBQYXNzUEEgPSBQYXNzLnJ1bigqQywgQU0sIENHLCBVUik7CisKKyAgICAgIC8vIElmIHRoZSBTQ0Mgc3RydWN0dXJlIGhhcyBjaGFuZ2VkLCBiYWlsIGltbWVkaWF0ZWx5IGFuZCBsZXQgdGhlIG91dGVyCisgICAgICAvLyBDR1NDQyBsYXllciBoYW5kbGUgYW55IGl0ZXJhdGlvbiB0byByZWZsZWN0IHRoZSByZWZpbmVkIHN0cnVjdHVyZS4KKyAgICAgIGlmIChVUi5VcGRhdGVkQyAmJiBVUi5VcGRhdGVkQyAhPSBDKSB7CisgICAgICAgIFBBLmludGVyc2VjdChzdGQ6Om1vdmUoUGFzc1BBKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBtaXNzIGFueSB1cGRhdGUgc2NlbmFyaW8uCisgICAgICBhc3NlcnQoIVVSLkludmFsaWRhdGVkU0NDcy5jb3VudChDKSAmJiAiUHJvY2Vzc2luZyBhbiBpbnZhbGlkIFNDQyEiKTsKKyAgICAgIGFzc2VydChDLT5iZWdpbigpICE9IEMtPmVuZCgpICYmICJDYW5ub3QgaGF2ZSBhbiBlbXB0eSBTQ0MhIik7CisgICAgICBhc3NlcnQoKGludClDYWxsQ291bnRzLnNpemUoKSA9PSBDLT5zaXplKCkgJiYKKyAgICAgICAgICAgICAiQ2Fubm90IGhhdmUgY2hhbmdlZCB0aGUgc2l6ZSBvZiB0aGUgU0NDISIpOworCisgICAgICAvLyBDaGVjayB3aGV0aGVyIGFueSBvZiB0aGUgaGFuZGxlcyB3ZXJlIGRldmlydHVhbGl6ZWQuCisgICAgICBhdXRvIElzRGV2aXJ0dWFsaXplZEhhbmRsZSA9IFsmXShXZWFrVHJhY2tpbmdWSCAmQ2FsbEgpIHsKKyAgICAgICAgaWYgKCFDYWxsSCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGF1dG8gQ1MgPSBDYWxsU2l0ZShDYWxsSCk7CisgICAgICAgIGlmICghQ1MpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIElmIHRoZSBjYWxsIGlzIHN0aWxsIGluZGlyZWN0LCBsZWF2ZSBpdCBhbG9uZS4KKyAgICAgICAgRnVuY3Rpb24gKkYgPSBDUy5nZXRDYWxsZWRGdW5jdGlvbigpOworICAgICAgICBpZiAoIUYpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiRm91bmQgZGV2aXJ1dGFsaXplZCBjYWxsIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgPDwgQ1MuZ2V0UGFyZW50KCktPmdldFBhcmVudCgpLT5nZXROYW1lKCkgPDwgIiB0byAiCisgICAgICAgICAgICAgICAgICAgICA8PCBGLT5nZXROYW1lKCkgPDwgIlxuIik7CisKKyAgICAgICAgLy8gV2Ugbm93IGhhdmUgYSBkaXJlY3QgY2FsbCB3aGVyZSBwcmV2aW91c2x5IHdlIGhhZCBhbiBpbmRpcmVjdCBjYWxsLAorICAgICAgICAvLyBzbyBpdGVyYXRlIHRvIHByb2Nlc3MgdGhpcyBkZXZpcnR1YWxpemF0aW9uIHNpdGUuCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfTsKKyAgICAgIGJvb2wgRGV2aXJ0ID0gbGx2bTo6YW55X29mKENhbGxIYW5kbGVzLCBJc0RldmlydHVhbGl6ZWRIYW5kbGUpOworCisgICAgICAvLyBSZXNjYW4gdG8gYnVpbGQgdXAgYSBuZXcgc2V0IG9mIGhhbmRsZXMgYW5kIGNvdW50IGhvdyBtYW55IGRpcmVjdAorICAgICAgLy8gY2FsbHMgcmVtYWluLiBJZiB3ZSBkZWNpZGUgdG8gaXRlcmF0ZSwgdGhpcyBhbHNvIHNldHMgdXAgdGhlIGlucHV0IHRvCisgICAgICAvLyB0aGUgbmV4dCBpdGVyYXRpb24uCisgICAgICBDYWxsSGFuZGxlcy5jbGVhcigpOworICAgICAgYXV0byBOZXdDYWxsQ291bnRzID0gU2NhblNDQygqQywgQ2FsbEhhbmRsZXMpOworCisgICAgICAvLyBJZiB3ZSBoYXZlbid0IGZvdW5kIGFuIGV4cGxpY2l0IGRldmlydHVhbGl6YXRpb24gYWxyZWFkeSBzZWUgaWYgd2UKKyAgICAgIC8vIGhhdmUgZGVjcmVhc2VkIHRoZSBudW1iZXIgb2YgaW5kaXJlY3QgY2FsbHMgYW5kIGluY3JlYXNlZCB0aGUgbnVtYmVyCisgICAgICAvLyBvZiBkaXJlY3QgY2FsbHMgZm9yIGFueSBmdW5jdGlvbiBpbiB0aGUgU0NDLiBUaGlzIGNhbiBiZSBmb29sZWQgYnkgYWxsCisgICAgICAvLyBtYW5uZXIgb2YgdHJhbnNmb3JtYXRpb25zIHN1Y2ggYXMgRENFIGFuZCBvdGhlciB0aGluZ3MsIGJ1dCBzZWVtcyB0bworICAgICAgLy8gd29yayB3ZWxsIGluIHByYWN0aWNlLgorICAgICAgaWYgKCFEZXZpcnQpCisgICAgICAgIGZvciAoaW50IGkgPSAwLCBTaXplID0gQy0+c2l6ZSgpOyBpIDwgU2l6ZTsgKytpKQorICAgICAgICAgIGlmIChDYWxsQ291bnRzW2ldLkluZGlyZWN0ID4gTmV3Q2FsbENvdW50c1tpXS5JbmRpcmVjdCAmJgorICAgICAgICAgICAgICBDYWxsQ291bnRzW2ldLkRpcmVjdCA8IE5ld0NhbGxDb3VudHNbaV0uRGlyZWN0KSB7CisgICAgICAgICAgICBEZXZpcnQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICBpZiAoIURldmlydCkgeworICAgICAgICBQQS5pbnRlcnNlY3Qoc3RkOjptb3ZlKFBhc3NQQSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gT3RoZXJ3aXNlLCBpZiB3ZSd2ZSBhbHJlYWR5IGhpdCBvdXIgbWF4LCB3ZSdyZSBkb25lLgorICAgICAgaWYgKEl0ZXJhdGlvbiA+PSBNYXhJdGVyYXRpb25zKSB7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiRm91bmQgYW5vdGhlciBkZXZpcnR1YWxpemF0aW9uIGFmdGVyIGhpdHRpbmcgdGhlIG1heCAiCisgICAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyIG9mIHJlcGV0aXRpb25zICgiCisgICAgICAgICAgICAgICAgICAgICA8PCBNYXhJdGVyYXRpb25zIDw8ICIpIG9uIFNDQzogIiA8PCAqQyA8PCAiXG4iKTsKKyAgICAgICAgUEEuaW50ZXJzZWN0KHN0ZDo6bW92ZShQYXNzUEEpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIERFQlVHKGRiZ3MoKQorICAgICAgICAgICAgPDwgIlJlcGVhdGluZyBhbiBTQ0MgcGFzcyBhZnRlciBmaW5kaW5nIGEgZGV2aXJ0dWFsaXphdGlvbiBpbjogIgorICAgICAgICAgICAgPDwgKkMgPDwgIlxuIik7CisKKyAgICAgIC8vIE1vdmUgb3ZlciB0aGUgbmV3IGNhbGwgY291bnRzIGluIHByZXBhcmF0aW9uIGZvciBpdGVyYXRpbmcuCisgICAgICBDYWxsQ291bnRzID0gc3RkOjptb3ZlKE5ld0NhbGxDb3VudHMpOworCisgICAgICAvLyBVcGRhdGUgdGhlIGFuYWx5c2lzIG1hbmFnZXIgd2l0aCBlYWNoIHJ1biBhbmQgaW50ZXJzZWN0IHRoZSB0b3RhbCBzZXQKKyAgICAgIC8vIG9mIHByZXNlcnZlZCBhbmFseXNlcyBzbyB3ZSdyZSByZWFkeSB0byBpdGVyYXRlLgorICAgICAgQU0uaW52YWxpZGF0ZSgqQywgUGFzc1BBKTsKKyAgICAgIFBBLmludGVyc2VjdChzdGQ6Om1vdmUoUGFzc1BBKSk7CisgICAgfQorCisgICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IGFkZCBhbnkgcHJlc2VydmVkIGVudHJpZXMgaGVyZSB1bmxpa2UgYSBtb3JlIG5vcm1hbAorICAgIC8vICJwYXNzIG1hbmFnZXIiIGJlY2F1c2Ugd2Ugb25seSBoYW5kbGUgaW52YWxpZGF0aW9uICpiZXR3ZWVuKiBpdGVyYXRpb25zLAorICAgIC8vIG5vdCBhZnRlciB0aGUgbGFzdCBpdGVyYXRpb24uCisgICAgcmV0dXJuIFBBOworICB9CisKK3ByaXZhdGU6CisgIFBhc3NUIFBhc3M7CisgIGludCBNYXhJdGVyYXRpb25zOworfTsKKworLy8vIFxicmllZiBBIGZ1bmN0aW9uIHRvIGRlZHVjZSBhIGZ1bmN0aW9uIHBhc3MgdHlwZSBhbmQgd3JhcCBpdCBpbiB0aGUKKy8vLyB0ZW1wbGF0ZWQgYWRhcHRvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQYXNzVD4KK0RldmlydFNDQ1JlcGVhdGVkUGFzczxQYXNzVD4gY3JlYXRlRGV2aXJ0U0NDUmVwZWF0ZWRQYXNzKFBhc3NUIFBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTWF4SXRlcmF0aW9ucykgeworICByZXR1cm4gRGV2aXJ0U0NDUmVwZWF0ZWRQYXNzPFBhc3NUPihzdGQ6Om1vdmUoUGFzcyksIE1heEl0ZXJhdGlvbnMpOworfQorCisvLyBDbGVhciBvdXQgdGhlIGRlYnVnIGxvZ2dpbmcgbWFjcm8uCisjdW5kZWYgREVCVUdfVFlQRQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19DR1NDQ1BBU1NNQU5BR0VSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NhbGxHcmFwaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZmM4NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NhbGxHcmFwaC5oCkBAIC0wLDAgKzEsNTA5IEBACisvLz09PS0gQ2FsbEdyYXBoLmggLSBCdWlsZCBhIE1vZHVsZSdzIGNhbGwgZ3JhcGggLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8KKy8vLyBUaGlzIGZpbGUgcHJvdmlkZXMgaW50ZXJmYWNlcyB1c2VkIHRvIGJ1aWxkIGFuZCBtYW5pcHVsYXRlIGEgY2FsbCBncmFwaCwKKy8vLyB3aGljaCBpcyBhIHZlcnkgdXNlZnVsIHRvb2wgZm9yIGludGVycHJvY2VkdXJhbCBvcHRpbWl6YXRpb24uCisvLy8KKy8vLyBFdmVyeSBmdW5jdGlvbiBpbiBhIG1vZHVsZSBpcyByZXByZXNlbnRlZCBhcyBhIG5vZGUgaW4gdGhlIGNhbGwgZ3JhcGguICBUaGUKKy8vLyBjYWxsZ3JhcGggbm9kZSBrZWVwcyB0cmFjayBvZiB3aGljaCBmdW5jdGlvbnMgYXJlIGNhbGxlZCBieSB0aGUgZnVuY3Rpb24KKy8vLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlLgorLy8vCisvLy8gQSBjYWxsIGdyYXBoIG1heSBjb250YWluIG5vZGVzIHdoZXJlIHRoZSBmdW5jdGlvbiB0aGF0IHRoZXkgY29ycmVzcG9uZCB0bworLy8vIGlzIG51bGwuICBUaGVzZSAnZXh0ZXJuYWwnIG5vZGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBjb250cm9sIGZsb3cgdGhhdCBpcworLy8vIG5vdCByZXByZXNlbnRlZCAob3IgYW5hbHl6YWJsZSkgaW4gdGhlIG1vZHVsZS4gIEluIHBhcnRpY3VsYXIsIHRoaXMKKy8vLyBhbmFseXNpcyBidWlsZHMgb25lIGV4dGVybmFsIG5vZGUgc3VjaCB0aGF0OgorLy8vICAgMS4gQWxsIGZ1bmN0aW9ucyBpbiB0aGUgbW9kdWxlIHdpdGhvdXQgaW50ZXJuYWwgbGlua2FnZSB3aWxsIGhhdmUgZWRnZXMKKy8vLyAgICAgIGZyb20gdGhpcyBleHRlcm5hbCBub2RlLCBpbmRpY2F0aW5nIHRoYXQgdGhleSBjb3VsZCBiZSBjYWxsZWQgYnkKKy8vLyAgICAgIGZ1bmN0aW9ucyBvdXRzaWRlIG9mIHRoZSBtb2R1bGUuCisvLy8gICAyLiBBbGwgZnVuY3Rpb25zIHdob3NlIGFkZHJlc3MgaXMgdXNlZCBmb3Igc29tZXRoaW5nIG1vcmUgdGhhbiBhIGRpcmVjdAorLy8vICAgICAgY2FsbCwgZm9yIGV4YW1wbGUgYmVpbmcgc3RvcmVkIGludG8gYSBtZW1vcnkgbG9jYXRpb24gd2lsbCBhbHNvIGhhdmUKKy8vLyAgICAgIGFuIGVkZ2UgZnJvbSB0aGlzIGV4dGVybmFsIG5vZGUuICBTaW5jZSB0aGV5IG1heSBiZSBjYWxsZWQgYnkgYW4KKy8vLyAgICAgIHVua25vd24gY2FsbGVyIGxhdGVyLCB0aGV5IG11c3QgYmUgdHJhY2tlZCBhcyBzdWNoLgorLy8vCisvLy8gVGhlcmUgaXMgYSBzZWNvbmQgZXh0ZXJuYWwgbm9kZSBhZGRlZCBmb3IgY2FsbHMgdGhhdCBsZWF2ZSB0aGlzIG1vZHVsZS4KKy8vLyBGdW5jdGlvbnMgaGF2ZSBhIGNhbGwgZWRnZSB0byB0aGUgZXh0ZXJuYWwgbm9kZSBpZmY6CisvLy8gICAxLiBUaGUgZnVuY3Rpb24gaXMgZXh0ZXJuYWwsIHJlZmxlY3RpbmcgdGhlIGZhY3QgdGhhdCB0aGV5IGNvdWxkIGNhbGwKKy8vLyAgICAgIGFueXRoaW5nIHdpdGhvdXQgaW50ZXJuYWwgbGlua2FnZSBvciB0aGF0IGhhcyBpdHMgYWRkcmVzcyB0YWtlbi4KKy8vLyAgIDIuIFRoZSBmdW5jdGlvbiBjb250YWlucyBhbiBpbmRpcmVjdCBmdW5jdGlvbiBjYWxsLgorLy8vCisvLy8gQXMgYW4gZXh0ZW5zaW9uIGluIHRoZSBmdXR1cmUsIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBub2RlcyB3aXRoIGEgbnVsbAorLy8vIGZ1bmN0aW9uLiAgVGhlc2Ugd2lsbCBiZSB1c2VkIHdoZW4gd2UgY2FuIHByb3ZlICh0aHJvdWdoIHBvaW50ZXIgYW5hbHlzaXMpCisvLy8gdGhhdCBhbiBpbmRpcmVjdCBjYWxsIHNpdGUgY2FuIGNhbGwgb25seSBhIHNwZWNpZmljIHNldCBvZiBmdW5jdGlvbnMuCisvLy8KKy8vLyBCZWNhdXNlIG9mIHRoZXNlIHByb3BlcnRpZXMsIHRoZSBDYWxsR3JhcGggY2FwdHVyZXMgYSBjb25zZXJ2YXRpdmUgc3VwZXJzZXQKKy8vLyBvZiBhbGwgb2YgdGhlIGNhbGxlci1jYWxsZWUgcmVsYXRpb25zaGlwcywgd2hpY2ggaXMgdXNlZnVsIGZvcgorLy8vIHRyYW5zZm9ybWF0aW9ucy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0NBTExHUkFQSF9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQ0FMTEdSQVBIX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBDYWxsR3JhcGhOb2RlOworY2xhc3MgTW9kdWxlOworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vLyBcYnJpZWYgVGhlIGJhc2ljIGRhdGEgY29udGFpbmVyIGZvciB0aGUgY2FsbCBncmFwaCBvZiBhIFxjIE1vZHVsZSBvZiBJUi4KKy8vLworLy8vIFRoaXMgY2xhc3MgZXhwb3NlcyBib3RoIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGNhbGwgZ3JhcGggZm9yIGEgbW9kdWxlIG9mIElSLgorLy8vCisvLy8gVGhlIGNvcmUgY2FsbCBncmFwaCBpdHNlbGYgY2FuIGFsc28gYmUgdXBkYXRlZCB0byByZWZsZWN0IGNoYW5nZXMgdG8gdGhlIElSLgorY2xhc3MgQ2FsbEdyYXBoIHsKKyAgTW9kdWxlICZNOworCisgIHVzaW5nIEZ1bmN0aW9uTWFwVHkgPQorICAgICAgc3RkOjptYXA8Y29uc3QgRnVuY3Rpb24gKiwgc3RkOjp1bmlxdWVfcHRyPENhbGxHcmFwaE5vZGU+PjsKKworICAvLy8gXGJyaWVmIEEgbWFwIGZyb20gXGMgRnVuY3Rpb24qIHRvIFxjIENhbGxHcmFwaE5vZGUqLgorICBGdW5jdGlvbk1hcFR5IEZ1bmN0aW9uTWFwOworCisgIC8vLyBcYnJpZWYgVGhpcyBub2RlIGhhcyBlZGdlcyB0byBhbGwgZXh0ZXJuYWwgZnVuY3Rpb25zIGFuZCB0aG9zZSBpbnRlcm5hbAorICAvLy8gZnVuY3Rpb25zIHRoYXQgaGF2ZSB0aGVpciBhZGRyZXNzIHRha2VuLgorICBDYWxsR3JhcGhOb2RlICpFeHRlcm5hbENhbGxpbmdOb2RlOworCisgIC8vLyBcYnJpZWYgVGhpcyBub2RlIGhhcyBlZGdlcyB0byBpdCBmcm9tIGFsbCBmdW5jdGlvbnMgbWFraW5nIGluZGlyZWN0IGNhbGxzCisgIC8vLyBvciBjYWxsaW5nIGFuIGV4dGVybmFsIGZ1bmN0aW9uLgorICBzdGQ6OnVuaXF1ZV9wdHI8Q2FsbEdyYXBoTm9kZT4gQ2FsbHNFeHRlcm5hbE5vZGU7CisKKyAgLy8vIFxicmllZiBSZXBsYWNlIHRoZSBmdW5jdGlvbiByZXByZXNlbnRlZCBieSB0aGlzIG5vZGUgYnkgYW5vdGhlci4KKyAgLy8vCisgIC8vLyBUaGlzIGRvZXMgbm90IHJlc2NhbiB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24sIHNvIGl0IGlzIHN1aXRhYmxlIHdoZW4KKyAgLy8vIHNwbGljaW5nIHRoZSBib2R5IG9mIG9uZSBmdW5jdGlvbiB0byBhbm90aGVyIHdoaWxlIGFsc28gdXBkYXRpbmcgYWxsCisgIC8vLyBjYWxsZXJzIGZyb20gdGhlIG9sZCBmdW5jdGlvbiB0byB0aGUgbmV3LgorICB2b2lkIHNwbGljZUZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICpGcm9tLCBjb25zdCBGdW5jdGlvbiAqVG8pOworCisgIC8vLyBcYnJpZWYgQWRkIGEgZnVuY3Rpb24gdG8gdGhlIGNhbGwgZ3JhcGgsIGFuZCBsaW5rIHRoZSBub2RlIHRvIGFsbCBvZiB0aGUKKyAgLy8vIGZ1bmN0aW9ucyB0aGF0IGl0IGNhbGxzLgorICB2b2lkIGFkZFRvQ2FsbEdyYXBoKEZ1bmN0aW9uICpGKTsKKworcHVibGljOgorICBleHBsaWNpdCBDYWxsR3JhcGgoTW9kdWxlICZNKTsKKyAgQ2FsbEdyYXBoKENhbGxHcmFwaCAmJkFyZyk7CisgIH5DYWxsR3JhcGgoKTsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIHVzaW5nIGl0ZXJhdG9yID0gRnVuY3Rpb25NYXBUeTo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gRnVuY3Rpb25NYXBUeTo6Y29uc3RfaXRlcmF0b3I7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBtb2R1bGUgdGhlIGNhbGwgZ3JhcGggY29ycmVzcG9uZHMgdG8uCisgIE1vZHVsZSAmZ2V0TW9kdWxlKCkgY29uc3QgeyByZXR1cm4gTTsgfQorCisgIGlubGluZSBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIEZ1bmN0aW9uTWFwLmJlZ2luKCk7IH0KKyAgaW5saW5lIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIEZ1bmN0aW9uTWFwLmVuZCgpOyB9CisgIGlubGluZSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEZ1bmN0aW9uTWFwLmJlZ2luKCk7IH0KKyAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEZ1bmN0aW9uTWFwLmVuZCgpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBjYWxsIGdyYXBoIG5vZGUgZm9yIHRoZSBwcm92aWRlZCBmdW5jdGlvbi4KKyAgaW5saW5lIGNvbnN0IENhbGxHcmFwaE5vZGUgKm9wZXJhdG9yW10oY29uc3QgRnVuY3Rpb24gKkYpIGNvbnN0IHsKKyAgICBjb25zdF9pdGVyYXRvciBJID0gRnVuY3Rpb25NYXAuZmluZChGKTsKKyAgICBhc3NlcnQoSSAhPSBGdW5jdGlvbk1hcC5lbmQoKSAmJiAiRnVuY3Rpb24gbm90IGluIGNhbGxncmFwaCEiKTsKKyAgICByZXR1cm4gSS0+c2Vjb25kLmdldCgpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBjYWxsIGdyYXBoIG5vZGUgZm9yIHRoZSBwcm92aWRlZCBmdW5jdGlvbi4KKyAgaW5saW5lIENhbGxHcmFwaE5vZGUgKm9wZXJhdG9yW10oY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgICBjb25zdF9pdGVyYXRvciBJID0gRnVuY3Rpb25NYXAuZmluZChGKTsKKyAgICBhc3NlcnQoSSAhPSBGdW5jdGlvbk1hcC5lbmQoKSAmJiAiRnVuY3Rpb24gbm90IGluIGNhbGxncmFwaCEiKTsKKyAgICByZXR1cm4gSS0+c2Vjb25kLmdldCgpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBcYyBDYWxsR3JhcGhOb2RlIHdoaWNoIGlzIHVzZWQgdG8gcmVwcmVzZW50CisgIC8vLyB1bmRldGVybWluZWQgY2FsbHMgaW50byB0aGUgY2FsbGdyYXBoLgorICBDYWxsR3JhcGhOb2RlICpnZXRFeHRlcm5hbENhbGxpbmdOb2RlKCkgY29uc3QgeyByZXR1cm4gRXh0ZXJuYWxDYWxsaW5nTm9kZTsgfQorCisgIENhbGxHcmFwaE5vZGUgKmdldENhbGxzRXh0ZXJuYWxOb2RlKCkgY29uc3QgeworICAgIHJldHVybiBDYWxsc0V4dGVybmFsTm9kZS5nZXQoKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEZ1bmN0aW9ucyB0byBrZWVwIGEgY2FsbCBncmFwaCB1cCB0byBkYXRlIHdpdGggYSBmdW5jdGlvbiB0aGF0IGhhcyBiZWVuCisgIC8vIG1vZGlmaWVkLgorICAvLworCisgIC8vLyBcYnJpZWYgVW5saW5rIHRoZSBmdW5jdGlvbiBmcm9tIHRoaXMgbW9kdWxlLCByZXR1cm5pbmcgaXQuCisgIC8vLworICAvLy8gQmVjYXVzZSB0aGlzIHJlbW92ZXMgdGhlIGZ1bmN0aW9uIGZyb20gdGhlIG1vZHVsZSwgdGhlIGNhbGwgZ3JhcGggbm9kZSBpcworICAvLy8gZGVzdHJveWVkLiAgVGhpcyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBjYWxsIGFueSBvdGhlcgorICAvLy8gZnVuY3Rpb25zIChpZSwgdGhlcmUgYXJlIG5vIGVkZ2VzIGluIGl0J3MgQ0dOKS4gIFRoZSBlYXNpZXN0IHdheSB0byBkbworICAvLy8gdGhpcyBpcyB0byBkcm9wQWxsUmVmZXJlbmNlcyBiZWZvcmUgY2FsbGluZyB0aGlzLgorICBGdW5jdGlvbiAqcmVtb3ZlRnVuY3Rpb25Gcm9tTW9kdWxlKENhbGxHcmFwaE5vZGUgKkNHTik7CisKKyAgLy8vIFxicmllZiBTaW1pbGFyIHRvIG9wZXJhdG9yW10sIGJ1dCB0aGlzIHdpbGwgaW5zZXJ0IGEgbmV3IENhbGxHcmFwaE5vZGUgZm9yCisgIC8vLyBcYyBGIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgorICBDYWxsR3JhcGhOb2RlICpnZXRPckluc2VydEZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICpGKTsKK307CisKKy8vLyBcYnJpZWYgQSBub2RlIGluIHRoZSBjYWxsIGdyYXBoIGZvciBhIG1vZHVsZS4KKy8vLworLy8vIFR5cGljYWxseSByZXByZXNlbnRzIGEgZnVuY3Rpb24gaW4gdGhlIGNhbGwgZ3JhcGguIFRoZXJlIGFyZSBhbHNvIHNwZWNpYWwKKy8vLyAibnVsbCIgbm9kZXMgdXNlZCB0byByZXByZXNlbnQgdGhlb3JldGljYWwgZW50cmllcyBpbiB0aGUgY2FsbCBncmFwaC4KK2NsYXNzIENhbGxHcmFwaE5vZGUgeworcHVibGljOgorICAvLy8gXGJyaWVmIEEgcGFpciBvZiB0aGUgY2FsbGluZyBpbnN0cnVjdGlvbiAoYSBjYWxsIG9yIGludm9rZSkKKyAgLy8vIGFuZCB0aGUgY2FsbCBncmFwaCBub2RlIGJlaW5nIGNhbGxlZC4KKyAgdXNpbmcgQ2FsbFJlY29yZCA9IHN0ZDo6cGFpcjxXZWFrVHJhY2tpbmdWSCwgQ2FsbEdyYXBoTm9kZSAqPjsKKworcHVibGljOgorICB1c2luZyBDYWxsZWRGdW5jdGlvbnNWZWN0b3IgPSBzdGQ6OnZlY3RvcjxDYWxsUmVjb3JkPjsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYSBub2RlIGZvciB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uLgorICBpbmxpbmUgQ2FsbEdyYXBoTm9kZShGdW5jdGlvbiAqRikgOiBGKEYpIHt9CisKKyAgQ2FsbEdyYXBoTm9kZShjb25zdCBDYWxsR3JhcGhOb2RlICYpID0gZGVsZXRlOworICBDYWxsR3JhcGhOb2RlICZvcGVyYXRvcj0oY29uc3QgQ2FsbEdyYXBoTm9kZSAmKSA9IGRlbGV0ZTsKKworICB+Q2FsbEdyYXBoTm9kZSgpIHsKKyAgICBhc3NlcnQoTnVtUmVmZXJlbmNlcyA9PSAwICYmICJOb2RlIGRlbGV0ZWQgd2hpbGUgcmVmZXJlbmNlcyByZW1haW4iKTsKKyAgfQorCisgIHVzaW5nIGl0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8Q2FsbFJlY29yZD46Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IHN0ZDo6dmVjdG9yPENhbGxSZWNvcmQ+Ojpjb25zdF9pdGVyYXRvcjsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGZ1bmN0aW9uIHRoYXQgdGhpcyBjYWxsIGdyYXBoIG5vZGUgcmVwcmVzZW50cy4KKyAgRnVuY3Rpb24gKmdldEZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gRjsgfQorCisgIGlubGluZSBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIENhbGxlZEZ1bmN0aW9ucy5iZWdpbigpOyB9CisgIGlubGluZSBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBDYWxsZWRGdW5jdGlvbnMuZW5kKCk7IH0KKyAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gQ2FsbGVkRnVuY3Rpb25zLmJlZ2luKCk7IH0KKyAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIENhbGxlZEZ1bmN0aW9ucy5lbmQoKTsgfQorICBpbmxpbmUgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIENhbGxlZEZ1bmN0aW9ucy5lbXB0eSgpOyB9CisgIGlubGluZSB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gKHVuc2lnbmVkKUNhbGxlZEZ1bmN0aW9ucy5zaXplKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBvdGhlciBDYWxsR3JhcGhOb2RlcyBpbiB0aGlzIENhbGxHcmFwaCB0aGF0CisgIC8vLyByZWZlcmVuY2UgdGhpcyBub2RlIGluIHRoZWlyIGNhbGxlZSBsaXN0LgorICB1bnNpZ25lZCBnZXROdW1SZWZlcmVuY2VzKCkgY29uc3QgeyByZXR1cm4gTnVtUmVmZXJlbmNlczsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgaSd0aCBjYWxsZWQgZnVuY3Rpb24uCisgIENhbGxHcmFwaE5vZGUgKm9wZXJhdG9yW10odW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgQ2FsbGVkRnVuY3Rpb25zLnNpemUoKSAmJiAiSW52YWxpZCBpbmRleCIpOworICAgIHJldHVybiBDYWxsZWRGdW5jdGlvbnNbaV0uc2Vjb25kOworICB9CisKKyAgLy8vIFxicmllZiBQcmludCBvdXQgdGhpcyBjYWxsIGdyYXBoIG5vZGUuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gTWV0aG9kcyB0byBrZWVwIGEgY2FsbCBncmFwaCB1cCB0byBkYXRlIHdpdGggYSBmdW5jdGlvbiB0aGF0IGhhcyBiZWVuCisgIC8vIG1vZGlmaWVkCisgIC8vCisKKyAgLy8vIFxicmllZiBSZW1vdmVzIGFsbCBlZGdlcyBmcm9tIHRoaXMgQ2FsbEdyYXBoTm9kZSB0byBhbnkgZnVuY3Rpb25zIGl0CisgIC8vLyBjYWxscy4KKyAgdm9pZCByZW1vdmVBbGxDYWxsZWRGdW5jdGlvbnMoKSB7CisgICAgd2hpbGUgKCFDYWxsZWRGdW5jdGlvbnMuZW1wdHkoKSkgeworICAgICAgQ2FsbGVkRnVuY3Rpb25zLmJhY2soKS5zZWNvbmQtPkRyb3BSZWYoKTsKKyAgICAgIENhbGxlZEZ1bmN0aW9ucy5wb3BfYmFjaygpOworICAgIH0KKyAgfQorCisgIC8vLyBcYnJpZWYgTW92ZXMgYWxsIHRoZSBjYWxsZWUgaW5mb3JtYXRpb24gZnJvbSBOIHRvIHRoaXMgbm9kZS4KKyAgdm9pZCBzdGVhbENhbGxlZEZ1bmN0aW9uc0Zyb20oQ2FsbEdyYXBoTm9kZSAqTikgeworICAgIGFzc2VydChDYWxsZWRGdW5jdGlvbnMuZW1wdHkoKSAmJgorICAgICAgICAgICAiQ2Fubm90IHN0ZWFsIGNhbGxzaXRlIGluZm9ybWF0aW9uIGlmIEkgYWxyZWFkeSBoYXZlIHNvbWUiKTsKKyAgICBzdGQ6OnN3YXAoQ2FsbGVkRnVuY3Rpb25zLCBOLT5DYWxsZWRGdW5jdGlvbnMpOworICB9CisKKyAgLy8vIFxicmllZiBBZGRzIGEgZnVuY3Rpb24gdG8gdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIGNhbGxlZCBieSB0aGlzIG9uZS4KKyAgdm9pZCBhZGRDYWxsZWRGdW5jdGlvbihDYWxsU2l0ZSBDUywgQ2FsbEdyYXBoTm9kZSAqTSkgeworICAgIGFzc2VydCghQ1MuZ2V0SW5zdHJ1Y3Rpb24oKSB8fCAhQ1MuZ2V0Q2FsbGVkRnVuY3Rpb24oKSB8fAorICAgICAgICAgICAhQ1MuZ2V0Q2FsbGVkRnVuY3Rpb24oKS0+aXNJbnRyaW5zaWMoKSB8fAorICAgICAgICAgICAhSW50cmluc2ljOjppc0xlYWYoQ1MuZ2V0Q2FsbGVkRnVuY3Rpb24oKS0+Z2V0SW50cmluc2ljSUQoKSkpOworICAgIENhbGxlZEZ1bmN0aW9ucy5lbXBsYWNlX2JhY2soQ1MuZ2V0SW5zdHJ1Y3Rpb24oKSwgTSk7CisgICAgTS0+QWRkUmVmKCk7CisgIH0KKworICB2b2lkIHJlbW92ZUNhbGxFZGdlKGl0ZXJhdG9yIEkpIHsKKyAgICBJLT5zZWNvbmQtPkRyb3BSZWYoKTsKKyAgICAqSSA9IENhbGxlZEZ1bmN0aW9ucy5iYWNrKCk7CisgICAgQ2FsbGVkRnVuY3Rpb25zLnBvcF9iYWNrKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlbW92ZXMgdGhlIGVkZ2UgaW4gdGhlIG5vZGUgZm9yIHRoZSBzcGVjaWZpZWQgY2FsbCBzaXRlLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCB0YWtlcyBsaW5lYXIgdGltZSwgc28gaXQgc2hvdWxkIGJlIHVzZWQgc3BhcmluZ2x5LgorICB2b2lkIHJlbW92ZUNhbGxFZGdlRm9yKENhbGxTaXRlIENTKTsKKworICAvLy8gXGJyaWVmIFJlbW92ZXMgYWxsIGNhbGwgZWRnZXMgZnJvbSB0aGlzIG5vZGUgdG8gdGhlIHNwZWNpZmllZCBjYWxsZWUKKyAgLy8vIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgdGFrZXMgbW9yZSB0aW1lIHRvIGV4ZWN1dGUgdGhhbiByZW1vdmVDYWxsRWRnZVRvLCBzbyBpdCBzaG91bGQgbm90CisgIC8vLyBiZSB1c2VkIHVubGVzcyBuZWNlc3NhcnkuCisgIHZvaWQgcmVtb3ZlQW55Q2FsbEVkZ2VUbyhDYWxsR3JhcGhOb2RlICpDYWxsZWUpOworCisgIC8vLyBcYnJpZWYgUmVtb3ZlcyBvbmUgZWRnZSBhc3NvY2lhdGVkIHdpdGggYSBudWxsIGNhbGxzaXRlIGZyb20gdGhpcyBub2RlIHRvCisgIC8vLyB0aGUgc3BlY2lmaWVkIGNhbGxlZSBmdW5jdGlvbi4KKyAgdm9pZCByZW1vdmVPbmVBYnN0cmFjdEVkZ2VUbyhDYWxsR3JhcGhOb2RlICpDYWxsZWUpOworCisgIC8vLyBcYnJpZWYgUmVwbGFjZXMgdGhlIGVkZ2UgaW4gdGhlIG5vZGUgZm9yIHRoZSBzcGVjaWZpZWQgY2FsbCBzaXRlIHdpdGggYQorICAvLy8gbmV3IG9uZS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBtZXRob2QgdGFrZXMgbGluZWFyIHRpbWUsIHNvIGl0IHNob3VsZCBiZSB1c2VkIHNwYXJpbmdseS4KKyAgdm9pZCByZXBsYWNlQ2FsbEVkZ2UoQ2FsbFNpdGUgQ1MsIENhbGxTaXRlIE5ld0NTLCBDYWxsR3JhcGhOb2RlICpOZXdOb2RlKTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIENhbGxHcmFwaDsKKworICBGdW5jdGlvbiAqRjsKKworICBzdGQ6OnZlY3RvcjxDYWxsUmVjb3JkPiBDYWxsZWRGdW5jdGlvbnM7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhpcyBDYWxsR3JhcGhOb2RlIG9jY3VycyBpbiB0aGUKKyAgLy8vIENhbGxlZEZ1bmN0aW9ucyBhcnJheSBvZiB0aGlzIG9yIG90aGVyIENhbGxHcmFwaE5vZGVzLgorICB1bnNpZ25lZCBOdW1SZWZlcmVuY2VzID0gMDsKKworICB2b2lkIERyb3BSZWYoKSB7IC0tTnVtUmVmZXJlbmNlczsgfQorICB2b2lkIEFkZFJlZigpIHsgKytOdW1SZWZlcmVuY2VzOyB9CisKKyAgLy8vIFxicmllZiBBIHNwZWNpYWwgZnVuY3Rpb24gdGhhdCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSBDYWxsR3JhcGggY2xhc3MuCisgIHZvaWQgYWxsUmVmZXJlbmNlc0Ryb3BwZWQoKSB7IE51bVJlZmVyZW5jZXMgPSAwOyB9Cit9OworCisvLy8gXGJyaWVmIEFuIGFuYWx5c2lzIHBhc3MgdG8gY29tcHV0ZSB0aGUgXGMgQ2FsbEdyYXBoIGZvciBhIFxjIE1vZHVsZS4KKy8vLworLy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgY29uY2VwdCBvZiBhbiBhbmFseXNpcyBwYXNzIHVzZWQgYnkgdGhlIFxjCisvLy8gTW9kdWxlQW5hbHlzaXNNYW5hZ2VyIHRvIHJ1biBhbiBhbmFseXNpcyBvdmVyIGEgbW9kdWxlIGFuZCBjYWNoZSB0aGUKKy8vLyByZXN1bHRpbmcgZGF0YS4KK2NsYXNzIENhbGxHcmFwaEFuYWx5c2lzIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPENhbGxHcmFwaEFuYWx5c2lzPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxDYWxsR3JhcGhBbmFseXNpcz47CisKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIEEgZm9ybXVsYWljIHR5cGUgdG8gaW5mb3JtIGNsaWVudHMgb2YgdGhlIHJlc3VsdCB0eXBlLgorICB1c2luZyBSZXN1bHQgPSBDYWxsR3JhcGg7CisKKyAgLy8vIFxicmllZiBDb21wdXRlIHRoZSBcYyBDYWxsR3JhcGggZm9yIHRoZSBtb2R1bGUgXGMgTS4KKyAgLy8vCisgIC8vLyBUaGUgcmVhbCB3b3JrIGhlcmUgaXMgZG9uZSBpbiB0aGUgXGMgQ2FsbEdyYXBoIGNvbnN0cnVjdG9yLgorICBDYWxsR3JhcGggcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICYpIHsgcmV0dXJuIENhbGxHcmFwaChNKTsgfQorfTsKKworLy8vIFxicmllZiBQcmludGVyIHBhc3MgZm9yIHRoZSBcYyBDYWxsR3JhcGhBbmFseXNpcyByZXN1bHRzLgorY2xhc3MgQ2FsbEdyYXBoUHJpbnRlclBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxDYWxsR3JhcGhQcmludGVyUGFzcz4geworICByYXdfb3N0cmVhbSAmT1M7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ2FsbEdyYXBoUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TKSA6IE9TKE9TKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIFxicmllZiBUaGUgXGMgTW9kdWxlUGFzcyB3aGljaCB3cmFwcyB1cCBhIFxjIENhbGxHcmFwaCBhbmQgdGhlIGxvZ2ljIHRvCisvLy8gYnVpbGQgaXQuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGV4cG9zZXMgYm90aCB0aGUgaW50ZXJmYWNlIHRvIHRoZSBjYWxsIGdyYXBoIGNvbnRhaW5lciBhbmQgdGhlCisvLy8gbW9kdWxlIHBhc3Mgd2hpY2ggcnVucyBvdmVyIGEgbW9kdWxlIG9mIElSIGFuZCBwcm9kdWNlcyB0aGUgY2FsbCBncmFwaC4gVGhlCisvLy8gY2FsbCBncmFwaCBpbnRlcmZhY2UgaXMgZW50aXJlbGx5IGEgd3JhcHBlciBhcm91bmQgYSBcYyBDYWxsR3JhcGggb2JqZWN0CisvLy8gd2hpY2ggaXMgc3RvcmVkIGludGVybmFsbHkgZm9yIGVhY2ggbW9kdWxlLgorY2xhc3MgQ2FsbEdyYXBoV3JhcHBlclBhc3MgOiBwdWJsaWMgTW9kdWxlUGFzcyB7CisgIHN0ZDo6dW5pcXVlX3B0cjxDYWxsR3JhcGg+IEc7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIENsYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWluZm8KKworICBDYWxsR3JhcGhXcmFwcGVyUGFzcygpOworICB+Q2FsbEdyYXBoV3JhcHBlclBhc3MoKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFRoZSBpbnRlcm5hbCBcYyBDYWxsR3JhcGggYXJvdW5kIHdoaWNoIHRoZSByZXN0IG9mIHRoaXMgaW50ZXJmYWNlCisgIC8vLyBpcyB3cmFwcGVkLgorICBjb25zdCBDYWxsR3JhcGggJmdldENhbGxHcmFwaCgpIGNvbnN0IHsgcmV0dXJuICpHOyB9CisgIENhbGxHcmFwaCAmZ2V0Q2FsbEdyYXBoKCkgeyByZXR1cm4gKkc7IH0KKworICB1c2luZyBpdGVyYXRvciA9IENhbGxHcmFwaDo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gQ2FsbEdyYXBoOjpjb25zdF9pdGVyYXRvcjsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG1vZHVsZSB0aGUgY2FsbCBncmFwaCBjb3JyZXNwb25kcyB0by4KKyAgTW9kdWxlICZnZXRNb2R1bGUoKSBjb25zdCB7IHJldHVybiBHLT5nZXRNb2R1bGUoKTsgfQorCisgIGlubGluZSBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIEctPmJlZ2luKCk7IH0KKyAgaW5saW5lIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIEctPmVuZCgpOyB9CisgIGlubGluZSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEctPmJlZ2luKCk7IH0KKyAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEctPmVuZCgpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBjYWxsIGdyYXBoIG5vZGUgZm9yIHRoZSBwcm92aWRlZCBmdW5jdGlvbi4KKyAgaW5saW5lIGNvbnN0IENhbGxHcmFwaE5vZGUgKm9wZXJhdG9yW10oY29uc3QgRnVuY3Rpb24gKkYpIGNvbnN0IHsKKyAgICByZXR1cm4gKCpHKVtGXTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgY2FsbCBncmFwaCBub2RlIGZvciB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uCisgIGlubGluZSBDYWxsR3JhcGhOb2RlICpvcGVyYXRvcltdKGNvbnN0IEZ1bmN0aW9uICpGKSB7IHJldHVybiAoKkcpW0ZdOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBcYyBDYWxsR3JhcGhOb2RlIHdoaWNoIGlzIHVzZWQgdG8gcmVwcmVzZW50CisgIC8vLyB1bmRldGVybWluZWQgY2FsbHMgaW50byB0aGUgY2FsbGdyYXBoLgorICBDYWxsR3JhcGhOb2RlICpnZXRFeHRlcm5hbENhbGxpbmdOb2RlKCkgY29uc3QgeworICAgIHJldHVybiBHLT5nZXRFeHRlcm5hbENhbGxpbmdOb2RlKCk7CisgIH0KKworICBDYWxsR3JhcGhOb2RlICpnZXRDYWxsc0V4dGVybmFsTm9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRy0+Z2V0Q2FsbHNFeHRlcm5hbE5vZGUoKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEZ1bmN0aW9ucyB0byBrZWVwIGEgY2FsbCBncmFwaCB1cCB0byBkYXRlIHdpdGggYSBmdW5jdGlvbiB0aGF0IGhhcyBiZWVuCisgIC8vIG1vZGlmaWVkLgorICAvLworCisgIC8vLyBcYnJpZWYgVW5saW5rIHRoZSBmdW5jdGlvbiBmcm9tIHRoaXMgbW9kdWxlLCByZXR1cm5pbmcgaXQuCisgIC8vLworICAvLy8gQmVjYXVzZSB0aGlzIHJlbW92ZXMgdGhlIGZ1bmN0aW9uIGZyb20gdGhlIG1vZHVsZSwgdGhlIGNhbGwgZ3JhcGggbm9kZSBpcworICAvLy8gZGVzdHJveWVkLiAgVGhpcyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBjYWxsIGFueSBvdGhlcgorICAvLy8gZnVuY3Rpb25zIChpZSwgdGhlcmUgYXJlIG5vIGVkZ2VzIGluIGl0J3MgQ0dOKS4gIFRoZSBlYXNpZXN0IHdheSB0byBkbworICAvLy8gdGhpcyBpcyB0byBkcm9wQWxsUmVmZXJlbmNlcyBiZWZvcmUgY2FsbGluZyB0aGlzLgorICBGdW5jdGlvbiAqcmVtb3ZlRnVuY3Rpb25Gcm9tTW9kdWxlKENhbGxHcmFwaE5vZGUgKkNHTikgeworICAgIHJldHVybiBHLT5yZW1vdmVGdW5jdGlvbkZyb21Nb2R1bGUoQ0dOKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2ltaWxhciB0byBvcGVyYXRvcltdLCBidXQgdGhpcyB3aWxsIGluc2VydCBhIG5ldyBDYWxsR3JhcGhOb2RlIGZvcgorICAvLy8gXGMgRiBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KKyAgQ2FsbEdyYXBoTm9kZSAqZ2V0T3JJbnNlcnRGdW5jdGlvbihjb25zdCBGdW5jdGlvbiAqRikgeworICAgIHJldHVybiBHLT5nZXRPckluc2VydEZ1bmN0aW9uKEYpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIE1vZHVsZVBhc3MgaW50ZXJmYWNlIG5lZWRlZCBoZXJlLgorICAvLworCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKSBvdmVycmlkZTsKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmbywgY29uc3QgTW9kdWxlICopIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBHcmFwaFRyYWl0cyBzcGVjaWFsaXphdGlvbnMgZm9yIGNhbGwgZ3JhcGhzIHNvIHRoYXQgdGhleSBjYW4gYmUgdHJlYXRlZCBhcworLy8gZ3JhcGhzIGJ5IHRoZSBnZW5lcmljIGdyYXBoIGFsZ29yaXRobXMuCisvLworCisvLyBQcm92aWRlIGdyYXBoIHRyYWl0cyBmb3IgdHJhbnZlcnNpbmcgY2FsbCBncmFwaHMgdXNpbmcgc3RhbmRhcmQgZ3JhcGgKKy8vIHRyYXZlcnNhbHMuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8Q2FsbEdyYXBoTm9kZSAqPiB7CisgIHVzaW5nIE5vZGVSZWYgPSBDYWxsR3JhcGhOb2RlICo7CisgIHVzaW5nIENHTlBhaXJUeSA9IENhbGxHcmFwaE5vZGU6OkNhbGxSZWNvcmQ7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKENhbGxHcmFwaE5vZGUgKkNHTikgeyByZXR1cm4gQ0dOOyB9CisgIHN0YXRpYyBDYWxsR3JhcGhOb2RlICpDR05HZXRWYWx1ZShDR05QYWlyVHkgUCkgeyByZXR1cm4gUC5zZWNvbmQ7IH0KKworICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9CisgICAgICBtYXBwZWRfaXRlcmF0b3I8Q2FsbEdyYXBoTm9kZTo6aXRlcmF0b3IsIGRlY2x0eXBlKCZDR05HZXRWYWx1ZSk+OworCisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsKKyAgICByZXR1cm4gQ2hpbGRJdGVyYXRvclR5cGUoTi0+YmVnaW4oKSwgJkNHTkdldFZhbHVlKTsKKyAgfQorCisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7CisgICAgcmV0dXJuIENoaWxkSXRlcmF0b3JUeXBlKE4tPmVuZCgpLCAmQ0dOR2V0VmFsdWUpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8Y29uc3QgQ2FsbEdyYXBoTm9kZSAqPiB7CisgIHVzaW5nIE5vZGVSZWYgPSBjb25zdCBDYWxsR3JhcGhOb2RlICo7CisgIHVzaW5nIENHTlBhaXJUeSA9IENhbGxHcmFwaE5vZGU6OkNhbGxSZWNvcmQ7CisgIHVzaW5nIEVkZ2VSZWYgPSBjb25zdCBDYWxsR3JhcGhOb2RlOjpDYWxsUmVjb3JkICY7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKGNvbnN0IENhbGxHcmFwaE5vZGUgKkNHTikgeyByZXR1cm4gQ0dOOyB9CisgIHN0YXRpYyBjb25zdCBDYWxsR3JhcGhOb2RlICpDR05HZXRWYWx1ZShDR05QYWlyVHkgUCkgeyByZXR1cm4gUC5zZWNvbmQ7IH0KKworICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9CisgICAgICBtYXBwZWRfaXRlcmF0b3I8Q2FsbEdyYXBoTm9kZTo6Y29uc3RfaXRlcmF0b3IsIGRlY2x0eXBlKCZDR05HZXRWYWx1ZSk+OworICB1c2luZyBDaGlsZEVkZ2VJdGVyYXRvclR5cGUgPSBDYWxsR3JhcGhOb2RlOjpjb25zdF9pdGVyYXRvcjsKKworICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7CisgICAgcmV0dXJuIENoaWxkSXRlcmF0b3JUeXBlKE4tPmJlZ2luKCksICZDR05HZXRWYWx1ZSk7CisgIH0KKworICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeworICAgIHJldHVybiBDaGlsZEl0ZXJhdG9yVHlwZShOLT5lbmQoKSwgJkNHTkdldFZhbHVlKTsKKyAgfQorCisgIHN0YXRpYyBDaGlsZEVkZ2VJdGVyYXRvclR5cGUgY2hpbGRfZWRnZV9iZWdpbihOb2RlUmVmIE4pIHsKKyAgICByZXR1cm4gTi0+YmVnaW4oKTsKKyAgfQorICBzdGF0aWMgQ2hpbGRFZGdlSXRlcmF0b3JUeXBlIGNoaWxkX2VkZ2VfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+ZW5kKCk7IH0KKworICBzdGF0aWMgTm9kZVJlZiBlZGdlX2Rlc3QoRWRnZVJlZiBFKSB7IHJldHVybiBFLnNlY29uZDsgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBHcmFwaFRyYWl0czxDYWxsR3JhcGggKj4gOiBwdWJsaWMgR3JhcGhUcmFpdHM8Q2FsbEdyYXBoTm9kZSAqPiB7CisgIHVzaW5nIFBhaXJUeSA9CisgICAgICBzdGQ6OnBhaXI8Y29uc3QgRnVuY3Rpb24gKmNvbnN0LCBzdGQ6OnVuaXF1ZV9wdHI8Q2FsbEdyYXBoTm9kZT4+OworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShDYWxsR3JhcGggKkNHTikgeworICAgIHJldHVybiBDR04tPmdldEV4dGVybmFsQ2FsbGluZ05vZGUoKTsgLy8gU3RhcnQgYXQgdGhlIGV4dGVybmFsIG5vZGUhCisgIH0KKworICBzdGF0aWMgQ2FsbEdyYXBoTm9kZSAqQ0dHZXRWYWx1ZVB0cihjb25zdCBQYWlyVHkgJlApIHsKKyAgICByZXR1cm4gUC5zZWNvbmQuZ2V0KCk7CisgIH0KKworICAvLyBub2Rlc19pdGVyYXRvci9iZWdpbi9lbmQgLSBBbGxvdyBpdGVyYXRpb24gb3ZlciBhbGwgbm9kZXMgaW4gdGhlIGdyYXBoCisgIHVzaW5nIG5vZGVzX2l0ZXJhdG9yID0KKyAgICAgIG1hcHBlZF9pdGVyYXRvcjxDYWxsR3JhcGg6Oml0ZXJhdG9yLCBkZWNsdHlwZSgmQ0dHZXRWYWx1ZVB0cik+OworCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihDYWxsR3JhcGggKkNHKSB7CisgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yKENHLT5iZWdpbigpLCAmQ0dHZXRWYWx1ZVB0cik7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKENhbGxHcmFwaCAqQ0cpIHsKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3IoQ0ctPmVuZCgpLCAmQ0dHZXRWYWx1ZVB0cik7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgR3JhcGhUcmFpdHM8Y29uc3QgQ2FsbEdyYXBoICo+IDogcHVibGljIEdyYXBoVHJhaXRzPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsR3JhcGhOb2RlICo+IHsKKyAgdXNpbmcgUGFpclR5ID0KKyAgICAgIHN0ZDo6cGFpcjxjb25zdCBGdW5jdGlvbiAqY29uc3QsIHN0ZDo6dW5pcXVlX3B0cjxDYWxsR3JhcGhOb2RlPj47CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKGNvbnN0IENhbGxHcmFwaCAqQ0dOKSB7CisgICAgcmV0dXJuIENHTi0+Z2V0RXh0ZXJuYWxDYWxsaW5nTm9kZSgpOyAvLyBTdGFydCBhdCB0aGUgZXh0ZXJuYWwgbm9kZSEKKyAgfQorCisgIHN0YXRpYyBjb25zdCBDYWxsR3JhcGhOb2RlICpDR0dldFZhbHVlUHRyKGNvbnN0IFBhaXJUeSAmUCkgeworICAgIHJldHVybiBQLnNlY29uZC5nZXQoKTsKKyAgfQorCisgIC8vIG5vZGVzX2l0ZXJhdG9yL2JlZ2luL2VuZCAtIEFsbG93IGl0ZXJhdGlvbiBvdmVyIGFsbCBub2RlcyBpbiB0aGUgZ3JhcGgKKyAgdXNpbmcgbm9kZXNfaXRlcmF0b3IgPQorICAgICAgbWFwcGVkX2l0ZXJhdG9yPENhbGxHcmFwaDo6Y29uc3RfaXRlcmF0b3IsIGRlY2x0eXBlKCZDR0dldFZhbHVlUHRyKT47CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKGNvbnN0IENhbGxHcmFwaCAqQ0cpIHsKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3IoQ0ctPmJlZ2luKCksICZDR0dldFZhbHVlUHRyKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoY29uc3QgQ2FsbEdyYXBoICpDRykgeworICAgIHJldHVybiBub2Rlc19pdGVyYXRvcihDRy0+ZW5kKCksICZDR0dldFZhbHVlUHRyKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfQ0FMTEdSQVBIX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoU0NDUGFzcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DYWxsR3JhcGhTQ0NQYXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNlNTQ2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoU0NDUGFzcy5oCkBAIC0wLDAgKzEsMTM3IEBACisvLz09PS0gQ2FsbEdyYXBoU0NDUGFzcy5oIC0gUGFzcyB0aGF0IG9wZXJhdGVzIEJVIG9uIGNhbGwgZ3JhcGggLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBDYWxsR3JhcGhTQ0NQYXNzIGNsYXNzLCB3aGljaCBpcyB1c2VkIGZvciBwYXNzZXMgd2hpY2gKKy8vIGFyZSBpbXBsZW1lbnRlZCBhcyBib3R0b20tdXAgdHJhdmVyc2FscyBvbiB0aGUgY2FsbCBncmFwaC4gIEJlY2F1c2UgdGhlcmUgbWF5CisvLyBiZSBjeWNsZXMgaW4gdGhlIGNhbGwgZ3JhcGgsIHBhc3NlcyBvZiB0aGlzIHR5cGUgb3BlcmF0ZSBvbiB0aGUgY2FsbC1ncmFwaCBpbgorLy8gU0NDIG9yZGVyOiB0aGF0IGlzLCB0aGV5IHByb2Nlc3MgZnVuY3Rpb24gYm90dG9tLXVwLCBleGNlcHQgZm9yIHJlY3Vyc2l2ZQorLy8gZnVuY3Rpb25zLCB3aGljaCB0aGV5IHByb2Nlc3MgYWxsIGF0IG9uY2UuCisvLworLy8gVGhlc2UgcGFzc2VzIGFyZSBpbmhlcmVudGx5IGludGVycHJvY2VkdXJhbCwgYW5kIGFyZSByZXF1aXJlZCB0byBrZWVwIHRoZQorLy8gY2FsbCBncmFwaCB1cC10by1kYXRlIGlmIHRoZXkgZG8gYW55dGhpbmcgd2hpY2ggY291bGQgbW9kaWZ5IGl0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19DQUxMR1JBUEhTQ0NQQVNTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19DQUxMR1JBUEhTQ0NQQVNTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIENhbGxHcmFwaDsKK2NsYXNzIENhbGxHcmFwaE5vZGU7CitjbGFzcyBDYWxsR3JhcGhTQ0M7CitjbGFzcyBQTVN0YWNrOworCitjbGFzcyBDYWxsR3JhcGhTQ0NQYXNzIDogcHVibGljIFBhc3MgeworcHVibGljOgorICBleHBsaWNpdCBDYWxsR3JhcGhTQ0NQYXNzKGNoYXIgJnBpZCkgOiBQYXNzKFBUX0NhbGxHcmFwaFNDQywgcGlkKSB7fQorCisgIC8vLyBjcmVhdGVQcmludGVyUGFzcyAtIEdldCBhIHBhc3MgdGhhdCBwcmludHMgdGhlIE1vZHVsZQorICAvLy8gY29ycmVzcG9uZGluZyB0byBhIENhbGxHcmFwaC4KKyAgUGFzcyAqY3JlYXRlUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQmFubmVyKSBjb25zdCBvdmVycmlkZTsKKworICB1c2luZyBsbHZtOjpQYXNzOjpkb0luaXRpYWxpemF0aW9uOworICB1c2luZyBsbHZtOjpQYXNzOjpkb0ZpbmFsaXphdGlvbjsKKworICAvLy8gZG9Jbml0aWFsaXphdGlvbiAtIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgdGhlIFNDQydzIG9mIHRoZSBwcm9ncmFtCisgIC8vLyBoYXMgYmVlbiBwcm9jZXNzZWQsIGFsbG93aW5nIHRoZSBwYXNzIHRvIGRvIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAgdmlydHVhbCBib29sIGRvSW5pdGlhbGl6YXRpb24oQ2FsbEdyYXBoICZDRykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBydW5PblNDQyAtIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgc3ViY2xhc3MgdG8gcGVyZm9ybQorICAvLy8gd2hhdGV2ZXIgYWN0aW9uIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHNwZWNpZmllZCBTQ0MuICBOb3RlIHRoYXQKKyAgLy8vIG5vbi1yZWN1cnNpdmUgKG9yIG9ubHkgc2VsZi1yZWN1cnNpdmUpIGZ1bmN0aW9ucyB3aWxsIGhhdmUgYW4gU0NDIHNpemUgb2YKKyAgLy8vIDEsIHdoZXJlIHJlY3Vyc2l2ZSBwb3J0aW9ucyBvZiB0aGUgY2FsbCBncmFwaCB3aWxsIGhhdmUgU0NDIHNpemUgPiAxLgorICAvLy8KKyAgLy8vIFNDQyBwYXNzZXMgdGhhdCBhZGQgb3IgZGVsZXRlIGZ1bmN0aW9ucyB0byB0aGUgU0NDIGFyZSByZXF1aXJlZCB0byB1cGRhdGUKKyAgLy8vIHRoZSBTQ0MgbGlzdCwgb3RoZXJ3aXNlIHN0YWxlIHBvaW50ZXJzIG1heSBiZSBkZXJlZmVyZW5jZWQuCisgIHZpcnR1YWwgYm9vbCBydW5PblNDQyhDYWxsR3JhcGhTQ0MgJlNDQykgPSAwOworCisgIC8vLyBkb0ZpbmFsaXphdGlvbiAtIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUgU0NDJ3Mgb2YgdGhlIHByb2dyYW0gaGFzCisgIC8vLyBiZWVuIHByb2Nlc3NlZCwgYWxsb3dpbmcgdGhlIHBhc3MgdG8gZG8gZmluYWwgY2xlYW51cCBhcyBuZWNlc3NhcnkuCisgIHZpcnR1YWwgYm9vbCBkb0ZpbmFsaXphdGlvbihDYWxsR3JhcGggJkNHKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIEFzc2lnbiBwYXNzIG1hbmFnZXIgdG8gbWFuYWdlciB0aGlzIHBhc3MKKyAgdm9pZCBhc3NpZ25QYXNzTWFuYWdlcihQTVN0YWNrICZQTVMsIFBhc3NNYW5hZ2VyVHlwZSBQTVQpIG92ZXJyaWRlOworCisgIC8vLyAgUmV0dXJuIHdoYXQga2luZCBvZiBQYXNzIE1hbmFnZXIgY2FuIG1hbmFnZSB0aGlzIHBhc3MuCisgIFBhc3NNYW5hZ2VyVHlwZSBnZXRQb3RlbnRpYWxQYXNzTWFuYWdlclR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFBNVF9DYWxsR3JhcGhQYXNzTWFuYWdlcjsKKyAgfQorCisgIC8vLyBnZXRBbmFseXNpc1VzYWdlIC0gRm9yIHRoaXMgY2xhc3MsIHdlIGRlY2xhcmUgdGhhdCB3ZSByZXF1aXJlIGFuZCBwcmVzZXJ2ZQorICAvLy8gdGhlIGNhbGwgZ3JhcGguICBJZiB0aGUgZGVyaXZlZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kLCBpdCBzaG91bGQKKyAgLy8vIGFsd2F5cyBleHBsaWNpdGx5IGNhbGwgdGhlIGltcGxlbWVudGF0aW9uIGhlcmUuCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZJbmZvKSBjb25zdCBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAvLy8gT3B0aW9uYWwgcGFzc2VzIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBjaGVjayB3aGV0aGVyIHRoZSBwYXNzIHNob3VsZCBiZQorICAvLy8gc2tpcHBlZC4gVGhpcyBpcyB0aGUgY2FzZSB3aGVuIG9wdGltaXphdGlvbiBiaXNlY3QgaXMgb3ZlciB0aGUgbGltaXQuCisgIGJvb2wgc2tpcFNDQyhDYWxsR3JhcGhTQ0MgJlNDQykgY29uc3Q7Cit9OworCisvLy8gQ2FsbEdyYXBoU0NDIC0gVGhpcyBpcyBhIHNpbmdsZSBTQ0MgdGhhdCBhIENhbGxHcmFwaFNDQ1Bhc3MgaXMgcnVuIG9uLgorY2xhc3MgQ2FsbEdyYXBoU0NDIHsKKyAgY29uc3QgQ2FsbEdyYXBoICZDRzsgLy8gVGhlIGNhbGwgZ3JhcGggZm9yIHRoaXMgU0NDLgorICB2b2lkICpDb250ZXh0OyAvLyBUaGUgQ0dQYXNzTWFuYWdlciBvYmplY3QgdGhhdCBpcyB2ZW5kaW5nIHRoaXMuCisgIHN0ZDo6dmVjdG9yPENhbGxHcmFwaE5vZGUgKj4gTm9kZXM7CisKK3B1YmxpYzoKKyAgQ2FsbEdyYXBoU0NDKENhbGxHcmFwaCAmY2csIHZvaWQgKmNvbnRleHQpIDogQ0coY2cpLCBDb250ZXh0KGNvbnRleHQpIHt9CisKKyAgdm9pZCBpbml0aWFsaXplKEFycmF5UmVmPENhbGxHcmFwaE5vZGUgKj4gTmV3Tm9kZXMpIHsKKyAgICBOb2Rlcy5hc3NpZ24oTmV3Tm9kZXMuYmVnaW4oKSwgTmV3Tm9kZXMuZW5kKCkpOworICB9CisKKyAgYm9vbCBpc1Npbmd1bGFyKCkgY29uc3QgeyByZXR1cm4gTm9kZXMuc2l6ZSgpID09IDE7IH0KKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE5vZGVzLnNpemUoKTsgfQorCisgIC8vLyBSZXBsYWNlTm9kZSAtIFRoaXMgaW5mb3JtcyB0aGUgU0NDIGFuZCB0aGUgcGFzcyBtYW5hZ2VyIHRoYXQgdGhlIHNwZWNpZmllZAorICAvLy8gT2xkIG5vZGUgaGFzIGJlZW4gZGVsZXRlZCwgYW5kIE5ldyBpcyB0byBiZSB1c2VkIGluIGl0cyBwbGFjZS4KKyAgdm9pZCBSZXBsYWNlTm9kZShDYWxsR3JhcGhOb2RlICpPbGQsIENhbGxHcmFwaE5vZGUgKk5ldyk7CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBzdGQ6OnZlY3RvcjxDYWxsR3JhcGhOb2RlICo+Ojpjb25zdF9pdGVyYXRvcjsKKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIE5vZGVzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gTm9kZXMuZW5kKCk7IH0KKworICBjb25zdCBDYWxsR3JhcGggJmdldENhbGxHcmFwaCgpIHsgcmV0dXJuIENHOyB9Cit9OworCit2b2lkIGluaXRpYWxpemVEdW1teUNHU0NDUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5ICYpOworCisvLy8gVGhpcyBwYXNzIGlzIHJlcXVpcmVkIGJ5IGludGVycHJvY2VkdXJhbCByZWdpc3RlciBhbGxvY2F0aW9uLiBJdCBmb3JjZXMKKy8vLyBjb2RlZ2VuIHRvIGZvbGxvdyBib3R0b20gdXAgb3JkZXIgb24gY2FsbCBncmFwaC4KK2NsYXNzIER1bW15Q0dTQ0NQYXNzIDogcHVibGljIENhbGxHcmFwaFNDQ1Bhc3MgeworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBEdW1teUNHU0NDUGFzcygpIDogQ2FsbEdyYXBoU0NDUGFzcyhJRCkgeworICAgIFBhc3NSZWdpc3RyeSAmUmVnaXN0cnkgPSAqUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKTsKKyAgICBpbml0aWFsaXplRHVtbXlDR1NDQ1Bhc3NQYXNzKFJlZ2lzdHJ5KTsKKyAgfQorCisgIGJvb2wgcnVuT25TQ0MoQ2FsbEdyYXBoU0NDICZTQ0MpIG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZSB7CisgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0NBTExHUkFQSFNDQ1BBU1NfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DYWxsUHJpbnRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DYWxsUHJpbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNjk3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NhbGxQcmludGVyLmgKQEAgLTAsMCArMSwyNyBAQAorLy89PT0tLSBDYWxsUHJpbnRlci5oIC0gQ2FsbCBncmFwaCBwcmludGVyIGV4dGVybmFsIGludGVyZmFjZSAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgZXh0ZXJuYWwgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIGNhbGxlZCB0byBleHBsaWNpdGx5CisvLyBpbnN0YW50aWF0ZSB0aGUgY2FsbCBncmFwaCBwcmludGVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19DQUxMUFJJTlRFUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQ0FMTFBSSU5URVJfSAorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZVBhc3M7CisKK01vZHVsZVBhc3MgKmNyZWF0ZUNhbGxHcmFwaFZpZXdlclBhc3MoKTsKK01vZHVsZVBhc3MgKmNyZWF0ZUNhbGxHcmFwaERPVFByaW50ZXJQYXNzKCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DYXB0dXJlVHJhY2tpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ2FwdHVyZVRyYWNraW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQyYzA5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ2FwdHVyZVRyYWNraW5nLmgKQEAgLTAsMCArMSw4MSBAQAorLy89PT0tLS0tLSBsbHZtL0FuYWx5c2lzL0NhcHR1cmVUcmFja2luZy5oIC0gUG9pbnRlciBjYXB0dXJlIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdGhhdCBoZWxwIGRldGVybWluZSB3aGljaCBwb2ludGVycyBhcmUgY2FwdHVyZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0NBUFRVUkVUUkFDS0lOR19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQ0FQVFVSRVRSQUNLSU5HX0gKKworbmFtZXNwYWNlIGxsdm0geworCisgIGNsYXNzIFZhbHVlOworICBjbGFzcyBVc2U7CisgIGNsYXNzIEluc3RydWN0aW9uOworICBjbGFzcyBEb21pbmF0b3JUcmVlOworICBjbGFzcyBPcmRlcmVkQmFzaWNCbG9jazsKKworICAvLy8gUG9pbnRlck1heUJlQ2FwdHVyZWQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHBvaW50ZXIgdmFsdWUgbWF5IGJlIGNhcHR1cmVkCisgIC8vLyBieSB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uICh3aGljaCBpcyByZXF1aXJlZCB0byBleGlzdCkuICBUaGlzIHJvdXRpbmUgY2FuCisgIC8vLyBiZSBleHBlbnNpdmUsIHNvIGNvbnNpZGVyIGNhY2hpbmcgdGhlIHJlc3VsdHMuICBUaGUgYm9vbGVhbiBSZXR1cm5DYXB0dXJlcworICAvLy8gc3BlY2lmaWVzIHdoZXRoZXIgcmV0dXJuaW5nIHRoZSB2YWx1ZSAob3IgcGFydCBvZiBpdCkgZnJvbSB0aGUgZnVuY3Rpb24KKyAgLy8vIGNvdW50cyBhcyBjYXB0dXJpbmcgaXQgb3Igbm90LiAgVGhlIGJvb2xlYW4gU3RvcmVDYXB0dXJlcyBzcGVjaWZpZWQKKyAgLy8vIHdoZXRoZXIgc3RvcmluZyB0aGUgdmFsdWUgKG9yIHBhcnQgb2YgaXQpIGludG8gbWVtb3J5IGFueXdoZXJlCisgIC8vLyBhdXRvbWF0aWNhbGx5IGNvdW50cyBhcyBjYXB0dXJpbmcgaXQgb3Igbm90LgorICBib29sIFBvaW50ZXJNYXlCZUNhcHR1cmVkKGNvbnN0IFZhbHVlICpWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmV0dXJuQ2FwdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTdG9yZUNhcHR1cmVzKTsKKworICAvLy8gUG9pbnRlck1heUJlQ2FwdHVyZWRCZWZvcmUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHBvaW50ZXIgdmFsdWUgbWF5IGJlCisgIC8vLyBjYXB0dXJlZCBieSB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uICh3aGljaCBpcyByZXF1aXJlZCB0byBleGlzdCkuIElmIGEKKyAgLy8vIERvbWluYXRvclRyZWUgaXMgcHJvdmlkZWQsIG9ubHkgY2FwdHVyZXMgd2hpY2ggaGFwcGVuIGJlZm9yZSB0aGUgZ2l2ZW4KKyAgLy8vIGluc3RydWN0aW9uIGFyZSBjb25zaWRlcmVkLiBUaGlzIHJvdXRpbmUgY2FuIGJlIGV4cGVuc2l2ZSwgc28gY29uc2lkZXIKKyAgLy8vIGNhY2hpbmcgdGhlIHJlc3VsdHMuICBUaGUgYm9vbGVhbiBSZXR1cm5DYXB0dXJlcyBzcGVjaWZpZXMgd2hldGhlcgorICAvLy8gcmV0dXJuaW5nIHRoZSB2YWx1ZSAob3IgcGFydCBvZiBpdCkgZnJvbSB0aGUgZnVuY3Rpb24gY291bnRzIGFzIGNhcHR1cmluZworICAvLy8gaXQgb3Igbm90LiAgVGhlIGJvb2xlYW4gU3RvcmVDYXB0dXJlcyBzcGVjaWZpZWQgd2hldGhlciBzdG9yaW5nIHRoZSB2YWx1ZQorICAvLy8gKG9yIHBhcnQgb2YgaXQpIGludG8gbWVtb3J5IGFueXdoZXJlIGF1dG9tYXRpY2FsbHkgY291bnRzIGFzIGNhcHR1cmluZyBpdAorICAvLy8gb3Igbm90LiBDYXB0dXJlcyBieSB0aGUgcHJvdmlkZWQgaW5zdHJ1Y3Rpb24gYXJlIGNvbnNpZGVyZWQgaWYgdGhlCisgIC8vLyBmaW5hbCBwYXJhbWV0ZXIgaXMgdHJ1ZS4gQW4gb3JkZXJlZCBiYXNpYyBibG9jayBpbiBccCBPQkIgY291bGQgYmUgdXNlZAorICAvLy8gdG8gc3BlZWQgdXAgY2FwdHVyZS10cmFja2VyIHF1ZXJpZXMuCisgIGJvb2wgUG9pbnRlck1heUJlQ2FwdHVyZWRCZWZvcmUoY29uc3QgVmFsdWUgKlYsIGJvb2wgUmV0dXJuQ2FwdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTdG9yZUNhcHR1cmVzLCBjb25zdCBJbnN0cnVjdGlvbiAqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICpEVCwgYm9vbCBJbmNsdWRlSSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yZGVyZWRCYXNpY0Jsb2NrICpPQkIgPSBudWxscHRyKTsKKworICAvLy8gVGhpcyBjYWxsYmFjayBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggUG9pbnRlck1heUJlQ2FwdHVyZWQuIEluCisgIC8vLyBhZGRpdGlvbiB0byB0aGUgaW50ZXJmYWNlIGhlcmUsIHlvdSdsbCBuZWVkIHRvIHByb3ZpZGUgeW91ciBvd24gZ2V0dGVycworICAvLy8gdG8gc2VlIHdoZXRoZXIgYW55dGhpbmcgd2FzIGNhcHR1cmVkLgorICBzdHJ1Y3QgQ2FwdHVyZVRyYWNrZXIgeworICAgIHZpcnR1YWwgfkNhcHR1cmVUcmFja2VyKCk7CisKKyAgICAvLy8gdG9vTWFueVVzZXMgLSBUaGUgZGVwdGggb2YgdHJhdmVyc2FsIGhhcyBicmVhY2hlZCBhIGxpbWl0LiBUaGVyZSBtYXkgYmUKKyAgICAvLy8gY2FwdHVyaW5nIGluc3RydWN0aW9ucyB0aGF0IHdpbGwgbm90IGJlIHBhc3NlZCBpbnRvIGNhcHR1cmVkKCkuCisgICAgdmlydHVhbCB2b2lkIHRvb01hbnlVc2VzKCkgPSAwOworCisgICAgLy8vIHNob3VsZEV4cGxvcmUgLSBUaGlzIGlzIHRoZSB1c2Ugb2YgYSB2YWx1ZSBkZXJpdmVkIGZyb20gdGhlIHBvaW50ZXIuCisgICAgLy8vIFRvIHBydW5lIHRoZSBzZWFyY2ggKGllLiwgYXNzdW1lIHRoYXQgbm9uZSBvZiBpdHMgdXNlcnMgY291bGQgcG9zc2libHkKKyAgICAvLy8gY2FwdHVyZSkgcmV0dXJuIGZhbHNlLiBUbyBzZWFyY2ggaXQsIHJldHVybiB0cnVlLgorICAgIC8vLworICAgIC8vLyBVLT5nZXRVc2VyKCkgaXMgYWx3YXlzIGFuIEluc3RydWN0aW9uLgorICAgIHZpcnR1YWwgYm9vbCBzaG91bGRFeHBsb3JlKGNvbnN0IFVzZSAqVSk7CisKKyAgICAvLy8gY2FwdHVyZWQgLSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcG9pbnRlciB3YXMgY2FwdHVyZWQgYnkgdGhlIHVzZXIgb2YKKyAgICAvLy8gdXNlIFUuIFJldHVybiB0cnVlIHRvIHN0b3AgdGhlIHRyYXZlcnNhbCBvciBmYWxzZSB0byBjb250aW51ZSBsb29raW5nCisgICAgLy8vIGZvciBtb3JlIGNhcHR1cmluZyBpbnN0cnVjdGlvbnMuCisgICAgdmlydHVhbCBib29sIGNhcHR1cmVkKGNvbnN0IFVzZSAqVSkgPSAwOworICB9OworCisgIC8vLyBQb2ludGVyTWF5QmVDYXB0dXJlZCAtIFZpc2l0IHRoZSB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBkZXJpdmVkIGZyb20gaXQgYW5kCisgIC8vLyBmaW5kIHZhbHVlcyB3aGljaCBhcHBlYXIgdG8gYmUgY2FwdHVyaW5nIHRoZSBwb2ludGVyIHZhbHVlLiBUaGlzIGZlZWRzCisgIC8vLyByZXN1bHRzIGludG8gYW5kIGlzIGNvbnRyb2xsZWQgYnkgdGhlIENhcHR1cmVUcmFja2VyIG9iamVjdC4KKyAgdm9pZCBQb2ludGVyTWF5QmVDYXB0dXJlZChjb25zdCBWYWx1ZSAqViwgQ2FwdHVyZVRyYWNrZXIgKlRyYWNrZXIpOworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NtcEluc3RBbmFseXNpcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DbXBJbnN0QW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2M2OWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DbXBJbnN0QW5hbHlzaXMuaApAQCAtMCwwICsxLDcyIEBACisvLz09PS0tIENtcEluc3RBbmFseXNpcy5oIC0gVXRpbHMgdG8gaGVscCBmb2xkIGNvbXBhcmUgaW5zdHMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBob2xkcyByb3V0aW5lcyB0byBoZWxwIGFuYWx5c2UgY29tcGFyZSBpbnN0cnVjdGlvbnMKKy8vIGFuZCBmb2xkIHRoZW0gaW50byBjb25zdGFudHMgb3Igb3RoZXIgY29tcGFyZSBpbnN0cnVjdGlvbnMKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfQ01QSU5TVEFOQUxZU0lTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19DTVBJTlNUQU5BTFlTSVNfSAorCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0clR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgSUNtcEluc3Q7CisgIGNsYXNzIFZhbHVlOworCisgIC8vLyBFbmNvZGUgYSBpY21wIHByZWRpY2F0ZSBpbnRvIGEgdGhyZWUgYml0IG1hc2suIFRoZXNlIGJpdHMgYXJlIGNhcmVmdWxseQorICAvLy8gYXJyYW5nZWQgdG8gYWxsb3cgZm9sZGluZyBvZiBleHByZXNzaW9ucyBzdWNoIGFzOgorICAvLy8KKyAgLy8vICAgICAgKEEgPCBCKSB8IChBID4gQikgLS0+IChBICE9IEIpCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgaXMgb25seSB2YWxpZCBpZiB0aGUgZmlyc3QgYW5kIHNlY29uZCBwcmVkaWNhdGVzIGhhdmUgdGhlCisgIC8vLyBzYW1lIHNpZ24uIEl0IGlzIGlsbGVnYWwgdG8gZG86IChBIHU8IEIpIHwgKEEgcz4gQikKKyAgLy8vCisgIC8vLyBUaHJlZSBiaXRzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29uZGl0aW9uLCBhcyBmb2xsb3dzOgorICAvLy8gICAwICBBID4gQgorICAvLy8gICAxICBBID09IEIKKyAgLy8vICAgMiAgQSA8IEIKKyAgLy8vCisgIC8vLyA8PT4gIFZhbHVlICBEZWZpbml0aW9uCisgIC8vLyAwMDAgICAgIDAgICBBbHdheXMgZmFsc2UKKyAgLy8vIDAwMSAgICAgMSAgIEEgPiAgQgorICAvLy8gMDEwICAgICAyICAgQSA9PSBCCisgIC8vLyAwMTEgICAgIDMgICBBID49IEIKKyAgLy8vIDEwMCAgICAgNCAgIEEgPCAgQgorICAvLy8gMTAxICAgICA1ICAgQSAhPSBCCisgIC8vLyAxMTAgICAgIDYgICBBIDw9IEIKKyAgLy8vIDExMSAgICAgNyAgIEFsd2F5cyB0cnVlCisgIC8vLworICB1bnNpZ25lZCBnZXRJQ21wQ29kZShjb25zdCBJQ21wSW5zdCAqSUNJLCBib29sIEludmVydFByZWQgPSBmYWxzZSk7CisKKyAgLy8vIFRoaXMgaXMgdGhlIGNvbXBsZW1lbnQgb2YgZ2V0SUNtcENvZGUsIHdoaWNoIHR1cm5zIGFuIG9wY29kZSBhbmQgdHdvCisgIC8vLyBvcGVyYW5kcyBpbnRvIGVpdGhlciBhIGNvbnN0YW50IHRydWUgb3IgZmFsc2UsIG9yIHRoZSBwcmVkaWNhdGUgZm9yIGEgbmV3CisgIC8vLyBJQ21wIGluc3RydWN0aW9uLiBUaGUgc2lnbiBpcyBwYXNzZWQgaW4gdG8gZGV0ZXJtaW5lIHdoaWNoIGtpbmQgb2YKKyAgLy8vIHByZWRpY2F0ZSB0byB1c2UgaW4gdGhlIG5ldyBpY21wIGluc3RydWN0aW9uLgorICAvLy8gTm9uLU5VTEwgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYSB0cnVlIG9yIGZhbHNlIGNvbnN0YW50LgorICAvLy8gTlVMTCByZXR1cm4gbWVhbnMgYSBuZXcgSUNtcCBpcyBuZWVkZWQuIFRoZSBwcmVkaWNhdGUgZm9yIHdoaWNoIGlzIG91dHB1dAorICAvLy8gaW4gTmV3SUNtcFByZWQuCisgIFZhbHVlICpnZXRJQ21wVmFsdWUoYm9vbCBTaWduLCB1bnNpZ25lZCBDb2RlLCBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgIENtcEluc3Q6OlByZWRpY2F0ZSAmTmV3SUNtcFByZWQpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBib3RoIHByZWRpY2F0ZXMgbWF0Y2ggc2lnbiBvciBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlbSBpcyBhbgorICAvLy8gZXF1YWxpdHkgY29tcGFyaXNvbiAod2hpY2ggaXMgc2lnbmxlc3MpLgorICBib29sIFByZWRpY2F0ZXNGb2xkYWJsZShDbXBJbnN0OjpQcmVkaWNhdGUgcDEsIENtcEluc3Q6OlByZWRpY2F0ZSBwMik7CisKKyAgLy8vIERlY29tcG9zZSBhbiBpY21wIGludG8gdGhlIGZvcm0gKChYICYgTWFzaykgcHJlZCAwKSBpZiBwb3NzaWJsZS4gVGhlCisgIC8vLyByZXR1cm5lZCBwcmVkaWNhdGUgaXMgZWl0aGVyID09IG9yICE9LiBSZXR1cm5zIGZhbHNlIGlmIGRlY29tcG9zaXRpb24KKyAgLy8vIGZhaWxzLgorICBib29sIGRlY29tcG9zZUJpdFRlc3RJQ21wKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIENtcEluc3Q6OlByZWRpY2F0ZSAmUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqJlgsIEFQSW50ICZNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTG9va1Rocm91Z2hUcnVuYyA9IHRydWUpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ29kZU1ldHJpY3MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ29kZU1ldHJpY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTg2MWFjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Db2RlTWV0cmljcy5oCkBAIC0wLDAgKzEsMTA1IEBACisvLz09PS0gQ29kZU1ldHJpY3MuaCAtIENvZGUgY29zdCBtZWFzdXJlbWVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHZhcmlvdXMgd2VpZ2h0IG1lYXN1cmVtZW50cyBmb3IgY29kZSwgaGVscGluZworLy8gdGhlIElubGluZXIgYW5kIG90aGVyIHBhc3NlcyBkZWNpZGUgd2hldGhlciB0byBkdXBsaWNhdGUgaXRzIGNvbnRlbnRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19DT0RFTUVUUklDU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQ09ERU1FVFJJQ1NfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQXNzdW1wdGlvbkNhY2hlOworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIExvb3A7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIFRhcmdldFRyYW5zZm9ybUluZm87CitjbGFzcyBWYWx1ZTsKKworLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIGEgY2FsbCB3aWxsIGxvd2VyIHRvIHNvbWV0aGluZyBzbWFsbC4KKy8vLworLy8vIFRoaXMgdGVzdHMgY2hlY2tzIHdoZXRoZXIgdGhpcyBjYWxsc2l0ZSB3aWxsIGxvd2VyIHRvIHNvbWV0aGluZworLy8vIHNpZ25pZmljYW50bHkgY2hlYXBlciB0aGFuIGEgdHJhZGl0aW9uYWwgY2FsbCwgb2Z0ZW4gYSBzaW5nbGUKKy8vLyBpbnN0cnVjdGlvbi4gTm90ZSB0aGF0IGlmIGlzSW5zdHJ1Y3Rpb25GcmVlKENTLmdldEluc3RydWN0aW9uKCkpIHdvdWxkCisvLy8gcmV0dXJuIHRydWUsIHNvIHdpbGwgdGhpcyBmdW5jdGlvbi4KK2Jvb2wgY2FsbElzU21hbGwoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MpOworCisvLy8gXGJyaWVmIFV0aWxpdHkgdG8gY2FsY3VsYXRlIHRoZSBzaXplIGFuZCBhIGZldyBzaW1pbGFyIG1ldHJpY3MgZm9yIGEgc2V0CisvLy8gb2YgYmFzaWMgYmxvY2tzLgorc3RydWN0IENvZGVNZXRyaWNzIHsKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgZnVuY3Rpb24gY29udGFpbnMgYSBjYWxsIHRvIHNldGptcCBvciBvdGhlciBmdW5jdGlvbnMKKyAgLy8vIHdpdGggYXR0cmlidXRlICJyZXR1cm5zIHR3aWNlIiB3aXRob3V0IGhhdmluZyB0aGUgYXR0cmlidXRlIGl0c2VsZi4KKyAgYm9vbCBleHBvc2VzUmV0dXJuc1R3aWNlID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgZnVuY3Rpb24gY2FsbHMgaXRzZWxmLgorICBib29sIGlzUmVjdXJzaXZlID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGR1cGxpY2F0ZWQuCisgIC8vLworICAvLy8gVHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGNvbnRhaW5zIG9uZSBvciBtb3JlIGluZGlyZWN0IGJyYW5jaGVzLCBvciBpdCBjb250YWlucworICAvLy8gb25lIG9yIG1vcmUgJ25vZHVwbGljYXRlJyBpbnN0cnVjdGlvbnMuCisgIGJvb2wgbm90RHVwbGljYXRhYmxlID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgZnVuY3Rpb24gY29udGFpbnMgYSBjYWxsIHRvIGEgY29udmVyZ2VudCBmdW5jdGlvbi4KKyAgYm9vbCBjb252ZXJnZW50ID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgZnVuY3Rpb24gY2FsbHMgYWxsb2NhIChpbiB0aGUgQyBzZW5zZSkuCisgIGJvb2wgdXNlc0R5bmFtaWNBbGxvY2EgPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIE51bWJlciBvZiBpbnN0cnVjdGlvbnMgaW4gdGhlIGFuYWx5emVkIGJsb2Nrcy4KKyAgdW5zaWduZWQgTnVtSW5zdHMgPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIE51bWJlciBvZiBhbmFseXplZCBibG9ja3MuCisgIHVuc2lnbmVkIE51bUJsb2NrcyA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgS2VlcHMgdHJhY2sgb2YgYmFzaWMgYmxvY2sgY29kZSBzaXplIGVzdGltYXRlcy4KKyAgRGVuc2VNYXA8Y29uc3QgQmFzaWNCbG9jayAqLCB1bnNpZ25lZD4gTnVtQkJJbnN0czsKKworICAvLy8gXGJyaWVmIEtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBjYWxscyB0byAnYmlnJyBmdW5jdGlvbnMuCisgIHVuc2lnbmVkIE51bUNhbGxzID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGNhbGxzIHRvIGludGVybmFsIGZ1bmN0aW9ucyB3aXRoIGEgc2luZ2xlIGNhbGxlci4KKyAgLy8vCisgIC8vLyBUaGVzZSBhcmUgbGlrZWx5IHRhcmdldHMgZm9yIGZ1dHVyZSBpbmxpbmluZywgbGlrZWx5IGV4cG9zZWQgYnkKKyAgLy8vIGludGVybGVhdmVkIGRldmlydHVhbGl6YXRpb24uCisgIHVuc2lnbmVkIE51bUlubGluZUNhbmRpZGF0ZXMgPSAwOworCisgIC8vLyBcYnJpZWYgSG93IG1hbnkgaW5zdHJ1Y3Rpb25zIHByb2R1Y2UgdmVjdG9yIHZhbHVlcy4KKyAgLy8vCisgIC8vLyBUaGUgaW5saW5lciBpcyBtb3JlIGFnZ3Jlc3NpdmUgd2l0aCBpbmxpbmluZyB2ZWN0b3Iga2VybmVscy4KKyAgdW5zaWduZWQgTnVtVmVjdG9ySW5zdHMgPSAwOworCisgIC8vLyBcYnJpZWYgSG93IG1hbnkgJ3JldCcgaW5zdHJ1Y3Rpb25zIHRoZSBibG9ja3MgY29udGFpbi4KKyAgdW5zaWduZWQgTnVtUmV0cyA9IDA7CisKKyAgLy8vIFxicmllZiBBZGQgaW5mb3JtYXRpb24gYWJvdXQgYSBibG9jayB0byB0aGUgY3VycmVudCBzdGF0ZS4KKyAgdm9pZCBhbmFseXplQmFzaWNCbG9jayhjb25zdCBCYXNpY0Jsb2NrICpCQiwgY29uc3QgVGFyZ2V0VHJhbnNmb3JtSW5mbyAmVFRJLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsUHRyU2V0SW1wbDxjb25zdCBWYWx1ZSo+ICZFcGhWYWx1ZXMpOworCisgIC8vLyBcYnJpZWYgQ29sbGVjdCBhIGxvb3AncyBlcGhlbWVyYWwgdmFsdWVzICh0aG9zZSB1c2VkIG9ubHkgYnkgYW4gYXNzdW1lCisgIC8vLyBvciBzaW1pbGFyIGludHJpbnNpY3MgaW4gdGhlIGxvb3ApLgorICBzdGF0aWMgdm9pZCBjb2xsZWN0RXBoZW1lcmFsVmFsdWVzKGNvbnN0IExvb3AgKkwsIEFzc3VtcHRpb25DYWNoZSAqQUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXRJbXBsPGNvbnN0IFZhbHVlICo+ICZFcGhWYWx1ZXMpOworCisgIC8vLyBcYnJpZWYgQ29sbGVjdCBhIGZ1bmN0aW9ucydzIGVwaGVtZXJhbCB2YWx1ZXMgKHRob3NlIHVzZWQgb25seSBieSBhbgorICAvLy8gYXNzdW1lIG9yIHNpbWlsYXIgaW50cmluc2ljcyBpbiB0aGUgZnVuY3Rpb24pLgorICBzdGF0aWMgdm9pZCBjb2xsZWN0RXBoZW1lcmFsVmFsdWVzKGNvbnN0IEZ1bmN0aW9uICpMLCBBc3N1bXB0aW9uQ2FjaGUgKkFDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0SW1wbDxjb25zdCBWYWx1ZSAqPiAmRXBoVmFsdWVzKTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NvbnN0YW50Rm9sZGluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Db25zdGFudEZvbGRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTRiNTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Db25zdGFudEZvbGRpbmcuaApAQCAtMCwwICsxLDE2MSBAQAorLy89PT0tLSBDb25zdGFudEZvbGRpbmcuaCAtIEZvbGQgaW5zdHJ1Y3Rpb25zIGludG8gY29uc3RhbnRzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgcm91dGluZXMgZm9yIGZvbGRpbmcgaW5zdHJ1Y3Rpb25zIGludG8gY29uc3RhbnRzIHdoZW4gYWxsCisvLyBvcGVyYW5kcyBhcmUgY29uc3RhbnRzLCBmb3IgZXhhbXBsZSAic3ViIGkzMiAxLCAwIiAtPiAiMSIuCisvLworLy8gQWxzbywgdG8gc3VwcGxlbWVudCB0aGUgYmFzaWMgVk1Db3JlIENvbnN0YW50RXhwciBzaW1wbGlmaWNhdGlvbnMsCisvLyB0aGlzIGZpbGUgZGVjbGFyZXMgc29tZSBhZGRpdGlvbmFsIGZvbGRpbmcgcm91dGluZXMgdGhhdCBjYW4gbWFrZSB1c2Ugb2YKKy8vIERhdGFMYXlvdXQgaW5mb3JtYXRpb24uIFRoZXNlIGZ1bmN0aW9ucyBjYW5ub3QgZ28gaW4gVk1Db3JlIGR1ZSB0byBsaWJyYXJ5CisvLyBkZXBlbmRlbmN5IGlzc3Vlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfQ09OU1RBTlRGT0xESU5HX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19DT05TVEFOVEZPTERJTkdfSAorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBBUEludDsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKK2NsYXNzIENhbGxTaXRlOworY2xhc3MgQ29uc3RhbnQ7CitjbGFzcyBDb25zdGFudEV4cHI7CitjbGFzcyBDb25zdGFudFZlY3RvcjsKK2NsYXNzIERhdGFMYXlvdXQ7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEdsb2JhbFZhbHVlOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBJbW11dGFibGVDYWxsU2l0ZTsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworY2xhc3MgVHlwZTsKKworLy8vIElmIHRoaXMgY29uc3RhbnQgaXMgYSBjb25zdGFudCBvZmZzZXQgZnJvbSBhIGdsb2JhbCwgcmV0dXJuIHRoZSBnbG9iYWwgYW5kCisvLy8gdGhlIGNvbnN0YW50LiBCZWNhdXNlIG9mIGNvbnN0YW50ZXhwcnMsIHRoaXMgZnVuY3Rpb24gaXMgcmVjdXJzaXZlLgorYm9vbCBJc0NvbnN0YW50T2Zmc2V0RnJvbUdsb2JhbChDb25zdGFudCAqQywgR2xvYmFsVmFsdWUgKiZHViwgQVBJbnQgJk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpOworCisvLy8gQ29uc3RhbnRGb2xkSW5zdHJ1Y3Rpb24gLSBUcnkgdG8gY29uc3RhbnQgZm9sZCB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLgorLy8vIElmIHN1Y2Nlc3NmdWwsIHRoZSBjb25zdGFudCByZXN1bHQgaXMgcmV0dXJuZWQsIGlmIG5vdCwgbnVsbCBpcyByZXR1cm5lZC4KKy8vLyBOb3RlIHRoYXQgdGhpcyBmYWlscyBpZiBub3QgYWxsIG9mIHRoZSBvcGVyYW5kcyBhcmUgY29uc3RhbnQuICBPdGhlcndpc2UsCisvLy8gdGhpcyBmdW5jdGlvbiBjYW4gb25seSBmYWlsIHdoZW4gYXR0ZW1wdGluZyB0byBmb2xkIGluc3RydWN0aW9ucyBsaWtlIGxvYWRzCisvLy8gYW5kIHN0b3Jlcywgd2hpY2ggaGF2ZSBubyBjb25zdGFudCBleHByZXNzaW9uIGZvcm0uCitDb25zdGFudCAqQ29uc3RhbnRGb2xkSW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gKkksIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkgPSBudWxscHRyKTsKKworLy8vIENvbnN0YW50Rm9sZENvbnN0YW50IC0gQXR0ZW1wdCB0byBmb2xkIHRoZSBjb25zdGFudCB1c2luZyB0aGUKKy8vLyBzcGVjaWZpZWQgRGF0YUxheW91dC4KKy8vLyBJZiBzdWNjZXNzZnVsLCB0aGUgY29uc3RhbnQgcmVzdWx0IGlzIHJldHVybmVkLCBpZiBub3QsIG51bGwgaXMgcmV0dXJuZWQuCitDb25zdGFudCAqQ29uc3RhbnRGb2xkQ29uc3RhbnQoY29uc3QgQ29uc3RhbnQgKkMsIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkgPSBudWxscHRyKTsKKworLy8vIENvbnN0YW50Rm9sZEluc3RPcGVyYW5kcyAtIEF0dGVtcHQgdG8gY29uc3RhbnQgZm9sZCBhbiBpbnN0cnVjdGlvbiB3aXRoIHRoZQorLy8vIHNwZWNpZmllZCBvcGVyYW5kcy4gIElmIHN1Y2Nlc3NmdWwsIHRoZSBjb25zdGFudCByZXN1bHQgaXMgcmV0dXJuZWQsIGlmIG5vdCwKKy8vLyBudWxsIGlzIHJldHVybmVkLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuIGZhaWwgd2hlbiBhdHRlbXB0aW5nIHRvCisvLy8gZm9sZCBpbnN0cnVjdGlvbnMgbGlrZSBsb2FkcyBhbmQgc3RvcmVzLCB3aGljaCBoYXZlIG5vIGNvbnN0YW50IGV4cHJlc3Npb24KKy8vLyBmb3JtLgorLy8vCitDb25zdGFudCAqQ29uc3RhbnRGb2xkSW5zdE9wZXJhbmRzKEluc3RydWN0aW9uICpJLCBBcnJheVJlZjxDb25zdGFudCAqPiBPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJID0gbnVsbHB0cik7CisKKy8vLyBDb25zdGFudEZvbGRDb21wYXJlSW5zdE9wZXJhbmRzIC0gQXR0ZW1wdCB0byBjb25zdGFudCBmb2xkIGEgY29tcGFyZQorLy8vIGluc3RydWN0aW9uIChpY21wL2ZjbXApIHdpdGggdGhlIHNwZWNpZmllZCBvcGVyYW5kcy4gIElmIGl0IGZhaWxzLCBpdAorLy8vIHJldHVybnMgYSBjb25zdGFudCBleHByZXNzaW9uIG9mIHRoZSBzcGVjaWZpZWQgb3BlcmFuZHMuCisvLy8KK0NvbnN0YW50ICoKK0NvbnN0YW50Rm9sZENvbXBhcmVJbnN0T3BlcmFuZHModW5zaWduZWQgUHJlZGljYXRlLCBDb25zdGFudCAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqUkhTLCBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSA9IG51bGxwdHIpOworCisvLy8gXGJyaWVmIEF0dGVtcHQgdG8gY29uc3RhbnQgZm9sZCBhIGJpbmFyeSBvcGVyYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkCisvLy8gb3BlcmFuZHMuICBJZiBpdCBmYWlscywgaXQgcmV0dXJucyBhIGNvbnN0YW50IGV4cHJlc3Npb24gb2YgdGhlIHNwZWNpZmllZAorLy8vIG9wZXJhbmRzLgorQ29uc3RhbnQgKkNvbnN0YW50Rm9sZEJpbmFyeU9wT3BlcmFuZHModW5zaWduZWQgT3Bjb2RlLCBDb25zdGFudCAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKlJIUywgY29uc3QgRGF0YUxheW91dCAmREwpOworCisvLy8gXGJyaWVmIEF0dGVtcHQgdG8gY29uc3RhbnQgZm9sZCBhIHNlbGVjdCBpbnN0cnVjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQKKy8vLyBvcGVyYW5kcy4gVGhlIGNvbnN0YW50IHJlc3VsdCBpcyByZXR1cm5lZCBpZiBzdWNjZXNzZnVsOyBpZiBub3QsIG51bGwgaXMKKy8vLyByZXR1cm5lZC4KK0NvbnN0YW50ICpDb25zdGFudEZvbGRTZWxlY3RJbnN0cnVjdGlvbihDb25zdGFudCAqQ29uZCwgQ29uc3RhbnQgKlYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpWMik7CisKKy8vLyBcYnJpZWYgQXR0ZW1wdCB0byBjb25zdGFudCBmb2xkIGEgY2FzdCB3aXRoIHRoZSBzcGVjaWZpZWQgb3BlcmFuZC4gIElmIGl0CisvLy8gZmFpbHMsIGl0IHJldHVybnMgYSBjb25zdGFudCBleHByZXNzaW9uIG9mIHRoZSBzcGVjaWZpZWQgb3BlcmFuZC4KK0NvbnN0YW50ICpDb25zdGFudEZvbGRDYXN0T3BlcmFuZCh1bnNpZ25lZCBPcGNvZGUsIENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpOworCisvLy8gQ29uc3RhbnRGb2xkSW5zZXJ0VmFsdWVJbnN0cnVjdGlvbiAtIEF0dGVtcHQgdG8gY29uc3RhbnQgZm9sZCBhbiBpbnNlcnR2YWx1ZQorLy8vIGluc3RydWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBvcGVyYW5kcyBhbmQgaW5kaWNlcy4gIFRoZSBjb25zdGFudCByZXN1bHQgaXMKKy8vLyByZXR1cm5lZCBpZiBzdWNjZXNzZnVsOyBpZiBub3QsIG51bGwgaXMgcmV0dXJuZWQuCitDb25zdGFudCAqQ29uc3RhbnRGb2xkSW5zZXJ0VmFsdWVJbnN0cnVjdGlvbihDb25zdGFudCAqQWdnLCBDb25zdGFudCAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMpOworCisvLy8gXGJyaWVmIEF0dGVtcHQgdG8gY29uc3RhbnQgZm9sZCBhbiBleHRyYWN0dmFsdWUgaW5zdHJ1Y3Rpb24gd2l0aCB0aGUKKy8vLyBzcGVjaWZpZWQgb3BlcmFuZHMgYW5kIGluZGljZXMuICBUaGUgY29uc3RhbnQgcmVzdWx0IGlzIHJldHVybmVkIGlmCisvLy8gc3VjY2Vzc2Z1bDsgaWYgbm90LCBudWxsIGlzIHJldHVybmVkLgorQ29uc3RhbnQgKkNvbnN0YW50Rm9sZEV4dHJhY3RWYWx1ZUluc3RydWN0aW9uKENvbnN0YW50ICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMpOworCisvLy8gXGJyaWVmIEF0dGVtcHQgdG8gY29uc3RhbnQgZm9sZCBhbiBpbnNlcnRlbGVtZW50IGluc3RydWN0aW9uIHdpdGggdGhlCisvLy8gc3BlY2lmaWVkIG9wZXJhbmRzIGFuZCBpbmRpY2VzLiAgVGhlIGNvbnN0YW50IHJlc3VsdCBpcyByZXR1cm5lZCBpZgorLy8vIHN1Y2Nlc3NmdWw7IGlmIG5vdCwgbnVsbCBpcyByZXR1cm5lZC4KK0NvbnN0YW50ICpDb25zdGFudEZvbGRJbnNlcnRFbGVtZW50SW5zdHJ1Y3Rpb24oQ29uc3RhbnQgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKkVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKklkeCk7CisKKy8vLyBcYnJpZWYgQXR0ZW1wdCB0byBjb25zdGFudCBmb2xkIGFuIGV4dHJhY3RlbGVtZW50IGluc3RydWN0aW9uIHdpdGggdGhlCisvLy8gc3BlY2lmaWVkIG9wZXJhbmRzIGFuZCBpbmRpY2VzLiAgVGhlIGNvbnN0YW50IHJlc3VsdCBpcyByZXR1cm5lZCBpZgorLy8vIHN1Y2Nlc3NmdWw7IGlmIG5vdCwgbnVsbCBpcyByZXR1cm5lZC4KK0NvbnN0YW50ICpDb25zdGFudEZvbGRFeHRyYWN0RWxlbWVudEluc3RydWN0aW9uKENvbnN0YW50ICpWYWwsIENvbnN0YW50ICpJZHgpOworCisvLy8gXGJyaWVmIEF0dGVtcHQgdG8gY29uc3RhbnQgZm9sZCBhIHNodWZmbGV2ZWN0b3IgaW5zdHJ1Y3Rpb24gd2l0aCB0aGUKKy8vLyBzcGVjaWZpZWQgb3BlcmFuZHMgYW5kIGluZGljZXMuICBUaGUgY29uc3RhbnQgcmVzdWx0IGlzIHJldHVybmVkIGlmCisvLy8gc3VjY2Vzc2Z1bDsgaWYgbm90LCBudWxsIGlzIHJldHVybmVkLgorQ29uc3RhbnQgKkNvbnN0YW50Rm9sZFNodWZmbGVWZWN0b3JJbnN0cnVjdGlvbihDb25zdGFudCAqVjEsIENvbnN0YW50ICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKk1hc2spOworCisvLy8gQ29uc3RhbnRGb2xkTG9hZEZyb21Db25zdFB0ciAtIFJldHVybiB0aGUgdmFsdWUgdGhhdCBhIGxvYWQgZnJvbSBDIHdvdWxkCisvLy8gcHJvZHVjZSBpZiBpdCBpcyBjb25zdGFudCBhbmQgZGV0ZXJtaW5hYmxlLiAgSWYgdGhpcyBpcyBub3QgZGV0ZXJtaW5hYmxlLAorLy8vIHJldHVybiBudWxsLgorQ29uc3RhbnQgKkNvbnN0YW50Rm9sZExvYWRGcm9tQ29uc3RQdHIoQ29uc3RhbnQgKkMsIFR5cGUgKlR5LCBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisKKy8vLyBDb25zdGFudEZvbGRMb2FkVGhyb3VnaEdFUENvbnN0YW50RXhwciAtIEdpdmVuIGEgY29uc3RhbnQgYW5kIGEKKy8vLyBnZXRlbGVtZW50cHRyIGNvbnN0YW50ZXhwciwgcmV0dXJuIHRoZSBjb25zdGFudCB2YWx1ZSBiZWluZyBhZGRyZXNzZWQgYnkgdGhlCisvLy8gY29uc3RhbnQgZXhwcmVzc2lvbiwgb3IgbnVsbCBpZiBzb21ldGhpbmcgaXMgZnVubnkgYW5kIHdlIGNhbid0IGRlY2lkZS4KK0NvbnN0YW50ICpDb25zdGFudEZvbGRMb2FkVGhyb3VnaEdFUENvbnN0YW50RXhwcihDb25zdGFudCAqQywgQ29uc3RhbnRFeHByICpDRSk7CisKKy8vLyBDb25zdGFudEZvbGRMb2FkVGhyb3VnaEdFUEluZGljZXMgLSBHaXZlbiBhIGNvbnN0YW50IGFuZCBnZXRlbGVtZW50cHRyCisvLy8gaW5kaWNlcyAod2l0aCBhbiAqaW1wbGllZCogemVybyBwb2ludGVyIGluZGV4IHRoYXQgaXMgbm90IGluIHRoZSBsaXN0KSwKKy8vLyByZXR1cm4gdGhlIGNvbnN0YW50IHZhbHVlIGJlaW5nIGFkZHJlc3NlZCBieSBhIHZpcnR1YWwgbG9hZCwgb3IgbnVsbCBpZgorLy8vIHNvbWV0aGluZyBpcyBmdW5ueSBhbmQgd2UgY2FuJ3QgZGVjaWRlLgorQ29uc3RhbnQgKkNvbnN0YW50Rm9sZExvYWRUaHJvdWdoR0VQSW5kaWNlcyhDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q29uc3RhbnQgKj4gSW5kaWNlcyk7CisKKy8vLyBjYW5Db25zdGFudEZvbGRDYWxsVG8gLSBSZXR1cm4gdHJ1ZSBpZiBpdHMgZXZlbiBwb3NzaWJsZSB0byBmb2xkIGEgY2FsbCB0bworLy8vIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24uCitib29sIGNhbkNvbnN0YW50Rm9sZENhbGxUbyhJbW11dGFibGVDYWxsU2l0ZSBDUywgY29uc3QgRnVuY3Rpb24gKkYpOworCisvLy8gQ29uc3RhbnRGb2xkQ2FsbCAtIEF0dGVtcHQgdG8gY29uc3RhbnQgZm9sZCBhIGNhbGwgdG8gdGhlIHNwZWNpZmllZCBmdW5jdGlvbgorLy8vIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMsIHJldHVybmluZyBudWxsIGlmIHVuc3VjY2Vzc2Z1bC4KK0NvbnN0YW50ICpDb25zdGFudEZvbGRDYWxsKEltbXV0YWJsZUNhbGxTaXRlIENTLCBGdW5jdGlvbiAqRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENvbnN0YW50ICo+IE9wZXJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSA9IG51bGxwdHIpOworCisvLy8gQ29uc3RhbnRGb2xkTG9hZFRocm91Z2hCaXRjYXN0IC0gdHJ5IHRvIGNhc3QgY29uc3RhbnQgdG8gZGVzdGluYXRpb24gdHlwZQorLy8vIHJldHVybmluZyBudWxsIGlmIHVuc3VjY2Vzc2Z1bC4gQ2FuIGNhc3QgcG9pbnRlciB0byBwb2ludGVyIG9yIHBvaW50ZXIgdG8KKy8vLyBpbnRlZ2VyIGFuZCB2aWNlIHZlcnNhIGlmIHRoZWlyIHNpemVzIGFyZSBlcXVhbC4KK0NvbnN0YW50ICpDb25zdGFudEZvbGRMb2FkVGhyb3VnaEJpdGNhc3QoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpOworCisvLy8gXGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNhbGwgaGFzIG5vIHNpZGUtZWZmZWN0cy4KKy8vLyBTcGVjaWZpY2FsbHkgY2hlY2tzIGZvciBtYXRoIHJvdXRpbWVzIHdoaWNoIHNvbWV0aW1lcyBzZXQgZXJybm8uCitib29sIGlzTWF0aExpYkNhbGxOb29wKENhbGxTaXRlIENTLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0RPVEdyYXBoVHJhaXRzUGFzcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9ET1RHcmFwaFRyYWl0c1Bhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWY5YzM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9ET1RHcmFwaFRyYWl0c1Bhc3MuaApAQCAtMCwwICsxLDE4OSBAQAorLy89PT0tLSBET1RHcmFwaFRyYWl0c1Bhc3MuaCAtIFByaW50L1ZpZXcgZG90dHkgZ3JhcGhzLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUZW1wbGF0ZXMgdG8gY3JlYXRlIGRvdHR5IHZpZXdlciBhbmQgcHJpbnRlciBwYXNzZXMgZm9yIEdyYXBoVHJhaXRzIGdyYXBocy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfRE9UR1JBUEhUUkFJVFNQQVNTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19ET1RHUkFQSFRSQUlUU1BBU1NfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9DRkdQcmludGVyLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0ZpbGVTeXN0ZW0uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gXGJyaWVmIERlZmF1bHQgdHJhaXRzIGNsYXNzIGZvciBleHRyYWN0aW5nIGEgZ3JhcGggZnJvbSBhbiBhbmFseXNpcyBwYXNzLgorLy8vCisvLy8gVGhpcyBhc3N1bWVzIHRoYXQgJ0dyYXBoVCcgaXMgJ0FuYWx5c2lzVCAqJyBhbmQgc28ganVzdCBwYXNzZXMgaXQgdGhyb3VnaC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBBbmFseXNpc1QsIHR5cGVuYW1lIEdyYXBoVCA9IEFuYWx5c2lzVCAqPgorc3RydWN0IERlZmF1bHRBbmFseXNpc0dyYXBoVHJhaXRzIHsKKyAgc3RhdGljIEdyYXBoVCBnZXRHcmFwaChBbmFseXNpc1QgKkEpIHsgcmV0dXJuIEE7IH0KK307CisKK3RlbXBsYXRlIDwKKyAgICB0eXBlbmFtZSBBbmFseXNpc1QsIGJvb2wgSXNTaW1wbGUsIHR5cGVuYW1lIEdyYXBoVCA9IEFuYWx5c2lzVCAqLAorICAgIHR5cGVuYW1lIEFuYWx5c2lzR3JhcGhUcmFpdHNUID0gRGVmYXVsdEFuYWx5c2lzR3JhcGhUcmFpdHM8QW5hbHlzaXNULCBHcmFwaFQ+ID4KK2NsYXNzIERPVEdyYXBoVHJhaXRzVmlld2VyIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CitwdWJsaWM6CisgIERPVEdyYXBoVHJhaXRzVmlld2VyKFN0cmluZ1JlZiBHcmFwaE5hbWUsIGNoYXIgJklEKQorICAgICAgOiBGdW5jdGlvblBhc3MoSUQpLCBOYW1lKEdyYXBoTmFtZSkge30KKworICAvLy8gQGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHByb2Nlc3NlZC4KKyAgLy8vCisgIC8vLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzIG15IG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gaW5kaWNhdGUgdGhhdAorICAvLy8gb25seSBjZXJ0YWluIGZ1bmN0aW9ucyBzaG91bGQgYmUgdmlld2VkLgorICAvLy8KKyAgLy8vIEBwYXJhbSBBbmFseXNpcyBUaGUgY3VycmVudCBhbmFseXNpcyByZXN1bHQgZm9yIHRoaXMgZnVuY3Rpb24uCisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzRnVuY3Rpb24oRnVuY3Rpb24gJkYsIEFuYWx5c2lzVCAmQW5hbHlzaXMpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGUgeworICAgIGF1dG8gJkFuYWx5c2lzID0gZ2V0QW5hbHlzaXM8QW5hbHlzaXNUPigpOworCisgICAgaWYgKCFwcm9jZXNzRnVuY3Rpb24oRiwgQW5hbHlzaXMpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgR3JhcGhUIEdyYXBoID0gQW5hbHlzaXNHcmFwaFRyYWl0c1Q6OmdldEdyYXBoKCZBbmFseXNpcyk7CisgICAgc3RkOjpzdHJpbmcgR3JhcGhOYW1lID0gRE9UR3JhcGhUcmFpdHM8R3JhcGhUPjo6Z2V0R3JhcGhOYW1lKEdyYXBoKTsKKyAgICBzdGQ6OnN0cmluZyBUaXRsZSA9IEdyYXBoTmFtZSArICIgZm9yICciICsgRi5nZXROYW1lKCkuc3RyKCkgKyAiJyBmdW5jdGlvbiI7CisKKyAgICBWaWV3R3JhcGgoR3JhcGgsIE5hbWUsIElzU2ltcGxlLCBUaXRsZSk7CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgICBBVS5hZGRSZXF1aXJlZDxBbmFseXNpc1Q+KCk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgTmFtZTsKK307CisKK3RlbXBsYXRlIDwKKyAgICB0eXBlbmFtZSBBbmFseXNpc1QsIGJvb2wgSXNTaW1wbGUsIHR5cGVuYW1lIEdyYXBoVCA9IEFuYWx5c2lzVCAqLAorICAgIHR5cGVuYW1lIEFuYWx5c2lzR3JhcGhUcmFpdHNUID0gRGVmYXVsdEFuYWx5c2lzR3JhcGhUcmFpdHM8QW5hbHlzaXNULCBHcmFwaFQ+ID4KK2NsYXNzIERPVEdyYXBoVHJhaXRzUHJpbnRlciA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworcHVibGljOgorICBET1RHcmFwaFRyYWl0c1ByaW50ZXIoU3RyaW5nUmVmIEdyYXBoTmFtZSwgY2hhciAmSUQpCisgICAgICA6IEZ1bmN0aW9uUGFzcyhJRCksIE5hbWUoR3JhcGhOYW1lKSB7fQorCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcHJvY2Vzc2VkLgorICAvLy8KKyAgLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MgbXkgb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiB0byBpbmRpY2F0ZSB0aGF0CisgIC8vLyBvbmx5IGNlcnRhaW4gZnVuY3Rpb25zIHNob3VsZCBiZSBwcmludGVkLgorICAvLy8KKyAgLy8vIEBwYXJhbSBBbmFseXNpcyBUaGUgY3VycmVudCBhbmFseXNpcyByZXN1bHQgZm9yIHRoaXMgZnVuY3Rpb24uCisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzRnVuY3Rpb24oRnVuY3Rpb24gJkYsIEFuYWx5c2lzVCAmQW5hbHlzaXMpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGUgeworICAgIGF1dG8gJkFuYWx5c2lzID0gZ2V0QW5hbHlzaXM8QW5hbHlzaXNUPigpOworCisgICAgaWYgKCFwcm9jZXNzRnVuY3Rpb24oRiwgQW5hbHlzaXMpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgR3JhcGhUIEdyYXBoID0gQW5hbHlzaXNHcmFwaFRyYWl0c1Q6OmdldEdyYXBoKCZBbmFseXNpcyk7CisgICAgc3RkOjpzdHJpbmcgRmlsZW5hbWUgPSBOYW1lICsgIi4iICsgRi5nZXROYW1lKCkuc3RyKCkgKyAiLmRvdCI7CisgICAgc3RkOjplcnJvcl9jb2RlIEVDOworCisgICAgZXJycygpIDw8ICJXcml0aW5nICciIDw8IEZpbGVuYW1lIDw8ICInLi4uIjsKKworICAgIHJhd19mZF9vc3RyZWFtIEZpbGUoRmlsZW5hbWUsIEVDLCBzeXM6OmZzOjpGX1RleHQpOworICAgIHN0ZDo6c3RyaW5nIEdyYXBoTmFtZSA9IERPVEdyYXBoVHJhaXRzPEdyYXBoVD46OmdldEdyYXBoTmFtZShHcmFwaCk7CisgICAgc3RkOjpzdHJpbmcgVGl0bGUgPSBHcmFwaE5hbWUgKyAiIGZvciAnIiArIEYuZ2V0TmFtZSgpLnN0cigpICsgIicgZnVuY3Rpb24iOworCisgICAgaWYgKCFFQykKKyAgICAgIFdyaXRlR3JhcGgoRmlsZSwgR3JhcGgsIElzU2ltcGxlLCBUaXRsZSk7CisgICAgZWxzZQorICAgICAgZXJycygpIDw8ICIgIGVycm9yIG9wZW5pbmcgZmlsZSBmb3Igd3JpdGluZyEiOworICAgIGVycnMoKSA8PCAiXG4iOworCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZSB7CisgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgICAgQVUuYWRkUmVxdWlyZWQ8QW5hbHlzaXNUPigpOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIE5hbWU7Cit9OworCit0ZW1wbGF0ZSA8CisgICAgdHlwZW5hbWUgQW5hbHlzaXNULCBib29sIElzU2ltcGxlLCB0eXBlbmFtZSBHcmFwaFQgPSBBbmFseXNpc1QgKiwKKyAgICB0eXBlbmFtZSBBbmFseXNpc0dyYXBoVHJhaXRzVCA9IERlZmF1bHRBbmFseXNpc0dyYXBoVHJhaXRzPEFuYWx5c2lzVCwgR3JhcGhUPiA+CitjbGFzcyBET1RHcmFwaFRyYWl0c01vZHVsZVZpZXdlciA6IHB1YmxpYyBNb2R1bGVQYXNzIHsKK3B1YmxpYzoKKyAgRE9UR3JhcGhUcmFpdHNNb2R1bGVWaWV3ZXIoU3RyaW5nUmVmIEdyYXBoTmFtZSwgY2hhciAmSUQpCisgICAgICA6IE1vZHVsZVBhc3MoSUQpLCBOYW1lKEdyYXBoTmFtZSkge30KKworICBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgb3ZlcnJpZGUgeworICAgIEdyYXBoVCBHcmFwaCA9IEFuYWx5c2lzR3JhcGhUcmFpdHNUOjpnZXRHcmFwaCgmZ2V0QW5hbHlzaXM8QW5hbHlzaXNUPigpKTsKKyAgICBzdGQ6OnN0cmluZyBUaXRsZSA9IERPVEdyYXBoVHJhaXRzPEdyYXBoVD46OmdldEdyYXBoTmFtZShHcmFwaCk7CisKKyAgICBWaWV3R3JhcGgoR3JhcGgsIE5hbWUsIElzU2ltcGxlLCBUaXRsZSk7CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgICBBVS5hZGRSZXF1aXJlZDxBbmFseXNpc1Q+KCk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgTmFtZTsKK307CisKK3RlbXBsYXRlIDwKKyAgICB0eXBlbmFtZSBBbmFseXNpc1QsIGJvb2wgSXNTaW1wbGUsIHR5cGVuYW1lIEdyYXBoVCA9IEFuYWx5c2lzVCAqLAorICAgIHR5cGVuYW1lIEFuYWx5c2lzR3JhcGhUcmFpdHNUID0gRGVmYXVsdEFuYWx5c2lzR3JhcGhUcmFpdHM8QW5hbHlzaXNULCBHcmFwaFQ+ID4KK2NsYXNzIERPVEdyYXBoVHJhaXRzTW9kdWxlUHJpbnRlciA6IHB1YmxpYyBNb2R1bGVQYXNzIHsKK3B1YmxpYzoKKyAgRE9UR3JhcGhUcmFpdHNNb2R1bGVQcmludGVyKFN0cmluZ1JlZiBHcmFwaE5hbWUsIGNoYXIgJklEKQorICAgICAgOiBNb2R1bGVQYXNzKElEKSwgTmFtZShHcmFwaE5hbWUpIHt9CisKKyAgYm9vbCBydW5Pbk1vZHVsZShNb2R1bGUgJk0pIG92ZXJyaWRlIHsKKyAgICBHcmFwaFQgR3JhcGggPSBBbmFseXNpc0dyYXBoVHJhaXRzVDo6Z2V0R3JhcGgoJmdldEFuYWx5c2lzPEFuYWx5c2lzVD4oKSk7CisgICAgc3RkOjpzdHJpbmcgRmlsZW5hbWUgPSBOYW1lICsgIi5kb3QiOworICAgIHN0ZDo6ZXJyb3JfY29kZSBFQzsKKworICAgIGVycnMoKSA8PCAiV3JpdGluZyAnIiA8PCBGaWxlbmFtZSA8PCAiJy4uLiI7CisKKyAgICByYXdfZmRfb3N0cmVhbSBGaWxlKEZpbGVuYW1lLCBFQywgc3lzOjpmczo6Rl9UZXh0KTsKKyAgICBzdGQ6OnN0cmluZyBUaXRsZSA9IERPVEdyYXBoVHJhaXRzPEdyYXBoVD46OmdldEdyYXBoTmFtZShHcmFwaCk7CisKKyAgICBpZiAoIUVDKQorICAgICAgV3JpdGVHcmFwaChGaWxlLCBHcmFwaCwgSXNTaW1wbGUsIFRpdGxlKTsKKyAgICBlbHNlCisgICAgICBlcnJzKCkgPDwgIiAgZXJyb3Igb3BlbmluZyBmaWxlIGZvciB3cml0aW5nISI7CisgICAgZXJycygpIDw8ICJcbiI7CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgICBBVS5hZGRSZXF1aXJlZDxBbmFseXNpc1Q+KCk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgTmFtZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9EZW1hbmRlZEJpdHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRGVtYW5kZWRCaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI4NjY4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRGVtYW5kZWRCaXRzLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8vPT09LSBsbHZtL0FuYWx5c2lzL0RlbWFuZGVkQml0cy5oIC0gRGV0ZXJtaW5lIGRlbWFuZGVkIGJpdHMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGltcGxlbWVudHMgYSBkZW1hbmRlZCBiaXRzIGFuYWx5c2lzLiBBIGRlbWFuZGVkIGJpdCBpcyBvbmUgdGhhdAorLy8gY29udHJpYnV0ZXMgdG8gYSByZXN1bHQ7IGJpdHMgdGhhdCBhcmUgbm90IGRlbWFuZGVkIGNhbiBiZSBlaXRoZXIgemVybyBvcgorLy8gb25lIHdpdGhvdXQgYWZmZWN0aW5nIGNvbnRyb2wgb3IgZGF0YSBmbG93LiBGb3IgZXhhbXBsZSBpbiB0aGlzIHNlcXVlbmNlOgorLy8KKy8vICAgJTEgPSBhZGQgaTMyICV4LCAleQorLy8gICAlMiA9IHRydW5jIGkzMiAlMSB0byBpMTYKKy8vCisvLyBPbmx5IHRoZSBsb3dlc3QgMTYgYml0cyBvZiAlMSBhcmUgZGVtYW5kZWQ7IHRoZSByZXN0IGFyZSByZW1vdmVkIGJ5IHRoZQorLy8gdHJ1bmMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0RFTUFOREVEX0JJVFNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0RFTUFOREVEX0JJVFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQXNzdW1wdGlvbkNhY2hlOworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgSW5zdHJ1Y3Rpb247CitzdHJ1Y3QgS25vd25CaXRzOworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIERlbWFuZGVkQml0cyB7CitwdWJsaWM6CisgIERlbWFuZGVkQml0cyhGdW5jdGlvbiAmRiwgQXNzdW1wdGlvbkNhY2hlICZBQywgRG9taW5hdG9yVHJlZSAmRFQpIDoKKyAgICBGKEYpLCBBQyhBQyksIERUKERUKSB7fQorCisgIC8vLyBSZXR1cm4gdGhlIGJpdHMgZGVtYW5kZWQgZnJvbSBpbnN0cnVjdGlvbiBJLgorICBBUEludCBnZXREZW1hbmRlZEJpdHMoSW5zdHJ1Y3Rpb24gKkkpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiwgZHVyaW5nIGFuYWx5c2lzLCBJIGNvdWxkIG5vdCBiZSByZWFjaGVkLgorICBib29sIGlzSW5zdHJ1Y3Rpb25EZWFkKEluc3RydWN0aW9uICpJKTsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUyk7CisKK3ByaXZhdGU6CisgIHZvaWQgcGVyZm9ybUFuYWx5c2lzKCk7CisgIHZvaWQgZGV0ZXJtaW5lTGl2ZU9wZXJhbmRCaXRzKGNvbnN0IEluc3RydWN0aW9uICpVc2VySSwKKyAgICBjb25zdCBJbnN0cnVjdGlvbiAqSSwgdW5zaWduZWQgT3BlcmFuZE5vLAorICAgIGNvbnN0IEFQSW50ICZBT3V0LCBBUEludCAmQUIsCisgICAgS25vd25CaXRzICZLbm93biwgS25vd25CaXRzICZLbm93bjIpOworCisgIEZ1bmN0aW9uICZGOworICBBc3N1bXB0aW9uQ2FjaGUgJkFDOworICBEb21pbmF0b3JUcmVlICZEVDsKKworICBib29sIEFuYWx5emVkID0gZmFsc2U7CisKKyAgLy8gVGhlIHNldCBvZiB2aXNpdGVkIGluc3RydWN0aW9ucyAobm9uLWludGVnZXItdHlwZWQgb25seSkuCisgIFNtYWxsUHRyU2V0PEluc3RydWN0aW9uKiwgMzI+IFZpc2l0ZWQ7CisgIERlbnNlTWFwPEluc3RydWN0aW9uICosIEFQSW50PiBBbGl2ZUJpdHM7Cit9OworCitjbGFzcyBEZW1hbmRlZEJpdHNXcmFwcGVyUGFzcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworcHJpdmF0ZToKKyAgbXV0YWJsZSBPcHRpb25hbDxEZW1hbmRlZEJpdHM+IERCOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisKKyAgRGVtYW5kZWRCaXRzV3JhcHBlclBhc3MoKTsKKworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vLyBDbGVhbiB1cCBtZW1vcnkgaW4gYmV0d2VlbiBydW5zCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlOworCisgIERlbWFuZGVkQml0cyAmZ2V0RGVtYW5kZWRCaXRzKCkgeyByZXR1cm4gKkRCOyB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSAqTSkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gQW4gYW5hbHlzaXMgdGhhdCBwcm9kdWNlcyBcYyBEZW1hbmRlZEJpdHMgZm9yIGEgZnVuY3Rpb24uCitjbGFzcyBEZW1hbmRlZEJpdHNBbmFseXNpcyA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjxEZW1hbmRlZEJpdHNBbmFseXNpcz4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48RGVtYW5kZWRCaXRzQW5hbHlzaXM+OworCisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBQcm92aWRlIHRoZSByZXN1bHQgdHlwZSBmb3IgdGhpcyBhbmFseXNpcyBwYXNzLgorICB1c2luZyBSZXN1bHQgPSBEZW1hbmRlZEJpdHM7CisKKyAgLy8vIFxicmllZiBSdW4gdGhlIGFuYWx5c2lzIHBhc3Mgb3ZlciBhIGZ1bmN0aW9uIGFuZCBwcm9kdWNlIGRlbWFuZGVkIGJpdHMKKyAgLy8vIGluZm9ybWF0aW9uLgorICBEZW1hbmRlZEJpdHMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIFxicmllZiBQcmludGVyIHBhc3MgZm9yIERlbWFuZGVkQml0cworY2xhc3MgRGVtYW5kZWRCaXRzUHJpbnRlclBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxEZW1hbmRlZEJpdHNQcmludGVyUGFzcz4geworICByYXdfb3N0cmVhbSAmT1M7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgRGVtYW5kZWRCaXRzUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TKSA6IE9TKE9TKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBDcmVhdGUgYSBkZW1hbmRlZCBiaXRzIGFuYWx5c2lzIHBhc3MuCitGdW5jdGlvblBhc3MgKmNyZWF0ZURlbWFuZGVkQml0c1dyYXBwZXJQYXNzKCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0RFTUFOREVEX0JJVFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9EZXBlbmRlbmNlQW5hbHlzaXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRGVwZW5kZW5jZUFuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBmMzNiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRGVwZW5kZW5jZUFuYWx5c2lzLmgKQEAgLTAsMCArMSw5NTMgQEAKKy8vPT09LS0gbGx2bS9BbmFseXNpcy9EZXBlbmRlbmNlQW5hbHlzaXMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLSAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVwZW5kZW5jZUFuYWx5c2lzIGlzIGFuIExMVk0gcGFzcyB0aGF0IGFuYWx5c2VzIGRlcGVuZGVuY2VzIGJldHdlZW4gbWVtb3J5CisvLyBhY2Nlc3Nlcy4gQ3VycmVudGx5LCBpdCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYXBwcm9hY2ggZGVzY3JpYmVkIGluCisvLworLy8gICAgICAgICAgICBQcmFjdGljYWwgRGVwZW5kZW5jZSBUZXN0aW5nCisvLyAgICAgICAgICAgIEdvZmYsIEtlbm5lZHksIFRzZW5nCisvLyAgICAgICAgICAgIFBMREkgMTk5MQorLy8KKy8vIFRoZXJlJ3MgYSBzaW5nbGUgZW50cnkgcG9pbnQgdGhhdCBhbmFseXplcyB0aGUgZGVwZW5kZW5jZSBiZXR3ZWVuIGEgcGFpcgorLy8gb2YgbWVtb3J5IHJlZmVyZW5jZXMgaW4gYSBmdW5jdGlvbiwgcmV0dXJuaW5nIGVpdGhlciBOVUxMLCBmb3Igbm8gZGVwZW5kZW5jZSwKKy8vIG9yIGEgbW9yZS1vci1sZXNzIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXBlbmRlbmNlIGJldHdlZW4gdGhlbS4KKy8vCisvLyBUaGlzIHBhc3MgZXhpc3RzIHRvIHN1cHBvcnQgdGhlIERlcGVuZGVuY2VHcmFwaCBwYXNzLiBUaGVyZSBhcmUgdHdvIHNlcGFyYXRlCisvLyBwYXNzZXMgYmVjYXVzZSB0aGVyZSdzIGEgdXNlZnVsIHNlcGFyYXRpb24gb2YgY29uY2VybnMuIEEgZGVwZW5kZW5jZSBleGlzdHMKKy8vIGlmIHR3byBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAgMSkgVHdvIGluc3RydWN0aW9ucyByZWZlcmVuY2UgdGhlIHNhbWUgbWVtb3J5IGxvY2F0aW9uLCBhbmQKKy8vICAgIDIpIFRoZXJlIGlzIGEgZmxvdyBvZiBjb250cm9sIGxlYWRpbmcgZnJvbSBvbmUgaW5zdHJ1Y3Rpb24gdG8gdGhlIG90aGVyLgorLy8KKy8vIERlcGVuZGVuY2VBbmFseXNpcyBhdHRhY2tzIHRoZSBmaXJzdCBjb25kaXRpb247IERlcGVuZGVuY2VHcmFwaCB3aWxsIGF0dGFjaworLy8gdGhlIHNlY29uZCAoaXQncyBub3QgeWV0IHJlYWR5KS4KKy8vCisvLyBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXMgd29yayBpbiBwcm9ncmVzcyBhbmQgdGhlIGludGVyZmFjZSBpcyBzdWJqZWN0IHRvCisvLyBjaGFuZ2UuCisvLworLy8gUGxhdXNpYmxlIGNoYW5nZXM6CisvLyAgICBSZXR1cm4gYSBzZXQgb2YgbW9yZSBwcmVjaXNlIGRlcGVuZGVuY2VzIGluc3RlYWQgb2YganVzdCBvbmUgZGVwZW5kZW5jZQorLy8gICAgc3VtbWFyaXppbmcgYWxsLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19ERVBFTkRFTkNFQU5BTFlTSVNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0RFUEVOREVOQ0VBTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbEJpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKKyAgY2xhc3MgTG9vcDsKKyAgY2xhc3MgTG9vcEluZm87CisgIGNsYXNzIFNjYWxhckV2b2x1dGlvbjsKKyAgY2xhc3MgU0NFVjsKKyAgY2xhc3MgU0NFVkNvbnN0YW50OworICBjbGFzcyByYXdfb3N0cmVhbTsKKworICAvLy8gRGVwZW5kZW5jZSAtIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGRlcGVuZGVuY2UgYmV0d2VlbiB0d28gbWVtb3J5CisgIC8vLyBtZW1vcnkgcmVmZXJlbmNlcyBpbiBhIGZ1bmN0aW9uLiBJdCBjb250YWlucyBtaW5pbWFsIGluZm9ybWF0aW9uIGFuZAorICAvLy8gaXMgdXNlZCBpbiB0aGUgdmVyeSBjb21tb24gc2l0dWF0aW9uIHdoZXJlIHRoZSBjb21waWxlciBpcyB1bmFibGUgdG8KKyAgLy8vIGRldGVybWluZSBhbnl0aGluZyBiZXlvbmQgdGhlIGV4aXN0ZW5jZSBvZiBhIGRlcGVuZGVuY2U7IHRoYXQgaXMsIGl0CisgIC8vLyByZXByZXNlbnRzIGEgY29uZnVzZWQgZGVwZW5kZW5jZSAoc2VlIGFsc28gRnVsbERlcGVuZGVuY2UpLiBJbiBtb3N0CisgIC8vLyBjYXNlcyAoZm9yIG91dHB1dCwgZmxvdywgYW5kIGFudGkgZGVwZW5kZW5jZXMpLCB0aGUgZGVwZW5kZW5jZSBpbXBsaWVzCisgIC8vLyBhbiBvcmRlcmluZywgd2hlcmUgdGhlIHNvdXJjZSBtdXN0IHByZWNlZGUgdGhlIGRlc3RpbmF0aW9uOyBpbiBjb250cmFzdCwKKyAgLy8vIGlucHV0IGRlcGVuZGVuY2VzIGFyZSB1bm9yZGVyZWQuCisgIC8vLworICAvLy8gV2hlbiBhIGRlcGVuZGVuY2UgZ3JhcGggaXMgYnVpbHQsIGVhY2ggRGVwZW5kZW5jZSB3aWxsIGJlIGEgbWVtYmVyIG9mCisgIC8vLyB0aGUgc2V0IG9mIHByZWRlY2Vzc29yIGVkZ2VzIGZvciBpdHMgZGVzdGluYXRpb24gaW5zdHJ1Y3Rpb24gYW5kIGEgc2V0CisgIC8vLyBpZiBzdWNjZXNzb3IgZWRnZXMgZm9yIGl0cyBzb3VyY2UgaW5zdHJ1Y3Rpb24uIFRoZXNlIHNldHMgYXJlIHJlcHJlc2VudGVkCisgIC8vLyBhcyBzaW5nbHktbGlua2VkIGxpc3RzLCB3aXRoIHRoZSAibmV4dCIgZmllbGRzIHN0b3JlZCBpbiB0aGUgZGVwZW5kZW5jZQorICAvLy8gaXRlbGYuCisgIGNsYXNzIERlcGVuZGVuY2UgeworICBwcm90ZWN0ZWQ6CisgICAgRGVwZW5kZW5jZShEZXBlbmRlbmNlICYmKSA9IGRlZmF1bHQ7CisgICAgRGVwZW5kZW5jZSAmb3BlcmF0b3I9KERlcGVuZGVuY2UgJiYpID0gZGVmYXVsdDsKKworICBwdWJsaWM6CisgICAgRGVwZW5kZW5jZShJbnN0cnVjdGlvbiAqU291cmNlLAorICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkRlc3RpbmF0aW9uKSA6CisgICAgICBTcmMoU291cmNlKSwKKyAgICAgIERzdChEZXN0aW5hdGlvbiksCisgICAgICBOZXh0UHJlZGVjZXNzb3IobnVsbHB0ciksCisgICAgICBOZXh0U3VjY2Vzc29yKG51bGxwdHIpIHt9CisgICAgdmlydHVhbCB+RGVwZW5kZW5jZSgpIHt9CisKKyAgICAvLy8gRGVwZW5kZW5jZTo6RFZFbnRyeSAtIEVhY2ggbGV2ZWwgaW4gdGhlIGRpc3RhbmNlL2RpcmVjdGlvbiB2ZWN0b3IKKyAgICAvLy8gaGFzIGEgZGlyZWN0aW9uIChvciBwZXJoYXBzIGEgdW5pb24gb2Ygc2V2ZXJhbCBkaXJlY3Rpb25zKSwgYW5kCisgICAgLy8vIHBlcmhhcHMgYSBkaXN0YW5jZS4KKyAgICBzdHJ1Y3QgRFZFbnRyeSB7CisgICAgICBlbnVtIHsgTk9ORSA9IDAsCisgICAgICAgICAgICAgTFQgPSAxLAorICAgICAgICAgICAgIEVRID0gMiwKKyAgICAgICAgICAgICBMRSA9IDMsCisgICAgICAgICAgICAgR1QgPSA0LAorICAgICAgICAgICAgIE5FID0gNSwKKyAgICAgICAgICAgICBHRSA9IDYsCisgICAgICAgICAgICAgQUxMID0gNyB9OworICAgICAgdW5zaWduZWQgY2hhciBEaXJlY3Rpb24gOiAzOyAvLyBJbml0IHRvIEFMTCwgdGhlbiByZWZpbmUuCisgICAgICBib29sIFNjYWxhciAgICA6IDE7IC8vIEluaXQgdG8gdHJ1ZS4KKyAgICAgIGJvb2wgUGVlbEZpcnN0IDogMTsgLy8gUGVlbGluZyB0aGUgZmlyc3QgaXRlcmF0aW9uIHdpbGwgYnJlYWsgZGVwZW5kZW5jZS4KKyAgICAgIGJvb2wgUGVlbExhc3QgIDogMTsgLy8gUGVlbGluZyB0aGUgbGFzdCBpdGVyYXRpb24gd2lsbCBicmVhayB0aGUgZGVwZW5kZW5jZS4KKyAgICAgIGJvb2wgU3BsaXRhYmxlIDogMTsgLy8gU3BsaXR0aW5nIHRoZSBsb29wIHdpbGwgYnJlYWsgZGVwZW5kZW5jZS4KKyAgICAgIGNvbnN0IFNDRVYgKkRpc3RhbmNlOyAvLyBOVUxMIGltcGxpZXMgbm8gZGlzdGFuY2UgYXZhaWxhYmxlLgorICAgICAgRFZFbnRyeSgpIDogRGlyZWN0aW9uKEFMTCksIFNjYWxhcih0cnVlKSwgUGVlbEZpcnN0KGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgIFBlZWxMYXN0KGZhbHNlKSwgU3BsaXRhYmxlKGZhbHNlKSwgRGlzdGFuY2UobnVsbHB0cikgeyB9CisgICAgfTsKKworICAgIC8vLyBnZXRTcmMgLSBSZXR1cm5zIHRoZSBzb3VyY2UgaW5zdHJ1Y3Rpb24gZm9yIHRoaXMgZGVwZW5kZW5jZS4KKyAgICAvLy8KKyAgICBJbnN0cnVjdGlvbiAqZ2V0U3JjKCkgY29uc3QgeyByZXR1cm4gU3JjOyB9CisKKyAgICAvLy8gZ2V0RHN0IC0gUmV0dXJucyB0aGUgZGVzdGluYXRpb24gaW5zdHJ1Y3Rpb24gZm9yIHRoaXMgZGVwZW5kZW5jZS4KKyAgICAvLy8KKyAgICBJbnN0cnVjdGlvbiAqZ2V0RHN0KCkgY29uc3QgeyByZXR1cm4gRHN0OyB9CisKKyAgICAvLy8gaXNJbnB1dCAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGFuIGlucHV0IGRlcGVuZGVuY2UuCisgICAgLy8vCisgICAgYm9vbCBpc0lucHV0KCkgY29uc3Q7CisKKyAgICAvLy8gaXNPdXRwdXQgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhbiBvdXRwdXQgZGVwZW5kZW5jZS4KKyAgICAvLy8KKyAgICBib29sIGlzT3V0cHV0KCkgY29uc3Q7CisKKyAgICAvLy8gaXNGbG93IC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBmbG93IChha2EgdHJ1ZSkgZGVwZW5kZW5jZS4KKyAgICAvLy8KKyAgICBib29sIGlzRmxvdygpIGNvbnN0OworCisgICAgLy8vIGlzQW50aSAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGFuIGFudGkgZGVwZW5kZW5jZS4KKyAgICAvLy8KKyAgICBib29sIGlzQW50aSgpIGNvbnN0OworCisgICAgLy8vIGlzT3JkZXJlZCAtIFJldHVybnMgdHJ1ZSBpZiBkZXBlbmRlbmNlIGlzIE91dHB1dCwgRmxvdywgb3IgQW50aQorICAgIC8vLworICAgIGJvb2wgaXNPcmRlcmVkKCkgY29uc3QgeyByZXR1cm4gaXNPdXRwdXQoKSB8fCBpc0Zsb3coKSB8fCBpc0FudGkoKTsgfQorCisgICAgLy8vIGlzVW5vcmRlcmVkIC0gUmV0dXJucyB0cnVlIGlmIGRlcGVuZGVuY2UgaXMgSW5wdXQKKyAgICAvLy8KKyAgICBib29sIGlzVW5vcmRlcmVkKCkgY29uc3QgeyByZXR1cm4gaXNJbnB1dCgpOyB9CisKKyAgICAvLy8gaXNMb29wSW5kZXBlbmRlbnQgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIGxvb3AtaW5kZXBlbmRlbnQKKyAgICAvLy8gZGVwZW5kZW5jZS4KKyAgICB2aXJ0dWFsIGJvb2wgaXNMb29wSW5kZXBlbmRlbnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgICAvLy8gaXNDb25mdXNlZCAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRlcGVuZGVuY2UgaXMgY29uZnVzZWQKKyAgICAvLy8gKHRoZSBjb21waWxlciB1bmRlcnN0YW5kcyBub3RoaW5nIGFuZCBtYWtlcyB3b3JzdC1jYXNlCisgICAgLy8vIGFzc3VtcHRpb25zKS4KKyAgICB2aXJ0dWFsIGJvb2wgaXNDb25mdXNlZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAgIC8vLyBpc0NvbnNpc3RlbnQgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBkZXBlbmRlbmNlIGlzIGNvbnNpc3RlbnQKKyAgICAvLy8gKG9jY3VycyBldmVyeSB0aW1lIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBleGVjdXRlZCkuCisgICAgdmlydHVhbCBib29sIGlzQ29uc2lzdGVudCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAvLy8gZ2V0TGV2ZWxzIC0gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbW1vbiBsb29wcyBzdXJyb3VuZGluZyB0aGUKKyAgICAvLy8gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBvZiB0aGUgZGVwZW5kZW5jZS4KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGdldExldmVscygpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKworICAgIC8vLyBnZXREaXJlY3Rpb24gLSBSZXR1cm5zIHRoZSBkaXJlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhcgorICAgIC8vLyBsZXZlbC4KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGdldERpcmVjdGlvbih1bnNpZ25lZCBMZXZlbCkgY29uc3QgeyByZXR1cm4gRFZFbnRyeTo6QUxMOyB9CisKKyAgICAvLy8gZ2V0RGlzdGFuY2UgLSBSZXR1cm5zIHRoZSBkaXN0YW5jZSAob3IgTlVMTCkgYXNzb2NpYXRlZCB3aXRoIGEKKyAgICAvLy8gcGFydGljdWxhciBsZXZlbC4KKyAgICB2aXJ0dWFsIGNvbnN0IFNDRVYgKmdldERpc3RhbmNlKHVuc2lnbmVkIExldmVsKSBjb25zdCB7IHJldHVybiBudWxscHRyOyB9CisKKyAgICAvLy8gaXNQZWVsRmlyc3QgLSBSZXR1cm5zIHRydWUgaWYgcGVlbGluZyB0aGUgZmlyc3QgaXRlcmF0aW9uIGZyb20KKyAgICAvLy8gdGhpcyBsb29wIHdpbGwgYnJlYWsgdGhpcyBkZXBlbmRlbmNlLgorICAgIHZpcnR1YWwgYm9vbCBpc1BlZWxGaXJzdCh1bnNpZ25lZCBMZXZlbCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIC8vLyBpc1BlZWxMYXN0IC0gUmV0dXJucyB0cnVlIGlmIHBlZWxpbmcgdGhlIGxhc3QgaXRlcmF0aW9uIGZyb20KKyAgICAvLy8gdGhpcyBsb29wIHdpbGwgYnJlYWsgdGhpcyBkZXBlbmRlbmNlLgorICAgIHZpcnR1YWwgYm9vbCBpc1BlZWxMYXN0KHVuc2lnbmVkIExldmVsKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgLy8vIGlzU3BsaXRhYmxlIC0gUmV0dXJucyB0cnVlIGlmIHNwbGl0dGluZyB0aGlzIGxvb3Agd2lsbCBicmVhaworICAgIC8vLyB0aGUgZGVwZW5kZW5jZS4KKyAgICB2aXJ0dWFsIGJvb2wgaXNTcGxpdGFibGUodW5zaWduZWQgTGV2ZWwpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAvLy8gaXNTY2FsYXIgLSBSZXR1cm5zIHRydWUgaWYgYSBwYXJ0aWN1bGFyIGxldmVsIGlzIHNjYWxhcjsgdGhhdCBpcywKKyAgICAvLy8gaWYgbm8gc3Vic2NyaXB0IGluIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gbWVudGlvbiB0aGUgaW5kdWN0aW9uCisgICAgLy8vIHZhcmlhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9vcCBhdCB0aGlzIGxldmVsLgorICAgIHZpcnR1YWwgYm9vbCBpc1NjYWxhcih1bnNpZ25lZCBMZXZlbCkgY29uc3Q7CisKKyAgICAvLy8gZ2V0TmV4dFByZWRlY2Vzc29yIC0gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIE5leHRQcmVkZWNlc3NvcgorICAgIC8vLyBmaWVsZC4KKyAgICBjb25zdCBEZXBlbmRlbmNlICpnZXROZXh0UHJlZGVjZXNzb3IoKSBjb25zdCB7IHJldHVybiBOZXh0UHJlZGVjZXNzb3I7IH0KKworICAgIC8vLyBnZXROZXh0U3VjY2Vzc29yIC0gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIE5leHRTdWNjZXNzb3IKKyAgICAvLy8gZmllbGQuCisgICAgY29uc3QgRGVwZW5kZW5jZSAqZ2V0TmV4dFN1Y2Nlc3NvcigpIGNvbnN0IHsgcmV0dXJuIE5leHRTdWNjZXNzb3I7IH0KKworICAgIC8vLyBzZXROZXh0UHJlZGVjZXNzb3IgLSBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgTmV4dFByZWRlY2Vzc29yCisgICAgLy8vIGZpZWxkLgorICAgIHZvaWQgc2V0TmV4dFByZWRlY2Vzc29yKGNvbnN0IERlcGVuZGVuY2UgKnByZWQpIHsgTmV4dFByZWRlY2Vzc29yID0gcHJlZDsgfQorCisgICAgLy8vIHNldE5leHRTdWNjZXNzb3IgLSBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgTmV4dFN1Y2Nlc3NvcgorICAgIC8vLyBmaWVsZC4KKyAgICB2b2lkIHNldE5leHRTdWNjZXNzb3IoY29uc3QgRGVwZW5kZW5jZSAqc3VjYykgeyBOZXh0U3VjY2Vzc29yID0gc3VjYzsgfQorCisgICAgLy8vIGR1bXAgLSBGb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBkdW1wcyBhIGRlcGVuZGVuY2UgdG8gT1MuCisgICAgLy8vCisgICAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICBJbnN0cnVjdGlvbiAqU3JjLCAqRHN0OworICAgIGNvbnN0IERlcGVuZGVuY2UgKk5leHRQcmVkZWNlc3NvciwgKk5leHRTdWNjZXNzb3I7CisgICAgZnJpZW5kIGNsYXNzIERlcGVuZGVuY2VJbmZvOworICB9OworCisgIC8vLyBGdWxsRGVwZW5kZW5jZSAtIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGRlcGVuZGVuY2UgYmV0d2VlbiB0d28gbWVtb3J5CisgIC8vLyByZWZlcmVuY2VzIGluIGEgZnVuY3Rpb24uIEl0IGNvbnRhaW5zIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAvLy8gZGVwZW5kZW5jZSAoZGlyZWN0aW9uIHZlY3RvcnMsIGV0Yy4pIGFuZCBpcyB1c2VkIHdoZW4gdGhlIGNvbXBpbGVyIGlzCisgIC8vLyBhYmxlIHRvIGFjY3VyYXRlbHkgYW5hbHl6ZSB0aGUgaW50ZXJhY3Rpb24gb2YgdGhlIHJlZmVyZW5jZXM7IHRoYXQgaXMsCisgIC8vLyBpdCBpcyBub3QgYSBjb25mdXNlZCBkZXBlbmRlbmNlIChzZWUgRGVwZW5kZW5jZSkuIEluIG1vc3QgY2FzZXMKKyAgLy8vIChmb3Igb3V0cHV0LCBmbG93LCBhbmQgYW50aSBkZXBlbmRlbmNlcyksIHRoZSBkZXBlbmRlbmNlIGltcGxpZXMgYW4KKyAgLy8vIG9yZGVyaW5nLCB3aGVyZSB0aGUgc291cmNlIG11c3QgcHJlY2VkZSB0aGUgZGVzdGluYXRpb247IGluIGNvbnRyYXN0LAorICAvLy8gaW5wdXQgZGVwZW5kZW5jZXMgYXJlIHVub3JkZXJlZC4KKyAgY2xhc3MgRnVsbERlcGVuZGVuY2UgZmluYWwgOiBwdWJsaWMgRGVwZW5kZW5jZSB7CisgIHB1YmxpYzoKKyAgICBGdWxsRGVwZW5kZW5jZShJbnN0cnVjdGlvbiAqU3JjLCBJbnN0cnVjdGlvbiAqRHN0LCBib29sIExvb3BJbmRlcGVuZGVudCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMZXZlbHMpOworCisgICAgLy8vIGlzTG9vcEluZGVwZW5kZW50IC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBsb29wLWluZGVwZW5kZW50CisgICAgLy8vIGRlcGVuZGVuY2UuCisgICAgYm9vbCBpc0xvb3BJbmRlcGVuZGVudCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIExvb3BJbmRlcGVuZGVudDsgfQorCisgICAgLy8vIGlzQ29uZnVzZWQgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBkZXBlbmRlbmNlIGlzIGNvbmZ1c2VkCisgICAgLy8vICh0aGUgY29tcGlsZXIgdW5kZXJzdGFuZHMgbm90aGluZyBhbmQgbWFrZXMgd29yc3QtY2FzZQorICAgIC8vLyBhc3N1bXB0aW9ucykuCisgICAgYm9vbCBpc0NvbmZ1c2VkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIC8vLyBpc0NvbnNpc3RlbnQgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBkZXBlbmRlbmNlIGlzIGNvbnNpc3RlbnQKKyAgICAvLy8gKG9jY3VycyBldmVyeSB0aW1lIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBleGVjdXRlZCkuCisgICAgYm9vbCBpc0NvbnNpc3RlbnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBDb25zaXN0ZW50OyB9CisKKyAgICAvLy8gZ2V0TGV2ZWxzIC0gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbW1vbiBsb29wcyBzdXJyb3VuZGluZyB0aGUKKyAgICAvLy8gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBvZiB0aGUgZGVwZW5kZW5jZS4KKyAgICB1bnNpZ25lZCBnZXRMZXZlbHMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBMZXZlbHM7IH0KKworICAgIC8vLyBnZXREaXJlY3Rpb24gLSBSZXR1cm5zIHRoZSBkaXJlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhcgorICAgIC8vLyBsZXZlbC4KKyAgICB1bnNpZ25lZCBnZXREaXJlY3Rpb24odW5zaWduZWQgTGV2ZWwpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8vIGdldERpc3RhbmNlIC0gUmV0dXJucyB0aGUgZGlzdGFuY2UgKG9yIE5VTEwpIGFzc29jaWF0ZWQgd2l0aCBhCisgICAgLy8vIHBhcnRpY3VsYXIgbGV2ZWwuCisgICAgY29uc3QgU0NFViAqZ2V0RGlzdGFuY2UodW5zaWduZWQgTGV2ZWwpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8vIGlzUGVlbEZpcnN0IC0gUmV0dXJucyB0cnVlIGlmIHBlZWxpbmcgdGhlIGZpcnN0IGl0ZXJhdGlvbiBmcm9tCisgICAgLy8vIHRoaXMgbG9vcCB3aWxsIGJyZWFrIHRoaXMgZGVwZW5kZW5jZS4KKyAgICBib29sIGlzUGVlbEZpcnN0KHVuc2lnbmVkIExldmVsKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vLyBpc1BlZWxMYXN0IC0gUmV0dXJucyB0cnVlIGlmIHBlZWxpbmcgdGhlIGxhc3QgaXRlcmF0aW9uIGZyb20KKyAgICAvLy8gdGhpcyBsb29wIHdpbGwgYnJlYWsgdGhpcyBkZXBlbmRlbmNlLgorICAgIGJvb2wgaXNQZWVsTGFzdCh1bnNpZ25lZCBMZXZlbCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLy8gaXNTcGxpdGFibGUgLSBSZXR1cm5zIHRydWUgaWYgc3BsaXR0aW5nIHRoZSBsb29wIHdpbGwgYnJlYWsKKyAgICAvLy8gdGhlIGRlcGVuZGVuY2UuCisgICAgYm9vbCBpc1NwbGl0YWJsZSh1bnNpZ25lZCBMZXZlbCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLy8gaXNTY2FsYXIgLSBSZXR1cm5zIHRydWUgaWYgYSBwYXJ0aWN1bGFyIGxldmVsIGlzIHNjYWxhcjsgdGhhdCBpcywKKyAgICAvLy8gaWYgbm8gc3Vic2NyaXB0IGluIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gbWVudGlvbiB0aGUgaW5kdWN0aW9uCisgICAgLy8vIHZhcmlhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9vcCBhdCB0aGlzIGxldmVsLgorICAgIGJvb2wgaXNTY2FsYXIodW5zaWduZWQgTGV2ZWwpIGNvbnN0IG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgdW5zaWduZWQgc2hvcnQgTGV2ZWxzOworICAgIGJvb2wgTG9vcEluZGVwZW5kZW50OworICAgIGJvb2wgQ29uc2lzdGVudDsgLy8gSW5pdCB0byB0cnVlLCB0aGVuIHJlZmluZS4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RFZFbnRyeVtdPiBEVjsKKyAgICBmcmllbmQgY2xhc3MgRGVwZW5kZW5jZUluZm87CisgIH07CisKKyAgLy8vIERlcGVuZGVuY2VJbmZvIC0gVGhpcyBjbGFzcyBpcyB0aGUgbWFpbiBkZXBlbmRlbmNlLWFuYWx5c2lzIGRyaXZlci4KKyAgLy8vCisgIGNsYXNzIERlcGVuZGVuY2VJbmZvIHsKKyAgcHVibGljOgorICAgIERlcGVuZGVuY2VJbmZvKEZ1bmN0aW9uICpGLCBBbGlhc0FuYWx5c2lzICpBQSwgU2NhbGFyRXZvbHV0aW9uICpTRSwKKyAgICAgICAgICAgICAgICAgICBMb29wSW5mbyAqTEkpCisgICAgICAgIDogQUEoQUEpLCBTRShTRSksIExJKExJKSwgRihGKSB7fQorCisgICAgLy8vIGRlcGVuZHMgLSBUZXN0cyBmb3IgYSBkZXBlbmRlbmNlIGJldHdlZW4gdGhlIFNyYyBhbmQgRHN0IGluc3RydWN0aW9ucy4KKyAgICAvLy8gUmV0dXJucyBOVUxMIGlmIG5vIGRlcGVuZGVuY2U7IG90aGVyd2lzZSwgcmV0dXJucyBhIERlcGVuZGVuY2UgKG9yIGEKKyAgICAvLy8gRnVsbERlcGVuZGVuY2UpIHdpdGggYXMgbXVjaCBpbmZvcm1hdGlvbiBhcyBjYW4gYmUgZ2xlYW5lZC4KKyAgICAvLy8gVGhlIGZsYWcgUG9zc2libHlMb29wSW5kZXBlbmRlbnQgc2hvdWxkIGJlIHNldCBieSB0aGUgY2FsbGVyCisgICAgLy8vIGlmIGl0IGFwcGVhcnMgdGhhdCBjb250cm9sIGZsb3cgY2FuIHJlYWNoIGZyb20gU3JjIHRvIERzdAorICAgIC8vLyB3aXRob3V0IHRyYXZlcnNpbmcgYSBsb29wIGJhY2sgZWRnZS4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGVwZW5kZW5jZT4gZGVwZW5kcyhJbnN0cnVjdGlvbiAqU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQb3NzaWJseUxvb3BJbmRlcGVuZGVudCk7CisKKyAgICAvLy8gZ2V0U3BsaXRJdGVyYXRpb24gLSBHaXZlIGEgZGVwZW5kZW5jZSB0aGF0J3Mgc3BsaXR0YWJsZSBhdCBzb21lCisgICAgLy8vIHBhcnRpY3VsYXIgbGV2ZWwsIHJldHVybiB0aGUgaXRlcmF0aW9uIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gc3BsaXQKKyAgICAvLy8gdGhlIGxvb3AuCisgICAgLy8vCisgICAgLy8vIEdlbmVyYWxseSwgdGhlIGRlcGVuZGVuY2UgYW5hbHl6ZXIgd2lsbCBiZSB1c2VkIHRvIGJ1aWxkCisgICAgLy8vIGEgZGVwZW5kZW5jZSBncmFwaCBmb3IgYSBmdW5jdGlvbiAoYmFzaWNhbGx5IGEgbWFwIGZyb20gaW5zdHJ1Y3Rpb25zCisgICAgLy8vIHRvIGRlcGVuZGVuY2VzKS4gTG9va2luZyBmb3IgY3ljbGVzIGluIHRoZSBncmFwaCBzaG93cyB1cyBsb29wcworICAgIC8vLyB0aGF0IGNhbm5vdCBiZSB0cml2aWFsbHkgdmVjdG9yaXplZC9wYXJhbGxlbGl6ZWQuCisgICAgLy8vCisgICAgLy8vIFdlIGNhbiB0cnkgdG8gaW1wcm92ZSB0aGUgc2l0dWF0aW9uIGJ5IGV4YW1pbmluZyBhbGwgdGhlIGRlcGVuZGVuY2VzCisgICAgLy8vIHRoYXQgbWFrZSB1cCB0aGUgY3ljbGUsIGxvb2tpbmcgZm9yIG9uZXMgd2UgY2FuIGJyZWFrLgorICAgIC8vLyBTb21ldGltZXMsIHBlZWxpbmcgdGhlIGZpcnN0IG9yIGxhc3QgaXRlcmF0aW9uIG9mIGEgbG9vcCB3aWxsIGJyZWFrCisgICAgLy8vIGRlcGVuZGVuY2VzLCBhbmQgdGhlcmUgYXJlIGZsYWdzIGZvciB0aG9zZSBwb3NzaWJpbGl0aWVzLgorICAgIC8vLyBTb21ldGltZXMsIHNwbGl0dGluZyBhIGxvb3AgYXQgc29tZSBvdGhlciBpdGVyYXRpb24gd2lsbCBkbyB0aGUgdHJpY2ssCisgICAgLy8vIGFuZCB3ZSd2ZSBnb3QgYSBmbGFnIGZvciB0aGF0IGNhc2UuIFJhdGhlciB0aGFuIHdhc3RlIHRoZSBzcGFjZSB0bworICAgIC8vLyByZWNvcmQgdGhlIGV4YWN0IGl0ZXJhdGlvbiAoc2luY2Ugd2UgcmFyZWx5IGtub3cpLCB3ZSBwcm92aWRlCisgICAgLy8vIGEgbWV0aG9kIHRoYXQgY2FsY3VsYXRlcyB0aGUgaXRlcmF0aW9uLiBJdCdzIGEgZHJhZyB0aGF0IGl0IG11c3Qgd29yaworICAgIC8vLyBmcm9tIHNjcmF0Y2gsIGJ1dCB3b25kZXJmdWwgaW4gdGhhdCBpdCdzIHBvc3NpYmxlLgorICAgIC8vLworICAgIC8vLyBIZXJlJ3MgYW4gZXhhbXBsZToKKyAgICAvLy8KKyAgICAvLy8gICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisgICAgLy8vICAgICAgICBBW2ldID0gLi4uCisgICAgLy8vICAgICAgICAuLi4gPSBBWzExIC0gaV0KKyAgICAvLy8KKyAgICAvLy8gVGhlcmUncyBhIGxvb3AtY2FycmllZCBmbG93IGRlcGVuZGVuY2UgZnJvbSB0aGUgc3RvcmUgdG8gdGhlIGxvYWQsCisgICAgLy8vIGZvdW5kIGJ5IHRoZSB3ZWFrLWNyb3NzaW5nIFNJViB0ZXN0LiBUaGUgZGVwZW5kZW5jZSB3aWxsIGhhdmUgYSBmbGFnLAorICAgIC8vLyBpbmRpY2F0aW5nIHRoYXQgdGhlIGRlcGVuZGVuY2UgY2FuIGJlIGJyb2tlbiBieSBzcGxpdHRpbmcgdGhlIGxvb3AuCisgICAgLy8vIENhbGxpbmcgZ2V0U3BsaXRJdGVyYXRpb24gd2lsbCByZXR1cm4gNS4KKyAgICAvLy8gU3BsaXR0aW5nIHRoZSBsb29wIGJyZWFrcyB0aGUgZGVwZW5kZW5jZSwgbGlrZSBzbzoKKyAgICAvLy8KKyAgICAvLy8gICAgZm9yIChpID0gMDsgaSA8PSA1OyBpKyspCisgICAgLy8vICAgICAgICBBW2ldID0gLi4uCisgICAgLy8vICAgICAgICAuLi4gPSBBWzExIC0gaV0KKyAgICAvLy8gICAgZm9yIChpID0gNjsgaSA8IDEwOyBpKyspCisgICAgLy8vICAgICAgICBBW2ldID0gLi4uCisgICAgLy8vICAgICAgICAuLi4gPSBBWzExIC0gaV0KKyAgICAvLy8KKyAgICAvLy8gYnJlYWtzIHRoZSBkZXBlbmRlbmNlIGFuZCBhbGxvd3MgdXMgdG8gdmVjdG9yaXplL3BhcmFsbGVsaXplCisgICAgLy8vIGJvdGggbG9vcHMuCisgICAgY29uc3QgU0NFViAqZ2V0U3BsaXRJdGVyYXRpb24oY29uc3QgRGVwZW5kZW5jZSAmRGVwLCB1bnNpZ25lZCBMZXZlbCk7CisKKyAgICBGdW5jdGlvbiAqZ2V0RnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBGOyB9CisKKyAgcHJpdmF0ZToKKyAgICBBbGlhc0FuYWx5c2lzICpBQTsKKyAgICBTY2FsYXJFdm9sdXRpb24gKlNFOworICAgIExvb3BJbmZvICpMSTsKKyAgICBGdW5jdGlvbiAqRjsKKworICAgIC8vLyBTdWJzY3JpcHQgLSBUaGlzIHByaXZhdGUgc3RydWN0IHJlcHJlc2VudHMgYSBwYWlyIG9mIHN1YnNjcmlwdHMgZnJvbQorICAgIC8vLyBhIHBhaXIgb2YgcG90ZW50aWFsbHkgbXVsdGktZGltZW5zaW9uYWwgYXJyYXkgcmVmZXJlbmNlcy4gV2UgdXNlIGEKKyAgICAvLy8gdmVjdG9yIG9mIHRoZW0gdG8gZ3VpZGUgc3Vic2NyaXB0IHBhcnRpdGlvbmluZy4KKyAgICBzdHJ1Y3QgU3Vic2NyaXB0IHsKKyAgICAgIGNvbnN0IFNDRVYgKlNyYzsKKyAgICAgIGNvbnN0IFNDRVYgKkRzdDsKKyAgICAgIGVudW0gQ2xhc3NpZmljYXRpb25LaW5kIHsgWklWLCBTSVYsIFJESVYsIE1JViwgTm9uTGluZWFyIH0gQ2xhc3NpZmljYXRpb247CisgICAgICBTbWFsbEJpdFZlY3RvciBMb29wczsKKyAgICAgIFNtYWxsQml0VmVjdG9yIEdyb3VwTG9vcHM7CisgICAgICBTbWFsbEJpdFZlY3RvciBHcm91cDsKKyAgICB9OworCisgICAgc3RydWN0IENvZWZmaWNpZW50SW5mbyB7CisgICAgICBjb25zdCBTQ0VWICpDb2VmZjsKKyAgICAgIGNvbnN0IFNDRVYgKlBvc1BhcnQ7CisgICAgICBjb25zdCBTQ0VWICpOZWdQYXJ0OworICAgICAgY29uc3QgU0NFViAqSXRlcmF0aW9uczsKKyAgICB9OworCisgICAgc3RydWN0IEJvdW5kSW5mbyB7CisgICAgICBjb25zdCBTQ0VWICpJdGVyYXRpb25zOworICAgICAgY29uc3QgU0NFViAqVXBwZXJbOF07CisgICAgICBjb25zdCBTQ0VWICpMb3dlcls4XTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgRGlyZWN0aW9uOworICAgICAgdW5zaWduZWQgY2hhciBEaXJTZXQ7CisgICAgfTsKKworICAgIC8vLyBDb25zdHJhaW50IC0gVGhpcyBwcml2YXRlIGNsYXNzIHJlcHJlc2VudHMgYSBjb25zdHJhaW50LCBhcyBkZWZpbmVkCisgICAgLy8vIGluIHRoZSBwYXBlcgorICAgIC8vLworICAgIC8vLyAgICAgICAgICAgUHJhY3RpY2FsIERlcGVuZGVuY2UgVGVzdGluZworICAgIC8vLyAgICAgICAgICAgR29mZiwgS2VubmVkeSwgVHNlbmcKKyAgICAvLy8gICAgICAgICAgIFBMREkgMTk5MQorICAgIC8vLworICAgIC8vLyBUaGVyZSBhcmUgNSBraW5kcyBvZiBjb25zdHJhaW50LCBpbiBhIGhpZXJhcmNoeS4KKyAgICAvLy8gICAxKSBBbnkgLSBpbmRpY2F0ZXMgbm8gY29uc3RyYWludCwgYW55IGRlcGVuZGVuY2UgaXMgcG9zc2libGUuCisgICAgLy8vICAgMikgTGluZSAtIEEgbGluZSBheCArIGJ5ID0gYywgd2hlcmUgYSwgYiwgYW5kIGMgYXJlIHBhcmFtZXRlcnMsCisgICAgLy8vICAgICAgICAgICAgIHJlcHJlc2VudGluZyB0aGUgZGVwZW5kZW5jZSBlcXVhdGlvbi4KKyAgICAvLy8gICAzKSBEaXN0YW5jZSAtIFRoZSB2YWx1ZSBkIG9mIHRoZSBkZXBlbmRlbmNlIGRpc3RhbmNlOworICAgIC8vLyAgIDQpIFBvaW50IC0gQSBwb2ludCA8eCwgeT4gcmVwcmVzZW50aW5nIHRoZSBkZXBlbmRlbmNlIGZyb20KKyAgICAvLy8gICAgICAgICAgICAgIGl0ZXJhdGlvbiB4IHRvIGl0ZXJhdGlvbiB5LgorICAgIC8vLyAgIDUpIEVtcHR5IC0gTm8gZGVwZW5kZW5jZSBpcyBwb3NzaWJsZS4KKyAgICBjbGFzcyBDb25zdHJhaW50IHsKKyAgICBwcml2YXRlOgorICAgICAgZW51bSBDb25zdHJhaW50S2luZCB7IEVtcHR5LCBQb2ludCwgRGlzdGFuY2UsIExpbmUsIEFueSB9IEtpbmQ7CisgICAgICBTY2FsYXJFdm9sdXRpb24gKlNFOworICAgICAgY29uc3QgU0NFViAqQTsKKyAgICAgIGNvbnN0IFNDRVYgKkI7CisgICAgICBjb25zdCBTQ0VWICpDOworICAgICAgY29uc3QgTG9vcCAqQXNzb2NpYXRlZExvb3A7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gaXNFbXB0eSAtIFJldHVybiB0cnVlIGlmIHRoZSBjb25zdHJhaW50IGlzIG9mIGtpbmQgRW1wdHkuCisgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBLaW5kID09IEVtcHR5OyB9CisKKyAgICAgIC8vLyBpc1BvaW50IC0gUmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0cmFpbnQgaXMgb2Yga2luZCBQb2ludC4KKyAgICAgIGJvb2wgaXNQb2ludCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gUG9pbnQ7IH0KKworICAgICAgLy8vIGlzRGlzdGFuY2UgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29uc3RyYWludCBpcyBvZiBraW5kIERpc3RhbmNlLgorICAgICAgYm9vbCBpc0Rpc3RhbmNlKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBEaXN0YW5jZTsgfQorCisgICAgICAvLy8gaXNMaW5lIC0gUmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0cmFpbnQgaXMgb2Yga2luZCBMaW5lLgorICAgICAgLy8vIFNpbmNlIERpc3RhbmNlJ3MgY2FuIGFsc28gYmUgcmVwcmVzZW50ZWQgYXMgTGluZXMsIHdlIGFsc28gcmV0dXJuCisgICAgICAvLy8gdHJ1ZSBpZiB0aGUgY29uc3RyYWludCBpcyBvZiBraW5kIERpc3RhbmNlLgorICAgICAgYm9vbCBpc0xpbmUoKSBjb25zdCB7IHJldHVybiBLaW5kID09IExpbmUgfHwgS2luZCA9PSBEaXN0YW5jZTsgfQorCisgICAgICAvLy8gaXNBbnkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29uc3RyYWludCBpcyBvZiBraW5kIEFueTsKKyAgICAgIGJvb2wgaXNBbnkoKSBjb25zdCB7IHJldHVybiBLaW5kID09IEFueTsgfQorCisgICAgICAvLy8gZ2V0WCAtIElmIGNvbnN0cmFpbnQgaXMgYSBwb2ludCA8WCwgWT4sIHJldHVybnMgWC4KKyAgICAgIC8vLyBPdGhlcndpc2UgYXNzZXJ0LgorICAgICAgY29uc3QgU0NFViAqZ2V0WCgpIGNvbnN0OworCisgICAgICAvLy8gZ2V0WSAtIElmIGNvbnN0cmFpbnQgaXMgYSBwb2ludCA8WCwgWT4sIHJldHVybnMgWS4KKyAgICAgIC8vLyBPdGhlcndpc2UgYXNzZXJ0LgorICAgICAgY29uc3QgU0NFViAqZ2V0WSgpIGNvbnN0OworCisgICAgICAvLy8gZ2V0QSAtIElmIGNvbnN0cmFpbnQgaXMgYSBsaW5lIEFYICsgQlkgPSBDLCByZXR1cm5zIEEuCisgICAgICAvLy8gT3RoZXJ3aXNlIGFzc2VydC4KKyAgICAgIGNvbnN0IFNDRVYgKmdldEEoKSBjb25zdDsKKworICAgICAgLy8vIGdldEIgLSBJZiBjb25zdHJhaW50IGlzIGEgbGluZSBBWCArIEJZID0gQywgcmV0dXJucyBCLgorICAgICAgLy8vIE90aGVyd2lzZSBhc3NlcnQuCisgICAgICBjb25zdCBTQ0VWICpnZXRCKCkgY29uc3Q7CisKKyAgICAgIC8vLyBnZXRDIC0gSWYgY29uc3RyYWludCBpcyBhIGxpbmUgQVggKyBCWSA9IEMsIHJldHVybnMgQy4KKyAgICAgIC8vLyBPdGhlcndpc2UgYXNzZXJ0LgorICAgICAgY29uc3QgU0NFViAqZ2V0QygpIGNvbnN0OworCisgICAgICAvLy8gZ2V0RCAtIElmIGNvbnN0cmFpbnQgaXMgYSBkaXN0YW5jZSwgcmV0dXJucyBELgorICAgICAgLy8vIE90aGVyd2lzZSBhc3NlcnQuCisgICAgICBjb25zdCBTQ0VWICpnZXREKCkgY29uc3Q7CisKKyAgICAgIC8vLyBnZXRBc3NvY2lhdGVkTG9vcCAtIFJldHVybnMgdGhlIGxvb3AgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uc3RyYWludC4KKyAgICAgIGNvbnN0IExvb3AgKmdldEFzc29jaWF0ZWRMb29wKCkgY29uc3Q7CisKKyAgICAgIC8vLyBzZXRQb2ludCAtIENoYW5nZSBhIGNvbnN0cmFpbnQgdG8gUG9pbnQuCisgICAgICB2b2lkIHNldFBvaW50KGNvbnN0IFNDRVYgKlgsIGNvbnN0IFNDRVYgKlksIGNvbnN0IExvb3AgKkN1cnJlbnRMb29wKTsKKworICAgICAgLy8vIHNldExpbmUgLSBDaGFuZ2UgYSBjb25zdHJhaW50IHRvIExpbmUuCisgICAgICB2b2lkIHNldExpbmUoY29uc3QgU0NFViAqQSwgY29uc3QgU0NFViAqQiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpDLCBjb25zdCBMb29wICpDdXJyZW50TG9vcCk7CisKKyAgICAgIC8vLyBzZXREaXN0YW5jZSAtIENoYW5nZSBhIGNvbnN0cmFpbnQgdG8gRGlzdGFuY2UuCisgICAgICB2b2lkIHNldERpc3RhbmNlKGNvbnN0IFNDRVYgKkQsIGNvbnN0IExvb3AgKkN1cnJlbnRMb29wKTsKKworICAgICAgLy8vIHNldEVtcHR5IC0gQ2hhbmdlIGEgY29uc3RyYWludCB0byBFbXB0eS4KKyAgICAgIHZvaWQgc2V0RW1wdHkoKTsKKworICAgICAgLy8vIHNldEFueSAtIENoYW5nZSBhIGNvbnN0cmFpbnQgdG8gQW55LgorICAgICAgdm9pZCBzZXRBbnkoU2NhbGFyRXZvbHV0aW9uICpTRSk7CisKKyAgICAgIC8vLyBkdW1wIC0gRm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gRHVtcHMgdGhlIGNvbnN0cmFpbnQKKyAgICAgIC8vLyBvdXQgdG8gT1MuCisgICAgICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgICB9OworCisgICAgLy8vIGVzdGFibGlzaE5lc3RpbmdMZXZlbHMgLSBFeGFtaW5lcyB0aGUgbG9vcCBuZXN0aW5nIG9mIHRoZSBTcmMgYW5kIERzdAorICAgIC8vLyBpbnN0cnVjdGlvbnMgYW5kIGVzdGFibGlzaGVzIHRoZWlyIHNoYXJlZCBsb29wcy4gU2V0cyB0aGUgdmFyaWFibGVzCisgICAgLy8vIENvbW1vbkxldmVscywgU3JjTGV2ZWxzLCBhbmQgTWF4TGV2ZWxzLgorICAgIC8vLyBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBpbnN0cnVjdGlvbnMgbmVlZG4ndCBiZSBjb250YWluZWQgaW4gdGhlIHNhbWUKKyAgICAvLy8gbG9vcC4gVGhlIHJvdXRpbmUgZXN0YWJsaXNoTmVzdGluZ0xldmVscyBmaW5kcyB0aGUgbGV2ZWwgb2YgbW9zdCBkZWVwbHkKKyAgICAvLy8gbmVzdGVkIGxvb3AgdGhhdCBjb250YWlucyB0aGVtIGJvdGgsIENvbW1vbkxldmVscy4gQW4gaW5zdHJ1Y3Rpb24gdGhhdCdzCisgICAgLy8vIG5vdCBjb250YWluZWQgaW4gYSBsb29wIGlzIGF0IGxldmVsID0gMC4gTWF4TGV2ZWxzIGlzIGVxdWFsIHRvIHRoZSBsZXZlbAorICAgIC8vLyBvZiB0aGUgc291cmNlIHBsdXMgdGhlIGxldmVsIG9mIHRoZSBkZXN0aW5hdGlvbiwgbWludXMgQ29tbW9uTGV2ZWxzLgorICAgIC8vLyBUaGlzIGxldHMgdXMgYWxsb2NhdGUgdmVjdG9ycyBNYXhMZXZlbHMgaW4gbGVuZ3RoLCB3aXRoIHJvb20gZm9yIGV2ZXJ5CisgICAgLy8vIGRpc3RpbmN0IGxvb3AgcmVmZXJlbmNlZCBpbiBib3RoIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHN1YnNjcmlwdHMuCisgICAgLy8vIFRoZSB2YXJpYWJsZSBTcmNMZXZlbHMgaXMgdGhlIG5lc3RpbmcgZGVwdGggb2YgdGhlIHNvdXJjZSBpbnN0cnVjdGlvbi4KKyAgICAvLy8gSXQncyB1c2VkIHRvIGhlbHAgY2FsY3VsYXRlIGRpc3RpbmN0IGxvb3BzIHJlZmVyZW5jZWQgYnkgdGhlIGRlc3RpbmF0aW9uLgorICAgIC8vLyBIZXJlJ3MgdGhlIG1hcCBmcm9tIGxvb3BzIHRvIGxldmVsczoKKyAgICAvLy8gICAgICAgICAgICAwIC0gdW51c2VkCisgICAgLy8vICAgICAgICAgICAgMSAtIG91dGVybW9zdCBjb21tb24gbG9vcAorICAgIC8vLyAgICAgICAgICAuLi4gLSBvdGhlciBjb21tb24gbG9vcHMKKyAgICAvLy8gQ29tbW9uTGV2ZWxzIC0gaW5uZXJtb3N0IGNvbW1vbiBsb29wCisgICAgLy8vICAgICAgICAgIC4uLiAtIGxvb3BzIGNvbnRhaW5pbmcgU3JjIGJ1dCBub3QgRHN0CisgICAgLy8vICAgIFNyY0xldmVscyAtIGlubmVybW9zdCBsb29wIGNvbnRhaW5pbmcgU3JjIGJ1dCBub3QgRHN0CisgICAgLy8vICAgICAgICAgIC4uLiAtIGxvb3BzIGNvbnRhaW5pbmcgRHN0IGJ1dCBub3QgU3JjCisgICAgLy8vICAgIE1heExldmVscyAtIGlubmVybW9zdCBsb29wIGNvbnRhaW5pbmcgRHN0IGJ1dCBub3QgU3JjCisgICAgLy8vIENvbnNpZGVyIHRoZSBmb2xsb3cgY29kZSBmcmFnbWVudDoKKyAgICAvLy8gICAgZm9yIChhID0gLi4uKSB7CisgICAgLy8vICAgICAgZm9yIChiID0gLi4uKSB7CisgICAgLy8vICAgICAgICBmb3IgKGMgPSAuLi4pIHsKKyAgICAvLy8gICAgICAgICAgZm9yIChkID0gLi4uKSB7CisgICAgLy8vICAgICAgICAgICAgQVtdID0gLi4uOworICAgIC8vLyAgICAgICAgICB9CisgICAgLy8vICAgICAgICB9CisgICAgLy8vICAgICAgICBmb3IgKGUgPSAuLi4pIHsKKyAgICAvLy8gICAgICAgICAgZm9yIChmID0gLi4uKSB7CisgICAgLy8vICAgICAgICAgICAgZm9yIChnID0gLi4uKSB7CisgICAgLy8vICAgICAgICAgICAgICAuLi4gPSBBW107CisgICAgLy8vICAgICAgICAgICAgfQorICAgIC8vLyAgICAgICAgICB9CisgICAgLy8vICAgICAgICB9CisgICAgLy8vICAgICAgfQorICAgIC8vLyAgICB9CisgICAgLy8vIElmIHdlJ3JlIGxvb2tpbmcgYXQgdGhlIHBvc3NpYmlsaXR5IG9mIGEgZGVwZW5kZW5jZSBiZXR3ZWVuIHRoZSBzdG9yZQorICAgIC8vLyB0byBBICh0aGUgU3JjKSBhbmQgdGhlIGxvYWQgZnJvbSBBICh0aGUgRHN0KSwgd2UnbGwgbm90ZSB0aGF0IHRoZXkKKyAgICAvLy8gaGF2ZSAyIGxvb3BzIGluIGNvbW1vbiwgc28gQ29tbW9uTGV2ZWxzIHdpbGwgZXF1YWwgMiBhbmQgdGhlIGRpcmVjdGlvbgorICAgIC8vLyB2ZWN0b3IgZm9yIFJlc3VsdCB3aWxsIGhhdmUgMiBlbnRyaWVzLiBTcmNMZXZlbHMgPSA0IGFuZCBNYXhMZXZlbHMgPSA3LgorICAgIC8vLyBBIG1hcCBmcm9tIGxvb3AgbmFtZXMgdG8gbGV2ZWwgaW5kaWNlcyB3b3VsZCBsb29rIGxpa2UKKyAgICAvLy8gICAgIGEgLSAxCisgICAgLy8vICAgICBiIC0gMiA9IENvbW1vbkxldmVscworICAgIC8vLyAgICAgYyAtIDMKKyAgICAvLy8gICAgIGQgLSA0ID0gU3JjTGV2ZWxzCisgICAgLy8vICAgICBlIC0gNQorICAgIC8vLyAgICAgZiAtIDYKKyAgICAvLy8gICAgIGcgLSA3ID0gTWF4TGV2ZWxzCisgICAgdm9pZCBlc3RhYmxpc2hOZXN0aW5nTGV2ZWxzKGNvbnN0IEluc3RydWN0aW9uICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpEc3QpOworCisgICAgdW5zaWduZWQgQ29tbW9uTGV2ZWxzLCBTcmNMZXZlbHMsIE1heExldmVsczsKKworICAgIC8vLyBtYXBTcmNMb29wIC0gR2l2ZW4gb25lIG9mIHRoZSBsb29wcyBjb250YWluaW5nIHRoZSBzb3VyY2UsIHJldHVybgorICAgIC8vLyBpdHMgbGV2ZWwgaW5kZXggaW4gb3VyIG51bWJlcmluZyBzY2hlbWUuCisgICAgdW5zaWduZWQgbWFwU3JjTG9vcChjb25zdCBMb29wICpTcmNMb29wKSBjb25zdDsKKworICAgIC8vLyBtYXBEc3RMb29wIC0gR2l2ZW4gb25lIG9mIHRoZSBsb29wcyBjb250YWluaW5nIHRoZSBkZXN0aW5hdGlvbiwKKyAgICAvLy8gcmV0dXJuIGl0cyBsZXZlbCBpbmRleCBpbiBvdXIgbnVtYmVyaW5nIHNjaGVtZS4KKyAgICB1bnNpZ25lZCBtYXBEc3RMb29wKGNvbnN0IExvb3AgKkRzdExvb3ApIGNvbnN0OworCisgICAgLy8vIGlzTG9vcEludmFyaWFudCAtIFJldHVybnMgdHJ1ZSBpZiBFeHByZXNzaW9uIGlzIGxvb3AgaW52YXJpYW50CisgICAgLy8vIGluIExvb3BOZXN0LgorICAgIGJvb2wgaXNMb29wSW52YXJpYW50KGNvbnN0IFNDRVYgKkV4cHJlc3Npb24sIGNvbnN0IExvb3AgKkxvb3BOZXN0KSBjb25zdDsKKworICAgIC8vLyBNYWtlcyBzdXJlIGFsbCBzdWJzY3JpcHQgcGFpcnMgc2hhcmUgdGhlIHNhbWUgaW50ZWdlciB0eXBlIGJ5CisgICAgLy8vIHNpZ24tZXh0ZW5kaW5nIGFzIG5lY2Vzc2FyeS4KKyAgICAvLy8gU2lnbi1leHRlbmRpbmcgYSBzdWJzY3JpcHQgaXMgc2FmZSBiZWNhdXNlIGdldGVsZW1lbnRwdHIgYXNzdW1lcyB0aGUKKyAgICAvLy8gYXJyYXkgc3Vic2NyaXB0cyBhcmUgc2lnbmVkLgorICAgIHZvaWQgdW5pZnlTdWJzY3JpcHRUeXBlKEFycmF5UmVmPFN1YnNjcmlwdCAqPiBQYWlycyk7CisKKyAgICAvLy8gcmVtb3ZlTWF0Y2hpbmdFeHRlbnNpb25zIC0gRXhhbWluZXMgYSBzdWJzY3JpcHQgcGFpci4KKyAgICAvLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIGlkZW50aWNhbGx5IHNpZ24gKG9yIHplcm8pCisgICAgLy8vIGV4dGVuZGVkLCBpdCBzdHJpcHMgb2ZmIHRoZSBleHRlbnNpb24gaW4gYW4gZWZmb3J0IHRvCisgICAgLy8vIHNpbXBsaWZ5IHRoZSBhY3R1YWwgYW5hbHlzaXMuCisgICAgdm9pZCByZW1vdmVNYXRjaGluZ0V4dGVuc2lvbnMoU3Vic2NyaXB0ICpQYWlyKTsKKworICAgIC8vLyBjb2xsZWN0Q29tbW9uTG9vcHMgLSBGaW5kcyB0aGUgc2V0IG9mIGxvb3BzIGZyb20gdGhlIExvb3BOZXN0IHRoYXQKKyAgICAvLy8gaGF2ZSBhIGxldmVsIDw9IENvbW1vbkxldmVscyBhbmQgYXJlIHJlZmVycmVkIHRvIGJ5IHRoZSBTQ0VWIEV4cHJlc3Npb24uCisgICAgdm9pZCBjb2xsZWN0Q29tbW9uTG9vcHMoY29uc3QgU0NFViAqRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMb29wTmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbEJpdFZlY3RvciAmTG9vcHMpIGNvbnN0OworCisgICAgLy8vIGNoZWNrU3JjU3Vic2NyaXB0IC0gRXhhbWluZXMgdGhlIFNDRVYgU3JjLCByZXR1cm5pbmcgdHJ1ZSBpZmYgaXQncworICAgIC8vLyBsaW5lYXIuIENvbGxlY3QgdGhlIHNldCBvZiBsb29wcyBtZW50aW9uZWQgYnkgU3JjLgorICAgIGJvb2wgY2hlY2tTcmNTdWJzY3JpcHQoY29uc3QgU0NFViAqU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqTG9vcE5lc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbEJpdFZlY3RvciAmTG9vcHMpOworCisgICAgLy8vIGNoZWNrRHN0U3Vic2NyaXB0IC0gRXhhbWluZXMgdGhlIFNDRVYgRHN0LCByZXR1cm5pbmcgdHJ1ZSBpZmYgaXQncworICAgIC8vLyBsaW5lYXIuIENvbGxlY3QgdGhlIHNldCBvZiBsb29wcyBtZW50aW9uZWQgYnkgRHN0LgorICAgIGJvb2wgY2hlY2tEc3RTdWJzY3JpcHQoY29uc3QgU0NFViAqRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqTG9vcE5lc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbEJpdFZlY3RvciAmTG9vcHMpOworCisgICAgLy8vIGlzS25vd25QcmVkaWNhdGUgLSBDb21wYXJlIFggYW5kIFkgdXNpbmcgdGhlIHByZWRpY2F0ZSBQcmVkLgorICAgIC8vLyBCYXNpY2FsbHkgYSB3cmFwcGVyIGZvciBTQ0VWOjppc0tub3duUHJlZGljYXRlLAorICAgIC8vLyBidXQgdHJpZXMgaGFyZGVyLCBlc3BlY2lhbGx5IGluIHRoZSBwcmVzZW5jZSBvZiBzaWduIGFuZCB6ZXJvCisgICAgLy8vIGV4dGVuc2lvbnMgYW5kIHN5bWJvbGljcy4KKyAgICBib29sIGlzS25vd25QcmVkaWNhdGUoSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpYLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpZKSBjb25zdDsKKworICAgIC8vLyBjb2xsZWN0VXBwZXJCb3VuZCAtIEFsbCBzdWJzY3JpcHRzIGFyZSB0aGUgc2FtZSB0eXBlIChvbiBteSBtYWNoaW5lLAorICAgIC8vLyBhbiBpNjQpLiBUaGUgbG9vcCBib3VuZCBtYXkgYmUgYSBzbWFsbGVyIHR5cGUuIGNvbGxlY3RVcHBlckJvdW5kCisgICAgLy8vIGZpbmQgdGhlIGJvdW5kLCBpZiBhdmFpbGFibGUsIGFuZCB6ZXJvIGV4dGVuZHMgaXQgdG8gdGhlIFR5cGUgVC4KKyAgICAvLy8gKEkgemVybyBleHRlbmQgc2luY2UgdGhlIGJvdW5kIHNob3VsZCBhbHdheXMgYmUgPj0gMC4pCisgICAgLy8vIElmIG5vIHVwcGVyIGJvdW5kIGlzIGF2YWlsYWJsZSwgcmV0dXJuIE5VTEwuCisgICAgY29uc3QgU0NFViAqY29sbGVjdFVwcGVyQm91bmQoY29uc3QgTG9vcCAqbCwgVHlwZSAqVCkgY29uc3Q7CisKKyAgICAvLy8gY29sbGVjdENvbnN0YW50VXBwZXJCb3VuZCAtIENhbGxzIGNvbGxlY3RVcHBlckJvdW5kKCksIHRoZW4KKyAgICAvLy8gYXR0ZW1wdHMgdG8gY2FzdCBpdCB0byBTQ0VWQ29uc3RhbnQuIElmIHRoZSBjYXN0IGZhaWxzLAorICAgIC8vLyByZXR1cm5zIE5VTEwuCisgICAgY29uc3QgU0NFVkNvbnN0YW50ICpjb2xsZWN0Q29uc3RhbnRVcHBlckJvdW5kKGNvbnN0IExvb3AgKmwsIFR5cGUgKlQpIGNvbnN0OworCisgICAgLy8vIGNsYXNzaWZ5UGFpciAtIEV4YW1pbmVzIHRoZSBzdWJzY3JpcHQgcGFpciAodGhlIFNyYyBhbmQgRHN0IFNDRVZzKQorICAgIC8vLyBhbmQgY2xhc3NpZmllcyBpdCBhcyBlaXRoZXIgWklWLCBTSVYsIFJESVYsIE1JViwgb3IgTm9ubGluZWFyLgorICAgIC8vLyBDb2xsZWN0cyB0aGUgYXNzb2NpYXRlZCBsb29wcyBpbiBhIHNldC4KKyAgICBTdWJzY3JpcHQ6OkNsYXNzaWZpY2F0aW9uS2luZCBjbGFzc2lmeVBhaXIoY29uc3QgU0NFViAqU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKlNyY0xvb3BOZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpEc3RMb29wTmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbEJpdFZlY3RvciAmTG9vcHMpOworCisgICAgLy8vIHRlc3RaSVYgLSBUZXN0cyB0aGUgWklWIHN1YnNjcmlwdCBwYWlyIChTcmMgYW5kIERzdCkgZm9yIGRlcGVuZGVuY2UuCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgcG9zc2libGUgZGVwZW5kZW5jZSBpcyBkaXNwcm92ZWQuCisgICAgLy8vIElmIHRoZXJlIG1pZ2h0IGJlIGEgZGVwZW5kZW5jZSwgcmV0dXJucyBmYWxzZS4KKyAgICAvLy8gSWYgdGhlIGRlcGVuZGVuY2UgaXNuJ3QgcHJvdmVuIHRvIGV4aXN0LAorICAgIC8vLyBtYXJrcyB0aGUgUmVzdWx0IGFzIGluY29uc2lzdGVudC4KKyAgICBib29sIHRlc3RaSVYoY29uc3QgU0NFViAqU3JjLAorICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpEc3QsCisgICAgICAgICAgICAgICAgIEZ1bGxEZXBlbmRlbmNlICZSZXN1bHQpIGNvbnN0OworCisgICAgLy8vIHRlc3RTSVYgLSBUZXN0cyB0aGUgU0lWIHN1YnNjcmlwdCBwYWlyIChTcmMgYW5kIERzdCkgZm9yIGRlcGVuZGVuY2UuCisgICAgLy8vIFRoaW5ncyBvZiB0aGUgZm9ybSBbYzEgKyBhMSppXSBhbmQgW2MyICsgYTIqal0sIHdoZXJlCisgICAgLy8vIGkgYW5kIGogYXJlIGluZHVjdGlvbiB2YXJpYWJsZXMsIGMxIGFuZCBjMiBhcmUgbG9vcCBpbnZhcmlhbnQsCisgICAgLy8vIGFuZCBhMSBhbmQgYTIgYXJlIGNvbnN0YW50LgorICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW55IHBvc3NpYmxlIGRlcGVuZGVuY2UgaXMgZGlzcHJvdmVkLgorICAgIC8vLyBJZiB0aGVyZSBtaWdodCBiZSBhIGRlcGVuZGVuY2UsIHJldHVybnMgZmFsc2UuCisgICAgLy8vIFNldHMgYXBwcm9wcmlhdGUgZGlyZWN0aW9uIHZlY3RvciBlbnRyeSBhbmQsIHdoZW4gcG9zc2libGUsCisgICAgLy8vIHRoZSBkaXN0YW5jZSB2ZWN0b3IgZW50cnkuCisgICAgLy8vIElmIHRoZSBkZXBlbmRlbmNlIGlzbid0IHByb3ZlbiB0byBleGlzdCwKKyAgICAvLy8gbWFya3MgdGhlIFJlc3VsdCBhcyBpbmNvbnNpc3RlbnQuCisgICAgYm9vbCB0ZXN0U0lWKGNvbnN0IFNDRVYgKlNyYywKKyAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRHN0LAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTGV2ZWwsCisgICAgICAgICAgICAgICAgIEZ1bGxEZXBlbmRlbmNlICZSZXN1bHQsCisgICAgICAgICAgICAgICAgIENvbnN0cmFpbnQgJk5ld0NvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKiZTcGxpdEl0ZXIpIGNvbnN0OworCisgICAgLy8vIHRlc3RSRElWIC0gVGVzdHMgdGhlIFJESVYgc3Vic2NyaXB0IHBhaXIgKFNyYyBhbmQgRHN0KSBmb3IgZGVwZW5kZW5jZS4KKyAgICAvLy8gVGhpbmdzIG9mIHRoZSBmb3JtIFtjMSArIGExKmldIGFuZCBbYzIgKyBhMipqXQorICAgIC8vLyB3aGVyZSBpIGFuZCBqIGFyZSBpbmR1Y3Rpb24gdmFyaWFibGVzLCBjMSBhbmQgYzIgYXJlIGxvb3AgaW52YXJpYW50LAorICAgIC8vLyBhbmQgYTEgYW5kIGEyIGFyZSBjb25zdGFudC4KKyAgICAvLy8gV2l0aCBtaW5vciBhbGdlYnJhLCB0aGlzIHRlc3QgY2FuIGFsc28gYmUgdXNlZCBmb3IgdGhpbmdzIGxpa2UKKyAgICAvLy8gW2MxICsgYTEqaSArIGEyKmpdW2MyXS4KKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGFueSBwb3NzaWJsZSBkZXBlbmRlbmNlIGlzIGRpc3Byb3ZlZC4KKyAgICAvLy8gSWYgdGhlcmUgbWlnaHQgYmUgYSBkZXBlbmRlbmNlLCByZXR1cm5zIGZhbHNlLgorICAgIC8vLyBNYXJrcyB0aGUgUmVzdWx0IGFzIGluY29uc2lzdGVudC4KKyAgICBib29sIHRlc3RSRElWKGNvbnN0IFNDRVYgKlNyYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkRzdCwKKyAgICAgICAgICAgICAgICAgIEZ1bGxEZXBlbmRlbmNlICZSZXN1bHQpIGNvbnN0OworCisgICAgLy8vIHRlc3RNSVYgLSBUZXN0cyB0aGUgTUlWIHN1YnNjcmlwdCBwYWlyIChTcmMgYW5kIERzdCkgZm9yIGRlcGVuZGVuY2UuCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBkZXBlbmRlbmNlIGRpc3Byb3ZlZC4KKyAgICAvLy8gQ2FuIHNvbWV0aW1lcyByZWZpbmUgZGlyZWN0aW9uIHZlY3RvcnMuCisgICAgYm9vbCB0ZXN0TUlWKGNvbnN0IFNDRVYgKlNyYywKKyAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRHN0LAorICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbEJpdFZlY3RvciAmTG9vcHMsCisgICAgICAgICAgICAgICAgIEZ1bGxEZXBlbmRlbmNlICZSZXN1bHQpIGNvbnN0OworCisgICAgLy8vIHN0cm9uZ1NJVnRlc3QgLSBUZXN0cyB0aGUgc3Ryb25nIFNJViBzdWJzY3JpcHQgcGFpciAoU3JjIGFuZCBEc3QpCisgICAgLy8vIGZvciBkZXBlbmRlbmNlLgorICAgIC8vLyBUaGluZ3Mgb2YgdGhlIGZvcm0gW2MxICsgYSppXSBhbmQgW2MyICsgYSppXSwKKyAgICAvLy8gd2hlcmUgaSBpcyBhbiBpbmR1Y3Rpb24gdmFyaWFibGUsIGMxIGFuZCBjMiBhcmUgbG9vcCBpbnZhcmlhbnQsCisgICAgLy8vIGFuZCBhIGlzIGEgY29uc3RhbnQKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGFueSBwb3NzaWJsZSBkZXBlbmRlbmNlIGlzIGRpc3Byb3ZlZC4KKyAgICAvLy8gSWYgdGhlcmUgbWlnaHQgYmUgYSBkZXBlbmRlbmNlLCByZXR1cm5zIGZhbHNlLgorICAgIC8vLyBTZXRzIGFwcHJvcHJpYXRlIGRpcmVjdGlvbiBhbmQgZGlzdGFuY2UuCisgICAgYm9vbCBzdHJvbmdTSVZ0ZXN0KGNvbnN0IFNDRVYgKkNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpTcmNDb25zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRHN0Q29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkN1cnJlbnRMb29wLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgRnVsbERlcGVuZGVuY2UgJlJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludCAmTmV3Q29uc3RyYWludCkgY29uc3Q7CisKKyAgICAvLy8gd2Vha0Nyb3NzaW5nU0lWdGVzdCAtIFRlc3RzIHRoZSB3ZWFrLWNyb3NzaW5nIFNJViBzdWJzY3JpcHQgcGFpcgorICAgIC8vLyAoU3JjIGFuZCBEc3QpIGZvciBkZXBlbmRlbmNlLgorICAgIC8vLyBUaGluZ3Mgb2YgdGhlIGZvcm0gW2MxICsgYSppXSBhbmQgW2MyIC0gYSppXSwKKyAgICAvLy8gd2hlcmUgaSBpcyBhbiBpbmR1Y3Rpb24gdmFyaWFibGUsIGMxIGFuZCBjMiBhcmUgbG9vcCBpbnZhcmlhbnQsCisgICAgLy8vIGFuZCBhIGlzIGEgY29uc3RhbnQuCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgcG9zc2libGUgZGVwZW5kZW5jZSBpcyBkaXNwcm92ZWQuCisgICAgLy8vIElmIHRoZXJlIG1pZ2h0IGJlIGEgZGVwZW5kZW5jZSwgcmV0dXJucyBmYWxzZS4KKyAgICAvLy8gU2V0cyBhcHByb3ByaWF0ZSBkaXJlY3Rpb24gZW50cnkuCisgICAgLy8vIFNldCBjb25zaXN0ZW50IHRvIGZhbHNlLgorICAgIC8vLyBNYXJrcyB0aGUgZGVwZW5kZW5jZSBhcyBzcGxpdGFibGUuCisgICAgYm9vbCB3ZWFrQ3Jvc3NpbmdTSVZ0ZXN0KGNvbnN0IFNDRVYgKlNyY0NvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpTcmNDb25zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRHN0Q29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkN1cnJlbnRMb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVsbERlcGVuZGVuY2UgJlJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludCAmTmV3Q29uc3RyYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqJlNwbGl0SXRlcikgY29uc3Q7CisKKyAgICAvLy8gRXhhY3RTSVZ0ZXN0IC0gVGVzdHMgdGhlIFNJViBzdWJzY3JpcHQgcGFpcgorICAgIC8vLyAoU3JjIGFuZCBEc3QpIGZvciBkZXBlbmRlbmNlLgorICAgIC8vLyBUaGluZ3Mgb2YgdGhlIGZvcm0gW2MxICsgYTEqaV0gYW5kIFtjMiArIGEyKmldLAorICAgIC8vLyB3aGVyZSBpIGlzIGFuIGluZHVjdGlvbiB2YXJpYWJsZSwgYzEgYW5kIGMyIGFyZSBsb29wIGludmFyaWFudCwKKyAgICAvLy8gYW5kIGExIGFuZCBhMiBhcmUgY29uc3RhbnQuCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgcG9zc2libGUgZGVwZW5kZW5jZSBpcyBkaXNwcm92ZWQuCisgICAgLy8vIElmIHRoZXJlIG1pZ2h0IGJlIGEgZGVwZW5kZW5jZSwgcmV0dXJucyBmYWxzZS4KKyAgICAvLy8gU2V0cyBhcHByb3ByaWF0ZSBkaXJlY3Rpb24gZW50cnkuCisgICAgLy8vIFNldCBjb25zaXN0ZW50IHRvIGZhbHNlLgorICAgIGJvb2wgZXhhY3RTSVZ0ZXN0KGNvbnN0IFNDRVYgKlNyY0NvZWZmLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkRzdENvZWZmLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlNyY0NvbnN0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkRzdENvbnN0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkN1cnJlbnRMb29wLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgIEZ1bGxEZXBlbmRlbmNlICZSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludCAmTmV3Q29uc3RyYWludCkgY29uc3Q7CisKKyAgICAvLy8gd2Vha1plcm9TcmNTSVZ0ZXN0IC0gVGVzdHMgdGhlIHdlYWstemVybyBTSVYgc3Vic2NyaXB0IHBhaXIKKyAgICAvLy8gKFNyYyBhbmQgRHN0KSBmb3IgZGVwZW5kZW5jZS4KKyAgICAvLy8gVGhpbmdzIG9mIHRoZSBmb3JtIFtjMV0gYW5kIFtjMiArIGEqaV0sCisgICAgLy8vIHdoZXJlIGkgaXMgYW4gaW5kdWN0aW9uIHZhcmlhYmxlLCBjMSBhbmQgYzIgYXJlIGxvb3AgaW52YXJpYW50LAorICAgIC8vLyBhbmQgYSBpcyBhIGNvbnN0YW50LiBTZWUgYWxzbyB3ZWFrWmVyb0RzdFNJVnRlc3QuCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgcG9zc2libGUgZGVwZW5kZW5jZSBpcyBkaXNwcm92ZWQuCisgICAgLy8vIElmIHRoZXJlIG1pZ2h0IGJlIGEgZGVwZW5kZW5jZSwgcmV0dXJucyBmYWxzZS4KKyAgICAvLy8gU2V0cyBhcHByb3ByaWF0ZSBkaXJlY3Rpb24gZW50cnkuCisgICAgLy8vIFNldCBjb25zaXN0ZW50IHRvIGZhbHNlLgorICAgIC8vLyBJZiBsb29wIHBlZWxpbmcgd2lsbCBicmVhayB0aGUgZGVwZW5kZW5jZSwgbWFyayBhcHByb3ByaWF0ZWx5LgorICAgIGJvb2wgd2Vha1plcm9TcmNTSVZ0ZXN0KGNvbnN0IFNDRVYgKkRzdENvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlNyY0NvbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkRzdENvbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkN1cnJlbnRMb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bGxEZXBlbmRlbmNlICZSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludCAmTmV3Q29uc3RyYWludCkgY29uc3Q7CisKKyAgICAvLy8gd2Vha1plcm9Ec3RTSVZ0ZXN0IC0gVGVzdHMgdGhlIHdlYWstemVybyBTSVYgc3Vic2NyaXB0IHBhaXIKKyAgICAvLy8gKFNyYyBhbmQgRHN0KSBmb3IgZGVwZW5kZW5jZS4KKyAgICAvLy8gVGhpbmdzIG9mIHRoZSBmb3JtIFtjMSArIGEqaV0gYW5kIFtjMl0sCisgICAgLy8vIHdoZXJlIGkgaXMgYW4gaW5kdWN0aW9uIHZhcmlhYmxlLCBjMSBhbmQgYzIgYXJlIGxvb3AgaW52YXJpYW50LAorICAgIC8vLyBhbmQgYSBpcyBhIGNvbnN0YW50LiBTZWUgYWxzbyB3ZWFrWmVyb1NyY1NJVnRlc3QuCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgcG9zc2libGUgZGVwZW5kZW5jZSBpcyBkaXNwcm92ZWQuCisgICAgLy8vIElmIHRoZXJlIG1pZ2h0IGJlIGEgZGVwZW5kZW5jZSwgcmV0dXJucyBmYWxzZS4KKyAgICAvLy8gU2V0cyBhcHByb3ByaWF0ZSBkaXJlY3Rpb24gZW50cnkuCisgICAgLy8vIFNldCBjb25zaXN0ZW50IHRvIGZhbHNlLgorICAgIC8vLyBJZiBsb29wIHBlZWxpbmcgd2lsbCBicmVhayB0aGUgZGVwZW5kZW5jZSwgbWFyayBhcHByb3ByaWF0ZWx5LgorICAgIGJvb2wgd2Vha1plcm9Ec3RTSVZ0ZXN0KGNvbnN0IFNDRVYgKlNyY0NvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlNyY0NvbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkRzdENvbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkN1cnJlbnRMb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bGxEZXBlbmRlbmNlICZSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludCAmTmV3Q29uc3RyYWludCkgY29uc3Q7CisKKyAgICAvLy8gZXhhY3RSRElWdGVzdCAtIFRlc3RzIHRoZSBSRElWIHN1YnNjcmlwdCBwYWlyIGZvciBkZXBlbmRlbmNlLgorICAgIC8vLyBUaGluZ3Mgb2YgdGhlIGZvcm0gW2MxICsgYSppXSBhbmQgW2MyICsgYipqXSwKKyAgICAvLy8gd2hlcmUgaSBhbmQgaiBhcmUgaW5kdWN0aW9uIHZhcmlhYmxlLCBjMSBhbmQgYzIgYXJlIGxvb3AgaW52YXJpYW50LAorICAgIC8vLyBhbmQgYSBhbmQgYiBhcmUgY29uc3RhbnRzLgorICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW55IHBvc3NpYmxlIGRlcGVuZGVuY2UgaXMgZGlzcHJvdmVkLgorICAgIC8vLyBNYXJrcyB0aGUgcmVzdWx0IGFzIGluY29uc2lzdGVudC4KKyAgICAvLy8gV29ya3MgaW4gc29tZSBjYXNlcyB0aGF0IHN5bWJvbGljUkRJVnRlc3QgZG9lc24ndCwKKyAgICAvLy8gYW5kIHZpY2UgdmVyc2EuCisgICAgYm9vbCBleGFjdFJESVZ0ZXN0KGNvbnN0IFNDRVYgKlNyY0NvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpEc3RDb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqU3JjQ29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkRzdENvbnN0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpTcmNMb29wLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpEc3RMb29wLAorICAgICAgICAgICAgICAgICAgICAgICBGdWxsRGVwZW5kZW5jZSAmUmVzdWx0KSBjb25zdDsKKworICAgIC8vLyBzeW1ib2xpY1JESVZ0ZXN0IC0gVGVzdHMgdGhlIFJESVYgc3Vic2NyaXB0IHBhaXIgZm9yIGRlcGVuZGVuY2UuCisgICAgLy8vIFRoaW5ncyBvZiB0aGUgZm9ybSBbYzEgKyBhKmldIGFuZCBbYzIgKyBiKmpdLAorICAgIC8vLyB3aGVyZSBpIGFuZCBqIGFyZSBpbmR1Y3Rpb24gdmFyaWFibGUsIGMxIGFuZCBjMiBhcmUgbG9vcCBpbnZhcmlhbnQsCisgICAgLy8vIGFuZCBhIGFuZCBiIGFyZSBjb25zdGFudHMuCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgcG9zc2libGUgZGVwZW5kZW5jZSBpcyBkaXNwcm92ZWQuCisgICAgLy8vIE1hcmtzIHRoZSByZXN1bHQgYXMgaW5jb25zaXN0ZW50LgorICAgIC8vLyBXb3JrcyBpbiBzb21lIGNhc2VzIHRoYXQgZXhhY3RSRElWdGVzdCBkb2Vzbid0LAorICAgIC8vLyBhbmQgdmljZSB2ZXJzYS4gQ2FuIGFsc28gYmUgdXNlZCBhcyBhIGJhY2t1cCBmb3IKKyAgICAvLy8gb3JkaW5hcnkgU0lWIHRlc3RzLgorICAgIGJvb2wgc3ltYm9saWNSRElWdGVzdChjb25zdCBTQ0VWICpTcmNDb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRHN0Q29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlNyY0NvbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpEc3RDb25zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqU3JjTG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqRHN0TG9vcCkgY29uc3Q7CisKKyAgICAvLy8gZ2NkTUlWdGVzdCAtIFRlc3RzIGFuIE1JViBzdWJzY3JpcHQgcGFpciBmb3IgZGVwZW5kZW5jZS4KKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGFueSBwb3NzaWJsZSBkZXBlbmRlbmNlIGlzIGRpc3Byb3ZlZC4KKyAgICAvLy8gTWFya3MgdGhlIHJlc3VsdCBhcyBpbmNvbnNpc3RlbnQuCisgICAgLy8vIENhbiBzb21ldGltZXMgZGlzcHJvdmUgdGhlIGVxdWFsIGRpcmVjdGlvbiBmb3IgMSBvciBtb3JlIGxvb3BzLgorICAgIC8vICBDYW4gaGFuZGxlIHNvbWUgc3ltYm9saWNzIHRoYXQgZXZlbiB0aGUgU0lWIHRlc3RzIGRvbid0IGdldCwKKyAgICAvLy8gc28gd2UgdXNlIGl0IGFzIGEgYmFja3VwIGZvciBldmVyeXRoaW5nLgorICAgIGJvb2wgZ2NkTUlWdGVzdChjb25zdCBTQ0VWICpTcmMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkRzdCwKKyAgICAgICAgICAgICAgICAgICAgRnVsbERlcGVuZGVuY2UgJlJlc3VsdCkgY29uc3Q7CisKKyAgICAvLy8gYmFuZXJqZWVNSVZ0ZXN0IC0gVGVzdHMgYW4gTUlWIHN1YnNjcmlwdCBwYWlyIGZvciBkZXBlbmRlbmNlLgorICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW55IHBvc3NpYmxlIGRlcGVuZGVuY2UgaXMgZGlzcHJvdmVkLgorICAgIC8vLyBNYXJrcyB0aGUgcmVzdWx0IGFzIGluY29uc2lzdGVudC4KKyAgICAvLy8gQ29tcHV0ZXMgZGlyZWN0aW9ucy4KKyAgICBib29sIGJhbmVyamVlTUlWdGVzdChjb25zdCBTQ0VWICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsQml0VmVjdG9yICZMb29wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGdWxsRGVwZW5kZW5jZSAmUmVzdWx0KSBjb25zdDsKKworICAgIC8vLyBjb2xsZWN0Q29lZmZpY2llbnRJbmZvIC0gV2Fsa3MgdGhyb3VnaCB0aGUgc3Vic2NyaXB0LAorICAgIC8vLyBjb2xsZWN0aW5nIGVhY2ggY29lZmZpY2llbnQsIHRoZSBhc3NvY2lhdGVkIGxvb3AgYm91bmRzLAorICAgIC8vLyBhbmQgcmVjb3JkaW5nIGl0cyBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgcGFydHMgZm9yIGxhdGVyIHVzZS4KKyAgICBDb2VmZmljaWVudEluZm8gKmNvbGxlY3RDb2VmZkluZm8oY29uc3QgU0NFViAqU3Vic2NyaXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNyY0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKiZDb25zdGFudCkgY29uc3Q7CisKKyAgICAvLy8gZ2V0UG9zaXRpdmVQYXJ0IC0gWF4rID0gbWF4KFgsIDApLgorICAgIC8vLworICAgIGNvbnN0IFNDRVYgKmdldFBvc2l0aXZlUGFydChjb25zdCBTQ0VWICpYKSBjb25zdDsKKworICAgIC8vLyBnZXROZWdhdGl2ZVBhcnQgLSBYXi0gPSBtaW4oWCwgMCkuCisgICAgLy8vCisgICAgY29uc3QgU0NFViAqZ2V0TmVnYXRpdmVQYXJ0KGNvbnN0IFNDRVYgKlgpIGNvbnN0OworCisgICAgLy8vIGdldExvd2VyQm91bmQgLSBMb29rcyB0aHJvdWdoIGFsbCB0aGUgYm91bmRzIGluZm8gYW5kCisgICAgLy8vIGNvbXB1dGVzIHRoZSBsb3dlciBib3VuZCBnaXZlbiB0aGUgY3VycmVudCBkaXJlY3Rpb24gc2V0dGluZ3MKKyAgICAvLy8gYXQgZWFjaCBsZXZlbC4KKyAgICBjb25zdCBTQ0VWICpnZXRMb3dlckJvdW5kKEJvdW5kSW5mbyAqQm91bmQpIGNvbnN0OworCisgICAgLy8vIGdldFVwcGVyQm91bmQgLSBMb29rcyB0aHJvdWdoIGFsbCB0aGUgYm91bmRzIGluZm8gYW5kCisgICAgLy8vIGNvbXB1dGVzIHRoZSB1cHBlciBib3VuZCBnaXZlbiB0aGUgY3VycmVudCBkaXJlY3Rpb24gc2V0dGluZ3MKKyAgICAvLy8gYXQgZWFjaCBsZXZlbC4KKyAgICBjb25zdCBTQ0VWICpnZXRVcHBlckJvdW5kKEJvdW5kSW5mbyAqQm91bmQpIGNvbnN0OworCisgICAgLy8vIGV4cGxvcmVEaXJlY3Rpb25zIC0gSGllcmFyY2hpY2FsbHkgZXhwYW5kcyB0aGUgZGlyZWN0aW9uIHZlY3RvcgorICAgIC8vLyBzZWFyY2ggc3BhY2UsIGNvbWJpbmluZyB0aGUgZGlyZWN0aW9ucyBvZiBkaXNjb3ZlcmVkIGRlcGVuZGVuY2VzCisgICAgLy8vIGluIHRoZSBEaXJTZXQgZmllbGQgb2YgQm91bmQuIFJldHVybnMgdGhlIG51bWJlciBvZiBkaXN0aW5jdAorICAgIC8vLyBkZXBlbmRlbmNlcyBkaXNjb3ZlcmVkLiBJZiB0aGUgZGVwZW5kZW5jZSBpcyBkaXNwcm92ZWQsCisgICAgLy8vIGl0IHdpbGwgcmV0dXJuIDAuCisgICAgdW5zaWduZWQgZXhwbG9yZURpcmVjdGlvbnModW5zaWduZWQgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29lZmZpY2llbnRJbmZvICpBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZWZmaWNpZW50SW5mbyAqQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZEluZm8gKkJvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsQml0VmVjdG9yICZMb29wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRGVwdGhFeHBhbmRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpEZWx0YSkgY29uc3Q7CisKKyAgICAvLy8gdGVzdEJvdW5kcyAtIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgYm91bmRzIGFyZSBwbGF1c2libGUuCisgICAgYm9vbCB0ZXN0Qm91bmRzKHVuc2lnbmVkIGNoYXIgRGlyS2luZCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgIEJvdW5kSW5mbyAqQm91bmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkRlbHRhKSBjb25zdDsKKworICAgIC8vLyBmaW5kQm91bmRzQUxMIC0gQ29tcHV0ZXMgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgZm9yIGxldmVsIEsKKyAgICAvLy8gdXNpbmcgdGhlICogZGlyZWN0aW9uLiBSZWNvcmRzIHRoZW0gaW4gQm91bmQuCisgICAgdm9pZCBmaW5kQm91bmRzQUxMKENvZWZmaWNpZW50SW5mbyAqQSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ29lZmZpY2llbnRJbmZvICpCLAorICAgICAgICAgICAgICAgICAgICAgICBCb3VuZEluZm8gKkJvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBLKSBjb25zdDsKKworICAgIC8vLyBmaW5kQm91bmRzTFQgLSBDb21wdXRlcyB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBmb3IgbGV2ZWwgSworICAgIC8vLyB1c2luZyB0aGUgPCBkaXJlY3Rpb24uIFJlY29yZHMgdGhlbSBpbiBCb3VuZC4KKyAgICB2b2lkIGZpbmRCb3VuZHNMVChDb2VmZmljaWVudEluZm8gKkEsCisgICAgICAgICAgICAgICAgICAgICAgQ29lZmZpY2llbnRJbmZvICpCLAorICAgICAgICAgICAgICAgICAgICAgIEJvdW5kSW5mbyAqQm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSykgY29uc3Q7CisKKyAgICAvLy8gZmluZEJvdW5kc0dUIC0gQ29tcHV0ZXMgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgZm9yIGxldmVsIEsKKyAgICAvLy8gdXNpbmcgdGhlID4gZGlyZWN0aW9uLiBSZWNvcmRzIHRoZW0gaW4gQm91bmQuCisgICAgdm9pZCBmaW5kQm91bmRzR1QoQ29lZmZpY2llbnRJbmZvICpBLAorICAgICAgICAgICAgICAgICAgICAgIENvZWZmaWNpZW50SW5mbyAqQiwKKyAgICAgICAgICAgICAgICAgICAgICBCb3VuZEluZm8gKkJvdW5kLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEspIGNvbnN0OworCisgICAgLy8vIGZpbmRCb3VuZHNFUSAtIENvbXB1dGVzIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIGZvciBsZXZlbCBLCisgICAgLy8vIHVzaW5nIHRoZSA9IGRpcmVjdGlvbi4gUmVjb3JkcyB0aGVtIGluIEJvdW5kLgorICAgIHZvaWQgZmluZEJvdW5kc0VRKENvZWZmaWNpZW50SW5mbyAqQSwKKyAgICAgICAgICAgICAgICAgICAgICBDb2VmZmljaWVudEluZm8gKkIsCisgICAgICAgICAgICAgICAgICAgICAgQm91bmRJbmZvICpCb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBLKSBjb25zdDsKKworICAgIC8vLyBpbnRlcnNlY3RDb25zdHJhaW50cyAtIFVwZGF0ZXMgWCB3aXRoIHRoZSBpbnRlcnNlY3Rpb24KKyAgICAvLy8gb2YgdGhlIENvbnN0cmFpbnRzIFggYW5kIFkuIFJldHVybnMgdHJ1ZSBpZiBYIGhhcyBjaGFuZ2VkLgorICAgIGJvb2wgaW50ZXJzZWN0Q29uc3RyYWludHMoQ29uc3RyYWludCAqWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN0cmFpbnQgKlkpOworCisgICAgLy8vIHByb3BhZ2F0ZSAtIFJldmlldyB0aGUgY29uc3RyYWludHMsIGxvb2tpbmcgZm9yIG9wcG9ydHVuaXRpZXMKKyAgICAvLy8gdG8gc2ltcGxpZnkgYSBzdWJzY3JpcHQgcGFpciAoU3JjIGFuZCBEc3QpLgorICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBzb21lIHNpbXBsaWZpY2F0aW9uIG9jY3Vycy4KKyAgICAvLy8gSWYgdGhlIHNpbXBsaWZpY2F0aW9uIGlzbid0IGV4YWN0ICh0aGF0IGlzLCBpZiBpdCBpcyBjb25zZXJ2YXRpdmUKKyAgICAvLy8gaW4gdGVybXMgb2YgZGVwZW5kZW5jZSksIHNldCBjb25zaXN0ZW50IHRvIGZhbHNlLgorICAgIGJvb2wgcHJvcGFnYXRlKGNvbnN0IFNDRVYgKiZTcmMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqJkRzdCwKKyAgICAgICAgICAgICAgICAgICBTbWFsbEJpdFZlY3RvciAmTG9vcHMsCisgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPENvbnN0cmFpbnQ+ICZDb25zdHJhaW50cywKKyAgICAgICAgICAgICAgICAgICBib29sICZDb25zaXN0ZW50KTsKKworICAgIC8vLyBwcm9wYWdhdGVEaXN0YW5jZSAtIEF0dGVtcHQgdG8gcHJvcGFnYXRlIGEgZGlzdGFuY2UKKyAgICAvLy8gY29uc3RyYWludCBpbnRvIGEgc3Vic2NyaXB0IHBhaXIgKFNyYyBhbmQgRHN0KS4KKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgc29tZSBzaW1wbGlmaWNhdGlvbiBvY2N1cnMuCisgICAgLy8vIElmIHRoZSBzaW1wbGlmaWNhdGlvbiBpc24ndCBleGFjdCAodGhhdCBpcywgaWYgaXQgaXMgY29uc2VydmF0aXZlCisgICAgLy8vIGluIHRlcm1zIG9mIGRlcGVuZGVuY2UpLCBzZXQgY29uc2lzdGVudCB0byBmYWxzZS4KKyAgICBib29sIHByb3BhZ2F0ZURpc3RhbmNlKGNvbnN0IFNDRVYgKiZTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWIComRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludCAmQ3VyQ29uc3RyYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkNvbnNpc3RlbnQpOworCisgICAgLy8vIHByb3BhZ2F0ZVBvaW50IC0gQXR0ZW1wdCB0byBwcm9wYWdhdGUgYSBwb2ludAorICAgIC8vLyBjb25zdHJhaW50IGludG8gYSBzdWJzY3JpcHQgcGFpciAoU3JjIGFuZCBEc3QpLgorICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBzb21lIHNpbXBsaWZpY2F0aW9uIG9jY3Vycy4KKyAgICBib29sIHByb3BhZ2F0ZVBvaW50KGNvbnN0IFNDRVYgKiZTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWIComRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludCAmQ3VyQ29uc3RyYWludCk7CisKKyAgICAvLy8gcHJvcGFnYXRlTGluZSAtIEF0dGVtcHQgdG8gcHJvcGFnYXRlIGEgbGluZQorICAgIC8vLyBjb25zdHJhaW50IGludG8gYSBzdWJzY3JpcHQgcGFpciAoU3JjIGFuZCBEc3QpLgorICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBzb21lIHNpbXBsaWZpY2F0aW9uIG9jY3Vycy4KKyAgICAvLy8gSWYgdGhlIHNpbXBsaWZpY2F0aW9uIGlzbid0IGV4YWN0ICh0aGF0IGlzLCBpZiBpdCBpcyBjb25zZXJ2YXRpdmUKKyAgICAvLy8gaW4gdGVybXMgb2YgZGVwZW5kZW5jZSksIHNldCBjb25zaXN0ZW50IHRvIGZhbHNlLgorICAgIGJvb2wgcHJvcGFnYXRlTGluZShjb25zdCBTQ0VWIComU3JjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWIComRHN0LAorICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50ICZDdXJDb25zdHJhaW50LAorICAgICAgICAgICAgICAgICAgICAgICBib29sICZDb25zaXN0ZW50KTsKKworICAgIC8vLyBmaW5kQ29lZmZpY2llbnQgLSBHaXZlbiBhIGxpbmVhciBTQ0VWLAorICAgIC8vLyByZXR1cm4gdGhlIGNvZWZmaWNpZW50IGNvcnJlc3BvbmRpbmcgdG8gc3BlY2lmaWVkIGxvb3AuCisgICAgLy8vIElmIHRoZXJlIGlzbid0IG9uZSwgcmV0dXJuIHRoZSBTQ0VWIGNvbnN0YW50IDAuCisgICAgLy8vIEZvciBleGFtcGxlLCBnaXZlbiBhKmkgKyBiKmogKyBjKmssIHJldHVybmluZyB0aGUgY29lZmZpY2llbnQKKyAgICAvLy8gY29ycmVzcG9uZGluZyB0byB0aGUgaiBsb29wIHdvdWxkIHlpZWxkIGIuCisgICAgY29uc3QgU0NFViAqZmluZENvZWZmaWNpZW50KGNvbnN0IFNDRVYgKkV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKlRhcmdldExvb3ApIGNvbnN0OworCisgICAgLy8vIHplcm9Db2VmZmljaWVudCAtIEdpdmVuIGEgbGluZWFyIFNDRVYsCisgICAgLy8vIHJldHVybiB0aGUgU0NFViBnaXZlbiBieSB6ZXJvaW5nIG91dCB0aGUgY29lZmZpY2llbnQKKyAgICAvLy8gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGxvb3AuCisgICAgLy8vIEZvciBleGFtcGxlLCBnaXZlbiBhKmkgKyBiKmogKyBjKmssIHplcm9pbmcgdGhlIGNvZWZmaWNpZW50CisgICAgLy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGogbG9vcCB3b3VsZCB5aWVsZCBhKmkgKyBjKmsuCisgICAgY29uc3QgU0NFViAqemVyb0NvZWZmaWNpZW50KGNvbnN0IFNDRVYgKkV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKlRhcmdldExvb3ApIGNvbnN0OworCisgICAgLy8vIGFkZFRvQ29lZmZpY2llbnQgLSBHaXZlbiBhIGxpbmVhciBTQ0VWIEV4cHIsCisgICAgLy8vIHJldHVybiB0aGUgU0NFViBnaXZlbiBieSBhZGRpbmcgc29tZSBWYWx1ZSB0byB0aGUKKyAgICAvLy8gY29lZmZpY2llbnQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIFRhcmdldExvb3AuCisgICAgLy8vIEZvciBleGFtcGxlLCBnaXZlbiBhKmkgKyBiKmogKyBjKmssIGFkZGluZyAxIHRvIHRoZSBjb2VmZmljaWVudAorICAgIC8vLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBqIGxvb3Agd291bGQgeWllbGQgYSppICsgKGIrMSkqaiArIGMqay4KKyAgICBjb25zdCBTQ0VWICphZGRUb0NvZWZmaWNpZW50KGNvbnN0IFNDRVYgKkV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpUYXJnZXRMb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqVmFsdWUpICBjb25zdDsKKworICAgIC8vLyB1cGRhdGVEaXJlY3Rpb24gLSBVcGRhdGUgZGlyZWN0aW9uIHZlY3RvciBlbnRyeQorICAgIC8vLyBiYXNlZCBvbiB0aGUgY3VycmVudCBjb25zdHJhaW50LgorICAgIHZvaWQgdXBkYXRlRGlyZWN0aW9uKERlcGVuZGVuY2U6OkRWRW50cnkgJkxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN0cmFpbnQgJkN1ckNvbnN0cmFpbnQpIGNvbnN0OworCisgICAgYm9vbCB0cnlEZWxpbmVhcml6ZShJbnN0cnVjdGlvbiAqU3JjLCBJbnN0cnVjdGlvbiAqRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFN1YnNjcmlwdD4gJlBhaXIpOworICB9OyAvLyBjbGFzcyBEZXBlbmRlbmNlSW5mbworCisgIC8vLyBcYnJpZWYgQW5hbHlzaXNQYXNzIHRvIGNvbXB1dGUgZGVwZW5kZW5jZSBpbmZvcm1hdGlvbiBpbiBhIGZ1bmN0aW9uCisgIGNsYXNzIERlcGVuZGVuY2VBbmFseXNpcyA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjxEZXBlbmRlbmNlQW5hbHlzaXM+IHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgRGVwZW5kZW5jZUluZm8gUmVzdWx0OworICAgIFJlc3VsdCBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZGQU0pOworCisgIHByaXZhdGU6CisgICAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKyAgICBmcmllbmQgc3RydWN0IEFuYWx5c2lzSW5mb01peGluPERlcGVuZGVuY2VBbmFseXNpcz47CisgIH07IC8vIGNsYXNzIERlcGVuZGVuY2VBbmFseXNpcworCisgIC8vLyBcYnJpZWYgTGVnYWN5IHBhc3MgbWFuYWdlciBwYXNzIHRvIGFjY2VzcyBkZXBlbmRlbmNlIGluZm9ybWF0aW9uCisgIGNsYXNzIERlcGVuZGVuY2VBbmFseXNpc1dyYXBwZXJQYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsgLy8gQ2xhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaW5mbworICAgIERlcGVuZGVuY2VBbmFseXNpc1dyYXBwZXJQYXNzKCkgOiBGdW5jdGlvblBhc3MoSUQpIHsKKyAgICAgIGluaXRpYWxpemVEZXBlbmRlbmNlQW5hbHlzaXNXcmFwcGVyUGFzc1Bhc3MoCisgICAgICAgICAgKlBhc3NSZWdpc3RyeTo6Z2V0UGFzc1JlZ2lzdHJ5KCkpOworICAgIH0KKworICAgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisgICAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJikgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmLCBjb25zdCBNb2R1bGUgKiA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOworICAgIERlcGVuZGVuY2VJbmZvICZnZXRESSgpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgc3RkOjp1bmlxdWVfcHRyPERlcGVuZGVuY2VJbmZvPiBpbmZvOworICB9OyAvLyBjbGFzcyBEZXBlbmRlbmNlQW5hbHlzaXNXcmFwcGVyUGFzcworCisgIC8vLyBjcmVhdGVEZXBlbmRlbmNlQW5hbHlzaXNQYXNzIC0gVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZQorICAvLy8gRGVwZW5kZW5jZUFuYWx5c2lzIHdyYXBwZXIgcGFzcy4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVEZXBlbmRlbmNlQW5hbHlzaXNXcmFwcGVyUGFzcygpOworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9EaXZlcmdlbmNlQW5hbHlzaXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRGl2ZXJnZW5jZUFuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzYzY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRGl2ZXJnZW5jZUFuYWx5c2lzLmgKQEAgLTAsMCArMSw1MiBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvRGl2ZXJnZW5jZUFuYWx5c2lzLmggLSBEaXZlcmdlbmNlIEFuYWx5c2lzIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGUgZGl2ZXJnZW5jZSBhbmFseXNpcyBpcyBhbiBMTFZNIHBhc3Mgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZmluZCBvdXQKKy8vIGlmIGEgYnJhbmNoIGluc3RydWN0aW9uIGluIGEgR1BVIHByb2dyYW0gaXMgZGl2ZXJnZW50IG9yIG5vdC4gSXQgY2FuIGhlbHAKKy8vIGJyYW5jaCBvcHRpbWl6YXRpb25zIHN1Y2ggYXMganVtcCB0aHJlYWRpbmcgYW5kIGxvb3AgdW5zd2l0Y2hpbmcgdG8gbWFrZQorLy8gYmV0dGVyIGRlY2lzaW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0RJVkVSR0VOQ0VfQU5BTFlTSVNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0RJVkVSR0VOQ0VfQU5BTFlTSVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFZhbHVlOworY2xhc3MgRGl2ZXJnZW5jZUFuYWx5c2lzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIERpdmVyZ2VuY2VBbmFseXNpcygpIDogRnVuY3Rpb25QYXNzKElEKSB7CisgICAgaW5pdGlhbGl6ZURpdmVyZ2VuY2VBbmFseXNpc1Bhc3MoKlBhc3NSZWdpc3RyeTo6Z2V0UGFzc1JlZ2lzdHJ5KCkpOworICB9CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworCisgIC8vIFByaW50IGFsbCBkaXZlcmdlbnQgYnJhbmNoZXMgaW4gdGhlIGZ1bmN0aW9uLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICopIGNvbnN0IG92ZXJyaWRlOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBWIGlzIGRpdmVyZ2VudC4KKyAgYm9vbCBpc0RpdmVyZ2VudChjb25zdCBWYWx1ZSAqVikgY29uc3QgeyByZXR1cm4gRGl2ZXJnZW50VmFsdWVzLmNvdW50KFYpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIFYgaXMgdW5pZm9ybS9ub24tZGl2ZXJnZW50LgorICBib29sIGlzVW5pZm9ybShjb25zdCBWYWx1ZSAqVikgY29uc3QgeyByZXR1cm4gIWlzRGl2ZXJnZW50KFYpOyB9CisKK3ByaXZhdGU6CisgIC8vIFN0b3JlcyBhbGwgZGl2ZXJnZW50IHZhbHVlcy4KKyAgRGVuc2VTZXQ8Y29uc3QgVmFsdWUgKj4gRGl2ZXJnZW50VmFsdWVzOworfTsKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZiAvL0xMVk1fQU5BTFlTSVNfRElWRVJHRU5DRV9BTkFMWVNJU19IClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Eb21QcmludGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0RvbVByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWQyODk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Eb21QcmludGVyLmgKQEAgLTAsMCArMSwzMCBAQAorLy89PT0tLSBEb21QcmludGVyLmggLSBEb20gcHJpbnRlciBleHRlcm5hbCBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgZXh0ZXJuYWwgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIGNhbGxlZCB0byBleHBsaWNpdGx5CisvLyBpbnN0YW50aWF0ZSB0aGUgZG9taW5hbmNlIHRyZWUgcHJpbnRlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfRE9NUFJJTlRFUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfRE9NUFJJTlRFUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgRnVuY3Rpb25QYXNzOworICBGdW5jdGlvblBhc3MgKmNyZWF0ZURvbVByaW50ZXJQYXNzKCk7CisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlRG9tT25seVByaW50ZXJQYXNzKCk7CisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlRG9tVmlld2VyUGFzcygpOworICBGdW5jdGlvblBhc3MgKmNyZWF0ZURvbU9ubHlWaWV3ZXJQYXNzKCk7CisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlUG9zdERvbVByaW50ZXJQYXNzKCk7CisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlUG9zdERvbU9ubHlQcmludGVyUGFzcygpOworICBGdW5jdGlvblBhc3MgKmNyZWF0ZVBvc3REb21WaWV3ZXJQYXNzKCk7CisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlUG9zdERvbU9ubHlWaWV3ZXJQYXNzKCk7Cit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRG9taW5hbmNlRnJvbnRpZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRG9taW5hbmNlRnJvbnRpZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzA0ZGZmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Eb21pbmFuY2VGcm9udGllci5oCkBAIC0wLDAgKzEsMjEwIEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9Eb21pbmFuY2VGcm9udGllci5oIC0gRG9taW5hdG9yIEZyb250aWVycyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBEb21pbmFuY2VGcm9udGllciBjbGFzcywgd2hpY2ggY2FsY3VsYXRlIGFuZCBob2xkcyB0aGUKKy8vIGRvbWluYW5jZSBmcm9udGllciBmb3IgYSBmdW5jdGlvbi4KKy8vCisvLyBUaGlzIHNob3VsZCBiZSBjb25zaWRlcmVkIGRlcHJlY2F0ZWQsIGRvbid0IGFkZCBhbnkgbW9yZSB1c2VzIG9mIHRoaXMgZGF0YQorLy8gc3RydWN0dXJlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19ET01JTkFOQ0VGUk9OVElFUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfRE9NSU5BTkNFRlJPTlRJRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dlbmVyaWNEb21UcmVlLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRG9taW5hbmNlRnJvbnRpZXJCYXNlIC0gQ29tbW9uIGJhc2UgY2xhc3MgZm9yIGNvbXB1dGluZyBmb3J3YXJkIGFuZCBpbnZlcnNlCisvLy8gZG9taW5hbmNlIGZyb250aWVycyBmb3IgYSBmdW5jdGlvbi4KKy8vLwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgYm9vbCBJc1Bvc3REb20+CitjbGFzcyBEb21pbmFuY2VGcm9udGllckJhc2UgeworcHVibGljOgorICB1c2luZyBEb21TZXRUeXBlID0gc3RkOjpzZXQ8QmxvY2tUICo+OyAgICAgICAgICAgICAgICAvLyBEb20gc2V0IGZvciBhIGJiCisgIHVzaW5nIERvbVNldE1hcFR5cGUgPSBzdGQ6Om1hcDxCbG9ja1QgKiwgRG9tU2V0VHlwZT47IC8vIERvbSBzZXQgbWFwCisKK3Byb3RlY3RlZDoKKyAgdXNpbmcgQmxvY2tUcmFpdHMgPSBHcmFwaFRyYWl0czxCbG9ja1QgKj47CisKKyAgRG9tU2V0TWFwVHlwZSBGcm9udGllcnM7CisgIC8vIFBvc3Rkb21pbmF0b3JzIGNhbiBoYXZlIG11bHRpcGxlIHJvb3RzLgorICBTbWFsbFZlY3RvcjxCbG9ja1QgKiwgSXNQb3N0RG9tID8gNCA6IDE+IFJvb3RzOworICBzdGF0aWMgY29uc3RleHByIGJvb2wgSXNQb3N0RG9taW5hdG9ycyA9IElzUG9zdERvbTsKKworcHVibGljOgorICBEb21pbmFuY2VGcm9udGllckJhc2UoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIGdldFJvb3RzIC0gUmV0dXJuIHRoZSByb290IGJsb2NrcyBvZiB0aGUgY3VycmVudCBDRkcuICBUaGlzIG1heSBpbmNsdWRlCisgIC8vLyBtdWx0aXBsZSBibG9ja3MgaWYgd2UgYXJlIGNvbXB1dGluZyBwb3N0IGRvbWluYXRvcnMuICBGb3IgZm9yd2FyZAorICAvLy8gZG9taW5hdG9ycywgdGhpcyB3aWxsIGFsd2F5cyBiZSBhIHNpbmdsZSBibG9jayAodGhlIGVudHJ5IG5vZGUpLgorICBjb25zdCBTbWFsbFZlY3RvckltcGw8QmxvY2tUICo+ICZnZXRSb290cygpIGNvbnN0IHsgcmV0dXJuIFJvb3RzOyB9CisKKyAgQmxvY2tUICpnZXRSb290KCkgY29uc3QgeworICAgIGFzc2VydChSb290cy5zaXplKCkgPT0gMSAmJiAiU2hvdWxkIGFsd2F5cyBoYXZlIGVudHJ5IG5vZGUhIik7CisgICAgcmV0dXJuIFJvb3RzWzBdOworICB9CisKKyAgLy8vIGlzUG9zdERvbWluYXRvciAtIFJldHVybnMgdHJ1ZSBpZiBhbmFseXNpcyBiYXNlZCBvZiBwb3N0ZG9tcworICBib29sIGlzUG9zdERvbWluYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gSXNQb3N0RG9taW5hdG9yczsKKyAgfQorCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIHsKKyAgICBGcm9udGllcnMuY2xlYXIoKTsKKyAgfQorCisgIC8vIEFjY2Vzc29yIGludGVyZmFjZToKKyAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBEb21TZXRNYXBUeXBlOjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSB0eXBlbmFtZSBEb21TZXRNYXBUeXBlOjpjb25zdF9pdGVyYXRvcjsKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIEZyb250aWVycy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gRnJvbnRpZXJzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gRnJvbnRpZXJzLmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEZyb250aWVycy5lbmQoKTsgfQorICBpdGVyYXRvciBmaW5kKEJsb2NrVCAqQikgeyByZXR1cm4gRnJvbnRpZXJzLmZpbmQoQik7IH0KKyAgY29uc3RfaXRlcmF0b3IgZmluZChCbG9ja1QgKkIpIGNvbnN0IHsgcmV0dXJuIEZyb250aWVycy5maW5kKEIpOyB9CisKKyAgaXRlcmF0b3IgYWRkQmFzaWNCbG9jayhCbG9ja1QgKkJCLCBjb25zdCBEb21TZXRUeXBlICZmcm9udGllcikgeworICAgIGFzc2VydChmaW5kKEJCKSA9PSBlbmQoKSAmJiAiQmxvY2sgYWxyZWFkeSBpbiBEb21pbmFuY2VGcm9udGllciEiKTsKKyAgICByZXR1cm4gRnJvbnRpZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcihCQiwgZnJvbnRpZXIpKS5maXJzdDsKKyAgfQorCisgIC8vLyByZW1vdmVCbG9jayAtIFJlbW92ZSBiYXNpYyBibG9jayBCQidzIGZyb250aWVyLgorICB2b2lkIHJlbW92ZUJsb2NrKEJsb2NrVCAqQkIpOworCisgIHZvaWQgYWRkVG9Gcm9udGllcihpdGVyYXRvciBJLCBCbG9ja1QgKk5vZGUpOworCisgIHZvaWQgcmVtb3ZlRnJvbUZyb250aWVyKGl0ZXJhdG9yIEksIEJsb2NrVCAqTm9kZSk7CisKKyAgLy8vIGNvbXBhcmVEb21TZXQgLSBSZXR1cm4gZmFsc2UgaWYgdHdvIGRvbXNldHMgbWF0Y2guIE90aGVyd2lzZQorICAvLy8gcmV0dXJuIHRydWU7CisgIGJvb2wgY29tcGFyZURvbVNldChEb21TZXRUeXBlICZEUzEsIGNvbnN0IERvbVNldFR5cGUgJkRTMikgY29uc3Q7CisKKyAgLy8vIGNvbXBhcmUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgb3RoZXIgZG9taW5hbmNlIGZyb250aWVyIGJhc2UgbWF0Y2hlcworICAvLy8gdGhpcyBkb21pbmFuY2UgZnJvbnRpZXIgYmFzZS4gT3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KKyAgYm9vbCBjb21wYXJlKERvbWluYW5jZUZyb250aWVyQmFzZSAmT3RoZXIpIGNvbnN0OworCisgIC8vLyBwcmludCAtIENvbnZlcnQgdG8gaHVtYW4gcmVhZGFibGUgZm9ybQorICAvLy8KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIC8vLyBkdW1wIC0gRHVtcCB0aGUgZG9taW5hbmNlIGZyb250aWVyIHRvIGRiZ3MoKS4KKyNpZiAhZGVmaW5lZChOREVCVUcpIHx8IGRlZmluZWQoTExWTV9FTkFCTEVfRFVNUCkKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisjZW5kaWYKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vIERvbWluYW5jZUZyb250aWVyIENsYXNzIC0gQ29uY3JldGUgc3ViY2xhc3Mgb2YgRG9taW5hbmNlRnJvbnRpZXJCYXNlIHRoYXQgaXMKKy8vLyB1c2VkIHRvIGNvbXB1dGUgYSBmb3J3YXJkIGRvbWluYXRvciBmcm9udGllcnMuCisvLy8KK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1Q+CitjbGFzcyBGb3J3YXJkRG9taW5hbmNlRnJvbnRpZXJCYXNlCisgICAgOiBwdWJsaWMgRG9taW5hbmNlRnJvbnRpZXJCYXNlPEJsb2NrVCwgZmFsc2U+IHsKK3ByaXZhdGU6CisgIHVzaW5nIEJsb2NrVHJhaXRzID0gR3JhcGhUcmFpdHM8QmxvY2tUICo+OworCitwdWJsaWM6CisgIHVzaW5nIERvbVRyZWVUID0gRG9tVHJlZUJhc2U8QmxvY2tUPjsKKyAgdXNpbmcgRG9tVHJlZU5vZGVUID0gRG9tVHJlZU5vZGVCYXNlPEJsb2NrVD47CisgIHVzaW5nIERvbVNldFR5cGUgPSB0eXBlbmFtZSBEb21pbmFuY2VGcm9udGllckJhc2U8QmxvY2tULCBmYWxzZT46OkRvbVNldFR5cGU7CisKKyAgdm9pZCBhbmFseXplKERvbVRyZWVUICZEVCkgeworICAgIGFzc2VydChEVC5nZXRSb290cygpLnNpemUoKSA9PSAxICYmCisgICAgICAgICAgICJPbmx5IG9uZSBlbnRyeSBibG9jayBmb3IgZm9yd2FyZCBkb21mcm9udHMhIik7CisgICAgdGhpcy0+Um9vdHMgPSB7RFQuZ2V0Um9vdCgpfTsKKyAgICBjYWxjdWxhdGUoRFQsIERUW3RoaXMtPlJvb3RzWzBdXSk7CisgIH0KKworICBjb25zdCBEb21TZXRUeXBlICZjYWxjdWxhdGUoY29uc3QgRG9tVHJlZVQgJkRULCBjb25zdCBEb21UcmVlTm9kZVQgKk5vZGUpOworfTsKKworY2xhc3MgRG9taW5hbmNlRnJvbnRpZXIgOiBwdWJsaWMgRm9yd2FyZERvbWluYW5jZUZyb250aWVyQmFzZTxCYXNpY0Jsb2NrPiB7CitwdWJsaWM6CisgIHVzaW5nIERvbVRyZWVUID0gRG9tVHJlZUJhc2U8QmFzaWNCbG9jaz47CisgIHVzaW5nIERvbVRyZWVOb2RlVCA9IERvbVRyZWVOb2RlQmFzZTxCYXNpY0Jsb2NrPjsKKyAgdXNpbmcgRG9tU2V0VHlwZSA9IERvbWluYW5jZUZyb250aWVyQmFzZTxCYXNpY0Jsb2NrLCBmYWxzZT46OkRvbVNldFR5cGU7CisgIHVzaW5nIGl0ZXJhdG9yID0gRG9taW5hbmNlRnJvbnRpZXJCYXNlPEJhc2ljQmxvY2ssIGZhbHNlPjo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0KKyAgICAgIERvbWluYW5jZUZyb250aWVyQmFzZTxCYXNpY0Jsb2NrLCBmYWxzZT46OmNvbnN0X2l0ZXJhdG9yOworCisgIC8vLyBIYW5kbGUgaW52YWxpZGF0aW9uIGV4cGxpY2l0bHkuCisgIGJvb2wgaW52YWxpZGF0ZShGdW5jdGlvbiAmRiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJlBBLAorICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BbmFseXNpc01hbmFnZXI6OkludmFsaWRhdG9yICYpOworfTsKKworY2xhc3MgRG9taW5hbmNlRnJvbnRpZXJXcmFwcGVyUGFzcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICBEb21pbmFuY2VGcm9udGllciBERjsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBJRCwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorCisgIERvbWluYW5jZUZyb250aWVyV3JhcHBlclBhc3MoKTsKKworICBEb21pbmFuY2VGcm9udGllciAmZ2V0RG9taW5hbmNlRnJvbnRpZXIoKSB7IHJldHVybiBERjsgfQorICBjb25zdCBEb21pbmFuY2VGcm9udGllciAmZ2V0RG9taW5hbmNlRnJvbnRpZXIoKSBjb25zdCB7IHJldHVybiBERjsgIH0KKworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJikgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICogPSBudWxscHRyKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBEb21pbmFuY2VGcm9udGllckJhc2U8QmFzaWNCbG9jaywgZmFsc2U+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIERvbWluYW5jZUZyb250aWVyQmFzZTxCYXNpY0Jsb2NrLCB0cnVlPjsKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBGb3J3YXJkRG9taW5hbmNlRnJvbnRpZXJCYXNlPEJhc2ljQmxvY2s+OworCisvLy8gXGJyaWVmIEFuYWx5c2lzIHBhc3Mgd2hpY2ggY29tcHV0ZXMgYSBcYyBEb21pbmFuY2VGcm9udGllci4KK2NsYXNzIERvbWluYW5jZUZyb250aWVyQW5hbHlzaXMKKyAgICA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjxEb21pbmFuY2VGcm9udGllckFuYWx5c2lzPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxEb21pbmFuY2VGcm9udGllckFuYWx5c2lzPjsKKworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgUHJvdmlkZSB0aGUgcmVzdWx0IHR5cGUgZm9yIHRoaXMgYW5hbHlzaXMgcGFzcy4KKyAgdXNpbmcgUmVzdWx0ID0gRG9taW5hbmNlRnJvbnRpZXI7CisKKyAgLy8vIFxicmllZiBSdW4gdGhlIGFuYWx5c2lzIHBhc3Mgb3ZlciBhIGZ1bmN0aW9uIGFuZCBwcm9kdWNlIGEgZG9taW5hdG9yIHRyZWUuCisgIERvbWluYW5jZUZyb250aWVyIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBcYnJpZWYgUHJpbnRlciBwYXNzIGZvciB0aGUgXGMgRG9taW5hbmNlRnJvbnRpZXIuCitjbGFzcyBEb21pbmFuY2VGcm9udGllclByaW50ZXJQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxEb21pbmFuY2VGcm9udGllclByaW50ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKworcHVibGljOgorICBleHBsaWNpdCBEb21pbmFuY2VGcm9udGllclByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPUyk7CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfRE9NSU5BTkNFRlJPTlRJRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Eb21pbmFuY2VGcm9udGllckltcGwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRG9taW5hbmNlRnJvbnRpZXJJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmYjJlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRG9taW5hbmNlRnJvbnRpZXJJbXBsLmgKQEAgLTAsMCArMSwyMzEgQEAKKy8vPT09LSBsbHZtL0FuYWx5c2lzL0RvbWluYW5jZUZyb250aWVyLmggLSBEb21pbmF0b3IgRnJvbnRpZXJzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpcyB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRG9taW5hbmNlRnJvbnRpZXIgY2xhc3MsIHdoaWNoCisvLyBjYWxjdWxhdGUgYW5kIGhvbGRzIHRoZSBkb21pbmFuY2UgZnJvbnRpZXIgZm9yIGEgZnVuY3Rpb24gZm9yLgorLy8KKy8vIFRoaXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZGVwcmVjYXRlZCwgZG9uJ3QgYWRkIGFueSBtb3JlIHVzZXMgb2YgdGhpcyBkYXRhCisvLyBzdHJ1Y3R1cmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0RPTUlOQU5DRUZST05USUVSSU1QTF9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfRE9NSU5BTkNFRlJPTlRJRVJJTVBMX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RvbWluYW5jZUZyb250aWVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dlbmVyaWNEb21UcmVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVD4KK2NsYXNzIERGQ2FsY3VsYXRlV29ya09iamVjdCB7CitwdWJsaWM6CisgIHVzaW5nIERvbVRyZWVOb2RlVCA9IERvbVRyZWVOb2RlQmFzZTxCbG9ja1Q+OworCisgIERGQ2FsY3VsYXRlV29ya09iamVjdChCbG9ja1QgKkIsIEJsb2NrVCAqUCwgY29uc3QgRG9tVHJlZU5vZGVUICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9tVHJlZU5vZGVUICpQTikKKyAgICAgIDogY3VycmVudEJCKEIpLCBwYXJlbnRCQihQKSwgTm9kZShOKSwgcGFyZW50Tm9kZShQTikge30KKworICBCbG9ja1QgKmN1cnJlbnRCQjsKKyAgQmxvY2tUICpwYXJlbnRCQjsKKyAgY29uc3QgRG9tVHJlZU5vZGVUICpOb2RlOworICBjb25zdCBEb21UcmVlTm9kZVQgKnBhcmVudE5vZGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBib29sIElzUG9zdERvbT4KK3ZvaWQgRG9taW5hbmNlRnJvbnRpZXJCYXNlPEJsb2NrVCwgSXNQb3N0RG9tPjo6cmVtb3ZlQmxvY2soQmxvY2tUICpCQikgeworICBhc3NlcnQoZmluZChCQikgIT0gZW5kKCkgJiYgIkJsb2NrIGlzIG5vdCBpbiBEb21pbmFuY2VGcm9udGllciEiKTsKKyAgZm9yIChpdGVyYXRvciBJID0gYmVnaW4oKSwgRSA9IGVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBJLT5zZWNvbmQuZXJhc2UoQkIpOworICBGcm9udGllcnMuZXJhc2UoQkIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBib29sIElzUG9zdERvbT4KK3ZvaWQgRG9taW5hbmNlRnJvbnRpZXJCYXNlPEJsb2NrVCwgSXNQb3N0RG9tPjo6YWRkVG9Gcm9udGllcihpdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrVCAqTm9kZSkgeworICBhc3NlcnQoSSAhPSBlbmQoKSAmJiAiQkIgaXMgbm90IGluIERvbWluYW5jZUZyb250aWVyISIpOworICBhc3NlcnQoSS0+c2Vjb25kLmNvdW50KE5vZGUpICYmICJOb2RlIGlzIG5vdCBpbiBEb21pbmFuY2VGcm9udGllciBvZiBCQiIpOworICBJLT5zZWNvbmQuZXJhc2UoTm9kZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGJvb2wgSXNQb3N0RG9tPgordm9pZCBEb21pbmFuY2VGcm9udGllckJhc2U8QmxvY2tULCBJc1Bvc3REb20+OjpyZW1vdmVGcm9tRnJvbnRpZXIoCisgICAgaXRlcmF0b3IgSSwgQmxvY2tUICpOb2RlKSB7CisgIGFzc2VydChJICE9IGVuZCgpICYmICJCQiBpcyBub3QgaW4gRG9taW5hbmNlRnJvbnRpZXIhIik7CisgIGFzc2VydChJLT5zZWNvbmQuY291bnQoTm9kZSkgJiYgIk5vZGUgaXMgbm90IGluIERvbWluYW5jZUZyb250aWVyIG9mIEJCIik7CisgIEktPnNlY29uZC5lcmFzZShOb2RlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgYm9vbCBJc1Bvc3REb20+Citib29sIERvbWluYW5jZUZyb250aWVyQmFzZTxCbG9ja1QsIElzUG9zdERvbT46OmNvbXBhcmVEb21TZXQoCisgICAgRG9tU2V0VHlwZSAmRFMxLCBjb25zdCBEb21TZXRUeXBlICZEUzIpIGNvbnN0IHsKKyAgc3RkOjpzZXQ8QmxvY2tUICo+IHRtcFNldDsKKyAgZm9yIChCbG9ja1QgKkJCIDogRFMyKQorICAgIHRtcFNldC5pbnNlcnQoQkIpOworCisgIGZvciAodHlwZW5hbWUgRG9tU2V0VHlwZTo6Y29uc3RfaXRlcmF0b3IgSSA9IERTMS5iZWdpbigpLCBFID0gRFMxLmVuZCgpOworICAgICAgIEkgIT0gRTspIHsKKyAgICBCbG9ja1QgKk5vZGUgPSAqSSsrOworCisgICAgaWYgKHRtcFNldC5lcmFzZShOb2RlKSA9PSAwKQorICAgICAgLy8gTm9kZSBpcyBpbiBEUzEgYnV0IHRub3QgaW4gRFMyLgorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAoIXRtcFNldC5lbXB0eSgpKSB7CisgICAgLy8gVGhlcmUgYXJlIG5vZGVzIHRoYXQgYXJlIGluIERTMiBidXQgbm90IGluIERTMS4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIERTMSBhbmQgRFMyIG1hdGNoZXMuCisgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgYm9vbCBJc1Bvc3REb20+Citib29sIERvbWluYW5jZUZyb250aWVyQmFzZTxCbG9ja1QsIElzUG9zdERvbT46OmNvbXBhcmUoCisgICAgRG9taW5hbmNlRnJvbnRpZXJCYXNlPEJsb2NrVCwgSXNQb3N0RG9tPiAmT3RoZXIpIGNvbnN0IHsKKyAgRG9tU2V0TWFwVHlwZSB0bXBGcm9udGllcnM7CisgIGZvciAodHlwZW5hbWUgRG9tU2V0TWFwVHlwZTo6Y29uc3RfaXRlcmF0b3IgSSA9IE90aGVyLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IE90aGVyLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIHRtcEZyb250aWVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoSS0+Zmlyc3QsIEktPnNlY29uZCkpOworCisgIGZvciAodHlwZW5hbWUgRG9tU2V0TWFwVHlwZTo6aXRlcmF0b3IgSSA9IHRtcEZyb250aWVycy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSB0bXBGcm9udGllcnMuZW5kKCk7CisgICAgICAgSSAhPSBFOykgeworICAgIEJsb2NrVCAqTm9kZSA9IEktPmZpcnN0OworICAgIGNvbnN0X2l0ZXJhdG9yIERGSSA9IGZpbmQoTm9kZSk7CisgICAgaWYgKERGSSA9PSBlbmQoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKGNvbXBhcmVEb21TZXQoSS0+c2Vjb25kLCBERkktPnNlY29uZCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICsrSTsKKyAgICB0bXBGcm9udGllcnMuZXJhc2UoTm9kZSk7CisgIH0KKworICBpZiAoIXRtcEZyb250aWVycy5lbXB0eSgpKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgYm9vbCBJc1Bvc3REb20+Cit2b2lkIERvbWluYW5jZUZyb250aWVyQmFzZTxCbG9ja1QsIElzUG9zdERvbT46OnByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICBmb3IgKGNvbnN0X2l0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgT1MgPDwgIiAgRG9tRnJvbnRpZXIgZm9yIEJCICI7CisgICAgaWYgKEktPmZpcnN0KQorICAgICAgSS0+Zmlyc3QtPnByaW50QXNPcGVyYW5kKE9TLCBmYWxzZSk7CisgICAgZWxzZQorICAgICAgT1MgPDwgIiA8PGV4aXQgbm9kZT4+IjsKKyAgICBPUyA8PCAiIGlzOlx0IjsKKworICAgIGNvbnN0IHN0ZDo6c2V0PEJsb2NrVCAqPiAmQkJzID0gSS0+c2Vjb25kOworCisgICAgZm9yIChjb25zdCBCbG9ja1QgKkJCIDogQkJzKSB7CisgICAgICBPUyA8PCAnICc7CisgICAgICBpZiAoQkIpCisgICAgICAgIEJCLT5wcmludEFzT3BlcmFuZChPUywgZmFsc2UpOworICAgICAgZWxzZQorICAgICAgICBPUyA8PCAiPDxleGl0IG5vZGU+PiI7CisgICAgfQorICAgIE9TIDw8ICdcbic7CisgIH0KK30KKworI2lmICFkZWZpbmVkKE5ERUJVRykgfHwgZGVmaW5lZChMTFZNX0VOQUJMRV9EVU1QKQordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgYm9vbCBJc1Bvc3REb20+Cit2b2lkIERvbWluYW5jZUZyb250aWVyQmFzZTxCbG9ja1QsIElzUG9zdERvbT46OmR1bXAoKSBjb25zdCB7CisgIHByaW50KGRiZ3MoKSk7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVD4KK2NvbnN0IHR5cGVuYW1lIEZvcndhcmREb21pbmFuY2VGcm9udGllckJhc2U8QmxvY2tUPjo6RG9tU2V0VHlwZSAmCitGb3J3YXJkRG9taW5hbmNlRnJvbnRpZXJCYXNlPEJsb2NrVD46OmNhbGN1bGF0ZShjb25zdCBEb21UcmVlVCAmRFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21UcmVlTm9kZVQgKk5vZGUpIHsKKyAgQmxvY2tUICpCQiA9IE5vZGUtPmdldEJsb2NrKCk7CisgIERvbVNldFR5cGUgKlJlc3VsdCA9IG51bGxwdHI7CisKKyAgc3RkOjp2ZWN0b3I8REZDYWxjdWxhdGVXb3JrT2JqZWN0PEJsb2NrVD4+IHdvcmtMaXN0OworICBTbWFsbFB0clNldDxCbG9ja1QgKiwgMzI+IHZpc2l0ZWQ7CisKKyAgd29ya0xpc3QucHVzaF9iYWNrKERGQ2FsY3VsYXRlV29ya09iamVjdDxCbG9ja1Q+KEJCLCBudWxscHRyLCBOb2RlLCBudWxscHRyKSk7CisgIGRvIHsKKyAgICBERkNhbGN1bGF0ZVdvcmtPYmplY3Q8QmxvY2tUPiAqY3VycmVudFcgPSAmd29ya0xpc3QuYmFjaygpOworICAgIGFzc2VydChjdXJyZW50VyAmJiAiTWlzc2luZyB3b3JrIG9iamVjdC4iKTsKKworICAgIEJsb2NrVCAqY3VycmVudEJCID0gY3VycmVudFctPmN1cnJlbnRCQjsKKyAgICBCbG9ja1QgKnBhcmVudEJCID0gY3VycmVudFctPnBhcmVudEJCOworICAgIGNvbnN0IERvbVRyZWVOb2RlVCAqY3VycmVudE5vZGUgPSBjdXJyZW50Vy0+Tm9kZTsKKyAgICBjb25zdCBEb21UcmVlTm9kZVQgKnBhcmVudE5vZGUgPSBjdXJyZW50Vy0+cGFyZW50Tm9kZTsKKyAgICBhc3NlcnQoY3VycmVudEJCICYmICJJbnZhbGlkIHdvcmsgb2JqZWN0LiBNaXNzaW5nIGN1cnJlbnQgQmFzaWMgQmxvY2siKTsKKyAgICBhc3NlcnQoY3VycmVudE5vZGUgJiYgIkludmFsaWQgd29yayBvYmplY3QuIE1pc3NpbmcgY3VycmVudCBOb2RlIik7CisgICAgRG9tU2V0VHlwZSAmUyA9IHRoaXMtPkZyb250aWVyc1tjdXJyZW50QkJdOworCisgICAgLy8gVmlzaXQgZWFjaCBibG9jayBvbmx5IG9uY2UuCisgICAgaWYgKHZpc2l0ZWQuaW5zZXJ0KGN1cnJlbnRCQikuc2Vjb25kKSB7CisgICAgICAvLyBMb29wIG92ZXIgQ0ZHIHN1Y2Nlc3NvcnMgdG8gY2FsY3VsYXRlIERGbG9jYWxbY3VycmVudE5vZGVdCisgICAgICBmb3IgKGNvbnN0IGF1dG8gU3VjYyA6IGNoaWxkcmVuPEJsb2NrVCAqPihjdXJyZW50QkIpKSB7CisgICAgICAgIC8vIERvZXMgTm9kZSBpbW1lZGlhdGVseSBkb21pbmF0ZSB0aGlzIHN1Y2Nlc3Nvcj8KKyAgICAgICAgaWYgKERUW1N1Y2NdLT5nZXRJRG9tKCkgIT0gY3VycmVudE5vZGUpCisgICAgICAgICAgUy5pbnNlcnQoU3VjYyk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gQXQgdGhpcyBwb2ludCwgUyBpcyBERmxvY2FsLiAgTm93IHdlIHVuaW9uIGluIERGdXAncyBvZiBvdXIgY2hpbGRyZW4uLi4KKyAgICAvLyBMb29wIHRocm91Z2ggYW5kIHZpc2l0IHRoZSBub2RlcyB0aGF0IE5vZGUgaW1tZWRpYXRlbHkgZG9taW5hdGVzIChOb2RlJ3MKKyAgICAvLyBjaGlsZHJlbiBpbiB0aGUgSURvbVRyZWUpCisgICAgYm9vbCB2aXNpdENoaWxkID0gZmFsc2U7CisgICAgZm9yICh0eXBlbmFtZSBEb21UcmVlTm9kZVQ6OmNvbnN0X2l0ZXJhdG9yIE5JID0gY3VycmVudE5vZGUtPmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FID0gY3VycmVudE5vZGUtPmVuZCgpOworICAgICAgICAgTkkgIT0gTkU7ICsrTkkpIHsKKyAgICAgIERvbVRyZWVOb2RlVCAqSURvbWluZWUgPSAqTkk7CisgICAgICBCbG9ja1QgKmNoaWxkQkIgPSBJRG9taW5lZS0+Z2V0QmxvY2soKTsKKyAgICAgIGlmICh2aXNpdGVkLmNvdW50KGNoaWxkQkIpID09IDApIHsKKyAgICAgICAgd29ya0xpc3QucHVzaF9iYWNrKERGQ2FsY3VsYXRlV29ya09iamVjdDxCbG9ja1Q+KAorICAgICAgICAgICAgY2hpbGRCQiwgY3VycmVudEJCLCBJRG9taW5lZSwgY3VycmVudE5vZGUpKTsKKyAgICAgICAgdmlzaXRDaGlsZCA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgYWxsIGNoaWxkcmVuIGFyZSB2aXNpdGVkIG9yIHRoZXJlIGlzIGFueSBjaGlsZCB0aGVuIHBvcCB0aGlzIGJsb2NrCisgICAgLy8gZnJvbSB0aGUgd29ya0xpc3QuCisgICAgaWYgKCF2aXNpdENoaWxkKSB7CisgICAgICBpZiAoIXBhcmVudEJCKSB7CisgICAgICAgIFJlc3VsdCA9ICZTOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgdHlwZW5hbWUgRG9tU2V0VHlwZTo6Y29uc3RfaXRlcmF0b3IgQ0RGSSA9IFMuYmVnaW4oKSwgQ0RGRSA9IFMuZW5kKCk7CisgICAgICBEb21TZXRUeXBlICZwYXJlbnRTZXQgPSB0aGlzLT5Gcm9udGllcnNbcGFyZW50QkJdOworICAgICAgZm9yICg7IENERkkgIT0gQ0RGRTsgKytDREZJKSB7CisgICAgICAgIGlmICghRFQucHJvcGVybHlEb21pbmF0ZXMocGFyZW50Tm9kZSwgRFRbKkNERkldKSkKKyAgICAgICAgICBwYXJlbnRTZXQuaW5zZXJ0KCpDREZJKTsKKyAgICAgIH0KKyAgICAgIHdvcmtMaXN0LnBvcF9iYWNrKCk7CisgICAgfQorCisgIH0gd2hpbGUgKCF3b3JrTGlzdC5lbXB0eSgpKTsKKworICByZXR1cm4gKlJlc3VsdDsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfRE9NSU5BTkNFRlJPTlRJRVJJTVBMX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRUhQZXJzb25hbGl0aWVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0VIUGVyc29uYWxpdGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNDVhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0VIUGVyc29uYWxpdGllcy5oCkBAIC0wLDAgKzEsMTAyIEBACisvLz09PS0gRUhQZXJzb25hbGl0aWVzLmggLSBDb21wdXRlIEVILXJlbGF0ZWQgaW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfRUhQRVJTT05BTElUSUVTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19FSFBFUlNPTkFMSVRJRVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UaW55UHRyVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgVmFsdWU7CisKK2VudW0gY2xhc3MgRUhQZXJzb25hbGl0eSB7CisgIFVua25vd24sCisgIEdOVV9BZGEsCisgIEdOVV9DLAorICBHTlVfQ19TakxqLAorICBHTlVfQ1hYLAorICBHTlVfQ1hYX1NqTGosCisgIEdOVV9PYmpDLAorICBNU1ZDX1g4NlNFSCwKKyAgTVNWQ19XaW42NFNFSCwKKyAgTVNWQ19DWFgsCisgIENvcmVDTFIsCisgIFJ1c3QKK307CisKKy8vLyBcYnJpZWYgU2VlIGlmIHRoZSBnaXZlbiBleGNlcHRpb24gaGFuZGxpbmcgcGVyc29uYWxpdHkgZnVuY3Rpb24gaXMgb25lCisvLy8gdGhhdCB3ZSB1bmRlcnN0YW5kLiAgSWYgc28sIHJldHVybiBhIGRlc2NyaXB0aW9uIG9mIGl0OyBvdGhlcndpc2UgcmV0dXJuCisvLy8gVW5rbm93bi4KK0VIUGVyc29uYWxpdHkgY2xhc3NpZnlFSFBlcnNvbmFsaXR5KGNvbnN0IFZhbHVlICpQZXJzKTsKKworU3RyaW5nUmVmIGdldEVIUGVyc29uYWxpdHlOYW1lKEVIUGVyc29uYWxpdHkgUGVycyk7CisKK0VIUGVyc29uYWxpdHkgZ2V0RGVmYXVsdEVIUGVyc29uYWxpdHkoY29uc3QgVHJpcGxlICZUKTsKKworLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBwZXJzb25hbGl0eSBmdW5jdGlvbiBjYXRjaGVzIGFzeW5jaHJvbm91cworLy8vIGV4Y2VwdGlvbnMuCitpbmxpbmUgYm9vbCBpc0FzeW5jaHJvbm91c0VIUGVyc29uYWxpdHkoRUhQZXJzb25hbGl0eSBQZXJzKSB7CisgIC8vIFRoZSB0d28gU0VIIHBlcnNvbmFsaXR5IGZ1bmN0aW9ucyBjYW4gY2F0Y2ggYXN5bmNoIGV4Y2VwdGlvbnMuIFdlIGFzc3VtZQorICAvLyB1bmtub3duIHBlcnNvbmFsaXRpZXMgZG9uJ3QgY2F0Y2ggYXN5bmNoIGV4Y2VwdGlvbnMuCisgIHN3aXRjaCAoUGVycykgeworICBjYXNlIEVIUGVyc29uYWxpdHk6Ok1TVkNfWDg2U0VIOgorICBjYXNlIEVIUGVyc29uYWxpdHk6Ok1TVkNfV2luNjRTRUg6CisgICAgcmV0dXJuIHRydWU7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGxsdm1fdW5yZWFjaGFibGUoImludmFsaWQgZW51bSIpOworfQorCisvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgcGVyc29uYWxpdHkgZnVuY3Rpb24gdGhhdCBpbnZva2VzCisvLy8gaGFuZGxlciBmdW5jbGV0cyAod2hpY2ggbXVzdCByZXR1cm4gdG8gaXQpLgoraW5saW5lIGJvb2wgaXNGdW5jbGV0RUhQZXJzb25hbGl0eShFSFBlcnNvbmFsaXR5IFBlcnMpIHsKKyAgc3dpdGNoIChQZXJzKSB7CisgIGNhc2UgRUhQZXJzb25hbGl0eTo6TVNWQ19DWFg6CisgIGNhc2UgRUhQZXJzb25hbGl0eTo6TVNWQ19YODZTRUg6CisgIGNhc2UgRUhQZXJzb25hbGl0eTo6TVNWQ19XaW42NFNFSDoKKyAgY2FzZSBFSFBlcnNvbmFsaXR5OjpDb3JlQ0xSOgorICAgIHJldHVybiB0cnVlOworICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBsbHZtX3VucmVhY2hhYmxlKCJpbnZhbGlkIGVudW0iKTsKK30KKworLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHBlcnNvbmFsaXR5IG1heSBiZSBzYWZlbHkgcmVtb3ZlZCBpZiB0aGVyZQorLy8vIGFyZSBubyBpbnZva2UgaW5zdHJ1Y3Rpb25zIHJlbWFpbmluZyBpbiB0aGUgY3VycmVudCBmdW5jdGlvbi4KK2lubGluZSBib29sIGlzTm9PcFdpdGhvdXRJbnZva2UoRUhQZXJzb25hbGl0eSBQZXJzKSB7CisgIHN3aXRjaCAoUGVycykgeworICBjYXNlIEVIUGVyc29uYWxpdHk6OlVua25vd246CisgICAgcmV0dXJuIGZhbHNlOworICAvLyBBbGwga25vd24gcGVyc29uYWxpdGllcyBjdXJyZW50bHkgaGF2ZSB0aGlzIGJlaGF2aW9yCisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgbGx2bV91bnJlYWNoYWJsZSgiaW52YWxpZCBlbnVtIik7Cit9CisKK2Jvb2wgY2FuU2ltcGxpZnlJbnZva2VOb1Vud2luZChjb25zdCBGdW5jdGlvbiAqRik7CisKK3R5cGVkZWYgVGlueVB0clZlY3RvcjxCYXNpY0Jsb2NrICo+IENvbG9yVmVjdG9yOworCisvLy8gXGJyaWVmIElmIGFuIEVIIGZ1bmNsZXQgcGVyc29uYWxpdHkgaXMgaW4gdXNlIChzZWUgaXNGdW5jbGV0RUhQZXJzb25hbGl0eSksCisvLy8gdGhpcyB3aWxsIHJlY29tcHV0ZSB3aGljaCBibG9ja3MgYXJlIGluIHdoaWNoIGZ1bmNsZXQuIEl0IGlzIHBvc3NpYmxlIHRoYXQKKy8vLyBzb21lIGJsb2NrcyBhcmUgaW4gbXVsdGlwbGUgZnVuY2xldHMuIENvbnNpZGVyIHRoaXMgYW5hbHlzaXMgdG8gYmUKKy8vLyBleHBlbnNpdmUuCitEZW5zZU1hcDxCYXNpY0Jsb2NrICosIENvbG9yVmVjdG9yPiBjb2xvckVIRnVuY2xldHMoRnVuY3Rpb24gJkYpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvR2xvYmFsc01vZFJlZi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9HbG9iYWxzTW9kUmVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDljZWY2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvR2xvYmFsc01vZFJlZi5oCkBAIC0wLDAgKzEsMTU2IEBACisvLz09PS0gR2xvYmFsc01vZFJlZi5oIC0gU2ltcGxlIE1vZC9SZWYgQUEgZm9yIEdsb2JhbHMgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBhIHNpbXBsZSBtb2QvcmVmIGFuZCBhbGlhcyBhbmFseXNpcyBvdmVyIGdsb2JhbHMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19HTE9CQUxTTU9EUkVGX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19HTE9CQUxTTU9EUkVGX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSA8bGlzdD4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQW4gYWxpYXMgYW5hbHlzaXMgcmVzdWx0IHNldCBmb3IgZ2xvYmFscy4KKy8vLworLy8vIFRoaXMgZm9jdXNlcyBvbiBoYW5kbGluZyBhbGlhc2luZyBwcm9wZXJ0aWVzIG9mIGdsb2JhbHMgYW5kIGludGVycHJvY2VkdXJhbAorLy8vIGZ1bmN0aW9uIGNhbGwgbW9kL3JlZiBpbmZvcm1hdGlvbi4KK2NsYXNzIEdsb2JhbHNBQVJlc3VsdCA6IHB1YmxpYyBBQVJlc3VsdEJhc2U8R2xvYmFsc0FBUmVzdWx0PiB7CisgIGZyaWVuZCBBQVJlc3VsdEJhc2U8R2xvYmFsc0FBUmVzdWx0PjsKKworICBjbGFzcyBGdW5jdGlvbkluZm87CisKKyAgY29uc3QgRGF0YUxheW91dCAmREw7CisgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICZUTEk7CisKKyAgLy8vIFRoZSBnbG9iYWxzIHRoYXQgZG8gbm90IGhhdmUgdGhlaXIgYWRkcmVzc2VzIHRha2VuLgorICBTbWFsbFB0clNldDxjb25zdCBHbG9iYWxWYWx1ZSAqLCA4PiBOb25BZGRyZXNzVGFrZW5HbG9iYWxzOworCisgIC8vLyBJbmRpcmVjdEdsb2JhbHMgLSBUaGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgdGhpcyBnbG9iYWwgaXMga25vd24gdG8gYmUKKyAgLy8vICdvd25lZCcgYnkgdGhlIGdsb2JhbC4KKyAgU21hbGxQdHJTZXQ8Y29uc3QgR2xvYmFsVmFsdWUgKiwgOD4gSW5kaXJlY3RHbG9iYWxzOworCisgIC8vLyBBbGxvY3NGb3JJbmRpcmVjdEdsb2JhbHMgLSBJZiBhbiBpbnN0cnVjdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IGZvciBhbgorICAvLy8gaW5kaXJlY3QgZ2xvYmFsLCB0aGlzIG1hcCBpbmRpY2F0ZXMgd2hpY2ggb25lLgorICBEZW5zZU1hcDxjb25zdCBWYWx1ZSAqLCBjb25zdCBHbG9iYWxWYWx1ZSAqPiBBbGxvY3NGb3JJbmRpcmVjdEdsb2JhbHM7CisKKyAgLy8vIEZvciBlYWNoIGZ1bmN0aW9uLCBrZWVwIHRyYWNrIG9mIHdoYXQgZ2xvYmFscyBhcmUgbW9kaWZpZWQgb3IgcmVhZC4KKyAgRGVuc2VNYXA8Y29uc3QgRnVuY3Rpb24gKiwgRnVuY3Rpb25JbmZvPiBGdW5jdGlvbkluZm9zOworCisgIC8vLyBBIG1hcCBvZiBmdW5jdGlvbnMgdG8gU0NDLiBUaGUgU0NDcyBhcmUgZGVzY3JpYmVkIGJ5IGEgc2ltcGxlIGludGVnZXIKKyAgLy8vIElEIHRoYXQgaXMgb25seSB1c2VmdWwgZm9yIGNvbXBhcmluZyBmb3IgZXF1YWxpdHkgKGFyZSB0d28gZnVuY3Rpb25zCisgIC8vLyBpbiB0aGUgc2FtZSBTQ0Mgb3Igbm90PykKKyAgRGVuc2VNYXA8Y29uc3QgRnVuY3Rpb24gKiwgdW5zaWduZWQ+IEZ1bmN0aW9uVG9TQ0NNYXA7CisKKyAgLy8vIEhhbmRsZSB0byBjbGVhciB0aGlzIGFuYWx5c2lzIG9uIGRlbGV0aW9uIG9mIHZhbHVlcy4KKyAgc3RydWN0IERlbGV0aW9uQ2FsbGJhY2tIYW5kbGUgZmluYWwgOiBDYWxsYmFja1ZIIHsKKyAgICBHbG9iYWxzQUFSZXN1bHQgKkdBUjsKKyAgICBzdGQ6Omxpc3Q8RGVsZXRpb25DYWxsYmFja0hhbmRsZT46Oml0ZXJhdG9yIEk7CisKKyAgICBEZWxldGlvbkNhbGxiYWNrSGFuZGxlKEdsb2JhbHNBQVJlc3VsdCAmR0FSLCBWYWx1ZSAqVikKKyAgICAgICAgOiBDYWxsYmFja1ZIKFYpLCBHQVIoJkdBUikge30KKworICAgIHZvaWQgZGVsZXRlZCgpIG92ZXJyaWRlOworICB9OworCisgIC8vLyBMaXN0IG9mIGNhbGxiYWNrcyBmb3IgZ2xvYmFscyBiZWluZyB0cmFja2VkIGJ5IHRoaXMgYW5hbHlzaXMuIE5vdGUgdGhhdAorICAvLy8gdGhlc2Ugb2JqZWN0cyBhcmUgcXVpdGUgbGFyZ2UsIGJ1dCB3ZSBvbmx5IGFudGljaXBhdGUgaGF2aW5nIG9uZSBwZXIKKyAgLy8vIGdsb2JhbCB0cmFja2VkIGJ5IHRoaXMgYW5hbHlzaXMuIFRoZXJlIGFyZSBudW1lcm91cyBvcHRpbWl6YXRpb25zIHdlCisgIC8vLyBjb3VsZCBwZXJmb3JtIHRvIHRoZSBtZW1vcnkgdXRpbGl6YXRpb24gaGVyZSBpZiB0aGlzIGJlY29tZXMgYSBwcm9ibGVtLgorICBzdGQ6Omxpc3Q8RGVsZXRpb25DYWxsYmFja0hhbmRsZT4gSGFuZGxlczsKKworICBleHBsaWNpdCBHbG9iYWxzQUFSZXN1bHQoY29uc3QgRGF0YUxheW91dCAmREwsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICZUTEkpOworCitwdWJsaWM6CisgIEdsb2JhbHNBQVJlc3VsdChHbG9iYWxzQUFSZXN1bHQgJiZBcmcpOworICB+R2xvYmFsc0FBUmVzdWx0KCk7CisKKyAgc3RhdGljIEdsb2JhbHNBQVJlc3VsdCBhbmFseXplTW9kdWxlKE1vZHVsZSAmTSwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJlRMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxHcmFwaCAmQ0cpOworCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEltcGxlbWVudCB0aGUgQWxpYXNBbmFseXNpcyBBUEkKKyAgLy8KKyAgQWxpYXNSZXN1bHQgYWxpYXMoY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0EsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NCKTsKKworICB1c2luZyBBQVJlc3VsdEJhc2U6OmdldE1vZFJlZkluZm87CisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUywgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYyk7CisKKyAgLy8vIGdldE1vZFJlZkJlaGF2aW9yIC0gUmV0dXJuIHRoZSBiZWhhdmlvciBvZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGlmCisgIC8vLyBjYWxsZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGNhbGwgc2l0ZS4gIFRoZSBjYWxsIHNpdGUgbWF5IGJlIG51bGwgaW4gd2hpY2gKKyAgLy8vIGNhc2UgdGhlIG1vc3QgZ2VuZXJpYyBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihjb25zdCBGdW5jdGlvbiAqRik7CisKKyAgLy8vIGdldE1vZFJlZkJlaGF2aW9yIC0gUmV0dXJuIHRoZSBiZWhhdmlvciBvZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGlmCisgIC8vLyBjYWxsZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGNhbGwgc2l0ZS4gIFRoZSBjYWxsIHNpdGUgbWF5IGJlIG51bGwgaW4gd2hpY2gKKyAgLy8vIGNhc2UgdGhlIG1vc3QgZ2VuZXJpYyBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihJbW11dGFibGVDYWxsU2l0ZSBDUyk7CisKK3ByaXZhdGU6CisgIEZ1bmN0aW9uSW5mbyAqZ2V0RnVuY3Rpb25JbmZvKGNvbnN0IEZ1bmN0aW9uICpGKTsKKworICB2b2lkIEFuYWx5emVHbG9iYWxzKE1vZHVsZSAmTSk7CisgIHZvaWQgQW5hbHl6ZUNhbGxHcmFwaChDYWxsR3JhcGggJkNHLCBNb2R1bGUgJk0pOworICBib29sIEFuYWx5emVVc2VzT2ZQb2ludGVyKFZhbHVlICpWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0SW1wbDxGdW5jdGlvbiAqPiAqUmVhZGVycyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXRJbXBsPEZ1bmN0aW9uICo+ICpXcml0ZXJzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZSAqT2theVN0b3JlRGVzdCA9IG51bGxwdHIpOworICBib29sIEFuYWx5emVJbmRpcmVjdEdsb2JhbE1lbW9yeShHbG9iYWxWYXJpYWJsZSAqR1YpOworICB2b2lkIENvbGxlY3RTQ0NNZW1iZXJzaGlwKENhbGxHcmFwaCAmQ0cpOworCisgIGJvb2wgaXNOb25Fc2NhcGluZ0dsb2JhbE5vQWxpYXMoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCBjb25zdCBWYWx1ZSAqVik7CisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mb0ZvckFyZ3VtZW50KEltbXV0YWJsZUNhbGxTaXRlIENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YpOworfTsKKworLy8vIEFuYWx5c2lzIHBhc3MgcHJvdmlkaW5nIGEgbmV2ZXItaW52YWxpZGF0ZWQgYWxpYXMgYW5hbHlzaXMgcmVzdWx0LgorY2xhc3MgR2xvYmFsc0FBIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPEdsb2JhbHNBQT4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48R2xvYmFsc0FBPjsKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICB0eXBlZGVmIEdsb2JhbHNBQVJlc3VsdCBSZXN1bHQ7CisKKyAgR2xvYmFsc0FBUmVzdWx0IHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIExlZ2FjeSB3cmFwcGVyIHBhc3MgdG8gcHJvdmlkZSB0aGUgR2xvYmFsc0FBUmVzdWx0IG9iamVjdC4KK2NsYXNzIEdsb2JhbHNBQVdyYXBwZXJQYXNzIDogcHVibGljIE1vZHVsZVBhc3MgeworICBzdGQ6OnVuaXF1ZV9wdHI8R2xvYmFsc0FBUmVzdWx0PiBSZXN1bHQ7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgR2xvYmFsc0FBV3JhcHBlclBhc3MoKTsKKworICBHbG9iYWxzQUFSZXN1bHQgJmdldFJlc3VsdCgpIHsgcmV0dXJuICpSZXN1bHQ7IH0KKyAgY29uc3QgR2xvYmFsc0FBUmVzdWx0ICZnZXRSZXN1bHQoKSBjb25zdCB7IHJldHVybiAqUmVzdWx0OyB9CisKKyAgYm9vbCBydW5Pbk1vZHVsZShNb2R1bGUgJk0pIG92ZXJyaWRlOworICBib29sIGRvRmluYWxpemF0aW9uKE1vZHVsZSAmTSkgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBjcmVhdGVHbG9iYWxzQUFXcmFwcGVyUGFzcyAtIFRoaXMgcGFzcyBwcm92aWRlcyBhbGlhcyBhbmQgbW9kL3JlZiBpbmZvIGZvcgorLy8gZ2xvYmFsIHZhbHVlcyB0aGF0IGRvIG5vdCBoYXZlIHRoZWlyIGFkZHJlc3NlcyB0YWtlbi4KKy8vCitNb2R1bGVQYXNzICpjcmVhdGVHbG9iYWxzQUFXcmFwcGVyUGFzcygpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSVZVc2Vycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JVlVzZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1Yjk3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSVZVc2Vycy5oCkBAIC0wLDAgKzEsMjAyIEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9JVlVzZXJzLmggLSBJbmR1Y3Rpb24gVmFyaWFibGUgVXNlcnMgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGJvb2trZWVwaW5nIGZvciAiaW50ZXJlc3RpbmciIHVzZXJzIG9mIGV4cHJlc3Npb25zCisvLyBjb21wdXRlZCBmcm9tIGluZHVjdGlvbiB2YXJpYWJsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0lWVVNFUlNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0lWVVNFUlNfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wQW5hbHlzaXNNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uTm9ybWFsaXphdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc3N1bXB0aW9uQ2FjaGU7CitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBWYWx1ZTsKK2NsYXNzIFNjYWxhckV2b2x1dGlvbjsKK2NsYXNzIFNDRVY7CitjbGFzcyBJVlVzZXJzOworY2xhc3MgRGF0YUxheW91dDsKKworLy8vIElWU3RyaWRlVXNlIC0gS2VlcCB0cmFjayBvZiBvbmUgdXNlIG9mIGEgc3RyaWRlZCBpbmR1Y3Rpb24gdmFyaWFibGUuCisvLy8gVGhlIEV4cHIgbWVtYmVyIGtlZXBzIHRyYWNrIG9mIHRoZSBleHByZXNzaW9uLCBVc2VyIGlzIHRoZSBhY3R1YWwgdXNlcgorLy8vIGluc3RydWN0aW9uIG9mIHRoZSBvcGVyYW5kLCBhbmQgJ09wZXJhbmRWYWxUb1JlcGxhY2UnIGlzIHRoZSBvcGVyYW5kIG9mCisvLy8gdGhlIFVzZXIgdGhhdCBpcyB0aGUgdXNlLgorY2xhc3MgSVZTdHJpZGVVc2UgZmluYWwgOiBwdWJsaWMgQ2FsbGJhY2tWSCwgcHVibGljIGlsaXN0X25vZGU8SVZTdHJpZGVVc2U+IHsKKyAgZnJpZW5kIGNsYXNzIElWVXNlcnM7CitwdWJsaWM6CisgIElWU3RyaWRlVXNlKElWVXNlcnMgKlAsIEluc3RydWN0aW9uKiBVLCBWYWx1ZSAqTykKKyAgICA6IENhbGxiYWNrVkgoVSksIFBhcmVudChQKSwgT3BlcmFuZFZhbFRvUmVwbGFjZShPKSB7CisgIH0KKworICAvLy8gZ2V0VXNlciAtIFJldHVybiB0aGUgdXNlciBpbnN0cnVjdGlvbiBmb3IgdGhpcyB1c2UuCisgIEluc3RydWN0aW9uICpnZXRVc2VyKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PEluc3RydWN0aW9uPihnZXRWYWxQdHIoKSk7CisgIH0KKworICAvLy8gc2V0VXNlciAtIEFzc2lnbiBhIG5ldyB1c2VyIGluc3RydWN0aW9uIGZvciB0aGlzIHVzZS4KKyAgdm9pZCBzZXRVc2VyKEluc3RydWN0aW9uICpOZXdVc2VyKSB7CisgICAgc2V0VmFsUHRyKE5ld1VzZXIpOworICB9CisKKyAgLy8vIGdldE9wZXJhbmRWYWxUb1JlcGxhY2UgLSBSZXR1cm4gdGhlIFZhbHVlIG9mIHRoZSBvcGVyYW5kIGluIHRoZSB1c2VyCisgIC8vLyBpbnN0cnVjdGlvbiB0aGF0IHRoaXMgSVZTdHJpZGVVc2UgaXMgcmVwcmVzZW50aW5nLgorICBWYWx1ZSAqZ2V0T3BlcmFuZFZhbFRvUmVwbGFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gT3BlcmFuZFZhbFRvUmVwbGFjZTsKKyAgfQorCisgIC8vLyBzZXRPcGVyYW5kVmFsVG9SZXBsYWNlIC0gQXNzaWduIGEgbmV3IFZhbHVlIGFzIHRoZSBvcGVyYW5kIHZhbHVlCisgIC8vLyB0byByZXBsYWNlLgorICB2b2lkIHNldE9wZXJhbmRWYWxUb1JlcGxhY2UoVmFsdWUgKk9wKSB7CisgICAgT3BlcmFuZFZhbFRvUmVwbGFjZSA9IE9wOworICB9CisKKyAgLy8vIGdldFBvc3RJbmNMb29wcyAtIFJldHVybiB0aGUgc2V0IG9mIGxvb3BzIGZvciB3aGljaCB0aGUgZXhwcmVzc2lvbiBoYXMKKyAgLy8vIGJlZW4gYWRqdXN0ZWQgdG8gdXNlIHBvc3QtaW5jIG1vZGUuCisgIGNvbnN0IFBvc3RJbmNMb29wU2V0ICZnZXRQb3N0SW5jTG9vcHMoKSBjb25zdCB7CisgICAgcmV0dXJuIFBvc3RJbmNMb29wczsKKyAgfQorCisgIC8vLyB0cmFuc2Zvcm1Ub1Bvc3RJbmMgLSBUcmFuc2Zvcm0gdGhlIGV4cHJlc3Npb24gdG8gcG9zdC1pbmMgZm9ybSBmb3IgdGhlCisgIC8vLyBnaXZlbiBsb29wLgorICB2b2lkIHRyYW5zZm9ybVRvUG9zdEluYyhjb25zdCBMb29wICpMKTsKKworcHJpdmF0ZToKKyAgLy8vIFBhcmVudCAtIGEgcG9pbnRlciB0byB0aGUgSVZVc2VycyB0aGF0IG93bnMgdGhpcyBJVlN0cmlkZVVzZS4KKyAgSVZVc2VycyAqUGFyZW50OworCisgIC8vLyBPcGVyYW5kVmFsVG9SZXBsYWNlIC0gVGhlIFZhbHVlIG9mIHRoZSBvcGVyYW5kIGluIHRoZSB1c2VyIGluc3RydWN0aW9uCisgIC8vLyB0aGF0IHRoaXMgSVZTdHJpZGVVc2UgaXMgcmVwcmVzZW50aW5nLgorICBXZWFrVHJhY2tpbmdWSCBPcGVyYW5kVmFsVG9SZXBsYWNlOworCisgIC8vLyBQb3N0SW5jTG9vcHMgLSBUaGUgc2V0IG9mIGxvb3BzIGZvciB3aGljaCBFeHByIGhhcyBiZWVuIGFkanVzdGVkIHRvCisgIC8vLyB1c2UgcG9zdC1pbmMgbW9kZS4gVGhpcyBjb3JyZXNwb25kcyB3aXRoIFNDRVZFeHBhbmRlcidzIHBvc3QtaW5jIGNvbmNlcHQuCisgIFBvc3RJbmNMb29wU2V0IFBvc3RJbmNMb29wczsKKworICAvLy8gRGVsZXRlZCAtIEltcGxlbWVudGF0aW9uIG9mIENhbGxiYWNrVkggdmlydHVhbCBmdW5jdGlvbiB0bworICAvLy8gcmVjZWl2ZSBub3RpZmljYXRpb24gd2hlbiB0aGUgVXNlciBpcyBkZWxldGVkLgorICB2b2lkIGRlbGV0ZWQoKSBvdmVycmlkZTsKK307CisKK2NsYXNzIElWVXNlcnMgeworICBmcmllbmQgY2xhc3MgSVZTdHJpZGVVc2U7CisgIExvb3AgKkw7CisgIEFzc3VtcHRpb25DYWNoZSAqQUM7CisgIExvb3BJbmZvICpMSTsKKyAgRG9taW5hdG9yVHJlZSAqRFQ7CisgIFNjYWxhckV2b2x1dGlvbiAqU0U7CisgIFNtYWxsUHRyU2V0PEluc3RydWN0aW9uKiwgMTY+IFByb2Nlc3NlZDsKKworICAvLy8gSVZVc2VzIC0gQSBsaXN0IG9mIGFsbCB0cmFja2VkIElWIHVzZXMgb2YgaW5kdWN0aW9uIHZhcmlhYmxlIGV4cHJlc3Npb25zCisgIC8vLyB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4KKyAgaWxpc3Q8SVZTdHJpZGVVc2U+IElWVXNlczsKKworICAvLyBFcGhlbWVyYWwgdmFsdWVzIHVzZWQgYnkgQGxsdm0uYXNzdW1lIGluIHRoaXMgZnVuY3Rpb24uCisgIFNtYWxsUHRyU2V0PGNvbnN0IFZhbHVlICosIDMyPiBFcGhWYWx1ZXM7CisKK3B1YmxpYzoKKyAgSVZVc2VycyhMb29wICpMLCBBc3N1bXB0aW9uQ2FjaGUgKkFDLCBMb29wSW5mbyAqTEksIERvbWluYXRvclRyZWUgKkRULAorICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiAqU0UpOworCisgIElWVXNlcnMoSVZVc2VycyAmJlgpCisgICAgICA6IEwoc3RkOjptb3ZlKFguTCkpLCBBQyhzdGQ6Om1vdmUoWC5BQykpLCBEVChzdGQ6Om1vdmUoWC5EVCkpLAorICAgICAgICBTRShzdGQ6Om1vdmUoWC5TRSkpLCBQcm9jZXNzZWQoc3RkOjptb3ZlKFguUHJvY2Vzc2VkKSksCisgICAgICAgIElWVXNlcyhzdGQ6Om1vdmUoWC5JVlVzZXMpKSwgRXBoVmFsdWVzKHN0ZDo6bW92ZShYLkVwaFZhbHVlcykpIHsKKyAgICBmb3IgKElWU3RyaWRlVXNlICZVIDogSVZVc2VzKQorICAgICAgVS5QYXJlbnQgPSB0aGlzOworICB9CisgIElWVXNlcnMoY29uc3QgSVZVc2VycyAmKSA9IGRlbGV0ZTsKKyAgSVZVc2VycyAmb3BlcmF0b3I9KElWVXNlcnMgJiYpID0gZGVsZXRlOworICBJVlVzZXJzICZvcGVyYXRvcj0oY29uc3QgSVZVc2VycyAmKSA9IGRlbGV0ZTsKKworICBMb29wICpnZXRMb29wKCkgY29uc3QgeyByZXR1cm4gTDsgfQorCisgIC8vLyBBZGRVc2Vyc0lmSW50ZXJlc3RpbmcgLSBJbnNwZWN0IHRoZSBzcGVjaWZpZWQgSW5zdHJ1Y3Rpb24uICBJZiBpdCBpcyBhCisgIC8vLyByZWR1Y2libGUgU0NFViwgcmVjdXJzaXZlbHkgYWRkIGl0cyB1c2VycyB0byB0aGUgSVZVc2VzQnlTdHJpZGUgc2V0IGFuZAorICAvLy8gcmV0dXJuIHRydWUuICBPdGhlcndpc2UsIHJldHVybiBmYWxzZS4KKyAgYm9vbCBBZGRVc2Vyc0lmSW50ZXJlc3RpbmcoSW5zdHJ1Y3Rpb24gKkkpOworCisgIElWU3RyaWRlVXNlICZBZGRVc2VyKEluc3RydWN0aW9uICpVc2VyLCBWYWx1ZSAqT3BlcmFuZCk7CisKKyAgLy8vIGdldFJlcGxhY2VtZW50RXhwciAtIFJldHVybiBhIFNDRVYgZXhwcmVzc2lvbiB3aGljaCBjb21wdXRlcyB0aGUKKyAgLy8vIHZhbHVlIG9mIHRoZSBPcGVyYW5kVmFsVG9SZXBsYWNlIG9mIHRoZSBnaXZlbiBJVlN0cmlkZVVzZS4KKyAgY29uc3QgU0NFViAqZ2V0UmVwbGFjZW1lbnRFeHByKGNvbnN0IElWU3RyaWRlVXNlICZJVSkgY29uc3Q7CisKKyAgLy8vIGdldEV4cHIgLSBSZXR1cm4gdGhlIGV4cHJlc3Npb24gZm9yIHRoZSB1c2UuCisgIGNvbnN0IFNDRVYgKmdldEV4cHIoY29uc3QgSVZTdHJpZGVVc2UgJklVKSBjb25zdDsKKworICBjb25zdCBTQ0VWICpnZXRTdHJpZGUoY29uc3QgSVZTdHJpZGVVc2UgJklVLCBjb25zdCBMb29wICpMKSBjb25zdDsKKworICB0eXBlZGVmIGlsaXN0PElWU3RyaWRlVXNlPjo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgaWxpc3Q8SVZTdHJpZGVVc2U+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBJVlVzZXMuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSAgIHsgcmV0dXJuIElWVXNlcy5lbmQoKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIElWVXNlcy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0ICAgeyByZXR1cm4gSVZVc2VzLmVuZCgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBJVlVzZXMuZW1wdHkoKTsgfQorCisgIGJvb2wgaXNJVlVzZXJPck9wZXJhbmQoSW5zdHJ1Y3Rpb24gKkluc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJvY2Vzc2VkLmNvdW50KEluc3QpOworICB9CisKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCk7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSAqID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIGR1bXAgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBkZWJ1Z2dpbmcuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIGJvb2wgQWRkVXNlcnNJbXBsKEluc3RydWN0aW9uICpJLCBTbWFsbFB0clNldEltcGw8TG9vcCo+ICZTaW1wbGVMb29wTmVzdHMpOworfTsKKworUGFzcyAqY3JlYXRlSVZVc2Vyc1Bhc3MoKTsKKworY2xhc3MgSVZVc2Vyc1dyYXBwZXJQYXNzIDogcHVibGljIExvb3BQYXNzIHsKKyAgc3RkOjp1bmlxdWVfcHRyPElWVXNlcnM+IElVOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIElWVXNlcnNXcmFwcGVyUGFzcygpOworCisgIElWVXNlcnMgJmdldElVKCkgeyByZXR1cm4gKklVOyB9CisgIGNvbnN0IElWVXNlcnMgJmdldElVKCkgY29uc3QgeyByZXR1cm4gKklVOyB9CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIHJ1bk9uTG9vcChMb29wICpMLCBMUFBhc3NNYW5hZ2VyICZMUE0pIG92ZXJyaWRlOworCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlOworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUgKiA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vIEFuYWx5c2lzIHBhc3MgdGhhdCBleHBvc2VzIHRoZSBcYyBJVlVzZXJzIGZvciBhIGxvb3AuCitjbGFzcyBJVlVzZXJzQW5hbHlzaXMgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48SVZVc2Vyc0FuYWx5c2lzPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxJVlVzZXJzQW5hbHlzaXM+OworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIHR5cGVkZWYgSVZVc2VycyBSZXN1bHQ7CisKKyAgSVZVc2VycyBydW4oTG9vcCAmTCwgTG9vcEFuYWx5c2lzTWFuYWdlciAmQU0sCisgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmQVIpOworfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW5kaXJlY3RDYWxsUHJvbW90aW9uQW5hbHlzaXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW5kaXJlY3RDYWxsUHJvbW90aW9uQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjFjMTAxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbmRpcmVjdENhbGxQcm9tb3Rpb25BbmFseXNpcy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8vPT09LSBJbmRpcmVjdENhbGxQcm9tb3Rpb25BbmFseXNpcy5oIC0gSW5kaXJlY3QgY2FsbCBhbmFseXNpcyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBJbnRlcmZhY2UgdG8gaWRlbnRpZnkgaW5kaXJlY3QgY2FsbCBwcm9tb3Rpb24gY2FuZGlkYXRlcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0lORElSRUNUQ0FMTFBST01PVElPTkFOQUxZU0lTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19JTkRJUkVDVENBTExQUk9NT1RJT05BTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEluc3RydWN0aW9uOworCisvLyBDbGFzcyBmb3IgaWRlbnRpZnlpbmcgcHJvZml0YWJsZSBpbmRpcmVjdCBjYWxsIHByb21vdGlvbiBjYW5kaWRhdGVzIHdoZW4KKy8vIHRoZSBpbmRpcmVjdC1jYWxsIHZhbHVlIHByb2ZpbGUgbWV0YWRhdGEgaXMgYXZhaWxhYmxlLgorY2xhc3MgSUNhbGxQcm9tb3Rpb25BbmFseXNpcyB7Citwcml2YXRlOgorICAvLyBBbGxvY2F0ZSBzcGFjZSB0byByZWFkIHRoZSBwcm9maWxlIGFubm90YXRpb24uCisgIHN0ZDo6dW5pcXVlX3B0cjxJbnN0clByb2ZWYWx1ZURhdGFbXT4gVmFsdWVEYXRhQXJyYXk7CisKKyAgLy8gQ291bnQgaXMgdGhlIGNhbGwgY291bnQgZm9yIHRoZSBkaXJlY3QtY2FsbCB0YXJnZXQuCisgIC8vIFRvdGFsQ291bnQgaXMgdGhlIHRvdGFsIGNhbGwgY291bnQgZm9yIHRoZSBpbmRpcmVjdC1jYWxsIGNhbGxzaXRlLgorICAvLyBSZW1haW5pbmdDb3VudCBpcyB0aGUgVG90YWxDb3VudCBtaW51cyBwcm9tb3RlZC1kaXJlY3QtY2FsbCBjb3VudC4KKyAgLy8gUmV0dXJuIHRydWUgd2Ugc2hvdWxkIHByb21vdGUgdGhpcyBpbmRpcmVjdC1jYWxsIHRhcmdldC4KKyAgYm9vbCBpc1Byb21vdGlvblByb2ZpdGFibGUodWludDY0X3QgQ291bnQsIHVpbnQ2NF90IFRvdGFsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFJlbWFpbmluZ0NvdW50KTsKKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcHJvZml0YWJsZSBjYW5kaWRhdGVzIHRvIHByb21vdGUgZm9yIHRoZQorICAvLyBjdXJyZW50IFZhbHVlRGF0YUFycmF5IGFuZCB0aGUgZ2l2ZW4gXHAgSW5zdC4KKyAgdWludDMyX3QgZ2V0UHJvZml0YWJsZVByb21vdGlvbkNhbmRpZGF0ZXMoY29uc3QgSW5zdHJ1Y3Rpb24gKkluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE51bVZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFRvdGFsQ291bnQpOworCisgIC8vIE5vbmNvcHlhYmxlCisgIElDYWxsUHJvbW90aW9uQW5hbHlzaXMoY29uc3QgSUNhbGxQcm9tb3Rpb25BbmFseXNpcyAmb3RoZXIpID0gZGVsZXRlOworICBJQ2FsbFByb21vdGlvbkFuYWx5c2lzICYKKyAgb3BlcmF0b3I9KGNvbnN0IElDYWxsUHJvbW90aW9uQW5hbHlzaXMgJm90aGVyKSA9IGRlbGV0ZTsKKworcHVibGljOgorICBJQ2FsbFByb21vdGlvbkFuYWx5c2lzKCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHJlZmVyZW5jZSB0byBhcnJheSBvZiBJbnN0clByb2ZWYWx1ZURhdGEgZm9yIHRoZSBnaXZlbgorICAvLy8gaW5zdHJ1Y3Rpb24gXHAgSS4KKyAgLy8vCisgIC8vLyBUaGUgXHAgTnVtVmFscywgXHAgVG90YWxDb3VudCBhbmQgXHAgTnVtQ2FuZGlkYXRlcworICAvLy8gYXJlIHNldCB0byB0aGUgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgYXJyYXksIHRoZSB0b3RhbCBwcm9maWxlIGNvdW50CisgIC8vLyBvZiB0aGUgaW5kaXJlY3QgY2FsbCBccCBJLCBhbmQgdGhlIG51bWJlciBvZiBwcm9maXRhYmxlIGNhbmRpZGF0ZXMKKyAgLy8vIGluIHRoZSBnaXZlbiBhcnJheSAod2hpY2ggaXMgc29ydGVkIGluIHJldmVyc2Ugb3JkZXIgb2YgcHJvZml0YWJpbGl0eSkuCisgIC8vLworICAvLy8gVGhlIHJldHVybmVkIGFycmF5IHNwYWNlIGlzIG93bmVkIGJ5IHRoaXMgY2xhc3MsIGFuZCBvdmVyd3JpdHRlbiBvbgorICAvLy8gc3Vic2VxdWVudCBjYWxscy4KKyAgQXJyYXlSZWY8SW5zdHJQcm9mVmFsdWVEYXRhPgorICBnZXRQcm9tb3Rpb25DYW5kaWRhdGVzRm9ySW5zdHJ1Y3Rpb24oY29uc3QgSW5zdHJ1Y3Rpb24gKkksIHVpbnQzMl90ICZOdW1WYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgJlRvdGFsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmTnVtQ2FuZGlkYXRlcyk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW5kaXJlY3RDYWxsU2l0ZVZpc2l0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW5kaXJlY3RDYWxsU2l0ZVZpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGU1NmExCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbmRpcmVjdENhbGxTaXRlVmlzaXRvci5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vPT09LS0gSW5kaXJlY3RDYWxsU2l0ZVZpc2l0b3IuaCAtIGluZGlyZWN0IGNhbGwtc2l0ZXMgdmlzaXRvciAtLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGRlZmluZXMgYSB2aXNpdG9yIGNsYXNzIGFuZCBhIGhlbHBlciBmdW5jdGlvbiB0aGF0IGZpbmQKKy8vIGFsbCBpbmRpcmVjdCBjYWxsLXNpdGVzIGluIGEgZnVuY3Rpb24uCisKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RWaXNpdG9yLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisvLyBWaXNpdG9yIGNsYXNzIHRoYXQgZmluZHMgYWxsIGluZGlyZWN0IGNhbGwgc2l0ZXMuCitzdHJ1Y3QgUEdPSW5kaXJlY3RDYWxsU2l0ZVZpc2l0b3IKKyAgICA6IHB1YmxpYyBJbnN0VmlzaXRvcjxQR09JbmRpcmVjdENhbGxTaXRlVmlzaXRvcj4geworICBzdGQ6OnZlY3RvcjxJbnN0cnVjdGlvbiAqPiBJbmRpcmVjdENhbGxJbnN0czsKKyAgUEdPSW5kaXJlY3RDYWxsU2l0ZVZpc2l0b3IoKSB7fQorCisgIHZvaWQgdmlzaXRDYWxsU2l0ZShDYWxsU2l0ZSBDUykgeworICAgIGlmIChDUy5pc0luZGlyZWN0Q2FsbCgpKQorICAgICAgSW5kaXJlY3RDYWxsSW5zdHMucHVzaF9iYWNrKENTLmdldEluc3RydWN0aW9uKCkpOworICB9Cit9OworCisvLyBIZWxwZXIgZnVuY3Rpb24gdGhhdCBmaW5kcyBhbGwgaW5kaXJlY3QgY2FsbCBzaXRlcy4KK2lubGluZSBzdGQ6OnZlY3RvcjxJbnN0cnVjdGlvbiAqPiBmaW5kSW5kaXJlY3RDYWxsU2l0ZXMoRnVuY3Rpb24gJkYpIHsKKyAgUEdPSW5kaXJlY3RDYWxsU2l0ZVZpc2l0b3IgSUNWOworICBJQ1YudmlzaXQoRik7CisgIHJldHVybiBJQ1YuSW5kaXJlY3RDYWxsSW5zdHM7Cit9Cit9CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0lubGluZUNvc3QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW5saW5lQ29zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOGQzYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0lubGluZUNvc3QuaApAQCAtMCwwICsxLDIxNCBAQAorLy89PT0tIElubGluZUNvc3QuaCAtIENvc3QgYW5hbHlzaXMgZm9yIGlubGluZXIgLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBoZXVyaXN0aWNzIGZvciBpbmxpbmluZyBkZWNpc2lvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0lOTElORUNPU1RfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0lOTElORUNPU1RfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Bc3N1bXB0aW9uQ2FjaGUuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NhbGxHcmFwaFNDQ1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL09wdGltaXphdGlvblJlbWFya0VtaXR0ZXIuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNsaW1pdHM+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEFzc3VtcHRpb25DYWNoZVRyYWNrZXI7CitjbGFzcyBCbG9ja0ZyZXF1ZW5jeUluZm87CitjbGFzcyBDYWxsU2l0ZTsKK2NsYXNzIERhdGFMYXlvdXQ7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIFByb2ZpbGVTdW1tYXJ5SW5mbzsKK2NsYXNzIFRhcmdldFRyYW5zZm9ybUluZm87CisKK25hbWVzcGFjZSBJbmxpbmVDb25zdGFudHMgeworLy8gVmFyaW91cyB0aHJlc2hvbGRzIHVzZWQgYnkgaW5saW5lIGNvc3QgYW5hbHlzaXMuCisvLy8gVXNlIHdoZW4gb3B0c2l6ZSAoLU9zKSBpcyBzcGVjaWZpZWQuCitjb25zdCBpbnQgT3B0U2l6ZVRocmVzaG9sZCA9IDUwOworCisvLy8gVXNlIHdoZW4gbWluc2l6ZSAoLU96KSBpcyBzcGVjaWZpZWQuCitjb25zdCBpbnQgT3B0TWluU2l6ZVRocmVzaG9sZCA9IDU7CisKKy8vLyBVc2Ugd2hlbiAtTzMgaXMgc3BlY2lmaWVkLgorY29uc3QgaW50IE9wdEFnZ3Jlc3NpdmVUaHJlc2hvbGQgPSAyNTA7CisKKy8vIFZhcmlvdXMgbWFnaWMgY29uc3RhbnRzIHVzZWQgdG8gYWRqdXN0IGhldXJpc3RpY3MuCitjb25zdCBpbnQgSW5zdHJDb3N0ID0gNTsKK2NvbnN0IGludCBJbmRpcmVjdENhbGxUaHJlc2hvbGQgPSAxMDA7Citjb25zdCBpbnQgQ2FsbFBlbmFsdHkgPSAyNTsKK2NvbnN0IGludCBMYXN0Q2FsbFRvU3RhdGljQm9udXMgPSAxNTAwMDsKK2NvbnN0IGludCBDb2xkY2NQZW5hbHR5ID0gMjAwMDsKK2NvbnN0IGludCBOb3JldHVyblBlbmFsdHkgPSAxMDAwMDsKKy8vLyBEbyBub3QgaW5saW5lIGZ1bmN0aW9ucyB3aGljaCBhbGxvY2F0ZSB0aGlzIG1hbnkgYnl0ZXMgb24gdGhlIHN0YWNrCisvLy8gd2hlbiB0aGUgY2FsbGVyIGlzIHJlY3Vyc2l2ZS4KK2NvbnN0IHVuc2lnbmVkIFRvdGFsQWxsb2NhU2l6ZVJlY3Vyc2l2ZUNhbGxlciA9IDEwMjQ7Cit9CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyB0aGUgY29zdCBvZiBpbmxpbmluZyBhIGZ1bmN0aW9uLgorLy8vCisvLy8gVGhpcyBzdXBwb3J0cyBzcGVjaWFsIHZhbHVlcyBmb3IgZnVuY3Rpb25zIHdoaWNoIHNob3VsZCAiYWx3YXlzIiBvcgorLy8vICJuZXZlciIgYmUgaW5saW5lZC4gT3RoZXJ3aXNlLCB0aGUgY29zdCByZXByZXNlbnRzIGEgdW5pdGxlc3MgYW1vdW50OworLy8vIHNtYWxsZXIgdmFsdWVzIGluY3JlYXNlIHRoZSBsaWtlbGlob29kIG9mIHRoZSBmdW5jdGlvbiBiZWluZyBpbmxpbmVkLgorLy8vCisvLy8gT2JqZWN0cyBvZiB0aGlzIHR5cGUgYWxzbyBwcm92aWRlIHRoZSBhZGp1c3RlZCB0aHJlc2hvbGQgZm9yIGlubGluaW5nCisvLy8gYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBmb3IgYSBwYXJ0aWN1bGFyIGNhbGxzaXRlLiBUaGV5IGNhbiBiZQorLy8vIGRpcmVjdGx5IHRlc3RlZCB0byBkZXRlcm1pbmUgaWYgaW5saW5pbmcgc2hvdWxkIG9jY3VyIGdpdmVuIHRoZSBjb3N0IGFuZAorLy8vIHRocmVzaG9sZCBmb3IgdGhpcyBjb3N0IG1ldHJpYy4KK2NsYXNzIElubGluZUNvc3QgeworICBlbnVtIFNlbnRpbmVsVmFsdWVzIHsKKyAgICBBbHdheXNJbmxpbmVDb3N0ID0gSU5UX01JTiwKKyAgICBOZXZlcklubGluZUNvc3QgPSBJTlRfTUFYCisgIH07CisKKyAgLy8vIFxicmllZiBUaGUgZXN0aW1hdGVkIGNvc3Qgb2YgaW5saW5pbmcgdGhpcyBjYWxsc2l0ZS4KKyAgY29uc3QgaW50IENvc3Q7CisKKyAgLy8vIFxicmllZiBUaGUgYWRqdXN0ZWQgdGhyZXNob2xkIGFnYWluc3Qgd2hpY2ggdGhpcyBjb3N0IHdhcyBjb21wdXRlZC4KKyAgY29uc3QgaW50IFRocmVzaG9sZDsKKworICAvLyBUcml2aWFsIGNvbnN0cnVjdG9yLCBpbnRlcmVzdGluZyBsb2dpYyBpbiB0aGUgZmFjdG9yeSBmdW5jdGlvbnMgYmVsb3cuCisgIElubGluZUNvc3QoaW50IENvc3QsIGludCBUaHJlc2hvbGQpIDogQ29zdChDb3N0KSwgVGhyZXNob2xkKFRocmVzaG9sZCkge30KKworcHVibGljOgorICBzdGF0aWMgSW5saW5lQ29zdCBnZXQoaW50IENvc3QsIGludCBUaHJlc2hvbGQpIHsKKyAgICBhc3NlcnQoQ29zdCA+IEFsd2F5c0lubGluZUNvc3QgJiYgIkNvc3QgY3Jvc3NlcyBzZW50aW5lbCB2YWx1ZSIpOworICAgIGFzc2VydChDb3N0IDwgTmV2ZXJJbmxpbmVDb3N0ICYmICJDb3N0IGNyb3NzZXMgc2VudGluZWwgdmFsdWUiKTsKKyAgICByZXR1cm4gSW5saW5lQ29zdChDb3N0LCBUaHJlc2hvbGQpOworICB9CisgIHN0YXRpYyBJbmxpbmVDb3N0IGdldEFsd2F5cygpIHsKKyAgICByZXR1cm4gSW5saW5lQ29zdChBbHdheXNJbmxpbmVDb3N0LCAwKTsKKyAgfQorICBzdGF0aWMgSW5saW5lQ29zdCBnZXROZXZlcigpIHsKKyAgICByZXR1cm4gSW5saW5lQ29zdChOZXZlcklubGluZUNvc3QsIDApOworICB9CisKKyAgLy8vIFxicmllZiBUZXN0IHdoZXRoZXIgdGhlIGlubGluZSBjb3N0IGlzIGxvdyBlbm91Z2ggZm9yIGlubGluaW5nLgorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgIHJldHVybiBDb3N0IDwgVGhyZXNob2xkOworICB9CisKKyAgYm9vbCBpc0Fsd2F5cygpIGNvbnN0IHsgcmV0dXJuIENvc3QgPT0gQWx3YXlzSW5saW5lQ29zdDsgfQorICBib29sIGlzTmV2ZXIoKSBjb25zdCB7IHJldHVybiBDb3N0ID09IE5ldmVySW5saW5lQ29zdDsgfQorICBib29sIGlzVmFyaWFibGUoKSBjb25zdCB7IHJldHVybiAhaXNBbHdheXMoKSAmJiAhaXNOZXZlcigpOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGlubGluZSBjb3N0IGVzdGltYXRlLgorICAvLy8gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIG9uIGFuICJhbHdheXMiIG9yICJuZXZlciIgSW5saW5lQ29zdC4KKyAgaW50IGdldENvc3QoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzVmFyaWFibGUoKSAmJiAiSW52YWxpZCBhY2Nlc3Mgb2YgSW5saW5lQ29zdCIpOworICAgIHJldHVybiBDb3N0OworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHRocmVzaG9sZCBhZ2FpbnN0IHdoaWNoIHRoZSBjb3N0IHdhcyBjb21wdXRlZAorICBpbnQgZ2V0VGhyZXNob2xkKCkgY29uc3QgeworICAgIGFzc2VydChpc1ZhcmlhYmxlKCkgJiYgIkludmFsaWQgYWNjZXNzIG9mIElubGluZUNvc3QiKTsKKyAgICByZXR1cm4gVGhyZXNob2xkOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGNvc3QgZGVsdGEgZnJvbSB0aGUgdGhyZXNob2xkIGZvciBpbmxpbmluZy4KKyAgLy8vIE9ubHkgdmFsaWQgaWYgdGhlIGNvc3QgaXMgb2YgdGhlIHZhcmlhYmxlIGtpbmQuIFJldHVybnMgYSBuZWdhdGl2ZQorICAvLy8gdmFsdWUgaWYgdGhlIGNvc3QgaXMgdG9vIGhpZ2ggdG8gaW5saW5lLgorICBpbnQgZ2V0Q29zdERlbHRhKCkgY29uc3QgeyByZXR1cm4gVGhyZXNob2xkIC0gZ2V0Q29zdCgpOyB9Cit9OworCisvLy8gVGhyZXNob2xkcyB0byB0dW5lIGlubGluZSBjb3N0IGFuYWx5c2lzLiBUaGUgaW5saW5lIGNvc3QgYW5hbHlzaXMgZGVjaWRlcworLy8vIHRoZSBjb25kaXRpb24gdG8gYXBwbHkgYSB0aHJlc2hvbGQgYW5kIGFwcGxpZXMgaXQuIE90aGVyd2lzZSwKKy8vLyBEZWZhdWx0VGhyZXNob2xkIGlzIHVzZWQuIElmIGEgdGhyZXNob2xkIGlzIE9wdGlvbmFsLCBpdCBpcyBhcHBsaWVkIG9ubHkKKy8vLyB3aGVuIGl0IGhhcyBhIHZhbGlkIHZhbHVlLiBUeXBpY2FsbHksIHVzZXJzIG9mIGlubGluZSBjb3N0IGFuYWx5c2lzCisvLy8gb2J0YWluIGFuIElubGluZVBhcmFtcyBvYmplY3QgdGhyb3VnaCBvbmUgb2YgdGhlIFxjIGdldElubGluZVBhcmFtcyBtZXRob2RzCisvLy8gYW5kIHBhc3MgaXQgdG8gXGMgZ2V0SW5saW5lQ29zdC4gU29tZSBzcGVjaWFsaXplZCB2ZXJzaW9ucyBvZiBpbmxpbmVyCisvLy8gKHN1Y2ggYXMgdGhlIHByZS1pbmxpbmVyKSBtaWdodCBoYXZlIGN1c3RvbSBsb2dpYyB0byBjb21wdXRlIFxjIElubGluZVBhcmFtcworLy8vIG9iamVjdC4KKworc3RydWN0IElubGluZVBhcmFtcyB7CisgIC8vLyBUaGUgZGVmYXVsdCB0aHJlc2hvbGQgdG8gc3RhcnQgd2l0aCBmb3IgYSBjYWxsZWUuCisgIGludCBEZWZhdWx0VGhyZXNob2xkOworCisgIC8vLyBUaHJlc2hvbGQgdG8gdXNlIGZvciBjYWxsZWVzIHdpdGggaW5saW5lIGhpbnQuCisgIE9wdGlvbmFsPGludD4gSGludFRocmVzaG9sZDsKKworICAvLy8gVGhyZXNob2xkIHRvIHVzZSBmb3IgY29sZCBjYWxsZWVzLgorICBPcHRpb25hbDxpbnQ+IENvbGRUaHJlc2hvbGQ7CisKKyAgLy8vIFRocmVzaG9sZCB0byB1c2Ugd2hlbiB0aGUgY2FsbGVyIGlzIG9wdGltaXplZCBmb3Igc2l6ZS4KKyAgT3B0aW9uYWw8aW50PiBPcHRTaXplVGhyZXNob2xkOworCisgIC8vLyBUaHJlc2hvbGQgdG8gdXNlIHdoZW4gdGhlIGNhbGxlciBpcyBvcHRpbWl6ZWQgZm9yIG1pbnNpemUuCisgIE9wdGlvbmFsPGludD4gT3B0TWluU2l6ZVRocmVzaG9sZDsKKworICAvLy8gVGhyZXNob2xkIHRvIHVzZSB3aGVuIHRoZSBjYWxsc2l0ZSBpcyBjb25zaWRlcmVkIGhvdC4KKyAgT3B0aW9uYWw8aW50PiBIb3RDYWxsU2l0ZVRocmVzaG9sZDsKKworICAvLy8gVGhyZXNob2xkIHRvIHVzZSB3aGVuIHRoZSBjYWxsc2l0ZSBpcyBjb25zaWRlcmVkIGhvdCByZWxhdGl2ZSB0byBmdW5jdGlvbgorICAvLy8gZW50cnkuCisgIE9wdGlvbmFsPGludD4gTG9jYWxseUhvdENhbGxTaXRlVGhyZXNob2xkOworCisgIC8vLyBUaHJlc2hvbGQgdG8gdXNlIHdoZW4gdGhlIGNhbGxzaXRlIGlzIGNvbnNpZGVyZWQgY29sZC4KKyAgT3B0aW9uYWw8aW50PiBDb2xkQ2FsbFNpdGVUaHJlc2hvbGQ7CisKKyAgLy8vIENvbXB1dGUgaW5saW5lIGNvc3QgZXZlbiB3aGVuIHRoZSBjb3N0IGhhcyBleGNlZWRlZCB0aGUgdGhyZXNob2xkLgorICBPcHRpb25hbDxib29sPiBDb21wdXRlRnVsbElubGluZUNvc3Q7Cit9OworCisvLy8gR2VuZXJhdGUgdGhlIHBhcmFtZXRlcnMgdG8gdHVuZSB0aGUgaW5saW5lIGNvc3QgYW5hbHlzaXMgYmFzZWQgb25seSBvbiB0aGUKKy8vLyBjb21tYW5kbGluZSBvcHRpb25zLgorSW5saW5lUGFyYW1zIGdldElubGluZVBhcmFtcygpOworCisvLy8gR2VuZXJhdGUgdGhlIHBhcmFtZXRlcnMgdG8gdHVuZSB0aGUgaW5saW5lIGNvc3QgYW5hbHlzaXMgYmFzZWQgb24gY29tbWFuZAorLy8vIGxpbmUgb3B0aW9ucy4gSWYgLWlubGluZS10aHJlc2hvbGQgb3B0aW9uIGlzIG5vdCBleHBsaWNpdGx5IHBhc3NlZCwKKy8vLyBccCBUaHJlc2hvbGQgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCB0aHJlc2hvbGQuCitJbmxpbmVQYXJhbXMgZ2V0SW5saW5lUGFyYW1zKGludCBUaHJlc2hvbGQpOworCisvLy8gR2VuZXJhdGUgdGhlIHBhcmFtZXRlcnMgdG8gdHVuZSB0aGUgaW5saW5lIGNvc3QgYW5hbHlzaXMgYmFzZWQgb24gY29tbWFuZAorLy8vIGxpbmUgb3B0aW9ucy4gSWYgLWlubGluZS10aHJlc2hvbGQgb3B0aW9uIGlzIG5vdCBleHBsaWNpdGx5IHBhc3NlZCwKKy8vLyB0aGUgZGVmYXVsdCB0aHJlc2hvbGQgaXMgY29tcHV0ZWQgZnJvbSBccCBPcHRMZXZlbCBhbmQgXHAgU2l6ZU9wdExldmVsLgorLy8vIEFuIFxwIE9wdExldmVsIHZhbHVlIGFib3ZlIDMgaXMgY29uc2lkZXJlZCBhbiBhZ2dyZXNzaXZlIG9wdGltaXphdGlvbiBtb2RlLgorLy8vIFxwIFNpemVPcHRMZXZlbCBvZiAxIGNvcnJlc3BvbmRzIHRvIHRoZSAtT3MgZmxhZyBhbmQgMiBjb3JyZXNwb25kcyB0bworLy8vIHRoZSAtT3ogZmxhZy4KK0lubGluZVBhcmFtcyBnZXRJbmxpbmVQYXJhbXModW5zaWduZWQgT3B0TGV2ZWwsIHVuc2lnbmVkIFNpemVPcHRMZXZlbCk7CisKKy8vLyBSZXR1cm4gdGhlIGNvc3QgYXNzb2NpYXRlZCB3aXRoIGEgY2FsbHNpdGUsIGluY2x1ZGluZyBwYXJhbWV0ZXIgcGFzc2luZworLy8vIGFuZCB0aGUgY2FsbC9yZXR1cm4gaW5zdHJ1Y3Rpb24uCitpbnQgZ2V0Q2FsbHNpdGVDb3N0KENhbGxTaXRlIENTLCBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisKKy8vLyBcYnJpZWYgR2V0IGFuIElubGluZUNvc3Qgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY29zdCBvZiBpbmxpbmluZyB0aGlzCisvLy8gY2FsbHNpdGUuCisvLy8KKy8vLyBOb3RlIHRoYXQgYSBkZWZhdWx0IHRocmVzaG9sZCBpcyBwYXNzZWQgaW50byB0aGlzIGZ1bmN0aW9uLiBUaGlzIHRocmVzaG9sZAorLy8vIGNvdWxkIGJlIG1vZGlmaWVkIGJhc2VkIG9uIGNhbGxzaXRlJ3MgcHJvcGVydGllcyBhbmQgb25seSBjb3N0cyBiZWxvdyB0aGlzCisvLy8gbmV3IHRocmVzaG9sZCBhcmUgY29tcHV0ZWQgd2l0aCBhbnkgYWNjdXJhY3kuIFRoZSBuZXcgdGhyZXNob2xkIGNhbiBiZQorLy8vIHVzZWQgdG8gYm91bmQgdGhlIGNvbXB1dGF0aW9uIG5lY2Vzc2FyeSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29zdCBpcworLy8vIHN1ZmZpY2llbnRseSBsb3cgdG8gd2FycmFudCBpbmxpbmluZy4KKy8vLworLy8vIEFsc28gbm90ZSB0aGF0IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAqZHluYW1pY2FsbHkqIGNvbXB1dGVzIHRoZSBjb3N0IG9mCisvLy8gaW5saW5pbmcgdGhlIGNhbGxzaXRlLiBJdCBpcyBhbiBleHBlbnNpdmUsIGhlYXZ5d2VpZ2h0IGNhbGwuCitJbmxpbmVDb3N0IGdldElubGluZUNvc3QoCisgICAgQ2FsbFNpdGUgQ1MsIGNvbnN0IElubGluZVBhcmFtcyAmUGFyYW1zLCBUYXJnZXRUcmFuc2Zvcm1JbmZvICZDYWxsZWVUVEksCisgICAgc3RkOjpmdW5jdGlvbjxBc3N1bXB0aW9uQ2FjaGUgJihGdW5jdGlvbiAmKT4gJkdldEFzc3VtcHRpb25DYWNoZSwKKyAgICBPcHRpb25hbDxmdW5jdGlvbl9yZWY8QmxvY2tGcmVxdWVuY3lJbmZvICYoRnVuY3Rpb24gJik+PiBHZXRCRkksCisgICAgUHJvZmlsZVN1bW1hcnlJbmZvICpQU0ksIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgKk9SRSA9IG51bGxwdHIpOworCisvLy8gXGJyaWVmIEdldCBhbiBJbmxpbmVDb3N0IHdpdGggdGhlIGNhbGxlZSBleHBsaWNpdGx5IHNwZWNpZmllZC4KKy8vLyBUaGlzIGFsbG93cyB5b3UgdG8gY2FsY3VsYXRlIHRoZSBjb3N0IG9mIGlubGluaW5nIGEgZnVuY3Rpb24gdmlhIGEKKy8vLyBwb2ludGVyLiBUaGlzIGJlaGF2ZXMgZXhhY3RseSBhcyB0aGUgdmVyc2lvbiB3aXRoIG5vIGV4cGxpY2l0IGNhbGxlZQorLy8vIHBhcmFtZXRlciBpbiBhbGwgb3RoZXIgcmVzcGVjdHMuCisvLworSW5saW5lQ29zdAorZ2V0SW5saW5lQ29zdChDYWxsU2l0ZSBDUywgRnVuY3Rpb24gKkNhbGxlZSwgY29uc3QgSW5saW5lUGFyYW1zICZQYXJhbXMsCisgICAgICAgICAgICAgIFRhcmdldFRyYW5zZm9ybUluZm8gJkNhbGxlZVRUSSwKKyAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxBc3N1bXB0aW9uQ2FjaGUgJihGdW5jdGlvbiAmKT4gJkdldEFzc3VtcHRpb25DYWNoZSwKKyAgICAgICAgICAgICAgT3B0aW9uYWw8ZnVuY3Rpb25fcmVmPEJsb2NrRnJlcXVlbmN5SW5mbyAmKEZ1bmN0aW9uICYpPj4gR2V0QkZJLAorICAgICAgICAgICAgICBQcm9maWxlU3VtbWFyeUluZm8gKlBTSSwgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAqT1JFKTsKKworLy8vIFxicmllZiBNaW5pbWFsIGZpbHRlciB0byBkZXRlY3QgaW52YWxpZCBjb25zdHJ1Y3RzIGZvciBpbmxpbmluZy4KK2Jvb2wgaXNJbmxpbmVWaWFibGUoRnVuY3Rpb24gJkNhbGxlZSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbnN0cnVjdGlvblNpbXBsaWZ5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0luc3RydWN0aW9uU2ltcGxpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjg5NmJkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbnN0cnVjdGlvblNpbXBsaWZ5LmgKQEAgLTAsMCArMSwyNTIgQEAKKy8vPT09LS0gSW5zdHJ1Y3Rpb25TaW1wbGlmeS5oIC0gRm9sZCBpbnN0cnMgaW50byBzaW1wbGVyIGZvcm1zIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHJvdXRpbmVzIGZvciBmb2xkaW5nIGluc3RydWN0aW9ucyBpbnRvIHNpbXBsZXIgZm9ybXMKKy8vIHRoYXQgZG8gbm90IHJlcXVpcmUgY3JlYXRpbmcgbmV3IGluc3RydWN0aW9ucy4gIFRoaXMgZG9lcyBjb25zdGFudCBmb2xkaW5nCisvLyAoImFkZCBpMzIgMSwgMSIgLT4gIjIiKSBidXQgY2FuIGFsc28gaGFuZGxlIG5vbi1jb25zdGFudCBvcGVyYW5kcywgZWl0aGVyCisvLyByZXR1cm5pbmcgYSBjb25zdGFudCAoImFuZCBpMzIgJXgsIDAiIC0+ICIwIikgb3IgYW4gYWxyZWFkeSBleGlzdGluZyB2YWx1ZQorLy8gKCJhbmQgaTMyICV4LCAleCIgLT4gIiV4IikuICBJZiB0aGUgc2ltcGxpZmljYXRpb24gaXMgYWxzbyBhbiBpbnN0cnVjdGlvbgorLy8gdGhlbiBpdCBkb21pbmF0ZXMgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uLgorLy8KKy8vIFRoZXNlIHJvdXRpbmVzIGltcGxpY2l0bHkgcmVzb2x2ZSB1bmRlZiB1c2VzLiBUaGUgZWFzaWVzdCB3YXkgdG8gYmUgc2FmZSB3aGVuCisvLyB1c2luZyB0aGVzZSByb3V0aW5lcyB0byBvYnRhaW4gc2ltcGxpZmllZCB2YWx1ZXMgZm9yIGV4aXN0aW5nIGluc3RydWN0aW9ucyBpcworLy8gdG8gYWx3YXlzIHJlcGxhY2UgYWxsIHVzZXMgb2YgdGhlIGluc3RydWN0aW9ucyB3aXRoIHRoZSByZXN1bHRpbmcgc2ltcGxpZmllZAorLy8gdmFsdWVzLiBUaGlzIHdpbGwgcHJldmVudCBvdGhlciBjb2RlIGZyb20gc2VlaW5nIHRoZSBzYW1lIHVuZGVmIHVzZXMgYW5kCisvLyByZXNvbHZpbmcgdGhlbSB0byBkaWZmZXJlbnQgdmFsdWVzLgorLy8KKy8vIFRoZXNlIHJvdXRpbmVzIGFyZSBkZXNpZ25lZCB0byB0b2xlcmF0ZSBtb2RlcmF0ZWx5IGluY29tcGxldGUgSVIsIHN1Y2ggYXMKKy8vIGluc3RydWN0aW9ucyB0aGF0IGFyZSBub3QgY29ubmVjdGVkIHRvIGJhc2ljIGJsb2NrcyB5ZXQuIEhvd2V2ZXIsIHRoZXkgZG8KKy8vIHJlcXVpcmUgdGhhdCBhbGwgdGhlIElSIHRoYXQgdGhleSBlbmNvdW50ZXIgYmUgdmFsaWQuIEluIHBhcnRpY3VsYXIsIHRoZXkKKy8vIHJlcXVpcmUgdGhhdCBhbGwgbm9uLWNvbnN0YW50IHZhbHVlcyBiZSBkZWZpbmVkIGluIHRoZSBzYW1lIGZ1bmN0aW9uLCBhbmQgdGhlCisvLyBzYW1lIGNhbGwgY29udGV4dCBvZiB0aGF0IGZ1bmN0aW9uIChhbmQgbm90IHNwbGl0IGJldHdlZW4gY2FsbGVyIGFuZCBjYWxsZWUKKy8vIGNvbnRleHRzIG9mIGEgZGlyZWN0bHkgcmVjdXJzaXZlIGNhbGwsIGZvciBleGFtcGxlKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfSU5TVFJVQ1RJT05TSU1QTElGWV9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfSU5TVFJVQ1RJT05TSU1QTElGWV9ICisKKyNpbmNsdWRlICJsbHZtL0lSL1VzZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgRnVuY3Rpb247Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gVEFyZ3M+IGNsYXNzIEFuYWx5c2lzTWFuYWdlcjsKK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBBcnJheVJlZjsKK2NsYXNzIEFzc3VtcHRpb25DYWNoZTsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIEltbXV0YWJsZUNhbGxTaXRlOworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIEZhc3RNYXRoRmxhZ3M7CitzdHJ1Y3QgTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzOworY2xhc3MgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlcjsKK2NsYXNzIFBhc3M7CitjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbzsKK2NsYXNzIFR5cGU7CitjbGFzcyBWYWx1ZTsKKworc3RydWN0IFNpbXBsaWZ5UXVlcnkgeworICBjb25zdCBEYXRhTGF5b3V0ICZETDsKKyAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSA9IG51bGxwdHI7CisgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cjsKKyAgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHI7CisgIGNvbnN0IEluc3RydWN0aW9uICpDeHRJID0gbnVsbHB0cjsKKworICBTaW1wbGlmeVF1ZXJ5KGNvbnN0IERhdGFMYXlvdXQgJkRMLCBjb25zdCBJbnN0cnVjdGlvbiAqQ1hUSSA9IG51bGxwdHIpCisgICAgICA6IERMKERMKSwgQ3h0SShDWFRJKSB7fQorCisgIFNpbXBsaWZ5UXVlcnkoY29uc3QgRGF0YUxheW91dCAmREwsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEksCisgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgIEFzc3VtcHRpb25DYWNoZSAqQUMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpDWFRJID0gbnVsbHB0cikKKyAgICAgIDogREwoREwpLCBUTEkoVExJKSwgRFQoRFQpLCBBQyhBQyksIEN4dEkoQ1hUSSkge30KKyAgU2ltcGxpZnlRdWVyeSBnZXRXaXRoSW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0IHsKKyAgICBTaW1wbGlmeVF1ZXJ5IENvcHkoKnRoaXMpOworICAgIENvcHkuQ3h0SSA9IEk7CisgICAgcmV0dXJuIENvcHk7CisgIH0KK307CisKKy8vIE5PVEU6IHRoZSBleHBsaWNpdCBtdWx0aXBsZSBhcmd1bWVudCB2ZXJzaW9ucyBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlCisvLyBkZXByZWNhdGVkLgorLy8gUGxlYXNlIHVzZSB0aGUgU2ltcGxpZnlRdWVyeSB2ZXJzaW9ucyBpbiBuZXcgY29kZS4KKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBBZGQsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeUFkZEluc3QoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgYm9vbCBpc05TVywgYm9vbCBpc05VVywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYSBTdWIsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeVN1Ykluc3QoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgYm9vbCBpc05TVywgYm9vbCBpc05VVywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYW4gRkFkZCwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5RkFkZEluc3QoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgRmFzdE1hdGhGbGFncyBGTUYsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBGU3ViLCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlGU3ViSW5zdChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBGYXN0TWF0aEZsYWdzIEZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGFuIEZNdWwsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeUZNdWxJbnN0KFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIEZhc3RNYXRoRmxhZ3MgRk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYSBNdWwsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeU11bEluc3QoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYW4gU0RpdiwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5U0Rpdkluc3QoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYSBVRGl2LCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlVRGl2SW5zdChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBGRGl2LCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlGRGl2SW5zdChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBGYXN0TWF0aEZsYWdzIEZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGFuIFNSZW0sIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeVNSZW1JbnN0KFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGEgVVJlbSwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5VVJlbUluc3QoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYW4gRlJlbSwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5RlJlbUluc3QoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgRmFzdE1hdGhGbGFncyBGTUYsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhIFNobCwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5U2hsSW5zdChWYWx1ZSAqT3AwLCBWYWx1ZSAqT3AxLCBib29sIGlzTlNXLCBib29sIGlzTlVXLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhIExTaHIsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeUxTaHJJbnN0KFZhbHVlICpPcDAsIFZhbHVlICpPcDEsIGJvb2wgaXNFeGFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGEgQVNociwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsbC4KK1ZhbHVlICpTaW1wbGlmeUFTaHJJbnN0KFZhbHVlICpPcDAsIFZhbHVlICpPcDEsIGJvb2wgaXNFeGFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGFuIEFuZCwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5QW5kSW5zdChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBPciwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5T3JJbnN0KFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGFuIFhvciwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5WG9ySW5zdChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBJQ21wSW5zdCwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5SUNtcEluc3QodW5zaWduZWQgUHJlZGljYXRlLCBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYW4gRkNtcEluc3QsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeUZDbXBJbnN0KHVuc2lnbmVkIFByZWRpY2F0ZSwgVmFsdWUgKkxIUywgVmFsdWUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhc3RNYXRoRmxhZ3MgRk1GLCBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhIFNlbGVjdEluc3QsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeVNlbGVjdEluc3QoVmFsdWUgKkNvbmQsIFZhbHVlICpUcnVlVmFsLCBWYWx1ZSAqRmFsc2VWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGEgR2V0RWxlbWVudFB0ckluc3QsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeUdFUEluc3QoVHlwZSAqU3JjVHksIEFycmF5UmVmPFZhbHVlICo+IE9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYW4gSW5zZXJ0VmFsdWVJbnN0LCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlJbnNlcnRWYWx1ZUluc3QoVmFsdWUgKkFnZywgVmFsdWUgKlZhbCwgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYW4gSW5zZXJ0RWxlbWVudCwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5SW5zZXJ0RWxlbWVudEluc3QoVmFsdWUgKlZlYywgVmFsdWUgKkVsdCwgVmFsdWUgKklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGFuIEV4dHJhY3RWYWx1ZUluc3QsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeUV4dHJhY3RWYWx1ZUluc3QoVmFsdWUgKkFnZywgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGFuIEV4dHJhY3RFbGVtZW50SW5zdCwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5RXh0cmFjdEVsZW1lbnRJbnN0KFZhbHVlICpWZWMsIFZhbHVlICpJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYSBDYXN0SW5zdCwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5Q2FzdEluc3QodW5zaWduZWQgQ2FzdE9wYywgVmFsdWUgKk9wLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGEgU2h1ZmZsZVZlY3Rvckluc3QsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeVNodWZmbGVWZWN0b3JJbnN0KFZhbHVlICpPcDAsIFZhbHVlICpPcDEsIENvbnN0YW50ICpNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqUmV0VHksIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLz09PSBIZWxwZXIgZnVuY3Rpb25zIGZvciBoaWdoZXIgdXAgdGhlIGNsYXNzIGhpZXJhcmNoeS4KKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhIENtcEluc3QsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeUNtcEluc3QodW5zaWduZWQgUHJlZGljYXRlLCBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhIEJpbmFyeU9wZXJhdG9yLCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlCaW5PcCh1bnNpZ25lZCBPcGNvZGUsIFZhbHVlICpMSFMsIFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBGUCBCaW5hcnlPcGVyYXRvciwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorLy8vIEluIGNvbnRyYXN0IHRvIFNpbXBsaWZ5QmluT3AsIHRyeSB0byB1c2UgRmFzdE1hdGhGbGFnIHdoZW4gZm9sZGluZyB0aGUKKy8vLyByZXN1bHQuIEluIGNhc2Ugd2UgZG9uJ3QgbmVlZCBGYXN0TWF0aEZsYWdzLCBzaW1wbHkgZmFsbCB0byBTaW1wbGlmeUJpbk9wLgorVmFsdWUgKlNpbXBsaWZ5RlBCaW5PcCh1bnNpZ25lZCBPcGNvZGUsIFZhbHVlICpMSFMsIFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgIEZhc3RNYXRoRmxhZ3MgRk1GLCBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIGEgY2FsbHNpdGUsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeUNhbGwoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gYSBmdW5jdGlvbiBhbmQgaXRlcmF0b3JzIG92ZXIgYXJndW1lbnRzLCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuCisvLy8gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeUNhbGwoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsIFZhbHVlICpWLCBVc2VyOjpvcF9pdGVyYXRvciBBcmdCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgVXNlcjo6b3BfaXRlcmF0b3IgQXJnRW5kLCBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIGEgZnVuY3Rpb24gYW5kIHNldCBvZiBhcmd1bWVudHMsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeUNhbGwoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsIFZhbHVlICpWLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIFNlZSBpZiB3ZSBjYW4gY29tcHV0ZSBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGlzIGluc3RydWN0aW9uLiBJZiBub3QsCisvLy8gcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAqSSwgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgKk9SRSA9IG51bGxwdHIpOworCisvLy8gUmVwbGFjZSBhbGwgdXNlcyBvZiAnSScgd2l0aCAnU2ltcGxlVicgYW5kIHNpbXBsaWZ5IHRoZSB1c2VzIHJlY3Vyc2l2ZWx5LgorLy8vCisvLy8gVGhpcyBmaXJzdCBwZXJmb3JtcyBhIG5vcm1hbCBSQVVXIG9mIEkgd2l0aCBTaW1wbGVWLiBJdCB0aGVuIHJlY3Vyc2l2ZWx5CisvLy8gYXR0ZW1wdHMgdG8gc2ltcGxpZnkgdGhvc2UgdXNlcnMgdXBkYXRlZCBieSB0aGUgb3BlcmF0aW9uLiBUaGUgJ0knCisvLy8gaW5zdHJ1Y3Rpb24gbXVzdCBub3QgYmUgZXF1YWwgdG8gdGhlIHNpbXBsaWZpZWQgdmFsdWUgJ1NpbXBsZVYnLgorLy8vCisvLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBhbnkgc2ltcGxpZmljYXRpb25zIHdlcmUgcGVyZm9ybWVkLgorYm9vbCByZXBsYWNlQW5kUmVjdXJzaXZlbHlTaW1wbGlmeShJbnN0cnVjdGlvbiAqSSwgVmFsdWUgKlNpbXBsZVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc3VtcHRpb25DYWNoZSAqQUMgPSBudWxscHRyKTsKKworLy8vIFJlY3Vyc2l2ZWx5IGF0dGVtcHQgdG8gc2ltcGxpZnkgYW4gaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBUaGlzIHJvdXRpbmUgdXNlcyBTaW1wbGlmeUluc3RydWN0aW9uIHRvIHNpbXBsaWZ5ICdJJywgYW5kIGlmIHN1Y2Nlc3NmdWwKKy8vLyByZXBsYWNlcyB1c2VzIG9mICdJJyB3aXRoIHRoZSBzaW1wbGlmaWVkIHZhbHVlLiBJdCB0aGVuIHJlY3Vyc2VzIG9uIGVhY2gKKy8vLyBvZiB0aGUgdXNlcnMgaW1wYWN0ZWQuIEl0IHJldHVybnMgdHJ1ZSBpZiBhbnkgc2ltcGxpZmljYXRpb25zIHdlcmUKKy8vLyBwZXJmb3JtZWQuCitib29sIHJlY3Vyc2l2ZWx5U2ltcGxpZnlJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHIpOworCisvLyBUaGVzZSBoZWxwZXIgZnVuY3Rpb25zIHJldHVybiBhIFNpbXBsaWZ5UXVlcnkgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgYXMKKy8vIG1hbnkgb2YgdGhlIG9wdGlvbmFsIGFuYWx5c2lzIHdlIHVzZSBhcyBhcmUgY3VycmVudGx5IHZhbGlkLiAgVGhpcyBpcyB0aGUKKy8vIHN0cm9uZ2x5IHByZWZlcnJlZCB3YXkgb2YgY29uc3RydWN0aW5nIFNpbXBsaWZ5UXVlcnkgaW4gcGFzc2VzLgorY29uc3QgU2ltcGxpZnlRdWVyeSBnZXRCZXN0U2ltcGxpZnlRdWVyeShQYXNzICYsIEZ1bmN0aW9uICYpOwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzLi4uIFRBcmdzPgorY29uc3QgU2ltcGxpZnlRdWVyeSBnZXRCZXN0U2ltcGxpZnlRdWVyeShBbmFseXNpc01hbmFnZXI8VCwgVEFyZ3MuLi4+ICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uICYpOworY29uc3QgU2ltcGxpZnlRdWVyeSBnZXRCZXN0U2ltcGxpZnlRdWVyeShMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmKTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0ludGVydmFsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0ludGVydmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3MTRkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW50ZXJ2YWwuaApAQCAtMCwwICsxLDE0MiBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvSW50ZXJ2YWwuaCAtIEludGVydmFsIENsYXNzIERlY2xhcmF0aW9uIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBJbnRlcnZhbCBjbGFzcywgd2hpY2gKKy8vIHJlcHJlc2VudHMgYSBzZXQgb2YgQ0ZHIG5vZGVzIGFuZCBpcyBhIHBvcnRpb24gb2YgYW4gaW50ZXJ2YWwgcGFydGl0aW9uLgorLy8KKy8vIEludGVydmFscyBoYXZlIHNvbWUgaW50ZXJlc3RpbmcgYW5kIHVzZWZ1bCBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgdGhlCisvLyBmb2xsb3dpbmc6CisvLyAgICAxLiBUaGUgaGVhZGVyIG5vZGUgb2YgYW4gaW50ZXJ2YWwgZG9taW5hdGVzIGFsbCBvZiB0aGUgZWxlbWVudHMgb2YgdGhlCisvLyAgICAgICBpbnRlcnZhbAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19JTlRFUlZBTF9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfSU5URVJWQUxfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBJbnRlcnZhbCBDbGFzcyAtIEFuIEludGVydmFsIGlzIGEgc2V0IG9mIG5vZGVzIGRlZmluZWQgc3VjaCB0aGF0IGV2ZXJ5IG5vZGUKKy8vLyBpbiB0aGUgaW50ZXJ2YWwgaGFzIGFsbCBvZiBpdHMgcHJlZGVjZXNzb3JzIGluIHRoZSBpbnRlcnZhbCAoZXhjZXB0IGZvciB0aGUKKy8vLyBoZWFkZXIpCisvLy8KK2NsYXNzIEludGVydmFsIHsKKyAgLy8vIEhlYWRlck5vZGUgLSBUaGUgaGVhZGVyIEJhc2ljQmxvY2ssIHdoaWNoIGRvbWluYXRlcyBhbGwgQmFzaWNCbG9ja3MgaW4gdGhpcworICAvLy8gaW50ZXJ2YWwuICBBbHNvLCBhbnkgbG9vcHMgaW4gdGhpcyBpbnRlcnZhbCBtdXN0IGdvIHRocm91Z2ggdGhlIEhlYWRlck5vZGUuCisgIC8vLworICBCYXNpY0Jsb2NrICpIZWFkZXJOb2RlOworCitwdWJsaWM6CisgIHVzaW5nIHN1Y2NfaXRlcmF0b3IgPSBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrKj46Oml0ZXJhdG9yOworICB1c2luZyBwcmVkX2l0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+OjppdGVyYXRvcjsKKyAgdXNpbmcgbm9kZV9pdGVyYXRvciA9IHN0ZDo6dmVjdG9yPEJhc2ljQmxvY2sqPjo6aXRlcmF0b3I7CisKKyAgaW5saW5lIEludGVydmFsKEJhc2ljQmxvY2sgKkhlYWRlcikgOiBIZWFkZXJOb2RlKEhlYWRlcikgeworICAgIE5vZGVzLnB1c2hfYmFjayhIZWFkZXIpOworICB9CisKKyAgaW5saW5lIEJhc2ljQmxvY2sgKmdldEhlYWRlck5vZGUoKSBjb25zdCB7IHJldHVybiBIZWFkZXJOb2RlOyB9CisKKyAgLy8vIE5vZGVzIC0gVGhlIGJhc2ljIGJsb2NrcyBpbiB0aGlzIGludGVydmFsLgorICBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrKj4gTm9kZXM7CisKKyAgLy8vIFN1Y2Nlc3NvcnMgLSBMaXN0IG9mIEJhc2ljQmxvY2tzIHRoYXQgYXJlIHJlYWNoYWJsZSBkaXJlY3RseSBmcm9tIG5vZGVzIGluCisgIC8vLyB0aGlzIGludGVydmFsLCBidXQgYXJlIG5vdCBpbiB0aGUgaW50ZXJ2YWwgdGhlbXNlbHZlcy4KKyAgLy8vIFRoZXNlIG5vZGVzIG5lY2Vzc2FyaWx5IG11c3QgYmUgaGVhZGVyIG5vZGVzIGZvciBvdGhlciBpbnRlcnZhbHMuCisgIHN0ZDo6dmVjdG9yPEJhc2ljQmxvY2sqPiBTdWNjZXNzb3JzOworCisgIC8vLyBQcmVkZWNlc3NvcnMgLSBMaXN0IG9mIEJhc2ljQmxvY2tzIHRoYXQgaGF2ZSB0aGlzIEludGVydmFsJ3MgaGVhZGVyIGJsb2NrCisgIC8vLyBhcyBvbmUgb2YgdGhlaXIgc3VjY2Vzc29ycy4KKyAgc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+IFByZWRlY2Vzc29yczsKKworICAvLy8gY29udGFpbnMgLSBGaW5kIG91dCBpZiBhIGJhc2ljIGJsb2NrIGlzIGluIHRoaXMgaW50ZXJ2YWwKKyAgaW5saW5lIGJvb2wgY29udGFpbnMoQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICBmb3IgKEJhc2ljQmxvY2sgKk5vZGUgOiBOb2RlcykKKyAgICAgIGlmIChOb2RlID09IEJCKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gSSBkb24ndCB3YW50IHRoZSBkZXBlbmRlbmN5IG9uIDxhbGdvcml0aG0+CisgICAgLy9yZXR1cm4gZmluZChOb2Rlcy5iZWdpbigpLCBOb2Rlcy5lbmQoKSwgQkIpICE9IE5vZGVzLmVuZCgpOworICB9CisKKyAgLy8vIGlzU3VjY2Vzc29yIC0gZmluZCBvdXQgaWYgYSBiYXNpYyBibG9jayBpcyBhIHN1Y2Nlc3NvciBvZiB0aGlzIEludGVydmFsCisgIGlubGluZSBib29sIGlzU3VjY2Vzc29yKEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgZm9yIChCYXNpY0Jsb2NrICpTdWNjZXNzb3IgOiBTdWNjZXNzb3JzKQorICAgICAgaWYgKFN1Y2Nlc3NvciA9PSBCQikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIEkgZG9uJ3Qgd2FudCB0aGUgZGVwZW5kZW5jeSBvbiA8YWxnb3JpdGhtPgorICAgIC8vcmV0dXJuIGZpbmQoU3VjY2Vzc29ycy5iZWdpbigpLCBTdWNjZXNzb3JzLmVuZCgpLCBCQikgIT0gU3VjY2Vzc29ycy5lbmQoKTsKKyAgfQorCisgIC8vLyBFcXVhbGl0eSBvcGVyYXRvci4gIEl0IGlzIG9ubHkgdmFsaWQgdG8gY29tcGFyZSB0d28gaW50ZXJ2YWxzIGZyb20gdGhlCisgIC8vLyBzYW1lIHBhcnRpdGlvbiwgYmVjYXVzZSBvZiB0aGlzLCBhbGwgd2UgaGF2ZSB0byBjaGVjayBpcyB0aGUgaGVhZGVyIG5vZGUKKyAgLy8vIGZvciBlcXVhbGl0eS4KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbnRlcnZhbCAmSSkgY29uc3QgeworICAgIHJldHVybiBIZWFkZXJOb2RlID09IEkuSGVhZGVyTm9kZTsKKyAgfQorCisgIC8vLyBpc0xvb3AgLSBGaW5kIG91dCBpZiB0aGVyZSBpcyBhIGJhY2sgZWRnZSBpbiB0aGlzIGludGVydmFsLi4uCisgIGJvb2wgaXNMb29wKCkgY29uc3Q7CisKKyAgLy8vIHByaW50IC0gU2hvdyBjb250ZW50cyBpbiBodW1hbiByZWFkYWJsZSBmb3JtYXQuLi4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTykgY29uc3Q7Cit9OworCisvLy8gc3VjY19iZWdpbi9zdWNjX2VuZCAtIGRlZmluZSBtZXRob2RzIHNvIHRoYXQgSW50ZXJ2YWxzIG1heSBiZSB1c2VkCisvLy8ganVzdCBsaWtlIEJhc2ljQmxvY2tzIGNhbiB3aXRoIHRoZSBzdWNjXyogZnVuY3Rpb25zLCBhbmQgKjo6c3VjY19pdGVyYXRvci4KKy8vLworaW5saW5lIEludGVydmFsOjpzdWNjX2l0ZXJhdG9yIHN1Y2NfYmVnaW4oSW50ZXJ2YWwgKkkpIHsKKyAgcmV0dXJuIEktPlN1Y2Nlc3NvcnMuYmVnaW4oKTsKK30KK2lubGluZSBJbnRlcnZhbDo6c3VjY19pdGVyYXRvciBzdWNjX2VuZChJbnRlcnZhbCAqSSkgICB7CisgIHJldHVybiBJLT5TdWNjZXNzb3JzLmVuZCgpOworfQorCisvLy8gcHJlZF9iZWdpbi9wcmVkX2VuZCAtIGRlZmluZSBtZXRob2RzIHNvIHRoYXQgSW50ZXJ2YWxzIG1heSBiZSB1c2VkCisvLy8ganVzdCBsaWtlIEJhc2ljQmxvY2tzIGNhbiB3aXRoIHRoZSBwcmVkXyogZnVuY3Rpb25zLCBhbmQgKjo6cHJlZF9pdGVyYXRvci4KKy8vLworaW5saW5lIEludGVydmFsOjpwcmVkX2l0ZXJhdG9yIHByZWRfYmVnaW4oSW50ZXJ2YWwgKkkpIHsKKyAgcmV0dXJuIEktPlByZWRlY2Vzc29ycy5iZWdpbigpOworfQoraW5saW5lIEludGVydmFsOjpwcmVkX2l0ZXJhdG9yIHByZWRfZW5kKEludGVydmFsICpJKSAgIHsKKyAgcmV0dXJuIEktPlByZWRlY2Vzc29ycy5lbmQoKTsKK30KKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEludGVydmFsKj4geworICB1c2luZyBOb2RlUmVmID0gSW50ZXJ2YWwgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBJbnRlcnZhbDo6c3VjY19pdGVyYXRvcjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoSW50ZXJ2YWwgKkkpIHsgcmV0dXJuIEk7IH0KKworICAvLy8gbm9kZXNfaXRlcmF0b3IvYmVnaW4vZW5kIC0gQWxsb3cgaXRlcmF0aW9uIG92ZXIgYWxsIG5vZGVzIGluIHRoZSBncmFwaAorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7IHJldHVybiBzdWNjX2JlZ2luKE4pOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBzdWNjX2VuZChOKTsgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEludmVyc2U8SW50ZXJ2YWwqPj4geworICB1c2luZyBOb2RlUmVmID0gSW50ZXJ2YWwgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBJbnRlcnZhbDo6cHJlZF9pdGVyYXRvcjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoSW52ZXJzZTxJbnRlcnZhbCAqPiBHKSB7IHJldHVybiBHLkdyYXBoOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIHByZWRfYmVnaW4oTik7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsgcmV0dXJuIHByZWRfZW5kKE4pOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19JTlRFUlZBTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0ludGVydmFsSXRlcmF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW50ZXJ2YWxJdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZmNhZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0ludGVydmFsSXRlcmF0b3IuaApAQCAtMCwwICsxLDI2OCBAQAorLy89PT0tIEludGVydmFsSXRlcmF0b3IuaCAtIEludGVydmFsIEl0ZXJhdG9yIERlY2xhcmF0aW9uIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbiBpdGVyYXRvciB0aGF0IGVudW1lcmF0ZXMgdGhlIGludGVydmFscyBpbiBhIGNvbnRyb2wgZmxvdworLy8gZ3JhcGggb2Ygc29tZSBzb3J0LiAgVGhpcyBpdGVyYXRvciBpcyBwYXJhbWV0cmljLCBhbGxvd2luZyBpdGVyYXRvciBvdmVyIHRoZQorLy8gZm9sbG93aW5nIHR5cGVzIG9mIGdyYXBoczoKKy8vCisvLyAgMS4gQSBGdW5jdGlvbiogb2JqZWN0LCBjb21wb3NlZCBvZiBCYXNpY0Jsb2NrIG5vZGVzLgorLy8gIDIuIEFuIEludGVydmFsUGFydGl0aW9uJiBvYmplY3QsIGNvbXBvc2VkIG9mIEludGVydmFsIG5vZGVzLgorLy8KKy8vIFRoaXMgaXRlcmF0b3IgaXMgZGVmaW5lZCB0byB3YWxrIHRoZSBjb250cm9sIGZsb3cgZ3JhcGgsIHJldHVybmluZyBpbnRlcnZhbHMKKy8vIGluIGRlcHRoIGZpcnN0IG9yZGVyLiAgVGhlc2UgaW50ZXJ2YWxzIGFyZSBjb21wbGV0ZWx5IGZpbGxlZCBpbiBleGNlcHQgZm9yCisvLyB0aGUgcHJlZGVjZXNzb3IgZmllbGRzICh0aGUgc3VjY2Vzc29yIGluZm9ybWF0aW9uIGlzIGZpbGxlZCBpbiBob3dldmVyKS4KKy8vCisvLyBCeSBkZWZhdWx0LCB0aGUgaW50ZXJ2YWxzIGNyZWF0ZWQgYnkgdGhpcyBpdGVyYXRvciBhcmUgZGVsZXRlZCBhZnRlciB0aGV5CisvLyBhcmUgbm8gbG9uZ2VyIGFueSB1c2UgdG8gdGhlIGl0ZXJhdG9yLiAgVGhpcyBiZWhhdmlvciBjYW4gYmUgY2hhbmdlZCBieQorLy8gcGFzc2luZyBhIGZhbHNlIHZhbHVlIGludG8gdGhlIGludGVydmFsc19iZWdpbigpIGZ1bmN0aW9uLiBUaGlzIGNhdXNlcyB0aGUKKy8vIElPd25NZW0gbWVtYmVyIHRvIGJlIHNldCwgYW5kIHRoZSBpbnRlcnZhbHMgdG8gbm90IGJlIGRlbGV0ZWQuCisvLworLy8gSXQgaXMgb25seSBzYWZlIHRvIHVzZSB0aGlzIGlmIGFsbCBvZiB0aGUgaW50ZXJ2YWxzIGFyZSBkZWxldGVkIGJ5IHRoZSBjYWxsZXIKKy8vIGFuZCBhbGwgb2YgdGhlIGludGVydmFscyBhcmUgcHJvY2Vzc2VkLiAgSG93ZXZlciwgdGhlIHVzZXIgb2YgdGhlIGl0ZXJhdG9yIGlzCisvLyBub3QgYWxsb3dlZCB0byBtb2RpZnkgb3IgZGVsZXRlIHRoZSBpbnRlcnZhbHMgdW50aWwgYWZ0ZXIgdGhlIGl0ZXJhdG9yIGhhcworLy8gYmVlbiB1c2VkIGNvbXBsZXRlbHkuICBUaGUgSW50ZXJ2YWxQYXJ0aXRpb24gY2xhc3MgdXNlcyB0aGlzIGZ1bmN0aW9uYWxpdHkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0lOVEVSVkFMSVRFUkFUT1JfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0lOVEVSVkFMSVRFUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0ludGVydmFsLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JbnRlcnZhbFBhcnRpdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CisKKy8vIGdldE5vZGVIZWFkZXIgLSBHaXZlbiBhIHNvdXJjZSBncmFwaCBub2RlIGFuZCB0aGUgc291cmNlIGdyYXBoLCByZXR1cm4gdGhlCisvLyBCYXNpY0Jsb2NrIHRoYXQgaXMgdGhlIGhlYWRlciBub2RlLiAgVGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2YKKy8vIGdldFNvdXJjZUdyYXBoTm9kZS4KK2lubGluZSBCYXNpY0Jsb2NrICpnZXROb2RlSGVhZGVyKEJhc2ljQmxvY2sgKkJCKSB7IHJldHVybiBCQjsgfQoraW5saW5lIEJhc2ljQmxvY2sgKmdldE5vZGVIZWFkZXIoSW50ZXJ2YWwgKkkpIHsgcmV0dXJuIEktPmdldEhlYWRlck5vZGUoKTsgfQorCisvLyBnZXRTb3VyY2VHcmFwaE5vZGUgLSBHaXZlbiBhIEJhc2ljQmxvY2sgYW5kIHRoZSBzb3VyY2UgZ3JhcGgsIHJldHVybiB0aGUKKy8vIHNvdXJjZSBncmFwaCBub2RlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIEJhc2ljQmxvY2suICBUaGlzIGlzIHRoZSBvcHBvc2l0ZQorLy8gb2YgZ2V0Tm9kZUhlYWRlci4KK2lubGluZSBCYXNpY0Jsb2NrICpnZXRTb3VyY2VHcmFwaE5vZGUoRnVuY3Rpb24gKiwgQmFzaWNCbG9jayAqQkIpIHsKKyAgcmV0dXJuIEJCOworfQoraW5saW5lIEludGVydmFsICpnZXRTb3VyY2VHcmFwaE5vZGUoSW50ZXJ2YWxQYXJ0aXRpb24gKklQLCBCYXNpY0Jsb2NrICpCQikgeworICByZXR1cm4gSVAtPmdldEJsb2NrSW50ZXJ2YWwoQkIpOworfQorCisvLyBhZGROb2RlVG9JbnRlcnZhbCAtIFRoaXMgbWV0aG9kIGV4aXN0cyB0byBhc3Npc3QgdGhlIGdlbmVyaWMgUHJvY2Vzc05vZGUKKy8vIHdpdGggdGhlIHRhc2sgb2YgYWRkaW5nIGEgbm9kZSB0byB0aGUgbmV3IGludGVydmFsLCBkZXBlbmRpbmcgb24gdGhlCisvLyB0eXBlIG9mIHRoZSBzb3VyY2Ugbm9kZS4gIEluIHRoZSBjYXNlIG9mIGEgQ0ZHIHNvdXJjZSBncmFwaCAoQmFzaWNCbG9jaworLy8gY2FzZSksIHRoZSBCYXNpY0Jsb2NrIGl0c2VsZiBpcyBhZGRlZCB0byB0aGUgaW50ZXJ2YWwuCitpbmxpbmUgdm9pZCBhZGROb2RlVG9JbnRlcnZhbChJbnRlcnZhbCAqSW50LCBCYXNpY0Jsb2NrICpCQikgeworICBJbnQtPk5vZGVzLnB1c2hfYmFjayhCQik7Cit9CisKKy8vIGFkZE5vZGVUb0ludGVydmFsIC0gVGhpcyBtZXRob2QgZXhpc3RzIHRvIGFzc2lzdCB0aGUgZ2VuZXJpYyBQcm9jZXNzTm9kZQorLy8gd2l0aCB0aGUgdGFzayBvZiBhZGRpbmcgYSBub2RlIHRvIHRoZSBuZXcgaW50ZXJ2YWwsIGRlcGVuZGluZyBvbiB0aGUKKy8vIHR5cGUgb2YgdGhlIHNvdXJjZSBub2RlLiAgSW4gdGhlIGNhc2Ugb2YgYSBDRkcgc291cmNlIGdyYXBoIChCYXNpY0Jsb2NrCisvLyBjYXNlKSwgdGhlIEJhc2ljQmxvY2sgaXRzZWxmIGlzIGFkZGVkIHRvIHRoZSBpbnRlcnZhbC4gIEluIHRoZSBjYXNlIG9mCisvLyBhbiBJbnRlcnZhbFBhcnRpdGlvbiBzb3VyY2UgZ3JhcGggKEludGVydmFsIGNhc2UpLCBhbGwgb2YgdGhlIG1lbWJlcgorLy8gQmFzaWNCbG9ja3MgYXJlIGFkZGVkIHRvIHRoZSBpbnRlcnZhbC4KK2lubGluZSB2b2lkIGFkZE5vZGVUb0ludGVydmFsKEludGVydmFsICpJbnQsIEludGVydmFsICpJKSB7CisgIC8vIEFkZCBhbGwgb2YgdGhlIG5vZGVzIGluIEkgYXMgbmV3IG5vZGVzIGluIEludC4KKyAgSW50LT5Ob2Rlcy5pbnNlcnQoSW50LT5Ob2Rlcy5lbmQoKSwgSS0+Tm9kZXMuYmVnaW4oKSwgSS0+Tm9kZXMuZW5kKCkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBOb2RlVHksIGNsYXNzIE9yaWdDb250YWluZXJfdCwgY2xhc3MgR1QgPSBHcmFwaFRyYWl0czxOb2RlVHkgKj4sCisgICAgICAgICBjbGFzcyBJR1QgPSBHcmFwaFRyYWl0czxJbnZlcnNlPE5vZGVUeSAqPj4+CitjbGFzcyBJbnRlcnZhbEl0ZXJhdG9yIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEludGVydmFsICosIHR5cGVuYW1lIEludGVydmFsOjpzdWNjX2l0ZXJhdG9yPj4gSW50U3RhY2s7CisgIHN0ZDo6c2V0PEJhc2ljQmxvY2sgKj4gVmlzaXRlZDsKKyAgT3JpZ0NvbnRhaW5lcl90ICpPcmlnQ29udGFpbmVyOworICBib29sIElPd25NZW07ICAgICAvLyBJZiBUcnVlLCBkZWxldGUgaW50ZXJ2YWxzIHdoZW4gZG9uZSB3aXRoIHRoZW0KKyAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGZpbGUgaGVhZGVyIGZvciBjb25kaXRpb25zIG9mIHVzZQorCitwdWJsaWM6CisgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZzsKKworICBJbnRlcnZhbEl0ZXJhdG9yKCkgPSBkZWZhdWx0OyAvLyBFbmQgaXRlcmF0b3IsIGVtcHR5IHN0YWNrCisKKyAgSW50ZXJ2YWxJdGVyYXRvcihGdW5jdGlvbiAqTSwgYm9vbCBPd25NZW1vcnkpIDogSU93bk1lbShPd25NZW1vcnkpIHsKKyAgICBPcmlnQ29udGFpbmVyID0gTTsKKyAgICBpZiAoIVByb2Nlc3NJbnRlcnZhbCgmTS0+ZnJvbnQoKSkpIHsKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlByb2Nlc3NJbnRlcnZhbCBzaG91bGQgbmV2ZXIgZmFpbCBmb3IgZmlyc3QgaW50ZXJ2YWwhIik7CisgICAgfQorICB9CisKKyAgSW50ZXJ2YWxJdGVyYXRvcihJbnRlcnZhbEl0ZXJhdG9yICYmeCkKKyAgICAgIDogSW50U3RhY2soc3RkOjptb3ZlKHguSW50U3RhY2spKSwgVmlzaXRlZChzdGQ6Om1vdmUoeC5WaXNpdGVkKSksCisgICAgICAgIE9yaWdDb250YWluZXIoeC5PcmlnQ29udGFpbmVyKSwgSU93bk1lbSh4LklPd25NZW0pIHsKKyAgICB4LklPd25NZW0gPSBmYWxzZTsKKyAgfQorCisgIEludGVydmFsSXRlcmF0b3IoSW50ZXJ2YWxQYXJ0aXRpb24gJklQLCBib29sIE93bk1lbW9yeSkgOiBJT3duTWVtKE93bk1lbW9yeSkgeworICAgIE9yaWdDb250YWluZXIgPSAmSVA7CisgICAgaWYgKCFQcm9jZXNzSW50ZXJ2YWwoSVAuZ2V0Um9vdEludGVydmFsKCkpKSB7CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJQcm9jZXNzSW50ZXJ2YWwgc2hvdWxkIG5ldmVyIGZhaWwgZm9yIGZpcnN0IGludGVydmFsISIpOworICAgIH0KKyAgfQorCisgIH5JbnRlcnZhbEl0ZXJhdG9yKCkgeworICAgIGlmIChJT3duTWVtKQorICAgICAgd2hpbGUgKCFJbnRTdGFjay5lbXB0eSgpKSB7CisgICAgICAgIGRlbGV0ZSBvcGVyYXRvciooKTsKKyAgICAgICAgSW50U3RhY2sucG9wX2JhY2soKTsKKyAgICAgIH0KKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbnRlcnZhbEl0ZXJhdG9yICZ4KSBjb25zdCB7CisgICAgcmV0dXJuIEludFN0YWNrID09IHguSW50U3RhY2s7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEludGVydmFsSXRlcmF0b3IgJngpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0geCk7IH0KKworICBjb25zdCBJbnRlcnZhbCAqb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gSW50U3RhY2suYmFjaygpLmZpcnN0OyB9CisgIEludGVydmFsICpvcGVyYXRvciooKSB7IHJldHVybiBJbnRTdGFjay5iYWNrKCkuZmlyc3Q7IH0KKyAgY29uc3QgSW50ZXJ2YWwgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBvcGVyYXRvciooKTsgfQorICBJbnRlcnZhbCAqb3BlcmF0b3ItPigpIHsgcmV0dXJuIG9wZXJhdG9yKigpOyB9CisKKyAgSW50ZXJ2YWxJdGVyYXRvciAmb3BlcmF0b3IrKygpIHsgLy8gUHJlaW5jcmVtZW50CisgICAgYXNzZXJ0KCFJbnRTdGFjay5lbXB0eSgpICYmICJBdHRlbXB0aW5nIHRvIHVzZSBpbnRlcnZhbCBpdGVyYXRvciBhdCBlbmQhIik7CisgICAgZG8geworICAgICAgLy8gQWxsIG9mIHRoZSBpbnRlcnZhbHMgb24gdGhlIHN0YWNrIGhhdmUgYmVlbiB2aXNpdGVkLiAgVHJ5IHZpc2l0aW5nCisgICAgICAvLyB0aGVpciBzdWNjZXNzb3JzIG5vdy4KKyAgICAgIEludGVydmFsOjpzdWNjX2l0ZXJhdG9yICZTdWNjSXQgPSBJbnRTdGFjay5iYWNrKCkuc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRJdCA9IHN1Y2NfZW5kKEludFN0YWNrLmJhY2soKS5maXJzdCk7CisgICAgICB3aGlsZSAoU3VjY0l0ICE9IEVuZEl0KSB7ICAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIGludGVydmFsIHN1Y2NzCisgICAgICAgIGJvb2wgRG9uZSA9IFByb2Nlc3NJbnRlcnZhbChnZXRTb3VyY2VHcmFwaE5vZGUoT3JpZ0NvbnRhaW5lciwgKlN1Y2NJdCkpOworICAgICAgICArK1N1Y2NJdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IGl0ZXJhdG9yCisgICAgICAgIGlmIChEb25lKSByZXR1cm4gKnRoaXM7ICAgICAgICAgICAgICAgICAvLyBGb3VuZCBhIG5ldyBpbnRlcnZhbCEgVXNlIGl0IQorICAgICAgfQorCisgICAgICAvLyBGcmVlIGludGVydmFsIG1lbW9yeS4uLiBpZiBuZWNlc3NhcnkKKyAgICAgIGlmIChJT3duTWVtKSBkZWxldGUgSW50U3RhY2suYmFjaygpLmZpcnN0OworCisgICAgICAvLyBXZSByYW4gb3V0IG9mIHN1Y2Nlc3NvcnMgZm9yIHRoaXMgaW50ZXJ2YWwuLi4gcG9wIG9mZiB0aGUgc3RhY2sKKyAgICAgIEludFN0YWNrLnBvcF9iYWNrKCk7CisgICAgfSB3aGlsZSAoIUludFN0YWNrLmVtcHR5KCkpOworCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgSW50ZXJ2YWxJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAvLyBQb3N0aW5jcmVtZW50CisgICAgSW50ZXJ2YWxJdGVyYXRvciB0bXAgPSAqdGhpczsKKyAgICArKyp0aGlzOworICAgIHJldHVybiB0bXA7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gUHJvY2Vzc0ludGVydmFsIC0gVGhpcyBtZXRob2QgaXMgdXNlZCBkdXJpbmcgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUKKyAgLy8gaW50ZXJ2YWwgZ3JhcGguICBJdCB3YWxrcyB0aHJvdWdoIHRoZSBzb3VyY2UgZ3JhcGgsIHJlY3Vyc2l2ZWx5IGNyZWF0aW5nCisgIC8vIGFuIGludGVydmFsIHBlciBpbnZvY2F0aW9uIHVudGlsIHRoZSBlbnRpcmUgZ3JhcGggaXMgY292ZXJlZC4gIFRoaXMgdXNlcworICAvLyB0aGUgUHJvY2Vzc05vZGUgbWV0aG9kIHRvIGFkZCBhbGwgb2YgdGhlIG5vZGVzIHRvIHRoZSBpbnRlcnZhbC4KKyAgLy8KKyAgLy8gVGhpcyBtZXRob2QgaXMgdGVtcGxhdGVkIGJlY2F1c2UgaXQgbWF5IG9wZXJhdGUgb24gdHdvIGRpZmZlcmVudCBzb3VyY2UKKyAgLy8gZ3JhcGhzOiBhIGJhc2ljIGJsb2NrIGdyYXBoLCBvciBhIHByZWV4aXN0aW5nIGludGVydmFsIGdyYXBoLgorICBib29sIFByb2Nlc3NJbnRlcnZhbChOb2RlVHkgKk5vZGUpIHsKKyAgICBCYXNpY0Jsb2NrICpIZWFkZXIgPSBnZXROb2RlSGVhZGVyKE5vZGUpOworICAgIGlmICghVmlzaXRlZC5pbnNlcnQoSGVhZGVyKS5zZWNvbmQpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBJbnRlcnZhbCAqSW50ID0gbmV3IEludGVydmFsKEhlYWRlcik7CisKKyAgICAvLyBDaGVjayBhbGwgb2Ygb3VyIHN1Y2Nlc3NvcnMgdG8gc2VlIGlmIHRoZXkgYXJlIGluIHRoZSBpbnRlcnZhbC4uLgorICAgIGZvciAodHlwZW5hbWUgR1Q6OkNoaWxkSXRlcmF0b3JUeXBlIEkgPSBHVDo6Y2hpbGRfYmVnaW4oTm9kZSksCisgICAgICAgICAgIEUgPSBHVDo6Y2hpbGRfZW5kKE5vZGUpOyBJICE9IEU7ICsrSSkKKyAgICAgIFByb2Nlc3NOb2RlKEludCwgZ2V0U291cmNlR3JhcGhOb2RlKE9yaWdDb250YWluZXIsICpJKSk7CisKKyAgICBJbnRTdGFjay5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoSW50LCBzdWNjX2JlZ2luKEludCkpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFByb2Nlc3NOb2RlIC0gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFByb2Nlc3NJbnRlcnZhbCB0byBhZGQgbm9kZXMgdG8gdGhlCisgIC8vIGludGVydmFsIGJlaW5nIGNvbnN0cnVjdGVkLCBhbmQgaXQgaXMgYWxzbyBjYWxsZWQgcmVjdXJzaXZlbHkgYXMgaXQgd2Fsa3MKKyAgLy8gdGhlIHNvdXJjZSBncmFwaC4gIEEgbm9kZSBpcyBhZGRlZCB0byB0aGUgY3VycmVudCBpbnRlcnZhbCBvbmx5IGlmIGFsbCBvZgorICAvLyBpdHMgcHJlZGVjZXNzb3JzIGFyZSBhbHJlYWR5IGluIHRoZSBncmFwaC4gIFRoaXMgYWxzbyB0YWtlcyBjYXJlIG9mIGtlZXBpbmcKKyAgLy8gdGhlIHN1Y2Nlc3NvciBzZXQgb2YgYW4gaW50ZXJ2YWwgdXAgdG8gZGF0ZS4KKyAgLy8KKyAgLy8gVGhpcyBtZXRob2QgaXMgdGVtcGxhdGVkIGJlY2F1c2UgaXQgbWF5IG9wZXJhdGUgb24gdHdvIGRpZmZlcmVudCBzb3VyY2UKKyAgLy8gZ3JhcGhzOiBhIGJhc2ljIGJsb2NrIGdyYXBoLCBvciBhIHByZWV4aXN0aW5nIGludGVydmFsIGdyYXBoLgorICB2b2lkIFByb2Nlc3NOb2RlKEludGVydmFsICpJbnQsIE5vZGVUeSAqTm9kZSkgeworICAgIGFzc2VydChJbnQgJiYgIk51bGwgaW50ZXJ2YWwgPT0gYmFkISIpOworICAgIGFzc2VydChOb2RlICYmICJOdWxsIE5vZGUgPT0gYmFkISIpOworCisgICAgQmFzaWNCbG9jayAqTm9kZUhlYWRlciA9IGdldE5vZGVIZWFkZXIoTm9kZSk7CisKKyAgICBpZiAoVmlzaXRlZC5jb3VudChOb2RlSGVhZGVyKSkgeyAgICAgLy8gTm9kZSBhbHJlYWR5IGJlZW4gdmlzaXRlZD8KKyAgICAgIGlmIChJbnQtPmNvbnRhaW5zKE5vZGVIZWFkZXIpKSB7ICAgLy8gQWxyZWFkeSBpbiB0aGlzIGludGVydmFsLi4uCisgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gb3RoZXIgaW50ZXJ2YWwsIGFkZCBhcyBzdWNjZXNzb3IKKyAgICAgICAgaWYgKCFJbnQtPmlzU3VjY2Vzc29yKE5vZGVIZWFkZXIpKSAvLyBBZGQgb25seSBpZiBub3QgYWxyZWFkeSBpbiBzZXQKKyAgICAgICAgICBJbnQtPlN1Y2Nlc3NvcnMucHVzaF9iYWNrKE5vZGVIZWFkZXIpOworICAgICAgfQorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIG5vdCBpbiBpbnRlcnZhbCB5ZXQKKyAgICAgIGZvciAodHlwZW5hbWUgSUdUOjpDaGlsZEl0ZXJhdG9yVHlwZSBJID0gSUdUOjpjaGlsZF9iZWdpbihOb2RlKSwKKyAgICAgICAgICAgICBFID0gSUdUOjpjaGlsZF9lbmQoTm9kZSk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIGlmICghSW50LT5jb250YWlucygqSSkpIHsgICAgICAgIC8vIElmIHByZWQgbm90IGluIGludGVydmFsLCB3ZSBjYW4ndCBiZQorICAgICAgICAgIGlmICghSW50LT5pc1N1Y2Nlc3NvcihOb2RlSGVhZGVyKSkgLy8gQWRkIG9ubHkgaWYgbm90IGFscmVhZHkgaW4gc2V0CisgICAgICAgICAgICBJbnQtPlN1Y2Nlc3NvcnMucHVzaF9iYWNrKE5vZGVIZWFkZXIpOworICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgeW91IGxhdGVyCisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUsIHRoZW4gYWxsIG9mIHRoZSBwcmVkZWNlc3NvcnMgb2YgQkIgYXJlIGluIHRoZSBpbnRlcnZhbAorICAgICAgLy8gYWxyZWFkeS4gIEluIHRoaXMgY2FzZSwgd2UgbXVzdCBhZGQgQkIgdG8gdGhlIGludGVydmFsIQorICAgICAgYWRkTm9kZVRvSW50ZXJ2YWwoSW50LCBOb2RlKTsKKyAgICAgIFZpc2l0ZWQuaW5zZXJ0KE5vZGVIZWFkZXIpOyAgICAgLy8gVGhlIG5vZGUgaGFzIG5vdyBiZWVuIHZpc2l0ZWQhCisKKyAgICAgIGlmIChJbnQtPmlzU3VjY2Vzc29yKE5vZGVIZWFkZXIpKSB7CisgICAgICAgIC8vIElmIHdlIHdlcmUgaW4gdGhlIHN1Y2Nlc3NvciBsaXN0IGZyb20gYmVmb3JlLi4uIHJlbW92ZSBmcm9tIHN1Y2MgbGlzdAorICAgICAgICBJbnQtPlN1Y2Nlc3NvcnMuZXJhc2Uoc3RkOjpyZW1vdmUoSW50LT5TdWNjZXNzb3JzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQtPlN1Y2Nlc3NvcnMuZW5kKCksIE5vZGVIZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50LT5TdWNjZXNzb3JzLmVuZCgpKTsKKyAgICAgIH0KKworICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBkaXNjb3ZlcmVkIHRoYXQgTm9kZSBpcyBpbiB0aGUgaW50ZXJ2YWwsIHBlcmhhcHMgc29tZQorICAgICAgLy8gb2YgaXRzIHN1Y2Nlc3NvcnMgYXJlIGFzIHdlbGw/CisgICAgICBmb3IgKHR5cGVuYW1lIEdUOjpDaGlsZEl0ZXJhdG9yVHlwZSBJdCA9IEdUOjpjaGlsZF9iZWdpbihOb2RlKSwKKyAgICAgICAgICAgICBFbmQgPSBHVDo6Y2hpbGRfZW5kKE5vZGUpOyBJdCAhPSBFbmQ7ICsrSXQpCisgICAgICAgIFByb2Nlc3NOb2RlKEludCwgZ2V0U291cmNlR3JhcGhOb2RlKE9yaWdDb250YWluZXIsICpJdCkpOworICAgIH0KKyAgfQorfTsKKwordXNpbmcgZnVuY3Rpb25faW50ZXJ2YWxfaXRlcmF0b3IgPSBJbnRlcnZhbEl0ZXJhdG9yPEJhc2ljQmxvY2ssIEZ1bmN0aW9uPjsKK3VzaW5nIGludGVydmFsX3BhcnRfaW50ZXJ2YWxfaXRlcmF0b3IgPQorICAgIEludGVydmFsSXRlcmF0b3I8SW50ZXJ2YWwsIEludGVydmFsUGFydGl0aW9uPjsKKworaW5saW5lIGZ1bmN0aW9uX2ludGVydmFsX2l0ZXJhdG9yIGludGVydmFsc19iZWdpbihGdW5jdGlvbiAqRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZWxldGVJbnRzID0gdHJ1ZSkgeworICByZXR1cm4gZnVuY3Rpb25faW50ZXJ2YWxfaXRlcmF0b3IoRiwgRGVsZXRlSW50cyk7Cit9CitpbmxpbmUgZnVuY3Rpb25faW50ZXJ2YWxfaXRlcmF0b3IgaW50ZXJ2YWxzX2VuZChGdW5jdGlvbiAqKSB7CisgIHJldHVybiBmdW5jdGlvbl9pbnRlcnZhbF9pdGVyYXRvcigpOworfQorCitpbmxpbmUgaW50ZXJ2YWxfcGFydF9pbnRlcnZhbF9pdGVyYXRvcgorICAgaW50ZXJ2YWxzX2JlZ2luKEludGVydmFsUGFydGl0aW9uICZJUCwgYm9vbCBEZWxldGVJbnRlcnZhbHMgPSB0cnVlKSB7CisgIHJldHVybiBpbnRlcnZhbF9wYXJ0X2ludGVydmFsX2l0ZXJhdG9yKElQLCBEZWxldGVJbnRlcnZhbHMpOworfQorCitpbmxpbmUgaW50ZXJ2YWxfcGFydF9pbnRlcnZhbF9pdGVyYXRvciBpbnRlcnZhbHNfZW5kKEludGVydmFsUGFydGl0aW9uICZJUCkgeworICByZXR1cm4gaW50ZXJ2YWxfcGFydF9pbnRlcnZhbF9pdGVyYXRvcigpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19JTlRFUlZBTElURVJBVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW50ZXJ2YWxQYXJ0aXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW50ZXJ2YWxQYXJ0aXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDMzNTE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbnRlcnZhbFBhcnRpdGlvbi5oCkBAIC0wLDAgKzEsMTExIEBACisvLz09PS0gSW50ZXJ2YWxQYXJ0aXRpb24uaCAtIEludGVydmFsIHBhcnRpdGlvbiBDYWxjdWxhdGlvbiAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIEludGVydmFsUGFydGl0aW9uIGNsYXNzLCB3aGljaAorLy8gY2FsY3VsYXRlcyBhbmQgcmVwcmVzZW50cyB0aGUgaW50ZXJ2YWwgcGFydGl0aW9uIG9mIGEgZnVuY3Rpb24sIG9yIGEKKy8vIHByZWV4aXN0aW5nIGludGVydmFsIHBhcnRpdGlvbi4KKy8vCisvLyBJbiB0aGlzIHdheSwgdGhlIGludGVydmFsIHBhcnRpdGlvbiBtYXkgYmUgdXNlZCB0byByZWR1Y2UgYSBmbG93IGdyYXBoIGRvd24KKy8vIHRvIGl0cyBkZWdlbmVyYXRlIHNpbmdsZSBub2RlIGludGVydmFsIHBhcnRpdGlvbiAodW5sZXNzIGl0IGlzIGlycmVkdWNpYmxlKS4KKy8vCisvLyBUT0RPOiBUaGUgSW50ZXJ2YWxQYXJ0aXRpb24gY2xhc3Mgc2hvdWxkIHRha2UgYSBib29sIHBhcmFtZXRlciB0aGF0IHRlbGxzCisvLyB3aGV0aGVyIGl0IHNob3VsZCBhZGQgdGhlICJ0YWlscyIgb2YgYW4gaW50ZXJ2YWwgdG8gYW4gaW50ZXJ2YWwgaXRzZWxmIG9yIGlmCisvLyB0aGV5IHNob3VsZCBiZSByZXByZXNlbnRlZCBhcyBkaXN0aW5jdCBpbnRlcnZhbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0lOVEVSVkFMUEFSVElUSU9OX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19JTlRFUlZBTFBBUlRJVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBJbnRlcnZhbDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJbnRlcnZhbFBhcnRpdGlvbiAtIFRoaXMgY2xhc3MgYnVpbGRzIGFuZCBob2xkcyBhbiAiaW50ZXJ2YWwgcGFydGl0aW9uIiBmb3IKKy8vIGEgZnVuY3Rpb24uICBUaGlzIHBhcnRpdGlvbiBkaXZpZGVzIHRoZSBjb250cm9sIGZsb3cgZ3JhcGggaW50byBhIHNldCBvZgorLy8gbWF4aW1hbCBpbnRlcnZhbHMsIGFzIGRlZmluZWQgd2l0aCB0aGUgcHJvcGVydGllcyBhYm92ZS4gIEludHVpdGl2ZWx5LCBhbgorLy8gaW50ZXJ2YWwgaXMgYSAocG9zc2libHkgbm9uZXhpc3RlbnQpIGxvb3Agd2l0aCBhICJ0YWlsIiBvZiBub24tbG9vcGluZworLy8gbm9kZXMgZm9sbG93aW5nIGl0LgorLy8KK2NsYXNzIEludGVydmFsUGFydGl0aW9uIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgIHVzaW5nIEludGVydmFsTWFwVHkgPSBzdGQ6Om1hcDxCYXNpY0Jsb2NrICosIEludGVydmFsICo+OworICBJbnRlcnZhbE1hcFR5IEludGVydmFsTWFwOworCisgIHVzaW5nIEludGVydmFsTGlzdFR5ID0gc3RkOjp2ZWN0b3I8SW50ZXJ2YWwgKj47CisgIEludGVydmFsICpSb290SW50ZXJ2YWwgPSBudWxscHRyOworICBzdGQ6OnZlY3RvcjxJbnRlcnZhbCAqPiBJbnRlcnZhbHM7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKworICBJbnRlcnZhbFBhcnRpdGlvbigpIDogRnVuY3Rpb25QYXNzKElEKSB7CisgICAgaW5pdGlhbGl6ZUludGVydmFsUGFydGl0aW9uUGFzcygqUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKSk7CisgIH0KKworICAvLyBydW4gLSBDYWxjdWxhdGUgdGhlIGludGVydmFsIHBhcnRpdGlvbiBmb3IgdGhpcyBmdW5jdGlvbgorICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworCisgIC8vIEludGVydmFsUGFydGl0aW9uIGN0b3IgLSBCdWlsZCBhIHJlZHVjZWQgaW50ZXJ2YWwgcGFydGl0aW9uIGZyb20gYW4KKyAgLy8gZXhpc3RpbmcgaW50ZXJ2YWwgZ3JhcGguICBUaGlzIHRha2VzIGFuIGFkZGl0aW9uYWwgYm9vbGVhbiBwYXJhbWV0ZXIgdG8KKyAgLy8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBhIGNvcHkgY29uc3RydWN0b3IuICBBbHdheXMgcGFzcyBpbiBmYWxzZSBmb3Igbm93LgorICBJbnRlcnZhbFBhcnRpdGlvbihJbnRlcnZhbFBhcnRpdGlvbiAmSSwgYm9vbCk7CisKKyAgLy8gcHJpbnQgLSBTaG93IGNvbnRlbnRzIGluIGh1bWFuIHJlYWRhYmxlIGZvcm1hdC4uLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPLCBjb25zdCBNb2R1bGUqID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8gZ2V0Um9vdEludGVydmFsKCkgLSBSZXR1cm4gdGhlIHJvb3QgaW50ZXJ2YWwgdGhhdCBjb250YWlucyB0aGUgc3RhcnRpbmcKKyAgLy8gYmxvY2sgb2YgdGhlIGZ1bmN0aW9uLgorICBpbmxpbmUgSW50ZXJ2YWwgKmdldFJvb3RJbnRlcnZhbCgpIHsgcmV0dXJuIFJvb3RJbnRlcnZhbDsgfQorCisgIC8vIGlzRGVnZW5lcmF0ZVBhcnRpdGlvbigpIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBpbnRlcnZhbCBwYXJ0aXRpb24gY29udGFpbnMKKyAgLy8gYSBzaW5nbGUgaW50ZXJ2YWwsIGFuZCB0aHVzIGNhbm5vdCBiZSBzaW1wbGlmaWVkIGFueW1vcmUuCisgIGJvb2wgaXNEZWdlbmVyYXRlUGFydGl0aW9uKCkgeyByZXR1cm4gSW50ZXJ2YWxzLnNpemUoKSA9PSAxOyB9CisKKyAgLy8gVE9ETzogaXNJcnJlZHVjaWJsZSAtIGxvb2sgZm9yIHRyaWFuZ2xlIGdyYXBoLgorCisgIC8vIGdldEJsb2NrSW50ZXJ2YWwgLSBSZXR1cm4gdGhlIGludGVydmFsIHRoYXQgYSBiYXNpYyBibG9jayBleGlzdHMgaW4uCisgIGlubGluZSBJbnRlcnZhbCAqZ2V0QmxvY2tJbnRlcnZhbChCYXNpY0Jsb2NrICpCQikgeworICAgIEludGVydmFsTWFwVHk6Oml0ZXJhdG9yIEkgPSBJbnRlcnZhbE1hcC5maW5kKEJCKTsKKyAgICByZXR1cm4gSSAhPSBJbnRlcnZhbE1hcC5lbmQoKSA/IEktPnNlY29uZCA6IG51bGxwdHI7CisgIH0KKworICAvLyBnZXRBbmFseXNpc1VzYWdlIC0gSW1wbGVtZW50IHRoZSBQYXNzIEFQSQorICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgfQorCisgIC8vIEludGVyZmFjZSB0byBJbnRlcnZhbHMgdmVjdG9yLi4uCisgIGNvbnN0IHN0ZDo6dmVjdG9yPEludGVydmFsKj4gJmdldEludGVydmFscygpIGNvbnN0IHsgcmV0dXJuIEludGVydmFsczsgfQorCisgIC8vIHJlbGVhc2VNZW1vcnkgLSBSZXNldCBzdGF0ZSBiYWNrIHRvIGJlZm9yZSBmdW5jdGlvbiB3YXMgYW5hbHl6ZWQKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIC8vIGFkZEludGVydmFsVG9QYXJ0aXRpb24gLSBBZGQgYW4gaW50ZXJ2YWwgdG8gdGhlIGludGVybmFsIGxpc3Qgb2YgaW50ZXJ2YWxzLAorICAvLyBhbmQgdGhlbiBhZGQgbWFwcGluZ3MgZnJvbSBhbGwgb2YgdGhlIGJhc2ljIGJsb2NrcyBpbiB0aGUgaW50ZXJ2YWwgdG8gdGhlCisgIC8vIGludGVydmFsIGl0c2VsZiAoaW4gdGhlIEludGVydmFsTWFwKS4KKyAgdm9pZCBhZGRJbnRlcnZhbFRvUGFydGl0aW9uKEludGVydmFsICpJKTsKKworICAvLyB1cGRhdGVQcmVkZWNlc3NvcnMgLSBJbnRlcnZhbCBnZW5lcmF0aW9uIG9ubHkgc2V0cyB0aGUgc3VjY2Vzc29yIGZpZWxkcyBvZgorICAvLyB0aGUgaW50ZXJ2YWwgZGF0YSBzdHJ1Y3R1cmVzLiAgQWZ0ZXIgaW50ZXJ2YWwgZ2VuZXJhdGlvbiBpcyBjb21wbGV0ZSwKKyAgLy8gcnVuIHRocm91Z2ggYWxsIG9mIHRoZSBpbnRlcnZhbHMgYW5kIHByb3BhZ2F0ZSBzdWNjZXNzb3IgaW5mbyBhcworICAvLyBwcmVkZWNlc3NvciBpbmZvLgorICB2b2lkIHVwZGF0ZVByZWRlY2Vzc29ycyhJbnRlcnZhbCAqSW50KTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0lOVEVSVkFMUEFSVElUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSXRlcmF0ZWREb21pbmFuY2VGcm9udGllci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JdGVyYXRlZERvbWluYW5jZUZyb250aWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhZjRlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSXRlcmF0ZWREb21pbmFuY2VGcm9udGllci5oCkBAIC0wLDAgKzEsOTUgQEAKKy8vPT09LSBJdGVyYXRlZERvbWluYW5jZUZyb250aWVyLmggLSBDYWxjdWxhdGUgSURGIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxicmllZiBDb21wdXRlIGl0ZXJhdGVkIGRvbWluYW5jZSBmcm9udGllcnMgdXNpbmcgYSBsaW5lYXIgdGltZSBhbGdvcml0aG0uCisvLy8KKy8vLyBUaGUgYWxnb3JpdGhtIHVzZWQgaGVyZSBpcyBiYXNlZCBvbjoKKy8vLworLy8vICAgU3JlZWRoYXIgYW5kIEdhby4gQSBsaW5lYXIgdGltZSBhbGdvcml0aG0gZm9yIHBsYWNpbmcgcGhpLW5vZGVzLgorLy8vICAgSW4gUHJvY2VlZGluZ3Mgb2YgdGhlIDIybmQgQUNNIFNJR1BMQU4tU0lHQUNUIFN5bXBvc2l1bSBvbiBQcmluY2lwbGVzIG9mCisvLy8gICBQcm9ncmFtbWluZyBMYW5ndWFnZXMKKy8vLyAgIFBPUEwgJzk1LiBBQ00sIE5ldyBZb3JrLCBOWSwgNjItNzMuCisvLy8KKy8vLyBJdCBoYXMgYmVlbiBtb2RpZmllZCB0byBub3QgZXhwbGljaXRseSB1c2UgdGhlIERKIGdyYXBoIGRhdGEgc3RydWN0dXJlIGFuZAorLy8vIHRvIGRpcmVjdGx5IGNvbXB1dGUgcHJ1bmVkIFNTQSB1c2luZyBwZXItdmFyaWFibGUgbGl2ZW5lc3MgaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0lERl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfSURGX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vSVIvRG9taW5hdG9ycy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBpdGVyYXRlZCBkb21pbmFuY2UgZnJvbnRpZXIsIGdpdmVuIGEgc2V0IG9mIGRlZmluaW5nCisvLy8gYmxvY2tzLCBhbmQgb3B0aW9uYWxseSwgYSBzZXQgb2YgbGl2ZS1pbiBibG9ja3MuCisvLy8KKy8vLyBJbiB0dXJuLCB0aGUgcmVzdWx0cyBjYW4gYmUgdXNlZCB0byBwbGFjZSBwaGkgbm9kZXMuCisvLy8KKy8vLyBUaGlzIGFsZ29yaXRobSBpcyBhIGxpbmVhciB0aW1lIGNvbXB1dGF0aW9uIG9mIEl0ZXJhdGVkIERvbWluYW5jZSBGcm9udGllcnMsCisvLy8gcHJ1bmVkIHVzaW5nIHRoZSBsaXZlLWluIHNldC4KKy8vLyBCeSBkZWZhdWx0LCBsaXZlbmVzcyBpcyBub3QgdXNlZCB0byBwcnVuZSB0aGUgSURGIGNvbXB1dGF0aW9uLgorLy8vIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHNob3VsZCBiZSBlaXRoZXIgQmFzaWNCbG9jayogb3IgSW52ZXJzZTxCYXNpY0Jsb2NrCisvLy8gKj4sIGRlcGVuZGluZyBvbiBpZiB5b3Ugd2FudCB0aGUgZm9yd2FyZCBvciByZXZlcnNlIElERi4KK3RlbXBsYXRlIDxjbGFzcyBOb2RlVHksIGJvb2wgSXNQb3N0RG9tPgorY2xhc3MgSURGQ2FsY3VsYXRvciB7CisgcHVibGljOgorICBJREZDYWxjdWxhdG9yKERvbWluYXRvclRyZWVCYXNlPEJhc2ljQmxvY2ssIElzUG9zdERvbT4gJkRUKQorICAgICAgOiBEVChEVCksIHVzZUxpdmVJbihmYWxzZSkge30KKworICAvLy8gXGJyaWVmIEdpdmUgdGhlIElERiBjYWxjdWxhdG9yIHRoZSBzZXQgb2YgYmxvY2tzIGluIHdoaWNoIHRoZSB2YWx1ZSBpcworICAvLy8gZGVmaW5lZC4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgc2V0IG9mIHN0YXJ0aW5nIGJsb2NrcyBpdCBzaG91bGQgYmUKKyAgLy8vIGNhbGN1bGF0aW5nIHRoZSBJREYgZm9yICh0aG91Z2ggbGF0ZXIgZ2V0cyBwcnVuZWQgYmFzZWQgb24gbGl2ZW5lc3MpLgorICAvLy8KKyAgLy8vIE5vdGU6IFRoaXMgc2V0ICptdXN0KiBsaXZlIGZvciB0aGUgZW50aXJlIGxpZmV0aW1lIG9mIHRoZSBJREYgY2FsY3VsYXRvci4KKyAgdm9pZCBzZXREZWZpbmluZ0Jsb2Nrcyhjb25zdCBTbWFsbFB0clNldEltcGw8QmFzaWNCbG9jayAqPiAmQmxvY2tzKSB7CisgICAgRGVmQmxvY2tzID0gJkJsb2NrczsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2l2ZSB0aGUgSURGIGNhbGN1bGF0b3IgdGhlIHNldCBvZiBibG9ja3MgaW4gd2hpY2ggdGhlIHZhbHVlIGlzCisgIC8vLyBsaXZlIG9uIGVudHJ5IHRvIHRoZSBibG9jay4gICBUaGlzIGlzIHVzZWQgdG8gcHJ1bmUgdGhlIElERiBjYWxjdWxhdGlvbiB0bworICAvLy8gbm90IGluY2x1ZGUgYmxvY2tzIHdoZXJlIGFueSBwaGkgaW5zZXJ0aW9uIHdvdWxkIGJlIGRlYWQuCisgIC8vLworICAvLy8gTm90ZTogVGhpcyBzZXQgKm11c3QqIGxpdmUgZm9yIHRoZSBlbnRpcmUgbGlmZXRpbWUgb2YgdGhlIElERiBjYWxjdWxhdG9yLgorCisgIHZvaWQgc2V0TGl2ZUluQmxvY2tzKGNvbnN0IFNtYWxsUHRyU2V0SW1wbDxCYXNpY0Jsb2NrICo+ICZCbG9ja3MpIHsKKyAgICBMaXZlSW5CbG9ja3MgPSAmQmxvY2tzOworICAgIHVzZUxpdmVJbiA9IHRydWU7CisgIH0KKworICAvLy8gXGJyaWVmIFJlc2V0IHRoZSBsaXZlLWluIGJsb2NrIHNldCB0byBiZSBlbXB0eSwgYW5kIHRlbGwgdGhlIElERgorICAvLy8gY2FsY3VsYXRvciB0byBub3QgdXNlIGxpdmVuZXNzIGFueW1vcmUuCisgIHZvaWQgcmVzZXRMaXZlSW5CbG9ja3MoKSB7CisgICAgTGl2ZUluQmxvY2tzID0gbnVsbHB0cjsKKyAgICB1c2VMaXZlSW4gPSBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2FsY3VsYXRlIGl0ZXJhdGVkIGRvbWluYW5jZSBmcm9udGllcnMKKyAgLy8vCisgIC8vLyBUaGlzIHVzZXMgdGhlIGxpbmVhci10aW1lIHBoaSBhbGdvcml0aG0gYmFzZWQgb24gREotZ3JhcGhzIG1lbnRpb25lZCBpbgorICAvLy8gdGhlIGZpbGUtbGV2ZWwgY29tbWVudC4gIEl0IHBlcmZvcm1zIERGLT5JREYgcHJ1bmluZyB1c2luZyB0aGUgbGl2ZS1pbgorICAvLy8gc2V0LCB0byBhdm9pZCBjb21wdXRpbmcgdGhlIElERiBmb3IgYmxvY2tzIHdoZXJlIGFuIGluc2VydGVkIFBISSBub2RlCisgIC8vLyB3b3VsZCBiZSBkZWFkLgorICB2b2lkIGNhbGN1bGF0ZShTbWFsbFZlY3RvckltcGw8QmFzaWNCbG9jayAqPiAmSURGQmxvY2tzKTsKKworcHJpdmF0ZToKKyBEb21pbmF0b3JUcmVlQmFzZTxCYXNpY0Jsb2NrLCBJc1Bvc3REb20+ICZEVDsKKyBib29sIHVzZUxpdmVJbjsKKyBjb25zdCBTbWFsbFB0clNldEltcGw8QmFzaWNCbG9jayAqPiAqTGl2ZUluQmxvY2tzOworIGNvbnN0IFNtYWxsUHRyU2V0SW1wbDxCYXNpY0Jsb2NrICo+ICpEZWZCbG9ja3M7Cit9OwordHlwZWRlZiBJREZDYWxjdWxhdG9yPEJhc2ljQmxvY2sgKiwgZmFsc2U+IEZvcndhcmRJREZDYWxjdWxhdG9yOwordHlwZWRlZiBJREZDYWxjdWxhdG9yPEludmVyc2U8QmFzaWNCbG9jayAqPiwgdHJ1ZT4gUmV2ZXJzZUlERkNhbGN1bGF0b3I7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTGF6eUJsb2NrRnJlcXVlbmN5SW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9MYXp5QmxvY2tGcmVxdWVuY3lJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjZTA4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTGF6eUJsb2NrRnJlcXVlbmN5SW5mby5oCkBAIC0wLDAgKzEsMTMyIEBACisvLz09PS0gTGF6eUJsb2NrRnJlcXVlbmN5SW5mby5oIC0gTGF6eSBCbG9jayBGcmVxdWVuY3kgQW5hbHlzaXMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgYW5hbHlzaXMgcGFzcyB0byBCbG9ja0ZyZXF1ZW5jeUluZm9XcmFwcGVyUGFzcy4gIFRoZQorLy8gZGlmZmVyZW5jZSBpcyB0aGF0IHdpdGggdGhpcyBwYXNzIHRoZSBibG9jayBmcmVxdWVuY2llcyBhcmUgbm90IGNvbXB1dGVkIHdoZW4KKy8vIHRoZSBhbmFseXNpcyBwYXNzIGlzIGV4ZWN1dGVkIGJ1dCByYXRoZXIgd2hlbiB0aGUgQkZJIHJlc3VsdCBpcyBleHBsaWNpdGx5CisvLyByZXF1ZXN0ZWQgYnkgdGhlIGFuYWx5c2lzIGNsaWVudC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTEFaWUJMT0NLRlJFUVVFTkNZSU5GT19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTEFaWUJMT0NLRlJFUVVFTkNZSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0Jsb2NrRnJlcXVlbmN5SW5mby5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTGF6eUJyYW5jaFByb2JhYmlsaXR5SW5mby5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBBbmFseXNpc1VzYWdlOworY2xhc3MgQnJhbmNoUHJvYmFiaWxpdHlJbmZvOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBMb29wSW5mbzsKKworLy8vIFdyYXBzIGEgQkZJIHRvIGFsbG93IGxhenkgY29tcHV0YXRpb24gb2YgdGhlIGJsb2NrIGZyZXF1ZW5jaWVzLgorLy8vCisvLy8gQSBwYXNzIHRoYXQgb25seSBjb25kaXRpb25hbGx5IHVzZXMgQkZJIGNhbiB1bmNvbmR0aW9uYWxseSByZXF1aXJlIHRoZQorLy8vIGFuYWx5c2lzIHdpdGhvdXQgcGF5aW5nIGZvciB0aGUgb3ZlcmhlYWQgaWYgQkZJIGRvZXNuJ3QgZW5kIHVwIGJlaW5nIHVzZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb25ULCB0eXBlbmFtZSBCcmFuY2hQcm9iYWJpbGl0eUluZm9QYXNzVCwKKyAgICAgICAgICB0eXBlbmFtZSBMb29wSW5mb1QsIHR5cGVuYW1lIEJsb2NrRnJlcXVlbmN5SW5mb1Q+CitjbGFzcyBMYXp5QmxvY2tGcmVxdWVuY3lJbmZvIHsKK3B1YmxpYzoKKyAgTGF6eUJsb2NrRnJlcXVlbmN5SW5mbygpCisgICAgICA6IENhbGN1bGF0ZWQoZmFsc2UpLCBGKG51bGxwdHIpLCBCUElQYXNzKG51bGxwdHIpLCBMSShudWxscHRyKSB7fQorCisgIC8vLyBTZXQgdXAgdGhlIHBlci1mdW5jdGlvbiBpbnB1dC4KKyAgdm9pZCBzZXRBbmFseXNpcyhjb25zdCBGdW5jdGlvblQgKkYsIEJyYW5jaFByb2JhYmlsaXR5SW5mb1Bhc3NUICpCUElQYXNzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3BJbmZvVCAqTEkpIHsKKyAgICB0aGlzLT5GID0gRjsKKyAgICB0aGlzLT5CUElQYXNzID0gQlBJUGFzczsKKyAgICB0aGlzLT5MSSA9IExJOworICB9CisKKyAgLy8vIFJldHJpZXZlIHRoZSBCRkkgd2l0aCB0aGUgYmxvY2sgZnJlcXVlbmNpZXMgY29tcHV0ZWQuCisgIEJsb2NrRnJlcXVlbmN5SW5mb1QgJmdldENhbGN1bGF0ZWQoKSB7CisgICAgaWYgKCFDYWxjdWxhdGVkKSB7CisgICAgICBhc3NlcnQoRiAmJiBCUElQYXNzICYmIExJICYmICJjYWxsIHNldEFuYWx5c2lzIik7CisgICAgICBCRkkuY2FsY3VsYXRlKAorICAgICAgICAgICpGLCBCUElQYXNzVHJhaXQ8QnJhbmNoUHJvYmFiaWxpdHlJbmZvUGFzc1Q+OjpnZXRCUEkoQlBJUGFzcyksICpMSSk7CisgICAgICBDYWxjdWxhdGVkID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIEJGSTsKKyAgfQorCisgIGNvbnN0IEJsb2NrRnJlcXVlbmN5SW5mb1QgJmdldENhbGN1bGF0ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TGF6eUJsb2NrRnJlcXVlbmN5SW5mbyAqPih0aGlzKS0+Z2V0Q2FsY3VsYXRlZCgpOworICB9CisKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgeworICAgIEJGSS5yZWxlYXNlTWVtb3J5KCk7CisgICAgQ2FsY3VsYXRlZCA9IGZhbHNlOworICAgIHNldEFuYWx5c2lzKG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpOworICB9CisKK3ByaXZhdGU6CisgIEJsb2NrRnJlcXVlbmN5SW5mb1QgQkZJOworICBib29sIENhbGN1bGF0ZWQ7CisgIGNvbnN0IEZ1bmN0aW9uVCAqRjsKKyAgQnJhbmNoUHJvYmFiaWxpdHlJbmZvUGFzc1QgKkJQSVBhc3M7CisgIGNvbnN0IExvb3BJbmZvVCAqTEk7Cit9OworCisvLy8gXGJyaWVmIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgYW5hbHlzaXMgcGFzcyB0bworLy8vIEJsb2NrRnJlcXVlbmN5SW5mb1dyYXBwZXJQYXNzLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB3aXRoIHRoaXMgcGFzcyB0aGUKKy8vLyBibG9jayBmcmVxdWVuY2llcyBhcmUgbm90IGNvbXB1dGVkIHdoZW4gdGhlIGFuYWx5c2lzIHBhc3MgaXMgZXhlY3V0ZWQgYnV0CisvLy8gcmF0aGVyIHdoZW4gdGhlIEJGSSByZXN1bHQgaXMgZXhwbGljaXRseSByZXF1ZXN0ZWQgYnkgdGhlIGFuYWx5c2lzIGNsaWVudC4KKy8vLworLy8vIFRoZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIGZvciBhbnkgY2xpZW50IHBhc3MgdGhhdCB3YW50cyB0byB1c2UKKy8vLyB0aGUgYW5hbHlzaXM6CisvLy8KKy8vLyAxLiBUaGUgcGFzcyBuZWVkcyB0byBpbml0aWFsaXplIGRlcGVuZGVudCBwYXNzZXMgd2l0aDoKKy8vLworLy8vICAgSU5JVElBTElaRV9QQVNTX0RFUEVOREVOQ1koTGF6eUJGSVBhc3MpCisvLy8KKy8vLyAyLiBTaW1pbGFybHksIGdldEFuYWx5c2lzVXNhZ2Ugc2hvdWxkIGNhbGw6CisvLy8KKy8vLyAgIExhenlCbG9ja0ZyZXF1ZW5jeUluZm9QYXNzOjpnZXRMYXp5QkZJQW5hbHlzaXNVc2FnZShBVSkKKy8vLworLy8vIDMuIFRoZSBjb21wdXRlZCBCRkkgc2hvdWxkIGJlIHJlcXVlc3RlZCB3aXRoCisvLy8gICAgZ2V0QW5hbHlzaXM8TGF6eUJsb2NrRnJlcXVlbmN5SW5mb1Bhc3M+KCkuZ2V0QkZJKCkgYmVmb3JlIGVpdGhlciBMb29wSW5mbworLy8vICAgIG9yIEJQSSBjb3VsZCBiZSBpbnZhbGlkYXRlZCBmb3IgZXhhbXBsZSBieSBjaGFuZ2luZyB0aGUgQ0ZHLgorLy8vCisvLy8gTm90ZSB0aGF0IGl0IGlzIGV4cGVjdGVkIHRoYXQgd2Ugd291bGRuJ3QgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZQorLy8vIG5ldyBQTSBzaW5jZSB3aXRoIHRoZSBuZXcgUE0sIGFuYWx5c2VzIGFyZSBleGVjdXRlZCBvbiBkZW1hbmQuCisKK2NsYXNzIExhenlCbG9ja0ZyZXF1ZW5jeUluZm9QYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7Citwcml2YXRlOgorICBMYXp5QmxvY2tGcmVxdWVuY3lJbmZvPEZ1bmN0aW9uLCBMYXp5QnJhbmNoUHJvYmFiaWxpdHlJbmZvUGFzcywgTG9vcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tGcmVxdWVuY3lJbmZvPgorICAgICAgTEJGSTsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBMYXp5QmxvY2tGcmVxdWVuY3lJbmZvUGFzcygpOworCisgIC8vLyBcYnJpZWYgQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBibG9jayBmcmVxdWVuY2llcy4KKyAgQmxvY2tGcmVxdWVuY3lJbmZvICZnZXRCRkkoKSB7IHJldHVybiBMQkZJLmdldENhbGN1bGF0ZWQoKTsgfQorCisgIC8vLyBcYnJpZWYgQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBibG9jayBmcmVxdWVuY2llcy4KKyAgY29uc3QgQmxvY2tGcmVxdWVuY3lJbmZvICZnZXRCRkkoKSBjb25zdCB7IHJldHVybiBMQkZJLmdldENhbGN1bGF0ZWQoKTsgfQorCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIEhlbHBlciBmb3IgY2xpZW50IHBhc3NlcyB0byBzZXQgdXAgdGhlIGFuYWx5c2lzIHVzYWdlIG9uIGJlaGFsZiBvZiB0aGlzCisgIC8vLyBwYXNzLgorICBzdGF0aWMgdm9pZCBnZXRMYXp5QkZJQW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSk7CisKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZTsKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGU7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUgKk0pIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vIFxicmllZiBIZWxwZXIgZm9yIGNsaWVudCBwYXNzZXMgdG8gaW5pdGlhbGl6ZSBkZXBlbmRlbnQgcGFzc2VzIGZvciBMQkZJLgordm9pZCBpbml0aWFsaXplTGF6eUJGSVBhc3NQYXNzKFBhc3NSZWdpc3RyeSAmUmVnaXN0cnkpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xhenlCcmFuY2hQcm9iYWJpbGl0eUluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTGF6eUJyYW5jaFByb2JhYmlsaXR5SW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZDQwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xhenlCcmFuY2hQcm9iYWJpbGl0eUluZm8uaApAQCAtMCwwICsxLDEyNCBAQAorLy89PT0tIExhenlCcmFuY2hQcm9iYWJpbGl0eUluZm8uaCAtIExhenkgQnJhbmNoIFByb2JhYmlsaXR5IC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIGFuYWx5c2lzIHBhc3MgdG8gQnJhbmNoUHJvYmFiaWxpdHlJbmZvV3JhcHBlclBhc3MuCisvLyBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHdpdGggdGhpcyBwYXNzIHRoZSBicmFuY2ggcHJvYmFiaWxpdGllcyBhcmUgbm90CisvLyBjb21wdXRlZCB3aGVuIHRoZSBhbmFseXNpcyBwYXNzIGlzIGV4ZWN1dGVkIGJ1dCByYXRoZXIgd2hlbiB0aGUgQlBJIHJlc3VsdHMKKy8vIGlzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHRoZSBhbmFseXNpcyBjbGllbnQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0xBWllCUkFOQ0hQUk9CQUJJTElUWUlORk9fSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0xBWllCUkFOQ0hQUk9CQUJJTElUWUlORk9fSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9CcmFuY2hQcm9iYWJpbGl0eUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQW5hbHlzaXNVc2FnZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTG9vcEluZm87CitjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbzsKKworLy8vIFxicmllZiBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIGFuYWx5c2lzIHBhc3MgdG8KKy8vLyBCcmFuY2hQcm9iYWJpbGl0eUluZm9XcmFwcGVyUGFzcy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgd2l0aCB0aGlzIHBhc3MgdGhlCisvLy8gYnJhbmNoIHByb2JhYmlsaXRpZXMgYXJlIG5vdCBjb21wdXRlZCB3aGVuIHRoZSBhbmFseXNpcyBwYXNzIGlzIGV4ZWN1dGVkIGJ1dAorLy8vIHJhdGhlciB3aGVuIHRoZSBCUEkgcmVzdWx0cyBpcyBleHBsaWNpdGx5IHJlcXVlc3RlZCBieSB0aGUgYW5hbHlzaXMgY2xpZW50LgorLy8vCisvLy8gVGhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgZm9yIGFueSBjbGllbnQgcGFzcyB0aGF0IHdhbnRzIHRvIHVzZQorLy8vIHRoZSBhbmFseXNpczoKKy8vLworLy8vIDEuIFRoZSBwYXNzIG5lZWRzIHRvIGluaXRpYWxpemUgZGVwZW5kZW50IHBhc3NlcyB3aXRoOgorLy8vCisvLy8gICBJTklUSUFMSVpFX1BBU1NfREVQRU5ERU5DWShMYXp5QlBJUGFzcykKKy8vLworLy8vIDIuIFNpbWlsYXJseSwgZ2V0QW5hbHlzaXNVc2FnZSBzaG91bGQgY2FsbDoKKy8vLworLy8vICAgTGF6eUJyYW5jaFByb2JhYmlsaXR5SW5mb1Bhc3M6OmdldExhenlCUElBbmFseXNpc1VzYWdlKEFVKQorLy8vCisvLy8gMy4gVGhlIGNvbXB1dGVkIEJQSSBzaG91bGQgYmUgcmVxdWVzdGVkIHdpdGgKKy8vLyAgICBnZXRBbmFseXNpczxMYXp5QnJhbmNoUHJvYmFiaWxpdHlJbmZvUGFzcz4oKS5nZXRCUEkoKSBiZWZvcmUgTG9vcEluZm8KKy8vLyAgICBjb3VsZCBiZSBpbnZhbGlkYXRlZCBmb3IgZXhhbXBsZSBieSBjaGFuZ2luZyB0aGUgQ0ZHLgorLy8vCisvLy8gTm90ZSB0aGF0IGl0IGlzIGV4cGVjdGVkIHRoYXQgd2Ugd291bGRuJ3QgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZQorLy8vIG5ldyBQTSBzaW5jZSB3aXRoIHRoZSBuZXcgUE0sIGFuYWx5c2VzIGFyZSBleGVjdXRlZCBvbiBkZW1hbmQuCitjbGFzcyBMYXp5QnJhbmNoUHJvYmFiaWxpdHlJbmZvUGFzcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworCisgIC8vLyBXcmFwcyBhIEJQSSB0byBhbGxvdyBsYXp5IGNvbXB1dGF0aW9uIG9mIHRoZSBicmFuY2ggcHJvYmFiaWxpdGllcy4KKyAgLy8vCisgIC8vLyBBIHBhc3MgdGhhdCBvbmx5IGNvbmRpdGlvbmFsbHkgdXNlcyBCUEkgY2FuIHVuY29uZHRpb25hbGx5IHJlcXVpcmUgdGhlCisgIC8vLyBhbmFseXNpcyB3aXRob3V0IHBheWluZyBmb3IgdGhlIG92ZXJoZWFkIGlmIEJQSSBkb2Vzbid0IGVuZCB1cCBiZWluZyB1c2VkLgorICBjbGFzcyBMYXp5QnJhbmNoUHJvYmFiaWxpdHlJbmZvIHsKKyAgcHVibGljOgorICAgIExhenlCcmFuY2hQcm9iYWJpbGl0eUluZm8oY29uc3QgRnVuY3Rpb24gKkYsIGNvbnN0IExvb3BJbmZvICpMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpCisgICAgICAgIDogQ2FsY3VsYXRlZChmYWxzZSksIEYoRiksIExJKExJKSwgVExJKFRMSSkge30KKworICAgIC8vLyBSZXRyaWV2ZSB0aGUgQlBJIHdpdGggdGhlIGJyYW5jaCBwcm9iYWJpbGl0aWVzIGNvbXB1dGVkLgorICAgIEJyYW5jaFByb2JhYmlsaXR5SW5mbyAmZ2V0Q2FsY3VsYXRlZCgpIHsKKyAgICAgIGlmICghQ2FsY3VsYXRlZCkgeworICAgICAgICBhc3NlcnQoRiAmJiBMSSAmJiAiY2FsbCBzZXRBbmFseXNpcyIpOworICAgICAgICBCUEkuY2FsY3VsYXRlKCpGLCAqTEksIFRMSSk7CisgICAgICAgIENhbGN1bGF0ZWQgPSB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIEJQSTsKKyAgICB9CisKKyAgICBjb25zdCBCcmFuY2hQcm9iYWJpbGl0eUluZm8gJmdldENhbGN1bGF0ZWQoKSBjb25zdCB7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxMYXp5QnJhbmNoUHJvYmFiaWxpdHlJbmZvICo+KHRoaXMpLT5nZXRDYWxjdWxhdGVkKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgQnJhbmNoUHJvYmFiaWxpdHlJbmZvIEJQSTsKKyAgICBib29sIENhbGN1bGF0ZWQ7CisgICAgY29uc3QgRnVuY3Rpb24gKkY7CisgICAgY29uc3QgTG9vcEluZm8gKkxJOworICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEk7CisgIH07CisKKyAgc3RkOjp1bmlxdWVfcHRyPExhenlCcmFuY2hQcm9iYWJpbGl0eUluZm8+IExCUEk7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgTGF6eUJyYW5jaFByb2JhYmlsaXR5SW5mb1Bhc3MoKTsKKworICAvLy8gXGJyaWVmIENvbXB1dGUgYW5kIHJldHVybiB0aGUgYnJhbmNoIHByb2JhYmlsaXRpZXMuCisgIEJyYW5jaFByb2JhYmlsaXR5SW5mbyAmZ2V0QlBJKCkgeyByZXR1cm4gTEJQSS0+Z2V0Q2FsY3VsYXRlZCgpOyB9CisKKyAgLy8vIFxicmllZiBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGJyYW5jaCBwcm9iYWJpbGl0aWVzLgorICBjb25zdCBCcmFuY2hQcm9iYWJpbGl0eUluZm8gJmdldEJQSSgpIGNvbnN0IHsgcmV0dXJuIExCUEktPmdldENhbGN1bGF0ZWQoKTsgfQorCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIEhlbHBlciBmb3IgY2xpZW50IHBhc3NlcyB0byBzZXQgdXAgdGhlIGFuYWx5c2lzIHVzYWdlIG9uIGJlaGFsZiBvZiB0aGlzCisgIC8vLyBwYXNzLgorICBzdGF0aWMgdm9pZCBnZXRMYXp5QlBJQW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSk7CisKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZTsKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGU7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUgKk0pIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vIFxicmllZiBIZWxwZXIgZm9yIGNsaWVudCBwYXNzZXMgdG8gaW5pdGlhbGl6ZSBkZXBlbmRlbnQgcGFzc2VzIGZvciBMQlBJLgordm9pZCBpbml0aWFsaXplTGF6eUJQSVBhc3NQYXNzKFBhc3NSZWdpc3RyeSAmUmVnaXN0cnkpOworCisvLy8gXGJyaWVmIFNpbXBsZSB0cmFpdCBjbGFzcyB0aGF0IHByb3ZpZGVzIGEgbWFwcGluZyBiZXR3ZWVuIEJQSSBwYXNzZXMgYW5kIHRoZQorLy8vIGNvcnJlc3BvbmRpbmcgQlBJbmZvLgordGVtcGxhdGUgPHR5cGVuYW1lIFBhc3NUPiBzdHJ1Y3QgQlBJUGFzc1RyYWl0IHsKKyAgc3RhdGljIFBhc3NUICZnZXRCUEkoUGFzc1QgKlApIHsgcmV0dXJuICpQOyB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgQlBJUGFzc1RyYWl0PExhenlCcmFuY2hQcm9iYWJpbGl0eUluZm9QYXNzPiB7CisgIHN0YXRpYyBCcmFuY2hQcm9iYWJpbGl0eUluZm8gJmdldEJQSShMYXp5QnJhbmNoUHJvYmFiaWxpdHlJbmZvUGFzcyAqUCkgeworICAgIHJldHVybiBQLT5nZXRCUEkoKTsKKyAgfQorfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9MYXp5Q2FsbEdyYXBoLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xhenlDYWxsR3JhcGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWVjNmE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9MYXp5Q2FsbEdyYXBoLmgKQEAgLTAsMCArMSwxMjg4IEBACisvLz09PS0gTGF6eUNhbGxHcmFwaC5oIC0gQW5hbHlzaXMgb2YgYSBNb2R1bGUncyBjYWxsIGdyYXBoIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8KKy8vLyBJbXBsZW1lbnRzIGEgbGF6eSBjYWxsIGdyYXBoIGFuYWx5c2lzIGFuZCByZWxhdGVkIHBhc3NlcyBmb3IgdGhlIG5ldyBwYXNzCisvLy8gbWFuYWdlci4KKy8vLworLy8vIE5COiBUaGlzIGlzICpub3QqIGEgdHJhZGl0aW9uYWwgY2FsbCBncmFwaCEgSXQgaXMgYSBncmFwaCB3aGljaCBtb2RlbHMgYm90aAorLy8vIHRoZSBjdXJyZW50IGNhbGxzIGFuZCBwb3RlbnRpYWwgY2FsbHMuIEFzIGEgY29uc2VxdWVuY2UgdGhlcmUgYXJlIG1hbnkKKy8vLyBlZGdlcyBpbiB0aGlzIGNhbGwgZ3JhcGggdGhhdCBkbyBub3QgY29ycmVzcG9uZCB0byBhICdjYWxsJyBvciAnaW52b2tlJworLy8vIGluc3RydWN0aW9uLgorLy8vCisvLy8gVGhlIHByaW1hcnkgdXNlIGNhc2VzIG9mIHRoaXMgZ3JhcGggYW5hbHlzaXMgaXMgdG8gZmFjaWxpdGF0ZSBpdGVyYXRpbmcKKy8vLyBhY3Jvc3MgdGhlIGZ1bmN0aW9ucyBvZiBhIG1vZHVsZSBpbiB3YXlzIHRoYXQgZW5zdXJlIGFsbCBjYWxsZWVzIGFyZQorLy8vIHZpc2l0ZWQgcHJpb3IgdG8gYSBjYWxsZXIgKGdpdmVuIGFueSBTQ0MgY29uc3RyYWludHMpLCBvciB2aWNlIHZlcnNhLiBBcworLy8vIHN1Y2ggaXMgaXQgcGFydGljdWxhcmx5IHdlbGwgc3VpdGVkIHRvIG9yZ2FuaXppbmcgQ0dTQ0Mgb3B0aW1pemF0aW9ucyBzdWNoCisvLy8gYXMgaW5saW5pbmcsIG91dGxpbmluZywgYXJndW1lbnQgcHJvbW90aW9uLCBldGMuIFRoYXQgaXMgaXRzIHByaW1hcnkgdXNlCisvLy8gY2FzZSBhbmQgbW90aXZhdGVzIHRoZSBkZXNpZ24uIEl0IG1heSBub3QgYmUgYXBwcm9wcmlhdGUgZm9yIG90aGVyCisvLy8gcHVycG9zZXMuIFRoZSB1c2UgZ3JhcGggb2YgZnVuY3Rpb25zIG9yIHNvbWUgb3RoZXIgY29uc2VydmF0aXZlIGFuYWx5c2lzIG9mCisvLy8gY2FsbCBpbnN0cnVjdGlvbnMgbWF5IGJlIGludGVyZXN0aW5nIGZvciBvcHRpbWl6YXRpb25zIGFuZCBzdWJzZXF1ZW50CisvLy8gYW5hbHlzZXMgd2hpY2ggZG9uJ3Qgd29yayBpbiB0aGUgY29udGV4dCBvZiBhbiBvdmVybHkgc3BlY2lmaWVkCisvLy8gcG90ZW50aWFsLWNhbGwtZWRnZSBncmFwaC4KKy8vLworLy8vIFRvIHVuZGVyc3RhbmQgdGhlIHNwZWNpZmljIHJ1bGVzIGFuZCBuYXR1cmUgb2YgdGhpcyBjYWxsIGdyYXBoIGFuYWx5c2lzLAorLy8vIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgXGMgTGF6eUNhbGxHcmFwaCBiZWxvdy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0xBWllDQUxMR1JBUEhfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0xBWllDQUxMR1JBUEhfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVGFyZ2V0TGlicmFyeUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50LmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTW9kdWxlOworY2xhc3MgVmFsdWU7CisKKy8vLyBBIGxhemlseSBjb25zdHJ1Y3RlZCB2aWV3IG9mIHRoZSBjYWxsIGdyYXBoIG9mIGEgbW9kdWxlLgorLy8vCisvLy8gV2l0aCB0aGUgZWRnZXMgb2YgdGhpcyBncmFwaCwgdGhlIG1vdGl2YXRpbmcgY29uc3RyYWludCB0aGF0IHdlIGFyZQorLy8vIGF0dGVtcHRpbmcgdG8gbWFpbnRhaW4gaXMgdGhhdCBmdW5jdGlvbi1sb2NhbCBvcHRpbWl6YXRpb24sIENHU0NDLWxvY2FsCisvLy8gb3B0aW1pemF0aW9ucywgYW5kIG9wdGltaXphdGlvbnMgdHJhbnNmb3JtaW5nIGEgcGFpciBvZiBmdW5jdGlvbnMgY29ubmVjdGVkCisvLy8gYnkgYW4gZWRnZSBpbiB0aGUgZ3JhcGgsIGRvIG5vdCBpbnZhbGlkYXRlIGEgYm90dG9tLXVwIHRyYXZlcnNhbCBvZiB0aGUgU0NDCisvLy8gREFHLiBUaGF0IGlzLCBubyBvcHRpbWl6YXRpb25zIHdpbGwgZGVsZXRlLCByZW1vdmUsIG9yIGFkZCBhbiBlZGdlIHN1Y2gKKy8vLyB0aGF0IGZ1bmN0aW9ucyBhbHJlYWR5IHZpc2l0ZWQgaW4gYSBib3R0b20tdXAgb3JkZXIgb2YgdGhlIFNDQyBEQUcgYXJlIG5vCisvLy8gbG9uZ2VyIHZhbGlkIHRvIGhhdmUgdmlzaXRlZCwgb3Igc3VjaCB0aGF0IGZ1bmN0aW9ucyBub3QgeWV0IHZpc2l0ZWQgaW4KKy8vLyBhIGJvdHRvbS11cCBvcmRlciBvZiB0aGUgU0NDIERBRyBhcmUgbm90IHJlcXVpcmVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuCisvLy8gdmlzaXRlZC4KKy8vLworLy8vIFdpdGhpbiB0aGlzIGNvbnN0cmFpbnQsIHRoZSBkZXNpcmUgaXMgdG8gbWluaW1pemUgdGhlIG1lcmdlIHBvaW50cyBvZiB0aGUKKy8vLyBTQ0MgREFHLiBUaGUgZ3JlYXRlciB0aGUgZmFub3V0IG9mIHRoZSBTQ0MgREFHIGFuZCB0aGUgZmV3ZXIgbWVyZ2UgcG9pbnRzCisvLy8gaW4gdGhlIFNDQyBEQUcsIHRoZSBtb3JlIGluZGVwZW5kZW5jZSB0aGVyZSBpcyBpbiBvcHRpbWl6aW5nIHdpdGhpbiBpdC4KKy8vLyBUaGVyZSBpcyBhIHN0cm9uZyBkZXNpcmUgdG8gZW5hYmxlIHBhcmFsbGVsaXphdGlvbiBvZiBvcHRpbWl6YXRpb25zIG92ZXIKKy8vLyB0aGUgY2FsbCBncmFwaCwgYW5kIGJvdGggbGltaXRlZCBmYW5vdXQgYW5kIG1lcmdlIHBvaW50cyB3aWxsIChhcnRpZmljaWFsbHkKKy8vLyBpbiBzb21lIGNhc2VzKSBsaW1pdCB0aGUgc2NhbGluZyBvZiBzdWNoIGFuIGVmZm9ydC4KKy8vLworLy8vIFRvIHRoaXMgZW5kLCBncmFwaCByZXByZXNlbnRzIGJvdGggZGlyZWN0IGFuZCBhbnkgcG90ZW50aWFsIHJlc29sdXRpb24gdG8KKy8vLyBhbiBpbmRpcmVjdCBjYWxsIGVkZ2UuIEFub3RoZXIgd2F5IHRvIHRoaW5rIGFib3V0IGl0IGlzIHRoYXQgaXQgcmVwcmVzZW50cworLy8vIGJvdGggdGhlIGRpcmVjdCBjYWxsIGVkZ2VzIGFuZCBhbnkgZGlyZWN0IGNhbGwgZWRnZXMgdGhhdCBtaWdodCBiZSBmb3JtZWQKKy8vLyB0aHJvdWdoIHN0YXRpYyBvcHRpbWl6YXRpb25zLiBTcGVjaWZpY2FsbHksIGl0IGNvbnNpZGVycyB0YWtpbmcgdGhlIGFkZHJlc3MKKy8vLyBvZiBhIGZ1bmN0aW9uIHRvIGJlIGFuIGVkZ2UgaW4gdGhlIGNhbGwgZ3JhcGggYmVjYXVzZSB0aGlzIG1pZ2h0IGJlCisvLy8gZm9yd2FyZGVkIHRvIGJlY29tZSBhIGRpcmVjdCBjYWxsIGJ5IHNvbWUgc3Vic2VxdWVudCBmdW5jdGlvbi1sb2NhbAorLy8vIG9wdGltaXphdGlvbi4gVGhlIHJlc3VsdCBpcyB0aGF0IHRoZSBncmFwaCBjbG9zZWx5IGZvbGxvd3MgdGhlIHVzZS1kZWYKKy8vLyBlZGdlcyBmb3IgZnVuY3Rpb25zLiBXYWxraW5nICJ1cCIgdGhlIGdyYXBoIGNhbiBiZSBkb25lIGJ5IGxvb2tpbmcgYXQgYWxsCisvLy8gb2YgdGhlIHVzZXMgb2YgYSBmdW5jdGlvbi4KKy8vLworLy8vIFRoZSByb290cyBvZiB0aGUgY2FsbCBncmFwaCBhcmUgdGhlIGV4dGVybmFsIGZ1bmN0aW9ucyBhbmQgZnVuY3Rpb25zCisvLy8gZXNjYXBlZCBpbnRvIGdsb2JhbCB2YXJpYWJsZXMuIFRob3NlIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkIGZyb20gb3V0c2lkZQorLy8vIG9mIHRoZSBtb2R1bGUgb3IgdmlhIHVua25vd2FibGUgbWVhbnMgaW4gdGhlIElSIC0tIHdlIG1heSBub3QgYmUgYWJsZSB0bworLy8vIGZvcm0gZXZlbiBhIHBvdGVudGlhbCBjYWxsIGVkZ2UgZnJvbSBhIGZ1bmN0aW9uIGJvZHkgd2hpY2ggbWF5IGR5bmFtaWNhbGx5CisvLy8gbG9hZCB0aGUgZnVuY3Rpb24gYW5kIGNhbGwgaXQuCisvLy8KKy8vLyBUaGlzIGFuYWx5c2lzIHN0aWxsIHJlcXVpcmVzIHVwZGF0ZXMgdG8gcmVtYWluIHZhbGlkIGFmdGVyIG9wdGltaXphdGlvbnMKKy8vLyB3aGljaCBjb3VsZCBwb3RlbnRpYWxseSBjaGFuZ2UgdGhlIHNldCBvZiBwb3RlbnRpYWwgY2FsbGVlcy4gVGhlCisvLy8gY29uc3RyYWludHMgaXQgb3BlcmF0ZXMgdW5kZXIgb25seSBtYWtlIHRoZSB0cmF2ZXJzYWwgb3JkZXIgcmVtYWluIHZhbGlkLgorLy8vCisvLy8gVGhlIGVudGlyZSBhbmFseXNpcyBtdXN0IGJlIHJlLWNvbXB1dGVkIGlmIGZ1bGwgaW50ZXJwcm9jZWR1cmFsCisvLy8gb3B0aW1pemF0aW9ucyBydW4gYXQgYW55IHBvaW50LiBGb3IgZXhhbXBsZSwgZ2xvYmFsb3B0IGNvbXBsZXRlbHkKKy8vLyBpbnZhbGlkYXRlcyB0aGUgaW5mb3JtYXRpb24gaW4gdGhpcyBhbmFseXNpcy4KKy8vLworLy8vIEZJWE1FOiBUaGlzIGNsYXNzIGlzIG5hbWVkIExhenlDYWxsR3JhcGggaW4gYSBsYW1lIGF0dGVtcHQgdG8gZGlzdGluZ3Vpc2gKKy8vLyBpdCBmcm9tIHRoZSBleGlzdGluZyBDYWxsR3JhcGguIEF0IHNvbWUgcG9pbnQsIGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhpcworLy8vIHdpbGwgYmUgdGhlIG9ubHkgY2FsbCBncmFwaCBhbmQgaXQgd2lsbCBiZSByZW5hbWVkIGFjY29yZGluZ2x5LgorY2xhc3MgTGF6eUNhbGxHcmFwaCB7CitwdWJsaWM6CisgIGNsYXNzIE5vZGU7CisgIGNsYXNzIEVkZ2VTZXF1ZW5jZTsKKyAgY2xhc3MgU0NDOworICBjbGFzcyBSZWZTQ0M7CisgIGNsYXNzIGVkZ2VfaXRlcmF0b3I7CisgIGNsYXNzIGNhbGxfZWRnZV9pdGVyYXRvcjsKKworICAvLy8gQSBjbGFzcyB1c2VkIHRvIHJlcHJlc2VudCBlZGdlcyBpbiB0aGUgY2FsbCBncmFwaC4KKyAgLy8vCisgIC8vLyBUaGUgbGF6eSBjYWxsIGdyYXBoIG1vZGVscyBib3RoICpjYWxsKiBlZGdlcyBhbmQgKnJlZmVyZW5jZSogZWRnZXMuIENhbGwKKyAgLy8vIGVkZ2VzIGFyZSBtdWNoIHdoYXQgeW91IHdvdWxkIGV4cGVjdCwgYW5kIGV4aXN0IHdoZW4gdGhlcmUgaXMgYSAnY2FsbCcgb3IKKyAgLy8vICdpbnZva2UnIGluc3RydWN0aW9uIG9mIHNvbWUgZnVuY3Rpb24uIFJlZmVyZW5jZSBlZGdlcyBhcmUgYWxzbyB0cmFja2VkCisgIC8vLyBhbG9uZyBzaWRlIHRoZXNlLCBhbmQgZXhpc3Qgd2hlbmV2ZXIgYW55IGluc3RydWN0aW9uICh0cmFuc2l0aXZlbHkKKyAgLy8vIHRocm91Z2ggaXRzIG9wZXJhbmRzKSByZWZlcmVuY2VzIGEgZnVuY3Rpb24uIEFsbCBjYWxsIGVkZ2VzIGFyZQorICAvLy8gaW5oZXJlbnRseSByZWZlcmVuY2UgZWRnZXMsIGFuZCBzbyB0aGUgcmVmZXJlbmNlIGdyYXBoIGZvcm1zIGEgc3VwZXJzZXQKKyAgLy8vIG9mIHRoZSBmb3JtYWwgY2FsbCBncmFwaC4KKyAgLy8vCisgIC8vLyBBbGwgb2YgdGhlc2UgZm9ybXMgb2YgZWRnZXMgYXJlIGZ1bmRhbWVudGFsbHkgcmVwcmVzZW50ZWQgYXMgb3V0Z29pbmcKKyAgLy8vIGVkZ2VzLiBUaGUgZWRnZXMgYXJlIHN0b3JlZCBpbiB0aGUgc291cmNlIG5vZGUgYW5kIHBvaW50IGF0IHRoZSB0YXJnZXQKKyAgLy8vIG5vZGUuIFRoaXMgYWxsb3dzIHRoZSBlZGdlIHN0cnVjdHVyZSBpdHNlbGYgdG8gYmUgYSB2ZXJ5IGNvbXBhY3QgZGF0YQorICAvLy8gc3RydWN0dXJlOiBlc3NlbnRpYWxseSBhIHRhZ2dlZCBwb2ludGVyLgorICBjbGFzcyBFZGdlIHsKKyAgcHVibGljOgorICAgIC8vLyBUaGUga2luZCBvZiBlZGdlIGluIHRoZSBncmFwaC4KKyAgICBlbnVtIEtpbmQgOiBib29sIHsgUmVmID0gZmFsc2UsIENhbGwgPSB0cnVlIH07CisKKyAgICBFZGdlKCk7CisgICAgZXhwbGljaXQgRWRnZShOb2RlICZOLCBLaW5kIEspOworCisgICAgLy8vIFRlc3Qgd2hldGhlciB0aGUgZWRnZSBpcyBudWxsLgorICAgIC8vLworICAgIC8vLyBUaGlzIGhhcHBlbnMgd2hlbiBhbiBlZGdlIGhhcyBiZWVuIGRlbGV0ZWQuIFdlIGxlYXZlIHRoZSBlZGdlIG9iamVjdHMKKyAgICAvLy8gYXJvdW5kIGJ1dCBjbGVhciB0aGVtLgorICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdDsKKworICAgIC8vLyBSZXR1cm5zcyB0aGUgXGMgS2luZCBvZiB0aGUgZWRnZS4KKyAgICBLaW5kIGdldEtpbmQoKSBjb25zdDsKKworICAgIC8vLyBUZXN0IHdoZXRoZXIgdGhlIGVkZ2UgcmVwcmVzZW50cyBhIGRpcmVjdCBjYWxsIHRvIGEgZnVuY3Rpb24uCisgICAgLy8vCisgICAgLy8vIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgZWRnZSBpcyBub3QgbnVsbC4KKyAgICBib29sIGlzQ2FsbCgpIGNvbnN0OworCisgICAgLy8vIEdldCB0aGUgY2FsbCBncmFwaCBub2RlIHJlZmVyZW5jZWQgYnkgdGhpcyBlZGdlLgorICAgIC8vLworICAgIC8vLyBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGVkZ2UgaXMgbm90IG51bGwuCisgICAgTm9kZSAmZ2V0Tm9kZSgpIGNvbnN0OworCisgICAgLy8vIEdldCB0aGUgZnVuY3Rpb24gcmVmZXJlbmNlZCBieSB0aGlzIGVkZ2UuCisgICAgLy8vCisgICAgLy8vIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgZWRnZSBpcyBub3QgbnVsbC4KKyAgICBGdW5jdGlvbiAmZ2V0RnVuY3Rpb24oKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBMYXp5Q2FsbEdyYXBoOjpFZGdlU2VxdWVuY2U7CisgICAgZnJpZW5kIGNsYXNzIExhenlDYWxsR3JhcGg6OlJlZlNDQzsKKworICAgIFBvaW50ZXJJbnRQYWlyPE5vZGUgKiwgMSwgS2luZD4gVmFsdWU7CisKKyAgICB2b2lkIHNldEtpbmQoS2luZCBLKSB7IFZhbHVlLnNldEludChLKTsgfQorICB9OworCisgIC8vLyBUaGUgZWRnZSBzZXF1ZW5jZSBvYmplY3QuCisgIC8vLworICAvLy8gVGhpcyB0eXBpY2FsbHkgZXhpc3RzIGVudGlyZWx5IHdpdGhpbiB0aGUgbm9kZSBidXQgaXMgZXhwb3NlZCBhcworICAvLy8gYSBzZXBhcmF0ZSB0eXBlIGJlY2F1c2UgYSBub2RlIGRvZXNuJ3QgaW5pdGlhbGx5IGhhdmUgZWRnZXMuIEFuIGV4cGxpY2l0CisgIC8vLyBwb3B1bGF0aW9uIHN0ZXAgaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGlzIHNlcXVlbmNlIGF0IGZpcnN0IGFuZCBpdCBpcworICAvLy8gdGhlbiBjYWNoZWQgaW4gdGhlIG5vZGUuIEl0IGlzIGFsc28gdXNlZCB0byByZXByZXNlbnQgZWRnZXMgZW50ZXJpbmcgdGhlCisgIC8vLyBncmFwaCBmcm9tIG91dHNpZGUgdGhlIG1vZHVsZSB0byBtb2RlbCB0aGUgZ3JhcGgncyByb290cy4KKyAgLy8vCisgIC8vLyBUaGUgc2VxdWVuY2UgaXRzZWxmIGJvdGggaXRlcmFibGUgYW5kIGluZGV4YWJsZS4gVGhlIGluZGV4ZXMgcmVtYWluCisgIC8vLyBzdGFibGUgZXZlbiBhcyB0aGUgc2VxdWVuY2UgbXV0YXRlcyAoaW5jbHVkaW5nIHJlbW92YWwpLgorICBjbGFzcyBFZGdlU2VxdWVuY2UgeworICAgIGZyaWVuZCBjbGFzcyBMYXp5Q2FsbEdyYXBoOworICAgIGZyaWVuZCBjbGFzcyBMYXp5Q2FsbEdyYXBoOjpOb2RlOworICAgIGZyaWVuZCBjbGFzcyBMYXp5Q2FsbEdyYXBoOjpSZWZTQ0M7CisKKyAgICB1c2luZyBWZWN0b3JUID0gU21hbGxWZWN0b3I8RWRnZSwgND47CisgICAgdXNpbmcgVmVjdG9ySW1wbFQgPSBTbWFsbFZlY3RvckltcGw8RWRnZT47CisKKyAgcHVibGljOgorICAgIC8vLyBBbiBpdGVyYXRvciB1c2VkIGZvciB0aGUgZWRnZXMgdG8gYm90aCBlbnRyeSBub2RlcyBhbmQgY2hpbGQgbm9kZXMuCisgICAgY2xhc3MgaXRlcmF0b3IKKyAgICAgICAgOiBwdWJsaWMgaXRlcmF0b3JfYWRhcHRvcl9iYXNlPGl0ZXJhdG9yLCBWZWN0b3JJbXBsVDo6aXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnPiB7CisgICAgICBmcmllbmQgY2xhc3MgTGF6eUNhbGxHcmFwaDsKKyAgICAgIGZyaWVuZCBjbGFzcyBMYXp5Q2FsbEdyYXBoOjpOb2RlOworCisgICAgICBWZWN0b3JJbXBsVDo6aXRlcmF0b3IgRTsKKworICAgICAgLy8gQnVpbGQgdGhlIGl0ZXJhdG9yIGZvciBhIHNwZWNpZmljIHBvc2l0aW9uIGluIHRoZSBlZGdlIGxpc3QuCisgICAgICBpdGVyYXRvcihWZWN0b3JJbXBsVDo6aXRlcmF0b3IgQmFzZUksIFZlY3RvckltcGxUOjppdGVyYXRvciBFKQorICAgICAgICAgIDogaXRlcmF0b3JfYWRhcHRvcl9iYXNlKEJhc2VJKSwgRShFKSB7CisgICAgICAgIHdoaWxlIChJICE9IEUgJiYgISpJKQorICAgICAgICAgICsrSTsKKyAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIGl0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgICAgICB1c2luZyBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U6Om9wZXJhdG9yKys7CisgICAgICBpdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICAgICAgZG8geworICAgICAgICAgICsrSTsKKyAgICAgICAgfSB3aGlsZSAoSSAhPSBFICYmICEqSSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICB9OworCisgICAgLy8vIEFuIGl0ZXJhdG9yIG92ZXIgc3BlY2lmaWNhbGx5IGNhbGwgZWRnZXMuCisgICAgLy8vCisgICAgLy8vIFRoaXMgaGFzIHRoZSBzYW1lIGl0ZXJhdGlvbiBwcm9wZXJ0aWVzIGFzIHRoZSBcYyBpdGVyYXRvciwgYnV0CisgICAgLy8vIHJlc3RyaWN0cyBpdHNlbGYgdG8gZWRnZXMgd2hpY2ggcmVwcmVzZW50IGFjdHVhbCBjYWxscy4KKyAgICBjbGFzcyBjYWxsX2l0ZXJhdG9yCisgICAgICAgIDogcHVibGljIGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTxjYWxsX2l0ZXJhdG9yLCBWZWN0b3JJbXBsVDo6aXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnPiB7CisgICAgICBmcmllbmQgY2xhc3MgTGF6eUNhbGxHcmFwaDsKKyAgICAgIGZyaWVuZCBjbGFzcyBMYXp5Q2FsbEdyYXBoOjpOb2RlOworCisgICAgICBWZWN0b3JJbXBsVDo6aXRlcmF0b3IgRTsKKworICAgICAgLy8vIEFkdmFuY2UgdGhlIGl0ZXJhdG9yIHRvIHRoZSBuZXh0IHZhbGlkLCBjYWxsIGVkZ2UuCisgICAgICB2b2lkIGFkdmFuY2VUb05leHRFZGdlKCkgeworICAgICAgICB3aGlsZSAoSSAhPSBFICYmICghKkkgfHwgIUktPmlzQ2FsbCgpKSkKKyAgICAgICAgICArK0k7CisgICAgICB9CisKKyAgICAgIC8vIEJ1aWxkIHRoZSBpdGVyYXRvciBmb3IgYSBzcGVjaWZpYyBwb3NpdGlvbiBpbiB0aGUgZWRnZSBsaXN0LgorICAgICAgY2FsbF9pdGVyYXRvcihWZWN0b3JJbXBsVDo6aXRlcmF0b3IgQmFzZUksIFZlY3RvckltcGxUOjppdGVyYXRvciBFKQorICAgICAgICAgIDogaXRlcmF0b3JfYWRhcHRvcl9iYXNlKEJhc2VJKSwgRShFKSB7CisgICAgICAgIGFkdmFuY2VUb05leHRFZGdlKCk7CisgICAgICB9CisKKyAgICBwdWJsaWM6CisgICAgICBjYWxsX2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgICAgICB1c2luZyBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U6Om9wZXJhdG9yKys7CisgICAgICBjYWxsX2l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgICAgICArK0k7CisgICAgICAgIGFkdmFuY2VUb05leHRFZGdlKCk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICB9OworCisgICAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBpdGVyYXRvcihFZGdlcy5iZWdpbigpLCBFZGdlcy5lbmQoKSk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcihFZGdlcy5lbmQoKSwgRWRnZXMuZW5kKCkpOyB9CisKKyAgICBFZGdlICZvcGVyYXRvcltdKGludCBpKSB7IHJldHVybiBFZGdlc1tpXTsgfQorICAgIEVkZ2UgJm9wZXJhdG9yW10oTm9kZSAmTikgeworICAgICAgYXNzZXJ0KEVkZ2VJbmRleE1hcC5maW5kKCZOKSAhPSBFZGdlSW5kZXhNYXAuZW5kKCkgJiYgIk5vIHN1Y2ggZWRnZSEiKTsKKyAgICAgIGF1dG8gJkUgPSBFZGdlc1tFZGdlSW5kZXhNYXAuZmluZCgmTiktPnNlY29uZF07CisgICAgICBhc3NlcnQoRSAmJiAiRGVhZCBvciBudWxsIGVkZ2UhIik7CisgICAgICByZXR1cm4gRTsKKyAgICB9CisKKyAgICBFZGdlICpsb29rdXAoTm9kZSAmTikgeworICAgICAgYXV0byBFSSA9IEVkZ2VJbmRleE1hcC5maW5kKCZOKTsKKyAgICAgIGlmIChFSSA9PSBFZGdlSW5kZXhNYXAuZW5kKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgYXV0byAmRSA9IEVkZ2VzW0VJLT5zZWNvbmRdOworICAgICAgcmV0dXJuIEUgPyAmRSA6IG51bGxwdHI7CisgICAgfQorCisgICAgY2FsbF9pdGVyYXRvciBjYWxsX2JlZ2luKCkgeworICAgICAgcmV0dXJuIGNhbGxfaXRlcmF0b3IoRWRnZXMuYmVnaW4oKSwgRWRnZXMuZW5kKCkpOworICAgIH0KKyAgICBjYWxsX2l0ZXJhdG9yIGNhbGxfZW5kKCkgeyByZXR1cm4gY2FsbF9pdGVyYXRvcihFZGdlcy5lbmQoKSwgRWRnZXMuZW5kKCkpOyB9CisKKyAgICBpdGVyYXRvcl9yYW5nZTxjYWxsX2l0ZXJhdG9yPiBjYWxscygpIHsKKyAgICAgIHJldHVybiBtYWtlX3JhbmdlKGNhbGxfYmVnaW4oKSwgY2FsbF9lbmQoKSk7CisgICAgfQorCisgICAgYm9vbCBlbXB0eSgpIHsKKyAgICAgIGZvciAoYXV0byAmRSA6IEVkZ2VzKQorICAgICAgICBpZiAoRSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBwcml2YXRlOgorICAgIFZlY3RvclQgRWRnZXM7CisgICAgRGVuc2VNYXA8Tm9kZSAqLCBpbnQ+IEVkZ2VJbmRleE1hcDsKKworICAgIEVkZ2VTZXF1ZW5jZSgpID0gZGVmYXVsdDsKKworICAgIC8vLyBJbnRlcm5hbCBoZWxwZXIgdG8gaW5zZXJ0IGFuIGVkZ2UgdG8gYSBub2RlLgorICAgIHZvaWQgaW5zZXJ0RWRnZUludGVybmFsKE5vZGUgJkNoaWxkTiwgRWRnZTo6S2luZCBFSyk7CisKKyAgICAvLy8gSW50ZXJuYWwgaGVscGVyIHRvIGNoYW5nZSBhbiBlZGdlIGtpbmQuCisgICAgdm9pZCBzZXRFZGdlS2luZChOb2RlICZDaGlsZE4sIEVkZ2U6OktpbmQgRUspOworCisgICAgLy8vIEludGVybmFsIGhlbHBlciB0byByZW1vdmUgdGhlIGVkZ2UgdG8gdGhlIGdpdmVuIGZ1bmN0aW9uLgorICAgIGJvb2wgcmVtb3ZlRWRnZUludGVybmFsKE5vZGUgJkNoaWxkTik7CisKKyAgICAvLy8gSW50ZXJuYWwgaGVscGVyIHRvIHJlcGxhY2UgYW4gZWRnZSBrZXkgd2l0aCBhIG5ldyBvbmUuCisgICAgLy8vCisgICAgLy8vIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgZnVuY3Rpb24gZm9yIGEgcGFydGljdWxhciBub2RlIGluIHRoZQorICAgIC8vLyBncmFwaCBnZXRzIHJlcGxhY2VkIGFuZCB3ZSBhcmUgdXBkYXRpbmcgYWxsIG9mIHRoZSBlZGdlcyB0byB0aGF0IG5vZGUKKyAgICAvLy8gdG8gdXNlIHRoZSBuZXcgZnVuY3Rpb24gYXMgdGhlIGtleS4KKyAgICB2b2lkIHJlcGxhY2VFZGdlS2V5KEZ1bmN0aW9uICZPbGRUYXJnZXQsIEZ1bmN0aW9uICZOZXdUYXJnZXQpOworICB9OworCisgIC8vLyBBIG5vZGUgaW4gdGhlIGNhbGwgZ3JhcGguCisgIC8vLworICAvLy8gVGhpcyByZXByZXNlbnRzIGEgc2luZ2xlIG5vZGUuIEl0J3MgcHJpbWFyeSByb2xlcyBhcmUgdG8gY2FjaGUgdGhlIGxpc3Qgb2YKKyAgLy8vIGNhbGxlZXMsIGRlLWR1cGxpY2F0ZSBhbmQgcHJvdmlkZSBmYXN0IHRlc3Rpbmcgb2Ygd2hldGhlciBhIGZ1bmN0aW9uIGlzCisgIC8vLyBhIGNhbGxlZSwgYW5kIGZhY2lsaXRhdGUgaXRlcmF0aW9uIG9mIGNoaWxkIG5vZGVzIGluIHRoZSBncmFwaC4KKyAgLy8vCisgIC8vLyBUaGUgbm9kZSB3b3JrcyBtdWNoIGxpa2UgYW4gb3B0aW9uYWwgaW4gb3JkZXIgdG8gbGF6aWx5IHBvcHVsYXRlIHRoZQorICAvLy8gZWRnZXMgb2YgZWFjaCBub2RlLiBVbnRpbCBwb3B1bGF0ZWQsIHRoZXJlIGFyZSBubyBlZGdlcy4gT25jZSBwb3B1bGF0ZWQsCisgIC8vLyB5b3UgY2FuIGFjY2VzcyB0aGUgZWRnZXMgYnkgZGVyZWZlcmVuY2luZyB0aGUgbm9kZSBvciB1c2luZyB0aGUgYC0+YAorICAvLy8gb3BlcmF0b3IgYXMgaWYgdGhlIG5vZGUgd2FzIGFuIGBPcHRpb25hbDxFZGdlU2VxdWVuY2U+YC4KKyAgY2xhc3MgTm9kZSB7CisgICAgZnJpZW5kIGNsYXNzIExhenlDYWxsR3JhcGg7CisgICAgZnJpZW5kIGNsYXNzIExhenlDYWxsR3JhcGg6OlJlZlNDQzsKKworICBwdWJsaWM6CisgICAgTGF6eUNhbGxHcmFwaCAmZ2V0R3JhcGgoKSBjb25zdCB7IHJldHVybiAqRzsgfQorCisgICAgRnVuY3Rpb24gJmdldEZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gKkY7IH0KKworICAgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gRi0+Z2V0TmFtZSgpOyB9CisKKyAgICAvLy8gRXF1YWxpdHkgaXMgZGVmaW5lZCBhcyBhZGRyZXNzIGVxdWFsaXR5LgorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBOb2RlICZOKSBjb25zdCB7IHJldHVybiB0aGlzID09ICZOOyB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE5vZGUgJk4pIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KE4pOyB9CisKKyAgICAvLy8gVGVzdHMgd2hldGhlciB0aGUgbm9kZSBoYXMgYmVlbiBwb3B1bGF0ZWQgd2l0aCBlZGdlcy4KKyAgICBib29sIGlzUG9wdWxhdGVkKCkgY29uc3QgeyByZXR1cm4gRWRnZXMuaGFzVmFsdWUoKTsgfQorCisgICAgLy8vIFRlc3RzIHdoZXRoZXIgdGhpcyBpcyBhY3R1YWxseSBhIGRlYWQgbm9kZSBhbmQgbm8gbG9uZ2VyIHZhbGlkLgorICAgIC8vLworICAgIC8vLyBVc2VycyByYXJlbHkgaW50ZXJhY3Qgd2l0aCBub2RlcyBpbiB0aGlzIHN0YXRlIGFuZCBvdGhlciBtZXRob2RzIGFyZQorICAgIC8vLyBpbnZhbGlkLiBUaGlzIGlzIHVzZWQgdG8gbW9kZWwgYSBub2RlIGluIGFuIGVkZ2UgbGlzdCB3aGVyZSB0aGUKKyAgICAvLy8gZnVuY3Rpb24gaGFzIGJlZW4gY29tcGxldGVseSByZW1vdmVkLgorICAgIGJvb2wgaXNEZWFkKCkgY29uc3QgeworICAgICAgYXNzZXJ0KCFHID09ICFGICYmCisgICAgICAgICAgICAgIkJvdGggZ3JhcGggYW5kIGZ1bmN0aW9uIHBvaW50ZXJzIHNob3VsZCBiZSBudWxsIG9yIG5vbi1udWxsLiIpOworICAgICAgcmV0dXJuICFHOworICAgIH0KKworICAgIC8vIFdlIGFsbG93IGFjY2Vzc2luZyB0aGUgZWRnZXMgYnkgZGVyZWZlcmVuY2luZyBvciB1c2luZyB0aGUgYXJyb3cKKyAgICAvLyBvcGVyYXRvciwgZXNzZW50aWFsbHkgd3JhcHBpbmcgdGhlIGludGVybmFsIG9wdGlvbmFsLgorICAgIEVkZ2VTZXF1ZW5jZSAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgLy8gUmlwIGNvbnN0IG9mZiBiZWNhdXNlIHRoZSBub2RlIGl0c2VsZiBpc24ndCBjaGFuZ2luZyBoZXJlLgorICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RWRnZVNlcXVlbmNlICY+KCpFZGdlcyk7CisgICAgfQorICAgIEVkZ2VTZXF1ZW5jZSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYqKnRoaXM7IH0KKworICAgIC8vLyBQb3B1bGF0ZSB0aGUgZWRnZXMgb2YgdGhpcyBub2RlIGlmIG5lY2Vzc2FyeS4KKyAgICAvLy8KKyAgICAvLy8gVGhlIGZpcnN0IHRpbWUgdGhpcyBpcyBjYWxsZWQgaXQgd2lsbCBwb3B1bGF0ZSB0aGUgZWRnZXMgZm9yIHRoaXMgbm9kZQorICAgIC8vLyBpbiB0aGUgZ3JhcGguIEl0IGRvZXMgdGhpcyBieSBzY2FubmluZyB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiwgc28gb25jZQorICAgIC8vLyB0aGlzIGlzIGRvbmUsIGFueSBjaGFuZ2VzIHRvIHRoYXQgZnVuY3Rpb24gbXVzdCBiZSBleHBsaWNpdGx5IHJlZmxlY3RlZAorICAgIC8vLyBpbiB1cGRhdGVzIHRvIHRoZSBncmFwaC4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgdGhlIHBvcHVsYXRlZCBcYyBFZGdlU2VxdWVuY2UgdG8gc2ltcGxpZnkgd2Fsa2luZyBpdC4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyB3aWxsIG5vdCB1cGRhdGUgb3IgcmUtc2NhbiBhbnl0aGluZyBpZiBjYWxsZWQgcmVwZWF0ZWRseS4gSW5zdGVhZCwKKyAgICAvLy8gdGhlIGVkZ2Ugc2VxdWVuY2UgaXMgY2FjaGVkIGFuZCByZXR1cm5lZCBpbW1lZGlhdGVseSBvbiBzdWJzZXF1ZW50CisgICAgLy8vIGNhbGxzLgorICAgIEVkZ2VTZXF1ZW5jZSAmcG9wdWxhdGUoKSB7CisgICAgICBpZiAoRWRnZXMpCisgICAgICAgIHJldHVybiAqRWRnZXM7CisKKyAgICAgIHJldHVybiBwb3B1bGF0ZVNsb3coKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBMYXp5Q2FsbEdyYXBoICpHOworICAgIEZ1bmN0aW9uICpGOworCisgICAgLy8gV2UgcHJvdmlkZSBmb3IgdGhlIERGUyBudW1iZXJpbmcgYW5kIFRhcmphbiB3YWxrIGxvd2xpbmsgbnVtYmVycyB0byBiZQorICAgIC8vIHN0b3JlZCBkaXJlY3RseSB3aXRoaW4gdGhlIG5vZGUuIFRoZXNlIGFyZSBib3RoICctMScgd2hlbiBub2RlcyBhcmUgcGFydAorICAgIC8vIG9mIGFuIFNDQyAob3IgUmVmU0NDKSwgb3IgJzAnIHdoZW4gbm90IHlldCByZWFjaGVkIGluIGEgREZTIHdhbGsuCisgICAgaW50IERGU051bWJlciA9IDA7CisgICAgaW50IExvd0xpbmsgPSAwOworCisgICAgT3B0aW9uYWw8RWRnZVNlcXVlbmNlPiBFZGdlczsKKworICAgIC8vLyBCYXNpYyBjb25zdHJ1Y3RvciBpbXBsZW1lbnRzIHRoZSBzY2FubmluZyBvZiBGIGludG8gRWRnZXMgYW5kCisgICAgLy8vIEVkZ2VJbmRleE1hcC4KKyAgICBOb2RlKExhenlDYWxsR3JhcGggJkcsIEZ1bmN0aW9uICZGKSA6IEcoJkcpLCBGKCZGKSB7fQorCisgICAgLy8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBzY2FuIHdoZW4gcG9wdWxhdGluZy4KKyAgICBFZGdlU2VxdWVuY2UgJnBvcHVsYXRlU2xvdygpOworCisgICAgLy8vIEludGVybmFsIGhlbHBlciB0byBkaXJlY3RseSByZXBsYWNlIHRoZSBmdW5jdGlvbiB3aXRoIGEgbmV3IG9uZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyB1c2VkIHRvIGZhY2lsaXRhdGUgdHJhbmZzb3JtYXRpb25zIHdoaWNoIG5lZWQgdG8gcmVwbGFjZSB0aGUKKyAgICAvLy8gZm9ybWFsIEZ1bmN0aW9uIG9iamVjdCBidXQgZGlyZWN0bHkgbW92ZSB0aGUgYm9keSBhbmQgdXNlcnMgZnJvbSBvbmUgdG8KKyAgICAvLy8gdGhlIG90aGVyLgorICAgIHZvaWQgcmVwbGFjZUZ1bmN0aW9uKEZ1bmN0aW9uICZOZXdGKTsKKworICAgIHZvaWQgY2xlYXIoKSB7IEVkZ2VzLnJlc2V0KCk7IH0KKworICAgIC8vLyBQcmludCB0aGUgbmFtZSBvZiB0aGlzIG5vZGUncyBmdW5jdGlvbi4KKyAgICBmcmllbmQgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBOb2RlICZOKSB7CisgICAgICByZXR1cm4gT1MgPDwgTi5GLT5nZXROYW1lKCk7CisgICAgfQorCisgICAgLy8vIER1bXAgdGhlIG5hbWUgb2YgdGhpcyBub2RlJ3MgZnVuY3Rpb24gdG8gc3RkZXJyLgorICAgIHZvaWQgZHVtcCgpIGNvbnN0OworICB9OworCisgIC8vLyBBbiBTQ0Mgb2YgdGhlIGNhbGwgZ3JhcGguCisgIC8vLworICAvLy8gVGhpcyByZXByZXNlbnRzIGEgU3Ryb25nbHkgQ29ubmVjdGVkIENvbXBvbmVudCBvZiB0aGUgZGlyZWN0IGNhbGwgZ3JhcGgKKyAgLy8vIC0tIGlnbm9yaW5nIGluZGlyZWN0IGNhbGxzIGFuZCBmdW5jdGlvbiByZWZlcmVuY2VzLiBJdCBzdG9yZXMgdGhpcyBhcworICAvLy8gYSBjb2xsZWN0aW9uIG9mIGNhbGwgZ3JhcGggbm9kZXMuIFdoaWxlIHRoZSBvcmRlciBvZiBub2RlcyBpbiB0aGUgU0NDIGlzCisgIC8vLyBzdGFibGUsIGl0IGlzIG5vdCBhbnkgcGFydGljdWxhciBvcmRlci4KKyAgLy8vCisgIC8vLyBUaGUgU0NDcyBhcmUgbmVzdGVkIHdpdGhpbiBhIFxjIFJlZlNDQywgc2VlIGJlbG93IGZvciBkZXRhaWxzIGFib3V0IHRoYXQKKyAgLy8vIG91dGVyIHN0cnVjdHVyZS4gU0NDcyBkbyBub3Qgc3VwcG9ydCBtdXRhdGlvbiBvZiB0aGUgY2FsbCBncmFwaCwgdGhhdAorICAvLy8gbXVzdCBiZSBkb25lIHRocm91Z2ggdGhlIGNvbnRhaW5pbmcgXGMgUmVmU0NDIGluIG9yZGVyIHRvIGZ1bGx5IHJlYXNvbgorICAvLy8gYWJvdXQgdGhlIG9yZGVyaW5nIGFuZCBjb25uZWN0aW9ucyBvZiB0aGUgZ3JhcGguCisgIGNsYXNzIFNDQyB7CisgICAgZnJpZW5kIGNsYXNzIExhenlDYWxsR3JhcGg7CisgICAgZnJpZW5kIGNsYXNzIExhenlDYWxsR3JhcGg6Ok5vZGU7CisKKyAgICBSZWZTQ0MgKk91dGVyUmVmU0NDOworICAgIFNtYWxsVmVjdG9yPE5vZGUgKiwgMT4gTm9kZXM7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVJhbmdlVD4KKyAgICBTQ0MoUmVmU0NDICZPdXRlclJlZlNDQywgTm9kZVJhbmdlVCAmJk5vZGVzKQorICAgICAgICA6IE91dGVyUmVmU0NDKCZPdXRlclJlZlNDQyksIE5vZGVzKHN0ZDo6Zm9yd2FyZDxOb2RlUmFuZ2VUPihOb2RlcykpIHt9CisKKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgT3V0ZXJSZWZTQ0MgPSBudWxscHRyOworICAgICAgTm9kZXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvLy8gUHJpbnQgYSBzaG9ydCBkZXNjcnRpcHRpb24gdXNlZnVsIGZvciBkZWJ1Z2dpbmcgb3IgbG9nZ2luZy4KKyAgICAvLy8KKyAgICAvLy8gV2UgcHJpbnQgdGhlIGZ1bmN0aW9uIG5hbWVzIGluIHRoZSBTQ0Mgd3JhcHBlZCBpbiAnKCkncyBhbmQgc2tpcHBpbmcKKyAgICAvLy8gdGhlIG1pZGRsZSBmdW5jdGlvbnMgaWYgdGhlcmUgYXJlIGEgbGFyZ2UgbnVtYmVyLgorICAgIC8vCisgICAgLy8gTm90ZTogdGhpcyBpcyBkZWZpbmVkIGlubGluZSB0byBkb2RnZSBpc3N1ZXMgd2l0aCBHQ0MncyBpbnRlcnByZXRhdGlvbgorICAgIC8vIG9mIGVuY2xvc2luZyBuYW1lc3BhY2VzIGZvciBmcmllbmQgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgorICAgIGZyaWVuZCByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFNDQyAmQykgeworICAgICAgT1MgPDwgJygnOworICAgICAgaW50IGkgPSAwOworICAgICAgZm9yIChMYXp5Q2FsbEdyYXBoOjpOb2RlICZOIDogQykgeworICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgT1MgPDwgIiwgIjsKKyAgICAgICAgLy8gRWxpZGUgdGhlIGlubmVyIGVsZW1lbnRzIGlmIHRoZXJlIGFyZSB0b28gbWFueS4KKyAgICAgICAgaWYgKGkgPiA4KSB7CisgICAgICAgICAgT1MgPDwgIi4uLiwgIiA8PCAqQy5Ob2Rlcy5iYWNrKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgT1MgPDwgTjsKKyAgICAgICAgKytpOworICAgICAgfQorICAgICAgT1MgPDwgJyknOworICAgICAgcmV0dXJuIE9TOworICAgIH0KKworICAgIC8vLyBEdW1wIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhpcyBTQ0MgdG8gc3RkZXJyLgorICAgIHZvaWQgZHVtcCgpIGNvbnN0OworCisjaWZuZGVmIE5ERUJVRworICAgIC8vLyBWZXJpZnkgaW52YXJpYW50cyBhYm91dCB0aGUgU0NDLgorICAgIC8vLworICAgIC8vLyBUaGlzIHdpbGwgYXR0ZW1wdCB0byB2YWxpZGF0ZSBhbGwgb2YgdGhlIGJhc2ljIGludmFyaWFudHMgd2l0aGluIGFuCisgICAgLy8vIFNDQywgYnV0IG5vdCB0aGF0IGl0IGlzIGEgc3Ryb25nbHkgY29ubmVjdGVkIGNvbXBvbmV0IHBlci1zZS4gUHJpbWFyaWx5CisgICAgLy8vIHVzZWZ1bCB3aGlsZSBidWlsZGluZyBhbmQgdXBkYXRpbmcgdGhlIGdyYXBoIHRvIGNoZWNrIHRoYXQgYmFzaWMKKyAgICAvLy8gcHJvcGVydGllcyBhcmUgaW4gcGxhY2UgcmF0aGVyIHRoYW4gaGF2aW5nIGluZXhwbGljYWJsZSBjcmFzaGVzIGxhdGVyLgorICAgIHZvaWQgdmVyaWZ5KCk7CisjZW5kaWYKKworICBwdWJsaWM6CisgICAgdXNpbmcgaXRlcmF0b3IgPSBwb2ludGVlX2l0ZXJhdG9yPFNtYWxsVmVjdG9ySW1wbDxOb2RlICo+Ojpjb25zdF9pdGVyYXRvcj47CisKKyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIE5vZGVzLmJlZ2luKCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBOb2Rlcy5lbmQoKTsgfQorCisgICAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBOb2Rlcy5zaXplKCk7IH0KKworICAgIFJlZlNDQyAmZ2V0T3V0ZXJSZWZTQ0MoKSBjb25zdCB7IHJldHVybiAqT3V0ZXJSZWZTQ0M7IH0KKworICAgIC8vLyBUZXN0IGlmIHRoaXMgU0NDIGlzIGEgcGFyZW50IG9mIFxhIEMuCisgICAgLy8vCisgICAgLy8vIE5vdGUgdGhhdCB0aGlzIGlzIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mIGVkZ2VzIGRlcGFydGluZyB0aGUgY3VycmVudAorICAgIC8vLyBTQ0MuCisgICAgYm9vbCBpc1BhcmVudE9mKGNvbnN0IFNDQyAmQykgY29uc3Q7CisKKyAgICAvLy8gVGVzdCBpZiB0aGlzIFNDQyBpcyBhbiBhbmNlc3RvciBvZiBcYSBDLgorICAgIC8vLworICAgIC8vLyBOb3RlIHRoYXQgaW4gdGhlIHdvcnN0IGNhc2UgdGhpcyBpcyBsaW5lYXIgaW4gdGhlIG51bWJlciBvZiBlZGdlcworICAgIC8vLyBkZXBhcnRpbmcgdGhlIGN1cnJlbnQgU0NDIGFuZCBldmVyeSBTQ0MgaW4gdGhlIGVudGlyZSBncmFwaCByZWFjaGFibGUKKyAgICAvLy8gZnJvbSB0aGlzIFNDQy4gVGh1cyB0aGlzIHZlcnkgd2VsbCBtYXkgd2FsayBldmVyeSBlZGdlIGluIHRoZSBlbnRpcmUKKyAgICAvLy8gY2FsbCBncmFwaCEgRG8gbm90IGNhbGwgdGhpcyBpbiBhIHRpZ2h0IGxvb3AhCisgICAgYm9vbCBpc0FuY2VzdG9yT2YoY29uc3QgU0NDICZDKSBjb25zdDsKKworICAgIC8vLyBUZXN0IGlmIHRoaXMgU0NDIGlzIGEgY2hpbGQgb2YgXGEgQy4KKyAgICAvLy8KKyAgICAvLy8gU2VlIHRoZSBjb21tZW50cyBmb3IgXGMgaXNQYXJlbnRPZiBmb3IgZGV0YWlsZWQgbm90ZXMgYWJvdXQgdGhlCisgICAgLy8vIGNvbXBsZXhpdHkgb2YgdGhpcyByb3V0aW5lLgorICAgIGJvb2wgaXNDaGlsZE9mKGNvbnN0IFNDQyAmQykgY29uc3QgeyByZXR1cm4gQy5pc1BhcmVudE9mKCp0aGlzKTsgfQorCisgICAgLy8vIFRlc3QgaWYgdGhpcyBTQ0MgaXMgYSBkZXNjZW5kYW50IG9mIFxhIEMuCisgICAgLy8vCisgICAgLy8vIFNlZSB0aGUgY29tbWVudHMgZm9yIFxjIGlzUGFyZW50T2YgZm9yIGRldGFpbGVkIG5vdGVzIGFib3V0IHRoZQorICAgIC8vLyBjb21wbGV4aXR5IG9mIHRoaXMgcm91dGluZS4KKyAgICBib29sIGlzRGVzY2VuZGFudE9mKGNvbnN0IFNDQyAmQykgY29uc3QgeyByZXR1cm4gQy5pc0FuY2VzdG9yT2YoKnRoaXMpOyB9CisKKyAgICAvLy8gUHJvdmlkZSBhIHNob3J0IG5hbWUgYnkgcHJpbnRpbmcgdGhpcyBTQ0MgdG8gYSBzdGQ6OnN0cmluZy4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBjb3BlcyB3aXRoIHRoZSBmYWN0IHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIG5hbWUgcGVyLXNlIGZvciBhbiBTQ0MKKyAgICAvLy8gd2hpbGUgc3RpbGwgbWFraW5nIHRoZSB1c2Ugb2YgdGhpcyBpbiBkZWJ1Z2dpbmcgYW5kIGxvZ2dpbmcgdXNlZnVsLgorICAgIHN0ZDo6c3RyaW5nIGdldE5hbWUoKSBjb25zdCB7CisgICAgICBzdGQ6OnN0cmluZyBOYW1lOworICAgICAgcmF3X3N0cmluZ19vc3RyZWFtIE9TKE5hbWUpOworICAgICAgT1MgPDwgKnRoaXM7CisgICAgICBPUy5mbHVzaCgpOworICAgICAgcmV0dXJuIE5hbWU7CisgICAgfQorICB9OworCisgIC8vLyBBIFJlZlNDQyBvZiB0aGUgY2FsbCBncmFwaC4KKyAgLy8vCisgIC8vLyBUaGlzIG1vZGVscyBhIFN0cm9uZ2x5IENvbm5lY3RlZCBDb21wb25lbnQgb2YgZnVuY3Rpb24gcmVmZXJlbmNlIGVkZ2VzIGluCisgIC8vLyB0aGUgY2FsbCBncmFwaC4gQXMgb3Bwb3NlZCB0byBhY3R1YWwgU0NDcywgdGhlc2UgY2FuIGJlIHVzZWQgdG8gc2NvcGUKKyAgLy8vIHN1YmdyYXBocyBvZiB0aGUgbW9kdWxlIHdoaWNoIGFyZSBpbmRlcGVuZGVudCBmcm9tIG90aGVyIHN1YmdyYXBocyBvZiB0aGUKKyAgLy8vIG1vZHVsZSBiZWNhdXNlIHRoZXkgZG8gbm90IHJlZmVyZW5jZSBpdCBpbiBhbnkgd2F5LiBUaGlzIGlzIGFsc28gdGhlIHVuaXQKKyAgLy8vIHdoZXJlIHdlIGRvIG11dGF0aW9uIG9mIHRoZSBncmFwaCBpbiBvcmRlciB0byByZXN0cmljdCBtdXRhdGlvbnMgdG8gdGhvc2UKKyAgLy8vIHdoaWNoIGRvbid0IHZpb2xhdGUgdGhpcyBpbmRlcGVuZGVuY2UuCisgIC8vLworICAvLy8gQSBSZWZTQ0MgY29udGFpbnMgYSBEQUcgb2YgYWN0dWFsIFNDQ3MuIEFsbCB0aGUgbm9kZXMgd2l0aGluIHRoZSBSZWZTQ0MKKyAgLy8vIGFyZSBuZWNlc3NhcmlseSB3aXRoaW4gc29tZSBhY3R1YWwgU0NDIHRoYXQgbmVzdHMgd2l0aGluIGl0LiBTaW5jZQorICAvLy8gYSBkaXJlY3QgY2FsbCAqaXMqIGEgcmVmZXJlbmNlLCB0aGVyZSB3aWxsIGFsd2F5cyBiZSBhdCBsZWFzdCBvbmUgUmVmU0NDCisgIC8vLyBhcm91bmQgYW55IFNDQy4KKyAgY2xhc3MgUmVmU0NDIHsKKyAgICBmcmllbmQgY2xhc3MgTGF6eUNhbGxHcmFwaDsKKyAgICBmcmllbmQgY2xhc3MgTGF6eUNhbGxHcmFwaDo6Tm9kZTsKKworICAgIExhenlDYWxsR3JhcGggKkc7CisKKyAgICAvLy8gQSBwb3N0b3JkZXIgbGlzdCBvZiB0aGUgaW5uZXIgU0NDcy4KKyAgICBTbWFsbFZlY3RvcjxTQ0MgKiwgND4gU0NDczsKKworICAgIC8vLyBBIG1hcCBmcm9tIFNDQyB0byBpbmRleCBpbiB0aGUgcG9zdG9yZGVyIGxpc3QuCisgICAgU21hbGxEZW5zZU1hcDxTQ0MgKiwgaW50LCA0PiBTQ0NJbmRpY2VzOworCisgICAgLy8vIEZhc3QtcGF0aCBjb25zdHJ1Y3Rvci4gUmVmU0NDcyBzaG91bGQgaW5zdGVhZCBiZSBjb25zdHJ1Y3RlZCBieSBjYWxsaW5nCisgICAgLy8vIGZvcm1SZWZTQ0NGYXN0IG9uIHRoZSBncmFwaCBpdHNlbGYuCisgICAgUmVmU0NDKExhenlDYWxsR3JhcGggJkcpOworCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgIFNDQ3MuY2xlYXIoKTsKKyAgICAgIFNDQ0luZGljZXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvLy8gUHJpbnQgYSBzaG9ydCBkZXNjcmlwdGlvbiB1c2VmdWwgZm9yIGRlYnVnZ2luZyBvciBsb2dnaW5nLgorICAgIC8vLworICAgIC8vLyBXZSBwcmludCB0aGUgU0NDcyB3cmFwcGVkIGluICdbXSdzIGFuZCBza2lwcGluZyB0aGUgbWlkZGxlIFNDQ3MgaWYKKyAgICAvLy8gdGhlcmUgYXJlIGEgbGFyZ2UgbnVtYmVyLgorICAgIC8vCisgICAgLy8gTm90ZTogdGhpcyBpcyBkZWZpbmVkIGlubGluZSB0byBkb2RnZSBpc3N1ZXMgd2l0aCBHQ0MncyBpbnRlcnByZXRhdGlvbgorICAgIC8vIG9mIGVuY2xvc2luZyBuYW1lc3BhY2VzIGZvciBmcmllbmQgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgorICAgIGZyaWVuZCByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFJlZlNDQyAmUkMpIHsKKyAgICAgIE9TIDw8ICdbJzsKKyAgICAgIGludCBpID0gMDsKKyAgICAgIGZvciAoTGF6eUNhbGxHcmFwaDo6U0NDICZDIDogUkMpIHsKKyAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgIE9TIDw8ICIsICI7CisgICAgICAgIC8vIEVsaWRlIHRoZSBpbm5lciBlbGVtZW50cyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkuCisgICAgICAgIGlmIChpID4gNCkgeworICAgICAgICAgIE9TIDw8ICIuLi4sICIgPDwgKlJDLlNDQ3MuYmFjaygpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIE9TIDw8IEM7CisgICAgICAgICsraTsKKyAgICAgIH0KKyAgICAgIE9TIDw8ICddJzsKKyAgICAgIHJldHVybiBPUzsKKyAgICB9CisKKyAgICAvLy8gRHVtcCBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoaXMgUmVmU0NDIHRvIHN0ZGVyci4KKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKworI2lmbmRlZiBOREVCVUcKKyAgICAvLy8gVmVyaWZ5IGludmFyaWFudHMgYWJvdXQgdGhlIFJlZlNDQyBhbmQgYWxsIGl0cyBTQ0NzLgorICAgIC8vLworICAgIC8vLyBUaGlzIHdpbGwgYXR0ZW1wdCB0byB2YWxpZGF0ZSBhbGwgb2YgdGhlIGludmFyaWFudHMgKndpdGhpbiogdGhlCisgICAgLy8vIFJlZlNDQywgYnV0IG5vdCB0aGF0IGl0IGlzIGEgc3Ryb25nbHkgY29ubmVjdGVkIGNvbXBvbmVudCBvZiB0aGUgbGFyZ2VyCisgICAgLy8vIGdyYXBoLiBUaGlzIG1ha2VzIGl0IHVzZWZ1bCBldmVuIHdoZW4gcGFydGlhbGx5IHRocm91Z2ggYW4gdXBkYXRlLgorICAgIC8vLworICAgIC8vLyBJbnZhcmlhbnRzIGNoZWNrZWQ6CisgICAgLy8vIC0gU0NDcyBhbmQgdGhlaXIgaW5kaWNlcyBtYXRjaC4KKyAgICAvLy8gLSBUaGUgU0NDcyBsaXN0IGlzIGluIGZhY3QgaW4gcG9zdC1vcmRlci4KKyAgICB2b2lkIHZlcmlmeSgpOworI2VuZGlmCisKKyAgICAvLy8gSGFuZGxlIGFueSBuZWNlc3NhcnkgcGFyZW50IHNldCB1cGRhdGVzIGFmdGVyIGluc2VydGluZyBhIHRyaXZpYWwgcmVmCisgICAgLy8vIG9yIGNhbGwgZWRnZS4KKyAgICB2b2lkIGhhbmRsZVRyaXZpYWxFZGdlSW5zZXJ0aW9uKE5vZGUgJlNvdXJjZU4sIE5vZGUgJlRhcmdldE4pOworCisgIHB1YmxpYzoKKyAgICB1c2luZyBpdGVyYXRvciA9IHBvaW50ZWVfaXRlcmF0b3I8U21hbGxWZWN0b3JJbXBsPFNDQyAqPjo6Y29uc3RfaXRlcmF0b3I+OworICAgIHVzaW5nIHJhbmdlID0gaXRlcmF0b3JfcmFuZ2U8aXRlcmF0b3I+OworICAgIHVzaW5nIHBhcmVudF9pdGVyYXRvciA9CisgICAgICAgIHBvaW50ZWVfaXRlcmF0b3I8U21hbGxQdHJTZXRJbXBsPFJlZlNDQyAqPjo6Y29uc3RfaXRlcmF0b3I+OworCisgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBTQ0NzLmJlZ2luKCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBTQ0NzLmVuZCgpOyB9CisKKyAgICBzc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBTQ0NzLnNpemUoKTsgfQorCisgICAgU0NDICZvcGVyYXRvcltdKGludCBJZHgpIHsgcmV0dXJuICpTQ0NzW0lkeF07IH0KKworICAgIGl0ZXJhdG9yIGZpbmQoU0NDICZDKSBjb25zdCB7CisgICAgICByZXR1cm4gU0NDcy5iZWdpbigpICsgU0NDSW5kaWNlcy5maW5kKCZDKS0+c2Vjb25kOworICAgIH0KKworICAgIC8vLyBUZXN0IGlmIHRoaXMgUmVmU0NDIGlzIGEgcGFyZW50IG9mIFxhIFJDLgorICAgIC8vLworICAgIC8vLyBDQVVUSU9OOiBUaGlzIG1ldGhvZCB3YWxrcyBldmVyeSBlZGdlIGluIHRoZSBcYyBSZWZTQ0MsIGl0IGNhbiBiZSB2ZXJ5CisgICAgLy8vIGV4cGVuc2l2ZS4KKyAgICBib29sIGlzUGFyZW50T2YoY29uc3QgUmVmU0NDICZSQykgY29uc3Q7CisKKyAgICAvLy8gVGVzdCBpZiB0aGlzIFJlZlNDQyBpcyBhbiBhbmNlc3RvciBvZiBcYSBSQy4KKyAgICAvLy8KKyAgICAvLy8gQ0FVVElPTjogVGhpcyBtZXRob2Qgd2Fsa3MgdGhlIGRpcmVjdGVkIGdyYXBoIG9mIGVkZ2VzIGFzIGZhciBhcworICAgIC8vLyBuZWNlc3NhcnkgdG8gZmluZCBhIHBvc3NpYmxlIHBhdGggdG8gdGhlIGFyZ3VtZW50LiBJbiB0aGUgd29yc3QgY2FzZQorICAgIC8vLyB0aGlzIG1heSB3YWxrIHRoZSBlbnRpcmUgZ3JhcGggYW5kIGNhbiBiZSBleHRyZW1lbHkgZXhwZW5zaXZlLgorICAgIGJvb2wgaXNBbmNlc3Rvck9mKGNvbnN0IFJlZlNDQyAmUkMpIGNvbnN0OworCisgICAgLy8vIFRlc3QgaWYgdGhpcyBSZWZTQ0MgaXMgYSBjaGlsZCBvZiBcYSBSQy4KKyAgICAvLy8KKyAgICAvLy8gQ0FVVElPTjogVGhpcyBtZXRob2Qgd2Fsa3MgZXZlcnkgZWRnZSBpbiB0aGUgYXJndW1lbnQgXGMgUmVmU0NDLCBpdCBjYW4KKyAgICAvLy8gYmUgdmVyeSBleHBlbnNpdmUuCisgICAgYm9vbCBpc0NoaWxkT2YoY29uc3QgUmVmU0NDICZSQykgY29uc3QgeyByZXR1cm4gUkMuaXNQYXJlbnRPZigqdGhpcyk7IH0KKworICAgIC8vLyBUZXN0IGlmIHRoaXMgUmVmU0NDIGlzIGEgZGVzY2VuZGFudCBvZiBcYSBSQy4KKyAgICAvLy8KKyAgICAvLy8gQ0FVVElPTjogVGhpcyBtZXRob2Qgd2Fsa3MgdGhlIGRpcmVjdGVkIGdyYXBoIG9mIGVkZ2VzIGFzIGZhciBhcworICAgIC8vLyBuZWNlc3NhcnkgdG8gZmluZCBhIHBvc3NpYmxlIHBhdGggZnJvbSB0aGUgYXJndW1lbnQuIEluIHRoZSB3b3JzdCBjYXNlCisgICAgLy8vIHRoaXMgbWF5IHdhbGsgdGhlIGVudGlyZSBncmFwaCBhbmQgY2FuIGJlIGV4dHJlbWVseSBleHBlbnNpdmUuCisgICAgYm9vbCBpc0Rlc2NlbmRhbnRPZihjb25zdCBSZWZTQ0MgJlJDKSBjb25zdCB7CisgICAgICByZXR1cm4gUkMuaXNBbmNlc3Rvck9mKCp0aGlzKTsKKyAgICB9CisKKyAgICAvLy8gUHJvdmlkZSBhIHNob3J0IG5hbWUgYnkgcHJpbnRpbmcgdGhpcyBSZWZTQ0MgdG8gYSBzdGQ6OnN0cmluZy4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBjb3BlcyB3aXRoIHRoZSBmYWN0IHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIG5hbWUgcGVyLXNlIGZvciBhbiBSZWZTQ0MKKyAgICAvLy8gd2hpbGUgc3RpbGwgbWFraW5nIHRoZSB1c2Ugb2YgdGhpcyBpbiBkZWJ1Z2dpbmcgYW5kIGxvZ2dpbmcgdXNlZnVsLgorICAgIHN0ZDo6c3RyaW5nIGdldE5hbWUoKSBjb25zdCB7CisgICAgICBzdGQ6OnN0cmluZyBOYW1lOworICAgICAgcmF3X3N0cmluZ19vc3RyZWFtIE9TKE5hbWUpOworICAgICAgT1MgPDwgKnRoaXM7CisgICAgICBPUy5mbHVzaCgpOworICAgICAgcmV0dXJuIE5hbWU7CisgICAgfQorCisgICAgLy8vQHsKKyAgICAvLy8gXG5hbWUgTXV0YXRpb24gQVBJCisgICAgLy8vCisgICAgLy8vIFRoZXNlIG1ldGhvZHMgcHJvdmlkZSB0aGUgY29yZSBBUEkgZm9yIHVwZGF0aW5nIHRoZSBjYWxsIGdyYXBoIGluIHRoZQorICAgIC8vLyBwcmVzZW5jZSBvZiAocG90ZW50aWFsbHkgc3RpbGwgaW4tZmxpZ2h0KSBERlMtZm91bmQgUmVmU0NDcyBhbmQgU0NDcy4KKyAgICAvLy8KKyAgICAvLy8gTm90ZSB0aGF0IHRoZXNlIG1ldGhvZHMgc29tZXRpbWVzIGhhdmUgY29tcGxleCBydW50aW1lcywgc28gYmUgY2FyZWZ1bAorICAgIC8vLyBob3cgeW91IGNhbGwgdGhlbS4KKworICAgIC8vLyBNYWtlIGFuIGV4aXN0aW5nIGludGVybmFsIHJlZiBlZGdlIGludG8gYSBjYWxsIGVkZ2UuCisgICAgLy8vCisgICAgLy8vIFRoaXMgbWF5IGZvcm0gYSBsYXJnZXIgY3ljbGUgYW5kIHRodXMgY29sbGFwc2UgU0NDcyBpbnRvIFRhcmdldE4ncyBTQ0MuCisgICAgLy8vIElmIHRoYXQgaGFwcGVucywgdGhlIG9wdGlvbmFsIGNhbGxiYWNrIFxwIE1lcmdlZENCIHdpbGwgYmUgaW52b2tlZCAoaWYKKyAgICAvLy8gcHJvdmlkZWQpIG9uIHRoZSBTQ0NzIGJlaW5nIG1lcmdlZCBhd2F5IHByaW9yIHRvIGFjdHVhbGx5IHBlcmZvcm1pbmcKKyAgICAvLy8gdGhlIG1lcmdlLiBOb3RlIHRoYXQgdGhpcyB3aWxsIG5ldmVyIGluY2x1ZGUgdGhlIHRhcmdldCBTQ0MgYXMgdGhhdAorICAgIC8vLyB3aWxsIGJlIHRoZSBTQ0MgZnVuY3Rpb25zIGFyZSBtZXJnZWQgaW50byB0byByZXNvbHZlIHRoZSBjeWNsZS4gT25jZQorICAgIC8vLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMsIHRoZXNlIG1lcmdlZCBTQ0NzIGFyZSBub3QgaW4gYSB2YWxpZCBzdGF0ZSBidXQKKyAgICAvLy8gdGhlIHBvaW50ZXJzIHdpbGwgcmVtYWluIHZhbGlkIHVudGlsIGRlc3RydWN0aW9uIG9mIHRoZSBwYXJlbnQgZ3JhcGgKKyAgICAvLy8gaW5zdGFuY2UgZm9yIHRoZSBwdXJwb3NlIG9mIGNsZWFyaW5nIGNhY2hlZCBpbmZvcm1hdGlvbi4gVGhpcyBmdW5jdGlvbgorICAgIC8vLyBhbHNvIHJldHVybnMgJ3RydWUnIGlmIGEgY3ljbGUgd2FzIGZvcm1lZCBhbmQgc29tZSBTQ0NzIG1lcmdlZCBhd2F5IGFzCisgICAgLy8vIGEgY29udmVuaWVuY2UuCisgICAgLy8vCisgICAgLy8vIEFmdGVyIHRoaXMgb3BlcmF0aW9uLCBib3RoIFNvdXJjZU4ncyBTQ0MgYW5kIFRhcmdldE4ncyBTQ0MgbWF5IG1vdmUKKyAgICAvLy8gcG9zaXRpb24gd2l0aGluIHRoaXMgUmVmU0NDJ3MgcG9zdG9yZGVyIGxpc3QuIEFueSBTQ0NzIG1lcmdlZCBhcmUKKyAgICAvLy8gbWVyZ2VkIGludG8gdGhlIFRhcmdldE4ncyBTQ0MgaW4gb3JkZXIgdG8gcHJlc2VydmUgcmVhY2hhYmlsaXR5IGFuYWx5c2VzCisgICAgLy8vIHdoaWNoIHRvb2sgcGxhY2Ugb24gdGhhdCBTQ0MuCisgICAgYm9vbCBzd2l0Y2hJbnRlcm5hbEVkZ2VUb0NhbGwoCisgICAgICAgIE5vZGUgJlNvdXJjZU4sIE5vZGUgJlRhcmdldE4sCisgICAgICAgIGZ1bmN0aW9uX3JlZjx2b2lkKEFycmF5UmVmPFNDQyAqPiBNZXJnZWRTQ0NzKT4gTWVyZ2VDQiA9IHt9KTsKKworICAgIC8vLyBNYWtlIGFuIGV4aXN0aW5nIGludGVybmFsIGNhbGwgZWRnZSBiZXR3ZWVuIHNlcGFyYXRlIFNDQ3MgaW50byBhIHJlZgorICAgIC8vLyBlZGdlLgorICAgIC8vLworICAgIC8vLyBJZiBTb3VyY2VOIGFuZCBUYXJnZXROIGluIHNlcGFyYXRlIFNDQ3Mgd2l0aGluIHRoaXMgUmVmU0NDLCBjaGFuZ2luZworICAgIC8vLyB0aGUgY2FsbCBlZGdlIGJldHdlZW4gdGhlbSB0byBhIHJlZiBlZGdlIGlzIGEgdHJpdmlhbCBvcGVyYXRpb24gdGhhdAorICAgIC8vLyBkb2VzIG5vdCByZXF1aXJlIGFueSBzdHJ1Y3R1cmFsIGNoYW5nZXMgdG8gdGhlIGNhbGwgZ3JhcGguCisgICAgdm9pZCBzd2l0Y2hUcml2aWFsSW50ZXJuYWxFZGdlVG9SZWYoTm9kZSAmU291cmNlTiwgTm9kZSAmVGFyZ2V0Tik7CisKKyAgICAvLy8gTWFrZSBhbiBleGlzdGluZyBpbnRlcm5hbCBjYWxsIGVkZ2Ugd2l0aGluIGEgc2luZ2xlIFNDQyBpbnRvIGEgcmVmCisgICAgLy8vIGVkZ2UuCisgICAgLy8vCisgICAgLy8vIFNpbmNlIFNvdXJjZU4gYW5kIFRhcmdldE4gYXJlIHBhcnQgb2YgYSBzaW5nbGUgU0NDLCB0aGlzIFNDQyBtYXkgYmUKKyAgICAvLy8gc3BsaXQgdXAgZHVlIHRvIGJyZWFraW5nIGEgY3ljbGUgaW4gdGhlIGNhbGwgZWRnZXMgdGhhdCBmb3JtZWQgaXQuIElmCisgICAgLy8vIHRoYXQgaGFwcGVucywgdGhlbiB0aGlzIHJvdXRpbmUgd2lsbCBpbnNlcnQgbmV3IFNDQ3MgaW50byB0aGUgcG9zdG9yZGVyCisgICAgLy8vIGxpc3QgKmJlZm9yZSogdGhlIFNDQyBvZiBUYXJnZXROIChwcmV2aW91c2x5IHRoZSBTQ0Mgb2YgYm90aCkuIFRoaXMKKyAgICAvLy8gcHJlc2VydmVzIHBvc3RvcmRlciBhcyB0aGUgVGFyZ2V0TiBjYW4gcmVhY2ggYWxsIG9mIHRoZSBvdGhlciBub2RlcyBieQorICAgIC8vLyBkZWZpbml0aW9uIG9mIHByZXZpb3VzbHkgYmVpbmcgaW4gYSBzaW5nbGUgU0NDIGZvcm1lZCBieSB0aGUgY3ljbGUgZnJvbQorICAgIC8vLyBTb3VyY2VOIHRvIFRhcmdldE4uCisgICAgLy8vCisgICAgLy8vIFRoZSBuZXdseSBhZGRlZCBTQ0NzIGFyZSBhZGRlZCAqaW1tZWRpYXRlbHkqIGFuZCBjb250aWd1b3VzbHkKKyAgICAvLy8gcHJpb3IgdG8gdGhlIFRhcmdldE4gU0NDIGFuZCByZXR1cm4gdGhlIHJhbmdlIGNvdmVyaW5nIHRoZSBuZXcgU0NDcyBpbgorICAgIC8vLyB0aGUgUmVmU0NDJ3MgcG9zdG9yZGVyIHNlcXVlbmNlLiBZb3UgY2FuIGRpcmVjdGx5IGl0ZXJhdGUgdGhlIHJldHVybmVkCisgICAgLy8vIHJhbmdlIHRvIG9ic2VydmUgYWxsIG9mIHRoZSBuZXcgU0NDcyBpbiBwb3N0b3JkZXIuCisgICAgLy8vCisgICAgLy8vIE5vdGUgdGhhdCBpZiBTb3VyY2VOIGFuZCBUYXJnZXROIGFyZSBpbiBzZXBhcmF0ZSBTQ0NzLCB0aGUgc2ltcGxlcgorICAgIC8vLyByb3V0aW5lIGBzd2l0Y2hUcml2aWFsSW50ZXJuYWxFZGdlVG9SZWZgIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCisgICAgaXRlcmF0b3JfcmFuZ2U8aXRlcmF0b3I+IHN3aXRjaEludGVybmFsRWRnZVRvUmVmKE5vZGUgJlNvdXJjZU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgJlRhcmdldE4pOworCisgICAgLy8vIE1ha2UgYW4gZXhpc3Rpbmcgb3V0Z29pbmcgcmVmIGVkZ2UgaW50byBhIGNhbGwgZWRnZS4KKyAgICAvLy8KKyAgICAvLy8gTm90ZSB0aGF0IHRoaXMgaXMgdHJpdmlhbCBhcyB0aGVyZSBhcmUgbm8gY3ljbGljIGltcGFjdHMgYW5kIHRoZXJlCisgICAgLy8vIHJlbWFpbnMgYSByZWZlcmVuY2UgZWRnZS4KKyAgICB2b2lkIHN3aXRjaE91dGdvaW5nRWRnZVRvQ2FsbChOb2RlICZTb3VyY2VOLCBOb2RlICZUYXJnZXROKTsKKworICAgIC8vLyBNYWtlIGFuIGV4aXN0aW5nIG91dGdvaW5nIGNhbGwgZWRnZSBpbnRvIGEgcmVmIGVkZ2UuCisgICAgLy8vCisgICAgLy8vIFRoaXMgaXMgdHJpdmlhbCBhcyB0aGVyZSBhcmUgbm8gY3ljbGljIGltcGFjdHMgYW5kIHRoZXJlIHJlbWFpbnMKKyAgICAvLy8gYSByZWZlcmVuY2UgZWRnZS4KKyAgICB2b2lkIHN3aXRjaE91dGdvaW5nRWRnZVRvUmVmKE5vZGUgJlNvdXJjZU4sIE5vZGUgJlRhcmdldE4pOworCisgICAgLy8vIEluc2VydCBhIHJlZiBlZGdlIGZyb20gb25lIG5vZGUgaW4gdGhpcyBSZWZTQ0MgdG8gYW5vdGhlciBpbiB0aGlzCisgICAgLy8vIFJlZlNDQy4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyBhbHdheXMgYSB0cml2aWFsIG9wZXJhdGlvbiBhcyBpdCBkb2Vzbid0IGNoYW5nZSBhbnkgcGFydCBvZiB0aGUKKyAgICAvLy8gZ3JhcGggc3RydWN0dXJlIGJlc2lkZXMgY29ubmVjdGluZyB0aGUgdHdvIG5vZGVzLgorICAgIC8vLworICAgIC8vLyBOb3RlIHRoYXQgd2UgZG9uJ3Qgc3VwcG9ydCBkaXJlY3RseSBpbnNlcnRpbmcgaW50ZXJuYWwgKmNhbGwqIGVkZ2VzCisgICAgLy8vIGJlY2F1c2UgdGhhdCBjb3VsZCBjaGFuZ2UgdGhlIGdyYXBoIHN0cnVjdHVyZSBhbmQgcmVxdWlyZXMgcmV0dXJuaW5nCisgICAgLy8vIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYmVjYW1lIGludmFsaWQuIEFzIGEgY29uc2VxdWVuY2UsIHRoZSBwYXR0ZXJuCisgICAgLy8vIHNob3VsZCBiZSB0byBmaXJzdCBpbnNlcnQgdGhlIG5lY2Vzc2FyeSByZWYgZWRnZSwgYW5kIHRoZW4gdG8gc3dpdGNoIGl0CisgICAgLy8vIHRvIGEgY2FsbCBlZGdlIGlmIG5lZWRlZCBhbmQgaGFuZGxlIGFueSBpbnZhbGlkYXRpb24gdGhhdCByZXN1bHRzLiBTZWUKKyAgICAvLy8gdGhlIFxjIHN3aXRjaEludGVybmFsRWRnZVRvQ2FsbCByb3V0aW5lIGZvciBkZXRhaWxzLgorICAgIHZvaWQgaW5zZXJ0SW50ZXJuYWxSZWZFZGdlKE5vZGUgJlNvdXJjZU4sIE5vZGUgJlRhcmdldE4pOworCisgICAgLy8vIEluc2VydCBhbiBlZGdlIHdob3NlIHBhcmVudCBpcyBpbiB0aGlzIFJlZlNDQyBhbmQgY2hpbGQgaXMgaW4gc29tZQorICAgIC8vLyBjaGlsZCBSZWZTQ0MuCisgICAgLy8vCisgICAgLy8vIFRoZXJlIG11c3QgYmUgYW4gZXhpc3RpbmcgcGF0aCBmcm9tIHRoZSBccCBTb3VyY2VOIHRvIHRoZSBccCBUYXJnZXROLgorICAgIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBpbmV4cGVuc2l2ZSBhbmQgZG9lcyBub3QgY2hhbmdlIHRoZSBzZXQgb2YgU0NDcyBhbmQKKyAgICAvLy8gUmVmU0NDcyBpbiB0aGUgZ3JhcGguCisgICAgdm9pZCBpbnNlcnRPdXRnb2luZ0VkZ2UoTm9kZSAmU291cmNlTiwgTm9kZSAmVGFyZ2V0TiwgRWRnZTo6S2luZCBFSyk7CisKKyAgICAvLy8gSW5zZXJ0IGFuIGVkZ2Ugd2hvc2Ugc291cmNlIGlzIGluIGEgZGVzY2VuZGFudCBSZWZTQ0MgYW5kIHRhcmdldCBpcyBpbgorICAgIC8vLyB0aGlzIFJlZlNDQy4KKyAgICAvLy8KKyAgICAvLy8gVGhlcmUgbXVzdCBiZSBhbiBleGlzdGluZyBwYXRoIGZyb20gdGhlIHRhcmdldCB0byB0aGUgc291cmNlIGluIHRoaXMKKyAgICAvLy8gY2FzZS4KKyAgICAvLy8KKyAgICAvLy8gTkIhIFRoaXMgaXMgaGFzIHRoZSBwb3RlbnRpYWwgdG8gYmUgYSB2ZXJ5IGV4cGVuc2l2ZSBmdW5jdGlvbi4gSXQKKyAgICAvLy8gaW5oZXJlbnRseSBmb3JtcyBhIGN5Y2xlIGluIHRoZSBwcmlvciBSZWZTQ0MgREFHIGFuZCB3ZSBoYXZlIHRvIG1lcmdlCisgICAgLy8vIFJlZlNDQ3MgdG8gcmVzb2x2ZSB0aGF0IGN5Y2xlLiBCdXQgZmluZGluZyBhbGwgb2YgdGhlIFJlZlNDQ3Mgd2hpY2gKKyAgICAvLy8gcGFydGljaXBhdGUgaW4gdGhlIGN5Y2xlIGNhbiBpbiB0aGUgd29yc3QgY2FzZSByZXF1aXJlIHRyYXZlcnNpbmcgZXZlcnkKKyAgICAvLy8gUmVmU0NDIGluIHRoZSBncmFwaC4gRXZlcnkgYXR0ZW1wdCBpcyBtYWRlIHRvIGF2b2lkIHRoYXQsIGJ1dCBwYXNzZXMKKyAgICAvLy8gbXVzdCBzdGlsbCBleGVyY2lzZSBjYXV0aW9uIGNhbGxpbmcgdGhpcyByb3V0aW5lIHJlcGVhdGVkbHkuCisgICAgLy8vCisgICAgLy8vIEFsc28gbm90ZSB0aGF0IHRoaXMgY2FuIG9ubHkgaW5zZXJ0IHJlZiBlZGdlcy4gSW4gb3JkZXIgdG8gaW5zZXJ0CisgICAgLy8vIGEgY2FsbCBlZGdlLCBmaXJzdCBpbnNlcnQgYSByZWYgZWRnZSBhbmQgdGhlbiBzd2l0Y2ggaXQgdG8gYSBjYWxsIGVkZ2UuCisgICAgLy8vIFRoZXNlIGFyZSBpbnRlbnRpb25hbGx5IGtlcHQgYXMgc2VwYXJhdGUgaW50ZXJmYWNlcyBiZWNhdXNlIGVhY2ggc3RlcAorICAgIC8vLyBvZiB0aGUgb3BlcmF0aW9uIGludmFsaWRhdGVzIGEgZGlmZmVyZW50IHNldCBvZiBkYXRhIHN0cnVjdHVyZXMuCisgICAgLy8vCisgICAgLy8vIFRoaXMgcmV0dXJucyBhbGwgdGhlIFJlZlNDQ3Mgd2hpY2ggd2VyZSBtZXJnZWQgaW50byB0aGUgdGhpcyBSZWZTQ0MKKyAgICAvLy8gKHRoZSB0YXJnZXQncykuIFRoaXMgYWxsb3dzIGNhbGxlcnMgdG8gaW52YWxpZGF0ZSBhbnkgY2FjaGVkCisgICAgLy8vIGluZm9ybWF0aW9uLgorICAgIC8vLworICAgIC8vLyBGSVhNRTogV2UgY291bGQgcG9zc2libHkgb3B0aW1pemUgdGhpcyBxdWl0ZSBhIGJpdCBmb3IgY2FzZXMgd2hlcmUgdGhlCisgICAgLy8vIGNhbGxlciBhbmQgY2FsbGVlIGFyZSB2ZXJ5IG5lYXJieSBpbiB0aGUgZ3JhcGguIFNlZSBjb21tZW50cyBpbiB0aGUKKyAgICAvLy8gaW1wbGVtZW50YXRpb24gZm9yIGRldGFpbHMsIGJ1dCB0aGF0IHVzZSBjYXNlIG1pZ2h0IGltcGFjdCB1c2Vycy4KKyAgICBTbWFsbFZlY3RvcjxSZWZTQ0MgKiwgMT4gaW5zZXJ0SW5jb21pbmdSZWZFZGdlKE5vZGUgJlNvdXJjZU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlICZUYXJnZXROKTsKKworICAgIC8vLyBSZW1vdmUgYW4gZWRnZSB3aG9zZSBzb3VyY2UgaXMgaW4gdGhpcyBSZWZTQ0MgYW5kIHRhcmdldCBpcyAqbm90Ki4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyByZW1vdmVzIGFuIGludGVyLVJlZlNDQyBlZGdlLiBBbGwgaW50ZXItUmVmU0NDIGVkZ2VzIG9yaWdpbmF0aW5nCisgICAgLy8vIGZyb20gdGhpcyBTQ0MgaGF2ZSBiZWVuIGZ1bGx5IGV4cGxvcmVkIGJ5IGFueSBpbi1mbGlnaHQgREZTIGdyYXBoCisgICAgLy8vIGZvcm1hdGlvbiwgc28gdGhpcyBpcyBhbHdheXMgc2FmZSB0byBjYWxsIG9uY2UgeW91IGhhdmUgdGhlIHNvdXJjZQorICAgIC8vLyBSZWZTQ0MuCisgICAgLy8vCisgICAgLy8vIFRoaXMgb3BlcmF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgY3ljbGljIHN0cnVjdHVyZSBvZiB0aGUgZ3JhcGggYW5kIHNvCisgICAgLy8vIGlzIHZlcnkgaW5leHBlbnNpdmUuIEl0IG1heSBjaGFuZ2UgdGhlIGNvbm5lY3Rpdml0eSBncmFwaCBvZiB0aGUgU0NDcworICAgIC8vLyB0aG91Z2gsIHNvIGJlIGNhcmVmdWwgY2FsbGluZyB0aGlzIHdoaWxlIGl0ZXJhdGluZyBvdmVyIHRoZW0uCisgICAgdm9pZCByZW1vdmVPdXRnb2luZ0VkZ2UoTm9kZSAmU291cmNlTiwgTm9kZSAmVGFyZ2V0Tik7CisKKyAgICAvLy8gUmVtb3ZlIGEgbGlzdCBvZiByZWYgZWRnZXMgd2hpY2ggYXJlIGVudGlyZWx5IHdpdGhpbiB0aGlzIFJlZlNDQy4KKyAgICAvLy8KKyAgICAvLy8gQm90aCB0aGUgXGEgU291cmNlTiBhbmQgYWxsIG9mIHRoZSBcYSBUYXJnZXROcyBtdXN0IGJlIHdpdGhpbiB0aGlzCisgICAgLy8vIFJlZlNDQy4gUmVtb3ZpbmcgdGhlc2UgZWRnZXMgbWF5IGJyZWFrIGN5Y2xlcyB0aGF0IGZvcm0gdGhpcyBSZWZTQ0MgYW5kCisgICAgLy8vIHRodXMgdGhpcyBvcGVyYXRpb24gbWF5IGNoYW5nZSB0aGUgUmVmU0NDIGdyYXBoIHNpZ25pZmljYW50bHkuIEluCisgICAgLy8vIHBhcnRpY3VsYXIsIHRoaXMgb3BlcmF0aW9uIHdpbGwgcmUtZm9ybSBuZXcgUmVmU0NDcyBiYXNlZCBvbiB0aGUKKyAgICAvLy8gcmVtYWluaW5nIGNvbm5lY3Rpdml0eSBvZiB0aGUgZ3JhcGguIFRoZSBmb2xsb3dpbmcgaW52YXJpYW50cyBhcmUKKyAgICAvLy8gZ3VhcmFudGVlZCB0byBob2xkIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2Q6CisgICAgLy8vCisgICAgLy8vIDEpIElmIGEgcmVmLWN5Y2xlIHJlbWFpbnMgYWZ0ZXIgcmVtb3ZhbCwgaXQgbGVhdmVzIHRoaXMgUmVmU0NDIGludGFjdAorICAgIC8vLyAgICBhbmQgaW4gdGhlIGdyYXBoLiBObyBuZXcgUmVmU0NDcyBhcmUgYnVpbHQuCisgICAgLy8vIDIpIE90aGVyd2lzZSwgdGhpcyBSZWZTQ0Mgd2lsbCBiZSBkZWFkIGFmdGVyIHRoaXMgY2FsbCBhbmQgbm8gbG9uZ2VyIGluCisgICAgLy8vICAgIHRoZSBncmFwaCBvciB0aGUgcG9zdG9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgY2FsbCBncmFwaC4gQW55IGl0ZXJhdG9yCisgICAgLy8vICAgIHBvaW50aW5nIGF0IHRoaXMgUmVmU0NDIHdpbGwgYmVjb21lIGludmFsaWQuCisgICAgLy8vIDMpIEFsbCBuZXdseSBmb3JtZWQgUmVmU0NDcyB3aWxsIGJlIHJldHVybmVkIGFuZCB0aGUgb3JkZXIgb2YgdGhlCisgICAgLy8vICAgIFJlZlNDQ3MgcmV0dXJuZWQgd2lsbCBiZSBhIHZhbGlkIHBvc3RvcmRlciB0cmF2ZXJzYWwgb2YgdGhlIG5ldworICAgIC8vLyAgICBSZWZTQ0NzLgorICAgIC8vLyA0KSBObyBSZWZTQ0Mgb3RoZXIgdGhhbiB0aGlzIFJlZlNDQyBoYXMgaXRzIG1lbWJlciBzZXQgY2hhbmdlZCAodGhpcyBpcworICAgIC8vLyAgICBpbmhlcmVudCBpbiB0aGUgZGVmaW5pdGlvbiBvZiByZW1vdmluZyBzdWNoIGFuIGVkZ2UpLgorICAgIC8vLworICAgIC8vLyBUaGVzZSBpbnZhcmlhbnRzIGFyZSB2ZXJ5IGltcG9ydGFudCB0byBlbnN1cmUgdGhhdCB3ZSBjYW4gYnVpbGQKKyAgICAvLy8gb3B0aW1pemF0aW9uIHBpcGVsaW5lcyBvbiB0b3Agb2YgdGhlIENHU0NDIHBhc3MgbWFuYWdlciB3aGljaAorICAgIC8vLyBpbnRlbGxpZ2VudGx5IHVwZGF0ZSB0aGUgUmVmU0NDIGdyYXBoIHdpdGhvdXQgaW52YWxpZGF0aW5nIG90aGVyIHBhcnRzCisgICAgLy8vIG9mIHRoZSBSZWZTQ0MgZ3JhcGguCisgICAgLy8vCisgICAgLy8vIE5vdGUgdGhhdCB3ZSBwcm92aWRlIG5vIHJvdXRpbmUgdG8gcmVtb3ZlIGEgKmNhbGwqIGVkZ2UuIEluc3RlYWQsIHlvdQorICAgIC8vLyBtdXN0IGZpcnN0IHN3aXRjaCBpdCB0byBhIHJlZiBlZGdlIHVzaW5nIFxjIHN3aXRjaEludGVybmFsRWRnZVRvUmVmLgorICAgIC8vLyBUaGlzIHNwbGl0IEFQSSBpcyBpbnRlbnRpb25hbCBhcyBlYWNoIG9mIHRoZXNlIHR3byBzdGVwcyBjYW4gaW52YWxpZGF0ZQorICAgIC8vLyBhIGRpZmZlcmVudCBhc3BlY3Qgb2YgdGhlIGdyYXBoIHN0cnVjdHVyZSBhbmQgbmVlZHMgdG8gaGF2ZSB0aGUKKyAgICAvLy8gaW52YWxpZGF0aW9uIGhhbmRsZWQgaW5kZXBlbmRlbnRseS4KKyAgICAvLy8KKyAgICAvLy8gVGhlIHJ1bnRpbWUgY29tcGxleGl0eSBvZiB0aGlzIG1ldGhvZCBpcywgaW4gdGhlIHdvcnN0IGNhc2UsIE8oVitFKQorICAgIC8vLyB3aGVyZSBWIGlzIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhpcyBSZWZTQ0MgYW5kIEUgaXMgdGhlIG51bWJlciBvZgorICAgIC8vLyBlZGdlcyBsZWF2aW5nIHRoZSBub2RlcyBpbiB0aGlzIFJlZlNDQy4gTm90ZSB0aGF0IEUgaW5jbHVkZXMgYm90aCBlZGdlcworICAgIC8vLyB3aXRoaW4gdGhpcyBSZWZTQ0MgYW5kIGVkZ2VzIGZyb20gdGhpcyBSZWZTQ0MgdG8gY2hpbGQgUmVmU0NDcy4gU29tZQorICAgIC8vLyBlZmZvcnQgaGFzIGJlZW4gbWFkZSB0byBtaW5pbWl6ZSB0aGUgb3ZlcmhlYWQgb2YgY29tbW9uIGNhc2VzIHN1Y2ggYXMKKyAgICAvLy8gc2VsZi1lZGdlcyBhbmQgZWRnZSByZW1vdmFscyB3aGljaCByZXN1bHQgaW4gYSBzcGFubmluZyB0cmVlIHdpdGggbm8KKyAgICAvLy8gbW9yZSBjeWNsZXMuCisgICAgU21hbGxWZWN0b3I8UmVmU0NDICosIDE+IHJlbW92ZUludGVybmFsUmVmRWRnZShOb2RlICZTb3VyY2VOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Tm9kZSAqPiBUYXJnZXROcyk7CisKKyAgICAvLy8gQSBjb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgYWJvdmUgdG8gaGFuZGxlIHRyaXZpYWwgY2FzZXMgb2YKKyAgICAvLy8gaW5zZXJ0aW5nIGEgbmV3IGNhbGwgZWRnZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyB0cml2aWFsIHdoZW5ldmVyIHRoZSB0YXJnZXQgaXMgaW4gdGhlIHNhbWUgU0NDIGFzIHRoZSBzb3VyY2Ugb3IKKyAgICAvLy8gdGhlIGVkZ2UgaXMgYW4gb3V0Z29pbmcgZWRnZSB0byBzb21lIGRlc2NlbmRhbnQgU0NDLiBJbiB0aGVzZSBjYXNlcworICAgIC8vLyB0aGVyZSBpcyBubyBjaGFuZ2UgdG8gdGhlIGN5Y2xpYyBzdHJ1Y3R1cmUgb2YgU0NDcyBvciBSZWZTQ0NzLgorICAgIC8vLworICAgIC8vLyBUbyBmdXJ0aGVyIG1ha2UgY2FsbGluZyB0aGlzIGNvbnZlbmllbnQsIGl0IGFsc28gaGFuZGxlcyBpbnNlcnRpbmcKKyAgICAvLy8gYWxyZWFkeSBleGlzdGluZyBlZGdlcy4KKyAgICB2b2lkIGluc2VydFRyaXZpYWxDYWxsRWRnZShOb2RlICZTb3VyY2VOLCBOb2RlICZUYXJnZXROKTsKKworICAgIC8vLyBBIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBhYm92ZSB0byBoYW5kbGUgdHJpdmlhbCBjYXNlcyBvZgorICAgIC8vLyBpbnNlcnRpbmcgYSBuZXcgcmVmIGVkZ2UuCisgICAgLy8vCisgICAgLy8vIFRoaXMgaXMgdHJpdmlhbCB3aGVuZXZlciB0aGUgdGFyZ2V0IGlzIGluIHRoZSBzYW1lIFJlZlNDQyBhcyB0aGUgc291cmNlCisgICAgLy8vIG9yIHRoZSBlZGdlIGlzIGFuIG91dGdvaW5nIGVkZ2UgdG8gc29tZSBkZXNjZW5kYW50IFJlZlNDQy4gSW4gdGhlc2UKKyAgICAvLy8gY2FzZXMgdGhlcmUgaXMgbm8gY2hhbmdlIHRvIHRoZSBjeWNsaWMgc3RydWN0dXJlIG9mIHRoZSBSZWZTQ0NzLgorICAgIC8vLworICAgIC8vLyBUbyBmdXJ0aGVyIG1ha2UgY2FsbGluZyB0aGlzIGNvbnZlbmllbnQsIGl0IGFsc28gaGFuZGxlcyBpbnNlcnRpbmcKKyAgICAvLy8gYWxyZWFkeSBleGlzdGluZyBlZGdlcy4KKyAgICB2b2lkIGluc2VydFRyaXZpYWxSZWZFZGdlKE5vZGUgJlNvdXJjZU4sIE5vZGUgJlRhcmdldE4pOworCisgICAgLy8vIERpcmVjdGx5IHJlcGxhY2UgYSBub2RlJ3MgZnVuY3Rpb24gd2l0aCBhIG5ldyBmdW5jdGlvbi4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBzaG91bGQgYmUgdXNlZCB3aGVuIG1vdmluZyB0aGUgYm9keSBhbmQgdXNlcnMgb2YgYSBmdW5jdGlvbiB0bworICAgIC8vLyBhIG5ldyBmb3JtYWwgZnVuY3Rpb24gb2JqZWN0IGJ1dCBub3Qgb3RoZXJ3aXNlIGNoYW5naW5nIHRoZSBjYWxsIGdyYXBoCisgICAgLy8vIHN0cnVjdHVyZSBpbiBhbnkgd2F5LgorICAgIC8vLworICAgIC8vLyBJdCByZXF1aXJlcyB0aGF0IHRoZSBvbGQgZnVuY3Rpb24gaW4gdGhlIHByb3ZpZGVkIG5vZGUgaGF2ZSB6ZXJvIHVzZXMKKyAgICAvLy8gYW5kIHRoZSBuZXcgZnVuY3Rpb24gbXVzdCBoYXZlIGNhbGxzIGFuZCByZWZlcmVuY2VzIHRvIGl0IGVzdGFibGlzaGluZworICAgIC8vLyBhbiBlcXVpdmFsZW50IGdyYXBoLgorICAgIHZvaWQgcmVwbGFjZU5vZGVGdW5jdGlvbihOb2RlICZOLCBGdW5jdGlvbiAmTmV3Rik7CisKKyAgICAvLy9AfQorICB9OworCisgIC8vLyBBIHBvc3Qtb3JkZXIgZGVwdGgtZmlyc3QgUmVmU0NDIGl0ZXJhdG9yIG92ZXIgdGhlIGNhbGwgZ3JhcGguCisgIC8vLworICAvLy8gVGhpcyBpdGVyYXRvciB3YWxrcyB0aGUgY2FjaGVkIHBvc3Qtb3JkZXIgc2VxdWVuY2Ugb2YgUmVmU0NDcy4gSG93ZXZlciwKKyAgLy8vIGl0IHRyYWRlcyBzdGFiaWxpdHkgZm9yIGZsZXhpYmlsaXR5LiBJdCBpcyByZXN0cmljdGVkIHRvIGEgZm9yd2FyZAorICAvLy8gaXRlcmF0b3IgYnV0IHdpbGwgc3Vydml2ZSBtdXRhdGlvbnMgd2hpY2ggaW5zZXJ0IG5ldyBSZWZTQ0NzIGFuZCBjb250aW51ZQorICAvLy8gdG8gcG9pbnQgdG8gdGhlIHNhbWUgUmVmU0NDIGV2ZW4gaWYgaXQgbW92ZXMgaW4gdGhlIHBvc3Qtb3JkZXIgc2VxdWVuY2UuCisgIGNsYXNzIHBvc3RvcmRlcl9yZWZfc2NjX2l0ZXJhdG9yCisgICAgICA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTxwb3N0b3JkZXJfcmVmX3NjY19pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIFJlZlNDQz4geworICAgIGZyaWVuZCBjbGFzcyBMYXp5Q2FsbEdyYXBoOworICAgIGZyaWVuZCBjbGFzcyBMYXp5Q2FsbEdyYXBoOjpOb2RlOworCisgICAgLy8vIE5vbmNlIHR5cGUgdG8gc2VsZWN0IHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIGVuZCBpdGVyYXRvci4KKyAgICBzdHJ1Y3QgSXNBdEVuZFQge307CisKKyAgICBMYXp5Q2FsbEdyYXBoICpHOworICAgIFJlZlNDQyAqUkMgPSBudWxscHRyOworCisgICAgLy8vIEJ1aWxkIHRoZSBiZWdpbiBpdGVyYXRvciBmb3IgYSBub2RlLgorICAgIHBvc3RvcmRlcl9yZWZfc2NjX2l0ZXJhdG9yKExhenlDYWxsR3JhcGggJkcpIDogRygmRyksIFJDKGdldFJDKEcsIDApKSB7fQorCisgICAgLy8vIEJ1aWxkIHRoZSBlbmQgaXRlcmF0b3IgZm9yIGEgbm9kZS4gVGhpcyBpcyBzZWxlY3RlZCBwdXJlbHkgYnkgb3ZlcmxvYWQuCisgICAgcG9zdG9yZGVyX3JlZl9zY2NfaXRlcmF0b3IoTGF6eUNhbGxHcmFwaCAmRywgSXNBdEVuZFQgLypOb25jZSovKSA6IEcoJkcpIHt9CisKKyAgICAvLy8gR2V0IHRoZSBwb3N0LW9yZGVyIFJlZlNDQyBhdCB0aGUgZ2l2ZW4gaW5kZXggb2YgdGhlIHBvc3RvcmRlciB3YWxrLAorICAgIC8vLyBwb3B1bGF0aW5nIGl0IGlmIG5lY2Vzc2FyeS4KKyAgICBzdGF0aWMgUmVmU0NDICpnZXRSQyhMYXp5Q2FsbEdyYXBoICZHLCBpbnQgSW5kZXgpIHsKKyAgICAgIGlmIChJbmRleCA9PSAoaW50KUcuUG9zdE9yZGVyUmVmU0NDcy5zaXplKCkpCisgICAgICAgIC8vIFdlJ3JlIGF0IHRoZSBlbmQuCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICByZXR1cm4gRy5Qb3N0T3JkZXJSZWZTQ0NzW0luZGV4XTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwb3N0b3JkZXJfcmVmX3NjY19pdGVyYXRvciAmQXJnKSBjb25zdCB7CisgICAgICByZXR1cm4gRyA9PSBBcmcuRyAmJiBSQyA9PSBBcmcuUkM7CisgICAgfQorCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpSQzsgfQorCisgICAgdXNpbmcgaXRlcmF0b3JfZmFjYWRlX2Jhc2U6Om9wZXJhdG9yKys7CisgICAgcG9zdG9yZGVyX3JlZl9zY2NfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgICBhc3NlcnQoUkMgJiYgIkNhbm5vdCBpbmNyZW1lbnQgdGhlIGVuZCBpdGVyYXRvciEiKTsKKyAgICAgIFJDID0gZ2V0UkMoKkcsIEctPlJlZlNDQ0luZGljZXMuZmluZChSQyktPnNlY29uZCArIDEpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgfTsKKworICAvLy8gQ29uc3RydWN0IGEgZ3JhcGggZm9yIHRoZSBnaXZlbiBtb2R1bGUuCisgIC8vLworICAvLy8gVGhpcyBzZXRzIHVwIHRoZSBncmFwaCBhbmQgY29tcHV0ZXMgYWxsIG9mIHRoZSBlbnRyeSBwb2ludHMgb2YgdGhlIGdyYXBoLgorICAvLy8gTm8gZnVuY3Rpb24gZGVmaW5pdGlvbnMgYXJlIHNjYW5uZWQgdW50aWwgdGhlaXIgbm9kZXMgaW4gdGhlIGdyYXBoIGFyZQorICAvLy8gcmVxdWVzdGVkIGR1cmluZyB0cmF2ZXJzYWwuCisgIExhenlDYWxsR3JhcGgoTW9kdWxlICZNLCBUYXJnZXRMaWJyYXJ5SW5mbyAmVExJKTsKKworICBMYXp5Q2FsbEdyYXBoKExhenlDYWxsR3JhcGggJiZHKTsKKyAgTGF6eUNhbGxHcmFwaCAmb3BlcmF0b3I9KExhenlDYWxsR3JhcGggJiZSSFMpOworCisgIEVkZ2VTZXF1ZW5jZTo6aXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBFbnRyeUVkZ2VzLmJlZ2luKCk7IH0KKyAgRWRnZVNlcXVlbmNlOjppdGVyYXRvciBlbmQoKSB7IHJldHVybiBFbnRyeUVkZ2VzLmVuZCgpOyB9CisKKyAgdm9pZCBidWlsZFJlZlNDQ3MoKTsKKworICBwb3N0b3JkZXJfcmVmX3NjY19pdGVyYXRvciBwb3N0b3JkZXJfcmVmX3NjY19iZWdpbigpIHsKKyAgICBpZiAoIUVudHJ5RWRnZXMuZW1wdHkoKSkKKyAgICAgIGFzc2VydCghUG9zdE9yZGVyUmVmU0NDcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgIk11c3QgZm9ybSBSZWZTQ0NzIGJlZm9yZSBpdGVyYXRpbmcgdGhlbSEiKTsKKyAgICByZXR1cm4gcG9zdG9yZGVyX3JlZl9zY2NfaXRlcmF0b3IoKnRoaXMpOworICB9CisgIHBvc3RvcmRlcl9yZWZfc2NjX2l0ZXJhdG9yIHBvc3RvcmRlcl9yZWZfc2NjX2VuZCgpIHsKKyAgICBpZiAoIUVudHJ5RWRnZXMuZW1wdHkoKSkKKyAgICAgIGFzc2VydCghUG9zdE9yZGVyUmVmU0NDcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgIk11c3QgZm9ybSBSZWZTQ0NzIGJlZm9yZSBpdGVyYXRpbmcgdGhlbSEiKTsKKyAgICByZXR1cm4gcG9zdG9yZGVyX3JlZl9zY2NfaXRlcmF0b3IoKnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RvcmRlcl9yZWZfc2NjX2l0ZXJhdG9yOjpJc0F0RW5kVCgpKTsKKyAgfQorCisgIGl0ZXJhdG9yX3JhbmdlPHBvc3RvcmRlcl9yZWZfc2NjX2l0ZXJhdG9yPiBwb3N0b3JkZXJfcmVmX3NjY3MoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UocG9zdG9yZGVyX3JlZl9zY2NfYmVnaW4oKSwgcG9zdG9yZGVyX3JlZl9zY2NfZW5kKCkpOworICB9CisKKyAgLy8vIExvb2t1cCBhIGZ1bmN0aW9uIGluIHRoZSBncmFwaCB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHNjYW5uZWQgYW5kIGFkZGVkLgorICBOb2RlICpsb29rdXAoY29uc3QgRnVuY3Rpb24gJkYpIGNvbnN0IHsgcmV0dXJuIE5vZGVNYXAubG9va3VwKCZGKTsgfQorCisgIC8vLyBMb29rdXAgYSBmdW5jdGlvbidzIFNDQyBpbiB0aGUgZ3JhcGguCisgIC8vLworICAvLy8gXHJldHVybnMgbnVsbCBpZiB0aGUgZnVuY3Rpb24gaGFzbid0IGJlZW4gYXNzaWduZWQgYW4gU0NDIHZpYSB0aGUgUmVmU0NDCisgIC8vLyBpdGVyYXRvciB3YWxrLgorICBTQ0MgKmxvb2t1cFNDQyhOb2RlICZOKSBjb25zdCB7IHJldHVybiBTQ0NNYXAubG9va3VwKCZOKTsgfQorCisgIC8vLyBMb29rdXAgYSBmdW5jdGlvbidzIFJlZlNDQyBpbiB0aGUgZ3JhcGguCisgIC8vLworICAvLy8gXHJldHVybnMgbnVsbCBpZiB0aGUgZnVuY3Rpb24gaGFzbid0IGJlZW4gYXNzaWduZWQgYSBSZWZTQ0MgdmlhIHRoZQorICAvLy8gUmVmU0NDIGl0ZXJhdG9yIHdhbGsuCisgIFJlZlNDQyAqbG9va3VwUmVmU0NDKE5vZGUgJk4pIGNvbnN0IHsKKyAgICBpZiAoU0NDICpDID0gbG9va3VwU0NDKE4pKQorICAgICAgcmV0dXJuICZDLT5nZXRPdXRlclJlZlNDQygpOworCisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gR2V0IGEgZ3JhcGggbm9kZSBmb3IgYSBnaXZlbiBmdW5jdGlvbiwgc2Nhbm5pbmcgaXQgdG8gcG9wdWxhdGUgdGhlIGdyYXBoCisgIC8vLyBkYXRhIGFzIG5lY2Vzc2FyeS4KKyAgTm9kZSAmZ2V0KEZ1bmN0aW9uICZGKSB7CisgICAgTm9kZSAqJk4gPSBOb2RlTWFwWyZGXTsKKyAgICBpZiAoTikKKyAgICAgIHJldHVybiAqTjsKKworICAgIHJldHVybiBpbnNlcnRJbnRvKEYsIE4pOworICB9CisKKyAgLy8vIEdldCB0aGUgc2VxdWVuY2Ugb2Yga25vd24gYW5kIGRlZmluZWQgbGlicmFyeSBmdW5jdGlvbnMuCisgIC8vLworICAvLy8gVGhlc2UgZnVuY3Rpb25zLCBiZWNhdXNlIHRoZXkgYXJlIGtub3duIHRvIExMVk0sIGNhbiBoYXZlIGNhbGxzCisgIC8vLyBpbnRyb2R1Y2VkIG91dCBvZiB0aGluIGFpciBmcm9tIGFyYml0cmFyeSBJUi4KKyAgQXJyYXlSZWY8RnVuY3Rpb24gKj4gZ2V0TGliRnVuY3Rpb25zKCkgY29uc3QgeworICAgIHJldHVybiBMaWJGdW5jdGlvbnMuZ2V0QXJyYXlSZWYoKTsKKyAgfQorCisgIC8vLyBUZXN0IHdoZXRoZXIgYSBmdW5jdGlvbiBpcyBhIGtub3duIGFuZCBkZWZpbmVkIGxpYnJhcnkgZnVuY3Rpb24gdHJhY2tlZCBieQorICAvLy8gdGhlIGNhbGwgZ3JhcGguCisgIC8vLworICAvLy8gQmVjYXVzZSB0aGVzZSBmdW5jdGlvbnMgYXJlIGtub3duIHRvIExMVk0gdGhleSBhcmUgc3BlY2lhbGx5IG1vZGVsZWQgaW4KKyAgLy8vIHRoZSBjYWxsIGdyYXBoIGFuZCBldmVuIHdoZW4gYWxsIElSLWxldmVsIHJlZmVyZW5jZXMgaGF2ZSBiZWVuIHJlbW92ZWQKKyAgLy8vIHJlbWFpbiBhY3RpdmUgYW5kIHJlYWNoYWJsZS4KKyAgYm9vbCBpc0xpYkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBjb25zdCB7IHJldHVybiBMaWJGdW5jdGlvbnMuY291bnQoJkYpOyB9CisKKyAgLy8vQHsKKyAgLy8vIFxuYW1lIFByZS1TQ0MgTXV0YXRpb24gQVBJCisgIC8vLworICAvLy8gVGhlc2UgbWV0aG9kcyBhcmUgb25seSB2YWxpZCB0byBjYWxsIHByaW9yIHRvIGZvcm1pbmcgYW55IFNDQ3MgZm9yIHRoaXMKKyAgLy8vIGNhbGwgZ3JhcGguIFRoZXkgY2FuIGJlIHVzZWQgdG8gdXBkYXRlIHRoZSBjb3JlIG5vZGUtZ3JhcGggZHVyaW5nCisgIC8vLyBhIG5vZGUtYmFzZWQgaW5vcmRlciB0cmF2ZXJzYWwgdGhhdCBwcmVjZWRlcyBhbnkgU0NDLWJhc2VkIHRyYXZlcnNhbC4KKyAgLy8vCisgIC8vLyBPbmNlIHlvdSBiZWdpbiBtYW5pcHVsYXRpbmcgYSBjYWxsIGdyYXBoJ3MgU0NDcywgbW9zdCBtdXRhdGlvbiBvZiB0aGUKKyAgLy8vIGdyYXBoIG11c3QgYmUgcGVyZm9ybWVkIHZpYSBhIFJlZlNDQyBtZXRob2QuIFRoZXJlIGFyZSBzb21lIGV4Y2VwdGlvbnMKKyAgLy8vIGJlbG93LgorCisgIC8vLyBVcGRhdGUgdGhlIGNhbGwgZ3JhcGggYWZ0ZXIgaW5zZXJ0aW5nIGEgbmV3IGVkZ2UuCisgIHZvaWQgaW5zZXJ0RWRnZShOb2RlICZTb3VyY2VOLCBOb2RlICZUYXJnZXROLCBFZGdlOjpLaW5kIEVLKTsKKworICAvLy8gVXBkYXRlIHRoZSBjYWxsIGdyYXBoIGFmdGVyIGluc2VydGluZyBhIG5ldyBlZGdlLgorICB2b2lkIGluc2VydEVkZ2UoRnVuY3Rpb24gJlNvdXJjZSwgRnVuY3Rpb24gJlRhcmdldCwgRWRnZTo6S2luZCBFSykgeworICAgIHJldHVybiBpbnNlcnRFZGdlKGdldChTb3VyY2UpLCBnZXQoVGFyZ2V0KSwgRUspOworICB9CisKKyAgLy8vIFVwZGF0ZSB0aGUgY2FsbCBncmFwaCBhZnRlciBkZWxldGluZyBhbiBlZGdlLgorICB2b2lkIHJlbW92ZUVkZ2UoTm9kZSAmU291cmNlTiwgTm9kZSAmVGFyZ2V0Tik7CisKKyAgLy8vIFVwZGF0ZSB0aGUgY2FsbCBncmFwaCBhZnRlciBkZWxldGluZyBhbiBlZGdlLgorICB2b2lkIHJlbW92ZUVkZ2UoRnVuY3Rpb24gJlNvdXJjZSwgRnVuY3Rpb24gJlRhcmdldCkgeworICAgIHJldHVybiByZW1vdmVFZGdlKGdldChTb3VyY2UpLCBnZXQoVGFyZ2V0KSk7CisgIH0KKworICAvLy9AfQorCisgIC8vL0B7CisgIC8vLyBcbmFtZSBHZW5lcmFsIE11dGF0aW9uIEFQSQorICAvLy8KKyAgLy8vIFRoZXJlIGFyZSBhIHZlcnkgbGltaXRlZCBzZXQgb2YgbXV0YXRpb25zIGFsbG93ZWQgb24gdGhlIGdyYXBoIGFzIGEgd2hvbGUKKyAgLy8vIG9uY2UgU0NDcyBoYXZlIHN0YXJ0ZWQgdG8gYmUgZm9ybWVkLiBUaGVzZSByb3V0aW5lcyBoYXZlIHN0cmljdCBjb250cmFjdHMKKyAgLy8vIGJ1dCBtYXkgYmUgY2FsbGVkIGF0IGFueSBwb2ludC4KKworICAvLy8gUmVtb3ZlIGEgZGVhZCBmdW5jdGlvbiBmcm9tIHRoZSBjYWxsIGdyYXBoICh0eXBpY2FsbHkgdG8gZGVsZXRlIGl0KS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhlIGZ1bmN0aW9uIG11c3QgaGF2ZSBhbiBlbXB0eSB1c2UgbGlzdCwgYW5kIHRoZSBjYWxsIGdyYXBoCisgIC8vLyBtdXN0IGJlIHVwLXRvLWRhdGUgcHJpb3IgdG8gY2FsbGluZyB0aGlzLiBUaGF0IG1lYW5zIGl0IGlzIGJ5IGl0c2VsZiBpbgorICAvLy8gYSBtYXhpbWFsIFNDQyB3aGljaCBpcyBieSBpdHNlbGYgaW4gYSBtYXhpbWFsIFJlZlNDQywgZXRjLiBObyBzdHJ1Y3R1cmFsCisgIC8vLyBjaGFuZ2VzIHJlc3VsdCBmcm9tIGNhbGxpbmcgdGhpcyByb3V0aW5lIG90aGVyIHRoYW4gcG90ZW50aWFsbHkgcmVtb3ZpbmcKKyAgLy8vIGVudHJ5IHBvaW50cyBpbnRvIHRoZSBjYWxsIGdyYXBoLgorICAvLy8KKyAgLy8vIElmIFNDQyBmb3JtYXRpb24gaGFzIGJlZ3VuLCB0aGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIHBhcnQgb2YgdGhlIGN1cnJlbnQKKyAgLy8vIERGUyBpbiBvcmRlciB0byBjYWxsIHRoaXMgc2FmZWx5LiBUeXBpY2FsbHksIHRoZSBmdW5jdGlvbiB3aWxsIGhhdmUgYmVlbgorICAvLy8gZnVsbHkgdmlzaXRlZCBieSB0aGUgREZTIHByaW9yIHRvIGNhbGxpbmcgdGhpcyByb3V0aW5lLgorICB2b2lkIHJlbW92ZURlYWRGdW5jdGlvbihGdW5jdGlvbiAmRik7CisKKyAgLy8vQH0KKworICAvLy9AeworICAvLy8gXG5hbWUgU3RhdGljIGhlbHBlcnMgZm9yIGNvZGUgZG9pbmcgdXBkYXRlcyB0byB0aGUgY2FsbCBncmFwaC4KKyAgLy8vCisgIC8vLyBUaGVzZSBoZWxwZXJzIGFyZSB1c2VkIHRvIGltcGxlbWVudCBwYXJ0cyBvZiB0aGUgY2FsbCBncmFwaCBidXQgYXJlIGFsc28KKyAgLy8vIHVzZWZ1bCB0byBjb2RlIGRvaW5nIHVwZGF0ZXMgb3Igb3RoZXJ3aXNlIHdhbnRpbmcgdG8gd2FsayB0aGUgSVIgaW4gdGhlCisgIC8vLyBzYW1lIHBhdHRlcm5zIGFzIHdoZW4gd2UgYnVpbGQgdGhlIGNhbGwgZ3JhcGguCisKKyAgLy8vIFJlY3Vyc2l2ZWx5IHZpc2l0cyB0aGUgZGVmaW5lZCBmdW5jdGlvbnMgd2hvc2UgYWRkcmVzcyBpcyByZWFjaGFibGUgZnJvbQorICAvLy8gZXZlcnkgY29uc3RhbnQgaW4gdGhlIFxwIFdvcmtsaXN0LgorICAvLy8KKyAgLy8vIERvZXNuJ3QgcmVjdXJzZSB0aHJvdWdoIGFueSBjb25zdGFudHMgYWxyZWFkeSBpbiB0aGUgXHAgVmlzaXRlZCBzZXQsIGFuZAorICAvLy8gdXBkYXRlcyB0aGF0IHNldCB3aXRoIGV2ZXJ5IGNvbnN0YW50IHZpc2l0ZWQuCisgIC8vLworICAvLy8gRm9yIGVhY2ggZGVmaW5lZCBmdW5jdGlvbiwgY2FsbHMgXHAgQ2FsbGJhY2sgd2l0aCB0aGF0IGZ1bmN0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FsbGJhY2tUPgorICBzdGF0aWMgdm9pZCB2aXNpdFJlZmVyZW5jZXMoU21hbGxWZWN0b3JJbXBsPENvbnN0YW50ICo+ICZXb3JrbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0SW1wbDxDb25zdGFudCAqPiAmVmlzaXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrVCBDYWxsYmFjaykgeworICAgIHdoaWxlICghV29ya2xpc3QuZW1wdHkoKSkgeworICAgICAgQ29uc3RhbnQgKkMgPSBXb3JrbGlzdC5wb3BfYmFja192YWwoKTsKKworICAgICAgaWYgKEZ1bmN0aW9uICpGID0gZHluX2Nhc3Q8RnVuY3Rpb24+KEMpKSB7CisgICAgICAgIGlmICghRi0+aXNEZWNsYXJhdGlvbigpKQorICAgICAgICAgIENhbGxiYWNrKCpGKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChCbG9ja0FkZHJlc3MgKkJBID0gZHluX2Nhc3Q8QmxvY2tBZGRyZXNzPihDKSkgeworICAgICAgICAvLyBUaGUgYmxvY2thZGRyZXNzIGNvbnN0YW50IGV4cHJlc3Npb24gaXMgYSB3ZWlyZCBzcGVjaWFsIGNhc2UsIHdlCisgICAgICAgIC8vIGNhbid0IGdlbmVyaWNhbGx5IHdhbGsgaXRzIG9wZXJhbmRzIHRoZSB3YXkgd2UgZG8gZm9yIGFsbCBvdGhlcgorICAgICAgICAvLyBjb25zdGFudHMuCisgICAgICAgIGlmIChWaXNpdGVkLmluc2VydChCQS0+Z2V0RnVuY3Rpb24oKSkuc2Vjb25kKQorICAgICAgICAgIFdvcmtsaXN0LnB1c2hfYmFjayhCQS0+Z2V0RnVuY3Rpb24oKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBmb3IgKFZhbHVlICpPcCA6IEMtPm9wZXJhbmRfdmFsdWVzKCkpCisgICAgICAgIGlmIChWaXNpdGVkLmluc2VydChjYXN0PENvbnN0YW50PihPcCkpLnNlY29uZCkKKyAgICAgICAgICBXb3JrbGlzdC5wdXNoX2JhY2soY2FzdDxDb25zdGFudD4oT3ApKTsKKyAgICB9CisgIH0KKworICAvLy9AfQorCitwcml2YXRlOgorICB1c2luZyBub2RlX3N0YWNrX2l0ZXJhdG9yID0gU21hbGxWZWN0b3JJbXBsPE5vZGUgKj46OnJldmVyc2VfaXRlcmF0b3I7CisgIHVzaW5nIG5vZGVfc3RhY2tfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxub2RlX3N0YWNrX2l0ZXJhdG9yPjsKKworICAvLy8gQWxsb2NhdG9yIHRoYXQgaG9sZHMgYWxsIHRoZSBjYWxsIGdyYXBoIG5vZGVzLgorICBTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3I8Tm9kZT4gQlBBOworCisgIC8vLyBNYXBzIGZ1bmN0aW9uLT5ub2RlIGZvciBmYXN0IGxvb2t1cC4KKyAgRGVuc2VNYXA8Y29uc3QgRnVuY3Rpb24gKiwgTm9kZSAqPiBOb2RlTWFwOworCisgIC8vLyBUaGUgZW50cnkgZWRnZXMgaW50byB0aGUgZ3JhcGguCisgIC8vLworICAvLy8gVGhlc2UgZWRnZXMgYXJlIGZyb20gImV4dGVybmFsIiBzb3VyY2VzLiBQdXQgYW5vdGhlciB3YXksIHRoZXkKKyAgLy8vIGVzY2FwZSBhdCB0aGUgbW9kdWxlIHNjb3BlLgorICBFZGdlU2VxdWVuY2UgRW50cnlFZGdlczsKKworICAvLy8gQWxsb2NhdG9yIHRoYXQgaG9sZHMgYWxsIHRoZSBjYWxsIGdyYXBoIFNDQ3MuCisgIFNwZWNpZmljQnVtcFB0ckFsbG9jYXRvcjxTQ0M+IFNDQ0JQQTsKKworICAvLy8gTWFwcyBGdW5jdGlvbiAtPiBTQ0MgZm9yIGZhc3QgbG9va3VwLgorICBEZW5zZU1hcDxOb2RlICosIFNDQyAqPiBTQ0NNYXA7CisKKyAgLy8vIEFsbG9jYXRvciB0aGF0IGhvbGRzIGFsbCB0aGUgY2FsbCBncmFwaCBSZWZTQ0NzLgorICBTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3I8UmVmU0NDPiBSZWZTQ0NCUEE7CisKKyAgLy8vIFRoZSBwb3N0LW9yZGVyIHNlcXVlbmNlIG9mIFJlZlNDQ3MuCisgIC8vLworICAvLy8gVGhpcyBsaXN0IGlzIGxhemlseSBmb3JtZWQgdGhlIGZpcnN0IHRpbWUgd2Ugd2FsayB0aGUgZ3JhcGguCisgIFNtYWxsVmVjdG9yPFJlZlNDQyAqLCAxNj4gUG9zdE9yZGVyUmVmU0NDczsKKworICAvLy8gQSBtYXAgZnJvbSBSZWZTQ0MgdG8gdGhlIGluZGV4IGZvciBpdCBpbiB0aGUgcG9zdG9yZGVyIHNlcXVlbmNlIG9mCisgIC8vLyBSZWZTQ0NzLgorICBEZW5zZU1hcDxSZWZTQ0MgKiwgaW50PiBSZWZTQ0NJbmRpY2VzOworCisgIC8vLyBEZWZpbmVkIGZ1bmN0aW9ucyB0aGF0IGFyZSBhbHNvIGtub3duIGxpYnJhcnkgZnVuY3Rpb25zIHdoaWNoIHRoZQorICAvLy8gb3B0aW1pemVyIGNhbiByZWFzb24gYWJvdXQgYW5kIHRoZXJlZm9yZSBtaWdodCBpbnRyb2R1Y2UgY2FsbHMgdG8gb3V0IG9mCisgIC8vLyB0aGluIGFpci4KKyAgU21hbGxTZXRWZWN0b3I8RnVuY3Rpb24gKiwgND4gTGliRnVuY3Rpb25zOworCisgIC8vLyBIZWxwZXIgdG8gaW5zZXJ0IGEgbmV3IGZ1bmN0aW9uLCB3aXRoIGFuIGFscmVhZHkgbG9va2VkLXVwIGVudHJ5IGluCisgIC8vLyB0aGUgTm9kZU1hcC4KKyAgTm9kZSAmaW5zZXJ0SW50byhGdW5jdGlvbiAmRiwgTm9kZSAqJk1hcHBlZE4pOworCisgIC8vLyBIZWxwZXIgdG8gdXBkYXRlIHBvaW50ZXJzIGJhY2sgdG8gdGhlIGdyYXBoIG9iamVjdCBkdXJpbmcgbW92ZXMuCisgIHZvaWQgdXBkYXRlR3JhcGhQdHJzKCk7CisKKyAgLy8vIEFsbG9jYXRlcyBhbiBTQ0MgYW5kIGNvbnN0cnVjdHMgaXQgdXNpbmcgdGhlIGdyYXBoIGFsbG9jYXRvci4KKyAgLy8vCisgIC8vLyBUaGUgYXJndW1lbnRzIGFyZSBmb3J3YXJkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHM+IFNDQyAqY3JlYXRlU0NDKFRzICYmLi4uIEFyZ3MpIHsKKyAgICByZXR1cm4gbmV3IChTQ0NCUEEuQWxsb2NhdGUoKSkgU0NDKHN0ZDo6Zm9yd2FyZDxUcz4oQXJncykuLi4pOworICB9CisKKyAgLy8vIEFsbG9jYXRlcyBhIFJlZlNDQyBhbmQgY29uc3RydWN0cyBpdCB1c2luZyB0aGUgZ3JhcGggYWxsb2NhdG9yLgorICAvLy8KKyAgLy8vIFRoZSBhcmd1bWVudHMgYXJlIGZvcndhcmRlZCB0byB0aGUgY29uc3RydWN0b3IuCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUcz4gUmVmU0NDICpjcmVhdGVSZWZTQ0MoVHMgJiYuLi4gQXJncykgeworICAgIHJldHVybiBuZXcgKFJlZlNDQ0JQQS5BbGxvY2F0ZSgpKSBSZWZTQ0Moc3RkOjpmb3J3YXJkPFRzPihBcmdzKS4uLik7CisgIH0KKworICAvLy8gQ29tbW9uIGxvZ2ljIGZvciBidWlsZGluZyBTQ0NzIGZyb20gYSBzZXF1ZW5jZSBvZiByb290cy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGEgdmVyeSBnZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBkZXB0aC1maXJzdCB3YWxrIGFuZCBTQ0MKKyAgLy8vIGZvcm1hdGlvbiBhbGdvcml0aG0uIEl0IHVzZXMgYSBnZW5lcmljIHNlcXVlbmNlIG9mIHJvb3RzIGFuZCBnZW5lcmljCisgIC8vLyBjYWxsYmFja3MgZm9yIGVhY2ggc3RlcC4gVGhpcyBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIHRvIGltcGxlbWVudCBib3RoCisgIC8vLyB0aGUgUmVmU0NDIGZvcm1hdGlvbiBhbmQgU0NDIGZvcm1hdGlvbiB3aXRoIHNoYXJlZCBsb2dpYy4KKyAgLy8vCisgIC8vLyBDdXJyZW50bHkgdGhpcyBpcyBhIHJlbGF0aXZlbHkgbmFpdmUgaW1wbGVtZW50YXRpb24gb2YgVGFyamFuJ3MgREZTCisgIC8vLyBhbGdvcml0aG0gdG8gZm9ybSB0aGUgU0NDcy4KKyAgLy8vCisgIC8vLyBGSVhNRTogV2Ugc2hvdWxkIGNvbnNpZGVyIG5ld2VyIHZhcmlhbnRzIHN1Y2ggYXMgTnV1dGlsYS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJvb3RzVCwgdHlwZW5hbWUgR2V0QmVnaW5ULCB0eXBlbmFtZSBHZXRFbmRULAorICAgICAgICAgICAgdHlwZW5hbWUgR2V0Tm9kZVQsIHR5cGVuYW1lIEZvcm1TQ0NDYWxsYmFja1Q+CisgIHN0YXRpYyB2b2lkIGJ1aWxkR2VuZXJpY1NDQ3MoUm9vdHNUICYmUm9vdHMsIEdldEJlZ2luVCAmJkdldEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEVuZFQgJiZHZXRFbmQsIEdldE5vZGVUICYmR2V0Tm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtU0NDQ2FsbGJhY2tUICYmRm9ybVNDQyk7CisKKyAgLy8vIEJ1aWxkIHRoZSBTQ0NzIGZvciBhIFJlZlNDQyBvdXQgb2YgYSBsaXN0IG9mIG5vZGVzLgorICB2b2lkIGJ1aWxkU0NDcyhSZWZTQ0MgJlJDLCBub2RlX3N0YWNrX3JhbmdlIE5vZGVzKTsKKworICAvLy8gR2V0IHRoZSBpbmRleCBvZiBhIFJlZlNDQyB3aXRoaW4gdGhlIHBvc3RvcmRlciB0cmF2ZXJzYWwuCisgIC8vLworICAvLy8gUmVxdWlyZXMgdGhhdCB0aGlzIFJlZlNDQyBpcyBhIHZhbGlkIG9uZSBpbiB0aGUgKHBlcmhhcHMgcGFydGlhbCkKKyAgLy8vIHBvc3RvcmRlciB0cmF2ZXJzZWQgcGFydCBvZiB0aGUgZ3JhcGguCisgIGludCBnZXRSZWZTQ0NJbmRleChSZWZTQ0MgJlJDKSB7CisgICAgYXV0byBJbmRleEl0ID0gUmVmU0NDSW5kaWNlcy5maW5kKCZSQyk7CisgICAgYXNzZXJ0KEluZGV4SXQgIT0gUmVmU0NDSW5kaWNlcy5lbmQoKSAmJiAiUmVmU0NDIGRvZXNuJ3QgaGF2ZSBhbiBpbmRleCEiKTsKKyAgICBhc3NlcnQoUG9zdE9yZGVyUmVmU0NDc1tJbmRleEl0LT5zZWNvbmRdID09ICZSQyAmJgorICAgICAgICAgICAiSW5kZXggZG9lcyBub3QgcG9pbnQgYmFjayBhdCBSQyEiKTsKKyAgICByZXR1cm4gSW5kZXhJdC0+c2Vjb25kOworICB9Cit9OworCitpbmxpbmUgTGF6eUNhbGxHcmFwaDo6RWRnZTo6RWRnZSgpIDogVmFsdWUoKSB7fQoraW5saW5lIExhenlDYWxsR3JhcGg6OkVkZ2U6OkVkZ2UoTm9kZSAmTiwgS2luZCBLKSA6IFZhbHVlKCZOLCBLKSB7fQorCitpbmxpbmUgTGF6eUNhbGxHcmFwaDo6RWRnZTo6b3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKKyAgcmV0dXJuIFZhbHVlLmdldFBvaW50ZXIoKSAmJiAhVmFsdWUuZ2V0UG9pbnRlcigpLT5pc0RlYWQoKTsKK30KKworaW5saW5lIExhenlDYWxsR3JhcGg6OkVkZ2U6OktpbmQgTGF6eUNhbGxHcmFwaDo6RWRnZTo6Z2V0S2luZCgpIGNvbnN0IHsKKyAgYXNzZXJ0KCp0aGlzICYmICJRdWVyaWVkIGEgbnVsbCBlZGdlISIpOworICByZXR1cm4gVmFsdWUuZ2V0SW50KCk7Cit9CisKK2lubGluZSBib29sIExhenlDYWxsR3JhcGg6OkVkZ2U6OmlzQ2FsbCgpIGNvbnN0IHsKKyAgYXNzZXJ0KCp0aGlzICYmICJRdWVyaWVkIGEgbnVsbCBlZGdlISIpOworICByZXR1cm4gZ2V0S2luZCgpID09IENhbGw7Cit9CisKK2lubGluZSBMYXp5Q2FsbEdyYXBoOjpOb2RlICZMYXp5Q2FsbEdyYXBoOjpFZGdlOjpnZXROb2RlKCkgY29uc3QgeworICBhc3NlcnQoKnRoaXMgJiYgIlF1ZXJpZWQgYSBudWxsIGVkZ2UhIik7CisgIHJldHVybiAqVmFsdWUuZ2V0UG9pbnRlcigpOworfQorCitpbmxpbmUgRnVuY3Rpb24gJkxhenlDYWxsR3JhcGg6OkVkZ2U6OmdldEZ1bmN0aW9uKCkgY29uc3QgeworICBhc3NlcnQoKnRoaXMgJiYgIlF1ZXJpZWQgYSBudWxsIGVkZ2UhIik7CisgIHJldHVybiBnZXROb2RlKCkuZ2V0RnVuY3Rpb24oKTsKK30KKworLy8gUHJvdmlkZSBHcmFwaFRyYWl0cyBzcGVjaWFsaXphdGlvbnMgZm9yIGNhbGwgZ3JhcGhzLgordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPExhenlDYWxsR3JhcGg6Ok5vZGUgKj4geworICB1c2luZyBOb2RlUmVmID0gTGF6eUNhbGxHcmFwaDo6Tm9kZSAqOworICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9IExhenlDYWxsR3JhcGg6OkVkZ2VTZXF1ZW5jZTo6aXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKE5vZGVSZWYgTikgeyByZXR1cm4gTjsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7IHJldHVybiAoKk4pLT5iZWdpbigpOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiAoKk4pLT5lbmQoKTsgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxMYXp5Q2FsbEdyYXBoICo+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IExhenlDYWxsR3JhcGg6Ok5vZGUgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBMYXp5Q2FsbEdyYXBoOjpFZGdlU2VxdWVuY2U6Oml0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShOb2RlUmVmIE4pIHsgcmV0dXJuIE47IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeyByZXR1cm4gKCpOKS0+YmVnaW4oKTsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gKCpOKS0+ZW5kKCk7IH0KK307CisKKy8vLyBBbiBhbmFseXNpcyBwYXNzIHdoaWNoIGNvbXB1dGVzIHRoZSBjYWxsIGdyYXBoIGZvciBhIG1vZHVsZS4KK2NsYXNzIExhenlDYWxsR3JhcGhBbmFseXNpcyA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjxMYXp5Q2FsbEdyYXBoQW5hbHlzaXM+IHsKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPExhenlDYWxsR3JhcGhBbmFseXNpcz47CisKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICAvLy8gSW5mb3JtIGdlbmVyaWMgY2xpZW50cyBvZiB0aGUgcmVzdWx0IHR5cGUuCisgIHVzaW5nIFJlc3VsdCA9IExhenlDYWxsR3JhcGg7CisKKyAgLy8vIENvbXB1dGUgdGhlIFxjIExhenlDYWxsR3JhcGggZm9yIHRoZSBtb2R1bGUgXGMgTS4KKyAgLy8vCisgIC8vLyBUaGlzIGp1c3QgYnVpbGRzIHRoZSBzZXQgb2YgZW50cnkgcG9pbnRzIHRvIHRoZSBjYWxsIGdyYXBoLiBUaGUgcmVzdCBpcworICAvLy8gYnVpbHQgbGF6aWx5IGFzIGl0IGlzIHdhbGtlZC4KKyAgTGF6eUNhbGxHcmFwaCBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJkFNKSB7CisgICAgcmV0dXJuIExhenlDYWxsR3JhcGgoTSwgQU0uZ2V0UmVzdWx0PFRhcmdldExpYnJhcnlBbmFseXNpcz4oTSkpOworICB9Cit9OworCisvLy8gQSBwYXNzIHdoaWNoIHByaW50cyB0aGUgY2FsbCBncmFwaCB0byBhIFxjIHJhd19vc3RyZWFtLgorLy8vCisvLy8gVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciB0ZXN0aW5nIHRoZSBhbmFseXNpcy4KK2NsYXNzIExhenlDYWxsR3JhcGhQcmludGVyUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48TGF6eUNhbGxHcmFwaFByaW50ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKworcHVibGljOgorICBleHBsaWNpdCBMYXp5Q2FsbEdyYXBoUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TKTsKKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBBIHBhc3Mgd2hpY2ggcHJpbnRzIHRoZSBjYWxsIGdyYXBoIGFzIGEgRE9UIGZpbGUgdG8gYSBcYyByYXdfb3N0cmVhbS4KKy8vLworLy8vIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgdmlzdWFsaXphdGlvbiBwdXJwb3Nlcy4KK2NsYXNzIExhenlDYWxsR3JhcGhET1RQcmludGVyUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48TGF6eUNhbGxHcmFwaERPVFByaW50ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKworcHVibGljOgorICBleHBsaWNpdCBMYXp5Q2FsbEdyYXBoRE9UUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TKTsKKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0xBWllDQUxMR1JBUEhfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9MYXp5VmFsdWVJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xhenlWYWx1ZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWE1YmYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9MYXp5VmFsdWVJbmZvLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8vPT09LSBMYXp5VmFsdWVJbmZvLmggLSBWYWx1ZSBjb25zdHJhaW50IGFuYWx5c2lzIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSBmb3IgbGF6eSBjb21wdXRhdGlvbiBvZiB2YWx1ZSBjb25zdHJhaW50CisvLyBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTEFaWVZBTFVFSU5GT19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTEFaWVZBTFVFSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQXNzdW1wdGlvbkNhY2hlOworICBjbGFzcyBDb25zdGFudDsKKyAgY2xhc3MgQ29uc3RhbnRSYW5nZTsKKyAgY2xhc3MgRGF0YUxheW91dDsKKyAgY2xhc3MgRG9taW5hdG9yVHJlZTsKKyAgY2xhc3MgSW5zdHJ1Y3Rpb247CisgIGNsYXNzIFRhcmdldExpYnJhcnlJbmZvOworICBjbGFzcyBWYWx1ZTsKKworLy8vIFRoaXMgcGFzcyBjb21wdXRlcywgY2FjaGVzLCBhbmQgdmVuZHMgbGF6eSB2YWx1ZSBjb25zdHJhaW50IGluZm9ybWF0aW9uLgorY2xhc3MgTGF6eVZhbHVlSW5mbyB7CisgIGZyaWVuZCBjbGFzcyBMYXp5VmFsdWVJbmZvV3JhcHBlclBhc3M7CisgIEFzc3VtcHRpb25DYWNoZSAqQUMgPSBudWxscHRyOworICBjb25zdCBEYXRhTGF5b3V0ICpETCA9IG51bGxwdHI7CisgIGNsYXNzIFRhcmdldExpYnJhcnlJbmZvICpUTEkgPSBudWxscHRyOworICBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHI7CisgIHZvaWQgKlBJbXBsID0gbnVsbHB0cjsKKyAgTGF6eVZhbHVlSW5mbyhjb25zdCBMYXp5VmFsdWVJbmZvJikgPSBkZWxldGU7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IExhenlWYWx1ZUluZm8mKSA9IGRlbGV0ZTsKK3B1YmxpYzoKKyAgfkxhenlWYWx1ZUluZm8oKTsKKyAgTGF6eVZhbHVlSW5mbygpIHt9CisgIExhenlWYWx1ZUluZm8oQXNzdW1wdGlvbkNhY2hlICpBQ18sIGNvbnN0IERhdGFMYXlvdXQgKkRMXywgVGFyZ2V0TGlicmFyeUluZm8gKlRMSV8sCisgICAgICAgICAgICAgICAgRG9taW5hdG9yVHJlZSAqRFRfKQorICAgICAgOiBBQyhBQ18pLCBETChETF8pLCBUTEkoVExJXyksIERUKERUXykge30KKyAgTGF6eVZhbHVlSW5mbyhMYXp5VmFsdWVJbmZvICYmQXJnKQorICAgICAgOiBBQyhBcmcuQUMpLCBETChBcmcuREwpLCBUTEkoQXJnLlRMSSksIERUKEFyZy5EVCksIFBJbXBsKEFyZy5QSW1wbCkgeworICAgIEFyZy5QSW1wbCA9IG51bGxwdHI7CisgIH0KKyAgTGF6eVZhbHVlSW5mbyAmb3BlcmF0b3I9KExhenlWYWx1ZUluZm8gJiZBcmcpIHsKKyAgICByZWxlYXNlTWVtb3J5KCk7CisgICAgQUMgPSBBcmcuQUM7CisgICAgREwgPSBBcmcuREw7CisgICAgVExJID0gQXJnLlRMSTsKKyAgICBEVCA9IEFyZy5EVDsKKyAgICBQSW1wbCA9IEFyZy5QSW1wbDsKKyAgICBBcmcuUEltcGwgPSBudWxscHRyOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gcmV0dXJuIHRydWUvZmFsc2UvZHVubm8gcmVzdWx0cy4KKyAgZW51bSBUcmlzdGF0ZSB7CisgICAgVW5rbm93biA9IC0xLCBGYWxzZSA9IDAsIFRydWUgPSAxCisgIH07CisKKyAgLy8gUHVibGljIHF1ZXJ5IGludGVyZmFjZS4KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZSBjb21wYXJpc29uIHdpdGggYSBjb25zdGFudCBpcyBrbm93bgorICAvLy8gdG8gYmUgdHJ1ZSBvciBmYWxzZSBvbiB0aGUgc3BlY2lmaWVkIENGRyBlZGdlLgorICAvLy8gUHJlZCBpcyBhIENtcEluc3QgcHJlZGljYXRlLgorICBUcmlzdGF0ZSBnZXRQcmVkaWNhdGVPbkVkZ2UodW5zaWduZWQgUHJlZCwgVmFsdWUgKlYsIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqRnJvbUJCLCBCYXNpY0Jsb2NrICpUb0JCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyKTsKKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZSBjb21wYXJpc29uIHdpdGggYSBjb25zdGFudCBpcyBrbm93bgorICAvLy8gdG8gYmUgdHJ1ZSBvciBmYWxzZSBhdCB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uCisgIC8vLyAoZnJvbSBhbiBhc3N1bWUgaW50cmluc2ljKS4gUHJlZCBpcyBhIENtcEluc3QgcHJlZGljYXRlLgorICBUcmlzdGF0ZSBnZXRQcmVkaWNhdGVBdCh1bnNpZ25lZCBQcmVkLCBWYWx1ZSAqViwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpDeHRJKTsKKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBrbm93biB0byBiZSBhCisgIC8vLyBjb25zdGFudCBhdCB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2suICBSZXR1cm4gbnVsbCBpZiBub3QuCisgIENvbnN0YW50ICpnZXRDb25zdGFudChWYWx1ZSAqViwgQmFzaWNCbG9jayAqQkIsIEluc3RydWN0aW9uICpDeHRJID0gbnVsbHB0cik7CisKKyAgLy8vIFJldHVybiB0aGUgQ29uc3RhbnRSYW5nZSBjb25zdHJhaW50IHRoYXQgaXMga25vd24gdG8gaG9sZCBmb3IgdGhlCisgIC8vLyBzcGVjaWZpZWQgdmFsdWUgYXQgdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIGJsb2NrLiBUaGlzIG1heSBvbmx5IGJlIGNhbGxlZAorICAvLy8gb24gaW50ZWdlci10eXBlZCBWYWx1ZXMuCisgIENvbnN0YW50UmFuZ2UgZ2V0Q29uc3RhbnRSYW5nZShWYWx1ZSAqViwgQmFzaWNCbG9jayAqQkIsIEluc3RydWN0aW9uICpDeHRJID0gbnVsbHB0cik7CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMga25vd24gdG8gYmUgYQorICAvLy8gY29uc3RhbnQgb24gdGhlIHNwZWNpZmllZCBlZGdlLiAgUmV0dXJuIG51bGwgaWYgbm90LgorICBDb25zdGFudCAqZ2V0Q29uc3RhbnRPbkVkZ2UoVmFsdWUgKlYsIEJhc2ljQmxvY2sgKkZyb21CQiwgQmFzaWNCbG9jayAqVG9CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpDeHRJID0gbnVsbHB0cik7CisKKyAgLy8vIFJldHVybiB0aGUgQ29uc3RhbnRSYWdlIGNvbnN0cmFpbnQgdGhhdCBpcyBrbm93biB0byBob2xkIGZvciB0aGUKKyAgLy8vIHNwZWNpZmllZCB2YWx1ZSBvbiB0aGUgc3BlY2lmaWVkIGVkZ2UuIFRoaXMgbWF5IGJlIG9ubHkgYmUgY2FsbGVkCisgIC8vLyBvbiBpbnRlZ2VyLXR5cGVkIFZhbHVlcy4KKyAgQ29uc3RhbnRSYW5nZSBnZXRDb25zdGFudFJhbmdlT25FZGdlKFZhbHVlICpWLCBCYXNpY0Jsb2NrICpGcm9tQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpUb0JCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyKTsKKworICAvLy8gSW5mb3JtIHRoZSBhbmFseXNpcyBjYWNoZSB0aGF0IHdlIGhhdmUgdGhyZWFkZWQgYW4gZWRnZSBmcm9tCisgIC8vLyBQcmVkQkIgdG8gT2xkU3VjYyB0byBiZSBmcm9tIFByZWRCQiB0byBOZXdTdWNjIGluc3RlYWQuCisgIHZvaWQgdGhyZWFkRWRnZShCYXNpY0Jsb2NrICpQcmVkQkIsIEJhc2ljQmxvY2sgKk9sZFN1Y2MsIEJhc2ljQmxvY2sgKk5ld1N1Y2MpOworCisgIC8vLyBJbmZvcm0gdGhlIGFuYWx5c2lzIGNhY2hlIHRoYXQgd2UgaGF2ZSBlcmFzZWQgYSBibG9jay4KKyAgdm9pZCBlcmFzZUJsb2NrKEJhc2ljQmxvY2sgKkJCKTsKKworICAvLy8gUHJpbnQgdGhlIFxMYXp5VmFsdWVJbmZvIEFuYWx5c2lzLgorICAvLy8gV2UgcGFzcyBpbiB0aGUgRFRyZWUgdGhhdCBpcyByZXF1aXJlZCBmb3IgaWRlbnRpZnlpbmcgd2hpY2ggYmFzaWMgYmxvY2tzCisgIC8vLyB3ZSBjYW4gc29sdmUvcHJpbnQgZm9yLCBpbiB0aGUgTFZJUHJpbnRlci4gVGhlIERUIGlzIG9wdGlvbmFsCisgIC8vLyBpbiBMVkksIHNvIHdlIG5lZWQgdG8gcGFzcyBpdCBoZXJlIGFzIGFuIGFyZ3VtZW50LgorICB2b2lkIHByaW50TFZJKEZ1bmN0aW9uICZGLCBEb21pbmF0b3JUcmVlICZEVHJlZSwgcmF3X29zdHJlYW0gJk9TKTsKKworICAvLy8gRGlzYWJsZXMgdXNlIG9mIHRoZSBEb21pbmF0b3JUcmVlIHdpdGhpbiBMVkkuCisgIHZvaWQgZGlzYWJsZURUKCk7CisKKyAgLy8vIEVuYWJsZXMgdXNlIG9mIHRoZSBEb21pbmF0b3JUcmVlIHdpdGhpbiBMVkkuIERvZXMgbm90aGluZyBpZiB0aGUgY2xhc3MKKyAgLy8vIGluc3RhbmNlIHdhcyBpbml0aWFsaXplZCB3aXRob3V0IGEgRFQgcG9pbnRlci4KKyAgdm9pZCBlbmFibGVEVCgpOworCisgIC8vIEZvciBvbGQgUE0gcGFzcy4gRGVsZXRlIG9uY2UgTGF6eVZhbHVlSW5mb1dyYXBwZXJQYXNzIGlzIGdvbmUuCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpOworCisgIC8vLyBIYW5kbGUgaW52YWxpZGF0aW9uIGV2ZW50cyBpbiB0aGUgbmV3IHBhc3MgbWFuYWdlci4KKyAgYm9vbCBpbnZhbGlkYXRlKEZ1bmN0aW9uICZGLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmUEEsCisgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJkludik7Cit9OworCisvLy8gXGJyaWVmIEFuYWx5c2lzIHRvIGNvbXB1dGUgbGF6eSB2YWx1ZSBpbmZvcm1hdGlvbi4KK2NsYXNzIExhenlWYWx1ZUFuYWx5c2lzIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPExhenlWYWx1ZUFuYWx5c2lzPiB7CitwdWJsaWM6CisgIHR5cGVkZWYgTGF6eVZhbHVlSW5mbyBSZXN1bHQ7CisgIFJlc3VsdCBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZGQU0pOworCitwcml2YXRlOgorICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworICBmcmllbmQgc3RydWN0IEFuYWx5c2lzSW5mb01peGluPExhenlWYWx1ZUFuYWx5c2lzPjsKK307CisKKy8vLyBXcmFwcGVyIGFyb3VuZCBMYXp5VmFsdWVJbmZvLgorY2xhc3MgTGF6eVZhbHVlSW5mb1dyYXBwZXJQYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgIExhenlWYWx1ZUluZm9XcmFwcGVyUGFzcyhjb25zdCBMYXp5VmFsdWVJbmZvV3JhcHBlclBhc3MmKSA9IGRlbGV0ZTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTGF6eVZhbHVlSW5mb1dyYXBwZXJQYXNzJikgPSBkZWxldGU7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworICBMYXp5VmFsdWVJbmZvV3JhcHBlclBhc3MoKSA6IEZ1bmN0aW9uUGFzcyhJRCkgeworICAgIGluaXRpYWxpemVMYXp5VmFsdWVJbmZvV3JhcHBlclBhc3NQYXNzKCpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpKTsKKyAgfQorICB+TGF6eVZhbHVlSW5mb1dyYXBwZXJQYXNzKCkgb3ZlcnJpZGUgeworICAgIGFzc2VydCghSW5mby5QSW1wbCAmJiAicmVsZWFzZU1lbW9yeSBub3QgY2FsbGVkIik7CisgIH0KKworICBMYXp5VmFsdWVJbmZvICZnZXRMVkkoKTsKKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZTsKK3ByaXZhdGU6CisgIExhenlWYWx1ZUluZm8gSW5mbzsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9MaW50LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzg4YjEzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9MaW50LmgKQEAgLTAsMCArMSw0OSBAQAorLy89PT0tLSBsbHZtL0FuYWx5c2lzL0xpbnQuaCAtIExMVk0gSVIgTGludCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBsaW50IGludGVyZmFjZXMgdGhhdCBjYW4gYmUgdXNlZCBmb3Igc29tZSBzYW5pdHkgY2hlY2tpbmcKKy8vIG9mIGlucHV0IHRvIHRoZSBzeXN0ZW0sIGFuZCBmb3IgY2hlY2tpbmcgdGhhdCB0cmFuc2Zvcm1hdGlvbnMKKy8vIGhhdmVuJ3QgZG9uZSBzb21ldGhpbmcgYmFkLiBJbiBjb250cmFzdCB0byB0aGUgVmVyaWZpZXIsIHRoZSBMaW50IGNoZWNrZXIKKy8vIGNoZWNrcyBmb3IgdW5kZWZpbmVkIGJlaGF2aW9yIG9yIGNvbnN0cnVjdGlvbnMgd2l0aCBsaWtlbHkgdW5pbnRlbmRlZAorLy8gYmVoYXZpb3IuCisvLworLy8gVG8gc2VlIHdoYXQgc3BlY2lmaWNhbGx5IGlzIGNoZWNrZWQsIGxvb2sgYXQgTGludC5jcHAKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTElOVF9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTElOVF9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb25QYXNzOworY2xhc3MgTW9kdWxlOworY2xhc3MgRnVuY3Rpb247CisKKy8vLyBAYnJpZWYgQ3JlYXRlIGEgbGludCBwYXNzLgorLy8vCisvLy8gQ2hlY2sgYSBtb2R1bGUgb3IgZnVuY3Rpb24uCitGdW5jdGlvblBhc3MgKmNyZWF0ZUxpbnRQYXNzKCk7CisKKy8vLyBAYnJpZWYgQ2hlY2sgYSBtb2R1bGUuCisvLy8KKy8vLyBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGRlYnVnZ2luZywgYmVjYXVzZSBpdCBwbGF5cyBnYW1lcyB3aXRoCisvLy8gUGFzc01hbmFnZXJzIGFuZCBzdHVmZi4KK3ZvaWQgbGludE1vZHVsZSgKKyAgY29uc3QgTW9kdWxlICZNICAgIC8vLzwgVGhlIG1vZHVsZSB0byBiZSBjaGVja2VkCispOworCisvLyBsaW50RnVuY3Rpb24gLSBDaGVjayBhIGZ1bmN0aW9uLgordm9pZCBsaW50RnVuY3Rpb24oCisgIGNvbnN0IEZ1bmN0aW9uICZGICAvLy88IFRoZSBmdW5jdGlvbiB0byBiZSBjaGVja2VkCispOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9hZHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9hZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTEwYzI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb2Fkcy5oCkBAIC0wLDAgKzEsMTMwIEBACisvLz09PS0gTG9hZHMuaCAtIExvY2FsIGxvYWQgYW5hbHlzaXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBzaW1wbGUgbG9jYWwgYW5hbHlzZXMgZm9yIGxvYWQgaW5zdHJ1Y3Rpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19MT0FEU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTE9BRFNfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIE1ETm9kZTsKKworLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYWx3YXlzIGEgZGVyZWZlcmVuY2VhYmxlIHBvaW50ZXIuIElmIHRoZSBjb250ZXh0CisvLy8gaW5zdHJ1Y3Rpb24gaXMgc3BlY2lmaWVkIHBlcmZvcm0gY29udGV4dC1zZW5zaXRpdmUgYW5hbHlzaXMgYW5kIHJldHVybiB0cnVlCisvLy8gaWYgdGhlIHBvaW50ZXIgaXMgZGVyZWZlcmVuY2VhYmxlIGF0IHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCitib29sIGlzRGVyZWZlcmVuY2VhYmxlUG9pbnRlcihjb25zdCBWYWx1ZSAqViwgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqQ3R4SSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIpOworCisvLy8gUmV0dXJucyB0cnVlIGlmIFYgaXMgYWx3YXlzIGEgZGVyZWZlcmVuY2VhYmxlIHBvaW50ZXIgd2l0aCBhbGlnbm1lbnQKKy8vLyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gcmVxdWVzdGVkLiBJZiB0aGUgY29udGV4dCBpbnN0cnVjdGlvbiBpcyBzcGVjaWZpZWQKKy8vLyBwZXJmb3JtcyBjb250ZXh0LXNlbnNpdGl2ZSBhbmFseXNpcyBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBwb2ludGVyIGlzCisvLy8gZGVyZWZlcmVuY2VhYmxlIGF0IHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCitib29sIGlzRGVyZWZlcmVuY2VhYmxlQW5kQWxpZ25lZFBvaW50ZXIoY29uc3QgVmFsdWUgKlYsIHVuc2lnbmVkIEFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpDdHhJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIpOworCisvLy8gUmV0dXJucyB0cnVlIGlmIFYgaXMgYWx3YXlzIGRlcmVmZXJlbmNlYWJsZSBmb3IgU2l6ZSBieXRlIHdpdGggYWxpZ25tZW50CisvLy8gZ3JlYXRlciBvciBlcXVhbCB0aGFuIHJlcXVlc3RlZC4gSWYgdGhlIGNvbnRleHQgaW5zdHJ1Y3Rpb24gaXMgc3BlY2lmaWVkCisvLy8gcGVyZm9ybXMgY29udGV4dC1zZW5zaXRpdmUgYW5hbHlzaXMgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcG9pbnRlciBpcworLy8vIGRlcmVmZXJlbmNlYWJsZSBhdCB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLgorYm9vbCBpc0RlcmVmZXJlbmNlYWJsZUFuZEFsaWduZWRQb2ludGVyKGNvbnN0IFZhbHVlICpWLCB1bnNpZ25lZCBBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEludCAmU2l6ZSwgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkN0eEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cik7CisKKy8vLyBSZXR1cm4gdHJ1ZSBpZiB3ZSBrbm93IHRoYXQgZXhlY3V0aW5nIGEgbG9hZCBmcm9tIHRoaXMgdmFsdWUgY2Fubm90IHRyYXAuCisvLy8KKy8vLyBJZiBEVCBhbmQgU2NhbkZyb20gYXJlIHNwZWNpZmllZCB0aGlzIG1ldGhvZCBwZXJmb3JtcyBjb250ZXh0LXNlbnNpdGl2ZQorLy8vIGFuYWx5c2lzIGFuZCByZXR1cm5zIHRydWUgaWYgaXQgaXMgc2FmZSB0byBsb2FkIGltbWVkaWF0ZWx5IGJlZm9yZSBTY2FuRnJvbS4KKy8vLworLy8vIElmIGl0IGlzIG5vdCBvYnZpb3VzbHkgc2FmZSB0byBsb2FkIGZyb20gdGhlIHNwZWNpZmllZCBwb2ludGVyLCB3ZSBkbyBhCisvLy8gcXVpY2sgbG9jYWwgc2NhbiBvZiB0aGUgYmFzaWMgYmxvY2sgY29udGFpbmluZyBTY2FuRnJvbSwgdG8gZGV0ZXJtaW5lIGlmCisvLy8gdGhlIGFkZHJlc3MgaXMgYWxyZWFkeSBhY2Nlc3NlZC4KK2Jvb2wgaXNTYWZlVG9Mb2FkVW5jb25kaXRpb25hbGx5KFZhbHVlICpWLCB1bnNpZ25lZCBBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKlNjYW5Gcm9tID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cik7CisKKy8vLyBUaGUgZGVmYXVsdCBudW1iZXIgb2YgbWF4aW11bSBpbnN0cnVjdGlvbnMgdG8gc2NhbiBpbiB0aGUgYmxvY2ssIHVzZWQgYnkKKy8vLyBGaW5kQXZhaWxhYmxlTG9hZGVkVmFsdWUoKS4KK2V4dGVybiBjbDo6b3B0PHVuc2lnbmVkPiBEZWZNYXhJbnN0c1RvU2NhbjsKKworLy8vIFNjYW4gYmFja3dhcmRzIHRvIHNlZSBpZiB3ZSBoYXZlIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gbG9hZCBhdmFpbGFibGUKKy8vLyBsb2NhbGx5IHdpdGhpbiBhIHNtYWxsIG51bWJlciBvZiBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBZb3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHNjYW4gYWNyb3NzIG11bHRpcGxlIGJsb2NrczogYWZ0ZXIgeW91IGNhbGwKKy8vLyB0aGlzIGZ1bmN0aW9uLCBpZiBTY2FuRnJvbSBwb2ludHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2ssIGl0J3Mgc2FmZQorLy8vIHRvIGNvbnRpbnVlIHNjYW5uaW5nIHRoZSBwcmVkZWNlc3NvcnMuCisvLy8KKy8vLyBOb3RlIHRoYXQgcGVyZm9ybWluZyBsb2FkIENTRSByZXF1aXJlcyBzcGVjaWFsIGNhcmUgdG8gbWFrZSBzdXJlIHRoZQorLy8vIG1ldGFkYXRhIGlzIHNldCBhcHByb3ByaWF0ZWx5LiAgSW4gcGFydGljdWxhciwgYWxpYXNpbmcgbWV0YWRhdGEgbmVlZHMKKy8vLyB0byBiZSBtZXJnZWQuICAoVGhpcyBkb2Vzbid0IG1hdHRlciBmb3Igc3RvcmUtdG8tbG9hZCBmb3J3YXJkaW5nIGJlY2F1c2UKKy8vLyB0aGUgb25seSByZWxldmFudCBsb2FkIGdldHMgZGVsZXRlZC4pCisvLy8KKy8vLyBccGFyYW0gTG9hZCBUaGUgbG9hZCB3ZSB3YW50IHRvIHJlcGxhY2UuCisvLy8gXHBhcmFtIFNjYW5CQiBUaGUgYmFzaWMgYmxvY2sgdG8gc2Nhbi4KKy8vLyBccGFyYW0gW2luLG91dF0gU2NhbkZyb20gVGhlIGxvY2F0aW9uIHRvIHN0YXJ0IHNjYW5uaW5nIGZyb20uIFdoZW4gdGhpcworLy8vIGZ1bmN0aW9uIHJldHVybnMsIGl0IHBvaW50cyBhdCB0aGUgbGFzdCBpbnN0cnVjdGlvbiBzY2FubmVkLgorLy8vIFxwYXJhbSBNYXhJbnN0c1RvU2NhbiBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRvIHNjYW4uIElmIHRoaXMKKy8vLyBpcyB6ZXJvLCB0aGUgd2hvbGUgYmxvY2sgd2lsbCBiZSBzY2FubmVkLgorLy8vIFxwYXJhbSBBQSBPcHRpb25hbCBwb2ludGVyIHRvIGFsaWFzIGFuYWx5c2lzLCB0byBtYWtlIHRoZSBzY2FuIG1vcmUKKy8vLyBwcmVjaXNlLgorLy8vIFxwYXJhbSBbb3V0XSBJc0xvYWRDU0UgV2hldGhlciB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgYSBsb2FkIGZyb20gdGhlIHNhbWUKKy8vLyBsb2NhdGlvbiBpbiBtZW1vcnksIGFzIG9wcG9zZWQgdG8gdGhlIHZhbHVlIG9wZXJhbmQgb2YgYSBzdG9yZS4KKy8vLworLy8vIFxyZXR1cm5zIFRoZSBmb3VuZCB2YWx1ZSwgb3IgbnVsbHB0ciBpZiBubyB2YWx1ZSBpcyBmb3VuZC4KK1ZhbHVlICpGaW5kQXZhaWxhYmxlTG9hZGVkVmFsdWUoTG9hZEluc3QgKkxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKlNjYW5CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgJlNjYW5Gcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXhJbnN0c1RvU2NhbiA9IERlZk1heEluc3RzVG9TY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlhc0FuYWx5c2lzICpBQSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKklzTG9hZENTRSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpOdW1TY2FuZWRJbnN0ID0gbnVsbHB0cik7CisKKy8vLyBTY2FuIGJhY2t3YXJkcyB0byBzZWUgaWYgd2UgaGF2ZSB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHBvaW50ZXIgYXZhaWxhYmxlCisvLy8gbG9jYWxseSB3aXRoaW4gYSBzbWFsbCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gWW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBzY2FuIGFjcm9zcyBtdWx0aXBsZSBibG9ja3M6IGFmdGVyIHlvdSBjYWxsCisvLy8gdGhpcyBmdW5jdGlvbiwgaWYgU2NhbkZyb20gcG9pbnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJsb2NrLCBpdCdzIHNhZmUKKy8vLyB0byBjb250aW51ZSBzY2FubmluZyB0aGUgcHJlZGVjZXNzb3JzLgorLy8vCisvLy8gXHBhcmFtIFB0ciBUaGUgcG9pbnRlciB3ZSB3YW50IHRoZSBsb2FkIGFuZCBzdG9yZSB0byBvcmlnaW5hdGUgZnJvbS4KKy8vLyBccGFyYW0gQWNjZXNzVHkgVGhlIGFjY2VzcyB0eXBlIG9mIHRoZSBwb2ludGVyLgorLy8vIFxwYXJhbSBBdExlYXN0QXRvbWljIEFyZSB3ZSBsb29raW5nIGZvciBhdC1sZWFzdCBhbiBhdG9taWMgbG9hZC9zdG9yZSA/IEluCisvLy8gY2FzZSBpdCBpcyBmYWxzZSwgd2UgY2FuIHJldHVybiBhbiBhdG9taWMgb3Igbm9uLWF0b21pYyBsb2FkIG9yIHN0b3JlLiBJbgorLy8vIGNhc2UgaXQgaXMgdHJ1ZSwgd2UgbmVlZCB0byByZXR1cm4gYW4gYXRvbWljIGxvYWQgb3Igc3RvcmUuCisvLy8gXHBhcmFtIFNjYW5CQiBUaGUgYmFzaWMgYmxvY2sgdG8gc2Nhbi4KKy8vLyBccGFyYW0gW2luLG91dF0gU2NhbkZyb20gVGhlIGxvY2F0aW9uIHRvIHN0YXJ0IHNjYW5uaW5nIGZyb20uIFdoZW4gdGhpcworLy8vIGZ1bmN0aW9uIHJldHVybnMsIGl0IHBvaW50cyBhdCB0aGUgbGFzdCBpbnN0cnVjdGlvbiBzY2FubmVkLgorLy8vIFxwYXJhbSBNYXhJbnN0c1RvU2NhbiBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRvIHNjYW4uIElmIHRoaXMKKy8vLyBpcyB6ZXJvLCB0aGUgd2hvbGUgYmxvY2sgd2lsbCBiZSBzY2FubmVkLgorLy8vIFxwYXJhbSBBQSBPcHRpb25hbCBwb2ludGVyIHRvIGFsaWFzIGFuYWx5c2lzLCB0byBtYWtlIHRoZSBzY2FuIG1vcmUKKy8vLyBwcmVjaXNlLgorLy8vIFxwYXJhbSBbb3V0XSBJc0xvYWQgV2hldGhlciB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgYSBsb2FkIGZyb20gdGhlIHNhbWUKKy8vLyBsb2NhdGlvbiBpbiBtZW1vcnksIGFzIG9wcG9zZWQgdG8gdGhlIHZhbHVlIG9wZXJhbmQgb2YgYSBzdG9yZS4KKy8vLworLy8vIFxyZXR1cm5zIFRoZSBmb3VuZCB2YWx1ZSwgb3IgbnVsbHB0ciBpZiBubyB2YWx1ZSBpcyBmb3VuZC4KK1ZhbHVlICpGaW5kQXZhaWxhYmxlUHRyTG9hZFN0b3JlKFZhbHVlICpQdHIsIFR5cGUgKkFjY2Vzc1R5LCBib29sIEF0TGVhc3RBdG9taWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpTY2FuQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciAmU2NhbkZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXhJbnN0c1RvU2NhbiwgQWxpYXNBbmFseXNpcyAqQUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpJc0xvYWQsIHVuc2lnbmVkICpOdW1TY2FuZWRJbnN0KTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BBY2Nlc3NBbmFseXNpcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb29wQWNjZXNzQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODE1NGM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb29wQWNjZXNzQW5hbHlzaXMuaApAQCAtMCwwICsxLDc0OSBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvTG9vcEFjY2Vzc0FuYWx5c2lzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgbG9vcCBtZW1vcnkgZGVwZW5kZW5jZSBmcmFtZXdvcmsgdGhhdAorLy8gd2FzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGZvciB0aGUgTG9vcCBWZWN0b3JpemVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19MT09QQUNDRVNTQU5BTFlTSVNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0xPT1BBQ0NFU1NBTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9FcXVpdmFsZW5jZUNsYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNTZXRUcmFja2VyLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wQW5hbHlzaXNNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25FeHByZXNzaW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGlhZ25vc3RpY0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVmFsdWU7CitjbGFzcyBEYXRhTGF5b3V0OworY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworY2xhc3MgTG9vcDsKK2NsYXNzIFNDRVY7CitjbGFzcyBTQ0VWVW5pb25QcmVkaWNhdGU7CitjbGFzcyBMb29wQWNjZXNzSW5mbzsKK2NsYXNzIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXI7CisKKy8vLyBcYnJpZWYgQ29sbGVjdGlvbiBvZiBwYXJhbWV0ZXJzIHNoYXJlZCBiZWV0d2VlbiB0aGUgTG9vcCBWZWN0b3JpemVyIGFuZCB0aGUKKy8vLyBMb29wIEFjY2VzcyBBbmFseXNpcy4KK3N0cnVjdCBWZWN0b3JpemVyUGFyYW1zIHsKKyAgLy8vIFxicmllZiBNYXhpbXVtIFNJTUQgd2lkdGguCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBNYXhWZWN0b3JXaWR0aDsKKworICAvLy8gXGJyaWVmIFZGIGFzIG92ZXJyaWRkZW4gYnkgdGhlIHVzZXIuCisgIHN0YXRpYyB1bnNpZ25lZCBWZWN0b3JpemF0aW9uRmFjdG9yOworICAvLy8gXGJyaWVmIEludGVybGVhdmUgZmFjdG9yIGFzIG92ZXJyaWRkZW4gYnkgdGhlIHVzZXIuCisgIHN0YXRpYyB1bnNpZ25lZCBWZWN0b3JpemF0aW9uSW50ZXJsZWF2ZTsKKyAgLy8vIFxicmllZiBUcnVlIGlmIGZvcmNlLXZlY3Rvci1pbnRlcmxlYXZlIHdhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCisgIHN0YXRpYyBib29sIGlzSW50ZXJsZWF2ZUZvcmNlZCgpOworCisgIC8vLyBcXGJyaWVmIFdoZW4gcGVyZm9ybWluZyBtZW1vcnkgZGlzYW1iaWd1YXRpb24gY2hlY2tzIGF0IHJ1bnRpbWUgZG8gbm90CisgIC8vLyBtYWtlIG1vcmUgdGhhbiB0aGlzIG51bWJlciBvZiBjb21wYXJpc29ucy4KKyAgc3RhdGljIHVuc2lnbmVkIFJ1bnRpbWVNZW1vcnlDaGVja1RocmVzaG9sZDsKK307CisKKy8vLyBcYnJpZWYgQ2hlY2tzIG1lbW9yeSBkZXBlbmRlbmNlcyBhbW9uZyBhY2Nlc3NlcyB0byB0aGUgc2FtZSB1bmRlcmx5aW5nCisvLy8gb2JqZWN0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZXJlIHZlY3Rvcml6YXRpb24gaXMgbGVnYWwgb3Igbm90IChhbmQgYXQKKy8vLyB3aGljaCB2ZWN0b3JpemF0aW9uIGZhY3RvcikuCisvLy8KKy8vLyBOb3RlOiBUaGlzIGNsYXNzIHdpbGwgY29tcHV0ZSBhIGNvbnNlcnZhdGl2ZSBkZXBlbmRlbmNlIGZvciBhY2Nlc3MgdG8KKy8vLyBkaWZmZXJlbnQgdW5kZXJseWluZyBwb2ludGVycy4gQ2xpZW50cywgc3VjaCBhcyB0aGUgbG9vcCB2ZWN0b3JpemVyLCB3aWxsCisvLy8gc29tZXRpbWVzIGRlYWwgdGhlc2UgcG90ZW50aWFsIGRlcGVuZGVuY2llcyBieSBlbWl0dGluZyBydW50aW1lIGNoZWNrcy4KKy8vLworLy8vIFdlIHVzZSB0aGUgU2NhbGFyRXZvbHV0aW9uIGZyYW1ld29yayB0byBzeW1ib2xpY2FsbHkgZXZhbHV0YXRlIGFjY2VzcworLy8vIGZ1bmN0aW9ucyBwYWlycy4gU2luY2Ugd2UgY3VycmVudGx5IGRvbid0IHJlc3RydWN0dXJlIHRoZSBsb29wIHdlIGNhbiByZWx5CisvLy8gb24gdGhlIHByb2dyYW0gb3JkZXIgb2YgbWVtb3J5IGFjY2Vzc2VzIHRvIGRldGVybWluZSB0aGVpciBzYWZldHkuCisvLy8gQXQgdGhlIG1vbWVudCB3ZSB3aWxsIG9ubHkgZGVlbSBhY2Nlc3NlcyBhcyBzYWZlIGZvcjoKKy8vLyAgKiBBIG5lZ2F0aXZlIGNvbnN0YW50IGRpc3RhbmNlIGFzc3VtaW5nIHByb2dyYW0gb3JkZXIuCisvLy8KKy8vLyAgICAgIFNhZmU6IHRtcCA9IGFbaSArIDFdOyAgICAgT1IgICAgIGFbaSArIDFdID0geDsKKy8vLyAgICAgICAgICAgIGFbaV0gPSB0bXA7ICAgICAgICAgICAgICAgIHkgPSBhW2ldOworLy8vCisvLy8gICBUaGUgbGF0dGVyIGNhc2UgaXMgc2FmZSBiZWNhdXNlIGxhdGVyIGNoZWNrcyBndWFyYW50dWVlIHRoYXQgdGhlcmUgY2FuJ3QKKy8vLyAgIGJlIGEgY3ljbGUgdGhyb3VnaCBhIHBoaSBub2RlICh0aGF0IGlzLCB3ZSBjaGVjayB0aGF0ICJ4IiBhbmQgInkiIGlzIG5vdAorLy8vICAgdGhlIHNhbWUgdmFyaWFibGU6IGEgaGVhZGVyIHBoaSBjYW4gb25seSBiZSBhbiBpbmR1Y3Rpb24gb3IgYSByZWR1Y3Rpb24sIGEKKy8vLyAgIHJlZHVjdGlvbiBjYW4ndCBoYXZlIGEgbWVtb3J5IHNpbmssIGFuIGluZHVjdGlvbiBjYW4ndCBoYXZlIGEgbWVtb3J5CisvLy8gICBzb3VyY2UpLiBUaGlzIGlzIGltcG9ydGFudCBhbmQgbXVzdCBub3QgYmUgdmlvbGF0ZWQgKG9yIHdlIGhhdmUgdG8KKy8vLyAgIHJlc29ydCB0byBjaGVja2luZyBmb3IgY3ljbGVzIHRocm91Z2ggbWVtb3J5KS4KKy8vLworLy8vICAqIEEgcG9zaXRpdmUgY29uc3RhbnQgZGlzdGFuY2UgYXNzdW1pbmcgcHJvZ3JhbSBvcmRlciB0aGF0IGlzIGJpZ2dlcgorLy8vICAgIHRoYW4gdGhlIGJpZ2dlc3QgbWVtb3J5IGFjY2Vzcy4KKy8vLworLy8vICAgICB0bXAgPSBhW2ldICAgICAgICBPUiAgICAgICAgICAgICAgYltpXSA9IHgKKy8vLyAgICAgYVtpKzJdID0gdG1wICAgICAgICAgICAgICAgICAgICAgIHkgPSBiW2krMl07CisvLy8KKy8vLyAgICAgU2FmZSBkaXN0YW5jZTogMiB4IHNpemVvZihhWzBdKSwgYW5kIDIgeCBzaXplb2YoYlswXSksIHJlc3BlY3RpdmVseS4KKy8vLworLy8vICAqIFplcm8gZGlzdGFuY2VzIGFuZCBhbGwgYWNjZXNzZXMgaGF2ZSB0aGUgc2FtZSBzaXplLgorLy8vCitjbGFzcyBNZW1vcnlEZXBDaGVja2VyIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBQb2ludGVySW50UGFpcjxWYWx1ZSAqLCAxLCBib29sPiBNZW1BY2Nlc3NJbmZvOworICB0eXBlZGVmIFNtYWxsVmVjdG9yPE1lbUFjY2Vzc0luZm8sIDg+IE1lbUFjY2Vzc0luZm9MaXN0OworICAvLy8gXGJyaWVmIFNldCBvZiBwb3RlbnRpYWwgZGVwZW5kZW50IG1lbW9yeSBhY2Nlc3Nlcy4KKyAgdHlwZWRlZiBFcXVpdmFsZW5jZUNsYXNzZXM8TWVtQWNjZXNzSW5mbz4gRGVwQ2FuZGlkYXRlczsKKworICAvLy8gXGJyaWVmIERlcGVuZGVjZSBiZXR3ZWVuIG1lbW9yeSBhY2Nlc3MgaW5zdHJ1Y3Rpb25zLgorICBzdHJ1Y3QgRGVwZW5kZW5jZSB7CisgICAgLy8vIFxicmllZiBUaGUgdHlwZSBvZiB0aGUgZGVwZW5kZW5jZS4KKyAgICBlbnVtIERlcFR5cGUgeworICAgICAgLy8gTm8gZGVwZW5kZW5jZS4KKyAgICAgIE5vRGVwLAorICAgICAgLy8gV2UgY291bGRuJ3QgZGV0ZXJtaW5lIHRoZSBkaXJlY3Rpb24gb3IgdGhlIGRpc3RhbmNlLgorICAgICAgVW5rbm93biwKKyAgICAgIC8vIExleGljYWxseSBmb3J3YXJkLgorICAgICAgLy8KKyAgICAgIC8vIEZJWE1FOiBJZiB3ZSBvbmx5IGhhdmUgbG9vcC1pbmRlcGVuZGVudCBmb3J3YXJkIGRlcGVuZGVuY2VzIChlLmcuIGEKKyAgICAgIC8vIHJlYWQgYW5kIHdyaXRlIG9mIEFbaV0pLCBMQUEgd2lsbCBsb2NhbGx5IGRlZW0gdGhlIGRlcGVuZGVuY2UgInNhZmUiCisgICAgICAvLyB3aXRob3V0IHF1ZXJ5aW5nIHRoZSBNZW1vcnlEZXBDaGVja2VyLiAgVGhlcmVmb3JlIHdlIGNhbiBtaXNzCisgICAgICAvLyBlbnVtZXJhdGluZyBsb29wLWluZGVwZW5kZW50IGZvcndhcmQgZGVwZW5kZW5jZXMgaW4KKyAgICAgIC8vIGdldERlcGVuZGVuY2VzLiAgTm90ZSB0aGF0IGFzIHNvb24gYXMgdGhlcmUgYXJlIGRpZmZlcmVudAorICAgICAgLy8gaW5kaWNlcyB1c2VkIHRvIGFjY2VzcyB0aGUgc2FtZSBhcnJheSwgdGhlIE1lbW9yeURlcENoZWNrZXIgKmlzKgorICAgICAgLy8gcXVlcmllZCBhbmQgdGhlIGRlcGVuZGVuY2UgbGlzdCBpcyBjb21wbGV0ZS4KKyAgICAgIEZvcndhcmQsCisgICAgICAvLyBGb3J3YXJkLCBidXQgaWYgdmVjdG9yaXplZCwgaXMgbGlrZWx5IHRvIHByZXZlbnQgc3RvcmUtdG8tbG9hZAorICAgICAgLy8gZm9yd2FyZGluZy4KKyAgICAgIEZvcndhcmRCdXRQcmV2ZW50c0ZvcndhcmRpbmcsCisgICAgICAvLyBMZXhpY2FsbHkgYmFja3dhcmQuCisgICAgICBCYWNrd2FyZCwKKyAgICAgIC8vIEJhY2t3YXJkLCBidXQgdGhlIGRpc3RhbmNlIGFsbG93cyBhIHZlY3Rvcml6YXRpb24gZmFjdG9yIG9mCisgICAgICAvLyBNYXhTYWZlRGVwRGlzdEJ5dGVzLgorICAgICAgQmFja3dhcmRWZWN0b3JpemFibGUsCisgICAgICAvLyBTYW1lLCBidXQgbWF5IHByZXZlbnQgc3RvcmUtdG8tbG9hZCBmb3J3YXJkaW5nLgorICAgICAgQmFja3dhcmRWZWN0b3JpemFibGVCdXRQcmV2ZW50c0ZvcndhcmRpbmcKKyAgICB9OworCisgICAgLy8vIFxicmllZiBTdHJpbmcgdmVyc2lvbiBvZiB0aGUgdHlwZXMuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKkRlcE5hbWVbXTsKKworICAgIC8vLyBcYnJpZWYgSW5kZXggb2YgdGhlIHNvdXJjZSBvZiB0aGUgZGVwZW5kZW5jZSBpbiB0aGUgSW5zdE1hcCB2ZWN0b3IuCisgICAgdW5zaWduZWQgU291cmNlOworICAgIC8vLyBcYnJpZWYgSW5kZXggb2YgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBkZXBlbmRlbmNlIGluIHRoZSBJbnN0TWFwIHZlY3Rvci4KKyAgICB1bnNpZ25lZCBEZXN0aW5hdGlvbjsKKyAgICAvLy8gXGJyaWVmIFRoZSB0eXBlIG9mIHRoZSBkZXBlbmRlbmNlLgorICAgIERlcFR5cGUgVHlwZTsKKworICAgIERlcGVuZGVuY2UodW5zaWduZWQgU291cmNlLCB1bnNpZ25lZCBEZXN0aW5hdGlvbiwgRGVwVHlwZSBUeXBlKQorICAgICAgICA6IFNvdXJjZShTb3VyY2UpLCBEZXN0aW5hdGlvbihEZXN0aW5hdGlvbiksIFR5cGUoVHlwZSkge30KKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzb3VyY2UgaW5zdHJ1Y3Rpb24gb2YgdGhlIGRlcGVuZGVuY2UuCisgICAgSW5zdHJ1Y3Rpb24gKmdldFNvdXJjZShjb25zdCBMb29wQWNjZXNzSW5mbyAmTEFJKSBjb25zdDsKKyAgICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZGVzdGluYXRpb24gaW5zdHJ1Y3Rpb24gb2YgdGhlIGRlcGVuZGVuY2UuCisgICAgSW5zdHJ1Y3Rpb24gKmdldERlc3RpbmF0aW9uKGNvbnN0IExvb3BBY2Nlc3NJbmZvICZMQUkpIGNvbnN0OworCisgICAgLy8vIFxicmllZiBEZXBlbmRlbmNlIHR5cGVzIHRoYXQgZG9uJ3QgcHJldmVudCB2ZWN0b3JpemF0aW9uLgorICAgIHN0YXRpYyBib29sIGlzU2FmZUZvclZlY3Rvcml6YXRpb24oRGVwVHlwZSBUeXBlKTsKKworICAgIC8vLyBcYnJpZWYgTGV4aWNhbGx5IGZvcndhcmQgZGVwZW5kZW5jZS4KKyAgICBib29sIGlzRm9yd2FyZCgpIGNvbnN0OworICAgIC8vLyBcYnJpZWYgTGV4aWNhbGx5IGJhY2t3YXJkIGRlcGVuZGVuY2UuCisgICAgYm9vbCBpc0JhY2t3YXJkKCkgY29uc3Q7CisKKyAgICAvLy8gXGJyaWVmIE1heSBiZSBhIGxleGljYWxseSBiYWNrd2FyZCBkZXBlbmRlbmNlIHR5cGUgKGluY2x1ZGVzIFVua25vd24pLgorICAgIGJvb2wgaXNQb3NzaWJseUJhY2t3YXJkKCkgY29uc3Q7CisKKyAgICAvLy8gXGJyaWVmIFByaW50IHRoZSBkZXBlbmRlbmNlLiAgXHAgSW5zdHIgaXMgdXNlZCB0byBtYXAgdGhlIGluc3RydWN0aW9uCisgICAgLy8vIGluZGljZXMgdG8gaW5zdHJ1Y3Rpb25zLgorICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBEZXB0aCwKKyAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbiAqPiAmSW5zdHJzKSBjb25zdDsKKyAgfTsKKworICBNZW1vcnlEZXBDaGVja2VyKFByZWRpY2F0ZWRTY2FsYXJFdm9sdXRpb24gJlBTRSwgY29uc3QgTG9vcCAqTCkKKyAgICAgIDogUFNFKFBTRSksIElubmVybW9zdExvb3AoTCksIEFjY2Vzc0lkeCgwKSwgTWF4U2FmZVJlZ2lzdGVyV2lkdGgoLTFVKSwKKyAgICAgICAgU2hvdWxkUmV0cnlXaXRoUnVudGltZUNoZWNrKGZhbHNlKSwgU2FmZUZvclZlY3Rvcml6YXRpb24odHJ1ZSksCisgICAgICAgIFJlY29yZERlcGVuZGVuY2VzKHRydWUpIHt9CisKKyAgLy8vIFxicmllZiBSZWdpc3RlciB0aGUgbG9jYXRpb24gKGluc3RydWN0aW9ucyBhcmUgZ2l2ZW4gaW5jcmVhc2luZyBudW1iZXJzKQorICAvLy8gb2YgYSB3cml0ZSBhY2Nlc3MuCisgIHZvaWQgYWRkQWNjZXNzKFN0b3JlSW5zdCAqU0kpIHsKKyAgICBWYWx1ZSAqUHRyID0gU0ktPmdldFBvaW50ZXJPcGVyYW5kKCk7CisgICAgQWNjZXNzZXNbTWVtQWNjZXNzSW5mbyhQdHIsIHRydWUpXS5wdXNoX2JhY2soQWNjZXNzSWR4KTsKKyAgICBJbnN0TWFwLnB1c2hfYmFjayhTSSk7CisgICAgKytBY2Nlc3NJZHg7CisgIH0KKworICAvLy8gXGJyaWVmIFJlZ2lzdGVyIHRoZSBsb2NhdGlvbiAoaW5zdHJ1Y3Rpb25zIGFyZSBnaXZlbiBpbmNyZWFzaW5nIG51bWJlcnMpCisgIC8vLyBvZiBhIHdyaXRlIGFjY2Vzcy4KKyAgdm9pZCBhZGRBY2Nlc3MoTG9hZEluc3QgKkxJKSB7CisgICAgVmFsdWUgKlB0ciA9IExJLT5nZXRQb2ludGVyT3BlcmFuZCgpOworICAgIEFjY2Vzc2VzW01lbUFjY2Vzc0luZm8oUHRyLCBmYWxzZSldLnB1c2hfYmFjayhBY2Nlc3NJZHgpOworICAgIEluc3RNYXAucHVzaF9iYWNrKExJKTsKKyAgICArK0FjY2Vzc0lkeDsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2hlY2sgd2hldGhlciB0aGUgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlIGFjY2Vzc2VzIGFyZSBzYWZlLgorICAvLy8KKyAgLy8vIE9ubHkgY2hlY2tzIHNldHMgd2l0aCBlbGVtZW50cyBpbiBccCBDaGVja0RlcHMuCisgIGJvb2wgYXJlRGVwc1NhZmUoRGVwQ2FuZGlkYXRlcyAmQWNjZXNzU2V0cywgTWVtQWNjZXNzSW5mb0xpc3QgJkNoZWNrRGVwcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZVRvVmFsdWVNYXAgJlN0cmlkZXMpOworCisgIC8vLyBcYnJpZWYgTm8gbWVtb3J5IGRlcGVuZGVuY2Ugd2FzIGVuY291bnRlcmVkIHRoYXQgd291bGQgaW5oaWJpdAorICAvLy8gdmVjdG9yaXphdGlvbi4KKyAgYm9vbCBpc1NhZmVGb3JWZWN0b3JpemF0aW9uKCkgY29uc3QgeyByZXR1cm4gU2FmZUZvclZlY3Rvcml6YXRpb247IH0KKworICAvLy8gXGJyaWVmIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBvZiBhIHZlY3RvciByZWdpc3RlciB3ZSBjYW4gdmVjdG9yaXplCisgIC8vLyB0aGUgYWNjZXNzZXMgc2FmZWx5IHdpdGguCisgIHVpbnQ2NF90IGdldE1heFNhZmVEZXBEaXN0Qnl0ZXMoKSB7IHJldHVybiBNYXhTYWZlRGVwRGlzdEJ5dGVzOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IGFyZSBzYWZlIHRvIG9wZXJhdGUgb24KKyAgLy8vIHNpbXVsdGFuZW91c2x5LCBtdWx0aXBsaWVkIGJ5IHRoZSBzaXplIG9mIHRoZSBlbGVtZW50IGluIGJpdHMuCisgIHVpbnQ2NF90IGdldE1heFNhZmVSZWdpc3RlcldpZHRoKCkgY29uc3QgeyByZXR1cm4gTWF4U2FmZVJlZ2lzdGVyV2lkdGg7IH0KKworICAvLy8gXGJyaWVmIEluIHNhbWUgY2FzZXMgd2hlbiB0aGUgZGVwZW5kZW5jeSBjaGVjayBmYWlscyB3ZSBjYW4gc3RpbGwKKyAgLy8vIHZlY3Rvcml6ZSB0aGUgbG9vcCB3aXRoIGEgZHluYW1pYyBhcnJheSBhY2Nlc3MgY2hlY2suCisgIGJvb2wgc2hvdWxkUmV0cnlXaXRoUnVudGltZUNoZWNrKCkgeyByZXR1cm4gU2hvdWxkUmV0cnlXaXRoUnVudGltZUNoZWNrOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBtZW1vcnkgZGVwZW5kZW5jZXMuICBJZiBudWxsIGlzIHJldHVybmVkIHdlIGV4Y2VlZGVkCisgIC8vLyB0aGUgTWF4RGVwZW5kZW5jZXMgdGhyZXNob2xkIGFuZCB0aGlzIGluZm9ybWF0aW9uIGlzIG5vdAorICAvLy8gYXZhaWxhYmxlLgorICBjb25zdCBTbWFsbFZlY3RvckltcGw8RGVwZW5kZW5jZT4gKmdldERlcGVuZGVuY2VzKCkgY29uc3QgeworICAgIHJldHVybiBSZWNvcmREZXBlbmRlbmNlcyA/ICZEZXBlbmRlbmNlcyA6IG51bGxwdHI7CisgIH0KKworICB2b2lkIGNsZWFyRGVwZW5kZW5jZXMoKSB7IERlcGVuZGVuY2VzLmNsZWFyKCk7IH0KKworICAvLy8gXGJyaWVmIFRoZSB2ZWN0b3Igb2YgbWVtb3J5IGFjY2VzcyBpbnN0cnVjdGlvbnMuICBUaGUgaW5kaWNlcyBhcmUgdXNlZCBhcworICAvLy8gaW5zdHJ1Y3Rpb24gaWRlbnRpZmllcnMgaW4gdGhlIERlcGVuZGVuY2UgY2xhc3MuCisgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbiAqPiAmZ2V0TWVtb3J5SW5zdHJ1Y3Rpb25zKCkgY29uc3QgeworICAgIHJldHVybiBJbnN0TWFwOworICB9CisKKyAgLy8vIFxicmllZiBHZW5lcmF0ZSBhIG1hcHBpbmcgYmV0d2VlbiB0aGUgbWVtb3J5IGluc3RydWN0aW9ucyBhbmQgdGhlaXIKKyAgLy8vIGluZGljZXMgYWNjb3JkaW5nIHRvIHByb2dyYW0gb3JkZXIuCisgIERlbnNlTWFwPEluc3RydWN0aW9uICosIHVuc2lnbmVkPiBnZW5lcmF0ZUluc3RydWN0aW9uT3JkZXJNYXAoKSBjb25zdCB7CisgICAgRGVuc2VNYXA8SW5zdHJ1Y3Rpb24gKiwgdW5zaWduZWQ+IE9yZGVyTWFwOworCisgICAgZm9yICh1bnNpZ25lZCBJID0gMDsgSSA8IEluc3RNYXAuc2l6ZSgpOyArK0kpCisgICAgICBPcmRlck1hcFtJbnN0TWFwW0ldXSA9IEk7CisKKyAgICByZXR1cm4gT3JkZXJNYXA7CisgIH0KKworICAvLy8gXGJyaWVmIEZpbmQgdGhlIHNldCBvZiBpbnN0cnVjdGlvbnMgdGhhdCByZWFkIG9yIHdyaXRlIHZpYSBccCBQdHIuCisgIFNtYWxsVmVjdG9yPEluc3RydWN0aW9uICosIDQ+IGdldEluc3RydWN0aW9uc0ZvckFjY2VzcyhWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1dyaXRlKSBjb25zdDsKKworcHJpdmF0ZToKKyAgLy8vIEEgd3JhcHBlciBhcm91bmQgU2NhbGFyRXZvbHV0aW9uLCB1c2VkIHRvIGFkZCBydW50aW1lIFNDRVYgY2hlY2tzLCBhbmQKKyAgLy8vIGFwcGxpZXMgZHluYW1pYyBrbm93bGVkZ2UgdG8gc2ltcGxpZnkgU0NFViBleHByZXNzaW9ucyBhbmQgY29udmVydCB0aGVtCisgIC8vLyB0byBhIG1vcmUgdXNhYmxlIGZvcm0uIFdlIG5lZWQgdGhpcyBpbiBjYXNlIGFzc3VtcHRpb25zIGFib3V0IFNDRVYKKyAgLy8vIGV4cHJlc3Npb25zIG5lZWQgdG8gYmUgbWFkZSBpbiBvcmRlciB0byBhdm9pZCB1bmtub3duIGRlcGVuZGVuY2VzLiBGb3IKKyAgLy8vIGV4YW1wbGUgd2UgbWlnaHQgYXNzdW1lIGEgdW5pdCBzdHJpZGUgZm9yIGEgcG9pbnRlciBpbiBvcmRlciB0byBwcm92ZQorICAvLy8gdGhhdCBhIG1lbW9yeSBhY2Nlc3MgaXMgc3RyaWRlZCBhbmQgZG9lc24ndCB3cmFwLgorICBQcmVkaWNhdGVkU2NhbGFyRXZvbHV0aW9uICZQU0U7CisgIGNvbnN0IExvb3AgKklubmVybW9zdExvb3A7CisKKyAgLy8vIFxicmllZiBNYXBzIGFjY2VzcyBsb2NhdGlvbnMgKHB0ciwgcmVhZC93cml0ZSkgdG8gcHJvZ3JhbSBvcmRlci4KKyAgRGVuc2VNYXA8TWVtQWNjZXNzSW5mbywgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ID4gQWNjZXNzZXM7CisKKyAgLy8vIFxicmllZiBNZW1vcnkgYWNjZXNzIGluc3RydWN0aW9ucyBpbiBwcm9ncmFtIG9yZGVyLgorICBTbWFsbFZlY3RvcjxJbnN0cnVjdGlvbiAqLCAxNj4gSW5zdE1hcDsKKworICAvLy8gXGJyaWVmIFRoZSBwcm9ncmFtIG9yZGVyIGluZGV4IHRvIGJlIHVzZWQgZm9yIHRoZSBuZXh0IGluc3RydWN0aW9uLgorICB1bnNpZ25lZCBBY2Nlc3NJZHg7CisKKyAgLy8gV2UgY2FuIGFjY2VzcyB0aGlzIG1hbnkgYnl0ZXMgaW4gcGFyYWxsZWwgc2FmZWx5LgorICB1aW50NjRfdCBNYXhTYWZlRGVwRGlzdEJ5dGVzOworCisgIC8vLyBcYnJpZWYgTnVtYmVyIG9mIGVsZW1lbnRzIChmcm9tIGNvbnNlY3V0aXZlIGl0ZXJhdGlvbnMpIHRoYXQgYXJlIHNhZmUgdG8KKyAgLy8vIG9wZXJhdGUgb24gc2ltdWx0YW5lb3VzbHksIG11bHRpcGxpZWQgYnkgdGhlIHNpemUgb2YgdGhlIGVsZW1lbnQgaW4gYml0cy4KKyAgLy8vIFRoZSBzaXplIG9mIHRoZSBlbGVtZW50IGlzIHRha2VuIGZyb20gdGhlIG1lbW9yeSBhY2Nlc3MgdGhhdCBpcyBtb3N0CisgIC8vLyByZXN0cmljdGl2ZS4KKyAgdWludDY0X3QgTWF4U2FmZVJlZ2lzdGVyV2lkdGg7CisKKyAgLy8vIFxicmllZiBJZiB3ZSBzZWUgYSBub24tY29uc3RhbnQgZGVwZW5kZW5jZSBkaXN0YW5jZSB3ZSBjYW4gc3RpbGwgdHJ5IHRvCisgIC8vLyB2ZWN0b3JpemUgdGhpcyBsb29wIHdpdGggcnVudGltZSBjaGVja3MuCisgIGJvb2wgU2hvdWxkUmV0cnlXaXRoUnVudGltZUNoZWNrOworCisgIC8vLyBcYnJpZWYgTm8gbWVtb3J5IGRlcGVuZGVuY2Ugd2FzIGVuY291bnRlcmVkIHRoYXQgd291bGQgaW5oaWJpdAorICAvLy8gdmVjdG9yaXphdGlvbi4KKyAgYm9vbCBTYWZlRm9yVmVjdG9yaXphdGlvbjsKKworICAvLy8vIFxicmllZiBUcnVlIGlmIERlcGVuZGVuY2VzIHJlZmxlY3RzIHRoZSBkZXBlbmRlbmNlcyBpbiB0aGUKKyAgLy8vLyBsb29wLiAgSWYgZmFsc2Ugd2UgZXhjZWVkZWQgTWF4RGVwZW5kZW5jZXMgYW5kCisgIC8vLy8gRGVwZW5kZW5jZXMgaXMgaW52YWxpZC4KKyAgYm9vbCBSZWNvcmREZXBlbmRlbmNlczsKKworICAvLy8gXGJyaWVmIE1lbW9yeSBkZXBlbmRlbmNlcyBjb2xsZWN0ZWQgZHVyaW5nIHRoZSBhbmFseXNpcy4gIE9ubHkgdmFsaWQgaWYKKyAgLy8vIFJlY29yZERlcGVuZGVuY2VzIGlzIHRydWUuCisgIFNtYWxsVmVjdG9yPERlcGVuZGVuY2UsIDg+IERlcGVuZGVuY2VzOworCisgIC8vLyBcYnJpZWYgQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIHBsYXVzaWJsZSBkZXBlbmRlbmNlIGJldHdlZW4gdGhlIHR3bworICAvLy8gYWNjZXNzZXMuCisgIC8vLworICAvLy8gQWNjZXNzIFxwIEEgbXVzdCBoYXBwZW4gYmVmb3JlIFxwIEIgaW4gcHJvZ3JhbSBvcmRlci4gVGhlIHR3byBpbmRpY2VzCisgIC8vLyBpZGVudGlmeSB0aGUgaW5kZXggaW50byB0aGUgcHJvZ3JhbSBvcmRlciBtYXAuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBjaGVja3MgIHdoZXRoZXIgdGhlcmUgaXMgYSBwbGF1c2libGUgZGVwZW5kZW5jZSAob3IgdGhlCisgIC8vLyBhYnNlbmNlIG9mIHN1Y2ggY2FuJ3QgYmUgcHJvdmVkKSBiZXR3ZWVuIHRoZSB0d28gYWNjZXNzZXMuIElmIHRoZXJlIGlzIGEKKyAgLy8vIHBsYXVzaWJsZSBkZXBlbmRlbmNlIGJ1dCB0aGUgZGVwZW5kZW5jZSBkaXN0YW5jZSBpcyBiaWdnZXIgdGhhbiBvbmUKKyAgLy8vIGVsZW1lbnQgYWNjZXNzIGl0IHJlY29yZHMgdGhpcyBkaXN0YW5jZSBpbiBccCBNYXhTYWZlRGVwRGlzdEJ5dGVzIChpZiB0aGlzCisgIC8vLyBkaXN0YW5jZSBpcyBzbWFsbGVyIHRoYW4gYW55IG90aGVyIGRpc3RhbmNlIGVuY291bnRlcmVkIHNvIGZhcikuCisgIC8vLyBPdGhlcndpc2UsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHNpZ25hbGluZyBhIHBvc3NpYmxlIGRlcGVuZGVuY2UuCisgIERlcGVuZGVuY2U6OkRlcFR5cGUgaXNEZXBlbmRlbnQoY29uc3QgTWVtQWNjZXNzSW5mbyAmQSwgdW5zaWduZWQgQUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1BY2Nlc3NJbmZvICZCLCB1bnNpZ25lZCBCSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVG9WYWx1ZU1hcCAmU3RyaWRlcyk7CisKKyAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIHRoZSBkYXRhIGRlcGVuZGVuY2UgY291bGQgcHJldmVudCBzdG9yZS1sb2FkCisgIC8vLyBmb3J3YXJkaW5nLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gZmFsc2UgaWYgd2Ugc2hvdWxkbid0IHZlY3Rvcml6ZSBhdCBhbGwgb3IgYXZvaWQgbGFyZ2VyCisgIC8vLyB2ZWN0b3JpemF0aW9uIGZhY3RvcnMgYnkgbGltaXRpbmcgTWF4U2FmZURlcERpc3RCeXRlcy4KKyAgYm9vbCBjb3VsZFByZXZlbnRTdG9yZUxvYWRGb3J3YXJkKHVpbnQ2NF90IERpc3RhbmNlLCB1aW50NjRfdCBUeXBlQnl0ZVNpemUpOworfTsKKworLy8vIFxicmllZiBIb2xkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVtb3J5IHJ1bnRpbWUgbGVnYWxpdHkgY2hlY2tzIHRvIHZlcmlmeQorLy8vIHRoYXQgYSBncm91cCBvZiBwb2ludGVycyBkbyBub3Qgb3ZlcmxhcC4KK2NsYXNzIFJ1bnRpbWVQb2ludGVyQ2hlY2tpbmcgeworcHVibGljOgorICBzdHJ1Y3QgUG9pbnRlckluZm8geworICAgIC8vLyBIb2xkcyB0aGUgcG9pbnRlciB2YWx1ZSB0aGF0IHdlIG5lZWQgdG8gY2hlY2suCisgICAgVHJhY2tpbmdWSDxWYWx1ZT4gUG9pbnRlclZhbHVlOworICAgIC8vLyBIb2xkcyB0aGUgc21hbGxlc3QgYnl0ZSBhZGRyZXNzIGFjY2Vzc2VkIGJ5IHRoZSBwb2ludGVyIHRocm91Z2hvdXQgYWxsCisgICAgLy8vIGl0ZXJhdGlvbnMgb2YgdGhlIGxvb3AuCisgICAgY29uc3QgU0NFViAqU3RhcnQ7CisgICAgLy8vIEhvbGRzIHRoZSBsYXJnZXN0IGJ5dGUgYWRkcmVzcyBhY2Nlc3NlZCBieSB0aGUgcG9pbnRlciB0aHJvdWdob3V0IGFsbAorICAgIC8vLyBpdGVyYXRpb25zIG9mIHRoZSBsb29wLCBwbHVzIDEuCisgICAgY29uc3QgU0NFViAqRW5kOworICAgIC8vLyBIb2xkcyB0aGUgaW5mb3JtYXRpb24gaWYgdGhpcyBwb2ludGVyIGlzIHVzZWQgZm9yIHdyaXRpbmcgdG8gbWVtb3J5LgorICAgIGJvb2wgSXNXcml0ZVB0cjsKKyAgICAvLy8gSG9sZHMgdGhlIGlkIG9mIHRoZSBzZXQgb2YgcG9pbnRlcnMgdGhhdCBjb3VsZCBiZSBkZXBlbmRlbnQgYmVjYXVzZSBvZiBhCisgICAgLy8vIHNoYXJlZCB1bmRlcmx5aW5nIG9iamVjdC4KKyAgICB1bnNpZ25lZCBEZXBlbmRlbmN5U2V0SWQ7CisgICAgLy8vIEhvbGRzIHRoZSBpZCBvZiB0aGUgZGlzam9pbnQgYWxpYXMgc2V0IHRvIHdoaWNoIHRoaXMgcG9pbnRlciBiZWxvbmdzLgorICAgIHVuc2lnbmVkIEFsaWFzU2V0SWQ7CisgICAgLy8vIFNDRVYgZm9yIHRoZSBhY2Nlc3MuCisgICAgY29uc3QgU0NFViAqRXhwcjsKKworICAgIFBvaW50ZXJJbmZvKFZhbHVlICpQb2ludGVyVmFsdWUsIGNvbnN0IFNDRVYgKlN0YXJ0LCBjb25zdCBTQ0VWICpFbmQsCisgICAgICAgICAgICAgICAgYm9vbCBJc1dyaXRlUHRyLCB1bnNpZ25lZCBEZXBlbmRlbmN5U2V0SWQsIHVuc2lnbmVkIEFsaWFzU2V0SWQsCisgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRXhwcikKKyAgICAgICAgOiBQb2ludGVyVmFsdWUoUG9pbnRlclZhbHVlKSwgU3RhcnQoU3RhcnQpLCBFbmQoRW5kKSwKKyAgICAgICAgICBJc1dyaXRlUHRyKElzV3JpdGVQdHIpLCBEZXBlbmRlbmN5U2V0SWQoRGVwZW5kZW5jeVNldElkKSwKKyAgICAgICAgICBBbGlhc1NldElkKEFsaWFzU2V0SWQpLCBFeHByKEV4cHIpIHt9CisgIH07CisKKyAgUnVudGltZVBvaW50ZXJDaGVja2luZyhTY2FsYXJFdm9sdXRpb24gKlNFKSA6IE5lZWQoZmFsc2UpLCBTRShTRSkge30KKworICAvLy8gUmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBwb2ludGVyIHJ1bnRpbWUgaW5mb3JtYXRpb24uCisgIHZvaWQgcmVzZXQoKSB7CisgICAgTmVlZCA9IGZhbHNlOworICAgIFBvaW50ZXJzLmNsZWFyKCk7CisgICAgQ2hlY2tzLmNsZWFyKCk7CisgIH0KKworICAvLy8gSW5zZXJ0IGEgcG9pbnRlciBhbmQgY2FsY3VsYXRlIHRoZSBzdGFydCBhbmQgZW5kIFNDRVZzLgorICAvLy8gV2UgbmVlZCBccCBQU0UgaW4gb3JkZXIgdG8gY29tcHV0ZSB0aGUgU0NFViBleHByZXNzaW9uIG9mIHRoZSBwb2ludGVyCisgIC8vLyBhY2NvcmRpbmcgdG8gdGhlIGFzc3VtcHRpb25zIHRoYXQgd2UndmUgbWFkZSBkdXJpbmcgdGhlIGFuYWx5c2lzLgorICAvLy8gVGhlIG1ldGhvZCBtaWdodCBhbHNvIHZlcnNpb24gdGhlIHBvaW50ZXIgc3RyaWRlIGFjY29yZGluZyB0byBccCBTdHJpZGVzLAorICAvLy8gYW5kIGFkZCBuZXcgcHJlZGljYXRlcyB0byBccCBQU0UuCisgIHZvaWQgaW5zZXJ0KExvb3AgKkxwLCBWYWx1ZSAqUHRyLCBib29sIFdyaXRlUHRyLCB1bnNpZ25lZCBEZXBTZXRJZCwKKyAgICAgICAgICAgICAgdW5zaWduZWQgQVNJZCwgY29uc3QgVmFsdWVUb1ZhbHVlTWFwICZTdHJpZGVzLAorICAgICAgICAgICAgICBQcmVkaWNhdGVkU2NhbGFyRXZvbHV0aW9uICZQU0UpOworCisgIC8vLyBcYnJpZWYgTm8gcnVuLXRpbWUgbWVtb3J5IGNoZWNraW5nIGlzIG5lY2Vzc2FyeS4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFBvaW50ZXJzLmVtcHR5KCk7IH0KKworICAvLy8gQSBncm91cGluZyBvZiBwb2ludGVycy4gQSBzaW5nbGUgbWVtY2hlY2sgaXMgcmVxdWlyZWQgYmV0d2VlbgorICAvLy8gdHdvIGdyb3Vwcy4KKyAgc3RydWN0IENoZWNraW5nUHRyR3JvdXAgeworICAgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbmV3IHBvaW50ZXIgY2hlY2tpbmcgZ3JvdXAgY29udGFpbmluZyBhIHNpbmdsZQorICAgIC8vLyBwb2ludGVyLCB3aXRoIGluZGV4IFxwIEluZGV4IGluIFJ0Q2hlY2suCisgICAgQ2hlY2tpbmdQdHJHcm91cCh1bnNpZ25lZCBJbmRleCwgUnVudGltZVBvaW50ZXJDaGVja2luZyAmUnRDaGVjaykKKyAgICAgICAgOiBSdENoZWNrKFJ0Q2hlY2spLCBIaWdoKFJ0Q2hlY2suUG9pbnRlcnNbSW5kZXhdLkVuZCksCisgICAgICAgICAgTG93KFJ0Q2hlY2suUG9pbnRlcnNbSW5kZXhdLlN0YXJ0KSB7CisgICAgICBNZW1iZXJzLnB1c2hfYmFjayhJbmRleCk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBUcmllcyB0byBhZGQgdGhlIHBvaW50ZXIgcmVjb3JkZWQgaW4gUnRDaGVjayBhdCBpbmRleAorICAgIC8vLyBccCBJbmRleCB0byB0aGlzIHBvaW50ZXIgY2hlY2tpbmcgZ3JvdXAuIFdlIGNhbiBvbmx5IGFkZCBhIHBvaW50ZXIKKyAgICAvLy8gdG8gYSBjaGVja2luZyBncm91cCBpZiB3ZSB3aWxsIHN0aWxsIGJlIGFibGUgdG8gZ2V0CisgICAgLy8vIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIG9mIHRoZSBjaGVjay4gUmV0dXJucyB0cnVlIGluIGNhc2UKKyAgICAvLy8gb2Ygc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgYWRkUG9pbnRlcih1bnNpZ25lZCBJbmRleCk7CisKKyAgICAvLy8gQ29uc3RpdHV0ZXMgdGhlIGNvbnRleHQgb2YgdGhpcyBwb2ludGVyIGNoZWNraW5nIGdyb3VwLiBGb3IgZWFjaAorICAgIC8vLyBwb2ludGVyIHRoYXQgaXMgYSBtZW1iZXIgb2YgdGhpcyBncm91cCB3ZSB3aWxsIHJldGFpbiB0aGUgaW5kZXgKKyAgICAvLy8gYXQgd2hpY2ggaXQgYXBwZWFycyBpbiBSdENoZWNrLgorICAgIFJ1bnRpbWVQb2ludGVyQ2hlY2tpbmcgJlJ0Q2hlY2s7CisgICAgLy8vIFRoZSBTQ0VWIGV4cHJlc3Npb24gd2hpY2ggcmVwcmVzZW50cyB0aGUgdXBwZXIgYm91bmQgb2YgYWxsIHRoZQorICAgIC8vLyBwb2ludGVycyBpbiB0aGlzIGdyb3VwLgorICAgIGNvbnN0IFNDRVYgKkhpZ2g7CisgICAgLy8vIFRoZSBTQ0VWIGV4cHJlc3Npb24gd2hpY2ggcmVwcmVzZW50cyB0aGUgbG93ZXIgYm91bmQgb2YgYWxsIHRoZQorICAgIC8vLyBwb2ludGVycyBpbiB0aGlzIGdyb3VwLgorICAgIGNvbnN0IFNDRVYgKkxvdzsKKyAgICAvLy8gSW5kaWNlcyBvZiBhbGwgdGhlIHBvaW50ZXJzIHRoYXQgY29uc3RpdHV0ZSB0aGlzIGdyb3VwaW5nLgorICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAyPiBNZW1iZXJzOworICB9OworCisgIC8vLyBcYnJpZWYgQSBtZW1jaGVjayB3aGljaCBtYWRlIHVwIG9mIGEgcGFpciBvZiBncm91cGVkIHBvaW50ZXJzLgorICAvLy8KKyAgLy8vIFRoZXNlICpoYXZlKiB0byBiZSBjb25zdCBmb3Igbm93LCBzaW5jZSBjaGVja3MgYXJlIGdlbmVyYXRlZCBmcm9tCisgIC8vLyBDaGVja2luZ1B0ckdyb3VwcyBpbiBMQUk6OmFkZFJ1bnRpbWVDaGVja3Mgd2hpY2ggaXMgYSBjb25zdCBtZW1iZXIKKyAgLy8vIGZ1bmN0aW9uLiAgRklYTUU6IG9uY2UgY2hlY2stZ2VuZXJhdGlvbiBpcyBtb3ZlZCBpbnNpZGUgdGhpcyBjbGFzcyAoYWZ0ZXIKKyAgLy8vIHRoZSBQdHJQYXJ0aXRpb24gaGFjayBpcyByZW1vdmVkKSwgd2UgY291bGQgZHJvcCBjb25zdC4KKyAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgQ2hlY2tpbmdQdHJHcm91cCAqLCBjb25zdCBDaGVja2luZ1B0ckdyb3VwICo+CisgICAgICBQb2ludGVyQ2hlY2s7CisKKyAgLy8vIFxicmllZiBHZW5lcmF0ZSB0aGUgY2hlY2tzIGFuZCBzdG9yZSBpdC4gIFRoaXMgYWxzbyBwZXJmb3JtcyB0aGUgZ3JvdXBpbmcKKyAgLy8vIG9mIHBvaW50ZXJzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG1lbWNoZWNrcyBuZWNlc3NhcnkuCisgIHZvaWQgZ2VuZXJhdGVDaGVja3MoTWVtb3J5RGVwQ2hlY2tlcjo6RGVwQ2FuZGlkYXRlcyAmRGVwQ2FuZHMsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVc2VEZXBlbmRlbmNpZXMpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgY2hlY2tzIHRoYXQgZ2VuZXJhdGVDaGVja3MgY3JlYXRlZC4KKyAgY29uc3QgU21hbGxWZWN0b3I8UG9pbnRlckNoZWNrLCA0PiAmZ2V0Q2hlY2tzKCkgY29uc3QgeyByZXR1cm4gQ2hlY2tzOyB9CisKKyAgLy8vIFxicmllZiBEZWNpZGUgaWYgd2UgbmVlZCB0byBhZGQgYSBjaGVjayBiZXR3ZWVuIHR3byBncm91cHMgb2YgcG9pbnRlcnMsCisgIC8vLyBhY2NvcmRpbmcgdG8gbmVlZHNDaGVja2luZy4KKyAgYm9vbCBuZWVkc0NoZWNraW5nKGNvbnN0IENoZWNraW5nUHRyR3JvdXAgJk0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDaGVja2luZ1B0ckdyb3VwICZOKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBydW4tdGltZSBjaGVja3MgcmVxdWlyZWQgYWNjb3JkaW5nIHRvCisgIC8vLyBuZWVkc0NoZWNraW5nLgorICB1bnNpZ25lZCBnZXROdW1iZXJPZkNoZWNrcygpIGNvbnN0IHsgcmV0dXJuIENoZWNrcy5zaXplKCk7IH0KKworICAvLy8gXGJyaWVmIFByaW50IHRoZSBsaXN0IHJ1bi10aW1lIG1lbW9yeSBjaGVja3MgbmVjZXNzYXJ5LgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgRGVwdGggPSAwKSBjb25zdDsKKworICAvLy8gUHJpbnQgXHAgQ2hlY2tzLgorICB2b2lkIHByaW50Q2hlY2tzKHJhd19vc3RyZWFtICZPUywgY29uc3QgU21hbGxWZWN0b3JJbXBsPFBvaW50ZXJDaGVjaz4gJkNoZWNrcywKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0OworCisgIC8vLyBUaGlzIGZsYWcgaW5kaWNhdGVzIGlmIHdlIG5lZWQgdG8gYWRkIHRoZSBydW50aW1lIGNoZWNrLgorICBib29sIE5lZWQ7CisKKyAgLy8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSBwb2ludGVycyB0aGF0IG1heSByZXF1aXJlIGNoZWNraW5nLgorICBTbWFsbFZlY3RvcjxQb2ludGVySW5mbywgMj4gUG9pbnRlcnM7CisKKyAgLy8vIEhvbGRzIGEgcGFydGl0aW9uaW5nIG9mIHBvaW50ZXJzIGludG8gImNoZWNrIGdyb3VwcyIuCisgIFNtYWxsVmVjdG9yPENoZWNraW5nUHRyR3JvdXAsIDI+IENoZWNraW5nR3JvdXBzOworCisgIC8vLyBcYnJpZWYgQ2hlY2sgaWYgcG9pbnRlcnMgYXJlIGluIHRoZSBzYW1lIHBhcnRpdGlvbgorICAvLy8KKyAgLy8vIFxwIFB0clRvUGFydGl0aW9uIGNvbnRhaW5zIHRoZSBwYXJ0aXRpb24gbnVtYmVyIGZvciBwb2ludGVycyAoLTEgaWYgdGhlCisgIC8vLyBwb2ludGVyIGJlbG9uZ3MgdG8gbXVsdGlwbGUgcGFydGl0aW9ucykuCisgIHN0YXRpYyBib29sCisgIGFyZVBvaW50ZXJzSW5TYW1lUGFydGl0aW9uKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxpbnQ+ICZQdHJUb1BhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUHRySWR4MSwgdW5zaWduZWQgUHRySWR4Mik7CisKKyAgLy8vIFxicmllZiBEZWNpZGUgd2hldGhlciB3ZSBuZWVkIHRvIGlzc3VlIGEgcnVuLXRpbWUgY2hlY2sgZm9yIHBvaW50ZXIgYXQKKyAgLy8vIGluZGV4IFxwIEkgYW5kIFxwIEogdG8gcHJvdmUgdGhlaXIgaW5kZXBlbmRlbmNlLgorICBib29sIG5lZWRzQ2hlY2tpbmcodW5zaWduZWQgSSwgdW5zaWduZWQgSikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gUG9pbnRlckluZm8gZm9yIHBvaW50ZXIgYXQgaW5kZXggXHAgUHRySWR4LgorICBjb25zdCBQb2ludGVySW5mbyAmZ2V0UG9pbnRlckluZm8odW5zaWduZWQgUHRySWR4KSBjb25zdCB7CisgICAgcmV0dXJuIFBvaW50ZXJzW1B0cklkeF07CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBHcm91cHMgcG9pbnRlcnMgc3VjaCB0aGF0IGEgc2luZ2xlIG1lbWNoZWNrIGlzIHJlcXVpcmVkCisgIC8vLyBiZXR3ZWVuIHR3byBkaWZmZXJlbnQgZ3JvdXBzLiBUaGlzIHdpbGwgY2xlYXIgdGhlIENoZWNraW5nR3JvdXBzIHZlY3RvcgorICAvLy8gYW5kIHJlLWNvbXB1dGUgaXQuIFdlIHdpbGwgb25seSBncm91cCBkZXBlbmRlY2llcyBpZiBccCBVc2VEZXBlbmRlbmNpZXMKKyAgLy8vIGlzIHRydWUsIG90aGVyd2lzZSB3ZSB3aWxsIGNyZWF0ZSBhIHNlcGFyYXRlIGdyb3VwIGZvciBlYWNoIHBvaW50ZXIuCisgIHZvaWQgZ3JvdXBDaGVja3MoTWVtb3J5RGVwQ2hlY2tlcjo6RGVwQ2FuZGlkYXRlcyAmRGVwQ2FuZHMsCisgICAgICAgICAgICAgICAgICAgYm9vbCBVc2VEZXBlbmRlbmNpZXMpOworCisgIC8vLyBHZW5lcmF0ZSB0aGUgY2hlY2tzIGFuZCByZXR1cm4gdGhlbS4KKyAgU21hbGxWZWN0b3I8UG9pbnRlckNoZWNrLCA0PgorICBnZW5lcmF0ZUNoZWNrcygpIGNvbnN0OworCisgIC8vLyBIb2xkcyBhIHBvaW50ZXIgdG8gdGhlIFNjYWxhckV2b2x1dGlvbiBhbmFseXNpcy4KKyAgU2NhbGFyRXZvbHV0aW9uICpTRTsKKworICAvLy8gXGJyaWVmIFNldCBvZiBydW4tdGltZSBjaGVja3MgcmVxdWlyZWQgdG8gZXN0YWJsaXNoIGluZGVwZW5kZW5jZSBvZgorICAvLy8gb3RoZXJ3aXNlIG1heS1hbGlhc2luZyBwb2ludGVycyBpbiB0aGUgbG9vcC4KKyAgU21hbGxWZWN0b3I8UG9pbnRlckNoZWNrLCA0PiBDaGVja3M7Cit9OworCisvLy8gXGJyaWVmIERyaXZlIHRoZSBhbmFseXNpcyBvZiBtZW1vcnkgYWNjZXNzZXMgaW4gdGhlIGxvb3AKKy8vLworLy8vIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGFuYWx5emluZyB0aGUgbWVtb3J5IGFjY2Vzc2VzIG9mIGEgbG9vcC4gIEl0CisvLy8gY29sbGVjdHMgdGhlIGFjY2Vzc2VzIGFuZCB0aGVuIGl0cyBtYWluIGhlbHBlciB0aGUgQWNjZXNzQW5hbHlzaXMgY2xhc3MKKy8vLyBmaW5kcyBhbmQgY2F0ZWdvcml6ZXMgdGhlIGRlcGVuZGVuY2VzIGluIGJ1aWxkRGVwZW5kZW5jZVNldHMuCisvLy8KKy8vLyBGb3IgbWVtb3J5IGRlcGVuZGVuY2VzIHRoYXQgY2FuIGJlIGFuYWx5emVkIGF0IGNvbXBpbGUgdGltZSwgaXQgZGV0ZXJtaW5lcworLy8vIHdoZXRoZXIgdGhlIGRlcGVuZGVuY2UgaXMgcGFydCBvZiBjeWNsZSBpbmhpYml0aW5nIHZlY3Rvcml6YXRpb24uICBUaGlzIHdvcmsKKy8vLyBpcyBkZWxlZ2F0ZWQgdG8gdGhlIE1lbW9yeURlcENoZWNrZXIgY2xhc3MuCisvLy8KKy8vLyBGb3IgbWVtb3J5IGRlcGVuZGVuY2VzIHRoYXQgY2Fubm90IGJlIGRldGVybWluZWQgYXQgY29tcGlsZSB0aW1lLCBpdAorLy8vIGdlbmVyYXRlcyBydW4tdGltZSBjaGVja3MgdG8gcHJvdmUgaW5kZXBlbmRlbmNlLiAgVGhpcyBpcyBkb25lIGJ5CisvLy8gQWNjZXNzQW5hbHlzaXM6OmNhbkNoZWNrUHRyQXRSVCBhbmQgdGhlIGNoZWNrcyBhcmUgbWFpbnRhaW5lZCBieSB0aGUKKy8vLyBSdW50aW1lUG9pbnRlckNoZWNrIGNsYXNzLgorLy8vCisvLy8gSWYgcG9pbnRlcnMgY2FuIHdyYXAgb3IgY2FuJ3QgYmUgZXhwcmVzc2VkIGFzIGFmZmluZSBBZGRSZWMgZXhwcmVzc2lvbnMgYnkKKy8vLyBTY2FsYXJFdm9sdXRpb24sIHdlIHdpbGwgZ2VuZXJhdGUgcnVuLXRpbWUgY2hlY2tzIGJ5IGVtaXR0aW5nIGEKKy8vLyBTQ0VWVW5pb25QcmVkaWNhdGUuCisvLy8KKy8vLyBDaGVja3MgZm9yIGJvdGggbWVtb3J5IGRlcGVuZGVuY2VzIGFuZCB0aGUgU0NFViBwcmVkaWNhdGVzIGNvbnRhaW5lZCBpbiB0aGUKKy8vLyBQU0UgbXVzdCBiZSBlbWl0dGVkIGluIG9yZGVyIGZvciB0aGUgcmVzdWx0cyBvZiB0aGlzIGFuYWx5c2lzIHRvIGJlIHZhbGlkLgorY2xhc3MgTG9vcEFjY2Vzc0luZm8geworcHVibGljOgorICBMb29wQWNjZXNzSW5mbyhMb29wICpMLCBTY2FsYXJFdm9sdXRpb24gKlNFLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJLAorICAgICAgICAgICAgICAgICBBbGlhc0FuYWx5c2lzICpBQSwgRG9taW5hdG9yVHJlZSAqRFQsIExvb3BJbmZvICpMSSk7CisKKyAgLy8vIFJldHVybiB0cnVlIHdlIGNhbiBhbmFseXplIHRoZSBtZW1vcnkgYWNjZXNzZXMgaW4gdGhlIGxvb3AgYW5kIHRoZXJlIGFyZQorICAvLy8gbm8gbWVtb3J5IGRlcGVuZGVuY2UgY3ljbGVzLgorICBib29sIGNhblZlY3Rvcml6ZU1lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIENhblZlY01lbTsgfQorCisgIGNvbnN0IFJ1bnRpbWVQb2ludGVyQ2hlY2tpbmcgKmdldFJ1bnRpbWVQb2ludGVyQ2hlY2tpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIFB0clJ0Q2hlY2tpbmcuZ2V0KCk7CisgIH0KKworICAvLy8gXGJyaWVmIE51bWJlciBvZiBtZW1jaGVja3MgcmVxdWlyZWQgdG8gcHJvdmUgaW5kZXBlbmRlbmNlIG9mIG90aGVyd2lzZQorICAvLy8gbWF5LWFsaWFzIHBvaW50ZXJzLgorICB1bnNpZ25lZCBnZXROdW1SdW50aW1lUG9pbnRlckNoZWNrcygpIGNvbnN0IHsKKyAgICByZXR1cm4gUHRyUnRDaGVja2luZy0+Z2V0TnVtYmVyT2ZDaGVja3MoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYmxvY2sgQkIgbmVlZHMgdG8gYmUgcHJlZGljYXRlZCBpbiBvcmRlciBmb3IgdGhlIGxvb3AKKyAgLy8vIHRvIGJlIHZlY3Rvcml6ZWQuCisgIHN0YXRpYyBib29sIGJsb2NrTmVlZHNQcmVkaWNhdGlvbihCYXNpY0Jsb2NrICpCQiwgTG9vcCAqVGhlTG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgKkRUKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBWIGlzIHVuaWZvcm0gd2l0aGluIHRoZSBsb29wLgorICBib29sIGlzVW5pZm9ybShWYWx1ZSAqVikgY29uc3Q7CisKKyAgdWludDY0X3QgZ2V0TWF4U2FmZURlcERpc3RCeXRlcygpIGNvbnN0IHsgcmV0dXJuIE1heFNhZmVEZXBEaXN0Qnl0ZXM7IH0KKyAgdW5zaWduZWQgZ2V0TnVtU3RvcmVzKCkgY29uc3QgeyByZXR1cm4gTnVtU3RvcmVzOyB9CisgIHVuc2lnbmVkIGdldE51bUxvYWRzKCkgY29uc3QgeyByZXR1cm4gTnVtTG9hZHM7fQorCisgIC8vLyBcYnJpZWYgQWRkIGNvZGUgdGhhdCBjaGVja3MgYXQgcnVudGltZSBpZiB0aGUgYWNjZXNzZWQgYXJyYXlzIG92ZXJsYXAuCisgIC8vLworICAvLy8gUmV0dXJucyBhIHBhaXIgb2YgaW5zdHJ1Y3Rpb25zIHdoZXJlIHRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBmaXJzdAorICAvLy8gaW5zdHJ1Y3Rpb24gZ2VuZXJhdGVkIGluIHBvc3NpYmx5IGEgc2VxdWVuY2Ugb2YgaW5zdHJ1Y3Rpb25zIGFuZCB0aGUKKyAgLy8vIHNlY29uZCB2YWx1ZSBpcyB0aGUgZmluYWwgY29tcGFyYXRvciB2YWx1ZSBvciBOVUxMIGlmIG5vIGNoZWNrIGlzIG5lZWRlZC4KKyAgc3RkOjpwYWlyPEluc3RydWN0aW9uICosIEluc3RydWN0aW9uICo+CisgIGFkZFJ1bnRpbWVDaGVja3MoSW5zdHJ1Y3Rpb24gKkxvYykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZW5lcmV0ZSB0aGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgY2hlY2tzIGluIFxwIFBvaW50ZXJDaGVja3MuCisgIC8vLworICAvLy8gUmV0dXJucyBhIHBhaXIgb2YgaW5zdHJ1Y3Rpb25zIHdoZXJlIHRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBmaXJzdAorICAvLy8gaW5zdHJ1Y3Rpb24gZ2VuZXJhdGVkIGluIHBvc3NpYmx5IGEgc2VxdWVuY2Ugb2YgaW5zdHJ1Y3Rpb25zIGFuZCB0aGUKKyAgLy8vIHNlY29uZCB2YWx1ZSBpcyB0aGUgZmluYWwgY29tcGFyYXRvciB2YWx1ZSBvciBOVUxMIGlmIG5vIGNoZWNrIGlzIG5lZWRlZC4KKyAgc3RkOjpwYWlyPEluc3RydWN0aW9uICosIEluc3RydWN0aW9uICo+CisgIGFkZFJ1bnRpbWVDaGVja3MoSW5zdHJ1Y3Rpb24gKkxvYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8UnVudGltZVBvaW50ZXJDaGVja2luZzo6UG9pbnRlckNoZWNrPgorICAgICAgICAgICAgICAgICAgICAgICAmUG9pbnRlckNoZWNrcykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUaGUgZGlhZ25vc3RpY3MgcmVwb3J0IGdlbmVyYXRlZCBmb3IgdGhlIGFuYWx5c2lzLiAgRS5nLiB3aHkgd2UKKyAgLy8vIGNvdWxkbid0IGFuYWx5emUgdGhlIGxvb3AuCisgIGNvbnN0IE9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzICpnZXRSZXBvcnQoKSBjb25zdCB7IHJldHVybiBSZXBvcnQuZ2V0KCk7IH0KKworICAvLy8gXGJyaWVmIHRoZSBNZW1vcnkgRGVwZW5kZW5jZSBDaGVja2VyIHdoaWNoIGNhbiBkZXRlcm1pbmUgdGhlCisgIC8vLyBsb29wLWluZGVwZW5kZW50IGFuZCBsb29wLWNhcnJpZWQgZGVwZW5kZW5jZXMgYmV0d2VlbiBtZW1vcnkgYWNjZXNzZXMuCisgIGNvbnN0IE1lbW9yeURlcENoZWNrZXIgJmdldERlcENoZWNrZXIoKSBjb25zdCB7IHJldHVybiAqRGVwQ2hlY2tlcjsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBsaXN0IG9mIGluc3RydWN0aW9ucyB0aGF0IHVzZSBccCBQdHIgdG8gcmVhZCBvciB3cml0ZQorICAvLy8gbWVtb3J5LgorICBTbWFsbFZlY3RvcjxJbnN0cnVjdGlvbiAqLCA0PiBnZXRJbnN0cnVjdGlvbnNGb3JBY2Nlc3MoVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNXcml0ZSkgY29uc3QgeworICAgIHJldHVybiBEZXBDaGVja2VyLT5nZXRJbnN0cnVjdGlvbnNGb3JBY2Nlc3MoUHRyLCBpc1dyaXRlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSWYgYW4gYWNjZXNzIGhhcyBhIHN5bWJvbGljIHN0cmlkZXMsIHRoaXMgbWFwcyB0aGUgcG9pbnRlciB2YWx1ZSB0bworICAvLy8gdGhlIHN0cmlkZSBzeW1ib2wuCisgIGNvbnN0IFZhbHVlVG9WYWx1ZU1hcCAmZ2V0U3ltYm9saWNTdHJpZGVzKCkgY29uc3QgeyByZXR1cm4gU3ltYm9saWNTdHJpZGVzOyB9CisKKyAgLy8vIFxicmllZiBQb2ludGVyIGhhcyBhIHN5bWJvbGljIHN0cmlkZS4KKyAgYm9vbCBoYXNTdHJpZGUoVmFsdWUgKlYpIGNvbnN0IHsgcmV0dXJuIFN0cmlkZVNldC5jb3VudChWKTsgfQorCisgIC8vLyBcYnJpZWYgUHJpbnQgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZW1vcnkgYWNjZXNzZXMgaW4gdGhlIGxvb3AuCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQ2hlY2tzIGV4aXN0ZW5jZSBvZiBzdG9yZSB0byBpbnZhcmlhbnQgYWRkcmVzcyBpbnNpZGUgbG9vcC4KKyAgLy8vIElmIHRoZSBsb29wIGhhcyBhbnkgc3RvcmUgdG8gaW52YXJpYW50IGFkZHJlc3MsIHRoZW4gaXQgcmV0dXJucyB0cnVlLAorICAvLy8gZWxzZSByZXR1cm5zIGZhbHNlLgorICBib29sIGhhc1N0b3JlVG9Mb29wSW52YXJpYW50QWRkcmVzcygpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RvcmVUb0xvb3BJbnZhcmlhbnRBZGRyZXNzOworICB9CisKKyAgLy8vIFVzZWQgdG8gYWRkIHJ1bnRpbWUgU0NFViBjaGVja3MuIFNpbXBsaWZpZXMgU0NFViBleHByZXNzaW9ucyBhbmQgY29udmVydHMKKyAgLy8vIHRoZW0gdG8gYSBtb3JlIHVzYWJsZSBmb3JtLiAgQWxsIFNDRVYgZXhwcmVzc2lvbnMgZHVyaW5nIHRoZSBhbmFseXNpcworICAvLy8gc2hvdWxkIGJlIHJlLXdyaXR0ZW4gKGFuZCB0aGVyZWZvcmUgc2ltcGxpZmllZCkgYWNjb3JkaW5nIHRvIFBTRS4KKyAgLy8vIEEgdXNlciBvZiBMb29wQWNjZXNzQW5hbHlzaXMgd2lsbCBuZWVkIHRvIGVtaXQgdGhlIHJ1bnRpbWUgY2hlY2tzCisgIC8vLyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcmVkaWNhdGUuCisgIGNvbnN0IFByZWRpY2F0ZWRTY2FsYXJFdm9sdXRpb24gJmdldFBTRSgpIGNvbnN0IHsgcmV0dXJuICpQU0U7IH0KKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBBbmFseXplIHRoZSBsb29wLgorICB2b2lkIGFuYWx5emVMb29wKEFsaWFzQW5hbHlzaXMgKkFBLCBMb29wSW5mbyAqTEksCisgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSwgRG9taW5hdG9yVHJlZSAqRFQpOworCisgIC8vLyBcYnJpZWYgQ2hlY2sgaWYgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbG9vcCBhbGxvd3MgaXQgdG8gYmUgYW5hbHl6ZWQgYnkgdGhpcworICAvLy8gcGFzcy4KKyAgYm9vbCBjYW5BbmFseXplTG9vcCgpOworCisgIC8vLyBcYnJpZWYgU2F2ZSB0aGUgYW5hbHlzaXMgcmVtYXJrLgorICAvLy8KKyAgLy8vIExBQSBkb2VzIG5vdCBkaXJlY3RseSBlbWl0cyB0aGUgcmVtYXJrcy4gIEluc3RlYWQgaXQgc3RvcmVzIGl0IHdoaWNoIHRoZQorICAvLy8gY2xpZW50IGNhbiByZXRyaWV2ZSBhbmQgcHJlc2VudHMgYXMgaXRzIG93biBhbmFseXNpcworICAvLy8gKGUuZy4gLVJwYXNzLWFuYWx5c2lzPWxvb3AtdmVjdG9yaXplKS4KKyAgT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMgJnJlY29yZEFuYWx5c2lzKFN0cmluZ1JlZiBSZW1hcmtOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc3RyID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBDb2xsZWN0IG1lbW9yeSBhY2Nlc3Mgd2l0aCBsb29wIGludmFyaWFudCBzdHJpZGVzLgorICAvLy8KKyAgLy8vIExvb2tzIGZvciBhY2Nlc3NlcyBsaWtlICJhW2kgKiBTdHJpZGVBXSIgd2hlcmUgIlN0cmlkZUEiIGlzIGxvb3AKKyAgLy8vIGludmFyaWFudC4KKyAgdm9pZCBjb2xsZWN0U3RyaWRlZEFjY2VzcyhWYWx1ZSAqTG9hZE9yU3RvcmVJbnN0KTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8UHJlZGljYXRlZFNjYWxhckV2b2x1dGlvbj4gUFNFOworCisgIC8vLyBXZSBuZWVkIHRvIGNoZWNrIHRoYXQgYWxsIG9mIHRoZSBwb2ludGVycyBpbiB0aGlzIGxpc3QgYXJlIGRpc2pvaW50CisgIC8vLyBhdCBydW50aW1lLiBVc2luZyBzdGQ6OnVuaXF1ZV9wdHIgdG8gbWFrZSB1c2luZyBtb3ZlIGN0b3Igc2ltcGxlci4KKyAgc3RkOjp1bmlxdWVfcHRyPFJ1bnRpbWVQb2ludGVyQ2hlY2tpbmc+IFB0clJ0Q2hlY2tpbmc7CisKKyAgLy8vIFxicmllZiB0aGUgTWVtb3J5IERlcGVuZGVuY2UgQ2hlY2tlciB3aGljaCBjYW4gZGV0ZXJtaW5lIHRoZQorICAvLy8gbG9vcC1pbmRlcGVuZGVudCBhbmQgbG9vcC1jYXJyaWVkIGRlcGVuZGVuY2VzIGJldHdlZW4gbWVtb3J5IGFjY2Vzc2VzLgorICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5RGVwQ2hlY2tlcj4gRGVwQ2hlY2tlcjsKKworICBMb29wICpUaGVMb29wOworCisgIHVuc2lnbmVkIE51bUxvYWRzOworICB1bnNpZ25lZCBOdW1TdG9yZXM7CisKKyAgdWludDY0X3QgTWF4U2FmZURlcERpc3RCeXRlczsKKworICAvLy8gXGJyaWVmIENhY2hlIHRoZSByZXN1bHQgb2YgYW5hbHl6ZUxvb3AuCisgIGJvb2wgQ2FuVmVjTWVtOworCisgIC8vLyBcYnJpZWYgSW5kaWNhdG9yIGZvciBzdG9yaW5nIHRvIHVuaWZvcm0gYWRkcmVzc2VzLgorICAvLy8gSWYgYSBsb29wIGhhcyB3cml0ZSB0byBhIGxvb3AgaW52YXJpYW50IGFkZHJlc3MgdGhlbiBpdCBzaG91bGQgYmUgdHJ1ZS4KKyAgYm9vbCBTdG9yZVRvTG9vcEludmFyaWFudEFkZHJlc3M7CisKKyAgLy8vIFxicmllZiBUaGUgZGlhZ25vc3RpY3MgcmVwb3J0IGdlbmVyYXRlZCBmb3IgdGhlIGFuYWx5c2lzLiAgRS5nLiB3aHkgd2UKKyAgLy8vIGNvdWxkbid0IGFuYWx5emUgdGhlIGxvb3AuCisgIHN0ZDo6dW5pcXVlX3B0cjxPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcz4gUmVwb3J0OworCisgIC8vLyBcYnJpZWYgSWYgYW4gYWNjZXNzIGhhcyBhIHN5bWJvbGljIHN0cmlkZXMsIHRoaXMgbWFwcyB0aGUgcG9pbnRlciB2YWx1ZSB0bworICAvLy8gdGhlIHN0cmlkZSBzeW1ib2wuCisgIFZhbHVlVG9WYWx1ZU1hcCBTeW1ib2xpY1N0cmlkZXM7CisKKyAgLy8vIFxicmllZiBTZXQgb2Ygc3ltYm9saWMgc3RyaWRlcyB2YWx1ZXMuCisgIFNtYWxsUHRyU2V0PFZhbHVlICosIDg+IFN0cmlkZVNldDsKK307CisKK1ZhbHVlICpzdHJpcEludGVnZXJDYXN0KFZhbHVlICpWKTsKKworLy8vIFxicmllZiBSZXR1cm4gdGhlIFNDRVYgY29ycmVzcG9uZGluZyB0byBhIHBvaW50ZXIgd2l0aCB0aGUgc3ltYm9saWMgc3RyaWRlCisvLy8gcmVwbGFjZWQgd2l0aCBjb25zdGFudCBvbmUsIGFzc3VtaW5nIHRoZSBTQ0VWIHByZWRpY2F0ZSBhc3NvY2lhdGVkIHdpdGgKKy8vLyBccCBQU0UgaXMgdHJ1ZS4KKy8vLworLy8vIElmIG5lY2Vzc2FyeSB0aGlzIG1ldGhvZCB3aWxsIHZlcnNpb24gdGhlIHN0cmlkZSBvZiB0aGUgcG9pbnRlciBhY2NvcmRpbmcKKy8vLyB0byBccCBQdHJUb1N0cmlkZSBhbmQgdGhlcmVmb3JlIGFkZCBmdXJ0aGVyIHByZWRpY2F0ZXMgdG8gXHAgUFNFLgorLy8vCisvLy8gSWYgXHAgT3JpZ1B0ciBpcyBub3QgbnVsbCwgdXNlIGl0IHRvIGxvb2sgdXAgdGhlIHN0cmlkZSB2YWx1ZSBpbnN0ZWFkIG9mIFxwCisvLy8gUHRyLiAgXHAgUHRyVG9TdHJpZGUgcHJvdmlkZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgcG9pbnRlciB2YWx1ZSBhbmQgaXRzCisvLy8gc3RyaWRlIGFzIGNvbGxlY3RlZCBieSBMb29wVmVjdG9yaXphdGlvbkxlZ2FsaXR5Ojpjb2xsZWN0U3RyaWRlZEFjY2Vzcy4KK2NvbnN0IFNDRVYgKnJlcGxhY2VTeW1ib2xpY1N0cmlkZVNDRVYoUHJlZGljYXRlZFNjYWxhckV2b2x1dGlvbiAmUFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZVRvVmFsdWVNYXAgJlB0clRvU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqUHRyLCBWYWx1ZSAqT3JpZ1B0ciA9IG51bGxwdHIpOworCisvLy8gXGJyaWVmIElmIHRoZSBwb2ludGVyIGhhcyBhIGNvbnN0YW50IHN0cmlkZSByZXR1cm4gaXQgaW4gdW5pdHMgb2YgaXRzCisvLy8gZWxlbWVudCBzaXplLiAgT3RoZXJ3aXNlIHJldHVybiB6ZXJvLgorLy8vCisvLy8gRW5zdXJlIHRoYXQgaXQgZG9lcyBub3Qgd3JhcCBpbiB0aGUgYWRkcmVzcyBzcGFjZSwgYXNzdW1pbmcgdGhlIHByZWRpY2F0ZQorLy8vIGFzc29jaWF0ZWQgd2l0aCBccCBQU0UgaXMgdHJ1ZS4KKy8vLworLy8vIElmIG5lY2Vzc2FyeSB0aGlzIG1ldGhvZCB3aWxsIHZlcnNpb24gdGhlIHN0cmlkZSBvZiB0aGUgcG9pbnRlciBhY2NvcmRpbmcKKy8vLyB0byBccCBQdHJUb1N0cmlkZSBhbmQgdGhlcmVmb3JlIGFkZCBmdXJ0aGVyIHByZWRpY2F0ZXMgdG8gXHAgUFNFLgorLy8vIFRoZSBccCBBc3N1bWUgcGFyYW1ldGVyIGluZGljYXRlcyBpZiB3ZSBhcmUgYWxsb3dlZCB0byBtYWtlIGFkZGl0aW9uYWwKKy8vLyBydW4tdGltZSBhc3N1bXB0aW9ucy4KK2ludDY0X3QgZ2V0UHRyU3RyaWRlKFByZWRpY2F0ZWRTY2FsYXJFdm9sdXRpb24gJlBTRSwgVmFsdWUgKlB0ciwgY29uc3QgTG9vcCAqTHAsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZVRvVmFsdWVNYXAgJlN0cmlkZXNNYXAgPSBWYWx1ZVRvVmFsdWVNYXAoKSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgQXNzdW1lID0gZmFsc2UsIGJvb2wgU2hvdWxkQ2hlY2tXcmFwID0gdHJ1ZSk7CisKKy8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBtZW1vcnkgb3BlcmF0aW9ucyBccCBBIGFuZCBccCBCIGFyZSBjb25zZWN1dGl2ZS4KKy8vLyBUaGlzIGlzIGEgc2ltcGxlIEFQSSB0aGF0IGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgYW5hbHlzaXMgcGFzcy4gCitib29sIGlzQ29uc2VjdXRpdmVBY2Nlc3MoVmFsdWUgKkEsIFZhbHVlICpCLCBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gJlNFLCBib29sIENoZWNrVHlwZSA9IHRydWUpOworCisvLy8gXGJyaWVmIFRoaXMgYW5hbHlzaXMgcHJvdmlkZXMgZGVwZW5kZW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIG1lbW9yeSBhY2Nlc3NlcworLy8vIG9mIGEgbG9vcC4KKy8vLworLy8vIEl0IHJ1bnMgdGhlIGFuYWx5c2lzIGZvciBhIGxvb3Agb24gZGVtYW5kLiAgVGhpcyBjYW4gYmUgaW5pdGlhdGVkIGJ5CisvLy8gcXVlcnlpbmcgdGhlIGxvb3AgYWNjZXNzIGluZm8gdmlhIExBQTo6Z2V0SW5mby4gIGdldEluZm8gcmV0dXJuIGEKKy8vLyBMb29wQWNjZXNzSW5mbyBvYmplY3QuICBTZWUgdGhpcyBjbGFzcyBmb3IgdGhlIHNwZWNpZmljcyBvZiB3aGF0IGluZm9ybWF0aW9uCisvLy8gaXMgcHJvdmlkZWQuCitjbGFzcyBMb29wQWNjZXNzTGVnYWN5QW5hbHlzaXMgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgTG9vcEFjY2Vzc0xlZ2FjeUFuYWx5c2lzKCkgOiBGdW5jdGlvblBhc3MoSUQpIHsKKyAgICBpbml0aWFsaXplTG9vcEFjY2Vzc0xlZ2FjeUFuYWx5c2lzUGFzcygqUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKSk7CisgIH0KKworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBRdWVyeSB0aGUgcmVzdWx0IG9mIHRoZSBsb29wIGFjY2VzcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGxvb3AgXHAgTC4KKyAgLy8vCisgIC8vLyBJZiB0aGVyZSBpcyBubyBjYWNoZWQgcmVzdWx0IGF2YWlsYWJsZSBydW4gdGhlIGFuYWx5c2lzLgorICBjb25zdCBMb29wQWNjZXNzSW5mbyAmZ2V0SW5mbyhMb29wICpMKTsKKworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZSB7CisgICAgLy8gSW52YWxpZGF0ZSB0aGUgY2FjaGUgd2hlbiB0aGUgcGFzcyBpcyBmcmVlZC4KKyAgICBMb29wQWNjZXNzSW5mb01hcC5jbGVhcigpOworICB9CisKKyAgLy8vIFxicmllZiBQcmludCB0aGUgcmVzdWx0IG9mIHRoZSBhbmFseXNpcyB3aGVuIGludm9rZWQgd2l0aCAtYW5hbHl6ZS4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSAqTSA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIFRoZSBjYWNoZS4KKyAgRGVuc2VNYXA8TG9vcCAqLCBzdGQ6OnVuaXF1ZV9wdHI8TG9vcEFjY2Vzc0luZm8+PiBMb29wQWNjZXNzSW5mb01hcDsKKworICAvLyBUaGUgdXNlZCBhbmFseXNpcyBwYXNzZXMuCisgIFNjYWxhckV2b2x1dGlvbiAqU0U7CisgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEk7CisgIEFsaWFzQW5hbHlzaXMgKkFBOworICBEb21pbmF0b3JUcmVlICpEVDsKKyAgTG9vcEluZm8gKkxJOworfTsKKworLy8vIFxicmllZiBUaGlzIGFuYWx5c2lzIHByb3ZpZGVzIGRlcGVuZGVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBtZW1vcnkKKy8vLyBhY2Nlc3NlcyBvZiBhIGxvb3AuCisvLy8KKy8vLyBJdCBydW5zIHRoZSBhbmFseXNpcyBmb3IgYSBsb29wIG9uIGRlbWFuZC4gIFRoaXMgY2FuIGJlIGluaXRpYXRlZCBieQorLy8vIHF1ZXJ5aW5nIHRoZSBsb29wIGFjY2VzcyBpbmZvIHZpYSBBTS5nZXRSZXN1bHQ8TG9vcEFjY2Vzc0FuYWx5c2lzPi4gCisvLy8gZ2V0UmVzdWx0IHJldHVybiBhIExvb3BBY2Nlc3NJbmZvIG9iamVjdC4gIFNlZSB0aGlzIGNsYXNzIGZvciB0aGUKKy8vLyBzcGVjaWZpY3Mgb2Ygd2hhdCBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZC4KK2NsYXNzIExvb3BBY2Nlc3NBbmFseXNpcworICAgIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPExvb3BBY2Nlc3NBbmFseXNpcz4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48TG9vcEFjY2Vzc0FuYWx5c2lzPjsKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICB0eXBlZGVmIExvb3BBY2Nlc3NJbmZvIFJlc3VsdDsKKworICBSZXN1bHQgcnVuKExvb3AgJkwsIExvb3BBbmFseXNpc01hbmFnZXIgJkFNLCBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJkFSKTsKK307CisKK2lubGluZSBJbnN0cnVjdGlvbiAqTWVtb3J5RGVwQ2hlY2tlcjo6RGVwZW5kZW5jZTo6Z2V0U291cmNlKAorICAgIGNvbnN0IExvb3BBY2Nlc3NJbmZvICZMQUkpIGNvbnN0IHsKKyAgcmV0dXJuIExBSS5nZXREZXBDaGVja2VyKCkuZ2V0TWVtb3J5SW5zdHJ1Y3Rpb25zKClbU291cmNlXTsKK30KKworaW5saW5lIEluc3RydWN0aW9uICpNZW1vcnlEZXBDaGVja2VyOjpEZXBlbmRlbmNlOjpnZXREZXN0aW5hdGlvbigKKyAgICBjb25zdCBMb29wQWNjZXNzSW5mbyAmTEFJKSBjb25zdCB7CisgIHJldHVybiBMQUkuZ2V0RGVwQ2hlY2tlcigpLmdldE1lbW9yeUluc3RydWN0aW9ucygpW0Rlc3RpbmF0aW9uXTsKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BBbmFseXNpc01hbmFnZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9vcEFuYWx5c2lzTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxN2VlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BBbmFseXNpc01hbmFnZXIuaApAQCAtMCwwICsxLDE2MCBAQAorLy89PT0tIExvb3BBbmFseXNpc01hbmFnZXIuaCAtIExvb3AgYW5hbHlzaXMgbWFuYWdlbWVudCAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vCisvLy8gVGhpcyBoZWFkZXIgcHJvdmlkZXMgY2xhc3NlcyBmb3IgbWFuYWdpbmcgcGVyLWxvb3AgYW5hbHlzZXMuIFRoZXNlIGFyZQorLy8vIHR5cGljYWxseSB1c2VkIGFzIHBhcnQgb2YgYSBsb29wIHBhc3MgcGlwZWxpbmUgb3ZlciB0aGUgbG9vcCBuZXN0cyBvZgorLy8vIGEgZnVuY3Rpb24uCisvLy8KKy8vLyBMb29wIGFuYWx5c2VzIGFyZSBhbGxvd2VkIHRvIG1ha2Ugc29tZSBzaW1wbGlmeWluZyBhc3N1bXB0aW9uczoKKy8vLyAxKSBMb29wcyBhcmUsIHdoZXJlIHBvc3NpYmxlLCBpbiBzaW1wbGlmaWVkIGZvcm0uCisvLy8gMikgTG9vcHMgYXJlICphbHdheXMqIGluIExDU1NBIGZvcm0uCisvLy8gMykgQSBjb2xsZWN0aW9uIG9mIGFuYWx5c2lzIHJlc3VsdHMgYXJlIGF2YWlsYWJsZToKKy8vLyAgICAtIExvb3BJbmZvCisvLy8gICAgLSBEb21pbmF0b3JUcmVlCisvLy8gICAgLSBTY2FsYXJFdm9sdXRpb24KKy8vLyAgICAtIEFBTWFuYWdlcgorLy8vCisvLy8gVGhlIHByaW1hcnkgbWVjaGFuaXNtIHRvIHByb3ZpZGUgdGhlc2UgaW52YXJpYW50cyBpcyB0aGUgbG9vcCBwYXNzIG1hbmFnZXIsCisvLy8gYnV0IHRoZXkgY2FuIGFsc28gYmUgbWFudWFsbHkgcHJvdmlkZWQgaW4gb3JkZXIgdG8gcmVhc29uIGFib3V0IGEgbG9vcCBmcm9tCisvLy8gb3V0c2lkZSBvZiBhIGRlZGljYXRlZCBwYXNzIG1hbmFnZXIuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19MT09QQU5BTFlTSVNNQU5BR0VSX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19MT09QQU5BTFlTSVNNQU5BR0VSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1Bvc3RPcmRlckl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUHJpb3JpdHlXb3JrbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQmFzaWNBbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9HbG9iYWxzTW9kUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTWVtb3J5U1NBLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkFsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1RhcmdldExpYnJhcnlJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9UYXJnZXRUcmFuc2Zvcm1JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUaGUgYWRhcHRvciBmcm9tIGEgZnVuY3Rpb24gcGFzcyB0byBhIGxvb3AgcGFzcyBjb21wdXRlcyB0aGVzZSBhbmFseXNlcyBhbmQKKy8vLyBtYWtlcyB0aGVtIGF2YWlsYWJsZSB0byB0aGUgbG9vcCBwYXNzZXMgImZvciBmcmVlIi4gRWFjaCBsb29wIHBhc3MgaXMKKy8vLyBleHBlY3RlZCBleHBlY3RlZCB0byB1cGRhdGUgdGhlc2UgYW5hbHlzZXMgaWYgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGV5J3JlCisvLy8gdmFsaWQgYWZ0ZXIgaXQgcnVucy4KK3N0cnVjdCBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgeworICBBQVJlc3VsdHMgJkFBOworICBBc3N1bXB0aW9uQ2FjaGUgJkFDOworICBEb21pbmF0b3JUcmVlICZEVDsKKyAgTG9vcEluZm8gJkxJOworICBTY2FsYXJFdm9sdXRpb24gJlNFOworICBUYXJnZXRMaWJyYXJ5SW5mbyAmVExJOworICBUYXJnZXRUcmFuc2Zvcm1JbmZvICZUVEk7CisgIE1lbW9yeVNTQSAqTVNTQTsKK307CisKKy8vLyBFbmFibGVzIG1lbW9yeSBzc2EgYXMgYSBkZXBlbmRlbmN5IGZvciBsb29wIHBhc3Nlcy4KK2V4dGVybiBjbDo6b3B0PGJvb2w+IEVuYWJsZU1TU0FMb29wRGVwZW5kZW5jeTsKKworLy8vIEV4dGVybiB0ZW1wbGF0ZSBkZWNsYXJhdGlvbiBmb3IgdGhlIGFuYWx5c2lzIHNldCBmb3IgdGhpcyBJUiB1bml0LgorZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIEFsbEFuYWx5c2VzT248TG9vcD47CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBBbmFseXNpc01hbmFnZXI8TG9vcCwgTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzICY+OworLy8vIFxicmllZiBUaGUgbG9vcCBhbmFseXNpcyBtYW5hZ2VyLgorLy8vCisvLy8gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgQW5hbHlzaXNNYW5hZ2VyIHRlbXBsYXRlIGZvciBkZXRhaWwKKy8vLyBkb2N1bWVudGF0aW9uLiBUaGlzIHR5cGVkZWYgc2VydmVzIGFzIGEgY29udmVuaWVudCB3YXkgdG8gcmVmZXIgdG8gdGhpcworLy8vIGNvbnN0cnVjdCBpbiB0aGUgYWRhcHRvcnMgYW5kIHByb3hpZXMgdXNlZCB0byBpbnRlZ3JhdGUgdGhpcyBpbnRvIHRoZSBsYXJnZXIKKy8vLyBwYXNzIG1hbmFnZXIgaW5mcmFzdHJ1Y3R1cmUuCit0eXBlZGVmIEFuYWx5c2lzTWFuYWdlcjxMb29wLCBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJj4KKyAgICBMb29wQW5hbHlzaXNNYW5hZ2VyOworCisvLy8gQSBwcm94eSBmcm9tIGEgXGMgTG9vcEFuYWx5c2lzTWFuYWdlciB0byBhIFxjIEZ1bmN0aW9uLgordHlwZWRlZiBJbm5lckFuYWx5c2lzTWFuYWdlclByb3h5PExvb3BBbmFseXNpc01hbmFnZXIsIEZ1bmN0aW9uPgorICAgIExvb3BBbmFseXNpc01hbmFnZXJGdW5jdGlvblByb3h5OworCisvLy8gQSBzcGVjaWFsaXplZCByZXN1bHQgZm9yIHRoZSBcYyBMb29wQW5hbHlzaXNNYW5hZ2VyRnVuY3Rpb25Qcm94eSB3aGljaAorLy8vIHJldGFpbnMgYSBcYyBMb29wSW5mbyByZWZlcmVuY2UuCisvLy8KKy8vLyBUaGlzIGFsbG93cyBpdCB0byBjb2xsZWN0IGxvb3Agb2JqZWN0cyBmb3Igd2hpY2ggYW5hbHlzaXMgcmVzdWx0cyBtYXkgYmUKKy8vLyBjYWNoZWQgaW4gdGhlIFxjIExvb3BBbmFseXNpc01hbmFnZXIuCit0ZW1wbGF0ZSA8PiBjbGFzcyBMb29wQW5hbHlzaXNNYW5hZ2VyRnVuY3Rpb25Qcm94eTo6UmVzdWx0IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgUmVzdWx0KExvb3BBbmFseXNpc01hbmFnZXIgJklubmVyQU0sIExvb3BJbmZvICZMSSkKKyAgICAgIDogSW5uZXJBTSgmSW5uZXJBTSksIExJKCZMSSkge30KKyAgUmVzdWx0KFJlc3VsdCAmJkFyZykgOiBJbm5lckFNKHN0ZDo6bW92ZShBcmcuSW5uZXJBTSkpLCBMSShBcmcuTEkpIHsKKyAgICAvLyBXZSBoYXZlIHRvIG51bGwgb3V0IHRoZSBhbmFseXNpcyBtYW5hZ2VyIGluIHRoZSBtb3ZlZC1mcm9tIHN0YXRlCisgICAgLy8gYmVjYXVzZSB3ZSBhcmUgdGFraW5nIG93bmVyc2hpcCBvZiB0aGUgcmVzcG9uc2liaWx0eSB0byBjbGVhciB0aGUKKyAgICAvLyBhbmFseXNpcyBzdGF0ZS4KKyAgICBBcmcuSW5uZXJBTSA9IG51bGxwdHI7CisgIH0KKyAgUmVzdWx0ICZvcGVyYXRvcj0oUmVzdWx0ICYmUkhTKSB7CisgICAgSW5uZXJBTSA9IFJIUy5Jbm5lckFNOworICAgIExJID0gUkhTLkxJOworICAgIC8vIFdlIGhhdmUgdG8gbnVsbCBvdXQgdGhlIGFuYWx5c2lzIG1hbmFnZXIgaW4gdGhlIG1vdmVkLWZyb20gc3RhdGUKKyAgICAvLyBiZWNhdXNlIHdlIGFyZSB0YWtpbmcgb3duZXJzaGlwIG9mIHRoZSByZXNwb25zaWJpbHR5IHRvIGNsZWFyIHRoZQorICAgIC8vIGFuYWx5c2lzIHN0YXRlLgorICAgIFJIUy5Jbm5lckFNID0gbnVsbHB0cjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgflJlc3VsdCgpIHsKKyAgICAvLyBJbm5lckFNIGlzIGNsZWFyZWQgaW4gYSBtb3ZlZCBmcm9tIHN0YXRlIHdoZXJlIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCisgICAgaWYgKCFJbm5lckFNKQorICAgICAgcmV0dXJuOworCisgICAgLy8gQ2xlYXIgb3V0IHRoZSBhbmFseXNpcyBtYW5hZ2VyIGlmIHdlJ3JlIGJlaW5nIGRlc3Ryb3llZCAtLSBpdCBtZWFucyB3ZQorICAgIC8vIGRpZG4ndCBldmVuIHNlZSBhbiBpbnZhbGlkYXRlIGNhbGwgd2hlbiB3ZSBnb3QgaW52YWxpZGF0ZWQuCisgICAgSW5uZXJBTS0+Y2xlYXIoKTsKKyAgfQorCisgIC8vLyBBY2Nlc3NvciBmb3IgdGhlIGFuYWx5c2lzIG1hbmFnZXIuCisgIExvb3BBbmFseXNpc01hbmFnZXIgJmdldE1hbmFnZXIoKSB7IHJldHVybiAqSW5uZXJBTTsgfQorCisgIC8vLyBIYW5kbGVyIGZvciBpbnZhbGlkYXRpb24gb2YgdGhlIHByb3h5IGZvciBhIHBhcnRpY3VsYXIgZnVuY3Rpb24uCisgIC8vLworICAvLy8gSWYgdGhlIHByb3h5LCBcYyBMb29wSW5mbywgYW5kIGFzc29jaWF0ZWQgYW5hbHlzZXMgYXJlIHByZXNlcnZlZCwgdGhpcworICAvLy8gd2lsbCBtZXJlbHkgZm9yd2FyZCB0aGUgaW52YWxpZGF0aW9uIGV2ZW50IHRvIGFueSBjYWNoZWQgbG9vcCBhbmFseXNpcworICAvLy8gcmVzdWx0cyBmb3IgbG9vcHMgd2l0aGluIHRoaXMgZnVuY3Rpb24uCisgIC8vLworICAvLy8gSWYgdGhlIG5lY2Vzc2FyeSBsb29wIGluZnJhc3RydWN0dXJlIGlzIG5vdCBwcmVzZXJ2ZWQsIHRoaXMgd2lsbCBmb3JjaWJseQorICAvLy8gY2xlYXIgYWxsIG9mIHRoZSBjYWNoZWQgYW5hbHlzaXMgcmVzdWx0cyB0aGF0IGFyZSBrZXllZCBvbiB0aGUgXGMKKyAgLy8vIExvb3BJbmZvIGZvciB0aGlzIGZ1bmN0aW9uLgorICBib29sIGludmFsaWRhdGUoRnVuY3Rpb24gJkYsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICZQQSwKKyAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmSW52KTsKKworcHJpdmF0ZToKKyAgTG9vcEFuYWx5c2lzTWFuYWdlciAqSW5uZXJBTTsKKyAgTG9vcEluZm8gKkxJOworfTsKKworLy8vIFByb3ZpZGUgYSBzcGVjaWFsaXplZCBydW4gbWV0aG9kIGZvciB0aGUgXGMgTG9vcEFuYWx5c2lzTWFuYWdlckZ1bmN0aW9uUHJveHkKKy8vLyBzbyBpdCBjYW4gcGFzcyB0aGUgXGMgTG9vcEluZm8gdG8gdGhlIHJlc3VsdC4KK3RlbXBsYXRlIDw+CitMb29wQW5hbHlzaXNNYW5hZ2VyRnVuY3Rpb25Qcm94eTo6UmVzdWx0CitMb29wQW5hbHlzaXNNYW5hZ2VyRnVuY3Rpb25Qcm94eTo6cnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworCisvLyBFbnN1cmUgdGhlIFxjIExvb3BBbmFseXNpc01hbmFnZXJGdW5jdGlvblByb3h5IGlzIHByb3ZpZGVkIGFzIGFuIGV4dGVybgorLy8gdGVtcGxhdGUuCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgSW5uZXJBbmFseXNpc01hbmFnZXJQcm94eTxMb29wQW5hbHlzaXNNYW5hZ2VyLCBGdW5jdGlvbj47CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBPdXRlckFuYWx5c2lzTWFuYWdlclByb3h5PEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyLCBMb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzICY+OworLy8vIEEgcHJveHkgZnJvbSBhIFxjIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyIHRvIGEgXGMgTG9vcC4KK3R5cGVkZWYgT3V0ZXJBbmFseXNpc01hbmFnZXJQcm94eTxGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciwgTG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJj4KKyAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlckxvb3BQcm94eTsKKworLy8vIFJldHVybnMgdGhlIG1pbmltdW0gc2V0IG9mIEFuYWx5c2VzIHRoYXQgYWxsIGxvb3AgcGFzc2VzIG11c3QgcHJlc2VydmUuCitQcmVzZXJ2ZWRBbmFseXNlcyBnZXRMb29wUGFzc1ByZXNlcnZlZEFuYWx5c2VzKCk7Cit9CisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0xPT1BBTkFMWVNJU01BTkFHRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb29wSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YWZjMzkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgKQEAgLTAsMCArMSw5ODggQEAKKy8vPT09LSBsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmggLSBOYXR1cmFsIExvb3AgQ2FsY3VsYXRvciAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIExvb3BJbmZvIGNsYXNzIHRoYXQgaXMgdXNlZCB0byBpZGVudGlmeSBuYXR1cmFsIGxvb3BzCisvLyBhbmQgZGV0ZXJtaW5lIHRoZSBsb29wIGRlcHRoIG9mIHZhcmlvdXMgbm9kZXMgb2YgdGhlIENGRy4gIEEgbmF0dXJhbCBsb29wCisvLyBoYXMgZXhhY3RseSBvbmUgZW50cnktcG9pbnQsIHdoaWNoIGlzIGNhbGxlZCB0aGUgaGVhZGVyLiBOb3RlIHRoYXQgbmF0dXJhbAorLy8gbG9vcHMgbWF5IGFjdHVhbGx5IGJlIHNldmVyYWwgbG9vcHMgdGhhdCBzaGFyZSB0aGUgc2FtZSBoZWFkZXIgbm9kZS4KKy8vCisvLyBUaGlzIGFuYWx5c2lzIGNhbGN1bGF0ZXMgdGhlIG5lc3Rpbmcgc3RydWN0dXJlIG9mIGxvb3BzIGluIGEgZnVuY3Rpb24uICBGb3IKKy8vIGVhY2ggbmF0dXJhbCBsb29wIGlkZW50aWZpZWQsIHRoaXMgYW5hbHlzaXMgaWRlbnRpZmllcyBuYXR1cmFsIGxvb3BzCisvLyBjb250YWluZWQgZW50aXJlbHkgd2l0aGluIHRoZSBsb29wIGFuZCB0aGUgYmFzaWMgYmxvY2tzIHRoZSBtYWtlIHVwIHRoZSBsb29wLgorLy8KKy8vIEl0IGNhbiBjYWxjdWxhdGUgb24gdGhlIGZseSB2YXJpb3VzIGJpdHMgb2YgaW5mb3JtYXRpb24sIGZvciBleGFtcGxlOgorLy8KKy8vICAqIHdoZXRoZXIgdGhlcmUgaXMgYSBwcmVoZWFkZXIgZm9yIHRoZSBsb29wCisvLyAgKiB0aGUgbnVtYmVyIG9mIGJhY2sgZWRnZXMgdG8gdGhlIGhlYWRlcgorLy8gICogd2hldGhlciBvciBub3QgYSBwYXJ0aWN1bGFyIGJsb2NrIGJyYW5jaGVzIG91dCBvZiB0aGUgbG9vcAorLy8gICogdGhlIHN1Y2Nlc3NvciBibG9ja3Mgb2YgdGhlIGxvb3AKKy8vICAqIHRoZSBsb29wIGRlcHRoCisvLyAgKiBldGMuLi4KKy8vCisvLyBOb3RlIHRoYXQgdGhpcyBhbmFseXNpcyBzcGVjaWZpY2FsbHkgaWRlbnRpZmllcyAqTG9vcHMqIG5vdCBjeWNsZXMgb3IgU0NDcworLy8gaW4gdGhlIENGRy4gIFRoZXJlIGNhbiBiZSBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50cyBpbiB0aGUgQ0ZHIHdoaWNoCisvLyB0aGlzIGFuYWx5c2lzIHdpbGwgbm90IHJlY29nbml6ZSBhbmQgdGhhdCB3aWxsIG5vdCBiZSByZXByZXNlbnRlZCBieSBhIExvb3AKKy8vIGluc3RhbmNlLiAgSW4gcGFydGljdWxhciwgYSBMb29wIG1pZ2h0IGJlIGluc2lkZSBzdWNoIGEgbm9uLWxvb3AgU0NDLCBvciBhCisvLyBub24tbG9vcCBTQ0MgbWlnaHQgY29udGFpbiBhIHN1Yi1TQ0Mgd2hpY2ggaXMgYSBMb29wLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19MT09QSU5GT19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTE9PUElORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgTG9vcEluZm87CitjbGFzcyBMb29wOworY2xhc3MgTUROb2RlOworY2xhc3MgUEhJTm9kZTsKK2NsYXNzIHJhd19vc3RyZWFtOwordGVtcGxhdGUgPGNsYXNzIE4sIGJvb2wgSXNQb3N0RG9tPiBjbGFzcyBEb21pbmF0b3JUcmVlQmFzZTsKK3RlbXBsYXRlIDxjbGFzcyBOLCBjbGFzcyBNPiBjbGFzcyBMb29wSW5mb0Jhc2U7Cit0ZW1wbGF0ZSA8Y2xhc3MgTiwgY2xhc3MgTT4gY2xhc3MgTG9vcEJhc2U7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGxvb3BzIHRoYXQgYXJlIGRldGVjdGVkIGluIHRoZQorLy8vIGZsb3cgZ3JhcGguCisvLy8KK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPiBjbGFzcyBMb29wQmFzZSB7CisgIExvb3BUICpQYXJlbnRMb29wOworICAvLyBMb29wcyBjb250YWluZWQgZW50aXJlbHkgd2l0aGluIHRoaXMgb25lLgorICBzdGQ6OnZlY3RvcjxMb29wVCAqPiBTdWJMb29wczsKKworICAvLyBUaGUgbGlzdCBvZiBibG9ja3MgaW4gdGhpcyBsb29wLiBGaXJzdCBlbnRyeSBpcyB0aGUgaGVhZGVyIG5vZGUuCisgIHN0ZDo6dmVjdG9yPEJsb2NrVCAqPiBCbG9ja3M7CisKKyAgU21hbGxQdHJTZXQ8Y29uc3QgQmxvY2tUICosIDg+IERlbnNlQmxvY2tTZXQ7CisKKyNpZiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTCisgIC8vLyBJbmRpY2F0b3IgdGhhdCB0aGlzIGxvb3AgaXMgbm8gbG9uZ2VyIGEgdmFsaWQgbG9vcC4KKyAgYm9vbCBJc0ludmFsaWQgPSBmYWxzZTsKKyNlbmRpZgorCisgIExvb3BCYXNlKGNvbnN0IExvb3BCYXNlPEJsb2NrVCwgTG9vcFQ+ICYpID0gZGVsZXRlOworICBjb25zdCBMb29wQmFzZTxCbG9ja1QsIExvb3BUPiAmCisgIG9wZXJhdG9yPShjb25zdCBMb29wQmFzZTxCbG9ja1QsIExvb3BUPiAmKSA9IGRlbGV0ZTsKKworcHVibGljOgorICAvLy8gUmV0dXJuIHRoZSBuZXN0aW5nIGxldmVsIG9mIHRoaXMgbG9vcC4gIEFuIG91dGVyLW1vc3QgbG9vcCBoYXMgZGVwdGggMSwKKyAgLy8vIGZvciBjb25zaXN0ZW5jeSB3aXRoIGxvb3AgZGVwdGggdmFsdWVzIHVzZWQgZm9yIGJhc2ljIGJsb2Nrcywgd2hlcmUgZGVwdGgKKyAgLy8vIDAgaXMgdXNlZCBmb3IgYmxvY2tzIG5vdCBpbnNpZGUgYW55IGxvb3BzLgorICB1bnNpZ25lZCBnZXRMb29wRGVwdGgoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgICB1bnNpZ25lZCBEID0gMTsKKyAgICBmb3IgKGNvbnN0IExvb3BUICpDdXJMb29wID0gUGFyZW50TG9vcDsgQ3VyTG9vcDsKKyAgICAgICAgIEN1ckxvb3AgPSBDdXJMb29wLT5QYXJlbnRMb29wKQorICAgICAgKytEOworICAgIHJldHVybiBEOworICB9CisgIEJsb2NrVCAqZ2V0SGVhZGVyKCkgY29uc3QgeyByZXR1cm4gZ2V0QmxvY2tzKCkuZnJvbnQoKTsgfQorICBMb29wVCAqZ2V0UGFyZW50TG9vcCgpIGNvbnN0IHsgcmV0dXJuIFBhcmVudExvb3A7IH0KKworICAvLy8gVGhpcyBpcyBhIHJhdyBpbnRlcmZhY2UgZm9yIGJ5cGFzc2luZyBhZGRDaGlsZExvb3AuCisgIHZvaWQgc2V0UGFyZW50TG9vcChMb29wVCAqTCkgeworICAgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgICAgUGFyZW50TG9vcCA9IEw7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBsb29wIGlzIGNvbnRhaW5lZCB3aXRoaW4gaW4gdGhpcyBsb29wLgorICBib29sIGNvbnRhaW5zKGNvbnN0IExvb3BUICpMKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgICBpZiAoTCA9PSB0aGlzKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKCFMKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBjb250YWlucyhMLT5nZXRQYXJlbnRMb29wKCkpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2sgaXMgaW4gdGhpcyBsb29wLgorICBib29sIGNvbnRhaW5zKGNvbnN0IEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICAgIHJldHVybiBEZW5zZUJsb2NrU2V0LmNvdW50KEJCKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIGlzIGluIHRoaXMgbG9vcC4KKyAgdGVtcGxhdGUgPGNsYXNzIEluc3RUPiBib29sIGNvbnRhaW5zKGNvbnN0IEluc3RUICpJbnN0KSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnRhaW5zKEluc3QtPmdldFBhcmVudCgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGxvb3BzIGNvbnRhaW5lZCBlbnRpcmVseSB3aXRoaW4gdGhpcyBsb29wLgorICBjb25zdCBzdGQ6OnZlY3RvcjxMb29wVCAqPiAmZ2V0U3ViTG9vcHMoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgICByZXR1cm4gU3ViTG9vcHM7CisgIH0KKyAgc3RkOjp2ZWN0b3I8TG9vcFQgKj4gJmdldFN1Ykxvb3BzVmVjdG9yKCkgeworICAgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgICAgcmV0dXJuIFN1Ykxvb3BzOworICB9CisgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8TG9vcFQgKj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxMb29wVCAqPjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZXZlcnNlX2l0ZXJhdG9yOworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGdldFN1Ykxvb3BzKCkuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBnZXRTdWJMb29wcygpLmVuZCgpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gZ2V0U3ViTG9vcHMoKS5yYmVnaW4oKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiBnZXRTdWJMb29wcygpLnJlbmQoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gZ2V0U3ViTG9vcHMoKS5lbXB0eSgpOyB9CisKKyAgLy8vIEdldCBhIGxpc3Qgb2YgdGhlIGJhc2ljIGJsb2NrcyB3aGljaCBtYWtlIHVwIHRoaXMgbG9vcC4KKyAgQXJyYXlSZWY8QmxvY2tUICo+IGdldEJsb2NrcygpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICAgIHJldHVybiBCbG9ja3M7CisgIH0KKyAgdHlwZWRlZiB0eXBlbmFtZSBBcnJheVJlZjxCbG9ja1QgKj46OmNvbnN0X2l0ZXJhdG9yIGJsb2NrX2l0ZXJhdG9yOworICBibG9ja19pdGVyYXRvciBibG9ja19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGdldEJsb2NrcygpLmJlZ2luKCk7IH0KKyAgYmxvY2tfaXRlcmF0b3IgYmxvY2tfZW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0QmxvY2tzKCkuZW5kKCk7IH0KKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPGJsb2NrX2l0ZXJhdG9yPiBibG9ja3MoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShibG9ja19iZWdpbigpLCBibG9ja19lbmQoKSk7CisgIH0KKworICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgYmxvY2tzIGluIHRoaXMgbG9vcCBpbiBjb25zdGFudCB0aW1lLgorICAvLy8gSW52YWxpZGF0ZSB0aGUgbG9vcCwgaW5kaWNhdGluZyB0aGF0IGl0IGlzIG5vIGxvbmdlciBhIGxvb3AuCisgIHVuc2lnbmVkIGdldE51bUJsb2NrcygpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICAgIHJldHVybiBCbG9ja3Muc2l6ZSgpOworICB9CisKKyAgLy8vIFJldHVybiBhIGRpcmVjdCwgbXV0YWJsZSBoYW5kbGUgdG8gdGhlIGJsb2NrcyB2ZWN0b3Igc28gdGhhdCB3ZSBjYW4KKyAgLy8vIG11dGF0ZSBpdCBlZmZpY2llbnRseSB3aXRoIHRlY2huaXF1ZXMgbGlrZSBgc3RkOjpyZW1vdmVgLgorICBzdGQ6OnZlY3RvcjxCbG9ja1QgKj4gJmdldEJsb2Nrc1ZlY3RvcigpIHsKKyAgICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICAgIHJldHVybiBCbG9ja3M7CisgIH0KKyAgLy8vIFJldHVybiBhIGRpcmVjdCwgbXV0YWJsZSBoYW5kbGUgdG8gdGhlIGJsb2NrcyBzZXQgc28gdGhhdCB3ZSBjYW4KKyAgLy8vIG11dGF0ZSBpdCBlZmZpY2llbnRseS4KKyAgU21hbGxQdHJTZXRJbXBsPGNvbnN0IEJsb2NrVCAqPiAmZ2V0QmxvY2tzU2V0KCkgeworICAgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgICAgcmV0dXJuIERlbnNlQmxvY2tTZXQ7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBsb29wIGlzIG5vIGxvbmdlciB2YWxpZC4gIFRoZSBvbmx5IHZhbGlkIHVzZSBvZiB0aGlzCisgIC8vLyBoZWxwZXIgaXMgImFzc2VydChMLmlzSW52YWxpZCgpKSIgb3IgZXF1aXZhbGVudCwgc2luY2UgSXNJbnZhbGlkIGlzIHNldCB0bworICAvLy8gdHJ1ZSBieSB0aGUgZGVzdHJ1Y3Rvci4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGFjY2Vzc29yIHJldHVybnMgdHJ1ZSwKKyAgLy8vIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgdHJpZ2dlcmVkIFVCIGJ5IGNhbGxpbmcgdGhpcyBhY2Nlc3NvcjsgYW5kIHNvIGl0CisgIC8vLyBjYW4gb25seSBiZSBjYWxsZWQgaW4gYSBjb250ZXh0IHdoZXJlIGEgcmV0dXJuIHZhbHVlIG9mIHRydWUgaW5kaWNhdGVzIGEKKyAgLy8vIHByb2dyYW1tZXIgZXJyb3IuCisgIGJvb2wgaXNJbnZhbGlkKCkgY29uc3QgeworI2lmIExMVk1fRU5BQkxFX0FCSV9CUkVBS0lOR19DSEVDS1MKKyAgICByZXR1cm4gSXNJbnZhbGlkOworI2Vsc2UKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgfQorCisgIC8vLyBUcnVlIGlmIHRlcm1pbmF0b3IgaW4gdGhlIGJsb2NrIGNhbiBicmFuY2ggdG8gYW5vdGhlciBibG9jayB0aGF0IGlzCisgIC8vLyBvdXRzaWRlIG9mIHRoZSBjdXJyZW50IGxvb3AuCisgIGJvb2wgaXNMb29wRXhpdGluZyhjb25zdCBCbG9ja1QgKkJCKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJlN1Y2MgOiBjaGlsZHJlbjxjb25zdCBCbG9ja1QgKj4oQkIpKSB7CisgICAgICBpZiAoIWNvbnRhaW5zKFN1Y2MpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBccCBCQiBpcyBhIGxvb3AtbGF0Y2guCisgIC8vLyBBIGxhdGNoIGJsb2NrIGlzIGEgYmxvY2sgdGhhdCBjb250YWlucyBhIGJyYW5jaCBiYWNrIHRvIHRoZSBoZWFkZXIuCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBsYXRjaGVzIGluIGEgbG9vcAorICAvLy8gYmVjYXVzZSBcZm4gZ2V0TG9vcExhdGNoIHdpbGwgcmV0dXJuIG51bGxwdHIgaW4gdGhhdCBjYXNlLgorICBib29sIGlzTG9vcExhdGNoKGNvbnN0IEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICAgIGFzc2VydChjb250YWlucyhCQikgJiYgImJsb2NrIGRvZXMgbm90IGJlbG9uZyB0byB0aGUgbG9vcCIpOworCisgICAgQmxvY2tUICpIZWFkZXIgPSBnZXRIZWFkZXIoKTsKKyAgICBhdXRvIFByZWRCZWdpbiA9IEdyYXBoVHJhaXRzPEludmVyc2U8QmxvY2tUICo+Pjo6Y2hpbGRfYmVnaW4oSGVhZGVyKTsKKyAgICBhdXRvIFByZWRFbmQgPSBHcmFwaFRyYWl0czxJbnZlcnNlPEJsb2NrVCAqPj46OmNoaWxkX2VuZChIZWFkZXIpOworICAgIHJldHVybiBzdGQ6OmZpbmQoUHJlZEJlZ2luLCBQcmVkRW5kLCBCQikgIT0gUHJlZEVuZDsKKyAgfQorCisgIC8vLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBiYWNrIGVkZ2VzIHRvIHRoZSBsb29wIGhlYWRlci4KKyAgdW5zaWduZWQgZ2V0TnVtQmFja0VkZ2VzKCkgY29uc3QgeworICAgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgICAgdW5zaWduZWQgTnVtQmFja0VkZ2VzID0gMDsKKyAgICBCbG9ja1QgKkggPSBnZXRIZWFkZXIoKTsKKworICAgIGZvciAoY29uc3QgYXV0byBQcmVkIDogY2hpbGRyZW48SW52ZXJzZTxCbG9ja1QgKj4+KEgpKQorICAgICAgaWYgKGNvbnRhaW5zKFByZWQpKQorICAgICAgICArK051bUJhY2tFZGdlczsKKworICAgIHJldHVybiBOdW1CYWNrRWRnZXM7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQVBJcyBmb3Igc2ltcGxlIGFuYWx5c2lzIG9mIHRoZSBsb29wLgorICAvLworICAvLyBOb3RlIHRoYXQgYWxsIG9mIHRoZXNlIG1ldGhvZHMgY2FuIGZhaWwgb24gZ2VuZXJhbCBsb29wcyAoaWUsIHRoZXJlIG1heSBub3QKKyAgLy8gYmUgYSBwcmVoZWFkZXIsIGV0YykuICBGb3IgYmVzdCBzdWNjZXNzLCB0aGUgbG9vcCBzaW1wbGlmaWNhdGlvbiBhbmQKKyAgLy8gaW5kdWN0aW9uIHZhcmlhYmxlIGNhbm9uaWNhbGl6YXRpb24gcGFzcyBzaG91bGQgYmUgdXNlZCB0byBub3JtYWxpemUgbG9vcHMKKyAgLy8gZm9yIGVhc3kgYW5hbHlzaXMuICBUaGVzZSBtZXRob2RzIGFzc3VtZSBjYW5vbmljYWwgbG9vcHMuCisKKyAgLy8vIFJldHVybiBhbGwgYmxvY2tzIGluc2lkZSB0aGUgbG9vcCB0aGF0IGhhdmUgc3VjY2Vzc29ycyBvdXRzaWRlIG9mIHRoZQorICAvLy8gbG9vcC4gVGhlc2UgYXJlIHRoZSBibG9ja3MgX2luc2lkZSBvZiB0aGUgY3VycmVudCBsb29wXyB3aGljaCBicmFuY2ggb3V0LgorICAvLy8gVGhlIHJldHVybmVkIGxpc3QgaXMgYWx3YXlzIHVuaXF1ZS4KKyAgdm9pZCBnZXRFeGl0aW5nQmxvY2tzKFNtYWxsVmVjdG9ySW1wbDxCbG9ja1QgKj4gJkV4aXRpbmdCbG9ja3MpIGNvbnN0OworCisgIC8vLyBJZiBnZXRFeGl0aW5nQmxvY2tzIHdvdWxkIHJldHVybiBleGFjdGx5IG9uZSBibG9jaywgcmV0dXJuIHRoYXQgYmxvY2suCisgIC8vLyBPdGhlcndpc2UgcmV0dXJuIG51bGwuCisgIEJsb2NrVCAqZ2V0RXhpdGluZ0Jsb2NrKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhbGwgb2YgdGhlIHN1Y2Nlc3NvciBibG9ja3Mgb2YgdGhpcyBsb29wLiBUaGVzZSBhcmUgdGhlIGJsb2NrcworICAvLy8gX291dHNpZGUgb2YgdGhlIGN1cnJlbnQgbG9vcF8gd2hpY2ggYXJlIGJyYW5jaGVkIHRvLgorICB2b2lkIGdldEV4aXRCbG9ja3MoU21hbGxWZWN0b3JJbXBsPEJsb2NrVCAqPiAmRXhpdEJsb2NrcykgY29uc3Q7CisKKyAgLy8vIElmIGdldEV4aXRCbG9ja3Mgd291bGQgcmV0dXJuIGV4YWN0bHkgb25lIGJsb2NrLCByZXR1cm4gdGhhdCBibG9jay4KKyAgLy8vIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KKyAgQmxvY2tUICpnZXRFeGl0QmxvY2soKSBjb25zdDsKKworICAvLy8gRWRnZSB0eXBlLgorICB0eXBlZGVmIHN0ZDo6cGFpcjxjb25zdCBCbG9ja1QgKiwgY29uc3QgQmxvY2tUICo+IEVkZ2U7CisKKyAgLy8vIFJldHVybiBhbGwgcGFpcnMgb2YgKF9pbnNpZGVfYmxvY2tfLF9vdXRzaWRlX2Jsb2NrXykuCisgIHZvaWQgZ2V0RXhpdEVkZ2VzKFNtYWxsVmVjdG9ySW1wbDxFZGdlPiAmRXhpdEVkZ2VzKSBjb25zdDsKKworICAvLy8gSWYgdGhlcmUgaXMgYSBwcmVoZWFkZXIgZm9yIHRoaXMgbG9vcCwgcmV0dXJuIGl0LiBBIGxvb3AgaGFzIGEgcHJlaGVhZGVyCisgIC8vLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBlZGdlIHRvIHRoZSBoZWFkZXIgb2YgdGhlIGxvb3AgZnJvbSBvdXRzaWRlIG9mIHRoZQorICAvLy8gbG9vcC4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlIGJsb2NrIGJyYW5jaGluZyB0byB0aGUgaGVhZGVyIG9mIHRoZSBsb29wCisgIC8vLyBpcyB0aGUgcHJlaGVhZGVyIG5vZGUuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHByZWhlYWRlciBmb3IgdGhlIGxvb3AuCisgIEJsb2NrVCAqZ2V0TG9vcFByZWhlYWRlcigpIGNvbnN0OworCisgIC8vLyBJZiB0aGUgZ2l2ZW4gbG9vcCdzIGhlYWRlciBoYXMgZXhhY3RseSBvbmUgdW5pcXVlIHByZWRlY2Vzc29yIG91dHNpZGUgdGhlCisgIC8vLyBsb29wLCByZXR1cm4gaXQuIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KKyAgLy8vICBUaGlzIGlzIGxlc3Mgc3RyaWN0IHRoYXQgdGhlIGxvb3AgInByZWhlYWRlciIgY29uY2VwdCwgd2hpY2ggcmVxdWlyZXMKKyAgLy8vIHRoZSBwcmVkZWNlc3NvciB0byBoYXZlIGV4YWN0bHkgb25lIHN1Y2Nlc3Nvci4KKyAgQmxvY2tUICpnZXRMb29wUHJlZGVjZXNzb3IoKSBjb25zdDsKKworICAvLy8gSWYgdGhlcmUgaXMgYSBzaW5nbGUgbGF0Y2ggYmxvY2sgZm9yIHRoaXMgbG9vcCwgcmV0dXJuIGl0LgorICAvLy8gQSBsYXRjaCBibG9jayBpcyBhIGJsb2NrIHRoYXQgY29udGFpbnMgYSBicmFuY2ggYmFjayB0byB0aGUgaGVhZGVyLgorICBCbG9ja1QgKmdldExvb3BMYXRjaCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYWxsIGxvb3AgbGF0Y2ggYmxvY2tzIG9mIHRoaXMgbG9vcC4gQSBsYXRjaCBibG9jayBpcyBhIGJsb2NrIHRoYXQKKyAgLy8vIGNvbnRhaW5zIGEgYnJhbmNoIGJhY2sgdG8gdGhlIGhlYWRlci4KKyAgdm9pZCBnZXRMb29wTGF0Y2hlcyhTbWFsbFZlY3RvckltcGw8QmxvY2tUICo+ICZMb29wTGF0Y2hlcykgY29uc3QgeworICAgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgICAgQmxvY2tUICpIID0gZ2V0SGVhZGVyKCk7CisgICAgZm9yIChjb25zdCBhdXRvIFByZWQgOiBjaGlsZHJlbjxJbnZlcnNlPEJsb2NrVCAqPj4oSCkpCisgICAgICBpZiAoY29udGFpbnMoUHJlZCkpCisgICAgICAgIExvb3BMYXRjaGVzLnB1c2hfYmFjayhQcmVkKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBUElzIGZvciB1cGRhdGluZyBsb29wIGluZm9ybWF0aW9uIGFmdGVyIGNoYW5naW5nIHRoZSBDRkcKKyAgLy8KKworICAvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBieSBvdGhlciBhbmFseXNlcyB0byB1cGRhdGUgbG9vcCBpbmZvcm1hdGlvbi4KKyAgLy8vIE5ld0JCIGlzIHNldCB0byBiZSBhIG5ldyBtZW1iZXIgb2YgdGhlIGN1cnJlbnQgbG9vcC4KKyAgLy8vIEJlY2F1c2Ugb2YgdGhpcywgaXQgaXMgYWRkZWQgYXMgYSBtZW1iZXIgb2YgYWxsIHBhcmVudCBsb29wcywgYW5kIGlzIGFkZGVkCisgIC8vLyB0byB0aGUgc3BlY2lmaWVkIExvb3BJbmZvIG9iamVjdCBhcyBiZWluZyBpbiB0aGUgY3VycmVudCBiYXNpYyBibG9jay4gIEl0CisgIC8vLyBpcyBub3QgdmFsaWQgdG8gcmVwbGFjZSB0aGUgbG9vcCBoZWFkZXIgd2l0aCB0aGlzIG1ldGhvZC4KKyAgdm9pZCBhZGRCYXNpY0Jsb2NrVG9Mb29wKEJsb2NrVCAqTmV3QkIsIExvb3BJbmZvQmFzZTxCbG9ja1QsIExvb3BUPiAmTEkpOworCisgIC8vLyBUaGlzIGlzIHVzZWQgd2hlbiBzcGxpdHRpbmcgbG9vcHMgdXAuIEl0IHJlcGxhY2VzIHRoZSBPbGRDaGlsZCBlbnRyeSBpbgorICAvLy8gb3VyIGNoaWxkcmVuIGxpc3Qgd2l0aCBOZXdDaGlsZCwgYW5kIHVwZGF0ZXMgdGhlIHBhcmVudCBwb2ludGVyIG9mCisgIC8vLyBPbGRDaGlsZCB0byBiZSBudWxsIGFuZCB0aGUgTmV3Q2hpbGQgdG8gYmUgdGhpcyBsb29wLgorICAvLy8gVGhpcyB1cGRhdGVzIHRoZSBsb29wIGRlcHRoIG9mIHRoZSBuZXcgY2hpbGQuCisgIHZvaWQgcmVwbGFjZUNoaWxkTG9vcFdpdGgoTG9vcFQgKk9sZENoaWxkLCBMb29wVCAqTmV3Q2hpbGQpOworCisgIC8vLyBBZGQgdGhlIHNwZWNpZmllZCBsb29wIHRvIGJlIGEgY2hpbGQgb2YgdGhpcyBsb29wLgorICAvLy8gVGhpcyB1cGRhdGVzIHRoZSBsb29wIGRlcHRoIG9mIHRoZSBuZXcgY2hpbGQuCisgIHZvaWQgYWRkQ2hpbGRMb29wKExvb3BUICpOZXdDaGlsZCkgeworICAgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgICAgYXNzZXJ0KCFOZXdDaGlsZC0+UGFyZW50TG9vcCAmJiAiTmV3Q2hpbGQgYWxyZWFkeSBoYXMgYSBwYXJlbnQhIik7CisgICAgTmV3Q2hpbGQtPlBhcmVudExvb3AgPSBzdGF0aWNfY2FzdDxMb29wVCAqPih0aGlzKTsKKyAgICBTdWJMb29wcy5wdXNoX2JhY2soTmV3Q2hpbGQpOworICB9CisKKyAgLy8vIFRoaXMgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGNoaWxkIGZyb20gYmVpbmcgYSBzdWJsb29wIG9mIHRoaXMgbG9vcC4gVGhlCisgIC8vLyBsb29wIGlzIG5vdCBkZWxldGVkLCBhcyBpdCB3aWxsIHByZXN1bWFibHkgYmUgaW5zZXJ0ZWQgaW50byBhbm90aGVyIGxvb3AuCisgIExvb3BUICpyZW1vdmVDaGlsZExvb3AoaXRlcmF0b3IgSSkgeworICAgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgICAgYXNzZXJ0KEkgIT0gU3ViTG9vcHMuZW5kKCkgJiYgIkNhbm5vdCByZW1vdmUgZW5kIGl0ZXJhdG9yISIpOworICAgIExvb3BUICpDaGlsZCA9ICpJOworICAgIGFzc2VydChDaGlsZC0+UGFyZW50TG9vcCA9PSB0aGlzICYmICJDaGlsZCBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIGxvb3AhIik7CisgICAgU3ViTG9vcHMuZXJhc2UoU3ViTG9vcHMuYmVnaW4oKSArIChJIC0gYmVnaW4oKSkpOworICAgIENoaWxkLT5QYXJlbnRMb29wID0gbnVsbHB0cjsKKyAgICByZXR1cm4gQ2hpbGQ7CisgIH0KKworICAvLy8gVGhpcyByZW1vdmVzIHRoZSBzcGVjaWZpZWQgY2hpbGQgZnJvbSBiZWluZyBhIHN1Ymxvb3Agb2YgdGhpcyBsb29wLiBUaGUKKyAgLy8vIGxvb3AgaXMgbm90IGRlbGV0ZWQsIGFzIGl0IHdpbGwgcHJlc3VtYWJseSBiZSBpbnNlcnRlZCBpbnRvIGFub3RoZXIgbG9vcC4KKyAgTG9vcFQgKnJlbW92ZUNoaWxkTG9vcChMb29wVCAqQ2hpbGQpIHsKKyAgICByZXR1cm4gcmVtb3ZlQ2hpbGRMb29wKGxsdm06OmZpbmQoKnRoaXMsIENoaWxkKSk7CisgIH0KKworICAvLy8gVGhpcyBhZGRzIGEgYmFzaWMgYmxvY2sgZGlyZWN0bHkgdG8gdGhlIGJhc2ljIGJsb2NrIGxpc3QuCisgIC8vLyBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdHJhbnNmb3JtYXRpb25zIHRoYXQgY3JlYXRlIG5ldyBsb29wcy4gIE90aGVyCisgIC8vLyB0cmFuc2Zvcm1hdGlvbnMgc2hvdWxkIHVzZSBhZGRCYXNpY0Jsb2NrVG9Mb29wLgorICB2b2lkIGFkZEJsb2NrRW50cnkoQmxvY2tUICpCQikgeworICAgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgICAgQmxvY2tzLnB1c2hfYmFjayhCQik7CisgICAgRGVuc2VCbG9ja1NldC5pbnNlcnQoQkIpOworICB9CisKKyAgLy8vIGludGVyZmFjZSB0byByZXZlcnNlIEJsb2Nrc1tmcm9tLCBlbmQgb2YgbG9vcF0gaW4gdGhpcyBsb29wCisgIHZvaWQgcmV2ZXJzZUJsb2NrKHVuc2lnbmVkIGZyb20pIHsKKyAgICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICAgIHN0ZDo6cmV2ZXJzZShCbG9ja3MuYmVnaW4oKSArIGZyb20sIEJsb2Nrcy5lbmQoKSk7CisgIH0KKworICAvLy8gaW50ZXJmYWNlIHRvIGRvIHJlc2VydmUoKSBmb3IgQmxvY2tzCisgIHZvaWQgcmVzZXJ2ZUJsb2Nrcyh1bnNpZ25lZCBzaXplKSB7CisgICAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgICBCbG9ja3MucmVzZXJ2ZShzaXplKTsKKyAgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIG1vdmUgQkIgKHdoaWNoIG11c3QgYmUgcGFydCBvZiB0aGlzIGxvb3ApIHRvIGJlIHRoZQorICAvLy8gbG9vcCBoZWFkZXIgb2YgdGhlIGxvb3AgKHRoZSBibG9jayB0aGF0IGRvbWluYXRlcyBhbGwgb3RoZXJzKS4KKyAgdm9pZCBtb3ZlVG9IZWFkZXIoQmxvY2tUICpCQikgeworICAgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgICAgaWYgKEJsb2Nrc1swXSA9PSBCQikKKyAgICAgIHJldHVybjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOzsgKytpKSB7CisgICAgICBhc3NlcnQoaSAhPSBCbG9ja3Muc2l6ZSgpICYmICJMb29wIGRvZXMgbm90IGNvbnRhaW4gQkIhIik7CisgICAgICBpZiAoQmxvY2tzW2ldID09IEJCKSB7CisgICAgICAgIEJsb2Nrc1tpXSA9IEJsb2Nrc1swXTsKKyAgICAgICAgQmxvY2tzWzBdID0gQkI7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLy8gVGhpcyByZW1vdmVzIHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2sgZnJvbSB0aGUgY3VycmVudCBsb29wLCB1cGRhdGluZyB0aGUKKyAgLy8vIEJsb2NrcyBhcyBhcHByb3ByaWF0ZS4gVGhpcyBkb2VzIG5vdCB1cGRhdGUgdGhlIG1hcHBpbmcgaW4gdGhlIExvb3BJbmZvCisgIC8vLyBjbGFzcy4KKyAgdm9pZCByZW1vdmVCbG9ja0Zyb21Mb29wKEJsb2NrVCAqQkIpIHsKKyAgICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICAgIGF1dG8gSSA9IGZpbmQoQmxvY2tzLCBCQik7CisgICAgYXNzZXJ0KEkgIT0gQmxvY2tzLmVuZCgpICYmICJOIGlzIG5vdCBpbiB0aGlzIGxpc3QhIik7CisgICAgQmxvY2tzLmVyYXNlKEkpOworCisgICAgRGVuc2VCbG9ja1NldC5lcmFzZShCQik7CisgIH0KKworICAvLy8gVmVyaWZ5IGxvb3Agc3RydWN0dXJlCisgIHZvaWQgdmVyaWZ5TG9vcCgpIGNvbnN0OworCisgIC8vLyBWZXJpZnkgbG9vcCBzdHJ1Y3R1cmUgb2YgdGhpcyBsb29wIGFuZCBhbGwgbmVzdGVkIGxvb3BzLgorICB2b2lkIHZlcmlmeUxvb3BOZXN0KERlbnNlU2V0PGNvbnN0IExvb3BUICo+ICpMb29wcykgY29uc3Q7CisKKyAgLy8vIFByaW50IGxvb3Agd2l0aCBhbGwgdGhlIEJCcyBpbnNpZGUgaXQuCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBEZXB0aCA9IDAsIGJvb2wgVmVyYm9zZSA9IGZhbHNlKSBjb25zdDsKKworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgTG9vcEluZm9CYXNlPEJsb2NrVCwgTG9vcFQ+OworCisgIC8vLyBUaGlzIGNyZWF0ZXMgYW4gZW1wdHkgbG9vcC4KKyAgTG9vcEJhc2UoKSA6IFBhcmVudExvb3AobnVsbHB0cikge30KKworICBleHBsaWNpdCBMb29wQmFzZShCbG9ja1QgKkJCKSA6IFBhcmVudExvb3AobnVsbHB0cikgeworICAgIEJsb2Nrcy5wdXNoX2JhY2soQkIpOworICAgIERlbnNlQmxvY2tTZXQuaW5zZXJ0KEJCKTsKKyAgfQorCisgIC8vIFNpbmNlIGxvb3AgcGFzc2VzIGxpa2UgU0NFViBhcmUgYWxsb3dlZCB0byBrZXkgYW5hbHlzaXMgcmVzdWx0cyBvZmYgb2YKKyAgLy8gYExvb3BgIHBvaW50ZXJzLCB3ZSBjYW5ub3QgcmUtdXNlIHBvaW50ZXJzIHdpdGhpbiBhIGxvb3AgcGFzcyBtYW5hZ2VyLgorICAvLyBUaGlzIG1lYW5zIGxvb3AgcGFzc2VzIHNob3VsZCBub3QgYmUgYGRlbGV0ZWAgaW5nIGBMb29wYCBvYmplY3RzIGRpcmVjdGx5CisgIC8vIChhbmQgcmlzayBhIGxhdGVyIGBMb29wYCBhbGxvY2F0aW9uIHJlLXVzaW5nIHRoZSBhZGRyZXNzIG9mIGEgcHJldmlvdXMgb25lKQorICAvLyBidXQgc2hvdWxkIGJlIHVzaW5nIExvb3BJbmZvOjptYXJrQXNSZW1vdmVkLCB3aGljaCBrZWVwcyBhcm91bmQgdGhlIGBMb29wYAorICAvLyBwb2ludGVyIHRpbGwgdGhlIGVuZCBvZiB0aGUgbGlmZXRpbWUgb2YgdGhlIGBMb29wSW5mb2Agb2JqZWN0LgorICAvLworICAvLyBUbyBtYWtlIGl0IGVhc2llciB0byBmb2xsb3cgdGhpcyBydWxlLCB3ZSBtYXJrIHRoZSBkZXN0cnVjdG9yIGFzCisgIC8vIG5vbi1wdWJsaWMuCisgIH5Mb29wQmFzZSgpIHsKKyAgICBmb3IgKGF1dG8gKlN1Ykxvb3AgOiBTdWJMb29wcykKKyAgICAgIFN1Ykxvb3AtPn5Mb29wVCgpOworCisjaWYgTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUworICAgIElzSW52YWxpZCA9IHRydWU7CisjZW5kaWYKKyAgICBTdWJMb29wcy5jbGVhcigpOworICAgIEJsb2Nrcy5jbGVhcigpOworICAgIERlbnNlQmxvY2tTZXQuY2xlYXIoKTsKKyAgICBQYXJlbnRMb29wID0gbnVsbHB0cjsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+CityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IExvb3BCYXNlPEJsb2NrVCwgTG9vcFQ+ICZMb29wKSB7CisgIExvb3AucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKKy8vIEltcGxlbWVudGF0aW9uIGluIExvb3BJbmZvSW1wbC5oCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgTG9vcEJhc2U8QmFzaWNCbG9jaywgTG9vcD47CisKKy8vLyBSZXByZXNlbnRzIGEgc2luZ2xlIGxvb3AgaW4gdGhlIGNvbnRyb2wgZmxvdyBncmFwaC4gIE5vdGUgdGhhdCBub3QgYWxsIFNDQ3MKKy8vLyBpbiB0aGUgQ0ZHIGFyZSBuZWNlc3NhcmlseSBsb29wcy4KK2NsYXNzIExvb3AgOiBwdWJsaWMgTG9vcEJhc2U8QmFzaWNCbG9jaywgTG9vcD4geworcHVibGljOgorICAvLy8gXGJyaWVmIEEgcmFuZ2UgcmVwcmVzZW50aW5nIHRoZSBzdGFydCBhbmQgZW5kIGxvY2F0aW9uIG9mIGEgbG9vcC4KKyAgY2xhc3MgTG9jUmFuZ2UgeworICAgIERlYnVnTG9jIFN0YXJ0OworICAgIERlYnVnTG9jIEVuZDsKKworICBwdWJsaWM6CisgICAgTG9jUmFuZ2UoKSB7fQorICAgIExvY1JhbmdlKERlYnVnTG9jIFN0YXJ0KSA6IFN0YXJ0KHN0ZDo6bW92ZShTdGFydCkpLCBFbmQoc3RkOjptb3ZlKFN0YXJ0KSkge30KKyAgICBMb2NSYW5nZShEZWJ1Z0xvYyBTdGFydCwgRGVidWdMb2MgRW5kKQorICAgICAgICA6IFN0YXJ0KHN0ZDo6bW92ZShTdGFydCkpLCBFbmQoc3RkOjptb3ZlKEVuZCkpIHt9CisKKyAgICBjb25zdCBEZWJ1Z0xvYyAmZ2V0U3RhcnQoKSBjb25zdCB7IHJldHVybiBTdGFydDsgfQorICAgIGNvbnN0IERlYnVnTG9jICZnZXRFbmQoKSBjb25zdCB7IHJldHVybiBFbmQ7IH0KKworICAgIC8vLyBcYnJpZWYgQ2hlY2sgZm9yIG51bGwuCisgICAgLy8vCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIFN0YXJ0ICYmIEVuZDsgfQorICB9OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGxvb3AgaW52YXJpYW50LgorICBib29sIGlzTG9vcEludmFyaWFudChjb25zdCBWYWx1ZSAqVikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGFsbCB0aGUgb3BlcmFuZHMgb2YgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBhcmUgbG9vcAorICAvLy8gaW52YXJpYW50LgorICBib29sIGhhc0xvb3BJbnZhcmlhbnRPcGVyYW5kcyhjb25zdCBJbnN0cnVjdGlvbiAqSSkgY29uc3Q7CisKKyAgLy8vIElmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhbiBpbnN0cnVjdGlvbiBpbnNpZGUgb2YgdGhlIGxvb3AgYW5kIGl0IGNhbiBiZQorICAvLy8gaG9pc3RlZCwgZG8gc28gdG8gbWFrZSBpdCB0cml2aWFsbHkgbG9vcC1pbnZhcmlhbnQuCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgYWZ0ZXIgYW55IGhvaXN0aW5nIGlzIGxvb3AgaW52YXJpYW50LiBUaGlzCisgIC8vLyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBhcyBhIHNsaWdodGx5IG1vcmUgYWdncmVzc2l2ZSByZXBsYWNlbWVudCBmb3IKKyAgLy8vIGlzTG9vcEludmFyaWFudC4KKyAgLy8vCisgIC8vLyBJZiBJbnNlcnRQdCBpcyBzcGVjaWZpZWQsIGl0IGlzIHRoZSBwb2ludCB0byBob2lzdCBpbnN0cnVjdGlvbnMgdG8uCisgIC8vLyBJZiBudWxsLCB0aGUgdGVybWluYXRvciBvZiB0aGUgbG9vcCBwcmVoZWFkZXIgaXMgdXNlZC4KKyAgYm9vbCBtYWtlTG9vcEludmFyaWFudChWYWx1ZSAqViwgYm9vbCAmQ2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0UHQgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gSWYgdGhlIGdpdmVuIGluc3RydWN0aW9uIGlzIGluc2lkZSBvZiB0aGUgbG9vcCBhbmQgaXQgY2FuIGJlIGhvaXN0ZWQsIGRvCisgIC8vLyBzbyB0byBtYWtlIGl0IHRyaXZpYWxseSBsb29wLWludmFyaWFudC4KKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBhZnRlciBhbnkgaG9pc3RpbmcgaXMgbG9vcCBpbnZhcmlhbnQuIFRoaXMKKyAgLy8vIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGFzIGEgc2xpZ2h0bHkgbW9yZSBhZ2dyZXNzaXZlIHJlcGxhY2VtZW50IGZvcgorICAvLy8gaXNMb29wSW52YXJpYW50LgorICAvLy8KKyAgLy8vIElmIEluc2VydFB0IGlzIHNwZWNpZmllZCwgaXQgaXMgdGhlIHBvaW50IHRvIGhvaXN0IGluc3RydWN0aW9ucyB0by4KKyAgLy8vIElmIG51bGwsIHRoZSB0ZXJtaW5hdG9yIG9mIHRoZSBsb29wIHByZWhlYWRlciBpcyB1c2VkLgorICAvLy8KKyAgYm9vbCBtYWtlTG9vcEludmFyaWFudChJbnN0cnVjdGlvbiAqSSwgYm9vbCAmQ2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0UHQgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBsb29wIGhhcyBhIGNhbm9uaWNhbCBpbmR1Y3Rpb24gdmFyaWFibGU6IGFuIGludGVnZXIKKyAgLy8vIHJlY3VycmVuY2UgdGhhdCBzdGFydHMgYXQgMCBhbmQgaW5jcmVtZW50cyBieSBvbmUgZWFjaCB0aW1lIHRocm91Z2ggdGhlCisgIC8vLyBsb29wLiBJZiBzbywgcmV0dXJuIHRoZSBwaGkgbm9kZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0LgorICAvLy8KKyAgLy8vIFRoZSBJbmRWYXJTaW1wbGlmeSBwYXNzIHRyYW5zZm9ybXMgbG9vcHMgdG8gaGF2ZSBhIGNhbm9uaWNhbCBpbmR1Y3Rpb24KKyAgLy8vIHZhcmlhYmxlLgorICAvLy8KKyAgUEhJTm9kZSAqZ2V0Q2Fub25pY2FsSW5kdWN0aW9uVmFyaWFibGUoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIExvb3AgaXMgaW4gTENTU0EgZm9ybS4KKyAgYm9vbCBpc0xDU1NBRm9ybShEb21pbmF0b3JUcmVlICZEVCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgTG9vcCBhbmQgYWxsIGlubmVyIHN1Ymxvb3BzIGFyZSBpbiBMQ1NTQSBmb3JtLgorICBib29sIGlzUmVjdXJzaXZlbHlMQ1NTQUZvcm0oRG9taW5hdG9yVHJlZSAmRFQsIGNvbnN0IExvb3BJbmZvICZMSSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBMb29wIGlzIGluIHRoZSBmb3JtIHRoYXQgdGhlIExvb3BTaW1wbGlmeSBmb3JtCisgIC8vLyB0cmFuc2Zvcm1zIGxvb3BzIHRvLCB3aGljaCBpcyBzb21ldGltZXMgY2FsbGVkIG5vcm1hbCBmb3JtLgorICBib29sIGlzTG9vcFNpbXBsaWZ5Rm9ybSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgbG9vcCBib2R5IGlzIHNhZmUgdG8gY2xvbmUgaW4gcHJhY3RpY2UuCisgIGJvb2wgaXNTYWZlVG9DbG9uZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGxvb3AgaXMgYW5ub3RhdGVkIHBhcmFsbGVsLgorICAvLy8KKyAgLy8vIEEgcGFyYWxsZWwgbG9vcCBjYW4gYmUgYXNzdW1lZCB0byBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzIGJldHdlZW4KKyAgLy8vIGl0ZXJhdGlvbnMgYnkgdGhlIGNvbXBpbGVyLiBUaGF0IGlzLCBhbnkgbG9vcC1jYXJyaWVkIGRlcGVuZGVuY3kgY2hlY2tpbmcKKyAgLy8vIGNhbiBiZSBza2lwcGVkIGNvbXBsZXRlbHkgd2hlbiBwYXJhbGxlbGl6aW5nIHRoZSBsb29wIG9uIHRoZSB0YXJnZXQKKyAgLy8vIG1hY2hpbmUuIFRodXMsIGlmIHRoZSBwYXJhbGxlbCBsb29wIGluZm9ybWF0aW9uIG9yaWdpbmF0ZXMgZnJvbSB0aGUKKyAgLy8vIHByb2dyYW1tZXIsIGUuZy4gdmlhIHRoZSBPcGVuTVAgcGFyYWxsZWwgZm9yIHByYWdtYSwgaXQgaXMgdGhlCisgIC8vLyBwcm9ncmFtbWVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoZXJlIGFyZSBubyBsb29wLWNhcnJpZWQKKyAgLy8vIGRlcGVuZGVuY2llcy4gVGhlIGZpbmFsIGV4ZWN1dGlvbiBvcmRlciBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGFjcm9zcworICAvLy8gaXRlcmF0aW9ucyBpcyBub3QgZ3VhcmFudGVlZCwgdGh1cywgdGhlIGVuZCByZXN1bHQgbWlnaHQgb3IgbWlnaHQgbm90CisgIC8vLyBpbXBsZW1lbnQgYWN0dWFsIGNvbmN1cnJlbnQgZXhlY3V0aW9uIG9mIGluc3RydWN0aW9ucyBhY3Jvc3MgbXVsdGlwbGUKKyAgLy8vIGl0ZXJhdGlvbnMuCisgIGJvb2wgaXNBbm5vdGF0ZWRQYXJhbGxlbCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIGxsdm0ubG9vcCBsb29wIGlkIG1ldGFkYXRhIG5vZGUgZm9yIHRoaXMgbG9vcCBpZiBpdCBpcyBwcmVzZW50LgorICAvLy8KKyAgLy8vIElmIHRoaXMgbG9vcCBjb250YWlucyB0aGUgc2FtZSBsbHZtLmxvb3AgbWV0YWRhdGEgb24gZWFjaCBicmFuY2ggdG8gdGhlCisgIC8vLyBoZWFkZXIgdGhlbiB0aGUgbm9kZSBpcyByZXR1cm5lZC4gSWYgYW55IGxhdGNoIGluc3RydWN0aW9uIGRvZXMgbm90CisgIC8vLyBjb250YWluIGxsdm0ubG9vcCBvciBvciBpZiBtdWx0aXBsZSBsYXRjaGVzIGNvbnRhaW4gZGlmZmVyZW50IG5vZGVzIHRoZW4KKyAgLy8vIDAgaXMgcmV0dXJuZWQuCisgIE1ETm9kZSAqZ2V0TG9vcElEKCkgY29uc3Q7CisgIC8vLyBTZXQgdGhlIGxsdm0ubG9vcCBsb29wIGlkIG1ldGFkYXRhIGZvciB0aGlzIGxvb3AuCisgIC8vLworICAvLy8gVGhlIExvb3BJRCBtZXRhZGF0YSBub2RlIHdpbGwgYmUgYWRkZWQgdG8gZWFjaCB0ZXJtaW5hdG9yIGluc3RydWN0aW9uIGluCisgIC8vLyB0aGUgbG9vcCB0aGF0IGJyYW5jaGVzIHRvIHRoZSBsb29wIGhlYWRlci4KKyAgLy8vCisgIC8vLyBUaGUgTG9vcElEIG1ldGFkYXRhIG5vZGUgc2hvdWxkIGhhdmUgb25lIG9yIG1vcmUgb3BlcmFuZHMgYW5kIHRoZSBmaXJzdAorICAvLy8gb3BlcmFuZCBzaG91bGQgYmUgdGhlIG5vZGUgaXRzZWxmLgorICB2b2lkIHNldExvb3BJRChNRE5vZGUgKkxvb3BJRCkgY29uc3Q7CisKKyAgLy8vIEFkZCBsbHZtLmxvb3AudW5yb2xsLmRpc2FibGUgdG8gdGhpcyBsb29wJ3MgbG9vcCBpZCBtZXRhZGF0YS4KKyAgLy8vCisgIC8vLyBSZW1vdmUgZXhpc3RpbmcgdW5yb2xsIG1ldGFkYXRhIGFuZCBhZGQgdW5yb2xsIGRpc2FibGUgbWV0YWRhdGEgdG8KKyAgLy8vIGluZGljYXRlIHRoZSBsb29wIGhhcyBhbHJlYWR5IGJlZW4gdW5yb2xsZWQuICBUaGlzIHByZXZlbnRzIGEgbG9vcAorICAvLy8gZnJvbSBiZWluZyB1bnJvbGxlZCBtb3JlIHRoYW4gaXMgZGlyZWN0ZWQgYnkgYSBwcmFnbWEgaWYgdGhlIGxvb3AKKyAgLy8vIHVucm9sbGluZyBwYXNzIGlzIHJ1biBtb3JlIHRoYW4gb25jZSAod2hpY2ggaXQgZ2VuZXJhbGx5IGlzKS4KKyAgdm9pZCBzZXRMb29wQWxyZWFkeVVucm9sbGVkKCk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIG5vIGV4aXQgYmxvY2sgZm9yIHRoZSBsb29wIGhhcyBhIHByZWRlY2Vzc29yIHRoYXQgaXMKKyAgLy8vIG91dHNpZGUgdGhlIGxvb3AuCisgIGJvb2wgaGFzRGVkaWNhdGVkRXhpdHMoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGFsbCB1bmlxdWUgc3VjY2Vzc29yIGJsb2NrcyBvZiB0aGlzIGxvb3AuCisgIC8vLyBUaGVzZSBhcmUgdGhlIGJsb2NrcyBfb3V0c2lkZSBvZiB0aGUgY3VycmVudCBsb29wXyB3aGljaCBhcmUgYnJhbmNoZWQgdG8uCisgIC8vLyBUaGlzIGFzc3VtZXMgdGhhdCBsb29wIGV4aXRzIGFyZSBpbiBjYW5vbmljYWwgZm9ybSwgaS5lLiBhbGwgZXhpdHMgYXJlCisgIC8vLyBkZWRpY2F0ZWQgZXhpdHMuCisgIHZvaWQgZ2V0VW5pcXVlRXhpdEJsb2NrcyhTbWFsbFZlY3RvckltcGw8QmFzaWNCbG9jayAqPiAmRXhpdEJsb2NrcykgY29uc3Q7CisKKyAgLy8vIElmIGdldFVuaXF1ZUV4aXRCbG9ja3Mgd291bGQgcmV0dXJuIGV4YWN0bHkgb25lIGJsb2NrLCByZXR1cm4gdGhhdCBibG9jay4KKyAgLy8vIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KKyAgQmFzaWNCbG9jayAqZ2V0VW5pcXVlRXhpdEJsb2NrKCkgY29uc3Q7CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisgIHZvaWQgZHVtcFZlcmJvc2UoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBkZWJ1ZyBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhpcyBsb29wLgorICAvLy8gVGhpcyBsb29rcyBmb3IgYSBCQiB0ZXJtaW5hdGluZyBpbnN0cnVjdGlvbiB3aXRoIGEga25vd24gZGVidWcKKyAgLy8vIGxvY2F0aW9uIGJ5IGxvb2tpbmcgYXQgdGhlIHByZWhlYWRlciBhbmQgaGVhZGVyIGJsb2Nrcy4gSWYgaXQKKyAgLy8vIGNhbm5vdCBmaW5kIGEgdGVybWluYXRpbmcgaW5zdHJ1Y3Rpb24gd2l0aCBsb2NhdGlvbiBpbmZvcm1hdGlvbiwKKyAgLy8vIGl0IHJldHVybnMgYW4gdW5rbm93biBsb2NhdGlvbi4KKyAgRGVidWdMb2MgZ2V0U3RhcnRMb2MoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBzb3VyY2UgY29kZSBzcGFuIG9mIHRoZSBsb29wLgorICBMb2NSYW5nZSBnZXRMb2NSYW5nZSgpIGNvbnN0OworCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeworICAgIGlmIChCYXNpY0Jsb2NrICpIZWFkZXIgPSBnZXRIZWFkZXIoKSkKKyAgICAgIGlmIChIZWFkZXItPmhhc05hbWUoKSkKKyAgICAgICAgcmV0dXJuIEhlYWRlci0+Z2V0TmFtZSgpOworICAgIHJldHVybiAiPHVubmFtZWQgbG9vcD4iOworICB9CisKK3ByaXZhdGU6CisgIExvb3AoKSA9IGRlZmF1bHQ7CisKKyAgZnJpZW5kIGNsYXNzIExvb3BJbmZvQmFzZTxCYXNpY0Jsb2NrLCBMb29wPjsKKyAgZnJpZW5kIGNsYXNzIExvb3BCYXNlPEJhc2ljQmxvY2ssIExvb3A+OworICBleHBsaWNpdCBMb29wKEJhc2ljQmxvY2sgKkJCKSA6IExvb3BCYXNlPEJhc2ljQmxvY2ssIExvb3A+KEJCKSB7fQorICB+TG9vcCgpID0gZGVmYXVsdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gVGhpcyBjbGFzcyBidWlsZHMgYW5kIGNvbnRhaW5zIGFsbCBvZiB0aGUgdG9wLWxldmVsIGxvb3AKKy8vLyBzdHJ1Y3R1cmVzIGluIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24uCisvLy8KKwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+IGNsYXNzIExvb3BJbmZvQmFzZSB7CisgIC8vIEJCTWFwIC0gTWFwcGluZyBvZiBiYXNpYyBibG9ja3MgdG8gdGhlIGlubmVyIG1vc3QgbG9vcCB0aGV5IG9jY3VyIGluCisgIERlbnNlTWFwPGNvbnN0IEJsb2NrVCAqLCBMb29wVCAqPiBCQk1hcDsKKyAgc3RkOjp2ZWN0b3I8TG9vcFQgKj4gVG9wTGV2ZWxMb29wczsKKyAgQnVtcFB0ckFsbG9jYXRvciBMb29wQWxsb2NhdG9yOworCisgIGZyaWVuZCBjbGFzcyBMb29wQmFzZTxCbG9ja1QsIExvb3BUPjsKKyAgZnJpZW5kIGNsYXNzIExvb3BJbmZvOworCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IExvb3BJbmZvQmFzZSAmKSA9IGRlbGV0ZTsKKyAgTG9vcEluZm9CYXNlKGNvbnN0IExvb3BJbmZvQmFzZSAmKSA9IGRlbGV0ZTsKKworcHVibGljOgorICBMb29wSW5mb0Jhc2UoKSB7fQorICB+TG9vcEluZm9CYXNlKCkgeyByZWxlYXNlTWVtb3J5KCk7IH0KKworICBMb29wSW5mb0Jhc2UoTG9vcEluZm9CYXNlICYmQXJnKQorICAgICAgOiBCQk1hcChzdGQ6Om1vdmUoQXJnLkJCTWFwKSksCisgICAgICAgIFRvcExldmVsTG9vcHMoc3RkOjptb3ZlKEFyZy5Ub3BMZXZlbExvb3BzKSksCisgICAgICAgIExvb3BBbGxvY2F0b3Ioc3RkOjptb3ZlKEFyZy5Mb29wQWxsb2NhdG9yKSkgeworICAgIC8vIFdlIGhhdmUgdG8gY2xlYXIgdGhlIGFyZ3VtZW50cyB0b3AgbGV2ZWwgbG9vcHMgYXMgd2UndmUgdGFrZW4gb3duZXJzaGlwLgorICAgIEFyZy5Ub3BMZXZlbExvb3BzLmNsZWFyKCk7CisgIH0KKyAgTG9vcEluZm9CYXNlICZvcGVyYXRvcj0oTG9vcEluZm9CYXNlICYmUkhTKSB7CisgICAgQkJNYXAgPSBzdGQ6Om1vdmUoUkhTLkJCTWFwKTsKKworICAgIGZvciAoYXV0byAqTCA6IFRvcExldmVsTG9vcHMpCisgICAgICBMLT5+TG9vcFQoKTsKKworICAgIFRvcExldmVsTG9vcHMgPSBzdGQ6Om1vdmUoUkhTLlRvcExldmVsTG9vcHMpOworICAgIExvb3BBbGxvY2F0b3IgPSBzdGQ6Om1vdmUoUkhTLkxvb3BBbGxvY2F0b3IpOworICAgIFJIUy5Ub3BMZXZlbExvb3BzLmNsZWFyKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgeworICAgIEJCTWFwLmNsZWFyKCk7CisKKyAgICBmb3IgKGF1dG8gKkwgOiBUb3BMZXZlbExvb3BzKQorICAgICAgTC0+fkxvb3BUKCk7CisgICAgVG9wTGV2ZWxMb29wcy5jbGVhcigpOworICAgIExvb3BBbGxvY2F0b3IuUmVzZXQoKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzVHk+IExvb3BUICpBbGxvY2F0ZUxvb3AoQXJnc1R5ICYmLi4uIEFyZ3MpIHsKKyAgICBMb29wVCAqU3RvcmFnZSA9IExvb3BBbGxvY2F0b3IuQWxsb2NhdGU8TG9vcFQ+KCk7CisgICAgcmV0dXJuIG5ldyAoU3RvcmFnZSkgTG9vcFQoc3RkOjpmb3J3YXJkPEFyZ3NUeT4oQXJncykuLi4pOworICB9CisKKyAgLy8vIGl0ZXJhdG9yL2JlZ2luL2VuZCAtIFRoZSBpbnRlcmZhY2UgdG8gdGhlIHRvcC1sZXZlbCBsb29wcyBpbiB0aGUgY3VycmVudAorICAvLy8gZnVuY3Rpb24uCisgIC8vLworICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPExvb3BUICo+Ojpjb25zdF9pdGVyYXRvciBpdGVyYXRvcjsKKyAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8TG9vcFQgKj46OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBUb3BMZXZlbExvb3BzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gVG9wTGV2ZWxMb29wcy5lbmQoKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFRvcExldmVsTG9vcHMucmJlZ2luKCk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4gVG9wTGV2ZWxMb29wcy5yZW5kKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFRvcExldmVsTG9vcHMuZW1wdHkoKTsgfQorCisgIC8vLyBSZXR1cm4gYWxsIG9mIHRoZSBsb29wcyBpbiB0aGUgZnVuY3Rpb24gaW4gcHJlb3JkZXIgYWNyb3NzIHRoZSBsb29wCisgIC8vLyBuZXN0cywgd2l0aCBzaWJsaW5ncyBpbiBmb3J3YXJkIHByb2dyYW0gb3JkZXIuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IGJlY2F1c2UgbG9vcHMgZm9ybSBhIGZvcmVzdCBvZiB0cmVlcywgcHJlb3JkZXIgaXMgZXF1aXZhbGVudCB0bworICAvLy8gcmV2ZXJzZSBwb3N0b3JkZXIuCisgIFNtYWxsVmVjdG9yPExvb3BUICosIDQ+IGdldExvb3BzSW5QcmVvcmRlcigpOworCisgIC8vLyBSZXR1cm4gYWxsIG9mIHRoZSBsb29wcyBpbiB0aGUgZnVuY3Rpb24gaW4gcHJlb3JkZXIgYWNyb3NzIHRoZSBsb29wCisgIC8vLyBuZXN0cywgd2l0aCBzaWJsaW5ncyBpbiAqcmV2ZXJzZSogcHJvZ3JhbSBvcmRlci4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgYmVjYXVzZSBsb29wcyBmb3JtIGEgZm9yZXN0IG9mIHRyZWVzLCBwcmVvcmRlciBpcyBlcXVpdmFsZW50IHRvCisgIC8vLyByZXZlcnNlIHBvc3RvcmRlci4KKyAgLy8vCisgIC8vLyBBbHNvIG5vdGUgdGhhdCB0aGlzIGlzICpub3QqIGEgcmV2ZXJzZSBwcmVvcmRlci4gT25seSB0aGUgc2libGluZ3MgYXJlIGluCisgIC8vLyByZXZlcnNlIHByb2dyYW0gb3JkZXIuCisgIFNtYWxsVmVjdG9yPExvb3BUICosIDQ+IGdldExvb3BzSW5SZXZlcnNlU2libGluZ1ByZW9yZGVyKCk7CisKKyAgLy8vIFJldHVybiB0aGUgaW5uZXIgbW9zdCBsb29wIHRoYXQgQkIgbGl2ZXMgaW4uIElmIGEgYmFzaWMgYmxvY2sgaXMgaW4gbm8KKyAgLy8vIGxvb3AgKGZvciBleGFtcGxlIHRoZSBlbnRyeSBub2RlKSwgbnVsbCBpcyByZXR1cm5lZC4KKyAgTG9vcFQgKmdldExvb3BGb3IoY29uc3QgQmxvY2tUICpCQikgY29uc3QgeyByZXR1cm4gQkJNYXAubG9va3VwKEJCKTsgfQorCisgIC8vLyBTYW1lIGFzIGdldExvb3BGb3IuCisgIGNvbnN0IExvb3BUICpvcGVyYXRvcltdKGNvbnN0IEJsb2NrVCAqQkIpIGNvbnN0IHsgcmV0dXJuIGdldExvb3BGb3IoQkIpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgbG9vcCBuZXN0aW5nIGxldmVsIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2suIEEgZGVwdGggb2YgMCBtZWFucworICAvLy8gdGhlIGJsb2NrIGlzIG5vdCBpbnNpZGUgYW55IGxvb3AuCisgIHVuc2lnbmVkIGdldExvb3BEZXB0aChjb25zdCBCbG9ja1QgKkJCKSBjb25zdCB7CisgICAgY29uc3QgTG9vcFQgKkwgPSBnZXRMb29wRm9yKEJCKTsKKyAgICByZXR1cm4gTCA/IEwtPmdldExvb3BEZXB0aCgpIDogMDsKKyAgfQorCisgIC8vIFRydWUgaWYgdGhlIGJsb2NrIGlzIGEgbG9vcCBoZWFkZXIgbm9kZQorICBib29sIGlzTG9vcEhlYWRlcihjb25zdCBCbG9ja1QgKkJCKSBjb25zdCB7CisgICAgY29uc3QgTG9vcFQgKkwgPSBnZXRMb29wRm9yKEJCKTsKKyAgICByZXR1cm4gTCAmJiBMLT5nZXRIZWFkZXIoKSA9PSBCQjsKKyAgfQorCisgIC8vLyBUaGlzIHJlbW92ZXMgdGhlIHNwZWNpZmllZCB0b3AtbGV2ZWwgbG9vcCBmcm9tIHRoaXMgbG9vcCBpbmZvIG9iamVjdC4KKyAgLy8vIFRoZSBsb29wIGlzIG5vdCBkZWxldGVkLCBhcyBpdCB3aWxsIHByZXN1bWFibHkgYmUgaW5zZXJ0ZWQgaW50bworICAvLy8gYW5vdGhlciBsb29wLgorICBMb29wVCAqcmVtb3ZlTG9vcChpdGVyYXRvciBJKSB7CisgICAgYXNzZXJ0KEkgIT0gZW5kKCkgJiYgIkNhbm5vdCByZW1vdmUgZW5kIGl0ZXJhdG9yISIpOworICAgIExvb3BUICpMID0gKkk7CisgICAgYXNzZXJ0KCFMLT5nZXRQYXJlbnRMb29wKCkgJiYgIk5vdCBhIHRvcC1sZXZlbCBsb29wISIpOworICAgIFRvcExldmVsTG9vcHMuZXJhc2UoVG9wTGV2ZWxMb29wcy5iZWdpbigpICsgKEkgLSBiZWdpbigpKSk7CisgICAgcmV0dXJuIEw7CisgIH0KKworICAvLy8gQ2hhbmdlIHRoZSB0b3AtbGV2ZWwgbG9vcCB0aGF0IGNvbnRhaW5zIEJCIHRvIHRoZSBzcGVjaWZpZWQgbG9vcC4KKyAgLy8vIFRoaXMgc2hvdWxkIGJlIHVzZWQgYnkgdHJhbnNmb3JtYXRpb25zIHRoYXQgcmVzdHJ1Y3R1cmUgdGhlIGxvb3AgaGllcmFyY2h5CisgIC8vLyB0cmVlLgorICB2b2lkIGNoYW5nZUxvb3BGb3IoQmxvY2tUICpCQiwgTG9vcFQgKkwpIHsKKyAgICBpZiAoIUwpIHsKKyAgICAgIEJCTWFwLmVyYXNlKEJCKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgQkJNYXBbQkJdID0gTDsKKyAgfQorCisgIC8vLyBSZXBsYWNlIHRoZSBzcGVjaWZpZWQgbG9vcCBpbiB0aGUgdG9wLWxldmVsIGxvb3BzIGxpc3Qgd2l0aCB0aGUgaW5kaWNhdGVkCisgIC8vLyBsb29wLgorICB2b2lkIGNoYW5nZVRvcExldmVsTG9vcChMb29wVCAqT2xkTG9vcCwgTG9vcFQgKk5ld0xvb3ApIHsKKyAgICBhdXRvIEkgPSBmaW5kKFRvcExldmVsTG9vcHMsIE9sZExvb3ApOworICAgIGFzc2VydChJICE9IFRvcExldmVsTG9vcHMuZW5kKCkgJiYgIk9sZCBsb29wIG5vdCBhdCB0b3AgbGV2ZWwhIik7CisgICAgKkkgPSBOZXdMb29wOworICAgIGFzc2VydCghTmV3TG9vcC0+UGFyZW50TG9vcCAmJiAhT2xkTG9vcC0+UGFyZW50TG9vcCAmJgorICAgICAgICAgICAiTG9vcHMgYWxyZWFkeSBlbWJlZGRlZCBpbnRvIGEgc3VibG9vcCEiKTsKKyAgfQorCisgIC8vLyBUaGlzIGFkZHMgdGhlIHNwZWNpZmllZCBsb29wIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHRvcC1sZXZlbCBsb29wcy4KKyAgdm9pZCBhZGRUb3BMZXZlbExvb3AoTG9vcFQgKk5ldykgeworICAgIGFzc2VydCghTmV3LT5nZXRQYXJlbnRMb29wKCkgJiYgIkxvb3AgYWxyZWFkeSBpbiBzdWJsb29wISIpOworICAgIFRvcExldmVsTG9vcHMucHVzaF9iYWNrKE5ldyk7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgY29tcGxldGVseSByZW1vdmVzIEJCIGZyb20gYWxsIGRhdGEgc3RydWN0dXJlcywKKyAgLy8vIGluY2x1ZGluZyBhbGwgb2YgdGhlIExvb3Agb2JqZWN0cyBpdCBpcyBuZXN0ZWQgaW4gYW5kIG91ciBtYXBwaW5nIGZyb20KKyAgLy8vIEJhc2ljQmxvY2tzIHRvIGxvb3BzLgorICB2b2lkIHJlbW92ZUJsb2NrKEJsb2NrVCAqQkIpIHsKKyAgICBhdXRvIEkgPSBCQk1hcC5maW5kKEJCKTsKKyAgICBpZiAoSSAhPSBCQk1hcC5lbmQoKSkgeworICAgICAgZm9yIChMb29wVCAqTCA9IEktPnNlY29uZDsgTDsgTCA9IEwtPmdldFBhcmVudExvb3AoKSkKKyAgICAgICAgTC0+cmVtb3ZlQmxvY2tGcm9tTG9vcChCQik7CisKKyAgICAgIEJCTWFwLmVyYXNlKEkpOworICAgIH0KKyAgfQorCisgIC8vIEludGVybmFscworCisgIHN0YXRpYyBib29sIGlzTm90QWxyZWFkeUNvbnRhaW5lZEluKGNvbnN0IExvb3BUICpTdWJMb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wVCAqUGFyZW50TG9vcCkgeworICAgIGlmICghU3ViTG9vcCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChTdWJMb29wID09IFBhcmVudExvb3ApCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGlzTm90QWxyZWFkeUNvbnRhaW5lZEluKFN1Ykxvb3AtPmdldFBhcmVudExvb3AoKSwgUGFyZW50TG9vcCk7CisgIH0KKworICAvLy8gQ3JlYXRlIHRoZSBsb29wIGZvcmVzdCB1c2luZyBhIHN0YWJsZSBhbGdvcml0aG0uCisgIHZvaWQgYW5hbHl6ZShjb25zdCBEb21pbmF0b3JUcmVlQmFzZTxCbG9ja1QsIGZhbHNlPiAmRG9tVHJlZSk7CisKKyAgLy8gRGVidWdnaW5nCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICB2b2lkIHZlcmlmeShjb25zdCBEb21pbmF0b3JUcmVlQmFzZTxCbG9ja1QsIGZhbHNlPiAmRG9tVHJlZSkgY29uc3Q7CisKKyAgLy8vIERlc3Ryb3kgYSBsb29wIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBgTG9vcEluZm9gIG5lc3QuCisgIC8vLworICAvLy8gVGhpcyBydW5zIHRoZSBkZXN0cnVjdG9yIG9mIHRoZSBsb29wIG9iamVjdCBtYWtpbmcgaXQgaW52YWxpZCB0bworICAvLy8gcmVmZXJlbmNlIGFmdGVyd2FyZC4gVGhlIG1lbW9yeSBpcyByZXRhaW5lZCBzbyB0aGF0IHRoZSAqcG9pbnRlciogdG8gdGhlCisgIC8vLyBsb29wIHJlbWFpbnMgdmFsaWQuCisgIC8vLworICAvLy8gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgcmVtb3ZpbmcgdGhpcyBsb29wIGZyb20gdGhlIGxvb3AgbmVzdCBhbmQKKyAgLy8vIG90aGVyd2lzZSBkaXNjb25uZWN0aW5nIGl0IGZyb20gdGhlIGJyb2FkZXIgYExvb3BJbmZvYCBkYXRhIHN0cnVjdHVyZXMuCisgIC8vLyBDYWxsZXJzIHRoYXQgZG9uJ3QgbmF0dXJhbGx5IGhhbmRsZSB0aGlzIHRoZW1zZWx2ZXMgc2hvdWxkIHByb2JhYmx5IGNhbGwKKyAgLy8vIGBlcmFzZScgaW5zdGVhZC4KKyAgdm9pZCBkZXN0cm95KExvb3BUICpMKSB7CisgICAgTC0+fkxvb3BUKCk7CisKKyAgICAvLyBTaW5jZSBMb29wQWxsb2NhdG9yIGlzIGEgQnVtcFB0ckFsbG9jYXRvciwgdGhpcyBEZWFsbG9jYXRlIG9ubHkgcG9pc29ucworICAgIC8vIFxjIEwsIGJ1dCB0aGUgcG9pbnRlciByZW1haW5zIHZhbGlkIGZvciBub24tZGVyZWZlcmVuY2luZyB1c2VzLgorICAgIExvb3BBbGxvY2F0b3IuRGVhbGxvY2F0ZShMKTsKKyAgfQorfTsKKworLy8gSW1wbGVtZW50YXRpb24gaW4gTG9vcEluZm9JbXBsLmgKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBMb29wSW5mb0Jhc2U8QmFzaWNCbG9jaywgTG9vcD47CisKK2NsYXNzIExvb3BJbmZvIDogcHVibGljIExvb3BJbmZvQmFzZTxCYXNpY0Jsb2NrLCBMb29wPiB7CisgIHR5cGVkZWYgTG9vcEluZm9CYXNlPEJhc2ljQmxvY2ssIExvb3A+IEJhc2VUOworCisgIGZyaWVuZCBjbGFzcyBMb29wQmFzZTxCYXNpY0Jsb2NrLCBMb29wPjsKKworICB2b2lkIG9wZXJhdG9yPShjb25zdCBMb29wSW5mbyAmKSA9IGRlbGV0ZTsKKyAgTG9vcEluZm8oY29uc3QgTG9vcEluZm8gJikgPSBkZWxldGU7CisKK3B1YmxpYzoKKyAgTG9vcEluZm8oKSB7fQorICBleHBsaWNpdCBMb29wSW5mbyhjb25zdCBEb21pbmF0b3JUcmVlQmFzZTxCYXNpY0Jsb2NrLCBmYWxzZT4gJkRvbVRyZWUpOworCisgIExvb3BJbmZvKExvb3BJbmZvICYmQXJnKSA6IEJhc2VUKHN0ZDo6bW92ZShzdGF0aWNfY2FzdDxCYXNlVCAmPihBcmcpKSkge30KKyAgTG9vcEluZm8gJm9wZXJhdG9yPShMb29wSW5mbyAmJlJIUykgeworICAgIEJhc2VUOjpvcGVyYXRvcj0oc3RkOjptb3ZlKHN0YXRpY19jYXN0PEJhc2VUICY+KFJIUykpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gSGFuZGxlIGludmFsaWRhdGlvbiBleHBsaWNpdGx5LgorICBib29sIGludmFsaWRhdGUoRnVuY3Rpb24gJkYsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICZQQSwKKyAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmKTsKKworICAvLyBNb3N0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIHZpYSBMb29wSW5mb0Jhc2UuCisKKyAgLy8vIFVwZGF0ZSBMb29wSW5mbyBhZnRlciByZW1vdmluZyB0aGUgbGFzdCBiYWNrZWRnZSBmcm9tIGEgbG9vcC4gVGhpcyB1cGRhdGVzCisgIC8vLyB0aGUgbG9vcCBmb3Jlc3QgYW5kIHBhcmVudCBsb29wcyBmb3IgZWFjaCBibG9jayBzbyB0aGF0IFxjIEwgaXMgbm8gbG9uZ2VyCisgIC8vLyByZWZlcmVuY2VkLCBidXQgZG9lcyBub3QgYWN0dWFsbHkgZGVsZXRlIFxjIEwgaW1tZWRpYXRlbHkuIFRoZSBwb2ludGVyCisgIC8vLyB3aWxsIHJlbWFpbiB2YWxpZCB1bnRpbCB0aGlzIExvb3BJbmZvJ3MgbWVtb3J5IGlzIHJlbGVhc2VkLgorICB2b2lkIGVyYXNlKExvb3AgKkwpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgcmVwbGFjaW5nIEZyb20gd2l0aCBUbyBldmVyeXdoZXJlIGlzIGd1YXJhbnRlZWQgdG8KKyAgLy8vIHByZXNlcnZlIExDU1NBIGZvcm0uCisgIGJvb2wgcmVwbGFjZW1lbnRQcmVzZXJ2ZXNMQ1NTQUZvcm0oSW5zdHJ1Y3Rpb24gKkZyb20sIFZhbHVlICpUbykgeworICAgIC8vIFByZXNlcnZpbmcgTENTU0EgZm9ybSBpcyBvbmx5IHByb2JsZW1hdGljIGlmIHRoZSByZXBsYWNpbmcgdmFsdWUgaXMgYW4KKyAgICAvLyBpbnN0cnVjdGlvbi4KKyAgICBJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihUbyk7CisgICAgaWYgKCFJKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gSWYgYm90aCBpbnN0cnVjdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIHNhbWUgYmFzaWMgYmxvY2sgdGhlbiByZXBsYWNlbWVudAorICAgIC8vIGNhbm5vdCBicmVhayBMQ1NTQSBmb3JtLgorICAgIGlmIChJLT5nZXRQYXJlbnQoKSA9PSBGcm9tLT5nZXRQYXJlbnQoKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIC8vIElmIHRoZSBpbnN0cnVjdGlvbiBpcyBub3QgZGVmaW5lZCBpbiBhIGxvb3AgdGhlbiBpdCBjYW4gc2FmZWx5IHJlcGxhY2UKKyAgICAvLyBhbnl0aGluZy4KKyAgICBMb29wICpUb0xvb3AgPSBnZXRMb29wRm9yKEktPmdldFBhcmVudCgpKTsKKyAgICBpZiAoIVRvTG9vcCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIC8vIElmIHRoZSByZXBsYWNpbmcgaW5zdHJ1Y3Rpb24gaXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBsb29wIGFzIHRoZSBvcmlnaW5hbAorICAgIC8vIGluc3RydWN0aW9uLCBvciBpbiBhIGxvb3AgdGhhdCBjb250YWlucyBpdCBhcyBhbiBpbm5lciBsb29wLCB0aGVuIHVzaW5nCisgICAgLy8gaXQgYXMgYSByZXBsYWNlbWVudCB3aWxsIG5vdCBicmVhayBMQ1NTQSBmb3JtLgorICAgIHJldHVybiBUb0xvb3AtPmNvbnRhaW5zKGdldExvb3BGb3IoRnJvbS0+Z2V0UGFyZW50KCkpKTsKKyAgfQorCisgIC8vLyBDaGVja3MgaWYgbW92aW5nIGEgc3BlY2lmaWMgaW5zdHJ1Y3Rpb24gY2FuIGJyZWFrIExDU1NBIGluIGFueSBsb29wLgorICAvLy8KKyAgLy8vIFJldHVybiB0cnVlIGlmIG1vdmluZyBccCBJbnN0IHRvIGJlZm9yZSBccCBOZXdMb2Mgd2lsbCBicmVhayBMQ1NTQSwKKyAgLy8vIGFzc3VtaW5nIHRoYXQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgXHAgSW5zdCBhbmQgXHAgTmV3TG9jIGlzIGN1cnJlbnRseQorICAvLy8gaW4gTENTU0EgZm9ybS4KKyAgYm9vbCBtb3ZlbWVudFByZXNlcnZlc0xDU1NBRm9ybShJbnN0cnVjdGlvbiAqSW5zdCwgSW5zdHJ1Y3Rpb24gKk5ld0xvYykgeworICAgIGFzc2VydChJbnN0LT5nZXRGdW5jdGlvbigpID09IE5ld0xvYy0+Z2V0RnVuY3Rpb24oKSAmJgorICAgICAgICAgICAiQ2FuJ3QgcmVhc29uIGFib3V0IElQTyEiKTsKKworICAgIGF1dG8gKk9sZEJCID0gSW5zdC0+Z2V0UGFyZW50KCk7CisgICAgYXV0byAqTmV3QkIgPSBOZXdMb2MtPmdldFBhcmVudCgpOworCisgICAgLy8gTW92ZW1lbnQgd2l0aGluIHRoZSBzYW1lIGxvb3AgZG9lcyBub3QgYnJlYWsgTENTU0EgKHRoZSBlcXVhbGl0eSBjaGVjayBpcworICAgIC8vIHRvIGF2b2lkIGRvaW5nIGEgaGFzaHRhYmxlIGxvb2t1cCBpbiBjYXNlIG9mIGludHJhLWJsb2NrIG1vdmVtZW50KS4KKyAgICBpZiAoT2xkQkIgPT0gTmV3QkIpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGF1dG8gKk9sZExvb3AgPSBnZXRMb29wRm9yKE9sZEJCKTsKKyAgICBhdXRvICpOZXdMb29wID0gZ2V0TG9vcEZvcihOZXdCQik7CisKKyAgICBpZiAoT2xkTG9vcCA9PSBOZXdMb29wKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBDaGVjayBpZiBPdXRlciBjb250YWlucyBJbm5lcjsgd2l0aCB0aGUgbnVsbCBsb29wIGNvdW50aW5nIGFzIHRoZQorICAgIC8vICJvdXRlcm1vc3QiIGxvb3AuCisgICAgYXV0byBDb250YWlucyA9IFtdKGNvbnN0IExvb3AgKk91dGVyLCBjb25zdCBMb29wICpJbm5lcikgeworICAgICAgcmV0dXJuICFPdXRlciB8fCBPdXRlci0+Y29udGFpbnMoSW5uZXIpOworICAgIH07CisKKyAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBtb3ZlbWVudCBvZiBJbnN0IHRvIGJlZm9yZSBOZXdMb2MgZG9lcyBub3QgYnJlYWsgTENTU0EsCisgICAgLy8gd2UgbmVlZCB0byBjaGVjayB0d28gc2V0cyBvZiB1c2VzIGZvciBwb3NzaWJsZSBMQ1NTQSB2aW9sYXRpb25zIGF0CisgICAgLy8gTmV3TG9jOiB0aGUgdXNlcnMgb2YgTmV3SW5zdCwgYW5kIHRoZSBvcGVyYW5kcyBvZiBOZXdJbnN0LgorCisgICAgLy8gSWYgd2Uga25vdyB3ZSdyZSBob2lzdGluZyBJbnN0IG91dCBvZiBhbiBpbm5lciBsb29wIHRvIGFuIG91dGVyIGxvb3AsCisgICAgLy8gdGhlbiB0aGUgdXNlcyAqb2YqIEluc3QgZG9uJ3QgbmVlZCB0byBiZSBjaGVja2VkLgorCisgICAgaWYgKCFDb250YWlucyhOZXdMb29wLCBPbGRMb29wKSkgeworICAgICAgZm9yIChVc2UgJlUgOiBJbnN0LT51c2VzKCkpIHsKKyAgICAgICAgYXV0byAqVUkgPSBjYXN0PEluc3RydWN0aW9uPihVLmdldFVzZXIoKSk7CisgICAgICAgIGF1dG8gKlVCQiA9IGlzYTxQSElOb2RlPihVSSkgPyBjYXN0PFBISU5vZGU+KFVJKS0+Z2V0SW5jb21pbmdCbG9jayhVKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVUktPmdldFBhcmVudCgpOworICAgICAgICBpZiAoVUJCICE9IE5ld0JCICYmIGdldExvb3BGb3IoVUJCKSAhPSBOZXdMb29wKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB3ZSBrbm93IHdlJ3JlIHNpbmtpbmcgSW5zdCBmcm9tIGFuIG91dGVyIGxvb3AgaW50byBhbiBpbm5lciBsb29wLCB0aGVuCisgICAgLy8gdGhlICpvcGVyYW5kcyogb2YgSW5zdCBkb24ndCBuZWVkIHRvIGJlIGNoZWNrZWQuCisKKyAgICBpZiAoIUNvbnRhaW5zKE9sZExvb3AsIE5ld0xvb3ApKSB7CisgICAgICAvLyBTZWUgYmVsb3cgb24gd2h5IHdlIGNhbid0IGhhbmRsZSBwaGkgbm9kZXMgaGVyZS4KKyAgICAgIGlmIChpc2E8UEhJTm9kZT4oSW5zdCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgZm9yIChVc2UgJlUgOiBJbnN0LT5vcGVyYW5kcygpKSB7CisgICAgICAgIGF1dG8gKkRlZkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVS5nZXQoKSk7CisgICAgICAgIGlmICghRGVmSSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gVGhpcyB3b3VsZCBuZWVkIGFkanVzdG1lbnQgaWYgd2UgYWxsb3cgSW5zdCB0byBiZSBhIHBoaSBub2RlIC0tIHRoZQorICAgICAgICAvLyBuZXcgdXNlIGJsb2NrIHdvbid0IHNpbXBseSBiZSBOZXdCQi4KKworICAgICAgICBhdXRvICpEZWZCbG9jayA9IERlZkktPmdldFBhcmVudCgpOworICAgICAgICBpZiAoRGVmQmxvY2sgIT0gTmV3QkIgJiYgZ2V0TG9vcEZvcihEZWZCbG9jaykgIT0gTmV3TG9vcCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKKy8vIEFsbG93IGNsaWVudHMgdG8gd2FsayB0aGUgbGlzdCBvZiBuZXN0ZWQgbG9vcHMuLi4KK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxjb25zdCBMb29wICo+IHsKKyAgdHlwZWRlZiBjb25zdCBMb29wICpOb2RlUmVmOworICB0eXBlZGVmIExvb3BJbmZvOjppdGVyYXRvciBDaGlsZEl0ZXJhdG9yVHlwZTsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoY29uc3QgTG9vcCAqTCkgeyByZXR1cm4gTDsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7IHJldHVybiBOLT5iZWdpbigpOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBOLT5lbmQoKTsgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPExvb3AgKj4geworICB0eXBlZGVmIExvb3AgKk5vZGVSZWY7CisgIHR5cGVkZWYgTG9vcEluZm86Oml0ZXJhdG9yIENoaWxkSXRlcmF0b3JUeXBlOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShMb29wICpMKSB7IHJldHVybiBMOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPmJlZ2luKCk7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPmVuZCgpOyB9Cit9OworCisvLy8gXGJyaWVmIEFuYWx5c2lzIHBhc3MgdGhhdCBleHBvc2VzIHRoZSBcYyBMb29wSW5mbyBmb3IgYSBmdW5jdGlvbi4KK2NsYXNzIExvb3BBbmFseXNpcyA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjxMb29wQW5hbHlzaXM+IHsKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPExvb3BBbmFseXNpcz47CisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBMb29wSW5mbyBSZXN1bHQ7CisKKyAgTG9vcEluZm8gcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIFxicmllZiBQcmludGVyIHBhc3MgZm9yIHRoZSBcYyBMb29wQW5hbHlzaXMgcmVzdWx0cy4KK2NsYXNzIExvb3BQcmludGVyUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPExvb3BQcmludGVyUGFzcz4geworICByYXdfb3N0cmVhbSAmT1M7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgTG9vcFByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPUykgOiBPUyhPUykge30KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIFxicmllZiBWZXJpZmllciBwYXNzIGZvciB0aGUgXGMgTG9vcEFuYWx5c2lzIHJlc3VsdHMuCitzdHJ1Y3QgTG9vcFZlcmlmaWVyUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPExvb3BWZXJpZmllclBhc3M+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIFxicmllZiBUaGUgbGVnYWN5IHBhc3MgbWFuYWdlcidzIGFuYWx5c2lzIHBhc3MgdG8gY29tcHV0ZSBsb29wIGluZm9ybWF0aW9uLgorY2xhc3MgTG9vcEluZm9XcmFwcGVyUGFzcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICBMb29wSW5mbyBMSTsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorCisgIExvb3BJbmZvV3JhcHBlclBhc3MoKSA6IEZ1bmN0aW9uUGFzcyhJRCkgeworICAgIGluaXRpYWxpemVMb29wSW5mb1dyYXBwZXJQYXNzUGFzcygqUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKSk7CisgIH0KKworICBMb29wSW5mbyAmZ2V0TG9vcEluZm8oKSB7IHJldHVybiBMSTsgfQorICBjb25zdCBMb29wSW5mbyAmZ2V0TG9vcEluZm8oKSBjb25zdCB7IHJldHVybiBMSTsgfQorCisgIC8vLyBcYnJpZWYgQ2FsY3VsYXRlIHRoZSBuYXR1cmFsIGxvb3AgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gZnVuY3Rpb24uCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisKKyAgdm9pZCB2ZXJpZnlBbmFseXNpcygpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlIHsgTEkucmVsZWFzZU1lbW9yeSgpOyB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTywgY29uc3QgTW9kdWxlICpNID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyBGdW5jdGlvbiB0byBwcmludCBhIGxvb3AncyBjb250ZW50cyBhcyBMTFZNJ3MgdGV4dCBJUiBhc3NlbWJseS4KK3ZvaWQgcHJpbnRMb29wKExvb3AgJkwsIHJhd19vc3RyZWFtICZPUywgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lciA9ICIiKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BJbmZvSW1wbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb29wSW5mb0ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2ExNmI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb29wSW5mb0ltcGwuaApAQCAtMCwwICsxLDY3NyBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvTG9vcEluZm9JbXBsLmggLSBOYXR1cmFsIExvb3AgQ2FsY3VsYXRvciAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGlzIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIExvb3BJbmZvIHVzZWQgZm9yIGJvdGggTG9vcHMgYW5kCisvLyBNYWNoaW5lTG9vcHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0xPT1BJTkZPSU1QTF9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTE9PUElORk9JTVBMX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1Bvc3RPcmRlckl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU2V0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvRG9taW5hdG9ycy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBUElzIGZvciBzaW1wbGUgYW5hbHlzaXMgb2YgdGhlIGxvb3AuIFNlZSBoZWFkZXIgbm90ZXMuCisKKy8vLyBnZXRFeGl0aW5nQmxvY2tzIC0gUmV0dXJuIGFsbCBibG9ja3MgaW5zaWRlIHRoZSBsb29wIHRoYXQgaGF2ZSBzdWNjZXNzb3JzCisvLy8gb3V0c2lkZSBvZiB0aGUgbG9vcC4gIFRoZXNlIGFyZSB0aGUgYmxvY2tzIF9pbnNpZGUgb2YgdGhlIGN1cnJlbnQgbG9vcF8KKy8vLyB3aGljaCBicmFuY2ggb3V0LiAgVGhlIHJldHVybmVkIGxpc3QgaXMgYWx3YXlzIHVuaXF1ZS4KKy8vLwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+Cit2b2lkIExvb3BCYXNlPEJsb2NrVCwgTG9vcFQ+OjpnZXRFeGl0aW5nQmxvY2tzKAorICAgIFNtYWxsVmVjdG9ySW1wbDxCbG9ja1QgKj4gJkV4aXRpbmdCbG9ja3MpIGNvbnN0IHsKKyAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgZm9yIChjb25zdCBhdXRvIEJCIDogYmxvY2tzKCkpCisgICAgZm9yIChjb25zdCBhdXRvICZTdWNjIDogY2hpbGRyZW48QmxvY2tUICo+KEJCKSkKKyAgICAgIGlmICghY29udGFpbnMoU3VjYykpIHsKKyAgICAgICAgLy8gTm90IGluIGN1cnJlbnQgbG9vcD8gSXQgbXVzdCBiZSBhbiBleGl0IGJsb2NrLgorICAgICAgICBFeGl0aW5nQmxvY2tzLnB1c2hfYmFjayhCQik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorfQorCisvLy8gZ2V0RXhpdGluZ0Jsb2NrIC0gSWYgZ2V0RXhpdGluZ0Jsb2NrcyB3b3VsZCByZXR1cm4gZXhhY3RseSBvbmUgYmxvY2ssCisvLy8gcmV0dXJuIHRoYXQgYmxvY2suIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgorQmxvY2tUICpMb29wQmFzZTxCbG9ja1QsIExvb3BUPjo6Z2V0RXhpdGluZ0Jsb2NrKCkgY29uc3QgeworICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICBTbWFsbFZlY3RvcjxCbG9ja1QgKiwgOD4gRXhpdGluZ0Jsb2NrczsKKyAgZ2V0RXhpdGluZ0Jsb2NrcyhFeGl0aW5nQmxvY2tzKTsKKyAgaWYgKEV4aXRpbmdCbG9ja3Muc2l6ZSgpID09IDEpCisgICAgcmV0dXJuIEV4aXRpbmdCbG9ja3NbMF07CisgIHJldHVybiBudWxscHRyOworfQorCisvLy8gZ2V0RXhpdEJsb2NrcyAtIFJldHVybiBhbGwgb2YgdGhlIHN1Y2Nlc3NvciBibG9ja3Mgb2YgdGhpcyBsb29wLiAgVGhlc2UKKy8vLyBhcmUgdGhlIGJsb2NrcyBfb3V0c2lkZSBvZiB0aGUgY3VycmVudCBsb29wXyB3aGljaCBhcmUgYnJhbmNoZWQgdG8uCisvLy8KK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgordm9pZCBMb29wQmFzZTxCbG9ja1QsIExvb3BUPjo6Z2V0RXhpdEJsb2NrcygKKyAgICBTbWFsbFZlY3RvckltcGw8QmxvY2tUICo+ICZFeGl0QmxvY2tzKSBjb25zdCB7CisgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgIGZvciAoY29uc3QgYXV0byBCQiA6IGJsb2NrcygpKQorICAgIGZvciAoY29uc3QgYXV0byAmU3VjYyA6IGNoaWxkcmVuPEJsb2NrVCAqPihCQikpCisgICAgICBpZiAoIWNvbnRhaW5zKFN1Y2MpKQorICAgICAgICAvLyBOb3QgaW4gY3VycmVudCBsb29wPyBJdCBtdXN0IGJlIGFuIGV4aXQgYmxvY2suCisgICAgICAgIEV4aXRCbG9ja3MucHVzaF9iYWNrKFN1Y2MpOworfQorCisvLy8gZ2V0RXhpdEJsb2NrIC0gSWYgZ2V0RXhpdEJsb2NrcyB3b3VsZCByZXR1cm4gZXhhY3RseSBvbmUgYmxvY2ssCisvLy8gcmV0dXJuIHRoYXQgYmxvY2suIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgorQmxvY2tUICpMb29wQmFzZTxCbG9ja1QsIExvb3BUPjo6Z2V0RXhpdEJsb2NrKCkgY29uc3QgeworICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICBTbWFsbFZlY3RvcjxCbG9ja1QgKiwgOD4gRXhpdEJsb2NrczsKKyAgZ2V0RXhpdEJsb2NrcyhFeGl0QmxvY2tzKTsKKyAgaWYgKEV4aXRCbG9ja3Muc2l6ZSgpID09IDEpCisgICAgcmV0dXJuIEV4aXRCbG9ja3NbMF07CisgIHJldHVybiBudWxscHRyOworfQorCisvLy8gZ2V0RXhpdEVkZ2VzIC0gUmV0dXJuIGFsbCBwYWlycyBvZiAoX2luc2lkZV9ibG9ja18sX291dHNpZGVfYmxvY2tfKS4KK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgordm9pZCBMb29wQmFzZTxCbG9ja1QsIExvb3BUPjo6Z2V0RXhpdEVkZ2VzKAorICAgIFNtYWxsVmVjdG9ySW1wbDxFZGdlPiAmRXhpdEVkZ2VzKSBjb25zdCB7CisgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgIGZvciAoY29uc3QgYXV0byBCQiA6IGJsb2NrcygpKQorICAgIGZvciAoY29uc3QgYXV0byAmU3VjYyA6IGNoaWxkcmVuPEJsb2NrVCAqPihCQikpCisgICAgICBpZiAoIWNvbnRhaW5zKFN1Y2MpKQorICAgICAgICAvLyBOb3QgaW4gY3VycmVudCBsb29wPyBJdCBtdXN0IGJlIGFuIGV4aXQgYmxvY2suCisgICAgICAgIEV4aXRFZGdlcy5lbXBsYWNlX2JhY2soQkIsIFN1Y2MpOworfQorCisvLy8gZ2V0TG9vcFByZWhlYWRlciAtIElmIHRoZXJlIGlzIGEgcHJlaGVhZGVyIGZvciB0aGlzIGxvb3AsIHJldHVybiBpdC4gIEEKKy8vLyBsb29wIGhhcyBhIHByZWhlYWRlciBpZiB0aGVyZSBpcyBvbmx5IG9uZSBlZGdlIHRvIHRoZSBoZWFkZXIgb2YgdGhlIGxvb3AKKy8vLyBmcm9tIG91dHNpZGUgb2YgdGhlIGxvb3AgYW5kIGl0IGlzIGxlZ2FsIHRvIGhvaXN0IGluc3RydWN0aW9ucyBpbnRvIHRoZQorLy8vIHByZWRlY2Vzc29yLiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGUgYmxvY2sgYnJhbmNoaW5nIHRvIHRoZSBoZWFkZXIgb2YgdGhlCisvLy8gbG9vcCBpcyB0aGUgcHJlaGVhZGVyIG5vZGUuCisvLy8KKy8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gcHJlaGVhZGVyIGZvciB0aGUgbG9vcC4KKy8vLwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+CitCbG9ja1QgKkxvb3BCYXNlPEJsb2NrVCwgTG9vcFQ+OjpnZXRMb29wUHJlaGVhZGVyKCkgY29uc3QgeworICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICAvLyBLZWVwIHRyYWNrIG9mIG5vZGVzIG91dHNpZGUgdGhlIGxvb3AgYnJhbmNoaW5nIHRvIHRoZSBoZWFkZXIuLi4KKyAgQmxvY2tUICpPdXQgPSBnZXRMb29wUHJlZGVjZXNzb3IoKTsKKyAgaWYgKCFPdXQpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgLy8gTWFrZSBzdXJlIHdlIGFyZSBhbGxvd2VkIHRvIGhvaXN0IGluc3RydWN0aW9ucyBpbnRvIHRoZSBwcmVkZWNlc3Nvci4KKyAgaWYgKCFPdXQtPmlzTGVnYWxUb0hvaXN0SW50bygpKQorICAgIHJldHVybiBudWxscHRyOworCisgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBvbmx5IG9uZSBleGl0IG91dCBvZiB0aGUgcHJlaGVhZGVyLgorICB0eXBlZGVmIEdyYXBoVHJhaXRzPEJsb2NrVCAqPiBCbG9ja1RyYWl0czsKKyAgdHlwZW5hbWUgQmxvY2tUcmFpdHM6OkNoaWxkSXRlcmF0b3JUeXBlIFNJID0gQmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKE91dCk7CisgICsrU0k7CisgIGlmIChTSSAhPSBCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKE91dCkpCisgICAgcmV0dXJuIG51bGxwdHI7IC8vIE11bHRpcGxlIGV4aXRzIGZyb20gdGhlIGJsb2NrLCBtdXN0IG5vdCBiZSBhIHByZWhlYWRlci4KKworICAvLyBUaGUgcHJlZGVjZXNzb3IgaGFzIGV4YWN0bHkgb25lIHN1Y2Nlc3Nvciwgc28gaXQgaXMgYSBwcmVoZWFkZXIuCisgIHJldHVybiBPdXQ7Cit9CisKKy8vLyBnZXRMb29wUHJlZGVjZXNzb3IgLSBJZiB0aGUgZ2l2ZW4gbG9vcCdzIGhlYWRlciBoYXMgZXhhY3RseSBvbmUgdW5pcXVlCisvLy8gcHJlZGVjZXNzb3Igb3V0c2lkZSB0aGUgbG9vcCwgcmV0dXJuIGl0LiBPdGhlcndpc2UgcmV0dXJuIG51bGwuCisvLy8gVGhpcyBpcyBsZXNzIHN0cmljdCB0aGF0IHRoZSBsb29wICJwcmVoZWFkZXIiIGNvbmNlcHQsIHdoaWNoIHJlcXVpcmVzCisvLy8gdGhlIHByZWRlY2Vzc29yIHRvIGhhdmUgZXhhY3RseSBvbmUgc3VjY2Vzc29yLgorLy8vCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBjbGFzcyBMb29wVD4KK0Jsb2NrVCAqTG9vcEJhc2U8QmxvY2tULCBMb29wVD46OmdldExvb3BQcmVkZWNlc3NvcigpIGNvbnN0IHsKKyAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgLy8gS2VlcCB0cmFjayBvZiBub2RlcyBvdXRzaWRlIHRoZSBsb29wIGJyYW5jaGluZyB0byB0aGUgaGVhZGVyLi4uCisgIEJsb2NrVCAqT3V0ID0gbnVsbHB0cjsKKworICAvLyBMb29wIG92ZXIgdGhlIHByZWRlY2Vzc29ycyBvZiB0aGUgaGVhZGVyIG5vZGUuLi4KKyAgQmxvY2tUICpIZWFkZXIgPSBnZXRIZWFkZXIoKTsKKyAgZm9yIChjb25zdCBhdXRvIFByZWQgOiBjaGlsZHJlbjxJbnZlcnNlPEJsb2NrVCAqPj4oSGVhZGVyKSkgeworICAgIGlmICghY29udGFpbnMoUHJlZCkpIHsgLy8gSWYgdGhlIGJsb2NrIGlzIG5vdCBpbiB0aGUgbG9vcC4uLgorICAgICAgaWYgKE91dCAmJiBPdXQgIT0gUHJlZCkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7IC8vIE11bHRpcGxlIHByZWRlY2Vzc29ycyBvdXRzaWRlIHRoZSBsb29wCisgICAgICBPdXQgPSBQcmVkOworICAgIH0KKyAgfQorCisgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBvbmx5IG9uZSBleGl0IG91dCBvZiB0aGUgcHJlaGVhZGVyLgorICBhc3NlcnQoT3V0ICYmICJIZWFkZXIgb2YgbG9vcCBoYXMgbm8gcHJlZGVjZXNzb3JzIGZyb20gb3V0c2lkZSBsb29wPyIpOworICByZXR1cm4gT3V0OworfQorCisvLy8gZ2V0TG9vcExhdGNoIC0gSWYgdGhlcmUgaXMgYSBzaW5nbGUgbGF0Y2ggYmxvY2sgZm9yIHRoaXMgbG9vcCwgcmV0dXJuIGl0LgorLy8vIEEgbGF0Y2ggYmxvY2sgaXMgYSBibG9jayB0aGF0IGNvbnRhaW5zIGEgYnJhbmNoIGJhY2sgdG8gdGhlIGhlYWRlci4KK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgorQmxvY2tUICpMb29wQmFzZTxCbG9ja1QsIExvb3BUPjo6Z2V0TG9vcExhdGNoKCkgY29uc3QgeworICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICBCbG9ja1QgKkhlYWRlciA9IGdldEhlYWRlcigpOworICBCbG9ja1QgKkxhdGNoID0gbnVsbHB0cjsKKyAgZm9yIChjb25zdCBhdXRvIFByZWQgOiBjaGlsZHJlbjxJbnZlcnNlPEJsb2NrVCAqPj4oSGVhZGVyKSkgeworICAgIGlmIChjb250YWlucyhQcmVkKSkgeworICAgICAgaWYgKExhdGNoKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIExhdGNoID0gUHJlZDsKKyAgICB9CisgIH0KKworICByZXR1cm4gTGF0Y2g7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBUElzIGZvciB1cGRhdGluZyBsb29wIGluZm9ybWF0aW9uIGFmdGVyIGNoYW5naW5nIHRoZSBDRkcKKy8vCisKKy8vLyBhZGRCYXNpY0Jsb2NrVG9Mb29wIC0gVGhpcyBtZXRob2QgaXMgdXNlZCBieSBvdGhlciBhbmFseXNlcyB0byB1cGRhdGUgbG9vcAorLy8vIGluZm9ybWF0aW9uLiAgTmV3QkIgaXMgc2V0IHRvIGJlIGEgbmV3IG1lbWJlciBvZiB0aGUgY3VycmVudCBsb29wLgorLy8vIEJlY2F1c2Ugb2YgdGhpcywgaXQgaXMgYWRkZWQgYXMgYSBtZW1iZXIgb2YgYWxsIHBhcmVudCBsb29wcywgYW5kIGlzIGFkZGVkCisvLy8gdG8gdGhlIHNwZWNpZmllZCBMb29wSW5mbyBvYmplY3QgYXMgYmVpbmcgaW4gdGhlIGN1cnJlbnQgYmFzaWMgYmxvY2suICBJdAorLy8vIGlzIG5vdCB2YWxpZCB0byByZXBsYWNlIHRoZSBsb29wIGhlYWRlciB3aXRoIHRoaXMgbWV0aG9kLgorLy8vCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBjbGFzcyBMb29wVD4KK3ZvaWQgTG9vcEJhc2U8QmxvY2tULCBMb29wVD46OmFkZEJhc2ljQmxvY2tUb0xvb3AoCisgICAgQmxvY2tUICpOZXdCQiwgTG9vcEluZm9CYXNlPEJsb2NrVCwgTG9vcFQ+ICZMSUIpIHsKKyAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyNpZm5kZWYgTkRFQlVHCisgIGlmICghQmxvY2tzLmVtcHR5KCkpIHsKKyAgICBhdXRvIFNhbWVIZWFkZXIgPSBMSUJbZ2V0SGVhZGVyKCldOworICAgIGFzc2VydChjb250YWlucyhTYW1lSGVhZGVyKSAmJiBnZXRIZWFkZXIoKSA9PSBTYW1lSGVhZGVyLT5nZXRIZWFkZXIoKSAmJgorICAgICAgICAgICAiSW5jb3JyZWN0IExJIHNwZWNpZmllZCBmb3IgdGhpcyBsb29wISIpOworICB9CisjZW5kaWYKKyAgYXNzZXJ0KE5ld0JCICYmICJDYW5ub3QgYWRkIGEgbnVsbCBiYXNpYyBibG9jayB0byB0aGUgbG9vcCEiKTsKKyAgYXNzZXJ0KCFMSUJbTmV3QkJdICYmICJCYXNpY0Jsb2NrIGFscmVhZHkgaW4gdGhlIGxvb3AhIik7CisKKyAgTG9vcFQgKkwgPSBzdGF0aWNfY2FzdDxMb29wVCAqPih0aGlzKTsKKworICAvLyBBZGQgdGhlIGxvb3AgbWFwcGluZyB0byB0aGUgTG9vcEluZm8gb2JqZWN0Li4uCisgIExJQi5CQk1hcFtOZXdCQl0gPSBMOworCisgIC8vIEFkZCB0aGUgYmFzaWMgYmxvY2sgdG8gdGhpcyBsb29wIGFuZCBhbGwgcGFyZW50IGxvb3BzLi4uCisgIHdoaWxlIChMKSB7CisgICAgTC0+YWRkQmxvY2tFbnRyeShOZXdCQik7CisgICAgTCA9IEwtPmdldFBhcmVudExvb3AoKTsKKyAgfQorfQorCisvLy8gcmVwbGFjZUNoaWxkTG9vcFdpdGggLSBUaGlzIGlzIHVzZWQgd2hlbiBzcGxpdHRpbmcgbG9vcHMgdXAuICBJdCByZXBsYWNlcworLy8vIHRoZSBPbGRDaGlsZCBlbnRyeSBpbiBvdXIgY2hpbGRyZW4gbGlzdCB3aXRoIE5ld0NoaWxkLCBhbmQgdXBkYXRlcyB0aGUKKy8vLyBwYXJlbnQgcG9pbnRlciBvZiBPbGRDaGlsZCB0byBiZSBudWxsIGFuZCB0aGUgTmV3Q2hpbGQgdG8gYmUgdGhpcyBsb29wLgorLy8vIFRoaXMgdXBkYXRlcyB0aGUgbG9vcCBkZXB0aCBvZiB0aGUgbmV3IGNoaWxkLgordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+Cit2b2lkIExvb3BCYXNlPEJsb2NrVCwgTG9vcFQ+OjpyZXBsYWNlQ2hpbGRMb29wV2l0aChMb29wVCAqT2xkQ2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wVCAqTmV3Q2hpbGQpIHsKKyAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgYXNzZXJ0KE9sZENoaWxkLT5QYXJlbnRMb29wID09IHRoaXMgJiYgIlRoaXMgbG9vcCBpcyBhbHJlYWR5IGJyb2tlbiEiKTsKKyAgYXNzZXJ0KCFOZXdDaGlsZC0+UGFyZW50TG9vcCAmJiAiTmV3Q2hpbGQgYWxyZWFkeSBoYXMgYSBwYXJlbnQhIik7CisgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPExvb3BUICo+OjppdGVyYXRvciBJID0gZmluZChTdWJMb29wcywgT2xkQ2hpbGQpOworICBhc3NlcnQoSSAhPSBTdWJMb29wcy5lbmQoKSAmJiAiT2xkQ2hpbGQgbm90IGluIGxvb3AhIik7CisgICpJID0gTmV3Q2hpbGQ7CisgIE9sZENoaWxkLT5QYXJlbnRMb29wID0gbnVsbHB0cjsKKyAgTmV3Q2hpbGQtPlBhcmVudExvb3AgPSBzdGF0aWNfY2FzdDxMb29wVCAqPih0aGlzKTsKK30KKworLy8vIHZlcmlmeUxvb3AgLSBWZXJpZnkgbG9vcCBzdHJ1Y3R1cmUKK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgordm9pZCBMb29wQmFzZTxCbG9ja1QsIExvb3BUPjo6dmVyaWZ5TG9vcCgpIGNvbnN0IHsKKyAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyNpZm5kZWYgTkRFQlVHCisgIGFzc2VydCghQmxvY2tzLmVtcHR5KCkgJiYgIkxvb3AgaGVhZGVyIGlzIG1pc3NpbmciKTsKKworICAvLyBTZXR1cCBmb3IgdXNpbmcgYSBkZXB0aC1maXJzdCBpdGVyYXRvciB0byB2aXNpdCBldmVyeSBibG9jayBpbiB0aGUgbG9vcC4KKyAgU21hbGxWZWN0b3I8QmxvY2tUICosIDg+IEV4aXRCQnM7CisgIGdldEV4aXRCbG9ja3MoRXhpdEJCcyk7CisgIGRmX2l0ZXJhdG9yX2RlZmF1bHRfc2V0PEJsb2NrVCAqPiBWaXNpdFNldDsKKyAgVmlzaXRTZXQuaW5zZXJ0KEV4aXRCQnMuYmVnaW4oKSwgRXhpdEJCcy5lbmQoKSk7CisgIGRmX2V4dF9pdGVyYXRvcjxCbG9ja1QgKiwgZGZfaXRlcmF0b3JfZGVmYXVsdF9zZXQ8QmxvY2tUICo+PgorICAgICAgQkkgPSBkZl9leHRfYmVnaW4oZ2V0SGVhZGVyKCksIFZpc2l0U2V0KSwKKyAgICAgIEJFID0gZGZfZXh0X2VuZChnZXRIZWFkZXIoKSwgVmlzaXRTZXQpOworCisgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIEJCcyB2aXNpdGVkLgorICBTbWFsbFB0clNldDxCbG9ja1QgKiwgOD4gVmlzaXRlZEJCczsKKworICAvLyBDaGVjayB0aGUgaW5kaXZpZHVhbCBibG9ja3MuCisgIGZvciAoOyBCSSAhPSBCRTsgKytCSSkgeworICAgIEJsb2NrVCAqQkIgPSAqQkk7CisKKyAgICBhc3NlcnQoc3RkOjphbnlfb2YoR3JhcGhUcmFpdHM8QmxvY2tUICo+OjpjaGlsZF9iZWdpbihCQiksCisgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoVHJhaXRzPEJsb2NrVCAqPjo6Y2hpbGRfZW5kKEJCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgWyZdKEJsb2NrVCAqQikgeyByZXR1cm4gY29udGFpbnMoQik7IH0pICYmCisgICAgICAgICAgICJMb29wIGJsb2NrIGhhcyBubyBpbi1sb29wIHN1Y2Nlc3NvcnMhIik7CisKKyAgICBhc3NlcnQoc3RkOjphbnlfb2YoR3JhcGhUcmFpdHM8SW52ZXJzZTxCbG9ja1QgKj4+OjpjaGlsZF9iZWdpbihCQiksCisgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoVHJhaXRzPEludmVyc2U8QmxvY2tUICo+Pjo6Y2hpbGRfZW5kKEJCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgWyZdKEJsb2NrVCAqQikgeyByZXR1cm4gY29udGFpbnMoQik7IH0pICYmCisgICAgICAgICAgICJMb29wIGJsb2NrIGhhcyBubyBpbi1sb29wIHByZWRlY2Vzc29ycyEiKTsKKworICAgIFNtYWxsVmVjdG9yPEJsb2NrVCAqLCAyPiBPdXRzaWRlTG9vcFByZWRzOworICAgIHN0ZDo6Zm9yX2VhY2goR3JhcGhUcmFpdHM8SW52ZXJzZTxCbG9ja1QgKj4+OjpjaGlsZF9iZWdpbihCQiksCisgICAgICAgICAgICAgICAgICBHcmFwaFRyYWl0czxJbnZlcnNlPEJsb2NrVCAqPj46OmNoaWxkX2VuZChCQiksCisgICAgICAgICAgICAgICAgICBbJl0oQmxvY2tUICpCKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghY29udGFpbnMoQikpCisgICAgICAgICAgICAgICAgICAgICAgT3V0c2lkZUxvb3BQcmVkcy5wdXNoX2JhY2soQik7CisgICAgICAgICAgICAgICAgICB9KTsKKworICAgIGlmIChCQiA9PSBnZXRIZWFkZXIoKSkgeworICAgICAgYXNzZXJ0KCFPdXRzaWRlTG9vcFByZWRzLmVtcHR5KCkgJiYgIkxvb3AgaXMgdW5yZWFjaGFibGUhIik7CisgICAgfSBlbHNlIGlmICghT3V0c2lkZUxvb3BQcmVkcy5lbXB0eSgpKSB7CisgICAgICAvLyBBIG5vbi1oZWFkZXIgbG9vcCBzaG91bGRuJ3QgYmUgcmVhY2hhYmxlIGZyb20gb3V0c2lkZSB0aGUgbG9vcCwKKyAgICAgIC8vIHRob3VnaCBpdCBpcyBwZXJtaXR0ZWQgaWYgdGhlIHByZWRlY2Vzc29yIGlzIG5vdCBpdHNlbGYgYWN0dWFsbHkKKyAgICAgIC8vIHJlYWNoYWJsZS4KKyAgICAgIEJsb2NrVCAqRW50cnlCQiA9ICZCQi0+Z2V0UGFyZW50KCktPmZyb250KCk7CisgICAgICBmb3IgKEJsb2NrVCAqQ0IgOiBkZXB0aF9maXJzdChFbnRyeUJCKSkKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE91dHNpZGVMb29wUHJlZHMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgICBhc3NlcnQoQ0IgIT0gT3V0c2lkZUxvb3BQcmVkc1tpXSAmJgorICAgICAgICAgICAgICAgICAiTG9vcCBoYXMgbXVsdGlwbGUgZW50cnkgcG9pbnRzISIpOworICAgIH0KKyAgICBhc3NlcnQoQkIgIT0gJmdldEhlYWRlcigpLT5nZXRQYXJlbnQoKS0+ZnJvbnQoKSAmJgorICAgICAgICAgICAiTG9vcCBjb250YWlucyBmdW5jdGlvbiBlbnRyeSBibG9jayEiKTsKKworICAgIFZpc2l0ZWRCQnMuaW5zZXJ0KEJCKTsKKyAgfQorCisgIGlmIChWaXNpdGVkQkJzLnNpemUoKSAhPSBnZXROdW1CbG9ja3MoKSkgeworICAgIGRiZ3MoKSA8PCAiVGhlIGZvbGxvd2luZyBibG9ja3MgYXJlIHVucmVhY2hhYmxlIGluIHRoZSBsb29wOiAiOworICAgIGZvciAoYXV0byBCQiA6IEJsb2NrcykgeworICAgICAgaWYgKCFWaXNpdGVkQkJzLmNvdW50KEJCKSkgeworICAgICAgICBkYmdzKCkgPDwgKkJCIDw8ICJcbiI7CisgICAgICB9CisgICAgfQorICAgIGFzc2VydChmYWxzZSAmJiAiVW5yZWFjaGFibGUgYmxvY2sgaW4gbG9vcCIpOworICB9CisKKyAgLy8gQ2hlY2sgdGhlIHN1Ymxvb3BzLgorICBmb3IgKGl0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIC8vIEVhY2ggYmxvY2sgaW4gZWFjaCBzdWJsb29wIHNob3VsZCBiZSBjb250YWluZWQgd2l0aGluIHRoaXMgbG9vcC4KKyAgICBmb3IgKGJsb2NrX2l0ZXJhdG9yIEJJID0gKCpJKS0+YmxvY2tfYmVnaW4oKSwgQkUgPSAoKkkpLT5ibG9ja19lbmQoKTsKKyAgICAgICAgIEJJICE9IEJFOyArK0JJKSB7CisgICAgICBhc3NlcnQoY29udGFpbnMoKkJJKSAmJgorICAgICAgICAgICAgICJMb29wIGRvZXMgbm90IGNvbnRhaW4gYWxsIHRoZSBibG9ja3Mgb2YgYSBzdWJsb29wISIpOworICAgIH0KKworICAvLyBDaGVjayB0aGUgcGFyZW50IGxvb3AgcG9pbnRlci4KKyAgaWYgKFBhcmVudExvb3ApIHsKKyAgICBhc3NlcnQoaXNfY29udGFpbmVkKCpQYXJlbnRMb29wLCB0aGlzKSAmJgorICAgICAgICAgICAiTG9vcCBpcyBub3QgYSBzdWJsb29wIG9mIGl0cyBwYXJlbnQhIik7CisgIH0KKyNlbmRpZgorfQorCisvLy8gdmVyaWZ5TG9vcCAtIFZlcmlmeSBsb29wIHN0cnVjdHVyZSBvZiB0aGlzIGxvb3AgYW5kIGFsbCBuZXN0ZWQgbG9vcHMuCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBjbGFzcyBMb29wVD4KK3ZvaWQgTG9vcEJhc2U8QmxvY2tULCBMb29wVD46OnZlcmlmeUxvb3BOZXN0KAorICAgIERlbnNlU2V0PGNvbnN0IExvb3BUICo+ICpMb29wcykgY29uc3QgeworICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICBMb29wcy0+aW5zZXJ0KHN0YXRpY19jYXN0PGNvbnN0IExvb3BUICo+KHRoaXMpKTsKKyAgLy8gVmVyaWZ5IHRoaXMgbG9vcC4KKyAgdmVyaWZ5TG9vcCgpOworICAvLyBWZXJpZnkgdGhlIHN1Ymxvb3BzLgorICBmb3IgKGl0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICgqSSktPnZlcmlmeUxvb3BOZXN0KExvb3BzKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+Cit2b2lkIExvb3BCYXNlPEJsb2NrVCwgTG9vcFQ+OjpwcmludChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIERlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWZXJib3NlKSBjb25zdCB7CisgIE9TLmluZGVudChEZXB0aCAqIDIpIDw8ICJMb29wIGF0IGRlcHRoICIgPDwgZ2V0TG9vcERlcHRoKCkgPDwgIiBjb250YWluaW5nOiAiOworCisgIEJsb2NrVCAqSCA9IGdldEhlYWRlcigpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZ2V0QmxvY2tzKCkuc2l6ZSgpOyArK2kpIHsKKyAgICBCbG9ja1QgKkJCID0gZ2V0QmxvY2tzKClbaV07CisgICAgaWYgKCFWZXJib3NlKSB7CisgICAgICBpZiAoaSkKKyAgICAgICAgT1MgPDwgIiwiOworICAgICAgQkItPnByaW50QXNPcGVyYW5kKE9TLCBmYWxzZSk7CisgICAgfSBlbHNlCisgICAgICBPUyA8PCAiXG4iOworCisgICAgaWYgKEJCID09IEgpCisgICAgICBPUyA8PCAiPGhlYWRlcj4iOworICAgIGlmIChpc0xvb3BMYXRjaChCQikpCisgICAgICBPUyA8PCAiPGxhdGNoPiI7CisgICAgaWYgKGlzTG9vcEV4aXRpbmcoQkIpKQorICAgICAgT1MgPDwgIjxleGl0aW5nPiI7CisgICAgaWYgKFZlcmJvc2UpCisgICAgICBCQi0+cHJpbnQoT1MpOworICB9CisgIE9TIDw8ICJcbiI7CisKKyAgZm9yIChpdGVyYXRvciBJID0gYmVnaW4oKSwgRSA9IGVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAoKkkpLT5wcmludChPUywgRGVwdGggKyAyKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBTdGFibGUgTG9vcEluZm8gQW5hbHlzaXMgLSBCdWlsZCBhIGxvb3AgdHJlZSB1c2luZyBzdGFibGUgaXRlcmF0b3JzIHNvIHRoZQorLy8vIHJlc3VsdCBkb2VzIC8gbm90IGRlcGVuZCBvbiB1c2UgbGlzdCAoYmxvY2sgcHJlZGVjZXNzb3IpIG9yZGVyLgorLy8vCisKKy8vLyBEaXNjb3ZlciBhIHN1Ymxvb3Agd2l0aCB0aGUgc3BlY2lmaWVkIGJhY2tlZGdlcyBzdWNoIHRoYXQ6IEFsbCBibG9ja3Mgd2l0aGluCisvLy8gdGhpcyBsb29wIGFyZSBtYXBwZWQgdG8gdGhpcyBsb29wIG9yIGEgc3VibG9vcC4gQW5kIGFsbCBzdWJsb29wcyB3aXRoaW4gdGhpcworLy8vIGxvb3AgaGF2ZSB0aGVpciBwYXJlbnQgbG9vcCBzZXQgdG8gdGhpcyBsb29wIG9yIGEgc3VibG9vcC4KK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgorc3RhdGljIHZvaWQgZGlzY292ZXJBbmRNYXBTdWJsb29wKExvb3BUICpMLCBBcnJheVJlZjxCbG9ja1QgKj4gQmFja2VkZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BJbmZvQmFzZTxCbG9ja1QsIExvb3BUPiAqTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9tVHJlZUJhc2U8QmxvY2tUPiAmRG9tVHJlZSkgeworICB0eXBlZGVmIEdyYXBoVHJhaXRzPEludmVyc2U8QmxvY2tUICo+PiBJbnZCbG9ja1RyYWl0czsKKworICB1bnNpZ25lZCBOdW1CbG9ja3MgPSAwOworICB1bnNpZ25lZCBOdW1TdWJsb29wcyA9IDA7CisKKyAgLy8gUGVyZm9ybSBhIGJhY2t3YXJkIENGRyB0cmF2ZXJzYWwgdXNpbmcgYSB3b3JrbGlzdC4KKyAgc3RkOjp2ZWN0b3I8QmxvY2tUICo+IFJldmVyc2VDRkdXb3JrbGlzdChCYWNrZWRnZXMuYmVnaW4oKSwgQmFja2VkZ2VzLmVuZCgpKTsKKyAgd2hpbGUgKCFSZXZlcnNlQ0ZHV29ya2xpc3QuZW1wdHkoKSkgeworICAgIEJsb2NrVCAqUHJlZEJCID0gUmV2ZXJzZUNGR1dvcmtsaXN0LmJhY2soKTsKKyAgICBSZXZlcnNlQ0ZHV29ya2xpc3QucG9wX2JhY2soKTsKKworICAgIExvb3BUICpTdWJsb29wID0gTEktPmdldExvb3BGb3IoUHJlZEJCKTsKKyAgICBpZiAoIVN1Ymxvb3ApIHsKKyAgICAgIGlmICghRG9tVHJlZS5pc1JlYWNoYWJsZUZyb21FbnRyeShQcmVkQkIpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLy8gVGhpcyBpcyBhbiB1bmRpc2NvdmVyZWQgYmxvY2suIE1hcCBpdCB0byB0aGUgY3VycmVudCBsb29wLgorICAgICAgTEktPmNoYW5nZUxvb3BGb3IoUHJlZEJCLCBMKTsKKyAgICAgICsrTnVtQmxvY2tzOworICAgICAgaWYgKFByZWRCQiA9PSBMLT5nZXRIZWFkZXIoKSkKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBQdXNoIGFsbCBibG9jayBwcmVkZWNlc3NvcnMgb24gdGhlIHdvcmtsaXN0LgorICAgICAgUmV2ZXJzZUNGR1dvcmtsaXN0Lmluc2VydChSZXZlcnNlQ0ZHV29ya2xpc3QuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludkJsb2NrVHJhaXRzOjpjaGlsZF9iZWdpbihQcmVkQkIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKFByZWRCQikpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGlzIGlzIGEgZGlzY292ZXJlZCBibG9jay4gRmluZCBpdHMgb3V0ZXJtb3N0IGRpc2NvdmVyZWQgbG9vcC4KKyAgICAgIHdoaWxlIChMb29wVCAqUGFyZW50ID0gU3VibG9vcC0+Z2V0UGFyZW50TG9vcCgpKQorICAgICAgICBTdWJsb29wID0gUGFyZW50OworCisgICAgICAvLyBJZiBpdCBpcyBhbHJlYWR5IGRpc2NvdmVyZWQgdG8gYmUgYSBzdWJsb29wIG9mIHRoaXMgbG9vcCwgY29udGludWUuCisgICAgICBpZiAoU3VibG9vcCA9PSBMKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLy8gRGlzY292ZXIgYSBzdWJsb29wIG9mIHRoaXMgbG9vcC4KKyAgICAgIFN1Ymxvb3AtPnNldFBhcmVudExvb3AoTCk7CisgICAgICArK051bVN1Ymxvb3BzOworICAgICAgTnVtQmxvY2tzICs9IFN1Ymxvb3AtPmdldEJsb2Nrc1ZlY3RvcigpLmNhcGFjaXR5KCk7CisgICAgICBQcmVkQkIgPSBTdWJsb29wLT5nZXRIZWFkZXIoKTsKKyAgICAgIC8vIENvbnRpbnVlIHRyYXZlcnNhbCBhbG9uZyBwcmVkZWNlc3NvcnMgdGhhdCBhcmUgbm90IGxvb3AtYmFjayBlZGdlcyBmcm9tCisgICAgICAvLyB3aXRoaW4gdGhpcyBzdWJsb29wIHRyZWUgaXRzZWxmLiBOb3RlIHRoYXQgYSBwcmVkZWNlc3NvciBtYXkgZGlyZWN0bHkKKyAgICAgIC8vIHJlYWNoIGFub3RoZXIgc3VibG9vcCB0aGF0IGlzIG5vdCB5ZXQgZGlzY292ZXJlZCB0byBiZSBhIHN1Ymxvb3Agb2YKKyAgICAgIC8vIHRoaXMgbG9vcCwgd2hpY2ggd2UgbXVzdCB0cmF2ZXJzZS4KKyAgICAgIGZvciAoY29uc3QgYXV0byBQcmVkIDogY2hpbGRyZW48SW52ZXJzZTxCbG9ja1QgKj4+KFByZWRCQikpIHsKKyAgICAgICAgaWYgKExJLT5nZXRMb29wRm9yKFByZWQpICE9IFN1Ymxvb3ApCisgICAgICAgICAgUmV2ZXJzZUNGR1dvcmtsaXN0LnB1c2hfYmFjayhQcmVkKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgTC0+Z2V0U3ViTG9vcHNWZWN0b3IoKS5yZXNlcnZlKE51bVN1Ymxvb3BzKTsKKyAgTC0+cmVzZXJ2ZUJsb2NrcyhOdW1CbG9ja3MpOworfQorCisvLy8gUG9wdWxhdGUgYWxsIGxvb3AgZGF0YSBpbiBhIHN0YWJsZSBvcmRlciBkdXJpbmcgYSBzaW5nbGUgZm9yd2FyZCBERlMuCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBjbGFzcyBMb29wVD4gY2xhc3MgUG9wdWxhdGVMb29wc0RGUyB7CisgIHR5cGVkZWYgR3JhcGhUcmFpdHM8QmxvY2tUICo+IEJsb2NrVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIEJsb2NrVHJhaXRzOjpDaGlsZEl0ZXJhdG9yVHlwZSBTdWNjSXRlclR5OworCisgIExvb3BJbmZvQmFzZTxCbG9ja1QsIExvb3BUPiAqTEk7CisKK3B1YmxpYzoKKyAgUG9wdWxhdGVMb29wc0RGUyhMb29wSW5mb0Jhc2U8QmxvY2tULCBMb29wVD4gKmxpKSA6IExJKGxpKSB7fQorCisgIHZvaWQgdHJhdmVyc2UoQmxvY2tUICpFbnRyeUJsb2NrKTsKKworcHJvdGVjdGVkOgorICB2b2lkIGluc2VydEludG9Mb29wKEJsb2NrVCAqQmxvY2spOworfTsKKworLy8vIFRvcC1sZXZlbCBkcml2ZXIgZm9yIHRoZSBmb3J3YXJkIERGUyB3aXRoaW4gdGhlIGxvb3AuCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBjbGFzcyBMb29wVD4KK3ZvaWQgUG9wdWxhdGVMb29wc0RGUzxCbG9ja1QsIExvb3BUPjo6dHJhdmVyc2UoQmxvY2tUICpFbnRyeUJsb2NrKSB7CisgIGZvciAoQmxvY2tUICpCQiA6IHBvc3Rfb3JkZXIoRW50cnlCbG9jaykpCisgICAgaW5zZXJ0SW50b0xvb3AoQkIpOworfQorCisvLy8gQWRkIGEgc2luZ2xlIEJsb2NrIHRvIGl0cyBhbmNlc3RvciBsb29wcyBpbiBQb3N0T3JkZXIuIElmIHRoZSBibG9jayBpcyBhCisvLy8gc3VibG9vcCBoZWFkZXIsIGFkZCB0aGUgc3VibG9vcCB0byBpdHMgcGFyZW50IGluIFBvc3RPcmRlciwgdGhlbiByZXZlcnNlIHRoZQorLy8vIEJsb2NrIGFuZCBTdWJsb29wIHZlY3RvcnMgb2YgdGhlIG5vdyBjb21wbGV0ZSBzdWJsb29wIHRvIGFjaGlldmUgUlBPLgordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+Cit2b2lkIFBvcHVsYXRlTG9vcHNERlM8QmxvY2tULCBMb29wVD46Omluc2VydEludG9Mb29wKEJsb2NrVCAqQmxvY2spIHsKKyAgTG9vcFQgKlN1Ymxvb3AgPSBMSS0+Z2V0TG9vcEZvcihCbG9jayk7CisgIGlmIChTdWJsb29wICYmIEJsb2NrID09IFN1Ymxvb3AtPmdldEhlYWRlcigpKSB7CisgICAgLy8gV2UgcmVhY2ggdGhpcyBwb2ludCBvbmNlIHBlciBzdWJsb29wIGFmdGVyIHByb2Nlc3NpbmcgYWxsIHRoZSBibG9ja3MgaW4KKyAgICAvLyB0aGUgc3VibG9vcC4KKyAgICBpZiAoU3VibG9vcC0+Z2V0UGFyZW50TG9vcCgpKQorICAgICAgU3VibG9vcC0+Z2V0UGFyZW50TG9vcCgpLT5nZXRTdWJMb29wc1ZlY3RvcigpLnB1c2hfYmFjayhTdWJsb29wKTsKKyAgICBlbHNlCisgICAgICBMSS0+YWRkVG9wTGV2ZWxMb29wKFN1Ymxvb3ApOworCisgICAgLy8gRm9yIGNvbnZlbmllbmNlLCBCbG9ja3MgYW5kIFN1Ymxvb3BzIGFyZSBpbnNlcnRlZCBpbiBwb3N0b3JkZXIuIFJldmVyc2UKKyAgICAvLyB0aGUgbGlzdHMsIGV4Y2VwdCBmb3IgdGhlIGxvb3AgaGVhZGVyLCB3aGljaCBpcyBhbHdheXMgYXQgdGhlIGJlZ2lubmluZy4KKyAgICBTdWJsb29wLT5yZXZlcnNlQmxvY2soMSk7CisgICAgc3RkOjpyZXZlcnNlKFN1Ymxvb3AtPmdldFN1Ykxvb3BzVmVjdG9yKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgU3VibG9vcC0+Z2V0U3ViTG9vcHNWZWN0b3IoKS5lbmQoKSk7CisKKyAgICBTdWJsb29wID0gU3VibG9vcC0+Z2V0UGFyZW50TG9vcCgpOworICB9CisgIGZvciAoOyBTdWJsb29wOyBTdWJsb29wID0gU3VibG9vcC0+Z2V0UGFyZW50TG9vcCgpKQorICAgIFN1Ymxvb3AtPmFkZEJsb2NrRW50cnkoQmxvY2spOworfQorCisvLy8gQW5hbHl6ZSBMb29wSW5mbyBkaXNjb3ZlcnMgbG9vcHMgZHVyaW5nIGEgcG9zdG9yZGVyIERvbWluYXRvclRyZWUgdHJhdmVyc2FsCisvLy8gaW50ZXJsZWF2ZWQgd2l0aCBiYWNrd2FyZCBDRkcgdHJhdmVyc2FscyB3aXRoaW4gZWFjaCBzdWJsb29wCisvLy8gKGRpc2NvdmVyQW5kTWFwU3VibG9vcCkuIFRoZSBiYWNrd2FyZCB0cmF2ZXJzYWwgc2tpcHMgaW5uZXIgc3VibG9vcHMsIHNvCisvLy8gdGhpcyBwYXJ0IG9mIHRoZSBhbGdvcml0aG0gaXMgbGluZWFyIGluIHRoZSBudW1iZXIgb2YgQ0ZHIGVkZ2VzLiBTdWJsb29wIGFuZAorLy8vIEJsb2NrIHZlY3RvcnMgYXJlIHRoZW4gcG9wdWxhdGVkIGR1cmluZyBhIHNpbmdsZSBmb3J3YXJkIENGRyB0cmF2ZXJzYWwKKy8vLyAoUG9wdWxhdGVMb29wREZTKS4KKy8vLworLy8vIER1cmluZyB0aGUgdHdvIENGRyB0cmF2ZXJzYWxzIGVhY2ggYmxvY2sgaXMgc2VlbiB0aHJlZSB0aW1lczoKKy8vLyAxKSBEaXNjb3ZlcmVkIGFuZCBtYXBwZWQgYnkgYSByZXZlcnNlIENGRyB0cmF2ZXJzYWwuCisvLy8gMikgVmlzaXRlZCBkdXJpbmcgYSBmb3J3YXJkIERGUyBDRkcgdHJhdmVyc2FsLgorLy8vIDMpIFJldmVyc2UtaW5zZXJ0ZWQgaW4gdGhlIGxvb3AgaW4gcG9zdG9yZGVyIGZvbGxvd2luZyBmb3J3YXJkIERGUy4KKy8vLworLy8vIFRoZSBCbG9jayB2ZWN0b3JzIGFyZSBpbmNsdXNpdmUsIHNvIHN0ZXAgMyByZXF1aXJlcyBsb29wLWRlcHRoIG51bWJlciBvZgorLy8vIGluc2VydGlvbnMgcGVyIGJsb2NrLgordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+Cit2b2lkIExvb3BJbmZvQmFzZTxCbG9ja1QsIExvb3BUPjo6YW5hbHl6ZShjb25zdCBEb21UcmVlQmFzZTxCbG9ja1Q+ICZEb21UcmVlKSB7CisgIC8vIFBvc3RvcmRlciB0cmF2ZXJzYWwgb2YgdGhlIGRvbWluYXRvciB0cmVlLgorICBjb25zdCBEb21UcmVlTm9kZUJhc2U8QmxvY2tUPiAqRG9tUm9vdCA9IERvbVRyZWUuZ2V0Um9vdE5vZGUoKTsKKyAgZm9yIChhdXRvIERvbU5vZGUgOiBwb3N0X29yZGVyKERvbVJvb3QpKSB7CisKKyAgICBCbG9ja1QgKkhlYWRlciA9IERvbU5vZGUtPmdldEJsb2NrKCk7CisgICAgU21hbGxWZWN0b3I8QmxvY2tUICosIDQ+IEJhY2tlZGdlczsKKworICAgIC8vIENoZWNrIGVhY2ggcHJlZGVjZXNzb3Igb2YgdGhlIHBvdGVudGlhbCBsb29wIGhlYWRlci4KKyAgICBmb3IgKGNvbnN0IGF1dG8gQmFja2VkZ2UgOiBjaGlsZHJlbjxJbnZlcnNlPEJsb2NrVCAqPj4oSGVhZGVyKSkgeworICAgICAgLy8gSWYgSGVhZGVyIGRvbWluYXRlcyBwcmVkQkIsIHRoaXMgaXMgYSBuZXcgbG9vcC4gQ29sbGVjdCB0aGUgYmFja2VkZ2VzLgorICAgICAgaWYgKERvbVRyZWUuZG9taW5hdGVzKEhlYWRlciwgQmFja2VkZ2UpICYmCisgICAgICAgICAgRG9tVHJlZS5pc1JlYWNoYWJsZUZyb21FbnRyeShCYWNrZWRnZSkpIHsKKyAgICAgICAgQmFja2VkZ2VzLnB1c2hfYmFjayhCYWNrZWRnZSk7CisgICAgICB9CisgICAgfQorICAgIC8vIFBlcmZvcm0gYSBiYWNrd2FyZCBDRkcgdHJhdmVyc2FsIHRvIGRpc2NvdmVyIGFuZCBtYXAgYmxvY2tzIGluIHRoaXMgbG9vcC4KKyAgICBpZiAoIUJhY2tlZGdlcy5lbXB0eSgpKSB7CisgICAgICBMb29wVCAqTCA9IEFsbG9jYXRlTG9vcChIZWFkZXIpOworICAgICAgZGlzY292ZXJBbmRNYXBTdWJsb29wKEwsIEFycmF5UmVmPEJsb2NrVCAqPihCYWNrZWRnZXMpLCB0aGlzLCBEb21UcmVlKTsKKyAgICB9CisgIH0KKyAgLy8gUGVyZm9ybSBhIHNpbmdsZSBmb3J3YXJkIENGRyB0cmF2ZXJzYWwgdG8gcG9wdWxhdGUgYmxvY2sgYW5kIHN1Ymxvb3AKKyAgLy8gdmVjdG9ycyBmb3IgYWxsIGxvb3BzLgorICBQb3B1bGF0ZUxvb3BzREZTPEJsb2NrVCwgTG9vcFQ+IERGUyh0aGlzKTsKKyAgREZTLnRyYXZlcnNlKERvbVJvb3QtPmdldEJsb2NrKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBjbGFzcyBMb29wVD4KK1NtYWxsVmVjdG9yPExvb3BUICosIDQ+IExvb3BJbmZvQmFzZTxCbG9ja1QsIExvb3BUPjo6Z2V0TG9vcHNJblByZW9yZGVyKCkgeworICBTbWFsbFZlY3RvcjxMb29wVCAqLCA0PiBQcmVPcmRlckxvb3BzLCBQcmVPcmRlcldvcmtsaXN0OworICAvLyBUaGUgb3V0ZXItbW9zdCBsb29wIGFjdHVhbGx5IGdvZXMgaW50byB0aGUgcmVzdWx0IGluIHRoZSBzYW1lIHJlbGF0aXZlCisgIC8vIG9yZGVyIGFzIHdlIHdhbGsgaXQuIEJ1dCBMb29wSW5mbyBzdG9yZXMgdGhlIHRvcCBsZXZlbCBsb29wcyBpbiByZXZlcnNlCisgIC8vIHByb2dyYW0gb3JkZXIgc28gZm9yIGhlcmUgd2UgcmV2ZXJzZSBpdCB0byBnZXQgZm9yd2FyZCBwcm9ncmFtIG9yZGVyLgorICAvLyBGSVhNRTogSWYgd2UgY2hhbmdlIHRoZSBvcmRlciBvZiBMb29wSW5mbyB3ZSB3aWxsIHdhbnQgdG8gcmVtb3ZlIHRoZQorICAvLyByZXZlcnNlIGhlcmUuCisgIGZvciAoTG9vcFQgKlJvb3RMIDogcmV2ZXJzZSgqdGhpcykpIHsKKyAgICBhc3NlcnQoUHJlT3JkZXJXb3JrbGlzdC5lbXB0eSgpICYmCisgICAgICAgICAgICJNdXN0IHN0YXJ0IHdpdGggYW4gZW1wdHkgcHJlb3JkZXIgd2FsayB3b3JrbGlzdC4iKTsKKyAgICBQcmVPcmRlcldvcmtsaXN0LnB1c2hfYmFjayhSb290TCk7CisgICAgZG8geworICAgICAgTG9vcFQgKkwgPSBQcmVPcmRlcldvcmtsaXN0LnBvcF9iYWNrX3ZhbCgpOworICAgICAgLy8gU3ViLWxvb3BzIGFyZSBzdG9yZWQgaW4gZm9yd2FyZCBwcm9ncmFtIG9yZGVyLCBidXQgd2lsbCBwcm9jZXNzIHRoZQorICAgICAgLy8gd29ya2xpc3QgYmFja3dhcmRzIHNvIGFwcGVuZCB0aGVtIGluIHJldmVyc2Ugb3JkZXIuCisgICAgICBQcmVPcmRlcldvcmtsaXN0LmFwcGVuZChMLT5yYmVnaW4oKSwgTC0+cmVuZCgpKTsKKyAgICAgIFByZU9yZGVyTG9vcHMucHVzaF9iYWNrKEwpOworICAgIH0gd2hpbGUgKCFQcmVPcmRlcldvcmtsaXN0LmVtcHR5KCkpOworICB9CisKKyAgcmV0dXJuIFByZU9yZGVyTG9vcHM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgorU21hbGxWZWN0b3I8TG9vcFQgKiwgND4KK0xvb3BJbmZvQmFzZTxCbG9ja1QsIExvb3BUPjo6Z2V0TG9vcHNJblJldmVyc2VTaWJsaW5nUHJlb3JkZXIoKSB7CisgIFNtYWxsVmVjdG9yPExvb3BUICosIDQ+IFByZU9yZGVyTG9vcHMsIFByZU9yZGVyV29ya2xpc3Q7CisgIC8vIFRoZSBvdXRlci1tb3N0IGxvb3AgYWN0dWFsbHkgZ29lcyBpbnRvIHRoZSByZXN1bHQgaW4gdGhlIHNhbWUgcmVsYXRpdmUKKyAgLy8gb3JkZXIgYXMgd2Ugd2FsayBpdC4gTG9vcEluZm8gc3RvcmVzIHRoZSB0b3AgbGV2ZWwgbG9vcHMgaW4gcmV2ZXJzZQorICAvLyBwcm9ncmFtIG9yZGVyIHNvIHdlIHdhbGsgaW4gb3JkZXIgaGVyZS4KKyAgLy8gRklYTUU6IElmIHdlIGNoYW5nZSB0aGUgb3JkZXIgb2YgTG9vcEluZm8gd2Ugd2lsbCB3YW50IHRvIGFkZCBhIHJldmVyc2UKKyAgLy8gaGVyZS4KKyAgZm9yIChMb29wVCAqUm9vdEwgOiAqdGhpcykgeworICAgIGFzc2VydChQcmVPcmRlcldvcmtsaXN0LmVtcHR5KCkgJiYKKyAgICAgICAgICAgIk11c3Qgc3RhcnQgd2l0aCBhbiBlbXB0eSBwcmVvcmRlciB3YWxrIHdvcmtsaXN0LiIpOworICAgIFByZU9yZGVyV29ya2xpc3QucHVzaF9iYWNrKFJvb3RMKTsKKyAgICBkbyB7CisgICAgICBMb29wVCAqTCA9IFByZU9yZGVyV29ya2xpc3QucG9wX2JhY2tfdmFsKCk7CisgICAgICAvLyBTdWItbG9vcHMgYXJlIHN0b3JlZCBpbiBmb3J3YXJkIHByb2dyYW0gb3JkZXIsIGJ1dCB3aWxsIHByb2Nlc3MgdGhlCisgICAgICAvLyB3b3JrbGlzdCBiYWNrd2FyZHMgc28gd2UgY2FuIGp1c3QgYXBwZW5kIHRoZW0gaW4gb3JkZXIuCisgICAgICBQcmVPcmRlcldvcmtsaXN0LmFwcGVuZChMLT5iZWdpbigpLCBMLT5lbmQoKSk7CisgICAgICBQcmVPcmRlckxvb3BzLnB1c2hfYmFjayhMKTsKKyAgICB9IHdoaWxlICghUHJlT3JkZXJXb3JrbGlzdC5lbXB0eSgpKTsKKyAgfQorCisgIHJldHVybiBQcmVPcmRlckxvb3BzOworfQorCisvLyBEZWJ1Z2dpbmcKK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgordm9pZCBMb29wSW5mb0Jhc2U8QmxvY2tULCBMb29wVD46OnByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgVG9wTGV2ZWxMb29wcy5zaXplKCk7ICsraSkKKyAgICBUb3BMZXZlbExvb3BzW2ldLT5wcmludChPUyk7CisjaWYgMAorICBmb3IgKERlbnNlTWFwPEJhc2ljQmxvY2sqLCBMb29wVCo+Ojpjb25zdF9pdGVyYXRvciBJID0gQkJNYXAuYmVnaW4oKSwKKyAgICAgICAgIEUgPSBCQk1hcC5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgT1MgPDwgIkJCICciIDw8IEktPmZpcnN0LT5nZXROYW1lKCkgPDwgIicgbGV2ZWwgPSAiCisgICAgICAgPDwgSS0+c2Vjb25kLT5nZXRMb29wRGVwdGgoKSA8PCAiXG4iOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBjb21wYXJlVmVjdG9ycyhzdGQ6OnZlY3RvcjxUPiAmQkIxLCBzdGQ6OnZlY3RvcjxUPiAmQkIyKSB7CisgIHN0ZDo6c29ydChCQjEuYmVnaW4oKSwgQkIxLmVuZCgpKTsKKyAgc3RkOjpzb3J0KEJCMi5iZWdpbigpLCBCQjIuZW5kKCkpOworICByZXR1cm4gQkIxID09IEJCMjsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+Cit2b2lkIGFkZElubmVyTG9vcHNUb0hlYWRlcnNNYXAoRGVuc2VNYXA8QmxvY2tUICosIGNvbnN0IExvb3BUICo+ICZMb29wSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wSW5mb0Jhc2U8QmxvY2tULCBMb29wVD4gJkxJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3BUICZMKSB7CisgIExvb3BIZWFkZXJzW0wuZ2V0SGVhZGVyKCldID0gJkw7CisgIGZvciAoTG9vcFQgKlNMIDogTCkKKyAgICBhZGRJbm5lckxvb3BzVG9IZWFkZXJzTWFwKExvb3BIZWFkZXJzLCBMSSwgKlNMKTsKK30KKworI2lmbmRlZiBOREVCVUcKK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgorc3RhdGljIHZvaWQgY29tcGFyZUxvb3BzKGNvbnN0IExvb3BUICpMLCBjb25zdCBMb29wVCAqT3RoZXJMLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPEJsb2NrVCAqLCBjb25zdCBMb29wVCAqPiAmT3RoZXJMb29wSGVhZGVycykgeworICBCbG9ja1QgKkggPSBMLT5nZXRIZWFkZXIoKTsKKyAgQmxvY2tUICpPdGhlckggPSBPdGhlckwtPmdldEhlYWRlcigpOworICBhc3NlcnQoSCA9PSBPdGhlckggJiYKKyAgICAgICAgICJNaXNtYXRjaGVkIGhlYWRlcnMgZXZlbiB0aG91Z2ggZm91bmQgaW4gdGhlIHNhbWUgbWFwIGVudHJ5ISIpOworCisgIGFzc2VydChMLT5nZXRMb29wRGVwdGgoKSA9PSBPdGhlckwtPmdldExvb3BEZXB0aCgpICYmCisgICAgICAgICAiTWlzbWF0Y2hlZCBsb29wIGRlcHRoISIpOworICBjb25zdCBMb29wVCAqUGFyZW50TCA9IEwsICpPdGhlclBhcmVudEwgPSBPdGhlckw7CisgIGRvIHsKKyAgICBhc3NlcnQoUGFyZW50TC0+Z2V0SGVhZGVyKCkgPT0gT3RoZXJQYXJlbnRMLT5nZXRIZWFkZXIoKSAmJgorICAgICAgICAgICAiTWlzbWF0Y2hlZCBwYXJlbnQgbG9vcCBoZWFkZXJzISIpOworICAgIFBhcmVudEwgPSBQYXJlbnRMLT5nZXRQYXJlbnRMb29wKCk7CisgICAgT3RoZXJQYXJlbnRMID0gT3RoZXJQYXJlbnRMLT5nZXRQYXJlbnRMb29wKCk7CisgIH0gd2hpbGUgKFBhcmVudEwpOworCisgIGZvciAoY29uc3QgTG9vcFQgKlN1YkwgOiAqTCkgeworICAgIEJsb2NrVCAqU3ViSCA9IFN1YkwtPmdldEhlYWRlcigpOworICAgIGNvbnN0IExvb3BUICpPdGhlclN1YkwgPSBPdGhlckxvb3BIZWFkZXJzLmxvb2t1cChTdWJIKTsKKyAgICBhc3NlcnQoT3RoZXJTdWJMICYmICJJbm5lciBsb29wIGlzIG1pc3NpbmcgaW4gY29tcHV0ZWQgbG9vcCBpbmZvISIpOworICAgIE90aGVyTG9vcEhlYWRlcnMuZXJhc2UoU3ViSCk7CisgICAgY29tcGFyZUxvb3BzKFN1YkwsIE90aGVyU3ViTCwgT3RoZXJMb29wSGVhZGVycyk7CisgIH0KKworICBzdGQ6OnZlY3RvcjxCbG9ja1QgKj4gQkJzID0gTC0+Z2V0QmxvY2tzKCk7CisgIHN0ZDo6dmVjdG9yPEJsb2NrVCAqPiBPdGhlckJCcyA9IE90aGVyTC0+Z2V0QmxvY2tzKCk7CisgIGFzc2VydChjb21wYXJlVmVjdG9ycyhCQnMsIE90aGVyQkJzKSAmJgorICAgICAgICAgIk1pc21hdGNoZWQgYmFzaWMgYmxvY2tzIGluIHRoZSBsb29wcyEiKTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBjbGFzcyBMb29wVD4KK3ZvaWQgTG9vcEluZm9CYXNlPEJsb2NrVCwgTG9vcFQ+Ojp2ZXJpZnkoCisgICAgY29uc3QgRG9tVHJlZUJhc2U8QmxvY2tUPiAmRG9tVHJlZSkgY29uc3QgeworICBEZW5zZVNldDxjb25zdCBMb29wVCAqPiBMb29wczsKKyAgZm9yIChpdGVyYXRvciBJID0gYmVnaW4oKSwgRSA9IGVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGFzc2VydCghKCpJKS0+Z2V0UGFyZW50TG9vcCgpICYmICJUb3AtbGV2ZWwgbG9vcCBoYXMgYSBwYXJlbnQhIik7CisgICAgKCpJKS0+dmVyaWZ5TG9vcE5lc3QoJkxvb3BzKTsKKyAgfQorCisvLyBWZXJpZnkgdGhhdCBibG9ja3MgYXJlIG1hcHBlZCB0byB2YWxpZCBsb29wcy4KKyNpZm5kZWYgTkRFQlVHCisgIGZvciAoYXV0byAmRW50cnkgOiBCQk1hcCkgeworICAgIGNvbnN0IEJsb2NrVCAqQkIgPSBFbnRyeS5maXJzdDsKKyAgICBMb29wVCAqTCA9IEVudHJ5LnNlY29uZDsKKyAgICBhc3NlcnQoTG9vcHMuY291bnQoTCkgJiYgIm9ycGhhbmVkIGxvb3AiKTsKKyAgICBhc3NlcnQoTC0+Y29udGFpbnMoQkIpICYmICJvcnBoYW5lZCBibG9jayIpOworICB9CisKKyAgLy8gUmVjb21wdXRlIExvb3BJbmZvIHRvIHZlcmlmeSBsb29wcyBzdHJ1Y3R1cmUuCisgIExvb3BJbmZvQmFzZTxCbG9ja1QsIExvb3BUPiBPdGhlckxJOworICBPdGhlckxJLmFuYWx5emUoRG9tVHJlZSk7CisKKyAgLy8gQnVpbGQgYSBtYXAgd2UgY2FuIHVzZSB0byBtb3ZlIGZyb20gb3VyIExJIHRvIHRoZSBjb21wdXRlZCBvbmUuIFRoaXMKKyAgLy8gYWxsb3dzIHVzIHRvIGlnbm9yZSB0aGUgcGFydGljdWxhciBvcmRlciBpbiBhbnkgbGF5ZXIgb2YgdGhlIGxvb3AgZm9yZXN0CisgIC8vIHdoaWxlIHN0aWxsIGNvbXBhcmluZyB0aGUgc3RydWN0dXJlLgorICBEZW5zZU1hcDxCbG9ja1QgKiwgY29uc3QgTG9vcFQgKj4gT3RoZXJMb29wSGVhZGVyczsKKyAgZm9yIChMb29wVCAqTCA6IE90aGVyTEkpCisgICAgYWRkSW5uZXJMb29wc1RvSGVhZGVyc01hcChPdGhlckxvb3BIZWFkZXJzLCBPdGhlckxJLCAqTCk7CisKKyAgLy8gV2FsayB0aGUgdG9wIGxldmVsIGxvb3BzIGFuZCBlbnN1cmUgdGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIHRvcC1sZXZlbAorICAvLyBsb29wIGluIHRoZSBjb21wdXRlZCB2ZXJzaW9uIGFuZCB0aGVuIHJlY3Vyc2l2ZWx5IGNvbXBhcmUgdGhvc2UgbG9vcAorICAvLyBuZXN0cy4KKyAgZm9yIChMb29wVCAqTCA6ICp0aGlzKSB7CisgICAgQmxvY2tUICpIZWFkZXIgPSBMLT5nZXRIZWFkZXIoKTsKKyAgICBjb25zdCBMb29wVCAqT3RoZXJMID0gT3RoZXJMb29wSGVhZGVycy5sb29rdXAoSGVhZGVyKTsKKyAgICBhc3NlcnQoT3RoZXJMICYmICJUb3AgbGV2ZWwgbG9vcCBpcyBtaXNzaW5nIGluIGNvbXB1dGVkIGxvb3AgaW5mbyEiKTsKKyAgICAvLyBOb3cgdGhhdCB3ZSd2ZSBtYXRjaGVkIHRoaXMgbG9vcCwgZXJhc2UgaXRzIGhlYWRlciBmcm9tIHRoZSBtYXAuCisgICAgT3RoZXJMb29wSGVhZGVycy5lcmFzZShIZWFkZXIpOworICAgIC8vIEFuZCByZWN1cnNpdmVseSBjb21wYXJlIHRoZXNlIGxvb3BzLgorICAgIGNvbXBhcmVMb29wcyhMLCBPdGhlckwsIE90aGVyTG9vcEhlYWRlcnMpOworICB9CisKKyAgLy8gQW55IHJlbWFpbmluZyBlbnRyaWVzIGluIHRoZSBtYXAgYXJlIGxvb3BzIHdoaWNoIHdlcmUgZm91bmQgd2hlbiBjb21wdXRpbmcKKyAgLy8gYSBmcmVzaCBMb29wSW5mbyBidXQgbm90IHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgb25lLgorICBpZiAoIU90aGVyTG9vcEhlYWRlcnMuZW1wdHkoKSkgeworICAgIGZvciAoY29uc3QgYXV0byAmSGVhZGVyQW5kTG9vcCA6IE90aGVyTG9vcEhlYWRlcnMpCisgICAgICBkYmdzKCkgPDwgIkZvdW5kIG5ldyBsb29wOiAiIDw8ICpIZWFkZXJBbmRMb29wLnNlY29uZCA8PCAiXG4iOworICAgIGxsdm1fdW5yZWFjaGFibGUoIkZvdW5kIG5ldyBsb29wcyB3aGVuIHJlY29tcHV0aW5nIExvb3BJbmZvISIpOworICB9CisjZW5kaWYKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BJdGVyYXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb29wSXRlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWM1NGIyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb29wSXRlcmF0b3IuaApAQCAtMCwwICsxLDI2MCBAQAorLy89PT0tLS0tLS0tLS0gTG9vcEl0ZXJhdG9yLmggLSBJdGVyYXRlIG92ZXIgbG9vcCBibG9ja3MgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGl0ZXJhdG9ycyB0byB2aXNpdCB0aGUgYmFzaWMgYmxvY2tzIHdpdGhpbiBhIGxvb3AuCisvLworLy8gVGhlc2UgaXRlcmF0b3JzIGN1cnJlbnRseSB2aXNpdCBibG9ja3Mgd2l0aGluIHN1Ymxvb3BzIGFzIHdlbGwuCisvLyBVbmZvcnR1bmF0ZWx5IHdlIGhhdmUgbm8gZWZmaWNpZW50IHdheSBvZiBzdW1tYXJpemluZyBsb29wIGV4aXRzIHdoaWNoIHdvdWxkCisvLyBhbGxvdyBza2lwcGluZyBzdWJsb29wcyBkdXJpbmcgdHJhdmVyc2FsLgorLy8KKy8vIElmIHlvdSB3YW50IHRvIHZpc2l0IGFsbCBibG9ja3MgaW4gYSBsb29wIGFuZCBkb24ndCBuZWVkIGFuIG9yZGVyZWQgdHJhdmVyYWwsCisvLyB1c2UgTG9vcDo6YmxvY2tfYmVnaW4oKSBpbnN0ZWFkLgorLy8KKy8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBkZXNpZ25lZCB0byB3b3JrIHdpdGggaWxsLWZvcm1lZCBsb29wcyBpbiB3aGljaCB0aGUKKy8vIGJhY2tlZGdlIGhhcyBiZWVuIGRlbGV0ZWQuIFRoZSBvbmx5IHByZXJlcXVpc2l0ZSBpcyB0aGF0IGFsbCBibG9ja3MKKy8vIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGxvb3AgYWNjb3JkaW5nIHRvIHRoZSBtb3N0IHJlY2VudCBMb29wSW5mbyBhbmFseXNpcyBhcmUKKy8vIHJlYWNoYWJsZSBmcm9tIHRoZSBsb29wIGhlYWRlci4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19MT09QSVRFUkFUT1JfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0xPT1BJVEVSQVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb3N0T3JkZXJJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcEluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMb29wQmxvY2tzVHJhdmVyc2FsOworCisvLyBBIHRyYWl0cyB0eXBlIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBncmFwaCBhbGdvcml0aG1zLiBUaGUgZ3JhcGgKKy8vIHRyYWl0cyBzdGFydHMgYXQgdGhlIGxvb3AgaGVhZGVyLCBhbmQgdHJhdmVyc2VzIHRoZSBCYXNpY0Jsb2NrcyB0aGF0IGFyZSBpbgorLy8gdGhlIGxvb3AgYm9keSwgYnV0IG5vdCB0aGUgbG9vcCBoZWFkZXIuIFNpbmNlIHRoZSBsb29wIGhlYWRlciBpcyBza2lwcGVkLAorLy8gdGhlIGJhY2sgZWRnZXMgYXJlIGV4Y2x1ZGVkLgorLy8KKy8vIFRPRE86IEV4cGxvcmUgdGhlIHBvc3NpYmlsaXR5IHRvIGltcGxlbWVudCBMb29wQmxvY2tzVHJhdmVyc2FsIGluIHRlcm1zIG9mCisvLyAgICAgICBMb29wQm9keVRyYWl0cywgc28gdGhhdCBpbnNlcnRFZGdlIGRvZXNuJ3QgaGF2ZSB0byBiZSBzcGVjaWFsaXplZC4KK3N0cnVjdCBMb29wQm9keVRyYWl0cyB7CisgIHVzaW5nIE5vZGVSZWYgPSBzdGQ6OnBhaXI8Y29uc3QgTG9vcCAqLCBCYXNpY0Jsb2NrICo+OworCisgIC8vIFRoaXMgd3JhcHMgYSBjb25zdCBMb29wICogaW50byB0aGUgaXRlcmF0b3IsIHNvIHdlIGtub3cgd2hpY2ggZWRnZXMgdG8KKyAgLy8gZmlsdGVyIG91dC4KKyAgY2xhc3MgV3JhcHBlZFN1Y2NJdGVyYXRvcgorICAgICAgOiBwdWJsaWMgaXRlcmF0b3JfYWRhcHRvcl9iYXNlPAorICAgICAgICAgICAgV3JhcHBlZFN1Y2NJdGVyYXRvciwgc3VjY19pdGVyYXRvciwKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPHN1Y2NfaXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSwKKyAgICAgICAgICAgIE5vZGVSZWYsIHN0ZDo6cHRyZGlmZl90LCBOb2RlUmVmICosIE5vZGVSZWY+IHsKKyAgICB1c2luZyBCYXNlVCA9IGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTwKKyAgICAgICAgV3JhcHBlZFN1Y2NJdGVyYXRvciwgc3VjY19pdGVyYXRvciwKKyAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8c3VjY19pdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5LAorICAgICAgICBOb2RlUmVmLCBzdGQ6OnB0cmRpZmZfdCwgTm9kZVJlZiAqLCBOb2RlUmVmPjsKKworICAgIGNvbnN0IExvb3AgKkw7CisKKyAgcHVibGljOgorICAgIFdyYXBwZWRTdWNjSXRlcmF0b3Ioc3VjY19pdGVyYXRvciBCZWdpbiwgY29uc3QgTG9vcCAqTCkKKyAgICAgICAgOiBCYXNlVChCZWdpbiksIEwoTCkge30KKworICAgIE5vZGVSZWYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4ge0wsICpJfTsgfQorICB9OworCisgIHN0cnVjdCBMb29wQm9keUZpbHRlciB7CisgICAgYm9vbCBvcGVyYXRvcigpKE5vZGVSZWYgTikgY29uc3QgeworICAgICAgY29uc3QgTG9vcCAqTCA9IE4uZmlyc3Q7CisgICAgICByZXR1cm4gTi5zZWNvbmQgIT0gTC0+Z2V0SGVhZGVyKCkgJiYgTC0+Y29udGFpbnMoTi5zZWNvbmQpOworICAgIH0KKyAgfTsKKworICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9CisgICAgICBmaWx0ZXJfaXRlcmF0b3I8V3JhcHBlZFN1Y2NJdGVyYXRvciwgTG9vcEJvZHlGaWx0ZXI+OworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShjb25zdCBMb29wICZHKSB7IHJldHVybiB7JkcsIEcuZ2V0SGVhZGVyKCl9OyB9CisKKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTm9kZSkgeworICAgIHJldHVybiBtYWtlX2ZpbHRlcl9yYW5nZShtYWtlX3JhbmdlPFdyYXBwZWRTdWNjSXRlcmF0b3I+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N1Y2NfYmVnaW4oTm9kZS5zZWNvbmQpLCBOb2RlLmZpcnN0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdWNjX2VuZChOb2RlLnNlY29uZCksIE5vZGUuZmlyc3R9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcEJvZHlGaWx0ZXJ7fSkKKyAgICAgICAgLmJlZ2luKCk7CisgIH0KKworICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTm9kZSkgeworICAgIHJldHVybiBtYWtlX2ZpbHRlcl9yYW5nZShtYWtlX3JhbmdlPFdyYXBwZWRTdWNjSXRlcmF0b3I+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N1Y2NfYmVnaW4oTm9kZS5zZWNvbmQpLCBOb2RlLmZpcnN0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdWNjX2VuZChOb2RlLnNlY29uZCksIE5vZGUuZmlyc3R9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcEJvZHlGaWx0ZXJ7fSkKKyAgICAgICAgLmVuZCgpOworICB9Cit9OworCisvLy8gU3RvcmUgdGhlIHJlc3VsdCBvZiBhIGRlcHRoIGZpcnN0IHNlYXJjaCB3aXRoaW4gYmFzaWMgYmxvY2tzIGNvbnRhaW5lZCBieSBhCisvLy8gc2luZ2xlIGxvb3AuCisvLy8KKy8vLyBUT0RPOiBUaGlzIGNvdWxkIGJlIGdlbmVyYWxpemVkIGZvciBhbnkgQ0ZHIHJlZ2lvbiwgb3IgdGhlIGVudGlyZSBDRkcuCitjbGFzcyBMb29wQmxvY2tzREZTIHsKK3B1YmxpYzoKKyAgLy8vIFBvc3RvcmRlciBsaXN0IGl0ZXJhdG9ycy4KKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrKj46OmNvbnN0X2l0ZXJhdG9yIFBPSXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+Ojpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIFJQT0l0ZXJhdG9yOworCisgIGZyaWVuZCBjbGFzcyBMb29wQmxvY2tzVHJhdmVyc2FsOworCitwcml2YXRlOgorICBMb29wICpMOworCisgIC8vLyBNYXAgZWFjaCBibG9jayB0byBpdHMgcG9zdG9yZGVyIG51bWJlci4gQSBibG9jayBpcyBvbmx5IG1hcHBlZCBhZnRlciBpdCBpcworICAvLy8gcHJlb3JkZXIgdmlzaXRlZCBieSBERlMuIEl0J3MgcG9zdG9yZGVyIG51bWJlciBpcyBpbml0aWFsbHkgemVybyBhbmQgc2V0CisgIC8vLyB0byBub256ZXJvIGFmdGVyIGl0IGlzIGZpbmlzaGVkIGJ5IHBvc3RvcmRlciB0cmF2ZXJzYWwuCisgIERlbnNlTWFwPEJhc2ljQmxvY2sqLCB1bnNpZ25lZD4gUG9zdE51bWJlcnM7CisgIHN0ZDo6dmVjdG9yPEJhc2ljQmxvY2sqPiBQb3N0QmxvY2tzOworCitwdWJsaWM6CisgIExvb3BCbG9ja3NERlMoTG9vcCAqQ29udGFpbmVyKSA6CisgICAgTChDb250YWluZXIpLCBQb3N0TnVtYmVycyhOZXh0UG93ZXJPZjIoQ29udGFpbmVyLT5nZXROdW1CbG9ja3MoKSkpIHsKKyAgICBQb3N0QmxvY2tzLnJlc2VydmUoQ29udGFpbmVyLT5nZXROdW1CbG9ja3MoKSk7CisgIH0KKworICBMb29wICpnZXRMb29wKCkgY29uc3QgeyByZXR1cm4gTDsgfQorCisgIC8vLyBUcmF2ZXJzZSB0aGUgbG9vcCBibG9ja3MgYW5kIHN0b3JlIHRoZSBERlMgcmVzdWx0LgorICB2b2lkIHBlcmZvcm0oTG9vcEluZm8gKkxJKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgcG9zdG9yZGVyIG51bWJlcnMgYXJlIGFzc2lnbmVkIHRvIGFsbCBsb29wIGJsb2Nrcy4KKyAgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3QgeyByZXR1cm4gUG9zdEJsb2Nrcy5zaXplKCkgPT0gTC0+Z2V0TnVtQmxvY2tzKCk7IH0KKworICAvLy8gSXRlcmF0ZSBvdmVyIHRoZSBjYWNoZWQgcG9zdG9yZGVyIGJsb2Nrcy4KKyAgUE9JdGVyYXRvciBiZWdpblBvc3RvcmRlcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNDb21wbGV0ZSgpICYmICJiYWQgbG9vcCBERlMiKTsKKyAgICByZXR1cm4gUG9zdEJsb2Nrcy5iZWdpbigpOworICB9CisgIFBPSXRlcmF0b3IgZW5kUG9zdG9yZGVyKCkgY29uc3QgeyByZXR1cm4gUG9zdEJsb2Nrcy5lbmQoKTsgfQorCisgIC8vLyBSZXZlcnNlIGl0ZXJhdGUgb3ZlciB0aGUgY2FjaGVkIHBvc3RvcmRlciBibG9ja3MuCisgIFJQT0l0ZXJhdG9yIGJlZ2luUlBPKCkgY29uc3QgeworICAgIGFzc2VydChpc0NvbXBsZXRlKCkgJiYgImJhZCBsb29wIERGUyIpOworICAgIHJldHVybiBQb3N0QmxvY2tzLnJiZWdpbigpOworICB9CisgIFJQT0l0ZXJhdG9yIGVuZFJQTygpIGNvbnN0IHsgcmV0dXJuIFBvc3RCbG9ja3MucmVuZCgpOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYmxvY2sgaGFzIGJlZW4gcHJlb3JkZXIgdmlzaXRlZC4KKyAgYm9vbCBoYXNQcmVvcmRlcihCYXNpY0Jsb2NrICpCQikgY29uc3QgeyByZXR1cm4gUG9zdE51bWJlcnMuY291bnQoQkIpOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYmxvY2sgaGFzIGEgcG9zdG9yZGVyIG51bWJlci4KKyAgYm9vbCBoYXNQb3N0b3JkZXIoQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICBEZW5zZU1hcDxCYXNpY0Jsb2NrKiwgdW5zaWduZWQ+Ojpjb25zdF9pdGVyYXRvciBJID0gUG9zdE51bWJlcnMuZmluZChCQik7CisgICAgcmV0dXJuIEkgIT0gUG9zdE51bWJlcnMuZW5kKCkgJiYgSS0+c2Vjb25kOworICB9CisKKyAgLy8vIEdldCBhIGJsb2NrJ3MgcG9zdG9yZGVyIG51bWJlci4KKyAgdW5zaWduZWQgZ2V0UG9zdG9yZGVyKEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgRGVuc2VNYXA8QmFzaWNCbG9jayosIHVuc2lnbmVkPjo6Y29uc3RfaXRlcmF0b3IgSSA9IFBvc3ROdW1iZXJzLmZpbmQoQkIpOworICAgIGFzc2VydChJICE9IFBvc3ROdW1iZXJzLmVuZCgpICYmICJibG9jayBub3QgdmlzaXRlZCBieSBERlMiKTsKKyAgICBhc3NlcnQoSS0+c2Vjb25kICYmICJibG9jayBub3QgZmluaXNoZWQgYnkgREZTIik7CisgICAgcmV0dXJuIEktPnNlY29uZDsKKyAgfQorCisgIC8vLyBHZXQgYSBibG9jaydzIHJldmVyc2UgcG9zdG9yZGVyIG51bWJlci4KKyAgdW5zaWduZWQgZ2V0UlBPKEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgcmV0dXJuIDEgKyBQb3N0QmxvY2tzLnNpemUoKSAtIGdldFBvc3RvcmRlcihCQik7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIFBvc3ROdW1iZXJzLmNsZWFyKCk7CisgICAgUG9zdEJsb2Nrcy5jbGVhcigpOworICB9Cit9OworCisvLy8gV3JhcHBlciBjbGFzcyB0byBMb29wQmxvY2tzREZTIHRoYXQgcHJvdmlkZXMgYSBzdGFuZGFyZCBiZWdpbigpL2VuZCgpCisvLy8gaW50ZXJmYWNlIGZvciB0aGUgREZTIHJldmVyc2UgcG9zdC1vcmRlciB0cmF2ZXJzYWwgb2YgYmxvY2tzIGluIGEgbG9vcCBib2R5LgorY2xhc3MgTG9vcEJsb2Nrc1JQTyB7Citwcml2YXRlOgorICBMb29wQmxvY2tzREZTIERGUzsKKworcHVibGljOgorICBMb29wQmxvY2tzUlBPKExvb3AgKkNvbnRhaW5lcikgOiBERlMoQ29udGFpbmVyKSB7fQorCisgIC8vLyBUcmF2ZXJzZSB0aGUgbG9vcCBibG9ja3MgYW5kIHN0b3JlIHRoZSBERlMgcmVzdWx0LgorICB2b2lkIHBlcmZvcm0oTG9vcEluZm8gKkxJKSB7CisgICAgREZTLnBlcmZvcm0oTEkpOworICB9CisKKyAgLy8vIFJldmVyc2UgaXRlcmF0ZSBvdmVyIHRoZSBjYWNoZWQgcG9zdG9yZGVyIGJsb2Nrcy4KKyAgTG9vcEJsb2Nrc0RGUzo6UlBPSXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBERlMuYmVnaW5SUE8oKTsgfQorICBMb29wQmxvY2tzREZTOjpSUE9JdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBERlMuZW5kUlBPKCk7IH0KK307CisKKy8vLyBTcGVjaWFsaXplIHBvX2l0ZXJhdG9yX3N0b3JhZ2UgdG8gcmVjb3JkIHBvc3RvcmRlciBudW1iZXJzLgordGVtcGxhdGU8PiBjbGFzcyBwb19pdGVyYXRvcl9zdG9yYWdlPExvb3BCbG9ja3NUcmF2ZXJzYWwsIHRydWU+IHsKKyAgTG9vcEJsb2Nrc1RyYXZlcnNhbCAmTEJUOworcHVibGljOgorICBwb19pdGVyYXRvcl9zdG9yYWdlKExvb3BCbG9ja3NUcmF2ZXJzYWwgJmxicykgOiBMQlQobGJzKSB7fQorICAvLyBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgYmVsb3cuCisgIGJvb2wgaW5zZXJ0RWRnZShPcHRpb25hbDxCYXNpY0Jsb2NrICo+IEZyb20sIEJhc2ljQmxvY2sgKlRvKTsKKyAgdm9pZCBmaW5pc2hQb3N0b3JkZXIoQmFzaWNCbG9jayAqQkIpOworfTsKKworLy8vIFRyYXZlcnNlIHRoZSBibG9ja3MgaW4gYSBsb29wIHVzaW5nIGEgZGVwdGgtZmlyc3Qgc2VhcmNoLgorY2xhc3MgTG9vcEJsb2Nrc1RyYXZlcnNhbCB7CitwdWJsaWM6CisgIC8vLyBHcmFwaCB0cmF2ZXJzYWwgaXRlcmF0b3IuCisgIHR5cGVkZWYgcG9faXRlcmF0b3I8QmFzaWNCbG9jayosIExvb3BCbG9ja3NUcmF2ZXJzYWwsIHRydWU+IFBPVEl0ZXJhdG9yOworCitwcml2YXRlOgorICBMb29wQmxvY2tzREZTICZERlM7CisgIExvb3BJbmZvICpMSTsKKworcHVibGljOgorICBMb29wQmxvY2tzVHJhdmVyc2FsKExvb3BCbG9ja3NERlMgJlN0b3JhZ2UsIExvb3BJbmZvICpMSW5mbykgOgorICAgIERGUyhTdG9yYWdlKSwgTEkoTEluZm8pIHt9CisKKyAgLy8vIFBvc3RvcmRlciB0cmF2ZXJzYWwgb3ZlciB0aGUgZ3JhcGguIFRoaXMgb25seSBuZWVkcyB0byBiZSBkb25lIG9uY2UuCisgIC8vLyBwb19pdGVyYXRvciAiYXV0b21hdGljYWxseSIgY2FsbHMgYmFjayB0byB2aXNpdFByZW9yZGVyIGFuZAorICAvLy8gZmluaXNoUG9zdG9yZGVyIHRvIHJlY29yZCB0aGUgREZTIHJlc3VsdC4KKyAgUE9USXRlcmF0b3IgYmVnaW4oKSB7CisgICAgYXNzZXJ0KERGUy5Qb3N0QmxvY2tzLmVtcHR5KCkgJiYgIk5lZWQgY2xlYXIgREZTIHJlc3VsdCBiZWZvcmUgdHJhdmVyc2luZyIpOworICAgIGFzc2VydChERlMuTC0+Z2V0TnVtQmxvY2tzKCkgJiYgInBvX2l0ZXJhdG9yIGNhbm5vdCBoYW5kbGUgYW4gZW1wdHkgZ3JhcGgiKTsKKyAgICByZXR1cm4gcG9fZXh0X2JlZ2luKERGUy5MLT5nZXRIZWFkZXIoKSwgKnRoaXMpOworICB9CisgIFBPVEl0ZXJhdG9yIGVuZCgpIHsKKyAgICAvLyBwb19leHRfZW5kIGludGVyZmFjZSByZXF1aXJlcyBhIGJhc2ljIGJsb2NrLCBidXQgaWdub3JlcyBpdHMgdmFsdWUuCisgICAgcmV0dXJuIHBvX2V4dF9lbmQoREZTLkwtPmdldEhlYWRlcigpLCAqdGhpcyk7CisgIH0KKworICAvLy8gQ2FsbGVkIGJ5IHBvX2l0ZXJhdG9yIHVwb24gcmVhY2hpbmcgYSBibG9jayB2aWEgYSBDRkcgZWRnZS4gSWYgdGhpcyBibG9jaworICAvLy8gaXMgY29udGFpbmVkIGluIHRoZSBsb29wIGFuZCBoYXMgbm90IGJlZW4gdmlzaXRlZCwgdGhlbiBtYXJrIGl0IHByZW9yZGVyCisgIC8vLyB2aXNpdGVkIGFuZCByZXR1cm4gdHJ1ZS4KKyAgLy8vCisgIC8vLyBUT0RPOiBJZiBhbnlvbmUgaXMgaW50ZXJlc3RlZCwgd2UgY291bGQgcmVjb3JkIHByZW9yZGVyIG51bWJlcnMgaGVyZS4KKyAgYm9vbCB2aXNpdFByZW9yZGVyKEJhc2ljQmxvY2sgKkJCKSB7CisgICAgaWYgKCFERlMuTC0+Y29udGFpbnMoTEktPmdldExvb3BGb3IoQkIpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBERlMuUG9zdE51bWJlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEJCLCAwKSkuc2Vjb25kOworICB9CisKKyAgLy8vIENhbGxlZCBieSBwb19pdGVyYXRvciBlYWNoIHRpbWUgaXQgYWR2YW5jZXMsIGluZGljYXRpbmcgYSBibG9jaydzCisgIC8vLyBwb3N0b3JkZXIuCisgIHZvaWQgZmluaXNoUG9zdG9yZGVyKEJhc2ljQmxvY2sgKkJCKSB7CisgICAgYXNzZXJ0KERGUy5Qb3N0TnVtYmVycy5jb3VudChCQikgJiYgIkxvb3AgREZTIHNraXBwZWQgcHJlb3JkZXIiKTsKKyAgICBERlMuUG9zdEJsb2Nrcy5wdXNoX2JhY2soQkIpOworICAgIERGUy5Qb3N0TnVtYmVyc1tCQl0gPSBERlMuUG9zdEJsb2Nrcy5zaXplKCk7CisgIH0KK307CisKK2lubGluZSBib29sIHBvX2l0ZXJhdG9yX3N0b3JhZ2U8TG9vcEJsb2Nrc1RyYXZlcnNhbCwgdHJ1ZT46Omluc2VydEVkZ2UoCisgICAgT3B0aW9uYWw8QmFzaWNCbG9jayAqPiBGcm9tLCBCYXNpY0Jsb2NrICpUbykgeworICByZXR1cm4gTEJULnZpc2l0UHJlb3JkZXIoVG8pOworfQorCitpbmxpbmUgdm9pZCBwb19pdGVyYXRvcl9zdG9yYWdlPExvb3BCbG9ja3NUcmF2ZXJzYWwsIHRydWU+OjoKK2ZpbmlzaFBvc3RvcmRlcihCYXNpY0Jsb2NrICpCQikgeworICBMQlQuZmluaXNoUG9zdG9yZGVyKEJCKTsKK30KKworfSAvLyBFbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BQYXNzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BQYXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjZmVjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9vcFBhc3MuaApAQCAtMCwwICsxLDE3OSBAQAorLy89PT0tIExvb3BQYXNzLmggLSBMb29wUGFzcyBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBMb29wUGFzcyBjbGFzcy4gQWxsIGxvb3Agb3B0aW1pemF0aW9uCisvLyBhbmQgdHJhbnNmb3JtYXRpb24gcGFzc2VzIGFyZSBkZXJpdmVkIGZyb20gTG9vcFBhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0xPT1BQQVNTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19MT09QUEFTU19ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9MZWdhY3lQYXNzTWFuYWdlcnMuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlIDxkZXF1ZT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMUFBhc3NNYW5hZ2VyOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBQTVN0YWNrOworCitjbGFzcyBMb29wUGFzcyA6IHB1YmxpYyBQYXNzIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgTG9vcFBhc3MoY2hhciAmcGlkKSA6IFBhc3MoUFRfTG9vcCwgcGlkKSB7fQorCisgIC8vLyBnZXRQcmludGVyUGFzcyAtIEdldCBhIHBhc3MgdG8gcHJpbnQgdGhlIGZ1bmN0aW9uIGNvcnJlc3BvbmRpbmcKKyAgLy8vIHRvIGEgTG9vcC4KKyAgUGFzcyAqY3JlYXRlUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vIHJ1bk9uTG9vcCAtIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgc3ViY2xhc3MgdG8gcGVyZm9ybQorICAvLyB3aGF0ZXZlciBhY3Rpb24gaXMgbmVjZXNzYXJ5IGZvciB0aGUgc3BlY2lmaWVkIExvb3AuCisgIHZpcnR1YWwgYm9vbCBydW5Pbkxvb3AoTG9vcCAqTCwgTFBQYXNzTWFuYWdlciAmTFBNKSA9IDA7CisKKyAgdXNpbmcgbGx2bTo6UGFzczo6ZG9Jbml0aWFsaXphdGlvbjsKKyAgdXNpbmcgbGx2bTo6UGFzczo6ZG9GaW5hbGl6YXRpb247CisKKyAgLy8gSW5pdGlhbGl6YXRpb24gYW5kIGZpbmFsaXphdGlvbiBob29rcy4KKyAgdmlydHVhbCBib29sIGRvSW5pdGlhbGl6YXRpb24oTG9vcCAqTCwgTFBQYXNzTWFuYWdlciAmTFBNKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gRmluYWxpemF0aW9uIGhvb2sgZG9lcyBub3Qgc3VwcGx5IExvb3AgYmVjYXVzZSBhdCB0aGlzIHRpbWUKKyAgLy8gbG9vcCBuZXN0IGlzIGNvbXBsZXRlbHkgZGlmZmVyZW50LgorICB2aXJ0dWFsIGJvb2wgZG9GaW5hbGl6YXRpb24oKSB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vIENoZWNrIGlmIHRoaXMgcGFzcyBpcyBzdWl0YWJsZSBmb3IgdGhlIGN1cnJlbnQgTFBQYXNzTWFuYWdlciwgaWYKKyAgLy8gYXZhaWxhYmxlLiBUaGlzIHBhc3MgUCBpcyBub3Qgc3VpdGFibGUgZm9yIGEgTFBQYXNzTWFuYWdlciBpZiBQCisgIC8vIGlzIG5vdCBwcmVzZXJ2aW5nIGhpZ2hlciBsZXZlbCBhbmFseXNpcyBpbmZvIHVzZWQgYnkgb3RoZXIKKyAgLy8gTFBQYXNzTWFuYWdlciBwYXNzZXMuIEluIHN1Y2ggY2FzZSwgcG9wIExQUGFzc01hbmFnZXIgZnJvbSB0aGUKKyAgLy8gc3RhY2suIFRoaXMgd2lsbCBmb3JjZSBhc3NpZ25QYXNzTWFuYWdlcigpIHRvIGNyZWF0ZSBuZXcKKyAgLy8gTFBQYXNzTWFuZ2VyIGFzIGV4cGVjdGVkLgorICB2b2lkIHByZXBhcmVQYXNzTWFuYWdlcihQTVN0YWNrICZQTVMpIG92ZXJyaWRlOworCisgIC8vLyBBc3NpZ24gcGFzcyBtYW5hZ2VyIHRvIG1hbmFnZSB0aGlzIHBhc3MKKyAgdm9pZCBhc3NpZ25QYXNzTWFuYWdlcihQTVN0YWNrICZQTVMsIFBhc3NNYW5hZ2VyVHlwZSBQTVQpIG92ZXJyaWRlOworCisgIC8vLyAgUmV0dXJuIHdoYXQga2luZCBvZiBQYXNzIE1hbmFnZXIgY2FuIG1hbmFnZSB0aGlzIHBhc3MuCisgIFBhc3NNYW5hZ2VyVHlwZSBnZXRQb3RlbnRpYWxQYXNzTWFuYWdlclR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFBNVF9Mb29wUGFzc01hbmFnZXI7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFNpbXBsZUFuYWx5c2lzIC0gUHJvdmlkZXMgc2ltcGxlIGludGVyZmFjZSB0byB1cGRhdGUgYW5hbHlzaXMgaW5mbworICAvLy8gbWFpbnRhaW5lZCBieSB2YXJpb3VzIHBhc3Nlcy4gTm90ZSwgaWYgcmVxdWlyZWQgdGhpcyBpbnRlcmZhY2UgY2FuCisgIC8vLyBiZSBleHRyYWN0ZWQgaW50byBhIHNlcGFyYXRlIGFic3RyYWN0IGNsYXNzIGJ1dCBpdCB3b3VsZCByZXF1aXJlCisgIC8vLyBhZGRpdGlvbmFsIHVzZSBvZiBtdWx0aXBsZSBpbmhlcml0YW5jZSBpbiBQYXNzIGNsYXNzIGhpZXJhcmNoeSwgc29tZXRoaW5nCisgIC8vLyB3ZSBhcmUgdHJ5aW5nIHRvIGF2b2lkLgorCisgIC8vLyBFYWNoIGxvb3AgcGFzcyBjYW4gb3ZlcnJpZGUgdGhlc2Ugc2ltcGxlIGFuYWx5c2lzIGhvb2tzIHRvIHVwZGF0ZQorICAvLy8gZGVzaXJlZCBhbmFseXNpcyBpbmZvcm1hdGlvbi4KKyAgLy8vIGNsb25lQmFzaWNCbG9ja0FuYWx5c2lzIC0gQ2xvbmUgYW5hbHlzaXMgaW5mbyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgYmxvY2suCisgIHZpcnR1YWwgdm9pZCBjbG9uZUJhc2ljQmxvY2tBbmFseXNpcyhCYXNpY0Jsb2NrICpGLCBCYXNpY0Jsb2NrICpULCBMb29wICpMKSB7fQorCisgIC8vLyBkZWxldGVBbmFseXNpc1ZhbHVlIC0gRGVsZXRlIGFuYWx5c2lzIGluZm8gYXNzb2NpYXRlZCB3aXRoIHZhbHVlIFYuCisgIHZpcnR1YWwgdm9pZCBkZWxldGVBbmFseXNpc1ZhbHVlKFZhbHVlICpWLCBMb29wICpMKSB7fQorCisgIC8vLyBEZWxldGUgYW5hbHlzaXMgaW5mbyBhc3NvY2lhdGVkIHdpdGggTG9vcCBMLgorICAvLy8gQ2FsbGVkIHRvIG5vdGlmeSBhIFBhc3MgdGhhdCBhIGxvb3AgaGFzIGJlZW4gZGVsZXRlZCBhbmQgYW55CisgIC8vLyBhc3NvY2lhdGVkIGFuYWx5c2lzIHZhbHVlcyBjYW4gYmUgZGVsZXRlZC4KKyAgdmlydHVhbCB2b2lkIGRlbGV0ZUFuYWx5c2lzTG9vcChMb29wICpMKSB7fQorCitwcm90ZWN0ZWQ6CisgIC8vLyBPcHRpb25hbCBwYXNzZXMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHBhc3Mgc2hvdWxkIGJlCisgIC8vLyBza2lwcGVkLiBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gQXR0cmlidXRlOjpPcHRpbWl6ZU5vbmUgaXMgc2V0IG9yIHdoZW4KKyAgLy8vIG9wdGltaXphdGlvbiBiaXNlY3QgaXMgb3ZlciB0aGUgbGltaXQuCisgIGJvb2wgc2tpcExvb3AoY29uc3QgTG9vcCAqTCkgY29uc3Q7Cit9OworCitjbGFzcyBMUFBhc3NNYW5hZ2VyIDogcHVibGljIEZ1bmN0aW9uUGFzcywgcHVibGljIFBNRGF0YU1hbmFnZXIgeworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKyAgZXhwbGljaXQgTFBQYXNzTWFuYWdlcigpOworCisgIC8vLyBydW4gLSBFeGVjdXRlIGFsbCBvZiB0aGUgcGFzc2VzIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uLiAgS2VlcCB0cmFjayBvZgorICAvLy8gd2hldGhlciBhbnkgb2YgdGhlIHBhc3NlcyBtb2RpZmllcyB0aGUgbW9kdWxlLCBhbmQgaWYgc28sIHJldHVybiB0cnVlLgorICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworCisgIC8vLyBQYXNzIE1hbmFnZXIgaXRzZWxmIGRvZXMgbm90IGludmFsaWRhdGUgYW55IGFuYWx5c2lzIGluZm8uCisgIC8vIExQUGFzc01hbmFnZXIgbmVlZHMgTG9vcEluZm8uCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZJbmZvKSBjb25zdCBvdmVycmlkZTsKKworICBTdHJpbmdSZWYgZ2V0UGFzc05hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiTG9vcCBQYXNzIE1hbmFnZXIiOyB9CisKKyAgUE1EYXRhTWFuYWdlciAqZ2V0QXNQTURhdGFNYW5hZ2VyKCkgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQorICBQYXNzICpnZXRBc1Bhc3MoKSBvdmVycmlkZSB7IHJldHVybiB0aGlzOyB9CisKKyAgLy8vIFByaW50IHBhc3NlcyBtYW5hZ2VkIGJ5IHRoaXMgbWFuYWdlcgorICB2b2lkIGR1bXBQYXNzU3RydWN0dXJlKHVuc2lnbmVkIE9mZnNldCkgb3ZlcnJpZGU7CisKKyAgTG9vcFBhc3MgKmdldENvbnRhaW5lZFBhc3ModW5zaWduZWQgTikgeworICAgIGFzc2VydChOIDwgUGFzc1ZlY3Rvci5zaXplKCkgJiYgIlBhc3MgbnVtYmVyIG91dCBvZiByYW5nZSEiKTsKKyAgICBMb29wUGFzcyAqTFAgPSBzdGF0aWNfY2FzdDxMb29wUGFzcyAqPihQYXNzVmVjdG9yW05dKTsKKyAgICByZXR1cm4gTFA7CisgIH0KKworICBQYXNzTWFuYWdlclR5cGUgZ2V0UGFzc01hbmFnZXJUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBQTVRfTG9vcFBhc3NNYW5hZ2VyOworICB9CisKK3B1YmxpYzoKKyAgLy8gQWRkIGEgbmV3IGxvb3AgaW50byB0aGUgbG9vcCBxdWV1ZS4KKyAgdm9pZCBhZGRMb29wKExvb3AgJkwpOworCisgIC8vIE1hcmsgXHAgTCBhcyBkZWxldGVkLgorICB2b2lkIG1hcmtMb29wQXNEZWxldGVkKExvb3AgJkwpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gU2ltcGxlQW5hbHlzaXMgLSBQcm92aWRlcyBzaW1wbGUgaW50ZXJmYWNlIHRvIHVwZGF0ZSBhbmFseXNpcyBpbmZvCisgIC8vLyBtYWludGFpbmVkIGJ5IHZhcmlvdXMgcGFzc2VzLiBOb3RlLCBpZiByZXF1aXJlZCB0aGlzIGludGVyZmFjZSBjYW4KKyAgLy8vIGJlIGV4dHJhY3RlZCBpbnRvIGEgc2VwYXJhdGUgYWJzdHJhY3QgY2xhc3MgYnV0IGl0IHdvdWxkIHJlcXVpcmUKKyAgLy8vIGFkZGl0aW9uYWwgdXNlIG9mIG11bHRpcGxlIGluaGVyaXRhbmNlIGluIFBhc3MgY2xhc3MgaGllcmFyY2h5LCBzb21ldGhpbmcKKyAgLy8vIHdlIGFyZSB0cnlpbmcgdG8gYXZvaWQuCisKKyAgLy8vIGNsb25lQmFzaWNCbG9ja1NpbXBsZUFuYWx5c2lzIC0gSW52b2tlIGNsb25lQmFzaWNCbG9ja0FuYWx5c2lzIGhvb2sgZm9yCisgIC8vLyBhbGwgcGFzc2VzIHRoYXQgaW1wbGVtZW50IHNpbXBsZSBhbmFseXNpcyBpbnRlcmZhY2UuCisgIHZvaWQgY2xvbmVCYXNpY0Jsb2NrU2ltcGxlQW5hbHlzaXMoQmFzaWNCbG9jayAqRnJvbSwgQmFzaWNCbG9jayAqVG8sIExvb3AgKkwpOworCisgIC8vLyBkZWxldGVTaW1wbGVBbmFseXNpc1ZhbHVlIC0gSW52b2tlIGRlbGV0ZUFuYWx5c2lzVmFsdWUgaG9vayBmb3IgYWxsIHBhc3NlcworICAvLy8gdGhhdCBpbXBsZW1lbnQgc2ltcGxlIGFuYWx5c2lzIGludGVyZmFjZS4KKyAgdm9pZCBkZWxldGVTaW1wbGVBbmFseXNpc1ZhbHVlKFZhbHVlICpWLCBMb29wICpMKTsKKworICAvLy8gSW52b2tlIGRlbGV0ZUFuYWx5c2lzTG9vcCBob29rIGZvciBhbGwgcGFzc2VzIHRoYXQgaW1wbGVtZW50IHNpbXBsZQorICAvLy8gYW5hbHlzaXMgaW50ZXJmYWNlLgorICB2b2lkIGRlbGV0ZVNpbXBsZUFuYWx5c2lzTG9vcChMb29wICpMKTsKKworcHJpdmF0ZToKKyAgc3RkOjpkZXF1ZTxMb29wICo+IExROworICBMb29wSW5mbyAqTEk7CisgIExvb3AgKkN1cnJlbnRMb29wOworICBib29sIEN1cnJlbnRMb29wRGVsZXRlZDsKK307CisKKy8vIFRoaXMgcGFzcyBpcyByZXF1aXJlZCBieSB0aGUgTENTU0EgdHJhbnNmb3JtYXRpb24uIEl0IGlzIHVzZWQgaW5zaWRlCisvLyBMUFBhc3NNYW5hZ2VyIHRvIGNoZWNrIGlmIGN1cnJlbnQgcGFzcyBwcmVzZXJ2ZXMgTENTU0EgZm9ybSwgYW5kIGlmIGl0IGRvZXMKKy8vIHBhc3MgbWFuYWdlciBjYWxscyBsY3NzYSB2ZXJpZmljYXRpb24gZm9yIHRoZSBjdXJyZW50IGxvb3AuCitzdHJ1Y3QgTENTU0FWZXJpZmljYXRpb25QYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgIHN0YXRpYyBjaGFyIElEOworICBMQ1NTQVZlcmlmaWNhdGlvblBhc3MoKSA6IEZ1bmN0aW9uUGFzcyhJRCkgeworICAgIGluaXRpYWxpemVMQ1NTQVZlcmlmaWNhdGlvblBhc3NQYXNzKCpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpKTsKKyAgfQorCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BVbnJvbGxBbmFseXplci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb29wVW5yb2xsQW5hbHl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGYzZTVmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb29wVW5yb2xsQW5hbHl6ZXIuaApAQCAtMCwwICsxLDk1IEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9Mb29wVW5yb2xsQW5hbHl6ZXIuaCAtIExvb3AgVW5yb2xsIEFuYWx5emVyLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIFVucm9sbGVkSW5zdEFuYWx5emVyIGNsYXNzLiBJdCdzIHVzZWQgZm9yIHByZWRpY3RpbmcKKy8vIHBvdGVudGlhbCBlZmZlY3RzIHRoYXQgbG9vcCB1bnJvbGxpbmcgbWlnaHQgaGF2ZSwgc3VjaCBhcyBlbmFibGluZyBjb25zdGFudAorLy8gcHJvcGFnYXRpb24gYW5kIG90aGVyIG9wdGltaXphdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0xPT1BVTlJPTExBTkFMWVpFUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTE9PUFVOUk9MTEFOQUxZWkVSX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvSW5zdHJ1Y3Rpb25TaW1wbGlmeS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uRXhwcmVzc2lvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RWaXNpdG9yLmgiCisKKy8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBnZXQgYW4gZXN0aW1hdGUgb2YgdGhlIG9wdGltaXphdGlvbiBlZmZlY3RzIHRoYXQgd2UKKy8vIGNvdWxkIGdldCBmcm9tIGNvbXBsZXRlIGxvb3AgdW5yb2xsaW5nLiBJdCBjb21lcyBmcm9tIHRoZSBmYWN0IHRoYXQgc29tZQorLy8gbG9hZHMgbWlnaHQgYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSBjb25zdGFudCB2YWx1ZXMgYW5kIHRoYXQgY291bGQgdHJpZ2dlcgorLy8gYSBjaGFpbiBvZiBpbnN0cnVjdGlvbiBzaW1wbGlmaWNhdGlvbnMuCisvLworLy8gRS5nLiB3ZSBtaWdodCBoYXZlOgorLy8gICBpbnQgYVtdID0gezAsIDEsIDB9OworLy8gICB2ID0gMDsKKy8vICAgZm9yIChpID0gMDsgaSA8IDM7IGkgKyspCisvLyAgICAgdiArPSBiW2ldKmFbaV07CisvLyBJZiB3ZSBjb21wbGV0ZWx5IHVucm9sbCB0aGUgbG9vcCwgd2Ugd291bGQgZ2V0OgorLy8gICB2ID0gYlswXSphWzBdICsgYlsxXSphWzFdICsgYlsyXSphWzJdCisvLyBXaGljaCB0aGVuIHdpbGwgYmUgc2ltcGxpZmllZCB0bzoKKy8vICAgdiA9IGJbMF0qIDAgKyBiWzFdKiAxICsgYlsyXSogMAorLy8gQW5kIGZpbmFsbHk6CisvLyAgIHYgPSBiWzFdCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBVbnJvbGxlZEluc3RBbmFseXplciA6IHByaXZhdGUgSW5zdFZpc2l0b3I8VW5yb2xsZWRJbnN0QW5hbHl6ZXIsIGJvb2w+IHsKKyAgdHlwZWRlZiBJbnN0VmlzaXRvcjxVbnJvbGxlZEluc3RBbmFseXplciwgYm9vbD4gQmFzZTsKKyAgZnJpZW5kIGNsYXNzIEluc3RWaXNpdG9yPFVucm9sbGVkSW5zdEFuYWx5emVyLCBib29sPjsKKyAgc3RydWN0IFNpbXBsaWZpZWRBZGRyZXNzIHsKKyAgICBWYWx1ZSAqQmFzZSA9IG51bGxwdHI7CisgICAgQ29uc3RhbnRJbnQgKk9mZnNldCA9IG51bGxwdHI7CisgIH07CisKK3B1YmxpYzoKKyAgVW5yb2xsZWRJbnN0QW5hbHl6ZXIodW5zaWduZWQgSXRlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxWYWx1ZSAqLCBDb25zdGFudCAqPiAmU2ltcGxpZmllZFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyRXZvbHV0aW9uICZTRSwgY29uc3QgTG9vcCAqTCkKKyAgICAgIDogU2ltcGxpZmllZFZhbHVlcyhTaW1wbGlmaWVkVmFsdWVzKSwgU0UoU0UpLCBMKEwpIHsKKyAgICAgIEl0ZXJhdGlvbk51bWJlciA9IFNFLmdldENvbnN0YW50KEFQSW50KDY0LCBJdGVyYXRpb24pKTsKKyAgfQorCisgIC8vIEFsbG93IGFjY2VzcyB0byB0aGUgaW5pdGlhbCB2aXNpdCBtZXRob2QuCisgIHVzaW5nIEJhc2U6OnZpc2l0OworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIEEgY2FjaGUgb2YgcG9pbnRlciBiYXNlcyBhbmQgY29uc3RhbnQtZm9sZGVkIG9mZnNldHMgY29ycmVzcG9uZGluZworICAvLy8gdG8gR0VQIChvciBkZXJpdmVkIGZyb20gR0VQKSBpbnN0cnVjdGlvbnMuCisgIC8vLworICAvLy8gSW4gb3JkZXIgdG8gZmluZCB0aGUgYmFzZSBwb2ludGVyIG9uZSBuZWVkcyB0byBwZXJmb3JtIG5vbi10cml2aWFsCisgIC8vLyB0cmF2ZXJzYWwgb2YgdGhlIGNvcnJlc3BvbmRpbmcgU0NFViBleHByZXNzaW9uLCBzbyBpdCdzIGdvb2QgdG8gaGF2ZSB0aGUKKyAgLy8vIHJlc3VsdHMgc2F2ZWQuCisgIERlbnNlTWFwPFZhbHVlICosIFNpbXBsaWZpZWRBZGRyZXNzPiBTaW1wbGlmaWVkQWRkcmVzc2VzOworCisgIC8vLyBcYnJpZWYgU0NFViBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gbnVtYmVyIG9mIGN1cnJlbnRseSBzaW11bGF0ZWQKKyAgLy8vIGl0ZXJhdGlvbi4KKyAgY29uc3QgU0NFViAqSXRlcmF0aW9uTnVtYmVyOworCisgIC8vLyBcYnJpZWYgQSBWYWx1ZS0+Q29uc3RhbnQgbWFwIGZvciBrZWVwaW5nIHZhbHVlcyB0aGF0IHdlIG1hbmFnZWQgdG8KKyAgLy8vIGNvbnN0YW50LWZvbGQgb24gdGhlIGdpdmVuIGl0ZXJhdGlvbi4KKyAgLy8vCisgIC8vLyBXaGlsZSB3ZSB3YWxrIHRoZSBsb29wIGluc3RydWN0aW9ucywgd2UgYnVpbGQgdXAgYW5kIG1haW50YWluIGEgbWFwcGluZworICAvLy8gb2Ygc2ltcGxpZmllZCB2YWx1ZXMgc3BlY2lmaWMgdG8gdGhpcyBpdGVyYXRpb24uICBUaGUgaWRlYSBpcyB0byBwcm9wYWdhdGUKKyAgLy8vIGFueSBzcGVjaWFsIGluZm9ybWF0aW9uIHdlIGhhdmUgYWJvdXQgbG9hZHMgdGhhdCBjYW4gYmUgcmVwbGFjZWQgd2l0aAorICAvLy8gY29uc3RhbnRzIGFmdGVyIGNvbXBsZXRlIHVucm9sbGluZywgYW5kIGFjY291bnQgZm9yIGxpa2VseSBzaW1wbGlmaWNhdGlvbnMKKyAgLy8vIHBvc3QtdW5yb2xsaW5nLgorICBEZW5zZU1hcDxWYWx1ZSAqLCBDb25zdGFudCAqPiAmU2ltcGxpZmllZFZhbHVlczsKKworICBTY2FsYXJFdm9sdXRpb24gJlNFOworICBjb25zdCBMb29wICpMOworCisgIGJvb2wgc2ltcGxpZnlJbnN0V2l0aFNDRVYoSW5zdHJ1Y3Rpb24gKkkpOworCisgIGJvb2wgdmlzaXRJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAmSSkgeyByZXR1cm4gc2ltcGxpZnlJbnN0V2l0aFNDRVYoJkkpOyB9CisgIGJvb2wgdmlzaXRCaW5hcnlPcGVyYXRvcihCaW5hcnlPcGVyYXRvciAmSSk7CisgIGJvb2wgdmlzaXRMb2FkKExvYWRJbnN0ICZJKTsKKyAgYm9vbCB2aXNpdENhc3RJbnN0KENhc3RJbnN0ICZJKTsKKyAgYm9vbCB2aXNpdENtcEluc3QoQ21wSW5zdCAmSSk7CisgIGJvb2wgdmlzaXRQSElOb2RlKFBISU5vZGUgJlBOKTsKK307Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTWVtb3J5QnVpbHRpbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTWVtb3J5QnVpbHRpbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDUzZTM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9NZW1vcnlCdWlsdGlucy5oCkBAIC0wLDAgKzEsMzEzIEBACisvLz09LSBsbHZtL0FuYWx5c2lzL01lbW9yeUJ1aWx0aW5zLmggLSBDYWxscyB0byBtZW1vcnkgYnVpbHRpbnMgLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmFtaWx5IG9mIGZ1bmN0aW9ucyBpZGVudGlmaWVzIGNhbGxzIHRvIGJ1aWx0aW4gZnVuY3Rpb25zIHRoYXQgYWxsb2NhdGUKKy8vIG9yIGZyZWUgbWVtb3J5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19NRU1PUllCVUlMVElOU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTUVNT1JZQlVJTFRJTlNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9UYXJnZXRGb2xkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JUkJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RWaXNpdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBbGxvY2FJbnN0OworY2xhc3MgQXJndW1lbnQ7CitjbGFzcyBDYWxsSW5zdDsKK2NsYXNzIENvbnN0YW50SW50OworY2xhc3MgQ29uc3RhbnRQb2ludGVyTnVsbDsKK2NsYXNzIERhdGFMYXlvdXQ7CitjbGFzcyBFeHRyYWN0RWxlbWVudEluc3Q7CitjbGFzcyBFeHRyYWN0VmFsdWVJbnN0OworY2xhc3MgR0VQT3BlcmF0b3I7CitjbGFzcyBHbG9iYWxBbGlhczsKK2NsYXNzIEdsb2JhbFZhcmlhYmxlOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBJbnRlZ2VyVHlwZTsKK2NsYXNzIEludHJpbnNpY0luc3Q7CitjbGFzcyBJbnRUb1B0ckluc3Q7CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIExvYWRJbnN0OworY2xhc3MgUEhJTm9kZTsKK2NsYXNzIFBvaW50ZXJUeXBlOworY2xhc3MgU2VsZWN0SW5zdDsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworY2xhc3MgVHlwZTsKK2NsYXNzIFVuZGVmVmFsdWU7CitjbGFzcyBWYWx1ZTsKKworLy8vIFxicmllZiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgY2FsbCBvciBpbnZva2UgdG8gYSBsaWJyYXJ5IGZ1bmN0aW9uIHRoYXQKKy8vLyBhbGxvY2F0ZXMgb3IgcmVhbGxvY2F0ZXMgbWVtb3J5IChlaXRoZXIgbWFsbG9jLCBjYWxsb2MsIHJlYWxsb2MsIG9yIHN0cmR1cAorLy8vIGxpa2UpLgorYm9vbCBpc0FsbG9jYXRpb25Gbihjb25zdCBWYWx1ZSAqViwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBMb29rVGhyb3VnaEJpdENhc3QgPSBmYWxzZSk7CisKKy8vLyBcYnJpZWYgVGVzdHMgaWYgYSB2YWx1ZSBpcyBhIGNhbGwgb3IgaW52b2tlIHRvIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEKKy8vLyBOb0FsaWFzIHBvaW50ZXIgKGluY2x1ZGluZyBtYWxsb2MvY2FsbG9jL3JlYWxsb2Mvc3RyZHVwLWxpa2UgZnVuY3Rpb25zKS4KK2Jvb2wgaXNOb0FsaWFzRm4oY29uc3QgVmFsdWUgKlYsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEksCisgICAgICAgICAgICAgICAgIGJvb2wgTG9va1Rocm91Z2hCaXRDYXN0ID0gZmFsc2UpOworCisvLy8gXGJyaWVmIFRlc3RzIGlmIGEgdmFsdWUgaXMgYSBjYWxsIG9yIGludm9rZSB0byBhIGxpYnJhcnkgZnVuY3Rpb24gdGhhdAorLy8vIGFsbG9jYXRlcyB1bmluaXRpYWxpemVkIG1lbW9yeSAoc3VjaCBhcyBtYWxsb2MpLgorYm9vbCBpc01hbGxvY0xpa2VGbihjb25zdCBWYWx1ZSAqViwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBMb29rVGhyb3VnaEJpdENhc3QgPSBmYWxzZSk7CisKKy8vLyBcYnJpZWYgVGVzdHMgaWYgYSB2YWx1ZSBpcyBhIGNhbGwgb3IgaW52b2tlIHRvIGEgbGlicmFyeSBmdW5jdGlvbiB0aGF0CisvLy8gYWxsb2NhdGVzIHplcm8tZmlsbGVkIG1lbW9yeSAoc3VjaCBhcyBjYWxsb2MpLgorYm9vbCBpc0NhbGxvY0xpa2VGbihjb25zdCBWYWx1ZSAqViwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBMb29rVGhyb3VnaEJpdENhc3QgPSBmYWxzZSk7CisKKy8vLyBcYnJpZWYgVGVzdHMgaWYgYSB2YWx1ZSBpcyBhIGNhbGwgb3IgaW52b2tlIHRvIGEgbGlicmFyeSBmdW5jdGlvbiB0aGF0CisvLy8gYWxsb2NhdGVzIG1lbW9yeSBzaW1pbGFyIHRvIG1hbGxvYyBvciBjYWxsb2MuCitib29sIGlzTWFsbG9jT3JDYWxsb2NMaWtlRm4oY29uc3QgVmFsdWUgKlYsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBMb29rVGhyb3VnaEJpdENhc3QgPSBmYWxzZSk7CisKKy8vLyBcYnJpZWYgVGVzdHMgaWYgYSB2YWx1ZSBpcyBhIGNhbGwgb3IgaW52b2tlIHRvIGEgbGlicmFyeSBmdW5jdGlvbiB0aGF0CisvLy8gYWxsb2NhdGVzIG1lbW9yeSAoZWl0aGVyIG1hbGxvYywgY2FsbG9jLCBvciBzdHJkdXAgbGlrZSkuCitib29sIGlzQWxsb2NMaWtlRm4oY29uc3QgVmFsdWUgKlYsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEksCisgICAgICAgICAgICAgICAgICAgYm9vbCBMb29rVGhyb3VnaEJpdENhc3QgPSBmYWxzZSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgbWFsbG9jIENhbGwgVXRpbGl0eSBGdW5jdGlvbnMuCisvLworCisvLy8gZXh0cmFjdE1hbGxvY0NhbGwgLSBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIENhbGxJbnN0IGlmIHRoZSBpbnN0cnVjdGlvbgorLy8vIGlzIGEgbWFsbG9jIGNhbGwuICBTaW5jZSBDYWxsSW5zdDo6Q3JlYXRlTWFsbG9jKCkgb25seSBjcmVhdGVzIGNhbGxzLCB3ZQorLy8vIGlnbm9yZSBJbnZva2VJbnN0IGhlcmUuCitjb25zdCBDYWxsSW5zdCAqZXh0cmFjdE1hbGxvY0NhbGwoY29uc3QgVmFsdWUgKkksIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpOworaW5saW5lIENhbGxJbnN0ICpleHRyYWN0TWFsbG9jQ2FsbChWYWx1ZSAqSSwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSkgeworICByZXR1cm4gY29uc3RfY2FzdDxDYWxsSW5zdCo+KGV4dHJhY3RNYWxsb2NDYWxsKChjb25zdCBWYWx1ZSopSSwgVExJKSk7Cit9CisKKy8vLyBnZXRNYWxsb2NUeXBlIC0gUmV0dXJucyB0aGUgUG9pbnRlclR5cGUgcmVzdWx0aW5nIGZyb20gdGhlIG1hbGxvYyBjYWxsLgorLy8vIFRoZSBQb2ludGVyVHlwZSBkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2YgYml0Y2FzdCB1c2VzIG9mIHRoZSBtYWxsb2MgY2FsbDoKKy8vLyAgIDA6IFBvaW50ZXJUeXBlIGlzIHRoZSBtYWxsb2MgY2FsbHMnIHJldHVybiB0eXBlLgorLy8vICAgMTogUG9pbnRlclR5cGUgaXMgdGhlIGJpdGNhc3QncyByZXN1bHQgdHlwZS4KKy8vLyAgPjE6IFVuaXF1ZSBQb2ludGVyVHlwZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgcmV0dXJuIE5VTEwuCitQb2ludGVyVHlwZSAqZ2V0TWFsbG9jVHlwZShjb25zdCBDYWxsSW5zdCAqQ0ksIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpOworCisvLy8gZ2V0TWFsbG9jQWxsb2NhdGVkVHlwZSAtIFJldHVybnMgdGhlIFR5cGUgYWxsb2NhdGVkIGJ5IG1hbGxvYyBjYWxsLgorLy8vIFRoZSBUeXBlIGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBiaXRjYXN0IHVzZXMgb2YgdGhlIG1hbGxvYyBjYWxsOgorLy8vICAgMDogUG9pbnRlclR5cGUgaXMgdGhlIG1hbGxvYyBjYWxscycgcmV0dXJuIHR5cGUuCisvLy8gICAxOiBQb2ludGVyVHlwZSBpcyB0aGUgYml0Y2FzdCdzIHJlc3VsdCB0eXBlLgorLy8vICA+MTogVW5pcXVlIFBvaW50ZXJUeXBlIGNhbm5vdCBiZSBkZXRlcm1pbmVkLCByZXR1cm4gTlVMTC4KK1R5cGUgKmdldE1hbGxvY0FsbG9jYXRlZFR5cGUoY29uc3QgQ2FsbEluc3QgKkNJLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKKworLy8vIGdldE1hbGxvY0FycmF5U2l6ZSAtIFJldHVybnMgdGhlIGFycmF5IHNpemUgb2YgYSBtYWxsb2MgY2FsbC4gIElmIHRoZQorLy8vIGFyZ3VtZW50IHBhc3NlZCB0byBtYWxsb2MgaXMgYSBtdWx0aXBsZSBvZiB0aGUgc2l6ZSBvZiB0aGUgbWFsbG9jZWQgdHlwZSwKKy8vLyB0aGVuIHJldHVybiB0aGF0IG11bHRpcGxlLiAgRm9yIG5vbi1hcnJheSBtYWxsb2NzLCB0aGUgbXVsdGlwbGUgaXMKKy8vLyBjb25zdGFudCAxLiAgT3RoZXJ3aXNlLCByZXR1cm4gTlVMTCBmb3IgbWFsbG9jcyB3aG9zZSBhcnJheSBzaXplIGNhbm5vdCBiZQorLy8vIGRldGVybWluZWQuCitWYWx1ZSAqZ2V0TWFsbG9jQXJyYXlTaXplKENhbGxJbnN0ICpDSSwgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTG9va1Rocm91Z2hTRXh0ID0gZmFsc2UpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIGNhbGxvYyBDYWxsIFV0aWxpdHkgRnVuY3Rpb25zLgorLy8KKworLy8vIGV4dHJhY3RDYWxsb2NDYWxsIC0gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBDYWxsSW5zdCBpZiB0aGUgaW5zdHJ1Y3Rpb24KKy8vLyBpcyBhIGNhbGxvYyBjYWxsLgorY29uc3QgQ2FsbEluc3QgKmV4dHJhY3RDYWxsb2NDYWxsKGNvbnN0IFZhbHVlICpJLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKK2lubGluZSBDYWxsSW5zdCAqZXh0cmFjdENhbGxvY0NhbGwoVmFsdWUgKkksIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpIHsKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q2FsbEluc3QqPihleHRyYWN0Q2FsbG9jQ2FsbCgoY29uc3QgVmFsdWUqKUksIFRMSSkpOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgZnJlZSBDYWxsIFV0aWxpdHkgRnVuY3Rpb25zLgorLy8KKworLy8vIGlzRnJlZUNhbGwgLSBSZXR1cm5zIG5vbi1udWxsIGlmIHRoZSB2YWx1ZSBpcyBhIGNhbGwgdG8gdGhlIGJ1aWx0aW4gZnJlZSgpCitjb25zdCBDYWxsSW5zdCAqaXNGcmVlQ2FsbChjb25zdCBWYWx1ZSAqSSwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSk7CisKK2lubGluZSBDYWxsSW5zdCAqaXNGcmVlQ2FsbChWYWx1ZSAqSSwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSkgeworICByZXR1cm4gY29uc3RfY2FzdDxDYWxsSW5zdCo+KGlzRnJlZUNhbGwoKGNvbnN0IFZhbHVlKilJLCBUTEkpKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBVdGlsaXR5IGZ1bmN0aW9ucyB0byBjb21wdXRlIHNpemUgb2Ygb2JqZWN0cy4KKy8vCisKKy8vLyBWYXJpb3VzIG9wdGlvbnMgdG8gY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgZ2V0T2JqZWN0U2l6ZS4KK3N0cnVjdCBPYmplY3RTaXplT3B0cyB7CisgIC8vLyBDb250cm9scyBob3cgd2UgaGFuZGxlIGNvbmRpdGlvbmFsIHN0YXRlbWVudHMgd2l0aCB1bmtub3duIGNvbmRpdGlvbnMuCisgIGVudW0gY2xhc3MgTW9kZSA6IHVpbnQ4X3QgeworICAgIC8vLyBGYWlsIHRvIGV2YWx1YXRlIGFuIHVua25vd24gY29uZGl0aW9uLgorICAgIEV4YWN0LAorICAgIC8vLyBFdmFsdWF0ZSBhbGwgYnJhbmNoZXMgb2YgYW4gdW5rbm93biBjb25kaXRpb24uIElmIGFsbCBldmFsdWF0aW9ucworICAgIC8vLyBzdWNjZWVkLCBwaWNrIHRoZSBtaW5pbXVtIHNpemUuCisgICAgTWluLAorICAgIC8vLyBTYW1lIGFzIE1pbiwgZXhjZXB0IHdlIHBpY2sgdGhlIG1heGltdW0gc2l6ZSBvZiBhbGwgb2YgdGhlIGJyYW5jaGVzLgorICAgIE1heAorICB9OworCisgIC8vLyBIb3cgd2Ugd2FudCB0byBldmFsdWF0ZSB0aGlzIG9iamVjdCdzIHNpemUuCisgIE1vZGUgRXZhbE1vZGUgPSBNb2RlOjpFeGFjdDsKKyAgLy8vIFdoZXRoZXIgdG8gcm91bmQgdGhlIHJlc3VsdCB1cCB0byB0aGUgYWxpZ25tZW50IG9mIGFsbG9jYXMsIGJ5dmFsCisgIC8vLyBhcmd1bWVudHMsIGFuZCBnbG9iYWwgdmFyaWFibGVzLgorICBib29sIFJvdW5kVG9BbGlnbiA9IGZhbHNlOworICAvLy8gSWYgdGhpcyBpcyB0cnVlLCBudWxsIHBvaW50ZXJzIGluIGFkZHJlc3Mgc3BhY2UgMCB3aWxsIGJlIHRyZWF0ZWQgYXMKKyAgLy8vIHRob3VnaCB0aGV5IGNhbid0IGJlIGV2YWx1YXRlZC4gT3RoZXJ3aXNlLCBudWxsIGlzIGFsd2F5cyBjb25zaWRlcmVkIHRvCisgIC8vLyBwb2ludCB0byBhIDAgYnl0ZSByZWdpb24gb2YgbWVtb3J5LgorICBib29sIE51bGxJc1Vua25vd25TaXplID0gZmFsc2U7Cit9OworCisvLy8gXGJyaWVmIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIG9iamVjdCBwb2ludGVkIGJ5IFB0ci4gUmV0dXJucyB0cnVlIGFuZCB0aGUKKy8vLyBvYmplY3Qgc2l6ZSBpbiBTaXplIGlmIHN1Y2Nlc3NmdWwsIGFuZCBmYWxzZSBvdGhlcndpc2UuIEluIHRoaXMgY29udGV4dCwgYnkKKy8vLyBvYmplY3Qgd2UgbWVhbiB0aGUgcmVnaW9uIG9mIG1lbW9yeSBzdGFydGluZyBhdCBQdHIgdG8gdGhlIGVuZCBvZiB0aGUKKy8vLyB1bmRlcmx5aW5nIG9iamVjdCBwb2ludGVkIHRvIGJ5IFB0ci4KK2Jvb2wgZ2V0T2JqZWN0U2l6ZShjb25zdCBWYWx1ZSAqUHRyLCB1aW50NjRfdCAmU2l6ZSwgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSwgT2JqZWN0U2l6ZU9wdHMgT3B0cyA9IHt9KTsKKworLy8vIFRyeSB0byB0dXJuIGEgY2FsbCB0byBAbGx2bS5vYmplY3RzaXplIGludG8gYW4gaW50ZWdlciB2YWx1ZSBvZiB0aGUgZ2l2ZW4KKy8vLyBUeXBlLiBSZXR1cm5zIG51bGwgb24gZmFpbHVyZS4KKy8vLyBJZiBNdXN0U3VjY2VlZCBpcyB0cnVlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IHJldHVybiBudWxsLCBhbmQgbWF5IHJldHVybgorLy8vIGNvbnNlcnZhdGl2ZSB2YWx1ZXMgZ292ZXJuZWQgYnkgdGhlIHNlY29uZCBhcmd1bWVudCBvZiB0aGUgY2FsbCB0bworLy8vIG9iamVjdHNpemUuCitDb25zdGFudEludCAqbG93ZXJPYmplY3RTaXplQ2FsbChJbnRyaW5zaWNJbnN0ICpPYmplY3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNdXN0U3VjY2VlZCk7CisKK3VzaW5nIFNpemVPZmZzZXRUeXBlID0gc3RkOjpwYWlyPEFQSW50LCBBUEludD47CisKKy8vLyBcYnJpZWYgRXZhbHVhdGUgdGhlIHNpemUgYW5kIG9mZnNldCBvZiBhbiBvYmplY3QgcG9pbnRlZCB0byBieSBhIFZhbHVlKgorLy8vIHN0YXRpY2FsbHkuIEZhaWxzIGlmIHNpemUgb3Igb2Zmc2V0IGFyZSBub3Qga25vd24gYXQgY29tcGlsZSB0aW1lLgorY2xhc3MgT2JqZWN0U2l6ZU9mZnNldFZpc2l0b3IKKyAgOiBwdWJsaWMgSW5zdFZpc2l0b3I8T2JqZWN0U2l6ZU9mZnNldFZpc2l0b3IsIFNpemVPZmZzZXRUeXBlPiB7CisgIGNvbnN0IERhdGFMYXlvdXQgJkRMOworICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJOworICBPYmplY3RTaXplT3B0cyBPcHRpb25zOworICB1bnNpZ25lZCBJbnRUeUJpdHM7CisgIEFQSW50IFplcm87CisgIFNtYWxsUHRyU2V0PEluc3RydWN0aW9uICosIDg+IFNlZW5JbnN0czsKKworICBBUEludCBhbGlnbihBUEludCBTaXplLCB1aW50NjRfdCBBbGlnbik7CisKKyAgU2l6ZU9mZnNldFR5cGUgdW5rbm93bigpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoQVBJbnQoKSwgQVBJbnQoKSk7CisgIH0KKworcHVibGljOgorICBPYmplY3RTaXplT2Zmc2V0VmlzaXRvcihjb25zdCBEYXRhTGF5b3V0ICZETCwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQgJkNvbnRleHQsIE9iamVjdFNpemVPcHRzIE9wdGlvbnMgPSB7fSk7CisKKyAgU2l6ZU9mZnNldFR5cGUgY29tcHV0ZShWYWx1ZSAqVik7CisKKyAgc3RhdGljIGJvb2wga25vd25TaXplKGNvbnN0IFNpemVPZmZzZXRUeXBlICZTaXplT2Zmc2V0KSB7CisgICAgcmV0dXJuIFNpemVPZmZzZXQuZmlyc3QuZ2V0Qml0V2lkdGgoKSA+IDE7CisgIH0KKworICBzdGF0aWMgYm9vbCBrbm93bk9mZnNldChjb25zdCBTaXplT2Zmc2V0VHlwZSAmU2l6ZU9mZnNldCkgeworICAgIHJldHVybiBTaXplT2Zmc2V0LnNlY29uZC5nZXRCaXRXaWR0aCgpID4gMTsKKyAgfQorCisgIHN0YXRpYyBib29sIGJvdGhLbm93bihjb25zdCBTaXplT2Zmc2V0VHlwZSAmU2l6ZU9mZnNldCkgeworICAgIHJldHVybiBrbm93blNpemUoU2l6ZU9mZnNldCkgJiYga25vd25PZmZzZXQoU2l6ZU9mZnNldCk7CisgIH0KKworICAvLyBUaGVzZSBhcmUgInByaXZhdGUiLCBleGNlcHQgdGhleSBjYW4ndCBhY3R1YWxseSBiZSBtYWRlIHByaXZhdGUuIE9ubHkKKyAgLy8gY29tcHV0ZSgpIHNob3VsZCBiZSB1c2VkIGJ5IGV4dGVybmFsIHVzZXJzLgorICBTaXplT2Zmc2V0VHlwZSB2aXNpdEFsbG9jYUluc3QoQWxsb2NhSW5zdCAmSSk7CisgIFNpemVPZmZzZXRUeXBlIHZpc2l0QXJndW1lbnQoQXJndW1lbnQgJkEpOworICBTaXplT2Zmc2V0VHlwZSB2aXNpdENhbGxTaXRlKENhbGxTaXRlIENTKTsKKyAgU2l6ZU9mZnNldFR5cGUgdmlzaXRDb25zdGFudFBvaW50ZXJOdWxsKENvbnN0YW50UG9pbnRlck51bGwmKTsKKyAgU2l6ZU9mZnNldFR5cGUgdmlzaXRFeHRyYWN0RWxlbWVudEluc3QoRXh0cmFjdEVsZW1lbnRJbnN0ICZJKTsKKyAgU2l6ZU9mZnNldFR5cGUgdmlzaXRFeHRyYWN0VmFsdWVJbnN0KEV4dHJhY3RWYWx1ZUluc3QgJkkpOworICBTaXplT2Zmc2V0VHlwZSB2aXNpdEdFUE9wZXJhdG9yKEdFUE9wZXJhdG9yICZHRVApOworICBTaXplT2Zmc2V0VHlwZSB2aXNpdEdsb2JhbEFsaWFzKEdsb2JhbEFsaWFzICZHQSk7CisgIFNpemVPZmZzZXRUeXBlIHZpc2l0R2xvYmFsVmFyaWFibGUoR2xvYmFsVmFyaWFibGUgJkdWKTsKKyAgU2l6ZU9mZnNldFR5cGUgdmlzaXRJbnRUb1B0ckluc3QoSW50VG9QdHJJbnN0Jik7CisgIFNpemVPZmZzZXRUeXBlIHZpc2l0TG9hZEluc3QoTG9hZEluc3QgJkkpOworICBTaXplT2Zmc2V0VHlwZSB2aXNpdFBISU5vZGUoUEhJTm9kZSYpOworICBTaXplT2Zmc2V0VHlwZSB2aXNpdFNlbGVjdEluc3QoU2VsZWN0SW5zdCAmSSk7CisgIFNpemVPZmZzZXRUeXBlIHZpc2l0VW5kZWZWYWx1ZShVbmRlZlZhbHVlJik7CisgIFNpemVPZmZzZXRUeXBlIHZpc2l0SW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gJkkpOworCitwcml2YXRlOgorICBib29sIENoZWNrZWRaZXh0T3JUcnVuYyhBUEludCAmSSk7Cit9OworCit1c2luZyBTaXplT2Zmc2V0RXZhbFR5cGUgPSBzdGQ6OnBhaXI8VmFsdWUgKiwgVmFsdWUgKj47CisKKy8vLyBcYnJpZWYgRXZhbHVhdGUgdGhlIHNpemUgYW5kIG9mZnNldCBvZiBhbiBvYmplY3QgcG9pbnRlZCB0byBieSBhIFZhbHVlKi4KKy8vLyBNYXkgY3JlYXRlIGNvZGUgdG8gY29tcHV0ZSB0aGUgcmVzdWx0IGF0IHJ1bi10aW1lLgorY2xhc3MgT2JqZWN0U2l6ZU9mZnNldEV2YWx1YXRvcgorICA6IHB1YmxpYyBJbnN0VmlzaXRvcjxPYmplY3RTaXplT2Zmc2V0RXZhbHVhdG9yLCBTaXplT2Zmc2V0RXZhbFR5cGU+IHsKKyAgdXNpbmcgQnVpbGRlclR5ID0gSVJCdWlsZGVyPFRhcmdldEZvbGRlcj47CisgIHVzaW5nIFdlYWtFdmFsVHlwZSA9IHN0ZDo6cGFpcjxXZWFrVHJhY2tpbmdWSCwgV2Vha1RyYWNraW5nVkg+OworICB1c2luZyBDYWNoZU1hcFR5ID0gRGVuc2VNYXA8Y29uc3QgVmFsdWUgKiwgV2Vha0V2YWxUeXBlPjsKKyAgdXNpbmcgUHRyU2V0VHkgPSBTbWFsbFB0clNldDxjb25zdCBWYWx1ZSAqLCA4PjsKKworICBjb25zdCBEYXRhTGF5b3V0ICZETDsKKyAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSTsKKyAgTExWTUNvbnRleHQgJkNvbnRleHQ7CisgIEJ1aWxkZXJUeSBCdWlsZGVyOworICBJbnRlZ2VyVHlwZSAqSW50VHk7CisgIFZhbHVlICpaZXJvOworICBDYWNoZU1hcFR5IENhY2hlTWFwOworICBQdHJTZXRUeSBTZWVuVmFsczsKKyAgYm9vbCBSb3VuZFRvQWxpZ247CisKKyAgU2l6ZU9mZnNldEV2YWxUeXBlIHVua25vd24oKSB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKG51bGxwdHIsIG51bGxwdHIpOworICB9CisKKyAgU2l6ZU9mZnNldEV2YWxUeXBlIGNvbXB1dGVfKFZhbHVlICpWKTsKKworcHVibGljOgorICBPYmplY3RTaXplT2Zmc2V0RXZhbHVhdG9yKGNvbnN0IERhdGFMYXlvdXQgJkRMLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDb250ZXh0LCBib29sIFJvdW5kVG9BbGlnbiA9IGZhbHNlKTsKKworICBTaXplT2Zmc2V0RXZhbFR5cGUgY29tcHV0ZShWYWx1ZSAqVik7CisKKyAgYm9vbCBrbm93blNpemUoU2l6ZU9mZnNldEV2YWxUeXBlIFNpemVPZmZzZXQpIHsKKyAgICByZXR1cm4gU2l6ZU9mZnNldC5maXJzdDsKKyAgfQorCisgIGJvb2wga25vd25PZmZzZXQoU2l6ZU9mZnNldEV2YWxUeXBlIFNpemVPZmZzZXQpIHsKKyAgICByZXR1cm4gU2l6ZU9mZnNldC5zZWNvbmQ7CisgIH0KKworICBib29sIGFueUtub3duKFNpemVPZmZzZXRFdmFsVHlwZSBTaXplT2Zmc2V0KSB7CisgICAgcmV0dXJuIGtub3duU2l6ZShTaXplT2Zmc2V0KSB8fCBrbm93bk9mZnNldChTaXplT2Zmc2V0KTsKKyAgfQorCisgIGJvb2wgYm90aEtub3duKFNpemVPZmZzZXRFdmFsVHlwZSBTaXplT2Zmc2V0KSB7CisgICAgcmV0dXJuIGtub3duU2l6ZShTaXplT2Zmc2V0KSAmJiBrbm93bk9mZnNldChTaXplT2Zmc2V0KTsKKyAgfQorCisgIC8vIFRoZSBpbmRpdmlkdWFsIGluc3RydWN0aW9uIHZpc2l0b3JzIHNob3VsZCBiZSB0cmVhdGVkIGFzIHByaXZhdGUuCisgIFNpemVPZmZzZXRFdmFsVHlwZSB2aXNpdEFsbG9jYUluc3QoQWxsb2NhSW5zdCAmSSk7CisgIFNpemVPZmZzZXRFdmFsVHlwZSB2aXNpdENhbGxTaXRlKENhbGxTaXRlIENTKTsKKyAgU2l6ZU9mZnNldEV2YWxUeXBlIHZpc2l0RXh0cmFjdEVsZW1lbnRJbnN0KEV4dHJhY3RFbGVtZW50SW5zdCAmSSk7CisgIFNpemVPZmZzZXRFdmFsVHlwZSB2aXNpdEV4dHJhY3RWYWx1ZUluc3QoRXh0cmFjdFZhbHVlSW5zdCAmSSk7CisgIFNpemVPZmZzZXRFdmFsVHlwZSB2aXNpdEdFUE9wZXJhdG9yKEdFUE9wZXJhdG9yICZHRVApOworICBTaXplT2Zmc2V0RXZhbFR5cGUgdmlzaXRJbnRUb1B0ckluc3QoSW50VG9QdHJJbnN0Jik7CisgIFNpemVPZmZzZXRFdmFsVHlwZSB2aXNpdExvYWRJbnN0KExvYWRJbnN0ICZJKTsKKyAgU2l6ZU9mZnNldEV2YWxUeXBlIHZpc2l0UEhJTm9kZShQSElOb2RlICZQSEkpOworICBTaXplT2Zmc2V0RXZhbFR5cGUgdmlzaXRTZWxlY3RJbnN0KFNlbGVjdEluc3QgJkkpOworICBTaXplT2Zmc2V0RXZhbFR5cGUgdmlzaXRJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAmSSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19NRU1PUllCVUlMVElOU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL01lbW9yeURlcGVuZGVuY2VBbmFseXNpcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9NZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjk3NDUyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9NZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXMuaApAQCAtMCwwICsxLDU0MCBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzLmggLSBNZW1vcnkgRGVwcyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzIGFuYWx5c2lzIHBhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX01FTU9SWURFUEVOREVOQ0VBTkFMWVNJU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTUVNT1JZREVQRU5ERU5DRUFOQUxZU0lTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyRW1iZWRkZWRJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJTdW1UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL01lbW9yeUxvY2F0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JUi9NZXRhZGF0YS5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ByZWRJdGVyYXRvckNhY2hlLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQXNzdW1wdGlvbkNhY2hlOworY2xhc3MgQ2FsbFNpdGU7CitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIExvYWRJbnN0OworY2xhc3MgUEhJVHJhbnNBZGRyOworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CitjbGFzcyBWYWx1ZTsKKworLy8vIEEgbWVtb3J5IGRlcGVuZGVuY2UgcXVlcnkgY2FuIHJldHVybiBvbmUgb2YgdGhyZWUgZGlmZmVyZW50IGFuc3dlcnMuCitjbGFzcyBNZW1EZXBSZXN1bHQgeworICBlbnVtIERlcFR5cGUgeworICAgIC8vLyBDbGllbnRzIG9mIE1lbURlcCBuZXZlciBzZWUgdGhpcy4KKyAgICAvLy8KKyAgICAvLy8gRW50cmllcyB3aXRoIHRoaXMgbWFya2VyIG9jY3VyIGluIGEgTG9jYWxEZXBzIG1hcCBvciBOb25Mb2NhbERlcHMgbWFwCisgICAgLy8vIHdoZW4gdGhlIGluc3RydWN0aW9uIHRoZXkgcHJldmlvdXNseSByZWZlcmVuY2VkIHdhcyByZW1vdmVkIGZyb20KKyAgICAvLy8gTWVtRGVwLiAgSW4gZWl0aGVyIGNhc2UsIHRoZSBlbnRyeSBtYXkgaW5jbHVkZSBhbiBpbnN0cnVjdGlvbiBwb2ludGVyLgorICAgIC8vLyBJZiBzbywgdGhlIHBvaW50ZXIgaXMgYW4gaW5zdHJ1Y3Rpb24gaW4gdGhlIGJsb2NrIHdoZXJlIHNjYW5uaW5nIGNhbgorICAgIC8vLyBzdGFydCBmcm9tLCBzYXZpbmcgc29tZSB3b3JrLgorICAgIC8vLworICAgIC8vLyBJbiBhIGRlZmF1bHQtY29uc3RydWN0ZWQgTWVtRGVwUmVzdWx0IG9iamVjdCwgdGhlIHR5cGUgd2lsbCBiZSBJbnZhbGlkCisgICAgLy8vIGFuZCB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciB3aWxsIGJlIG51bGwuCisgICAgSW52YWxpZCA9IDAsCisKKyAgICAvLy8gVGhpcyBpcyBhIGRlcGVuZGVuY2Ugb24gdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiB3aGljaCBjbG9iYmVycyB0aGUKKyAgICAvLy8gZGVzaXJlZCB2YWx1ZS4gIFRoZSBwb2ludGVyIG1lbWJlciBvZiB0aGUgTWVtRGVwUmVzdWx0IHBhaXIgaG9sZHMgdGhlCisgICAgLy8vIGluc3RydWN0aW9uIHRoYXQgY2xvYmJlcnMgdGhlIG1lbW9yeS4gIEZvciBleGFtcGxlLCB0aGlzIG9jY3VycyB3aGVuIHdlCisgICAgLy8vIHNlZSBhIG1heS1hbGlhc2VkIHN0b3JlIHRvIHRoZSBtZW1vcnkgbG9jYXRpb24gd2UgY2FyZSBhYm91dC4KKyAgICAvLy8KKyAgICAvLy8gVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgdGhhdCBtYXkgYmUgaW50ZXJlc3RpbmcgaGVyZToKKyAgICAvLy8gICAxLiBMb2FkcyBhcmUgY2xvYmJlcmVkIGJ5IG1heS1hbGlhcyBzdG9yZXMuCisgICAgLy8vICAgMi4gTG9hZHMgYXJlIGNvbnNpZGVyZWQgY2xvYmJlcmVkIGJ5IHBhcnRpYWxseS1hbGlhc2VkIGxvYWRzLiAgVGhlCisgICAgLy8vICAgICAgY2xpZW50IG1heSBjaG9vc2UgdG8gYW5hbHl6ZSBkZWVwZXIgaW50byB0aGVzZSBjYXNlcy4KKyAgICBDbG9iYmVyLAorCisgICAgLy8vIFRoaXMgaXMgYSBkZXBlbmRlbmNlIG9uIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gd2hpY2ggZGVmaW5lcyBvcgorICAgIC8vLyBwcm9kdWNlcyB0aGUgZGVzaXJlZCBtZW1vcnkgbG9jYXRpb24uICBUaGUgcG9pbnRlciBtZW1iZXIgb2YgdGhlCisgICAgLy8vIE1lbURlcFJlc3VsdCBwYWlyIGhvbGRzIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGRlZmluZXMgdGhlIG1lbW9yeS4KKyAgICAvLy8KKyAgICAvLy8gQ2FzZXMgb2YgaW50ZXJlc3Q6CisgICAgLy8vICAgMS4gVGhpcyBjb3VsZCBiZSBhIGxvYWQgb3Igc3RvcmUgZm9yIGRlcGVuZGVuY2UgcXVlcmllcyBvbgorICAgIC8vLyAgICAgIGxvYWQvc3RvcmUuICBUaGUgdmFsdWUgbG9hZGVkIG9yIHN0b3JlZCBpcyB0aGUgcHJvZHVjZWQgdmFsdWUuCisgICAgLy8vICAgICAgTm90ZSB0aGF0IHRoZSBwb2ludGVyIG9wZXJhbmQgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoYXQgb2YgdGhlCisgICAgLy8vICAgICAgcXVlcmllZCBwb2ludGVyIGR1ZSB0byBtdXN0IGFsaWFzZXMgYW5kIHBoaSB0cmFuc2xhdGlvbi4gTm90ZQorICAgIC8vLyAgICAgIHRoYXQgdGhlIGRlZiBtYXkgbm90IGJlIHRoZSBzYW1lIHR5cGUgYXMgdGhlIHF1ZXJ5LCB0aGUgcG9pbnRlcnMKKyAgICAvLy8gICAgICBtYXkganVzdCBiZSBtdXN0IGFsaWFzZXMuCisgICAgLy8vICAgMi4gRm9yIGxvYWRzIGFuZCBzdG9yZXMsIHRoaXMgY291bGQgYmUgYW4gYWxsb2NhdGlvbiBpbnN0cnVjdGlvbi4gSW4KKyAgICAvLy8gICAgICB0aGlzIGNhc2UsIHRoZSBsb2FkIGlzIGxvYWRpbmcgYW4gdW5kZWYgdmFsdWUgb3IgYSBzdG9yZSBpcyB0aGUKKyAgICAvLy8gICAgICBmaXJzdCBzdG9yZSB0byAodGhhdCBwYXJ0IG9mKSB0aGUgYWxsb2NhdGlvbi4KKyAgICAvLy8gICAzLiBEZXBlbmRlbmNlIHF1ZXJpZXMgb24gY2FsbHMgcmV0dXJuIERlZiBvbmx5IHdoZW4gdGhleSBhcmUgcmVhZG9ubHkKKyAgICAvLy8gICAgICBjYWxscyBvciBtZW1vcnkgdXNlIGludHJpbnNpY3Mgd2l0aCBpZGVudGljYWwgY2FsbGVlcyBhbmQgbm8KKyAgICAvLy8gICAgICBpbnRlcnZlbmluZyBjbG9iYmVycy4gIE5vIHZhbGlkYXRpb24gaXMgZG9uZSB0aGF0IHRoZSBvcGVyYW5kcyB0bworICAgIC8vLyAgICAgIHRoZSBjYWxscyBhcmUgdGhlIHNhbWUuCisgICAgRGVmLAorCisgICAgLy8vIFRoaXMgbWFya2VyIGluZGljYXRlcyB0aGF0IHRoZSBxdWVyeSBoYXMgbm8ga25vd24gZGVwZW5kZW5jeSBpbiB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIGJsb2NrLgorICAgIC8vLworICAgIC8vLyBNb3JlIGRldGFpbGVkIHN0YXRlIGluZm8gaXMgZW5jb2RlZCBpbiB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcGFpciAoaS5lLgorICAgIC8vLyB0aGUgSW5zdHJ1Y3Rpb24qKQorICAgIE90aGVyCisgIH07CisKKyAgLy8vIElmIERlcFR5cGUgaXMgIk90aGVyIiwgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIHN1bSB0eXBlIGlzIGFuIGVuY29kaW5nIG9mCisgIC8vLyB0aGUgZm9sbG93aW5nIG1vcmUgZGV0YWlsZWQgdHlwZSBpbmZvcm1hdGlvbi4KKyAgZW51bSBPdGhlclR5cGUgeworICAgIC8vLyBUaGlzIG1hcmtlciBpbmRpY2F0ZXMgdGhhdCB0aGUgcXVlcnkgaGFzIG5vIGRlcGVuZGVuY3kgaW4gdGhlIHNwZWNpZmllZAorICAgIC8vLyBibG9jay4KKyAgICAvLy8KKyAgICAvLy8gVG8gZmluZCBvdXQgbW9yZSwgdGhlIGNsaWVudCBzaG91bGQgcXVlcnkgb3RoZXIgcHJlZGVjZXNzb3IgYmxvY2tzLgorICAgIE5vbkxvY2FsID0gMSwKKyAgICAvLy8gVGhpcyBtYXJrZXIgaW5kaWNhdGVzIHRoYXQgdGhlIHF1ZXJ5IGhhcyBubyBkZXBlbmRlbmN5IGluIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gZnVuY3Rpb24uCisgICAgTm9uRnVuY0xvY2FsLAorICAgIC8vLyBUaGlzIG1hcmtlciBpbmRpY2F0ZXMgdGhhdCB0aGUgcXVlcnkgZGVwZW5kZW5jeSBpcyB1bmtub3duLgorICAgIFVua25vd24KKyAgfTsKKworICB1c2luZyBWYWx1ZVR5ID0gUG9pbnRlclN1bVR5cGU8CisgICAgICBEZXBUeXBlLCBQb2ludGVyU3VtVHlwZU1lbWJlcjxJbnZhbGlkLCBJbnN0cnVjdGlvbiAqPiwKKyAgICAgIFBvaW50ZXJTdW1UeXBlTWVtYmVyPENsb2JiZXIsIEluc3RydWN0aW9uICo+LAorICAgICAgUG9pbnRlclN1bVR5cGVNZW1iZXI8RGVmLCBJbnN0cnVjdGlvbiAqPiwKKyAgICAgIFBvaW50ZXJTdW1UeXBlTWVtYmVyPE90aGVyLCBQb2ludGVyRW1iZWRkZWRJbnQ8T3RoZXJUeXBlLCAzPj4+OworICBWYWx1ZVR5IFZhbHVlOworCisgIGV4cGxpY2l0IE1lbURlcFJlc3VsdChWYWx1ZVR5IFYpIDogVmFsdWUoVikge30KKworcHVibGljOgorICBNZW1EZXBSZXN1bHQoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIGdldCBtZXRob2RzOiBUaGVzZSBhcmUgc3RhdGljIGN0b3IgbWV0aG9kcyBmb3IgY3JlYXRpbmcgdmFyaW91cworICAvLy8gTWVtRGVwUmVzdWx0IGtpbmRzLgorICBzdGF0aWMgTWVtRGVwUmVzdWx0IGdldERlZihJbnN0cnVjdGlvbiAqSW5zdCkgeworICAgIGFzc2VydChJbnN0ICYmICJEZWYgcmVxdWlyZXMgaW5zdCIpOworICAgIHJldHVybiBNZW1EZXBSZXN1bHQoVmFsdWVUeTo6Y3JlYXRlPERlZj4oSW5zdCkpOworICB9CisgIHN0YXRpYyBNZW1EZXBSZXN1bHQgZ2V0Q2xvYmJlcihJbnN0cnVjdGlvbiAqSW5zdCkgeworICAgIGFzc2VydChJbnN0ICYmICJDbG9iYmVyIHJlcXVpcmVzIGluc3QiKTsKKyAgICByZXR1cm4gTWVtRGVwUmVzdWx0KFZhbHVlVHk6OmNyZWF0ZTxDbG9iYmVyPihJbnN0KSk7CisgIH0KKyAgc3RhdGljIE1lbURlcFJlc3VsdCBnZXROb25Mb2NhbCgpIHsKKyAgICByZXR1cm4gTWVtRGVwUmVzdWx0KFZhbHVlVHk6OmNyZWF0ZTxPdGhlcj4oTm9uTG9jYWwpKTsKKyAgfQorICBzdGF0aWMgTWVtRGVwUmVzdWx0IGdldE5vbkZ1bmNMb2NhbCgpIHsKKyAgICByZXR1cm4gTWVtRGVwUmVzdWx0KFZhbHVlVHk6OmNyZWF0ZTxPdGhlcj4oTm9uRnVuY0xvY2FsKSk7CisgIH0KKyAgc3RhdGljIE1lbURlcFJlc3VsdCBnZXRVbmtub3duKCkgeworICAgIHJldHVybiBNZW1EZXBSZXN1bHQoVmFsdWVUeTo6Y3JlYXRlPE90aGVyPihVbmtub3duKSk7CisgIH0KKworICAvLy8gVGVzdHMgaWYgdGhpcyBNZW1EZXBSZXN1bHQgcmVwcmVzZW50cyBhIHF1ZXJ5IHRoYXQgaXMgYW4gaW5zdHJ1Y3Rpb24KKyAgLy8vIGNsb2JiZXIgZGVwZW5kZW5jeS4KKyAgYm9vbCBpc0Nsb2JiZXIoKSBjb25zdCB7IHJldHVybiBWYWx1ZS5pczxDbG9iYmVyPigpOyB9CisKKyAgLy8vIFRlc3RzIGlmIHRoaXMgTWVtRGVwUmVzdWx0IHJlcHJlc2VudHMgYSBxdWVyeSB0aGF0IGlzIGFuIGluc3RydWN0aW9uCisgIC8vLyBkZWZpbml0aW9uIGRlcGVuZGVuY3kuCisgIGJvb2wgaXNEZWYoKSBjb25zdCB7IHJldHVybiBWYWx1ZS5pczxEZWY+KCk7IH0KKworICAvLy8gVGVzdHMgaWYgdGhpcyBNZW1EZXBSZXN1bHQgcmVwcmVzZW50cyBhIHF1ZXJ5IHRoYXQgaXMgdHJhbnNwYXJlbnQgdG8gdGhlCisgIC8vLyBzdGFydCBvZiB0aGUgYmxvY2ssIGJ1dCB3aGVyZSBhIG5vbi1sb2NhbCBoYXNuJ3QgYmVlbiBkb25lLgorICBib29sIGlzTm9uTG9jYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlLmlzPE90aGVyPigpICYmIFZhbHVlLmNhc3Q8T3RoZXI+KCkgPT0gTm9uTG9jYWw7CisgIH0KKworICAvLy8gVGVzdHMgaWYgdGhpcyBNZW1EZXBSZXN1bHQgcmVwcmVzZW50cyBhIHF1ZXJ5IHRoYXQgaXMgdHJhbnNwYXJlbnQgdG8gdGhlCisgIC8vLyBzdGFydCBvZiB0aGUgZnVuY3Rpb24uCisgIGJvb2wgaXNOb25GdW5jTG9jYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlLmlzPE90aGVyPigpICYmIFZhbHVlLmNhc3Q8T3RoZXI+KCkgPT0gTm9uRnVuY0xvY2FsOworICB9CisKKyAgLy8vIFRlc3RzIGlmIHRoaXMgTWVtRGVwUmVzdWx0IHJlcHJlc2VudHMgYSBxdWVyeSB3aGljaCBjYW5ub3QgYW5kL29yIHdpbGwKKyAgLy8vIG5vdCBiZSBjb21wdXRlZC4KKyAgYm9vbCBpc1Vua25vd24oKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlLmlzPE90aGVyPigpICYmIFZhbHVlLmNhc3Q8T3RoZXI+KCkgPT0gVW5rbm93bjsKKyAgfQorCisgIC8vLyBJZiB0aGlzIGlzIGEgbm9ybWFsIGRlcGVuZGVuY3ksIHJldHVybnMgdGhlIGluc3RydWN0aW9uIHRoYXQgaXMgZGVwZW5kZWQKKyAgLy8vIG9uLiAgT3RoZXJ3aXNlLCByZXR1cm5zIG51bGwuCisgIEluc3RydWN0aW9uICpnZXRJbnN0KCkgY29uc3QgeworICAgIHN3aXRjaCAoVmFsdWUuZ2V0VGFnKCkpIHsKKyAgICBjYXNlIEludmFsaWQ6CisgICAgICByZXR1cm4gVmFsdWUuY2FzdDxJbnZhbGlkPigpOworICAgIGNhc2UgQ2xvYmJlcjoKKyAgICAgIHJldHVybiBWYWx1ZS5jYXN0PENsb2JiZXI+KCk7CisgICAgY2FzZSBEZWY6CisgICAgICByZXR1cm4gVmFsdWUuY2FzdDxEZWY+KCk7CisgICAgY2FzZSBPdGhlcjoKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGRpc2NyaW1pbmFudCEiKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNZW1EZXBSZXN1bHQgJk0pIGNvbnN0IHsgcmV0dXJuIFZhbHVlID09IE0uVmFsdWU7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1lbURlcFJlc3VsdCAmTSkgY29uc3QgeyByZXR1cm4gVmFsdWUgIT0gTS5WYWx1ZTsgfQorICBib29sIG9wZXJhdG9yPChjb25zdCBNZW1EZXBSZXN1bHQgJk0pIGNvbnN0IHsgcmV0dXJuIFZhbHVlIDwgTS5WYWx1ZTsgfQorICBib29sIG9wZXJhdG9yPihjb25zdCBNZW1EZXBSZXN1bHQgJk0pIGNvbnN0IHsgcmV0dXJuIFZhbHVlID4gTS5WYWx1ZTsgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgTWVtb3J5RGVwZW5kZW5jZVJlc3VsdHM7CisKKyAgLy8vIFRlc3RzIGlmIHRoaXMgaXMgYSBNZW1EZXBSZXN1bHQgaW4gaXRzIGRpcnR5L2ludmFsaWQuIHN0YXRlLgorICBib29sIGlzRGlydHkoKSBjb25zdCB7IHJldHVybiBWYWx1ZS5pczxJbnZhbGlkPigpOyB9CisKKyAgc3RhdGljIE1lbURlcFJlc3VsdCBnZXREaXJ0eShJbnN0cnVjdGlvbiAqSW5zdCkgeworICAgIHJldHVybiBNZW1EZXBSZXN1bHQoVmFsdWVUeTo6Y3JlYXRlPEludmFsaWQ+KEluc3QpKTsKKyAgfQorfTsKKworLy8vIFRoaXMgaXMgYW4gZW50cnkgaW4gdGhlIE5vbkxvY2FsRGVwSW5mbyBjYWNoZS4KKy8vLworLy8vIEZvciBlYWNoIEJhc2ljQmxvY2sgKHRoZSBCQiBlbnRyeSkgaXQga2VlcHMgYSBNZW1EZXBSZXN1bHQuCitjbGFzcyBOb25Mb2NhbERlcEVudHJ5IHsKKyAgQmFzaWNCbG9jayAqQkI7CisgIE1lbURlcFJlc3VsdCBSZXN1bHQ7CisKK3B1YmxpYzoKKyAgTm9uTG9jYWxEZXBFbnRyeShCYXNpY0Jsb2NrICpiYiwgTWVtRGVwUmVzdWx0IHJlc3VsdCkKKyAgICAgIDogQkIoYmIpLCBSZXN1bHQocmVzdWx0KSB7fQorCisgIC8vIFRoaXMgaXMgdXNlZCBmb3Igc2VhcmNoZXMuCisgIE5vbkxvY2FsRGVwRW50cnkoQmFzaWNCbG9jayAqYmIpIDogQkIoYmIpIHt9CisKKyAgLy8gQkIgaXMgdGhlIHNvcnQga2V5LCBpdCBjYW4ndCBiZSBjaGFuZ2VkLgorICBCYXNpY0Jsb2NrICpnZXRCQigpIGNvbnN0IHsgcmV0dXJuIEJCOyB9CisKKyAgdm9pZCBzZXRSZXN1bHQoY29uc3QgTWVtRGVwUmVzdWx0ICZSKSB7IFJlc3VsdCA9IFI7IH0KKworICBjb25zdCBNZW1EZXBSZXN1bHQgJmdldFJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuIFJlc3VsdDsgfQorCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE5vbkxvY2FsRGVwRW50cnkgJlJIUykgY29uc3QgeyByZXR1cm4gQkIgPCBSSFMuQkI7IH0KK307CisKKy8vLyBUaGlzIGlzIGEgcmVzdWx0IGZyb20gYSBOb25Mb2NhbCBkZXBlbmRlbmNlIHF1ZXJ5LgorLy8vCisvLy8gRm9yIGVhY2ggQmFzaWNCbG9jayAodGhlIEJCIGVudHJ5KSBpdCBrZWVwcyBhIE1lbURlcFJlc3VsdCBhbmQgdGhlCisvLy8gKHBvdGVudGlhbGx5IHBoaSB0cmFuc2xhdGVkKSBhZGRyZXNzIHRoYXQgd2FzIGxpdmUgaW4gdGhlIGJsb2NrLgorY2xhc3MgTm9uTG9jYWxEZXBSZXN1bHQgeworICBOb25Mb2NhbERlcEVudHJ5IEVudHJ5OworICBWYWx1ZSAqQWRkcmVzczsKKworcHVibGljOgorICBOb25Mb2NhbERlcFJlc3VsdChCYXNpY0Jsb2NrICpiYiwgTWVtRGVwUmVzdWx0IHJlc3VsdCwgVmFsdWUgKmFkZHJlc3MpCisgICAgICA6IEVudHJ5KGJiLCByZXN1bHQpLCBBZGRyZXNzKGFkZHJlc3MpIHt9CisKKyAgLy8gQkIgaXMgdGhlIHNvcnQga2V5LCBpdCBjYW4ndCBiZSBjaGFuZ2VkLgorICBCYXNpY0Jsb2NrICpnZXRCQigpIGNvbnN0IHsgcmV0dXJuIEVudHJ5LmdldEJCKCk7IH0KKworICB2b2lkIHNldFJlc3VsdChjb25zdCBNZW1EZXBSZXN1bHQgJlIsIFZhbHVlICpBZGRyKSB7CisgICAgRW50cnkuc2V0UmVzdWx0KFIpOworICAgIEFkZHJlc3MgPSBBZGRyOworICB9CisKKyAgY29uc3QgTWVtRGVwUmVzdWx0ICZnZXRSZXN1bHQoKSBjb25zdCB7IHJldHVybiBFbnRyeS5nZXRSZXN1bHQoKTsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoaXMgcG9pbnRlciBpbiB0aGlzIGJsb2NrLgorICAvLy8KKyAgLy8vIFRoaXMgY2FuIGJlIGRpZmZlcmVudCB0aGFuIHRoZSBhZGRyZXNzIHF1ZXJpZWQgZm9yIHRoZSBub24tbG9jYWwgcmVzdWx0CisgIC8vLyBiZWNhdXNlIG9mIHBoaSB0cmFuc2xhdGlvbi4gIFRoaXMgcmV0dXJucyBudWxsIGlmIHRoZSBhZGRyZXNzIHdhcyBub3QKKyAgLy8vIGF2YWlsYWJsZSBpbiBhIGJsb2NrIChpLmUuIGJlY2F1c2UgcGhpIHRyYW5zbGF0aW9uIGZhaWxlZCkgb3IgaWYgdGhpcyBpcworICAvLy8gYSBjYWNoZWQgcmVzdWx0IGFuZCB0aGF0IGFkZHJlc3Mgd2FzIGRlbGV0ZWQuCisgIC8vLworICAvLy8gVGhlIGFkZHJlc3MgaXMgYWx3YXlzIG51bGwgZm9yIGEgbm9uLWxvY2FsICdjYWxsJyBkZXBlbmRlbmNlLgorICBWYWx1ZSAqZ2V0QWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIEFkZHJlc3M7IH0KK307CisKKy8vLyBQcm92aWRlcyBhIGxhenksIGNhY2hpbmcgaW50ZXJmYWNlIGZvciBtYWtpbmcgY29tbW9uIG1lbW9yeSBhbGlhc2luZworLy8vIGluZm9ybWF0aW9uIHF1ZXJpZXMsIGJhY2tlZCBieSBMTFZNJ3MgYWxpYXMgYW5hbHlzaXMgcGFzc2VzLgorLy8vCisvLy8gVGhlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gcmV0dXJuZWQgaXMgc29tZXdoYXQgdW51c3VhbCwgYnV0IGlzIHByYWdtYXRpYy4KKy8vLyBJZiBxdWVyaWVkIGFib3V0IGEgc3RvcmUgb3IgY2FsbCB0aGF0IG1pZ2h0IG1vZGlmeSBtZW1vcnksIHRoZSBhbmFseXNpcworLy8vIHdpbGwgcmV0dXJuIHRoZSBpbnN0cnVjdGlvbltzXSB0aGF0IG1heSBlaXRoZXIgbG9hZCBmcm9tIHRoYXQgbWVtb3J5IG9yCisvLy8gc3RvcmUgdG8gaXQuICBJZiBxdWVyaWVkIHdpdGggYSBsb2FkIG9yIGNhbGwgdGhhdCBjYW4gbmV2ZXIgbW9kaWZ5IG1lbW9yeSwKKy8vLyB0aGUgYW5hbHlzaXMgd2lsbCByZXR1cm4gY2FsbHMgYW5kIHN0b3JlcyB0aGF0IG1pZ2h0IG1vZGlmeSB0aGUgcG9pbnRlciwKKy8vLyBidXQgZ2VuZXJhbGx5IGRvZXMgbm90IHJldHVybiBsb2FkcyB1bmxlc3MgYSkgdGhleSBhcmUgdm9sYXRpbGUsIG9yCisvLy8gYikgdGhleSBsb2FkIGZyb20gKm11c3QtYWxpYXNlZCogcG9pbnRlcnMuICBSZXR1cm5pbmcgYSBkZXBlbmRlbmNlIG9uCisvLy8gbXVzdC1hbGlhcydkIHBvaW50ZXJzIGluc3RlYWQgb2YgYWxsIHBvaW50ZXJzIGludGVyYWN0cyB3ZWxsIHdpdGggdGhlCisvLy8gaW50ZXJuYWwgY2FjaGluZyBtZWNoYW5pc20uCitjbGFzcyBNZW1vcnlEZXBlbmRlbmNlUmVzdWx0cyB7CisgIC8vIEEgbWFwIGZyb20gaW5zdHJ1Y3Rpb25zIHRvIHRoZWlyIGRlcGVuZGVuY3kuCisgIHVzaW5nIExvY2FsRGVwTWFwVHlwZSA9IERlbnNlTWFwPEluc3RydWN0aW9uICosIE1lbURlcFJlc3VsdD47CisgIExvY2FsRGVwTWFwVHlwZSBMb2NhbERlcHM7CisKK3B1YmxpYzoKKyAgdXNpbmcgTm9uTG9jYWxEZXBJbmZvID0gc3RkOjp2ZWN0b3I8Tm9uTG9jYWxEZXBFbnRyeT47CisKK3ByaXZhdGU6CisgIC8vLyBBIHBhaXI8VmFsdWUqLCBib29sPiB3aGVyZSB0aGUgYm9vbCBpcyB0cnVlIGlmIHRoZSBkZXBlbmRlbmNlIGlzIGEgcmVhZAorICAvLy8gb25seSBkZXBlbmRlbmNlLCBmYWxzZSBpZiByZWFkL3dyaXRlLgorICB1c2luZyBWYWx1ZUlzTG9hZFBhaXIgPSBQb2ludGVySW50UGFpcjxjb25zdCBWYWx1ZSAqLCAxLCBib29sPjsKKworICAvLy8gVGhpcyBwYWlyIGlzIHVzZWQgd2hlbiBjYWNoaW5nIGluZm9ybWF0aW9uIGZvciBhIGJsb2NrLgorICAvLy8KKyAgLy8vIElmIHRoZSBwb2ludGVyIGlzIG51bGwsIHRoZSBjYWNoZSB2YWx1ZSBpcyBub3QgYSBmdWxsIHF1ZXJ5IHRoYXQgc3RhcnRzCisgIC8vLyBhdCB0aGUgc3BlY2lmaWVkIGJsb2NrLiAgSWYgbm9uLW51bGwsIHRoZSBib29sIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdAorICAvLy8gdGhlIGNvbnRlbnRzIG9mIHRoZSBibG9jayB3YXMgc2tpcHBlZC4KKyAgdXNpbmcgQkJTa2lwRmlyc3RCbG9ja1BhaXIgPSBQb2ludGVySW50UGFpcjxCYXNpY0Jsb2NrICosIDEsIGJvb2w+OworCisgIC8vLyBUaGlzIHJlY29yZCBpcyB0aGUgaW5mb3JtYXRpb24ga2VwdCBmb3IgZWFjaCAodmFsdWUsIGlzIGxvYWQpIHBhaXIuCisgIHN0cnVjdCBOb25Mb2NhbFBvaW50ZXJJbmZvIHsKKyAgICAvLy8gVGhlIHBhaXIgb2YgdGhlIGJsb2NrIGFuZCB0aGUgc2tpcC1maXJzdC1ibG9jayBmbGFnLgorICAgIEJCU2tpcEZpcnN0QmxvY2tQYWlyIFBhaXI7CisgICAgLy8vIFRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeSBmb3IgZWFjaCByZWxldmFudCBibG9jay4KKyAgICBOb25Mb2NhbERlcEluZm8gTm9uTG9jYWxEZXBzOworICAgIC8vLyBUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBkZXJlZmVyZW5jZXMgb2YgdGhlIHBvaW50ZXIuCisgICAgLy8vCisgICAgLy8vIE1heSBiZSBVbmtub3duU2l6ZSBpZiB0aGUgc2l6ZXMgYXJlIHVua25vd24uCisgICAgdWludDY0X3QgU2l6ZSA9IE1lbW9yeUxvY2F0aW9uOjpVbmtub3duU2l6ZTsKKyAgICAvLy8gVGhlIEFBIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIGRlcmVmZXJlbmNlcyBvZiB0aGUgcG9pbnRlci4KKyAgICAvLy8KKyAgICAvLy8gVGhlIG1lbWJlcnMgbWF5IGJlIG51bGwgaWYgdGhlcmUgYXJlIG5vIHRhZ3Mgb3IgY29uZmxpY3RpbmcgdGFncy4KKyAgICBBQU1ETm9kZXMgQUFUYWdzOworCisgICAgTm9uTG9jYWxQb2ludGVySW5mbygpID0gZGVmYXVsdDsKKyAgfTsKKworICAvLy8gQ2FjaGUgc3RvcmluZyBzaW5nbGUgbm9ubG9jYWwgZGVmIGZvciB0aGUgaW5zdHJ1Y3Rpb24uCisgIC8vLyBJdCBpcyBzZXQgd2hlbiBub25sb2NhbCBkZWYgd291bGQgYmUgZm91bmQgaW4gZnVuY3Rpb24gcmV0dXJuaW5nIG9ubHkKKyAgLy8vIGxvY2FsIGRlcGVuZGVuY2llcy4KKyAgRGVuc2VNYXA8SW5zdHJ1Y3Rpb24gKiwgTm9uTG9jYWxEZXBSZXN1bHQ+IE5vbkxvY2FsRGVmc0NhY2hlOworCisgIC8vLyBUaGlzIG1hcCBzdG9yZXMgdGhlIGNhY2hlZCByZXN1bHRzIG9mIGRvaW5nIGEgcG9pbnRlciBsb29rdXAgYXQgdGhlCisgIC8vLyBib3R0b20gb2YgYSBibG9jay4KKyAgLy8vCisgIC8vLyBUaGUga2V5IG9mIHRoaXMgbWFwIGlzIHRoZSBwb2ludGVyK2lzbG9hZCBiaXQsIHRoZSB2YWx1ZSBpcyBhIGxpc3Qgb2YKKyAgLy8vIDxiYi0+cmVzdWx0PiBtYXBwaW5ncy4KKyAgdXNpbmcgQ2FjaGVkTm9uTG9jYWxQb2ludGVySW5mbyA9CisgICAgICBEZW5zZU1hcDxWYWx1ZUlzTG9hZFBhaXIsIE5vbkxvY2FsUG9pbnRlckluZm8+OworICBDYWNoZWROb25Mb2NhbFBvaW50ZXJJbmZvIE5vbkxvY2FsUG9pbnRlckRlcHM7CisKKyAgLy8gQSBtYXAgZnJvbSBpbnN0cnVjdGlvbnMgdG8gdGhlaXIgbm9uLWxvY2FsIHBvaW50ZXIgZGVwZW5kZW5jaWVzLgorICB1c2luZyBSZXZlcnNlTm9uTG9jYWxQdHJEZXBUeSA9CisgICAgICBEZW5zZU1hcDxJbnN0cnVjdGlvbiAqLCBTbWFsbFB0clNldDxWYWx1ZUlzTG9hZFBhaXIsIDQ+PjsKKyAgUmV2ZXJzZU5vbkxvY2FsUHRyRGVwVHkgUmV2ZXJzZU5vbkxvY2FsUHRyRGVwczsKKworICAvLy8gVGhpcyBpcyB0aGUgaW5zdHJ1Y3Rpb24gd2Uga2VlcCBmb3IgZWFjaCBjYWNoZWQgYWNjZXNzIHRoYXQgd2UgaGF2ZSBmb3IKKyAgLy8vIGFuIGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIFRoZSBwb2ludGVyIGlzIGFuIG93bmluZyBwb2ludGVyIGFuZCB0aGUgYm9vbCBpbmRpY2F0ZXMgd2hldGhlciB3ZSBoYXZlCisgIC8vLyBhbnkgZGlydHkgYml0cyBpbiB0aGUgc2V0LgorICB1c2luZyBQZXJJbnN0TkxJbmZvID0gc3RkOjpwYWlyPE5vbkxvY2FsRGVwSW5mbywgYm9vbD47CisKKyAgLy8gQSBtYXAgZnJvbSBpbnN0cnVjdGlvbnMgdG8gdGhlaXIgbm9uLWxvY2FsIGRlcGVuZGVuY2llcy4KKyAgdXNpbmcgTm9uTG9jYWxEZXBNYXBUeXBlID0gRGVuc2VNYXA8SW5zdHJ1Y3Rpb24gKiwgUGVySW5zdE5MSW5mbz47CisKKyAgTm9uTG9jYWxEZXBNYXBUeXBlIE5vbkxvY2FsRGVwczsKKworICAvLyBBIHJldmVyc2UgbWFwcGluZyBmcm9tIGRlcGVuZGVuY2llcyB0byB0aGUgZGVwZW5kZWVzLiAgVGhpcyBpcworICAvLyB1c2VkIHdoZW4gcmVtb3ZpbmcgaW5zdHJ1Y3Rpb25zIHRvIGtlZXAgdGhlIGNhY2hlIGNvaGVyZW50LgorICB1c2luZyBSZXZlcnNlRGVwTWFwVHlwZSA9CisgICAgICBEZW5zZU1hcDxJbnN0cnVjdGlvbiAqLCBTbWFsbFB0clNldDxJbnN0cnVjdGlvbiAqLCA0Pj47CisgIFJldmVyc2VEZXBNYXBUeXBlIFJldmVyc2VMb2NhbERlcHM7CisKKyAgLy8gQSByZXZlcnNlIG1hcHBpbmcgZnJvbSBkZXBlbmRlbmNpZXMgdG8gdGhlIG5vbi1sb2NhbCBkZXBlbmRlZXMuCisgIFJldmVyc2VEZXBNYXBUeXBlIFJldmVyc2VOb25Mb2NhbERlcHM7CisKKyAgLy8vIEN1cnJlbnQgQUEgaW1wbGVtZW50YXRpb24sIGp1c3QgYSBjYWNoZS4KKyAgQWxpYXNBbmFseXNpcyAmQUE7CisgIEFzc3VtcHRpb25DYWNoZSAmQUM7CisgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICZUTEk7CisgIERvbWluYXRvclRyZWUgJkRUOworICBQcmVkSXRlcmF0b3JDYWNoZSBQcmVkQ2FjaGU7CisKK3B1YmxpYzoKKyAgTWVtb3J5RGVwZW5kZW5jZVJlc3VsdHMoQWxpYXNBbmFseXNpcyAmQUEsIEFzc3VtcHRpb25DYWNoZSAmQUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICZUTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgJkRUKQorICAgICAgOiBBQShBQSksIEFDKEFDKSwgVExJKFRMSSksIERUKERUKSB7fQorCisgIC8vLyBIYW5kbGUgaW52YWxpZGF0aW9uIGluIHRoZSBuZXcgUE0uCisgIGJvb2wgaW52YWxpZGF0ZShGdW5jdGlvbiAmRiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJlBBLAorICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BbmFseXNpc01hbmFnZXI6OkludmFsaWRhdG9yICZJbnYpOworCisgIC8vLyBTb21lIG1ldGhvZHMgbGltaXQgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdGhleSB3aWxsIGV4YW1pbmUuCisgIC8vLyBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgbWV0aG9kIGlzIHRoZSBkZWZhdWx0IGxpbWl0IHRoYXQgd2lsbCBiZQorICAvLy8gdXNlZCBpZiBubyBsaW1pdCBpcyBleHBsaWNpdGx5IHBhc3NlZCBpbi4KKyAgdW5zaWduZWQgZ2V0RGVmYXVsdEJsb2NrU2NhbkxpbWl0KCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIGluc3RydWN0aW9uIG9uIHdoaWNoIGEgbWVtb3J5IG9wZXJhdGlvbiBkZXBlbmRzLgorICAvLy8KKyAgLy8vIFNlZSB0aGUgY2xhc3MgY29tbWVudCBmb3IgbW9yZSBkZXRhaWxzLiBJdCBpcyBpbGxlZ2FsIHRvIGNhbGwgdGhpcyBvbgorICAvLy8gbm9uLW1lbW9yeSBpbnN0cnVjdGlvbnMuCisgIE1lbURlcFJlc3VsdCBnZXREZXBlbmRlbmN5KEluc3RydWN0aW9uICpRdWVyeUluc3QpOworCisgIC8vLyBQZXJmb3JtIGEgZnVsbCBkZXBlbmRlbmN5IHF1ZXJ5IGZvciB0aGUgc3BlY2lmaWVkIGNhbGwsIHJldHVybmluZyB0aGUgc2V0CisgIC8vLyBvZiBibG9ja3MgdGhhdCB0aGUgdmFsdWUgaXMgcG90ZW50aWFsbHkgbGl2ZSBhY3Jvc3MuCisgIC8vLworICAvLy8gVGhlIHJldHVybmVkIHNldCBvZiByZXN1bHRzIHdpbGwgaW5jbHVkZSBhICJOb25Mb2NhbCIgcmVzdWx0IGZvciBhbGwKKyAgLy8vIGJsb2NrcyB3aGVyZSB0aGUgdmFsdWUgaXMgbGl2ZSBhY3Jvc3MuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGUgaW5zdHJ1Y3Rpb24gcmV0dXJucyBhICJOb25Mb2NhbCIgZGVwZW5kZW5jeQorICAvLy8gd2l0aGluIGl0cyBvd24gYmxvY2suCisgIC8vLworICAvLy8gVGhpcyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGFuIGludGVybmFsIGRhdGEgc3RydWN0dXJlIHRoYXQgbWF5IGJlCisgIC8vLyBpbnZhbGlkYXRlZCBvbiB0aGUgbmV4dCBub24tbG9jYWwgcXVlcnkgb3Igd2hlbiBhbiBpbnN0cnVjdGlvbiBpcworICAvLy8gcmVtb3ZlZC4gIENsaWVudHMgbXVzdCBjb3B5IHRoaXMgZGF0YSBpZiB0aGV5IHdhbnQgaXQgYXJvdW5kIGxvbmdlciB0aGFuCisgIC8vLyB0aGF0LgorICBjb25zdCBOb25Mb2NhbERlcEluZm8gJmdldE5vbkxvY2FsQ2FsbERlcGVuZGVuY3koQ2FsbFNpdGUgUXVlcnlDUyk7CisKKyAgLy8vIFBlcmZvcm0gYSBmdWxsIGRlcGVuZGVuY3kgcXVlcnkgZm9yIGFuIGFjY2VzcyB0byB0aGUgUXVlcnlJbnN0J3MKKyAgLy8vIHNwZWNpZmllZCBtZW1vcnkgbG9jYXRpb24sIHJldHVybmluZyB0aGUgc2V0IG9mIGluc3RydWN0aW9ucyB0aGF0IGVpdGhlcgorICAvLy8gZGVmaW5lIG9yIGNsb2JiZXIgdGhlIHZhbHVlLgorICAvLy8KKyAgLy8vIFdhcm5pbmc6IEZvciBhIHZvbGF0aWxlIHF1ZXJ5IGluc3RydWN0aW9uLCB0aGUgZGVwZW5kZW5jaWVzIHdpbGwgYmUKKyAgLy8vIGFjY3VyYXRlLCBhbmQgdGh1cyB1c2FibGUgZm9yIHJlb3JkZXJpbmcsIGJ1dCBpdCBpcyBuZXZlciBsZWdhbCB0bworICAvLy8gcmVtb3ZlIHRoZSBxdWVyeSBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoZSBwb2ludGVyIGhhcyBhICJOb25Mb2NhbCIgZGVwZW5kZW5jeSB3aXRoaW4KKyAgLy8vIFF1ZXJ5SW5zdCdzIHBhcmVudCBiYXNpYyBibG9jay4KKyAgdm9pZCBnZXROb25Mb2NhbFBvaW50ZXJEZXBlbmRlbmN5KEluc3RydWN0aW9uICpRdWVyeUluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Tm9uTG9jYWxEZXBSZXN1bHQ+ICZSZXN1bHQpOworCisgIC8vLyBSZW1vdmVzIGFuIGluc3RydWN0aW9uIGZyb20gdGhlIGRlcGVuZGVuY2UgYW5hbHlzaXMsIHVwZGF0aW5nIHRoZQorICAvLy8gZGVwZW5kZW5jZSBvZiBpbnN0cnVjdGlvbnMgdGhhdCBwcmV2aW91c2x5IGRlcGVuZGVkIG9uIGl0LgorICB2b2lkIHJlbW92ZUluc3RydWN0aW9uKEluc3RydWN0aW9uICpJbnN0VG9SZW1vdmUpOworCisgIC8vLyBJbnZhbGlkYXRlcyBjYWNoZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBwb2ludGVyLCBiZWNhdXNlIGl0CisgIC8vLyBtYXkgYmUgdG9vIGNvbnNlcnZhdGl2ZSBpbiBtZW1kZXAuCisgIC8vLworICAvLy8gVGhpcyBpcyBhbiBvcHRpb25hbCBjYWxsIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiB0aGUgY2xpZW50IGRldGVjdHMgYW4KKyAgLy8vIGVxdWl2YWxlbmNlIGJldHdlZW4gdGhlIHBvaW50ZXIgYW5kIHNvbWUgb3RoZXIgdmFsdWUgYW5kIHJlcGxhY2VzIHRoZQorICAvLy8gb3RoZXIgdmFsdWUgd2l0aCBwdHIuIFRoaXMgY2FuIG1ha2UgUHRyIGF2YWlsYWJsZSBpbiBtb3JlIHBsYWNlcyB0aGF0CisgIC8vLyBjYWNoZWQgaW5mbyBkb2VzIG5vdCBuZWNlc3NhcmlseSBrZWVwLgorICB2b2lkIGludmFsaWRhdGVDYWNoZWRQb2ludGVySW5mbyhWYWx1ZSAqUHRyKTsKKworICAvLy8gQ2xlYXJzIHRoZSBQcmVkSXRlcmF0b3JDYWNoZSBpbmZvLgorICAvLy8KKyAgLy8vIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSB3aGVuIHRoZSBDRkcgY2hhbmdlcywgZS5nLiwgZHVlIHRvIHNwbGl0dGluZworICAvLy8gY3JpdGljYWwgZWRnZXMuCisgIHZvaWQgaW52YWxpZGF0ZUNhY2hlZFByZWRlY2Vzc29ycygpOworCisgIC8vLyBSZXR1cm5zIHRoZSBpbnN0cnVjdGlvbiBvbiB3aGljaCBhIG1lbW9yeSBsb2NhdGlvbiBkZXBlbmRzLgorICAvLy8KKyAgLy8vIElmIGlzTG9hZCBpcyB0cnVlLCB0aGlzIHJvdXRpbmUgaWdub3JlcyBtYXktYWxpYXNlcyB3aXRoIHJlYWQtb25seQorICAvLy8gb3BlcmF0aW9ucy4gIElmIGlzTG9hZCBpcyBmYWxzZSwgdGhpcyByb3V0aW5lIGlnbm9yZXMgbWF5LWFsaWFzZXMKKyAgLy8vIHdpdGggcmVhZHMgZnJvbSByZWFkLW9ubHkgbG9jYXRpb25zLiBJZiBwb3NzaWJsZSwgcGFzcyB0aGUgcXVlcnkKKyAgLy8vIGluc3RydWN0aW9uIGFzIHdlbGw7IHRoaXMgZnVuY3Rpb24gbWF5IHRha2UgYWR2YW50YWdlIG9mIHRoZSBtZXRhZGF0YQorICAvLy8gYW5ub3RhdGVkIHRvIHRoZSBxdWVyeSBpbnN0cnVjdGlvbiB0byByZWZpbmUgdGhlIHJlc3VsdC4gXHAgTGltaXQKKyAgLy8vIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgd2lsbCBiZQorICAvLy8gZXhhbWluZWQgdG8gZmluZCB0aGUgcG9pbnRlciBkZXBlbmRlbmN5LiBPbiByZXR1cm4sIGl0IHdpbGwgYmUgc2V0IHRvCisgIC8vLyB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBsZWZ0IHRvIGV4YW1pbmUuIElmIGEgbnVsbCBwb2ludGVyIGlzIHBhc3NlZAorICAvLy8gaW4sIHRoZSBsaW1pdCB3aWxsIGRlZmF1bHQgdG8gdGhlIHZhbHVlIG9mIC1tZW1kZXAtYmxvY2stc2Nhbi1saW1pdC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBpcyBhbiB1bmNhY2hlZCBxdWVyeSwgYW5kIHRodXMgbWF5IGJlIGluZWZmaWNpZW50LgorICBNZW1EZXBSZXN1bHQgZ2V0UG9pbnRlckRlcGVuZGVuY3lGcm9tKGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MsIGJvb2wgaXNMb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIFNjYW5JdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqUXVlcnlJbnN0ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqTGltaXQgPSBudWxscHRyKTsKKworICBNZW1EZXBSZXN1bHQgZ2V0U2ltcGxlUG9pbnRlckRlcGVuZGVuY3lGcm9tKGNvbnN0IE1lbW9yeUxvY2F0aW9uICZNZW1Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0xvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgU2Nhbkl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpRdWVyeUluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKkxpbWl0ID0gbnVsbHB0cik7CisKKyAgLy8vIFRoaXMgYW5hbHlzaXMgbG9va3MgZm9yIG90aGVyIGxvYWRzIGFuZCBzdG9yZXMgd2l0aCBpbnZhcmlhbnQuZ3JvdXAKKyAgLy8vIG1ldGFkYXRhIGFuZCB0aGUgc2FtZSBwb2ludGVyIG9wZXJhbmQuIFJldHVybnMgVW5rbm93biBpZiBpdCBkb2VzIG5vdAorICAvLy8gZmluZCBhbnl0aGluZywgYW5kIERlZiBpZiBpdCBjYW4gYmUgYXNzdW1lZCB0aGF0IDIgaW5zdHJ1Y3Rpb25zIGxvYWQgb3IKKyAgLy8vIHN0b3JlIHRoZSBzYW1lIHZhbHVlIGFuZCBOb25Mb2NhbCB3aGljaCBpbmRpY2F0ZSB0aGF0IG5vbi1sb2NhbCBEZWYgd2FzCisgIC8vLyBmb3VuZCwgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGdldE5vbkxvY2FsUG9pbnRlckRlcGVuZGVuY3kKKyAgLy8vIHdpdGggdGhlIHNhbWUgcXVlcmllZCBpbnN0cnVjdGlvbi4KKyAgTWVtRGVwUmVzdWx0IGdldEludmFyaWFudEdyb3VwUG9pbnRlckRlcGVuZGVuY3koTG9hZEluc3QgKkxJLCBCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIExvb2tzIGF0IGEgbWVtb3J5IGxvY2F0aW9uIGZvciBhIGxvYWQgKHNwZWNpZmllZCBieSBNZW1Mb2NCYXNlLCBPZmZzLCBhbmQKKyAgLy8vIFNpemUpIGFuZCBjb21wYXJlcyBpdCBhZ2FpbnN0IGEgbG9hZC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgc3BlY2lmaWVkIGxvYWQgY291bGQgYmUgc2FmZWx5IHdpZGVuZWQgdG8gYSBsYXJnZXIgaW50ZWdlciBsb2FkCisgIC8vLyB0aGF0IGlzIDEpIHN0aWxsIGVmZmljaWVudCwgMikgc2FmZSBmb3IgdGhlIHRhcmdldCwgYW5kIDMpIHdvdWxkIHByb3ZpZGUKKyAgLy8vIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGxvY2F0aW9uIHZhbHVlLCB0aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2l6ZQorICAvLy8gaW4gYnl0ZXMgb2YgdGhlIGxvYWQgd2lkdGggdG8gdXNlLiAgSWYgbm90LCB0aGlzIHJldHVybnMgemVyby4KKyAgc3RhdGljIHVuc2lnbmVkIGdldExvYWRMb2FkQ2xvYmJlckZ1bGxXaWR0aFNpemUoY29uc3QgVmFsdWUgKk1lbUxvY0Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgTWVtTG9jT2ZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWVtTG9jU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9hZEluc3QgKkxJKTsKKworICAvLy8gUmVsZWFzZSBtZW1vcnkgaW4gY2FjaGVzLgorICB2b2lkIHJlbGVhc2VNZW1vcnkoKTsKKworcHJpdmF0ZToKKyAgTWVtRGVwUmVzdWx0IGdldENhbGxTaXRlRGVwZW5kZW5jeUZyb20oQ2FsbFNpdGUgQywgYm9vbCBpc1JlYWRPbmx5Q2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgU2Nhbkl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpCQik7CisgIGJvb2wgZ2V0Tm9uTG9jYWxQb2ludGVyRGVwRnJvbUJCKEluc3RydWN0aW9uICpRdWVyeUluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBISVRyYW5zQWRkciAmUG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYywgYm9vbCBpc0xvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Tm9uTG9jYWxEZXBSZXN1bHQ+ICZSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPEJhc2ljQmxvY2sgKiwgVmFsdWUgKj4gJlZpc2l0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2tpcEZpcnN0QmxvY2sgPSBmYWxzZSk7CisgIE1lbURlcFJlc3VsdCBHZXROb25Mb2NhbEluZm9Gb3JCbG9jayhJbnN0cnVjdGlvbiAqUXVlcnlJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYywgYm9vbCBpc0xvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpCQiwgTm9uTG9jYWxEZXBJbmZvICpDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVNvcnRlZEVudHJpZXMpOworCisgIHZvaWQgUmVtb3ZlQ2FjaGVkTm9uTG9jYWxQb2ludGVyRGVwZW5kZW5jaWVzKFZhbHVlSXNMb2FkUGFpciBQKTsKKworICB2b2lkIHZlcmlmeVJlbW92ZWQoSW5zdHJ1Y3Rpb24gKkluc3QpIGNvbnN0OworfTsKKworLy8vIEFuIGFuYWx5c2lzIHRoYXQgcHJvZHVjZXMgXGMgTWVtb3J5RGVwZW5kZW5jZVJlc3VsdHMgZm9yIGEgZnVuY3Rpb24uCisvLy8KKy8vLyBUaGlzIGlzIGVzc2VudGlhbGx5IGEgbm8tb3AgYmVjYXVzZSB0aGUgcmVzdWx0cyBhcmUgY29tcHV0ZWQgZW50aXJlbHkKKy8vLyBsYXppbHkuCitjbGFzcyBNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXMKKyAgICA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjxNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXM+IHsKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPE1lbW9yeURlcGVuZGVuY2VBbmFseXNpcz47CisKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICB1c2luZyBSZXN1bHQgPSBNZW1vcnlEZXBlbmRlbmNlUmVzdWx0czsKKworICBNZW1vcnlEZXBlbmRlbmNlUmVzdWx0cyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gQSB3cmFwcGVyIGFuYWx5c2lzIHBhc3MgZm9yIHRoZSBsZWdhY3kgcGFzcyBtYW5hZ2VyIHRoYXQgZXhwb3NlcyBhIFxjCisvLy8gTWVtb3J5RGVwbmVkZW5jZVJlc3VsdHMgaW5zdGFuY2UuCitjbGFzcyBNZW1vcnlEZXBlbmRlbmNlV3JhcHBlclBhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgT3B0aW9uYWw8TWVtb3J5RGVwZW5kZW5jZVJlc3VsdHM+IE1lbURlcDsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBNZW1vcnlEZXBlbmRlbmNlV3JhcHBlclBhc3MoKTsKKyAgfk1lbW9yeURlcGVuZGVuY2VXcmFwcGVyUGFzcygpIG92ZXJyaWRlOworCisgIC8vLyBQYXNzIEltcGxlbWVudGF0aW9uIHN0dWZmLiAgVGhpcyBkb2Vzbid0IGRvIGFueSBhbmFseXNpcyBlYWdlcmx5LgorICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJikgb3ZlcnJpZGU7CisKKyAgLy8vIENsZWFuIHVwIG1lbW9yeSBpbiBiZXR3ZWVuIHJ1bnMKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGU7CisKKyAgLy8vIERvZXMgbm90IG1vZGlmeSBhbnl0aGluZy4gIEl0IHVzZXMgVmFsdWUgTnVtYmVyaW5nIGFuZCBBbGlhcyBBbmFseXNpcy4KKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICBNZW1vcnlEZXBlbmRlbmNlUmVzdWx0cyAmZ2V0TWVtRGVwKCkgeyByZXR1cm4gKk1lbURlcDsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfTUVNT1JZREVQRU5ERU5DRUFOQUxZU0lTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTWVtb3J5TG9jYXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTWVtb3J5TG9jYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTA4MDc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9NZW1vcnlMb2NhdGlvbi5oCkBAIC0wLDAgKzEsMTQ5IEBACisvLz09PS0gTWVtb3J5TG9jYXRpb24uaCAtIE1lbW9yeSBsb2NhdGlvbiBkZXNjcmlwdGlvbnMgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHV0aWxpdHkgYW5hbHlzaXMgb2JqZWN0cyBkZXNjcmliaW5nIG1lbW9yeSBsb2NhdGlvbnMuCisvLy8gVGhlc2UgYXJlIHVzZWQgYm90aCBieSB0aGUgQWxpYXMgQW5hbHlzaXMgaW5mcmFzdHJ1Y3R1cmUgYW5kIG1vcmUKKy8vLyBzcGVjaWFsaXplZCBtZW1vcnkgYW5hbHlzaXMgbGF5ZXJzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTUVNT1JZTE9DQVRJT05fSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX01FTU9SWUxPQ0FUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvTWV0YWRhdGEuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMb2FkSW5zdDsKK2NsYXNzIFN0b3JlSW5zdDsKK2NsYXNzIE1lbVRyYW5zZmVySW5zdDsKK2NsYXNzIE1lbUludHJpbnNpYzsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworCisvLy8gUmVwcmVzZW50YXRpb24gZm9yIGEgc3BlY2lmaWMgbWVtb3J5IGxvY2F0aW9uLgorLy8vCisvLy8gVGhpcyBhYnN0cmFjdGlvbiBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgYSBzcGVjaWZpYyBsb2NhdGlvbiBpbiBtZW1vcnkuCisvLy8gVGhlIGdvYWwgb2YgdGhlIGxvY2F0aW9uIGlzIHRvIHJlcHJlc2VudCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZGVzY3JpYmUKKy8vLyBhYnN0cmFjdCBhbGlhc2luZywgbW9kaWZpY2F0aW9uLCBhbmQgcmVmZXJlbmNlIGJlaGF2aW9ycyBvZiB3aGF0ZXZlcgorLy8vIHZhbHVlKHMpIGFyZSBzdG9yZWQgaW4gbWVtb3J5IGF0IHRoZSBwYXJ0aWN1bGFyIGxvY2F0aW9uLgorLy8vCisvLy8gVGhlIHByaW1hcnkgdXNlciBvZiB0aGlzIGludGVyZmFjZSBpcyBMTFZNJ3MgQWxpYXMgQW5hbHlzaXMsIGJ1dCBvdGhlcgorLy8vIG1lbW9yeSBhbmFseXNlcyBzdWNoIGFzIE1lbW9yeURlcGVuZGVuY2UgY2FuIHVzZSBpdCBhcyB3ZWxsLgorY2xhc3MgTWVtb3J5TG9jYXRpb24geworcHVibGljOgorICAvLy8gVW5rbm93blNpemUgLSBUaGlzIGlzIGEgc3BlY2lhbCB2YWx1ZSB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIHRoZQorICAvLy8gc2l6ZSBhcmd1bWVudHMgaW4gYWxpYXMgcXVlcmllcyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3QKKyAgLy8vIGtub3cgdGhlIHNpemVzIG9mIHRoZSBwb3RlbnRpYWwgbWVtb3J5IHJlZmVyZW5jZXMuCisgIGVudW0gOiB1aW50NjRfdCB7IFVua25vd25TaXplID0gflVJTlQ2NF9DKDApIH07CisKKyAgLy8vIFRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgbG9jYXRpb24uCisgIGNvbnN0IFZhbHVlICpQdHI7CisKKyAgLy8vIFRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGxvY2F0aW9uLCBpbiBhZGRyZXNzLXVuaXRzLCBvcgorICAvLy8gVW5rbm93blNpemUgaWYgdGhlIHNpemUgaXMgbm90IGtub3duLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBhbiB1bmtub3duIHNpemUgZG9lcyBub3QgbWVhbiB0aGUgcG9pbnRlciBhbGlhc2VzIHRoZSBlbnRpcmUKKyAgLy8vIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSwgYmVjYXVzZSB0aGVyZSBhcmUgcmVzdHJpY3Rpb25zIG9uIHN0ZXBwaW5nIG91dCBvZgorICAvLy8gb25lIG9iamVjdCBhbmQgaW50byBhbm90aGVyLiBTZWUKKyAgLy8vIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xhbmdSZWYuaHRtbCNwb2ludGVyYWxpYXNpbmcKKyAgdWludDY0X3QgU2l6ZTsKKworICAvLy8gVGhlIG1ldGFkYXRhIG5vZGVzIHdoaWNoIGRlc2NyaWJlcyB0aGUgYWxpYXNpbmcgb2YgdGhlIGxvY2F0aW9uIChlYWNoCisgIC8vLyBtZW1iZXIgaXMgbnVsbCBpZiB0aGF0IGtpbmQgb2YgaW5mb3JtYXRpb24gaXMgdW5hdmFpbGFibGUpLgorICBBQU1ETm9kZXMgQUFUYWdzOworCisgIC8vLyBSZXR1cm4gYSBsb2NhdGlvbiB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZW1vcnkgcmVmZXJlbmNlIGJ5IHRoZSBnaXZlbgorICAvLy8gaW5zdHJ1Y3Rpb24uCisgIHN0YXRpYyBNZW1vcnlMb2NhdGlvbiBnZXQoY29uc3QgTG9hZEluc3QgKkxJKTsKKyAgc3RhdGljIE1lbW9yeUxvY2F0aW9uIGdldChjb25zdCBTdG9yZUluc3QgKlNJKTsKKyAgc3RhdGljIE1lbW9yeUxvY2F0aW9uIGdldChjb25zdCBWQUFyZ0luc3QgKlZJKTsKKyAgc3RhdGljIE1lbW9yeUxvY2F0aW9uIGdldChjb25zdCBBdG9taWNDbXBYY2hnSW5zdCAqQ1hJKTsKKyAgc3RhdGljIE1lbW9yeUxvY2F0aW9uIGdldChjb25zdCBBdG9taWNSTVdJbnN0ICpSTVdJKTsKKyAgc3RhdGljIE1lbW9yeUxvY2F0aW9uIGdldChjb25zdCBJbnN0cnVjdGlvbiAqSW5zdCkgeworICAgIHJldHVybiAqTWVtb3J5TG9jYXRpb246OmdldE9yTm9uZShJbnN0KTsKKyAgfQorICBzdGF0aWMgT3B0aW9uYWw8TWVtb3J5TG9jYXRpb24+IGdldE9yTm9uZShjb25zdCBJbnN0cnVjdGlvbiAqSW5zdCkgeworICAgIHN3aXRjaCAoSW5zdC0+Z2V0T3Bjb2RlKCkpIHsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpMb2FkOgorICAgICAgcmV0dXJuIGdldChjYXN0PExvYWRJbnN0PihJbnN0KSk7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U3RvcmU6CisgICAgICByZXR1cm4gZ2V0KGNhc3Q8U3RvcmVJbnN0PihJbnN0KSk7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VkFBcmc6CisgICAgICByZXR1cm4gZ2V0KGNhc3Q8VkFBcmdJbnN0PihJbnN0KSk7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6QXRvbWljQ21wWGNoZzoKKyAgICAgIHJldHVybiBnZXQoY2FzdDxBdG9taWNDbXBYY2hnSW5zdD4oSW5zdCkpOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkF0b21pY1JNVzoKKyAgICAgIHJldHVybiBnZXQoY2FzdDxBdG9taWNSTVdJbnN0PihJbnN0KSk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBOb25lOworICAgIH0KKyAgfQorCisgIC8vLyBSZXR1cm4gYSBsb2NhdGlvbiByZXByZXNlbnRpbmcgdGhlIHNvdXJjZSBvZiBhIG1lbW9yeSB0cmFuc2Zlci4KKyAgc3RhdGljIE1lbW9yeUxvY2F0aW9uIGdldEZvclNvdXJjZShjb25zdCBNZW1UcmFuc2Zlckluc3QgKk1USSk7CisKKyAgLy8vIFJldHVybiBhIGxvY2F0aW9uIHJlcHJlc2VudGluZyB0aGUgZGVzdGluYXRpb24gb2YgYSBtZW1vcnkgc2V0IG9yCisgIC8vLyB0cmFuc2Zlci4KKyAgc3RhdGljIE1lbW9yeUxvY2F0aW9uIGdldEZvckRlc3QoY29uc3QgTWVtSW50cmluc2ljICpNSSk7CisKKyAgLy8vIFJldHVybiBhIGxvY2F0aW9uIHJlcHJlc2VudGluZyBhIHBhcnRpY3VsYXIgYXJndW1lbnQgb2YgYSBjYWxsLgorICBzdGF0aWMgTWVtb3J5TG9jYXRpb24gZ2V0Rm9yQXJndW1lbnQoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsIHVuc2lnbmVkIEFyZ0lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICZUTEkpOworCisgIGV4cGxpY2l0IE1lbW9yeUxvY2F0aW9uKGNvbnN0IFZhbHVlICpQdHIgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplID0gVW5rbm93blNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBTUROb2RlcyAmQUFUYWdzID0gQUFNRE5vZGVzKCkpCisgICAgICA6IFB0cihQdHIpLCBTaXplKFNpemUpLCBBQVRhZ3MoQUFUYWdzKSB7fQorCisgIE1lbW9yeUxvY2F0aW9uIGdldFdpdGhOZXdQdHIoY29uc3QgVmFsdWUgKk5ld1B0cikgY29uc3QgeworICAgIE1lbW9yeUxvY2F0aW9uIENvcHkoKnRoaXMpOworICAgIENvcHkuUHRyID0gTmV3UHRyOworICAgIHJldHVybiBDb3B5OworICB9CisKKyAgTWVtb3J5TG9jYXRpb24gZ2V0V2l0aE5ld1NpemUodWludDY0X3QgTmV3U2l6ZSkgY29uc3QgeworICAgIE1lbW9yeUxvY2F0aW9uIENvcHkoKnRoaXMpOworICAgIENvcHkuU2l6ZSA9IE5ld1NpemU7CisgICAgcmV0dXJuIENvcHk7CisgIH0KKworICBNZW1vcnlMb2NhdGlvbiBnZXRXaXRob3V0QUFUYWdzKCkgY29uc3QgeworICAgIE1lbW9yeUxvY2F0aW9uIENvcHkoKnRoaXMpOworICAgIENvcHkuQUFUYWdzID0gQUFNRE5vZGVzKCk7CisgICAgcmV0dXJuIENvcHk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWVtb3J5TG9jYXRpb24gJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIFB0ciA9PSBPdGhlci5QdHIgJiYgU2l6ZSA9PSBPdGhlci5TaXplICYmIEFBVGFncyA9PSBPdGhlci5BQVRhZ3M7CisgIH0KK307CisKKy8vIFNwZWNpYWxpemUgRGVuc2VNYXBJbmZvIGZvciBNZW1vcnlMb2NhdGlvbi4KK3RlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88TWVtb3J5TG9jYXRpb24+IHsKKyAgc3RhdGljIGlubGluZSBNZW1vcnlMb2NhdGlvbiBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gTWVtb3J5TG9jYXRpb24oRGVuc2VNYXBJbmZvPGNvbnN0IFZhbHVlICo+OjpnZXRFbXB0eUtleSgpLCAwKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIE1lbW9yeUxvY2F0aW9uIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gTWVtb3J5TG9jYXRpb24oRGVuc2VNYXBJbmZvPGNvbnN0IFZhbHVlICo+OjpnZXRUb21ic3RvbmVLZXkoKSwgMCk7CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBNZW1vcnlMb2NhdGlvbiAmVmFsKSB7CisgICAgcmV0dXJuIERlbnNlTWFwSW5mbzxjb25zdCBWYWx1ZSAqPjo6Z2V0SGFzaFZhbHVlKFZhbC5QdHIpIF4KKyAgICAgICAgICAgRGVuc2VNYXBJbmZvPHVpbnQ2NF90Pjo6Z2V0SGFzaFZhbHVlKFZhbC5TaXplKSBeCisgICAgICAgICAgIERlbnNlTWFwSW5mbzxBQU1ETm9kZXM+OjpnZXRIYXNoVmFsdWUoVmFsLkFBVGFncyk7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBNZW1vcnlMb2NhdGlvbiAmTEhTLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9NZW1vcnlTU0EuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTWVtb3J5U1NBLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg5OTg5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTWVtb3J5U1NBLmgKQEAgLTAsMCArMSwxMjMwIEBACisvLz09PS0gTWVtb3J5U1NBLmggLSBCdWlsZCBNZW1vcnkgU1NBIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBUaGlzIGZpbGUgZXhwb3NlcyBhbiBpbnRlcmZhY2UgdG8gYnVpbGRpbmcvdXNpbmcgbWVtb3J5IFNTQSB0bworLy8vIHdhbGsgbWVtb3J5IGluc3RydWN0aW9ucyB1c2luZyBhIHVzZS9kZWYgZ3JhcGguCisvLy8KKy8vLyBNZW1vcnkgU1NBIGNsYXNzIGJ1aWxkcyBhbiBTU0EgZm9ybSB0aGF0IGxpbmtzIHRvZ2V0aGVyIG1lbW9yeSBhY2Nlc3MKKy8vLyBpbnN0cnVjdGlvbnMgc3VjaCBhcyBsb2Fkcywgc3RvcmVzLCBhdG9taWNzLCBhbmQgY2FsbHMuIEFkZGl0aW9uYWxseSwgaXQKKy8vLyBkb2VzIGEgdHJpdmlhbCBmb3JtIG9mICJoZWFwIHZlcnNpb25pbmciIEV2ZXJ5IHRpbWUgdGhlIG1lbW9yeSBzdGF0ZSBjaGFuZ2VzCisvLy8gaW4gdGhlIHByb2dyYW0sIHdlIGdlbmVyYXRlIGEgbmV3IGhlYXAgdmVyc2lvbi4gSXQgZ2VuZXJhdGVzCisvLy8gTWVtb3J5RGVmL1VzZXMvUGhpcyB0aGF0IGFyZSBvdmVybGF5ZWQgb24gdG9wIG9mIHRoZSBleGlzdGluZyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBBcyBhIHRyaXZpYWwgZXhhbXBsZSwKKy8vLyBkZWZpbmUgaTMyIEBtYWluKCkgIzAgeworLy8vIGVudHJ5OgorLy8vICAgJWNhbGwgPSBjYWxsIG5vYWxpYXMgaTgqIEBfWm53bShpNjQgNCkgIzIKKy8vLyAgICUwID0gYml0Y2FzdCBpOCogJWNhbGwgdG8gaTMyKgorLy8vICAgJWNhbGwxID0gY2FsbCBub2FsaWFzIGk4KiBAX1pud20oaTY0IDQpICMyCisvLy8gICAlMSA9IGJpdGNhc3QgaTgqICVjYWxsMSB0byBpMzIqCisvLy8gICBzdG9yZSBpMzIgNSwgaTMyKiAlMCwgYWxpZ24gNAorLy8vICAgc3RvcmUgaTMyIDcsIGkzMiogJTEsIGFsaWduIDQKKy8vLyAgICUyID0gbG9hZCBpMzIqICUwLCBhbGlnbiA0CisvLy8gICAlMyA9IGxvYWQgaTMyKiAlMSwgYWxpZ24gNAorLy8vICAgJWFkZCA9IGFkZCBuc3cgaTMyICUyLCAlMworLy8vICAgcmV0IGkzMiAlYWRkCisvLy8gfQorLy8vCisvLy8gV2lsbCBiZWNvbWUKKy8vLyBkZWZpbmUgaTMyIEBtYWluKCkgIzAgeworLy8vIGVudHJ5OgorLy8vICAgOyAxID0gTWVtb3J5RGVmKDApCisvLy8gICAlY2FsbCA9IGNhbGwgbm9hbGlhcyBpOCogQF9abndtKGk2NCA0KSAjMworLy8vICAgJTIgPSBiaXRjYXN0IGk4KiAlY2FsbCB0byBpMzIqCisvLy8gICA7IDIgPSBNZW1vcnlEZWYoMSkKKy8vLyAgICVjYWxsMSA9IGNhbGwgbm9hbGlhcyBpOCogQF9abndtKGk2NCA0KSAjMworLy8vICAgJTQgPSBiaXRjYXN0IGk4KiAlY2FsbDEgdG8gaTMyKgorLy8vICAgOyAzID0gTWVtb3J5RGVmKDIpCisvLy8gICBzdG9yZSBpMzIgNSwgaTMyKiAlMiwgYWxpZ24gNAorLy8vICAgOyA0ID0gTWVtb3J5RGVmKDMpCisvLy8gICBzdG9yZSBpMzIgNywgaTMyKiAlNCwgYWxpZ24gNAorLy8vICAgOyBNZW1vcnlVc2UoMykKKy8vLyAgICU3ID0gbG9hZCBpMzIqICUyLCBhbGlnbiA0CisvLy8gICA7IE1lbW9yeVVzZSg0KQorLy8vICAgJTggPSBsb2FkIGkzMiogJTQsIGFsaWduIDQKKy8vLyAgICVhZGQgPSBhZGQgbnN3IGkzMiAlNywgJTgKKy8vLyAgIHJldCBpMzIgJWFkZAorLy8vIH0KKy8vLworLy8vIEdpdmVuIHRoaXMgZm9ybSwgYWxsIHRoZSBzdG9yZXMgdGhhdCBjb3VsZCBldmVyIGVmZmVjdCB0aGUgbG9hZCBhdCAlOCBjYW4gYmUKKy8vLyBnb3R0ZW4gYnkgdXNpbmcgdGhlIE1lbW9yeVVzZSBhc3NvY2lhdGVkIHdpdGggaXQsIGFuZCB3YWxraW5nIGZyb20gdXNlIHRvCisvLy8gZGVmIHVudGlsIHlvdSBoaXQgdGhlIHRvcCBvZiB0aGUgZnVuY3Rpb24uCisvLy8KKy8vLyBFYWNoIGRlZiBhbHNvIGhhcyBhIGxpc3Qgb2YgdXNlcnMgYXNzb2NpYXRlZCB3aXRoIGl0LCBzbyB5b3UgY2FuIHdhbGsgZnJvbQorLy8vIGJvdGggZGVmIHRvIHVzZXJzLCBhbmQgdXNlcnMgdG8gZGVmcy4gTm90ZSB0aGF0IHdlIGRpc2FtYmlndWF0ZSBNZW1vcnlVc2VzLAorLy8vIGJ1dCBub3QgdGhlIFJIUyBvZiBNZW1vcnlEZWZzLiBZb3UgY2FuIHNlZSB0aGlzIGFib3ZlIGF0ICU3LCB3aGljaCB3b3VsZAorLy8vIG90aGVyd2lzZSBiZSBhIE1lbW9yeVVzZSg0KS4gQmVpbmcgZGlzYW1iaWd1YXRlZCBtZWFucyB0aGF0IGZvciBhIGdpdmVuCisvLy8gc3RvcmUsIGFsbCB0aGUgTWVtb3J5VXNlcyBvbiBpdHMgdXNlIGxpc3RzIGFyZSBtYXktYWxpYXNlcyBvZiB0aGF0IHN0b3JlCisvLy8gKGJ1dCB0aGUgTWVtb3J5RGVmcyBvbiBpdHMgdXNlIGxpc3QgbWF5IG5vdCBiZSkuCisvLy8KKy8vLyBNZW1vcnlEZWZzIGFyZSBub3QgZGlzYW1iaWd1YXRlZCBiZWNhdXNlIGl0IHdvdWxkIHJlcXVpcmUgbXVsdGlwbGUgcmVhY2hpbmcKKy8vLyBkZWZpbml0aW9ucywgd2hpY2ggd291bGQgcmVxdWlyZSBtdWx0aXBsZSBwaGlzLCBhbmQgbXVsdGlwbGUgbWVtb3J5YWNjZXNzZXMKKy8vLyBwZXIgaW5zdHJ1Y3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX01FTU9SWVNTQV9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTUVNT1JZU1NBX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9ub2RlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL3NpbXBsZV9pbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTWVtb3J5TG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1BISVRyYW5zQWRkci5oIgorI2luY2x1ZGUgImxsdm0vSVIvQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVyaXZlZFVzZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVXNlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Vc2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIE1lbW9yeUFjY2VzczsKK2NsYXNzIE1lbW9yeVNTQVdhbGtlcjsKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBNU1NBSGVscGVycyB7CisKK3N0cnVjdCBBbGxBY2Nlc3NUYWcge307CitzdHJ1Y3QgRGVmc09ubHlUYWcge307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBNU1NBSGVscGVycworCitlbnVtIDogdW5zaWduZWQgeworICAvLyBVc2VkIHRvIHNpZ25pZnkgd2hhdCB0aGUgZGVmYXVsdCBpbnZhbGlkIElEIGlzIGZvciBNZW1vcnlBY2Nlc3MncworICAvLyBnZXRJRCgpCisgIElOVkFMSURfTUVNT1JZQUNDRVNTX0lEID0gLTFVCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvcl9iYXNlOwordXNpbmcgbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvciA9IG1lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3JfYmFzZTxNZW1vcnlBY2Nlc3M+OwordXNpbmcgY29uc3RfbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvciA9CisgICAgbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvcl9iYXNlPGNvbnN0IE1lbW9yeUFjY2Vzcz47CisKKy8vIFxicmllZiBUaGUgYmFzZSBmb3IgYWxsIG1lbW9yeSBhY2Nlc3Nlcy4gQWxsIG1lbW9yeSBhY2Nlc3NlcyBpbiBhIGJsb2NrIGFyZQorLy8gbGlua2VkIHRvZ2V0aGVyIHVzaW5nIGFuIGludHJ1c2l2ZSBsaXN0LgorY2xhc3MgTWVtb3J5QWNjZXNzCisgICAgOiBwdWJsaWMgRGVyaXZlZFVzZXIsCisgICAgICBwdWJsaWMgaWxpc3Rfbm9kZTxNZW1vcnlBY2Nlc3MsIGlsaXN0X3RhZzxNU1NBSGVscGVyczo6QWxsQWNjZXNzVGFnPj4sCisgICAgICBwdWJsaWMgaWxpc3Rfbm9kZTxNZW1vcnlBY2Nlc3MsIGlsaXN0X3RhZzxNU1NBSGVscGVyczo6RGVmc09ubHlUYWc+PiB7CitwdWJsaWM6CisgIHVzaW5nIEFsbEFjY2Vzc1R5cGUgPQorICAgICAgaWxpc3Rfbm9kZTxNZW1vcnlBY2Nlc3MsIGlsaXN0X3RhZzxNU1NBSGVscGVyczo6QWxsQWNjZXNzVGFnPj47CisgIHVzaW5nIERlZnNPbmx5VHlwZSA9CisgICAgICBpbGlzdF9ub2RlPE1lbW9yeUFjY2VzcywgaWxpc3RfdGFnPE1TU0FIZWxwZXJzOjpEZWZzT25seVRhZz4+OworCisgIE1lbW9yeUFjY2Vzcyhjb25zdCBNZW1vcnlBY2Nlc3MgJikgPSBkZWxldGU7CisgIE1lbW9yeUFjY2VzcyAmb3BlcmF0b3I9KGNvbnN0IE1lbW9yeUFjY2VzcyAmKSA9IGRlbGV0ZTsKKworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90KSA9IGRlbGV0ZTsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kCisgIC8vIGR5bl9jYXN0CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICB1bnNpZ25lZCBJRCA9IFYtPmdldFZhbHVlSUQoKTsKKyAgICByZXR1cm4gSUQgPT0gTWVtb3J5VXNlVmFsIHx8IElEID09IE1lbW9yeVBoaVZhbCB8fCBJRCA9PSBNZW1vcnlEZWZWYWw7CisgIH0KKworICBCYXNpY0Jsb2NrICpnZXRCbG9jaygpIGNvbnN0IHsgcmV0dXJuIEJsb2NrOyB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFRoZSB1c2VyIGl0ZXJhdG9ycyBmb3IgYSBtZW1vcnkgYWNjZXNzCisgIHVzaW5nIGl0ZXJhdG9yID0gdXNlcl9pdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBjb25zdF91c2VyX2l0ZXJhdG9yOworCisgIC8vLyBcYnJpZWYgVGhpcyBpdGVyYXRvciB3YWxrcyBvdmVyIGFsbCBvZiB0aGUgZGVmcyBpbiBhIGdpdmVuCisgIC8vLyBNZW1vcnlBY2Nlc3MuIEZvciBNZW1vcnlQaGkgbm9kZXMsIHRoaXMgd2Fsa3MgYXJndW1lbnRzLiBGb3IKKyAgLy8vIE1lbW9yeVVzZS9NZW1vcnlEZWYsIHRoaXMgd2Fsa3MgdGhlIGRlZmluaW5nIGFjY2Vzcy4KKyAgbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvciBkZWZzX2JlZ2luKCk7CisgIGNvbnN0X21lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3IgZGVmc19iZWdpbigpIGNvbnN0OworICBtZW1vcnlhY2Nlc3NfZGVmX2l0ZXJhdG9yIGRlZnNfZW5kKCk7CisgIGNvbnN0X21lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3IgZGVmc19lbmQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgaXRlcmF0b3JzIGZvciB0aGUgYWxsIGFjY2VzcyBsaXN0IGFuZCB0aGUgZGVmcyBvbmx5IGxpc3QKKyAgLy8vIFdlIGRlZmF1bHQgdG8gdGhlIGFsbCBhY2Nlc3MgbGlzdC4KKyAgQWxsQWNjZXNzVHlwZTo6c2VsZl9pdGVyYXRvciBnZXRJdGVyYXRvcigpIHsKKyAgICByZXR1cm4gdGhpcy0+QWxsQWNjZXNzVHlwZTo6Z2V0SXRlcmF0b3IoKTsKKyAgfQorICBBbGxBY2Nlc3NUeXBlOjpjb25zdF9zZWxmX2l0ZXJhdG9yIGdldEl0ZXJhdG9yKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5BbGxBY2Nlc3NUeXBlOjpnZXRJdGVyYXRvcigpOworICB9CisgIEFsbEFjY2Vzc1R5cGU6OnJldmVyc2Vfc2VsZl9pdGVyYXRvciBnZXRSZXZlcnNlSXRlcmF0b3IoKSB7CisgICAgcmV0dXJuIHRoaXMtPkFsbEFjY2Vzc1R5cGU6OmdldFJldmVyc2VJdGVyYXRvcigpOworICB9CisgIEFsbEFjY2Vzc1R5cGU6OmNvbnN0X3JldmVyc2Vfc2VsZl9pdGVyYXRvciBnZXRSZXZlcnNlSXRlcmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPkFsbEFjY2Vzc1R5cGU6OmdldFJldmVyc2VJdGVyYXRvcigpOworICB9CisgIERlZnNPbmx5VHlwZTo6c2VsZl9pdGVyYXRvciBnZXREZWZzSXRlcmF0b3IoKSB7CisgICAgcmV0dXJuIHRoaXMtPkRlZnNPbmx5VHlwZTo6Z2V0SXRlcmF0b3IoKTsKKyAgfQorICBEZWZzT25seVR5cGU6OmNvbnN0X3NlbGZfaXRlcmF0b3IgZ2V0RGVmc0l0ZXJhdG9yKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5EZWZzT25seVR5cGU6OmdldEl0ZXJhdG9yKCk7CisgIH0KKyAgRGVmc09ubHlUeXBlOjpyZXZlcnNlX3NlbGZfaXRlcmF0b3IgZ2V0UmV2ZXJzZURlZnNJdGVyYXRvcigpIHsKKyAgICByZXR1cm4gdGhpcy0+RGVmc09ubHlUeXBlOjpnZXRSZXZlcnNlSXRlcmF0b3IoKTsKKyAgfQorICBEZWZzT25seVR5cGU6OmNvbnN0X3JldmVyc2Vfc2VsZl9pdGVyYXRvciBnZXRSZXZlcnNlRGVmc0l0ZXJhdG9yKCkgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5EZWZzT25seVR5cGU6OmdldFJldmVyc2VJdGVyYXRvcigpOworICB9CisKK3Byb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIE1lbW9yeURlZjsKKyAgZnJpZW5kIGNsYXNzIE1lbW9yeVBoaTsKKyAgZnJpZW5kIGNsYXNzIE1lbW9yeVNTQTsKKyAgZnJpZW5kIGNsYXNzIE1lbW9yeVVzZTsKKyAgZnJpZW5kIGNsYXNzIE1lbW9yeVVzZU9yRGVmOworCisgIC8vLyBcYnJpZWYgVXNlZCBieSBNZW1vcnlTU0EgdG8gY2hhbmdlIHRoZSBibG9jayBvZiBhIE1lbW9yeUFjY2VzcyB3aGVuIGl0IGlzCisgIC8vLyBtb3ZlZC4KKyAgdm9pZCBzZXRCbG9jayhCYXNpY0Jsb2NrICpCQikgeyBCbG9jayA9IEJCOyB9CisKKyAgLy8vIFxicmllZiBVc2VkIGZvciBkZWJ1Z2dpbmcgYW5kIHRyYWNraW5nIHRoaW5ncyBhYm91dCBNZW1vcnlBY2Nlc3Nlcy4KKyAgLy8vIEd1YXJhbnRlZWQgdW5pcXVlIGFtb25nIE1lbW9yeUFjY2Vzc2VzLCBubyBndWFyYW50ZWVzIG90aGVyd2lzZS4KKyAgaW5saW5lIHVuc2lnbmVkIGdldElEKCkgY29uc3Q7CisKKyAgTWVtb3J5QWNjZXNzKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBWdHksIERlbGV0ZVZhbHVlVHkgRGVsZXRlVmFsdWUsCisgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpCQiwgdW5zaWduZWQgTnVtT3BlcmFuZHMpCisgICAgICA6IERlcml2ZWRVc2VyKFR5cGU6OmdldFZvaWRUeShDKSwgVnR5LCBudWxscHRyLCBOdW1PcGVyYW5kcywgRGVsZXRlVmFsdWUpLAorICAgICAgICBCbG9jayhCQikge30KKworICAvLyBVc2UgZGVsZXRlVmFsdWUoKSB0byBkZWxldGUgYSBnZW5lcmljIE1lbW9yeUFjY2Vzcy4KKyAgfk1lbW9yeUFjY2VzcygpID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgQmFzaWNCbG9jayAqQmxvY2s7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGlsaXN0X2FsbG9jX3RyYWl0czxNZW1vcnlBY2Nlc3M+IHsKKyAgc3RhdGljIHZvaWQgZGVsZXRlTm9kZShNZW1vcnlBY2Nlc3MgKk1BKSB7IE1BLT5kZWxldGVWYWx1ZSgpOyB9Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNZW1vcnlBY2Nlc3MgJk1BKSB7CisgIE1BLnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCisvLy8gXGJyaWVmIENsYXNzIHRoYXQgaGFzIHRoZSBjb21tb24gbWV0aG9kcyArIGZpZWxkcyBvZiBtZW1vcnkgdXNlcy9kZWZzLiBJdCdzCisvLy8gYSBsaXR0bGUgYXdrd2FyZCB0byBoYXZlLCBidXQgdGhlcmUgYXJlIG1hbnkgY2FzZXMgd2hlcmUgd2Ugd2FudCBlaXRoZXIgYQorLy8vIHVzZSBvciBkZWYsIGFuZCB0aGVyZSBhcmUgbWFueSBjYXNlcyB3aGVyZSB1c2VzIGFyZSBuZWVkZWQgKGRlZnMgYXJlbid0CisvLy8gYWNjZXB0YWJsZSksIGFuZCB2aWNlLXZlcnNhLgorLy8vCisvLy8gVGhpcyBjbGFzcyBzaG91bGQgbmV2ZXIgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5OyBtYWtlIGEgTWVtb3J5VXNlIG9yCisvLy8gTWVtb3J5RGVmIGluc3RlYWQuCitjbGFzcyBNZW1vcnlVc2VPckRlZiA6IHB1YmxpYyBNZW1vcnlBY2Nlc3MgeworcHVibGljOgorICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90KSA9IGRlbGV0ZTsKKworICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKE1lbW9yeUFjY2Vzcyk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGluc3RydWN0aW9uIHRoYXQgdGhpcyBNZW1vcnlVc2UgcmVwcmVzZW50cy4KKyAgSW5zdHJ1Y3Rpb24gKmdldE1lbW9yeUluc3QoKSBjb25zdCB7IHJldHVybiBNZW1vcnlJbnN0cnVjdGlvbjsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBhY2Nlc3MgdGhhdCBwcm9kdWNlcyB0aGUgbWVtb3J5IHN0YXRlIHVzZWQgYnkgdGhpcyBVc2UuCisgIE1lbW9yeUFjY2VzcyAqZ2V0RGVmaW5pbmdBY2Nlc3MoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqTUEpIHsKKyAgICByZXR1cm4gTUEtPmdldFZhbHVlSUQoKSA9PSBNZW1vcnlVc2VWYWwgfHwgTUEtPmdldFZhbHVlSUQoKSA9PSBNZW1vcnlEZWZWYWw7CisgIH0KKworICAvLyBTYWRseSwgdGhlc2UgaGF2ZSB0byBiZSBwdWJsaWMgYmVjYXVzZSB0aGV5IGFyZSBuZWVkZWQgaW4gc29tZSBvZiB0aGUKKyAgLy8gaXRlcmF0b3JzLgorICBpbmxpbmUgYm9vbCBpc09wdGltaXplZCgpIGNvbnN0OworICBpbmxpbmUgTWVtb3J5QWNjZXNzICpnZXRPcHRpbWl6ZWQoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0T3B0aW1pemVkKE1lbW9yeUFjY2VzcyAqKTsKKworICAvLyBSZXRyaWV2ZSBBbGlhc1Jlc3VsdCB0eXBlIG9mIHRoZSBvcHRpbWl6ZWQgYWNjZXNzLiBJZGVhbGx5IHRoaXMgd291bGQgYmUKKyAgLy8gcmV0dXJuZWQgYnkgdGhlIGNhY2hpbmcgd2Fsa2VyIGFuZCBtYXkgZ28gYXdheSBpbiB0aGUgZnV0dXJlLgorICBPcHRpb25hbDxBbGlhc1Jlc3VsdD4gZ2V0T3B0aW1pemVkQWNjZXNzVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gT3B0aW1pemVkQWNjZXNzQWxpYXM7CisgIH0KKworICAvLy8gXGJyaWVmIFJlc2V0IHRoZSBJRCBvZiB3aGF0IHRoaXMgTWVtb3J5VXNlIHdhcyBvcHRpbWl6ZWQgdG8sIGNhdXNpbmcgaXQgdG8KKyAgLy8vIGJlIHJld2Fsa2VkIGJ5IHRoZSB3YWxrZXIgaWYgbmVjZXNzYXJ5LgorICAvLy8gVGhpcyByZWFsbHkgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHRlc3RzLgorICBpbmxpbmUgdm9pZCByZXNldE9wdGltaXplZCgpOworCitwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBNZW1vcnlTU0E7CisgIGZyaWVuZCBjbGFzcyBNZW1vcnlTU0FVcGRhdGVyOworCisgIE1lbW9yeVVzZU9yRGVmKExMVk1Db250ZXh0ICZDLCBNZW1vcnlBY2Nlc3MgKkRNQSwgdW5zaWduZWQgVnR5LAorICAgICAgICAgICAgICAgICBEZWxldGVWYWx1ZVR5IERlbGV0ZVZhbHVlLCBJbnN0cnVjdGlvbiAqTUksIEJhc2ljQmxvY2sgKkJCKQorICAgICAgOiBNZW1vcnlBY2Nlc3MoQywgVnR5LCBEZWxldGVWYWx1ZSwgQkIsIDEpLCBNZW1vcnlJbnN0cnVjdGlvbihNSSksCisgICAgICAgIE9wdGltaXplZEFjY2Vzc0FsaWFzKE1heUFsaWFzKSB7CisgICAgc2V0RGVmaW5pbmdBY2Nlc3MoRE1BKTsKKyAgfQorCisgIC8vIFVzZSBkZWxldGVWYWx1ZSgpIHRvIGRlbGV0ZSBhIGdlbmVyaWMgTWVtb3J5VXNlT3JEZWYuCisgIH5NZW1vcnlVc2VPckRlZigpID0gZGVmYXVsdDsKKworICB2b2lkIHNldE9wdGltaXplZEFjY2Vzc1R5cGUoT3B0aW9uYWw8QWxpYXNSZXN1bHQ+IEFSKSB7CisgICAgT3B0aW1pemVkQWNjZXNzQWxpYXMgPSBBUjsKKyAgfQorCisgIHZvaWQgc2V0RGVmaW5pbmdBY2Nlc3MoTWVtb3J5QWNjZXNzICpETUEsIGJvb2wgT3B0aW1pemVkID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8QWxpYXNSZXN1bHQ+IEFSID0gTWF5QWxpYXMpIHsKKyAgICBpZiAoIU9wdGltaXplZCkgeworICAgICAgc2V0T3BlcmFuZCgwLCBETUEpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZXRPcHRpbWl6ZWQoRE1BKTsKKyAgICBzZXRPcHRpbWl6ZWRBY2Nlc3NUeXBlKEFSKTsKKyAgfQorCitwcml2YXRlOgorICBJbnN0cnVjdGlvbiAqTWVtb3J5SW5zdHJ1Y3Rpb247CisgIE9wdGlvbmFsPEFsaWFzUmVzdWx0PiBPcHRpbWl6ZWRBY2Nlc3NBbGlhczsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxNZW1vcnlVc2VPckRlZj4KKyAgICA6IHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8TWVtb3J5VXNlT3JEZWYsIDE+IHt9OworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKE1lbW9yeVVzZU9yRGVmLCBNZW1vcnlBY2Nlc3MpCisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyByZWFkLW9ubHkgYWNjZXNzZXMgdG8gbWVtb3J5CisvLy8KKy8vLyBJbiBwYXJ0aWN1bGFyLCB0aGUgc2V0IG9mIEluc3RydWN0aW9ucyB0aGF0IHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkKKy8vLyBNZW1vcnlVc2UncyBpcyBleGFjdGx5IHRoZSBzZXQgb2YgSW5zdHJ1Y3Rpb25zIGZvciB3aGljaAorLy8vIEFsaWFzQW5hbHlzaXM6OmdldE1vZFJlZkluZm8gcmV0dXJucyAiUmVmIi4KK2NsYXNzIE1lbW9yeVVzZSBmaW5hbCA6IHB1YmxpYyBNZW1vcnlVc2VPckRlZiB7CitwdWJsaWM6CisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoTWVtb3J5QWNjZXNzKTsKKworICBNZW1vcnlVc2UoTExWTUNvbnRleHQgJkMsIE1lbW9yeUFjY2VzcyAqRE1BLCBJbnN0cnVjdGlvbiAqTUksIEJhc2ljQmxvY2sgKkJCKQorICAgICAgOiBNZW1vcnlVc2VPckRlZihDLCBETUEsIE1lbW9yeVVzZVZhbCwgZGVsZXRlTWUsIE1JLCBCQikge30KKworICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSBvbmUgb3BlcmFuZAorICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzLCAxKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKk1BKSB7CisgICAgcmV0dXJuIE1BLT5nZXRWYWx1ZUlEKCkgPT0gTWVtb3J5VXNlVmFsOworICB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIHZvaWQgc2V0T3B0aW1pemVkKE1lbW9yeUFjY2VzcyAqRE1BKSB7CisgICAgT3B0aW1pemVkSUQgPSBETUEtPmdldElEKCk7CisgICAgc2V0T3BlcmFuZCgwLCBETUEpOworICB9CisKKyAgYm9vbCBpc09wdGltaXplZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RGVmaW5pbmdBY2Nlc3MoKSAmJiBPcHRpbWl6ZWRJRCA9PSBnZXREZWZpbmluZ0FjY2VzcygpLT5nZXRJRCgpOworICB9CisKKyAgTWVtb3J5QWNjZXNzICpnZXRPcHRpbWl6ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldERlZmluaW5nQWNjZXNzKCk7CisgIH0KKworICB2b2lkIHJlc2V0T3B0aW1pemVkKCkgeworICAgIE9wdGltaXplZElEID0gSU5WQUxJRF9NRU1PUllBQ0NFU1NfSUQ7CisgIH0KKworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgTWVtb3J5U1NBOworCitwcml2YXRlOgorICBzdGF0aWMgdm9pZCBkZWxldGVNZShEZXJpdmVkVXNlciAqU2VsZik7CisKKyAgdW5zaWduZWQgT3B0aW1pemVkSUQgPSBJTlZBTElEX01FTU9SWUFDQ0VTU19JRDsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxNZW1vcnlVc2U+IDogcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czxNZW1vcnlVc2UsIDE+IHt9OworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKE1lbW9yeVVzZSwgTWVtb3J5QWNjZXNzKQorCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSByZWFkLXdyaXRlIGFjY2VzcyB0byBtZW1vcnksIHdoZXRoZXIgaXQgaXMgYSBtdXN0LWFsaWFzLAorLy8vIG9yIGEgbWF5LWFsaWFzLgorLy8vCisvLy8gSW4gcGFydGljdWxhciwgdGhlIHNldCBvZiBJbnN0cnVjdGlvbnMgdGhhdCB3aWxsIGJlIHJlcHJlc2VudGVkIGJ5CisvLy8gTWVtb3J5RGVmJ3MgaXMgZXhhY3RseSB0aGUgc2V0IG9mIEluc3RydWN0aW9ucyBmb3Igd2hpY2gKKy8vLyBBbGlhc0FuYWx5c2lzOjpnZXRNb2RSZWZJbmZvIHJldHVybnMgIk1vZCIgb3IgIk1vZFJlZiIuCisvLy8gTm90ZSB0aGF0LCBpbiBvcmRlciB0byBwcm92aWRlIGRlZi1kZWYgY2hhaW5zLCBhbGwgZGVmcyBhbHNvIGhhdmUgYSB1c2UKKy8vLyBhc3NvY2lhdGVkIHdpdGggdGhlbS4gVGhpcyB1c2UgcG9pbnRzIHRvIHRoZSBuZWFyZXN0IHJlYWNoaW5nCisvLy8gTWVtb3J5RGVmL01lbW9yeVBoaS4KK2NsYXNzIE1lbW9yeURlZiBmaW5hbCA6IHB1YmxpYyBNZW1vcnlVc2VPckRlZiB7CitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBNZW1vcnlTU0E7CisKKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhNZW1vcnlBY2Nlc3MpOworCisgIE1lbW9yeURlZihMTFZNQ29udGV4dCAmQywgTWVtb3J5QWNjZXNzICpETUEsIEluc3RydWN0aW9uICpNSSwgQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICB1bnNpZ25lZCBWZXIpCisgICAgICA6IE1lbW9yeVVzZU9yRGVmKEMsIERNQSwgTWVtb3J5RGVmVmFsLCBkZWxldGVNZSwgTUksIEJCKSwgSUQoVmVyKSB7fQorCisgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IG9uZSBvcGVyYW5kCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeyByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDEpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqTUEpIHsKKyAgICByZXR1cm4gTUEtPmdldFZhbHVlSUQoKSA9PSBNZW1vcnlEZWZWYWw7CisgIH0KKworICB2b2lkIHNldE9wdGltaXplZChNZW1vcnlBY2Nlc3MgKk1BKSB7CisgICAgT3B0aW1pemVkID0gTUE7CisgICAgT3B0aW1pemVkSUQgPSBnZXREZWZpbmluZ0FjY2VzcygpLT5nZXRJRCgpOworICB9CisKKyAgTWVtb3J5QWNjZXNzICpnZXRPcHRpbWl6ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxNZW1vcnlBY2Nlc3M+KE9wdGltaXplZCk7CisgIH0KKworICBib29sIGlzT3B0aW1pemVkKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcHRpbWl6ZWQoKSAmJiBnZXREZWZpbmluZ0FjY2VzcygpICYmCisgICAgICAgICAgIE9wdGltaXplZElEID09IGdldERlZmluaW5nQWNjZXNzKCktPmdldElEKCk7CisgIH0KKworICB2b2lkIHJlc2V0T3B0aW1pemVkKCkgeworICAgIE9wdGltaXplZElEID0gSU5WQUxJRF9NRU1PUllBQ0NFU1NfSUQ7CisgIH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgdW5zaWduZWQgZ2V0SUQoKSBjb25zdCB7IHJldHVybiBJRDsgfQorCitwcml2YXRlOgorICBzdGF0aWMgdm9pZCBkZWxldGVNZShEZXJpdmVkVXNlciAqU2VsZik7CisKKyAgY29uc3QgdW5zaWduZWQgSUQ7CisgIHVuc2lnbmVkIE9wdGltaXplZElEID0gSU5WQUxJRF9NRU1PUllBQ0NFU1NfSUQ7CisgIFdlYWtWSCBPcHRpbWl6ZWQ7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8TWVtb3J5RGVmPiA6IHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8TWVtb3J5RGVmLCAxPiB7fTsKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhNZW1vcnlEZWYsIE1lbW9yeUFjY2VzcykKKworLy8vIFxicmllZiBSZXByZXNlbnRzIHBoaSBub2RlcyBmb3IgbWVtb3J5IGFjY2Vzc2VzLgorLy8vCisvLy8gVGhlc2UgaGF2ZSB0aGUgc2FtZSBzZW1hbnRpYyBhcyByZWd1bGFyIHBoaSBub2Rlcywgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQKKy8vLyBvbmx5IG9uZSBwaGkgd2lsbCBldmVyIGV4aXN0IGluIGEgZ2l2ZW4gYmFzaWMgYmxvY2suCisvLy8gR3VhcmFudGVlaW5nIG9uZSBwaGkgcGVyIGJsb2NrIG1lYW5zIGd1YXJhbnRlZWluZyB0aGVyZSBpcyBvbmx5IGV2ZXIgb25lCisvLy8gdmFsaWQgcmVhY2hpbmcgTWVtb3J5RGVmL01lbW9yeVBISSBhbG9uZyBlYWNoIHBhdGggdG8gdGhlIHBoaSBub2RlLgorLy8vIFRoaXMgaXMgZW5zdXJlZCBieSBub3QgYWxsb3dpbmcgZGlzYW1iaWd1YXRpb24gb2YgdGhlIFJIUyBvZiBhIE1lbW9yeURlZiBvcgorLy8vIGEgTWVtb3J5UGhpJ3Mgb3BlcmFuZHMuCisvLy8gVGhhdCBpcywgZ2l2ZW4KKy8vLyBpZiAoYSkgeworLy8vICAgc3RvcmUgJWEKKy8vLyAgIHN0b3JlICViCisvLy8gfQorLy8vIGl0ICptdXN0KiBiZSB0cmFuc2Zvcm1lZCBpbnRvCisvLy8gaWYgKGEpIHsKKy8vLyAgICAxID0gTWVtb3J5RGVmKGxpdmVPbkVudHJ5KQorLy8vICAgIHN0b3JlICVhCisvLy8gICAgMiA9IE1lbW9yeURlZigxKQorLy8vICAgIHN0b3JlICViCisvLy8gfQorLy8vIGFuZCAqbm90KgorLy8vIGlmIChhKSB7CisvLy8gICAgMSA9IE1lbW9yeURlZihsaXZlT25FbnRyeSkKKy8vLyAgICBzdG9yZSAlYQorLy8vICAgIDIgPSBNZW1vcnlEZWYobGl2ZU9uRW50cnkpCisvLy8gICAgc3RvcmUgJWIKKy8vLyB9CisvLy8gZXZlbiBpZiB0aGUgdHdvIHN0b3JlcyBkbyBub3QgY29uZmxpY3QuIE90aGVyd2lzZSwgYm90aCAxIGFuZCAyIHJlYWNoIHRoZQorLy8vIGVuZCBvZiB0aGUgYnJhbmNoLCBhbmQgaWYgdGhlcmUgYXJlIG5vdCB0d28gcGhpIG5vZGVzLCBvbmUgd2lsbCBiZQorLy8vIGRpc2Nvbm5lY3RlZCBjb21wbGV0ZWx5IGZyb20gdGhlIFNTQSBncmFwaCBiZWxvdyB0aGF0IHBvaW50LgorLy8vIEJlY2F1c2UgTWVtb3J5VXNlJ3MgZG8gbm90IGdlbmVyYXRlIG5ldyBkZWZpbml0aW9ucywgdGhleSBkbyBub3QgaGF2ZSB0aGlzCisvLy8gaXNzdWUuCitjbGFzcyBNZW1vcnlQaGkgZmluYWwgOiBwdWJsaWMgTWVtb3J5QWNjZXNzIHsKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgemVybyBvcGVyYW5kcworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzKTsgfQorCitwdWJsaWM6CisgIC8vLyBQcm92aWRlIGZhc3Qgb3BlcmFuZCBhY2Nlc3NvcnMKKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhNZW1vcnlBY2Nlc3MpOworCisgIE1lbW9yeVBoaShMTFZNQ29udGV4dCAmQywgQmFzaWNCbG9jayAqQkIsIHVuc2lnbmVkIFZlciwgdW5zaWduZWQgTnVtUHJlZHMgPSAwKQorICAgICAgOiBNZW1vcnlBY2Nlc3MoQywgTWVtb3J5UGhpVmFsLCBkZWxldGVNZSwgQkIsIDApLCBJRChWZXIpLAorICAgICAgICBSZXNlcnZlZFNwYWNlKE51bVByZWRzKSB7CisgICAgYWxsb2NIdW5nb2ZmVXNlcyhSZXNlcnZlZFNwYWNlKTsKKyAgfQorCisgIC8vIEJsb2NrIGl0ZXJhdG9yIGludGVyZmFjZS4gVGhpcyBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGxpc3Qgb2YgaW5jb21pbmcKKyAgLy8gYmFzaWMgYmxvY2tzLCB3aGljaCBwYXJhbGxlbHMgdGhlIGxpc3Qgb2YgaW5jb21pbmcgdmFsdWVzLgorICB1c2luZyBibG9ja19pdGVyYXRvciA9IEJhc2ljQmxvY2sgKio7CisgIHVzaW5nIGNvbnN0X2Jsb2NrX2l0ZXJhdG9yID0gQmFzaWNCbG9jayAqY29uc3QgKjsKKworICBibG9ja19pdGVyYXRvciBibG9ja19iZWdpbigpIHsKKyAgICBhdXRvICpSZWYgPSByZWludGVycHJldF9jYXN0PFVzZTo6VXNlclJlZiAqPihvcF9iZWdpbigpICsgUmVzZXJ2ZWRTcGFjZSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8YmxvY2tfaXRlcmF0b3I+KFJlZiArIDEpOworICB9CisKKyAgY29uc3RfYmxvY2tfaXRlcmF0b3IgYmxvY2tfYmVnaW4oKSBjb25zdCB7CisgICAgY29uc3QgYXV0byAqUmVmID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVc2U6OlVzZXJSZWYgKj4ob3BfYmVnaW4oKSArIFJlc2VydmVkU3BhY2UpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0X2Jsb2NrX2l0ZXJhdG9yPihSZWYgKyAxKTsKKyAgfQorCisgIGJsb2NrX2l0ZXJhdG9yIGJsb2NrX2VuZCgpIHsgcmV0dXJuIGJsb2NrX2JlZ2luKCkgKyBnZXROdW1PcGVyYW5kcygpOyB9CisKKyAgY29uc3RfYmxvY2tfaXRlcmF0b3IgYmxvY2tfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBibG9ja19iZWdpbigpICsgZ2V0TnVtT3BlcmFuZHMoKTsKKyAgfQorCisgIGl0ZXJhdG9yX3JhbmdlPGJsb2NrX2l0ZXJhdG9yPiBibG9ja3MoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoYmxvY2tfYmVnaW4oKSwgYmxvY2tfZW5kKCkpOworICB9CisKKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfYmxvY2tfaXRlcmF0b3I+IGJsb2NrcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShibG9ja19iZWdpbigpLCBibG9ja19lbmQoKSk7CisgIH0KKworICBvcF9yYW5nZSBpbmNvbWluZ192YWx1ZXMoKSB7IHJldHVybiBvcGVyYW5kcygpOyB9CisKKyAgY29uc3Rfb3BfcmFuZ2UgaW5jb21pbmdfdmFsdWVzKCkgY29uc3QgeyByZXR1cm4gb3BlcmFuZHMoKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgaW5jb21pbmcgZWRnZXMKKyAgdW5zaWduZWQgZ2V0TnVtSW5jb21pbmdWYWx1ZXMoKSBjb25zdCB7IHJldHVybiBnZXROdW1PcGVyYW5kcygpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gaW5jb21pbmcgdmFsdWUgbnVtYmVyIHgKKyAgTWVtb3J5QWNjZXNzICpnZXRJbmNvbWluZ1ZhbHVlKHVuc2lnbmVkIEkpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoSSk7IH0KKyAgdm9pZCBzZXRJbmNvbWluZ1ZhbHVlKHVuc2lnbmVkIEksIE1lbW9yeUFjY2VzcyAqVikgeworICAgIGFzc2VydChWICYmICJQSEkgbm9kZSBnb3QgYSBudWxsIHZhbHVlISIpOworICAgIHNldE9wZXJhbmQoSSwgVik7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0T3BlcmFuZE51bUZvckluY29taW5nVmFsdWUodW5zaWduZWQgSSkgeyByZXR1cm4gSTsgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0SW5jb21pbmdWYWx1ZU51bUZvck9wZXJhbmQodW5zaWduZWQgSSkgeyByZXR1cm4gSTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGluY29taW5nIGJhc2ljIGJsb2NrIG51bWJlciBAcCBpLgorICBCYXNpY0Jsb2NrICpnZXRJbmNvbWluZ0Jsb2NrKHVuc2lnbmVkIEkpIGNvbnN0IHsgcmV0dXJuIGJsb2NrX2JlZ2luKClbSV07IH0KKworICAvLy8gXGJyaWVmIFJldHVybiBpbmNvbWluZyBiYXNpYyBibG9jayBjb3JyZXNwb25kaW5nCisgIC8vLyB0byBhbiBvcGVyYW5kIG9mIHRoZSBQSEkuCisgIEJhc2ljQmxvY2sgKmdldEluY29taW5nQmxvY2soY29uc3QgVXNlICZVKSBjb25zdCB7CisgICAgYXNzZXJ0KHRoaXMgPT0gVS5nZXRVc2VyKCkgJiYgIkl0ZXJhdG9yIGRvZXNuJ3QgcG9pbnQgdG8gUEhJJ3MgVXNlcz8iKTsKKyAgICByZXR1cm4gZ2V0SW5jb21pbmdCbG9jayh1bnNpZ25lZCgmVSAtIG9wX2JlZ2luKCkpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGluY29taW5nIGJhc2ljIGJsb2NrIGNvcnJlc3BvbmRpbmcKKyAgLy8vIHRvIHZhbHVlIHVzZSBpdGVyYXRvci4KKyAgQmFzaWNCbG9jayAqZ2V0SW5jb21pbmdCbG9jayhNZW1vcnlBY2Nlc3M6OmNvbnN0X3VzZXJfaXRlcmF0b3IgSSkgY29uc3QgeworICAgIHJldHVybiBnZXRJbmNvbWluZ0Jsb2NrKEkuZ2V0VXNlKCkpOworICB9CisKKyAgdm9pZCBzZXRJbmNvbWluZ0Jsb2NrKHVuc2lnbmVkIEksIEJhc2ljQmxvY2sgKkJCKSB7CisgICAgYXNzZXJ0KEJCICYmICJQSEkgbm9kZSBnb3QgYSBudWxsIGJhc2ljIGJsb2NrISIpOworICAgIGJsb2NrX2JlZ2luKClbSV0gPSBCQjsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWRkIGFuIGluY29taW5nIHZhbHVlIHRvIHRoZSBlbmQgb2YgdGhlIFBISSBsaXN0CisgIHZvaWQgYWRkSW5jb21pbmcoTWVtb3J5QWNjZXNzICpWLCBCYXNpY0Jsb2NrICpCQikgeworICAgIGlmIChnZXROdW1PcGVyYW5kcygpID09IFJlc2VydmVkU3BhY2UpCisgICAgICBncm93T3BlcmFuZHMoKTsgLy8gR2V0IG1vcmUgc3BhY2UhCisgICAgLy8gSW5pdGlhbGl6ZSBzb21lIG5ldyBvcGVyYW5kcy4KKyAgICBzZXROdW1IdW5nT2ZmVXNlT3BlcmFuZHMoZ2V0TnVtT3BlcmFuZHMoKSArIDEpOworICAgIHNldEluY29taW5nVmFsdWUoZ2V0TnVtT3BlcmFuZHMoKSAtIDEsIFYpOworICAgIHNldEluY29taW5nQmxvY2soZ2V0TnVtT3BlcmFuZHMoKSAtIDEsIEJCKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBmaXJzdCBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGJhc2ljCisgIC8vLyBibG9jayBpbiB0aGUgdmFsdWUgbGlzdCBmb3IgdGhpcyBQSEkuICBSZXR1cm5zIC0xIGlmIG5vIGluc3RhbmNlLgorICBpbnQgZ2V0QmFzaWNCbG9ja0luZGV4KGNvbnN0IEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IGdldE51bU9wZXJhbmRzKCk7IEkgIT0gRTsgKytJKQorICAgICAgaWYgKGJsb2NrX2JlZ2luKClbSV0gPT0gQkIpCisgICAgICAgIHJldHVybiBJOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIFZhbHVlICpnZXRJbmNvbWluZ1ZhbHVlRm9yQmxvY2soY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICBpbnQgSWR4ID0gZ2V0QmFzaWNCbG9ja0luZGV4KEJCKTsKKyAgICBhc3NlcnQoSWR4ID49IDAgJiYgIkludmFsaWQgYmFzaWMgYmxvY2sgYXJndW1lbnQhIik7CisgICAgcmV0dXJuIGdldEluY29taW5nVmFsdWUoSWR4KTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IE1lbW9yeVBoaVZhbDsKKyAgfQorCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICB1bnNpZ25lZCBnZXRJRCgpIGNvbnN0IHsgcmV0dXJuIElEOyB9CisKK3Byb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIE1lbW9yeVNTQTsKKworICAvLy8gXGJyaWVmIHRoaXMgaXMgbW9yZSBjb21wbGljYXRlZCB0aGFuIHRoZSBnZW5lcmljCisgIC8vLyBVc2VyOjphbGxvY0h1bmdvZmZVc2VzLCBiZWNhdXNlIHdlIGhhdmUgdG8gYWxsb2NhdGUgVXNlcyBmb3IgdGhlIGluY29taW5nCisgIC8vLyB2YWx1ZXMgYW5kIHBvaW50ZXJzIHRvIHRoZSBpbmNvbWluZyBibG9ja3MsIGFsbCBpbiBvbmUgYWxsb2NhdGlvbi4KKyAgdm9pZCBhbGxvY0h1bmdvZmZVc2VzKHVuc2lnbmVkIE4pIHsKKyAgICBVc2VyOjphbGxvY0h1bmdvZmZVc2VzKE4sIC8qIElzUGhpICovIHRydWUpOworICB9CisKK3ByaXZhdGU6CisgIC8vIEZvciBkZWJ1Z2dpbmcgb25seQorICBjb25zdCB1bnNpZ25lZCBJRDsKKyAgdW5zaWduZWQgUmVzZXJ2ZWRTcGFjZTsKKworICAvLy8gXGJyaWVmIFRoaXMgZ3Jvd3MgdGhlIG9wZXJhbmQgbGlzdCBpbiByZXNwb25zZSB0byBhIHB1c2hfYmFjayBzdHlsZSBvZgorICAvLy8gb3BlcmF0aW9uLiAgVGhpcyBncm93cyB0aGUgbnVtYmVyIG9mIG9wcyBieSAxLjUgdGltZXMuCisgIHZvaWQgZ3Jvd09wZXJhbmRzKCkgeworICAgIHVuc2lnbmVkIEUgPSBnZXROdW1PcGVyYW5kcygpOworICAgIC8vIDIgb3AgUEhJIG5vZGVzIGFyZSBWRVJZIGNvbW1vbiwgc28gcmVzZXJ2ZSBhdCBsZWFzdCBlbm91Z2ggZm9yIHRoYXQuCisgICAgUmVzZXJ2ZWRTcGFjZSA9IHN0ZDo6bWF4KEUgKyBFIC8gMiwgMnUpOworICAgIGdyb3dIdW5nb2ZmVXNlcyhSZXNlcnZlZFNwYWNlLCAvKiBJc1BoaSAqLyB0cnVlKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIGRlbGV0ZU1lKERlcml2ZWRVc2VyICpTZWxmKTsKK307CisKK2lubGluZSB1bnNpZ25lZCBNZW1vcnlBY2Nlc3M6OmdldElEKCkgY29uc3QgeworICBhc3NlcnQoKGlzYTxNZW1vcnlEZWY+KHRoaXMpIHx8IGlzYTxNZW1vcnlQaGk+KHRoaXMpKSAmJgorICAgICAgICAgIm9ubHkgbWVtb3J5IGRlZnMgYW5kIHBoaXMgaGF2ZSBpZHMiKTsKKyAgaWYgKGNvbnN0IGF1dG8gKk1EID0gZHluX2Nhc3Q8TWVtb3J5RGVmPih0aGlzKSkKKyAgICByZXR1cm4gTUQtPmdldElEKCk7CisgIHJldHVybiBjYXN0PE1lbW9yeVBoaT4odGhpcyktPmdldElEKCk7Cit9CisKK2lubGluZSBib29sIE1lbW9yeVVzZU9yRGVmOjppc09wdGltaXplZCgpIGNvbnN0IHsKKyAgaWYgKGNvbnN0IGF1dG8gKk1EID0gZHluX2Nhc3Q8TWVtb3J5RGVmPih0aGlzKSkKKyAgICByZXR1cm4gTUQtPmlzT3B0aW1pemVkKCk7CisgIHJldHVybiBjYXN0PE1lbW9yeVVzZT4odGhpcyktPmlzT3B0aW1pemVkKCk7Cit9CisKK2lubGluZSBNZW1vcnlBY2Nlc3MgKk1lbW9yeVVzZU9yRGVmOjpnZXRPcHRpbWl6ZWQoKSBjb25zdCB7CisgIGlmIChjb25zdCBhdXRvICpNRCA9IGR5bl9jYXN0PE1lbW9yeURlZj4odGhpcykpCisgICAgcmV0dXJuIE1ELT5nZXRPcHRpbWl6ZWQoKTsKKyAgcmV0dXJuIGNhc3Q8TWVtb3J5VXNlPih0aGlzKS0+Z2V0T3B0aW1pemVkKCk7Cit9CisKK2lubGluZSB2b2lkIE1lbW9yeVVzZU9yRGVmOjpzZXRPcHRpbWl6ZWQoTWVtb3J5QWNjZXNzICpNQSkgeworICBpZiAoYXV0byAqTUQgPSBkeW5fY2FzdDxNZW1vcnlEZWY+KHRoaXMpKQorICAgIE1ELT5zZXRPcHRpbWl6ZWQoTUEpOworICBlbHNlCisgICAgY2FzdDxNZW1vcnlVc2U+KHRoaXMpLT5zZXRPcHRpbWl6ZWQoTUEpOworfQorCitpbmxpbmUgdm9pZCBNZW1vcnlVc2VPckRlZjo6cmVzZXRPcHRpbWl6ZWQoKSB7CisgIGlmIChhdXRvICpNRCA9IGR5bl9jYXN0PE1lbW9yeURlZj4odGhpcykpCisgICAgTUQtPnJlc2V0T3B0aW1pemVkKCk7CisgIGVsc2UKKyAgICBjYXN0PE1lbW9yeVVzZT4odGhpcyktPnJlc2V0T3B0aW1pemVkKCk7Cit9CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBPcGVyYW5kVHJhaXRzPE1lbW9yeVBoaT4gOiBwdWJsaWMgSHVuZ29mZk9wZXJhbmRUcmFpdHM8Mj4ge307CitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoTWVtb3J5UGhpLCBNZW1vcnlBY2Nlc3MpCisKKy8vLyBcYnJpZWYgRW5jYXBzdWxhdGVzIE1lbW9yeVNTQSwgaW5jbHVkaW5nIGFsbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBtZW1vcnkKKy8vLyBhY2Nlc3Nlcy4KK2NsYXNzIE1lbW9yeVNTQSB7CitwdWJsaWM6CisgIE1lbW9yeVNTQShGdW5jdGlvbiAmLCBBbGlhc0FuYWx5c2lzICosIERvbWluYXRvclRyZWUgKik7CisgIH5NZW1vcnlTU0EoKTsKKworICBNZW1vcnlTU0FXYWxrZXIgKmdldFdhbGtlcigpOworCisgIC8vLyBcYnJpZWYgR2l2ZW4gYSBtZW1vcnkgTW9kL1JlZidpbmcgaW5zdHJ1Y3Rpb24sIGdldCB0aGUgTWVtb3J5U1NBCisgIC8vLyBhY2Nlc3MgYXNzb2NpYXRlZCB3aXRoIGl0LiBJZiBwYXNzZWQgYSBiYXNpYyBibG9jayBnZXRzIHRoZSBtZW1vcnkgcGhpCisgIC8vLyBub2RlIHRoYXQgZXhpc3RzIGZvciB0aGF0IGJsb2NrLCBpZiB0aGVyZSBpcyBvbmUuIE90aGVyd2lzZSwgdGhpcyB3aWxsIGdldAorICAvLy8gYSBNZW1vcnlVc2VPckRlZi4KKyAgTWVtb3J5VXNlT3JEZWYgKmdldE1lbW9yeUFjY2Vzcyhjb25zdCBJbnN0cnVjdGlvbiAqKSBjb25zdDsKKyAgTWVtb3J5UGhpICpnZXRNZW1vcnlBY2Nlc3MoY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0OworCisgIHZvaWQgZHVtcCgpIGNvbnN0OworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICYpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgXHAgTUEgcmVwcmVzZW50cyB0aGUgbGl2ZSBvbiBlbnRyeSB2YWx1ZQorICAvLy8KKyAgLy8vIExvYWRzIGFuZCBzdG9yZXMgZnJvbSBwb2ludGVyIGFyZ3VtZW50cyBhbmQgb3RoZXIgZ2xvYmFsIHZhbHVlcyBtYXkgYmUKKyAgLy8vIGRlZmluZWQgYnkgbWVtb3J5IG9wZXJhdGlvbnMgdGhhdCBkbyBub3Qgb2NjdXIgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24sIHNvCisgIC8vLyB0aGV5IG1heSBiZSBsaXZlIG9uIGVudHJ5IHRvIHRoZSBmdW5jdGlvbi4gTWVtb3J5U1NBIHJlcHJlc2VudHMgc3VjaAorICAvLy8gbWVtb3J5IHN0YXRlIGJ5IHRoZSBsaXZlIG9uIGVudHJ5IGRlZmluaXRpb24sIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gb2NjdXIKKyAgLy8vIGJlZm9yZSBhbnkgb3RoZXIgbWVtb3J5IGFjY2VzcyBpbiB0aGUgZnVuY3Rpb24uCisgIGlubGluZSBib29sIGlzTGl2ZU9uRW50cnlEZWYoY29uc3QgTWVtb3J5QWNjZXNzICpNQSkgY29uc3QgeworICAgIHJldHVybiBNQSA9PSBMaXZlT25FbnRyeURlZi5nZXQoKTsKKyAgfQorCisgIGlubGluZSBNZW1vcnlBY2Nlc3MgKmdldExpdmVPbkVudHJ5RGVmKCkgY29uc3QgeworICAgIHJldHVybiBMaXZlT25FbnRyeURlZi5nZXQoKTsKKyAgfQorCisgIC8vIFNhZGx5LCBpcGxpc3RzLCBieSBkZWZhdWx0LCBvd25zIGFuZCBkZWxldGVzIHBvaW50ZXJzIGFkZGVkIHRvIHRoZQorICAvLyBsaXN0LiBJdCdzIG5vdCBjdXJyZW50bHkgcG9zc2libGUgdG8gaGF2ZSB0d28gaXBsaXN0cyBmb3IgdGhlIHNhbWUgdHlwZSwKKyAgLy8gd2hlcmUgb25lIG93bnMgdGhlIHBvaW50ZXJzLCBhbmQgb25lIGRvZXMgbm90LiBUaGlzIGlzIGJlY2F1c2UgdGhlIHRyYWl0cworICAvLyBhcmUgcGVyLXR5cGUsIG5vdCBwZXItdGFnLiAgSWYgdGhpcyBldmVyIGNoYW5nZXMsIHdlIHNob3VsZCBtYWtlIHRoZQorICAvLyBEZWZMaXN0IGFuIGlwbGlzdC4KKyAgdXNpbmcgQWNjZXNzTGlzdCA9IGlwbGlzdDxNZW1vcnlBY2Nlc3MsIGlsaXN0X3RhZzxNU1NBSGVscGVyczo6QWxsQWNjZXNzVGFnPj47CisgIHVzaW5nIERlZnNMaXN0ID0KKyAgICAgIHNpbXBsZV9pbGlzdDxNZW1vcnlBY2Nlc3MsIGlsaXN0X3RhZzxNU1NBSGVscGVyczo6RGVmc09ubHlUYWc+PjsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbGlzdCBvZiBNZW1vcnlBY2Nlc3MncyBmb3IgYSBnaXZlbiBiYXNpYyBibG9jay4KKyAgLy8vCisgIC8vLyBUaGlzIGxpc3QgaXMgbm90IG1vZGlmaWFibGUgYnkgdGhlIHVzZXIuCisgIGNvbnN0IEFjY2Vzc0xpc3QgKmdldEJsb2NrQWNjZXNzZXMoY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0V3JpdGFibGVCbG9ja0FjY2Vzc2VzKEJCKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBsaXN0IG9mIE1lbW9yeURlZidzIGFuZCBNZW1vcnlQaGkncyBmb3IgYSBnaXZlbiBiYXNpYworICAvLy8gYmxvY2suCisgIC8vLworICAvLy8gVGhpcyBsaXN0IGlzIG5vdCBtb2RpZmlhYmxlIGJ5IHRoZSB1c2VyLgorICBjb25zdCBEZWZzTGlzdCAqZ2V0QmxvY2tEZWZzKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFdyaXRhYmxlQmxvY2tEZWZzKEJCKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2l2ZW4gdHdvIG1lbW9yeSBhY2Nlc3NlcyBpbiB0aGUgc2FtZSBiYXNpYyBibG9jaywgZGV0ZXJtaW5lCisgIC8vLyB3aGV0aGVyIE1lbW9yeUFjY2VzcyBccCBBIGRvbWluYXRlcyBNZW1vcnlBY2Nlc3MgXHAgQi4KKyAgYm9vbCBsb2NhbGx5RG9taW5hdGVzKGNvbnN0IE1lbW9yeUFjY2VzcyAqQSwgY29uc3QgTWVtb3J5QWNjZXNzICpCKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdpdmVuIHR3byBtZW1vcnkgYWNjZXNzZXMgaW4gcG90ZW50aWFsbHkgZGlmZmVyZW50IGJsb2NrcywKKyAgLy8vIGRldGVybWluZSB3aGV0aGVyIE1lbW9yeUFjY2VzcyBccCBBIGRvbWluYXRlcyBNZW1vcnlBY2Nlc3MgXHAgQi4KKyAgYm9vbCBkb21pbmF0ZXMoY29uc3QgTWVtb3J5QWNjZXNzICpBLCBjb25zdCBNZW1vcnlBY2Nlc3MgKkIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2l2ZW4gYSBNZW1vcnlBY2Nlc3MgYW5kIGEgVXNlLCBkZXRlcm1pbmUgd2hldGhlciBNZW1vcnlBY2Nlc3MgXHAgQQorICAvLy8gZG9taW5hdGVzIFVzZSBccCBCLgorICBib29sIGRvbWluYXRlcyhjb25zdCBNZW1vcnlBY2Nlc3MgKkEsIGNvbnN0IFVzZSAmQikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBWZXJpZnkgdGhhdCBNZW1vcnlTU0EgaXMgc2VsZiBjb25zaXN0ZW50IChJRSBkZWZpbml0aW9ucyBkb21pbmF0ZQorICAvLy8gYWxsIHVzZXMsIHVzZXMgYXBwZWFyIGluIHRoZSByaWdodCBwbGFjZXMpLiAgVGhpcyBpcyB1c2VkIGJ5IHVuaXQgdGVzdHMuCisgIHZvaWQgdmVyaWZ5TWVtb3J5U1NBKCkgY29uc3Q7CisKKyAgLy8vIFVzZWQgaW4gdmFyaW91cyBpbnNlcnRpb24gZnVuY3Rpb25zIHRvIHNwZWNpZnkgd2hldGhlciB3ZSBhcmUgdGFsa2luZworICAvLy8gYWJvdXQgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgYSBibG9jay4KKyAgZW51bSBJbnNlcnRpb25QbGFjZSB7IEJlZ2lubmluZywgRW5kIH07CisKK3Byb3RlY3RlZDoKKyAgLy8gVXNlZCBieSBNZW1vcnkgU1NBIGFubm90YXRlciwgZHVtcGVycywgYW5kIHdyYXBwZXIgcGFzcworICBmcmllbmQgY2xhc3MgTWVtb3J5U1NBQW5ub3RhdGVkV3JpdGVyOworICBmcmllbmQgY2xhc3MgTWVtb3J5U1NBUHJpbnRlckxlZ2FjeVBhc3M7CisgIGZyaWVuZCBjbGFzcyBNZW1vcnlTU0FVcGRhdGVyOworCisgIHZvaWQgdmVyaWZ5RGVmVXNlcyhGdW5jdGlvbiAmRikgY29uc3Q7CisgIHZvaWQgdmVyaWZ5RG9taW5hdGlvbihGdW5jdGlvbiAmRikgY29uc3Q7CisgIHZvaWQgdmVyaWZ5T3JkZXJpbmcoRnVuY3Rpb24gJkYpIGNvbnN0OworCisgIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgdXNlIG9wdGltaXplciBhbmQgdXBkYXRlci4KKyAgQWNjZXNzTGlzdCAqZ2V0V3JpdGFibGVCbG9ja0FjY2Vzc2VzKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgYXV0byBJdCA9IFBlckJsb2NrQWNjZXNzZXMuZmluZChCQik7CisgICAgcmV0dXJuIEl0ID09IFBlckJsb2NrQWNjZXNzZXMuZW5kKCkgPyBudWxscHRyIDogSXQtPnNlY29uZC5nZXQoKTsKKyAgfQorCisgIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgdXNlIG9wdGltaXplciBhbmQgdXBkYXRlci4KKyAgRGVmc0xpc3QgKmdldFdyaXRhYmxlQmxvY2tEZWZzKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgYXV0byBJdCA9IFBlckJsb2NrRGVmcy5maW5kKEJCKTsKKyAgICByZXR1cm4gSXQgPT0gUGVyQmxvY2tEZWZzLmVuZCgpID8gbnVsbHB0ciA6IEl0LT5zZWNvbmQuZ2V0KCk7CisgIH0KKworICAvLyBUaGVzZSBpcyB1c2VkIGJ5IHRoZSB1cGRhdGVyIHRvIHBlcmZvcm0gdmFyaW91cyBpbnRlcm5hbCBNZW1vcnlTU0EKKyAgLy8gbWFjaGluc2F0aW9ucy4gIFRoZXkgZG8gbm90IGFsd2F5cyBsZWF2ZSB0aGUgSVIgaW4gYSBjb3JyZWN0IHN0YXRlLCBhbmQKKyAgLy8gcmVsaWVzIG9uIHRoZSB1cGRhdGVyIHRvIGZpeHVwIHdoYXQgaXQgYnJlYWtzLCBzbyBpdCBpcyBub3QgcHVibGljLgorCisgIHZvaWQgbW92ZVRvKE1lbW9yeVVzZU9yRGVmICpXaGF0LCBCYXNpY0Jsb2NrICpCQiwgQWNjZXNzTGlzdDo6aXRlcmF0b3IgV2hlcmUpOworICB2b2lkIG1vdmVUbyhNZW1vcnlVc2VPckRlZiAqV2hhdCwgQmFzaWNCbG9jayAqQkIsIEluc2VydGlvblBsYWNlIFBvaW50KTsKKworICAvLyBSZW5hbWUgdGhlIGRvbWluYXRvciB0cmVlIGJyYW5jaCByb290ZWQgYXQgQkIuCisgIHZvaWQgcmVuYW1lUGFzcyhCYXNpY0Jsb2NrICpCQiwgTWVtb3J5QWNjZXNzICpJbmNvbWluZ1ZhbCwKKyAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0SW1wbDxCYXNpY0Jsb2NrICo+ICZWaXNpdGVkKSB7CisgICAgcmVuYW1lUGFzcyhEVC0+Z2V0Tm9kZShCQiksIEluY29taW5nVmFsLCBWaXNpdGVkLCB0cnVlLCB0cnVlKTsKKyAgfQorCisgIHZvaWQgcmVtb3ZlRnJvbUxvb2t1cHMoTWVtb3J5QWNjZXNzICopOworICB2b2lkIHJlbW92ZUZyb21MaXN0cyhNZW1vcnlBY2Nlc3MgKiwgYm9vbCBTaG91bGREZWxldGUgPSB0cnVlKTsKKyAgdm9pZCBpbnNlcnRJbnRvTGlzdHNGb3JCbG9jayhNZW1vcnlBY2Nlc3MgKiwgY29uc3QgQmFzaWNCbG9jayAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydGlvblBsYWNlKTsKKyAgdm9pZCBpbnNlcnRJbnRvTGlzdHNCZWZvcmUoTWVtb3J5QWNjZXNzICosIGNvbnN0IEJhc2ljQmxvY2sgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzTGlzdDo6aXRlcmF0b3IpOworICBNZW1vcnlVc2VPckRlZiAqY3JlYXRlRGVmaW5lZEFjY2VzcyhJbnN0cnVjdGlvbiAqLCBNZW1vcnlBY2Nlc3MgKik7CisKK3ByaXZhdGU6CisgIGNsYXNzIENhY2hpbmdXYWxrZXI7CisgIGNsYXNzIE9wdGltaXplVXNlczsKKworICBDYWNoaW5nV2Fsa2VyICpnZXRXYWxrZXJJbXBsKCk7CisgIHZvaWQgYnVpbGRNZW1vcnlTU0EoKTsKKyAgdm9pZCBvcHRpbWl6ZVVzZXMoKTsKKworICB2b2lkIHZlcmlmeVVzZUluRGVmcyhNZW1vcnlBY2Nlc3MgKiwgTWVtb3J5QWNjZXNzICopIGNvbnN0OworCisgIHVzaW5nIEFjY2Vzc01hcCA9IERlbnNlTWFwPGNvbnN0IEJhc2ljQmxvY2sgKiwgc3RkOjp1bmlxdWVfcHRyPEFjY2Vzc0xpc3Q+PjsKKyAgdXNpbmcgRGVmc01hcCA9IERlbnNlTWFwPGNvbnN0IEJhc2ljQmxvY2sgKiwgc3RkOjp1bmlxdWVfcHRyPERlZnNMaXN0Pj47CisKKyAgdm9pZAorICBkZXRlcm1pbmVJbnNlcnRpb25Qb2ludChjb25zdCBTbWFsbFB0clNldEltcGw8QmFzaWNCbG9jayAqPiAmRGVmaW5pbmdCbG9ja3MpOworICB2b2lkIG1hcmtVbnJlYWNoYWJsZUFzTGl2ZU9uRW50cnkoQmFzaWNCbG9jayAqQkIpOworICBib29sIGRvbWluYXRlc1VzZShjb25zdCBNZW1vcnlBY2Nlc3MgKiwgY29uc3QgTWVtb3J5QWNjZXNzICopIGNvbnN0OworICBNZW1vcnlQaGkgKmNyZWF0ZU1lbW9yeVBoaShCYXNpY0Jsb2NrICpCQik7CisgIE1lbW9yeVVzZU9yRGVmICpjcmVhdGVOZXdBY2Nlc3MoSW5zdHJ1Y3Rpb24gKik7CisgIE1lbW9yeUFjY2VzcyAqZmluZERvbWluYXRpbmdEZWYoQmFzaWNCbG9jayAqLCBlbnVtIEluc2VydGlvblBsYWNlKTsKKyAgdm9pZCBwbGFjZVBISU5vZGVzKGNvbnN0IFNtYWxsUHRyU2V0SW1wbDxCYXNpY0Jsb2NrICo+ICYsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZW5zZU1hcDxjb25zdCBCYXNpY0Jsb2NrICosIHVuc2lnbmVkIGludD4gJik7CisgIE1lbW9yeUFjY2VzcyAqcmVuYW1lQmxvY2soQmFzaWNCbG9jayAqLCBNZW1vcnlBY2Nlc3MgKiwgYm9vbCk7CisgIHZvaWQgcmVuYW1lU3VjY2Vzc29yUGhpcyhCYXNpY0Jsb2NrICosIE1lbW9yeUFjY2VzcyAqLCBib29sKTsKKyAgdm9pZCByZW5hbWVQYXNzKERvbVRyZWVOb2RlICosIE1lbW9yeUFjY2VzcyAqSW5jb21pbmdWYWwsCisgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldEltcGw8QmFzaWNCbG9jayAqPiAmVmlzaXRlZCwKKyAgICAgICAgICAgICAgICAgIGJvb2wgU2tpcFZpc2l0ZWQgPSBmYWxzZSwgYm9vbCBSZW5hbWVBbGxVc2VzID0gZmFsc2UpOworICBBY2Nlc3NMaXN0ICpnZXRPckNyZWF0ZUFjY2Vzc0xpc3QoY29uc3QgQmFzaWNCbG9jayAqKTsKKyAgRGVmc0xpc3QgKmdldE9yQ3JlYXRlRGVmc0xpc3QoY29uc3QgQmFzaWNCbG9jayAqKTsKKyAgdm9pZCByZW51bWJlckJsb2NrKGNvbnN0IEJhc2ljQmxvY2sgKikgY29uc3Q7CisgIEFsaWFzQW5hbHlzaXMgKkFBOworICBEb21pbmF0b3JUcmVlICpEVDsKKyAgRnVuY3Rpb24gJkY7CisKKyAgLy8gTWVtb3J5IFNTQSBtYXBwaW5ncworICBEZW5zZU1hcDxjb25zdCBWYWx1ZSAqLCBNZW1vcnlBY2Nlc3MgKj4gVmFsdWVUb01lbW9yeUFjY2VzczsKKworICAvLyBUaGVzZSB0d28gbWFwcGluZ3MgY29udGFpbiB0aGUgbWFpbiBibG9jayB0byBhY2Nlc3MvZGVmIG1hcHBpbmdzIGZvcgorICAvLyBNZW1vcnlTU0EuIFRoZSBsaXN0IGNvbnRhaW5lZCBpbiBQZXJCbG9ja0FjY2Vzc2VzIHJlYWxseSBvd25zIGFsbCB0aGUKKyAgLy8gTWVtb3J5QWNjZXNzZXMuCisgIC8vIEJvdGggbWFwcyBtYWludGFpbiB0aGUgaW52YXJpYW50IHRoYXQgaWYgYSBibG9jayBpcyBmb3VuZCBpbiB0aGVtLCB0aGUKKyAgLy8gY29ycmVzcG9uZGluZyBsaXN0IGlzIG5vdCBlbXB0eSwgYW5kIGlmIGEgYmxvY2sgaXMgbm90IGZvdW5kIGluIHRoZW0sIHRoZQorICAvLyBjb3JyZXNwb25kaW5nIGxpc3QgaXMgZW1wdHkuCisgIEFjY2Vzc01hcCBQZXJCbG9ja0FjY2Vzc2VzOworICBEZWZzTWFwIFBlckJsb2NrRGVmczsKKyAgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUFjY2VzcywgVmFsdWVEZWxldGVyPiBMaXZlT25FbnRyeURlZjsKKworICAvLyBEb21pbmF0aW9uIG1hcHBpbmdzCisgIC8vIE5vdGUgdGhhdCB0aGUgbnVtYmVyaW5nIGlzIGxvY2FsIHRvIGEgYmxvY2ssIGV2ZW4gdGhvdWdoIHRoZSBtYXAgaXMKKyAgLy8gZ2xvYmFsLgorICBtdXRhYmxlIFNtYWxsUHRyU2V0PGNvbnN0IEJhc2ljQmxvY2sgKiwgMTY+IEJsb2NrTnVtYmVyaW5nVmFsaWQ7CisgIG11dGFibGUgRGVuc2VNYXA8Y29uc3QgTWVtb3J5QWNjZXNzICosIHVuc2lnbmVkIGxvbmc+IEJsb2NrTnVtYmVyaW5nOworCisgIC8vIE1lbW9yeSBTU0EgYnVpbGRpbmcgaW5mbworICBzdGQ6OnVuaXF1ZV9wdHI8Q2FjaGluZ1dhbGtlcj4gV2Fsa2VyOworICB1bnNpZ25lZCBOZXh0SUQ7Cit9OworCisvLyBJbnRlcm5hbCBNZW1vcnlTU0EgdXRpbHMsIGZvciB1c2UgYnkgTWVtb3J5U1NBIGNsYXNzZXMgYW5kIHdhbGtlcnMKK2NsYXNzIE1lbW9yeVNTQVV0aWwgeworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgR1ZOSG9pc3Q7CisgIGZyaWVuZCBjbGFzcyBNZW1vcnlTU0FXYWxrZXI7CisKKyAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgYnkgbmV3IHBhc3Nlcy4KKyAgc3RhdGljIGJvb2wgZGVmQ2xvYmJlcnNVc2VPckRlZihNZW1vcnlEZWYgKk1ELCBjb25zdCBNZW1vcnlVc2VPckRlZiAqTVUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNBbmFseXNpcyAmQUEpOworfTsKKworLy8gVGhpcyBwYXNzIGRvZXMgZWFnZXIgYnVpbGRpbmcgYW5kIHRoZW4gcHJpbnRpbmcgb2YgTWVtb3J5U1NBLiBJdCBpcyB1c2VkIGJ5CisvLyB0aGUgdGVzdHMgdG8gYmUgYWJsZSB0byBidWlsZCwgZHVtcCwgYW5kIHZlcmlmeSBNZW1vcnkgU1NBLgorY2xhc3MgTWVtb3J5U1NBUHJpbnRlckxlZ2FjeVBhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKK3B1YmxpYzoKKyAgTWVtb3J5U1NBUHJpbnRlckxlZ2FjeVBhc3MoKTsKKworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJikgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGNoYXIgSUQ7Cit9OworCisvLy8gQW4gYW5hbHlzaXMgdGhhdCBwcm9kdWNlcyBcYyBNZW1vcnlTU0EgZm9yIGEgZnVuY3Rpb24uCisvLy8KK2NsYXNzIE1lbW9yeVNTQUFuYWx5c2lzIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPE1lbW9yeVNTQUFuYWx5c2lzPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxNZW1vcnlTU0FBbmFseXNpcz47CisKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICAvLyBXcmFwIE1lbW9yeVNTQSByZXN1bHQgdG8gZW5zdXJlIGFkZHJlc3Mgc3RhYmlsaXR5IG9mIGludGVybmFsIE1lbW9yeVNTQQorICAvLyBwb2ludGVycyBhZnRlciBjb25zdHJ1Y3Rpb24uICBVc2UgYSB3cmFwcGVyIGNsYXNzIGluc3RlYWQgb2YgcGxhaW4KKyAgLy8gdW5pcXVlX3B0cjxNZW1vcnlTU0E+IHRvIGF2b2lkIGJ1aWxkIGJyZWFrYWdlIG9uIE1TVkMuCisgIHN0cnVjdCBSZXN1bHQgeworICAgIFJlc3VsdChzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5U1NBPiAmJk1TU0EpIDogTVNTQShzdGQ6Om1vdmUoTVNTQSkpIHt9CisKKyAgICBNZW1vcnlTU0EgJmdldE1TU0EoKSB7IHJldHVybiAqTVNTQS5nZXQoKTsgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeVNTQT4gTVNTQTsKKyAgfTsKKworICBSZXN1bHQgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIFxicmllZiBQcmludGVyIHBhc3MgZm9yIFxjIE1lbW9yeVNTQS4KK2NsYXNzIE1lbW9yeVNTQVByaW50ZXJQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48TWVtb3J5U1NBUHJpbnRlclBhc3M+IHsKKyAgcmF3X29zdHJlYW0gJk9TOworCitwdWJsaWM6CisgIGV4cGxpY2l0IE1lbW9yeVNTQVByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPUykgOiBPUyhPUykge30KKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIFZlcmlmaWVyIHBhc3MgZm9yIFxjIE1lbW9yeVNTQS4KK3N0cnVjdCBNZW1vcnlTU0FWZXJpZmllclBhc3MgOiBQYXNzSW5mb01peGluPE1lbW9yeVNTQVZlcmlmaWVyUGFzcz4geworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIExlZ2FjeSBhbmFseXNpcyBwYXNzIHdoaWNoIGNvbXB1dGVzIFxjIE1lbW9yeVNTQS4KK2NsYXNzIE1lbW9yeVNTQVdyYXBwZXJQYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CitwdWJsaWM6CisgIE1lbW9yeVNTQVdyYXBwZXJQYXNzKCk7CisKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICYpIG92ZXJyaWRlOworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKyAgTWVtb3J5U1NBICZnZXRNU1NBKCkgeyByZXR1cm4gKk1TU0E7IH0KKyAgY29uc3QgTWVtb3J5U1NBICZnZXRNU1NBKCkgY29uc3QgeyByZXR1cm4gKk1TU0E7IH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgdmVyaWZ5QW5hbHlzaXMoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSAqTSA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5U1NBPiBNU1NBOworfTsKKworLy8vIFxicmllZiBUaGlzIGlzIHRoZSBnZW5lcmljIHdhbGtlciBpbnRlcmZhY2UgZm9yIHdhbGtlcnMgb2YgTWVtb3J5U1NBLgorLy8vIFdhbGtlcnMgYXJlIHVzZWQgdG8gYmUgYWJsZSB0byBmdXJ0aGVyIGRpc2FtYmlndWF0ZSB0aGUgZGVmLXVzZSBjaGFpbnMKKy8vLyBNZW1vcnlTU0EgZ2l2ZXMgeW91LCBvciBvdGhlcndpc2UgcHJvZHVjZSBiZXR0ZXIgaW5mbyB0aGFuIE1lbW9yeVNTQSBnaXZlcworLy8vIHlvdS4KKy8vLyBJbiBwYXJ0aWN1bGFyLCB3aGlsZSB0aGUgZGVmLXVzZSBjaGFpbnMgcHJvdmlkZSBiYXNpYyBpbmZvcm1hdGlvbiwgYW5kIGFyZQorLy8vIGd1YXJhbnRlZWQgdG8gZ2l2ZSwgZm9yIGV4YW1wbGUsIHRoZSBuZWFyZXN0IG1heS1hbGlhc2luZyBNZW1vcnlEZWYgZm9yIGEKKy8vLyBNZW1vcnlVc2UgYXMgQWxpYXNBbmFseXNpcyBjb25zaWRlcnMgaXQsIGEgdXNlciBtYW50IHdhbnQgYmV0dGVyIG9yIG90aGVyCisvLy8gaW5mb3JtYXRpb24uIEluIHBhcnRpY3VsYXIsIHRoZXkgbWF5IHdhbnQgdG8gdXNlIFNDRVYgaW5mbyB0byBmdXJ0aGVyCisvLy8gZGlzYW1iaWd1YXRlIG1lbW9yeSBhY2Nlc3Nlcywgb3IgdGhleSBtYXkgd2FudCB0aGUgbmVhcmVzdCBkb21pbmF0aW5nCisvLy8gbWF5LWFsaWFzaW5nIE1lbW9yeURlZiBmb3IgYSBjYWxsIG9yIGEgc3RvcmUuIFRoaXMgQVBJIGVuYWJsZXMgYQorLy8vIHN0YW5kYXJkaXplZCBpbnRlcmZhY2UgdG8gZ2V0dGluZyBhbmQgdXNpbmcgdGhhdCBpbmZvLgorY2xhc3MgTWVtb3J5U1NBV2Fsa2VyIHsKK3B1YmxpYzoKKyAgTWVtb3J5U1NBV2Fsa2VyKE1lbW9yeVNTQSAqKTsKKyAgdmlydHVhbCB+TWVtb3J5U1NBV2Fsa2VyKCkgPSBkZWZhdWx0OworCisgIHVzaW5nIE1lbW9yeUFjY2Vzc1NldCA9IFNtYWxsVmVjdG9yPE1lbW9yeUFjY2VzcyAqLCA4PjsKKworICAvLy8gXGJyaWVmIEdpdmVuIGEgbWVtb3J5IE1vZC9SZWYvTW9kUmVmJ2luZyBpbnN0cnVjdGlvbiwgY2FsbGluZyB0aGlzCisgIC8vLyB3aWxsIGdpdmUgeW91IHRoZSBuZWFyZXN0IGRvbWluYXRpbmcgTWVtb3J5QWNjZXNzIHRoYXQgTW9kJ3MgdGhlIGxvY2F0aW9uCisgIC8vLyB0aGUgaW5zdHJ1Y3Rpb24gYWNjZXNzZXMgKGJ5IHNraXBwaW5nIGFueSBkZWYgd2hpY2ggQUEgY2FuIHByb3ZlIGRvZXMgbm90CisgIC8vLyBhbGlhcyB0aGUgbG9jYXRpb24ocykgYWNjZXNzZWQgYnkgdGhlIGluc3RydWN0aW9uIGdpdmVuKS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyB3aWxsIHJldHVybiBhIHNpbmdsZSBhY2Nlc3MsIGFuZCBpdCBtdXN0IGRvbWluYXRlIHRoZQorICAvLy8gSW5zdHJ1Y3Rpb24sIHNvIGlmIGFuIG9wZXJhbmQgb2YgYSBNZW1vcnlQaGkgbm9kZSBNb2QncyB0aGUgaW5zdHJ1Y3Rpb24sCisgIC8vLyB0aGlzIHdpbGwgcmV0dXJuIHRoZSBNZW1vcnlQaGksIG5vdCB0aGUgb3BlcmFuZC4gVGhpcyBtZWFucyB0aGF0CisgIC8vLyBnaXZlbjoKKyAgLy8vIGlmIChhKSB7CisgIC8vLyAgIDEgPSBNZW1vcnlEZWYobGl2ZU9uRW50cnkpCisgIC8vLyAgIHN0b3JlICVhCisgIC8vLyB9IGVsc2UgeworICAvLy8gICAyID0gTWVtb3J5RGVmKGxpdmVPbkVudHJ5KQorICAvLy8gICBzdG9yZSAlYgorICAvLy8gfQorICAvLy8gMyA9IE1lbW9yeVBoaSgyLCAxKQorICAvLy8gTWVtb3J5VXNlKDMpCisgIC8vLyBsb2FkICVhCisgIC8vLworICAvLy8gY2FsbGluZyB0aGlzIEFQSSBvbiBsb2FkKCVhKSB3aWxsIHJldHVybiB0aGUgTWVtb3J5UGhpLCBub3QgdGhlIE1lbW9yeURlZgorICAvLy8gaW4gdGhlIGlmIChhKSBicmFuY2guCisgIE1lbW9yeUFjY2VzcyAqZ2V0Q2xvYmJlcmluZ01lbW9yeUFjY2Vzcyhjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIE1lbW9yeUFjY2VzcyAqTUEgPSBNU1NBLT5nZXRNZW1vcnlBY2Nlc3MoSSk7CisgICAgYXNzZXJ0KE1BICYmICJIYW5kZWQgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBNZW1vcnlTU0EgZG9lc24ndCByZWNvZ25pemU/Iik7CisgICAgcmV0dXJuIGdldENsb2JiZXJpbmdNZW1vcnlBY2Nlc3MoTUEpOworICB9CisKKyAgLy8vIERvZXMgdGhlIHNhbWUgdGhpbmcgYXMgZ2V0Q2xvYmJlcmluZ01lbW9yeUFjY2Vzcyhjb25zdCBJbnN0cnVjdGlvbiAqSSksCisgIC8vLyBidXQgdGFrZXMgYSBNZW1vcnlBY2Nlc3MgaW5zdGVhZCBvZiBhbiBJbnN0cnVjdGlvbi4KKyAgdmlydHVhbCBNZW1vcnlBY2Nlc3MgKmdldENsb2JiZXJpbmdNZW1vcnlBY2Nlc3MoTWVtb3J5QWNjZXNzICopID0gMDsKKworICAvLy8gXGJyaWVmIEdpdmVuIGEgcG90ZW50aWFsbHkgY2xvYmJlcmluZyBtZW1vcnkgYWNjZXNzIGFuZCBhIG5ldyBsb2NhdGlvbiwKKyAgLy8vIGNhbGxpbmcgdGhpcyB3aWxsIGdpdmUgeW91IHRoZSBuZWFyZXN0IGRvbWluYXRpbmcgY2xvYmJlcmluZyBNZW1vcnlBY2Nlc3MKKyAgLy8vIChieSBza2lwcGluZyBub24tYWxpYXNpbmcgZGVmIGxpbmtzKS4KKyAgLy8vCisgIC8vLyBUaGlzIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIGlzIG1haW5seSB1c2VkIHRvIGRpc2FtYmlndWF0ZSBwaGkgdHJhbnNsYXRlZAorICAvLy8gcG9pbnRlcnMsIHdoZXJlIHRoZSB2YWx1ZSBvZiBhIHBvaW50ZXIgbWF5IGhhdmUgY2hhbmdlZCBmcm9tIHRoZSBpbml0aWFsCisgIC8vLyBtZW1vcnkgYWNjZXNzLiBOb3RlIHRoYXQgdGhpcyBleHBlY3RzIHRvIGJlIGhhbmRlZCBlaXRoZXIgYSBNZW1vcnlVc2UsCisgIC8vLyBvciBhbiBhbHJlYWR5IHBvdGVudGlhbGx5IGNsb2JiZXJpbmcgYWNjZXNzLiBVbmxpa2UgdGhlIGFib3ZlIEFQSSwgaWYKKyAgLy8vIGdpdmVuIGEgTWVtb3J5RGVmIHRoYXQgY2xvYmJlcnMgdGhlIHBvaW50ZXIgYXMgdGhlIHN0YXJ0aW5nIGFjY2VzcywgaXQKKyAgLy8vIHdpbGwgcmV0dXJuIHRoYXQgTWVtb3J5RGVmLCB3aGVyZWFzIHRoZSBhYm92ZSB3b3VsZCByZXR1cm4gdGhlIGNsb2JiZXIKKyAgLy8vIHN0YXJ0aW5nIGZyb20gdGhlIHVzZSBzaWRlIG9mICB0aGUgbWVtb3J5IGRlZi4KKyAgdmlydHVhbCBNZW1vcnlBY2Nlc3MgKmdldENsb2JiZXJpbmdNZW1vcnlBY2Nlc3MoTWVtb3J5QWNjZXNzICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbW9yeUxvY2F0aW9uICYpID0gMDsKKworICAvLy8gXGJyaWVmIEdpdmVuIGEgbWVtb3J5IGFjY2VzcywgaW52YWxpZGF0ZSBhbnl0aGluZyB0aGlzIHdhbGtlciBrbm93cyBhYm91dAorICAvLy8gdGhhdCBhY2Nlc3MuCisgIC8vLyBUaGlzIEFQSSBpcyB1c2VkIGJ5IHdhbGtlcnMgdGhhdCBzdG9yZSBpbmZvcm1hdGlvbiB0byBwZXJmb3JtIGJhc2ljIGNhY2hlCisgIC8vLyBpbnZhbGlkYXRpb24uICBUaGlzIHdpbGwgYmUgY2FsbGVkIGJ5IE1lbW9yeVNTQSBhdCBhcHByb3ByaWF0ZSB0aW1lcyBmb3IKKyAgLy8vIHRoZSB3YWxrZXIgaXQgdXNlcyBvciByZXR1cm5zLgorICB2aXJ0dWFsIHZvaWQgaW52YWxpZGF0ZUluZm8oTWVtb3J5QWNjZXNzICopIHt9CisKKyAgdmlydHVhbCB2b2lkIHZlcmlmeShjb25zdCBNZW1vcnlTU0EgKk1TU0EpIHsgYXNzZXJ0KE1TU0EgPT0gdGhpcy0+TVNTQSk7IH0KKworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgTWVtb3J5U1NBOyAvLyBGb3IgdXBkYXRpbmcgTVNTQSBwb2ludGVyIGluIE1lbW9yeVNTQSBtb3ZlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0cnVjdG9yLgorICBNZW1vcnlTU0EgKk1TU0E7Cit9OworCisvLy8gXGJyaWVmIEEgTWVtb3J5U1NBV2Fsa2VyIHRoYXQgZG9lcyBubyBhbGlhcyBxdWVyaWVzLCBvciBhbnl0aGluZyBlbHNlLiBJdAorLy8vIHNpbXBseSByZXR1cm5zIHRoZSBsaW5rcyBhcyB0aGV5IHdlcmUgY29uc3RydWN0ZWQgYnkgdGhlIGJ1aWxkZXIuCitjbGFzcyBEb05vdGhpbmdNZW1vcnlTU0FXYWxrZXIgZmluYWwgOiBwdWJsaWMgTWVtb3J5U1NBV2Fsa2VyIHsKK3B1YmxpYzoKKyAgLy8gS2VlcCB0aGUgb3ZlcnJpZGVzIGJlbG93IGZyb20gaGlkaW5nIHRoZSBJbnN0cnVjdGlvbiBvdmVybG9hZCBvZgorICAvLyBnZXRDbG9iYmVyaW5nTWVtb3J5QWNjZXNzLgorICB1c2luZyBNZW1vcnlTU0FXYWxrZXI6OmdldENsb2JiZXJpbmdNZW1vcnlBY2Nlc3M7CisKKyAgTWVtb3J5QWNjZXNzICpnZXRDbG9iYmVyaW5nTWVtb3J5QWNjZXNzKE1lbW9yeUFjY2VzcyAqKSBvdmVycmlkZTsKKyAgTWVtb3J5QWNjZXNzICpnZXRDbG9iYmVyaW5nTWVtb3J5QWNjZXNzKE1lbW9yeUFjY2VzcyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5TG9jYXRpb24gJikgb3ZlcnJpZGU7Cit9OworCit1c2luZyBNZW1vcnlBY2Nlc3NQYWlyID0gc3RkOjpwYWlyPE1lbW9yeUFjY2VzcyAqLCBNZW1vcnlMb2NhdGlvbj47Cit1c2luZyBDb25zdE1lbW9yeUFjY2Vzc1BhaXIgPSBzdGQ6OnBhaXI8Y29uc3QgTWVtb3J5QWNjZXNzICosIE1lbW9yeUxvY2F0aW9uPjsKKworLy8vIFxicmllZiBJdGVyYXRvciBiYXNlIGNsYXNzIHVzZWQgdG8gaW1wbGVtZW50IGNvbnN0IGFuZCBub24tY29uc3QgaXRlcmF0b3JzCisvLy8gb3ZlciB0aGUgZGVmaW5pbmcgYWNjZXNzZXMgb2YgYSBNZW1vcnlBY2Nlc3MuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NsYXNzIG1lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3JfYmFzZQorICAgIDogcHVibGljIGl0ZXJhdG9yX2ZhY2FkZV9iYXNlPG1lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3JfYmFzZTxUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBULCBwdHJkaWZmX3QsIFQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICo+IHsKKyAgdXNpbmcgQmFzZVQgPSB0eXBlbmFtZSBtZW1vcnlhY2Nlc3NfZGVmX2l0ZXJhdG9yX2Jhc2U6Oml0ZXJhdG9yX2ZhY2FkZV9iYXNlOworCitwdWJsaWM6CisgIG1lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3JfYmFzZShUICpTdGFydCkgOiBBY2Nlc3MoU3RhcnQpIHt9CisgIG1lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3JfYmFzZSgpID0gZGVmYXVsdDsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvcl9iYXNlICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBBY2Nlc3MgPT0gT3RoZXIuQWNjZXNzICYmICghQWNjZXNzIHx8IEFyZ05vID09IE90aGVyLkFyZ05vKTsKKyAgfQorCisgIC8vIFRoaXMgaXMgYSBiaXQgdWdseSwgYnV0IGZvciBNZW1vcnlQSEkncywgdW5saWtlIFBISU5vZGVzLCB5b3UgY2FuJ3QgZ2V0IHRoZQorICAvLyBibG9jayBmcm9tIHRoZSBvcGVyYW5kIGluIGNvbnN0YW50IHRpbWUgKEluIGEgUEhJTm9kZSwgdGhlIHVzZWxpc3QgaGFzCisgIC8vIGJvdGgsIHNvIGl0J3MganVzdCBzdWJ0cmFjdGlvbikuIFdlIHByb3ZpZGUgaXQgYXMgcGFydCBvZiB0aGUKKyAgLy8gaXRlcmF0b3IgdG8gYXZvaWQgY2FsbGVycyBoYXZpbmcgdG8gbGluZWFyIHdhbGsgdG8gZ2V0IHRoZSBibG9jay4KKyAgLy8gSWYgdGhlIG9wZXJhdGlvbiBiZWNvbWVzIGNvbnN0YW50IHRpbWUgb24gTWVtb3J5UEhJJ3MsIHRoaXMgYml0IG9mCisgIC8vIGFic3RyYWN0aW9uIGJyZWFraW5nIHNob3VsZCBiZSByZW1vdmVkLgorICBCYXNpY0Jsb2NrICpnZXRQaGlBcmdCbG9jaygpIGNvbnN0IHsKKyAgICBNZW1vcnlQaGkgKk1QID0gZHluX2Nhc3Q8TWVtb3J5UGhpPihBY2Nlc3MpOworICAgIGFzc2VydChNUCAmJiAiVHJpZWQgdG8gZ2V0IHBoaSBhcmcgYmxvY2sgd2hlbiBub3QgaXRlcmF0aW5nIG92ZXIgYSBQSEkiKTsKKyAgICByZXR1cm4gTVAtPmdldEluY29taW5nQmxvY2soQXJnTm8pOworICB9CisKKyAgdHlwZW5hbWUgQmFzZVQ6Oml0ZXJhdG9yOjpwb2ludGVyIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICBhc3NlcnQoQWNjZXNzICYmICJUcmllZCB0byBhY2Nlc3MgcGFzdCB0aGUgZW5kIG9mIG91ciBpdGVyYXRvciIpOworICAgIC8vIEdvIHRvIHRoZSBmaXJzdCBhcmd1bWVudCBmb3IgcGhpcywgYW5kIHRoZSBkZWZpbmluZyBhY2Nlc3MgZm9yIGV2ZXJ5dGhpbmcKKyAgICAvLyBlbHNlLgorICAgIGlmIChNZW1vcnlQaGkgKk1QID0gZHluX2Nhc3Q8TWVtb3J5UGhpPihBY2Nlc3MpKQorICAgICAgcmV0dXJuIE1QLT5nZXRJbmNvbWluZ1ZhbHVlKEFyZ05vKTsKKyAgICByZXR1cm4gY2FzdDxNZW1vcnlVc2VPckRlZj4oQWNjZXNzKS0+Z2V0RGVmaW5pbmdBY2Nlc3MoKTsKKyAgfQorCisgIHVzaW5nIEJhc2VUOjpvcGVyYXRvcisrOworICBtZW1vcnlhY2Nlc3NfZGVmX2l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgIGFzc2VydChBY2Nlc3MgJiYgIkhpdCBlbmQgb2YgaXRlcmF0b3IiKTsKKyAgICBpZiAoTWVtb3J5UGhpICpNUCA9IGR5bl9jYXN0PE1lbW9yeVBoaT4oQWNjZXNzKSkgeworICAgICAgaWYgKCsrQXJnTm8gPj0gTVAtPmdldE51bUluY29taW5nVmFsdWVzKCkpIHsKKyAgICAgICAgQXJnTm8gPSAwOworICAgICAgICBBY2Nlc3MgPSBudWxscHRyOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBBY2Nlc3MgPSBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworcHJpdmF0ZToKKyAgVCAqQWNjZXNzID0gbnVsbHB0cjsKKyAgdW5zaWduZWQgQXJnTm8gPSAwOworfTsKKworaW5saW5lIG1lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3IgTWVtb3J5QWNjZXNzOjpkZWZzX2JlZ2luKCkgeworICByZXR1cm4gbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvcih0aGlzKTsKK30KKworaW5saW5lIGNvbnN0X21lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3IgTWVtb3J5QWNjZXNzOjpkZWZzX2JlZ2luKCkgY29uc3QgeworICByZXR1cm4gY29uc3RfbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvcih0aGlzKTsKK30KKworaW5saW5lIG1lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3IgTWVtb3J5QWNjZXNzOjpkZWZzX2VuZCgpIHsKKyAgcmV0dXJuIG1lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3IoKTsKK30KKworaW5saW5lIGNvbnN0X21lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3IgTWVtb3J5QWNjZXNzOjpkZWZzX2VuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbnN0X21lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3IoKTsKK30KKworLy8vIFxicmllZiBHcmFwaFRyYWl0cyBmb3IgYSBNZW1vcnlBY2Nlc3MsIHdoaWNoIHdhbGtzIGRlZnMgaW4gdGhlIG5vcm1hbCBjYXNlLAorLy8vIGFuZCB1c2VzIGluIHRoZSBpbnZlcnNlIGNhc2UuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8TWVtb3J5QWNjZXNzICo+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IE1lbW9yeUFjY2VzcyAqOworICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9IG1lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKE5vZGVSZWYgTikgeyByZXR1cm4gTjsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7IHJldHVybiBOLT5kZWZzX2JlZ2luKCk7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPmRlZnNfZW5kKCk7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxJbnZlcnNlPE1lbW9yeUFjY2VzcyAqPj4geworICB1c2luZyBOb2RlUmVmID0gTWVtb3J5QWNjZXNzICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gTWVtb3J5QWNjZXNzOjppdGVyYXRvcjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoTm9kZVJlZiBOKSB7IHJldHVybiBOOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPnVzZXJfYmVnaW4oKTsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+dXNlcl9lbmQoKTsgfQorfTsKKworLy8vIFxicmllZiBQcm92aWRlIGFuIGl0ZXJhdG9yIHRoYXQgd2Fsa3MgZGVmcywgZ2l2aW5nIGJvdGggdGhlIG1lbW9yeSBhY2Nlc3MsCisvLy8gYW5kIHRoZSBjdXJyZW50IHBvaW50ZXIgbG9jYXRpb24sIHVwZGF0aW5nIHRoZSBwb2ludGVyIGxvY2F0aW9uIGFzIGl0CisvLy8gY2hhbmdlcyBkdWUgdG8gcGhpIG5vZGUgdHJhbnNsYXRpb24uCisvLy8KKy8vLyBUaGlzIGl0ZXJhdG9yLCB3aGlsZSBzb21ld2hhdCBzcGVjaWFsaXplZCwgaXMgd2hhdCBtb3N0IGNsaWVudHMgYWN0dWFsbHkKKy8vLyB3YW50IHdoZW4gd2Fsa2luZyB1cHdhcmRzIHRocm91Z2ggTWVtb3J5U1NBIGRlZiBjaGFpbnMuIEl0IHRha2VzIGEgcGFpciBvZgorLy8vIDxNZW1vcnlBY2Nlc3MsTWVtb3J5TG9jYXRpb24+LCBhbmQgd2Fsa3MgZGVmcywgcHJvcGVybHkgdHJhbnNsYXRpbmcgdGhlCisvLy8gbWVtb3J5IGxvY2F0aW9uIHRocm91Z2ggcGhpIG5vZGVzIGZvciB0aGUgdXNlci4KK2NsYXNzIHVwd2FyZF9kZWZzX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8dXB3YXJkX2RlZnNfaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1vcnlBY2Nlc3NQYWlyPiB7CisgIHVzaW5nIEJhc2VUID0gdXB3YXJkX2RlZnNfaXRlcmF0b3I6Oml0ZXJhdG9yX2ZhY2FkZV9iYXNlOworCitwdWJsaWM6CisgIHVwd2FyZF9kZWZzX2l0ZXJhdG9yKGNvbnN0IE1lbW9yeUFjY2Vzc1BhaXIgJkluZm8pCisgICAgICA6IERlZkl0ZXJhdG9yKEluZm8uZmlyc3QpLCBMb2NhdGlvbihJbmZvLnNlY29uZCksCisgICAgICAgIE9yaWdpbmFsQWNjZXNzKEluZm8uZmlyc3QpIHsKKyAgICBDdXJyZW50UGFpci5maXJzdCA9IG51bGxwdHI7CisKKyAgICBXYWxraW5nUGhpID0gSW5mby5maXJzdCAmJiBpc2E8TWVtb3J5UGhpPihJbmZvLmZpcnN0KTsKKyAgICBmaWxsSW5DdXJyZW50UGFpcigpOworICB9CisKKyAgdXB3YXJkX2RlZnNfaXRlcmF0b3IoKSB7IEN1cnJlbnRQYWlyLmZpcnN0ID0gbnVsbHB0cjsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCB1cHdhcmRfZGVmc19pdGVyYXRvciAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gRGVmSXRlcmF0b3IgPT0gT3RoZXIuRGVmSXRlcmF0b3I7CisgIH0KKworICBCYXNlVDo6aXRlcmF0b3I6OnJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgYXNzZXJ0KERlZkl0ZXJhdG9yICE9IE9yaWdpbmFsQWNjZXNzLT5kZWZzX2VuZCgpICYmCisgICAgICAgICAgICJUcmllZCB0byBhY2Nlc3MgcGFzdCB0aGUgZW5kIG9mIG91ciBpdGVyYXRvciIpOworICAgIHJldHVybiBDdXJyZW50UGFpcjsKKyAgfQorCisgIHVzaW5nIEJhc2VUOjpvcGVyYXRvcisrOworICB1cHdhcmRfZGVmc19pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICBhc3NlcnQoRGVmSXRlcmF0b3IgIT0gT3JpZ2luYWxBY2Nlc3MtPmRlZnNfZW5kKCkgJiYKKyAgICAgICAgICAgIlRyaWVkIHRvIGFjY2VzcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGl0ZXJhdG9yIik7CisgICAgKytEZWZJdGVyYXRvcjsKKyAgICBpZiAoRGVmSXRlcmF0b3IgIT0gT3JpZ2luYWxBY2Nlc3MtPmRlZnNfZW5kKCkpCisgICAgICBmaWxsSW5DdXJyZW50UGFpcigpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEJhc2ljQmxvY2sgKmdldFBoaUFyZ0Jsb2NrKCkgY29uc3QgeyByZXR1cm4gRGVmSXRlcmF0b3IuZ2V0UGhpQXJnQmxvY2soKTsgfQorCitwcml2YXRlOgorICB2b2lkIGZpbGxJbkN1cnJlbnRQYWlyKCkgeworICAgIEN1cnJlbnRQYWlyLmZpcnN0ID0gKkRlZkl0ZXJhdG9yOworICAgIGlmIChXYWxraW5nUGhpICYmIExvY2F0aW9uLlB0cikgeworICAgICAgUEhJVHJhbnNBZGRyIFRyYW5zbGF0b3IoCisgICAgICAgICAgY29uc3RfY2FzdDxWYWx1ZSAqPihMb2NhdGlvbi5QdHIpLAorICAgICAgICAgIE9yaWdpbmFsQWNjZXNzLT5nZXRCbG9jaygpLT5nZXRNb2R1bGUoKS0+Z2V0RGF0YUxheW91dCgpLCBudWxscHRyKTsKKyAgICAgIGlmICghVHJhbnNsYXRvci5QSElUcmFuc2xhdGVWYWx1ZShPcmlnaW5hbEFjY2Vzcy0+Z2V0QmxvY2soKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZJdGVyYXRvci5nZXRQaGlBcmdCbG9jaygpLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkKKyAgICAgICAgaWYgKFRyYW5zbGF0b3IuZ2V0QWRkcigpICE9IExvY2F0aW9uLlB0cikgeworICAgICAgICAgIEN1cnJlbnRQYWlyLnNlY29uZCA9IExvY2F0aW9uLmdldFdpdGhOZXdQdHIoVHJhbnNsYXRvci5nZXRBZGRyKCkpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBDdXJyZW50UGFpci5zZWNvbmQgPSBMb2NhdGlvbjsKKyAgfQorCisgIE1lbW9yeUFjY2Vzc1BhaXIgQ3VycmVudFBhaXI7CisgIG1lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3IgRGVmSXRlcmF0b3I7CisgIE1lbW9yeUxvY2F0aW9uIExvY2F0aW9uOworICBNZW1vcnlBY2Nlc3MgKk9yaWdpbmFsQWNjZXNzID0gbnVsbHB0cjsKKyAgYm9vbCBXYWxraW5nUGhpID0gZmFsc2U7Cit9OworCitpbmxpbmUgdXB3YXJkX2RlZnNfaXRlcmF0b3IgdXB3YXJkX2RlZnNfYmVnaW4oY29uc3QgTWVtb3J5QWNjZXNzUGFpciAmUGFpcikgeworICByZXR1cm4gdXB3YXJkX2RlZnNfaXRlcmF0b3IoUGFpcik7Cit9CisKK2lubGluZSB1cHdhcmRfZGVmc19pdGVyYXRvciB1cHdhcmRfZGVmc19lbmQoKSB7IHJldHVybiB1cHdhcmRfZGVmc19pdGVyYXRvcigpOyB9CisKK2lubGluZSBpdGVyYXRvcl9yYW5nZTx1cHdhcmRfZGVmc19pdGVyYXRvcj4KK3Vwd2FyZF9kZWZzKGNvbnN0IE1lbW9yeUFjY2Vzc1BhaXIgJlBhaXIpIHsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UodXB3YXJkX2RlZnNfYmVnaW4oUGFpciksIHVwd2FyZF9kZWZzX2VuZCgpKTsKK30KKworLy8vIFdhbGtzIHRoZSBkZWZpbmluZyBhY2Nlc3NlcyBvZiBNZW1vcnlEZWZzLiBTdG9wcyBhZnRlciB3ZSBoaXQgc29tZXRoaW5nIHRoYXQKKy8vLyBoYXMgbm8gZGVmaW5pbmcgdXNlIChlLmcuIGEgTWVtb3J5UGhpIG9yIGxpdmVPbkVudHJ5KS4gTm90ZSB0aGF0LCB3aGVuCisvLy8gY29tcGFyaW5nIGFnYWluc3QgYSBudWxsIGRlZl9jaGFpbl9pdGVyYXRvciwgdGhpcyB3aWxsIGNvbXBhcmUgZXF1YWwgb25seQorLy8vIGFmdGVyIHdhbGtpbmcgc2FpZCBQaGkvbGl2ZU9uRW50cnkuCisvLy8KKy8vLyBUaGUgVXNlT3B0aW1pemVkQ2hhaW4gZmxhZyBzcGVjaWZpZXMgd2hldGhlciB0byB3YWxrIHRoZSBjbG9iYmVyaW5nCisvLy8gYWNjZXNzIGNoYWluLCBvciBhbGwgdGhlIGFjY2Vzc2VzLgorLy8vCisvLy8gTm9ybWFsbHksIE1lbW9yeURlZiBhcmUgYWxsIGp1c3QgZGVmL3VzZSBsaW5rZWQgdG9nZXRoZXIsIHNvIGEgZGVmX2NoYWluIG9uCisvLy8gYSBNZW1vcnlEZWYgd2lsbCB3YWxrIGFsbCBNZW1vcnlEZWZzIGFib3ZlIGl0IGluIHRoZSBwcm9ncmFtIHVudGlsIGl0IGhpdHMKKy8vLyBhIHBoaSBub2RlLiAgVGhlIG9wdGltaXplZCBjaGFpbiB3YWxrcyB0aGUgY2xvYmJlcmluZyBhY2Nlc3Mgb2YgYSBzdG9yZS4KKy8vLyBTbyBpZiB5b3UgYXJlIGp1c3QgdHJ5aW5nIHRvIGZpbmQsIGdpdmVuIGEgc3RvcmUsIHdoYXQgdGhlIG5leHQKKy8vLyB0aGluZyB0aGF0IHdvdWxkIGNsb2JiZXIgdGhlIHNhbWUgbWVtb3J5IGlzLCB5b3Ugd2FudCB0aGUgb3B0aW1pemVkIGNoYWluLgordGVtcGxhdGUgPGNsYXNzIFQsIGJvb2wgVXNlT3B0aW1pemVkQ2hhaW4gPSBmYWxzZT4KK3N0cnVjdCBkZWZfY2hhaW5faXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTxkZWZfY2hhaW5faXRlcmF0b3I8VCwgVXNlT3B0aW1pemVkQ2hhaW4+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIE1lbW9yeUFjY2VzcyAqPiB7CisgIGRlZl9jaGFpbl9pdGVyYXRvcigpIDogTUEobnVsbHB0cikge30KKyAgZGVmX2NoYWluX2l0ZXJhdG9yKFQgTUEpIDogTUEoTUEpIHt9CisKKyAgVCBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBNQTsgfQorCisgIGRlZl9jaGFpbl9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICAvLyBOLkIuIGxpdmVPbkVudHJ5IGhhcyBhIG51bGwgZGVmaW5pbmcgYWNjZXNzLgorICAgIGlmIChhdXRvICpNVUQgPSBkeW5fY2FzdDxNZW1vcnlVc2VPckRlZj4oTUEpKSB7CisgICAgICBpZiAoVXNlT3B0aW1pemVkQ2hhaW4gJiYgTVVELT5pc09wdGltaXplZCgpKQorICAgICAgICBNQSA9IE1VRC0+Z2V0T3B0aW1pemVkKCk7CisgICAgICBlbHNlCisgICAgICAgIE1BID0gTVVELT5nZXREZWZpbmluZ0FjY2VzcygpOworICAgIH0gZWxzZSB7CisgICAgICBNQSA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGRlZl9jaGFpbl9pdGVyYXRvciAmTykgY29uc3QgeyByZXR1cm4gTUEgPT0gTy5NQTsgfQorCitwcml2YXRlOgorICBUIE1BOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8ZGVmX2NoYWluX2l0ZXJhdG9yPFQ+PgorZGVmX2NoYWluKFQgTUEsIE1lbW9yeUFjY2VzcyAqVXBUbyA9IG51bGxwdHIpIHsKKyNpZmRlZiBFWFBFTlNJVkVfQ0hFQ0tTCisgIGFzc2VydCgoIVVwVG8gfHwgZmluZChkZWZfY2hhaW4oTUEpLCBVcFRvKSAhPSBkZWZfY2hhaW5faXRlcmF0b3I8VD4oKSkgJiYKKyAgICAgICAgICJVcFRvIGlzbid0IGluIHRoZSBkZWYgY2hhaW4hIik7CisjZW5kaWYKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoZGVmX2NoYWluX2l0ZXJhdG9yPFQ+KE1BKSwgZGVmX2NoYWluX2l0ZXJhdG9yPFQ+KFVwVG8pKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8ZGVmX2NoYWluX2l0ZXJhdG9yPFQsIHRydWU+PiBvcHRpbWl6ZWRfZGVmX2NoYWluKFQgTUEpIHsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoZGVmX2NoYWluX2l0ZXJhdG9yPFQsIHRydWU+KE1BKSwKKyAgICAgICAgICAgICAgICAgICAgZGVmX2NoYWluX2l0ZXJhdG9yPFQsIHRydWU+KG51bGxwdHIpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfTUVNT1JZU1NBX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTWVtb3J5U1NBVXBkYXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9NZW1vcnlTU0FVcGRhdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0ZWYwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTWVtb3J5U1NBVXBkYXRlci5oCkBAIC0wLDAgKzEsMTU4IEBACisvLz09PS0gTWVtb3J5U1NBVXBkYXRlci5oIC0gTWVtb3J5IFNTQSBVcGRhdGVyLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFxmaWxlCisvLyBcYnJpZWYgQW4gYXV0b21hdGljIHVwZGF0ZXIgZm9yIE1lbW9yeVNTQSB0aGF0IGhhbmRsZXMgYXJiaXRyYXJ5IGluc2VydGlvbiwKKy8vIGRlbGV0aW9uLCBhbmQgbW92ZXMuICBJdCBwZXJmb3JtcyBwaGkgaW5zZXJ0aW9uIHdoZXJlIG5lY2Vzc2FyeSwgYW5kCisvLyBhdXRvbWF0aWNhbGx5IHVwZGF0ZXMgdGhlIE1lbW9yeVNTQSBJUiB0byBiZSBjb3JyZWN0LgorLy8gV2hpbGUgdXBkYXRpbmcgbG9hZHMgb3IgcmVtb3ZpbmcgaW5zdHJ1Y3Rpb25zIGlzIG9mdGVuIGVhc3kgZW5vdWdoIHRvIG5vdAorLy8gbmVlZCB0aGlzLCB1cGRhdGluZyBzdG9yZXMgc2hvdWxkIGdlbmVyYWxseSBub3QgYmUgYXR0ZW1wZWQgb3V0c2lkZSB0aGlzCisvLyBBUEkuCisvLworLy8gQmFzaWMgQVBJIHVzYWdlOgorLy8gQ3JlYXRlIHRoZSBtZW1vcnkgYWNjZXNzIHlvdSB3YW50IGZvciB0aGUgaW5zdHJ1Y3Rpb24gKHRoaXMgaXMgbWFpbmx5IHNvCisvLyB3ZSBrbm93IHdoZXJlIGl0IGlzLCB3aXRob3V0IGhhdmluZyB0byBkdXBsaWNhdGUgdGhlIGVudGlyZSBzZXQgb2YgY3JlYXRlCisvLyBmdW5jdGlvbnMgTWVtb3J5U1NBIHN1cHBvcnRzKS4KKy8vIENhbGwgaW5zZXJ0RGVmIG9yIGluc2VydFVzZSBkZXBlbmRpbmcgb24gd2hldGhlciBpdCdzIGEgTWVtb3J5VXNlIG9yIGEKKy8vIE1lbW9yeURlZi4KKy8vIFRoYXQncyBpdC4KKy8vCisvLyBGb3IgbW92aW5nLCBmaXJzdCwgbW92ZSB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmIHVzaW5nIHRoZSBub3JtYWwgU1NBCisvLyBpbnN0cnVjdGlvbiBtb3ZpbmcgQVBJLCB0aGVuIGp1c3QgY2FsbCBtb3ZlQmVmb3JlLCBtb3ZlQWZ0ZXIsb3IgbW92ZVRvIHdpdGgKKy8vIHRoZSByaWdodCBhcmd1bWVudHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX01FTU9SWVNTQVVQREFURVJfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX01FTU9SWVNTQVVQREFURVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTWVtb3J5U1NBLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL09wZXJhbmRUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1VzZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVXNlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBNZW1vcnlBY2Nlc3M7CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIHJhd19vc3RyZWFtOworCitjbGFzcyBNZW1vcnlTU0FVcGRhdGVyIHsKK3ByaXZhdGU6CisgIE1lbW9yeVNTQSAqTVNTQTsKKyAgU21hbGxWZWN0b3I8TWVtb3J5UGhpICosIDg+IEluc2VydGVkUEhJczsKKyAgU21hbGxQdHJTZXQ8QmFzaWNCbG9jayAqLCA4PiBWaXNpdGVkQmxvY2tzOworCitwdWJsaWM6CisgIE1lbW9yeVNTQVVwZGF0ZXIoTWVtb3J5U1NBICpNU1NBKSA6IE1TU0EoTVNTQSkge30KKyAgLy8vIEluc2VydCBhIGRlZmluaXRpb24gaW50byB0aGUgTWVtb3J5U1NBIElSLiAgUmVuYW1lVXNlcyB3aWxsIHJlbmFtZSBhbnkgdXNlCisgIC8vLyBiZWxvdyB0aGUgbmV3IGRlZiBibG9jayAoYW5kIGFueSBpbnNlcnRlZCBwaGlzKS4gIFJlbmFtZVVzZXMgc2hvdWxkIGJlIHNldAorICAvLy8gdG8gdHJ1ZSBpZiB0aGUgZGVmaW5pdGlvbiBtYXkgY2F1c2UgbmV3IGFsaWFzZXMgZm9yIGxvYWRzIGJlbG93IGl0LiAgVGhpcworICAvLy8gaXMgbm90IHRoZSBjYXNlIGZvciBob2lzdGluZyBvciBzaW5raW5nIG9yIG90aGVyIGZvcm1zIG9mIGNvZGUgKm1vdmVtZW50Ki4KKyAgLy8vIEl0ICppcyogdGhlIGNhc2UgZm9yIHN0cmFpZ2h0IGNvZGUgaW5zZXJ0aW9uLgorICAvLy8gRm9yIGV4YW1wbGU6CisgIC8vLyBzdG9yZSBhCisgIC8vLyBpZiAoZm9vKSB7IH0KKyAgLy8vIGxvYWQgYQorICAvLy8KKyAgLy8vIE1vdmluZyB0aGUgc3RvcmUgaW50byB0aGUgaWYgYmxvY2ssIGFuZCBjYWxsaW5nIGluc2VydERlZiwgZG9lcyBub3QKKyAgLy8vIHJlcXVpcmUgUmVuYW1lVXNlcy4KKyAgLy8vIEhvd2V2ZXIsIGNoYW5naW5nIGl0IHRvOgorICAvLy8gc3RvcmUgYQorICAvLy8gaWYgKGZvbykgeyBzdG9yZSBiIH0KKyAgLy8vIGxvYWQgYQorICAvLy8gV2hlcmUgYSBtYXlhbGlhcyBiLCAqZG9lcyogcmVxdWlyZSBSZW5hbWVVc2VzIGJlIHNldCB0byB0cnVlLgorICB2b2lkIGluc2VydERlZihNZW1vcnlEZWYgKkRlZiwgYm9vbCBSZW5hbWVVc2VzID0gZmFsc2UpOworICB2b2lkIGluc2VydFVzZShNZW1vcnlVc2UgKlVzZSk7CisgIHZvaWQgbW92ZUJlZm9yZShNZW1vcnlVc2VPckRlZiAqV2hhdCwgTWVtb3J5VXNlT3JEZWYgKldoZXJlKTsKKyAgdm9pZCBtb3ZlQWZ0ZXIoTWVtb3J5VXNlT3JEZWYgKldoYXQsIE1lbW9yeVVzZU9yRGVmICpXaGVyZSk7CisgIHZvaWQgbW92ZVRvUGxhY2UoTWVtb3J5VXNlT3JEZWYgKldoYXQsIEJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgIE1lbW9yeVNTQTo6SW5zZXJ0aW9uUGxhY2UgV2hlcmUpOworCisgIC8vIFRoZSBiZWxvdyBhcmUgdXRpbGl0eSBmdW5jdGlvbnMuIE90aGVyIHRoYW4gY3JlYXRpb24gb2YgYWNjZXNzZXMgdG8gcGFzcworICAvLyB0byBpbnNlcnREZWYsIGFuZCByZW1vdmVBY2Nlc3MgdG8gcmVtb3ZlIGFjY2Vzc2VzLCB5b3Ugc2hvdWxkIGdlbmVyYWxseQorICAvLyBub3QgYXR0ZW1wdCB0byB1cGRhdGUgbWVtb3J5c3NhIHlvdXJzZWxmLiBJdCBpcyB2ZXJ5IG5vbi10cml2aWFsIHRvIGdldAorICAvLyB0aGUgZWRnZSBjYXNlcyByaWdodCwgYW5kIHRoZSBhYm92ZSBjYWxscyBhbHJlYWR5IG9wZXJhdGUgaW4gbmVhci1vcHRpbWFsCisgIC8vIHRpbWUgYm91bmRzLgorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgTWVtb3J5QWNjZXNzIGluIE1lbW9yeVNTQSBhdCBhIHNwZWNpZmllZCBwb2ludCBpbiBhIGJsb2NrLAorICAvLy8gd2l0aCBhIHNwZWNpZmllZCBjbG9iYmVyaW5nIGRlZmluaXRpb24uCisgIC8vLworICAvLy8gUmV0dXJucyB0aGUgbmV3IE1lbW9yeUFjY2Vzcy4KKyAgLy8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgbWVtb3J5IGluc3RydWN0aW9uIGlzIGNyZWF0ZWQgdGhhdCBpcyBiZWluZworICAvLy8gdXNlZCB0byByZXBsYWNlIGFuIGV4aXN0aW5nIG1lbW9yeSBpbnN0cnVjdGlvbi4gSXQgd2lsbCAqbm90KiBjcmVhdGUgUEhJCisgIC8vLyBub2Rlcywgb3IgdmVyaWZ5IHRoZSBjbG9iYmVyaW5nIGRlZmluaXRpb24uIFRoZSBpbnNlcnRpb24gcGxhY2UgaXMgdXNlZAorICAvLy8gc29sZWx5IHRvIGRldGVybWluZSB3aGVyZSBpbiB0aGUgbWVtb3J5c3NhIGFjY2VzcyBsaXN0cyB0aGUgaW5zdHJ1Y3Rpb24KKyAgLy8vIHdpbGwgYmUgcGxhY2VkLiBUaGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGtlZXAgb3JkZXJpbmcgdGhlIHNhbWUgYXMKKyAgLy8vIGluc3RydWN0aW9ucy4KKyAgLy8vIEl0IHdpbGwgcmV0dXJuIHRoZSBuZXcgTWVtb3J5QWNjZXNzLgorICAvLy8gTm90ZTogSWYgYSBNZW1vcnlBY2Nlc3MgYWxyZWFkeSBleGlzdHMgZm9yIEksIHRoaXMgZnVuY3Rpb24gd2lsbCBtYWtlIGl0CisgIC8vLyBpbmFjY2Vzc2libGUgYW5kIGl0ICptdXN0KiBoYXZlIHJlbW92ZU1lbW9yeUFjY2VzcyBjYWxsZWQgb24gaXQuCisgIE1lbW9yeUFjY2VzcyAqY3JlYXRlTWVtb3J5QWNjZXNzSW5CQihJbnN0cnVjdGlvbiAqSSwgTWVtb3J5QWNjZXNzICpEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnlTU0E6Okluc2VydGlvblBsYWNlIFBvaW50KTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIE1lbW9yeUFjY2VzcyBpbiBNZW1vcnlTU0EgYmVmb3JlIG9yIGFmdGVyIGFuIGV4aXN0aW5nCisgIC8vLyBNZW1vcnlBY2Nlc3MuCisgIC8vLworICAvLy8gUmV0dXJucyB0aGUgbmV3IE1lbW9yeUFjY2Vzcy4KKyAgLy8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgbWVtb3J5IGluc3RydWN0aW9uIGlzIGNyZWF0ZWQgdGhhdCBpcyBiZWluZworICAvLy8gdXNlZCB0byByZXBsYWNlIGFuIGV4aXN0aW5nIG1lbW9yeSBpbnN0cnVjdGlvbi4gSXQgd2lsbCAqbm90KiBjcmVhdGUgUEhJCisgIC8vLyBub2Rlcywgb3IgdmVyaWZ5IHRoZSBjbG9iYmVyaW5nIGRlZmluaXRpb24uCisgIC8vLworICAvLy8gTm90ZTogSWYgYSBNZW1vcnlBY2Nlc3MgYWxyZWFkeSBleGlzdHMgZm9yIEksIHRoaXMgZnVuY3Rpb24gd2lsbCBtYWtlIGl0CisgIC8vLyBpbmFjY2Vzc2libGUgYW5kIGl0ICptdXN0KiBoYXZlIHJlbW92ZU1lbW9yeUFjY2VzcyBjYWxsZWQgb24gaXQuCisgIE1lbW9yeVVzZU9yRGVmICpjcmVhdGVNZW1vcnlBY2Nlc3NCZWZvcmUoSW5zdHJ1Y3Rpb24gKkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5QWNjZXNzICpEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeVVzZU9yRGVmICpJbnNlcnRQdCk7CisgIE1lbW9yeVVzZU9yRGVmICpjcmVhdGVNZW1vcnlBY2Nlc3NBZnRlcihJbnN0cnVjdGlvbiAqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeUFjY2VzcyAqRGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeUFjY2VzcyAqSW5zZXJ0UHQpOworCisgIC8vLyBcYnJpZWYgUmVtb3ZlIGEgTWVtb3J5QWNjZXNzIGZyb20gTWVtb3J5U1NBLCBpbmNsdWRpbmcgdXBkYXRpbmcgYWxsCisgIC8vLyBkZWZpbml0aW9ucyBhbmQgdXNlcy4KKyAgLy8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgbWVtb3J5IGluc3RydWN0aW9uIHRoYXQgaGFzIGEgTWVtb3J5QWNjZXNzCisgIC8vLyBhc3NvY2lhdGVkIHdpdGggaXQgaXMgZXJhc2VkIGZyb20gdGhlIHByb2dyYW0uICBGb3IgZXhhbXBsZSwgaWYgYSBzdG9yZSBvcgorICAvLy8gbG9hZCBpcyBzaW1wbHkgZXJhc2VkIChub3QgcmVwbGFjZWQpLCByZW1vdmVNZW1vcnlBY2Nlc3Mgc2hvdWxkIGJlIGNhbGxlZAorICAvLy8gb24gdGhlIE1lbW9yeUFjY2VzcyBmb3IgdGhhdCBzdG9yZS9sb2FkLgorICB2b2lkIHJlbW92ZU1lbW9yeUFjY2VzcyhNZW1vcnlBY2Nlc3MgKik7CisKK3ByaXZhdGU6CisgIC8vIE1vdmUgV2hhdCBiZWZvcmUgV2hlcmUgaW4gdGhlIE1lbW9yeVNTQSBJUi4KKyAgdGVtcGxhdGUgPGNsYXNzIFdoZXJlVHlwZT4KKyAgdm9pZCBtb3ZlVG8oTWVtb3J5VXNlT3JEZWYgKldoYXQsIEJhc2ljQmxvY2sgKkJCLCBXaGVyZVR5cGUgV2hlcmUpOworICBNZW1vcnlBY2Nlc3MgKmdldFByZXZpb3VzRGVmKE1lbW9yeUFjY2VzcyAqKTsKKyAgTWVtb3J5QWNjZXNzICpnZXRQcmV2aW91c0RlZkluQmxvY2soTWVtb3J5QWNjZXNzICopOworICBNZW1vcnlBY2Nlc3MgKgorICBnZXRQcmV2aW91c0RlZkZyb21FbmQoQmFzaWNCbG9jayAqLAorICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8QmFzaWNCbG9jayAqLCBUcmFja2luZ1ZIPE1lbW9yeUFjY2Vzcz4+ICYpOworICBNZW1vcnlBY2Nlc3MgKgorICBnZXRQcmV2aW91c0RlZlJlY3Vyc2l2ZShCYXNpY0Jsb2NrICosCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPEJhc2ljQmxvY2sgKiwgVHJhY2tpbmdWSDxNZW1vcnlBY2Nlc3M+PiAmKTsKKyAgTWVtb3J5QWNjZXNzICpyZWN1cnNlUGhpKE1lbW9yeUFjY2VzcyAqUGhpKTsKKyAgdGVtcGxhdGUgPGNsYXNzIFJhbmdlVHlwZT4KKyAgTWVtb3J5QWNjZXNzICp0cnlSZW1vdmVUcml2aWFsUGhpKE1lbW9yeVBoaSAqUGhpLCBSYW5nZVR5cGUgJk9wZXJhbmRzKTsKKyAgdm9pZCBmaXh1cERlZnMoY29uc3QgU21hbGxWZWN0b3JJbXBsPE1lbW9yeUFjY2VzcyAqPiAmKTsKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19NRU1PUllTU0FVUERBVEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTW9kdWxlU3VtbWFyeUFuYWx5c2lzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL01vZHVsZVN1bW1hcnlBbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZjc4NTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL01vZHVsZVN1bW1hcnlBbmFseXNpcy5oCkBAIC0wLDAgKzEsODEgQEAKKy8vPT09LSBNb2R1bGVTdW1tYXJ5QW5hbHlzaXMuaCAtIE1vZHVsZSBzdW1tYXJ5IGluZGV4IGJ1aWxkZXIgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdG8gYnVpbGQgYSBNb2R1bGVTdW1tYXJ5SW5kZXggZm9yIGEgbW9kdWxlLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTU9EVUxFU1VNTUFSWUFOQUxZU0lTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19NT0RVTEVTVU1NQVJZQU5BTFlTSVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZVN1bW1hcnlJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJsb2NrRnJlcXVlbmN5SW5mbzsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTW9kdWxlOworY2xhc3MgUHJvZmlsZVN1bW1hcnlJbmZvOworCisvLy8gRGlyZWN0IGZ1bmN0aW9uIHRvIGNvbXB1dGUgYSBcYyBNb2R1bGVTdW1tYXJ5SW5kZXggZnJvbSBhIGdpdmVuIG1vZHVsZS4KKy8vLworLy8vIElmIG9wZXJhdGluZyB3aXRoaW4gYSBwYXNzIG1hbmFnZXIgd2hpY2ggaGFzIGRlZmluZWQgd2F5cyB0byBjb21wdXRlIHRoZSBcYworLy8vIEJsb2NrRnJlcXVlbmN5SW5mbyBmb3IgYSBnaXZlbiBmdW5jdGlvbiwgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdmlhCisvLy8gYSBzdGQ6OmZ1bmN0aW9uIGNhbGxiYWNrLiBPdGhlcndpc2UsIHRoaXMgcm91dGluZSB3aWxsIG1hbnVhbGx5IGNvbnN0cnVjdAorLy8vIHRoYXQgaW5mb3JtYXRpb24uCitNb2R1bGVTdW1tYXJ5SW5kZXggYnVpbGRNb2R1bGVTdW1tYXJ5SW5kZXgoCisgICAgY29uc3QgTW9kdWxlICZNLAorICAgIHN0ZDo6ZnVuY3Rpb248QmxvY2tGcmVxdWVuY3lJbmZvICooY29uc3QgRnVuY3Rpb24gJkYpPiBHZXRCRklDYWxsYmFjaywKKyAgICBQcm9maWxlU3VtbWFyeUluZm8gKlBTSSk7CisKKy8vLyBBbmFseXNpcyBwYXNzIHRvIHByb3ZpZGUgdGhlIE1vZHVsZVN1bW1hcnlJbmRleCBvYmplY3QuCitjbGFzcyBNb2R1bGVTdW1tYXJ5SW5kZXhBbmFseXNpcworICAgIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPE1vZHVsZVN1bW1hcnlJbmRleEFuYWx5c2lzPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxNb2R1bGVTdW1tYXJ5SW5kZXhBbmFseXNpcz47CisKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICB1c2luZyBSZXN1bHQgPSBNb2R1bGVTdW1tYXJ5SW5kZXg7CisKKyAgUmVzdWx0IHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIExlZ2FjeSB3cmFwcGVyIHBhc3MgdG8gcHJvdmlkZSB0aGUgTW9kdWxlU3VtbWFyeUluZGV4IG9iamVjdC4KK2NsYXNzIE1vZHVsZVN1bW1hcnlJbmRleFdyYXBwZXJQYXNzIDogcHVibGljIE1vZHVsZVBhc3MgeworICBPcHRpb25hbDxNb2R1bGVTdW1tYXJ5SW5kZXg+IEluZGV4OworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIE1vZHVsZVN1bW1hcnlJbmRleFdyYXBwZXJQYXNzKCk7CisKKyAgLy8vIEdldCB0aGUgaW5kZXggYnVpbHQgYnkgcGFzcworICBNb2R1bGVTdW1tYXJ5SW5kZXggJmdldEluZGV4KCkgeyByZXR1cm4gKkluZGV4OyB9CisgIGNvbnN0IE1vZHVsZVN1bW1hcnlJbmRleCAmZ2V0SW5kZXgoKSBjb25zdCB7IHJldHVybiAqSW5kZXg7IH0KKworICBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgb3ZlcnJpZGU7CisgIGJvb2wgZG9GaW5hbGl6YXRpb24oTW9kdWxlICZNKSBvdmVycmlkZTsKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIGNyZWF0ZU1vZHVsZVN1bW1hcnlJbmRleFdyYXBwZXJQYXNzIC0gVGhpcyBwYXNzIGJ1aWxkcyBhIE1vZHVsZVN1bW1hcnlJbmRleAorLy8gb2JqZWN0IGZvciB0aGUgbW9kdWxlLCB0byBiZSB3cml0dGVuIHRvIGJpdGNvZGUgb3IgTExWTSBhc3NlbWJseS4KKy8vCitNb2R1bGVQYXNzICpjcmVhdGVNb2R1bGVTdW1tYXJ5SW5kZXhXcmFwcGVyUGFzcygpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19NT0RVTEVTVU1NQVJZQU5BTFlTSVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9NdXN0RXhlY3V0ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9NdXN0RXhlY3V0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNDhiYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL011c3RFeGVjdXRlLmgKQEAgLTAsMCArMSw2NCBAQAorLy89PT0tIE11c3RFeGVjdXRlLmggLSBJcyBhbiBpbnN0cnVjdGlvbiBrbm93biB0byBleGVjdXRlLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIENvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiByb3V0aW5lcyBmb3IgZGV0ZXJtaW5pbmcgaWYgYSBnaXZlbiBpbnN0cnVjdGlvbiBpcworLy8vIGd1YXJhbnRlZWQgdG8gZXhlY3V0ZSBpZiBhIGdpdmVuIHBvaW50IGluIGNvbnRyb2wgZmxvdyBpcyByZWFjaGVkLiAgVGhlIG1vc3QKKy8vLyBjb21tb24gZXhhbXBsZSBpcyBhbiBpbnN0cnVjdGlvbiB3aXRoaW4gYSBsb29wIGJlaW5nIHByb3ZhYmx5IGV4ZWN1dGVkIGlmIHdlCisvLy8gYnJhbmNoIHRvIHRoZSBoZWFkZXIgb2YgaXQncyBjb250YWluaW5nIGxvb3AuICAKKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX01VU1RFWEVDVVRFX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19NVVNURVhFQ1VURV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRUhQZXJzb25hbGl0aWVzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vSVIvRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBMb29wOworCisvLy8gXGJyaWVmIENhcHR1cmVzIGxvb3Agc2FmZXR5IGluZm9ybWF0aW9uLgorLy8vIEl0IGtlZXAgaW5mb3JtYXRpb24gZm9yIGxvb3AgJiBpdHMgaGVhZGVyIG1heSB0aHJvdyBleGNlcHRpb24gb3Igb3RoZXJ3aXNlCisvLy8gZXhpdCBhYm5vcm1hbHkgb24gYW55IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCB3aGljaCBtaWdodCBhY3R1YWxseSBleGVjdXRlCisvLy8gYXQgcnVudGltZS4gIFRoZSBwcmltYXJ5IHdheSB0byBjb25zdW1lIHRoaXMgaW5mcm9tYXRpb24gaXMgdmlhCisvLy8gaXNHdWFyYW50ZWVkVG9FeGVjdXRlIGJlbG93LCBidXQgc29tZSBjYWxsZXJzIGJhaWxvdXQgb3IgZmFsbGJhY2sgdG8KKy8vLyBhbHRlcm5hdGUgcmVhc29uaW5nIGlmIGEgbG9vcCBjb250YWlucyBhbnkgaW1wbGljaXQgY29udHJvbCBmbG93Lgorc3RydWN0IExvb3BTYWZldHlJbmZvIHsKKyAgYm9vbCBNYXlUaHJvdyA9IGZhbHNlOyAgICAgICAvLyBUaGUgY3VycmVudCBsb29wIGNvbnRhaW5zIGFuIGluc3RydWN0aW9uIHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF5IHRocm93LgorICBib29sIEhlYWRlck1heVRocm93ID0gZmFsc2U7IC8vIFNhbWUgYXMgcHJldmlvdXMsIGJ1dCBzcGVjaWZpYyB0byBsb29wIGhlYWRlcgorICAvLyBVc2VkIHRvIHVwZGF0ZSBmdW5jbGV0IGJ1bmRsZSBvcGVyYW5kcy4KKyAgRGVuc2VNYXA8QmFzaWNCbG9jayAqLCBDb2xvclZlY3Rvcj4gQmxvY2tDb2xvcnM7CisKKyAgTG9vcFNhZmV0eUluZm8oKSA9IGRlZmF1bHQ7Cit9OworCisvLy8gXGJyaWVmIENvbXB1dGVzIHNhZmV0eSBpbmZvcm1hdGlvbiBmb3IgYSBsb29wIGNoZWNrcyBsb29wIGJvZHkgJiBoZWFkZXIgZm9yCisvLy8gdGhlIHBvc3NpYmlsaXR5IG9mIG1heSB0aHJvdyBleGNlcHRpb24sIGl0IHRha2VzIExvb3BTYWZldHlJbmZvIGFuZCBsb29wIGFzCisvLy8gYXJndW1lbnQuIFVwZGF0ZXMgc2FmZXR5IGluZm9ybWF0aW9uIGluIExvb3BTYWZldHlJbmZvIGFyZ3VtZW50LgorLy8vIE5vdGU6IFRoaXMgaXMgZGVmaW5lZCB0byBjbGVhciBhbmQgcmVpbml0aWFsaXplIGFuIGFscmVhZHkgaW5pdGlhbGl6ZWQKKy8vLyBMb29wU2FmZXR5SW5mby4gIFNvbWUgY2FsbGVycyByZWx5IG9uIHRoaXMgZmFjdC4KK3ZvaWQgY29tcHV0ZUxvb3BTYWZldHlJbmZvKExvb3BTYWZldHlJbmZvICosIExvb3AgKik7CisKKy8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGluIGEgbG9vcCBpcyBndWFyYW50ZWVkIHRvIGV4ZWN1dGUgYXQgbGVhc3QKKy8vLyBvbmNlICh1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBsb29wIGlzIGVudGVyZWQpLgorYm9vbCBpc0d1YXJhbnRlZWRUb0V4ZWN1dGUoY29uc3QgSW5zdHJ1Y3Rpb24gJkluc3QsIGNvbnN0IERvbWluYXRvclRyZWUgKkRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqQ3VyTG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3BTYWZldHlJbmZvICpTYWZldHlJbmZvKTsKKyAgCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9PYmpDQVJDQWxpYXNBbmFseXNpcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9PYmpDQVJDQWxpYXNBbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNTI0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL09iakNBUkNBbGlhc0FuYWx5c2lzLmgKQEAgLTAsMCArMSw5NyBAQAorLy89PT0tIE9iakNBUkNBbGlhc0FuYWx5c2lzLmggLSBPYmpDIEFSQyBBbGlhcyBBbmFseXNpcyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBhIHNpbXBsZSBBUkMtYXdhcmUgQWxpYXNBbmFseXNpcyB1c2luZyBzcGVjaWFsIGtub3dsZWRnZQorLy8vIG9mIE9iamVjdGl2ZSBDIHRvIGVuaGFuY2Ugb3RoZXIgb3B0aW1pemF0aW9uIHBhc3NlcyB3aGljaCByZWx5IG9uIHRoZSBBbGlhcworLy8vIEFuYWx5c2lzIGluZnJhc3RydWN0dXJlLgorLy8vCisvLy8gV0FSTklORzogVGhpcyBmaWxlIGtub3dzIGFib3V0IGNlcnRhaW4gbGlicmFyeSBmdW5jdGlvbnMuIEl0IHJlY29nbml6ZXMgdGhlbQorLy8vIGJ5IG5hbWUsIGFuZCBoYXJkd2lyZXMga25vd2xlZGdlIG9mIHRoZWlyIHNlbWFudGljcy4KKy8vLworLy8vIFdBUk5JTkc6IFRoaXMgZmlsZSBrbm93cyBhYm91dCBob3cgY2VydGFpbiBPYmplY3RpdmUtQyBsaWJyYXJ5IGZ1bmN0aW9ucyBhcmUKKy8vLyB1c2VkLiBOYWl2ZSBMTFZNIElSIHRyYW5zZm9ybWF0aW9ucyB3aGljaCB3b3VsZCBvdGhlcndpc2UgYmUKKy8vLyBiZWhhdmlvci1wcmVzZXJ2aW5nIG1heSBicmVhayB0aGVzZSBhc3N1bXB0aW9ucy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX09CSkNBUkNBTElBU0FOQUxZU0lTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19PQkpDQVJDQUxJQVNBTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9iamNhcmMgeworCisvLy8gXGJyaWVmIFRoaXMgaXMgYSBzaW1wbGUgYWxpYXMgYW5hbHlzaXMgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIGtub3dsZWRnZQorLy8vIG9mIEFSQyBjb25zdHJ1Y3RzIHRvIGFuc3dlciBxdWVyaWVzLgorLy8vCisvLy8gVE9ETzogVGhpcyBjbGFzcyBjb3VsZCBiZSBnZW5lcmFsaXplZCB0byBrbm93IGFib3V0IG90aGVyIE9iakMtc3BlY2lmaWMKKy8vLyB0cmlja3MuIFN1Y2ggYXMga25vd2luZyB0aGF0IGl2YXJzIGluIHRoZSBub24tZnJhZ2lsZSBBQkkgYXJlIG5vbi1hbGlhc2luZworLy8vIGV2ZW4gdGhvdWdoIHRoZWlyIG9mZnNldHMgYXJlIGR5bmFtaWMuCitjbGFzcyBPYmpDQVJDQUFSZXN1bHQgOiBwdWJsaWMgQUFSZXN1bHRCYXNlPE9iakNBUkNBQVJlc3VsdD4geworICBmcmllbmQgQUFSZXN1bHRCYXNlPE9iakNBUkNBQVJlc3VsdD47CisKKyAgY29uc3QgRGF0YUxheW91dCAmREw7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgT2JqQ0FSQ0FBUmVzdWx0KGNvbnN0IERhdGFMYXlvdXQgJkRMKSA6IEFBUmVzdWx0QmFzZSgpLCBETChETCkge30KKyAgT2JqQ0FSQ0FBUmVzdWx0KE9iakNBUkNBQVJlc3VsdCAmJkFyZykKKyAgICAgIDogQUFSZXN1bHRCYXNlKHN0ZDo6bW92ZShBcmcpKSwgREwoQXJnLkRMKSB7fQorCisgIC8vLyBIYW5kbGUgaW52YWxpZGF0aW9uIGV2ZW50cyBmcm9tIHRoZSBuZXcgcGFzcyBtYW5hZ2VyLgorICAvLy8KKyAgLy8vIEJ5IGRlZmluaXRpb24sIHRoaXMgcmVzdWx0IGlzIHN0YXRlbGVzcyBhbmQgc28gcmVtYWlucyB2YWxpZC4KKyAgYm9vbCBpbnZhbGlkYXRlKEZ1bmN0aW9uICYsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICYsCisgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEFsaWFzUmVzdWx0IGFsaWFzKGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NBLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQik7CisgIGJvb2wgcG9pbnRzVG9Db25zdGFudE1lbW9yeShjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jLCBib29sIE9yTG9jYWwpOworCisgIHVzaW5nIEFBUmVzdWx0QmFzZTo6Z2V0TW9kUmVmQmVoYXZpb3I7CisgIEZ1bmN0aW9uTW9kUmVmQmVoYXZpb3IgZ2V0TW9kUmVmQmVoYXZpb3IoY29uc3QgRnVuY3Rpb24gKkYpOworCisgIHVzaW5nIEFBUmVzdWx0QmFzZTo6Z2V0TW9kUmVmSW5mbzsKKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jKTsKK307CisKKy8vLyBBbmFseXNpcyBwYXNzIHByb3ZpZGluZyBhIG5ldmVyLWludmFsaWRhdGVkIGFsaWFzIGFuYWx5c2lzIHJlc3VsdC4KK2NsYXNzIE9iakNBUkNBQSA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjxPYmpDQVJDQUE+IHsKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPE9iakNBUkNBQT47CisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBPYmpDQVJDQUFSZXN1bHQgUmVzdWx0OworCisgIE9iakNBUkNBQVJlc3VsdCBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gTGVnYWN5IHdyYXBwZXIgcGFzcyB0byBwcm92aWRlIHRoZSBPYmpDQVJDQUFSZXN1bHQgb2JqZWN0LgorY2xhc3MgT2JqQ0FSQ0FBV3JhcHBlclBhc3MgOiBwdWJsaWMgSW1tdXRhYmxlUGFzcyB7CisgIHN0ZDo6dW5pcXVlX3B0cjxPYmpDQVJDQUFSZXN1bHQ+IFJlc3VsdDsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBPYmpDQVJDQUFXcmFwcGVyUGFzcygpOworCisgIE9iakNBUkNBQVJlc3VsdCAmZ2V0UmVzdWx0KCkgeyByZXR1cm4gKlJlc3VsdDsgfQorICBjb25zdCBPYmpDQVJDQUFSZXN1bHQgJmdldFJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuICpSZXN1bHQ7IH0KKworICBib29sIGRvSW5pdGlhbGl6YXRpb24oTW9kdWxlICZNKSBvdmVycmlkZTsKKyAgYm9vbCBkb0ZpbmFsaXphdGlvbihNb2R1bGUgJk0pIG92ZXJyaWRlOworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworfTsKKworfSAvLyBuYW1lc3BhY2Ugb2JqY2FyYworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvT2JqQ0FSQ0FuYWx5c2lzVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvT2JqQ0FSQ0FuYWx5c2lzVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTY1NzNmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9PYmpDQVJDQW5hbHlzaXNVdGlscy5oCkBAIC0wLDAgKzEsMjk4IEBACisvLz09PS0gT2JqQ0FSQ0FuYWx5c2lzVXRpbHMuaCAtIE9iakMgQVJDIEFuYWx5c2lzIFV0aWxpdGllcyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIGRlZmluZXMgY29tbW9uIGFuYWx5c2lzIHV0aWxpdGllcyB1c2VkIGJ5IHRoZSBPYmpDIEFSQyBPcHRpbWl6ZXIuCisvLy8gQVJDIHN0YW5kcyBmb3IgQXV0b21hdGljIFJlZmVyZW5jZSBDb3VudGluZyBhbmQgaXMgYSBzeXN0ZW0gZm9yIG1hbmFnaW5nCisvLy8gcmVmZXJlbmNlIGNvdW50cyBmb3Igb2JqZWN0cyBpbiBPYmplY3RpdmUgQy4KKy8vLworLy8vIFdBUk5JTkc6IFRoaXMgZmlsZSBrbm93cyBhYm91dCBjZXJ0YWluIGxpYnJhcnkgZnVuY3Rpb25zLiBJdCByZWNvZ25pemVzIHRoZW0KKy8vLyBieSBuYW1lLCBhbmQgaGFyZHdpcmVzIGtub3dsZWRnZSBvZiB0aGVpciBzZW1hbnRpY3MuCisvLy8KKy8vLyBXQVJOSU5HOiBUaGlzIGZpbGUga25vd3MgYWJvdXQgaG93IGNlcnRhaW4gT2JqZWN0aXZlLUMgbGlicmFyeSBmdW5jdGlvbnMgYXJlCisvLy8gdXNlZC4gTmFpdmUgTExWTSBJUiB0cmFuc2Zvcm1hdGlvbnMgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJlCisvLy8gYmVoYXZpb3ItcHJlc2VydmluZyBtYXkgYnJlYWsgdGhlc2UgYXNzdW1wdGlvbnMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9MSUJfQU5BTFlTSVNfT0JKQ0FSQ0FOQUxZU0lTVVRJTFNfSAorI2RlZmluZSBMTFZNX0xJQl9BTkFMWVNJU19PQkpDQVJDQU5BTFlTSVNVVElMU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1N3aXRjaC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvT2JqQ0FSQ0luc3RLaW5kLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9QYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1ZhbHVlVHJhY2tpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyByYXdfb3N0cmVhbTsKK30KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9iamNhcmMgeworCisvLy8gXGJyaWVmIEEgaGFuZHkgb3B0aW9uIHRvIGVuYWJsZS9kaXNhYmxlIGFsbCBBUkMgT3B0aW1pemF0aW9ucy4KK2V4dGVybiBib29sIEVuYWJsZUFSQ09wdHM7CisKKy8vLyBcYnJpZWYgVGVzdCBpZiB0aGUgZ2l2ZW4gbW9kdWxlIGxvb2tzIGludGVyZXN0aW5nIHRvIHJ1biBBUkMgb3B0aW1pemF0aW9uCisvLy8gb24uCitpbmxpbmUgYm9vbCBNb2R1bGVIYXNBUkMoY29uc3QgTW9kdWxlICZNKSB7CisgIHJldHVybgorICAgIE0uZ2V0TmFtZWRWYWx1ZSgib2JqY19yZXRhaW4iKSB8fAorICAgIE0uZ2V0TmFtZWRWYWx1ZSgib2JqY19yZWxlYXNlIikgfHwKKyAgICBNLmdldE5hbWVkVmFsdWUoIm9iamNfYXV0b3JlbGVhc2UiKSB8fAorICAgIE0uZ2V0TmFtZWRWYWx1ZSgib2JqY19yZXRhaW5BdXRvcmVsZWFzZWRSZXR1cm5WYWx1ZSIpIHx8CisgICAgTS5nZXROYW1lZFZhbHVlKCJvYmpjX3Vuc2FmZUNsYWltQXV0b3JlbGVhc2VkUmV0dXJuVmFsdWUiKSB8fAorICAgIE0uZ2V0TmFtZWRWYWx1ZSgib2JqY19yZXRhaW5CbG9jayIpIHx8CisgICAgTS5nZXROYW1lZFZhbHVlKCJvYmpjX2F1dG9yZWxlYXNlUmV0dXJuVmFsdWUiKSB8fAorICAgIE0uZ2V0TmFtZWRWYWx1ZSgib2JqY19hdXRvcmVsZWFzZVBvb2xQdXNoIikgfHwKKyAgICBNLmdldE5hbWVkVmFsdWUoIm9iamNfbG9hZFdlYWtSZXRhaW5lZCIpIHx8CisgICAgTS5nZXROYW1lZFZhbHVlKCJvYmpjX2xvYWRXZWFrIikgfHwKKyAgICBNLmdldE5hbWVkVmFsdWUoIm9iamNfZGVzdHJveVdlYWsiKSB8fAorICAgIE0uZ2V0TmFtZWRWYWx1ZSgib2JqY19zdG9yZVdlYWsiKSB8fAorICAgIE0uZ2V0TmFtZWRWYWx1ZSgib2JqY19pbml0V2VhayIpIHx8CisgICAgTS5nZXROYW1lZFZhbHVlKCJvYmpjX21vdmVXZWFrIikgfHwKKyAgICBNLmdldE5hbWVkVmFsdWUoIm9iamNfY29weVdlYWsiKSB8fAorICAgIE0uZ2V0TmFtZWRWYWx1ZSgib2JqY19yZXRhaW5lZE9iamVjdCIpIHx8CisgICAgTS5nZXROYW1lZFZhbHVlKCJvYmpjX3VucmV0YWluZWRPYmplY3QiKSB8fAorICAgIE0uZ2V0TmFtZWRWYWx1ZSgib2JqY191bnJldGFpbmVkUG9pbnRlciIpIHx8CisgICAgTS5nZXROYW1lZFZhbHVlKCJjbGFuZy5hcmMudXNlIik7Cit9CisKKy8vLyBcYnJpZWYgVGhpcyBpcyBhIHdyYXBwZXIgYXJvdW5kIGdldFVuZGVybHlpbmdPYmplY3Qgd2hpY2ggYWxzbyBrbm93cyBob3cgdG8KKy8vLyBsb29rIHRocm91Z2ggb2JqY19yZXRhaW4gYW5kIG9iamNfYXV0b3JlbGVhc2UgY2FsbHMsIHdoaWNoIHdlIGtub3cgdG8gcmV0dXJuCisvLy8gdGhlaXIgYXJndW1lbnQgdmVyYmF0aW0uCitpbmxpbmUgY29uc3QgVmFsdWUgKkdldFVuZGVybHlpbmdPYmpDUHRyKGNvbnN0IFZhbHVlICpWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpIHsKKyAgZm9yICg7OykgeworICAgIFYgPSBHZXRVbmRlcmx5aW5nT2JqZWN0KFYsIERMKTsKKyAgICBpZiAoIUlzRm9yd2FyZGluZyhHZXRCYXNpY0FSQ0luc3RLaW5kKFYpKSkKKyAgICAgIGJyZWFrOworICAgIFYgPSBjYXN0PENhbGxJbnN0PihWKS0+Z2V0QXJnT3BlcmFuZCgwKTsKKyAgfQorCisgIHJldHVybiBWOworfQorCisvLy8gQSB3cmFwcGVyIGZvciBHZXRVbmRlcmx5aW5nT2JqQ1B0ciB1c2VkIGZvciByZXN1bHRzIG1lbW9pemF0aW9uLgoraW5saW5lIGNvbnN0IFZhbHVlICoKK0dldFVuZGVybHlpbmdPYmpDUHRyQ2FjaGVkKGNvbnN0IFZhbHVlICpWLCBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPGNvbnN0IFZhbHVlICosIGNvbnN0IFZhbHVlICo+ICZDYWNoZSkgeworICBpZiAoYXV0byBJbkNhY2hlID0gQ2FjaGUubG9va3VwKFYpKQorICAgIHJldHVybiBJbkNhY2hlOworCisgIHJldHVybiBDYWNoZVtWXSA9IEdldFVuZGVybHlpbmdPYmpDUHRyKFYsIERMKTsKK30KKworLy8vIFRoZSBSQ0lkZW50aXR5IHJvb3Qgb2YgYSB2YWx1ZSBccCBWIGlzIGEgZG9taW5hdGluZyB2YWx1ZSBVIGZvciB3aGljaAorLy8vIHJldGFpbmluZyBvciByZWxlYXNpbmcgVSBpcyBlcXVpdmFsZW50IHRvIHJldGFpbmluZyBvciByZWxlYXNpbmcgVi4gSW4gb3RoZXIKKy8vLyB3b3JkcywgQVJDIG9wZXJhdGlvbnMgb24gXHAgViBhcmUgZXF1aXZhbGVudCB0byBBUkMgb3BlcmF0aW9ucyBvbiBccCBVLgorLy8vCisvLy8gV2UgdXNlIHRoaXMgaW4gdGhlIEFSQyBvcHRpbWl6ZXIgdG8gbWFrZSBpdCBlYXNpZXIgdG8gbWF0Y2ggdXAgQVJDCisvLy8gb3BlcmF0aW9ucyBieSBhbHdheXMgbWFwcGluZyBBUkMgb3BlcmF0aW9ucyB0byBSQ0lkZW50aXR5Um9vdHMgaW5zdGVhZCBvZgorLy8vIHBvaW50ZXJzIHRoZW1zZWx2ZXMuCisvLy8KKy8vLyBUaGUgdHdvIHdheXMgdGhhdCB3ZSBzZWUgUkNJZGVudGljYWwgdmFsdWVzIGluIE9iakMgYXJlIHZpYToKKy8vLworLy8vICAgMS4gUG9pbnRlckNhc3RzCisvLy8gICAyLiBGb3J3YXJkaW5nIENhbGxzIHRoYXQgcmV0dXJuIHRoZWlyIGFyZ3VtZW50IHZlcmJhdGltLgorLy8vCisvLy8gVGh1cyB0aGlzIGZ1bmN0aW9uIHN0cmlwcyBvZmYgcG9pbnRlciBjYXN0cyBhbmQgZm9yd2FyZGluZyBjYWxscy4gKk5PVEUqCisvLy8gVGhpcyBpbXBsaWVzIHRoYXQgdHdvIFJDSWRlbnRpY2FsIHZhbHVlcyBtdXN0IGFsaWFzLgoraW5saW5lIGNvbnN0IFZhbHVlICpHZXRSQ0lkZW50aXR5Um9vdChjb25zdCBWYWx1ZSAqVikgeworICBmb3IgKDs7KSB7CisgICAgViA9IFYtPnN0cmlwUG9pbnRlckNhc3RzKCk7CisgICAgaWYgKCFJc0ZvcndhcmRpbmcoR2V0QmFzaWNBUkNJbnN0S2luZChWKSkpCisgICAgICBicmVhazsKKyAgICBWID0gY2FzdDxDYWxsSW5zdD4oViktPmdldEFyZ09wZXJhbmQoMCk7CisgIH0KKyAgcmV0dXJuIFY7Cit9CisKKy8vLyBIZWxwZXIgd2hpY2ggY2FsbHMgY29uc3QgVmFsdWUgKkdldFJDSWRlbnRpdHlSb290KGNvbnN0IFZhbHVlICpWKSBhbmQganVzdAorLy8vIGNhc3RzIGF3YXkgdGhlIGNvbnN0IG9mIHRoZSByZXN1bHQuIEZvciBkb2N1bWVudGF0aW9uIGFib3V0IHdoYXQgYW4KKy8vLyBSQ0lkZW50aXR5Um9vdCAoYW5kIGJ5IGV4dGVuc2lvbiBHZXRSQ0lkZW50aXR5Um9vdCBpcykgbG9vayBhdCB0aGF0CisvLy8gZnVuY3Rpb24uCitpbmxpbmUgVmFsdWUgKkdldFJDSWRlbnRpdHlSb290KFZhbHVlICpWKSB7CisgIHJldHVybiBjb25zdF9jYXN0PFZhbHVlICo+KEdldFJDSWRlbnRpdHlSb290KChjb25zdCBWYWx1ZSAqKVYpKTsKK30KKworLy8vIFxicmllZiBBc3N1bWluZyB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gaXMgb25lIG9mIHRoZSBzcGVjaWFsIGNhbGxzIHN1Y2ggYXMKKy8vLyBvYmpjX3JldGFpbiBvciBvYmpjX3JlbGVhc2UsIHJldHVybiB0aGUgUkNJZGVudGl0eSByb290IG9mIHRoZSBhcmd1bWVudCBvZgorLy8vIHRoZSBjYWxsLgoraW5saW5lIFZhbHVlICpHZXRBcmdSQ0lkZW50aXR5Um9vdChWYWx1ZSAqSW5zdCkgeworICByZXR1cm4gR2V0UkNJZGVudGl0eVJvb3QoY2FzdDxDYWxsSW5zdD4oSW5zdCktPmdldEFyZ09wZXJhbmQoMCkpOworfQorCitpbmxpbmUgYm9vbCBJc051bGxPclVuZGVmKGNvbnN0IFZhbHVlICpWKSB7CisgIHJldHVybiBpc2E8Q29uc3RhbnRQb2ludGVyTnVsbD4oVikgfHwgaXNhPFVuZGVmVmFsdWU+KFYpOworfQorCitpbmxpbmUgYm9vbCBJc05vb3BJbnN0cnVjdGlvbihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICByZXR1cm4gaXNhPEJpdENhc3RJbnN0PihJKSB8fAorICAgIChpc2E8R2V0RWxlbWVudFB0ckluc3Q+KEkpICYmCisgICAgIGNhc3Q8R2V0RWxlbWVudFB0ckluc3Q+KEkpLT5oYXNBbGxaZXJvSW5kaWNlcygpKTsKK30KKworLy8vIFxicmllZiBUZXN0IHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIHBvc3NpYmxlIGEgcmV0YWluYWJsZSBvYmplY3QgcG9pbnRlci4KK2lubGluZSBib29sIElzUG90ZW50aWFsUmV0YWluYWJsZU9ialB0cihjb25zdCBWYWx1ZSAqT3ApIHsKKyAgLy8gUG9pbnRlcnMgdG8gc3RhdGljIG9yIHN0YWNrIHN0b3JhZ2UgYXJlIG5vdCB2YWxpZCByZXRhaW5hYmxlIG9iamVjdAorICAvLyBwb2ludGVycy4KKyAgaWYgKGlzYTxDb25zdGFudD4oT3ApIHx8IGlzYTxBbGxvY2FJbnN0PihPcCkpCisgICAgcmV0dXJuIGZhbHNlOworICAvLyBTcGVjaWFsIGFyZ3VtZW50cyBjYW4gbm90IGJlIGEgdmFsaWQgcmV0YWluYWJsZSBvYmplY3QgcG9pbnRlci4KKyAgaWYgKGNvbnN0IEFyZ3VtZW50ICpBcmcgPSBkeW5fY2FzdDxBcmd1bWVudD4oT3ApKQorICAgIGlmIChBcmctPmhhc0J5VmFsQXR0cigpIHx8CisgICAgICAgIEFyZy0+aGFzSW5BbGxvY2FBdHRyKCkgfHwKKyAgICAgICAgQXJnLT5oYXNOZXN0QXR0cigpIHx8CisgICAgICAgIEFyZy0+aGFzU3RydWN0UmV0QXR0cigpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAvLyBPbmx5IGNvbnNpZGVyIHZhbHVlcyB3aXRoIHBvaW50ZXIgdHlwZXMuCisgIC8vCisgIC8vIEl0IHNlZW1lcyBpbnR1aXRpdmUgdG8gZXhjbHVkZSBmdW5jdGlvbiBwb2ludGVyIHR5cGVzIGFzIHdlbGwsIHNpbmNlCisgIC8vIGZ1bmN0aW9ucyBhcmUgbmV2ZXIgcmV0YWluYWJsZSBvYmplY3QgcG9pbnRlcnMsIGhvd2V2ZXIgY2xhbmcgb2NjYXNpb25hbGx5CisgIC8vIGJpdGNhc3RzIHJldGFpbmFibGUgb2JqZWN0IHBvaW50ZXJzIHRvIGZ1bmN0aW9uLXBvaW50ZXIgdHlwZSB0ZW1wb3JhcmlseS4KKyAgUG9pbnRlclR5cGUgKlR5ID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KE9wLT5nZXRUeXBlKCkpOworICBpZiAoIVR5KQorICAgIHJldHVybiBmYWxzZTsKKyAgLy8gQ29uc2VydmF0aXZlbHkgYXNzdW1lIGFueXRoaW5nIGVsc2UgaXMgYSBwb3RlbnRpYWwgcmV0YWluYWJsZSBvYmplY3QKKyAgLy8gcG9pbnRlci4KKyAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBib29sIElzUG90ZW50aWFsUmV0YWluYWJsZU9ialB0cihjb25zdCBWYWx1ZSAqT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgJkFBKSB7CisgIC8vIEZpcnN0IG1ha2UgdGhlIHJ1ZGltZW50YXJ5IGNoZWNrLgorICBpZiAoIUlzUG90ZW50aWFsUmV0YWluYWJsZU9ialB0cihPcCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE9iamVjdHMgaW4gY29uc3RhbnQgbWVtb3J5IGFyZSBub3QgcmVmZXJlbmNlLWNvdW50ZWQuCisgIGlmIChBQS5wb2ludHNUb0NvbnN0YW50TWVtb3J5KE9wKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gUG9pbnRlcnMgaW4gY29uc3RhbnQgbWVtb3J5IGFyZSBub3QgcG9pbnRpbmcgdG8gcmVmZXJlbmNlLWNvdW50ZWQgb2JqZWN0cy4KKyAgaWYgKGNvbnN0IExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihPcCkpCisgICAgaWYgKEFBLnBvaW50c1RvQ29uc3RhbnRNZW1vcnkoTEktPmdldFBvaW50ZXJPcGVyYW5kKCkpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIE90aGVyd2lzZSBhc3N1bWUgdGhlIHdvcnN0LgorICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFxicmllZiBIZWxwZXIgZm9yIEdldEFSQ0luc3RLaW5kLiBEZXRlcm1pbmVzIHdoYXQga2luZCBvZiBjb25zdHJ1Y3QgQ1MKKy8vLyBpcy4KK2lubGluZSBBUkNJbnN0S2luZCBHZXRDYWxsU2l0ZUNsYXNzKEltbXV0YWJsZUNhbGxTaXRlIENTKSB7CisgIGZvciAoSW1tdXRhYmxlQ2FsbFNpdGU6OmFyZ19pdGVyYXRvciBJID0gQ1MuYXJnX2JlZ2luKCksIEUgPSBDUy5hcmdfZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgaWYgKElzUG90ZW50aWFsUmV0YWluYWJsZU9ialB0cigqSSkpCisgICAgICByZXR1cm4gQ1Mub25seVJlYWRzTWVtb3J5KCkgPyBBUkNJbnN0S2luZDo6VXNlciA6IEFSQ0luc3RLaW5kOjpDYWxsT3JVc2VyOworCisgIHJldHVybiBDUy5vbmx5UmVhZHNNZW1vcnkoKSA/IEFSQ0luc3RLaW5kOjpOb25lIDogQVJDSW5zdEtpbmQ6OkNhbGw7Cit9CisKKy8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyB2YWx1ZSByZWZlcnMgdG8gYSBkaXN0aW5jdCBhbmQgaWRlbnRpZmlhYmxlCisvLy8gb2JqZWN0LgorLy8vCisvLy8gVGhpcyBpcyBzaW1pbGFyIHRvIEFsaWFzQW5hbHlzaXMncyBpc0lkZW50aWZpZWRPYmplY3QsIGV4Y2VwdCB0aGF0IGl0IHVzZXMKKy8vLyBzcGVjaWFsIGtub3dsZWRnZSBvZiBPYmpDIGNvbnZlbnRpb25zLgoraW5saW5lIGJvb2wgSXNPYmpDSWRlbnRpZmllZE9iamVjdChjb25zdCBWYWx1ZSAqVikgeworICAvLyBBc3N1bWUgdGhhdCBjYWxsIHJlc3VsdHMgYW5kIGFyZ3VtZW50cyBoYXZlIHRoZWlyIG93biAicHJvdmVuYW5jZSIuCisgIC8vIENvbnN0YW50cyAoaW5jbHVkaW5nIEdsb2JhbFZhcmlhYmxlcykgYW5kIEFsbG9jYXMgYXJlIG5ldmVyCisgIC8vIHJlZmVyZW5jZS1jb3VudGVkLgorICBpZiAoaXNhPENhbGxJbnN0PihWKSB8fCBpc2E8SW52b2tlSW5zdD4oVikgfHwKKyAgICAgIGlzYTxBcmd1bWVudD4oVikgfHwgaXNhPENvbnN0YW50PihWKSB8fAorICAgICAgaXNhPEFsbG9jYUluc3Q+KFYpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChjb25zdCBMb2FkSW5zdCAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oVikpIHsKKyAgICBjb25zdCBWYWx1ZSAqUG9pbnRlciA9CisgICAgICBHZXRSQ0lkZW50aXR5Um9vdChMSS0+Z2V0UG9pbnRlck9wZXJhbmQoKSk7CisgICAgaWYgKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihQb2ludGVyKSkgeworICAgICAgLy8gQSBjb25zdGFudCBwb2ludGVyIGNhbid0IGJlIHBvaW50aW5nIHRvIGFuIG9iamVjdCBvbiB0aGUgaGVhcC4gSXQgbWF5CisgICAgICAvLyBiZSByZWZlcmVuY2UtY291bnRlZCwgYnV0IGl0IHdvbid0IGJlIGRlbGV0ZWQuCisgICAgICBpZiAoR1YtPmlzQ29uc3RhbnQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBTdHJpbmdSZWYgTmFtZSA9IEdWLT5nZXROYW1lKCk7CisgICAgICAvLyBUaGVzZSBzcGVjaWFsIHZhcmlhYmxlcyBhcmUga25vd24gdG8gaG9sZCB2YWx1ZXMgd2hpY2ggYXJlIG5vdAorICAgICAgLy8gcmVmZXJlbmNlLWNvdW50ZWQgcG9pbnRlcnMuCisgICAgICBpZiAoTmFtZS5zdGFydHN3aXRoKCJcMDFsX29iamNfbXNnU2VuZF9maXh1cF8iKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIFN0cmluZ1JlZiBTZWN0aW9uID0gR1YtPmdldFNlY3Rpb24oKTsKKyAgICAgIGlmIChTZWN0aW9uLmZpbmQoIl9fbWVzc2FnZV9yZWZzIikgIT0gU3RyaW5nUmVmOjpucG9zIHx8CisgICAgICAgICAgU2VjdGlvbi5maW5kKCJfX29iamNfY2xhc3NyZWZzIikgIT0gU3RyaW5nUmVmOjpucG9zIHx8CisgICAgICAgICAgU2VjdGlvbi5maW5kKCJfX29iamNfc3VwZXJyZWZzIikgIT0gU3RyaW5nUmVmOjpucG9zIHx8CisgICAgICAgICAgU2VjdGlvbi5maW5kKCJfX29iamNfbWV0aG5hbWUiKSAhPSBTdHJpbmdSZWY6Om5wb3MgfHwKKyAgICAgICAgICBTZWN0aW9uLmZpbmQoIl9fY3N0cmluZyIpICE9IFN0cmluZ1JlZjo6bnBvcykKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitlbnVtIGNsYXNzIEFSQ01ES2luZElEIHsKKyAgSW1wcmVjaXNlUmVsZWFzZSwKKyAgQ29weU9uRXNjYXBlLAorICBOb09iakNBUkNFeGNlcHRpb25zLAorfTsKKworLy8vIEEgY2FjaGUgb2YgTURLaW5kcyB1c2VkIGJ5IHZhcmlvdXMgQVJDIG9wdGltaXphdGlvbnMuCitjbGFzcyBBUkNNREtpbmRDYWNoZSB7CisgIE1vZHVsZSAqTTsKKworICAvLy8gVGhlIE1ldGFkYXRhIEtpbmQgZm9yIGNsYW5nLmltcHJlY2lzZV9yZWxlYXNlIG1ldGFkYXRhLgorICBsbHZtOjpPcHRpb25hbDx1bnNpZ25lZD4gSW1wcmVjaXNlUmVsZWFzZU1ES2luZDsKKworICAvLy8gVGhlIE1ldGFkYXRhIEtpbmQgZm9yIGNsYW5nLmFyYy5jb3B5X29uX2VzY2FwZSBtZXRhZGF0YS4KKyAgbGx2bTo6T3B0aW9uYWw8dW5zaWduZWQ+IENvcHlPbkVzY2FwZU1ES2luZDsKKworICAvLy8gVGhlIE1ldGFkYXRhIEtpbmQgZm9yIGNsYW5nLmFyYy5ub19vYmpjX2FyY19leGNlcHRpb25zIG1ldGFkYXRhLgorICBsbHZtOjpPcHRpb25hbDx1bnNpZ25lZD4gTm9PYmpDQVJDRXhjZXB0aW9uc01ES2luZDsKKworcHVibGljOgorICB2b2lkIGluaXQoTW9kdWxlICpNb2QpIHsKKyAgICBNID0gTW9kOworICAgIEltcHJlY2lzZVJlbGVhc2VNREtpbmQgPSBOb25lVHlwZTo6Tm9uZTsKKyAgICBDb3B5T25Fc2NhcGVNREtpbmQgPSBOb25lVHlwZTo6Tm9uZTsKKyAgICBOb09iakNBUkNFeGNlcHRpb25zTURLaW5kID0gTm9uZVR5cGU6Ok5vbmU7CisgIH0KKworICB1bnNpZ25lZCBnZXQoQVJDTURLaW5kSUQgSUQpIHsKKyAgICBzd2l0Y2ggKElEKSB7CisgICAgY2FzZSBBUkNNREtpbmRJRDo6SW1wcmVjaXNlUmVsZWFzZToKKyAgICAgIGlmICghSW1wcmVjaXNlUmVsZWFzZU1ES2luZCkKKyAgICAgICAgSW1wcmVjaXNlUmVsZWFzZU1ES2luZCA9CisgICAgICAgICAgICBNLT5nZXRDb250ZXh0KCkuZ2V0TURLaW5kSUQoImNsYW5nLmltcHJlY2lzZV9yZWxlYXNlIik7CisgICAgICByZXR1cm4gKkltcHJlY2lzZVJlbGVhc2VNREtpbmQ7CisgICAgY2FzZSBBUkNNREtpbmRJRDo6Q29weU9uRXNjYXBlOgorICAgICAgaWYgKCFDb3B5T25Fc2NhcGVNREtpbmQpCisgICAgICAgIENvcHlPbkVzY2FwZU1ES2luZCA9CisgICAgICAgICAgICBNLT5nZXRDb250ZXh0KCkuZ2V0TURLaW5kSUQoImNsYW5nLmFyYy5jb3B5X29uX2VzY2FwZSIpOworICAgICAgcmV0dXJuICpDb3B5T25Fc2NhcGVNREtpbmQ7CisgICAgY2FzZSBBUkNNREtpbmRJRDo6Tm9PYmpDQVJDRXhjZXB0aW9uczoKKyAgICAgIGlmICghTm9PYmpDQVJDRXhjZXB0aW9uc01ES2luZCkKKyAgICAgICAgTm9PYmpDQVJDRXhjZXB0aW9uc01ES2luZCA9CisgICAgICAgICAgICBNLT5nZXRDb250ZXh0KCkuZ2V0TURLaW5kSUQoImNsYW5nLmFyYy5ub19vYmpjX2FyY19leGNlcHRpb25zIik7CisgICAgICByZXR1cm4gKk5vT2JqQ0FSQ0V4Y2VwdGlvbnNNREtpbmQ7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIkNvdmVyZWQgc3dpdGNoIGlzbid0IGNvdmVyZWQ/ISIpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb2JqY2FyYworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL09iakNBUkNJbnN0S2luZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9PYmpDQVJDSW5zdEtpbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmZmMDM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9PYmpDQVJDSW5zdEtpbmQuaApAQCAtMCwwICsxLDEyNCBAQAorLy89PT0tIE9iakNBUkNJbnN0S2luZC5oIC0gQVJDIGluc3RydWN0aW9uIGVxdWl2YWxlbmNlIGNsYXNzZXMgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX09CSkNBUkNJTlNUS0lORF9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfT0JKQ0FSQ0lOU1RLSU5EX0gKKworI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb2JqY2FyYyB7CisKKy8vLyBcZW51bSBBUkNJbnN0S2luZAorLy8vCisvLy8gXGJyaWVmIEVxdWl2YWxlbmNlIGNsYXNzZXMgb2YgaW5zdHJ1Y3Rpb25zIGluIHRoZSBBUkMgTW9kZWwuCisvLy8KKy8vLyBTaW5jZSB3ZSBkbyBub3QgaGF2ZSAiaW5zdHJ1Y3Rpb25zIiB0byByZXByZXNlbnQgQVJDIGNvbmNlcHRzIGluIExMVk0gSVIsCisvLy8gd2UgaW5zdGVhZCBvcGVyYXRlIG9uIGVxdWl2YWxlbmNlIGNsYXNzZXMgb2YgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgc3BsaXQgaW50byB0d28gZW51bXM6IGEgcnVudGltZSBlbnRyeSBwb2ludCBlbnVtCisvLy8gKHBvc3NpYmx5IHVuaXRlZCB3aXRoIHRoZSBBUkNSdW50aW1lRW50cnlwb2ludCBjbGFzcykgYW5kIGFuIGVudW0gdGhhdCBkZWFscworLy8vIHdpdGggZWZmZWN0cyBvZiBpbnN0cnVjdGlvbnMgaW4gdGhlIEFSQyBtb2RlbCAod2hpY2ggd291bGQgaGFuZGxlIHRoZSBub3Rpb24KKy8vLyBvZiBhIFVzZXIgb3IgQ2FsbE9yVXNlcikuCitlbnVtIGNsYXNzIEFSQ0luc3RLaW5kIHsKKyAgUmV0YWluLCAgICAgICAgICAgICAgICAgICAvLy88IG9iamNfcmV0YWluCisgIFJldGFpblJWLCAgICAgICAgICAgICAgICAgLy8vPCBvYmpjX3JldGFpbkF1dG9yZWxlYXNlZFJldHVyblZhbHVlCisgIENsYWltUlYsICAgICAgICAgICAgICAgICAgLy8vPCBvYmpjX3Vuc2FmZUNsYWltQXV0b3JlbGVhc2VkUmV0dXJuVmFsdWUKKyAgUmV0YWluQmxvY2ssICAgICAgICAgICAgICAvLy88IG9iamNfcmV0YWluQmxvY2sKKyAgUmVsZWFzZSwgICAgICAgICAgICAgICAgICAvLy88IG9iamNfcmVsZWFzZQorICBBdXRvcmVsZWFzZSwgICAgICAgICAgICAgIC8vLzwgb2JqY19hdXRvcmVsZWFzZQorICBBdXRvcmVsZWFzZVJWLCAgICAgICAgICAgIC8vLzwgb2JqY19hdXRvcmVsZWFzZVJldHVyblZhbHVlCisgIEF1dG9yZWxlYXNlcG9vbFB1c2gsICAgICAgLy8vPCBvYmpjX2F1dG9yZWxlYXNlUG9vbFB1c2gKKyAgQXV0b3JlbGVhc2Vwb29sUG9wLCAgICAgICAvLy88IG9iamNfYXV0b3JlbGVhc2VQb29sUG9wCisgIE5vb3BDYXN0LCAgICAgICAgICAgICAgICAgLy8vPCBvYmpjX3JldGFpbmVkT2JqZWN0LCBldGMuCisgIEZ1c2VkUmV0YWluQXV0b3JlbGVhc2UsICAgLy8vPCBvYmpjX3JldGFpbkF1dG9yZWxlYXNlCisgIEZ1c2VkUmV0YWluQXV0b3JlbGVhc2VSViwgLy8vPCBvYmpjX3JldGFpbkF1dG9yZWxlYXNlUmV0dXJuVmFsdWUKKyAgTG9hZFdlYWtSZXRhaW5lZCwgICAgICAgICAvLy88IG9iamNfbG9hZFdlYWtSZXRhaW5lZCAocHJpbWl0aXZlKQorICBTdG9yZVdlYWssICAgICAgICAgICAgICAgIC8vLzwgb2JqY19zdG9yZVdlYWsgKHByaW1pdGl2ZSkKKyAgSW5pdFdlYWssICAgICAgICAgICAgICAgICAvLy88IG9iamNfaW5pdFdlYWsgKGRlcml2ZWQpCisgIExvYWRXZWFrLCAgICAgICAgICAgICAgICAgLy8vPCBvYmpjX2xvYWRXZWFrIChkZXJpdmVkKQorICBNb3ZlV2VhaywgICAgICAgICAgICAgICAgIC8vLzwgb2JqY19tb3ZlV2VhayAoZGVyaXZlZCkKKyAgQ29weVdlYWssICAgICAgICAgICAgICAgICAvLy88IG9iamNfY29weVdlYWsgKGRlcml2ZWQpCisgIERlc3Ryb3lXZWFrLCAgICAgICAgICAgICAgLy8vPCBvYmpjX2Rlc3Ryb3lXZWFrIChkZXJpdmVkKQorICBTdG9yZVN0cm9uZywgICAgICAgICAgICAgIC8vLzwgb2JqY19zdG9yZVN0cm9uZyAoZGVyaXZlZCkKKyAgSW50cmluc2ljVXNlciwgICAgICAgICAgICAvLy88IGNsYW5nLmFyYy51c2UKKyAgQ2FsbE9yVXNlciwgICAgICAgICAgICAgICAvLy88IGNvdWxkIGNhbGwgb2JqY19yZWxlYXNlIGFuZC9vciAidXNlIiBwb2ludGVycworICBDYWxsLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgY291bGQgY2FsbCBvYmpjX3JlbGVhc2UKKyAgVXNlciwgICAgICAgICAgICAgICAgICAgICAvLy88IGNvdWxkICJ1c2UiIGEgcG9pbnRlcgorICBOb25lICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYW55dGhpbmcgdGhhdCBpcyBpbmVydCBmcm9tIGFuIEFSQyBwZXJzcGVjdGl2ZS4KK307CisKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgQVJDSW5zdEtpbmQgQ2xhc3MpOworCisvLy8gXGJyaWVmIFRlc3QgaWYgdGhlIGdpdmVuIGNsYXNzIGlzIGEga2luZCBvZiB1c2VyLgorYm9vbCBJc1VzZXIoQVJDSW5zdEtpbmQgQ2xhc3MpOworCisvLy8gXGJyaWVmIFRlc3QgaWYgdGhlIGdpdmVuIGNsYXNzIGlzIG9iamNfcmV0YWluIG9yIGVxdWl2YWxlbnQuCitib29sIElzUmV0YWluKEFSQ0luc3RLaW5kIENsYXNzKTsKKworLy8vIFxicmllZiBUZXN0IGlmIHRoZSBnaXZlbiBjbGFzcyBpcyBvYmpjX2F1dG9yZWxlYXNlIG9yIGVxdWl2YWxlbnQuCitib29sIElzQXV0b3JlbGVhc2UoQVJDSW5zdEtpbmQgQ2xhc3MpOworCisvLy8gXGJyaWVmIFRlc3QgaWYgdGhlIGdpdmVuIGNsYXNzIHJlcHJlc2VudHMgaW5zdHJ1Y3Rpb25zIHdoaWNoIHJldHVybiB0aGVpcgorLy8vIGFyZ3VtZW50IHZlcmJhdGltLgorYm9vbCBJc0ZvcndhcmRpbmcoQVJDSW5zdEtpbmQgQ2xhc3MpOworCisvLy8gXGJyaWVmIFRlc3QgaWYgdGhlIGdpdmVuIGNsYXNzIHJlcHJlc2VudHMgaW5zdHJ1Y3Rpb25zIHdoaWNoIGRvIG5vdGhpbmcgaWYKKy8vLyBwYXNzZWQgYSBudWxsIHBvaW50ZXIuCitib29sIElzTm9vcE9uTnVsbChBUkNJbnN0S2luZCBDbGFzcyk7CisKKy8vLyBcYnJpZWYgVGVzdCBpZiB0aGUgZ2l2ZW4gY2xhc3MgcmVwcmVzZW50cyBpbnN0cnVjdGlvbnMgd2hpY2ggYXJlIGFsd2F5cyBzYWZlCisvLy8gdG8gbWFyayB3aXRoIHRoZSAidGFpbCIga2V5d29yZC4KK2Jvb2wgSXNBbHdheXNUYWlsKEFSQ0luc3RLaW5kIENsYXNzKTsKKworLy8vIFxicmllZiBUZXN0IGlmIHRoZSBnaXZlbiBjbGFzcyByZXByZXNlbnRzIGluc3RydWN0aW9ucyB3aGljaCBhcmUgbmV2ZXIgc2FmZQorLy8vIHRvIG1hcmsgd2l0aCB0aGUgInRhaWwiIGtleXdvcmQuCitib29sIElzTmV2ZXJUYWlsKEFSQ0luc3RLaW5kIENsYXNzKTsKKworLy8vIFxicmllZiBUZXN0IGlmIHRoZSBnaXZlbiBjbGFzcyByZXByZXNlbnRzIGluc3RydWN0aW9ucyB3aGljaCBhcmUgYWx3YXlzIHNhZmUKKy8vLyB0byBtYXJrIHdpdGggdGhlIG5vdW53aW5kIGF0dHJpYnV0ZS4KK2Jvb2wgSXNOb1Rocm93KEFSQ0luc3RLaW5kIENsYXNzKTsKKworLy8vIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gY2FuIGF1dG9yZWxlYXNlIGFueSBwb2ludGVyIG9yIGNhdXNlIGFuCisvLy8gYXV0b3JlbGVhc2Vwb29sIHBvcC4KK2Jvb2wgQ2FuSW50ZXJydXB0UlYoQVJDSW5zdEtpbmQgQ2xhc3MpOworCisvLy8gXGJyaWVmIERldGVybWluZSBpZiBGIGlzIG9uZSBvZiB0aGUgc3BlY2lhbCBrbm93biBGdW5jdGlvbnMuICBJZiBpdCBpc24ndCwKKy8vLyByZXR1cm4gQVJDSW5zdEtpbmQ6OkNhbGxPclVzZXIuCitBUkNJbnN0S2luZCBHZXRGdW5jdGlvbkNsYXNzKGNvbnN0IEZ1bmN0aW9uICpGKTsKKworLy8vIFxicmllZiBEZXRlcm1pbmUgd2hpY2ggb2JqYyBydW50aW1lIGNhbGwgaW5zdHJ1Y3Rpb24gY2xhc3MgViBiZWxvbmdzIHRvLgorLy8vCisvLy8gVGhpcyBpcyBzaW1pbGFyIHRvIEdldEFSQ0luc3RLaW5kIGV4Y2VwdCB0aGF0IGl0IG9ubHkgZGV0ZWN0cyBvYmpjCisvLy8gcnVudGltZSBjYWxscy4gVGhpcyBhbGxvd3MgaXQgdG8gYmUgZmFzdGVyLgorLy8vCitpbmxpbmUgQVJDSW5zdEtpbmQgR2V0QmFzaWNBUkNJbnN0S2luZChjb25zdCBWYWx1ZSAqVikgeworICBpZiAoY29uc3QgQ2FsbEluc3QgKkNJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KFYpKSB7CisgICAgaWYgKGNvbnN0IEZ1bmN0aW9uICpGID0gQ0ktPmdldENhbGxlZEZ1bmN0aW9uKCkpCisgICAgICByZXR1cm4gR2V0RnVuY3Rpb25DbGFzcyhGKTsKKyAgICAvLyBPdGhlcndpc2UsIGJlIGNvbnNlcnZhdGl2ZS4KKyAgICByZXR1cm4gQVJDSW5zdEtpbmQ6OkNhbGxPclVzZXI7CisgIH0KKworICAvLyBPdGhlcndpc2UsIGJlIGNvbnNlcnZhdGl2ZS4KKyAgcmV0dXJuIGlzYTxJbnZva2VJbnN0PihWKSA/IEFSQ0luc3RLaW5kOjpDYWxsT3JVc2VyIDogQVJDSW5zdEtpbmQ6OlVzZXI7Cit9CisKKy8vLyBNYXAgViB0byBpdHMgQVJDSW5zdEtpbmQgZXF1aXZhbGVuY2UgY2xhc3MuCitBUkNJbnN0S2luZCBHZXRBUkNJbnN0S2luZChjb25zdCBWYWx1ZSAqVik7CisKKy8vLyBSZXR1cm5zIGZhbHNlIGlmIGNvbnNlcnZhdGl2ZWx5IHdlIGNhbiBwcm92ZSB0aGF0IGFueSBpbnN0cnVjdGlvbiBtYXBwZWQgdG8KKy8vLyB0aGlzIGtpbmQgY2FuIG5vdCBkZWNyZW1lbnQgcmVmIGNvdW50cy4gUmV0dXJucyB0cnVlIG90aGVyd2lzZS4KK2Jvb2wgQ2FuRGVjcmVtZW50UmVmQ291bnQoQVJDSW5zdEtpbmQgS2luZCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvYmpjYXJjCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9PcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmMzJhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlci5oCkBAIC0wLDAgKzEsMTY4IEBACisvLz09PS0gT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlci5oIC0gT3B0aW1pemF0aW9uIERpYWdub3N0aWMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE9wdGltaXphdGlvbiBkaWFnbm9zdGljIGludGVyZmFjZXMuICBJdCdzIHBhY2thZ2VkIGFzIGFuIGFuYWx5c2lzIHBhc3Mgc28KKy8vIHRoYXQgYnkgdXNpbmcgdGhpcyBzZXJ2aWNlIHBhc3NlcyBiZWNvbWUgZGVwZW5kZW50IG9uIEJGSSBhcyB3ZWxsLiAgQkZJIGlzCisvLyB1c2VkIHRvIGNvbXB1dGUgdGhlICJob3RuZXNzIiBvZiB0aGUgZGlhZ25vc3RpYyBtZXNzYWdlLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX09QVElNSVpBVElPTkRJQUdOT1NUSUNJTkZPX0gKKyNkZWZpbmUgTExWTV9JUl9PUFRJTUlaQVRJT05ESUFHTk9TVElDSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQmxvY2tGcmVxdWVuY3lJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EaWFnbm9zdGljSW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIERlYnVnTG9jOworY2xhc3MgTG9vcDsKK2NsYXNzIFBhc3M7CitjbGFzcyBUd2luZTsKK2NsYXNzIFZhbHVlOworCisvLy8gVGhlIG9wdGltaXphdGlvbiBkaWFnbm9zdGljIGludGVyZmFjZS4KKy8vLworLy8vIEl0IGFsbG93cyByZXBvcnRpbmcgd2hlbiBvcHRpbWl6YXRpb25zIGFyZSBwZXJmb3JtZWQgYW5kIHdoZW4gdGhleSBhcmUgbm90CisvLy8gYWxvbmcgd2l0aCB0aGUgcmVhc29ucyBmb3IgaXQuICBIb3RuZXNzIGluZm9ybWF0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nCisvLy8gY29kZSByZWdpb24gY2FuIGJlIGluY2x1ZGVkIGluIHRoZSByZW1hcmsgaWYgRGlhZ25vc3RpY3NIb3RuZXNzUmVxdWVzdGVkIGlzCisvLy8gZW5hYmxlZCBpbiB0aGUgTExWTSBjb250ZXh0LgorY2xhc3MgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciB7CitwdWJsaWM6CisgIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIoY29uc3QgRnVuY3Rpb24gKkYsIEJsb2NrRnJlcXVlbmN5SW5mbyAqQkZJKQorICAgICAgOiBGKEYpLCBCRkkoQkZJKSB7fQorCisgIC8vLyBcYnJpZWYgVGhpcyB2YXJpYW50IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIE9SRSBvbiBkZW1hbmQgKHdpdGhvdXQgdGhlCisgIC8vLyBhbmFseXNpcyBwYXNzKS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBjdG9yIGhhcyBhIHZlcnkgZGlmZmVyZW50IGNvc3QgZGVwZW5kaW5nIG9uIHdoZXRoZXIKKyAgLy8vIEYtPmdldENvbnRleHQoKS5nZXREaWFnbm9zdGljc0hvdG5lc3NSZXF1ZXN0ZWQoKSBpcyBvbiBvciBub3QuICBJZiBpdCdzIG9mZgorICAvLy8gdGhlIG9wZXJhdGlvbiBpcyBmcmVlLgorICAvLy8KKyAgLy8vIFdoZXJlYXMgaWYgRGlhZ25vc3RpY3NIb3RuZXNzUmVxdWVzdGVkIGlzIG9uLCBpdCBpcyBmYWlybHkgZXhwZW5zaXZlCisgIC8vLyBvcGVyYXRpb24gc2luY2UgQkZJIGFuZCBhbGwgaXRzIHJlcXVpcmVkIGFuYWx5c2VzIGFyZSBjb21wdXRlZC4gIFRoaXMgaXMKKyAgLy8vIGZvciBleGFtcGxlIHVzZWZ1bCBmb3IgQ0dTQ0MgcGFzc2VzIHRoYXQgY2FuJ3QgdXNlIGZ1bmN0aW9uIGFuYWx5c2VzCisgIC8vLyBwYXNzZXMgaW4gdGhlIG9sZCBQTS4KKyAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlcihjb25zdCBGdW5jdGlvbiAqRik7CisKKyAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlcihPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICYmQXJnKQorICAgICAgOiBGKEFyZy5GKSwgQkZJKEFyZy5CRkkpIHt9CisKKyAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAmb3BlcmF0b3I9KE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgJiZSSFMpIHsKKyAgICBGID0gUkhTLkY7CisgICAgQkZJID0gUkhTLkJGSTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gSGFuZGxlIGludmFsaWRhdGlvbiBldmVudHMgaW4gdGhlIG5ldyBwYXNzIG1hbmFnZXIuCisgIGJvb2wgaW52YWxpZGF0ZShGdW5jdGlvbiAmRiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJlBBLAorICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BbmFseXNpc01hbmFnZXI6OkludmFsaWRhdG9yICZJbnYpOworCisgIC8vLyBcYnJpZWYgT3V0cHV0IHRoZSByZW1hcmsgdmlhIHRoZSBkaWFnbm9zdGljIGhhbmRsZXIgYW5kIHRvIHRoZQorICAvLy8gb3B0aW1pemF0aW9uIHJlY29yZCBmaWxlLgorICB2b2lkIGVtaXQoRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlICZPcHREaWFnKTsKKworICAvLy8gXGJyaWVmIFRha2UgYSBsYW1iZGEgdGhhdCByZXR1cm5zIGEgcmVtYXJrIHdoaWNoIHdpbGwgYmUgZW1pdHRlZC4gIFNlY29uZAorICAvLy8gYXJndW1lbnQgaXMgb25seSB1c2VkIHRvIHJlc3RyaWN0IHRoaXMgdG8gZnVuY3Rpb25zLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCBlbWl0KFQgUmVtYXJrQnVpbGRlciwgZGVjbHR5cGUoUmVtYXJrQnVpbGRlcigpKSAqID0gbnVsbHB0cikgeworICAgIC8vIEF2b2lkIGJ1aWxkaW5nIHRoZSByZW1hcmsgdW5sZXNzIHdlIGtub3cgdGhlcmUgYXJlIGF0IGxlYXN0ICpzb21lKgorICAgIC8vIHJlbWFya3MgZW5hYmxlZC4gV2UgY2FuJ3QgY3VycmVudGx5IGNoZWNrIHdoZXRoZXIgcmVtYXJrcyBhcmUgcmVxdWVzdGVkCisgICAgLy8gZm9yIHRoZSBjYWxsaW5nIHBhc3Mgc2luY2UgdGhhdCByZXF1aXJlcyBhY3R1YWxseSBidWlsZGluZyB0aGUgcmVtYXJrLgorCisgICAgaWYgKEYtPmdldENvbnRleHQoKS5nZXREaWFnbm9zdGljc091dHB1dEZpbGUoKSB8fAorICAgICAgICBGLT5nZXRDb250ZXh0KCkuZ2V0RGlhZ0hhbmRsZXJQdHIoKS0+aXNBbnlSZW1hcmtFbmFibGVkKCkpIHsKKyAgICAgIGF1dG8gUiA9IFJlbWFya0J1aWxkZXIoKTsKKyAgICAgIGVtaXQoKERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZSAmKVIpOworICAgIH0KKyAgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB3ZSBhbGxvdyBmb3IgZXh0cmEgY29tcGlsZS10aW1lIGJ1ZGdldCB0byBwZXJmb3JtIG1vcmUKKyAgLy8vIGFuYWx5c2lzIHRvIHByb2R1Y2UgZmV3ZXIgZmFsc2UgcG9zaXRpdmVzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZnVsIHdoZW4gcmVwb3J0aW5nIG1pc3NlZCBvcHRpbWl6YXRpb25zLiAgSW4gdGhpcyBjYXNlIHdlIGNhbgorICAvLy8gdXNlIHRoZSBleHRyYSBhbmFseXNpcyAoMSkgdG8gZmlsdGVyIHRyaXZpYWwgZmFsc2UgcG9zaXRpdmVzIG9yICgyKSB0bworICAvLy8gcHJvdmlkZSBtb3JlIGNvbnRleHQgc28gdGhhdCBub24tdHJpdmlhbCBmYWxzZSBwb3NpdGl2ZXMgY2FuIGJlIHF1aWNrbHkKKyAgLy8vIGRldGVjdGVkIGJ5IHRoZSB1c2VyLgorICBib29sIGFsbG93RXh0cmFBbmFseXNpcyhTdHJpbmdSZWYgUGFzc05hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gKEYtPmdldENvbnRleHQoKS5nZXREaWFnbm9zdGljc091dHB1dEZpbGUoKSB8fAorICAgICAgICAgICAgRi0+Z2V0Q29udGV4dCgpLmdldERpYWdIYW5kbGVyUHRyKCktPmlzQW55UmVtYXJrRW5hYmxlZChQYXNzTmFtZSkpOworICB9CisKK3ByaXZhdGU6CisgIGNvbnN0IEZ1bmN0aW9uICpGOworCisgIEJsb2NrRnJlcXVlbmN5SW5mbyAqQkZJOworCisgIC8vLyBJZiB3ZSBnZW5lcmF0ZSBCRkkgb24gZGVtYW5kLCB3ZSBuZWVkIHRvIGZyZWUgaXQgd2hlbiBPUkUgaXMgZnJlZWQuCisgIHN0ZDo6dW5pcXVlX3B0cjxCbG9ja0ZyZXF1ZW5jeUluZm8+IE93bmVkQkZJOworCisgIC8vLyBDb21wdXRlIGhvdG5lc3MgZnJvbSBJUiB2YWx1ZSAoY3VycmVudGx5IGFzc3VtZWQgdG8gYmUgYSBibG9jaykgaWYgUEdPIGlzCisgIC8vLyBhdmFpbGFibGUuCisgIE9wdGlvbmFsPHVpbnQ2NF90PiBjb21wdXRlSG90bmVzcyhjb25zdCBWYWx1ZSAqVik7CisKKyAgLy8vIFNpbWlsYXIgYnV0IHVzZSB2YWx1ZSBmcm9tIFxwIE9wdERpYWcgYW5kIHVwZGF0ZSBob3RuZXNzIHRoZXJlLgorICB2b2lkIGNvbXB1dGVIb3RuZXNzKERpYWdub3N0aWNJbmZvSVJPcHRpbWl6YXRpb24gJk9wdERpYWcpOworCisgIC8vLyBcYnJpZWYgT25seSBhbGxvdyB2ZXJib3NlIG1lc3NhZ2VzIGlmIHdlIGtub3cgd2UncmUgZmlsdGVyaW5nIGJ5IGhvdG5lc3MKKyAgLy8vIChCRkkgaXMgb25seSBzZXQgaW4gdGhpcyBjYXNlKS4KKyAgYm9vbCBzaG91bGRFbWl0VmVyYm9zZSgpIHsgcmV0dXJuIEJGSSAhPSBudWxscHRyOyB9CisKKyAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlcihjb25zdCBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICYpID0gZGVsZXRlOworfTsKKworLy8vIFxicmllZiBBZGQgYSBzbWFsbCBuYW1lc3BhY2UgdG8gYXZvaWQgbmFtZSBjbGFzaGVzIHdpdGggdGhlIGNsYXNzZXMgdXNlZCBpbgorLy8vIHRoZSBzdHJlYW1pbmcgaW50ZXJmYWNlLiAgV2Ugd2FudCB0aGVzZSB0byBiZSBzaG9ydCBmb3IgYmV0dGVyCisvLy8gd3JpdGUvcmVhZGFiaWxpdHkuCituYW1lc3BhY2Ugb3JlIHsKK3VzaW5nIE5WID0gRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlOjpBcmd1bWVudDsKK3VzaW5nIHNldElzVmVyYm9zZSA9IERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZTo6c2V0SXNWZXJib3NlOwordXNpbmcgc2V0RXh0cmFBcmdzID0gRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlOjpzZXRFeHRyYUFyZ3M7Cit9CisKKy8vLyBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyIGxlZ2FjeSBhbmFseXNpcyBwYXNzCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhpcyBwYXNzIHNob3VsZG4ndCBnZW5lcmFsbHkgYmUgbWFya2VkIGFzIHByZXNlcnZlZCBieSBvdGhlcgorLy8vIHBhc3Nlcy4gIEl0J3MgaG9sZGluZyBvbnRvIEJGSSwgc28gaWYgdGhlIHBhc3MgZG9lcyBub3QgcHJlc2VydmUgQkZJLCBCRkkKKy8vLyBjb3VsZCBiZSBmcmVlZC4KK2NsYXNzIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXJXcmFwcGVyUGFzcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICBzdGQ6OnVuaXF1ZV9wdHI8T3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlcj4gT1JFOworCitwdWJsaWM6CisgIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXJXcmFwcGVyUGFzcygpOworCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICZnZXRPUkUoKSB7CisgICAgYXNzZXJ0KE9SRSAmJiAicGFzcyBub3QgcnVuIHlldCIpOworICAgIHJldHVybiAqT1JFOworICB9CisKKyAgc3RhdGljIGNoYXIgSUQ7Cit9OworCitjbGFzcyBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyQW5hbHlzaXMKKyAgICA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjxPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyQW5hbHlzaXM+IHsKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXJBbmFseXNpcz47CisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBQcm92aWRlIHRoZSByZXN1bHQgdHlwZWRlZiBmb3IgdGhpcyBhbmFseXNpcyBwYXNzLgorICB0eXBlZGVmIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgUmVzdWx0OworCisgIC8vLyBcYnJpZWYgUnVuIHRoZSBhbmFseXNpcyBwYXNzIG92ZXIgYSBmdW5jdGlvbiBhbmQgcHJvZHVjZSBCRkkuCisgIFJlc3VsdCBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworfQorI2VuZGlmIC8vIExMVk1fSVJfT1BUSU1JWkFUSU9ORElBR05PU1RJQ0lORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9PcmRlcmVkQmFzaWNCbG9jay5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9PcmRlcmVkQmFzaWNCbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNzE2YWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL09yZGVyZWRCYXNpY0Jsb2NrLmgKQEAgLTAsMCArMSw2NyBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvT3JkZXJlZEJhc2ljQmxvY2suaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBPcmRlcmVkQmFzaWNCbG9jayBjbGFzcy4gT3JkZXJlZEJhc2ljQmxvY2sgbWFpbnRhaW5zCisvLyBhbiBpbnRlcmZhY2Ugd2hlcmUgY2xpZW50cyBjYW4gcXVlcnkgaWYgb25lIGluc3RydWN0aW9uIGNvbWVzIGJlZm9yZSBhbm90aGVyCisvLyBpbiBhIEJhc2ljQmxvY2suIFNpbmNlIEJhc2ljQmxvY2sgY3VycmVudGx5IGxhY2tzIGEgcmVsaWFibGUgd2F5IHRvIHF1ZXJ5CisvLyByZWxhdGl2ZSBwb3NpdGlvbiBiZXR3ZWVuIGluc3RydWN0aW9ucyBvbmUgY2FuIHVzZSBPcmRlcmVkQmFzaWNCbG9jayB0byBkbworLy8gc3VjaCBxdWVyaWVzLiBPcmRlcmVkQmFzaWNCbG9jayBpcyBsYXppbHkgYnVpbHQgb24gYSBzb3VyY2UgQmFzaWNCbG9jayBhbmQKKy8vIG1haW50YWlucyBhbiBpbnRlcm5hbCBJbnN0cnVjdGlvbiAtPiBQb3NpdGlvbiBtYXAuIEEgT3JkZXJlZEJhc2ljQmxvY2sKKy8vIGluc3RhbmNlIHNob3VsZCBiZSBkaXNjYXJkZWQgd2hlbmV2ZXIgdGhlIHNvdXJjZSBCYXNpY0Jsb2NrIGNoYW5nZXMuCisvLworLy8gSXQncyBjdXJyZW50bHkgdXNlZCBieSB0aGUgQ2FwdHVyZVRyYWNrZXIgaW4gb3JkZXIgdG8gZmluZCByZWxhdGl2ZQorLy8gcG9zaXRpb25zIG9mIGEgcGFpciBvZiBpbnN0cnVjdGlvbnMgaW5zaWRlIGEgQmFzaWNCbG9jay4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfT1JERVJFREJBU0lDQkxPQ0tfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX09SREVSRURCQVNJQ0JMT0NLX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBCYXNpY0Jsb2NrOworCitjbGFzcyBPcmRlcmVkQmFzaWNCbG9jayB7Citwcml2YXRlOgorICAvLy8gXGJyaWVmIE1hcCBhIGluc3RydWN0aW9uIHRvIGl0cyBwb3NpdGlvbiBpbiBhIEJhc2ljQmxvY2suCisgIFNtYWxsRGVuc2VNYXA8Y29uc3QgSW5zdHJ1Y3Rpb24gKiwgdW5zaWduZWQsIDMyPiBOdW1iZXJlZEluc3RzOworCisgIC8vLyBcYnJpZWYgS2VlcCB0cmFjayBvZiBsYXN0IGluc3RydWN0aW9uIGluc2VydGVkIGludG8gXHAgTnVtYmVyZWRJbnN0cy4KKyAgLy8vIEl0IHNwZWVkcyB1cCBxdWVyaWVzIGZvciB1bmNhY2hlZCBpbnN0cnVjdGlvbnMgYnkgcHJvdmlkaW5nIGEgc3RhcnQgcG9pbnQKKyAgLy8vIGZvciBuZXcgcXVlcmllcyBpbiBPcmRlcmVkQmFzaWNCbG9jazo6Y29tZXNCZWZvcmUuCisgIEJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIExhc3RJbnN0Rm91bmQ7CisKKyAgLy8vIFxicmllZiBUaGUgcG9zaXRpb24vbnVtYmVyIHRvIHRhZyB0aGUgbmV4dCBpbnN0cnVjdGlvbiB0byBiZSBmb3VuZC4KKyAgdW5zaWduZWQgTmV4dEluc3RQb3M7CisKKyAgLy8vIFxicmllZiBUaGUgc291cmNlIEJhc2ljQmxvY2sgdG8gbWFwLgorICBjb25zdCBCYXNpY0Jsb2NrICpCQjsKKworICAvLy8gXGJyaWVmIEdpdmVuIG5vIGNhY2hlZCByZXN1bHRzLCBmaW5kIGlmIFxwIEEgY29tZXMgYmVmb3JlIFxwIEIgaW4gXHAgQkIuCisgIC8vLyBDYWNoZSBhbmQgbnVtYmVyIG91dCBpbnN0cnVjdGlvbiB3aGlsZSB3YWxraW5nIFxwIEJCLgorICBib29sIGNvbWVzQmVmb3JlKGNvbnN0IEluc3RydWN0aW9uICpBLCBjb25zdCBJbnN0cnVjdGlvbiAqQik7CisKK3B1YmxpYzoKKyAgT3JkZXJlZEJhc2ljQmxvY2soY29uc3QgQmFzaWNCbG9jayAqQmFzaWNCKTsKKworICAvLy8gXGJyaWVmIEZpbmQgb3V0IHdoZXRoZXIgXHAgQSBkb21pbmF0ZXMgXHAgQiwgbWVhbmluZyB3aGV0aGVyIFxwIEEKKyAgLy8vIGNvbWVzIGJlZm9yZSBccCBCIGluIFxwIEJCLiBUaGlzIGlzIGEgc2ltcGxpZmljYXRpb24gdGhhdCBjb25zaWRlcnMKKyAgLy8vIGNhY2hlZCBpbnN0cnVjdGlvbiBwb3NpdGlvbnMgYW5kIGlnbm9yZXMgb3RoZXIgYmFzaWMgYmxvY2tzLCBiZWluZworICAvLy8gb25seSByZWxldmFudCB0byBjb21wYXJlIHJlbGF0aXZlIGluc3RydWN0aW9ucyBwb3NpdGlvbnMgaW5zaWRlIFxwIEJCLgorICAvLy8gUmV0dXJucyBmYWxzZSBmb3IgQSA9PSBCLgorICBib29sIGRvbWluYXRlcyhjb25zdCBJbnN0cnVjdGlvbiAqQSwgY29uc3QgSW5zdHJ1Y3Rpb24gKkIpOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1BISVRyYW5zQWRkci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9QSElUcmFuc0FkZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGYzNGYzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9QSElUcmFuc0FkZHIuaApAQCAtMCwwICsxLDEyNyBAQAorLy89PT0tIFBISVRyYW5zQWRkci5oIC0gUEhJIFRyYW5zbGF0aW9uIGZvciBBZGRyZXNzZXMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFBISVRyYW5zQWRkciBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfUEhJVFJBTlNBRERSX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19QSElUUkFOU0FERFJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQXNzdW1wdGlvbkNhY2hlOworICBjbGFzcyBEb21pbmF0b3JUcmVlOworICBjbGFzcyBEYXRhTGF5b3V0OworICBjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbzsKKworLy8vIFBISVRyYW5zQWRkciAtIEFuIGFkZHJlc3MgdmFsdWUgd2hpY2ggdHJhY2tzIGFuZCBoYW5kbGVzIHBoaSB0cmFuc2xhdGlvbi4KKy8vLyBBcyB3ZSB3YWxrICJ1cCIgdGhlIENGRyB0aHJvdWdoIHByZWRlY2Vzc29ycywgd2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUKKy8vLyBhZGRyZXNzIHdlJ3JlIHRyYWNraW5nIGlzIGtlcHQgdXAgdG8gZGF0ZS4gIEZvciBleGFtcGxlLCBpZiB3ZSdyZSBhbmFseXppbmcKKy8vLyBhbiBhZGRyZXNzIG9mICImQVtpXSIgYW5kIHdhbGsgdGhyb3VnaCB0aGUgZGVmaW5pdGlvbiBvZiAnaScgd2hpY2ggaXMgYSBQSEkKKy8vLyBub2RlLCB3ZSAqbXVzdCogcGhpIHRyYW5zbGF0ZSBpIHRvIGdldCAiJkFbal0iIG9yIGVsc2Ugd2Ugd2lsbCBhbmFseXplIGFuCisvLy8gaW5jb3JyZWN0IHBvaW50ZXIgaW4gdGhlIHByZWRlY2Vzc29yIGJsb2NrLgorLy8vCisvLy8gVGhpcyBpcyBkZXNpZ25lZCB0byBiZSBhIHJlbGF0aXZlbHkgc21hbGwgb2JqZWN0IHRoYXQgbGl2ZXMgb24gdGhlIHN0YWNrIGFuZAorLy8vIGlzIGNvcHlhYmxlLgorLy8vCitjbGFzcyBQSElUcmFuc0FkZHIgeworICAvLy8gQWRkciAtIFRoZSBhY3R1YWwgYWRkcmVzcyB3ZSdyZSBhbmFseXppbmcuCisgIFZhbHVlICpBZGRyOworCisgIC8vLyBUaGUgRGF0YUxheW91dCB3ZSBhcmUgcGxheWluZyB3aXRoLgorICBjb25zdCBEYXRhTGF5b3V0ICZETDsKKworICAvLy8gVExJIC0gVGhlIHRhcmdldCBsaWJyYXJ5IGluZm8gaWYga25vd24sIG90aGVyd2lzZSBudWxsLgorICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJOworCisgIC8vLyBBIGNhY2hlIG9mIEBsbHZtLmFzc3VtZSBjYWxscyB1c2VkIGJ5IFNpbXBsaWZ5SW5zdHJ1Y3Rpb24uCisgIEFzc3VtcHRpb25DYWNoZSAqQUM7CisKKyAgLy8vIEluc3RJbnB1dHMgLSBUaGUgaW5wdXRzIGZvciBvdXIgc3ltYm9saWMgYWRkcmVzcy4KKyAgU21hbGxWZWN0b3I8SW5zdHJ1Y3Rpb24qLCA0PiBJbnN0SW5wdXRzOworCitwdWJsaWM6CisgIFBISVRyYW5zQWRkcihWYWx1ZSAqYWRkciwgY29uc3QgRGF0YUxheW91dCAmREwsIEFzc3VtcHRpb25DYWNoZSAqQUMpCisgICAgICA6IEFkZHIoYWRkciksIERMKERMKSwgVExJKG51bGxwdHIpLCBBQyhBQykgeworICAgIC8vIElmIHRoZSBhZGRyZXNzIGlzIGFuIGluc3RydWN0aW9uLCB0aGUgd2hvbGUgdGhpbmcgaXMgY29uc2lkZXJlZCBhbiBpbnB1dC4KKyAgICBpZiAoSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oQWRkcikpCisgICAgICBJbnN0SW5wdXRzLnB1c2hfYmFjayhJKTsKKyAgfQorCisgIFZhbHVlICpnZXRBZGRyKCkgY29uc3QgeyByZXR1cm4gQWRkcjsgfQorCisgIC8vLyBOZWVkc1BISVRyYW5zbGF0aW9uRnJvbUJsb2NrIC0gUmV0dXJuIHRydWUgaWYgbW92aW5nIGZyb20gdGhlIHNwZWNpZmllZAorICAvLy8gQmFzaWNCbG9jayB0byBpdHMgcHJlZGVjZXNzb3JzIHJlcXVpcmVzIFBISSB0cmFuc2xhdGlvbi4KKyAgYm9vbCBOZWVkc1BISVRyYW5zbGF0aW9uRnJvbUJsb2NrKEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgLy8gV2UgZG8gbmVlZCB0cmFuc2xhdGlvbiBpZiBvbmUgb2Ygb3VyIGlucHV0IGluc3RydWN0aW9ucyBpcyBkZWZpbmVkIGluCisgICAgLy8gdGhpcyBibG9jay4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW5zdElucHV0cy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKEluc3RJbnB1dHNbaV0tPmdldFBhcmVudCgpID09IEJCKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gSXNQb3RlbnRpYWxseVBISVRyYW5zbGF0YWJsZSAtIElmIHRoaXMgbmVlZHMgUEhJIHRyYW5zbGF0aW9uLCByZXR1cm4gdHJ1ZQorICAvLy8gaWYgd2UgaGF2ZSBzb21lIGhvcGUgb2YgZG9pbmcgaXQuICBUaGlzIHNob3VsZCBiZSB1c2VkIGFzIGEgZmlsdGVyIHRvCisgIC8vLyBhdm9pZCBjYWxsaW5nIFBISVRyYW5zbGF0ZVZhbHVlIGluIGhvcGVsZXNzIHNpdHVhdGlvbnMuCisgIGJvb2wgSXNQb3RlbnRpYWxseVBISVRyYW5zbGF0YWJsZSgpIGNvbnN0OworCisgIC8vLyBQSElUcmFuc2xhdGVWYWx1ZSAtIFBISSB0cmFuc2xhdGUgdGhlIGN1cnJlbnQgYWRkcmVzcyB1cCB0aGUgQ0ZHIGZyb20KKyAgLy8vIEN1ckJCIHRvIFByZWQsIHVwZGF0aW5nIG91ciBzdGF0ZSB0byByZWZsZWN0IGFueSBuZWVkZWQgY2hhbmdlcy4gIElmCisgIC8vLyAnTXVzdERvbWluYXRlJyBpcyB0cnVlLCB0aGUgdHJhbnNsYXRlZCB2YWx1ZSBtdXN0IGRvbWluYXRlCisgIC8vLyBQcmVkQkIuICBUaGlzIHJldHVybnMgdHJ1ZSBvbiBmYWlsdXJlIGFuZCBzZXRzIEFkZHIgdG8gbnVsbC4KKyAgYm9vbCBQSElUcmFuc2xhdGVWYWx1ZShCYXNpY0Jsb2NrICpDdXJCQiwgQmFzaWNCbG9jayAqUHJlZEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRULCBib29sIE11c3REb21pbmF0ZSk7CisKKyAgLy8vIFBISVRyYW5zbGF0ZVdpdGhJbnNlcnRpb24gLSBQSEkgdHJhbnNsYXRlIHRoaXMgdmFsdWUgaW50byB0aGUgc3BlY2lmaWVkCisgIC8vLyBwcmVkZWNlc3NvciBibG9jaywgaW5zZXJ0aW5nIGEgY29tcHV0YXRpb24gb2YgdGhlIHZhbHVlIGlmIGl0IGlzCisgIC8vLyB1bmF2YWlsYWJsZS4KKyAgLy8vCisgIC8vLyBBbGwgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbnMgYXJlIGFkZGVkIHRvIHRoZSBOZXdJbnN0cyBsaXN0LiAgVGhpcworICAvLy8gcmV0dXJucyBudWxsIG9uIGZhaWx1cmUuCisgIC8vLworICBWYWx1ZSAqUEhJVHJhbnNsYXRlV2l0aEluc2VydGlvbihCYXNpY0Jsb2NrICpDdXJCQiwgQmFzaWNCbG9jayAqUHJlZEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICZEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uICo+ICZOZXdJbnN0cyk7CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIFZlcmlmeSAtIENoZWNrIGludGVybmFsIGNvbnNpc3RlbmN5IG9mIHRoaXMgZGF0YSBzdHJ1Y3R1cmUuICBJZiB0aGUKKyAgLy8vIHN0cnVjdHVyZSBpcyB2YWxpZCwgaXQgcmV0dXJucyB0cnVlLiAgSWYgaW52YWxpZCwgaXQgcHJpbnRzIGVycm9ycyBhbmQKKyAgLy8vIHJldHVybnMgZmFsc2UuCisgIGJvb2wgVmVyaWZ5KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIFZhbHVlICpQSElUcmFuc2xhdGVTdWJFeHByKFZhbHVlICpWLCBCYXNpY0Jsb2NrICpDdXJCQiwgQmFzaWNCbG9jayAqUHJlZEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCk7CisKKyAgLy8vIEluc2VydFBISVRyYW5zbGF0ZWRTdWJFeHByIC0gSW5zZXJ0IGEgY29tcHV0YXRpb24gb2YgdGhlIFBISSB0cmFuc2xhdGVkCisgIC8vLyB2ZXJzaW9uIG9mICdWJyBmb3IgdGhlIGVkZ2UgUHJlZEJCLT5DdXJCQiBpbnRvIHRoZSBlbmQgb2YgdGhlIFByZWRCQgorICAvLy8gYmxvY2suICBBbGwgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbnMgYXJlIGFkZGVkIHRvIHRoZSBOZXdJbnN0cyBsaXN0LgorICAvLy8gVGhpcyByZXR1cm5zIG51bGwgb24gZmFpbHVyZS4KKyAgLy8vCisgIFZhbHVlICpJbnNlcnRQSElUcmFuc2xhdGVkU3ViRXhwcihWYWx1ZSAqSW5WYWwsIEJhc2ljQmxvY2sgKkN1ckJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqUHJlZEJCLCBjb25zdCBEb21pbmF0b3JUcmVlICZEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbiAqPiAmTmV3SW5zdHMpOworCisgIC8vLyBBZGRBc0lucHV0IC0gSWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhbiBpbnN0cnVjdGlvbiwgYWRkIGl0IGFzIGFuIGlucHV0LgorICBWYWx1ZSAqQWRkQXNJbnB1dChWYWx1ZSAqVikgeworICAgIC8vIElmIFYgaXMgYW4gaW5zdHJ1Y3Rpb24sIGl0IGlzIG5vdyBhbiBpbnB1dC4KKyAgICBpZiAoSW5zdHJ1Y3Rpb24gKlZJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpKQorICAgICAgSW5zdElucHV0cy5wdXNoX2JhY2soVkkpOworICAgIHJldHVybiBWOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUGFzc2VzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1Bhc3Nlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YjI4YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1Bhc3Nlcy5oCkBAIC0wLDAgKzEsMTA5IEBACisvLz09PS0tIGxsdm0vQW5hbHlzaXMvUGFzc2VzLmggLSBDb25zdHJ1Y3RvcnMgZm9yIGFuYWx5c2VzIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyBwcm90b3R5cGVzIGZvciBhY2Nlc3NvciBmdW5jdGlvbnMgdGhhdCBleHBvc2UgcGFzc2VzCisvLyBpbiB0aGUgYW5hbHlzaXMgbGlicmFyaWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19QQVNTRVNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1BBU1NFU19ICisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgRnVuY3Rpb25QYXNzOworICBjbGFzcyBJbW11dGFibGVQYXNzOworICBjbGFzcyBMb29wUGFzczsKKyAgY2xhc3MgTW9kdWxlUGFzczsKKyAgY2xhc3MgUGFzczsKKyAgY2xhc3MgUGFzc0luZm87CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZU9iakNBUkNBQVdyYXBwZXJQYXNzIC0gVGhpcyBwYXNzIGltcGxlbWVudHMgT2JqQy1BUkMtYmFzZWQKKyAgLy8gYWxpYXMgYW5hbHlzaXMuCisgIC8vCisgIEltbXV0YWJsZVBhc3MgKmNyZWF0ZU9iakNBUkNBQVdyYXBwZXJQYXNzKCk7CisKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVQQUV2YWxQYXNzKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vLyBjcmVhdGVMYXp5VmFsdWVJbmZvUGFzcyAtIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgTGF6eVZhbHVlSW5mbworICAvLy8gcGFzcy4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVMYXp5VmFsdWVJbmZvUGFzcygpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLworICAvLyBjcmVhdGVEZXBlbmRlbmNlQW5hbHlzaXNXcmFwcGVyUGFzcyAtIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUKKyAgLy8gRGVwZW5kZW5jZUFuYWx5c2lzV3JhcHBlciBwYXNzLgorICAvLworICBGdW5jdGlvblBhc3MgKmNyZWF0ZURlcGVuZGVuY2VBbmFseXNpc1dyYXBwZXJQYXNzKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZUNvc3RNb2RlbEFuYWx5c2lzUGFzcyAtIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUKKyAgLy8gQ29zdE1vZGVsQW5hbHlzaXMgcGFzcy4KKyAgLy8KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVDb3N0TW9kZWxBbmFseXNpc1Bhc3MoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8gY3JlYXRlRGVsaW5lYXJpemF0aW9uUGFzcyAtIFRoaXMgcGFzcyBpbXBsZW1lbnRzIGF0dGVtcHRzIHRvIHJlc3RvcmUKKyAgLy8gbXVsdGlkaW1lbnNpb25hbCBhcnJheSBpbmRpY2VzIGZyb20gbGluZWFyaXplZCBleHByZXNzaW9ucy4KKyAgLy8KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVEZWxpbmVhcml6YXRpb25QYXNzKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZURpdmVyZ2VuY2VBbmFseXNpc1Bhc3MgLSBUaGlzIHBhc3MgZGV0ZXJtaW5lcyB3aGljaCBicmFuY2hlcyBpbiBhIEdQVQorICAvLyBwcm9ncmFtIGFyZSBkaXZlcmdlbnQuCisgIC8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlRGl2ZXJnZW5jZUFuYWx5c2lzUGFzcygpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLworICAvLyBNaW5vciBwYXNzIHByb3RvdHlwZXMsIGFsbG93aW5nIHVzIHRvIGV4cG9zZSB0aGVtIHRocm91Z2ggYnVncG9pbnQgYW5kCisgIC8vIGFuYWx5emUuCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlSW5zdENvdW50UGFzcygpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLworICAvLyBjcmVhdGVSZWdpb25JbmZvUGFzcyAtIFRoaXMgcGFzcyBmaW5kcyBhbGwgc2luZ2xlIGVudHJ5IHNpbmdsZSBleGl0IHJlZ2lvbnMKKyAgLy8gaW4gYSBmdW5jdGlvbiBhbmQgYnVpbGRzIHRoZSByZWdpb24gaGllcmFyY2h5LgorICAvLworICBGdW5jdGlvblBhc3MgKmNyZWF0ZVJlZ2lvbkluZm9QYXNzKCk7CisKKyAgLy8gUHJpbnQgbW9kdWxlLWxldmVsIGRlYnVnIGluZm8gbWV0YWRhdGEgaW4gaHVtYW4tcmVhZGFibGUgZm9ybS4KKyAgTW9kdWxlUGFzcyAqY3JlYXRlTW9kdWxlRGVidWdJbmZvUHJpbnRlclBhc3MoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8gY3JlYXRlTWVtRGVwUHJpbnRlciAtIFRoaXMgcGFzcyBleGhhdXN0aXZlbHkgY29sbGVjdHMgYWxsIG1lbWRlcAorICAvLyBpbmZvcm1hdGlvbiBhbmQgcHJpbnRzIGl0IHdpdGggLWFuYWx5emUuCisgIC8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlTWVtRGVwUHJpbnRlcigpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLworICAvLyBjcmVhdGVNZW1EZXJlZlByaW50ZXIgLSBUaGlzIHBhc3MgY29sbGVjdHMgbWVtb3J5IGRlcmVmZXJlbmNlYWJpbGl0eQorICAvLyBpbmZvcm1hdGlvbiBhbmQgcHJpbnRzIGl0IHdpdGggLWFuYWx5emUuCisgIC8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlTWVtRGVyZWZQcmludGVyKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZU11c3RFeGVjdXRlUHJpbnRlciAtIFRoaXMgcGFzcyBjb2xsZWN0cyBpbmZvcm1hdGlvbiBhYm91dCB3aGljaAorICAvLyBpbnN0cnVjdGlvbnMgd2l0aGluIGEgbG9vcCBhcmUgZ3VhcmFudGVlZCB0byBleGVjdXRlIGlmIHRoZSBsb29wIGhlYWRlciBpcworICAvLyBlbnRlcmVkIGFuZCBwcmludHMgaXQgd2l0aCAtYW5hbHl6ZS4KKyAgLy8KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVNdXN0RXhlY3V0ZVByaW50ZXIoKTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUG9zdERvbWluYXRvcnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUG9zdERvbWluYXRvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YThjNGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Qb3N0RG9taW5hdG9ycy5oCkBAIC0wLDAgKzEsMTE0IEBACisvLz0tIGxsdm0vQW5hbHlzaXMvUG9zdERvbWluYXRvcnMuaCAtIFBvc3QgRG9taW5hdG9yIENhbGN1bGF0aW9uIC0tKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBleHBvc2VzIGludGVyZmFjZXMgdG8gcG9zdCBkb21pbmFuY2UgaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1BPU1RET01JTkFUT1JTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19QT1NURE9NSU5BVE9SU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZXB0aEZpcnN0SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIFBvc3REb21pbmF0b3JUcmVlIENsYXNzIC0gQ29uY3JldGUgc3ViY2xhc3Mgb2YgRG9taW5hdG9yVHJlZSB0aGF0IGlzIHVzZWQgdG8KKy8vLyBjb21wdXRlIHRoZSBwb3N0LWRvbWluYXRvciB0cmVlLgorY2xhc3MgUG9zdERvbWluYXRvclRyZWUgOiBwdWJsaWMgUG9zdERvbVRyZWVCYXNlPEJhc2ljQmxvY2s+IHsKK3B1YmxpYzoKKyAgdXNpbmcgQmFzZSA9IFBvc3REb21UcmVlQmFzZTxCYXNpY0Jsb2NrPjsKKworICAvLy8gSGFuZGxlIGludmFsaWRhdGlvbiBleHBsaWNpdGx5LgorICBib29sIGludmFsaWRhdGUoRnVuY3Rpb24gJkYsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICZQQSwKKyAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmKTsKK307CisKKy8vLyBcYnJpZWYgQW5hbHlzaXMgcGFzcyB3aGljaCBjb21wdXRlcyBhIFxjIFBvc3REb21pbmF0b3JUcmVlLgorY2xhc3MgUG9zdERvbWluYXRvclRyZWVBbmFseXNpcworICAgIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPFBvc3REb21pbmF0b3JUcmVlQW5hbHlzaXM+IHsKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPFBvc3REb21pbmF0b3JUcmVlQW5hbHlzaXM+OworCisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBQcm92aWRlIHRoZSByZXN1bHQgdHlwZSBmb3IgdGhpcyBhbmFseXNpcyBwYXNzLgorICB1c2luZyBSZXN1bHQgPSBQb3N0RG9taW5hdG9yVHJlZTsKKworICAvLy8gXGJyaWVmIFJ1biB0aGUgYW5hbHlzaXMgcGFzcyBvdmVyIGEgZnVuY3Rpb24gYW5kIHByb2R1Y2UgYSBwb3N0IGRvbWluYXRvcgorICAvLy8gICAgICAgIHRyZWUuCisgIFBvc3REb21pbmF0b3JUcmVlIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJik7Cit9OworCisvLy8gXGJyaWVmIFByaW50ZXIgcGFzcyBmb3IgdGhlIFxjIFBvc3REb21pbmF0b3JUcmVlLgorY2xhc3MgUG9zdERvbWluYXRvclRyZWVQcmludGVyUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48UG9zdERvbWluYXRvclRyZWVQcmludGVyUGFzcz4geworICByYXdfb3N0cmVhbSAmT1M7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgUG9zdERvbWluYXRvclRyZWVQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmT1MpOworCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK3N0cnVjdCBQb3N0RG9taW5hdG9yVHJlZVdyYXBwZXJQYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisKKyAgUG9zdERvbWluYXRvclRyZWUgRFQ7CisKKyAgUG9zdERvbWluYXRvclRyZWVXcmFwcGVyUGFzcygpIDogRnVuY3Rpb25QYXNzKElEKSB7CisgICAgaW5pdGlhbGl6ZVBvc3REb21pbmF0b3JUcmVlV3JhcHBlclBhc3NQYXNzKCpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpKTsKKyAgfQorCisgIFBvc3REb21pbmF0b3JUcmVlICZnZXRQb3N0RG9tVHJlZSgpIHsgcmV0dXJuIERUOyB9CisgIGNvbnN0IFBvc3REb21pbmF0b3JUcmVlICZnZXRQb3N0RG9tVHJlZSgpIGNvbnN0IHsgcmV0dXJuIERUOyB9CisKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZTsKKworICB2b2lkIHZlcmlmeUFuYWx5c2lzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZSB7CisgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgIH0KKworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZSB7CisgICAgRFQucmVsZWFzZU1lbW9yeSgpOworICB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSopIGNvbnN0IG92ZXJyaWRlOworfTsKKworRnVuY3Rpb25QYXNzKiBjcmVhdGVQb3N0RG9tVHJlZSgpOworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8UG9zdERvbWluYXRvclRyZWUqPgorICA6IHB1YmxpYyBHcmFwaFRyYWl0czxEb21UcmVlTm9kZSo+IHsKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKFBvc3REb21pbmF0b3JUcmVlICpEVCkgeworICAgIHJldHVybiBEVC0+Z2V0Um9vdE5vZGUoKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihQb3N0RG9taW5hdG9yVHJlZSAqTikgeworICAgIGlmIChnZXRFbnRyeU5vZGUoTikpCisgICAgICByZXR1cm4gZGZfYmVnaW4oZ2V0RW50cnlOb2RlKE4pKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gZGZfZW5kKGdldEVudHJ5Tm9kZShOKSk7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKFBvc3REb21pbmF0b3JUcmVlICpOKSB7CisgICAgcmV0dXJuIGRmX2VuZChnZXRFbnRyeU5vZGUoTikpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19QT1NURE9NSU5BVE9SU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1Byb2ZpbGVTdW1tYXJ5SW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Qcm9maWxlU3VtbWFyeUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTMwMzM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Qcm9maWxlU3VtbWFyeUluZm8uaApAQCAtMCwwICsxLDE2NyBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvUHJvZmlsZVN1bW1hcnlJbmZvLmggLSBwcm9maWxlIHN1bW1hcnkgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGEgcGFzcyB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBwcm9maWxlIHN1bW1hcnkKKy8vIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19QUk9GSUxFX1NVTU1BUllfSU5GT19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfUFJPRklMRV9TVU1NQVJZX0lORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU2V0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvUHJvZmlsZVN1bW1hcnkuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgQmxvY2tGcmVxdWVuY3lJbmZvOworY2xhc3MgQ2FsbFNpdGU7CitjbGFzcyBQcm9maWxlU3VtbWFyeTsKKy8vLyBcYnJpZWYgQW5hbHlzaXMgcHJvdmlkaW5nIHByb2ZpbGUgaW5mb3JtYXRpb24uCisvLy8KKy8vLyBUaGlzIGlzIGFuIGltbXV0YWJsZSBhbmFseXNpcyBwYXNzIHRoYXQgcHJvdmlkZXMgYWJpbGl0eSB0byBxdWVyeSBnbG9iYWwKKy8vLyAocHJvZ3JhbS1sZXZlbCkgcHJvZmlsZSBpbmZvcm1hdGlvbi4gVGhlIG1haW4gQVBJcyBhcmUgaXNIb3RDb3VudCBhbmQKKy8vLyBpc0NvbGRDb3VudCB0aGF0IHRlbGxzIHdoZXRoZXIgYSBnaXZlbiBwcm9maWxlIGNvdW50IGlzIGNvbnNpZGVyZWQgaG90L2NvbGQKKy8vLyBiYXNlZCBvbiB0aGUgcHJvZmlsZSBzdW1tYXJ5LiBUaGlzIGFsc28gcHJvdmlkZXMgY29udmVuaWVuY2UgbWV0aG9kcyB0bworLy8vIGNoZWNrIHdoZXRoZXIgYSBmdW5jdGlvbiBpcyBob3Qgb3IgY29sZC4KKworLy8gRklYTUU6IFByb3ZpZGUgY29udmVuaWVuY2UgbWV0aG9kcyB0byBkZXRlcm1pbmUgaG90bmVzcy9jb2xkbmVzcyBvZiBvdGhlciBJUgorLy8gdW5pdHMuIFRoaXMgd291bGQgcmVxdWlyZSBtYWtpbmcgdGhpcyBkZXBlbmQgb24gQkZJLgorY2xhc3MgUHJvZmlsZVN1bW1hcnlJbmZvIHsKK3ByaXZhdGU6CisgIE1vZHVsZSAmTTsKKyAgc3RkOjp1bmlxdWVfcHRyPFByb2ZpbGVTdW1tYXJ5PiBTdW1tYXJ5OworICBib29sIGNvbXB1dGVTdW1tYXJ5KCk7CisgIHZvaWQgY29tcHV0ZVRocmVzaG9sZHMoKTsKKyAgLy8gQ291bnQgdGhyZXNob2xkcyB0byBhbnN3ZXIgaXNIb3RDb3VudCBhbmQgaXNDb2xkQ291bnQgcXVlcmllcy4KKyAgT3B0aW9uYWw8dWludDY0X3Q+IEhvdENvdW50VGhyZXNob2xkLCBDb2xkQ291bnRUaHJlc2hvbGQ7CisgIC8vIFRydWUgaWYgdGhlIHdvcmtpbmcgc2V0IHNpemUgb2YgdGhlIGNvZGUgaXMgY29uc2lkZXJlZCBodWdlLAorICAvLyBiZWNhdXNlIHRoZSBudW1iZXIgb2YgcHJvZmlsZSBjb3VudHMgcmVxdWlyZWQgdG8gcmVhY2ggdGhlIGhvdAorICAvLyBwZXJjZW50aWxlIGlzIGFib3ZlIGEgaHVnZSB0aHJlc2hvbGQuCisgIE9wdGlvbmFsPGJvb2w+IEhhc0h1Z2VXb3JraW5nU2V0U2l6ZTsKKworcHVibGljOgorICBQcm9maWxlU3VtbWFyeUluZm8oTW9kdWxlICZNKSA6IE0oTSkge30KKyAgUHJvZmlsZVN1bW1hcnlJbmZvKFByb2ZpbGVTdW1tYXJ5SW5mbyAmJkFyZykKKyAgICAgIDogTShBcmcuTSksIFN1bW1hcnkoc3RkOjptb3ZlKEFyZy5TdW1tYXJ5KSkge30KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBwcm9maWxlIHN1bW1hcnkgaXMgYXZhaWxhYmxlLgorICBib29sIGhhc1Byb2ZpbGVTdW1tYXJ5KCkgeyByZXR1cm4gY29tcHV0ZVN1bW1hcnkoKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIG1vZHVsZSBcYyBNIGhhcyBzYW1wbGUgcHJvZmlsZS4KKyAgYm9vbCBoYXNTYW1wbGVQcm9maWxlKCkgeworICAgIHJldHVybiBoYXNQcm9maWxlU3VtbWFyeSgpICYmCisgICAgICAgICAgIFN1bW1hcnktPmdldEtpbmQoKSA9PSBQcm9maWxlU3VtbWFyeTo6UFNLX1NhbXBsZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIG1vZHVsZSBcYyBNIGhhcyBpbnN0cnVtZW50YXRpb24gcHJvZmlsZS4KKyAgYm9vbCBoYXNJbnN0cnVtZW50YXRpb25Qcm9maWxlKCkgeworICAgIHJldHVybiBoYXNQcm9maWxlU3VtbWFyeSgpICYmCisgICAgICAgICAgIFN1bW1hcnktPmdldEtpbmQoKSA9PSBQcm9maWxlU3VtbWFyeTo6UFNLX0luc3RyOworICB9CisKKyAgLy8vIEhhbmRsZSB0aGUgaW52YWxpZGF0aW9uIG9mIHRoaXMgaW5mb3JtYXRpb24uCisgIC8vLworICAvLy8gV2hlbiB1c2VkIGFzIGEgcmVzdWx0IG9mIFxjIFByb2ZpbGVTdW1tYXJ5QW5hbHlzaXMgdGhpcyBtZXRob2Qgd2lsbCBiZQorICAvLy8gY2FsbGVkIHdoZW4gdGhlIG1vZHVsZSB0aGlzIHdhcyBjb21wdXRlZCBmb3IgY2hhbmdlcy4gU2luY2UgcHJvZmlsZQorICAvLy8gc3VtbWFyeSBpcyBpbW11dGFibGUgYWZ0ZXIgaXQgaXMgYW5ub3RhdGVkIG9uIHRoZSBtb2R1bGUsIHdlIHJldHVybiBmYWxzZQorICAvLy8gaGVyZS4KKyAgYm9vbCBpbnZhbGlkYXRlKE1vZHVsZSAmLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmLAorICAgICAgICAgICAgICAgICAgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHByb2ZpbGUgY291bnQgZm9yIFxwIENhbGxJbnN0LgorICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0UHJvZmlsZUNvdW50KGNvbnN0IEluc3RydWN0aW9uICpDYWxsSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0ZyZXF1ZW5jeUluZm8gKkJGSSk7CisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHdvcmtpbmcgc2V0IHNpemUgb2YgdGhlIGNvZGUgaXMgY29uc2lkZXJlZCBodWdlLgorICBib29sIGhhc0h1Z2VXb3JraW5nU2V0U2l6ZSgpOworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBccCBGIGhhcyBob3QgZnVuY3Rpb24gZW50cnkuCisgIGJvb2wgaXNGdW5jdGlvbkVudHJ5SG90KGNvbnN0IEZ1bmN0aW9uICpGKTsKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBccCBGIGNvbnRhaW5zIGhvdCBjb2RlLgorICBib29sIGlzRnVuY3Rpb25Ib3RJbkNhbGxHcmFwaChjb25zdCBGdW5jdGlvbiAqRiwgQmxvY2tGcmVxdWVuY3lJbmZvICZCRkkpOworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBccCBGIGhhcyBjb2xkIGZ1bmN0aW9uIGVudHJ5LgorICBib29sIGlzRnVuY3Rpb25FbnRyeUNvbGQoY29uc3QgRnVuY3Rpb24gKkYpOworICAvLy8gUmV0dXJucyB0cnVlIGlmIFxwIEYgY29udGFpbnMgb25seSBjb2xkIGNvZGUuCisgIGJvb2wgaXNGdW5jdGlvbkNvbGRJbkNhbGxHcmFwaChjb25zdCBGdW5jdGlvbiAqRiwgQmxvY2tGcmVxdWVuY3lJbmZvICZCRkkpOworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBccCBGIGlzIGEgaG90IGZ1bmN0aW9uLgorICBib29sIGlzSG90Q291bnQodWludDY0X3QgQyk7CisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIGNvdW50IFxwIEMgaXMgY29uc2lkZXJlZCBjb2xkLgorICBib29sIGlzQ29sZENvdW50KHVpbnQ2NF90IEMpOworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBCYXNpY0Jsb2NrIFxwIEIgaXMgY29uc2lkZXJlZCBob3QuCisgIGJvb2wgaXNIb3RCQihjb25zdCBCYXNpY0Jsb2NrICpCLCBCbG9ja0ZyZXF1ZW5jeUluZm8gKkJGSSk7CisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIEJhc2ljQmxvY2sgXHAgQiBpcyBjb25zaWRlcmVkIGNvbGQuCisgIGJvb2wgaXNDb2xkQkIoY29uc3QgQmFzaWNCbG9jayAqQiwgQmxvY2tGcmVxdWVuY3lJbmZvICpCRkkpOworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBDYWxsU2l0ZSBccCBDUyBpcyBjb25zaWRlcmVkIGhvdC4KKyAgYm9vbCBpc0hvdENhbGxTaXRlKGNvbnN0IENhbGxTaXRlICZDUywgQmxvY2tGcmVxdWVuY3lJbmZvICpCRkkpOworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBDYWxsc2l0ZSBccCBDUyBpcyBjb25zaWRlcmVkIGNvbGQuCisgIGJvb2wgaXNDb2xkQ2FsbFNpdGUoY29uc3QgQ2FsbFNpdGUgJkNTLCBCbG9ja0ZyZXF1ZW5jeUluZm8gKkJGSSk7CisgIC8vLyBcYnJpZWYgUmV0dXJucyBIb3RDb3VudFRocmVzaG9sZCBpZiBzZXQuCisgIHVpbnQ2NF90IGdldEhvdENvdW50VGhyZXNob2xkKCkgeworICAgIHJldHVybiBIb3RDb3VudFRocmVzaG9sZCA/IEhvdENvdW50VGhyZXNob2xkLmdldFZhbHVlKCkgOiAwOworICB9CisgIC8vLyBcYnJpZWYgUmV0dXJucyBDb2xkQ291bnRUaHJlc2hvbGQgaWYgc2V0LgorICB1aW50NjRfdCBnZXRDb2xkQ291bnRUaHJlc2hvbGQoKSB7CisgICAgcmV0dXJuIENvbGRDb3VudFRocmVzaG9sZCA/IENvbGRDb3VudFRocmVzaG9sZC5nZXRWYWx1ZSgpIDogMDsKKyAgfQorfTsKKworLy8vIEFuIGFuYWx5c2lzIHBhc3MgYmFzZWQgb24gbGVnYWN5IHBhc3MgbWFuYWdlciB0byBkZWxpdmVyIFByb2ZpbGVTdW1tYXJ5SW5mby4KK2NsYXNzIFByb2ZpbGVTdW1tYXJ5SW5mb1dyYXBwZXJQYXNzIDogcHVibGljIEltbXV0YWJsZVBhc3MgeworICBzdGQ6OnVuaXF1ZV9wdHI8UHJvZmlsZVN1bW1hcnlJbmZvPiBQU0k7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIFByb2ZpbGVTdW1tYXJ5SW5mb1dyYXBwZXJQYXNzKCk7CisKKyAgUHJvZmlsZVN1bW1hcnlJbmZvICpnZXRQU0koKSB7CisgICAgcmV0dXJuICYqUFNJOworICB9CisKKyAgYm9vbCBkb0luaXRpYWxpemF0aW9uKE1vZHVsZSAmTSkgb3ZlcnJpZGU7CisgIGJvb2wgZG9GaW5hbGl6YXRpb24oTW9kdWxlICZNKSBvdmVycmlkZTsKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZSB7CisgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgIH0KK307CisKKy8vLyBBbiBhbmFseXNpcyBwYXNzIGJhc2VkIG9uIHRoZSBuZXcgUE0gdG8gZGVsaXZlciBQcm9maWxlU3VtbWFyeUluZm8uCitjbGFzcyBQcm9maWxlU3VtbWFyeUFuYWx5c2lzCisgICAgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48UHJvZmlsZVN1bW1hcnlBbmFseXNpcz4geworcHVibGljOgorICB0eXBlZGVmIFByb2ZpbGVTdW1tYXJ5SW5mbyBSZXN1bHQ7CisKKyAgUmVzdWx0IHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmKTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPFByb2ZpbGVTdW1tYXJ5QW5hbHlzaXM+OworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworfTsKKworLy8vIFxicmllZiBQcmludGVyIHBhc3MgdGhhdCB1c2VzIFxjIFByb2ZpbGVTdW1tYXJ5QW5hbHlzaXMuCitjbGFzcyBQcm9maWxlU3VtbWFyeVByaW50ZXJQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxQcm9maWxlU3VtbWFyeVByaW50ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKworcHVibGljOgorICBleHBsaWNpdCBQcm9maWxlU3VtbWFyeVByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPUykgOiBPUyhPUykge30KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUHRyVXNlVmlzaXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9QdHJVc2VWaXNpdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzNGFhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUHRyVXNlVmlzaXRvci5oCkBAIC0wLDAgKzEsMzAzIEBACisvLz09PS0gUHRyVXNlVmlzaXRvci5oIC0gSW5zdFZpc2l0b3JzIG92ZXIgYSBwb2ludGVycyB1c2VzIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFRoaXMgZmlsZSBwcm92aWRlcyBhIGNvbGxlY3Rpb24gb2YgdmlzaXRvcnMgd2hpY2ggd2FsayB0aGUgKGluc3RydWN0aW9uKQorLy8vIHVzZXMgb2YgYSBwb2ludGVyLiBUaGVzZSB2aXNpdG9ycyBhbGwgcHJvdmlkZSB0aGUgc2FtZSBlc3NlbnRpYWwgYmVoYXZpb3IKKy8vLyBhcyBhbiBJbnN0VmlzaXRvciB3aXRoIHNpbWlsYXIgdGVtcGxhdGUtYmFzZWQgZmxleGliaWxpdHkgYW5kCisvLy8gaW1wbGVtZW50YXRpb24gc3RyYXRlZ2llcy4KKy8vLworLy8vIFRoZXNlIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gcXVpY2tseSBhbmFseXplIHRoZSB1c2VzIG9mIGFuIGFsbG9jYSwKKy8vLyBnbG9iYWwgdmFyaWFibGUsIG9yIGZ1bmN0aW9uIGFyZ3VtZW50LgorLy8vCisvLy8gRklYTUU6IFByb3ZpZGUgYSB2YXJpYW50IHdoaWNoIGRvZXNuJ3QgdHJhY2sgb2Zmc2V0cyBhbmQgaXMgY2hlYXBlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfUFRSVVNFVklTSVRPUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfUFRSVVNFVklTSVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RhdGFMYXlvdXQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdFZpc2l0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1VzZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVXNlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIGRldGFpbCB7CisKKy8vLyBcYnJpZWYgSW1wbGVtZW50YXRpb24gb2Ygbm9uLWRlcGVuZGVudCBmdW5jdGlvbmFsaXR5IGZvciBcYyBQdHJVc2VWaXNpdG9yLgorLy8vCisvLy8gU2VlIFxjIFB0clVzZVZpc2l0b3IgZm9yIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGFuZCBkZXRhaWxlZCBjb21tZW50cyBhYm91dAorLy8vIHVzYWdlLiBUaGlzIGNsYXNzIGlzIGp1c3QgYSBoZWxwZXIgYmFzZSBjbGFzcyB3aGljaCBpcyBub3QgdGVtcGxhdGVkIGFuZAorLy8vIGNvbnRhaW5zIGFsbCBjb21tb24gY29kZSB0byBiZSBzaGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQgaW5zdGFudGlhdGlvbnMgb2YKKy8vLyBQdHJVc2VWaXNpdG9yLgorY2xhc3MgUHRyVXNlVmlzaXRvckJhc2UgeworcHVibGljOgorICAvLy8gXGJyaWVmIFRoaXMgY2xhc3MgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc3VsdCBvZiBhIHZpc2l0LgorICAvLy8KKyAgLy8vIEFmdGVyIHdhbGtpbmcgYWxsIHRoZSB1c2VycyAocmVjdXJzaXZlbHkpIG9mIGEgcG9pbnRlciwgdGhlIGJhc2ljCisgIC8vLyBpbmZyYXN0cnVjdHVyZSByZWNvcmRzIHNvbWUgY29tbW9ubHkgdXNlZnVsIGluZm9ybWF0aW9uIHN1Y2ggYXMgZXNjYXBlCisgIC8vLyBhbmFseXNpcyBhbmQgd2hldGhlciB0aGUgdmlzaXQgY29tcGxldGVkIG9yIGFib3J0ZWQgZWFybHkuCisgIGNsYXNzIFB0ckluZm8geworICBwdWJsaWM6CisgICAgUHRySW5mbygpIDogQWJvcnRlZEluZm8obnVsbHB0ciwgZmFsc2UpLCBFc2NhcGVkSW5mbyhudWxscHRyLCBmYWxzZSkge30KKworICAgIC8vLyBcYnJpZWYgUmVzZXQgdGhlIHBvaW50ZXIgaW5mbywgY2xlYXJpbmcgYWxsIHN0YXRlLgorICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICBBYm9ydGVkSW5mby5zZXRQb2ludGVyKG51bGxwdHIpOworICAgICAgQWJvcnRlZEluZm8uc2V0SW50KGZhbHNlKTsKKyAgICAgIEVzY2FwZWRJbmZvLnNldFBvaW50ZXIobnVsbHB0cik7CisgICAgICBFc2NhcGVkSW5mby5zZXRJbnQoZmFsc2UpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgRGlkIHdlIGFib3J0IHRoZSB2aXNpdCBlYXJseT8KKyAgICBib29sIGlzQWJvcnRlZCgpIGNvbnN0IHsgcmV0dXJuIEFib3J0ZWRJbmZvLmdldEludCgpOyB9CisKKyAgICAvLy8gXGJyaWVmIElzIHRoZSBwb2ludGVyIGVzY2FwZWQgYXQgc29tZSBwb2ludD8KKyAgICBib29sIGlzRXNjYXBlZCgpIGNvbnN0IHsgcmV0dXJuIEVzY2FwZWRJbmZvLmdldEludCgpOyB9CisKKyAgICAvLy8gXGJyaWVmIEdldCB0aGUgaW5zdHJ1Y3Rpb24gY2F1c2luZyB0aGUgdmlzaXQgdG8gYWJvcnQuCisgICAgLy8vIFxyZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW5zdHJ1Y3Rpb24gY2F1c2luZyB0aGUgYWJvcnQgaWYgb25lIGlzCisgICAgLy8vIGF2YWlsYWJsZTsgb3RoZXJ3aXNlIHJldHVybnMgbnVsbC4KKyAgICBJbnN0cnVjdGlvbiAqZ2V0QWJvcnRpbmdJbnN0KCkgY29uc3QgeyByZXR1cm4gQWJvcnRlZEluZm8uZ2V0UG9pbnRlcigpOyB9CisKKyAgICAvLy8gXGJyaWVmIEdldCB0aGUgaW5zdHJ1Y3Rpb24gY2F1c2luZyB0aGUgcG9pbnRlciB0byBlc2NhcGUuCisgICAgLy8vIFxyZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggZXNjYXBlcyB0aGUgcG9pbnRlciBpZiBvbmUKKyAgICAvLy8gaXMgYXZhaWxhYmxlOyBvdGhlcndpc2UgcmV0dXJucyBudWxsLgorICAgIEluc3RydWN0aW9uICpnZXRFc2NhcGluZ0luc3QoKSBjb25zdCB7IHJldHVybiBFc2NhcGVkSW5mby5nZXRQb2ludGVyKCk7IH0KKworICAgIC8vLyBcYnJpZWYgTWFyayB0aGUgdmlzaXQgYXMgYWJvcnRlZC4gSW50ZW5kZWQgZm9yIHVzZSBpbiBhIHZvaWQgcmV0dXJuLgorICAgIC8vLyBccGFyYW0gSSBUaGUgaW5zdHJ1Y3Rpb24gd2hpY2ggY2F1c2VkIHRoZSB2aXNpdCB0byBhYm9ydCwgaWYgYXZhaWxhYmxlLgorICAgIHZvaWQgc2V0QWJvcnRlZChJbnN0cnVjdGlvbiAqSSA9IG51bGxwdHIpIHsKKyAgICAgIEFib3J0ZWRJbmZvLnNldEludCh0cnVlKTsKKyAgICAgIEFib3J0ZWRJbmZvLnNldFBvaW50ZXIoSSk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBNYXJrIHRoZSBwb2ludGVyIGFzIGVzY2FwZWQuIEludGVuZGVkIGZvciB1c2UgaW4gYSB2b2lkIHJldHVybi4KKyAgICAvLy8gXHBhcmFtIEkgVGhlIGluc3RydWN0aW9uIHdoaWNoIGVzY2FwZXMgdGhlIHBvaW50ZXIsIGlmIGF2YWlsYWJsZS4KKyAgICB2b2lkIHNldEVzY2FwZWQoSW5zdHJ1Y3Rpb24gKkkgPSBudWxscHRyKSB7CisgICAgICBFc2NhcGVkSW5mby5zZXRJbnQodHJ1ZSk7CisgICAgICBFc2NhcGVkSW5mby5zZXRQb2ludGVyKEkpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgTWFyayB0aGUgcG9pbnRlciBhcyBlc2NhcGVkLCBhbmQgdGhlIHZpc2l0IGFzIGFib3J0ZWQuIEludGVuZGVkCisgICAgLy8vIGZvciB1c2UgaW4gYSB2b2lkIHJldHVybi4KKyAgICAvLy8gXHBhcmFtIEkgVGhlIGluc3RydWN0aW9uIHdoaWNoIGJvdGggZXNjYXBlcyB0aGUgcG9pbnRlciBhbmQgYWJvcnRzIHRoZQorICAgIC8vLyB2aXNpdCwgaWYgYXZhaWxhYmxlLgorICAgIHZvaWQgc2V0RXNjYXBlZEFuZEFib3J0ZWQoSW5zdHJ1Y3Rpb24gKkkgPSBudWxscHRyKSB7CisgICAgICBzZXRFc2NhcGVkKEkpOworICAgICAgc2V0QWJvcnRlZChJKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBQb2ludGVySW50UGFpcjxJbnN0cnVjdGlvbiAqLCAxLCBib29sPiBBYm9ydGVkSW5mbywgRXNjYXBlZEluZm87CisgIH07CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgRGF0YUxheW91dCAmREw7CisKKyAgLy8vIFxuYW1lIFZpc2l0YXRpb24gaW5mcmFzdHJ1Y3R1cmUKKyAgLy8vIEB7CisKKyAgLy8vIFxicmllZiBUaGUgaW5mbyBjb2xsZWN0ZWQgYWJvdXQgdGhlIHBvaW50ZXIgYmVpbmcgdmlzaXRlZCB0aHVzIGZhci4KKyAgUHRySW5mbyBQSTsKKworICAvLy8gXGJyaWVmIEEgc3RydWN0IG9mIHRoZSBkYXRhIG5lZWRlZCB0byB2aXNpdCBhIHBhcnRpY3VsYXIgdXNlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCB0byBtYWludGFpbiBhIHdvcmtsaXN0IGZvIHRvLXZpc2l0IHVzZXMuIFRoaXMgaXMgdXNlZCB0bworICAvLy8gbWFrZSB0aGUgdmlzaXQgYmUgaXRlcmF0aXZlIHJhdGhlciB0aGFuIHJlY3Vyc2l2ZS4KKyAgc3RydWN0IFVzZVRvVmlzaXQgeworICAgIHVzaW5nIFVzZUFuZElzT2Zmc2V0S25vd25QYWlyID0gUG9pbnRlckludFBhaXI8VXNlICosIDEsIGJvb2w+OworCisgICAgVXNlQW5kSXNPZmZzZXRLbm93blBhaXIgVXNlQW5kSXNPZmZzZXRLbm93bjsKKyAgICBBUEludCBPZmZzZXQ7CisgIH07CisKKyAgLy8vIFxicmllZiBUaGUgd29ya2xpc3Qgb2YgdG8tdmlzaXQgdXNlcy4KKyAgU21hbGxWZWN0b3I8VXNlVG9WaXNpdCwgOD4gV29ya2xpc3Q7CisKKyAgLy8vIFxicmllZiBBIHNldCBvZiB2aXNpdGVkIHVzZXMgdG8gYnJlYWsgY3ljbGVzIGluIHVucmVhY2hhYmxlIGNvZGUuCisgIFNtYWxsUHRyU2V0PFVzZSAqLCA4PiBWaXNpdGVkVXNlczsKKworICAvLy8gQH0KKworICAvLy8gXG5hbWUgUGVyLXZpc2l0IHN0YXRlCisgIC8vLyBUaGlzIHN0YXRlIGlzIHJlc2V0IGZvciBlYWNoIGluc3RydWN0aW9uIHZpc2l0ZWQuCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgVGhlIHVzZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZC4KKyAgVXNlICpVOworCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB3ZSBoYXZlIGEga25vd24gY29uc3RhbnQgb2Zmc2V0IGZvciB0aGUgdXNlIGN1cnJlbnRseQorICAvLy8gYmVpbmcgdmlzaXRlZC4KKyAgYm9vbCBJc09mZnNldEtub3duOworCisgIC8vLyBcYnJpZWYgVGhlIGNvbnN0YW50IG9mZnNldCBvZiB0aGUgdXNlIGlmIHRoYXQgaXMga25vd24uCisgIEFQSW50IE9mZnNldDsKKworICAvLy8gQH0KKworICAvLy8gTm90ZSB0aGF0IHRoZSBjb25zdHJ1Y3RvciBpcyBwcm90ZWN0ZWQgYmVjYXVzZSB0aGlzIGNsYXNzIG11c3QgYmUgYSBiYXNlCisgIC8vLyBjbGFzcywgd2UgY2FuJ3QgY3JlYXRlIGluc3RhbmNlcyBkaXJlY3RseSBvZiB0aGlzIGNsYXNzLgorICBQdHJVc2VWaXNpdG9yQmFzZShjb25zdCBEYXRhTGF5b3V0ICZETCkgOiBETChETCkge30KKworICAvLy8gXGJyaWVmIEVucXVldWUgdGhlIHVzZXJzIG9mIHRoaXMgaW5zdHJ1Y3Rpb24gaW4gdGhlIHZpc2l0IHdvcmtsaXN0LgorICAvLy8KKyAgLy8vIFRoaXMgd2lsbCB2aXNpdCB0aGUgdXNlcnMgd2l0aCB0aGUgc2FtZSBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgdmlzaXQKKyAgLy8vIChpbmNsdWRpbmcgYW4gdW5rbm93biBvZmZzZXQgaWYgdGhhdCBpcyB0aGUgY3VycmVudCBzdGF0ZSkuCisgIHZvaWQgZW5xdWV1ZVVzZXJzKEluc3RydWN0aW9uICZJKTsKKworICAvLy8gXGJyaWVmIFdhbGsgdGhlIG9wZXJhbmRzIG9mIGEgR0VQIGFuZCBhZGp1c3QgdGhlIG9mZnNldCBhcyBhcHByb3ByaWF0ZS4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgZG9lcyB0aGUgaGVhdnkgbGlmdGluZyBvZiB0aGUgcG9pbnRlciB3YWxrIGJ5IGNvbXB1dGluZworICAvLy8gb2Zmc2V0cyBhbmQgbG9va2luZyB0aHJvdWdoIEdFUHMuCisgIGJvb2wgYWRqdXN0T2Zmc2V0Rm9yR0VQKEdldEVsZW1lbnRQdHJJbnN0ICZHRVBJKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKworLy8vIFxicmllZiBBIGJhc2UgY2xhc3MgZm9yIHZpc2l0b3JzIG92ZXIgdGhlIHVzZXMgb2YgYSBwb2ludGVyIHZhbHVlLgorLy8vCisvLy8gT25jZSBjb25zdHJ1Y3RlZCwgYSB1c2VyIGNhbiBjYWxsIFxjIHZpc2l0IG9uIGEgcG9pbnRlciB2YWx1ZSwgYW5kIHRoaXMKKy8vLyB3aWxsIHdhbGsgaXRzIHVzZXMgYW5kIHZpc2l0IGVhY2ggaW5zdHJ1Y3Rpb24gdXNpbmcgYW4gSW5zdFZpc2l0b3IuIEl0IGFsc28KKy8vLyBwcm92aWRlcyB2aXNpdCBtZXRob2RzIHdoaWNoIHdpbGwgcmVjdXJzZSB0aHJvdWdoIGFueSBwb2ludGVyLXRvLXBvaW50ZXIKKy8vLyB0cmFuc2Zvcm1hdGlvbnMgc3VjaCBhcyBHRVBzIGFuZCBiaXRjYXN0cy4KKy8vLworLy8vIER1cmluZyB0aGUgdmlzaXQsIHRoZSBjdXJyZW50IFVzZSogYmVpbmcgdmlzaXRlZCBpcyBhdmFpbGFibGUgdG8gdGhlCisvLy8gc3ViY2xhc3MsIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgb2Zmc2V0IGZyb20gdGhlIG9yaWdpbmFsIGJhc2UgcG9pbnRlciBpZgorLy8vIGtub3duLgorLy8vCisvLy8gVGhlIHJlY3Vyc2l2ZSB2aXNpdCBvZiB1c2VzIGlzIGFjY29tcGxpc2hlZCB3aXRoIGEgd29ya2xpc3QsIHNvIHRoZSBvbmx5CisvLy8gb3JkZXJpbmcgZ3VhcmFudGVlIGlzIHRoYXQgYW4gaW5zdHJ1Y3Rpb24gaXMgdmlzaXRlZCBiZWZvcmUgYW55IHVzZXMgb2YgaXQKKy8vLyBhcmUgdmlzaXRlZC4gTm90ZSB0aGF0IHRoaXMgZG9lcyAqbm90KiBtZWFuIGJlZm9yZSBhbnkgb2YgaXRzIHVzZXJzIGFyZQorLy8vIHZpc2l0ZWQhIFRoaXMgaXMgYmVjYXVzZSB1c2VycyBjYW4gYmUgdmlzaXRlZCBtdWx0aXBsZSB0aW1lcyBkdWUgdG8KKy8vLyBtdWx0aXBsZSwgZGlmZmVyZW50IHVzZXMgb2YgcG9pbnRlcnMgZGVyaXZlZCBmcm9tIHRoZSBzYW1lIGJhc2UuCisvLy8KKy8vLyBBIHBhcnRpY3VsYXIgVXNlIHdpbGwgb25seSBiZSB2aXNpdGVkIG9uY2UsIGJ1dCBhIFVzZXIgbWF5IGJlIHZpc2l0ZWQKKy8vLyBtdWx0aXBsZSB0aW1lcywgb25jZSBwZXIgVXNlLiBUaGlzIHZpc2l0cyBtYXkgbm90YWJseSBoYXZlIGRpZmZlcmVudAorLy8vIG9mZnNldHMuCisvLy8KKy8vLyBBbGwgdmlzaXQgbWV0aG9kcyBvbiB0aGUgdW5kZXJseWluZyBJbnN0VmlzaXRvciByZXR1cm4gYSBib29sZWFuLiBUaGlzCisvLy8gcmV0dXJuIHNob3J0LWNpcmN1aXRzIHRoZSB2aXNpdCwgc3RvcHBpbmcgaXQgaW1tZWRpYXRlbHkuCisvLy8KKy8vLyBGSVhNRTogR2VuZXJhbGl6ZSB0aGlzIGZvciBhbGwgdmFsdWVzIHJhdGhlciB0aGFuIGp1c3QgaW5zdHJ1Y3Rpb25zLgordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWRUPgorY2xhc3MgUHRyVXNlVmlzaXRvciA6IHByb3RlY3RlZCBJbnN0VmlzaXRvcjxEZXJpdmVkVD4sCisgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGRldGFpbDo6UHRyVXNlVmlzaXRvckJhc2UgeworICBmcmllbmQgY2xhc3MgSW5zdFZpc2l0b3I8RGVyaXZlZFQ+OworCisgIHVzaW5nIEJhc2UgPSBJbnN0VmlzaXRvcjxEZXJpdmVkVD47CisKK3B1YmxpYzoKKyAgUHRyVXNlVmlzaXRvcihjb25zdCBEYXRhTGF5b3V0ICZETCkgOiBQdHJVc2VWaXNpdG9yQmFzZShETCkgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19iYXNlX29mPFB0clVzZVZpc2l0b3IsIERlcml2ZWRUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiTXVzdCBwYXNzIHRoZSBkZXJpdmVkIHR5cGUgdG8gdGhpcyB0ZW1wbGF0ZSEiKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgdGhlIHVzZXMgb2YgdGhlIGdpdmVuIHBvaW50ZXIuCisgIC8vLyBccmV0dXJucyBBbiBpbmZvIHN0cnVjdCBhYm91dCB0aGUgcG9pbnRlci4gU2VlIFxjIFB0ckluZm8gZm9yIGRldGFpbHMuCisgIFB0ckluZm8gdmlzaXRQdHIoSW5zdHJ1Y3Rpb24gJkkpIHsKKyAgICAvLyBUaGlzIG11c3QgYmUgYSBwb2ludGVyIHR5cGUuIEdldCBhbiBpbnRlZ2VyIHR5cGUgc3VpdGFibGUgdG8gaG9sZAorICAgIC8vIG9mZnNldHMgb24gdGhpcyBwb2ludGVyLgorICAgIC8vIEZJWE1FOiBTdXBwb3J0IGEgdmVjdG9yIG9mIHBvaW50ZXJzLgorICAgIGFzc2VydChJLmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSk7CisgICAgSW50ZWdlclR5cGUgKkludFB0clR5ID0gY2FzdDxJbnRlZ2VyVHlwZT4oREwuZ2V0SW50UHRyVHlwZShJLmdldFR5cGUoKSkpOworICAgIElzT2Zmc2V0S25vd24gPSB0cnVlOworICAgIE9mZnNldCA9IEFQSW50KEludFB0clR5LT5nZXRCaXRXaWR0aCgpLCAwKTsKKyAgICBQSS5yZXNldCgpOworCisgICAgLy8gRW5xdWV1ZSB0aGUgdXNlcyBvZiB0aGlzIHBvaW50ZXIuCisgICAgZW5xdWV1ZVVzZXJzKEkpOworCisgICAgLy8gVmlzaXQgYWxsIHRoZSB1c2VzIG9mZiB0aGUgd29ya2xpc3QgdW50aWwgaXQgaXMgZW1wdHkuCisgICAgd2hpbGUgKCFXb3JrbGlzdC5lbXB0eSgpKSB7CisgICAgICBVc2VUb1Zpc2l0IFRvVmlzaXQgPSBXb3JrbGlzdC5wb3BfYmFja192YWwoKTsKKyAgICAgIFUgPSBUb1Zpc2l0LlVzZUFuZElzT2Zmc2V0S25vd24uZ2V0UG9pbnRlcigpOworICAgICAgSXNPZmZzZXRLbm93biA9IFRvVmlzaXQuVXNlQW5kSXNPZmZzZXRLbm93bi5nZXRJbnQoKTsKKyAgICAgIGlmIChJc09mZnNldEtub3duKQorICAgICAgICBPZmZzZXQgPSBzdGQ6Om1vdmUoVG9WaXNpdC5PZmZzZXQpOworCisgICAgICBJbnN0cnVjdGlvbiAqSSA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KFUtPmdldFVzZXIoKSk7CisgICAgICBzdGF0aWNfY2FzdDxEZXJpdmVkVCo+KHRoaXMpLT52aXNpdChJKTsKKyAgICAgIGlmIChQSS5pc0Fib3J0ZWQoKSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBQSTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHZvaWQgdmlzaXRTdG9yZUluc3QoU3RvcmVJbnN0ICZTSSkgeworICAgIGlmIChTSS5nZXRWYWx1ZU9wZXJhbmQoKSA9PSBVLT5nZXQoKSkKKyAgICAgIFBJLnNldEVzY2FwZWQoJlNJKTsKKyAgfQorCisgIHZvaWQgdmlzaXRCaXRDYXN0SW5zdChCaXRDYXN0SW5zdCAmQkMpIHsKKyAgICBlbnF1ZXVlVXNlcnMoQkMpOworICB9CisKKyAgdm9pZCB2aXNpdFB0clRvSW50SW5zdChQdHJUb0ludEluc3QgJkkpIHsKKyAgICBQSS5zZXRFc2NhcGVkKCZJKTsKKyAgfQorCisgIHZvaWQgdmlzaXRHZXRFbGVtZW50UHRySW5zdChHZXRFbGVtZW50UHRySW5zdCAmR0VQSSkgeworICAgIGlmIChHRVBJLnVzZV9lbXB0eSgpKQorICAgICAgcmV0dXJuOworCisgICAgLy8gSWYgd2UgY2FuJ3Qgd2FsayB0aGUgR0VQLCBjbGVhciB0aGUgb2Zmc2V0LgorICAgIGlmICghYWRqdXN0T2Zmc2V0Rm9yR0VQKEdFUEkpKSB7CisgICAgICBJc09mZnNldEtub3duID0gZmFsc2U7CisgICAgICBPZmZzZXQgPSBBUEludCgpOworICAgIH0KKworICAgIC8vIEVucXVldWUgdGhlIHVzZXJzIG5vdyB0aGF0IHRoZSBvZmZzZXQgaGFzIGJlZW4gYWRqdXN0ZWQuCisgICAgZW5xdWV1ZVVzZXJzKEdFUEkpOworICB9CisKKyAgLy8gTm8tb3AgaW50cmluc2ljcyB3aGljaCB3ZSBrbm93IGRvbid0IGVzY2FwZSB0aGUgcG9pbnRlciB0byBsb2dpYyBpbgorICAvLyBzb21lIG90aGVyIGZ1bmN0aW9uLgorICB2b2lkIHZpc2l0RGJnSW5mb0ludHJpbnNpYyhEYmdJbmZvSW50cmluc2ljICZJKSB7fQorICB2b2lkIHZpc2l0TWVtSW50cmluc2ljKE1lbUludHJpbnNpYyAmSSkge30KKyAgdm9pZCB2aXNpdEludHJpbnNpY0luc3QoSW50cmluc2ljSW5zdCAmSUkpIHsKKyAgICBzd2l0Y2ggKElJLmdldEludHJpbnNpY0lEKCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEJhc2U6OnZpc2l0SW50cmluc2ljSW5zdChJSSk7CisKKyAgICBjYXNlIEludHJpbnNpYzo6bGlmZXRpbWVfc3RhcnQ6CisgICAgY2FzZSBJbnRyaW5zaWM6OmxpZmV0aW1lX2VuZDoKKyAgICAgIHJldHVybjsgLy8gTm8tb3AgaW50cmluc2ljcy4KKyAgICB9CisgIH0KKworICAvLyBHZW5lcmljYWxseSwgYXJndW1lbnRzIHRvIGNhbGxzIGFuZCBpbnZva2VzIGVzY2FwZSB0aGUgcG9pbnRlciB0byBzb21lCisgIC8vIG90aGVyIGZ1bmN0aW9uLiBNYXJrIHRoYXQuCisgIHZvaWQgdmlzaXRDYWxsU2l0ZShDYWxsU2l0ZSBDUykgeworICAgIFBJLnNldEVzY2FwZWQoQ1MuZ2V0SW5zdHJ1Y3Rpb24oKSk7CisgICAgQmFzZTo6dmlzaXRDYWxsU2l0ZShDUyk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX1BUUlVTRVZJU0lUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9SZWdpb25JbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1JlZ2lvbkluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmY2NGQxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9SZWdpb25JbmZvLmgKQEAgLTAsMCArMSwxMDMyIEBACisvLz09PS0gUmVnaW9uSW5mby5oIC0gU0VTRSByZWdpb24gYW5hbHlzaXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENhbGN1bGF0ZSBhIHByb2dyYW0gc3RydWN0dXJlIHRyZWUgYnVpbHQgb3V0IG9mIHNpbmdsZSBlbnRyeSBzaW5nbGUgZXhpdAorLy8gcmVnaW9ucy4KKy8vIFRoZSBiYXNpYyBpZGVhcyBhcmUgdGFrZW4gZnJvbSAiVGhlIFByb2dyYW0gU3RydWN0dXJlIFRyZWUgLSBSaWNoYXJkIEpvaG5zb24sCisvLyBEYXZpZCBQZWFyc29uLCBLZXNoYXYgUGluZ2FsaSAtIDE5OTQiLCBob3dldmVyIGVucmljaGVkIHdpdGggaWRlYXMgZnJvbSAiVGhlCisvLyBSZWZpbmVkIFByb2Nlc3MgU3RydWN0dXJlIFRyZWUgLSBKdXNzaSBWYW5oYXRhbG8sIEhhZ2VuIFZvZWx5ZXIsIEphbmEKKy8vIEtvZWhsZXIgLSAyMDA5Ii4KKy8vIFRoZSBhbGdvcml0aG0gdG8gY2FsY3VsYXRlIHRoZXNlIGRhdGEgc3RydWN0dXJlcyBob3dldmVyIGlzIGNvbXBsZXRlbHkKKy8vIGRpZmZlcmVudCwgYXMgaXQgdGFrZXMgYWR2YW50YWdlIG9mIGV4aXN0aW5nIGluZm9ybWF0aW9uIGFscmVhZHkgYXZhaWxhYmxlCisvLyBpbiAoUG9zdClkb21pbmFjZSB0cmVlIGFuZCBkb21pbmFuY2UgZnJvbnRpZXIgcGFzc2VzLiBUaGlzIGxlYWRzIHRvIGEgc2ltcGxlcgorLy8gYW5kIGluIHByYWN0aWNlIGhvcGVmdWxseSBiZXR0ZXIgcGVyZm9ybWluZyBhbGdvcml0aG0uIFRoZSBydW50aW1lIG9mIHRoZQorLy8gYWxnb3JpdGhtcyBkZXNjcmliZWQgaW4gdGhlIHBhcGVycyBhYm92ZSBhcmUgYm90aCBsaW5lYXIgaW4gZ3JhcGggc2l6ZSwKKy8vIE8oVitFKSwgd2hlcmVhcyB0aGlzIGFsZ29yaXRobSBpcyBub3QsIGFzIHRoZSBkb21pbmFuY2UgZnJvbnRpZXIgaW5mb3JtYXRpb24KKy8vIGl0c2VsZiBpcyBub3QsIGJ1dCBpbiBwcmFjdGljZSBydW50aW1lIHNlZW1zIHRvIGJlIGluIHRoZSBvcmRlciBvZiBtYWduaXR1ZGUKKy8vIG9mIGRvbWluYW5jZSB0cmVlIGNhbGN1bGF0aW9uLgorLy8KKy8vIFdBUk5JTkc6IExMVk0gaXMgZ2VuZXJhbGx5IHZlcnkgY29uY2VybmVkIGFib3V0IGNvbXBpbGUgdGltZSBzdWNoIHRoYXQKKy8vICAgICAgICAgIHRoZSB1c2Ugb2YgYWRkaXRpb25hbCBhbmFseXNpcyBwYXNzZXMgaW4gdGhlIGRlZmF1bHQKKy8vICAgICAgICAgIG9wdGltaXphdGlvbiBzZXF1ZW5jZSBpcyBhdm9pZGVkIGFzIG11Y2ggYXMgcG9zc2libGUuCisvLyAgICAgICAgICBTcGVjaWZpY2FsbHksIGlmIHlvdSBkbyBub3QgbmVlZCB0aGUgUmVnaW9uSW5mbywgYnV0IGRvbWluYW5jZQorLy8gICAgICAgICAgaW5mb3JtYXRpb24gY291bGQgYmUgc3VmZmljaWVudCBwbGVhc2UgYmFzZSB5b3VyIHdvcmsgb25seSBvbgorLy8gICAgICAgICAgdGhlIGRvbWluYXRvciB0cmVlLiBNb3N0IHBhc3NlcyBtYWludGFpbiBpdCwgc3VjaCB0aGF0IHVzaW5nCisvLyAgICAgICAgICBpdCBoYXMgb2Z0ZW4gbmVhciB6ZXJvIGNvc3QuIEluIGNvbnRyYXN0IFJlZ2lvbkluZm8gaXMgYnkKKy8vICAgICAgICAgIGRlZmF1bHQgbm90IGF2YWlsYWJsZSwgaXMgbm90IG1haW50YWluZWQgYnkgZXhpc3RpbmcKKy8vICAgICAgICAgIHRyYW5zZm9ybWF0aW9ucyBhbmQgdGhlcmUgaXMgbm8gaW50ZW50aW9uIHRvIGRvIHNvLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19SRUdJT05JTkZPX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19SRUdJT05JTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVwdGhGaXJzdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRG9taW5hbmNlRnJvbnRpZXI7CitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgTG9vcDsKK2NsYXNzIExvb3BJbmZvOworY2xhc3MgUG9zdERvbWluYXRvclRyZWU7CitjbGFzcyBSZWdpb247Cit0ZW1wbGF0ZSA8Y2xhc3MgUmVnaW9uVHI+IGNsYXNzIFJlZ2lvbkJhc2U7CitjbGFzcyBSZWdpb25JbmZvOwordGVtcGxhdGUgPGNsYXNzIFJlZ2lvblRyPiBjbGFzcyBSZWdpb25JbmZvQmFzZTsKK2NsYXNzIFJlZ2lvbk5vZGU7CisKKy8vIENsYXNzIHRvIGJlIHNwZWNpYWxpemVkIGZvciBkaWZmZXJlbnQgdXNlcnMgb2YgUmVnaW9uSW5mbworLy8gKGkuZS4gQmFzaWNCbG9ja3Mgb3IgTWFjaGluZUJhc2ljQmxvY2tzKS4gVGhpcyBpcyBvbmx5IHRvIGF2b2lkIG5lZWRpbmcgdG8KKy8vIHBhc3MgYXJvdW5kIGFuIHVucmVhc29uYWJsZSBudW1iZXIgb2YgdGVtcGxhdGUgcGFyYW1ldGVycy4KK3RlbXBsYXRlIDxjbGFzcyBGdW5jVF8+CitzdHJ1Y3QgUmVnaW9uVHJhaXRzIHsKKyAgLy8gRnVuY1QKKyAgLy8gQmxvY2tUCisgIC8vIFJlZ2lvblQKKyAgLy8gUmVnaW9uTm9kZVQKKyAgLy8gUmVnaW9uSW5mb1QKKyAgdXNpbmcgQnJva2VuVCA9IHR5cGVuYW1lIEZ1bmNUXzo6VW5rbm93blJlZ2lvblR5cGVFcnJvcjsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgUmVnaW9uVHJhaXRzPEZ1bmN0aW9uPiB7CisgIHVzaW5nIEZ1bmNUID0gRnVuY3Rpb247CisgIHVzaW5nIEJsb2NrVCA9IEJhc2ljQmxvY2s7CisgIHVzaW5nIFJlZ2lvblQgPSBSZWdpb247CisgIHVzaW5nIFJlZ2lvbk5vZGVUID0gUmVnaW9uTm9kZTsKKyAgdXNpbmcgUmVnaW9uSW5mb1QgPSBSZWdpb25JbmZvOworICB1c2luZyBEb21UcmVlVCA9IERvbWluYXRvclRyZWU7CisgIHVzaW5nIERvbVRyZWVOb2RlVCA9IERvbVRyZWVOb2RlOworICB1c2luZyBEb21Gcm9udGllclQgPSBEb21pbmFuY2VGcm9udGllcjsKKyAgdXNpbmcgUG9zdERvbVRyZWVUID0gUG9zdERvbWluYXRvclRyZWU7CisgIHVzaW5nIEluc3RUID0gSW5zdHJ1Y3Rpb247CisgIHVzaW5nIExvb3BUID0gTG9vcDsKKyAgdXNpbmcgTG9vcEluZm9UID0gTG9vcEluZm87CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldE51bVN1Y2Nlc3NvcnMoQmFzaWNCbG9jayAqQkIpIHsKKyAgICByZXR1cm4gQkItPmdldFRlcm1pbmF0b3IoKS0+Z2V0TnVtU3VjY2Vzc29ycygpOworICB9Cit9OworCisvLy8gQGJyaWVmIE1hcmtlciBjbGFzcyB0byBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGEgUmVnaW9uIGluIGZsYXQgbW9kZS4KKy8vLworLy8vIFRoZSBjbGFzcyBpcyB1c2VkIHRvIGVpdGhlciBpdGVyYXRlIGluIEZsYXQgbW9kZSBvciBieSBub3QgdXNpbmcgaXQgdG8gbm90CisvLy8gaXRlcmF0ZSBpbiBGbGF0IG1vZGUuICBEdXJpbmcgYSBGbGF0IG1vZGUgaXRlcmF0aW9uIGFsbCBSZWdpb25zIGFyZSBlbnRlcmVkCisvLy8gYW5kIHRoZSBpdGVyYXRpb24gcmV0dXJucyBldmVyeSBCYXNpY0Jsb2NrLiAgSWYgdGhlIEZsYXQgbW9kZSBpcyBub3QKKy8vLyBzZWxlY3RlZCBmb3IgU3ViUmVnaW9ucyBqdXN0IG9uZSBSZWdpb25Ob2RlIGNvbnRhaW5pbmcgdGhlIHN1YnJlZ2lvbiBpcworLy8vIHJldHVybmVkLgordGVtcGxhdGUgPGNsYXNzIEdyYXBoVHlwZT4KK2NsYXNzIEZsYXRJdCB7fTsKKworLy8vIEBicmllZiBBIFJlZ2lvbk5vZGUgcmVwcmVzZW50cyBhIHN1YnJlZ2lvbiBvciBhIEJhc2ljQmxvY2sgdGhhdCBpcyBwYXJ0IG9mIGEKKy8vLyBSZWdpb24uCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+CitjbGFzcyBSZWdpb25Ob2RlQmFzZSB7CisgIGZyaWVuZCBjbGFzcyBSZWdpb25CYXNlPFRyPjsKKworcHVibGljOgorICB1c2luZyBCbG9ja1QgPSB0eXBlbmFtZSBUcjo6QmxvY2tUOworICB1c2luZyBSZWdpb25UID0gdHlwZW5hbWUgVHI6OlJlZ2lvblQ7CisKK3ByaXZhdGU6CisgIC8vLyBUaGlzIGlzIHRoZSBlbnRyeSBiYXNpYyBibG9jayB0aGF0IHN0YXJ0cyB0aGlzIHJlZ2lvbiBub2RlLiAgSWYgdGhpcyBpcyBhCisgIC8vLyBCYXNpY0Jsb2NrIFJlZ2lvbk5vZGUsIHRoZW4gZW50cnkgaXMganVzdCB0aGUgYmFzaWMgYmxvY2ssIHRoYXQgdGhpcworICAvLy8gUmVnaW9uTm9kZSByZXByZXNlbnRzLiAgT3RoZXJ3aXNlIGl0IGlzIHRoZSBlbnRyeSBvZiB0aGlzIChTdWIpUmVnaW9uTm9kZS4KKyAgLy8vCisgIC8vLyBJbiB0aGUgQkJ0b1JlZ2lvbk5vZGUgbWFwIG9mIHRoZSBwYXJlbnQgb2YgdGhpcyBub2RlLCBCQiB3aWxsIGFsd2F5cyBtYXAKKyAgLy8vIHRvIHRoaXMgbm9kZSBubyBtYXR0ZXIgd2hpY2gga2luZCBvZiBub2RlIHRoaXMgb25lIGlzLgorICAvLy8KKyAgLy8vIFRoZSBub2RlIGNhbiBob2xkIGVpdGhlciBhIFJlZ2lvbiBvciBhIEJhc2ljQmxvY2suCisgIC8vLyBVc2Ugb25lIGJpdCB0byBzYXZlLCBpZiB0aGlzIFJlZ2lvbk5vZGUgaXMgYSBzdWJyZWdpb24gb3IgQmFzaWNCbG9jaworICAvLy8gUmVnaW9uTm9kZS4KKyAgUG9pbnRlckludFBhaXI8QmxvY2tUICosIDEsIGJvb2w+IGVudHJ5OworCisgIC8vLyBAYnJpZWYgVGhlIHBhcmVudCBSZWdpb24gb2YgdGhpcyBSZWdpb25Ob2RlLgorICAvLy8gQHNlZSBnZXRQYXJlbnQoKQorICBSZWdpb25UICpwYXJlbnQ7CisKK3Byb3RlY3RlZDoKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBSZWdpb25Ob2RlLgorICAvLy8KKyAgLy8vIEBwYXJhbSBQYXJlbnQgICAgICBUaGUgcGFyZW50IG9mIHRoaXMgUmVnaW9uTm9kZS4KKyAgLy8vIEBwYXJhbSBFbnRyeSAgICAgICBUaGUgZW50cnkgQmFzaWNCbG9jayBvZiB0aGUgUmVnaW9uTm9kZS4gIElmIHRoaXMKKyAgLy8vICAgICAgICAgICAgICAgICAgICBSZWdpb25Ob2RlIHJlcHJlc2VudHMgYSBCYXNpY0Jsb2NrLCB0aGlzIGlzIHRoZQorICAvLy8gICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgaXRzZWxmLiAgSWYgaXQgcmVwcmVzZW50cyBhIHN1YnJlZ2lvbiwgdGhpcworICAvLy8gICAgICAgICAgICAgICAgICAgIGlzIHRoZSBlbnRyeSBCYXNpY0Jsb2NrIG9mIHRoZSBzdWJyZWdpb24uCisgIC8vLyBAcGFyYW0gaXNTdWJSZWdpb24gSWYgdGhpcyBSZWdpb25Ob2RlIHJlcHJlc2VudHMgYSBTdWJSZWdpb24uCisgIGlubGluZSBSZWdpb25Ob2RlQmFzZShSZWdpb25UICpQYXJlbnQsIEJsb2NrVCAqRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3ViUmVnaW9uID0gZmFsc2UpCisgICAgICA6IGVudHJ5KEVudHJ5LCBpc1N1YlJlZ2lvbiksIHBhcmVudChQYXJlbnQpIHt9CisKK3B1YmxpYzoKKyAgUmVnaW9uTm9kZUJhc2UoY29uc3QgUmVnaW9uTm9kZUJhc2UgJikgPSBkZWxldGU7CisgIFJlZ2lvbk5vZGVCYXNlICZvcGVyYXRvcj0oY29uc3QgUmVnaW9uTm9kZUJhc2UgJikgPSBkZWxldGU7CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIHBhcmVudCBSZWdpb24gb2YgdGhpcyBSZWdpb25Ob2RlLgorICAvLy8KKyAgLy8vIFRoZSBwYXJlbnQgUmVnaW9uIGlzIHRoZSBSZWdpb24gdGhpcyBSZWdpb25Ob2RlIGJlbG9uZ3MgdG8uIElmIGZvcgorICAvLy8gZXhhbXBsZSBhIEJhc2ljQmxvY2sgaXMgZWxlbWVudCBvZiB0d28gUmVnaW9ucywgdGhlcmUgZXhpc3QgdHdvCisgIC8vLyBSZWdpb25Ob2RlcyBmb3IgdGhpcyBCYXNpY0Jsb2NrLiBFYWNoIHdpdGggdGhlIGdldFBhcmVudCgpIGZ1bmN0aW9uCisgIC8vLyBwb2ludGluZyB0byB0aGUgUmVnaW9uIHRoaXMgUmVnaW9uTm9kZSBiZWxvbmdzIHRvLgorICAvLy8KKyAgLy8vIEByZXR1cm4gR2V0IHRoZSBwYXJlbnQgUmVnaW9uIG9mIHRoaXMgUmVnaW9uTm9kZS4KKyAgaW5saW5lIFJlZ2lvblQgKmdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIHBhcmVudDsgfQorCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBlbnRyeSBCYXNpY0Jsb2NrIG9mIHRoaXMgUmVnaW9uTm9kZS4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIFJlZ2lvbk5vZGUgcmVwcmVzZW50cyBhIEJhc2ljQmxvY2sgdGhpcyBpcyBqdXN0IHRoZSBCYXNpY0Jsb2NrCisgIC8vLyBpdHNlbGYsIG90aGVyd2lzZSB3ZSByZXR1cm4gdGhlIGVudHJ5IEJhc2ljQmxvY2sgb2YgdGhlIFN1YnJlZ2lvbgorICAvLy8KKyAgLy8vIEByZXR1cm4gVGhlIGVudHJ5IEJhc2ljQmxvY2sgb2YgdGhpcyBSZWdpb25Ob2RlLgorICBpbmxpbmUgQmxvY2tUICpnZXRFbnRyeSgpIGNvbnN0IHsgcmV0dXJuIGVudHJ5LmdldFBvaW50ZXIoKTsgfQorCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBjb250ZW50IG9mIHRoaXMgUmVnaW9uTm9kZS4KKyAgLy8vCisgIC8vLyBUaGlzIGNhbiBiZSBlaXRoZXIgYSBCYXNpY0Jsb2NrIG9yIGEgc3VicmVnaW9uLiBCZWZvcmUgY2FsbGluZyBnZXROb2RlQXMoKQorICAvLy8gY2hlY2sgdGhlIHR5cGUgb2YgdGhlIGNvbnRlbnQgd2l0aCB0aGUgaXNTdWJSZWdpb24oKSBmdW5jdGlvbiBjYWxsLgorICAvLy8KKyAgLy8vIEByZXR1cm4gVGhlIGNvbnRlbnQgb2YgdGhpcyBSZWdpb25Ob2RlLgorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIFQgKmdldE5vZGVBcygpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgSXMgdGhpcyBSZWdpb25Ob2RlIGEgc3VicmVnaW9uPworICAvLy8KKyAgLy8vIEByZXR1cm4gVHJ1ZSBpZiBpdCBjb250YWlucyBhIHN1YnJlZ2lvbi4gRmFsc2UgaWYgaXQgY29udGFpbnMgYQorICAvLy8gICAgICAgICBCYXNpY0Jsb2NrLgorICBpbmxpbmUgYm9vbCBpc1N1YlJlZ2lvbigpIGNvbnN0IHsgcmV0dXJuIGVudHJ5LmdldEludCgpOyB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEBicmllZiBBIHNpbmdsZSBlbnRyeSBzaW5nbGUgZXhpdCBSZWdpb24uCisvLy8KKy8vLyBBIFJlZ2lvbiBpcyBhIGNvbm5lY3RlZCBzdWJncmFwaCBvZiBhIGNvbnRyb2wgZmxvdyBncmFwaCB0aGF0IGhhcyBleGFjdGx5CisvLy8gdHdvIGNvbm5lY3Rpb25zIHRvIHRoZSByZW1haW5pbmcgZ3JhcGguIEl0IGNhbiBiZSB1c2VkIHRvIGFuYWx5emUgb3IKKy8vLyBvcHRpbWl6ZSBwYXJ0cyBvZiB0aGUgY29udHJvbCBmbG93IGdyYXBoLgorLy8vCisvLy8gQSA8ZW0+IHNpbXBsZSBSZWdpb24gPC9lbT4gaXMgY29ubmVjdGVkIHRvIHRoZSByZW1haW5pbmcgZ3JhcGggYnkganVzdCB0d28KKy8vLyBlZGdlcy4gT25lIGVkZ2UgZW50ZXJpbmcgdGhlIFJlZ2lvbiBhbmQgYW5vdGhlciBvbmUgbGVhdmluZyB0aGUgUmVnaW9uLgorLy8vCisvLy8gQW4gPGVtPiBleHRlbmRlZCBSZWdpb24gPC9lbT4gKG9yIGp1c3QgUmVnaW9uKSBpcyBhIHN1YmdyYXBoIHRoYXQgY2FuIGJlCisvLy8gdHJhbnNmb3JtIGludG8gYSBzaW1wbGUgUmVnaW9uLiBUaGUgdHJhbnNmb3JtYXRpb24gaXMgZG9uZSBieSBhZGRpbmcKKy8vLyBCYXNpY0Jsb2NrcyB0aGF0IG1lcmdlIHNldmVyYWwgZW50cnkgb3IgZXhpdCBlZGdlcyBzbyB0aGF0IGFmdGVyIHRoZSBtZXJnZQorLy8vIGp1c3Qgb25lIGVudHJ5IGFuZCBvbmUgZXhpdCBlZGdlIGV4aXN0cy4KKy8vLworLy8vIFRoZSBcZSBFbnRyeSBvZiBhIFJlZ2lvbiBpcyB0aGUgZmlyc3QgQmFzaWNCbG9jayB0aGF0IGlzIHBhc3NlZCBhZnRlcgorLy8vIGVudGVyaW5nIHRoZSBSZWdpb24uIEl0IGlzIGFuIGVsZW1lbnQgb2YgdGhlIFJlZ2lvbi4gVGhlIGVudHJ5IEJhc2ljQmxvY2sKKy8vLyBkb21pbmF0ZXMgYWxsIEJhc2ljQmxvY2tzIGluIHRoZSBSZWdpb24uCisvLy8KKy8vLyBUaGUgXGUgRXhpdCBvZiBhIFJlZ2lvbiBpcyB0aGUgZmlyc3QgQmFzaWNCbG9jayB0aGF0IGlzIHBhc3NlZCBhZnRlcgorLy8vIGxlYXZpbmcgdGhlIFJlZ2lvbi4gSXQgaXMgbm90IGFuIGVsZW1lbnQgb2YgdGhlIFJlZ2lvbi4gVGhlIGV4aXQgQmFzaWNCbG9jaywKKy8vLyBwb3N0ZG9taW5hdGVzIGFsbCBCYXNpY0Jsb2NrcyBpbiB0aGUgUmVnaW9uLgorLy8vCisvLy8gQSA8ZW0+IGNhbm9uaWNhbCBSZWdpb24gPC9lbT4gY2Fubm90IGJlIGNvbnN0cnVjdGVkIGJ5IGNvbWJpbmluZyBzbWFsbGVyCisvLy8gUmVnaW9ucy4KKy8vLworLy8vIFJlZ2lvbiBBIGlzIHRoZSBcZSBwYXJlbnQgb2YgUmVnaW9uIEIsIGlmIEIgaXMgY29tcGxldGVseSBjb250YWluZWQgaW4gQS4KKy8vLworLy8vIFR3byBjYW5vbmljYWwgUmVnaW9ucyBlaXRoZXIgZG8gbm90IGludGVyc2VjdCBhdCBhbGwgb3Igb25lIGlzCisvLy8gdGhlIHBhcmVudCBvZiB0aGUgb3RoZXIuCisvLy8KKy8vLyBUaGUgPGVtPiBQcm9ncmFtIFN0cnVjdHVyZSBUcmVlPC9lbT4gaXMgYSBncmFwaCAoViwgRSkgd2hlcmUgViBpcyB0aGUgc2V0IG9mCisvLy8gUmVnaW9ucyBpbiB0aGUgY29udHJvbCBmbG93IGdyYXBoIGFuZCBFIGlzIHRoZSBcZSBwYXJlbnQgcmVsYXRpb24gb2YgdGhlc2UKKy8vLyBSZWdpb25zLgorLy8vCisvLy8gRXhhbXBsZToKKy8vLworLy8vIFx2ZXJiYXRpbQorLy8vIEEgc2ltcGxlIGNvbnRyb2wgZmxvdyBncmFwaCwgdGhhdCBjb250YWlucyB0d28gcmVnaW9ucy4KKy8vLworLy8vICAgICAgICAxCisvLy8gICAgICAgLyB8CisvLy8gICAgICAyICAgfAorLy8vICAgICAvIFwgICAzCisvLy8gICAgNCAgIDUgIHwKKy8vLyAgICB8ICAgfCAgfAorLy8vICAgIDYgICA3ICA4CisvLy8gICAgIFwgIHwgLworLy8vICAgICAgXCB8LyAgICAgICBSZWdpb24gQTogMSAtPiA5IHsxLDIsMyw0LDUsNiw3LDh9CisvLy8gICAgICAgIDkgICAgICAgIFJlZ2lvbiBCOiAyIC0+IDkgezIsNCw1LDYsN30KKy8vLyBcZW5kdmVyYmF0aW0KKy8vLworLy8vIFlvdSBjYW4gb2J0YWluIG1vcmUgZXhhbXBsZXMgYnkgZWl0aGVyIGNhbGxpbmcKKy8vLworLy8vIDx0dD4gIm9wdCAtcmVnaW9ucyAtYW5hbHl6ZSBhbnlwcm9ncmFtLmxsIiA8L3R0PgorLy8vIG9yCisvLy8gPHR0PiAib3B0IC12aWV3LXJlZ2lvbnMtb25seSBhbnlwcm9ncmFtLmxsIiA8L3R0PgorLy8vCisvLy8gb24gYW55IExMVk0gZmlsZSB5b3UgYXJlIGludGVyZXN0ZWQgaW4uCisvLy8KKy8vLyBUaGUgZmlyc3QgY2FsbCByZXR1cm5zIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvZ3JhbSBzdHJ1Y3R1cmUKKy8vLyB0cmVlLCB0aGUgc2Vjb25kIG9uZSBjcmVhdGVzIGEgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIHVzaW5nIGdyYXBodml6LgordGVtcGxhdGUgPGNsYXNzIFRyPgorY2xhc3MgUmVnaW9uQmFzZSA6IHB1YmxpYyBSZWdpb25Ob2RlQmFzZTxUcj4geworICBmcmllbmQgY2xhc3MgUmVnaW9uSW5mb0Jhc2U8VHI+OworCisgIHVzaW5nIEZ1bmNUID0gdHlwZW5hbWUgVHI6OkZ1bmNUOworICB1c2luZyBCbG9ja1QgPSB0eXBlbmFtZSBUcjo6QmxvY2tUOworICB1c2luZyBSZWdpb25JbmZvVCA9IHR5cGVuYW1lIFRyOjpSZWdpb25JbmZvVDsKKyAgdXNpbmcgUmVnaW9uVCA9IHR5cGVuYW1lIFRyOjpSZWdpb25UOworICB1c2luZyBSZWdpb25Ob2RlVCA9IHR5cGVuYW1lIFRyOjpSZWdpb25Ob2RlVDsKKyAgdXNpbmcgRG9tVHJlZVQgPSB0eXBlbmFtZSBUcjo6RG9tVHJlZVQ7CisgIHVzaW5nIExvb3BUID0gdHlwZW5hbWUgVHI6Okxvb3BUOworICB1c2luZyBMb29wSW5mb1QgPSB0eXBlbmFtZSBUcjo6TG9vcEluZm9UOworICB1c2luZyBJbnN0VCA9IHR5cGVuYW1lIFRyOjpJbnN0VDsKKworICB1c2luZyBCbG9ja1RyYWl0cyA9IEdyYXBoVHJhaXRzPEJsb2NrVCAqPjsKKyAgdXNpbmcgSW52QmxvY2tUcmFpdHMgPSBHcmFwaFRyYWl0czxJbnZlcnNlPEJsb2NrVCAqPj47CisgIHVzaW5nIFN1Y2NJdGVyVHkgPSB0eXBlbmFtZSBCbG9ja1RyYWl0czo6Q2hpbGRJdGVyYXRvclR5cGU7CisgIHVzaW5nIFByZWRJdGVyVHkgPSB0eXBlbmFtZSBJbnZCbG9ja1RyYWl0czo6Q2hpbGRJdGVyYXRvclR5cGU7CisKKyAgLy8gSW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIG1hbmFnZSB0aGlzIFJlZ2lvbi4KKyAgUmVnaW9uSW5mb1QgKlJJOworICBEb21UcmVlVCAqRFQ7CisKKyAgLy8gVGhlIGV4aXQgQmFzaWNCbG9jayBvZiB0aGlzIHJlZ2lvbi4KKyAgLy8gKFRoZSBlbnRyeSBCYXNpY0Jsb2NrIGlzIHBhcnQgb2YgUmVnaW9uTm9kZSkKKyAgQmxvY2tUICpleGl0OworCisgIHVzaW5nIFJlZ2lvblNldCA9IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxSZWdpb25UPj47CisKKyAgLy8gVGhlIHN1YnJlZ2lvbnMgb2YgdGhpcyByZWdpb24uCisgIFJlZ2lvblNldCBjaGlsZHJlbjsKKworICB1c2luZyBCQk5vZGVNYXBUID0gc3RkOjptYXA8QmxvY2tUICosIHN0ZDo6dW5pcXVlX3B0cjxSZWdpb25Ob2RlVD4+OworCisgIC8vIFNhdmUgdGhlIEJhc2ljQmxvY2sgUmVnaW9uTm9kZXMgdGhhdCBhcmUgZWxlbWVudCBvZiB0aGlzIFJlZ2lvbi4KKyAgbXV0YWJsZSBCQk5vZGVNYXBUIEJCTm9kZU1hcDsKKworICAvLy8gQ2hlY2sgaWYgYSBCQiBpcyBpbiB0aGlzIFJlZ2lvbi4gVGhpcyBjaGVjayBhbHNvIHdvcmtzCisgIC8vLyBpZiB0aGUgcmVnaW9uIGlzIGluY29ycmVjdGx5IGJ1aWx0LiAoRVhQRU5TSVZFISkKKyAgdm9pZCB2ZXJpZnlCQkluUmVnaW9uKEJsb2NrVCAqQkIpIGNvbnN0OworCisgIC8vLyBXYWxrIG92ZXIgYWxsIHRoZSBCQnMgb2YgdGhlIHJlZ2lvbiBzdGFydGluZyBmcm9tIEJCIGFuZAorICAvLy8gdmVyaWZ5IHRoYXQgYWxsIHJlYWNoYWJsZSBiYXNpYyBibG9ja3MgYXJlIGVsZW1lbnRzIG9mIHRoZSByZWdpb24uCisgIC8vLyAoRVhQRU5TSVZFISkKKyAgdm9pZCB2ZXJpZnlXYWxrKEJsb2NrVCAqQkIsIHN0ZDo6c2V0PEJsb2NrVCAqPiAqdmlzaXRlZEJCKSBjb25zdDsKKworICAvLy8gVmVyaWZ5IGlmIHRoZSByZWdpb24gYW5kIGl0cyBjaGlsZHJlbiBhcmUgdmFsaWQgcmVnaW9ucyAoRVhQRU5TSVZFISkKKyAgdm9pZCB2ZXJpZnlSZWdpb25OZXN0KCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBuZXcgcmVnaW9uLgorICAvLy8KKyAgLy8vIEBwYXJhbSBFbnRyeSAgVGhlIGVudHJ5IGJhc2ljIGJsb2NrIG9mIHRoZSByZWdpb24uCisgIC8vLyBAcGFyYW0gRXhpdCAgIFRoZSBleGl0IGJhc2ljIGJsb2NrIG9mIHRoZSByZWdpb24uCisgIC8vLyBAcGFyYW0gUkkgICAgIFRoZSByZWdpb24gaW5mbyBvYmplY3QgdGhhdCBpcyBtYW5hZ2luZyB0aGlzIHJlZ2lvbi4KKyAgLy8vIEBwYXJhbSBEVCAgICAgVGhlIGRvbWluYXRvciB0cmVlIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICAvLy8gQHBhcmFtIFBhcmVudCBUaGUgc3Vycm91bmRpbmcgcmVnaW9uIG9yIE5VTEwgaWYgdGhpcyBpcyBhIHRvcCBsZXZlbAorICAvLy8gICAgICAgICAgICAgICByZWdpb24uCisgIFJlZ2lvbkJhc2UoQmxvY2tUICpFbnRyeSwgQmxvY2tUICpFeGl0LCBSZWdpb25JbmZvVCAqUkksIERvbVRyZWVUICpEVCwKKyAgICAgICAgICAgICBSZWdpb25UICpQYXJlbnQgPSBudWxscHRyKTsKKworICBSZWdpb25CYXNlKGNvbnN0IFJlZ2lvbkJhc2UgJikgPSBkZWxldGU7CisgIFJlZ2lvbkJhc2UgJm9wZXJhdG9yPShjb25zdCBSZWdpb25CYXNlICYpID0gZGVsZXRlOworCisgIC8vLyBEZWxldGUgdGhlIFJlZ2lvbiBhbmQgYWxsIGl0cyBzdWJyZWdpb25zLgorICB+UmVnaW9uQmFzZSgpOworCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBlbnRyeSBCYXNpY0Jsb2NrIG9mIHRoZSBSZWdpb24uCisgIC8vLyBAcmV0dXJuIFRoZSBlbnRyeSBCYXNpY0Jsb2NrIG9mIHRoZSByZWdpb24uCisgIEJsb2NrVCAqZ2V0RW50cnkoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlZ2lvbk5vZGVCYXNlPFRyPjo6Z2V0RW50cnkoKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgUmVwbGFjZSB0aGUgZW50cnkgYmFzaWMgYmxvY2sgb2YgdGhlIHJlZ2lvbiB3aXRoIHRoZSBuZXcgYmFzaWMKKyAgLy8vICAgICAgICBibG9jay4KKyAgLy8vCisgIC8vLyBAcGFyYW0gQkIgIFRoZSBuZXcgZW50cnkgYmFzaWMgYmxvY2sgb2YgdGhlIHJlZ2lvbi4KKyAgdm9pZCByZXBsYWNlRW50cnkoQmxvY2tUICpCQik7CisKKyAgLy8vIEBicmllZiBSZXBsYWNlIHRoZSBleGl0IGJhc2ljIGJsb2NrIG9mIHRoZSByZWdpb24gd2l0aCB0aGUgbmV3IGJhc2ljCisgIC8vLyAgICAgICAgYmxvY2suCisgIC8vLworICAvLy8gQHBhcmFtIEJCICBUaGUgbmV3IGV4aXQgYmFzaWMgYmxvY2sgb2YgdGhlIHJlZ2lvbi4KKyAgdm9pZCByZXBsYWNlRXhpdChCbG9ja1QgKkJCKTsKKworICAvLy8gQGJyaWVmIFJlY3Vyc2l2ZWx5IHJlcGxhY2UgdGhlIGVudHJ5IGJhc2ljIGJsb2NrIG9mIHRoZSByZWdpb24uCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiByZXBsYWNlcyB0aGUgZW50cnkgYmFzaWMgYmxvY2sgd2l0aCBhIG5ldyBiYXNpYyBibG9jay4gSXQKKyAgLy8vIGFsc28gdXBkYXRlcyBhbGwgY2hpbGQgcmVnaW9ucyB0aGF0IGhhdmUgdGhlIHNhbWUgZW50cnkgYmFzaWMgYmxvY2sgYXMKKyAgLy8vIHRoaXMgcmVnaW9uLgorICAvLy8KKyAgLy8vIEBwYXJhbSBOZXdFbnRyeSBUaGUgbmV3IGVudHJ5IGJhc2ljIGJsb2NrLgorICB2b2lkIHJlcGxhY2VFbnRyeVJlY3Vyc2l2ZShCbG9ja1QgKk5ld0VudHJ5KTsKKworICAvLy8gQGJyaWVmIFJlY3Vyc2l2ZWx5IHJlcGxhY2UgdGhlIGV4aXQgYmFzaWMgYmxvY2sgb2YgdGhlIHJlZ2lvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJlcGxhY2VzIHRoZSBleGl0IGJhc2ljIGJsb2NrIHdpdGggYSBuZXcgYmFzaWMgYmxvY2suIEl0CisgIC8vLyBhbHNvIHVwZGF0ZXMgYWxsIGNoaWxkIHJlZ2lvbnMgdGhhdCBoYXZlIHRoZSBzYW1lIGV4aXQgYmFzaWMgYmxvY2sgYXMKKyAgLy8vIHRoaXMgcmVnaW9uLgorICAvLy8KKyAgLy8vIEBwYXJhbSBOZXdFeGl0IFRoZSBuZXcgZXhpdCBiYXNpYyBibG9jay4KKyAgdm9pZCByZXBsYWNlRXhpdFJlY3Vyc2l2ZShCbG9ja1QgKk5ld0V4aXQpOworCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBleGl0IEJhc2ljQmxvY2sgb2YgdGhlIFJlZ2lvbi4KKyAgLy8vIEByZXR1cm4gVGhlIGV4aXQgQmFzaWNCbG9jayBvZiB0aGUgUmVnaW9uLCBOVUxMIGlmIHRoaXMgaXMgdGhlIFRvcExldmVsCisgIC8vLyAgICAgICAgIFJlZ2lvbi4KKyAgQmxvY2tUICpnZXRFeGl0KCkgY29uc3QgeyByZXR1cm4gZXhpdDsgfQorCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBwYXJlbnQgb2YgdGhlIFJlZ2lvbi4KKyAgLy8vIEByZXR1cm4gVGhlIHBhcmVudCBvZiB0aGUgUmVnaW9uIG9yIE5VTEwgaWYgdGhpcyBpcyBhIHRvcCBsZXZlbAorICAvLy8gICAgICAgICBSZWdpb24uCisgIFJlZ2lvblQgKmdldFBhcmVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVnaW9uTm9kZUJhc2U8VHI+OjpnZXRQYXJlbnQoKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBSZWdpb25Ob2RlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBSZWdpb24uCisgIC8vLyBAcmV0dXJuIFRoZSBSZWdpb25Ob2RlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBSZWdpb24uCisgIFJlZ2lvbk5vZGVUICpnZXROb2RlKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PFJlZ2lvbk5vZGVUICo+KAorICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFJlZ2lvbk5vZGVUICo+KHRoaXMpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBuZXN0aW5nIGxldmVsIG9mIHRoaXMgUmVnaW9uLgorICAvLy8KKyAgLy8vIEFuIHRvcGxldmVsIFJlZ2lvbiBoYXMgZGVwdGggMC4KKyAgLy8vCisgIC8vLyBAcmV0dXJuIFRoZSBkZXB0aCBvZiB0aGUgcmVnaW9uLgorICB1bnNpZ25lZCBnZXREZXB0aCgpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgQ2hlY2sgaWYgYSBSZWdpb24gaXMgdGhlIFRvcExldmVsIHJlZ2lvbi4KKyAgLy8vCisgIC8vLyBUaGUgdG9wbGV2ZWwgcmVnaW9uIHJlcHJlc2VudHMgdGhlIHdob2xlIGZ1bmN0aW9uLgorICBib29sIGlzVG9wTGV2ZWxSZWdpb24oKSBjb25zdCB7IHJldHVybiBleGl0ID09IG51bGxwdHI7IH0KKworICAvLy8gQGJyaWVmIFJldHVybiBhIG5ldyAobm9uLWNhbm9uaWNhbCkgcmVnaW9uLCB0aGF0IGlzIG9idGFpbmVkIGJ5IGpvaW5pbmcKKyAgLy8vICAgICAgICB0aGlzIHJlZ2lvbiB3aXRoIGl0cyBwcmVkZWNlc3NvcnMuCisgIC8vLworICAvLy8gQHJldHVybiBBIHJlZ2lvbiBhbHNvIHN0YXJ0aW5nIGF0IGdldEVudHJ5KCksIGJ1dCByZWFjaGluZyB0byB0aGUgbmV4dAorICAvLy8gICAgICAgICBiYXNpYyBibG9jayB0aGF0IGZvcm1zIHdpdGggZ2V0RW50cnkoKSBhIChub24tY2Fub25pY2FsKSByZWdpb24uCisgIC8vLyAgICAgICAgIE5VTEwgaWYgc3VjaCBhIGJhc2ljIGJsb2NrIGRvZXMgbm90IGV4aXN0LgorICBSZWdpb25UICpnZXRFeHBhbmRlZFJlZ2lvbigpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBmaXJzdCBibG9jayBvZiB0aGlzIHJlZ2lvbidzIHNpbmdsZSBlbnRyeSBlZGdlLAorICAvLy8gICAgICAgIGlmIGV4aXN0aW5nLgorICAvLy8KKyAgLy8vIEByZXR1cm4gVGhlIEJhc2ljQmxvY2sgc3RhcnRpbmcgdGhpcyByZWdpb24ncyBzaW5nbGUgZW50cnkgZWRnZSwKKyAgLy8vICAgICAgICAgZWxzZSBOVUxMLgorICBCbG9ja1QgKmdldEVudGVyaW5nQmxvY2soKSBjb25zdDsKKworICAvLy8gQGJyaWVmIFJldHVybiB0aGUgZmlyc3QgYmxvY2sgb2YgdGhpcyByZWdpb24ncyBzaW5nbGUgZXhpdCBlZGdlLAorICAvLy8gICAgICAgIGlmIGV4aXN0aW5nLgorICAvLy8KKyAgLy8vIEByZXR1cm4gVGhlIEJhc2ljQmxvY2sgc3RhcnRpbmcgdGhpcyByZWdpb24ncyBzaW5nbGUgZXhpdCBlZGdlLAorICAvLy8gICAgICAgICBlbHNlIE5VTEwuCisgIEJsb2NrVCAqZ2V0RXhpdGluZ0Jsb2NrKCkgY29uc3Q7CisKKyAgLy8vIEBicmllZiBDb2xsZWN0IGFsbCBibG9ja3Mgb2YgdGhpcyByZWdpb24ncyBzaW5nbGUgZXhpdCBlZGdlLCBpZiBleGlzdGluZy4KKyAgLy8vCisgIC8vLyBAcmV0dXJuIFRydWUgaWYgdGhpcyByZWdpb24gY29udGFpbnMgYWxsIHRoZSBwcmVkZWNlc3NvcnMgb2YgdGhlIGV4aXQuCisgIGJvb2wgZ2V0RXhpdGluZ0Jsb2NrcyhTbWFsbFZlY3RvckltcGw8QmxvY2tUICo+ICZFeGl0aW5ncykgY29uc3Q7CisKKyAgLy8vIEBicmllZiBJcyB0aGlzIGEgc2ltcGxlIHJlZ2lvbj8KKyAgLy8vCisgIC8vLyBBIHJlZ2lvbiBpcyBzaW1wbGUgaWYgaXQgaGFzIGV4YWN0bHkgb25lIGV4aXQgYW5kIG9uZSBlbnRyeSBlZGdlLgorICAvLy8KKyAgLy8vIEByZXR1cm4gVHJ1ZSBpZiB0aGUgUmVnaW9uIGlzIHNpbXBsZS4KKyAgYm9vbCBpc1NpbXBsZSgpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgUmVnaW9uLgorICAvLy8gQHJldHVybiBUaGUgTmFtZSBvZiB0aGUgUmVnaW9uLgorICBzdGQ6OnN0cmluZyBnZXROYW1lU3RyKCkgY29uc3Q7CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIFJlZ2lvbkluZm8gb2JqZWN0LCB0aGF0IGJlbG9uZ3MgdG8gdGhpcyBSZWdpb24uCisgIFJlZ2lvbkluZm9UICpnZXRSZWdpb25JbmZvKCkgY29uc3QgeyByZXR1cm4gUkk7IH0KKworICAvLy8gUHJpbnRTdHlsZSAtIFByaW50IHJlZ2lvbiBpbiBkaWZmZXJlbmNlIHdheXMuCisgIGVudW0gUHJpbnRTdHlsZSB7IFByaW50Tm9uZSwgUHJpbnRCQiwgUHJpbnRSTiB9OworCisgIC8vLyBAYnJpZWYgUHJpbnQgdGhlIHJlZ2lvbi4KKyAgLy8vCisgIC8vLyBAcGFyYW0gT1MgVGhlIG91dHB1dCBzdHJlYW0gdGhlIFJlZ2lvbiBpcyBwcmludGVkIHRvLgorICAvLy8gQHBhcmFtIHByaW50VHJlZSBQcmludCBhbHNvIHRoZSB0cmVlIG9mIHN1YnJlZ2lvbnMuCisgIC8vLyBAcGFyYW0gbGV2ZWwgVGhlIGluZGVudGF0aW9uIGxldmVsIHVzZWQgZm9yIHByaW50aW5nLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgYm9vbCBwcmludFRyZWUgPSB0cnVlLCB1bnNpZ25lZCBsZXZlbCA9IDAsCisgICAgICAgICAgICAgUHJpbnRTdHlsZSBTdHlsZSA9IFByaW50Tm9uZSkgY29uc3Q7CisKKyNpZiAhZGVmaW5lZChOREVCVUcpIHx8IGRlZmluZWQoTExWTV9FTkFCTEVfRFVNUCkKKyAgLy8vIEBicmllZiBQcmludCB0aGUgcmVnaW9uIHRvIHN0ZGVyci4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisjZW5kaWYKKworICAvLy8gQGJyaWVmIENoZWNrIGlmIHRoZSByZWdpb24gY29udGFpbnMgYSBCYXNpY0Jsb2NrLgorICAvLy8KKyAgLy8vIEBwYXJhbSBCQiBUaGUgQmFzaWNCbG9jayB0aGF0IG1pZ2h0IGJlIGNvbnRhaW5lZCBpbiB0aGlzIFJlZ2lvbi4KKyAgLy8vIEByZXR1cm4gVHJ1ZSBpZiB0aGUgYmxvY2sgaXMgY29udGFpbmVkIGluIHRoZSByZWdpb24gb3RoZXJ3aXNlIGZhbHNlLgorICBib29sIGNvbnRhaW5zKGNvbnN0IEJsb2NrVCAqQkIpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgQ2hlY2sgaWYgdGhlIHJlZ2lvbiBjb250YWlucyBhbm90aGVyIHJlZ2lvbi4KKyAgLy8vCisgIC8vLyBAcGFyYW0gU3ViUmVnaW9uIFRoZSByZWdpb24gdGhhdCBtaWdodCBiZSBjb250YWluZWQgaW4gdGhpcyBSZWdpb24uCisgIC8vLyBAcmV0dXJuIFRydWUgaWYgU3ViUmVnaW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgcmVnaW9uIG90aGVyd2lzZSBmYWxzZS4KKyAgYm9vbCBjb250YWlucyhjb25zdCBSZWdpb25UICpTdWJSZWdpb24pIGNvbnN0IHsKKyAgICAvLyBUb3BsZXZlbCBSZWdpb24uCisgICAgaWYgKCFnZXRFeGl0KCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBjb250YWlucyhTdWJSZWdpb24tPmdldEVudHJ5KCkpICYmCisgICAgICAgICAgIChjb250YWlucyhTdWJSZWdpb24tPmdldEV4aXQoKSkgfHwKKyAgICAgICAgICAgIFN1YlJlZ2lvbi0+Z2V0RXhpdCgpID09IGdldEV4aXQoKSk7CisgIH0KKworICAvLy8gQGJyaWVmIENoZWNrIGlmIHRoZSByZWdpb24gY29udGFpbnMgYW4gSW5zdHJ1Y3Rpb24uCisgIC8vLworICAvLy8gQHBhcmFtIEluc3QgVGhlIEluc3RydWN0aW9uIHRoYXQgbWlnaHQgYmUgY29udGFpbmVkIGluIHRoaXMgcmVnaW9uLgorICAvLy8gQHJldHVybiBUcnVlIGlmIHRoZSBJbnN0cnVjdGlvbiBpcyBjb250YWluZWQgaW4gdGhlIHJlZ2lvbiBvdGhlcndpc2UKKyAgLy8vIGZhbHNlLgorICBib29sIGNvbnRhaW5zKGNvbnN0IEluc3RUICpJbnN0KSBjb25zdCB7IHJldHVybiBjb250YWlucyhJbnN0LT5nZXRQYXJlbnQoKSk7IH0KKworICAvLy8gQGJyaWVmIENoZWNrIGlmIHRoZSByZWdpb24gY29udGFpbnMgYSBsb29wLgorICAvLy8KKyAgLy8vIEBwYXJhbSBMIFRoZSBsb29wIHRoYXQgbWlnaHQgYmUgY29udGFpbmVkIGluIHRoaXMgcmVnaW9uLgorICAvLy8gQHJldHVybiBUcnVlIGlmIHRoZSBsb29wIGlzIGNvbnRhaW5lZCBpbiB0aGUgcmVnaW9uIG90aGVyd2lzZSBmYWxzZS4KKyAgLy8vICAgICAgICAgSW4gY2FzZSBhIE5VTEwgcG9pbnRlciBpcyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiB0aGUgcmVzdWx0CisgIC8vLyAgICAgICAgIGlzIGZhbHNlLCBleGNlcHQgZm9yIHRoZSByZWdpb24gdGhhdCBkZXNjcmliZXMgdGhlIHdob2xlIGZ1bmN0aW9uLgorICAvLy8gICAgICAgICBJbiB0aGF0IGNhc2UgdHJ1ZSBpcyByZXR1cm5lZC4KKyAgYm9vbCBjb250YWlucyhjb25zdCBMb29wVCAqTCkgY29uc3Q7CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIG91dGVybW9zdCBsb29wIGluIHRoZSByZWdpb24gdGhhdCBjb250YWlucyBhIGxvb3AuCisgIC8vLworICAvLy8gRmluZCBmb3IgYSBMb29wIEwgdGhlIG91dGVybW9zdCBsb29wIE91dGVyTCB0aGF0IGlzIGEgcGFyZW50IGxvb3Agb2YgTAorICAvLy8gYW5kIGlzIGl0c2VsZiBjb250YWluZWQgaW4gdGhlIHJlZ2lvbi4KKyAgLy8vCisgIC8vLyBAcGFyYW0gTCBUaGUgbG9vcCB0aGUgbG9va3VwIGlzIHN0YXJ0ZWQuCisgIC8vLyBAcmV0dXJuIFRoZSBvdXRlcm1vc3QgbG9vcCBpbiB0aGUgcmVnaW9uLCBOVUxMIGlmIHN1Y2ggYSBsb29wIGRvZXMgbm90CisgIC8vLyAgICAgICAgIGV4aXN0IG9yIGlmIHRoZSByZWdpb24gZGVzY3JpYmVzIHRoZSB3aG9sZSBmdW5jdGlvbi4KKyAgTG9vcFQgKm91dGVybW9zdExvb3BJblJlZ2lvbihMb29wVCAqTCkgY29uc3Q7CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIG91dGVybW9zdCBsb29wIGluIHRoZSByZWdpb24gdGhhdCBjb250YWlucyBhIGJhc2ljIGJsb2NrLgorICAvLy8KKyAgLy8vIEZpbmQgZm9yIGEgYmFzaWMgYmxvY2sgQkIgdGhlIG91dGVybW9zdCBsb29wIEwgdGhhdCBjb250YWlucyBCQiBhbmQgaXMKKyAgLy8vIGl0c2VsZiBjb250YWluZWQgaW4gdGhlIHJlZ2lvbi4KKyAgLy8vCisgIC8vLyBAcGFyYW0gTEkgQSBwb2ludGVyIHRvIGEgTG9vcEluZm8gYW5hbHlzaXMuCisgIC8vLyBAcGFyYW0gQkIgVGhlIGJhc2ljIGJsb2NrIHN1cnJvdW5kZWQgYnkgdGhlIGxvb3AuCisgIC8vLyBAcmV0dXJuIFRoZSBvdXRlcm1vc3QgbG9vcCBpbiB0aGUgcmVnaW9uLCBOVUxMIGlmIHN1Y2ggYSBsb29wIGRvZXMgbm90CisgIC8vLyAgICAgICAgIGV4aXN0IG9yIGlmIHRoZSByZWdpb24gZGVzY3JpYmVzIHRoZSB3aG9sZSBmdW5jdGlvbi4KKyAgTG9vcFQgKm91dGVybW9zdExvb3BJblJlZ2lvbihMb29wSW5mb1QgKkxJLCBCbG9ja1QgKkJCKSBjb25zdDsKKworICAvLy8gQGJyaWVmIEdldCB0aGUgc3VicmVnaW9uIHRoYXQgc3RhcnRzIGF0IGEgQmFzaWNCbG9jaworICAvLy8KKyAgLy8vIEBwYXJhbSBCQiBUaGUgQmFzaWNCbG9jayB0aGUgc3VicmVnaW9uIHNob3VsZCBzdGFydC4KKyAgLy8vIEByZXR1cm4gVGhlIFN1YnJlZ2lvbiBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBOVUxMLgorICBSZWdpb25UICpnZXRTdWJSZWdpb25Ob2RlKEJsb2NrVCAqQkIpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBSZWdpb25Ob2RlIGZvciBhIEJhc2ljQmxvY2sKKyAgLy8vCisgIC8vLyBAcGFyYW0gQkIgVGhlIEJhc2ljQmxvY2sgYXQgd2hpY2ggdGhlIFJlZ2lvbk5vZGUgc2hvdWxkIHN0YXJ0LgorICAvLy8gQHJldHVybiBJZiBhdmFpbGFibGUsIHRoZSBSZWdpb25Ob2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgc3VicmVnaW9uCisgIC8vLyAgICAgICAgIHN0YXJ0aW5nIGF0IEJCLiBJZiBubyBzdWJyZWdpb24gc3RhcnRzIGF0IEJCLCB0aGUgUmVnaW9uTm9kZQorICAvLy8gICAgICAgICByZXByZXNlbnRpbmcgQkIuCisgIFJlZ2lvbk5vZGVUICpnZXROb2RlKEJsb2NrVCAqQkIpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBCYXNpY0Jsb2NrIFJlZ2lvbk5vZGUgZm9yIGEgQmFzaWNCbG9jaworICAvLy8KKyAgLy8vIEBwYXJhbSBCQiBUaGUgQmFzaWNCbG9jayBmb3Igd2hpY2ggdGhlIFJlZ2lvbk5vZGUgaXMgcmVxdWVzdGVkLgorICAvLy8gQHJldHVybiBUaGUgUmVnaW9uTm9kZSByZXByZXNlbnRpbmcgdGhlIEJCLgorICBSZWdpb25Ob2RlVCAqZ2V0QkJOb2RlKEJsb2NrVCAqQkIpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgQWRkIGEgbmV3IHN1YnJlZ2lvbiB0byB0aGlzIFJlZ2lvbi4KKyAgLy8vCisgIC8vLyBAcGFyYW0gU3ViUmVnaW9uIFRoZSBuZXcgc3VicmVnaW9uIHRoYXQgd2lsbCBiZSBhZGRlZC4KKyAgLy8vIEBwYXJhbSBtb3ZlQ2hpbGRyZW4gTW92ZSB0aGUgY2hpbGRyZW4gb2YgdGhpcyByZWdpb24sIHRoYXQgYXJlIGFsc28KKyAgLy8vICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkIGluIFN1YlJlZ2lvbiBpbnRvIFN1YlJlZ2lvbi4KKyAgdm9pZCBhZGRTdWJSZWdpb24oUmVnaW9uVCAqU3ViUmVnaW9uLCBib29sIG1vdmVDaGlsZHJlbiA9IGZhbHNlKTsKKworICAvLy8gQGJyaWVmIFJlbW92ZSBhIHN1YnJlZ2lvbiBmcm9tIHRoaXMgUmVnaW9uLgorICAvLy8KKyAgLy8vIFRoZSBzdWJyZWdpb24gaXMgbm90IGRlbGV0ZWQsIGFzIGl0IHdpbGwgcHJvYmFibHkgYmUgaW5zZXJ0ZWQgaW50byBhbm90aGVyCisgIC8vLyByZWdpb24uCisgIC8vLyBAcGFyYW0gU3ViUmVnaW9uIFRoZSBTdWJSZWdpb24gdGhhdCB3aWxsIGJlIHJlbW92ZWQuCisgIFJlZ2lvblQgKnJlbW92ZVN1YlJlZ2lvbihSZWdpb25UICpTdWJSZWdpb24pOworCisgIC8vLyBAYnJpZWYgTW92ZSBhbGwgZGlyZWN0IGNoaWxkIG5vZGVzIG9mIHRoaXMgUmVnaW9uIHRvIGFub3RoZXIgUmVnaW9uLgorICAvLy8KKyAgLy8vIEBwYXJhbSBUbyBUaGUgUmVnaW9uIHRoZSBjaGlsZCBub2RlcyB3aWxsIGJlIHRyYW5zZmVycmVkIHRvLgorICB2b2lkIHRyYW5zZmVyQ2hpbGRyZW5UbyhSZWdpb25UICpUbyk7CisKKyAgLy8vIEBicmllZiBWZXJpZnkgaWYgdGhlIHJlZ2lvbiBpcyBhIGNvcnJlY3QgcmVnaW9uLgorICAvLy8KKyAgLy8vIENoZWNrIGlmIHRoaXMgaXMgYSBjb3JyZWN0bHkgYnVpbGQgUmVnaW9uLiBUaGlzIGlzIGFuIGV4cGVuc2l2ZSBjaGVjaywgYXMKKyAgLy8vIHRoZSBjb21wbGV0ZSBDRkcgb2YgdGhlIFJlZ2lvbiB3aWxsIGJlIHdhbGtlZC4KKyAgdm9pZCB2ZXJpZnlSZWdpb24oKSBjb25zdDsKKworICAvLy8gQGJyaWVmIENsZWFyIHRoZSBjYWNoZSBmb3IgQkIgUmVnaW9uTm9kZXMuCisgIC8vLworICAvLy8gQWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRoZSBCYXNpY0Jsb2NrIFJlZ2lvbk5vZGVzIHdpbGwgYmUgc3RvcmVkIGF0CisgIC8vLyBkaWZmZXJlbnQgbWVtb3J5IGxvY2F0aW9ucy4gUmVnaW9uTm9kZXMgb2J0YWluZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMKKyAgLy8vIGNhbGxlZCBhcmUgdGhlcmVmb3JlIG5vdCBjb21wYXJhYmxlIHRvIFJlZ2lvbk5vZGVzIGFidGFpbmVkIGFmdGVyd29yZHMuCisgIHZvaWQgY2xlYXJOb2RlQ2FjaGUoKTsKKworICAvLy8gQG5hbWUgU3VicmVnaW9uIEl0ZXJhdG9ycworICAvLy8KKyAgLy8vIFRoZXNlIGl0ZXJhdG9ycyBpdGVyYXRvciBvdmVyIGFsbCBzdWJyZWdpb25zIG9mIHRoaXMgUmVnaW9uLgorICAvL0B7CisgIHVzaW5nIGl0ZXJhdG9yID0gdHlwZW5hbWUgUmVnaW9uU2V0OjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSB0eXBlbmFtZSBSZWdpb25TZXQ6OmNvbnN0X2l0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gY2hpbGRyZW4uYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBjaGlsZHJlbi5lbmQoKTsgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gY2hpbGRyZW4uYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBjaGlsZHJlbi5lbmQoKTsgfQorICAvL0B9CisKKyAgLy8vIEBuYW1lIEJhc2ljQmxvY2sgSXRlcmF0b3JzCisgIC8vLworICAvLy8gVGhlc2UgaXRlcmF0b3JzIGl0ZXJhdGUgb3ZlciBhbGwgQmFzaWNCbG9ja3MgdGhhdCBhcmUgY29udGFpbmVkIGluIHRoaXMKKyAgLy8vIFJlZ2lvbi4gVGhlIGl0ZXJhdG9yIGFsc28gaXRlcmF0ZXMgb3ZlciBCYXNpY0Jsb2NrcyB0aGF0IGFyZSBlbGVtZW50cyBvZgorICAvLy8gYSBzdWJyZWdpb24gb2YgdGhpcyBSZWdpb24uIEl0IGlzIHRoZXJlZm9yZSBjYWxsZWQgYSBmbGF0IGl0ZXJhdG9yLgorICAvL0B7CisgIHRlbXBsYXRlIDxib29sIElzQ29uc3Q+CisgIGNsYXNzIGJsb2NrX2l0ZXJhdG9yX3dyYXBwZXIKKyAgICAgIDogcHVibGljIGRmX2l0ZXJhdG9yPAorICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxJc0NvbnN0LCBjb25zdCBCbG9ja1QsIEJsb2NrVD46OnR5cGUgKj4geworICAgIHVzaW5nIHN1cGVyID0KKyAgICAgICAgZGZfaXRlcmF0b3I8CisgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPElzQ29uc3QsIGNvbnN0IEJsb2NrVCwgQmxvY2tUPjo6dHlwZSAqPjsKKworICBwdWJsaWM6CisgICAgdXNpbmcgU2VsZiA9IGJsb2NrX2l0ZXJhdG9yX3dyYXBwZXI8SXNDb25zdD47CisgICAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIHN1cGVyOjp2YWx1ZV90eXBlOworCisgICAgLy8gQ29uc3RydWN0IHRoZSBiZWdpbiBpdGVyYXRvci4KKyAgICBibG9ja19pdGVyYXRvcl93cmFwcGVyKHZhbHVlX3R5cGUgRW50cnksIHZhbHVlX3R5cGUgRXhpdCkKKyAgICAgICAgOiBzdXBlcihkZl9iZWdpbihFbnRyeSkpIHsKKyAgICAgIC8vIE1hcmsgdGhlIGV4aXQgb2YgdGhlIHJlZ2lvbiBhcyB2aXNpdGVkLCBzbyB0aGF0IHRoZSBjaGlsZHJlbiBvZiB0aGUKKyAgICAgIC8vIGV4aXQgYW5kIHRoZSBleGl0IGl0c2VsZiwgaS5lLiB0aGUgYmxvY2sgb3V0c2lkZSB0aGUgcmVnaW9uIHdpbGwgbmV2ZXIKKyAgICAgIC8vIGJlIHZpc2l0ZWQuCisgICAgICBzdXBlcjo6VmlzaXRlZC5pbnNlcnQoRXhpdCk7CisgICAgfQorCisgICAgLy8gQ29uc3RydWN0IHRoZSBlbmQgaXRlcmF0b3IuCisgICAgYmxvY2tfaXRlcmF0b3Jfd3JhcHBlcigpIDogc3VwZXIoZGZfZW5kPHZhbHVlX3R5cGU+KChCbG9ja1QgKiludWxscHRyKSkge30KKworICAgIC8qaW1wbGljaXQqLyBibG9ja19pdGVyYXRvcl93cmFwcGVyKHN1cGVyIEkpIDogc3VwZXIoSSkge30KKworICAgIC8vIEZJWE1FOiBFdmVuIGEgY29uc3RfaXRlcmF0b3IgcmV0dXJucyBhIG5vbi1jb25zdCBCYXNpY0Jsb2NrIHBvaW50ZXIuCisgICAgLy8gICAgICAgIFRoaXMgd2FzIGludHJvZHVjZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgc2hvdWxkCisgICAgLy8gICAgICAgIGJlIHJlbW92ZWQgYXMgc29vbiBhcyBhbGwgdXNlcnMgYXJlIGZpeGVkLgorICAgIEJsb2NrVCAqb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QmxvY2tUICo+KHN1cGVyOjpvcGVyYXRvciooKSk7CisgICAgfQorICB9OworCisgIHVzaW5nIGJsb2NrX2l0ZXJhdG9yID0gYmxvY2tfaXRlcmF0b3Jfd3JhcHBlcjxmYWxzZT47CisgIHVzaW5nIGNvbnN0X2Jsb2NrX2l0ZXJhdG9yID0gYmxvY2tfaXRlcmF0b3Jfd3JhcHBlcjx0cnVlPjsKKworICBibG9ja19pdGVyYXRvciBibG9ja19iZWdpbigpIHsgcmV0dXJuIGJsb2NrX2l0ZXJhdG9yKGdldEVudHJ5KCksIGdldEV4aXQoKSk7IH0KKworICBibG9ja19pdGVyYXRvciBibG9ja19lbmQoKSB7IHJldHVybiBibG9ja19pdGVyYXRvcigpOyB9CisKKyAgY29uc3RfYmxvY2tfaXRlcmF0b3IgYmxvY2tfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Jsb2NrX2l0ZXJhdG9yKGdldEVudHJ5KCksIGdldEV4aXQoKSk7CisgIH0KKyAgY29uc3RfYmxvY2tfaXRlcmF0b3IgYmxvY2tfZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfYmxvY2tfaXRlcmF0b3IoKTsgfQorCisgIHVzaW5nIGJsb2NrX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8YmxvY2tfaXRlcmF0b3I+OworICB1c2luZyBjb25zdF9ibG9ja19yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPGNvbnN0X2Jsb2NrX2l0ZXJhdG9yPjsKKworICAvLy8gQGJyaWVmIFJldHVybnMgYSByYW5nZSB2aWV3IG9mIHRoZSBiYXNpYyBibG9ja3MgaW4gdGhlIHJlZ2lvbi4KKyAgaW5saW5lIGJsb2NrX3JhbmdlIGJsb2NrcygpIHsKKyAgICByZXR1cm4gYmxvY2tfcmFuZ2UoYmxvY2tfYmVnaW4oKSwgYmxvY2tfZW5kKCkpOworICB9CisKKyAgLy8vIEBicmllZiBSZXR1cm5zIGEgcmFuZ2UgdmlldyBvZiB0aGUgYmFzaWMgYmxvY2tzIGluIHRoZSByZWdpb24uCisgIC8vLworICAvLy8gVGhpcyBpcyB0aGUgJ2NvbnN0JyB2ZXJzaW9uIG9mIHRoZSByYW5nZSB2aWV3LgorICBpbmxpbmUgY29uc3RfYmxvY2tfcmFuZ2UgYmxvY2tzKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9ibG9ja19yYW5nZShibG9ja19iZWdpbigpLCBibG9ja19lbmQoKSk7CisgIH0KKyAgLy9AfQorCisgIC8vLyBAbmFtZSBFbGVtZW50IEl0ZXJhdG9ycworICAvLy8KKyAgLy8vIFRoZXNlIGl0ZXJhdG9ycyBpdGVyYXRlIG92ZXIgYWxsIEJhc2ljQmxvY2sgYW5kIHN1YnJlZ2lvbiBSZWdpb25Ob2RlcyB0aGF0CisgIC8vLyBhcmUgZGlyZWN0IGNoaWxkcmVuIG9mIHRoaXMgUmVnaW9uLiBJdCBkb2VzIG5vdCBpdGVyYXRlIG92ZXIgYW55CisgIC8vLyBSZWdpb25Ob2RlcyB0aGF0IGFyZSBhbHNvIGVsZW1lbnQgb2YgYSBzdWJyZWdpb24gb2YgdGhpcyBSZWdpb24uCisgIC8vQHsKKyAgdXNpbmcgZWxlbWVudF9pdGVyYXRvciA9CisgICAgICBkZl9pdGVyYXRvcjxSZWdpb25Ob2RlVCAqLCBkZl9pdGVyYXRvcl9kZWZhdWx0X3NldDxSZWdpb25Ob2RlVCAqPiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICBHcmFwaFRyYWl0czxSZWdpb25Ob2RlVCAqPj47CisKKyAgdXNpbmcgY29uc3RfZWxlbWVudF9pdGVyYXRvciA9CisgICAgICBkZl9pdGVyYXRvcjxjb25zdCBSZWdpb25Ob2RlVCAqLAorICAgICAgICAgICAgICAgICAgZGZfaXRlcmF0b3JfZGVmYXVsdF9zZXQ8Y29uc3QgUmVnaW9uTm9kZVQgKj4sIGZhbHNlLAorICAgICAgICAgICAgICAgICAgR3JhcGhUcmFpdHM8Y29uc3QgUmVnaW9uTm9kZVQgKj4+OworCisgIGVsZW1lbnRfaXRlcmF0b3IgZWxlbWVudF9iZWdpbigpOworICBlbGVtZW50X2l0ZXJhdG9yIGVsZW1lbnRfZW5kKCk7CisgIGl0ZXJhdG9yX3JhbmdlPGVsZW1lbnRfaXRlcmF0b3I+IGVsZW1lbnRzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGVsZW1lbnRfYmVnaW4oKSwgZWxlbWVudF9lbmQoKSk7CisgIH0KKworICBjb25zdF9lbGVtZW50X2l0ZXJhdG9yIGVsZW1lbnRfYmVnaW4oKSBjb25zdDsKKyAgY29uc3RfZWxlbWVudF9pdGVyYXRvciBlbGVtZW50X2VuZCgpIGNvbnN0OworICBpdGVyYXRvcl9yYW5nZTxjb25zdF9lbGVtZW50X2l0ZXJhdG9yPiBlbGVtZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShlbGVtZW50X2JlZ2luKCksIGVsZW1lbnRfZW5kKCkpOworICB9CisgIC8vQH0KK307CisKKy8vLyBQcmludCBhIFJlZ2lvbk5vZGUuCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+CitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBSZWdpb25Ob2RlQmFzZTxUcj4gJk5vZGUpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEBicmllZiBBbmFseXNpcyB0aGF0IGRldGVjdHMgYWxsIGNhbm9uaWNhbCBSZWdpb25zLgorLy8vCisvLy8gVGhlIFJlZ2lvbkluZm8gcGFzcyBkZXRlY3RzIGFsbCBjYW5vbmljYWwgcmVnaW9ucyBpbiBhIGZ1bmN0aW9uLiBUaGUgUmVnaW9ucworLy8vIGFyZSBjb25uZWN0ZWQgdXNpbmcgdGhlIHBhcmVudCByZWxhdGlvbi4gVGhpcyBidWlsZHMgYSBQcm9ncmFtIFN0cnVjdHVyZQorLy8vIFRyZWUuCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+CitjbGFzcyBSZWdpb25JbmZvQmFzZSB7CisgIGZyaWVuZCBjbGFzcyBSZWdpb25JbmZvOworICBmcmllbmQgY2xhc3MgTWFjaGluZVJlZ2lvbkluZm87CisKKyAgdXNpbmcgQmxvY2tUID0gdHlwZW5hbWUgVHI6OkJsb2NrVDsKKyAgdXNpbmcgRnVuY1QgPSB0eXBlbmFtZSBUcjo6RnVuY1Q7CisgIHVzaW5nIFJlZ2lvblQgPSB0eXBlbmFtZSBUcjo6UmVnaW9uVDsKKyAgdXNpbmcgUmVnaW9uSW5mb1QgPSB0eXBlbmFtZSBUcjo6UmVnaW9uSW5mb1Q7CisgIHVzaW5nIERvbVRyZWVUID0gdHlwZW5hbWUgVHI6OkRvbVRyZWVUOworICB1c2luZyBEb21UcmVlTm9kZVQgPSB0eXBlbmFtZSBUcjo6RG9tVHJlZU5vZGVUOworICB1c2luZyBQb3N0RG9tVHJlZVQgPSB0eXBlbmFtZSBUcjo6UG9zdERvbVRyZWVUOworICB1c2luZyBEb21Gcm9udGllclQgPSB0eXBlbmFtZSBUcjo6RG9tRnJvbnRpZXJUOworICB1c2luZyBCbG9ja1RyYWl0cyA9IEdyYXBoVHJhaXRzPEJsb2NrVCAqPjsKKyAgdXNpbmcgSW52QmxvY2tUcmFpdHMgPSBHcmFwaFRyYWl0czxJbnZlcnNlPEJsb2NrVCAqPj47CisgIHVzaW5nIFN1Y2NJdGVyVHkgPSB0eXBlbmFtZSBCbG9ja1RyYWl0czo6Q2hpbGRJdGVyYXRvclR5cGU7CisgIHVzaW5nIFByZWRJdGVyVHkgPSB0eXBlbmFtZSBJbnZCbG9ja1RyYWl0czo6Q2hpbGRJdGVyYXRvclR5cGU7CisKKyAgdXNpbmcgQkJ0b0JCTWFwID0gRGVuc2VNYXA8QmxvY2tUICosIEJsb2NrVCAqPjsKKyAgdXNpbmcgQkJ0b1JlZ2lvbk1hcCA9IERlbnNlTWFwPEJsb2NrVCAqLCBSZWdpb25UICo+OworCisgIFJlZ2lvbkluZm9CYXNlKCk7CisKKyAgUmVnaW9uSW5mb0Jhc2UoUmVnaW9uSW5mb0Jhc2UgJiZBcmcpCisgICAgOiBEVChzdGQ6Om1vdmUoQXJnLkRUKSksIFBEVChzdGQ6Om1vdmUoQXJnLlBEVCkpLCBERihzdGQ6Om1vdmUoQXJnLkRGKSksCisgICAgICBUb3BMZXZlbFJlZ2lvbihzdGQ6Om1vdmUoQXJnLlRvcExldmVsUmVnaW9uKSksCisgICAgICBCQnRvUmVnaW9uKHN0ZDo6bW92ZShBcmcuQkJ0b1JlZ2lvbikpIHsKKyAgICBBcmcud2lwZSgpOworICB9CisKKyAgUmVnaW9uSW5mb0Jhc2UgJm9wZXJhdG9yPShSZWdpb25JbmZvQmFzZSAmJlJIUykgeworICAgIERUID0gc3RkOjptb3ZlKFJIUy5EVCk7CisgICAgUERUID0gc3RkOjptb3ZlKFJIUy5QRFQpOworICAgIERGID0gc3RkOjptb3ZlKFJIUy5ERik7CisgICAgVG9wTGV2ZWxSZWdpb24gPSBzdGQ6Om1vdmUoUkhTLlRvcExldmVsUmVnaW9uKTsKKyAgICBCQnRvUmVnaW9uID0gc3RkOjptb3ZlKFJIUy5CQnRvUmVnaW9uKTsKKyAgICBSSFMud2lwZSgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZpcnR1YWwgflJlZ2lvbkluZm9CYXNlKCk7CisKKyAgRG9tVHJlZVQgKkRUOworICBQb3N0RG9tVHJlZVQgKlBEVDsKKyAgRG9tRnJvbnRpZXJUICpERjsKKworICAvLy8gVGhlIHRvcCBsZXZlbCByZWdpb24uCisgIFJlZ2lvblQgKlRvcExldmVsUmVnaW9uID0gbnVsbHB0cjsKKworICAvLy8gTWFwIGV2ZXJ5IEJCIHRvIHRoZSBzbWFsbGVzdCByZWdpb24sIHRoYXQgY29udGFpbnMgQkIuCisgIEJCdG9SZWdpb25NYXAgQkJ0b1JlZ2lvbjsKKworcHJvdGVjdGVkOgorICAvLy8gXGJyaWVmIFVwZGF0ZSByZWZlbmNlcyB0byBhIFJlZ2lvbkluZm9UIGhlbGQgYnkgdGhlIFJlZ2lvblQgbWFuYWdlZCBoZXJlCisgIC8vLworICAvLy8gVGhpcyBpcyBhIHBvc3QtbW92ZSBoZWxwZXIuIFJlZ2lvbnMgaG9sZCByZWZlcmVuY2VzIHRvIHRoZSBvd25pbmcKKyAgLy8vIFJlZ2lvbkluZm8gb2JqZWN0LiBBZnRlciBhIG1vdmUgdGhlc2UgbmVlZCB0byBiZSBmaXhlZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVGhlUmVnaW9uVD4KKyAgdm9pZCB1cGRhdGVSZWdpb25UcmVlKFJlZ2lvbkluZm9UICZSSSwgVGhlUmVnaW9uVCAqUikgeworICAgIGlmICghUikKKyAgICAgIHJldHVybjsKKyAgICBSLT5SSSA9ICZSSTsKKyAgICBmb3IgKGF1dG8gJlN1YlIgOiAqUikKKyAgICAgIHVwZGF0ZVJlZ2lvblRyZWUoUkksIFN1YlIuZ2V0KCkpOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgV2lwZSB0aGlzIHJlZ2lvbiB0cmVlJ3Mgc3RhdGUgd2l0aG91dCByZWxlYXNpbmcgYW55IHJlc291cmNlcy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGVzc2VudGlhbGx5IGEgcG9zdC1tb3ZlIGhlbHBlciBvbmx5LiBJdCBsZWF2ZXMgdGhlIG9iamVjdCBpbiBhbgorICAvLy8gYXNzaWduYWJsZSBhbmQgZGVzdHJveWFibGUgc3RhdGUsIGJ1dCBvdGhlcndpc2UgaW52YWxpZC4KKyAgdm9pZCB3aXBlKCkgeworICAgIERUID0gbnVsbHB0cjsKKyAgICBQRFQgPSBudWxscHRyOworICAgIERGID0gbnVsbHB0cjsKKyAgICBUb3BMZXZlbFJlZ2lvbiA9IG51bGxwdHI7CisgICAgQkJ0b1JlZ2lvbi5jbGVhcigpOworICB9CisKKyAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZW50cmllcyBvZiBCQnRvUmVnaW9uIGZvciB0aGUgQkJzIG9mIHJlZ2lvbgorICAvLyBTUiBhcmUgY29ycmVjdC4gVHJpZ2dlcnMgYW4gYXNzZXJ0aW9uIGlmIG5vdC4gQ2FsbHMgaXRzZWxmIHJlY3Vyc2l2ZWx5IGZvcgorICAvLyBzdWJyZWdpb25zLgorICB2b2lkIHZlcmlmeUJCTWFwKGNvbnN0IFJlZ2lvblQgKlNSKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgQkIgaXMgaW4gdGhlIGRvbWluYW5jZSBmcm9udGllciBvZgorICAvLyBlbnRyeSwgYmVjYXVzZSBpdCB3YXMgaW5oZXJpdGVkIGZyb20gZXhpdC4gSW4gdGhlIG90aGVyIGNhc2UgdGhlcmUgaXMgYW4KKyAgLy8gZWRnZSBnb2luZyBmcm9tIGVudHJ5IHRvIEJCIHdpdGhvdXQgcGFzc2luZyBleGl0LgorICBib29sIGlzQ29tbW9uRG9tRnJvbnRpZXIoQmxvY2tUICpCQiwgQmxvY2tUICplbnRyeSwgQmxvY2tUICpleGl0KSBjb25zdDsKKworICAvLyBDaGVjayBpZiBlbnRyeSBhbmQgZXhpdCBzdXJyb3VuZCBhIHZhbGlkIHJlZ2lvbiwgYmFzZWQgb24KKyAgLy8gZG9taW5hbmNlIHRyZWUgYW5kIGRvbWluYW5jZSBmcm9udGllci4KKyAgYm9vbCBpc1JlZ2lvbihCbG9ja1QgKmVudHJ5LCBCbG9ja1QgKmV4aXQpIGNvbnN0OworCisgIC8vIFNhdmVzIGEgc2hvcnRjdXQgcG9pbnRpbmcgZnJvbSBlbnRyeSB0byBleGl0LgorICAvLyBUaGlzIGZ1bmN0aW9uIG1heSBleHRlbmQgdGhpcyBzaG9ydGN1dCBpZiBwb3NzaWJsZS4KKyAgdm9pZCBpbnNlcnRTaG9ydEN1dChCbG9ja1QgKmVudHJ5LCBCbG9ja1QgKmV4aXQsIEJCdG9CQk1hcCAqU2hvcnRDdXQpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIG5leHQgQkIgdGhhdCBwb3N0ZG9taW5hdGVzIE4sIHdoaWxlIHNraXBwaW5nCisgIC8vIGFsbCBwb3N0IGRvbWluYXRvcnMgdGhhdCBjYW5ub3QgZmluaXNoIGEgY2Fub25pY2FsIHJlZ2lvbi4KKyAgRG9tVHJlZU5vZGVUICpnZXROZXh0UG9zdERvbShEb21UcmVlTm9kZVQgKk4sIEJCdG9CQk1hcCAqU2hvcnRDdXQpIGNvbnN0OworCisgIC8vIEEgcmVnaW9uIGlzIHRyaXZpYWwsIGlmIGl0IGNvbnRhaW5zIG9ubHkgb25lIEJCLgorICBib29sIGlzVHJpdmlhbFJlZ2lvbihCbG9ja1QgKmVudHJ5LCBCbG9ja1QgKmV4aXQpIGNvbnN0OworCisgIC8vIENyZWF0ZXMgYSBzaW5nbGUgZW50cnkgc2luZ2xlIGV4aXQgcmVnaW9uLgorICBSZWdpb25UICpjcmVhdGVSZWdpb24oQmxvY2tUICplbnRyeSwgQmxvY2tUICpleGl0KTsKKworICAvLyBEZXRlY3QgYWxsIHJlZ2lvbnMgc3RhcnRpbmcgd2l0aCBiYiAnZW50cnknLgorICB2b2lkIGZpbmRSZWdpb25zV2l0aEVudHJ5KEJsb2NrVCAqZW50cnksIEJCdG9CQk1hcCAqU2hvcnRDdXQpOworCisgIC8vIERldGVjdHMgcmVnaW9ucyBpbiBGLgorICB2b2lkIHNjYW5Gb3JSZWdpb25zKEZ1bmNUICZGLCBCQnRvQkJNYXAgKlNob3J0Q3V0KTsKKworICAvLyBHZXQgdGhlIHRvcCBtb3N0IHBhcmVudCB3aXRoIHRoZSBzYW1lIGVudHJ5IGJsb2NrLgorICBSZWdpb25UICpnZXRUb3BNb3N0UGFyZW50KFJlZ2lvblQgKnJlZ2lvbik7CisKKyAgLy8gQnVpbGQgdGhlIHJlZ2lvbiBoaWVyYXJjaHkgYWZ0ZXIgYWxsIHJlZ2lvbiBkZXRlY3RlZC4KKyAgdm9pZCBidWlsZFJlZ2lvbnNUcmVlKERvbVRyZWVOb2RlVCAqTiwgUmVnaW9uVCAqcmVnaW9uKTsKKworICAvLyBVcGRhdGUgc3RhdGlzdGljIGFib3V0IGNyZWF0ZWQgcmVnaW9ucy4KKyAgdmlydHVhbCB2b2lkIHVwZGF0ZVN0YXRpc3RpY3MoUmVnaW9uVCAqUikgPSAwOworCisgIC8vIERldGVjdCBhbGwgcmVnaW9ucyBpbiBmdW5jdGlvbiBhbmQgYnVpbGQgdGhlIHJlZ2lvbiB0cmVlLgorICB2b2lkIGNhbGN1bGF0ZShGdW5jVCAmRik7CisKK3B1YmxpYzoKKyAgUmVnaW9uSW5mb0Jhc2UoY29uc3QgUmVnaW9uSW5mb0Jhc2UgJikgPSBkZWxldGU7CisgIFJlZ2lvbkluZm9CYXNlICZvcGVyYXRvcj0oY29uc3QgUmVnaW9uSW5mb0Jhc2UgJikgPSBkZWxldGU7CisKKyAgc3RhdGljIGJvb2wgVmVyaWZ5UmVnaW9uSW5mbzsKKyAgc3RhdGljIHR5cGVuYW1lIFJlZ2lvblQ6OlByaW50U3R5bGUgcHJpbnRTdHlsZTsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisjaWYgIWRlZmluZWQoTkRFQlVHKSB8fCBkZWZpbmVkKExMVk1fRU5BQkxFX0RVTVApCisgIHZvaWQgZHVtcCgpIGNvbnN0OworI2VuZGlmCisKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCk7CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIHNtYWxsZXN0IHJlZ2lvbiB0aGF0IGNvbnRhaW5zIGEgQmFzaWNCbG9jay4KKyAgLy8vCisgIC8vLyBAcGFyYW0gQkIgVGhlIGJhc2ljIGJsb2NrLgorICAvLy8gQHJldHVybiBUaGUgc21hbGxlc3QgcmVnaW9uLCB0aGF0IGNvbnRhaW5zIEJCIG9yIE5VTEwsIGlmIHRoZXJlIGlzIG5vCisgIC8vLyByZWdpb24gY29udGFpbmluZyBCQi4KKyAgUmVnaW9uVCAqZ2V0UmVnaW9uRm9yKEJsb2NrVCAqQkIpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgIFNldCB0aGUgc21hbGxlc3QgcmVnaW9uIHRoYXQgc3Vycm91bmRzIGEgYmFzaWMgYmxvY2suCisgIC8vLworICAvLy8gQHBhcmFtIEJCIFRoZSBiYXNpYyBibG9jayBzdXJyb3VuZGVkIGJ5IGEgcmVnaW9uLgorICAvLy8gQHBhcmFtIFIgVGhlIHNtYWxsZXN0IHJlZ2lvbiB0aGF0IHN1cnJvdW5kcyBCQi4KKyAgdm9pZCBzZXRSZWdpb25Gb3IoQmxvY2tUICpCQiwgUmVnaW9uVCAqUik7CisKKyAgLy8vIEBicmllZiBBIHNob3J0Y3V0IGZvciBnZXRSZWdpb25Gb3IoKS4KKyAgLy8vCisgIC8vLyBAcGFyYW0gQkIgVGhlIGJhc2ljIGJsb2NrLgorICAvLy8gQHJldHVybiBUaGUgc21hbGxlc3QgcmVnaW9uLCB0aGF0IGNvbnRhaW5zIEJCIG9yIE5VTEwsIGlmIHRoZXJlIGlzIG5vCisgIC8vLyByZWdpb24gY29udGFpbmluZyBCQi4KKyAgUmVnaW9uVCAqb3BlcmF0b3JbXShCbG9ja1QgKkJCKSBjb25zdDsKKworICAvLy8gQGJyaWVmIFJldHVybiB0aGUgZXhpdCBvZiB0aGUgbWF4aW1hbCByZWZpbmVkIHJlZ2lvbiwgdGhhdCBzdGFydHMgYXQgYQorICAvLy8gQmFzaWNCbG9jay4KKyAgLy8vCisgIC8vLyBAcGFyYW0gQkIgVGhlIEJhc2ljQmxvY2sgdGhlIHJlZmluZWQgcmVnaW9uIHN0YXJ0cy4KKyAgQmxvY2tUICpnZXRNYXhSZWdpb25FeGl0KEJsb2NrVCAqQkIpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgRmluZCB0aGUgc21hbGxlc3QgcmVnaW9uIHRoYXQgY29udGFpbnMgdHdvIHJlZ2lvbnMuCisgIC8vLworICAvLy8gQHBhcmFtIEEgVGhlIGZpcnN0IHJlZ2lvbi4KKyAgLy8vIEBwYXJhbSBCIFRoZSBzZWNvbmQgcmVnaW9uLgorICAvLy8gQHJldHVybiBUaGUgc21hbGxlc3QgcmVnaW9uIGNvbnRhaW5pbmcgQSBhbmQgQi4KKyAgUmVnaW9uVCAqZ2V0Q29tbW9uUmVnaW9uKFJlZ2lvblQgKkEsIFJlZ2lvblQgKkIpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgRmluZCB0aGUgc21hbGxlc3QgcmVnaW9uIHRoYXQgY29udGFpbnMgdHdvIGJhc2ljIGJsb2Nrcy4KKyAgLy8vCisgIC8vLyBAcGFyYW0gQSBUaGUgZmlyc3QgYmFzaWMgYmxvY2suCisgIC8vLyBAcGFyYW0gQiBUaGUgc2Vjb25kIGJhc2ljIGJsb2NrLgorICAvLy8gQHJldHVybiBUaGUgc21hbGxlc3QgcmVnaW9uIHRoYXQgY29udGFpbnMgQSBhbmQgQi4KKyAgUmVnaW9uVCAqZ2V0Q29tbW9uUmVnaW9uKEJsb2NrVCAqQSwgQmxvY2tUICpCKSBjb25zdCB7CisgICAgcmV0dXJuIGdldENvbW1vblJlZ2lvbihnZXRSZWdpb25Gb3IoQSksIGdldFJlZ2lvbkZvcihCKSk7CisgIH0KKworICAvLy8gQGJyaWVmIEZpbmQgdGhlIHNtYWxsZXN0IHJlZ2lvbiB0aGF0IGNvbnRhaW5zIGEgc2V0IG9mIHJlZ2lvbnMuCisgIC8vLworICAvLy8gQHBhcmFtIFJlZ2lvbnMgQSB2ZWN0b3Igb2YgcmVnaW9ucy4KKyAgLy8vIEByZXR1cm4gVGhlIHNtYWxsZXN0IHJlZ2lvbiB0aGF0IGNvbnRhaW5zIGFsbCByZWdpb25zIGluIFJlZ2lvbnMuCisgIFJlZ2lvblQgKmdldENvbW1vblJlZ2lvbihTbWFsbFZlY3RvckltcGw8UmVnaW9uVCAqPiAmUmVnaW9ucykgY29uc3Q7CisKKyAgLy8vIEBicmllZiBGaW5kIHRoZSBzbWFsbGVzdCByZWdpb24gdGhhdCBjb250YWlucyBhIHNldCBvZiBiYXNpYyBibG9ja3MuCisgIC8vLworICAvLy8gQHBhcmFtIEJCcyBBIHZlY3RvciBvZiBiYXNpYyBibG9ja3MuCisgIC8vLyBAcmV0dXJuIFRoZSBzbWFsbGVzdCByZWdpb24gdGhhdCBjb250YWlucyBhbGwgYmFzaWMgYmxvY2tzIGluIEJCUy4KKyAgUmVnaW9uVCAqZ2V0Q29tbW9uUmVnaW9uKFNtYWxsVmVjdG9ySW1wbDxCbG9ja1QgKj4gJkJCcykgY29uc3Q7CisKKyAgUmVnaW9uVCAqZ2V0VG9wTGV2ZWxSZWdpb24oKSBjb25zdCB7IHJldHVybiBUb3BMZXZlbFJlZ2lvbjsgfQorCisgIC8vLyBAYnJpZWYgQ2xlYXIgdGhlIE5vZGUgQ2FjaGUgZm9yIGFsbCBSZWdpb25zLgorICAvLy8KKyAgLy8vIEBzZWUgUmVnaW9uOjpjbGVhck5vZGVDYWNoZSgpCisgIHZvaWQgY2xlYXJOb2RlQ2FjaGUoKSB7CisgICAgaWYgKFRvcExldmVsUmVnaW9uKQorICAgICAgVG9wTGV2ZWxSZWdpb24tPmNsZWFyTm9kZUNhY2hlKCk7CisgIH0KKworICB2b2lkIHZlcmlmeUFuYWx5c2lzKCkgY29uc3Q7Cit9OworCitjbGFzcyBSZWdpb247CisKK2NsYXNzIFJlZ2lvbk5vZGUgOiBwdWJsaWMgUmVnaW9uTm9kZUJhc2U8UmVnaW9uVHJhaXRzPEZ1bmN0aW9uPj4geworcHVibGljOgorICBpbmxpbmUgUmVnaW9uTm9kZShSZWdpb24gKlBhcmVudCwgQmFzaWNCbG9jayAqRW50cnksIGJvb2wgaXNTdWJSZWdpb24gPSBmYWxzZSkKKyAgICAgIDogUmVnaW9uTm9kZUJhc2U8UmVnaW9uVHJhaXRzPEZ1bmN0aW9uPj4oUGFyZW50LCBFbnRyeSwgaXNTdWJSZWdpb24pIHt9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJlZ2lvbiAmUk4pIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcyA9PSByZWludGVycHJldF9jYXN0PGNvbnN0IFJlZ2lvbk5vZGUgKj4oJlJOKTsKKyAgfQorfTsKKworY2xhc3MgUmVnaW9uIDogcHVibGljIFJlZ2lvbkJhc2U8UmVnaW9uVHJhaXRzPEZ1bmN0aW9uPj4geworcHVibGljOgorICBSZWdpb24oQmFzaWNCbG9jayAqRW50cnksIEJhc2ljQmxvY2sgKkV4aXQsIFJlZ2lvbkluZm8gKlJJLCBEb21pbmF0b3JUcmVlICpEVCwKKyAgICAgICAgIFJlZ2lvbiAqUGFyZW50ID0gbnVsbHB0cik7CisgIH5SZWdpb24oKTsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVnaW9uTm9kZSAmUk4pIGNvbnN0IHsKKyAgICByZXR1cm4gJlJOID09IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVnaW9uTm9kZSAqPih0aGlzKTsKKyAgfQorfTsKKworY2xhc3MgUmVnaW9uSW5mbyA6IHB1YmxpYyBSZWdpb25JbmZvQmFzZTxSZWdpb25UcmFpdHM8RnVuY3Rpb24+PiB7CitwdWJsaWM6CisgIHVzaW5nIEJhc2UgPSBSZWdpb25JbmZvQmFzZTxSZWdpb25UcmFpdHM8RnVuY3Rpb24+PjsKKworICBleHBsaWNpdCBSZWdpb25JbmZvKCk7CisKKyAgUmVnaW9uSW5mbyhSZWdpb25JbmZvICYmQXJnKSA6IEJhc2Uoc3RkOjptb3ZlKHN0YXRpY19jYXN0PEJhc2UgJj4oQXJnKSkpIHsKKyAgICB1cGRhdGVSZWdpb25UcmVlKCp0aGlzLCBUb3BMZXZlbFJlZ2lvbik7CisgIH0KKworICBSZWdpb25JbmZvICZvcGVyYXRvcj0oUmVnaW9uSW5mbyAmJlJIUykgeworICAgIEJhc2U6Om9wZXJhdG9yPShzdGQ6Om1vdmUoc3RhdGljX2Nhc3Q8QmFzZSAmPihSSFMpKSk7CisgICAgdXBkYXRlUmVnaW9uVHJlZSgqdGhpcywgVG9wTGV2ZWxSZWdpb24pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIH5SZWdpb25JbmZvKCkgb3ZlcnJpZGU7CisKKyAgLy8vIEhhbmRsZSBpbnZhbGlkYXRpb24gZXhwbGljaXRseS4KKyAgYm9vbCBpbnZhbGlkYXRlKEZ1bmN0aW9uICZGLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmUEEsCisgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJik7CisKKyAgLy8gdXBkYXRlU3RhdGlzdGljcyAtIFVwZGF0ZSBzdGF0aXN0aWMgYWJvdXQgY3JlYXRlZCByZWdpb25zLgorICB2b2lkIHVwZGF0ZVN0YXRpc3RpY3MoUmVnaW9uICpSKSBmaW5hbDsKKworICB2b2lkIHJlY2FsY3VsYXRlKEZ1bmN0aW9uICZGLCBEb21pbmF0b3JUcmVlICpEVCwgUG9zdERvbWluYXRvclRyZWUgKlBEVCwKKyAgICAgICAgICAgICAgICAgICBEb21pbmFuY2VGcm9udGllciAqREYpOworCisjaWZuZGVmIE5ERUJVRworICAvLy8gQGJyaWVmIE9wZW5zIGEgdmlld2VyIHRvIHNob3cgdGhlIEdyYXBoVml6IHZpc3VhbGl6YXRpb24gb2YgdGhlIHJlZ2lvbnMuCisgIC8vLworICAvLy8gVXNlZnVsIGR1cmluZyBkZWJ1Z2dpbmcgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gZHVtcCgpLgorICB2b2lkIHZpZXcoKTsKKworICAvLy8gQGJyaWVmIE9wZW5zIGEgdmlld2VyIHRvIHNob3cgdGhlIEdyYXBoVml6IHZpc3VhbGl6YXRpb24gb2YgdGhpcyByZWdpb24KKyAgLy8vIHdpdGhvdXQgaW5zdHJ1Y3Rpb25zIGluIHRoZSBCYXNpY0Jsb2Nrcy4KKyAgLy8vCisgIC8vLyBVc2VmdWwgZHVyaW5nIGRlYnVnZ2luZyBhcyBhbiBhbHRlcm5hdGl2ZSB0byBkdW1wKCkuCisgIHZvaWQgdmlld09ubHkoKTsKKyNlbmRpZgorfTsKKworY2xhc3MgUmVnaW9uSW5mb1Bhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgUmVnaW9uSW5mbyBSSTsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBleHBsaWNpdCBSZWdpb25JbmZvUGFzcygpOworICB+UmVnaW9uSW5mb1Bhc3MoKSBvdmVycmlkZTsKKworICBSZWdpb25JbmZvICZnZXRSZWdpb25JbmZvKCkgeyByZXR1cm4gUkk7IH0KKworICBjb25zdCBSZWdpb25JbmZvICZnZXRSZWdpb25JbmZvKCkgY29uc3QgeyByZXR1cm4gUkk7IH0KKworICAvLy8gQG5hbWUgRnVuY3Rpb25QYXNzIGludGVyZmFjZQorICAvL0B7CisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlOworICB2b2lkIHZlcmlmeUFuYWx5c2lzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUgKikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworICAvL0B9Cit9OworCisvLy8gXGJyaWVmIEFuYWx5c2lzIHBhc3MgdGhhdCBleHBvc2VzIHRoZSBcYyBSZWdpb25JbmZvIGZvciBhIGZ1bmN0aW9uLgorY2xhc3MgUmVnaW9uSW5mb0FuYWx5c2lzIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPFJlZ2lvbkluZm9BbmFseXNpcz4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48UmVnaW9uSW5mb0FuYWx5c2lzPjsKKworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIHVzaW5nIFJlc3VsdCA9IFJlZ2lvbkluZm87CisKKyAgUmVnaW9uSW5mbyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIFByaW50ZXIgcGFzcyBmb3IgdGhlIFxjIFJlZ2lvbkluZm8uCitjbGFzcyBSZWdpb25JbmZvUHJpbnRlclBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxSZWdpb25JbmZvUHJpbnRlclBhc3M+IHsKKyAgcmF3X29zdHJlYW0gJk9TOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFJlZ2lvbkluZm9QcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmT1MpOworCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBcYnJpZWYgVmVyaWZpZXIgcGFzcyBmb3IgdGhlIFxjIFJlZ2lvbkluZm8uCitzdHJ1Y3QgUmVnaW9uSW5mb1ZlcmlmaWVyUGFzcyA6IFBhc3NJbmZvTWl4aW48UmVnaW9uSW5mb1ZlcmlmaWVyUGFzcz4geworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit0ZW1wbGF0ZSA8PgordGVtcGxhdGUgPD4KK2lubGluZSBCYXNpY0Jsb2NrICoKK1JlZ2lvbk5vZGVCYXNlPFJlZ2lvblRyYWl0czxGdW5jdGlvbj4+OjpnZXROb2RlQXM8QmFzaWNCbG9jaz4oKSBjb25zdCB7CisgIGFzc2VydCghaXNTdWJSZWdpb24oKSAmJiAiVGhpcyBpcyBub3QgYSBCYXNpY0Jsb2NrIFJlZ2lvbk5vZGUhIik7CisgIHJldHVybiBnZXRFbnRyeSgpOworfQorCit0ZW1wbGF0ZSA8PgordGVtcGxhdGUgPD4KK2lubGluZSBSZWdpb24gKgorUmVnaW9uTm9kZUJhc2U8UmVnaW9uVHJhaXRzPEZ1bmN0aW9uPj46OmdldE5vZGVBczxSZWdpb24+KCkgY29uc3QgeworICBhc3NlcnQoaXNTdWJSZWdpb24oKSAmJiAiVGhpcyBpcyBub3QgYSBzdWJyZWdpb24gUmVnaW9uTm9kZSEiKTsKKyAgYXV0byBVbmNvbnN0ID0gY29uc3RfY2FzdDxSZWdpb25Ob2RlQmFzZTxSZWdpb25UcmFpdHM8RnVuY3Rpb24+PiAqPih0aGlzKTsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UmVnaW9uICo+KFVuY29uc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+CitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lvbk5vZGVCYXNlPFRyPiAmTm9kZSkgeworICB1c2luZyBCbG9ja1QgPSB0eXBlbmFtZSBUcjo6QmxvY2tUOworICB1c2luZyBSZWdpb25UID0gdHlwZW5hbWUgVHI6OlJlZ2lvblQ7CisKKyAgaWYgKE5vZGUuaXNTdWJSZWdpb24oKSkKKyAgICByZXR1cm4gT1MgPDwgTm9kZS50ZW1wbGF0ZSBnZXROb2RlQXM8UmVnaW9uVD4oKS0+Z2V0TmFtZVN0cigpOworICBlbHNlCisgICAgcmV0dXJuIE9TIDw8IE5vZGUudGVtcGxhdGUgZ2V0Tm9kZUFzPEJsb2NrVD4oKS0+Z2V0TmFtZSgpOworfQorCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgUmVnaW9uQmFzZTxSZWdpb25UcmFpdHM8RnVuY3Rpb24+PjsKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBSZWdpb25Ob2RlQmFzZTxSZWdpb25UcmFpdHM8RnVuY3Rpb24+PjsKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBSZWdpb25JbmZvQmFzZTxSZWdpb25UcmFpdHM8RnVuY3Rpb24+PjsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfUkVHSU9OSU5GT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1JlZ2lvbkluZm9JbXBsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1JlZ2lvbkluZm9JbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2YmFhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUmVnaW9uSW5mb0ltcGwuaApAQCAtMCwwICsxLDkzMSBAQAorLy89PT0tIFJlZ2lvbkluZm9JbXBsLmggLSBTRVNFIHJlZ2lvbiBkZXRlY3Rpb24gYW5hbHlzaXMgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIERldGVjdHMgc2luZ2xlIGVudHJ5IHNpbmdsZSBleGl0IHJlZ2lvbnMgaW4gdGhlIGNvbnRyb2wgZmxvdyBncmFwaC4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19SRUdJT05JTkZPSU1QTF9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfUkVHSU9OSU5GT0lNUExfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb3N0T3JkZXJJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RvbWluYW5jZUZyb250aWVyLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUG9zdERvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1JlZ2lvbkluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1JlZ2lvbkl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNkZWZpbmUgREVCVUdfVFlQRSAicmVnaW9uIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gUmVnaW9uQmFzZSBJbXBsZW1lbnRhdGlvbgordGVtcGxhdGUgPGNsYXNzIFRyPgorUmVnaW9uQmFzZTxUcj46OlJlZ2lvbkJhc2UoQmxvY2tUICpFbnRyeSwgQmxvY2tUICpFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgVHI6OlJlZ2lvbkluZm9UICpSSW5mbywgRG9tVHJlZVQgKmR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaW9uVCAqUGFyZW50KQorICAgIDogUmVnaW9uTm9kZUJhc2U8VHI+KFBhcmVudCwgRW50cnksIDEpLCBSSShSSW5mbyksIERUKGR0KSwgZXhpdChFeGl0KSB7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+CitSZWdpb25CYXNlPFRyPjo6flJlZ2lvbkJhc2UoKSB7CisgIC8vIE9ubHkgY2xlYW4gdGhlIGNhY2hlIGZvciB0aGlzIFJlZ2lvbi4gQ2FjaGVzIG9mIGNoaWxkIFJlZ2lvbnMgd2lsbCBiZQorICAvLyBjbGVhbmVkIHdoZW4gdGhlIGNoaWxkIFJlZ2lvbnMgYXJlIGRlbGV0ZWQuCisgIEJCTm9kZU1hcC5jbGVhcigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkJhc2U8VHI+OjpyZXBsYWNlRW50cnkoQmxvY2tUICpCQikgeworICB0aGlzLT5lbnRyeS5zZXRQb2ludGVyKEJCKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordm9pZCBSZWdpb25CYXNlPFRyPjo6cmVwbGFjZUV4aXQoQmxvY2tUICpCQikgeworICBhc3NlcnQoZXhpdCAmJiAiTm8gZXhpdCB0byByZXBsYWNlISIpOworICBleGl0ID0gQkI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3ZvaWQgUmVnaW9uQmFzZTxUcj46OnJlcGxhY2VFbnRyeVJlY3Vyc2l2ZShCbG9ja1QgKk5ld0VudHJ5KSB7CisgIHN0ZDo6dmVjdG9yPFJlZ2lvblQgKj4gUmVnaW9uUXVldWU7CisgIEJsb2NrVCAqT2xkRW50cnkgPSBnZXRFbnRyeSgpOworCisgIFJlZ2lvblF1ZXVlLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxSZWdpb25UICo+KHRoaXMpKTsKKyAgd2hpbGUgKCFSZWdpb25RdWV1ZS5lbXB0eSgpKSB7CisgICAgUmVnaW9uVCAqUiA9IFJlZ2lvblF1ZXVlLmJhY2soKTsKKyAgICBSZWdpb25RdWV1ZS5wb3BfYmFjaygpOworCisgICAgUi0+cmVwbGFjZUVudHJ5KE5ld0VudHJ5KTsKKyAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxSZWdpb25UPiAmQ2hpbGQgOiAqUikgeworICAgICAgaWYgKENoaWxkLT5nZXRFbnRyeSgpID09IE9sZEVudHJ5KQorICAgICAgICBSZWdpb25RdWV1ZS5wdXNoX2JhY2soQ2hpbGQuZ2V0KCkpOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkJhc2U8VHI+OjpyZXBsYWNlRXhpdFJlY3Vyc2l2ZShCbG9ja1QgKk5ld0V4aXQpIHsKKyAgc3RkOjp2ZWN0b3I8UmVnaW9uVCAqPiBSZWdpb25RdWV1ZTsKKyAgQmxvY2tUICpPbGRFeGl0ID0gZ2V0RXhpdCgpOworCisgIFJlZ2lvblF1ZXVlLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxSZWdpb25UICo+KHRoaXMpKTsKKyAgd2hpbGUgKCFSZWdpb25RdWV1ZS5lbXB0eSgpKSB7CisgICAgUmVnaW9uVCAqUiA9IFJlZ2lvblF1ZXVlLmJhY2soKTsKKyAgICBSZWdpb25RdWV1ZS5wb3BfYmFjaygpOworCisgICAgUi0+cmVwbGFjZUV4aXQoTmV3RXhpdCk7CisgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8UmVnaW9uVD4gJkNoaWxkIDogKlIpIHsKKyAgICAgIGlmIChDaGlsZC0+Z2V0RXhpdCgpID09IE9sZEV4aXQpCisgICAgICAgIFJlZ2lvblF1ZXVlLnB1c2hfYmFjayhDaGlsZC5nZXQoKSk7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK2Jvb2wgUmVnaW9uQmFzZTxUcj46OmNvbnRhaW5zKGNvbnN0IEJsb2NrVCAqQikgY29uc3QgeworICBCbG9ja1QgKkJCID0gY29uc3RfY2FzdDxCbG9ja1QgKj4oQik7CisKKyAgaWYgKCFEVC0+Z2V0Tm9kZShCQikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIEJsb2NrVCAqZW50cnkgPSBnZXRFbnRyeSgpLCAqZXhpdCA9IGdldEV4aXQoKTsKKworICAvLyBUb3BsZXZlbCByZWdpb24uCisgIGlmICghZXhpdCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gKERULT5kb21pbmF0ZXMoZW50cnksIEJCKSAmJgorICAgICAgICAgICEoRFQtPmRvbWluYXRlcyhleGl0LCBCQikgJiYgRFQtPmRvbWluYXRlcyhlbnRyeSwgZXhpdCkpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgorYm9vbCBSZWdpb25CYXNlPFRyPjo6Y29udGFpbnMoY29uc3QgTG9vcFQgKkwpIGNvbnN0IHsKKyAgLy8gQkJzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGFueSBsb29wIGFyZSBlbGVtZW50IG9mIHRoZSBMb29wCisgIC8vIGRlc2NyaWJlZCBieSB0aGUgTlVMTCBwb2ludGVyLiBUaGlzIGxvb3AgaXMgbm90IHBhcnQgb2YgYW55IHJlZ2lvbiwKKyAgLy8gZXhjZXB0IGlmIHRoZSByZWdpb24gZGVzY3JpYmVzIHRoZSB3aG9sZSBmdW5jdGlvbi4KKyAgaWYgKCFMKQorICAgIHJldHVybiBnZXRFeGl0KCkgPT0gbnVsbHB0cjsKKworICBpZiAoIWNvbnRhaW5zKEwtPmdldEhlYWRlcigpKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgU21hbGxWZWN0b3I8QmxvY2tUICosIDg+IEV4aXRpbmdCbG9ja3M7CisgIEwtPmdldEV4aXRpbmdCbG9ja3MoRXhpdGluZ0Jsb2Nrcyk7CisKKyAgZm9yIChCbG9ja1QgKkJCIDogRXhpdGluZ0Jsb2NrcykgeworICAgIGlmICghY29udGFpbnMoQkIpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3R5cGVuYW1lIFRyOjpMb29wVCAqUmVnaW9uQmFzZTxUcj46Om91dGVybW9zdExvb3BJblJlZ2lvbihMb29wVCAqTCkgY29uc3QgeworICBpZiAoIWNvbnRhaW5zKEwpKQorICAgIHJldHVybiBudWxscHRyOworCisgIHdoaWxlIChMICYmIGNvbnRhaW5zKEwtPmdldFBhcmVudExvb3AoKSkpIHsKKyAgICBMID0gTC0+Z2V0UGFyZW50TG9vcCgpOworICB9CisKKyAgcmV0dXJuIEw7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3R5cGVuYW1lIFRyOjpMb29wVCAqUmVnaW9uQmFzZTxUcj46Om91dGVybW9zdExvb3BJblJlZ2lvbihMb29wSW5mb1QgKkxJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgYXNzZXJ0KExJICYmIEJCICYmICJMSSBhbmQgQkIgY2Fubm90IGJlIG51bGwhIik7CisgIExvb3BUICpMID0gTEktPmdldExvb3BGb3IoQkIpOworICByZXR1cm4gb3V0ZXJtb3N0TG9vcEluUmVnaW9uKEwpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit0eXBlbmFtZSBSZWdpb25CYXNlPFRyPjo6QmxvY2tUICpSZWdpb25CYXNlPFRyPjo6Z2V0RW50ZXJpbmdCbG9jaygpIGNvbnN0IHsKKyAgQmxvY2tUICplbnRyeSA9IGdldEVudHJ5KCk7CisgIEJsb2NrVCAqZW50ZXJpbmdCbG9jayA9IG51bGxwdHI7CisKKyAgZm9yIChCbG9ja1QgKlByZWQgOiBtYWtlX3JhbmdlKEludkJsb2NrVHJhaXRzOjpjaGlsZF9iZWdpbihlbnRyeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKGVudHJ5KSkpIHsKKyAgICBpZiAoRFQtPmdldE5vZGUoUHJlZCkgJiYgIWNvbnRhaW5zKFByZWQpKSB7CisgICAgICBpZiAoZW50ZXJpbmdCbG9jaykKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgIGVudGVyaW5nQmxvY2sgPSBQcmVkOworICAgIH0KKyAgfQorCisgIHJldHVybiBlbnRlcmluZ0Jsb2NrOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Citib29sIFJlZ2lvbkJhc2U8VHI+OjpnZXRFeGl0aW5nQmxvY2tzKAorICAgIFNtYWxsVmVjdG9ySW1wbDxCbG9ja1QgKj4gJkV4aXRpbmdzKSBjb25zdCB7CisgIGJvb2wgQ292ZXJBbGwgPSB0cnVlOworCisgIGlmICghZXhpdCkKKyAgICByZXR1cm4gQ292ZXJBbGw7CisKKyAgZm9yIChQcmVkSXRlclR5IFBJID0gSW52QmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKGV4aXQpLAorICAgICAgICAgICAgICAgICAgUEUgPSBJbnZCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKGV4aXQpOworICAgICAgIFBJICE9IFBFOyArK1BJKSB7CisgICAgQmxvY2tUICpQcmVkID0gKlBJOworICAgIGlmIChjb250YWlucyhQcmVkKSkgeworICAgICAgRXhpdGluZ3MucHVzaF9iYWNrKFByZWQpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgQ292ZXJBbGwgPSBmYWxzZTsKKyAgfQorCisgIHJldHVybiBDb3ZlckFsbDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgUmVnaW9uQmFzZTxUcj46OkJsb2NrVCAqUmVnaW9uQmFzZTxUcj46OmdldEV4aXRpbmdCbG9jaygpIGNvbnN0IHsKKyAgQmxvY2tUICpleGl0ID0gZ2V0RXhpdCgpOworICBCbG9ja1QgKmV4aXRpbmdCbG9jayA9IG51bGxwdHI7CisKKyAgaWYgKCFleGl0KQorICAgIHJldHVybiBudWxscHRyOworCisgIGZvciAoQmxvY2tUICpQcmVkIDogbWFrZV9yYW5nZShJbnZCbG9ja1RyYWl0czo6Y2hpbGRfYmVnaW4oZXhpdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKGV4aXQpKSkgeworICAgIGlmIChjb250YWlucyhQcmVkKSkgeworICAgICAgaWYgKGV4aXRpbmdCbG9jaykKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgIGV4aXRpbmdCbG9jayA9IFByZWQ7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGV4aXRpbmdCbG9jazsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgorYm9vbCBSZWdpb25CYXNlPFRyPjo6aXNTaW1wbGUoKSBjb25zdCB7CisgIHJldHVybiAhaXNUb3BMZXZlbFJlZ2lvbigpICYmIGdldEVudGVyaW5nQmxvY2soKSAmJiBnZXRFeGl0aW5nQmxvY2soKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgorc3RkOjpzdHJpbmcgUmVnaW9uQmFzZTxUcj46OmdldE5hbWVTdHIoKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIGV4aXROYW1lOworICBzdGQ6OnN0cmluZyBlbnRyeU5hbWU7CisKKyAgaWYgKGdldEVudHJ5KCktPmdldE5hbWUoKS5lbXB0eSgpKSB7CisgICAgcmF3X3N0cmluZ19vc3RyZWFtIE9TKGVudHJ5TmFtZSk7CisKKyAgICBnZXRFbnRyeSgpLT5wcmludEFzT3BlcmFuZChPUywgZmFsc2UpOworICB9IGVsc2UKKyAgICBlbnRyeU5hbWUgPSBnZXRFbnRyeSgpLT5nZXROYW1lKCk7CisKKyAgaWYgKGdldEV4aXQoKSkgeworICAgIGlmIChnZXRFeGl0KCktPmdldE5hbWUoKS5lbXB0eSgpKSB7CisgICAgICByYXdfc3RyaW5nX29zdHJlYW0gT1MoZXhpdE5hbWUpOworCisgICAgICBnZXRFeGl0KCktPnByaW50QXNPcGVyYW5kKE9TLCBmYWxzZSk7CisgICAgfSBlbHNlCisgICAgICBleGl0TmFtZSA9IGdldEV4aXQoKS0+Z2V0TmFtZSgpOworICB9IGVsc2UKKyAgICBleGl0TmFtZSA9ICI8RnVuY3Rpb24gUmV0dXJuPiI7CisKKyAgcmV0dXJuIGVudHJ5TmFtZSArICIgPT4gIiArIGV4aXROYW1lOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkJhc2U8VHI+Ojp2ZXJpZnlCQkluUmVnaW9uKEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgaWYgKCFjb250YWlucyhCQikpCisgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJCcm9rZW4gcmVnaW9uIGZvdW5kOiBlbnVtZXJhdGVkIEJCIG5vdCBpbiByZWdpb24hIik7CisKKyAgQmxvY2tUICplbnRyeSA9IGdldEVudHJ5KCksICpleGl0ID0gZ2V0RXhpdCgpOworCisgIGZvciAoQmxvY2tUICpTdWNjIDoKKyAgICAgICBtYWtlX3JhbmdlKEJsb2NrVHJhaXRzOjpjaGlsZF9iZWdpbihCQiksIEJsb2NrVHJhaXRzOjpjaGlsZF9lbmQoQkIpKSkgeworICAgIGlmICghY29udGFpbnMoU3VjYykgJiYgZXhpdCAhPSBTdWNjKQorICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJCcm9rZW4gcmVnaW9uIGZvdW5kOiBlZGdlcyBsZWF2aW5nIHRoZSByZWdpb24gbXVzdCBnbyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInRvIHRoZSBleGl0IG5vZGUhIik7CisgIH0KKworICBpZiAoZW50cnkgIT0gQkIpIHsKKyAgICBmb3IgKEJsb2NrVCAqUHJlZCA6IG1ha2VfcmFuZ2UoSW52QmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKEJCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52QmxvY2tUcmFpdHM6OmNoaWxkX2VuZChCQikpKSB7CisgICAgICBpZiAoIWNvbnRhaW5zKFByZWQpKQorICAgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIkJyb2tlbiByZWdpb24gZm91bmQ6IGVkZ2VzIGVudGVyaW5nIHRoZSByZWdpb24gbXVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ28gdG8gdGhlIGVudHJ5IG5vZGUhIik7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3ZvaWQgUmVnaW9uQmFzZTxUcj46OnZlcmlmeVdhbGsoQmxvY2tUICpCQiwgc3RkOjpzZXQ8QmxvY2tUICo+ICp2aXNpdGVkKSBjb25zdCB7CisgIEJsb2NrVCAqZXhpdCA9IGdldEV4aXQoKTsKKworICB2aXNpdGVkLT5pbnNlcnQoQkIpOworCisgIHZlcmlmeUJCSW5SZWdpb24oQkIpOworCisgIGZvciAoQmxvY2tUICpTdWNjIDoKKyAgICAgICBtYWtlX3JhbmdlKEJsb2NrVHJhaXRzOjpjaGlsZF9iZWdpbihCQiksIEJsb2NrVHJhaXRzOjpjaGlsZF9lbmQoQkIpKSkgeworICAgIGlmIChTdWNjICE9IGV4aXQgJiYgdmlzaXRlZC0+ZmluZChTdWNjKSA9PSB2aXNpdGVkLT5lbmQoKSkKKyAgICAgIHZlcmlmeVdhbGsoU3VjYywgdmlzaXRlZCk7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordm9pZCBSZWdpb25CYXNlPFRyPjo6dmVyaWZ5UmVnaW9uKCkgY29uc3QgeworICAvLyBPbmx5IGRvIHZlcmlmaWNhdGlvbiB3aGVuIHVzZXIgd2FudHMgdG8sIG90aGVyd2lzZSB0aGlzIGV4cGVuc2l2ZSBjaGVjaworICAvLyB3aWxsIGJlIGludm9rZWQgYnkgUE1EYXRhTWFuYWdlcjo6dmVyaWZ5UHJlc2VydmVkQW5hbHlzaXMgd2hlbgorICAvLyBhIHJlZ2lvbnBhc3MgKG1hcmtlZCBQcmVzZXJ2ZWRBbGwpIGZpbmlzaC4KKyAgaWYgKCFSZWdpb25JbmZvQmFzZTxUcj46OlZlcmlmeVJlZ2lvbkluZm8pCisgICAgcmV0dXJuOworCisgIHN0ZDo6c2V0PEJsb2NrVCAqPiB2aXNpdGVkOworICB2ZXJpZnlXYWxrKGdldEVudHJ5KCksICZ2aXNpdGVkKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordm9pZCBSZWdpb25CYXNlPFRyPjo6dmVyaWZ5UmVnaW9uTmVzdCgpIGNvbnN0IHsKKyAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8UmVnaW9uVD4gJlIgOiAqdGhpcykKKyAgICBSLT52ZXJpZnlSZWdpb25OZXN0KCk7CisKKyAgdmVyaWZ5UmVnaW9uKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3R5cGVuYW1lIFJlZ2lvbkJhc2U8VHI+OjplbGVtZW50X2l0ZXJhdG9yIFJlZ2lvbkJhc2U8VHI+OjplbGVtZW50X2JlZ2luKCkgeworICByZXR1cm4gR3JhcGhUcmFpdHM8UmVnaW9uVCAqPjo6bm9kZXNfYmVnaW4oc3RhdGljX2Nhc3Q8UmVnaW9uVCAqPih0aGlzKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3R5cGVuYW1lIFJlZ2lvbkJhc2U8VHI+OjplbGVtZW50X2l0ZXJhdG9yIFJlZ2lvbkJhc2U8VHI+OjplbGVtZW50X2VuZCgpIHsKKyAgcmV0dXJuIEdyYXBoVHJhaXRzPFJlZ2lvblQgKj46Om5vZGVzX2VuZChzdGF0aWNfY2FzdDxSZWdpb25UICo+KHRoaXMpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgUmVnaW9uQmFzZTxUcj46OmNvbnN0X2VsZW1lbnRfaXRlcmF0b3IKK1JlZ2lvbkJhc2U8VHI+OjplbGVtZW50X2JlZ2luKCkgY29uc3QgeworICByZXR1cm4gR3JhcGhUcmFpdHM8Y29uc3QgUmVnaW9uVCAqPjo6bm9kZXNfYmVnaW4oCisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBSZWdpb25UICo+KHRoaXMpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgUmVnaW9uQmFzZTxUcj46OmNvbnN0X2VsZW1lbnRfaXRlcmF0b3IKK1JlZ2lvbkJhc2U8VHI+OjplbGVtZW50X2VuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIEdyYXBoVHJhaXRzPGNvbnN0IFJlZ2lvblQgKj46Om5vZGVzX2VuZCgKKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IFJlZ2lvblQgKj4odGhpcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit0eXBlbmFtZSBUcjo6UmVnaW9uVCAqUmVnaW9uQmFzZTxUcj46OmdldFN1YlJlZ2lvbk5vZGUoQmxvY2tUICpCQikgY29uc3QgeworICB1c2luZyBSZWdpb25UID0gdHlwZW5hbWUgVHI6OlJlZ2lvblQ7CisKKyAgUmVnaW9uVCAqUiA9IFJJLT5nZXRSZWdpb25Gb3IoQkIpOworCisgIGlmICghUiB8fCBSID09IHRoaXMpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgLy8gSWYgd2UgcGFzcyB0aGUgQkIgb3V0IG9mIHRoaXMgcmVnaW9uLCB0aGF0IG1lYW5zIG91ciBjb2RlIGlzIGJyb2tlbi4KKyAgYXNzZXJ0KGNvbnRhaW5zKFIpICYmICJCQiBub3QgaW4gY3VycmVudCByZWdpb24hIik7CisKKyAgd2hpbGUgKGNvbnRhaW5zKFItPmdldFBhcmVudCgpKSAmJiBSLT5nZXRQYXJlbnQoKSAhPSB0aGlzKQorICAgIFIgPSBSLT5nZXRQYXJlbnQoKTsKKworICBpZiAoUi0+Z2V0RW50cnkoKSAhPSBCQikKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICByZXR1cm4gUjsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgVHI6OlJlZ2lvbk5vZGVUICpSZWdpb25CYXNlPFRyPjo6Z2V0QkJOb2RlKEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgYXNzZXJ0KGNvbnRhaW5zKEJCKSAmJiAiQ2FuIGdldCBCQiBub2RlIG91dCBvZiB0aGlzIHJlZ2lvbiEiKTsKKworICB0eXBlbmFtZSBCQk5vZGVNYXBUOjpjb25zdF9pdGVyYXRvciBhdCA9IEJCTm9kZU1hcC5maW5kKEJCKTsKKworICBpZiAoYXQgPT0gQkJOb2RlTWFwLmVuZCgpKSB7CisgICAgYXV0byBEZWNvbnN0ID0gY29uc3RfY2FzdDxSZWdpb25CYXNlPFRyPiAqPih0aGlzKTsKKyAgICB0eXBlbmFtZSBCQk5vZGVNYXBUOjp2YWx1ZV90eXBlIFYgPSB7CisgICAgICAgIEJCLAorICAgICAgICBsbHZtOjptYWtlX3VuaXF1ZTxSZWdpb25Ob2RlVD4oc3RhdGljX2Nhc3Q8UmVnaW9uVCAqPihEZWNvbnN0KSwgQkIpfTsKKyAgICBhdCA9IEJCTm9kZU1hcC5pbnNlcnQoc3RkOjptb3ZlKFYpKS5maXJzdDsKKyAgfQorICByZXR1cm4gYXQtPnNlY29uZC5nZXQoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgVHI6OlJlZ2lvbk5vZGVUICpSZWdpb25CYXNlPFRyPjo6Z2V0Tm9kZShCbG9ja1QgKkJCKSBjb25zdCB7CisgIGFzc2VydChjb250YWlucyhCQikgJiYgIkNhbiBnZXQgQkIgbm9kZSBvdXQgb2YgdGhpcyByZWdpb24hIik7CisgIGlmIChSZWdpb25UICpDaGlsZCA9IGdldFN1YlJlZ2lvbk5vZGUoQkIpKQorICAgIHJldHVybiBDaGlsZC0+Z2V0Tm9kZSgpOworCisgIHJldHVybiBnZXRCQk5vZGUoQkIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkJhc2U8VHI+Ojp0cmFuc2ZlckNoaWxkcmVuVG8oUmVnaW9uVCAqVG8pIHsKKyAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8UmVnaW9uVD4gJlIgOiAqdGhpcykgeworICAgIFItPnBhcmVudCA9IFRvOworICAgIFRvLT5jaGlsZHJlbi5wdXNoX2JhY2soc3RkOjptb3ZlKFIpKTsKKyAgfQorICBjaGlsZHJlbi5jbGVhcigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkJhc2U8VHI+OjphZGRTdWJSZWdpb24oUmVnaW9uVCAqU3ViUmVnaW9uLCBib29sIG1vdmVDaGlsZHJlbikgeworICBhc3NlcnQoIVN1YlJlZ2lvbi0+cGFyZW50ICYmICJTdWJSZWdpb24gYWxyZWFkeSBoYXMgYSBwYXJlbnQhIik7CisgIGFzc2VydChsbHZtOjpmaW5kX2lmKCp0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICBbJl0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFJlZ2lvblQ+ICZSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFIuZ2V0KCkgPT0gU3ViUmVnaW9uOworICAgICAgICAgICAgICAgICAgICAgICB9KSA9PSBjaGlsZHJlbi5lbmQoKSAmJgorICAgICAgICAgIlN1YnJlZ2lvbiBhbHJlYWR5IGV4aXN0cyEiKTsKKworICBTdWJSZWdpb24tPnBhcmVudCA9IHN0YXRpY19jYXN0PFJlZ2lvblQgKj4odGhpcyk7CisgIGNoaWxkcmVuLnB1c2hfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8UmVnaW9uVD4oU3ViUmVnaW9uKSk7CisKKyAgaWYgKCFtb3ZlQ2hpbGRyZW4pCisgICAgcmV0dXJuOworCisgIGFzc2VydChTdWJSZWdpb24tPmNoaWxkcmVuLmVtcHR5KCkgJiYKKyAgICAgICAgICJTdWJSZWdpb25zIHRoYXQgY29udGFpbiBjaGlsZHJlbiBhcmUgbm90IHN1cHBvcnRlZCIpOworCisgIGZvciAoUmVnaW9uTm9kZVQgKkVsZW1lbnQgOiBlbGVtZW50cygpKSB7CisgICAgaWYgKCFFbGVtZW50LT5pc1N1YlJlZ2lvbigpKSB7CisgICAgICBCbG9ja1QgKkJCID0gRWxlbWVudC0+dGVtcGxhdGUgZ2V0Tm9kZUFzPEJsb2NrVD4oKTsKKworICAgICAgaWYgKFN1YlJlZ2lvbi0+Y29udGFpbnMoQkIpKQorICAgICAgICBSSS0+c2V0UmVnaW9uRm9yKEJCLCBTdWJSZWdpb24pOworICAgIH0KKyAgfQorCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxSZWdpb25UPj4gS2VlcDsKKyAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8UmVnaW9uVD4gJlIgOiAqdGhpcykgeworICAgIGlmIChTdWJSZWdpb24tPmNvbnRhaW5zKFIuZ2V0KCkpICYmIFIuZ2V0KCkgIT0gU3ViUmVnaW9uKSB7CisgICAgICBSLT5wYXJlbnQgPSBTdWJSZWdpb247CisgICAgICBTdWJSZWdpb24tPmNoaWxkcmVuLnB1c2hfYmFjayhzdGQ6Om1vdmUoUikpOworICAgIH0gZWxzZQorICAgICAgS2VlcC5wdXNoX2JhY2soc3RkOjptb3ZlKFIpKTsKKyAgfQorCisgIGNoaWxkcmVuLmNsZWFyKCk7CisgIGNoaWxkcmVuLmluc2VydCgKKyAgICAgIGNoaWxkcmVuLmJlZ2luKCksCisgICAgICBzdGQ6Om1vdmVfaXRlcmF0b3I8dHlwZW5hbWUgUmVnaW9uU2V0OjppdGVyYXRvcj4oS2VlcC5iZWdpbigpKSwKKyAgICAgIHN0ZDo6bW92ZV9pdGVyYXRvcjx0eXBlbmFtZSBSZWdpb25TZXQ6Oml0ZXJhdG9yPihLZWVwLmVuZCgpKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3R5cGVuYW1lIFRyOjpSZWdpb25UICpSZWdpb25CYXNlPFRyPjo6cmVtb3ZlU3ViUmVnaW9uKFJlZ2lvblQgKkNoaWxkKSB7CisgIGFzc2VydChDaGlsZC0+cGFyZW50ID09IHRoaXMgJiYgIkNoaWxkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgcmVnaW9uISIpOworICBDaGlsZC0+cGFyZW50ID0gbnVsbHB0cjsKKyAgdHlwZW5hbWUgUmVnaW9uU2V0OjppdGVyYXRvciBJID0KKyAgICAgIGxsdm06OmZpbmRfaWYoY2hpbGRyZW4sIFsmXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8UmVnaW9uVD4gJlIpIHsKKyAgICAgICAgcmV0dXJuIFIuZ2V0KCkgPT0gQ2hpbGQ7CisgICAgICB9KTsKKyAgYXNzZXJ0KEkgIT0gY2hpbGRyZW4uZW5kKCkgJiYgIlJlZ2lvbiBkb2VzIG5vdCBleGl0LiBVbmFibGUgdG8gcmVtb3ZlLiIpOworICBjaGlsZHJlbi5lcmFzZShjaGlsZHJlbi5iZWdpbigpICsgKEkgLSBiZWdpbigpKSk7CisgIHJldHVybiBDaGlsZDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordW5zaWduZWQgUmVnaW9uQmFzZTxUcj46OmdldERlcHRoKCkgY29uc3QgeworICB1bnNpZ25lZCBEZXB0aCA9IDA7CisKKyAgZm9yIChSZWdpb25UICpSID0gZ2V0UGFyZW50KCk7IFIgIT0gbnVsbHB0cjsgUiA9IFItPmdldFBhcmVudCgpKQorICAgICsrRGVwdGg7CisKKyAgcmV0dXJuIERlcHRoOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit0eXBlbmFtZSBUcjo6UmVnaW9uVCAqUmVnaW9uQmFzZTxUcj46OmdldEV4cGFuZGVkUmVnaW9uKCkgY29uc3QgeworICB1bnNpZ25lZCBOdW1TdWNjZXNzb3JzID0gVHI6OmdldE51bVN1Y2Nlc3NvcnMoZXhpdCk7CisKKyAgaWYgKE51bVN1Y2Nlc3NvcnMgPT0gMCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBSZWdpb25UICpSID0gUkktPmdldFJlZ2lvbkZvcihleGl0KTsKKworICBpZiAoUi0+Z2V0RW50cnkoKSAhPSBleGl0KSB7CisgICAgZm9yIChCbG9ja1QgKlByZWQgOiBtYWtlX3JhbmdlKEludkJsb2NrVHJhaXRzOjpjaGlsZF9iZWdpbihnZXRFeGl0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKGdldEV4aXQoKSkpKQorICAgICAgaWYgKCFjb250YWlucyhQcmVkKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgaWYgKFRyOjpnZXROdW1TdWNjZXNzb3JzKGV4aXQpID09IDEpCisgICAgICByZXR1cm4gbmV3IFJlZ2lvblQoZ2V0RW50cnkoKSwgKkJsb2NrVHJhaXRzOjpjaGlsZF9iZWdpbihleGl0KSwgUkksIERUKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHdoaWxlIChSLT5nZXRQYXJlbnQoKSAmJiBSLT5nZXRQYXJlbnQoKS0+Z2V0RW50cnkoKSA9PSBleGl0KQorICAgIFIgPSBSLT5nZXRQYXJlbnQoKTsKKworICBmb3IgKEJsb2NrVCAqUHJlZCA6IG1ha2VfcmFuZ2UoSW52QmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKGdldEV4aXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKGdldEV4aXQoKSkpKSB7CisgICAgaWYgKCEoY29udGFpbnMoUHJlZCkgfHwgUi0+Y29udGFpbnMoUHJlZCkpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICByZXR1cm4gbmV3IFJlZ2lvblQoZ2V0RW50cnkoKSwgUi0+Z2V0RXhpdCgpLCBSSSwgRFQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkJhc2U8VHI+OjpwcmludChyYXdfb3N0cmVhbSAmT1MsIGJvb2wgcHJpbnRfdHJlZSwgdW5zaWduZWQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0eWxlIFN0eWxlKSBjb25zdCB7CisgIGlmIChwcmludF90cmVlKQorICAgIE9TLmluZGVudChsZXZlbCAqIDIpIDw8ICdbJyA8PCBsZXZlbCA8PCAiXSAiIDw8IGdldE5hbWVTdHIoKTsKKyAgZWxzZQorICAgIE9TLmluZGVudChsZXZlbCAqIDIpIDw8IGdldE5hbWVTdHIoKTsKKworICBPUyA8PCAnXG4nOworCisgIGlmIChTdHlsZSAhPSBQcmludE5vbmUpIHsKKyAgICBPUy5pbmRlbnQobGV2ZWwgKiAyKSA8PCAie1xuIjsKKyAgICBPUy5pbmRlbnQobGV2ZWwgKiAyICsgMik7CisKKyAgICBpZiAoU3R5bGUgPT0gUHJpbnRCQikgeworICAgICAgZm9yIChjb25zdCBhdXRvICpCQiA6IGJsb2NrcygpKQorICAgICAgICBPUyA8PCBCQi0+Z2V0TmFtZSgpIDw8ICIsICI7IC8vIFRPRE86IHJlbW92ZSB0aGUgbGFzdCAiLCIKKyAgICB9IGVsc2UgaWYgKFN0eWxlID09IFByaW50Uk4pIHsKKyAgICAgIGZvciAoY29uc3QgUmVnaW9uTm9kZVQgKkVsZW1lbnQgOiBlbGVtZW50cygpKSB7CisgICAgICAgIE9TIDw8ICpFbGVtZW50IDw8ICIsICI7IC8vIFRPRE86IHJlbW92ZSB0aGUgbGFzdCAiLAorICAgICAgfQorICAgIH0KKworICAgIE9TIDw8ICdcbic7CisgIH0KKworICBpZiAocHJpbnRfdHJlZSkgeworICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFJlZ2lvblQ+ICZSIDogKnRoaXMpCisgICAgICBSLT5wcmludChPUywgcHJpbnRfdHJlZSwgbGV2ZWwgKyAxLCBTdHlsZSk7CisgIH0KKworICBpZiAoU3R5bGUgIT0gUHJpbnROb25lKQorICAgIE9TLmluZGVudChsZXZlbCAqIDIpIDw8ICJ9IFxuIjsKK30KKworI2lmICFkZWZpbmVkKE5ERUJVRykgfHwgZGVmaW5lZChMTFZNX0VOQUJMRV9EVU1QKQordGVtcGxhdGUgPGNsYXNzIFRyPgordm9pZCBSZWdpb25CYXNlPFRyPjo6ZHVtcCgpIGNvbnN0IHsKKyAgcHJpbnQoZGJncygpLCB0cnVlLCBnZXREZXB0aCgpLCBSZWdpb25JbmZvQmFzZTxUcj46OnByaW50U3R5bGUpOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3ZvaWQgUmVnaW9uQmFzZTxUcj46OmNsZWFyTm9kZUNhY2hlKCkgeworICBCQk5vZGVNYXAuY2xlYXIoKTsKKyAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8UmVnaW9uVD4gJlIgOiAqdGhpcykKKyAgICBSLT5jbGVhck5vZGVDYWNoZSgpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUmVnaW9uSW5mb0Jhc2UgaW1wbGVtZW50YXRpb24KKy8vCisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK1JlZ2lvbkluZm9CYXNlPFRyPjo6UmVnaW9uSW5mb0Jhc2UoKSA9IGRlZmF1bHQ7CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK1JlZ2lvbkluZm9CYXNlPFRyPjo6flJlZ2lvbkluZm9CYXNlKCkgeworICByZWxlYXNlTWVtb3J5KCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3ZvaWQgUmVnaW9uSW5mb0Jhc2U8VHI+Ojp2ZXJpZnlCQk1hcChjb25zdCBSZWdpb25UICpSKSBjb25zdCB7CisgIGFzc2VydChSICYmICJSZSBtdXN0IGJlIG5vbi1udWxsIik7CisgIGZvciAoY29uc3QgdHlwZW5hbWUgVHI6OlJlZ2lvbk5vZGVUICpFbGVtZW50IDogUi0+ZWxlbWVudHMoKSkgeworICAgIGlmIChFbGVtZW50LT5pc1N1YlJlZ2lvbigpKSB7CisgICAgICBjb25zdCBSZWdpb25UICpTUiA9IEVsZW1lbnQtPnRlbXBsYXRlIGdldE5vZGVBczxSZWdpb25UPigpOworICAgICAgdmVyaWZ5QkJNYXAoU1IpOworICAgIH0gZWxzZSB7CisgICAgICBCbG9ja1QgKkJCID0gRWxlbWVudC0+dGVtcGxhdGUgZ2V0Tm9kZUFzPEJsb2NrVD4oKTsKKyAgICAgIGlmIChnZXRSZWdpb25Gb3IoQkIpICE9IFIpCisgICAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiQkIgbWFwIGRvZXMgbm90IG1hdGNoIHJlZ2lvbiBuZXN0aW5nIik7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK2Jvb2wgUmVnaW9uSW5mb0Jhc2U8VHI+Ojppc0NvbW1vbkRvbUZyb250aWVyKEJsb2NrVCAqQkIsIEJsb2NrVCAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja1QgKmV4aXQpIGNvbnN0IHsKKyAgZm9yIChCbG9ja1QgKlAgOiBtYWtlX3JhbmdlKEludkJsb2NrVHJhaXRzOjpjaGlsZF9iZWdpbihCQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKEJCKSkpIHsKKyAgICBpZiAoRFQtPmRvbWluYXRlcyhlbnRyeSwgUCkgJiYgIURULT5kb21pbmF0ZXMoZXhpdCwgUCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgorYm9vbCBSZWdpb25JbmZvQmFzZTxUcj46OmlzUmVnaW9uKEJsb2NrVCAqZW50cnksIEJsb2NrVCAqZXhpdCkgY29uc3QgeworICBhc3NlcnQoZW50cnkgJiYgZXhpdCAmJiAiZW50cnkgYW5kIGV4aXQgbXVzdCBub3QgYmUgbnVsbCEiKTsKKworICB1c2luZyBEU1QgPSB0eXBlbmFtZSBEb21Gcm9udGllclQ6OkRvbVNldFR5cGU7CisKKyAgRFNUICplbnRyeVN1Y2NzID0gJkRGLT5maW5kKGVudHJ5KS0+c2Vjb25kOworCisgIC8vIEV4aXQgaXMgdGhlIGhlYWRlciBvZiBhIGxvb3AgdGhhdCBjb250YWlucyB0aGUgZW50cnkuIEluIHRoaXMgY2FzZSwKKyAgLy8gdGhlIGRvbWluYW5jZSBmcm9udGllciBtdXN0IG9ubHkgY29udGFpbiB0aGUgZXhpdC4KKyAgaWYgKCFEVC0+ZG9taW5hdGVzKGVudHJ5LCBleGl0KSkgeworICAgIGZvciAodHlwZW5hbWUgRFNUOjppdGVyYXRvciBTSSA9IGVudHJ5U3VjY3MtPmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFID0gZW50cnlTdWNjcy0+ZW5kKCk7CisgICAgICAgICBTSSAhPSBTRTsgKytTSSkgeworICAgICAgaWYgKCpTSSAhPSBleGl0ICYmICpTSSAhPSBlbnRyeSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgRFNUICpleGl0U3VjY3MgPSAmREYtPmZpbmQoZXhpdCktPnNlY29uZDsKKworICAvLyBEbyBub3QgYWxsb3cgZWRnZXMgbGVhdmluZyB0aGUgcmVnaW9uLgorICBmb3IgKEJsb2NrVCAqU3VjYyA6ICplbnRyeVN1Y2NzKSB7CisgICAgaWYgKFN1Y2MgPT0gZXhpdCB8fCBTdWNjID09IGVudHJ5KQorICAgICAgY29udGludWU7CisgICAgaWYgKGV4aXRTdWNjcy0+ZmluZChTdWNjKSA9PSBleGl0U3VjY3MtPmVuZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghaXNDb21tb25Eb21Gcm9udGllcihTdWNjLCBlbnRyeSwgZXhpdCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBEbyBub3QgYWxsb3cgZWRnZXMgcG9pbnRpbmcgaW50byB0aGUgcmVnaW9uLgorICBmb3IgKEJsb2NrVCAqU3VjYyA6ICpleGl0U3VjY3MpIHsKKyAgICBpZiAoRFQtPnByb3Blcmx5RG9taW5hdGVzKGVudHJ5LCBTdWNjKSAmJiBTdWNjICE9IGV4aXQpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordm9pZCBSZWdpb25JbmZvQmFzZTxUcj46Omluc2VydFNob3J0Q3V0KEJsb2NrVCAqZW50cnksIEJsb2NrVCAqZXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQnRvQkJNYXAgKlNob3J0Q3V0KSBjb25zdCB7CisgIGFzc2VydChlbnRyeSAmJiBleGl0ICYmICJlbnRyeSBhbmQgZXhpdCBtdXN0IG5vdCBiZSBudWxsISIpOworCisgIHR5cGVuYW1lIEJCdG9CQk1hcDo6aXRlcmF0b3IgZSA9IFNob3J0Q3V0LT5maW5kKGV4aXQpOworCisgIGlmIChlID09IFNob3J0Q3V0LT5lbmQoKSkKKyAgICAvLyBObyBmdXJ0aGVyIHJlZ2lvbiBhdCBleGl0IGF2YWlsYWJsZS4KKyAgICAoKlNob3J0Q3V0KVtlbnRyeV0gPSBleGl0OworICBlbHNlIHsKKyAgICAvLyBXZSBmb3VuZCBhIHJlZ2lvbiBlIHRoYXQgc3RhcnRzIGF0IGV4aXQuIFRoZXJlZm9yZSAoZW50cnksIGUtPnNlY29uZCkKKyAgICAvLyBpcyBhbHNvIGEgcmVnaW9uLCB0aGF0IGlzIGxhcmdlciB0aGFuIChlbnRyeSwgZXhpdCkuIEluc2VydCB0aGUKKyAgICAvLyBsYXJnZXIgb25lLgorICAgIEJsb2NrVCAqQkIgPSBlLT5zZWNvbmQ7CisgICAgKCpTaG9ydEN1dClbZW50cnldID0gQkI7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgVHI6OkRvbVRyZWVOb2RlVCAqCitSZWdpb25JbmZvQmFzZTxUcj46OmdldE5leHRQb3N0RG9tKERvbVRyZWVOb2RlVCAqTiwgQkJ0b0JCTWFwICpTaG9ydEN1dCkgY29uc3QgeworICB0eXBlbmFtZSBCQnRvQkJNYXA6Oml0ZXJhdG9yIGUgPSBTaG9ydEN1dC0+ZmluZChOLT5nZXRCbG9jaygpKTsKKworICBpZiAoZSA9PSBTaG9ydEN1dC0+ZW5kKCkpCisgICAgcmV0dXJuIE4tPmdldElEb20oKTsKKworICByZXR1cm4gUERULT5nZXROb2RlKGUtPnNlY29uZCktPmdldElEb20oKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgorYm9vbCBSZWdpb25JbmZvQmFzZTxUcj46OmlzVHJpdmlhbFJlZ2lvbihCbG9ja1QgKmVudHJ5LCBCbG9ja1QgKmV4aXQpIGNvbnN0IHsKKyAgYXNzZXJ0KGVudHJ5ICYmIGV4aXQgJiYgImVudHJ5IGFuZCBleGl0IG11c3Qgbm90IGJlIG51bGwhIik7CisKKyAgdW5zaWduZWQgbnVtX3N1Y2Nlc3NvcnMgPQorICAgICAgQmxvY2tUcmFpdHM6OmNoaWxkX2VuZChlbnRyeSkgLSBCbG9ja1RyYWl0czo6Y2hpbGRfYmVnaW4oZW50cnkpOworCisgIGlmIChudW1fc3VjY2Vzc29ycyA8PSAxICYmIGV4aXQgPT0gKihCbG9ja1RyYWl0czo6Y2hpbGRfYmVnaW4oZW50cnkpKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3R5cGVuYW1lIFRyOjpSZWdpb25UICpSZWdpb25JbmZvQmFzZTxUcj46OmNyZWF0ZVJlZ2lvbihCbG9ja1QgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrVCAqZXhpdCkgeworICBhc3NlcnQoZW50cnkgJiYgZXhpdCAmJiAiZW50cnkgYW5kIGV4aXQgbXVzdCBub3QgYmUgbnVsbCEiKTsKKworICBpZiAoaXNUcml2aWFsUmVnaW9uKGVudHJ5LCBleGl0KSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBSZWdpb25UICpyZWdpb24gPQorICAgICAgbmV3IFJlZ2lvblQoZW50cnksIGV4aXQsIHN0YXRpY19jYXN0PFJlZ2lvbkluZm9UICo+KHRoaXMpLCBEVCk7CisgIEJCdG9SZWdpb24uaW5zZXJ0KHtlbnRyeSwgcmVnaW9ufSk7CisKKyNpZmRlZiBFWFBFTlNJVkVfQ0hFQ0tTCisgIHJlZ2lvbi0+dmVyaWZ5UmVnaW9uKCk7CisjZWxzZQorICBERUJVRyhyZWdpb24tPnZlcmlmeVJlZ2lvbigpKTsKKyNlbmRpZgorCisgIHVwZGF0ZVN0YXRpc3RpY3MocmVnaW9uKTsKKyAgcmV0dXJuIHJlZ2lvbjsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordm9pZCBSZWdpb25JbmZvQmFzZTxUcj46OmZpbmRSZWdpb25zV2l0aEVudHJ5KEJsb2NrVCAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkJ0b0JCTWFwICpTaG9ydEN1dCkgeworICBhc3NlcnQoZW50cnkpOworCisgIERvbVRyZWVOb2RlVCAqTiA9IFBEVC0+Z2V0Tm9kZShlbnRyeSk7CisgIGlmICghTikKKyAgICByZXR1cm47CisKKyAgUmVnaW9uVCAqbGFzdFJlZ2lvbiA9IG51bGxwdHI7CisgIEJsb2NrVCAqbGFzdEV4aXQgPSBlbnRyeTsKKworICAvLyBBcyBvbmx5IGEgQmFzaWNCbG9jayB0aGF0IHBvc3Rkb21pbmF0ZXMgZW50cnkgY2FuIGZpbmlzaCBhIHJlZ2lvbiwgd2FsayB0aGUKKyAgLy8gcG9zdCBkb21pbmFuY2UgdHJlZSB1cHdhcmRzLgorICB3aGlsZSAoKE4gPSBnZXROZXh0UG9zdERvbShOLCBTaG9ydEN1dCkpKSB7CisgICAgQmxvY2tUICpleGl0ID0gTi0+Z2V0QmxvY2soKTsKKworICAgIGlmICghZXhpdCkKKyAgICAgIGJyZWFrOworCisgICAgaWYgKGlzUmVnaW9uKGVudHJ5LCBleGl0KSkgeworICAgICAgUmVnaW9uVCAqbmV3UmVnaW9uID0gY3JlYXRlUmVnaW9uKGVudHJ5LCBleGl0KTsKKworICAgICAgaWYgKGxhc3RSZWdpb24pCisgICAgICAgIG5ld1JlZ2lvbi0+YWRkU3ViUmVnaW9uKGxhc3RSZWdpb24pOworCisgICAgICBsYXN0UmVnaW9uID0gbmV3UmVnaW9uOworICAgICAgbGFzdEV4aXQgPSBleGl0OworICAgIH0KKworICAgIC8vIFRoaXMgY2FuIG5ldmVyIGJlIGEgcmVnaW9uLCBzbyBzdG9wIHRoZSBzZWFyY2guCisgICAgaWYgKCFEVC0+ZG9taW5hdGVzKGVudHJ5LCBleGl0KSkKKyAgICAgIGJyZWFrOworICB9CisKKyAgLy8gVHJpZWQgdG8gY3JlYXRlIHJlZ2lvbnMgZnJvbSBlbnRyeSB0byBsYXN0RXhpdC4gIE5leHQgdGltZSB0YWtlIGEKKyAgLy8gc2hvcnRjdXQgZnJvbSBlbnRyeSB0byBsYXN0RXhpdC4KKyAgaWYgKGxhc3RFeGl0ICE9IGVudHJ5KQorICAgIGluc2VydFNob3J0Q3V0KGVudHJ5LCBsYXN0RXhpdCwgU2hvcnRDdXQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkluZm9CYXNlPFRyPjo6c2NhbkZvclJlZ2lvbnMoRnVuY1QgJkYsIEJCdG9CQk1hcCAqU2hvcnRDdXQpIHsKKyAgdXNpbmcgRnVuY1B0clQgPSB0eXBlbmFtZSBzdGQ6OmFkZF9wb2ludGVyPEZ1bmNUPjo6dHlwZTsKKworICBCbG9ja1QgKmVudHJ5ID0gR3JhcGhUcmFpdHM8RnVuY1B0clQ+OjpnZXRFbnRyeU5vZGUoJkYpOworICBEb21UcmVlTm9kZVQgKk4gPSBEVC0+Z2V0Tm9kZShlbnRyeSk7CisKKyAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBkb21pbmFuY2UgdHJlZSBpbiBwb3N0IG9yZGVyIHRvIHN0YXJ0IHdpdGggdGhlIHNtYWxsCisgIC8vIHJlZ2lvbnMgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBkb21pbmFuY2UgdHJlZS4gIElmIHRoZSBzbWFsbCByZWdpb25zIGFyZQorICAvLyBkZXRlY3RlZCBmaXJzdCwgZGV0ZWN0aW9uIG9mIGJpZ2dlciByZWdpb25zIGlzIGZhc3RlciwgYXMgd2UgY2FuIGp1bXAKKyAgLy8gb3ZlciB0aGUgc21hbGwgcmVnaW9ucy4KKyAgZm9yIChhdXRvIERvbU5vZGUgOiBwb3N0X29yZGVyKE4pKQorICAgIGZpbmRSZWdpb25zV2l0aEVudHJ5KERvbU5vZGUtPmdldEJsb2NrKCksIFNob3J0Q3V0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgVHI6OlJlZ2lvblQgKlJlZ2lvbkluZm9CYXNlPFRyPjo6Z2V0VG9wTW9zdFBhcmVudChSZWdpb25UICpyZWdpb24pIHsKKyAgd2hpbGUgKHJlZ2lvbi0+Z2V0UGFyZW50KCkpCisgICAgcmVnaW9uID0gcmVnaW9uLT5nZXRQYXJlbnQoKTsKKworICByZXR1cm4gcmVnaW9uOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkluZm9CYXNlPFRyPjo6YnVpbGRSZWdpb25zVHJlZShEb21UcmVlTm9kZVQgKk4sIFJlZ2lvblQgKnJlZ2lvbikgeworICBCbG9ja1QgKkJCID0gTi0+Z2V0QmxvY2soKTsKKworICAvLyBQYXNzZWQgcmVnaW9uIGV4aXQKKyAgd2hpbGUgKEJCID09IHJlZ2lvbi0+Z2V0RXhpdCgpKQorICAgIHJlZ2lvbiA9IHJlZ2lvbi0+Z2V0UGFyZW50KCk7CisKKyAgdHlwZW5hbWUgQkJ0b1JlZ2lvbk1hcDo6aXRlcmF0b3IgaXQgPSBCQnRvUmVnaW9uLmZpbmQoQkIpOworCisgIC8vIFRoaXMgYmFzaWMgYmxvY2sgaXMgYSBzdGFydCBibG9jayBvZiBhIHJlZ2lvbi4gSXQgaXMgYWxyZWFkeSBpbiB0aGUKKyAgLy8gQkJ0b1JlZ2lvbiByZWxhdGlvbi4gT25seSB0aGUgY2hpbGQgYmFzaWMgYmxvY2tzIGhhdmUgdG8gYmUgdXBkYXRlZC4KKyAgaWYgKGl0ICE9IEJCdG9SZWdpb24uZW5kKCkpIHsKKyAgICBSZWdpb25UICpuZXdSZWdpb24gPSBpdC0+c2Vjb25kOworICAgIHJlZ2lvbi0+YWRkU3ViUmVnaW9uKGdldFRvcE1vc3RQYXJlbnQobmV3UmVnaW9uKSk7CisgICAgcmVnaW9uID0gbmV3UmVnaW9uOworICB9IGVsc2UgeworICAgIEJCdG9SZWdpb25bQkJdID0gcmVnaW9uOworICB9CisKKyAgZm9yIChEb21UcmVlTm9kZUJhc2U8QmxvY2tUPiAqQyA6ICpOKSB7CisgICAgYnVpbGRSZWdpb25zVHJlZShDLCByZWdpb24pOworICB9Cit9CisKKyNpZmRlZiBFWFBFTlNJVkVfQ0hFQ0tTCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Citib29sIFJlZ2lvbkluZm9CYXNlPFRyPjo6VmVyaWZ5UmVnaW9uSW5mbyA9IHRydWU7CisjZWxzZQordGVtcGxhdGUgPGNsYXNzIFRyPgorYm9vbCBSZWdpb25JbmZvQmFzZTxUcj46OlZlcmlmeVJlZ2lvbkluZm8gPSBmYWxzZTsKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit0eXBlbmFtZSBUcjo6UmVnaW9uVDo6UHJpbnRTdHlsZSBSZWdpb25JbmZvQmFzZTxUcj46OnByaW50U3R5bGUgPQorICAgIFJlZ2lvbkJhc2U8VHI+OjpQcmludE5vbmU7CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3ZvaWQgUmVnaW9uSW5mb0Jhc2U8VHI+OjpwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgT1MgPDwgIlJlZ2lvbiB0cmVlOlxuIjsKKyAgVG9wTGV2ZWxSZWdpb24tPnByaW50KE9TLCB0cnVlLCAwLCBwcmludFN0eWxlKTsKKyAgT1MgPDwgIkVuZCByZWdpb24gdHJlZVxuIjsKK30KKworI2lmICFkZWZpbmVkKE5ERUJVRykgfHwgZGVmaW5lZChMTFZNX0VOQUJMRV9EVU1QKQordGVtcGxhdGUgPGNsYXNzIFRyPgordm9pZCBSZWdpb25JbmZvQmFzZTxUcj46OmR1bXAoKSBjb25zdCB7IHByaW50KGRiZ3MoKSk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkluZm9CYXNlPFRyPjo6cmVsZWFzZU1lbW9yeSgpIHsKKyAgQkJ0b1JlZ2lvbi5jbGVhcigpOworICBpZiAoVG9wTGV2ZWxSZWdpb24pCisgICAgZGVsZXRlIFRvcExldmVsUmVnaW9uOworICBUb3BMZXZlbFJlZ2lvbiA9IG51bGxwdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3ZvaWQgUmVnaW9uSW5mb0Jhc2U8VHI+Ojp2ZXJpZnlBbmFseXNpcygpIGNvbnN0IHsKKyAgLy8gRG8gb25seSB2ZXJpZnkgcmVnaW9ucyBpZiBleHBsaWNpdGVseSBhY3RpdmF0ZWQgdXNpbmcgRVhQRU5TSVZFX0NIRUNLUyBvcgorICAvLyAtdmVyaWZ5LXJlZ2lvbi1pbmZvCisgIGlmICghUmVnaW9uSW5mb0Jhc2U8VHI+OjpWZXJpZnlSZWdpb25JbmZvKQorICAgIHJldHVybjsKKworICBUb3BMZXZlbFJlZ2lvbi0+dmVyaWZ5UmVnaW9uTmVzdCgpOworCisgIHZlcmlmeUJCTWFwKFRvcExldmVsUmVnaW9uKTsKK30KKworLy8gUmVnaW9uIHBhc3MgbWFuYWdlciBzdXBwb3J0LgordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgVHI6OlJlZ2lvblQgKlJlZ2lvbkluZm9CYXNlPFRyPjo6Z2V0UmVnaW9uRm9yKEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgdHlwZW5hbWUgQkJ0b1JlZ2lvbk1hcDo6Y29uc3RfaXRlcmF0b3IgSSA9IEJCdG9SZWdpb24uZmluZChCQik7CisgIHJldHVybiBJICE9IEJCdG9SZWdpb24uZW5kKCkgPyBJLT5zZWNvbmQgOiBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkluZm9CYXNlPFRyPjo6c2V0UmVnaW9uRm9yKEJsb2NrVCAqQkIsIFJlZ2lvblQgKlIpIHsKKyAgQkJ0b1JlZ2lvbltCQl0gPSBSOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit0eXBlbmFtZSBUcjo6UmVnaW9uVCAqUmVnaW9uSW5mb0Jhc2U8VHI+OjpvcGVyYXRvcltdKEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFJlZ2lvbkZvcihCQik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3R5cGVuYW1lIFJlZ2lvbkluZm9CYXNlPFRyPjo6QmxvY2tUICoKK1JlZ2lvbkluZm9CYXNlPFRyPjo6Z2V0TWF4UmVnaW9uRXhpdChCbG9ja1QgKkJCKSBjb25zdCB7CisgIEJsb2NrVCAqRXhpdCA9IG51bGxwdHI7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICAvLyBHZXQgbGFyZ2VzdCByZWdpb24gdGhhdCBzdGFydHMgYXQgQkIuCisgICAgUmVnaW9uVCAqUiA9IGdldFJlZ2lvbkZvcihCQik7CisgICAgd2hpbGUgKFIgJiYgUi0+Z2V0UGFyZW50KCkgJiYgUi0+Z2V0UGFyZW50KCktPmdldEVudHJ5KCkgPT0gQkIpCisgICAgICBSID0gUi0+Z2V0UGFyZW50KCk7CisKKyAgICAvLyBHZXQgdGhlIHNpbmdsZSBleGl0IG9mIEJCLgorICAgIGlmIChSICYmIFItPmdldEVudHJ5KCkgPT0gQkIpCisgICAgICBFeGl0ID0gUi0+Z2V0RXhpdCgpOworICAgIGVsc2UgaWYgKCsrQmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKEJCKSA9PSBCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKEJCKSkKKyAgICAgIEV4aXQgPSAqQmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKEJCKTsKKyAgICBlbHNlIC8vIE5vIHNpbmdsZSBleGl0IGV4aXN0cy4KKyAgICAgIHJldHVybiBFeGl0OworCisgICAgLy8gR2V0IGxhcmdlc3QgcmVnaW9uIHRoYXQgc3RhcnRzIGF0IEV4aXQuCisgICAgUmVnaW9uVCAqRXhpdFIgPSBnZXRSZWdpb25Gb3IoRXhpdCk7CisgICAgd2hpbGUgKEV4aXRSICYmIEV4aXRSLT5nZXRQYXJlbnQoKSAmJgorICAgICAgICAgICBFeGl0Ui0+Z2V0UGFyZW50KCktPmdldEVudHJ5KCkgPT0gRXhpdCkKKyAgICAgIEV4aXRSID0gRXhpdFItPmdldFBhcmVudCgpOworCisgICAgZm9yIChCbG9ja1QgKlByZWQgOiBtYWtlX3JhbmdlKEludkJsb2NrVHJhaXRzOjpjaGlsZF9iZWdpbihFeGl0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52QmxvY2tUcmFpdHM6OmNoaWxkX2VuZChFeGl0KSkpIHsKKyAgICAgIGlmICghUi0+Y29udGFpbnMoUHJlZCkgJiYgIUV4aXRSLT5jb250YWlucyhQcmVkKSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gVGhpcyBzdG9wcyBpbmZpbml0ZSBjeWNsZXMuCisgICAgaWYgKERULT5kb21pbmF0ZXMoRXhpdCwgQkIpKQorICAgICAgYnJlYWs7CisKKyAgICBCQiA9IEV4aXQ7CisgIH0KKworICByZXR1cm4gRXhpdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgVHI6OlJlZ2lvblQgKlJlZ2lvbkluZm9CYXNlPFRyPjo6Z2V0Q29tbW9uUmVnaW9uKFJlZ2lvblQgKkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaW9uVCAqQikgY29uc3QgeworICBhc3NlcnQoQSAmJiBCICYmICJPbmUgb2YgdGhlIFJlZ2lvbnMgaXMgTlVMTCIpOworCisgIGlmIChBLT5jb250YWlucyhCKSkKKyAgICByZXR1cm4gQTsKKworICB3aGlsZSAoIUItPmNvbnRhaW5zKEEpKQorICAgIEIgPSBCLT5nZXRQYXJlbnQoKTsKKworICByZXR1cm4gQjsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgVHI6OlJlZ2lvblQgKgorUmVnaW9uSW5mb0Jhc2U8VHI+OjpnZXRDb21tb25SZWdpb24oU21hbGxWZWN0b3JJbXBsPFJlZ2lvblQgKj4gJlJlZ2lvbnMpIGNvbnN0IHsKKyAgUmVnaW9uVCAqcmV0ID0gUmVnaW9ucy5iYWNrKCk7CisgIFJlZ2lvbnMucG9wX2JhY2soKTsKKworICBmb3IgKFJlZ2lvblQgKlIgOiBSZWdpb25zKQorICAgIHJldCA9IGdldENvbW1vblJlZ2lvbihyZXQsIFIpOworCisgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3R5cGVuYW1lIFRyOjpSZWdpb25UICoKK1JlZ2lvbkluZm9CYXNlPFRyPjo6Z2V0Q29tbW9uUmVnaW9uKFNtYWxsVmVjdG9ySW1wbDxCbG9ja1QgKj4gJkJCcykgY29uc3QgeworICBSZWdpb25UICpyZXQgPSBnZXRSZWdpb25Gb3IoQkJzLmJhY2soKSk7CisgIEJCcy5wb3BfYmFjaygpOworCisgIGZvciAoQmxvY2tUICpCQiA6IEJCcykKKyAgICByZXQgPSBnZXRDb21tb25SZWdpb24ocmV0LCBnZXRSZWdpb25Gb3IoQkIpKTsKKworICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkluZm9CYXNlPFRyPjo6Y2FsY3VsYXRlKEZ1bmNUICZGKSB7CisgIHVzaW5nIEZ1bmNQdHJUID0gdHlwZW5hbWUgc3RkOjphZGRfcG9pbnRlcjxGdW5jVD46OnR5cGU7CisKKyAgLy8gU2hvcnRDdXQgYSBmdW5jdGlvbiB3aGVyZSBmb3IgZXZlcnkgQkIgdGhlIGV4aXQgb2YgdGhlIGxhcmdlc3QgcmVnaW9uCisgIC8vIHN0YXJ0aW5nIHdpdGggQkIgaXMgc3RvcmVkLiBUaGVzZSByZWdpb25zIGNhbiBiZSB0aHJlYXRlZCBhcyBzaW5nbGUgQkJTLgorICAvLyBUaGlzIGltcHJvdmVzIHBlcmZvcm1hbmNlIG9uIGxpbmVhciBDRkdzLgorICBCQnRvQkJNYXAgU2hvcnRDdXQ7CisKKyAgc2NhbkZvclJlZ2lvbnMoRiwgJlNob3J0Q3V0KTsKKyAgQmxvY2tUICpCQiA9IEdyYXBoVHJhaXRzPEZ1bmNQdHJUPjo6Z2V0RW50cnlOb2RlKCZGKTsKKyAgYnVpbGRSZWdpb25zVHJlZShEVC0+Z2V0Tm9kZShCQiksIFRvcExldmVsUmVnaW9uKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI3VuZGVmIERFQlVHX1RZUEUKKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfUkVHSU9OSU5GT0lNUExfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9SZWdpb25JdGVyYXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9SZWdpb25JdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmODIzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1JlZ2lvbkl0ZXJhdG9yLmgKQEAgLTAsMCArMSwzNjAgQEAKKy8vPT09LSBSZWdpb25JdGVyYXRvci5oIC0gSXRlcmF0b3JzIHRvIGl0ZXJhdGF0ZSBvdmVyIFJlZ2lvbnMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaXRlcmF0b3JzIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYSBSZWdpb24uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfUkVHSU9OSVRFUkFUT1JfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1JFR0lPTklURVJBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1JlZ2lvbkluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NGRy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmFzaWNCbG9jazsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBAYnJpZWYgSGllcmFyY2hpY2FsIFJlZ2lvbk5vZGUgc3VjY2Vzc29yIGl0ZXJhdG9yLgorLy8vCisvLy8gVGhpcyBpdGVyYXRvciBpdGVyYXRlcyBvdmVyIGFsbCBzdWNjZXNzb3JzIG9mIGEgUmVnaW9uTm9kZS4KKy8vLworLy8vIEZvciBhIEJhc2ljQmxvY2sgUmVnaW9uTm9kZSBpdCBza2lwcyBhbGwgQmFzaWNCbG9ja3MgdGhhdCBhcmUgbm90IHBhcnQgb2YKKy8vLyB0aGUgcGFyZW50IFJlZ2lvbi4gIEZ1cnRoZXJtb3JlIGZvciBCYXNpY0Jsb2NrcyB0aGF0IHN0YXJ0IGEgc3VicmVnaW9uLCBhCisvLy8gUmVnaW9uTm9kZSByZXByZXNlbnRpbmcgdGhlIHN1YnJlZ2lvbiBpcyByZXR1cm5lZC4KKy8vLworLy8vIEZvciBhIHN1YnJlZ2lvbiBSZWdpb25Ob2RlIHRoZXJlIGlzIGp1c3Qgb25lIHN1Y2Nlc3Nvci4gVGhlIFJlZ2lvbk5vZGUKKy8vLyByZXByZXNlbnRpbmcgdGhlIGV4aXQgb2YgdGhlIHN1YnJlZ2lvbi4KK3RlbXBsYXRlIDxjbGFzcyBOb2RlUmVmLCBjbGFzcyBCbG9ja1QsIGNsYXNzIFJlZ2lvblQ+CitjbGFzcyBSTlN1Y2NJdGVyYXRvcgorICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgTm9kZVJlZj4geworICB1c2luZyBzdXBlciA9IHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgTm9kZVJlZj47CisgIHVzaW5nIEJsb2NrVHJhaXRzID0gR3JhcGhUcmFpdHM8QmxvY2tUICo+OworICB1c2luZyBTdWNjSXRlclR5ID0gdHlwZW5hbWUgQmxvY2tUcmFpdHM6OkNoaWxkSXRlcmF0b3JUeXBlOworCisgIC8vIFRoZSBpdGVyYXRvciB3b3JrcyBpbiB0d28gbW9kZXMsIGJiIG1vZGUgb3IgcmVnaW9uIG1vZGUuCisgIGVudW0gSXRNb2RlIHsKKyAgICAvLyBJbiBCQiBtb2RlIGl0IHJldHVybnMgYWxsIHN1Y2Nlc3NvcnMgb2YgdGhpcyBCYXNpY0Jsb2NrIGFzIGl0cworICAgIC8vIHN1Y2Nlc3NvcnMuCisgICAgSXRCQiwKKyAgICAvLyBJbiByZWdpb24gbW9kZSB0aGVyZSBpcyBvbmx5IG9uZSBzdWNjZXNzb3IsIHRoYXRzIHRoZSByZWdpb25ub2RlIG1hcHBpbmcKKyAgICAvLyB0byB0aGUgZXhpdCBibG9jayBvZiB0aGUgcmVnaW9ubm9kZQorICAgIEl0UmdCZWdpbiwgLy8gQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVnaW9ubm9kZSBzdWNjZXNzb3IuCisgICAgSXRSZ0VuZCAgICAvLyBBdCB0aGUgZW5kIG9mIHRoZSByZWdpb25ub2RlIHN1Y2Nlc3Nvci4KKyAgfTsKKworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfcG9pbnRlcjxOb2RlUmVmPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIkZJWE1FOiBDdXJyZW50bHkgUk5TdWNjSXRlcmF0b3Igb25seSBzdXBwb3J0cyBOb2RlUmVmIGFzICIKKyAgICAgICAgICAgICAgICAicG9pbnRlcnMgZHVlIHRvIHRoZSB1c2Ugb2YgcG9pbnRlci1zcGVjaWZpYyBkYXRhIHN0cnVjdHVyZXMgIgorICAgICAgICAgICAgICAgICIoZS5nLiBQb2ludGVySW50UGFpciBhbmQgU21hbGxQdHJTZXQpIGludGVybmFsbHkuIEdlbmVyYWxpemUgIgorICAgICAgICAgICAgICAgICJpdCB0byBzdXBwb3J0IG5vbi1wb2ludGVyIHR5cGVzIik7CisKKyAgLy8gVXNlIHR3byBiaXQgdG8gcmVwcmVzZW50IHRoZSBtb2RlIGl0ZXJhdG9yLgorICBQb2ludGVySW50UGFpcjxOb2RlUmVmLCAyLCBJdE1vZGU+IE5vZGU7CisKKyAgLy8gVGhlIGJsb2NrIHN1Y2Nlc3NvciBpdGVyYXRvci4KKyAgU3VjY0l0ZXJUeSBCSXRvcjsKKworICAvLyBhZHZhbmNlUmVnaW9uU3VjYyAtIEEgcmVnaW9uIG5vZGUgaGFzIG9ubHkgb25lIHN1Y2Nlc3Nvci4gSXQgcmVhY2hlcyBlbmQKKyAgLy8gb25jZSB3ZSBhZHZhbmNlIGl0LgorICB2b2lkIGFkdmFuY2VSZWdpb25TdWNjKCkgeworICAgIGFzc2VydChOb2RlLmdldEludCgpID09IEl0UmdCZWdpbiAmJiAiQ2Fubm90IGFkdmFuY2UgcmVnaW9uIHN1Y2Nlc3NvciEiKTsKKyAgICBOb2RlLnNldEludChJdFJnRW5kKTsKKyAgfQorCisgIE5vZGVSZWYgZ2V0Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIE5vZGUuZ2V0UG9pbnRlcigpOyB9CisKKyAgLy8gaXNSZWdpb25Nb2RlIC0gSXMgdGhlIGN1cnJlbnQgaXRlcmF0b3IgaW4gcmVnaW9uIG1vZGU/CisgIGJvb2wgaXNSZWdpb25Nb2RlKCkgY29uc3QgeyByZXR1cm4gTm9kZS5nZXRJbnQoKSAhPSBJdEJCOyB9CisKKyAgLy8gR2V0IHRoZSBpbW1lZGlhdGUgc3VjY2Vzc29yLiBUaGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gYSBCYXNpYyBCbG9jaworICAvLyBSZWdpb25Ob2RlIG9yIGEgc3VicmVnaW9uIFJlZ2lvbk5vZGUuCisgIE5vZGVSZWYgZ2V0SVN1Y2MoQmxvY2tUICpCQikgY29uc3QgeworICAgIE5vZGVSZWYgc3VjYzsKKyAgICBzdWNjID0gZ2V0Tm9kZSgpLT5nZXRQYXJlbnQoKS0+Z2V0Tm9kZShCQik7CisgICAgYXNzZXJ0KHN1Y2MgJiYgIkJCIG5vdCBpbiBSZWdpb24gb3IgZW50ZXJlZCBzdWJyZWdpb24hIik7CisgICAgcmV0dXJuIHN1Y2M7CisgIH0KKworICAvLyBnZXRSZWdpb25TdWNjIC0gUmV0dXJuIHRoZSBzdWNjZXNzb3IgYmFzaWMgYmxvY2sgb2YgYSBTdWJSZWdpb24gUmVnaW9uTm9kZS4KKyAgaW5saW5lIEJsb2NrVCogZ2V0UmVnaW9uU3VjYygpIGNvbnN0IHsKKyAgICBhc3NlcnQoTm9kZS5nZXRJbnQoKSA9PSBJdFJnQmVnaW4gJiYgIkNhbm5vdCBnZXQgdGhlIHJlZ2lvbiBzdWNjZXNzb3IhIik7CisgICAgcmV0dXJuIGdldE5vZGUoKS0+dGVtcGxhdGUgZ2V0Tm9kZUFzPFJlZ2lvblQ+KCktPmdldEV4aXQoKTsKKyAgfQorCisgIC8vIGlzRXhpdCAtIElzIHRoaXMgdGhlIGV4aXQgQkIgb2YgdGhlIFJlZ2lvbj8KKyAgaW5saW5lIGJvb2wgaXNFeGl0KEJsb2NrVCogQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Tm9kZSgpLT5nZXRQYXJlbnQoKS0+Z2V0RXhpdCgpID09IEJCOworICB9CisKK3B1YmxpYzoKKyAgdXNpbmcgU2VsZiA9IFJOU3VjY0l0ZXJhdG9yPE5vZGVSZWYsIEJsb2NrVCwgUmVnaW9uVD47CisgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBzdXBlcjo6dmFsdWVfdHlwZTsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBiZWdpbiBpdGVyYXRvciBvZiBhIFJlZ2lvbk5vZGUuCisgIGlubGluZSBSTlN1Y2NJdGVyYXRvcihOb2RlUmVmIG5vZGUpCisgICAgICA6IE5vZGUobm9kZSwgbm9kZS0+aXNTdWJSZWdpb24oKSA/IEl0UmdCZWdpbiA6IEl0QkIpLAorICAgICAgICBCSXRvcihCbG9ja1RyYWl0czo6Y2hpbGRfYmVnaW4obm9kZS0+Z2V0RW50cnkoKSkpIHsKKyAgICAvLyBTa2lwIHRoZSBleGl0IGJsb2NrCisgICAgaWYgKCFpc1JlZ2lvbk1vZGUoKSkKKyAgICAgIHdoaWxlIChCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKG5vZGUtPmdldEVudHJ5KCkpICE9IEJJdG9yICYmIGlzRXhpdCgqQkl0b3IpKQorICAgICAgICArK0JJdG9yOworCisgICAgaWYgKGlzUmVnaW9uTW9kZSgpICYmIGlzRXhpdChnZXRSZWdpb25TdWNjKCkpKQorICAgICAgYWR2YW5jZVJlZ2lvblN1Y2MoKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGFuIGVuZCBpdGVyYXRvci4KKyAgaW5saW5lIFJOU3VjY0l0ZXJhdG9yKE5vZGVSZWYgbm9kZSwgYm9vbCkKKyAgICAgIDogTm9kZShub2RlLCBub2RlLT5pc1N1YlJlZ2lvbigpID8gSXRSZ0VuZCA6IEl0QkIpLAorICAgICAgICBCSXRvcihCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKG5vZGUtPmdldEVudHJ5KCkpKSB7fQorCisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU2VsZiYgeCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZ2lvbk1vZGUoKSA9PSB4LmlzUmVnaW9uTW9kZSgpICYmICJCcm9rZW4gaXRlcmF0b3IhIik7CisgICAgaWYgKGlzUmVnaW9uTW9kZSgpKQorICAgICAgcmV0dXJuIE5vZGUuZ2V0SW50KCkgPT0geC5Ob2RlLmdldEludCgpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBCSXRvciA9PSB4LkJJdG9yOworICB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTZWxmJiB4KSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3I9PSh4KTsgfQorCisgIGlubGluZSB2YWx1ZV90eXBlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICBCbG9ja1QgKkJCID0gaXNSZWdpb25Nb2RlKCkgPyBnZXRSZWdpb25TdWNjKCkgOiAqQkl0b3I7CisgICAgYXNzZXJ0KCFpc0V4aXQoQkIpICYmICJJdGVyYXRvciBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGdldElTdWNjKEJCKTsKKyAgfQorCisgIGlubGluZSBTZWxmJiBvcGVyYXRvcisrKCkgeworICAgIGlmKGlzUmVnaW9uTW9kZSgpKSB7CisgICAgICAvLyBUaGUgUmVnaW9uIG9ubHkgaGFzIDEgc3VjY2Vzc29yLgorICAgICAgYWR2YW5jZVJlZ2lvblN1Y2MoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU2tpcCB0aGUgZXhpdC4KKyAgICAgIGRvCisgICAgICAgICsrQkl0b3I7CisgICAgICB3aGlsZSAoQkl0b3IgIT0gQmxvY2tUcmFpdHM6OmNoaWxkX2VuZChnZXROb2RlKCktPmdldEVudHJ5KCkpCisgICAgICAgICAgJiYgaXNFeGl0KCpCSXRvcikpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgU2VsZiBvcGVyYXRvcisrKGludCkgeworICAgIFNlbGYgdG1wID0gKnRoaXM7CisgICAgKysqdGhpczsKKyAgICByZXR1cm4gdG1wOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEBicmllZiBGbGF0IFJlZ2lvbk5vZGUgaXRlcmF0b3IuCisvLy8KKy8vLyBUaGUgRmxhdCBSZWdpb24gaXRlcmF0b3Igd2lsbCBpdGVyYXRlIG92ZXIgYWxsIEJhc2ljQmxvY2sgUmVnaW9uTm9kZXMgdGhhdAorLy8vIGFyZSBjb250YWluZWQgaW4gdGhlIFJlZ2lvbiBhbmQgaXRzIHN1YnJlZ2lvbnMuIFRoaXMgaXMgY2xvc2UgdG8gYSB2aXJ0dWFsCisvLy8gY29udHJvbCBmbG93IGdyYXBoIG9mIHRoZSBSZWdpb24uCit0ZW1wbGF0ZSA8Y2xhc3MgTm9kZVJlZiwgY2xhc3MgQmxvY2tULCBjbGFzcyBSZWdpb25UPgorY2xhc3MgUk5TdWNjSXRlcmF0b3I8RmxhdEl0PE5vZGVSZWY+LCBCbG9ja1QsIFJlZ2lvblQ+CisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBOb2RlUmVmPiB7CisgIHVzaW5nIHN1cGVyID0gc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBOb2RlUmVmPjsKKyAgdXNpbmcgQmxvY2tUcmFpdHMgPSBHcmFwaFRyYWl0czxCbG9ja1QgKj47CisgIHVzaW5nIFN1Y2NJdGVyVHkgPSB0eXBlbmFtZSBCbG9ja1RyYWl0czo6Q2hpbGRJdGVyYXRvclR5cGU7CisKKyAgTm9kZVJlZiBOb2RlOworICBTdWNjSXRlclR5IEl0b3I7CisKK3B1YmxpYzoKKyAgdXNpbmcgU2VsZiA9IFJOU3VjY0l0ZXJhdG9yPEZsYXRJdDxOb2RlUmVmPiwgQmxvY2tULCBSZWdpb25UPjsKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIHN1cGVyOjp2YWx1ZV90eXBlOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIHRoZSBpdGVyYXRvciBmcm9tIGEgUmVnaW9uTm9kZS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhlIGluY29taW5nIG5vZGUgbXVzdCBiZSBhIGJiIG5vZGUsIG90aGVyd2lzZSBpdCB3aWxsIHRyaWdnZXIKKyAgLy8vIGFuIGFzc2VydGlvbiB3aGVuIHdlIHRyeSB0byBnZXQgYSBCYXNpY0Jsb2NrLgorICBpbmxpbmUgUk5TdWNjSXRlcmF0b3IoTm9kZVJlZiBub2RlKQorICAgICAgOiBOb2RlKG5vZGUpLCBJdG9yKEJsb2NrVHJhaXRzOjpjaGlsZF9iZWdpbihub2RlLT5nZXRFbnRyeSgpKSkgeworICAgIGFzc2VydCghTm9kZS0+aXNTdWJSZWdpb24oKSAmJgorICAgICAgICAgICAiU3VicmVnaW9uIG5vZGUgbm90IGFsbG93ZWQgaW4gZmxhdCBpdGVyYXRpbmcgbW9kZSEiKTsKKyAgICBhc3NlcnQoTm9kZS0+Z2V0UGFyZW50KCkgJiYgIkEgQkIgbm9kZSBtdXN0IGhhdmUgYSBwYXJlbnQhIik7CisKKyAgICAvLyBTa2lwIHRoZSBleGl0IGJsb2NrIG9mIHRoZSBpdGVyYXRpbmcgcmVnaW9uLgorICAgIHdoaWxlIChCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKE5vZGUtPmdldEVudHJ5KCkpICE9IEl0b3IgJiYKKyAgICAgICAgICAgTm9kZS0+Z2V0UGFyZW50KCktPmdldEV4aXQoKSA9PSAqSXRvcikKKyAgICAgICsrSXRvcjsKKyAgfQorCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGFuIGVuZCBpdGVyYXRvcgorICBpbmxpbmUgUk5TdWNjSXRlcmF0b3IoTm9kZVJlZiBub2RlLCBib29sKQorICAgICAgOiBOb2RlKG5vZGUpLCBJdG9yKEJsb2NrVHJhaXRzOjpjaGlsZF9lbmQobm9kZS0+Z2V0RW50cnkoKSkpIHsKKyAgICBhc3NlcnQoIU5vZGUtPmlzU3ViUmVnaW9uKCkgJiYKKyAgICAgICAgICAgIlN1YnJlZ2lvbiBub2RlIG5vdCBhbGxvd2VkIGluIGZsYXQgaXRlcmF0aW5nIG1vZGUhIik7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNlbGYmIHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoTm9kZS0+Z2V0UGFyZW50KCkgPT0geC5Ob2RlLT5nZXRQYXJlbnQoKQorICAgICAgICAgICAmJiAiQ2Fubm90IGNvbXBhcmUgaXRlcmF0b3JzIG9mIGRpZmZlcmVudCByZWdpb25zISIpOworCisgICAgcmV0dXJuIEl0b3IgPT0geC5JdG9yICYmIE5vZGUgPT0geC5Ob2RlOworICB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTZWxmJiB4KSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3I9PSh4KTsgfQorCisgIGlubGluZSB2YWx1ZV90eXBlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICBCbG9ja1QgKkJCID0gKkl0b3I7CisKKyAgICAvLyBHZXQgdGhlIGl0ZXJhdGluZyByZWdpb24uCisgICAgUmVnaW9uVCAqUGFyZW50ID0gTm9kZS0+Z2V0UGFyZW50KCk7CisKKyAgICAvLyBUaGUgb25seSBjYXNlIHRoYXQgdGhlIHN1Y2Nlc3NvciByZWFjaGVzIG91dCBvZiB0aGUgcmVnaW9uIGlzIGl0IHJlYWNoZXMKKyAgICAvLyB0aGUgZXhpdCBvZiB0aGUgcmVnaW9uLgorICAgIGFzc2VydChQYXJlbnQtPmdldEV4aXQoKSAhPSBCQiAmJiAiaXRlcmF0b3Igb3V0IG9mIHJhbmdlISIpOworCisgICAgcmV0dXJuIFBhcmVudC0+Z2V0QkJOb2RlKEJCKTsKKyAgfQorCisgIGlubGluZSBTZWxmJiBvcGVyYXRvcisrKCkgeworICAgIC8vIFNraXAgdGhlIGV4aXQgYmxvY2sgb2YgdGhlIGl0ZXJhdGluZyByZWdpb24uCisgICAgZG8KKyAgICAgICsrSXRvcjsKKyAgICB3aGlsZSAoSXRvciAhPSBzdWNjX2VuZChOb2RlLT5nZXRFbnRyeSgpKQorICAgICAgICAmJiBOb2RlLT5nZXRQYXJlbnQoKS0+Z2V0RXhpdCgpID09ICpJdG9yKTsKKworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBTZWxmIG9wZXJhdG9yKysoaW50KSB7CisgICAgU2VsZiB0bXAgPSAqdGhpczsKKyAgICArKyp0aGlzOworICAgIHJldHVybiB0bXA7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBOb2RlUmVmLCBjbGFzcyBCbG9ja1QsIGNsYXNzIFJlZ2lvblQ+CitpbmxpbmUgUk5TdWNjSXRlcmF0b3I8Tm9kZVJlZiwgQmxvY2tULCBSZWdpb25UPiBzdWNjX2JlZ2luKE5vZGVSZWYgTm9kZSkgeworICByZXR1cm4gUk5TdWNjSXRlcmF0b3I8Tm9kZVJlZiwgQmxvY2tULCBSZWdpb25UPihOb2RlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIE5vZGVSZWYsIGNsYXNzIEJsb2NrVCwgY2xhc3MgUmVnaW9uVD4KK2lubGluZSBSTlN1Y2NJdGVyYXRvcjxOb2RlUmVmLCBCbG9ja1QsIFJlZ2lvblQ+IHN1Y2NfZW5kKE5vZGVSZWYgTm9kZSkgeworICByZXR1cm4gUk5TdWNjSXRlcmF0b3I8Tm9kZVJlZiwgQmxvY2tULCBSZWdpb25UPihOb2RlLCB0cnVlKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBSZWdpb25Ob2RlIEdyYXBoVHJhaXRzIHNwZWNpYWxpemF0aW9uIHNvIHRoZSBiYnMgaW4gdGhlIHJlZ2lvbiBjYW4gYmUKKy8vIGl0ZXJhdGUgYnkgZ2VuZXJpYyBncmFwaCBpdGVyYXRvcnMuCisvLworLy8gTm9kZVQgY2FuIGVpdGhlciBiZSByZWdpb24gbm9kZSBvciBjb25zdCByZWdpb24gbm9kZSwgb3RoZXJ3aXNlIGNoaWxkX2JlZ2luCisvLyBhbmQgY2hpbGRfZW5kIGZhaWwuCisKKyNkZWZpbmUgUmVnaW9uTm9kZUdyYXBoVHJhaXRzKE5vZGVULCBCbG9ja1QsIFJlZ2lvblQpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxOb2RlVCAqPiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVzaW5nIE5vZGVSZWYgPSBOb2RlVCAqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9IFJOU3VjY0l0ZXJhdG9yPE5vZGVSZWYsIEJsb2NrVCwgUmVnaW9uVD47ICAgICAgICBcCisgICAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKE5vZGVSZWYgTikgeyByZXR1cm4gTjsgfSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBSTlN1Y2NJdGVyYXRvcjxOb2RlUmVmLCBCbG9ja1QsIFJlZ2lvblQ+KE4pOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBSTlN1Y2NJdGVyYXRvcjxOb2RlUmVmLCBCbG9ja1QsIFJlZ2lvblQ+KE4sIHRydWUpOyAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEZsYXRJdDxOb2RlVCAqPj4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdXNpbmcgTm9kZVJlZiA9IE5vZGVUICo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUk5TdWNjSXRlcmF0b3I8RmxhdEl0PE5vZGVSZWY+LCBCbG9ja1QsIFJlZ2lvblQ+OyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKE5vZGVSZWYgTikgeyByZXR1cm4gTjsgfSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBSTlN1Y2NJdGVyYXRvcjxGbGF0SXQ8Tm9kZVJlZj4sIEJsb2NrVCwgUmVnaW9uVD4oTik7ICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbmxpbmUgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBSTlN1Y2NJdGVyYXRvcjxGbGF0SXQ8Tm9kZVJlZj4sIEJsb2NrVCwgUmVnaW9uVD4oTiwgdHJ1ZSk7ICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgUmVnaW9uR3JhcGhUcmFpdHMoUmVnaW9uVCwgTm9kZVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxSZWdpb25UICo+IDogcHVibGljIEdyYXBoVHJhaXRzPE5vZGVUICo+IHsgICAgXAorICAgIHVzaW5nIG5vZGVzX2l0ZXJhdG9yID0gZGZfaXRlcmF0b3I8Tm9kZVJlZj47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoUmVnaW9uVCAqUikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gUi0+Z2V0Tm9kZShSLT5nZXRFbnRyeSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oUmVnaW9uVCAqUikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3I6OmJlZ2luKGdldEVudHJ5Tm9kZShSKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKFJlZ2lvblQgKlIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3I6OmVuZChnZXRFbnRyeU5vZGUoUikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgR3JhcGhUcmFpdHM8RmxhdEl0PFJlZ2lvblQgKj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogcHVibGljIEdyYXBoVHJhaXRzPEZsYXRJdDxOb2RlVCAqPj4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdXNpbmcgbm9kZXNfaXRlcmF0b3IgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZl9pdGVyYXRvcjxOb2RlUmVmLCBkZl9pdGVyYXRvcl9kZWZhdWx0X3NldDxOb2RlUmVmPiwgZmFsc2UsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgR3JhcGhUcmFpdHM8RmxhdEl0PE5vZGVSZWY+Pj47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKFJlZ2lvblQgKlIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIFItPmdldEJCTm9kZShSLT5nZXRFbnRyeSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKFJlZ2lvblQgKlIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yOjpiZWdpbihnZXRFbnRyeU5vZGUoUikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2VuZChSZWdpb25UICpSKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yOjplbmQoZ2V0RW50cnlOb2RlKFIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworUmVnaW9uTm9kZUdyYXBoVHJhaXRzKFJlZ2lvbk5vZGUsIEJhc2ljQmxvY2ssIFJlZ2lvbik7CitSZWdpb25Ob2RlR3JhcGhUcmFpdHMoY29uc3QgUmVnaW9uTm9kZSwgQmFzaWNCbG9jaywgUmVnaW9uKTsKKworUmVnaW9uR3JhcGhUcmFpdHMoUmVnaW9uLCBSZWdpb25Ob2RlKTsKK1JlZ2lvbkdyYXBoVHJhaXRzKGNvbnN0IFJlZ2lvbiwgY29uc3QgUmVnaW9uTm9kZSk7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxSZWdpb25JbmZvKj4KKyAgOiBwdWJsaWMgR3JhcGhUcmFpdHM8RmxhdEl0PFJlZ2lvbk5vZGUqPj4geworICB1c2luZyBub2Rlc19pdGVyYXRvciA9CisgICAgICBkZl9pdGVyYXRvcjxOb2RlUmVmLCBkZl9pdGVyYXRvcl9kZWZhdWx0X3NldDxOb2RlUmVmPiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICBHcmFwaFRyYWl0czxGbGF0SXQ8Tm9kZVJlZj4+PjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoUmVnaW9uSW5mbyAqUkkpIHsKKyAgICByZXR1cm4gR3JhcGhUcmFpdHM8RmxhdEl0PFJlZ2lvbio+Pjo6Z2V0RW50cnlOb2RlKFJJLT5nZXRUb3BMZXZlbFJlZ2lvbigpKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihSZWdpb25JbmZvKiBSSSkgeworICAgIHJldHVybiBub2Rlc19pdGVyYXRvcjo6YmVnaW4oZ2V0RW50cnlOb2RlKFJJKSk7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKFJlZ2lvbkluZm8gKlJJKSB7CisgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yOjplbmQoZ2V0RW50cnlOb2RlKFJJKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxSZWdpb25JbmZvUGFzcyo+CisgIDogcHVibGljIEdyYXBoVHJhaXRzPFJlZ2lvbkluZm8gKj4geworICB1c2luZyBub2Rlc19pdGVyYXRvciA9CisgICAgICBkZl9pdGVyYXRvcjxOb2RlUmVmLCBkZl9pdGVyYXRvcl9kZWZhdWx0X3NldDxOb2RlUmVmPiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICBHcmFwaFRyYWl0czxGbGF0SXQ8Tm9kZVJlZj4+PjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoUmVnaW9uSW5mb1Bhc3MgKlJJKSB7CisgICAgcmV0dXJuIEdyYXBoVHJhaXRzPFJlZ2lvbkluZm8qPjo6Z2V0RW50cnlOb2RlKCZSSS0+Z2V0UmVnaW9uSW5mbygpKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihSZWdpb25JbmZvUGFzcyogUkkpIHsKKyAgICByZXR1cm4gR3JhcGhUcmFpdHM8UmVnaW9uSW5mbyo+Ojpub2Rlc19iZWdpbigmUkktPmdldFJlZ2lvbkluZm8oKSk7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKFJlZ2lvbkluZm9QYXNzICpSSSkgeworICAgIHJldHVybiBHcmFwaFRyYWl0czxSZWdpb25JbmZvKj46Om5vZGVzX2VuZCgmUkktPmdldFJlZ2lvbkluZm8oKSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX1JFR0lPTklURVJBVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUmVnaW9uUGFzcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9SZWdpb25QYXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1YjM2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUmVnaW9uUGFzcy5oCkBAIC0wLDAgKzEsMTMxIEBACisvLz09PS0gUmVnaW9uUGFzcy5oIC0gUmVnaW9uUGFzcyBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBSZWdpb25QYXNzIGNsYXNzLiBBbGwgcmVnaW9uIGJhc2VkIGFuYWx5c2lzLAorLy8gb3B0aW1pemF0aW9uIGFuZCB0cmFuc2Zvcm1hdGlvbiBwYXNzZXMgYXJlIGRlcml2ZWQgZnJvbSBSZWdpb25QYXNzLgorLy8gVGhpcyBjbGFzcyBpcyBpbXBsZW1lbnRlZCBmb2xsb3dpbmcgdGhlIHNvbWUgaWRlYXMgb2YgdGhlIExvb3BQYXNzLmggY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1JFR0lPTlBBU1NfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1JFR0lPTlBBU1NfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9SZWdpb25JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvTGVnYWN5UGFzc01hbmFnZXJzLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSA8ZGVxdWU+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgUkdQYXNzTWFuYWdlcjsKK2NsYXNzIEZ1bmN0aW9uOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEBicmllZiBBIHBhc3MgdGhhdCBydW5zIG9uIGVhY2ggUmVnaW9uIGluIGEgZnVuY3Rpb24uCisvLy8KKy8vLyBSZWdpb25QYXNzIGlzIG1hbmFnZWQgYnkgUkdQYXNzTWFuYWdlci4KK2NsYXNzIFJlZ2lvblBhc3MgOiBwdWJsaWMgUGFzcyB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFJlZ2lvblBhc3MoY2hhciAmcGlkKSA6IFBhc3MoUFRfUmVnaW9uLCBwaWQpIHt9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBAbmFtZSBUbyBiZSBpbXBsZW1lbnRlZCBieSBldmVyeSBSZWdpb25QYXNzCisgIC8vLworICAvL0B7CisgIC8vLyBAYnJpZWYgUnVuIHRoZSBwYXNzIG9uIGEgc3BlY2lmaWMgUmVnaW9uCisgIC8vLworICAvLy8gQWNjZXNzaW5nIHJlZ2lvbnMgbm90IGNvbnRhaW5lZCBpbiB0aGUgY3VycmVudCByZWdpb24gaXMgbm90IGFsbG93ZWQuCisgIC8vLworICAvLy8gQHBhcmFtIFIgVGhlIHJlZ2lvbiB0aGlzIHBhc3MgaXMgcnVuIG9uLgorICAvLy8gQHBhcmFtIFJHTSBUaGUgUmVnaW9uUGFzc01hbmFnZXIgdGhhdCBtYW5hZ2VzIHRoaXMgUGFzcy4KKyAgLy8vCisgIC8vLyBAcmV0dXJuIFRydWUgaWYgdGhlIHBhc3MgbW9kaWZpZXMgdGhpcyBSZWdpb24uCisgIHZpcnR1YWwgYm9vbCBydW5PblJlZ2lvbihSZWdpb24gKlIsIFJHUGFzc01hbmFnZXIgJlJHTSkgPSAwOworCisgIC8vLyBAYnJpZWYgR2V0IGEgcGFzcyB0byBwcmludCB0aGUgTExWTSBJUiBpbiB0aGUgcmVnaW9uLgorICAvLy8KKyAgLy8vIEBwYXJhbSBPICAgICAgVGhlIG91dHB1dCBzdHJlYW0gdG8gcHJpbnQgdGhlIFJlZ2lvbi4KKyAgLy8vIEBwYXJhbSBCYW5uZXIgVGhlIGJhbm5lciB0byBzZXBhcmF0ZSBkaWZmZXJlbnQgcHJpbnRlZCBwYXNzZXMuCisgIC8vLworICAvLy8gQHJldHVybiBUaGUgcGFzcyB0byBwcmludCB0aGUgTExWTSBJUiBpbiB0aGUgcmVnaW9uLgorICBQYXNzICpjcmVhdGVQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdXNpbmcgbGx2bTo6UGFzczo6ZG9Jbml0aWFsaXphdGlvbjsKKyAgdXNpbmcgbGx2bTo6UGFzczo6ZG9GaW5hbGl6YXRpb247CisKKyAgdmlydHVhbCBib29sIGRvSW5pdGlhbGl6YXRpb24oUmVnaW9uICpSLCBSR1Bhc3NNYW5hZ2VyICZSR00pIHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBkb0ZpbmFsaXphdGlvbigpIHsgcmV0dXJuIGZhbHNlOyB9CisgIC8vQH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIEBuYW1lIFBhc3NNYW5hZ2VyIEFQSQorICAvLy8KKyAgLy9AeworICB2b2lkIHByZXBhcmVQYXNzTWFuYWdlcihQTVN0YWNrICZQTVMpIG92ZXJyaWRlOworCisgIHZvaWQgYXNzaWduUGFzc01hbmFnZXIoUE1TdGFjayAmUE1TLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NNYW5hZ2VyVHlwZSBQTVQgPSBQTVRfUmVnaW9uUGFzc01hbmFnZXIpIG92ZXJyaWRlOworCisgIFBhc3NNYW5hZ2VyVHlwZSBnZXRQb3RlbnRpYWxQYXNzTWFuYWdlclR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFBNVF9SZWdpb25QYXNzTWFuYWdlcjsKKyAgfQorICAvL0B9CisKK3Byb3RlY3RlZDoKKyAgLy8vIE9wdGlvbmFsIHBhc3NlcyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gY2hlY2sgd2hldGhlciB0aGUgcGFzcyBzaG91bGQgYmUKKyAgLy8vIHNraXBwZWQuIFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiBvcHRpbWl6YXRpb24gYmlzZWN0IGlzIG92ZXIgdGhlIGxpbWl0LgorICBib29sIHNraXBSZWdpb24oUmVnaW9uICZSKSBjb25zdDsKK307CisKKy8vLyBAYnJpZWYgVGhlIHBhc3MgbWFuYWdlciB0byBzY2hlZHVsZSBSZWdpb25QYXNzZXMuCitjbGFzcyBSR1Bhc3NNYW5hZ2VyIDogcHVibGljIEZ1bmN0aW9uUGFzcywgcHVibGljIFBNRGF0YU1hbmFnZXIgeworICBzdGQ6OmRlcXVlPFJlZ2lvbio+IFJROworICBib29sIHNraXBUaGlzUmVnaW9uOworICBib29sIHJlZG9UaGlzUmVnaW9uOworICBSZWdpb25JbmZvICpSSTsKKyAgUmVnaW9uICpDdXJyZW50UmVnaW9uOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworICBleHBsaWNpdCBSR1Bhc3NNYW5hZ2VyKCk7CisKKyAgLy8vIEBicmllZiBFeGVjdXRlIGFsbCBvZiB0aGUgcGFzc2VzIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uLgorICAvLy8KKyAgLy8vIEByZXR1cm4gVHJ1ZSBpZiBhbnkgb2YgdGhlIHBhc3NlcyBtb2RpZmllcyB0aGUgZnVuY3Rpb24uCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisKKyAgLy8vIFBhc3MgTWFuYWdlciBpdHNlbGYgZG9lcyBub3QgaW52YWxpZGF0ZSBhbnkgYW5hbHlzaXMgaW5mby4KKyAgLy8vIFJHUGFzc01hbmFnZXIgbmVlZHMgUmVnaW9uSW5mby4KKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkluZm8pIGNvbnN0IG92ZXJyaWRlOworCisgIFN0cmluZ1JlZiBnZXRQYXNzTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJSZWdpb24gUGFzcyBNYW5hZ2VyIjsgfQorCisgIFBNRGF0YU1hbmFnZXIgKmdldEFzUE1EYXRhTWFuYWdlcigpIG92ZXJyaWRlIHsgcmV0dXJuIHRoaXM7IH0KKyAgUGFzcyAqZ2V0QXNQYXNzKCkgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQorCisgIC8vLyBAYnJpZWYgUHJpbnQgcGFzc2VzIG1hbmFnZWQgYnkgdGhpcyBtYW5hZ2VyLgorICB2b2lkIGR1bXBQYXNzU3RydWN0dXJlKHVuc2lnbmVkIE9mZnNldCkgb3ZlcnJpZGU7CisKKyAgLy8vIEBicmllZiBHZXQgcGFzc2VzIGNvbnRhaW5lZCBieSB0aGlzIG1hbmFnZXIuCisgIFBhc3MgKmdldENvbnRhaW5lZFBhc3ModW5zaWduZWQgTikgeworICAgIGFzc2VydChOIDwgUGFzc1ZlY3Rvci5zaXplKCkgJiYgIlBhc3MgbnVtYmVyIG91dCBvZiByYW5nZSEiKTsKKyAgICBQYXNzICpGUCA9IHN0YXRpY19jYXN0PFBhc3MgKj4oUGFzc1ZlY3RvcltOXSk7CisgICAgcmV0dXJuIEZQOworICB9CisKKyAgUGFzc01hbmFnZXJUeXBlIGdldFBhc3NNYW5hZ2VyVHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUE1UX1JlZ2lvblBhc3NNYW5hZ2VyOworICB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUmVnaW9uUHJpbnRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9SZWdpb25QcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwMDM1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUmVnaW9uUHJpbnRlci5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vPT09LS0gUmVnaW9uUHJpbnRlci5oIC0gUmVnaW9uIHByaW50ZXIgZXh0ZXJuYWwgaW50ZXJmYWNlIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgZXh0ZXJuYWwgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIGNhbGxlZCB0byBleHBsaWNpdGx5CisvLyBpbnN0YW50aWF0ZSB0aGUgcmVnaW9uIHByaW50ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1JFR0lPTlBSSU5URVJfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1JFR0lPTlBSSU5URVJfSAorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEZ1bmN0aW9uUGFzczsKKyAgY2xhc3MgRnVuY3Rpb247CisgIGNsYXNzIFJlZ2lvbkluZm87CisKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVSZWdpb25WaWV3ZXJQYXNzKCk7CisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlUmVnaW9uT25seVZpZXdlclBhc3MoKTsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVSZWdpb25QcmludGVyUGFzcygpOworICBGdW5jdGlvblBhc3MgKmNyZWF0ZVJlZ2lvbk9ubHlQcmludGVyUGFzcygpOworCisjaWZuZGVmIE5ERUJVRworICAvLy8gQGJyaWVmIE9wZW4gYSB2aWV3ZXIgdG8gZGlzcGxheSB0aGUgR3JhcGhWaXogdml6dWFsaXphdGlvbiBvZiB0aGUgYW5hbHlzaXMKKyAgLy8vIHJlc3VsdC4KKyAgLy8vCisgIC8vLyBQcmFjdGljYWwgdG8gY2FsbCBpbiB0aGUgZGVidWdnZXIuCisgIC8vLyBJbmNsdWRlcyB0aGUgaW5zdHJ1Y3Rpb25zIGluIGVhY2ggQmFzaWNCbG9jay4KKyAgLy8vCisgIC8vLyBAcGFyYW0gUkkgVGhlIGFuYWx5c2lzIHRvIGRpc3BsYXkuCisgIHZvaWQgdmlld1JlZ2lvbihsbHZtOjpSZWdpb25JbmZvICpSSSk7CisKKyAgLy8vIEBicmllZiBBbmFseXplIHRoZSByZWdpb25zIG9mIGEgZnVuY3Rpb24gYW5kIG9wZW4gaXRzIEdyYXBoVml6CisgIC8vLyB2aXN1YWxpemF0aW9uIGluIGEgdmlld2VyLgorICAvLy8KKyAgLy8vIFVzZWZ1bCB0byBjYWxsIGluIHRoZSBkZWJ1Z2dlci4KKyAgLy8vIEluY2x1ZGVzIHRoZSBpbnN0cnVjdGlvbnMgaW4gZWFjaCBCYXNpY0Jsb2NrLgorICAvLy8gVGhlIHJlc3VsdCBvZiBhIG5ldyBhbmFseXNpcyBtYXkgZGlmZmVyIGZyb20gdGhlIFJlZ2lvbkluZm8gdGhlIHBhc3MKKyAgLy8vIG1hbmFnZXIgY3VycmVudGx5IGhvbGRzLgorICAvLy8KKyAgLy8vIEBwYXJhbSBGIEZ1bmN0aW9uIHRvIGFuYWx5emUuCisgIHZvaWQgdmlld1JlZ2lvbihjb25zdCBsbHZtOjpGdW5jdGlvbiAqRik7CisKKyAgLy8vIEBicmllZiBPcGVuIGEgdmlld2VyIHRvIGRpc3BsYXkgdGhlIEdyYXBoVml6IHZpenVhbGl6YXRpb24gb2YgdGhlIGFuYWx5c2lzCisgIC8vLyByZXN1bHQuCisgIC8vLworICAvLy8gVXNlZnVsIHRvIGNhbGwgaW4gdGhlIGRlYnVnZ2VyLgorICAvLy8gU2hvd3Mgb25seSB0aGUgQmFzaWNCbG9jayBuYW1lcyB3aXRob3V0IHRoZWlyIGluc3RydWN0aW9ucy4KKyAgLy8vCisgIC8vLyBAcGFyYW0gUkkgVGhlIGFuYWx5c2lzIHRvIGRpc3BsYXkuCisgIHZvaWQgdmlld1JlZ2lvbk9ubHkobGx2bTo6UmVnaW9uSW5mbyAqUkkpOworCisgIC8vLyBAYnJpZWYgQW5hbHl6ZSB0aGUgcmVnaW9ucyBvZiBhIGZ1bmN0aW9uIGFuZCBvcGVuIGl0cyBHcmFwaFZpegorICAvLy8gdmlzdWFsaXphdGlvbiBpbiBhIHZpZXdlci4KKyAgLy8vCisgIC8vLyBVc2VmdWwgdG8gY2FsbCBpbiB0aGUgZGVidWdnZXIuCisgIC8vLyBTaG93cyBvbmx5IHRoZSBCYXNpY0Jsb2NrIG5hbWVzIHdpdGhvdXQgdGhlaXIgaW5zdHJ1Y3Rpb25zLgorICAvLy8gVGhlIHJlc3VsdCBvZiBhIG5ldyBhbmFseXNpcyBtYXkgZGlmZmVyIGZyb20gdGhlIFJlZ2lvbkluZm8gdGhlIHBhc3MKKyAgLy8vIG1hbmFnZXIgY3VycmVudGx5IGhvbGRzLgorICAvLy8KKyAgLy8vIEBwYXJhbSBGIEZ1bmN0aW9uIHRvIGFuYWx5emUuCisgIHZvaWQgdmlld1JlZ2lvbk9ubHkoY29uc3QgbGx2bTo6RnVuY3Rpb24gKkYpOworI2VuZGlmCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDNiODEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbi5oCkBAIC0wLDAgKzEsMTk4MCBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uLmggLSBTY2FsYXIgRXZvbHV0aW9uIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGUgU2NhbGFyRXZvbHV0aW9uIGNsYXNzIGlzIGFuIExMVk0gcGFzcyB3aGljaCBjYW4gYmUgdXNlZCB0byBhbmFseXplIGFuZAorLy8gY2F0ZWdvcml6ZSBzY2FsYXIgZXhwcmVzc2lvbnMgaW4gbG9vcHMuICBJdCBzcGVjaWFsaXplcyBpbiByZWNvZ25pemluZworLy8gZ2VuZXJhbCBpbmR1Y3Rpb24gdmFyaWFibGVzLCByZXByZXNlbnRpbmcgdGhlbSB3aXRoIHRoZSBhYnN0cmFjdCBhbmQgb3BhcXVlCisvLyBTQ0VWIGNsYXNzLiAgR2l2ZW4gdGhpcyBhbmFseXNpcywgdHJpcCBjb3VudHMgb2YgbG9vcHMgYW5kIG90aGVyIGltcG9ydGFudAorLy8gcHJvcGVydGllcyBjYW4gYmUgb2J0YWluZWQuCisvLworLy8gVGhpcyBhbmFseXNpcyBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciBpbmR1Y3Rpb24gdmFyaWFibGUgc3Vic3RpdHV0aW9uIGFuZAorLy8gc3RyZW5ndGggcmVkdWN0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19TQ0FMQVJFVk9MVVRJT05fSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1NDQUxBUkVWT0xVVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSGFzaGluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRSYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RyVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSVIvT3BlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVNYXAuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFzc3VtcHRpb25DYWNoZTsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBDb25zdGFudDsKK2NsYXNzIENvbnN0YW50SW50OworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBHRVBPcGVyYXRvcjsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFNjYWxhckV2b2x1dGlvbjsKK2NsYXNzIFNDRVZBZGRSZWNFeHByOworY2xhc3MgU0NFVlVua25vd247CitjbGFzcyBTdHJ1Y3RUeXBlOworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CitjbGFzcyBUeXBlOworY2xhc3MgVmFsdWU7CisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gYW5hbHl6ZWQgZXhwcmVzc2lvbiBpbiB0aGUgcHJvZ3JhbS4gIFRoZXNlIGFyZQorLy8vIG9wYXF1ZSBvYmplY3RzIHRoYXQgdGhlIGNsaWVudCBpcyBub3QgYWxsb3dlZCB0byBkbyBtdWNoIHdpdGggZGlyZWN0bHkuCisvLy8KK2NsYXNzIFNDRVYgOiBwdWJsaWMgRm9sZGluZ1NldE5vZGUgeworICBmcmllbmQgc3RydWN0IEZvbGRpbmdTZXRUcmFpdDxTQ0VWPjsKKworICAvLy8gQSByZWZlcmVuY2UgdG8gYW4gSW50ZXJuZWQgRm9sZGluZ1NldE5vZGVJRCBmb3IgdGhpcyBub2RlLiAgVGhlCisgIC8vLyBTY2FsYXJFdm9sdXRpb24ncyBCdW1wUHRyQWxsb2NhdG9yIGhvbGRzIHRoZSBkYXRhLgorICBGb2xkaW5nU2V0Tm9kZUlEUmVmIEZhc3RJRDsKKworICAvLyBUaGUgU0NFViBiYXNlY2xhc3MgdGhpcyBub2RlIGNvcnJlc3BvbmRzIHRvCisgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNDRVZUeXBlOworCitwcm90ZWN0ZWQ6CisgIC8vLyBUaGlzIGZpZWxkIGlzIGluaXRpYWxpemVkIHRvIHplcm8gYW5kIG1heSBiZSB1c2VkIGluIHN1YmNsYXNzZXMgdG8gc3RvcmUKKyAgLy8vIG1pc2NlbGxhbmVvdXMgaW5mb3JtYXRpb24uCisgIHVuc2lnbmVkIHNob3J0IFN1YmNsYXNzRGF0YSA9IDA7CisKK3B1YmxpYzoKKyAgLy8vIE5vV3JhcEZsYWdzIGFyZSBiaXRmaWVsZCBpbmRpY2VzIGludG8gU3ViY2xhc3NEYXRhLgorICAvLy8KKyAgLy8vIEFkZCBhbmQgTXVsIGV4cHJlc3Npb25zIG1heSBoYXZlIG5vLXVuc2lnbmVkLXdyYXAgPE5VVz4gb3IKKyAgLy8vIG5vLXNpZ25lZC13cmFwIDxOU1c+IHByb3BlcnRpZXMsIHdoaWNoIGFyZSBkZXJpdmVkIGZyb20gdGhlIElSCisgIC8vLyBvcGVyYXRvci4gTlNXIGlzIGEgbWlzbm9tZXIgdGhhdCB3ZSB1c2UgdG8gbWVhbiBubyBzaWduZWQgb3ZlcmZsb3cgb3IKKyAgLy8vIHVuZGVyZmxvdy4KKyAgLy8vCisgIC8vLyBBZGRSZWMgZXhwcmVzc2lvbnMgbWF5IGhhdmUgYSBuby1zZWxmLXdyYXBhcm91bmQgPE5XPiBwcm9wZXJ0eSBpZiwgaW4KKyAgLy8vIHRoZSBpbnRlZ2VyIGRvbWFpbiwgYWJzKHN0ZXApICogbWF4LWl0ZXJhdGlvbihsb29wKSA8PQorICAvLy8gdW5zaWduZWQtbWF4KGJpdHdpZHRoKS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgcmVjdXJyZW5jZSB3aWxsIG5ldmVyIHJlYWNoCisgIC8vLyBpdHMgc3RhcnQgdmFsdWUgaWYgdGhlIHN0ZXAgaXMgbm9uLXplcm8uICBDb21wdXRpbmcgdGhlIHNhbWUgdmFsdWUgb24KKyAgLy8vIGVhY2ggaXRlcmF0aW9uIGlzIG5vdCBjb25zaWRlcmVkIHdyYXBwaW5nLCBhbmQgcmVjdXJyZW5jZXMgd2l0aCBzdGVwID0gMAorICAvLy8gYXJlIHRyaXZpYWxseSA8Tlc+LiAgPE5XPiBpcyBpbmRlcGVuZGVudCBvZiB0aGUgc2lnbiBvZiBzdGVwIGFuZCB0aGUKKyAgLy8vIHZhbHVlIHRoZSBhZGQgcmVjdXJyZW5jZSBzdGFydHMgd2l0aC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgTlVXIGFuZCBOU1cgYXJlIGFsc28gdmFsaWQgcHJvcGVydGllcyBvZiBhIHJlY3VycmVuY2UsIGFuZAorICAvLy8gZWl0aGVyIGltcGxpZXMgTlcuIEZvciBjb252ZW5pZW5jZSwgTlcgd2lsbCBiZSBzZXQgZm9yIGEgcmVjdXJyZW5jZQorICAvLy8gd2hlbmV2ZXIgZWl0aGVyIE5VVyBvciBOU1cgYXJlIHNldC4KKyAgZW51bSBOb1dyYXBGbGFncyB7CisgICAgRmxhZ0FueVdyYXAgPSAwLCAgICAvLyBObyBndWFyYW50ZWUuCisgICAgRmxhZ05XID0gKDEgPDwgMCksICAvLyBObyBzZWxmLXdyYXAuCisgICAgRmxhZ05VVyA9ICgxIDw8IDEpLCAvLyBObyB1bnNpZ25lZCB3cmFwLgorICAgIEZsYWdOU1cgPSAoMSA8PCAyKSwgLy8gTm8gc2lnbmVkIHdyYXAuCisgICAgTm9XcmFwTWFzayA9ICgxIDw8IDMpIC0gMQorICB9OworCisgIGV4cGxpY2l0IFNDRVYoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwgdW5zaWduZWQgU0NFVlR5KQorICAgICAgOiBGYXN0SUQoSUQpLCBTQ0VWVHlwZShTQ0VWVHkpIHt9CisgIFNDRVYoY29uc3QgU0NFViAmKSA9IGRlbGV0ZTsKKyAgU0NFViAmb3BlcmF0b3I9KGNvbnN0IFNDRVYgJikgPSBkZWxldGU7CisKKyAgdW5zaWduZWQgZ2V0U0NFVlR5cGUoKSBjb25zdCB7IHJldHVybiBTQ0VWVHlwZTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIExMVk0gdHlwZSBvZiB0aGlzIFNDRVYgZXhwcmVzc2lvbi4KKyAgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXhwcmVzc2lvbiBpcyBhIGNvbnN0YW50IHplcm8uCisgIGJvb2wgaXNaZXJvKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBleHByZXNzaW9uIGlzIGEgY29uc3RhbnQgb25lLgorICBib29sIGlzT25lKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBleHByZXNzaW9uIGlzIGEgY29uc3RhbnQgYWxsLW9uZXMgdmFsdWUuCisgIGJvb2wgaXNBbGxPbmVzVmFsdWUoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBzY2V2IGlzIG5lZ2F0ZWQsIGJ1dCBub3QgYSBjb25zdGFudC4KKyAgYm9vbCBpc05vbkNvbnN0YW50TmVnYXRpdmUoKSBjb25zdDsKKworICAvLy8gUHJpbnQgb3V0IHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNjYWxhciB0byB0aGUgc3BlY2lmaWVkCisgIC8vLyBzdHJlYW0uICBUaGlzIHNob3VsZCByZWFsbHkgb25seSBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgZGVidWdnaW5nLgorICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKKy8vIFNwZWNpYWxpemUgRm9sZGluZ1NldFRyYWl0IGZvciBTQ0VWIHRvIGF2b2lkIG5lZWRpbmcgdG8gY29tcHV0ZQorLy8gdGVtcG9yYXJ5IEZvbGRpbmdTZXROb2RlSUQgdmFsdWVzLgordGVtcGxhdGUgPD4gc3RydWN0IEZvbGRpbmdTZXRUcmFpdDxTQ0VWPiA6IERlZmF1bHRGb2xkaW5nU2V0VHJhaXQ8U0NFVj4geworICBzdGF0aWMgdm9pZCBQcm9maWxlKGNvbnN0IFNDRVYgJlgsIEZvbGRpbmdTZXROb2RlSUQgJklEKSB7IElEID0gWC5GYXN0SUQ7IH0KKworICBzdGF0aWMgYm9vbCBFcXVhbHMoY29uc3QgU0NFViAmWCwgY29uc3QgRm9sZGluZ1NldE5vZGVJRCAmSUQsIHVuc2lnbmVkIElESGFzaCwKKyAgICAgICAgICAgICAgICAgICAgIEZvbGRpbmdTZXROb2RlSUQgJlRlbXBJRCkgeworICAgIHJldHVybiBJRCA9PSBYLkZhc3RJRDsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBDb21wdXRlSGFzaChjb25zdCBTQ0VWICZYLCBGb2xkaW5nU2V0Tm9kZUlEICZUZW1wSUQpIHsKKyAgICByZXR1cm4gWC5GYXN0SUQuQ29tcHV0ZUhhc2goKTsKKyAgfQorfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgU0NFViAmUykgeworICBTLnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCisvLy8gQW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgcmV0dXJuZWQgYnkgcXVlcmllcyB0aGF0IGNvdWxkIG5vdCBiZSBhbnN3ZXJlZC4KKy8vLyBGb3IgZXhhbXBsZSwgaWYgeW91IGFzayBmb3IgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIG9mIGEgbGlua2VkLWxpc3QKKy8vLyB0cmF2ZXJzYWwgbG9vcCwgeW91IHdpbGwgZ2V0IG9uZSBvZiB0aGVzZS4gIE5vbmUgb2YgdGhlIHN0YW5kYXJkIFNDRVYKKy8vLyBvcGVyYXRpb25zIGFyZSB2YWxpZCBvbiB0aGlzIGNsYXNzLCBpdCBpcyBqdXN0IGEgbWFya2VyLgorc3RydWN0IFNDRVZDb3VsZE5vdENvbXB1dGUgOiBwdWJsaWMgU0NFViB7CisgIFNDRVZDb3VsZE5vdENvbXB1dGUoKTsKKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWICpTKTsKK307CisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gYXNzdW1wdGlvbiBtYWRlIHVzaW5nIFNDRVYgZXhwcmVzc2lvbnMgd2hpY2ggY2FuCisvLy8gYmUgY2hlY2tlZCBhdCBydW4tdGltZS4KK2NsYXNzIFNDRVZQcmVkaWNhdGUgOiBwdWJsaWMgRm9sZGluZ1NldE5vZGUgeworICBmcmllbmQgc3RydWN0IEZvbGRpbmdTZXRUcmFpdDxTQ0VWUHJlZGljYXRlPjsKKworICAvLy8gQSByZWZlcmVuY2UgdG8gYW4gSW50ZXJuZWQgRm9sZGluZ1NldE5vZGVJRCBmb3IgdGhpcyBub2RlLiAgVGhlCisgIC8vLyBTY2FsYXJFdm9sdXRpb24ncyBCdW1wUHRyQWxsb2NhdG9yIGhvbGRzIHRoZSBkYXRhLgorICBGb2xkaW5nU2V0Tm9kZUlEUmVmIEZhc3RJRDsKKworcHVibGljOgorICBlbnVtIFNDRVZQcmVkaWNhdGVLaW5kIHsgUF9VbmlvbiwgUF9FcXVhbCwgUF9XcmFwIH07CisKK3Byb3RlY3RlZDoKKyAgU0NFVlByZWRpY2F0ZUtpbmQgS2luZDsKKyAgflNDRVZQcmVkaWNhdGUoKSA9IGRlZmF1bHQ7CisgIFNDRVZQcmVkaWNhdGUoY29uc3QgU0NFVlByZWRpY2F0ZSAmKSA9IGRlZmF1bHQ7CisgIFNDRVZQcmVkaWNhdGUgJm9wZXJhdG9yPShjb25zdCBTQ0VWUHJlZGljYXRlICYpID0gZGVmYXVsdDsKKworcHVibGljOgorICBTQ0VWUHJlZGljYXRlKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsIFNDRVZQcmVkaWNhdGVLaW5kIEtpbmQpOworCisgIFNDRVZQcmVkaWNhdGVLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIGVzdGltYXRlZCBjb21wbGV4aXR5IG9mIHRoaXMgcHJlZGljYXRlLiAgVGhpcyBpcyByb3VnaGx5CisgIC8vLyBtZWFzdXJlZCBpbiB0aGUgbnVtYmVyIG9mIHJ1bi10aW1lIGNoZWNrcyByZXF1aXJlZC4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRDb21wbGV4aXR5KCkgY29uc3QgeyByZXR1cm4gMTsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHByZWRpY2F0ZSBpcyBhbHdheXMgdHJ1ZS4gVGhpcyBtZWFucyB0aGF0IG5vCisgIC8vLyBhc3N1bXB0aW9ucyB3ZXJlIG1hZGUgYW5kIG5vdGhpbmcgbmVlZHMgdG8gYmUgY2hlY2tlZCBhdCBydW4tdGltZS4KKyAgdmlydHVhbCBib29sIGlzQWx3YXlzVHJ1ZSgpIGNvbnN0ID0gMDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgcHJlZGljYXRlIGltcGxpZXMgXHAgTi4KKyAgdmlydHVhbCBib29sIGltcGxpZXMoY29uc3QgU0NFVlByZWRpY2F0ZSAqTikgY29uc3QgPSAwOworCisgIC8vLyBQcmludHMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJlZGljYXRlIHdpdGggYW4gaW5kZW50YXRpb24gb2YKKyAgLy8vIFxwIERlcHRoLgorICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0ID0gMDsKKworICAvLy8gUmV0dXJucyB0aGUgU0NFViB0byB3aGljaCB0aGlzIHByZWRpY2F0ZSBhcHBsaWVzLCBvciBudWxscHRyIGlmIHRoaXMgaXMKKyAgLy8vIGEgU0NFVlVuaW9uUHJlZGljYXRlLgorICB2aXJ0dWFsIGNvbnN0IFNDRVYgKmdldEV4cHIoKSBjb25zdCA9IDA7Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBTQ0VWUHJlZGljYXRlICZQKSB7CisgIFAucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKKy8vIFNwZWNpYWxpemUgRm9sZGluZ1NldFRyYWl0IGZvciBTQ0VWUHJlZGljYXRlIHRvIGF2b2lkIG5lZWRpbmcgdG8gY29tcHV0ZQorLy8gdGVtcG9yYXJ5IEZvbGRpbmdTZXROb2RlSUQgdmFsdWVzLgordGVtcGxhdGUgPD4KK3N0cnVjdCBGb2xkaW5nU2V0VHJhaXQ8U0NFVlByZWRpY2F0ZT4gOiBEZWZhdWx0Rm9sZGluZ1NldFRyYWl0PFNDRVZQcmVkaWNhdGU+IHsKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShjb25zdCBTQ0VWUHJlZGljYXRlICZYLCBGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeworICAgIElEID0gWC5GYXN0SUQ7CisgIH0KKworICBzdGF0aWMgYm9vbCBFcXVhbHMoY29uc3QgU0NFVlByZWRpY2F0ZSAmWCwgY29uc3QgRm9sZGluZ1NldE5vZGVJRCAmSUQsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJREhhc2gsIEZvbGRpbmdTZXROb2RlSUQgJlRlbXBJRCkgeworICAgIHJldHVybiBJRCA9PSBYLkZhc3RJRDsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBDb21wdXRlSGFzaChjb25zdCBTQ0VWUHJlZGljYXRlICZYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9sZGluZ1NldE5vZGVJRCAmVGVtcElEKSB7CisgICAgcmV0dXJuIFguRmFzdElELkNvbXB1dGVIYXNoKCk7CisgIH0KK307CisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gYXNzdW1wdGlvbiB0aGF0IHR3byBTQ0VWIGV4cHJlc3Npb25zIGFyZSBlcXVhbCwKKy8vLyBhbmQgdGhpcyBjYW4gYmUgY2hlY2tlZCBhdCBydW4tdGltZS4KK2NsYXNzIFNDRVZFcXVhbFByZWRpY2F0ZSBmaW5hbCA6IHB1YmxpYyBTQ0VWUHJlZGljYXRlIHsKKyAgLy8vIFdlIGFzc3VtZSB0aGF0IExIUyA9PSBSSFMuCisgIGNvbnN0IFNDRVYgKkxIUzsKKyAgY29uc3QgU0NFViAqUkhTOworCitwdWJsaWM6CisgIFNDRVZFcXVhbFByZWRpY2F0ZShjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIElELCBjb25zdCBTQ0VWICpMSFMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpSSFMpOworCisgIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU0NFVlByZWRpY2F0ZSBpbnRlcmZhY2UKKyAgYm9vbCBpbXBsaWVzKGNvbnN0IFNDRVZQcmVkaWNhdGUgKk4pIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgRGVwdGggPSAwKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0Fsd2F5c1RydWUoKSBjb25zdCBvdmVycmlkZTsKKyAgY29uc3QgU0NFViAqZ2V0RXhwcigpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vLyBSZXR1cm5zIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgZXF1YWxpdHkuCisgIGNvbnN0IFNDRVYgKmdldExIUygpIGNvbnN0IHsgcmV0dXJuIExIUzsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgdGhlIGVxdWFsaXR5LgorICBjb25zdCBTQ0VWICpnZXRSSFMoKSBjb25zdCB7IHJldHVybiBSSFM7IH0KKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWUHJlZGljYXRlICpQKSB7CisgICAgcmV0dXJuIFAtPmdldEtpbmQoKSA9PSBQX0VxdWFsOworICB9Cit9OworCisvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGFzc3VtcHRpb24gbWFkZSBvbiBhbiBBZGRSZWMgZXhwcmVzc2lvbi4gR2l2ZW4gYW4KKy8vLyBhZmZpbmUgQWRkUmVjIGV4cHJlc3Npb24ge2EsKyxifSwgd2UgYXNzdW1lIHRoYXQgaXQgaGFzIHRoZSBuc3N3IG9yIG51c3cKKy8vLyBmbGFncyAoZGVmaW5lZCBiZWxvdykgaW4gdGhlIGZpcnN0IFggaXRlcmF0aW9ucyBvZiB0aGUgbG9vcCwgd2hlcmUgWCBpcyBhCisvLy8gU0NFViBleHByZXNzaW9uIHJldHVybmVkIGJ5IGdldFByZWRpY2F0ZWRCYWNrZWRnZVRha2VuQ291bnQpLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgaW1wbHkgdGhhdCBYIGlzIGVxdWFsIHRvIHRoZSBiYWNrZWRnZSB0YWtlbgorLy8vIGNvdW50LiBUaGlzIG1lYW5zIHRoYXQgaWYgd2UgaGF2ZSBhIG51c3cgcHJlZGljYXRlIGZvciBpMzIgezAsKywxfSB3aXRoIGEKKy8vLyBwcmVkaWNhdGVkIGJhY2tlZGdlIHRha2VuIGNvdW50IG9mIFgsIHdlIG9ubHkgZ3VhcmFudGVlIHRoYXQgezAsKywxfSBoYXMKKy8vLyBudXN3IGluIHRoZSBmaXJzdCBYIGl0ZXJhdGlvbnMuIHswLCssMX0gbWF5IHN0aWxsIHdyYXAgaW4gdGhlIGxvb3AgaWYgd2UKKy8vLyBoYXZlIG1vcmUgdGhhbiBYIGl0ZXJhdGlvbnMuCitjbGFzcyBTQ0VWV3JhcFByZWRpY2F0ZSBmaW5hbCA6IHB1YmxpYyBTQ0VWUHJlZGljYXRlIHsKK3B1YmxpYzoKKyAgLy8vIFNpbWlsYXIgdG8gU0NFVjo6Tm9XcmFwRmxhZ3MsIGJ1dCB3aXRoIHNsaWdodGx5IGRpZmZlcmVudCBzZW1hbnRpY3MKKyAgLy8vIGZvciBGbGFnTlVTVy4gVGhlIGluY3JlbWVudCBpcyBjb25zaWRlcmVkIHRvIGJlIHNpZ25lZCwgYW5kIGEgKyBiCisgIC8vLyAod2hlcmUgYiBpcyB0aGUgaW5jcmVtZW50KSBpcyBjb25zaWRlcmVkIHRvIHdyYXAgaWY6CisgIC8vLyAgICB6ZXh0KGEgKyBiKSAhPSB6ZXh0KGEpICsgc2V4dChiKQorICAvLy8KKyAgLy8vIElmIFNpZ25lZCBpcyBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gbi1iaXQgdHVwbGUgYW5kIG1hcHMgdG8gdGhlCisgIC8vLyBpbnRlZ2VyIGRvbWFpbiBhcyB0aGUgdHVwbGVzIHZhbHVlIGludGVycHJldGVkIGFzIHR3b3MgY29tcGxlbWVudCwKKyAgLy8vIGFuZCBVbnNpZ25lZCBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gbi1iaXQgdHVwbGUgYW5kIG1hcHMgdG8gdGhlCisgIC8vLyBpbnRlZ2VyIGRvbWFpbiBhcyBhcyB0aGUgYmFzZSB0d28gdmFsdWUgb2YgaW5wdXQgdHVwbGUsIHRoZW4gYSArIGIKKyAgLy8vIGhhcyBJbmNyZW1lbnROVVNXIGlmZjoKKyAgLy8vCisgIC8vLyAwIDw9IFVuc2lnbmVkKGEpICsgU2lnbmVkKGIpIDwgMl5uCisgIC8vLworICAvLy8gVGhlIEluY3JlbWVudE5TU1cgZmxhZyBoYXMgaWRlbnRpY2FsIHNlbWFudGljcyB3aXRoIFNDRVY6OkZsYWdOU1cuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoZSBJbmNyZW1lbnROVVNXIGZsYWcgaXMgbm90IGNvbW11dGF0aXZlOiBpZiBiYXNlICsgaW5jCisgIC8vLyBoYXMgSW5jcmVtZW50TlVTVywgdGhlbiBpbmMgKyBiYXNlIGRvZXNuJ3QgbmVjY2Vzc2FyaWx5IGhhdmUgdGhpcworICAvLy8gcHJvcGVydHkuIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGlzIGlzIHVzZWQgZm9yIHNpZ24vemVybworICAvLy8gZXh0ZW5kaW5nIGFmZmluZSBBZGRSZWMgU0NFViBleHByZXNzaW9ucyB3aGVuIGEgU0NFVldyYXBQcmVkaWNhdGUgaXMKKyAgLy8vIGFzc3VtZWQuIEEge2Jhc2UsKyxpbmN9IGV4cHJlc3Npb24gaXMgYWxyZWFkeSBub24tY29tbXV0YXRpdmUgd2l0aAorICAvLy8gcmVnYXJkcyB0byBiYXNlIGFuZCBpbmMsIHNpbmNlIGl0IGlzIGludGVycHJldGVkIGFzOgorICAvLy8gICAgICgoKGJhc2UgKyBpbmMpICsgaW5jKSArIGluYykgLi4uCisgIGVudW0gSW5jcmVtZW50V3JhcEZsYWdzIHsKKyAgICBJbmNyZW1lbnRBbnlXcmFwID0gMCwgICAgIC8vIE5vIGd1YXJhbnRlZS4KKyAgICBJbmNyZW1lbnROVVNXID0gKDEgPDwgMCksIC8vIE5vIHVuc2lnbmVkIHdpdGggc2lnbmVkIGluY3JlbWVudCB3cmFwLgorICAgIEluY3JlbWVudE5TU1cgPSAoMSA8PCAxKSwgLy8gTm8gc2lnbmVkIHdpdGggc2lnbmVkIGluY3JlbWVudCB3cmFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZXF1aXZhbGVudCB3aXRoIFNDRVY6Ok5TVykKKyAgICBJbmNyZW1lbnROb1dyYXBNYXNrID0gKDEgPDwgMikgLSAxCisgIH07CisKKyAgLy8vIENvbnZlbmllbnQgSW5jcmVtZW50V3JhcEZsYWdzIG1hbmlwdWxhdGlvbiBtZXRob2RzLgorICBMTFZNX05PRElTQ0FSRCBzdGF0aWMgU0NFVldyYXBQcmVkaWNhdGU6OkluY3JlbWVudFdyYXBGbGFncworICBjbGVhckZsYWdzKFNDRVZXcmFwUHJlZGljYXRlOjpJbmNyZW1lbnRXcmFwRmxhZ3MgRmxhZ3MsCisgICAgICAgICAgICAgU0NFVldyYXBQcmVkaWNhdGU6OkluY3JlbWVudFdyYXBGbGFncyBPZmZGbGFncykgeworICAgIGFzc2VydCgoRmxhZ3MgJiBJbmNyZW1lbnROb1dyYXBNYXNrKSA9PSBGbGFncyAmJiAiSW52YWxpZCBmbGFncyB2YWx1ZSEiKTsKKyAgICBhc3NlcnQoKE9mZkZsYWdzICYgSW5jcmVtZW50Tm9XcmFwTWFzaykgPT0gT2ZmRmxhZ3MgJiYKKyAgICAgICAgICAgIkludmFsaWQgZmxhZ3MgdmFsdWUhIik7CisgICAgcmV0dXJuIChTQ0VWV3JhcFByZWRpY2F0ZTo6SW5jcmVtZW50V3JhcEZsYWdzKShGbGFncyAmIH5PZmZGbGFncyk7CisgIH0KKworICBMTFZNX05PRElTQ0FSRCBzdGF0aWMgU0NFVldyYXBQcmVkaWNhdGU6OkluY3JlbWVudFdyYXBGbGFncworICBtYXNrRmxhZ3MoU0NFVldyYXBQcmVkaWNhdGU6OkluY3JlbWVudFdyYXBGbGFncyBGbGFncywgaW50IE1hc2spIHsKKyAgICBhc3NlcnQoKEZsYWdzICYgSW5jcmVtZW50Tm9XcmFwTWFzaykgPT0gRmxhZ3MgJiYgIkludmFsaWQgZmxhZ3MgdmFsdWUhIik7CisgICAgYXNzZXJ0KChNYXNrICYgSW5jcmVtZW50Tm9XcmFwTWFzaykgPT0gTWFzayAmJiAiSW52YWxpZCBtYXNrIHZhbHVlISIpOworCisgICAgcmV0dXJuIChTQ0VWV3JhcFByZWRpY2F0ZTo6SW5jcmVtZW50V3JhcEZsYWdzKShGbGFncyAmIE1hc2spOworICB9CisKKyAgTExWTV9OT0RJU0NBUkQgc3RhdGljIFNDRVZXcmFwUHJlZGljYXRlOjpJbmNyZW1lbnRXcmFwRmxhZ3MKKyAgc2V0RmxhZ3MoU0NFVldyYXBQcmVkaWNhdGU6OkluY3JlbWVudFdyYXBGbGFncyBGbGFncywKKyAgICAgICAgICAgU0NFVldyYXBQcmVkaWNhdGU6OkluY3JlbWVudFdyYXBGbGFncyBPbkZsYWdzKSB7CisgICAgYXNzZXJ0KChGbGFncyAmIEluY3JlbWVudE5vV3JhcE1hc2spID09IEZsYWdzICYmICJJbnZhbGlkIGZsYWdzIHZhbHVlISIpOworICAgIGFzc2VydCgoT25GbGFncyAmIEluY3JlbWVudE5vV3JhcE1hc2spID09IE9uRmxhZ3MgJiYKKyAgICAgICAgICAgIkludmFsaWQgZmxhZ3MgdmFsdWUhIik7CisKKyAgICByZXR1cm4gKFNDRVZXcmFwUHJlZGljYXRlOjpJbmNyZW1lbnRXcmFwRmxhZ3MpKEZsYWdzIHwgT25GbGFncyk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgc2V0IG9mIFNDRVZXcmFwUHJlZGljYXRlIG5vIHdyYXAgZmxhZ3MgaW1wbGllZCBieSBhCisgIC8vLyBTQ0VWQWRkUmVjRXhwci4KKyAgTExWTV9OT0RJU0NBUkQgc3RhdGljIFNDRVZXcmFwUHJlZGljYXRlOjpJbmNyZW1lbnRXcmFwRmxhZ3MKKyAgZ2V0SW1wbGllZEZsYWdzKGNvbnN0IFNDRVZBZGRSZWNFeHByICpBUiwgU2NhbGFyRXZvbHV0aW9uICZTRSk7CisKK3ByaXZhdGU6CisgIGNvbnN0IFNDRVZBZGRSZWNFeHByICpBUjsKKyAgSW5jcmVtZW50V3JhcEZsYWdzIEZsYWdzOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFNDRVZXcmFwUHJlZGljYXRlKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVZBZGRSZWNFeHByICpBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jcmVtZW50V3JhcEZsYWdzIEZsYWdzKTsKKworICAvLy8gUmV0dXJucyB0aGUgc2V0IGFzc3VtZWQgbm8gb3ZlcmZsb3cgZmxhZ3MuCisgIEluY3JlbWVudFdyYXBGbGFncyBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIEZsYWdzOyB9CisKKyAgLy8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTQ0VWUHJlZGljYXRlIGludGVyZmFjZQorICBjb25zdCBTQ0VWICpnZXRFeHByKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaW1wbGllcyhjb25zdCBTQ0VWUHJlZGljYXRlICpOKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIERlcHRoID0gMCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNBbHdheXNUcnVlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0NFVlByZWRpY2F0ZSAqUCkgeworICAgIHJldHVybiBQLT5nZXRLaW5kKCkgPT0gUF9XcmFwOworICB9Cit9OworCisvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY29tcG9zaXRpb24gb2Ygb3RoZXIgU0NFViBwcmVkaWNhdGVzLCBhbmQgaXMgdGhlCisvLy8gY2xhc3MgdGhhdCBtb3N0IGNsaWVudHMgd2lsbCBpbnRlcmFjdCB3aXRoLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEKKy8vLyBsb2dpY2FsICJBTkQiIG9mIGFsbCB0aGUgcHJlZGljYXRlcyBpbiB0aGUgdW5pb24uCisvLy8KKy8vLyBOQiEgVW5saWtlIG90aGVyIFNDRVZQcmVkaWNhdGUgc3ViLWNsYXNzZXMgdGhpcyBjbGFzcyBkb2VzIG5vdCBsaXZlIGluIHRoZQorLy8vIFNjYWxhckV2b2x1dGlvbjo6UHJlZHMgZm9sZGluZyBzZXQuICBUaGlzIGlzIHdoeSB0aGUgXGMgYWRkIGZ1bmN0aW9uIGlzIHNvdW5kLgorY2xhc3MgU0NFVlVuaW9uUHJlZGljYXRlIGZpbmFsIDogcHVibGljIFNDRVZQcmVkaWNhdGUgeworcHJpdmF0ZToKKyAgdXNpbmcgUHJlZGljYXRlTWFwID0KKyAgICAgIERlbnNlTWFwPGNvbnN0IFNDRVYgKiwgU21hbGxWZWN0b3I8Y29uc3QgU0NFVlByZWRpY2F0ZSAqLCA0Pj47CisKKyAgLy8vIFZlY3RvciB3aXRoIHJlZmVyZW5jZXMgdG8gYWxsIHByZWRpY2F0ZXMgaW4gdGhpcyB1bmlvbi4KKyAgU21hbGxWZWN0b3I8Y29uc3QgU0NFVlByZWRpY2F0ZSAqLCAxNj4gUHJlZHM7CisKKyAgLy8vIE1hcHMgU0NFVnMgdG8gcHJlZGljYXRlcyBmb3IgcXVpY2sgbG9vay11cHMuCisgIFByZWRpY2F0ZU1hcCBTQ0VWVG9QcmVkczsKKworcHVibGljOgorICBTQ0VWVW5pb25QcmVkaWNhdGUoKTsKKworICBjb25zdCBTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFVlByZWRpY2F0ZSAqPiAmZ2V0UHJlZGljYXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZHM7CisgIH0KKworICAvLy8gQWRkcyBhIHByZWRpY2F0ZSB0byB0aGlzIHVuaW9uLgorICB2b2lkIGFkZChjb25zdCBTQ0VWUHJlZGljYXRlICpOKTsKKworICAvLy8gUmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIHZlY3RvciBjb250YWluaW5nIGFsbCBwcmVkaWNhdGVzIHdoaWNoIGFwcGx5IHRvCisgIC8vLyBccCBFeHByLgorICBBcnJheVJlZjxjb25zdCBTQ0VWUHJlZGljYXRlICo+IGdldFByZWRpY2F0ZXNGb3JFeHByKGNvbnN0IFNDRVYgKkV4cHIpOworCisgIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU0NFVlByZWRpY2F0ZSBpbnRlcmZhY2UKKyAgYm9vbCBpc0Fsd2F5c1RydWUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpbXBsaWVzKGNvbnN0IFNDRVZQcmVkaWNhdGUgKk4pIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgRGVwdGgpIGNvbnN0IG92ZXJyaWRlOworICBjb25zdCBTQ0VWICpnZXRFeHByKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIFdlIGVzdGltYXRlIHRoZSBjb21wbGV4aXR5IG9mIGEgdW5pb24gcHJlZGljYXRlIGFzIHRoZSBzaXplIG51bWJlciBvZgorICAvLy8gcHJlZGljYXRlcyBpbiB0aGUgdW5pb24uCisgIHVuc2lnbmVkIGdldENvbXBsZXhpdHkoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBQcmVkcy5zaXplKCk7IH0KKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWUHJlZGljYXRlICpQKSB7CisgICAgcmV0dXJuIFAtPmdldEtpbmQoKSA9PSBQX1VuaW9uOworICB9Cit9OworCitzdHJ1Y3QgRXhpdExpbWl0UXVlcnkgeworICBFeGl0TGltaXRRdWVyeShjb25zdCBMb29wICpMLCBCYXNpY0Jsb2NrICpFeGl0aW5nQmxvY2ssIGJvb2wgQWxsb3dQcmVkaWNhdGVzKQorICAgICAgOiBMKEwpLCBFeGl0aW5nQmxvY2soRXhpdGluZ0Jsb2NrKSwgQWxsb3dQcmVkaWNhdGVzKEFsbG93UHJlZGljYXRlcykge30KKworICBjb25zdCBMb29wICpMOworICBCYXNpY0Jsb2NrICpFeGl0aW5nQmxvY2s7CisgIGJvb2wgQWxsb3dQcmVkaWNhdGVzOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IERlbnNlTWFwSW5mbzxFeGl0TGltaXRRdWVyeT4geworICBzdGF0aWMgaW5saW5lIEV4aXRMaW1pdFF1ZXJ5IGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBFeGl0TGltaXRRdWVyeShudWxscHRyLCBudWxscHRyLCB0cnVlKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgRXhpdExpbWl0UXVlcnkgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiBFeGl0TGltaXRRdWVyeShudWxscHRyLCBudWxscHRyLCBmYWxzZSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKEV4aXRMaW1pdFF1ZXJ5IFZhbCkgeworICAgIHJldHVybiBoYXNoX2NvbWJpbmUoaGFzaF9jb21iaW5lKFZhbC5MLCBWYWwuRXhpdGluZ0Jsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbC5BbGxvd1ByZWRpY2F0ZXMpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChFeGl0TGltaXRRdWVyeSBMSFMsIEV4aXRMaW1pdFF1ZXJ5IFJIUykgeworICAgIHJldHVybiBMSFMuTCA9PSBSSFMuTCAmJiBMSFMuRXhpdGluZ0Jsb2NrID09IFJIUy5FeGl0aW5nQmxvY2sgJiYKKyAgICAgICAgICAgTEhTLkFsbG93UHJlZGljYXRlcyA9PSBSSFMuQWxsb3dQcmVkaWNhdGVzOworICB9Cit9OworCisvLy8gVGhlIG1haW4gc2NhbGFyIGV2b2x1dGlvbiBkcml2ZXIuIEJlY2F1c2UgY2xpZW50IGNvZGUgKGludGVudGlvbmFsbHkpCisvLy8gY2FuJ3QgZG8gbXVjaCB3aXRoIHRoZSBTQ0VWIG9iamVjdHMgZGlyZWN0bHksIHRoZXkgbXVzdCBhc2sgdGhpcyBjbGFzcworLy8vIGZvciBzZXJ2aWNlcy4KK2NsYXNzIFNjYWxhckV2b2x1dGlvbiB7CitwdWJsaWM6CisgIC8vLyBBbiBlbnVtIGRlc2NyaWJpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgU0NFViBhbmQgYSBsb29wLgorICBlbnVtIExvb3BEaXNwb3NpdGlvbiB7CisgICAgTG9vcFZhcmlhbnQsICAgLy8vPCBUaGUgU0NFViBpcyBsb29wLXZhcmlhbnQgKHVua25vd24pLgorICAgIExvb3BJbnZhcmlhbnQsIC8vLzwgVGhlIFNDRVYgaXMgbG9vcC1pbnZhcmlhbnQuCisgICAgTG9vcENvbXB1dGFibGUgLy8vPCBUaGUgU0NFViB2YXJpZXMgcHJlZGljdGFibHkgd2l0aCB0aGUgbG9vcC4KKyAgfTsKKworICAvLy8gQW4gZW51bSBkZXNjcmliaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhIFNDRVYgYW5kIGEgYmFzaWMgYmxvY2suCisgIGVudW0gQmxvY2tEaXNwb3NpdGlvbiB7CisgICAgRG9lc05vdERvbWluYXRlQmxvY2ssICAvLy88IFRoZSBTQ0VWIGRvZXMgbm90IGRvbWluYXRlIHRoZSBibG9jay4KKyAgICBEb21pbmF0ZXNCbG9jaywgICAgICAgIC8vLzwgVGhlIFNDRVYgZG9taW5hdGVzIHRoZSBibG9jay4KKyAgICBQcm9wZXJseURvbWluYXRlc0Jsb2NrIC8vLzwgVGhlIFNDRVYgcHJvcGVybHkgZG9taW5hdGVzIHRoZSBibG9jay4KKyAgfTsKKworICAvLy8gQ29udmVuaWVudCBOb1dyYXBGbGFncyBtYW5pcHVsYXRpb24gdGhhdCBoaWRlcyBlbnVtIGNhc3RzIGFuZCBpcworICAvLy8gdmlzaWJsZSBpbiB0aGUgU2NhbGFyRXZvbHV0aW9uIG5hbWUgc3BhY2UuCisgIExMVk1fTk9ESVNDQVJEIHN0YXRpYyBTQ0VWOjpOb1dyYXBGbGFncyBtYXNrRmxhZ3MoU0NFVjo6Tm9XcmFwRmxhZ3MgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE1hc2spIHsKKyAgICByZXR1cm4gKFNDRVY6Ok5vV3JhcEZsYWdzKShGbGFncyAmIE1hc2spOworICB9CisgIExMVk1fTk9ESVNDQVJEIHN0YXRpYyBTQ0VWOjpOb1dyYXBGbGFncyBzZXRGbGFncyhTQ0VWOjpOb1dyYXBGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDRVY6Ok5vV3JhcEZsYWdzIE9uRmxhZ3MpIHsKKyAgICByZXR1cm4gKFNDRVY6Ok5vV3JhcEZsYWdzKShGbGFncyB8IE9uRmxhZ3MpOworICB9CisgIExMVk1fTk9ESVNDQVJEIHN0YXRpYyBTQ0VWOjpOb1dyYXBGbGFncworICBjbGVhckZsYWdzKFNDRVY6Ok5vV3JhcEZsYWdzIEZsYWdzLCBTQ0VWOjpOb1dyYXBGbGFncyBPZmZGbGFncykgeworICAgIHJldHVybiAoU0NFVjo6Tm9XcmFwRmxhZ3MpKEZsYWdzICYgfk9mZkZsYWdzKTsKKyAgfQorCisgIFNjYWxhckV2b2x1dGlvbihGdW5jdGlvbiAmRiwgVGFyZ2V0TGlicmFyeUluZm8gJlRMSSwgQXNzdW1wdGlvbkNhY2hlICZBQywKKyAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgJkRULCBMb29wSW5mbyAmTEkpOworICBTY2FsYXJFdm9sdXRpb24oU2NhbGFyRXZvbHV0aW9uICYmQXJnKTsKKyAgflNjYWxhckV2b2x1dGlvbigpOworCisgIExMVk1Db250ZXh0ICZnZXRDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gRi5nZXRDb250ZXh0KCk7IH0KKworICAvLy8gVGVzdCBpZiB2YWx1ZXMgb2YgdGhlIGdpdmVuIHR5cGUgYXJlIGFuYWx5emFibGUgd2l0aGluIHRoZSBTQ0VWCisgIC8vLyBmcmFtZXdvcmsuIFRoaXMgcHJpbWFyaWx5IGluY2x1ZGVzIGludGVnZXIgdHlwZXMsIGFuZCBpdCBjYW4gb3B0aW9uYWxseQorICAvLy8gaW5jbHVkZSBwb2ludGVyIHR5cGVzIGlmIHRoZSBTY2FsYXJFdm9sdXRpb24gY2xhc3MgaGFzIGFjY2VzcyB0bworICAvLy8gdGFyZ2V0LXNwZWNpZmljIGluZm9ybWF0aW9uLgorICBib29sIGlzU0NFVmFibGUoVHlwZSAqVHkpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHNpemUgaW4gYml0cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUsIGZvciB3aGljaCBpc1NDRVZhYmxlIG11c3QKKyAgLy8vIHJldHVybiB0cnVlLgorICB1aW50NjRfdCBnZXRUeXBlU2l6ZUluQml0cyhUeXBlICpUeSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhIHR5cGUgd2l0aCB0aGUgc2FtZSBiaXR3aWR0aCBhcyB0aGUgZ2l2ZW4gdHlwZSBhbmQgd2hpY2gKKyAgLy8vIHJlcHJlc2VudHMgaG93IFNDRVYgd2lsbCB0cmVhdCB0aGUgZ2l2ZW4gdHlwZSwgZm9yIHdoaWNoIGlzU0NFVmFibGUgbXVzdAorICAvLy8gcmV0dXJuIHRydWUuIEZvciBwb2ludGVyIHR5cGVzLCB0aGlzIGlzIHRoZSBwb2ludGVyLXNpemVkIGludGVnZXIgdHlwZS4KKyAgVHlwZSAqZ2V0RWZmZWN0aXZlU0NFVlR5cGUoVHlwZSAqVHkpIGNvbnN0OworCisgIC8vIFJldHVybnMgYSB3aWRlciB0eXBlIGFtb25nIHtUeTEsIFR5Mn0uCisgIFR5cGUgKmdldFdpZGVyVHlwZShUeXBlICpUeTEsIFR5cGUgKlR5MikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBTQ0VWIGlzIGEgc2NBZGRSZWNFeHByIG9yIGl0IGNvbnRhaW5zCisgIC8vLyBzY0FkZFJlY0V4cHIuIFRoZSByZXN1bHQgd2lsbCBiZSBjYWNoZWQgaW4gSGFzUmVjTWFwLgorICBib29sIGNvbnRhaW5zQWRkUmVjdXJyZW5jZShjb25zdCBTQ0VWICpTKTsKKworICAvLy8gRXJhc2UgVmFsdWUgZnJvbSBWYWx1ZUV4cHJNYXAgYW5kIEV4cHJWYWx1ZU1hcC4KKyAgdm9pZCBlcmFzZVZhbHVlRnJvbU1hcChWYWx1ZSAqVik7CisKKyAgLy8vIFJldHVybiBhIFNDRVYgZXhwcmVzc2lvbiBmb3IgdGhlIGZ1bGwgZ2VuZXJhbGl0eSBvZiB0aGUgc3BlY2lmaWVkCisgIC8vLyBleHByZXNzaW9uLgorICBjb25zdCBTQ0VWICpnZXRTQ0VWKFZhbHVlICpWKTsKKworICBjb25zdCBTQ0VWICpnZXRDb25zdGFudChDb25zdGFudEludCAqVik7CisgIGNvbnN0IFNDRVYgKmdldENvbnN0YW50KGNvbnN0IEFQSW50ICZWYWwpOworICBjb25zdCBTQ0VWICpnZXRDb25zdGFudChUeXBlICpUeSwgdWludDY0X3QgViwgYm9vbCBpc1NpZ25lZCA9IGZhbHNlKTsKKyAgY29uc3QgU0NFViAqZ2V0VHJ1bmNhdGVFeHByKGNvbnN0IFNDRVYgKk9wLCBUeXBlICpUeSk7CisgIGNvbnN0IFNDRVYgKmdldFplcm9FeHRlbmRFeHByKGNvbnN0IFNDRVYgKk9wLCBUeXBlICpUeSwgdW5zaWduZWQgRGVwdGggPSAwKTsKKyAgY29uc3QgU0NFViAqZ2V0U2lnbkV4dGVuZEV4cHIoY29uc3QgU0NFViAqT3AsIFR5cGUgKlR5LCB1bnNpZ25lZCBEZXB0aCA9IDApOworICBjb25zdCBTQ0VWICpnZXRBbnlFeHRlbmRFeHByKGNvbnN0IFNDRVYgKk9wLCBUeXBlICpUeSk7CisgIGNvbnN0IFNDRVYgKmdldEFkZEV4cHIoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTQ0VWOjpOb1dyYXBGbGFncyBGbGFncyA9IFNDRVY6OkZsYWdBbnlXcmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCk7CisgIGNvbnN0IFNDRVYgKmdldEFkZEV4cHIoY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0NFVjo6Tm9XcmFwRmxhZ3MgRmxhZ3MgPSBTQ0VWOjpGbGFnQW55V3JhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApIHsKKyAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDI+IE9wcyA9IHtMSFMsIFJIU307CisgICAgcmV0dXJuIGdldEFkZEV4cHIoT3BzLCBGbGFncywgRGVwdGgpOworICB9CisgIGNvbnN0IFNDRVYgKmdldEFkZEV4cHIoY29uc3QgU0NFViAqT3AwLCBjb25zdCBTQ0VWICpPcDEsIGNvbnN0IFNDRVYgKk9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTQ0VWOjpOb1dyYXBGbGFncyBGbGFncyA9IFNDRVY6OkZsYWdBbnlXcmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCkgeworICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgMz4gT3BzID0ge09wMCwgT3AxLCBPcDJ9OworICAgIHJldHVybiBnZXRBZGRFeHByKE9wcywgRmxhZ3MsIERlcHRoKTsKKyAgfQorICBjb25zdCBTQ0VWICpnZXRNdWxFeHByKFNtYWxsVmVjdG9ySW1wbDxjb25zdCBTQ0VWICo+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0NFVjo6Tm9XcmFwRmxhZ3MgRmxhZ3MgPSBTQ0VWOjpGbGFnQW55V3JhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApOworICBjb25zdCBTQ0VWICpnZXRNdWxFeHByKGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNDRVY6Ok5vV3JhcEZsYWdzIEZsYWdzID0gU0NFVjo6RmxhZ0FueVdyYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwKSB7CisgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCAyPiBPcHMgPSB7TEhTLCBSSFN9OworICAgIHJldHVybiBnZXRNdWxFeHByKE9wcywgRmxhZ3MsIERlcHRoKTsKKyAgfQorICBjb25zdCBTQ0VWICpnZXRNdWxFeHByKGNvbnN0IFNDRVYgKk9wMCwgY29uc3QgU0NFViAqT3AxLCBjb25zdCBTQ0VWICpPcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0NFVjo6Tm9XcmFwRmxhZ3MgRmxhZ3MgPSBTQ0VWOjpGbGFnQW55V3JhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApIHsKKyAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDM+IE9wcyA9IHtPcDAsIE9wMSwgT3AyfTsKKyAgICByZXR1cm4gZ2V0TXVsRXhwcihPcHMsIEZsYWdzLCBEZXB0aCk7CisgIH0KKyAgY29uc3QgU0NFViAqZ2V0VURpdkV4cHIoY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMpOworICBjb25zdCBTQ0VWICpnZXRVRGl2RXhhY3RFeHByKGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTKTsKKyAgY29uc3QgU0NFViAqZ2V0VVJlbUV4cHIoY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMpOworICBjb25zdCBTQ0VWICpnZXRBZGRSZWNFeHByKGNvbnN0IFNDRVYgKlN0YXJ0LCBjb25zdCBTQ0VWICpTdGVwLCBjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDRVY6Ok5vV3JhcEZsYWdzIEZsYWdzKTsKKyAgY29uc3QgU0NFViAqZ2V0QWRkUmVjRXhwcihTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPiAmT3BlcmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqTCwgU0NFVjo6Tm9XcmFwRmxhZ3MgRmxhZ3MpOworICBjb25zdCBTQ0VWICpnZXRBZGRSZWNFeHByKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxjb25zdCBTQ0VWICo+ICZPcGVyYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMLCBTQ0VWOjpOb1dyYXBGbGFncyBGbGFncykgeworICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgND4gTmV3T3AoT3BlcmFuZHMuYmVnaW4oKSwgT3BlcmFuZHMuZW5kKCkpOworICAgIHJldHVybiBnZXRBZGRSZWNFeHByKE5ld09wLCBMLCBGbGFncyk7CisgIH0KKworICAvLy8gQ2hlY2tzIGlmIFxwIFN5bWJvbGljUEhJIGNhbiBiZSByZXdyaXR0ZW4gYXMgYW4gQWRkUmVjRXhwciB1bmRlciBzb21lCisgIC8vLyBQcmVkaWNhdGVzLiBJZiBzdWNjZXNzZnVsIHJldHVybiB0aGVzZSA8QWRkUmVjRXhwciwgUHJlZGljYXRlcz47CisgIC8vLyBUaGUgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gUFNDRVYgKHRoZSBjYWxsZXIgd2lsbCBkZWNpZGUKKyAgLy8vIHdoZXRoZXIgdG8gYWN0dWFsbHkgYWRkIHRoZSBwcmVkaWNhdGVzIGFuZCBjYXJyeSBvdXQgdGhlIHJld3JpdGVzKS4KKyAgT3B0aW9uYWw8c3RkOjpwYWlyPGNvbnN0IFNDRVYgKiwgU21hbGxWZWN0b3I8Y29uc3QgU0NFVlByZWRpY2F0ZSAqLCAzPj4+CisgIGNyZWF0ZUFkZFJlY0Zyb21QSElXaXRoQ2FzdHMoY29uc3QgU0NFVlVua25vd24gKlN5bWJvbGljUEhJKTsKKworICAvLy8gUmV0dXJucyBhbiBleHByZXNzaW9uIGZvciBhIEdFUAorICAvLy8KKyAgLy8vIFxwIEdFUCBUaGUgR0VQLiBUaGUgaW5kaWNlcyBjb250YWluZWQgaW4gdGhlIEdFUCBpdHNlbGYgYXJlIGlnbm9yZWQsCisgIC8vLyBpbnN0ZWFkIHdlIHVzZSBJbmRleEV4cHJzLgorICAvLy8gXHAgSW5kZXhFeHBycyBUaGUgZXhwcmVzc2lvbnMgZm9yIHRoZSBpbmRpY2VzLgorICBjb25zdCBTQ0VWICpnZXRHRVBFeHByKEdFUE9wZXJhdG9yICpHRVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJkluZGV4RXhwcnMpOworICBjb25zdCBTQ0VWICpnZXRTTWF4RXhwcihjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUyk7CisgIGNvbnN0IFNDRVYgKmdldFNNYXhFeHByKFNtYWxsVmVjdG9ySW1wbDxjb25zdCBTQ0VWICo+ICZPcGVyYW5kcyk7CisgIGNvbnN0IFNDRVYgKmdldFVNYXhFeHByKGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTKTsKKyAgY29uc3QgU0NFViAqZ2V0VU1heEV4cHIoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJk9wZXJhbmRzKTsKKyAgY29uc3QgU0NFViAqZ2V0U01pbkV4cHIoY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMpOworICBjb25zdCBTQ0VWICpnZXRVTWluRXhwcihjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUyk7CisgIGNvbnN0IFNDRVYgKmdldFVua25vd24oVmFsdWUgKlYpOworICBjb25zdCBTQ0VWICpnZXRDb3VsZE5vdENvbXB1dGUoKTsKKworICAvLy8gUmV0dXJuIGEgU0NFViBmb3IgdGhlIGNvbnN0YW50IDAgb2YgYSBzcGVjaWZpYyB0eXBlLgorICBjb25zdCBTQ0VWICpnZXRaZXJvKFR5cGUgKlR5KSB7IHJldHVybiBnZXRDb25zdGFudChUeSwgMCk7IH0KKworICAvLy8gUmV0dXJuIGEgU0NFViBmb3IgdGhlIGNvbnN0YW50IDEgb2YgYSBzcGVjaWZpYyB0eXBlLgorICBjb25zdCBTQ0VWICpnZXRPbmUoVHlwZSAqVHkpIHsgcmV0dXJuIGdldENvbnN0YW50KFR5LCAxKTsgfQorCisgIC8vLyBSZXR1cm4gYW4gZXhwcmVzc2lvbiBmb3Igc2l6ZW9mIEFsbG9jVHkgdGhhdCBpcyB0eXBlIEludFR5CisgIGNvbnN0IFNDRVYgKmdldFNpemVPZkV4cHIoVHlwZSAqSW50VHksIFR5cGUgKkFsbG9jVHkpOworCisgIC8vLyBSZXR1cm4gYW4gZXhwcmVzc2lvbiBmb3Igb2Zmc2V0b2Ygb24gdGhlIGdpdmVuIGZpZWxkIHdpdGggdHlwZSBJbnRUeQorICBjb25zdCBTQ0VWICpnZXRPZmZzZXRPZkV4cHIoVHlwZSAqSW50VHksIFN0cnVjdFR5cGUgKlNUeSwgdW5zaWduZWQgRmllbGRObyk7CisKKyAgLy8vIFJldHVybiB0aGUgU0NFViBvYmplY3QgY29ycmVzcG9uZGluZyB0byAtVi4KKyAgY29uc3QgU0NFViAqZ2V0TmVnYXRpdmVTQ0VWKGNvbnN0IFNDRVYgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0VWOjpOb1dyYXBGbGFncyBGbGFncyA9IFNDRVY6OkZsYWdBbnlXcmFwKTsKKworICAvLy8gUmV0dXJuIHRoZSBTQ0VWIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIH5WLgorICBjb25zdCBTQ0VWICpnZXROb3RTQ0VWKGNvbnN0IFNDRVYgKlYpOworCisgIC8vLyBSZXR1cm4gTEhTLVJIUy4gIE1pbnVzIGlzIHJlcHJlc2VudGVkIGluIFNDRVYgYXMgQStCKi0xLgorICBjb25zdCBTQ0VWICpnZXRNaW51c1NDRVYoY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0VWOjpOb1dyYXBGbGFncyBGbGFncyA9IFNDRVY6OkZsYWdBbnlXcmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwKTsKKworICAvLy8gUmV0dXJuIGEgU0NFViBjb3JyZXNwb25kaW5nIHRvIGEgY29udmVyc2lvbiBvZiB0aGUgaW5wdXQgdmFsdWUgdG8gdGhlCisgIC8vLyBzcGVjaWZpZWQgdHlwZS4gIElmIHRoZSB0eXBlIG11c3QgYmUgZXh0ZW5kZWQsIGl0IGlzIHplcm8gZXh0ZW5kZWQuCisgIGNvbnN0IFNDRVYgKmdldFRydW5jYXRlT3JaZXJvRXh0ZW5kKGNvbnN0IFNDRVYgKlYsIFR5cGUgKlR5KTsKKworICAvLy8gUmV0dXJuIGEgU0NFViBjb3JyZXNwb25kaW5nIHRvIGEgY29udmVyc2lvbiBvZiB0aGUgaW5wdXQgdmFsdWUgdG8gdGhlCisgIC8vLyBzcGVjaWZpZWQgdHlwZS4gIElmIHRoZSB0eXBlIG11c3QgYmUgZXh0ZW5kZWQsIGl0IGlzIHNpZ24gZXh0ZW5kZWQuCisgIGNvbnN0IFNDRVYgKmdldFRydW5jYXRlT3JTaWduRXh0ZW5kKGNvbnN0IFNDRVYgKlYsIFR5cGUgKlR5KTsKKworICAvLy8gUmV0dXJuIGEgU0NFViBjb3JyZXNwb25kaW5nIHRvIGEgY29udmVyc2lvbiBvZiB0aGUgaW5wdXQgdmFsdWUgdG8gdGhlCisgIC8vLyBzcGVjaWZpZWQgdHlwZS4gIElmIHRoZSB0eXBlIG11c3QgYmUgZXh0ZW5kZWQsIGl0IGlzIHplcm8gZXh0ZW5kZWQuICBUaGUKKyAgLy8vIGNvbnZlcnNpb24gbXVzdCBub3QgYmUgbmFycm93aW5nLgorICBjb25zdCBTQ0VWICpnZXROb29wT3JaZXJvRXh0ZW5kKGNvbnN0IFNDRVYgKlYsIFR5cGUgKlR5KTsKKworICAvLy8gUmV0dXJuIGEgU0NFViBjb3JyZXNwb25kaW5nIHRvIGEgY29udmVyc2lvbiBvZiB0aGUgaW5wdXQgdmFsdWUgdG8gdGhlCisgIC8vLyBzcGVjaWZpZWQgdHlwZS4gIElmIHRoZSB0eXBlIG11c3QgYmUgZXh0ZW5kZWQsIGl0IGlzIHNpZ24gZXh0ZW5kZWQuICBUaGUKKyAgLy8vIGNvbnZlcnNpb24gbXVzdCBub3QgYmUgbmFycm93aW5nLgorICBjb25zdCBTQ0VWICpnZXROb29wT3JTaWduRXh0ZW5kKGNvbnN0IFNDRVYgKlYsIFR5cGUgKlR5KTsKKworICAvLy8gUmV0dXJuIGEgU0NFViBjb3JyZXNwb25kaW5nIHRvIGEgY29udmVyc2lvbiBvZiB0aGUgaW5wdXQgdmFsdWUgdG8gdGhlCisgIC8vLyBzcGVjaWZpZWQgdHlwZS4gSWYgdGhlIHR5cGUgbXVzdCBiZSBleHRlbmRlZCwgaXQgaXMgZXh0ZW5kZWQgd2l0aAorICAvLy8gdW5zcGVjaWZpZWQgYml0cy4gVGhlIGNvbnZlcnNpb24gbXVzdCBub3QgYmUgbmFycm93aW5nLgorICBjb25zdCBTQ0VWICpnZXROb29wT3JBbnlFeHRlbmQoY29uc3QgU0NFViAqViwgVHlwZSAqVHkpOworCisgIC8vLyBSZXR1cm4gYSBTQ0VWIGNvcnJlc3BvbmRpbmcgdG8gYSBjb252ZXJzaW9uIG9mIHRoZSBpbnB1dCB2YWx1ZSB0byB0aGUKKyAgLy8vIHNwZWNpZmllZCB0eXBlLiAgVGhlIGNvbnZlcnNpb24gbXVzdCBub3QgYmUgd2lkZW5pbmcuCisgIGNvbnN0IFNDRVYgKmdldFRydW5jYXRlT3JOb29wKGNvbnN0IFNDRVYgKlYsIFR5cGUgKlR5KTsKKworICAvLy8gUHJvbW90ZSB0aGUgb3BlcmFuZHMgdG8gdGhlIHdpZGVyIG9mIHRoZSB0eXBlcyB1c2luZyB6ZXJvLWV4dGVuc2lvbiwgYW5kCisgIC8vLyB0aGVuIHBlcmZvcm0gYSB1bWF4IG9wZXJhdGlvbiB3aXRoIHRoZW0uCisgIGNvbnN0IFNDRVYgKmdldFVNYXhGcm9tTWlzbWF0Y2hlZFR5cGVzKGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTKTsKKworICAvLy8gUHJvbW90ZSB0aGUgb3BlcmFuZHMgdG8gdGhlIHdpZGVyIG9mIHRoZSB0eXBlcyB1c2luZyB6ZXJvLWV4dGVuc2lvbiwgYW5kCisgIC8vLyB0aGVuIHBlcmZvcm0gYSB1bWluIG9wZXJhdGlvbiB3aXRoIHRoZW0uCisgIGNvbnN0IFNDRVYgKmdldFVNaW5Gcm9tTWlzbWF0Y2hlZFR5cGVzKGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTKTsKKworICAvLy8gVHJhbnNpdGl2ZWx5IGZvbGxvdyB0aGUgY2hhaW4gb2YgcG9pbnRlci10eXBlIG9wZXJhbmRzIHVudGlsIHJlYWNoaW5nIGEKKyAgLy8vIFNDRVYgdGhhdCBkb2VzIG5vdCBoYXZlIGEgc2luZ2xlIHBvaW50ZXIgb3BlcmFuZC4gVGhpcyByZXR1cm5zIGEKKyAgLy8vIFNDRVZVbmtub3duIHBvaW50ZXIgZm9yIHdlbGwtZm9ybWVkIHBvaW50ZXItdHlwZSBleHByZXNzaW9ucywgYnV0IGNvcm5lcgorICAvLy8gY2FzZXMgZG8gZXhpc3QuCisgIGNvbnN0IFNDRVYgKmdldFBvaW50ZXJCYXNlKGNvbnN0IFNDRVYgKlYpOworCisgIC8vLyBSZXR1cm4gYSBTQ0VWIGV4cHJlc3Npb24gZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBzY29wZQorICAvLy8gaW4gdGhlIHByb2dyYW0uICBUaGUgTCB2YWx1ZSBzcGVjaWZpZXMgYSBsb29wIG5lc3QgdG8gZXZhbHVhdGUgdGhlCisgIC8vLyBleHByZXNzaW9uIGF0LCB3aGVyZSBudWxsIGlzIHRoZSB0b3AtbGV2ZWwgb3IgYSBzcGVjaWZpZWQgbG9vcCBpcworICAvLy8gaW1tZWRpYXRlbHkgaW5zaWRlIG9mIHRoZSBsb29wLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIGV4aXQgdmFsdWUgZm9yIGEgdmFyaWFibGUgZGVmaW5lZAorICAvLy8gaW4gYSBsb29wIGJ5IHF1ZXJ5aW5nIHdoYXQgdGhlIHZhbHVlIHdpbGwgaG9sZCBpbiB0aGUgcGFyZW50IGxvb3AuCisgIC8vLworICAvLy8gSW4gdGhlIGNhc2UgdGhhdCBhIHJlbGV2YW50IGxvb3AgZXhpdCB2YWx1ZSBjYW5ub3QgYmUgY29tcHV0ZWQsIHRoZQorICAvLy8gb3JpZ2luYWwgdmFsdWUgViBpcyByZXR1cm5lZC4KKyAgY29uc3QgU0NFViAqZ2V0U0NFVkF0U2NvcGUoY29uc3QgU0NFViAqUywgY29uc3QgTG9vcCAqTCk7CisKKyAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB3aGljaCBkb2VzIGdldFNDRVZBdFNjb3BlKGdldFNDRVYoViksIEwpLgorICBjb25zdCBTQ0VWICpnZXRTQ0VWQXRTY29wZShWYWx1ZSAqViwgY29uc3QgTG9vcCAqTCk7CisKKyAgLy8vIFRlc3Qgd2hldGhlciBlbnRyeSB0byB0aGUgbG9vcCBpcyBwcm90ZWN0ZWQgYnkgYSBjb25kaXRpb25hbCBiZXR3ZWVuIExIUworICAvLy8gYW5kIFJIUy4gIFRoaXMgaXMgdXNlZCB0byBoZWxwIGF2b2lkIG1heCBleHByZXNzaW9ucyBpbiBsb29wIHRyaXAKKyAgLy8vIGNvdW50cywgYW5kIHRvIGVsaW1pbmF0ZSBjYXN0cy4KKyAgYm9vbCBpc0xvb3BFbnRyeUd1YXJkZWRCeUNvbmQoY29uc3QgTG9vcCAqTCwgSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUyk7CisKKyAgLy8vIFRlc3Qgd2hldGhlciB0aGUgYmFja2VkZ2Ugb2YgdGhlIGxvb3AgaXMgcHJvdGVjdGVkIGJ5IGEgY29uZGl0aW9uYWwKKyAgLy8vIGJldHdlZW4gTEhTIGFuZCBSSFMuICBUaGlzIGlzIHVzZWQgdG8gZWxpbWluYXRlIGNhc3RzLgorICBib29sIGlzTG9vcEJhY2tlZGdlR3VhcmRlZEJ5Q29uZChjb25zdCBMb29wICpMLCBJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTKTsKKworICAvLy8gUmV0dXJucyB0aGUgbWF4aW11bSB0cmlwIGNvdW50IG9mIHRoZSBsb29wIGlmIGl0IGlzIGEgc2luZ2xlLWV4aXQKKyAgLy8vIGxvb3AgYW5kIHdlIGNhbiBjb21wdXRlIGEgc21hbGwgbWF4aW11bSBmb3IgdGhhdCBsb29wLgorICAvLy8KKyAgLy8vIEltcGxlbWVudGVkIGluIHRlcm1zIG9mIHRoZSBcYyBnZXRTbWFsbENvbnN0YW50VHJpcENvdW50IG92ZXJsb2FkIHdpdGgKKyAgLy8vIHRoZSBzaW5nbGUgZXhpdGluZyBibG9jayBwYXNzZWQgdG8gaXQuIFNlZSB0aGF0IHJvdXRpbmUgZm9yIGRldGFpbHMuCisgIHVuc2lnbmVkIGdldFNtYWxsQ29uc3RhbnRUcmlwQ291bnQoY29uc3QgTG9vcCAqTCk7CisKKyAgLy8vIFJldHVybnMgdGhlIG1heGltdW0gdHJpcCBjb3VudCBvZiB0aGlzIGxvb3AgYXMgYSBub3JtYWwgdW5zaWduZWQKKyAgLy8vIHZhbHVlLiBSZXR1cm5zIDAgaWYgdGhlIHRyaXAgY291bnQgaXMgdW5rbm93biBvciBub3QgY29uc3RhbnQuIFRoaXMKKyAgLy8vICJ0cmlwIGNvdW50IiBhc3N1bWVzIHRoYXQgY29udHJvbCBleGl0cyB2aWEgRXhpdGluZ0Jsb2NrLiBNb3JlCisgIC8vLyBwcmVjaXNlbHksIGl0IGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBjb250cm9sIG1heSByZWFjaCBFeGl0aW5nQmxvY2sKKyAgLy8vIGJlZm9yZSB0YWtpbmcgdGhlIGJyYW5jaC4gRm9yIGxvb3BzIHdpdGggbXVsdGlwbGUgZXhpdHMsIGl0IG1heSBub3QgYmUKKyAgLy8vIHRoZSBudW1iZXIgdGltZXMgdGhhdCB0aGUgbG9vcCBoZWFkZXIgZXhlY3V0ZXMgaWYgdGhlIGxvb3AgZXhpdHMKKyAgLy8vIHByZW1hdHVyZWx5IHZpYSBhbm90aGVyIGJyYW5jaC4KKyAgdW5zaWduZWQgZ2V0U21hbGxDb25zdGFudFRyaXBDb3VudChjb25zdCBMb29wICpMLCBCYXNpY0Jsb2NrICpFeGl0aW5nQmxvY2spOworCisgIC8vLyBSZXR1cm5zIHRoZSB1cHBlciBib3VuZCBvZiB0aGUgbG9vcCB0cmlwIGNvdW50IGFzIGEgbm9ybWFsIHVuc2lnbmVkCisgIC8vLyB2YWx1ZS4KKyAgLy8vIFJldHVybnMgMCBpZiB0aGUgdHJpcCBjb3VudCBpcyB1bmtub3duIG9yIG5vdCBjb25zdGFudC4KKyAgdW5zaWduZWQgZ2V0U21hbGxDb25zdGFudE1heFRyaXBDb3VudChjb25zdCBMb29wICpMKTsKKworICAvLy8gUmV0dXJucyB0aGUgbGFyZ2VzdCBjb25zdGFudCBkaXZpc29yIG9mIHRoZSB0cmlwIGNvdW50IG9mIHRoZQorICAvLy8gbG9vcCBpZiBpdCBpcyBhIHNpbmdsZS1leGl0IGxvb3AgYW5kIHdlIGNhbiBjb21wdXRlIGEgc21hbGwgbWF4aW11bSBmb3IKKyAgLy8vIHRoYXQgbG9vcC4KKyAgLy8vCisgIC8vLyBJbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB0aGUgXGMgZ2V0U21hbGxDb25zdGFudFRyaXBNdWx0aXBsZSBvdmVybG9hZCB3aXRoCisgIC8vLyB0aGUgc2luZ2xlIGV4aXRpbmcgYmxvY2sgcGFzc2VkIHRvIGl0LiBTZWUgdGhhdCByb3V0aW5lIGZvciBkZXRhaWxzLgorICB1bnNpZ25lZCBnZXRTbWFsbENvbnN0YW50VHJpcE11bHRpcGxlKGNvbnN0IExvb3AgKkwpOworCisgIC8vLyBSZXR1cm5zIHRoZSBsYXJnZXN0IGNvbnN0YW50IGRpdmlzb3Igb2YgdGhlIHRyaXAgY291bnQgb2YgdGhpcyBsb29wIGFzIGEKKyAgLy8vIG5vcm1hbCB1bnNpZ25lZCB2YWx1ZSwgaWYgcG9zc2libGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYWN0dWFsIHRyaXAKKyAgLy8vIGNvdW50IGlzIGFsd2F5cyBhIG11bHRpcGxlIG9mIHRoZSByZXR1cm5lZCB2YWx1ZSAoZG9uJ3QgZm9yZ2V0IHRoZSB0cmlwCisgIC8vLyBjb3VudCBjb3VsZCB2ZXJ5IHdlbGwgYmUgemVybyBhcyB3ZWxsISkuIEFzIGV4cGxhaW5lZCBpbiB0aGUgY29tbWVudHMKKyAgLy8vIGZvciBnZXRTbWFsbENvbnN0YW50VHJpcENvdW50LCB0aGlzIGFzc3VtZXMgdGhhdCBjb250cm9sIGV4aXRzIHRoZSBsb29wCisgIC8vLyB2aWEgRXhpdGluZ0Jsb2NrLgorICB1bnNpZ25lZCBnZXRTbWFsbENvbnN0YW50VHJpcE11bHRpcGxlKGNvbnN0IExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqRXhpdGluZ0Jsb2NrKTsKKworICAvLy8gR2V0IHRoZSBleHByZXNzaW9uIGZvciB0aGUgbnVtYmVyIG9mIGxvb3AgaXRlcmF0aW9ucyBmb3Igd2hpY2ggdGhpcyBsb29wCisgIC8vLyBpcyBndWFyYW50ZWVkIG5vdCB0byBleGl0IHZpYSBFeGl0aW5nQmxvY2suIE90aGVyd2lzZSByZXR1cm4KKyAgLy8vIFNDRVZDb3VsZE5vdENvbXB1dGUuCisgIGNvbnN0IFNDRVYgKmdldEV4aXRDb3VudChjb25zdCBMb29wICpMLCBCYXNpY0Jsb2NrICpFeGl0aW5nQmxvY2spOworCisgIC8vLyBJZiB0aGUgc3BlY2lmaWVkIGxvb3AgaGFzIGEgcHJlZGljdGFibGUgYmFja2VkZ2UtdGFrZW4gY291bnQsIHJldHVybiBpdCwKKyAgLy8vIG90aGVyd2lzZSByZXR1cm4gYSBTQ0VWQ291bGROb3RDb21wdXRlIG9iamVjdC4gVGhlIGJhY2tlZGdlLXRha2VuIGNvdW50IGlzCisgIC8vLyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBsb29wIGhlYWRlciB3aWxsIGJlIGJyYW5jaGVkIHRvIGZyb20gd2l0aGluIHRoZQorICAvLy8gbG9vcCwgYXNzdW1pbmcgdGhlcmUgYXJlIG5vIGFibm9ybWFsIGV4aXN0cyBsaWtlIGV4Y2VwdGlvbiB0aHJvd3MuIFRoaXMgaXMKKyAgLy8vIG9uZSBsZXNzIHRoYW4gdGhlIHRyaXAgY291bnQgb2YgdGhlIGxvb3AsIHNpbmNlIGl0IGRvZXNuJ3QgY291bnQgdGhlIGZpcnN0CisgIC8vLyBpdGVyYXRpb24sIHdoZW4gdGhlIGhlYWRlciBpcyBicmFuY2hlZCB0byBmcm9tIG91dHNpZGUgdGhlIGxvb3AuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IGl0IGlzIG5vdCB2YWxpZCB0byBjYWxsIHRoaXMgbWV0aG9kIG9uIGEgbG9vcCB3aXRob3V0IGEKKyAgLy8vIGxvb3AtaW52YXJpYW50IGJhY2tlZGdlLXRha2VuIGNvdW50IChzZWUKKyAgLy8vIGhhc0xvb3BJbnZhcmlhbnRCYWNrZWRnZVRha2VuQ291bnQpLgorICBjb25zdCBTQ0VWICpnZXRCYWNrZWRnZVRha2VuQ291bnQoY29uc3QgTG9vcCAqTCk7CisKKyAgLy8vIFNpbWlsYXIgdG8gZ2V0QmFja2VkZ2VUYWtlbkNvdW50LCBleGNlcHQgaXQgd2lsbCBhZGQgYSBzZXQgb2YKKyAgLy8vIFNDRVYgcHJlZGljYXRlcyB0byBQcmVkaWNhdGVzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGJlIHRydWUgaW4gb3JkZXIgZm9yCisgIC8vLyB0aGUgYW5zd2VyIHRvIGJlIGNvcnJlY3QuIFByZWRpY2F0ZXMgY2FuIGJlIGNoZWNrZWQgd2l0aCBydW4tdGltZQorICAvLy8gY2hlY2tzIGFuZCBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIGxvb3AgdmVyc2lvbmluZy4KKyAgY29uc3QgU0NFViAqZ2V0UHJlZGljYXRlZEJhY2tlZGdlVGFrZW5Db3VudChjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDRVZVbmlvblByZWRpY2F0ZSAmUHJlZGljYXRlcyk7CisKKyAgLy8vIFdoZW4gc3VjY2Vzc2Z1bCwgdGhpcyByZXR1cm5zIGEgU0NFVkNvbnN0YW50IHRoYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCisgIC8vLyB0byAoaS5lLiBhICJjb25zZXJ2YXRpdmUgb3Zlci1hcHByb3hpbWF0aW9uIikgb2YgdGhlIHZhbHVlIHJldHVyZW5kIGJ5CisgIC8vLyBnZXRCYWNrZWRnZVRha2VuQ291bnQuICBJZiBzdWNoIGEgdmFsdWUgY2Fubm90IGJlIGNvbXB1dGVkLCBpdCByZXR1cm5zIHRoZQorICAvLy8gU0NFVkNvdWxkTm90Q29tcHV0ZSBvYmplY3QuCisgIGNvbnN0IFNDRVYgKmdldE1heEJhY2tlZGdlVGFrZW5Db3VudChjb25zdCBMb29wICpMKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGJhY2tlZGdlIHRha2VuIGNvdW50IGlzIGVpdGhlciB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKKyAgLy8vIGdldE1heEJhY2tlZGdlVGFrZW5Db3VudCBvciB6ZXJvLgorICBib29sIGlzQmFja2VkZ2VUYWtlbkNvdW50TWF4T3JaZXJvKGNvbnN0IExvb3AgKkwpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGxvb3AgaGFzIGFuIGFuYWx5emFibGUgbG9vcC1pbnZhcmlhbnQKKyAgLy8vIGJhY2tlZGdlLXRha2VuIGNvdW50LgorICBib29sIGhhc0xvb3BJbnZhcmlhbnRCYWNrZWRnZVRha2VuQ291bnQoY29uc3QgTG9vcCAqTCk7CisKKyAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIGNsaWVudCB3aGVuIGl0IGhhcyBjaGFuZ2VkIGEgbG9vcCBpbgorICAvLy8gYSB3YXkgdGhhdCBtYXkgZWZmZWN0IFNjYWxhckV2b2x1dGlvbidzIGFiaWxpdHkgdG8gY29tcHV0ZSBhIHRyaXAgY291bnQsCisgIC8vLyBvciBpZiB0aGUgbG9vcCBpcyBkZWxldGVkLiAgVGhpcyBjYWxsIGlzIHBvdGVudGlhbGx5IGV4cGVuc2l2ZSBmb3IgbGFyZ2UKKyAgLy8vIGxvb3AgYm9kaWVzLgorICB2b2lkIGZvcmdldExvb3AoY29uc3QgTG9vcCAqTCk7CisKKyAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIGNsaWVudCB3aGVuIGl0IGhhcyBjaGFuZ2VkIGEgdmFsdWUKKyAgLy8vIGluIGEgd2F5IHRoYXQgbWF5IGVmZmVjdCBpdHMgdmFsdWUsIG9yIHdoaWNoIG1heSBkaXNjb25uZWN0IGl0IGZyb20gYQorICAvLy8gZGVmLXVzZSBjaGFpbiBsaW5raW5nIGl0IHRvIGEgbG9vcC4KKyAgdm9pZCBmb3JnZXRWYWx1ZShWYWx1ZSAqVik7CisKKyAgLy8vIENhbGxlZCB3aGVuIHRoZSBjbGllbnQgaGFzIGNoYW5nZWQgdGhlIGRpc3Bvc2l0aW9uIG9mIHZhbHVlcyBpbgorICAvLy8gdGhpcyBsb29wLgorICAvLy8KKyAgLy8vIFdlIGRvbid0IGhhdmUgYSB3YXkgdG8gaW52YWxpZGF0ZSBwZXItbG9vcCBkaXNwb3NpdGlvbnMuIENsZWFyIGFuZAorICAvLy8gcmVjb21wdXRlIGlzIHNpbXBsZXIuCisgIHZvaWQgZm9yZ2V0TG9vcERpc3Bvc2l0aW9ucyhjb25zdCBMb29wICpMKSB7IExvb3BEaXNwb3NpdGlvbnMuY2xlYXIoKTsgfQorCisgIC8vLyBEZXRlcm1pbmUgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHplcm8gYml0cyB0aGF0IFMgaXMgZ3VhcmFudGVlZCB0byBlbmQgaW4KKyAgLy8vIChhdCBldmVyeSBsb29wIGl0ZXJhdGlvbikuICBJdCBpcywgYXQgdGhlIHNhbWUgdGltZSwgdGhlIG1pbmltdW0gbnVtYmVyCisgIC8vLyBvZiB0aW1lcyBTIGlzIGRpdmlzaWJsZSBieSAyLiAgRm9yIGV4YW1wbGUsIGdpdmVuIHs0LCssOH0gaXQgcmV0dXJucyAyLgorICAvLy8gSWYgUyBpcyBndWFyYW50ZWVkIHRvIGJlIDAsIGl0IHJldHVybnMgdGhlIGJpdHdpZHRoIG9mIFMuCisgIHVpbnQzMl90IEdldE1pblRyYWlsaW5nWmVyb3MoY29uc3QgU0NFViAqUyk7CisKKyAgLy8vIERldGVybWluZSB0aGUgdW5zaWduZWQgcmFuZ2UgZm9yIGEgcGFydGljdWxhciBTQ0VWLgorICAvLy8gTk9URTogVGhpcyByZXR1cm5zIGEgY29weSBvZiB0aGUgcmVmZXJlbmNlIHJldHVybmVkIGJ5IGdldFJhbmdlUmVmLgorICBDb25zdGFudFJhbmdlIGdldFVuc2lnbmVkUmFuZ2UoY29uc3QgU0NFViAqUykgeworICAgIHJldHVybiBnZXRSYW5nZVJlZihTLCBISU5UX1JBTkdFX1VOU0lHTkVEKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgdGhlIG1pbiBvZiB0aGUgdW5zaWduZWQgcmFuZ2UgZm9yIGEgcGFydGljdWxhciBTQ0VWLgorICBBUEludCBnZXRVbnNpZ25lZFJhbmdlTWluKGNvbnN0IFNDRVYgKlMpIHsKKyAgICByZXR1cm4gZ2V0UmFuZ2VSZWYoUywgSElOVF9SQU5HRV9VTlNJR05FRCkuZ2V0VW5zaWduZWRNaW4oKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgdGhlIG1heCBvZiB0aGUgdW5zaWduZWQgcmFuZ2UgZm9yIGEgcGFydGljdWxhciBTQ0VWLgorICBBUEludCBnZXRVbnNpZ25lZFJhbmdlTWF4KGNvbnN0IFNDRVYgKlMpIHsKKyAgICByZXR1cm4gZ2V0UmFuZ2VSZWYoUywgSElOVF9SQU5HRV9VTlNJR05FRCkuZ2V0VW5zaWduZWRNYXgoKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgdGhlIHNpZ25lZCByYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIFNDRVYuCisgIC8vLyBOT1RFOiBUaGlzIHJldHVybnMgYSBjb3B5IG9mIHRoZSByZWZlcmVuY2UgcmV0dXJuZWQgYnkgZ2V0UmFuZ2VSZWYuCisgIENvbnN0YW50UmFuZ2UgZ2V0U2lnbmVkUmFuZ2UoY29uc3QgU0NFViAqUykgeworICAgIHJldHVybiBnZXRSYW5nZVJlZihTLCBISU5UX1JBTkdFX1NJR05FRCk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHRoZSBtaW4gb2YgdGhlIHNpZ25lZCByYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIFNDRVYuCisgIEFQSW50IGdldFNpZ25lZFJhbmdlTWluKGNvbnN0IFNDRVYgKlMpIHsKKyAgICByZXR1cm4gZ2V0UmFuZ2VSZWYoUywgSElOVF9SQU5HRV9TSUdORUQpLmdldFNpZ25lZE1pbigpOworICB9CisKKyAgLy8vIERldGVybWluZSB0aGUgbWF4IG9mIHRoZSBzaWduZWQgcmFuZ2UgZm9yIGEgcGFydGljdWxhciBTQ0VWLgorICBBUEludCBnZXRTaWduZWRSYW5nZU1heChjb25zdCBTQ0VWICpTKSB7CisgICAgcmV0dXJuIGdldFJhbmdlUmVmKFMsIEhJTlRfUkFOR0VfU0lHTkVEKS5nZXRTaWduZWRNYXgoKTsKKyAgfQorCisgIC8vLyBUZXN0IGlmIHRoZSBnaXZlbiBleHByZXNzaW9uIGlzIGtub3duIHRvIGJlIG5lZ2F0aXZlLgorICBib29sIGlzS25vd25OZWdhdGl2ZShjb25zdCBTQ0VWICpTKTsKKworICAvLy8gVGVzdCBpZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBpcyBrbm93biB0byBiZSBwb3NpdGl2ZS4KKyAgYm9vbCBpc0tub3duUG9zaXRpdmUoY29uc3QgU0NFViAqUyk7CisKKyAgLy8vIFRlc3QgaWYgdGhlIGdpdmVuIGV4cHJlc3Npb24gaXMga25vd24gdG8gYmUgbm9uLW5lZ2F0aXZlLgorICBib29sIGlzS25vd25Ob25OZWdhdGl2ZShjb25zdCBTQ0VWICpTKTsKKworICAvLy8gVGVzdCBpZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBpcyBrbm93biB0byBiZSBub24tcG9zaXRpdmUuCisgIGJvb2wgaXNLbm93bk5vblBvc2l0aXZlKGNvbnN0IFNDRVYgKlMpOworCisgIC8vLyBUZXN0IGlmIHRoZSBnaXZlbiBleHByZXNzaW9uIGlzIGtub3duIHRvIGJlIG5vbi16ZXJvLgorICBib29sIGlzS25vd25Ob25aZXJvKGNvbnN0IFNDRVYgKlMpOworCisgIC8vLyBTcGxpdHMgU0NFViBleHByZXNzaW9uIFxwIFMgaW50byB0d28gU0NFVnMuIE9uZSBvZiB0aGVtIGlzIG9idGFpbmVkIGZyb20KKyAgLy8vIFxwIFMgYnkgc3Vic3RpdHV0aW9uIG9mIGFsbCBBZGRSZWMgc3ViLWV4cHJlc3Npb24gcmVsYXRlZCB0byBsb29wIFxwIEwKKyAgLy8vIHdpdGggaW5pdGlhbCB2YWx1ZSBvZiB0aGF0IFNDRVYuIFRoZSBzZWNvbmQgaXMgb2J0YWluZWQgZnJvbSBccCBTIGJ5CisgIC8vLyBzdWJzdGl0dXRpb24gb2YgYWxsIEFkZFJlYyBzdWItZXhwcmVzc2lvbnMgcmVsYXRlZCB0byBsb29wIFxwIEwgd2l0aCBwb3N0CisgIC8vLyBpbmNyZW1lbnQgb2YgdGhpcyBBZGRSZWMgaW4gdGhlIGxvb3AgXHAgTC4gSW4gYm90aCBjYXNlcyBhbGwgb3RoZXIgQWRkUmVjCisgIC8vLyBzdWItZXhwcmVzc2lvbnMgKG5vdCByZWxhdGVkIHRvIFxwIEwpIHJlbWFpbiB0aGUgc2FtZS4KKyAgLy8vIElmIHRoZSBccCBTIGNvbnRhaW5zIG5vbi1pbnZhcmlhbnQgdW5rbm93biBTQ0VWIHRoZSBmdW5jdGlvbiByZXR1cm5zCisgIC8vLyBDb3VsZE5vdENvbXB1dGUgU0NFViBpbiBib3RoIHZhbHVlcyBvZiBzdGQ6OnBhaXIuCisgIC8vLyBGb3IgZXhhbXBsZSwgZm9yIFNDRVYgUz17MCwgKywgMX08TDE+ICsgezAsICssIDF9PEwyPiBhbmQgbG9vcCBMPUwxCisgIC8vLyB0aGUgZnVuY3Rpb24gcmV0dXJucyBwYWlyOgorICAvLy8gZmlyc3QgPSB7MCwgKywgMX08TDI+CisgIC8vLyBzZWNvbmQgPSB7MSwgKywgMX08TDE+ICsgezAsICssIDF9PEwyPgorICAvLy8gV2UgY2FuIHNlZSB0aGF0IGZvciB0aGUgZmlyc3QgQWRkUmVjIHN1Yi1leHByZXNzaW9uIGl0IHdhcyByZXBsYWNlZCB3aXRoCisgIC8vLyAwIChpbml0aWFsIHZhbHVlKSBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIHRvIHsxLCArLCAxfTxMMT4gKHBvc3QKKyAgLy8vIGluY3JlbWVudCB2YWx1ZSkgZm9yIHRoZSBzZWNvbmQgb25lLiBJbiBib3RoIGNhc2VzIEFkZFJlYyBleHByZXNzaW9uCisgIC8vLyByZWxhdGVkIHRvIEwyIHJlbWFpbnMgdGhlIHNhbWUuCisgIHN0ZDo6cGFpcjxjb25zdCBTQ0VWICosIGNvbnN0IFNDRVYgKj4gU3BsaXRJbnRvSW5pdEFuZFBvc3RJbmMoY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpTKTsKKworICAvLy8gV2UnZCBsaWtlIHRvIGNoZWNrIHRoZSBwcmVkaWNhdGUgb24gZXZlcnkgaXRlcmF0aW9uIG9mIHRoZSBtb3N0IGRvbWluYXRlZAorICAvLy8gbG9vcCBiZXR3ZWVuIGxvb3BzIHVzZWQgaW4gTEhTIGFuZCBSSFMuCisgIC8vLyBUbyBkbyB0aGlzIHdlIHVzZSB0aGUgZm9sbG93aW5nIGxpc3Qgb2Ygc3RlcHM6CisgIC8vLyAxLiBDb2xsZWN0IHNldCBTIGFsbCBsb29wcyBvbiB3aGljaCBlaXRoZXIgTEhTIG9yIFJIUyBkZXBlbmQuCisgIC8vLyAyLiBJZiBTIGlzIG5vbi1lbXB0eQorICAvLy8gYS4gTGV0IFBEIGJlIHRoZSBlbGVtZW50IG9mIFMgd2hpY2ggaXMgZG9taW5hdGVkIGJ5IGFsbCBvdGhlciBlbGVtZW50cy4KKyAgLy8vIGIuIExldCBFKExIUykgYmUgdmFsdWUgb2YgTEhTIG9uIGVudHJ5IG9mIFBELgorICAvLy8gICAgVG8gZ2V0IEUoTEhTKSwgd2Ugc2hvdWxkIGp1c3QgdGFrZSBMSFMgYW5kIHJlcGxhY2UgYWxsIEFkZFJlY3MgdGhhdCBhcmUKKyAgLy8vICAgIGF0dGFjaGVkIHRvIFBEIG9uIHdpdGggdGhlaXIgZW50cnkgdmFsdWVzLgorICAvLy8gICAgRGVmaW5lIEUoUkhTKSBpbiB0aGUgc2FtZSB3YXkuCisgIC8vLyBjLiBMZXQgQihMSFMpIGJlIHZhbHVlIG9mIEwgb24gYmFja2VkZ2Ugb2YgUEQuCisgIC8vLyAgICBUbyBnZXQgQihMSFMpLCB3ZSBzaG91bGQganVzdCB0YWtlIExIUyBhbmQgcmVwbGFjZSBhbGwgQWRkUmVjcyB0aGF0IGFyZQorICAvLy8gICAgYXR0YWNoZWQgdG8gUEQgb24gd2l0aCB0aGVpciBiYWNrZWRnZSB2YWx1ZXMuCisgIC8vLyAgICBEZWZpbmUgQihSSFMpIGluIHRoZSBzYW1lIHdheS4KKyAgLy8vIGQuIE5vdGUgdGhhdCBFKExIUykgYW5kIEUoUkhTKSBhcmUgYXV0b21hdGljYWxseSBhdmFpbGFibGUgb24gZW50cnkgb2YgUEQsCisgIC8vLyAgICBzbyB3ZSBjYW4gYXNzZXJ0IG9uIHRoYXQuCisgIC8vLyBlLiBSZXR1cm4gdHJ1ZSBpZiBpc0xvb3BFbnRyeUd1YXJkZWRCeUNvbmQoUHJlZCwgRShMSFMpLCBFKFJIUykpICYmCisgIC8vLyAgICAgICAgICAgICAgICAgICBpc0xvb3BCYWNrZWRnZUd1YXJkZWRCeUNvbmQoUHJlZCwgQihMSFMpLCBCKFJIUykpCisgIGJvb2wgaXNLbm93blZpYUluZHVjdGlvbihJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsIGNvbnN0IFNDRVYgKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlJIUyk7CisKKyAgLy8vIFRlc3QgaWYgdGhlIGdpdmVuIGV4cHJlc3Npb24gaXMga25vd24gdG8gc2F0aXNmeSB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZAorICAvLy8gYnkgUHJlZCwgTEhTLCBhbmQgUkhTLgorICBib29sIGlzS25vd25QcmVkaWNhdGUoSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLCBjb25zdCBTQ0VWICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpSSFMpOworCisgIC8vLyBUZXN0IGlmIHRoZSBjb25kaXRpb24gZGVzY3JpYmVkIGJ5IFByZWQsIExIUywgUkhTIGlzIGtub3duIHRvIGJlIHRydWUgb24KKyAgLy8vIGV2ZXJ5IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCBvZiB0aGUgcmVjdXJyZW5jeSBMSFMuCisgIGJvb2wgaXNLbm93bk9uRXZlcnlJdGVyYXRpb24oSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVZBZGRSZWNFeHByICpMSFMsIGNvbnN0IFNDRVYgKlJIUyk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmLCBmb3IgYWxsIGxvb3AgaW52YXJpYW50IFgsIHRoZSBwcmVkaWNhdGUgIkxIUyBgUHJlZGAgWCIKKyAgLy8vIGlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBvciBkZWNyZWFzaW5nLiAgSW4gdGhlIGZvcm1lciBjYXNlIHNldAorICAvLy8gYEluY3JlYXNpbmdgIHRvIHRydWUgYW5kIGluIHRoZSBsYXR0ZXIgY2FzZSBzZXQgYEluY3JlYXNpbmdgIHRvIGZhbHNlLgorICAvLy8KKyAgLy8vIEEgcHJlZGljYXRlIGlzIHNhaWQgdG8gYmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIGlmIG1heSBnbyBmcm9tIGJlaW5nCisgIC8vLyBmYWxzZSB0byBiZWluZyB0cnVlIGFzIHRoZSBsb29wIGl0ZXJhdGVzLCBidXQgbmV2ZXIgdGhlIG90aGVyIHdheQorICAvLy8gYXJvdW5kLiAgQSBwcmVkaWNhdGUgaXMgc2FpZCB0byBiZSBtb25vdG9uaWNhbGx5IGRlY3JlYXNpbmcgaWYgbWF5IGdvCisgIC8vLyBmcm9tIGJlaW5nIHRydWUgdG8gYmVpbmcgZmFsc2UgYXMgdGhlIGxvb3AgaXRlcmF0ZXMsIGJ1dCBuZXZlciB0aGUgb3RoZXIKKyAgLy8vIHdheSBhcm91bmQuCisgIGJvb2wgaXNNb25vdG9uaWNQcmVkaWNhdGUoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkxIUywgSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkluY3JlYXNpbmcpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzdWx0IG9mIHRoZSBwcmVkaWNhdGUgTEhTIGBQcmVkYCBSSFMgaXMgbG9vcAorICAvLy8gaW52YXJpYW50IHdpdGggcmVzcGVjdCB0byBMLiAgU2V0IEludmFyaWFudFByZWQsIEludmFyaWFudExIUyBhbmQKKyAgLy8vIEludmFyaWFudExIUyBzbyB0aGF0IEludmFyaWFudExIUyBgSW52YXJpYW50UHJlZGAgSW52YXJpYW50UkhTIGlzIHRoZQorICAvLy8gbG9vcCBpbnZhcmlhbnQgZm9ybSBvZiBMSFMgYFByZWRgIFJIUy4KKyAgYm9vbCBpc0xvb3BJbnZhcmlhbnRQcmVkaWNhdGUoSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLCBjb25zdCBTQ0VWICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlJIUywgY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3Q6OlByZWRpY2F0ZSAmSW52YXJpYW50UHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqJkludmFyaWFudExIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqJkludmFyaWFudFJIUyk7CisKKyAgLy8vIFNpbXBsaWZ5IExIUyBhbmQgUkhTIGluIGEgY29tcGFyaXNvbiB3aXRoIHByZWRpY2F0ZSBQcmVkLiBSZXR1cm4gdHJ1ZQorICAvLy8gaWZmIGFueSBjaGFuZ2VzIHdlcmUgbWFkZS4gSWYgdGhlIG9wZXJhbmRzIGFyZSBwcm92YWJseSBlcXVhbCBvcgorICAvLy8gdW5lcXVhbCwgTEhTIGFuZCBSSFMgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZSBhbmQgUHJlZCBpcyBzZXQgdG8gZWl0aGVyCisgIC8vLyBJQ01QX0VRIG9yIElDTVBfTkUuCisgIGJvb2wgU2ltcGxpZnlJQ21wT3BlcmFuZHMoSUNtcEluc3Q6OlByZWRpY2F0ZSAmUHJlZCwgY29uc3QgU0NFViAqJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWIComUkhTLCB1bnNpZ25lZCBEZXB0aCA9IDApOworCisgIC8vLyBSZXR1cm4gdGhlICJkaXNwb3NpdGlvbiIgb2YgdGhlIGdpdmVuIFNDRVYgd2l0aCByZXNwZWN0IHRvIHRoZSBnaXZlbgorICAvLy8gbG9vcC4KKyAgTG9vcERpc3Bvc2l0aW9uIGdldExvb3BEaXNwb3NpdGlvbihjb25zdCBTQ0VWICpTLCBjb25zdCBMb29wICpMKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBTQ0VWIGlzIHVuY2hhbmdpbmcgaW4gdGhlCisgIC8vLyBzcGVjaWZpZWQgbG9vcC4KKyAgYm9vbCBpc0xvb3BJbnZhcmlhbnQoY29uc3QgU0NFViAqUywgY29uc3QgTG9vcCAqTCk7CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgU0NFViBjYW4gYmUgZXZhbHVhdGVkIGF0IGxvb3AncyBlbnRyeS4gSXQgaXMgdHJ1ZSBpZiBpdAorICAvLy8gZG9lc24ndCBkZXBlbmQgb24gYSBTQ0VWVW5rbm93biBvZiBhbiBpbnN0cnVjdGlvbiB3aGljaCBpcyBkb21pbmF0ZWQgYnkKKyAgLy8vIHRoZSBoZWFkZXIgb2YgbG9vcCBMLgorICBib29sIGlzQXZhaWxhYmxlQXRMb29wRW50cnkoY29uc3QgU0NFViAqUywgY29uc3QgTG9vcCAqTCk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBTQ0VWIGNoYW5nZXMgdmFsdWUgaW4gYSBrbm93biB3YXkgaW4gdGhlCisgIC8vLyBzcGVjaWZpZWQgbG9vcC4gIFRoaXMgcHJvcGVydHkgYmVpbmcgdHJ1ZSBpbXBsaWVzIHRoYXQgdGhlIHZhbHVlIGlzCisgIC8vLyB2YXJpYW50IGluIHRoZSBsb29wIEFORCB0aGF0IHdlIGNhbiBlbWl0IGFuIGV4cHJlc3Npb24gdG8gY29tcHV0ZSB0aGUKKyAgLy8vIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGF0IGFueSBwYXJ0aWN1bGFyIGxvb3AgaXRlcmF0aW9uLgorICBib29sIGhhc0NvbXB1dGFibGVMb29wRXZvbHV0aW9uKGNvbnN0IFNDRVYgKlMsIGNvbnN0IExvb3AgKkwpOworCisgIC8vLyBSZXR1cm4gdGhlICJkaXNwb3NpdGlvbiIgb2YgdGhlIGdpdmVuIFNDRVYgd2l0aCByZXNwZWN0IHRvIHRoZSBnaXZlbgorICAvLy8gYmxvY2suCisgIEJsb2NrRGlzcG9zaXRpb24gZ2V0QmxvY2tEaXNwb3NpdGlvbihjb25zdCBTQ0VWICpTLCBjb25zdCBCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGVsZW1lbnRzIHRoYXQgbWFrZXMgdXAgdGhlIGdpdmVuIFNDRVYgZG9taW5hdGUgdGhlCisgIC8vLyBzcGVjaWZpZWQgYmFzaWMgYmxvY2suCisgIGJvb2wgZG9taW5hdGVzKGNvbnN0IFNDRVYgKlMsIGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgZWxlbWVudHMgdGhhdCBtYWtlcyB1cCB0aGUgZ2l2ZW4gU0NFViBwcm9wZXJseSBkb21pbmF0ZQorICAvLy8gdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jay4KKyAgYm9vbCBwcm9wZXJseURvbWluYXRlcyhjb25zdCBTQ0VWICpTLCBjb25zdCBCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gU0NFViBoYXMgT3AgYXMgYSBkaXJlY3Qgb3IgaW5kaXJlY3Qgb3BlcmFuZC4KKyAgYm9vbCBoYXNPcGVyYW5kKGNvbnN0IFNDRVYgKlMsIGNvbnN0IFNDRVYgKk9wKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBzaXplIG9mIGFuIGVsZW1lbnQgcmVhZCBvciB3cml0dGVuIGJ5IEluc3QuCisgIGNvbnN0IFNDRVYgKmdldEVsZW1lbnRTaXplKEluc3RydWN0aW9uICpJbnN0KTsKKworICAvLy8gQ29tcHV0ZSB0aGUgYXJyYXkgZGltZW5zaW9ucyBTaXplcyBmcm9tIHRoZSBzZXQgb2YgVGVybXMgZXh0cmFjdGVkIGZyb20KKyAgLy8vIHRoZSBtZW1vcnkgYWNjZXNzIGZ1bmN0aW9uIG9mIHRoaXMgU0NFVkFkZFJlY0V4cHIgKHNlY29uZCBzdGVwIG9mCisgIC8vLyBkZWxpbmVhcml6YXRpb24pLgorICB2b2lkIGZpbmRBcnJheURpbWVuc2lvbnMoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJlRlcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJlNpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRWxlbWVudFNpemUpOworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgdm9pZCB2ZXJpZnkoKSBjb25zdDsKKyAgYm9vbCBpbnZhbGlkYXRlKEZ1bmN0aW9uICZGLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmUEEsCisgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJkludik7CisKKyAgLy8vIENvbGxlY3QgcGFyYW1ldHJpYyB0ZXJtcyBvY2N1cnJpbmcgaW4gc3RlcCBleHByZXNzaW9ucyAoZmlyc3Qgc3RlcCBvZgorICAvLy8gZGVsaW5lYXJpemF0aW9uKS4KKyAgdm9pZCBjb2xsZWN0UGFyYW1ldHJpY1Rlcm1zKGNvbnN0IFNDRVYgKkV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPiAmVGVybXMpOworCisgIC8vLyBSZXR1cm4gaW4gU3Vic2NyaXB0cyB0aGUgYWNjZXNzIGZ1bmN0aW9ucyBmb3IgZWFjaCBkaW1lbnNpb24gaW4gU2l6ZXMKKyAgLy8vICh0aGlyZCBzdGVwIG9mIGRlbGluZWFyaXphdGlvbikuCisgIHZvaWQgY29tcHV0ZUFjY2Vzc0Z1bmN0aW9ucyhjb25zdCBTQ0VWICpFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJlN1YnNjcmlwdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPiAmU2l6ZXMpOworCisgIC8vLyBTcGxpdCB0aGlzIFNDRVZBZGRSZWNFeHByIGludG8gdHdvIHZlY3RvcnMgb2YgU0NFVnMgcmVwcmVzZW50aW5nIHRoZQorICAvLy8gc3Vic2NyaXB0cyBhbmQgc2l6ZXMgb2YgYW4gYXJyYXkgYWNjZXNzLgorICAvLy8KKyAgLy8vIFRoZSBkZWxpbmVhcml6YXRpb24gaXMgYSAzIHN0ZXAgcHJvY2VzczogdGhlIGZpcnN0IHR3byBzdGVwcyBjb21wdXRlIHRoZQorICAvLy8gc2l6ZXMgb2YgZWFjaCBzdWJzY3JpcHQgYW5kIHRoZSB0aGlyZCBzdGVwIGNvbXB1dGVzIHRoZSBhY2Nlc3MgZnVuY3Rpb25zCisgIC8vLyBmb3IgdGhlIGRlbGluZWFyaXplZCBhcnJheToKKyAgLy8vCisgIC8vLyAxLiBGaW5kIHRoZSB0ZXJtcyBpbiB0aGUgc3RlcCBmdW5jdGlvbnMKKyAgLy8vIDIuIENvbXB1dGUgdGhlIGFycmF5IHNpemUKKyAgLy8vIDMuIENvbXB1dGUgdGhlIGFjY2VzcyBmdW5jdGlvbjogZGl2aWRlIHRoZSBTQ0VWIGJ5IHRoZSBhcnJheSBzaXplCisgIC8vLyAgICBzdGFydGluZyB3aXRoIHRoZSBpbm5lcm1vc3QgZGltZW5zaW9ucyBmb3VuZCBpbiBzdGVwIDIuIFRoZSBRdW90aWVudAorICAvLy8gICAgaXMgdGhlIFNDRVYgdG8gYmUgZGl2aWRlZCBpbiB0aGUgbmV4dCBzdGVwIG9mIHRoZSByZWN1cnNpb24uIFRoZQorICAvLy8gICAgUmVtYWluZGVyIGlzIHRoZSBzdWJzY3JpcHQgb2YgdGhlIGlubmVybW9zdCBkaW1lbnNpb24uIExvb3Agb3ZlciBhbGwKKyAgLy8vICAgIGFycmF5IGRpbWVuc2lvbnMgY29tcHV0ZWQgaW4gc3RlcCAyLgorICAvLy8KKyAgLy8vIFRvIGNvbXB1dGUgYSB1bmlmb3JtIGFycmF5IHNpemUgZm9yIHNldmVyYWwgbWVtb3J5IGFjY2Vzc2VzIHRvIHRoZSBzYW1lCisgIC8vLyBvYmplY3QsIG9uZSBjYW4gY29sbGVjdCBpbiBzdGVwIDEgYWxsIHRoZSBzdGVwIHRlcm1zIGZvciBhbGwgdGhlIG1lbW9yeQorICAvLy8gYWNjZXNzZXMsIGFuZCBjb21wdXRlIGluIHN0ZXAgMiBhIHVuaXF1ZSBhcnJheSBzaGFwZS4gVGhpcyBndWFyYW50ZWVzCisgIC8vLyB0aGF0IHRoZSBhcnJheSBzaGFwZSB3aWxsIGJlIHRoZSBzYW1lIGFjcm9zcyBhbGwgbWVtb3J5IGFjY2Vzc2VzLgorICAvLy8KKyAgLy8vIEZJWE1FOiBXZSBjb3VsZCBkZXJpdmUgdGhlIHJlc3VsdCBvZiBzdGVwcyAxIGFuZCAyIGZyb20gYSBkZXNjcmlwdGlvbiBvZgorICAvLy8gdGhlIGFycmF5IHNoYXBlIGdpdmVuIGluIG1ldGFkYXRhLgorICAvLy8KKyAgLy8vIEV4YW1wbGU6CisgIC8vLworICAvLy8gQVtdW25dW21dCisgIC8vLworICAvLy8gZm9yIGkKKyAgLy8vICAgZm9yIGoKKyAgLy8vICAgICBmb3IgaworICAvLy8gICAgICAgQVtqK2tdWzJpXVs1aV0gPQorICAvLy8KKyAgLy8vIFRoZSBpbml0aWFsIFNDRVY6CisgIC8vLworICAvLy8gQVt7e3swLCssMiptKzV9X2ksICssIG4qbX1faiwgKywgbiptfV9rXQorICAvLy8KKyAgLy8vIDEuIEZpbmQgdGhlIGRpZmZlcmVudCB0ZXJtcyBpbiB0aGUgc3RlcCBmdW5jdGlvbnM6CisgIC8vLyAtPiBbMiptLCA1LCBuKm0sIG4qbV0KKyAgLy8vCisgIC8vLyAyLiBDb21wdXRlIHRoZSBhcnJheSBzaXplOiBzb3J0IGFuZCB1bmlxdWUgdGhlbQorICAvLy8gLT4gW24qbSwgMiptLCA1XQorICAvLy8gZmluZCB0aGUgR0NEIG9mIGFsbCB0aGUgdGVybXMgPSAxCisgIC8vLyBkaXZpZGUgYnkgdGhlIEdDRCBhbmQgZXJhc2UgY29uc3RhbnQgdGVybXMKKyAgLy8vIC0+IFtuKm0sIDIqbV0KKyAgLy8vIEdDRCA9IG0KKyAgLy8vIGRpdmlkZSBieSBHQ0QgLT4gW24sIDJdCisgIC8vLyByZW1vdmUgY29uc3RhbnQgdGVybXMKKyAgLy8vIC0+IFtuXQorICAvLy8gc2l6ZSBvZiB0aGUgYXJyYXkgaXMgQVt1bmtub3duXVtuXVttXQorICAvLy8KKyAgLy8vIDMuIENvbXB1dGUgdGhlIGFjY2VzcyBmdW5jdGlvbgorICAvLy8gYS4gRGl2aWRlIHt7ezAsKywyKm0rNX1faSwgKywgbiptfV9qLCArLCBuKm19X2sgYnkgdGhlIGlubmVybW9zdCBzaXplIG0KKyAgLy8vIFF1b3RpZW50OiB7e3swLCssMn1faSwgKywgbn1faiwgKywgbn1faworICAvLy8gUmVtYWluZGVyOiB7e3swLCssNX1faSwgKywgMH1faiwgKywgMH1faworICAvLy8gVGhlIHJlbWFpbmRlciBpcyB0aGUgc3Vic2NyaXB0IG9mIHRoZSBpbm5lcm1vc3QgYXJyYXkgZGltZW5zaW9uOiBbNWldLgorICAvLy8KKyAgLy8vIGIuIERpdmlkZSBRdW90aWVudDoge3t7MCwrLDJ9X2ksICssIG59X2osICssIG59X2sgYnkgbmV4dCBvdXRlciBzaXplIG4KKyAgLy8vIFF1b3RpZW50OiB7e3swLCssMH1faSwgKywgMX1faiwgKywgMX1faworICAvLy8gUmVtYWluZGVyOiB7e3swLCssMn1faSwgKywgMH1faiwgKywgMH1faworICAvLy8gVGhlIFJlbWFpbmRlciBpcyB0aGUgc3Vic2NyaXB0IG9mIHRoZSBuZXh0IGFycmF5IGRpbWVuc2lvbjogWzJpXS4KKyAgLy8vCisgIC8vLyBUaGUgc3Vic2NyaXB0IG9mIHRoZSBvdXRlcm1vc3QgZGltZW5zaW9uIGlzIHRoZSBRdW90aWVudDogW2ora10uCisgIC8vLworICAvLy8gT3ZlcmFsbCwgd2UgaGF2ZTogQVtdW25dW21dLCBhbmQgdGhlIGFjY2VzcyBmdW5jdGlvbjogQVtqK2tdWzJpXVs1aV0uCisgIHZvaWQgZGVsaW5lYXJpemUoY29uc3QgU0NFViAqRXhwciwgU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJlN1YnNjcmlwdHMsCisgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJlNpemVzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkVsZW1lbnRTaXplKTsKKworICAvLy8gUmV0dXJuIHRoZSBEYXRhTGF5b3V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kdWxlIHRoaXMgU0NFViBpbnN0YW5jZSBpcworICAvLy8gb3BlcmF0aW5nIG9uLgorICBjb25zdCBEYXRhTGF5b3V0ICZnZXREYXRhTGF5b3V0KCkgY29uc3QgeworICAgIHJldHVybiBGLmdldFBhcmVudCgpLT5nZXREYXRhTGF5b3V0KCk7CisgIH0KKworICBjb25zdCBTQ0VWUHJlZGljYXRlICpnZXRFcXVhbFByZWRpY2F0ZShjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUyk7CisKKyAgY29uc3QgU0NFVlByZWRpY2F0ZSAqCisgIGdldFdyYXBQcmVkaWNhdGUoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFSLAorICAgICAgICAgICAgICAgICAgIFNDRVZXcmFwUHJlZGljYXRlOjpJbmNyZW1lbnRXcmFwRmxhZ3MgQWRkZWRGbGFncyk7CisKKyAgLy8vIFJlLXdyaXRlcyB0aGUgU0NFViBhY2NvcmRpbmcgdG8gdGhlIFByZWRpY2F0ZXMgaW4gXHAgQS4KKyAgY29uc3QgU0NFViAqcmV3cml0ZVVzaW5nUHJlZGljYXRlKGNvbnN0IFNDRVYgKlMsIGNvbnN0IExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0VWVW5pb25QcmVkaWNhdGUgJkEpOworICAvLy8gVHJpZXMgdG8gY29udmVydCB0aGUgXHAgUyBleHByZXNzaW9uIHRvIGFuIEFkZFJlYyBleHByZXNzaW9uLAorICAvLy8gYWRkaW5nIGFkZGl0aW9uYWwgcHJlZGljYXRlcyB0byBccCBQcmVkcyBhcyByZXF1aXJlZC4KKyAgY29uc3QgU0NFVkFkZFJlY0V4cHIgKmNvbnZlcnRTQ0VWVG9BZGRSZWNXaXRoUHJlZGljYXRlcygKKyAgICAgIGNvbnN0IFNDRVYgKlMsIGNvbnN0IExvb3AgKkwsCisgICAgICBTbWFsbFB0clNldEltcGw8Y29uc3QgU0NFVlByZWRpY2F0ZSAqPiAmUHJlZHMpOworCitwcml2YXRlOgorICAvLy8gQSBDYWxsYmFja1ZIIHRvIGFycmFuZ2UgZm9yIFNjYWxhckV2b2x1dGlvbiB0byBiZSBub3RpZmllZCB3aGVuZXZlciBhCisgIC8vLyBWYWx1ZSBpcyBkZWxldGVkLgorICBjbGFzcyBTQ0VWQ2FsbGJhY2tWSCBmaW5hbCA6IHB1YmxpYyBDYWxsYmFja1ZIIHsKKyAgICBTY2FsYXJFdm9sdXRpb24gKlNFOworCisgICAgdm9pZCBkZWxldGVkKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBhbGxVc2VzUmVwbGFjZWRXaXRoKFZhbHVlICpOZXcpIG92ZXJyaWRlOworCisgIHB1YmxpYzoKKyAgICBTQ0VWQ2FsbGJhY2tWSChWYWx1ZSAqViwgU2NhbGFyRXZvbHV0aW9uICpTRSA9IG51bGxwdHIpOworICB9OworCisgIGZyaWVuZCBjbGFzcyBTQ0VWQ2FsbGJhY2tWSDsKKyAgZnJpZW5kIGNsYXNzIFNDRVZFeHBhbmRlcjsKKyAgZnJpZW5kIGNsYXNzIFNDRVZVbmtub3duOworCisgIC8vLyBUaGUgZnVuY3Rpb24gd2UgYXJlIGFuYWx5emluZy4KKyAgRnVuY3Rpb24gJkY7CisKKyAgLy8vIERvZXMgdGhlIG1vZHVsZSBoYXZlIGFueSBjYWxscyB0byB0aGUgbGx2bS5leHBlcmltZW50YWwuZ3VhcmQgaW50cmluc2ljCisgIC8vLyBhdCBhbGw/ICBJZiB0aGlzIGlzIGZhbHNlLCB3ZSBhdm9pZCBkb2luZyB3b3JrIHRoYXQgd2lsbCBvbmx5IGhlbHAgaWYKKyAgLy8vIHRoYXJlIGFyZSBndWFyZHMgcHJlc2VudCBpbiB0aGUgSVIuCisgIGJvb2wgSGFzR3VhcmRzOworCisgIC8vLyBUaGUgdGFyZ2V0IGxpYnJhcnkgaW5mb3JtYXRpb24gZm9yIHRoZSB0YXJnZXQgd2UgYXJlIHRhcmdldGluZy4KKyAgVGFyZ2V0TGlicmFyeUluZm8gJlRMSTsKKworICAvLy8gVGhlIHRyYWNrZXIgZm9yIEBsbHZtLmFzc3VtZSBpbnRyaW5zaWNzIGluIHRoaXMgZnVuY3Rpb24uCisgIEFzc3VtcHRpb25DYWNoZSAmQUM7CisKKyAgLy8vIFRoZSBkb21pbmF0b3IgdHJlZS4KKyAgRG9taW5hdG9yVHJlZSAmRFQ7CisKKyAgLy8vIFRoZSBsb29wIGluZm9ybWF0aW9uIGZvciB0aGUgZnVuY3Rpb24gd2UgYXJlIGN1cnJlbnRseSBhbmFseXppbmcuCisgIExvb3BJbmZvICZMSTsKKworICAvLy8gVGhpcyBTQ0VWIGlzIHVzZWQgdG8gcmVwcmVzZW50IHVua25vd24gdHJpcCBjb3VudHMgYW5kIHRoaW5ncy4KKyAgc3RkOjp1bmlxdWVfcHRyPFNDRVZDb3VsZE5vdENvbXB1dGU+IENvdWxkTm90Q29tcHV0ZTsKKworICAvLy8gVGhlIHR5cGUgZm9yIEhhc1JlY01hcC4KKyAgdXNpbmcgSGFzUmVjTWFwVHlwZSA9IERlbnNlTWFwPGNvbnN0IFNDRVYgKiwgYm9vbD47CisKKyAgLy8vIFRoaXMgaXMgYSBjYWNoZSB0byByZWNvcmQgd2hldGhlciBhIFNDRVYgY29udGFpbnMgYW55IHNjQWRkUmVjRXhwci4KKyAgSGFzUmVjTWFwVHlwZSBIYXNSZWNNYXA7CisKKyAgLy8vIFRoZSB0eXBlIGZvciBFeHByVmFsdWVNYXAuCisgIHVzaW5nIFZhbHVlT2Zmc2V0UGFpciA9IHN0ZDo6cGFpcjxWYWx1ZSAqLCBDb25zdGFudEludCAqPjsKKyAgdXNpbmcgRXhwclZhbHVlTWFwVHlwZSA9IERlbnNlTWFwPGNvbnN0IFNDRVYgKiwgU2V0VmVjdG9yPFZhbHVlT2Zmc2V0UGFpcj4+OworCisgIC8vLyBFeHByVmFsdWVNYXAgLS0gVGhpcyBtYXAgcmVjb3JkcyB0aGUgb3JpZ2luYWwgdmFsdWVzIGZyb20gd2hpY2gKKyAgLy8vIHRoZSBTQ0VWIGV4cHIgaXMgZ2VuZXJhdGVkIGZyb20uCisgIC8vLworICAvLy8gV2Ugd2FudCB0byByZXByZXNlbnQgdGhlIG1hcHBpbmcgYXMgU0NFViAtPiBWYWx1ZU9mZnNldFBhaXIgaW5zdGVhZAorICAvLy8gb2YgU0NFViAtPiBWYWx1ZToKKyAgLy8vIFN1cHBvc2Ugd2Uga25vdyBTMSBleHBhbmRzIHRvIFYxLCBhbmQKKyAgLy8vICBTMSA9IFMyICsgQ19hCisgIC8vLyAgUzMgPSBTMiArIENfYgorICAvLy8gd2hlcmUgQ19hIGFuZCBDX2IgYXJlIGRpZmZlcmVudCBTQ0VWQ29uc3RhbnRzLiBUaGVuIHdlJ2QgbGlrZSB0bworICAvLy8gZXhwYW5kIFMzIGFzIFYxIC0gQ19hICsgQ19iIGluc3RlYWQgb2YgZXhwYW5kaW5nIFMyIGxpdGVyYWxseS4KKyAgLy8vIEl0IGlzIGhlbHBmdWwgd2hlbiBTMiBpcyBhIGNvbXBsZXggU0NFViBleHByLgorICAvLy8KKyAgLy8vIEluIG9yZGVyIHRvIGRvIHRoYXQsIHdlIHJlcHJlc2VudCBFeHByVmFsdWVNYXAgYXMgYSBtYXBwaW5nIGZyb20KKyAgLy8vIFNDRVYgdG8gVmFsdWVPZmZzZXRQYWlyLiBXZSB3aWxsIHNhdmUgYm90aCBTMS0+e1YxLCAwfSBhbmQKKyAgLy8vIFMyLT57VjEsIENfYX0gaW50byB0aGUgbWFwIHdoZW4gd2UgY3JlYXRlIFNDRVYgZm9yIFYxLiBXaGVuIFMzCisgIC8vLyBpcyBleHBhbmRlZCwgaXQgd2lsbCBmaXJzdCBleHBhbmQgUzIgdG8gVjEgLSBDX2EgYmVjYXVzZSBvZgorICAvLy8gUzItPntWMSwgQ19hfSBpbiB0aGUgbWFwLCB0aGVuIGV4cGFuZCBTMyB0byBWMSAtIENfYSArIENfYi4KKyAgLy8vCisgIC8vLyBOb3RlOiBTLT57ViwgT2Zmc2V0fSBpbiB0aGUgRXhwclZhbHVlTWFwIG1lYW5zIFMgY2FuIGJlIGV4cGFuZGVkCisgIC8vLyB0byBWIC0gT2Zmc2V0LgorICBFeHByVmFsdWVNYXBUeXBlIEV4cHJWYWx1ZU1hcDsKKworICAvLy8gVGhlIHR5cGUgZm9yIFZhbHVlRXhwck1hcC4KKyAgdXNpbmcgVmFsdWVFeHByTWFwVHlwZSA9CisgICAgICBEZW5zZU1hcDxTQ0VWQ2FsbGJhY2tWSCwgY29uc3QgU0NFViAqLCBEZW5zZU1hcEluZm88VmFsdWUgKj4+OworCisgIC8vLyBUaGlzIGlzIGEgY2FjaGUgb2YgdGhlIHZhbHVlcyB3ZSBoYXZlIGFuYWx5emVkIHNvIGZhci4KKyAgVmFsdWVFeHByTWFwVHlwZSBWYWx1ZUV4cHJNYXA7CisKKyAgLy8vIE1hcmsgcHJlZGljYXRlIHZhbHVlcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkIGJ5IGlzSW1wbGllZENvbmQuCisgIFNtYWxsUHRyU2V0PFZhbHVlICosIDY+IFBlbmRpbmdMb29wUHJlZGljYXRlczsKKworICAvLy8gTWFyayBTQ0VWVW5rbm93biBQaGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQgYnkgZ2V0UmFuZ2VSZWYuCisgIFNtYWxsUHRyU2V0PGNvbnN0IFBISU5vZGUgKiwgNj4gUGVuZGluZ1BoaVJhbmdlczsKKworICAvLy8gU2V0IHRvIHRydWUgYnkgaXNMb29wQmFja2VkZ2VHdWFyZGVkQnlDb25kIHdoZW4gd2UncmUgd2Fsa2luZyB0aGUgc2V0IG9mCisgIC8vLyBjb25kaXRpb25zIGRvbWluYXRpbmcgdGhlIGJhY2tlZGdlIG9mIGEgbG9vcC4KKyAgYm9vbCBXYWxraW5nQkVEb21pbmF0aW5nQ29uZHMgPSBmYWxzZTsKKworICAvLy8gU2V0IHRvIHRydWUgYnkgaXNLbm93blByZWRpY2F0ZVZpYVNwbGl0dGluZyB3aGVuIHdlJ3JlIHRyeWluZyB0byBwcm92ZSBhCisgIC8vLyBwcmVkaWNhdGUgYnkgc3BsaXR0aW5nIGl0IGludG8gYSBzZXQgb2YgaW5kZXBlbmRlbnQgcHJlZGljYXRlcy4KKyAgYm9vbCBQcm92aW5nU3BsaXRQcmVkaWNhdGUgPSBmYWxzZTsKKworICAvLy8gTWVtb2l6ZWQgdmFsdWVzIGZvciB0aGUgR2V0TWluVHJhaWxpbmdaZXJvcworICBEZW5zZU1hcDxjb25zdCBTQ0VWICosIHVpbnQzMl90PiBNaW5UcmFpbGluZ1plcm9zQ2FjaGU7CisKKyAgLy8vIFJldHVybiB0aGUgVmFsdWUgc2V0IGZyb20gd2hpY2ggdGhlIFNDRVYgZXhwciBpcyBnZW5lcmF0ZWQuCisgIFNldFZlY3RvcjxWYWx1ZU9mZnNldFBhaXI+ICpnZXRTQ0VWVmFsdWVzKGNvbnN0IFNDRVYgKlMpOworCisgIC8vLyBQcml2YXRlIGhlbHBlciBtZXRob2QgZm9yIHRoZSBHZXRNaW5UcmFpbGluZ1plcm9zIG1ldGhvZAorICB1aW50MzJfdCBHZXRNaW5UcmFpbGluZ1plcm9zSW1wbChjb25zdCBTQ0VWICpTKTsKKworICAvLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIG51bWJlciBvZiBsb29wIGl0ZXJhdGlvbnMgZm9yIHdoaWNoIGEgbG9vcCBleGl0J3MKKyAgLy8vIGJyYW5jaCBjb25kaXRpb24gZXZhbHVhdGVzIHRvIHRoZSBub3QtdGFrZW4gcGF0aC4gIFRoaXMgaXMgYSB0ZW1wb3JhcnkKKyAgLy8vIHBhaXIgb2YgZXhhY3QgYW5kIG1heCBleHByZXNzaW9ucyB0aGF0IGFyZSBldmVudHVhbGx5IHN1bW1hcml6ZWQgaW4KKyAgLy8vIEV4aXROb3RUYWtlbkluZm8gYW5kIEJhY2tlZGdlVGFrZW5JbmZvLgorICBzdHJ1Y3QgRXhpdExpbWl0IHsKKyAgICBjb25zdCBTQ0VWICpFeGFjdE5vdFRha2VuOyAvLyBUaGUgZXhpdCBpcyBub3QgdGFrZW4gZXhhY3RseSB0aGlzIG1hbnkgdGltZXMKKyAgICBjb25zdCBTQ0VWICpNYXhOb3RUYWtlbjsgLy8gVGhlIGV4aXQgaXMgbm90IHRha2VuIGF0IG1vc3QgdGhpcyBtYW55IHRpbWVzCisKKyAgICAvLyBOb3QgdGFrZW4gZWl0aGVyIGV4YWN0bHkgTWF4Tm90VGFrZW4gb3IgemVybyB0aW1lcworICAgIGJvb2wgTWF4T3JaZXJvID0gZmFsc2U7CisKKyAgICAvLy8gQSBzZXQgb2YgcHJlZGljYXRlIGd1YXJkcyBmb3IgdGhpcyBFeGl0TGltaXQuIFRoZSByZXN1bHQgaXMgb25seSB2YWxpZAorICAgIC8vLyBpZiBhbGwgb2YgdGhlIHByZWRpY2F0ZXMgaW4gXGMgUHJlZGljYXRlcyBldmFsdWF0ZSB0byAndHJ1ZScgYXQKKyAgICAvLy8gcnVuLXRpbWUuCisgICAgU21hbGxQdHJTZXQ8Y29uc3QgU0NFVlByZWRpY2F0ZSAqLCA0PiBQcmVkaWNhdGVzOworCisgICAgdm9pZCBhZGRQcmVkaWNhdGUoY29uc3QgU0NFVlByZWRpY2F0ZSAqUCkgeworICAgICAgYXNzZXJ0KCFpc2E8U0NFVlVuaW9uUHJlZGljYXRlPihQKSAmJiAiT25seSBhZGQgbGVhZiBwcmVkaWNhdGVzIGhlcmUhIik7CisgICAgICBQcmVkaWNhdGVzLmluc2VydChQKTsKKyAgICB9CisKKyAgICAvKmltcGxpY2l0Ki8gRXhpdExpbWl0KGNvbnN0IFNDRVYgKkUpOworCisgICAgRXhpdExpbWl0KAorICAgICAgICBjb25zdCBTQ0VWICpFLCBjb25zdCBTQ0VWICpNLCBib29sIE1heE9yWmVybywKKyAgICAgICAgQXJyYXlSZWY8Y29uc3QgU21hbGxQdHJTZXRJbXBsPGNvbnN0IFNDRVZQcmVkaWNhdGUgKj4gKj4gUHJlZFNldExpc3QpOworCisgICAgRXhpdExpbWl0KGNvbnN0IFNDRVYgKkUsIGNvbnN0IFNDRVYgKk0sIGJvb2wgTWF4T3JaZXJvLAorICAgICAgICAgICAgICBjb25zdCBTbWFsbFB0clNldEltcGw8Y29uc3QgU0NFVlByZWRpY2F0ZSAqPiAmUHJlZFNldCk7CisKKyAgICBFeGl0TGltaXQoY29uc3QgU0NFViAqRSwgY29uc3QgU0NFViAqTSwgYm9vbCBNYXhPclplcm8pOworCisgICAgLy8vIFRlc3Qgd2hldGhlciB0aGlzIEV4aXRMaW1pdCBjb250YWlucyBhbnkgY29tcHV0ZWQgaW5mb3JtYXRpb24sIG9yCisgICAgLy8vIHdoZXRoZXIgaXQncyBhbGwgU0NFVkNvdWxkTm90Q29tcHV0ZSB2YWx1ZXMuCisgICAgYm9vbCBoYXNBbnlJbmZvKCkgY29uc3QgeworICAgICAgcmV0dXJuICFpc2E8U0NFVkNvdWxkTm90Q29tcHV0ZT4oRXhhY3ROb3RUYWtlbikgfHwKKyAgICAgICAgICAgICAhaXNhPFNDRVZDb3VsZE5vdENvbXB1dGU+KE1heE5vdFRha2VuKTsKKyAgICB9CisKKyAgICBib29sIGhhc09wZXJhbmQoY29uc3QgU0NFViAqUykgY29uc3Q7CisKKyAgICAvLy8gVGVzdCB3aGV0aGVyIHRoaXMgRXhpdExpbWl0IGNvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbi4KKyAgICBib29sIGhhc0Z1bGxJbmZvKCkgY29uc3QgeworICAgICAgcmV0dXJuICFpc2E8U0NFVkNvdWxkTm90Q29tcHV0ZT4oRXhhY3ROb3RUYWtlbik7CisgICAgfQorICB9OworCisgIC8vLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcGFydGljdWxhciBsb29wIGV4aXQgbWF5IGJlCisgIC8vLyByZWFjaGVkIGJlZm9yZSBleGl0aW5nIHRoZSBsb29wLgorICBzdHJ1Y3QgRXhpdE5vdFRha2VuSW5mbyB7CisgICAgUG9pc29uaW5nVkg8QmFzaWNCbG9jaz4gRXhpdGluZ0Jsb2NrOworICAgIGNvbnN0IFNDRVYgKkV4YWN0Tm90VGFrZW47CisgICAgc3RkOjp1bmlxdWVfcHRyPFNDRVZVbmlvblByZWRpY2F0ZT4gUHJlZGljYXRlOworCisgICAgZXhwbGljaXQgRXhpdE5vdFRha2VuSW5mbyhQb2lzb25pbmdWSDxCYXNpY0Jsb2NrPiBFeGl0aW5nQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpFeGFjdE5vdFRha2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFNDRVZVbmlvblByZWRpY2F0ZT4gUHJlZGljYXRlKQorICAgICAgICA6IEV4aXRpbmdCbG9jayhFeGl0aW5nQmxvY2spLCBFeGFjdE5vdFRha2VuKEV4YWN0Tm90VGFrZW4pLAorICAgICAgICAgIFByZWRpY2F0ZShzdGQ6Om1vdmUoUHJlZGljYXRlKSkge30KKworICAgIGJvb2wgaGFzQWx3YXlzVHJ1ZVByZWRpY2F0ZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhUHJlZGljYXRlIHx8IFByZWRpY2F0ZS0+aXNBbHdheXNUcnVlKCk7CisgICAgfQorICB9OworCisgIC8vLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFja2VkZ2UtdGFrZW4gY291bnQgb2YgYSBsb29wLiBUaGlzIGN1cnJlbnRseQorICAvLy8gaW5jbHVkZXMgYW4gZXhhY3QgY291bnQgYW5kIGEgbWF4aW11bSBjb3VudC4KKyAgLy8vCisgIGNsYXNzIEJhY2tlZGdlVGFrZW5JbmZvIHsKKyAgICAvLy8gQSBsaXN0IG9mIGNvbXB1dGFibGUgZXhpdHMgYW5kIHRoZWlyIG5vdC10YWtlbiBjb3VudHMuICBMb29wcyBhbG1vc3QKKyAgICAvLy8gbmV2ZXIgaGF2ZSBtb3JlIHRoYW4gb25lIGNvbXB1dGFibGUgZXhpdC4KKyAgICBTbWFsbFZlY3RvcjxFeGl0Tm90VGFrZW5JbmZvLCAxPiBFeGl0Tm90VGFrZW47CisKKyAgICAvLy8gVGhlIHBvaW50ZXIgcGFydCBvZiBcYyBNYXhBbmRDb21wbGV0ZSBpcyBhbiBleHByZXNzaW9uIGluZGljYXRpbmcgdGhlCisgICAgLy8vIGxlYXN0IG1heGltdW0gYmFja2VkZ2UtdGFrZW4gY291bnQgb2YgdGhlIGxvb3AgdGhhdCBpcyBrbm93biwgb3IgYQorICAgIC8vLyBTQ0VWQ291bGROb3RDb21wdXRlLiBUaGlzIGV4cHJlc3Npb24gaXMgb25seSB2YWxpZCBpZiB0aGUgcHJlZGljYXRlcworICAgIC8vLyBhc3NvY2lhdGVkIHdpdGggYWxsIGxvb3AgZXhpdHMgYXJlIHRydWUuCisgICAgLy8vCisgICAgLy8vIFRoZSBpbnRlZ2VyIHBhcnQgb2YgXGMgTWF4QW5kQ29tcGxldGUgaXMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgXGMKKyAgICAvLy8gRXhpdE5vdFRha2VuIGhhcyBhbiBlbGVtZW50IGZvciBldmVyeSBleGl0aW5nIGJsb2NrIGluIHRoZSBsb29wLgorICAgIFBvaW50ZXJJbnRQYWlyPGNvbnN0IFNDRVYgKiwgMT4gTWF4QW5kQ29tcGxldGU7CisKKyAgICAvLy8gVHJ1ZSBpZmYgdGhlIGJhY2tlZGdlIGlzIHRha2VuIGVpdGhlciBleGFjdGx5IE1heCBvciB6ZXJvIHRpbWVzLgorICAgIGJvb2wgTWF4T3JaZXJvID0gZmFsc2U7CisKKyAgICAvLy8gXG5hbWUgSGVscGVyIHByb2plY3Rpb24gZnVuY3Rpb25zIG9uIFxjIE1heEFuZENvbXBsZXRlLgorICAgIC8vLyBAeworICAgIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0IHsgcmV0dXJuIE1heEFuZENvbXBsZXRlLmdldEludCgpOyB9CisgICAgY29uc3QgU0NFViAqZ2V0TWF4KCkgY29uc3QgeyByZXR1cm4gTWF4QW5kQ29tcGxldGUuZ2V0UG9pbnRlcigpOyB9CisgICAgLy8vIEB9CisKKyAgcHVibGljOgorICAgIEJhY2tlZGdlVGFrZW5JbmZvKCkgOiBNYXhBbmRDb21wbGV0ZShudWxscHRyLCAwKSB7fQorICAgIEJhY2tlZGdlVGFrZW5JbmZvKEJhY2tlZGdlVGFrZW5JbmZvICYmKSA9IGRlZmF1bHQ7CisgICAgQmFja2VkZ2VUYWtlbkluZm8gJm9wZXJhdG9yPShCYWNrZWRnZVRha2VuSW5mbyAmJikgPSBkZWZhdWx0OworCisgICAgdXNpbmcgRWRnZUV4aXRJbmZvID0gc3RkOjpwYWlyPEJhc2ljQmxvY2sgKiwgRXhpdExpbWl0PjsKKworICAgIC8vLyBJbml0aWFsaXplIEJhY2tlZGdlVGFrZW5JbmZvIGZyb20gYSBsaXN0IG9mIGV4YWN0IGV4aXQgY291bnRzLgorICAgIEJhY2tlZGdlVGFrZW5JbmZvKFNtYWxsVmVjdG9ySW1wbDxFZGdlRXhpdEluZm8+ICYmRXhpdENvdW50cywgYm9vbCBDb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpNYXhDb3VudCwgYm9vbCBNYXhPclplcm8pOworCisgICAgLy8vIFRlc3Qgd2hldGhlciB0aGlzIEJhY2tlZGdlVGFrZW5JbmZvIGNvbnRhaW5zIGFueSBjb21wdXRlZCBpbmZvcm1hdGlvbiwKKyAgICAvLy8gb3Igd2hldGhlciBpdCdzIGFsbCBTQ0VWQ291bGROb3RDb21wdXRlIHZhbHVlcy4KKyAgICBib29sIGhhc0FueUluZm8oKSBjb25zdCB7CisgICAgICByZXR1cm4gIUV4aXROb3RUYWtlbi5lbXB0eSgpIHx8ICFpc2E8U0NFVkNvdWxkTm90Q29tcHV0ZT4oZ2V0TWF4KCkpOworICAgIH0KKworICAgIC8vLyBUZXN0IHdoZXRoZXIgdGhpcyBCYWNrZWRnZVRha2VuSW5mbyBjb250YWlucyBjb21wbGV0ZSBpbmZvcm1hdGlvbi4KKyAgICBib29sIGhhc0Z1bGxJbmZvKCkgY29uc3QgeyByZXR1cm4gaXNDb21wbGV0ZSgpOyB9CisKKyAgICAvLy8gUmV0dXJuIGFuIGV4cHJlc3Npb24gaW5kaWNhdGluZyB0aGUgZXhhY3QgKmJhY2tlZGdlLXRha2VuKgorICAgIC8vLyBjb3VudCBvZiB0aGUgbG9vcCBpZiBpdCBpcyBrbm93biBvciBTQ0VWQ291bGROb3RDb21wdXRlCisgICAgLy8vIG90aGVyd2lzZS4gIElmIGV4ZWN1dGlvbiBtYWtlcyBpdCB0byB0aGUgYmFja2VkZ2Ugb24gZXZlcnkKKyAgICAvLy8gaXRlcmF0aW9uIChpLmUuIHRoZXJlIGFyZSBubyBhYm5vcm1hbCBleGlzdHMgbGlrZSBleGNlcHRpb24KKyAgICAvLy8gdGhyb3dzIGFuZCB0aHJlYWQgZXhpdHMpIHRoZW4gdGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZQorICAgIC8vLyBsb29wIGhlYWRlciB3aWxsIGV4ZWN1dGUgbWludXMgb25lLgorICAgIC8vLworICAgIC8vLyBJZiB0aGUgU0NFViBwcmVkaWNhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbnN3ZXIgY2FuIGJlIGRpZmZlcmVudAorICAgIC8vLyBmcm9tIEFsd2F5c1RydWUsIHdlIG11c3QgYWRkIGEgKG5vbiBudWxsKSBQcmVkaWNhdGVzIGFyZ3VtZW50LgorICAgIC8vLyBUaGUgU0NFViBwcmVkaWNhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbnN3ZXIgd2lsbCBiZSBhZGRlZCB0bworICAgIC8vLyBQcmVkaWNhdGVzLiBBIHJ1bi10aW1lIGNoZWNrIG5lZWRzIHRvIGJlIGVtaXR0ZWQgZm9yIHRoZSBTQ0VWCisgICAgLy8vIHByZWRpY2F0ZSBpbiBvcmRlciBmb3IgdGhlIGFuc3dlciB0byBiZSB2YWxpZC4KKyAgICAvLy8KKyAgICAvLy8gTm90ZSB0aGF0IHdlIHNob3VsZCBhbHdheXMga25vdyBpZiB3ZSBuZWVkIHRvIHBhc3MgYSBwcmVkaWNhdGUKKyAgICAvLy8gYXJndW1lbnQgb3Igbm90IGZyb20gdGhlIHdheSB0aGUgRXhpdENvdW50cyB2ZWN0b3Igd2FzIGNvbXB1dGVkLgorICAgIC8vLyBJZiB3ZSBhbGxvd2VkIFNDRVYgcHJlZGljYXRlcyB0byBiZSBnZW5lcmF0ZWQgd2hlbiBwb3B1bGF0aW5nIHRoaXMKKyAgICAvLy8gdmVjdG9yLCB0aGlzIGluZm9ybWF0aW9uIGNhbiBjb250YWluIHRoZW0gYW5kIHRoZXJlZm9yZSBhCisgICAgLy8vIFNDRVZQcmVkaWNhdGUgYXJndW1lbnQgc2hvdWxkIGJlIGFkZGVkIHRvIGdldEV4YWN0LgorICAgIGNvbnN0IFNDRVYgKmdldEV4YWN0KGNvbnN0IExvb3AgKkwsIFNjYWxhckV2b2x1dGlvbiAqU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0NFVlVuaW9uUHJlZGljYXRlICpQcmVkaWNhdGVzID0gbnVsbHB0cikgY29uc3Q7CisKKyAgICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBsb29wIGV4aXQgbWF5IGZhbGwgdGhyb3VnaCB0byB0aGUgYmFjaworICAgIC8vLyBlZGdlLCBvciBTQ0VWQ291bGROb3RDb21wdXRlLiBUaGUgbG9vcCBpcyBndWFyYW50ZWVkIG5vdCB0byBleGl0IHZpYQorICAgIC8vLyB0aGlzIGJsb2NrIGJlZm9yZSB0aGlzIG51bWJlciBvZiBpdGVyYXRpb25zLCBidXQgbWF5IGV4aXQgdmlhIGFub3RoZXIKKyAgICAvLy8gYmxvY2suCisgICAgY29uc3QgU0NFViAqZ2V0RXhhY3QoQmFzaWNCbG9jayAqRXhpdGluZ0Jsb2NrLCBTY2FsYXJFdm9sdXRpb24gKlNFKSBjb25zdDsKKworICAgIC8vLyBHZXQgdGhlIG1heCBiYWNrZWRnZSB0YWtlbiBjb3VudCBmb3IgdGhlIGxvb3AuCisgICAgY29uc3QgU0NFViAqZ2V0TWF4KFNjYWxhckV2b2x1dGlvbiAqU0UpIGNvbnN0OworCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBiYWNrZWRnZSBpcyB0YWtlbiBpcyBlaXRoZXIgdGhlCisgICAgLy8vIHZhbHVlIHJldHVybmVkIGJ5IGdldE1heCBvciB6ZXJvLgorICAgIGJvb2wgaXNNYXhPclplcm8oU2NhbGFyRXZvbHV0aW9uICpTRSkgY29uc3Q7CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgYW55IGJhY2tlZGdlIHRha2VuIGNvdW50IGV4cHJlc3Npb25zIHJlZmVyIHRvIHRoZSBnaXZlbgorICAgIC8vLyBzdWJleHByZXNzaW9uLgorICAgIGJvb2wgaGFzT3BlcmFuZChjb25zdCBTQ0VWICpTLCBTY2FsYXJFdm9sdXRpb24gKlNFKSBjb25zdDsKKworICAgIC8vLyBJbnZhbGlkYXRlIHRoaXMgcmVzdWx0IGFuZCBmcmVlIGFzc29jaWF0ZWQgbWVtb3J5LgorICAgIHZvaWQgY2xlYXIoKTsKKyAgfTsKKworICAvLy8gQ2FjaGUgdGhlIGJhY2tlZGdlLXRha2VuIGNvdW50IG9mIHRoZSBsb29wcyBmb3IgdGhpcyBmdW5jdGlvbiBhcyB0aGV5CisgIC8vLyBhcmUgY29tcHV0ZWQuCisgIERlbnNlTWFwPGNvbnN0IExvb3AgKiwgQmFja2VkZ2VUYWtlbkluZm8+IEJhY2tlZGdlVGFrZW5Db3VudHM7CisKKyAgLy8vIENhY2hlIHRoZSBwcmVkaWNhdGVkIGJhY2tlZGdlLXRha2VuIGNvdW50IG9mIHRoZSBsb29wcyBmb3IgdGhpcworICAvLy8gZnVuY3Rpb24gYXMgdGhleSBhcmUgY29tcHV0ZWQuCisgIERlbnNlTWFwPGNvbnN0IExvb3AgKiwgQmFja2VkZ2VUYWtlbkluZm8+IFByZWRpY2F0ZWRCYWNrZWRnZVRha2VuQ291bnRzOworCisgIC8vLyBUaGlzIG1hcCBjb250YWlucyBlbnRyaWVzIGZvciBhbGwgb2YgdGhlIFBISSBpbnN0cnVjdGlvbnMgdGhhdCB3ZQorICAvLy8gYXR0ZW1wdCB0byBjb21wdXRlIGNvbnN0YW50IGV2b2x1dGlvbnMgZm9yLiAgVGhpcyBhbGxvd3MgdXMgdG8gYXZvaWQKKyAgLy8vIHBvdGVudGlhbGx5IGV4cGVuc2l2ZSByZWNvbXB1dGF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMuICBBbiBpbnN0cnVjdGlvbgorICAvLy8gbWFwcyB0byBudWxsIGlmIHdlIGFyZSB1bmFibGUgdG8gY29tcHV0ZSBpdHMgZXhpdCB2YWx1ZS4KKyAgRGVuc2VNYXA8UEhJTm9kZSAqLCBDb25zdGFudCAqPiBDb25zdGFudEV2b2x1dGlvbkxvb3BFeGl0VmFsdWU7CisKKyAgLy8vIFRoaXMgbWFwIGNvbnRhaW5zIGVudHJpZXMgZm9yIGFsbCB0aGUgZXhwcmVzc2lvbnMgdGhhdCB3ZSBhdHRlbXB0IHRvCisgIC8vLyBjb21wdXRlIGdldFNDRVZBdFNjb3BlIGluZm9ybWF0aW9uIGZvciwgd2hpY2ggY2FuIGJlIGV4cGVuc2l2ZSBpbgorICAvLy8gZXh0cmVtZSBjYXNlcy4KKyAgRGVuc2VNYXA8Y29uc3QgU0NFViAqLCBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgTG9vcCAqLCBjb25zdCBTQ0VWICo+LCAyPj4KKyAgICAgIFZhbHVlc0F0U2NvcGVzOworCisgIC8vLyBNZW1vaXplZCBjb21wdXRlTG9vcERpc3Bvc2l0aW9uIHJlc3VsdHMuCisgIERlbnNlTWFwPGNvbnN0IFNDRVYgKiwKKyAgICAgICAgICAgU21hbGxWZWN0b3I8UG9pbnRlckludFBhaXI8Y29uc3QgTG9vcCAqLCAyLCBMb29wRGlzcG9zaXRpb24+LCAyPj4KKyAgICAgIExvb3BEaXNwb3NpdGlvbnM7CisKKyAgc3RydWN0IExvb3BQcm9wZXJ0aWVzIHsKKyAgICAvLy8gU2V0IHRvIHRydWUgaWYgdGhlIGxvb3AgY29udGFpbnMgbm8gaW5zdHJ1Y3Rpb24gdGhhdCBjYW4gaGF2ZSBzaWRlCisgICAgLy8vIGVmZmVjdHMgKGkuZS4gdmlhIHRocm93aW5nIGFuIGV4Y2VwdGlvbiwgdm9sYXRpbGUgb3IgYXRvbWljIGFjY2VzcykuCisgICAgYm9vbCBIYXNOb0Fibm9ybWFsRXhpdHM7CisKKyAgICAvLy8gU2V0IHRvIHRydWUgaWYgdGhlIGxvb3AgY29udGFpbnMgbm8gaW5zdHJ1Y3Rpb24gdGhhdCBjYW4gYWJub3JtYWxseSBleGl0CisgICAgLy8vIHRoZSBsb29wIChpLmUuIHZpYSB0aHJvd2luZyBhbiBleGNlcHRpb24sIGJ5IHRlcm1pbmF0aW5nIHRoZSB0aHJlYWQKKyAgICAvLy8gY2xlYW5seSBvciBieSBpbmZpbml0ZSBsb29waW5nIGluIGEgY2FsbGVkIGZ1bmN0aW9uKS4gIFN0cmljdGx5CisgICAgLy8vIHNwZWFraW5nLCB0aGUgbGFzdCBvbmUgaXMgbm90IGxlYXZpbmcgdGhlIGxvb3AsIGJ1dCBpcyBpZGVudGljYWwgdG8KKyAgICAvLy8gbGVhdmluZyB0aGUgbG9vcCBmb3IgcmVhc29uaW5nIGFib3V0IHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICBib29sIEhhc05vU2lkZUVmZmVjdHM7CisgIH07CisKKyAgLy8vIENhY2hlIGZvciBcYyBnZXRMb29wUHJvcGVydGllcy4KKyAgRGVuc2VNYXA8Y29uc3QgTG9vcCAqLCBMb29wUHJvcGVydGllcz4gTG9vcFByb3BlcnRpZXNDYWNoZTsKKworICAvLy8gUmV0dXJuIGEgXGMgTG9vcFByb3BlcnRpZXMgaW5zdGFuY2UgZm9yIFxwIEwsIGNyZWF0aW5nIG9uZSBpZiBuZWNlc3NhcnkuCisgIExvb3BQcm9wZXJ0aWVzIGdldExvb3BQcm9wZXJ0aWVzKGNvbnN0IExvb3AgKkwpOworCisgIGJvb2wgbG9vcEhhc05vU2lkZUVmZmVjdHMoY29uc3QgTG9vcCAqTCkgeworICAgIHJldHVybiBnZXRMb29wUHJvcGVydGllcyhMKS5IYXNOb1NpZGVFZmZlY3RzOworICB9CisKKyAgYm9vbCBsb29wSGFzTm9BYm5vcm1hbEV4aXRzKGNvbnN0IExvb3AgKkwpIHsKKyAgICByZXR1cm4gZ2V0TG9vcFByb3BlcnRpZXMoTCkuSGFzTm9BYm5vcm1hbEV4aXRzOworICB9CisKKyAgLy8vIENvbXB1dGUgYSBMb29wRGlzcG9zaXRpb24gdmFsdWUuCisgIExvb3BEaXNwb3NpdGlvbiBjb21wdXRlTG9vcERpc3Bvc2l0aW9uKGNvbnN0IFNDRVYgKlMsIGNvbnN0IExvb3AgKkwpOworCisgIC8vLyBNZW1vaXplZCBjb21wdXRlQmxvY2tEaXNwb3NpdGlvbiByZXN1bHRzLgorICBEZW5zZU1hcDwKKyAgICAgIGNvbnN0IFNDRVYgKiwKKyAgICAgIFNtYWxsVmVjdG9yPFBvaW50ZXJJbnRQYWlyPGNvbnN0IEJhc2ljQmxvY2sgKiwgMiwgQmxvY2tEaXNwb3NpdGlvbj4sIDI+PgorICAgICAgQmxvY2tEaXNwb3NpdGlvbnM7CisKKyAgLy8vIENvbXB1dGUgYSBCbG9ja0Rpc3Bvc2l0aW9uIHZhbHVlLgorICBCbG9ja0Rpc3Bvc2l0aW9uIGNvbXB1dGVCbG9ja0Rpc3Bvc2l0aW9uKGNvbnN0IFNDRVYgKlMsIGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKKworICAvLy8gTWVtb2l6ZWQgcmVzdWx0cyBmcm9tIGdldFJhbmdlCisgIERlbnNlTWFwPGNvbnN0IFNDRVYgKiwgQ29uc3RhbnRSYW5nZT4gVW5zaWduZWRSYW5nZXM7CisKKyAgLy8vIE1lbW9pemVkIHJlc3VsdHMgZnJvbSBnZXRSYW5nZQorICBEZW5zZU1hcDxjb25zdCBTQ0VWICosIENvbnN0YW50UmFuZ2U+IFNpZ25lZFJhbmdlczsKKworICAvLy8gVXNlZCB0byBwYXJhbWV0ZXJpemUgZ2V0UmFuZ2UKKyAgZW51bSBSYW5nZVNpZ25IaW50IHsgSElOVF9SQU5HRV9VTlNJR05FRCwgSElOVF9SQU5HRV9TSUdORUQgfTsKKworICAvLy8gU2V0IHRoZSBtZW1vaXplZCByYW5nZSBmb3IgdGhlIGdpdmVuIFNDRVYuCisgIGNvbnN0IENvbnN0YW50UmFuZ2UgJnNldFJhbmdlKGNvbnN0IFNDRVYgKlMsIFJhbmdlU2lnbkhpbnQgSGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRSYW5nZSBDUikgeworICAgIERlbnNlTWFwPGNvbnN0IFNDRVYgKiwgQ29uc3RhbnRSYW5nZT4gJkNhY2hlID0KKyAgICAgICAgSGludCA9PSBISU5UX1JBTkdFX1VOU0lHTkVEID8gVW5zaWduZWRSYW5nZXMgOiBTaWduZWRSYW5nZXM7CisKKyAgICBhdXRvIFBhaXIgPSBDYWNoZS50cnlfZW1wbGFjZShTLCBzdGQ6Om1vdmUoQ1IpKTsKKyAgICBpZiAoIVBhaXIuc2Vjb25kKQorICAgICAgUGFpci5maXJzdC0+c2Vjb25kID0gc3RkOjptb3ZlKENSKTsKKyAgICByZXR1cm4gUGFpci5maXJzdC0+c2Vjb25kOworICB9CisKKyAgLy8vIERldGVybWluZSB0aGUgcmFuZ2UgZm9yIGEgcGFydGljdWxhciBTQ0VWLgorICAvLy8gTk9URTogVGhpcyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGFuIGVudHJ5IGluIGEgY2FjaGUuIEl0IG11c3QgYmUKKyAgLy8vIGNvcGllZCBpZiBpdHMgbmVlZGVkIGZvciBsb25nZXIuCisgIGNvbnN0IENvbnN0YW50UmFuZ2UgJmdldFJhbmdlUmVmKGNvbnN0IFNDRVYgKlMsIFJhbmdlU2lnbkhpbnQgSGludCk7CisKKyAgLy8vIERldGVybWluZXMgdGhlIHJhbmdlIGZvciB0aGUgYWZmaW5lIFNDRVZBZGRSZWNFeHByIHtccCBTdGFydCwrLFxwIFN0b3B9LgorICAvLy8gSGVscGVyIGZvciBcYyBnZXRSYW5nZS4KKyAgQ29uc3RhbnRSYW5nZSBnZXRSYW5nZUZvckFmZmluZUFSKGNvbnN0IFNDRVYgKlN0YXJ0LCBjb25zdCBTQ0VWICpTdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqTWF4QkVDb3VudCwgdW5zaWduZWQgQml0V2lkdGgpOworCisgIC8vLyBUcnkgdG8gY29tcHV0ZSBhIHJhbmdlIGZvciB0aGUgYWZmaW5lIFNDRVZBZGRSZWNFeHByIHtccCBTdGFydCwrLFxwCisgIC8vLyBTdG9wfSBieSAiZmFjdG9yaW5nIG91dCIgYSB0ZXJuYXJ5IGV4cHJlc3Npb24gZnJvbSB0aGUgYWRkIHJlY3VycmVuY2UuCisgIC8vLyBIZWxwZXIgY2FsbGVkIGJ5IFxjIGdldFJhbmdlLgorICBDb25zdGFudFJhbmdlIGdldFJhbmdlVmlhRmFjdG9yaW5nKGNvbnN0IFNDRVYgKlN0YXJ0LCBjb25zdCBTQ0VWICpTdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKk1heEJFQ291bnQsIHVuc2lnbmVkIEJpdFdpZHRoKTsKKworICAvLy8gV2Uga25vdyB0aGF0IHRoZXJlIGlzIG5vIFNDRVYgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUuICBBbmFseXplIHRoZQorICAvLy8gZXhwcmVzc2lvbi4KKyAgY29uc3QgU0NFViAqY3JlYXRlU0NFVihWYWx1ZSAqVik7CisKKyAgLy8vIFByb3ZpZGUgdGhlIHNwZWNpYWwgaGFuZGxpbmcgd2UgbmVlZCB0byBhbmFseXplIFBISSBTQ0VWcy4KKyAgY29uc3QgU0NFViAqY3JlYXRlTm9kZUZvclBISShQSElOb2RlICpQTik7CisKKyAgLy8vIEhlbHBlciBmdW5jdGlvbiBjYWxsZWQgZnJvbSBjcmVhdGVOb2RlRm9yUEhJLgorICBjb25zdCBTQ0VWICpjcmVhdGVBZGRSZWNGcm9tUEhJKFBISU5vZGUgKlBOKTsKKworICAvLy8gQSBoZWxwZXIgZnVuY3Rpb24gZm9yIGNyZWF0ZUFkZFJlY0Zyb21QSEkgdG8gaGFuZGxlIHNpbXBsZSBjYXNlcy4KKyAgY29uc3QgU0NFViAqY3JlYXRlU2ltcGxlQWZmaW5lQWRkUmVjKFBISU5vZGUgKlBOLCBWYWx1ZSAqQkVWYWx1ZVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpTdGFydFZhbHVlVik7CisKKyAgLy8vIEhlbHBlciBmdW5jdGlvbiBjYWxsZWQgZnJvbSBjcmVhdGVOb2RlRm9yUEhJLgorICBjb25zdCBTQ0VWICpjcmVhdGVOb2RlRnJvbVNlbGVjdExpa2VQSEkoUEhJTm9kZSAqUE4pOworCisgIC8vLyBQcm92aWRlIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGEgc2VsZWN0LWxpa2UgaW5zdHJ1Y3Rpb24gKGN1cnJlbnRseSB0aGlzCisgIC8vLyBpcyBlaXRoZXIgYSBzZWxlY3QgaW5zdHJ1Y3Rpb24gb3IgYSBwaGkgbm9kZSkuICBccCBJIGlzIHRoZSBpbnN0cnVjdGlvbgorICAvLy8gYmVpbmcgcHJvY2Vzc2VkLCBhbmQgaXQgaXMgYXNzdW1lZCBlcXVpdmFsZW50IHRvICJDb25kID8gVHJ1ZVZhbCA6CisgIC8vLyBGYWxzZVZhbCIuCisgIGNvbnN0IFNDRVYgKmNyZWF0ZU5vZGVGb3JTZWxlY3RPclBISShJbnN0cnVjdGlvbiAqSSwgVmFsdWUgKkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqVHJ1ZVZhbCwgVmFsdWUgKkZhbHNlVmFsKTsKKworICAvLy8gUHJvdmlkZSB0aGUgc3BlY2lhbCBoYW5kbGluZyB3ZSBuZWVkIHRvIGFuYWx5emUgR0VQIFNDRVZzLgorICBjb25zdCBTQ0VWICpjcmVhdGVOb2RlRm9yR0VQKEdFUE9wZXJhdG9yICpHRVApOworCisgIC8vLyBJbXBsZW1lbnRhdGlvbiBjb2RlIGZvciBnZXRTQ0VWQXRTY29wZTsgY2FsbGVkIGF0IG1vc3Qgb25jZSBmb3IgZWFjaAorICAvLy8gU0NFVitMb29wIHBhaXIuCisgIGNvbnN0IFNDRVYgKmNvbXB1dGVTQ0VWQXRTY29wZShjb25zdCBTQ0VWICpTLCBjb25zdCBMb29wICpMKTsKKworICAvLy8gVGhpcyBsb29rcyB1cCBjb21wdXRlZCBTQ0VWIHZhbHVlcyBmb3IgYWxsIGluc3RydWN0aW9ucyB0aGF0IGRlcGVuZCBvbgorICAvLy8gdGhlIGdpdmVuIGluc3RydWN0aW9uIGFuZCByZW1vdmVzIHRoZW0gZnJvbSB0aGUgVmFsdWVFeHByTWFwIG1hcCBpZiB0aGV5CisgIC8vLyByZWZlcmVuY2UgU3ltTmFtZS4gVGhpcyBpcyB1c2VkIGR1cmluZyBQSEkgcmVzb2x1dGlvbi4KKyAgdm9pZCBmb3JnZXRTeW1ib2xpY05hbWUoSW5zdHJ1Y3Rpb24gKkksIGNvbnN0IFNDRVYgKlN5bU5hbWUpOworCisgIC8vLyBSZXR1cm4gdGhlIEJhY2tlZGdlVGFrZW5JbmZvIGZvciB0aGUgZ2l2ZW4gbG9vcCwgbGF6aWx5IGNvbXB1dGluZyBuZXcKKyAgLy8vIHZhbHVlcyBpZiB0aGUgbG9vcCBoYXNuJ3QgYmVlbiBhbmFseXplZCB5ZXQuIFRoZSByZXR1cm5lZCByZXN1bHQgaXMKKyAgLy8vIGd1YXJhbnRlZWQgbm90IHRvIGJlIHByZWRpY2F0ZWQuCisgIGNvbnN0IEJhY2tlZGdlVGFrZW5JbmZvICZnZXRCYWNrZWRnZVRha2VuSW5mbyhjb25zdCBMb29wICpMKTsKKworICAvLy8gU2ltaWxhciB0byBnZXRCYWNrZWRnZVRha2VuSW5mbywgYnV0IHdpbGwgYWRkIHByZWRpY2F0ZXMgYXMgcmVxdWlyZWQKKyAgLy8vIHdpdGggdGhlIHB1cnBvc2Ugb2YgcmV0dXJuaW5nIGNvbXBsZXRlIGluZm9ybWF0aW9uLgorICBjb25zdCBCYWNrZWRnZVRha2VuSW5mbyAmZ2V0UHJlZGljYXRlZEJhY2tlZGdlVGFrZW5JbmZvKGNvbnN0IExvb3AgKkwpOworCisgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHNwZWNpZmllZCBsb29wIHdpbGwgaXRlcmF0ZS4KKyAgLy8vIElmIEFsbG93UHJlZGljYXRlcyBpcyBzZXQsIHdlIHdpbGwgY3JlYXRlIG5ldyBTQ0VWIHByZWRpY2F0ZXMgYXMKKyAgLy8vIG5lY2Vzc2FyeSBpbiBvcmRlciB0byByZXR1cm4gYW4gZXhhY3QgYW5zd2VyLgorICBCYWNrZWRnZVRha2VuSW5mbyBjb21wdXRlQmFja2VkZ2VUYWtlbkNvdW50KGNvbnN0IExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd1ByZWRpY2F0ZXMgPSBmYWxzZSk7CisKKyAgLy8vIENvbXB1dGUgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYmFja2VkZ2Ugb2YgdGhlIHNwZWNpZmllZCBsb29wIHdpbGwKKyAgLy8vIGV4ZWN1dGUgaWYgaXQgZXhpdHMgdmlhIHRoZSBzcGVjaWZpZWQgYmxvY2suIElmIEFsbG93UHJlZGljYXRlcyBpcyBzZXQsCisgIC8vLyB0aGlzIGNhbGwgd2lsbCB0cnkgdG8gdXNlIGEgbWluaW1hbCBzZXQgb2YgU0NFViBwcmVkaWNhdGVzIGluIG9yZGVyIHRvCisgIC8vLyByZXR1cm4gYW4gZXhhY3QgYW5zd2VyLgorICBFeGl0TGltaXQgY29tcHV0ZUV4aXRMaW1pdChjb25zdCBMb29wICpMLCBCYXNpY0Jsb2NrICpFeGl0aW5nQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dQcmVkaWNhdGVzID0gZmFsc2UpOworCisgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGJhY2tlZGdlIG9mIHRoZSBzcGVjaWZpZWQgbG9vcCB3aWxsCisgIC8vLyBleGVjdXRlIGlmIGl0cyBleGl0IGNvbmRpdGlvbiB3ZXJlIGEgY29uZGl0aW9uYWwgYnJhbmNoIG9mIEV4aXRDb25kLgorICAvLy8KKyAgLy8vIFxwIENvbnRyb2xzRXhpdCBpcyB0cnVlIGlmIEV4aXRDb25kIGRpcmVjdGx5IGNvbnRyb2xzIHRoZSBleGl0CisgIC8vLyBicmFuY2guIEluIHRoaXMgY2FzZSwgd2UgY2FuIGFzc3VtZSB0aGF0IHRoZSBsb29wIGV4aXRzIG9ubHkgaWYgdGhlCisgIC8vLyBjb25kaXRpb24gaXMgdHJ1ZSBhbmQgY2FuIGluZmVyIHRoYXQgZmFpbGluZyB0byBtZWV0IHRoZSBjb25kaXRpb24gcHJpb3IKKyAgLy8vIHRvIGludGVnZXIgd3JhcGFyb3VuZCByZXN1bHRzIGluIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgLy8vCisgIC8vLyBJZiBccCBBbGxvd1ByZWRpY2F0ZXMgaXMgc2V0LCB0aGlzIGNhbGwgd2lsbCB0cnkgdG8gdXNlIGEgbWluaW1hbCBzZXQgb2YKKyAgLy8vIFNDRVYgcHJlZGljYXRlcyBpbiBvcmRlciB0byByZXR1cm4gYW4gZXhhY3QgYW5zd2VyLgorICBFeGl0TGltaXQgY29tcHV0ZUV4aXRMaW1pdEZyb21Db25kKGNvbnN0IExvb3AgKkwsIFZhbHVlICpFeGl0Q29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEV4aXRJZlRydWUsIGJvb2wgQ29udHJvbHNFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dQcmVkaWNhdGVzID0gZmFsc2UpOworCisgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGNvbXB1dGVFeGl0TGltaXRGcm9tQ29uZCB0byBhdm9pZCBleHBvbmVudGlhbCB0aW1lCisgIC8vIGNvbXBsZXhpdHkuCisKKyAgY2xhc3MgRXhpdExpbWl0Q2FjaGUgeworICAgIC8vIEl0IG1heSBsb29rIGxpa2Ugd2UgbmVlZCBrZXkgb24gdGhlIHdob2xlIChMLCBFeGl0SWZUcnVlLCBDb250cm9sc0V4aXQsCisgICAgLy8gQWxsb3dQcmVkaWNhdGVzKSB0dXBsZSwgYnV0IHJlY3Vyc2l2ZSBjYWxscyB0bworICAgIC8vIGNvbXB1dGVFeGl0TGltaXRGcm9tQ29uZENhY2hlZCBmcm9tIGNvbXB1dGVFeGl0TGltaXRGcm9tQ29uZEltcGwgb25seQorICAgIC8vIHZhcnkgdGhlIGluIFxjIEV4aXRDb25kIGFuZCBcYyBDb250cm9sc0V4aXQgcGFyYW1ldGVycy4gIFdlIHJlbWVtYmVyIHRoZQorICAgIC8vIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBvdGhlciB2YWx1ZXMgdG8gYXNzZXJ0IG91ciBhc3N1bXB0aW9uLgorICAgIFNtYWxsRGVuc2VNYXA8UG9pbnRlckludFBhaXI8VmFsdWUgKiwgMT4sIEV4aXRMaW1pdD4gVHJpcENvdW50TWFwOworCisgICAgY29uc3QgTG9vcCAqTDsKKyAgICBib29sIEV4aXRJZlRydWU7CisgICAgYm9vbCBBbGxvd1ByZWRpY2F0ZXM7CisKKyAgcHVibGljOgorICAgIEV4aXRMaW1pdENhY2hlKGNvbnN0IExvb3AgKkwsIGJvb2wgRXhpdElmVHJ1ZSwgYm9vbCBBbGxvd1ByZWRpY2F0ZXMpCisgICAgICAgIDogTChMKSwgRXhpdElmVHJ1ZShFeGl0SWZUcnVlKSwgQWxsb3dQcmVkaWNhdGVzKEFsbG93UHJlZGljYXRlcykge30KKworICAgIE9wdGlvbmFsPEV4aXRMaW1pdD4gZmluZChjb25zdCBMb29wICpMLCBWYWx1ZSAqRXhpdENvbmQsIGJvb2wgRXhpdElmVHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb250cm9sc0V4aXQsIGJvb2wgQWxsb3dQcmVkaWNhdGVzKTsKKworICAgIHZvaWQgaW5zZXJ0KGNvbnN0IExvb3AgKkwsIFZhbHVlICpFeGl0Q29uZCwgYm9vbCBFeGl0SWZUcnVlLAorICAgICAgICAgICAgICAgIGJvb2wgQ29udHJvbHNFeGl0LCBib29sIEFsbG93UHJlZGljYXRlcywgY29uc3QgRXhpdExpbWl0ICZFTCk7CisgIH07CisKKyAgdXNpbmcgRXhpdExpbWl0Q2FjaGVUeSA9IEV4aXRMaW1pdENhY2hlOworCisgIEV4aXRMaW1pdCBjb21wdXRlRXhpdExpbWl0RnJvbUNvbmRDYWNoZWQoRXhpdExpbWl0Q2FjaGVUeSAmQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqTCwgVmFsdWUgKkV4aXRDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhpdElmVHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbnRyb2xzRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93UHJlZGljYXRlcyk7CisgIEV4aXRMaW1pdCBjb21wdXRlRXhpdExpbWl0RnJvbUNvbmRJbXBsKEV4aXRMaW1pdENhY2hlVHkgJkNhY2hlLCBjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqRXhpdENvbmQsIGJvb2wgRXhpdElmVHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb250cm9sc0V4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dQcmVkaWNhdGVzKTsKKworICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBiYWNrZWRnZSBvZiB0aGUgc3BlY2lmaWVkIGxvb3Agd2lsbAorICAvLy8gZXhlY3V0ZSBpZiBpdHMgZXhpdCBjb25kaXRpb24gd2VyZSBhIGNvbmRpdGlvbmFsIGJyYW5jaCBvZiB0aGUgSUNtcEluc3QKKyAgLy8vIEV4aXRDb25kIGFuZCBFeGl0SWZUcnVlLiBJZiBBbGxvd1ByZWRpY2F0ZXMgaXMgc2V0LCB0aGlzIGNhbGwgd2lsbCB0cnkKKyAgLy8vIHRvIHVzZSBhIG1pbmltYWwgc2V0IG9mIFNDRVYgcHJlZGljYXRlcyBpbiBvcmRlciB0byByZXR1cm4gYW4gZXhhY3QKKyAgLy8vIGFuc3dlci4KKyAgRXhpdExpbWl0IGNvbXB1dGVFeGl0TGltaXRGcm9tSUNtcChjb25zdCBMb29wICpMLCBJQ21wSW5zdCAqRXhpdENvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeGl0SWZUcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNTdWJFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dQcmVkaWNhdGVzID0gZmFsc2UpOworCisgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGJhY2tlZGdlIG9mIHRoZSBzcGVjaWZpZWQgbG9vcCB3aWxsCisgIC8vLyBleGVjdXRlIGlmIGl0cyBleGl0IGNvbmRpdGlvbiB3ZXJlIGEgc3dpdGNoIHdpdGggYSBzaW5nbGUgZXhpdGluZyBjYXNlCisgIC8vLyB0byBFeGl0aW5nQkIuCisgIEV4aXRMaW1pdCBjb21wdXRlRXhpdExpbWl0RnJvbVNpbmdsZUV4aXRTd2l0Y2goY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hJbnN0ICpTd2l0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqRXhpdGluZ0JCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNTdWJFeHByKTsKKworICAvLy8gR2l2ZW4gYW4gZXhpdCBjb25kaXRpb24gb2YgJ2ljbXAgb3AgbG9hZCBYLCBjc3QnLCB0cnkgdG8gc2VlIGlmIHdlIGNhbgorICAvLy8gY29tcHV0ZSB0aGUgYmFja2VkZ2UtdGFrZW4gY291bnQuCisgIEV4aXRMaW1pdCBjb21wdXRlTG9hZENvbnN0YW50Q29tcGFyZUV4aXRMaW1pdChMb2FkSW5zdCAqTEksIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3Q6OlByZWRpY2F0ZSBwKTsKKworICAvLy8gQ29tcHV0ZSB0aGUgZXhpdCBsaW1pdCBvZiBhIGxvb3AgdGhhdCBpcyBjb250cm9sbGVkIGJ5IGEKKyAgLy8vICIoSVYgPj4gMSkgIT0gMCIgdHlwZSBjb21wYXJpc29uLiAgV2UgY2Fubm90IGNvbXB1dGUgdGhlIGV4YWN0IHRyaXAKKyAgLy8vIGNvdW50IGluIHRoZXNlIGNhc2VzIChzaW5jZSBTQ0VWIGhhcyBubyB3YXkgb2YgZXhwcmVzc2luZyB0aGVtKSwgYnV0IHdlCisgIC8vLyBjYW4gc3RpbGwgc29tZXRpbWVzIGNvbXB1dGUgYW4gdXBwZXIgYm91bmQuCisgIC8vLworICAvLy8gUmV0dXJuIGFuIEV4aXRMaW1pdCBmb3IgYSBsb29wIHdob3NlIGJhY2tlZGdlIGlzIGd1YXJkZWQgYnkgYExIUyBQcmVkCisgIC8vLyBSSFNgLgorICBFeGl0TGltaXQgY29tcHV0ZVNoaWZ0Q29tcGFyZUV4aXRMaW1pdChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQpOworCisgIC8vLyBJZiB0aGUgbG9vcCBpcyBrbm93biB0byBleGVjdXRlIGEgY29uc3RhbnQgbnVtYmVyIG9mIHRpbWVzICh0aGUKKyAgLy8vIGNvbmRpdGlvbiBldm9sdmVzIG9ubHkgZnJvbSBjb25zdGFudHMpLCB0cnkgdG8gZXZhbHVhdGUgYSBmZXcgaXRlcmF0aW9ucworICAvLy8gb2YgdGhlIGxvb3AgdW50aWwgd2UgZ2V0IHRoZSBleGl0IGNvbmRpdGlvbiBnZXRzIGEgdmFsdWUgb2YgRXhpdFdoZW4KKyAgLy8vICh0cnVlIG9yIGZhbHNlKS4gIElmIHdlIGNhbm5vdCBldmFsdWF0ZSB0aGUgZXhpdCBjb3VudCBvZiB0aGUgbG9vcCwKKyAgLy8vIHJldHVybiBDb3VsZE5vdENvbXB1dGUuCisgIGNvbnN0IFNDRVYgKmNvbXB1dGVFeGl0Q291bnRFeGhhdXN0aXZlbHkoY29uc3QgTG9vcCAqTCwgVmFsdWUgKkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeGl0V2hlbik7CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIGFuIGV4aXQgY29uZGl0aW9uIGNvbXBhcmluZyB0aGUgc3BlY2lmaWVkCisgIC8vLyB2YWx1ZSB0byB6ZXJvIHdpbGwgZXhlY3V0ZS4gIElmIG5vdCBjb21wdXRhYmxlLCByZXR1cm4gQ291bGROb3RDb21wdXRlLgorICAvLy8gSWYgQWxsb3dQcmVkaWNhdGVzIGlzIHNldCwgdGhpcyBjYWxsIHdpbGwgdHJ5IHRvIHVzZSBhIG1pbmltYWwgc2V0IG9mCisgIC8vLyBTQ0VWIHByZWRpY2F0ZXMgaW4gb3JkZXIgdG8gcmV0dXJuIGFuIGV4YWN0IGFuc3dlci4KKyAgRXhpdExpbWl0IGhvd0ZhclRvWmVybyhjb25zdCBTQ0VWICpWLCBjb25zdCBMb29wICpMLCBib29sIElzU3ViRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93UHJlZGljYXRlcyA9IGZhbHNlKTsKKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgYW4gZXhpdCBjb25kaXRpb24gY2hlY2tpbmcgdGhlIHNwZWNpZmllZAorICAvLy8gdmFsdWUgZm9yIG5vbnplcm8gd2lsbCBleGVjdXRlLiAgSWYgbm90IGNvbXB1dGFibGUsIHJldHVybgorICAvLy8gQ291bGROb3RDb21wdXRlLgorICBFeGl0TGltaXQgaG93RmFyVG9Ob25aZXJvKGNvbnN0IFNDRVYgKlYsIGNvbnN0IExvb3AgKkwpOworCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyBhbiBleGl0IGNvbmRpdGlvbiBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQKKyAgLy8vIGxlc3MtdGhhbiBjb21wYXJpc29uIHdpbGwgZXhlY3V0ZS4gIElmIG5vdCBjb21wdXRhYmxlLCByZXR1cm4KKyAgLy8vIENvdWxkTm90Q29tcHV0ZS4KKyAgLy8vCisgIC8vLyBccCBpc1NpZ25lZCBzcGVjaWZpZXMgd2hldGhlciB0aGUgbGVzcy10aGFuIGlzIHNpZ25lZC4KKyAgLy8vCisgIC8vLyBccCBDb250cm9sc0V4aXQgaXMgdHJ1ZSB3aGVuIHRoZSBMSFMgPCBSSFMgY29uZGl0aW9uIGRpcmVjdGx5IGNvbnRyb2xzCisgIC8vLyB0aGUgYnJhbmNoIChsb29wcyBleGl0cyBvbmx5IGlmIGNvbmRpdGlvbiBpcyB0cnVlKS4gSW4gdGhpcyBjYXNlLCB3ZSBjYW4KKyAgLy8vIHVzZSBOb1dyYXBGbGFncyB0byBza2lwIG92ZXJmbG93IGNoZWNrcy4KKyAgLy8vCisgIC8vLyBJZiBccCBBbGxvd1ByZWRpY2F0ZXMgaXMgc2V0LCB0aGlzIGNhbGwgd2lsbCB0cnkgdG8gdXNlIGEgbWluaW1hbCBzZXQgb2YKKyAgLy8vIFNDRVYgcHJlZGljYXRlcyBpbiBvcmRlciB0byByZXR1cm4gYW4gZXhhY3QgYW5zd2VyLgorICBFeGl0TGltaXQgaG93TWFueUxlc3NUaGFucyhjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUywgY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCwgYm9vbCBDb250cm9sc0V4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dQcmVkaWNhdGVzID0gZmFsc2UpOworCisgIEV4aXRMaW1pdCBob3dNYW55R3JlYXRlclRoYW5zKGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTLCBjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkLCBib29sIElzU3ViRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd1ByZWRpY2F0ZXMgPSBmYWxzZSk7CisKKyAgLy8vIFJldHVybiBhIHByZWRlY2Vzc29yIG9mIEJCICh3aGljaCBtYXkgbm90IGJlIGFuIGltbWVkaWF0ZSBwcmVkZWNlc3NvcikKKyAgLy8vIHdoaWNoIGhhcyBleGFjdGx5IG9uZSBzdWNjZXNzb3IgZnJvbSB3aGljaCBCQiBpcyByZWFjaGFibGUsIG9yIG51bGwgaWYKKyAgLy8vIG5vIHN1Y2ggYmxvY2sgaXMgZm91bmQuCisgIHN0ZDo6cGFpcjxCYXNpY0Jsb2NrICosIEJhc2ljQmxvY2sgKj4KKyAgZ2V0UHJlZGVjZXNzb3JXaXRoVW5pcXVlU3VjY2Vzc29yRm9yQkIoQmFzaWNCbG9jayAqQkIpOworCisgIC8vLyBUZXN0IHdoZXRoZXIgdGhlIGNvbmRpdGlvbiBkZXNjcmliZWQgYnkgUHJlZCwgTEhTLCBhbmQgUkhTIGlzIHRydWUKKyAgLy8vIHdoZW5ldmVyIHRoZSBnaXZlbiBGb3VuZENvbmRWYWx1ZSB2YWx1ZSBldmFsdWF0ZXMgdG8gdHJ1ZS4KKyAgYm9vbCBpc0ltcGxpZWRDb25kKElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwgY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMsCisgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqRm91bmRDb25kVmFsdWUsIGJvb2wgSW52ZXJzZSk7CisKKyAgLy8vIFRlc3Qgd2hldGhlciB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZCBieSBQcmVkLCBMSFMsIGFuZCBSSFMgaXMgdHJ1ZQorICAvLy8gd2hlbmV2ZXIgdGhlIGNvbmRpdGlvbiBkZXNjcmliZWQgYnkgRm91bmRQcmVkLCBGb3VuZExIUywgRm91bmRSSFMgaXMKKyAgLy8vIHRydWUuCisgIGJvb2wgaXNJbXBsaWVkQ29uZChJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsIGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3Q6OlByZWRpY2F0ZSBGb3VuZFByZWQsIGNvbnN0IFNDRVYgKkZvdW5kTEhTLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRm91bmRSSFMpOworCisgIC8vLyBUZXN0IHdoZXRoZXIgdGhlIGNvbmRpdGlvbiBkZXNjcmliZWQgYnkgUHJlZCwgTEhTLCBhbmQgUkhTIGlzIHRydWUKKyAgLy8vIHdoZW5ldmVyIHRoZSBjb25kaXRpb24gZGVzY3JpYmVkIGJ5IFByZWQsIEZvdW5kTEhTLCBhbmQgRm91bmRSSFMgaXMKKyAgLy8vIHRydWUuCisgIGJvb2wgaXNJbXBsaWVkQ29uZE9wZXJhbmRzKElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwgY29uc3QgU0NFViAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpSSFMsIGNvbnN0IFNDRVYgKkZvdW5kTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpGb3VuZFJIUyk7CisKKyAgLy8vIFRlc3Qgd2hldGhlciB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZCBieSBQcmVkLCBMSFMsIGFuZCBSSFMgaXMgdHJ1ZQorICAvLy8gd2hlbmV2ZXIgdGhlIGNvbmRpdGlvbiBkZXNjcmliZWQgYnkgUHJlZCwgRm91bmRMSFMsIGFuZCBGb3VuZFJIUyBpcworICAvLy8gdHJ1ZS4gSGVyZSBMSFMgaXMgYW4gb3BlcmF0aW9uIHRoYXQgaW5jbHVkZXMgRm91bmRMSFMgYXMgb25lIG9mIGl0cworICAvLy8gYXJndW1lbnRzLgorICBib29sIGlzSW1wbGllZFZpYU9wZXJhdGlvbnMoSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpGb3VuZExIUywgY29uc3QgU0NFViAqRm91bmRSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApOworCisgIC8vLyBUZXN0IHdoZXRoZXIgdGhlIGNvbmRpdGlvbiBkZXNjcmliZWQgYnkgUHJlZCwgTEhTLCBhbmQgUkhTIGlzIHRydWUuCisgIC8vLyBVc2Ugb25seSBzaW1wbGUgbm9uLXJlY3Vyc2l2ZSB0eXBlcyBvZiBjaGVja3MsIHN1Y2ggYXMgcmFuZ2UgYW5hbHlzaXMgZXRjLgorICBib29sIGlzS25vd25WaWFOb25SZWN1cnNpdmVSZWFzb25pbmcoSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMpOworCisgIC8vLyBUZXN0IHdoZXRoZXIgdGhlIGNvbmRpdGlvbiBkZXNjcmliZWQgYnkgUHJlZCwgTEhTLCBhbmQgUkhTIGlzIHRydWUKKyAgLy8vIHdoZW5ldmVyIHRoZSBjb25kaXRpb24gZGVzY3JpYmVkIGJ5IFByZWQsIEZvdW5kTEhTLCBhbmQgRm91bmRSSFMgaXMKKyAgLy8vIHRydWUuCisgIGJvb2wgaXNJbXBsaWVkQ29uZE9wZXJhbmRzSGVscGVyKElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwgY29uc3QgU0NFViAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpSSFMsIGNvbnN0IFNDRVYgKkZvdW5kTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpGb3VuZFJIUyk7CisKKyAgLy8vIFRlc3Qgd2hldGhlciB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZCBieSBQcmVkLCBMSFMsIGFuZCBSSFMgaXMgdHJ1ZQorICAvLy8gd2hlbmV2ZXIgdGhlIGNvbmRpdGlvbiBkZXNjcmliZWQgYnkgUHJlZCwgRm91bmRMSFMsIGFuZCBGb3VuZFJIUyBpcworICAvLy8gdHJ1ZS4gIFV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSBpc0ltcGxpZWRDb25kT3BlcmFuZHMuICBUcmllcyB0byBnZXQKKyAgLy8vIGNhc2VzIGxpa2UgIlggYHNndGAgMCA9PiBYIC0gMSBgc2d0YCAtMSIuCisgIGJvb2wgaXNJbXBsaWVkQ29uZE9wZXJhbmRzVmlhUmFuZ2VzKElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwgY29uc3QgU0NFViAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpSSFMsIGNvbnN0IFNDRVYgKkZvdW5kTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpGb3VuZFJIUyk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBjb25kaXRpb24gZGVub3RlZCBieSBccCBMSFMgXHAgUHJlZCBccCBSSFMgaXMgaW1wbGllZAorICAvLy8gYnkgYSBjYWxsIHRvIFxjIEBsbHZtLmV4cGVyaW1lbnRhbC5ndWFyZCBpbiBccCBCQi4KKyAgYm9vbCBpc0ltcGxpZWRWaWFHdWFyZChCYXNpY0Jsb2NrICpCQiwgSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTKTsKKworICAvLy8gVGVzdCB3aGV0aGVyIHRoZSBjb25kaXRpb24gZGVzY3JpYmVkIGJ5IFByZWQsIExIUywgYW5kIFJIUyBpcyB0cnVlCisgIC8vLyB3aGVuZXZlciB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZCBieSBQcmVkLCBGb3VuZExIUywgYW5kIEZvdW5kUkhTIGlzCisgIC8vLyB0cnVlLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSB0cmllcyB0byBydWxlIG91dCBjZXJ0YWluIGtpbmRzIG9mIGludGVnZXIgb3ZlcmZsb3csIGFuZAorICAvLy8gdGhlbiB0cmllcyB0byByZWFzb24gYWJvdXQgYXJpdGhtZXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBwcmVkaWNhdGVzLgorICBib29sIGlzSW1wbGllZENvbmRPcGVyYW5kc1ZpYU5vT3ZlcmZsb3coSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpGb3VuZExIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkZvdW5kUkhTKTsKKworICAvLy8gSWYgd2Uga25vdyB0aGF0IHRoZSBzcGVjaWZpZWQgUGhpIGlzIGluIHRoZSBoZWFkZXIgb2YgaXRzIGNvbnRhaW5pbmcKKyAgLy8vIGxvb3AsIHdlIGtub3cgdGhlIGxvb3AgZXhlY3V0ZXMgYSBjb25zdGFudCBudW1iZXIgb2YgdGltZXMsIGFuZCB0aGUgUEhJCisgIC8vLyBub2RlIGlzIGp1c3QgYSByZWN1cnJlbmNlIGludm9sdmluZyBjb25zdGFudHMsIGZvbGQgaXQuCisgIENvbnN0YW50ICpnZXRDb25zdGFudEV2b2x1dGlvbkxvb3BFeGl0VmFsdWUoUEhJTm9kZSAqUE4sIGNvbnN0IEFQSW50ICZCRXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqTCk7CisKKyAgLy8vIFRlc3QgaWYgdGhlIGdpdmVuIGV4cHJlc3Npb24gaXMga25vd24gdG8gc2F0aXNmeSB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZAorICAvLy8gYnkgUHJlZCBhbmQgdGhlIGtub3duIGNvbnN0YW50IHJhbmdlcyBvZiBMSFMgYW5kIFJIUy4KKyAgYm9vbCBpc0tub3duUHJlZGljYXRlVmlhQ29uc3RhbnRSYW5nZXMoSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUyk7CisKKyAgLy8vIFRyeSB0byBwcm92ZSB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZCBieSAiTEhTIFByZWQgUkhTIiBieSBydWxpbmcgb3V0CisgIC8vLyBpbnRlZ2VyIG92ZXJmbG93LgorICAvLy8KKyAgLy8vIEZvciBpbnN0YW5jZSwgdGhpcyB3aWxsIHJldHVybiB0cnVlIGZvciAiQSBzPCAoQSArIEMpPG5zdz4iIGlmIEMgaXMKKyAgLy8vIHBvc2l0aXZlLgorICBib29sIGlzS25vd25QcmVkaWNhdGVWaWFOb092ZXJmbG93KElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwgY29uc3QgU0NFViAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlJIUyk7CisKKyAgLy8vIFRyeSB0byBzcGxpdCBQcmVkIExIUyBSSFMgaW50byBsb2dpY2FsIGNvbmp1bmN0aW9ucyAoYW5kJ3MpIGFuZCB0cnkgdG8KKyAgLy8vIHByb3ZlIHRoZW0gaW5kaXZpZHVhbGx5LgorICBib29sIGlzS25vd25QcmVkaWNhdGVWaWFTcGxpdHRpbmcoSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLCBjb25zdCBTQ0VWICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpSSFMpOworCisgIC8vLyBUcnkgdG8gbWF0Y2ggdGhlIEV4cHIgYXMgIihMICsgUik8RmxhZ3M+Ii4KKyAgYm9vbCBzcGxpdEJpbmFyeUFkZChjb25zdCBTQ0VWICpFeHByLCBjb25zdCBTQ0VWIComTCwgY29uc3QgU0NFViAqJlIsCisgICAgICAgICAgICAgICAgICAgICAgU0NFVjo6Tm9XcmFwRmxhZ3MgJkZsYWdzKTsKKworICAvLy8gQ29tcHV0ZSBccCBMSFMgLSBccCBSSFMgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBBUEludCBpZiBpdCBpcyBhCisgIC8vLyBjb25zdGFudCwgYW5kIE5vbmUgaWYgaXQgaXNuJ3QuCisgIC8vLworICAvLy8gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBhIGNoZWFwZXIgdmVyc2lvbiBvZiBnZXRNaW51c1NDRVYuICBXZSBjYW4gYmUKKyAgLy8vIGZydWdhbCBoZXJlIHNpbmNlIHdlIGp1c3QgYmFpbCBvdXQgb2YgYWN0dWFsbHkgY29uc3RydWN0aW5nIGFuZAorICAvLy8gY2Fub25pY2FsaXppbmcgYW4gZXhwcmVzc2lvbiBpbiB0aGUgY2FzZXMgd2hlcmUgdGhlIHJlc3VsdCBpc24ndCBnb2luZworICAvLy8gdG8gYmUgYSBjb25zdGFudC4KKyAgT3B0aW9uYWw8QVBJbnQ+IGNvbXB1dGVDb25zdGFudERpZmZlcmVuY2UoY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMpOworCisgIC8vLyBEcm9wIG1lbW9pemVkIGluZm9ybWF0aW9uIGNvbXB1dGVkIGZvciBTLgorICB2b2lkIGZvcmdldE1lbW9pemVkUmVzdWx0cyhjb25zdCBTQ0VWICpTKTsKKworICAvLy8gUmV0dXJuIGFuIGV4aXN0aW5nIFNDRVYgZm9yIFYgaWYgdGhlcmUgaXMgb25lLCBvdGhlcndpc2UgcmV0dXJuIG51bGxwdHIuCisgIGNvbnN0IFNDRVYgKmdldEV4aXN0aW5nU0NFVihWYWx1ZSAqVik7CisKKyAgLy8vIFJldHVybiBmYWxzZSBpZmYgZ2l2ZW4gU0NFViBjb250YWlucyBhIFNDRVZVbmtub3duIHdpdGggTlVMTCB2YWx1ZS0KKyAgLy8vIHBvaW50ZXIuCisgIGJvb2wgY2hlY2tWYWxpZGl0eShjb25zdCBTQ0VWICpTKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgYEV4dGVuZE9wVHlgKHtgU3RhcnRgLCssYFN0ZXBgfSkgY2FuIGJlIHByb3ZlZCB0byBiZQorICAvLy8gZXF1YWwgdG8ge2BFeHRlbmRPcFR5YChgU3RhcnRgKSwrLGBFeHRlbmRPcFR5YChgU3RlcGApfS4gIFRoaXMgaXMKKyAgLy8vIGVxdWl2YWxlbnQgdG8gcHJvdmluZyBubyBzaWduZWQgKHJlc3AuIHVuc2lnbmVkKSB3cmFwIGluCisgIC8vLyB7YFN0YXJ0YCwrLGBTdGVwYH0gaWYgYEV4dGVuZE9wVHlgIGlzIGBTQ0VWU2lnbkV4dGVuZEV4cHJgCisgIC8vLyAocmVzcC4gYFNDRVZaZXJvRXh0ZW5kRXhwcmApLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRXh0ZW5kT3BUeT4KKyAgYm9vbCBwcm92ZU5vV3JhcEJ5VmFyeWluZ1N0YXJ0KGNvbnN0IFNDRVYgKlN0YXJ0LCBjb25zdCBTQ0VWICpTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqTCk7CisKKyAgLy8vIFRyeSB0byBwcm92ZSBOU1cgb3IgTlVXIG9uIFxwIEFSIHJlbHlpbmcgb24gQ29uc3RhbnRSYW5nZSBtYW5pcHVsYXRpb24uCisgIFNDRVY6Ok5vV3JhcEZsYWdzIHByb3ZlTm9XcmFwVmlhQ29uc3RhbnRSYW5nZXMoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFSKTsKKworICBib29sIGlzTW9ub3RvbmljUHJlZGljYXRlSW1wbChjb25zdCBTQ0VWQWRkUmVjRXhwciAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsIGJvb2wgJkluY3JlYXNpbmcpOworCisgIC8vLyBSZXR1cm4gU0NFViBuby13cmFwIGZsYWdzIHRoYXQgY2FuIGJlIHByb3ZlbiBiYXNlZCBvbiByZWFzb25pbmcgYWJvdXQKKyAgLy8vIGhvdyBwb2lzb24gcHJvZHVjZWQgZnJvbSBuby13cmFwIGZsYWdzIG9uIHRoaXMgdmFsdWUgKGUuZy4gYSBudXcgYWRkKQorICAvLy8gd291bGQgdHJpZ2dlciB1bmRlZmluZWQgYmVoYXZpb3Igb24gb3ZlcmZsb3cuCisgIFNDRVY6Ok5vV3JhcEZsYWdzIGdldE5vV3JhcEZsYWdzRnJvbVVCKGNvbnN0IFZhbHVlICpWKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIFNDRVYgY29ycmVzcG9uZGluZyB0byBccCBJIGlzIG5ldmVyIHBvaXNvbi4gIFByb3ZpbmcKKyAgLy8vIHRoaXMgaXMgbW9yZSBjb21wbGV4IHRoYW4gcHJvdmluZyB0aGF0IGp1c3QgXHAgSSBpcyBuZXZlciBwb2lzb24sIHNpbmNlCisgIC8vLyBTQ0VWIGNvbW1vbnMgZXhwcmVzc2lvbnMgYWNyb3NzIGNvbnRyb2wgZmxvdywgYW5kIHlvdSBjYW4gaGF2ZSBjYXNlcworICAvLy8gbGlrZToKKyAgLy8vCisgIC8vLyAgIGlkeDAgPSBhICsgYjsKKyAgLy8vICAgcHRyW2lkeDBdID0gMTAwOworICAvLy8gICBpZiAoPGNvbmRpdGlvbj4pIHsKKyAgLy8vICAgICBpZHgxID0gYSArbnN3IGI7CisgIC8vLyAgICAgcHRyW2lkeDFdID0gMjAwOworICAvLy8gICB9CisgIC8vLworICAvLy8gd2hlcmUgdGhlIFNDRVYgZXhwcmVzc2lvbiAoKyBhIGIpIGlzIGd1YXJhbnRlZWQgdG8gbm90IGJlIHBvaXNvbiAoYW5kCisgIC8vLyBoZW5jZSBub3Qgc2lnbi1vdmVyZmxvdykgb25seSBpZiAiPGNvbmRpdGlvbj4iIGlzIHRydWUuICBTaW5jZSBib3RoCisgIC8vLyBgaWR4MGAgYW5kIGBpZHgxYCB3aWxsIGJlIG1hcHBlZCB0byB0aGUgc2FtZSBTQ0VWIGV4cHJlc3Npb24sICgrIGEgYiksCisgIC8vLyBpdCBpcyBub3Qgb2theSB0byBhbm5vdGF0ZSAoKyBhIGIpIHdpdGggPG5zdz4gaW4gdGhlIGFib3ZlIGV4YW1wbGUuCisgIGJvb2wgaXNTQ0VWRXhwck5ldmVyUG9pc29uKGNvbnN0IEluc3RydWN0aW9uICpJKTsKKworICAvLy8gVGhpcyBpcyBsaWtlIFxjIGlzU0NFVkV4cHJOZXZlclBvaXNvbiBidXQgaXQgc3BlY2lmaWNhbGx5IHdvcmtzIGZvcgorICAvLy8gaW5zdHJ1Y3Rpb25zIHRoYXQgd2lsbCBnZXQgbWFwcGVkIHRvIFNDRVYgYWRkIHJlY3VycmVuY2VzLiAgUmV0dXJuIHRydWUKKyAgLy8vIGlmIFxwIEkgd2lsbCBuZXZlciBnZW5lcmF0ZSBwb2lzb24gdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBccCBJIGlzIGFuCisgIC8vLyBhZGQgcmVjdXJyZW5jZSBvbiB0aGUgbG9vcCBccCBMLgorICBib29sIGlzQWRkUmVjTmV2ZXJQb2lzb24oY29uc3QgSW5zdHJ1Y3Rpb24gKkksIGNvbnN0IExvb3AgKkwpOworCisgIC8vLyBTaW1pbGFyIHRvIGNyZWF0ZUFkZFJlY0Zyb21QSEksIGJ1dCB3aXRoIHRoZSBhZGRpdGlvbmFsIGZsZXhpYmlsaXR5IG9mCisgIC8vLyBzdWdnZXN0aW5nIHJ1bnRpbWUgb3ZlcmZsb3cgY2hlY2tzIGluIGNhc2UgY2FzdHMgYXJlIGVuY291bnRlcmVkLgorICAvLy8gSWYgc3VjY2Vzc2Z1bCwgdGhlIGFuYWx5c2lzIHJlY29yZHMgdGhhdCBmb3IgdGhpcyBsb29wLCBccCBTeW1ib2xpY1BISSwKKyAgLy8vIHdoaWNoIGlzIHRoZSBVbmtub3duU0NFViBjdXJyZW50bHkgcmVwcmVzZW50aW5nIHRoZSBQSEksIGNhbiBiZSByZXdyaXR0ZW4KKyAgLy8vIGludG8gYW4gQWRkUmVjLCBhc3N1bWluZyBzb21lIHByZWRpY2F0ZXM7IFRoZSBmdW5jdGlvbiB0aGVuIHJldHVybnMgdGhlCisgIC8vLyBBZGRSZWMgYW5kIHRoZSBwcmVkaWNhdGVzIGFzIGEgcGFpciwgYW5kIGNhY2hlcyB0aGlzIHBhaXIgaW4KKyAgLy8vIFByZWRpY2F0ZWRTQ0VWUmV3cml0ZXMuCisgIC8vLyBJZiB0aGUgYW5hbHlzaXMgaXMgbm90IHN1Y2Nlc3NmdWwsIGEgbWFwcGluZyBmcm9tIHRoZSBccCBTeW1ib2xpY1BISSB0bworICAvLy8gaXRzZWxmICh3aXRoIG5vIHByZWRpY2F0ZXMpIGlzIHJlY29yZGVkLCBhbmQgYSBudWxscHRyIHdpdGggYW4gZW1wdHkKKyAgLy8vIHByZWRpY2F0ZXMgdmVjdG9yIGlzIHJldHVybmVkIGFzIGEgcGFpci4KKyAgT3B0aW9uYWw8c3RkOjpwYWlyPGNvbnN0IFNDRVYgKiwgU21hbGxWZWN0b3I8Y29uc3QgU0NFVlByZWRpY2F0ZSAqLCAzPj4+CisgIGNyZWF0ZUFkZFJlY0Zyb21QSElXaXRoQ2FzdHNJbXBsKGNvbnN0IFNDRVZVbmtub3duICpTeW1ib2xpY1BISSk7CisKKyAgLy8vIENvbXB1dGUgdGhlIGJhY2tlZGdlIHRha2VuIGNvdW50IGtub3dpbmcgdGhlIGludGVydmFsIGRpZmZlcmVuY2UsIHRoZQorICAvLy8gc3RyaWRlIGFuZCBwcmVzZW5jZSBvZiB0aGUgZXF1YWxpdHkgaW4gdGhlIGNvbXBhcmlzb24uCisgIGNvbnN0IFNDRVYgKmNvbXB1dGVCRUNvdW50KGNvbnN0IFNDRVYgKkRlbHRhLCBjb25zdCBTQ0VWICpTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXF1YWxpdHkpOworCisgIC8vLyBDb21wdXRlIHRoZSBtYXhpbXVtIGJhY2tlZGdlIGNvdW50IGJhc2VkIG9uIHRoZSByYW5nZSBvZiB2YWx1ZXMKKyAgLy8vIHBlcm1pdHRlZCBieSBTdGFydCwgRW5kLCBhbmQgU3RyaWRlLiBUaGlzIGlzIGZvciBsb29wcyBvZiB0aGUgZm9ybQorICAvLy8ge1N0YXJ0LCArLCBTdHJpZGV9IExUIEVuZC4KKyAgLy8vCisgIC8vLyBQcmVjb25kaXRpb246IHRoZSBpbmR1Y3Rpb24gdmFyaWFibGUgaXMga25vd24gdG8gYmUgcG9zaXRpdmUuICBXZSAqZG9uJ3QqCisgIC8vLyBhc3NlcnQgdGhlc2UgcHJlY29uZGl0aW9ucyBzbyBwbGVhc2UgYmUgY2FyZWZ1bC4KKyAgY29uc3QgU0NFViAqY29tcHV0ZU1heEJFQ291bnRGb3JMVChjb25zdCBTQ0VWICpTdGFydCwgY29uc3QgU0NFViAqU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkVuZCwgdW5zaWduZWQgQml0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1NpZ25lZCk7CisKKyAgLy8vIFZlcmlmeSBpZiBhbiBsaW5lYXIgSVYgd2l0aCBwb3NpdGl2ZSBzdHJpZGUgY2FuIG92ZXJmbG93IHdoZW4gaW4gYQorICAvLy8gbGVzcy10aGFuIGNvbXBhcmlzb24sIGtub3dpbmcgdGhlIGludmFyaWFudCB0ZXJtIG9mIHRoZSBjb21wYXJpc29uLAorICAvLy8gdGhlIHN0cmlkZSBhbmQgdGhlIGtub3dsZWRnZSBvZiBOU1cvTlVXIGZsYWdzIG9uIHRoZSByZWN1cnJlbmNlLgorICBib29sIGRvZXNJVk92ZXJmbG93T25MVChjb25zdCBTQ0VWICpSSFMsIGNvbnN0IFNDRVYgKlN0cmlkZSwgYm9vbCBJc1NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb1dyYXApOworCisgIC8vLyBWZXJpZnkgaWYgYW4gbGluZWFyIElWIHdpdGggbmVnYXRpdmUgc3RyaWRlIGNhbiBvdmVyZmxvdyB3aGVuIGluIGEKKyAgLy8vIGdyZWF0ZXItdGhhbiBjb21wYXJpc29uLCBrbm93aW5nIHRoZSBpbnZhcmlhbnQgdGVybSBvZiB0aGUgY29tcGFyaXNvbiwKKyAgLy8vIHRoZSBzdHJpZGUgYW5kIHRoZSBrbm93bGVkZ2Ugb2YgTlNXL05VVyBmbGFncyBvbiB0aGUgcmVjdXJyZW5jZS4KKyAgYm9vbCBkb2VzSVZPdmVyZmxvd09uR1QoY29uc3QgU0NFViAqUkhTLCBjb25zdCBTQ0VWICpTdHJpZGUsIGJvb2wgSXNTaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTm9XcmFwKTsKKworICAvLy8gR2V0IGFkZCBleHByIGFscmVhZHkgY3JlYXRlZCBvciBjcmVhdGUgYSBuZXcgb25lLgorICBjb25zdCBTQ0VWICpnZXRPckNyZWF0ZUFkZEV4cHIoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDRVY6Ok5vV3JhcEZsYWdzIEZsYWdzKTsKKworICAvLy8gR2V0IG11bCBleHByIGFscmVhZHkgY3JlYXRlZCBvciBjcmVhdGUgYSBuZXcgb25lLgorICBjb25zdCBTQ0VWICpnZXRPckNyZWF0ZU11bEV4cHIoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDRVY6Ok5vV3JhcEZsYWdzIEZsYWdzKTsKKworICAvLy8gRmluZCBhbGwgb2YgdGhlIGxvb3BzIHRyYW5zaXRpdmVseSB1c2VkIGluIFxwIFMsIGFuZCBmaWxsIFxwIExvb3BzVXNlZC4KKyAgLy8vIEEgbG9vcCBpcyBjb25zaWRlcmVkICJ1c2VkIiBieSBhbiBleHByZXNzaW9uIGlmIGl0IGNvbnRhaW5zCisgIC8vLyBhbiBhZGQgcmVjIG9uIHNhaWQgbG9vcC4KKyAgdm9pZCBnZXRVc2VkTG9vcHMoY29uc3QgU0NFViAqUywgU21hbGxQdHJTZXRJbXBsPGNvbnN0IExvb3AgKj4gJkxvb3BzVXNlZCk7CisKKyAgLy8vIEZpbmQgYWxsIG9mIHRoZSBsb29wcyB0cmFuc2l0aXZlbHkgdXNlZCBpbiBccCBTLCBhbmQgdXBkYXRlIFxjIExvb3BVc2VycworICAvLy8gYWNjb3JkaW5nbHkuCisgIHZvaWQgYWRkVG9Mb29wVXNlTGlzdHMoY29uc3QgU0NFViAqUyk7CisKKyAgRm9sZGluZ1NldDxTQ0VWPiBVbmlxdWVTQ0VWczsKKyAgRm9sZGluZ1NldDxTQ0VWUHJlZGljYXRlPiBVbmlxdWVQcmVkczsKKyAgQnVtcFB0ckFsbG9jYXRvciBTQ0VWQWxsb2NhdG9yOworCisgIC8vLyBUaGlzIG1hcHMgbG9vcHMgdG8gYSBsaXN0IG9mIFNDRVYgZXhwcmVzc2lvbnMgdGhhdCAodHJhbnNpdGl2ZWx5KSB1c2Ugc2FpZAorICAvLy8gbG9vcC4KKyAgRGVuc2VNYXA8Y29uc3QgTG9vcCAqLCBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDQ+PiBMb29wVXNlcnM7CisKKyAgLy8vIENhY2hlIHRlbnRhdGl2ZSBtYXBwaW5ncyBmcm9tIFVua25vd25TQ0VWcyBpbiBhIExvb3AsIHRvIGEgU0NFViBleHByZXNzaW9uCisgIC8vLyB0aGV5IGNhbiBiZSByZXdyaXR0ZW4gaW50byB1bmRlciBjZXJ0YWluIHByZWRpY2F0ZXMuCisgIERlbnNlTWFwPHN0ZDo6cGFpcjxjb25zdCBTQ0VWVW5rbm93biAqLCBjb25zdCBMb29wICo+LAorICAgICAgICAgICBzdGQ6OnBhaXI8Y29uc3QgU0NFViAqLCBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWUHJlZGljYXRlICosIDM+Pj4KKyAgICAgIFByZWRpY2F0ZWRTQ0VWUmV3cml0ZXM7CisKKyAgLy8vIFRoZSBoZWFkIG9mIGEgbGlua2VkIGxpc3Qgb2YgYWxsIFNDRVZVbmtub3duIHZhbHVlcyB0aGF0IGhhdmUgYmVlbgorICAvLy8gYWxsb2NhdGVkLiBUaGlzIGlzIHVzZWQgYnkgcmVsZWFzZU1lbW9yeSB0byBsb2NhdGUgdGhlbSBhbGwgYW5kIGNhbGwKKyAgLy8vIHRoZWlyIGRlc3RydWN0b3JzLgorICBTQ0VWVW5rbm93biAqRmlyc3RVbmtub3duID0gbnVsbHB0cjsKK307CisKKy8vLyBBbmFseXNpcyBwYXNzIHRoYXQgZXhwb3NlcyB0aGUgXGMgU2NhbGFyRXZvbHV0aW9uIGZvciBhIGZ1bmN0aW9uLgorY2xhc3MgU2NhbGFyRXZvbHV0aW9uQW5hbHlzaXMKKyAgICA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjxTY2FsYXJFdm9sdXRpb25BbmFseXNpcz4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48U2NhbGFyRXZvbHV0aW9uQW5hbHlzaXM+OworCisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKK3B1YmxpYzoKKyAgdXNpbmcgUmVzdWx0ID0gU2NhbGFyRXZvbHV0aW9uOworCisgIFNjYWxhckV2b2x1dGlvbiBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gUHJpbnRlciBwYXNzIGZvciB0aGUgXGMgU2NhbGFyRXZvbHV0aW9uQW5hbHlzaXMgcmVzdWx0cy4KK2NsYXNzIFNjYWxhckV2b2x1dGlvblByaW50ZXJQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxTY2FsYXJFdm9sdXRpb25QcmludGVyUGFzcz4geworICByYXdfb3N0cmVhbSAmT1M7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgU2NhbGFyRXZvbHV0aW9uUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TKSA6IE9TKE9TKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK2NsYXNzIFNjYWxhckV2b2x1dGlvbldyYXBwZXJQYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgIHN0ZDo6dW5pcXVlX3B0cjxTY2FsYXJFdm9sdXRpb24+IFNFOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIFNjYWxhckV2b2x1dGlvbldyYXBwZXJQYXNzKCk7CisKKyAgU2NhbGFyRXZvbHV0aW9uICZnZXRTRSgpIHsgcmV0dXJuICpTRTsgfQorICBjb25zdCBTY2FsYXJFdm9sdXRpb24gJmdldFNFKCkgY29uc3QgeyByZXR1cm4gKlNFOyB9CisKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZTsKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUgKiA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIHZlcmlmeUFuYWx5c2lzKCkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gQW4gaW50ZXJmYWNlIGxheWVyIHdpdGggU0NFViB1c2VkIHRvIG1hbmFnZSBob3cgd2Ugc2VlIFNDRVYgZXhwcmVzc2lvbnMKKy8vLyBmb3IgdmFsdWVzIGluIHRoZSBjb250ZXh0IG9mIGV4aXN0aW5nIHByZWRpY2F0ZXMuIFdlIGNhbiBhZGQgbmV3CisvLy8gcHJlZGljYXRlcywgYnV0IHdlIGNhbm5vdCByZW1vdmUgdGhlbS4KKy8vLworLy8vIFRoaXMgbGF5ZXIgaGFzIG11bHRpcGxlIHB1cnBvc2VzOgorLy8vICAgLSBwcm92aWRlcyBhIHNpbXBsZSBpbnRlcmZhY2UgZm9yIFNDRVYgdmVyc2lvbmluZy4KKy8vLyAgIC0gZ3VhcmFudGVlcyB0aGF0IHRoZSBvcmRlciBvZiB0cmFuc2Zvcm1hdGlvbnMgYXBwbGllZCBvbiBhIFNDRVYKKy8vLyAgICAgZXhwcmVzc2lvbiBmb3IgYSBzaW5nbGUgVmFsdWUgaXMgY29uc2lzdGVudCBhY3Jvc3MgdHdvIGRpZmZlcmVudAorLy8vICAgICBnZXRTQ0VWIGNhbGxzLiBUaGlzIG1lYW5zIHRoYXQsIGZvciBleGFtcGxlLCBvbmNlIHdlJ3ZlIG9idGFpbmVkCisvLy8gICAgIGFuIEFkZFJlYyBleHByZXNzaW9uIGZvciBhIGNlcnRhaW4gdmFsdWUgdGhyb3VnaCBleHByZXNzaW9uCisvLy8gICAgIHJld3JpdGluZywgd2Ugd2lsbCBjb250aW51ZSB0byBnZXQgYW4gQWRkUmVjIGV4cHJlc3Npb24gZm9yIHRoYXQKKy8vLyAgICAgVmFsdWUuCisvLy8gICAtIGxvd2VycyB0aGUgbnVtYmVyIG9mIGV4cHJlc3Npb24gcmV3cml0ZXMuCitjbGFzcyBQcmVkaWNhdGVkU2NhbGFyRXZvbHV0aW9uIHsKK3B1YmxpYzoKKyAgUHJlZGljYXRlZFNjYWxhckV2b2x1dGlvbihTY2FsYXJFdm9sdXRpb24gJlNFLCBMb29wICZMKTsKKworICBjb25zdCBTQ0VWVW5pb25QcmVkaWNhdGUgJmdldFVuaW9uUHJlZGljYXRlKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIFNDRVYgZXhwcmVzc2lvbiBvZiBWLCBpbiB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudCBTQ0VWCisgIC8vLyBwcmVkaWNhdGUuICBUaGUgb3JkZXIgb2YgdHJhbnNmb3JtYXRpb25zIGFwcGxpZWQgb24gdGhlIGV4cHJlc3Npb24gb2YgVgorICAvLy8gcmV0dXJuZWQgYnkgU2NhbGFyRXZvbHV0aW9uIGlzIGd1YXJhbnRlZWQgdG8gYmUgcHJlc2VydmVkLCBldmVuIHdoZW4KKyAgLy8vIGFkZGluZyBuZXcgcHJlZGljYXRlcy4KKyAgY29uc3QgU0NFViAqZ2V0U0NFVihWYWx1ZSAqVik7CisKKyAgLy8vIEdldCB0aGUgKHByZWRpY2F0ZWQpIGJhY2tlZGdlIGNvdW50IGZvciB0aGUgYW5hbHl6ZWQgbG9vcC4KKyAgY29uc3QgU0NFViAqZ2V0QmFja2VkZ2VUYWtlbkNvdW50KCk7CisKKyAgLy8vIEFkZHMgYSBuZXcgcHJlZGljYXRlLgorICB2b2lkIGFkZFByZWRpY2F0ZShjb25zdCBTQ0VWUHJlZGljYXRlICZQcmVkKTsKKworICAvLy8gQXR0ZW1wdHMgdG8gcHJvZHVjZSBhbiBBZGRSZWNFeHByIGZvciBWIGJ5IGFkZGluZyBhZGRpdGlvbmFsIFNDRVYKKyAgLy8vIHByZWRpY2F0ZXMuIElmIHdlIGNhbid0IHRyYW5zZm9ybSB0aGUgZXhwcmVzc2lvbiBpbnRvIGFuIEFkZFJlY0V4cHIgd2UKKyAgLy8vIHJldHVybiBudWxscHRyIGFuZCBub3QgYWRkIGFkZGl0aW9uYWwgU0NFViBwcmVkaWNhdGVzIHRvIHRoZSBjdXJyZW50CisgIC8vLyBjb250ZXh0LgorICBjb25zdCBTQ0VWQWRkUmVjRXhwciAqZ2V0QXNBZGRSZWMoVmFsdWUgKlYpOworCisgIC8vLyBQcm92ZXMgdGhhdCBWIGRvZXNuJ3Qgb3ZlcmZsb3cgYnkgYWRkaW5nIFNDRVYgcHJlZGljYXRlLgorICB2b2lkIHNldE5vT3ZlcmZsb3coVmFsdWUgKlYsIFNDRVZXcmFwUHJlZGljYXRlOjpJbmNyZW1lbnRXcmFwRmxhZ3MgRmxhZ3MpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgd2UndmUgcHJvdmVkIHRoYXQgViBkb2Vzbid0IHdyYXAgYnkgbWVhbnMgb2YgYSBTQ0VWCisgIC8vLyBwcmVkaWNhdGUuCisgIGJvb2wgaGFzTm9PdmVyZmxvdyhWYWx1ZSAqViwgU0NFVldyYXBQcmVkaWNhdGU6OkluY3JlbWVudFdyYXBGbGFncyBGbGFncyk7CisKKyAgLy8vIFJldHVybnMgdGhlIFNjYWxhckV2b2x1dGlvbiBhbmFseXNpcyB1c2VkLgorICBTY2FsYXJFdm9sdXRpb24gKmdldFNFKCkgY29uc3QgeyByZXR1cm4gJlNFOyB9CisKKyAgLy8vIFdlIG5lZWQgdG8gZXhwbGljaXRseSBkZWZpbmUgdGhlIGNvcHkgY29uc3RydWN0b3IgYmVjYXVzZSBvZiBGbGFnc01hcC4KKyAgUHJlZGljYXRlZFNjYWxhckV2b2x1dGlvbihjb25zdCBQcmVkaWNhdGVkU2NhbGFyRXZvbHV0aW9uICYpOworCisgIC8vLyBQcmludCB0aGUgU0NFViBtYXBwaW5ncyBkb25lIGJ5IHRoZSBQcmVkaWNhdGVkIFNjYWxhciBFdm9sdXRpb24uCisgIC8vLyBUaGUgcHJpbnRlZCB0ZXh0IGlzIGluZGVudGVkIGJ5IFxwIERlcHRoLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgRGVwdGgpIGNvbnN0OworCisgIC8vLyBDaGVjayBpZiBccCBBUjEgYW5kIFxwIEFSMiBhcmUgZXF1YWwsIHdoaWxlIHRha2luZyBpbnRvIGFjY291bnQKKyAgLy8vIEVxdWFsIHByZWRpY2F0ZXMgaW4gUHJlZHMuCisgIGJvb2wgYXJlQWRkUmVjc0VxdWFsV2l0aFByZWRzKGNvbnN0IFNDRVZBZGRSZWNFeHByICpBUjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVZBZGRSZWNFeHByICpBUjIpIGNvbnN0OworCitwcml2YXRlOgorICAvLy8gSW5jcmVtZW50cyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHByZWRpY2F0ZS4gIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkCisgIC8vLyBldmVyeSB0aW1lIHRoZSBTQ0VWIHByZWRpY2F0ZSBjaGFuZ2VzLgorICB2b2lkIHVwZGF0ZUdlbmVyYXRpb24oKTsKKworICAvLy8gSG9sZHMgYSBTQ0VWIGFuZCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIFNDRVYgcHJlZGljYXRlIHVzZWQgdG8KKyAgLy8vIHBlcmZvcm0gdGhlIHJld3JpdGUgb2YgdGhlIGV4cHJlc3Npb24uCisgIHVzaW5nIFJld3JpdGVFbnRyeSA9IHN0ZDo6cGFpcjx1bnNpZ25lZCwgY29uc3QgU0NFViAqPjsKKworICAvLy8gTWFwcyBhIFNDRVYgdG8gdGhlIHJld3JpdGUgcmVzdWx0IG9mIHRoYXQgU0NFViBhdCBhIGNlcnRhaW4gdmVyc2lvbgorICAvLy8gbnVtYmVyLiBJZiB0aGlzIG51bWJlciBkb2Vzbid0IG1hdGNoIHRoZSBjdXJyZW50IEdlbmVyYXRpb24sIHdlIHdpbGwKKyAgLy8vIG5lZWQgdG8gZG8gYSByZXdyaXRlLiBUbyBwcmVzZXJ2ZSB0aGUgdHJhbnNmb3JtYXRpb24gb3JkZXIgb2YgcHJldmlvdXMKKyAgLy8vIHJld3JpdGVzLCB3ZSB3aWxsIHJld3JpdGUgdGhlIHByZXZpb3VzIHJlc3VsdCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbAorICAvLy8gU0NFVi4KKyAgRGVuc2VNYXA8Y29uc3QgU0NFViAqLCBSZXdyaXRlRW50cnk+IFJld3JpdGVNYXA7CisKKyAgLy8vIFJlY29yZHMgd2hhdCBOb1dyYXAgZmxhZ3Mgd2UndmUgYWRkZWQgdG8gYSBWYWx1ZSAqLgorICBWYWx1ZU1hcDxWYWx1ZSAqLCBTQ0VWV3JhcFByZWRpY2F0ZTo6SW5jcmVtZW50V3JhcEZsYWdzPiBGbGFnc01hcDsKKworICAvLy8gVGhlIFNjYWxhckV2b2x1dGlvbiBhbmFseXNpcy4KKyAgU2NhbGFyRXZvbHV0aW9uICZTRTsKKworICAvLy8gVGhlIGFuYWx5emVkIExvb3AuCisgIGNvbnN0IExvb3AgJkw7CisKKyAgLy8vIFRoZSBTQ0VWUHJlZGljYXRlIHRoYXQgZm9ybXMgb3VyIGNvbnRleHQuIFdlIHdpbGwgcmV3cml0ZSBhbGwKKyAgLy8vIGV4cHJlc3Npb25zIGFzc3VtaW5nIHRoYXQgdGhpcyBwcmVkaWNhdGUgdHJ1ZS4KKyAgU0NFVlVuaW9uUHJlZGljYXRlIFByZWRzOworCisgIC8vLyBNYXJrcyB0aGUgdmVyc2lvbiBvZiB0aGUgU0NFViBwcmVkaWNhdGUgdXNlZC4gV2hlbiByZXdyaXRpbmcgYSBTQ0VWCisgIC8vLyBleHByZXNzaW9uIHdlIG1hcmsgaXQgd2l0aCB0aGUgdmVyc2lvbiBvZiB0aGUgcHJlZGljYXRlLiBXZSB1c2UgdGhpcyB0bworICAvLy8gZmlndXJlIG91dCBpZiB0aGUgcHJlZGljYXRlIGhhcyBjaGFuZ2VkIGZyb20gdGhlIGxhc3QgcmV3cml0ZSBvZiB0aGUKKyAgLy8vIFNDRVYuIElmIHNvLCB3ZSBuZWVkIHRvIHBlcmZvcm0gYSBuZXcgcmV3cml0ZS4KKyAgdW5zaWduZWQgR2VuZXJhdGlvbiA9IDA7CisKKyAgLy8vIFRoZSBiYWNrZWRnZSB0YWtlbiBjb3VudC4KKyAgY29uc3QgU0NFViAqQmFja2VkZ2VDb3VudCA9IG51bGxwdHI7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19TQ0FMQVJFVk9MVVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25BbGlhc0FuYWx5c2lzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkFsaWFzQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjliZTUxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25BbGlhc0FuYWx5c2lzLmgKQEAgLTAsMCArMSw3MiBAQAorLy89PT0tIFNjYWxhckV2b2x1dGlvbkFsaWFzQW5hbHlzaXMuaCAtIFNDRVYtYmFzZWQgQUEgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgYSBTQ0VWLWJhc2VkIGFsaWFzIGFuYWx5c2lzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfU0NBTEFSRVZPTFVUSU9OQUxJQVNBTkFMWVNJU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfU0NBTEFSRVZPTFVUSU9OQUxJQVNBTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkV4cHJlc3Npb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEEgc2ltcGxlIGFsaWFzIGFuYWx5c2lzIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBTY2FsYXJFdm9sdXRpb24gdG8gYW5zd2VyCisvLy8gcXVlcmllcy4KK2NsYXNzIFNDRVZBQVJlc3VsdCA6IHB1YmxpYyBBQVJlc3VsdEJhc2U8U0NFVkFBUmVzdWx0PiB7CisgIFNjYWxhckV2b2x1dGlvbiAmU0U7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgU0NFVkFBUmVzdWx0KFNjYWxhckV2b2x1dGlvbiAmU0UpIDogQUFSZXN1bHRCYXNlKCksIFNFKFNFKSB7fQorICBTQ0VWQUFSZXN1bHQoU0NFVkFBUmVzdWx0ICYmQXJnKSA6IEFBUmVzdWx0QmFzZShzdGQ6Om1vdmUoQXJnKSksIFNFKEFyZy5TRSkge30KKworICBBbGlhc1Jlc3VsdCBhbGlhcyhjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQSwgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0IpOworCitwcml2YXRlOgorICBWYWx1ZSAqR2V0QmFzZVZhbHVlKGNvbnN0IFNDRVYgKlMpOworfTsKKworLy8vIEFuYWx5c2lzIHBhc3MgcHJvdmlkaW5nIGEgbmV2ZXItaW52YWxpZGF0ZWQgYWxpYXMgYW5hbHlzaXMgcmVzdWx0LgorY2xhc3MgU0NFVkFBIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPFNDRVZBQT4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48U0NFVkFBPjsKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICB0eXBlZGVmIFNDRVZBQVJlc3VsdCBSZXN1bHQ7CisKKyAgU0NFVkFBUmVzdWx0IHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBMZWdhY3kgd3JhcHBlciBwYXNzIHRvIHByb3ZpZGUgdGhlIFNDRVZBQVJlc3VsdCBvYmplY3QuCitjbGFzcyBTQ0VWQUFXcmFwcGVyUGFzcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICBzdGQ6OnVuaXF1ZV9wdHI8U0NFVkFBUmVzdWx0PiBSZXN1bHQ7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgU0NFVkFBV3JhcHBlclBhc3MoKTsKKworICBTQ0VWQUFSZXN1bHQgJmdldFJlc3VsdCgpIHsgcmV0dXJuICpSZXN1bHQ7IH0KKyAgY29uc3QgU0NFVkFBUmVzdWx0ICZnZXRSZXN1bHQoKSBjb25zdCB7IHJldHVybiAqUmVzdWx0OyB9CisKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZTsKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFxjIFNDRVZBQVdyYXBwZXJQYXNzLgorRnVuY3Rpb25QYXNzICpjcmVhdGVTQ0VWQUFXcmFwcGVyUGFzcygpOworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25FeHBhbmRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25FeHBhbmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZjA0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkV4cGFuZGVyLmgKQEAgLTAsMCArMSwzOTcgQEAKKy8vPT09LS0tLSBsbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkV4cGFuZGVyLmggLSBTQ0VWIEV4cHJzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGNsYXNzZXMgdXNlZCB0byBnZW5lcmF0ZSBjb2RlIGZyb20gc2NhbGFyIGV4cHJlc3Npb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19TQ0FMQVJFVk9MVVRJT05FWFBBTkRFUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfU0NBTEFSRVZPTFVUSU9ORVhQQU5ERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25FeHByZXNzaW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uTm9ybWFsaXphdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVGFyZ2V0Rm9sZGVyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JUkJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgVGFyZ2V0VHJhbnNmb3JtSW5mbzsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGV4cHJlc3Npb24gaXMgc2FmZSB0byBleHBhbmQgaW4gdGhlIHNlbnNlIHRoYXQKKyAgLy8vIGFsbCBtYXRlcmlhbGl6ZWQgdmFsdWVzIGFyZSBzYWZlIHRvIHNwZWN1bGF0ZSBhbnl3aGVyZSB0aGVpciBvcGVyYW5kcyBhcmUKKyAgLy8vIGRlZmluZWQuCisgIGJvb2wgaXNTYWZlVG9FeHBhbmQoY29uc3QgU0NFViAqUywgU2NhbGFyRXZvbHV0aW9uICZTRSk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBleHByZXNzaW9uIGlzIHNhZmUgdG8gZXhwYW5kIGluIHRoZSBzZW5zZSB0aGF0CisgIC8vLyBhbGwgbWF0ZXJpYWxpemVkIHZhbHVlcyBhcmUgZGVmaW5lZCBhbmQgc2FmZSB0byBzcGVjdWxhdGUgYXQgdGhlIHNwZWNpZmllZAorICAvLy8gbG9jYXRpb24gYW5kIHRoZWlyIG9wZXJhbmRzIGFyZSBkZWZpbmVkIGF0IHRoaXMgbG9jYXRpb24uCisgIGJvb2wgaXNTYWZlVG9FeHBhbmRBdChjb25zdCBTQ0VWICpTLCBjb25zdCBJbnN0cnVjdGlvbiAqSW5zZXJ0aW9uUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gJlNFKTsKKworICAvLy8gVGhpcyBjbGFzcyB1c2VzIGluZm9ybWF0aW9uIGFib3V0IGFuYWx5emUgc2NhbGFycyB0byByZXdyaXRlIGV4cHJlc3Npb25zCisgIC8vLyBpbiBjYW5vbmljYWwgZm9ybS4KKyAgLy8vCisgIC8vLyBDbGllbnRzIHNob3VsZCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aGVuIHJld3JpdGluZyBpcyBuZWVkZWQsCisgIC8vLyBhbmQgZGVzdHJveSBpdCB3aGVuIGZpbmlzaGVkIHRvIGFsbG93IHRoZSByZWxlYXNlIG9mIHRoZSBhc3NvY2lhdGVkCisgIC8vLyBtZW1vcnkuCisgIGNsYXNzIFNDRVZFeHBhbmRlciA6IHB1YmxpYyBTQ0VWVmlzaXRvcjxTQ0VWRXhwYW5kZXIsIFZhbHVlKj4geworICAgIFNjYWxhckV2b2x1dGlvbiAmU0U7CisgICAgY29uc3QgRGF0YUxheW91dCAmREw7CisKKyAgICAvLyBOZXcgaW5zdHJ1Y3Rpb25zIHJlY2VpdmUgYSBuYW1lIHRvIGlkZW50aWZ5IHRoZW0gd2l0aCB0aGUgY3VycmVudCBwYXNzLgorICAgIGNvbnN0IGNoYXIqIElWTmFtZTsKKworICAgIC8vIEluc2VydGVkRXhwcmVzc2lvbnMgY2FjaGVzIFZhbHVlcyBmb3IgcmV1c2UsIHNvIG11c3QgdHJhY2sgUkFVVy4KKyAgICBEZW5zZU1hcDxzdGQ6OnBhaXI8Y29uc3QgU0NFViAqLCBJbnN0cnVjdGlvbiAqPiwgVHJhY2tpbmdWSDxWYWx1ZT4+CisgICAgICAgIEluc2VydGVkRXhwcmVzc2lvbnM7CisKKyAgICAvLyBJbnNlcnRlZFZhbHVlcyBvbmx5IGZsYWdzIGluc2VydGVkIGluc3RydWN0aW9ucyBzbyBuZWVkcyBubyBSQVVXLgorICAgIERlbnNlU2V0PEFzc2VydGluZ1ZIPFZhbHVlPj4gSW5zZXJ0ZWRWYWx1ZXM7CisgICAgRGVuc2VTZXQ8QXNzZXJ0aW5nVkg8VmFsdWU+PiBJbnNlcnRlZFBvc3RJbmNWYWx1ZXM7CisKKyAgICAvLy8gQSBtZW1vaXphdGlvbiBvZiB0aGUgInJlbGV2YW50IiBsb29wIGZvciBhIGdpdmVuIFNDRVYuCisgICAgRGVuc2VNYXA8Y29uc3QgU0NFViAqLCBjb25zdCBMb29wICo+IFJlbGV2YW50TG9vcHM7CisKKyAgICAvLy8gQWRkcmVjcyByZWZlcnJpbmcgdG8gYW55IG9mIHRoZSBnaXZlbiBsb29wcyBhcmUgZXhwYW5kZWQgaW4gcG9zdC1pbmMKKyAgICAvLy8gbW9kZS4gRm9yIGV4YW1wbGUsIGV4cGFuZGluZyB7MSwrLDF9PEw+IGluIHBvc3QtaW5jIG1vZGUgcmV0dXJucyB0aGUgYWRkCisgICAgLy8vIGluc3RydWN0aW9uIHRoYXQgYWRkcyBvbmUgdG8gdGhlIHBoaSBmb3IgezAsKywxfTxMPiwgYXMgb3Bwb3NlZCB0byBhIG5ldworICAgIC8vLyBwaGkgc3RhcnRpbmcgYXQgMS4gVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBub24tY2Fub25pY2FsIG1vZGUuCisgICAgUG9zdEluY0xvb3BTZXQgUG9zdEluY0xvb3BzOworCisgICAgLy8vIFdoZW4gdGhpcyBpcyBub24tbnVsbCwgYWRkcmVjcyBleHBhbmRlZCBpbiB0aGUgbG9vcCBpdCBpbmRpY2F0ZXMgc2hvdWxkCisgICAgLy8vIGJlIGluc2VydGVkIHdpdGggaW5jcmVtZW50cyBhdCBJVkluY0luc2VydFBvcy4KKyAgICBjb25zdCBMb29wICpJVkluY0luc2VydExvb3A7CisKKyAgICAvLy8gV2hlbiBleHBhbmRpbmcgYWRkcmVjcyBpbiB0aGUgSVZJbmNJbnNlcnRMb29wIGxvb3AsIGluc2VydCB0aGUgSVYKKyAgICAvLy8gaW5jcmVtZW50IGF0IHRoaXMgcG9zaXRpb24uCisgICAgSW5zdHJ1Y3Rpb24gKklWSW5jSW5zZXJ0UG9zOworCisgICAgLy8vIFBoaXMgdGhhdCBjb21wbGV0ZSBhbiBJViBjaGFpbi4gUmV1c2UKKyAgICBEZW5zZVNldDxBc3NlcnRpbmdWSDxQSElOb2RlPj4gQ2hhaW5lZFBoaXM7CisKKyAgICAvLy8gV2hlbiB0cnVlLCBleHByZXNzaW9ucyBhcmUgZXhwYW5kZWQgaW4gImNhbm9uaWNhbCIgZm9ybS4gSW4gcGFydGljdWxhciwKKyAgICAvLy8gYWRkcmVjcyBhcmUgZXhwYW5kZWQgYXMgYXJpdGhtZXRpYyBiYXNlZCBvbiBhIGNhbm9uaWNhbCBpbmR1Y3Rpb24KKyAgICAvLy8gdmFyaWFibGUuIFdoZW4gZmFsc2UsIGV4cHJlc3Npb24gYXJlIGV4cGFuZGVkIGluIGEgbW9yZSBsaXRlcmFsIGZvcm0uCisgICAgYm9vbCBDYW5vbmljYWxNb2RlOworCisgICAgLy8vIFdoZW4gaW52b2tlZCBmcm9tIExTUiwgdGhlIGV4cGFuZGVyIGlzIGluICJzdHJlbmd0aCByZWR1Y3Rpb24iIG1vZGUuIFRoZQorICAgIC8vLyBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCBwaGkncyBhcmUgb25seSByZXVzZWQgaWYgdGhleSBhcmUgYWxyZWFkeSBpbgorICAgIC8vLyAiZXhwYW5kZWQiIGZvcm0uCisgICAgYm9vbCBMU1JNb2RlOworCisgICAgdHlwZWRlZiBJUkJ1aWxkZXI8VGFyZ2V0Rm9sZGVyPiBCdWlsZGVyVHlwZTsKKyAgICBCdWlsZGVyVHlwZSBCdWlsZGVyOworCisgICAgLy8gUkFJSSBvYmplY3QgdGhhdCBzdG9yZXMgdGhlIGN1cnJlbnQgaW5zZXJ0aW9uIHBvaW50IGFuZCByZXN0b3JlcyBpdCB3aGVuCisgICAgLy8gdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQuIFRoaXMgaW5jbHVkZXMgdGhlIGRlYnVnIGxvY2F0aW9uLiAgRHVwbGljYXRlZAorICAgIC8vIGZyb20gSW5zZXJ0UG9pbnRHdWFyZCB0byBhZGQgU2V0SW5zZXJ0UG9pbnQoKSB3aGljaCBpcyB1c2VkIHRvIHVwZGF0ZWQKKyAgICAvLyBJbnNlcnRQb2ludEd1YXJkcyBzdGFjayB3aGVuIGluc2VydCBwb2ludHMgYXJlIG1vdmVkIGR1cmluZyBTQ0VWCisgICAgLy8gZXhwYW5zaW9uLgorICAgIGNsYXNzIFNDRVZJbnNlcnRQb2ludEd1YXJkIHsKKyAgICAgIElSQnVpbGRlckJhc2UgJkJ1aWxkZXI7CisgICAgICBBc3NlcnRpbmdWSDxCYXNpY0Jsb2NrPiBCbG9jazsKKyAgICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIFBvaW50OworICAgICAgRGVidWdMb2MgRGJnTG9jOworICAgICAgU0NFVkV4cGFuZGVyICpTRTsKKworICAgICAgU0NFVkluc2VydFBvaW50R3VhcmQoY29uc3QgU0NFVkluc2VydFBvaW50R3VhcmQgJikgPSBkZWxldGU7CisgICAgICBTQ0VWSW5zZXJ0UG9pbnRHdWFyZCAmb3BlcmF0b3I9KGNvbnN0IFNDRVZJbnNlcnRQb2ludEd1YXJkICYpID0gZGVsZXRlOworCisgICAgcHVibGljOgorICAgICAgU0NFVkluc2VydFBvaW50R3VhcmQoSVJCdWlsZGVyQmFzZSAmQiwgU0NFVkV4cGFuZGVyICpTRSkKKyAgICAgICAgICA6IEJ1aWxkZXIoQiksIEJsb2NrKEIuR2V0SW5zZXJ0QmxvY2soKSksIFBvaW50KEIuR2V0SW5zZXJ0UG9pbnQoKSksCisgICAgICAgICAgICBEYmdMb2MoQi5nZXRDdXJyZW50RGVidWdMb2NhdGlvbigpKSwgU0UoU0UpIHsKKyAgICAgICAgU0UtPkluc2VydFBvaW50R3VhcmRzLnB1c2hfYmFjayh0aGlzKTsKKyAgICAgIH0KKworICAgICAgflNDRVZJbnNlcnRQb2ludEd1YXJkKCkgeworICAgICAgICAvLyBUaGVzZSBndWFyZHMgc2hvdWxkIGFsd2F5cyBjcmVhdGVkL2Rlc3Ryb3llZCBpbiBGSUZPIG9yZGVyIHNpbmNlIHRoZXkKKyAgICAgICAgLy8gYXJlIHVzZWQgdG8gZ3VhcmQgbGV4aWNhbGx5IHNjb3BlZCBibG9ja3Mgb2YgY29kZSBpbgorICAgICAgICAvLyBTY2FsYXJFdm9sdXRpb25FeHBhbmRlci4KKyAgICAgICAgYXNzZXJ0KFNFLT5JbnNlcnRQb2ludEd1YXJkcy5iYWNrKCkgPT0gdGhpcyk7CisgICAgICAgIFNFLT5JbnNlcnRQb2ludEd1YXJkcy5wb3BfYmFjaygpOworICAgICAgICBCdWlsZGVyLnJlc3RvcmVJUChJUkJ1aWxkZXJCYXNlOjpJbnNlcnRQb2ludChCbG9jaywgUG9pbnQpKTsKKyAgICAgICAgQnVpbGRlci5TZXRDdXJyZW50RGVidWdMb2NhdGlvbihEYmdMb2MpOworICAgICAgfQorCisgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBHZXRJbnNlcnRQb2ludCgpIGNvbnN0IHsgcmV0dXJuIFBvaW50OyB9CisgICAgICB2b2lkIFNldEluc2VydFBvaW50KEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIHsgUG9pbnQgPSBJOyB9CisgICAgfTsKKworICAgIC8vLyBTdGFjayBvZiBwb2ludGVycyB0byBzYXZlZCBpbnNlcnQgcG9pbnRzLCB1c2VkIHRvIGtlZXAgaW5zZXJ0IHBvaW50cworICAgIC8vLyBjb25zaXN0ZW50IHdoZW4gaW5zdHJ1Y3Rpb25zIGFyZSBtb3ZlZC4KKyAgICBTbWFsbFZlY3RvcjxTQ0VWSW5zZXJ0UG9pbnRHdWFyZCAqLCA4PiBJbnNlcnRQb2ludEd1YXJkczsKKworI2lmbmRlZiBOREVCVUcKKyAgICBjb25zdCBjaGFyICpEZWJ1Z1R5cGU7CisjZW5kaWYKKworICAgIGZyaWVuZCBzdHJ1Y3QgU0NFVlZpc2l0b3I8U0NFVkV4cGFuZGVyLCBWYWx1ZSo+OworCisgIHB1YmxpYzoKKyAgICAvLy8gQ29uc3RydWN0IGEgU0NFVkV4cGFuZGVyIGluICJjYW5vbmljYWwiIG1vZGUuCisgICAgZXhwbGljaXQgU0NFVkV4cGFuZGVyKFNjYWxhckV2b2x1dGlvbiAmc2UsIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKQorICAgICAgICA6IFNFKHNlKSwgREwoREwpLCBJVk5hbWUobmFtZSksIElWSW5jSW5zZXJ0TG9vcChudWxscHRyKSwKKyAgICAgICAgICBJVkluY0luc2VydFBvcyhudWxscHRyKSwgQ2Fub25pY2FsTW9kZSh0cnVlKSwgTFNSTW9kZShmYWxzZSksCisgICAgICAgICAgQnVpbGRlcihzZS5nZXRDb250ZXh0KCksIFRhcmdldEZvbGRlcihETCkpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICBEZWJ1Z1R5cGUgPSAiIjsKKyNlbmRpZgorICAgIH0KKworICAgIH5TQ0VWRXhwYW5kZXIoKSB7CisgICAgICAvLyBNYWtlIHN1cmUgdGhlIGluc2VydCBwb2ludCBndWFyZCBzdGFjayBpcyBjb25zaXN0ZW50LgorICAgICAgYXNzZXJ0KEluc2VydFBvaW50R3VhcmRzLmVtcHR5KCkpOworICAgIH0KKworI2lmbmRlZiBOREVCVUcKKyAgICB2b2lkIHNldERlYnVnVHlwZShjb25zdCBjaGFyKiBzKSB7IERlYnVnVHlwZSA9IHM7IH0KKyNlbmRpZgorCisgICAgLy8vIEVyYXNlIHRoZSBjb250ZW50cyBvZiB0aGUgSW5zZXJ0ZWRFeHByZXNzaW9ucyBtYXAgc28gdGhhdCB1c2VycyB0cnlpbmcKKyAgICAvLy8gdG8gZXhwYW5kIHRoZSBzYW1lIGV4cHJlc3Npb24gaW50byBtdWx0aXBsZSBCYXNpY0Jsb2NrcyBvciBkaWZmZXJlbnQKKyAgICAvLy8gcGxhY2VzIHdpdGhpbiB0aGUgc2FtZSBCYXNpY0Jsb2NrIGNhbiBkbyBzby4KKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgSW5zZXJ0ZWRFeHByZXNzaW9ucy5jbGVhcigpOworICAgICAgSW5zZXJ0ZWRWYWx1ZXMuY2xlYXIoKTsKKyAgICAgIEluc2VydGVkUG9zdEluY1ZhbHVlcy5jbGVhcigpOworICAgICAgQ2hhaW5lZFBoaXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgZm9yIGV4cHJlc3Npb25zIHRoYXQgbWF5IGluY3VyIG5vbi10cml2aWFsIGNvc3QgdG8gZXZhbHVhdGUKKyAgICAvLy8gYXQgcnVudGltZS4KKyAgICAvLy8KKyAgICAvLy8gQXQgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHdoaWNoIHNwZWNpZmllcyBwb2ludCBpbiBjb2RlIHdoZXJlIHVzZXIgaXMKKyAgICAvLy8gZ29pbmcgdG8gZXhwYW5kIHRoaXMgZXhwcmVzc2lvbi4gU29tZXRpbWVzIHRoaXMga25vd2xlZGdlIGNhbiBsZWFkIHRvIGEKKyAgICAvLy8gbW9yZSBhY2N1cmF0ZSBjb3N0IGVzdGltYXRpb24uCisgICAgYm9vbCBpc0hpZ2hDb3N0RXhwYW5zaW9uKGNvbnN0IFNDRVYgKkV4cHIsIExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpBdCA9IG51bGxwdHIpIHsKKyAgICAgIFNtYWxsUHRyU2V0PGNvbnN0IFNDRVYgKiwgOD4gUHJvY2Vzc2VkOworICAgICAgcmV0dXJuIGlzSGlnaENvc3RFeHBhbnNpb25IZWxwZXIoRXhwciwgTCwgQXQsIFByb2Nlc3NlZCk7CisgICAgfQorCisgICAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGNhbm9uaWNhbCBpbmR1Y3Rpb24gdmFyaWFibGUgb2YgdGhlIHNwZWNpZmllZAorICAgIC8vLyB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIGxvb3AgKGluc2VydGluZyBvbmUgaWYgdGhlcmUgaXMgbm9uZSkuICBBCisgICAgLy8vIGNhbm9uaWNhbCBpbmR1Y3Rpb24gdmFyaWFibGUgc3RhcnRzIGF0IHplcm8gYW5kIHN0ZXBzIGJ5IG9uZSBvbiBlYWNoCisgICAgLy8vIGl0ZXJhdGlvbi4KKyAgICBQSElOb2RlICpnZXRPckluc2VydENhbm9uaWNhbEluZHVjdGlvblZhcmlhYmxlKGNvbnN0IExvb3AgKkwsIFR5cGUgKlR5KTsKKworICAgIC8vLyBSZXR1cm4gdGhlIGluZHVjdGlvbiB2YXJpYWJsZSBpbmNyZW1lbnQncyBJViBvcGVyYW5kLgorICAgIEluc3RydWN0aW9uICpnZXRJVkluY09wZXJhbmQoSW5zdHJ1Y3Rpb24gKkluY1YsIEluc3RydWN0aW9uICpJbnNlcnRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93U2NhbGUpOworCisgICAgLy8vIFV0aWxpdHkgZm9yIGhvaXN0aW5nIGFuIElWIGluY3JlbWVudC4KKyAgICBib29sIGhvaXN0SVZJbmMoSW5zdHJ1Y3Rpb24gKkluY1YsIEluc3RydWN0aW9uICpJbnNlcnRQb3MpOworCisgICAgLy8vIHJlcGxhY2UgY29uZ3J1ZW50IHBoaXMgd2l0aCB0aGVpciBtb3N0IGNhbm9uaWNhbCByZXByZXNlbnRhdGl2ZS4gUmV0dXJuCisgICAgLy8vIHRoZSBudW1iZXIgb2YgcGhpcyBlbGltaW5hdGVkLgorICAgIHVuc2lnbmVkIHJlcGxhY2VDb25ncnVlbnRJVnMoTG9vcCAqTCwgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8V2Vha1RyYWNraW5nVkg+ICZEZWFkSW5zdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRUcmFuc2Zvcm1JbmZvICpUVEkgPSBudWxscHRyKTsKKworICAgIC8vLyBJbnNlcnQgY29kZSB0byBkaXJlY3RseSBjb21wdXRlIHRoZSBzcGVjaWZpZWQgU0NFViBleHByZXNzaW9uIGludG8gdGhlCisgICAgLy8vIHByb2dyYW0uICBUaGUgaW5zZXJ0ZWQgY29kZSBpcyBpbnNlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgYmxvY2suCisgICAgVmFsdWUgKmV4cGFuZENvZGVGb3IoY29uc3QgU0NFViAqU0gsIFR5cGUgKlR5LCBJbnN0cnVjdGlvbiAqSSk7CisKKyAgICAvLy8gSW5zZXJ0IGNvZGUgdG8gZGlyZWN0bHkgY29tcHV0ZSB0aGUgc3BlY2lmaWVkIFNDRVYgZXhwcmVzc2lvbiBpbnRvIHRoZQorICAgIC8vLyBwcm9ncmFtLiAgVGhlIGluc2VydGVkIGNvZGUgaXMgaW5zZXJ0ZWQgaW50byB0aGUgU0NFVkV4cGFuZGVyJ3MgY3VycmVudAorICAgIC8vLyBpbnNlcnRpb24gcG9pbnQuIElmIGEgdHlwZSBpcyBzcGVjaWZpZWQsIHRoZSByZXN1bHQgd2lsbCBiZSBleHBhbmRlZCB0bworICAgIC8vLyBoYXZlIHRoYXQgdHlwZSwgd2l0aCBhIGNhc3QgaWYgbmVjZXNzYXJ5LgorICAgIFZhbHVlICpleHBhbmRDb2RlRm9yKGNvbnN0IFNDRVYgKlNILCBUeXBlICpUeSA9IG51bGxwdHIpOworCisKKyAgICAvLy8gR2VuZXJhdGVzIGEgY29kZSBzZXF1ZW5jZSB0aGF0IGV2YWx1YXRlcyB0aGlzIHByZWRpY2F0ZS4gIFRoZSBpbnNlcnRlZAorICAgIC8vLyBpbnN0cnVjdGlvbnMgd2lsbCBiZSBhdCBwb3NpdGlvbiBccCBMb2MuICBUaGUgcmVzdWx0IHdpbGwgYmUgb2YgdHlwZSBpMQorICAgIC8vLyBhbmQgd2lsbCBoYXZlIGEgdmFsdWUgb2YgMCB3aGVuIHRoZSBwcmVkaWNhdGUgaXMgZmFsc2UgYW5kIDEgb3RoZXJ3aXNlLgorICAgIFZhbHVlICpleHBhbmRDb2RlRm9yUHJlZGljYXRlKGNvbnN0IFNDRVZQcmVkaWNhdGUgKlByZWQsIEluc3RydWN0aW9uICpMb2MpOworCisgICAgLy8vIEEgc3BlY2lhbGl6ZWQgdmFyaWFudCBvZiBleHBhbmRDb2RlRm9yUHJlZGljYXRlLCBoYW5kbGluZyB0aGUgY2FzZSB3aGVuCisgICAgLy8vIHdlIGFyZSBleHBhbmRpbmcgY29kZSBmb3IgYSBTQ0VWRXF1YWxQcmVkaWNhdGUuCisgICAgVmFsdWUgKmV4cGFuZEVxdWFsUHJlZGljYXRlKGNvbnN0IFNDRVZFcXVhbFByZWRpY2F0ZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkxvYyk7CisKKyAgICAvLy8gR2VuZXJhdGVzIGNvZGUgdGhhdCBldmFsdWF0ZXMgaWYgdGhlIFxwIEFSIGV4cHJlc3Npb24gd2lsbCBvdmVyZmxvdy4KKyAgICBWYWx1ZSAqZ2VuZXJhdGVPdmVyZmxvd0NoZWNrKGNvbnN0IFNDRVZBZGRSZWNFeHByICpBUiwgSW5zdHJ1Y3Rpb24gKkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2lnbmVkKTsKKworICAgIC8vLyBBIHNwZWNpYWxpemVkIHZhcmlhbnQgb2YgZXhwYW5kQ29kZUZvclByZWRpY2F0ZSwgaGFuZGxpbmcgdGhlIGNhc2Ugd2hlbgorICAgIC8vLyB3ZSBhcmUgZXhwYW5kaW5nIGNvZGUgZm9yIGEgU0NFVldyYXBQcmVkaWNhdGUuCisgICAgVmFsdWUgKmV4cGFuZFdyYXBQcmVkaWNhdGUoY29uc3QgU0NFVldyYXBQcmVkaWNhdGUgKlAsIEluc3RydWN0aW9uICpMb2MpOworCisgICAgLy8vIEEgc3BlY2lhbGl6ZWQgdmFyaWFudCBvZiBleHBhbmRDb2RlRm9yUHJlZGljYXRlLCBoYW5kbGluZyB0aGUgY2FzZSB3aGVuCisgICAgLy8vIHdlIGFyZSBleHBhbmRpbmcgY29kZSBmb3IgYSBTQ0VWVW5pb25QcmVkaWNhdGUuCisgICAgVmFsdWUgKmV4cGFuZFVuaW9uUHJlZGljYXRlKGNvbnN0IFNDRVZVbmlvblByZWRpY2F0ZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkxvYyk7CisKKyAgICAvLy8gU2V0IHRoZSBjdXJyZW50IElWIGluY3JlbWVudCBsb29wIGFuZCBwb3NpdGlvbi4KKyAgICB2b2lkIHNldElWSW5jSW5zZXJ0UG9zKGNvbnN0IExvb3AgKkwsIEluc3RydWN0aW9uICpQb3MpIHsKKyAgICAgIGFzc2VydCghQ2Fub25pY2FsTW9kZSAmJgorICAgICAgICAgICAgICJJViBpbmNyZW1lbnQgcG9zaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluIENhbm9uaWNhbE1vZGUiKTsKKyAgICAgIElWSW5jSW5zZXJ0TG9vcCA9IEw7CisgICAgICBJVkluY0luc2VydFBvcyA9IFBvczsKKyAgICB9CisKKyAgICAvLy8gRW5hYmxlIHBvc3QtaW5jIGV4cGFuc2lvbiBmb3IgYWRkcmVjcyByZWZlcnJpbmcgdG8gdGhlIGdpdmVuCisgICAgLy8vIGxvb3BzLiBQb3N0LWluYyBleHBhbnNpb24gaXMgb25seSBzdXBwb3J0ZWQgaW4gbm9uLWNhbm9uaWNhbCBtb2RlLgorICAgIHZvaWQgc2V0UG9zdEluYyhjb25zdCBQb3N0SW5jTG9vcFNldCAmTCkgeworICAgICAgYXNzZXJ0KCFDYW5vbmljYWxNb2RlICYmCisgICAgICAgICAgICAgIlBvc3QtaW5jIGV4cGFuc2lvbiBpcyBub3Qgc3VwcG9ydGVkIGluIENhbm9uaWNhbE1vZGUiKTsKKyAgICAgIFBvc3RJbmNMb29wcyA9IEw7CisgICAgfQorCisgICAgLy8vIERpc2FibGUgYWxsIHBvc3QtaW5jIGV4cGFuc2lvbi4KKyAgICB2b2lkIGNsZWFyUG9zdEluYygpIHsKKyAgICAgIFBvc3RJbmNMb29wcy5jbGVhcigpOworCisgICAgICAvLyBXaGVuIHdlIGNoYW5nZSB0aGUgcG9zdC1pbmMgbG9vcCBzZXQsIGNhY2hlZCBleHBhbnNpb25zIG1heSBubworICAgICAgLy8gbG9uZ2VyIGJlIHZhbGlkLgorICAgICAgSW5zZXJ0ZWRQb3N0SW5jVmFsdWVzLmNsZWFyKCk7CisgICAgfQorCisgICAgLy8vIERpc2FibGUgdGhlIGJlaGF2aW9yIG9mIGV4cGFuZGluZyBleHByZXNzaW9ucyBpbiBjYW5vbmljYWwgZm9ybSByYXRoZXIKKyAgICAvLy8gdGhhbiBpbiBhIG1vcmUgbGl0ZXJhbCBmb3JtLiBOb24tY2Fub25pY2FsIG1vZGUgaXMgdXNlZnVsIGZvciBsYXRlCisgICAgLy8vIG9wdGltaXphdGlvbiBwYXNzZXMuCisgICAgdm9pZCBkaXNhYmxlQ2Fub25pY2FsTW9kZSgpIHsgQ2Fub25pY2FsTW9kZSA9IGZhbHNlOyB9CisKKyAgICB2b2lkIGVuYWJsZUxTUk1vZGUoKSB7IExTUk1vZGUgPSB0cnVlOyB9CisKKyAgICAvLy8gU2V0IHRoZSBjdXJyZW50IGluc2VydGlvbiBwb2ludC4gVGhpcyBpcyB1c2VmdWwgaWYgbXVsdGlwbGUgY2FsbHMgdG8KKyAgICAvLy8gZXhwYW5kQ29kZUZvcigpIGFyZSBnb2luZyB0byBiZSBtYWRlIHdpdGggdGhlIHNhbWUgaW5zZXJ0IHBvaW50IGFuZCB0aGUKKyAgICAvLy8gaW5zZXJ0IHBvaW50IG1heSBiZSBtb3ZlZCBkdXJpbmcgb25lIG9mIHRoZSBleHBhbnNpb25zIChlLmcuIGlmIHRoZQorICAgIC8vLyBpbnNlcnQgcG9pbnQgaXMgbm90IGEgYmxvY2sgdGVybWluYXRvcikuCisgICAgdm9pZCBzZXRJbnNlcnRQb2ludChJbnN0cnVjdGlvbiAqSVApIHsKKyAgICAgIGFzc2VydChJUCk7CisgICAgICBCdWlsZGVyLlNldEluc2VydFBvaW50KElQKTsKKyAgICB9CisKKyAgICAvLy8gQ2xlYXIgdGhlIGN1cnJlbnQgaW5zZXJ0aW9uIHBvaW50LiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgaW5zdHJ1Y3Rpb24KKyAgICAvLy8gdGhhdCBoYWQgYmVlbiBzZXJ2aW5nIGFzIHRoZSBpbnNlcnRpb24gcG9pbnQgbWF5IGhhdmUgYmVlbiBkZWxldGVkLgorICAgIHZvaWQgY2xlYXJJbnNlcnRQb2ludCgpIHsKKyAgICAgIEJ1aWxkZXIuQ2xlYXJJbnNlcnRpb25Qb2ludCgpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIHdhcyBpbnNlcnRlZCBieSB0aGUgY29kZQorICAgIC8vLyByZXdyaXRlci4gIElmIHNvLCB0aGUgY2xpZW50IHNob3VsZCBub3QgbW9kaWZ5IHRoZSBpbnN0cnVjdGlvbi4KKyAgICBib29sIGlzSW5zZXJ0ZWRJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAqSSkgY29uc3QgeworICAgICAgcmV0dXJuIEluc2VydGVkVmFsdWVzLmNvdW50KEkpIHx8IEluc2VydGVkUG9zdEluY1ZhbHVlcy5jb3VudChJKTsKKyAgICB9CisKKyAgICB2b2lkIHNldENoYWluZWRQaGkoUEhJTm9kZSAqUE4pIHsgQ2hhaW5lZFBoaXMuaW5zZXJ0KFBOKTsgfQorCisgICAgLy8vIFRyeSB0byBmaW5kIGV4aXN0aW5nIExMVk0gSVIgdmFsdWUgZm9yIFMgYXZhaWxhYmxlIGF0IHRoZSBwb2ludCBBdC4KKyAgICBWYWx1ZSAqZ2V0RXhhY3RFeGlzdGluZ0V4cGFuc2lvbihjb25zdCBTQ0VWICpTLCBjb25zdCBJbnN0cnVjdGlvbiAqQXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcCAqTCk7CisKKyAgICAvLy8gVHJ5IHRvIGZpbmQgdGhlIFZhbHVlT2Zmc2V0UGFpciBmb3IgUy4gVGhlIGZ1bmN0aW9uIGlzIG1haW5seSB1c2VkIHRvCisgICAgLy8vIGNoZWNrIHdoZXRoZXIgUyBjYW4gYmUgZXhwYW5kZWQgY2hlYXBseS4gIElmIHRoaXMgcmV0dXJucyBhIG5vbi1Ob25lCisgICAgLy8vIHZhbHVlLCB3ZSBrbm93IHdlIGNhbiBjb2RlZ2VuIHRoZSBgVmFsdWVPZmZzZXRQYWlyYCBpbnRvIGEgc3VpdGFibGUKKyAgICAvLy8gZXhwYW5zaW9uIGlkZW50aWNhbCB3aXRoIFMgc28gdGhhdCBTIGNhbiBiZSBleHBhbmRlZCBjaGVhcGx5LgorICAgIC8vLworICAgIC8vLyBMIGlzIGEgaGludCB3aGljaCB0ZWxscyBpbiB3aGljaCBsb29wIHRvIGxvb2sgZm9yIHRoZSBzdWl0YWJsZSB2YWx1ZS4KKyAgICAvLy8gT24gc3VjY2VzcyByZXR1cm4gdmFsdWUgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgZXhwYW5kZWQgUyBhdCBwb2ludAorICAgIC8vLyBBdC4gUmV0dXJuIG51bGxwdHIgaWYgdmFsdWUgd2FzIG5vdCBmb3VuZC4KKyAgICAvLy8KKyAgICAvLy8gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBhbiBleGhhdXN0aXZlIHNlYXJjaC4gSS5lIGlmIGl0CisgICAgLy8vIGRpZG4ndCBmaW5kIGFueSB2YWx1ZSBpdCBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlcmUgaXMgbm8gc3VjaCB2YWx1ZS4KKyAgICAvLy8KKyAgICBPcHRpb25hbDxTY2FsYXJFdm9sdXRpb246OlZhbHVlT2Zmc2V0UGFpcj4KKyAgICBnZXRSZWxhdGVkRXhpc3RpbmdFeHBhbnNpb24oY29uc3QgU0NFViAqUywgY29uc3QgSW5zdHJ1Y3Rpb24gKkF0LCBMb29wICpMKTsKKworICBwcml2YXRlOgorICAgIExMVk1Db250ZXh0ICZnZXRDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gU0UuZ2V0Q29udGV4dCgpOyB9CisKKyAgICAvLy8gUmVjdXJzaXZlIGhlbHBlciBmdW5jdGlvbiBmb3IgaXNIaWdoQ29zdEV4cGFuc2lvbi4KKyAgICBib29sIGlzSGlnaENvc3RFeHBhbnNpb25IZWxwZXIoY29uc3QgU0NFViAqUywgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldEltcGw8Y29uc3QgU0NFViAqPiAmUHJvY2Vzc2VkKTsKKworICAgIC8vLyBJbnNlcnQgdGhlIHNwZWNpZmllZCBiaW5hcnkgb3BlcmF0b3IsIGRvaW5nIGEgc21hbGwgYW1vdW50IG9mIHdvcmsgdG8KKyAgICAvLy8gYXZvaWQgaW5zZXJ0aW5nIGFuIG9idmlvdXNseSByZWR1bmRhbnQgb3BlcmF0aW9uLgorICAgIFZhbHVlICpJbnNlcnRCaW5vcChJbnN0cnVjdGlvbjo6QmluYXJ5T3BzIE9wY29kZSwgVmFsdWUgKkxIUywgVmFsdWUgKlJIUyk7CisKKyAgICAvLy8gQXJyYW5nZSBmb3IgdGhlcmUgdG8gYmUgYSBjYXN0IG9mIFYgdG8gVHkgYXQgSVAsIHJldXNpbmcgYW4gZXhpc3RpbmcKKyAgICAvLy8gY2FzdCBpZiBhIHN1aXRhYmxlIG9uZSBleGlzdHMsIG1vdmluZyBhbiBleGlzdGluZyBjYXN0IGlmIGEgc3VpdGFibGUgb25lCisgICAgLy8vIGV4aXN0cyBidXQgaXNuJ3QgaW4gdGhlIHJpZ2h0IHBsYWNlLCBvciBvciBjcmVhdGluZyBhIG5ldyBvbmUuCisgICAgVmFsdWUgKlJldXNlT3JDcmVhdGVDYXN0KFZhbHVlICpWLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIElQKTsKKworICAgIC8vLyBJbnNlcnQgYSBjYXN0IG9mIFYgdG8gdGhlIHNwZWNpZmllZCB0eXBlLCB3aGljaCBtdXN0IGJlIHBvc3NpYmxlIHdpdGggYQorICAgIC8vLyBub29wIGNhc3QsIGRvaW5nIHdoYXQgd2UgY2FuIHRvIHNoYXJlIHRoZSBjYXN0cy4KKyAgICBWYWx1ZSAqSW5zZXJ0Tm9vcENhc3RPZlRvKFZhbHVlICpWLCBUeXBlICpUeSk7CisKKyAgICAvLy8gRXhwYW5kIGEgU0NFVkFkZEV4cHIgd2l0aCBhIHBvaW50ZXIgdHlwZSBpbnRvIGEgR0VQIGluc3RlYWQgb2YgdXNpbmcKKyAgICAvLy8gcHRydG9pbnQrYXJpdGhtZXRpYytpbnR0b3B0ci4KKyAgICBWYWx1ZSAqZXhwYW5kQWRkVG9HRVAoY29uc3QgU0NFViAqY29uc3QgKm9wX2JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpjb25zdCAqb3BfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyVHlwZSAqUFR5LCBUeXBlICpUeSwgVmFsdWUgKlYpOworCisgICAgLy8vIEZpbmQgYSBwcmV2aW91cyBWYWx1ZSBpbiBFeHByVmFsdWVNYXAgZm9yIGV4cGFuZC4KKyAgICBTY2FsYXJFdm9sdXRpb246OlZhbHVlT2Zmc2V0UGFpcgorICAgIEZpbmRWYWx1ZUluRXhwclZhbHVlTWFwKGNvbnN0IFNDRVYgKlMsIGNvbnN0IEluc3RydWN0aW9uICpJbnNlcnRQdCk7CisKKyAgICBWYWx1ZSAqZXhwYW5kKGNvbnN0IFNDRVYgKlMpOworCisgICAgLy8vIERldGVybWluZSB0aGUgbW9zdCAicmVsZXZhbnQiIGxvb3AgZm9yIHRoZSBnaXZlbiBTQ0VWLgorICAgIGNvbnN0IExvb3AgKmdldFJlbGV2YW50TG9vcChjb25zdCBTQ0VWICopOworCisgICAgVmFsdWUgKnZpc2l0Q29uc3RhbnQoY29uc3QgU0NFVkNvbnN0YW50ICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICBWYWx1ZSAqdmlzaXRUcnVuY2F0ZUV4cHIoY29uc3QgU0NFVlRydW5jYXRlRXhwciAqUyk7CisKKyAgICBWYWx1ZSAqdmlzaXRaZXJvRXh0ZW5kRXhwcihjb25zdCBTQ0VWWmVyb0V4dGVuZEV4cHIgKlMpOworCisgICAgVmFsdWUgKnZpc2l0U2lnbkV4dGVuZEV4cHIoY29uc3QgU0NFVlNpZ25FeHRlbmRFeHByICpTKTsKKworICAgIFZhbHVlICp2aXNpdEFkZEV4cHIoY29uc3QgU0NFVkFkZEV4cHIgKlMpOworCisgICAgVmFsdWUgKnZpc2l0TXVsRXhwcihjb25zdCBTQ0VWTXVsRXhwciAqUyk7CisKKyAgICBWYWx1ZSAqdmlzaXRVRGl2RXhwcihjb25zdCBTQ0VWVURpdkV4cHIgKlMpOworCisgICAgVmFsdWUgKnZpc2l0QWRkUmVjRXhwcihjb25zdCBTQ0VWQWRkUmVjRXhwciAqUyk7CisKKyAgICBWYWx1ZSAqdmlzaXRTTWF4RXhwcihjb25zdCBTQ0VWU01heEV4cHIgKlMpOworCisgICAgVmFsdWUgKnZpc2l0VU1heEV4cHIoY29uc3QgU0NFVlVNYXhFeHByICpTKTsKKworICAgIFZhbHVlICp2aXNpdFVua25vd24oY29uc3QgU0NFVlVua25vd24gKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgcmVtZW1iZXJJbnN0cnVjdGlvbihWYWx1ZSAqSSk7CisKKyAgICBib29sIGlzTm9ybWFsQWRkUmVjRXhwclBISShQSElOb2RlICpQTiwgSW5zdHJ1Y3Rpb24gKkluY1YsIGNvbnN0IExvb3AgKkwpOworCisgICAgYm9vbCBpc0V4cGFuZGVkQWRkUmVjRXhwclBISShQSElOb2RlICpQTiwgSW5zdHJ1Y3Rpb24gKkluY1YsIGNvbnN0IExvb3AgKkwpOworCisgICAgVmFsdWUgKmV4cGFuZEFkZFJlY0V4cHJMaXRlcmFsbHkoY29uc3QgU0NFVkFkZFJlY0V4cHIgKik7CisgICAgUEhJTm9kZSAqZ2V0QWRkUmVjRXhwclBISUxpdGVyYWxseShjb25zdCBTQ0VWQWRkUmVjRXhwciAqTm9ybWFsaXplZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpFeHBhbmRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKkludFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqJlRydW5jVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZJbnZlcnRTdGVwKTsKKyAgICBWYWx1ZSAqZXhwYW5kSVZJbmMoUEhJTm9kZSAqUE4sIFZhbHVlICpTdGVwViwgY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqRXhwYW5kVHksIFR5cGUgKkludFR5LCBib29sIHVzZVN1YnRyYWN0KTsKKworICAgIHZvaWQgaG9pc3RCZWZvcmVQb3MoRG9taW5hdG9yVHJlZSAqRFQsIEluc3RydWN0aW9uICpJbnN0VG9Ib2lzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpQb3MsIFBISU5vZGUgKkxvb3BQaGkpOworCisgICAgdm9pZCBmaXh1cEluc2VydFBvaW50cyhJbnN0cnVjdGlvbiAqSSk7CisgIH07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25FeHByZXNzaW9ucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25FeHByZXNzaW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZTc2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkV4cHJlc3Npb25zLmgKQEAgLTAsMCArMSw3NjIgQEAKKy8vPT09LSBsbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkV4cHJlc3Npb25zLmggLSBTQ0VWIEV4cHJzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGNsYXNzZXMgdXNlZCB0byByZXByZXNlbnQgYW5kIGJ1aWxkIHNjYWxhciBleHByZXNzaW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfU0NBTEFSRVZPTFVUSU9ORVhQUkVTU0lPTlNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1NDQUxBUkVWT0xVVElPTkVYUFJFU1NJT05TX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQVBJbnQ7CitjbGFzcyBDb25zdGFudDsKK2NsYXNzIENvbnN0YW50UmFuZ2U7CitjbGFzcyBMb29wOworY2xhc3MgVHlwZTsKKworICBlbnVtIFNDRVZUeXBlcyB7CisgICAgLy8gVGhlc2Ugc2hvdWxkIGJlIG9yZGVyZWQgaW4gdGVybXMgb2YgaW5jcmVhc2luZyBjb21wbGV4aXR5IHRvIG1ha2UgdGhlCisgICAgLy8gZm9sZGVycyBzaW1wbGVyLgorICAgIHNjQ29uc3RhbnQsIHNjVHJ1bmNhdGUsIHNjWmVyb0V4dGVuZCwgc2NTaWduRXh0ZW5kLCBzY0FkZEV4cHIsIHNjTXVsRXhwciwKKyAgICBzY1VEaXZFeHByLCBzY0FkZFJlY0V4cHIsIHNjVU1heEV4cHIsIHNjU01heEV4cHIsCisgICAgc2NVbmtub3duLCBzY0NvdWxkTm90Q29tcHV0ZQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjb25zdGFudCBpbnRlZ2VyIHZhbHVlLgorICBjbGFzcyBTQ0VWQ29uc3RhbnQgOiBwdWJsaWMgU0NFViB7CisgICAgZnJpZW5kIGNsYXNzIFNjYWxhckV2b2x1dGlvbjsKKworICAgIENvbnN0YW50SW50ICpWOworCisgICAgU0NFVkNvbnN0YW50KGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsIENvbnN0YW50SW50ICp2KSA6CisgICAgICBTQ0VWKElELCBzY0NvbnN0YW50KSwgVih2KSB7fQorCisgIHB1YmxpYzoKKyAgICBDb25zdGFudEludCAqZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWOyB9CisgICAgY29uc3QgQVBJbnQgJmdldEFQSW50KCkgY29uc3QgeyByZXR1cm4gZ2V0VmFsdWUoKS0+Z2V0VmFsdWUoKTsgfQorCisgICAgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFYtPmdldFR5cGUoKTsgfQorCisgICAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY0NvbnN0YW50OworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgdW5hcnkgY2FzdCBvcGVyYXRvciBjbGFzc2VzLgorICBjbGFzcyBTQ0VWQ2FzdEV4cHIgOiBwdWJsaWMgU0NFViB7CisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBTQ0VWICpPcDsKKyAgICBUeXBlICpUeTsKKworICAgIFNDRVZDYXN0RXhwcihjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIElELAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTQ0VWVHksIGNvbnN0IFNDRVYgKm9wLCBUeXBlICp0eSk7CisKKyAgcHVibGljOgorICAgIGNvbnN0IFNDRVYgKmdldE9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBPcDsgfQorICAgIFR5cGUgKmdldFR5cGUoKSBjb25zdCB7IHJldHVybiBUeTsgfQorCisgICAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY1RydW5jYXRlIHx8CisgICAgICAgICAgICAgUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY1plcm9FeHRlbmQgfHwKKyAgICAgICAgICAgICBTLT5nZXRTQ0VWVHlwZSgpID09IHNjU2lnbkV4dGVuZDsKKyAgICB9CisgIH07CisKKyAgLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHRydW5jYXRpb24gb2YgYW4gaW50ZWdlciB2YWx1ZSB0byBhCisgIC8vLyBzbWFsbGVyIGludGVnZXIgdmFsdWUuCisgIGNsYXNzIFNDRVZUcnVuY2F0ZUV4cHIgOiBwdWJsaWMgU0NFVkNhc3RFeHByIHsKKyAgICBmcmllbmQgY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworCisgICAgU0NFVlRydW5jYXRlRXhwcihjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIElELAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqb3AsIFR5cGUgKnR5KTsKKworICBwdWJsaWM6CisgICAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY1RydW5jYXRlOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgemVybyBleHRlbnNpb24gb2YgYSBzbWFsbCBpbnRlZ2VyIHZhbHVlCisgIC8vLyB0byBhIGxhcmdlciBpbnRlZ2VyIHZhbHVlLgorICBjbGFzcyBTQ0VWWmVyb0V4dGVuZEV4cHIgOiBwdWJsaWMgU0NFVkNhc3RFeHByIHsKKyAgICBmcmllbmQgY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworCisgICAgU0NFVlplcm9FeHRlbmRFeHByKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKm9wLCBUeXBlICp0eSk7CisKKyAgcHVibGljOgorICAgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0NFViAqUykgeworICAgICAgcmV0dXJuIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NaZXJvRXh0ZW5kOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc2lnbiBleHRlbnNpb24gb2YgYSBzbWFsbCBpbnRlZ2VyIHZhbHVlCisgIC8vLyB0byBhIGxhcmdlciBpbnRlZ2VyIHZhbHVlLgorICBjbGFzcyBTQ0VWU2lnbkV4dGVuZEV4cHIgOiBwdWJsaWMgU0NFVkNhc3RFeHByIHsKKyAgICBmcmllbmQgY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworCisgICAgU0NFVlNpZ25FeHRlbmRFeHByKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKm9wLCBUeXBlICp0eSk7CisKKyAgcHVibGljOgorICAgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0NFViAqUykgeworICAgICAgcmV0dXJuIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NTaWduRXh0ZW5kOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBub2RlIGlzIGEgYmFzZSBjbGFzcyBwcm92aWRpbmcgY29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yCisgIC8vLyBuJ2FyeSBvcGVyYXRvcnMuCisgIGNsYXNzIFNDRVZOQXJ5RXhwciA6IHB1YmxpYyBTQ0VWIHsKKyAgcHJvdGVjdGVkOgorICAgIC8vIFNpbmNlIFNDRVZzIGFyZSBpbW11dGFibGUsIFNjYWxhckV2b2x1dGlvbiBhbGxvY2F0ZXMgb3BlcmFuZAorICAgIC8vIGFycmF5cyB3aXRoIGl0cyBTQ0VWQWxsb2NhdG9yLCBzbyB0aGlzIGNsYXNzIGp1c3QgbmVlZHMgYSBzaW1wbGUKKyAgICAvLyBwb2ludGVyIHJhdGhlciB0aGFuIGEgbW9yZSBlbGFib3JhdGUgdmVjdG9yLWxpa2UgZGF0YSBzdHJ1Y3R1cmUuCisgICAgLy8gVGhpcyBhbHNvIGF2b2lkcyB0aGUgbmVlZCBmb3IgYSBub24tdHJpdmlhbCBkZXN0cnVjdG9yLgorICAgIGNvbnN0IFNDRVYgKmNvbnN0ICpPcGVyYW5kczsKKyAgICBzaXplX3QgTnVtT3BlcmFuZHM7CisKKyAgICBTQ0VWTkFyeUV4cHIoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwKKyAgICAgICAgICAgICAgICAgZW51bSBTQ0VWVHlwZXMgVCwgY29uc3QgU0NFViAqY29uc3QgKk8sIHNpemVfdCBOKQorICAgICAgOiBTQ0VWKElELCBUKSwgT3BlcmFuZHMoTyksIE51bU9wZXJhbmRzKE4pIHt9CisKKyAgcHVibGljOgorICAgIHNpemVfdCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgcmV0dXJuIE51bU9wZXJhbmRzOyB9CisKKyAgICBjb25zdCBTQ0VWICpnZXRPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpIDwgTnVtT3BlcmFuZHMgJiYgIk9wZXJhbmQgaW5kZXggb3V0IG9mIHJhbmdlISIpOworICAgICAgcmV0dXJuIE9wZXJhbmRzW2ldOworICAgIH0KKworICAgIHVzaW5nIG9wX2l0ZXJhdG9yID0gY29uc3QgU0NFViAqY29uc3QgKjsKKyAgICB1c2luZyBvcF9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPG9wX2l0ZXJhdG9yPjsKKworICAgIG9wX2l0ZXJhdG9yIG9wX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gT3BlcmFuZHM7IH0KKyAgICBvcF9pdGVyYXRvciBvcF9lbmQoKSBjb25zdCB7IHJldHVybiBPcGVyYW5kcyArIE51bU9wZXJhbmRzOyB9CisgICAgb3BfcmFuZ2Ugb3BlcmFuZHMoKSBjb25zdCB7CisgICAgICByZXR1cm4gbWFrZV9yYW5nZShvcF9iZWdpbigpLCBvcF9lbmQoKSk7CisgICAgfQorCisgICAgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMCktPmdldFR5cGUoKTsgfQorCisgICAgTm9XcmFwRmxhZ3MgZ2V0Tm9XcmFwRmxhZ3MoTm9XcmFwRmxhZ3MgTWFzayA9IE5vV3JhcE1hc2spIGNvbnN0IHsKKyAgICAgIHJldHVybiAoTm9XcmFwRmxhZ3MpKFN1YmNsYXNzRGF0YSAmIE1hc2spOworICAgIH0KKworICAgIGJvb2wgaGFzTm9VbnNpZ25lZFdyYXAoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0Tm9XcmFwRmxhZ3MoRmxhZ05VVykgIT0gRmxhZ0FueVdyYXA7CisgICAgfQorCisgICAgYm9vbCBoYXNOb1NpZ25lZFdyYXAoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0Tm9XcmFwRmxhZ3MoRmxhZ05TVykgIT0gRmxhZ0FueVdyYXA7CisgICAgfQorCisgICAgYm9vbCBoYXNOb1NlbGZXcmFwKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldE5vV3JhcEZsYWdzKEZsYWdOVykgIT0gRmxhZ0FueVdyYXA7CisgICAgfQorCisgICAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY0FkZEV4cHIgfHwKKyAgICAgICAgICAgICBTLT5nZXRTQ0VWVHlwZSgpID09IHNjTXVsRXhwciB8fAorICAgICAgICAgICAgIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NTTWF4RXhwciB8fAorICAgICAgICAgICAgIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NVTWF4RXhwciB8fAorICAgICAgICAgICAgIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NBZGRSZWNFeHByOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBub2RlIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBuJ2FyeSBjb21tdXRhdGl2ZSBvcGVyYXRvcnMuCisgIGNsYXNzIFNDRVZDb21tdXRhdGl2ZUV4cHIgOiBwdWJsaWMgU0NFVk5BcnlFeHByIHsKKyAgcHJvdGVjdGVkOgorICAgIFNDRVZDb21tdXRhdGl2ZUV4cHIoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gU0NFVlR5cGVzIFQsIGNvbnN0IFNDRVYgKmNvbnN0ICpPLCBzaXplX3QgTikKKyAgICAgIDogU0NFVk5BcnlFeHByKElELCBULCBPLCBOKSB7fQorCisgIHB1YmxpYzoKKyAgICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVYgKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRTQ0VWVHlwZSgpID09IHNjQWRkRXhwciB8fAorICAgICAgICAgICAgIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NNdWxFeHByIHx8CisgICAgICAgICAgICAgUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY1NNYXhFeHByIHx8CisgICAgICAgICAgICAgUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY1VNYXhFeHByOworICAgIH0KKworICAgIC8vLyBTZXQgZmxhZ3MgZm9yIGEgbm9uLXJlY3VycmVuY2Ugd2l0aG91dCBjbGVhcmluZyBwcmV2aW91c2x5IHNldCBmbGFncy4KKyAgICB2b2lkIHNldE5vV3JhcEZsYWdzKE5vV3JhcEZsYWdzIEZsYWdzKSB7CisgICAgICBTdWJjbGFzc0RhdGEgfD0gRmxhZ3M7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIG5vZGUgcmVwcmVzZW50cyBhbiBhZGRpdGlvbiBvZiBzb21lIG51bWJlciBvZiBTQ0VWcy4KKyAgY2xhc3MgU0NFVkFkZEV4cHIgOiBwdWJsaWMgU0NFVkNvbW11dGF0aXZlRXhwciB7CisgICAgZnJpZW5kIGNsYXNzIFNjYWxhckV2b2x1dGlvbjsKKworICAgIFNDRVZBZGRFeHByKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsCisgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqY29uc3QgKk8sIHNpemVfdCBOKQorICAgICAgOiBTQ0VWQ29tbXV0YXRpdmVFeHByKElELCBzY0FkZEV4cHIsIE8sIE4pIHt9CisKKyAgcHVibGljOgorICAgIFR5cGUgKmdldFR5cGUoKSBjb25zdCB7CisgICAgICAvLyBVc2UgdGhlIHR5cGUgb2YgdGhlIGxhc3Qgb3BlcmFuZCwgd2hpY2ggaXMgbGlrZWx5IHRvIGJlIGEgcG9pbnRlcgorICAgICAgLy8gdHlwZSwgaWYgdGhlcmUgaXMgb25lLiBUaGlzIGRvZXNuJ3QgdXN1YWxseSBtYXR0ZXIsIGJ1dCBpdCBjYW4gaGVscAorICAgICAgLy8gcmVkdWNlIGNhc3RzIHdoZW4gdGhlIGV4cHJlc3Npb25zIGFyZSBleHBhbmRlZC4KKyAgICAgIHJldHVybiBnZXRPcGVyYW5kKGdldE51bU9wZXJhbmRzKCkgLSAxKS0+Z2V0VHlwZSgpOworICAgIH0KKworICAgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0NFViAqUykgeworICAgICAgcmV0dXJuIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NBZGRFeHByOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBub2RlIHJlcHJlc2VudHMgbXVsdGlwbGljYXRpb24gb2Ygc29tZSBudW1iZXIgb2YgU0NFVnMuCisgIGNsYXNzIFNDRVZNdWxFeHByIDogcHVibGljIFNDRVZDb21tdXRhdGl2ZUV4cHIgeworICAgIGZyaWVuZCBjbGFzcyBTY2FsYXJFdm9sdXRpb247CisKKyAgICBTQ0VWTXVsRXhwcihjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIElELAorICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKmNvbnN0ICpPLCBzaXplX3QgTikKKyAgICAgIDogU0NFVkNvbW11dGF0aXZlRXhwcihJRCwgc2NNdWxFeHByLCBPLCBOKSB7fQorCisgIHB1YmxpYzoKKyAgICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVYgKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRTQ0VWVHlwZSgpID09IHNjTXVsRXhwcjsKKyAgICB9CisgIH07CisKKyAgLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGJpbmFyeSB1bnNpZ25lZCBkaXZpc2lvbiBvcGVyYXRpb24uCisgIGNsYXNzIFNDRVZVRGl2RXhwciA6IHB1YmxpYyBTQ0VWIHsKKyAgICBmcmllbmQgY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworCisgICAgY29uc3QgU0NFViAqTEhTOworICAgIGNvbnN0IFNDRVYgKlJIUzsKKworICAgIFNDRVZVRGl2RXhwcihjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIElELCBjb25zdCBTQ0VWICpsaHMsIGNvbnN0IFNDRVYgKnJocykKKyAgICAgIDogU0NFVihJRCwgc2NVRGl2RXhwciksIExIUyhsaHMpLCBSSFMocmhzKSB7fQorCisgIHB1YmxpYzoKKyAgICBjb25zdCBTQ0VWICpnZXRMSFMoKSBjb25zdCB7IHJldHVybiBMSFM7IH0KKyAgICBjb25zdCBTQ0VWICpnZXRSSFMoKSBjb25zdCB7IHJldHVybiBSSFM7IH0KKworICAgIFR5cGUgKmdldFR5cGUoKSBjb25zdCB7CisgICAgICAvLyBJbiBtb3N0IGNhc2VzIHRoZSB0eXBlcyBvZiBMSFMgYW5kIFJIUyB3aWxsIGJlIHRoZSBzYW1lLCBidXQgaW4gc29tZQorICAgICAgLy8gY3JhenkgY2FzZXMgb25lIG9yIHRoZSBvdGhlciBtYXkgYmUgYSBwb2ludGVyLiBTY2FsYXJFdm9sdXRpb24gZG9lc24ndAorICAgICAgLy8gZGVwZW5kIG9uIHRoZSB0eXBlIGZvciBjb3JyZWN0bmVzcywgYnV0IGhhbmRsaW5nIHR5cGVzIGNhcmVmdWxseSBjYW4KKyAgICAgIC8vIGF2b2lkIGV4dHJhIGNhc3RzIGluIHRoZSBTQ0VWRXhwYW5kZXIuIFRoZSBMSFMgaXMgbW9yZSBsaWtlbHkgdG8gYmUKKyAgICAgIC8vIGEgcG9pbnRlciB0eXBlIHRoYW4gdGhlIFJIUywgc28gdXNlIHRoZSBSSFMnIHR5cGUgaGVyZS4KKyAgICAgIHJldHVybiBnZXRSSFMoKS0+Z2V0VHlwZSgpOworICAgIH0KKworICAgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0NFViAqUykgeworICAgICAgcmV0dXJuIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NVRGl2RXhwcjsKKyAgICB9CisgIH07CisKKyAgLy8vIFRoaXMgbm9kZSByZXByZXNlbnRzIGEgcG9seW5vbWlhbCByZWN1cnJlbmNlIG9uIHRoZSB0cmlwIGNvdW50CisgIC8vLyBvZiB0aGUgc3BlY2lmaWVkIGxvb3AuICBUaGlzIGlzIHRoZSBwcmltYXJ5IGZvY3VzIG9mIHRoZQorICAvLy8gU2NhbGFyRXZvbHV0aW9uIGZyYW1ld29yazsgYWxsIHRoZSBvdGhlciBTQ0VWIHN1YmNsYXNzZXMgYXJlCisgIC8vLyBtb3N0bHkganVzdCBzdXBwb3J0aW5nIGluZnJhc3RydWN0dXJlIHRvIGFsbG93IFNDRVZBZGRSZWNFeHByCisgIC8vLyBleHByZXNzaW9ucyB0byBiZSBjcmVhdGVkIGFuZCBhbmFseXplZC4KKyAgLy8vCisgIC8vLyBBbGwgb3BlcmFuZHMgb2YgYW4gQWRkUmVjIGFyZSByZXF1aXJlZCB0byBiZSBsb29wIGludmFyaWFudC4KKyAgLy8vCisgIGNsYXNzIFNDRVZBZGRSZWNFeHByIDogcHVibGljIFNDRVZOQXJ5RXhwciB7CisgICAgZnJpZW5kIGNsYXNzIFNjYWxhckV2b2x1dGlvbjsKKworICAgIGNvbnN0IExvb3AgKkw7CisKKyAgICBTQ0VWQWRkUmVjRXhwcihjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIElELAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKmNvbnN0ICpPLCBzaXplX3QgTiwgY29uc3QgTG9vcCAqbCkKKyAgICAgIDogU0NFVk5BcnlFeHByKElELCBzY0FkZFJlY0V4cHIsIE8sIE4pLCBMKGwpIHt9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFNDRVYgKmdldFN0YXJ0KCkgY29uc3QgeyByZXR1cm4gT3BlcmFuZHNbMF07IH0KKyAgICBjb25zdCBMb29wICpnZXRMb29wKCkgY29uc3QgeyByZXR1cm4gTDsgfQorCisgICAgLy8vIENvbnN0cnVjdHMgYW5kIHJldHVybnMgdGhlIHJlY3VycmVuY2UgaW5kaWNhdGluZyBob3cgbXVjaCB0aGlzCisgICAgLy8vIGV4cHJlc3Npb24gc3RlcHMgYnkuICBJZiB0aGlzIGlzIGEgcG9seW5vbWlhbCBvZiBkZWdyZWUgTiwgaXQKKyAgICAvLy8gcmV0dXJucyBhIGNocmVjIG9mIGRlZ3JlZSBOLTEuICBXZSBjYW5ub3QgZGV0ZXJtaW5lIHdoZXRoZXIKKyAgICAvLy8gdGhlIHN0ZXAgcmVjdXJyZW5jZSBoYXMgc2VsZi13cmFwYXJvdW5kLgorICAgIGNvbnN0IFNDRVYgKmdldFN0ZXBSZWN1cnJlbmNlKFNjYWxhckV2b2x1dGlvbiAmU0UpIGNvbnN0IHsKKyAgICAgIGlmIChpc0FmZmluZSgpKSByZXR1cm4gZ2V0T3BlcmFuZCgxKTsKKyAgICAgIHJldHVybiBTRS5nZXRBZGRSZWNFeHByKFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgMz4ob3BfYmVnaW4oKSsxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9lbmQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb29wKCksIEZsYWdBbnlXcmFwKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gQSArIEIqeCB3aGVyZSBBCisgICAgLy8vIGFuZCBCIGFyZSBsb29wIGludmFyaWFudCB2YWx1ZXMuCisgICAgYm9vbCBpc0FmZmluZSgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgc3RhcnQgdmFsdWUgaXMgaW52YXJpYW50LiAgVGhpcyBleHByZXNzaW9uIGlzIHRodXMKKyAgICAgIC8vIGFmZmluZSBpZmYgdGhlIHN0ZXAgaXMgYWxzbyBpbnZhcmlhbnQuCisgICAgICByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSA9PSAyOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBBICsgQip4ICsgQyp4XjIKKyAgICAvLy8gd2hlcmUgQSwgQiBhbmQgQyBhcmUgbG9vcCBpbnZhcmlhbnQgdmFsdWVzLiAgVGhpcyBjb3JyZXNwb25kcworICAgIC8vLyB0byBhbiBhZGRyZWMgb2YgdGhlIGZvcm0ge0wsKyxNLCssTn0KKyAgICBib29sIGlzUXVhZHJhdGljKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldE51bU9wZXJhbmRzKCkgPT0gMzsKKyAgICB9CisKKyAgICAvLy8gU2V0IGZsYWdzIGZvciBhIHJlY3VycmVuY2Ugd2l0aG91dCBjbGVhcmluZyBhbnkgcHJldmlvdXNseSBzZXQgZmxhZ3MuCisgICAgLy8vIEZvciBBZGRSZWMsIGVpdGhlciBOVVcgb3IgTlNXIGltcGxpZXMgTlcuIEtlZXAgdHJhY2sgb2YgdGhpcyBmYWN0IGhlcmUKKyAgICAvLy8gdG8gbWFrZSBpdCBlYXNpZXIgdG8gcHJvcGFnYXRlIGZsYWdzLgorICAgIHZvaWQgc2V0Tm9XcmFwRmxhZ3MoTm9XcmFwRmxhZ3MgRmxhZ3MpIHsKKyAgICAgIGlmIChGbGFncyAmIChGbGFnTlVXIHwgRmxhZ05TVykpCisgICAgICAgIEZsYWdzID0gU2NhbGFyRXZvbHV0aW9uOjpzZXRGbGFncyhGbGFncywgRmxhZ05XKTsKKyAgICAgIFN1YmNsYXNzRGF0YSB8PSBGbGFnczsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGlzIGNoYWluIG9mIHJlY3VycmVuY2VzIGF0IHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gaXRlcmF0aW9uIG51bWJlci4KKyAgICBjb25zdCBTQ0VWICpldmFsdWF0ZUF0SXRlcmF0aW9uKGNvbnN0IFNDRVYgKkl0LCBTY2FsYXJFdm9sdXRpb24gJlNFKSBjb25zdDsKKworICAgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIG9mIHRoaXMgbG9vcCB0aGF0IHByb2R1Y2UKKyAgICAvLy8gdmFsdWVzIGluIHRoZSBzcGVjaWZpZWQgY29uc3RhbnQgcmFuZ2UuICBBbm90aGVyIHdheSBvZgorICAgIC8vLyBsb29raW5nIGF0IHRoaXMgaXMgdGhhdCBpdCByZXR1cm5zIHRoZSBmaXJzdCBpdGVyYXRpb24gbnVtYmVyCisgICAgLy8vIHdoZXJlIHRoZSB2YWx1ZSBpcyBub3QgaW4gdGhlIGNvbmRpdGlvbiwgdGh1cyBjb21wdXRpbmcgdGhlCisgICAgLy8vIGV4aXQgY291bnQuICBJZiB0aGUgaXRlcmF0aW9uIGNvdW50IGNhbid0IGJlIGNvbXB1dGVkLCBhbgorICAgIC8vLyBpbnN0YW5jZSBvZiBTQ0VWQ291bGROb3RDb21wdXRlIGlzIHJldHVybmVkLgorICAgIGNvbnN0IFNDRVYgKmdldE51bUl0ZXJhdGlvbnNJblJhbmdlKGNvbnN0IENvbnN0YW50UmFuZ2UgJlJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiAmU0UpIGNvbnN0OworCisgICAgLy8vIFJldHVybiBhbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhpcyBleHByZXNzaW9uCisgICAgLy8vIG9uZSBpdGVyYXRpb24gb2YgdGhlIGxvb3AgYWhlYWQuCisgICAgY29uc3QgU0NFVkFkZFJlY0V4cHIgKmdldFBvc3RJbmNFeHByKFNjYWxhckV2b2x1dGlvbiAmU0UpIGNvbnN0OworCisgICAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY0FkZFJlY0V4cHI7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzaWduZWQgbWF4aW11bSBzZWxlY3Rpb24uCisgIGNsYXNzIFNDRVZTTWF4RXhwciA6IHB1YmxpYyBTQ0VWQ29tbXV0YXRpdmVFeHByIHsKKyAgICBmcmllbmQgY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworCisgICAgU0NFVlNNYXhFeHByKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsCisgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKmNvbnN0ICpPLCBzaXplX3QgTikKKyAgICAgIDogU0NFVkNvbW11dGF0aXZlRXhwcihJRCwgc2NTTWF4RXhwciwgTywgTikgeworICAgICAgLy8gTWF4IG5ldmVyIG92ZXJmbG93cy4KKyAgICAgIHNldE5vV3JhcEZsYWdzKChOb1dyYXBGbGFncykoRmxhZ05VVyB8IEZsYWdOU1cpKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0NFViAqUykgeworICAgICAgcmV0dXJuIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NTTWF4RXhwcjsKKyAgICB9CisgIH07CisKKyAgLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiB1bnNpZ25lZCBtYXhpbXVtIHNlbGVjdGlvbi4KKyAgY2xhc3MgU0NFVlVNYXhFeHByIDogcHVibGljIFNDRVZDb21tdXRhdGl2ZUV4cHIgeworICAgIGZyaWVuZCBjbGFzcyBTY2FsYXJFdm9sdXRpb247CisKKyAgICBTQ0VWVU1heEV4cHIoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwKKyAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqY29uc3QgKk8sIHNpemVfdCBOKQorICAgICAgOiBTQ0VWQ29tbXV0YXRpdmVFeHByKElELCBzY1VNYXhFeHByLCBPLCBOKSB7CisgICAgICAvLyBNYXggbmV2ZXIgb3ZlcmZsb3dzLgorICAgICAgc2V0Tm9XcmFwRmxhZ3MoKE5vV3JhcEZsYWdzKShGbGFnTlVXIHwgRmxhZ05TVykpOworICAgIH0KKworICBwdWJsaWM6CisgICAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY1VNYXhFeHByOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBtZWFucyB0aGF0IHdlIGFyZSBkZWFsaW5nIHdpdGggYW4gZW50aXJlbHkgdW5rbm93biBTQ0VWCisgIC8vLyB2YWx1ZSwgYW5kIG9ubHkgcmVwcmVzZW50IGl0IGFzIGl0cyBMTFZNIFZhbHVlLiAgVGhpcyBpcyB0aGUKKyAgLy8vICJib3R0b20iIHZhbHVlIGZvciB0aGUgYW5hbHlzaXMuCisgIGNsYXNzIFNDRVZVbmtub3duIGZpbmFsIDogcHVibGljIFNDRVYsIHByaXZhdGUgQ2FsbGJhY2tWSCB7CisgICAgZnJpZW5kIGNsYXNzIFNjYWxhckV2b2x1dGlvbjsKKworICAgIC8vLyBUaGUgcGFyZW50IFNjYWxhckV2b2x1dGlvbiB2YWx1ZS4gVGhpcyBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUKKyAgICAvLy8gcGFyZW50J3MgbWFwcyB3aGVuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBTQ0VWVW5rbm93biBpcworICAgIC8vLyBkZWxldGVkIG9yIFJBVVcnZC4KKyAgICBTY2FsYXJFdm9sdXRpb24gKlNFOworCisgICAgLy8vIFRoZSBuZXh0IHBvaW50ZXIgaW4gdGhlIGxpbmtlZCBsaXN0IG9mIGFsbCBTQ0VWVW5rbm93bgorICAgIC8vLyBpbnN0YW5jZXMgb3duZWQgYnkgYSBTY2FsYXJFdm9sdXRpb24uCisgICAgU0NFVlVua25vd24gKk5leHQ7CisKKyAgICBTQ0VWVW5rbm93bihjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIElELCBWYWx1ZSAqViwKKyAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gKnNlLCBTQ0VWVW5rbm93biAqbmV4dCkgOgorICAgICAgU0NFVihJRCwgc2NVbmtub3duKSwgQ2FsbGJhY2tWSChWKSwgU0Uoc2UpLCBOZXh0KG5leHQpIHt9CisKKyAgICAvLyBJbXBsZW1lbnQgQ2FsbGJhY2tWSC4KKyAgICB2b2lkIGRlbGV0ZWQoKSBvdmVycmlkZTsKKyAgICB2b2lkIGFsbFVzZXNSZXBsYWNlZFdpdGgoVmFsdWUgKk5ldykgb3ZlcnJpZGU7CisKKyAgcHVibGljOgorICAgIFZhbHVlICpnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGdldFZhbFB0cigpOyB9CisKKyAgICAvLy8gQHsKKyAgICAvLy8gVGVzdCB3aGV0aGVyIHRoaXMgaXMgYSBzcGVjaWFsIGNvbnN0YW50IHJlcHJlc2VudGluZyBhIHR5cGUKKyAgICAvLy8gc2l6ZSwgYWxpZ25tZW50LCBvciBmaWVsZCBvZmZzZXQgaW4gYSB0YXJnZXQtaW5kZXBlbmRlbnQKKyAgICAvLy8gbWFubmVyLCBhbmQgaGFzbid0IGhhcHBlbmVkIHRvIGhhdmUgYmVlbiBmb2xkZWQgd2l0aCBvdGhlcgorICAgIC8vLyBvcGVyYXRpb25zIGludG8gc29tZXRoaW5nIHVucmVjb2duaXphYmxlLiBUaGlzIGlzIG1haW5seSBvbmx5CisgICAgLy8vIHVzZWZ1bCBmb3IgcHJldHR5LXByaW50aW5nIGFuZCBvdGhlciBzaXR1YXRpb25zIHdoZXJlIGl0IGlzbid0CisgICAgLy8vIGFic29sdXRlbHkgcmVxdWlyZWQgZm9yIHRoZXNlIHRvIHN1Y2NlZWQuCisgICAgYm9vbCBpc1NpemVPZihUeXBlIComQWxsb2NUeSkgY29uc3Q7CisgICAgYm9vbCBpc0FsaWduT2YoVHlwZSAqJkFsbG9jVHkpIGNvbnN0OworICAgIGJvb2wgaXNPZmZzZXRPZihUeXBlIComU1R5LCBDb25zdGFudCAqJkZpZWxkTm8pIGNvbnN0OworICAgIC8vLyBAfQorCisgICAgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIGdldFZhbFB0cigpLT5nZXRUeXBlKCk7IH0KKworICAgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0NFViAqUykgeworICAgICAgcmV0dXJuIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NVbmtub3duOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBjbGFzcyBkZWZpbmVzIGEgc2ltcGxlIHZpc2l0b3IgY2xhc3MgdGhhdCBtYXkgYmUgdXNlZCBmb3IKKyAgLy8vIHZhcmlvdXMgU0NFViBhbmFseXNpcyBwdXJwb3Nlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgU0MsIHR5cGVuYW1lIFJldFZhbD12b2lkPgorICBzdHJ1Y3QgU0NFVlZpc2l0b3IgeworICAgIFJldFZhbCB2aXNpdChjb25zdCBTQ0VWICpTKSB7CisgICAgICBzd2l0Y2ggKFMtPmdldFNDRVZUeXBlKCkpIHsKKyAgICAgIGNhc2Ugc2NDb25zdGFudDoKKyAgICAgICAgcmV0dXJuICgoU0MqKXRoaXMpLT52aXNpdENvbnN0YW50KChjb25zdCBTQ0VWQ29uc3RhbnQqKVMpOworICAgICAgY2FzZSBzY1RydW5jYXRlOgorICAgICAgICByZXR1cm4gKChTQyopdGhpcyktPnZpc2l0VHJ1bmNhdGVFeHByKChjb25zdCBTQ0VWVHJ1bmNhdGVFeHByKilTKTsKKyAgICAgIGNhc2Ugc2NaZXJvRXh0ZW5kOgorICAgICAgICByZXR1cm4gKChTQyopdGhpcyktPnZpc2l0WmVyb0V4dGVuZEV4cHIoKGNvbnN0IFNDRVZaZXJvRXh0ZW5kRXhwciopUyk7CisgICAgICBjYXNlIHNjU2lnbkV4dGVuZDoKKyAgICAgICAgcmV0dXJuICgoU0MqKXRoaXMpLT52aXNpdFNpZ25FeHRlbmRFeHByKChjb25zdCBTQ0VWU2lnbkV4dGVuZEV4cHIqKVMpOworICAgICAgY2FzZSBzY0FkZEV4cHI6CisgICAgICAgIHJldHVybiAoKFNDKil0aGlzKS0+dmlzaXRBZGRFeHByKChjb25zdCBTQ0VWQWRkRXhwciopUyk7CisgICAgICBjYXNlIHNjTXVsRXhwcjoKKyAgICAgICAgcmV0dXJuICgoU0MqKXRoaXMpLT52aXNpdE11bEV4cHIoKGNvbnN0IFNDRVZNdWxFeHByKilTKTsKKyAgICAgIGNhc2Ugc2NVRGl2RXhwcjoKKyAgICAgICAgcmV0dXJuICgoU0MqKXRoaXMpLT52aXNpdFVEaXZFeHByKChjb25zdCBTQ0VWVURpdkV4cHIqKVMpOworICAgICAgY2FzZSBzY0FkZFJlY0V4cHI6CisgICAgICAgIHJldHVybiAoKFNDKil0aGlzKS0+dmlzaXRBZGRSZWNFeHByKChjb25zdCBTQ0VWQWRkUmVjRXhwciopUyk7CisgICAgICBjYXNlIHNjU01heEV4cHI6CisgICAgICAgIHJldHVybiAoKFNDKil0aGlzKS0+dmlzaXRTTWF4RXhwcigoY29uc3QgU0NFVlNNYXhFeHByKilTKTsKKyAgICAgIGNhc2Ugc2NVTWF4RXhwcjoKKyAgICAgICAgcmV0dXJuICgoU0MqKXRoaXMpLT52aXNpdFVNYXhFeHByKChjb25zdCBTQ0VWVU1heEV4cHIqKVMpOworICAgICAgY2FzZSBzY1Vua25vd246CisgICAgICAgIHJldHVybiAoKFNDKil0aGlzKS0+dmlzaXRVbmtub3duKChjb25zdCBTQ0VWVW5rbm93biopUyk7CisgICAgICBjYXNlIHNjQ291bGROb3RDb21wdXRlOgorICAgICAgICByZXR1cm4gKChTQyopdGhpcyktPnZpc2l0Q291bGROb3RDb21wdXRlKChjb25zdCBTQ0VWQ291bGROb3RDb21wdXRlKilTKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gU0NFViB0eXBlISIpOworICAgICAgfQorICAgIH0KKworICAgIFJldFZhbCB2aXNpdENvdWxkTm90Q29tcHV0ZShjb25zdCBTQ0VWQ291bGROb3RDb21wdXRlICpTKSB7CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIHVzZSBvZiBTQ0VWQ291bGROb3RDb21wdXRlISIpOworICAgIH0KKyAgfTsKKworICAvLy8gVmlzaXQgYWxsIG5vZGVzIGluIHRoZSBleHByZXNzaW9uIHRyZWUgdXNpbmcgd29ya2xpc3QgdHJhdmVyc2FsLgorICAvLy8KKyAgLy8vIFZpc2l0b3IgaW1wbGVtZW50czoKKyAgLy8vICAgLy8gcmV0dXJuIHRydWUgdG8gZm9sbG93IHRoaXMgbm9kZS4KKyAgLy8vICAgYm9vbCBmb2xsb3coY29uc3QgU0NFViAqUyk7CisgIC8vLyAgIC8vIHJldHVybiB0cnVlIHRvIHRlcm1pbmF0ZSB0aGUgc2VhcmNoLgorICAvLy8gICBib29sIGlzRG9uZSgpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBTVj4KKyAgY2xhc3MgU0NFVlRyYXZlcnNhbCB7CisgICAgU1YgJlZpc2l0b3I7CisgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA4PiBXb3JrbGlzdDsKKyAgICBTbWFsbFB0clNldDxjb25zdCBTQ0VWICosIDg+IFZpc2l0ZWQ7CisKKyAgICB2b2lkIHB1c2goY29uc3QgU0NFViAqUykgeworICAgICAgaWYgKFZpc2l0ZWQuaW5zZXJ0KFMpLnNlY29uZCAmJiBWaXNpdG9yLmZvbGxvdyhTKSkKKyAgICAgICAgV29ya2xpc3QucHVzaF9iYWNrKFMpOworICAgIH0KKworICBwdWJsaWM6CisgICAgU0NFVlRyYXZlcnNhbChTViYgVik6IFZpc2l0b3IoVikge30KKworICAgIHZvaWQgdmlzaXRBbGwoY29uc3QgU0NFViAqUm9vdCkgeworICAgICAgcHVzaChSb290KTsKKyAgICAgIHdoaWxlICghV29ya2xpc3QuZW1wdHkoKSAmJiAhVmlzaXRvci5pc0RvbmUoKSkgeworICAgICAgICBjb25zdCBTQ0VWICpTID0gV29ya2xpc3QucG9wX2JhY2tfdmFsKCk7CisKKyAgICAgICAgc3dpdGNoIChTLT5nZXRTQ0VWVHlwZSgpKSB7CisgICAgICAgIGNhc2Ugc2NDb25zdGFudDoKKyAgICAgICAgY2FzZSBzY1Vua25vd246CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugc2NUcnVuY2F0ZToKKyAgICAgICAgY2FzZSBzY1plcm9FeHRlbmQ6CisgICAgICAgIGNhc2Ugc2NTaWduRXh0ZW5kOgorICAgICAgICAgIHB1c2goY2FzdDxTQ0VWQ2FzdEV4cHI+KFMpLT5nZXRPcGVyYW5kKCkpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHNjQWRkRXhwcjoKKyAgICAgICAgY2FzZSBzY011bEV4cHI6CisgICAgICAgIGNhc2Ugc2NTTWF4RXhwcjoKKyAgICAgICAgY2FzZSBzY1VNYXhFeHByOgorICAgICAgICBjYXNlIHNjQWRkUmVjRXhwcjoKKyAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gKk9wIDogY2FzdDxTQ0VWTkFyeUV4cHI+KFMpLT5vcGVyYW5kcygpKQorICAgICAgICAgICAgcHVzaChPcCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugc2NVRGl2RXhwcjogeworICAgICAgICAgIGNvbnN0IFNDRVZVRGl2RXhwciAqVURpdiA9IGNhc3Q8U0NFVlVEaXZFeHByPihTKTsKKyAgICAgICAgICBwdXNoKFVEaXYtPmdldExIUygpKTsKKyAgICAgICAgICBwdXNoKFVEaXYtPmdldFJIUygpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIHNjQ291bGROb3RDb21wdXRlOgorICAgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkF0dGVtcHQgdG8gdXNlIGEgU0NFVkNvdWxkTm90Q29tcHV0ZSBvYmplY3QhIik7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBTQ0VWIGtpbmQhIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgLy8vIFVzZSBTQ0VWVHJhdmVyc2FsIHRvIHZpc2l0IGFsbCBub2RlcyBpbiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiB0cmVlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTVj4KKyAgdm9pZCB2aXNpdEFsbChjb25zdCBTQ0VWICpSb290LCBTViYgVmlzaXRvcikgeworICAgIFNDRVZUcmF2ZXJzYWw8U1Y+IFQoVmlzaXRvcik7CisgICAgVC52aXNpdEFsbChSb290KTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbnkgbm9kZSBpbiBccCBSb290IHNhdGlzZmllcyB0aGUgcHJlZGljYXRlIFxwIFByZWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcmVkVHk+CisgIGJvb2wgU0NFVkV4cHJDb250YWlucyhjb25zdCBTQ0VWICpSb290LCBQcmVkVHkgUHJlZCkgeworICAgIHN0cnVjdCBGaW5kQ2xvc3VyZSB7CisgICAgICBib29sIEZvdW5kID0gZmFsc2U7CisgICAgICBQcmVkVHkgUHJlZDsKKworICAgICAgRmluZENsb3N1cmUoUHJlZFR5IFByZWQpIDogUHJlZChQcmVkKSB7fQorCisgICAgICBib29sIGZvbGxvdyhjb25zdCBTQ0VWICpTKSB7CisgICAgICAgIGlmICghUHJlZChTKSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBGb3VuZCA9IHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgYm9vbCBpc0RvbmUoKSBjb25zdCB7IHJldHVybiBGb3VuZDsgfQorICAgIH07CisKKyAgICBGaW5kQ2xvc3VyZSBGQyhQcmVkKTsKKyAgICB2aXNpdEFsbChSb290LCBGQyk7CisgICAgcmV0dXJuIEZDLkZvdW5kOworICB9CisKKyAgLy8vIFRoaXMgdmlzaXRvciByZWN1cnNpdmVseSB2aXNpdHMgYSBTQ0VWIGV4cHJlc3Npb24gYW5kIHJlLXdyaXRlcyBpdC4KKyAgLy8vIFRoZSByZXN1bHQgZnJvbSBlYWNoIHZpc2l0IGlzIGNhY2hlZCwgc28gaXQgd2lsbCByZXR1cm4gdGhlIHNhbWUKKyAgLy8vIFNDRVYgZm9yIHRoZSBzYW1lIGlucHV0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTQz4KKyAgY2xhc3MgU0NFVlJld3JpdGVWaXNpdG9yIDogcHVibGljIFNDRVZWaXNpdG9yPFNDLCBjb25zdCBTQ0VWICo+IHsKKyAgcHJvdGVjdGVkOgorICAgIFNjYWxhckV2b2x1dGlvbiAmU0U7CisgICAgLy8gTWVtb2l6ZSB0aGUgcmVzdWx0IG9mIGVhY2ggdmlzaXQgc28gdGhhdCB3ZSBvbmx5IGNvbXB1dGUgb25jZSBmb3IKKyAgICAvLyB0aGUgc2FtZSBpbnB1dCBTQ0VWLiBUaGlzIGlzIHRvIGF2b2lkIHJlZHVuZGFudCBjb21wdXRhdGlvbnMgd2hlbgorICAgIC8vIGEgU0NFViBpcyByZWZlcmVuY2VkIGJ5IG11bHRpcGxlIFNDRVZzLiBXaXRob3V0IG1lbW9pemF0aW9uLCB0aGlzCisgICAgLy8gdmlzaXQgYWxnb3JpdGhtIHdvdWxkIGhhdmUgZXhwb25lbnRpYWwgdGltZSBjb21wbGV4aXR5IGluIHRoZSB3b3JzdAorICAgIC8vIGNhc2UsIGNhdXNpbmcgdGhlIGNvbXBpbGVyIHRvIGhhbmcgb24gY2VydGFpbiB0ZXN0cy4KKyAgICBEZW5zZU1hcDxjb25zdCBTQ0VWICosIGNvbnN0IFNDRVYgKj4gUmV3cml0ZVJlc3VsdHM7CisKKyAgcHVibGljOgorICAgIFNDRVZSZXdyaXRlVmlzaXRvcihTY2FsYXJFdm9sdXRpb24gJlNFKSA6IFNFKFNFKSB7fQorCisgICAgY29uc3QgU0NFViAqdmlzaXQoY29uc3QgU0NFViAqUykgeworICAgICAgYXV0byBJdCA9IFJld3JpdGVSZXN1bHRzLmZpbmQoUyk7CisgICAgICBpZiAoSXQgIT0gUmV3cml0ZVJlc3VsdHMuZW5kKCkpCisgICAgICAgIHJldHVybiBJdC0+c2Vjb25kOworICAgICAgYXV0byogVmlzaXRlZCA9IFNDRVZWaXNpdG9yPFNDLCBjb25zdCBTQ0VWICo+Ojp2aXNpdChTKTsKKyAgICAgIGF1dG8gUmVzdWx0ID0gUmV3cml0ZVJlc3VsdHMudHJ5X2VtcGxhY2UoUywgVmlzaXRlZCk7CisgICAgICBhc3NlcnQoUmVzdWx0LnNlY29uZCAmJiAiU2hvdWxkIGluc2VydCBhIG5ldyBlbnRyeSIpOworICAgICAgcmV0dXJuIFJlc3VsdC5maXJzdC0+c2Vjb25kOworICAgIH0KKworICAgIGNvbnN0IFNDRVYgKnZpc2l0Q29uc3RhbnQoY29uc3QgU0NFVkNvbnN0YW50ICpDb25zdGFudCkgeworICAgICAgcmV0dXJuIENvbnN0YW50OworICAgIH0KKworICAgIGNvbnN0IFNDRVYgKnZpc2l0VHJ1bmNhdGVFeHByKGNvbnN0IFNDRVZUcnVuY2F0ZUV4cHIgKkV4cHIpIHsKKyAgICAgIGNvbnN0IFNDRVYgKk9wZXJhbmQgPSAoKFNDKil0aGlzKS0+dmlzaXQoRXhwci0+Z2V0T3BlcmFuZCgpKTsKKyAgICAgIHJldHVybiBPcGVyYW5kID09IEV4cHItPmdldE9wZXJhbmQoKQorICAgICAgICAgICAgICAgICA/IEV4cHIKKyAgICAgICAgICAgICAgICAgOiBTRS5nZXRUcnVuY2F0ZUV4cHIoT3BlcmFuZCwgRXhwci0+Z2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICBjb25zdCBTQ0VWICp2aXNpdFplcm9FeHRlbmRFeHByKGNvbnN0IFNDRVZaZXJvRXh0ZW5kRXhwciAqRXhwcikgeworICAgICAgY29uc3QgU0NFViAqT3BlcmFuZCA9ICgoU0MqKXRoaXMpLT52aXNpdChFeHByLT5nZXRPcGVyYW5kKCkpOworICAgICAgcmV0dXJuIE9wZXJhbmQgPT0gRXhwci0+Z2V0T3BlcmFuZCgpCisgICAgICAgICAgICAgICAgID8gRXhwcgorICAgICAgICAgICAgICAgICA6IFNFLmdldFplcm9FeHRlbmRFeHByKE9wZXJhbmQsIEV4cHItPmdldFR5cGUoKSk7CisgICAgfQorCisgICAgY29uc3QgU0NFViAqdmlzaXRTaWduRXh0ZW5kRXhwcihjb25zdCBTQ0VWU2lnbkV4dGVuZEV4cHIgKkV4cHIpIHsKKyAgICAgIGNvbnN0IFNDRVYgKk9wZXJhbmQgPSAoKFNDKil0aGlzKS0+dmlzaXQoRXhwci0+Z2V0T3BlcmFuZCgpKTsKKyAgICAgIHJldHVybiBPcGVyYW5kID09IEV4cHItPmdldE9wZXJhbmQoKQorICAgICAgICAgICAgICAgICA/IEV4cHIKKyAgICAgICAgICAgICAgICAgOiBTRS5nZXRTaWduRXh0ZW5kRXhwcihPcGVyYW5kLCBFeHByLT5nZXRUeXBlKCkpOworICAgIH0KKworICAgIGNvbnN0IFNDRVYgKnZpc2l0QWRkRXhwcihjb25zdCBTQ0VWQWRkRXhwciAqRXhwcikgeworICAgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCAyPiBPcGVyYW5kczsKKyAgICAgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICAgICAgZm9yIChhdXRvICpPcCA6IEV4cHItPm9wZXJhbmRzKCkpIHsKKyAgICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKCgoU0MqKXRoaXMpLT52aXNpdChPcCkpOworICAgICAgICBDaGFuZ2VkIHw9IE9wICE9IE9wZXJhbmRzLmJhY2soKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAhQ2hhbmdlZCA/IEV4cHIgOiBTRS5nZXRBZGRFeHByKE9wZXJhbmRzKTsKKyAgICB9CisKKyAgICBjb25zdCBTQ0VWICp2aXNpdE11bEV4cHIoY29uc3QgU0NFVk11bEV4cHIgKkV4cHIpIHsKKyAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgMj4gT3BlcmFuZHM7CisgICAgICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgICAgIGZvciAoYXV0byAqT3AgOiBFeHByLT5vcGVyYW5kcygpKSB7CisgICAgICAgIE9wZXJhbmRzLnB1c2hfYmFjaygoKFNDKil0aGlzKS0+dmlzaXQoT3ApKTsKKyAgICAgICAgQ2hhbmdlZCB8PSBPcCAhPSBPcGVyYW5kcy5iYWNrKCk7CisgICAgICB9CisgICAgICByZXR1cm4gIUNoYW5nZWQgPyBFeHByIDogU0UuZ2V0TXVsRXhwcihPcGVyYW5kcyk7CisgICAgfQorCisgICAgY29uc3QgU0NFViAqdmlzaXRVRGl2RXhwcihjb25zdCBTQ0VWVURpdkV4cHIgKkV4cHIpIHsKKyAgICAgIGF1dG8gKkxIUyA9ICgoU0MgKil0aGlzKS0+dmlzaXQoRXhwci0+Z2V0TEhTKCkpOworICAgICAgYXV0byAqUkhTID0gKChTQyAqKXRoaXMpLT52aXNpdChFeHByLT5nZXRSSFMoKSk7CisgICAgICBib29sIENoYW5nZWQgPSBMSFMgIT0gRXhwci0+Z2V0TEhTKCkgfHwgUkhTICE9IEV4cHItPmdldFJIUygpOworICAgICAgcmV0dXJuICFDaGFuZ2VkID8gRXhwciA6IFNFLmdldFVEaXZFeHByKExIUywgUkhTKTsKKyAgICB9CisKKyAgICBjb25zdCBTQ0VWICp2aXNpdEFkZFJlY0V4cHIoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkV4cHIpIHsKKyAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgMj4gT3BlcmFuZHM7CisgICAgICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgICAgIGZvciAoYXV0byAqT3AgOiBFeHByLT5vcGVyYW5kcygpKSB7CisgICAgICAgIE9wZXJhbmRzLnB1c2hfYmFjaygoKFNDKil0aGlzKS0+dmlzaXQoT3ApKTsKKyAgICAgICAgQ2hhbmdlZCB8PSBPcCAhPSBPcGVyYW5kcy5iYWNrKCk7CisgICAgICB9CisgICAgICByZXR1cm4gIUNoYW5nZWQgPyBFeHByCisgICAgICAgICAgICAgICAgICAgICAgOiBTRS5nZXRBZGRSZWNFeHByKE9wZXJhbmRzLCBFeHByLT5nZXRMb29wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHItPmdldE5vV3JhcEZsYWdzKCkpOworICAgIH0KKworICAgIGNvbnN0IFNDRVYgKnZpc2l0U01heEV4cHIoY29uc3QgU0NFVlNNYXhFeHByICpFeHByKSB7CisgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDI+IE9wZXJhbmRzOworICAgICAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgICAgICBmb3IgKGF1dG8gKk9wIDogRXhwci0+b3BlcmFuZHMoKSkgeworICAgICAgICBPcGVyYW5kcy5wdXNoX2JhY2soKChTQyAqKXRoaXMpLT52aXNpdChPcCkpOworICAgICAgICBDaGFuZ2VkIHw9IE9wICE9IE9wZXJhbmRzLmJhY2soKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAhQ2hhbmdlZCA/IEV4cHIgOiBTRS5nZXRTTWF4RXhwcihPcGVyYW5kcyk7CisgICAgfQorCisgICAgY29uc3QgU0NFViAqdmlzaXRVTWF4RXhwcihjb25zdCBTQ0VWVU1heEV4cHIgKkV4cHIpIHsKKyAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgMj4gT3BlcmFuZHM7CisgICAgICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgICAgIGZvciAoYXV0byAqT3AgOiBFeHByLT5vcGVyYW5kcygpKSB7CisgICAgICAgIE9wZXJhbmRzLnB1c2hfYmFjaygoKFNDKil0aGlzKS0+dmlzaXQoT3ApKTsKKyAgICAgICAgQ2hhbmdlZCB8PSBPcCAhPSBPcGVyYW5kcy5iYWNrKCk7CisgICAgICB9CisgICAgICByZXR1cm4gIUNoYW5nZWQgPyBFeHByIDogU0UuZ2V0VU1heEV4cHIoT3BlcmFuZHMpOworICAgIH0KKworICAgIGNvbnN0IFNDRVYgKnZpc2l0VW5rbm93bihjb25zdCBTQ0VWVW5rbm93biAqRXhwcikgeworICAgICAgcmV0dXJuIEV4cHI7CisgICAgfQorCisgICAgY29uc3QgU0NFViAqdmlzaXRDb3VsZE5vdENvbXB1dGUoY29uc3QgU0NFVkNvdWxkTm90Q29tcHV0ZSAqRXhwcikgeworICAgICAgcmV0dXJuIEV4cHI7CisgICAgfQorICB9OworCisgIHVzaW5nIFZhbHVlVG9WYWx1ZU1hcCA9IERlbnNlTWFwPGNvbnN0IFZhbHVlICosIFZhbHVlICo+OworCisgIC8vLyBUaGUgU0NFVlBhcmFtZXRlclJld3JpdGVyIHRha2VzIGEgc2NhbGFyIGV2b2x1dGlvbiBleHByZXNzaW9uIGFuZCB1cGRhdGVzCisgIC8vLyB0aGUgU0NFVlVua25vd24gY29tcG9uZW50cyBmb2xsb3dpbmcgdGhlIE1hcCAoVmFsdWUgLT4gVmFsdWUpLgorICBjbGFzcyBTQ0VWUGFyYW1ldGVyUmV3cml0ZXIgOiBwdWJsaWMgU0NFVlJld3JpdGVWaXNpdG9yPFNDRVZQYXJhbWV0ZXJSZXdyaXRlcj4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IFNDRVYgKnJld3JpdGUoY29uc3QgU0NFViAqU2NldiwgU2NhbGFyRXZvbHV0aW9uICZTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVRvVmFsdWVNYXAgJk1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEludGVycHJldENvbnN0cyA9IGZhbHNlKSB7CisgICAgICBTQ0VWUGFyYW1ldGVyUmV3cml0ZXIgUmV3cml0ZXIoU0UsIE1hcCwgSW50ZXJwcmV0Q29uc3RzKTsKKyAgICAgIHJldHVybiBSZXdyaXRlci52aXNpdChTY2V2KTsKKyAgICB9CisKKyAgICBTQ0VWUGFyYW1ldGVyUmV3cml0ZXIoU2NhbGFyRXZvbHV0aW9uICZTRSwgVmFsdWVUb1ZhbHVlTWFwICZNLCBib29sIEMpCisgICAgICA6IFNDRVZSZXdyaXRlVmlzaXRvcihTRSksIE1hcChNKSwgSW50ZXJwcmV0Q29uc3RzKEMpIHt9CisKKyAgICBjb25zdCBTQ0VWICp2aXNpdFVua25vd24oY29uc3QgU0NFVlVua25vd24gKkV4cHIpIHsKKyAgICAgIFZhbHVlICpWID0gRXhwci0+Z2V0VmFsdWUoKTsKKyAgICAgIGlmIChNYXAuY291bnQoVikpIHsKKyAgICAgICAgVmFsdWUgKk5WID0gTWFwW1ZdOworICAgICAgICBpZiAoSW50ZXJwcmV0Q29uc3RzICYmIGlzYTxDb25zdGFudEludD4oTlYpKQorICAgICAgICAgIHJldHVybiBTRS5nZXRDb25zdGFudChjYXN0PENvbnN0YW50SW50PihOVikpOworICAgICAgICByZXR1cm4gU0UuZ2V0VW5rbm93bihOVik7CisgICAgICB9CisgICAgICByZXR1cm4gRXhwcjsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBWYWx1ZVRvVmFsdWVNYXAgJk1hcDsKKyAgICBib29sIEludGVycHJldENvbnN0czsKKyAgfTsKKworICB1c2luZyBMb29wVG9TY2V2TWFwVCA9IERlbnNlTWFwPGNvbnN0IExvb3AgKiwgY29uc3QgU0NFViAqPjsKKworICAvLy8gVGhlIFNDRVZMb29wQWRkUmVjUmV3cml0ZXIgdGFrZXMgYSBzY2FsYXIgZXZvbHV0aW9uIGV4cHJlc3Npb24gYW5kIGFwcGxpZXMKKyAgLy8vIHRoZSBNYXAgKExvb3AgLT4gU0NFVikgdG8gYWxsIEFkZFJlY0V4cHJzLgorICBjbGFzcyBTQ0VWTG9vcEFkZFJlY1Jld3JpdGVyCisgICAgICA6IHB1YmxpYyBTQ0VWUmV3cml0ZVZpc2l0b3I8U0NFVkxvb3BBZGRSZWNSZXdyaXRlcj4geworICBwdWJsaWM6CisgICAgU0NFVkxvb3BBZGRSZWNSZXdyaXRlcihTY2FsYXJFdm9sdXRpb24gJlNFLCBMb29wVG9TY2V2TWFwVCAmTSkKKyAgICAgICAgOiBTQ0VWUmV3cml0ZVZpc2l0b3IoU0UpLCBNYXAoTSkge30KKworICAgIHN0YXRpYyBjb25zdCBTQ0VWICpyZXdyaXRlKGNvbnN0IFNDRVYgKlNjZXYsIExvb3BUb1NjZXZNYXBUICZNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyRXZvbHV0aW9uICZTRSkgeworICAgICAgU0NFVkxvb3BBZGRSZWNSZXdyaXRlciBSZXdyaXRlcihTRSwgTWFwKTsKKyAgICAgIHJldHVybiBSZXdyaXRlci52aXNpdChTY2V2KTsKKyAgICB9CisKKyAgICBjb25zdCBTQ0VWICp2aXNpdEFkZFJlY0V4cHIoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkV4cHIpIHsKKyAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgMj4gT3BlcmFuZHM7CisgICAgICBmb3IgKGNvbnN0IFNDRVYgKk9wIDogRXhwci0+b3BlcmFuZHMoKSkKKyAgICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKHZpc2l0KE9wKSk7CisKKyAgICAgIGNvbnN0IExvb3AgKkwgPSBFeHByLT5nZXRMb29wKCk7CisgICAgICBjb25zdCBTQ0VWICpSZXMgPSBTRS5nZXRBZGRSZWNFeHByKE9wZXJhbmRzLCBMLCBFeHByLT5nZXROb1dyYXBGbGFncygpKTsKKworICAgICAgaWYgKDAgPT0gTWFwLmNvdW50KEwpKQorICAgICAgICByZXR1cm4gUmVzOworCisgICAgICBjb25zdCBTQ0VWQWRkUmVjRXhwciAqUmVjID0gY2FzdDxTQ0VWQWRkUmVjRXhwcj4oUmVzKTsKKyAgICAgIHJldHVybiBSZWMtPmV2YWx1YXRlQXRJdGVyYXRpb24oTWFwW0xdLCBTRSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgTG9vcFRvU2Nldk1hcFQgJk1hcDsKKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfU0NBTEFSRVZPTFVUSU9ORVhQUkVTU0lPTlNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25Ob3JtYWxpemF0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbk5vcm1hbGl6YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWM5MjEyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25Ob3JtYWxpemF0aW9uLmgKQEAgLTAsMCArMSw2OSBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uTm9ybWFsaXphdGlvbi5oIC0gU2VlIGJlbG93IC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB1dGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCAibm9ybWFsaXplZCIgU2NhbGFyRXZvbHV0aW9uCisvLyBleHByZXNzaW9ucy4KKy8vCisvLyBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgcG9zdC1pbmNyZW1lbnQgdXNlcyBhbmQgaG93IG5vcm1hbGl6ZWQKKy8vIGV4cHJlc3Npb25zIGhlbHAuCisvLworLy8gICBmb3IgKGk9MDsgaSE9bjsgKytpKSB7CisvLyAgICAgLi4uCisvLyAgIH0KKy8vICAgdXNlKGkpOworLy8KKy8vIFdoaWxlIHRoZSBleHByZXNzaW9uIGZvciBtb3N0IHVzZXMgb2YgaSBpbnNpZGUgdGhlIGxvb3AgaXMgezAsKywxfTwlTD4sIHRoZQorLy8gZXhwcmVzc2lvbiBmb3IgdGhlIHVzZSBvZiBpIG91dHNpZGUgdGhlIGxvb3AgaXMgezEsKywxfTwlTD4sIHNpbmNlIGkgaXMKKy8vIGluY3JlbWVudGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxvb3AgYm9keS4gVGhpcyBpcyBpbmNvbnZlaWVudCwgc2luY2UgaXQKKy8vIHN1Z2dlc3RzIHRoYXQgd2UgbmVlZCB0d28gZGlmZmVyZW50IGluZHVjdGlvbiB2YXJpYWJsZXMsIG9uZSB0aGF0IHN0YXJ0cworLy8gYXQgMCBhbmQgb25lIHRoYXQgc3RhcnRzIGF0IDEuIFdlJ2QgcHJlZmVyIHRvIGJlIGFibGUgdG8gdGhpbmsgb2YgdGhlc2UgYXMKKy8vIHRoZSBzYW1lIGluZHVjdGlvbiB2YXJpYWJsZSwgd2l0aCB1c2VzIGluc2lkZSB0aGUgbG9vcCB1c2luZyB0aGUKKy8vICJwcmUtaW5jcmVtZW50ZWQiIHZhbHVlLCBhbmQgdXNlcyBhZnRlciB0aGUgbG9vcCB1c2luZyB0aGUKKy8vICJwb3N0LWluY3JlbWVudGVkIiB2YWx1ZS4KKy8vCisvLyBFeHByZXNzaW9ucyBmb3IgcG9zdC1pbmNyZW1lbnRlZCB1c2VzIGFyZSByZXByZXNlbnRlZCBhcyBhbiBleHByZXNzaW9uCisvLyBwYWlyZWQgd2l0aCBhIHNldCBvZiBsb29wcyBmb3Igd2hpY2ggdGhlIGV4cHJlc3Npb24gaXMgaW4gInBvc3QtaW5jcmVtZW50IgorLy8gbW9kZSAodGhlcmUgbWF5IGJlIG11bHRpcGxlIGxvb3BzKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfU0NBTEFSRVZPTFVUSU9OTk9STUFMSVpBVElPTl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfU0NBTEFSRVZPTFVUSU9OTk9STUFMSVpBVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uRXhwcmVzc2lvbnMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMb29wOworY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworY2xhc3MgU0NFVjsKKwordHlwZWRlZiBTbWFsbFB0clNldDxjb25zdCBMb29wICosIDI+IFBvc3RJbmNMb29wU2V0OworCit0eXBlZGVmIGZ1bmN0aW9uX3JlZjxib29sKGNvbnN0IFNDRVZBZGRSZWNFeHByICopPiBOb3JtYWxpemVQcmVkVHk7CisKKy8vLyBOb3JtYWxpemUgXHAgUyB0byBiZSBwb3N0LWluY3JlbWVudCBmb3IgYWxsIGxvb3BzIHByZXNlbnQgaW4gXHAKKy8vLyBMb29wcy4KK2NvbnN0IFNDRVYgKm5vcm1hbGl6ZUZvclBvc3RJbmNVc2UoY29uc3QgU0NFViAqUywgY29uc3QgUG9zdEluY0xvb3BTZXQgJkxvb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gJlNFKTsKKworLy8vIE5vcm1hbGl6ZSBccCBTIGZvciBhbGwgYWRkIHJlY3VycmVuY2Ugc3ViLWV4cHJlc3Npb25zIGZvciB3aGljaCBccAorLy8vIFByZWQgcmV0dXJucyB0cnVlLgorY29uc3QgU0NFViAqbm9ybWFsaXplRm9yUG9zdEluY1VzZUlmKGNvbnN0IFNDRVYgKlMsIE5vcm1hbGl6ZVByZWRUeSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiAmU0UpOworCisvLy8gRGVub3JtYWxpemUgXHAgUyB0byBiZSBwb3N0LWluY3JlbWVudCBmb3IgYWxsIGxvb3BzIHByZXNlbnQgaW4gXHAKKy8vLyBMb29wcy4KK2NvbnN0IFNDRVYgKmRlbm9ybWFsaXplRm9yUG9zdEluY1VzZShjb25zdCBTQ0VWICpTLCBjb25zdCBQb3N0SW5jTG9vcFNldCAmTG9vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyRXZvbHV0aW9uICZTRSk7Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TY29wZWROb0FsaWFzQUEuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvU2NvcGVkTm9BbGlhc0FBLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4OTY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvU2NvcGVkTm9BbGlhc0FBLmgKQEAgLTAsMCArMSw4OSBAQAorLy89PT0tIFNjb3BlZE5vQWxpYXNBQS5oIC0gU2NvcGVkIE5vLUFsaWFzIEFsaWFzIEFuYWx5c2lzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGEgbWV0YWRhdGEtYmFzZWQgc2NvcGVkIG5vLWFsaWFzIGFuYWx5c2lzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19TQ09QRUROT0FMSUFTQUFfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1NDT1BFRE5PQUxJQVNBQV9ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIE1ETm9kZTsKK2NsYXNzIE1lbW9yeUxvY2F0aW9uOworCisvLy8gQSBzaW1wbGUgQUEgcmVzdWx0IHdoaWNoIHVzZXMgc2NvcGVkLW5vYWxpYXMgbWV0YWRhdGEgdG8gYW5zd2VyIHF1ZXJpZXMuCitjbGFzcyBTY29wZWROb0FsaWFzQUFSZXN1bHQgOiBwdWJsaWMgQUFSZXN1bHRCYXNlPFNjb3BlZE5vQWxpYXNBQVJlc3VsdD4geworICBmcmllbmQgQUFSZXN1bHRCYXNlPFNjb3BlZE5vQWxpYXNBQVJlc3VsdD47CisKK3B1YmxpYzoKKyAgLy8vIEhhbmRsZSBpbnZhbGlkYXRpb24gZXZlbnRzIGZyb20gdGhlIG5ldyBwYXNzIG1hbmFnZXIuCisgIC8vLworICAvLy8gQnkgZGVmaW5pdGlvbiwgdGhpcyByZXN1bHQgaXMgc3RhdGVsZXNzIGFuZCBzbyByZW1haW5zIHZhbGlkLgorICBib29sIGludmFsaWRhdGUoRnVuY3Rpb24gJiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJiwKKyAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQWxpYXNSZXN1bHQgYWxpYXMoY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0EsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NCKTsKKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jKTsKKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTMSwgSW1tdXRhYmxlQ2FsbFNpdGUgQ1MyKTsKKworcHJpdmF0ZToKKyAgYm9vbCBtYXlBbGlhc0luU2NvcGVzKGNvbnN0IE1ETm9kZSAqU2NvcGVzLCBjb25zdCBNRE5vZGUgKk5vQWxpYXMpIGNvbnN0OworfTsKKworLy8vIEFuYWx5c2lzIHBhc3MgcHJvdmlkaW5nIGEgbmV2ZXItaW52YWxpZGF0ZWQgYWxpYXMgYW5hbHlzaXMgcmVzdWx0LgorY2xhc3MgU2NvcGVkTm9BbGlhc0FBIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPFNjb3BlZE5vQWxpYXNBQT4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48U2NvcGVkTm9BbGlhc0FBPjsKKworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIHVzaW5nIFJlc3VsdCA9IFNjb3BlZE5vQWxpYXNBQVJlc3VsdDsKKworICBTY29wZWROb0FsaWFzQUFSZXN1bHQgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIExlZ2FjeSB3cmFwcGVyIHBhc3MgdG8gcHJvdmlkZSB0aGUgU2NvcGVkTm9BbGlhc0FBUmVzdWx0IG9iamVjdC4KK2NsYXNzIFNjb3BlZE5vQWxpYXNBQVdyYXBwZXJQYXNzIDogcHVibGljIEltbXV0YWJsZVBhc3MgeworICBzdGQ6OnVuaXF1ZV9wdHI8U2NvcGVkTm9BbGlhc0FBUmVzdWx0PiBSZXN1bHQ7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgU2NvcGVkTm9BbGlhc0FBV3JhcHBlclBhc3MoKTsKKworICBTY29wZWROb0FsaWFzQUFSZXN1bHQgJmdldFJlc3VsdCgpIHsgcmV0dXJuICpSZXN1bHQ7IH0KKyAgY29uc3QgU2NvcGVkTm9BbGlhc0FBUmVzdWx0ICZnZXRSZXN1bHQoKSBjb25zdCB7IHJldHVybiAqUmVzdWx0OyB9CisKKyAgYm9vbCBkb0luaXRpYWxpemF0aW9uKE1vZHVsZSAmTSkgb3ZlcnJpZGU7CisgIGJvb2wgZG9GaW5hbGl6YXRpb24oTW9kdWxlICZNKSBvdmVycmlkZTsKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIGNyZWF0ZVNjb3BlZE5vQWxpYXNBQVdyYXBwZXJQYXNzIC0gVGhpcyBwYXNzIGltcGxlbWVudHMgbWV0YWRhdGEtYmFzZWQKKy8vIHNjb3BlZCBub2FsaWFzIGFuYWx5c2lzLgorLy8KK0ltbXV0YWJsZVBhc3MgKmNyZWF0ZVNjb3BlZE5vQWxpYXNBQVdyYXBwZXJQYXNzKCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX1NDT1BFRE5PQUxJQVNBQV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NwYXJzZVByb3BhZ2F0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NwYXJzZVByb3BhZ2F0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4ZGYwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvU3BhcnNlUHJvcGFnYXRpb24uaApAQCAtMCwwICsxLDUzMCBAQAorLy89PT0tIFNwYXJzZVByb3BhZ2F0aW9uLmggLSBTcGFyc2UgQ29uZGl0aW9uYWwgUHJvcGVydHkgUHJvcGFnYXRpb24gLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhbiBhYnN0cmFjdCBzcGFyc2UgY29uZGl0aW9uYWwgcHJvcGFnYXRpb24gYWxnb3JpdGhtLAorLy8gbW9kZWxlZCBhZnRlciBTQ0NQLCBidXQgd2l0aCBhIGN1c3RvbWl6YWJsZSBsYXR0aWNlIGZ1bmN0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19TUEFSU0VQUk9QQUdBVElPTl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfU1BBUlNFUFJPUEFHQVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlIDxzZXQ+CisKKyNkZWZpbmUgREVCVUdfVFlQRSAic3BhcnNlcHJvcCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQSB0ZW1wbGF0ZSBmb3IgdHJhbnNsYXRpbmcgYmV0d2VlbiBMTFZNIFZhbHVlcyBhbmQgTGF0dGljZUtleXMuIENsaWVudHMgbXVzdAorLy8vIHByb3ZpZGUgYSBzcGVjaWFsaXphdGlvbiBvZiBMYXR0aWNlS2V5SW5mbyBmb3IgdGhlaXIgTGF0dGljZUtleSB0eXBlLgordGVtcGxhdGUgPGNsYXNzIExhdHRpY2VLZXk+IHN0cnVjdCBMYXR0aWNlS2V5SW5mbyB7CisgIC8vIHN0YXRpYyBpbmxpbmUgVmFsdWUgKmdldFZhbHVlRnJvbUxhdHRpY2VLZXkoTGF0dGljZUtleSBLZXkpOworICAvLyBzdGF0aWMgaW5saW5lIExhdHRpY2VLZXkgZ2V0TGF0dGljZUtleUZyb21WYWx1ZShWYWx1ZSAqVik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgTGF0dGljZUtleSwgY2xhc3MgTGF0dGljZVZhbCwKKyAgICAgICAgICBjbGFzcyBLZXlJbmZvID0gTGF0dGljZUtleUluZm88TGF0dGljZUtleT4+CitjbGFzcyBTcGFyc2VTb2x2ZXI7CisKKy8vLyBBYnN0cmFjdExhdHRpY2VGdW5jdGlvbiAtIFRoaXMgY2xhc3MgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGRhdGFmbG93IGluc3RhbmNlCisvLy8gdG8gc3BlY2lmeSB3aGF0IHRoZSBsYXR0aWNlIHZhbHVlcyBhcmUgYW5kIGhvdyB0aGV5IGhhbmRsZSBtZXJnZXMgZXRjLiAgVGhpcworLy8vIGdpdmVzIHRoZSBjbGllbnQgdGhlIHBvd2VyIHRvIGNvbXB1dGUgbGF0dGljZSB2YWx1ZXMgZnJvbSBpbnN0cnVjdGlvbnMsCisvLy8gY29uc3RhbnRzLCBldGMuICBUaGUgY3VycmVudCByZXF1aXJlbWVudCBpcyB0aGF0IGxhdHRpY2UgdmFsdWVzIG11c3QgYmUKKy8vLyBjb3B5YWJsZS4gIEF0IHRoZSBtb21lbnQsIG5vdGhpbmcgdHJpZXMgdG8gYXZvaWQgY29weWluZy4gIEFkZGl0aW9uYWxseSwKKy8vLyBsYXR0aWNlIGtleXMgbXVzdCBiZSBhYmxlIHRvIGJlIHVzZWQgYXMga2V5cyBvZiBhIG1hcHBpbmcgZGF0YSBzdHJ1Y3R1cmUuCisvLy8gSW50ZXJuYWxseSwgdGhlIGdlbmVyaWMgc29sdmVyIGN1cnJlbnRseSB1c2VzIGEgRGVuc2VNYXAgdG8gbWFwIGxhdHRpY2Uga2V5cworLy8vIHRvIGxhdHRpY2UgdmFsdWVzLiAgSWYgdGhlIGxhdHRpY2Uga2V5IGlzIGEgbm9uLXN0YW5kYXJkIHR5cGUsIGEKKy8vLyBzcGVjaWFsaXphdGlvbiBvZiBEZW5zZU1hcEluZm8gbXVzdCBiZSBwcm92aWRlZC4KK3RlbXBsYXRlIDxjbGFzcyBMYXR0aWNlS2V5LCBjbGFzcyBMYXR0aWNlVmFsPiBjbGFzcyBBYnN0cmFjdExhdHRpY2VGdW5jdGlvbiB7Citwcml2YXRlOgorICBMYXR0aWNlVmFsIFVuZGVmVmFsLCBPdmVyZGVmaW5lZFZhbCwgVW50cmFja2VkVmFsOworCitwdWJsaWM6CisgIEFic3RyYWN0TGF0dGljZUZ1bmN0aW9uKExhdHRpY2VWYWwgdW5kZWZWYWwsIExhdHRpY2VWYWwgb3ZlcmRlZmluZWRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExhdHRpY2VWYWwgdW50cmFja2VkVmFsKSB7CisgICAgVW5kZWZWYWwgPSB1bmRlZlZhbDsKKyAgICBPdmVyZGVmaW5lZFZhbCA9IG92ZXJkZWZpbmVkVmFsOworICAgIFVudHJhY2tlZFZhbCA9IHVudHJhY2tlZFZhbDsKKyAgfQorCisgIHZpcnR1YWwgfkFic3RyYWN0TGF0dGljZUZ1bmN0aW9uKCkgPSBkZWZhdWx0OworCisgIExhdHRpY2VWYWwgZ2V0VW5kZWZWYWwoKSAgICAgICBjb25zdCB7IHJldHVybiBVbmRlZlZhbDsgfQorICBMYXR0aWNlVmFsIGdldE92ZXJkZWZpbmVkVmFsKCkgY29uc3QgeyByZXR1cm4gT3ZlcmRlZmluZWRWYWw7IH0KKyAgTGF0dGljZVZhbCBnZXRVbnRyYWNrZWRWYWwoKSAgIGNvbnN0IHsgcmV0dXJuIFVudHJhY2tlZFZhbDsgfQorCisgIC8vLyBJc1VudHJhY2tlZFZhbHVlIC0gSWYgdGhlIHNwZWNpZmllZCBMYXR0aWNlS2V5IGlzIG9idmlvdXNseSB1bmludGVyZXN0aW5nCisgIC8vLyB0byB0aGUgYW5hbHlzaXMgKGkuZS4sIGl0IHdvdWxkIGFsd2F5cyByZXR1cm4gVW50cmFja2VkVmFsKSwgdGhpcworICAvLy8gZnVuY3Rpb24gY2FuIHJldHVybiB0cnVlIHRvIGF2b2lkIHBvaW50bGVzcyB3b3JrLgorICB2aXJ0dWFsIGJvb2wgSXNVbnRyYWNrZWRWYWx1ZShMYXR0aWNlS2V5IEtleSkgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gQ29tcHV0ZUxhdHRpY2VWYWwgLSBDb21wdXRlIGFuZCByZXR1cm4gYSBMYXR0aWNlVmFsIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgIC8vLyBnaXZlbiBMYXR0aWNlS2V5LgorICB2aXJ0dWFsIExhdHRpY2VWYWwgQ29tcHV0ZUxhdHRpY2VWYWwoTGF0dGljZUtleSBLZXkpIHsKKyAgICByZXR1cm4gZ2V0T3ZlcmRlZmluZWRWYWwoKTsKKyAgfQorCisgIC8vLyBJc1NwZWNpYWxDYXNlZFBISSAtIEdpdmVuIGEgUEhJIG5vZGUsIGRldGVybWluZSB3aGV0aGVyIHRoaXMgUEhJIG5vZGUgaXMKKyAgLy8vIG9uZSB0aGF0IHRoZSB3ZSB3YW50IHRvIGhhbmRsZSB0aHJvdWdoIENvbXB1dGVJbnN0cnVjdGlvblN0YXRlLgorICB2aXJ0dWFsIGJvb2wgSXNTcGVjaWFsQ2FzZWRQSEkoUEhJTm9kZSAqUE4pIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIE1lcmdlVmFsdWVzIC0gQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBtZXJnZSBvZiB0aGUgdHdvIHNwZWNpZmllZCBsYXR0aWNlCisgIC8vLyB2YWx1ZXMuICBNZXJnaW5nIHNob3VsZCBvbmx5IG1vdmUgb25lIGRpcmVjdGlvbiBkb3duIHRoZSBsYXR0aWNlIHRvCisgIC8vLyBndWFyYW50ZWUgY29udmVyZ2VuY2UgKHRvd2FyZCBvdmVyZGVmaW5lZCkuCisgIHZpcnR1YWwgTGF0dGljZVZhbCBNZXJnZVZhbHVlcyhMYXR0aWNlVmFsIFgsIExhdHRpY2VWYWwgWSkgeworICAgIHJldHVybiBnZXRPdmVyZGVmaW5lZFZhbCgpOyAvLyBhbHdheXMgc2FmZSwgbmV2ZXIgdXNlZnVsLgorICB9CisKKyAgLy8vIENvbXB1dGVJbnN0cnVjdGlvblN0YXRlIC0gQ29tcHV0ZSB0aGUgTGF0dGljZUtleXMgdGhhdCBjaGFuZ2UgYXMgYSByZXN1bHQKKyAgLy8vIG9mIGV4ZWN1dGluZyBpbnN0cnVjdGlvbiBccCBJLiBUaGVpciBhc3NvY2lhdGVkIExhdHRpY2VWYWxzIGFyZSBzdG9yZSBpbgorICAvLy8gXHAgQ2hhbmdlZFZhbHVlcy4KKyAgdmlydHVhbCB2b2lkCisgIENvbXB1dGVJbnN0cnVjdGlvblN0YXRlKEluc3RydWN0aW9uICZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxMYXR0aWNlS2V5LCBMYXR0aWNlVmFsPiAmQ2hhbmdlZFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3BhcnNlU29sdmVyPExhdHRpY2VLZXksIExhdHRpY2VWYWw+ICZTUykgPSAwOworCisgIC8vLyBQcmludExhdHRpY2VWYWwgLSBSZW5kZXIgdGhlIGdpdmVuIExhdHRpY2VWYWwgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0uCisgIHZpcnR1YWwgdm9pZCBQcmludExhdHRpY2VWYWwoTGF0dGljZVZhbCBMViwgcmF3X29zdHJlYW0gJk9TKTsKKworICAvLy8gUHJpbnRMYXR0aWNlS2V5IC0gUmVuZGVyIHRoZSBnaXZlbiBMYXR0aWNlS2V5IHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgorICB2aXJ0dWFsIHZvaWQgUHJpbnRMYXR0aWNlS2V5KExhdHRpY2VLZXkgS2V5LCByYXdfb3N0cmVhbSAmT1MpOworCisgIC8vLyBHZXRWYWx1ZUZyb21MYXR0aWNlVmFsIC0gSWYgdGhlIGdpdmVuIExhdHRpY2VWYWwgaXMgcmVwcmVzZW50YWJsZSBhcyBhbgorICAvLy8gTExWTSB2YWx1ZSwgcmV0dXJuIGl0OyBvdGhlcndpc2UsIHJldHVybiBudWxscHRyLiBJZiBhIHR5cGUgaXMgZ2l2ZW4sIHRoZQorICAvLy8gcmV0dXJuZWQgdmFsdWUgbXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUKKyAgLy8vIGdlbmVyaWMgc29sdmVyIGluIGF0dGVtcHRpbmcgdG8gcmVzb2x2ZSBicmFuY2ggYW5kIHN3aXRjaCBjb25kaXRpb25zLgorICB2aXJ0dWFsIFZhbHVlICpHZXRWYWx1ZUZyb21MYXR0aWNlVmFsKExhdHRpY2VWYWwgTFYsIFR5cGUgKlR5ID0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9Cit9OworCisvLy8gU3BhcnNlU29sdmVyIC0gVGhpcyBjbGFzcyBpcyBhIGdlbmVyYWwgcHVycG9zZSBzb2x2ZXIgZm9yIFNwYXJzZSBDb25kaXRpb25hbAorLy8vIFByb3BhZ2F0aW9uIHdpdGggYSBwcm9ncmFtbWFibGUgbGF0dGljZSBmdW5jdGlvbi4KK3RlbXBsYXRlIDxjbGFzcyBMYXR0aWNlS2V5LCBjbGFzcyBMYXR0aWNlVmFsLCBjbGFzcyBLZXlJbmZvPgorY2xhc3MgU3BhcnNlU29sdmVyIHsKKworICAvLy8gTGF0dGljZUZ1bmMgLSBUaGlzIGlzIHRoZSBvYmplY3QgdGhhdCBrbm93cyB0aGUgbGF0dGljZSBhbmQgaG93IHRvCisgIC8vLyBjb21wdXRlIHRyYW5zZmVyIGZ1bmN0aW9ucy4KKyAgQWJzdHJhY3RMYXR0aWNlRnVuY3Rpb248TGF0dGljZUtleSwgTGF0dGljZVZhbD4gKkxhdHRpY2VGdW5jOworCisgIC8vLyBWYWx1ZVN0YXRlIC0gSG9sZHMgdGhlIExhdHRpY2VWYWxzIGFzc29jaWF0ZWQgd2l0aCBMYXR0aWNlS2V5cy4KKyAgRGVuc2VNYXA8TGF0dGljZUtleSwgTGF0dGljZVZhbD4gVmFsdWVTdGF0ZTsKKworICAvLy8gQkJFeGVjdXRhYmxlIC0gSG9sZHMgdGhlIGJhc2ljIGJsb2NrcyB0aGF0IGFyZSBleGVjdXRhYmxlLgorICBTbWFsbFB0clNldDxCYXNpY0Jsb2NrICosIDE2PiBCQkV4ZWN1dGFibGU7CisKKyAgLy8vIFZhbHVlV29ya0xpc3QgLSBIb2xkcyB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgcHJvY2Vzc2VkLgorICBTbWFsbFZlY3RvcjxWYWx1ZSAqLCA2ND4gVmFsdWVXb3JrTGlzdDsKKworICAvLy8gQkJXb3JrTGlzdCAtIEhvbGRzIGJhc2ljIGJsb2NrcyB0aGF0IHNob3VsZCBiZSBwcm9jZXNzZWQuCisgIFNtYWxsVmVjdG9yPEJhc2ljQmxvY2sgKiwgNjQ+IEJCV29ya0xpc3Q7CisKKyAgdXNpbmcgRWRnZSA9IHN0ZDo6cGFpcjxCYXNpY0Jsb2NrICosIEJhc2ljQmxvY2sgKj47CisKKyAgLy8vIEtub3duRmVhc2libGVFZGdlcyAtIEVudHJpZXMgaW4gdGhpcyBzZXQgYXJlIGVkZ2VzIHdoaWNoIGhhdmUgYWxyZWFkeSBoYWQKKyAgLy8vIFBISSBub2RlcyByZXRyaWdnZXJlZC4KKyAgc3RkOjpzZXQ8RWRnZT4gS25vd25GZWFzaWJsZUVkZ2VzOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFNwYXJzZVNvbHZlcigKKyAgICAgIEFic3RyYWN0TGF0dGljZUZ1bmN0aW9uPExhdHRpY2VLZXksIExhdHRpY2VWYWw+ICpMYXR0aWNlKQorICAgICAgOiBMYXR0aWNlRnVuYyhMYXR0aWNlKSB7fQorICBTcGFyc2VTb2x2ZXIoY29uc3QgU3BhcnNlU29sdmVyICYpID0gZGVsZXRlOworICBTcGFyc2VTb2x2ZXIgJm9wZXJhdG9yPShjb25zdCBTcGFyc2VTb2x2ZXIgJikgPSBkZWxldGU7CisKKyAgLy8vIFNvbHZlIC0gU29sdmUgZm9yIGNvbnN0YW50cyBhbmQgZXhlY3V0YWJsZSBibG9ja3MuCisgIHZvaWQgU29sdmUoKTsKKworICB2b2lkIFByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8vIGdldEV4aXN0aW5nVmFsdWVTdGF0ZSAtIFJldHVybiB0aGUgTGF0dGljZVZhbCBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgLy8vIGdpdmVuIHZhbHVlIGZyb20gdGhlIFZhbHVlU3RhdGUgbWFwLiBJZiB0aGUgdmFsdWUgaXMgbm90IGluIHRoZSBtYXAsCisgIC8vLyBVbnRyYWNrZWRWYWwgaXMgcmV0dXJuZWQsIHVubGlrZSB0aGUgZ2V0VmFsdWVTdGF0ZSBtZXRob2QuCisgIExhdHRpY2VWYWwgZ2V0RXhpc3RpbmdWYWx1ZVN0YXRlKExhdHRpY2VLZXkgS2V5KSBjb25zdCB7CisgICAgYXV0byBJID0gVmFsdWVTdGF0ZS5maW5kKEtleSk7CisgICAgcmV0dXJuIEkgIT0gVmFsdWVTdGF0ZS5lbmQoKSA/IEktPnNlY29uZCA6IExhdHRpY2VGdW5jLT5nZXRVbnRyYWNrZWRWYWwoKTsKKyAgfQorCisgIC8vLyBnZXRWYWx1ZVN0YXRlIC0gUmV0dXJuIHRoZSBMYXR0aWNlVmFsIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbgorICAvLy8gdmFsdWUgZnJvbSB0aGUgVmFsdWVTdGF0ZSBtYXAuIElmIHRoZSB2YWx1ZSBpcyBub3QgaW4gdGhlIG1hcCwgaXRzIHN0YXRlCisgIC8vLyBpcyBpbml0aWFsaXplZC4KKyAgTGF0dGljZVZhbCBnZXRWYWx1ZVN0YXRlKExhdHRpY2VLZXkgS2V5KTsKKworICAvLy8gaXNFZGdlRmVhc2libGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29udHJvbCBmbG93IGVkZ2UgZnJvbSB0aGUgJ0Zyb20nCisgIC8vLyBiYXNpYyBibG9jayB0byB0aGUgJ1RvJyBiYXNpYyBibG9jayBpcyBjdXJyZW50bHkgZmVhc2libGUuICBJZgorICAvLy8gQWdncmVzc2l2ZVVuZGVmIGlzIHRydWUsIHRoZW4gdGhpcyB0cmVhdHMgdmFsdWVzIHdpdGggdW5rbm93biBsYXR0aWNlCisgIC8vLyB2YWx1ZXMgYXMgdW5kZWZpbmVkLiAgVGhpcyBpcyBnZW5lcmFsbHkgb25seSB1c2VmdWwgd2hlbiBzb2x2aW5nIHRoZQorICAvLy8gbGF0dGljZSwgbm90IHdoZW4gcXVlcnlpbmcgaXQuCisgIGJvb2wgaXNFZGdlRmVhc2libGUoQmFzaWNCbG9jayAqRnJvbSwgQmFzaWNCbG9jayAqVG8sCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBZ2dyZXNzaXZlVW5kZWYgPSBmYWxzZSk7CisKKyAgLy8vIGlzQmxvY2tFeGVjdXRhYmxlIC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGFueSBrbm93biBmZWFzaWJsZQorICAvLy8gZWRnZXMgaW50byB0aGUgYmFzaWMgYmxvY2suICBUaGlzIGlzIGdlbmVyYWxseSBvbmx5IHVzZWZ1bCB3aGVuCisgIC8vLyBxdWVyeWluZyB0aGUgbGF0dGljZS4KKyAgYm9vbCBpc0Jsb2NrRXhlY3V0YWJsZShCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIHJldHVybiBCQkV4ZWN1dGFibGUuY291bnQoQkIpOworICB9CisKKyAgLy8vIE1hcmtCbG9ja0V4ZWN1dGFibGUgLSBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBieSBjbGllbnRzIHRvIG1hcmsgYWxsIG9mCisgIC8vLyB0aGUgYmxvY2tzIHRoYXQgYXJlIGtub3duIHRvIGJlIGludHJpbnNpY2FsbHkgbGl2ZSBpbiB0aGUgcHJvY2Vzc2VkIHVuaXQuCisgIHZvaWQgTWFya0Jsb2NrRXhlY3V0YWJsZShCYXNpY0Jsb2NrICpCQik7CisKK3ByaXZhdGU6CisgIC8vLyBVcGRhdGVTdGF0ZSAtIFdoZW4gdGhlIHN0YXRlIG9mIHNvbWUgTGF0dGljZUtleSBpcyBwb3RlbnRpYWxseSB1cGRhdGVkIHRvCisgIC8vLyB0aGUgZ2l2ZW4gTGF0dGljZVZhbCwgdGhpcyBmdW5jdGlvbiBub3RpY2VzIGFuZCBhZGRzIHRoZSBMTFZNIHZhbHVlCisgIC8vLyBjb3JyZXNwb25kaW5nIHRoZSBrZXkgdG8gdGhlIHdvcmsgbGlzdCwgaWYgbmVlZGVkLgorICB2b2lkIFVwZGF0ZVN0YXRlKExhdHRpY2VLZXkgS2V5LCBMYXR0aWNlVmFsIExWKTsKKworICAvLy8gbWFya0VkZ2VFeGVjdXRhYmxlIC0gTWFyayBhIGJhc2ljIGJsb2NrIGFzIGV4ZWN1dGFibGUsIGFkZGluZyBpdCB0byB0aGUgQkIKKyAgLy8vIHdvcmsgbGlzdCBpZiBpdCBpcyBub3QgYWxyZWFkeSBleGVjdXRhYmxlLgorICB2b2lkIG1hcmtFZGdlRXhlY3V0YWJsZShCYXNpY0Jsb2NrICpTb3VyY2UsIEJhc2ljQmxvY2sgKkRlc3QpOworCisgIC8vLyBnZXRGZWFzaWJsZVN1Y2Nlc3NvcnMgLSBSZXR1cm4gYSB2ZWN0b3Igb2YgYm9vbGVhbnMgdG8gaW5kaWNhdGUgd2hpY2gKKyAgLy8vIHN1Y2Nlc3NvcnMgYXJlIHJlYWNoYWJsZSBmcm9tIGEgZ2l2ZW4gdGVybWluYXRvciBpbnN0cnVjdGlvbi4KKyAgdm9pZCBnZXRGZWFzaWJsZVN1Y2Nlc3NvcnMoVGVybWluYXRvckluc3QgJlRJLCBTbWFsbFZlY3RvckltcGw8Ym9vbD4gJlN1Y2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFnZ3Jlc3NpdmVVbmRlZik7CisKKyAgdm9pZCB2aXNpdEluc3QoSW5zdHJ1Y3Rpb24gJkkpOworICB2b2lkIHZpc2l0UEhJTm9kZShQSElOb2RlICZJKTsKKyAgdm9pZCB2aXNpdFRlcm1pbmF0b3JJbnN0KFRlcm1pbmF0b3JJbnN0ICZUSSk7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICBBYnN0cmFjdExhdHRpY2VGdW5jdGlvbiBJbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPGNsYXNzIExhdHRpY2VLZXksIGNsYXNzIExhdHRpY2VWYWw+Cit2b2lkIEFic3RyYWN0TGF0dGljZUZ1bmN0aW9uPExhdHRpY2VLZXksIExhdHRpY2VWYWw+OjpQcmludExhdHRpY2VWYWwoCisgICAgTGF0dGljZVZhbCBWLCByYXdfb3N0cmVhbSAmT1MpIHsKKyAgaWYgKFYgPT0gVW5kZWZWYWwpCisgICAgT1MgPDwgInVuZGVmaW5lZCI7CisgIGVsc2UgaWYgKFYgPT0gT3ZlcmRlZmluZWRWYWwpCisgICAgT1MgPDwgIm92ZXJkZWZpbmVkIjsKKyAgZWxzZSBpZiAoViA9PSBVbnRyYWNrZWRWYWwpCisgICAgT1MgPDwgInVudHJhY2tlZCI7CisgIGVsc2UKKyAgICBPUyA8PCAidW5rbm93biBsYXR0aWNlIHZhbHVlIjsKK30KKwordGVtcGxhdGUgPGNsYXNzIExhdHRpY2VLZXksIGNsYXNzIExhdHRpY2VWYWw+Cit2b2lkIEFic3RyYWN0TGF0dGljZUZ1bmN0aW9uPExhdHRpY2VLZXksIExhdHRpY2VWYWw+OjpQcmludExhdHRpY2VLZXkoCisgICAgTGF0dGljZUtleSBLZXksIHJhd19vc3RyZWFtICZPUykgeworICBPUyA8PCAidW5rbm93biBsYXR0aWNlIGtleSI7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgU3BhcnNlU29sdmVyIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit0ZW1wbGF0ZSA8Y2xhc3MgTGF0dGljZUtleSwgY2xhc3MgTGF0dGljZVZhbCwgY2xhc3MgS2V5SW5mbz4KK0xhdHRpY2VWYWwKK1NwYXJzZVNvbHZlcjxMYXR0aWNlS2V5LCBMYXR0aWNlVmFsLCBLZXlJbmZvPjo6Z2V0VmFsdWVTdGF0ZShMYXR0aWNlS2V5IEtleSkgeworICBhdXRvIEkgPSBWYWx1ZVN0YXRlLmZpbmQoS2V5KTsKKyAgaWYgKEkgIT0gVmFsdWVTdGF0ZS5lbmQoKSkKKyAgICByZXR1cm4gSS0+c2Vjb25kOyAvLyBDb21tb24gY2FzZSwgaW4gdGhlIG1hcAorCisgIGlmIChMYXR0aWNlRnVuYy0+SXNVbnRyYWNrZWRWYWx1ZShLZXkpKQorICAgIHJldHVybiBMYXR0aWNlRnVuYy0+Z2V0VW50cmFja2VkVmFsKCk7CisgIExhdHRpY2VWYWwgTFYgPSBMYXR0aWNlRnVuYy0+Q29tcHV0ZUxhdHRpY2VWYWwoS2V5KTsKKworICAvLyBJZiB0aGlzIHZhbHVlIGlzIHVudHJhY2tlZCwgZG9uJ3QgYWRkIGl0IHRvIHRoZSBtYXAuCisgIGlmIChMViA9PSBMYXR0aWNlRnVuYy0+Z2V0VW50cmFja2VkVmFsKCkpCisgICAgcmV0dXJuIExWOworICByZXR1cm4gVmFsdWVTdGF0ZVtLZXldID0gTFY7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBMYXR0aWNlS2V5LCBjbGFzcyBMYXR0aWNlVmFsLCBjbGFzcyBLZXlJbmZvPgordm9pZCBTcGFyc2VTb2x2ZXI8TGF0dGljZUtleSwgTGF0dGljZVZhbCwgS2V5SW5mbz46OlVwZGF0ZVN0YXRlKExhdHRpY2VLZXkgS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhdHRpY2VWYWwgTFYpIHsKKyAgYXV0byBJID0gVmFsdWVTdGF0ZS5maW5kKEtleSk7CisgIGlmIChJICE9IFZhbHVlU3RhdGUuZW5kKCkgJiYgSS0+c2Vjb25kID09IExWKQorICAgIHJldHVybjsgLy8gTm8gY2hhbmdlLgorCisgIC8vIFVwZGF0ZSB0aGUgc3RhdGUgb2YgdGhlIGdpdmVuIExhdHRpY2VLZXkgYW5kIGFkZCBpdHMgY29ycmVzcG9uZGluZyBMTFZNCisgIC8vIHZhbHVlIHRvIHRoZSB3b3JrIGxpc3QuCisgIFZhbHVlU3RhdGVbS2V5XSA9IExWOworICBpZiAoVmFsdWUgKlYgPSBLZXlJbmZvOjpnZXRWYWx1ZUZyb21MYXR0aWNlS2V5KEtleSkpCisgICAgVmFsdWVXb3JrTGlzdC5wdXNoX2JhY2soVik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBMYXR0aWNlS2V5LCBjbGFzcyBMYXR0aWNlVmFsLCBjbGFzcyBLZXlJbmZvPgordm9pZCBTcGFyc2VTb2x2ZXI8TGF0dGljZUtleSwgTGF0dGljZVZhbCwgS2V5SW5mbz46Ok1hcmtCbG9ja0V4ZWN1dGFibGUoCisgICAgQmFzaWNCbG9jayAqQkIpIHsKKyAgaWYgKCFCQkV4ZWN1dGFibGUuaW5zZXJ0KEJCKS5zZWNvbmQpCisgICAgcmV0dXJuOworICBERUJVRyhkYmdzKCkgPDwgIk1hcmtpbmcgQmxvY2sgRXhlY3V0YWJsZTogIiA8PCBCQi0+Z2V0TmFtZSgpIDw8ICJcbiIpOworICBCQldvcmtMaXN0LnB1c2hfYmFjayhCQik7IC8vIEFkZCB0aGUgYmxvY2sgdG8gdGhlIHdvcmsgbGlzdCEKK30KKwordGVtcGxhdGUgPGNsYXNzIExhdHRpY2VLZXksIGNsYXNzIExhdHRpY2VWYWwsIGNsYXNzIEtleUluZm8+Cit2b2lkIFNwYXJzZVNvbHZlcjxMYXR0aWNlS2V5LCBMYXR0aWNlVmFsLCBLZXlJbmZvPjo6bWFya0VkZ2VFeGVjdXRhYmxlKAorICAgIEJhc2ljQmxvY2sgKlNvdXJjZSwgQmFzaWNCbG9jayAqRGVzdCkgeworICBpZiAoIUtub3duRmVhc2libGVFZGdlcy5pbnNlcnQoRWRnZShTb3VyY2UsIERlc3QpKS5zZWNvbmQpCisgICAgcmV0dXJuOyAvLyBUaGlzIGVkZ2UgaXMgYWxyZWFkeSBrbm93biB0byBiZSBleGVjdXRhYmxlIQorCisgIERFQlVHKGRiZ3MoKSA8PCAiTWFya2luZyBFZGdlIEV4ZWN1dGFibGU6ICIgPDwgU291cmNlLT5nZXROYW1lKCkgPDwgIiAtPiAiCisgICAgICAgICAgICAgICA8PCBEZXN0LT5nZXROYW1lKCkgPDwgIlxuIik7CisKKyAgaWYgKEJCRXhlY3V0YWJsZS5jb3VudChEZXN0KSkgeworICAgIC8vIFRoZSBkZXN0aW5hdGlvbiBpcyBhbHJlYWR5IGV4ZWN1dGFibGUsIGJ1dCB3ZSBqdXN0IG1hZGUgYW4gZWRnZQorICAgIC8vIGZlYXNpYmxlIHRoYXQgd2Fzbid0IGJlZm9yZS4gIFJldmlzaXQgdGhlIFBISSBub2RlcyBpbiB0aGUgYmxvY2sKKyAgICAvLyBiZWNhdXNlIHRoZXkgaGF2ZSBwb3RlbnRpYWxseSBuZXcgb3BlcmFuZHMuCisgICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gRGVzdC0+YmVnaW4oKTsgaXNhPFBISU5vZGU+KEkpOyArK0kpCisgICAgICB2aXNpdFBISU5vZGUoKmNhc3Q8UEhJTm9kZT4oSSkpOworICB9IGVsc2UgeworICAgIE1hcmtCbG9ja0V4ZWN1dGFibGUoRGVzdCk7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIExhdHRpY2VLZXksIGNsYXNzIExhdHRpY2VWYWwsIGNsYXNzIEtleUluZm8+Cit2b2lkIFNwYXJzZVNvbHZlcjxMYXR0aWNlS2V5LCBMYXR0aWNlVmFsLCBLZXlJbmZvPjo6Z2V0RmVhc2libGVTdWNjZXNzb3JzKAorICAgIFRlcm1pbmF0b3JJbnN0ICZUSSwgU21hbGxWZWN0b3JJbXBsPGJvb2w+ICZTdWNjcywgYm9vbCBBZ2dyZXNzaXZlVW5kZWYpIHsKKyAgU3VjY3MucmVzaXplKFRJLmdldE51bVN1Y2Nlc3NvcnMoKSk7CisgIGlmIChUSS5nZXROdW1TdWNjZXNzb3JzKCkgPT0gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKEJyYW5jaEluc3QgKkJJID0gZHluX2Nhc3Q8QnJhbmNoSW5zdD4oJlRJKSkgeworICAgIGlmIChCSS0+aXNVbmNvbmRpdGlvbmFsKCkpIHsKKyAgICAgIFN1Y2NzWzBdID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBMYXR0aWNlVmFsIEJDVmFsdWU7CisgICAgaWYgKEFnZ3Jlc3NpdmVVbmRlZikKKyAgICAgIEJDVmFsdWUgPQorICAgICAgICAgIGdldFZhbHVlU3RhdGUoS2V5SW5mbzo6Z2V0TGF0dGljZUtleUZyb21WYWx1ZShCSS0+Z2V0Q29uZGl0aW9uKCkpKTsKKyAgICBlbHNlCisgICAgICBCQ1ZhbHVlID0gZ2V0RXhpc3RpbmdWYWx1ZVN0YXRlKAorICAgICAgICAgIEtleUluZm86OmdldExhdHRpY2VLZXlGcm9tVmFsdWUoQkktPmdldENvbmRpdGlvbigpKSk7CisKKyAgICBpZiAoQkNWYWx1ZSA9PSBMYXR0aWNlRnVuYy0+Z2V0T3ZlcmRlZmluZWRWYWwoKSB8fAorICAgICAgICBCQ1ZhbHVlID09IExhdHRpY2VGdW5jLT5nZXRVbnRyYWNrZWRWYWwoKSkgeworICAgICAgLy8gT3ZlcmRlZmluZWQgY29uZGl0aW9uIHZhcmlhYmxlcyBjYW4gYnJhbmNoIGVpdGhlciB3YXkuCisgICAgICBTdWNjc1swXSA9IFN1Y2NzWzFdID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJZiB1bmRlZmluZWQsIG5laXRoZXIgaXMgZmVhc2libGUgeWV0LgorICAgIGlmIChCQ1ZhbHVlID09IExhdHRpY2VGdW5jLT5nZXRVbmRlZlZhbCgpKQorICAgICAgcmV0dXJuOworCisgICAgQ29uc3RhbnQgKkMgPQorICAgICAgICBkeW5fY2FzdF9vcl9udWxsPENvbnN0YW50PihMYXR0aWNlRnVuYy0+R2V0VmFsdWVGcm9tTGF0dGljZVZhbCgKKyAgICAgICAgICAgIEJDVmFsdWUsIEJJLT5nZXRDb25kaXRpb24oKS0+Z2V0VHlwZSgpKSk7CisgICAgaWYgKCFDIHx8ICFpc2E8Q29uc3RhbnRJbnQ+KEMpKSB7CisgICAgICAvLyBOb24tY29uc3RhbnQgdmFsdWVzIGNhbiBnbyBlaXRoZXIgd2F5LgorICAgICAgU3VjY3NbMF0gPSBTdWNjc1sxXSA9IHRydWU7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ29uc3RhbnQgY29uZGl0aW9uIHZhcmlhYmxlcyBtZWFuIHRoZSBicmFuY2ggY2FuIG9ubHkgZ28gYSBzaW5nbGUgd2F5CisgICAgU3VjY3NbQy0+aXNOdWxsVmFsdWUoKV0gPSB0cnVlOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChUSS5pc0V4Y2VwdGlvbmFsKCkpIHsKKyAgICBTdWNjcy5hc3NpZ24oU3VjY3Muc2l6ZSgpLCB0cnVlKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoaXNhPEluZGlyZWN0QnJJbnN0PihUSSkpIHsKKyAgICBTdWNjcy5hc3NpZ24oU3VjY3Muc2l6ZSgpLCB0cnVlKTsKKyAgICByZXR1cm47CisgIH0KKworICBTd2l0Y2hJbnN0ICZTSSA9IGNhc3Q8U3dpdGNoSW5zdD4oVEkpOworICBMYXR0aWNlVmFsIFNDVmFsdWU7CisgIGlmIChBZ2dyZXNzaXZlVW5kZWYpCisgICAgU0NWYWx1ZSA9IGdldFZhbHVlU3RhdGUoS2V5SW5mbzo6Z2V0TGF0dGljZUtleUZyb21WYWx1ZShTSS5nZXRDb25kaXRpb24oKSkpOworICBlbHNlCisgICAgU0NWYWx1ZSA9IGdldEV4aXN0aW5nVmFsdWVTdGF0ZSgKKyAgICAgICAgS2V5SW5mbzo6Z2V0TGF0dGljZUtleUZyb21WYWx1ZShTSS5nZXRDb25kaXRpb24oKSkpOworCisgIGlmIChTQ1ZhbHVlID09IExhdHRpY2VGdW5jLT5nZXRPdmVyZGVmaW5lZFZhbCgpIHx8CisgICAgICBTQ1ZhbHVlID09IExhdHRpY2VGdW5jLT5nZXRVbnRyYWNrZWRWYWwoKSkgeworICAgIC8vIEFsbCBkZXN0aW5hdGlvbnMgYXJlIGV4ZWN1dGFibGUhCisgICAgU3VjY3MuYXNzaWduKFRJLmdldE51bVN1Y2Nlc3NvcnMoKSwgdHJ1ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gSWYgdW5kZWZpbmVkLCBuZWl0aGVyIGlzIGZlYXNpYmxlIHlldC4KKyAgaWYgKFNDVmFsdWUgPT0gTGF0dGljZUZ1bmMtPmdldFVuZGVmVmFsKCkpCisgICAgcmV0dXJuOworCisgIENvbnN0YW50ICpDID0gZHluX2Nhc3Rfb3JfbnVsbDxDb25zdGFudD4oTGF0dGljZUZ1bmMtPkdldFZhbHVlRnJvbUxhdHRpY2VWYWwoCisgICAgICBTQ1ZhbHVlLCBTSS5nZXRDb25kaXRpb24oKS0+Z2V0VHlwZSgpKSk7CisgIGlmICghQyB8fCAhaXNhPENvbnN0YW50SW50PihDKSkgeworICAgIC8vIEFsbCBkZXN0aW5hdGlvbnMgYXJlIGV4ZWN1dGFibGUhCisgICAgU3VjY3MuYXNzaWduKFRJLmdldE51bVN1Y2Nlc3NvcnMoKSwgdHJ1ZSk7CisgICAgcmV0dXJuOworICB9CisgIFN3aXRjaEluc3Q6OkNhc2VIYW5kbGUgQ2FzZSA9ICpTSS5maW5kQ2FzZVZhbHVlKGNhc3Q8Q29uc3RhbnRJbnQ+KEMpKTsKKyAgU3VjY3NbQ2FzZS5nZXRTdWNjZXNzb3JJbmRleCgpXSA9IHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBMYXR0aWNlS2V5LCBjbGFzcyBMYXR0aWNlVmFsLCBjbGFzcyBLZXlJbmZvPgorYm9vbCBTcGFyc2VTb2x2ZXI8TGF0dGljZUtleSwgTGF0dGljZVZhbCwgS2V5SW5mbz46OmlzRWRnZUZlYXNpYmxlKAorICAgIEJhc2ljQmxvY2sgKkZyb20sIEJhc2ljQmxvY2sgKlRvLCBib29sIEFnZ3Jlc3NpdmVVbmRlZikgeworICBTbWFsbFZlY3Rvcjxib29sLCAxNj4gU3VjY0ZlYXNpYmxlOworICBUZXJtaW5hdG9ySW5zdCAqVEkgPSBGcm9tLT5nZXRUZXJtaW5hdG9yKCk7CisgIGdldEZlYXNpYmxlU3VjY2Vzc29ycygqVEksIFN1Y2NGZWFzaWJsZSwgQWdncmVzc2l2ZVVuZGVmKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVEktPmdldE51bVN1Y2Nlc3NvcnMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKFRJLT5nZXRTdWNjZXNzb3IoaSkgPT0gVG8gJiYgU3VjY0ZlYXNpYmxlW2ldKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgTGF0dGljZUtleSwgY2xhc3MgTGF0dGljZVZhbCwgY2xhc3MgS2V5SW5mbz4KK3ZvaWQgU3BhcnNlU29sdmVyPExhdHRpY2VLZXksIExhdHRpY2VWYWwsIEtleUluZm8+Ojp2aXNpdFRlcm1pbmF0b3JJbnN0KAorICAgIFRlcm1pbmF0b3JJbnN0ICZUSSkgeworICBTbWFsbFZlY3Rvcjxib29sLCAxNj4gU3VjY0ZlYXNpYmxlOworICBnZXRGZWFzaWJsZVN1Y2Nlc3NvcnMoVEksIFN1Y2NGZWFzaWJsZSwgdHJ1ZSk7CisKKyAgQmFzaWNCbG9jayAqQkIgPSBUSS5nZXRQYXJlbnQoKTsKKworICAvLyBNYXJrIGFsbCBmZWFzaWJsZSBzdWNjZXNzb3JzIGV4ZWN1dGFibGUuLi4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFN1Y2NGZWFzaWJsZS5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChTdWNjRmVhc2libGVbaV0pCisgICAgICBtYXJrRWRnZUV4ZWN1dGFibGUoQkIsIFRJLmdldFN1Y2Nlc3NvcihpKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBMYXR0aWNlS2V5LCBjbGFzcyBMYXR0aWNlVmFsLCBjbGFzcyBLZXlJbmZvPgordm9pZCBTcGFyc2VTb2x2ZXI8TGF0dGljZUtleSwgTGF0dGljZVZhbCwgS2V5SW5mbz46OnZpc2l0UEhJTm9kZShQSElOb2RlICZQTikgeworICAvLyBUaGUgbGF0dGljZSBmdW5jdGlvbiBtYXkgc3RvcmUgbW9yZSBpbmZvcm1hdGlvbiBvbiBhIFBISU5vZGUgdGhhbiBjb3VsZCBiZQorICAvLyBjb21wdXRlZCBmcm9tIGl0cyBpbmNvbWluZyB2YWx1ZXMuICBGb3IgZXhhbXBsZSwgU1NJIGZvcm0gc3RvcmVzIGl0cyBzaWdtYQorICAvLyBmdW5jdGlvbnMgYXMgUEhJTm9kZXMgd2l0aCBhIHNpbmdsZSBpbmNvbWluZyB2YWx1ZS4KKyAgaWYgKExhdHRpY2VGdW5jLT5Jc1NwZWNpYWxDYXNlZFBISSgmUE4pKSB7CisgICAgRGVuc2VNYXA8TGF0dGljZUtleSwgTGF0dGljZVZhbD4gQ2hhbmdlZFZhbHVlczsKKyAgICBMYXR0aWNlRnVuYy0+Q29tcHV0ZUluc3RydWN0aW9uU3RhdGUoUE4sIENoYW5nZWRWYWx1ZXMsICp0aGlzKTsKKyAgICBmb3IgKGF1dG8gJkNoYW5nZWRWYWx1ZSA6IENoYW5nZWRWYWx1ZXMpCisgICAgICBpZiAoQ2hhbmdlZFZhbHVlLnNlY29uZCAhPSBMYXR0aWNlRnVuYy0+Z2V0VW50cmFja2VkVmFsKCkpCisgICAgICAgIFVwZGF0ZVN0YXRlKENoYW5nZWRWYWx1ZS5maXJzdCwgQ2hhbmdlZFZhbHVlLnNlY29uZCk7CisgICAgcmV0dXJuOworICB9CisKKyAgTGF0dGljZUtleSBLZXkgPSBLZXlJbmZvOjpnZXRMYXR0aWNlS2V5RnJvbVZhbHVlKCZQTik7CisgIExhdHRpY2VWYWwgUE5JViA9IGdldFZhbHVlU3RhdGUoS2V5KTsKKyAgTGF0dGljZVZhbCBPdmVyZGVmaW5lZCA9IExhdHRpY2VGdW5jLT5nZXRPdmVyZGVmaW5lZFZhbCgpOworCisgIC8vIElmIHRoaXMgdmFsdWUgaXMgYWxyZWFkeSBvdmVyZGVmaW5lZCAoY29tbW9uKSBqdXN0IHJldHVybi4KKyAgaWYgKFBOSVYgPT0gT3ZlcmRlZmluZWQgfHwgUE5JViA9PSBMYXR0aWNlRnVuYy0+Z2V0VW50cmFja2VkVmFsKCkpCisgICAgcmV0dXJuOyAvLyBRdWljayBleGl0CisKKyAgLy8gU3VwZXItZXh0cmEtaGlnaC1kZWdyZWUgUEhJIG5vZGVzIGFyZSB1bmxpa2VseSB0byBldmVyIGJlIGludGVyZXN0aW5nLAorICAvLyBhbmQgc2xvdyB1cyBkb3duIGEgbG90LiAgSnVzdCBtYXJrIHRoZW0gb3ZlcmRlZmluZWQuCisgIGlmIChQTi5nZXROdW1JbmNvbWluZ1ZhbHVlcygpID4gNjQpIHsKKyAgICBVcGRhdGVTdGF0ZShLZXksIE92ZXJkZWZpbmVkKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBMb29rIGF0IGFsbCBvZiB0aGUgZXhlY3V0YWJsZSBvcGVyYW5kcyBvZiB0aGUgUEhJIG5vZGUuICBJZiBhbnkgb2YgdGhlbQorICAvLyBhcmUgb3ZlcmRlZmluZWQsIHRoZSBQSEkgYmVjb21lcyBvdmVyZGVmaW5lZCBhcyB3ZWxsLiAgT3RoZXJ3aXNlLCBhc2sgdGhlCisgIC8vIHRyYW5zZmVyIGZ1bmN0aW9uIHRvIGdpdmUgdXMgdGhlIG1lcmdlIG9mIHRoZSBpbmNvbWluZyB2YWx1ZXMuCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBQTi5nZXROdW1JbmNvbWluZ1ZhbHVlcygpOyBpICE9IGU7ICsraSkgeworICAgIC8vIElmIHRoZSBlZGdlIGlzIG5vdCB5ZXQga25vd24gdG8gYmUgZmVhc2libGUsIGl0IGRvZXNuJ3QgaW1wYWN0IHRoZSBQSEkuCisgICAgaWYgKCFpc0VkZ2VGZWFzaWJsZShQTi5nZXRJbmNvbWluZ0Jsb2NrKGkpLCBQTi5nZXRQYXJlbnQoKSwgdHJ1ZSkpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIE1lcmdlIGluIHRoaXMgdmFsdWUuCisgICAgTGF0dGljZVZhbCBPcFZhbCA9CisgICAgICAgIGdldFZhbHVlU3RhdGUoS2V5SW5mbzo6Z2V0TGF0dGljZUtleUZyb21WYWx1ZShQTi5nZXRJbmNvbWluZ1ZhbHVlKGkpKSk7CisgICAgaWYgKE9wVmFsICE9IFBOSVYpCisgICAgICBQTklWID0gTGF0dGljZUZ1bmMtPk1lcmdlVmFsdWVzKFBOSVYsIE9wVmFsKTsKKworICAgIGlmIChQTklWID09IE92ZXJkZWZpbmVkKQorICAgICAgYnJlYWs7IC8vIFJlc3Qgb2YgaW5wdXQgdmFsdWVzIGRvbid0IG1hdHRlci4KKyAgfQorCisgIC8vIFVwZGF0ZSB0aGUgUEhJIHdpdGggdGhlIGNvbXB1dGUgdmFsdWUsIHdoaWNoIGlzIHRoZSBtZXJnZSBvZiB0aGUgaW5wdXRzLgorICBVcGRhdGVTdGF0ZShLZXksIFBOSVYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgTGF0dGljZUtleSwgY2xhc3MgTGF0dGljZVZhbCwgY2xhc3MgS2V5SW5mbz4KK3ZvaWQgU3BhcnNlU29sdmVyPExhdHRpY2VLZXksIExhdHRpY2VWYWwsIEtleUluZm8+Ojp2aXNpdEluc3QoSW5zdHJ1Y3Rpb24gJkkpIHsKKyAgLy8gUEhJcyBhcmUgaGFuZGxlZCBieSB0aGUgcHJvcGFnYXRpb24gbG9naWMsIHRoZXkgYXJlIG5ldmVyIHBhc3NlZCBpbnRvIHRoZQorICAvLyB0cmFuc2ZlciBmdW5jdGlvbnMuCisgIGlmIChQSElOb2RlICpQTiA9IGR5bl9jYXN0PFBISU5vZGU+KCZJKSkKKyAgICByZXR1cm4gdmlzaXRQSElOb2RlKCpQTik7CisKKyAgLy8gT3RoZXJ3aXNlLCBhc2sgdGhlIHRyYW5zZmVyIGZ1bmN0aW9uIHdoYXQgdGhlIHJlc3VsdCBpcy4gIElmIHRoaXMgaXMKKyAgLy8gc29tZXRoaW5nIHRoYXQgd2UgY2FyZSBhYm91dCwgcmVtZW1iZXIgaXQuCisgIERlbnNlTWFwPExhdHRpY2VLZXksIExhdHRpY2VWYWw+IENoYW5nZWRWYWx1ZXM7CisgIExhdHRpY2VGdW5jLT5Db21wdXRlSW5zdHJ1Y3Rpb25TdGF0ZShJLCBDaGFuZ2VkVmFsdWVzLCAqdGhpcyk7CisgIGZvciAoYXV0byAmQ2hhbmdlZFZhbHVlIDogQ2hhbmdlZFZhbHVlcykKKyAgICBpZiAoQ2hhbmdlZFZhbHVlLnNlY29uZCAhPSBMYXR0aWNlRnVuYy0+Z2V0VW50cmFja2VkVmFsKCkpCisgICAgICBVcGRhdGVTdGF0ZShDaGFuZ2VkVmFsdWUuZmlyc3QsIENoYW5nZWRWYWx1ZS5zZWNvbmQpOworCisgIGlmIChUZXJtaW5hdG9ySW5zdCAqVEkgPSBkeW5fY2FzdDxUZXJtaW5hdG9ySW5zdD4oJkkpKQorICAgIHZpc2l0VGVybWluYXRvckluc3QoKlRJKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIExhdHRpY2VLZXksIGNsYXNzIExhdHRpY2VWYWwsIGNsYXNzIEtleUluZm8+Cit2b2lkIFNwYXJzZVNvbHZlcjxMYXR0aWNlS2V5LCBMYXR0aWNlVmFsLCBLZXlJbmZvPjo6U29sdmUoKSB7CisgIC8vIFByb2Nlc3MgdGhlIHdvcmsgbGlzdHMgdW50aWwgdGhleSBhcmUgZW1wdHkhCisgIHdoaWxlICghQkJXb3JrTGlzdC5lbXB0eSgpIHx8ICFWYWx1ZVdvcmtMaXN0LmVtcHR5KCkpIHsKKyAgICAvLyBQcm9jZXNzIHRoZSB2YWx1ZSB3b3JrIGxpc3QuCisgICAgd2hpbGUgKCFWYWx1ZVdvcmtMaXN0LmVtcHR5KCkpIHsKKyAgICAgIFZhbHVlICpWID0gVmFsdWVXb3JrTGlzdC5iYWNrKCk7CisgICAgICBWYWx1ZVdvcmtMaXN0LnBvcF9iYWNrKCk7CisKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXG5Qb3BwZWQgb2ZmIFYtV0w6ICIgPDwgKlYgPDwgIlxuIik7CisKKyAgICAgIC8vICJWIiBnb3QgaW50byB0aGUgd29yayBsaXN0IGJlY2F1c2UgaXQgbWFkZSBhIHRyYW5zaXRpb24uIFNlZSBpZiBhbnkKKyAgICAgIC8vIHVzZXJzIGFyZSBib3RoIGxpdmUgYW5kIGluIG5lZWQgb2YgdXBkYXRpbmcuCisgICAgICBmb3IgKFVzZXIgKlUgOiBWLT51c2VycygpKQorICAgICAgICBpZiAoSW5zdHJ1Y3Rpb24gKkluc3QgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVSkpCisgICAgICAgICAgaWYgKEJCRXhlY3V0YWJsZS5jb3VudChJbnN0LT5nZXRQYXJlbnQoKSkpIC8vIEluc3QgaXMgZXhlY3V0YWJsZT8KKyAgICAgICAgICAgIHZpc2l0SW5zdCgqSW5zdCk7CisgICAgfQorCisgICAgLy8gUHJvY2VzcyB0aGUgYmFzaWMgYmxvY2sgd29yayBsaXN0LgorICAgIHdoaWxlICghQkJXb3JrTGlzdC5lbXB0eSgpKSB7CisgICAgICBCYXNpY0Jsb2NrICpCQiA9IEJCV29ya0xpc3QuYmFjaygpOworICAgICAgQkJXb3JrTGlzdC5wb3BfYmFjaygpOworCisgICAgICBERUJVRyhkYmdzKCkgPDwgIlxuUG9wcGVkIG9mZiBCQldMOiAiIDw8ICpCQik7CisKKyAgICAgIC8vIE5vdGlmeSBhbGwgaW5zdHJ1Y3Rpb25zIGluIHRoaXMgYmFzaWMgYmxvY2sgdGhhdCB0aGV5IGFyZSBuZXdseQorICAgICAgLy8gZXhlY3V0YWJsZS4KKyAgICAgIGZvciAoSW5zdHJ1Y3Rpb24gJkkgOiAqQkIpCisgICAgICAgIHZpc2l0SW5zdChJKTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIExhdHRpY2VLZXksIGNsYXNzIExhdHRpY2VWYWwsIGNsYXNzIEtleUluZm8+Cit2b2lkIFNwYXJzZVNvbHZlcjxMYXR0aWNlS2V5LCBMYXR0aWNlVmFsLCBLZXlJbmZvPjo6UHJpbnQoCisgICAgcmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIGlmIChWYWx1ZVN0YXRlLmVtcHR5KCkpCisgICAgcmV0dXJuOworCisgIExhdHRpY2VLZXkgS2V5OworICBMYXR0aWNlVmFsIExWOworCisgIE9TIDw8ICJWYWx1ZVN0YXRlOlxuIjsKKyAgZm9yIChhdXRvICZFbnRyeSA6IFZhbHVlU3RhdGUpIHsKKyAgICBzdGQ6OnRpZShLZXksIExWKSA9IEVudHJ5OworICAgIGlmIChMViA9PSBMYXR0aWNlRnVuYy0+Z2V0VW50cmFja2VkVmFsKCkpCisgICAgICBjb250aW51ZTsKKyAgICBPUyA8PCAiXHQiOworICAgIExhdHRpY2VGdW5jLT5QcmludExhdHRpY2VWYWwoTFYsIE9TKTsKKyAgICBPUyA8PCAiOiAiOworICAgIExhdHRpY2VGdW5jLT5QcmludExhdHRpY2VLZXkoS2V5LCBPUyk7CisgICAgT1MgPDwgIlxuIjsKKyAgfQorfQorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI3VuZGVmIERFQlVHX1RZUEUKKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfU1BBUlNFUFJPUEFHQVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TeW50aGV0aWNDb3VudHNVdGlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TeW50aGV0aWNDb3VudHNVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZjRhMDEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1N5bnRoZXRpY0NvdW50c1V0aWxzLmgKQEAgLTAsMCArMSw1MiBAQAorLy89PT0tIFN5bnRoZXRpY0NvdW50c1V0aWxzLmggLSB1dGlsaXRpZXMgZm9yIGNvdW50IHByb3BhZ2F0aW9uLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB1dGlsaXRpZXMgZm9yIHN5bnRoZXRpYyBjb3VudHMgcHJvcGFnYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1NZTlRIRVRJQ19DT1VOVFNfVVRJTFNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1NZTlRIRVRJQ19DT1VOVFNfVVRJTFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9DYWxsR3JhcGguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU2NhbGVkTnVtYmVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ2FsbEdyYXBoOworY2xhc3MgRnVuY3Rpb247CisKKy8vLyBDbGFzcyB3aXRoIG1ldGhvZHMgdG8gcHJvcGFnYXRlIHN5bnRoZXRpYyBlbnRyeSBjb3VudHMuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGlzIHRlbXBsYXRlZCBvbiB0aGUgdHlwZSBvZiB0aGUgY2FsbCBncmFwaCBhbmQgZGVzaWduZWQgdG8gd29yaworLy8vIHdpdGggdGhlIHRyYWRpdGlvbmFsIHBlci1tb2R1bGUgY2FsbGdyYXBoIGFuZCB0aGUgc3VtbWFyeSBjYWxsZ3JhcGhzIHVzZWQgaW4KKy8vLyBUaGluTFRPLiBUaGlzIGNvbnRhaW5zIG9ubHkgc3RhdGljIG1ldGhvZHMgYW5kIGFsaWFzIHRlbXBsYXRlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDYWxsR3JhcGhUeXBlPiBjbGFzcyBTeW50aGV0aWNDb3VudHNVdGlscyB7CitwdWJsaWM6CisgIHVzaW5nIFNjYWxlZDY0ID0gU2NhbGVkTnVtYmVyPHVpbnQ2NF90PjsKKyAgdXNpbmcgQ0dUID0gR3JhcGhUcmFpdHM8Q2FsbEdyYXBoVHlwZT47CisgIHVzaW5nIE5vZGVSZWYgPSB0eXBlbmFtZSBDR1Q6Ok5vZGVSZWY7CisgIHVzaW5nIEVkZ2VSZWYgPSB0eXBlbmFtZSBDR1Q6OkVkZ2VSZWY7CisgIHVzaW5nIFNjY1R5ID0gc3RkOjp2ZWN0b3I8Tm9kZVJlZj47CisKKyAgdXNpbmcgR2V0UmVsQkJGcmVxVHkgPSBmdW5jdGlvbl9yZWY8T3B0aW9uYWw8U2NhbGVkNjQ+KEVkZ2VSZWYpPjsKKyAgdXNpbmcgR2V0Q291bnRUeSA9IGZ1bmN0aW9uX3JlZjx1aW50NjRfdChOb2RlUmVmKT47CisgIHVzaW5nIEFkZENvdW50VHkgPSBmdW5jdGlvbl9yZWY8dm9pZChOb2RlUmVmLCB1aW50NjRfdCk+OworCisgIHN0YXRpYyB2b2lkIHByb3BhZ2F0ZShjb25zdCBDYWxsR3JhcGhUeXBlICZDRywgR2V0UmVsQkJGcmVxVHkgR2V0UmVsQkJGcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q291bnRUeSBHZXRDb3VudCwgQWRkQ291bnRUeSBBZGRDb3VudCk7CisKK3ByaXZhdGU6CisgIHN0YXRpYyB2b2lkIHByb3BhZ2F0ZUZyb21TQ0MoY29uc3QgU2NjVHkgJlNDQywgR2V0UmVsQkJGcmVxVHkgR2V0UmVsQkJGcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldENvdW50VHkgR2V0Q291bnQsIEFkZENvdW50VHkgQWRkQ291bnQpOworfTsKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1RhcmdldEZvbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9UYXJnZXRGb2xkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTc1ZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9UYXJnZXRGb2xkZXIuaApAQCAtMCwwICsxLDI2OSBAQAorLy89PT09LSBUYXJnZXRGb2xkZXIuaCAtIENvbnN0YW50IGZvbGRpbmcgaGVscGVyIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgVGFyZ2V0Rm9sZGVyIGNsYXNzLCBhIGhlbHBlciBmb3IgSVJCdWlsZGVyLgorLy8gSXQgcHJvdmlkZXMgSVJCdWlsZGVyIHdpdGggYSBzZXQgb2YgbWV0aG9kcyBmb3IgY3JlYXRpbmcgY29uc3RhbnRzIHdpdGgKKy8vIHRhcmdldCBkZXBlbmRlbnQgZm9sZGluZywgaW4gYWRkaXRpb24gdG8gdGhlIHNhbWUgdGFyZ2V0LWluZGVwZW5kZW50CisvLyBmb2xkaW5nIHRoYXQgdGhlIENvbnN0YW50Rm9sZGVyIGNsYXNzIHByb3ZpZGVzLiAgRm9yIGdlbmVyYWwgY29uc3RhbnQKKy8vIGNyZWF0aW9uIGFuZCBmb2xkaW5nLCB1c2UgQ29uc3RhbnRFeHByIGFuZCB0aGUgcm91dGluZXMgaW4KKy8vIGxsdm0vQW5hbHlzaXMvQ29uc3RhbnRGb2xkaW5nLmguCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1RBUkdFVEZPTERFUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfVEFSR0VURk9MREVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Db25zdGFudEZvbGRpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIERhdGFMYXlvdXQ7CisKKy8vLyBUYXJnZXRGb2xkZXIgLSBDcmVhdGUgY29uc3RhbnRzIHdpdGggdGFyZ2V0IGRlcGVuZGVudCBmb2xkaW5nLgorY2xhc3MgVGFyZ2V0Rm9sZGVyIHsKKyAgY29uc3QgRGF0YUxheW91dCAmREw7CisKKyAgLy8vIEZvbGQgLSBGb2xkIHRoZSBjb25zdGFudCB1c2luZyB0YXJnZXQgc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgIENvbnN0YW50ICpGb2xkKENvbnN0YW50ICpDKSBjb25zdCB7CisgICAgaWYgKENvbnN0YW50ICpDRiA9IENvbnN0YW50Rm9sZENvbnN0YW50KEMsIERMKSkKKyAgICAgIHJldHVybiBDRjsKKyAgICByZXR1cm4gQzsKKyAgfQorCitwdWJsaWM6CisgIGV4cGxpY2l0IFRhcmdldEZvbGRlcihjb25zdCBEYXRhTGF5b3V0ICZETCkgOiBETChETCkge30KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQmluYXJ5IE9wZXJhdG9ycworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBDb25zdGFudCAqQ3JlYXRlQWRkKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcgPSBmYWxzZSwgYm9vbCBIYXNOU1cgPSBmYWxzZSkgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0QWRkKExIUywgUkhTLCBIYXNOVVcsIEhhc05TVykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVGQWRkKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEZBZGQoTEhTLCBSSFMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlU3ViKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcgPSBmYWxzZSwgYm9vbCBIYXNOU1cgPSBmYWxzZSkgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0U3ViKExIUywgUkhTLCBIYXNOVVcsIEhhc05TVykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVGU3ViKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEZTdWIoTEhTLCBSSFMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlTXVsKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcgPSBmYWxzZSwgYm9vbCBIYXNOU1cgPSBmYWxzZSkgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0TXVsKExIUywgUkhTLCBIYXNOVVcsIEhhc05TVykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVGTXVsKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEZNdWwoTEhTLCBSSFMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlVURpdihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLCBib29sIGlzRXhhY3QgPSBmYWxzZSljb25zdHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldFVEaXYoTEhTLCBSSFMsIGlzRXhhY3QpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlU0RpdihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLCBib29sIGlzRXhhY3QgPSBmYWxzZSljb25zdHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldFNEaXYoTEhTLCBSSFMsIGlzRXhhY3QpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlRkRpdihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRGRGl2KExIUywgUkhTKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZVVSZW0oQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0VVJlbShMSFMsIFJIUykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVTUmVtKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldFNSZW0oTEhTLCBSSFMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlRlJlbShDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRGUmVtKExIUywgUkhTKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZVNobChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldFNobChMSFMsIFJIUywgSGFzTlVXLCBIYXNOU1cpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlTFNocihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLCBib29sIGlzRXhhY3QgPSBmYWxzZSljb25zdHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldExTaHIoTEhTLCBSSFMsIGlzRXhhY3QpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlQVNocihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLCBib29sIGlzRXhhY3QgPSBmYWxzZSljb25zdHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEFTaHIoTEhTLCBSSFMsIGlzRXhhY3QpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlQW5kKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEFuZChMSFMsIFJIUykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVPcihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRPcihMSFMsIFJIUykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVYb3IoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0WG9yKExIUywgUkhTKSk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlQmluT3AoSW5zdHJ1Y3Rpb246OkJpbmFyeU9wcyBPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXQoT3BjLCBMSFMsIFJIUykpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFVuYXJ5IE9wZXJhdG9ycworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBDb25zdGFudCAqQ3JlYXRlTmVnKENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldE5lZyhDLCBIYXNOVVcsIEhhc05TVykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVGTmVnKENvbnN0YW50ICpDKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRGTmVnKEMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlTm90KENvbnN0YW50ICpDKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXROb3QoQykpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE1lbW9yeSBJbnN0cnVjdGlvbnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgQ29uc3RhbnQgKkNyZWF0ZUdldEVsZW1lbnRQdHIoVHlwZSAqVHksIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDb25zdGFudCAqPiBJZHhMaXN0KSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKFR5LCBDLCBJZHhMaXN0KSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUdldEVsZW1lbnRQdHIoVHlwZSAqVHksIENvbnN0YW50ICpDLCBDb25zdGFudCAqSWR4KSBjb25zdCB7CisgICAgLy8gVGhpcyBmb3JtIG9mIHRoZSBmdW5jdGlvbiBvbmx5IGV4aXN0cyB0byBhdm9pZCBhbWJpZ3VvdXMgb3ZlcmxvYWQKKyAgICAvLyB3YXJuaW5ncyBhYm91dCB3aGV0aGVyIHRvIGNvbnZlcnQgSWR4IHRvIEFycmF5UmVmPENvbnN0YW50ICo+IG9yCisgICAgLy8gQXJyYXlSZWY8VmFsdWUgKj4uCisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKFR5LCBDLCBJZHgpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlR2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IElkeExpc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEdldEVsZW1lbnRQdHIoVHksIEMsIElkeExpc3QpKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVJbkJvdW5kc0dldEVsZW1lbnRQdHIoVHlwZSAqVHksIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENvbnN0YW50ICo+IElkeExpc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0cihUeSwgQywgSWR4TGlzdCkpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVJbkJvdW5kc0dldEVsZW1lbnRQdHIoVHlwZSAqVHksIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpJZHgpIGNvbnN0IHsKKyAgICAvLyBUaGlzIGZvcm0gb2YgdGhlIGZ1bmN0aW9uIG9ubHkgZXhpc3RzIHRvIGF2b2lkIGFtYmlndW91cyBvdmVybG9hZAorICAgIC8vIHdhcm5pbmdzIGFib3V0IHdoZXRoZXIgdG8gY29udmVydCBJZHggdG8gQXJyYXlSZWY8Q29uc3RhbnQgKj4gb3IKKyAgICAvLyBBcnJheVJlZjxWYWx1ZSAqPi4KKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0cihUeSwgQywgSWR4KSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUluQm91bmRzR2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCkgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0SW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5LCBDLCBJZHhMaXN0KSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQ2FzdC9Db252ZXJzaW9uIE9wZXJhdG9ycworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBDb25zdGFudCAqQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6Q2FzdE9wcyBPcCwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIGlmIChDLT5nZXRUeXBlKCkgPT0gRGVzdFR5KQorICAgICAgcmV0dXJuIEM7IC8vIGF2b2lkIGNhbGxpbmcgRm9sZAorICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0Q2FzdChPcCwgQywgRGVzdFR5KSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUludENhc3QoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCkgY29uc3QgeworICAgIGlmIChDLT5nZXRUeXBlKCkgPT0gRGVzdFR5KQorICAgICAgcmV0dXJuIEM7IC8vIGF2b2lkIGNhbGxpbmcgRm9sZAorICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0SW50ZWdlckNhc3QoQywgRGVzdFR5LCBpc1NpZ25lZCkpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVQb2ludGVyQ2FzdChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgaWYgKEMtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gQzsgLy8gYXZvaWQgY2FsbGluZyBGb2xkCisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRQb2ludGVyQ2FzdChDLCBEZXN0VHkpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlRlBDYXN0KENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICBpZiAoQy0+Z2V0VHlwZSgpID09IERlc3RUeSkKKyAgICAgIHJldHVybiBDOyAvLyBhdm9pZCBjYWxsaW5nIEZvbGQKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEZQQ2FzdChDLCBEZXN0VHkpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlQml0Q2FzdChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgcmV0dXJuIENyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OkJpdENhc3QsIEMsIERlc3RUeSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUludFRvUHRyKENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6SW50VG9QdHIsIEMsIERlc3RUeSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZVB0clRvSW50KENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6UHRyVG9JbnQsIEMsIERlc3RUeSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZVpFeHRPckJpdENhc3QoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIGlmIChDLT5nZXRUeXBlKCkgPT0gRGVzdFR5KQorICAgICAgcmV0dXJuIEM7IC8vIGF2b2lkIGNhbGxpbmcgRm9sZAorICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0WkV4dE9yQml0Q2FzdChDLCBEZXN0VHkpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlU0V4dE9yQml0Q2FzdChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgaWYgKEMtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gQzsgLy8gYXZvaWQgY2FsbGluZyBGb2xkCisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRTRXh0T3JCaXRDYXN0KEMsIERlc3RUeSkpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVUcnVuY09yQml0Q2FzdChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgaWYgKEMtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gQzsgLy8gYXZvaWQgY2FsbGluZyBGb2xkCisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRUcnVuY09yQml0Q2FzdChDLCBEZXN0VHkpKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVQb2ludGVyQml0Q2FzdE9yQWRkclNwYWNlQ2FzdChDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIGlmIChDLT5nZXRUeXBlKCkgPT0gRGVzdFR5KQorICAgICAgcmV0dXJuIEM7IC8vIGF2b2lkIGNhbGxpbmcgRm9sZAorICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0UG9pbnRlckJpdENhc3RPckFkZHJTcGFjZUNhc3QoQywgRGVzdFR5KSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQ29tcGFyZSBJbnN0cnVjdGlvbnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgQ29uc3RhbnQgKkNyZWF0ZUlDbXAoQ21wSW5zdDo6UHJlZGljYXRlIFAsIENvbnN0YW50ICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldENvbXBhcmUoUCwgTEhTLCBSSFMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlRkNtcChDbXBJbnN0OjpQcmVkaWNhdGUgUCwgQ29uc3RhbnQgKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0Q29tcGFyZShQLCBMSFMsIFJIUykpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE90aGVyIEluc3RydWN0aW9ucworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBDb25zdGFudCAqQ3JlYXRlU2VsZWN0KENvbnN0YW50ICpDLCBDb25zdGFudCAqVHJ1ZSwgQ29uc3RhbnQgKkZhbHNlKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRTZWxlY3QoQywgVHJ1ZSwgRmFsc2UpKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVFeHRyYWN0RWxlbWVudChDb25zdGFudCAqVmVjLCBDb25zdGFudCAqSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRFeHRyYWN0RWxlbWVudChWZWMsIElkeCkpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUluc2VydEVsZW1lbnQoQ29uc3RhbnQgKlZlYywgQ29uc3RhbnQgKk5ld0VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKklkeCkgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0SW5zZXJ0RWxlbWVudChWZWMsIE5ld0VsdCwgSWR4KSk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlU2h1ZmZsZVZlY3RvcihDb25zdGFudCAqVjEsIENvbnN0YW50ICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKk1hc2spIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldFNodWZmbGVWZWN0b3IoVjEsIFYyLCBNYXNrKSk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlRXh0cmFjdFZhbHVlKENvbnN0YW50ICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IElkeExpc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEV4dHJhY3RWYWx1ZShBZ2csIElkeExpc3QpKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVJbnNlcnRWYWx1ZShDb25zdGFudCAqQWdnLCBDb25zdGFudCAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IElkeExpc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEluc2VydFZhbHVlKEFnZywgVmFsLCBJZHhMaXN0KSk7CisgIH0KK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1RhcmdldExpYnJhcnlJbmZvLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVGFyZ2V0TGlicmFyeUluZm8uZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NjFlZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1RhcmdldExpYnJhcnlJbmZvLmRlZgpAQCAtMCwwICsxLDEyNjQgQEAKKy8vPT09LS0gVGFyZ2V0TGlicmFyeUluZm8uZGVmIC0gTGlicmFyeSBpbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFRoaXMgLmRlZiBmaWxlIHdpbGwgZWl0aGVyIGZpbGwgaW4gdGhlIGVudW0gZGVmaW5pdGlvbiBvciBmaWxsIGluIHRoZQorLy8gc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFycmF5IGRlZmluaXRpb24gZm9yIFRhcmdldExpYnJhcnlJbmZvLgorLy8gV2hpY2ggaXMgZGVmaW5lZCBkZXBlbmRzIG9uIHdoZXRoZXIgVExJX0RFRklORV9FTlVNIGlzIGRlZmluZWQgb3IKKy8vIFRMSV9ERUZJTkVfU1RSSU5HIGlzIGRlZmluZWQuIE9ubHkgb25lIHNob3VsZCBiZSBkZWZpbmVkIGF0IGEgdGltZS4KKworI2lmICEoZGVmaW5lZChUTElfREVGSU5FX0VOVU0pIHx8IGRlZmluZWQoVExJX0RFRklORV9TVFJJTkcpKQorI2Vycm9yICJNdXN0IGRlZmluZSBUTElfREVGSU5FX0VOVU0gb3IgVExJX0RFRklORV9TVFJJTkcgZm9yIFRMSSAuZGVmLiIKKyNlbGlmIGRlZmluZWQoVExJX0RFRklORV9FTlVNKSAmJiBkZWZpbmVkKFRMSV9ERUZJTkVfU1RSSU5HKQorI2Vycm9yICJDYW4gb25seSBkZWZpbmUgb25lIG9mIFRMSV9ERUZJTkVfRU5VTSBvciBUTElfREVGSU5FX1NUUklORyBhdCBhIHRpbWUuIgorI2Vsc2UKKy8vIE9uZSBvZiBUTElfREVGSU5FX0VOVU0vU1RSSU5HIGFyZSBkZWZpbmVkLgorCisjaWYgZGVmaW5lZChUTElfREVGSU5FX0VOVU0pCisjZGVmaW5lIFRMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChlbnVtX3ZhcmlhbnQpIExpYkZ1bmNfIyNlbnVtX3ZhcmlhbnQsCisjZGVmaW5lIFRMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKHN0cmluZ19yZXByKQorI2Vsc2UKKyNkZWZpbmUgVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGVudW1fdmFyaWFudCkKKyNkZWZpbmUgVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoc3RyaW5nX3JlcHIpIHN0cmluZ19yZXByLAorI2VuZGlmCisKKy8vLyB2b2lkICpuZXcodW5zaWduZWQgaW50KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX25ld19pbnQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiPz8yQFlBUEFYSUBaIikKKworLy8vIHZvaWQgKm5ldyh1bnNpZ25lZCBpbnQsIG5vdGhyb3cpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1zdmNfbmV3X2ludF9ub3Rocm93KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIj8/MkBZQVBBWElBQlVub3Rocm93X3RAc3RkQEBAWiIpCisKKy8vLyB2b2lkICpuZXcodW5zaWduZWQgbG9uZyBsb25nKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX25ld19sb25nbG9uZykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCI/PzJAWUFQRUFYX0tAWiIpCisKKy8vLyB2b2lkICpuZXcodW5zaWduZWQgbG9uZyBsb25nLCBub3Rocm93KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX25ld19sb25nbG9uZ19ub3Rocm93KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIj8/MkBZQVBFQVhfS0FFQlVub3Rocm93X3RAc3RkQEBAWiIpCisKKy8vLyB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobXN2Y19kZWxldGVfcHRyMzIpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiPz8zQFlBWFBBWEBaIikKKworLy8vIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCBub3Rocm93KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX2RlbGV0ZV9wdHIzMl9ub3Rocm93KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIj8/M0BZQVhQQVhBQlVub3Rocm93X3RAc3RkQEBAWiIpCisKKy8vLyB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgdW5zaWduZWQgaW50KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX2RlbGV0ZV9wdHIzMl9pbnQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiPz8zQFlBWFBBWElAWiIpCisKKy8vLyB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobXN2Y19kZWxldGVfcHRyNjQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiPz8zQFlBWFBFQVhAWiIpCisKKy8vLyB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgbm90aHJvdyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobXN2Y19kZWxldGVfcHRyNjRfbm90aHJvdykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCI/PzNAWUFYUEVBWEFFQlVub3Rocm93X3RAc3RkQEBAWiIpCisKKy8vLyB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgdW5zaWduZWQgbG9uZyBsb25nKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX2RlbGV0ZV9wdHI2NF9sb25nbG9uZykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCI/PzNAWUFYUEVBWF9LQFoiKQorCisvLy8gdm9pZCAqbmV3W10odW5zaWduZWQgaW50KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX25ld19hcnJheV9pbnQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiPz9fVUBZQVBBWElAWiIpCisKKy8vLyB2b2lkICpuZXdbXSh1bnNpZ25lZCBpbnQsIG5vdGhyb3cpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1zdmNfbmV3X2FycmF5X2ludF9ub3Rocm93KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIj8/X1VAWUFQQVhJQUJVbm90aHJvd190QHN0ZEBAQFoiKQorCisvLy8gdm9pZCAqbmV3W10odW5zaWduZWQgbG9uZyBsb25nKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX25ld19hcnJheV9sb25nbG9uZykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCI/P19VQFlBUEVBWF9LQFoiKQorCisvLy8gdm9pZCAqbmV3W10odW5zaWduZWQgbG9uZyBsb25nLCBub3Rocm93KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX25ld19hcnJheV9sb25nbG9uZ19ub3Rocm93KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIj8/X1VAWUFQRUFYX0tBRUJVbm90aHJvd190QHN0ZEBAQFoiKQorCisvLy8gdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkKik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobXN2Y19kZWxldGVfYXJyYXlfcHRyMzIpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiPz9fVkBZQVhQQVhAWiIpCisKKy8vLyB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqLCBub3Rocm93KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX2RlbGV0ZV9hcnJheV9wdHIzMl9ub3Rocm93KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIj8/X1ZAWUFYUEFYQUJVbm90aHJvd190QHN0ZEBAQFoiKQorCisvLy8gdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkKiwgdW5zaWduZWQgaW50KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX2RlbGV0ZV9hcnJheV9wdHIzMl9pbnQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiPz9fVkBZQVhQQVhJQFoiKQorCisvLy8gdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkKik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobXN2Y19kZWxldGVfYXJyYXlfcHRyNjQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiPz9fVkBZQVhQRUFYQFoiKQorCisvLy8gdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkKiwgbm90aHJvdyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobXN2Y19kZWxldGVfYXJyYXlfcHRyNjRfbm90aHJvdykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCI/P19WQFlBWFBFQVhBRUJVbm90aHJvd190QHN0ZEBAQFoiKQorCisvLy8gdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkKiwgdW5zaWduZWQgbG9uZyBsb25nKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX2RlbGV0ZV9hcnJheV9wdHI2NF9sb25nbG9uZykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCI/P19WQFlBWFBFQVhfS0BaIikKKworLy8vIGludCBfSU9fZ2V0YyhfSU9fRklMRSAqIF9fZnApOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHVuZGVyX0lPX2dldGMpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX0lPX2dldGMiKQorLy8vIGludCBfSU9fcHV0YyhpbnQgX19jLCBfSU9fRklMRSAqIF9fZnApOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHVuZGVyX0lPX3B1dGMpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX0lPX3B1dGMiKQorLy8vIHZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCopOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKFpkYVB2KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9aZGFQdiIpCisvLy8gdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkKiwgbm90aHJvdyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoWmRhUHZSS1N0OW5vdGhyb3dfdCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfWmRhUHZSS1N0OW5vdGhyb3dfdCIpCisvLy8gdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkKiwgdW5zaWduZWQgaW50KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChaZGFQdmopCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX1pkYVB2aiIpCisvLy8gdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkKiwgdW5zaWduZWQgbG9uZyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoWmRhUHZtKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9aZGFQdm0iKQorLy8vIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChaZGxQdikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfWmRsUHYiKQorLy8vIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCBub3Rocm93KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChaZGxQdlJLU3Q5bm90aHJvd190KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9aZGxQdlJLU3Q5bm90aHJvd190IikKKy8vLyB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgdW5zaWduZWQgaW50KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChaZGxQdmopCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX1pkbFB2aiIpCisvLy8gdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIHVuc2lnbmVkIGxvbmcpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKFpkbFB2bSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfWmRsUHZtIikKKy8vLyB2b2lkICpuZXdbXSh1bnNpZ25lZCBpbnQpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKFpuYWopCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX1puYWoiKQorLy8vIHZvaWQgKm5ld1tdKHVuc2lnbmVkIGludCwgbm90aHJvdyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoWm5halJLU3Q5bm90aHJvd190KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9abmFqUktTdDlub3Rocm93X3QiKQorLy8vIHZvaWQgKm5ld1tdKHVuc2lnbmVkIGxvbmcpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKFpuYW0pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX1puYW0iKQorLy8vIHZvaWQgKm5ld1tdKHVuc2lnbmVkIGxvbmcsIG5vdGhyb3cpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKFpuYW1SS1N0OW5vdGhyb3dfdCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfWm5hbVJLU3Q5bm90aHJvd190IikKKy8vLyB2b2lkICpuZXcodW5zaWduZWQgaW50KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChabndqKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9abndqIikKKy8vLyB2b2lkICpuZXcodW5zaWduZWQgaW50LCBub3Rocm93KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChabndqUktTdDlub3Rocm93X3QpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX1pud2pSS1N0OW5vdGhyb3dfdCIpCisvLy8gdm9pZCAqbmV3KHVuc2lnbmVkIGxvbmcpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKFpud20pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX1pud20iKQorLy8vIHZvaWQgKm5ldyh1bnNpZ25lZCBsb25nLCBub3Rocm93KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChabndtUktTdDlub3Rocm93X3QpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX1pud21SS1N0OW5vdGhyb3dfdCIpCisvLy8gZG91YmxlIF9fYWNvc19maW5pdGUoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFjb3NfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fYWNvc19maW5pdGUiKQorLy8vIGZsb2F0IF9fYWNvc2ZfZmluaXRlKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFjb3NmX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2Fjb3NmX2Zpbml0ZSIpCisvLy8gZG91YmxlIF9fYWNvc2hfZmluaXRlKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhY29zaF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19hY29zaF9maW5pdGUiKQorLy8vIGZsb2F0IF9fYWNvc2hmX2Zpbml0ZShmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhY29zaGZfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fYWNvc2hmX2Zpbml0ZSIpCisvLy8gbG9uZyBkb3VibGUgX19hY29zaGxfZmluaXRlKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFjb3NobF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19hY29zaGxfZmluaXRlIikKKy8vLyBsb25nIGRvdWJsZSBfX2Fjb3NsX2Zpbml0ZShsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhY29zbF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19hY29zbF9maW5pdGUiKQorLy8vIGRvdWJsZSBfX2FzaW5fZmluaXRlKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhc2luX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2FzaW5fZmluaXRlIikKKy8vLyBmbG9hdCBfX2FzaW5mX2Zpbml0ZShmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhc2luZl9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19hc2luZl9maW5pdGUiKQorLy8vIGxvbmcgZG91YmxlIF9fYXNpbmxfZmluaXRlKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFzaW5sX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2FzaW5sX2Zpbml0ZSIpCisvLy8gZG91YmxlIGF0YW4yX2Zpbml0ZShkb3VibGUgeSwgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGF0YW4yX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2F0YW4yX2Zpbml0ZSIpCisvLy8gZmxvYXQgYXRhbjJmX2Zpbml0ZShmbG9hdCB5LCBmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhdGFuMmZfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fYXRhbjJmX2Zpbml0ZSIpCisvLy8gbG9uZyBkb3VibGUgYXRhbjJsX2Zpbml0ZShsb25nIGRvdWJsZSB5LCBsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhdGFuMmxfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fYXRhbjJsX2Zpbml0ZSIpCisvLy8gZG91YmxlIF9fYXRhbmhfZmluaXRlKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhdGFuaF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19hdGFuaF9maW5pdGUiKQorLy8vIGZsb2F0IF9fYXRhbmhmX2Zpbml0ZShmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhdGFuaGZfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fYXRhbmhmX2Zpbml0ZSIpCisvLy8gbG9uZyBkb3VibGUgX19hdGFuaGxfZmluaXRlKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGF0YW5obF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19hdGFuaGxfZmluaXRlIikKKy8vLyBkb3VibGUgX19jb3NoX2Zpbml0ZShkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY29zaF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19jb3NoX2Zpbml0ZSIpCisvLy8gZmxvYXQgX19jb3NoZl9maW5pdGUoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY29zaGZfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fY29zaGZfZmluaXRlIikKKy8vLyBsb25nIGRvdWJsZSBfX2Nvc2hsX2Zpbml0ZShsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjb3NobF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19jb3NobF9maW5pdGUiKQorLy8vIGRvdWJsZSBfX2Nvc3BpKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjb3NwaSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2Nvc3BpIikKKy8vLyBmbG9hdCBfX2Nvc3BpZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjb3NwaWYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19jb3NwaWYiKQorLy8vIGludCBfX2N4YV9hdGV4aXQodm9pZCAoKmYpKHZvaWQgKiksIHZvaWQgKnAsIHZvaWQgKmQpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGN4YV9hdGV4aXQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19jeGFfYXRleGl0IikKKy8vLyB2b2lkIF9fY3hhX2d1YXJkX2Fib3J0KGd1YXJkX3QgKmd1YXJkKTsKKy8vLyBndWFyZF90IGlzIGludDY0X3QgaW4gSXRhbml1bSBBQkkgb3IgaW50MzJfdCBvbiBBUk0gZWFiaS4KK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjeGFfZ3VhcmRfYWJvcnQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19jeGFfZ3VhcmRfYWJvcnQiKQorLy8vIGludCBfX2N4YV9ndWFyZF9hY3F1aXJlKGd1YXJkX3QgKmd1YXJkKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjeGFfZ3VhcmRfYWNxdWlyZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2N4YV9ndWFyZF9hY3F1aXJlIikKKy8vLyB2b2lkIF9fY3hhX2d1YXJkX3JlbGVhc2UoZ3VhcmRfdCAqZ3VhcmQpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGN4YV9ndWFyZF9yZWxlYXNlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fY3hhX2d1YXJkX3JlbGVhc2UiKQorLy8vIGRvdWJsZSBfX2V4cDEwX2Zpbml0ZShkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZXhwMTBfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fZXhwMTBfZmluaXRlIikKKy8vLyBmbG9hdCBfX2V4cDEwZl9maW5pdGUoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZXhwMTBmX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2V4cDEwZl9maW5pdGUiKQorLy8vIGxvbmcgZG91YmxlIF9fZXhwMTBsX2Zpbml0ZShsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChleHAxMGxfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fZXhwMTBsX2Zpbml0ZSIpCisvLy8gZG91YmxlIF9fZXhwMl9maW5pdGUoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGV4cDJfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fZXhwMl9maW5pdGUiKQorLy8vIGZsb2F0IF9fZXhwMmZfZmluaXRlKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGV4cDJmX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2V4cDJmX2Zpbml0ZSIpCisvLy8gbG9uZyBkb3VibGUgX19leHAybF9maW5pdGUobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZXhwMmxfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fZXhwMmxfZmluaXRlIikKKy8vLyBkb3VibGUgX19leHBfZmluaXRlKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChleHBfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fZXhwX2Zpbml0ZSIpCisvLy8gZmxvYXQgX19leHBmX2Zpbml0ZShmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChleHBmX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2V4cGZfZmluaXRlIikKKy8vLyBsb25nIGRvdWJsZSBfX2V4cGxfZmluaXRlKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGV4cGxfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fZXhwbF9maW5pdGUiKQorLy8vIGludCBfX2lzb2M5OV9zY2FuZiAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZHVuZGVyX2lzb2M5OV9zY2FuZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2lzb2M5OV9zY2FuZiIpCisvLy8gaW50IF9faXNvYzk5X3NzY2FuZihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChkdW5kZXJfaXNvYzk5X3NzY2FuZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2lzb2M5OV9zc2NhbmYiKQorLy8vIGRvdWJsZSBfX2xvZzEwX2Zpbml0ZShkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobG9nMTBfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fbG9nMTBfZmluaXRlIikKKy8vLyBmbG9hdCBfX2xvZzEwZl9maW5pdGUoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobG9nMTBmX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2xvZzEwZl9maW5pdGUiKQorLy8vIGxvbmcgZG91YmxlIF9fbG9nMTBsX2Zpbml0ZShsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsb2cxMGxfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fbG9nMTBsX2Zpbml0ZSIpCisvLy8gZG91YmxlIF9fbG9nMl9maW5pdGUoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxvZzJfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fbG9nMl9maW5pdGUiKQorLy8vIGZsb2F0IF9fbG9nMmZfZmluaXRlKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxvZzJmX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2xvZzJmX2Zpbml0ZSIpCisvLy8gbG9uZyBkb3VibGUgX19sb2cybF9maW5pdGUobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobG9nMmxfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fbG9nMmxfZmluaXRlIikKKy8vLyBkb3VibGUgX19sb2dfZmluaXRlKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsb2dfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fbG9nX2Zpbml0ZSIpCisvLy8gZmxvYXQgX19sb2dmX2Zpbml0ZShmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsb2dmX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2xvZ2ZfZmluaXRlIikKKy8vLyBsb25nIGRvdWJsZSBfX2xvZ2xfZmluaXRlKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxvZ2xfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fbG9nbF9maW5pdGUiKQorLy8vIHZvaWQgKl9fbWVtY3B5X2Noayh2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBuLCBzaXplX3QgczFzaXplKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtZW1jcHlfY2hrKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fbWVtY3B5X2NoayIpCisvLy8gdm9pZCAqX19tZW1tb3ZlX2Noayh2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBuLCBzaXplX3QgczFzaXplKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtZW1tb3ZlX2NoaykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX21lbW1vdmVfY2hrIikKKy8vLyB2b2lkICpfX21lbXNldF9jaGsodm9pZCAqcywgY2hhciB2LCBzaXplX3Qgbiwgc2l6ZV90IHMxc2l6ZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobWVtc2V0X2NoaykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX21lbXNldF9jaGsiKQorCisvLyBpbnQgX19udnZtX3JlZmxlY3QoY29uc3QgY2hhciAqKQorVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG52dm1fcmVmbGVjdCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX252dm1fcmVmbGVjdCIpCisvLy8gZG91YmxlIF9fcG93X2Zpbml0ZShkb3VibGUgeCwgZG91YmxlIHkpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHBvd19maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19wb3dfZmluaXRlIikKKy8vLyBmbG9hdCBfcG93Zl9maW5pdGUoZmxvYXQgeCwgZmxvYXQgeSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocG93Zl9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19wb3dmX2Zpbml0ZSIpCisvLy8gbG9uZyBkb3VibGUgX19wb3dsX2Zpbml0ZShsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChwb3dsX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX3Bvd2xfZmluaXRlIikKKy8vLyBkb3VibGUgX19zaW5jb3NwaV9zdHJldChkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc2luY29zcGlfc3RyZXQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19zaW5jb3NwaV9zdHJldCIpCisvLy8gZmxvYXQgX19zaW5jb3NwaWZfc3RyZXQoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc2luY29zcGlmX3N0cmV0KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fc2luY29zcGlmX3N0cmV0IikKKy8vLyBkb3VibGUgX19zaW5oX2Zpbml0ZShkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc2luaF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19zaW5oX2Zpbml0ZSIpCisvLy8gZmxvYXQgX3NpbmhmX2Zpbml0ZShmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzaW5oZl9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19zaW5oZl9maW5pdGUiKQorLy8vIGxvbmcgZG91YmxlIF9fc2luaGxfZmluaXRlKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNpbmhsX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX3NpbmhsX2Zpbml0ZSIpCisvLy8gZG91YmxlIF9fc2lucGkoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNpbnBpKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fc2lucGkiKQorLy8vIGZsb2F0IF9fc2lucGlmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNpbnBpZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX3NpbnBpZiIpCisvLy8gZG91YmxlIF9fc3FydF9maW5pdGUoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNxcnRfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fc3FydF9maW5pdGUiKQorLy8vIGZsb2F0IF9fc3FydF9maW5pdGUoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3FydGZfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fc3FydGZfZmluaXRlIikKKy8vLyBsb25nIGRvdWJsZSBfX3NxcnRfZmluaXRlKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNxcnRsX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX3NxcnRsX2Zpbml0ZSIpCisvLy8gY2hhciAqX19zdHBjcHlfY2hrKGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IHMxc2l6ZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RwY3B5X2NoaykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX3N0cGNweV9jaGsiKQorLy8vIGNoYXIgKl9fc3RwbmNweV9jaGsoY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3Qgbiwgc2l6ZV90IHMxc2l6ZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RwbmNweV9jaGspCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19zdHBuY3B5X2NoayIpCisvLy8gY2hhciAqX19zdHJjcHlfY2hrKGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IHMxc2l6ZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RyY3B5X2NoaykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX3N0cmNweV9jaGsiKQorLy8vIGNoYXIgKiBfX3N0cmR1cChjb25zdCBjaGFyICpzKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChkdW5kZXJfc3RyZHVwKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fc3RyZHVwIikKKy8vLyBjaGFyICpfX3N0cm5jcHlfY2hrKGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG4sIHNpemVfdCBzMXNpemUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cm5jcHlfY2hrKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fc3RybmNweV9jaGsiKQorLy8vIGNoYXIgKl9fc3RybmR1cChjb25zdCBjaGFyICpzLCBzaXplX3Qgbik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZHVuZGVyX3N0cm5kdXApCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19zdHJuZHVwIikKKy8vLyBjaGFyICogX19zdHJ0b2tfcihjaGFyICpzLCBjb25zdCBjaGFyICpkZWxpbSwgY2hhciAqKnNhdmVfcHRyKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChkdW5kZXJfc3RydG9rX3IpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19zdHJ0b2tfciIpCisvLy8gaW50IGFicyhpbnQgaik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYWJzKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImFicyIpCisvLy8gaW50IGFjY2Vzcyhjb25zdCBjaGFyICpwYXRoLCBpbnQgYW1vZGUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFjY2VzcykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhY2Nlc3MiKQorLy8vIGRvdWJsZSBhY29zKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhY29zKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImFjb3MiKQorLy8vIGZsb2F0IGFjb3NmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFjb3NmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImFjb3NmIikKKy8vLyBkb3VibGUgYWNvc2goZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFjb3NoKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImFjb3NoIikKKy8vLyBmbG9hdCBhY29zaGYoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYWNvc2hmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImFjb3NoZiIpCisvLy8gbG9uZyBkb3VibGUgYWNvc2hsKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFjb3NobCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhY29zaGwiKQorLy8vIGxvbmcgZG91YmxlIGFjb3NsKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFjb3NsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImFjb3NsIikKKy8vLyBkb3VibGUgYXNpbihkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYXNpbikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhc2luIikKKy8vLyBmbG9hdCBhc2luZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhc2luZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhc2luZiIpCisvLy8gZG91YmxlIGFzaW5oKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhc2luaCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhc2luaCIpCisvLy8gZmxvYXQgYXNpbmhmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFzaW5oZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhc2luaGYiKQorLy8vIGxvbmcgZG91YmxlIGFzaW5obChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhc2luaGwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYXNpbmhsIikKKy8vLyBsb25nIGRvdWJsZSBhc2lubChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhc2lubCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhc2lubCIpCisvLy8gZG91YmxlIGF0YW4oZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGF0YW4pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYXRhbiIpCisvLy8gZG91YmxlIGF0YW4yKGRvdWJsZSB5LCBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYXRhbjIpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYXRhbjIiKQorLy8vIGZsb2F0IGF0YW4yZihmbG9hdCB5LCBmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhdGFuMmYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYXRhbjJmIikKKy8vLyBsb25nIGRvdWJsZSBhdGFuMmwobG9uZyBkb3VibGUgeSwgbG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYXRhbjJsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImF0YW4ybCIpCisvLy8gZmxvYXQgYXRhbmYoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYXRhbmYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYXRhbmYiKQorLy8vIGRvdWJsZSBhdGFuaChkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYXRhbmgpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYXRhbmgiKQorLy8vIGZsb2F0IGF0YW5oZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhdGFuaGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYXRhbmhmIikKKy8vLyBsb25nIGRvdWJsZSBhdGFuaGwobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYXRhbmhsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImF0YW5obCIpCisvLy8gbG9uZyBkb3VibGUgYXRhbmwobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYXRhbmwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYXRhbmwiKQorLy8vIGRvdWJsZSBhdG9mKGNvbnN0IGNoYXIgKnN0cik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYXRvZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhdG9mIikKKy8vLyBpbnQgYXRvaShjb25zdCBjaGFyICpzdHIpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGF0b2kpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYXRvaSIpCisvLy8gbG9uZyBhdG9sKGNvbnN0IGNoYXIgKnN0cik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYXRvbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhdG9sIikKKy8vLyBsb25nIGxvbmcgYXRvbGwoY29uc3QgY2hhciAqbnB0cik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYXRvbGwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYXRvbGwiKQorLy8vIGludCBiY21wKGNvbnN0IHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IG4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGJjbXApCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYmNtcCIpCisvLy8gdm9pZCBiY29weShjb25zdCB2b2lkICpzMSwgdm9pZCAqczIsIHNpemVfdCBuKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChiY29weSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJiY29weSIpCisvLy8gdm9pZCBiemVybyh2b2lkICpzLCBzaXplX3Qgbik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYnplcm8pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYnplcm8iKQorLy8vIGRvdWJsZSBjYWJzKGRvdWJsZSBjb21wbGV4IHopCitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY2FicykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjYWJzIikKKy8vLyBmbG9hdCBjYWJzKGZsb2F0IGNvbXBsZXggeikKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjYWJzZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjYWJzZiIpCisvLy8gbG9uZyBkb3VibGUgY2Ficyhsb25nIGRvdWJsZSBjb21wbGV4IHopCitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY2Fic2wpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiY2Fic2wiKQorLy8vIHZvaWQgKmNhbGxvYyhzaXplX3QgY291bnQsIHNpemVfdCBzaXplKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjYWxsb2MpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiY2FsbG9jIikKKy8vLyBkb3VibGUgY2JydChkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY2JydCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjYnJ0IikKKy8vLyBmbG9hdCBjYnJ0ZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjYnJ0ZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjYnJ0ZiIpCisvLy8gbG9uZyBkb3VibGUgY2JydGwobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY2JydGwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiY2JydGwiKQorLy8vIGRvdWJsZSBjZWlsKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjZWlsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImNlaWwiKQorLy8vIGZsb2F0IGNlaWxmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGNlaWxmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImNlaWxmIikKKy8vLyBsb25nIGRvdWJsZSBjZWlsbChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjZWlsbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjZWlsbCIpCisvLy8gaW50IGNobW9kKGNvbnN0IGNoYXIgKnBhdGgsIG1vZGVfdCBtb2RlKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjaG1vZCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjaG1vZCIpCisvLy8gaW50IGNob3duKGNvbnN0IGNoYXIgKnBhdGgsIHVpZF90IG93bmVyLCBnaWRfdCBncm91cCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY2hvd24pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiY2hvd24iKQorLy8vIHZvaWQgY2xlYXJlcnIoRklMRSAqc3RyZWFtKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjbGVhcmVycikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjbGVhcmVyciIpCisvLy8gaW50IGNsb3NlZGlyKERJUiAqZGlycCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY2xvc2VkaXIpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiY2xvc2VkaXIiKQorLy8vIGRvdWJsZSBjb3B5c2lnbihkb3VibGUgeCwgZG91YmxlIHkpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGNvcHlzaWduKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImNvcHlzaWduIikKKy8vLyBmbG9hdCBjb3B5c2lnbmYoZmxvYXQgeCwgZmxvYXQgeSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY29weXNpZ25mKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImNvcHlzaWduZiIpCisvLy8gbG9uZyBkb3VibGUgY29weXNpZ25sKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGNvcHlzaWdubCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjb3B5c2lnbmwiKQorLy8vIGRvdWJsZSBjb3MoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGNvcykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjb3MiKQorLy8vIGZsb2F0IGNvc2YoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY29zZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjb3NmIikKKy8vLyBkb3VibGUgY29zaChkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY29zaCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjb3NoIikKKy8vLyBmbG9hdCBjb3NoZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjb3NoZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjb3NoZiIpCisvLy8gbG9uZyBkb3VibGUgY29zaGwobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY29zaGwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiY29zaGwiKQorLy8vIGxvbmcgZG91YmxlIGNvc2wobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY29zbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjb3NsIikKKy8vLyBjaGFyICpjdGVybWlkKGNoYXIgKnMpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGN0ZXJtaWQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiY3Rlcm1pZCIpCisvLy8gZG91YmxlIGV4cChkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZXhwKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImV4cCIpCisvLy8gZG91YmxlIGV4cDEwKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChleHAxMCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJleHAxMCIpCisvLy8gZmxvYXQgZXhwMTBmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGV4cDEwZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJleHAxMGYiKQorLy8vIGxvbmcgZG91YmxlIGV4cDEwbChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChleHAxMGwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZXhwMTBsIikKKy8vLyBkb3VibGUgZXhwMihkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZXhwMikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJleHAyIikKKy8vLyBmbG9hdCBleHAyZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChleHAyZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJleHAyZiIpCisvLy8gbG9uZyBkb3VibGUgZXhwMmwobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZXhwMmwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZXhwMmwiKQorLy8vIGZsb2F0IGV4cGYoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZXhwZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJleHBmIikKKy8vLyBsb25nIGRvdWJsZSBleHBsKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGV4cGwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZXhwbCIpCisvLy8gZG91YmxlIGV4cG0xKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChleHBtMSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJleHBtMSIpCisvLy8gZmxvYXQgZXhwbTFmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGV4cG0xZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJleHBtMWYiKQorLy8vIGxvbmcgZG91YmxlIGV4cG0xbChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChleHBtMWwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZXhwbTFsIikKKy8vLyBkb3VibGUgZmFicyhkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZmFicykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmYWJzIikKKy8vLyBmbG9hdCBmYWJzZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmYWJzZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmYWJzZiIpCisvLy8gbG9uZyBkb3VibGUgZmFic2wobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZmFic2wpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZmFic2wiKQorLy8vIGludCBmY2xvc2UoRklMRSAqc3RyZWFtKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmY2xvc2UpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZmNsb3NlIikKKy8vLyBGSUxFICpmZG9wZW4oaW50IGZpbGRlcywgY29uc3QgY2hhciAqbW9kZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZmRvcGVuKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZkb3BlbiIpCisvLy8gaW50IGZlb2YoRklMRSAqc3RyZWFtKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmZW9mKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZlb2YiKQorLy8vIGludCBmZXJyb3IoRklMRSAqc3RyZWFtKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmZXJyb3IpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZmVycm9yIikKKy8vLyBpbnQgZmZsdXNoKEZJTEUgKnN0cmVhbSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZmZsdXNoKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZmbHVzaCIpCisvLy8gaW50IGZmcyhpbnQgaSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZmZzKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZmcyIpCisvLy8gaW50IGZmc2wobG9uZyBpbnQgaSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZmZzbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmZnNsIikKKy8vLyBpbnQgZmZzbGwobG9uZyBsb25nIGludCBpKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmZnNsbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmZnNsbCIpCisvLy8gaW50IGZnZXRjKEZJTEUgKnN0cmVhbSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZmdldGMpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZmdldGMiKQorLy8vIGludCBmZ2V0cG9zKEZJTEUgKnN0cmVhbSwgZnBvc190ICpwb3MpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZnZXRwb3MpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZmdldHBvcyIpCisvLy8gY2hhciAqZmdldHMoY2hhciAqcywgaW50IG4sIEZJTEUgKnN0cmVhbSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZmdldHMpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZmdldHMiKQorLy8vIGludCBmaWxlbm8oRklMRSAqc3RyZWFtKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmaWxlbm8pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZmlsZW5vIikKKy8vLyBpbnQgZmlwcmludGYoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZmlwcmludGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZmlwcmludGYiKQorLy8vIHZvaWQgZmxvY2tmaWxlKEZJTEUgKmZpbGUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZsb2NrZmlsZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmbG9ja2ZpbGUiKQorLy8vIGRvdWJsZSBmbG9vcihkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZmxvb3IpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZmxvb3IiKQorLy8vIGZsb2F0IGZsb29yZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmbG9vcmYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZmxvb3JmIikKKy8vLyBsb25nIGRvdWJsZSBmbG9vcmwobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZmxvb3JsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZsb29ybCIpCisvLy8gaW50IGZscyhpbnQgaSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZmxzKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZscyIpCisvLy8gaW50IGZsc2wobG9uZyBpbnQgaSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZmxzbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmbHNsIikKKy8vLyBpbnQgZmxzbGwobG9uZyBsb25nIGludCBpKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmbHNsbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmbHNsbCIpCisvLy8gZG91YmxlIGZtYXgoZG91YmxlIHgsIGRvdWJsZSB5KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmbWF4KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZtYXgiKQorLy8vIGZsb2F0IGZtYXhmKGZsb2F0IHgsIGZsb2F0IHkpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZtYXhmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZtYXhmIikKKy8vLyBsb25nIGRvdWJsZSBmbWF4bChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmbWF4bCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmbWF4bCIpCisvLy8gZG91YmxlIGZtaW4oZG91YmxlIHgsIGRvdWJsZSB5KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmbWluKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZtaW4iKQorLy8vIGZsb2F0IGZtaW5mKGZsb2F0IHgsIGZsb2F0IHkpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZtaW5mKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZtaW5mIikKKy8vLyBsb25nIGRvdWJsZSBmbWlubChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmbWlubCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmbWlubCIpCisvLy8gZG91YmxlIGZtb2QoZG91YmxlIHgsIGRvdWJsZSB5KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmbW9kKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZtb2QiKQorLy8vIGZsb2F0IGZtb2RmKGZsb2F0IHgsIGZsb2F0IHkpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZtb2RmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZtb2RmIikKKy8vLyBsb25nIGRvdWJsZSBmbW9kbChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmbW9kbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmbW9kbCIpCisvLy8gRklMRSAqZm9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm1vZGUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZvcGVuKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZvcGVuIikKKy8vLyBGSUxFICpmb3BlbjY0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpvcGVudHlwZSkKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmb3BlbjY0KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZvcGVuNjQiKQorLy8vIGludCBmcHJpbnRmKEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZwcmludGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZnByaW50ZiIpCisvLy8gaW50IGZwdXRjKGludCBjLCBGSUxFICpzdHJlYW0pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZwdXRjKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZwdXRjIikKKy8vLyBpbnQgZnB1dHMoY29uc3QgY2hhciAqcywgRklMRSAqc3RyZWFtKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmcHV0cykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmcHV0cyIpCisvLy8gc2l6ZV90IGZyZWFkKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIHNpemVfdCBuaXRlbXMsIEZJTEUgKnN0cmVhbSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZnJlYWQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZnJlYWQiKQorLy8vIHZvaWQgZnJlZSh2b2lkICpwdHIpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZyZWUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZnJlZSIpCisvLy8gZG91YmxlIGZyZXhwKGRvdWJsZSBudW0sIGludCAqZXhwKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmcmV4cCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmcmV4cCIpCisvLy8gZmxvYXQgZnJleHBmKGZsb2F0IG51bSwgaW50ICpleHApOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZyZXhwZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmcmV4cGYiKQorLy8vIGxvbmcgZG91YmxlIGZyZXhwbChsb25nIGRvdWJsZSBudW0sIGludCAqZXhwKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmcmV4cGwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZnJleHBsIikKKy8vLyBpbnQgZnNjYW5mKEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4gKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmc2NhbmYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZnNjYW5mIikKKy8vLyBpbnQgZnNlZWsoRklMRSAqc3RyZWFtLCBsb25nIG9mZnNldCwgaW50IHdoZW5jZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZnNlZWspCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZnNlZWsiKQorLy8vIGludCBmc2Vla28oRklMRSAqc3RyZWFtLCBvZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZzZWVrbykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmc2Vla28iKQorLy8vIGludCBmc2Vla282NChGSUxFICpzdHJlYW0sIG9mZjY0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKQorVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZzZWVrbzY0KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZzZWVrbzY0IikKKy8vLyBpbnQgZnNldHBvcyhGSUxFICpzdHJlYW0sIGNvbnN0IGZwb3NfdCAqcG9zKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmc2V0cG9zKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZzZXRwb3MiKQorLy8vIGludCBmc3RhdChpbnQgZmlsZGVzLCBzdHJ1Y3Qgc3RhdCAqYnVmKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmc3RhdCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmc3RhdCIpCisvLy8gaW50IGZzdGF0NjQoaW50IGZpbGVkZXMsIHN0cnVjdCBzdGF0NjQgKmJ1ZikKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmc3RhdDY0KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZzdGF0NjQiKQorLy8vIGludCBmc3RhdHZmcyhpbnQgZmlsZGVzLCBzdHJ1Y3Qgc3RhdHZmcyAqYnVmKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmc3RhdHZmcykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmc3RhdHZmcyIpCisvLy8gaW50IGZzdGF0dmZzNjQoaW50IGZpbGRlcywgc3RydWN0IHN0YXR2ZnM2NCAqYnVmKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmc3RhdHZmczY0KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZzdGF0dmZzNjQiKQorLy8vIGxvbmcgZnRlbGwoRklMRSAqc3RyZWFtKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmdGVsbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmdGVsbCIpCisvLy8gb2ZmX3QgZnRlbGxvKEZJTEUgKnN0cmVhbSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZnRlbGxvKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZ0ZWxsbyIpCisvLy8gb2ZmNjRfdCBmdGVsbG82NChGSUxFICpzdHJlYW0pCitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZnRlbGxvNjQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZnRlbGxvNjQiKQorLy8vIGludCBmdHJ5bG9ja2ZpbGUoRklMRSAqZmlsZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZnRyeWxvY2tmaWxlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZ0cnlsb2NrZmlsZSIpCisvLy8gdm9pZCBmdW5sb2NrZmlsZShGSUxFICpmaWxlKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmdW5sb2NrZmlsZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmdW5sb2NrZmlsZSIpCisvLy8gc2l6ZV90IGZ3cml0ZShjb25zdCB2b2lkICpwdHIsIHNpemVfdCBzaXplLCBzaXplX3Qgbml0ZW1zLCBGSUxFICpzdHJlYW0pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZ3cml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmd3JpdGUiKQorLy8vIGludCBnZXRjKEZJTEUgKnN0cmVhbSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZ2V0YykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJnZXRjIikKKy8vLyBpbnQgZ2V0Y191bmxvY2tlZChGSUxFICpzdHJlYW0pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGdldGNfdW5sb2NrZWQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZ2V0Y191bmxvY2tlZCIpCisvLy8gaW50IGdldGNoYXIodm9pZCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZ2V0Y2hhcikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJnZXRjaGFyIikKKy8vLyBjaGFyICpnZXRlbnYoY29uc3QgY2hhciAqbmFtZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZ2V0ZW52KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImdldGVudiIpCisvLy8gaW50IGdldGl0aW1lcihpbnQgd2hpY2gsIHN0cnVjdCBpdGltZXJ2YWwgKnZhbHVlKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChnZXRpdGltZXIpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZ2V0aXRpbWVyIikKKy8vLyBpbnQgZ2V0bG9naW5fcihjaGFyICpuYW1lLCBzaXplX3QgbmFtZXNpemUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGdldGxvZ2luX3IpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZ2V0bG9naW5fciIpCisvLy8gc3RydWN0IHBhc3N3ZCAqZ2V0cHduYW0oY29uc3QgY2hhciAqbmFtZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZ2V0cHduYW0pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZ2V0cHduYW0iKQorLy8vIGNoYXIgKmdldHMoY2hhciAqcyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZ2V0cykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJnZXRzIikKKy8vLyBpbnQgZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0cCwgdm9pZCAqdHpwKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChnZXR0aW1lb2ZkYXkpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZ2V0dGltZW9mZGF5IikKKy8vLyB1aW50MzJfdCBodG9ubCh1aW50MzJfdCBob3N0bG9uZyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoaHRvbmwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiaHRvbmwiKQorLy8vIHVpbnQxNl90IGh0b25zKHVpbnQxNl90IGhvc3RzaG9ydCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoaHRvbnMpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiaHRvbnMiKQorLy8vIGludCBpcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChpcHJpbnRmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImlwcmludGYiKQorLy8vIGludCBpc2FzY2lpKGludCBjKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChpc2FzY2lpKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImlzYXNjaWkiKQorLy8vIGludCBpc2RpZ2l0KGludCBjKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChpc2RpZ2l0KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImlzZGlnaXQiKQorLy8vIGxvbmcgaW50IGxhYnMobG9uZyBpbnQgaik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobGFicykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsYWJzIikKKy8vLyBpbnQgbGNob3duKGNvbnN0IGNoYXIgKnBhdGgsIHVpZF90IG93bmVyLCBnaWRfdCBncm91cCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobGNob3duKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImxjaG93biIpCisvLy8gZG91YmxlIGxkZXhwKGRvdWJsZSB4LCBpbnQgbik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobGRleHApCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibGRleHAiKQorLy8vIGZsb2F0IGxkZXhwZihmbG9hdCB4LCBpbnQgbik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobGRleHBmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImxkZXhwZiIpCisvLy8gbG9uZyBkb3VibGUgbGRleHBsKGxvbmcgZG91YmxlIHgsIGludCBuKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsZGV4cGwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibGRleHBsIikKKy8vLyBsb25nIGxvbmcgaW50IGxsYWJzKGxvbmcgbG9uZyBpbnQgaik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobGxhYnMpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibGxhYnMiKQorLy8vIGRvdWJsZSBsb2coZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxvZykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsb2ciKQorLy8vIGRvdWJsZSBsb2cxMChkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobG9nMTApCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibG9nMTAiKQorLy8vIGZsb2F0IGxvZzEwZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsb2cxMGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibG9nMTBmIikKKy8vLyBsb25nIGRvdWJsZSBsb2cxMGwobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobG9nMTBsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImxvZzEwbCIpCisvLy8gZG91YmxlIGxvZzFwKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsb2cxcCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsb2cxcCIpCisvLy8gZmxvYXQgbG9nMXBmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxvZzFwZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsb2cxcGYiKQorLy8vIGxvbmcgZG91YmxlIGxvZzFwbChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsb2cxcGwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibG9nMXBsIikKKy8vLyBkb3VibGUgbG9nMihkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobG9nMikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsb2cyIikKKy8vLyBmbG9hdCBsb2cyZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsb2cyZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsb2cyZiIpCisvLy8gZG91YmxlIGxvbmcgZG91YmxlIGxvZzJsKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxvZzJsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImxvZzJsIikKKy8vLyBkb3VibGUgbG9nYihkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobG9nYikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsb2diIikKKy8vLyBmbG9hdCBsb2diZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsb2diZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsb2diZiIpCisvLy8gbG9uZyBkb3VibGUgbG9nYmwobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobG9nYmwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibG9nYmwiKQorLy8vIGZsb2F0IGxvZ2YoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobG9nZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsb2dmIikKKy8vLyBsb25nIGRvdWJsZSBsb2dsKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxvZ2wpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibG9nbCIpCisvLy8gaW50IGxzdGF0KGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0ICpidWYpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxzdGF0KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImxzdGF0IikKKy8vLyBpbnQgbHN0YXQ2NChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhdDY0ICpidWYpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxzdGF0NjQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibHN0YXQ2NCIpCisvLy8gdm9pZCAqbWFsbG9jKHNpemVfdCBzaXplKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtYWxsb2MpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibWFsbG9jIikKKy8vLyB2b2lkICptZW1hbGlnbihzaXplX3QgYm91bmRhcnksIHNpemVfdCBzaXplKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtZW1hbGlnbikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJtZW1hbGlnbiIpCisvLy8gdm9pZCAqbWVtY2NweSh2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIGludCBjLCBzaXplX3Qgbik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobWVtY2NweSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJtZW1jY3B5IikKKy8vLyB2b2lkICptZW1jaHIoY29uc3Qgdm9pZCAqcywgaW50IGMsIHNpemVfdCBuKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtZW1jaHIpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibWVtY2hyIikKKy8vLyBpbnQgbWVtY21wKGNvbnN0IHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IG4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1lbWNtcCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJtZW1jbXAiKQorLy8vIHZvaWQgKm1lbWNweSh2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBuKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtZW1jcHkpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibWVtY3B5IikKKy8vLyB2b2lkICptZW1tb3ZlKHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IG4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1lbW1vdmUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibWVtbW92ZSIpCisvLy8gdm9pZCAqbWVtcGNweSh2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBuKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtZW1wY3B5KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIm1lbXBjcHkiKQorLy8gdm9pZCAqbWVtcmNocihjb25zdCB2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1lbXJjaHIpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibWVtcmNociIpCisvLy8gdm9pZCAqbWVtc2V0KHZvaWQgKmIsIGludCBjLCBzaXplX3QgbGVuKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtZW1zZXQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibWVtc2V0IikKKy8vLyB2b2lkIG1lbXNldF9wYXR0ZXJuMTYodm9pZCAqYiwgY29uc3Qgdm9pZCAqcGF0dGVybjE2LCBzaXplX3QgbGVuKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtZW1zZXRfcGF0dGVybjE2KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIm1lbXNldF9wYXR0ZXJuMTYiKQorLy8vIGludCBta2Rpcihjb25zdCBjaGFyICpwYXRoLCBtb2RlX3QgbW9kZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobWtkaXIpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibWtkaXIiKQorLy8vIHRpbWVfdCBta3RpbWUoc3RydWN0IHRtICp0aW1lcHRyKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChta3RpbWUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibWt0aW1lIikKKy8vLyBkb3VibGUgbW9kZihkb3VibGUgeCwgZG91YmxlICppcHRyKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtb2RmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIm1vZGYiKQorLy8vIGZsb2F0IG1vZGZmKGZsb2F0LCBmbG9hdCAqaXB0cik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobW9kZmYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibW9kZmYiKQorLy8vIGxvbmcgZG91YmxlIG1vZGZsKGxvbmcgZG91YmxlIHZhbHVlLCBsb25nIGRvdWJsZSAqaXB0cik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobW9kZmwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibW9kZmwiKQorCisvLy8gZG91YmxlIG5lYXJieWludChkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobmVhcmJ5aW50KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIm5lYXJieWludCIpCisvLy8gZmxvYXQgbmVhcmJ5aW50ZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChuZWFyYnlpbnRmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIm5lYXJieWludGYiKQorLy8vIGxvbmcgZG91YmxlIG5lYXJieWludGwobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobmVhcmJ5aW50bCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJuZWFyYnlpbnRsIikKKy8vLyB1aW50MzJfdCBudG9obCh1aW50MzJfdCBuZXRsb25nKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChudG9obCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJudG9obCIpCisvLy8gdWludDE2X3QgbnRvaHModWludDE2X3QgbmV0c2hvcnQpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG50b2hzKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIm50b2hzIikKKy8vLyBpbnQgb3Blbihjb25zdCBjaGFyICpwYXRoLCBpbnQgb2ZsYWcsIC4uLiApOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG9wZW4pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgib3BlbiIpCisvLy8gaW50IG9wZW42NChjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzWywgbW9kZV90IG1vZGVdKQorVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG9wZW42NCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJvcGVuNjQiKQorLy8vIERJUiAqb3BlbmRpcihjb25zdCBjaGFyICpkaXJuYW1lKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChvcGVuZGlyKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIm9wZW5kaXIiKQorLy8vIGludCBwY2xvc2UoRklMRSAqc3RyZWFtKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChwY2xvc2UpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicGNsb3NlIikKKy8vLyB2b2lkIHBlcnJvcihjb25zdCBjaGFyICpzKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChwZXJyb3IpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicGVycm9yIikKKy8vLyBGSUxFICpwb3Blbihjb25zdCBjaGFyICpjb21tYW5kLCBjb25zdCBjaGFyICptb2RlKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChwb3BlbikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJwb3BlbiIpCisvLy8gaW50IHBvc2l4X21lbWFsaWduKHZvaWQgKiptZW1wdHIsIHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBzaXplKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChwb3NpeF9tZW1hbGlnbikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJwb3NpeF9tZW1hbGlnbiIpCisvLy8gZG91YmxlIHBvdyhkb3VibGUgeCwgZG91YmxlIHkpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHBvdykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJwb3ciKQorLy8vIGZsb2F0IHBvd2YoZmxvYXQgeCwgZmxvYXQgeSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocG93ZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJwb3dmIikKKy8vLyBsb25nIGRvdWJsZSBwb3dsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHBvd2wpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicG93bCIpCisvLy8gc3NpemVfdCBwcmVhZChpbnQgZmlsZGVzLCB2b2lkICpidWYsIHNpemVfdCBuYnl0ZSwgb2ZmX3Qgb2Zmc2V0KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChwcmVhZCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJwcmVhZCIpCisvLy8gaW50IHByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocHJpbnRmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInByaW50ZiIpCisvLy8gaW50IHB1dGMoaW50IGMsIEZJTEUgKnN0cmVhbSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocHV0YykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJwdXRjIikKKy8vLyBpbnQgcHV0Y2hhcihpbnQgYyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocHV0Y2hhcikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJwdXRjaGFyIikKKy8vLyBpbnQgcHV0cyhjb25zdCBjaGFyICpzKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChwdXRzKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInB1dHMiKQorLy8vIHNzaXplX3QgcHdyaXRlKGludCBmaWxkZXMsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IG5ieXRlLCBvZmZfdCBvZmZzZXQpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHB3cml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJwd3JpdGUiKQorLy8vIHZvaWQgcXNvcnQodm9pZCAqYmFzZSwgc2l6ZV90IG5lbCwgc2l6ZV90IHdpZHRoLAorLy8vICAgICAgICAgICAgaW50ICgqY29tcGFyKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHFzb3J0KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInFzb3J0IikKKy8vLyBzc2l6ZV90IHJlYWQoaW50IGZpbGRlcywgdm9pZCAqYnVmLCBzaXplX3QgbmJ5dGUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHJlYWQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicmVhZCIpCisvLy8gc3NpemVfdCByZWFkbGluayhjb25zdCBjaGFyICpwYXRoLCBjaGFyICpidWYsIHNpemVfdCBidWZzaXplKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChyZWFkbGluaykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJyZWFkbGluayIpCisvLy8gdm9pZCAqcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChyZWFsbG9jKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInJlYWxsb2MiKQorLy8vIHZvaWQgKnJlYWxsb2NmKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHJlYWxsb2NmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInJlYWxsb2NmIikKKy8vLyBjaGFyICpyZWFscGF0aChjb25zdCBjaGFyICpmaWxlX25hbWUsIGNoYXIgKnJlc29sdmVkX25hbWUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHJlYWxwYXRoKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInJlYWxwYXRoIikKKy8vLyBpbnQgcmVtb3ZlKGNvbnN0IGNoYXIgKnBhdGgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHJlbW92ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJyZW1vdmUiKQorLy8vIGludCByZW5hbWUoY29uc3QgY2hhciAqb2xkLCBjb25zdCBjaGFyICpuZXcpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHJlbmFtZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJyZW5hbWUiKQorLy8vIHZvaWQgcmV3aW5kKEZJTEUgKnN0cmVhbSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocmV3aW5kKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInJld2luZCIpCisvLy8gZG91YmxlIHJpbnQoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHJpbnQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicmludCIpCisvLy8gZmxvYXQgcmludGYoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocmludGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicmludGYiKQorLy8vIGxvbmcgZG91YmxlIHJpbnRsKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHJpbnRsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInJpbnRsIikKKy8vLyBpbnQgcm1kaXIoY29uc3QgY2hhciAqcGF0aCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocm1kaXIpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicm1kaXIiKQorLy8vIGRvdWJsZSByb3VuZChkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocm91bmQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicm91bmQiKQorLy8vIGZsb2F0IHJvdW5kZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChyb3VuZGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicm91bmRmIikKKy8vLyBsb25nIGRvdWJsZSByb3VuZGwobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocm91bmRsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInJvdW5kbCIpCisvLy8gaW50IHNjYW5mKGNvbnN0IGNoYXIgKnJlc3RyaWN0IGZvcm1hdCwgLi4uICk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc2NhbmYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic2NhbmYiKQorLy8vIHZvaWQgc2V0YnVmKEZJTEUgKnN0cmVhbSwgY2hhciAqYnVmKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzZXRidWYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic2V0YnVmIikKKy8vLyBpbnQgc2V0aXRpbWVyKGludCB3aGljaCwgY29uc3Qgc3RydWN0IGl0aW1lcnZhbCAqdmFsdWUsCisvLy8gICAgICAgICAgICAgICBzdHJ1Y3QgaXRpbWVydmFsICpvdmFsdWUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNldGl0aW1lcikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzZXRpdGltZXIiKQorLy8vIGludCBzZXR2YnVmKEZJTEUgKnN0cmVhbSwgY2hhciAqYnVmLCBpbnQgdHlwZSwgc2l6ZV90IHNpemUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNldHZidWYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic2V0dmJ1ZiIpCisvLy8gZG91YmxlIHNpbihkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc2luKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInNpbiIpCisvLy8gZmxvYXQgc2luZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzaW5mKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInNpbmYiKQorLy8vIGRvdWJsZSBzaW5oKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzaW5oKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInNpbmgiKQorLy8vIGZsb2F0IHNpbmhmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNpbmhmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInNpbmhmIikKKy8vLyBsb25nIGRvdWJsZSBzaW5obChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzaW5obCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzaW5obCIpCisvLy8gbG9uZyBkb3VibGUgc2lubChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzaW5sKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInNpbmwiKQorLy8vIGludCBzaXByaW50ZihjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzaXByaW50ZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzaXByaW50ZiIpCisvLy8gaW50IHNucHJpbnRmKGNoYXIgKnMsIHNpemVfdCBuLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc25wcmludGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic25wcmludGYiKQorLy8vIGludCBzcHJpbnRmKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNwcmludGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3ByaW50ZiIpCisvLy8gZG91YmxlIHNxcnQoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNxcnQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3FydCIpCisvLy8gZmxvYXQgc3FydGYoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3FydGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3FydGYiKQorLy8vIGxvbmcgZG91YmxlIHNxcnRsKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNxcnRsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInNxcnRsIikKKy8vLyBpbnQgc3NjYW5mKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uICk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3NjYW5mKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInNzY2FuZiIpCisvLy8gaW50IHN0YXQoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0YXQgKmJ1Zik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RhdCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdGF0IikKKy8vLyBpbnQgc3RhdDY0KGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0NjQgKmJ1Zik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RhdDY0KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0YXQ2NCIpCisvLy8gaW50IHN0YXR2ZnMoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0YXR2ZnMgKmJ1Zik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RhdHZmcykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdGF0dmZzIikKKy8vLyBpbnQgc3RhdHZmczY0KGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0dmZzNjQgKmJ1ZikKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdGF0dmZzNjQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RhdHZmczY0IikKKy8vLyBjaGFyICpzdHBjcHkoY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHBjcHkpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RwY3B5IikKKy8vLyBjaGFyICpzdHBuY3B5KGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cG5jcHkpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RwbmNweSIpCisvLy8gaW50IHN0cmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJjYXNlY21wKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0cmNhc2VjbXAiKQorLy8vIGNoYXIgKnN0cmNhdChjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cmNhdCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJjYXQiKQorLy8vIGNoYXIgKnN0cmNocihjb25zdCBjaGFyICpzLCBpbnQgYyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RyY2hyKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0cmNociIpCisvLy8gaW50IHN0cmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cmNtcCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJjbXAiKQorLy8vIGludCBzdHJjb2xsKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RyY29sbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJjb2xsIikKKy8vLyBjaGFyICpzdHJjcHkoY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJjcHkpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RyY3B5IikKKy8vLyBzaXplX3Qgc3RyY3Nwbihjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cmNzcG4pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RyY3NwbiIpCisvLy8gY2hhciAqc3RyZHVwKGNvbnN0IGNoYXIgKnMxKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJkdXApCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RyZHVwIikKKy8vLyBzaXplX3Qgc3RybGVuKGNvbnN0IGNoYXIgKnMpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cmxlbikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJsZW4iKQorLy8vIGludCBzdHJuY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJuY2FzZWNtcCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJuY2FzZWNtcCIpCisvLy8gY2hhciAqc3RybmNhdChjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJuY2F0KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0cm5jYXQiKQorLy8vIGludCBzdHJuY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cm5jbXApCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RybmNtcCIpCisvLy8gY2hhciAqc3RybmNweShjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJuY3B5KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0cm5jcHkiKQorLy8vIGNoYXIgKnN0cm5kdXAoY29uc3QgY2hhciAqczEsIHNpemVfdCBuKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJuZHVwKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0cm5kdXAiKQorLy8vIHNpemVfdCBzdHJubGVuKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBtYXhsZW4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cm5sZW4pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RybmxlbiIpCisvLy8gY2hhciAqc3RycGJyayhjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cnBicmspCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RycGJyayIpCisvLy8gY2hhciAqc3RycmNocihjb25zdCBjaGFyICpzLCBpbnQgYyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RycmNocikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJyY2hyIikKKy8vLyBzaXplX3Qgc3Ryc3BuKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3Ryc3BuKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0cnNwbiIpCisvLy8gY2hhciAqc3Ryc3RyKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3Ryc3RyKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0cnN0ciIpCisvLy8gZG91YmxlIHN0cnRvZChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJ0b2QpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RydG9kIikKKy8vLyBmbG9hdCBzdHJ0b2YoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0cik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RydG9mKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0cnRvZiIpCisvLyBjaGFyICpzdHJ0b2soY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJ0b2spCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RydG9rIikKKy8vIGNoYXIgKnN0cnRva19yKGNoYXIgKnMsIGNvbnN0IGNoYXIgKnNlcCwgY2hhciAqKmxhc3RzKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJ0b2tfcikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJ0b2tfciIpCisvLy8gbG9uZyBpbnQgc3RydG9sKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJ0b2wpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RydG9sIikKKy8vLyBsb25nIGRvdWJsZSBzdHJ0b2xkKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cnRvbGQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RydG9sZCIpCisvLy8gbG9uZyBsb25nIGludCBzdHJ0b2xsKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJ0b2xsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0cnRvbGwiKQorLy8vIHVuc2lnbmVkIGxvbmcgaW50IHN0cnRvdWwoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cnRvdWwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RydG91bCIpCisvLy8gdW5zaWduZWQgbG9uZyBsb25nIGludCBzdHJ0b3VsbChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RydG91bGwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RydG91bGwiKQorLy8vIHNpemVfdCBzdHJ4ZnJtKGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cnhmcm0pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RyeGZybSIpCisvLy8gaW50IHN5c3RlbShjb25zdCBjaGFyICpjb21tYW5kKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzeXN0ZW0pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3lzdGVtIikKKy8vLyBkb3VibGUgdGFuKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTCh0YW4pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidGFuIikKKy8vLyBmbG9hdCB0YW5mKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHRhbmYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidGFuZiIpCisvLy8gZG91YmxlIHRhbmgoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHRhbmgpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidGFuaCIpCisvLy8gZmxvYXQgdGFuaGYoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodGFuaGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidGFuaGYiKQorLy8vIGxvbmcgZG91YmxlIHRhbmhsKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHRhbmhsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInRhbmhsIikKKy8vLyBsb25nIGRvdWJsZSB0YW5sKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHRhbmwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidGFubCIpCisvLy8gY2xvY2tfdCB0aW1lcyhzdHJ1Y3QgdG1zICpidWZmZXIpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHRpbWVzKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInRpbWVzIikKKy8vLyBGSUxFICp0bXBmaWxlKHZvaWQpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHRtcGZpbGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidG1wZmlsZSIpCisvLy8gRklMRSAqdG1wZmlsZTY0KHZvaWQpCitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodG1wZmlsZTY0KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInRtcGZpbGU2NCIpCisvLy8gaW50IHRvYXNjaWkoaW50IGMpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHRvYXNjaWkpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidG9hc2NpaSIpCisvLy8gZG91YmxlIHRydW5jKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTCh0cnVuYykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ0cnVuYyIpCisvLy8gZmxvYXQgdHJ1bmNmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHRydW5jZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ0cnVuY2YiKQorLy8vIGxvbmcgZG91YmxlIHRydW5jbChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTCh0cnVuY2wpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidHJ1bmNsIikKKy8vLyBpbnQgdW5hbWUoc3RydWN0IHV0c25hbWUgKm5hbWUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHVuYW1lKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInVuYW1lIikKKy8vLyBpbnQgdW5nZXRjKGludCBjLCBGSUxFICpzdHJlYW0pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHVuZ2V0YykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ1bmdldGMiKQorLy8vIGludCB1bmxpbmsoY29uc3QgY2hhciAqcGF0aCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodW5saW5rKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInVubGluayIpCisvLy8gaW50IHVuc2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHVuc2V0ZW52KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInVuc2V0ZW52IikKKy8vLyBpbnQgdXRpbWUoY29uc3QgY2hhciAqcGF0aCwgY29uc3Qgc3RydWN0IHV0aW1idWYgKnRpbWVzKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTCh1dGltZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ1dGltZSIpCisvLy8gaW50IHV0aW1lcyhjb25zdCBjaGFyICpwYXRoLCBjb25zdCBzdHJ1Y3QgdGltZXZhbCB0aW1lc1syXSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodXRpbWVzKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInV0aW1lcyIpCisvLy8gdm9pZCAqdmFsbG9jKHNpemVfdCBzaXplKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTCh2YWxsb2MpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidmFsbG9jIikKKy8vLyBpbnQgdmZwcmludGYoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHZmcHJpbnRmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInZmcHJpbnRmIikKKy8vLyBpbnQgdmZzY2FuZihGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmcpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHZmc2NhbmYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidmZzY2FuZiIpCisvLy8gaW50IHZwcmludGYoY29uc3QgY2hhciAqcmVzdHJpY3QgZm9ybWF0LCB2YV9saXN0IGFwKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTCh2cHJpbnRmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInZwcmludGYiKQorLy8vIGludCB2c2NhbmYoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodnNjYW5mKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInZzY2FuZiIpCisvLy8gaW50IHZzbnByaW50ZihjaGFyICpzLCBzaXplX3QgbiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTCh2c25wcmludGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidnNucHJpbnRmIikKKy8vLyBpbnQgdnNwcmludGYoY2hhciAqcywgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTCh2c3ByaW50ZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ2c3ByaW50ZiIpCisvLy8gaW50IHZzc2NhbmYoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodnNzY2FuZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ2c3NjYW5mIikKKy8vLyBzaXplX3Qgd2NzbGVuIChjb25zdCB3Y2hhcl90KiB3Y3MpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHdjc2xlbikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ3Y3NsZW4iKQorLy8vIHNzaXplX3Qgd3JpdGUoaW50IGZpbGRlcywgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbmJ5dGUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHdyaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIndyaXRlIikKKworI3VuZGVmIFRMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTAorI3VuZGVmIFRMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMCisjZW5kaWYgIC8vIE9uZSBvZiBUTElfREVGSU5FX0VOVU0vU1RSSU5HIGFyZSBkZWZpbmVkLgorCisjdW5kZWYgVExJX0RFRklORV9FTlVNCisjdW5kZWYgVExJX0RFRklORV9TVFJJTkcKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVGFyZ2V0TGlicmFyeUluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVGFyZ2V0TGlicmFyeUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ZlODM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9UYXJnZXRMaWJyYXJ5SW5mby5oCkBAIC0wLDAgKzEsMzk0IEBACisvLz09PS0tIFRhcmdldExpYnJhcnlJbmZvLmggLSBMaWJyYXJ5IGluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfVEFSR0VUTElCUkFSWUlORk9fSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1RBUkdFVExJQlJBUllJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorCituYW1lc3BhY2UgbGx2bSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CisKKy8vLyBEZXNjcmliZXMgYSBwb3NzaWJsZSB2ZWN0b3JpemF0aW9uIG9mIGEgZnVuY3Rpb24uCisvLy8gRnVuY3Rpb24gJ1ZlY3RvckZuTmFtZScgaXMgZXF1aXZhbGVudCB0byAnU2NhbGFyRm5OYW1lJyB2ZWN0b3JpemVkCisvLy8gYnkgYSBmYWN0b3IgJ1ZlY3Rvcml6YXRpb25GYWN0b3InLgorc3RydWN0IFZlY0Rlc2MgeworICBTdHJpbmdSZWYgU2NhbGFyRm5OYW1lOworICBTdHJpbmdSZWYgVmVjdG9yRm5OYW1lOworICB1bnNpZ25lZCBWZWN0b3JpemF0aW9uRmFjdG9yOworfTsKKworICBlbnVtIExpYkZ1bmMgeworI2RlZmluZSBUTElfREVGSU5FX0VOVU0KKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1RhcmdldExpYnJhcnlJbmZvLmRlZiIKKworICAgIE51bUxpYkZ1bmNzCisgIH07CisKKy8vLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGFyZ2V0IGxpYnJhcnkgaW5mb3JtYXRpb24uCisvLy8KKy8vLyBUaGlzIGNsYXNzIGNvbnN0cnVjdHMgdGFibGVzIHRoYXQgaG9sZCB0aGUgdGFyZ2V0IGxpYnJhcnkgaW5mb3JtYXRpb24gYW5kCisvLy8gbWFrZSBpdCBhdmFpbGFibGUuIEhvd2V2ZXIsIGl0IGlzIHNvbWV3aGF0IGV4cGVuc2l2ZSB0byBjb21wdXRlIGFuZCBvbmx5CisvLy8gZGVwZW5kcyBvbiB0aGUgdHJpcGxlLiBTbyB1c2VycyB0eXBpY2FsbHkgaW50ZXJhY3Qgd2l0aCB0aGUgXGMKKy8vLyBUYXJnZXRMaWJyYXJ5SW5mbyB3cmFwcGVyIGJlbG93LgorY2xhc3MgVGFyZ2V0TGlicmFyeUluZm9JbXBsIHsKKyAgZnJpZW5kIGNsYXNzIFRhcmdldExpYnJhcnlJbmZvOworCisgIHVuc2lnbmVkIGNoYXIgQXZhaWxhYmxlQXJyYXlbKE51bUxpYkZ1bmNzKzMpLzRdOworICBsbHZtOjpEZW5zZU1hcDx1bnNpZ25lZCwgc3RkOjpzdHJpbmc+IEN1c3RvbU5hbWVzOworICBzdGF0aWMgU3RyaW5nUmVmIGNvbnN0IFN0YW5kYXJkTmFtZXNbTnVtTGliRnVuY3NdOworICBib29sIFNob3VsZEV4dEkzMlBhcmFtLCBTaG91bGRFeHRJMzJSZXR1cm4sIFNob3VsZFNpZ25FeHRJMzJQYXJhbTsKKworICBlbnVtIEF2YWlsYWJpbGl0eVN0YXRlIHsKKyAgICBTdGFuZGFyZE5hbWUgPSAzLCAvLyAobWVtc2V0IHRvIGFsbCBvbmVzKQorICAgIEN1c3RvbU5hbWUgPSAxLAorICAgIFVuYXZhaWxhYmxlID0gMCAgLy8gKG1lbXNldCB0byBhbGwgemVyb3MpCisgIH07CisgIHZvaWQgc2V0U3RhdGUoTGliRnVuYyBGLCBBdmFpbGFiaWxpdHlTdGF0ZSBTdGF0ZSkgeworICAgIEF2YWlsYWJsZUFycmF5W0YvNF0gJj0gfigzIDw8IDIqKEYmMykpOworICAgIEF2YWlsYWJsZUFycmF5W0YvNF0gfD0gU3RhdGUgPDwgMiooRiYzKTsKKyAgfQorICBBdmFpbGFiaWxpdHlTdGF0ZSBnZXRTdGF0ZShMaWJGdW5jIEYpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXZhaWxhYmlsaXR5U3RhdGU+KChBdmFpbGFibGVBcnJheVtGLzRdID4+IDIqKEYmMykpICYgMyk7CisgIH0KKworICAvLy8gVmVjdG9yaXphdGlvbiBkZXNjcmlwdG9ycyAtIHNvcnRlZCBieSBTY2FsYXJGbk5hbWUuCisgIHN0ZDo6dmVjdG9yPFZlY0Rlc2M+IFZlY3RvckRlc2NzOworICAvLy8gU2NhbGFyaXphdGlvbiBkZXNjcmlwdG9ycyAtIHNhbWUgY29udGVudCBhcyBWZWN0b3JEZXNjcyBidXQgc29ydGVkIGJhc2VkCisgIC8vLyBvbiBWZWN0b3JGbk5hbWUgcmF0aGVyIHRoYW4gU2NhbGFyRm5OYW1lLgorICBzdGQ6OnZlY3RvcjxWZWNEZXNjPiBTY2FsYXJEZXNjczsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGZ1bmN0aW9uIHR5cGUgRlR5IGlzIHZhbGlkIGZvciB0aGUgbGlicmFyeSBmdW5jdGlvbgorICAvLy8gRiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpcyBhdmFpbGFibGUuCisgIGJvb2wgaXNWYWxpZFByb3RvRm9yTGliRnVuYyhjb25zdCBGdW5jdGlvblR5cGUgJkZUeSwgTGliRnVuYyBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAqREwpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBMaXN0IG9mIGtub3duIHZlY3Rvci1mdW5jdGlvbnMgbGlicmFyaWVzLgorICAvLy8KKyAgLy8vIFRoZSB2ZWN0b3ItZnVuY3Rpb25zIGxpYnJhcnkgZGVmaW5lcywgd2hpY2ggZnVuY3Rpb25zIGFyZSB2ZWN0b3JpemFibGUKKyAgLy8vIGFuZCB3aXRoIHdoaWNoIGZhY3Rvci4gVGhlIGxpYnJhcnkgY2FuIGJlIHNwZWNpZmllZCBieSBlaXRoZXIgZnJvbnRlbmQsCisgIC8vLyBvciBhIGNvbW1hbmRsaW5lIG9wdGlvbiwgYW5kIHRoZW4gdXNlZCBieQorICAvLy8gYWRkVmVjdG9yaXphYmxlRnVuY3Rpb25zRnJvbVZlY0xpYiBmb3IgZmlsbGluZyB1cCB0aGUgdGFibGVzIG9mCisgIC8vLyB2ZWN0b3JpemFibGUgZnVuY3Rpb25zLgorICBlbnVtIFZlY3RvckxpYnJhcnkgeworICAgIE5vTGlicmFyeSwgIC8vIERvbid0IHVzZSBhbnkgdmVjdG9yIGxpYnJhcnkuCisgICAgQWNjZWxlcmF0ZSwgLy8gVXNlIEFjY2VsZXJhdGUgZnJhbWV3b3JrLgorICAgIFNWTUwgICAgICAgIC8vIEludGVsIHNob3J0IHZlY3RvciBtYXRoIGxpYnJhcnkuCisgIH07CisKKyAgVGFyZ2V0TGlicmFyeUluZm9JbXBsKCk7CisgIGV4cGxpY2l0IFRhcmdldExpYnJhcnlJbmZvSW1wbChjb25zdCBUcmlwbGUgJlQpOworCisgIC8vIFByb3ZpZGUgdmFsdWUgc2VtYW50aWNzLgorICBUYXJnZXRMaWJyYXJ5SW5mb0ltcGwoY29uc3QgVGFyZ2V0TGlicmFyeUluZm9JbXBsICZUTEkpOworICBUYXJnZXRMaWJyYXJ5SW5mb0ltcGwoVGFyZ2V0TGlicmFyeUluZm9JbXBsICYmVExJKTsKKyAgVGFyZ2V0TGlicmFyeUluZm9JbXBsICZvcGVyYXRvcj0oY29uc3QgVGFyZ2V0TGlicmFyeUluZm9JbXBsICZUTEkpOworICBUYXJnZXRMaWJyYXJ5SW5mb0ltcGwgJm9wZXJhdG9yPShUYXJnZXRMaWJyYXJ5SW5mb0ltcGwgJiZUTEkpOworCisgIC8vLyBTZWFyY2hlcyBmb3IgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIG5hbWUuCisgIC8vLworICAvLy8gSWYgaXQgaXMgb25lIG9mIHRoZSBrbm93biBsaWJyYXJ5IGZ1bmN0aW9ucywgcmV0dXJuIHRydWUgYW5kIHNldCBGIHRvIHRoZQorICAvLy8gY29ycmVzcG9uZGluZyB2YWx1ZS4KKyAgYm9vbCBnZXRMaWJGdW5jKFN0cmluZ1JlZiBmdW5jTmFtZSwgTGliRnVuYyAmRikgY29uc3Q7CisKKyAgLy8vIFNlYXJjaGVzIGZvciBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gbmFtZSwgYWxzbyBjaGVja2luZyB0aGF0IGl0cyB0eXBlIGlzCisgIC8vLyB2YWxpZCBmb3IgdGhlIGxpYnJhcnkgZnVuY3Rpb24gbWF0Y2hpbmcgdGhhdCBuYW1lLgorICAvLy8KKyAgLy8vIElmIGl0IGlzIG9uZSBvZiB0aGUga25vd24gbGlicmFyeSBmdW5jdGlvbnMsIHJldHVybiB0cnVlIGFuZCBzZXQgRiB0byB0aGUKKyAgLy8vIGNvcnJlc3BvbmRpbmcgdmFsdWUuCisgIGJvb2wgZ2V0TGliRnVuYyhjb25zdCBGdW5jdGlvbiAmRkRlY2wsIExpYkZ1bmMgJkYpIGNvbnN0OworCisgIC8vLyBGb3JjZXMgYSBmdW5jdGlvbiB0byBiZSBtYXJrZWQgYXMgdW5hdmFpbGFibGUuCisgIHZvaWQgc2V0VW5hdmFpbGFibGUoTGliRnVuYyBGKSB7CisgICAgc2V0U3RhdGUoRiwgVW5hdmFpbGFibGUpOworICB9CisKKyAgLy8vIEZvcmNlcyBhIGZ1bmN0aW9uIHRvIGJlIG1hcmtlZCBhcyBhdmFpbGFibGUuCisgIHZvaWQgc2V0QXZhaWxhYmxlKExpYkZ1bmMgRikgeworICAgIHNldFN0YXRlKEYsIFN0YW5kYXJkTmFtZSk7CisgIH0KKworICAvLy8gRm9yY2VzIGEgZnVuY3Rpb24gdG8gYmUgbWFya2VkIGFzIGF2YWlsYWJsZSBhbmQgcHJvdmlkZSBhbiBhbHRlcm5hdGUgbmFtZQorICAvLy8gdGhhdCBtdXN0IGJlIHVzZWQuCisgIHZvaWQgc2V0QXZhaWxhYmxlV2l0aE5hbWUoTGliRnVuYyBGLCBTdHJpbmdSZWYgTmFtZSkgeworICAgIGlmIChTdGFuZGFyZE5hbWVzW0ZdICE9IE5hbWUpIHsKKyAgICAgIHNldFN0YXRlKEYsIEN1c3RvbU5hbWUpOworICAgICAgQ3VzdG9tTmFtZXNbRl0gPSBOYW1lOworICAgICAgYXNzZXJ0KEN1c3RvbU5hbWVzLmZpbmQoRikgIT0gQ3VzdG9tTmFtZXMuZW5kKCkpOworICAgIH0gZWxzZSB7CisgICAgICBzZXRTdGF0ZShGLCBTdGFuZGFyZE5hbWUpOworICAgIH0KKyAgfQorCisgIC8vLyBEaXNhYmxlcyBhbGwgYnVpbHRpbnMuCisgIC8vLworICAvLy8gVGhpcyBjYW4gYmUgdXNlZCBmb3Igb3B0aW9ucyBsaWtlIC1mbm8tYnVpbHRpbi4KKyAgdm9pZCBkaXNhYmxlQWxsRnVuY3Rpb25zKCk7CisKKyAgLy8vIEFkZCBhIHNldCBvZiBzY2FsYXIgLT4gdmVjdG9yIG1hcHBpbmdzLCBxdWVyeWFibGUgdmlhCisgIC8vLyBnZXRWZWN0b3JpemVkRnVuY3Rpb24gYW5kIGdldFNjYWxhcml6ZWRGdW5jdGlvbi4KKyAgdm9pZCBhZGRWZWN0b3JpemFibGVGdW5jdGlvbnMoQXJyYXlSZWY8VmVjRGVzYz4gRm5zKTsKKworICAvLy8gQ2FsbHMgYWRkVmVjdG9yaXphYmxlRnVuY3Rpb25zIHdpdGggYSBrbm93biBwcmVzZXQgb2YgZnVuY3Rpb25zIGZvciB0aGUKKyAgLy8vIGdpdmVuIHZlY3RvciBsaWJyYXJ5LgorICB2b2lkIGFkZFZlY3Rvcml6YWJsZUZ1bmN0aW9uc0Zyb21WZWNMaWIoZW51bSBWZWN0b3JMaWJyYXJ5IFZlY0xpYik7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBmdW5jdGlvbiBGIGhhcyBhIHZlY3RvciBlcXVpdmFsZW50IHdpdGggdmVjdG9yaXphdGlvbgorICAvLy8gZmFjdG9yIFZGLgorICBib29sIGlzRnVuY3Rpb25WZWN0b3JpemFibGUoU3RyaW5nUmVmIEYsIHVuc2lnbmVkIFZGKSBjb25zdCB7CisgICAgcmV0dXJuICFnZXRWZWN0b3JpemVkRnVuY3Rpb24oRiwgVkYpLmVtcHR5KCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGZ1bmN0aW9uIEYgaGFzIGEgdmVjdG9yIGVxdWl2YWxlbnQgd2l0aCBhbnkKKyAgLy8vIHZlY3Rvcml6YXRpb24gZmFjdG9yLgorICBib29sIGlzRnVuY3Rpb25WZWN0b3JpemFibGUoU3RyaW5nUmVmIEYpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVxdWl2YWxlbnQgb2YgRiwgdmVjdG9yaXplZCB3aXRoIGZhY3RvciBWRi4gSWYgbm8KKyAgLy8vIHN1Y2ggbWFwcGluZyBleGlzdHMsIHJldHVybiB0aGUgZW1wdHkgc3RyaW5nLgorICBTdHJpbmdSZWYgZ2V0VmVjdG9yaXplZEZ1bmN0aW9uKFN0cmluZ1JlZiBGLCB1bnNpZ25lZCBWRikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBmdW5jdGlvbiBGIGhhcyBhIHNjYWxhciBlcXVpdmFsZW50LCBhbmQgc2V0IFZGIHRvIGJlCisgIC8vLyB0aGUgdmVjdG9yaXphdGlvbiBmYWN0b3IuCisgIGJvb2wgaXNGdW5jdGlvblNjYWxhcml6YWJsZShTdHJpbmdSZWYgRiwgdW5zaWduZWQgJlZGKSBjb25zdCB7CisgICAgcmV0dXJuICFnZXRTY2FsYXJpemVkRnVuY3Rpb24oRiwgVkYpLmVtcHR5KCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBlcXVpdmFsZW50IG9mIEYsIHNjYWxhcml6ZWQuIElmIG5vIHN1Y2ggbWFwcGluZworICAvLy8gZXhpc3RzLCByZXR1cm4gdGhlIGVtcHR5IHN0cmluZy4KKyAgLy8vCisgIC8vLyBTZXQgVkYgdG8gdGhlIHZlY3Rvcml6YXRpb24gZmFjdG9yLgorICBTdHJpbmdSZWYgZ2V0U2NhbGFyaXplZEZ1bmN0aW9uKFN0cmluZ1JlZiBGLCB1bnNpZ25lZCAmVkYpIGNvbnN0OworCisgIC8vLyBTZXQgdG8gdHJ1ZSBpZmYgaTMyIHBhcmFtZXRlcnMgdG8gbGlicmFyeSBmdW5jdGlvbnMgc2hvdWxkIGhhdmUgc2lnbmV4dAorICAvLy8gb3IgemVyb2V4dCBhdHRyaWJ1dGVzIGlmIHRoZXkgY29ycmVzcG9uZCB0byBDLWxldmVsIGludCBvciB1bnNpZ25lZCBpbnQsCisgIC8vLyByZXNwZWN0aXZlbHkuCisgIHZvaWQgc2V0U2hvdWxkRXh0STMyUGFyYW0oYm9vbCBWYWwpIHsKKyAgICBTaG91bGRFeHRJMzJQYXJhbSA9IFZhbDsKKyAgfQorCisgIC8vLyBTZXQgdG8gdHJ1ZSBpZmYgaTMyIHJlc3VsdHMgZnJvbSBsaWJyYXJ5IGZ1bmN0aW9ucyBzaG91bGQgaGF2ZSBzaWduZXh0CisgIC8vLyBvciB6ZXJvZXh0IGF0dHJpYnV0ZXMgaWYgdGhleSBjb3JyZXNwb25kIHRvIEMtbGV2ZWwgaW50IG9yIHVuc2lnbmVkIGludCwKKyAgLy8vIHJlc3BlY3RpdmVseS4KKyAgdm9pZCBzZXRTaG91bGRFeHRJMzJSZXR1cm4oYm9vbCBWYWwpIHsKKyAgICBTaG91bGRFeHRJMzJSZXR1cm4gPSBWYWw7CisgIH0KKworICAvLy8gU2V0IHRvIHRydWUgaWZmIGkzMiBwYXJhbWV0ZXJzIHRvIGxpYnJhcnkgZnVuY3Rpb25zIHNob3VsZCBoYXZlIHNpZ25leHQKKyAgLy8vIGF0dHJpYnV0ZSBpZiB0aGV5IGNvcnJlc3BvbmQgdG8gQy1sZXZlbCBpbnQgb3IgdW5zaWduZWQgaW50LgorICB2b2lkIHNldFNob3VsZFNpZ25FeHRJMzJQYXJhbShib29sIFZhbCkgeworICAgIFNob3VsZFNpZ25FeHRJMzJQYXJhbSA9IFZhbDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSB3Y2hhcl90IHR5cGUgaW4gYnl0ZXMgb3IgMCBpZiB0aGUgc2l6ZSBpcyB1bmtub3duLgorICAvLy8gVGhpcyBxdWVyaWVzIHRoZSAnd2NoYXJfc2l6ZScgbWV0YWRhdGEuCisgIHVuc2lnbmVkIGdldFdDaGFyU2l6ZShjb25zdCBNb2R1bGUgJk0pIGNvbnN0OworfTsKKworLy8vIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgbGlicmFyeSBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IKKy8vLyB0aGUgY3VycmVudCB0YXJnZXQuCisvLy8KKy8vLyBUaGlzIGJvdGggYWxsb3dzIG9wdGltaXphdGlvbnMgdG8gaGFuZGxlIHRoZW0gc3BlY2lhbGx5IGFuZCBmcm9udGVuZHMgdG8KKy8vLyBkaXNhYmxlIHN1Y2ggb3B0aW1pemF0aW9ucyB0aHJvdWdoIC1mbm8tYnVpbHRpbiBldGMuCitjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbyB7CisgIGZyaWVuZCBjbGFzcyBUYXJnZXRMaWJyYXJ5QW5hbHlzaXM7CisgIGZyaWVuZCBjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mb1dyYXBwZXJQYXNzOworCisgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvSW1wbCAqSW1wbDsKKworcHVibGljOgorICBleHBsaWNpdCBUYXJnZXRMaWJyYXJ5SW5mbyhjb25zdCBUYXJnZXRMaWJyYXJ5SW5mb0ltcGwgJkltcGwpIDogSW1wbCgmSW1wbCkge30KKworICAvLyBQcm92aWRlIHZhbHVlIHNlbWFudGljcy4KKyAgVGFyZ2V0TGlicmFyeUluZm8oY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJlRMSSkgOiBJbXBsKFRMSS5JbXBsKSB7fQorICBUYXJnZXRMaWJyYXJ5SW5mbyhUYXJnZXRMaWJyYXJ5SW5mbyAmJlRMSSkgOiBJbXBsKFRMSS5JbXBsKSB7fQorICBUYXJnZXRMaWJyYXJ5SW5mbyAmb3BlcmF0b3I9KGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICZUTEkpIHsKKyAgICBJbXBsID0gVExJLkltcGw7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIFRhcmdldExpYnJhcnlJbmZvICZvcGVyYXRvcj0oVGFyZ2V0TGlicmFyeUluZm8gJiZUTEkpIHsKKyAgICBJbXBsID0gVExJLkltcGw7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFNlYXJjaGVzIGZvciBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gbmFtZS4KKyAgLy8vCisgIC8vLyBJZiBpdCBpcyBvbmUgb2YgdGhlIGtub3duIGxpYnJhcnkgZnVuY3Rpb25zLCByZXR1cm4gdHJ1ZSBhbmQgc2V0IEYgdG8gdGhlCisgIC8vLyBjb3JyZXNwb25kaW5nIHZhbHVlLgorICBib29sIGdldExpYkZ1bmMoU3RyaW5nUmVmIGZ1bmNOYW1lLCBMaWJGdW5jICZGKSBjb25zdCB7CisgICAgcmV0dXJuIEltcGwtPmdldExpYkZ1bmMoZnVuY05hbWUsIEYpOworICB9CisKKyAgYm9vbCBnZXRMaWJGdW5jKGNvbnN0IEZ1bmN0aW9uICZGRGVjbCwgTGliRnVuYyAmRikgY29uc3QgeworICAgIHJldHVybiBJbXBsLT5nZXRMaWJGdW5jKEZEZWNsLCBGKTsKKyAgfQorCisgIC8vLyBJZiBhIGNhbGxzaXRlIGRvZXMgbm90IGhhdmUgdGhlICdub2J1aWx0aW4nIGF0dHJpYnV0ZSwgcmV0dXJuIGlmIHRoZQorICAvLy8gY2FsbGVkIGZ1bmN0aW9uIGlzIGEga25vd24gbGlicmFyeSBmdW5jdGlvbiBhbmQgc2V0IEYgdG8gdGhhdCBmdW5jdGlvbi4KKyAgYm9vbCBnZXRMaWJGdW5jKEltbXV0YWJsZUNhbGxTaXRlIENTLCBMaWJGdW5jICZGKSBjb25zdCB7CisgICAgcmV0dXJuICFDUy5pc05vQnVpbHRpbigpICYmIENTLmdldENhbGxlZEZ1bmN0aW9uKCkgJiYKKyAgICAgICAgICAgZ2V0TGliRnVuYygqKENTLmdldENhbGxlZEZ1bmN0aW9uKCkpLCBGKTsKKyAgfQorCisgIC8vLyBUZXN0cyB3aGV0aGVyIGEgbGlicmFyeSBmdW5jdGlvbiBpcyBhdmFpbGFibGUuCisgIGJvb2wgaGFzKExpYkZ1bmMgRikgY29uc3QgeworICAgIHJldHVybiBJbXBsLT5nZXRTdGF0ZShGKSAhPSBUYXJnZXRMaWJyYXJ5SW5mb0ltcGw6OlVuYXZhaWxhYmxlOworICB9CisgIGJvb2wgaXNGdW5jdGlvblZlY3Rvcml6YWJsZShTdHJpbmdSZWYgRiwgdW5zaWduZWQgVkYpIGNvbnN0IHsKKyAgICByZXR1cm4gSW1wbC0+aXNGdW5jdGlvblZlY3Rvcml6YWJsZShGLCBWRik7CisgIH0KKyAgYm9vbCBpc0Z1bmN0aW9uVmVjdG9yaXphYmxlKFN0cmluZ1JlZiBGKSBjb25zdCB7CisgICAgcmV0dXJuIEltcGwtPmlzRnVuY3Rpb25WZWN0b3JpemFibGUoRik7CisgIH0KKyAgU3RyaW5nUmVmIGdldFZlY3Rvcml6ZWRGdW5jdGlvbihTdHJpbmdSZWYgRiwgdW5zaWduZWQgVkYpIGNvbnN0IHsKKyAgICByZXR1cm4gSW1wbC0+Z2V0VmVjdG9yaXplZEZ1bmN0aW9uKEYsIFZGKTsKKyAgfQorCisgIC8vLyBUZXN0cyBpZiB0aGUgZnVuY3Rpb24gaXMgYm90aCBhdmFpbGFibGUgYW5kIGEgY2FuZGlkYXRlIGZvciBvcHRpbWl6ZWQgY29kZQorICAvLy8gZ2VuZXJhdGlvbi4KKyAgYm9vbCBoYXNPcHRpbWl6ZWRDb2RlR2VuKExpYkZ1bmMgRikgY29uc3QgeworICAgIGlmIChJbXBsLT5nZXRTdGF0ZShGKSA9PSBUYXJnZXRMaWJyYXJ5SW5mb0ltcGw6OlVuYXZhaWxhYmxlKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHN3aXRjaCAoRikgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgTGliRnVuY19jb3B5c2lnbjogICAgIGNhc2UgTGliRnVuY19jb3B5c2lnbmY6ICBjYXNlIExpYkZ1bmNfY29weXNpZ25sOgorICAgIGNhc2UgTGliRnVuY19mYWJzOiAgICAgICAgIGNhc2UgTGliRnVuY19mYWJzZjogICAgICBjYXNlIExpYkZ1bmNfZmFic2w6CisgICAgY2FzZSBMaWJGdW5jX3NpbjogICAgICAgICAgY2FzZSBMaWJGdW5jX3NpbmY6ICAgICAgIGNhc2UgTGliRnVuY19zaW5sOgorICAgIGNhc2UgTGliRnVuY19jb3M6ICAgICAgICAgIGNhc2UgTGliRnVuY19jb3NmOiAgICAgICBjYXNlIExpYkZ1bmNfY29zbDoKKyAgICBjYXNlIExpYkZ1bmNfc3FydDogICAgICAgICBjYXNlIExpYkZ1bmNfc3FydGY6ICAgICAgY2FzZSBMaWJGdW5jX3NxcnRsOgorICAgIGNhc2UgTGliRnVuY19zcXJ0X2Zpbml0ZTogIGNhc2UgTGliRnVuY19zcXJ0Zl9maW5pdGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExpYkZ1bmNfc3FydGxfZmluaXRlOgorICAgIGNhc2UgTGliRnVuY19mbWF4OiAgICAgICAgIGNhc2UgTGliRnVuY19mbWF4ZjogICAgICBjYXNlIExpYkZ1bmNfZm1heGw6CisgICAgY2FzZSBMaWJGdW5jX2ZtaW46ICAgICAgICAgY2FzZSBMaWJGdW5jX2ZtaW5mOiAgICAgIGNhc2UgTGliRnVuY19mbWlubDoKKyAgICBjYXNlIExpYkZ1bmNfZmxvb3I6ICAgICAgICBjYXNlIExpYkZ1bmNfZmxvb3JmOiAgICAgY2FzZSBMaWJGdW5jX2Zsb29ybDoKKyAgICBjYXNlIExpYkZ1bmNfbmVhcmJ5aW50OiAgICBjYXNlIExpYkZ1bmNfbmVhcmJ5aW50ZjogY2FzZSBMaWJGdW5jX25lYXJieWludGw6CisgICAgY2FzZSBMaWJGdW5jX2NlaWw6ICAgICAgICAgY2FzZSBMaWJGdW5jX2NlaWxmOiAgICAgIGNhc2UgTGliRnVuY19jZWlsbDoKKyAgICBjYXNlIExpYkZ1bmNfcmludDogICAgICAgICBjYXNlIExpYkZ1bmNfcmludGY6ICAgICAgY2FzZSBMaWJGdW5jX3JpbnRsOgorICAgIGNhc2UgTGliRnVuY19yb3VuZDogICAgICAgIGNhc2UgTGliRnVuY19yb3VuZGY6ICAgICBjYXNlIExpYkZ1bmNfcm91bmRsOgorICAgIGNhc2UgTGliRnVuY190cnVuYzogICAgICAgIGNhc2UgTGliRnVuY190cnVuY2Y6ICAgICBjYXNlIExpYkZ1bmNfdHJ1bmNsOgorICAgIGNhc2UgTGliRnVuY19sb2cyOiAgICAgICAgIGNhc2UgTGliRnVuY19sb2cyZjogICAgICBjYXNlIExpYkZ1bmNfbG9nMmw6CisgICAgY2FzZSBMaWJGdW5jX2V4cDI6ICAgICAgICAgY2FzZSBMaWJGdW5jX2V4cDJmOiAgICAgIGNhc2UgTGliRnVuY19leHAybDoKKyAgICBjYXNlIExpYkZ1bmNfbWVtY21wOiAgICAgICBjYXNlIExpYkZ1bmNfc3RyY21wOiAgICAgY2FzZSBMaWJGdW5jX3N0cmNweToKKyAgICBjYXNlIExpYkZ1bmNfc3RwY3B5OiAgICAgICBjYXNlIExpYkZ1bmNfc3RybGVuOiAgICAgY2FzZSBMaWJGdW5jX3N0cm5sZW46CisgICAgY2FzZSBMaWJGdW5jX21lbWNocjogICAgICAgY2FzZSBMaWJGdW5jX21lbXBjcHk6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgU3RyaW5nUmVmIGdldE5hbWUoTGliRnVuYyBGKSBjb25zdCB7CisgICAgYXV0byBTdGF0ZSA9IEltcGwtPmdldFN0YXRlKEYpOworICAgIGlmIChTdGF0ZSA9PSBUYXJnZXRMaWJyYXJ5SW5mb0ltcGw6OlVuYXZhaWxhYmxlKQorICAgICAgcmV0dXJuIFN0cmluZ1JlZigpOworICAgIGlmIChTdGF0ZSA9PSBUYXJnZXRMaWJyYXJ5SW5mb0ltcGw6OlN0YW5kYXJkTmFtZSkKKyAgICAgIHJldHVybiBJbXBsLT5TdGFuZGFyZE5hbWVzW0ZdOworICAgIGFzc2VydChTdGF0ZSA9PSBUYXJnZXRMaWJyYXJ5SW5mb0ltcGw6OkN1c3RvbU5hbWUpOworICAgIHJldHVybiBJbXBsLT5DdXN0b21OYW1lcy5maW5kKEYpLT5zZWNvbmQ7CisgIH0KKworICAvLy8gUmV0dXJucyBleHRlbnNpb24gYXR0cmlidXRlIGtpbmQgdG8gYmUgdXNlZCBmb3IgaTMyIHBhcmFtZXRlcnMKKyAgLy8vIGNvcnJlc3BvbmRpbmcgdG8gQy1sZXZlbCBpbnQgb3IgdW5zaWduZWQgaW50LiAgTWF5IGJlIHplcm9leHQsIHNpZ25leHQsCisgIC8vLyBvciBub25lLgorICBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEV4dEF0dHJGb3JJMzJQYXJhbShib29sIFNpZ25lZCA9IHRydWUpIGNvbnN0IHsKKyAgICBpZiAoSW1wbC0+U2hvdWxkRXh0STMyUGFyYW0pCisgICAgICByZXR1cm4gU2lnbmVkID8gQXR0cmlidXRlOjpTRXh0IDogQXR0cmlidXRlOjpaRXh0OworICAgIGlmIChJbXBsLT5TaG91bGRTaWduRXh0STMyUGFyYW0pCisgICAgICByZXR1cm4gQXR0cmlidXRlOjpTRXh0OworICAgIHJldHVybiBBdHRyaWJ1dGU6Ok5vbmU7CisgIH0KKworICAvLy8gUmV0dXJucyBleHRlbnNpb24gYXR0cmlidXRlIGtpbmQgdG8gYmUgdXNlZCBmb3IgaTMyIHJldHVybiB2YWx1ZXMKKyAgLy8vIGNvcnJlc3BvbmRpbmcgdG8gQy1sZXZlbCBpbnQgb3IgdW5zaWduZWQgaW50LiAgTWF5IGJlIHplcm9leHQsIHNpZ25leHQsCisgIC8vLyBvciBub25lLgorICBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEV4dEF0dHJGb3JJMzJSZXR1cm4oYm9vbCBTaWduZWQgPSB0cnVlKSBjb25zdCB7CisgICAgaWYgKEltcGwtPlNob3VsZEV4dEkzMlJldHVybikKKyAgICAgIHJldHVybiBTaWduZWQgPyBBdHRyaWJ1dGU6OlNFeHQgOiBBdHRyaWJ1dGU6OlpFeHQ7CisgICAgcmV0dXJuIEF0dHJpYnV0ZTo6Tm9uZTsKKyAgfQorCisgIC8vLyBcY29weWRvYyBUYXJnZXRMaWJyYXJ5SW5mb0ltcGw6OmdldFdDaGFyU2l6ZSgpCisgIHVuc2lnbmVkIGdldFdDaGFyU2l6ZShjb25zdCBNb2R1bGUgJk0pIGNvbnN0IHsKKyAgICByZXR1cm4gSW1wbC0+Z2V0V0NoYXJTaXplKE0pOworICB9CisKKyAgLy8vIEhhbmRsZSBpbnZhbGlkYXRpb24gZnJvbSB0aGUgcGFzcyBtYW5hZ2VyLgorICAvLy8KKyAgLy8vIElmIHdlIHRyeSB0byBpbnZhbGlkYXRlIHRoaXMgaW5mbywganVzdCByZXR1cm4gZmFsc2UuIEl0IGNhbm5vdCBiZWNvbWUKKyAgLy8vIGludmFsaWQgZXZlbiBpZiB0aGUgbW9kdWxlIG9yIGZ1bmN0aW9uIGNoYW5nZXMuCisgIGJvb2wgaW52YWxpZGF0ZShNb2R1bGUgJiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJiwKKyAgICAgICAgICAgICAgICAgIE1vZHVsZUFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIGludmFsaWRhdGUoRnVuY3Rpb24gJiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJiwKKyAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvLy8gQW5hbHlzaXMgcGFzcyBwcm92aWRpbmcgdGhlIFxjIFRhcmdldExpYnJhcnlJbmZvLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgcGFzcydzIHJlc3VsdCBjYW5ub3QgYmUgaW52YWxpZGF0ZWQsIGl0IGlzIGltbXV0YWJsZSBmb3IgdGhlCisvLy8gbGlmZSBvZiB0aGUgbW9kdWxlLgorY2xhc3MgVGFyZ2V0TGlicmFyeUFuYWx5c2lzIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPFRhcmdldExpYnJhcnlBbmFseXNpcz4geworcHVibGljOgorICB0eXBlZGVmIFRhcmdldExpYnJhcnlJbmZvIFJlc3VsdDsKKworICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3QgdGhlIGxpYnJhcnkgYW5hbHlzaXMuCisgIC8vLworICAvLy8gVGhpcyB3aWxsIHVzZSB0aGUgbW9kdWxlJ3MgdHJpcGxlIHRvIGNvbnN0cnVjdCB0aGUgbGlicmFyeSBpbmZvIGZvciB0aGF0CisgIC8vLyBtb2R1bGUuCisgIFRhcmdldExpYnJhcnlBbmFseXNpcygpIHt9CisKKyAgLy8vIENvbnN0cnVjdCBhIGxpYnJhcnkgYW5hbHlzaXMgd2l0aCBwcmVzZXQgaW5mby4KKyAgLy8vCisgIC8vLyBUaGlzIHdpbGwgZGlyZWN0bHkgY29weSB0aGUgcHJlc2V0IGluZm8gaW50byB0aGUgcmVzdWx0IHdpdGhvdXQKKyAgLy8vIGNvbnN1bHRpbmcgdGhlIG1vZHVsZSdzIHRyaXBsZS4KKyAgVGFyZ2V0TGlicmFyeUFuYWx5c2lzKFRhcmdldExpYnJhcnlJbmZvSW1wbCBQcmVzZXRJbmZvSW1wbCkKKyAgICAgIDogUHJlc2V0SW5mb0ltcGwoc3RkOjptb3ZlKFByZXNldEluZm9JbXBsKSkge30KKworICBUYXJnZXRMaWJyYXJ5SW5mbyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJik7CisgIFRhcmdldExpYnJhcnlJbmZvIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJik7CisKK3ByaXZhdGU6CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxUYXJnZXRMaWJyYXJ5QW5hbHlzaXM+OworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCisgIE9wdGlvbmFsPFRhcmdldExpYnJhcnlJbmZvSW1wbD4gUHJlc2V0SW5mb0ltcGw7CisKKyAgU3RyaW5nTWFwPHN0ZDo6dW5pcXVlX3B0cjxUYXJnZXRMaWJyYXJ5SW5mb0ltcGw+PiBJbXBsczsKKworICBUYXJnZXRMaWJyYXJ5SW5mb0ltcGwgJmxvb2t1cEluZm9JbXBsKGNvbnN0IFRyaXBsZSAmVCk7Cit9OworCitjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mb1dyYXBwZXJQYXNzIDogcHVibGljIEltbXV0YWJsZVBhc3MgeworICBUYXJnZXRMaWJyYXJ5SW5mb0ltcGwgVExJSW1wbDsKKyAgVGFyZ2V0TGlicmFyeUluZm8gVExJOworCisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKyAgVGFyZ2V0TGlicmFyeUluZm9XcmFwcGVyUGFzcygpOworICBleHBsaWNpdCBUYXJnZXRMaWJyYXJ5SW5mb1dyYXBwZXJQYXNzKGNvbnN0IFRyaXBsZSAmVCk7CisgIGV4cGxpY2l0IFRhcmdldExpYnJhcnlJbmZvV3JhcHBlclBhc3MoY29uc3QgVGFyZ2V0TGlicmFyeUluZm9JbXBsICZUTEkpOworCisgIFRhcmdldExpYnJhcnlJbmZvICZnZXRUTEkoKSB7IHJldHVybiBUTEk7IH0KKyAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJmdldFRMSSgpIGNvbnN0IHsgcmV0dXJuIFRMSTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1RhcmdldFRyYW5zZm9ybUluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVGFyZ2V0VHJhbnNmb3JtSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOWM2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1RhcmdldFRyYW5zZm9ybUluZm8uaApAQCAtMCwwICsxLDE2NjIgQEAKKy8vPT09LSBUYXJnZXRUcmFuc2Zvcm1JbmZvLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIHBhc3MgZXhwb3NlcyBjb2RlZ2VuIGluZm9ybWF0aW9uIHRvIElSLWxldmVsIHBhc3Nlcy4gRXZlcnkKKy8vLyB0cmFuc2Zvcm1hdGlvbiB0aGF0IHVzZXMgY29kZWdlbiBpbmZvcm1hdGlvbiBpcyBicm9rZW4gaW50byB0aHJlZSBwYXJ0czoKKy8vLyAxLiBUaGUgSVItbGV2ZWwgYW5hbHlzaXMgcGFzcy4KKy8vLyAyLiBUaGUgSVItbGV2ZWwgdHJhbnNmb3JtYXRpb24gaW50ZXJmYWNlIHdoaWNoIHByb3ZpZGVzIHRoZSBuZWVkZWQKKy8vLyAgICBpbmZvcm1hdGlvbi4KKy8vLyAzLiBDb2RlZ2VuLWxldmVsIGltcGxlbWVudGF0aW9uIHdoaWNoIHVzZXMgdGFyZ2V0LXNwZWNpZmljIGhvb2tzLgorLy8vCisvLy8gVGhpcyBmaWxlIGRlZmluZXMgIzIsIHdoaWNoIGlzIHRoZSBpbnRlcmZhY2UgdGhhdCBJUi1sZXZlbCB0cmFuc2Zvcm1hdGlvbnMKKy8vLyB1c2UgZm9yIHF1ZXJ5aW5nIHRoZSBjb2RlZ2VuLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfVEFSR0VUVFJBTlNGT1JNSU5GT19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfVEFSR0VUVFJBTlNGT1JNSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vSVIvT3BlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0F0b21pY09yZGVyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIEludHJpbnNpYyB7CitlbnVtIElEIDogdW5zaWduZWQ7Cit9CisKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBJbnRyaW5zaWNJbnN0OworY2xhc3MgTG9hZEluc3Q7CitjbGFzcyBMb29wOworY2xhc3MgU0NFVjsKK2NsYXNzIFNjYWxhckV2b2x1dGlvbjsKK2NsYXNzIFN0b3JlSW5zdDsKK2NsYXNzIFN3aXRjaEluc3Q7CitjbGFzcyBUeXBlOworY2xhc3MgVXNlcjsKK2NsYXNzIFZhbHVlOworCisvLy8gXGJyaWVmIEluZm9ybWF0aW9uIGFib3V0IGEgbG9hZC9zdG9yZSBpbnRyaW5zaWMgZGVmaW5lZCBieSB0aGUgdGFyZ2V0Lgorc3RydWN0IE1lbUludHJpbnNpY0luZm8geworICAvLy8gVGhpcyBpcyB0aGUgcG9pbnRlciB0aGF0IHRoZSBpbnRyaW5zaWMgaXMgbG9hZGluZyBmcm9tIG9yIHN0b3JpbmcgdG8uCisgIC8vLyBJZiB0aGlzIGlzIG5vbi1udWxsLCB0aGVuIGFuYWx5c2lzL29wdGltaXphdGlvbiBwYXNzZXMgY2FuIGFzc3VtZSB0aGF0CisgIC8vLyB0aGlzIGludHJpbnNpYyBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBhIGxvYWQvc3RvcmUgZnJvbSB0aGlzCisgIC8vLyBwb2ludGVyLgorICBWYWx1ZSAqUHRyVmFsID0gbnVsbHB0cjsKKworICAvLyBPcmRlcmluZyBmb3IgYXRvbWljIG9wZXJhdGlvbnMuCisgIEF0b21pY09yZGVyaW5nIE9yZGVyaW5nID0gQXRvbWljT3JkZXJpbmc6Ok5vdEF0b21pYzsKKworICAvLyBTYW1lIElkIGlzIHNldCBieSB0aGUgdGFyZ2V0IGZvciBjb3JyZXNwb25kaW5nIGxvYWQvc3RvcmUgaW50cmluc2ljcy4KKyAgdW5zaWduZWQgc2hvcnQgTWF0Y2hpbmdJZCA9IDA7CisKKyAgYm9vbCBSZWFkTWVtID0gZmFsc2U7CisgIGJvb2wgV3JpdGVNZW0gPSBmYWxzZTsKKyAgYm9vbCBJc1ZvbGF0aWxlID0gZmFsc2U7CisKKyAgYm9vbCBpc1Vub3JkZXJlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKE9yZGVyaW5nID09IEF0b21pY09yZGVyaW5nOjpOb3RBdG9taWMgfHwKKyAgICAgICAgICAgIE9yZGVyaW5nID09IEF0b21pY09yZGVyaW5nOjpVbm9yZGVyZWQpICYmICFJc1ZvbGF0aWxlOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcGFzcyBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGNvZGVnZW4gaW50ZXJmYWNlcyB0aGF0IGFyZSBuZWVkZWQKKy8vLyBmb3IgSVItbGV2ZWwgdHJhbnNmb3JtYXRpb25zLgorY2xhc3MgVGFyZ2V0VHJhbnNmb3JtSW5mbyB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgVFRJIG9iamVjdCB1c2luZyBhIHR5cGUgaW1wbGVtZW50aW5nIHRoZSBcYyBDb25jZXB0CisgIC8vLyBBUEkgYmVsb3cuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIGJ5IHRhcmdldHMgdG8gY29uc3RydWN0IGEgVFRJIHdyYXBwaW5nIHRoZWlyIHRhcmdldC1zcGVjaWZpYworICAvLy8gaW1wbGVtZW50YWlvbiB0aGF0IGVuY29kZXMgYXBwcm9wcmlhdGUgY29zdHMgZm9yIHRoZWlyIHRhcmdldC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFRhcmdldFRyYW5zZm9ybUluZm8oVCBJbXBsKTsKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIGJhc2VsaW5lIFRUSSBvYmplY3QgdXNpbmcgYSBtaW5pbWFsIGltcGxlbWVudGF0aW9uIG9mCisgIC8vLyB0aGUgXGMgQ29uY2VwdCBBUEkgYmVsb3cuCisgIC8vLworICAvLy8gVGhlIFRUSSBpbXBsZW1lbnRhdGlvbiB3aWxsIHJlZmxlY3QgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBEYXRhTGF5b3V0CisgIC8vLyBwcm92aWRlZCBpZiBub24tbnVsbC4KKyAgZXhwbGljaXQgVGFyZ2V0VHJhbnNmb3JtSW5mbyhjb25zdCBEYXRhTGF5b3V0ICZETCk7CisKKyAgLy8gUHJvdmlkZSBtb3ZlIHNlbWFudGljcy4KKyAgVGFyZ2V0VHJhbnNmb3JtSW5mbyhUYXJnZXRUcmFuc2Zvcm1JbmZvICYmQXJnKTsKKyAgVGFyZ2V0VHJhbnNmb3JtSW5mbyAmb3BlcmF0b3I9KFRhcmdldFRyYW5zZm9ybUluZm8gJiZSSFMpOworCisgIC8vIFdlIG5lZWQgdG8gZGVmaW5lIHRoZSBkZXN0cnVjdG9yIG91dC1vZi1saW5lIHRvIGRlZmluZSBvdXIgc3ViLWNsYXNzZXMKKyAgLy8gb3V0LW9mLWxpbmUuCisgIH5UYXJnZXRUcmFuc2Zvcm1JbmZvKCk7CisKKyAgLy8vIFxicmllZiBIYW5kbGUgdGhlIGludmFsaWRhdGlvbiBvZiB0aGlzIGluZm9ybWF0aW9uLgorICAvLy8KKyAgLy8vIFdoZW4gdXNlZCBhcyBhIHJlc3VsdCBvZiBcYyBUYXJnZXRJUkFuYWx5c2lzIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkCisgIC8vLyB3aGVuIHRoZSBmdW5jdGlvbiB0aGlzIHdhcyBjb21wdXRlZCBmb3IgY2hhbmdlcy4gV2hlbiBpdCByZXR1cm5zIGZhbHNlLAorICAvLy8gdGhlIGluZm9ybWF0aW9uIGlzIHByZXNlcnZlZCBhY3Jvc3MgdGhvc2UgY2hhbmdlcy4KKyAgYm9vbCBpbnZhbGlkYXRlKEZ1bmN0aW9uICYsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICYsCisgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJikgeworICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgcHJvYmFibHkgaW4gc29tZSB3YXkgZW5zdXJlIHRoYXQgdGhlIHN1YnRhcmdldAorICAgIC8vIGluZm9ybWF0aW9uIGZvciBhIGZ1bmN0aW9uIGhhc24ndCBjaGFuZ2VkLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcbmFtZSBHZW5lcmljIFRhcmdldCBJbmZvcm1hdGlvbgorICAvLy8gQHsKKworICAvLy8gXGJyaWVmIFRoZSBraW5kIG9mIGNvc3QgbW9kZWwuCisgIC8vLworICAvLy8gVGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50IGNvc3QgbW9kZWxzIHRoYXQgY2FuIGJlIGN1c3RvbWl6ZWQgYnkgdGhlCisgIC8vLyB0YXJnZXQuIFRoZSBub3JtYWxpemF0aW9uIG9mIGVhY2ggY29zdCBtb2RlbCBtYXkgYmUgdGFyZ2V0IHNwZWNpZmljLgorICBlbnVtIFRhcmdldENvc3RLaW5kIHsKKyAgICBUQ0tfUmVjaXBUaHJvdWdocHV0LCAvLy88IFJlY2lwcm9jYWwgdGhyb3VnaHB1dC4KKyAgICBUQ0tfTGF0ZW5jeSwgICAgICAgICAvLy88IFRoZSBsYXRlbmN5IG9mIGluc3RydWN0aW9uLgorICAgIFRDS19Db2RlU2l6ZSAgICAgICAgIC8vLzwgSW5zdHJ1Y3Rpb24gY29kZSBzaXplLgorICB9OworCisgIC8vLyBcYnJpZWYgUXVlcnkgdGhlIGNvc3Qgb2YgYSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCisgIC8vLworICAvLy8gQ2xpZW50cyBzaG91bGQgdXNlIHRoaXMgaW50ZXJmYWNlIHRvIHF1ZXJ5IHRoZSBjb3N0IG9mIGFuIGV4aXN0aW5nCisgIC8vLyBpbnN0cnVjdGlvbi4gVGhlIGluc3RydWN0aW9uIG11c3QgaGF2ZSBhIHZhbGlkIHBhcmVudCAoYmFzaWMgYmxvY2spLgorICAvLy8KKyAgLy8vIE5vdGUsIHRoaXMgbWV0aG9kIGRvZXMgbm90IGNhY2hlIHRoZSBjb3N0IGNhbGN1bGF0aW9uIGFuZCBpdAorICAvLy8gY2FuIGJlIGV4cGVuc2l2ZSBpbiBzb21lIGNhc2VzLgorICBpbnQgZ2V0SW5zdHJ1Y3Rpb25Db3N0KGNvbnN0IEluc3RydWN0aW9uICpJLCBlbnVtIFRhcmdldENvc3RLaW5kIGtpbmQpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKGtpbmQpeworICAgIGNhc2UgVENLX1JlY2lwVGhyb3VnaHB1dDoKKyAgICAgIHJldHVybiBnZXRJbnN0cnVjdGlvblRocm91Z2hwdXQoSSk7CisKKyAgICBjYXNlIFRDS19MYXRlbmN5OgorICAgICAgcmV0dXJuIGdldEluc3RydWN0aW9uTGF0ZW5jeShJKTsKKworICAgIGNhc2UgVENLX0NvZGVTaXplOgorICAgICAgcmV0dXJuIGdldFVzZXJDb3N0KEkpOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGluc3RydWN0aW9uIGNvc3Qga2luZCIpOworICB9CisKKyAgLy8vIFxicmllZiBVbmRlcmx5aW5nIGNvbnN0YW50cyBmb3IgJ2Nvc3QnIHZhbHVlcyBpbiB0aGlzIGludGVyZmFjZS4KKyAgLy8vCisgIC8vLyBNYW55IEFQSXMgaW4gdGhpcyBpbnRlcmZhY2UgcmV0dXJuIGEgY29zdC4gVGhpcyBlbnVtIGRlZmluZXMgdGhlCisgIC8vLyBmdW5kYW1lbnRhbCB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBpbnRlcnByZXQgKGFuZCBwcm9kdWNlKSB0aG9zZQorICAvLy8gY29zdHMuIFRoZSBjb3N0cyBhcmUgcmV0dXJuZWQgYXMgYW4gaW50IHJhdGhlciB0aGFuIGEgbWVtYmVyIG9mIHRoaXMKKyAgLy8vIGVudW1lcmF0aW9uIGJlY2F1c2UgaXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgY29zdCBvZiBvbmUgSVIgaW5zdHJ1Y3Rpb24KKyAgLy8vIG1heSBoYXZlIGEgbXVsdGlwbGljYXRpdmUgZmFjdG9yIHRvIGl0IG9yIG90aGVyd2lzZSB3b24ndCBmaXQgZGlyZWN0bHkKKyAgLy8vIGludG8gdGhlIGVudW0uIE1vcmVvdmVyLCBpdCBpcyBjb21tb24gdG8gc3VtIG9yIGF2ZXJhZ2UgY29zdHMgd2hpY2ggd29ya3MKKyAgLy8vIGJldHRlciBhcyBzaW1wbGUgaW50ZWdyYWwgdmFsdWVzLiBUaHVzIHRoaXMgZW51bSBvbmx5IHByb3ZpZGVzIGNvbnN0YW50cy4KKyAgLy8vIEFsc28gbm90ZSB0aGF0IHRoZSByZXR1cm5lZCBjb3N0cyBhcmUgc2lnbmVkIGludGVnZXJzIHRvIG1ha2UgaXQgbmF0dXJhbAorICAvLy8gdG8gYWRkLCBzdWJ0cmFjdCwgYW5kIHRlc3Qgd2l0aCB6ZXJvIChhIGNvbW1vbiBib3VuZGFyeSBjb25kaXRpb24pLiBJdCBpcworICAvLy8gbm90IGV4cGVjdGVkIHRoYXQgMl4zMiBpcyBhIHJlYWxpc3RpYyBjb3N0IHRvIGJlIG1vZGVsaW5nIGF0IGFueSBwb2ludC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhlc2UgY29zdHMgc2hvdWxkIHVzdWFsbHkgcmVmbGVjdCB0aGUgaW50ZXJzZWN0aW9uIG9mIGNvZGUtc2l6ZQorICAvLy8gY29zdCBhbmQgZXhlY3V0aW9uIGNvc3QuIEEgZnJlZSBpbnN0cnVjdGlvbiBpcyB0eXBpY2FsbHkgb25lIHRoYXQgZm9sZHMKKyAgLy8vIGludG8gYW5vdGhlciBpbnN0cnVjdGlvbi4gRm9yIGV4YW1wbGUsIHJlZy10by1yZWcgbW92ZXMgY2FuIG9mdGVuIGJlCisgIC8vLyBza2lwcGVkIGJ5IHJlbmFtaW5nIHRoZSByZWdpc3RlcnMgaW4gdGhlIENQVSwgYnV0IHRoZXkgc3RpbGwgYXJlIGVuY29kZWQKKyAgLy8vIGFuZCB0aHVzIHdvdWxkbid0IGJlIGNvbnNpZGVyZWQgJ2ZyZWUnIGhlcmUuCisgIGVudW0gVGFyZ2V0Q29zdENvbnN0YW50cyB7CisgICAgVENDX0ZyZWUgPSAwLCAgICAgLy8vPCBFeHBlY3RlZCB0byBmb2xkIGF3YXkgaW4gbG93ZXJpbmcuCisgICAgVENDX0Jhc2ljID0gMSwgICAgLy8vPCBUaGUgY29zdCBvZiBhIHR5cGljYWwgJ2FkZCcgaW5zdHJ1Y3Rpb24uCisgICAgVENDX0V4cGVuc2l2ZSA9IDQgLy8vPCBUaGUgY29zdCBvZiBhICdkaXYnIGluc3RydWN0aW9uIG9uIHg4Ni4KKyAgfTsKKworICAvLy8gXGJyaWVmIEVzdGltYXRlIHRoZSBjb3N0IG9mIGEgc3BlY2lmaWMgb3BlcmF0aW9uIHdoZW4gbG93ZXJlZC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBpcyBkZXNpZ25lZCB0byB3b3JrIG9uIGFuIGFyYml0cmFyeSBzeW50aGV0aWMgb3Bjb2RlLCBhbmQKKyAgLy8vIHRodXMgd29yayBmb3IgaHlwb3RoZXRpY2FsIHF1ZXJpZXMgYmVmb3JlIGFuIGluc3RydWN0aW9uIGhhcyBldmVuIGJlZW4KKyAgLy8vIGZvcm1lZC4gSG93ZXZlciwgdGhpcyBkb2VzICpub3QqIHdvcmsgZm9yIEdFUHMsIGFuZCBtdXN0IG5vdCBiZSBjYWxsZWQKKyAgLy8vIGZvciBhIEdFUCBpbnN0cnVjdGlvbi4gSW5zdGVhZCwgdXNlIHRoZSBkZWRpY2F0ZWQgZ2V0R0VQQ29zdCBpbnRlcmZhY2UgYXMKKyAgLy8vIGFuYWx5emluZyBhIEdFUCdzIGNvc3QgcmVxdWlyZWQgbW9yZSBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIC8vLyBUeXBpY2FsbHkgb25seSB0aGUgcmVzdWx0IHR5cGUgaXMgcmVxdWlyZWQsIGFuZCB0aGUgb3BlcmFuZCB0eXBlIGNhbiBiZQorICAvLy8gb21pdHRlZC4gSG93ZXZlciwgaWYgdGhlIG9wY29kZSBpcyBvbmUgb2YgdGhlIGNhc3QgaW5zdHJ1Y3Rpb25zLCB0aGUKKyAgLy8vIG9wZXJhbmQgdHlwZSBpcyByZXF1aXJlZC4KKyAgLy8vCisgIC8vLyBUaGUgcmV0dXJuZWQgY29zdCBpcyBkZWZpbmVkIGluIHRlcm1zIG9mIFxjIFRhcmdldENvc3RDb25zdGFudHMsIHNlZSBpdHMKKyAgLy8vIGNvbW1lbnRzIGZvciBhIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoZSBjb3N0IHZhbHVlcy4KKyAgaW50IGdldE9wZXJhdGlvbkNvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpUeSwgVHlwZSAqT3BUeSA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRXN0aW1hdGUgdGhlIGNvc3Qgb2YgYSBHRVAgb3BlcmF0aW9uIHdoZW4gbG93ZXJlZC4KKyAgLy8vCisgIC8vLyBUaGUgY29udHJhY3QgZm9yIHRoaXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgXGMgZ2V0T3BlcmF0aW9uQ29zdCBleGNlcHQKKyAgLy8vIHRoYXQgaXQgc3VwcG9ydHMgYW4gaW50ZXJmYWNlIHRoYXQgcHJvdmlkZXMgZXh0cmEgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8KKyAgLy8vIHRoZSBHRVAgb3BlcmF0aW9uLgorICBpbnQgZ2V0R0VQQ29zdChUeXBlICpQb2ludGVlVHlwZSwgY29uc3QgVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gT3BlcmFuZHMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRXN0aW1hdGUgdGhlIGNvc3Qgb2YgYSBFWFQgb3BlcmF0aW9uIHdoZW4gbG93ZXJlZC4KKyAgLy8vCisgIC8vLyBUaGUgY29udHJhY3QgZm9yIHRoaXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgXGMgZ2V0T3BlcmF0aW9uQ29zdCBleGNlcHQKKyAgLy8vIHRoYXQgaXQgc3VwcG9ydHMgYW4gaW50ZXJmYWNlIHRoYXQgcHJvdmlkZXMgZXh0cmEgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8KKyAgLy8vIHRoZSBFWFQgb3BlcmF0aW9uLgorICBpbnQgZ2V0RXh0Q29zdChjb25zdCBJbnN0cnVjdGlvbiAqSSwgY29uc3QgVmFsdWUgKlNyYykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBFc3RpbWF0ZSB0aGUgY29zdCBvZiBhIGZ1bmN0aW9uIGNhbGwgd2hlbiBsb3dlcmVkLgorICAvLy8KKyAgLy8vIFRoZSBjb250cmFjdCBmb3IgdGhpcyBpcyB0aGUgc2FtZSBhcyBcYyBnZXRPcGVyYXRpb25Db3N0IGV4Y2VwdCB0aGF0IGl0CisgIC8vLyBzdXBwb3J0cyBhbiBpbnRlcmZhY2UgdGhhdCBwcm92aWRlcyBleHRyYSBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBjYWxsCisgIC8vLyBpbnN0cnVjdGlvbnMuCisgIC8vLworICAvLy8gVGhpcyBpcyB0aGUgbW9zdCBiYXNpYyBxdWVyeSBmb3IgZXN0aW1hdGluZyBjYWxsIGNvc3Q6IGl0IG9ubHkga25vd3MgdGhlCisgIC8vLyBmdW5jdGlvbiB0eXBlIGFuZCAocG90ZW50aWFsbHkpIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGF0IHRoZSBjYWxsIHNpdGUuCisgIC8vLyBUaGUgbGF0dGVyIGlzIG9ubHkgaW50ZXJlc3RpbmcgZm9yIHZhcmFyZ3MgZnVuY3Rpb24gdHlwZXMuCisgIGludCBnZXRDYWxsQ29zdChGdW5jdGlvblR5cGUgKkZUeSwgaW50IE51bUFyZ3MgPSAtMSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBFc3RpbWF0ZSB0aGUgY29zdCBvZiBjYWxsaW5nIGEgc3BlY2lmaWMgZnVuY3Rpb24gd2hlbiBsb3dlcmVkLgorICAvLy8KKyAgLy8vIFRoaXMgb3ZlcmxvYWQgYWRkcyB0aGUgYWJpbGl0eSB0byByZWFzb24gYWJvdXQgdGhlIHBhcnRpY3VsYXIgZnVuY3Rpb24KKyAgLy8vIGJlaW5nIGNhbGxlZCBpbiB0aGUgZXZlbnQgaXQgaXMgYSBsaWJyYXJ5IGNhbGwgd2l0aCBzcGVjaWFsIGxvd2VyaW5nLgorICBpbnQgZ2V0Q2FsbENvc3QoY29uc3QgRnVuY3Rpb24gKkYsIGludCBOdW1BcmdzID0gLTEpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRXN0aW1hdGUgdGhlIGNvc3Qgb2YgY2FsbGluZyBhIHNwZWNpZmljIGZ1bmN0aW9uIHdoZW4gbG93ZXJlZC4KKyAgLy8vCisgIC8vLyBUaGlzIG92ZXJsb2FkIGFsbG93cyBzcGVjaWZ5aW5nIGEgc2V0IG9mIGNhbmRpZGF0ZSBhcmd1bWVudCB2YWx1ZXMuCisgIGludCBnZXRDYWxsQ29zdChjb25zdCBGdW5jdGlvbiAqRiwgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gQXJndW1lbnRzKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgQSB2YWx1ZSBieSB3aGljaCBvdXIgaW5saW5pbmcgdGhyZXNob2xkIHNob3VsZCBiZSBtdWx0aXBsaWVkLgorICAvLy8gVGhpcyBpcyBwcmltYXJpbHkgdXNlZCB0byBidW1wIHVwIHRoZSBpbmxpbmluZyB0aHJlc2hvbGQgd2hvbGVzYWxlIG9uCisgIC8vLyB0YXJnZXRzIHdoZXJlIGNhbGxzIGFyZSB1bnVzdWFsbHkgZXhwZW5zaXZlLgorICAvLy8KKyAgLy8vIFRPRE86IFRoaXMgaXMgYSByYXRoZXIgYmx1bnQgaW5zdHJ1bWVudC4gIFBlcmhhcHMgYWx0ZXJpbmcgdGhlIGNvc3RzIG9mCisgIC8vLyBpbmRpdmlkdWFsIGNsYXNzZXMgb2YgaW5zdHJ1Y3Rpb25zIHdvdWxkIGJlIGJldHRlci4KKyAgdW5zaWduZWQgZ2V0SW5saW5pbmdUaHJlc2hvbGRNdWx0aXBsaWVyKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBFc3RpbWF0ZSB0aGUgY29zdCBvZiBhbiBpbnRyaW5zaWMgd2hlbiBsb3dlcmVkLgorICAvLy8KKyAgLy8vIE1pcnJvcnMgdGhlIFxjIGdldENhbGxDb3N0IG1ldGhvZCBidXQgdXNlcyBhbiBpbnRyaW5zaWMgaWRlbnRpZmllci4KKyAgaW50IGdldEludHJpbnNpY0Nvc3QoSW50cmluc2ljOjpJRCBJSUQsIFR5cGUgKlJldFR5LAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUeXBlICo+IFBhcmFtVHlzKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEVzdGltYXRlIHRoZSBjb3N0IG9mIGFuIGludHJpbnNpYyB3aGVuIGxvd2VyZWQuCisgIC8vLworICAvLy8gTWlycm9ycyB0aGUgXGMgZ2V0Q2FsbENvc3QgbWV0aG9kIGJ1dCB1c2VzIGFuIGludHJpbnNpYyBpZGVudGlmaWVyLgorICBpbnQgZ2V0SW50cmluc2ljQ29zdChJbnRyaW5zaWM6OklEIElJRCwgVHlwZSAqUmV0VHksCisgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IEFyZ3VtZW50cykgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm4gVGhlIGVzdGltYXRlZCBudW1iZXIgb2YgY2FzZSBjbHVzdGVycyB3aGVuIGxvd2VyaW5nIFxwICdTSScuCisgIC8vLyBccCBKVFNpemUgU2V0IGEganVtcCB0YWJsZSBzaXplIG9ubHkgd2hlbiBccCBTSSBpcyBzdWl0YWJsZSBmb3IgYSBqdW1wCisgIC8vLyB0YWJsZS4KKyAgdW5zaWduZWQgZ2V0RXN0aW1hdGVkTnVtYmVyT2ZDYXNlQ2x1c3RlcnMoY29uc3QgU3dpdGNoSW5zdCAmU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZKVFNpemUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRXN0aW1hdGUgdGhlIGNvc3Qgb2YgYSBnaXZlbiBJUiB1c2VyIHdoZW4gbG93ZXJlZC4KKyAgLy8vCisgIC8vLyBUaGlzIGNhbiBlc3RpbWF0ZSB0aGUgY29zdCBvZiBlaXRoZXIgYSBDb25zdGFudEV4cHIgb3IgSW5zdHJ1Y3Rpb24gd2hlbgorICAvLy8gbG93ZXJlZC4gSXQgaGFzIHR3byBwcmltYXJ5IGFkdmFudGFnZXMgb3ZlciB0aGUgXGMgZ2V0T3BlcmF0aW9uQ29zdCBhbmQKKyAgLy8vIFxjIGdldEdFUENvc3QgYWJvdmUsIGFuZCBvbmUgc2lnbmlmaWNhbnQgZGlzYWR2YW50YWdlOiBpdCBjYW4gb25seSBiZQorICAvLy8gdXNlZCB3aGVuIHRoZSBJUiBjb25zdHJ1Y3QgaGFzIGFscmVhZHkgYmVlbiBmb3JtZWQuCisgIC8vLworICAvLy8gVGhlIGFkdmFudGFnZXMgYXJlIHRoYXQgaXQgY2FuIGluc3BlY3QgdGhlIFNTQSB1c2UgZ3JhcGggdG8gcmVhc29uIG1vcmUKKyAgLy8vIGFjY3VyYXRlbHkgYWJvdXQgdGhlIGNvc3QuIEZvciBleGFtcGxlLCBhbGwtY29uc3RhbnQtR0VQcyBjYW4gb2Z0ZW4gYmUKKyAgLy8vIGZvbGRlZCBpbnRvIGEgbG9hZCBvciBvdGhlciBpbnN0cnVjdGlvbiwgYnV0IGlmIHRoZXkgYXJlIHVzZWQgaW4gc29tZQorICAvLy8gb3RoZXIgY29udGV4dCB0aGV5IG1heSBub3QgYmUgZm9sZGVkLiBUaGlzIHJvdXRpbmUgY2FuIGRpc3Rpbmd1aXNoIHN1Y2gKKyAgLy8vIGNhc2VzLgorICAvLy8KKyAgLy8vIFxwIE9wZXJhbmRzIGlzIGEgbGlzdCBvZiBvcGVyYW5kcyB3aGljaCBjYW4gYmUgYSByZXN1bHQgb2YgdHJhbnNmb3JtYXRpb25zCisgIC8vLyBvZiB0aGUgY3VycmVudCBvcGVyYW5kcy4gVGhlIG51bWJlciBvZiB0aGUgb3BlcmFuZHMgb24gdGhlIGxpc3QgbXVzdCBlcXVhbAorICAvLy8gdG8gdGhlIG51bWJlciBvZiB0aGUgY3VycmVudCBvcGVyYW5kcyB0aGUgSVIgdXNlciBoYXMuIFRoZWlyIG9yZGVyIG9uIHRoZQorICAvLy8gbGlzdCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBvcmRlciBvZiB0aGUgY3VycmVudCBvcGVyYW5kcyB0aGUgSVIgdXNlcgorICAvLy8gaGFzLgorICAvLy8KKyAgLy8vIFRoZSByZXR1cm5lZCBjb3N0IGlzIGRlZmluZWQgaW4gdGVybXMgb2YgXGMgVGFyZ2V0Q29zdENvbnN0YW50cywgc2VlIGl0cworICAvLy8gY29tbWVudHMgZm9yIGEgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhlIGNvc3QgdmFsdWVzLgorICBpbnQgZ2V0VXNlckNvc3QoY29uc3QgVXNlciAqVSwgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gT3BlcmFuZHMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB3aGljaCBjYWxscyB0aGUgdHdvLWFyZ3VtZW50IGdldFVzZXJDb3N0CisgIC8vLyB3aXRoIFxwIE9wZXJhbmRzIHdoaWNoIGFyZSB0aGUgY3VycmVudCBvcGVyYW5kcyBVIGhhcy4KKyAgaW50IGdldFVzZXJDb3N0KGNvbnN0IFVzZXIgKlUpIGNvbnN0IHsKKyAgICBTbWFsbFZlY3Rvcjxjb25zdCBWYWx1ZSAqLCA0PiBPcGVyYW5kcyhVLT52YWx1ZV9vcF9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUtPnZhbHVlX29wX2VuZCgpKTsKKyAgICByZXR1cm4gZ2V0VXNlckNvc3QoVSwgT3BlcmFuZHMpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBicmFuY2ggZGl2ZXJnZW5jZSBleGlzdHMuCisgIC8vLworICAvLy8gQnJhbmNoIGRpdmVyZ2VuY2UgaGFzIGEgc2lnbmlmaWNhbnRseSBuZWdhdGl2ZSBpbXBhY3Qgb24gR1BVIHBlcmZvcm1hbmNlCisgIC8vLyB3aGVuIHRocmVhZHMgaW4gdGhlIHNhbWUgd2F2ZWZyb250IHRha2UgZGlmZmVyZW50IHBhdGhzIGR1ZSB0byBjb25kaXRpb25hbAorICAvLy8gYnJhbmNoZXMuCisgIGJvb2wgaGFzQnJhbmNoRGl2ZXJnZW5jZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB3aGV0aGVyIFYgaXMgYSBzb3VyY2Ugb2YgZGl2ZXJnZW5jZS4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHRoZSB0YXJnZXQtZGVwZW5kZW50IGluZm9ybWF0aW9uIGZvcgorICAvLy8gdGhlIHRhcmdldC1pbmRlcGVuZGVudCBEaXZlcmdlbmNlQW5hbHlzaXMuIERpdmVyZ2VuY2VBbmFseXNpcyBmaXJzdAorICAvLy8gYnVpbGRzIHRoZSBkZXBlbmRlbmN5IGdyYXBoLCBhbmQgdGhlbiBydW5zIHRoZSByZWFjaGFiaWxpdHkgYWxnb3JpdGhtCisgIC8vLyBzdGFydGluZyB3aXRoIHRoZSBzb3VyY2VzIG9mIGRpdmVyZ2VuY2UuCisgIGJvb2wgaXNTb3VyY2VPZkRpdmVyZ2VuY2UoY29uc3QgVmFsdWUgKlYpIGNvbnN0OworCisgIC8vIFxicmllZiBSZXR1cm5zIHRydWUgZm9yIHRoZSB0YXJnZXQgc3BlY2lmaWMKKyAgLy8gc2V0IG9mIG9wZXJhdGlvbnMgd2hpY2ggcHJvZHVjZSB1bmlmb3JtIHJlc3VsdAorICAvLyBldmVuIHRha2luZyBub24tdW5mb3JtIGFyZ3VtZW50cworICBib29sIGlzQWx3YXlzVW5pZm9ybShjb25zdCBWYWx1ZSAqVikgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIGFkZHJlc3Mgc3BhY2UgSUQgZm9yIGEgdGFyZ2V0J3MgJ2ZsYXQnIGFkZHJlc3Mgc3BhY2UuIE5vdGUKKyAgLy8vIHRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIGFkZHJzcGFjZSgwKSwgd2hpY2ggTExWTSBzb21ldGltZXMKKyAgLy8vIHJlZmVycyB0byBhcyB0aGUgZ2VuZXJpYyBhZGRyZXNzIHNwYWNlLiBUaGUgZmxhdCBhZGRyZXNzIHNwYWNlIGlzIGEKKyAgLy8vIGdlbmVyaWMgYWRkcmVzcyBzcGFjZSB0aGF0IGNhbiBiZSB1c2VkIGFjY2VzcyBtdWx0aXBsZSBzZWdtZW50cyBvZiBtZW1vcnkKKyAgLy8vIHdpdGggZGlmZmVyZW50IGFkZHJlc3Mgc3BhY2VzLiBBY2Nlc3Mgb2YgYSBtZW1vcnkgbG9jYXRpb24gdGhyb3VnaCBhCisgIC8vLyBwb2ludGVyIHdpdGggdGhpcyBhZGRyZXNzIHNwYWNlIGlzIGV4cGVjdGVkIHRvIGJlIGxlZ2FsIGJ1dCBzbG93ZXIKKyAgLy8vIGNvbXBhcmVkIHRvIHRoZSBzYW1lIG1lbW9yeSBsb2NhdGlvbiBhY2Nlc3NlZCB0aHJvdWdoIGEgcG9pbnRlciB3aXRoIGEKKyAgLy8vIGRpZmZlcmVudCBhZGRyZXNzIHNwYWNlLgorICAvLworICAvLy8gVGhpcyBpcyBmb3IgdGFyZ2V0cyB3aXRoIGRpZmZlcmVudCBwb2ludGVyIHJlcHJlc2VudGF0aW9ucyB3aGljaCBjYW4KKyAgLy8vIGJlIGNvbnZlcnRlZCB3aXRoIHRoZSBhZGRyc3BhY2VjYXN0IGluc3RydWN0aW9uLiBJZiBhIHBvaW50ZXIgaXMgY29udmVydGVkCisgIC8vLyB0byB0aGlzIGFkZHJlc3Mgc3BhY2UsIG9wdGltaXphdGlvbnMgc2hvdWxkIGF0dGVtcHQgdG8gcmVwbGFjZSB0aGUgYWNjZXNzCisgIC8vLyB3aXRoIHRoZSBzb3VyY2UgYWRkcmVzcyBzcGFjZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB+MHUgaWYgdGhlIHRhcmdldCBkb2VzIG5vdCBoYXZlIHN1Y2ggYSBmbGF0IGFkZHJlc3Mgc3BhY2UgdG8KKyAgLy8vIG9wdGltaXplIGF3YXkuCisgIHVuc2lnbmVkIGdldEZsYXRBZGRyZXNzU3BhY2UoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFRlc3Qgd2hldGhlciBjYWxscyB0byBhIGZ1bmN0aW9uIGxvd2VyIHRvIGFjdHVhbCBwcm9ncmFtIGZ1bmN0aW9uCisgIC8vLyBjYWxscy4KKyAgLy8vCisgIC8vLyBUaGUgaWRlYSBpcyB0byB0ZXN0IHdoZXRoZXIgdGhlIHByb2dyYW0gaXMgbGlrZWx5IHRvIHJlcXVpcmUgYSAnY2FsbCcKKyAgLy8vIGluc3RydWN0aW9uIG9yIGVxdWl2YWxlbnQgaW4gb3JkZXIgdG8gY2FsbCB0aGUgZ2l2ZW4gZnVuY3Rpb24uCisgIC8vLworICAvLy8gRklYTUU6IEl0J3Mgbm90IGNsZWFyIHRoYXQgdGhpcyBpcyBhIGdvb2Qgb3IgdXNlZnVsIHF1ZXJ5IEFQSS4gQ2xpZW50J3MKKyAgLy8vIHNob3VsZCBwcm9iYWJseSBtb3ZlIHRvIHNpbXBsZXIgY29zdCBtZXRyaWNzIHVzaW5nIHRoZSBhYm92ZS4KKyAgLy8vIEFsdGVybmF0aXZlbHksIHdlIGNvdWxkIHNwbGl0IHRoZSBjb3N0IGludGVyZmFjZSBpbnRvIGRpc3RpbmN0IGNvZGUtc2l6ZQorICAvLy8gYW5kIGV4ZWN1dGlvbi1zcGVlZCBjb3N0cy4gVGhpcyB3b3VsZCBhbGxvdyBtb2RlbGxpbmcgdGhlIGNvcmUgb2YgdGhpcworICAvLy8gcXVlcnkgbW9yZSBhY2N1cmF0ZWx5IGFzIGEgY2FsbCBpcyBhIHNpbmdsZSBzbWFsbCBpbnN0cnVjdGlvbiwgYnV0CisgIC8vLyBpbmN1cnMgc2lnbmlmaWNhbnQgZXhlY3V0aW9uIGNvc3QuCisgIGJvb2wgaXNMb3dlcmVkVG9DYWxsKGNvbnN0IEZ1bmN0aW9uICpGKSBjb25zdDsKKworICBzdHJ1Y3QgTFNSQ29zdCB7CisgICAgLy8vIFRPRE86IFNvbWUgb2YgdGhlc2UgY291bGQgYmUgbWVyZ2VkLiBBbHNvLCBhIGxleGljYWwgb3JkZXJpbmcKKyAgICAvLy8gaXNuJ3QgYWx3YXlzIG9wdGltYWwuCisgICAgdW5zaWduZWQgSW5zbnM7CisgICAgdW5zaWduZWQgTnVtUmVnczsKKyAgICB1bnNpZ25lZCBBZGRSZWNDb3N0OworICAgIHVuc2lnbmVkIE51bUlWTXVsczsKKyAgICB1bnNpZ25lZCBOdW1CYXNlQWRkczsKKyAgICB1bnNpZ25lZCBJbW1Db3N0OworICAgIHVuc2lnbmVkIFNldHVwQ29zdDsKKyAgICB1bnNpZ25lZCBTY2FsZUNvc3Q7CisgIH07CisKKyAgLy8vIFBhcmFtZXRlcnMgdGhhdCBjb250cm9sIHRoZSBnZW5lcmljIGxvb3AgdW5yb2xsaW5nIHRyYW5zZm9ybWF0aW9uLgorICBzdHJ1Y3QgVW5yb2xsaW5nUHJlZmVyZW5jZXMgeworICAgIC8vLyBUaGUgY29zdCB0aHJlc2hvbGQgZm9yIHRoZSB1bnJvbGxlZCBsb29wLiBTaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlCisgICAgLy8vIGdldFVzZXJDb3N0IHZhbHVlcyByZXR1cm5lZCBieSB0aGlzIEFQSSwgYW5kIHRoZSBleHBlY3RhdGlvbiBpcyB0aGF0CisgICAgLy8vIHRoZSB1bnJvbGxlZCBsb29wJ3MgaW5zdHJ1Y3Rpb25zIHdoZW4gcnVuIHRocm91Z2ggdGhhdCBpbnRlcmZhY2Ugc2hvdWxkCisgICAgLy8vIG5vdCBleGNlZWQgdGhpcyBjb3N0LiBIb3dldmVyLCB0aGlzIGlzIG9ubHkgYW4gZXN0aW1hdGUuIEFsc28sIHNwZWNpZmljCisgICAgLy8vIGxvb3BzIG1heSBiZSB1bnJvbGxlZCBldmVuIHdpdGggYSBjb3N0IGFib3ZlIHRoaXMgdGhyZXNob2xkIGlmIGRlZW1lZAorICAgIC8vLyBwcm9maXRhYmxlLiBTZXQgdGhpcyB0byBVSU5UX01BWCB0byBkaXNhYmxlIHRoZSBsb29wIGJvZHkgY29zdAorICAgIC8vLyByZXN0cmljdGlvbi4KKyAgICB1bnNpZ25lZCBUaHJlc2hvbGQ7CisgICAgLy8vIElmIGNvbXBsZXRlIHVucm9sbGluZyB3aWxsIHJlZHVjZSB0aGUgY29zdCBvZiB0aGUgbG9vcCwgd2Ugd2lsbCBib29zdAorICAgIC8vLyB0aGUgVGhyZXNob2xkIGJ5IGEgY2VydGFpbiBwZXJjZW50IHRvIGFsbG93IG1vcmUgYWdncmVzc2l2ZSBjb21wbGV0ZQorICAgIC8vLyB1bnJvbGxpbmcuIFRoaXMgdmFsdWUgcHJvdmlkZXMgdGhlIG1heGltdW0gYm9vc3QgcGVyY2VudGFnZSB0aGF0IHdlCisgICAgLy8vIGNhbiBhcHBseSB0byBUaHJlc2hvbGQgKFRoZSB2YWx1ZSBzaG91bGQgYmUgbm8gbGVzcyB0aGFuIDEwMCkuCisgICAgLy8vIEJvb3N0ZWRUaHJlc2hvbGQgPSBUaHJlc2hvbGQgKiBtaW4oUm9sbGVkQ29zdCAvIFVucm9sbGVkQ29zdCwKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhQZXJjZW50VGhyZXNob2xkQm9vc3QgLyAxMDApCisgICAgLy8vIEUuZy4gaWYgY29tcGxldGUgdW5yb2xsaW5nIHJlZHVjZXMgdGhlIGxvb3AgZXhlY3V0aW9uIHRpbWUgYnkgNTAlCisgICAgLy8vIHRoZW4gd2UgYm9vc3QgdGhlIHRocmVzaG9sZCBieSB0aGUgZmFjdG9yIG9mIDJ4LiBJZiB1bnJvbGxpbmcgaXMgbm90CisgICAgLy8vIGV4cGVjdGVkIHRvIHJlZHVjZSB0aGUgcnVubmluZyB0aW1lLCB0aGVuIHdlIGRvIG5vdCBpbmNyZWFzZSB0aGUKKyAgICAvLy8gdGhyZXNob2xkLgorICAgIHVuc2lnbmVkIE1heFBlcmNlbnRUaHJlc2hvbGRCb29zdDsKKyAgICAvLy8gVGhlIGNvc3QgdGhyZXNob2xkIGZvciB0aGUgdW5yb2xsZWQgbG9vcCB3aGVuIG9wdGltaXppbmcgZm9yIHNpemUgKHNldAorICAgIC8vLyB0byBVSU5UX01BWCB0byBkaXNhYmxlKS4KKyAgICB1bnNpZ25lZCBPcHRTaXplVGhyZXNob2xkOworICAgIC8vLyBUaGUgY29zdCB0aHJlc2hvbGQgZm9yIHRoZSB1bnJvbGxlZCBsb29wLCBsaWtlIFRocmVzaG9sZCwgYnV0IHVzZWQKKyAgICAvLy8gZm9yIHBhcnRpYWwvcnVudGltZSB1bnJvbGxpbmcgKHNldCB0byBVSU5UX01BWCB0byBkaXNhYmxlKS4KKyAgICB1bnNpZ25lZCBQYXJ0aWFsVGhyZXNob2xkOworICAgIC8vLyBUaGUgY29zdCB0aHJlc2hvbGQgZm9yIHRoZSB1bnJvbGxlZCBsb29wIHdoZW4gb3B0aW1pemluZyBmb3Igc2l6ZSwgbGlrZQorICAgIC8vLyBPcHRTaXplVGhyZXNob2xkLCBidXQgdXNlZCBmb3IgcGFydGlhbC9ydW50aW1lIHVucm9sbGluZyAoc2V0IHRvCisgICAgLy8vIFVJTlRfTUFYIHRvIGRpc2FibGUpLgorICAgIHVuc2lnbmVkIFBhcnRpYWxPcHRTaXplVGhyZXNob2xkOworICAgIC8vLyBBIGZvcmNlZCB1bnJvbGxpbmcgZmFjdG9yICh0aGUgbnVtYmVyIG9mIGNvbmNhdGVuYXRlZCBib2RpZXMgb2YgdGhlCisgICAgLy8vIG9yaWdpbmFsIGxvb3AgaW4gdGhlIHVucm9sbGVkIGxvb3AgYm9keSkuIFdoZW4gc2V0IHRvIDAsIHRoZSB1bnJvbGxpbmcKKyAgICAvLy8gdHJhbnNmb3JtYXRpb24gd2lsbCBzZWxlY3QgYW4gdW5yb2xsaW5nIGZhY3RvciBiYXNlZCBvbiB0aGUgY3VycmVudCBjb3N0CisgICAgLy8vIHRocmVzaG9sZCBhbmQgb3RoZXIgZmFjdG9ycy4KKyAgICB1bnNpZ25lZCBDb3VudDsKKyAgICAvLy8gQSBmb3JjZWQgcGVlbGluZyBmYWN0b3IgKHRoZSBudW1iZXIgb2YgYm9kaWVkIG9mIHRoZSBvcmlnaW5hbCBsb29wCisgICAgLy8vIHRoYXQgc2hvdWxkIGJlIHBlZWxlZCBvZmYgYmVmb3JlIHRoZSBsb29wIGJvZHkpLiBXaGVuIHNldCB0byAwLCB0aGUKKyAgICAvLy8gdW5yb2xsaW5nIHRyYW5zZm9ybWF0aW9uIHdpbGwgc2VsZWN0IGEgcGVlbGluZyBmYWN0b3IgYmFzZWQgb24gcHJvZmlsZQorICAgIC8vLyBpbmZvcm1hdGlvbiBhbmQgb3RoZXIgZmFjdG9ycy4KKyAgICB1bnNpZ25lZCBQZWVsQ291bnQ7CisgICAgLy8vIERlZmF1bHQgdW5yb2xsIGNvdW50IGZvciBsb29wcyB3aXRoIHJ1bi10aW1lIHRyaXAgY291bnQuCisgICAgdW5zaWduZWQgRGVmYXVsdFVucm9sbFJ1bnRpbWVDb3VudDsKKyAgICAvLyBTZXQgdGhlIG1heGltdW0gdW5yb2xsaW5nIGZhY3Rvci4gVGhlIHVucm9sbGluZyBmYWN0b3IgbWF5IGJlIHNlbGVjdGVkCisgICAgLy8gdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGNvc3QgdGhyZXNob2xkLCBidXQgbWF5IG5vdCBleGNlZWQgdGhpcyBudW1iZXIKKyAgICAvLyAoc2V0IHRvIFVJTlRfTUFYIHRvIGRpc2FibGUpLiBUaGlzIGRvZXMgbm90IGFwcGx5IGluIGNhc2VzIHdoZXJlIHRoZQorICAgIC8vIGxvb3AgaXMgYmVpbmcgZnVsbHkgdW5yb2xsZWQuCisgICAgdW5zaWduZWQgTWF4Q291bnQ7CisgICAgLy8vIFNldCB0aGUgbWF4aW11bSB1bnJvbGxpbmcgZmFjdG9yIGZvciBmdWxsIHVucm9sbGluZy4gTGlrZSBNYXhDb3VudCwgYnV0CisgICAgLy8vIGFwcGxpZXMgZXZlbiBpZiBmdWxsIHVucm9sbGluZyBpcyBzZWxlY3RlZC4gVGhpcyBhbGxvd3MgYSB0YXJnZXQgdG8gZmFsbAorICAgIC8vLyBiYWNrIHRvIFBhcnRpYWwgdW5yb2xsaW5nIGlmIGZ1bGwgdW5yb2xsaW5nIGlzIGFib3ZlIEZ1bGxVbnJvbGxNYXhDb3VudC4KKyAgICB1bnNpZ25lZCBGdWxsVW5yb2xsTWF4Q291bnQ7CisgICAgLy8gUmVwcmVzZW50cyBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIG9wdGltaXplZCB3aGVuICJiYWNrIGVkZ2UiCisgICAgLy8gYmVjb21lcyAiZmFsbCB0aHJvdWdoIiBpbiB1bnJvbGxlZCBsb29wLgorICAgIC8vIEZvciBub3cgd2UgY291bnQgYSBjb25kaXRpb25hbCBicmFuY2ggb24gYSBiYWNrZWRnZSBhbmQgYSBjb21wYXJpc29uCisgICAgLy8gZmVlZGluZyBpdC4KKyAgICB1bnNpZ25lZCBCRUluc25zOworICAgIC8vLyBBbGxvdyBwYXJ0aWFsIHVucm9sbGluZyAodW5yb2xsaW5nIG9mIGxvb3BzIHRvIGV4cGFuZCB0aGUgc2l6ZSBvZiB0aGUKKyAgICAvLy8gbG9vcCBib2R5LCBub3Qgb25seSB0byBlbGltaW5hdGUgc21hbGwgY29uc3RhbnQtdHJpcC1jb3VudCBsb29wcykuCisgICAgYm9vbCBQYXJ0aWFsOworICAgIC8vLyBBbGxvdyBydW50aW1lIHVucm9sbGluZyAodW5yb2xsaW5nIG9mIGxvb3BzIHRvIGV4cGFuZCB0aGUgc2l6ZSBvZiB0aGUKKyAgICAvLy8gbG9vcCBib2R5IGV2ZW4gd2hlbiB0aGUgbnVtYmVyIG9mIGxvb3AgaXRlcmF0aW9ucyBpcyBub3Qga25vd24gYXQKKyAgICAvLy8gY29tcGlsZSB0aW1lKS4KKyAgICBib29sIFJ1bnRpbWU7CisgICAgLy8vIEFsbG93IGdlbmVyYXRpb24gb2YgYSBsb29wIHJlbWFpbmRlciAoZXh0cmEgaXRlcmF0aW9ucyBhZnRlciB1bnJvbGwpLgorICAgIGJvb2wgQWxsb3dSZW1haW5kZXI7CisgICAgLy8vIEFsbG93IGVtaXR0aW5nIGV4cGVuc2l2ZSBpbnN0cnVjdGlvbnMgKHN1Y2ggYXMgZGl2aXNpb25zKSB3aGVuIGNvbXB1dGluZworICAgIC8vLyB0aGUgdHJpcCBjb3VudCBvZiBhIGxvb3AgZm9yIHJ1bnRpbWUgdW5yb2xsaW5nLgorICAgIGJvb2wgQWxsb3dFeHBlbnNpdmVUcmlwQ291bnQ7CisgICAgLy8vIEFwcGx5IGxvb3AgdW5yb2xsIG9uIGFueSBraW5kIG9mIGxvb3AKKyAgICAvLy8gKG1haW5seSB0byBsb29wcyB0aGF0IGZhaWwgcnVudGltZSB1bnJvbGxpbmcpLgorICAgIGJvb2wgRm9yY2U7CisgICAgLy8vIEFsbG93IHVzaW5nIHRyaXAgY291bnQgdXBwZXIgYm91bmQgdG8gdW5yb2xsIGxvb3BzLgorICAgIGJvb2wgVXBwZXJCb3VuZDsKKyAgICAvLy8gQWxsb3cgcGVlbGluZyBvZmYgbG9vcCBpdGVyYXRpb25zIGZvciBsb29wcyB3aXRoIGxvdyBkeW5hbWljIHRyaXBjb3VudC4KKyAgICBib29sIEFsbG93UGVlbGluZzsKKyAgICAvLy8gQWxsb3cgdW5yb2xsaW5nIG9mIGFsbCB0aGUgaXRlcmF0aW9ucyBvZiB0aGUgcnVudGltZSBsb29wIHJlbWFpbmRlci4KKyAgICBib29sIFVucm9sbFJlbWFpbmRlcjsKKyAgfTsKKworICAvLy8gXGJyaWVmIEdldCB0YXJnZXQtY3VzdG9taXplZCBwcmVmZXJlbmNlcyBmb3IgdGhlIGdlbmVyaWMgbG9vcCB1bnJvbGxpbmcKKyAgLy8vIHRyYW5zZm9ybWF0aW9uLiBUaGUgY2FsbGVyIHdpbGwgaW5pdGlhbGl6ZSBVUCB3aXRoIHRoZSBjdXJyZW50CisgIC8vLyB0YXJnZXQtaW5kZXBlbmRlbnQgZGVmYXVsdHMuCisgIHZvaWQgZ2V0VW5yb2xsaW5nUHJlZmVyZW5jZXMoTG9vcCAqTCwgU2NhbGFyRXZvbHV0aW9uICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yb2xsaW5nUHJlZmVyZW5jZXMgJlVQKSBjb25zdDsKKworICAvLy8gQH0KKworICAvLy8gXG5hbWUgU2NhbGFyIFRhcmdldCBJbmZvcm1hdGlvbgorICAvLy8gQHsKKworICAvLy8gXGJyaWVmIEZsYWdzIGluZGljYXRpbmcgdGhlIGtpbmQgb2Ygc3VwcG9ydCBmb3IgcG9wdWxhdGlvbiBjb3VudC4KKyAgLy8vCisgIC8vLyBDb21wYXJlZCB0byB0aGUgU1cgaW1wbGVtZW50YXRpb24sIEhXIHN1cHBvcnQgaXMgc3VwcG9zZWQgdG8KKyAgLy8vIHNpZ25pZmljYW50bHkgYm9vc3QgdGhlIHBlcmZvcm1hbmNlIHdoZW4gdGhlIHBvcHVsYXRpb24gaXMgZGVuc2UsIGFuZCBpdAorICAvLy8gbWF5IG9yIG1heSBub3QgZGVncmFkZSBwZXJmb3JtYW5jZSBpZiB0aGUgcG9wdWxhdGlvbiBpcyBzcGFyc2UuIEEgSFcKKyAgLy8vIHN1cHBvcnQgaXMgY29uc2lkZXJlZCBhcyAiRmFzdCIgaWYgaXQgY2FuIG91dHBlcmZvcm0sIG9yIGlzIG9uIGEgcGFyCisgIC8vLyB3aXRoLCBTVyBpbXBsZW1lbnRhdGlvbiB3aGVuIHRoZSBwb3B1bGF0aW9uIGlzIHNwYXJzZTsgb3RoZXJ3aXNlLCBpdCBpcworICAvLy8gY29uc2lkZXJlZCBhcyAiU2xvdyIuCisgIGVudW0gUG9wY250U3VwcG9ydEtpbmQgeyBQU0tfU29mdHdhcmUsIFBTS19TbG93SGFyZHdhcmUsIFBTS19GYXN0SGFyZHdhcmUgfTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW1tZWRpYXRlIGlzIGxlZ2FsIGFkZCBpbW1lZGlhdGUsIHRoYXQKKyAgLy8vIGlzIHRoZSB0YXJnZXQgaGFzIGFkZCBpbnN0cnVjdGlvbnMgd2hpY2ggY2FuIGFkZCBhIHJlZ2lzdGVyIHdpdGggdGhlCisgIC8vLyBpbW1lZGlhdGUgd2l0aG91dCBoYXZpbmcgdG8gbWF0ZXJpYWxpemUgdGhlIGltbWVkaWF0ZSBpbnRvIGEgcmVnaXN0ZXIuCisgIGJvb2wgaXNMZWdhbEFkZEltbWVkaWF0ZShpbnQ2NF90IEltbSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGltbWVkaWF0ZSBpcyBsZWdhbCBpY21wIGltbWVkaWF0ZSwKKyAgLy8vIHRoYXQgaXMgdGhlIHRhcmdldCBoYXMgaWNtcCBpbnN0cnVjdGlvbnMgd2hpY2ggY2FuIGNvbXBhcmUgYSByZWdpc3RlcgorICAvLy8gYWdhaW5zdCB0aGUgaW1tZWRpYXRlIHdpdGhvdXQgaGF2aW5nIHRvIG1hdGVyaWFsaXplIHRoZSBpbW1lZGlhdGUgaW50byBhCisgIC8vLyByZWdpc3Rlci4KKyAgYm9vbCBpc0xlZ2FsSUNtcEltbWVkaWF0ZShpbnQ2NF90IEltbSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYWRkcmVzc2luZyBtb2RlIHJlcHJlc2VudGVkIGJ5IEFNIGlzIGxlZ2FsIGZvcgorICAvLy8gdGhpcyB0YXJnZXQsIGZvciBhIGxvYWQvc3RvcmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICAvLy8gVGhlIHR5cGUgbWF5IGJlIFZvaWRUeSwgaW4gd2hpY2ggY2FzZSBvbmx5IHJldHVybiB0cnVlIGlmIHRoZSBhZGRyZXNzaW5nCisgIC8vLyBtb2RlIGlzIGxlZ2FsIGZvciBhIGxvYWQvc3RvcmUgb2YgYW55IGxlZ2FsIHR5cGUuCisgIC8vLyBJZiB0YXJnZXQgcmV0dXJucyB0cnVlIGluIExTUldpdGhJbnN0clF1ZXJpZXMoKSwgSSBtYXkgYmUgdmFsaWQuCisgIC8vLyBUT0RPOiBIYW5kbGUgcHJlL3Bvc3RpbmMgYXMgd2VsbC4KKyAgYm9vbCBpc0xlZ2FsQWRkcmVzc2luZ01vZGUoVHlwZSAqVHksIEdsb2JhbFZhbHVlICpCYXNlR1YsIGludDY0X3QgQmFzZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNCYXNlUmVnLCBpbnQ2NF90IFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSSA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgTFNSIGNvc3Qgb2YgQzEgaXMgbG93ZXIgdGhhbiBDMS4KKyAgYm9vbCBpc0xTUkNvc3RMZXNzKFRhcmdldFRyYW5zZm9ybUluZm86OkxTUkNvc3QgJkMxLAorICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0VHJhbnNmb3JtSW5mbzo6TFNSQ29zdCAmQzIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGNhbiBmdXNlIGEgY29tcGFyZSBhbmQgYnJhbmNoLgorICAvLy8gTG9vcC1zdHJlbmd0aC1yZWR1Y3Rpb24gKExTUikgdXNlcyB0aGF0IGtub3dsZWRnZSB0byBhZGp1c3QgaXRzIGNvc3QKKyAgLy8vIGNhbGN1bGF0aW9uIGZvciB0aGUgaW5zdHJ1Y3Rpb25zIGluIGEgbG9vcC4KKyAgYm9vbCBjYW5NYWNyb0Z1c2VDbXAoKSBjb25zdDsKKworICAvLy8gXHJldHVybiBUcnVlIGlzIExTUiBzaG91bGQgbWFrZSBlZmZvcnRzIHRvIGNyZWF0ZS9wcmVzZXJ2ZSBwb3N0LWluYworICAvLy8gYWRkcmVzc2luZyBtb2RlIGV4cHJlc3Npb25zLgorICBib29sIHNob3VsZEZhdm9yUG9zdEluYygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBzdXBwb3J0cyBtYXNrZWQgbG9hZC9zdG9yZQorICAvLy8gQVZYMiBhbmQgQVZYLTUxMiB0YXJnZXRzIGFsbG93IG1hc2tzIGZvciBjb25zZWN1dGl2ZSBsb2FkIGFuZCBzdG9yZQorICBib29sIGlzTGVnYWxNYXNrZWRTdG9yZShUeXBlICpEYXRhVHlwZSkgY29uc3Q7CisgIGJvb2wgaXNMZWdhbE1hc2tlZExvYWQoVHlwZSAqRGF0YVR5cGUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBzdXBwb3J0cyBtYXNrZWQgZ2F0aGVyL3NjYXR0ZXIKKyAgLy8vIEFWWC01MTIgZnVsbHkgc3VwcG9ydHMgZ2F0aGVyIGFuZCBzY2F0dGVyIGZvciB2ZWN0b3JzIHdpdGggMzIgYW5kIDY0CisgIC8vLyBiaXRzIHNjYWxhciB0eXBlLgorICBib29sIGlzTGVnYWxNYXNrZWRTY2F0dGVyKFR5cGUgKkRhdGFUeXBlKSBjb25zdDsKKyAgYm9vbCBpc0xlZ2FsTWFza2VkR2F0aGVyKFR5cGUgKkRhdGFUeXBlKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBoYXMgYSB1bmlmaWVkIG9wZXJhdGlvbiB0byBjYWxjdWxhdGUgZGl2aXNpb24KKyAgLy8vIGFuZCByZW1haW5kZXIuIElmIHNvLCB0aGUgYWRkaXRpb25hbCBpbXBsaWNpdCBtdWx0aXBsaWNhdGlvbiBhbmQKKyAgLy8vIHN1YnRyYWN0aW9uIHJlcXVpcmVkIHRvIGNhbGN1bGF0ZSBhIHJlbWFpbmRlciBmcm9tIGRpdmlzaW9uIGFyZSBmcmVlLiBUaGlzCisgIC8vLyBjYW4gZW5hYmxlIG1vcmUgYWdncmVzc2l2ZSB0cmFuc2Zvcm1hdGlvbnMgZm9yIGRpdmlzaW9uIGFuZCByZW1haW5kZXIgdGhhbgorICAvLy8gd291bGQgdHlwaWNhbGx5IGJlIGFsbG93ZWQgdXNpbmcgdGhyb3VnaHB1dCBvciBzaXplIGNvc3QgbW9kZWxzLgorICBib29sIGhhc0RpdlJlbU9wKFR5cGUgKkRhdGFUeXBlLCBib29sIElzU2lnbmVkKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGluc3RydWN0aW9uIChhc3N1bWVkIHRvIGJlIGEgbWVtb3J5IGFjY2VzcworICAvLy8gaW5zdHJ1Y3Rpb24pIGhhcyBhIHZvbGF0aWxlIHZhcmlhbnQuIElmIHRoYXQncyB0aGUgY2FzZSB0aGVuIHdlIGNhbiBhdm9pZAorICAvLy8gYWRkcnNwYWNlY2FzdCB0byBnZW5lcmljIEFTIGZvciB2b2xhdGlsZSBsb2Fkcy9zdG9yZXMuIERlZmF1bHQKKyAgLy8vIGltcGxlbWVudGF0aW9uIHJldHVybnMgZmFsc2UsIHdoaWNoIHByZXZlbnRzIGFkZHJlc3Mgc3BhY2UgaW5mZXJlbmNlIGZvcgorICAvLy8gdm9sYXRpbGUgbG9hZHMvc3RvcmVzLgorICBib29sIGhhc1ZvbGF0aWxlVmFyaWFudChJbnN0cnVjdGlvbiAqSSwgdW5zaWduZWQgQWRkclNwYWNlKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGFyZ2V0IGRvZXNuJ3QgbWluZCBhZGRyZXNzZXMgaW4gdmVjdG9ycy4KKyAgYm9vbCBwcmVmZXJzVmVjdG9yaXplZEFkZHJlc3NpbmcoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgY29zdCBvZiB0aGUgc2NhbGluZyBmYWN0b3IgdXNlZCBpbiB0aGUgYWRkcmVzc2luZworICAvLy8gbW9kZSByZXByZXNlbnRlZCBieSBBTSBmb3IgdGhpcyB0YXJnZXQsIGZvciBhIGxvYWQvc3RvcmUKKyAgLy8vIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgLy8vIElmIHRoZSBBTSBpcyBzdXBwb3J0ZWQsIHRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSA+PSAwLgorICAvLy8gSWYgdGhlIEFNIGlzIG5vdCBzdXBwb3J0ZWQsIGl0IHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZS4KKyAgLy8vIFRPRE86IEhhbmRsZSBwcmUvcG9zdGluYyBhcyB3ZWxsLgorICBpbnQgZ2V0U2NhbGluZ0ZhY3RvckNvc3QoVHlwZSAqVHksIEdsb2JhbFZhbHVlICpCYXNlR1YsIGludDY0X3QgQmFzZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzQmFzZVJlZywgaW50NjRfdCBTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSA9IDApIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGxvb3Agc3RyZW5ndGggcmVkdWNlIHBhc3Mgc2hvdWxkIG1ha2UKKyAgLy8vIEluc3RydWN0aW9uKiBiYXNlZCBUVEkgcXVlcmllcyB0byBpc0xlZ2FsQWRkcmVzc2luZ01vZGUoKS4gVGhpcyBpcworICAvLy8gbmVlZGVkIG9uIFN5c3RlbVosIHdoZXJlIGUuZy4gYSBtZW1jcHkgY2FuIG9ubHkgaGF2ZSBhIDEyIGJpdCB1bnNpZ25lZAorICAvLy8gaW1tZWRpYXRlIG9mZnNldCBhbmQgbm8gaW5kZXggcmVnaXN0ZXIuCisgIGJvb2wgTFNSV2l0aEluc3RyUXVlcmllcygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgaXQncyBmcmVlIHRvIHRydW5jYXRlIGEgdmFsdWUgb2YgdHlwZSBUeTEgdG8gdHlwZQorICAvLy8gVHkyLiBlLmcuIE9uIHg4NiBpdCdzIGZyZWUgdG8gdHJ1bmNhdGUgYSBpMzIgdmFsdWUgaW4gcmVnaXN0ZXIgRUFYIHRvIGkxNgorICAvLy8gYnkgcmVmZXJlbmNpbmcgaXRzIHN1Yi1yZWdpc3RlciBBWC4KKyAgYm9vbCBpc1RydW5jYXRlRnJlZShUeXBlICpUeTEsIFR5cGUgKlR5MikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIGhvaXN0IGluc3RydWN0aW9uIGluIHRoZQorICAvLy8gdGhlbi9lbHNlIHRvIGJlZm9yZSBpZi4KKyAgYm9vbCBpc1Byb2ZpdGFibGVUb0hvaXN0KEluc3RydWN0aW9uICpJKSBjb25zdDsKKworICBib29sIHVzZUFBKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHR5cGUgaXMgbGVnYWwuCisgIGJvb2wgaXNUeXBlTGVnYWwoVHlwZSAqVHkpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgdGFyZ2V0J3Mgam1wX2J1ZiBhbGlnbm1lbnQgaW4gYnl0ZXMuCisgIHVuc2lnbmVkIGdldEp1bXBCdWZBbGlnbm1lbnQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHRhcmdldCdzIGptcF9idWYgc2l6ZSBpbiBieXRlcy4KKyAgdW5zaWduZWQgZ2V0SnVtcEJ1ZlNpemUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHN3aXRjaGVzIHNob3VsZCBiZSB0dXJuZWQgaW50byBsb29rdXAgdGFibGVzIGZvciB0aGUKKyAgLy8vIHRhcmdldC4KKyAgYm9vbCBzaG91bGRCdWlsZExvb2t1cFRhYmxlcygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgc3dpdGNoZXMgc2hvdWxkIGJlIHR1cm5lZCBpbnRvIGxvb2t1cCB0YWJsZXMKKyAgLy8vIGNvbnRhaW5pbmcgdGhpcyBjb25zdGFudCB2YWx1ZSBmb3IgdGhlIHRhcmdldC4KKyAgYm9vbCBzaG91bGRCdWlsZExvb2t1cFRhYmxlc0ZvckNvbnN0YW50KENvbnN0YW50ICpDKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBpbnB1dCBmdW5jdGlvbiB3aGljaCBpcyBjb2xkIGF0IGFsbCBjYWxsIHNpdGVzLAorICAvLy8gIHNob3VsZCB1c2UgY29sZGNjIGNhbGxpbmcgY29udmVudGlvbi4KKyAgYm9vbCB1c2VDb2xkQ0NGb3JDb2xkQ2FsbChGdW5jdGlvbiAmRikgY29uc3Q7CisKKyAgdW5zaWduZWQgZ2V0U2NhbGFyaXphdGlvbk92ZXJoZWFkKFR5cGUgKlR5LCBib29sIEluc2VydCwgYm9vbCBFeHRyYWN0KSBjb25zdDsKKworICB1bnNpZ25lZCBnZXRPcGVyYW5kc1NjYWxhcml6YXRpb25PdmVyaGVhZChBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWRikgY29uc3Q7CisKKyAgLy8vIElmIHRhcmdldCBoYXMgZWZmaWNpZW50IHZlY3RvciBlbGVtZW50IGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zLCBpdCBjYW4KKyAgLy8vIHJldHVybiB0cnVlIGhlcmUgc28gdGhhdCBpbnNlcnRpb24vZXh0cmFjdGlvbiBjb3N0cyBhcmUgbm90IGFkZGVkIHRvCisgIC8vLyB0aGUgc2NhbGFyaXphdGlvbiBjb3N0IG9mIGEgbG9hZC9zdG9yZS4KKyAgYm9vbCBzdXBwb3J0c0VmZmljaWVudFZlY3RvckVsZW1lbnRMb2FkU3RvcmUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERvbid0IHJlc3RyaWN0IGludGVybGVhdmVkIHVucm9sbGluZyB0byBzbWFsbCBsb29wcy4KKyAgYm9vbCBlbmFibGVBZ2dyZXNzaXZlSW50ZXJsZWF2aW5nKGJvb2wgTG9vcEhhc1JlZHVjdGlvbnMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgSWYgbm90IG51bGxwdHIsIGVuYWJsZSBpbmxpbmUgZXhwYW5zaW9uIG9mIG1lbWNtcC4gSXNaZXJvQ21wIGlzCisgIC8vLyB0cnVlIGlmIHRoaXMgaXMgdGhlIGV4cGFuc2lvbiBvZiBtZW1jbXAocDEsIHAyLCBzKSA9PSAwLgorICBzdHJ1Y3QgTWVtQ21wRXhwYW5zaW9uT3B0aW9ucyB7CisgICAgLy8gVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGxvYWQgc2l6ZXMgKGluIGJ5dGVzKSwgc29ydGVkIGluIGRlY3JlYXNpbmcgb3JkZXIuCisgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDg+IExvYWRTaXplczsKKyAgfTsKKyAgY29uc3QgTWVtQ21wRXhwYW5zaW9uT3B0aW9ucyAqZW5hYmxlTWVtQ21wRXhwYW5zaW9uKGJvb2wgSXNaZXJvQ21wKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEVuYWJsZSBtYXRjaGluZyBvZiBpbnRlcmxlYXZlZCBhY2Nlc3MgZ3JvdXBzLgorICBib29sIGVuYWJsZUludGVybGVhdmVkQWNjZXNzVmVjdG9yaXphdGlvbigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgSW5kaWNhdGUgdGhhdCBpdCBpcyBwb3RlbnRpYWxseSB1bnNhZmUgdG8gYXV0b21hdGljYWxseSB2ZWN0b3JpemUKKyAgLy8vIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYmVjYXVzZSB0aGUgc2VtYW50aWNzIG9mIHZlY3RvciBhbmQgc2NhbGFyCisgIC8vLyBmbG9hdGluZy1wb2ludCBzZW1hbnRpY3MgbWF5IGRpZmZlci4gRm9yIGV4YW1wbGUsIEFSTSBORU9OIHY3IFNJTUQgbWF0aAorICAvLy8gZG9lcyBub3Qgc3VwcG9ydCBJRUVFLTc1NCBkZW5vcm1hbCBudW1iZXJzLCB3aGlsZSBkZXBlbmRpbmcgb24gdGhlCisgIC8vLyBwbGF0Zm9ybSwgc2NhbGFyIGZsb2F0aW5nLXBvaW50IG1hdGggZG9lcy4KKyAgLy8vIFRoaXMgYXBwbGllcyB0byBmbG9hdGluZy1wb2ludCBtYXRoIG9wZXJhdGlvbnMgYW5kIGNhbGxzLCBub3QgbWVtb3J5CisgIC8vLyBvcGVyYXRpb25zLCBzaHVmZmxlcywgb3IgY2FzdHMuCisgIGJvb2wgaXNGUFZlY3Rvcml6YXRpb25Qb3RlbnRpYWxseVVuc2FmZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSB0YXJnZXQgc3VwcG9ydHMgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3Nlcy4KKyAgYm9vbCBhbGxvd3NNaXNhbGlnbmVkTWVtb3J5QWNjZXNzZXMoTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJpdFdpZHRoLCB1bnNpZ25lZCBBZGRyZXNzU3BhY2UgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpGYXN0ID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gaGFyZHdhcmUgc3VwcG9ydCBmb3IgcG9wdWxhdGlvbiBjb3VudC4KKyAgUG9wY250U3VwcG9ydEtpbmQgZ2V0UG9wY250U3VwcG9ydCh1bnNpZ25lZCBJbnRUeVdpZHRoSW5CaXQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGhhcmR3YXJlIGhhcyBhIGZhc3Qgc3F1YXJlLXJvb3QgaW5zdHJ1Y3Rpb24uCisgIGJvb2wgaGF2ZUZhc3RTcXJ0KFR5cGUgKlR5KSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgaXQgaXMgZmFzdGVyIHRvIGNoZWNrIGlmIGEgZmxvYXRpbmctcG9pbnQgdmFsdWUgaXMgTmFOCisgIC8vLyAob3Igbm90LU5hTikgdmVyc3VzIGEgY29tcGFyaXNvbiBhZ2FpbnN0IGEgY29uc3RhbnQgRlAgemVybyB2YWx1ZS4KKyAgLy8vIFRhcmdldHMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgaWYgbWF0ZXJpYWxpemluZyBhIDAuMCBmb3IgY29tcGFyaXNvbiBpcworICAvLy8gZ2VuZXJhbGx5IGFzIGNoZWFwIGFzIGNoZWNraW5nIGZvciBvcmRlcmVkL3Vub3JkZXJlZC4KKyAgYm9vbCBpc0ZDbXBPcmRDaGVhcGVyVGhhbkZDbXBaZXJvKFR5cGUgKlR5KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZXhwZWN0ZWQgY29zdCBvZiBzdXBwb3J0aW5nIHRoZSBmbG9hdGluZyBwb2ludCBvcGVyYXRpb24KKyAgLy8vIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgaW50IGdldEZQT3BDb3N0KFR5cGUgKlR5KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZXhwZWN0ZWQgY29zdCBvZiBtYXRlcmlhbGl6aW5nIGZvciB0aGUgZ2l2ZW4gaW50ZWdlcgorICAvLy8gaW1tZWRpYXRlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgaW50IGdldEludEltbUNvc3QoY29uc3QgQVBJbnQgJkltbSwgVHlwZSAqVHkpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBleHBlY3RlZCBjb3N0IG9mIG1hdGVyaWFsaXphdGlvbiBmb3IgdGhlIGdpdmVuIGludGVnZXIKKyAgLy8vIGltbWVkaWF0ZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgZm9yIGEgZ2l2ZW4gaW5zdHJ1Y3Rpb24uIFRoZSBjb3N0IGNhbiBiZQorICAvLy8gemVybyBpZiB0aGUgaW1tZWRpYXRlIGNhbiBiZSBmb2xkZWQgaW50byB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLgorICBpbnQgZ2V0SW50SW1tQ29zdCh1bnNpZ25lZCBPcGMsIHVuc2lnbmVkIElkeCwgY29uc3QgQVBJbnQgJkltbSwKKyAgICAgICAgICAgICAgICAgICAgVHlwZSAqVHkpIGNvbnN0OworICBpbnQgZ2V0SW50SW1tQ29zdChJbnRyaW5zaWM6OklEIElJRCwgdW5zaWduZWQgSWR4LCBjb25zdCBBUEludCAmSW1tLAorICAgICAgICAgICAgICAgICAgICBUeXBlICpUeSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGV4cGVjdGVkIGNvc3QgZm9yIHRoZSBnaXZlbiBpbnRlZ2VyIHdoZW4gb3B0aW1pc2luZworICAvLy8gZm9yIHNpemUuIFRoaXMgaXMgZGlmZmVyZW50IHRoYW4gdGhlIG90aGVyIGludGVnZXIgaW1tZWRpYXRlIGNvc3QKKyAgLy8vIGZ1bmN0aW9ucyBpbiB0aGF0IGl0IGlzIHN1YnRhcmdldCBhZ25vc3RpYy4gVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3UgZS5nLgorICAvLy8gdGFyZ2V0IG9uZSBJU0Egc3VjaCBhcyBBYXJjaDMyIGJ1dCBzbWFsbGVyIGVuY29kaW5ncyBjb3VsZCBiZSBwb3NzaWJsZQorICAvLy8gd2l0aCBhbm90aGVyIHN1Y2ggYXMgVGh1bWIuIFRoaXMgcmV0dXJuIHZhbHVlIGlzIHVzZWQgYXMgYSBwZW5hbHR5IHdoZW4KKyAgLy8vIHRoZSB0b3RhbCBjb3N0cyBmb3IgYSBjb25zdGFudCBpcyBjYWxjdWxhdGVkICh0aGUgYmlnZ2VyIHRoZSBjb3N0LCB0aGUKKyAgLy8vIG1vcmUgYmVuZWZpY2lhbCBjb25zdGFudCBob2lzdGluZyBpcykuCisgIGludCBnZXRJbnRJbW1Db2RlU2l6ZUNvc3QodW5zaWduZWQgT3BjLCB1bnNpZ25lZCBJZHgsIGNvbnN0IEFQSW50ICZJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqVHkpIGNvbnN0OworICAvLy8gQH0KKworICAvLy8gXG5hbWUgVmVjdG9yIFRhcmdldCBJbmZvcm1hdGlvbgorICAvLy8gQHsKKworICAvLy8gXGJyaWVmIFRoZSB2YXJpb3VzIGtpbmRzIG9mIHNodWZmbGUgcGF0dGVybnMgZm9yIHZlY3RvciBxdWVyaWVzLgorICBlbnVtIFNodWZmbGVLaW5kIHsKKyAgICBTS19Ccm9hZGNhc3QsICAgICAgIC8vLzwgQnJvYWRjYXN0IGVsZW1lbnQgMCB0byBhbGwgb3RoZXIgZWxlbWVudHMuCisgICAgU0tfUmV2ZXJzZSwgICAgICAgICAvLy88IFJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSB2ZWN0b3IuCisgICAgU0tfQWx0ZXJuYXRlLCAgICAgICAvLy88IENob29zZSBhbHRlcm5hdGUgZWxlbWVudHMgZnJvbSB2ZWN0b3IuCisgICAgU0tfSW5zZXJ0U3VidmVjdG9yLCAvLy88IEluc2VydFN1YnZlY3Rvci4gSW5kZXggaW5kaWNhdGVzIHN0YXJ0IG9mZnNldC4KKyAgICBTS19FeHRyYWN0U3VidmVjdG9yLC8vLzwgRXh0cmFjdFN1YnZlY3RvciBJbmRleCBpbmRpY2F0ZXMgc3RhcnQgb2Zmc2V0LgorICAgIFNLX1Blcm11dGVUd29TcmMsICAgLy8vPCBNZXJnZSBlbGVtZW50cyBmcm9tIHR3byBzb3VyY2UgdmVjdG9ycyBpbnRvIG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB3aXRoIGFueSBzaHVmZmxlIG1hc2suCisgICAgU0tfUGVybXV0ZVNpbmdsZVNyYyAvLy88IFNodWZmbGUgZWxlbWVudHMgb2Ygc2luZ2xlIHNvdXJjZSB2ZWN0b3Igd2l0aCBhbnkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgc2h1ZmZsZSBtYXNrLgorICB9OworCisgIC8vLyBcYnJpZWYgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhbiBvcGVyYW5kJ3MgcG9zc2libGUgdmFsdWVzLgorICBlbnVtIE9wZXJhbmRWYWx1ZUtpbmQgeworICAgIE9LX0FueVZhbHVlLCAgICAgICAgICAgICAgIC8vIE9wZXJhbmQgY2FuIGhhdmUgYW55IHZhbHVlLgorICAgIE9LX1VuaWZvcm1WYWx1ZSwgICAgICAgICAgIC8vIE9wZXJhbmQgaXMgdW5pZm9ybSAoc3BsYXQgb2YgYSB2YWx1ZSkuCisgICAgT0tfVW5pZm9ybUNvbnN0YW50VmFsdWUsICAgLy8gT3BlcmFuZCBpcyB1bmlmb3JtIGNvbnN0YW50LgorICAgIE9LX05vblVuaWZvcm1Db25zdGFudFZhbHVlIC8vIE9wZXJhbmQgaXMgYSBub24gdW5pZm9ybSBjb25zdGFudCB2YWx1ZS4KKyAgfTsKKworICAvLy8gXGJyaWVmIEFkZGl0aW9uYWwgcHJvcGVydGllcyBvZiBhbiBvcGVyYW5kJ3MgdmFsdWVzLgorICBlbnVtIE9wZXJhbmRWYWx1ZVByb3BlcnRpZXMgeyBPUF9Ob25lID0gMCwgT1BfUG93ZXJPZjIgPSAxIH07CisKKyAgLy8vIFxyZXR1cm4gVGhlIG51bWJlciBvZiBzY2FsYXIgb3IgdmVjdG9yIHJlZ2lzdGVycyB0aGF0IHRoZSB0YXJnZXQgaGFzLgorICAvLy8gSWYgJ1ZlY3RvcnMnIGlzIHRydWUsIGl0IHJldHVybnMgdGhlIG51bWJlciBvZiB2ZWN0b3IgcmVnaXN0ZXJzLiBJZiBpdCBpcworICAvLy8gc2V0IHRvIGZhbHNlLCBpdCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2NhbGFyIHJlZ2lzdGVycy4KKyAgdW5zaWduZWQgZ2V0TnVtYmVyT2ZSZWdpc3RlcnMoYm9vbCBWZWN0b3IpIGNvbnN0OworCisgIC8vLyBccmV0dXJuIFRoZSB3aWR0aCBvZiB0aGUgbGFyZ2VzdCBzY2FsYXIgb3IgdmVjdG9yIHJlZ2lzdGVyIHR5cGUuCisgIHVuc2lnbmVkIGdldFJlZ2lzdGVyQml0V2lkdGgoYm9vbCBWZWN0b3IpIGNvbnN0OworCisgIC8vLyBccmV0dXJuIFRoZSB3aWR0aCBvZiB0aGUgc21hbGxlc3QgdmVjdG9yIHJlZ2lzdGVyIHR5cGUuCisgIHVuc2lnbmVkIGdldE1pblZlY3RvclJlZ2lzdGVyQml0V2lkdGgoKSBjb25zdDsKKworICAvLy8gXHJldHVybiBUcnVlIGlmIHRoZSB2ZWN0b3JpemF0aW9uIGZhY3RvciBzaG91bGQgYmUgY2hvc2VuIHRvCisgIC8vLyBtYWtlIHRoZSB2ZWN0b3Igb2YgdGhlIHNtYWxsZXN0IGVsZW1lbnQgdHlwZSBtYXRjaCB0aGUgc2l6ZSBvZiBhCisgIC8vLyB2ZWN0b3IgcmVnaXN0ZXIuIEZvciB3aWRlciBlbGVtZW50IHR5cGVzLCB0aGlzIGNvdWxkIHJlc3VsdCBpbgorICAvLy8gY3JlYXRpbmcgdmVjdG9ycyB0aGF0IHNwYW4gbXVsdGlwbGUgdmVjdG9yIHJlZ2lzdGVycy4KKyAgLy8vIElmIGZhbHNlLCB0aGUgdmVjdG9yaXphdGlvbiBmYWN0b3Igd2lsbCBiZSBjaG9zZW4gYmFzZWQgb24gdGhlCisgIC8vLyBzaXplIG9mIHRoZSB3aWRlc3QgZWxlbWVudCB0eXBlLgorICBib29sIHNob3VsZE1heGltaXplVmVjdG9yQmFuZHdpZHRoKGJvb2wgT3B0U2l6ZSkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm4gVHJ1ZSBpZiBpdCBzaG91bGQgYmUgY29uc2lkZXJlZCBmb3IgYWRkcmVzcyB0eXBlIHByb21vdGlvbi4KKyAgLy8vIFxwIEFsbG93UHJvbW90aW9uV2l0aG91dENvbW1vbkhlYWRlciBTZXQgdHJ1ZSBpZiBwcm9tb3RpbmcgXHAgSSBpcworICAvLy8gcHJvZml0YWJsZSB3aXRob3V0IGZpbmRpbmcgb3RoZXIgZXh0ZW5zaW9ucyBmZWQgYnkgdGhlIHNhbWUgaW5wdXQuCisgIGJvb2wgc2hvdWxkQ29uc2lkZXJBZGRyZXNzVHlwZVByb21vdGlvbigKKyAgICAgIGNvbnN0IEluc3RydWN0aW9uICZJLCBib29sICZBbGxvd1Byb21vdGlvbldpdGhvdXRDb21tb25IZWFkZXIpIGNvbnN0OworCisgIC8vLyBccmV0dXJuIFRoZSBzaXplIG9mIGEgY2FjaGUgbGluZSBpbiBieXRlcy4KKyAgdW5zaWduZWQgZ2V0Q2FjaGVMaW5lU2l6ZSgpIGNvbnN0OworCisgIC8vLyBUaGUgcG9zc2libGUgY2FjaGUgbGV2ZWxzCisgIGVudW0gY2xhc3MgQ2FjaGVMZXZlbCB7CisgICAgTDFELCAgIC8vIFRoZSBMMSBkYXRhIGNhY2hlCisgICAgTDJELCAgIC8vIFRoZSBMMiBkYXRhIGNhY2hlCisKKyAgICAvLyBXZSBjdXJyZW50bHkgZG8gbm90IG1vZGVsIEwzIGNhY2hlcywgYXMgdGhlaXIgc2l6ZXMgZGlmZmVyIHdpZGVseSBiZXR3ZWVuCisgICAgLy8gbWljcm9hcmNoaXRlY3R1cmVzLiBBbHNvLCB3ZSBjdXJyZW50bHkgZG8gbm90IGhhdmUgYSB1c2UgZm9yIEwzIGNhY2hlCisgICAgLy8gc2l6ZSBtb2RlbGluZyB5ZXQuCisgIH07CisKKyAgLy8vIFxyZXR1cm4gVGhlIHNpemUgb2YgdGhlIGNhY2hlIGxldmVsIGluIGJ5dGVzLCBpZiBhdmFpbGFibGUuCisgIGxsdm06Ok9wdGlvbmFsPHVuc2lnbmVkPiBnZXRDYWNoZVNpemUoQ2FjaGVMZXZlbCBMZXZlbCkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm4gVGhlIGFzc29jaWF0aXZpdHkgb2YgdGhlIGNhY2hlIGxldmVsLCBpZiBhdmFpbGFibGUuCisgIGxsdm06Ok9wdGlvbmFsPHVuc2lnbmVkPiBnZXRDYWNoZUFzc29jaWF0aXZpdHkoQ2FjaGVMZXZlbCBMZXZlbCkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm4gSG93IG11Y2ggYmVmb3JlIGEgbG9hZCB3ZSBzaG91bGQgcGxhY2UgdGhlIHByZWZldGNoIGluc3RydWN0aW9uLgorICAvLy8gVGhpcyBpcyBjdXJyZW50bHkgbWVhc3VyZWQgaW4gbnVtYmVyIG9mIGluc3RydWN0aW9ucy4KKyAgdW5zaWduZWQgZ2V0UHJlZmV0Y2hEaXN0YW5jZSgpIGNvbnN0OworCisgIC8vLyBccmV0dXJuIFNvbWUgSFcgcHJlZmV0Y2hlcnMgY2FuIGhhbmRsZSBhY2Nlc3NlcyB1cCB0byBhIGNlcnRhaW4gY29uc3RhbnQKKyAgLy8vIHN0cmlkZS4gIFRoaXMgaXMgdGhlIG1pbmltdW0gc3RyaWRlIGluIGJ5dGVzIHdoZXJlIGl0IG1ha2VzIHNlbnNlIHRvIHN0YXJ0CisgIC8vLyBhZGRpbmcgU1cgcHJlZmV0Y2hlcy4gIFRoZSBkZWZhdWx0IGlzIDEsIGkuZS4gcHJlZmV0Y2ggd2l0aCBhbnkgc3RyaWRlLgorICB1bnNpZ25lZCBnZXRNaW5QcmVmZXRjaFN0cmlkZSgpIGNvbnN0OworCisgIC8vLyBccmV0dXJuIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHByZWZldGNoIGFoZWFkLiAgSWYgdGhlCisgIC8vLyByZXF1aXJlZCBudW1iZXIgb2YgaXRlcmF0aW9ucyBpcyBtb3JlIHRoYW4gdGhpcyBudW1iZXIsIG5vIHByZWZldGNoaW5nIGlzCisgIC8vLyBwZXJmb3JtZWQuCisgIHVuc2lnbmVkIGdldE1heFByZWZldGNoSXRlcmF0aW9uc0FoZWFkKCkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm4gVGhlIG1heGltdW0gaW50ZXJsZWF2ZSBmYWN0b3IgdGhhdCBhbnkgdHJhbnNmb3JtIHNob3VsZCB0cnkgdG8KKyAgLy8vIHBlcmZvcm0gZm9yIHRoaXMgdGFyZ2V0LiBUaGlzIG51bWJlciBkZXBlbmRzIG9uIHRoZSBsZXZlbCBvZiBwYXJhbGxlbGlzbQorICAvLy8gYW5kIHRoZSBudW1iZXIgb2YgZXhlY3V0aW9uIHVuaXRzIGluIHRoZSBDUFUuCisgIHVuc2lnbmVkIGdldE1heEludGVybGVhdmVGYWN0b3IodW5zaWduZWQgVkYpIGNvbnN0OworCisgIC8vLyBUaGlzIGlzIGFuIGFwcHJveGltYXRpb24gb2YgcmVjaXByb2NhbCB0aHJvdWdocHV0IG9mIGEgbWF0aC9sb2dpYyBvcC4KKyAgLy8vIEEgaGlnaGVyIGNvc3QgaW5kaWNhdGVzIGxlc3MgZXhwZWN0ZWQgdGhyb3VnaHB1dC4KKyAgLy8vIEZyb20gQWduZXIgRm9nJ3MgZ3VpZGVzLCByZWNpcHJvY2FsIHRocm91Z2hwdXQgaXMgInRoZSBhdmVyYWdlIG51bWJlciBvZgorICAvLy8gY2xvY2sgY3ljbGVzIHBlciBpbnN0cnVjdGlvbiB3aGVuIHRoZSBpbnN0cnVjdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIGEKKyAgLy8vIGxpbWl0aW5nIGRlcGVuZGVuY3kgY2hhaW4uIgorICAvLy8gVGhlcmVmb3JlLCBjb3N0cyBzaG91bGQgYmUgc2NhbGVkIHRvIGFjY291bnQgZm9yIG11bHRpcGxlIGV4ZWN1dGlvbiB1bml0cworICAvLy8gb24gdGhlIHRhcmdldCB0aGF0IGNhbiBwcm9jZXNzIHRoaXMgdHlwZSBvZiBpbnN0cnVjdGlvbi4gRm9yIGV4YW1wbGUsIGlmCisgIC8vLyB0aGVyZSBhcmUgNSBzY2FsYXIgaW50ZWdlciB1bml0cyBhbmQgMiB2ZWN0b3IgaW50ZWdlciB1bml0cyB0aGF0IGNhbgorICAvLy8gY2FsY3VsYXRlIGFuICdhZGQnIGluIGEgc2luZ2xlIGN5Y2xlLCB0aGlzIG1vZGVsIHNob3VsZCBpbmRpY2F0ZSB0aGF0IHRoZQorICAvLy8gY29zdCBvZiB0aGUgdmVjdG9yIGFkZCBpbnN0cnVjdGlvbiBpcyAyLjUgdGltZXMgdGhlIGNvc3Qgb2YgdGhlIHNjYWxhcgorICAvLy8gYWRkIGluc3RydWN0aW9uLgorICAvLy8gXHAgQXJncyBpcyBhbiBvcHRpb25hbCBhcmd1bWVudCB3aGljaCBob2xkcyB0aGUgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMKKyAgLy8vIHZhbHVlcyBzbyB0aGUgVFRJIGNhbiBhbmFseXplIHRob3NlIHZhbHVlcyBzZWFyY2hpbmcgZm9yIHNwZWNpYWwKKyAgLy8vIGNhc2VzIG9yIG9wdGltaXphdGlvbnMgYmFzZWQgb24gdGhvc2UgdmFsdWVzLgorICBpbnQgZ2V0QXJpdGhtZXRpY0luc3RyQ29zdCgKKyAgICAgIHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVHksIE9wZXJhbmRWYWx1ZUtpbmQgT3BkMUluZm8gPSBPS19BbnlWYWx1ZSwKKyAgICAgIE9wZXJhbmRWYWx1ZUtpbmQgT3BkMkluZm8gPSBPS19BbnlWYWx1ZSwKKyAgICAgIE9wZXJhbmRWYWx1ZVByb3BlcnRpZXMgT3BkMVByb3BJbmZvID0gT1BfTm9uZSwKKyAgICAgIE9wZXJhbmRWYWx1ZVByb3BlcnRpZXMgT3BkMlByb3BJbmZvID0gT1BfTm9uZSwKKyAgICAgIEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IEFyZ3MgPSBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPigpKSBjb25zdDsKKworICAvLy8gXHJldHVybiBUaGUgY29zdCBvZiBhIHNodWZmbGUgaW5zdHJ1Y3Rpb24gb2Yga2luZCBLaW5kIGFuZCBvZiB0eXBlIFRwLgorICAvLy8gVGhlIGluZGV4IGFuZCBzdWJ0eXBlIHBhcmFtZXRlcnMgYXJlIHVzZWQgYnkgdGhlIHN1YnZlY3RvciBpbnNlcnRpb24gYW5kCisgIC8vLyBleHRyYWN0aW9uIHNodWZmbGUga2luZHMuCisgIGludCBnZXRTaHVmZmxlQ29zdChTaHVmZmxlS2luZCBLaW5kLCBUeXBlICpUcCwgaW50IEluZGV4ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgIFR5cGUgKlN1YlRwID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm4gVGhlIGV4cGVjdGVkIGNvc3Qgb2YgY2FzdCBpbnN0cnVjdGlvbnMsIHN1Y2ggYXMgYml0Y2FzdCwgdHJ1bmMsCisgIC8vLyB6ZXh0LCBldGMuIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGluc3RydWN0aW9uIHRoYXQgaG9sZHMgT3Bjb2RlLCBpdAorICAvLy8gbWF5IGJlIHBhc3NlZCBpbiB0aGUgJ0knIHBhcmFtZXRlci4KKyAgaW50IGdldENhc3RJbnN0ckNvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpEc3QsIFR5cGUgKlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkkgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gXHJldHVybiBUaGUgZXhwZWN0ZWQgY29zdCBvZiBhIHNpZ24tIG9yIHplcm8tZXh0ZW5kZWQgdmVjdG9yIGV4dHJhY3QuIFVzZQorICAvLy8gLTEgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5kZXggdmFsdWUuCisgIGludCBnZXRFeHRyYWN0V2l0aEV4dGVuZENvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpEc3QsIFZlY3RvclR5cGUgKlZlY1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGV4ID0gLTEpIGNvbnN0OworCisgIC8vLyBccmV0dXJuIFRoZSBleHBlY3RlZCBjb3N0IG9mIGNvbnRyb2wtZmxvdyByZWxhdGVkIGluc3RydWN0aW9ucyBzdWNoIGFzCisgIC8vLyBQaGksIFJldCwgQnIuCisgIGludCBnZXRDRkluc3RyQ29zdCh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0OworCisgIC8vLyBccmV0dXJucyBUaGUgZXhwZWN0ZWQgY29zdCBvZiBjb21wYXJlIGFuZCBzZWxlY3QgaW5zdHJ1Y3Rpb25zLiBJZiB0aGVyZQorICAvLy8gaXMgYW4gZXhpc3RpbmcgaW5zdHJ1Y3Rpb24gdGhhdCBob2xkcyBPcGNvZGUsIGl0IG1heSBiZSBwYXNzZWQgaW4gdGhlCisgIC8vLyAnSScgcGFyYW1ldGVyLgorICBpbnQgZ2V0Q21wU2VsSW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVmFsVHksCisgICAgICAgICAgICAgICAgIFR5cGUgKkNvbmRUeSA9IG51bGxwdHIsIGNvbnN0IEluc3RydWN0aW9uICpJID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm4gVGhlIGV4cGVjdGVkIGNvc3Qgb2YgdmVjdG9yIEluc2VydCBhbmQgRXh0cmFjdC4KKyAgLy8vIFVzZSAtMSB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIGluZm9ybWF0aW9uIG9uIHRoZSBpbmRleCB2YWx1ZS4KKyAgaW50IGdldFZlY3Rvckluc3RyQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlZhbCwgdW5zaWduZWQgSW5kZXggPSAtMSkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm4gVGhlIGNvc3Qgb2YgTG9hZCBhbmQgU3RvcmUgaW5zdHJ1Y3Rpb25zLgorICBpbnQgZ2V0TWVtb3J5T3BDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqU3JjLCB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkcmVzc1NwYWNlLCBjb25zdCBJbnN0cnVjdGlvbiAqSSA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBccmV0dXJuIFRoZSBjb3N0IG9mIG1hc2tlZCBMb2FkIGFuZCBTdG9yZSBpbnN0cnVjdGlvbnMuCisgIGludCBnZXRNYXNrZWRNZW1vcnlPcENvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpTcmMsIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyZXNzU3BhY2UpIGNvbnN0OworCisgIC8vLyBccmV0dXJuIFRoZSBjb3N0IG9mIEdhdGhlciBvciBTY2F0dGVyIG9wZXJhdGlvbgorICAvLy8gXHAgT3Bjb2RlIC0gaXMgYSB0eXBlIG9mIG1lbW9yeSBhY2Nlc3MgTG9hZCBvciBTdG9yZQorICAvLy8gXHAgRGF0YVR5IC0gYSB2ZWN0b3IgdHlwZSBvZiB0aGUgZGF0YSB0byBiZSBsb2FkZWQgb3Igc3RvcmVkCisgIC8vLyBccCBQdHIgLSBwb2ludGVyIFtvciB2ZWN0b3Igb2YgcG9pbnRlcnNdIC0gYWRkcmVzc1tlc10gaW4gbWVtb3J5CisgIC8vLyBccCBWYXJpYWJsZU1hc2sgLSB0cnVlIHdoZW4gdGhlIG1lbW9yeSBhY2Nlc3MgaXMgcHJlZGljYXRlZCB3aXRoIGEgbWFzaworICAvLy8gICAgICAgICAgICAgICAgICAgdGhhdCBpcyBub3QgYSBjb21waWxlLXRpbWUgY29uc3RhbnQKKyAgLy8vIFxwIEFsaWdubWVudCAtIGFsaWdubWVudCBvZiBzaW5nbGUgZWxlbWVudAorICBpbnQgZ2V0R2F0aGVyU2NhdHRlck9wQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKkRhdGFUeSwgVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWYXJpYWJsZU1hc2ssIHVuc2lnbmVkIEFsaWdubWVudCkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm4gVGhlIGNvc3Qgb2YgdGhlIGludGVybGVhdmVkIG1lbW9yeSBvcGVyYXRpb24uCisgIC8vLyBccCBPcGNvZGUgaXMgdGhlIG1lbW9yeSBvcGVyYXRpb24gY29kZQorICAvLy8gXHAgVmVjVHkgaXMgdGhlIHZlY3RvciB0eXBlIG9mIHRoZSBpbnRlcmxlYXZlZCBhY2Nlc3MuCisgIC8vLyBccCBGYWN0b3IgaXMgdGhlIGludGVybGVhdmUgZmFjdG9yCisgIC8vLyBccCBJbmRpY2VzIGlzIHRoZSBpbmRpY2VzIGZvciBpbnRlcmxlYXZlZCBsb2FkIG1lbWJlcnMgKGFzIGludGVybGVhdmVkCisgIC8vLyAgICBsb2FkIGFsbG93cyBnYXBzKQorICAvLy8gXHAgQWxpZ25tZW50IGlzIHRoZSBhbGlnbm1lbnQgb2YgdGhlIG1lbW9yeSBvcGVyYXRpb24KKyAgLy8vIFxwIEFkZHJlc3NTcGFjZSBpcyBhZGRyZXNzIHNwYWNlIG9mIHRoZSBwb2ludGVyLgorICBpbnQgZ2V0SW50ZXJsZWF2ZWRNZW1vcnlPcENvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpWZWNUeSwgdW5zaWduZWQgRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IEluZGljZXMsIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDYWxjdWxhdGUgdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyBhIHZlY3RvciByZWR1Y3Rpb24uCisgIC8vLworICAvLy8gVGhpcyBpcyB0aGUgY29zdCBvZiByZWR1Y2luZyB0aGUgdmVjdG9yIHZhbHVlIG9mIHR5cGUgXHAgVHkgdG8gYSBzY2FsYXIKKyAgLy8vIHZhbHVlIHVzaW5nIHRoZSBvcGVyYXRpb24gZGVub3RlZCBieSBccCBPcGNvZGUuIFRoZSBmb3JtIG9mIHRoZSByZWR1Y3Rpb24KKyAgLy8vIGNhbiBlaXRoZXIgYmUgYSBwYWlyd2lzZSByZWR1Y3Rpb24gb3IgYSByZWR1Y3Rpb24gdGhhdCBzcGxpdHMgdGhlIHZlY3RvcgorICAvLy8gYXQgZXZlcnkgcmVkdWN0aW9uIGxldmVsLgorICAvLy8KKyAgLy8vIFBhaXJ3aXNlOgorICAvLy8gICh2MCwgdjEsIHYyLCB2MykKKyAgLy8vICAoKHYwK3YxKSwgKHYyK3YzKSwgdW5kZWYsIHVuZGVmKQorICAvLy8gU3BsaXQ6CisgIC8vLyAgKHYwLCB2MSwgdjIsIHYzKQorICAvLy8gICgodjArdjIpLCAodjErdjMpLCB1bmRlZiwgdW5kZWYpCisgIGludCBnZXRBcml0aG1ldGljUmVkdWN0aW9uQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1BhaXJ3aXNlRm9ybSkgY29uc3Q7CisgIGludCBnZXRNaW5NYXhSZWR1Y3Rpb25Db3N0KFR5cGUgKlR5LCBUeXBlICpDb25kVHksIGJvb2wgSXNQYWlyd2lzZUZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNVbnNpZ25lZCkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIFRoZSBjb3N0IG9mIEludHJpbnNpYyBpbnN0cnVjdGlvbnMuIEFuYWx5c2VzIHRoZSByZWFsIGFyZ3VtZW50cy4KKyAgLy8vIFRocmVlIGNhc2VzIGFyZSBoYW5kbGVkOiAxLiBzY2FsYXIgaW5zdHJ1Y3Rpb24gMi4gdmVjdG9yIGluc3RydWN0aW9uCisgIC8vLyAzLiBzY2FsYXIgaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgdG8gYmUgdmVjdG9yaXplZCB3aXRoIFZGLgorICBpbnQgZ2V0SW50cmluc2ljSW5zdHJDb3N0KEludHJpbnNpYzo6SUQgSUQsIFR5cGUgKlJldFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsIEZhc3RNYXRoRmxhZ3MgRk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZGID0gMSkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIFRoZSBjb3N0IG9mIEludHJpbnNpYyBpbnN0cnVjdGlvbnMuIFR5cGVzIGFuYWx5c2lzIG9ubHkuCisgIC8vLyBJZiBTY2FsYXJpemF0aW9uQ29zdFBhc3NlZCBpcyBVSU5UX01BWCwgdGhlIGNvc3Qgb2Ygc2NhbGFyaXppbmcgdGhlCisgIC8vLyBhcmd1bWVudHMgYW5kIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBjb21wdXRlZCBiYXNlZCBvbiB0eXBlcy4KKyAgaW50IGdldEludHJpbnNpY0luc3RyQ29zdChJbnRyaW5zaWM6OklEIElELCBUeXBlICpSZXRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUeXBlICo+IFR5cywgRmFzdE1hdGhGbGFncyBGTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2NhbGFyaXphdGlvbkNvc3RQYXNzZWQgPSBVSU5UX01BWCkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIFRoZSBjb3N0IG9mIENhbGwgaW5zdHJ1Y3Rpb25zLgorICBpbnQgZ2V0Q2FsbEluc3RyQ29zdChGdW5jdGlvbiAqRiwgVHlwZSAqUmV0VHksIEFycmF5UmVmPFR5cGUgKj4gVHlzKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgVGhlIG51bWJlciBvZiBwaWVjZXMgaW50byB3aGljaCB0aGUgcHJvdmlkZWQgdHlwZSBtdXN0IGJlCisgIC8vLyBzcGxpdCBkdXJpbmcgbGVnYWxpemF0aW9uLiBaZXJvIGlzIHJldHVybmVkIHdoZW4gdGhlIGFuc3dlciBpcyB1bmtub3duLgorICB1bnNpZ25lZCBnZXROdW1iZXJPZlBhcnRzKFR5cGUgKlRwKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgVGhlIGNvc3Qgb2YgdGhlIGFkZHJlc3MgY29tcHV0YXRpb24uIEZvciBtb3N0IHRhcmdldHMgdGhpcyBjYW4gYmUKKyAgLy8vIG1lcmdlZCBpbnRvIHRoZSBpbnN0cnVjdGlvbiBpbmRleGluZyBtb2RlLiBTb21lIHRhcmdldHMgbWlnaHQgd2FudCB0bworICAvLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhZGRyZXNzIGNvbXB1dGF0aW9uIGZvciBtZW1vcnkgb3BlcmF0aW9ucyBvbiB2ZWN0b3IKKyAgLy8vIHR5cGVzIGFuZCBzY2FsYXIgdHlwZXMuIFN1Y2ggdGFyZ2V0cyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbi4KKyAgLy8vIFRoZSAnU0UnIHBhcmFtZXRlciBob2xkcyBwb2ludGVyIGZvciB0aGUgc2NhbGFyIGV2b2x1dGlvbiBvYmplY3Qgd2hpY2gKKyAgLy8vIGlzIHVzZWQgaW4gb3JkZXIgdG8gZ2V0IHRoZSBQdHIgc3RlcCB2YWx1ZSBpbiBjYXNlIG9mIGNvbnN0YW50IHN0cmlkZS4KKyAgLy8vIFRoZSAnUHRyJyBwYXJhbWV0ZXIgaG9sZHMgU0NFViBvZiB0aGUgYWNjZXNzIHBvaW50ZXIuCisgIGludCBnZXRBZGRyZXNzQ29tcHV0YXRpb25Db3N0KFR5cGUgKlR5LCBTY2FsYXJFdm9sdXRpb24gKlNFID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqUHRyID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIFRoZSBjb3N0LCBpZiBhbnksIG9mIGtlZXBpbmcgdmFsdWVzIG9mIHRoZSBnaXZlbiB0eXBlcyBhbGl2ZQorICAvLy8gb3ZlciBhIGNhbGxzaXRlLgorICAvLy8KKyAgLy8vIFNvbWUgdHlwZXMgbWF5IHJlcXVpcmUgdGhlIHVzZSBvZiByZWdpc3RlciBjbGFzc2VzIHRoYXQgZG8gbm90IGhhdmUKKyAgLy8vIGFueSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzLCBzbyB3b3VsZCByZXF1aXJlIGEgc3BpbGwgYW5kIGZpbGwuCisgIHVuc2lnbmVkIGdldENvc3RPZktlZXBpbmdMaXZlT3ZlckNhbGwoQXJyYXlSZWY8VHlwZSAqPiBUeXMpIGNvbnN0OworCisgIC8vLyBccmV0dXJucyBUcnVlIGlmIHRoZSBpbnRyaW5zaWMgaXMgYSBzdXBwb3J0ZWQgbWVtb3J5IGludHJpbnNpYy4gIEluZm8KKyAgLy8vIHdpbGwgY29udGFpbiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIC0gd2hldGhlciB0aGUgaW50cmluc2ljIG1heSB3cml0ZQorICAvLy8gb3IgcmVhZCB0byBtZW1vcnksIHZvbGF0aWxpdHkgYW5kIHRoZSBwb2ludGVyLiAgSW5mbyBpcyB1bmRlZmluZWQKKyAgLy8vIGlmIGZhbHNlIGlzIHJldHVybmVkLgorICBib29sIGdldFRndE1lbUludHJpbnNpYyhJbnRyaW5zaWNJbnN0ICpJbnN0LCBNZW1JbnRyaW5zaWNJbmZvICZJbmZvKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgVGhlIG1heGltdW0gZWxlbWVudCBzaXplLCBpbiBieXRlcywgZm9yIGFuIGVsZW1lbnQKKyAgLy8vIHVub3JkZXJlZC1hdG9taWMgbWVtb3J5IGludHJpbnNpYy4KKyAgdW5zaWduZWQgZ2V0QXRvbWljTWVtSW50cmluc2ljTWF4RWxlbWVudFNpemUoKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgQSB2YWx1ZSB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBnaXZlbiBtZW1vcnkgaW50cmluc2ljLiAgTmV3CisgIC8vLyBpbnN0cnVjdGlvbnMgbWF5IGJlIGNyZWF0ZWQgdG8gZXh0cmFjdCB0aGUgcmVzdWx0IGZyb20gdGhlIGdpdmVuIGludHJpbnNpYworICAvLy8gbWVtb3J5IG9wZXJhdGlvbi4gIFJldHVybnMgbnVsbHB0ciBpZiB0aGUgdGFyZ2V0IGNhbm5vdCBjcmVhdGUgYSByZXN1bHQKKyAgLy8vIGZyb20gdGhlIGdpdmVuIGludHJpbnNpYy4KKyAgVmFsdWUgKmdldE9yQ3JlYXRlUmVzdWx0RnJvbU1lbUludHJpbnNpYyhJbnRyaW5zaWNJbnN0ICpJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKkV4cGVjdGVkVHlwZSkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIFRoZSB0eXBlIHRvIHVzZSBpbiBhIGxvb3AgZXhwYW5zaW9uIG9mIGEgbWVtY3B5IGNhbGwuCisgIFR5cGUgKmdldE1lbWNweUxvb3BMb3dlcmluZ1R5cGUoTExWTUNvbnRleHQgJkNvbnRleHQsIFZhbHVlICpMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjQWxpZ24sIHVuc2lnbmVkIERlc3RBbGlnbikgY29uc3Q7CisKKyAgLy8vIFxwYXJhbVtvdXRdIE9wc091dCBUaGUgb3BlcmFuZCB0eXBlcyB0byBjb3B5IFJlbWFpbmluZ0J5dGVzIG9mIG1lbW9yeS4KKyAgLy8vIFxwYXJhbSBSZW1haW5pbmdCeXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCisgIC8vLworICAvLy8gQ2FsY3VsYXRlcyB0aGUgb3BlcmFuZCB0eXBlcyB0byB1c2Ugd2hlbiBjb3B5aW5nIFxwIFJlbWFpbmluZ0J5dGVzIG9mCisgIC8vLyBtZW1vcnksIHdoZXJlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWxpZ25tZW50cyBhcmUgXHAgU3JjQWxpZ24gYW5kCisgIC8vLyBccCBEZXN0QWxpZ24gcmVzcGVjdGl2ZWx5LgorICB2b2lkIGdldE1lbWNweUxvb3BSZXNpZHVhbExvd2VyaW5nVHlwZShTbWFsbFZlY3RvckltcGw8VHlwZSAqPiAmT3BzT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVtYWluaW5nQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY0FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0QWxpZ24pIGNvbnN0OworCisgIC8vLyBccmV0dXJucyBUcnVlIGlmIHRoZSB0d28gZnVuY3Rpb25zIGhhdmUgY29tcGF0aWJsZSBhdHRyaWJ1dGVzIGZvciBpbmxpbmluZworICAvLy8gcHVycG9zZXMuCisgIGJvb2wgYXJlSW5saW5lQ29tcGF0aWJsZShjb25zdCBGdW5jdGlvbiAqQ2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb24gKkNhbGxlZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUaGUgdHlwZSBvZiBsb2FkL3N0b3JlIGluZGV4aW5nLgorICBlbnVtIE1lbUluZGV4ZWRNb2RlIHsKKyAgICBNSU1fVW5pbmRleGVkLCAgLy8vPCBObyBpbmRleGluZy4KKyAgICBNSU1fUHJlSW5jLCAgICAgLy8vPCBQcmUtaW5jcmVtZW50aW5nLgorICAgIE1JTV9QcmVEZWMsICAgICAvLy88IFByZS1kZWNyZW1lbnRpbmcuCisgICAgTUlNX1Bvc3RJbmMsICAgIC8vLzwgUG9zdC1pbmNyZW1lbnRpbmcuCisgICAgTUlNX1Bvc3REZWMgICAgIC8vLzwgUG9zdC1kZWNyZW1lbnRpbmcuCisgIH07CisKKyAgLy8vIFxyZXR1cm5zIFRydWUgaWYgdGhlIHNwZWNpZmllZCBpbmRleGVkIGxvYWQgZm9yIHRoZSBnaXZlbiB0eXBlIGlzIGxlZ2FsLgorICBib29sIGlzSW5kZXhlZExvYWRMZWdhbChlbnVtIE1lbUluZGV4ZWRNb2RlIE1vZGUsIFR5cGUgKlR5KSBjb25zdDsKKworICAvLy8gXHJldHVybnMgVHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluZGV4ZWQgc3RvcmUgZm9yIHRoZSBnaXZlbiB0eXBlIGlzIGxlZ2FsLgorICBib29sIGlzSW5kZXhlZFN0b3JlTGVnYWwoZW51bSBNZW1JbmRleGVkTW9kZSBNb2RlLCBUeXBlICpUeSkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIFRoZSBiaXR3aWR0aCBvZiB0aGUgbGFyZ2VzdCB2ZWN0b3IgdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvCisgIC8vLyBsb2FkL3N0b3JlIGluIHRoZSBnaXZlbiBhZGRyZXNzIHNwYWNlLgorICB1bnNpZ25lZCBnZXRMb2FkU3RvcmVWZWNSZWdCaXRXaWR0aCh1bnNpZ25lZCBBZGRyU3BhY2UpIGNvbnN0OworCisgIC8vLyBccmV0dXJucyBUcnVlIGlmIHRoZSBsb2FkIGluc3RydWN0aW9uIGlzIGxlZ2FsIHRvIHZlY3Rvcml6ZS4KKyAgYm9vbCBpc0xlZ2FsVG9WZWN0b3JpemVMb2FkKExvYWRJbnN0ICpMSSkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIFRydWUgaWYgdGhlIHN0b3JlIGluc3RydWN0aW9uIGlzIGxlZ2FsIHRvIHZlY3Rvcml6ZS4KKyAgYm9vbCBpc0xlZ2FsVG9WZWN0b3JpemVTdG9yZShTdG9yZUluc3QgKlNJKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgVHJ1ZSBpZiBpdCBpcyBsZWdhbCB0byB2ZWN0b3JpemUgdGhlIGdpdmVuIGxvYWQgY2hhaW4uCisgIGJvb2wgaXNMZWdhbFRvVmVjdG9yaXplTG9hZENoYWluKHVuc2lnbmVkIENoYWluU2l6ZUluQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkclNwYWNlKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgVHJ1ZSBpZiBpdCBpcyBsZWdhbCB0byB2ZWN0b3JpemUgdGhlIGdpdmVuIHN0b3JlIGNoYWluLgorICBib29sIGlzTGVnYWxUb1ZlY3Rvcml6ZVN0b3JlQ2hhaW4odW5zaWduZWQgQ2hhaW5TaXplSW5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIFRoZSBuZXcgdmVjdG9yIGZhY3RvciB2YWx1ZSBpZiB0aGUgdGFyZ2V0IGRvZXNuJ3Qgc3VwcG9ydCBccAorICAvLy8gU2l6ZUluQnl0ZXMgbG9hZHMgb3IgaGFzIGEgYmV0dGVyIHZlY3RvciBmYWN0b3IuCisgIHVuc2lnbmVkIGdldExvYWRWZWN0b3JGYWN0b3IodW5zaWduZWQgVkYsIHVuc2lnbmVkIExvYWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENoYWluU2l6ZUluQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZSAqVmVjVHkpIGNvbnN0OworCisgIC8vLyBccmV0dXJucyBUaGUgbmV3IHZlY3RvciBmYWN0b3IgdmFsdWUgaWYgdGhlIHRhcmdldCBkb2Vzbid0IHN1cHBvcnQgXHAKKyAgLy8vIFNpemVJbkJ5dGVzIHN0b3JlcyBvciBoYXMgYSBiZXR0ZXIgdmVjdG9yIGZhY3Rvci4KKyAgdW5zaWduZWQgZ2V0U3RvcmVWZWN0b3JGYWN0b3IodW5zaWduZWQgVkYsIHVuc2lnbmVkIFN0b3JlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2hhaW5TaXplSW5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZSAqVmVjVHkpIGNvbnN0OworCisgIC8vLyBGbGFncyBkZXNjcmliaW5nIHRoZSBraW5kIG9mIHZlY3RvciByZWR1Y3Rpb24uCisgIHN0cnVjdCBSZWR1Y3Rpb25GbGFncyB7CisgICAgUmVkdWN0aW9uRmxhZ3MoKSA6IElzTWF4T3AoZmFsc2UpLCBJc1NpZ25lZChmYWxzZSksIE5vTmFOKGZhbHNlKSB7fQorICAgIGJvb2wgSXNNYXhPcDsgIC8vLzwgSWYgdGhlIG9wIGEgbWluL21heCBraW5kLCB0cnVlIGlmIGl0J3MgYSBtYXggb3BlcmF0aW9uLgorICAgIGJvb2wgSXNTaWduZWQ7IC8vLzwgV2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIGEgc2lnbmVkIGludCByZWR1Y3Rpb24uCisgICAgYm9vbCBOb05hTjsgICAgLy8vPCBJZiBvcCBpcyBhbiBmcCBtaW4vbWF4LCB3aGV0aGVyIE5hTnMgbWF5IGJlIHByZXNlbnQuCisgIH07CisKKyAgLy8vIFxyZXR1cm5zIFRydWUgaWYgdGhlIHRhcmdldCB3YW50cyB0byBoYW5kbGUgdGhlIGdpdmVuIHJlZHVjdGlvbiBpZGlvbSBpbgorICAvLy8gdGhlIGludHJpbnNpY3MgZm9ybSBpbnN0ZWFkIG9mIHRoZSBzaHVmZmxlIGZvcm0uCisgIGJvb2wgdXNlUmVkdWN0aW9uSW50cmluc2ljKHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZHVjdGlvbkZsYWdzIEZsYWdzKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgVHJ1ZSBpZiB0aGUgdGFyZ2V0IHdhbnRzIHRvIGV4cGFuZCB0aGUgZ2l2ZW4gcmVkdWN0aW9uIGludHJpbnNpYworICAvLy8gaW50byBhIHNodWZmbGUgc2VxdWVuY2UuCisgIGJvb2wgc2hvdWxkRXhwYW5kUmVkdWN0aW9uKGNvbnN0IEludHJpbnNpY0luc3QgKklJKSBjb25zdDsKKyAgLy8vIEB9CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgRXN0aW1hdGUgdGhlIGxhdGVuY3kgb2Ygc3BlY2lmaWVkIGluc3RydWN0aW9uLgorICAvLy8gUmV0dXJucyAxIGFzIHRoZSBkZWZhdWx0IHZhbHVlLgorICBpbnQgZ2V0SW5zdHJ1Y3Rpb25MYXRlbmN5KGNvbnN0IEluc3RydWN0aW9uICpJKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGV4cGVjdGVkIHRocm91Z2hwdXQgY29zdCBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgIC8vLyBSZXR1cm5zIC0xIGlmIHRoZSBjb3N0IGlzIHVua25vd24uCisgIGludCBnZXRJbnN0cnVjdGlvblRocm91Z2hwdXQoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgdXNlZCB0byB0eXBlIGVyYXNlIHNwZWNpZmljIFRUSQorICAvLy8gaW1wbGVtZW50YXRpb25zLgorICBjbGFzcyBDb25jZXB0OworCisgIC8vLyBcYnJpZWYgVGhlIHRlbXBsYXRlIG1vZGVsIGZvciB0aGUgYmFzZSBjbGFzcyB3aGljaCB3cmFwcyBhIGNvbmNyZXRlCisgIC8vLyBpbXBsZW1lbnRhdGlvbiBpbiBhIHR5cGUgZXJhc2VkIGludGVyZmFjZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIE1vZGVsOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDb25jZXB0PiBUVElJbXBsOworfTsKKworY2xhc3MgVGFyZ2V0VHJhbnNmb3JtSW5mbzo6Q29uY2VwdCB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkNvbmNlcHQoKSA9IDA7CisgIHZpcnR1YWwgY29uc3QgRGF0YUxheW91dCAmZ2V0RGF0YUxheW91dCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0T3BlcmF0aW9uQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlR5LCBUeXBlICpPcFR5KSA9IDA7CisgIHZpcnR1YWwgaW50IGdldEdFUENvc3QoVHlwZSAqUG9pbnRlZVR5cGUsIGNvbnN0IFZhbHVlICpQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gT3BlcmFuZHMpID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0RXh0Q29zdChjb25zdCBJbnN0cnVjdGlvbiAqSSwgY29uc3QgVmFsdWUgKlNyYykgPSAwOworICB2aXJ0dWFsIGludCBnZXRDYWxsQ29zdChGdW5jdGlvblR5cGUgKkZUeSwgaW50IE51bUFyZ3MpID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0Q2FsbENvc3QoY29uc3QgRnVuY3Rpb24gKkYsIGludCBOdW1BcmdzKSA9IDA7CisgIHZpcnR1YWwgaW50IGdldENhbGxDb3N0KGNvbnN0IEZ1bmN0aW9uICpGLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBBcmd1bWVudHMpID0gMDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRJbmxpbmluZ1RocmVzaG9sZE11bHRpcGxpZXIoKSA9IDA7CisgIHZpcnR1YWwgaW50IGdldEludHJpbnNpY0Nvc3QoSW50cmluc2ljOjpJRCBJSUQsIFR5cGUgKlJldFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFR5cGUgKj4gUGFyYW1UeXMpID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0SW50cmluc2ljQ29zdChJbnRyaW5zaWM6OklEIElJRCwgVHlwZSAqUmV0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gQXJndW1lbnRzKSA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0RXN0aW1hdGVkTnVtYmVyT2ZDYXNlQ2x1c3RlcnMoY29uc3QgU3dpdGNoSW5zdCAmU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkpUU2l6ZSkgPSAwOworICB2aXJ0dWFsIGludAorICBnZXRVc2VyQ29zdChjb25zdCBVc2VyICpVLCBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBPcGVyYW5kcykgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzQnJhbmNoRGl2ZXJnZW5jZSgpID0gMDsKKyAgdmlydHVhbCBib29sIGlzU291cmNlT2ZEaXZlcmdlbmNlKGNvbnN0IFZhbHVlICpWKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0Fsd2F5c1VuaWZvcm0oY29uc3QgVmFsdWUgKlYpID0gMDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRGbGF0QWRkcmVzc1NwYWNlKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNMb3dlcmVkVG9DYWxsKGNvbnN0IEZ1bmN0aW9uICpGKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBnZXRVbnJvbGxpbmdQcmVmZXJlbmNlcyhMb29wICpMLCBTY2FsYXJFdm9sdXRpb24gJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucm9sbGluZ1ByZWZlcmVuY2VzICZVUCkgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNMZWdhbEFkZEltbWVkaWF0ZShpbnQ2NF90IEltbSkgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNMZWdhbElDbXBJbW1lZGlhdGUoaW50NjRfdCBJbW0pID0gMDsKKyAgdmlydHVhbCBib29sIGlzTGVnYWxBZGRyZXNzaW5nTW9kZShUeXBlICpUeSwgR2xvYmFsVmFsdWUgKkJhc2VHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IEJhc2VPZmZzZXQsIGJvb2wgSGFzQmFzZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSSkgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNMU1JDb3N0TGVzcyhUYXJnZXRUcmFuc2Zvcm1JbmZvOjpMU1JDb3N0ICZDMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0VHJhbnNmb3JtSW5mbzo6TFNSQ29zdCAmQzIpID0gMDsKKyAgdmlydHVhbCBib29sIGNhbk1hY3JvRnVzZUNtcCgpID0gMDsKKyAgdmlydHVhbCBib29sIHNob3VsZEZhdm9yUG9zdEluYygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzTGVnYWxNYXNrZWRTdG9yZShUeXBlICpEYXRhVHlwZSkgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNMZWdhbE1hc2tlZExvYWQoVHlwZSAqRGF0YVR5cGUpID0gMDsKKyAgdmlydHVhbCBib29sIGlzTGVnYWxNYXNrZWRTY2F0dGVyKFR5cGUgKkRhdGFUeXBlKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0xlZ2FsTWFza2VkR2F0aGVyKFR5cGUgKkRhdGFUeXBlKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNEaXZSZW1PcChUeXBlICpEYXRhVHlwZSwgYm9vbCBJc1NpZ25lZCkgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzVm9sYXRpbGVWYXJpYW50KEluc3RydWN0aW9uICpJLCB1bnNpZ25lZCBBZGRyU3BhY2UpID0gMDsKKyAgdmlydHVhbCBib29sIHByZWZlcnNWZWN0b3JpemVkQWRkcmVzc2luZygpID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0U2NhbGluZ0ZhY3RvckNvc3QoVHlwZSAqVHksIEdsb2JhbFZhbHVlICpCYXNlR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgQmFzZU9mZnNldCwgYm9vbCBIYXNCYXNlUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IFNjYWxlLCB1bnNpZ25lZCBBZGRyU3BhY2UpID0gMDsKKyAgdmlydHVhbCBib29sIExTUldpdGhJbnN0clF1ZXJpZXMoKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1RydW5jYXRlRnJlZShUeXBlICpUeTEsIFR5cGUgKlR5MikgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNQcm9maXRhYmxlVG9Ib2lzdChJbnN0cnVjdGlvbiAqSSkgPSAwOworICB2aXJ0dWFsIGJvb2wgdXNlQUEoKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1R5cGVMZWdhbChUeXBlICpUeSkgPSAwOworICB2aXJ0dWFsIHVuc2lnbmVkIGdldEp1bXBCdWZBbGlnbm1lbnQoKSA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SnVtcEJ1ZlNpemUoKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBzaG91bGRCdWlsZExvb2t1cFRhYmxlcygpID0gMDsKKyAgdmlydHVhbCBib29sIHNob3VsZEJ1aWxkTG9va3VwVGFibGVzRm9yQ29uc3RhbnQoQ29uc3RhbnQgKkMpID0gMDsKKyAgdmlydHVhbCBib29sIHVzZUNvbGRDQ0ZvckNvbGRDYWxsKEZ1bmN0aW9uICZGKSA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQKKyAgZ2V0U2NhbGFyaXphdGlvbk92ZXJoZWFkKFR5cGUgKlR5LCBib29sIEluc2VydCwgYm9vbCBFeHRyYWN0KSA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0T3BlcmFuZHNTY2FsYXJpemF0aW9uT3ZlcmhlYWQoQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWRikgPSAwOworICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNFZmZpY2llbnRWZWN0b3JFbGVtZW50TG9hZFN0b3JlKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgZW5hYmxlQWdncmVzc2l2ZUludGVybGVhdmluZyhib29sIExvb3BIYXNSZWR1Y3Rpb25zKSA9IDA7CisgIHZpcnR1YWwgY29uc3QgTWVtQ21wRXhwYW5zaW9uT3B0aW9ucyAqZW5hYmxlTWVtQ21wRXhwYW5zaW9uKAorICAgICAgYm9vbCBJc1plcm9DbXApIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGVuYWJsZUludGVybGVhdmVkQWNjZXNzVmVjdG9yaXphdGlvbigpID0gMDsKKyAgdmlydHVhbCBib29sIGlzRlBWZWN0b3JpemF0aW9uUG90ZW50aWFsbHlVbnNhZmUoKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBhbGxvd3NNaXNhbGlnbmVkTWVtb3J5QWNjZXNzZXMoTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQml0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkcmVzc1NwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpGYXN0KSA9IDA7CisgIHZpcnR1YWwgUG9wY250U3VwcG9ydEtpbmQgZ2V0UG9wY250U3VwcG9ydCh1bnNpZ25lZCBJbnRUeVdpZHRoSW5CaXQpID0gMDsKKyAgdmlydHVhbCBib29sIGhhdmVGYXN0U3FydChUeXBlICpUeSkgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNGQ21wT3JkQ2hlYXBlclRoYW5GQ21wWmVybyhUeXBlICpUeSkgPSAwOworICB2aXJ0dWFsIGludCBnZXRGUE9wQ29zdChUeXBlICpUeSkgPSAwOworICB2aXJ0dWFsIGludCBnZXRJbnRJbW1Db2RlU2l6ZUNvc3QodW5zaWduZWQgT3BjLCB1bnNpZ25lZCBJZHgsIGNvbnN0IEFQSW50ICZJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpUeSkgPSAwOworICB2aXJ0dWFsIGludCBnZXRJbnRJbW1Db3N0KGNvbnN0IEFQSW50ICZJbW0sIFR5cGUgKlR5KSA9IDA7CisgIHZpcnR1YWwgaW50IGdldEludEltbUNvc3QodW5zaWduZWQgT3BjLCB1bnNpZ25lZCBJZHgsIGNvbnN0IEFQSW50ICZJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqVHkpID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0SW50SW1tQ29zdChJbnRyaW5zaWM6OklEIElJRCwgdW5zaWduZWQgSWR4LCBjb25zdCBBUEludCAmSW1tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKlR5KSA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TnVtYmVyT2ZSZWdpc3RlcnMoYm9vbCBWZWN0b3IpID0gMDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRSZWdpc3RlckJpdFdpZHRoKGJvb2wgVmVjdG9yKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TWluVmVjdG9yUmVnaXN0ZXJCaXRXaWR0aCgpID0gMDsKKyAgdmlydHVhbCBib29sIHNob3VsZE1heGltaXplVmVjdG9yQmFuZHdpZHRoKGJvb2wgT3B0U2l6ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgc2hvdWxkQ29uc2lkZXJBZGRyZXNzVHlwZVByb21vdGlvbigKKyAgICAgIGNvbnN0IEluc3RydWN0aW9uICZJLCBib29sICZBbGxvd1Byb21vdGlvbldpdGhvdXRDb21tb25IZWFkZXIpID0gMDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRDYWNoZUxpbmVTaXplKCkgPSAwOworICB2aXJ0dWFsIGxsdm06Ok9wdGlvbmFsPHVuc2lnbmVkPiBnZXRDYWNoZVNpemUoQ2FjaGVMZXZlbCBMZXZlbCkgPSAwOworICB2aXJ0dWFsIGxsdm06Ok9wdGlvbmFsPHVuc2lnbmVkPiBnZXRDYWNoZUFzc29jaWF0aXZpdHkoQ2FjaGVMZXZlbCBMZXZlbCkgPSAwOworICB2aXJ0dWFsIHVuc2lnbmVkIGdldFByZWZldGNoRGlzdGFuY2UoKSA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TWluUHJlZmV0Y2hTdHJpZGUoKSA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TWF4UHJlZmV0Y2hJdGVyYXRpb25zQWhlYWQoKSA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TWF4SW50ZXJsZWF2ZUZhY3Rvcih1bnNpZ25lZCBWRikgPSAwOworICB2aXJ0dWFsIHVuc2lnbmVkCisgIGdldEFyaXRobWV0aWNJbnN0ckNvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpUeSwgT3BlcmFuZFZhbHVlS2luZCBPcGQxSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYW5kVmFsdWVLaW5kIE9wZDJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhbmRWYWx1ZVByb3BlcnRpZXMgT3BkMVByb3BJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhbmRWYWx1ZVByb3BlcnRpZXMgT3BkMlByb3BJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IEFyZ3MpID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0U2h1ZmZsZUNvc3QoU2h1ZmZsZUtpbmQgS2luZCwgVHlwZSAqVHAsIGludCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqU3ViVHApID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0Q2FzdEluc3RyQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKkRzdCwgVHlwZSAqU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpJKSA9IDA7CisgIHZpcnR1YWwgaW50IGdldEV4dHJhY3RXaXRoRXh0ZW5kQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKkRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvclR5cGUgKlZlY1R5LCB1bnNpZ25lZCBJbmRleCkgPSAwOworICB2aXJ0dWFsIGludCBnZXRDRkluc3RyQ29zdCh1bnNpZ25lZCBPcGNvZGUpID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0Q21wU2VsSW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVmFsVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKkNvbmRUeSwgY29uc3QgSW5zdHJ1Y3Rpb24gKkkpID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0VmVjdG9ySW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZXgpID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0TWVtb3J5T3BDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqU3JjLCB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyZXNzU3BhY2UsIGNvbnN0IEluc3RydWN0aW9uICpJKSA9IDA7CisgIHZpcnR1YWwgaW50IGdldE1hc2tlZE1lbW9yeU9wQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSkgPSAwOworICB2aXJ0dWFsIGludCBnZXRHYXRoZXJTY2F0dGVyT3BDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqRGF0YVR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpQdHIsIGJvb2wgVmFyaWFibGVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCkgPSAwOworICB2aXJ0dWFsIGludCBnZXRJbnRlcmxlYXZlZE1lbW9yeU9wQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlZlY1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSkgPSAwOworICB2aXJ0dWFsIGludCBnZXRBcml0aG1ldGljUmVkdWN0aW9uQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzUGFpcndpc2VGb3JtKSA9IDA7CisgIHZpcnR1YWwgaW50IGdldE1pbk1heFJlZHVjdGlvbkNvc3QoVHlwZSAqVHksIFR5cGUgKkNvbmRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzUGFpcndpc2VGb3JtLCBib29sIElzVW5zaWduZWQpID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0SW50cmluc2ljSW5zdHJDb3N0KEludHJpbnNpYzo6SUQgSUQsIFR5cGUgKlJldFR5LAorICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFR5cGUgKj4gVHlzLCBGYXN0TWF0aEZsYWdzIEZNRiwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTY2FsYXJpemF0aW9uQ29zdFBhc3NlZCkgPSAwOworICB2aXJ0dWFsIGludCBnZXRJbnRyaW5zaWNJbnN0ckNvc3QoSW50cmluc2ljOjpJRCBJRCwgVHlwZSAqUmV0VHksCisgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLCBGYXN0TWF0aEZsYWdzIEZNRiwgdW5zaWduZWQgVkYpID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0Q2FsbEluc3RyQ29zdChGdW5jdGlvbiAqRiwgVHlwZSAqUmV0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZSAqPiBUeXMpID0gMDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXROdW1iZXJPZlBhcnRzKFR5cGUgKlRwKSA9IDA7CisgIHZpcnR1YWwgaW50IGdldEFkZHJlc3NDb21wdXRhdGlvbkNvc3QoVHlwZSAqVHksIFNjYWxhckV2b2x1dGlvbiAqU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqUHRyKSA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0Q29zdE9mS2VlcGluZ0xpdmVPdmVyQ2FsbChBcnJheVJlZjxUeXBlICo+IFR5cykgPSAwOworICB2aXJ0dWFsIGJvb2wgZ2V0VGd0TWVtSW50cmluc2ljKEludHJpbnNpY0luc3QgKkluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtSW50cmluc2ljSW5mbyAmSW5mbykgPSAwOworICB2aXJ0dWFsIHVuc2lnbmVkIGdldEF0b21pY01lbUludHJpbnNpY01heEVsZW1lbnRTaXplKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIFZhbHVlICpnZXRPckNyZWF0ZVJlc3VsdEZyb21NZW1JbnRyaW5zaWMoSW50cmluc2ljSW5zdCAqSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKkV4cGVjdGVkVHlwZSkgPSAwOworICB2aXJ0dWFsIFR5cGUgKmdldE1lbWNweUxvb3BMb3dlcmluZ1R5cGUoTExWTUNvbnRleHQgJkNvbnRleHQsIFZhbHVlICpMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RBbGlnbikgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgZ2V0TWVtY3B5TG9vcFJlc2lkdWFsTG93ZXJpbmdUeXBlKAorICAgICAgU21hbGxWZWN0b3JJbXBsPFR5cGUgKj4gJk9wc091dCwgTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICB1bnNpZ25lZCBSZW1haW5pbmdCeXRlcywgdW5zaWduZWQgU3JjQWxpZ24sIHVuc2lnbmVkIERlc3RBbGlnbikgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgYXJlSW5saW5lQ29tcGF0aWJsZShjb25zdCBGdW5jdGlvbiAqQ2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiAqQ2FsbGVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0luZGV4ZWRMb2FkTGVnYWwoTWVtSW5kZXhlZE1vZGUgTW9kZSwgVHlwZSAqVHkpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzSW5kZXhlZFN0b3JlTGVnYWwoTWVtSW5kZXhlZE1vZGUgTW9kZSxUeXBlICpUeSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVuc2lnbmVkIGdldExvYWRTdG9yZVZlY1JlZ0JpdFdpZHRoKHVuc2lnbmVkIEFkZHJTcGFjZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNMZWdhbFRvVmVjdG9yaXplTG9hZChMb2FkSW5zdCAqTEkpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzTGVnYWxUb1ZlY3Rvcml6ZVN0b3JlKFN0b3JlSW5zdCAqU0kpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzTGVnYWxUb1ZlY3Rvcml6ZUxvYWRDaGFpbih1bnNpZ25lZCBDaGFpblNpemVJbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzTGVnYWxUb1ZlY3Rvcml6ZVN0b3JlQ2hhaW4odW5zaWduZWQgQ2hhaW5TaXplSW5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRMb2FkVmVjdG9yRmFjdG9yKHVuc2lnbmVkIFZGLCB1bnNpZ25lZCBMb2FkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENoYWluU2l6ZUluQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JUeXBlICpWZWNUeSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVuc2lnbmVkIGdldFN0b3JlVmVjdG9yRmFjdG9yKHVuc2lnbmVkIFZGLCB1bnNpZ25lZCBTdG9yZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2hhaW5TaXplSW5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JUeXBlICpWZWNUeSkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgdXNlUmVkdWN0aW9uSW50cmluc2ljKHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVkdWN0aW9uRmxhZ3MpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIHNob3VsZEV4cGFuZFJlZHVjdGlvbihjb25zdCBJbnRyaW5zaWNJbnN0ICpJSSkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludCBnZXRJbnN0cnVjdGlvbkxhdGVuY3koY29uc3QgSW5zdHJ1Y3Rpb24gKkkpID0gMDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVGFyZ2V0VHJhbnNmb3JtSW5mbzo6TW9kZWwgZmluYWwgOiBwdWJsaWMgVGFyZ2V0VHJhbnNmb3JtSW5mbzo6Q29uY2VwdCB7CisgIFQgSW1wbDsKKworcHVibGljOgorICBNb2RlbChUIEltcGwpIDogSW1wbChzdGQ6Om1vdmUoSW1wbCkpIHt9CisgIH5Nb2RlbCgpIG92ZXJyaWRlIHt9CisKKyAgY29uc3QgRGF0YUxheW91dCAmZ2V0RGF0YUxheW91dCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXREYXRhTGF5b3V0KCk7CisgIH0KKworICBpbnQgZ2V0T3BlcmF0aW9uQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlR5LCBUeXBlICpPcFR5KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0T3BlcmF0aW9uQ29zdChPcGNvZGUsIFR5LCBPcFR5KTsKKyAgfQorICBpbnQgZ2V0R0VQQ29zdChUeXBlICpQb2ludGVlVHlwZSwgY29uc3QgVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gT3BlcmFuZHMpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRHRVBDb3N0KFBvaW50ZWVUeXBlLCBQdHIsIE9wZXJhbmRzKTsKKyAgfQorICBpbnQgZ2V0RXh0Q29zdChjb25zdCBJbnN0cnVjdGlvbiAqSSwgY29uc3QgVmFsdWUgKlNyYykgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldEV4dENvc3QoSSwgU3JjKTsKKyAgfQorICBpbnQgZ2V0Q2FsbENvc3QoRnVuY3Rpb25UeXBlICpGVHksIGludCBOdW1BcmdzKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0Q2FsbENvc3QoRlR5LCBOdW1BcmdzKTsKKyAgfQorICBpbnQgZ2V0Q2FsbENvc3QoY29uc3QgRnVuY3Rpb24gKkYsIGludCBOdW1BcmdzKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0Q2FsbENvc3QoRiwgTnVtQXJncyk7CisgIH0KKyAgaW50IGdldENhbGxDb3N0KGNvbnN0IEZ1bmN0aW9uICpGLAorICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gQXJndW1lbnRzKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0Q2FsbENvc3QoRiwgQXJndW1lbnRzKTsKKyAgfQorICB1bnNpZ25lZCBnZXRJbmxpbmluZ1RocmVzaG9sZE11bHRpcGxpZXIoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0SW5saW5pbmdUaHJlc2hvbGRNdWx0aXBsaWVyKCk7CisgIH0KKyAgaW50IGdldEludHJpbnNpY0Nvc3QoSW50cmluc2ljOjpJRCBJSUQsIFR5cGUgKlJldFR5LAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUeXBlICo+IFBhcmFtVHlzKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0SW50cmluc2ljQ29zdChJSUQsIFJldFR5LCBQYXJhbVR5cyk7CisgIH0KKyAgaW50IGdldEludHJpbnNpY0Nvc3QoSW50cmluc2ljOjpJRCBJSUQsIFR5cGUgKlJldFR5LAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBBcmd1bWVudHMpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRJbnRyaW5zaWNDb3N0KElJRCwgUmV0VHksIEFyZ3VtZW50cyk7CisgIH0KKyAgaW50IGdldFVzZXJDb3N0KGNvbnN0IFVzZXIgKlUsIEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IE9wZXJhbmRzKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0VXNlckNvc3QoVSwgT3BlcmFuZHMpOworICB9CisgIGJvb2wgaGFzQnJhbmNoRGl2ZXJnZW5jZSgpIG92ZXJyaWRlIHsgcmV0dXJuIEltcGwuaGFzQnJhbmNoRGl2ZXJnZW5jZSgpOyB9CisgIGJvb2wgaXNTb3VyY2VPZkRpdmVyZ2VuY2UoY29uc3QgVmFsdWUgKlYpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5pc1NvdXJjZU9mRGl2ZXJnZW5jZShWKTsKKyAgfQorCisgIGJvb2wgaXNBbHdheXNVbmlmb3JtKGNvbnN0IFZhbHVlICpWKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuaXNBbHdheXNVbmlmb3JtKFYpOworICB9CisKKyAgdW5zaWduZWQgZ2V0RmxhdEFkZHJlc3NTcGFjZSgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRGbGF0QWRkcmVzc1NwYWNlKCk7CisgIH0KKworICBib29sIGlzTG93ZXJlZFRvQ2FsbChjb25zdCBGdW5jdGlvbiAqRikgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmlzTG93ZXJlZFRvQ2FsbChGKTsKKyAgfQorICB2b2lkIGdldFVucm9sbGluZ1ByZWZlcmVuY2VzKExvb3AgKkwsIFNjYWxhckV2b2x1dGlvbiAmU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yb2xsaW5nUHJlZmVyZW5jZXMgJlVQKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0VW5yb2xsaW5nUHJlZmVyZW5jZXMoTCwgU0UsIFVQKTsKKyAgfQorICBib29sIGlzTGVnYWxBZGRJbW1lZGlhdGUoaW50NjRfdCBJbW0pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5pc0xlZ2FsQWRkSW1tZWRpYXRlKEltbSk7CisgIH0KKyAgYm9vbCBpc0xlZ2FsSUNtcEltbWVkaWF0ZShpbnQ2NF90IEltbSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmlzTGVnYWxJQ21wSW1tZWRpYXRlKEltbSk7CisgIH0KKyAgYm9vbCBpc0xlZ2FsQWRkcmVzc2luZ01vZGUoVHlwZSAqVHksIEdsb2JhbFZhbHVlICpCYXNlR1YsIGludDY0X3QgQmFzZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNCYXNlUmVnLCBpbnQ2NF90IFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuaXNMZWdhbEFkZHJlc3NpbmdNb2RlKFR5LCBCYXNlR1YsIEJhc2VPZmZzZXQsIEhhc0Jhc2VSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxlLCBBZGRyU3BhY2UsIEkpOworICB9CisgIGJvb2wgaXNMU1JDb3N0TGVzcyhUYXJnZXRUcmFuc2Zvcm1JbmZvOjpMU1JDb3N0ICZDMSwKKyAgICAgICAgICAgICAgICAgICAgIFRhcmdldFRyYW5zZm9ybUluZm86OkxTUkNvc3QgJkMyKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuaXNMU1JDb3N0TGVzcyhDMSwgQzIpOworICB9CisgIGJvb2wgY2FuTWFjcm9GdXNlQ21wKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmNhbk1hY3JvRnVzZUNtcCgpOworICB9CisgIGJvb2wgc2hvdWxkRmF2b3JQb3N0SW5jKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLnNob3VsZEZhdm9yUG9zdEluYygpOworICB9CisgIGJvb2wgaXNMZWdhbE1hc2tlZFN0b3JlKFR5cGUgKkRhdGFUeXBlKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuaXNMZWdhbE1hc2tlZFN0b3JlKERhdGFUeXBlKTsKKyAgfQorICBib29sIGlzTGVnYWxNYXNrZWRMb2FkKFR5cGUgKkRhdGFUeXBlKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuaXNMZWdhbE1hc2tlZExvYWQoRGF0YVR5cGUpOworICB9CisgIGJvb2wgaXNMZWdhbE1hc2tlZFNjYXR0ZXIoVHlwZSAqRGF0YVR5cGUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5pc0xlZ2FsTWFza2VkU2NhdHRlcihEYXRhVHlwZSk7CisgIH0KKyAgYm9vbCBpc0xlZ2FsTWFza2VkR2F0aGVyKFR5cGUgKkRhdGFUeXBlKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuaXNMZWdhbE1hc2tlZEdhdGhlcihEYXRhVHlwZSk7CisgIH0KKyAgYm9vbCBoYXNEaXZSZW1PcChUeXBlICpEYXRhVHlwZSwgYm9vbCBJc1NpZ25lZCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmhhc0RpdlJlbU9wKERhdGFUeXBlLCBJc1NpZ25lZCk7CisgIH0KKyAgYm9vbCBoYXNWb2xhdGlsZVZhcmlhbnQoSW5zdHJ1Y3Rpb24gKkksIHVuc2lnbmVkIEFkZHJTcGFjZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmhhc1ZvbGF0aWxlVmFyaWFudChJLCBBZGRyU3BhY2UpOworICB9CisgIGJvb2wgcHJlZmVyc1ZlY3Rvcml6ZWRBZGRyZXNzaW5nKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLnByZWZlcnNWZWN0b3JpemVkQWRkcmVzc2luZygpOworICB9CisgIGludCBnZXRTY2FsaW5nRmFjdG9yQ29zdChUeXBlICpUeSwgR2xvYmFsVmFsdWUgKkJhc2VHViwgaW50NjRfdCBCYXNlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNCYXNlUmVnLCBpbnQ2NF90IFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkclNwYWNlKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0U2NhbGluZ0ZhY3RvckNvc3QoVHksIEJhc2VHViwgQmFzZU9mZnNldCwgSGFzQmFzZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsZSwgQWRkclNwYWNlKTsKKyAgfQorICBib29sIExTUldpdGhJbnN0clF1ZXJpZXMoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuTFNSV2l0aEluc3RyUXVlcmllcygpOworICB9CisgIGJvb2wgaXNUcnVuY2F0ZUZyZWUoVHlwZSAqVHkxLCBUeXBlICpUeTIpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5pc1RydW5jYXRlRnJlZShUeTEsIFR5Mik7CisgIH0KKyAgYm9vbCBpc1Byb2ZpdGFibGVUb0hvaXN0KEluc3RydWN0aW9uICpJKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuaXNQcm9maXRhYmxlVG9Ib2lzdChJKTsKKyAgfQorICBib29sIHVzZUFBKCkgb3ZlcnJpZGUgeyByZXR1cm4gSW1wbC51c2VBQSgpOyB9CisgIGJvb2wgaXNUeXBlTGVnYWwoVHlwZSAqVHkpIG92ZXJyaWRlIHsgcmV0dXJuIEltcGwuaXNUeXBlTGVnYWwoVHkpOyB9CisgIHVuc2lnbmVkIGdldEp1bXBCdWZBbGlnbm1lbnQoKSBvdmVycmlkZSB7IHJldHVybiBJbXBsLmdldEp1bXBCdWZBbGlnbm1lbnQoKTsgfQorICB1bnNpZ25lZCBnZXRKdW1wQnVmU2l6ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIEltcGwuZ2V0SnVtcEJ1ZlNpemUoKTsgfQorICBib29sIHNob3VsZEJ1aWxkTG9va3VwVGFibGVzKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLnNob3VsZEJ1aWxkTG9va3VwVGFibGVzKCk7CisgIH0KKyAgYm9vbCBzaG91bGRCdWlsZExvb2t1cFRhYmxlc0ZvckNvbnN0YW50KENvbnN0YW50ICpDKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuc2hvdWxkQnVpbGRMb29rdXBUYWJsZXNGb3JDb25zdGFudChDKTsKKyAgfQorICBib29sIHVzZUNvbGRDQ0ZvckNvbGRDYWxsKEZ1bmN0aW9uICZGKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwudXNlQ29sZENDRm9yQ29sZENhbGwoRik7CisgIH0KKworICB1bnNpZ25lZCBnZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoVHlwZSAqVHksIGJvb2wgSW5zZXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHRyYWN0KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0U2NhbGFyaXphdGlvbk92ZXJoZWFkKFR5LCBJbnNlcnQsIEV4dHJhY3QpOworICB9CisgIHVuc2lnbmVkIGdldE9wZXJhbmRzU2NhbGFyaXphdGlvbk92ZXJoZWFkKEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZGKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0T3BlcmFuZHNTY2FsYXJpemF0aW9uT3ZlcmhlYWQoQXJncywgVkYpOworICB9CisKKyAgYm9vbCBzdXBwb3J0c0VmZmljaWVudFZlY3RvckVsZW1lbnRMb2FkU3RvcmUoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuc3VwcG9ydHNFZmZpY2llbnRWZWN0b3JFbGVtZW50TG9hZFN0b3JlKCk7CisgIH0KKworICBib29sIGVuYWJsZUFnZ3Jlc3NpdmVJbnRlcmxlYXZpbmcoYm9vbCBMb29wSGFzUmVkdWN0aW9ucykgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmVuYWJsZUFnZ3Jlc3NpdmVJbnRlcmxlYXZpbmcoTG9vcEhhc1JlZHVjdGlvbnMpOworICB9CisgIGNvbnN0IE1lbUNtcEV4cGFuc2lvbk9wdGlvbnMgKmVuYWJsZU1lbUNtcEV4cGFuc2lvbigKKyAgICAgIGJvb2wgSXNaZXJvQ21wKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZW5hYmxlTWVtQ21wRXhwYW5zaW9uKElzWmVyb0NtcCk7CisgIH0KKyAgYm9vbCBlbmFibGVJbnRlcmxlYXZlZEFjY2Vzc1ZlY3Rvcml6YXRpb24oKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZW5hYmxlSW50ZXJsZWF2ZWRBY2Nlc3NWZWN0b3JpemF0aW9uKCk7CisgIH0KKyAgYm9vbCBpc0ZQVmVjdG9yaXphdGlvblBvdGVudGlhbGx5VW5zYWZlKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmlzRlBWZWN0b3JpemF0aW9uUG90ZW50aWFsbHlVbnNhZmUoKTsKKyAgfQorICBib29sIGFsbG93c01pc2FsaWduZWRNZW1vcnlBY2Nlc3NlcyhMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQml0V2lkdGgsIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50LCBib29sICpGYXN0KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuYWxsb3dzTWlzYWxpZ25lZE1lbW9yeUFjY2Vzc2VzKENvbnRleHQsIEJpdFdpZHRoLCBBZGRyZXNzU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWdubWVudCwgRmFzdCk7CisgIH0KKyAgUG9wY250U3VwcG9ydEtpbmQgZ2V0UG9wY250U3VwcG9ydCh1bnNpZ25lZCBJbnRUeVdpZHRoSW5CaXQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRQb3BjbnRTdXBwb3J0KEludFR5V2lkdGhJbkJpdCk7CisgIH0KKyAgYm9vbCBoYXZlRmFzdFNxcnQoVHlwZSAqVHkpIG92ZXJyaWRlIHsgcmV0dXJuIEltcGwuaGF2ZUZhc3RTcXJ0KFR5KTsgfQorCisgIGJvb2wgaXNGQ21wT3JkQ2hlYXBlclRoYW5GQ21wWmVybyhUeXBlICpUeSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmlzRkNtcE9yZENoZWFwZXJUaGFuRkNtcFplcm8oVHkpOworICB9CisKKyAgaW50IGdldEZQT3BDb3N0KFR5cGUgKlR5KSBvdmVycmlkZSB7IHJldHVybiBJbXBsLmdldEZQT3BDb3N0KFR5KTsgfQorCisgIGludCBnZXRJbnRJbW1Db2RlU2l6ZUNvc3QodW5zaWduZWQgT3BjLCB1bnNpZ25lZCBJZHgsIGNvbnN0IEFQSW50ICZJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqVHkpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRJbnRJbW1Db2RlU2l6ZUNvc3QoT3BjLCBJZHgsIEltbSwgVHkpOworICB9CisgIGludCBnZXRJbnRJbW1Db3N0KGNvbnN0IEFQSW50ICZJbW0sIFR5cGUgKlR5KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0SW50SW1tQ29zdChJbW0sIFR5KTsKKyAgfQorICBpbnQgZ2V0SW50SW1tQ29zdCh1bnNpZ25lZCBPcGMsIHVuc2lnbmVkIElkeCwgY29uc3QgQVBJbnQgJkltbSwKKyAgICAgICAgICAgICAgICAgICAgVHlwZSAqVHkpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRJbnRJbW1Db3N0KE9wYywgSWR4LCBJbW0sIFR5KTsKKyAgfQorICBpbnQgZ2V0SW50SW1tQ29zdChJbnRyaW5zaWM6OklEIElJRCwgdW5zaWduZWQgSWR4LCBjb25zdCBBUEludCAmSW1tLAorICAgICAgICAgICAgICAgICAgICBUeXBlICpUeSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldEludEltbUNvc3QoSUlELCBJZHgsIEltbSwgVHkpOworICB9CisgIHVuc2lnbmVkIGdldE51bWJlck9mUmVnaXN0ZXJzKGJvb2wgVmVjdG9yKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0TnVtYmVyT2ZSZWdpc3RlcnMoVmVjdG9yKTsKKyAgfQorICB1bnNpZ25lZCBnZXRSZWdpc3RlckJpdFdpZHRoKGJvb2wgVmVjdG9yKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0UmVnaXN0ZXJCaXRXaWR0aChWZWN0b3IpOworICB9CisgIHVuc2lnbmVkIGdldE1pblZlY3RvclJlZ2lzdGVyQml0V2lkdGgoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0TWluVmVjdG9yUmVnaXN0ZXJCaXRXaWR0aCgpOworICB9CisgIGJvb2wgc2hvdWxkTWF4aW1pemVWZWN0b3JCYW5kd2lkdGgoYm9vbCBPcHRTaXplKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuc2hvdWxkTWF4aW1pemVWZWN0b3JCYW5kd2lkdGgoT3B0U2l6ZSk7CisgIH0KKyAgYm9vbCBzaG91bGRDb25zaWRlckFkZHJlc3NUeXBlUHJvbW90aW9uKAorICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gJkksIGJvb2wgJkFsbG93UHJvbW90aW9uV2l0aG91dENvbW1vbkhlYWRlcikgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLnNob3VsZENvbnNpZGVyQWRkcmVzc1R5cGVQcm9tb3Rpb24oCisgICAgICAgIEksIEFsbG93UHJvbW90aW9uV2l0aG91dENvbW1vbkhlYWRlcik7CisgIH0KKyAgdW5zaWduZWQgZ2V0Q2FjaGVMaW5lU2l6ZSgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRDYWNoZUxpbmVTaXplKCk7CisgIH0KKyAgbGx2bTo6T3B0aW9uYWw8dW5zaWduZWQ+IGdldENhY2hlU2l6ZShDYWNoZUxldmVsIExldmVsKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0Q2FjaGVTaXplKExldmVsKTsKKyAgfQorICBsbHZtOjpPcHRpb25hbDx1bnNpZ25lZD4gZ2V0Q2FjaGVBc3NvY2lhdGl2aXR5KENhY2hlTGV2ZWwgTGV2ZWwpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRDYWNoZUFzc29jaWF0aXZpdHkoTGV2ZWwpOworICB9CisgIHVuc2lnbmVkIGdldFByZWZldGNoRGlzdGFuY2UoKSBvdmVycmlkZSB7IHJldHVybiBJbXBsLmdldFByZWZldGNoRGlzdGFuY2UoKTsgfQorICB1bnNpZ25lZCBnZXRNaW5QcmVmZXRjaFN0cmlkZSgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRNaW5QcmVmZXRjaFN0cmlkZSgpOworICB9CisgIHVuc2lnbmVkIGdldE1heFByZWZldGNoSXRlcmF0aW9uc0FoZWFkKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldE1heFByZWZldGNoSXRlcmF0aW9uc0FoZWFkKCk7CisgIH0KKyAgdW5zaWduZWQgZ2V0TWF4SW50ZXJsZWF2ZUZhY3Rvcih1bnNpZ25lZCBWRikgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldE1heEludGVybGVhdmVGYWN0b3IoVkYpOworICB9CisgIHVuc2lnbmVkIGdldEVzdGltYXRlZE51bWJlck9mQ2FzZUNsdXN0ZXJzKGNvbnN0IFN3aXRjaEluc3QgJlNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmSlRTaXplKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0RXN0aW1hdGVkTnVtYmVyT2ZDYXNlQ2x1c3RlcnMoU0ksIEpUU2l6ZSk7CisgIH0KKyAgdW5zaWduZWQKKyAgZ2V0QXJpdGhtZXRpY0luc3RyQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlR5LCBPcGVyYW5kVmFsdWVLaW5kIE9wZDFJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhbmRWYWx1ZUtpbmQgT3BkMkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFuZFZhbHVlUHJvcGVydGllcyBPcGQxUHJvcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFuZFZhbHVlUHJvcGVydGllcyBPcGQyUHJvcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gQXJncykgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldEFyaXRobWV0aWNJbnN0ckNvc3QoT3Bjb2RlLCBUeSwgT3BkMUluZm8sIE9wZDJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BkMVByb3BJbmZvLCBPcGQyUHJvcEluZm8sIEFyZ3MpOworICB9CisgIGludCBnZXRTaHVmZmxlQ29zdChTaHVmZmxlS2luZCBLaW5kLCBUeXBlICpUcCwgaW50IEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgVHlwZSAqU3ViVHApIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRTaHVmZmxlQ29zdChLaW5kLCBUcCwgSW5kZXgsIFN1YlRwKTsKKyAgfQorICBpbnQgZ2V0Q2FzdEluc3RyQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKkRzdCwgVHlwZSAqU3JjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqSSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldENhc3RJbnN0ckNvc3QoT3Bjb2RlLCBEc3QsIFNyYywgSSk7CisgIH0KKyAgaW50IGdldEV4dHJhY3RXaXRoRXh0ZW5kQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKkRzdCwgVmVjdG9yVHlwZSAqVmVjVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZXgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRFeHRyYWN0V2l0aEV4dGVuZENvc3QoT3Bjb2RlLCBEc3QsIFZlY1R5LCBJbmRleCk7CisgIH0KKyAgaW50IGdldENGSW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldENGSW5zdHJDb3N0KE9wY29kZSk7CisgIH0KKyAgaW50IGdldENtcFNlbEluc3RyQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlZhbFR5LCBUeXBlICpDb25kVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRDbXBTZWxJbnN0ckNvc3QoT3Bjb2RlLCBWYWxUeSwgQ29uZFR5LCBJKTsKKyAgfQorICBpbnQgZ2V0VmVjdG9ySW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVmFsLCB1bnNpZ25lZCBJbmRleCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldFZlY3Rvckluc3RyQ29zdChPcGNvZGUsIFZhbCwgSW5kZXgpOworICB9CisgIGludCBnZXRNZW1vcnlPcENvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpTcmMsIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyZXNzU3BhY2UsIGNvbnN0IEluc3RydWN0aW9uICpJKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0TWVtb3J5T3BDb3N0KE9wY29kZSwgU3JjLCBBbGlnbm1lbnQsIEFkZHJlc3NTcGFjZSwgSSk7CisgIH0KKyAgaW50IGdldE1hc2tlZE1lbW9yeU9wQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlNyYywgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldE1hc2tlZE1lbW9yeU9wQ29zdChPcGNvZGUsIFNyYywgQWxpZ25tZW50LCBBZGRyZXNzU3BhY2UpOworICB9CisgIGludCBnZXRHYXRoZXJTY2F0dGVyT3BDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqRGF0YVR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqUHRyLCBib29sIFZhcmlhYmxlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0R2F0aGVyU2NhdHRlck9wQ29zdChPcGNvZGUsIERhdGFUeSwgUHRyLCBWYXJpYWJsZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQpOworICB9CisgIGludCBnZXRJbnRlcmxlYXZlZE1lbW9yeU9wQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlZlY1R5LCB1bnNpZ25lZCBGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gSW5kaWNlcywgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkcmVzc1NwYWNlKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0SW50ZXJsZWF2ZWRNZW1vcnlPcENvc3QoT3Bjb2RlLCBWZWNUeSwgRmFjdG9yLCBJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWdubWVudCwgQWRkcmVzc1NwYWNlKTsKKyAgfQorICBpbnQgZ2V0QXJpdGhtZXRpY1JlZHVjdGlvbkNvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNQYWlyd2lzZUZvcm0pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRBcml0aG1ldGljUmVkdWN0aW9uQ29zdChPcGNvZGUsIFR5LCBJc1BhaXJ3aXNlRm9ybSk7CisgIH0KKyAgaW50IGdldE1pbk1heFJlZHVjdGlvbkNvc3QoVHlwZSAqVHksIFR5cGUgKkNvbmRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1BhaXJ3aXNlRm9ybSwgYm9vbCBJc1Vuc2lnbmVkKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0TWluTWF4UmVkdWN0aW9uQ29zdChUeSwgQ29uZFR5LCBJc1BhaXJ3aXNlRm9ybSwgSXNVbnNpZ25lZCk7CisgICB9CisgIGludCBnZXRJbnRyaW5zaWNJbnN0ckNvc3QoSW50cmluc2ljOjpJRCBJRCwgVHlwZSAqUmV0VHksIEFycmF5UmVmPFR5cGUgKj4gVHlzLAorICAgICAgICAgICAgICAgRmFzdE1hdGhGbGFncyBGTUYsIHVuc2lnbmVkIFNjYWxhcml6YXRpb25Db3N0UGFzc2VkKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0SW50cmluc2ljSW5zdHJDb3N0KElELCBSZXRUeSwgVHlzLCBGTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhcml6YXRpb25Db3N0UGFzc2VkKTsKKyAgfQorICBpbnQgZ2V0SW50cmluc2ljSW5zdHJDb3N0KEludHJpbnNpYzo6SUQgSUQsIFR5cGUgKlJldFR5LAorICAgICAgIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsIEZhc3RNYXRoRmxhZ3MgRk1GLCB1bnNpZ25lZCBWRikgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldEludHJpbnNpY0luc3RyQ29zdChJRCwgUmV0VHksIEFyZ3MsIEZNRiwgVkYpOworICB9CisgIGludCBnZXRDYWxsSW5zdHJDb3N0KEZ1bmN0aW9uICpGLCBUeXBlICpSZXRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZSAqPiBUeXMpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRDYWxsSW5zdHJDb3N0KEYsIFJldFR5LCBUeXMpOworICB9CisgIHVuc2lnbmVkIGdldE51bWJlck9mUGFydHMoVHlwZSAqVHApIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXROdW1iZXJPZlBhcnRzKFRwKTsKKyAgfQorICBpbnQgZ2V0QWRkcmVzc0NvbXB1dGF0aW9uQ29zdChUeXBlICpUeSwgU2NhbGFyRXZvbHV0aW9uICpTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqUHRyKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0QWRkcmVzc0NvbXB1dGF0aW9uQ29zdChUeSwgU0UsIFB0cik7CisgIH0KKyAgdW5zaWduZWQgZ2V0Q29zdE9mS2VlcGluZ0xpdmVPdmVyQ2FsbChBcnJheVJlZjxUeXBlICo+IFR5cykgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldENvc3RPZktlZXBpbmdMaXZlT3ZlckNhbGwoVHlzKTsKKyAgfQorICBib29sIGdldFRndE1lbUludHJpbnNpYyhJbnRyaW5zaWNJbnN0ICpJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1JbnRyaW5zaWNJbmZvICZJbmZvKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0VGd0TWVtSW50cmluc2ljKEluc3QsIEluZm8pOworICB9CisgIHVuc2lnbmVkIGdldEF0b21pY01lbUludHJpbnNpY01heEVsZW1lbnRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldEF0b21pY01lbUludHJpbnNpY01heEVsZW1lbnRTaXplKCk7CisgIH0KKyAgVmFsdWUgKmdldE9yQ3JlYXRlUmVzdWx0RnJvbU1lbUludHJpbnNpYyhJbnRyaW5zaWNJbnN0ICpJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKkV4cGVjdGVkVHlwZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldE9yQ3JlYXRlUmVzdWx0RnJvbU1lbUludHJpbnNpYyhJbnN0LCBFeHBlY3RlZFR5cGUpOworICB9CisgIFR5cGUgKmdldE1lbWNweUxvb3BMb3dlcmluZ1R5cGUoTExWTUNvbnRleHQgJkNvbnRleHQsIFZhbHVlICpMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdEFsaWduKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0TWVtY3B5TG9vcExvd2VyaW5nVHlwZShDb250ZXh0LCBMZW5ndGgsIFNyY0FsaWduLCBEZXN0QWxpZ24pOworICB9CisgIHZvaWQgZ2V0TWVtY3B5TG9vcFJlc2lkdWFsTG93ZXJpbmdUeXBlKFNtYWxsVmVjdG9ySW1wbDxUeXBlICo+ICZPcHNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZW1haW5pbmdCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RBbGlnbikgY29uc3Qgb3ZlcnJpZGUgeworICAgIEltcGwuZ2V0TWVtY3B5TG9vcFJlc2lkdWFsTG93ZXJpbmdUeXBlKE9wc091dCwgQ29udGV4dCwgUmVtYWluaW5nQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjQWxpZ24sIERlc3RBbGlnbik7CisgIH0KKyAgYm9vbCBhcmVJbmxpbmVDb21wYXRpYmxlKGNvbnN0IEZ1bmN0aW9uICpDYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiAqQ2FsbGVlKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuYXJlSW5saW5lQ29tcGF0aWJsZShDYWxsZXIsIENhbGxlZSk7CisgIH0KKyAgYm9vbCBpc0luZGV4ZWRMb2FkTGVnYWwoTWVtSW5kZXhlZE1vZGUgTW9kZSwgVHlwZSAqVHkpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5pc0luZGV4ZWRMb2FkTGVnYWwoTW9kZSwgVHksIGdldERhdGFMYXlvdXQoKSk7CisgIH0KKyAgYm9vbCBpc0luZGV4ZWRTdG9yZUxlZ2FsKE1lbUluZGV4ZWRNb2RlIE1vZGUsIFR5cGUgKlR5KSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuaXNJbmRleGVkU3RvcmVMZWdhbChNb2RlLCBUeSwgZ2V0RGF0YUxheW91dCgpKTsKKyAgfQorICB1bnNpZ25lZCBnZXRMb2FkU3RvcmVWZWNSZWdCaXRXaWR0aCh1bnNpZ25lZCBBZGRyU3BhY2UpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRMb2FkU3RvcmVWZWNSZWdCaXRXaWR0aChBZGRyU3BhY2UpOworICB9CisgIGJvb2wgaXNMZWdhbFRvVmVjdG9yaXplTG9hZChMb2FkSW5zdCAqTEkpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5pc0xlZ2FsVG9WZWN0b3JpemVMb2FkKExJKTsKKyAgfQorICBib29sIGlzTGVnYWxUb1ZlY3Rvcml6ZVN0b3JlKFN0b3JlSW5zdCAqU0kpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5pc0xlZ2FsVG9WZWN0b3JpemVTdG9yZShTSSk7CisgIH0KKyAgYm9vbCBpc0xlZ2FsVG9WZWN0b3JpemVMb2FkQ2hhaW4odW5zaWduZWQgQ2hhaW5TaXplSW5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5pc0xlZ2FsVG9WZWN0b3JpemVMb2FkQ2hhaW4oQ2hhaW5TaXplSW5CeXRlcywgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyU3BhY2UpOworICB9CisgIGJvb2wgaXNMZWdhbFRvVmVjdG9yaXplU3RvcmVDaGFpbih1bnNpZ25lZCBDaGFpblNpemVJbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkclNwYWNlKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuaXNMZWdhbFRvVmVjdG9yaXplU3RvcmVDaGFpbihDaGFpblNpemVJbkJ5dGVzLCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyU3BhY2UpOworICB9CisgIHVuc2lnbmVkIGdldExvYWRWZWN0b3JGYWN0b3IodW5zaWduZWQgVkYsIHVuc2lnbmVkIExvYWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENoYWluU2l6ZUluQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZSAqVmVjVHkpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRMb2FkVmVjdG9yRmFjdG9yKFZGLCBMb2FkU2l6ZSwgQ2hhaW5TaXplSW5CeXRlcywgVmVjVHkpOworICB9CisgIHVuc2lnbmVkIGdldFN0b3JlVmVjdG9yRmFjdG9yKHVuc2lnbmVkIFZGLCB1bnNpZ25lZCBTdG9yZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENoYWluU2l6ZUluQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvclR5cGUgKlZlY1R5KSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0U3RvcmVWZWN0b3JGYWN0b3IoVkYsIFN0b3JlU2l6ZSwgQ2hhaW5TaXplSW5CeXRlcywgVmVjVHkpOworICB9CisgIGJvb2wgdXNlUmVkdWN0aW9uSW50cmluc2ljKHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZHVjdGlvbkZsYWdzIEZsYWdzKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwudXNlUmVkdWN0aW9uSW50cmluc2ljKE9wY29kZSwgVHksIEZsYWdzKTsKKyAgfQorICBib29sIHNob3VsZEV4cGFuZFJlZHVjdGlvbihjb25zdCBJbnRyaW5zaWNJbnN0ICpJSSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLnNob3VsZEV4cGFuZFJlZHVjdGlvbihJSSk7CisgIH0KKyAgaW50IGdldEluc3RydWN0aW9uTGF0ZW5jeShjb25zdCBJbnN0cnVjdGlvbiAqSSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldEluc3RydWN0aW9uTGF0ZW5jeShJKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUYXJnZXRUcmFuc2Zvcm1JbmZvOjpUYXJnZXRUcmFuc2Zvcm1JbmZvKFQgSW1wbCkKKyAgICA6IFRUSUltcGwobmV3IE1vZGVsPFQ+KEltcGwpKSB7fQorCisvLy8gXGJyaWVmIEFuYWx5c2lzIHBhc3MgcHJvdmlkaW5nIHRoZSBcYyBUYXJnZXRUcmFuc2Zvcm1JbmZvLgorLy8vCisvLy8gVGhlIGNvcmUgaWRlYSBvZiB0aGUgVGFyZ2V0SVJBbmFseXNpcyBpcyB0byBleHBvc2UgYW4gaW50ZXJmYWNlIHRocm91Z2gKKy8vLyB3aGljaCBMTFZNIHRhcmdldHMgY2FuIGFuYWx5emUgYW5kIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1pZGRsZQorLy8vIGVuZCdzIHRhcmdldC1pbmRlcGVuZGVudCBJUi4gVGhpcyBzdXBwb3J0cyB1c2UgY2FzZXMgc3VjaCBhcyB0YXJnZXQtYXdhcmUKKy8vLyBjb3N0IG1vZGVsaW5nIG9mIElSIGNvbnN0cnVjdHMuCisvLy8KKy8vLyBUaGlzIGlzIGEgZnVuY3Rpb24gYW5hbHlzaXMgYmVjYXVzZSBtdWNoIG9mIHRoZSBjb3N0IG1vZGVsaW5nIGZvciB0YXJnZXRzCisvLy8gaXMgZG9uZSBpbiBhIHN1YnRhcmdldCBzcGVjaWZpYyB3YXkgYW5kIExMVk0gc3VwcG9ydHMgY29tcGlsaW5nIGRpZmZlcmVudAorLy8vIGZ1bmN0aW9ucyB0YXJnZXRpbmcgZGlmZmVyZW50IHN1YnRhcmdldHMgaW4gb3JkZXIgdG8gc3VwcG9ydCBydW50aW1lCisvLy8gZGlzcGF0Y2ggYWNjb3JkaW5nIHRvIHRoZSBvYnNlcnZlZCBzdWJ0YXJnZXQuCitjbGFzcyBUYXJnZXRJUkFuYWx5c2lzIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPFRhcmdldElSQW5hbHlzaXM+IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBUYXJnZXRUcmFuc2Zvcm1JbmZvIFJlc3VsdDsKKworICAvLy8gXGJyaWVmIERlZmF1bHQgY29uc3RydWN0IGEgdGFyZ2V0IElSIGFuYWx5c2lzLgorICAvLy8KKyAgLy8vIFRoaXMgd2lsbCB1c2UgdGhlIG1vZHVsZSdzIGRhdGFsYXlvdXQgdG8gY29uc3RydWN0IGEgYmFzZWxpbmUKKyAgLy8vIGNvbnNlcnZhdGl2ZSBUVEkgcmVzdWx0LgorICBUYXJnZXRJUkFuYWx5c2lzKCk7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYW4gSVIgYW5hbHlzaXMgcGFzcyBhcm91bmQgYSB0YXJnZXQtcHJvdmlkZSBjYWxsYmFjay4KKyAgLy8vCisgIC8vLyBUaGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2l0aCBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gZm9yIHdoaWNoIHRoZSBUVEkKKyAgLy8vIGlzIG5lZWRlZCBhbmQgbXVzdCByZXR1cm4gYSBUVEkgb2JqZWN0IGZvciB0aGF0IGZ1bmN0aW9uLgorICBUYXJnZXRJUkFuYWx5c2lzKHN0ZDo6ZnVuY3Rpb248UmVzdWx0KGNvbnN0IEZ1bmN0aW9uICYpPiBUVElDYWxsYmFjayk7CisKKyAgLy8gVmFsdWUgc2VtYW50aWNzLiBXZSBzcGVsbCBvdXQgdGhlIGNvbnN0cnVjdG9ycyBmb3IgTVNWQy4KKyAgVGFyZ2V0SVJBbmFseXNpcyhjb25zdCBUYXJnZXRJUkFuYWx5c2lzICZBcmcpCisgICAgICA6IFRUSUNhbGxiYWNrKEFyZy5UVElDYWxsYmFjaykge30KKyAgVGFyZ2V0SVJBbmFseXNpcyhUYXJnZXRJUkFuYWx5c2lzICYmQXJnKQorICAgICAgOiBUVElDYWxsYmFjayhzdGQ6Om1vdmUoQXJnLlRUSUNhbGxiYWNrKSkge30KKyAgVGFyZ2V0SVJBbmFseXNpcyAmb3BlcmF0b3I9KGNvbnN0IFRhcmdldElSQW5hbHlzaXMgJlJIUykgeworICAgIFRUSUNhbGxiYWNrID0gUkhTLlRUSUNhbGxiYWNrOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBUYXJnZXRJUkFuYWx5c2lzICZvcGVyYXRvcj0oVGFyZ2V0SVJBbmFseXNpcyAmJlJIUykgeworICAgIFRUSUNhbGxiYWNrID0gc3RkOjptb3ZlKFJIUy5UVElDYWxsYmFjayk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgUmVzdWx0IHJ1bihjb25zdCBGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJik7CisKK3ByaXZhdGU6CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxUYXJnZXRJUkFuYWx5c2lzPjsKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworICAvLy8gXGJyaWVmIFRoZSBjYWxsYmFjayB1c2VkIHRvIHByb2R1Y2UgYSByZXN1bHQuCisgIC8vLworICAvLy8gV2UgdXNlIGEgY29tcGxldGVseSBvcGFxdWUgY2FsbGJhY2sgc28gdGhhdCB0YXJnZXRzIGNhbiBwcm92aWRlIHdoYXRldmVyCisgIC8vLyBtZWNoYW5pc20gdGhleSBkZXNpcmUgZm9yIGNvbnN0cnVjdGluZyB0aGUgVFRJIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIEZJWE1FOiBTaG91bGQgd2UgcmVhbGx5IHVzZSBzdGQ6OmZ1bmN0aW9uPyBJdCdzIHJlbGF0aXZlbHkgaW5lZmZpY2llbnQuCisgIC8vLyBJdCBtaWdodCBiZSBwb3NzaWJsZSB0byBhcnJhbmdlIGZvciBldmVuIHN0YXRlZnVsIGNhbGxiYWNrcyB0byBvdXRsaXZlCisgIC8vLyB0aGUgYW5hbHlzaXMgYW5kIHRodXMgdXNlIGEgZnVuY3Rpb25fcmVmIHdoaWNoIHdvdWxkIGJlIGxpZ2h0ZXIgd2VpZ2h0LgorICAvLy8gVGhpcyBtYXkgYWxzbyBiZSBsZXNzIGVycm9yIHByb25lIGFzIHRoZSBjYWxsYmFjayBpcyBsaWtlbHkgdG8gcmVmZXJlbmNlCisgIC8vLyB0aGUgZXh0ZXJuYWwgVGFyZ2V0TWFjaGluZSwgYW5kIHRoYXQgcmVmZXJlbmNlIG5lZWRzIHRvIG5ldmVyIGRhbmdsZS4KKyAgc3RkOjpmdW5jdGlvbjxSZXN1bHQoY29uc3QgRnVuY3Rpb24gJik+IFRUSUNhbGxiYWNrOworCisgIC8vLyBcYnJpZWYgSGVscGVyIGZ1bmN0aW9uIHVzZWQgYXMgdGhlIGNhbGxiYWNrIGluIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICBzdGF0aWMgUmVzdWx0IGdldERlZmF1bHRUVEkoY29uc3QgRnVuY3Rpb24gJkYpOworfTsKKworLy8vIFxicmllZiBXcmFwcGVyIHBhc3MgZm9yIFRhcmdldFRyYW5zZm9ybUluZm8uCisvLy8KKy8vLyBUaGlzIHBhc3MgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gYSBUVEkgb2JqZWN0IHdoaWNoIGl0IHN0b3JlcyBpbnRlcm5hbGx5CisvLy8gYW5kIGlzIHF1ZXJpZWQgYnkgcGFzc2VzLgorY2xhc3MgVGFyZ2V0VHJhbnNmb3JtSW5mb1dyYXBwZXJQYXNzIDogcHVibGljIEltbXV0YWJsZVBhc3MgeworICBUYXJnZXRJUkFuYWx5c2lzIFRJUkE7CisgIE9wdGlvbmFsPFRhcmdldFRyYW5zZm9ybUluZm8+IFRUSTsKKworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgLy8vIFxicmllZiBXZSBtdXN0IHByb3ZpZGUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvciB0aGUgcGFzcyBidXQgaXQgc2hvdWxkCisgIC8vLyBuZXZlciBiZSB1c2VkLgorICAvLy8KKyAgLy8vIFVzZSB0aGUgY29uc3RydWN0b3IgYmVsb3cgb3IgY2FsbCBvbmUgb2YgdGhlIGNyZWF0aW9uIHJvdXRpbmVzLgorICBUYXJnZXRUcmFuc2Zvcm1JbmZvV3JhcHBlclBhc3MoKTsKKworICBleHBsaWNpdCBUYXJnZXRUcmFuc2Zvcm1JbmZvV3JhcHBlclBhc3MoVGFyZ2V0SVJBbmFseXNpcyBUSVJBKTsKKworICBUYXJnZXRUcmFuc2Zvcm1JbmZvICZnZXRUVEkoY29uc3QgRnVuY3Rpb24gJkYpOworfTsKKworLy8vIFxicmllZiBDcmVhdGUgYW4gYW5hbHlzaXMgcGFzcyB3cmFwcGVyIGFyb3VuZCBhIFRUSSBvYmplY3QuCisvLy8KKy8vLyBUaGlzIGFuYWx5c2lzIHBhc3MganVzdCBob2xkcyB0aGUgVFRJIGluc3RhbmNlIGFuZCBtYWtlcyBpdCBhdmFpbGFibGUgdG8KKy8vLyBjbGllbnRzLgorSW1tdXRhYmxlUGFzcyAqY3JlYXRlVGFyZ2V0VHJhbnNmb3JtSW5mb1dyYXBwZXJQYXNzKFRhcmdldElSQW5hbHlzaXMgVElSQSk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9UYXJnZXRUcmFuc2Zvcm1JbmZvSW1wbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9UYXJnZXRUcmFuc2Zvcm1JbmZvSW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNGY4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1RhcmdldFRyYW5zZm9ybUluZm9JbXBsLmgKQEAgLTAsMCArMSw4NTAgQEAKKy8vPT09LSBUYXJnZXRUcmFuc2Zvcm1JbmZvSW1wbC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgcHJvdmlkZXMgaGVscGVycyBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9mCisvLy8gYSBUYXJnZXRUcmFuc2Zvcm1JbmZvLWNvbmZvcm1pbmcgY2xhc3MuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19UQVJHRVRUUkFOU0ZPUk1JTkZPSU1QTF9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfVEFSR0VUVFJBTlNGT1JNSU5GT0lNUExfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25FeHByZXNzaW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVGFyZ2V0VHJhbnNmb3JtSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVmVjdG9yVXRpbHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EYXRhTGF5b3V0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2V0RWxlbWVudFB0clR5cGVJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvT3BlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1R5cGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gXGJyaWVmIEJhc2UgY2xhc3MgZm9yIHVzZSBhcyBhIG1peC1pbiB0aGF0IGFpZHMgaW1wbGVtZW50aW5nCisvLy8gYSBUYXJnZXRUcmFuc2Zvcm1JbmZvLWNvbXBhdGlibGUgY2xhc3MuCitjbGFzcyBUYXJnZXRUcmFuc2Zvcm1JbmZvSW1wbEJhc2UgeworcHJvdGVjdGVkOgorICB0eXBlZGVmIFRhcmdldFRyYW5zZm9ybUluZm8gVFRJOworCisgIGNvbnN0IERhdGFMYXlvdXQgJkRMOworCisgIGV4cGxpY2l0IFRhcmdldFRyYW5zZm9ybUluZm9JbXBsQmFzZShjb25zdCBEYXRhTGF5b3V0ICZETCkgOiBETChETCkge30KKworcHVibGljOgorICAvLyBQcm92aWRlIHZhbHVlIHNlbWFudGljcy4gTVNWQyByZXF1aXJlcyB0aGF0IHdlIHNwZWxsIGFsbCBvZiB0aGVzZSBvdXQuCisgIFRhcmdldFRyYW5zZm9ybUluZm9JbXBsQmFzZShjb25zdCBUYXJnZXRUcmFuc2Zvcm1JbmZvSW1wbEJhc2UgJkFyZykKKyAgICAgIDogREwoQXJnLkRMKSB7fQorICBUYXJnZXRUcmFuc2Zvcm1JbmZvSW1wbEJhc2UoVGFyZ2V0VHJhbnNmb3JtSW5mb0ltcGxCYXNlICYmQXJnKSA6IERMKEFyZy5ETCkge30KKworICBjb25zdCBEYXRhTGF5b3V0ICZnZXREYXRhTGF5b3V0KCkgY29uc3QgeyByZXR1cm4gREw7IH0KKworICB1bnNpZ25lZCBnZXRPcGVyYXRpb25Db3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVHksIFR5cGUgKk9wVHkpIHsKKyAgICBzd2l0Y2ggKE9wY29kZSkgeworICAgIGRlZmF1bHQ6CisgICAgICAvLyBCeSBkZWZhdWx0LCBqdXN0IGNsYXNzaWZ5IGV2ZXJ5dGhpbmcgYXMgJ2Jhc2ljJy4KKyAgICAgIHJldHVybiBUVEk6OlRDQ19CYXNpYzsKKworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHI6CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVc2UgZ2V0R0VQQ29zdCBmb3IgR0VQIG9wZXJhdGlvbnMhIik7CisKKyAgICBjYXNlIEluc3RydWN0aW9uOjpCaXRDYXN0OgorICAgICAgYXNzZXJ0KE9wVHkgJiYgIkNhc3QgaW5zdHJ1Y3Rpb25zIG11c3QgcHJvdmlkZSB0aGUgb3BlcmFuZCB0eXBlIik7CisgICAgICBpZiAoVHkgPT0gT3BUeSB8fCAoVHktPmlzUG9pbnRlclR5KCkgJiYgT3BUeS0+aXNQb2ludGVyVHkoKSkpCisgICAgICAgIC8vIElkZW50aXR5IGFuZCBwb2ludGVyLXRvLXBvaW50ZXIgY2FzdHMgYXJlIGZyZWUuCisgICAgICAgIHJldHVybiBUVEk6OlRDQ19GcmVlOworCisgICAgICAvLyBPdGhlcndpc2UsIHRoZSBkZWZhdWx0IGJhc2ljIGNvc3QgaXMgdXNlZC4KKyAgICAgIHJldHVybiBUVEk6OlRDQ19CYXNpYzsKKworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZEaXY6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlJlbToKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTRGl2OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNSZW06CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VURpdjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpVUmVtOgorICAgICAgcmV0dXJuIFRUSTo6VENDX0V4cGVuc2l2ZTsKKworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkludFRvUHRyOiB7CisgICAgICAvLyBBbiBpbnR0b3B0ciBjYXN0IGlzIGZyZWUgc28gbG9uZyBhcyB0aGUgaW5wdXQgaXMgYSBsZWdhbCBpbnRlZ2VyIHR5cGUKKyAgICAgIC8vIHdoaWNoIGRvZXNuJ3QgY29udGFpbiB2YWx1ZXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgYSBwb2ludGVyLgorICAgICAgdW5zaWduZWQgT3BTaXplID0gT3BUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICAgICAgaWYgKERMLmlzTGVnYWxJbnRlZ2VyKE9wU2l6ZSkgJiYKKyAgICAgICAgICBPcFNpemUgPD0gREwuZ2V0UG9pbnRlclR5cGVTaXplSW5CaXRzKFR5KSkKKyAgICAgICAgcmV0dXJuIFRUSTo6VENDX0ZyZWU7CisKKyAgICAgIC8vIE90aGVyd2lzZSBpdCdzIG5vdCBhIG5vLW9wLgorICAgICAgcmV0dXJuIFRUSTo6VENDX0Jhc2ljOworICAgIH0KKyAgICBjYXNlIEluc3RydWN0aW9uOjpQdHJUb0ludDogeworICAgICAgLy8gQSBwdHJ0b2ludCBjYXN0IGlzIGZyZWUgc28gbG9uZyBhcyB0aGUgcmVzdWx0IGlzIGxhcmdlIGVub3VnaCB0byBzdG9yZQorICAgICAgLy8gdGhlIHBvaW50ZXIsIGFuZCBhIGxlZ2FsIGludGVnZXIgdHlwZS4KKyAgICAgIHVuc2lnbmVkIERlc3RTaXplID0gVHktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICAgIGlmIChETC5pc0xlZ2FsSW50ZWdlcihEZXN0U2l6ZSkgJiYKKyAgICAgICAgICBEZXN0U2l6ZSA+PSBETC5nZXRQb2ludGVyVHlwZVNpemVJbkJpdHMoT3BUeSkpCisgICAgICAgIHJldHVybiBUVEk6OlRDQ19GcmVlOworCisgICAgICAvLyBPdGhlcndpc2UgaXQncyBub3QgYSBuby1vcC4KKyAgICAgIHJldHVybiBUVEk6OlRDQ19CYXNpYzsKKyAgICB9CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6VHJ1bmM6CisgICAgICAvLyB0cnVuYyB0byBhIG5hdGl2ZSB0eXBlIGlzIGZyZWUgKGFzc3VtaW5nIHRoZSB0YXJnZXQgaGFzIGNvbXBhcmUgYW5kCisgICAgICAvLyBzaGlmdC1yaWdodCBvZiB0aGUgc2FtZSB3aWR0aCkuCisgICAgICBpZiAoREwuaXNMZWdhbEludGVnZXIoREwuZ2V0VHlwZVNpemVJbkJpdHMoVHkpKSkKKyAgICAgICAgcmV0dXJuIFRUSTo6VENDX0ZyZWU7CisKKyAgICAgIHJldHVybiBUVEk6OlRDQ19CYXNpYzsKKyAgICB9CisgIH0KKworICBpbnQgZ2V0R0VQQ29zdChUeXBlICpQb2ludGVlVHlwZSwgY29uc3QgVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gT3BlcmFuZHMpIHsKKyAgICAvLyBJbiB0aGUgYmFzaWMgbW9kZWwsIHdlIGp1c3QgYXNzdW1lIHRoYXQgYWxsLWNvbnN0YW50IEdFUHMgd2lsbCBiZSBmb2xkZWQKKyAgICAvLyBpbnRvIHRoZWlyIHVzZXMgdmlhIGFkZHJlc3NpbmcgbW9kZXMuCisgICAgZm9yICh1bnNpZ25lZCBJZHggPSAwLCBTaXplID0gT3BlcmFuZHMuc2l6ZSgpOyBJZHggIT0gU2l6ZTsgKytJZHgpCisgICAgICBpZiAoIWlzYTxDb25zdGFudD4oT3BlcmFuZHNbSWR4XSkpCisgICAgICAgIHJldHVybiBUVEk6OlRDQ19CYXNpYzsKKworICAgIHJldHVybiBUVEk6OlRDQ19GcmVlOworICB9CisKKyAgdW5zaWduZWQgZ2V0RXN0aW1hdGVkTnVtYmVyT2ZDYXNlQ2x1c3RlcnMoY29uc3QgU3dpdGNoSW5zdCAmU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZKVFNpemUpIHsKKyAgICBKVFNpemUgPSAwOworICAgIHJldHVybiBTSS5nZXROdW1DYXNlcygpOworICB9CisKKyAgaW50IGdldEV4dENvc3QoY29uc3QgSW5zdHJ1Y3Rpb24gKkksIGNvbnN0IFZhbHVlICpTcmMpIHsKKyAgICByZXR1cm4gVFRJOjpUQ0NfQmFzaWM7CisgIH0KKworICB1bnNpZ25lZCBnZXRDYWxsQ29zdChGdW5jdGlvblR5cGUgKkZUeSwgaW50IE51bUFyZ3MpIHsKKyAgICBhc3NlcnQoRlR5ICYmICJGdW5jdGlvblR5cGUgbXVzdCBiZSBwcm92aWRlZCB0byB0aGlzIHJvdXRpbmUuIik7CisKKyAgICAvLyBUaGUgdGFyZ2V0LWluZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIGp1c3QgbWVhc3VyZXMgdGhlIHNpemUgb2YgdGhlCisgICAgLy8gZnVuY3Rpb24gYnkgYXBwcm94aW1hdGluZyB0aGF0IGVhY2ggYXJndW1lbnQgd2lsbCB0YWtlIG9uIGF2ZXJhZ2Ugb25lCisgICAgLy8gaW5zdHJ1Y3Rpb24gdG8gcHJlcGFyZS4KKworICAgIGlmIChOdW1BcmdzIDwgMCkKKyAgICAgIC8vIFNldCB0aGUgYXJndW1lbnQgbnVtYmVyIHRvIHRoZSBudW1iZXIgb2YgZXhwbGljaXQgYXJndW1lbnRzIGluIHRoZQorICAgICAgLy8gZnVuY3Rpb24uCisgICAgICBOdW1BcmdzID0gRlR5LT5nZXROdW1QYXJhbXMoKTsKKworICAgIHJldHVybiBUVEk6OlRDQ19CYXNpYyAqIChOdW1BcmdzICsgMSk7CisgIH0KKworICB1bnNpZ25lZCBnZXRJbmxpbmluZ1RocmVzaG9sZE11bHRpcGxpZXIoKSB7IHJldHVybiAxOyB9CisKKyAgdW5zaWduZWQgZ2V0SW50cmluc2ljQ29zdChJbnRyaW5zaWM6OklEIElJRCwgVHlwZSAqUmV0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZSAqPiBQYXJhbVR5cykgeworICAgIHN3aXRjaCAoSUlEKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIC8vIEludHJpbnNpY3MgcmFyZWx5IChpZiBldmVyKSBoYXZlIG5vcm1hbCBhcmd1bWVudCBzZXR1cCBjb25zdHJhaW50cy4KKyAgICAgIC8vIE1vZGVsIHRoZW0gYXMgaGF2aW5nIGEgYmFzaWMgaW5zdHJ1Y3Rpb24gY29zdC4KKyAgICAgIC8vIEZJWE1FOiBUaGlzIGlzIHdyb25nIGZvciBsaWJjIGludHJpbnNpY3MuCisgICAgICByZXR1cm4gVFRJOjpUQ0NfQmFzaWM7CisKKyAgICBjYXNlIEludHJpbnNpYzo6YW5ub3RhdGlvbjoKKyAgICBjYXNlIEludHJpbnNpYzo6YXNzdW1lOgorICAgIGNhc2UgSW50cmluc2ljOjpzaWRlZWZmZWN0OgorICAgIGNhc2UgSW50cmluc2ljOjpkYmdfZGVjbGFyZToKKyAgICBjYXNlIEludHJpbnNpYzo6ZGJnX3ZhbHVlOgorICAgIGNhc2UgSW50cmluc2ljOjppbnZhcmlhbnRfc3RhcnQ6CisgICAgY2FzZSBJbnRyaW5zaWM6OmludmFyaWFudF9lbmQ6CisgICAgY2FzZSBJbnRyaW5zaWM6OmxpZmV0aW1lX3N0YXJ0OgorICAgIGNhc2UgSW50cmluc2ljOjpsaWZldGltZV9lbmQ6CisgICAgY2FzZSBJbnRyaW5zaWM6Om9iamVjdHNpemU6CisgICAgY2FzZSBJbnRyaW5zaWM6OnB0cl9hbm5vdGF0aW9uOgorICAgIGNhc2UgSW50cmluc2ljOjp2YXJfYW5ub3RhdGlvbjoKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2djX3Jlc3VsdDoKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2djX3JlbG9jYXRlOgorICAgIGNhc2UgSW50cmluc2ljOjpjb3JvX2FsbG9jOgorICAgIGNhc2UgSW50cmluc2ljOjpjb3JvX2JlZ2luOgorICAgIGNhc2UgSW50cmluc2ljOjpjb3JvX2ZyZWU6CisgICAgY2FzZSBJbnRyaW5zaWM6OmNvcm9fZW5kOgorICAgIGNhc2UgSW50cmluc2ljOjpjb3JvX2ZyYW1lOgorICAgIGNhc2UgSW50cmluc2ljOjpjb3JvX3NpemU6CisgICAgY2FzZSBJbnRyaW5zaWM6OmNvcm9fc3VzcGVuZDoKKyAgICBjYXNlIEludHJpbnNpYzo6Y29yb19wYXJhbToKKyAgICBjYXNlIEludHJpbnNpYzo6Y29yb19zdWJmbl9hZGRyOgorICAgICAgLy8gVGhlc2UgaW50cmluc2ljcyBkb24ndCBhY3R1YWxseSByZXByZXNlbnQgY29kZSBhZnRlciBsb3dlcmluZy4KKyAgICAgIHJldHVybiBUVEk6OlRDQ19GcmVlOworICAgIH0KKyAgfQorCisgIGJvb2wgaGFzQnJhbmNoRGl2ZXJnZW5jZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgYm9vbCBpc1NvdXJjZU9mRGl2ZXJnZW5jZShjb25zdCBWYWx1ZSAqVikgeyByZXR1cm4gZmFsc2U7IH0KKworICBib29sIGlzQWx3YXlzVW5pZm9ybShjb25zdCBWYWx1ZSAqVikgeyByZXR1cm4gZmFsc2U7IH0KKworICB1bnNpZ25lZCBnZXRGbGF0QWRkcmVzc1NwYWNlICgpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBib29sIGlzTG93ZXJlZFRvQ2FsbChjb25zdCBGdW5jdGlvbiAqRikgeworICAgIGFzc2VydChGICYmICJBIGNvbmNyZXRlIGZ1bmN0aW9uIG11c3QgYmUgcHJvdmlkZWQgdG8gdGhpcyByb3V0aW5lLiIpOworCisgICAgLy8gRklYTUU6IFRoZXNlIHNob3VsZCBhbG1vc3QgY2VydGFpbmx5IG5vdCBiZSBoYW5kbGVkIGhlcmUsIGFuZCBpbnN0ZWFkCisgICAgLy8gaGFuZGxlZCB3aXRoIHRoZSBoZWxwIG9mIFRMSSBvciB0aGUgdGFyZ2V0IGl0c2VsZi4gVGhpcyB3YXMgbGFyZ2VseQorICAgIC8vIHBvcnRlZCBmcm9tIGV4aXN0aW5nIGFuYWx5c2lzIGhldXJpc3RpY3MgaGVyZSBzbyB0aGF0IHN1Y2ggcmVmYWN0b3JpbmdzCisgICAgLy8gY2FuIHRha2UgcGxhY2UgaW4gdGhlIGZ1dHVyZS4KKworICAgIGlmIChGLT5pc0ludHJpbnNpYygpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKEYtPmhhc0xvY2FsTGlua2FnZSgpIHx8ICFGLT5oYXNOYW1lKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIFN0cmluZ1JlZiBOYW1lID0gRi0+Z2V0TmFtZSgpOworCisgICAgLy8gVGhlc2Ugd2lsbCBhbGwgbGlrZWx5IGxvd2VyIHRvIGEgc2luZ2xlIHNlbGVjdGlvbiBEQUcgbm9kZS4KKyAgICBpZiAoTmFtZSA9PSAiY29weXNpZ24iIHx8IE5hbWUgPT0gImNvcHlzaWduZiIgfHwgTmFtZSA9PSAiY29weXNpZ25sIiB8fAorICAgICAgICBOYW1lID09ICJmYWJzIiB8fCBOYW1lID09ICJmYWJzZiIgfHwgTmFtZSA9PSAiZmFic2wiIHx8IE5hbWUgPT0gInNpbiIgfHwKKyAgICAgICAgTmFtZSA9PSAiZm1pbiIgfHwgTmFtZSA9PSAiZm1pbmYiIHx8IE5hbWUgPT0gImZtaW5sIiB8fAorICAgICAgICBOYW1lID09ICJmbWF4IiB8fCBOYW1lID09ICJmbWF4ZiIgfHwgTmFtZSA9PSAiZm1heGwiIHx8CisgICAgICAgIE5hbWUgPT0gInNpbmYiIHx8IE5hbWUgPT0gInNpbmwiIHx8IE5hbWUgPT0gImNvcyIgfHwgTmFtZSA9PSAiY29zZiIgfHwKKyAgICAgICAgTmFtZSA9PSAiY29zbCIgfHwgTmFtZSA9PSAic3FydCIgfHwgTmFtZSA9PSAic3FydGYiIHx8IE5hbWUgPT0gInNxcnRsIikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFRoZXNlIGFyZSBhbGwgbGlrZWx5IHRvIGJlIG9wdGltaXplZCBpbnRvIHNvbWV0aGluZyBzbWFsbGVyLgorICAgIGlmIChOYW1lID09ICJwb3ciIHx8IE5hbWUgPT0gInBvd2YiIHx8IE5hbWUgPT0gInBvd2wiIHx8IE5hbWUgPT0gImV4cDIiIHx8CisgICAgICAgIE5hbWUgPT0gImV4cDJsIiB8fCBOYW1lID09ICJleHAyZiIgfHwgTmFtZSA9PSAiZmxvb3IiIHx8CisgICAgICAgIE5hbWUgPT0gImZsb29yZiIgfHwgTmFtZSA9PSAiY2VpbCIgfHwgTmFtZSA9PSAicm91bmQiIHx8CisgICAgICAgIE5hbWUgPT0gImZmcyIgfHwgTmFtZSA9PSAiZmZzbCIgfHwgTmFtZSA9PSAiYWJzIiB8fCBOYW1lID09ICJsYWJzIiB8fAorICAgICAgICBOYW1lID09ICJsbGFicyIpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHZvaWQgZ2V0VW5yb2xsaW5nUHJlZmVyZW5jZXMoTG9vcCAqLCBTY2FsYXJFdm9sdXRpb24gJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVEk6OlVucm9sbGluZ1ByZWZlcmVuY2VzICYpIHt9CisKKyAgYm9vbCBpc0xlZ2FsQWRkSW1tZWRpYXRlKGludDY0X3QgSW1tKSB7IHJldHVybiBmYWxzZTsgfQorCisgIGJvb2wgaXNMZWdhbElDbXBJbW1lZGlhdGUoaW50NjRfdCBJbW0pIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgYm9vbCBpc0xlZ2FsQWRkcmVzc2luZ01vZGUoVHlwZSAqVHksIEdsb2JhbFZhbHVlICpCYXNlR1YsIGludDY0X3QgQmFzZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNCYXNlUmVnLCBpbnQ2NF90IFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UsIEluc3RydWN0aW9uICpJID0gbnVsbHB0cikgeworICAgIC8vIEd1ZXNzIHRoYXQgb25seSByZWcgYW5kIHJlZytyZWcgYWRkcmVzc2luZyBpcyBhbGxvd2VkLiBUaGlzIGhldXJpc3RpYyBpcworICAgIC8vIHRha2VuIGZyb20gdGhlIGltcGxlbWVudGF0aW9uIG9mIExTUi4KKyAgICByZXR1cm4gIUJhc2VHViAmJiBCYXNlT2Zmc2V0ID09IDAgJiYgKFNjYWxlID09IDAgfHwgU2NhbGUgPT0gMSk7CisgIH0KKworICBib29sIGlzTFNSQ29zdExlc3MoVFRJOjpMU1JDb3N0ICZDMSwgVFRJOjpMU1JDb3N0ICZDMikgeworICAgIHJldHVybiBzdGQ6OnRpZShDMS5OdW1SZWdzLCBDMS5BZGRSZWNDb3N0LCBDMS5OdW1JVk11bHMsIEMxLk51bUJhc2VBZGRzLAorICAgICAgICAgICAgICAgICAgICBDMS5TY2FsZUNvc3QsIEMxLkltbUNvc3QsIEMxLlNldHVwQ29zdCkgPAorICAgICAgICAgICBzdGQ6OnRpZShDMi5OdW1SZWdzLCBDMi5BZGRSZWNDb3N0LCBDMi5OdW1JVk11bHMsIEMyLk51bUJhc2VBZGRzLAorICAgICAgICAgICAgICAgICAgICBDMi5TY2FsZUNvc3QsIEMyLkltbUNvc3QsIEMyLlNldHVwQ29zdCk7CisgIH0KKworICBib29sIGNhbk1hY3JvRnVzZUNtcCgpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgYm9vbCBzaG91bGRGYXZvclBvc3RJbmMoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIGJvb2wgaXNMZWdhbE1hc2tlZFN0b3JlKFR5cGUgKkRhdGFUeXBlKSB7IHJldHVybiBmYWxzZTsgfQorCisgIGJvb2wgaXNMZWdhbE1hc2tlZExvYWQoVHlwZSAqRGF0YVR5cGUpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgYm9vbCBpc0xlZ2FsTWFza2VkU2NhdHRlcihUeXBlICpEYXRhVHlwZSkgeyByZXR1cm4gZmFsc2U7IH0KKworICBib29sIGlzTGVnYWxNYXNrZWRHYXRoZXIoVHlwZSAqRGF0YVR5cGUpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgYm9vbCBoYXNEaXZSZW1PcChUeXBlICpEYXRhVHlwZSwgYm9vbCBJc1NpZ25lZCkgeyByZXR1cm4gZmFsc2U7IH0KKworICBib29sIGhhc1ZvbGF0aWxlVmFyaWFudChJbnN0cnVjdGlvbiAqSSwgdW5zaWduZWQgQWRkclNwYWNlKSB7IHJldHVybiBmYWxzZTsgfQorCisgIGJvb2wgcHJlZmVyc1ZlY3Rvcml6ZWRBZGRyZXNzaW5nKCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgIGludCBnZXRTY2FsaW5nRmFjdG9yQ29zdChUeXBlICpUeSwgR2xvYmFsVmFsdWUgKkJhc2VHViwgaW50NjRfdCBCYXNlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNCYXNlUmVnLCBpbnQ2NF90IFNjYWxlLCB1bnNpZ25lZCBBZGRyU3BhY2UpIHsKKyAgICAvLyBHdWVzcyB0aGF0IGFsbCBsZWdhbCBhZGRyZXNzaW5nIG1vZGUgYXJlIGZyZWUuCisgICAgaWYgKGlzTGVnYWxBZGRyZXNzaW5nTW9kZShUeSwgQmFzZUdWLCBCYXNlT2Zmc2V0LCBIYXNCYXNlUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGUsIEFkZHJTcGFjZSkpCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBib29sIExTUldpdGhJbnN0clF1ZXJpZXMoKSB7IHJldHVybiBmYWxzZTsgfQorCisgIGJvb2wgaXNUcnVuY2F0ZUZyZWUoVHlwZSAqVHkxLCBUeXBlICpUeTIpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgYm9vbCBpc1Byb2ZpdGFibGVUb0hvaXN0KEluc3RydWN0aW9uICpJKSB7IHJldHVybiB0cnVlOyB9CisKKyAgYm9vbCB1c2VBQSgpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgYm9vbCBpc1R5cGVMZWdhbChUeXBlICpUeSkgeyByZXR1cm4gZmFsc2U7IH0KKworICB1bnNpZ25lZCBnZXRKdW1wQnVmQWxpZ25tZW50KCkgeyByZXR1cm4gMDsgfQorCisgIHVuc2lnbmVkIGdldEp1bXBCdWZTaXplKCkgeyByZXR1cm4gMDsgfQorCisgIGJvb2wgc2hvdWxkQnVpbGRMb29rdXBUYWJsZXMoKSB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgc2hvdWxkQnVpbGRMb29rdXBUYWJsZXNGb3JDb25zdGFudChDb25zdGFudCAqQykgeyByZXR1cm4gdHJ1ZTsgfQorCisgIGJvb2wgdXNlQ29sZENDRm9yQ29sZENhbGwoRnVuY3Rpb24gJkYpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgdW5zaWduZWQgZ2V0U2NhbGFyaXphdGlvbk92ZXJoZWFkKFR5cGUgKlR5LCBib29sIEluc2VydCwgYm9vbCBFeHRyYWN0KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1bnNpZ25lZCBnZXRPcGVyYW5kc1NjYWxhcml6YXRpb25PdmVyaGVhZChBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWRikgeyByZXR1cm4gMDsgfQorCisgIGJvb2wgc3VwcG9ydHNFZmZpY2llbnRWZWN0b3JFbGVtZW50TG9hZFN0b3JlKCkgeyByZXR1cm4gZmFsc2U7IH0KKworICBib29sIGVuYWJsZUFnZ3Jlc3NpdmVJbnRlcmxlYXZpbmcoYm9vbCBMb29wSGFzUmVkdWN0aW9ucykgeyByZXR1cm4gZmFsc2U7IH0KKworICBjb25zdCBUVEk6Ok1lbUNtcEV4cGFuc2lvbk9wdGlvbnMgKmVuYWJsZU1lbUNtcEV4cGFuc2lvbigKKyAgICAgIGJvb2wgSXNaZXJvQ21wKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBib29sIGVuYWJsZUludGVybGVhdmVkQWNjZXNzVmVjdG9yaXphdGlvbigpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgYm9vbCBpc0ZQVmVjdG9yaXphdGlvblBvdGVudGlhbGx5VW5zYWZlKCkgeyByZXR1cm4gZmFsc2U7IH0KKworICBib29sIGFsbG93c01pc2FsaWduZWRNZW1vcnlBY2Nlc3NlcyhMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQml0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpGYXN0KSB7IHJldHVybiBmYWxzZTsgfQorCisgIFRUSTo6UG9wY250U3VwcG9ydEtpbmQgZ2V0UG9wY250U3VwcG9ydCh1bnNpZ25lZCBJbnRUeVdpZHRoSW5CaXQpIHsKKyAgICByZXR1cm4gVFRJOjpQU0tfU29mdHdhcmU7CisgIH0KKworICBib29sIGhhdmVGYXN0U3FydChUeXBlICpUeSkgeyByZXR1cm4gZmFsc2U7IH0KKworICBib29sIGlzRkNtcE9yZENoZWFwZXJUaGFuRkNtcFplcm8oVHlwZSAqVHkpIHsgcmV0dXJuIHRydWU7IH0KKyAgCisgIHVuc2lnbmVkIGdldEZQT3BDb3N0KFR5cGUgKlR5KSB7IHJldHVybiBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpUQ0NfQmFzaWM7IH0KKworICBpbnQgZ2V0SW50SW1tQ29kZVNpemVDb3N0KHVuc2lnbmVkIE9wY29kZSwgdW5zaWduZWQgSWR4LCBjb25zdCBBUEludCAmSW1tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKlR5KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1bnNpZ25lZCBnZXRJbnRJbW1Db3N0KGNvbnN0IEFQSW50ICZJbW0sIFR5cGUgKlR5KSB7IHJldHVybiBUVEk6OlRDQ19CYXNpYzsgfQorCisgIHVuc2lnbmVkIGdldEludEltbUNvc3QodW5zaWduZWQgT3Bjb2RlLCB1bnNpZ25lZCBJZHgsIGNvbnN0IEFQSW50ICZJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqVHkpIHsKKyAgICByZXR1cm4gVFRJOjpUQ0NfRnJlZTsKKyAgfQorCisgIHVuc2lnbmVkIGdldEludEltbUNvc3QoSW50cmluc2ljOjpJRCBJSUQsIHVuc2lnbmVkIElkeCwgY29uc3QgQVBJbnQgJkltbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpUeSkgeworICAgIHJldHVybiBUVEk6OlRDQ19GcmVlOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtYmVyT2ZSZWdpc3RlcnMoYm9vbCBWZWN0b3IpIHsgcmV0dXJuIDg7IH0KKworICB1bnNpZ25lZCBnZXRSZWdpc3RlckJpdFdpZHRoKGJvb2wgVmVjdG9yKSBjb25zdCB7IHJldHVybiAzMjsgfQorCisgIHVuc2lnbmVkIGdldE1pblZlY3RvclJlZ2lzdGVyQml0V2lkdGgoKSB7IHJldHVybiAxMjg7IH0KKworICBib29sIHNob3VsZE1heGltaXplVmVjdG9yQmFuZHdpZHRoKGJvb2wgT3B0U2l6ZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICBib29sCisgIHNob3VsZENvbnNpZGVyQWRkcmVzc1R5cGVQcm9tb3Rpb24oY29uc3QgSW5zdHJ1Y3Rpb24gJkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmQWxsb3dQcm9tb3Rpb25XaXRob3V0Q29tbW9uSGVhZGVyKSB7CisgICAgQWxsb3dQcm9tb3Rpb25XaXRob3V0Q29tbW9uSGVhZGVyID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdW5zaWduZWQgZ2V0Q2FjaGVMaW5lU2l6ZSgpIHsgcmV0dXJuIDA7IH0KKworICBsbHZtOjpPcHRpb25hbDx1bnNpZ25lZD4gZ2V0Q2FjaGVTaXplKFRhcmdldFRyYW5zZm9ybUluZm86OkNhY2hlTGV2ZWwgTGV2ZWwpIHsKKyAgICBzd2l0Y2ggKExldmVsKSB7CisgICAgY2FzZSBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpDYWNoZUxldmVsOjpMMUQ6CisgICAgICBMTFZNX0ZBTExUSFJPVUdIOworICAgIGNhc2UgVGFyZ2V0VHJhbnNmb3JtSW5mbzo6Q2FjaGVMZXZlbDo6TDJEOgorICAgICAgcmV0dXJuIGxsdm06Ok9wdGlvbmFsPHVuc2lnbmVkPigpOworICAgIH0KKworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gVGFyZ2V0VHJhbnNmb3JtSW5mbzo6Q2FjaGVMZXZlbCIpOworICB9CisKKyAgbGx2bTo6T3B0aW9uYWw8dW5zaWduZWQ+IGdldENhY2hlQXNzb2NpYXRpdml0eSgKKyAgICBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpDYWNoZUxldmVsIExldmVsKSB7CisgICAgc3dpdGNoIChMZXZlbCkgeworICAgIGNhc2UgVGFyZ2V0VHJhbnNmb3JtSW5mbzo6Q2FjaGVMZXZlbDo6TDFEOgorICAgICAgTExWTV9GQUxMVEhST1VHSDsKKyAgICBjYXNlIFRhcmdldFRyYW5zZm9ybUluZm86OkNhY2hlTGV2ZWw6OkwyRDoKKyAgICAgIHJldHVybiBsbHZtOjpPcHRpb25hbDx1bnNpZ25lZD4oKTsKKyAgICB9CisKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIFRhcmdldFRyYW5zZm9ybUluZm86OkNhY2hlTGV2ZWwiKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFByZWZldGNoRGlzdGFuY2UoKSB7IHJldHVybiAwOyB9CisKKyAgdW5zaWduZWQgZ2V0TWluUHJlZmV0Y2hTdHJpZGUoKSB7IHJldHVybiAxOyB9CisKKyAgdW5zaWduZWQgZ2V0TWF4UHJlZmV0Y2hJdGVyYXRpb25zQWhlYWQoKSB7IHJldHVybiBVSU5UX01BWDsgfQorCisgIHVuc2lnbmVkIGdldE1heEludGVybGVhdmVGYWN0b3IodW5zaWduZWQgVkYpIHsgcmV0dXJuIDE7IH0KKworICB1bnNpZ25lZCBnZXRBcml0aG1ldGljSW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRJOjpPcGVyYW5kVmFsdWVLaW5kIE9wZDFJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUSTo6T3BlcmFuZFZhbHVlS2luZCBPcGQySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVEk6Ok9wZXJhbmRWYWx1ZVByb3BlcnRpZXMgT3BkMVByb3BJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUSTo6T3BlcmFuZFZhbHVlUHJvcGVydGllcyBPcGQyUHJvcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gQXJncykgeworICAgIHJldHVybiAxOworICB9CisKKyAgdW5zaWduZWQgZ2V0U2h1ZmZsZUNvc3QoVFRJOjpTaHVmZmxlS2luZCBLaW5kLCBUeXBlICpUeSwgaW50IEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpTdWJUcCkgeworICAgIHJldHVybiAxOworICB9CisKKyAgdW5zaWduZWQgZ2V0Q2FzdEluc3RyQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKkRzdCwgVHlwZSAqU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpJKSB7IHJldHVybiAxOyB9CisKKyAgdW5zaWduZWQgZ2V0RXh0cmFjdFdpdGhFeHRlbmRDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZSAqVmVjVHksIHVuc2lnbmVkIEluZGV4KSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICB1bnNpZ25lZCBnZXRDRkluc3RyQ29zdCh1bnNpZ25lZCBPcGNvZGUpIHsgcmV0dXJuIDE7IH0KKworICB1bnNpZ25lZCBnZXRDbXBTZWxJbnN0ckNvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpWYWxUeSwgVHlwZSAqQ29uZFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFZlY3Rvckluc3RyQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlZhbCwgdW5zaWduZWQgSW5kZXgpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE1lbW9yeU9wQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlNyYywgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkcmVzc1NwYWNlLCBjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiAxOworICB9CisKKyAgdW5zaWduZWQgZ2V0TWFza2VkTWVtb3J5T3BDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqU3JjLCB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyZXNzU3BhY2UpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHVuc2lnbmVkIGdldEdhdGhlclNjYXR0ZXJPcENvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpEYXRhVHksIFZhbHVlICpQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWYXJpYWJsZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50KSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICB1bnNpZ25lZCBnZXRJbnRlcmxlYXZlZE1lbW9yeU9wQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlZlY1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSkgeworICAgIHJldHVybiAxOworICB9CisKKyAgdW5zaWduZWQgZ2V0SW50cmluc2ljSW5zdHJDb3N0KEludHJpbnNpYzo6SUQgSUQsIFR5cGUgKlJldFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZSAqPiBUeXMsIEZhc3RNYXRoRmxhZ3MgRk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2NhbGFyaXphdGlvbkNvc3RQYXNzZWQpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICB1bnNpZ25lZCBnZXRJbnRyaW5zaWNJbnN0ckNvc3QoSW50cmluc2ljOjpJRCBJRCwgVHlwZSAqUmV0VHksCisgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLCBGYXN0TWF0aEZsYWdzIEZNRiwgdW5zaWduZWQgVkYpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHVuc2lnbmVkIGdldENhbGxJbnN0ckNvc3QoRnVuY3Rpb24gKkYsIFR5cGUgKlJldFR5LCBBcnJheVJlZjxUeXBlICo+IFR5cykgeworICAgIHJldHVybiAxOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtYmVyT2ZQYXJ0cyhUeXBlICpUcCkgeyByZXR1cm4gMDsgfQorCisgIHVuc2lnbmVkIGdldEFkZHJlc3NDb21wdXRhdGlvbkNvc3QoVHlwZSAqVHAsIFNjYWxhckV2b2x1dGlvbiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKikgeworICAgIHJldHVybiAwOworICB9CisKKyAgdW5zaWduZWQgZ2V0QXJpdGhtZXRpY1JlZHVjdGlvbkNvc3QodW5zaWduZWQsIFR5cGUgKiwgYm9vbCkgeyByZXR1cm4gMTsgfQorCisgIHVuc2lnbmVkIGdldE1pbk1heFJlZHVjdGlvbkNvc3QoVHlwZSAqLCBUeXBlICosIGJvb2wsIGJvb2wpIHsgcmV0dXJuIDE7IH0KKworICB1bnNpZ25lZCBnZXRDb3N0T2ZLZWVwaW5nTGl2ZU92ZXJDYWxsKEFycmF5UmVmPFR5cGUgKj4gVHlzKSB7IHJldHVybiAwOyB9CisKKyAgYm9vbCBnZXRUZ3RNZW1JbnRyaW5zaWMoSW50cmluc2ljSW5zdCAqSW5zdCwgTWVtSW50cmluc2ljSW5mbyAmSW5mbykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHVuc2lnbmVkIGdldEF0b21pY01lbUludHJpbnNpY01heEVsZW1lbnRTaXplKCkgY29uc3QgeworICAgIC8vIE5vdGUgZm9yIG92ZXJyaWRlczogWW91IG11c3QgZW5zdXJlIGZvciBhbGwgZWxlbWVudCB1bm9yZGVyZWQtYXRvbWljCisgICAgLy8gbWVtb3J5IGludHJpbnNpY3MgdGhhdCBhbGwgcG93ZXItb2YtMiBlbGVtZW50IHNpemVzIHVwIHRvLCBhbmQKKyAgICAvLyBpbmNsdWRpbmcsIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBtZXRob2QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcKKyAgICAvLyBydW50aW1lIGxpYiBjYWxsLiBUaGVzZSBydW50aW1lIGxpYiBjYWxsIGRlZmluaXRpb25zIGNhbiBiZSBmb3VuZAorICAgIC8vIGluIFJ1bnRpbWVMaWJjYWxscy5oCisgICAgcmV0dXJuIDA7CisgIH0KKworICBWYWx1ZSAqZ2V0T3JDcmVhdGVSZXN1bHRGcm9tTWVtSW50cmluc2ljKEludHJpbnNpY0luc3QgKkluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqRXhwZWN0ZWRUeXBlKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBUeXBlICpnZXRNZW1jcHlMb29wTG93ZXJpbmdUeXBlKExMVk1Db250ZXh0ICZDb250ZXh0LCBWYWx1ZSAqTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY0FsaWduLCB1bnNpZ25lZCBEZXN0QWxpZ24pIGNvbnN0IHsKKyAgICByZXR1cm4gVHlwZTo6Z2V0SW50OFR5KENvbnRleHQpOworICB9CisKKyAgdm9pZCBnZXRNZW1jcHlMb29wUmVzaWR1YWxMb3dlcmluZ1R5cGUoU21hbGxWZWN0b3JJbXBsPFR5cGUgKj4gJk9wc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlbWFpbmluZ0J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdEFsaWduKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBSZW1haW5pbmdCeXRlczsgKytpKQorICAgICAgT3BzT3V0LnB1c2hfYmFjayhUeXBlOjpnZXRJbnQ4VHkoQ29udGV4dCkpOworICB9CisKKyAgYm9vbCBhcmVJbmxpbmVDb21wYXRpYmxlKGNvbnN0IEZ1bmN0aW9uICpDYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiAqQ2FsbGVlKSBjb25zdCB7CisgICAgcmV0dXJuIChDYWxsZXItPmdldEZuQXR0cmlidXRlKCJ0YXJnZXQtY3B1IikgPT0KKyAgICAgICAgICAgIENhbGxlZS0+Z2V0Rm5BdHRyaWJ1dGUoInRhcmdldC1jcHUiKSkgJiYKKyAgICAgICAgICAgKENhbGxlci0+Z2V0Rm5BdHRyaWJ1dGUoInRhcmdldC1mZWF0dXJlcyIpID09CisgICAgICAgICAgICBDYWxsZWUtPmdldEZuQXR0cmlidXRlKCJ0YXJnZXQtZmVhdHVyZXMiKSk7CisgIH0KKworICBib29sIGlzSW5kZXhlZExvYWRMZWdhbChUVEk6Ok1lbUluZGV4ZWRNb2RlIE1vZGUsIFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgaXNJbmRleGVkU3RvcmVMZWdhbChUVEk6Ok1lbUluZGV4ZWRNb2RlIE1vZGUsIFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB1bnNpZ25lZCBnZXRMb2FkU3RvcmVWZWNSZWdCaXRXaWR0aCh1bnNpZ25lZCBBZGRyU3BhY2UpIGNvbnN0IHsgcmV0dXJuIDEyODsgfQorCisgIGJvb2wgaXNMZWdhbFRvVmVjdG9yaXplTG9hZChMb2FkSW5zdCAqTEkpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICBib29sIGlzTGVnYWxUb1ZlY3Rvcml6ZVN0b3JlKFN0b3JlSW5zdCAqU0kpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICBib29sIGlzTGVnYWxUb1ZlY3Rvcml6ZUxvYWRDaGFpbih1bnNpZ25lZCBDaGFpblNpemVJbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSkgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCBpc0xlZ2FsVG9WZWN0b3JpemVTdG9yZUNoYWluKHVuc2lnbmVkIENoYWluU2l6ZUluQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHVuc2lnbmVkIGdldExvYWRWZWN0b3JGYWN0b3IodW5zaWduZWQgVkYsIHVuc2lnbmVkIExvYWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENoYWluU2l6ZUluQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZSAqVmVjVHkpIGNvbnN0IHsKKyAgICByZXR1cm4gVkY7CisgIH0KKworICB1bnNpZ25lZCBnZXRTdG9yZVZlY3RvckZhY3Rvcih1bnNpZ25lZCBWRiwgdW5zaWduZWQgU3RvcmVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDaGFpblNpemVJbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JUeXBlICpWZWNUeSkgY29uc3QgeworICAgIHJldHVybiBWRjsKKyAgfQorCisgIGJvb2wgdXNlUmVkdWN0aW9uSW50cmluc2ljKHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUSTo6UmVkdWN0aW9uRmxhZ3MgRmxhZ3MpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIHNob3VsZEV4cGFuZFJlZHVjdGlvbihjb25zdCBJbnRyaW5zaWNJbnN0ICpJSSkgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8gT2J0YWluIHRoZSBtaW5pbXVtIHJlcXVpcmVkIHNpemUgdG8gaG9sZCB0aGUgdmFsdWUgKHdpdGhvdXQgdGhlIHNpZ24pCisgIC8vIEluIGNhc2Ugb2YgYSB2ZWN0b3IgaXQgcmV0dXJucyB0aGUgbWluIHJlcXVpcmVkIHNpemUgZm9yIG9uZSBlbGVtZW50LgorICB1bnNpZ25lZCBtaW5SZXF1aXJlZEVsZW1lbnRTaXplKGNvbnN0IFZhbHVlKiBWYWwsIGJvb2wgJmlzU2lnbmVkKSB7CisgICAgaWYgKGlzYTxDb25zdGFudERhdGFWZWN0b3I+KFZhbCkgfHwgaXNhPENvbnN0YW50VmVjdG9yPihWYWwpKSB7CisgICAgICBjb25zdCBhdXRvKiBWZWN0b3JWYWx1ZSA9IGNhc3Q8Q29uc3RhbnQ+KFZhbCk7CisKKyAgICAgIC8vIEluIGNhc2Ugb2YgYSB2ZWN0b3IgbmVlZCB0byBwaWNrIHRoZSBtYXggYmV0d2VlbiB0aGUgbWluCisgICAgICAvLyByZXF1aXJlZCBzaXplIGZvciBlYWNoIGVsZW1lbnQKKyAgICAgIGF1dG8gKlZUID0gY2FzdDxWZWN0b3JUeXBlPihWYWwtPmdldFR5cGUoKSk7CisKKyAgICAgIC8vIEFzc3VtZSB1bnNpZ25lZCBlbGVtZW50cworICAgICAgaXNTaWduZWQgPSBmYWxzZTsKKworICAgICAgLy8gVGhlIG1heCByZXF1aXJlZCBzaXplIGlzIHRoZSB0b3RhbCB2ZWN0b3Igd2lkdGggZGl2aWRlZCBieSBudW0KKyAgICAgIC8vIG9mIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IKKyAgICAgIHVuc2lnbmVkIE1heFJlcXVpcmVkU2l6ZSA9IFZULT5nZXRCaXRXaWR0aCgpIC8gVlQtPmdldE51bUVsZW1lbnRzKCk7CisKKyAgICAgIHVuc2lnbmVkIE1pblJlcXVpcmVkU2l6ZSA9IDA7CisgICAgICBmb3IodW5zaWduZWQgaSA9IDAsIGUgPSBWVC0+Z2V0TnVtRWxlbWVudHMoKTsgaSA8IGU7ICsraSkgeworICAgICAgICBpZiAoYXV0byogSW50RWxlbWVudCA9CisgICAgICAgICAgICAgIGR5bl9jYXN0PENvbnN0YW50SW50PihWZWN0b3JWYWx1ZS0+Z2V0QWdncmVnYXRlRWxlbWVudChpKSkpIHsKKyAgICAgICAgICBib29sIHNpZ25lZEVsZW1lbnQgPSBJbnRFbGVtZW50LT5nZXRWYWx1ZSgpLmlzTmVnYXRpdmUoKTsKKyAgICAgICAgICAvLyBHZXQgdGhlIGVsZW1lbnQgbWluIHJlcXVpcmVkIHNpemUuCisgICAgICAgICAgdW5zaWduZWQgRWxlbWVudE1pblJlcXVpcmVkU2l6ZSA9CisgICAgICAgICAgICBJbnRFbGVtZW50LT5nZXRWYWx1ZSgpLmdldE1pblNpZ25lZEJpdHMoKSAtIDE7CisgICAgICAgICAgLy8gSW4gY2FzZSBvbmUgZWxlbWVudCBpcyBzaWduZWQgdGhlbiBhbGwgdGhlIHZlY3RvciBpcyBzaWduZWQuCisgICAgICAgICAgaXNTaWduZWQgfD0gc2lnbmVkRWxlbWVudDsKKyAgICAgICAgICAvLyBTYXZlIHRoZSBtYXggcmVxdWlyZWQgYml0IHNpemUgYmV0d2VlbiBhbGwgdGhlIGVsZW1lbnRzLgorICAgICAgICAgIE1pblJlcXVpcmVkU2l6ZSA9IHN0ZDo6bWF4KE1pblJlcXVpcmVkU2l6ZSwgRWxlbWVudE1pblJlcXVpcmVkU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLy8gbm90IGFuIGludCBjb25zdGFudCBlbGVtZW50CisgICAgICAgICAgcmV0dXJuIE1heFJlcXVpcmVkU2l6ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIE1pblJlcXVpcmVkU2l6ZTsKKyAgICB9CisKKyAgICBpZiAoY29uc3QgYXV0byogQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVmFsKSkgeworICAgICAgaXNTaWduZWQgPSBDSS0+Z2V0VmFsdWUoKS5pc05lZ2F0aXZlKCk7CisgICAgICByZXR1cm4gQ0ktPmdldFZhbHVlKCkuZ2V0TWluU2lnbmVkQml0cygpIC0gMTsKKyAgICB9CisKKyAgICBpZiAoY29uc3QgYXV0byogQ2FzdCA9IGR5bl9jYXN0PFNFeHRJbnN0PihWYWwpKSB7CisgICAgICBpc1NpZ25lZCA9IHRydWU7CisgICAgICByZXR1cm4gQ2FzdC0+Z2V0U3JjVHkoKS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpIC0gMTsKKyAgICB9CisKKyAgICBpZiAoY29uc3QgYXV0byogQ2FzdCA9IGR5bl9jYXN0PFpFeHRJbnN0PihWYWwpKSB7CisgICAgICBpc1NpZ25lZCA9IGZhbHNlOworICAgICAgcmV0dXJuIENhc3QtPmdldFNyY1R5KCktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICB9CisKKyAgICBpc1NpZ25lZCA9IGZhbHNlOworICAgIHJldHVybiBWYWwtPmdldFR5cGUoKS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICB9CisKKyAgYm9vbCBpc1N0cmlkZWRBY2Nlc3MoY29uc3QgU0NFViAqUHRyKSB7CisgICAgcmV0dXJuIFB0ciAmJiBpc2E8U0NFVkFkZFJlY0V4cHI+KFB0cik7CisgIH0KKworICBjb25zdCBTQ0VWQ29uc3RhbnQgKmdldENvbnN0YW50U3RyaWRlU3RlcChTY2FsYXJFdm9sdXRpb24gKlNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpQdHIpIHsKKyAgICBpZiAoIWlzU3RyaWRlZEFjY2VzcyhQdHIpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFkZFJlYyA9IGNhc3Q8U0NFVkFkZFJlY0V4cHI+KFB0cik7CisgICAgcmV0dXJuIGR5bl9jYXN0PFNDRVZDb25zdGFudD4oQWRkUmVjLT5nZXRTdGVwUmVjdXJyZW5jZSgqU0UpKTsKKyAgfQorCisgIGJvb2wgaXNDb25zdGFudFN0cmlkZWRBY2Nlc3NMZXNzVGhhbihTY2FsYXJFdm9sdXRpb24gKlNFLCBjb25zdCBTQ0VWICpQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IE1lcmdlRGlzdGFuY2UpIHsKKyAgICBjb25zdCBTQ0VWQ29uc3RhbnQgKlN0ZXAgPSBnZXRDb25zdGFudFN0cmlkZVN0ZXAoU0UsIFB0cik7CisgICAgaWYgKCFTdGVwKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIEFQSW50IFN0cmlkZVZhbCA9IFN0ZXAtPmdldEFQSW50KCk7CisgICAgaWYgKFN0cmlkZVZhbC5nZXRCaXRXaWR0aCgpID4gNjQpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gRklYTUU6IE5lZWQgdG8gdGFrZSBhYnNvbHV0ZSB2YWx1ZSBmb3IgbmVnYXRpdmUgc3RyaWRlIGNhc2UuCisgICAgcmV0dXJuIFN0cmlkZVZhbC5nZXRTRXh0VmFsdWUoKSA8IE1lcmdlRGlzdGFuY2U7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQ1JUUCBiYXNlIGNsYXNzIGZvciB1c2UgYXMgYSBtaXgtaW4gdGhhdCBhaWRzIGltcGxlbWVudGluZworLy8vIGEgVGFyZ2V0VHJhbnNmb3JtSW5mby1jb21wYXRpYmxlIGNsYXNzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUYXJnZXRUcmFuc2Zvcm1JbmZvSW1wbENSVFBCYXNlIDogcHVibGljIFRhcmdldFRyYW5zZm9ybUluZm9JbXBsQmFzZSB7Citwcml2YXRlOgorICB0eXBlZGVmIFRhcmdldFRyYW5zZm9ybUluZm9JbXBsQmFzZSBCYXNlVDsKKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBUYXJnZXRUcmFuc2Zvcm1JbmZvSW1wbENSVFBCYXNlKGNvbnN0IERhdGFMYXlvdXQgJkRMKSA6IEJhc2VUKERMKSB7fQorCitwdWJsaWM6CisgIHVzaW5nIEJhc2VUOjpnZXRDYWxsQ29zdDsKKworICB1bnNpZ25lZCBnZXRDYWxsQ29zdChjb25zdCBGdW5jdGlvbiAqRiwgaW50IE51bUFyZ3MpIHsKKyAgICBhc3NlcnQoRiAmJiAiQSBjb25jcmV0ZSBmdW5jdGlvbiBtdXN0IGJlIHByb3ZpZGVkIHRvIHRoaXMgcm91dGluZS4iKTsKKworICAgIGlmIChOdW1BcmdzIDwgMCkKKyAgICAgIC8vIFNldCB0aGUgYXJndW1lbnQgbnVtYmVyIHRvIHRoZSBudW1iZXIgb2YgZXhwbGljaXQgYXJndW1lbnRzIGluIHRoZQorICAgICAgLy8gZnVuY3Rpb24uCisgICAgICBOdW1BcmdzID0gRi0+YXJnX3NpemUoKTsKKworICAgIGlmIChJbnRyaW5zaWM6OklEIElJRCA9IEYtPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICAgIEZ1bmN0aW9uVHlwZSAqRlR5ID0gRi0+Z2V0RnVuY3Rpb25UeXBlKCk7CisgICAgICBTbWFsbFZlY3RvcjxUeXBlICosIDg+IFBhcmFtVHlzKEZUeS0+cGFyYW1fYmVnaW4oKSwgRlR5LT5wYXJhbV9lbmQoKSk7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKQorICAgICAgICAgIC0+Z2V0SW50cmluc2ljQ29zdChJSUQsIEZUeS0+Z2V0UmV0dXJuVHlwZSgpLCBQYXJhbVR5cyk7CisgICAgfQorCisgICAgaWYgKCFzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5pc0xvd2VyZWRUb0NhbGwoRikpCisgICAgICByZXR1cm4gVFRJOjpUQ0NfQmFzaWM7IC8vIEdpdmUgYSBiYXNpYyBjb3N0IGlmIGl0IHdpbGwgYmUgbG93ZXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3RseS4KKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRDYWxsQ29zdChGLT5nZXRGdW5jdGlvblR5cGUoKSwgTnVtQXJncyk7CisgIH0KKworICB1bnNpZ25lZCBnZXRDYWxsQ29zdChjb25zdCBGdW5jdGlvbiAqRiwgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gQXJndW1lbnRzKSB7CisgICAgLy8gU2ltcGx5IGRlbGVnYXRlIHRvIGdlbmVyaWMgaGFuZGxpbmcgb2YgdGhlIGNhbGwuCisgICAgLy8gRklYTUU6IFdlIHNob3VsZCB1c2UgaW5zdHNpbXBsaWZ5IG9yIHNvbWV0aGluZyBlbHNlIHRvIGNhdGNoIGNhbGxzIHdoaWNoCisgICAgLy8gd2lsbCBjb25zdGFudCBmb2xkIHdpdGggdGhlc2UgYXJndW1lbnRzLgorICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRDYWxsQ29zdChGLCBBcmd1bWVudHMuc2l6ZSgpKTsKKyAgfQorCisgIHVzaW5nIEJhc2VUOjpnZXRHRVBDb3N0OworCisgIGludCBnZXRHRVBDb3N0KFR5cGUgKlBvaW50ZWVUeXBlLCBjb25zdCBWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBPcGVyYW5kcykgeworICAgIGNvbnN0IEdsb2JhbFZhbHVlICpCYXNlR1YgPSBudWxscHRyOworICAgIGlmIChQdHIgIT0gbnVsbHB0cikgeworICAgICAgLy8gVE9ETzogd2lsbCByZW1vdmUgdGhpcyB3aGVuIHBvaW50ZXJzIGhhdmUgYW4gb3BhcXVlIHR5cGUuCisgICAgICBhc3NlcnQoUHRyLT5nZXRUeXBlKCktPmdldFNjYWxhclR5cGUoKS0+Z2V0UG9pbnRlckVsZW1lbnRUeXBlKCkgPT0KKyAgICAgICAgICAgICAgICAgUG9pbnRlZVR5cGUgJiYKKyAgICAgICAgICAgICAiZXhwbGljaXQgcG9pbnRlZSB0eXBlIGRvZXNuJ3QgbWF0Y2ggb3BlcmFuZCdzIHBvaW50ZWUgdHlwZSIpOworICAgICAgQmFzZUdWID0gZHluX2Nhc3Q8R2xvYmFsVmFsdWU+KFB0ci0+c3RyaXBQb2ludGVyQ2FzdHMoKSk7CisgICAgfQorICAgIGJvb2wgSGFzQmFzZVJlZyA9IChCYXNlR1YgPT0gbnVsbHB0cik7CisKKyAgICBhdXRvIFB0clNpemVCaXRzID0gREwuZ2V0UG9pbnRlclR5cGVTaXplSW5CaXRzKFB0ci0+Z2V0VHlwZSgpKTsKKyAgICBBUEludCBCYXNlT2Zmc2V0KFB0clNpemVCaXRzLCAwKTsKKyAgICBpbnQ2NF90IFNjYWxlID0gMDsKKworICAgIGF1dG8gR1RJID0gZ2VwX3R5cGVfYmVnaW4oUG9pbnRlZVR5cGUsIE9wZXJhbmRzKTsKKyAgICBUeXBlICpUYXJnZXRUeXBlID0gbnVsbHB0cjsKKworICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgR0VQIGluc3RydWN0aW9uIGhhcyBhIHNpbmdsZSBvcGVyYW5kLAorICAgIC8vIHRoZSBiYXNpcywgdGhlcmVmb3JlIFRhcmdldFR5cGUgaXMgYSBudWxscHRyLgorICAgIGlmIChPcGVyYW5kcy5lbXB0eSgpKQorICAgICAgcmV0dXJuICFCYXNlR1YgPyBUVEk6OlRDQ19GcmVlIDogVFRJOjpUQ0NfQmFzaWM7CisKKyAgICBmb3IgKGF1dG8gSSA9IE9wZXJhbmRzLmJlZ2luKCk7IEkgIT0gT3BlcmFuZHMuZW5kKCk7ICsrSSwgKytHVEkpIHsKKyAgICAgIFRhcmdldFR5cGUgPSBHVEkuZ2V0SW5kZXhlZFR5cGUoKTsKKyAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBjb3N0IG9mIFNjYWxhciBHRVAgd2l0aCBjb25zdGFudCBpbmRleCBhbmQgdGhlCisgICAgICAvLyBjb3N0IG9mIFZlY3RvciBHRVAgd2l0aCBzcGxhdCBjb25zdGFudCBpbmRleCBhcmUgdGhlIHNhbWUuCisgICAgICBjb25zdCBDb25zdGFudEludCAqQ29uc3RJZHggPSBkeW5fY2FzdDxDb25zdGFudEludD4oKkkpOworICAgICAgaWYgKCFDb25zdElkeCkKKyAgICAgICAgaWYgKGF1dG8gU3BsYXQgPSBnZXRTcGxhdFZhbHVlKCpJKSkKKyAgICAgICAgICBDb25zdElkeCA9IGR5bl9jYXN0PENvbnN0YW50SW50PihTcGxhdCk7CisgICAgICBpZiAoU3RydWN0VHlwZSAqU1R5ID0gR1RJLmdldFN0cnVjdFR5cGVPck51bGwoKSkgeworICAgICAgICAvLyBGb3Igc3RydWN0dXJlcyB0aGUgaW5kZXggaXMgYWx3YXlzIHNwbGF0IG9yIHNjYWxhciBjb25zdGFudAorICAgICAgICBhc3NlcnQoQ29uc3RJZHggJiYgIlVuZXhwZWN0ZWQgR0VQIGluZGV4Iik7CisgICAgICAgIHVpbnQ2NF90IEZpZWxkID0gQ29uc3RJZHgtPmdldFpFeHRWYWx1ZSgpOworICAgICAgICBCYXNlT2Zmc2V0ICs9IERMLmdldFN0cnVjdExheW91dChTVHkpLT5nZXRFbGVtZW50T2Zmc2V0KEZpZWxkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgRWxlbWVudFNpemUgPSBETC5nZXRUeXBlQWxsb2NTaXplKEdUSS5nZXRJbmRleGVkVHlwZSgpKTsKKyAgICAgICAgaWYgKENvbnN0SWR4KSB7CisgICAgICAgICAgQmFzZU9mZnNldCArPQorICAgICAgICAgICAgICBDb25zdElkeC0+Z2V0VmFsdWUoKS5zZXh0T3JUcnVuYyhQdHJTaXplQml0cykgKiBFbGVtZW50U2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBOZWVkcyBzY2FsZSByZWdpc3Rlci4KKyAgICAgICAgICBpZiAoU2NhbGUgIT0gMCkKKyAgICAgICAgICAgIC8vIE5vIGFkZHJlc3NpbmcgbW9kZSB0YWtlcyB0d28gc2NhbGUgcmVnaXN0ZXJzLgorICAgICAgICAgICAgcmV0dXJuIFRUSTo6VENDX0Jhc2ljOworICAgICAgICAgIFNjYWxlID0gRWxlbWVudFNpemU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBc3N1bWVzIHRoZSBhZGRyZXNzIHNwYWNlIGlzIDAgd2hlbiBQdHIgaXMgbnVsbHB0ci4KKyAgICB1bnNpZ25lZCBBUyA9CisgICAgICAgIChQdHIgPT0gbnVsbHB0ciA/IDAgOiBQdHItPmdldFR5cGUoKS0+Z2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpKTsKKworICAgIGlmIChzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5pc0xlZ2FsQWRkcmVzc2luZ01vZGUoCisgICAgICAgICAgICBUYXJnZXRUeXBlLCBjb25zdF9jYXN0PEdsb2JhbFZhbHVlICo+KEJhc2VHViksCisgICAgICAgICAgICBCYXNlT2Zmc2V0LnNleHRPclRydW5jKDY0KS5nZXRTRXh0VmFsdWUoKSwgSGFzQmFzZVJlZywgU2NhbGUsIEFTKSkKKyAgICAgIHJldHVybiBUVEk6OlRDQ19GcmVlOworICAgIHJldHVybiBUVEk6OlRDQ19CYXNpYzsKKyAgfQorCisgIHVzaW5nIEJhc2VUOjpnZXRJbnRyaW5zaWNDb3N0OworCisgIHVuc2lnbmVkIGdldEludHJpbnNpY0Nvc3QoSW50cmluc2ljOjpJRCBJSUQsIFR5cGUgKlJldFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IEFyZ3VtZW50cykgeworICAgIC8vIERlbGVnYXRlIHRvIHRoZSBnZW5lcmljIGludHJpbnNpYyBoYW5kbGluZyBjb2RlLiBUaGlzIG1vc3RseSBwcm92aWRlcyBhbgorICAgIC8vIG9wcG9ydHVuaXR5IGZvciB0YXJnZXRzIHRvIChmb3IgZXhhbXBsZSkgc3BlY2lhbCBjYXNlIHRoZSBjb3N0IG9mCisgICAgLy8gY2VydGFpbiBpbnRyaW5zaWNzIGJhc2VkIG9uIGNvbnN0YW50cyB1c2VkIGFzIGFyZ3VtZW50cy4KKyAgICBTbWFsbFZlY3RvcjxUeXBlICosIDg+IFBhcmFtVHlzOworICAgIFBhcmFtVHlzLnJlc2VydmUoQXJndW1lbnRzLnNpemUoKSk7CisgICAgZm9yICh1bnNpZ25lZCBJZHggPSAwLCBTaXplID0gQXJndW1lbnRzLnNpemUoKTsgSWR4ICE9IFNpemU7ICsrSWR4KQorICAgICAgUGFyYW1UeXMucHVzaF9iYWNrKEFyZ3VtZW50c1tJZHhdLT5nZXRUeXBlKCkpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRJbnRyaW5zaWNDb3N0KElJRCwgUmV0VHksIFBhcmFtVHlzKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFVzZXJDb3N0KGNvbnN0IFVzZXIgKlUsIEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IE9wZXJhbmRzKSB7CisgICAgaWYgKGlzYTxQSElOb2RlPihVKSkKKyAgICAgIHJldHVybiBUVEk6OlRDQ19GcmVlOyAvLyBNb2RlbCBhbGwgUEhJIG5vZGVzIGFzIGZyZWUuCisKKyAgICAvLyBTdGF0aWMgYWxsb2NhIGRvZXNuJ3QgZ2VuZXJhdGUgdGFyZ2V0IGluc3RydWN0aW9ucy4KKyAgICBpZiAoYXV0byAqQSA9IGR5bl9jYXN0PEFsbG9jYUluc3Q+KFUpKQorICAgICAgaWYgKEEtPmlzU3RhdGljQWxsb2NhKCkpCisgICAgICAgIHJldHVybiBUVEk6OlRDQ19GcmVlOworCisgICAgaWYgKGNvbnN0IEdFUE9wZXJhdG9yICpHRVAgPSBkeW5fY2FzdDxHRVBPcGVyYXRvcj4oVSkpIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRHRVBDb3N0KEdFUC0+Z2V0U291cmNlRWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFUC0+Z2V0UG9pbnRlck9wZXJhbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhbmRzLmRyb3BfZnJvbnQoKSk7CisgICAgfQorCisgICAgaWYgKGF1dG8gQ1MgPSBJbW11dGFibGVDYWxsU2l0ZShVKSkgeworICAgICAgY29uc3QgRnVuY3Rpb24gKkYgPSBDUy5nZXRDYWxsZWRGdW5jdGlvbigpOworICAgICAgaWYgKCFGKSB7CisgICAgICAgIC8vIEp1c3QgdXNlIHRoZSBjYWxsZWQgdmFsdWUgdHlwZS4KKyAgICAgICAgVHlwZSAqRlR5ID0gQ1MuZ2V0Q2FsbGVkVmFsdWUoKS0+Z2V0VHlwZSgpLT5nZXRQb2ludGVyRWxlbWVudFR5cGUoKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4odGhpcykKKyAgICAgICAgICAgIC0+Z2V0Q2FsbENvc3QoY2FzdDxGdW5jdGlvblR5cGU+KEZUeSksIENTLmFyZ19zaXplKCkpOworICAgICAgfQorCisgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBWYWx1ZSAqLCA4PiBBcmd1bWVudHMoQ1MuYXJnX2JlZ2luKCksIENTLmFyZ19lbmQoKSk7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0Q2FsbENvc3QoRiwgQXJndW1lbnRzKTsKKyAgICB9CisKKyAgICBpZiAoY29uc3QgQ2FzdEluc3QgKkNJID0gZHluX2Nhc3Q8Q2FzdEluc3Q+KFUpKSB7CisgICAgICAvLyBSZXN1bHQgb2YgYSBjbXAgaW5zdHJ1Y3Rpb24gaXMgb2Z0ZW4gZXh0ZW5kZWQgKHRvIGJlIHVzZWQgYnkgb3RoZXIKKyAgICAgIC8vIGNtcCBpbnN0cnVjdGlvbnMsIGxvZ2ljYWwgb3IgcmV0dXJuIGluc3RydWN0aW9ucykuIFRoZXNlIGFyZSB1c3VhbGx5CisgICAgICAvLyBub3Agb24gbW9zdCBzYW5lIHRhcmdldHMuCisgICAgICBpZiAoaXNhPENtcEluc3Q+KENJLT5nZXRPcGVyYW5kKDApKSkKKyAgICAgICAgcmV0dXJuIFRUSTo6VENDX0ZyZWU7CisgICAgICBpZiAoaXNhPFNFeHRJbnN0PihDSSkgfHwgaXNhPFpFeHRJbnN0PihDSSkgfHwgaXNhPEZQRXh0SW5zdD4oQ0kpKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0RXh0Q29zdChDSSwgT3BlcmFuZHMuYmFjaygpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0T3BlcmF0aW9uQ29zdCgKKyAgICAgICAgT3BlcmF0b3I6OmdldE9wY29kZShVKSwgVS0+Z2V0VHlwZSgpLAorICAgICAgICBVLT5nZXROdW1PcGVyYW5kcygpID09IDEgPyBVLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkgOiBudWxscHRyKTsKKyAgfQorCisgIGludCBnZXRJbnN0cnVjdGlvbkxhdGVuY3koY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICBTbWFsbFZlY3Rvcjxjb25zdCBWYWx1ZSAqLCA0PiBPcGVyYW5kcyhJLT52YWx1ZV9vcF9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEktPnZhbHVlX29wX2VuZCgpKTsKKyAgICBpZiAoZ2V0VXNlckNvc3QoSSwgT3BlcmFuZHMpID09IFRUSTo6VENDX0ZyZWUpCisgICAgICByZXR1cm4gMDsKKworICAgIGlmIChpc2E8TG9hZEluc3Q+KEkpKQorICAgICAgcmV0dXJuIDQ7CisKKyAgICBUeXBlICpEc3RUeSA9IEktPmdldFR5cGUoKTsKKworICAgIC8vIFVzdWFsbHkgYW4gaW50cmluc2ljIGlzIGEgc2ltcGxlIGluc3RydWN0aW9uLgorICAgIC8vIEEgcmVhbCBmdW5jdGlvbiBjYWxsIGlzIG11Y2ggc2xvd2VyLgorICAgIGlmIChhdXRvICpDSSA9IGR5bl9jYXN0PENhbGxJbnN0PihJKSkgeworICAgICAgY29uc3QgRnVuY3Rpb24gKkYgPSBDSS0+Z2V0Q2FsbGVkRnVuY3Rpb24oKTsKKyAgICAgIGlmICghRiB8fCBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5pc0xvd2VyZWRUb0NhbGwoRikpCisgICAgICAgIHJldHVybiA0MDsKKyAgICAgIC8vIFNvbWUgaW50cmluc2ljcyByZXR1cm4gYSB2YWx1ZSBhbmQgYSBmbGFnLCB3ZSB1c2UgdGhlIHZhbHVlIHR5cGUKKyAgICAgIC8vIHRvIGRlY2lkZSBpdHMgbGF0ZW5jeS4KKyAgICAgIGlmIChTdHJ1Y3RUeXBlKiBTdHJ1Y3RUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KERzdFR5KSkKKyAgICAgICAgRHN0VHkgPSBTdHJ1Y3RUeS0+Z2V0RWxlbWVudFR5cGUoMCk7CisgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gc2ltcGxlIGluc3RydWN0aW9ucy4KKyAgICB9CisKKyAgICBpZiAoVmVjdG9yVHlwZSAqVmVjdG9yVHkgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPihEc3RUeSkpCisgICAgICBEc3RUeSA9IFZlY3RvclR5LT5nZXRFbGVtZW50VHlwZSgpOworICAgIGlmIChEc3RUeS0+aXNGbG9hdGluZ1BvaW50VHkoKSkKKyAgICAgIHJldHVybiAzOworCisgICAgcmV0dXJuIDE7CisgIH0KK307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9UcmFjZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9UcmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNWQzODQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1RyYWNlLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8vPT09LSBsbHZtL0FuYWx5c2lzL1RyYWNlLmggLSBSZXByZXNlbnQgb25lIHRyYWNlIG9mIExMVk0gY29kZSAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc2luZ2xlIHRyYWNlIG9mIExMVk0gYmFzaWMgYmxvY2tzLiAgQSB0cmFjZSBpcyBhCisvLyBzaW5nbGUgZW50cnksIG11bHRpcGxlIGV4aXQsIHJlZ2lvbiBvZiBjb2RlIHRoYXQgaXMgb2Z0ZW4gaG90LiAgVHJhY2UtYmFzZWQKKy8vIG9wdGltaXphdGlvbnMgdHJlYXQgdHJhY2VzIGFsbW9zdCBsaWtlIHRoZXkgYXJlIGEgbGFyZ2UsIHN0cmFuZ2UsIGJhc2ljCisvLyBibG9jazogYmVjYXVzZSB0aGUgdHJhY2UgcGF0aCBpcyBhc3N1bWVkIHRvIGJlIGhvdCwgb3B0aW1pemF0aW9ucyBmb3IgdGhlCisvLyBmYWxsLXRocm91Z2ggcGF0aCBhcmUgbWFkZSBhdCB0aGUgZXhwZW5zZSBvZiB0aGUgbm9uLWZhbGwtdGhyb3VnaCBwYXRocy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfVFJBQ0VfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1RSQUNFX0gKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIHJhd19vc3RyZWFtOworCitjbGFzcyBUcmFjZSB7CisgIHVzaW5nIEJhc2ljQmxvY2tMaXN0VHlwZSA9IHN0ZDo6dmVjdG9yPEJhc2ljQmxvY2sgKj47CisKKyAgQmFzaWNCbG9ja0xpc3RUeXBlIEJhc2ljQmxvY2tzOworCitwdWJsaWM6CisgIC8vLyBUcmFjZSBjdG9yIC0gTWFrZSBhIG5ldyB0cmFjZSBmcm9tIGEgdmVjdG9yIG9mIGJhc2ljIGJsb2NrcywKKyAgLy8vIHJlc2lkaW5nIGluIHRoZSBmdW5jdGlvbiB3aGljaCBpcyB0aGUgcGFyZW50IG9mIHRoZSBmaXJzdAorICAvLy8gYmFzaWMgYmxvY2sgaW4gdGhlIHZlY3Rvci4KKyAgVHJhY2UoY29uc3Qgc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayAqPiAmdkJCKSA6IEJhc2ljQmxvY2tzICh2QkIpIHt9CisKKyAgLy8vIGdldEVudHJ5QmFzaWNCbG9jayAtIFJldHVybiB0aGUgZW50cnkgYmFzaWMgYmxvY2sgKGZpcnN0IGJsb2NrKQorICAvLy8gb2YgdGhlIHRyYWNlLgorICBCYXNpY0Jsb2NrICpnZXRFbnRyeUJhc2ljQmxvY2sgKCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3NbMF07IH0KKworICAvLy8gb3BlcmF0b3JbXS9nZXRCbG9jayAtIFJldHVybiBiYXNpYyBibG9jayBOIGluIHRoZSB0cmFjZS4KKyAgQmFzaWNCbG9jayAqb3BlcmF0b3JbXSh1bnNpZ25lZCBpKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrc1tpXTsgfQorICBCYXNpY0Jsb2NrICpnZXRCbG9jayh1bnNpZ25lZCBpKSAgIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzW2ldOyB9CisKKyAgLy8vIGdldEZ1bmN0aW9uIC0gUmV0dXJuIHRoaXMgdHJhY2UncyBwYXJlbnQgZnVuY3Rpb24uCisgIEZ1bmN0aW9uICpnZXRGdW5jdGlvbiAoKSBjb25zdDsKKworICAvLy8gZ2V0TW9kdWxlIC0gUmV0dXJuIHRoaXMgTW9kdWxlIHRoYXQgY29udGFpbnMgdGhpcyB0cmFjZSdzIHBhcmVudAorICAvLy8gZnVuY3Rpb24uCisgIE1vZHVsZSAqZ2V0TW9kdWxlICgpIGNvbnN0OworCisgIC8vLyBnZXRCbG9ja0luZGV4IC0gUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrIGluIHRoZQorICAvLy8gdHJhY2UsIG9yIC0xIGlmIGl0IGlzIG5vdCBpbiB0aGUgdHJhY2UuCisgIGludCBnZXRCbG9ja0luZGV4KGNvbnN0IEJhc2ljQmxvY2sgKlgpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQmFzaWNCbG9ja3Muc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChCYXNpY0Jsb2Nrc1tpXSA9PSBYKQorICAgICAgICByZXR1cm4gaTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLy8gY29udGFpbnMgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyB0cmFjZSBjb250YWlucyB0aGUgZ2l2ZW4gYmFzaWMKKyAgLy8vIGJsb2NrLgorICBib29sIGNvbnRhaW5zKGNvbnN0IEJhc2ljQmxvY2sgKlgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QmxvY2tJbmRleChYKSAhPSAtMTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgQjEgb2NjdXJzIGJlZm9yZSBCMiBpbiB0aGUgdHJhY2UsIG9yIGlmIGl0IGlzIHRoZSBzYW1lCisgIC8vLyBibG9jayBhcyBCMi4uICBCb3RoIGJsb2NrcyBtdXN0IGJlIGluIHRoZSB0cmFjZS4KKyAgYm9vbCBkb21pbmF0ZXMoY29uc3QgQmFzaWNCbG9jayAqQjEsIGNvbnN0IEJhc2ljQmxvY2sgKkIyKSBjb25zdCB7CisgICAgaW50IEIxSWR4ID0gZ2V0QmxvY2tJbmRleChCMSksIEIySWR4ID0gZ2V0QmxvY2tJbmRleChCMik7CisgICAgYXNzZXJ0KEIxSWR4ICE9IC0xICYmIEIySWR4ICE9IC0xICYmICJCbG9jayBpcyBub3QgaW4gdGhlIHRyYWNlISIpOworICAgIHJldHVybiBCMUlkeCA8PSBCMklkeDsKKyAgfQorCisgIC8vIEJhc2ljQmxvY2sgaXRlcmF0b3JzLi4uCisgIHVzaW5nIGl0ZXJhdG9yID0gQmFzaWNCbG9ja0xpc3RUeXBlOjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBCYXNpY0Jsb2NrTGlzdFR5cGU6OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyByZXZlcnNlX2l0ZXJhdG9yID0gc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPjsKKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciA9IHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj47CisKKyAgaXRlcmF0b3IgICAgICAgICAgICAgICAgYmVnaW4oKSAgICAgICB7IHJldHVybiBCYXNpY0Jsb2Nrcy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MuYmVnaW4oKTsgfQorICBpdGVyYXRvciAgICAgICAgICAgICAgICBlbmQgICgpICAgICAgIHsgcmV0dXJuIEJhc2ljQmxvY2tzLmVuZCgpOyAgIH0KKyAgY29uc3RfaXRlcmF0b3IgICAgICAgICAgZW5kICAoKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrcy5lbmQoKTsgICB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciAgICAgICByYmVnaW4oKSAgICAgICB7IHJldHVybiBCYXNpY0Jsb2Nrcy5yYmVnaW4oKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLnJiZWdpbigpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgICAgICAgcmVuZCAgKCkgICAgICAgeyByZXR1cm4gQmFzaWNCbG9ja3MucmVuZCgpOyAgIH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kICAoKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrcy5yZW5kKCk7ICAgfQorCisgIHVuc2lnbmVkICAgICAgICAgICAgICAgICBzaXplKCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3Muc2l6ZSgpOyB9CisgIGJvb2wgICAgICAgICAgICAgICAgICAgIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MuZW1wdHkoKTsgfQorCisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIHEpICAgICAgICAgICAgICAgeyByZXR1cm4gQmFzaWNCbG9ja3MuZXJhc2UgKHEpOyB9CisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIHExLCBpdGVyYXRvciBxMikgeyByZXR1cm4gQmFzaWNCbG9ja3MuZXJhc2UgKHExLCBxMik7IH0KKworICAvLy8gcHJpbnQgLSBXcml0ZSB0cmFjZSB0byBvdXRwdXQgc3RyZWFtLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKKworICAvLy8gZHVtcCAtIERlYnVnZ2VyIGNvbnZlbmllbmNlIG1ldGhvZDsgd3JpdGVzIHRyYWNlIHRvIHN0YW5kYXJkIGVycm9yCisgIC8vLyBvdXRwdXQgc3RyZWFtLgorICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX1RSQUNFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVHlwZUJhc2VkQWxpYXNBbmFseXNpcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9UeXBlQmFzZWRBbGlhc0FuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZjZmRiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVHlwZUJhc2VkQWxpYXNBbmFseXNpcy5oCkBAIC0wLDAgKzEsOTQgQEAKKy8vPT09LSBUeXBlQmFzZWRBbGlhc0FuYWx5c2lzLmggLSBUeXBlLUJhc2VkIEFsaWFzIEFuYWx5c2lzIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBhIG1ldGFkYXRhLWJhc2VkIFRCQUEuIFNlZSB0aGUgc291cmNlIGZpbGUgZm9yCisvLy8gZGV0YWlscyBvbiB0aGUgYWxnb3JpdGhtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19UWVBFQkFTRURBTElBU0FOQUxZU0lTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19UWVBFQkFTRURBTElBU0FOQUxZU0lTX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTUROb2RlOworY2xhc3MgTWVtb3J5TG9jYXRpb247CisKKy8vLyBBIHNpbXBsZSBBQSByZXN1bHQgdGhhdCB1c2VzIFRCQUEgbWV0YWRhdGEgdG8gYW5zd2VyIHF1ZXJpZXMuCitjbGFzcyBUeXBlQmFzZWRBQVJlc3VsdCA6IHB1YmxpYyBBQVJlc3VsdEJhc2U8VHlwZUJhc2VkQUFSZXN1bHQ+IHsKKyAgZnJpZW5kIEFBUmVzdWx0QmFzZTxUeXBlQmFzZWRBQVJlc3VsdD47CisKK3B1YmxpYzoKKyAgLy8vIEhhbmRsZSBpbnZhbGlkYXRpb24gZXZlbnRzIGZyb20gdGhlIG5ldyBwYXNzIG1hbmFnZXIuCisgIC8vLworICAvLy8gQnkgZGVmaW5pdGlvbiwgdGhpcyByZXN1bHQgaXMgc3RhdGVsZXNzIGFuZCBzbyByZW1haW5zIHZhbGlkLgorICBib29sIGludmFsaWRhdGUoRnVuY3Rpb24gJiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJiwKKyAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQWxpYXNSZXN1bHQgYWxpYXMoY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0EsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NCKTsKKyAgYm9vbCBwb2ludHNUb0NvbnN0YW50TWVtb3J5KGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MsIGJvb2wgT3JMb2NhbCk7CisgIEZ1bmN0aW9uTW9kUmVmQmVoYXZpb3IgZ2V0TW9kUmVmQmVoYXZpb3IoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MpOworICBGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIGdldE1vZFJlZkJlaGF2aW9yKGNvbnN0IEZ1bmN0aW9uICpGKTsKKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jKTsKKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTMSwgSW1tdXRhYmxlQ2FsbFNpdGUgQ1MyKTsKKworcHJpdmF0ZToKKyAgYm9vbCBBbGlhc2VzKGNvbnN0IE1ETm9kZSAqQSwgY29uc3QgTUROb2RlICpCKSBjb25zdDsKKyAgYm9vbCBQYXRoQWxpYXNlcyhjb25zdCBNRE5vZGUgKkEsIGNvbnN0IE1ETm9kZSAqQikgY29uc3Q7Cit9OworCisvLy8gQW5hbHlzaXMgcGFzcyBwcm92aWRpbmcgYSBuZXZlci1pbnZhbGlkYXRlZCBhbGlhcyBhbmFseXNpcyByZXN1bHQuCitjbGFzcyBUeXBlQmFzZWRBQSA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjxUeXBlQmFzZWRBQT4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48VHlwZUJhc2VkQUE+OworCisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKK3B1YmxpYzoKKyAgdXNpbmcgUmVzdWx0ID0gVHlwZUJhc2VkQUFSZXN1bHQ7CisKKyAgVHlwZUJhc2VkQUFSZXN1bHQgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIExlZ2FjeSB3cmFwcGVyIHBhc3MgdG8gcHJvdmlkZSB0aGUgVHlwZUJhc2VkQUFSZXN1bHQgb2JqZWN0LgorY2xhc3MgVHlwZUJhc2VkQUFXcmFwcGVyUGFzcyA6IHB1YmxpYyBJbW11dGFibGVQYXNzIHsKKyAgc3RkOjp1bmlxdWVfcHRyPFR5cGVCYXNlZEFBUmVzdWx0PiBSZXN1bHQ7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgVHlwZUJhc2VkQUFXcmFwcGVyUGFzcygpOworCisgIFR5cGVCYXNlZEFBUmVzdWx0ICZnZXRSZXN1bHQoKSB7IHJldHVybiAqUmVzdWx0OyB9CisgIGNvbnN0IFR5cGVCYXNlZEFBUmVzdWx0ICZnZXRSZXN1bHQoKSBjb25zdCB7IHJldHVybiAqUmVzdWx0OyB9CisKKyAgYm9vbCBkb0luaXRpYWxpemF0aW9uKE1vZHVsZSAmTSkgb3ZlcnJpZGU7CisgIGJvb2wgZG9GaW5hbGl6YXRpb24oTW9kdWxlICZNKSBvdmVycmlkZTsKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIGNyZWF0ZVR5cGVCYXNlZEFBV3JhcHBlclBhc3MgLSBUaGlzIHBhc3MgaW1wbGVtZW50cyBtZXRhZGF0YS1iYXNlZAorLy8gdHlwZS1iYXNlZCBhbGlhcyBhbmFseXNpcy4KKy8vCitJbW11dGFibGVQYXNzICpjcmVhdGVUeXBlQmFzZWRBQVdyYXBwZXJQYXNzKCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX1RZUEVCQVNFREFMSUFTQU5BTFlTSVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9UeXBlTWV0YWRhdGFVdGlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9UeXBlTWV0YWRhdGFVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMmUxNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1R5cGVNZXRhZGF0YVV0aWxzLmgKQEAgLTAsMCArMSw1MyBAQAorLy89PT0tIFR5cGVNZXRhZGF0YVV0aWxzLmggLSBVdGlsaXRpZXMgcmVsYXRlZCB0byB0eXBlIG1ldGFkYXRhIC0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHRoYXQgbWFrZSBpdCBlYXNpZXIgdG8gbWFuaXB1bGF0ZSB0eXBlIG1ldGFkYXRhCisvLyBmb3IgZGV2aXJ0dWFsaXphdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfVFlQRU1FVEFEQVRBVVRJTFNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1RZUEVNRVRBREFUQVVUSUxTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUaGUgdHlwZSBvZiBDRkkganVtcHRhYmxlIG5lZWRlZCBmb3IgYSBmdW5jdGlvbi4KK2VudW0gQ2ZpRnVuY3Rpb25MaW5rYWdlIHsKKyAgQ0ZMX0RlZmluaXRpb24gPSAwLAorICBDRkxfRGVjbGFyYXRpb24gPSAxLAorICBDRkxfV2Vha0RlY2xhcmF0aW9uID0gMgorfTsKKworLy8vIEEgY2FsbCBzaXRlIHRoYXQgY291bGQgYmUgZGV2aXJ0dWFsaXplZC4KK3N0cnVjdCBEZXZpcnRDYWxsU2l0ZSB7CisgIC8vLyBUaGUgb2Zmc2V0IGZyb20gdGhlIGFkZHJlc3MgcG9pbnQgdG8gdGhlIHZpcnR1YWwgZnVuY3Rpb24uCisgIHVpbnQ2NF90IE9mZnNldDsKKyAgLy8vIFRoZSBjYWxsIHNpdGUgaXRzZWxmLgorICBDYWxsU2l0ZSBDUzsKK307CisKKy8vLyBHaXZlbiBhIGNhbGwgdG8gdGhlIGludHJpbnNpYyBAbGx2bS50eXBlLnRlc3QsIGZpbmQgYWxsIGRldmlydHVhbGl6YWJsZQorLy8vIGNhbGwgc2l0ZXMgYmFzZWQgb24gdGhlIGNhbGwgYW5kIHJldHVybiB0aGVtIGluIERldmlydENhbGxzLgordm9pZCBmaW5kRGV2aXJ0dWFsaXphYmxlQ2FsbHNGb3JUeXBlVGVzdCgKKyAgICBTbWFsbFZlY3RvckltcGw8RGV2aXJ0Q2FsbFNpdGU+ICZEZXZpcnRDYWxscywKKyAgICBTbWFsbFZlY3RvckltcGw8Q2FsbEluc3QgKj4gJkFzc3VtZXMsIGNvbnN0IENhbGxJbnN0ICpDSSk7CisKKy8vLyBHaXZlbiBhIGNhbGwgdG8gdGhlIGludHJpbnNpYyBAbGx2bS50eXBlLmNoZWNrZWQubG9hZCwgZmluZCBhbGwKKy8vLyBkZXZpcnR1YWxpemFibGUgY2FsbCBzaXRlcyBiYXNlZCBvbiB0aGUgY2FsbCBhbmQgcmV0dXJuIHRoZW0gaW4gRGV2aXJ0Q2FsbHMuCit2b2lkIGZpbmREZXZpcnR1YWxpemFibGVDYWxsc0ZvclR5cGVDaGVja2VkTG9hZCgKKyAgICBTbWFsbFZlY3RvckltcGw8RGV2aXJ0Q2FsbFNpdGU+ICZEZXZpcnRDYWxscywKKyAgICBTbWFsbFZlY3RvckltcGw8SW5zdHJ1Y3Rpb24gKj4gJkxvYWRlZFB0cnMsCisgICAgU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uICo+ICZQcmVkcywgYm9vbCAmSGFzTm9uQ2FsbFVzZXMsCisgICAgY29uc3QgQ2FsbEluc3QgKkNJKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1V0aWxzL0xvY2FsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1V0aWxzL0xvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJhNjU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVXRpbHMvTG9jYWwuaApAQCAtMCwwICsxLDUwNyBAQAorLy89PT0tIExvY2FsLmggLSBGdW5jdGlvbnMgdG8gcGVyZm9ybSBsb2NhbCB0cmFuc2Zvcm1hdGlvbnMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZhbWlseSBvZiBmdW5jdGlvbnMgcGVyZm9ybSB2YXJpb3VzIGxvY2FsIHRyYW5zZm9ybWF0aW9ucyB0byB0aGUKKy8vIHByb2dyYW0uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1VUSUxTX0xPQ0FMX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19VVElMU19MT0NBTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UaW55UHRyVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGF0YUxheW91dC5oIgorI2luY2x1ZGUgImxsdm0vSVIvRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2V0RWxlbWVudFB0clR5cGVJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvT3BlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1VzZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBbGxvY2FJbnN0OworY2xhc3MgQXNzdW1wdGlvbkNhY2hlOworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEJyYW5jaEluc3Q7CitjbGFzcyBDYWxsSW5zdDsKK2NsYXNzIERiZ0luZm9JbnRyaW5zaWM7CitjbGFzcyBEYmdWYWx1ZUluc3Q7CitjbGFzcyBESUJ1aWxkZXI7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTGF6eVZhbHVlSW5mbzsKK2NsYXNzIExvYWRJbnN0OworY2xhc3MgTUROb2RlOworY2xhc3MgUEhJTm9kZTsKK2NsYXNzIFN0b3JlSW5zdDsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworY2xhc3MgVGFyZ2V0VHJhbnNmb3JtSW5mbzsKKworLy8vIEEgc2V0IG9mIHBhcmFtZXRlcnMgdXNlZCB0byBjb250cm9sIHRoZSB0cmFuc2Zvcm1zIGluIHRoZSBTaW1wbGlmeUNGRyBwYXNzLgorLy8vIE9wdGlvbnMgbWF5IGNoYW5nZSBkZXBlbmRpbmcgb24gdGhlIHBvc2l0aW9uIGluIHRoZSBvcHRpbWl6YXRpb24gcGlwZWxpbmUuCisvLy8gRm9yIGV4YW1wbGUsIGNhbm9uaWNhbCBmb3JtIHRoYXQgaW5jbHVkZXMgc3dpdGNoZXMgYW5kIGJyYW5jaGVzIG1heSBsYXRlciBiZQorLy8vIHJlcGxhY2VkIGJ5IGxvb2t1cCB0YWJsZXMgYW5kIHNlbGVjdHMuCitzdHJ1Y3QgU2ltcGxpZnlDRkdPcHRpb25zIHsKKyAgaW50IEJvbnVzSW5zdFRocmVzaG9sZDsKKyAgYm9vbCBGb3J3YXJkU3dpdGNoQ29uZFRvUGhpOworICBib29sIENvbnZlcnRTd2l0Y2hUb0xvb2t1cFRhYmxlOworICBib29sIE5lZWRDYW5vbmljYWxMb29wOworICBib29sIFNpbmtDb21tb25JbnN0czsKKyAgQXNzdW1wdGlvbkNhY2hlICpBQzsKKworICBTaW1wbGlmeUNGR09wdGlvbnModW5zaWduZWQgQm9udXNUaHJlc2hvbGQgPSAxLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBGb3J3YXJkU3dpdGNoQ29uZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBTd2l0Y2hUb0xvb2t1cCA9IGZhbHNlLCBib29sIENhbm9uaWNhbExvb3BzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2lua0NvbW1vbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbkNhY2hlICpBc3N1bXBDYWNoZSA9IG51bGxwdHIpCisgICAgICA6IEJvbnVzSW5zdFRocmVzaG9sZChCb251c1RocmVzaG9sZCksCisgICAgICAgIEZvcndhcmRTd2l0Y2hDb25kVG9QaGkoRm9yd2FyZFN3aXRjaENvbmQpLAorICAgICAgICBDb252ZXJ0U3dpdGNoVG9Mb29rdXBUYWJsZShTd2l0Y2hUb0xvb2t1cCksCisgICAgICAgIE5lZWRDYW5vbmljYWxMb29wKENhbm9uaWNhbExvb3BzKSwKKyAgICAgICAgU2lua0NvbW1vbkluc3RzKFNpbmtDb21tb24pLAorICAgICAgICBBQyhBc3N1bXBDYWNoZSkge30KKworICAvLyBTdXBwb3J0ICdidWlsZGVyJyBwYXR0ZXJuIHRvIHNldCBtZW1iZXJzIGJ5IG5hbWUgYXQgY29uc3RydWN0aW9uIHRpbWUuCisgIFNpbXBsaWZ5Q0ZHT3B0aW9ucyAmYm9udXNJbnN0VGhyZXNob2xkKGludCBJKSB7CisgICAgQm9udXNJbnN0VGhyZXNob2xkID0gSTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgU2ltcGxpZnlDRkdPcHRpb25zICZmb3J3YXJkU3dpdGNoQ29uZFRvUGhpKGJvb2wgQikgeworICAgIEZvcndhcmRTd2l0Y2hDb25kVG9QaGkgPSBCOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBTaW1wbGlmeUNGR09wdGlvbnMgJmNvbnZlcnRTd2l0Y2hUb0xvb2t1cFRhYmxlKGJvb2wgQikgeworICAgIENvbnZlcnRTd2l0Y2hUb0xvb2t1cFRhYmxlID0gQjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgU2ltcGxpZnlDRkdPcHRpb25zICZuZWVkQ2Fub25pY2FsTG9vcHMoYm9vbCBCKSB7CisgICAgTmVlZENhbm9uaWNhbExvb3AgPSBCOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBTaW1wbGlmeUNGR09wdGlvbnMgJnNpbmtDb21tb25JbnN0cyhib29sIEIpIHsKKyAgICBTaW5rQ29tbW9uSW5zdHMgPSBCOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBTaW1wbGlmeUNGR09wdGlvbnMgJnNldEFzc3VtcHRpb25DYWNoZShBc3N1bXB0aW9uQ2FjaGUgKkNhY2hlKSB7CisgICAgQUMgPSBDYWNoZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgTG9jYWwgY29uc3RhbnQgcHJvcGFnYXRpb24uCisvLworCisvLy8gSWYgYSB0ZXJtaW5hdG9yIGluc3RydWN0aW9uIGlzIHByZWRpY2F0ZWQgb24gYSBjb25zdGFudCB2YWx1ZSwgY29udmVydCBpdAorLy8vIGludG8gYW4gdW5jb25kaXRpb25hbCBicmFuY2ggdG8gdGhlIGNvbnN0YW50IGRlc3RpbmF0aW9uLgorLy8vIFRoaXMgaXMgYSBub250cml2aWFsIG9wZXJhdGlvbiBiZWNhdXNlIHRoZSBzdWNjZXNzb3JzIG9mIHRoaXMgYmFzaWMgYmxvY2sKKy8vLyBtdXN0IGhhdmUgdGhlaXIgUEhJIG5vZGVzIHVwZGF0ZWQuCisvLy8gQWxzbyBjYWxscyBSZWN1cnNpdmVseURlbGV0ZVRyaXZpYWxseURlYWRJbnN0cnVjdGlvbnMoKSBvbiBhbnkgYnJhbmNoL3N3aXRjaAorLy8vIGNvbmRpdGlvbnMgYW5kIGluZGlyZWN0YnIgYWRkcmVzc2VzIHRoaXMgbWlnaHQgbWFrZSBkZWFkIGlmCisvLy8gRGVsZXRlRGVhZENvbmRpdGlvbnMgaXMgdHJ1ZS4KK2Jvb2wgQ29uc3RhbnRGb2xkVGVybWluYXRvcihCYXNpY0Jsb2NrICpCQiwgYm9vbCBEZWxldGVEZWFkQ29uZGl0aW9ucyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmVycmVkRG9taW5hbmNlICpERFQgPSBudWxscHRyKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBMb2NhbCBkZWFkIGNvZGUgZWxpbWluYXRpb24uCisvLworCisvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90IHVzZWQsIGFuZCB0aGUKKy8vLyBpbnN0cnVjdGlvbiBoYXMgbm8gc2lkZSBlZmZlY3RzLgorYm9vbCBpc0luc3RydWN0aW9uVHJpdmlhbGx5RGVhZChJbnN0cnVjdGlvbiAqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSA9IG51bGxwdHIpOworCisvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaW5zdHJ1Y3Rpb24gd291bGQgaGF2ZSBubyBzaWRlCisvLy8gZWZmZWN0cyBpZiBpdCB3YXMgbm90IHVzZWQuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBjaGVja2luZyB3aGV0aGVyCisvLy8gaXNJbnN0cnVjdGlvblRyaXZpYWxseURlYWQgd291bGQgYmUgdHJ1ZSBpZiB0aGUgdXNlIGNvdW50IHdhcyAwLgorYm9vbCB3b3VsZEluc3RydWN0aW9uQmVUcml2aWFsbHlEZWFkKEluc3RydWN0aW9uICpJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkgPSBudWxscHRyKTsKKworLy8vIElmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYSB0cml2aWFsbHkgZGVhZCBpbnN0cnVjdGlvbiwgZGVsZXRlIGl0LgorLy8vIElmIHRoYXQgbWFrZXMgYW55IG9mIGl0cyBvcGVyYW5kcyB0cml2aWFsbHkgZGVhZCwgZGVsZXRlIHRoZW0gdG9vLAorLy8vIHJlY3Vyc2l2ZWx5LiBSZXR1cm4gdHJ1ZSBpZiBhbnkgaW5zdHJ1Y3Rpb25zIHdlcmUgZGVsZXRlZC4KK2Jvb2wgUmVjdXJzaXZlbHlEZWxldGVUcml2aWFsbHlEZWFkSW5zdHJ1Y3Rpb25zKFZhbHVlICpWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkgPSBudWxscHRyKTsKKworLy8vIElmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYW4gZWZmZWN0aXZlbHkgZGVhZCBQSEkgbm9kZSwgZHVlIHRvIGJlaW5nIGEKKy8vLyBkZWYtdXNlIGNoYWluIG9mIHNpbmdsZS11c2Ugbm9kZXMgdGhhdCBlaXRoZXIgZm9ybXMgYSBjeWNsZSBvciBpcyB0ZXJtaW5hdGVkCisvLy8gYnkgYSB0cml2aWFsbHkgZGVhZCBpbnN0cnVjdGlvbiwgZGVsZXRlIGl0LiBJZiB0aGF0IG1ha2VzIGFueSBvZiBpdHMKKy8vLyBvcGVyYW5kcyB0cml2aWFsbHkgZGVhZCwgZGVsZXRlIHRoZW0gdG9vLCByZWN1cnNpdmVseS4gUmV0dXJuIHRydWUgaWYgYQorLy8vIGNoYW5nZSB3YXMgbWFkZS4KK2Jvb2wgUmVjdXJzaXZlbHlEZWxldGVEZWFkUEhJTm9kZShQSElOb2RlICpQTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJID0gbnVsbHB0cik7CisKKy8vLyBTY2FuIHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2sgYW5kIHRyeSB0byBzaW1wbGlmeSBhbnkgaW5zdHJ1Y3Rpb25zIGluIGl0CisvLy8gYW5kIHJlY3Vyc2l2ZWx5IGRlbGV0ZSBkZWFkIGluc3RydWN0aW9ucy4KKy8vLworLy8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIGl0IGNoYW5nZWQgdGhlIGNvZGUsIG5vdGUgdGhhdCBpdCBjYW4gZGVsZXRlCisvLy8gaW5zdHJ1Y3Rpb25zIGluIG90aGVyIGJsb2NrcyBhcyB3ZWxsIGluIHRoaXMgYmxvY2suCitib29sIFNpbXBsaWZ5SW5zdHJ1Y3Rpb25zSW5CbG9jayhCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkgPSBudWxscHRyKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBDb250cm9sIEZsb3cgR3JhcGggUmVzdHJ1Y3R1cmluZy4KKy8vCisKKy8vLyBMaWtlIEJhc2ljQmxvY2s6OnJlbW92ZVByZWRlY2Vzc29yLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB3ZSdyZSBhYm91dAorLy8vIHRvIGRlbGV0ZSBQcmVkIGFzIGEgcHJlZGVjZXNzb3Igb2YgQkIuIElmIEJCIGNvbnRhaW5zIGFueSBQSEkgbm9kZXMsIHRoaXMKKy8vLyBkcm9wcyB0aGUgZW50cmllcyBpbiB0aGUgUEhJIG5vZGVzIGZvciBQcmVkLgorLy8vCisvLy8gVW5saWtlIHRoZSByZW1vdmVQcmVkZWNlc3NvciBtZXRob2QsIHRoaXMgYXR0ZW1wdHMgdG8gc2ltcGxpZnkgdXNlcyBvZiBQSEkKKy8vLyBub2RlcyB0aGF0IGNvbGxhcHNlIGludG8gaWRlbnRpdHkgdmFsdWVzLiAgRm9yIGV4YW1wbGUsIGlmIHdlIGhhdmU6CisvLy8gICB4ID0gcGhpKDEsIDAsIDAsIDApCisvLy8gICB5ID0gYW5kIHgsIHoKKy8vLworLy8vIC4uIGFuZCBkZWxldGUgdGhlIHByZWRlY2Vzc29yIGNvcnJlc3BvbmRpbmcgdG8gdGhlICcxJywgdGhpcyB3aWxsIGF0dGVtcHQgdG8KKy8vLyByZWN1cnNpdmVseSBmb2xkIHRoZSAnYW5kJyB0byAwLgordm9pZCBSZW1vdmVQcmVkZWNlc3NvckFuZFNpbXBsaWZ5KEJhc2ljQmxvY2sgKkJCLCBCYXNpY0Jsb2NrICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmVycmVkRG9taW5hbmNlICpERFQgPSBudWxscHRyKTsKKworLy8vIEJCIGlzIGEgYmxvY2sgd2l0aCBvbmUgcHJlZGVjZXNzb3IgYW5kIGl0cyBwcmVkZWNlc3NvciBpcyBrbm93biB0byBoYXZlIG9uZQorLy8vIHN1Y2Nlc3NvciAoQkIhKS4gRWxpbWluYXRlIHRoZSBlZGdlIGJldHdlZW4gdGhlbSwgbW92aW5nIHRoZSBpbnN0cnVjdGlvbnMgaW4KKy8vLyB0aGUgcHJlZGVjZXNzb3IgaW50byBCQi4gVGhpcyBkZWxldGVzIHRoZSBwcmVkZWNlc3NvciBibG9jay4KK3ZvaWQgTWVyZ2VCYXNpY0Jsb2NrSW50b09ubHlQcmVkKEJhc2ljQmxvY2sgKkJCLCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZERvbWluYW5jZSAqRERUID0gbnVsbHB0cik7CisKKy8vLyBCQiBpcyBrbm93biB0byBjb250YWluIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoLCBhbmQgY29udGFpbnMgbm8gaW5zdHJ1Y3Rpb25zCisvLy8gb3RoZXIgdGhhbiBQSEkgbm9kZXMsIHBvdGVudGlhbCBkZWJ1ZyBpbnRyaW5zaWNzIGFuZCB0aGUgYnJhbmNoLiBJZgorLy8vIHBvc3NpYmxlLCBlbGltaW5hdGUgQkIgYnkgcmV3cml0aW5nIGFsbCB0aGUgcHJlZGVjZXNzb3JzIHRvIGJyYW5jaCB0byB0aGUKKy8vLyBzdWNjZXNzb3IgYmxvY2sgYW5kIHJldHVybiB0cnVlLiBJZiB3ZSBjYW4ndCB0cmFuc2Zvcm0sIHJldHVybiBmYWxzZS4KK2Jvb2wgVHJ5VG9TaW1wbGlmeVVuY29uZEJyYW5jaEZyb21FbXB0eUJsb2NrKEJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWREb21pbmFuY2UgKkREVCA9IG51bGxwdHIpOworCisvLy8gQ2hlY2sgZm9yIGFuZCBlbGltaW5hdGUgZHVwbGljYXRlIFBISSBub2RlcyBpbiB0aGlzIGJsb2NrLiBUaGlzIGRvZXNuJ3QgdHJ5CisvLy8gdG8gYmUgY2xldmVyIGFib3V0IFBISSBub2RlcyB3aGljaCBkaWZmZXIgb25seSBpbiB0aGUgb3JkZXIgb2YgdGhlIGluY29taW5nCisvLy8gdmFsdWVzLCBidXQgaW5zdGNvbWJpbmUgb3JkZXJzIHRoZW0gc28gaXQgdXN1YWxseSB3b24ndCBtYXR0ZXIuCitib29sIEVsaW1pbmF0ZUR1cGxpY2F0ZVBISU5vZGVzKEJhc2ljQmxvY2sgKkJCKTsKKworLy8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBkbyBzaW1wbGlmaWNhdGlvbiBvZiBhIENGRy4gIEZvciBleGFtcGxlLCBpdAorLy8vIGFkanVzdHMgYnJhbmNoZXMgdG8gYnJhbmNoZXMgdG8gZWxpbWluYXRlIHRoZSBleHRyYSBob3AsIGl0IGVsaW1pbmF0ZXMKKy8vLyB1bnJlYWNoYWJsZSBiYXNpYyBibG9ja3MsIGFuZCBkb2VzIG90aGVyIHBlZXBob2xlIG9wdGltaXphdGlvbiBvZiB0aGUgQ0ZHLgorLy8vIEl0IHJldHVybnMgdHJ1ZSBpZiBhIG1vZGlmaWNhdGlvbiB3YXMgbWFkZSwgcG9zc2libHkgZGVsZXRpbmcgdGhlIGJhc2ljCisvLy8gYmxvY2sgdGhhdCB3YXMgcG9pbnRlZCB0by4gTG9vcEhlYWRlcnMgaXMgYW4gb3B0aW9uYWwgaW5wdXQgcGFyYW1ldGVyCisvLy8gcHJvdmlkaW5nIHRoZSBzZXQgb2YgbG9vcCBoZWFkZXJzIHRoYXQgU2ltcGxpZnlDRkcgc2hvdWxkIG5vdCBlbGltaW5hdGUuCitib29sIHNpbXBsaWZ5Q0ZHKEJhc2ljQmxvY2sgKkJCLCBjb25zdCBUYXJnZXRUcmFuc2Zvcm1JbmZvICZUVEksCisgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsaWZ5Q0ZHT3B0aW9ucyAmT3B0aW9ucyA9IHt9LAorICAgICAgICAgICAgICAgICBTbWFsbFB0clNldEltcGw8QmFzaWNCbG9jayAqPiAqTG9vcEhlYWRlcnMgPSBudWxscHRyKTsKKworLy8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBmbGF0dGVuIGEgQ0ZHLiBGb3IgZXhhbXBsZSwgaXQgdXNlcyBwYXJhbGxlbC1hbmQKKy8vLyBhbmQgcGFyYWxsZWwtb3IgbW9kZSB0byBjb2xsYXBzZSBpZi1jb25kaXRpb25zIGFuZCBtZXJnZSBpZi1yZWdpb25zIHdpdGgKKy8vLyBpZGVudGljYWwgc3RhdGVtZW50cy4KK2Jvb2wgRmxhdHRlbkNGRyhCYXNpY0Jsb2NrICpCQiwgQWxpYXNBbmFseXNpcyAqQUEgPSBudWxscHRyKTsKKworLy8vIElmIHRoaXMgYmFzaWMgYmxvY2sgaXMgT05MWSBhIHNldGNjIGFuZCBhIGJyYW5jaCwgYW5kIGlmIGEgcHJlZGVjZXNzb3IKKy8vLyBicmFuY2hlcyB0byB1cyBhbmQgb25lIG9mIG91ciBzdWNjZXNzb3JzLCBmb2xkIHRoZSBzZXRjYyBpbnRvIHRoZQorLy8vIHByZWRlY2Vzc29yIGFuZCB1c2UgbG9naWNhbCBvcGVyYXRpb25zIHRvIHBpY2sgdGhlIHJpZ2h0IGRlc3RpbmF0aW9uLgorYm9vbCBGb2xkQnJhbmNoVG9Db21tb25EZXN0KEJyYW5jaEluc3QgKkJJLCB1bnNpZ25lZCBCb251c0luc3RUaHJlc2hvbGQgPSAxKTsKKworLy8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSB2aXJ0dWFsIHJlZ2lzdGVyIGNvbXB1dGVkIGJ5IGFuIEluc3RydWN0aW9uIGFuZAorLy8vIHJlcGxhY2VzIGl0IHdpdGggYSBzbG90IGluIHRoZSBzdGFjayBmcmFtZSwgYWxsb2NhdGVkIHZpYSBhbGxvY2EuCisvLy8gVGhpcyBhbGxvd3MgdGhlIENGRyB0byBiZSBjaGFuZ2VkIGFyb3VuZCB3aXRob3V0IGZlYXIgb2YgaW52YWxpZGF0aW5nIHRoZQorLy8vIFNTQSBpbmZvcm1hdGlvbiBmb3IgdGhlIHZhbHVlLiBJdCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBhbGxvY2EgaW5zZXJ0ZWQKKy8vLyB0byBjcmVhdGUgYSBzdGFjayBzbG90IGZvciBYLgorQWxsb2NhSW5zdCAqRGVtb3RlUmVnVG9TdGFjayhJbnN0cnVjdGlvbiAmWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWb2xhdGlsZUxvYWRzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpBbGxvY2FQb2ludCA9IG51bGxwdHIpOworCisvLy8gVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHZpcnR1YWwgcmVnaXN0ZXIgY29tcHV0ZWQgYnkgYSBwaGkgbm9kZSBhbmQgcmVwbGFjZXMKKy8vLyBpdCB3aXRoIGEgc2xvdCBpbiB0aGUgc3RhY2sgZnJhbWUsIGFsbG9jYXRlZCB2aWEgYWxsb2NhLiBUaGUgcGhpIG5vZGUgaXMKKy8vLyBkZWxldGVkIGFuZCBpdCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBhbGxvY2EgaW5zZXJ0ZWQuCitBbGxvY2FJbnN0ICpEZW1vdGVQSElUb1N0YWNrKFBISU5vZGUgKlAsIEluc3RydWN0aW9uICpBbGxvY2FQb2ludCA9IG51bGxwdHIpOworCisvLy8gVHJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBhbGlnbm1lbnQgb2YgXHAgViBpcyBhdCBsZWFzdCBccCBQcmVmQWxpZ24gYnl0ZXMuIElmCisvLy8gdGhlIG93bmluZyBvYmplY3QgY2FuIGJlIG1vZGlmaWVkIGFuZCBoYXMgYW4gYWxpZ25tZW50IGxlc3MgdGhhbiBccAorLy8vIFByZWZBbGlnbiwgaXQgd2lsbCBiZSBpbmNyZWFzZWQgYW5kIFxwIFByZWZBbGlnbiByZXR1cm5lZC4gSWYgdGhlIGFsaWdubWVudAorLy8vIGNhbm5vdCBiZSBpbmNyZWFzZWQsIHRoZSBrbm93biBhbGlnbm1lbnQgb2YgdGhlIHZhbHVlIGlzIHJldHVybmVkLgorLy8vCisvLy8gSXQgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSB0byBtb2RpZnkgdGhlIGFsaWdubWVudCBvZiB0aGUgdW5kZXJseWluZyBvYmplY3QsCisvLy8gc28gaWYgYWxpZ25tZW50IGlzIGltcG9ydGFudCwgYSBtb3JlIHJlbGlhYmxlIGFwcHJvYWNoIGlzIHRvIHNpbXBseSBhbGlnbgorLy8vIGFsbCBnbG9iYWwgdmFyaWFibGVzIGFuZCBhbGxvY2F0aW9uIGluc3RydWN0aW9ucyB0byB0aGVpciBwcmVmZXJyZWQKKy8vLyBhbGlnbm1lbnQgZnJvbSB0aGUgYmVnaW5uaW5nLgordW5zaWduZWQgZ2V0T3JFbmZvcmNlS25vd25BbGlnbm1lbnQoVmFsdWUgKlYsIHVuc2lnbmVkIFByZWZBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIpOworCisvLy8gVHJ5IHRvIGluZmVyIGFuIGFsaWdubWVudCBmb3IgdGhlIHNwZWNpZmllZCBwb2ludGVyLgoraW5saW5lIHVuc2lnbmVkIGdldEtub3duQWxpZ25tZW50KFZhbHVlICpWLCBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqQ3h0SSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyKSB7CisgIHJldHVybiBnZXRPckVuZm9yY2VLbm93bkFsaWdubWVudChWLCAwLCBETCwgQ3h0SSwgQUMsIERUKTsKK30KKworLy8vIEdpdmVuIGEgZ2V0ZWxlbWVudHB0ciBpbnN0cnVjdGlvbi9jb25zdGFudGV4cHIsIGVtaXQgdGhlIGNvZGUgbmVjZXNzYXJ5IHRvCisvLy8gY29tcHV0ZSB0aGUgb2Zmc2V0IGZyb20gdGhlIGJhc2UgcG9pbnRlciAod2l0aG91dCBhZGRpbmcgaW4gdGhlIGJhc2UKKy8vLyBwb2ludGVyKS4gUmV0dXJuIHRoZSByZXN1bHQgYXMgYSBzaWduZWQgaW50ZWdlciBvZiBpbnRwdHIgc2l6ZS4KKy8vLyBXaGVuIE5vQXNzdW1wdGlvbnMgaXMgdHJ1ZSwgbm8gYXNzdW1wdGlvbnMgYWJvdXQgaW5kZXggY29tcHV0YXRpb24gbm90CisvLy8gb3ZlcmZsb3dpbmcgaXMgbWFkZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJUkJ1aWxkZXJUeT4KK1ZhbHVlICpFbWl0R0VQT2Zmc2V0KElSQnVpbGRlclR5ICpCdWlsZGVyLCBjb25zdCBEYXRhTGF5b3V0ICZETCwgVXNlciAqR0VQLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb0Fzc3VtcHRpb25zID0gZmFsc2UpIHsKKyAgR0VQT3BlcmF0b3IgKkdFUE9wID0gY2FzdDxHRVBPcGVyYXRvcj4oR0VQKTsKKyAgVHlwZSAqSW50UHRyVHkgPSBETC5nZXRJbnRQdHJUeXBlKEdFUC0+Z2V0VHlwZSgpKTsKKyAgVmFsdWUgKlJlc3VsdCA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoSW50UHRyVHkpOworCisgIC8vIElmIHRoZSBHRVAgaXMgaW5ib3VuZHMsIHdlIGtub3cgdGhhdCBub25lIG9mIHRoZSBhZGRyZXNzaW5nIG9wZXJhdGlvbnMgd2lsbAorICAvLyBvdmVyZmxvdyBpbiBhbiB1bnNpZ25lZCBzZW5zZS4KKyAgYm9vbCBpc0luQm91bmRzID0gR0VQT3AtPmlzSW5Cb3VuZHMoKSAmJiAhTm9Bc3N1bXB0aW9uczsKKworICAvLyBCdWlsZCBhIG1hc2sgZm9yIGhpZ2ggb3JkZXIgYml0cy4KKyAgdW5zaWduZWQgSW50UHRyV2lkdGggPSBJbnRQdHJUeS0+Z2V0U2NhbGFyVHlwZSgpLT5nZXRJbnRlZ2VyQml0V2lkdGgoKTsKKyAgdWludDY0X3QgUHRyU2l6ZU1hc2sgPQorICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpID4+ICg2NCAtIEludFB0cldpZHRoKTsKKworICBnZXBfdHlwZV9pdGVyYXRvciBHVEkgPSBnZXBfdHlwZV9iZWdpbihHRVApOworICBmb3IgKFVzZXI6Om9wX2l0ZXJhdG9yIGkgPSBHRVAtPm9wX2JlZ2luKCkgKyAxLCBlID0gR0VQLT5vcF9lbmQoKTsgaSAhPSBlOworICAgICAgICsraSwgKytHVEkpIHsKKyAgICBWYWx1ZSAqT3AgPSAqaTsKKyAgICB1aW50NjRfdCBTaXplID0gREwuZ2V0VHlwZUFsbG9jU2l6ZShHVEkuZ2V0SW5kZXhlZFR5cGUoKSkgJiBQdHJTaXplTWFzazsKKyAgICBpZiAoQ29uc3RhbnQgKk9wQyA9IGR5bl9jYXN0PENvbnN0YW50PihPcCkpIHsKKyAgICAgIGlmIChPcEMtPmlzWmVyb1ZhbHVlKCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBIYW5kbGUgYSBzdHJ1Y3QgaW5kZXgsIHdoaWNoIGFkZHMgaXRzIGZpZWxkIG9mZnNldCB0byB0aGUgcG9pbnRlci4KKyAgICAgIGlmIChTdHJ1Y3RUeXBlICpTVHkgPSBHVEkuZ2V0U3RydWN0VHlwZU9yTnVsbCgpKSB7CisgICAgICAgIGlmIChPcEMtPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpKQorICAgICAgICAgIE9wQyA9IE9wQy0+Z2V0U3BsYXRWYWx1ZSgpOworCisgICAgICAgIHVpbnQ2NF90IE9wVmFsdWUgPSBjYXN0PENvbnN0YW50SW50PihPcEMpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgICAgU2l6ZSA9IERMLmdldFN0cnVjdExheW91dChTVHkpLT5nZXRFbGVtZW50T2Zmc2V0KE9wVmFsdWUpOworCisgICAgICAgIGlmIChTaXplKQorICAgICAgICAgIFJlc3VsdCA9IEJ1aWxkZXItPkNyZWF0ZUFkZChSZXN1bHQsIENvbnN0YW50SW50OjpnZXQoSW50UHRyVHksIFNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVAtPmdldE5hbWUoKSsiLm9mZnMiKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIENvbnN0YW50ICpTY2FsZSA9IENvbnN0YW50SW50OjpnZXQoSW50UHRyVHksIFNpemUpOworICAgICAgQ29uc3RhbnQgKk9DID0gQ29uc3RhbnRFeHByOjpnZXRJbnRlZ2VyQ2FzdChPcEMsIEludFB0clR5LCB0cnVlIC8qU0V4dCovKTsKKyAgICAgIFNjYWxlID0gQ29uc3RhbnRFeHByOjpnZXRNdWwoT0MsIFNjYWxlLCBpc0luQm91bmRzLypOVVcqLyk7CisgICAgICAvLyBFbWl0IGFuIGFkZCBpbnN0cnVjdGlvbi4KKyAgICAgIFJlc3VsdCA9IEJ1aWxkZXItPkNyZWF0ZUFkZChSZXN1bHQsIFNjYWxlLCBHRVAtPmdldE5hbWUoKSsiLm9mZnMiKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAvLyBDb252ZXJ0IHRvIGNvcnJlY3QgdHlwZS4KKyAgICBpZiAoT3AtPmdldFR5cGUoKSAhPSBJbnRQdHJUeSkKKyAgICAgIE9wID0gQnVpbGRlci0+Q3JlYXRlSW50Q2FzdChPcCwgSW50UHRyVHksIHRydWUsIE9wLT5nZXROYW1lKCkrIi5jIik7CisgICAgaWYgKFNpemUgIT0gMSkgeworICAgICAgLy8gV2UnbGwgbGV0IGluc3Rjb21iaW5lKG11bCkgY29udmVydCB0aGlzIHRvIGEgc2hsIGlmIHBvc3NpYmxlLgorICAgICAgT3AgPSBCdWlsZGVyLT5DcmVhdGVNdWwoT3AsIENvbnN0YW50SW50OjpnZXQoSW50UHRyVHksIFNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VQLT5nZXROYW1lKCkrIi5pZHgiLCBpc0luQm91bmRzIC8qTlVXKi8pOworICAgIH0KKworICAgIC8vIEVtaXQgYW4gYWRkIGluc3RydWN0aW9uLgorICAgIFJlc3VsdCA9IEJ1aWxkZXItPkNyZWF0ZUFkZChPcCwgUmVzdWx0LCBHRVAtPmdldE5hbWUoKSsiLm9mZnMiKTsKKyAgfQorICByZXR1cm4gUmVzdWx0OworfQorCisvLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vICBEYmcgSW50cmluc2ljIHV0aWxpdGllcworLy8vCisKKy8vLyBJbnNlcnRzIGEgbGx2bS5kYmcudmFsdWUgaW50cmluc2ljIGJlZm9yZSBhIHN0b3JlIHRvIGFuIGFsbG9jYSdkIHZhbHVlCisvLy8gdGhhdCBoYXMgYW4gYXNzb2NpYXRlZCBsbHZtLmRiZy5kZWNsYXJlIG9yIGxsdm0uZGJnLmFkZHIgaW50cmluc2ljLgordm9pZCBDb252ZXJ0RGVidWdEZWNsYXJlVG9EZWJ1Z1ZhbHVlKERiZ0luZm9JbnRyaW5zaWMgKkRJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yZUluc3QgKlNJLCBESUJ1aWxkZXIgJkJ1aWxkZXIpOworCisvLy8gSW5zZXJ0cyBhIGxsdm0uZGJnLnZhbHVlIGludHJpbnNpYyBiZWZvcmUgYSBsb2FkIG9mIGFuIGFsbG9jYSdkIHZhbHVlCisvLy8gdGhhdCBoYXMgYW4gYXNzb2NpYXRlZCBsbHZtLmRiZy5kZWNsYXJlIG9yIGxsdm0uZGJnLmFkZHIgaW50cmluc2ljLgordm9pZCBDb252ZXJ0RGVidWdEZWNsYXJlVG9EZWJ1Z1ZhbHVlKERiZ0luZm9JbnRyaW5zaWMgKkRJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkSW5zdCAqTEksIERJQnVpbGRlciAmQnVpbGRlcik7CisKKy8vLyBJbnNlcnRzIGEgbGx2bS5kYmcudmFsdWUgaW50cmluc2ljIGFmdGVyIGEgcGhpIHRoYXQgaGFzIGFuIGFzc29jaWF0ZWQKKy8vLyBsbHZtLmRiZy5kZWNsYXJlIG9yIGxsdm0uZGJnLmFkZHIgaW50cmluc2ljLgordm9pZCBDb252ZXJ0RGVidWdEZWNsYXJlVG9EZWJ1Z1ZhbHVlKERiZ0luZm9JbnRyaW5zaWMgKkRJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSElOb2RlICpMSSwgRElCdWlsZGVyICZCdWlsZGVyKTsKKworLy8vIExvd2VycyBsbHZtLmRiZy5kZWNsYXJlIGludHJpbnNpY3MgaW50byBhcHByb3ByaWF0ZSBzZXQgb2YKKy8vLyBsbHZtLmRiZy52YWx1ZSBpbnRyaW5zaWNzLgorYm9vbCBMb3dlckRiZ0RlY2xhcmUoRnVuY3Rpb24gJkYpOworCisvLy8gUHJvcGFnYXRlIGRiZy52YWx1ZSBpbnRyaW5zaWNzIHRocm91Z2ggdGhlIG5ld2x5IGluc2VydGVkIFBISXMuCit2b2lkIGluc2VydERlYnVnVmFsdWVzRm9yUEhJcyhCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxQSElOb2RlICo+ICZJbnNlcnRlZFBISXMpOworCisvLy8gRmluZHMgYWxsIGludHJpbnNpY3MgZGVjbGFyaW5nIGxvY2FsIHZhcmlhYmxlcyBhcyBsaXZpbmcgaW4gdGhlIG1lbW9yeSB0aGF0CisvLy8gJ1YnIHBvaW50cyB0by4gVGhpcyBtYXkgaW5jbHVkZSBhIG1peCBvZiBkYmcuZGVjbGFyZSBhbmQKKy8vLyBkYmcuYWRkciBpbnRyaW5zaWNzLgorVGlueVB0clZlY3RvcjxEYmdJbmZvSW50cmluc2ljICo+IEZpbmREYmdBZGRyVXNlcyhWYWx1ZSAqVik7CisKKy8vLyBGaW5kcyB0aGUgbGx2bS5kYmcudmFsdWUgaW50cmluc2ljcyBkZXNjcmliaW5nIGEgdmFsdWUuCit2b2lkIGZpbmREYmdWYWx1ZXMoU21hbGxWZWN0b3JJbXBsPERiZ1ZhbHVlSW5zdCAqPiAmRGJnVmFsdWVzLCBWYWx1ZSAqVik7CisKKy8vLyBGaW5kcyB0aGUgZGVidWcgaW5mbyBpbnRyaW5zaWNzIGRlc2NyaWJpbmcgYSB2YWx1ZS4KK3ZvaWQgZmluZERiZ1VzZXJzKFNtYWxsVmVjdG9ySW1wbDxEYmdJbmZvSW50cmluc2ljICo+ICZEYmdJbnN0cywgVmFsdWUgKlYpOworCisvLy8gUmVwbGFjZXMgbGx2bS5kYmcuZGVjbGFyZSBpbnN0cnVjdGlvbiB3aGVuIHRoZSBhZGRyZXNzIGl0CisvLy8gZGVzY3JpYmVzIGlzIHJlcGxhY2VkIHdpdGggYSBuZXcgdmFsdWUuIElmIERlcmVmIGlzIHRydWUsIGFuCisvLy8gYWRkaXRpb25hbCBEV19PUF9kZXJlZiBpcyBwcmVwZW5kZWQgdG8gdGhlIGV4cHJlc3Npb24uIElmIE9mZnNldAorLy8vIGlzIG5vbi16ZXJvLCBhIGNvbnN0YW50IGRpc3BsYWNlbWVudCBpcyBhZGRlZCB0byB0aGUgZXhwcmVzc2lvbgorLy8vIChiZXR3ZWVuIHRoZSBvcHRpb25hbCBEZXJlZiBvcGVyYXRpb25zKS4gT2Zmc2V0IGNhbiBiZSBuZWdhdGl2ZS4KK2Jvb2wgcmVwbGFjZURiZ0RlY2xhcmUoVmFsdWUgKkFkZHJlc3MsIFZhbHVlICpOZXdBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlLCBESUJ1aWxkZXIgJkJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVyZWZCZWZvcmUsIGludCBPZmZzZXQsIGJvb2wgRGVyZWZBZnRlcik7CisKKy8vLyBSZXBsYWNlcyBsbHZtLmRiZy5kZWNsYXJlIGluc3RydWN0aW9uIHdoZW4gdGhlIGFsbG9jYSBpdCBkZXNjcmliZXMKKy8vLyBpcyByZXBsYWNlZCB3aXRoIGEgbmV3IHZhbHVlLiBJZiBEZXJlZiBpcyB0cnVlLCBhbiBhZGRpdGlvbmFsCisvLy8gRFdfT1BfZGVyZWYgaXMgcHJlcGVuZGVkIHRvIHRoZSBleHByZXNzaW9uLiBJZiBPZmZzZXQgaXMgbm9uLXplcm8sCisvLy8gYSBjb25zdGFudCBkaXNwbGFjZW1lbnQgaXMgYWRkZWQgdG8gdGhlIGV4cHJlc3Npb24gKGJldHdlZW4gdGhlCisvLy8gb3B0aW9uYWwgRGVyZWYgb3BlcmF0aW9ucykuIE9mZnNldCBjYW4gYmUgbmVnYXRpdmUuIFRoZSBuZXcKKy8vLyBsbHZtLmRiZy5kZWNsYXJlIGlzIGluc2VydGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBBSS4KK2Jvb2wgcmVwbGFjZURiZ0RlY2xhcmVGb3JBbGxvY2EoQWxsb2NhSW5zdCAqQUksIFZhbHVlICpOZXdBbGxvY2FBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUJ1aWxkZXIgJkJ1aWxkZXIsIGJvb2wgRGVyZWZCZWZvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBPZmZzZXQsIGJvb2wgRGVyZWZBZnRlcik7CisKKy8vLyBSZXBsYWNlcyBtdWx0aXBsZSBsbHZtLmRiZy52YWx1ZSBpbnN0cnVjdGlvbnMgd2hlbiB0aGUgYWxsb2NhIGl0IGRlc2NyaWJlcworLy8vIGlzIHJlcGxhY2VkIHdpdGggYSBuZXcgdmFsdWUuIElmIE9mZnNldCBpcyBub24temVybywgYSBjb25zdGFudCBkaXNwbGFjZW1lbnQKKy8vLyBpcyBhZGRlZCB0byB0aGUgZXhwcmVzc2lvbiAoYWZ0ZXIgdGhlIG1hbmRhdG9yeSBEZXJlZikuIE9mZnNldCBjYW4gYmUKKy8vLyBuZWdhdGl2ZS4gTmV3IGxsdm0uZGJnLnZhbHVlIGluc3RydWN0aW9ucyBhcmUgaW5zZXJ0ZWQgYXQgdGhlIGxvY2F0aW9ucyBvZgorLy8vIHRoZSBpbnN0cnVjdGlvbnMgdGhleSByZXBsYWNlLgordm9pZCByZXBsYWNlRGJnVmFsdWVGb3JBbGxvY2EoQWxsb2NhSW5zdCAqQUksIFZhbHVlICpOZXdBbGxvY2FBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElCdWlsZGVyICZCdWlsZGVyLCBpbnQgT2Zmc2V0ID0gMCk7CisKKy8vLyBBc3N1bWluZyB0aGUgaW5zdHJ1Y3Rpb24gXHAgSSBpcyBnb2luZyB0byBiZSBkZWxldGVkLCBhdHRlbXB0IHRvIHNhbHZhZ2UgYW55CisvLy8gZGJnLnZhbHVlIGludHJpbnNpY3MgcmVmZXJyaW5nIHRvIFxwIEkgYnkgcmV3cml0aW5nIGl0cyBlZmZlY3QgaW50byBhCisvLy8gRElFeHByZXNzaW9uLgordm9pZCBzYWx2YWdlRGVidWdJbmZvKEluc3RydWN0aW9uICZJKTsKKworLy8vIFJlbW92ZSBhbGwgaW5zdHJ1Y3Rpb25zIGZyb20gYSBiYXNpYyBibG9jayBvdGhlciB0aGFuIGl0J3MgdGVybWluYXRvcgorLy8vIGFuZCBhbnkgcHJlc2VudCBFSCBwYWQgaW5zdHJ1Y3Rpb25zLgordW5zaWduZWQgcmVtb3ZlQWxsTm9uVGVybWluYXRvckFuZEVIUGFkSW5zdHJ1Y3Rpb25zKEJhc2ljQmxvY2sgKkJCKTsKKworLy8vIEluc2VydCBhbiB1bnJlYWNoYWJsZSBpbnN0cnVjdGlvbiBiZWZvcmUgdGhlIHNwZWNpZmllZAorLy8vIGluc3RydWN0aW9uLCBtYWtpbmcgaXQgYW5kIHRoZSByZXN0IG9mIHRoZSBjb2RlIGluIHRoZSBibG9jayBkZWFkLgordW5zaWduZWQgY2hhbmdlVG9VbnJlYWNoYWJsZShJbnN0cnVjdGlvbiAqSSwgYm9vbCBVc2VMTFZNVHJhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQcmVzZXJ2ZUxDU1NBID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmVycmVkRG9taW5hbmNlICpERFQgPSBudWxscHRyKTsKKworLy8vIENvbnZlcnQgdGhlIENhbGxJbnN0IHRvIEludm9rZUluc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHVud2luZCBlZGdlIGJhc2ljCisvLy8gYmxvY2suICBUaGlzIGFsc28gc3BsaXRzIHRoZSBiYXNpYyBibG9jayB3aGVyZSBDSSBpcyBsb2NhdGVkLCBiZWNhdXNlCisvLy8gSW52b2tlSW5zdCBpcyBhIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24uICBSZXR1cm5zIHRoZSBuZXdseSBzcGxpdCBiYXNpYworLy8vIGJsb2NrLgorQmFzaWNCbG9jayAqY2hhbmdlVG9JbnZva2VBbmRTcGxpdEJhc2ljQmxvY2soQ2FsbEluc3QgKkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqVW53aW5kRWRnZSk7CisKKy8vLyBSZXBsYWNlICdCQidzIHRlcm1pbmF0b3Igd2l0aCBvbmUgdGhhdCBkb2VzIG5vdCBoYXZlIGFuIHVud2luZCBzdWNjZXNzb3IKKy8vLyBibG9jay4gUmV3cml0ZXMgYGludm9rZWAgdG8gYGNhbGxgLCBldGMuIFVwZGF0ZXMgYW55IFBISXMgaW4gdW53aW5kCisvLy8gc3VjY2Vzc29yLgorLy8vCisvLy8gXHBhcmFtIEJCICBCbG9jayB3aG9zZSB0ZXJtaW5hdG9yIHdpbGwgYmUgcmVwbGFjZWQuICBJdHMgdGVybWluYXRvciBtdXN0CisvLy8gICAgICAgICAgICBoYXZlIGFuIHVud2luZCBzdWNjZXNzb3IuCit2b2lkIHJlbW92ZVVud2luZEVkZ2UoQmFzaWNCbG9jayAqQkIsIERlZmVycmVkRG9taW5hbmNlICpERFQgPSBudWxscHRyKTsKKworLy8vIFJlbW92ZSBhbGwgYmxvY2tzIHRoYXQgY2FuIG5vdCBiZSByZWFjaGVkIGZyb20gdGhlIGZ1bmN0aW9uJ3MgZW50cnkuCisvLy8KKy8vLyBSZXR1cm5zIHRydWUgaWYgYW55IGJhc2ljIGJsb2NrIHdhcyByZW1vdmVkLgorYm9vbCByZW1vdmVVbnJlYWNoYWJsZUJsb2NrcyhGdW5jdGlvbiAmRiwgTGF6eVZhbHVlSW5mbyAqTFZJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWREb21pbmFuY2UgKkREVCA9IG51bGxwdHIpOworCisvLy8gQ29tYmluZSB0aGUgbWV0YWRhdGEgb2YgdHdvIGluc3RydWN0aW9ucyBzbyB0aGF0IEsgY2FuIHJlcGxhY2UgSgorLy8vCisvLy8gTWV0YWRhdGEgbm90IGxpc3RlZCBhcyBrbm93biB2aWEgS25vd25JRHMgaXMgcmVtb3ZlZAordm9pZCBjb21iaW5lTWV0YWRhdGEoSW5zdHJ1Y3Rpb24gKkssIGNvbnN0IEluc3RydWN0aW9uICpKLCBBcnJheVJlZjx1bnNpZ25lZD4gS25vd25JRHMpOworCisvLy8gQ29tYmluZSB0aGUgbWV0YWRhdGEgb2YgdHdvIGluc3RydWN0aW9ucyBzbyB0aGF0IEsgY2FuIHJlcGxhY2UgSi4gVGhpcworLy8vIHNwZWNpZmljYWxseSBoYW5kbGVzIHRoZSBjYXNlIG9mIENTRS1saWtlIHRyYW5zZm9ybWF0aW9ucy4KKy8vLworLy8vIFVua25vd24gbWV0YWRhdGEgaXMgcmVtb3ZlZC4KK3ZvaWQgY29tYmluZU1ldGFkYXRhRm9yQ1NFKEluc3RydWN0aW9uICpLLCBjb25zdCBJbnN0cnVjdGlvbiAqSik7CisKKy8vIFJlcGxhY2UgZWFjaCB1c2Ugb2YgJ0Zyb20nIHdpdGggJ1RvJywgaWYgdGhhdCB1c2UgZG9lcyBub3QgYmVsb25nIHRvIGJhc2ljCisvLyBibG9jayB3aGVyZSAnRnJvbScgaXMgZGVmaW5lZC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlcGxhY2VtZW50cyBtYWRlLgordW5zaWduZWQgcmVwbGFjZU5vbkxvY2FsVXNlc1dpdGgoSW5zdHJ1Y3Rpb24gKkZyb20sIFZhbHVlICpUbyk7CisKKy8vLyBSZXBsYWNlIGVhY2ggdXNlIG9mICdGcm9tJyB3aXRoICdUbycgaWYgdGhhdCB1c2UgaXMgZG9taW5hdGVkIGJ5CisvLy8gdGhlIGdpdmVuIGVkZ2UuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVwbGFjZW1lbnRzIG1hZGUuCit1bnNpZ25lZCByZXBsYWNlRG9taW5hdGVkVXNlc1dpdGgoVmFsdWUgKkZyb20sIFZhbHVlICpUbywgRG9taW5hdG9yVHJlZSAmRFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmFzaWNCbG9ja0VkZ2UgJkVkZ2UpOworLy8vIFJlcGxhY2UgZWFjaCB1c2Ugb2YgJ0Zyb20nIHdpdGggJ1RvJyBpZiB0aGF0IHVzZSBpcyBkb21pbmF0ZWQgYnkKKy8vLyB0aGUgZW5kIG9mIHRoZSBnaXZlbiBCYXNpY0Jsb2NrLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVwbGFjZW1lbnRzIG1hZGUuCit1bnNpZ25lZCByZXBsYWNlRG9taW5hdGVkVXNlc1dpdGgoVmFsdWUgKkZyb20sIFZhbHVlICpUbywgRG9taW5hdG9yVHJlZSAmRFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmFzaWNCbG9jayAqQkIpOworCisvLy8gUmV0dXJuIHRydWUgaWYgdGhlIENhbGxTaXRlIENTIGNhbGxzIGEgZ2MgbGVhZiBmdW5jdGlvbi4KKy8vLworLy8vIEEgbGVhZiBmdW5jdGlvbiBpcyBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3Qgc2FmZXBvaW50IHRoZSB0aHJlYWQgZHVyaW5nIGl0cworLy8vIGV4ZWN1dGlvbi4gIER1cmluZyBhIGNhbGwgb3IgaW52b2tlIHRvIHN1Y2ggYSBmdW5jdGlvbiwgdGhlIGNhbGxlcnMgc3RhY2sKKy8vLyBkb2VzIG5vdCBoYXZlIHRvIGJlIG1hZGUgcGFyc2VhYmxlLgorLy8vCisvLy8gTW9zdCBwYXNzZXMgY2FuIGFuZCBzaG91bGQgaWdub3JlIHRoaXMgaW5mb3JtYXRpb24sIGFuZCBpdCBpcyBvbmx5IHVzZWQKKy8vLyBkdXJpbmcgbG93ZXJpbmcgYnkgdGhlIEdDIGluZnJhc3RydWN0dXJlLgorYm9vbCBjYWxsc0dDTGVhZkZ1bmN0aW9uKEltbXV0YWJsZUNhbGxTaXRlIENTLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAmVExJKTsKKworLy8vIENvcHkgYSBub25udWxsIG1ldGFkYXRhIG5vZGUgdG8gYSBuZXcgbG9hZCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFRoaXMgaGFuZGxlcyBtYXBwaW5nIGl0IHRvIHJhbmdlIG1ldGFkYXRhIGlmIHRoZSBuZXcgbG9hZCBpcyBhbiBpbnRlZ2VyCisvLy8gbG9hZCBpbnN0ZWFkIG9mIGEgcG9pbnRlciBsb2FkLgordm9pZCBjb3B5Tm9ubnVsbE1ldGFkYXRhKGNvbnN0IExvYWRJbnN0ICZPbGRMSSwgTUROb2RlICpOLCBMb2FkSW5zdCAmTmV3TEkpOworCisvLy8gQ29weSBhIHJhbmdlIG1ldGFkYXRhIG5vZGUgdG8gYSBuZXcgbG9hZCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFRoaXMgaGFuZGxlcyBtYXBwaW5nIGl0IHRvIG5vbm51bGwgbWV0YWRhdGEgaWYgdGhlIG5ldyBsb2FkIGlzIGEgcG9pbnRlcgorLy8vIGxvYWQgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyIGxvYWQgYW5kIHRoZSByYW5nZSBkb2Vzbid0IGNvdmVyIG51bGwuCit2b2lkIGNvcHlSYW5nZU1ldGFkYXRhKGNvbnN0IERhdGFMYXlvdXQgJkRMLCBjb25zdCBMb2FkSW5zdCAmT2xkTEksIE1ETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgTG9hZEluc3QgJk5ld0xJKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBJbnRyaW5zaWMgcGF0dGVybiBtYXRjaGluZworLy8KKworLy8vIFRyeSB0byBtYXRjaCBhIGJzd2FwIG9yIGJpdHJldmVyc2UgaWRpb20uCisvLy8KKy8vLyBJZiBhbiBpZGlvbSBpcyBtYXRjaGVkLCBhbiBpbnRyaW5zaWMgY2FsbCBpcyBpbnNlcnRlZCBiZWZvcmUgXGMgSS4gQW55IGFkZGVkCisvLy8gaW5zdHJ1Y3Rpb25zIGFyZSByZXR1cm5lZCBpbiBcYyBJbnNlcnRlZEluc3RzLiBUaGV5IHdpbGwgYWxsIGhhdmUgYmVlbiBhZGRlZAorLy8vIHRvIGEgYmFzaWMgYmxvY2suCisvLy8KKy8vLyBBIGJpdHJldmVyc2UgaWRpb20gbm9ybWFsbHkgcmVxdWlyZXMgYXJvdW5kIDIqQlcgbm9kZXMgdG8gYmUgc2VhcmNoZWQgKHdoZXJlCisvLy8gQlcgaXMgdGhlIGJpdHdpZHRoIG9mIHRoZSBpbnRlZ2VyIHR5cGUpLiBBIGJzd2FwIGlkaW9tIHJlcXVpcmVzIGFueXdoZXJlIHVwCisvLy8gdG8gQlcgLyA0IG5vZGVzIHRvIGJlIHNlYXJjaGVkLCBzbyBpcyBzaWduaWZpY2FudGx5IGZhc3Rlci4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIG9uIGEgc3VjY2Vzc2Z1bCBtYXRjaCBvciBmYWxzZSBvdGhlcndpc2UuCitib29sIHJlY29nbml6ZUJTd2FwT3JCaXRSZXZlcnNlSWRpb20oCisgICAgSW5zdHJ1Y3Rpb24gKkksIGJvb2wgTWF0Y2hCU3dhcHMsIGJvb2wgTWF0Y2hCaXRSZXZlcnNhbHMsCisgICAgU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uICo+ICZJbnNlcnRlZEluc3RzKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBTYW5pdGl6ZXIgdXRpbGl0aWVzCisvLworCisvLy8gR2l2ZW4gYSBDYWxsSW5zdCwgY2hlY2sgaWYgaXQgY2FsbHMgYSBzdHJpbmcgZnVuY3Rpb24ga25vd24gdG8gQ29kZUdlbiwKKy8vLyBhbmQgbWFyayBpdCB3aXRoIE5vQnVpbHRpbiBpZiBzby4gIFRvIGJlIHVzZWQgYnkgc2FuaXRpemVycyB0aGF0IGludGVuZAorLy8vIHRvIGludGVyY2VwdCBzdHJpbmcgZnVuY3Rpb25zIGFuZCB3YW50IHRvIGF2b2lkIGNvbnZlcnRpbmcgdGhlbSB0byB0YXJnZXQKKy8vLyBzcGVjaWZpYyBpbnN0cnVjdGlvbnMuCit2b2lkIG1heWJlTWFya1Nhbml0aXplckxpYnJhcnlDYWxsTm9CdWlsdGluKENhbGxJbnN0ICpDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgVHJhbnNmb3JtIHByZWRpY2F0ZXMKKy8vCisKKy8vLyBHaXZlbiBhbiBpbnN0cnVjdGlvbiwgaXMgaXQgbGVnYWwgdG8gc2V0IG9wZXJhbmQgT3BJZHggdG8gYSBub24tY29uc3RhbnQKKy8vLyB2YWx1ZT8KK2Jvb2wgY2FuUmVwbGFjZU9wZXJhbmRXaXRoVmFyaWFibGUoY29uc3QgSW5zdHJ1Y3Rpb24gKkksIHVuc2lnbmVkIE9wSWR4KTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19MT0NBTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1ZhbHVlTGF0dGljZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9WYWx1ZUxhdHRpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQzZmQxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9WYWx1ZUxhdHRpY2UuaApAQCAtMCwwICsxLDMyMSBAQAorLy89PT0tIFZhbHVlTGF0dGljZS5oIC0gVmFsdWUgY29uc3RyYWludCBhbmFseXNpcyAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1ZBTFVFTEFUVElDRV9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfVkFMVUVMQVRUSUNFX0gKKworI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRSYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRzLmgiCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTGF0dGljZUVsZW1lbnQKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgbGF0dGljZSB2YWx1ZXMgZm9yIGNvbnN0YW50cy4KKy8vLworLy8vIEZJWE1FOiBUaGlzIGlzIGJhc2ljYWxseSBqdXN0IGZvciBicmluZ3VwLCB0aGlzIGNhbiBiZSBtYWRlIGEgbG90IG1vcmUgcmljaAorLy8vIGluIHRoZSBmdXR1cmUuCisvLy8KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgVmFsdWVMYXR0aWNlRWxlbWVudCB7CisgIGVudW0gVmFsdWVMYXR0aWNlRWxlbWVudFR5IHsKKyAgICAvLy8gVGhpcyBWYWx1ZSBoYXMgbm8ga25vd24gdmFsdWUgeWV0LiAgQXMgYSByZXN1bHQsIHRoaXMgaW1wbGllcyB0aGUKKyAgICAvLy8gcHJvZHVjaW5nIGluc3RydWN0aW9uIGlzIGRlYWQuICBDYXV0aW9uOiBXZSB1c2UgdGhpcyBhcyB0aGUgc3RhcnRpbmcKKyAgICAvLy8gc3RhdGUgaW4gb3VyIGxvY2FsIG1lZXQgcnVsZXMuICBJbiB0aGlzIHVzYWdlLCBpdCdzIHRha2VuIHRvIG1lYW4KKyAgICAvLy8gIm5vdGhpbmcga25vd24geWV0Ii4KKyAgICB1bmRlZmluZWQsCisKKyAgICAvLy8gVGhpcyBWYWx1ZSBoYXMgYSBzcGVjaWZpYyBjb25zdGFudCB2YWx1ZS4gIChGb3IgY29uc3RhbnQgaW50ZWdlcnMsCisgICAgLy8vIGNvbnN0YW50cmFuZ2UgaXMgdXNlZCBpbnN0ZWFkLiAgSW50ZWdlciB0eXBlZCBjb25zdGFudGV4cHJzIGNhbiBhcHBlYXIKKyAgICAvLy8gYXMgY29uc3RhbnQuKQorICAgIGNvbnN0YW50LAorCisgICAgLy8vIFRoaXMgVmFsdWUgaXMga25vd24gdG8gbm90IGhhdmUgdGhlIHNwZWNpZmllZCB2YWx1ZS4gIChGb3IgY29uc3RhbnQKKyAgICAvLy8gaW50ZWdlcnMsIGNvbnN0YW50cmFuZ2UgaXMgdXNlZCBpbnN0ZWFkLiAgQXMgYWJvdmUsIGludGVnZXIgdHlwZWQKKyAgICAvLy8gY29uc3RhbnRleHBycyBjYW4gYXBwZWFyIGhlcmUuKQorICAgIG5vdGNvbnN0YW50LAorCisgICAgLy8vIFRoZSBWYWx1ZSBmYWxscyB3aXRoaW4gdGhpcyByYW5nZS4gKFVzZWQgb25seSBmb3IgaW50ZWdlciB0eXBlZCB2YWx1ZXMuKQorICAgIGNvbnN0YW50cmFuZ2UsCisKKyAgICAvLy8gV2UgY2FuIG5vdCBwcmVjaXNlbHkgbW9kZWwgdGhlIGR5bmFtaWMgdmFsdWVzIHRoaXMgdmFsdWUgbWlnaHQgdGFrZS4KKyAgICBvdmVyZGVmaW5lZAorICB9OworCisgIFZhbHVlTGF0dGljZUVsZW1lbnRUeSBUYWc7CisKKyAgLy8vIFRoZSB1bmlvbiBlaXRoZXIgc3RvcmVzIGEgcG9pbnRlciB0byBhIGNvbnN0YW50IG9yIGEgY29uc3RhbnQgcmFuZ2UsCisgIC8vLyBhc3NvY2lhdGVkIHRvIHRoZSBsYXR0aWNlIGVsZW1lbnQuIFdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgUmFuZ2UgaXMKKyAgLy8vIGluaXRpYWxpemVkIG9yIGRlc3Ryb3llZCB3aGVuIGNoYW5naW5nIHN0YXRlIHRvIG9yIGZyb20gY29uc3RhbnRyYW5nZS4KKyAgdW5pb24geworICAgIENvbnN0YW50ICpDb25zdFZhbDsKKyAgICBDb25zdGFudFJhbmdlIFJhbmdlOworICB9OworCitwdWJsaWM6CisgIC8vIENvbnN0IGFuZCBSYW5nZSBhcmUgaW5pdGlhbGl6ZWQgb24tZGVtYW5kLgorICBWYWx1ZUxhdHRpY2VFbGVtZW50KCkgOiBUYWcodW5kZWZpbmVkKSB7fQorCisgIC8vLyBDdXN0b20gZGVzdHJ1Y3RvciB0byBlbnN1cmUgUmFuZ2UgaXMgcHJvcGVybHkgZGVzdHJveWVkLCB3aGVuIHRoZSBvYmplY3QKKyAgLy8vIGlzIGRlYWxsb2NhdGVkLgorICB+VmFsdWVMYXR0aWNlRWxlbWVudCgpIHsKKyAgICBzd2l0Y2ggKFRhZykgeworICAgIGNhc2Ugb3ZlcmRlZmluZWQ6CisgICAgY2FzZSB1bmRlZmluZWQ6CisgICAgY2FzZSBjb25zdGFudDoKKyAgICBjYXNlIG5vdGNvbnN0YW50OgorICAgICAgYnJlYWs7CisgICAgY2FzZSBjb25zdGFudHJhbmdlOgorICAgICAgUmFuZ2UufkNvbnN0YW50UmFuZ2UoKTsKKyAgICAgIGJyZWFrOworICAgIH07CisgIH0KKworICAvLy8gQ3VzdG9tIGNvcHkgY29uc3RydWN0b3IsIHRvIGVuc3VyZSBSYW5nZSBnZXRzIGluaXRpYWxpemVkIHdoZW4KKyAgLy8vIGNvcHlpbmcgYSBjb25zdGFudCByYW5nZSBsYXR0aWNlIGVsZW1lbnQuCisgIFZhbHVlTGF0dGljZUVsZW1lbnQoY29uc3QgVmFsdWVMYXR0aWNlRWxlbWVudCAmT3RoZXIpIDogVGFnKHVuZGVmaW5lZCkgeworICAgICp0aGlzID0gT3RoZXI7CisgIH0KKworICAvLy8gQ3VzdG9tIGFzc2lnbm1lbnQgb3BlcmF0b3IsIHRvIGVuc3VyZSBSYW5nZSBnZXRzIGluaXRpYWxpemVkIHdoZW4KKyAgLy8vIGFzc2lnbmluZyBhIGNvbnN0YW50IHJhbmdlIGxhdHRpY2UgZWxlbWVudC4KKyAgVmFsdWVMYXR0aWNlRWxlbWVudCAmb3BlcmF0b3I9KGNvbnN0IFZhbHVlTGF0dGljZUVsZW1lbnQgJk90aGVyKSB7CisgICAgLy8gSWYgd2UgY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGlzIGZyb20gY29uc3RhbnQgcmFuZ2UgdG8gbm9uIGNvbnN0YW50IHJhbmdlLAorICAgIC8vIGRlc3Ryb3kgUmFuZ2UuCisgICAgaWYgKGlzQ29uc3RhbnRSYW5nZSgpICYmICFPdGhlci5pc0NvbnN0YW50UmFuZ2UoKSkKKyAgICAgIFJhbmdlLn5Db25zdGFudFJhbmdlKCk7CisKKyAgICAvLyBJZiB3ZSBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoaXMgZnJvbSBhIHZhbGlkIENvbnN0VmFsIHRvIGFub3RoZXIgYSBzdGF0ZQorICAgIC8vIHdpdGhvdXQgYSB2YWxpZCBDb25zdFZhbCwgemVybyB0aGUgcG9pbnRlci4KKyAgICBpZiAoKGlzQ29uc3RhbnQoKSB8fCBpc05vdENvbnN0YW50KCkpICYmICFPdGhlci5pc0NvbnN0YW50KCkgJiYKKyAgICAgICAgIU90aGVyLmlzTm90Q29uc3RhbnQoKSkKKyAgICAgIENvbnN0VmFsID0gbnVsbHB0cjsKKworICAgIHN3aXRjaCAoT3RoZXIuVGFnKSB7CisgICAgY2FzZSBjb25zdGFudHJhbmdlOgorICAgICAgaWYgKCFpc0NvbnN0YW50UmFuZ2UoKSkKKyAgICAgICAgbmV3ICgmUmFuZ2UpIENvbnN0YW50UmFuZ2UoT3RoZXIuUmFuZ2UpOworICAgICAgZWxzZQorICAgICAgICBSYW5nZSA9IE90aGVyLlJhbmdlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb25zdGFudDoKKyAgICBjYXNlIG5vdGNvbnN0YW50OgorICAgICAgQ29uc3RWYWwgPSBPdGhlci5Db25zdFZhbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugb3ZlcmRlZmluZWQ6CisgICAgY2FzZSB1bmRlZmluZWQ6CisgICAgICBicmVhazsKKyAgICB9CisgICAgVGFnID0gT3RoZXIuVGFnOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHN0YXRpYyBWYWx1ZUxhdHRpY2VFbGVtZW50IGdldChDb25zdGFudCAqQykgeworICAgIFZhbHVlTGF0dGljZUVsZW1lbnQgUmVzOworICAgIGlmICghaXNhPFVuZGVmVmFsdWU+KEMpKQorICAgICAgUmVzLm1hcmtDb25zdGFudChDKTsKKyAgICByZXR1cm4gUmVzOworICB9CisgIHN0YXRpYyBWYWx1ZUxhdHRpY2VFbGVtZW50IGdldE5vdChDb25zdGFudCAqQykgeworICAgIFZhbHVlTGF0dGljZUVsZW1lbnQgUmVzOworICAgIGlmICghaXNhPFVuZGVmVmFsdWU+KEMpKQorICAgICAgUmVzLm1hcmtOb3RDb25zdGFudChDKTsKKyAgICByZXR1cm4gUmVzOworICB9CisgIHN0YXRpYyBWYWx1ZUxhdHRpY2VFbGVtZW50IGdldFJhbmdlKENvbnN0YW50UmFuZ2UgQ1IpIHsKKyAgICBWYWx1ZUxhdHRpY2VFbGVtZW50IFJlczsKKyAgICBSZXMubWFya0NvbnN0YW50UmFuZ2Uoc3RkOjptb3ZlKENSKSk7CisgICAgcmV0dXJuIFJlczsKKyAgfQorICBzdGF0aWMgVmFsdWVMYXR0aWNlRWxlbWVudCBnZXRPdmVyZGVmaW5lZCgpIHsKKyAgICBWYWx1ZUxhdHRpY2VFbGVtZW50IFJlczsKKyAgICBSZXMubWFya092ZXJkZWZpbmVkKCk7CisgICAgcmV0dXJuIFJlczsKKyAgfQorCisgIGJvb2wgaXNVbmRlZmluZWQoKSBjb25zdCB7IHJldHVybiBUYWcgPT0gdW5kZWZpbmVkOyB9CisgIGJvb2wgaXNDb25zdGFudCgpIGNvbnN0IHsgcmV0dXJuIFRhZyA9PSBjb25zdGFudDsgfQorICBib29sIGlzTm90Q29uc3RhbnQoKSBjb25zdCB7IHJldHVybiBUYWcgPT0gbm90Y29uc3RhbnQ7IH0KKyAgYm9vbCBpc0NvbnN0YW50UmFuZ2UoKSBjb25zdCB7IHJldHVybiBUYWcgPT0gY29uc3RhbnRyYW5nZTsgfQorICBib29sIGlzT3ZlcmRlZmluZWQoKSBjb25zdCB7IHJldHVybiBUYWcgPT0gb3ZlcmRlZmluZWQ7IH0KKworICBDb25zdGFudCAqZ2V0Q29uc3RhbnQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQ29uc3RhbnQoKSAmJiAiQ2Fubm90IGdldCB0aGUgY29uc3RhbnQgb2YgYSBub24tY29uc3RhbnQhIik7CisgICAgcmV0dXJuIENvbnN0VmFsOworICB9CisKKyAgQ29uc3RhbnQgKmdldE5vdENvbnN0YW50KCkgY29uc3QgeworICAgIGFzc2VydChpc05vdENvbnN0YW50KCkgJiYgIkNhbm5vdCBnZXQgdGhlIGNvbnN0YW50IG9mIGEgbm9uLW5vdGNvbnN0YW50ISIpOworICAgIHJldHVybiBDb25zdFZhbDsKKyAgfQorCisgIGNvbnN0IENvbnN0YW50UmFuZ2UgJmdldENvbnN0YW50UmFuZ2UoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQ29uc3RhbnRSYW5nZSgpICYmCisgICAgICAgICAgICJDYW5ub3QgZ2V0IHRoZSBjb25zdGFudC1yYW5nZSBvZiBhIG5vbi1jb25zdGFudC1yYW5nZSEiKTsKKyAgICByZXR1cm4gUmFuZ2U7CisgIH0KKworICBPcHRpb25hbDxBUEludD4gYXNDb25zdGFudEludGVnZXIoKSBjb25zdCB7CisgICAgaWYgKGlzQ29uc3RhbnQoKSAmJiBpc2E8Q29uc3RhbnRJbnQ+KGdldENvbnN0YW50KCkpKSB7CisgICAgICByZXR1cm4gY2FzdDxDb25zdGFudEludD4oZ2V0Q29uc3RhbnQoKSktPmdldFZhbHVlKCk7CisgICAgfSBlbHNlIGlmIChpc0NvbnN0YW50UmFuZ2UoKSAmJiBnZXRDb25zdGFudFJhbmdlKCkuaXNTaW5nbGVFbGVtZW50KCkpIHsKKyAgICAgIHJldHVybiAqZ2V0Q29uc3RhbnRSYW5nZSgpLmdldFNpbmdsZUVsZW1lbnQoKTsKKyAgICB9CisgICAgcmV0dXJuIE5vbmU7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBtYXJrT3ZlcmRlZmluZWQoKSB7CisgICAgaWYgKGlzT3ZlcmRlZmluZWQoKSkKKyAgICAgIHJldHVybjsKKyAgICBpZiAoaXNDb25zdGFudCgpIHx8IGlzTm90Q29uc3RhbnQoKSkKKyAgICAgIENvbnN0VmFsID0gbnVsbHB0cjsKKyAgICBpZiAoaXNDb25zdGFudFJhbmdlKCkpCisgICAgICBSYW5nZS5+Q29uc3RhbnRSYW5nZSgpOworICAgIFRhZyA9IG92ZXJkZWZpbmVkOworICB9CisKKyAgdm9pZCBtYXJrQ29uc3RhbnQoQ29uc3RhbnQgKlYpIHsKKyAgICBhc3NlcnQoViAmJiAiTWFya2luZyBjb25zdGFudCB3aXRoIE5VTEwiKTsKKyAgICBpZiAoQ29uc3RhbnRJbnQgKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFYpKSB7CisgICAgICBtYXJrQ29uc3RhbnRSYW5nZShDb25zdGFudFJhbmdlKENJLT5nZXRWYWx1ZSgpKSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChpc2E8VW5kZWZWYWx1ZT4oVikpCisgICAgICByZXR1cm47CisKKyAgICBhc3NlcnQoKCFpc0NvbnN0YW50KCkgfHwgZ2V0Q29uc3RhbnQoKSA9PSBWKSAmJgorICAgICAgICAgICAiTWFya2luZyBjb25zdGFudCB3aXRoIGRpZmZlcmVudCB2YWx1ZSIpOworICAgIGFzc2VydChpc1VuZGVmaW5lZCgpKTsKKyAgICBUYWcgPSBjb25zdGFudDsKKyAgICBDb25zdFZhbCA9IFY7CisgIH0KKworICB2b2lkIG1hcmtOb3RDb25zdGFudChDb25zdGFudCAqVikgeworICAgIGFzc2VydChWICYmICJNYXJraW5nIGNvbnN0YW50IHdpdGggTlVMTCIpOworICAgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVikpIHsKKyAgICAgIG1hcmtDb25zdGFudFJhbmdlKENvbnN0YW50UmFuZ2UoQ0ktPmdldFZhbHVlKCkgKyAxLCBDSS0+Z2V0VmFsdWUoKSkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoaXNhPFVuZGVmVmFsdWU+KFYpKQorICAgICAgcmV0dXJuOworCisgICAgYXNzZXJ0KCghaXNDb25zdGFudCgpIHx8IGdldENvbnN0YW50KCkgIT0gVikgJiYKKyAgICAgICAgICAgIk1hcmtpbmcgY29uc3RhbnQgIWNvbnN0YW50IHdpdGggc2FtZSB2YWx1ZSIpOworICAgIGFzc2VydCgoIWlzTm90Q29uc3RhbnQoKSB8fCBnZXROb3RDb25zdGFudCgpID09IFYpICYmCisgICAgICAgICAgICJNYXJraW5nICFjb25zdGFudCB3aXRoIGRpZmZlcmVudCB2YWx1ZSIpOworICAgIGFzc2VydChpc1VuZGVmaW5lZCgpIHx8IGlzQ29uc3RhbnQoKSk7CisgICAgVGFnID0gbm90Y29uc3RhbnQ7CisgICAgQ29uc3RWYWwgPSBWOworICB9CisKKyAgdm9pZCBtYXJrQ29uc3RhbnRSYW5nZShDb25zdGFudFJhbmdlIE5ld1IpIHsKKyAgICBpZiAoaXNDb25zdGFudFJhbmdlKCkpIHsKKyAgICAgIGlmIChOZXdSLmlzRW1wdHlTZXQoKSkKKyAgICAgICAgbWFya092ZXJkZWZpbmVkKCk7CisgICAgICBlbHNlIHsKKyAgICAgICAgUmFuZ2UgPSBzdGQ6Om1vdmUoTmV3Uik7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXNzZXJ0KGlzVW5kZWZpbmVkKCkpOworICAgIGlmIChOZXdSLmlzRW1wdHlTZXQoKSkKKyAgICAgIG1hcmtPdmVyZGVmaW5lZCgpOworICAgIGVsc2UgeworICAgICAgVGFnID0gY29uc3RhbnRyYW5nZTsKKyAgICAgIG5ldyAoJlJhbmdlKSBDb25zdGFudFJhbmdlKHN0ZDo6bW92ZShOZXdSKSk7CisgICAgfQorICB9CisKK3B1YmxpYzoKKyAgLy8vIFVwZGF0ZXMgdGhpcyBvYmplY3QgdG8gYXBwcm94aW1hdGUgYm90aCB0aGlzIG9iamVjdCBhbmQgUkhTLiBSZXR1cm5zCisgIC8vLyB0cnVlIGlmIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGNoYW5nZWQuCisgIGJvb2wgbWVyZ2VJbihjb25zdCBWYWx1ZUxhdHRpY2VFbGVtZW50ICZSSFMsIGNvbnN0IERhdGFMYXlvdXQgJkRMKSB7CisgICAgaWYgKFJIUy5pc1VuZGVmaW5lZCgpIHx8IGlzT3ZlcmRlZmluZWQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoUkhTLmlzT3ZlcmRlZmluZWQoKSkgeworICAgICAgbWFya092ZXJkZWZpbmVkKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoaXNVbmRlZmluZWQoKSkgeworICAgICAgKnRoaXMgPSBSSFM7CisgICAgICByZXR1cm4gIVJIUy5pc1VuZGVmaW5lZCgpOworICAgIH0KKworICAgIGlmIChpc0NvbnN0YW50KCkpIHsKKyAgICAgIGlmIChSSFMuaXNDb25zdGFudCgpICYmIGdldENvbnN0YW50KCkgPT0gUkhTLmdldENvbnN0YW50KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIG1hcmtPdmVyZGVmaW5lZCgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKGlzTm90Q29uc3RhbnQoKSkgeworICAgICAgaWYgKFJIUy5pc05vdENvbnN0YW50KCkgJiYgZ2V0Tm90Q29uc3RhbnQoKSA9PSBSSFMuZ2V0Tm90Q29uc3RhbnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgbWFya092ZXJkZWZpbmVkKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBhc3NlcnQoaXNDb25zdGFudFJhbmdlKCkgJiYgIk5ldyBWYWx1ZUxhdHRpY2UgdHlwZT8iKTsKKyAgICBpZiAoIVJIUy5pc0NvbnN0YW50UmFuZ2UoKSkgeworICAgICAgLy8gV2UgY2FuIGdldCBoZXJlIGlmIHdlJ3ZlIGVuY291bnRlcmVkIGEgY29uc3RhbnRleHByIG9mIGludGVnZXIgdHlwZQorICAgICAgLy8gYW5kIG1lcmdlIGl0IHdpdGggYSBjb25zdGFudHJhbmdlLgorICAgICAgbWFya092ZXJkZWZpbmVkKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgQ29uc3RhbnRSYW5nZSBOZXdSID0gZ2V0Q29uc3RhbnRSYW5nZSgpLnVuaW9uV2l0aChSSFMuZ2V0Q29uc3RhbnRSYW5nZSgpKTsKKyAgICBpZiAoTmV3Ui5pc0Z1bGxTZXQoKSkKKyAgICAgIG1hcmtPdmVyZGVmaW5lZCgpOworICAgIGVsc2UKKyAgICAgIG1hcmtDb25zdGFudFJhbmdlKHN0ZDo6bW92ZShOZXdSKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBDb25zdGFudEludCAqZ2V0Q29uc3RhbnRJbnQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQ29uc3RhbnQoKSAmJiBpc2E8Q29uc3RhbnRJbnQ+KGdldENvbnN0YW50KCkpICYmCisgICAgICAgICAgICJObyBpbnRlZ2VyIGNvbnN0YW50Iik7CisgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnRJbnQ+KGdldENvbnN0YW50KCkpOworICB9CisKKyAgLy8vIENvbXBhcmVzIHRoaXMgc3ltYm9saWMgdmFsdWUgd2l0aCBPdGhlciB1c2luZyBQcmVkIGFuZCByZXR1cm5zIGVpdGhlcgorICAvLy8gdHJ1ZSwgZmFsc2Ugb3IgdW5kZWYgY29uc3RhbnRzLCBvciBudWxscHRyIGlmIHRoZSBjb21wYXJpc29uIGNhbm5vdCBiZQorICAvLy8gZXZhbHVhdGVkLgorICBDb25zdGFudCAqZ2V0Q29tcGFyZShDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlTGF0dGljZUVsZW1lbnQgJk90aGVyKSBjb25zdCB7CisgICAgaWYgKGlzVW5kZWZpbmVkKCkgfHwgT3RoZXIuaXNVbmRlZmluZWQoKSkKKyAgICAgIHJldHVybiBVbmRlZlZhbHVlOjpnZXQoVHkpOworCisgICAgaWYgKGlzQ29uc3RhbnQoKSAmJiBPdGhlci5pc0NvbnN0YW50KCkpCisgICAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRDb21wYXJlKFByZWQsIGdldENvbnN0YW50KCksIE90aGVyLmdldENvbnN0YW50KCkpOworCisgICAgLy8gSW50ZWdlciBjb25zdGFudHMgYXJlIHJlcHJlc2VudGVkIGFzIENvbnN0YW50UmFuZ2VzIHdpdGggc2luZ2xlCisgICAgLy8gZWxlbWVudHMuCisgICAgaWYgKCFpc0NvbnN0YW50UmFuZ2UoKSB8fCAhT3RoZXIuaXNDb25zdGFudFJhbmdlKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIGNvbnN0IGF1dG8gJkNSID0gZ2V0Q29uc3RhbnRSYW5nZSgpOworICAgIGNvbnN0IGF1dG8gJk90aGVyQ1IgPSBPdGhlci5nZXRDb25zdGFudFJhbmdlKCk7CisgICAgaWYgKENvbnN0YW50UmFuZ2U6Om1ha2VTYXRpc2Z5aW5nSUNtcFJlZ2lvbihQcmVkLCBPdGhlckNSKS5jb250YWlucyhDUikpCisgICAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldFRydWUoVHkpOworICAgIGlmIChDb25zdGFudFJhbmdlOjptYWtlU2F0aXNmeWluZ0lDbXBSZWdpb24oCisgICAgICAgICAgICBDbXBJbnN0OjpnZXRJbnZlcnNlUHJlZGljYXRlKFByZWQpLCBPdGhlckNSKQorICAgICAgICAgICAgLmNvbnRhaW5zKENSKSkKKyAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0RmFsc2UoVHkpOworCisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KK307CisKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgVmFsdWVMYXR0aWNlRWxlbWVudCAmVmFsKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9WYWx1ZUxhdHRpY2VVdGlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9WYWx1ZUxhdHRpY2VVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMDcyNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1ZhbHVlTGF0dGljZVV0aWxzLmgKQEAgLTAsMCArMSw0MSBAQAorLy89PT0tLSBWYWx1ZUxhdHRpY2VVdGlscy5oIC0gVXRpbHMgZm9yIHNvbHZpbmcgbGF0dGljZXMgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgY29tbW9uIGZ1bmN0aW9ucyB1c2VmdWwgZm9yIHBlcmZvcm1pbmcgZGF0YS1mbG93IGFuYWx5c2VzCisvLyB0aGF0IHByb3BhZ2F0ZSB2YWx1ZXMgYWNyb3NzIGZ1bmN0aW9uIGJvdW5kYXJpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1ZBTFVFTEFUVElDRVVUSUxTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19WQUxVRUxBVFRJQ0VVVElMU19ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBHbG9iYWxWYXJpYWJsZTsKKworLy8vIERldGVybWluZSBpZiB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBmdW5jdGlvbidzIGFyZ3VtZW50cyBjYW4gYmUgdHJhY2tlZAorLy8vIGludGVycHJvY2VkdXJhbGx5LiBUaGUgdmFsdWUgb2YgYW4gYXJndW1lbnQgY2FuIGJlIHRyYWNrZWQgaWYgdGhlIGZ1bmN0aW9uCisvLy8gaGFzIGxvY2FsIGxpbmthZ2UgYW5kIGl0cyBhZGRyZXNzIGlzIG5vdCB0YWtlbi4KK2Jvb2wgY2FuVHJhY2tBcmd1bWVudHNJbnRlcnByb2NlZHVyYWxseShGdW5jdGlvbiAqRik7CisKKy8vLyBEZXRlcm1pbmUgaWYgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24ncyByZXR1cm5zIGNhbiBiZSB0cmFja2VkCisvLy8gaW50ZXJwcm9jZWR1cmFsbHkuIFJldHVybiB2YWx1ZXMgY2FuIGJlIHRyYWNrZWQgaWYgdGhlIGZ1bmN0aW9uIGhhcyBhbgorLy8vIGV4YWN0IGRlZmluaXRpb24gYW5kIGl0IGRvZXNuJ3QgaGF2ZSB0aGUgIm5ha2VkIiBhdHRyaWJ1dGUuIE5ha2VkIGZ1bmN0aW9ucworLy8vIG1heSBjb250YWluIGFzc2VtYmx5IGNvZGUgdGhhdCByZXR1cm5zIHVudHJhY2thYmxlIHZhbHVlcy4KK2Jvb2wgY2FuVHJhY2tSZXR1cm5zSW50ZXJwcm9jZWR1cmFsbHkoRnVuY3Rpb24gKkYpOworCisvLy8gRGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBtYWludGFpbmVkIGluIHRoZSBnaXZlbiBnbG9iYWwgdmFyaWFibGUgY2FuIGJlCisvLy8gdHJhY2tlZCBpbnRlcnByb2NlZHVyYWxseS4gQSB2YWx1ZSBjYW4gYmUgdHJhY2tlZCBpZiB0aGUgZ2xvYmFsIHZhcmlhYmxlCisvLy8gaGFzIGxvY2FsIGxpbmthZ2UgYW5kIGlzIG9ubHkgdXNlZCBieSBub24tdm9sYXRpbGUgbG9hZHMgYW5kIHN0b3Jlcy4KK2Jvb2wgY2FuVHJhY2tHbG9iYWxWYXJpYWJsZUludGVycHJvY2VkdXJhbGx5KEdsb2JhbFZhcmlhYmxlICpHVik7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX1ZBTFVFTEFUVElDRVVUSUxTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVmFsdWVUcmFja2luZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9WYWx1ZVRyYWNraW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VkOTVkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVmFsdWVUcmFja2luZy5oCkBAIC0wLDAgKzEsNTU5IEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9WYWx1ZVRyYWNraW5nLmggLSBXYWxrIGNvbXB1dGF0aW9ucyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0aGF0IGhlbHAgYW5hbHl6ZSBwcm9wZXJ0aWVzIHRoYXQgY2hhaW5zIG9mCisvLyBjb21wdXRhdGlvbnMgaGF2ZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfVkFMVUVUUkFDS0lOR19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfVkFMVUVUUkFDS0lOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBZGRPcGVyYXRvcjsKK2NsYXNzIEFQSW50OworY2xhc3MgQXNzdW1wdGlvbkNhY2hlOworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBHRVBPcGVyYXRvcjsKK2NsYXNzIEludHJpbnNpY0luc3Q7CitzdHJ1Y3QgS25vd25CaXRzOworY2xhc3MgTG9vcDsKK2NsYXNzIExvb3BJbmZvOworY2xhc3MgTUROb2RlOworY2xhc3MgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlcjsKK2NsYXNzIFN0cmluZ1JlZjsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworY2xhc3MgVmFsdWU7CisKKyAgLy8vIERldGVybWluZSB3aGljaCBiaXRzIG9mIFYgYXJlIGtub3duIHRvIGJlIGVpdGhlciB6ZXJvIG9yIG9uZSBhbmQgcmV0dXJuCisgIC8vLyB0aGVtIGluIHRoZSBLbm93blplcm8vS25vd25PbmUgYml0IHNldHMuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkIG9uIHZhbHVlcyB3aXRoIGludGVnZXIgdHlwZSwgdmFsdWVzIHdpdGggcG9pbnRlcgorICAvLy8gdHlwZSwgYW5kIHZlY3RvcnMgb2YgaW50ZWdlcnMuICBJbiB0aGUgY2FzZQorICAvLy8gd2hlcmUgViBpcyBhIHZlY3RvciwgdGhlIGtub3duIHplcm8gYW5kIGtub3duIG9uZSB2YWx1ZXMgYXJlIHRoZQorICAvLy8gc2FtZSB3aWR0aCBhcyB0aGUgdmVjdG9yIGVsZW1lbnQsIGFuZCB0aGUgYml0IGlzIHNldCBvbmx5IGlmIGl0IGlzIHRydWUKKyAgLy8vIGZvciBhbGwgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuCisgIHZvaWQgY29tcHV0ZUtub3duQml0cyhjb25zdCBWYWx1ZSAqViwgS25vd25CaXRzICZLbm93biwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMLCB1bnNpZ25lZCBEZXB0aCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpDeHRJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgKk9SRSA9IG51bGxwdHIpOworCisgIC8vLyBSZXR1cm5zIHRoZSBrbm93biBiaXRzIHJhdGhlciB0aGFuIHBhc3NpbmcgYnkgcmVmZXJlbmNlLgorICBLbm93bkJpdHMgY29tcHV0ZUtub3duQml0cyhjb25zdCBWYWx1ZSAqViwgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCwgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpDeHRJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICpPUkUgPSBudWxscHRyKTsKKworICAvLy8gQ29tcHV0ZSBrbm93biBiaXRzIGZyb20gdGhlIHJhbmdlIG1ldGFkYXRhLgorICAvLy8gXHAgS25vd25aZXJvIHRoZSBzZXQgb2YgYml0cyB0aGF0IGFyZSBrbm93biB0byBiZSB6ZXJvCisgIC8vLyBccCBLbm93bk9uZSB0aGUgc2V0IG9mIGJpdHMgdGhhdCBhcmUga25vd24gdG8gYmUgb25lCisgIHZvaWQgY29tcHV0ZUtub3duQml0c0Zyb21SYW5nZU1ldGFkYXRhKGNvbnN0IE1ETm9kZSAmUmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbm93bkJpdHMgJktub3duKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgTEhTIGFuZCBSSFMgaGF2ZSBubyBjb21tb24gYml0cyBzZXQuCisgIGJvb2wgaGF2ZU5vQ29tbW9uQml0c1NldChjb25zdCBWYWx1ZSAqTEhTLCBjb25zdCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpDeHRJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cik7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBrbm93biB0byBoYXZlIGV4YWN0bHkgb25lIGJpdCBzZXQgd2hlbgorICAvLy8gZGVmaW5lZC4gRm9yIHZlY3RvcnMgcmV0dXJuIHRydWUgaWYgZXZlcnkgZWxlbWVudCBpcyBrbm93biB0byBiZSBhIHBvd2VyCisgIC8vLyBvZiB0d28gd2hlbiBkZWZpbmVkLiBTdXBwb3J0cyB2YWx1ZXMgd2l0aCBpbnRlZ2VyIG9yIHBvaW50ZXIgdHlwZSBhbmQKKyAgLy8vIHZlY3RvcnMgb2YgaW50ZWdlcnMuIElmICdPclplcm8nIGlzIHNldCwgdGhlbiByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4KKyAgLy8vIHZhbHVlIGlzIGVpdGhlciBhIHBvd2VyIG9mIHR3byBvciB6ZXJvLgorICBib29sIGlzS25vd25Ub0JlQVBvd2VyT2ZUd28oY29uc3QgVmFsdWUgKlYsIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPclplcm8gPSBmYWxzZSwgdW5zaWduZWQgRGVwdGggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqQ3h0SSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIpOworCisgIGJvb2wgaXNPbmx5VXNlZEluWmVyb0VxdWFsaXR5Q29tcGFyaXNvbihjb25zdCBJbnN0cnVjdGlvbiAqQ3h0SSk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBrbm93biB0byBiZSBub24temVybyB3aGVuIGRlZmluZWQuIEZvcgorICAvLy8gdmVjdG9ycywgcmV0dXJuIHRydWUgaWYgZXZlcnkgZWxlbWVudCBpcyBrbm93biB0byBiZSBub24temVybyB3aGVuCisgIC8vLyBkZWZpbmVkLiBGb3IgcG9pbnRlcnMsIGlmIHRoZSBjb250ZXh0IGluc3RydWN0aW9uIGFuZCBkb21pbmF0b3IgdHJlZSBhcmUKKyAgLy8vIHNwZWNpZmllZCwgcGVyZm9ybSBjb250ZXh0LXNlbnNpdGl2ZSBhbmFseXNpcyBhbmQgcmV0dXJuIHRydWUgaWYgdGhlCisgIC8vLyBwb2ludGVyIGNvdWxkbid0IHBvc3NpYmx5IGJlIG51bGwgYXQgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4KKyAgLy8vIFN1cHBvcnRzIHZhbHVlcyB3aXRoIGludGVnZXIgb3IgcG9pbnRlciB0eXBlIGFuZCB2ZWN0b3JzIG9mIGludGVnZXJzLgorICBib29sIGlzS25vd25Ob25aZXJvKGNvbnN0IFZhbHVlICpWLCBjb25zdCBEYXRhTGF5b3V0ICZETCwgdW5zaWduZWQgRGVwdGggPSAwLAorICAgICAgICAgICAgICAgICAgICAgIEFzc3VtcHRpb25DYWNoZSAqQUMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpDeHRJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmUgdmFsdWUgaXMga25vd24gdG8gYmUgbm9uLW5lZ2F0aXZlLgorICBib29sIGlzS25vd25Ob25OZWdhdGl2ZShjb25zdCBWYWx1ZSAqViwgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpDeHRJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBrbm93biBiZSBwb3NpdGl2ZSAoaS5lLiBub24tbmVnYXRpdmUKKyAgLy8vIGFuZCBub24temVybykuCisgIGJvb2wgaXNLbm93blBvc2l0aXZlKGNvbnN0IFZhbHVlICpWLCBjb25zdCBEYXRhTGF5b3V0ICZETCwgdW5zaWduZWQgRGVwdGggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGtub3duIGJlIG5lZ2F0aXZlIChpLmUuIG5vbi1wb3NpdGl2ZQorICAvLy8gYW5kIG5vbi16ZXJvKS4KKyAgYm9vbCBpc0tub3duTmVnYXRpdmUoY29uc3QgVmFsdWUgKlYsIGNvbnN0IERhdGFMYXlvdXQgJkRMLCB1bnNpZ25lZCBEZXB0aCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgIEFzc3VtcHRpb25DYWNoZSAqQUMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqQ3h0SSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cik7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZXMgYXJlIGtub3duIHRvIGJlIG5vbi1lcXVhbCB3aGVuIGRlZmluZWQuCisgIC8vLyBTdXBwb3J0cyBzY2FsYXIgaW50ZWdlciB0eXBlcyBvbmx5LgorICBib29sIGlzS25vd25Ob25FcXVhbChjb25zdCBWYWx1ZSAqVjEsIGNvbnN0IFZhbHVlICpWMiwgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cik7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmICdWICYgTWFzaycgaXMga25vd24gdG8gYmUgemVyby4gV2UgdXNlIHRoaXMgcHJlZGljYXRlIHRvCisgIC8vLyBzaW1wbGlmeSBvcGVyYXRpb25zIGRvd25zdHJlYW0uIE1hc2sgaXMga25vd24gdG8gYmUgemVybyBmb3IgYml0cyB0aGF0IFYKKyAgLy8vIGNhbm5vdCBoYXZlLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBvbiB2YWx1ZXMgd2l0aCBpbnRlZ2VyIHR5cGUsIHZhbHVlcyB3aXRoIHBvaW50ZXIKKyAgLy8vIHR5cGUsIGFuZCB2ZWN0b3JzIG9mIGludGVnZXJzLiAgSW4gdGhlIGNhc2UKKyAgLy8vIHdoZXJlIFYgaXMgYSB2ZWN0b3IsIHRoZSBtYXNrLCBrbm93biB6ZXJvLCBhbmQga25vd24gb25lIHZhbHVlcyBhcmUgdGhlCisgIC8vLyBzYW1lIHdpZHRoIGFzIHRoZSB2ZWN0b3IgZWxlbWVudCwgYW5kIHRoZSBiaXQgaXMgc2V0IG9ubHkgaWYgaXQgaXMgdHJ1ZQorICAvLy8gZm9yIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KKyAgYm9vbCBNYXNrZWRWYWx1ZUlzWmVybyhjb25zdCBWYWx1ZSAqViwgY29uc3QgQVBJbnQgJk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwLCBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqQ3h0SSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyKTsKKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHNpZ24gYml0IG9mIHRoZSByZWdpc3RlciBpcyByZXBsaWNhdGVkIGludG8KKyAgLy8vIHRoZSBvdGhlciBiaXRzLiBXZSBrbm93IHRoYXQgYXQgbGVhc3QgMSBiaXQgaXMgYWx3YXlzIGVxdWFsIHRvIHRoZSBzaWduCisgIC8vLyBiaXQgKGl0c2VsZiksIGJ1dCBvdGhlciBjYXNlcyBjYW4gZ2l2ZSB1cyBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsCisgIC8vLyBpbW1lZGlhdGVseSBhZnRlciBhbiAiYXNociBYLCAyIiwgd2Uga25vdyB0aGF0IHRoZSB0b3AgMyBiaXRzIGFyZSBhbGwKKyAgLy8vIGVxdWFsIHRvIGVhY2ggb3RoZXIsIHNvIHdlIHJldHVybiAzLiBGb3IgdmVjdG9ycywgcmV0dXJuIHRoZSBudW1iZXIgb2YKKyAgLy8vIHNpZ24gYml0cyBmb3IgdGhlIHZlY3RvciBlbGVtZW50IHdpdGggdGhlIG1pbmludW0gbnVtYmVyIG9mIGtub3duIHNpZ24KKyAgLy8vIGJpdHMuCisgIHVuc2lnbmVkIENvbXB1dGVOdW1TaWduQml0cyhjb25zdCBWYWx1ZSAqT3AsIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwLCBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpDeHRJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cik7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGludGVnZXIgbXVsdGlwbGUgb2YgQmFzZSB0aGF0IGVxdWFscyBWLiBJZgorICAvLy8gc3VjY2Vzc2Z1bCwgaXQgcmV0dXJucyB0cnVlIGFuZCByZXR1cm5zIHRoZSBtdWx0aXBsZSBpbiBNdWx0aXBsZS4gSWYKKyAgLy8vIHVuc3VjY2Vzc2Z1bCwgaXQgcmV0dXJucyBmYWxzZS4gQWxzbywgaWYgViBjYW4gYmUgc2ltcGxpZmllZCB0byBhbgorICAvLy8gaW50ZWdlciwgdGhlbiB0aGUgc2ltcGxpZmllZCBWIGlzIHJldHVybmVkIGluIFZhbC4gTG9vayB0aHJvdWdoIHNleHQgb25seQorICAvLy8gaWYgTG9va1Rocm91Z2hTRXh0PXRydWUuCisgIGJvb2wgQ29tcHV0ZU11bHRpcGxlKFZhbHVlICpWLCB1bnNpZ25lZCBCYXNlLCBWYWx1ZSAqJk11bHRpcGxlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIExvb2tUaHJvdWdoU0V4dCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApOworCisgIC8vLyBNYXAgYSBjYWxsIGluc3RydWN0aW9uIHRvIGFuIGludHJpbnNpYyBJRC4gIExpYmNhbGxzIHdoaWNoIGhhdmUgZXF1aXZhbGVudAorICAvLy8gaW50cmluc2ljcyBhcmUgdHJlYXRlZCBhcy1pZiB0aGV5IHdlcmUgaW50cmluc2ljcy4KKyAgSW50cmluc2ljOjpJRCBnZXRJbnRyaW5zaWNGb3JDYWxsU2l0ZShJbW11dGFibGVDYWxsU2l0ZSBJQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHdlIGNhbiBwcm92ZSB0aGF0IHRoZSBzcGVjaWZpZWQgRlAgdmFsdWUgaXMgbmV2ZXIgZXF1YWwgdG8KKyAgLy8vIC0wLjAuCisgIGJvb2wgQ2Fubm90QmVOZWdhdGl2ZVplcm8oY29uc3QgVmFsdWUgKlYsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgd2UgY2FuIHByb3ZlIHRoYXQgdGhlIHNwZWNpZmllZCBGUCB2YWx1ZSBpcyBlaXRoZXIgTmFOIG9yCisgIC8vLyBuZXZlciBsZXNzIHRoYW4gLTAuMC4KKyAgLy8vCisgIC8vLyAgICAgIE5hTiAtLT4gdHJ1ZQorICAvLy8gICAgICAgKzAgLS0+IHRydWUKKyAgLy8vICAgICAgIC0wIC0tPiB0cnVlCisgIC8vLyAgIHggPiArMCAtLT4gdHJ1ZQorICAvLy8gICB4IDwgLTAgLS0+IGZhbHNlCisgIGJvb2wgQ2Fubm90QmVPcmRlcmVkTGVzc1RoYW5aZXJvKGNvbnN0IFZhbHVlICpWLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGZsb2F0aW5nLXBvaW50IHNjYWxhciB2YWx1ZSBpcyBub3QgYSBOYU4gb3IgaWYgdGhlCisgIC8vLyBmbG9hdGluZy1wb2ludCB2ZWN0b3IgdmFsdWUgaGFzIG5vIE5hTiBlbGVtZW50cy4gUmV0dXJuIGZhbHNlIGlmIGEgdmFsdWUKKyAgLy8vIGNvdWxkIGV2ZXIgYmUgTmFOLgorICBib29sIGlzS25vd25OZXZlck5hTihjb25zdCBWYWx1ZSAqVik7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHdlIGNhbiBwcm92ZSB0aGF0IHRoZSBzcGVjaWZpZWQgRlAgdmFsdWUncyBzaWduIGJpdCBpcyAwLgorICAvLy8KKyAgLy8vICAgICAgTmFOIC0tPiB0cnVlL2ZhbHNlIChkZXBlbmRpbmcgb24gdGhlIE5hTidzIHNpZ24gYml0KQorICAvLy8gICAgICAgKzAgLS0+IHRydWUKKyAgLy8vICAgICAgIC0wIC0tPiBmYWxzZQorICAvLy8gICB4ID4gKzAgLS0+IHRydWUKKyAgLy8vICAgeCA8IC0wIC0tPiBmYWxzZQorICBib29sIFNpZ25CaXRNdXN0QmVaZXJvKGNvbnN0IFZhbHVlICpWLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKKworICAvLy8gSWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBjYW4gYmUgc2V0IGJ5IHJlcGVhdGluZyB0aGUgc2FtZSBieXRlIGluIG1lbW9yeSwKKyAgLy8vIHJldHVybiB0aGUgaTggdmFsdWUgdGhhdCBpdCBpcyByZXByZXNlbnRlZCB3aXRoLiBUaGlzIGlzIHRydWUgZm9yIGFsbCBpOAorICAvLy8gdmFsdWVzIG9idmlvdXNseSwgYnV0IGlzIGFsc28gdHJ1ZSBmb3IgaTMyIDAsIGkzMiAtMSwgaTE2IDB4RjBGMCwgZG91YmxlCisgIC8vLyAwLjAgZXRjLiBJZiB0aGUgdmFsdWUgY2FuJ3QgYmUgaGFuZGxlZCB3aXRoIGEgcmVwZWF0ZWQgYnl0ZSBzdG9yZSAoZS5nLgorICAvLy8gaTE2IDB4MTIzNCksIHJldHVybiBudWxsLgorICBWYWx1ZSAqaXNCeXRld2lzZVZhbHVlKFZhbHVlICpWKTsKKworICAvLy8gR2l2ZW4gYW4gYWdncmVncmF0ZSBhbmQgYW4gc2VxdWVuY2Ugb2YgaW5kaWNlcywgc2VlIGlmIHRoZSBzY2FsYXIgdmFsdWUKKyAgLy8vIGluZGV4ZWQgaXMgYWxyZWFkeSBhcm91bmQgYXMgYSByZWdpc3RlciwgZm9yIGV4YW1wbGUgaWYgaXQgd2VyZSBpbnNlcnRlZAorICAvLy8gZGlyZWN0bHkgaW50byB0aGUgYWdncmVncmF0ZS4KKyAgLy8vCisgIC8vLyBJZiBJbnNlcnRCZWZvcmUgaXMgbm90IG51bGwsIHRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgKG1vZGlmaWVkKQorICAvLy8gaW5zZXJ0dmFsdWVzIHdoZW4gYSBwYXJ0IG9mIGEgbmVzdGVkIHN0cnVjdCBpcyBleHRyYWN0ZWQuCisgIFZhbHVlICpGaW5kSW5zZXJ0ZWRWYWx1ZShWYWx1ZSAqViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBpZHhfcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisKKyAgLy8vIEFuYWx5emUgdGhlIHNwZWNpZmllZCBwb2ludGVyIHRvIHNlZSBpZiBpdCBjYW4gYmUgZXhwcmVzc2VkIGFzIGEgYmFzZQorICAvLy8gcG9pbnRlciBwbHVzIGEgY29uc3RhbnQgb2Zmc2V0LiBSZXR1cm4gdGhlIGJhc2UgYW5kIG9mZnNldCB0byB0aGUgY2FsbGVyLgorICBWYWx1ZSAqR2V0UG9pbnRlckJhc2VXaXRoQ29uc3RhbnRPZmZzZXQoVmFsdWUgKlB0ciwgaW50NjRfdCAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpOworICBpbmxpbmUgY29uc3QgVmFsdWUgKkdldFBvaW50ZXJCYXNlV2l0aENvbnN0YW50T2Zmc2V0KGNvbnN0IFZhbHVlICpQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMKSB7CisgICAgcmV0dXJuIEdldFBvaW50ZXJCYXNlV2l0aENvbnN0YW50T2Zmc2V0KGNvbnN0X2Nhc3Q8VmFsdWUgKj4oUHRyKSwgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBHRVAgaXMgYmFzZWQgb24gYSBwb2ludGVyIHRvIGEgc3RyaW5nIChhcnJheSBvZgorICAvLyBccCBDaGFyU2l6ZSBpbnRlZ2VycykgYW5kIGlzIGluZGV4aW5nIGludG8gdGhpcyBzdHJpbmcuCisgIGJvb2wgaXNHRVBCYXNlZE9uUG9pbnRlclRvU3RyaW5nKGNvbnN0IEdFUE9wZXJhdG9yICpHRVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENoYXJTaXplID0gOCk7CisKKyAgLy8vIFJlcHJlc2VudHMgb2Zmc2V0K2xlbmd0aCBpbnRvIGEgQ29uc3RhbnREYXRhQXJyYXkuCisgIHN0cnVjdCBDb25zdGFudERhdGFBcnJheVNsaWNlIHsKKyAgICAvLy8gQ29uc3RhbnREYXRhQXJyYXkgcG9pbnRlci4gbnVsbHB0ciBpbmRpY2F0ZXMgYSB6ZXJvaW5pdGlhbGl6ZXIgKGEgdmFsaWQKKyAgICAvLy8gaW5pdGlhbGl6ZXIsIGl0IGp1c3QgZG9lc24ndCBmaXQgdGhlIENvbnN0YW50RGF0YUFycmF5IGludGVyZmFjZSkuCisgICAgY29uc3QgQ29uc3RhbnREYXRhQXJyYXkgKkFycmF5OworCisgICAgLy8vIFNsaWNlIHN0YXJ0cyBhdCB0aGlzIE9mZnNldC4KKyAgICB1aW50NjRfdCBPZmZzZXQ7CisKKyAgICAvLy8gTGVuZ3RoIG9mIHRoZSBzbGljZS4KKyAgICB1aW50NjRfdCBMZW5ndGg7CisKKyAgICAvLy8gTW92ZXMgdGhlIE9mZnNldCBhbmQgYWRqdXN0cyBMZW5ndGggYWNjb3JkaW5nbHkuCisgICAgdm9pZCBtb3ZlKHVpbnQ2NF90IERlbHRhKSB7CisgICAgICBhc3NlcnQoRGVsdGEgPCBMZW5ndGgpOworICAgICAgT2Zmc2V0ICs9IERlbHRhOworICAgICAgTGVuZ3RoIC09IERlbHRhOworICAgIH0KKworICAgIC8vLyBDb252ZW5pZW5jZSBhY2Nlc3NvciBmb3IgZWxlbWVudHMgaW4gdGhlIHNsaWNlLgorICAgIHVpbnQ2NF90IG9wZXJhdG9yW10odW5zaWduZWQgSSkgY29uc3QgeworICAgICAgcmV0dXJuIEFycmF5PT1udWxscHRyID8gMCA6IEFycmF5LT5nZXRFbGVtZW50QXNJbnRlZ2VyKEkgKyBPZmZzZXQpOworICAgIH0KKyAgfTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBccCBWIGlzIGEgcG9pbnRlciBpbnRvIGEgQ29uc3RhbnREYXRhQXJyYXkuCisgIC8vLyBJZiBzdWNjZXNzZnVsIFxwIFNsaWNlIHdpbGwgcG9pbnQgdG8gYSBDb25zdGFudERhdGFBcnJheSBpbmZvIG9iamVjdAorICAvLy8gd2l0aCBhbiBhcHByb3ByaWF0ZSBvZmZzZXQuCisgIGJvb2wgZ2V0Q29uc3RhbnREYXRhQXJyYXlJbmZvKGNvbnN0IFZhbHVlICpWLCBDb25zdGFudERhdGFBcnJheVNsaWNlICZTbGljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRWxlbWVudFNpemUsIHVpbnQ2NF90IE9mZnNldCA9IDApOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBsZW5ndGggb2YgYSBudWxsLXRlcm1pbmF0ZWQgQyBzdHJpbmcgcG9pbnRlZCB0bworICAvLy8gYnkgVi4gSWYgc3VjY2Vzc2Z1bCwgaXQgcmV0dXJucyB0cnVlIGFuZCByZXR1cm5zIHRoZSBzdHJpbmcgaW4gU3RyLiBJZgorICAvLy8gdW5zdWNjZXNzZnVsLCBpdCByZXR1cm5zIGZhbHNlLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgdGhlIHRyYWlsaW5nIG51bGwKKyAgLy8vIGNoYXJhY3RlciBieSBkZWZhdWx0LiBJZiBUcmltQXROdWwgaXMgc2V0IHRvIGZhbHNlLCB0aGVuIHRoaXMgcmV0dXJucyBhbnkKKyAgLy8vIHRyYWlsaW5nIG51bGwgY2hhcmFjdGVycyBhcyB3ZWxsIGFzIGFueSBvdGhlciBjaGFyYWN0ZXJzIHRoYXQgY29tZSBhZnRlcgorICAvLy8gaXQuCisgIGJvb2wgZ2V0Q29uc3RhbnRTdHJpbmdJbmZvKGNvbnN0IFZhbHVlICpWLCBTdHJpbmdSZWYgJlN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0ID0gMCwgYm9vbCBUcmltQXROdWwgPSB0cnVlKTsKKworICAvLy8gSWYgd2UgY2FuIGNvbXB1dGUgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgdGhlIHNwZWNpZmllZAorICAvLy8gcG9pbnRlciwgcmV0dXJuICdsZW4rMScuICBJZiB3ZSBjYW4ndCwgcmV0dXJuIDAuCisgIHVpbnQ2NF90IEdldFN0cmluZ0xlbmd0aChjb25zdCBWYWx1ZSAqViwgdW5zaWduZWQgQ2hhclNpemUgPSA4KTsKKworICAvLy8gVGhpcyBtZXRob2Qgc3RyaXBzIG9mZiBhbnkgR0VQIGFkZHJlc3MgYWRqdXN0bWVudHMgYW5kIHBvaW50ZXIgY2FzdHMgZnJvbQorICAvLy8gdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuaW5nIHRoZSBvcmlnaW5hbCBvYmplY3QgYmVpbmcgYWRkcmVzc2VkLiBOb3RlCisgIC8vLyB0aGF0IHRoZSByZXR1cm5lZCB2YWx1ZSBoYXMgcG9pbnRlciB0eXBlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgZG9lcy4gSWYKKyAgLy8vIHRoZSBNYXhMb29rdXAgdmFsdWUgaXMgbm9uLXplcm8sIGl0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyB0bworICAvLy8gYmUgc3RyaXBwZWQgb2ZmLgorICBWYWx1ZSAqR2V0VW5kZXJseWluZ09iamVjdChWYWx1ZSAqViwgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heExvb2t1cCA9IDYpOworICBpbmxpbmUgY29uc3QgVmFsdWUgKkdldFVuZGVybHlpbmdPYmplY3QoY29uc3QgVmFsdWUgKlYsIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4TG9va3VwID0gNikgeworICAgIHJldHVybiBHZXRVbmRlcmx5aW5nT2JqZWN0KGNvbnN0X2Nhc3Q8VmFsdWUgKj4oViksIERMLCBNYXhMb29rdXApOworICB9CisKKyAgLy8vIFxicmllZiBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIEdldFVuZGVybHlpbmdPYmplY3QgZXhjZXB0IHRoYXQgaXQgY2FuCisgIC8vLyBsb29rIHRocm91Z2ggcGhpIGFuZCBzZWxlY3QgaW5zdHJ1Y3Rpb25zIGFuZCByZXR1cm4gbXVsdGlwbGUgb2JqZWN0cy4KKyAgLy8vCisgIC8vLyBJZiBMb29wSW5mbyBpcyBwYXNzZWQsIGxvb3AgcGhpcyBhcmUgZnVydGhlciBhbmFseXplZC4gIElmIGEgcG9pbnRlcgorICAvLy8gYWNjZXNzZXMgZGlmZmVyZW50IG9iamVjdHMgaW4gZWFjaCBpdGVyYXRpb24sIHdlIGRvbid0IGxvb2sgdGhyb3VnaCB0aGUKKyAgLy8vIHBoaSBub2RlLiBFLmcuIGNvbnNpZGVyIHRoaXMgbG9vcCBuZXN0OgorICAvLy8KKyAgLy8vICAgaW50ICoqQTsKKyAgLy8vICAgZm9yIChpKQorICAvLy8gICAgIGZvciAoaikgeworICAvLy8gICAgICAgIEFbaV1bal0gPSBBW2ktMV1bal0gKiBCW2pdCisgIC8vLyAgICAgfQorICAvLy8KKyAgLy8vIFRoaXMgaXMgdHJhbnNmb3JtZWQgYnkgTG9hZC1QUkUgdG8gc3Rhc2ggYXdheSBBW2ldIGZvciB0aGUgbmV4dCBpdGVyYXRpb24KKyAgLy8vIG9mIHRoZSBvdXRlciBsb29wOgorICAvLy8KKyAgLy8vICAgQ3VyciA9IEFbMF07ICAgICAgICAgIC8vIFByZXZfMAorICAvLy8gICBmb3IgKGk6IDEuLk4pIHsKKyAgLy8vICAgICBQcmV2ID0gQ3VycjsgICAgICAgIC8vIFByZXYgPSBQSEkgKFByZXZfMCwgQ3VycikKKyAgLy8vICAgICBDdXJyID0gQVtpXTsKKyAgLy8vICAgICBmb3IgKGo6IDAuLk4pIHsKKyAgLy8vICAgICAgICBDdXJyW2pdID0gUHJldltqXSAqIEJbal0KKyAgLy8vICAgICB9CisgIC8vLyAgIH0KKyAgLy8vCisgIC8vLyBTaW5jZSBBW2ldIGFuZCBBW2ktMV0gYXJlIGluZGVwZW5kZW50IHBvaW50ZXJzLCBnZXRVbmRlcmx5aW5nT2JqZWN0cworICAvLy8gc2hvdWxkIG5vdCBhc3N1bWUgdGhhdCBDdXJyIGFuZCBQcmV2IHNoYXJlIHRoZSBzYW1lIHVuZGVybHlpbmcgb2JqZWN0IHRodXMKKyAgLy8vIGl0IHNob3VsZG4ndCBsb29rIHRocm91Z2ggdGhlIHBoaSBhYm92ZS4KKyAgdm9pZCBHZXRVbmRlcmx5aW5nT2JqZWN0cyhWYWx1ZSAqViwgU21hbGxWZWN0b3JJbXBsPFZhbHVlICo+ICZPYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMLCBMb29wSW5mbyAqTEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heExvb2t1cCA9IDYpOworCisgIC8vLyBUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgR2V0VW5kZXJseWluZ09iamVjdHMgYW5kIGFkZHMgc3VwcG9ydCBmb3IgYmFzaWMKKyAgLy8vIHB0cnRvaW50K2FyaXRobWV0aWMraW50dG9wdHIgc2VxdWVuY2VzLgorICBib29sIGdldFVuZGVybHlpbmdPYmplY3RzRm9yQ29kZUdlbihjb25zdCBWYWx1ZSAqViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VmFsdWUgKj4gJk9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgb25seSB1c2VycyBvZiB0aGlzIHBvaW50ZXIgYXJlIGxpZmV0aW1lIG1hcmtlcnMuCisgIGJvb2wgb25seVVzZWRCeUxpZmV0aW1lTWFya2Vycyhjb25zdCBWYWx1ZSAqVik7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBlZmZlY3RzIGJlc2lkZXMKKyAgLy8vIGNhbGN1bGF0aW5nIHRoZSByZXN1bHQgYW5kIGRvZXMgbm90IGhhdmUgdW5kZWZpbmVkIGJlaGF2aW9yLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgdHJ1ZSBmb3IgYW4gaW5zdHJ1Y3Rpb24gdGhhdCByZXR1cm5zIHRydWUgZm9yCisgIC8vLyBtYXlIYXZlU2lkZUVmZmVjdHM7IGhvd2V2ZXIsIHRoaXMgbWV0aG9kIGFsc28gZG9lcyBzb21lIG90aGVyIGNoZWNrcyBpbgorICAvLy8gYWRkaXRpb24uIEl0IGNoZWNrcyBmb3IgdW5kZWZpbmVkIGJlaGF2aW9yLCBsaWtlIGRpdmlkaW5nIGJ5IHplcm8gb3IKKyAgLy8vIGxvYWRpbmcgZnJvbSBhbiBpbnZhbGlkIHBvaW50ZXIgKGJ1dCBub3QgZm9yIHVuZGVmaW5lZCByZXN1bHRzLCBsaWtlIGEKKyAgLy8vIHNoaWZ0IHdpdGggYSBzaGlmdCBhbW91bnQgbGFyZ2VyIHRoYW4gdGhlIHdpZHRoIG9mIHRoZSByZXN1bHQpLiBJdCBjaGVja3MKKyAgLy8vIGZvciBtYWxsb2MgYW5kIGFsbG9jYSBiZWNhdXNlIHNwZWN1bGF0aXZlbHkgZXhlY3V0aW5nIHRoZW0gbWlnaHQgY2F1c2UgYQorICAvLy8gbWVtb3J5IGxlYWsuIEl0IGFsc28gcmV0dXJucyBmYWxzZSBmb3IgaW5zdHJ1Y3Rpb25zIHJlbGF0ZWQgdG8gY29udHJvbAorICAvLy8gZmxvdywgc3BlY2lmaWNhbGx5IHRlcm1pbmF0b3JzIGFuZCBQSEkgbm9kZXMuCisgIC8vLworICAvLy8gSWYgdGhlIEN0eEkgaXMgc3BlY2lmaWVkIHRoaXMgbWV0aG9kIHBlcmZvcm1zIGNvbnRleHQtc2Vuc2l0aXZlIGFuYWx5c2lzCisgIC8vLyBhbmQgcmV0dXJucyB0cnVlIGlmIGl0IGlzIHNhZmUgdG8gZXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24gaW1tZWRpYXRlbHkKKyAgLy8vIGJlZm9yZSB0aGUgQ3R4SS4KKyAgLy8vCisgIC8vLyBJZiB0aGUgQ3R4SSBpcyBOT1Qgc3BlY2lmaWVkIHRoaXMgbWV0aG9kIG9ubHkgbG9va3MgYXQgdGhlIGluc3RydWN0aW9uCisgIC8vLyBpdHNlbGYgYW5kIGl0cyBvcGVyYW5kcywgc28gaWYgdGhpcyBtZXRob2QgcmV0dXJucyB0cnVlLCBpdCBpcyBzYWZlIHRvCisgIC8vLyBtb3ZlIHRoZSBpbnN0cnVjdGlvbiBhcyBsb25nIGFzIHRoZSBjb3JyZWN0IGRvbWluYW5jZSByZWxhdGlvbnNoaXBzIGZvcgorICAvLy8gdGhlIG9wZXJhbmRzIGFuZCB1c2VycyBob2xkLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gdHJ1ZSBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgcmVhZCBtZW1vcnk7CisgIC8vLyBmb3Igc3VjaCBpbnN0cnVjdGlvbnMsIG1vdmluZyB0aGVtIG1heSBjaGFuZ2UgdGhlIHJlc3VsdGluZyB2YWx1ZS4KKyAgYm9vbCBpc1NhZmVUb1NwZWN1bGF0aXZlbHlFeGVjdXRlKGNvbnN0IFZhbHVlICpWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkN0eEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSByZXN1bHQgb3IgZWZmZWN0cyBvZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb25zIFxwIEkKKyAgLy8vIGRlcGVuZCBvbiBvciBpbmZsdWVuY2UgZ2xvYmFsIG1lbW9yeS4KKyAgLy8vIE1lbW9yeSBkZXBlbmRlbmNlIGFyaXNlcyBmb3IgZXhhbXBsZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gcmVhZHMgZnJvbQorICAvLy8gbWVtb3J5IG9yIG1heSBwcm9kdWNlIGVmZmVjdHMgb3IgdW5kZWZpbmVkIGJlaGF2aW91ci4gTWVtb3J5IGRlcGVuZGVudAorICAvLy8gaW5zdHJ1Y3Rpb25zIGdlbmVyYWxseSBjYW5ub3QgYmUgcmVvcmRlcmQgd2l0aCByZXNwZWN0IHRvIG90aGVyIG1lbW9yeQorICAvLy8gZGVwZW5kZW50IGluc3RydWN0aW9ucyBvciBtb3ZlZCBpbnRvIG5vbi1kb21pbmF0ZWQgYmFzaWMgYmxvY2tzLgorICAvLy8gSW5zdHJ1Y3Rpb25zIHdoaWNoIGp1c3QgY29tcHV0ZSBhIHZhbHVlIGJhc2VkIG9uIHRoZSB2YWx1ZXMgb2YgdGhlaXIKKyAgLy8vIG9wZXJhbmRzIGFyZSBub3QgbWVtb3J5IGRlcGVuZGVudC4KKyAgYm9vbCBtYXlCZU1lbW9yeURlcGVuZGVudChjb25zdCBJbnN0cnVjdGlvbiAmSSk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGl0IGlzIGFuIGludHJpbnNpYyB0aGF0IGNhbm5vdCBiZSBzcGVjdWxhdGVkIGJ1dCBhbHNvCisgIC8vLyBjYW5ub3QgdHJhcC4KKyAgYm9vbCBpc0Fzc3VtZUxpa2VJbnRyaW5zaWMoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyB2YWxpZCB0byB1c2UgdGhlIGFzc3VtcHRpb25zIHByb3ZpZGVkIGJ5IGFuCisgIC8vLyBhc3N1bWUgaW50cmluc2ljLCBJLCBhdCB0aGUgcG9pbnQgaW4gdGhlIGNvbnRyb2wtZmxvdyBpZGVudGlmaWVkIGJ5IHRoZQorICAvLy8gY29udGV4dCBpbnN0cnVjdGlvbiwgQ3h0SS4KKyAgYm9vbCBpc1ZhbGlkQXNzdW1lRm9yQ29udGV4dChjb25zdCBJbnN0cnVjdGlvbiAqSSwgY29uc3QgSW5zdHJ1Y3Rpb24gKkN4dEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyKTsKKworICBlbnVtIGNsYXNzIE92ZXJmbG93UmVzdWx0IHsgQWx3YXlzT3ZlcmZsb3dzLCBNYXlPdmVyZmxvdywgTmV2ZXJPdmVyZmxvd3MgfTsKKworICBPdmVyZmxvd1Jlc3VsdCBjb21wdXRlT3ZlcmZsb3dGb3JVbnNpZ25lZE11bChjb25zdCBWYWx1ZSAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbkNhY2hlICpBQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkN4dEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUKTsKKyAgT3ZlcmZsb3dSZXN1bHQgY29tcHV0ZU92ZXJmbG93Rm9yVW5zaWduZWRBZGQoY29uc3QgVmFsdWUgKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc3VtcHRpb25DYWNoZSAqQUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpDeHRJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCk7CisgIE92ZXJmbG93UmVzdWx0IGNvbXB1dGVPdmVyZmxvd0ZvclNpZ25lZEFkZChjb25zdCBWYWx1ZSAqTEhTLCBjb25zdCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpDeHRJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cik7CisgIC8vLyBUaGlzIHZlcnNpb24gYWxzbyBsZXZlcmFnZXMgdGhlIHNpZ24gYml0IG9mIEFkZCBpZiBrbm93bi4KKyAgT3ZlcmZsb3dSZXN1bHQgY29tcHV0ZU92ZXJmbG93Rm9yU2lnbmVkQWRkKGNvbnN0IEFkZE9wZXJhdG9yICpBZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc3VtcHRpb25DYWNoZSAqQUMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBhcml0aG1ldGljIHBhcnQgb2YgdGhlIFxwIElJICdzIHJlc3VsdCBpcworICAvLy8gdXNlZCBvbmx5IGFsb25nIHRoZSBwYXRocyBjb250cm9sIGRlcGVuZGVudCBvbiB0aGUgY29tcHV0YXRpb24KKyAgLy8vIG5vdCBvdmVyZmxvd2luZywgXHAgSUkgYmVpbmcgYW4gPG9wPi53aXRoLm92ZXJmbG93IGludHJpbnNpYy4KKyAgYm9vbCBpc092ZXJmbG93SW50cmluc2ljTm9XcmFwKGNvbnN0IEludHJpbnNpY0luc3QgKklJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAmRFQpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGNhbiBwcm92ZSB0aGF0IHRoZSBpbnN0cnVjdGlvbiBJIHdpbGwKKyAgLy8vIGFsd2F5cyB0cmFuc2ZlciBleGVjdXRpb24gdG8gb25lIG9mIGl0cyBzdWNjZXNzb3JzIChpbmNsdWRpbmcgdGhlIG5leHQKKyAgLy8vIGluc3RydWN0aW9uIHRoYXQgZm9sbG93cyB3aXRoaW4gYSBiYXNpYyBibG9jaykuIEUuZy4gdGhpcyBpcyBub3QKKyAgLy8vIGd1YXJhbnRlZWQgZm9yIGZ1bmN0aW9uIGNhbGxzIHRoYXQgY291bGQgbG9vcCBpbmZpbml0ZWx5LgorICAvLy8KKyAgLy8vIEluIG90aGVyIHdvcmRzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UgZm9yIGluc3RydWN0aW9ucyB0aGF0IG1heQorICAvLy8gdHJhbnNmZXIgZXhlY3V0aW9uIG9yIGZhaWwgdG8gdHJhbnNmZXIgZXhlY3V0aW9uIGluIGEgd2F5IHRoYXQgaXMgbm90CisgIC8vLyBjYXB0dXJlZCBpbiB0aGUgQ0ZHIG5vciBpbiB0aGUgc2VxdWVuY2Ugb2YgaW5zdHJ1Y3Rpb25zIHdpdGhpbiBhIGJhc2ljCisgIC8vLyBibG9jay4KKyAgLy8vCisgIC8vLyBVbmRlZmluZWQgYmVoYXZpb3IgaXMgYXNzdW1lZCBub3QgdG8gaGFwcGVuLCBzbyBlLmcuIGRpdmlzaW9uIGlzCisgIC8vLyBndWFyYW50ZWVkIHRvIHRyYW5zZmVyIGV4ZWN1dGlvbiB0byB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uIGV2ZW4KKyAgLy8vIHRob3VnaCBkaXZpc2lvbiBieSB6ZXJvIG1pZ2h0IGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgYm9vbCBpc0d1YXJhbnRlZWRUb1RyYW5zZmVyRXhlY3V0aW9uVG9TdWNjZXNzb3IoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBibG9jayBkb2VzIG5vdCBjb250YWluIGEgcG90ZW50aWFsIGltcGxpY2l0IGV4aXQuCisgIC8vLyBUaGlzIGlzIGVxdWl2ZWxlbnQgdG8gc2F5aW5nIHRoYXQgYWxsIGluc3RydWN0aW9ucyB3aXRoaW4gdGhlIGJhc2ljIGJsb2NrCisgIC8vLyBhcmUgZ3VhcmFudGVlZCB0byB0cmFuc2ZlciBleGVjdXRpb24gdG8gdGhlaXIgc3VjY2Vzc29yIHdpdGhpbiB0aGUgYmFzaWMKKyAgLy8vIGJsb2NrLiBUaGlzIGhhcyB0aGUgc2FtZSBhc3N1bXB0aW9ucyB3LnIudC4gdW5kZWZpbmVkIGJlaGF2aW9yIGFzIHRoZQorICAvLy8gaW5zdHJ1Y3Rpb24gdmFyaWFudCBvZiB0aGlzIGZ1bmN0aW9uLiAKKyAgYm9vbCBpc0d1YXJhbnRlZWRUb1RyYW5zZmVyRXhlY3V0aW9uVG9TdWNjZXNzb3IoY29uc3QgQmFzaWNCbG9jayAqQkIpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGNhbiBwcm92ZSB0aGF0IHRoZSBpbnN0cnVjdGlvbiBJCisgIC8vLyBpcyBleGVjdXRlZCBmb3IgZXZlcnkgaXRlcmF0aW9uIG9mIHRoZSBsb29wIEwuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgY3VycmVudGx5IG9ubHkgY29uc2lkZXJzIHRoZSBsb29wIGhlYWRlci4KKyAgYm9vbCBpc0d1YXJhbnRlZWRUb0V4ZWN1dGVGb3JFdmVyeUl0ZXJhdGlvbihjb25zdCBJbnN0cnVjdGlvbiAqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBmdW5jdGlvbiBjYW4gcHJvdmUgdGhhdCBJIGlzIGd1YXJhbnRlZWQgdG8geWllbGQKKyAgLy8vIGZ1bGwtcG9pc29uIChhbGwgYml0cyBwb2lzb24pIGlmIGF0IGxlYXN0IG9uZSBvZiBpdHMgb3BlcmFuZHMgYXJlCisgIC8vLyBmdWxsLXBvaXNvbiAoYWxsIGJpdHMgcG9pc29uKS4KKyAgLy8vCisgIC8vLyBUaGUgZXhhY3QgcnVsZXMgZm9yIGhvdyBwb2lzb24gcHJvcGFnYXRlcyB0aHJvdWdoIGluc3RydWN0aW9ucyBoYXZlCisgIC8vLyBub3QgYmVlbiBzZXR0bGVkIGFzIG9mIDIwMTUtMDctMTAsIHNvIHRoaXMgZnVuY3Rpb24gaXMgY29uc2VydmF0aXZlCisgIC8vLyBhbmQgb25seSBjb25zaWRlcnMgcG9pc29uIHRvIGJlIHByb3BhZ2F0ZWQgaW4gdW5jb250cm92ZXJzaWFsCisgIC8vLyBjYXNlcy4gVGhlcmUgaXMgbm8gYXR0ZW1wdCB0byB0cmFjayB2YWx1ZXMgdGhhdCBtYXkgYmUgb25seSBwYXJ0aWFsbHkKKyAgLy8vIHBvaXNvbi4KKyAgYm9vbCBwcm9wYWdhdGVzRnVsbFBvaXNvbihjb25zdCBJbnN0cnVjdGlvbiAqSSk7CisKKyAgLy8vIFJldHVybiBlaXRoZXIgbnVsbHB0ciBvciBhbiBvcGVyYW5kIG9mIEkgc3VjaCB0aGF0IEkgd2lsbCB0cmlnZ2VyCisgIC8vLyB1bmRlZmluZWQgYmVoYXZpb3IgaWYgSSBpcyBleGVjdXRlZCBhbmQgdGhhdCBvcGVyYW5kIGhhcyBhIGZ1bGwtcG9pc29uCisgIC8vLyB2YWx1ZSAoYWxsIGJpdHMgcG9pc29uKS4KKyAgY29uc3QgVmFsdWUgKmdldEd1YXJhbnRlZWROb25GdWxsUG9pc29uT3AoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGNhbiBwcm92ZSB0aGF0IGlmIFBvaXNvbkkgaXMgZXhlY3V0ZWQKKyAgLy8vIGFuZCB5aWVsZHMgYSBmdWxsLXBvaXNvbiB2YWx1ZSAoYWxsIGJpdHMgcG9pc29uKSwgdGhlbiB0aGF0IHdpbGwKKyAgLy8vIHRyaWdnZXIgdW5kZWZpbmVkIGJlaGF2aW9yLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGN1cnJlbnRseSBvbmx5IGNvbnNpZGVycyB0aGUgYmFzaWMgYmxvY2sgdGhhdCBpcworICAvLy8gdGhlIHBhcmVudCBvZiBJLgorICBib29sIHByb2dyYW1VbmRlZmluZWRJZkZ1bGxQb2lzb24oY29uc3QgSW5zdHJ1Y3Rpb24gKlBvaXNvbkkpOworCisgIC8vLyBcYnJpZWYgU3BlY2lmaWMgcGF0dGVybnMgb2Ygc2VsZWN0IGluc3RydWN0aW9ucyB3ZSBjYW4gbWF0Y2guCisgIGVudW0gU2VsZWN0UGF0dGVybkZsYXZvciB7CisgICAgU1BGX1VOS05PV04gPSAwLAorICAgIFNQRl9TTUlOLCAgICAgICAgICAgICAgICAgICAvLy8gU2lnbmVkIG1pbmltdW0KKyAgICBTUEZfVU1JTiwgICAgICAgICAgICAgICAgICAgLy8vIFVuc2lnbmVkIG1pbmltdW0KKyAgICBTUEZfU01BWCwgICAgICAgICAgICAgICAgICAgLy8vIFNpZ25lZCBtYXhpbXVtCisgICAgU1BGX1VNQVgsICAgICAgICAgICAgICAgICAgIC8vLyBVbnNpZ25lZCBtYXhpbXVtCisgICAgU1BGX0ZNSU5OVU0sICAgICAgICAgICAgICAgIC8vLyBGbG9hdGluZyBwb2ludCBtaW5udW0KKyAgICBTUEZfRk1BWE5VTSwgICAgICAgICAgICAgICAgLy8vIEZsb2F0aW5nIHBvaW50IG1heG51bQorICAgIFNQRl9BQlMsICAgICAgICAgICAgICAgICAgICAvLy8gQWJzb2x1dGUgdmFsdWUKKyAgICBTUEZfTkFCUyAgICAgICAgICAgICAgICAgICAgLy8vIE5lZ2F0ZWQgYWJzb2x1dGUgdmFsdWUKKyAgfTsKKworICAvLy8gXGJyaWVmIEJlaGF2aW9yIHdoZW4gYSBmbG9hdGluZyBwb2ludCBtaW4vbWF4IGlzIGdpdmVuIG9uZSBOYU4gYW5kIG9uZQorICAvLy8gbm9uLU5hTiBhcyBpbnB1dC4KKyAgZW51bSBTZWxlY3RQYXR0ZXJuTmFOQmVoYXZpb3IgeworICAgIFNQTkJfTkEgPSAwLCAgICAgICAgICAgICAgICAvLy8gTmFOIGJlaGF2aW9yIG5vdCBhcHBsaWNhYmxlLgorICAgIFNQTkJfUkVUVVJOU19OQU4sICAgICAgICAgICAvLy8gR2l2ZW4gb25lIE5hTiBpbnB1dCwgcmV0dXJucyB0aGUgTmFOLgorICAgIFNQTkJfUkVUVVJOU19PVEhFUiwgICAgICAgICAvLy8gR2l2ZW4gb25lIE5hTiBpbnB1dCwgcmV0dXJucyB0aGUgbm9uLU5hTi4KKyAgICBTUE5CX1JFVFVSTlNfQU5ZICAgICAgICAgICAgLy8vIEdpdmVuIG9uZSBOYU4gaW5wdXQsIGNhbiByZXR1cm4gZWl0aGVyIChvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gaXQgaGFzIGJlZW4gZGV0ZXJtaW5lZCB0aGF0IG5vIG9wZXJhbmRzIGNhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gYmUgTmFOKS4KKyAgfTsKKworICBzdHJ1Y3QgU2VsZWN0UGF0dGVyblJlc3VsdCB7CisgICAgU2VsZWN0UGF0dGVybkZsYXZvciBGbGF2b3I7CisgICAgU2VsZWN0UGF0dGVybk5hTkJlaGF2aW9yIE5hTkJlaGF2aW9yOyAvLy8gT25seSBhcHBsaWNhYmxlIGlmIEZsYXZvciBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vIFNQRl9GTUlOTlVNIG9yIFNQRl9GTUFYTlVNLgorICAgIGJvb2wgT3JkZXJlZDsgICAgICAgICAgICAgICAvLy8gV2hlbiBpbXBsZW1lbnRpbmcgdGhpcyBtaW4vbWF4IHBhdHRlcm4gYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vIGZjbXA7IHNlbGVjdCwgZG9lcyB0aGUgZmNtcCBoYXZlIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBvcmRlcmVkPworCisgICAgLy8vIFJldHVybiB0cnVlIGlmIFxwIFNQRiBpcyBhIG1pbiBvciBhIG1heCBwYXR0ZXJuLgorICAgIHN0YXRpYyBib29sIGlzTWluT3JNYXgoU2VsZWN0UGF0dGVybkZsYXZvciBTUEYpIHsKKyAgICAgIHJldHVybiBTUEYgIT0gU1BGX1VOS05PV04gJiYgU1BGICE9IFNQRl9BQlMgJiYgU1BGICE9IFNQRl9OQUJTOworICAgIH0KKyAgfTsKKworICAvLy8gUGF0dGVybiBtYXRjaCBpbnRlZ2VyIFtTVV1NSU4sIFtTVV1NQVggYW5kIEFCUyBpZGlvbXMsIHJldHVybmluZyB0aGUga2luZAorICAvLy8gYW5kIHByb3ZpZGluZyB0aGUgb3V0IHBhcmFtZXRlciByZXN1bHRzIGlmIHdlIHN1Y2Nlc3NmdWxseSBtYXRjaC4KKyAgLy8vCisgIC8vLyBJZiBDYXN0T3AgaXMgbm90IG51bGxwdHIsIGFsc28gbWF0Y2ggTUlOL01BWCBpZGlvbXMgd2hlcmUgdGhlIHR5cGUgZG9lcworICAvLy8gbm90IG1hdGNoIHRoYXQgb2YgdGhlIG9yaWdpbmFsIHNlbGVjdC4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlIGNhc3QKKyAgLy8vIG9wZXJhdGlvbiAob25lIG9mIFRydW5jLFNFeHQsWmV4dCkgdGhhdCBtdXN0IGJlIGRvbmUgdG8gdHJhbnNmb3JtIHRoZQorICAvLy8gdHlwZSBvZiBMSFMgYW5kIFJIUyBpbnRvIHRoZSB0eXBlIG9mIFYgaXMgcmV0dXJuZWQgaW4gQ2FzdE9wLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlOgorICAvLy8gICAlMSA9IGljbXAgc2x0IGkzMiAlYSwgaTMyIDQKKyAgLy8vICAgJTIgPSBzZXh0IGkzMiAlYSB0byBpNjQKKyAgLy8vICAgJTMgPSBzZWxlY3QgaTEgJTEsIGk2NCAlMiwgaTY0IDQKKyAgLy8vCisgIC8vLyAtPiBMSFMgPSAlYSwgUkhTID0gaTMyIDQsICpDYXN0T3AgPSBJbnN0cnVjdGlvbjo6U0V4dAorICAvLy8KKyAgU2VsZWN0UGF0dGVyblJlc3VsdCBtYXRjaFNlbGVjdFBhdHRlcm4oVmFsdWUgKlYsIFZhbHVlIComTEhTLCBWYWx1ZSAqJlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgKkNhc3RPcCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCk7CisgIGlubGluZSBTZWxlY3RQYXR0ZXJuUmVzdWx0CisgIG1hdGNoU2VsZWN0UGF0dGVybihjb25zdCBWYWx1ZSAqViwgY29uc3QgVmFsdWUgKiZMSFMsIGNvbnN0IFZhbHVlIComUkhTLAorICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgKkNhc3RPcCA9IG51bGxwdHIpIHsKKyAgICBWYWx1ZSAqTCA9IGNvbnN0X2Nhc3Q8VmFsdWUqPihMSFMpOworICAgIFZhbHVlICpSID0gY29uc3RfY2FzdDxWYWx1ZSo+KFJIUyk7CisgICAgYXV0byBSZXN1bHQgPSBtYXRjaFNlbGVjdFBhdHRlcm4oY29uc3RfY2FzdDxWYWx1ZSo+KFYpLCBMLCBSKTsKKyAgICBMSFMgPSBMOworICAgIFJIUyA9IFI7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGNhbm9uaWNhbCBjb21wYXJpc29uIHByZWRpY2F0ZSBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gbWluaW11bS9tYXhpbXVtIGZsYXZvci4KKyAgQ21wSW5zdDo6UHJlZGljYXRlIGdldE1pbk1heFByZWQoU2VsZWN0UGF0dGVybkZsYXZvciBTUEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT3JkZXJlZCA9IGZhbHNlKTsKKworICAvLy8gUmV0dXJuIHRoZSBpbnZlcnNlIG1pbmltdW0vbWF4aW11bSBmbGF2b3Igb2YgdGhlIHNwZWNpZmllZCBmbGF2b3IuCisgIC8vLyBGb3IgZXhhbXBsZSwgc2lnbmVkIG1pbmltdW0gaXMgdGhlIGludmVyc2Ugb2Ygc2lnbmVkIG1heGltdW0uCisgIFNlbGVjdFBhdHRlcm5GbGF2b3IgZ2V0SW52ZXJzZU1pbk1heEZsYXZvcihTZWxlY3RQYXR0ZXJuRmxhdm9yIFNQRik7CisKKyAgLy8vIFJldHVybiB0aGUgY2Fub25pY2FsIGludmVyc2UgY29tcGFyaXNvbiBwcmVkaWNhdGUgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIG1pbmltdW0vbWF4aW11bSBmbGF2b3IuCisgIENtcEluc3Q6OlByZWRpY2F0ZSBnZXRJbnZlcnNlTWluTWF4UHJlZChTZWxlY3RQYXR0ZXJuRmxhdm9yIFNQRik7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIFJIUyBpcyBrbm93biB0byBiZSBpbXBsaWVkIHRydWUgYnkgTEhTLiAgUmV0dXJuIGZhbHNlIGlmCisgIC8vLyBSSFMgaXMga25vd24gdG8gYmUgaW1wbGllZCBmYWxzZSBieSBMSFMuICBPdGhlcndpc2UsIHJldHVybiBOb25lIGlmIG5vCisgIC8vLyBpbXBsaWNhdGlvbiBjYW4gYmUgbWFkZS4KKyAgLy8vIEEgJiBCIG11c3QgYmUgaTEgKGJvb2xlYW4pIHZhbHVlcyBvciBhIHZlY3RvciBvZiBzdWNoIHZhbHVlcy4gTm90ZSB0aGF0CisgIC8vLyB0aGUgdHJ1dGggdGFibGUgZm9yIGltcGxpY2F0aW9uIGlzIHRoZSBzYW1lIGFzIDw9dSBvbiBpMSB2YWx1ZXMgKGJ1dCBub3QKKyAgLy8vIDw9cyEpLiAgVGhlIHRydXRoIHRhYmxlIGZvciBib3RoIGlzOgorICAvLy8gICAgfCBUIHwgRiAoQikKKyAgLy8vICBUIHwgVCB8IEYKKyAgLy8vICBGIHwgVCB8IFQKKyAgLy8vIChBKQorICBPcHRpb25hbDxib29sPiBpc0ltcGxpZWRDb25kaXRpb24oY29uc3QgVmFsdWUgKkxIUywgY29uc3QgVmFsdWUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMLCBib29sIExIU0lzVHJ1ZSA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApOworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfVkFMVUVUUkFDS0lOR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1ZlY3RvclV0aWxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1ZlY3RvclV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMxNWU4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVmVjdG9yVXRpbHMuaApAQCAtMCwwICsxLDE4MSBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvVmVjdG9yVXRpbHMuaCAtIFZlY3RvciB1dGlsaXRpZXMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBzb21lIHZlY3Rvcml6ZXIgdXRpbGl0aWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19WRUNUT1JVVElMU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfVkVDVE9SVVRJTFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvTWFwVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9UYXJnZXRMaWJyYXJ5SW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvSVJCdWlsZGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEFycmF5UmVmOworY2xhc3MgRGVtYW5kZWRCaXRzOworY2xhc3MgR2V0RWxlbWVudFB0ckluc3Q7CitjbGFzcyBMb29wOworY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworY2xhc3MgVGFyZ2V0VHJhbnNmb3JtSW5mbzsKK2NsYXNzIFR5cGU7CitjbGFzcyBWYWx1ZTsKKworbmFtZXNwYWNlIEludHJpbnNpYyB7CitlbnVtIElEIDogdW5zaWduZWQ7Cit9CisKKy8vLyBcYnJpZWYgSWRlbnRpZnkgaWYgdGhlIGludHJpbnNpYyBpcyB0cml2aWFsbHkgdmVjdG9yaXphYmxlLgorLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgaW50cmluc2ljJ3MgYXJndW1lbnQgdHlwZXMgYXJlIGFsbAorLy8vIHNjYWxhcnMgZm9yIHRoZSBzY2FsYXIgZm9ybSBvZiB0aGUgaW50cmluc2ljIGFuZCBhbGwgdmVjdG9ycyBmb3IKKy8vLyB0aGUgdmVjdG9yIGZvcm0gb2YgdGhlIGludHJpbnNpYy4KK2Jvb2wgaXNUcml2aWFsbHlWZWN0b3JpemFibGUoSW50cmluc2ljOjpJRCBJRCk7CisKKy8vLyBcYnJpZWYgSWRlbnRpZmllcyBpZiB0aGUgaW50cmluc2ljIGhhcyBhIHNjYWxhciBvcGVyYW5kLiBJdCBjaGVja3MgZm9yCisvLy8gY3RseixjdHR6IGFuZCBwb3dpIHNwZWNpYWwgaW50cmluc2ljcyB3aG9zZSBhcmd1bWVudCBpcyBzY2FsYXIuCitib29sIGhhc1ZlY3Rvckluc3RyaW5zaWNTY2FsYXJPcGQoSW50cmluc2ljOjpJRCBJRCwgdW5zaWduZWQgU2NhbGFyT3BkSWR4KTsKKworLy8vIFxicmllZiBSZXR1cm5zIGludHJpbnNpYyBJRCBmb3IgY2FsbC4KKy8vLyBGb3IgdGhlIGlucHV0IGNhbGwgaW5zdHJ1Y3Rpb24gaXQgZmluZHMgbWFwcGluZyBpbnRyaW5zaWMgYW5kIHJldHVybnMKKy8vLyBpdHMgaW50cmluc2ljIElELCBpbiBjYXNlIGl0IGRvZXMgbm90IGZvdW5kIGl0IHJldHVybiBub3RfaW50cmluc2ljLgorSW50cmluc2ljOjpJRCBnZXRWZWN0b3JJbnRyaW5zaWNJREZvckNhbGwoY29uc3QgQ2FsbEluc3QgKkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSk7CisKKy8vLyBcYnJpZWYgRmluZCB0aGUgb3BlcmFuZCBvZiB0aGUgR0VQIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGNvbnNlY3V0aXZlCisvLy8gc3RvcmVzLiBUaGlzIGlnbm9yZXMgdHJhaWxpbmcgaW5kaWNlcyB0aGF0IGhhdmUgbm8gZWZmZWN0IG9uIHRoZSBmaW5hbAorLy8vIHBvaW50ZXIuCit1bnNpZ25lZCBnZXRHRVBJbmR1Y3Rpb25PcGVyYW5kKGNvbnN0IEdldEVsZW1lbnRQdHJJbnN0ICpHZXApOworCisvLy8gXGJyaWVmIElmIHRoZSBhcmd1bWVudCBpcyBhIEdFUCwgdGhlbiByZXR1cm5zIHRoZSBvcGVyYW5kIGlkZW50aWZpZWQgYnkKKy8vLyBnZXRHRVBJbmR1Y3Rpb25PcGVyYW5kLiBIb3dldmVyLCBpZiB0aGVyZSBpcyBzb21lIG90aGVyIG5vbi1sb29wLWludmFyaWFudAorLy8vIG9wZXJhbmQsIGl0IHJldHVybnMgdGhhdCBpbnN0ZWFkLgorVmFsdWUgKnN0cmlwR2V0RWxlbWVudFB0cihWYWx1ZSAqUHRyLCBTY2FsYXJFdm9sdXRpb24gKlNFLCBMb29wICpMcCk7CisKKy8vLyBcYnJpZWYgSWYgYSB2YWx1ZSBoYXMgb25seSBvbmUgdXNlciB0aGF0IGlzIGEgQ2FzdEluc3QsIHJldHVybiBpdC4KK1ZhbHVlICpnZXRVbmlxdWVDYXN0VXNlKFZhbHVlICpQdHIsIExvb3AgKkxwLCBUeXBlICpUeSk7CisKKy8vLyBcYnJpZWYgR2V0IHRoZSBzdHJpZGUgb2YgYSBwb2ludGVyIGFjY2VzcyBpbiBhIGxvb3AuIExvb2tzIGZvciBzeW1ib2xpYworLy8vIHN0cmlkZXMgImFbaSpzdHJpZGVdIi4gUmV0dXJucyB0aGUgc3ltYm9saWMgc3RyaWRlLCBvciBudWxsIG90aGVyd2lzZS4KK1ZhbHVlICpnZXRTdHJpZGVGcm9tUG9pbnRlcihWYWx1ZSAqUHRyLCBTY2FsYXJFdm9sdXRpb24gKlNFLCBMb29wICpMcCk7CisKKy8vLyBcYnJpZWYgR2l2ZW4gYSB2ZWN0b3IgYW5kIGFuIGVsZW1lbnQgbnVtYmVyLCBzZWUgaWYgdGhlIHNjYWxhciB2YWx1ZSBpcworLy8vIGFscmVhZHkgYXJvdW5kIGFzIGEgcmVnaXN0ZXIsIGZvciBleGFtcGxlIGlmIGl0IHdlcmUgaW5zZXJ0ZWQgdGhlbiBleHRyYWN0ZWQKKy8vLyBmcm9tIHRoZSB2ZWN0b3IuCitWYWx1ZSAqZmluZFNjYWxhckVsZW1lbnQoVmFsdWUgKlYsIHVuc2lnbmVkIEVsdE5vKTsKKworLy8vIFxicmllZiBHZXQgc3BsYXQgdmFsdWUgaWYgdGhlIGlucHV0IGlzIGEgc3BsYXQgdmVjdG9yIG9yIHJldHVybiBudWxscHRyLgorLy8vIFRoZSB2YWx1ZSBtYXkgYmUgZXh0cmFjdGVkIGZyb20gYSBzcGxhdCBjb25zdGFudHMgdmVjdG9yIG9yIGZyb20KKy8vLyBhIHNlcXVlbmNlIG9mIGluc3RydWN0aW9ucyB0aGF0IGJyb2FkY2FzdCBhIHNpbmdsZSB2YWx1ZSBpbnRvIGEgdmVjdG9yLgorY29uc3QgVmFsdWUgKmdldFNwbGF0VmFsdWUoY29uc3QgVmFsdWUgKlYpOworCisvLy8gXGJyaWVmIENvbXB1dGUgYSBtYXAgb2YgaW50ZWdlciBpbnN0cnVjdGlvbnMgdG8gdGhlaXIgbWluaW11bSBsZWdhbCB0eXBlCisvLy8gc2l6ZS4KKy8vLworLy8vIEMgc2VtYW50aWNzIGZvcmNlIHN1Yi1pbnQtc2l6ZWQgdmFsdWVzIChlLmcuIGk4LCBpMTYpIHRvIGJlIHByb21vdGVkIHRvIGludAorLy8vIHR5cGUgKGUuZy4gaTMyKSB3aGVuZXZlciBhcml0aG1ldGljIGlzIHBlcmZvcm1lZCBvbiB0aGVtLgorLy8vCisvLy8gRm9yIHRhcmdldHMgd2l0aCBuYXRpdmUgaTggb3IgaTE2IG9wZXJhdGlvbnMsIHVzdWFsbHkgSW5zdENvbWJpbmUgY2FuIHNocmluaworLy8vIHRoZSBhcml0aG1ldGljIHR5cGUgZG93biBhZ2Fpbi4gSG93ZXZlciBJbnN0Q29tYmluZSByZWZ1c2VzIHRvIGNyZWF0ZQorLy8vIGlsbGVnYWwgdHlwZXMsIHNvIGZvciB0YXJnZXRzIHdpdGhvdXQgaTggb3IgaTE2IHJlZ2lzdGVycywgdGhlIGxlbmd0aGVuaW5nCisvLy8gYW5kIHNocmlua2luZyByZW1haW5zLgorLy8vCisvLy8gTW9zdCBTSU1EIElTQXMgKGUuZy4gTkVPTikgaG93ZXZlciBzdXBwb3J0IHZlY3RvcnMgb2YgaTggb3IgaTE2IGV2ZW4gd2hlbgorLy8vIHRoZWlyIHNjYWxhciBlcXVpdmFsZW50cyBkbyBub3QsIHNvIGR1cmluZyB2ZWN0b3JpemF0aW9uIGl0IGlzIGltcG9ydGFudCB0bworLy8vIHJlbW92ZSB0aGVzZSBsZW5ndGhlbnMgYW5kIHRydW5jYXRlcyB3aGVuIGRlY2lkaW5nIHRoZSBwcm9maXRhYmlsaXR5IG9mCisvLy8gdmVjdG9yaXphdGlvbi4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gYW5hbHl6ZXMgdGhlIGdpdmVuIHJhbmdlIG9mIGluc3RydWN0aW9ucyBhbmQgZGV0ZXJtaW5lcyB0aGUKKy8vLyBtaW5pbXVtIHR5cGUgc2l6ZSBlYWNoIGNhbiBiZSBjb252ZXJ0ZWQgdG8uIEl0IGF0dGVtcHRzIHRvIHJlbW92ZSBvcgorLy8vIG1pbmltaXplIHR5cGUgc2l6ZSBjaGFuZ2VzIGFjcm9zcyBlYWNoIGRlZi11c2UgY2hhaW4sIHNvIGZvciBleGFtcGxlIGluIHRoZQorLy8vIGZvbGxvd2luZyBjb2RlOgorLy8vCisvLy8gICAlMSA9IGxvYWQgaTgsIGk4KgorLy8vICAgJTIgPSBhZGQgaTggJTEsIDIKKy8vLyAgICUzID0gbG9hZCBpMTYsIGkxNioKKy8vLyAgICU0ID0gemV4dCBpOCAlMiB0byBpMzIKKy8vLyAgICU1ID0gemV4dCBpMTYgJTMgdG8gaTMyCisvLy8gICAlNiA9IGFkZCBpMzIgJTQsICU1CisvLy8gICAlNyA9IHRydW5jIGkzMiAlNiB0byBpMTYKKy8vLworLy8vIEluc3RydWN0aW9uICU2IG11c3QgYmUgZG9uZSBhdCBsZWFzdCBpbiBpMTYsIHNvIGNvbXB1dGVNaW5pbXVtVmFsdWVTaXplcworLy8vIHdpbGwgcmV0dXJuOiB7JTE6IDE2LCAlMjogMTYsICUzOiAxNiwgJTQ6IDE2LCAlNTogMTYsICU2OiAxNiwgJTc6IDE2fS4KKy8vLworLy8vIElmIHRoZSBvcHRpb25hbCBUYXJnZXRUcmFuc2Zvcm1JbmZvIGlzIHByb3ZpZGVkLCB0aGlzIGZ1bmN0aW9uIHRyaWVzIGhhcmRlcgorLy8vIHRvIGRvIGxlc3Mgd29yayBieSBvbmx5IGxvb2tpbmcgYXQgaWxsZWdhbCB0eXBlcy4KK01hcFZlY3RvcjxJbnN0cnVjdGlvbiosIHVpbnQ2NF90PgorY29tcHV0ZU1pbmltdW1WYWx1ZVNpemVzKEFycmF5UmVmPEJhc2ljQmxvY2sqPiBCbG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVtYW5kZWRCaXRzICZEQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRUcmFuc2Zvcm1JbmZvICpUVEk9bnVsbHB0cik7CisKKy8vLyBTcGVjaWZpY2FsbHksIGxldCBLaW5kcyA9IFtNRF90YmFhLCBNRF9hbGlhc19zY29wZSwgTURfbm9hbGlhcywgTURfZnBtYXRoLAorLy8vIE1EX25vbnRlbXBvcmFsXS4gIEZvciBLIGluIEtpbmRzLCB3ZSBnZXQgdGhlIE1ETm9kZSBmb3IgSyBmcm9tIGVhY2ggb2YgdGhlCisvLy8gZWxlbWVudHMgb2YgVkwsIGNvbXB1dGUgdGhlaXIgImludGVyc2VjdGlvbiIgKGkuZS4sIHRoZSBtb3N0IGdlbmVyaWMKKy8vLyBtZXRhZGF0YSB2YWx1ZSB0aGF0IGNvdmVycyBhbGwgb2YgdGhlIGluZGl2aWR1YWwgdmFsdWVzKSwgYW5kIHNldCBJJ3MKKy8vLyBtZXRhZGF0YSBmb3IgTSBlcXVhbCB0byB0aGUgaW50ZXJzZWN0aW9uIHZhbHVlLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiBhbHdheXMgc2V0cyBhIChwb3NzaWJseSBudWxsKSB2YWx1ZSBmb3IgZWFjaCBLIGluIEtpbmRzLgorSW5zdHJ1Y3Rpb24gKnByb3BhZ2F0ZU1ldGFkYXRhKEluc3RydWN0aW9uICpJLCBBcnJheVJlZjxWYWx1ZSAqPiBWTCk7CisKKy8vLyBcYnJpZWYgQ3JlYXRlIGFuIGludGVybGVhdmUgc2h1ZmZsZSBtYXNrLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgc2h1ZmZsZSBtYXNrIGZvciBpbnRlcmxlYXZpbmcgXHAgTnVtVmVjcyB2ZWN0b3JzIG9mCisvLy8gdmVjdG9yaXphdGlvbiBmYWN0b3IgXHAgVkYgaW50byBhIHNpbmdsZSB3aWRlIHZlY3Rvci4gVGhlIG1hc2sgaXMgb2YgdGhlCisvLy8gZm9ybToKKy8vLworLy8vICAgPDAsIFZGLCBWRiAqIDIsIC4uLiwgVkYgKiAoTnVtVmVjcyAtIDEpLCAxLCBWRiArIDEsIFZGICogMiArIDEsIC4uLj4KKy8vLworLy8vIEZvciBleGFtcGxlLCB0aGUgbWFzayBmb3IgVkYgPSA0IGFuZCBOdW1WZWNzID0gMiBpczoKKy8vLworLy8vICAgPDAsIDQsIDEsIDUsIDIsIDYsIDMsIDc+LgorQ29uc3RhbnQgKmNyZWF0ZUludGVybGVhdmVNYXNrKElSQnVpbGRlcjw+ICZCdWlsZGVyLCB1bnNpZ25lZCBWRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1WZWNzKTsKKworLy8vIFxicmllZiBDcmVhdGUgYSBzdHJpZGUgc2h1ZmZsZSBtYXNrLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgc2h1ZmZsZSBtYXNrIHdob3NlIGVsZW1lbnRzIGJlZ2luIGF0IFxwIFN0YXJ0IGFuZAorLy8vIGFyZSBpbmNyZW1lbnRlZCBieSBccCBTdHJpZGUuIFRoZSBtYXNrIGNhbiBiZSB1c2VkIHRvIGRlaW50ZXJsZWF2ZSBhbgorLy8vIGludGVybGVhdmVkIHZlY3RvciBpbnRvIHNlcGFyYXRlIHZlY3RvcnMgb2YgdmVjdG9yaXphdGlvbiBmYWN0b3IgXHAgVkYuIFRoZQorLy8vIG1hc2sgaXMgb2YgdGhlIGZvcm06CisvLy8KKy8vLyAgIDxTdGFydCwgU3RhcnQgKyBTdHJpZGUsIC4uLiwgU3RhcnQgKyBTdHJpZGUgKiAoVkYgLSAxKT4KKy8vLworLy8vIEZvciBleGFtcGxlLCB0aGUgbWFzayBmb3IgU3RhcnQgPSAwLCBTdHJpZGUgPSAyLCBhbmQgVkYgPSA0IGlzOgorLy8vCisvLy8gICA8MCwgMiwgNCwgNj4KK0NvbnN0YW50ICpjcmVhdGVTdHJpZGVNYXNrKElSQnVpbGRlcjw+ICZCdWlsZGVyLCB1bnNpZ25lZCBTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFN0cmlkZSwgdW5zaWduZWQgVkYpOworCisvLy8gXGJyaWVmIENyZWF0ZSBhIHNlcXVlbnRpYWwgc2h1ZmZsZSBtYXNrLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHNodWZmbGUgbWFzayB3aG9zZSBlbGVtZW50cyBhcmUgc2VxdWVudGlhbCBhbmQgYmVnaW4KKy8vLyBhdCBccCBTdGFydC4gIFRoZSBtYXNrIGNvbnRhaW5zIFxwIE51bUludHMgaW50ZWdlcnMgYW5kIGlzIHBhZGRlZCB3aXRoIFxwCisvLy8gTnVtVW5kZWZzIHVuZGVmIHZhbHVlcy4gVGhlIG1hc2sgaXMgb2YgdGhlIGZvcm06CisvLy8KKy8vLyAgIDxTdGFydCwgU3RhcnQgKyAxLCAuLi4gU3RhcnQgKyBOdW1JbnRzIC0gMSwgdW5kZWZfMSwgLi4uIHVuZGVmX051bVVuZGVmcz4KKy8vLworLy8vIEZvciBleGFtcGxlLCB0aGUgbWFzayBmb3IgU3RhcnQgPSAwLCBOdW1JbnN0cyA9IDQsIGFuZCBOdW1VbmRlZnMgPSA0IGlzOgorLy8vCisvLy8gICA8MCwgMSwgMiwgMywgdW5kZWYsIHVuZGVmLCB1bmRlZiwgdW5kZWY+CitDb25zdGFudCAqY3JlYXRlU2VxdWVudGlhbE1hc2soSVJCdWlsZGVyPD4gJkJ1aWxkZXIsIHVuc2lnbmVkIFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUludHMsIHVuc2lnbmVkIE51bVVuZGVmcyk7CisKKy8vLyBcYnJpZWYgQ29uY2F0ZW5hdGUgYSBsaXN0IG9mIHZlY3RvcnMuCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBjb2RlIHRoYXQgY29uY2F0ZW5hdGUgdGhlIHZlY3RvcnMgaW4gXHAgVmVjcyBpbnRvIGEKKy8vLyBzaW5nbGUgbGFyZ2UgdmVjdG9yLiBUaGUgbnVtYmVyIG9mIHZlY3RvcnMgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvbmUsIGFuZAorLy8vIHRoZWlyIGVsZW1lbnQgdHlwZXMgc2hvdWxkIGJlIHRoZSBzYW1lLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQorLy8vIHZlY3RvcnMgc2hvdWxkIGFsc28gYmUgdGhlIHNhbWU7IGhvd2V2ZXIsIGlmIHRoZSBsYXN0IHZlY3RvciBoYXMgZmV3ZXIKKy8vLyBlbGVtZW50cywgaXQgd2lsbCBiZSBwYWRkZWQgd2l0aCB1bmRlZnMuCitWYWx1ZSAqY29uY2F0ZW5hdGVWZWN0b3JzKElSQnVpbGRlcjw+ICZCdWlsZGVyLCBBcnJheVJlZjxWYWx1ZSAqPiBWZWNzKTsKKworfSAvLyBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQXNtUGFyc2VyL1BhcnNlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Bc21QYXJzZXIvUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyMjEwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQXNtUGFyc2VyL1BhcnNlci5oCkBAIC0wLDAgKzEsMTM3IEBACisvLz09PS0tIFBhcnNlci5oIC0gUGFyc2VyIGZvciBMTFZNIElSIHRleHQgYXNzZW1ibHkgZmlsZXMgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGVzZSBjbGFzc2VzIGFyZSBpbXBsZW1lbnRlZCBieSB0aGUgbGliL0FzbVBhcnNlciBsaWJyYXJ5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BU01QQVJTRVJfUEFSU0VSX0gKKyNkZWZpbmUgTExWTV9BU01QQVJTRVJfUEFSU0VSX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBDb25zdGFudDsKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgTW9kdWxlOworc3RydWN0IFNsb3RNYXBwaW5nOworY2xhc3MgU01EaWFnbm9zdGljOworY2xhc3MgVHlwZTsKKworLy8vIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG1haW4gaW50ZXJmYWNlIHRvIHRoZSBMTFZNIEFzc2VtYmx5IFBhcnNlci4gSXQgcGFyc2VzCisvLy8gYW4gQVNDSUkgZmlsZSB0aGF0IChwcmVzdW1hYmx5KSBjb250YWlucyBMTFZNIEFzc2VtYmx5IGNvZGUuIEl0IHJldHVybnMgYQorLy8vIE1vZHVsZSAoaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uKSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGZlYXR1cmVzLiBOb3RlCisvLy8gdGhhdCB0aGlzIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZSBnZW5lcmF0ZWQgTW9kdWxlIGlzIHZhbGlkLCBzbyB5b3Ugc2hvdWxkCisvLy8gcnVuIHRoZSB2ZXJpZmllciBhZnRlciBwYXJzaW5nIHRoZSBmaWxlIHRvIGNoZWNrIHRoYXQgaXQgaXMgb2theS4KKy8vLyBcYnJpZWYgUGFyc2UgTExWTSBBc3NlbWJseSBmcm9tIGEgZmlsZQorLy8vIFxwYXJhbSBGaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBwYXJzZQorLy8vIFxwYXJhbSBFcnJvciBFcnJvciByZXN1bHQgaW5mby4KKy8vLyBccGFyYW0gQ29udGV4dCBDb250ZXh0IGluIHdoaWNoIHRvIGFsbG9jYXRlIGdsb2JhbHMgaW5mby4KKy8vLyBccGFyYW0gU2xvdHMgVGhlIG9wdGlvbmFsIHNsb3QgbWFwcGluZyB0aGF0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgZHVyaW5nCisvLy8gICAgICAgICAgICAgIHBhcnNpbmcuCisvLy8gXHBhcmFtIFVwZ3JhZGVEZWJ1Z0luZm8gUnVuIFVwZ3JhZGVEZWJ1Z0luZm8sIHdoaWNoIHJ1bnMgdGhlIFZlcmlmaWVyLgorLy8vICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIHNob3VsZCBvbmx5IGJlIHNldCB0byBmYWxzZSBieSBsbHZtLWFzCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHVzZSBpbnNpZGUgdGhlIExMVk0gdGVzdHVpdGUhCisvLy8gXHBhcmFtIERhdGFMYXlvdXRTdHJpbmcgT3ZlcnJpZGUgZGF0YWxheW91dCBpbiB0aGUgbGx2bSBhc3NlbWJseS4KK3N0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+CitwYXJzZUFzc2VtYmx5RmlsZShTdHJpbmdSZWYgRmlsZW5hbWUsIFNNRGlhZ25vc3RpYyAmRXJyb3IsIExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgU2xvdE1hcHBpbmcgKlNsb3RzID0gbnVsbHB0ciwgYm9vbCBVcGdyYWRlRGVidWdJbmZvID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEYXRhTGF5b3V0U3RyaW5nID0gIiIpOworCisvLy8gVGhlIGZ1bmN0aW9uIGlzIGEgc2Vjb25kYXJ5IGludGVyZmFjZSB0byB0aGUgTExWTSBBc3NlbWJseSBQYXJzZXIuIEl0IHBhcnNlcworLy8vIGFuIEFTQ0lJIHN0cmluZyB0aGF0IChwcmVzdW1hYmx5KSBjb250YWlucyBMTFZNIEFzc2VtYmx5IGNvZGUuIEl0IHJldHVybnMgYQorLy8vIE1vZHVsZSAoaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uKSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGZlYXR1cmVzLiBOb3RlCisvLy8gdGhhdCB0aGlzIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZSBnZW5lcmF0ZWQgTW9kdWxlIGlzIHZhbGlkLCBzbyB5b3Ugc2hvdWxkCisvLy8gcnVuIHRoZSB2ZXJpZmllciBhZnRlciBwYXJzaW5nIHRoZSBmaWxlIHRvIGNoZWNrIHRoYXQgaXQgaXMgb2theS4KKy8vLyBcYnJpZWYgUGFyc2UgTExWTSBBc3NlbWJseSBmcm9tIGEgc3RyaW5nCisvLy8gXHBhcmFtIEFzbVN0cmluZyBUaGUgc3RyaW5nIGNvbnRhaW5pbmcgYXNzZW1ibHkKKy8vLyBccGFyYW0gRXJyb3IgRXJyb3IgcmVzdWx0IGluZm8uCisvLy8gXHBhcmFtIENvbnRleHQgQ29udGV4dCBpbiB3aGljaCB0byBhbGxvY2F0ZSBnbG9iYWxzIGluZm8uCisvLy8gXHBhcmFtIFNsb3RzIFRoZSBvcHRpb25hbCBzbG90IG1hcHBpbmcgdGhhdCB3aWxsIGJlIGluaXRpYWxpemVkIGR1cmluZworLy8vICAgICAgICAgICAgICBwYXJzaW5nLgorLy8vIFxwYXJhbSBVcGdyYWRlRGVidWdJbmZvIFJ1biBVcGdyYWRlRGVidWdJbmZvLCB3aGljaCBydW5zIHRoZSBWZXJpZmllci4KKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSBzZXQgdG8gZmFsc2UgYnkgbGx2bS1hcworLy8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB1c2UgaW5zaWRlIHRoZSBMTFZNIHRlc3R1aXRlIQorLy8vIFxwYXJhbSBEYXRhTGF5b3V0U3RyaW5nIE92ZXJyaWRlIGRhdGFsYXlvdXQgaW4gdGhlIGxsdm0gYXNzZW1ibHkuCitzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBwYXJzZUFzc2VtYmx5U3RyaW5nKFN0cmluZ1JlZiBBc21TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNRGlhZ25vc3RpYyAmRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90TWFwcGluZyAqU2xvdHMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVwZ3JhZGVEZWJ1Z0luZm8gPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGF0YUxheW91dFN0cmluZyA9ICIiKTsKKworLy8vIHBhcnNlQXNzZW1ibHlGaWxlIGFuZCBwYXJzZUFzc2VtYmx5U3RyaW5nIGFyZSB3cmFwcGVycyBhcm91bmQgdGhpcyBmdW5jdGlvbi4KKy8vLyBcYnJpZWYgUGFyc2UgTExWTSBBc3NlbWJseSBmcm9tIGEgTWVtb3J5QnVmZmVyLgorLy8vIFxwYXJhbSBGIFRoZSBNZW1vcnlCdWZmZXIgY29udGFpbmluZyBhc3NlbWJseQorLy8vIFxwYXJhbSBFcnIgRXJyb3IgcmVzdWx0IGluZm8uCisvLy8gXHBhcmFtIFNsb3RzIFRoZSBvcHRpb25hbCBzbG90IG1hcHBpbmcgdGhhdCB3aWxsIGJlIGluaXRpYWxpemVkIGR1cmluZworLy8vICAgICAgICAgICAgICBwYXJzaW5nLgorLy8vIFxwYXJhbSBVcGdyYWRlRGVidWdJbmZvIFJ1biBVcGdyYWRlRGVidWdJbmZvLCB3aGljaCBydW5zIHRoZSBWZXJpZmllci4KKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSBzZXQgdG8gZmFsc2UgYnkgbGx2bS1hcworLy8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB1c2UgaW5zaWRlIHRoZSBMTFZNIHRlc3R1aXRlIQorLy8vIFxwYXJhbSBEYXRhTGF5b3V0U3RyaW5nIE92ZXJyaWRlIGRhdGFsYXlvdXQgaW4gdGhlIGxsdm0gYXNzZW1ibHkuCitzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBwYXJzZUFzc2VtYmx5KE1lbW9yeUJ1ZmZlclJlZiBGLCBTTURpYWdub3N0aWMgJkVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb3RNYXBwaW5nICpTbG90cyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVXBncmFkZURlYnVnSW5mbyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEYXRhTGF5b3V0U3RyaW5nID0gIiIpOworCisvLy8gVGhpcyBmdW5jdGlvbiBpcyB0aGUgbG93LWxldmVsIGludGVyZmFjZSB0byB0aGUgTExWTSBBc3NlbWJseSBQYXJzZXIuCisvLy8gVGhpcyBpcyBrZXB0IGFzIGFuIGluZGVwZW5kZW50IGZ1bmN0aW9uIGluc3RlYWQgb2YgYmVpbmcgaW5saW5lZCBpbnRvCisvLy8gcGFyc2VBc3NlbWJseSBmb3IgdGhlIGNvbnZlbmllbmNlIG9mIGludGVyYWN0aXZlIHVzZXJzIHRoYXQgd2FudCB0byBhZGQKKy8vLyByZWNlbnRseSBwYXJzZWQgYml0cyB0byBhbiBleGlzdGluZyBtb2R1bGUuCisvLy8KKy8vLyBccGFyYW0gRiBUaGUgTWVtb3J5QnVmZmVyIGNvbnRhaW5pbmcgYXNzZW1ibHkKKy8vLyBccGFyYW0gTSBUaGUgbW9kdWxlIHRvIGFkZCBkYXRhIHRvLgorLy8vIFxwYXJhbSBFcnIgRXJyb3IgcmVzdWx0IGluZm8uCisvLy8gXHBhcmFtIFNsb3RzIFRoZSBvcHRpb25hbCBzbG90IG1hcHBpbmcgdGhhdCB3aWxsIGJlIGluaXRpYWxpemVkIGR1cmluZworLy8vICAgICAgICAgICAgICBwYXJzaW5nLgorLy8vIFxyZXR1cm4gdHJ1ZSBvbiBlcnJvci4KKy8vLyBccGFyYW0gVXBncmFkZURlYnVnSW5mbyBSdW4gVXBncmFkZURlYnVnSW5mbywgd2hpY2ggcnVucyB0aGUgVmVyaWZpZXIuCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gc2hvdWxkIG9ubHkgYmUgc2V0IHRvIGZhbHNlIGJ5IGxsdm0tYXMKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdXNlIGluc2lkZSB0aGUgTExWTSB0ZXN0dWl0ZSEKKy8vLyBccGFyYW0gRGF0YUxheW91dFN0cmluZyBPdmVycmlkZSBkYXRhbGF5b3V0IGluIHRoZSBsbHZtIGFzc2VtYmx5LgorYm9vbCBwYXJzZUFzc2VtYmx5SW50byhNZW1vcnlCdWZmZXJSZWYgRiwgTW9kdWxlICZNLCBTTURpYWdub3N0aWMgJkVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgU2xvdE1hcHBpbmcgKlNsb3RzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVcGdyYWRlRGVidWdJbmZvID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERhdGFMYXlvdXRTdHJpbmcgPSAiIik7CisKKy8vLyBQYXJzZSBhIHR5cGUgYW5kIGEgY29uc3RhbnQgdmFsdWUgaW4gdGhlIGdpdmVuIHN0cmluZy4KKy8vLworLy8vIFRoZSBjb25zdGFudCB2YWx1ZSBjYW4gYmUgYW55IExMVk0gY29uc3RhbnQsIGluY2x1ZGluZyBhIGNvbnN0YW50CisvLy8gZXhwcmVzc2lvbi4KKy8vLworLy8vIFxwYXJhbSBTbG90cyBUaGUgb3B0aW9uYWwgc2xvdCBtYXBwaW5nIHRoYXQgd2lsbCByZXN0b3JlIHRoZSBwYXJzaW5nIHN0YXRlCisvLy8gb2YgdGhlIG1vZHVsZS4KKy8vLyBccmV0dXJuIG51bGwgb24gZXJyb3IuCitDb25zdGFudCAqcGFyc2VDb25zdGFudFZhbHVlKFN0cmluZ1JlZiBBc20sIFNNRGlhZ25vc3RpYyAmRXJyLCBjb25zdCBNb2R1bGUgJk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNsb3RNYXBwaW5nICpTbG90cyA9IG51bGxwdHIpOworCisvLy8gUGFyc2UgYSB0eXBlIGluIHRoZSBnaXZlbiBzdHJpbmcuCisvLy8KKy8vLyBccGFyYW0gU2xvdHMgVGhlIG9wdGlvbmFsIHNsb3QgbWFwcGluZyB0aGF0IHdpbGwgcmVzdG9yZSB0aGUgcGFyc2luZyBzdGF0ZQorLy8vIG9mIHRoZSBtb2R1bGUuCisvLy8gXHJldHVybiBudWxsIG9uIGVycm9yLgorVHlwZSAqcGFyc2VUeXBlKFN0cmluZ1JlZiBBc20sIFNNRGlhZ25vc3RpYyAmRXJyLCBjb25zdCBNb2R1bGUgJk0sCisgICAgICAgICAgICAgICAgY29uc3QgU2xvdE1hcHBpbmcgKlNsb3RzID0gbnVsbHB0cik7CisKKy8vLyBQYXJzZSBhIHN0cmluZyBccCBBc20gdGhhdCBzdGFydHMgd2l0aCBhIHR5cGUuCisvLy8gXHAgUmVhZFtvdXRdIGdpdmVzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGhhdmUgYmVlbiByZWFkIHRvIHBhcnNlCisvLy8gdGhlIHR5cGUgaW4gXHAgQXNtLgorLy8vCisvLy8gXHBhcmFtIFNsb3RzIFRoZSBvcHRpb25hbCBzbG90IG1hcHBpbmcgdGhhdCB3aWxsIHJlc3RvcmUgdGhlIHBhcnNpbmcgc3RhdGUKKy8vLyBvZiB0aGUgbW9kdWxlLgorLy8vIFxyZXR1cm4gbnVsbCBvbiBlcnJvci4KK1R5cGUgKnBhcnNlVHlwZUF0QmVnaW5uaW5nKFN0cmluZ1JlZiBBc20sIHVuc2lnbmVkICZSZWFkLCBTTURpYWdub3N0aWMgJkVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZSAmTSwgY29uc3QgU2xvdE1hcHBpbmcgKlNsb3RzID0gbnVsbHB0cik7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Bc21QYXJzZXIvU2xvdE1hcHBpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQXNtUGFyc2VyL1Nsb3RNYXBwaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ3ZThmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQXNtUGFyc2VyL1Nsb3RNYXBwaW5nLmgKQEAgLTAsMCArMSw0MiBAQAorLy89PT0tLSBTbG90TWFwcGluZy5oIC0gU2xvdCBudW1iZXIgbWFwcGluZyBmb3IgdW5uYW1lZCB2YWx1ZXMgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBTbG90TWFwcGluZyBzdHJ1Y3QuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FTTVBBUlNFUl9TTE9UTUFQUElOR19ICisjZGVmaW5lIExMVk1fQVNNUEFSU0VSX1NMT1RNQVBQSU5HX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vSVIvVHJhY2tpbmdNRFJlZi5oIgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBUeXBlOworCisvLy8gVGhpcyBzdHJ1Y3QgY29udGFpbnMgdGhlIG1hcHBpbmdzIGZyb20gdGhlIHNsb3QgbnVtYmVycyB0byB1bm5hbWVkIG1ldGFkYXRhCisvLy8gbm9kZXMsIGdsb2JhbCB2YWx1ZXMgYW5kIHR5cGVzLiBJdCBhbHNvIGNvbnRhaW5zIHRoZSBtYXBwaW5nIGZvciB0aGUgbmFtZWQKKy8vLyB0eXBlcy4KKy8vLyBJdCBjYW4gYmUgdXNlZCB0byBzYXZlIHRoZSBwYXJzaW5nIHN0YXRlIG9mIGFuIExMVk0gSVIgbW9kdWxlIHNvIHRoYXQgdGhlCisvLy8gdGV4dHVhbCByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMgaW4gdGhlIG1vZHVsZSBjYW4gYmUgcGFyc2VkIG91dHNpZGUgb2YgdGhlCisvLy8gbW9kdWxlJ3Mgc291cmNlLgorc3RydWN0IFNsb3RNYXBwaW5nIHsKKyAgc3RkOjp2ZWN0b3I8R2xvYmFsVmFsdWUgKj4gR2xvYmFsVmFsdWVzOworICBzdGQ6Om1hcDx1bnNpZ25lZCwgVHJhY2tpbmdNRE5vZGVSZWY+IE1ldGFkYXRhTm9kZXM7CisgIFN0cmluZ01hcDxUeXBlICo+IE5hbWVkVHlwZXM7CisgIHN0ZDo6bWFwPHVuc2lnbmVkLCBUeXBlICo+IFR5cGVzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9DT0ZGLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9DT0ZGLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3MjZhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0NPRkYuaApAQCAtMCwwICsxLDcyNyBAQAorLy89PT0tLSBsbHZtL0JpbmFyeUZvcm1hdC9DT0ZGLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgYW4gZGVmaW5pdGlvbnMgdXNlZCBpbiBXaW5kb3dzIENPRkYgRmlsZXMuCisvLworLy8gU3RydWN0dXJlcyBhbmQgZW51bXMgZGVmaW5lZCB3aXRoaW4gdGhpcyBmaWxlIHdoZXJlIGNyZWF0ZWQgdXNpbmcKKy8vIGluZm9ybWF0aW9uIGZyb20gTWljcm9zb2Z0J3MgcHVibGljbHkgYXZhaWxhYmxlIFBFL0NPRkYgZm9ybWF0IGRvY3VtZW50OgorLy8KKy8vIE1pY3Jvc29mdCBQb3J0YWJsZSBFeGVjdXRhYmxlIGFuZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0IFNwZWNpZmljYXRpb24KKy8vIFJldmlzaW9uIDguMSAtIEZlYnJ1YXJ5IDE1LCAyMDA4CisvLworLy8gQXMgb2YgNS8yLzIwMTAsIGhvc3RlZCBieSBNaWNyb3NvZnQgYXQ6CisvLyBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vd2hkYy9zeXN0ZW0vcGxhdGZvcm0vZmlybXdhcmUvcGVjb2ZmLm1zcHgKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQklOQVJZRk9STUFUX0NPRkZfSAorI2RlZmluZSBMTFZNX0JJTkFSWUZPUk1BVF9DT0ZGX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBDT0ZGIHsKKworLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHNlY3Rpb25zIHRoYXQgYSBDT0ZGIG9iamVjdCBjYW4gaGF2ZSAoaW5jbHVzaXZlKS4KK2NvbnN0IGludDMyX3QgTWF4TnVtYmVyT2ZTZWN0aW9uczE2ID0gNjUyNzk7CisKKy8vIFRoZSBQRSBzaWduYXR1cmUgYnl0ZXMgdGhhdCBmb2xsb3dzIHRoZSBET1Mgc3R1YiBoZWFkZXIuCitzdGF0aWMgY29uc3QgY2hhciBQRU1hZ2ljW10gPSB7J1AnLCAnRScsICdcMCcsICdcMCd9OworCitzdGF0aWMgY29uc3QgY2hhciBCaWdPYmpNYWdpY1tdID0geworICAgICdceGM3JywgJ1x4YTEnLCAnXHhiYScsICdceGQxJywgJ1x4ZWUnLCAnXHhiYScsICdceGE5JywgJ1x4NGInLAorICAgICdceGFmJywgJ1x4MjAnLCAnXHhmYScsICdceGY2JywgJ1x4NmEnLCAnXHhhNCcsICdceGRjJywgJ1x4YjgnLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgQ2xHbE9iak1hZ2ljW10gPSB7CisgICAgJ1x4MzgnLCAnXHhmZScsICdceGIzJywgJ1x4MGMnLCAnXHhhNScsICdceGQ5JywgJ1x4YWInLCAnXHg0ZCcsCisgICAgJ1x4YWMnLCAnXHg5YicsICdceGQ2JywgJ1x4YjYnLCAnXHgyMicsICdceDI2JywgJ1x4NTMnLCAnXHhjMicsCit9OworCisvLyBUaGUgc2lnbmF0dXJlIGJ5dGVzIHRoYXQgc3RhcnQgYSAucmVzIGZpbGUuCitzdGF0aWMgY29uc3QgY2hhciBXaW5SZXNNYWdpY1tdID0geworICAgICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MjAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLAorICAgICdceGZmJywgJ1x4ZmYnLCAnXHgwMCcsICdceDAwJywgJ1x4ZmYnLCAnXHhmZicsICdceDAwJywgJ1x4MDAnLAorfTsKKworLy8gU2l6ZXMgaW4gYnl0ZXMgb2YgdmFyaW91cyB0aGluZ3MgaW4gdGhlIENPRkYgZm9ybWF0LgorZW51bSB7CisgIEhlYWRlcjE2U2l6ZSA9IDIwLAorICBIZWFkZXIzMlNpemUgPSA1NiwKKyAgTmFtZVNpemUgPSA4LAorICBTeW1ib2wxNlNpemUgPSAxOCwKKyAgU3ltYm9sMzJTaXplID0gMjAsCisgIFNlY3Rpb25TaXplID0gNDAsCisgIFJlbG9jYXRpb25TaXplID0gMTAKK307CisKK3N0cnVjdCBoZWFkZXIgeworICB1aW50MTZfdCBNYWNoaW5lOworICBpbnQzMl90IE51bWJlck9mU2VjdGlvbnM7CisgIHVpbnQzMl90IFRpbWVEYXRlU3RhbXA7CisgIHVpbnQzMl90IFBvaW50ZXJUb1N5bWJvbFRhYmxlOworICB1aW50MzJfdCBOdW1iZXJPZlN5bWJvbHM7CisgIHVpbnQxNl90IFNpemVPZk9wdGlvbmFsSGVhZGVyOworICB1aW50MTZfdCBDaGFyYWN0ZXJpc3RpY3M7Cit9OworCitzdHJ1Y3QgQmlnT2JqSGVhZGVyIHsKKyAgZW51bSA6IHVpbnQxNl90IHsgTWluQmlnT2JqZWN0VmVyc2lvbiA9IDIgfTsKKworICB1aW50MTZfdCBTaWcxOyAvLy88IE11c3QgYmUgSU1BR0VfRklMRV9NQUNISU5FX1VOS05PV04gKDApLgorICB1aW50MTZfdCBTaWcyOyAvLy88IE11c3QgYmUgMHhGRkZGLgorICB1aW50MTZfdCBWZXJzaW9uOworICB1aW50MTZfdCBNYWNoaW5lOworICB1aW50MzJfdCBUaW1lRGF0ZVN0YW1wOworICB1aW50OF90IFVVSURbMTZdOworICB1aW50MzJfdCB1bnVzZWQxOworICB1aW50MzJfdCB1bnVzZWQyOworICB1aW50MzJfdCB1bnVzZWQzOworICB1aW50MzJfdCB1bnVzZWQ0OworICB1aW50MzJfdCBOdW1iZXJPZlNlY3Rpb25zOworICB1aW50MzJfdCBQb2ludGVyVG9TeW1ib2xUYWJsZTsKKyAgdWludDMyX3QgTnVtYmVyT2ZTeW1ib2xzOworfTsKKworZW51bSBNYWNoaW5lVHlwZXMgOiB1bnNpZ25lZCB7CisgIE1UX0ludmFsaWQgPSAweGZmZmYsCisKKyAgSU1BR0VfRklMRV9NQUNISU5FX1VOS05PV04gPSAweDAsCisgIElNQUdFX0ZJTEVfTUFDSElORV9BTTMzID0gMHgxRDMsCisgIElNQUdFX0ZJTEVfTUFDSElORV9BTUQ2NCA9IDB4ODY2NCwKKyAgSU1BR0VfRklMRV9NQUNISU5FX0FSTSA9IDB4MUMwLAorICBJTUFHRV9GSUxFX01BQ0hJTkVfQVJNTlQgPSAweDFDNCwKKyAgSU1BR0VfRklMRV9NQUNISU5FX0FSTTY0ID0gMHhBQTY0LAorICBJTUFHRV9GSUxFX01BQ0hJTkVfRUJDID0gMHhFQkMsCisgIElNQUdFX0ZJTEVfTUFDSElORV9JMzg2ID0gMHgxNEMsCisgIElNQUdFX0ZJTEVfTUFDSElORV9JQTY0ID0gMHgyMDAsCisgIElNQUdFX0ZJTEVfTUFDSElORV9NMzJSID0gMHg5MDQxLAorICBJTUFHRV9GSUxFX01BQ0hJTkVfTUlQUzE2ID0gMHgyNjYsCisgIElNQUdFX0ZJTEVfTUFDSElORV9NSVBTRlBVID0gMHgzNjYsCisgIElNQUdFX0ZJTEVfTUFDSElORV9NSVBTRlBVMTYgPSAweDQ2NiwKKyAgSU1BR0VfRklMRV9NQUNISU5FX1BPV0VSUEMgPSAweDFGMCwKKyAgSU1BR0VfRklMRV9NQUNISU5FX1BPV0VSUENGUCA9IDB4MUYxLAorICBJTUFHRV9GSUxFX01BQ0hJTkVfUjQwMDAgPSAweDE2NiwKKyAgSU1BR0VfRklMRV9NQUNISU5FX1JJU0NWMzIgPSAweDUwMzIsCisgIElNQUdFX0ZJTEVfTUFDSElORV9SSVNDVjY0ID0gMHg1MDY0LAorICBJTUFHRV9GSUxFX01BQ0hJTkVfUklTQ1YxMjggPSAweDUxMjgsCisgIElNQUdFX0ZJTEVfTUFDSElORV9TSDMgPSAweDFBMiwKKyAgSU1BR0VfRklMRV9NQUNISU5FX1NIM0RTUCA9IDB4MUEzLAorICBJTUFHRV9GSUxFX01BQ0hJTkVfU0g0ID0gMHgxQTYsCisgIElNQUdFX0ZJTEVfTUFDSElORV9TSDUgPSAweDFBOCwKKyAgSU1BR0VfRklMRV9NQUNISU5FX1RIVU1CID0gMHgxQzIsCisgIElNQUdFX0ZJTEVfTUFDSElORV9XQ0VNSVBTVjIgPSAweDE2OQorfTsKKworZW51bSBDaGFyYWN0ZXJpc3RpY3MgOiB1bnNpZ25lZCB7CisgIENfSW52YWxpZCA9IDAsCisKKyAgLy8vIFRoZSBmaWxlIGRvZXMgbm90IGNvbnRhaW4gYmFzZSByZWxvY2F0aW9ucyBhbmQgbXVzdCBiZSBsb2FkZWQgYXQgaXRzCisgIC8vLyBwcmVmZXJyZWQgYmFzZS4gSWYgdGhpcyBjYW5ub3QgYmUgZG9uZSwgdGhlIGxvYWRlciB3aWxsIGVycm9yLgorICBJTUFHRV9GSUxFX1JFTE9DU19TVFJJUFBFRCA9IDB4MDAwMSwKKyAgLy8vIFRoZSBmaWxlIGlzIHZhbGlkIGFuZCBjYW4gYmUgcnVuLgorICBJTUFHRV9GSUxFX0VYRUNVVEFCTEVfSU1BR0UgPSAweDAwMDIsCisgIC8vLyBDT0ZGIGxpbmUgbnVtYmVycyBoYXZlIGJlZW4gc3RyaXBwZWQuIFRoaXMgaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIGJlCisgIC8vLyAwLgorICBJTUFHRV9GSUxFX0xJTkVfTlVNU19TVFJJUFBFRCA9IDB4MDAwNCwKKyAgLy8vIENPRkYgc3ltYm9sIHRhYmxlIGVudHJpZXMgZm9yIGxvY2FsIHN5bWJvbHMgaGF2ZSBiZWVuIHJlbW92ZWQuIFRoaXMgaXMKKyAgLy8vIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBiZSAwLgorICBJTUFHRV9GSUxFX0xPQ0FMX1NZTVNfU1RSSVBQRUQgPSAweDAwMDgsCisgIC8vLyBBZ2dyZXNzaXZlbHkgdHJpbSB3b3JraW5nIHNldC4gVGhpcyBpcyBkZXByZWNhdGVkIGFuZCBtdXN0IGJlIDAuCisgIElNQUdFX0ZJTEVfQUdHUkVTU0lWRV9XU19UUklNID0gMHgwMDEwLAorICAvLy8gSW1hZ2UgY2FuIGhhbmRsZSA+IDJHaUIgYWRkcmVzc2VzLgorICBJTUFHRV9GSUxFX0xBUkdFX0FERFJFU1NfQVdBUkUgPSAweDAwMjAsCisgIC8vLyBMaXR0bGUgZW5kaWFuOiB0aGUgTFNCIHByZWNlZGVzIHRoZSBNU0IgaW4gbWVtb3J5LiBUaGlzIGlzIGRlcHJlY2F0ZWQKKyAgLy8vIGFuZCBzaG91bGQgYmUgMC4KKyAgSU1BR0VfRklMRV9CWVRFU19SRVZFUlNFRF9MTyA9IDB4MDA4MCwKKyAgLy8vIE1hY2hpbmUgaXMgYmFzZWQgb24gYSAzMmJpdCB3b3JkIGFyY2hpdGVjdHVyZS4KKyAgSU1BR0VfRklMRV8zMkJJVF9NQUNISU5FID0gMHgwMTAwLAorICAvLy8gRGVidWdnaW5nIGluZm8gaGFzIGJlZW4gcmVtb3ZlZC4KKyAgSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRCA9IDB4MDIwMCwKKyAgLy8vIElmIHRoZSBpbWFnZSBpcyBvbiByZW1vdmFibGUgbWVkaWEsIGZ1bGx5IGxvYWQgaXQgYW5kIGNvcHkgaXQgdG8gc3dhcC4KKyAgSU1BR0VfRklMRV9SRU1PVkFCTEVfUlVOX0ZST01fU1dBUCA9IDB4MDQwMCwKKyAgLy8vIElmIHRoZSBpbWFnZSBpcyBvbiBuZXR3b3JrIG1lZGlhLCBmdWxseSBsb2FkIGl0IGFuZCBjb3B5IGl0IHRvIHN3YXAuCisgIElNQUdFX0ZJTEVfTkVUX1JVTl9GUk9NX1NXQVAgPSAweDA4MDAsCisgIC8vLyBUaGUgaW1hZ2UgZmlsZSBpcyBhIHN5c3RlbSBmaWxlLCBub3QgYSB1c2VyIHByb2dyYW0uCisgIElNQUdFX0ZJTEVfU1lTVEVNID0gMHgxMDAwLAorICAvLy8gVGhlIGltYWdlIGZpbGUgaXMgYSBETEwuCisgIElNQUdFX0ZJTEVfRExMID0gMHgyMDAwLAorICAvLy8gVGhpcyBmaWxlIHNob3VsZCBvbmx5IGJlIHJ1biBvbiBhIHVuaXByb2Nlc3NvciBtYWNoaW5lLgorICBJTUFHRV9GSUxFX1VQX1NZU1RFTV9PTkxZID0gMHg0MDAwLAorICAvLy8gQmlnIGVuZGlhbjogdGhlIE1TQiBwcmVjZWRlcyB0aGUgTFNCIGluIG1lbW9yeS4gVGhpcyBpcyBkZXByZWNhdGVkCisgIC8vLyBhbmQgc2hvdWxkIGJlIDAuCisgIElNQUdFX0ZJTEVfQllURVNfUkVWRVJTRURfSEkgPSAweDgwMDAKK307CisKK2VudW0gUmVzb3VyY2VUeXBlSUQgOiB1bnNpZ25lZCB7CisgIFJJRF9DdXJzb3IgPSAxLAorICBSSURfQml0bWFwID0gMiwKKyAgUklEX0ljb24gPSAzLAorICBSSURfTWVudSA9IDQsCisgIFJJRF9EaWFsb2cgPSA1LAorICBSSURfU3RyaW5nID0gNiwKKyAgUklEX0ZvbnREaXIgPSA3LAorICBSSURfRm9udCA9IDgsCisgIFJJRF9BY2NlbGVyYXRvciA9IDksCisgIFJJRF9SQ0RhdGEgPSAxMCwKKyAgUklEX01lc3NhZ2VUYWJsZSA9IDExLAorICBSSURfR3JvdXBfQ3Vyc29yID0gMTIsCisgIFJJRF9Hcm91cF9JY29uID0gMTQsCisgIFJJRF9WZXJzaW9uID0gMTYsCisgIFJJRF9ETEdJbmNsdWRlID0gMTcsCisgIFJJRF9QbHVnUGxheSA9IDE5LAorICBSSURfVlhEID0gMjAsCisgIFJJRF9BbmlDdXJzb3IgPSAyMSwKKyAgUklEX0FuaUljb24gPSAyMiwKKyAgUklEX0hUTUwgPSAyMywKKyAgUklEX01hbmlmZXN0ID0gMjQsCit9OworCitzdHJ1Y3Qgc3ltYm9sIHsKKyAgY2hhciBOYW1lW05hbWVTaXplXTsKKyAgdWludDMyX3QgVmFsdWU7CisgIGludDMyX3QgU2VjdGlvbk51bWJlcjsKKyAgdWludDE2X3QgVHlwZTsKKyAgdWludDhfdCBTdG9yYWdlQ2xhc3M7CisgIHVpbnQ4X3QgTnVtYmVyT2ZBdXhTeW1ib2xzOworfTsKKworZW51bSBTeW1ib2xTZWN0aW9uTnVtYmVyIDogaW50MzJfdCB7CisgIElNQUdFX1NZTV9ERUJVRyA9IC0yLAorICBJTUFHRV9TWU1fQUJTT0xVVEUgPSAtMSwKKyAgSU1BR0VfU1lNX1VOREVGSU5FRCA9IDAKK307CisKKy8vLyBTdG9yYWdlIGNsYXNzIHRlbGxzIHdoZXJlIGFuZCB3aGF0IHRoZSBzeW1ib2wgcmVwcmVzZW50cworZW51bSBTeW1ib2xTdG9yYWdlQ2xhc3MgeworICBTU0NfSW52YWxpZCA9IDB4ZmYsCisKKyAgSU1BR0VfU1lNX0NMQVNTX0VORF9PRl9GVU5DVElPTiA9IC0xLCAgLy8vPCBQaHlzaWNhbCBlbmQgb2YgZnVuY3Rpb24KKyAgSU1BR0VfU1lNX0NMQVNTX05VTEwgPSAwLCAgICAgICAgICAgICAgLy8vPCBObyBzeW1ib2wKKyAgSU1BR0VfU1lNX0NMQVNTX0FVVE9NQVRJQyA9IDEsICAgICAgICAgLy8vPCBTdGFjayB2YXJpYWJsZQorICBJTUFHRV9TWU1fQ0xBU1NfRVhURVJOQUwgPSAyLCAgICAgICAgICAvLy88IEV4dGVybmFsIHN5bWJvbAorICBJTUFHRV9TWU1fQ0xBU1NfU1RBVElDID0gMywgICAgICAgICAgICAvLy88IFN0YXRpYworICBJTUFHRV9TWU1fQ0xBU1NfUkVHSVNURVIgPSA0LCAgICAgICAgICAvLy88IFJlZ2lzdGVyIHZhcmlhYmxlCisgIElNQUdFX1NZTV9DTEFTU19FWFRFUk5BTF9ERUYgPSA1LCAgICAgIC8vLzwgRXh0ZXJuYWwgZGVmaW5pdGlvbgorICBJTUFHRV9TWU1fQ0xBU1NfTEFCRUwgPSA2LCAgICAgICAgICAgICAvLy88IExhYmVsCisgIElNQUdFX1NZTV9DTEFTU19VTkRFRklORURfTEFCRUwgPSA3LCAgIC8vLzwgVW5kZWZpbmVkIGxhYmVsCisgIElNQUdFX1NZTV9DTEFTU19NRU1CRVJfT0ZfU1RSVUNUID0gOCwgIC8vLzwgTWVtYmVyIG9mIHN0cnVjdHVyZQorICBJTUFHRV9TWU1fQ0xBU1NfQVJHVU1FTlQgPSA5LCAgICAgICAgICAvLy88IEZ1bmN0aW9uIGFyZ3VtZW50CisgIElNQUdFX1NZTV9DTEFTU19TVFJVQ1RfVEFHID0gMTAsICAgICAgIC8vLzwgU3RydWN0dXJlIHRhZworICBJTUFHRV9TWU1fQ0xBU1NfTUVNQkVSX09GX1VOSU9OID0gMTEsICAvLy88IE1lbWJlciBvZiB1bmlvbgorICBJTUFHRV9TWU1fQ0xBU1NfVU5JT05fVEFHID0gMTIsICAgICAgICAvLy88IFVuaW9uIHRhZworICBJTUFHRV9TWU1fQ0xBU1NfVFlQRV9ERUZJTklUSU9OID0gMTMsICAvLy88IFR5cGUgZGVmaW5pdGlvbgorICBJTUFHRV9TWU1fQ0xBU1NfVU5ERUZJTkVEX1NUQVRJQyA9IDE0LCAvLy88IFVuZGVmaW5lZCBzdGF0aWMKKyAgSU1BR0VfU1lNX0NMQVNTX0VOVU1fVEFHID0gMTUsICAgICAgICAgLy8vPCBFbnVtZXJhdGlvbiB0YWcKKyAgSU1BR0VfU1lNX0NMQVNTX01FTUJFUl9PRl9FTlVNID0gMTYsICAgLy8vPCBNZW1iZXIgb2YgZW51bWVyYXRpb24KKyAgSU1BR0VfU1lNX0NMQVNTX1JFR0lTVEVSX1BBUkFNID0gMTcsICAgLy8vPCBSZWdpc3RlciBwYXJhbWV0ZXIKKyAgSU1BR0VfU1lNX0NMQVNTX0JJVF9GSUVMRCA9IDE4LCAgICAgICAgLy8vPCBCaXQgZmllbGQKKyAgLy8vICIuYmIiIG9yICIuZWIiIC0gYmVnaW5uaW5nIG9yIGVuZCBvZiBibG9jaworICBJTUFHRV9TWU1fQ0xBU1NfQkxPQ0sgPSAxMDAsCisgIC8vLyAiLmJmIiBvciAiLmVmIiAtIGJlZ2lubmluZyBvciBlbmQgb2YgZnVuY3Rpb24KKyAgSU1BR0VfU1lNX0NMQVNTX0ZVTkNUSU9OID0gMTAxLAorICBJTUFHRV9TWU1fQ0xBU1NfRU5EX09GX1NUUlVDVCA9IDEwMiwgLy8vPCBFbmQgb2Ygc3RydWN0dXJlCisgIElNQUdFX1NZTV9DTEFTU19GSUxFID0gMTAzLCAgICAgICAgICAvLy88IEZpbGUgbmFtZQorICAvLy8gTGluZSBudW1iZXIsIHJlZm9ybWF0dGVkIGFzIHN5bWJvbAorICBJTUFHRV9TWU1fQ0xBU1NfU0VDVElPTiA9IDEwNCwKKyAgSU1BR0VfU1lNX0NMQVNTX1dFQUtfRVhURVJOQUwgPSAxMDUsIC8vLzwgRHVwbGljYXRlIHRhZworICAvLy8gRXh0ZXJuYWwgc3ltYm9sIGluIGRtZXJ0IHB1YmxpYyBsaWIKKyAgSU1BR0VfU1lNX0NMQVNTX0NMUl9UT0tFTiA9IDEwNworfTsKKworZW51bSBTeW1ib2xCYXNlVHlwZSA6IHVuc2lnbmVkIHsKKyAgSU1BR0VfU1lNX1RZUEVfTlVMTCA9IDAsICAgLy8vPCBObyB0eXBlIGluZm9ybWF0aW9uIG9yIHVua25vd24gYmFzZSB0eXBlLgorICBJTUFHRV9TWU1fVFlQRV9WT0lEID0gMSwgICAvLy88IFVzZWQgd2l0aCB2b2lkIHBvaW50ZXJzIGFuZCBmdW5jdGlvbnMuCisgIElNQUdFX1NZTV9UWVBFX0NIQVIgPSAyLCAgIC8vLzwgQSBjaGFyYWN0ZXIgKHNpZ25lZCBieXRlKS4KKyAgSU1BR0VfU1lNX1RZUEVfU0hPUlQgPSAzLCAgLy8vPCBBIDItYnl0ZSBzaWduZWQgaW50ZWdlci4KKyAgSU1BR0VfU1lNX1RZUEVfSU5UID0gNCwgICAgLy8vPCBBIG5hdHVyYWwgaW50ZWdlciB0eXBlIG9uIHRoZSB0YXJnZXQuCisgIElNQUdFX1NZTV9UWVBFX0xPTkcgPSA1LCAgIC8vLzwgQSA0LWJ5dGUgc2lnbmVkIGludGVnZXIuCisgIElNQUdFX1NZTV9UWVBFX0ZMT0FUID0gNiwgIC8vLzwgQSA0LWJ5dGUgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorICBJTUFHRV9TWU1fVFlQRV9ET1VCTEUgPSA3LCAvLy88IEFuIDgtYnl0ZSBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgIElNQUdFX1NZTV9UWVBFX1NUUlVDVCA9IDgsIC8vLzwgQSBzdHJ1Y3R1cmUuCisgIElNQUdFX1NZTV9UWVBFX1VOSU9OID0gOSwgIC8vLzwgQW4gdW5pb24uCisgIElNQUdFX1NZTV9UWVBFX0VOVU0gPSAxMCwgIC8vLzwgQW4gZW51bWVyYXRlZCB0eXBlLgorICBJTUFHRV9TWU1fVFlQRV9NT0UgPSAxMSwgICAvLy88IEEgbWVtYmVyIG9mIGVudW1lcmF0aW9uIChhIHNwZWNpZmljIHZhbHVlKS4KKyAgSU1BR0VfU1lNX1RZUEVfQllURSA9IDEyLCAgLy8vPCBBIGJ5dGU7IHVuc2lnbmVkIDEtYnl0ZSBpbnRlZ2VyLgorICBJTUFHRV9TWU1fVFlQRV9XT1JEID0gMTMsICAvLy88IEEgd29yZDsgdW5zaWduZWQgMi1ieXRlIGludGVnZXIuCisgIElNQUdFX1NZTV9UWVBFX1VJTlQgPSAxNCwgIC8vLzwgQW4gdW5zaWduZWQgaW50ZWdlciBvZiBuYXR1cmFsIHNpemUuCisgIElNQUdFX1NZTV9UWVBFX0RXT1JEID0gMTUgIC8vLzwgQW4gdW5zaWduZWQgNC1ieXRlIGludGVnZXIuCit9OworCitlbnVtIFN5bWJvbENvbXBsZXhUeXBlIDogdW5zaWduZWQgeworICBJTUFHRV9TWU1fRFRZUEVfTlVMTCA9IDAsICAgICAvLy88IE5vIGNvbXBsZXggdHlwZTsgc2ltcGxlIHNjYWxhciB2YXJpYWJsZS4KKyAgSU1BR0VfU1lNX0RUWVBFX1BPSU5URVIgPSAxLCAgLy8vPCBBIHBvaW50ZXIgdG8gYmFzZSB0eXBlLgorICBJTUFHRV9TWU1fRFRZUEVfRlVOQ1RJT04gPSAyLCAvLy88IEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgYmFzZSB0eXBlLgorICBJTUFHRV9TWU1fRFRZUEVfQVJSQVkgPSAzLCAgICAvLy88IEFuIGFycmF5IG9mIGJhc2UgdHlwZS4KKworICAvLy8gVHlwZSBpcyBmb3JtZWQgYXMgKGJhc2UgKyAoZGVyaXZlZCA8PCBTQ1RfQ09NUExFWF9UWVBFX1NISUZUKSkKKyAgU0NUX0NPTVBMRVhfVFlQRV9TSElGVCA9IDQKK307CisKK2VudW0gQXV4U3ltYm9sVHlwZSB7IElNQUdFX0FVWF9TWU1CT0xfVFlQRV9UT0tFTl9ERUYgPSAxIH07CisKK3N0cnVjdCBzZWN0aW9uIHsKKyAgY2hhciBOYW1lW05hbWVTaXplXTsKKyAgdWludDMyX3QgVmlydHVhbFNpemU7CisgIHVpbnQzMl90IFZpcnR1YWxBZGRyZXNzOworICB1aW50MzJfdCBTaXplT2ZSYXdEYXRhOworICB1aW50MzJfdCBQb2ludGVyVG9SYXdEYXRhOworICB1aW50MzJfdCBQb2ludGVyVG9SZWxvY2F0aW9uczsKKyAgdWludDMyX3QgUG9pbnRlclRvTGluZU51bWJlcnM7CisgIHVpbnQxNl90IE51bWJlck9mUmVsb2NhdGlvbnM7CisgIHVpbnQxNl90IE51bWJlck9mTGluZU51bWJlcnM7CisgIHVpbnQzMl90IENoYXJhY3RlcmlzdGljczsKK307CisKK2VudW0gU2VjdGlvbkNoYXJhY3RlcmlzdGljcyA6IHVpbnQzMl90IHsKKyAgU0NfSW52YWxpZCA9IDB4ZmZmZmZmZmYsCisKKyAgSU1BR0VfU0NOX1RZUEVfTk9MT0FEID0gMHgwMDAwMDAwMiwKKyAgSU1BR0VfU0NOX1RZUEVfTk9fUEFEID0gMHgwMDAwMDAwOCwKKyAgSU1BR0VfU0NOX0NOVF9DT0RFID0gMHgwMDAwMDAyMCwKKyAgSU1BR0VfU0NOX0NOVF9JTklUSUFMSVpFRF9EQVRBID0gMHgwMDAwMDA0MCwKKyAgSU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEgPSAweDAwMDAwMDgwLAorICBJTUFHRV9TQ05fTE5LX09USEVSID0gMHgwMDAwMDEwMCwKKyAgSU1BR0VfU0NOX0xOS19JTkZPID0gMHgwMDAwMDIwMCwKKyAgSU1BR0VfU0NOX0xOS19SRU1PVkUgPSAweDAwMDAwODAwLAorICBJTUFHRV9TQ05fTE5LX0NPTURBVCA9IDB4MDAwMDEwMDAsCisgIElNQUdFX1NDTl9HUFJFTCA9IDB4MDAwMDgwMDAsCisgIElNQUdFX1NDTl9NRU1fUFVSR0VBQkxFID0gMHgwMDAyMDAwMCwKKyAgSU1BR0VfU0NOX01FTV8xNkJJVCA9IDB4MDAwMjAwMDAsCisgIElNQUdFX1NDTl9NRU1fTE9DS0VEID0gMHgwMDA0MDAwMCwKKyAgSU1BR0VfU0NOX01FTV9QUkVMT0FEID0gMHgwMDA4MDAwMCwKKyAgSU1BR0VfU0NOX0FMSUdOXzFCWVRFUyA9IDB4MDAxMDAwMDAsCisgIElNQUdFX1NDTl9BTElHTl8yQllURVMgPSAweDAwMjAwMDAwLAorICBJTUFHRV9TQ05fQUxJR05fNEJZVEVTID0gMHgwMDMwMDAwMCwKKyAgSU1BR0VfU0NOX0FMSUdOXzhCWVRFUyA9IDB4MDA0MDAwMDAsCisgIElNQUdFX1NDTl9BTElHTl8xNkJZVEVTID0gMHgwMDUwMDAwMCwKKyAgSU1BR0VfU0NOX0FMSUdOXzMyQllURVMgPSAweDAwNjAwMDAwLAorICBJTUFHRV9TQ05fQUxJR05fNjRCWVRFUyA9IDB4MDA3MDAwMDAsCisgIElNQUdFX1NDTl9BTElHTl8xMjhCWVRFUyA9IDB4MDA4MDAwMDAsCisgIElNQUdFX1NDTl9BTElHTl8yNTZCWVRFUyA9IDB4MDA5MDAwMDAsCisgIElNQUdFX1NDTl9BTElHTl81MTJCWVRFUyA9IDB4MDBBMDAwMDAsCisgIElNQUdFX1NDTl9BTElHTl8xMDI0QllURVMgPSAweDAwQjAwMDAwLAorICBJTUFHRV9TQ05fQUxJR05fMjA0OEJZVEVTID0gMHgwMEMwMDAwMCwKKyAgSU1BR0VfU0NOX0FMSUdOXzQwOTZCWVRFUyA9IDB4MDBEMDAwMDAsCisgIElNQUdFX1NDTl9BTElHTl84MTkyQllURVMgPSAweDAwRTAwMDAwLAorICBJTUFHRV9TQ05fTE5LX05SRUxPQ19PVkZMID0gMHgwMTAwMDAwMCwKKyAgSU1BR0VfU0NOX01FTV9ESVNDQVJEQUJMRSA9IDB4MDIwMDAwMDAsCisgIElNQUdFX1NDTl9NRU1fTk9UX0NBQ0hFRCA9IDB4MDQwMDAwMDAsCisgIElNQUdFX1NDTl9NRU1fTk9UX1BBR0VEID0gMHgwODAwMDAwMCwKKyAgSU1BR0VfU0NOX01FTV9TSEFSRUQgPSAweDEwMDAwMDAwLAorICBJTUFHRV9TQ05fTUVNX0VYRUNVVEUgPSAweDIwMDAwMDAwLAorICBJTUFHRV9TQ05fTUVNX1JFQUQgPSAweDQwMDAwMDAwLAorICBJTUFHRV9TQ05fTUVNX1dSSVRFID0gMHg4MDAwMDAwMAorfTsKKworc3RydWN0IHJlbG9jYXRpb24geworICB1aW50MzJfdCBWaXJ0dWFsQWRkcmVzczsKKyAgdWludDMyX3QgU3ltYm9sVGFibGVJbmRleDsKKyAgdWludDE2X3QgVHlwZTsKK307CisKK2VudW0gUmVsb2NhdGlvblR5cGVJMzg2IDogdW5zaWduZWQgeworICBJTUFHRV9SRUxfSTM4Nl9BQlNPTFVURSA9IDB4MDAwMCwKKyAgSU1BR0VfUkVMX0kzODZfRElSMTYgPSAweDAwMDEsCisgIElNQUdFX1JFTF9JMzg2X1JFTDE2ID0gMHgwMDAyLAorICBJTUFHRV9SRUxfSTM4Nl9ESVIzMiA9IDB4MDAwNiwKKyAgSU1BR0VfUkVMX0kzODZfRElSMzJOQiA9IDB4MDAwNywKKyAgSU1BR0VfUkVMX0kzODZfU0VHMTIgPSAweDAwMDksCisgIElNQUdFX1JFTF9JMzg2X1NFQ1RJT04gPSAweDAwMEEsCisgIElNQUdFX1JFTF9JMzg2X1NFQ1JFTCA9IDB4MDAwQiwKKyAgSU1BR0VfUkVMX0kzODZfVE9LRU4gPSAweDAwMEMsCisgIElNQUdFX1JFTF9JMzg2X1NFQ1JFTDcgPSAweDAwMEQsCisgIElNQUdFX1JFTF9JMzg2X1JFTDMyID0gMHgwMDE0Cit9OworCitlbnVtIFJlbG9jYXRpb25UeXBlQU1ENjQgOiB1bnNpZ25lZCB7CisgIElNQUdFX1JFTF9BTUQ2NF9BQlNPTFVURSA9IDB4MDAwMCwKKyAgSU1BR0VfUkVMX0FNRDY0X0FERFI2NCA9IDB4MDAwMSwKKyAgSU1BR0VfUkVMX0FNRDY0X0FERFIzMiA9IDB4MDAwMiwKKyAgSU1BR0VfUkVMX0FNRDY0X0FERFIzMk5CID0gMHgwMDAzLAorICBJTUFHRV9SRUxfQU1ENjRfUkVMMzIgPSAweDAwMDQsCisgIElNQUdFX1JFTF9BTUQ2NF9SRUwzMl8xID0gMHgwMDA1LAorICBJTUFHRV9SRUxfQU1ENjRfUkVMMzJfMiA9IDB4MDAwNiwKKyAgSU1BR0VfUkVMX0FNRDY0X1JFTDMyXzMgPSAweDAwMDcsCisgIElNQUdFX1JFTF9BTUQ2NF9SRUwzMl80ID0gMHgwMDA4LAorICBJTUFHRV9SRUxfQU1ENjRfUkVMMzJfNSA9IDB4MDAwOSwKKyAgSU1BR0VfUkVMX0FNRDY0X1NFQ1RJT04gPSAweDAwMEEsCisgIElNQUdFX1JFTF9BTUQ2NF9TRUNSRUwgPSAweDAwMEIsCisgIElNQUdFX1JFTF9BTUQ2NF9TRUNSRUw3ID0gMHgwMDBDLAorICBJTUFHRV9SRUxfQU1ENjRfVE9LRU4gPSAweDAwMEQsCisgIElNQUdFX1JFTF9BTUQ2NF9TUkVMMzIgPSAweDAwMEUsCisgIElNQUdFX1JFTF9BTUQ2NF9QQUlSID0gMHgwMDBGLAorICBJTUFHRV9SRUxfQU1ENjRfU1NQQU4zMiA9IDB4MDAxMAorfTsKKworZW51bSBSZWxvY2F0aW9uVHlwZXNBUk0gOiB1bnNpZ25lZCB7CisgIElNQUdFX1JFTF9BUk1fQUJTT0xVVEUgPSAweDAwMDAsCisgIElNQUdFX1JFTF9BUk1fQUREUjMyID0gMHgwMDAxLAorICBJTUFHRV9SRUxfQVJNX0FERFIzMk5CID0gMHgwMDAyLAorICBJTUFHRV9SRUxfQVJNX0JSQU5DSDI0ID0gMHgwMDAzLAorICBJTUFHRV9SRUxfQVJNX0JSQU5DSDExID0gMHgwMDA0LAorICBJTUFHRV9SRUxfQVJNX1RPS0VOID0gMHgwMDA1LAorICBJTUFHRV9SRUxfQVJNX0JMWDI0ID0gMHgwMDA4LAorICBJTUFHRV9SRUxfQVJNX0JMWDExID0gMHgwMDA5LAorICBJTUFHRV9SRUxfQVJNX1NFQ1RJT04gPSAweDAwMEUsCisgIElNQUdFX1JFTF9BUk1fU0VDUkVMID0gMHgwMDBGLAorICBJTUFHRV9SRUxfQVJNX01PVjMyQSA9IDB4MDAxMCwKKyAgSU1BR0VfUkVMX0FSTV9NT1YzMlQgPSAweDAwMTEsCisgIElNQUdFX1JFTF9BUk1fQlJBTkNIMjBUID0gMHgwMDEyLAorICBJTUFHRV9SRUxfQVJNX0JSQU5DSDI0VCA9IDB4MDAxNCwKKyAgSU1BR0VfUkVMX0FSTV9CTFgyM1QgPSAweDAwMTUKK307CisKK2VudW0gUmVsb2NhdGlvblR5cGVzQVJNNjQgOiB1bnNpZ25lZCB7CisgIElNQUdFX1JFTF9BUk02NF9BQlNPTFVURSA9IDB4MDAwMCwKKyAgSU1BR0VfUkVMX0FSTTY0X0FERFIzMiA9IDB4MDAwMSwKKyAgSU1BR0VfUkVMX0FSTTY0X0FERFIzMk5CID0gMHgwMDAyLAorICBJTUFHRV9SRUxfQVJNNjRfQlJBTkNIMjYgPSAweDAwMDMsCisgIElNQUdFX1JFTF9BUk02NF9QQUdFQkFTRV9SRUwyMSA9IDB4MDAwNCwKKyAgSU1BR0VfUkVMX0FSTTY0X1JFTDIxID0gMHgwMDA1LAorICBJTUFHRV9SRUxfQVJNNjRfUEFHRU9GRlNFVF8xMkEgPSAweDAwMDYsCisgIElNQUdFX1JFTF9BUk02NF9QQUdFT0ZGU0VUXzEyTCA9IDB4MDAwNywKKyAgSU1BR0VfUkVMX0FSTTY0X1NFQ1JFTCA9IDB4MDAwOCwKKyAgSU1BR0VfUkVMX0FSTTY0X1NFQ1JFTF9MT1cxMkEgPSAweDAwMDksCisgIElNQUdFX1JFTF9BUk02NF9TRUNSRUxfSElHSDEyQSA9IDB4MDAwQSwKKyAgSU1BR0VfUkVMX0FSTTY0X1NFQ1JFTF9MT1cxMkwgPSAweDAwMEIsCisgIElNQUdFX1JFTF9BUk02NF9UT0tFTiA9IDB4MDAwQywKKyAgSU1BR0VfUkVMX0FSTTY0X1NFQ1RJT04gPSAweDAwMEQsCisgIElNQUdFX1JFTF9BUk02NF9BRERSNjQgPSAweDAwMEUsCisgIElNQUdFX1JFTF9BUk02NF9CUkFOQ0gxOSA9IDB4MDAwRiwKKyAgSU1BR0VfUkVMX0FSTTY0X0JSQU5DSDE0ID0gMHgwMDEwLAorfTsKKworZW51bSBDT01EQVRUeXBlIDogdW5zaWduZWQgeworICBJTUFHRV9DT01EQVRfU0VMRUNUX05PRFVQTElDQVRFUyA9IDEsCisgIElNQUdFX0NPTURBVF9TRUxFQ1RfQU5ZLAorICBJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRSwKKyAgSU1BR0VfQ09NREFUX1NFTEVDVF9FWEFDVF9NQVRDSCwKKyAgSU1BR0VfQ09NREFUX1NFTEVDVF9BU1NPQ0lBVElWRSwKKyAgSU1BR0VfQ09NREFUX1NFTEVDVF9MQVJHRVNULAorICBJTUFHRV9DT01EQVRfU0VMRUNUX05FV0VTVAorfTsKKworLy8gQXV4aWxpYXJ5IFN5bWJvbCBGb3JtYXRzCitzdHJ1Y3QgQXV4aWxpYXJ5RnVuY3Rpb25EZWZpbml0aW9uIHsKKyAgdWludDMyX3QgVGFnSW5kZXg7CisgIHVpbnQzMl90IFRvdGFsU2l6ZTsKKyAgdWludDMyX3QgUG9pbnRlclRvTGluZW51bWJlcjsKKyAgdWludDMyX3QgUG9pbnRlclRvTmV4dEZ1bmN0aW9uOworICBjaGFyIHVudXNlZFsyXTsKK307CisKK3N0cnVjdCBBdXhpbGlhcnliZkFuZGVmU3ltYm9sIHsKKyAgdWludDhfdCB1bnVzZWQxWzRdOworICB1aW50MTZfdCBMaW5lbnVtYmVyOworICB1aW50OF90IHVudXNlZDJbNl07CisgIHVpbnQzMl90IFBvaW50ZXJUb05leHRGdW5jdGlvbjsKKyAgdWludDhfdCB1bnVzZWQzWzJdOworfTsKKworc3RydWN0IEF1eGlsaWFyeVdlYWtFeHRlcm5hbCB7CisgIHVpbnQzMl90IFRhZ0luZGV4OworICB1aW50MzJfdCBDaGFyYWN0ZXJpc3RpY3M7CisgIHVpbnQ4X3QgdW51c2VkWzEwXTsKK307CisKK2VudW0gV2Vha0V4dGVybmFsQ2hhcmFjdGVyaXN0aWNzIDogdW5zaWduZWQgeworICBJTUFHRV9XRUFLX0VYVEVSTl9TRUFSQ0hfTk9MSUJSQVJZID0gMSwKKyAgSU1BR0VfV0VBS19FWFRFUk5fU0VBUkNIX0xJQlJBUlkgPSAyLAorICBJTUFHRV9XRUFLX0VYVEVSTl9TRUFSQ0hfQUxJQVMgPSAzCit9OworCitzdHJ1Y3QgQXV4aWxpYXJ5U2VjdGlvbkRlZmluaXRpb24geworICB1aW50MzJfdCBMZW5ndGg7CisgIHVpbnQxNl90IE51bWJlck9mUmVsb2NhdGlvbnM7CisgIHVpbnQxNl90IE51bWJlck9mTGluZW51bWJlcnM7CisgIHVpbnQzMl90IENoZWNrU3VtOworICB1aW50MzJfdCBOdW1iZXI7CisgIHVpbnQ4X3QgU2VsZWN0aW9uOworICBjaGFyIHVudXNlZDsKK307CisKK3N0cnVjdCBBdXhpbGlhcnlDTFJUb2tlbiB7CisgIHVpbnQ4X3QgQXV4VHlwZTsKKyAgdWludDhfdCB1bnVzZWQxOworICB1aW50MzJfdCBTeW1ib2xUYWJsZUluZGV4OworICBjaGFyIHVudXNlZDJbMTJdOworfTsKKwordW5pb24gQXV4aWxpYXJ5IHsKKyAgQXV4aWxpYXJ5RnVuY3Rpb25EZWZpbml0aW9uIEZ1bmN0aW9uRGVmaW5pdGlvbjsKKyAgQXV4aWxpYXJ5YmZBbmRlZlN5bWJvbCBiZkFuZGVmU3ltYm9sOworICBBdXhpbGlhcnlXZWFrRXh0ZXJuYWwgV2Vha0V4dGVybmFsOworICBBdXhpbGlhcnlTZWN0aW9uRGVmaW5pdGlvbiBTZWN0aW9uRGVmaW5pdGlvbjsKK307CisKKy8vLyBAYnJpZWYgVGhlIEltcG9ydCBEaXJlY3RvcnkgVGFibGUuCisvLy8KKy8vLyBUaGVyZSBpcyBhIHNpbmdsZSBhcnJheSBvZiB0aGVzZSBhbmQgb25lIGVudHJ5IHBlciBpbXBvcnRlZCBETEwuCitzdHJ1Y3QgSW1wb3J0RGlyZWN0b3J5VGFibGVFbnRyeSB7CisgIHVpbnQzMl90IEltcG9ydExvb2t1cFRhYmxlUlZBOworICB1aW50MzJfdCBUaW1lRGF0ZVN0YW1wOworICB1aW50MzJfdCBGb3J3YXJkZXJDaGFpbjsKKyAgdWludDMyX3QgTmFtZVJWQTsKKyAgdWludDMyX3QgSW1wb3J0QWRkcmVzc1RhYmxlUlZBOworfTsKKworLy8vIEBicmllZiBUaGUgUEUzMiBJbXBvcnQgTG9va3VwIFRhYmxlLgorLy8vCisvLy8gVGhlcmUgaXMgYW4gYXJyYXkgb2YgdGhlc2UgZm9yIGVhY2ggaW1wb3J0ZWQgRExMLiBJdCByZXByZXNlbnRzIGVpdGhlcgorLy8vIHRoZSBvcmRpbmFsIHRvIGltcG9ydCBmcm9tIHRoZSB0YXJnZXQgRExMLCBvciBhIG5hbWUgdG8gbG9va3VwIGFuZCBpbXBvcnQKKy8vLyBmcm9tIHRoZSB0YXJnZXQgRExMLgorLy8vCisvLy8gVGhpcyBhbHNvIGhhcHBlbnMgdG8gYmUgdGhlIHNhbWUgZm9ybWF0IHVzZWQgYnkgdGhlIEltcG9ydCBBZGRyZXNzIFRhYmxlCisvLy8gd2hlbiBpdCBpcyBpbml0aWFsbHkgd3JpdHRlbiBvdXQgdG8gdGhlIGltYWdlLgorc3RydWN0IEltcG9ydExvb2t1cFRhYmxlRW50cnkzMiB7CisgIHVpbnQzMl90IGRhdGE7CisKKyAgLy8vIEBicmllZiBJcyB0aGlzIGVudHJ5IHNwZWNpZmllZCBieSBvcmRpbmFsLCBvciBuYW1lPworICBib29sIGlzT3JkaW5hbCgpIGNvbnN0IHsgcmV0dXJuIGRhdGEgJiAweDgwMDAwMDAwOyB9CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIG9yZGluYWwgdmFsdWUgb2YgdGhpcyBlbnRyeS4gaXNPcmRpbmFsIG11c3QgYmUgdHJ1ZS4KKyAgdWludDE2X3QgZ2V0T3JkaW5hbCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNPcmRpbmFsKCkgJiYgIklMVCBlbnRyeSBpcyBub3QgYW4gb3JkaW5hbCEiKTsKKyAgICByZXR1cm4gZGF0YSAmIDB4RkZGRjsKKyAgfQorCisgIC8vLyBAYnJpZWYgU2V0IHRoZSBvcmRpbmFsIHZhbHVlIGFuZCBzZXQgaXNPcmRpbmFsIHRvIHRydWUuCisgIHZvaWQgc2V0T3JkaW5hbCh1aW50MTZfdCBvKSB7CisgICAgZGF0YSA9IG87CisgICAgZGF0YSB8PSAweDgwMDAwMDAwOworICB9CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIEhpbnQvTmFtZSBlbnRyeSBSVkEuIGlzT3JkaW5hbCBtdXN0IGJlIGZhbHNlLgorICB1aW50MzJfdCBnZXRIaW50TmFtZVJWQSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzT3JkaW5hbCgpICYmICJJTFQgZW50cnkgaXMgbm90IGEgSGludC9OYW1lIFJWQSEiKTsKKyAgICByZXR1cm4gZGF0YTsKKyAgfQorCisgIC8vLyBAYnJpZWYgU2V0IHRoZSBIaW50L05hbWUgZW50cnkgUlZBIGFuZCBzZXQgaXNPcmRpbmFsIHRvIGZhbHNlLgorICB2b2lkIHNldEhpbnROYW1lUlZBKHVpbnQzMl90IHJ2YSkgeyBkYXRhID0gcnZhOyB9Cit9OworCisvLy8gQGJyaWVmIFRoZSBET1MgY29tcGF0aWJsZSBoZWFkZXIgYXQgdGhlIGZyb250IG9mIGFsbCBQRXMuCitzdHJ1Y3QgRE9TSGVhZGVyIHsKKyAgdWludDE2X3QgTWFnaWM7CisgIHVpbnQxNl90IFVzZWRCeXRlc0luVGhlTGFzdFBhZ2U7CisgIHVpbnQxNl90IEZpbGVTaXplSW5QYWdlczsKKyAgdWludDE2X3QgTnVtYmVyT2ZSZWxvY2F0aW9uSXRlbXM7CisgIHVpbnQxNl90IEhlYWRlclNpemVJblBhcmFncmFwaHM7CisgIHVpbnQxNl90IE1pbmltdW1FeHRyYVBhcmFncmFwaHM7CisgIHVpbnQxNl90IE1heGltdW1FeHRyYVBhcmFncmFwaHM7CisgIHVpbnQxNl90IEluaXRpYWxSZWxhdGl2ZVNTOworICB1aW50MTZfdCBJbml0aWFsU1A7CisgIHVpbnQxNl90IENoZWNrc3VtOworICB1aW50MTZfdCBJbml0aWFsSVA7CisgIHVpbnQxNl90IEluaXRpYWxSZWxhdGl2ZUNTOworICB1aW50MTZfdCBBZGRyZXNzT2ZSZWxvY2F0aW9uVGFibGU7CisgIHVpbnQxNl90IE92ZXJsYXlOdW1iZXI7CisgIHVpbnQxNl90IFJlc2VydmVkWzRdOworICB1aW50MTZfdCBPRU1pZDsKKyAgdWludDE2X3QgT0VNaW5mbzsKKyAgdWludDE2X3QgUmVzZXJ2ZWQyWzEwXTsKKyAgdWludDMyX3QgQWRkcmVzc09mTmV3RXhlSGVhZGVyOworfTsKKworc3RydWN0IFBFMzJIZWFkZXIgeworICBlbnVtIHsgUEUzMiA9IDB4MTBiLCBQRTMyX1BMVVMgPSAweDIwYiB9OworCisgIHVpbnQxNl90IE1hZ2ljOworICB1aW50OF90IE1ham9yTGlua2VyVmVyc2lvbjsKKyAgdWludDhfdCBNaW5vckxpbmtlclZlcnNpb247CisgIHVpbnQzMl90IFNpemVPZkNvZGU7CisgIHVpbnQzMl90IFNpemVPZkluaXRpYWxpemVkRGF0YTsKKyAgdWludDMyX3QgU2l6ZU9mVW5pbml0aWFsaXplZERhdGE7CisgIHVpbnQzMl90IEFkZHJlc3NPZkVudHJ5UG9pbnQ7IC8vIFJWQQorICB1aW50MzJfdCBCYXNlT2ZDb2RlOyAgICAgICAgICAvLyBSVkEKKyAgdWludDMyX3QgQmFzZU9mRGF0YTsgICAgICAgICAgLy8gUlZBCisgIHVpbnQzMl90IEltYWdlQmFzZTsKKyAgdWludDMyX3QgU2VjdGlvbkFsaWdubWVudDsKKyAgdWludDMyX3QgRmlsZUFsaWdubWVudDsKKyAgdWludDE2X3QgTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOworICB1aW50MTZfdCBNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb247CisgIHVpbnQxNl90IE1ham9ySW1hZ2VWZXJzaW9uOworICB1aW50MTZfdCBNaW5vckltYWdlVmVyc2lvbjsKKyAgdWludDE2X3QgTWFqb3JTdWJzeXN0ZW1WZXJzaW9uOworICB1aW50MTZfdCBNaW5vclN1YnN5c3RlbVZlcnNpb247CisgIHVpbnQzMl90IFdpbjMyVmVyc2lvblZhbHVlOworICB1aW50MzJfdCBTaXplT2ZJbWFnZTsKKyAgdWludDMyX3QgU2l6ZU9mSGVhZGVyczsKKyAgdWludDMyX3QgQ2hlY2tTdW07CisgIHVpbnQxNl90IFN1YnN5c3RlbTsKKyAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIERsbENoYXJhY3RlcmlzdGljcyB0byBtYXRjaCB0aGUgQ09GRiBzcGVjLgorICB1aW50MTZfdCBETExDaGFyYWN0ZXJpc3RpY3M7CisgIHVpbnQzMl90IFNpemVPZlN0YWNrUmVzZXJ2ZTsKKyAgdWludDMyX3QgU2l6ZU9mU3RhY2tDb21taXQ7CisgIHVpbnQzMl90IFNpemVPZkhlYXBSZXNlcnZlOworICB1aW50MzJfdCBTaXplT2ZIZWFwQ29tbWl0OworICB1aW50MzJfdCBMb2FkZXJGbGFnczsKKyAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIE51bWJlck9mUnZhQW5kU2l6ZXMgdG8gbWF0Y2ggdGhlIENPRkYgc3BlYy4KKyAgdWludDMyX3QgTnVtYmVyT2ZSdmFBbmRTaXplOworfTsKKworc3RydWN0IERhdGFEaXJlY3RvcnkgeworICB1aW50MzJfdCBSZWxhdGl2ZVZpcnR1YWxBZGRyZXNzOworICB1aW50MzJfdCBTaXplOworfTsKKworZW51bSBEYXRhRGlyZWN0b3J5SW5kZXggOiB1bnNpZ25lZCB7CisgIEVYUE9SVF9UQUJMRSA9IDAsCisgIElNUE9SVF9UQUJMRSwKKyAgUkVTT1VSQ0VfVEFCTEUsCisgIEVYQ0VQVElPTl9UQUJMRSwKKyAgQ0VSVElGSUNBVEVfVEFCTEUsCisgIEJBU0VfUkVMT0NBVElPTl9UQUJMRSwKKyAgREVCVUdfRElSRUNUT1JZLAorICBBUkNISVRFQ1RVUkUsCisgIEdMT0JBTF9QVFIsCisgIFRMU19UQUJMRSwKKyAgTE9BRF9DT05GSUdfVEFCTEUsCisgIEJPVU5EX0lNUE9SVCwKKyAgSUFULAorICBERUxBWV9JTVBPUlRfREVTQ1JJUFRPUiwKKyAgQ0xSX1JVTlRJTUVfSEVBREVSLAorCisgIE5VTV9EQVRBX0RJUkVDVE9SSUVTCit9OworCitlbnVtIFdpbmRvd3NTdWJzeXN0ZW0gOiB1bnNpZ25lZCB7CisgIElNQUdFX1NVQlNZU1RFTV9VTktOT1dOID0gMCwgLy8vPCBBbiB1bmtub3duIHN1YnN5c3RlbS4KKyAgSU1BR0VfU1VCU1lTVEVNX05BVElWRSA9IDEsICAvLy88IERldmljZSBkcml2ZXJzIGFuZCBuYXRpdmUgV2luZG93cyBwcm9jZXNzZXMKKyAgSU1BR0VfU1VCU1lTVEVNX1dJTkRPV1NfR1VJID0gMiwgICAgICAvLy88IFRoZSBXaW5kb3dzIEdVSSBzdWJzeXN0ZW0uCisgIElNQUdFX1NVQlNZU1RFTV9XSU5ET1dTX0NVSSA9IDMsICAgICAgLy8vPCBUaGUgV2luZG93cyBjaGFyYWN0ZXIgc3Vic3lzdGVtLgorICBJTUFHRV9TVUJTWVNURU1fT1MyX0NVSSA9IDUsICAgICAgICAgIC8vLzwgVGhlIE9TLzIgY2hhcmFjdGVyIHN1YnN5dGVtLgorICBJTUFHRV9TVUJTWVNURU1fUE9TSVhfQ1VJID0gNywgICAgICAgIC8vLzwgVGhlIFBPU0lYIGNoYXJhY3RlciBzdWJzeXN0ZW0uCisgIElNQUdFX1NVQlNZU1RFTV9OQVRJVkVfV0lORE9XUyA9IDgsICAgLy8vPCBOYXRpdmUgV2luZG93cyA5eCBkcml2ZXIuCisgIElNQUdFX1NVQlNZU1RFTV9XSU5ET1dTX0NFX0dVSSA9IDksICAgLy8vPCBXaW5kb3dzIENFLgorICBJTUFHRV9TVUJTWVNURU1fRUZJX0FQUExJQ0FUSU9OID0gMTAsIC8vLzwgQW4gRUZJIGFwcGxpY2F0aW9uLgorICBJTUFHRV9TVUJTWVNURU1fRUZJX0JPT1RfU0VSVklDRV9EUklWRVIgPSAxMSwgLy8vPCBBbiBFRkkgZHJpdmVyIHdpdGggYm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vICBzZXJ2aWNlcy4KKyAgSU1BR0VfU1VCU1lTVEVNX0VGSV9SVU5USU1FX0RSSVZFUiA9IDEyLCAgICAgIC8vLzwgQW4gRUZJIGRyaXZlciB3aXRoIHJ1bi10aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gIHNlcnZpY2VzLgorICBJTUFHRV9TVUJTWVNURU1fRUZJX1JPTSA9IDEzLCAgICAgICAgICAgICAgICAgLy8vPCBBbiBFRkkgUk9NIGltYWdlLgorICBJTUFHRV9TVUJTWVNURU1fWEJPWCA9IDE0LCAgICAgICAgICAgICAgICAgICAgLy8vPCBYQk9YLgorICBJTUFHRV9TVUJTWVNURU1fV0lORE9XU19CT09UX0FQUExJQ0FUSU9OID0gMTYgLy8vPCBBIEJDRCBhcHBsaWNhdGlvbi4KK307CisKK2VudW0gRExMQ2hhcmFjdGVyaXN0aWNzIDogdW5zaWduZWQgeworICAvLy8gQVNMUiB3aXRoIDY0IGJpdCBhZGRyZXNzIHNwYWNlLgorICBJTUFHRV9ETExfQ0hBUkFDVEVSSVNUSUNTX0hJR0hfRU5UUk9QWV9WQSA9IDB4MDAyMCwKKyAgLy8vIERMTCBjYW4gYmUgcmVsb2NhdGVkIGF0IGxvYWQgdGltZS4KKyAgSU1BR0VfRExMX0NIQVJBQ1RFUklTVElDU19EWU5BTUlDX0JBU0UgPSAweDAwNDAsCisgIC8vLyBDb2RlIGludGVncml0eSBjaGVja3MgYXJlIGVuZm9yY2VkLgorICBJTUFHRV9ETExfQ0hBUkFDVEVSSVNUSUNTX0ZPUkNFX0lOVEVHUklUWSA9IDB4MDA4MCwKKyAgLy8vPCBJbWFnZSBpcyBOWCBjb21wYXRpYmxlLgorICBJTUFHRV9ETExfQ0hBUkFDVEVSSVNUSUNTX05YX0NPTVBBVCA9IDB4MDEwMCwKKyAgLy8vIElzb2xhdGlvbiBhd2FyZSwgYnV0IGRvIG5vdCBpc29sYXRlIHRoZSBpbWFnZS4KKyAgSU1BR0VfRExMX0NIQVJBQ1RFUklTVElDU19OT19JU09MQVRJT04gPSAweDAyMDAsCisgIC8vLyBEb2VzIG5vdCB1c2Ugc3RydWN0dXJlZCBleGNlcHRpb24gaGFuZGxpbmcgKFNFSCkuIE5vIFNFSCBoYW5kbGVyIG1heSBiZQorICAvLy8gY2FsbGVkIGluIHRoaXMgaW1hZ2UuCisgIElNQUdFX0RMTF9DSEFSQUNURVJJU1RJQ1NfTk9fU0VIID0gMHgwNDAwLAorICAvLy8gRG8gbm90IGJpbmQgdGhlIGltYWdlLgorICBJTUFHRV9ETExfQ0hBUkFDVEVSSVNUSUNTX05PX0JJTkQgPSAweDA4MDAsCisgIC8vLzwgSW1hZ2Ugc2hvdWxkIGV4ZWN1dGUgaW4gYW4gQXBwQ29udGFpbmVyLgorICBJTUFHRV9ETExfQ0hBUkFDVEVSSVNUSUNTX0FQUENPTlRBSU5FUiA9IDB4MTAwMCwKKyAgLy8vPCBBIFdETSBkcml2ZXIuCisgIElNQUdFX0RMTF9DSEFSQUNURVJJU1RJQ1NfV0RNX0RSSVZFUiA9IDB4MjAwMCwKKyAgLy8vPCBJbWFnZSBzdXBwb3J0cyBDb250cm9sIEZsb3cgR3VhcmQuCisgIElNQUdFX0RMTF9DSEFSQUNURVJJU1RJQ1NfR1VBUkRfQ0YgPSAweDQwMDAsCisgIC8vLyBUZXJtaW5hbCBTZXJ2ZXIgYXdhcmUuCisgIElNQUdFX0RMTF9DSEFSQUNURVJJU1RJQ1NfVEVSTUlOQUxfU0VSVkVSX0FXQVJFID0gMHg4MDAwCit9OworCitlbnVtIERlYnVnVHlwZSA6IHVuc2lnbmVkIHsKKyAgSU1BR0VfREVCVUdfVFlQRV9VTktOT1dOID0gMCwKKyAgSU1BR0VfREVCVUdfVFlQRV9DT0ZGID0gMSwKKyAgSU1BR0VfREVCVUdfVFlQRV9DT0RFVklFVyA9IDIsCisgIElNQUdFX0RFQlVHX1RZUEVfRlBPID0gMywKKyAgSU1BR0VfREVCVUdfVFlQRV9NSVNDID0gNCwKKyAgSU1BR0VfREVCVUdfVFlQRV9FWENFUFRJT04gPSA1LAorICBJTUFHRV9ERUJVR19UWVBFX0ZJWFVQID0gNiwKKyAgSU1BR0VfREVCVUdfVFlQRV9PTUFQX1RPX1NSQyA9IDcsCisgIElNQUdFX0RFQlVHX1RZUEVfT01BUF9GUk9NX1NSQyA9IDgsCisgIElNQUdFX0RFQlVHX1RZUEVfQk9STEFORCA9IDksCisgIElNQUdFX0RFQlVHX1RZUEVfUkVTRVJWRUQxMCA9IDEwLAorICBJTUFHRV9ERUJVR19UWVBFX0NMU0lEID0gMTEsCisgIElNQUdFX0RFQlVHX1RZUEVfVkNfRkVBVFVSRSA9IDEyLAorICBJTUFHRV9ERUJVR19UWVBFX1BPR08gPSAxMywKKyAgSU1BR0VfREVCVUdfVFlQRV9JTFRDRyA9IDE0LAorICBJTUFHRV9ERUJVR19UWVBFX01QWCA9IDE1LAorICBJTUFHRV9ERUJVR19UWVBFX1JFUFJPID0gMTYsCit9OworCitlbnVtIEJhc2VSZWxvY2F0aW9uVHlwZSA6IHVuc2lnbmVkIHsKKyAgSU1BR0VfUkVMX0JBU0VEX0FCU09MVVRFID0gMCwKKyAgSU1BR0VfUkVMX0JBU0VEX0hJR0ggPSAxLAorICBJTUFHRV9SRUxfQkFTRURfTE9XID0gMiwKKyAgSU1BR0VfUkVMX0JBU0VEX0hJR0hMT1cgPSAzLAorICBJTUFHRV9SRUxfQkFTRURfSElHSEFESiA9IDQsCisgIElNQUdFX1JFTF9CQVNFRF9NSVBTX0pNUEFERFIgPSA1LAorICBJTUFHRV9SRUxfQkFTRURfQVJNX01PVjMyQSA9IDUsCisgIElNQUdFX1JFTF9CQVNFRF9BUk1fTU9WMzJUID0gNywKKyAgSU1BR0VfUkVMX0JBU0VEX01JUFNfSk1QQUREUjE2ID0gOSwKKyAgSU1BR0VfUkVMX0JBU0VEX0RJUjY0ID0gMTAKK307CisKK2VudW0gSW1wb3J0VHlwZSA6IHVuc2lnbmVkIHsKKyAgSU1QT1JUX0NPREUgPSAwLAorICBJTVBPUlRfREFUQSA9IDEsCisgIElNUE9SVF9DT05TVCA9IDIKK307CisKK2VudW0gSW1wb3J0TmFtZVR5cGUgOiB1bnNpZ25lZCB7CisgIC8vLyBJbXBvcnQgaXMgYnkgb3JkaW5hbC4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgdmFsdWUgaW4gdGhlIE9yZGluYWwvSGludAorICAvLy8gZmllbGQgb2YgdGhlIGltcG9ydCBoZWFkZXIgaXMgdGhlIGltcG9ydCdzIG9yZGluYWwuIElmIHRoaXMgY29uc3RhbnQgaXMKKyAgLy8vIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlIE9yZGluYWwvSGludCBmaWVsZCBzaG91bGQgYWx3YXlzIGJlIGludGVycHJldGVkCisgIC8vLyBhcyB0aGUgaW1wb3J0J3MgaGludC4KKyAgSU1QT1JUX09SRElOQUwgPSAwLAorICAvLy8gVGhlIGltcG9ydCBuYW1lIGlzIGlkZW50aWNhbCB0byB0aGUgcHVibGljIHN5bWJvbCBuYW1lCisgIElNUE9SVF9OQU1FID0gMSwKKyAgLy8vIFRoZSBpbXBvcnQgbmFtZSBpcyB0aGUgcHVibGljIHN5bWJvbCBuYW1lLCBidXQgc2tpcHBpbmcgdGhlIGxlYWRpbmcgPywKKyAgLy8vIEAsIG9yIG9wdGlvbmFsbHkgXy4KKyAgSU1QT1JUX05BTUVfTk9QUkVGSVggPSAyLAorICAvLy8gVGhlIGltcG9ydCBuYW1lIGlzIHRoZSBwdWJsaWMgc3ltYm9sIG5hbWUsIGJ1dCBza2lwcGluZyB0aGUgbGVhZGluZyA/LAorICAvLy8gQCwgb3Igb3B0aW9uYWxseSBfLCBhbmQgdHJ1bmNhdGluZyBhdCB0aGUgZmlyc3QgQC4KKyAgSU1QT1JUX05BTUVfVU5ERUNPUkFURSA9IDMKK307CisKK3N0cnVjdCBJbXBvcnRIZWFkZXIgeworICB1aW50MTZfdCBTaWcxOyAvLy88IE11c3QgYmUgSU1BR0VfRklMRV9NQUNISU5FX1VOS05PV04gKDApLgorICB1aW50MTZfdCBTaWcyOyAvLy88IE11c3QgYmUgMHhGRkZGLgorICB1aW50MTZfdCBWZXJzaW9uOworICB1aW50MTZfdCBNYWNoaW5lOworICB1aW50MzJfdCBUaW1lRGF0ZVN0YW1wOworICB1aW50MzJfdCBTaXplT2ZEYXRhOworICB1aW50MTZfdCBPcmRpbmFsSGludDsKKyAgdWludDE2X3QgVHlwZUluZm87CisKKyAgSW1wb3J0VHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8SW1wb3J0VHlwZT4oVHlwZUluZm8gJiAweDMpOyB9CisKKyAgSW1wb3J0TmFtZVR5cGUgZ2V0TmFtZVR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEltcG9ydE5hbWVUeXBlPigoVHlwZUluZm8gJiAweDFDKSA+PiAyKTsKKyAgfQorfTsKKworZW51bSBDb2RlVmlld0lkZW50aWZpZXJzIHsKKyAgREVCVUdfU0VDVElPTl9NQUdJQyA9IDB4NCwKKyAgREVCVUdfSEFTSEVTX1NFQ1RJT05fTUFHSUMgPSAweDEzM0M5QzUKK307CisKK2lubGluZSBib29sIGlzUmVzZXJ2ZWRTZWN0aW9uTnVtYmVyKGludDMyX3QgU2VjdGlvbk51bWJlcikgeworICByZXR1cm4gU2VjdGlvbk51bWJlciA8PSAwOworfQorCit9IC8vIEVuZCBuYW1lc3BhY2UgQ09GRi4KK30gLy8gRW5kIG5hbWVzcGFjZSBsbHZtLgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2UyNTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmCkBAIC0wLDAgKzEsOTEwIEBACisvLz09PS0gbGx2bS9TdXBwb3J0L0R3YXJmLmRlZiAtIER3YXJmIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE1hY3JvcyBmb3IgcnVubmluZyB0aHJvdWdoIER3YXJmIGVudW1lcmF0b3JzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFRPRE86IEFkZCBvdGhlciBEVy1iYXNlZCBtYWNyb3MuCisjaWYgISggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRlZmluZWQgSEFORExFX0RXX1RBRyB8fCBkZWZpbmVkIEhBTkRMRV9EV19BVCB8fCBkZWZpbmVkIEhBTkRMRV9EV19GT1JNIHx8IFwKKyAgICBkZWZpbmVkIEhBTkRMRV9EV19PUCB8fCBkZWZpbmVkIEhBTkRMRV9EV19MQU5HIHx8IGRlZmluZWQgSEFORExFX0RXX0FURSB8fCBcCisgICAgZGVmaW5lZCBIQU5ETEVfRFdfVklSVFVBTElUWSB8fCBkZWZpbmVkIEhBTkRMRV9EV19ERUZBVUxURUQgfHwgICAgICAgICAgICAgXAorICAgIGRlZmluZWQgSEFORExFX0RXX0NDIHx8IGRlZmluZWQgSEFORExFX0RXX0xOUyB8fCBkZWZpbmVkIEhBTkRMRV9EV19MTkUgfHwgIFwKKyAgICBkZWZpbmVkIEhBTkRMRV9EV19MTkNUIHx8IGRlZmluZWQgSEFORExFX0RXX01BQ1JPIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVmaW5lZCBIQU5ETEVfRFdfUkxFIHx8IGRlZmluZWQgSEFORExFX0RXX0NGQSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRlZmluZWQgSEFORExFX0RXX0FQUExFX1BST1BFUlRZIHx8IGRlZmluZWQgSEFORExFX0RXX1VUIHx8ICAgICAgICAgICAgICAgIFwKKyAgICBkZWZpbmVkIEhBTkRMRV9EV0FSRl9TRUNUSU9OIHx8IGRlZmluZWQgSEFORExFX0RXX0lEWCkKKyNlcnJvciAiTWlzc2luZyBtYWNybyBkZWZpbml0aW9uIG9mIEhBTkRMRV9EVyoiCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfRFdfVEFHCisjZGVmaW5lIEhBTkRMRV9EV19UQUcoSUQsIE5BTUUsIFZFUlNJT04sIFZFTkRPUikKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9EV19BVAorI2RlZmluZSBIQU5ETEVfRFdfQVQoSUQsIE5BTUUsIFZFUlNJT04sIFZFTkRPUikKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9EV19GT1JNCisjZGVmaW5lIEhBTkRMRV9EV19GT1JNKElELCBOQU1FLCBWRVJTSU9OLCBWRU5ET1IpCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfRFdfT1AKKyNkZWZpbmUgSEFORExFX0RXX09QKElELCBOQU1FLCBWRVJTSU9OLCBWRU5ET1IpCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfRFdfTEFORworI2RlZmluZSBIQU5ETEVfRFdfTEFORyhJRCwgTkFNRSwgVkVSU0lPTiwgVkVORE9SKQorI2VuZGlmCisKKyNpZm5kZWYgSEFORExFX0RXX0FURQorI2RlZmluZSBIQU5ETEVfRFdfQVRFKElELCBOQU1FLCBWRVJTSU9OLCBWRU5ET1IpCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfRFdfVklSVFVBTElUWQorI2RlZmluZSBIQU5ETEVfRFdfVklSVFVBTElUWShJRCwgTkFNRSkKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9EV19ERUZBVUxURUQKKyNkZWZpbmUgSEFORExFX0RXX0RFRkFVTFRFRChJRCwgTkFNRSkKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9EV19DQworI2RlZmluZSBIQU5ETEVfRFdfQ0MoSUQsIE5BTUUpCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfRFdfTE5TCisjZGVmaW5lIEhBTkRMRV9EV19MTlMoSUQsIE5BTUUpCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfRFdfTE5FCisjZGVmaW5lIEhBTkRMRV9EV19MTkUoSUQsIE5BTUUpCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfRFdfTE5DVAorI2RlZmluZSBIQU5ETEVfRFdfTE5DVChJRCwgTkFNRSkKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9EV19NQUNSTworI2RlZmluZSBIQU5ETEVfRFdfTUFDUk8oSUQsIE5BTUUpCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfRFdfUkxFCisjZGVmaW5lIEhBTkRMRV9EV19STEUoSUQsIE5BTUUpCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfRFdfQ0ZBCisjZGVmaW5lIEhBTkRMRV9EV19DRkEoSUQsIE5BTUUpCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfRFdfQVBQTEVfUFJPUEVSVFkKKyNkZWZpbmUgSEFORExFX0RXX0FQUExFX1BST1BFUlRZKElELCBOQU1FKQorI2VuZGlmCisKKyNpZm5kZWYgSEFORExFX0RXX1VUCisjZGVmaW5lIEhBTkRMRV9EV19VVChJRCwgTkFNRSkKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9EV0FSRl9TRUNUSU9OCisjZGVmaW5lIEhBTkRMRV9EV0FSRl9TRUNUSU9OKEVOVU1fTkFNRSwgRUxGX05BTUUsIENNRExJTkVfTkFNRSkKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9EV19JRFgKKyNkZWZpbmUgSEFORExFX0RXX0lEWChJRCwgTkFNRSkKKyNlbmRpZgorCitIQU5ETEVfRFdfVEFHKDB4MDAwMCwgbnVsbCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAwMSwgYXJyYXlfdHlwZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAwMiwgY2xhc3NfdHlwZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAwMywgZW50cnlfcG9pbnQsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMDQsIGVudW1lcmF0aW9uX3R5cGUsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMDUsIGZvcm1hbF9wYXJhbWV0ZXIsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMDgsIGltcG9ydGVkX2RlY2xhcmF0aW9uLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDBhLCBsYWJlbCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAwYiwgbGV4aWNhbF9ibG9jaywgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAwZCwgbWVtYmVyLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDBmLCBwb2ludGVyX3R5cGUsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMTAsIHJlZmVyZW5jZV90eXBlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDExLCBjb21waWxlX3VuaXQsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMTIsIHN0cmluZ190eXBlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDEzLCBzdHJ1Y3R1cmVfdHlwZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAxNSwgc3Vicm91dGluZV90eXBlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDE2LCB0eXBlZGVmLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDE3LCB1bmlvbl90eXBlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDE4LCB1bnNwZWNpZmllZF9wYXJhbWV0ZXJzLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDE5LCB2YXJpYW50LCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDFhLCBjb21tb25fYmxvY2ssIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMWIsIGNvbW1vbl9pbmNsdXNpb24sIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMWMsIGluaGVyaXRhbmNlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDFkLCBpbmxpbmVkX3N1YnJvdXRpbmUsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMWUsIG1vZHVsZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAxZiwgcHRyX3RvX21lbWJlcl90eXBlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDIwLCBzZXRfdHlwZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAyMSwgc3VicmFuZ2VfdHlwZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAyMiwgd2l0aF9zdG10LCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDIzLCBhY2Nlc3NfZGVjbGFyYXRpb24sIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMjQsIGJhc2VfdHlwZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAyNSwgY2F0Y2hfYmxvY2ssIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMjYsIGNvbnN0X3R5cGUsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMjcsIGNvbnN0YW50LCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDI4LCBlbnVtZXJhdG9yLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDI5LCBmaWxlX3R5cGUsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMmEsIGZyaWVuZCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAyYiwgbmFtZWxpc3QsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMmMsIG5hbWVsaXN0X2l0ZW0sIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMmQsIHBhY2tlZF90eXBlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDJlLCBzdWJwcm9ncmFtLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDJmLCB0ZW1wbGF0ZV90eXBlX3BhcmFtZXRlciwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAzMCwgdGVtcGxhdGVfdmFsdWVfcGFyYW1ldGVyLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDMxLCB0aHJvd25fdHlwZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAzMiwgdHJ5X2Jsb2NrLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDMzLCB2YXJpYW50X3BhcnQsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMzQsIHZhcmlhYmxlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDM1LCB2b2xhdGlsZV90eXBlLCAyLCBEV0FSRikKKy8vIE5ldyBpbiBEV0FSRiB2MzoKK0hBTkRMRV9EV19UQUcoMHgwMDM2LCBkd2FyZl9wcm9jZWR1cmUsIDMsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMzcsIHJlc3RyaWN0X3R5cGUsIDMsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMzgsIGludGVyZmFjZV90eXBlLCAzLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDM5LCBuYW1lc3BhY2UsIDMsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwM2EsIGltcG9ydGVkX21vZHVsZSwgMywgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAzYiwgdW5zcGVjaWZpZWRfdHlwZSwgMywgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAzYywgcGFydGlhbF91bml0LCAzLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDNkLCBpbXBvcnRlZF91bml0LCAzLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDNmLCBjb25kaXRpb24sIDMsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwNDAsIHNoYXJlZF90eXBlLCAzLCBEV0FSRikKKy8vIE5ldyBpbiBEV0FSRiB2NDoKK0hBTkRMRV9EV19UQUcoMHgwMDQxLCB0eXBlX3VuaXQsIDQsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwNDIsIHJ2YWx1ZV9yZWZlcmVuY2VfdHlwZSwgNCwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDA0MywgdGVtcGxhdGVfYWxpYXMsIDQsIERXQVJGKQorLy8gTmV3IGluIERXQVJGIHY1OgorSEFORExFX0RXX1RBRygweDAwNDQsIGNvYXJyYXlfdHlwZSwgNSwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDA0NSwgZ2VuZXJpY19zdWJyYW5nZSwgNSwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDA0NiwgZHluYW1pY190eXBlLCA1LCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDQ3LCBhdG9taWNfdHlwZSwgNSwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDA0OCwgY2FsbF9zaXRlLCA1LCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDQ5LCBjYWxsX3NpdGVfcGFyYW1ldGVyLCA1LCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDRhLCBza2VsZXRvbl91bml0LCA1LCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDRiLCBpbW11dGFibGVfdHlwZSwgNSwgRFdBUkYpCisvLyBWZW5kb3IgZXh0ZW5zaW9uczoKK0hBTkRMRV9EV19UQUcoMHg0MDgxLCBNSVBTX2xvb3AsIDAsIE1JUFMpCitIQU5ETEVfRFdfVEFHKDB4NDEwMSwgZm9ybWF0X2xhYmVsLCAwLCBHTlUpCitIQU5ETEVfRFdfVEFHKDB4NDEwMiwgZnVuY3Rpb25fdGVtcGxhdGUsIDAsIEdOVSkKK0hBTkRMRV9EV19UQUcoMHg0MTAzLCBjbGFzc190ZW1wbGF0ZSwgMCwgR05VKQorSEFORExFX0RXX1RBRygweDQxMDYsIEdOVV90ZW1wbGF0ZV90ZW1wbGF0ZV9wYXJhbSwgMCwgR05VKQorSEFORExFX0RXX1RBRygweDQxMDcsIEdOVV90ZW1wbGF0ZV9wYXJhbWV0ZXJfcGFjaywgMCwgR05VKQorSEFORExFX0RXX1RBRygweDQxMDgsIEdOVV9mb3JtYWxfcGFyYW1ldGVyX3BhY2ssIDAsIEdOVSkKK0hBTkRMRV9EV19UQUcoMHg0MTA5LCBHTlVfY2FsbF9zaXRlLCAwLCBHTlUpCitIQU5ETEVfRFdfVEFHKDB4NDEwYSwgR05VX2NhbGxfc2l0ZV9wYXJhbWV0ZXIsIDAsIEdOVSkKK0hBTkRMRV9EV19UQUcoMHg0MjAwLCBBUFBMRV9wcm9wZXJ0eSwgMCwgQVBQTEUpCitIQU5ETEVfRFdfVEFHKDB4YjAwMCwgQk9STEFORF9wcm9wZXJ0eSwgMCwgQk9STEFORCkKK0hBTkRMRV9EV19UQUcoMHhiMDAxLCBCT1JMQU5EX0RlbHBoaV9zdHJpbmcsIDAsIEJPUkxBTkQpCitIQU5ETEVfRFdfVEFHKDB4YjAwMiwgQk9STEFORF9EZWxwaGlfZHluYW1pY19hcnJheSwgMCwgQk9STEFORCkKK0hBTkRMRV9EV19UQUcoMHhiMDAzLCBCT1JMQU5EX0RlbHBoaV9zZXQsIDAsIEJPUkxBTkQpCitIQU5ETEVfRFdfVEFHKDB4YjAwNCwgQk9STEFORF9EZWxwaGlfdmFyaWFudCwgMCwgQk9STEFORCkKKworLy8gQXR0cmlidXRlcy4KK0hBTkRMRV9EV19BVCgweDAxLCBzaWJsaW5nLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDAyLCBsb2NhdGlvbiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgwMywgbmFtZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgwOSwgb3JkZXJpbmcsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MGIsIGJ5dGVfc2l6ZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgwYywgYml0X29mZnNldCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgwZCwgYml0X3NpemUsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MTAsIHN0bXRfbGlzdCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgxMSwgbG93X3BjLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDEyLCBoaWdoX3BjLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDEzLCBsYW5ndWFnZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgxNSwgZGlzY3IsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MTYsIGRpc2NyX3ZhbHVlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDE3LCB2aXNpYmlsaXR5LCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDE4LCBpbXBvcnQsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MTksIHN0cmluZ19sZW5ndGgsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MWEsIGNvbW1vbl9yZWZlcmVuY2UsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MWIsIGNvbXBfZGlyLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDFjLCBjb25zdF92YWx1ZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgxZCwgY29udGFpbmluZ190eXBlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDFlLCBkZWZhdWx0X3ZhbHVlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDIwLCBpbmxpbmUsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MjEsIGlzX29wdGlvbmFsLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDIyLCBsb3dlcl9ib3VuZCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgyNSwgcHJvZHVjZXIsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MjcsIHByb3RvdHlwZWQsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MmEsIHJldHVybl9hZGRyLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDJjLCBzdGFydF9zY29wZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgyZSwgYml0X3N0cmlkZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgyZiwgdXBwZXJfYm91bmQsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MzEsIGFic3RyYWN0X29yaWdpbiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgzMiwgYWNjZXNzaWJpbGl0eSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgzMywgYWRkcmVzc19jbGFzcywgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgzNCwgYXJ0aWZpY2lhbCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgzNSwgYmFzZV90eXBlcywgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgzNiwgY2FsbGluZ19jb252ZW50aW9uLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDM3LCBjb3VudCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgzOCwgZGF0YV9tZW1iZXJfbG9jYXRpb24sIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MzksIGRlY2xfY29sdW1uLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDNhLCBkZWNsX2ZpbGUsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4M2IsIGRlY2xfbGluZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgzYywgZGVjbGFyYXRpb24sIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4M2QsIGRpc2NyX2xpc3QsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4M2UsIGVuY29kaW5nLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDNmLCBleHRlcm5hbCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg0MCwgZnJhbWVfYmFzZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg0MSwgZnJpZW5kLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDQyLCBpZGVudGlmaWVyX2Nhc2UsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NDMsIG1hY3JvX2luZm8sIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NDQsIG5hbWVsaXN0X2l0ZW0sIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NDUsIHByaW9yaXR5LCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDQ2LCBzZWdtZW50LCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDQ3LCBzcGVjaWZpY2F0aW9uLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDQ4LCBzdGF0aWNfbGluaywgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg0OSwgdHlwZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg0YSwgdXNlX2xvY2F0aW9uLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDRiLCB2YXJpYWJsZV9wYXJhbWV0ZXIsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NGMsIHZpcnR1YWxpdHksIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NGQsIHZ0YWJsZV9lbGVtX2xvY2F0aW9uLCAyLCBEV0FSRikKKy8vIE5ldyBpbiBEV0FSRiB2MzoKK0hBTkRMRV9EV19BVCgweDRlLCBhbGxvY2F0ZWQsIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NGYsIGFzc29jaWF0ZWQsIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NTAsIGRhdGFfbG9jYXRpb24sIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NTEsIGJ5dGVfc3RyaWRlLCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDUyLCBlbnRyeV9wYywgMywgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg1MywgdXNlX1VURjgsIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NTQsIGV4dGVuc2lvbiwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg1NSwgcmFuZ2VzLCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDU2LCB0cmFtcG9saW5lLCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDU3LCBjYWxsX2NvbHVtbiwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg1OCwgY2FsbF9maWxlLCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDU5LCBjYWxsX2xpbmUsIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NWEsIGRlc2NyaXB0aW9uLCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDViLCBiaW5hcnlfc2NhbGUsIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NWMsIGRlY2ltYWxfc2NhbGUsIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NWQsIHNtYWxsLCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDVlLCBkZWNpbWFsX3NpZ24sIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NWYsIGRpZ2l0X2NvdW50LCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDYwLCBwaWN0dXJlX3N0cmluZywgMywgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg2MSwgbXV0YWJsZSwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg2MiwgdGhyZWFkc19zY2FsZWQsIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NjMsIGV4cGxpY2l0LCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDY0LCBvYmplY3RfcG9pbnRlciwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg2NSwgZW5kaWFuaXR5LCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDY2LCBlbGVtZW50YWwsIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NjcsIHB1cmUsIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NjgsIHJlY3Vyc2l2ZSwgMywgRFdBUkYpCisvLyBOZXcgaW4gRFdBUkYgdjQ6CitIQU5ETEVfRFdfQVQoMHg2OSwgc2lnbmF0dXJlLCA0LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDZhLCBtYWluX3N1YnByb2dyYW0sIDQsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NmIsIGRhdGFfYml0X29mZnNldCwgNCwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg2YywgY29uc3RfZXhwciwgNCwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg2ZCwgZW51bV9jbGFzcywgNCwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg2ZSwgbGlua2FnZV9uYW1lLCA0LCBEV0FSRikKKy8vIE5ldyBpbiBEV0FSRiB2NToKK0hBTkRMRV9EV19BVCgweDZmLCBzdHJpbmdfbGVuZ3RoX2JpdF9zaXplLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDcwLCBzdHJpbmdfbGVuZ3RoX2J5dGVfc2l6ZSwgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg3MSwgcmFuaywgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg3Miwgc3RyX29mZnNldHNfYmFzZSwgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg3MywgYWRkcl9iYXNlLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDc0LCBybmdsaXN0c19iYXNlLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDc1LCBkd29faWQsIDAsIERXQVJGKSAvLy88IFJldHJhY3RlZCBmcm9tIERXQVJGIHY1LgorSEFORExFX0RXX0FUKDB4NzYsIGR3b19uYW1lLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDc3LCByZWZlcmVuY2UsIDUsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NzgsIHJ2YWx1ZV9yZWZlcmVuY2UsIDUsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NzksIG1hY3JvcywgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg3YSwgY2FsbF9hbGxfY2FsbHMsIDUsIERXQVJGKQorSEFORExFX0RXX0FUKDB4N2IsIGNhbGxfYWxsX3NvdXJjZV9jYWxscywgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg3YywgY2FsbF9hbGxfdGFpbF9jYWxscywgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg3ZCwgY2FsbF9yZXR1cm5fcGMsIDUsIERXQVJGKQorSEFORExFX0RXX0FUKDB4N2UsIGNhbGxfdmFsdWUsIDUsIERXQVJGKQorSEFORExFX0RXX0FUKDB4N2YsIGNhbGxfb3JpZ2luLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDgwLCBjYWxsX3BhcmFtZXRlciwgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg4MSwgY2FsbF9wYywgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg4MiwgY2FsbF90YWlsX2NhbGwsIDUsIERXQVJGKQorSEFORExFX0RXX0FUKDB4ODMsIGNhbGxfdGFyZ2V0LCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDg0LCBjYWxsX3RhcmdldF9jbG9iYmVyZWQsIDUsIERXQVJGKQorSEFORExFX0RXX0FUKDB4ODUsIGNhbGxfZGF0YV9sb2NhdGlvbiwgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg4NiwgY2FsbF9kYXRhX3ZhbHVlLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDg3LCBub3JldHVybiwgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg4OCwgYWxpZ25tZW50LCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDg5LCBleHBvcnRfc3ltYm9scywgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg4YSwgZGVsZXRlZCwgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg4YiwgZGVmYXVsdGVkLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDhjLCBsb2NsaXN0c19iYXNlLCA1LCBEV0FSRikKKy8vIFZlbmRvciBleHRlbnNpb25zOgorSEFORExFX0RXX0FUKDB4MjAwMiwgTUlQU19sb29wX2JlZ2luLCAwLCBNSVBTKQorSEFORExFX0RXX0FUKDB4MjAwMywgTUlQU190YWlsX2xvb3BfYmVnaW4sIDAsIE1JUFMpCitIQU5ETEVfRFdfQVQoMHgyMDA0LCBNSVBTX2VwaWxvZ19iZWdpbiwgMCwgTUlQUykKK0hBTkRMRV9EV19BVCgweDIwMDUsIE1JUFNfbG9vcF91bnJvbGxfZmFjdG9yLCAwLCBNSVBTKQorSEFORExFX0RXX0FUKDB4MjAwNiwgTUlQU19zb2Z0d2FyZV9waXBlbGluZV9kZXB0aCwgMCwgTUlQUykKK0hBTkRMRV9EV19BVCgweDIwMDcsIE1JUFNfbGlua2FnZV9uYW1lLCAwLCBNSVBTKQorSEFORExFX0RXX0FUKDB4MjAwOCwgTUlQU19zdHJpZGUsIDAsIE1JUFMpCitIQU5ETEVfRFdfQVQoMHgyMDA5LCBNSVBTX2Fic3RyYWN0X25hbWUsIDAsIE1JUFMpCitIQU5ETEVfRFdfQVQoMHgyMDBhLCBNSVBTX2Nsb25lX29yaWdpbiwgMCwgTUlQUykKK0hBTkRMRV9EV19BVCgweDIwMGIsIE1JUFNfaGFzX2lubGluZXMsIDAsIE1JUFMpCitIQU5ETEVfRFdfQVQoMHgyMDBjLCBNSVBTX3N0cmlkZV9ieXRlLCAwLCBNSVBTKQorSEFORExFX0RXX0FUKDB4MjAwZCwgTUlQU19zdHJpZGVfZWxlbSwgMCwgTUlQUykKK0hBTkRMRV9EV19BVCgweDIwMGUsIE1JUFNfcHRyX2RvcGV0eXBlLCAwLCBNSVBTKQorSEFORExFX0RXX0FUKDB4MjAwZiwgTUlQU19hbGxvY2F0YWJsZV9kb3BldHlwZSwgMCwgTUlQUykKK0hBTkRMRV9EV19BVCgweDIwMTAsIE1JUFNfYXNzdW1lZF9zaGFwZV9kb3BldHlwZSwgMCwgTUlQUykKKy8vIFRoaXMgb25lIGFwcGVhcnMgdG8gaGF2ZSBvbmx5IGJlZW4gaW1wbGVtZW50ZWQgYnkgT3BlbjY0IGZvcgorLy8gZm9ydHJhbiBhbmQgbWF5IGNvbmZsaWN0IHdpdGggb3RoZXIgZXh0ZW5zaW9ucy4KK0hBTkRMRV9EV19BVCgweDIwMTEsIE1JUFNfYXNzdW1lZF9zaXplLCAwLCBNSVBTKQorLy8gR05VIGV4dGVuc2lvbnMKK0hBTkRMRV9EV19BVCgweDIxMDEsIHNmX25hbWVzLCAwLCBHTlUpCitIQU5ETEVfRFdfQVQoMHgyMTAyLCBzcmNfaW5mbywgMCwgR05VKQorSEFORExFX0RXX0FUKDB4MjEwMywgbWFjX2luZm8sIDAsIEdOVSkKK0hBTkRMRV9EV19BVCgweDIxMDQsIHNyY19jb29yZHMsIDAsIEdOVSkKK0hBTkRMRV9EV19BVCgweDIxMDUsIGJvZHlfYmVnaW4sIDAsIEdOVSkKK0hBTkRMRV9EV19BVCgweDIxMDYsIGJvZHlfZW5kLCAwLCBHTlUpCitIQU5ETEVfRFdfQVQoMHgyMTA3LCBHTlVfdmVjdG9yLCAwLCBHTlUpCitIQU5ETEVfRFdfQVQoMHgyMTEwLCBHTlVfdGVtcGxhdGVfbmFtZSwgMCwgR05VKQorSEFORExFX0RXX0FUKDB4MjEwZiwgR05VX29kcl9zaWduYXR1cmUsIDAsIEdOVSkKK0hBTkRMRV9EV19BVCgweDIxMTEsIEdOVV9jYWxsX3NpdGVfdmFsdWUsIDAsIEdOVSkKK0hBTkRMRV9EV19BVCgweDIxMTcsIEdOVV9hbGxfY2FsbF9zaXRlcywgMCwgR05VKQorSEFORExFX0RXX0FUKDB4MjExOSwgR05VX21hY3JvcywgMCwgR05VKQorLy8gRXh0ZW5zaW9ucyBmb3IgRmlzc2lvbiBwcm9wb3NhbC4KK0hBTkRMRV9EV19BVCgweDIxMzAsIEdOVV9kd29fbmFtZSwgMCwgR05VKQorSEFORExFX0RXX0FUKDB4MjEzMSwgR05VX2R3b19pZCwgMCwgR05VKQorSEFORExFX0RXX0FUKDB4MjEzMiwgR05VX3Jhbmdlc19iYXNlLCAwLCBHTlUpCitIQU5ETEVfRFdfQVQoMHgyMTMzLCBHTlVfYWRkcl9iYXNlLCAwLCBHTlUpCitIQU5ETEVfRFdfQVQoMHgyMTM0LCBHTlVfcHVibmFtZXMsIDAsIEdOVSkKK0hBTkRMRV9EV19BVCgweDIxMzUsIEdOVV9wdWJ0eXBlcywgMCwgR05VKQorSEFORExFX0RXX0FUKDB4MjEzNiwgR05VX2Rpc2NyaW1pbmF0b3IsIDAsIEdOVSkKKy8vIEJvcmxhbmQgZXh0ZW5zaW9ucy4KK0hBTkRMRV9EV19BVCgweDNiMTEsIEJPUkxBTkRfcHJvcGVydHlfcmVhZCwgMCwgQk9STEFORCkKK0hBTkRMRV9EV19BVCgweDNiMTIsIEJPUkxBTkRfcHJvcGVydHlfd3JpdGUsIDAsIEJPUkxBTkQpCitIQU5ETEVfRFdfQVQoMHgzYjEzLCBCT1JMQU5EX3Byb3BlcnR5X2ltcGxlbWVudHMsIDAsIEJPUkxBTkQpCitIQU5ETEVfRFdfQVQoMHgzYjE0LCBCT1JMQU5EX3Byb3BlcnR5X2luZGV4LCAwLCBCT1JMQU5EKQorSEFORExFX0RXX0FUKDB4M2IxNSwgQk9STEFORF9wcm9wZXJ0eV9kZWZhdWx0LCAwLCBCT1JMQU5EKQorSEFORExFX0RXX0FUKDB4M2IyMCwgQk9STEFORF9EZWxwaGlfdW5pdCwgMCwgQk9STEFORCkKK0hBTkRMRV9EV19BVCgweDNiMjEsIEJPUkxBTkRfRGVscGhpX2NsYXNzLCAwLCBCT1JMQU5EKQorSEFORExFX0RXX0FUKDB4M2IyMiwgQk9STEFORF9EZWxwaGlfcmVjb3JkLCAwLCBCT1JMQU5EKQorSEFORExFX0RXX0FUKDB4M2IyMywgQk9STEFORF9EZWxwaGlfbWV0YWNsYXNzLCAwLCBCT1JMQU5EKQorSEFORExFX0RXX0FUKDB4M2IyNCwgQk9STEFORF9EZWxwaGlfY29uc3RydWN0b3IsIDAsIEJPUkxBTkQpCitIQU5ETEVfRFdfQVQoMHgzYjI1LCBCT1JMQU5EX0RlbHBoaV9kZXN0cnVjdG9yLCAwLCBCT1JMQU5EKQorSEFORExFX0RXX0FUKDB4M2IyNiwgQk9STEFORF9EZWxwaGlfYW5vbnltb3VzX21ldGhvZCwgMCwgQk9STEFORCkKK0hBTkRMRV9EV19BVCgweDNiMjcsIEJPUkxBTkRfRGVscGhpX2ludGVyZmFjZSwgMCwgQk9STEFORCkKK0hBTkRMRV9EV19BVCgweDNiMjgsIEJPUkxBTkRfRGVscGhpX0FCSSwgMCwgQk9STEFORCkKK0hBTkRMRV9EV19BVCgweDNiMjksIEJPUkxBTkRfRGVscGhpX3JldHVybiwgMCwgQk9STEFORCkKK0hBTkRMRV9EV19BVCgweDNiMzAsIEJPUkxBTkRfRGVscGhpX2ZyYW1lcHRyLCAwLCBCT1JMQU5EKQorSEFORExFX0RXX0FUKDB4M2IzMSwgQk9STEFORF9jbG9zdXJlLCAwLCBCT1JMQU5EKQorLy8gTExWTSBwcm9qZWN0IGV4dGVuc2lvbnMuCitIQU5ETEVfRFdfQVQoMHgzZTAwLCBMTFZNX2luY2x1ZGVfcGF0aCwgMCwgTExWTSkKK0hBTkRMRV9EV19BVCgweDNlMDEsIExMVk1fY29uZmlnX21hY3JvcywgMCwgTExWTSkKK0hBTkRMRV9EV19BVCgweDNlMDIsIExMVk1faXN5c3Jvb3QsIDAsIExMVk0pCisvLyBBcHBsZSBleHRlbnNpb25zLgorSEFORExFX0RXX0FUKDB4M2ZlMSwgQVBQTEVfb3B0aW1pemVkLCAwLCBBUFBMRSkKK0hBTkRMRV9EV19BVCgweDNmZTIsIEFQUExFX2ZsYWdzLCAwLCBBUFBMRSkKK0hBTkRMRV9EV19BVCgweDNmZTMsIEFQUExFX2lzYSwgMCwgQVBQTEUpCitIQU5ETEVfRFdfQVQoMHgzZmU0LCBBUFBMRV9ibG9jaywgMCwgQVBQTEUpCitIQU5ETEVfRFdfQVQoMHgzZmU1LCBBUFBMRV9tYWpvcl9ydW50aW1lX3ZlcnMsIDAsIEFQUExFKQorSEFORExFX0RXX0FUKDB4M2ZlNiwgQVBQTEVfcnVudGltZV9jbGFzcywgMCwgQVBQTEUpCitIQU5ETEVfRFdfQVQoMHgzZmU3LCBBUFBMRV9vbWl0X2ZyYW1lX3B0ciwgMCwgQVBQTEUpCitIQU5ETEVfRFdfQVQoMHgzZmU4LCBBUFBMRV9wcm9wZXJ0eV9uYW1lLCAwLCBBUFBMRSkKK0hBTkRMRV9EV19BVCgweDNmZTksIEFQUExFX3Byb3BlcnR5X2dldHRlciwgMCwgQVBQTEUpCitIQU5ETEVfRFdfQVQoMHgzZmVhLCBBUFBMRV9wcm9wZXJ0eV9zZXR0ZXIsIDAsIEFQUExFKQorSEFORExFX0RXX0FUKDB4M2ZlYiwgQVBQTEVfcHJvcGVydHlfYXR0cmlidXRlLCAwLCBBUFBMRSkKK0hBTkRMRV9EV19BVCgweDNmZWMsIEFQUExFX29iamNfY29tcGxldGVfdHlwZSwgMCwgQVBQTEUpCitIQU5ETEVfRFdfQVQoMHgzZmVkLCBBUFBMRV9wcm9wZXJ0eSwgMCwgQVBQTEUpCisKKy8vIEF0dHJpYnV0ZSBmb3JtIGVuY29kaW5ncy4KK0hBTkRMRV9EV19GT1JNKDB4MDEsIGFkZHIsIDIsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgwMywgYmxvY2syLCAyLCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MDQsIGJsb2NrNCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDA1LCBkYXRhMiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDA2LCBkYXRhNCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDA3LCBkYXRhOCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDA4LCBzdHJpbmcsIDIsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgwOSwgYmxvY2ssIDIsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgwYSwgYmxvY2sxLCAyLCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MGIsIGRhdGExLCAyLCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MGMsIGZsYWcsIDIsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgwZCwgc2RhdGEsIDIsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgwZSwgc3RycCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDBmLCB1ZGF0YSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDEwLCByZWZfYWRkciwgMiwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDExLCByZWYxLCAyLCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MTIsIHJlZjIsIDIsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgxMywgcmVmNCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDE0LCByZWY4LCAyLCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MTUsIHJlZl91ZGF0YSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDE2LCBpbmRpcmVjdCwgMiwgRFdBUkYpCisvLyBOZXcgaW4gRFdBUkYgdjQ6CitIQU5ETEVfRFdfRk9STSgweDE3LCBzZWNfb2Zmc2V0LCA0LCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MTgsIGV4cHJsb2MsIDQsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgxOSwgZmxhZ19wcmVzZW50LCA0LCBEV0FSRikKKy8vIFRoaXMgd2FzIGRlZmluZWQgb3V0IG9mIHNlcXVlbmNlLgorSEFORExFX0RXX0ZPUk0oMHgyMCwgcmVmX3NpZzgsIDQsIERXQVJGKQorLy8gTmV3IGluIERXQVJGIHY1OgorSEFORExFX0RXX0ZPUk0oMHgxYSwgc3RyeCwgNSwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDFiLCBhZGRyeCwgNSwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDFjLCByZWZfc3VwNCwgNSwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDFkLCBzdHJwX3N1cCwgNSwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDFlLCBkYXRhMTYsIDUsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgxZiwgbGluZV9zdHJwLCA1LCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MjEsIGltcGxpY2l0X2NvbnN0LCA1LCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MjIsIGxvY2xpc3R4LCA1LCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MjMsIHJuZ2xpc3R4LCA1LCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MjQsIHJlZl9zdXA4LCA1LCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MjUsIHN0cngxLCA1LCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MjYsIHN0cngyLCA1LCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MjcsIHN0cngzLCA1LCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MjgsIHN0cng0LCA1LCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MjksIGFkZHJ4MSwgNSwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDJhLCBhZGRyeDIsIDUsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgyYiwgYWRkcngzLCA1LCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MmMsIGFkZHJ4NCwgNSwgRFdBUkYpCisvLyBFeHRlbnNpb25zIGZvciBGaXNzaW9uIHByb3Bvc2FsCitIQU5ETEVfRFdfRk9STSgweDFmMDEsIEdOVV9hZGRyX2luZGV4LCAwLCBHTlUpCitIQU5ETEVfRFdfRk9STSgweDFmMDIsIEdOVV9zdHJfaW5kZXgsIDAsIEdOVSkKKy8vIEFsdGVybmF0ZSBkZWJ1ZyBzZWN0aW9ucyBwcm9wb3NhbCAob3V0cHV0IG9mICJkd3oiIHRvb2wpLgorSEFORExFX0RXX0ZPUk0oMHgxZjIwLCBHTlVfcmVmX2FsdCwgMCwgR05VKQorSEFORExFX0RXX0ZPUk0oMHgxZjIxLCBHTlVfc3RycF9hbHQsIDAsIEdOVSkKKworLy8gRFdBUkYgRXhwcmVzc2lvbiBvcGVyYXRvcnMuCitIQU5ETEVfRFdfT1AoMHgwMywgYWRkciwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgwNiwgZGVyZWYsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MDgsIGNvbnN0MXUsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MDksIGNvbnN0MXMsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MGEsIGNvbnN0MnUsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MGIsIGNvbnN0MnMsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MGMsIGNvbnN0NHUsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MGQsIGNvbnN0NHMsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MGUsIGNvbnN0OHUsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MGYsIGNvbnN0OHMsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MTAsIGNvbnN0dSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgxMSwgY29uc3RzLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDEyLCBkdXAsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MTMsIGRyb3AsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MTQsIG92ZXIsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MTUsIHBpY2ssIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MTYsIHN3YXAsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MTcsIHJvdCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgxOCwgeGRlcmVmLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDE5LCBhYnMsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MWEsIGFuZCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgxYiwgZGl2LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDFjLCBtaW51cywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgxZCwgbW9kLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDFlLCBtdWwsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MWYsIG5lZywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgyMCwgbm90LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDIxLCBvciwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgyMiwgcGx1cywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgyMywgcGx1c191Y29uc3QsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MjQsIHNobCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgyNSwgc2hyLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDI2LCBzaHJhLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDI3LCB4b3IsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MjgsIGJyYSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgyOSwgZXEsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MmEsIGdlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDJiLCBndCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgyYywgbGUsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MmQsIGx0LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDJlLCBuZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgyZiwgc2tpcCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgzMCwgbGl0MCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgzMSwgbGl0MSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgzMiwgbGl0MiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgzMywgbGl0MywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgzNCwgbGl0NCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgzNSwgbGl0NSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgzNiwgbGl0NiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgzNywgbGl0NywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgzOCwgbGl0OCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgzOSwgbGl0OSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgzYSwgbGl0MTAsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4M2IsIGxpdDExLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDNjLCBsaXQxMiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgzZCwgbGl0MTMsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4M2UsIGxpdDE0LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDNmLCBsaXQxNSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg0MCwgbGl0MTYsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NDEsIGxpdDE3LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDQyLCBsaXQxOCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg0MywgbGl0MTksIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NDQsIGxpdDIwLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDQ1LCBsaXQyMSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg0NiwgbGl0MjIsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NDcsIGxpdDIzLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDQ4LCBsaXQyNCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg0OSwgbGl0MjUsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NGEsIGxpdDI2LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDRiLCBsaXQyNywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg0YywgbGl0MjgsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NGQsIGxpdDI5LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDRlLCBsaXQzMCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg0ZiwgbGl0MzEsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NTAsIHJlZzAsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NTEsIHJlZzEsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NTIsIHJlZzIsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NTMsIHJlZzMsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NTQsIHJlZzQsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NTUsIHJlZzUsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NTYsIHJlZzYsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NTcsIHJlZzcsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NTgsIHJlZzgsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NTksIHJlZzksIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NWEsIHJlZzEwLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDViLCByZWcxMSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg1YywgcmVnMTIsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NWQsIHJlZzEzLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDVlLCByZWcxNCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg1ZiwgcmVnMTUsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NjAsIHJlZzE2LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDYxLCByZWcxNywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg2MiwgcmVnMTgsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NjMsIHJlZzE5LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDY0LCByZWcyMCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg2NSwgcmVnMjEsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NjYsIHJlZzIyLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDY3LCByZWcyMywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg2OCwgcmVnMjQsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NjksIHJlZzI1LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDZhLCByZWcyNiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg2YiwgcmVnMjcsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NmMsIHJlZzI4LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDZkLCByZWcyOSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg2ZSwgcmVnMzAsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NmYsIHJlZzMxLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDcwLCBicmVnMCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg3MSwgYnJlZzEsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NzIsIGJyZWcyLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDczLCBicmVnMywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg3NCwgYnJlZzQsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NzUsIGJyZWc1LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDc2LCBicmVnNiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg3NywgYnJlZzcsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NzgsIGJyZWc4LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDc5LCBicmVnOSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg3YSwgYnJlZzEwLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDdiLCBicmVnMTEsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4N2MsIGJyZWcxMiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg3ZCwgYnJlZzEzLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDdlLCBicmVnMTQsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4N2YsIGJyZWcxNSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg4MCwgYnJlZzE2LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDgxLCBicmVnMTcsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4ODIsIGJyZWcxOCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg4MywgYnJlZzE5LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDg0LCBicmVnMjAsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4ODUsIGJyZWcyMSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg4NiwgYnJlZzIyLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDg3LCBicmVnMjMsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4ODgsIGJyZWcyNCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg4OSwgYnJlZzI1LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDhhLCBicmVnMjYsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4OGIsIGJyZWcyNywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg4YywgYnJlZzI4LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDhkLCBicmVnMjksIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4OGUsIGJyZWczMCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg4ZiwgYnJlZzMxLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDkwLCByZWd4LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDkxLCBmYnJlZywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg5MiwgYnJlZ3gsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4OTMsIHBpZWNlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDk0LCBkZXJlZl9zaXplLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDk1LCB4ZGVyZWZfc2l6ZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg5Niwgbm9wLCAyLCBEV0FSRikKKy8vIE5ldyBpbiBEV0FSRiB2MzoKK0hBTkRMRV9EV19PUCgweDk3LCBwdXNoX29iamVjdF9hZGRyZXNzLCAzLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDk4LCBjYWxsMiwgMywgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg5OSwgY2FsbDQsIDMsIERXQVJGKQorSEFORExFX0RXX09QKDB4OWEsIGNhbGxfcmVmLCAzLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDliLCBmb3JtX3Rsc19hZGRyZXNzLCAzLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDljLCBjYWxsX2ZyYW1lX2NmYSwgMywgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg5ZCwgYml0X3BpZWNlLCAzLCBEV0FSRikKKy8vIE5ldyBpbiBEV0FSRiB2NDoKK0hBTkRMRV9EV19PUCgweDllLCBpbXBsaWNpdF92YWx1ZSwgNCwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg5Ziwgc3RhY2tfdmFsdWUsIDQsIERXQVJGKQorLy8gTmV3IGluIERXQVJGIHY1OgorSEFORExFX0RXX09QKDB4YTAsIGltcGxpY2l0X3BvaW50ZXIsIDUsIERXQVJGKQorSEFORExFX0RXX09QKDB4YTEsIGFkZHJ4LCA1LCBEV0FSRikKK0hBTkRMRV9EV19PUCgweGEyLCBjb25zdHgsIDUsIERXQVJGKQorSEFORExFX0RXX09QKDB4YTMsIGVudHJ5X3ZhbHVlLCA1LCBEV0FSRikKK0hBTkRMRV9EV19PUCgweGE0LCBjb25zdF90eXBlLCA1LCBEV0FSRikKK0hBTkRMRV9EV19PUCgweGE1LCByZWd2YWxfdHlwZSwgNSwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHhhNiwgZGVyZWZfdHlwZSwgNSwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHhhNywgeGRlcmVmX3R5cGUsIDUsIERXQVJGKQorSEFORExFX0RXX09QKDB4YTgsIGNvbnZlcnQsIDUsIERXQVJGKQorSEFORExFX0RXX09QKDB4YTksIHJlaW50ZXJwcmV0LCA1LCBEV0FSRikKKy8vIFZlbmRvciBleHRlbnNpb25zOgorLy8gRXh0ZW5zaW9ucyBmb3IgR05VLXN0eWxlIHRocmVhZC1sb2NhbCBzdG9yYWdlLgorSEFORExFX0RXX09QKDB4ZTAsIEdOVV9wdXNoX3Rsc19hZGRyZXNzLCAwLCBHTlUpCisvLyBFeHRlbnNpb25zIGZvciBGaXNzaW9uIHByb3Bvc2FsLgorSEFORExFX0RXX09QKDB4ZmIsIEdOVV9hZGRyX2luZGV4LCAwLCBHTlUpCitIQU5ETEVfRFdfT1AoMHhmYywgR05VX2NvbnN0X2luZGV4LCAwLCBHTlUpCisKKy8vIERXQVJGIGxhbmd1YWdlcy4KK0hBTkRMRV9EV19MQU5HKDB4MDAwMSwgQzg5LCAyLCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAwMiwgQywgMiwgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMDMsIEFkYTgzLCAyLCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAwNCwgQ19wbHVzX3BsdXMsIDIsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDA1LCBDb2JvbDc0LCAyLCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAwNiwgQ29ib2w4NSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMDcsIEZvcnRyYW43NywgMiwgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMDgsIEZvcnRyYW45MCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMDksIFBhc2NhbDgzLCAyLCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAwYSwgTW9kdWxhMiwgMiwgRFdBUkYpCisvLyBOZXcgaW4gRFdBUkYgdjM6CitIQU5ETEVfRFdfTEFORygweDAwMGIsIEphdmEsIDMsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDBjLCBDOTksIDMsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDBkLCBBZGE5NSwgMywgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMGUsIEZvcnRyYW45NSwgMywgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMGYsIFBMSSwgMywgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMTAsIE9iakMsIDMsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDExLCBPYmpDX3BsdXNfcGx1cywgMywgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMTIsIFVQQywgMywgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMTMsIEQsIDMsIERXQVJGKQorLy8gTmV3IGluIERXQVJGIHY0OgorSEFORExFX0RXX0xBTkcoMHgwMDE0LCBQeXRob24sIDQsIERXQVJGKQorLy8gTmV3IGluIERXQVJGIHY1OgorSEFORExFX0RXX0xBTkcoMHgwMDE1LCBPcGVuQ0wsIDUsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDE2LCBHbywgNSwgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMTcsIE1vZHVsYTMsIDUsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDE4LCBIYXNrZWxsLCA1LCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAxOSwgQ19wbHVzX3BsdXNfMDMsIDUsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDFhLCBDX3BsdXNfcGx1c18xMSwgNSwgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMWIsIE9DYW1sLCA1LCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAxYywgUnVzdCwgNSwgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMWQsIEMxMSwgNSwgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMWUsIFN3aWZ0LCA1LCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAxZiwgSnVsaWEsIDUsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDIwLCBEeWxhbiwgNSwgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMjEsIENfcGx1c19wbHVzXzE0LCA1LCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAyMiwgRm9ydHJhbjAzLCA1LCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAyMywgRm9ydHJhbjA4LCA1LCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAyNCwgUmVuZGVyU2NyaXB0LCA1LCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAyNSwgQkxJU1MsIDUsIERXQVJGKQorLy8gVmVuZG9yIGV4dGVuc2lvbnM6CitIQU5ETEVfRFdfTEFORygweDgwMDEsIE1pcHNfQXNzZW1ibGVyLCAwLCBNSVBTKQorSEFORExFX0RXX0xBTkcoMHg4ZTU3LCBHT09HTEVfUmVuZGVyU2NyaXB0LCAwLCBHT09HTEUpCitIQU5ETEVfRFdfTEFORygweGIwMDAsIEJPUkxBTkRfRGVscGhpLCAwLCBCT1JMQU5EKQorCisvLyBEV0FSRiBhdHRyaWJ1dGUgdHlwZSBlbmNvZGluZ3MuCitIQU5ETEVfRFdfQVRFKDB4MDEsIGFkZHJlc3MsIDIsIERXQVJGKQorSEFORExFX0RXX0FURSgweDAyLCBib29sZWFuLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVEUoMHgwMywgY29tcGxleF9mbG9hdCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVRFKDB4MDQsIGZsb2F0LCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVEUoMHgwNSwgc2lnbmVkLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVEUoMHgwNiwgc2lnbmVkX2NoYXIsIDIsIERXQVJGKQorSEFORExFX0RXX0FURSgweDA3LCB1bnNpZ25lZCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVRFKDB4MDgsIHVuc2lnbmVkX2NoYXIsIDIsIERXQVJGKQorLy8gTmV3IGluIERXQVJGIHYzOgorSEFORExFX0RXX0FURSgweDA5LCBpbWFnaW5hcnlfZmxvYXQsIDMsIERXQVJGKQorSEFORExFX0RXX0FURSgweDBhLCBwYWNrZWRfZGVjaW1hbCwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVRFKDB4MGIsIG51bWVyaWNfc3RyaW5nLCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVEUoMHgwYywgZWRpdGVkLCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVEUoMHgwZCwgc2lnbmVkX2ZpeGVkLCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVEUoMHgwZSwgdW5zaWduZWRfZml4ZWQsIDMsIERXQVJGKQorSEFORExFX0RXX0FURSgweDBmLCBkZWNpbWFsX2Zsb2F0LCAzLCBEV0FSRikKKy8vIE5ldyBpbiBEV0FSRiB2NDoKK0hBTkRMRV9EV19BVEUoMHgxMCwgVVRGLCA0LCBEV0FSRikKKy8vIE5ldyBpbiBEV0FSRiB2NToKK0hBTkRMRV9EV19BVEUoMHgxMSwgVUNTLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVEUoMHgxMiwgQVNDSUksIDUsIERXQVJGKQorCisvLyBEV0FSRiB2aXJ0dWFsaXR5IGNvZGVzLgorSEFORExFX0RXX1ZJUlRVQUxJVFkoMHgwMCwgbm9uZSkKK0hBTkRMRV9EV19WSVJUVUFMSVRZKDB4MDEsIHZpcnR1YWwpCitIQU5ETEVfRFdfVklSVFVBTElUWSgweDAyLCBwdXJlX3ZpcnR1YWwpCisKKy8vIERXQVJGIHY1IERlZmF1bHRlZCBNZW1iZXIgRW5jb2RpbmdzLgorSEFORExFX0RXX0RFRkFVTFRFRCgweDAwLCBubykKK0hBTkRMRV9EV19ERUZBVUxURUQoMHgwMSwgaW5fY2xhc3MpCitIQU5ETEVfRFdfREVGQVVMVEVEKDB4MDIsIG91dF9vZl9jbGFzcykKKworLy8gRFdBUkYgY2FsbGluZyBjb252ZW50aW9uIGNvZGVzLgorSEFORExFX0RXX0NDKDB4MDEsIG5vcm1hbCkKK0hBTkRMRV9EV19DQygweDAyLCBwcm9ncmFtKQorSEFORExFX0RXX0NDKDB4MDMsIG5vY2FsbCkKKy8vIE5ldyBpbiBEV0FSRiB2NToKK0hBTkRMRV9EV19DQygweDA0LCBwYXNzX2J5X3JlZmVyZW5jZSkKK0hBTkRMRV9EV19DQygweDA1LCBwYXNzX2J5X3ZhbHVlKQorLy8gVmVuZG9yIGV4dGVuc2lvbnM6CitIQU5ETEVfRFdfQ0MoMHg0MCwgR05VX3JlbmVzYXNfc2gpCitIQU5ETEVfRFdfQ0MoMHg0MSwgR05VX2JvcmxhbmRfZmFzdGNhbGxfaTM4NikKK0hBTkRMRV9EV19DQygweGIwLCBCT1JMQU5EX3NhZmVjYWxsKQorSEFORExFX0RXX0NDKDB4YjEsIEJPUkxBTkRfc3RkY2FsbCkKK0hBTkRMRV9EV19DQygweGIyLCBCT1JMQU5EX3Bhc2NhbCkKK0hBTkRMRV9EV19DQygweGIzLCBCT1JMQU5EX21zZmFzdGNhbGwpCitIQU5ETEVfRFdfQ0MoMHhiNCwgQk9STEFORF9tc3JldHVybikKK0hBTkRMRV9EV19DQygweGI1LCBCT1JMQU5EX3RoaXNjYWxsKQorSEFORExFX0RXX0NDKDB4YjYsIEJPUkxBTkRfZmFzdGNhbGwpCitIQU5ETEVfRFdfQ0MoMHhjMCwgTExWTV92ZWN0b3JjYWxsKQorSEFORExFX0RXX0NDKDB4YzEsIExMVk1fV2luNjQpCitIQU5ETEVfRFdfQ0MoMHhjMiwgTExWTV9YODZfNjRTeXNWKQorSEFORExFX0RXX0NDKDB4YzMsIExMVk1fQUFQQ1MpCitIQU5ETEVfRFdfQ0MoMHhjNCwgTExWTV9BQVBDU19WRlApCitIQU5ETEVfRFdfQ0MoMHhjNSwgTExWTV9JbnRlbE9jbEJpY2MpCitIQU5ETEVfRFdfQ0MoMHhjNiwgTExWTV9TcGlyRnVuY3Rpb24pCitIQU5ETEVfRFdfQ0MoMHhjNywgTExWTV9PcGVuQ0xLZXJuZWwpCitIQU5ETEVfRFdfQ0MoMHhjOCwgTExWTV9Td2lmdCkKK0hBTkRMRV9EV19DQygweGM5LCBMTFZNX1ByZXNlcnZlTW9zdCkKK0hBTkRMRV9EV19DQygweGNhLCBMTFZNX1ByZXNlcnZlQWxsKQorSEFORExFX0RXX0NDKDB4Y2IsIExMVk1fWDg2UmVnQ2FsbCkKKy8vIEZyb20gR0NDIHNvdXJjZSBjb2RlIChpbmNsdWRlL2R3YXJmMi5oKTogVGhpcyBEV19DQ18gdmFsdWUgaXMgbm90IGN1cnJlbnRseQorLy8gZ2VuZXJhdGVkIGJ5IGFueSB0b29sY2hhaW4uICBJdCBpcyB1c2VkIGludGVybmFsbHkgdG8gR0RCIHRvIGluZGljYXRlIE9wZW5DTCBDCisvLyBmdW5jdGlvbnMgdGhhdCBoYXZlIGJlZW4gY29tcGlsZWQgd2l0aCB0aGUgSUJNIFhMIEMgZm9yIE9wZW5DTCBjb21waWxlciBhbmQgdXNlCisvLyBhIG5vbi1wbGF0Zm9ybSBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIHBhc3NpbmcgT3BlbkNMIEMgdmVjdG9yIHR5cGVzLgorSEFORExFX0RXX0NDKDB4ZmYsIEdEQl9JQk1fT3BlbkNMKQorCisvLyBMaW5lIE51bWJlciBFeHRlbmRlZCBPcGNvZGUgRW5jb2RpbmdzCitIQU5ETEVfRFdfTE5FKDB4MDEsIGVuZF9zZXF1ZW5jZSkKK0hBTkRMRV9EV19MTkUoMHgwMiwgc2V0X2FkZHJlc3MpCitIQU5ETEVfRFdfTE5FKDB4MDMsIGRlZmluZV9maWxlKQorLy8gTmV3IGluIERXQVJGIHY0OgorSEFORExFX0RXX0xORSgweDA0LCBzZXRfZGlzY3JpbWluYXRvcikKKworLy8gTGluZSBOdW1iZXIgU3RhbmRhcmQgT3Bjb2RlIEVuY29kaW5ncy4KK0hBTkRMRV9EV19MTlMoMHgwMCwgZXh0ZW5kZWRfb3ApCitIQU5ETEVfRFdfTE5TKDB4MDEsIGNvcHkpCitIQU5ETEVfRFdfTE5TKDB4MDIsIGFkdmFuY2VfcGMpCitIQU5ETEVfRFdfTE5TKDB4MDMsIGFkdmFuY2VfbGluZSkKK0hBTkRMRV9EV19MTlMoMHgwNCwgc2V0X2ZpbGUpCitIQU5ETEVfRFdfTE5TKDB4MDUsIHNldF9jb2x1bW4pCitIQU5ETEVfRFdfTE5TKDB4MDYsIG5lZ2F0ZV9zdG10KQorSEFORExFX0RXX0xOUygweDA3LCBzZXRfYmFzaWNfYmxvY2spCitIQU5ETEVfRFdfTE5TKDB4MDgsIGNvbnN0X2FkZF9wYykKK0hBTkRMRV9EV19MTlMoMHgwOSwgZml4ZWRfYWR2YW5jZV9wYykKKy8vIE5ldyBpbiBEV0FSRiB2MzoKK0hBTkRMRV9EV19MTlMoMHgwYSwgc2V0X3Byb2xvZ3VlX2VuZCkKK0hBTkRMRV9EV19MTlMoMHgwYiwgc2V0X2VwaWxvZ3VlX2JlZ2luKQorSEFORExFX0RXX0xOUygweDBjLCBzZXRfaXNhKQorCisvLyBEV0FSRiB2NSBMaW5lIG51bWJlciBoZWFkZXIgZW50cnkgZm9ybWF0LgorSEFORExFX0RXX0xOQ1QoMHgwMSwgcGF0aCkKK0hBTkRMRV9EV19MTkNUKDB4MDIsIGRpcmVjdG9yeV9pbmRleCkKK0hBTkRMRV9EV19MTkNUKDB4MDMsIHRpbWVzdGFtcCkKK0hBTkRMRV9EV19MTkNUKDB4MDQsIHNpemUpCitIQU5ETEVfRFdfTE5DVCgweDA1LCBNRDUpCisvLyBBIHZlbmRvciBleHRlbnNpb24gdW50aWwgaHR0cDovL2R3YXJmc3RkLm9yZy9TaG93SXNzdWUucGhwP2lzc3VlPTE4MDIwMS4xIGlzCisvLyBhY2NlcHRlZCBhbmQgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgRFdBUkYgc3RhbmRhcmQuCitIQU5ETEVfRFdfTE5DVCgweDIwMDEsIExMVk1fc291cmNlKQorCisvLyBEV0FSRiB2NSBNYWNybyBpbmZvcm1hdGlvbi4KK0hBTkRMRV9EV19NQUNSTygweDAxLCBkZWZpbmUpCitIQU5ETEVfRFdfTUFDUk8oMHgwMiwgdW5kZWYpCitIQU5ETEVfRFdfTUFDUk8oMHgwMywgc3RhcnRfZmlsZSkKK0hBTkRMRV9EV19NQUNSTygweDA0LCBlbmRfZmlsZSkKK0hBTkRMRV9EV19NQUNSTygweDA1LCBkZWZpbmVfc3RycCkKK0hBTkRMRV9EV19NQUNSTygweDA2LCB1bmRlZl9zdHJwKQorSEFORExFX0RXX01BQ1JPKDB4MDcsIGltcG9ydCkKK0hBTkRMRV9EV19NQUNSTygweDA4LCBkZWZpbmVfc3VwKQorSEFORExFX0RXX01BQ1JPKDB4MDksIHVuZGVmX3N1cCkKK0hBTkRMRV9EV19NQUNSTygweDBhLCBpbXBvcnRfc3VwKQorSEFORExFX0RXX01BQ1JPKDB4MGIsIGRlZmluZV9zdHJ4KQorSEFORExFX0RXX01BQ1JPKDB4MGMsIHVuZGVmX3N0cngpCisKKy8vIERXQVJGIHY1IFJhbmdlIExpc3QgRW50cnkgZW5jb2RpbmcgdmFsdWVzLgorSEFORExFX0RXX1JMRSgweDAwLCBlbmRfb2ZfbGlzdCkKK0hBTkRMRV9EV19STEUoMHgwMSwgYmFzZV9hZGRyZXNzeCkKK0hBTkRMRV9EV19STEUoMHgwMiwgc3RhcnR4X2VuZHgpCitIQU5ETEVfRFdfUkxFKDB4MDMsIHN0YXJ0eF9sZW5ndGgpCitIQU5ETEVfRFdfUkxFKDB4MDQsIG9mZnNldF9wYWlyKQorSEFORExFX0RXX1JMRSgweDA1LCBiYXNlX2FkZHJlc3MpCitIQU5ETEVfRFdfUkxFKDB4MDYsIHN0YXJ0X2VuZCkKK0hBTkRMRV9EV19STEUoMHgwNywgc3RhcnRfbGVuZ3RoKQorCisvLyBDYWxsIGZyYW1lIGluc3RydWN0aW9uIGVuY29kaW5ncy4KK0hBTkRMRV9EV19DRkEoMHgwMCwgbm9wKQorSEFORExFX0RXX0NGQSgweDQwLCBhZHZhbmNlX2xvYykKK0hBTkRMRV9EV19DRkEoMHg4MCwgb2Zmc2V0KQorSEFORExFX0RXX0NGQSgweGMwLCByZXN0b3JlKQorSEFORExFX0RXX0NGQSgweDAxLCBzZXRfbG9jKQorSEFORExFX0RXX0NGQSgweDAyLCBhZHZhbmNlX2xvYzEpCitIQU5ETEVfRFdfQ0ZBKDB4MDMsIGFkdmFuY2VfbG9jMikKK0hBTkRMRV9EV19DRkEoMHgwNCwgYWR2YW5jZV9sb2M0KQorSEFORExFX0RXX0NGQSgweDA1LCBvZmZzZXRfZXh0ZW5kZWQpCitIQU5ETEVfRFdfQ0ZBKDB4MDYsIHJlc3RvcmVfZXh0ZW5kZWQpCitIQU5ETEVfRFdfQ0ZBKDB4MDcsIHVuZGVmaW5lZCkKK0hBTkRMRV9EV19DRkEoMHgwOCwgc2FtZV92YWx1ZSkKK0hBTkRMRV9EV19DRkEoMHgwOSwgcmVnaXN0ZXIpCitIQU5ETEVfRFdfQ0ZBKDB4MGEsIHJlbWVtYmVyX3N0YXRlKQorSEFORExFX0RXX0NGQSgweDBiLCByZXN0b3JlX3N0YXRlKQorSEFORExFX0RXX0NGQSgweDBjLCBkZWZfY2ZhKQorSEFORExFX0RXX0NGQSgweDBkLCBkZWZfY2ZhX3JlZ2lzdGVyKQorSEFORExFX0RXX0NGQSgweDBlLCBkZWZfY2ZhX29mZnNldCkKKy8vIE5ldyBpbiBEV0FSRiB2MzoKK0hBTkRMRV9EV19DRkEoMHgwZiwgZGVmX2NmYV9leHByZXNzaW9uKQorSEFORExFX0RXX0NGQSgweDEwLCBleHByZXNzaW9uKQorSEFORExFX0RXX0NGQSgweDExLCBvZmZzZXRfZXh0ZW5kZWRfc2YpCitIQU5ETEVfRFdfQ0ZBKDB4MTIsIGRlZl9jZmFfc2YpCitIQU5ETEVfRFdfQ0ZBKDB4MTMsIGRlZl9jZmFfb2Zmc2V0X3NmKQorSEFORExFX0RXX0NGQSgweDE0LCB2YWxfb2Zmc2V0KQorSEFORExFX0RXX0NGQSgweDE1LCB2YWxfb2Zmc2V0X3NmKQorSEFORExFX0RXX0NGQSgweDE2LCB2YWxfZXhwcmVzc2lvbikKKy8vIFZlbmRvciBleHRlbnNpb25zOgorSEFORExFX0RXX0NGQSgweDFkLCBNSVBTX2FkdmFuY2VfbG9jOCkKK0hBTkRMRV9EV19DRkEoMHgyZCwgR05VX3dpbmRvd19zYXZlKQorSEFORExFX0RXX0NGQSgweDJlLCBHTlVfYXJnc19zaXplKQorCisvLyBBcHBsZSBPYmplY3RpdmUtQyBQcm9wZXJ0eSBBdHRyaWJ1dGVzLgorLy8gS2VlcCB0aGlzIGxpc3QgaW4gc3luYyB3aXRoIGNsYW5nJ3MgRGVjbFNwZWMuaCBPYmpDUHJvcGVydHlBdHRyaWJ1dGVLaW5kIQorSEFORExFX0RXX0FQUExFX1BST1BFUlRZKDB4MDEsIHJlYWRvbmx5KQorSEFORExFX0RXX0FQUExFX1BST1BFUlRZKDB4MDIsIGdldHRlcikKK0hBTkRMRV9EV19BUFBMRV9QUk9QRVJUWSgweDA0LCBhc3NpZ24pCitIQU5ETEVfRFdfQVBQTEVfUFJPUEVSVFkoMHgwOCwgcmVhZHdyaXRlKQorSEFORExFX0RXX0FQUExFX1BST1BFUlRZKDB4MTAsIHJldGFpbikKK0hBTkRMRV9EV19BUFBMRV9QUk9QRVJUWSgweDIwLCBjb3B5KQorSEFORExFX0RXX0FQUExFX1BST1BFUlRZKDB4NDAsIG5vbmF0b21pYykKK0hBTkRMRV9EV19BUFBMRV9QUk9QRVJUWSgweDgwLCBzZXR0ZXIpCitIQU5ETEVfRFdfQVBQTEVfUFJPUEVSVFkoMHgxMDAsIGF0b21pYykKK0hBTkRMRV9EV19BUFBMRV9QUk9QRVJUWSgweDIwMCwgd2VhaykKK0hBTkRMRV9EV19BUFBMRV9QUk9QRVJUWSgweDQwMCwgc3Ryb25nKQorSEFORExFX0RXX0FQUExFX1BST1BFUlRZKDB4ODAwLCB1bnNhZmVfdW5yZXRhaW5lZCkKK0hBTkRMRV9EV19BUFBMRV9QUk9QRVJUWSgweDEwMDAsIG51bGxhYmlsaXR5KQorSEFORExFX0RXX0FQUExFX1BST1BFUlRZKDB4MjAwMCwgbnVsbF9yZXNldHRhYmxlKQorSEFORExFX0RXX0FQUExFX1BST1BFUlRZKDB4NDAwMCwgY2xhc3MpCisKKy8vIERXQVJGIHY1IFVuaXQgVHlwZXMuCitIQU5ETEVfRFdfVVQoMHgwMSwgY29tcGlsZSkKK0hBTkRMRV9EV19VVCgweDAyLCB0eXBlKQorSEFORExFX0RXX1VUKDB4MDMsIHBhcnRpYWwpCitIQU5ETEVfRFdfVVQoMHgwNCwgc2tlbGV0b24pCitIQU5ETEVfRFdfVVQoMHgwNSwgc3BsaXRfY29tcGlsZSkKK0hBTkRMRV9EV19VVCgweDA2LCBzcGxpdF90eXBlKQorCisvLyBEV0FSRiBzZWN0aW9uIHR5cGVzLiAoZW51bSBuYW1lLCBFTEYgbmFtZSwgRUxGIERXTyBuYW1lLCBjbWRsaW5lIG5hbWUpCisvLyBOb3RlIHRoYXQgdGhlc2UgSURzIGRvbid0IG1lYW4gYW55dGhpbmcuCisvLyBUT0RPOiBBZGQgTWFjaC1PIGFuZCBDT0ZGIG5hbWVzLgorLy8gT2ZmaWNpYWwgRFdBUkYgc2VjdGlvbnMuCitIQU5ETEVfRFdBUkZfU0VDVElPTihEZWJ1Z0FiYnJldiwgIi5kZWJ1Z19hYmJyZXYiLCAiZGVidWctYWJicmV2IikKK0hBTkRMRV9EV0FSRl9TRUNUSU9OKERlYnVnQXJhbmdlcywgIi5kZWJ1Z19hcmFuZ2VzIiwgImRlYnVnLWFyYW5nZXMiKQorSEFORExFX0RXQVJGX1NFQ1RJT04oRGVidWdJbmZvLCAiLmRlYnVnX2luZm8iLCAiZGVidWctaW5mbyIpCitIQU5ETEVfRFdBUkZfU0VDVElPTihEZWJ1Z1R5cGVzLCAiLmRlYnVnX3R5cGVzIiwgImRlYnVnLXR5cGVzIikKK0hBTkRMRV9EV0FSRl9TRUNUSU9OKERlYnVnTGluZSwgIi5kZWJ1Z19saW5lIiwgImRlYnVnLWxpbmUiKQorSEFORExFX0RXQVJGX1NFQ1RJT04oRGVidWdMaW5lU3RyLCAiLmRlYnVnX2xpbmVfc3RyIiwgImRlYnVnLWxpbmUtc3RyIikKK0hBTkRMRV9EV0FSRl9TRUNUSU9OKERlYnVnTG9jLCAiLmRlYnVnX2xvYyIsICJkZWJ1Zy1sb2MiKQorSEFORExFX0RXQVJGX1NFQ1RJT04oRGVidWdGcmFtZSwgIi5kZWJ1Z19mcmFtZSIsICJkZWJ1Zy1mcmFtZSIpCitIQU5ETEVfRFdBUkZfU0VDVElPTihEZWJ1Z01hY3JvLCAiLmRlYnVnX21hY3JvIiwgImRlYnVnLW1hY3JvIikKK0hBTkRMRV9EV0FSRl9TRUNUSU9OKERlYnVnTmFtZXMsICIuZGVidWdfbmFtZXMiLCAiZGVidWctbmFtZXMiKQorSEFORExFX0RXQVJGX1NFQ1RJT04oRGVidWdQdWJuYW1lcywgIi5kZWJ1Z19wdWJuYW1lcyIsICJkZWJ1Zy1wdWJuYW1lcyIpCitIQU5ETEVfRFdBUkZfU0VDVElPTihEZWJ1Z1B1YnR5cGVzLCAiLmRlYnVnX3B1YnR5cGVzIiwgImRlYnVnLXB1YnR5cGVzIikKK0hBTkRMRV9EV0FSRl9TRUNUSU9OKERlYnVnR251UHVibmFtZXMsICIuZGVidWdfZ251X3B1Ym5hbWVzIiwgImRlYnVnLWdudS1wdWJuYW1lcyIpCitIQU5ETEVfRFdBUkZfU0VDVElPTihEZWJ1Z0dudVB1YnR5cGVzLCAiLmRlYnVnX2dudV9wdWJ0eXBlcyIsICJkZWJ1Zy1nbnUtcHVidHlwZXMiKQorSEFORExFX0RXQVJGX1NFQ1RJT04oRGVidWdSYW5nZXMsICIuZGVidWdfcmFuZ2VzIiwgImRlYnVnLXJhbmdlcyIpCitIQU5ETEVfRFdBUkZfU0VDVElPTihEZWJ1Z1JuZ2xpc3RzLCAiLmRlYnVnX3JuZ2xpc3RzIiwgImRlYnVnLXJuZ2xpc3RzIikKK0hBTkRMRV9EV0FSRl9TRUNUSU9OKERlYnVnU3RyLCAiLmRlYnVnX3N0ciIsICJkZWJ1Zy1zdHIiKQorSEFORExFX0RXQVJGX1NFQ1RJT04oRGVidWdTdHJPZmZzZXRzLCAiLmRlYnVnX3N0cl9vZmZzZXRzIiwgImRlYnVnLXN0ci1vZmZzZXRzIikKK0hBTkRMRV9EV0FSRl9TRUNUSU9OKERlYnVnQ1VJbmRleCwgIi5kZWJ1Z19jdV9pbmRleCIsICJkZWJ1Zy1jdS1pbmRleCIpCitIQU5ETEVfRFdBUkZfU0VDVElPTihEZWJ1Z1RVSW5kZXgsICIuZGVidWdfdHVfaW5kZXgiLCAiZGVidWctdHUtaW5kZXgiKQorLy8gVmVuZG9yIGV4dGVuc2lvbnMuCitIQU5ETEVfRFdBUkZfU0VDVElPTihBcHBsZU5hbWVzLCAiLmFwcGxlX25hbWVzIiwgImFwcGxlLW5hbWVzIikKK0hBTkRMRV9EV0FSRl9TRUNUSU9OKEFwcGxlVHlwZXMsICIuYXBwbGVfdHlwZXMiLCAiYXBwbGUtdHlwZXMiKQorSEFORExFX0RXQVJGX1NFQ1RJT04oQXBwbGVOYW1lc3BhY2VzLCAiLmFwcGxlX25hbWVzcGFjZXMiLCAiYXBwbGUtbmFtZXNwYWNlcyIpCitIQU5ETEVfRFdBUkZfU0VDVElPTihBcHBsZU9iakMsICIuYXBwbGVfb2JqYyIsICJhcHBsZS1vYmpjIikKK0hBTkRMRV9EV0FSRl9TRUNUSU9OKEdkYkluZGV4LCAiLmdkYl9pbmRleCIsICJnZGItaW5kZXgiKQorCitIQU5ETEVfRFdfSURYKDB4MDEsIGNvbXBpbGVfdW5pdCkKK0hBTkRMRV9EV19JRFgoMHgwMiwgdHlwZV91bml0KQorSEFORExFX0RXX0lEWCgweDAzLCBkaWVfb2Zmc2V0KQorSEFORExFX0RXX0lEWCgweDA0LCBwYXJlbnQpCitIQU5ETEVfRFdfSURYKDB4MDUsIHR5cGVfaGFzaCkKKworCisjdW5kZWYgSEFORExFX0RXX1RBRworI3VuZGVmIEhBTkRMRV9EV19BVAorI3VuZGVmIEhBTkRMRV9EV19GT1JNCisjdW5kZWYgSEFORExFX0RXX09QCisjdW5kZWYgSEFORExFX0RXX0xBTkcKKyN1bmRlZiBIQU5ETEVfRFdfQVRFCisjdW5kZWYgSEFORExFX0RXX1ZJUlRVQUxJVFkKKyN1bmRlZiBIQU5ETEVfRFdfREVGQVVMVEVECisjdW5kZWYgSEFORExFX0RXX0NDCisjdW5kZWYgSEFORExFX0RXX0xOUworI3VuZGVmIEhBTkRMRV9EV19MTkUKKyN1bmRlZiBIQU5ETEVfRFdfTE5DVAorI3VuZGVmIEhBTkRMRV9EV19NQUNSTworI3VuZGVmIEhBTkRMRV9EV19STEUKKyN1bmRlZiBIQU5ETEVfRFdfQ0ZBCisjdW5kZWYgSEFORExFX0RXX0FQUExFX1BST1BFUlRZCisjdW5kZWYgSEFORExFX0RXX1VUCisjdW5kZWYgSEFORExFX0RXQVJGX1NFQ1RJT04KKyN1bmRlZiBIQU5ETEVfRFdfSURYCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTcyNGE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuaApAQCAtMCwwICsxLDYyMCBAQAorLy89PT0tLSBsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5oIC0tLUR3YXJmIENvbnN0YW50cy0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgY29udGFpbnMgY29uc3RhbnRzIHVzZWQgZm9yIGltcGxlbWVudGluZyBEd2FyZgorLy8vIGRlYnVnIHN1cHBvcnQuCisvLy8KKy8vLyBGb3IgZGV0YWlscyBvbiB0aGUgRHdhcmYgc3BlY2ZpY2F0aW9uIHNlZSB0aGUgbGF0ZXN0IERXQVJGIERlYnVnZ2luZworLy8vIEluZm9ybWF0aW9uIEZvcm1hdCBzdGFuZGFyZCBkb2N1bWVudCBvbiBodHRwOi8vd3d3LmR3YXJmc3RkLm9yZy4gVGhpcworLy8vIGZpbGUgb2Z0ZW4gaW5jbHVkZXMgc3VwcG9ydCBmb3Igbm9uLXJlbGVhc2VkIHN0YW5kYXJkIGZlYXR1cmVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9CSU5BUllGT1JNQVRfRFdBUkZfSAorI2RlZmluZSBMTFZNX0JJTkFSWUZPUk1BVF9EV0FSRl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0VmFyaWFkaWNEZXRhaWxzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFN0cmluZ1JlZjsKKworbmFtZXNwYWNlIGR3YXJmIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIERXQVJGIGNvbnN0YW50cyBhcyBnbGVhbmVkIGZyb20gdGhlIERXQVJGIERlYnVnZ2luZyBJbmZvcm1hdGlvbiBGb3JtYXQgVi41CisvLyByZWZlcmVuY2UgbWFudWFsIGh0dHA6Ly93d3cuZHdhcmZzdGQub3JnLy4KKy8vCisKKy8vIERvIG5vdCBtaXggdGhlIGZvbGxvd2luZyB0d28gZW51bWVyYXRpb25zIHNldHMuICBEV19UQUdfaW52YWxpZCBjaGFuZ2VzIHRoZQorLy8gZW51bWVyYXRpb24gYmFzZSB0eXBlLgorCitlbnVtIExMVk1Db25zdGFudHMgOiB1aW50MzJfdCB7CisgIC8vIExMVk0gbW9jayB0YWdzIChzZWUgYWxzbyBsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYpLgorICBEV19UQUdfaW52YWxpZCA9IH4wVSwgICAgICAgIC8vIFRhZyBmb3IgaW52YWxpZCByZXN1bHRzLgorICBEV19WSVJUVUFMSVRZX2ludmFsaWQgPSB+MFUsIC8vIFZpcnR1YWxpdHkgZm9yIGludmFsaWQgcmVzdWx0cy4KKyAgRFdfTUFDSU5GT19pbnZhbGlkID0gfjBVLCAgICAvLyBNYWNpbmZvIHR5cGUgZm9yIGludmFsaWQgcmVzdWx0cy4KKworICAvLyBPdGhlciBjb25zdGFudHMuCisgIERXQVJGX1ZFUlNJT04gPSA0LCAgICAgICAvLyBEZWZhdWx0IGR3YXJmIHZlcnNpb24gd2Ugb3V0cHV0LgorICBEV19QVUJUWVBFU19WRVJTSU9OID0gMiwgLy8gU2VjdGlvbiB2ZXJzaW9uIG51bWJlciBmb3IgLmRlYnVnX3B1YnR5cGVzLgorICBEV19QVUJOQU1FU19WRVJTSU9OID0gMiwgLy8gU2VjdGlvbiB2ZXJzaW9uIG51bWJlciBmb3IgLmRlYnVnX3B1Ym5hbWVzLgorICBEV19BUkFOR0VTX1ZFUlNJT04gPSAyLCAgLy8gU2VjdGlvbiB2ZXJzaW9uIG51bWJlciBmb3IgLmRlYnVnX2FyYW5nZXMuCisgIC8vIElkZW50aWZpZXJzIHdlIHVzZSB0byBkaXN0aW5ndWlzaCB2ZW5kb3IgZXh0ZW5zaW9ucy4KKyAgRFdBUkZfVkVORE9SX0RXQVJGID0gMCwgLy8gRGVmaW5lZCBpbiB2MiBvciBsYXRlciBvZiB0aGUgRFdBUkYgc3RhbmRhcmQuCisgIERXQVJGX1ZFTkRPUl9BUFBMRSA9IDEsCisgIERXQVJGX1ZFTkRPUl9CT1JMQU5EID0gMiwKKyAgRFdBUkZfVkVORE9SX0dOVSA9IDMsCisgIERXQVJGX1ZFTkRPUl9HT09HTEUgPSA0LAorICBEV0FSRl9WRU5ET1JfTExWTSA9IDUsCisgIERXQVJGX1ZFTkRPUl9NSVBTID0gNgorfTsKKworLy8vIENvbnN0YW50cyB0aGF0IGRlZmluZSB0aGUgRFdBUkYgZm9ybWF0IGFzIDMyIG9yIDY0IGJpdC4KK2VudW0gRHdhcmZGb3JtYXQgOiB1aW50OF90IHsgRFdBUkYzMiwgRFdBUkY2NCB9OworCisvLy8gU3BlY2lhbCBJRCB2YWx1ZXMgdGhhdCBkaXN0aW5ndWlzaCBhIENJRSBmcm9tIGEgRkRFIGluIERXQVJGIENGSS4KKy8vLyBOb3QgaW5zaWRlIGFuIGVudW0gYmVjYXVzZSBhIDY0LWJpdCB2YWx1ZSBpcyBuZWVkZWQuCisvLy8gQHsKK2NvbnN0IHVpbnQzMl90IERXX0NJRV9JRCA9IFVJTlQzMl9NQVg7Citjb25zdCB1aW50NjRfdCBEVzY0X0NJRV9JRCA9IFVJTlQ2NF9NQVg7CisvLy8gQH0KKworLy8vIElkZW50aWZpZXIgb2YgYW4gaW52YWxpZCBESUUgb2Zmc2V0IGluIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uLgorY29uc3QgdWludDMyX3QgRFdfSU5WQUxJRF9PRkZTRVQgPSBVSU5UMzJfTUFYOworCitlbnVtIFRhZyA6IHVpbnQxNl90IHsKKyNkZWZpbmUgSEFORExFX0RXX1RBRyhJRCwgTkFNRSwgVkVSU0lPTiwgVkVORE9SKSBEV19UQUdfIyNOQU1FID0gSUQsCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmIgorICBEV19UQUdfbG9fdXNlciA9IDB4NDA4MCwKKyAgRFdfVEFHX2hpX3VzZXIgPSAweGZmZmYsCisgIERXX1RBR191c2VyX2Jhc2UgPSAweDEwMDAgLy8vPCBSZWNvbW1lbmRlZCBiYXNlIGZvciB1c2VyIHRhZ3MuCit9OworCitpbmxpbmUgYm9vbCBpc1R5cGUoVGFnIFQpIHsKKyAgc3dpdGNoIChUKSB7CisgIGNhc2UgRFdfVEFHX2FycmF5X3R5cGU6CisgIGNhc2UgRFdfVEFHX2NsYXNzX3R5cGU6CisgIGNhc2UgRFdfVEFHX2ludGVyZmFjZV90eXBlOgorICBjYXNlIERXX1RBR19lbnVtZXJhdGlvbl90eXBlOgorICBjYXNlIERXX1RBR19wb2ludGVyX3R5cGU6CisgIGNhc2UgRFdfVEFHX3JlZmVyZW5jZV90eXBlOgorICBjYXNlIERXX1RBR19ydmFsdWVfcmVmZXJlbmNlX3R5cGU6CisgIGNhc2UgRFdfVEFHX3N0cmluZ190eXBlOgorICBjYXNlIERXX1RBR19zdHJ1Y3R1cmVfdHlwZToKKyAgY2FzZSBEV19UQUdfc3Vicm91dGluZV90eXBlOgorICBjYXNlIERXX1RBR191bmlvbl90eXBlOgorICBjYXNlIERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGU6CisgIGNhc2UgRFdfVEFHX3NldF90eXBlOgorICBjYXNlIERXX1RBR19zdWJyYW5nZV90eXBlOgorICBjYXNlIERXX1RBR19iYXNlX3R5cGU6CisgIGNhc2UgRFdfVEFHX2NvbnN0X3R5cGU6CisgIGNhc2UgRFdfVEFHX2ZpbGVfdHlwZToKKyAgY2FzZSBEV19UQUdfcGFja2VkX3R5cGU6CisgIGNhc2UgRFdfVEFHX3ZvbGF0aWxlX3R5cGU6CisgIGNhc2UgRFdfVEFHX3R5cGVkZWY6CisgICAgcmV0dXJuIHRydWU7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKy8vLyBBdHRyaWJ1dGVzLgorZW51bSBBdHRyaWJ1dGUgOiB1aW50MTZfdCB7CisjZGVmaW5lIEhBTkRMRV9EV19BVChJRCwgTkFNRSwgVkVSU0lPTiwgVkVORE9SKSBEV19BVF8jI05BTUUgPSBJRCwKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYiCisgIERXX0FUX2xvX3VzZXIgPSAweDIwMDAsCisgIERXX0FUX2hpX3VzZXIgPSAweDNmZmYsCit9OworCitlbnVtIEZvcm0gOiB1aW50MTZfdCB7CisjZGVmaW5lIEhBTkRMRV9EV19GT1JNKElELCBOQU1FLCBWRVJTSU9OLCBWRU5ET1IpIERXX0ZPUk1fIyNOQU1FID0gSUQsCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmIgorICBEV19GT1JNX2xvX3VzZXIgPSAweDFmMDAsIC8vLzwgTm90IHNwZWNpZmllZCBieSBEV0FSRi4KK307CisKK2VudW0gTG9jYXRpb25BdG9tIHsKKyNkZWZpbmUgSEFORExFX0RXX09QKElELCBOQU1FLCBWRVJTSU9OLCBWRU5ET1IpIERXX09QXyMjTkFNRSA9IElELAorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKKyAgRFdfT1BfbG9fdXNlciA9IDB4ZTAsCisgIERXX09QX2hpX3VzZXIgPSAweGZmLAorICBEV19PUF9MTFZNX2ZyYWdtZW50ID0gMHgxMDAwIC8vLzwgT25seSB1c2VkIGluIExMVk0gbWV0YWRhdGEuCit9OworCitlbnVtIFR5cGVLaW5kIDogdWludDhfdCB7CisjZGVmaW5lIEhBTkRMRV9EV19BVEUoSUQsIE5BTUUsIFZFUlNJT04sIFZFTkRPUikgRFdfQVRFXyMjTkFNRSA9IElELAorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKKyAgRFdfQVRFX2xvX3VzZXIgPSAweDgwLAorICBEV19BVEVfaGlfdXNlciA9IDB4ZmYKK307CisKK2VudW0gRGVjaW1hbFNpZ25FbmNvZGluZyB7CisgIC8vIERlY2ltYWwgc2lnbiBhdHRyaWJ1dGUgdmFsdWVzCisgIERXX0RTX3Vuc2lnbmVkID0gMHgwMSwKKyAgRFdfRFNfbGVhZGluZ19vdmVycHVuY2ggPSAweDAyLAorICBEV19EU190cmFpbGluZ19vdmVycHVuY2ggPSAweDAzLAorICBEV19EU19sZWFkaW5nX3NlcGFyYXRlID0gMHgwNCwKKyAgRFdfRFNfdHJhaWxpbmdfc2VwYXJhdGUgPSAweDA1Cit9OworCitlbnVtIEVuZGlhbml0eUVuY29kaW5nIHsKKyAgLy8gRW5kaWFuaXR5IGF0dHJpYnV0ZSB2YWx1ZXMKKyAgRFdfRU5EX2RlZmF1bHQgPSAweDAwLAorICBEV19FTkRfYmlnID0gMHgwMSwKKyAgRFdfRU5EX2xpdHRsZSA9IDB4MDIsCisgIERXX0VORF9sb191c2VyID0gMHg0MCwKKyAgRFdfRU5EX2hpX3VzZXIgPSAweGZmCit9OworCitlbnVtIEFjY2Vzc0F0dHJpYnV0ZSB7CisgIC8vIEFjY2Vzc2liaWxpdHkgY29kZXMKKyAgRFdfQUNDRVNTX3B1YmxpYyA9IDB4MDEsCisgIERXX0FDQ0VTU19wcm90ZWN0ZWQgPSAweDAyLAorICBEV19BQ0NFU1NfcHJpdmF0ZSA9IDB4MDMKK307CisKK2VudW0gVmlzaWJpbGl0eUF0dHJpYnV0ZSB7CisgIC8vIFZpc2liaWxpdHkgY29kZXMKKyAgRFdfVklTX2xvY2FsID0gMHgwMSwKKyAgRFdfVklTX2V4cG9ydGVkID0gMHgwMiwKKyAgRFdfVklTX3F1YWxpZmllZCA9IDB4MDMKK307CisKK2VudW0gVmlydHVhbGl0eUF0dHJpYnV0ZSB7CisjZGVmaW5lIEhBTkRMRV9EV19WSVJUVUFMSVRZKElELCBOQU1FKSBEV19WSVJUVUFMSVRZXyMjTkFNRSA9IElELAorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKKyAgRFdfVklSVFVBTElUWV9tYXggPSAweDAyCit9OworCitlbnVtIERlZmF1bHRlZE1lbWJlckF0dHJpYnV0ZSB7CisjZGVmaW5lIEhBTkRMRV9EV19ERUZBVUxURUQoSUQsIE5BTUUpIERXX0RFRkFVTFRFRF8jI05BTUUgPSBJRCwKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYiCisgIERXX0RFRkFVTFRFRF9tYXggPSAweDAyCit9OworCitlbnVtIFNvdXJjZUxhbmd1YWdlIHsKKyNkZWZpbmUgSEFORExFX0RXX0xBTkcoSUQsIE5BTUUsIFZFUlNJT04sIFZFTkRPUikgRFdfTEFOR18jI05BTUUgPSBJRCwKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYiCisgIERXX0xBTkdfbG9fdXNlciA9IDB4ODAwMCwKKyAgRFdfTEFOR19oaV91c2VyID0gMHhmZmZmCit9OworCitlbnVtIENhc2VTZW5zaXRpdml0eSB7CisgIC8vIElkZW50aWZpZXIgY2FzZSBjb2RlcworICBEV19JRF9jYXNlX3NlbnNpdGl2ZSA9IDB4MDAsCisgIERXX0lEX3VwX2Nhc2UgPSAweDAxLAorICBEV19JRF9kb3duX2Nhc2UgPSAweDAyLAorICBEV19JRF9jYXNlX2luc2Vuc2l0aXZlID0gMHgwMworfTsKKworZW51bSBDYWxsaW5nQ29udmVudGlvbiB7CisvLyBDYWxsaW5nIGNvbnZlbnRpb24gY29kZXMKKyNkZWZpbmUgSEFORExFX0RXX0NDKElELCBOQU1FKSBEV19DQ18jI05BTUUgPSBJRCwKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYiCisgIERXX0NDX2xvX3VzZXIgPSAweDQwLAorICBEV19DQ19oaV91c2VyID0gMHhmZgorfTsKKworZW51bSBJbmxpbmVBdHRyaWJ1dGUgeworICAvLyBJbmxpbmUgY29kZXMKKyAgRFdfSU5MX25vdF9pbmxpbmVkID0gMHgwMCwKKyAgRFdfSU5MX2lubGluZWQgPSAweDAxLAorICBEV19JTkxfZGVjbGFyZWRfbm90X2lubGluZWQgPSAweDAyLAorICBEV19JTkxfZGVjbGFyZWRfaW5saW5lZCA9IDB4MDMKK307CisKK2VudW0gQXJyYXlEaW1lbnNpb25PcmRlcmluZyB7CisgIC8vIEFycmF5IG9yZGVyaW5nCisgIERXX09SRF9yb3dfbWFqb3IgPSAweDAwLAorICBEV19PUkRfY29sX21ham9yID0gMHgwMQorfTsKKworZW51bSBEaXNjcmltaW5hbnRMaXN0IHsKKyAgLy8gRGlzY3JpbWluYW50IGRlc2NyaXB0b3IgdmFsdWVzCisgIERXX0RTQ19sYWJlbCA9IDB4MDAsCisgIERXX0RTQ19yYW5nZSA9IDB4MDEKK307CisKKy8vLyBMaW5lIE51bWJlciBTdGFuZGFyZCBPcGNvZGUgRW5jb2RpbmdzLgorZW51bSBMaW5lTnVtYmVyT3BzIDogdWludDhfdCB7CisjZGVmaW5lIEhBTkRMRV9EV19MTlMoSUQsIE5BTUUpIERXX0xOU18jI05BTUUgPSBJRCwKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYiCit9OworCisvLy8gTGluZSBOdW1iZXIgRXh0ZW5kZWQgT3Bjb2RlIEVuY29kaW5ncy4KK2VudW0gTGluZU51bWJlckV4dGVuZGVkT3BzIHsKKyNkZWZpbmUgSEFORExFX0RXX0xORShJRCwgTkFNRSkgRFdfTE5FXyMjTkFNRSA9IElELAorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKKyAgRFdfTE5FX2xvX3VzZXIgPSAweDgwLAorICBEV19MTkVfaGlfdXNlciA9IDB4ZmYKK307CisKK2VudW0gTGluZU51bWJlckVudHJ5Rm9ybWF0IHsKKyNkZWZpbmUgSEFORExFX0RXX0xOQ1QoSUQsIE5BTUUpIERXX0xOQ1RfIyNOQU1FID0gSUQsCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmIgorICBEV19MTkNUX2xvX3VzZXIgPSAweDIwMDAsCisgIERXX0xOQ1RfaGlfdXNlciA9IDB4M2ZmZiwKK307CisKK2VudW0gTWFjaW5mb1JlY29yZFR5cGUgeworICAvLyBNYWNpbmZvIFR5cGUgRW5jb2RpbmdzCisgIERXX01BQ0lORk9fZGVmaW5lID0gMHgwMSwKKyAgRFdfTUFDSU5GT191bmRlZiA9IDB4MDIsCisgIERXX01BQ0lORk9fc3RhcnRfZmlsZSA9IDB4MDMsCisgIERXX01BQ0lORk9fZW5kX2ZpbGUgPSAweDA0LAorICBEV19NQUNJTkZPX3ZlbmRvcl9leHQgPSAweGZmCit9OworCisvLy8gRFdBUkYgdjUgbWFjcm8gaW5mb3JtYXRpb24gZW50cnkgdHlwZSBlbmNvZGluZ3MuCitlbnVtIE1hY3JvRW50cnlUeXBlIHsKKyNkZWZpbmUgSEFORExFX0RXX01BQ1JPKElELCBOQU1FKSBEV19NQUNST18jI05BTUUgPSBJRCwKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYiCisgIERXX01BQ1JPX2xvX3VzZXIgPSAweGUwLAorICBEV19NQUNST19oaV91c2VyID0gMHhmZgorfTsKKworLy8vIERXQVJGIHY1IHJhbmdlIGxpc3QgZW50cnkgZW5jb2RpbmcgdmFsdWVzLgorZW51bSBSYW5nZUxpc3RFbnRyaWVzIHsKKyNkZWZpbmUgSEFORExFX0RXX1JMRShJRCwgTkFNRSkgRFdfUkxFXyMjTkFNRSA9IElELAorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKK307CisKKy8vLyBDYWxsIGZyYW1lIGluc3RydWN0aW9uIGVuY29kaW5ncy4KK2VudW0gQ2FsbEZyYW1lSW5mbyB7CisjZGVmaW5lIEhBTkRMRV9EV19DRkEoSUQsIE5BTUUpIERXX0NGQV8jI05BTUUgPSBJRCwKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYiCisgIERXX0NGQV9leHRlbmRlZCA9IDB4MDAsCisKKyAgRFdfQ0ZBX2xvX3VzZXIgPSAweDFjLAorICBEV19DRkFfaGlfdXNlciA9IDB4M2YKK307CisKK2VudW0gQ29uc3RhbnRzIHsKKyAgLy8gQ2hpbGRyZW4gZmxhZworICBEV19DSElMRFJFTl9ubyA9IDB4MDAsCisgIERXX0NISUxEUkVOX3llcyA9IDB4MDEsCisKKyAgRFdfRUhfUEVfYWJzcHRyID0gMHgwMCwKKyAgRFdfRUhfUEVfb21pdCA9IDB4ZmYsCisgIERXX0VIX1BFX3VsZWIxMjggPSAweDAxLAorICBEV19FSF9QRV91ZGF0YTIgPSAweDAyLAorICBEV19FSF9QRV91ZGF0YTQgPSAweDAzLAorICBEV19FSF9QRV91ZGF0YTggPSAweDA0LAorICBEV19FSF9QRV9zbGViMTI4ID0gMHgwOSwKKyAgRFdfRUhfUEVfc2RhdGEyID0gMHgwQSwKKyAgRFdfRUhfUEVfc2RhdGE0ID0gMHgwQiwKKyAgRFdfRUhfUEVfc2RhdGE4ID0gMHgwQywKKyAgRFdfRUhfUEVfc2lnbmVkID0gMHgwOCwKKyAgRFdfRUhfUEVfcGNyZWwgPSAweDEwLAorICBEV19FSF9QRV90ZXh0cmVsID0gMHgyMCwKKyAgRFdfRUhfUEVfZGF0YXJlbCA9IDB4MzAsCisgIERXX0VIX1BFX2Z1bmNyZWwgPSAweDQwLAorICBEV19FSF9QRV9hbGlnbmVkID0gMHg1MCwKKyAgRFdfRUhfUEVfaW5kaXJlY3QgPSAweDgwCit9OworCisvLy8gQ29uc3RhbnRzIGZvciBsb2NhdGlvbiBsaXN0cyBpbiBEV0FSRiB2NS4KK2VudW0gTG9jYXRpb25MaXN0RW50cnkgOiB1bnNpZ25lZCBjaGFyIHsKKyAgRFdfTExFX2VuZF9vZl9saXN0ID0gMHgwMCwKKyAgRFdfTExFX2Jhc2VfYWRkcmVzc3ggPSAweDAxLAorICBEV19MTEVfc3RhcnR4X2VuZHggPSAweDAyLAorICBEV19MTEVfc3RhcnR4X2xlbmd0aCA9IDB4MDMsCisgIERXX0xMRV9vZmZzZXRfcGFpciA9IDB4MDQsCisgIERXX0xMRV9kZWZhdWx0X2xvY2F0aW9uID0gMHgwNSwKKyAgRFdfTExFX2Jhc2VfYWRkcmVzcyA9IDB4MDYsCisgIERXX0xMRV9zdGFydF9lbmQgPSAweDA3LAorICBEV19MTEVfc3RhcnRfbGVuZ3RoID0gMHgwOAorfTsKKworLy8vIENvbnN0YW50cyBmb3IgdGhlIERXX0FQUExFX1BST1BFUlRZX2F0dHJpYnV0ZXMgYXR0cmlidXRlLgorLy8vIEtlZXAgdGhpcyBsaXN0IGluIHN5bmMgd2l0aCBjbGFuZydzIERlY2xTcGVjLmggT2JqQ1Byb3BlcnR5QXR0cmlidXRlS2luZCEKK2VudW0gQXBwbGVQcm9wZXJ0eUF0dHJpYnV0ZXMgeworI2RlZmluZSBIQU5ETEVfRFdfQVBQTEVfUFJPUEVSVFkoSUQsIE5BTUUpIERXX0FQUExFX1BST1BFUlRZXyMjTkFNRSA9IElELAorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKK307CisKKy8vLyBDb25zdGFudHMgZm9yIHVuaXQgdHlwZXMgaW4gRFdBUkYgdjUuCitlbnVtIFVuaXRUeXBlIDogdW5zaWduZWQgY2hhciB7CisjZGVmaW5lIEhBTkRMRV9EV19VVChJRCwgTkFNRSkgRFdfVVRfIyNOQU1FID0gSUQsCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmIgorICBEV19VVF9sb191c2VyID0gMHg4MCwKKyAgRFdfVVRfaGlfdXNlciA9IDB4ZmYKK307CisKK2VudW0gSW5kZXggeworI2RlZmluZSBIQU5ETEVfRFdfSURYKElELCBOQU1FKSBEV19JRFhfIyNOQU1FID0gSUQsCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmIgorICBEV19JRFhfbG9fdXNlciA9IDB4MjAwMCwKKyAgRFdfSURYX2hpX3VzZXIgPSAweDNmZmYKK307CisKK2lubGluZSBib29sIGlzVW5pdFR5cGUodWludDhfdCBVbml0VHlwZSkgeworICBzd2l0Y2ggKFVuaXRUeXBlKSB7CisgIGNhc2UgRFdfVVRfY29tcGlsZToKKyAgY2FzZSBEV19VVF90eXBlOgorICBjYXNlIERXX1VUX3BhcnRpYWw6CisgIGNhc2UgRFdfVVRfc2tlbGV0b246CisgIGNhc2UgRFdfVVRfc3BsaXRfY29tcGlsZToKKyAgY2FzZSBEV19VVF9zcGxpdF90eXBlOgorICAgIHJldHVybiB0cnVlOworICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitpbmxpbmUgYm9vbCBpc1VuaXRUeXBlKGR3YXJmOjpUYWcgVCkgeworICBzd2l0Y2ggKFQpIHsKKyAgY2FzZSBEV19UQUdfY29tcGlsZV91bml0OgorICBjYXNlIERXX1RBR190eXBlX3VuaXQ6CisgIGNhc2UgRFdfVEFHX3BhcnRpYWxfdW5pdDoKKyAgY2FzZSBEV19UQUdfc2tlbGV0b25fdW5pdDoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLy8gQ29uc3RhbnRzIGZvciB0aGUgRFdBUkYgdjUgQWNjZWxlcmF0b3IgVGFibGUgUHJvcG9zYWwKK2VudW0gQWNjZWxlcmF0b3JUYWJsZSB7CisgIC8vIERhdGEgbGF5b3V0IGRlc2NyaXB0b3JzLgorICBEV19BVE9NX251bGwgPSAwdSwgICAgICAgLy8vICBNYXJrZXIgYXMgdGhlIGVuZCBvZiBhIGxpc3Qgb2YgYXRvbXMuCisgIERXX0FUT01fZGllX29mZnNldCA9IDF1LCAvLyBESUUgb2Zmc2V0IGluIHRoZSBkZWJ1Z19pbmZvIHNlY3Rpb24uCisgIERXX0FUT01fY3Vfb2Zmc2V0ID0gMnUsIC8vIE9mZnNldCBvZiB0aGUgY29tcGlsZSB1bml0IGhlYWRlciB0aGF0IGNvbnRhaW5zIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVtIGluIHF1ZXN0aW9uLgorICBEV19BVE9NX2RpZV90YWcgPSAzdSwgICAvLyBBIHRhZyBlbnRyeS4KKyAgRFdfQVRPTV90eXBlX2ZsYWdzID0gNHUsIC8vIFNldCBvZiBmbGFncyBmb3IgYSB0eXBlLgorCisgIERXX0FUT01fdHlwZV90eXBlX2ZsYWdzID0gNXUsIC8vIERzeW11dGlsIHR5cGUgZXh0ZW5zaW9uLgorICBEV19BVE9NX3F1YWxfbmFtZV9oYXNoID0gNnUsICAvLyBEc3ltdXRpbCBxdWFsaWZpZWQgaGFzaCBleHRlbnNpb24uCisKKyAgLy8gRFdfQVRPTV90eXBlX2ZsYWdzIHZhbHVlcy4KKworICAvLyBBbHdheXMgc2V0IGZvciBDKyssIG9ubHkgc2V0IGZvciBPYmpDIGlmIHRoaXMgaXMgdGhlIEBpbXBsZW1lbnRhdGlvbiBmb3IgYQorICAvLyBjbGFzcy4KKyAgRFdfRkxBR190eXBlX2ltcGxlbWVudGF0aW9uID0gMnUsCisKKyAgLy8gSGFzaCBmdW5jdGlvbnMuCisKKyAgLy8gRGFuaWVsIEouIEJlcm5zdGVpbiBoYXNoLgorICBEV19oYXNoX2Z1bmN0aW9uX2RqYiA9IDB1Cit9OworCisvLyBDb25zdGFudHMgZm9yIHRoZSBHTlUgcHVibmFtZXMvcHVidHlwZXMgZXh0ZW5zaW9ucyBzdXBwb3J0aW5nIGdkYiBpbmRleC4KK2VudW0gR0RCSW5kZXhFbnRyeUtpbmQgeworICBHSUVLX05PTkUsCisgIEdJRUtfVFlQRSwKKyAgR0lFS19WQVJJQUJMRSwKKyAgR0lFS19GVU5DVElPTiwKKyAgR0lFS19PVEhFUiwKKyAgR0lFS19VTlVTRUQ1LAorICBHSUVLX1VOVVNFRDYsCisgIEdJRUtfVU5VU0VENworfTsKKworZW51bSBHREJJbmRleEVudHJ5TGlua2FnZSB7IEdJRUxfRVhURVJOQUwsIEdJRUxfU1RBVElDIH07CisKKy8vLyBcZGVmZ3JvdXAgRHdhcmZDb25zdGFudHNEdW1waW5nIER3YXJmIGNvbnN0YW50cyBkdW1waW5nIGZ1bmN0aW9ucworLy8vCisvLy8gQWxsIHRoZXNlIGZ1bmN0aW9ucyBtYXAgdGhlaXIgYXJndW1lbnQncyB2YWx1ZSBiYWNrIHRvIHRoZQorLy8vIGNvcnJlc3BvbmRpbmcgZW51bWVyYXRvciBuYW1lIG9yIHJldHVybiBhbiBlbXB0eSBTdHJpbmdSZWYgaWYgdGhlIHZhbHVlCisvLy8gaXNuJ3Qga25vd24uCisvLy8KKy8vLyBAeworU3RyaW5nUmVmIFRhZ1N0cmluZyh1bnNpZ25lZCBUYWcpOworU3RyaW5nUmVmIENoaWxkcmVuU3RyaW5nKHVuc2lnbmVkIENoaWxkcmVuKTsKK1N0cmluZ1JlZiBBdHRyaWJ1dGVTdHJpbmcodW5zaWduZWQgQXR0cmlidXRlKTsKK1N0cmluZ1JlZiBGb3JtRW5jb2RpbmdTdHJpbmcodW5zaWduZWQgRW5jb2RpbmcpOworU3RyaW5nUmVmIE9wZXJhdGlvbkVuY29kaW5nU3RyaW5nKHVuc2lnbmVkIEVuY29kaW5nKTsKK1N0cmluZ1JlZiBBdHRyaWJ1dGVFbmNvZGluZ1N0cmluZyh1bnNpZ25lZCBFbmNvZGluZyk7CitTdHJpbmdSZWYgRGVjaW1hbFNpZ25TdHJpbmcodW5zaWduZWQgU2lnbik7CitTdHJpbmdSZWYgRW5kaWFuaXR5U3RyaW5nKHVuc2lnbmVkIEVuZGlhbik7CitTdHJpbmdSZWYgQWNjZXNzaWJpbGl0eVN0cmluZyh1bnNpZ25lZCBBY2Nlc3MpOworU3RyaW5nUmVmIFZpc2liaWxpdHlTdHJpbmcodW5zaWduZWQgVmlzaWJpbGl0eSk7CitTdHJpbmdSZWYgVmlydHVhbGl0eVN0cmluZyh1bnNpZ25lZCBWaXJ0dWFsaXR5KTsKK1N0cmluZ1JlZiBMYW5ndWFnZVN0cmluZyh1bnNpZ25lZCBMYW5ndWFnZSk7CitTdHJpbmdSZWYgQ2FzZVN0cmluZyh1bnNpZ25lZCBDYXNlKTsKK1N0cmluZ1JlZiBDb252ZW50aW9uU3RyaW5nKHVuc2lnbmVkIENvbnZlbnRpb24pOworU3RyaW5nUmVmIElubGluZUNvZGVTdHJpbmcodW5zaWduZWQgQ29kZSk7CitTdHJpbmdSZWYgQXJyYXlPcmRlclN0cmluZyh1bnNpZ25lZCBPcmRlcik7CitTdHJpbmdSZWYgTE5TdGFuZGFyZFN0cmluZyh1bnNpZ25lZCBTdGFuZGFyZCk7CitTdHJpbmdSZWYgTE5FeHRlbmRlZFN0cmluZyh1bnNpZ25lZCBFbmNvZGluZyk7CitTdHJpbmdSZWYgTWFjaW5mb1N0cmluZyh1bnNpZ25lZCBFbmNvZGluZyk7CitTdHJpbmdSZWYgUmFuZ2VMaXN0RW5jb2RpbmdTdHJpbmcodW5zaWduZWQgRW5jb2RpbmcpOworU3RyaW5nUmVmIENhbGxGcmFtZVN0cmluZyh1bnNpZ25lZCBFbmNvZGluZyk7CitTdHJpbmdSZWYgQXBwbGVQcm9wZXJ0eVN0cmluZyh1bnNpZ25lZCk7CitTdHJpbmdSZWYgVW5pdFR5cGVTdHJpbmcodW5zaWduZWQpOworU3RyaW5nUmVmIEF0b21UeXBlU3RyaW5nKHVuc2lnbmVkIEF0b20pOworU3RyaW5nUmVmIEdEQkluZGV4RW50cnlLaW5kU3RyaW5nKEdEQkluZGV4RW50cnlLaW5kIEtpbmQpOworU3RyaW5nUmVmIEdEQkluZGV4RW50cnlMaW5rYWdlU3RyaW5nKEdEQkluZGV4RW50cnlMaW5rYWdlIExpbmthZ2UpOworU3RyaW5nUmVmIEluZGV4U3RyaW5nKHVuc2lnbmVkIElkeCk7CisvLy8gQH0KKworLy8vIFxkZWZncm91cCBEd2FyZkNvbnN0YW50c1BhcnNpbmcgRHdhcmYgY29uc3RhbnRzIHBhcnNpbmcgZnVuY3Rpb25zCisvLy8KKy8vLyBUaGVzZSBmdW5jdGlvbnMgbWFwIHRoZWlyIHN0cmluZ3MgYmFjayB0byB0aGUgY29ycmVzcG9uZGluZyBlbnVtZXJhdGlvbgorLy8vIHZhbHVlIG9yIHJldHVybiAwIGlmIHRoZXJlIGlzIG5vbmUsIGV4Y2VwdCBmb3IgdGhlc2UgZXhjZXB0aW9uczoKKy8vLworLy8vIFxsaSBcYSBnZXRUYWcoKSByZXR1cm5zIFxhIERXX1RBR19pbnZhbGlkIG9uIGludmFsaWQgaW5wdXQuCisvLy8gXGxpIFxhIGdldFZpcnR1YWxpdHkoKSByZXR1cm5zIFxhIERXX1ZJUlRVQUxJVFlfaW52YWxpZCBvbiBpbnZhbGlkIGlucHV0LgorLy8vIFxsaSBcYSBnZXRNYWNpbmZvKCkgcmV0dXJucyBcYSBEV19NQUNJTkZPX2ludmFsaWQgb24gaW52YWxpZCBpbnB1dC4KKy8vLworLy8vIEB7Cit1bnNpZ25lZCBnZXRUYWcoU3RyaW5nUmVmIFRhZ1N0cmluZyk7Cit1bnNpZ25lZCBnZXRPcGVyYXRpb25FbmNvZGluZyhTdHJpbmdSZWYgT3BlcmF0aW9uRW5jb2RpbmdTdHJpbmcpOwordW5zaWduZWQgZ2V0VmlydHVhbGl0eShTdHJpbmdSZWYgVmlydHVhbGl0eVN0cmluZyk7Cit1bnNpZ25lZCBnZXRMYW5ndWFnZShTdHJpbmdSZWYgTGFuZ3VhZ2VTdHJpbmcpOwordW5zaWduZWQgZ2V0Q2FsbGluZ0NvbnZlbnRpb24oU3RyaW5nUmVmIExhbmd1YWdlU3RyaW5nKTsKK3Vuc2lnbmVkIGdldEF0dHJpYnV0ZUVuY29kaW5nKFN0cmluZ1JlZiBFbmNvZGluZ1N0cmluZyk7Cit1bnNpZ25lZCBnZXRNYWNpbmZvKFN0cmluZ1JlZiBNYWNpbmZvU3RyaW5nKTsKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIER3YXJmQ29uc3RhbnRzVmVyc2lvbmluZyBEd2FyZiB2ZXJzaW9uIGZvciBjb25zdGFudHMKKy8vLworLy8vIEZvciBjb25zdGFudHMgZGVmaW5lZCBieSBEV0FSRiwgcmV0dXJucyB0aGUgRFdBUkYgdmVyc2lvbiB3aGVuIHRoZSBjb25zdGFudAorLy8vIHdhcyBmaXJzdCBkZWZpbmVkLiBGb3IgdmVuZG9yIGV4dGVuc2lvbnMsIGlmIHRoZXJlIGlzIGEgdmVyc2lvbi1yZWxhdGVkCisvLy8gcG9saWN5IGZvciB3aGVuIHRvIGVtaXQgaXQsIHJldHVybnMgYSB2ZXJzaW9uIG51bWJlciBmb3IgdGhhdCBwb2xpY3kuCisvLy8gT3RoZXJ3aXNlIHJldHVybnMgMC4KKy8vLworLy8vIEB7Cit1bnNpZ25lZCBUYWdWZXJzaW9uKFRhZyBUKTsKK3Vuc2lnbmVkIEF0dHJpYnV0ZVZlcnNpb24oQXR0cmlidXRlIEEpOwordW5zaWduZWQgRm9ybVZlcnNpb24oRm9ybSBGKTsKK3Vuc2lnbmVkIE9wZXJhdGlvblZlcnNpb24oTG9jYXRpb25BdG9tIE8pOwordW5zaWduZWQgQXR0cmlidXRlRW5jb2RpbmdWZXJzaW9uKFR5cGVLaW5kIEUpOwordW5zaWduZWQgTGFuZ3VhZ2VWZXJzaW9uKFNvdXJjZUxhbmd1YWdlIEwpOworLy8vIEB9CisKKy8vLyBcZGVmZ3JvdXAgRHdhcmZDb25zdGFudHNWZW5kb3IgRHdhcmYgInZlbmRvciIgZm9yIGNvbnN0YW50cworLy8vCisvLy8gVGhlc2UgZnVuY3Rpb25zIHJldHVybiBhbiBpZGVudGlmaWVyIGRlc2NyaWJpbmcgIndobyIgZGVmaW5lZCB0aGUgY29uc3RhbnQsCisvLy8gZWl0aGVyIHRoZSBEV0FSRiBzdGFuZGFyZCBpdHNlbGYgb3IgdGhlIHZlbmRvciB3aG8gZGVmaW5lZCB0aGUgZXh0ZW5zaW9uLgorLy8vCisvLy8gQHsKK3Vuc2lnbmVkIFRhZ1ZlbmRvcihUYWcgVCk7Cit1bnNpZ25lZCBBdHRyaWJ1dGVWZW5kb3IoQXR0cmlidXRlIEEpOwordW5zaWduZWQgRm9ybVZlbmRvcihGb3JtIEYpOwordW5zaWduZWQgT3BlcmF0aW9uVmVuZG9yKExvY2F0aW9uQXRvbSBPKTsKK3Vuc2lnbmVkIEF0dHJpYnV0ZUVuY29kaW5nVmVuZG9yKFR5cGVLaW5kIEUpOwordW5zaWduZWQgTGFuZ3VhZ2VWZW5kb3IoU291cmNlTGFuZ3VhZ2UgTCk7CisvLy8gQH0KKworLy8vIEEgaGVscGVyIHN0cnVjdCBwcm92aWRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJ5dGUgc2l6ZSBvZiBEV19GT1JNCisvLy8gdmFsdWVzIHRoYXQgdmFyeSBpbiBzaXplIGRlcGVuZGluZyBvbiB0aGUgRFdBUkYgdmVyc2lvbiwgYWRkcmVzcyBieXRlCisvLy8gc2l6ZSwgb3IgRFdBUkYzMi9EV0FSRjY0Lgorc3RydWN0IEZvcm1QYXJhbXMgeworICB1aW50MTZfdCBWZXJzaW9uOworICB1aW50OF90IEFkZHJTaXplOworICBEd2FyZkZvcm1hdCBGb3JtYXQ7CisKKyAgLy8vIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBzaXplIG9mIGZvcm0gRFdfRk9STV9yZWZfYWRkciBkZXBlbmRzIG9uIHRoZQorICAvLy8gdmVyc2lvbi4gSW4gRFdBUkYgdjIgaXQncyB0aGUgc2l6ZSBvZiBhbiBhZGRyZXNzOyBhZnRlciB0aGF0LCBpdCdzIHRoZQorICAvLy8gc2l6ZSBvZiBhIHJlZmVyZW5jZS4KKyAgdWludDhfdCBnZXRSZWZBZGRyQnl0ZVNpemUoKSBjb25zdCB7CisgICAgaWYgKFZlcnNpb24gPT0gMikKKyAgICAgIHJldHVybiBBZGRyU2l6ZTsKKyAgICByZXR1cm4gZ2V0RHdhcmZPZmZzZXRCeXRlU2l6ZSgpOworICB9CisKKyAgLy8vIFRoZSBzaXplIG9mIGEgcmVmZXJlbmNlIGlzIGRldGVybWluZWQgYnkgdGhlIERXQVJGIDMyLzY0LWJpdCBmb3JtYXQuCisgIHVpbnQ4X3QgZ2V0RHdhcmZPZmZzZXRCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKEZvcm1hdCkgeworICAgIGNhc2UgRHdhcmZGb3JtYXQ6OkRXQVJGMzI6CisgICAgICByZXR1cm4gNDsKKyAgICBjYXNlIER3YXJmRm9ybWF0OjpEV0FSRjY0OgorICAgICAgcmV0dXJuIDg7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgRm9ybWF0IHZhbHVlIik7CisgIH0KKworICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gVmVyc2lvbiAmJiBBZGRyU2l6ZTsgfQorfTsKKworLy8vIEdldCB0aGUgZml4ZWQgYnl0ZSBzaXplIGZvciBhIGdpdmVuIGZvcm0uCisvLy8KKy8vLyBJZiB0aGUgZm9ybSBoYXMgYSBmaXhlZCBieXRlIHNpemUsIHRoZW4gYW4gT3B0aW9uYWwgd2l0aCBhIHZhbHVlIHdpbGwgYmUKKy8vLyByZXR1cm5lZC4gSWYgdGhlIGZvcm0gaXMgYWx3YXlzIGVuY29kZWQgdXNpbmcgYSB2YXJpYWJsZSBsZW5ndGggc3RvcmFnZQorLy8vIGZvcm1hdCAoVUxFQiBvciBTTEVCIG51bWJlcnMgb3IgYmxvY2tzKSB0aGVuIE5vbmUgd2lsbCBiZSByZXR1cm5lZC4KKy8vLworLy8vIFxwYXJhbSBGb3JtIERXQVJGIGZvcm0gdG8gZ2V0IHRoZSBmaXhlZCBieXRlIHNpemUgZm9yLgorLy8vIFxwYXJhbSBQYXJhbXMgRFdBUkYgcGFyYW1ldGVycyB0byBoZWxwIGludGVycHJldCBmb3Jtcy4KKy8vLyBccmV0dXJucyBPcHRpb25hbDx1aW50OF90PiB2YWx1ZSB3aXRoIHRoZSBmaXhlZCBieXRlIHNpemUgb3IgTm9uZSBpZgorLy8vIFxwIEZvcm0gZG9lc24ndCBoYXZlIGEgZml4ZWQgYnl0ZSBzaXplLgorT3B0aW9uYWw8dWludDhfdD4gZ2V0Rml4ZWRGb3JtQnl0ZVNpemUoZHdhcmY6OkZvcm0gRm9ybSwgRm9ybVBhcmFtcyBQYXJhbXMpOworCisvLy8gVGVsbHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGZvcm0gaXMgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWVkIHZlcnNpb24sCisvLy8gb3IgaXMgYW4gZXh0ZW5zaW9uIGlmIGV4dGVuc2lvbnMgYXJlIGFsbG93ZWQuCitib29sIGlzVmFsaWRGb3JtRm9yVmVyc2lvbihGb3JtIEYsIHVuc2lnbmVkIFZlcnNpb24sIGJvb2wgRXh0ZW5zaW9uc09rID0gdHJ1ZSk7CisKKy8vLyBSZXR1cm5zIHRoZSBzeW1ib2xpYyBzdHJpbmcgcmVwcmVzZW50aW5nIFZhbCB3aGVuIHVzZWQgYXMgYSB2YWx1ZQorLy8vIGZvciBhdHRyaWJ1dGUgQXR0ci4KK1N0cmluZ1JlZiBBdHRyaWJ1dGVWYWx1ZVN0cmluZyh1aW50MTZfdCBBdHRyLCB1bnNpZ25lZCBWYWwpOworCisvLy8gRGVzY3JpYmVzIGFuIGVudHJ5IG9mIHRoZSB2YXJpb3VzIGdudV9wdWIqIGRlYnVnIHNlY3Rpb25zLgorLy8vCisvLy8gVGhlIGdudV9wdWIqIGtpbmQgbG9va3MgbGlrZToKKy8vLworLy8vIDAtMyAgcmVzZXJ2ZWQKKy8vLyA0LTYgIHN5bWJvbCBraW5kCisvLy8gNyAgICAwID09IGdsb2JhbCwgMSA9PSBzdGF0aWMKKy8vLworLy8vIEEgZ2RiX2luZGV4IGRlc2NyaXB0b3IgaW5jbHVkZXMgdGhlIGFib3ZlIGtpbmQsIHNoaWZ0ZWQgMjQgYml0cyB1cCB3aXRoIHRoZQorLy8vIG9mZnNldCBvZiB0aGUgY3Ugd2l0aGluIHRoZSBkZWJ1Z19pbmZvIHNlY3Rpb24gc3RvcmVkIGluIHRob3NlIDI0IGJpdHMuCitzdHJ1Y3QgUHViSW5kZXhFbnRyeURlc2NyaXB0b3IgeworICBHREJJbmRleEVudHJ5S2luZCBLaW5kOworICBHREJJbmRleEVudHJ5TGlua2FnZSBMaW5rYWdlOworICBQdWJJbmRleEVudHJ5RGVzY3JpcHRvcihHREJJbmRleEVudHJ5S2luZCBLaW5kLCBHREJJbmRleEVudHJ5TGlua2FnZSBMaW5rYWdlKQorICAgICAgOiBLaW5kKEtpbmQpLCBMaW5rYWdlKExpbmthZ2UpIHt9CisgIC8qIGltcGxpY2l0ICovIFB1YkluZGV4RW50cnlEZXNjcmlwdG9yKEdEQkluZGV4RW50cnlLaW5kIEtpbmQpCisgICAgICA6IEtpbmQoS2luZCksIExpbmthZ2UoR0lFTF9FWFRFUk5BTCkge30KKyAgZXhwbGljaXQgUHViSW5kZXhFbnRyeURlc2NyaXB0b3IodWludDhfdCBWYWx1ZSkKKyAgICAgIDogS2luZCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEdEQkluZGV4RW50cnlLaW5kPigoVmFsdWUgJiBLSU5EX01BU0spID4+IEtJTkRfT0ZGU0VUKSksCisgICAgICAgIExpbmthZ2Uoc3RhdGljX2Nhc3Q8R0RCSW5kZXhFbnRyeUxpbmthZ2U+KChWYWx1ZSAmIExJTktBR0VfTUFTSykgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElOS0FHRV9PRkZTRVQpKSB7fQorICB1aW50OF90IHRvQml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gS2luZCA8PCBLSU5EX09GRlNFVCB8IExpbmthZ2UgPDwgTElOS0FHRV9PRkZTRVQ7CisgIH0KKworcHJpdmF0ZToKKyAgZW51bSB7CisgICAgS0lORF9PRkZTRVQgPSA0LAorICAgIEtJTkRfTUFTSyA9IDcgPDwgS0lORF9PRkZTRVQsCisgICAgTElOS0FHRV9PRkZTRVQgPSA3LAorICAgIExJTktBR0VfTUFTSyA9IDEgPDwgTElOS0FHRV9PRkZTRVQKKyAgfTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbnVtPiBzdHJ1Y3QgRW51bVRyYWl0cyA6IHB1YmxpYyBzdGQ6OmZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBFbnVtVHJhaXRzPEF0dHJpYnV0ZT4gOiBwdWJsaWMgc3RkOjp0cnVlX3R5cGUgeworICBzdGF0aWMgY29uc3RleHByIGNoYXIgVHlwZVszXSA9ICJBVCI7CisgIHN0YXRpYyBjb25zdGV4cHIgU3RyaW5nUmVmICgqU3RyaW5nRm4pKHVuc2lnbmVkKSA9ICZBdHRyaWJ1dGVTdHJpbmc7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRW51bVRyYWl0czxGb3JtPiA6IHB1YmxpYyBzdGQ6OnRydWVfdHlwZSB7CisgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBUeXBlWzVdID0gIkZPUk0iOworICBzdGF0aWMgY29uc3RleHByIFN0cmluZ1JlZiAoKlN0cmluZ0ZuKSh1bnNpZ25lZCkgPSAmRm9ybUVuY29kaW5nU3RyaW5nOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEVudW1UcmFpdHM8SW5kZXg+IDogcHVibGljIHN0ZDo6dHJ1ZV90eXBlIHsKKyAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIFR5cGVbNF0gPSAiSURYIjsKKyAgc3RhdGljIGNvbnN0ZXhwciBTdHJpbmdSZWYgKCpTdHJpbmdGbikodW5zaWduZWQpID0gJkluZGV4U3RyaW5nOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEVudW1UcmFpdHM8VGFnPiA6IHB1YmxpYyBzdGQ6OnRydWVfdHlwZSB7CisgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBUeXBlWzRdID0gIlRBRyI7CisgIHN0YXRpYyBjb25zdGV4cHIgU3RyaW5nUmVmICgqU3RyaW5nRm4pKHVuc2lnbmVkKSA9ICZUYWdTdHJpbmc7Cit9OworfSAvLyBFbmQgb2YgbmFtZXNwYWNlIGR3YXJmCisKKy8vLyBEd2FyZiBjb25zdGFudHMgZm9ybWF0X3Byb3ZpZGVyCisvLy8KKy8vLyBTcGVjaWFsaXphdGlvbiBvZiB0aGUgZm9ybWF0X3Byb3ZpZGVyIHRlbXBsYXRlIGZvciBkd2FyZiBlbnVtcy4gVW5saWtlIHRoZQorLy8vIGR1bXBpbmcgZnVuY3Rpb25zIGFib3ZlLCB0aGVzZSBmb3JtYXQgdW5rbm93biBlbnVtZXJhdG9yIHZhbHVlcyBhcworLy8vIERXX1RZUEVfdW5rbm93bl8xMjM0IChlLmcuIERXX1RBR191bmtub3duX2ZmZmYpLgordGVtcGxhdGUgPHR5cGVuYW1lIEVudW0+CitzdHJ1Y3QgZm9ybWF0X3Byb3ZpZGVyPAorICAgIEVudW0sIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGR3YXJmOjpFbnVtVHJhaXRzPEVudW0+Ojp2YWx1ZT46OnR5cGU+IHsKKyAgc3RhdGljIHZvaWQgZm9ybWF0KGNvbnN0IEVudW0gJkUsIHJhd19vc3RyZWFtICZPUywgU3RyaW5nUmVmIFN0eWxlKSB7CisgICAgU3RyaW5nUmVmIFN0ciA9IGR3YXJmOjpFbnVtVHJhaXRzPEVudW0+OjpTdHJpbmdGbihFKTsKKyAgICBpZiAoU3RyLmVtcHR5KCkpIHsKKyAgICAgIE9TIDw8ICJEV18iIDw8IGR3YXJmOjpFbnVtVHJhaXRzPEVudW0+OjpUeXBlIDw8ICJfdW5rbm93bl8iCisgICAgICAgICA8PCBsbHZtOjpmb3JtYXQoIiV4IiwgRSk7CisgICAgfSBlbHNlCisgICAgICBPUyA8PCBTdHI7CisgIH0KK307Cit9IC8vIEVuZCBvZiBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0R5bmFtaWNUYWdzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0R5bmFtaWNUYWdzLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzlmMzhhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRHluYW1pY1RhZ3MuZGVmCkBAIC0wLDAgKzEsMTg3IEBACisjaWZuZGVmIERZTkFNSUNfVEFHCisjZXJyb3IgIkRZTkFNSUNfVEFHIG11c3QgYmUgZGVmaW5lZCIKKyNlbmRpZgorCisvLyBBZGQgc2VwYXJhdGUgbWFjcm9zIGZvciB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIHRhZ3MgYW5kIHRoZSBtYXJrZXJzCisvLyBzdWNoIGFzIERUX0hJT1MsIGV0Yy4gdG8gYWxsb3cgdXNpbmcgdGhpcyBmaWxlIHRvIGluIG90aGVyIGNvbnRleHRzLgorLy8gRm9yIGV4YW1wbGUgd2UgY2FuIHVzZSBpdCB0byBnZW5lcmF0ZSBhIHN0cmluZ2lmaWNhdGlvbiBzd2l0Y2ggc3RhdGVtZW50LgorCisjaWZuZGVmIEhFWEFHT05fRFlOQU1JQ19UQUcKKyNkZWZpbmUgSEVYQUdPTl9EWU5BTUlDX1RBRyhuYW1lLCB2YWx1ZSkgRFlOQU1JQ19UQUcobmFtZSwgdmFsdWUpCisjZGVmaW5lIEhFWEFHT05fRFlOQU1JQ19UQUdfREVGSU5FRAorI2VuZGlmCisKKyNpZm5kZWYgTUlQU19EWU5BTUlDX1RBRworI2RlZmluZSBNSVBTX0RZTkFNSUNfVEFHKG5hbWUsIHZhbHVlKSBEWU5BTUlDX1RBRyhuYW1lLCB2YWx1ZSkKKyNkZWZpbmUgTUlQU19EWU5BTUlDX1RBR19ERUZJTkVECisjZW5kaWYKKworI2lmbmRlZiBEWU5BTUlDX1RBR19NQVJLRVIKKyNkZWZpbmUgRFlOQU1JQ19UQUdfTUFSS0VSKG5hbWUsIHZhbHVlKSBEWU5BTUlDX1RBRyhuYW1lLCB2YWx1ZSkKKyNkZWZpbmUgRFlOQU1JQ19UQUdfTUFSS0VSX0RFRklORUQKKyNlbmRpZgorCitEWU5BTUlDX1RBRyhOVUxMLCAwKSAgICAgICAgLy8gTWFya3MgZW5kIG9mIGR5bmFtaWMgYXJyYXkuCitEWU5BTUlDX1RBRyhORUVERUQsIDEpICAgICAgLy8gU3RyaW5nIHRhYmxlIG9mZnNldCBvZiBuZWVkZWQgbGlicmFyeS4KK0RZTkFNSUNfVEFHKFBMVFJFTFNaLCAyKSAgICAvLyBTaXplIG9mIHJlbG9jYXRpb24gZW50cmllcyBpbiBQTFQuCitEWU5BTUlDX1RBRyhQTFRHT1QsIDMpICAgICAgLy8gQWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggbGlua2FnZSB0YWJsZS4KK0RZTkFNSUNfVEFHKEhBU0gsIDQpICAgICAgICAvLyBBZGRyZXNzIG9mIHN5bWJvbGljIGhhc2ggdGFibGUuCitEWU5BTUlDX1RBRyhTVFJUQUIsIDUpICAgICAgLy8gQWRkcmVzcyBvZiBkeW5hbWljIHN0cmluZyB0YWJsZS4KK0RZTkFNSUNfVEFHKFNZTVRBQiwgNikgICAgICAvLyBBZGRyZXNzIG9mIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgorRFlOQU1JQ19UQUcoUkVMQSwgNykgICAgICAgIC8vIEFkZHJlc3Mgb2YgcmVsb2NhdGlvbiB0YWJsZSAoUmVsYSBlbnRyaWVzKS4KK0RZTkFNSUNfVEFHKFJFTEFTWiwgOCkgICAgICAvLyBTaXplIG9mIFJlbGEgcmVsb2NhdGlvbiB0YWJsZS4KK0RZTkFNSUNfVEFHKFJFTEFFTlQsIDkpICAgICAvLyBTaXplIG9mIGEgUmVsYSByZWxvY2F0aW9uIGVudHJ5LgorRFlOQU1JQ19UQUcoU1RSU1osIDEwKSAgICAgIC8vIFRvdGFsIHNpemUgb2YgdGhlIHN0cmluZyB0YWJsZS4KK0RZTkFNSUNfVEFHKFNZTUVOVCwgMTEpICAgICAvLyBTaXplIG9mIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgorRFlOQU1JQ19UQUcoSU5JVCwgMTIpICAgICAgIC8vIEFkZHJlc3Mgb2YgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCitEWU5BTUlDX1RBRyhGSU5JLCAxMykgICAgICAgLy8gQWRkcmVzcyBvZiB0ZXJtaW5hdGlvbiBmdW5jdGlvbi4KK0RZTkFNSUNfVEFHKFNPTkFNRSwgMTQpICAgICAvLyBTdHJpbmcgdGFibGUgb2Zmc2V0IG9mIGEgc2hhcmVkIG9iamVjdHMgbmFtZS4KK0RZTkFNSUNfVEFHKFJQQVRILCAxNSkgICAgICAvLyBTdHJpbmcgdGFibGUgb2Zmc2V0IG9mIGxpYnJhcnkgc2VhcmNoIHBhdGguCitEWU5BTUlDX1RBRyhTWU1CT0xJQywgMTYpICAgLy8gQ2hhbmdlcyBzeW1ib2wgcmVzb2x1dGlvbiBhbGdvcml0aG0uCitEWU5BTUlDX1RBRyhSRUwsIDE3KSAgICAgICAgLy8gQWRkcmVzcyBvZiByZWxvY2F0aW9uIHRhYmxlIChSZWwgZW50cmllcykuCitEWU5BTUlDX1RBRyhSRUxTWiwgMTgpICAgICAgLy8gU2l6ZSBvZiBSZWwgcmVsb2NhdGlvbiB0YWJsZS4KK0RZTkFNSUNfVEFHKFJFTEVOVCwgMTkpICAgICAvLyBTaXplIG9mIGEgUmVsIHJlbG9jYXRpb24gZW50cnkuCitEWU5BTUlDX1RBRyhQTFRSRUwsIDIwKSAgICAgLy8gVHlwZSBvZiByZWxvY2F0aW9uIGVudHJ5IHVzZWQgZm9yIGxpbmtpbmcuCitEWU5BTUlDX1RBRyhERUJVRywgMjEpICAgICAgLy8gUmVzZXJ2ZWQgZm9yIGRlYnVnZ2VyLgorRFlOQU1JQ19UQUcoVEVYVFJFTCwgMjIpICAgIC8vIFJlbG9jYXRpb25zIGV4aXN0IGZvciBub24td3JpdGFibGUgc2VnbWVudHMuCitEWU5BTUlDX1RBRyhKTVBSRUwsIDIzKSAgICAgLy8gQWRkcmVzcyBvZiByZWxvY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggUExULgorRFlOQU1JQ19UQUcoQklORF9OT1csIDI0KSAgIC8vIFByb2Nlc3MgYWxsIHJlbG9jYXRpb25zIGJlZm9yZSBleGVjdXRpb24uCitEWU5BTUlDX1RBRyhJTklUX0FSUkFZLCAyNSkgLy8gUG9pbnRlciB0byBhcnJheSBvZiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuCitEWU5BTUlDX1RBRyhGSU5JX0FSUkFZLCAyNikgLy8gUG9pbnRlciB0byBhcnJheSBvZiB0ZXJtaW5hdGlvbiBmdW5jdGlvbnMuCitEWU5BTUlDX1RBRyhJTklUX0FSUkFZU1osIDI3KSAvLyBTaXplIG9mIERUX0lOSVRfQVJSQVkuCitEWU5BTUlDX1RBRyhGSU5JX0FSUkFZU1osIDI4KSAvLyBTaXplIG9mIERUX0ZJTklfQVJSQVkuCitEWU5BTUlDX1RBRyhSVU5QQVRILCAyOSkgICAgICAvLyBTdHJpbmcgdGFibGUgb2Zmc2V0IG9mIGxpYiBzZWFyY2ggcGF0aC4KK0RZTkFNSUNfVEFHKEZMQUdTLCAzMCkgICAgICAgIC8vIEZsYWdzLgorRFlOQU1JQ19UQUdfTUFSS0VSKEVOQ09ESU5HLCAzMikgLy8gVmFsdWVzIGZyb20gaGVyZSB0byBEVF9MT09TIGZvbGxvdyB0aGUgcnVsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGRfdW4gdW5pb24uCisKK0RZTkFNSUNfVEFHKFBSRUlOSVRfQVJSQVksIDMyKSAgIC8vIFBvaW50ZXIgdG8gYXJyYXkgb2YgcHJlaW5pdCBmdW5jdGlvbnMuCitEWU5BTUlDX1RBRyhQUkVJTklUX0FSUkFZU1osIDMzKSAvLyBTaXplIG9mIHRoZSBEVF9QUkVJTklUX0FSUkFZIGFycmF5LgorCitEWU5BTUlDX1RBR19NQVJLRVIoTE9PUywgMHg2MDAwMDAwMCkgICAvLyBTdGFydCBvZiBlbnZpcm9ubWVudCBzcGVjaWZpYyB0YWdzLgorRFlOQU1JQ19UQUdfTUFSS0VSKEhJT1MsIDB4NkZGRkZGRkYpICAgLy8gRW5kIG9mIGVudmlyb25tZW50IHNwZWNpZmljIHRhZ3MuCitEWU5BTUlDX1RBR19NQVJLRVIoTE9QUk9DLCAweDcwMDAwMDAwKSAvLyBTdGFydCBvZiBwcm9jZXNzb3Igc3BlY2lmaWMgdGFncy4KK0RZTkFNSUNfVEFHX01BUktFUihISVBST0MsIDB4N0ZGRkZGRkYpIC8vIEVuZCBvZiBwcm9jZXNzb3Igc3BlY2lmaWMgdGFncy4KKworLy8gQW5kcm9pZCBwYWNrZWQgcmVsb2NhdGlvbiBzZWN0aW9uIHRhZ3MuCisvLyBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9iaW9uaWMvKy82ZjEyYmZlY2U1ZGNjMDEzMjVlMGFiYmE1NmE0NmIxYmNmOTkxYzY5L3Rvb2xzL3JlbG9jYXRpb25fcGFja2VyL3NyYy9lbGZfZmlsZS5jYyMzMQorRFlOQU1JQ19UQUcoQU5EUk9JRF9SRUwsIDB4NjAwMDAwMEYpCitEWU5BTUlDX1RBRyhBTkRST0lEX1JFTFNaLCAweDYwMDAwMDEwKQorRFlOQU1JQ19UQUcoQU5EUk9JRF9SRUxBLCAweDYwMDAwMDExKQorRFlOQU1JQ19UQUcoQU5EUk9JRF9SRUxBU1osIDB4NjAwMDAwMTIpCisKK0RZTkFNSUNfVEFHKEdOVV9IQVNILCAweDZGRkZGRUY1KSAgICAvLyBSZWZlcmVuY2UgdG8gdGhlIEdOVSBoYXNoIHRhYmxlLgorRFlOQU1JQ19UQUcoVExTREVTQ19QTFQsIDB4NkZGRkZFRjYpIC8vIExvY2F0aW9uIG9mIFBMVCBlbnRyeSBmb3IgVExTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRvciByZXNvbHZlciBjYWxscy4KK0RZTkFNSUNfVEFHKFRMU0RFU0NfR09ULCAweDZGRkZGRUY3KSAvLyBMb2NhdGlvbiBvZiBHT1QgZW50cnkgdXNlZCBieSBUTFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yIHJlc29sdmVyIFBMVCBlbnRyeS4KK0RZTkFNSUNfVEFHKFJFTEFDT1VOVCwgMHg2RkZGRkZGOSkgICAvLyBFTEYzMl9SZWxhIGNvdW50LgorRFlOQU1JQ19UQUcoUkVMQ09VTlQsIDB4NkZGRkZGRkEpICAgIC8vIEVMRjMyX1JlbCBjb3VudC4KKworRFlOQU1JQ19UQUcoRkxBR1NfMSwgMFg2RkZGRkZGQikgLy8gRmxhZ3NfMS4KKworRFlOQU1JQ19UQUcoVkVSU1lNLCAweDZGRkZGRkYwKSAgICAgLy8gVGhlIGFkZHJlc3Mgb2YgLmdudS52ZXJzaW9uIHNlY3Rpb24uCitEWU5BTUlDX1RBRyhWRVJERUYsIDBYNkZGRkZGRkMpICAgICAvLyBUaGUgYWRkcmVzcyBvZiB0aGUgdmVyc2lvbiBkZWZpbml0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWJsZS4KK0RZTkFNSUNfVEFHKFZFUkRFRk5VTSwgMFg2RkZGRkZGRCkgIC8vIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBEVF9WRVJERUYuCitEWU5BTUlDX1RBRyhWRVJORUVELCAwWDZGRkZGRkZFKSAgICAvLyBUaGUgYWRkcmVzcyBvZiB0aGUgdmVyc2lvbiBkZXBlbmRlbmN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWJsZS4KK0RZTkFNSUNfVEFHKFZFUk5FRUROVU0sIDBYNkZGRkZGRkYpIC8vIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBEVF9WRVJORUVELgorCisvLyBIZXhhZ29uIHNwZWNpZmljIGR5bmFtaWMgdGFibGUgZW50cmllcworSEVYQUdPTl9EWU5BTUlDX1RBRyhIRVhBR09OX1NZTVNaLCAweDcwMDAwMDAwKQorSEVYQUdPTl9EWU5BTUlDX1RBRyhIRVhBR09OX1ZFUiwgMHg3MDAwMDAwMSkKK0hFWEFHT05fRFlOQU1JQ19UQUcoSEVYQUdPTl9QTFQsIDB4NzAwMDAwMDIpCisKKy8vIE1pcHMgc3BlY2lmaWMgZHluYW1pYyB0YWJsZSBlbnRyeSB0YWdzLgorCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfUkxEX1ZFUlNJT04sIDB4NzAwMDAwMDEpICAvLyAzMiBiaXQgdmVyc2lvbiBudW1iZXIgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBydW50aW1lIGxpbmtlciBpbnRlcmZhY2UuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfVElNRV9TVEFNUCwgMHg3MDAwMDAwMikgICAvLyBUaW1lIHN0YW1wLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0lDSEVDS1NVTSwgMHg3MDAwMDAwMykgICAgLy8gQ2hlY2tzdW0gb2YgZXh0ZXJuYWwgc3RyaW5ncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGNvbW1vbiBzaXplcy4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19JVkVSU0lPTiwgMHg3MDAwMDAwNCkgICAgIC8vIEluZGV4IG9mIHZlcnNpb24gc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBzdHJpbmcgdGFibGUuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfRkxBR1MsIDB4NzAwMDAwMDUpICAgICAgICAvLyAzMiBiaXRzIG9mIGZsYWdzLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0JBU0VfQUREUkVTUywgMHg3MDAwMDAwNikgLy8gQmFzZSBhZGRyZXNzIG9mIHRoZSBzZWdtZW50LgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX01TWU0sIDB4NzAwMDAwMDcpICAgICAgICAgLy8gQWRkcmVzcyBvZiAubXN5bSBzZWN0aW9uLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0NPTkZMSUNULCAweDcwMDAwMDA4KSAgICAgLy8gQWRkcmVzcyBvZiAuY29uZmxpY3Qgc2VjdGlvbi4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19MSUJMSVNULCAweDcwMDAwMDA5KSAgICAgIC8vIEFkZHJlc3Mgb2YgLmxpYmxpc3Qgc2VjdGlvbi4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19MT0NBTF9HT1ROTywgMHg3MDAwMDAwYSkgIC8vIE51bWJlciBvZiBsb2NhbCBnbG9iYWwgb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWJsZSBlbnRyaWVzLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0NPTkZMSUNUTk8sIDB4NzAwMDAwMGIpICAgLy8gTnVtYmVyIG9mIGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSAuY29uZmxpY3Qgc2VjdGlvbi4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19MSUJMSVNUTk8sIDB4NzAwMDAwMTApICAgIC8vIE51bWJlciBvZiBlbnRyaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgLmxpYmxpc3Qgc2VjdGlvbi4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19TWU1UQUJOTywgMHg3MDAwMDAxMSkgICAgIC8vIE51bWJlciBvZiBlbnRyaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX1VOUkVGRVhUTk8sIDB4NzAwMDAwMTIpICAgLy8gSW5kZXggb2YgZmlyc3QgZXh0ZXJuYWwgZHluYW1pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ltYm9sIG5vdCByZWZlcmVuY2VkIGxvY2FsbHkuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfR09UU1lNLCAweDcwMDAwMDEzKSAgICAgICAvLyBJbmRleCBvZiBmaXJzdCBkeW5hbWljIHN5bWJvbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19ISVBBR0VOTywgMHg3MDAwMDAxNCkgICAgIC8vIE51bWJlciBvZiBwYWdlIHRhYmxlIGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGdsb2JhbCBvZmZzZXQgdGFibGUuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfUkxEX01BUCwgMHg3MDAwMDAxNikgICAgICAvLyBBZGRyZXNzIG9mIHJ1biB0aW1lIGxvYWRlciBtYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgZm9yIGRlYnVnZ2luZy4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19ERUxUQV9DTEFTUywgMHg3MDAwMDAxNykgICAgLy8gRGVsdGEgQysrIGNsYXNzIGRlZmluaXRpb24uCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfREVMVEFfQ0xBU1NfTk8sIDB4NzAwMDAwMTgpIC8vIE51bWJlciBvZiBlbnRyaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIERUX01JUFNfREVMVEFfQ0xBU1MuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfREVMVEFfSU5TVEFOQ0UsIDB4NzAwMDAwMTkpIC8vIERlbHRhIEMrKyBjbGFzcyBpbnN0YW5jZXMuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfREVMVEFfSU5TVEFOQ0VfTk8sIDB4NzAwMDAwMUEpIC8vIE51bWJlciBvZiBlbnRyaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIERUX01JUFNfREVMVEFfSU5TVEFOQ0UuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfREVMVEFfUkVMT0MsIDB4NzAwMDAwMUIpICAgICAgIC8vIERlbHRhIHJlbG9jYXRpb25zLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0RFTFRBX1JFTE9DX05PLCAweDcwMDAwMDFDKSAgICAvLyBOdW1iZXIgb2YgZW50cmllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBEVF9NSVBTX0RFTFRBX1JFTE9DLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0RFTFRBX1NZTSwgMHg3MDAwMDAxRCkgICAgICAgICAvLyBEZWx0YSBzeW1ib2xzIHRoYXQgRGVsdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsb2NhdGlvbnMgcmVmZXIgdG8uCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfREVMVEFfU1lNX05PLCAweDcwMDAwMDFFKSAgICAgIC8vIE51bWJlciBvZiBlbnRyaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIERUX01JUFNfREVMVEFfU1lNLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0RFTFRBX0NMQVNTU1lNLCAweDcwMDAwMDIwKSAgICAvLyBEZWx0YSBzeW1ib2xzIHRoYXQgaG9sZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFzcyBkZWNsYXJhdGlvbnMuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfREVMVEFfQ0xBU1NTWU1fTk8sIDB4NzAwMDAwMjEpIC8vIE51bWJlciBvZiBlbnRyaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIERUX01JUFNfREVMVEFfQ0xBU1NTWU0uCisKK01JUFNfRFlOQU1JQ19UQUcoTUlQU19DWFhfRkxBR1MsIDB4NzAwMDAwMjIpICAgICAgICAgLy8gRmxhZ3MgaW5kaWNhdGluZyBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhYm91dCBDKysgZmxhdm9yLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX1BJWElFX0lOSVQsIDB4NzAwMDAwMjMpICAgICAgICAvLyBQaXhpZSBpbmZvcm1hdGlvbi4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19TWU1CT0xfTElCLCAweDcwMDAwMDI0KSAgICAgICAgLy8gQWRkcmVzcyBvZiAuTUlQUy5zeW1saWIKK01JUFNfRFlOQU1JQ19UQUcoTUlQU19MT0NBTFBBR0VfR09USURYLCAweDcwMDAwMDI1KSAgLy8gVGhlIEdPVCBpbmRleCBvZiB0aGUgZmlyc3QgUFRFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBhIHNlZ21lbnQKK01JUFNfRFlOQU1JQ19UQUcoTUlQU19MT0NBTF9HT1RJRFgsIDB4NzAwMDAwMjYpICAgICAgLy8gVGhlIEdPVCBpbmRleCBvZiB0aGUgZmlyc3QgUFRFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBhIGxvY2FsIHN5bWJvbAorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0hJRERFTl9HT1RJRFgsIDB4NzAwMDAwMjcpICAgICAvLyBUaGUgR09UIGluZGV4IG9mIHRoZSBmaXJzdCBQVEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGEgaGlkZGVuIHN5bWJvbAorTUlQU19EWU5BTUlDX1RBRyhNSVBTX1BST1RFQ1RFRF9HT1RJRFgsIDB4NzAwMDAwMjgpICAvLyBUaGUgR09UIGluZGV4IG9mIHRoZSBmaXJzdCBQVEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGEgcHJvdGVjdGVkIHN5bWJvbAorTUlQU19EWU5BTUlDX1RBRyhNSVBTX09QVElPTlMsIDB4NzAwMDAwMjkpICAgICAgICAgICAgICAgLy8gQWRkcmVzcyBvZiBgLk1JUFMub3B0aW9ucycuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfSU5URVJGQUNFLCAweDcwMDAwMDJBKSAgICAgICAgICAgICAvLyBBZGRyZXNzIG9mIGAuaW50ZXJmYWNlJy4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19EWU5TVFJfQUxJR04sIDB4NzAwMDAwMkIpICAgICAgICAgIC8vIFVua25vd24uCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfSU5URVJGQUNFX1NJWkUsIDB4NzAwMDAwMkMpICAgICAgICAvLyBTaXplIG9mIHRoZSAuaW50ZXJmYWNlIHNlY3Rpb24uCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfUkxEX1RFWFRfUkVTT0xWRV9BRERSLCAweDcwMDAwMDJEKSAvLyBTaXplIG9mIHJsZF90ZXh0X3Jlc29sdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHN0b3JlZCBpbiB0aGUgR09ULgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX1BFUkZfU1VGRklYLCAweDcwMDAwMDJFKSAgLy8gRGVmYXVsdCBzdWZmaXggb2YgRFNPIHRvIGJlIGFkZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieSBybGQgb24gZGxvcGVuKCkgY2FsbHMuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfQ09NUEFDVF9TSVpFLCAweDcwMDAwMDJGKSAvLyBTaXplIG9mIGNvbXBhY3QgcmVsb2NhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VjdGlvbiAoTzMyKS4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19HUF9WQUxVRSwgMHg3MDAwMDAzMCkgICAgIC8vIEdQIHZhbHVlIGZvciBhdXhpbGlhcnkgR09Ucy4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19BVVhfRFlOQU1JQywgMHg3MDAwMDAzMSkgIC8vIEFkZHJlc3Mgb2YgYXV4aWxpYXJ5IC5keW5hbWljLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX1BMVEdPVCwgMHg3MDAwMDAzMikgICAgICAgLy8gQWRkcmVzcyBvZiB0aGUgYmFzZSBvZiB0aGUgUExUR09ULgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX1JXUExULCAweDcwMDAwMDM0KSAgICAgICAgLy8gUG9pbnRzIHRvIHRoZSBiYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBhIHdyaXRhYmxlIFBMVC4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19STERfTUFQX1JFTCwgMHg3MDAwMDAzNSkgIC8vIFJlbGF0aXZlIG9mZnNldCBvZiBydW4gdGltZSBsb2FkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcCwgdXNlZCBmb3IgZGVidWdnaW5nLgorCisvLyBTdW4gbWFjaGluZS1pbmRlcGVuZGVudCBleHRlbnNpb25zLgorRFlOQU1JQ19UQUcoQVVYSUxJQVJZLCAweDdGRkZGRkZEKSAvLyBTaGFyZWQgb2JqZWN0IHRvIGxvYWQgYmVmb3JlIHNlbGYKK0RZTkFNSUNfVEFHKEZJTFRFUiwgMHg3RkZGRkZGRikgICAgLy8gU2hhcmVkIG9iamVjdCB0byBnZXQgdmFsdWVzIGZyb20KKworCisjaWZkZWYgRFlOQU1JQ19UQUdfTUFSS0VSX0RFRklORUQKKyN1bmRlZiBEWU5BTUlDX1RBR19NQVJLRVIKKyNlbmRpZgorI2lmZGVmIE1JUFNfRFlOQU1JQ19UQUdfREVGSU5FRAorI3VuZGVmIE1JUFNfRFlOQU1JQ19UQUcKKyNlbmRpZgorI2lmZGVmIEhFWEFHT05fRFlOQU1JQ19UQUdfREVGSU5FRAorI3VuZGVmIEhFWEFHT05fRFlOQU1JQ19UQUcKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjUxZTUxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGLmgKQEAgLTAsMCArMSwxMzc0IEBACisvLz09PS0gbGx2bS9CaW5hcnlGb3JtYXQvRUxGLmggLSBFTEYgY29uc3RhbnRzIGFuZCBzdHJ1Y3R1cmVzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGNvbnRhaW5zIGNvbW1vbiwgbm9uLXByb2Nlc3Nvci1zcGVjaWZpYyBkYXRhIHN0cnVjdHVyZXMgYW5kCisvLyBjb25zdGFudHMgZm9yIHRoZSBFTEYgZmlsZSBmb3JtYXQuCisvLworLy8gVGhlIGRldGFpbHMgb2YgdGhlIEVMRjMyIGJpdHMgaW4gdGhpcyBmaWxlIGFyZSBsYXJnZWx5IGJhc2VkIG9uIHRoZSBUb29sCisvLyBJbnRlcmZhY2UgU3RhbmRhcmQgKFRJUykgRXhlY3V0YWJsZSBhbmQgTGlua2luZyBGb3JtYXQgKEVMRikgU3BlY2lmaWNhdGlvbgorLy8gVmVyc2lvbiAxLjIsIE1heSAxOTk1LiBUaGUgRUxGNjQgc3R1ZmYgaXMgYmFzZWQgb24gRUxGLTY0IE9iamVjdCBGaWxlIEZvcm1hdAorLy8gVmVyc2lvbiAxLjUsIERyYWZ0IDIsIE1heSAxOTk4IGFzIHdlbGwgYXMgT3BlbkJTRCBoZWFkZXIgZmlsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0JJTkFSWUZPUk1BVF9FTEZfSAorI2RlZmluZSBMTFZNX0JJTkFSWUZPUk1BVF9FTEZfSAorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgRUxGIHsKKwordXNpbmcgRWxmMzJfQWRkciA9IHVpbnQzMl90OyAvLyBQcm9ncmFtIGFkZHJlc3MKK3VzaW5nIEVsZjMyX09mZiA9IHVpbnQzMl90OyAgLy8gRmlsZSBvZmZzZXQKK3VzaW5nIEVsZjMyX0hhbGYgPSB1aW50MTZfdDsKK3VzaW5nIEVsZjMyX1dvcmQgPSB1aW50MzJfdDsKK3VzaW5nIEVsZjMyX1N3b3JkID0gaW50MzJfdDsKKwordXNpbmcgRWxmNjRfQWRkciA9IHVpbnQ2NF90OwordXNpbmcgRWxmNjRfT2ZmID0gdWludDY0X3Q7Cit1c2luZyBFbGY2NF9IYWxmID0gdWludDE2X3Q7Cit1c2luZyBFbGY2NF9Xb3JkID0gdWludDMyX3Q7Cit1c2luZyBFbGY2NF9Td29yZCA9IGludDMyX3Q7Cit1c2luZyBFbGY2NF9Yd29yZCA9IHVpbnQ2NF90OwordXNpbmcgRWxmNjRfU3h3b3JkID0gaW50NjRfdDsKKworLy8gT2JqZWN0IGZpbGUgbWFnaWMgc3RyaW5nLgorc3RhdGljIGNvbnN0IGNoYXIgRWxmTWFnaWNbXSA9IHsweDdmLCAnRScsICdMJywgJ0YnLCAnXDAnfTsKKworLy8gZV9pZGVudCBzaXplIGFuZCBpbmRpY2VzLgorZW51bSB7CisgIEVJX01BRzAgPSAwLCAgICAgICAvLyBGaWxlIGlkZW50aWZpY2F0aW9uIGluZGV4LgorICBFSV9NQUcxID0gMSwgICAgICAgLy8gRmlsZSBpZGVudGlmaWNhdGlvbiBpbmRleC4KKyAgRUlfTUFHMiA9IDIsICAgICAgIC8vIEZpbGUgaWRlbnRpZmljYXRpb24gaW5kZXguCisgIEVJX01BRzMgPSAzLCAgICAgICAvLyBGaWxlIGlkZW50aWZpY2F0aW9uIGluZGV4LgorICBFSV9DTEFTUyA9IDQsICAgICAgLy8gRmlsZSBjbGFzcy4KKyAgRUlfREFUQSA9IDUsICAgICAgIC8vIERhdGEgZW5jb2RpbmcuCisgIEVJX1ZFUlNJT04gPSA2LCAgICAvLyBGaWxlIHZlcnNpb24uCisgIEVJX09TQUJJID0gNywgICAgICAvLyBPUy9BQkkgaWRlbnRpZmljYXRpb24uCisgIEVJX0FCSVZFUlNJT04gPSA4LCAvLyBBQkkgdmVyc2lvbi4KKyAgRUlfUEFEID0gOSwgICAgICAgIC8vIFN0YXJ0IG9mIHBhZGRpbmcgYnl0ZXMuCisgIEVJX05JREVOVCA9IDE2ICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gZV9pZGVudC4KK307CisKK3N0cnVjdCBFbGYzMl9FaGRyIHsKKyAgdW5zaWduZWQgY2hhciBlX2lkZW50W0VJX05JREVOVF07IC8vIEVMRiBJZGVudGlmaWNhdGlvbiBieXRlcworICBFbGYzMl9IYWxmIGVfdHlwZTsgICAgICAgICAgICAgICAgLy8gVHlwZSBvZiBmaWxlIChzZWUgRVRfKiBiZWxvdykKKyAgRWxmMzJfSGFsZiBlX21hY2hpbmU7ICAgLy8gUmVxdWlyZWQgYXJjaGl0ZWN0dXJlIGZvciB0aGlzIGZpbGUgKHNlZSBFTV8qKQorICBFbGYzMl9Xb3JkIGVfdmVyc2lvbjsgICAvLyBNdXN0IGJlIGVxdWFsIHRvIDEKKyAgRWxmMzJfQWRkciBlX2VudHJ5OyAgICAgLy8gQWRkcmVzcyB0byBqdW1wIHRvIGluIG9yZGVyIHRvIHN0YXJ0IHByb2dyYW0KKyAgRWxmMzJfT2ZmIGVfcGhvZmY7ICAgICAgLy8gUHJvZ3JhbSBoZWFkZXIgdGFibGUncyBmaWxlIG9mZnNldCwgaW4gYnl0ZXMKKyAgRWxmMzJfT2ZmIGVfc2hvZmY7ICAgICAgLy8gU2VjdGlvbiBoZWFkZXIgdGFibGUncyBmaWxlIG9mZnNldCwgaW4gYnl0ZXMKKyAgRWxmMzJfV29yZCBlX2ZsYWdzOyAgICAgLy8gUHJvY2Vzc29yLXNwZWNpZmljIGZsYWdzCisgIEVsZjMyX0hhbGYgZV9laHNpemU7ICAgIC8vIFNpemUgb2YgRUxGIGhlYWRlciwgaW4gYnl0ZXMKKyAgRWxmMzJfSGFsZiBlX3BoZW50c2l6ZTsgLy8gU2l6ZSBvZiBhbiBlbnRyeSBpbiB0aGUgcHJvZ3JhbSBoZWFkZXIgdGFibGUKKyAgRWxmMzJfSGFsZiBlX3BobnVtOyAgICAgLy8gTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHByb2dyYW0gaGVhZGVyIHRhYmxlCisgIEVsZjMyX0hhbGYgZV9zaGVudHNpemU7IC8vIFNpemUgb2YgYW4gZW50cnkgaW4gdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlCisgIEVsZjMyX0hhbGYgZV9zaG51bTsgICAgIC8vIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBzZWN0aW9uIGhlYWRlciB0YWJsZQorICBFbGYzMl9IYWxmIGVfc2hzdHJuZHg7ICAvLyBTZWN0IGhkciB0YWJsZSBpbmRleCBvZiBzZWN0IG5hbWUgc3RyaW5nIHRhYmxlCisKKyAgYm9vbCBjaGVja01hZ2ljKCkgY29uc3QgeworICAgIHJldHVybiAobWVtY21wKGVfaWRlbnQsIEVsZk1hZ2ljLCBzdHJsZW4oRWxmTWFnaWMpKSkgPT0gMDsKKyAgfQorCisgIHVuc2lnbmVkIGNoYXIgZ2V0RmlsZUNsYXNzKCkgY29uc3QgeyByZXR1cm4gZV9pZGVudFtFSV9DTEFTU107IH0KKyAgdW5zaWduZWQgY2hhciBnZXREYXRhRW5jb2RpbmcoKSBjb25zdCB7IHJldHVybiBlX2lkZW50W0VJX0RBVEFdOyB9Cit9OworCisvLyA2NC1iaXQgRUxGIGhlYWRlci4gRmllbGRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgRUxGMzIsIGJ1dCB3aXRoIGRpZmZlcmVudAorLy8gdHlwZXMgKHNlZSBhYm92ZSkuCitzdHJ1Y3QgRWxmNjRfRWhkciB7CisgIHVuc2lnbmVkIGNoYXIgZV9pZGVudFtFSV9OSURFTlRdOworICBFbGY2NF9IYWxmIGVfdHlwZTsKKyAgRWxmNjRfSGFsZiBlX21hY2hpbmU7CisgIEVsZjY0X1dvcmQgZV92ZXJzaW9uOworICBFbGY2NF9BZGRyIGVfZW50cnk7CisgIEVsZjY0X09mZiBlX3Bob2ZmOworICBFbGY2NF9PZmYgZV9zaG9mZjsKKyAgRWxmNjRfV29yZCBlX2ZsYWdzOworICBFbGY2NF9IYWxmIGVfZWhzaXplOworICBFbGY2NF9IYWxmIGVfcGhlbnRzaXplOworICBFbGY2NF9IYWxmIGVfcGhudW07CisgIEVsZjY0X0hhbGYgZV9zaGVudHNpemU7CisgIEVsZjY0X0hhbGYgZV9zaG51bTsKKyAgRWxmNjRfSGFsZiBlX3Noc3RybmR4OworCisgIGJvb2wgY2hlY2tNYWdpYygpIGNvbnN0IHsKKyAgICByZXR1cm4gKG1lbWNtcChlX2lkZW50LCBFbGZNYWdpYywgc3RybGVuKEVsZk1hZ2ljKSkpID09IDA7CisgIH0KKworICB1bnNpZ25lZCBjaGFyIGdldEZpbGVDbGFzcygpIGNvbnN0IHsgcmV0dXJuIGVfaWRlbnRbRUlfQ0xBU1NdOyB9CisgIHVuc2lnbmVkIGNoYXIgZ2V0RGF0YUVuY29kaW5nKCkgY29uc3QgeyByZXR1cm4gZV9pZGVudFtFSV9EQVRBXTsgfQorfTsKKworLy8gRmlsZSB0eXBlcworZW51bSB7CisgIEVUX05PTkUgPSAwLCAgICAgICAgLy8gTm8gZmlsZSB0eXBlCisgIEVUX1JFTCA9IDEsICAgICAgICAgLy8gUmVsb2NhdGFibGUgZmlsZQorICBFVF9FWEVDID0gMiwgICAgICAgIC8vIEV4ZWN1dGFibGUgZmlsZQorICBFVF9EWU4gPSAzLCAgICAgICAgIC8vIFNoYXJlZCBvYmplY3QgZmlsZQorICBFVF9DT1JFID0gNCwgICAgICAgIC8vIENvcmUgZmlsZQorICBFVF9MT1BST0MgPSAweGZmMDAsIC8vIEJlZ2lubmluZyBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgY29kZXMKKyAgRVRfSElQUk9DID0gMHhmZmZmICAvLyBQcm9jZXNzb3Itc3BlY2lmaWMKK307CisKKy8vIFZlcnNpb25pbmcKK2VudW0geyBFVl9OT05FID0gMCwgRVZfQ1VSUkVOVCA9IDEgfTsKKworLy8gTWFjaGluZSBhcmNoaXRlY3R1cmVzCisvLyBTZWUgY3VycmVudCByZWdpc3RlcmVkIEVMRiBtYWNoaW5lIGFyY2hpdGVjdHVyZXMgYXQ6CisvLyAgICBodHRwOi8vd3d3LnV4c2dsb2JhbC5jb20vZGV2ZWxvcGVycy9nYWJpL2xhdGVzdC9jaDQuZWhlYWRlci5odG1sCitlbnVtIHsKKyAgRU1fTk9ORSA9IDAsICAgICAgICAgICAvLyBObyBtYWNoaW5lCisgIEVNX00zMiA9IDEsICAgICAgICAgICAgLy8gQVQmVCBXRSAzMjEwMAorICBFTV9TUEFSQyA9IDIsICAgICAgICAgIC8vIFNQQVJDCisgIEVNXzM4NiA9IDMsICAgICAgICAgICAgLy8gSW50ZWwgMzg2CisgIEVNXzY4SyA9IDQsICAgICAgICAgICAgLy8gTW90b3JvbGEgNjgwMDAKKyAgRU1fODhLID0gNSwgICAgICAgICAgICAvLyBNb3Rvcm9sYSA4ODAwMAorICBFTV9JQU1DVSA9IDYsICAgICAgICAgIC8vIEludGVsIE1DVQorICBFTV84NjAgPSA3LCAgICAgICAgICAgIC8vIEludGVsIDgwODYwCisgIEVNX01JUFMgPSA4LCAgICAgICAgICAgLy8gTUlQUyBSMzAwMAorICBFTV9TMzcwID0gOSwgICAgICAgICAgIC8vIElCTSBTeXN0ZW0vMzcwCisgIEVNX01JUFNfUlMzX0xFID0gMTAsICAgLy8gTUlQUyBSUzMwMDAgTGl0dGxlLWVuZGlhbgorICBFTV9QQVJJU0MgPSAxNSwgICAgICAgIC8vIEhld2xldHQtUGFja2FyZCBQQS1SSVNDCisgIEVNX1ZQUDUwMCA9IDE3LCAgICAgICAgLy8gRnVqaXRzdSBWUFA1MDAKKyAgRU1fU1BBUkMzMlBMVVMgPSAxOCwgICAvLyBFbmhhbmNlZCBpbnN0cnVjdGlvbiBzZXQgU1BBUkMKKyAgRU1fOTYwID0gMTksICAgICAgICAgICAvLyBJbnRlbCA4MDk2MAorICBFTV9QUEMgPSAyMCwgICAgICAgICAgIC8vIFBvd2VyUEMKKyAgRU1fUFBDNjQgPSAyMSwgICAgICAgICAvLyBQb3dlclBDNjQKKyAgRU1fUzM5MCA9IDIyLCAgICAgICAgICAvLyBJQk0gU3lzdGVtLzM5MAorICBFTV9TUFUgPSAyMywgICAgICAgICAgIC8vIElCTSBTUFUvU1BDCisgIEVNX1Y4MDAgPSAzNiwgICAgICAgICAgLy8gTkVDIFY4MDAKKyAgRU1fRlIyMCA9IDM3LCAgICAgICAgICAvLyBGdWppdHN1IEZSMjAKKyAgRU1fUkgzMiA9IDM4LCAgICAgICAgICAvLyBUUlcgUkgtMzIKKyAgRU1fUkNFID0gMzksICAgICAgICAgICAvLyBNb3Rvcm9sYSBSQ0UKKyAgRU1fQVJNID0gNDAsICAgICAgICAgICAvLyBBUk0KKyAgRU1fQUxQSEEgPSA0MSwgICAgICAgICAvLyBERUMgQWxwaGEKKyAgRU1fU0ggPSA0MiwgICAgICAgICAgICAvLyBIaXRhY2hpIFNICisgIEVNX1NQQVJDVjkgPSA0MywgICAgICAgLy8gU1BBUkMgVjkKKyAgRU1fVFJJQ09SRSA9IDQ0LCAgICAgICAvLyBTaWVtZW5zIFRyaUNvcmUKKyAgRU1fQVJDID0gNDUsICAgICAgICAgICAvLyBBcmdvbmF1dCBSSVNDIENvcmUKKyAgRU1fSDhfMzAwID0gNDYsICAgICAgICAvLyBIaXRhY2hpIEg4LzMwMAorICBFTV9IOF8zMDBIID0gNDcsICAgICAgIC8vIEhpdGFjaGkgSDgvMzAwSAorICBFTV9IOFMgPSA0OCwgICAgICAgICAgIC8vIEhpdGFjaGkgSDhTCisgIEVNX0g4XzUwMCA9IDQ5LCAgICAgICAgLy8gSGl0YWNoaSBIOC81MDAKKyAgRU1fSUFfNjQgPSA1MCwgICAgICAgICAvLyBJbnRlbCBJQS02NCBwcm9jZXNzb3IgYXJjaGl0ZWN0dXJlCisgIEVNX01JUFNfWCA9IDUxLCAgICAgICAgLy8gU3RhbmZvcmQgTUlQUy1YCisgIEVNX0NPTERGSVJFID0gNTIsICAgICAgLy8gTW90b3JvbGEgQ29sZEZpcmUKKyAgRU1fNjhIQzEyID0gNTMsICAgICAgICAvLyBNb3Rvcm9sYSBNNjhIQzEyCisgIEVNX01NQSA9IDU0LCAgICAgICAgICAgLy8gRnVqaXRzdSBNTUEgTXVsdGltZWRpYSBBY2NlbGVyYXRvcgorICBFTV9QQ1AgPSA1NSwgICAgICAgICAgIC8vIFNpZW1lbnMgUENQCisgIEVNX05DUFUgPSA1NiwgICAgICAgICAgLy8gU29ueSBuQ1BVIGVtYmVkZGVkIFJJU0MgcHJvY2Vzc29yCisgIEVNX05EUjEgPSA1NywgICAgICAgICAgLy8gRGVuc28gTkRSMSBtaWNyb3Byb2Nlc3NvcgorICBFTV9TVEFSQ09SRSA9IDU4LCAgICAgIC8vIE1vdG9yb2xhIFN0YXIqQ29yZSBwcm9jZXNzb3IKKyAgRU1fTUUxNiA9IDU5LCAgICAgICAgICAvLyBUb3lvdGEgTUUxNiBwcm9jZXNzb3IKKyAgRU1fU1QxMDAgPSA2MCwgICAgICAgICAvLyBTVE1pY3JvZWxlY3Ryb25pY3MgU1QxMDAgcHJvY2Vzc29yCisgIEVNX1RJTllKID0gNjEsICAgICAgICAgLy8gQWR2YW5jZWQgTG9naWMgQ29ycC4gVGlueUogZW1iZWRkZWQgcHJvY2Vzc29yIGZhbWlseQorICBFTV9YODZfNjQgPSA2MiwgICAgICAgIC8vIEFNRCB4ODYtNjQgYXJjaGl0ZWN0dXJlCisgIEVNX1BEU1AgPSA2MywgICAgICAgICAgLy8gU29ueSBEU1AgUHJvY2Vzc29yCisgIEVNX1BEUDEwID0gNjQsICAgICAgICAgLy8gRGlnaXRhbCBFcXVpcG1lbnQgQ29ycC4gUERQLTEwCisgIEVNX1BEUDExID0gNjUsICAgICAgICAgLy8gRGlnaXRhbCBFcXVpcG1lbnQgQ29ycC4gUERQLTExCisgIEVNX0ZYNjYgPSA2NiwgICAgICAgICAgLy8gU2llbWVucyBGWDY2IG1pY3JvY29udHJvbGxlcgorICBFTV9TVDlQTFVTID0gNjcsICAgICAgIC8vIFNUTWljcm9lbGVjdHJvbmljcyBTVDkrIDgvMTYgYml0IG1pY3JvY29udHJvbGxlcgorICBFTV9TVDcgPSA2OCwgICAgICAgICAgIC8vIFNUTWljcm9lbGVjdHJvbmljcyBTVDcgOC1iaXQgbWljcm9jb250cm9sbGVyCisgIEVNXzY4SEMxNiA9IDY5LCAgICAgICAgLy8gTW90b3JvbGEgTUM2OEhDMTYgTWljcm9jb250cm9sbGVyCisgIEVNXzY4SEMxMSA9IDcwLCAgICAgICAgLy8gTW90b3JvbGEgTUM2OEhDMTEgTWljcm9jb250cm9sbGVyCisgIEVNXzY4SEMwOCA9IDcxLCAgICAgICAgLy8gTW90b3JvbGEgTUM2OEhDMDggTWljcm9jb250cm9sbGVyCisgIEVNXzY4SEMwNSA9IDcyLCAgICAgICAgLy8gTW90b3JvbGEgTUM2OEhDMDUgTWljcm9jb250cm9sbGVyCisgIEVNX1NWWCA9IDczLCAgICAgICAgICAgLy8gU2lsaWNvbiBHcmFwaGljcyBTVngKKyAgRU1fU1QxOSA9IDc0LCAgICAgICAgICAvLyBTVE1pY3JvZWxlY3Ryb25pY3MgU1QxOSA4LWJpdCBtaWNyb2NvbnRyb2xsZXIKKyAgRU1fVkFYID0gNzUsICAgICAgICAgICAvLyBEaWdpdGFsIFZBWAorICBFTV9DUklTID0gNzYsICAgICAgICAgIC8vIEF4aXMgQ29tbXVuaWNhdGlvbnMgMzItYml0IGVtYmVkZGVkIHByb2Nlc3NvcgorICBFTV9KQVZFTElOID0gNzcsICAgICAgIC8vIEluZmluZW9uIFRlY2hub2xvZ2llcyAzMi1iaXQgZW1iZWRkZWQgcHJvY2Vzc29yCisgIEVNX0ZJUkVQQVRIID0gNzgsICAgICAgLy8gRWxlbWVudCAxNCA2NC1iaXQgRFNQIFByb2Nlc3NvcgorICBFTV9aU1AgPSA3OSwgICAgICAgICAgIC8vIExTSSBMb2dpYyAxNi1iaXQgRFNQIFByb2Nlc3NvcgorICBFTV9NTUlYID0gODAsICAgICAgICAgIC8vIERvbmFsZCBLbnV0aCdzIGVkdWNhdGlvbmFsIDY0LWJpdCBwcm9jZXNzb3IKKyAgRU1fSFVBTlkgPSA4MSwgICAgICAgICAvLyBIYXJ2YXJkIFVuaXZlcnNpdHkgbWFjaGluZS1pbmRlcGVuZGVudCBvYmplY3QgZmlsZXMKKyAgRU1fUFJJU00gPSA4MiwgICAgICAgICAvLyBTaVRlcmEgUHJpc20KKyAgRU1fQVZSID0gODMsICAgICAgICAgICAvLyBBdG1lbCBBVlIgOC1iaXQgbWljcm9jb250cm9sbGVyCisgIEVNX0ZSMzAgPSA4NCwgICAgICAgICAgLy8gRnVqaXRzdSBGUjMwCisgIEVNX0QxMFYgPSA4NSwgICAgICAgICAgLy8gTWl0c3ViaXNoaSBEMTBWCisgIEVNX0QzMFYgPSA4NiwgICAgICAgICAgLy8gTWl0c3ViaXNoaSBEMzBWCisgIEVNX1Y4NTAgPSA4NywgICAgICAgICAgLy8gTkVDIHY4NTAKKyAgRU1fTTMyUiA9IDg4LCAgICAgICAgICAvLyBNaXRzdWJpc2hpIE0zMlIKKyAgRU1fTU4xMDMwMCA9IDg5LCAgICAgICAvLyBNYXRzdXNoaXRhIE1OMTAzMDAKKyAgRU1fTU4xMDIwMCA9IDkwLCAgICAgICAvLyBNYXRzdXNoaXRhIE1OMTAyMDAKKyAgRU1fUEogPSA5MSwgICAgICAgICAgICAvLyBwaWNvSmF2YQorICBFTV9PUEVOUklTQyA9IDkyLCAgICAgIC8vIE9wZW5SSVNDIDMyLWJpdCBlbWJlZGRlZCBwcm9jZXNzb3IKKyAgRU1fQVJDX0NPTVBBQ1QgPSA5MywgICAvLyBBUkMgSW50ZXJuYXRpb25hbCBBUkNvbXBhY3QgcHJvY2Vzc29yIChvbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVsbGluZy9zeW5vbnltOiBFTV9BUkNfQTUpCisgIEVNX1hURU5TQSA9IDk0LCAgICAgICAgLy8gVGVuc2lsaWNhIFh0ZW5zYSBBcmNoaXRlY3R1cmUKKyAgRU1fVklERU9DT1JFID0gOTUsICAgICAvLyBBbHBoYW1vc2FpYyBWaWRlb0NvcmUgcHJvY2Vzc29yCisgIEVNX1RNTV9HUFAgPSA5NiwgICAgICAgLy8gVGhvbXBzb24gTXVsdGltZWRpYSBHZW5lcmFsIFB1cnBvc2UgUHJvY2Vzc29yCisgIEVNX05TMzJLID0gOTcsICAgICAgICAgLy8gTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciAzMjAwMCBzZXJpZXMKKyAgRU1fVFBDID0gOTgsICAgICAgICAgICAvLyBUZW5vciBOZXR3b3JrIFRQQyBwcm9jZXNzb3IKKyAgRU1fU05QMUsgPSA5OSwgICAgICAgICAvLyBUcmViaWEgU05QIDEwMDAgcHJvY2Vzc29yCisgIEVNX1NUMjAwID0gMTAwLCAgICAgICAgLy8gU1RNaWNyb2VsZWN0cm9uaWNzICh3d3cuc3QuY29tKSBTVDIwMAorICBFTV9JUDJLID0gMTAxLCAgICAgICAgIC8vIFViaWNvbSBJUDJ4eHggbWljcm9jb250cm9sbGVyIGZhbWlseQorICBFTV9NQVggPSAxMDIsICAgICAgICAgIC8vIE1BWCBQcm9jZXNzb3IKKyAgRU1fQ1IgPSAxMDMsICAgICAgICAgICAvLyBOYXRpb25hbCBTZW1pY29uZHVjdG9yIENvbXBhY3RSSVNDIG1pY3JvcHJvY2Vzc29yCisgIEVNX0YyTUMxNiA9IDEwNCwgICAgICAgLy8gRnVqaXRzdSBGMk1DMTYKKyAgRU1fTVNQNDMwID0gMTA1LCAgICAgICAvLyBUZXhhcyBJbnN0cnVtZW50cyBlbWJlZGRlZCBtaWNyb2NvbnRyb2xsZXIgbXNwNDMwCisgIEVNX0JMQUNLRklOID0gMTA2LCAgICAgLy8gQW5hbG9nIERldmljZXMgQmxhY2tmaW4gKERTUCkgcHJvY2Vzc29yCisgIEVNX1NFX0MzMyA9IDEwNywgICAgICAgLy8gUzFDMzMgRmFtaWx5IG9mIFNlaWtvIEVwc29uIHByb2Nlc3NvcnMKKyAgRU1fU0VQID0gMTA4LCAgICAgICAgICAvLyBTaGFycCBlbWJlZGRlZCBtaWNyb3Byb2Nlc3NvcgorICBFTV9BUkNBID0gMTA5LCAgICAgICAgIC8vIEFyY2EgUklTQyBNaWNyb3Byb2Nlc3NvcgorICBFTV9VTklDT1JFID0gMTEwLCAgICAgIC8vIE1pY3JvcHJvY2Vzc29yIHNlcmllcyBmcm9tIFBLVS1Vbml0eSBMdGQuIGFuZCBNUFJDCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgUGVraW5nIFVuaXZlcnNpdHkKKyAgRU1fRVhDRVNTID0gMTExLCAgICAgICAvLyBlWGNlc3M6IDE2LzMyLzY0LWJpdCBjb25maWd1cmFibGUgZW1iZWRkZWQgQ1BVCisgIEVNX0RYUCA9IDExMiwgICAgICAgICAgLy8gSWNlcmEgU2VtaWNvbmR1Y3RvciBJbmMuIERlZXAgRXhlY3V0aW9uIFByb2Nlc3NvcgorICBFTV9BTFRFUkFfTklPUzIgPSAxMTMsIC8vIEFsdGVyYSBOaW9zIElJIHNvZnQtY29yZSBwcm9jZXNzb3IKKyAgRU1fQ1JYID0gMTE0LCAgICAgICAgICAvLyBOYXRpb25hbCBTZW1pY29uZHVjdG9yIENvbXBhY3RSSVNDIENSWAorICBFTV9YR0FURSA9IDExNSwgICAgICAgIC8vIE1vdG9yb2xhIFhHQVRFIGVtYmVkZGVkIHByb2Nlc3NvcgorICBFTV9DMTY2ID0gMTE2LCAgICAgICAgIC8vIEluZmluZW9uIEMxNngvWEMxNnggcHJvY2Vzc29yCisgIEVNX00xNkMgPSAxMTcsICAgICAgICAgLy8gUmVuZXNhcyBNMTZDIHNlcmllcyBtaWNyb3Byb2Nlc3NvcnMKKyAgRU1fRFNQSUMzMEYgPSAxMTgsICAgICAvLyBNaWNyb2NoaXAgVGVjaG5vbG9neSBkc1BJQzMwRiBEaWdpdGFsIFNpZ25hbAorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnRyb2xsZXIKKyAgRU1fQ0UgPSAxMTksICAgICAgICAgICAvLyBGcmVlc2NhbGUgQ29tbXVuaWNhdGlvbiBFbmdpbmUgUklTQyBjb3JlCisgIEVNX00zMkMgPSAxMjAsICAgICAgICAgLy8gUmVuZXNhcyBNMzJDIHNlcmllcyBtaWNyb3Byb2Nlc3NvcnMKKyAgRU1fVFNLMzAwMCA9IDEzMSwgICAgICAvLyBBbHRpdW0gVFNLMzAwMCBjb3JlCisgIEVNX1JTMDggPSAxMzIsICAgICAgICAgLy8gRnJlZXNjYWxlIFJTMDggZW1iZWRkZWQgcHJvY2Vzc29yCisgIEVNX1NIQVJDID0gMTMzLCAgICAgICAgLy8gQW5hbG9nIERldmljZXMgU0hBUkMgZmFtaWx5IG9mIDMyLWJpdCBEU1AKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzb3JzCisgIEVNX0VDT0cyID0gMTM0LCAgICAgICAgLy8gQ3lhbiBUZWNobm9sb2d5IGVDT0cyIG1pY3JvcHJvY2Vzc29yCisgIEVNX1NDT1JFNyA9IDEzNSwgICAgICAgLy8gU3VucGx1cyBTK2NvcmU3IFJJU0MgcHJvY2Vzc29yCisgIEVNX0RTUDI0ID0gMTM2LCAgICAgICAgLy8gTmV3IEphcGFuIFJhZGlvIChOSlIpIDI0LWJpdCBEU1AgUHJvY2Vzc29yCisgIEVNX1ZJREVPQ09SRTMgPSAxMzcsICAgLy8gQnJvYWRjb20gVmlkZW9Db3JlIElJSSBwcm9jZXNzb3IKKyAgRU1fTEFUVElDRU1JQ08zMiA9IDEzOCwgLy8gUklTQyBwcm9jZXNzb3IgZm9yIExhdHRpY2UgRlBHQSBhcmNoaXRlY3R1cmUKKyAgRU1fU0VfQzE3ID0gMTM5LCAgICAgICAgLy8gU2Vpa28gRXBzb24gQzE3IGZhbWlseQorICBFTV9USV9DNjAwMCA9IDE0MCwgICAgICAvLyBUaGUgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzYwMDAgRFNQIGZhbWlseQorICBFTV9USV9DMjAwMCA9IDE0MSwgICAgICAvLyBUaGUgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzIwMDAgRFNQIGZhbWlseQorICBFTV9USV9DNTUwMCA9IDE0MiwgICAgICAvLyBUaGUgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzU1eCBEU1AgZmFtaWx5CisgIEVNX01NRFNQX1BMVVMgPSAxNjAsICAgIC8vIFNUTWljcm9lbGVjdHJvbmljcyA2NGJpdCBWTElXIERhdGEgU2lnbmFsIFByb2Nlc3NvcgorICBFTV9DWVBSRVNTX004QyA9IDE2MSwgICAvLyBDeXByZXNzIE04QyBtaWNyb3Byb2Nlc3NvcgorICBFTV9SMzJDID0gMTYyLCAgICAgICAgICAvLyBSZW5lc2FzIFIzMkMgc2VyaWVzIG1pY3JvcHJvY2Vzc29ycworICBFTV9UUklNRURJQSA9IDE2MywgICAgICAvLyBOWFAgU2VtaWNvbmR1Y3RvcnMgVHJpTWVkaWEgYXJjaGl0ZWN0dXJlIGZhbWlseQorICBFTV9IRVhBR09OID0gMTY0LCAgICAgICAvLyBRdWFsY29tbSBIZXhhZ29uIHByb2Nlc3NvcgorICBFTV84MDUxID0gMTY1LCAgICAgICAgICAvLyBJbnRlbCA4MDUxIGFuZCB2YXJpYW50cworICBFTV9TVFhQN1ggPSAxNjYsICAgICAgICAvLyBTVE1pY3JvZWxlY3Ryb25pY3MgU1R4UDd4IGZhbWlseSBvZiBjb25maWd1cmFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGV4dGVuc2libGUgUklTQyBwcm9jZXNzb3JzCisgIEVNX05EUzMyID0gMTY3LCAgICAgICAgIC8vIEFuZGVzIFRlY2hub2xvZ3kgY29tcGFjdCBjb2RlIHNpemUgZW1iZWRkZWQgUklTQworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzb3IgZmFtaWx5CisgIEVNX0VDT0cxID0gMTY4LCAgICAgICAgIC8vIEN5YW4gVGVjaG5vbG9neSBlQ09HMVggZmFtaWx5CisgIEVNX0VDT0cxWCA9IDE2OCwgICAgICAgIC8vIEN5YW4gVGVjaG5vbG9neSBlQ09HMVggZmFtaWx5CisgIEVNX01BWFEzMCA9IDE2OSwgICAgICAgIC8vIERhbGxhcyBTZW1pY29uZHVjdG9yIE1BWFEzMCBDb3JlIE1pY3JvLWNvbnRyb2xsZXJzCisgIEVNX1hJTU8xNiA9IDE3MCwgICAgICAgIC8vIE5ldyBKYXBhbiBSYWRpbyAoTkpSKSAxNi1iaXQgRFNQIFByb2Nlc3NvcgorICBFTV9NQU5JSyA9IDE3MSwgICAgICAgICAvLyBNMjAwMCBSZWNvbmZpZ3VyYWJsZSBSSVNDIE1pY3JvcHJvY2Vzc29yCisgIEVNX0NSQVlOVjIgPSAxNzIsICAgICAgIC8vIENyYXkgSW5jLiBOVjIgdmVjdG9yIGFyY2hpdGVjdHVyZQorICBFTV9SWCA9IDE3MywgICAgICAgICAgICAvLyBSZW5lc2FzIFJYIGZhbWlseQorICBFTV9NRVRBRyA9IDE3NCwgICAgICAgICAvLyBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTUVUQSBwcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJjaGl0ZWN0dXJlCisgIEVNX01DU1RfRUxCUlVTID0gMTc1LCAgIC8vIE1DU1QgRWxicnVzIGdlbmVyYWwgcHVycG9zZSBoYXJkd2FyZSBhcmNoaXRlY3R1cmUKKyAgRU1fRUNPRzE2ID0gMTc2LCAgICAgICAgLy8gQ3lhbiBUZWNobm9sb2d5IGVDT0cxNiBmYW1pbHkKKyAgRU1fQ1IxNiA9IDE3NywgICAgICAgICAgLy8gTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBDb21wYWN0UklTQyBDUjE2IDE2LWJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtaWNyb3Byb2Nlc3NvcgorICBFTV9FVFBVID0gMTc4LCAgICAgICAgICAvLyBGcmVlc2NhbGUgRXh0ZW5kZWQgVGltZSBQcm9jZXNzaW5nIFVuaXQKKyAgRU1fU0xFOVggPSAxNzksICAgICAgICAgLy8gSW5maW5lb24gVGVjaG5vbG9naWVzIFNMRTlYIGNvcmUKKyAgRU1fTDEwTSA9IDE4MCwgICAgICAgICAgLy8gSW50ZWwgTDEwTQorICBFTV9LMTBNID0gMTgxLCAgICAgICAgICAvLyBJbnRlbCBLMTBNCisgIEVNX0FBUkNINjQgPSAxODMsICAgICAgIC8vIEFSTSBBQXJjaDY0CisgIEVNX0FWUjMyID0gMTg1LCAgICAgICAgIC8vIEF0bWVsIENvcnBvcmF0aW9uIDMyLWJpdCBtaWNyb3Byb2Nlc3NvciBmYW1pbHkKKyAgRU1fU1RNOCA9IDE4NiwgICAgICAgICAgLy8gU1RNaWNyb2VsZXRyb25pY3MgU1RNOCA4LWJpdCBtaWNyb2NvbnRyb2xsZXIKKyAgRU1fVElMRTY0ID0gMTg3LCAgICAgICAgLy8gVGlsZXJhIFRJTEU2NCBtdWx0aWNvcmUgYXJjaGl0ZWN0dXJlIGZhbWlseQorICBFTV9USUxFUFJPID0gMTg4LCAgICAgICAvLyBUaWxlcmEgVElMRVBybyBtdWx0aWNvcmUgYXJjaGl0ZWN0dXJlIGZhbWlseQorICBFTV9DVURBID0gMTkwLCAgICAgICAgICAvLyBOVklESUEgQ1VEQSBhcmNoaXRlY3R1cmUKKyAgRU1fVElMRUdYID0gMTkxLCAgICAgICAgLy8gVGlsZXJhIFRJTEUtR3ggbXVsdGljb3JlIGFyY2hpdGVjdHVyZSBmYW1pbHkKKyAgRU1fQ0xPVURTSElFTEQgPSAxOTIsICAgLy8gQ2xvdWRTaGllbGQgYXJjaGl0ZWN0dXJlIGZhbWlseQorICBFTV9DT1JFQV8xU1QgPSAxOTMsICAgICAvLyBLSVBPLUtBSVNUIENvcmUtQSAxc3QgZ2VuZXJhdGlvbiBwcm9jZXNzb3IgZmFtaWx5CisgIEVNX0NPUkVBXzJORCA9IDE5NCwgICAgIC8vIEtJUE8tS0FJU1QgQ29yZS1BIDJuZCBnZW5lcmF0aW9uIHByb2Nlc3NvciBmYW1pbHkKKyAgRU1fQVJDX0NPTVBBQ1QyID0gMTk1LCAgLy8gU3lub3BzeXMgQVJDb21wYWN0IFYyCisgIEVNX09QRU44ID0gMTk2LCAgICAgICAgIC8vIE9wZW44IDgtYml0IFJJU0Mgc29mdCBwcm9jZXNzb3IgY29yZQorICBFTV9STDc4ID0gMTk3LCAgICAgICAgICAvLyBSZW5lc2FzIFJMNzggZmFtaWx5CisgIEVNX1ZJREVPQ09SRTUgPSAxOTgsICAgIC8vIEJyb2FkY29tIFZpZGVvQ29yZSBWIHByb2Nlc3NvcgorICBFTV83OEtPUiA9IDE5OSwgICAgICAgICAvLyBSZW5lc2FzIDc4S09SIGZhbWlseQorICBFTV81NjgwMEVYID0gMjAwLCAgICAgICAvLyBGcmVlc2NhbGUgNTY4MDBFWCBEaWdpdGFsIFNpZ25hbCBDb250cm9sbGVyIChEU0MpCisgIEVNX0JBMSA9IDIwMSwgICAgICAgICAgIC8vIEJleW9uZCBCQTEgQ1BVIGFyY2hpdGVjdHVyZQorICBFTV9CQTIgPSAyMDIsICAgICAgICAgICAvLyBCZXlvbmQgQkEyIENQVSBhcmNoaXRlY3R1cmUKKyAgRU1fWENPUkUgPSAyMDMsICAgICAgICAgLy8gWE1PUyB4Q09SRSBwcm9jZXNzb3IgZmFtaWx5CisgIEVNX01DSFBfUElDID0gMjA0LCAgICAgIC8vIE1pY3JvY2hpcCA4LWJpdCBQSUMocikgZmFtaWx5CisgIEVNX0lOVEVMMjA1ID0gMjA1LCAgICAgIC8vIFJlc2VydmVkIGJ5IEludGVsCisgIEVNX0lOVEVMMjA2ID0gMjA2LCAgICAgIC8vIFJlc2VydmVkIGJ5IEludGVsCisgIEVNX0lOVEVMMjA3ID0gMjA3LCAgICAgIC8vIFJlc2VydmVkIGJ5IEludGVsCisgIEVNX0lOVEVMMjA4ID0gMjA4LCAgICAgIC8vIFJlc2VydmVkIGJ5IEludGVsCisgIEVNX0lOVEVMMjA5ID0gMjA5LCAgICAgIC8vIFJlc2VydmVkIGJ5IEludGVsCisgIEVNX0tNMzIgPSAyMTAsICAgICAgICAgIC8vIEtNMjExIEtNMzIgMzItYml0IHByb2Nlc3NvcgorICBFTV9LTVgzMiA9IDIxMSwgICAgICAgICAvLyBLTTIxMSBLTVgzMiAzMi1iaXQgcHJvY2Vzc29yCisgIEVNX0tNWDE2ID0gMjEyLCAgICAgICAgIC8vIEtNMjExIEtNWDE2IDE2LWJpdCBwcm9jZXNzb3IKKyAgRU1fS01YOCA9IDIxMywgICAgICAgICAgLy8gS00yMTEgS01YOCA4LWJpdCBwcm9jZXNzb3IKKyAgRU1fS1ZBUkMgPSAyMTQsICAgICAgICAgLy8gS00yMTEgS1ZBUkMgcHJvY2Vzc29yCisgIEVNX0NEUCA9IDIxNSwgICAgICAgICAgIC8vIFBhbmV2ZSBDRFAgYXJjaGl0ZWN0dXJlIGZhbWlseQorICBFTV9DT0dFID0gMjE2LCAgICAgICAgICAvLyBDb2duaXRpdmUgU21hcnQgTWVtb3J5IFByb2Nlc3NvcgorICBFTV9DT09MID0gMjE3LCAgICAgICAgICAvLyBpQ2VsZXJvIENvb2xFbmdpbmUKKyAgRU1fTk9SQyA9IDIxOCwgICAgICAgICAgLy8gTmFub3JhZGlvIE9wdGltaXplZCBSSVNDCisgIEVNX0NTUl9LQUxJTUJBID0gMjE5LCAgIC8vIENTUiBLYWxpbWJhIGFyY2hpdGVjdHVyZSBmYW1pbHkKKyAgRU1fQU1ER1BVID0gMjI0LCAgICAgICAgLy8gQU1EIEdQVSBhcmNoaXRlY3R1cmUKKyAgRU1fUklTQ1YgPSAyNDMsICAgICAgICAgLy8gUklTQy1WCisgIEVNX0xBTkFJID0gMjQ0LCAgICAgICAgIC8vIExhbmFpIDMyLWJpdCBwcm9jZXNzb3IKKyAgRU1fQlBGID0gMjQ3LCAgICAgICAgICAgLy8gTGludXgga2VybmVsIGJwZiB2aXJ0dWFsIG1hY2hpbmUKKworICAvLyBBIHJlcXVlc3QgaGFzIGJlZW4gbWFkZSB0byB0aGUgbWFpbnRhaW5lciBvZiB0aGUgb2ZmaWNpYWwgcmVnaXN0cnkgZm9yCisgIC8vIHN1Y2ggbnVtYmVycyBmb3IgYW4gb2ZmaWNpYWwgdmFsdWUgZm9yIFdlYkFzc2VtYmx5LiBBcyBzb29uIGFzIG9uZSBpcworICAvLyBhbGxvY2F0ZWQsIHRoaXMgZW51bSB3aWxsIGJlIHVwZGF0ZWQgdG8gdXNlIGl0LgorICBFTV9XRUJBU1NFTUJMWSA9IDB4NDE1NywgLy8gV2ViQXNzZW1ibHkgYXJjaGl0ZWN0dXJlCit9OworCisvLyBPYmplY3QgZmlsZSBjbGFzc2VzLgorZW51bSB7CisgIEVMRkNMQVNTTk9ORSA9IDAsCisgIEVMRkNMQVNTMzIgPSAxLCAvLyAzMi1iaXQgb2JqZWN0IGZpbGUKKyAgRUxGQ0xBU1M2NCA9IDIgIC8vIDY0LWJpdCBvYmplY3QgZmlsZQorfTsKKworLy8gT2JqZWN0IGZpbGUgYnl0ZSBvcmRlcmluZ3MuCitlbnVtIHsKKyAgRUxGREFUQU5PTkUgPSAwLCAvLyBJbnZhbGlkIGRhdGEgZW5jb2RpbmcuCisgIEVMRkRBVEEyTFNCID0gMSwgLy8gTGl0dGxlLWVuZGlhbiBvYmplY3QgZmlsZQorICBFTEZEQVRBMk1TQiA9IDIgIC8vIEJpZy1lbmRpYW4gb2JqZWN0IGZpbGUKK307CisKKy8vIE9TIEFCSSBpZGVudGlmaWNhdGlvbi4KK2VudW0geworICBFTEZPU0FCSV9OT05FID0gMCwgICAgICAgICAgIC8vIFVOSVggU3lzdGVtIFYgQUJJCisgIEVMRk9TQUJJX0hQVVggPSAxLCAgICAgICAgICAgLy8gSFAtVVggb3BlcmF0aW5nIHN5c3RlbQorICBFTEZPU0FCSV9ORVRCU0QgPSAyLCAgICAgICAgIC8vIE5ldEJTRAorICBFTEZPU0FCSV9HTlUgPSAzLCAgICAgICAgICAgIC8vIEdOVS9MaW51eAorICBFTEZPU0FCSV9MSU5VWCA9IDMsICAgICAgICAgIC8vIEhpc3RvcmljYWwgYWxpYXMgZm9yIEVMRk9TQUJJX0dOVS4KKyAgRUxGT1NBQklfSFVSRCA9IDQsICAgICAgICAgICAvLyBHTlUvSHVyZAorICBFTEZPU0FCSV9TT0xBUklTID0gNiwgICAgICAgIC8vIFNvbGFyaXMKKyAgRUxGT1NBQklfQUlYID0gNywgICAgICAgICAgICAvLyBBSVgKKyAgRUxGT1NBQklfSVJJWCA9IDgsICAgICAgICAgICAvLyBJUklYCisgIEVMRk9TQUJJX0ZSRUVCU0QgPSA5LCAgICAgICAgLy8gRnJlZUJTRAorICBFTEZPU0FCSV9UUlU2NCA9IDEwLCAgICAgICAgIC8vIFRSVTY0IFVOSVgKKyAgRUxGT1NBQklfTU9ERVNUTyA9IDExLCAgICAgICAvLyBOb3ZlbGwgTW9kZXN0bworICBFTEZPU0FCSV9PUEVOQlNEID0gMTIsICAgICAgIC8vIE9wZW5CU0QKKyAgRUxGT1NBQklfT1BFTlZNUyA9IDEzLCAgICAgICAvLyBPcGVuVk1TCisgIEVMRk9TQUJJX05TSyA9IDE0LCAgICAgICAgICAgLy8gSGV3bGV0dC1QYWNrYXJkIE5vbi1TdG9wIEtlcm5lbAorICBFTEZPU0FCSV9BUk9TID0gMTUsICAgICAgICAgIC8vIEFST1MKKyAgRUxGT1NBQklfRkVOSVhPUyA9IDE2LCAgICAgICAvLyBGZW5peE9TCisgIEVMRk9TQUJJX0NMT1VEQUJJID0gMTcsICAgICAgLy8gTnV4aSBDbG91ZEFCSQorICBFTEZPU0FCSV9GSVJTVF9BUkNIID0gNjQsICAgIC8vIEZpcnN0IGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBPUyBBQkkKKyAgRUxGT1NBQklfQU1ER1BVX0hTQSA9IDY0LCAgICAvLyBBTUQgSFNBIHJ1bnRpbWUKKyAgRUxGT1NBQklfQU1ER1BVX1BBTCA9IDY1LCAgICAvLyBBTUQgUEFMIHJ1bnRpbWUKKyAgRUxGT1NBQklfQU1ER1BVX01FU0EzRCA9IDY2LCAvLyBBTUQgR0NOIEdQVXMgKEdGWDYrKSBmb3IgTUVTQSBydW50aW1lCisgIEVMRk9TQUJJX0FSTSA9IDk3LCAgICAgICAgICAgLy8gQVJNCisgIEVMRk9TQUJJX0M2MDAwX0VMRkFCSSA9IDY0LCAgLy8gQmFyZS1tZXRhbCBUTVMzMjBDNjAwMAorICBFTEZPU0FCSV9DNjAwMF9MSU5VWCA9IDY1LCAgIC8vIExpbnV4IFRNUzMyMEM2MDAwCisgIEVMRk9TQUJJX1NUQU5EQUxPTkUgPSAyNTUsICAgLy8gU3RhbmRhbG9uZSAoZW1iZWRkZWQpIGFwcGxpY2F0aW9uCisgIEVMRk9TQUJJX0xBU1RfQVJDSCA9IDI1NSAgICAgLy8gTGFzdCBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgT1MgQUJJCit9OworCisjZGVmaW5lIEVMRl9SRUxPQyhuYW1lLCB2YWx1ZSkgbmFtZSA9IHZhbHVlLAorCisvLyBYODZfNjQgcmVsb2NhdGlvbnMuCitlbnVtIHsKKyNpbmNsdWRlICJFTEZSZWxvY3MveDg2XzY0LmRlZiIKK307CisKKy8vIGkzODYgcmVsb2NhdGlvbnMuCitlbnVtIHsKKyNpbmNsdWRlICJFTEZSZWxvY3MvaTM4Ni5kZWYiCit9OworCisvLyBFTEYgUmVsb2NhdGlvbiB0eXBlcyBmb3IgUFBDMzIKK2VudW0geworI2luY2x1ZGUgIkVMRlJlbG9jcy9Qb3dlclBDLmRlZiIKK307CisKKy8vIFNwZWNpZmljIGVfZmxhZ3MgZm9yIFBQQzY0CitlbnVtIHsKKyAgLy8gZV9mbGFncyBiaXRzIHNwZWNpZnlpbmcgQUJJOgorICAvLyAxIGZvciBvcmlnaW5hbCBBQkkgdXNpbmcgZnVuY3Rpb24gZGVzY3JpcHRvcnMsCisgIC8vIDIgZm9yIHJldmlzZWQgQUJJIHdpdGhvdXQgZnVuY3Rpb24gZGVzY3JpcHRvcnMsCisgIC8vIDAgZm9yIHVuc3BlY2lmaWVkIG9yIG5vdCB1c2luZyBhbnkgZmVhdHVyZXMgYWZmZWN0ZWQgYnkgdGhlIGRpZmZlcmVuY2VzLgorICBFRl9QUEM2NF9BQkkgPSAzCit9OworCisvLyBTcGVjaWFsIHZhbHVlcyBmb3IgdGhlIHN0X290aGVyIGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUgZW50cnkgZm9yIFBQQzY0LgorZW51bSB7CisgIFNUT19QUEM2NF9MT0NBTF9CSVQgPSA1LAorICBTVE9fUFBDNjRfTE9DQUxfTUFTSyA9ICg3IDw8IFNUT19QUEM2NF9MT0NBTF9CSVQpCit9Oworc3RhdGljIGlubGluZSBpbnQ2NF90IGRlY29kZVBQQzY0TG9jYWxFbnRyeU9mZnNldCh1bnNpZ25lZCBPdGhlcikgeworICB1bnNpZ25lZCBWYWwgPSAoT3RoZXIgJiBTVE9fUFBDNjRfTE9DQUxfTUFTSykgPj4gU1RPX1BQQzY0X0xPQ0FMX0JJVDsKKyAgcmV0dXJuICgoMSA8PCBWYWwpID4+IDIpIDw8IDI7Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGVuY29kZVBQQzY0TG9jYWxFbnRyeU9mZnNldChpbnQ2NF90IE9mZnNldCkgeworICB1bnNpZ25lZCBWYWwgPQorICAgICAgKE9mZnNldCA+PSA0ICogNCA/IChPZmZzZXQgPj0gOCAqIDQgPyAoT2Zmc2V0ID49IDE2ICogNCA/IDYgOiA1KSA6IDQpCisgICAgICAgICAgICAgICAgICAgICAgIDogKE9mZnNldCA+PSAyICogNCA/IDMgOiAoT2Zmc2V0ID49IDEgKiA0ID8gMiA6IDApKSk7CisgIHJldHVybiBWYWwgPDwgU1RPX1BQQzY0X0xPQ0FMX0JJVDsKK30KKworLy8gRUxGIFJlbG9jYXRpb24gdHlwZXMgZm9yIFBQQzY0CitlbnVtIHsKKyNpbmNsdWRlICJFTEZSZWxvY3MvUG93ZXJQQzY0LmRlZiIKK307CisKKy8vIEVMRiBSZWxvY2F0aW9uIHR5cGVzIGZvciBBQXJjaDY0CitlbnVtIHsKKyNpbmNsdWRlICJFTEZSZWxvY3MvQUFyY2g2NC5kZWYiCit9OworCisvLyBBUk0gU3BlY2lmaWMgZV9mbGFncworZW51bSA6IHVuc2lnbmVkIHsKKyAgRUZfQVJNX1NPRlRfRkxPQVQgPSAweDAwMDAwMjAwVSwKKyAgRUZfQVJNX1ZGUF9GTE9BVCA9IDB4MDAwMDA0MDBVLAorICBFRl9BUk1fRUFCSV9VTktOT1dOID0gMHgwMDAwMDAwMFUsCisgIEVGX0FSTV9FQUJJX1ZFUjEgPSAweDAxMDAwMDAwVSwKKyAgRUZfQVJNX0VBQklfVkVSMiA9IDB4MDIwMDAwMDBVLAorICBFRl9BUk1fRUFCSV9WRVIzID0gMHgwMzAwMDAwMFUsCisgIEVGX0FSTV9FQUJJX1ZFUjQgPSAweDA0MDAwMDAwVSwKKyAgRUZfQVJNX0VBQklfVkVSNSA9IDB4MDUwMDAwMDBVLAorICBFRl9BUk1fRUFCSU1BU0sgPSAweEZGMDAwMDAwVQorfTsKKworLy8gRUxGIFJlbG9jYXRpb24gdHlwZXMgZm9yIEFSTQorZW51bSB7CisjaW5jbHVkZSAiRUxGUmVsb2NzL0FSTS5kZWYiCit9OworCisvLyBBUkMgU3BlY2lmaWMgZV9mbGFncworZW51bSA6IHVuc2lnbmVkIHsKKyAgRUZfQVJDX01BQ0hfTVNLID0gMHgwMDAwMDBmZiwKKyAgRUZfQVJDX09TQUJJX01TSyA9IDB4MDAwMDBmMDAsCisgIEVfQVJDX01BQ0hfQVJDNjAwID0gMHgwMDAwMDAwMiwKKyAgRV9BUkNfTUFDSF9BUkM2MDEgPSAweDAwMDAwMDA0LAorICBFX0FSQ19NQUNIX0FSQzcwMCA9IDB4MDAwMDAwMDMsCisgIEVGX0FSQ19DUFVfQVJDVjJFTSA9IDB4MDAwMDAwMDUsCisgIEVGX0FSQ19DUFVfQVJDVjJIUyA9IDB4MDAwMDAwMDYsCisgIEVfQVJDX09TQUJJX09SSUcgPSAweDAwMDAwMDAwLAorICBFX0FSQ19PU0FCSV9WMiA9IDB4MDAwMDAyMDAsCisgIEVfQVJDX09TQUJJX1YzID0gMHgwMDAwMDMwMCwKKyAgRV9BUkNfT1NBQklfVjQgPSAweDAwMDAwNDAwLAorICBFRl9BUkNfUElDID0gMHgwMDAwMDEwMAorfTsKKworLy8gRUxGIFJlbG9jYXRpb24gdHlwZXMgZm9yIEFSQworZW51bSB7CisjaW5jbHVkZSAiRUxGUmVsb2NzL0FSQy5kZWYiCit9OworCisvLyBBVlIgc3BlY2lmaWMgZV9mbGFncworZW51bSA6IHVuc2lnbmVkIHsKKyAgRUZfQVZSX0FSQ0hfQVZSMSA9IDEsCisgIEVGX0FWUl9BUkNIX0FWUjIgPSAyLAorICBFRl9BVlJfQVJDSF9BVlIyNSA9IDI1LAorICBFRl9BVlJfQVJDSF9BVlIzID0gMywKKyAgRUZfQVZSX0FSQ0hfQVZSMzEgPSAzMSwKKyAgRUZfQVZSX0FSQ0hfQVZSMzUgPSAzNSwKKyAgRUZfQVZSX0FSQ0hfQVZSNCA9IDQsCisgIEVGX0FWUl9BUkNIX0FWUjUgPSA1LAorICBFRl9BVlJfQVJDSF9BVlI1MSA9IDUxLAorICBFRl9BVlJfQVJDSF9BVlI2ID0gNiwKKyAgRUZfQVZSX0FSQ0hfQVZSVElOWSA9IDEwMCwKKyAgRUZfQVZSX0FSQ0hfWE1FR0ExID0gMTAxLAorICBFRl9BVlJfQVJDSF9YTUVHQTIgPSAxMDIsCisgIEVGX0FWUl9BUkNIX1hNRUdBMyA9IDEwMywKKyAgRUZfQVZSX0FSQ0hfWE1FR0E0ID0gMTA0LAorICBFRl9BVlJfQVJDSF9YTUVHQTUgPSAxMDUsCisgIEVGX0FWUl9BUkNIX1hNRUdBNiA9IDEwNiwKKyAgRUZfQVZSX0FSQ0hfWE1FR0E3ID0gMTA3Cit9OworCisvLyBFTEYgUmVsb2NhdGlvbiB0eXBlcyBmb3IgQVZSCitlbnVtIHsKKyNpbmNsdWRlICJFTEZSZWxvY3MvQVZSLmRlZiIKK307CisKKy8vIE1pcHMgU3BlY2lmaWMgZV9mbGFncworZW51bSA6IHVuc2lnbmVkIHsKKyAgRUZfTUlQU19OT1JFT1JERVIgPSAweDAwMDAwMDAxLCAvLyBEb24ndCByZW9yZGVyIGluc3RydWN0aW9ucworICBFRl9NSVBTX1BJQyA9IDB4MDAwMDAwMDIsICAgICAgIC8vIFBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUKKyAgRUZfTUlQU19DUElDID0gMHgwMDAwMDAwNCwgICAgICAvLyBDYWxsIG9iamVjdCB3aXRoIFBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUKKyAgRUZfTUlQU19BQkkyID0gMHgwMDAwMDAyMCwgICAgICAvLyBGaWxlIHVzZXMgTjMyIEFCSQorICBFRl9NSVBTXzMyQklUTU9ERSA9IDB4MDAwMDAxMDAsIC8vIENvZGUgY29tcGlsZWQgZm9yIGEgNjQtYml0IG1hY2hpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiAzMi1iaXQgbW9kZQorICBFRl9NSVBTX0ZQNjQgPSAweDAwMDAwMjAwLCAgICAgIC8vIENvZGUgY29tcGlsZWQgZm9yIGEgMzItYml0IG1hY2hpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgdXNlcyA2NC1iaXQgRlAgcmVnaXN0ZXJzCisgIEVGX01JUFNfTkFOMjAwOCA9IDB4MDAwMDA0MDAsICAgLy8gVXNlcyBJRUUgNzU0LTIwMDggTmFOIGVuY29kaW5nCisKKyAgLy8gQUJJIGZsYWdzCisgIEVGX01JUFNfQUJJX08zMiA9IDB4MDAwMDEwMDAsIC8vIFRoaXMgZmlsZSBmb2xsb3dzIHRoZSBmaXJzdCBNSVBTIDMyIGJpdCBBQkkKKyAgRUZfTUlQU19BQklfTzY0ID0gMHgwMDAwMjAwMCwgLy8gTzMyIEFCSSBleHRlbmRlZCBmb3IgNjQtYml0IGFyY2hpdGVjdHVyZS4KKyAgRUZfTUlQU19BQklfRUFCSTMyID0gMHgwMDAwMzAwMCwgLy8gRUFCSSBpbiAzMiBiaXQgbW9kZS4KKyAgRUZfTUlQU19BQklfRUFCSTY0ID0gMHgwMDAwNDAwMCwgLy8gRUFCSSBpbiA2NCBiaXQgbW9kZS4KKyAgRUZfTUlQU19BQkkgPSAweDAwMDBmMDAwLCAgICAgICAgLy8gTWFzayBmb3Igc2VsZWN0aW5nIEVGX01JUFNfQUJJXyB2YXJpYW50LgorCisgIC8vIE1JUFMgbWFjaGluZSB2YXJpYW50CisgIEVGX01JUFNfTUFDSF9OT05FID0gMHgwMDAwMDAwMCwgICAgLy8gQSBzdGFuZGFyZCBNSVBTIGltcGxlbWVudGF0aW9uLgorICBFRl9NSVBTX01BQ0hfMzkwMCA9IDB4MDA4MTAwMDAsICAgIC8vIFRvc2hpYmEgUjM5MDAKKyAgRUZfTUlQU19NQUNIXzQwMTAgPSAweDAwODIwMDAwLCAgICAvLyBMU0kgUjQwMTAKKyAgRUZfTUlQU19NQUNIXzQxMDAgPSAweDAwODMwMDAwLCAgICAvLyBORUMgVlI0MTAwCisgIEVGX01JUFNfTUFDSF80NjUwID0gMHgwMDg1MDAwMCwgICAgLy8gTUlQUyBSNDY1MAorICBFRl9NSVBTX01BQ0hfNDEyMCA9IDB4MDA4NzAwMDAsICAgIC8vIE5FQyBWUjQxMjAKKyAgRUZfTUlQU19NQUNIXzQxMTEgPSAweDAwODgwMDAwLCAgICAvLyBORUMgVlI0MTExL1ZSNDE4MQorICBFRl9NSVBTX01BQ0hfU0IxID0gMHgwMDhhMDAwMCwgICAgIC8vIEJyb2FkY29tIFNCLTEKKyAgRUZfTUlQU19NQUNIX09DVEVPTiA9IDB4MDA4YjAwMDAsICAvLyBDYXZpdW0gTmV0d29ya3MgT2N0ZW9uCisgIEVGX01JUFNfTUFDSF9YTFIgPSAweDAwOGMwMDAwLCAgICAgLy8gUk1JIFhscgorICBFRl9NSVBTX01BQ0hfT0NURU9OMiA9IDB4MDA4ZDAwMDAsIC8vIENhdml1bSBOZXR3b3JrcyBPY3Rlb24yCisgIEVGX01JUFNfTUFDSF9PQ1RFT04zID0gMHgwMDhlMDAwMCwgLy8gQ2F2aXVtIE5ldHdvcmtzIE9jdGVvbjMKKyAgRUZfTUlQU19NQUNIXzU0MDAgPSAweDAwOTEwMDAwLCAgICAvLyBORUMgVlI1NDAwCisgIEVGX01JUFNfTUFDSF81OTAwID0gMHgwMDkyMDAwMCwgICAgLy8gTUlQUyBSNTkwMAorICBFRl9NSVBTX01BQ0hfNTUwMCA9IDB4MDA5ODAwMDAsICAgIC8vIE5FQyBWUjU1MDAKKyAgRUZfTUlQU19NQUNIXzkwMDAgPSAweDAwOTkwMDAwLCAgICAvLyBVbmtub3duCisgIEVGX01JUFNfTUFDSF9MUzJFID0gMHgwMGEwMDAwMCwgICAgLy8gU1QgTWljcm9lbGVjdHJvbmljcyBMb29uZ3NvbiAyRQorICBFRl9NSVBTX01BQ0hfTFMyRiA9IDB4MDBhMTAwMDAsICAgIC8vIFNUIE1pY3JvZWxlY3Ryb25pY3MgTG9vbmdzb24gMkYKKyAgRUZfTUlQU19NQUNIX0xTM0EgPSAweDAwYTIwMDAwLCAgICAvLyBMb29uZ3NvbiAzQQorICBFRl9NSVBTX01BQ0ggPSAweDAwZmYwMDAwLCAgICAgICAgIC8vIEVGX01JUFNfTUFDSF94eHggc2VsZWN0aW9uIG1hc2sKKworICAvLyBBUkNIX0FTRQorICBFRl9NSVBTX01JQ1JPTUlQUyA9IDB4MDIwMDAwMDAsICAgICAvLyBtaWNyb01JUFMKKyAgRUZfTUlQU19BUkNIX0FTRV9NMTYgPSAweDA0MDAwMDAwLCAgLy8gSGFzIE1pcHMtMTYgSVNBIGV4dGVuc2lvbnMKKyAgRUZfTUlQU19BUkNIX0FTRV9NRE1YID0gMHgwODAwMDAwMCwgLy8gSGFzIE1ETVggbXVsdGltZWRpYSBleHRlbnNpb25zCisgIEVGX01JUFNfQVJDSF9BU0UgPSAweDBmMDAwMDAwLCAgICAgIC8vIE1hc2sgZm9yIEVGX01JUFNfQVJDSF9BU0VfeHh4IGZsYWdzCisKKyAgLy8gQVJDSAorICBFRl9NSVBTX0FSQ0hfMSA9IDB4MDAwMDAwMDAsICAgIC8vIE1JUFMxIGluc3RydWN0aW9uIHNldAorICBFRl9NSVBTX0FSQ0hfMiA9IDB4MTAwMDAwMDAsICAgIC8vIE1JUFMyIGluc3RydWN0aW9uIHNldAorICBFRl9NSVBTX0FSQ0hfMyA9IDB4MjAwMDAwMDAsICAgIC8vIE1JUFMzIGluc3RydWN0aW9uIHNldAorICBFRl9NSVBTX0FSQ0hfNCA9IDB4MzAwMDAwMDAsICAgIC8vIE1JUFM0IGluc3RydWN0aW9uIHNldAorICBFRl9NSVBTX0FSQ0hfNSA9IDB4NDAwMDAwMDAsICAgIC8vIE1JUFM1IGluc3RydWN0aW9uIHNldAorICBFRl9NSVBTX0FSQ0hfMzIgPSAweDUwMDAwMDAwLCAgIC8vIE1JUFMzMiBpbnN0cnVjdGlvbiBzZXQgcGVyIGxpbnV4IG5vdCBlbGYuaAorICBFRl9NSVBTX0FSQ0hfNjQgPSAweDYwMDAwMDAwLCAgIC8vIE1JUFM2NCBpbnN0cnVjdGlvbiBzZXQgcGVyIGxpbnV4IG5vdCBlbGYuaAorICBFRl9NSVBTX0FSQ0hfMzJSMiA9IDB4NzAwMDAwMDAsIC8vIG1pcHMzMnIyLCBtaXBzMzJyMywgbWlwczMycjUKKyAgRUZfTUlQU19BUkNIXzY0UjIgPSAweDgwMDAwMDAwLCAvLyBtaXBzNjRyMiwgbWlwczY0cjMsIG1pcHM2NHI1CisgIEVGX01JUFNfQVJDSF8zMlI2ID0gMHg5MDAwMDAwMCwgLy8gbWlwczMycjYKKyAgRUZfTUlQU19BUkNIXzY0UjYgPSAweGEwMDAwMDAwLCAvLyBtaXBzNjRyNgorICBFRl9NSVBTX0FSQ0ggPSAweGYwMDAwMDAwICAgICAgIC8vIE1hc2sgZm9yIGFwcGx5aW5nIEVGX01JUFNfQVJDSF8gdmFyaWFudAorfTsKKworLy8gRUxGIFJlbG9jYXRpb24gdHlwZXMgZm9yIE1pcHMKK2VudW0geworI2luY2x1ZGUgIkVMRlJlbG9jcy9NaXBzLmRlZiIKK307CisKKy8vIFNwZWNpYWwgdmFsdWVzIGZvciB0aGUgc3Rfb3RoZXIgZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZSBlbnRyeSBmb3IgTUlQUy4KK2VudW0geworICBTVE9fTUlQU19PUFRJT05BTCA9IDB4MDQsICAvLyBTeW1ib2wgd2hvc2UgZGVmaW5pdGlvbiBpcyBvcHRpb25hbAorICBTVE9fTUlQU19QTFQgPSAweDA4LCAgICAgICAvLyBQTFQgZW50cnkgcmVsYXRlZCBkeW5hbWljIHRhYmxlIHJlY29yZAorICBTVE9fTUlQU19QSUMgPSAweDIwLCAgICAgICAvLyBQSUMgZnVuYyBpbiBhbiBvYmplY3QgbWl4ZXMgUElDL25vbi1QSUMKKyAgU1RPX01JUFNfTUlDUk9NSVBTID0gMHg4MCwgLy8gTUlQUyBTcGVjaWZpYyBJU0EgZm9yIE1pY3JvTWlwcworICBTVE9fTUlQU19NSVBTMTYgPSAweGYwICAgICAvLyBNSVBTIFNwZWNpZmljIElTQSBmb3IgTWlwczE2Cit9OworCisvLyAuTUlQUy5vcHRpb25zIHNlY3Rpb24gZGVzY3JpcHRvciBraW5kcworZW51bSB7CisgIE9ES19OVUxMID0gMCwgICAgICAgLy8gVW5kZWZpbmVkCisgIE9ES19SRUdJTkZPID0gMSwgICAgLy8gUmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24KKyAgT0RLX0VYQ0VQVElPTlMgPSAyLCAvLyBFeGNlcHRpb24gcHJvY2Vzc2luZyBvcHRpb25zCisgIE9ES19QQUQgPSAzLCAgICAgICAgLy8gU2VjdGlvbiBwYWRkaW5nIG9wdGlvbnMKKyAgT0RLX0hXUEFUQ0ggPSA0LCAgICAvLyBIYXJkd2FyZSBwYXRjaGVzIGFwcGxpZWQKKyAgT0RLX0ZJTEwgPSA1LCAgICAgICAvLyBMaW5rZXIgZmlsbCB2YWx1ZQorICBPREtfVEFHUyA9IDYsICAgICAgIC8vIFNwYWNlIGZvciB0b29sIGlkZW50aWZpY2F0aW9uCisgIE9ES19IV0FORCA9IDcsICAgICAgLy8gSGFyZHdhcmUgQU5EIHBhdGNoZXMgYXBwbGllZAorICBPREtfSFdPUiA9IDgsICAgICAgIC8vIEhhcmR3YXJlIE9SIHBhdGNoZXMgYXBwbGllZAorICBPREtfR1BfR1JPVVAgPSA5LCAgIC8vIEdQIGdyb3VwIHRvIHVzZSBmb3IgdGV4dC9kYXRhIHNlY3Rpb25zCisgIE9ES19JREVOVCA9IDEwLCAgICAgLy8gSUQgaW5mb3JtYXRpb24KKyAgT0RLX1BBR0VTSVpFID0gMTEgICAvLyBQYWdlIHNpemUgaW5mb3JtYXRpb24KK307CisKKy8vIEhleGFnb24tc3BlY2lmaWMgZV9mbGFncworZW51bSB7CisgIC8vIE9iamVjdCBwcm9jZXNzb3IgdmVyc2lvbiBmbGFncywgYml0c1sxMTowXQorICBFRl9IRVhBR09OX01BQ0hfVjIgPSAweDAwMDAwMDAxLCAgLy8gSGV4YWdvbiBWMgorICBFRl9IRVhBR09OX01BQ0hfVjMgPSAweDAwMDAwMDAyLCAgLy8gSGV4YWdvbiBWMworICBFRl9IRVhBR09OX01BQ0hfVjQgPSAweDAwMDAwMDAzLCAgLy8gSGV4YWdvbiBWNAorICBFRl9IRVhBR09OX01BQ0hfVjUgPSAweDAwMDAwMDA0LCAgLy8gSGV4YWdvbiBWNQorICBFRl9IRVhBR09OX01BQ0hfVjU1ID0gMHgwMDAwMDAwNSwgLy8gSGV4YWdvbiBWNTUKKyAgRUZfSEVYQUdPTl9NQUNIX1Y2MCA9IDB4MDAwMDAwNjAsIC8vIEhleGFnb24gVjYwCisgIEVGX0hFWEFHT05fTUFDSF9WNjIgPSAweDAwMDAwMDYyLCAvLyBIZXhhZ29uIFY2MgorICBFRl9IRVhBR09OX01BQ0hfVjY1ID0gMHgwMDAwMDA2NSwgLy8gSGV4YWdvbiBWNjUKKworICAvLyBIaWdoZXN0IElTQSB2ZXJzaW9uIGZsYWdzCisgIEVGX0hFWEFHT05fSVNBX01BQ0ggPSAweDAwMDAwMDAwLCAvLyBTYW1lIGFzIHNwZWNpZmllZCBpbiBiaXRzWzExOjBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBlX2ZsYWdzCisgIEVGX0hFWEFHT05fSVNBX1YyID0gMHgwMDAwMDAxMCwgICAvLyBIZXhhZ29uIFYyIElTQQorICBFRl9IRVhBR09OX0lTQV9WMyA9IDB4MDAwMDAwMjAsICAgLy8gSGV4YWdvbiBWMyBJU0EKKyAgRUZfSEVYQUdPTl9JU0FfVjQgPSAweDAwMDAwMDMwLCAgIC8vIEhleGFnb24gVjQgSVNBCisgIEVGX0hFWEFHT05fSVNBX1Y1ID0gMHgwMDAwMDA0MCwgICAvLyBIZXhhZ29uIFY1IElTQQorICBFRl9IRVhBR09OX0lTQV9WNTUgPSAweDAwMDAwMDUwLCAgLy8gSGV4YWdvbiBWNTUgSVNBCisgIEVGX0hFWEFHT05fSVNBX1Y2MCA9IDB4MDAwMDAwNjAsICAvLyBIZXhhZ29uIFY2MCBJU0EKKyAgRUZfSEVYQUdPTl9JU0FfVjYyID0gMHgwMDAwMDA2MiwgIC8vIEhleGFnb24gVjYyIElTQQorICBFRl9IRVhBR09OX0lTQV9WNjUgPSAweDAwMDAwMDY1LCAgLy8gSGV4YWdvbiBWNjUgSVNBCit9OworCisvLyBIZXhhZ29uLXNwZWNpZmljIHNlY3Rpb24gaW5kZXhlcyBmb3IgY29tbW9uIHNtYWxsIGRhdGEKK2VudW0geworICBTSE5fSEVYQUdPTl9TQ09NTU9OID0gMHhmZjAwLCAgIC8vIE90aGVyIGFjY2VzcyBzaXplcworICBTSE5fSEVYQUdPTl9TQ09NTU9OXzEgPSAweGZmMDEsIC8vIEJ5dGUtc2l6ZWQgYWNjZXNzCisgIFNITl9IRVhBR09OX1NDT01NT05fMiA9IDB4ZmYwMiwgLy8gSGFsZi13b3JkLXNpemVkIGFjY2VzcworICBTSE5fSEVYQUdPTl9TQ09NTU9OXzQgPSAweGZmMDMsIC8vIFdvcmQtc2l6ZWQgYWNjZXNzCisgIFNITl9IRVhBR09OX1NDT01NT05fOCA9IDB4ZmYwNCAgLy8gRG91YmxlLXdvcmQtc2l6ZSBhY2Nlc3MKK307CisKKy8vIEVMRiBSZWxvY2F0aW9uIHR5cGVzIGZvciBIZXhhZ29uCitlbnVtIHsKKyNpbmNsdWRlICJFTEZSZWxvY3MvSGV4YWdvbi5kZWYiCit9OworCisvLyBFTEYgUmVsb2NhdGlvbiB0eXBlIGZvciBMYW5haS4KK2VudW0geworI2luY2x1ZGUgIkVMRlJlbG9jcy9MYW5haS5kZWYiCit9OworCisvLyBSSVNDViBTcGVjaWZpYyBlX2ZsYWdzCitlbnVtIDogdW5zaWduZWQgeworICBFRl9SSVNDVl9SVkMgPSAweDAwMDEsCisgIEVGX1JJU0NWX0ZMT0FUX0FCSSA9IDB4MDAwNiwKKyAgRUZfUklTQ1ZfRkxPQVRfQUJJX1NPRlQgPSAweDAwMDAsCisgIEVGX1JJU0NWX0ZMT0FUX0FCSV9TSU5HTEUgPSAweDAwMDIsCisgIEVGX1JJU0NWX0ZMT0FUX0FCSV9ET1VCTEUgPSAweDAwMDQsCisgIEVGX1JJU0NWX0ZMT0FUX0FCSV9RVUFEID0gMHgwMDA2LAorICBFRl9SSVNDVl9SVkUgPSAweDAwMDgKK307CisKKy8vIEVMRiBSZWxvY2F0aW9uIHR5cGVzIGZvciBSSVNDLVYKK2VudW0geworI2luY2x1ZGUgIkVMRlJlbG9jcy9SSVNDVi5kZWYiCit9OworCisvLyBFTEYgUmVsb2NhdGlvbiB0eXBlcyBmb3IgUzM5MC96U2VyaWVzCitlbnVtIHsKKyNpbmNsdWRlICJFTEZSZWxvY3MvU3lzdGVtWi5kZWYiCit9OworCisvLyBFTEYgUmVsb2NhdGlvbiB0eXBlIGZvciBTcGFyYy4KK2VudW0geworI2luY2x1ZGUgIkVMRlJlbG9jcy9TcGFyYy5kZWYiCit9OworCisvLyBFTEYgUmVsb2NhdGlvbiB0eXBlcyBmb3IgV2ViQXNzZW1ibHkKK2VudW0geworI2luY2x1ZGUgIkVMRlJlbG9jcy9XZWJBc3NlbWJseS5kZWYiCit9OworCisvLyBBTURHUFUgc3BlY2lmaWMgZV9mbGFncy4KK2VudW0gOiB1bnNpZ25lZCB7CisgIC8vIFByb2Nlc3NvciBzZWxlY3Rpb24gbWFzayBmb3IgRUZfQU1ER1BVX01BQ0hfKiB2YWx1ZXMuCisgIEVGX0FNREdQVV9NQUNIID0gMHgwZmYsCisKKyAgLy8gTm90IHNwZWNpZmllZCBwcm9jZXNzb3IuCisgIEVGX0FNREdQVV9NQUNIX05PTkUgPSAweDAwMCwKKworICAvLyBSNjAwLWJhc2VkIHByb2Nlc3NvcnMuCisgIEVGX0FNREdQVV9NQUNIX1I2MDBfRklSU1QgPSAweDAwMSwKKyAgRUZfQU1ER1BVX01BQ0hfUjYwMF9MQVNUID0gMHgwMTAsCisgIC8vIFJhZGVvbiBIRCAyMDAwLzMwMDAgU2VyaWVzIChSNjAwKS4KKyAgRUZfQU1ER1BVX01BQ0hfUjYwMF9SNjAwID0gMHgwMDEsCisgIEVGX0FNREdQVV9NQUNIX1I2MDBfUjYzMCA9IDB4MDAyLAorICBFRl9BTURHUFVfTUFDSF9SNjAwX1JTODgwID0gMHgwMDMsCisgIEVGX0FNREdQVV9NQUNIX1I2MDBfUlY2NzAgPSAweDAwNCwKKyAgLy8gUmFkZW9uIEhEIDQwMDAgU2VyaWVzIChSNzAwKS4KKyAgRUZfQU1ER1BVX01BQ0hfUjYwMF9SVjcxMCA9IDB4MDA1LAorICBFRl9BTURHUFVfTUFDSF9SNjAwX1JWNzMwID0gMHgwMDYsCisgIEVGX0FNREdQVV9NQUNIX1I2MDBfUlY3NzAgPSAweDAwNywKKyAgLy8gUmFkZW9uIEhEIDUwMDAgU2VyaWVzIChFdmVyZ3JlZW4pLgorICBFRl9BTURHUFVfTUFDSF9SNjAwX0NFREFSID0gMHgwMDgsCisgIEVGX0FNREdQVV9NQUNIX1I2MDBfQ1lQUkVTUyA9IDB4MDA5LAorICBFRl9BTURHUFVfTUFDSF9SNjAwX0pVTklQRVIgPSAweDAwYSwKKyAgRUZfQU1ER1BVX01BQ0hfUjYwMF9SRURXT09EID0gMHgwMGIsCisgIEVGX0FNREdQVV9NQUNIX1I2MDBfU1VNTyA9IDB4MDBjLAorICAvLyBSYWRlb24gSEQgNjAwMCBTZXJpZXMgKE5vcnRoZXJuIElzbGFuZHMpLgorICBFRl9BTURHUFVfTUFDSF9SNjAwX0JBUlRTID0gMHgwMGQsCisgIEVGX0FNREdQVV9NQUNIX1I2MDBfQ0FJQ09TID0gMHgwMGUsCisgIEVGX0FNREdQVV9NQUNIX1I2MDBfQ0FZTUFOID0gMHgwMGYsCisgIEVGX0FNREdQVV9NQUNIX1I2MDBfVFVSS1MgPSAweDAxMCwKKworICAvLyBSZXNlcnZlZCBmb3IgUjYwMC1iYXNlZCBwcm9jZXNzb3JzLgorICBFRl9BTURHUFVfTUFDSF9SNjAwX1JFU0VSVkVEX0ZJUlNUID0gMHgwMTEsCisgIEVGX0FNREdQVV9NQUNIX1I2MDBfUkVTRVJWRURfTEFTVCA9IDB4MDFmLAorCisgIC8vIEFNREdDTi1iYXNlZCBwcm9jZXNzb3JzLgorICBFRl9BTURHUFVfTUFDSF9BTURHQ05fRklSU1QgPSAweDAyMCwKKyAgRUZfQU1ER1BVX01BQ0hfQU1ER0NOX0xBU1QgPSAweDAyZCwKKyAgLy8gQU1ER0NOIEdGWDYuCisgIEVGX0FNREdQVV9NQUNIX0FNREdDTl9HRlg2MDAgPSAweDAyMCwKKyAgRUZfQU1ER1BVX01BQ0hfQU1ER0NOX0dGWDYwMSA9IDB4MDIxLAorICAvLyBBTURHQ04gR0ZYNy4KKyAgRUZfQU1ER1BVX01BQ0hfQU1ER0NOX0dGWDcwMCA9IDB4MDIyLAorICBFRl9BTURHUFVfTUFDSF9BTURHQ05fR0ZYNzAxID0gMHgwMjMsCisgIEVGX0FNREdQVV9NQUNIX0FNREdDTl9HRlg3MDIgPSAweDAyNCwKKyAgRUZfQU1ER1BVX01BQ0hfQU1ER0NOX0dGWDcwMyA9IDB4MDI1LAorICBFRl9BTURHUFVfTUFDSF9BTURHQ05fR0ZYNzA0ID0gMHgwMjYsCisgIC8vIEFNREdDTiBHRlg4LgorICBFRl9BTURHUFVfTUFDSF9BTURHQ05fR0ZYODAxID0gMHgwMjgsCisgIEVGX0FNREdQVV9NQUNIX0FNREdDTl9HRlg4MDIgPSAweDAyOSwKKyAgRUZfQU1ER1BVX01BQ0hfQU1ER0NOX0dGWDgwMyA9IDB4MDJhLAorICBFRl9BTURHUFVfTUFDSF9BTURHQ05fR0ZYODEwID0gMHgwMmIsCisgIC8vIEFNREdDTiBHRlg5LgorICBFRl9BTURHUFVfTUFDSF9BTURHQ05fR0ZYOTAwID0gMHgwMmMsCisgIEVGX0FNREdQVV9NQUNIX0FNREdDTl9HRlg5MDIgPSAweDAyZCwKKworICAvLyBSZXNlcnZlZCBmb3IgQU1ER0NOLWJhc2VkIHByb2Nlc3NvcnMuCisgIEVGX0FNREdQVV9NQUNIX0FNREdDTl9SRVNFUlZFRDAgPSAweDAyNywKKyAgRUZfQU1ER1BVX01BQ0hfQU1ER0NOX1JFU0VSVkVEMSA9IDB4MDJlLAorICBFRl9BTURHUFVfTUFDSF9BTURHQ05fUkVTRVJWRUQyID0gMHgwMmYsCisgIEVGX0FNREdQVV9NQUNIX0FNREdDTl9SRVNFUlZFRDMgPSAweDAzMCwKKworICAvLyBJbmRpY2F0ZXMgaWYgdGhlIHhuYWNrIHRhcmdldCBmZWF0dXJlIGlzIGVuYWJsZWQgZm9yIGFsbCBjb2RlIGNvbnRhaW5lZCBpbgorICAvLyB0aGUgb2JqZWN0LgorICBFRl9BTURHUFVfWE5BQ0sgPSAweDEwMCwKK307CisKKy8vIEVMRiBSZWxvY2F0aW9uIHR5cGVzIGZvciBBTURHUFUKK2VudW0geworI2luY2x1ZGUgIkVMRlJlbG9jcy9BTURHUFUuZGVmIgorfTsKKworLy8gRUxGIFJlbG9jYXRpb24gdHlwZXMgZm9yIEJQRgorZW51bSB7CisjaW5jbHVkZSAiRUxGUmVsb2NzL0JQRi5kZWYiCit9OworCisjdW5kZWYgRUxGX1JFTE9DCisKKy8vIFNlY3Rpb24gaGVhZGVyLgorc3RydWN0IEVsZjMyX1NoZHIgeworICBFbGYzMl9Xb3JkIHNoX25hbWU7ICAgICAgLy8gU2VjdGlvbiBuYW1lIChpbmRleCBpbnRvIHN0cmluZyB0YWJsZSkKKyAgRWxmMzJfV29yZCBzaF90eXBlOyAgICAgIC8vIFNlY3Rpb24gdHlwZSAoU0hUXyopCisgIEVsZjMyX1dvcmQgc2hfZmxhZ3M7ICAgICAvLyBTZWN0aW9uIGZsYWdzIChTSEZfKikKKyAgRWxmMzJfQWRkciBzaF9hZGRyOyAgICAgIC8vIEFkZHJlc3Mgd2hlcmUgc2VjdGlvbiBpcyB0byBiZSBsb2FkZWQKKyAgRWxmMzJfT2ZmIHNoX29mZnNldDsgICAgIC8vIEZpbGUgb2Zmc2V0IG9mIHNlY3Rpb24gZGF0YSwgaW4gYnl0ZXMKKyAgRWxmMzJfV29yZCBzaF9zaXplOyAgICAgIC8vIFNpemUgb2Ygc2VjdGlvbiwgaW4gYnl0ZXMKKyAgRWxmMzJfV29yZCBzaF9saW5rOyAgICAgIC8vIFNlY3Rpb24gdHlwZS1zcGVjaWZpYyBoZWFkZXIgdGFibGUgaW5kZXggbGluaworICBFbGYzMl9Xb3JkIHNoX2luZm87ICAgICAgLy8gU2VjdGlvbiB0eXBlLXNwZWNpZmljIGV4dHJhIGluZm9ybWF0aW9uCisgIEVsZjMyX1dvcmQgc2hfYWRkcmFsaWduOyAvLyBTZWN0aW9uIGFkZHJlc3MgYWxpZ25tZW50CisgIEVsZjMyX1dvcmQgc2hfZW50c2l6ZTsgICAvLyBTaXplIG9mIHJlY29yZHMgY29udGFpbmVkIHdpdGhpbiB0aGUgc2VjdGlvbgorfTsKKworLy8gU2VjdGlvbiBoZWFkZXIgZm9yIEVMRjY0IC0gc2FtZSBmaWVsZHMgYXMgRUxGMzIsIGRpZmZlcmVudCB0eXBlcy4KK3N0cnVjdCBFbGY2NF9TaGRyIHsKKyAgRWxmNjRfV29yZCBzaF9uYW1lOworICBFbGY2NF9Xb3JkIHNoX3R5cGU7CisgIEVsZjY0X1h3b3JkIHNoX2ZsYWdzOworICBFbGY2NF9BZGRyIHNoX2FkZHI7CisgIEVsZjY0X09mZiBzaF9vZmZzZXQ7CisgIEVsZjY0X1h3b3JkIHNoX3NpemU7CisgIEVsZjY0X1dvcmQgc2hfbGluazsKKyAgRWxmNjRfV29yZCBzaF9pbmZvOworICBFbGY2NF9Yd29yZCBzaF9hZGRyYWxpZ247CisgIEVsZjY0X1h3b3JkIHNoX2VudHNpemU7Cit9OworCisvLyBTcGVjaWFsIHNlY3Rpb24gaW5kaWNlcy4KK2VudW0geworICBTSE5fVU5ERUYgPSAwLCAgICAgICAgICAvLyBVbmRlZmluZWQsIG1pc3NpbmcsIGlycmVsZXZhbnQsIG9yIG1lYW5pbmdsZXNzCisgIFNITl9MT1JFU0VSVkUgPSAweGZmMDAsIC8vIExvd2VzdCByZXNlcnZlZCBpbmRleAorICBTSE5fTE9QUk9DID0gMHhmZjAwLCAgICAvLyBMb3dlc3QgcHJvY2Vzc29yLXNwZWNpZmljIGluZGV4CisgIFNITl9ISVBST0MgPSAweGZmMWYsICAgIC8vIEhpZ2hlc3QgcHJvY2Vzc29yLXNwZWNpZmljIGluZGV4CisgIFNITl9MT09TID0gMHhmZjIwLCAgICAgIC8vIExvd2VzdCBvcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljIGluZGV4CisgIFNITl9ISU9TID0gMHhmZjNmLCAgICAgIC8vIEhpZ2hlc3Qgb3BlcmF0aW5nIHN5c3RlbS1zcGVjaWZpYyBpbmRleAorICBTSE5fQUJTID0gMHhmZmYxLCAgICAgICAvLyBTeW1ib2wgaGFzIGFic29sdXRlIHZhbHVlOyBkb2VzIG5vdCBuZWVkIHJlbG9jYXRpb24KKyAgU0hOX0NPTU1PTiA9IDB4ZmZmMiwgICAgLy8gRk9SVFJBTiBDT01NT04gb3IgQyBleHRlcm5hbCBnbG9iYWwgdmFyaWFibGVzCisgIFNITl9YSU5ERVggPSAweGZmZmYsICAgIC8vIE1hcmsgdGhhdCB0aGUgaW5kZXggaXMgPj0gU0hOX0xPUkVTRVJWRQorICBTSE5fSElSRVNFUlZFID0gMHhmZmZmICAvLyBIaWdoZXN0IHJlc2VydmVkIGluZGV4Cit9OworCisvLyBTZWN0aW9uIHR5cGVzLgorZW51bSA6IHVuc2lnbmVkIHsKKyAgU0hUX05VTEwgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBhc3NvY2lhdGVkIHNlY3Rpb24gKGluYWN0aXZlIGVudHJ5KS4KKyAgU0hUX1BST0dCSVRTID0gMSwgICAgICAgICAgICAgICAgICAgICAvLyBQcm9ncmFtLWRlZmluZWQgY29udGVudHMuCisgIFNIVF9TWU1UQUIgPSAyLCAgICAgICAgICAgICAgICAgICAgICAgLy8gU3ltYm9sIHRhYmxlLgorICBTSFRfU1RSVEFCID0gMywgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0cmluZyB0YWJsZS4KKyAgU0hUX1JFTEEgPSA0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWxvY2F0aW9uIGVudHJpZXM7IGV4cGxpY2l0IGFkZGVuZHMuCisgIFNIVF9IQVNIID0gNSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3ltYm9sIGhhc2ggdGFibGUuCisgIFNIVF9EWU5BTUlDID0gNiwgICAgICAgICAgICAgICAgICAgICAgLy8gSW5mb3JtYXRpb24gZm9yIGR5bmFtaWMgbGlua2luZy4KKyAgU0hUX05PVEUgPSA3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZS4KKyAgU0hUX05PQklUUyA9IDgsICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIG9jY3VwaWVzIG5vIHNwYWNlIGluIHRoZSBmaWxlLgorICBTSFRfUkVMID0gOSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbG9jYXRpb24gZW50cmllczsgbm8gZXhwbGljaXQgYWRkZW5kcy4KKyAgU0hUX1NITElCID0gMTAsICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNlcnZlZC4KKyAgU0hUX0RZTlNZTSA9IDExLCAgICAgICAgICAgICAgICAgICAgICAvLyBTeW1ib2wgdGFibGUuCisgIFNIVF9JTklUX0FSUkFZID0gMTQsICAgICAgICAgICAgICAgICAgLy8gUG9pbnRlcnMgdG8gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLgorICBTSFRfRklOSV9BUlJBWSA9IDE1LCAgICAgICAgICAgICAgICAgIC8vIFBvaW50ZXJzIHRvIHRlcm1pbmF0aW9uIGZ1bmN0aW9ucy4KKyAgU0hUX1BSRUlOSVRfQVJSQVkgPSAxNiwgICAgICAgICAgICAgICAvLyBQb2ludGVycyB0byBwcmUtaW5pdCBmdW5jdGlvbnMuCisgIFNIVF9HUk9VUCA9IDE3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VjdGlvbiBncm91cC4KKyAgU0hUX1NZTVRBQl9TSE5EWCA9IDE4LCAgICAgICAgICAgICAgICAvLyBJbmRpY2VzIGZvciBTSE5fWElOREVYIGVudHJpZXMuCisgIFNIVF9MT09TID0gMHg2MDAwMDAwMCwgICAgICAgICAgICAgICAgLy8gTG93ZXN0IG9wZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMgdHlwZS4KKyAgLy8gQW5kcm9pZCBwYWNrZWQgcmVsb2NhdGlvbiBzZWN0aW9uIHR5cGVzLgorICAvLyBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9iaW9uaWMvKy82ZjEyYmZlY2U1ZGNjMDEzMjVlMGFiYmE1NmE0NmIxYmNmOTkxYzY5L3Rvb2xzL3JlbG9jYXRpb25fcGFja2VyL3NyYy9lbGZfZmlsZS5jYyMzNworICBTSFRfQU5EUk9JRF9SRUwgPSAweDYwMDAwMDAxLAorICBTSFRfQU5EUk9JRF9SRUxBID0gMHg2MDAwMDAwMiwKKyAgU0hUX0xMVk1fT0RSVEFCID0gMHg2ZmZmNGMwMCwgICAgICAgICAvLyBMTFZNIE9EUiB0YWJsZS4KKyAgU0hUX0xMVk1fTElOS0VSX09QVElPTlMgPSAweDZmZmY0YzAxLCAvLyBMTFZNIExpbmtlciBPcHRpb25zLgorICBTSFRfR05VX0FUVFJJQlVURVMgPSAweDZmZmZmZmY1LCAgICAgIC8vIE9iamVjdCBhdHRyaWJ1dGVzLgorICBTSFRfR05VX0hBU0ggPSAweDZmZmZmZmY2LCAgICAgICAgICAgIC8vIEdOVS1zdHlsZSBoYXNoIHRhYmxlLgorICBTSFRfR05VX3ZlcmRlZiA9IDB4NmZmZmZmZmQsICAgICAgICAgIC8vIEdOVSB2ZXJzaW9uIGRlZmluaXRpb25zLgorICBTSFRfR05VX3Zlcm5lZWQgPSAweDZmZmZmZmZlLCAgICAgICAgIC8vIEdOVSB2ZXJzaW9uIHJlZmVyZW5jZXMuCisgIFNIVF9HTlVfdmVyc3ltID0gMHg2ZmZmZmZmZiwgICAgICAgICAgLy8gR05VIHN5bWJvbCB2ZXJzaW9ucyB0YWJsZS4KKyAgU0hUX0hJT1MgPSAweDZmZmZmZmZmLCAgICAgICAgICAgICAgICAvLyBIaWdoZXN0IG9wZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMgdHlwZS4KKyAgU0hUX0xPUFJPQyA9IDB4NzAwMDAwMDAsICAgICAgICAgICAgICAvLyBMb3dlc3QgcHJvY2Vzc29yIGFyY2gtc3BlY2lmaWMgdHlwZS4KKyAgLy8gRml4bWU6IEFsbCB0aGlzIGlzIGR1cGxpY2F0ZWQgaW4gTUNTZWN0aW9uRUxGLiBXaHk/PworICAvLyBFeGNlcHRpb24gSW5kZXggdGFibGUKKyAgU0hUX0FSTV9FWElEWCA9IDB4NzAwMDAwMDFVLAorICAvLyBCUEFCSSBETEwgZHluYW1pYyBsaW5raW5nIHByZS1lbXB0aW9uIG1hcAorICBTSFRfQVJNX1BSRUVNUFRNQVAgPSAweDcwMDAwMDAyVSwKKyAgLy8gIE9iamVjdCBmaWxlIGNvbXBhdGliaWxpdHkgYXR0cmlidXRlcworICBTSFRfQVJNX0FUVFJJQlVURVMgPSAweDcwMDAwMDAzVSwKKyAgU0hUX0FSTV9ERUJVR09WRVJMQVkgPSAweDcwMDAwMDA0VSwKKyAgU0hUX0FSTV9PVkVSTEFZU0VDVElPTiA9IDB4NzAwMDAwMDVVLAorICBTSFRfSEVYX09SREVSRUQgPSAweDcwMDAwMDAwLCAgICAgICAgIC8vIExpbmsgZWRpdG9yIGlzIHRvIHNvcnQgdGhlIGVudHJpZXMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNlY3Rpb24gYmFzZWQgb24gdGhlaXIgc2l6ZXMKKyAgU0hUX1g4Nl82NF9VTldJTkQgPSAweDcwMDAwMDAxLCAgICAgICAvLyBVbndpbmQgaW5mb3JtYXRpb24KKworICBTSFRfTUlQU19SRUdJTkZPID0gMHg3MDAwMDAwNiwgICAgICAgIC8vIFJlZ2lzdGVyIHVzYWdlIGluZm9ybWF0aW9uCisgIFNIVF9NSVBTX09QVElPTlMgPSAweDcwMDAwMDBkLCAgICAgICAgLy8gR2VuZXJhbCBvcHRpb25zCisgIFNIVF9NSVBTX0RXQVJGID0gMHg3MDAwMDAxZSwgICAgICAgICAgLy8gRFdBUkYgZGVidWdnaW5nIHNlY3Rpb24uCisgIFNIVF9NSVBTX0FCSUZMQUdTID0gMHg3MDAwMDAyYSwgICAgICAgLy8gQUJJIGluZm9ybWF0aW9uLgorCisgIFNIVF9ISVBST0MgPSAweDdmZmZmZmZmLCAgICAgICAgICAgICAgLy8gSGlnaGVzdCBwcm9jZXNzb3IgYXJjaC1zcGVjaWZpYyB0eXBlLgorICBTSFRfTE9VU0VSID0gMHg4MDAwMDAwMCwgICAgICAgICAgICAgIC8vIExvd2VzdCB0eXBlIHJlc2VydmVkIGZvciBhcHBsaWNhdGlvbnMuCisgIFNIVF9ISVVTRVIgPSAweGZmZmZmZmZmICAgICAgICAgICAgICAgLy8gSGlnaGVzdCB0eXBlIHJlc2VydmVkIGZvciBhcHBsaWNhdGlvbnMuCit9OworCisvLyBTZWN0aW9uIGZsYWdzLgorZW51bSA6IHVuc2lnbmVkIHsKKyAgLy8gU2VjdGlvbiBkYXRhIHNob3VsZCBiZSB3cml0YWJsZSBkdXJpbmcgZXhlY3V0aW9uLgorICBTSEZfV1JJVEUgPSAweDEsCisKKyAgLy8gU2VjdGlvbiBvY2N1cGllcyBtZW1vcnkgZHVyaW5nIHByb2dyYW0gZXhlY3V0aW9uLgorICBTSEZfQUxMT0MgPSAweDIsCisKKyAgLy8gU2VjdGlvbiBjb250YWlucyBleGVjdXRhYmxlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLgorICBTSEZfRVhFQ0lOU1RSID0gMHg0LAorCisgIC8vIFRoZSBkYXRhIGluIHRoaXMgc2VjdGlvbiBtYXkgYmUgbWVyZ2VkLgorICBTSEZfTUVSR0UgPSAweDEwLAorCisgIC8vIFRoZSBkYXRhIGluIHRoaXMgc2VjdGlvbiBpcyBudWxsLXRlcm1pbmF0ZWQgc3RyaW5ncy4KKyAgU0hGX1NUUklOR1MgPSAweDIwLAorCisgIC8vIEEgZmllbGQgaW4gdGhpcyBzZWN0aW9uIGhvbGRzIGEgc2VjdGlvbiBoZWFkZXIgdGFibGUgaW5kZXguCisgIFNIRl9JTkZPX0xJTksgPSAweDQwVSwKKworICAvLyBBZGRzIHNwZWNpYWwgb3JkZXJpbmcgcmVxdWlyZW1lbnRzIGZvciBsaW5rIGVkaXRvcnMuCisgIFNIRl9MSU5LX09SREVSID0gMHg4MFUsCisKKyAgLy8gVGhpcyBzZWN0aW9uIHJlcXVpcmVzIHNwZWNpYWwgT1Mtc3BlY2lmaWMgcHJvY2Vzc2luZyB0byBhdm9pZCBpbmNvcnJlY3QKKyAgLy8gYmVoYXZpb3IuCisgIFNIRl9PU19OT05DT05GT1JNSU5HID0gMHgxMDBVLAorCisgIC8vIFRoaXMgc2VjdGlvbiBpcyBhIG1lbWJlciBvZiBhIHNlY3Rpb24gZ3JvdXAuCisgIFNIRl9HUk9VUCA9IDB4MjAwVSwKKworICAvLyBUaGlzIHNlY3Rpb24gaG9sZHMgVGhyZWFkLUxvY2FsIFN0b3JhZ2UuCisgIFNIRl9UTFMgPSAweDQwMFUsCisKKyAgLy8gSWRlbnRpZmllcyBhIHNlY3Rpb24gY29udGFpbmluZyBjb21wcmVzc2VkIGRhdGEuCisgIFNIRl9DT01QUkVTU0VEID0gMHg4MDBVLAorCisgIC8vIFRoaXMgc2VjdGlvbiBpcyBleGNsdWRlZCBmcm9tIHRoZSBmaW5hbCBleGVjdXRhYmxlIG9yIHNoYXJlZCBsaWJyYXJ5LgorICBTSEZfRVhDTFVERSA9IDB4ODAwMDAwMDBVLAorCisgIC8vIFN0YXJ0IG9mIHRhcmdldC1zcGVjaWZpYyBmbGFncy4KKworICBTSEZfTUFTS09TID0gMHgwZmYwMDAwMCwKKworICAvLyBCaXRzIGluZGljYXRpbmcgcHJvY2Vzc29yLXNwZWNpZmljIGZsYWdzLgorICBTSEZfTUFTS1BST0MgPSAweGYwMDAwMDAwLAorCisgIC8vLyBBbGwgc2VjdGlvbnMgd2l0aCB0aGUgImQiIGZsYWcgYXJlIGdyb3VwZWQgdG9nZXRoZXIgYnkgdGhlIGxpbmtlciB0byBmb3JtCisgIC8vLyB0aGUgZGF0YSBzZWN0aW9uIGFuZCB0aGUgZHAgcmVnaXN0ZXIgaXMgc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiBieQorICAvLy8gdGhlIGJvb3QgY29kZS4KKyAgWENPUkVfU0hGX0RQX1NFQ1RJT04gPSAweDEwMDAwMDAwLAorCisgIC8vLyBBbGwgc2VjdGlvbnMgd2l0aCB0aGUgImMiIGZsYWcgYXJlIGdyb3VwZWQgdG9nZXRoZXIgYnkgdGhlIGxpbmtlciB0byBmb3JtCisgIC8vLyB0aGUgY29uc3RhbnQgcG9vbCBhbmQgdGhlIGNwIHJlZ2lzdGVyIGlzIHNldCB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbnN0YW50CisgIC8vLyBwb29sIGJ5IHRoZSBib290IGNvZGUuCisgIFhDT1JFX1NIRl9DUF9TRUNUSU9OID0gMHgyMDAwMDAwMCwKKworICAvLyBJZiBhbiBvYmplY3QgZmlsZSBzZWN0aW9uIGRvZXMgbm90IGhhdmUgdGhpcyBmbGFnIHNldCwgdGhlbiBpdCBtYXkgbm90IGhvbGQKKyAgLy8gbW9yZSB0aGFuIDJHQiBhbmQgY2FuIGJlIGZyZWVseSByZWZlcnJlZCB0byBpbiBvYmplY3RzIHVzaW5nIHNtYWxsZXIgY29kZQorICAvLyBtb2RlbHMuIE90aGVyd2lzZSwgb25seSBvYmplY3RzIHVzaW5nIGxhcmdlciBjb2RlIG1vZGVscyBjYW4gcmVmZXIgdG8gdGhlbS4KKyAgLy8gRm9yIGV4YW1wbGUsIGEgbWVkaXVtIGNvZGUgbW9kZWwgb2JqZWN0IGNhbiByZWZlciB0byBkYXRhIGluIGEgc2VjdGlvbiB0aGF0CisgIC8vIHNldHMgdGhpcyBmbGFnIGJlc2lkZXMgYmVpbmcgYWJsZSB0byByZWZlciB0byBkYXRhIGluIGEgc2VjdGlvbiB0aGF0IGRvZXMKKyAgLy8gbm90IHNldCBpdDsgbGlrZXdpc2UsIGEgc21hbGwgY29kZSBtb2RlbCBvYmplY3QgY2FuIHJlZmVyIG9ubHkgdG8gY29kZSBpbiBhCisgIC8vIHNlY3Rpb24gdGhhdCBkb2VzIG5vdCBzZXQgdGhpcyBmbGFnLgorICBTSEZfWDg2XzY0X0xBUkdFID0gMHgxMDAwMDAwMCwKKworICAvLyBBbGwgc2VjdGlvbnMgd2l0aCB0aGUgR1BSRUwgZmxhZyBhcmUgZ3JvdXBlZCBpbnRvIGEgZ2xvYmFsIGRhdGEgYXJlYQorICAvLyBmb3IgZmFzdGVyIGFjY2Vzc2VzCisgIFNIRl9IRVhfR1BSRUwgPSAweDEwMDAwMDAwLAorCisgIC8vIFNlY3Rpb24gY29udGFpbnMgdGV4dC9kYXRhIHdoaWNoIG1heSBiZSByZXBsaWNhdGVkIGluIG90aGVyIHNlY3Rpb25zLgorICAvLyBMaW5rZXIgbXVzdCByZXRhaW4gb25seSBvbmUgY29weS4KKyAgU0hGX01JUFNfTk9EVVBFUyA9IDB4MDEwMDAwMDAsCisKKyAgLy8gTGlua2VyIG11c3QgZ2VuZXJhdGUgaW1wbGljaXQgaGlkZGVuIHdlYWsgbmFtZXMuCisgIFNIRl9NSVBTX05BTUVTID0gMHgwMjAwMDAwMCwKKworICAvLyBTZWN0aW9uIGRhdGEgbG9jYWwgdG8gcHJvY2Vzcy4KKyAgU0hGX01JUFNfTE9DQUwgPSAweDA0MDAwMDAwLAorCisgIC8vIERvIG5vdCBzdHJpcCB0aGlzIHNlY3Rpb24uCisgIFNIRl9NSVBTX05PU1RSSVAgPSAweDA4MDAwMDAwLAorCisgIC8vIFNlY3Rpb24gbXVzdCBiZSBwYXJ0IG9mIGdsb2JhbCBkYXRhIGFyZWEuCisgIFNIRl9NSVBTX0dQUkVMID0gMHgxMDAwMDAwMCwKKworICAvLyBUaGlzIHNlY3Rpb24gc2hvdWxkIGJlIG1lcmdlZC4KKyAgU0hGX01JUFNfTUVSR0UgPSAweDIwMDAwMDAwLAorCisgIC8vIEFkZHJlc3Mgc2l6ZSB0byBiZSBpbmZlcnJlZCBmcm9tIHNlY3Rpb24gZW50cnkgc2l6ZS4KKyAgU0hGX01JUFNfQUREUiA9IDB4NDAwMDAwMDAsCisKKyAgLy8gU2VjdGlvbiBkYXRhIGlzIHN0cmluZyBkYXRhIGJ5IGRlZmF1bHQuCisgIFNIRl9NSVBTX1NUUklORyA9IDB4ODAwMDAwMDAsCisKKyAgLy8gTWFrZSBjb2RlIHNlY3Rpb24gdW5yZWFkYWJsZSB3aGVuIGluIGV4ZWN1dGUtb25seSBtb2RlCisgIFNIRl9BUk1fUFVSRUNPREUgPSAweDIwMDAwMDAwCit9OworCisvLyBTZWN0aW9uIEdyb3VwIEZsYWdzCitlbnVtIDogdW5zaWduZWQgeworICBHUlBfQ09NREFUID0gMHgxLAorICBHUlBfTUFTS09TID0gMHgwZmYwMDAwMCwKKyAgR1JQX01BU0tQUk9DID0gMHhmMDAwMDAwMAorfTsKKworLy8gU3ltYm9sIHRhYmxlIGVudHJpZXMgZm9yIEVMRjMyLgorc3RydWN0IEVsZjMyX1N5bSB7CisgIEVsZjMyX1dvcmQgc3RfbmFtZTsgICAgIC8vIFN5bWJvbCBuYW1lIChpbmRleCBpbnRvIHN0cmluZyB0YWJsZSkKKyAgRWxmMzJfQWRkciBzdF92YWx1ZTsgICAgLy8gVmFsdWUgb3IgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN5bWJvbAorICBFbGYzMl9Xb3JkIHN0X3NpemU7ICAgICAvLyBTaXplIG9mIHRoZSBzeW1ib2wKKyAgdW5zaWduZWQgY2hhciBzdF9pbmZvOyAgLy8gU3ltYm9sJ3MgdHlwZSBhbmQgYmluZGluZyBhdHRyaWJ1dGVzCisgIHVuc2lnbmVkIGNoYXIgc3Rfb3RoZXI7IC8vIE11c3QgYmUgemVybzsgcmVzZXJ2ZWQKKyAgRWxmMzJfSGFsZiBzdF9zaG5keDsgICAgLy8gV2hpY2ggc2VjdGlvbiAoaGVhZGVyIHRhYmxlIGluZGV4KSBpdCdzIGRlZmluZWQgaW4KKworICAvLyBUaGVzZSBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzIGNvcnJlc3BvbmQgdG8gdGhlIEVMRjMyX1NUX0JJTkQsCisgIC8vIEVMRjMyX1NUX1RZUEUsIGFuZCBFTEYzMl9TVF9JTkZPIG1hY3JvcyBkZWZpbmVkIGluIHRoZSBFTEYgc3BlY2lmaWNhdGlvbjoKKyAgdW5zaWduZWQgY2hhciBnZXRCaW5kaW5nKCkgY29uc3QgeyByZXR1cm4gc3RfaW5mbyA+PiA0OyB9CisgIHVuc2lnbmVkIGNoYXIgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHN0X2luZm8gJiAweDBmOyB9CisgIHZvaWQgc2V0QmluZGluZyh1bnNpZ25lZCBjaGFyIGIpIHsgc2V0QmluZGluZ0FuZFR5cGUoYiwgZ2V0VHlwZSgpKTsgfQorICB2b2lkIHNldFR5cGUodW5zaWduZWQgY2hhciB0KSB7IHNldEJpbmRpbmdBbmRUeXBlKGdldEJpbmRpbmcoKSwgdCk7IH0KKyAgdm9pZCBzZXRCaW5kaW5nQW5kVHlwZSh1bnNpZ25lZCBjaGFyIGIsIHVuc2lnbmVkIGNoYXIgdCkgeworICAgIHN0X2luZm8gPSAoYiA8PCA0KSArICh0ICYgMHgwZik7CisgIH0KK307CisKKy8vIFN5bWJvbCB0YWJsZSBlbnRyaWVzIGZvciBFTEY2NC4KK3N0cnVjdCBFbGY2NF9TeW0geworICBFbGY2NF9Xb3JkIHN0X25hbWU7ICAgICAvLyBTeW1ib2wgbmFtZSAoaW5kZXggaW50byBzdHJpbmcgdGFibGUpCisgIHVuc2lnbmVkIGNoYXIgc3RfaW5mbzsgIC8vIFN5bWJvbCdzIHR5cGUgYW5kIGJpbmRpbmcgYXR0cmlidXRlcworICB1bnNpZ25lZCBjaGFyIHN0X290aGVyOyAvLyBNdXN0IGJlIHplcm87IHJlc2VydmVkCisgIEVsZjY0X0hhbGYgc3Rfc2huZHg7ICAgIC8vIFdoaWNoIHNlY3Rpb24gKGhlYWRlciB0YmwgaW5kZXgpIGl0J3MgZGVmaW5lZCBpbgorICBFbGY2NF9BZGRyIHN0X3ZhbHVlOyAgICAvLyBWYWx1ZSBvciBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ltYm9sCisgIEVsZjY0X1h3b3JkIHN0X3NpemU7ICAgIC8vIFNpemUgb2YgdGhlIHN5bWJvbAorCisgIC8vIFRoZXNlIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgYXJlIGlkZW50aWNhbCB0byB0aG9zZSBkZWZpbmVkIGZvciBFTEYzMgorICAvLyBzeW1ib2wgdGFibGUgZW50cmllcy4KKyAgdW5zaWduZWQgY2hhciBnZXRCaW5kaW5nKCkgY29uc3QgeyByZXR1cm4gc3RfaW5mbyA+PiA0OyB9CisgIHVuc2lnbmVkIGNoYXIgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHN0X2luZm8gJiAweDBmOyB9CisgIHZvaWQgc2V0QmluZGluZyh1bnNpZ25lZCBjaGFyIGIpIHsgc2V0QmluZGluZ0FuZFR5cGUoYiwgZ2V0VHlwZSgpKTsgfQorICB2b2lkIHNldFR5cGUodW5zaWduZWQgY2hhciB0KSB7IHNldEJpbmRpbmdBbmRUeXBlKGdldEJpbmRpbmcoKSwgdCk7IH0KKyAgdm9pZCBzZXRCaW5kaW5nQW5kVHlwZSh1bnNpZ25lZCBjaGFyIGIsIHVuc2lnbmVkIGNoYXIgdCkgeworICAgIHN0X2luZm8gPSAoYiA8PCA0KSArICh0ICYgMHgwZik7CisgIH0KK307CisKKy8vIFRoZSBzaXplIChpbiBieXRlcykgb2Ygc3ltYm9sIHRhYmxlIGVudHJpZXMuCitlbnVtIHsKKyAgU1lNRU5UUllfU0laRTMyID0gMTYsIC8vIDMyLWJpdCBzeW1ib2wgZW50cnkgc2l6ZQorICBTWU1FTlRSWV9TSVpFNjQgPSAyNCAgLy8gNjQtYml0IHN5bWJvbCBlbnRyeSBzaXplLgorfTsKKworLy8gU3ltYm9sIGJpbmRpbmdzLgorZW51bSB7CisgIFNUQl9MT0NBTCA9IDAsICAvLyBMb2NhbCBzeW1ib2wsIG5vdCB2aXNpYmxlIG91dHNpZGUgb2JqIGZpbGUgY29udGFpbmluZyBkZWYKKyAgU1RCX0dMT0JBTCA9IDEsIC8vIEdsb2JhbCBzeW1ib2wsIHZpc2libGUgdG8gYWxsIG9iamVjdCBmaWxlcyBiZWluZyBjb21iaW5lZAorICBTVEJfV0VBSyA9IDIsICAgLy8gV2VhayBzeW1ib2wsIGxpa2UgZ2xvYmFsIGJ1dCBsb3dlci1wcmVjZWRlbmNlCisgIFNUQl9HTlVfVU5JUVVFID0gMTAsCisgIFNUQl9MT09TID0gMTAsICAgLy8gTG93ZXN0IG9wZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMgYmluZGluZyB0eXBlCisgIFNUQl9ISU9TID0gMTIsICAgLy8gSGlnaGVzdCBvcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljIGJpbmRpbmcgdHlwZQorICBTVEJfTE9QUk9DID0gMTMsIC8vIExvd2VzdCBwcm9jZXNzb3Itc3BlY2lmaWMgYmluZGluZyB0eXBlCisgIFNUQl9ISVBST0MgPSAxNSAgLy8gSGlnaGVzdCBwcm9jZXNzb3Itc3BlY2lmaWMgYmluZGluZyB0eXBlCit9OworCisvLyBTeW1ib2wgdHlwZXMuCitlbnVtIHsKKyAgU1RUX05PVFlQRSA9IDAsICAgICAvLyBTeW1ib2wncyB0eXBlIGlzIG5vdCBzcGVjaWZpZWQKKyAgU1RUX09CSkVDVCA9IDEsICAgICAvLyBTeW1ib2wgaXMgYSBkYXRhIG9iamVjdCAodmFyaWFibGUsIGFycmF5LCBldGMuKQorICBTVFRfRlVOQyA9IDIsICAgICAgIC8vIFN5bWJvbCBpcyBleGVjdXRhYmxlIGNvZGUgKGZ1bmN0aW9uLCBldGMuKQorICBTVFRfU0VDVElPTiA9IDMsICAgIC8vIFN5bWJvbCByZWZlcnMgdG8gYSBzZWN0aW9uCisgIFNUVF9GSUxFID0gNCwgICAgICAgLy8gTG9jYWwsIGFic29sdXRlIHN5bWJvbCB0aGF0IHJlZmVycyB0byBhIGZpbGUKKyAgU1RUX0NPTU1PTiA9IDUsICAgICAvLyBBbiB1bmluaXRpYWxpemVkIGNvbW1vbiBibG9jaworICBTVFRfVExTID0gNiwgICAgICAgIC8vIFRocmVhZCBsb2NhbCBkYXRhIG9iamVjdAorICBTVFRfR05VX0lGVU5DID0gMTAsIC8vIEdOVSBpbmRpcmVjdCBmdW5jdGlvbgorICBTVFRfTE9PUyA9IDEwLCAgICAgIC8vIExvd2VzdCBvcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljIHN5bWJvbCB0eXBlCisgIFNUVF9ISU9TID0gMTIsICAgICAgLy8gSGlnaGVzdCBvcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljIHN5bWJvbCB0eXBlCisgIFNUVF9MT1BST0MgPSAxMywgICAgLy8gTG93ZXN0IHByb2Nlc3Nvci1zcGVjaWZpYyBzeW1ib2wgdHlwZQorICBTVFRfSElQUk9DID0gMTUsICAgIC8vIEhpZ2hlc3QgcHJvY2Vzc29yLXNwZWNpZmljIHN5bWJvbCB0eXBlCisKKyAgLy8gQU1ER1BVIHN5bWJvbCB0eXBlcworICBTVFRfQU1ER1BVX0hTQV9LRVJORUwgPSAxMAorfTsKKworZW51bSB7CisgIFNUVl9ERUZBVUxUID0gMCwgIC8vIFZpc2liaWxpdHkgaXMgc3BlY2lmaWVkIGJ5IGJpbmRpbmcgdHlwZQorICBTVFZfSU5URVJOQUwgPSAxLCAvLyBEZWZpbmVkIGJ5IHByb2Nlc3NvciBzdXBwbGVtZW50cworICBTVFZfSElEREVOID0gMiwgICAvLyBOb3QgdmlzaWJsZSB0byBvdGhlciBjb21wb25lbnRzCisgIFNUVl9QUk9URUNURUQgPSAzIC8vIFZpc2libGUgaW4gb3RoZXIgY29tcG9uZW50cyBidXQgbm90IHByZWVtcHRhYmxlCit9OworCisvLyBTeW1ib2wgbnVtYmVyLgorZW51bSB7IFNUTl9VTkRFRiA9IDAgfTsKKworLy8gU3BlY2lhbCByZWxvY2F0aW9uIHN5bWJvbHMgdXNlZCBpbiB0aGUgTUlQUzY0IEVMRiByZWxvY2F0aW9uIGVudHJpZXMKK2VudW0geworICBSU1NfVU5ERUYgPSAwLCAvLyBOb25lCisgIFJTU19HUCA9IDEsICAgIC8vIFZhbHVlIG9mIGdwCisgIFJTU19HUDAgPSAyLCAgIC8vIFZhbHVlIG9mIGdwIHVzZWQgdG8gY3JlYXRlIG9iamVjdCBiZWluZyByZWxvY2F0ZWQKKyAgUlNTX0xPQyA9IDMgICAgLy8gQWRkcmVzcyBvZiBsb2NhdGlvbiBiZWluZyByZWxvY2F0ZWQKK307CisKKy8vIFJlbG9jYXRpb24gZW50cnksIHdpdGhvdXQgZXhwbGljaXQgYWRkZW5kLgorc3RydWN0IEVsZjMyX1JlbCB7CisgIEVsZjMyX0FkZHIgcl9vZmZzZXQ7IC8vIExvY2F0aW9uIChmaWxlIGJ5dGUgb2Zmc2V0LCBvciBwcm9ncmFtIHZpcnR1YWwgYWRkcikKKyAgRWxmMzJfV29yZCByX2luZm87ICAgLy8gU3ltYm9sIHRhYmxlIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gdG8gYXBwbHkKKworICAvLyBUaGVzZSBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzIGNvcnJlc3BvbmQgdG8gdGhlIEVMRjMyX1JfU1lNLCBFTEYzMl9SX1RZUEUsCisgIC8vIGFuZCBFTEYzMl9SX0lORk8gbWFjcm9zIGRlZmluZWQgaW4gdGhlIEVMRiBzcGVjaWZpY2F0aW9uOgorICBFbGYzMl9Xb3JkIGdldFN5bWJvbCgpIGNvbnN0IHsgcmV0dXJuIChyX2luZm8gPj4gOCk7IH0KKyAgdW5zaWduZWQgY2hhciBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gKHVuc2lnbmVkIGNoYXIpKHJfaW5mbyAmIDB4MGZmKTsgfQorICB2b2lkIHNldFN5bWJvbChFbGYzMl9Xb3JkIHMpIHsgc2V0U3ltYm9sQW5kVHlwZShzLCBnZXRUeXBlKCkpOyB9CisgIHZvaWQgc2V0VHlwZSh1bnNpZ25lZCBjaGFyIHQpIHsgc2V0U3ltYm9sQW5kVHlwZShnZXRTeW1ib2woKSwgdCk7IH0KKyAgdm9pZCBzZXRTeW1ib2xBbmRUeXBlKEVsZjMyX1dvcmQgcywgdW5zaWduZWQgY2hhciB0KSB7CisgICAgcl9pbmZvID0gKHMgPDwgOCkgKyB0OworICB9Cit9OworCisvLyBSZWxvY2F0aW9uIGVudHJ5IHdpdGggZXhwbGljaXQgYWRkZW5kLgorc3RydWN0IEVsZjMyX1JlbGEgeworICBFbGYzMl9BZGRyIHJfb2Zmc2V0OyAgLy8gTG9jYXRpb24gKGZpbGUgYnl0ZSBvZmZzZXQsIG9yIHByb2dyYW0gdmlydHVhbCBhZGRyKQorICBFbGYzMl9Xb3JkIHJfaW5mbzsgICAgLy8gU3ltYm9sIHRhYmxlIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gdG8gYXBwbHkKKyAgRWxmMzJfU3dvcmQgcl9hZGRlbmQ7IC8vIENvbXB1dGUgdmFsdWUgZm9yIHJlbG9jYXRhYmxlIGZpZWxkIGJ5IGFkZGluZyB0aGlzCisKKyAgLy8gVGhlc2UgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyBjb3JyZXNwb25kIHRvIHRoZSBFTEYzMl9SX1NZTSwgRUxGMzJfUl9UWVBFLAorICAvLyBhbmQgRUxGMzJfUl9JTkZPIG1hY3JvcyBkZWZpbmVkIGluIHRoZSBFTEYgc3BlY2lmaWNhdGlvbjoKKyAgRWxmMzJfV29yZCBnZXRTeW1ib2woKSBjb25zdCB7IHJldHVybiAocl9pbmZvID4+IDgpOyB9CisgIHVuc2lnbmVkIGNoYXIgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuICh1bnNpZ25lZCBjaGFyKShyX2luZm8gJiAweDBmZik7IH0KKyAgdm9pZCBzZXRTeW1ib2woRWxmMzJfV29yZCBzKSB7IHNldFN5bWJvbEFuZFR5cGUocywgZ2V0VHlwZSgpKTsgfQorICB2b2lkIHNldFR5cGUodW5zaWduZWQgY2hhciB0KSB7IHNldFN5bWJvbEFuZFR5cGUoZ2V0U3ltYm9sKCksIHQpOyB9CisgIHZvaWQgc2V0U3ltYm9sQW5kVHlwZShFbGYzMl9Xb3JkIHMsIHVuc2lnbmVkIGNoYXIgdCkgeworICAgIHJfaW5mbyA9IChzIDw8IDgpICsgdDsKKyAgfQorfTsKKworLy8gUmVsb2NhdGlvbiBlbnRyeSwgd2l0aG91dCBleHBsaWNpdCBhZGRlbmQuCitzdHJ1Y3QgRWxmNjRfUmVsIHsKKyAgRWxmNjRfQWRkciByX29mZnNldDsgLy8gTG9jYXRpb24gKGZpbGUgYnl0ZSBvZmZzZXQsIG9yIHByb2dyYW0gdmlydHVhbCBhZGRyKS4KKyAgRWxmNjRfWHdvcmQgcl9pbmZvOyAgLy8gU3ltYm9sIHRhYmxlIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gdG8gYXBwbHkuCisKKyAgLy8gVGhlc2UgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyBjb3JyZXNwb25kIHRvIHRoZSBFTEY2NF9SX1NZTSwgRUxGNjRfUl9UWVBFLAorICAvLyBhbmQgRUxGNjRfUl9JTkZPIG1hY3JvcyBkZWZpbmVkIGluIHRoZSBFTEYgc3BlY2lmaWNhdGlvbjoKKyAgRWxmNjRfV29yZCBnZXRTeW1ib2woKSBjb25zdCB7IHJldHVybiAocl9pbmZvID4+IDMyKTsgfQorICBFbGY2NF9Xb3JkIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiAoRWxmNjRfV29yZCkocl9pbmZvICYgMHhmZmZmZmZmZkwpOyB9CisgIHZvaWQgc2V0U3ltYm9sKEVsZjY0X1dvcmQgcykgeyBzZXRTeW1ib2xBbmRUeXBlKHMsIGdldFR5cGUoKSk7IH0KKyAgdm9pZCBzZXRUeXBlKEVsZjY0X1dvcmQgdCkgeyBzZXRTeW1ib2xBbmRUeXBlKGdldFN5bWJvbCgpLCB0KTsgfQorICB2b2lkIHNldFN5bWJvbEFuZFR5cGUoRWxmNjRfV29yZCBzLCBFbGY2NF9Xb3JkIHQpIHsKKyAgICByX2luZm8gPSAoKEVsZjY0X1h3b3JkKXMgPDwgMzIpICsgKHQgJiAweGZmZmZmZmZmTCk7CisgIH0KK307CisKKy8vIFJlbG9jYXRpb24gZW50cnkgd2l0aCBleHBsaWNpdCBhZGRlbmQuCitzdHJ1Y3QgRWxmNjRfUmVsYSB7CisgIEVsZjY0X0FkZHIgcl9vZmZzZXQ7IC8vIExvY2F0aW9uIChmaWxlIGJ5dGUgb2Zmc2V0LCBvciBwcm9ncmFtIHZpcnR1YWwgYWRkcikuCisgIEVsZjY0X1h3b3JkIHJfaW5mbzsgIC8vIFN5bWJvbCB0YWJsZSBpbmRleCBhbmQgdHlwZSBvZiByZWxvY2F0aW9uIHRvIGFwcGx5LgorICBFbGY2NF9TeHdvcmQgcl9hZGRlbmQ7IC8vIENvbXB1dGUgdmFsdWUgZm9yIHJlbG9jYXRhYmxlIGZpZWxkIGJ5IGFkZGluZyB0aGlzLgorCisgIC8vIFRoZXNlIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgY29ycmVzcG9uZCB0byB0aGUgRUxGNjRfUl9TWU0sIEVMRjY0X1JfVFlQRSwKKyAgLy8gYW5kIEVMRjY0X1JfSU5GTyBtYWNyb3MgZGVmaW5lZCBpbiB0aGUgRUxGIHNwZWNpZmljYXRpb246CisgIEVsZjY0X1dvcmQgZ2V0U3ltYm9sKCkgY29uc3QgeyByZXR1cm4gKHJfaW5mbyA+PiAzMik7IH0KKyAgRWxmNjRfV29yZCBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gKEVsZjY0X1dvcmQpKHJfaW5mbyAmIDB4ZmZmZmZmZmZMKTsgfQorICB2b2lkIHNldFN5bWJvbChFbGY2NF9Xb3JkIHMpIHsgc2V0U3ltYm9sQW5kVHlwZShzLCBnZXRUeXBlKCkpOyB9CisgIHZvaWQgc2V0VHlwZShFbGY2NF9Xb3JkIHQpIHsgc2V0U3ltYm9sQW5kVHlwZShnZXRTeW1ib2woKSwgdCk7IH0KKyAgdm9pZCBzZXRTeW1ib2xBbmRUeXBlKEVsZjY0X1dvcmQgcywgRWxmNjRfV29yZCB0KSB7CisgICAgcl9pbmZvID0gKChFbGY2NF9Yd29yZClzIDw8IDMyKSArICh0ICYgMHhmZmZmZmZmZkwpOworICB9Cit9OworCisvLyBQcm9ncmFtIGhlYWRlciBmb3IgRUxGMzIuCitzdHJ1Y3QgRWxmMzJfUGhkciB7CisgIEVsZjMyX1dvcmQgcF90eXBlOyAgIC8vIFR5cGUgb2Ygc2VnbWVudAorICBFbGYzMl9PZmYgcF9vZmZzZXQ7ICAvLyBGaWxlIG9mZnNldCB3aGVyZSBzZWdtZW50IGlzIGxvY2F0ZWQsIGluIGJ5dGVzCisgIEVsZjMyX0FkZHIgcF92YWRkcjsgIC8vIFZpcnR1YWwgYWRkcmVzcyBvZiBiZWdpbm5pbmcgb2Ygc2VnbWVudAorICBFbGYzMl9BZGRyIHBfcGFkZHI7ICAvLyBQaHlzaWNhbCBhZGRyZXNzIG9mIGJlZ2lubmluZyBvZiBzZWdtZW50IChPUy1zcGVjaWZpYykKKyAgRWxmMzJfV29yZCBwX2ZpbGVzejsgLy8gTnVtLiBvZiBieXRlcyBpbiBmaWxlIGltYWdlIG9mIHNlZ21lbnQgKG1heSBiZSB6ZXJvKQorICBFbGYzMl9Xb3JkIHBfbWVtc3o7ICAvLyBOdW0uIG9mIGJ5dGVzIGluIG1lbSBpbWFnZSBvZiBzZWdtZW50IChtYXkgYmUgemVybykKKyAgRWxmMzJfV29yZCBwX2ZsYWdzOyAgLy8gU2VnbWVudCBmbGFncworICBFbGYzMl9Xb3JkIHBfYWxpZ247ICAvLyBTZWdtZW50IGFsaWdubWVudCBjb25zdHJhaW50Cit9OworCisvLyBQcm9ncmFtIGhlYWRlciBmb3IgRUxGNjQuCitzdHJ1Y3QgRWxmNjRfUGhkciB7CisgIEVsZjY0X1dvcmQgcF90eXBlOyAgICAvLyBUeXBlIG9mIHNlZ21lbnQKKyAgRWxmNjRfV29yZCBwX2ZsYWdzOyAgIC8vIFNlZ21lbnQgZmxhZ3MKKyAgRWxmNjRfT2ZmIHBfb2Zmc2V0OyAgIC8vIEZpbGUgb2Zmc2V0IHdoZXJlIHNlZ21lbnQgaXMgbG9jYXRlZCwgaW4gYnl0ZXMKKyAgRWxmNjRfQWRkciBwX3ZhZGRyOyAgIC8vIFZpcnR1YWwgYWRkcmVzcyBvZiBiZWdpbm5pbmcgb2Ygc2VnbWVudAorICBFbGY2NF9BZGRyIHBfcGFkZHI7ICAgLy8gUGh5c2ljYWwgYWRkciBvZiBiZWdpbm5pbmcgb2Ygc2VnbWVudCAoT1Mtc3BlY2lmaWMpCisgIEVsZjY0X1h3b3JkIHBfZmlsZXN6OyAvLyBOdW0uIG9mIGJ5dGVzIGluIGZpbGUgaW1hZ2Ugb2Ygc2VnbWVudCAobWF5IGJlIHplcm8pCisgIEVsZjY0X1h3b3JkIHBfbWVtc3o7ICAvLyBOdW0uIG9mIGJ5dGVzIGluIG1lbSBpbWFnZSBvZiBzZWdtZW50IChtYXkgYmUgemVybykKKyAgRWxmNjRfWHdvcmQgcF9hbGlnbjsgIC8vIFNlZ21lbnQgYWxpZ25tZW50IGNvbnN0cmFpbnQKK307CisKKy8vIFNlZ21lbnQgdHlwZXMuCitlbnVtIHsKKyAgUFRfTlVMTCA9IDAsICAgICAgICAgICAgLy8gVW51c2VkIHNlZ21lbnQuCisgIFBUX0xPQUQgPSAxLCAgICAgICAgICAgIC8vIExvYWRhYmxlIHNlZ21lbnQuCisgIFBUX0RZTkFNSUMgPSAyLCAgICAgICAgIC8vIER5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4KKyAgUFRfSU5URVJQID0gMywgICAgICAgICAgLy8gSW50ZXJwcmV0ZXIgcGF0aG5hbWUuCisgIFBUX05PVEUgPSA0LCAgICAgICAgICAgIC8vIEF1eGlsaWFyeSBpbmZvcm1hdGlvbi4KKyAgUFRfU0hMSUIgPSA1LCAgICAgICAgICAgLy8gUmVzZXJ2ZWQuCisgIFBUX1BIRFIgPSA2LCAgICAgICAgICAgIC8vIFRoZSBwcm9ncmFtIGhlYWRlciB0YWJsZSBpdHNlbGYuCisgIFBUX1RMUyA9IDcsICAgICAgICAgICAgIC8vIFRoZSB0aHJlYWQtbG9jYWwgc3RvcmFnZSB0ZW1wbGF0ZS4KKyAgUFRfTE9PUyA9IDB4NjAwMDAwMDAsICAgLy8gTG93ZXN0IG9wZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMgcHQgZW50cnkgdHlwZS4KKyAgUFRfSElPUyA9IDB4NmZmZmZmZmYsICAgLy8gSGlnaGVzdCBvcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljIHB0IGVudHJ5IHR5cGUuCisgIFBUX0xPUFJPQyA9IDB4NzAwMDAwMDAsIC8vIExvd2VzdCBwcm9jZXNzb3Itc3BlY2lmaWMgcHJvZ3JhbSBoZHIgZW50cnkgdHlwZS4KKyAgUFRfSElQUk9DID0gMHg3ZmZmZmZmZiwgLy8gSGlnaGVzdCBwcm9jZXNzb3Itc3BlY2lmaWMgcHJvZ3JhbSBoZHIgZW50cnkgdHlwZS4KKworICAvLyB4ODYtNjQgcHJvZ3JhbSBoZWFkZXIgdHlwZXMuCisgIC8vIFRoZXNlIGFsbCBjb250YWluIHN0YWNrIHVud2luZCB0YWJsZXMuCisgIFBUX0dOVV9FSF9GUkFNRSA9IDB4NjQ3NGU1NTAsCisgIFBUX1NVTldfRUhfRlJBTUUgPSAweDY0NzRlNTUwLAorICBQVF9TVU5XX1VOV0lORCA9IDB4NjQ2NGU1NTAsCisKKyAgUFRfR05VX1NUQUNLID0gMHg2NDc0ZTU1MSwgLy8gSW5kaWNhdGVzIHN0YWNrIGV4ZWN1dGFiaWxpdHkuCisgIFBUX0dOVV9SRUxSTyA9IDB4NjQ3NGU1NTIsIC8vIFJlYWQtb25seSBhZnRlciByZWxvY2F0aW9uLgorCisgIFBUX09QRU5CU0RfUkFORE9NSVpFID0gMHg2NWEzZGJlNiwgLy8gRmlsbCB3aXRoIHJhbmRvbSBkYXRhLgorICBQVF9PUEVOQlNEX1dYTkVFREVEID0gMHg2NWEzZGJlNywgIC8vIFByb2dyYW0gZG9lcyBXXlggdmlvbGF0aW9ucy4KKyAgUFRfT1BFTkJTRF9CT09UREFUQSA9IDB4NjVhNDFiZTYsICAvLyBTZWN0aW9uIGZvciBib290IGFyZ3VtZW50cy4KKworICAvLyBBUk0gcHJvZ3JhbSBoZWFkZXIgdHlwZXMuCisgIFBUX0FSTV9BUkNIRVhUID0gMHg3MDAwMDAwMCwgLy8gUGxhdGZvcm0gYXJjaGl0ZWN0dXJlIGNvbXBhdGliaWxpdHkgaW5mbworICAvLyBUaGVzZSBhbGwgY29udGFpbiBzdGFjayB1bndpbmQgdGFibGVzLgorICBQVF9BUk1fRVhJRFggPSAweDcwMDAwMDAxLAorICBQVF9BUk1fVU5XSU5EID0gMHg3MDAwMDAwMSwKKworICAvLyBNSVBTIHByb2dyYW0gaGVhZGVyIHR5cGVzLgorICBQVF9NSVBTX1JFR0lORk8gPSAweDcwMDAwMDAwLCAgLy8gUmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24uCisgIFBUX01JUFNfUlRQUk9DID0gMHg3MDAwMDAwMSwgICAvLyBSdW50aW1lIHByb2NlZHVyZSB0YWJsZS4KKyAgUFRfTUlQU19PUFRJT05TID0gMHg3MDAwMDAwMiwgIC8vIE9wdGlvbnMgc2VnbWVudC4KKyAgUFRfTUlQU19BQklGTEFHUyA9IDB4NzAwMDAwMDMsIC8vIEFiaWZsYWdzIHNlZ21lbnQuCisKKyAgLy8gV2ViQXNzZW1ibHkgcHJvZ3JhbSBoZWFkZXIgdHlwZXMuCisgIFBUX1dFQkFTU0VNQkxZX0ZVTkNUSU9OUyA9IFBUX0xPUFJPQyArIDAsIC8vIEZ1bmN0aW9uIGRlZmluaXRpb25zLgorfTsKKworLy8gU2VnbWVudCBmbGFnIGJpdHMuCitlbnVtIDogdW5zaWduZWQgeworICBQRl9YID0gMSwgICAgICAgICAgICAgICAgLy8gRXhlY3V0ZQorICBQRl9XID0gMiwgICAgICAgICAgICAgICAgLy8gV3JpdGUKKyAgUEZfUiA9IDQsICAgICAgICAgICAgICAgIC8vIFJlYWQKKyAgUEZfTUFTS09TID0gMHgwZmYwMDAwMCwgIC8vIEJpdHMgZm9yIG9wZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMgc2VtYW50aWNzLgorICBQRl9NQVNLUFJPQyA9IDB4ZjAwMDAwMDAgLy8gQml0cyBmb3IgcHJvY2Vzc29yLXNwZWNpZmljIHNlbWFudGljcy4KK307CisKKy8vIER5bmFtaWMgdGFibGUgZW50cnkgZm9yIEVMRjMyLgorc3RydWN0IEVsZjMyX0R5biB7CisgIEVsZjMyX1N3b3JkIGRfdGFnOyAvLyBUeXBlIG9mIGR5bmFtaWMgdGFibGUgZW50cnkuCisgIHVuaW9uIHsKKyAgICBFbGYzMl9Xb3JkIGRfdmFsOyAvLyBJbnRlZ2VyIHZhbHVlIG9mIGVudHJ5LgorICAgIEVsZjMyX0FkZHIgZF9wdHI7IC8vIFBvaW50ZXIgdmFsdWUgb2YgZW50cnkuCisgIH0gZF91bjsKK307CisKKy8vIER5bmFtaWMgdGFibGUgZW50cnkgZm9yIEVMRjY0Lgorc3RydWN0IEVsZjY0X0R5biB7CisgIEVsZjY0X1N4d29yZCBkX3RhZzsgLy8gVHlwZSBvZiBkeW5hbWljIHRhYmxlIGVudHJ5LgorICB1bmlvbiB7CisgICAgRWxmNjRfWHdvcmQgZF92YWw7IC8vIEludGVnZXIgdmFsdWUgb2YgZW50cnkuCisgICAgRWxmNjRfQWRkciBkX3B0cjsgIC8vIFBvaW50ZXIgdmFsdWUgb2YgZW50cnkuCisgIH0gZF91bjsKK307CisKKy8vIER5bmFtaWMgdGFibGUgZW50cnkgdGFncy4KK2VudW0geworI2RlZmluZSBEWU5BTUlDX1RBRyhuYW1lLCB2YWx1ZSkgRFRfIyNuYW1lID0gdmFsdWUsCisjaW5jbHVkZSAiRHluYW1pY1RhZ3MuZGVmIgorI3VuZGVmIERZTkFNSUNfVEFHCit9OworCisvLyBEVF9GTEFHUyB2YWx1ZXMuCitlbnVtIHsKKyAgREZfT1JJR0lOID0gMHgwMSwgICAgLy8gVGhlIG9iamVjdCBtYXkgcmVmZXJlbmNlICRPUklHSU4uCisgIERGX1NZTUJPTElDID0gMHgwMiwgIC8vIFNlYXJjaCB0aGUgc2hhcmVkIGxpYiBiZWZvcmUgc2VhcmNoaW5nIHRoZSBleGUuCisgIERGX1RFWFRSRUwgPSAweDA0LCAgIC8vIFJlbG9jYXRpb25zIG1heSBtb2RpZnkgYSBub24td3JpdGFibGUgc2VnbWVudC4KKyAgREZfQklORF9OT1cgPSAweDA4LCAgLy8gUHJvY2VzcyBhbGwgcmVsb2NhdGlvbnMgb24gbG9hZC4KKyAgREZfU1RBVElDX1RMUyA9IDB4MTAgLy8gUmVqZWN0IGF0dGVtcHRzIHRvIGxvYWQgZHluYW1pY2FsbHkuCit9OworCisvLyBTdGF0ZSBmbGFncyBzZWxlY3RhYmxlIGluIHRoZSBgZF91bi5kX3ZhbCcgZWxlbWVudCBvZiB0aGUgRFRfRkxBR1NfMSBlbnRyeS4KK2VudW0geworICBERl8xX05PVyA9IDB4MDAwMDAwMDEsICAgICAgIC8vIFNldCBSVExEX05PVyBmb3IgdGhpcyBvYmplY3QuCisgIERGXzFfR0xPQkFMID0gMHgwMDAwMDAwMiwgICAgLy8gU2V0IFJUTERfR0xPQkFMIGZvciB0aGlzIG9iamVjdC4KKyAgREZfMV9HUk9VUCA9IDB4MDAwMDAwMDQsICAgICAvLyBTZXQgUlRMRF9HUk9VUCBmb3IgdGhpcyBvYmplY3QuCisgIERGXzFfTk9ERUxFVEUgPSAweDAwMDAwMDA4LCAgLy8gU2V0IFJUTERfTk9ERUxFVEUgZm9yIHRoaXMgb2JqZWN0LgorICBERl8xX0xPQURGTFRSID0gMHgwMDAwMDAxMCwgIC8vIFRyaWdnZXIgZmlsdGVlIGxvYWRpbmcgYXQgcnVudGltZS4KKyAgREZfMV9JTklURklSU1QgPSAweDAwMDAwMDIwLCAvLyBTZXQgUlRMRF9JTklURklSU1QgZm9yIHRoaXMgb2JqZWN0LgorICBERl8xX05PT1BFTiA9IDB4MDAwMDAwNDAsICAgIC8vIFNldCBSVExEX05PT1BFTiBmb3IgdGhpcyBvYmplY3QuCisgIERGXzFfT1JJR0lOID0gMHgwMDAwMDA4MCwgICAgLy8gJE9SSUdJTiBtdXN0IGJlIGhhbmRsZWQuCisgIERGXzFfRElSRUNUID0gMHgwMDAwMDEwMCwgICAgLy8gRGlyZWN0IGJpbmRpbmcgZW5hYmxlZC4KKyAgREZfMV9UUkFOUyA9IDB4MDAwMDAyMDAsCisgIERGXzFfSU5URVJQT1NFID0gMHgwMDAwMDQwMCwgIC8vIE9iamVjdCBpcyB1c2VkIHRvIGludGVycG9zZS4KKyAgREZfMV9OT0RFRkxJQiA9IDB4MDAwMDA4MDAsICAgLy8gSWdub3JlIGRlZmF1bHQgbGliIHNlYXJjaCBwYXRoLgorICBERl8xX05PRFVNUCA9IDB4MDAwMDEwMDAsICAgICAvLyBPYmplY3QgY2FuJ3QgYmUgZGxkdW1wJ2VkLgorICBERl8xX0NPTkZBTFQgPSAweDAwMDAyMDAwLCAgICAvLyBDb25maWd1cmF0aW9uIGFsdGVybmF0aXZlIGNyZWF0ZWQuCisgIERGXzFfRU5ERklMVEVFID0gMHgwMDAwNDAwMCwgIC8vIEZpbHRlZSB0ZXJtaW5hdGVzIGZpbHRlcnMgc2VhcmNoLgorICBERl8xX0RJU1BSRUxETkUgPSAweDAwMDA4MDAwLCAvLyBEaXNwIHJlbG9jIGFwcGxpZWQgYXQgYnVpbGQgdGltZS4KKyAgREZfMV9ESVNQUkVMUE5EID0gMHgwMDAxMDAwMCwgLy8gRGlzcCByZWxvYyBhcHBsaWVkIGF0IHJ1bi10aW1lLgorICBERl8xX05PRElSRUNUID0gMHgwMDAyMDAwMCwgICAvLyBPYmplY3QgaGFzIG5vLWRpcmVjdCBiaW5kaW5nLgorICBERl8xX0lHTk1VTERFRiA9IDB4MDAwNDAwMDAsCisgIERGXzFfTk9LU1lNUyA9IDB4MDAwODAwMDAsCisgIERGXzFfTk9IRFIgPSAweDAwMTAwMDAwLAorICBERl8xX0VESVRFRCA9IDB4MDAyMDAwMDAsIC8vIE9iamVjdCBpcyBtb2RpZmllZCBhZnRlciBidWlsdC4KKyAgREZfMV9OT1JFTE9DID0gMHgwMDQwMDAwMCwKKyAgREZfMV9TWU1JTlRQT1NFID0gMHgwMDgwMDAwMCwgLy8gT2JqZWN0IGhhcyBpbmRpdmlkdWFsIGludGVycG9zZXJzLgorICBERl8xX0dMT0JBVURJVCA9IDB4MDEwMDAwMDAsICAvLyBHbG9iYWwgYXVkaXRpbmcgcmVxdWlyZWQuCisgIERGXzFfU0lOR0xFVE9OID0gMHgwMjAwMDAwMCAgIC8vIFNpbmdsZXRvbiBzeW1ib2xzIGFyZSB1c2VkLgorfTsKKworLy8gRFRfTUlQU19GTEFHUyB2YWx1ZXMuCitlbnVtIHsKKyAgUkhGX05PTkUgPSAweDAwMDAwMDAwLCAgICAgICAgICAgICAgICAgICAvLyBObyBmbGFncy4KKyAgUkhGX1FVSUNLU1RBUlQgPSAweDAwMDAwMDAxLCAgICAgICAgICAgICAvLyBVc2VzIHNob3J0Y3V0IHBvaW50ZXJzLgorICBSSEZfTk9UUE9UID0gMHgwMDAwMDAwMiwgICAgICAgICAgICAgICAgIC8vIEhhc2ggc2l6ZSBpcyBub3QgYSBwb3dlciBvZiB0d28uCisgIFJIU19OT19MSUJSQVJZX1JFUExBQ0VNRU5UID0gMHgwMDAwMDAwNCwgLy8gSWdub3JlIExEX0xJQlJBUllfUEFUSC4KKyAgUkhGX05PX01PVkUgPSAweDAwMDAwMDA4LCAgICAgICAgICAgICAgICAvLyBEU08gYWRkcmVzcyBtYXkgbm90IGJlIHJlbG9jYXRlZC4KKyAgUkhGX1NHSV9PTkxZID0gMHgwMDAwMDAxMCwgICAgICAgICAgICAgICAvLyBTR0kgc3BlY2lmaWMgZmVhdHVyZXMuCisgIFJIRl9HVUFSQU5URUVfSU5JVCA9IDB4MDAwMDAwMjAsICAgICAgICAgLy8gR3VhcmFudGVlIHRoYXQgLmluaXQgd2lsbCBmaW5pc2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRpbmcgYmVmb3JlIGFueSBub24taW5pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgaW4gRFNPIGlzIGNhbGxlZC4KKyAgUkhGX0RFTFRBX0NfUExVU19QTFVTID0gMHgwMDAwMDA0MCwgICAgICAvLyBDb250YWlucyBEZWx0YSBDKysgY29kZS4KKyAgUkhGX0dVQVJBTlRFRV9TVEFSVF9JTklUID0gMHgwMDAwMDA4MCwgICAvLyBHdWFyYW50ZWUgdGhhdCAuaW5pdCB3aWxsIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW5nIGJlZm9yZSBhbnkgbm9uLWluaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlIGluIERTTyBpcyBjYWxsZWQuCisgIFJIRl9QSVhJRSA9IDB4MDAwMDAxMDAsICAgICAgICAgICAgICAgICAgLy8gR2VuZXJhdGVkIGJ5IHBpeGllLgorICBSSEZfREVGQVVMVF9ERUxBWV9MT0FEID0gMHgwMDAwMDIwMCwgICAgIC8vIERlbGF5LWxvYWQgRFNPIGJ5IGRlZmF1bHQuCisgIFJIRl9SRVFVSUNLU1RBUlQgPSAweDAwMDAwNDAwLCAgICAgICAgICAgLy8gT2JqZWN0IG1heSBiZSByZXF1aWNrc3RhcnRlZAorICBSSEZfUkVRVUlDS1NUQVJURUQgPSAweDAwMDAwODAwLCAgICAgICAgIC8vIE9iamVjdCBoYXMgYmVlbiByZXF1aWNrc3RhcnRlZAorICBSSEZfQ09SRCA9IDB4MDAwMDEwMDAsICAgICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlZCBieSBjb3JkLgorICBSSEZfTk9fVU5SRVNfVU5ERUYgPSAweDAwMDAyMDAwLCAgICAgICAgIC8vIE9iamVjdCBjb250YWlucyBubyB1bnJlc29sdmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5kZWYgc3ltYm9scy4KKyAgUkhGX1JMRF9PUkRFUl9TQUZFID0gMHgwMDAwNDAwMCAgICAgICAgICAvLyBTeW1ib2wgdGFibGUgaXMgaW4gYSBzYWZlIG9yZGVyLgorfTsKKworLy8gRWxmWFhfVmVyRGVmIHN0cnVjdHVyZSB2ZXJzaW9uIChHTlUgdmVyc2lvbmluZykKK2VudW0geyBWRVJfREVGX05PTkUgPSAwLCBWRVJfREVGX0NVUlJFTlQgPSAxIH07CisKKy8vIFZlckRlZiBGbGFncyAoRWxmWFhfVmVyRGVmOjp2ZF9mbGFncykKK2VudW0geyBWRVJfRkxHX0JBU0UgPSAweDEsIFZFUl9GTEdfV0VBSyA9IDB4MiwgVkVSX0ZMR19JTkZPID0gMHg0IH07CisKKy8vIFNwZWNpYWwgY29uc3RhbnRzIGZvciB0aGUgdmVyc2lvbiB0YWJsZS4gKFNIVF9HTlVfdmVyc3ltLy5nbnUudmVyc2lvbikKK2VudW0geworICBWRVJfTkRYX0xPQ0FMID0gMCwgICAgICAgLy8gVW52ZXJzaW9uZWQgbG9jYWwgc3ltYm9sCisgIFZFUl9ORFhfR0xPQkFMID0gMSwgICAgICAvLyBVbnZlcnNpb25lZCBnbG9iYWwgc3ltYm9sCisgIFZFUlNZTV9WRVJTSU9OID0gMHg3ZmZmLCAvLyBWZXJzaW9uIEluZGV4IG1hc2sKKyAgVkVSU1lNX0hJRERFTiA9IDB4ODAwMCAgIC8vIEhpZGRlbiBiaXQgKG5vbi1kZWZhdWx0IHZlcnNpb24pCit9OworCisvLyBFbGZYWF9WZXJOZWVkIHN0cnVjdHVyZSB2ZXJzaW9uIChHTlUgdmVyc2lvbmluZykKK2VudW0geyBWRVJfTkVFRF9OT05FID0gMCwgVkVSX05FRURfQ1VSUkVOVCA9IDEgfTsKKworLy8gU0hUX05PVEUgc2VjdGlvbiB0eXBlcworZW51bSB7CisgIE5UX0ZSRUVCU0RfVEhSTUlTQyA9IDcsCisgIE5UX0ZSRUVCU0RfUFJPQ1NUQVRfUFJPQyA9IDgsCisgIE5UX0ZSRUVCU0RfUFJPQ1NUQVRfRklMRVMgPSA5LAorICBOVF9GUkVFQlNEX1BST0NTVEFUX1ZNTUFQID0gMTAsCisgIE5UX0ZSRUVCU0RfUFJPQ1NUQVRfR1JPVVBTID0gMTEsCisgIE5UX0ZSRUVCU0RfUFJPQ1NUQVRfVU1BU0sgPSAxMiwKKyAgTlRfRlJFRUJTRF9QUk9DU1RBVF9STElNSVQgPSAxMywKKyAgTlRfRlJFRUJTRF9QUk9DU1RBVF9PU1JFTCA9IDE0LAorICBOVF9GUkVFQlNEX1BST0NTVEFUX1BTU1RSSU5HUyA9IDE1LAorICBOVF9GUkVFQlNEX1BST0NTVEFUX0FVWFYgPSAxNiwKK307CisKK2VudW0geworICBOVF9HTlVfQUJJX1RBRyA9IDEsCisgIE5UX0dOVV9IV0NBUCA9IDIsCisgIE5UX0dOVV9CVUlMRF9JRCA9IDMsCisgIE5UX0dOVV9HT0xEX1ZFUlNJT04gPSA0LAorICBOVF9HTlVfUFJPUEVSVFlfVFlQRV8wID0gNSwKK307CisKKy8vIFByb3BlcnR5IHR5cGVzIHVzZWQgaW4gR05VX1BST1BFUlRZX1RZUEVfMCBub3Rlcy4KK2VudW0geworICBHTlVfUFJPUEVSVFlfU1RBQ0tfU0laRSA9IDEsCisgIEdOVV9QUk9QRVJUWV9OT19DT1BZX09OX1BST1RFQ1RFRCA9IDIsCit9OworCisvLyBBTURHUFUgc3BlY2lmaWMgbm90ZXMuCitlbnVtIHsKKyAgLy8gTm90ZSB0eXBlcyB3aXRoIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDkgKGluY2x1c2l2ZSkgYXJlIHJlc2VydmVkLgorICBOVF9BTURfQU1ER1BVX0hTQV9NRVRBREFUQSA9IDEwLAorICBOVF9BTURfQU1ER1BVX0lTQSA9IDExLAorICBOVF9BTURfQU1ER1BVX1BBTF9NRVRBREFUQSA9IDEyCit9OworCitlbnVtIHsKKyAgR05VX0FCSV9UQUdfTElOVVggPSAwLAorICBHTlVfQUJJX1RBR19IVVJEID0gMSwKKyAgR05VX0FCSV9UQUdfU09MQVJJUyA9IDIsCisgIEdOVV9BQklfVEFHX0ZSRUVCU0QgPSAzLAorICBHTlVfQUJJX1RBR19ORVRCU0QgPSA0LAorICBHTlVfQUJJX1RBR19TWUxMQUJMRSA9IDUsCisgIEdOVV9BQklfVEFHX05BQ0wgPSA2LAorfTsKKworLy8gQW5kcm9pZCBwYWNrZWQgcmVsb2NhdGlvbiBncm91cCBmbGFncy4KK2VudW0geworICBSRUxPQ0FUSU9OX0dST1VQRURfQllfSU5GT19GTEFHID0gMSwKKyAgUkVMT0NBVElPTl9HUk9VUEVEX0JZX09GRlNFVF9ERUxUQV9GTEFHID0gMiwKKyAgUkVMT0NBVElPTl9HUk9VUEVEX0JZX0FEREVORF9GTEFHID0gNCwKKyAgUkVMT0NBVElPTl9HUk9VUF9IQVNfQURERU5EX0ZMQUcgPSA4LAorfTsKKworLy8gQ29tcHJlc3NlZCBzZWN0aW9uIGhlYWRlciBmb3IgRUxGMzIuCitzdHJ1Y3QgRWxmMzJfQ2hkciB7CisgIEVsZjMyX1dvcmQgY2hfdHlwZTsKKyAgRWxmMzJfV29yZCBjaF9zaXplOworICBFbGYzMl9Xb3JkIGNoX2FkZHJhbGlnbjsKK307CisKKy8vIENvbXByZXNzZWQgc2VjdGlvbiBoZWFkZXIgZm9yIEVMRjY0Lgorc3RydWN0IEVsZjY0X0NoZHIgeworICBFbGY2NF9Xb3JkIGNoX3R5cGU7CisgIEVsZjY0X1dvcmQgY2hfcmVzZXJ2ZWQ7CisgIEVsZjY0X1h3b3JkIGNoX3NpemU7CisgIEVsZjY0X1h3b3JkIGNoX2FkZHJhbGlnbjsKK307CisKKy8vIE5vZGUgaGVhZGVyIGZvciBFTEYzMi4KK3N0cnVjdCBFbGYzMl9OaGRyIHsKKyAgRWxmMzJfV29yZCBuX25hbWVzejsKKyAgRWxmMzJfV29yZCBuX2Rlc2NzejsKKyAgRWxmMzJfV29yZCBuX3R5cGU7Cit9OworCisvLyBOb2RlIGhlYWRlciBmb3IgRUxGNjQuCitzdHJ1Y3QgRWxmNjRfTmhkciB7CisgIEVsZjY0X1dvcmQgbl9uYW1lc3o7CisgIEVsZjY0X1dvcmQgbl9kZXNjc3o7CisgIEVsZjY0X1dvcmQgbl90eXBlOworfTsKKworLy8gTGVnYWwgdmFsdWVzIGZvciBjaF90eXBlIGZpZWxkIG9mIGNvbXByZXNzZWQgc2VjdGlvbiBoZWFkZXIuCitlbnVtIHsKKyAgRUxGQ09NUFJFU1NfWkxJQiA9IDEsICAgICAgICAgICAgLy8gWkxJQi9ERUZMQVRFIGFsZ29yaXRobS4KKyAgRUxGQ09NUFJFU1NfTE9PUyA9IDB4NjAwMDAwMDAsICAgLy8gU3RhcnQgb2YgT1Mtc3BlY2lmaWMuCisgIEVMRkNPTVBSRVNTX0hJT1MgPSAweDZmZmZmZmZmLCAgIC8vIEVuZCBvZiBPUy1zcGVjaWZpYy4KKyAgRUxGQ09NUFJFU1NfTE9QUk9DID0gMHg3MDAwMDAwMCwgLy8gU3RhcnQgb2YgcHJvY2Vzc29yLXNwZWNpZmljLgorICBFTEZDT01QUkVTU19ISVBST0MgPSAweDdmZmZmZmZmICAvLyBFbmQgb2YgcHJvY2Vzc29yLXNwZWNpZmljLgorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVMRgorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQklOQVJZRk9STUFUX0VMRl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvQUFyY2g2NC5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvQUFyY2g2NC5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmY2Q3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9BQXJjaDY0LmRlZgpAQCAtMCwwICsxLDIxOCBAQAorCisjaWZuZGVmIEVMRl9SRUxPQworI2Vycm9yICJFTEZfUkVMT0MgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKKy8vIEJhc2VkIG9uIEFCSSByZWxlYXNlIDEuMS1iZXRhLCBkYXRlZCA2IE5vdmVtYmVyIDIwMTMuIE5COiBUaGUgY292ZXIgcGFnZSBvZgorLy8gdGhpcyBkb2N1bWVudCwgSUhJMDA1NkNfYmV0YV9hYWVsZjY0LnBkZiwgb24gaW5mb2NlbnRlci5hcm0uY29tLCBzdGlsbAorLy8gbGFiZWxzIHRoaXMgYXMgcmVsZWFzZSAxLjAuCitFTEZfUkVMT0MoUl9BQVJDSDY0X05PTkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9BQlM2NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfQUJTMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X0FCUzE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAzKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QUkVMNjQsICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwNCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUFJFTDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDUpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1BSRUwxNiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTA2KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9NT1ZXX1VBQlNfRzAsICAgICAgICAgICAgICAgICAgICAweDEwNykKK0VMRl9SRUxPQyhSX0FBUkNINjRfTU9WV19VQUJTX0cwX05DLCAgICAgICAgICAgICAgICAgMHgxMDgpCitFTEZfUkVMT0MoUl9BQVJDSDY0X01PVldfVUFCU19HMSwgICAgICAgICAgICAgICAgICAgIDB4MTA5KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9NT1ZXX1VBQlNfRzFfTkMsICAgICAgICAgICAgICAgICAweDEwYSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfTU9WV19VQUJTX0cyLCAgICAgICAgICAgICAgICAgICAgMHgxMGIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X01PVldfVUFCU19HMl9OQywgICAgICAgICAgICAgICAgIDB4MTBjKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9NT1ZXX1VBQlNfRzMsICAgICAgICAgICAgICAgICAgICAweDEwZCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfTU9WV19TQUJTX0cwLCAgICAgICAgICAgICAgICAgICAgMHgxMGUpCitFTEZfUkVMT0MoUl9BQVJDSDY0X01PVldfU0FCU19HMSwgICAgICAgICAgICAgICAgICAgIDB4MTBmKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9NT1ZXX1NBQlNfRzIsICAgICAgICAgICAgICAgICAgICAweDExMCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfTERfUFJFTF9MTzE5LCAgICAgICAgICAgICAgICAgICAgMHgxMTEpCitFTEZfUkVMT0MoUl9BQVJDSDY0X0FEUl9QUkVMX0xPMjEsICAgICAgICAgICAgICAgICAgIDB4MTEyKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9BRFJfUFJFTF9QR19ISTIxLCAgICAgICAgICAgICAgICAweDExMykKK0VMRl9SRUxPQyhSX0FBUkNINjRfQURSX1BSRUxfUEdfSEkyMV9OQywgICAgICAgICAgICAgMHgxMTQpCitFTEZfUkVMT0MoUl9BQVJDSDY0X0FERF9BQlNfTE8xMl9OQywgICAgICAgICAgICAgICAgIDB4MTE1KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9MRFNUOF9BQlNfTE8xMl9OQywgICAgICAgICAgICAgICAweDExNikKK0VMRl9SRUxPQyhSX0FBUkNINjRfVFNUQlIxNCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTcpCitFTEZfUkVMT0MoUl9BQVJDSDY0X0NPTkRCUjE5LCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTE4KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9KVU1QMjYsICAgICAgICAgICAgICAgICAgICAgICAgICAweDExYSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfQ0FMTDI2LCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMWIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X0xEU1QxNl9BQlNfTE8xMl9OQywgICAgICAgICAgICAgIDB4MTFjKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9MRFNUMzJfQUJTX0xPMTJfTkMsICAgICAgICAgICAgICAweDExZCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfTERTVDY0X0FCU19MTzEyX05DLCAgICAgICAgICAgICAgMHgxMWUpCitFTEZfUkVMT0MoUl9BQVJDSDY0X01PVldfUFJFTF9HMCwgICAgICAgICAgICAgICAgICAgIDB4MTFmKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9NT1ZXX1BSRUxfRzBfTkMsICAgICAgICAgICAgICAgICAweDEyMCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfTU9WV19QUkVMX0cxLCAgICAgICAgICAgICAgICAgICAgMHgxMjEpCitFTEZfUkVMT0MoUl9BQVJDSDY0X01PVldfUFJFTF9HMV9OQywgICAgICAgICAgICAgICAgIDB4MTIyKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9NT1ZXX1BSRUxfRzIsICAgICAgICAgICAgICAgICAgICAweDEyMykKK0VMRl9SRUxPQyhSX0FBUkNINjRfTU9WV19QUkVMX0cyX05DLCAgICAgICAgICAgICAgICAgMHgxMjQpCitFTEZfUkVMT0MoUl9BQVJDSDY0X01PVldfUFJFTF9HMywgICAgICAgICAgICAgICAgICAgIDB4MTI1KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9MRFNUMTI4X0FCU19MTzEyX05DLCAgICAgICAgICAgICAweDEyYikKK0VMRl9SRUxPQyhSX0FBUkNINjRfTU9WV19HT1RPRkZfRzAsICAgICAgICAgICAgICAgICAgMHgxMmMpCitFTEZfUkVMT0MoUl9BQVJDSDY0X01PVldfR09UT0ZGX0cwX05DLCAgICAgICAgICAgICAgIDB4MTJkKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9NT1ZXX0dPVE9GRl9HMSwgICAgICAgICAgICAgICAgICAweDEyZSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfTU9WV19HT1RPRkZfRzFfTkMsICAgICAgICAgICAgICAgMHgxMmYpCitFTEZfUkVMT0MoUl9BQVJDSDY0X01PVldfR09UT0ZGX0cyLCAgICAgICAgICAgICAgICAgIDB4MTMwKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9NT1ZXX0dPVE9GRl9HMl9OQywgICAgICAgICAgICAgICAweDEzMSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfTU9WV19HT1RPRkZfRzMsICAgICAgICAgICAgICAgICAgMHgxMzIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X0dPVFJFTDY0LCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTMzKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9HT1RSRUwzMiwgICAgICAgICAgICAgICAgICAgICAgICAweDEzNCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfR09UX0xEX1BSRUwxOSwgICAgICAgICAgICAgICAgICAgMHgxMzUpCitFTEZfUkVMT0MoUl9BQVJDSDY0X0xENjRfR09UT0ZGX0xPMTUsICAgICAgICAgICAgICAgIDB4MTM2KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9BRFJfR09UX1BBR0UsICAgICAgICAgICAgICAgICAgICAweDEzNykKK0VMRl9SRUxPQyhSX0FBUkNINjRfTEQ2NF9HT1RfTE8xMl9OQywgICAgICAgICAgICAgICAgMHgxMzgpCitFTEZfUkVMT0MoUl9BQVJDSDY0X0xENjRfR09UUEFHRV9MTzE1LCAgICAgICAgICAgICAgIDB4MTM5KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNHRF9BRFJfUFJFTDIxLCAgICAgICAgICAgICAgICAweDIwMCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTR0RfQURSX1BBR0UyMSwgICAgICAgICAgICAgICAgMHgyMDEpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0dEX0FERF9MTzEyX05DLCAgICAgICAgICAgICAgIDB4MjAyKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNHRF9NT1ZXX0cxLCAgICAgICAgICAgICAgICAgICAweDIwMykKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTR0RfTU9WV19HMF9OQywgICAgICAgICAgICAgICAgMHgyMDQpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xEX0FEUl9QUkVMMjEsICAgICAgICAgICAgICAgIDB4MjA1KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRF9BRFJfUEFHRTIxLCAgICAgICAgICAgICAgICAweDIwNikKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTERfQUREX0xPMTJfTkMsICAgICAgICAgICAgICAgMHgyMDcpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xEX01PVldfRzEsICAgICAgICAgICAgICAgICAgIDB4MjA4KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRF9NT1ZXX0cwX05DLCAgICAgICAgICAgICAgICAweDIwOSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTERfTERfUFJFTDE5LCAgICAgICAgICAgICAgICAgMHgyMGEpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xEX01PVldfRFRQUkVMX0cyLCAgICAgICAgICAgIDB4MjBiKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRF9NT1ZXX0RUUFJFTF9HMSwgICAgICAgICAgICAweDIwYykKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTERfTU9WV19EVFBSRUxfRzFfTkMsICAgICAgICAgMHgyMGQpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xEX01PVldfRFRQUkVMX0cwLCAgICAgICAgICAgIDB4MjBlKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRF9NT1ZXX0RUUFJFTF9HMF9OQywgICAgICAgICAweDIwZikKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTERfQUREX0RUUFJFTF9ISTEyLCAgICAgICAgICAgMHgyMTApCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xEX0FERF9EVFBSRUxfTE8xMiwgICAgICAgICAgIDB4MjExKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRF9BRERfRFRQUkVMX0xPMTJfTkMsICAgICAgICAweDIxMikKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTERfTERTVDhfRFRQUkVMX0xPMTIsICAgICAgICAgMHgyMTMpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xEX0xEU1Q4X0RUUFJFTF9MTzEyX05DLCAgICAgIDB4MjE0KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRF9MRFNUMTZfRFRQUkVMX0xPMTIsICAgICAgICAweDIxNSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTERfTERTVDE2X0RUUFJFTF9MTzEyX05DLCAgICAgMHgyMTYpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xEX0xEU1QzMl9EVFBSRUxfTE8xMiwgICAgICAgIDB4MjE3KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRF9MRFNUMzJfRFRQUkVMX0xPMTJfTkMsICAgICAweDIxOCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTERfTERTVDY0X0RUUFJFTF9MTzEyLCAgICAgICAgMHgyMTkpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xEX0xEU1Q2NF9EVFBSRUxfTE8xMl9OQywgICAgIDB4MjFhKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNJRV9NT1ZXX0dPVFRQUkVMX0cxLCAgICAgICAgICAweDIxYikKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTSUVfTU9WV19HT1RUUFJFTF9HMF9OQywgICAgICAgMHgyMWMpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0lFX0FEUl9HT1RUUFJFTF9QQUdFMjEsICAgICAgIDB4MjFkKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNJRV9MRDY0X0dPVFRQUkVMX0xPMTJfTkMsICAgICAweDIxZSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTSUVfTERfR09UVFBSRUxfUFJFTDE5LCAgICAgICAgMHgyMWYpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xFX01PVldfVFBSRUxfRzIsICAgICAgICAgICAgIDB4MjIwKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRV9NT1ZXX1RQUkVMX0cxLCAgICAgICAgICAgICAweDIyMSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTEVfTU9WV19UUFJFTF9HMV9OQywgICAgICAgICAgMHgyMjIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xFX01PVldfVFBSRUxfRzAsICAgICAgICAgICAgIDB4MjIzKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRV9NT1ZXX1RQUkVMX0cwX05DLCAgICAgICAgICAweDIyNCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTEVfQUREX1RQUkVMX0hJMTIsICAgICAgICAgICAgMHgyMjUpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xFX0FERF9UUFJFTF9MTzEyLCAgICAgICAgICAgIDB4MjI2KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRV9BRERfVFBSRUxfTE8xMl9OQywgICAgICAgICAweDIyNykKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTEVfTERTVDhfVFBSRUxfTE8xMiwgICAgICAgICAgMHgyMjgpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xFX0xEU1Q4X1RQUkVMX0xPMTJfTkMsICAgICAgIDB4MjI5KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRV9MRFNUMTZfVFBSRUxfTE8xMiwgICAgICAgICAweDIyYSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTEVfTERTVDE2X1RQUkVMX0xPMTJfTkMsICAgICAgMHgyMmIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xFX0xEU1QzMl9UUFJFTF9MTzEyLCAgICAgICAgIDB4MjJjKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRV9MRFNUMzJfVFBSRUxfTE8xMl9OQywgICAgICAweDIyZCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTEVfTERTVDY0X1RQUkVMX0xPMTIsICAgICAgICAgMHgyMmUpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xFX0xEU1Q2NF9UUFJFTF9MTzEyX05DLCAgICAgIDB4MjJmKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNERVNDX0xEX1BSRUwxOSwgICAgICAgICAgICAgICAweDIzMCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTREVTQ19BRFJfUFJFTDIxLCAgICAgICAgICAgICAgMHgyMzEpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0RFU0NfQURSX1BBR0UyMSwgICAgICAgICAgICAgIDB4MjMyKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNERVNDX0xENjRfTE8xMiwgICAgICAgICAgICAgICAweDIzMykKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTREVTQ19BRERfTE8xMiwgICAgICAgICAgICAgICAgMHgyMzQpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0RFU0NfT0ZGX0cxLCAgICAgICAgICAgICAgICAgIDB4MjM1KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNERVNDX09GRl9HMF9OQywgICAgICAgICAgICAgICAweDIzNikKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTREVTQ19MRFIsICAgICAgICAgICAgICAgICAgICAgMHgyMzcpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0RFU0NfQURELCAgICAgICAgICAgICAgICAgICAgIDB4MjM4KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNERVNDX0NBTEwsICAgICAgICAgICAgICAgICAgICAweDIzOSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTEVfTERTVDEyOF9UUFJFTF9MTzEyLCAgICAgICAgMHgyM2EpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xFX0xEU1QxMjhfVFBSRUxfTE8xMl9OQywgICAgIDB4MjNiKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRF9MRFNUMTI4X0RUUFJFTF9MTzEyLCAgICAgICAweDIzYykKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTERfTERTVDEyOF9EVFBSRUxfTE8xMl9OQywgICAgMHgyM2QpCitFTEZfUkVMT0MoUl9BQVJDSDY0X0NPUFksICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9HTE9CX0RBVCwgICAgICAgICAgICAgICAgICAgICAgICAweDQwMSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfSlVNUF9TTE9ULCAgICAgICAgICAgICAgICAgICAgICAgMHg0MDIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1JFTEFUSVZFLCAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAzKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNfRFRQUkVMNjQsICAgICAgICAgICAgICAgICAgICAweDQwNCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTX0RUUE1PRDY0LCAgICAgICAgICAgICAgICAgICAgMHg0MDUpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU19UUFJFTDY0LCAgICAgICAgICAgICAgICAgICAgIDB4NDA2KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNERVNDLCAgICAgICAgICAgICAgICAgICAgICAgICAweDQwNykKK0VMRl9SRUxPQyhSX0FBUkNINjRfSVJFTEFUSVZFLCAgICAgICAgICAgICAgICAgICAgICAgMHg0MDgpCisKKy8vIEVMRl9SRUxPQyhSX0FBUkNINjRfUDMyX05PTkUsICAgICAgICAgICAgICAgICAgICAgICAgIDApCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9BQlMzMiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfQUJTMTYsICAgICAgICAgICAgICAgICAgICAgICAweDAwMikKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1BSRUwzMiwgICAgICAgICAgICAgICAgICAgICAgMHgwMDMpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9QUkVMMTYsICAgICAgICAgICAgICAgICAgICAgIDB4MDA0KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfTU9WV19VQUJTX0cwLCAgICAgICAgICAgICAgICAweDAwNSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX01PVldfVUFCU19HMF9OQywgICAgICAgICAgICAgMHgwMDYpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9NT1ZXX1VBQlNfRzEsICAgICAgICAgICAgICAgIDB4MDA3KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfTU9WV19TQUJTX0cwLCAgICAgICAgICAgICAgICAweDAwOCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX0xEX1BSRUxfTE8xOSwgICAgICAgICAgICAgICAgMHgwMDkpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9BRFJfUFJFTF9MTzIxLCAgICAgICAgICAgICAgIDB4MDBhKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfQURSX1BSRUxfUEdfSEkyMSwgICAgICAgICAgICAweDAwYikKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX0FERF9BQlNfTE8xMl9OQywgICAgICAgICAgICAgMHgwMGMpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9MRFNUOF9BQlNfTE8xMl9OQywgICAgICAgICAgIDB4MDBkKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfTERTVDE2X0FCU19MTzEyX05DLCAgICAgICAgICAweDAwZSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX0xEU1QzMl9BQlNfTE8xMl9OQywgICAgICAgICAgMHgwMGYpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9MRFNUNjRfQUJTX0xPMTJfTkMsICAgICAgICAgIDB4MDEwKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfTERTVDEyOF9BQlNfTE8xMl9OQywgICAgICAgICAweDAxMSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RTVEJSMTQsICAgICAgICAgICAgICAgICAgICAgMHgwMTIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9DT05EQlIxOSwgICAgICAgICAgICAgICAgICAgIDB4MDEzKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfSlVNUDI2LCAgICAgICAgICAgICAgICAgICAgICAweDAxNCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX0NBTEwyNiwgICAgICAgICAgICAgICAgICAgICAgMHgwMTUpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9NT1ZXX1BSRUxfRzAsICAgICAgICAgICAgICAgIDB4MDE2KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfTU9WV19QUkVMX0cwX05DLCAgICAgICAgICAgICAweDAxNykKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX01PVldfUFJFTF9HMSwgICAgICAgICAgICAgICAgMHgwMTgpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9HT1RfTERfUFJFTDE5LCAgICAgICAgICAgICAgIDB4MDE5KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfQURSX0dPVF9QQUdFLCAgICAgICAgICAgICAgICAweDAxYSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX0xEMzJfR09UX0xPMTJfTkMsICAgICAgICAgICAgMHgwMWIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9MRDMyX0dPVFBBR0VfTE8xNCwgICAgICAgICAgIDB4MDFjKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTR0RfQURSX1BSRUwyMSwgICAgICAgICAgICAweDA1MCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0dEX0FEUl9QQUdFMjEsICAgICAgICAgICAgMHgwNTEpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNHRF9BRERfTE8xMl9OQywgICAgICAgICAgIDB4MDUyKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTERfQURSX1BSRUwyMSwgICAgICAgICAgICAweDA1MykKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xEX0FEUl9QQUdFMjEsICAgICAgICAgICAgMHgwNTQpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRF9BRERfTE8xMl9OQywgICAgICAgICAgIDB4MDU1KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTERfTERfUFJFTDE5LCAgICAgICAgICAgICAweDA1NikKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xEX01PVldfRFRQUkVMX0cxLCAgICAgICAgMHgwNTcpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRF9NT1ZXX0RUUFJFTF9HMCwgICAgICAgIDB4MDU4KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTERfTU9WV19EVFBSRUxfRzBfTkMsICAgICAweDA1OSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xEX0FERF9EVFBSRUxfSEkxMiwgICAgICAgMHgwNWEpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRF9BRERfRFRQUkVMX0xPMTIsICAgICAgIDB4MDViKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTERfQUREX0RUUFJFTF9MTzEyX05DLCAgICAweDA1YykKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xEX0xEU1Q4X0RUUFJFTF9MTzEyLCAgICAgMHgwNWQpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRF9MRFNUOF9EVFBSRUxfTE8xMl9OQywgIDB4MDVlKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTERfTERTVDE2X0RUUFJFTF9MTzEyLCAgICAweDA1ZikKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xEX0xEU1QxNl9EVFBSRUxfTE8xMl9OQywgMHgwNjApCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRF9MRFNUMzJfRFRQUkVMX0xPMTIsICAgIDB4MDYxKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTERfTERTVDMyX0RUUFJFTF9MTzEyX05DLCAweDA2MikKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xEX0xEU1Q2NF9EVFBSRUxfTE8xMiwgICAgMHgwNjMpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRF9MRFNUNjRfRFRQUkVMX0xPMTJfTkMsIDB4MDY0KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTERfTERTVDEyOF9EVFBSRUxfTE8xMiwgICAweDA2NSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xEX0xEU1QxMjhfRFRQUkVMX0xPMTJfTkMsMHgwNjYpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNJRV9BRFJfR09UVFBSRUxfUEFHRTIxLCAgIDB4MDY3KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTSUVfTEQzMl9HT1RUUFJFTF9MTzEyX05DLCAweDA2OCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0lFX0xEX0dPVFRQUkVMX1BSRUwxOSwgICAgMHgwNjkpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRV9NT1ZXX1RQUkVMX0cxLCAgICAgICAgIDB4MDZhKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTEVfTU9WV19UUFJFTF9HMCwgICAgICAgICAweDA2YikKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xFX01PVldfVFBSRUxfRzBfTkMsICAgICAgMHgwNmMpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRV9BRERfVFBSRUxfSEkxMiwgICAgICAgIDB4MDZkKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTEVfQUREX1RQUkVMX0xPMTIsICAgICAgICAweDA2ZSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xFX0FERF9UUFJFTF9MTzEyX05DLCAgICAgMHgwNmYpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRV9MRFNUOF9UUFJFTF9MTzEyLCAgICAgIDB4MDcwKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTEVfTERTVDhfVFBSRUxfTE8xMl9OQywgICAweDA3MSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xFX0xEU1QxNl9UUFJFTF9MTzEyLCAgICAgMHgwNzIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRV9MRFNUMTZfVFBSRUxfTE8xMl9OQywgIDB4MDczKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTEVfTERTVDMyX1RQUkVMX0xPMTIsICAgICAweDA3NCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xFX0xEU1QzMl9UUFJFTF9MTzEyX05DLCAgMHgwNzUpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRV9MRFNUNjRfVFBSRUxfTE8xMiwgICAgIDB4MDc2KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTEVfTERTVDY0X1RQUkVMX0xPMTJfTkMsICAweDA3NykKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xFX0xEU1QxMjhfVFBSRUxfTE8xMiwgICAgMHgwNzgpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRV9MRFNUMTI4X1RQUkVMX0xPMTJfTkMsIDB4MDc5KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTREVTQ19MRF9QUkVMMTksICAgICAgICAgICAweDA3YSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0RFU0NfQURSX1BSRUwyMSwgICAgICAgICAgMHgwN2IpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNERVNDX0FEUl9QQUdFMjEsICAgICAgICAgIDB4MDdjKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTREVTQ19MRDMyX0xPMTIsICAgICAgICAgICAweDA3ZCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0RFU0NfQUREX0xPMTIsICAgICAgICAgICAgMHgwN2UpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNERVNDX0NBTEwsICAgICAgICAgICAgICAgIDB4MDdmKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfQ09QWSwgICAgICAgICAgICAgICAgICAgICAgICAweDBiNCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX0dMT0JfREFULCAgICAgICAgICAgICAgICAgICAgMHgwYjUpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9KVU1QX1NMT1QsICAgICAgICAgICAgICAgICAgIDB4MGI2KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfUkVMQVRJVkUsICAgICAgICAgICAgICAgICAgICAweDBiNykKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU19EVFBSRUwsICAgICAgICAgICAgICAgICAgMHgwYjgpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNfRFRQTU9ELCAgICAgICAgICAgICAgICAgIDB4MGI5KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTX1RQUkVMLCAgICAgICAgICAgICAgICAgICAweDBiYSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0RFU0MsICAgICAgICAgICAgICAgICAgICAgMHgwYmIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9JUkVMQVRJVkUsICAgICAgICAgICAgICAgICAgIDB4MGJjKQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL0FNREdQVS5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvQU1ER1BVLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGIxOWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL0FNREdQVS5kZWYKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBFTEZfUkVMT0MKKyNlcnJvciAiRUxGX1JFTE9DIG11c3QgYmUgZGVmaW5lZCIKKyNlbmRpZgorCitFTEZfUkVMT0MoUl9BTURHUFVfTk9ORSwgICAgICAgICAgIDApCitFTEZfUkVMT0MoUl9BTURHUFVfQUJTMzJfTE8sICAgICAgIDEpCitFTEZfUkVMT0MoUl9BTURHUFVfQUJTMzJfSEksICAgICAgIDIpCitFTEZfUkVMT0MoUl9BTURHUFVfQUJTNjQsICAgICAgICAgIDMpCitFTEZfUkVMT0MoUl9BTURHUFVfUkVMMzIsICAgICAgICAgIDQpCitFTEZfUkVMT0MoUl9BTURHUFVfUkVMNjQsICAgICAgICAgIDUpCitFTEZfUkVMT0MoUl9BTURHUFVfQUJTMzIsICAgICAgICAgIDYpCitFTEZfUkVMT0MoUl9BTURHUFVfR09UUENSRUwsICAgICAgIDcpCitFTEZfUkVMT0MoUl9BTURHUFVfR09UUENSRUwzMl9MTywgIDgpCitFTEZfUkVMT0MoUl9BTURHUFVfR09UUENSRUwzMl9ISSwgIDkpCitFTEZfUkVMT0MoUl9BTURHUFVfUkVMMzJfTE8sICAgICAgMTApCitFTEZfUkVMT0MoUl9BTURHUFVfUkVMMzJfSEksICAgICAgMTEpCitFTEZfUkVMT0MoUl9BTURHUFVfUkVMQVRJVkU2NCwgICAgMTMpCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvQVJDLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9BUkMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OTFmYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvQVJDLmRlZgpAQCAtMCwwICsxLDc0IEBACisKKyNpZm5kZWYgRUxGX1JFTE9DCisjZXJyb3IgIkVMRl9SRUxPQyBtdXN0IGJlIGRlZmluZWQiCisjZW5kaWYKKworRUxGX1JFTE9DKFJfQVJDX05PTkUsICAgICAgICAgICAgICAgICAgMCkKK0VMRl9SRUxPQyhSX0FSQ184LCAgICAgICAgICAgICAgICAgICAgIDEpCitFTEZfUkVMT0MoUl9BUkNfMTYsICAgICAgICAgICAgICAgICAgICAyKQorRUxGX1JFTE9DKFJfQVJDXzI0LCAgICAgICAgICAgICAgICAgICAgMykKK0VMRl9SRUxPQyhSX0FSQ18zMiwgICAgICAgICAgICAgICAgICAgIDQpCitFTEZfUkVMT0MoUl9BUkNfTjgsICAgICAgICAgICAgICAgICAgICA4KQorRUxGX1JFTE9DKFJfQVJDX04xNiwgICAgICAgICAgICAgICAgICAgOSkKK0VMRl9SRUxPQyhSX0FSQ19OMjQsICAgICAgICAgICAgICAgICAgMTApCitFTEZfUkVMT0MoUl9BUkNfTjMyLCAgICAgICAgICAgICAgICAgIDExKQorRUxGX1JFTE9DKFJfQVJDX1NEQSwgICAgICAgICAgICAgICAgICAxMikKK0VMRl9SRUxPQyhSX0FSQ19TRUNUT0ZGLCAgICAgICAgICAgICAgMTMpCitFTEZfUkVMT0MoUl9BUkNfUzIxSF9QQ1JFTCwgICAgICAgICAgIDE0KQorRUxGX1JFTE9DKFJfQVJDX1MyMVdfUENSRUwsICAgICAgICAgICAxNSkKK0VMRl9SRUxPQyhSX0FSQ19TMjVIX1BDUkVMLCAgICAgICAgICAgMTYpCitFTEZfUkVMT0MoUl9BUkNfUzI1V19QQ1JFTCwgICAgICAgICAgIDE3KQorRUxGX1JFTE9DKFJfQVJDX1NEQTMyLCAgICAgICAgICAgICAgICAxOCkKK0VMRl9SRUxPQyhSX0FSQ19TREFfTERTVCwgICAgICAgICAgICAgMTkpCitFTEZfUkVMT0MoUl9BUkNfU0RBX0xEU1QxLCAgICAgICAgICAgIDIwKQorRUxGX1JFTE9DKFJfQVJDX1NEQV9MRFNUMiwgICAgICAgICAgICAyMSkKK0VMRl9SRUxPQyhSX0FSQ19TREExNl9MRCwgICAgICAgICAgICAgMjIpCitFTEZfUkVMT0MoUl9BUkNfU0RBMTZfTEQxLCAgICAgICAgICAgIDIzKQorRUxGX1JFTE9DKFJfQVJDX1NEQTE2X0xEMiwgICAgICAgICAgICAyNCkKK0VMRl9SRUxPQyhSX0FSQ19TMTNfUENSRUwsICAgICAgICAgICAgMjUpCitFTEZfUkVMT0MoUl9BUkNfVywgICAgICAgICAgICAgICAgICAgIDI2KQorRUxGX1JFTE9DKFJfQVJDXzMyX01FLCAgICAgICAgICAgICAgICAyNykKK0VMRl9SRUxPQyhSX0FSQ18zMl9NRV9TLCAgICAgICAgICAgICAxMDUpCitFTEZfUkVMT0MoUl9BUkNfTjMyX01FLCAgICAgICAgICAgICAgIDI4KQorRUxGX1JFTE9DKFJfQVJDX1NFQ1RPRkZfTUUsICAgICAgICAgICAyOSkKK0VMRl9SRUxPQyhSX0FSQ19TREEzMl9NRSwgICAgICAgICAgICAgMzApCitFTEZfUkVMT0MoUl9BUkNfV19NRSwgICAgICAgICAgICAgICAgIDMxKQorRUxGX1JFTE9DKFJfQUNfU0VDVE9GRl9VOCwgICAgICAgICAgICAzNSkKK0VMRl9SRUxPQyhSX0FDX1NFQ1RPRkZfVThfMSwgICAgICAgICAgMzYpCitFTEZfUkVMT0MoUl9BQ19TRUNUT0ZGX1U4XzIsICAgICAgICAgIDM3KQorRUxGX1JFTE9DKFJfQUNfU0VDVE9GRl9TOSwgICAgICAgICAgICAzOCkKK0VMRl9SRUxPQyhSX0FDX1NFQ1RPRkZfUzlfMSwgICAgICAgICAgMzkpCitFTEZfUkVMT0MoUl9BQ19TRUNUT0ZGX1M5XzIsICAgICAgICAgIDQwKQorRUxGX1JFTE9DKFJfQVJDX1NFQ1RPRkZfTUVfMSwgICAgICAgICA0MSkKK0VMRl9SRUxPQyhSX0FSQ19TRUNUT0ZGX01FXzIsICAgICAgICAgNDIpCitFTEZfUkVMT0MoUl9BUkNfU0VDVE9GRl8xLCAgICAgICAgICAgIDQzKQorRUxGX1JFTE9DKFJfQVJDX1NFQ1RPRkZfMiwgICAgICAgICAgICA0NCkKK0VMRl9SRUxPQyhSX0FSQ19TREFfMTIsICAgICAgICAgICAgICAgNDUpCitFTEZfUkVMT0MoUl9BUkNfU0RBMTZfU1QyLCAgICAgICAgICAgIDQ4KQorRUxGX1JFTE9DKFJfQVJDXzMyX1BDUkVMLCAgICAgICAgICAgICA0OSkKK0VMRl9SRUxPQyhSX0FSQ19QQzMyLCAgICAgICAgICAgICAgICAgNTApCitFTEZfUkVMT0MoUl9BUkNfR09UMzIsICAgICAgICAgICAgICAgIDU5KQorRUxGX1JFTE9DKFJfQVJDX0dPVFBDMzIsICAgICAgICAgICAgICA1MSkKK0VMRl9SRUxPQyhSX0FSQ19QTFQzMiwgICAgICAgICAgICAgICAgNTIpCitFTEZfUkVMT0MoUl9BUkNfQ09QWSwgICAgICAgICAgICAgICAgIDUzKQorRUxGX1JFTE9DKFJfQVJDX0dMT0JfREFULCAgICAgICAgICAgICA1NCkKK0VMRl9SRUxPQyhSX0FSQ19KTVBfU0xPVCwgICAgICAgICAgICAgNTUpCitFTEZfUkVMT0MoUl9BUkNfUkVMQVRJVkUsICAgICAgICAgICAgIDU2KQorRUxGX1JFTE9DKFJfQVJDX0dPVE9GRiwgICAgICAgICAgICAgICA1NykKK0VMRl9SRUxPQyhSX0FSQ19HT1RQQywgICAgICAgICAgICAgICAgNTgpCitFTEZfUkVMT0MoUl9BUkNfUzIxV19QQ1JFTF9QTFQsICAgICAgIDYwKQorRUxGX1JFTE9DKFJfQVJDX1MyNUhfUENSRUxfUExULCAgICAgICA2MSkKK0VMRl9SRUxPQyhSX0FSQ19KTElfU0VDVE9GRiwgICAgICAgICAgNjMpCitFTEZfUkVMT0MoUl9BUkNfVExTX0RUUE1PRCwgICAgICAgICAgIDY2KQorRUxGX1JFTE9DKFJfQVJDX1RMU19UUE9GRiwgICAgICAgICAgICA2OCkKK0VMRl9SRUxPQyhSX0FSQ19UTFNfR0RfR09ULCAgICAgICAgICAgNjkpCitFTEZfUkVMT0MoUl9BUkNfVExTX0dEX0xELCAgICAgICAgICAgIDcwKQorRUxGX1JFTE9DKFJfQVJDX1RMU19HRF9DQUxMLCAgICAgICAgICA3MSkKK0VMRl9SRUxPQyhSX0FSQ19UTFNfSUVfR09ULCAgICAgICAgICAgNzIpCitFTEZfUkVMT0MoUl9BUkNfVExTX0RUUE9GRiwgICAgICAgICAgIDY3KQorRUxGX1JFTE9DKFJfQVJDX1RMU19EVFBPRkZfUzksICAgICAgICA3MykKK0VMRl9SRUxPQyhSX0FSQ19UTFNfTEVfUzksICAgICAgICAgICAgNzQpCitFTEZfUkVMT0MoUl9BUkNfVExTX0xFXzMyLCAgICAgICAgICAgIDc1KQorRUxGX1JFTE9DKFJfQVJDX1MyNVdfUENSRUxfUExULCAgICAgICA3NikKK0VMRl9SRUxPQyhSX0FSQ19TMjFIX1BDUkVMX1BMVCwgICAgICAgNzcpCitFTEZfUkVMT0MoUl9BUkNfTlBTX0NNRU0xNiwgICAgICAgICAgIDc4KQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL0FSTS5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvQVJNLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzBmYzViCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL0FSTS5kZWYKQEAgLTAsMCArMSwxMzggQEAKKworI2lmbmRlZiBFTEZfUkVMT0MKKyNlcnJvciAiRUxGX1JFTE9DIG11c3QgYmUgZGVmaW5lZCIKKyNlbmRpZgorCisvLyBNZWV0cyAyLjA5IEFCSSBTcGVjcy4KK0VMRl9SRUxPQyhSX0FSTV9OT05FLCAgICAgICAgICAgICAgICAgICAweDAwKQorRUxGX1JFTE9DKFJfQVJNX1BDMjQsICAgICAgICAgICAgICAgICAgIDB4MDEpCitFTEZfUkVMT0MoUl9BUk1fQUJTMzIsICAgICAgICAgICAgICAgICAgMHgwMikKK0VMRl9SRUxPQyhSX0FSTV9SRUwzMiwgICAgICAgICAgICAgICAgICAweDAzKQorRUxGX1JFTE9DKFJfQVJNX0xEUl9QQ19HMCwgICAgICAgICAgICAgIDB4MDQpCitFTEZfUkVMT0MoUl9BUk1fQUJTMTYsICAgICAgICAgICAgICAgICAgMHgwNSkKK0VMRl9SRUxPQyhSX0FSTV9BQlMxMiwgICAgICAgICAgICAgICAgICAweDA2KQorRUxGX1JFTE9DKFJfQVJNX1RITV9BQlM1LCAgICAgICAgICAgICAgIDB4MDcpCitFTEZfUkVMT0MoUl9BUk1fQUJTOCwgICAgICAgICAgICAgICAgICAgMHgwOCkKK0VMRl9SRUxPQyhSX0FSTV9TQlJFTDMyLCAgICAgICAgICAgICAgICAweDA5KQorRUxGX1JFTE9DKFJfQVJNX1RITV9DQUxMLCAgICAgICAgICAgICAgIDB4MGEpCitFTEZfUkVMT0MoUl9BUk1fVEhNX1BDOCwgICAgICAgICAgICAgICAgMHgwYikKK0VMRl9SRUxPQyhSX0FSTV9CUkVMX0FESiwgICAgICAgICAgICAgICAweDBjKQorRUxGX1JFTE9DKFJfQVJNX1RMU19ERVNDLCAgICAgICAgICAgICAgIDB4MGQpCitFTEZfUkVMT0MoUl9BUk1fVEhNX1NXSTgsICAgICAgICAgICAgICAgMHgwZSkKK0VMRl9SRUxPQyhSX0FSTV9YUEMyNSwgICAgICAgICAgICAgICAgICAweDBmKQorRUxGX1JFTE9DKFJfQVJNX1RITV9YUEMyMiwgICAgICAgICAgICAgIDB4MTApCitFTEZfUkVMT0MoUl9BUk1fVExTX0RUUE1PRDMyLCAgICAgICAgICAgMHgxMSkKK0VMRl9SRUxPQyhSX0FSTV9UTFNfRFRQT0ZGMzIsICAgICAgICAgICAweDEyKQorRUxGX1JFTE9DKFJfQVJNX1RMU19UUE9GRjMyLCAgICAgICAgICAgIDB4MTMpCitFTEZfUkVMT0MoUl9BUk1fQ09QWSwgICAgICAgICAgICAgICAgICAgMHgxNCkKK0VMRl9SRUxPQyhSX0FSTV9HTE9CX0RBVCwgICAgICAgICAgICAgICAweDE1KQorRUxGX1JFTE9DKFJfQVJNX0pVTVBfU0xPVCwgICAgICAgICAgICAgIDB4MTYpCitFTEZfUkVMT0MoUl9BUk1fUkVMQVRJVkUsICAgICAgICAgICAgICAgMHgxNykKK0VMRl9SRUxPQyhSX0FSTV9HT1RPRkYzMiwgICAgICAgICAgICAgICAweDE4KQorRUxGX1JFTE9DKFJfQVJNX0JBU0VfUFJFTCwgICAgICAgICAgICAgIDB4MTkpCitFTEZfUkVMT0MoUl9BUk1fR09UX0JSRUwsICAgICAgICAgICAgICAgMHgxYSkKK0VMRl9SRUxPQyhSX0FSTV9QTFQzMiwgICAgICAgICAgICAgICAgICAweDFiKQorRUxGX1JFTE9DKFJfQVJNX0NBTEwsICAgICAgICAgICAgICAgICAgIDB4MWMpCitFTEZfUkVMT0MoUl9BUk1fSlVNUDI0LCAgICAgICAgICAgICAgICAgMHgxZCkKK0VMRl9SRUxPQyhSX0FSTV9USE1fSlVNUDI0LCAgICAgICAgICAgICAweDFlKQorRUxGX1JFTE9DKFJfQVJNX0JBU0VfQUJTLCAgICAgICAgICAgICAgIDB4MWYpCitFTEZfUkVMT0MoUl9BUk1fQUxVX1BDUkVMXzdfMCwgICAgICAgICAgMHgyMCkKK0VMRl9SRUxPQyhSX0FSTV9BTFVfUENSRUxfMTVfOCwgICAgICAgICAweDIxKQorRUxGX1JFTE9DKFJfQVJNX0FMVV9QQ1JFTF8yM18xNSwgICAgICAgIDB4MjIpCitFTEZfUkVMT0MoUl9BUk1fTERSX1NCUkVMXzExXzBfTkMsICAgICAgMHgyMykKK0VMRl9SRUxPQyhSX0FSTV9BTFVfU0JSRUxfMTlfMTJfTkMsICAgICAweDI0KQorRUxGX1JFTE9DKFJfQVJNX0FMVV9TQlJFTF8yN18yMF9DSywgICAgIDB4MjUpCitFTEZfUkVMT0MoUl9BUk1fVEFSR0VUMSwgICAgICAgICAgICAgICAgMHgyNikKK0VMRl9SRUxPQyhSX0FSTV9TQlJFTDMxLCAgICAgICAgICAgICAgICAweDI3KQorRUxGX1JFTE9DKFJfQVJNX1Y0QlgsICAgICAgICAgICAgICAgICAgIDB4MjgpCitFTEZfUkVMT0MoUl9BUk1fVEFSR0VUMiwgICAgICAgICAgICAgICAgMHgyOSkKK0VMRl9SRUxPQyhSX0FSTV9QUkVMMzEsICAgICAgICAgICAgICAgICAweDJhKQorRUxGX1JFTE9DKFJfQVJNX01PVldfQUJTX05DLCAgICAgICAgICAgIDB4MmIpCitFTEZfUkVMT0MoUl9BUk1fTU9WVF9BQlMsICAgICAgICAgICAgICAgMHgyYykKK0VMRl9SRUxPQyhSX0FSTV9NT1ZXX1BSRUxfTkMsICAgICAgICAgICAweDJkKQorRUxGX1JFTE9DKFJfQVJNX01PVlRfUFJFTCwgICAgICAgICAgICAgIDB4MmUpCitFTEZfUkVMT0MoUl9BUk1fVEhNX01PVldfQUJTX05DLCAgICAgICAgMHgyZikKK0VMRl9SRUxPQyhSX0FSTV9USE1fTU9WVF9BQlMsICAgICAgICAgICAweDMwKQorRUxGX1JFTE9DKFJfQVJNX1RITV9NT1ZXX1BSRUxfTkMsICAgICAgIDB4MzEpCitFTEZfUkVMT0MoUl9BUk1fVEhNX01PVlRfUFJFTCwgICAgICAgICAgMHgzMikKK0VMRl9SRUxPQyhSX0FSTV9USE1fSlVNUDE5LCAgICAgICAgICAgICAweDMzKQorRUxGX1JFTE9DKFJfQVJNX1RITV9KVU1QNiwgICAgICAgICAgICAgIDB4MzQpCitFTEZfUkVMT0MoUl9BUk1fVEhNX0FMVV9QUkVMXzExXzAsICAgICAgMHgzNSkKK0VMRl9SRUxPQyhSX0FSTV9USE1fUEMxMiwgICAgICAgICAgICAgICAweDM2KQorRUxGX1JFTE9DKFJfQVJNX0FCUzMyX05PSSwgICAgICAgICAgICAgIDB4MzcpCitFTEZfUkVMT0MoUl9BUk1fUkVMMzJfTk9JLCAgICAgICAgICAgICAgMHgzOCkKK0VMRl9SRUxPQyhSX0FSTV9BTFVfUENfRzBfTkMsICAgICAgICAgICAweDM5KQorRUxGX1JFTE9DKFJfQVJNX0FMVV9QQ19HMCwgICAgICAgICAgICAgIDB4M2EpCitFTEZfUkVMT0MoUl9BUk1fQUxVX1BDX0cxX05DLCAgICAgICAgICAgMHgzYikKK0VMRl9SRUxPQyhSX0FSTV9BTFVfUENfRzEsICAgICAgICAgICAgICAweDNjKQorRUxGX1JFTE9DKFJfQVJNX0FMVV9QQ19HMiwgICAgICAgICAgICAgIDB4M2QpCitFTEZfUkVMT0MoUl9BUk1fTERSX1BDX0cxLCAgICAgICAgICAgICAgMHgzZSkKK0VMRl9SRUxPQyhSX0FSTV9MRFJfUENfRzIsICAgICAgICAgICAgICAweDNmKQorRUxGX1JFTE9DKFJfQVJNX0xEUlNfUENfRzAsICAgICAgICAgICAgIDB4NDApCitFTEZfUkVMT0MoUl9BUk1fTERSU19QQ19HMSwgICAgICAgICAgICAgMHg0MSkKK0VMRl9SRUxPQyhSX0FSTV9MRFJTX1BDX0cyLCAgICAgICAgICAgICAweDQyKQorRUxGX1JFTE9DKFJfQVJNX0xEQ19QQ19HMCwgICAgICAgICAgICAgIDB4NDMpCitFTEZfUkVMT0MoUl9BUk1fTERDX1BDX0cxLCAgICAgICAgICAgICAgMHg0NCkKK0VMRl9SRUxPQyhSX0FSTV9MRENfUENfRzIsICAgICAgICAgICAgICAweDQ1KQorRUxGX1JFTE9DKFJfQVJNX0FMVV9TQl9HMF9OQywgICAgICAgICAgIDB4NDYpCitFTEZfUkVMT0MoUl9BUk1fQUxVX1NCX0cwLCAgICAgICAgICAgICAgMHg0NykKK0VMRl9SRUxPQyhSX0FSTV9BTFVfU0JfRzFfTkMsICAgICAgICAgICAweDQ4KQorRUxGX1JFTE9DKFJfQVJNX0FMVV9TQl9HMSwgICAgICAgICAgICAgIDB4NDkpCitFTEZfUkVMT0MoUl9BUk1fQUxVX1NCX0cyLCAgICAgICAgICAgICAgMHg0YSkKK0VMRl9SRUxPQyhSX0FSTV9MRFJfU0JfRzAsICAgICAgICAgICAgICAweDRiKQorRUxGX1JFTE9DKFJfQVJNX0xEUl9TQl9HMSwgICAgICAgICAgICAgIDB4NGMpCitFTEZfUkVMT0MoUl9BUk1fTERSX1NCX0cyLCAgICAgICAgICAgICAgMHg0ZCkKK0VMRl9SRUxPQyhSX0FSTV9MRFJTX1NCX0cwLCAgICAgICAgICAgICAweDRlKQorRUxGX1JFTE9DKFJfQVJNX0xEUlNfU0JfRzEsICAgICAgICAgICAgIDB4NGYpCitFTEZfUkVMT0MoUl9BUk1fTERSU19TQl9HMiwgICAgICAgICAgICAgMHg1MCkKK0VMRl9SRUxPQyhSX0FSTV9MRENfU0JfRzAsICAgICAgICAgICAgICAweDUxKQorRUxGX1JFTE9DKFJfQVJNX0xEQ19TQl9HMSwgICAgICAgICAgICAgIDB4NTIpCitFTEZfUkVMT0MoUl9BUk1fTERDX1NCX0cyLCAgICAgICAgICAgICAgMHg1MykKK0VMRl9SRUxPQyhSX0FSTV9NT1ZXX0JSRUxfTkMsICAgICAgICAgICAweDU0KQorRUxGX1JFTE9DKFJfQVJNX01PVlRfQlJFTCwgICAgICAgICAgICAgIDB4NTUpCitFTEZfUkVMT0MoUl9BUk1fTU9WV19CUkVMLCAgICAgICAgICAgICAgMHg1NikKK0VMRl9SRUxPQyhSX0FSTV9USE1fTU9WV19CUkVMX05DLCAgICAgICAweDU3KQorRUxGX1JFTE9DKFJfQVJNX1RITV9NT1ZUX0JSRUwsICAgICAgICAgIDB4NTgpCitFTEZfUkVMT0MoUl9BUk1fVEhNX01PVldfQlJFTCwgICAgICAgICAgMHg1OSkKK0VMRl9SRUxPQyhSX0FSTV9UTFNfR09UREVTQywgICAgICAgICAgICAweDVhKQorRUxGX1JFTE9DKFJfQVJNX1RMU19DQUxMLCAgICAgICAgICAgICAgIDB4NWIpCitFTEZfUkVMT0MoUl9BUk1fVExTX0RFU0NTRVEsICAgICAgICAgICAgMHg1YykKK0VMRl9SRUxPQyhSX0FSTV9USE1fVExTX0NBTEwsICAgICAgICAgICAweDVkKQorRUxGX1JFTE9DKFJfQVJNX1BMVDMyX0FCUywgICAgICAgICAgICAgIDB4NWUpCitFTEZfUkVMT0MoUl9BUk1fR09UX0FCUywgICAgICAgICAgICAgICAgMHg1ZikKK0VMRl9SRUxPQyhSX0FSTV9HT1RfUFJFTCwgICAgICAgICAgICAgICAweDYwKQorRUxGX1JFTE9DKFJfQVJNX0dPVF9CUkVMMTIsICAgICAgICAgICAgIDB4NjEpCitFTEZfUkVMT0MoUl9BUk1fR09UT0ZGMTIsICAgICAgICAgICAgICAgMHg2MikKK0VMRl9SRUxPQyhSX0FSTV9HT1RSRUxBWCwgICAgICAgICAgICAgICAweDYzKQorRUxGX1JFTE9DKFJfQVJNX0dOVV9WVEVOVFJZLCAgICAgICAgICAgIDB4NjQpCitFTEZfUkVMT0MoUl9BUk1fR05VX1ZUSU5IRVJJVCwgICAgICAgICAgMHg2NSkKK0VMRl9SRUxPQyhSX0FSTV9USE1fSlVNUDExLCAgICAgICAgICAgICAweDY2KQorRUxGX1JFTE9DKFJfQVJNX1RITV9KVU1QOCwgICAgICAgICAgICAgIDB4NjcpCitFTEZfUkVMT0MoUl9BUk1fVExTX0dEMzIsICAgICAgICAgICAgICAgMHg2OCkKK0VMRl9SRUxPQyhSX0FSTV9UTFNfTERNMzIsICAgICAgICAgICAgICAweDY5KQorRUxGX1JFTE9DKFJfQVJNX1RMU19MRE8zMiwgICAgICAgICAgICAgIDB4NmEpCitFTEZfUkVMT0MoUl9BUk1fVExTX0lFMzIsICAgICAgICAgICAgICAgMHg2YikKK0VMRl9SRUxPQyhSX0FSTV9UTFNfTEUzMiwgICAgICAgICAgICAgICAweDZjKQorRUxGX1JFTE9DKFJfQVJNX1RMU19MRE8xMiwgICAgICAgICAgICAgIDB4NmQpCitFTEZfUkVMT0MoUl9BUk1fVExTX0xFMTIsICAgICAgICAgICAgICAgMHg2ZSkKK0VMRl9SRUxPQyhSX0FSTV9UTFNfSUUxMkdQLCAgICAgICAgICAgICAweDZmKQorRUxGX1JFTE9DKFJfQVJNX1BSSVZBVEVfMCwgICAgICAgICAgICAgIDB4NzApCitFTEZfUkVMT0MoUl9BUk1fUFJJVkFURV8xLCAgICAgICAgICAgICAgMHg3MSkKK0VMRl9SRUxPQyhSX0FSTV9QUklWQVRFXzIsICAgICAgICAgICAgICAweDcyKQorRUxGX1JFTE9DKFJfQVJNX1BSSVZBVEVfMywgICAgICAgICAgICAgIDB4NzMpCitFTEZfUkVMT0MoUl9BUk1fUFJJVkFURV80LCAgICAgICAgICAgICAgMHg3NCkKK0VMRl9SRUxPQyhSX0FSTV9QUklWQVRFXzUsICAgICAgICAgICAgICAweDc1KQorRUxGX1JFTE9DKFJfQVJNX1BSSVZBVEVfNiwgICAgICAgICAgICAgIDB4NzYpCitFTEZfUkVMT0MoUl9BUk1fUFJJVkFURV83LCAgICAgICAgICAgICAgMHg3NykKK0VMRl9SRUxPQyhSX0FSTV9QUklWQVRFXzgsICAgICAgICAgICAgICAweDc4KQorRUxGX1JFTE9DKFJfQVJNX1BSSVZBVEVfOSwgICAgICAgICAgICAgIDB4NzkpCitFTEZfUkVMT0MoUl9BUk1fUFJJVkFURV8xMCwgICAgICAgICAgICAgMHg3YSkKK0VMRl9SRUxPQyhSX0FSTV9QUklWQVRFXzExLCAgICAgICAgICAgICAweDdiKQorRUxGX1JFTE9DKFJfQVJNX1BSSVZBVEVfMTIsICAgICAgICAgICAgIDB4N2MpCitFTEZfUkVMT0MoUl9BUk1fUFJJVkFURV8xMywgICAgICAgICAgICAgMHg3ZCkKK0VMRl9SRUxPQyhSX0FSTV9QUklWQVRFXzE0LCAgICAgICAgICAgICAweDdlKQorRUxGX1JFTE9DKFJfQVJNX1BSSVZBVEVfMTUsICAgICAgICAgICAgIDB4N2YpCitFTEZfUkVMT0MoUl9BUk1fTUVfVE9PLCAgICAgICAgICAgICAgICAgMHg4MCkKK0VMRl9SRUxPQyhSX0FSTV9USE1fVExTX0RFU0NTRVExNiwgICAgICAweDgxKQorRUxGX1JFTE9DKFJfQVJNX1RITV9UTFNfREVTQ1NFUTMyLCAgICAgIDB4ODIpCitFTEZfUkVMT0MoUl9BUk1fSVJFTEFUSVZFLCAgICAgICAgICAgICAgMHhhMCkKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9BVlIuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL0FWUi5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk2ZmM2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9BVlIuZGVmCkBAIC0wLDAgKzEsNDEgQEAKKworI2lmbmRlZiBFTEZfUkVMT0MKKyNlcnJvciAiRUxGX1JFTE9DIG11c3QgYmUgZGVmaW5lZCIKKyNlbmRpZgorCitFTEZfUkVMT0MoUl9BVlJfTk9ORSwgICAgICAgICAgICAgICAgICAwKQorRUxGX1JFTE9DKFJfQVZSXzMyLCAgICAgICAgICAgICAgICAgICAgMSkKK0VMRl9SRUxPQyhSX0FWUl83X1BDUkVMLCAgICAgICAgICAgICAgIDIpCitFTEZfUkVMT0MoUl9BVlJfMTNfUENSRUwsICAgICAgICAgICAgICAzKQorRUxGX1JFTE9DKFJfQVZSXzE2LCAgICAgICAgICAgICAgICAgICAgNCkKK0VMRl9SRUxPQyhSX0FWUl8xNl9QTSwgICAgICAgICAgICAgICAgIDUpCitFTEZfUkVMT0MoUl9BVlJfTE84X0xESSwgICAgICAgICAgICAgICA2KQorRUxGX1JFTE9DKFJfQVZSX0hJOF9MREksICAgICAgICAgICAgICAgNykKK0VMRl9SRUxPQyhSX0FWUl9ISDhfTERJLCAgICAgICAgICAgICAgIDgpCitFTEZfUkVMT0MoUl9BVlJfTE84X0xESV9ORUcsICAgICAgICAgICA5KQorRUxGX1JFTE9DKFJfQVZSX0hJOF9MRElfTkVHLCAgICAgICAgICAxMCkKK0VMRl9SRUxPQyhSX0FWUl9ISDhfTERJX05FRywgICAgICAgICAgMTEpCitFTEZfUkVMT0MoUl9BVlJfTE84X0xESV9QTSwgICAgICAgICAgIDEyKQorRUxGX1JFTE9DKFJfQVZSX0hJOF9MRElfUE0sICAgICAgICAgICAxMykKK0VMRl9SRUxPQyhSX0FWUl9ISDhfTERJX1BNLCAgICAgICAgICAgMTQpCitFTEZfUkVMT0MoUl9BVlJfTE84X0xESV9QTV9ORUcsICAgICAgIDE1KQorRUxGX1JFTE9DKFJfQVZSX0hJOF9MRElfUE1fTkVHLCAgICAgICAxNikKK0VMRl9SRUxPQyhSX0FWUl9ISDhfTERJX1BNX05FRywgICAgICAgMTcpCitFTEZfUkVMT0MoUl9BVlJfQ0FMTCwgICAgICAgICAgICAgICAgIDE4KQorRUxGX1JFTE9DKFJfQVZSX0xESSwgICAgICAgICAgICAgICAgICAxOSkKK0VMRl9SRUxPQyhSX0FWUl82LCAgICAgICAgICAgICAgICAgICAgMjApCitFTEZfUkVMT0MoUl9BVlJfNl9BRElXLCAgICAgICAgICAgICAgIDIxKQorRUxGX1JFTE9DKFJfQVZSX01TOF9MREksICAgICAgICAgICAgICAyMikKK0VMRl9SRUxPQyhSX0FWUl9NUzhfTERJX05FRywgICAgICAgICAgMjMpCitFTEZfUkVMT0MoUl9BVlJfTE84X0xESV9HUywgICAgICAgICAgIDI0KQorRUxGX1JFTE9DKFJfQVZSX0hJOF9MRElfR1MsICAgICAgICAgICAyNSkKK0VMRl9SRUxPQyhSX0FWUl84LCAgICAgICAgICAgICAgICAgICAgMjYpCitFTEZfUkVMT0MoUl9BVlJfOF9MTzgsICAgICAgICAgICAgICAgIDI3KQorRUxGX1JFTE9DKFJfQVZSXzhfSEk4LCAgICAgICAgICAgICAgICAyOCkKK0VMRl9SRUxPQyhSX0FWUl84X0hMTzgsICAgICAgICAgICAgICAgMjkpCitFTEZfUkVMT0MoUl9BVlJfRElGRjgsICAgICAgICAgICAgICAgIDMwKQorRUxGX1JFTE9DKFJfQVZSX0RJRkYxNiwgICAgICAgICAgICAgICAzMSkKK0VMRl9SRUxPQyhSX0FWUl9ESUZGMzIsICAgICAgICAgICAgICAgMzIpCitFTEZfUkVMT0MoUl9BVlJfTERTX1NUU18xNiwgICAgICAgICAgIDMzKQorRUxGX1JFTE9DKFJfQVZSX1BPUlQ2LCAgICAgICAgICAgICAgICAzNCkKK0VMRl9SRUxPQyhSX0FWUl9QT1JUNSwgICAgICAgICAgICAgICAgMzUpCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvQlBGLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9CUEYuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZDdmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvQlBGLmRlZgpAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgRUxGX1JFTE9DCisjZXJyb3IgIkVMRl9SRUxPQyBtdXN0IGJlIGRlZmluZWQiCisjZW5kaWYKKworLy8gTm8gcmVsb2NhdGlvbgorRUxGX1JFTE9DKFJfQlBGX05PTkUsICAgICAgICAwKQorRUxGX1JFTE9DKFJfQlBGXzY0XzY0LCAgICAgICAxKQorRUxGX1JFTE9DKFJfQlBGXzY0XzMyLCAgICAgIDEwKQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL0hleGFnb24uZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL0hleGFnb24uZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMjFlMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvSGV4YWdvbi5kZWYKQEAgLTAsMCArMSwxMDYgQEAKKworI2lmbmRlZiBFTEZfUkVMT0MKKyNlcnJvciAiRUxGX1JFTE9DIG11c3QgYmUgZGVmaW5lZCIKKyNlbmRpZgorCisvLyBSZWxlYXNlIDUgQUJJCitFTEZfUkVMT0MoUl9IRVhfTk9ORSwgICAgICAgICAgICAgICAgMCkKK0VMRl9SRUxPQyhSX0hFWF9CMjJfUENSRUwsICAgICAgICAgICAxKQorRUxGX1JFTE9DKFJfSEVYX0IxNV9QQ1JFTCwgICAgICAgICAgIDIpCitFTEZfUkVMT0MoUl9IRVhfQjdfUENSRUwsICAgICAgICAgICAgMykKK0VMRl9SRUxPQyhSX0hFWF9MTzE2LCAgICAgICAgICAgICAgICA0KQorRUxGX1JFTE9DKFJfSEVYX0hJMTYsICAgICAgICAgICAgICAgIDUpCitFTEZfUkVMT0MoUl9IRVhfMzIsICAgICAgICAgICAgICAgICAgNikKK0VMRl9SRUxPQyhSX0hFWF8xNiwgICAgICAgICAgICAgICAgICA3KQorRUxGX1JFTE9DKFJfSEVYXzgsICAgICAgICAgICAgICAgICAgIDgpCitFTEZfUkVMT0MoUl9IRVhfR1BSRUwxNl8wLCAgICAgICAgICAgOSkKK0VMRl9SRUxPQyhSX0hFWF9HUFJFTDE2XzEsICAgICAgICAgICAxMCkKK0VMRl9SRUxPQyhSX0hFWF9HUFJFTDE2XzIsICAgICAgICAgICAxMSkKK0VMRl9SRUxPQyhSX0hFWF9HUFJFTDE2XzMsICAgICAgICAgICAxMikKK0VMRl9SRUxPQyhSX0hFWF9ITDE2LCAgICAgICAgICAgICAgICAxMykKK0VMRl9SRUxPQyhSX0hFWF9CMTNfUENSRUwsICAgICAgICAgICAxNCkKK0VMRl9SRUxPQyhSX0hFWF9COV9QQ1JFTCwgICAgICAgICAgICAxNSkKK0VMRl9SRUxPQyhSX0hFWF9CMzJfUENSRUxfWCwgICAgICAgICAxNikKK0VMRl9SRUxPQyhSX0hFWF8zMl82X1gsICAgICAgICAgICAgICAxNykKK0VMRl9SRUxPQyhSX0hFWF9CMjJfUENSRUxfWCwgICAgICAgICAxOCkKK0VMRl9SRUxPQyhSX0hFWF9CMTVfUENSRUxfWCwgICAgICAgICAxOSkKK0VMRl9SRUxPQyhSX0hFWF9CMTNfUENSRUxfWCwgICAgICAgICAyMCkKK0VMRl9SRUxPQyhSX0hFWF9COV9QQ1JFTF9YLCAgICAgICAgICAyMSkKK0VMRl9SRUxPQyhSX0hFWF9CN19QQ1JFTF9YLCAgICAgICAgICAyMikKK0VMRl9SRUxPQyhSX0hFWF8xNl9YLCAgICAgICAgICAgICAgICAyMykKK0VMRl9SRUxPQyhSX0hFWF8xMl9YLCAgICAgICAgICAgICAgICAyNCkKK0VMRl9SRUxPQyhSX0hFWF8xMV9YLCAgICAgICAgICAgICAgICAyNSkKK0VMRl9SRUxPQyhSX0hFWF8xMF9YLCAgICAgICAgICAgICAgICAyNikKK0VMRl9SRUxPQyhSX0hFWF85X1gsICAgICAgICAgICAgICAgICAyNykKK0VMRl9SRUxPQyhSX0hFWF84X1gsICAgICAgICAgICAgICAgICAyOCkKK0VMRl9SRUxPQyhSX0hFWF83X1gsICAgICAgICAgICAgICAgICAyOSkKK0VMRl9SRUxPQyhSX0hFWF82X1gsICAgICAgICAgICAgICAgICAzMCkKK0VMRl9SRUxPQyhSX0hFWF8zMl9QQ1JFTCwgICAgICAgICAgICAzMSkKK0VMRl9SRUxPQyhSX0hFWF9DT1BZLCAgICAgICAgICAgICAgICAzMikKK0VMRl9SRUxPQyhSX0hFWF9HTE9CX0RBVCwgICAgICAgICAgICAzMykKK0VMRl9SRUxPQyhSX0hFWF9KTVBfU0xPVCwgICAgICAgICAgICAzNCkKK0VMRl9SRUxPQyhSX0hFWF9SRUxBVElWRSwgICAgICAgICAgICAzNSkKK0VMRl9SRUxPQyhSX0hFWF9QTFRfQjIyX1BDUkVMLCAgICAgICAzNikKK0VMRl9SRUxPQyhSX0hFWF9HT1RSRUxfTE8xNiwgICAgICAgICAzNykKK0VMRl9SRUxPQyhSX0hFWF9HT1RSRUxfSEkxNiwgICAgICAgICAzOCkKK0VMRl9SRUxPQyhSX0hFWF9HT1RSRUxfMzIsICAgICAgICAgICAzOSkKK0VMRl9SRUxPQyhSX0hFWF9HT1RfTE8xNiwgICAgICAgICAgICA0MCkKK0VMRl9SRUxPQyhSX0hFWF9HT1RfSEkxNiwgICAgICAgICAgICA0MSkKK0VMRl9SRUxPQyhSX0hFWF9HT1RfMzIsICAgICAgICAgICAgICA0MikKK0VMRl9SRUxPQyhSX0hFWF9HT1RfMTYsICAgICAgICAgICAgICA0MykKK0VMRl9SRUxPQyhSX0hFWF9EVFBNT0RfMzIsICAgICAgICAgICA0NCkKK0VMRl9SRUxPQyhSX0hFWF9EVFBSRUxfTE8xNiwgICAgICAgICA0NSkKK0VMRl9SRUxPQyhSX0hFWF9EVFBSRUxfSEkxNiwgICAgICAgICA0NikKK0VMRl9SRUxPQyhSX0hFWF9EVFBSRUxfMzIsICAgICAgICAgICA0NykKK0VMRl9SRUxPQyhSX0hFWF9EVFBSRUxfMTYsICAgICAgICAgICA0OCkKK0VMRl9SRUxPQyhSX0hFWF9HRF9QTFRfQjIyX1BDUkVMLCAgICA0OSkKK0VMRl9SRUxPQyhSX0hFWF9HRF9HT1RfTE8xNiwgICAgICAgICA1MCkKK0VMRl9SRUxPQyhSX0hFWF9HRF9HT1RfSEkxNiwgICAgICAgICA1MSkKK0VMRl9SRUxPQyhSX0hFWF9HRF9HT1RfMzIsICAgICAgICAgICA1MikKK0VMRl9SRUxPQyhSX0hFWF9HRF9HT1RfMTYsICAgICAgICAgICA1MykKK0VMRl9SRUxPQyhSX0hFWF9JRV9MTzE2LCAgICAgICAgICAgICA1NCkKK0VMRl9SRUxPQyhSX0hFWF9JRV9ISTE2LCAgICAgICAgICAgICA1NSkKK0VMRl9SRUxPQyhSX0hFWF9JRV8zMiwgICAgICAgICAgICAgICA1NikKK0VMRl9SRUxPQyhSX0hFWF9JRV9HT1RfTE8xNiwgICAgICAgICA1NykKK0VMRl9SRUxPQyhSX0hFWF9JRV9HT1RfSEkxNiwgICAgICAgICA1OCkKK0VMRl9SRUxPQyhSX0hFWF9JRV9HT1RfMzIsICAgICAgICAgICA1OSkKK0VMRl9SRUxPQyhSX0hFWF9JRV9HT1RfMTYsICAgICAgICAgICA2MCkKK0VMRl9SRUxPQyhSX0hFWF9UUFJFTF9MTzE2LCAgICAgICAgICA2MSkKK0VMRl9SRUxPQyhSX0hFWF9UUFJFTF9ISTE2LCAgICAgICAgICA2MikKK0VMRl9SRUxPQyhSX0hFWF9UUFJFTF8zMiwgICAgICAgICAgICA2MykKK0VMRl9SRUxPQyhSX0hFWF9UUFJFTF8xNiwgICAgICAgICAgICA2NCkKK0VMRl9SRUxPQyhSX0hFWF82X1BDUkVMX1gsICAgICAgICAgICA2NSkKK0VMRl9SRUxPQyhSX0hFWF9HT1RSRUxfMzJfNl9YLCAgICAgICA2NikKK0VMRl9SRUxPQyhSX0hFWF9HT1RSRUxfMTZfWCwgICAgICAgICA2NykKK0VMRl9SRUxPQyhSX0hFWF9HT1RSRUxfMTFfWCwgICAgICAgICA2OCkKK0VMRl9SRUxPQyhSX0hFWF9HT1RfMzJfNl9YLCAgICAgICAgICA2OSkKK0VMRl9SRUxPQyhSX0hFWF9HT1RfMTZfWCwgICAgICAgICAgICA3MCkKK0VMRl9SRUxPQyhSX0hFWF9HT1RfMTFfWCwgICAgICAgICAgICA3MSkKK0VMRl9SRUxPQyhSX0hFWF9EVFBSRUxfMzJfNl9YLCAgICAgICA3MikKK0VMRl9SRUxPQyhSX0hFWF9EVFBSRUxfMTZfWCwgICAgICAgICA3MykKK0VMRl9SRUxPQyhSX0hFWF9EVFBSRUxfMTFfWCwgICAgICAgICA3NCkKK0VMRl9SRUxPQyhSX0hFWF9HRF9HT1RfMzJfNl9YLCAgICAgICA3NSkKK0VMRl9SRUxPQyhSX0hFWF9HRF9HT1RfMTZfWCwgICAgICAgICA3NikKK0VMRl9SRUxPQyhSX0hFWF9HRF9HT1RfMTFfWCwgICAgICAgICA3NykKK0VMRl9SRUxPQyhSX0hFWF9JRV8zMl82X1gsICAgICAgICAgICA3OCkKK0VMRl9SRUxPQyhSX0hFWF9JRV8xNl9YLCAgICAgICAgICAgICA3OSkKK0VMRl9SRUxPQyhSX0hFWF9JRV9HT1RfMzJfNl9YLCAgICAgICA4MCkKK0VMRl9SRUxPQyhSX0hFWF9JRV9HT1RfMTZfWCwgICAgICAgICA4MSkKK0VMRl9SRUxPQyhSX0hFWF9JRV9HT1RfMTFfWCwgICAgICAgICA4MikKK0VMRl9SRUxPQyhSX0hFWF9UUFJFTF8zMl82X1gsICAgICAgICA4MykKK0VMRl9SRUxPQyhSX0hFWF9UUFJFTF8xNl9YLCAgICAgICAgICA4NCkKK0VMRl9SRUxPQyhSX0hFWF9UUFJFTF8xMV9YLCAgICAgICAgICA4NSkKK0VMRl9SRUxPQyhSX0hFWF9MRF9QTFRfQjIyX1BDUkVMLCAgICA4NikKK0VMRl9SRUxPQyhSX0hFWF9MRF9HT1RfTE8xNiwgICAgICAgICA4NykKK0VMRl9SRUxPQyhSX0hFWF9MRF9HT1RfSEkxNiwgICAgICAgICA4OCkKK0VMRl9SRUxPQyhSX0hFWF9MRF9HT1RfMzIsICAgICAgICAgICA4OSkKK0VMRl9SRUxPQyhSX0hFWF9MRF9HT1RfMTYsICAgICAgICAgICA5MCkKK0VMRl9SRUxPQyhSX0hFWF9MRF9HT1RfMzJfNl9YLCAgICAgICA5MSkKK0VMRl9SRUxPQyhSX0hFWF9MRF9HT1RfMTZfWCwgICAgICAgICA5MikKK0VMRl9SRUxPQyhSX0hFWF9MRF9HT1RfMTFfWCwgICAgICAgICA5MykKK0VMRl9SRUxPQyhSX0hFWF8yM19SRUcsICAgICAgICAgICAgICA5NCkKK0VMRl9SRUxPQyhSX0hFWF9HRF9QTFRfQjIyX1BDUkVMX1gsICA5NSkKK0VMRl9SRUxPQyhSX0hFWF9HRF9QTFRfQjMyX1BDUkVMX1gsICA5NikKK0VMRl9SRUxPQyhSX0hFWF9MRF9QTFRfQjIyX1BDUkVMX1gsICA5NykKK0VMRl9SRUxPQyhSX0hFWF9MRF9QTFRfQjMyX1BDUkVMX1gsICA5OCkKK0VMRl9SRUxPQyhSX0hFWF8yN19SRUcsICAgICAgICAgICAgICA5OSkKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9MYW5haS5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvTGFuYWkuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZWNiMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvTGFuYWkuZGVmCkBAIC0wLDAgKzEsMTkgQEAKKworI2lmbmRlZiBFTEZfUkVMT0MKKyNlcnJvciAiRUxGX1JFTE9DIG11c3QgYmUgZGVmaW5lZCIKKyNlbmRpZgorCisvLyBObyByZWxvY2F0aW9uCitFTEZfUkVMT0MoUl9MQU5BSV9OT05FLCAgICAgICAgMCkKKy8vIDIxLWJpdCBzeW1ib2wgcmVsb2NhdGlvbgorRUxGX1JFTE9DKFJfTEFOQUlfMjEsICAgICAgICAgIDEpCisvLyAyMS1iaXQgc3ltYm9sIHJlbG9jYXRpb24gd2l0aCBsYXN0IHR3byBiaXRzIG1hc2tlZCB0byAwCitFTEZfUkVMT0MoUl9MQU5BSV8yMV9GLCAgICAgICAgMikKKy8vIDI1LWJpdCBicmFuY2ggdGFyZ2V0cworRUxGX1JFTE9DKFJfTEFOQUlfMjUsICAgICAgICAgIDMpCisvLyBHZW5lcmFsIDMyLWJpdCByZWxvY2F0aW9uCitFTEZfUkVMT0MoUl9MQU5BSV8zMiwgICAgICAgICAgNCkKKy8vIFVwcGVyIDE2LWJpdHMgb2YgYSBzeW1ib2xpYyByZWxvY2F0aW9uCitFTEZfUkVMT0MoUl9MQU5BSV9ISTE2LCAgICAgICAgNSkKKy8vIExvd2VyIDE2LWJpdHMgb2YgYSBzeW1ib2xpYyByZWxvY2F0aW9uCitFTEZfUkVMT0MoUl9MQU5BSV9MTzE2LCAgICAgICAgNikKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9NaXBzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9NaXBzLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzAwODhkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL01pcHMuZGVmCkBAIC0wLDAgKzEsMTE3IEBACisKKyNpZm5kZWYgRUxGX1JFTE9DCisjZXJyb3IgIkVMRl9SRUxPQyBtdXN0IGJlIGRlZmluZWQiCisjZW5kaWYKKworRUxGX1JFTE9DKFJfTUlQU19OT05FLCAgICAgICAgICAgICAgICAwKQorRUxGX1JFTE9DKFJfTUlQU18xNiwgICAgICAgICAgICAgICAgICAxKQorRUxGX1JFTE9DKFJfTUlQU18zMiwgICAgICAgICAgICAgICAgICAyKQorRUxGX1JFTE9DKFJfTUlQU19SRUwzMiwgICAgICAgICAgICAgICAzKQorRUxGX1JFTE9DKFJfTUlQU18yNiwgICAgICAgICAgICAgICAgICA0KQorRUxGX1JFTE9DKFJfTUlQU19ISTE2LCAgICAgICAgICAgICAgICA1KQorRUxGX1JFTE9DKFJfTUlQU19MTzE2LCAgICAgICAgICAgICAgICA2KQorRUxGX1JFTE9DKFJfTUlQU19HUFJFTDE2LCAgICAgICAgICAgICA3KQorRUxGX1JFTE9DKFJfTUlQU19MSVRFUkFMLCAgICAgICAgICAgICA4KQorRUxGX1JFTE9DKFJfTUlQU19HT1QxNiwgICAgICAgICAgICAgICA5KQorRUxGX1JFTE9DKFJfTUlQU19QQzE2LCAgICAgICAgICAgICAgIDEwKQorRUxGX1JFTE9DKFJfTUlQU19DQUxMMTYsICAgICAgICAgICAgIDExKQorRUxGX1JFTE9DKFJfTUlQU19HUFJFTDMyLCAgICAgICAgICAgIDEyKQorRUxGX1JFTE9DKFJfTUlQU19VTlVTRUQxLCAgICAgICAgICAgIDEzKQorRUxGX1JFTE9DKFJfTUlQU19VTlVTRUQyLCAgICAgICAgICAgIDE0KQorRUxGX1JFTE9DKFJfTUlQU19VTlVTRUQzLCAgICAgICAgICAgIDE1KQorRUxGX1JFTE9DKFJfTUlQU19TSElGVDUsICAgICAgICAgICAgIDE2KQorRUxGX1JFTE9DKFJfTUlQU19TSElGVDYsICAgICAgICAgICAgIDE3KQorRUxGX1JFTE9DKFJfTUlQU182NCwgICAgICAgICAgICAgICAgIDE4KQorRUxGX1JFTE9DKFJfTUlQU19HT1RfRElTUCwgICAgICAgICAgIDE5KQorRUxGX1JFTE9DKFJfTUlQU19HT1RfUEFHRSwgICAgICAgICAgIDIwKQorRUxGX1JFTE9DKFJfTUlQU19HT1RfT0ZTVCwgICAgICAgICAgIDIxKQorRUxGX1JFTE9DKFJfTUlQU19HT1RfSEkxNiwgICAgICAgICAgIDIyKQorRUxGX1JFTE9DKFJfTUlQU19HT1RfTE8xNiwgICAgICAgICAgIDIzKQorRUxGX1JFTE9DKFJfTUlQU19TVUIsICAgICAgICAgICAgICAgIDI0KQorRUxGX1JFTE9DKFJfTUlQU19JTlNFUlRfQSwgICAgICAgICAgIDI1KQorRUxGX1JFTE9DKFJfTUlQU19JTlNFUlRfQiwgICAgICAgICAgIDI2KQorRUxGX1JFTE9DKFJfTUlQU19ERUxFVEUsICAgICAgICAgICAgIDI3KQorRUxGX1JFTE9DKFJfTUlQU19ISUdIRVIsICAgICAgICAgICAgIDI4KQorRUxGX1JFTE9DKFJfTUlQU19ISUdIRVNULCAgICAgICAgICAgIDI5KQorRUxGX1JFTE9DKFJfTUlQU19DQUxMX0hJMTYsICAgICAgICAgIDMwKQorRUxGX1JFTE9DKFJfTUlQU19DQUxMX0xPMTYsICAgICAgICAgIDMxKQorRUxGX1JFTE9DKFJfTUlQU19TQ05fRElTUCwgICAgICAgICAgIDMyKQorRUxGX1JFTE9DKFJfTUlQU19SRUwxNiwgICAgICAgICAgICAgIDMzKQorRUxGX1JFTE9DKFJfTUlQU19BRERfSU1NRURJQVRFLCAgICAgIDM0KQorRUxGX1JFTE9DKFJfTUlQU19QSlVNUCwgICAgICAgICAgICAgIDM1KQorRUxGX1JFTE9DKFJfTUlQU19SRUxHT1QsICAgICAgICAgICAgIDM2KQorRUxGX1JFTE9DKFJfTUlQU19KQUxSLCAgICAgICAgICAgICAgIDM3KQorRUxGX1JFTE9DKFJfTUlQU19UTFNfRFRQTU9EMzIsICAgICAgIDM4KQorRUxGX1JFTE9DKFJfTUlQU19UTFNfRFRQUkVMMzIsICAgICAgIDM5KQorRUxGX1JFTE9DKFJfTUlQU19UTFNfRFRQTU9ENjQsICAgICAgIDQwKQorRUxGX1JFTE9DKFJfTUlQU19UTFNfRFRQUkVMNjQsICAgICAgIDQxKQorRUxGX1JFTE9DKFJfTUlQU19UTFNfR0QsICAgICAgICAgICAgIDQyKQorRUxGX1JFTE9DKFJfTUlQU19UTFNfTERNLCAgICAgICAgICAgIDQzKQorRUxGX1JFTE9DKFJfTUlQU19UTFNfRFRQUkVMX0hJMTYsICAgIDQ0KQorRUxGX1JFTE9DKFJfTUlQU19UTFNfRFRQUkVMX0xPMTYsICAgIDQ1KQorRUxGX1JFTE9DKFJfTUlQU19UTFNfR09UVFBSRUwsICAgICAgIDQ2KQorRUxGX1JFTE9DKFJfTUlQU19UTFNfVFBSRUwzMiwgICAgICAgIDQ3KQorRUxGX1JFTE9DKFJfTUlQU19UTFNfVFBSRUw2NCwgICAgICAgIDQ4KQorRUxGX1JFTE9DKFJfTUlQU19UTFNfVFBSRUxfSEkxNiwgICAgIDQ5KQorRUxGX1JFTE9DKFJfTUlQU19UTFNfVFBSRUxfTE8xNiwgICAgIDUwKQorRUxGX1JFTE9DKFJfTUlQU19HTE9CX0RBVCwgICAgICAgICAgIDUxKQorRUxGX1JFTE9DKFJfTUlQU19QQzIxX1MyLCAgICAgICAgICAgIDYwKQorRUxGX1JFTE9DKFJfTUlQU19QQzI2X1MyLCAgICAgICAgICAgIDYxKQorRUxGX1JFTE9DKFJfTUlQU19QQzE4X1MzLCAgICAgICAgICAgIDYyKQorRUxGX1JFTE9DKFJfTUlQU19QQzE5X1MyLCAgICAgICAgICAgIDYzKQorRUxGX1JFTE9DKFJfTUlQU19QQ0hJMTYsICAgICAgICAgICAgIDY0KQorRUxGX1JFTE9DKFJfTUlQU19QQ0xPMTYsICAgICAgICAgICAgIDY1KQorRUxGX1JFTE9DKFJfTUlQUzE2XzI2LCAgICAgICAgICAgICAgIDEwMCkKK0VMRl9SRUxPQyhSX01JUFMxNl9HUFJFTCwgICAgICAgICAgICAxMDEpCitFTEZfUkVMT0MoUl9NSVBTMTZfR09UMTYsICAgICAgICAgICAgMTAyKQorRUxGX1JFTE9DKFJfTUlQUzE2X0NBTEwxNiwgICAgICAgICAgIDEwMykKK0VMRl9SRUxPQyhSX01JUFMxNl9ISTE2LCAgICAgICAgICAgICAxMDQpCitFTEZfUkVMT0MoUl9NSVBTMTZfTE8xNiwgICAgICAgICAgICAgMTA1KQorRUxGX1JFTE9DKFJfTUlQUzE2X1RMU19HRCwgICAgICAgICAgIDEwNikKK0VMRl9SRUxPQyhSX01JUFMxNl9UTFNfTERNLCAgICAgICAgICAxMDcpCitFTEZfUkVMT0MoUl9NSVBTMTZfVExTX0RUUFJFTF9ISTE2LCAgMTA4KQorRUxGX1JFTE9DKFJfTUlQUzE2X1RMU19EVFBSRUxfTE8xNiwgIDEwOSkKK0VMRl9SRUxPQyhSX01JUFMxNl9UTFNfR09UVFBSRUwsICAgICAxMTApCitFTEZfUkVMT0MoUl9NSVBTMTZfVExTX1RQUkVMX0hJMTYsICAgMTExKQorRUxGX1JFTE9DKFJfTUlQUzE2X1RMU19UUFJFTF9MTzE2LCAgIDExMikKK0VMRl9SRUxPQyhSX01JUFNfQ09QWSwgICAgICAgICAgICAgICAxMjYpCitFTEZfUkVMT0MoUl9NSVBTX0pVTVBfU0xPVCwgICAgICAgICAgMTI3KQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTXzI2X1MxLCAgICAgICAgIDEzMykKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19ISTE2LCAgICAgICAgICAxMzQpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfTE8xNiwgICAgICAgICAgMTM1KQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX0dQUkVMMTYsICAgICAgIDEzNikKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19MSVRFUkFMLCAgICAgICAxMzcpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfR09UMTYsICAgICAgICAgMTM4KQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX1BDN19TMSwgICAgICAgIDEzOSkKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19QQzEwX1MxLCAgICAgICAxNDApCitFTEZfUkVMT0MoUl9NSUNST01JUFNfUEMxNl9TMSwgICAgICAgMTQxKQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX0NBTEwxNiwgICAgICAgIDE0MikKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19HT1RfRElTUCwgICAgICAxNDUpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfR09UX1BBR0UsICAgICAgMTQ2KQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX0dPVF9PRlNULCAgICAgIDE0NykKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19HT1RfSEkxNiwgICAgICAxNDgpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfR09UX0xPMTYsICAgICAgMTQ5KQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX1NVQiwgICAgICAgICAgIDE1MCkKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19ISUdIRVIsICAgICAgICAxNTEpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfSElHSEVTVCwgICAgICAgMTUyKQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX0NBTExfSEkxNiwgICAgIDE1MykKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19DQUxMX0xPMTYsICAgICAxNTQpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfU0NOX0RJU1AsICAgICAgMTU1KQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX0pBTFIsICAgICAgICAgIDE1NikKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19ISTBfTE8xNiwgICAgICAxNTcpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfVExTX0dELCAgICAgICAgICAgMTYyKQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX1RMU19MRE0sICAgICAgICAgIDE2MykKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19UTFNfRFRQUkVMX0hJMTYsICAxNjQpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfVExTX0RUUFJFTF9MTzE2LCAgMTY1KQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX1RMU19HT1RUUFJFTCwgICAgIDE2NikKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19UTFNfVFBSRUxfSEkxNiwgICAxNjkpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfVExTX1RQUkVMX0xPMTYsICAgMTcwKQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX0dQUkVMN19TMiwgICAgICAgIDE3MikKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19QQzIzX1MyLCAgICAgICAgICAxNzMpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfUEMyMV9TMSwgICAgICAgICAgMTc0KQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX1BDMjZfUzEsICAgICAgICAgIDE3NSkKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19QQzE4X1MzLCAgICAgICAgICAxNzYpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfUEMxOV9TMiwgICAgICAgICAgMTc3KQorRUxGX1JFTE9DKFJfTUlQU19OVU0sICAgICAgICAgICAgICAgIDIxOCkKK0VMRl9SRUxPQyhSX01JUFNfUEMzMiwgICAgICAgICAgICAgICAyNDgpCitFTEZfUkVMT0MoUl9NSVBTX0VILCAgICAgICAgICAgICAgICAgMjQ5KQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL1Bvd2VyUEMuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL1Bvd2VyUEMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZjhlZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvUG93ZXJQQy5kZWYKQEAgLTAsMCArMSwxMjMgQEAKKworI2lmbmRlZiBFTEZfUkVMT0MKKyNlcnJvciAiRUxGX1JFTE9DIG11c3QgYmUgZGVmaW5lZCIKKyNlbmRpZgorCisvLyBnbGliYydzIFBvd2VyUEMgYXNtL3NpZ2NvbnRleHQuaCwgd2hlbiBjb21waWxpbmcgZm9yIFBQQzY0LCBoYXMgdGhlCisvLyB1bmZvcnR1bmF0ZSBiZWhhdmlvciBvZiBpbmNsdWRpbmcgYXNtL2VsZi5oLCB3aGljaCBkZWZpbmVzIFJfUFBDX05PTkUsIGV0Yy4KKy8vIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgaW50ZWdlciB2YWx1ZXMuIEFzIGEgcmVzdWx0LCB3ZSBuZWVkIHRvIHVuZGVmIHRoZW0KKy8vIGhlcmUgYmVmb3JlIGNvbnRpbnVpbmcuCisKKyN1bmRlZiBSX1BQQ19OT05FCisjdW5kZWYgUl9QUENfQUREUjMyCisjdW5kZWYgUl9QUENfQUREUjI0CisjdW5kZWYgUl9QUENfQUREUjE2CisjdW5kZWYgUl9QUENfQUREUjE2X0xPCisjdW5kZWYgUl9QUENfQUREUjE2X0hJCisjdW5kZWYgUl9QUENfQUREUjE2X0hBCisjdW5kZWYgUl9QUENfQUREUjE0CisjdW5kZWYgUl9QUENfQUREUjE0X0JSVEFLRU4KKyN1bmRlZiBSX1BQQ19BRERSMTRfQlJOVEFLRU4KKyN1bmRlZiBSX1BQQ19SRUwyNAorI3VuZGVmIFJfUFBDX1JFTDE0CisjdW5kZWYgUl9QUENfUkVMMTRfQlJUQUtFTgorI3VuZGVmIFJfUFBDX1JFTDE0X0JSTlRBS0VOCisjdW5kZWYgUl9QUENfR09UMTYKKyN1bmRlZiBSX1BQQ19HT1QxNl9MTworI3VuZGVmIFJfUFBDX0dPVDE2X0hJCisjdW5kZWYgUl9QUENfR09UMTZfSEEKKyN1bmRlZiBSX1BQQ19QTFRSRUwyNAorI3VuZGVmIFJfUFBDX0pNUF9TTE9UCisjdW5kZWYgUl9QUENfTE9DQUwyNFBDCisjdW5kZWYgUl9QUENfUkVMMzIKKyN1bmRlZiBSX1BQQ19UTFMKKyN1bmRlZiBSX1BQQ19EVFBNT0QzMgorI3VuZGVmIFJfUFBDX1RQUkVMMTYKKyN1bmRlZiBSX1BQQ19UUFJFTDE2X0xPCisjdW5kZWYgUl9QUENfVFBSRUwxNl9ISQorI3VuZGVmIFJfUFBDX1RQUkVMMTZfSEEKKyN1bmRlZiBSX1BQQ19UUFJFTDMyCisjdW5kZWYgUl9QUENfRFRQUkVMMTYKKyN1bmRlZiBSX1BQQ19EVFBSRUwxNl9MTworI3VuZGVmIFJfUFBDX0RUUFJFTDE2X0hJCisjdW5kZWYgUl9QUENfRFRQUkVMMTZfSEEKKyN1bmRlZiBSX1BQQ19EVFBSRUwzMgorI3VuZGVmIFJfUFBDX0dPVF9UTFNHRDE2CisjdW5kZWYgUl9QUENfR09UX1RMU0dEMTZfTE8KKyN1bmRlZiBSX1BQQ19HT1RfVExTR0QxNl9ISQorI3VuZGVmIFJfUFBDX0dPVF9UTFNHRDE2X0hBCisjdW5kZWYgUl9QUENfR09UX1RMU0xEMTYKKyN1bmRlZiBSX1BQQ19HT1RfVExTTEQxNl9MTworI3VuZGVmIFJfUFBDX0dPVF9UTFNMRDE2X0hJCisjdW5kZWYgUl9QUENfR09UX1RMU0xEMTZfSEEKKyN1bmRlZiBSX1BQQ19HT1RfVFBSRUwxNgorI3VuZGVmIFJfUFBDX0dPVF9UUFJFTDE2X0xPCisjdW5kZWYgUl9QUENfR09UX1RQUkVMMTZfSEkKKyN1bmRlZiBSX1BQQ19HT1RfVFBSRUwxNl9IQQorI3VuZGVmIFJfUFBDX0dPVF9EVFBSRUwxNgorI3VuZGVmIFJfUFBDX0dPVF9EVFBSRUwxNl9MTworI3VuZGVmIFJfUFBDX0dPVF9EVFBSRUwxNl9ISQorI3VuZGVmIFJfUFBDX0dPVF9EVFBSRUwxNl9IQQorI3VuZGVmIFJfUFBDX1RMU0dECisjdW5kZWYgUl9QUENfVExTTEQKKyN1bmRlZiBSX1BQQ19SRUwxNgorI3VuZGVmIFJfUFBDX1JFTDE2X0xPCisjdW5kZWYgUl9QUENfUkVMMTZfSEkKKyN1bmRlZiBSX1BQQ19SRUwxNl9IQQorCitFTEZfUkVMT0MoUl9QUENfTk9ORSwgICAgICAgICAgICAgICAgICAgMCkgICAgICAvKiBObyByZWxvY2F0aW9uLiAqLworRUxGX1JFTE9DKFJfUFBDX0FERFIzMiwgICAgICAgICAgICAgICAgIDEpCitFTEZfUkVMT0MoUl9QUENfQUREUjI0LCAgICAgICAgICAgICAgICAgMikKK0VMRl9SRUxPQyhSX1BQQ19BRERSMTYsICAgICAgICAgICAgICAgICAzKQorRUxGX1JFTE9DKFJfUFBDX0FERFIxNl9MTywgICAgICAgICAgICAgIDQpCitFTEZfUkVMT0MoUl9QUENfQUREUjE2X0hJLCAgICAgICAgICAgICAgNSkKK0VMRl9SRUxPQyhSX1BQQ19BRERSMTZfSEEsICAgICAgICAgICAgICA2KQorRUxGX1JFTE9DKFJfUFBDX0FERFIxNCwgICAgICAgICAgICAgICAgIDcpCitFTEZfUkVMT0MoUl9QUENfQUREUjE0X0JSVEFLRU4sICAgICAgICAgOCkKK0VMRl9SRUxPQyhSX1BQQ19BRERSMTRfQlJOVEFLRU4sICAgICAgICA5KQorRUxGX1JFTE9DKFJfUFBDX1JFTDI0LCAgICAgICAgICAgICAgICAgIDEwKQorRUxGX1JFTE9DKFJfUFBDX1JFTDE0LCAgICAgICAgICAgICAgICAgIDExKQorRUxGX1JFTE9DKFJfUFBDX1JFTDE0X0JSVEFLRU4sICAgICAgICAgIDEyKQorRUxGX1JFTE9DKFJfUFBDX1JFTDE0X0JSTlRBS0VOLCAgICAgICAgIDEzKQorRUxGX1JFTE9DKFJfUFBDX0dPVDE2LCAgICAgICAgICAgICAgICAgIDE0KQorRUxGX1JFTE9DKFJfUFBDX0dPVDE2X0xPLCAgICAgICAgICAgICAgIDE1KQorRUxGX1JFTE9DKFJfUFBDX0dPVDE2X0hJLCAgICAgICAgICAgICAgIDE2KQorRUxGX1JFTE9DKFJfUFBDX0dPVDE2X0hBLCAgICAgICAgICAgICAgIDE3KQorRUxGX1JFTE9DKFJfUFBDX1BMVFJFTDI0LCAgICAgICAgICAgICAgIDE4KQorRUxGX1JFTE9DKFJfUFBDX0pNUF9TTE9ULCAgICAgICAgICAgICAgIDIxKQorRUxGX1JFTE9DKFJfUFBDX0xPQ0FMMjRQQywgICAgICAgICAgICAgIDIzKQorRUxGX1JFTE9DKFJfUFBDX1JFTDMyLCAgICAgICAgICAgICAgICAgIDI2KQorRUxGX1JFTE9DKFJfUFBDX1RMUywgICAgICAgICAgICAgICAgICAgIDY3KQorRUxGX1JFTE9DKFJfUFBDX0RUUE1PRDMyLCAgICAgICAgICAgICAgIDY4KQorRUxGX1JFTE9DKFJfUFBDX1RQUkVMMTYsICAgICAgICAgICAgICAgIDY5KQorRUxGX1JFTE9DKFJfUFBDX1RQUkVMMTZfTE8sICAgICAgICAgICAgIDcwKQorRUxGX1JFTE9DKFJfUFBDX1RQUkVMMTZfSEksICAgICAgICAgICAgIDcxKQorRUxGX1JFTE9DKFJfUFBDX1RQUkVMMTZfSEEsICAgICAgICAgICAgIDcyKQorRUxGX1JFTE9DKFJfUFBDX1RQUkVMMzIsICAgICAgICAgICAgICAgIDczKQorRUxGX1JFTE9DKFJfUFBDX0RUUFJFTDE2LCAgICAgICAgICAgICAgIDc0KQorRUxGX1JFTE9DKFJfUFBDX0RUUFJFTDE2X0xPLCAgICAgICAgICAgIDc1KQorRUxGX1JFTE9DKFJfUFBDX0RUUFJFTDE2X0hJLCAgICAgICAgICAgIDc2KQorRUxGX1JFTE9DKFJfUFBDX0RUUFJFTDE2X0hBLCAgICAgICAgICAgIDc3KQorRUxGX1JFTE9DKFJfUFBDX0RUUFJFTDMyLCAgICAgICAgICAgICAgIDc4KQorRUxGX1JFTE9DKFJfUFBDX0dPVF9UTFNHRDE2LCAgICAgICAgICAgIDc5KQorRUxGX1JFTE9DKFJfUFBDX0dPVF9UTFNHRDE2X0xPLCAgICAgICAgIDgwKQorRUxGX1JFTE9DKFJfUFBDX0dPVF9UTFNHRDE2X0hJLCAgICAgICAgIDgxKQorRUxGX1JFTE9DKFJfUFBDX0dPVF9UTFNHRDE2X0hBLCAgICAgICAgIDgyKQorRUxGX1JFTE9DKFJfUFBDX0dPVF9UTFNMRDE2LCAgICAgICAgICAgIDgzKQorRUxGX1JFTE9DKFJfUFBDX0dPVF9UTFNMRDE2X0xPLCAgICAgICAgIDg0KQorRUxGX1JFTE9DKFJfUFBDX0dPVF9UTFNMRDE2X0hJLCAgICAgICAgIDg1KQorRUxGX1JFTE9DKFJfUFBDX0dPVF9UTFNMRDE2X0hBLCAgICAgICAgIDg2KQorRUxGX1JFTE9DKFJfUFBDX0dPVF9UUFJFTDE2LCAgICAgICAgICAgIDg3KQorRUxGX1JFTE9DKFJfUFBDX0dPVF9UUFJFTDE2X0xPLCAgICAgICAgIDg4KQorRUxGX1JFTE9DKFJfUFBDX0dPVF9UUFJFTDE2X0hJLCAgICAgICAgIDg5KQorRUxGX1JFTE9DKFJfUFBDX0dPVF9UUFJFTDE2X0hBLCAgICAgICAgIDkwKQorRUxGX1JFTE9DKFJfUFBDX0dPVF9EVFBSRUwxNiwgICAgICAgICAgIDkxKQorRUxGX1JFTE9DKFJfUFBDX0dPVF9EVFBSRUwxNl9MTywgICAgICAgIDkyKQorRUxGX1JFTE9DKFJfUFBDX0dPVF9EVFBSRUwxNl9ISSwgICAgICAgIDkzKQorRUxGX1JFTE9DKFJfUFBDX0dPVF9EVFBSRUwxNl9IQSwgICAgICAgIDk0KQorRUxGX1JFTE9DKFJfUFBDX1RMU0dELCAgICAgICAgICAgICAgICAgIDk1KQorRUxGX1JFTE9DKFJfUFBDX1RMU0xELCAgICAgICAgICAgICAgICAgIDk2KQorRUxGX1JFTE9DKFJfUFBDX1JFTDE2LCAgICAgICAgICAgICAgICAgIDI0OSkKK0VMRl9SRUxPQyhSX1BQQ19SRUwxNl9MTywgICAgICAgICAgICAgICAyNTApCitFTEZfUkVMT0MoUl9QUENfUkVMMTZfSEksICAgICAgICAgICAgICAgMjUxKQorRUxGX1JFTE9DKFJfUFBDX1JFTDE2X0hBLCAgICAgICAgICAgICAgIDI1MikKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9Qb3dlclBDNjQuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL1Bvd2VyUEM2NC5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0N2M1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9Qb3dlclBDNjQuZGVmCkBAIC0wLDAgKzEsMTgxIEBACisKKyNpZm5kZWYgRUxGX1JFTE9DCisjZXJyb3IgIkVMRl9SRUxPQyBtdXN0IGJlIGRlZmluZWQiCisjZW5kaWYKKworLy8gZ2xpYmMncyBQb3dlclBDIGFzbS9zaWdjb250ZXh0LmgsIHdoZW4gY29tcGlsaW5nIGZvciBQUEM2NCwgaGFzIHRoZQorLy8gdW5mb3J0dW5hdGUgYmVoYXZpb3Igb2YgaW5jbHVkaW5nIGFzbS9lbGYuaCwgd2hpY2ggZGVmaW5lcyBSX1BQQ19OT05FLCBldGMuCisvLyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGludGVnZXIgdmFsdWVzLiBBcyBhIHJlc3VsdCwgd2UgbmVlZCB0byB1bmRlZiB0aGVtCisvLyBoZXJlIGJlZm9yZSBjb250aW51aW5nLgorCisjdW5kZWYgUl9QUEM2NF9OT05FCisjdW5kZWYgUl9QUEM2NF9BRERSMzIKKyN1bmRlZiBSX1BQQzY0X0FERFIyNAorI3VuZGVmIFJfUFBDNjRfQUREUjE2CisjdW5kZWYgUl9QUEM2NF9BRERSMTZfTE8KKyN1bmRlZiBSX1BQQzY0X0FERFIxNl9ISQorI3VuZGVmIFJfUFBDNjRfQUREUjE2X0hBCisjdW5kZWYgUl9QUEM2NF9BRERSMTQKKyN1bmRlZiBSX1BQQzY0X0FERFIxNF9CUlRBS0VOCisjdW5kZWYgUl9QUEM2NF9BRERSMTRfQlJOVEFLRU4KKyN1bmRlZiBSX1BQQzY0X1JFTDI0CisjdW5kZWYgUl9QUEM2NF9SRUwxNAorI3VuZGVmIFJfUFBDNjRfUkVMMTRfQlJUQUtFTgorI3VuZGVmIFJfUFBDNjRfUkVMMTRfQlJOVEFLRU4KKyN1bmRlZiBSX1BQQzY0X0dPVDE2CisjdW5kZWYgUl9QUEM2NF9HT1QxNl9MTworI3VuZGVmIFJfUFBDNjRfR09UMTZfSEkKKyN1bmRlZiBSX1BQQzY0X0dPVDE2X0hBCisjdW5kZWYgUl9QUEM2NF9HTE9CX0RBVAorI3VuZGVmIFJfUFBDNjRfSk1QX1NMT1QKKyN1bmRlZiBSX1BQQzY0X1JFTEFUSVZFCisjdW5kZWYgUl9QUEM2NF9SRUwzMgorI3VuZGVmIFJfUFBDNjRfQUREUjY0CisjdW5kZWYgUl9QUEM2NF9BRERSMTZfSElHSEVSCisjdW5kZWYgUl9QUEM2NF9BRERSMTZfSElHSEVSQQorI3VuZGVmIFJfUFBDNjRfQUREUjE2X0hJR0hFU1QKKyN1bmRlZiBSX1BQQzY0X0FERFIxNl9ISUdIRVNUQQorI3VuZGVmIFJfUFBDNjRfUkVMNjQKKyN1bmRlZiBSX1BQQzY0X1RPQzE2CisjdW5kZWYgUl9QUEM2NF9UT0MxNl9MTworI3VuZGVmIFJfUFBDNjRfVE9DMTZfSEkKKyN1bmRlZiBSX1BQQzY0X1RPQzE2X0hBCisjdW5kZWYgUl9QUEM2NF9UT0MKKyN1bmRlZiBSX1BQQzY0X0FERFIxNl9EUworI3VuZGVmIFJfUFBDNjRfQUREUjE2X0xPX0RTCisjdW5kZWYgUl9QUEM2NF9HT1QxNl9EUworI3VuZGVmIFJfUFBDNjRfR09UMTZfTE9fRFMKKyN1bmRlZiBSX1BQQzY0X1RPQzE2X0RTCisjdW5kZWYgUl9QUEM2NF9UT0MxNl9MT19EUworI3VuZGVmIFJfUFBDNjRfVExTCisjdW5kZWYgUl9QUEM2NF9EVFBNT0Q2NAorI3VuZGVmIFJfUFBDNjRfVFBSRUwxNgorI3VuZGVmIFJfUFBDNjRfVFBSRUwxNl9MTworI3VuZGVmIFJfUFBDNjRfVFBSRUwxNl9ISQorI3VuZGVmIFJfUFBDNjRfVFBSRUwxNl9IQQorI3VuZGVmIFJfUFBDNjRfVFBSRUw2NAorI3VuZGVmIFJfUFBDNjRfRFRQUkVMMTYKKyN1bmRlZiBSX1BQQzY0X0RUUFJFTDE2X0xPCisjdW5kZWYgUl9QUEM2NF9EVFBSRUwxNl9ISQorI3VuZGVmIFJfUFBDNjRfRFRQUkVMMTZfSEEKKyN1bmRlZiBSX1BQQzY0X0RUUFJFTDY0CisjdW5kZWYgUl9QUEM2NF9HT1RfVExTR0QxNgorI3VuZGVmIFJfUFBDNjRfR09UX1RMU0dEMTZfTE8KKyN1bmRlZiBSX1BQQzY0X0dPVF9UTFNHRDE2X0hJCisjdW5kZWYgUl9QUEM2NF9HT1RfVExTR0QxNl9IQQorI3VuZGVmIFJfUFBDNjRfR09UX1RMU0xEMTYKKyN1bmRlZiBSX1BQQzY0X0dPVF9UTFNMRDE2X0xPCisjdW5kZWYgUl9QUEM2NF9HT1RfVExTTEQxNl9ISQorI3VuZGVmIFJfUFBDNjRfR09UX1RMU0xEMTZfSEEKKyN1bmRlZiBSX1BQQzY0X0dPVF9UUFJFTDE2X0RTCisjdW5kZWYgUl9QUEM2NF9HT1RfVFBSRUwxNl9MT19EUworI3VuZGVmIFJfUFBDNjRfR09UX1RQUkVMMTZfSEkKKyN1bmRlZiBSX1BQQzY0X0dPVF9UUFJFTDE2X0hBCisjdW5kZWYgUl9QUEM2NF9HT1RfRFRQUkVMMTZfRFMKKyN1bmRlZiBSX1BQQzY0X0dPVF9EVFBSRUwxNl9MT19EUworI3VuZGVmIFJfUFBDNjRfR09UX0RUUFJFTDE2X0hJCisjdW5kZWYgUl9QUEM2NF9HT1RfRFRQUkVMMTZfSEEKKyN1bmRlZiBSX1BQQzY0X1RQUkVMMTZfRFMKKyN1bmRlZiBSX1BQQzY0X1RQUkVMMTZfTE9fRFMKKyN1bmRlZiBSX1BQQzY0X1RQUkVMMTZfSElHSEVSCisjdW5kZWYgUl9QUEM2NF9UUFJFTDE2X0hJR0hFUkEKKyN1bmRlZiBSX1BQQzY0X1RQUkVMMTZfSElHSEVTVAorI3VuZGVmIFJfUFBDNjRfVFBSRUwxNl9ISUdIRVNUQQorI3VuZGVmIFJfUFBDNjRfRFRQUkVMMTZfRFMKKyN1bmRlZiBSX1BQQzY0X0RUUFJFTDE2X0xPX0RTCisjdW5kZWYgUl9QUEM2NF9EVFBSRUwxNl9ISUdIRVIKKyN1bmRlZiBSX1BQQzY0X0RUUFJFTDE2X0hJR0hFUkEKKyN1bmRlZiBSX1BQQzY0X0RUUFJFTDE2X0hJR0hFU1QKKyN1bmRlZiBSX1BQQzY0X0RUUFJFTDE2X0hJR0hFU1RBCisjdW5kZWYgUl9QUEM2NF9UTFNHRAorI3VuZGVmIFJfUFBDNjRfVExTTEQKKyN1bmRlZiBSX1BQQzY0X1JFTDE2CisjdW5kZWYgUl9QUEM2NF9SRUwxNl9MTworI3VuZGVmIFJfUFBDNjRfUkVMMTZfSEkKKyN1bmRlZiBSX1BQQzY0X1JFTDE2X0hBCisKK0VMRl9SRUxPQyhSX1BQQzY0X05PTkUsICAgICAgICAgICAgICAgICAwKQorRUxGX1JFTE9DKFJfUFBDNjRfQUREUjMyLCAgICAgICAgICAgICAgIDEpCitFTEZfUkVMT0MoUl9QUEM2NF9BRERSMjQsICAgICAgICAgICAgICAgMikKK0VMRl9SRUxPQyhSX1BQQzY0X0FERFIxNiwgICAgICAgICAgICAgICAzKQorRUxGX1JFTE9DKFJfUFBDNjRfQUREUjE2X0xPLCAgICAgICAgICAgIDQpCitFTEZfUkVMT0MoUl9QUEM2NF9BRERSMTZfSEksICAgICAgICAgICAgNSkKK0VMRl9SRUxPQyhSX1BQQzY0X0FERFIxNl9IQSwgICAgICAgICAgICA2KQorRUxGX1JFTE9DKFJfUFBDNjRfQUREUjE0LCAgICAgICAgICAgICAgIDcpCitFTEZfUkVMT0MoUl9QUEM2NF9BRERSMTRfQlJUQUtFTiwgICAgICAgOCkKK0VMRl9SRUxPQyhSX1BQQzY0X0FERFIxNF9CUk5UQUtFTiwgICAgICA5KQorRUxGX1JFTE9DKFJfUFBDNjRfUkVMMjQsICAgICAgICAgICAgICAgIDEwKQorRUxGX1JFTE9DKFJfUFBDNjRfUkVMMTQsICAgICAgICAgICAgICAgIDExKQorRUxGX1JFTE9DKFJfUFBDNjRfUkVMMTRfQlJUQUtFTiwgICAgICAgIDEyKQorRUxGX1JFTE9DKFJfUFBDNjRfUkVMMTRfQlJOVEFLRU4sICAgICAgIDEzKQorRUxGX1JFTE9DKFJfUFBDNjRfR09UMTYsICAgICAgICAgICAgICAgIDE0KQorRUxGX1JFTE9DKFJfUFBDNjRfR09UMTZfTE8sICAgICAgICAgICAgIDE1KQorRUxGX1JFTE9DKFJfUFBDNjRfR09UMTZfSEksICAgICAgICAgICAgIDE2KQorRUxGX1JFTE9DKFJfUFBDNjRfR09UMTZfSEEsICAgICAgICAgICAgIDE3KQorRUxGX1JFTE9DKFJfUFBDNjRfR0xPQl9EQVQsICAgICAgICAgICAgIDIwKQorRUxGX1JFTE9DKFJfUFBDNjRfSk1QX1NMT1QsICAgICAgICAgICAgIDIxKQorRUxGX1JFTE9DKFJfUFBDNjRfUkVMQVRJVkUsICAgICAgICAgICAgIDIyKQorRUxGX1JFTE9DKFJfUFBDNjRfUkVMMzIsICAgICAgICAgICAgICAgIDI2KQorRUxGX1JFTE9DKFJfUFBDNjRfQUREUjY0LCAgICAgICAgICAgICAgIDM4KQorRUxGX1JFTE9DKFJfUFBDNjRfQUREUjE2X0hJR0hFUiwgICAgICAgIDM5KQorRUxGX1JFTE9DKFJfUFBDNjRfQUREUjE2X0hJR0hFUkEsICAgICAgIDQwKQorRUxGX1JFTE9DKFJfUFBDNjRfQUREUjE2X0hJR0hFU1QsICAgICAgIDQxKQorRUxGX1JFTE9DKFJfUFBDNjRfQUREUjE2X0hJR0hFU1RBLCAgICAgIDQyKQorRUxGX1JFTE9DKFJfUFBDNjRfUkVMNjQsICAgICAgICAgICAgICAgIDQ0KQorRUxGX1JFTE9DKFJfUFBDNjRfVE9DMTYsICAgICAgICAgICAgICAgIDQ3KQorRUxGX1JFTE9DKFJfUFBDNjRfVE9DMTZfTE8sICAgICAgICAgICAgIDQ4KQorRUxGX1JFTE9DKFJfUFBDNjRfVE9DMTZfSEksICAgICAgICAgICAgIDQ5KQorRUxGX1JFTE9DKFJfUFBDNjRfVE9DMTZfSEEsICAgICAgICAgICAgIDUwKQorRUxGX1JFTE9DKFJfUFBDNjRfVE9DLCAgICAgICAgICAgICAgICAgIDUxKQorRUxGX1JFTE9DKFJfUFBDNjRfQUREUjE2X0RTLCAgICAgICAgICAgIDU2KQorRUxGX1JFTE9DKFJfUFBDNjRfQUREUjE2X0xPX0RTLCAgICAgICAgIDU3KQorRUxGX1JFTE9DKFJfUFBDNjRfR09UMTZfRFMsICAgICAgICAgICAgIDU4KQorRUxGX1JFTE9DKFJfUFBDNjRfR09UMTZfTE9fRFMsICAgICAgICAgIDU5KQorRUxGX1JFTE9DKFJfUFBDNjRfVE9DMTZfRFMsICAgICAgICAgICAgIDYzKQorRUxGX1JFTE9DKFJfUFBDNjRfVE9DMTZfTE9fRFMsICAgICAgICAgIDY0KQorRUxGX1JFTE9DKFJfUFBDNjRfVExTLCAgICAgICAgICAgICAgICAgIDY3KQorRUxGX1JFTE9DKFJfUFBDNjRfRFRQTU9ENjQsICAgICAgICAgICAgIDY4KQorRUxGX1JFTE9DKFJfUFBDNjRfVFBSRUwxNiwgICAgICAgICAgICAgIDY5KQorRUxGX1JFTE9DKFJfUFBDNjRfVFBSRUwxNl9MTywgICAgICAgICAgIDcwKQorRUxGX1JFTE9DKFJfUFBDNjRfVFBSRUwxNl9ISSwgICAgICAgICAgIDcxKQorRUxGX1JFTE9DKFJfUFBDNjRfVFBSRUwxNl9IQSwgICAgICAgICAgIDcyKQorRUxGX1JFTE9DKFJfUFBDNjRfVFBSRUw2NCwgICAgICAgICAgICAgIDczKQorRUxGX1JFTE9DKFJfUFBDNjRfRFRQUkVMMTYsICAgICAgICAgICAgIDc0KQorRUxGX1JFTE9DKFJfUFBDNjRfRFRQUkVMMTZfTE8sICAgICAgICAgIDc1KQorRUxGX1JFTE9DKFJfUFBDNjRfRFRQUkVMMTZfSEksICAgICAgICAgIDc2KQorRUxGX1JFTE9DKFJfUFBDNjRfRFRQUkVMMTZfSEEsICAgICAgICAgIDc3KQorRUxGX1JFTE9DKFJfUFBDNjRfRFRQUkVMNjQsICAgICAgICAgICAgIDc4KQorRUxGX1JFTE9DKFJfUFBDNjRfR09UX1RMU0dEMTYsICAgICAgICAgIDc5KQorRUxGX1JFTE9DKFJfUFBDNjRfR09UX1RMU0dEMTZfTE8sICAgICAgIDgwKQorRUxGX1JFTE9DKFJfUFBDNjRfR09UX1RMU0dEMTZfSEksICAgICAgIDgxKQorRUxGX1JFTE9DKFJfUFBDNjRfR09UX1RMU0dEMTZfSEEsICAgICAgIDgyKQorRUxGX1JFTE9DKFJfUFBDNjRfR09UX1RMU0xEMTYsICAgICAgICAgIDgzKQorRUxGX1JFTE9DKFJfUFBDNjRfR09UX1RMU0xEMTZfTE8sICAgICAgIDg0KQorRUxGX1JFTE9DKFJfUFBDNjRfR09UX1RMU0xEMTZfSEksICAgICAgIDg1KQorRUxGX1JFTE9DKFJfUFBDNjRfR09UX1RMU0xEMTZfSEEsICAgICAgIDg2KQorRUxGX1JFTE9DKFJfUFBDNjRfR09UX1RQUkVMMTZfRFMsICAgICAgIDg3KQorRUxGX1JFTE9DKFJfUFBDNjRfR09UX1RQUkVMMTZfTE9fRFMsICAgIDg4KQorRUxGX1JFTE9DKFJfUFBDNjRfR09UX1RQUkVMMTZfSEksICAgICAgIDg5KQorRUxGX1JFTE9DKFJfUFBDNjRfR09UX1RQUkVMMTZfSEEsICAgICAgIDkwKQorRUxGX1JFTE9DKFJfUFBDNjRfR09UX0RUUFJFTDE2X0RTLCAgICAgIDkxKQorRUxGX1JFTE9DKFJfUFBDNjRfR09UX0RUUFJFTDE2X0xPX0RTLCAgIDkyKQorRUxGX1JFTE9DKFJfUFBDNjRfR09UX0RUUFJFTDE2X0hJLCAgICAgIDkzKQorRUxGX1JFTE9DKFJfUFBDNjRfR09UX0RUUFJFTDE2X0hBLCAgICAgIDk0KQorRUxGX1JFTE9DKFJfUFBDNjRfVFBSRUwxNl9EUywgICAgICAgICAgIDk1KQorRUxGX1JFTE9DKFJfUFBDNjRfVFBSRUwxNl9MT19EUywgICAgICAgIDk2KQorRUxGX1JFTE9DKFJfUFBDNjRfVFBSRUwxNl9ISUdIRVIsICAgICAgIDk3KQorRUxGX1JFTE9DKFJfUFBDNjRfVFBSRUwxNl9ISUdIRVJBLCAgICAgIDk4KQorRUxGX1JFTE9DKFJfUFBDNjRfVFBSRUwxNl9ISUdIRVNULCAgICAgIDk5KQorRUxGX1JFTE9DKFJfUFBDNjRfVFBSRUwxNl9ISUdIRVNUQSwgICAgIDEwMCkKK0VMRl9SRUxPQyhSX1BQQzY0X0RUUFJFTDE2X0RTLCAgICAgICAgICAxMDEpCitFTEZfUkVMT0MoUl9QUEM2NF9EVFBSRUwxNl9MT19EUywgICAgICAgMTAyKQorRUxGX1JFTE9DKFJfUFBDNjRfRFRQUkVMMTZfSElHSEVSLCAgICAgIDEwMykKK0VMRl9SRUxPQyhSX1BQQzY0X0RUUFJFTDE2X0hJR0hFUkEsICAgICAxMDQpCitFTEZfUkVMT0MoUl9QUEM2NF9EVFBSRUwxNl9ISUdIRVNULCAgICAgMTA1KQorRUxGX1JFTE9DKFJfUFBDNjRfRFRQUkVMMTZfSElHSEVTVEEsICAgIDEwNikKK0VMRl9SRUxPQyhSX1BQQzY0X1RMU0dELCAgICAgICAgICAgICAgICAxMDcpCitFTEZfUkVMT0MoUl9QUEM2NF9UTFNMRCwgICAgICAgICAgICAgICAgMTA4KQorRUxGX1JFTE9DKFJfUFBDNjRfUkVMMTYsICAgICAgICAgICAgICAgIDI0OSkKK0VMRl9SRUxPQyhSX1BQQzY0X1JFTDE2X0xPLCAgICAgICAgICAgICAyNTApCitFTEZfUkVMT0MoUl9QUEM2NF9SRUwxNl9ISSwgICAgICAgICAgICAgMjUxKQorRUxGX1JFTE9DKFJfUFBDNjRfUkVMMTZfSEEsICAgICAgICAgICAgIDI1MikKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9SSVNDVi5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvUklTQ1YuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYzRjMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvUklTQ1YuZGVmCkBAIC0wLDAgKzEsNTkgQEAKKworI2lmbmRlZiBFTEZfUkVMT0MKKyNlcnJvciAiRUxGX1JFTE9DIG11c3QgYmUgZGVmaW5lZCIKKyNlbmRpZgorCitFTEZfUkVMT0MoUl9SSVNDVl9OT05FLCAgICAgICAgICAgICAgIDApCitFTEZfUkVMT0MoUl9SSVNDVl8zMiwgICAgICAgICAgICAgICAgIDEpCitFTEZfUkVMT0MoUl9SSVNDVl82NCwgICAgICAgICAgICAgICAgIDIpCitFTEZfUkVMT0MoUl9SSVNDVl9SRUxBVElWRSwgICAgICAgICAgIDMpCitFTEZfUkVMT0MoUl9SSVNDVl9DT1BZLCAgICAgICAgICAgICAgIDQpCitFTEZfUkVMT0MoUl9SSVNDVl9KVU1QX1NMT1QsICAgICAgICAgIDUpCitFTEZfUkVMT0MoUl9SSVNDVl9UTFNfRFRQTU9EMzIsICAgICAgIDYpCitFTEZfUkVMT0MoUl9SSVNDVl9UTFNfRFRQTU9ENjQsICAgICAgIDcpCitFTEZfUkVMT0MoUl9SSVNDVl9UTFNfRFRQUkVMMzIsICAgICAgIDgpCitFTEZfUkVMT0MoUl9SSVNDVl9UTFNfRFRQUkVMNjQsICAgICAgIDkpCitFTEZfUkVMT0MoUl9SSVNDVl9UTFNfVFBSRUwzMiwgICAgICAgMTApCitFTEZfUkVMT0MoUl9SSVNDVl9UTFNfVFBSRUw2NCwgICAgICAgMTEpCitFTEZfUkVMT0MoUl9SSVNDVl9CUkFOQ0gsICAgICAgICAgICAgMTYpCitFTEZfUkVMT0MoUl9SSVNDVl9KQUwsICAgICAgICAgICAgICAgMTcpCitFTEZfUkVMT0MoUl9SSVNDVl9DQUxMLCAgICAgICAgICAgICAgMTgpCitFTEZfUkVMT0MoUl9SSVNDVl9DQUxMX1BMVCwgICAgICAgICAgMTkpCitFTEZfUkVMT0MoUl9SSVNDVl9HT1RfSEkyMCwgICAgICAgICAgMjApCitFTEZfUkVMT0MoUl9SSVNDVl9UTFNfR09UX0hJMjAsICAgICAgMjEpCitFTEZfUkVMT0MoUl9SSVNDVl9UTFNfR0RfSEkyMCwgICAgICAgMjIpCitFTEZfUkVMT0MoUl9SSVNDVl9QQ1JFTF9ISTIwLCAgICAgICAgMjMpCitFTEZfUkVMT0MoUl9SSVNDVl9QQ1JFTF9MTzEyX0ksICAgICAgMjQpCitFTEZfUkVMT0MoUl9SSVNDVl9QQ1JFTF9MTzEyX1MsICAgICAgMjUpCitFTEZfUkVMT0MoUl9SSVNDVl9ISTIwLCAgICAgICAgICAgICAgMjYpCitFTEZfUkVMT0MoUl9SSVNDVl9MTzEyX0ksICAgICAgICAgICAgMjcpCitFTEZfUkVMT0MoUl9SSVNDVl9MTzEyX1MsICAgICAgICAgICAgMjgpCitFTEZfUkVMT0MoUl9SSVNDVl9UUFJFTF9ISTIwLCAgICAgICAgMjkpCitFTEZfUkVMT0MoUl9SSVNDVl9UUFJFTF9MTzEyX0ksICAgICAgMzApCitFTEZfUkVMT0MoUl9SSVNDVl9UUFJFTF9MTzEyX1MsICAgICAgMzEpCitFTEZfUkVMT0MoUl9SSVNDVl9UUFJFTF9BREQsICAgICAgICAgMzIpCitFTEZfUkVMT0MoUl9SSVNDVl9BREQ4LCAgICAgICAgICAgICAgMzMpCitFTEZfUkVMT0MoUl9SSVNDVl9BREQxNiwgICAgICAgICAgICAgMzQpCitFTEZfUkVMT0MoUl9SSVNDVl9BREQzMiwgICAgICAgICAgICAgMzUpCitFTEZfUkVMT0MoUl9SSVNDVl9BREQ2NCwgICAgICAgICAgICAgMzYpCitFTEZfUkVMT0MoUl9SSVNDVl9TVUI4LCAgICAgICAgICAgICAgMzcpCitFTEZfUkVMT0MoUl9SSVNDVl9TVUIxNiwgICAgICAgICAgICAgMzgpCitFTEZfUkVMT0MoUl9SSVNDVl9TVUIzMiwgICAgICAgICAgICAgMzkpCitFTEZfUkVMT0MoUl9SSVNDVl9TVUI2NCwgICAgICAgICAgICAgNDApCitFTEZfUkVMT0MoUl9SSVNDVl9HTlVfVlRJTkhFUklULCAgICAgNDEpCitFTEZfUkVMT0MoUl9SSVNDVl9HTlVfVlRFTlRSWSwgICAgICAgNDIpCitFTEZfUkVMT0MoUl9SSVNDVl9BTElHTiwgICAgICAgICAgICAgNDMpCitFTEZfUkVMT0MoUl9SSVNDVl9SVkNfQlJBTkNILCAgICAgICAgNDQpCitFTEZfUkVMT0MoUl9SSVNDVl9SVkNfSlVNUCwgICAgICAgICAgNDUpCitFTEZfUkVMT0MoUl9SSVNDVl9SVkNfTFVJLCAgICAgICAgICAgNDYpCitFTEZfUkVMT0MoUl9SSVNDVl9HUFJFTF9JLCAgICAgICAgICAgNDcpCitFTEZfUkVMT0MoUl9SSVNDVl9HUFJFTF9TLCAgICAgICAgICAgNDgpCitFTEZfUkVMT0MoUl9SSVNDVl9UUFJFTF9JLCAgICAgICAgICAgNDkpCitFTEZfUkVMT0MoUl9SSVNDVl9UUFJFTF9TLCAgICAgICAgICAgNTApCitFTEZfUkVMT0MoUl9SSVNDVl9SRUxBWCwgICAgICAgICAgICAgNTEpCitFTEZfUkVMT0MoUl9SSVNDVl9TVUI2LCAgICAgICAgICAgICAgNTIpCitFTEZfUkVMT0MoUl9SSVNDVl9TRVQ2LCAgICAgICAgICAgICAgNTMpCitFTEZfUkVMT0MoUl9SSVNDVl9TRVQ4LCAgICAgICAgICAgICAgNTQpCitFTEZfUkVMT0MoUl9SSVNDVl9TRVQxNiwgICAgICAgICAgICAgNTUpCitFTEZfUkVMT0MoUl9SSVNDVl9TRVQzMiwgICAgICAgICAgICAgNTYpCitFTEZfUkVMT0MoUl9SSVNDVl8zMl9QQ1JFTCwgICAgICAgICAgNTcpCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvU3BhcmMuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL1NwYXJjLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTAxYTRhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL1NwYXJjLmRlZgpAQCAtMCwwICsxLDg5IEBACisKKyNpZm5kZWYgRUxGX1JFTE9DCisjZXJyb3IgIkVMRl9SRUxPQyBtdXN0IGJlIGRlZmluZWQiCisjZW5kaWYKKworRUxGX1JFTE9DKFJfU1BBUkNfTk9ORSwgICAgICAgICAwKQorRUxGX1JFTE9DKFJfU1BBUkNfOCwgICAgICAgICAgICAxKQorRUxGX1JFTE9DKFJfU1BBUkNfMTYsICAgICAgICAgICAyKQorRUxGX1JFTE9DKFJfU1BBUkNfMzIsICAgICAgICAgICAzKQorRUxGX1JFTE9DKFJfU1BBUkNfRElTUDgsICAgICAgICA0KQorRUxGX1JFTE9DKFJfU1BBUkNfRElTUDE2LCAgICAgICA1KQorRUxGX1JFTE9DKFJfU1BBUkNfRElTUDMyLCAgICAgICA2KQorRUxGX1JFTE9DKFJfU1BBUkNfV0RJU1AzMCwgICAgICA3KQorRUxGX1JFTE9DKFJfU1BBUkNfV0RJU1AyMiwgICAgICA4KQorRUxGX1JFTE9DKFJfU1BBUkNfSEkyMiwgICAgICAgICA5KQorRUxGX1JFTE9DKFJfU1BBUkNfMjIsICAgICAgICAgICAxMCkKK0VMRl9SRUxPQyhSX1NQQVJDXzEzLCAgICAgICAgICAgMTEpCitFTEZfUkVMT0MoUl9TUEFSQ19MTzEwLCAgICAgICAgIDEyKQorRUxGX1JFTE9DKFJfU1BBUkNfR09UMTAsICAgICAgICAxMykKK0VMRl9SRUxPQyhSX1NQQVJDX0dPVDEzLCAgICAgICAgMTQpCitFTEZfUkVMT0MoUl9TUEFSQ19HT1QyMiwgICAgICAgIDE1KQorRUxGX1JFTE9DKFJfU1BBUkNfUEMxMCwgICAgICAgICAxNikKK0VMRl9SRUxPQyhSX1NQQVJDX1BDMjIsICAgICAgICAgMTcpCitFTEZfUkVMT0MoUl9TUEFSQ19XUExUMzAsICAgICAgIDE4KQorRUxGX1JFTE9DKFJfU1BBUkNfQ09QWSwgICAgICAgICAxOSkKK0VMRl9SRUxPQyhSX1NQQVJDX0dMT0JfREFULCAgICAgMjApCitFTEZfUkVMT0MoUl9TUEFSQ19KTVBfU0xPVCwgICAgIDIxKQorRUxGX1JFTE9DKFJfU1BBUkNfUkVMQVRJVkUsICAgICAyMikKK0VMRl9SRUxPQyhSX1NQQVJDX1VBMzIsICAgICAgICAgMjMpCitFTEZfUkVMT0MoUl9TUEFSQ19QTFQzMiwgICAgICAgIDI0KQorRUxGX1JFTE9DKFJfU1BBUkNfSElQTFQyMiwgICAgICAyNSkKK0VMRl9SRUxPQyhSX1NQQVJDX0xPUExUMTAsICAgICAgMjYpCitFTEZfUkVMT0MoUl9TUEFSQ19QQ1BMVDMyLCAgICAgIDI3KQorRUxGX1JFTE9DKFJfU1BBUkNfUENQTFQyMiwgICAgICAyOCkKK0VMRl9SRUxPQyhSX1NQQVJDX1BDUExUMTAsICAgICAgMjkpCitFTEZfUkVMT0MoUl9TUEFSQ18xMCwgICAgICAgICAgIDMwKQorRUxGX1JFTE9DKFJfU1BBUkNfMTEsICAgICAgICAgICAzMSkKK0VMRl9SRUxPQyhSX1NQQVJDXzY0LCAgICAgICAgICAgMzIpCitFTEZfUkVMT0MoUl9TUEFSQ19PTE8xMCwgICAgICAgIDMzKQorRUxGX1JFTE9DKFJfU1BBUkNfSEgyMiwgICAgICAgICAzNCkKK0VMRl9SRUxPQyhSX1NQQVJDX0hNMTAsICAgICAgICAgMzUpCitFTEZfUkVMT0MoUl9TUEFSQ19MTTIyLCAgICAgICAgIDM2KQorRUxGX1JFTE9DKFJfU1BBUkNfUENfSEgyMiwgICAgICAzNykKK0VMRl9SRUxPQyhSX1NQQVJDX1BDX0hNMTAsICAgICAgMzgpCitFTEZfUkVMT0MoUl9TUEFSQ19QQ19MTTIyLCAgICAgIDM5KQorRUxGX1JFTE9DKFJfU1BBUkNfV0RJU1AxNiwgICAgICA0MCkKK0VMRl9SRUxPQyhSX1NQQVJDX1dESVNQMTksICAgICAgNDEpCitFTEZfUkVMT0MoUl9TUEFSQ183LCAgICAgICAgICAgIDQzKQorRUxGX1JFTE9DKFJfU1BBUkNfNSwgICAgICAgICAgICA0NCkKK0VMRl9SRUxPQyhSX1NQQVJDXzYsICAgICAgICAgICAgNDUpCitFTEZfUkVMT0MoUl9TUEFSQ19ESVNQNjQsICAgICAgIDQ2KQorRUxGX1JFTE9DKFJfU1BBUkNfUExUNjQsICAgICAgICA0NykKK0VMRl9SRUxPQyhSX1NQQVJDX0hJWDIyLCAgICAgICAgNDgpCitFTEZfUkVMT0MoUl9TUEFSQ19MT1gxMCwgICAgICAgIDQ5KQorRUxGX1JFTE9DKFJfU1BBUkNfSDQ0LCAgICAgICAgICA1MCkKK0VMRl9SRUxPQyhSX1NQQVJDX000NCwgICAgICAgICAgNTEpCitFTEZfUkVMT0MoUl9TUEFSQ19MNDQsICAgICAgICAgIDUyKQorRUxGX1JFTE9DKFJfU1BBUkNfUkVHSVNURVIsICAgICA1MykKK0VMRl9SRUxPQyhSX1NQQVJDX1VBNjQsICAgICAgICAgNTQpCitFTEZfUkVMT0MoUl9TUEFSQ19VQTE2LCAgICAgICAgIDU1KQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0dEX0hJMjIsICAgIDU2KQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0dEX0xPMTAsICAgIDU3KQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0dEX0FERCwgICAgIDU4KQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0dEX0NBTEwsICAgIDU5KQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0xETV9ISTIyLCAgIDYwKQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0xETV9MTzEwLCAgIDYxKQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0xETV9BREQsICAgIDYyKQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0xETV9DQUxMLCAgIDYzKQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0xET19ISVgyMiwgIDY0KQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0xET19MT1gxMCwgIDY1KQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0xET19BREQsICAgIDY2KQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0lFX0hJMjIsICAgIDY3KQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0lFX0xPMTAsICAgIDY4KQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0lFX0xELCAgICAgIDY5KQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0lFX0xEWCwgICAgIDcwKQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0lFX0FERCwgICAgIDcxKQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0xFX0hJWDIyLCAgIDcyKQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0xFX0xPWDEwLCAgIDczKQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0RUUE1PRDMyLCAgIDc0KQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0RUUE1PRDY0LCAgIDc1KQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0RUUE9GRjMyLCAgIDc2KQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX0RUUE9GRjY0LCAgIDc3KQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX1RQT0ZGMzIsICAgIDc4KQorRUxGX1JFTE9DKFJfU1BBUkNfVExTX1RQT0ZGNjQsICAgIDc5KQorRUxGX1JFTE9DKFJfU1BBUkNfR09UREFUQV9ISVgyMiwgIDgwKQorRUxGX1JFTE9DKFJfU1BBUkNfR09UREFUQV9MT1gxMCwgIDgxKQorRUxGX1JFTE9DKFJfU1BBUkNfR09UREFUQV9PUF9ISVgyMiwgIDgyKQorRUxGX1JFTE9DKFJfU1BBUkNfR09UREFUQV9PUF9MT1gxMCwgIDgzKQorRUxGX1JFTE9DKFJfU1BBUkNfR09UREFUQV9PUCwgICAgIDg0KQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL1N5c3RlbVouZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL1N5c3RlbVouZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YzBiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvU3lzdGVtWi5kZWYKQEAgLTAsMCArMSw3MSBAQAorCisjaWZuZGVmIEVMRl9SRUxPQworI2Vycm9yICJFTEZfUkVMT0MgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKK0VMRl9SRUxPQyhSXzM5MF9OT05FLCAgICAgICAgICAwKQorRUxGX1JFTE9DKFJfMzkwXzgsICAgICAgICAgICAgIDEpCitFTEZfUkVMT0MoUl8zOTBfMTIsICAgICAgICAgICAgMikKK0VMRl9SRUxPQyhSXzM5MF8xNiwgICAgICAgICAgICAzKQorRUxGX1JFTE9DKFJfMzkwXzMyLCAgICAgICAgICAgIDQpCitFTEZfUkVMT0MoUl8zOTBfUEMzMiwgICAgICAgICAgNSkKK0VMRl9SRUxPQyhSXzM5MF9HT1QxMiwgICAgICAgICA2KQorRUxGX1JFTE9DKFJfMzkwX0dPVDMyLCAgICAgICAgIDcpCitFTEZfUkVMT0MoUl8zOTBfUExUMzIsICAgICAgICAgOCkKK0VMRl9SRUxPQyhSXzM5MF9DT1BZLCAgICAgICAgICA5KQorRUxGX1JFTE9DKFJfMzkwX0dMT0JfREFULCAgICAgMTApCitFTEZfUkVMT0MoUl8zOTBfSk1QX1NMT1QsICAgICAxMSkKK0VMRl9SRUxPQyhSXzM5MF9SRUxBVElWRSwgICAgIDEyKQorRUxGX1JFTE9DKFJfMzkwX0dPVE9GRiwgICAgICAgMTMpCitFTEZfUkVMT0MoUl8zOTBfR09UUEMsICAgICAgICAxNCkKK0VMRl9SRUxPQyhSXzM5MF9HT1QxNiwgICAgICAgIDE1KQorRUxGX1JFTE9DKFJfMzkwX1BDMTYsICAgICAgICAgMTYpCitFTEZfUkVMT0MoUl8zOTBfUEMxNkRCTCwgICAgICAxNykKK0VMRl9SRUxPQyhSXzM5MF9QTFQxNkRCTCwgICAgIDE4KQorRUxGX1JFTE9DKFJfMzkwX1BDMzJEQkwsICAgICAgMTkpCitFTEZfUkVMT0MoUl8zOTBfUExUMzJEQkwsICAgICAyMCkKK0VMRl9SRUxPQyhSXzM5MF9HT1RQQ0RCTCwgICAgIDIxKQorRUxGX1JFTE9DKFJfMzkwXzY0LCAgICAgICAgICAgMjIpCitFTEZfUkVMT0MoUl8zOTBfUEM2NCwgICAgICAgICAyMykKK0VMRl9SRUxPQyhSXzM5MF9HT1Q2NCwgICAgICAgIDI0KQorRUxGX1JFTE9DKFJfMzkwX1BMVDY0LCAgICAgICAgMjUpCitFTEZfUkVMT0MoUl8zOTBfR09URU5ULCAgICAgICAyNikKK0VMRl9SRUxPQyhSXzM5MF9HT1RPRkYxNiwgICAgIDI3KQorRUxGX1JFTE9DKFJfMzkwX0dPVE9GRjY0LCAgICAgMjgpCitFTEZfUkVMT0MoUl8zOTBfR09UUExUMTIsICAgICAyOSkKK0VMRl9SRUxPQyhSXzM5MF9HT1RQTFQxNiwgICAgIDMwKQorRUxGX1JFTE9DKFJfMzkwX0dPVFBMVDMyLCAgICAgMzEpCitFTEZfUkVMT0MoUl8zOTBfR09UUExUNjQsICAgICAzMikKK0VMRl9SRUxPQyhSXzM5MF9HT1RQTFRFTlQsICAgIDMzKQorRUxGX1JFTE9DKFJfMzkwX1BMVE9GRjE2LCAgICAgMzQpCitFTEZfUkVMT0MoUl8zOTBfUExUT0ZGMzIsICAgICAzNSkKK0VMRl9SRUxPQyhSXzM5MF9QTFRPRkY2NCwgICAgIDM2KQorRUxGX1JFTE9DKFJfMzkwX1RMU19MT0FELCAgICAgMzcpCitFTEZfUkVMT0MoUl8zOTBfVExTX0dEQ0FMTCwgICAzOCkKK0VMRl9SRUxPQyhSXzM5MF9UTFNfTERDQUxMLCAgIDM5KQorRUxGX1JFTE9DKFJfMzkwX1RMU19HRDMyLCAgICAgNDApCitFTEZfUkVMT0MoUl8zOTBfVExTX0dENjQsICAgICA0MSkKK0VMRl9SRUxPQyhSXzM5MF9UTFNfR09USUUxMiwgIDQyKQorRUxGX1JFTE9DKFJfMzkwX1RMU19HT1RJRTMyLCAgNDMpCitFTEZfUkVMT0MoUl8zOTBfVExTX0dPVElFNjQsICA0NCkKK0VMRl9SRUxPQyhSXzM5MF9UTFNfTERNMzIsICAgIDQ1KQorRUxGX1JFTE9DKFJfMzkwX1RMU19MRE02NCwgICAgNDYpCitFTEZfUkVMT0MoUl8zOTBfVExTX0lFMzIsICAgICA0NykKK0VMRl9SRUxPQyhSXzM5MF9UTFNfSUU2NCwgICAgIDQ4KQorRUxGX1JFTE9DKFJfMzkwX1RMU19JRUVOVCwgICAgNDkpCitFTEZfUkVMT0MoUl8zOTBfVExTX0xFMzIsICAgICA1MCkKK0VMRl9SRUxPQyhSXzM5MF9UTFNfTEU2NCwgICAgIDUxKQorRUxGX1JFTE9DKFJfMzkwX1RMU19MRE8zMiwgICAgNTIpCitFTEZfUkVMT0MoUl8zOTBfVExTX0xETzY0LCAgICA1MykKK0VMRl9SRUxPQyhSXzM5MF9UTFNfRFRQTU9ELCAgIDU0KQorRUxGX1JFTE9DKFJfMzkwX1RMU19EVFBPRkYsICAgNTUpCitFTEZfUkVMT0MoUl8zOTBfVExTX1RQT0ZGLCAgICA1NikKK0VMRl9SRUxPQyhSXzM5MF8yMCwgICAgICAgICAgIDU3KQorRUxGX1JFTE9DKFJfMzkwX0dPVDIwLCAgICAgICAgNTgpCitFTEZfUkVMT0MoUl8zOTBfR09UUExUMjAsICAgICA1OSkKK0VMRl9SRUxPQyhSXzM5MF9UTFNfR09USUUyMCwgIDYwKQorRUxGX1JFTE9DKFJfMzkwX0lSRUxBVElWRSwgICAgNjEpCitFTEZfUkVMT0MoUl8zOTBfUEMxMkRCTCwgICAgICA2MikKK0VMRl9SRUxPQyhSXzM5MF9QTFQxMkRCTCwgICAgIDYzKQorRUxGX1JFTE9DKFJfMzkwX1BDMjREQkwsICAgICAgNjQpCitFTEZfUkVMT0MoUl8zOTBfUExUMjREQkwsICAgICA2NSkKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9XZWJBc3NlbWJseS5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvV2ViQXNzZW1ibHkuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMzQzNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvV2ViQXNzZW1ibHkuZGVmCkBAIC0wLDAgKzEsOCBAQAorCisjaWZuZGVmIEVMRl9SRUxPQworI2Vycm9yICJFTEZfUkVMT0MgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKK0VMRl9SRUxPQyhSX1dFQkFTU0VNQkxZX05PTkUsICAgICAgICAgIDApCitFTEZfUkVMT0MoUl9XRUJBU1NFTUJMWV9EQVRBLCAgICAgICAgICAxKQorRUxGX1JFTE9DKFJfV0VCQVNTRU1CTFlfRlVOQ1RJT04sICAgICAgMikKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9pMzg2LmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9pMzg2LmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDI4Y2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL2kzODYuZGVmCkBAIC0wLDAgKzEsNDcgQEAKKworI2lmbmRlZiBFTEZfUkVMT0MKKyNlcnJvciAiRUxGX1JFTE9DIG11c3QgYmUgZGVmaW5lZCIKKyNlbmRpZgorCisvLyBUT0RPOiB0aGlzIGlzIGp1c3QgYSBzdWJzZXQKK0VMRl9SRUxPQyhSXzM4Nl9OT05FLCAgICAgICAgICAgMCkKK0VMRl9SRUxPQyhSXzM4Nl8zMiwgICAgICAgICAgICAgMSkKK0VMRl9SRUxPQyhSXzM4Nl9QQzMyLCAgICAgICAgICAgMikKK0VMRl9SRUxPQyhSXzM4Nl9HT1QzMiwgICAgICAgICAgMykKK0VMRl9SRUxPQyhSXzM4Nl9QTFQzMiwgICAgICAgICAgNCkKK0VMRl9SRUxPQyhSXzM4Nl9DT1BZLCAgICAgICAgICAgNSkKK0VMRl9SRUxPQyhSXzM4Nl9HTE9CX0RBVCwgICAgICAgNikKK0VMRl9SRUxPQyhSXzM4Nl9KVU1QX1NMT1QsICAgICAgNykKK0VMRl9SRUxPQyhSXzM4Nl9SRUxBVElWRSwgICAgICAgOCkKK0VMRl9SRUxPQyhSXzM4Nl9HT1RPRkYsICAgICAgICAgOSkKK0VMRl9SRUxPQyhSXzM4Nl9HT1RQQywgICAgICAgICAgMTApCitFTEZfUkVMT0MoUl8zODZfMzJQTFQsICAgICAgICAgIDExKQorRUxGX1JFTE9DKFJfMzg2X1RMU19UUE9GRiwgICAgICAxNCkKK0VMRl9SRUxPQyhSXzM4Nl9UTFNfSUUsICAgICAgICAgMTUpCitFTEZfUkVMT0MoUl8zODZfVExTX0dPVElFLCAgICAgIDE2KQorRUxGX1JFTE9DKFJfMzg2X1RMU19MRSwgICAgICAgICAxNykKK0VMRl9SRUxPQyhSXzM4Nl9UTFNfR0QsICAgICAgICAgMTgpCitFTEZfUkVMT0MoUl8zODZfVExTX0xETSwgICAgICAgIDE5KQorRUxGX1JFTE9DKFJfMzg2XzE2LCAgICAgICAgICAgICAyMCkKK0VMRl9SRUxPQyhSXzM4Nl9QQzE2LCAgICAgICAgICAgMjEpCitFTEZfUkVMT0MoUl8zODZfOCwgICAgICAgICAgICAgIDIyKQorRUxGX1JFTE9DKFJfMzg2X1BDOCwgICAgICAgICAgICAyMykKK0VMRl9SRUxPQyhSXzM4Nl9UTFNfR0RfMzIsICAgICAgMjQpCitFTEZfUkVMT0MoUl8zODZfVExTX0dEX1BVU0gsICAgIDI1KQorRUxGX1JFTE9DKFJfMzg2X1RMU19HRF9DQUxMLCAgICAyNikKK0VMRl9SRUxPQyhSXzM4Nl9UTFNfR0RfUE9QLCAgICAgMjcpCitFTEZfUkVMT0MoUl8zODZfVExTX0xETV8zMiwgICAgIDI4KQorRUxGX1JFTE9DKFJfMzg2X1RMU19MRE1fUFVTSCwgICAyOSkKK0VMRl9SRUxPQyhSXzM4Nl9UTFNfTERNX0NBTEwsICAgMzApCitFTEZfUkVMT0MoUl8zODZfVExTX0xETV9QT1AsICAgIDMxKQorRUxGX1JFTE9DKFJfMzg2X1RMU19MRE9fMzIsICAgICAzMikKK0VMRl9SRUxPQyhSXzM4Nl9UTFNfSUVfMzIsICAgICAgMzMpCitFTEZfUkVMT0MoUl8zODZfVExTX0xFXzMyLCAgICAgIDM0KQorRUxGX1JFTE9DKFJfMzg2X1RMU19EVFBNT0QzMiwgICAzNSkKK0VMRl9SRUxPQyhSXzM4Nl9UTFNfRFRQT0ZGMzIsICAgMzYpCitFTEZfUkVMT0MoUl8zODZfVExTX1RQT0ZGMzIsICAgIDM3KQorRUxGX1JFTE9DKFJfMzg2X1RMU19HT1RERVNDLCAgICAzOSkKK0VMRl9SRUxPQyhSXzM4Nl9UTFNfREVTQ19DQUxMLCAgNDApCitFTEZfUkVMT0MoUl8zODZfVExTX0RFU0MsICAgICAgIDQxKQorRUxGX1JFTE9DKFJfMzg2X0lSRUxBVElWRSwgICAgICA0MikKK0VMRl9SRUxPQyhSXzM4Nl9HT1QzMlgsICAgICAgICAgNDMpCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MveDg2XzY0LmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy94ODZfNjQuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZmRjZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MveDg2XzY0LmRlZgpAQCAtMCwwICsxLDQ1IEBACisKKyNpZm5kZWYgRUxGX1JFTE9DCisjZXJyb3IgIkVMRl9SRUxPQyBtdXN0IGJlIGRlZmluZWQiCisjZW5kaWYKKworRUxGX1JFTE9DKFJfWDg2XzY0X05PTkUsICAgICAgICAwKQorRUxGX1JFTE9DKFJfWDg2XzY0XzY0LCAgICAgICAgICAxKQorRUxGX1JFTE9DKFJfWDg2XzY0X1BDMzIsICAgICAgICAyKQorRUxGX1JFTE9DKFJfWDg2XzY0X0dPVDMyLCAgICAgICAzKQorRUxGX1JFTE9DKFJfWDg2XzY0X1BMVDMyLCAgICAgICA0KQorRUxGX1JFTE9DKFJfWDg2XzY0X0NPUFksICAgICAgICA1KQorRUxGX1JFTE9DKFJfWDg2XzY0X0dMT0JfREFULCAgICA2KQorRUxGX1JFTE9DKFJfWDg2XzY0X0pVTVBfU0xPVCwgICA3KQorRUxGX1JFTE9DKFJfWDg2XzY0X1JFTEFUSVZFLCAgICA4KQorRUxGX1JFTE9DKFJfWDg2XzY0X0dPVFBDUkVMLCAgICA5KQorRUxGX1JFTE9DKFJfWDg2XzY0XzMyLCAgICAgICAgICAxMCkKK0VMRl9SRUxPQyhSX1g4Nl82NF8zMlMsICAgICAgICAgMTEpCitFTEZfUkVMT0MoUl9YODZfNjRfMTYsICAgICAgICAgIDEyKQorRUxGX1JFTE9DKFJfWDg2XzY0X1BDMTYsICAgICAgICAxMykKK0VMRl9SRUxPQyhSX1g4Nl82NF84LCAgICAgICAgICAgMTQpCitFTEZfUkVMT0MoUl9YODZfNjRfUEM4LCAgICAgICAgIDE1KQorRUxGX1JFTE9DKFJfWDg2XzY0X0RUUE1PRDY0LCAgICAxNikKK0VMRl9SRUxPQyhSX1g4Nl82NF9EVFBPRkY2NCwgICAgMTcpCitFTEZfUkVMT0MoUl9YODZfNjRfVFBPRkY2NCwgICAgIDE4KQorRUxGX1JFTE9DKFJfWDg2XzY0X1RMU0dELCAgICAgICAxOSkKK0VMRl9SRUxPQyhSX1g4Nl82NF9UTFNMRCwgICAgICAgMjApCitFTEZfUkVMT0MoUl9YODZfNjRfRFRQT0ZGMzIsICAgIDIxKQorRUxGX1JFTE9DKFJfWDg2XzY0X0dPVFRQT0ZGLCAgICAyMikKK0VMRl9SRUxPQyhSX1g4Nl82NF9UUE9GRjMyLCAgICAgMjMpCitFTEZfUkVMT0MoUl9YODZfNjRfUEM2NCwgICAgICAgIDI0KQorRUxGX1JFTE9DKFJfWDg2XzY0X0dPVE9GRjY0LCAgICAyNSkKK0VMRl9SRUxPQyhSX1g4Nl82NF9HT1RQQzMyLCAgICAgMjYpCitFTEZfUkVMT0MoUl9YODZfNjRfR09UNjQsICAgICAgIDI3KQorRUxGX1JFTE9DKFJfWDg2XzY0X0dPVFBDUkVMNjQsICAyOCkKK0VMRl9SRUxPQyhSX1g4Nl82NF9HT1RQQzY0LCAgICAgMjkpCitFTEZfUkVMT0MoUl9YODZfNjRfR09UUExUNjQsICAgIDMwKQorRUxGX1JFTE9DKFJfWDg2XzY0X1BMVE9GRjY0LCAgICAzMSkKK0VMRl9SRUxPQyhSX1g4Nl82NF9TSVpFMzIsICAgICAgMzIpCitFTEZfUkVMT0MoUl9YODZfNjRfU0laRTY0LCAgICAgIDMzKQorRUxGX1JFTE9DKFJfWDg2XzY0X0dPVFBDMzJfVExTREVTQywgIDM0KQorRUxGX1JFTE9DKFJfWDg2XzY0X1RMU0RFU0NfQ0FMTCwgICAgIDM1KQorRUxGX1JFTE9DKFJfWDg2XzY0X1RMU0RFU0MsICAgICAzNikKK0VMRl9SRUxPQyhSX1g4Nl82NF9JUkVMQVRJVkUsICAgMzcpCitFTEZfUkVMT0MoUl9YODZfNjRfR09UUENSRUxYLCAgIDQxKQorRUxGX1JFTE9DKFJfWDg2XzY0X1JFWF9HT1RQQ1JFTFgsICAgIDQyKQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvTWFjaE8uZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvTWFjaE8uZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZGU0OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9NYWNoTy5kZWYKQEAgLTAsMCArMSwxMjAgQEAKKy8vLCwsLS0gbGx2bS9TdXBwb3J0L01hY2hPLmRlZiAtIFRoZSBNYWNoTyBmaWxlIGRlZmluaXRpb25zIC0tLS0tKi0gQysrIC0qLSwsLC8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vLCwsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSwsLC8vCisvLworLy8gRGVmaW5pdGlvbnMgZm9yIE1hY2hPIGZpbGVzCisvLworLy8sLCwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLCwsLy8KKworI2lmZGVmIEhBTkRMRV9MT0FEX0NPTU1BTkQKKworSEFORExFX0xPQURfQ09NTUFORChMQ19TRUdNRU5ULCAweDAwMDAwMDAxdSwgc2VnbWVudF9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19TWU1UQUIsIDB4MDAwMDAwMDJ1LCBzeW10YWJfY29tbWFuZCkKKy8vIExDX1NZTVNFRyBpcyBvYnNvbGV0ZSBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfU1lNU0VHLCAweDAwMDAwMDAzdSwgc3ltc2VnX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX1RIUkVBRCwgMHgwMDAwMDAwNHUsIHRocmVhZF9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19VTklYVEhSRUFELCAweDAwMDAwMDA1dSwgdGhyZWFkX2NvbW1hbmQpCisvLyBMQ19MT0FERlZNTElCIGlzIG9ic29sZXRlIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgorSEFORExFX0xPQURfQ09NTUFORChMQ19MT0FERlZNTElCLCAweDAwMDAwMDA2dSwgZnZtbGliX2NvbW1hbmQpCisvLyBMQ19JREZWTUxJQiBpcyBvYnNvbGV0ZSBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfSURGVk1MSUIsIDB4MDAwMDAwMDd1LCBmdm1saWJfY29tbWFuZCkKKy8vIExDX0lERU5UIGlzIG9ic29sZXRlIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgorSEFORExFX0xPQURfQ09NTUFORChMQ19JREVOVCwgMHgwMDAwMDAwOHUsIGlkZW50X2NvbW1hbmQpCisvLyBMQ19GVk1GSUxFIGlzIG9ic29sZXRlIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgorSEFORExFX0xPQURfQ09NTUFORChMQ19GVk1GSUxFLCAweDAwMDAwMDA5dSwgZnZtZmlsZV9jb21tYW5kKQorLy8gTENfUFJFUEFHRSBpcyBvYnNvbGV0ZSBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfUFJFUEFHRSwgMHgwMDAwMDAwQXUsIGxvYWRfY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfRFlTWU1UQUIsIDB4MDAwMDAwMEJ1LCBkeXN5bXRhYl9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19MT0FEX0RZTElCLCAweDAwMDAwMDBDdSwgZHlsaWJfY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfSURfRFlMSUIsIDB4MDAwMDAwMER1LCBkeWxpYl9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19MT0FEX0RZTElOS0VSLCAweDAwMDAwMDBFdSwgZHlsaW5rZXJfY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfSURfRFlMSU5LRVIsIDB4MDAwMDAwMEZ1LCBkeWxpbmtlcl9jb21tYW5kKQorLy8gTENfUFJFQk9VTkRfRFlMSUIgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX1BSRUJPVU5EX0RZTElCLCAweDAwMDAwMDEwdSwgcHJlYm91bmRfZHlsaWJfY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfUk9VVElORVMsIDB4MDAwMDAwMTF1LCByb3V0aW5lc19jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19TVUJfRlJBTUVXT1JLLCAweDAwMDAwMDEydSwgc3ViX2ZyYW1ld29ya19jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19TVUJfVU1CUkVMTEEsIDB4MDAwMDAwMTN1LCBzdWJfdW1icmVsbGFfY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfU1VCX0NMSUVOVCwgMHgwMDAwMDAxNHUsIHN1Yl9jbGllbnRfY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfU1VCX0xJQlJBUlksIDB4MDAwMDAwMTV1LCBzdWJfbGlicmFyeV9jb21tYW5kKQorLy8gTENfVFdPTEVWRUxfSElOVFMgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX1RXT0xFVkVMX0hJTlRTLCAweDAwMDAwMDE2dSwgdHdvbGV2ZWxfaGludHNfY29tbWFuZCkKKy8vIExDX1BSRUJJTkRfQ0tTVU0gaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX1BSRUJJTkRfQ0tTVU0sIDB4MDAwMDAwMTd1LCBwcmViaW5kX2Nrc3VtX2NvbW1hbmQpCisvLyBMQ19MT0FEX1dFQUtfRFlMSUIgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX0xPQURfV0VBS19EWUxJQiwgMHg4MDAwMDAxOHUsIGR5bGliX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX1NFR01FTlRfNjQsIDB4MDAwMDAwMTl1LCBzZWdtZW50X2NvbW1hbmRfNjQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX1JPVVRJTkVTXzY0LCAweDAwMDAwMDFBdSwgcm91dGluZXNfY29tbWFuZF82NCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfVVVJRCwgMHgwMDAwMDAxQnUsIHV1aWRfY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfUlBBVEgsIDB4ODAwMDAwMUN1LCBycGF0aF9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19DT0RFX1NJR05BVFVSRSwgMHgwMDAwMDAxRHUsIGxpbmtlZGl0X2RhdGFfY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfU0VHTUVOVF9TUExJVF9JTkZPLCAweDAwMDAwMDFFdSwgbGlua2VkaXRfZGF0YV9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19SRUVYUE9SVF9EWUxJQiwgMHg4MDAwMDAxRnUsIGR5bGliX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX0xBWllfTE9BRF9EWUxJQiwgMHgwMDAwMDAyMHUsIGR5bGliX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX0VOQ1JZUFRJT05fSU5GTywgMHgwMDAwMDAyMXUsIGVuY3J5cHRpb25faW5mb19jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19EWUxEX0lORk8sIDB4MDAwMDAwMjJ1LCBkeWxkX2luZm9fY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfRFlMRF9JTkZPX09OTFksIDB4ODAwMDAwMjJ1LCBkeWxkX2luZm9fY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfTE9BRF9VUFdBUkRfRFlMSUIsIDB4ODAwMDAwMjN1LCBkeWxpYl9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19WRVJTSU9OX01JTl9NQUNPU1gsIDB4MDAwMDAwMjR1LCB2ZXJzaW9uX21pbl9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19WRVJTSU9OX01JTl9JUEhPTkVPUywgMHgwMDAwMDAyNXUsIHZlcnNpb25fbWluX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX0ZVTkNUSU9OX1NUQVJUUywgMHgwMDAwMDAyNnUsIGxpbmtlZGl0X2RhdGFfY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfRFlMRF9FTlZJUk9OTUVOVCwgMHgwMDAwMDAyN3UsIGR5bGlua2VyX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX01BSU4sIDB4ODAwMDAwMjh1LCBlbnRyeV9wb2ludF9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19EQVRBX0lOX0NPREUsIDB4MDAwMDAwMjl1LCBsaW5rZWRpdF9kYXRhX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX1NPVVJDRV9WRVJTSU9OLCAweDAwMDAwMDJBdSwgc291cmNlX3ZlcnNpb25fY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfRFlMSUJfQ09ERV9TSUdOX0RSUywgMHgwMDAwMDAyQnUsIGxpbmtlZGl0X2RhdGFfY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfRU5DUllQVElPTl9JTkZPXzY0LCAweDAwMDAwMDJDdSwKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbl9pbmZvX2NvbW1hbmRfNjQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX0xJTktFUl9PUFRJT04sIDB4MDAwMDAwMkR1LCBsaW5rZXJfb3B0aW9uX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX0xJTktFUl9PUFRJTUlaQVRJT05fSElOVCwgMHgwMDAwMDAyRXUsIGxpbmtlZGl0X2RhdGFfY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfVkVSU0lPTl9NSU5fVFZPUywgMHgwMDAwMDAyRnUsIHZlcnNpb25fbWluX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX1ZFUlNJT05fTUlOX1dBVENIT1MsIDB4MDAwMDAwMzB1LCB2ZXJzaW9uX21pbl9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19OT1RFLCAweDAwMDAwMDMxdSwgbm90ZV9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19CVUlMRF9WRVJTSU9OLCAweDAwMDAwMDMydSwgYnVpbGRfdmVyc2lvbl9jb21tYW5kKQorCisjZW5kaWYKKworI2lmZGVmIExPQURfQ09NTUFORF9TVFJVQ1QKKworTE9BRF9DT01NQU5EX1NUUlVDVChkeWxkX2luZm9fY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1QoZHlsaWJfY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1QoZHlsaW5rZXJfY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1QoZHlzeW10YWJfY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1QoZW5jcnlwdGlvbl9pbmZvX2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKGVuY3J5cHRpb25faW5mb19jb21tYW5kXzY0KQorTE9BRF9DT01NQU5EX1NUUlVDVChlbnRyeV9wb2ludF9jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVChmdm1maWxlX2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKGZ2bWxpYl9jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVChpZGVudF9jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVChsaW5rZWRpdF9kYXRhX2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKGxpbmtlcl9vcHRpb25fY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1QobG9hZF9jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVChwcmViaW5kX2Nrc3VtX2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKHByZWJvdW5kX2R5bGliX2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKHJvdXRpbmVzX2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKHJvdXRpbmVzX2NvbW1hbmRfNjQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKHJwYXRoX2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKHNlZ21lbnRfY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1Qoc2VnbWVudF9jb21tYW5kXzY0KQorTE9BRF9DT01NQU5EX1NUUlVDVChzb3VyY2VfdmVyc2lvbl9jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVChzdWJfY2xpZW50X2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKHN1Yl9mcmFtZXdvcmtfY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1Qoc3ViX2xpYnJhcnlfY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1Qoc3ViX3VtYnJlbGxhX2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKHN5bXNlZ19jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVChzeW10YWJfY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1QodGhyZWFkX2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKHR3b2xldmVsX2hpbnRzX2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKHV1aWRfY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1QodmVyc2lvbl9taW5fY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1Qobm90ZV9jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVChidWlsZF92ZXJzaW9uX2NvbW1hbmQpCisKKyNlbmRpZgorCisjdW5kZWYgSEFORExFX0xPQURfQ09NTUFORAorI3VuZGVmIExPQURfQ09NTUFORF9TVFJVQ1QKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L01hY2hPLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9NYWNoTy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MGZiZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9NYWNoTy5oCkBAIC0wLDAgKzEsMTk4MyBAQAorLy89PT0tLSBsbHZtL0JpbmFyeUZvcm1hdC9NYWNoTy5oIC0gVGhlIE1hY2hPIGZpbGUgZm9ybWF0IC0tLS0tLS0qLSBDKysvLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBtYW5pZmVzdCBjb25zdGFudHMgZm9yIHRoZSBNYWNoTyBvYmplY3QgZmlsZSBmb3JtYXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0JJTkFSWUZPUk1BVF9NQUNIT19ICisjZGVmaW5lIExMVk1fQklOQVJZRk9STUFUX01BQ0hPX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvSG9zdC5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgTWFjaE8geworLy8gRW51bXMgZnJvbSA8bWFjaC1vL2xvYWRlci5oPgorZW51bSA6IHVpbnQzMl90IHsKKyAgLy8gQ29uc3RhbnRzIGZvciB0aGUgIm1hZ2ljIiBmaWVsZCBpbiBsbHZtOjpNYWNoTzo6bWFjaF9oZWFkZXIgYW5kCisgIC8vIGxsdm06Ok1hY2hPOjptYWNoX2hlYWRlcl82NAorICBNSF9NQUdJQyA9IDB4RkVFREZBQ0V1LAorICBNSF9DSUdBTSA9IDB4Q0VGQUVERkV1LAorICBNSF9NQUdJQ182NCA9IDB4RkVFREZBQ0Z1LAorICBNSF9DSUdBTV82NCA9IDB4Q0ZGQUVERkV1LAorICBGQVRfTUFHSUMgPSAweENBRkVCQUJFdSwKKyAgRkFUX0NJR0FNID0gMHhCRUJBRkVDQXUsCisgIEZBVF9NQUdJQ182NCA9IDB4Q0FGRUJBQkZ1LAorICBGQVRfQ0lHQU1fNjQgPSAweEJGQkFGRUNBdQorfTsKKworZW51bSBIZWFkZXJGaWxlVHlwZSB7CisgIC8vIENvbnN0YW50cyBmb3IgdGhlICJmaWxldHlwZSIgZmllbGQgaW4gbGx2bTo6TWFjaE86Om1hY2hfaGVhZGVyIGFuZAorICAvLyBsbHZtOjpNYWNoTzo6bWFjaF9oZWFkZXJfNjQKKyAgTUhfT0JKRUNUID0gMHgxdSwKKyAgTUhfRVhFQ1VURSA9IDB4MnUsCisgIE1IX0ZWTUxJQiA9IDB4M3UsCisgIE1IX0NPUkUgPSAweDR1LAorICBNSF9QUkVMT0FEID0gMHg1dSwKKyAgTUhfRFlMSUIgPSAweDZ1LAorICBNSF9EWUxJTktFUiA9IDB4N3UsCisgIE1IX0JVTkRMRSA9IDB4OHUsCisgIE1IX0RZTElCX1NUVUIgPSAweDl1LAorICBNSF9EU1lNID0gMHhBdSwKKyAgTUhfS0VYVF9CVU5ETEUgPSAweEJ1Cit9OworCitlbnVtIHsKKyAgLy8gQ29uc3RhbnQgYml0cyBmb3IgdGhlICJmbGFncyIgZmllbGQgaW4gbGx2bTo6TWFjaE86Om1hY2hfaGVhZGVyIGFuZAorICAvLyBsbHZtOjpNYWNoTzo6bWFjaF9oZWFkZXJfNjQKKyAgTUhfTk9VTkRFRlMgPSAweDAwMDAwMDAxdSwKKyAgTUhfSU5DUkxJTksgPSAweDAwMDAwMDAydSwKKyAgTUhfRFlMRExJTksgPSAweDAwMDAwMDA0dSwKKyAgTUhfQklOREFUTE9BRCA9IDB4MDAwMDAwMDh1LAorICBNSF9QUkVCT1VORCA9IDB4MDAwMDAwMTB1LAorICBNSF9TUExJVF9TRUdTID0gMHgwMDAwMDAyMHUsCisgIE1IX0xBWllfSU5JVCA9IDB4MDAwMDAwNDB1LAorICBNSF9UV09MRVZFTCA9IDB4MDAwMDAwODB1LAorICBNSF9GT1JDRV9GTEFUID0gMHgwMDAwMDEwMHUsCisgIE1IX05PTVVMVElERUZTID0gMHgwMDAwMDIwMHUsCisgIE1IX05PRklYUFJFQklORElORyA9IDB4MDAwMDA0MDB1LAorICBNSF9QUkVCSU5EQUJMRSA9IDB4MDAwMDA4MDB1LAorICBNSF9BTExNT0RTQk9VTkQgPSAweDAwMDAxMDAwdSwKKyAgTUhfU1VCU0VDVElPTlNfVklBX1NZTUJPTFMgPSAweDAwMDAyMDAwdSwKKyAgTUhfQ0FOT05JQ0FMID0gMHgwMDAwNDAwMHUsCisgIE1IX1dFQUtfREVGSU5FUyA9IDB4MDAwMDgwMDB1LAorICBNSF9CSU5EU19UT19XRUFLID0gMHgwMDAxMDAwMHUsCisgIE1IX0FMTE9XX1NUQUNLX0VYRUNVVElPTiA9IDB4MDAwMjAwMDB1LAorICBNSF9ST09UX1NBRkUgPSAweDAwMDQwMDAwdSwKKyAgTUhfU0VUVUlEX1NBRkUgPSAweDAwMDgwMDAwdSwKKyAgTUhfTk9fUkVFWFBPUlRFRF9EWUxJQlMgPSAweDAwMTAwMDAwdSwKKyAgTUhfUElFID0gMHgwMDIwMDAwMHUsCisgIE1IX0RFQURfU1RSSVBQQUJMRV9EWUxJQiA9IDB4MDA0MDAwMDB1LAorICBNSF9IQVNfVExWX0RFU0NSSVBUT1JTID0gMHgwMDgwMDAwMHUsCisgIE1IX05PX0hFQVBfRVhFQ1VUSU9OID0gMHgwMTAwMDAwMHUsCisgIE1IX0FQUF9FWFRFTlNJT05fU0FGRSA9IDB4MDIwMDAwMDB1LAorICBNSF9OTElTVF9PVVRPRlNZTkNfV0lUSF9EWUxESU5GTyA9IDB4MDQwMDAwMDB1Cit9OworCitlbnVtIDogdWludDMyX3QgeworICAvLyBGbGFncyBmb3IgdGhlICJjbWQiIGZpZWxkIGluIGxsdm06Ok1hY2hPOjpsb2FkX2NvbW1hbmQKKyAgTENfUkVRX0RZTEQgPSAweDgwMDAwMDAwdQorfTsKKworI2RlZmluZSBIQU5ETEVfTE9BRF9DT01NQU5EKExDTmFtZSwgTENWYWx1ZSwgTENTdHJ1Y3QpIExDTmFtZSA9IExDVmFsdWUsCisKK2VudW0gTG9hZENvbW1hbmRUeXBlIDogdWludDMyX3QgeworI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L01hY2hPLmRlZiIKK307CisKKyN1bmRlZiBIQU5ETEVfTE9BRF9DT01NQU5ECisKK2VudW0gOiB1aW50MzJfdCB7CisgIC8vIENvbnN0YW50IGJpdHMgZm9yIHRoZSAiZmxhZ3MiIGZpZWxkIGluIGxsdm06Ok1hY2hPOjpzZWdtZW50X2NvbW1hbmQKKyAgU0dfSElHSFZNID0gMHgxdSwKKyAgU0dfRlZNTElCID0gMHgydSwKKyAgU0dfTk9SRUxPQyA9IDB4NHUsCisgIFNHX1BST1RFQ1RFRF9WRVJTSU9OXzEgPSAweDh1LAorCisgIC8vIENvbnN0YW50IG1hc2tzIGZvciB0aGUgImZsYWdzIiBmaWVsZCBpbiBsbHZtOjpNYWNoTzo6c2VjdGlvbiBhbmQKKyAgLy8gbGx2bTo6TWFjaE86OnNlY3Rpb25fNjQKKyAgU0VDVElPTl9UWVBFID0gMHgwMDAwMDBmZnUsICAgICAgICAgICAvLyBTRUNUSU9OX1RZUEUKKyAgU0VDVElPTl9BVFRSSUJVVEVTID0gMHhmZmZmZmYwMHUsICAgICAvLyBTRUNUSU9OX0FUVFJJQlVURVMKKyAgU0VDVElPTl9BVFRSSUJVVEVTX1VTUiA9IDB4ZmYwMDAwMDB1LCAvLyBTRUNUSU9OX0FUVFJJQlVURVNfVVNSCisgIFNFQ1RJT05fQVRUUklCVVRFU19TWVMgPSAweDAwZmZmZjAwdSAgLy8gU0VDVElPTl9BVFRSSUJVVEVTX1NZUworfTsKKworLy8vIFRoZXNlIGFyZSB0aGUgc2VjdGlvbiB0eXBlIGFuZCBhdHRyaWJ1dGVzIGZpZWxkcy4gIEEgTWFjaE8gc2VjdGlvbiBjYW4KKy8vLyBoYXZlIG9ubHkgb25lIFR5cGUsIGJ1dCBjYW4gaGF2ZSBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMgc3BlY2lmaWVkLgorZW51bSBTZWN0aW9uVHlwZSA6IHVpbnQzMl90IHsKKyAgLy8gQ29uc3RhbnQgbWFza3MgZm9yIHRoZSAiZmxhZ3NbNzowXSIgZmllbGQgaW4gbGx2bTo6TWFjaE86OnNlY3Rpb24gYW5kCisgIC8vIGxsdm06Ok1hY2hPOjpzZWN0aW9uXzY0IChtYXNrICJmbGFncyIgd2l0aCBTRUNUSU9OX1RZUEUpCisKKyAgLy8vIFNfUkVHVUxBUiAtIFJlZ3VsYXIgc2VjdGlvbi4KKyAgU19SRUdVTEFSID0gMHgwMHUsCisgIC8vLyBTX1pFUk9GSUxMIC0gWmVybyBmaWxsIG9uIGRlbWFuZCBzZWN0aW9uLgorICBTX1pFUk9GSUxMID0gMHgwMXUsCisgIC8vLyBTX0NTVFJJTkdfTElURVJBTFMgLSBTZWN0aW9uIHdpdGggbGl0ZXJhbCBDIHN0cmluZ3MuCisgIFNfQ1NUUklOR19MSVRFUkFMUyA9IDB4MDJ1LAorICAvLy8gU180QllURV9MSVRFUkFMUyAtIFNlY3Rpb24gd2l0aCA0IGJ5dGUgbGl0ZXJhbHMuCisgIFNfNEJZVEVfTElURVJBTFMgPSAweDAzdSwKKyAgLy8vIFNfOEJZVEVfTElURVJBTFMgLSBTZWN0aW9uIHdpdGggOCBieXRlIGxpdGVyYWxzLgorICBTXzhCWVRFX0xJVEVSQUxTID0gMHgwNHUsCisgIC8vLyBTX0xJVEVSQUxfUE9JTlRFUlMgLSBTZWN0aW9uIHdpdGggcG9pbnRlcnMgdG8gbGl0ZXJhbHMuCisgIFNfTElURVJBTF9QT0lOVEVSUyA9IDB4MDV1LAorICAvLy8gU19OT05fTEFaWV9TWU1CT0xfUE9JTlRFUlMgLSBTZWN0aW9uIHdpdGggbm9uLWxhenkgc3ltYm9sIHBvaW50ZXJzLgorICBTX05PTl9MQVpZX1NZTUJPTF9QT0lOVEVSUyA9IDB4MDZ1LAorICAvLy8gU19MQVpZX1NZTUJPTF9QT0lOVEVSUyAtIFNlY3Rpb24gd2l0aCBsYXp5IHN5bWJvbCBwb2ludGVycy4KKyAgU19MQVpZX1NZTUJPTF9QT0lOVEVSUyA9IDB4MDd1LAorICAvLy8gU19TWU1CT0xfU1RVQlMgLSBTZWN0aW9uIHdpdGggc3ltYm9sIHN0dWJzLCBieXRlIHNpemUgb2Ygc3R1YiBpbgorICAvLy8gdGhlIFJlc2VydmVkMiBmaWVsZC4KKyAgU19TWU1CT0xfU1RVQlMgPSAweDA4dSwKKyAgLy8vIFNfTU9EX0lOSVRfRlVOQ19QT0lOVEVSUyAtIFNlY3Rpb24gd2l0aCBvbmx5IGZ1bmN0aW9uIHBvaW50ZXJzIGZvcgorICAvLy8gaW5pdGlhbGl6YXRpb24uCisgIFNfTU9EX0lOSVRfRlVOQ19QT0lOVEVSUyA9IDB4MDl1LAorICAvLy8gU19NT0RfVEVSTV9GVU5DX1BPSU5URVJTIC0gU2VjdGlvbiB3aXRoIG9ubHkgZnVuY3Rpb24gcG9pbnRlcnMgZm9yCisgIC8vLyB0ZXJtaW5hdGlvbi4KKyAgU19NT0RfVEVSTV9GVU5DX1BPSU5URVJTID0gMHgwYXUsCisgIC8vLyBTX0NPQUxFU0NFRCAtIFNlY3Rpb24gY29udGFpbnMgc3ltYm9scyB0aGF0IGFyZSB0byBiZSBjb2FsZXNjZWQuCisgIFNfQ09BTEVTQ0VEID0gMHgwYnUsCisgIC8vLyBTX0dCX1pFUk9GSUxMIC0gWmVybyBmaWxsIG9uIGRlbWFuZCBzZWN0aW9uICh0aGF0IGNhbiBiZSBsYXJnZXIgdGhhbiA0CisgIC8vLyBnaWdhYnl0ZXMpLgorICBTX0dCX1pFUk9GSUxMID0gMHgwY3UsCisgIC8vLyBTX0lOVEVSUE9TSU5HIC0gU2VjdGlvbiB3aXRoIG9ubHkgcGFpcnMgb2YgZnVuY3Rpb24gcG9pbnRlcnMgZm9yCisgIC8vLyBpbnRlcnBvc2luZy4KKyAgU19JTlRFUlBPU0lORyA9IDB4MGR1LAorICAvLy8gU18xNkJZVEVfTElURVJBTFMgLSBTZWN0aW9uIHdpdGggb25seSAxNiBieXRlIGxpdGVyYWxzLgorICBTXzE2QllURV9MSVRFUkFMUyA9IDB4MGV1LAorICAvLy8gU19EVFJBQ0VfRE9GIC0gU2VjdGlvbiBjb250YWlucyBEVHJhY2UgT2JqZWN0IEZvcm1hdC4KKyAgU19EVFJBQ0VfRE9GID0gMHgwZnUsCisgIC8vLyBTX0xBWllfRFlMSUJfU1lNQk9MX1BPSU5URVJTIC0gU2VjdGlvbiB3aXRoIGxhenkgc3ltYm9sIHBvaW50ZXJzIHRvCisgIC8vLyBsYXp5IGxvYWRlZCBkeWxpYnMuCisgIFNfTEFaWV9EWUxJQl9TWU1CT0xfUE9JTlRFUlMgPSAweDEwdSwKKyAgLy8vIFNfVEhSRUFEX0xPQ0FMX1JFR1VMQVIgLSBUaHJlYWQgbG9jYWwgZGF0YSBzZWN0aW9uLgorICBTX1RIUkVBRF9MT0NBTF9SRUdVTEFSID0gMHgxMXUsCisgIC8vLyBTX1RIUkVBRF9MT0NBTF9aRVJPRklMTCAtIFRocmVhZCBsb2NhbCB6ZXJvZmlsbCBzZWN0aW9uLgorICBTX1RIUkVBRF9MT0NBTF9aRVJPRklMTCA9IDB4MTJ1LAorICAvLy8gU19USFJFQURfTE9DQUxfVkFSSUFCTEVTIC0gU2VjdGlvbiB3aXRoIHRocmVhZCBsb2NhbCB2YXJpYWJsZQorICAvLy8gc3RydWN0dXJlIGRhdGEuCisgIFNfVEhSRUFEX0xPQ0FMX1ZBUklBQkxFUyA9IDB4MTN1LAorICAvLy8gU19USFJFQURfTE9DQUxfVkFSSUFCTEVfUE9JTlRFUlMgLSBTZWN0aW9uIHdpdGggcG9pbnRlcnMgdG8gdGhyZWFkCisgIC8vLyBsb2NhbCBzdHJ1Y3R1cmVzLgorICBTX1RIUkVBRF9MT0NBTF9WQVJJQUJMRV9QT0lOVEVSUyA9IDB4MTR1LAorICAvLy8gU19USFJFQURfTE9DQUxfSU5JVF9GVU5DVElPTl9QT0lOVEVSUyAtIFNlY3Rpb24gd2l0aCB0aHJlYWQgbG9jYWwKKyAgLy8vIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucy4KKyAgU19USFJFQURfTE9DQUxfSU5JVF9GVU5DVElPTl9QT0lOVEVSUyA9IDB4MTV1LAorCisgIExBU1RfS05PV05fU0VDVElPTl9UWVBFID0gU19USFJFQURfTE9DQUxfSU5JVF9GVU5DVElPTl9QT0lOVEVSUworfTsKKworZW51bSA6IHVpbnQzMl90IHsKKyAgLy8gQ29uc3RhbnQgbWFza3MgZm9yIHRoZSAiZmxhZ3NbMzE6MjRdIiBmaWVsZCBpbiBsbHZtOjpNYWNoTzo6c2VjdGlvbiBhbmQKKyAgLy8gbGx2bTo6TWFjaE86OnNlY3Rpb25fNjQgKG1hc2sgImZsYWdzIiB3aXRoIFNFQ1RJT05fQVRUUklCVVRFU19VU1IpCisKKyAgLy8vIFNfQVRUUl9QVVJFX0lOU1RSVUNUSU9OUyAtIFNlY3Rpb24gY29udGFpbnMgb25seSB0cnVlIG1hY2hpbmUKKyAgLy8vIGluc3RydWN0aW9ucy4KKyAgU19BVFRSX1BVUkVfSU5TVFJVQ1RJT05TID0gMHg4MDAwMDAwMHUsCisgIC8vLyBTX0FUVFJfTk9fVE9DIC0gU2VjdGlvbiBjb250YWlucyBjb2FsZXNjZWQgc3ltYm9scyB0aGF0IGFyZSBub3QgdG8gYmUKKyAgLy8vIGluIGEgcmFubGliIHRhYmxlIG9mIGNvbnRlbnRzLgorICBTX0FUVFJfTk9fVE9DID0gMHg0MDAwMDAwMHUsCisgIC8vLyBTX0FUVFJfU1RSSVBfU1RBVElDX1NZTVMgLSBPayB0byBzdHJpcCBzdGF0aWMgc3ltYm9scyBpbiB0aGlzIHNlY3Rpb24KKyAgLy8vIGluIGZpbGVzIHdpdGggdGhlIE1ZX0RZTERMSU5LIGZsYWcuCisgIFNfQVRUUl9TVFJJUF9TVEFUSUNfU1lNUyA9IDB4MjAwMDAwMDB1LAorICAvLy8gU19BVFRSX05PX0RFQURfU1RSSVAgLSBObyBkZWFkIHN0cmlwcGluZy4KKyAgU19BVFRSX05PX0RFQURfU1RSSVAgPSAweDEwMDAwMDAwdSwKKyAgLy8vIFNfQVRUUl9MSVZFX1NVUFBPUlQgLSBCbG9ja3MgYXJlIGxpdmUgaWYgdGhleSByZWZlcmVuY2UgbGl2ZSBibG9ja3MuCisgIFNfQVRUUl9MSVZFX1NVUFBPUlQgPSAweDA4MDAwMDAwdSwKKyAgLy8vIFNfQVRUUl9TRUxGX01PRElGWUlOR19DT0RFIC0gVXNlZCB3aXRoIGkzODYgY29kZSBzdHVicyB3cml0dGVuIG9uIGJ5CisgIC8vLyBkeWxkLgorICBTX0FUVFJfU0VMRl9NT0RJRllJTkdfQ09ERSA9IDB4MDQwMDAwMDB1LAorICAvLy8gU19BVFRSX0RFQlVHIC0gQSBkZWJ1ZyBzZWN0aW9uLgorICBTX0FUVFJfREVCVUcgPSAweDAyMDAwMDAwdSwKKworICAvLyBDb25zdGFudCBtYXNrcyBmb3IgdGhlICJmbGFnc1syMzo4XSIgZmllbGQgaW4gbGx2bTo6TWFjaE86OnNlY3Rpb24gYW5kCisgIC8vIGxsdm06Ok1hY2hPOjpzZWN0aW9uXzY0IChtYXNrICJmbGFncyIgd2l0aCBTRUNUSU9OX0FUVFJJQlVURVNfU1lTKQorCisgIC8vLyBTX0FUVFJfU09NRV9JTlNUUlVDVElPTlMgLSBTZWN0aW9uIGNvbnRhaW5zIHNvbWUgbWFjaGluZSBpbnN0cnVjdGlvbnMuCisgIFNfQVRUUl9TT01FX0lOU1RSVUNUSU9OUyA9IDB4MDAwMDA0MDB1LAorICAvLy8gU19BVFRSX0VYVF9SRUxPQyAtIFNlY3Rpb24gaGFzIGV4dGVybmFsIHJlbG9jYXRpb24gZW50cmllcy4KKyAgU19BVFRSX0VYVF9SRUxPQyA9IDB4MDAwMDAyMDB1LAorICAvLy8gU19BVFRSX0xPQ19SRUxPQyAtIFNlY3Rpb24gaGFzIGxvY2FsIHJlbG9jYXRpb24gZW50cmllcy4KKyAgU19BVFRSX0xPQ19SRUxPQyA9IDB4MDAwMDAxMDB1LAorCisgIC8vIENvbnN0YW50IG1hc2tzIGZvciB0aGUgdmFsdWUgb2YgYW4gaW5kaXJlY3Qgc3ltYm9sIGluIGFuIGluZGlyZWN0CisgIC8vIHN5bWJvbCB0YWJsZQorICBJTkRJUkVDVF9TWU1CT0xfTE9DQUwgPSAweDgwMDAwMDAwdSwKKyAgSU5ESVJFQ1RfU1lNQk9MX0FCUyA9IDB4NDAwMDAwMDB1Cit9OworCitlbnVtIERhdGFSZWdpb25UeXBlIHsKKyAgLy8gQ29uc3RhbnRzIGZvciB0aGUgImtpbmQiIGZpZWxkIGluIGEgZGF0YV9pbl9jb2RlX2VudHJ5IHN0cnVjdHVyZQorICBESUNFX0tJTkRfREFUQSA9IDF1LAorICBESUNFX0tJTkRfSlVNUF9UQUJMRTggPSAydSwKKyAgRElDRV9LSU5EX0pVTVBfVEFCTEUxNiA9IDN1LAorICBESUNFX0tJTkRfSlVNUF9UQUJMRTMyID0gNHUsCisgIERJQ0VfS0lORF9BQlNfSlVNUF9UQUJMRTMyID0gNXUKK307CisKK2VudW0gUmViYXNlVHlwZSB7CisgIFJFQkFTRV9UWVBFX1BPSU5URVIgPSAxdSwKKyAgUkVCQVNFX1RZUEVfVEVYVF9BQlNPTFVURTMyID0gMnUsCisgIFJFQkFTRV9UWVBFX1RFWFRfUENSRUwzMiA9IDN1Cit9OworCitlbnVtIHsgUkVCQVNFX09QQ09ERV9NQVNLID0gMHhGMHUsIFJFQkFTRV9JTU1FRElBVEVfTUFTSyA9IDB4MEZ1IH07CisKK2VudW0gUmViYXNlT3Bjb2RlIHsKKyAgUkVCQVNFX09QQ09ERV9ET05FID0gMHgwMHUsCisgIFJFQkFTRV9PUENPREVfU0VUX1RZUEVfSU1NID0gMHgxMHUsCisgIFJFQkFTRV9PUENPREVfU0VUX1NFR01FTlRfQU5EX09GRlNFVF9VTEVCID0gMHgyMHUsCisgIFJFQkFTRV9PUENPREVfQUREX0FERFJfVUxFQiA9IDB4MzB1LAorICBSRUJBU0VfT1BDT0RFX0FERF9BRERSX0lNTV9TQ0FMRUQgPSAweDQwdSwKKyAgUkVCQVNFX09QQ09ERV9ET19SRUJBU0VfSU1NX1RJTUVTID0gMHg1MHUsCisgIFJFQkFTRV9PUENPREVfRE9fUkVCQVNFX1VMRUJfVElNRVMgPSAweDYwdSwKKyAgUkVCQVNFX09QQ09ERV9ET19SRUJBU0VfQUREX0FERFJfVUxFQiA9IDB4NzB1LAorICBSRUJBU0VfT1BDT0RFX0RPX1JFQkFTRV9VTEVCX1RJTUVTX1NLSVBQSU5HX1VMRUIgPSAweDgwdQorfTsKKworZW51bSBCaW5kVHlwZSB7CisgIEJJTkRfVFlQRV9QT0lOVEVSID0gMXUsCisgIEJJTkRfVFlQRV9URVhUX0FCU09MVVRFMzIgPSAydSwKKyAgQklORF9UWVBFX1RFWFRfUENSRUwzMiA9IDN1Cit9OworCitlbnVtIEJpbmRTcGVjaWFsRHlsaWIgeworICBCSU5EX1NQRUNJQUxfRFlMSUJfU0VMRiA9IDAsCisgIEJJTkRfU1BFQ0lBTF9EWUxJQl9NQUlOX0VYRUNVVEFCTEUgPSAtMSwKKyAgQklORF9TUEVDSUFMX0RZTElCX0ZMQVRfTE9PS1VQID0gLTIKK307CisKK2VudW0geworICBCSU5EX1NZTUJPTF9GTEFHU19XRUFLX0lNUE9SVCA9IDB4MXUsCisgIEJJTkRfU1lNQk9MX0ZMQUdTX05PTl9XRUFLX0RFRklOSVRJT04gPSAweDh1LAorCisgIEJJTkRfT1BDT0RFX01BU0sgPSAweEYwdSwKKyAgQklORF9JTU1FRElBVEVfTUFTSyA9IDB4MEZ1Cit9OworCitlbnVtIEJpbmRPcGNvZGUgeworICBCSU5EX09QQ09ERV9ET05FID0gMHgwMHUsCisgIEJJTkRfT1BDT0RFX1NFVF9EWUxJQl9PUkRJTkFMX0lNTSA9IDB4MTB1LAorICBCSU5EX09QQ09ERV9TRVRfRFlMSUJfT1JESU5BTF9VTEVCID0gMHgyMHUsCisgIEJJTkRfT1BDT0RFX1NFVF9EWUxJQl9TUEVDSUFMX0lNTSA9IDB4MzB1LAorICBCSU5EX09QQ09ERV9TRVRfU1lNQk9MX1RSQUlMSU5HX0ZMQUdTX0lNTSA9IDB4NDB1LAorICBCSU5EX09QQ09ERV9TRVRfVFlQRV9JTU0gPSAweDUwdSwKKyAgQklORF9PUENPREVfU0VUX0FEREVORF9TTEVCID0gMHg2MHUsCisgIEJJTkRfT1BDT0RFX1NFVF9TRUdNRU5UX0FORF9PRkZTRVRfVUxFQiA9IDB4NzB1LAorICBCSU5EX09QQ09ERV9BRERfQUREUl9VTEVCID0gMHg4MHUsCisgIEJJTkRfT1BDT0RFX0RPX0JJTkQgPSAweDkwdSwKKyAgQklORF9PUENPREVfRE9fQklORF9BRERfQUREUl9VTEVCID0gMHhBMHUsCisgIEJJTkRfT1BDT0RFX0RPX0JJTkRfQUREX0FERFJfSU1NX1NDQUxFRCA9IDB4QjB1LAorICBCSU5EX09QQ09ERV9ET19CSU5EX1VMRUJfVElNRVNfU0tJUFBJTkdfVUxFQiA9IDB4QzB1Cit9OworCitlbnVtIHsKKyAgRVhQT1JUX1NZTUJPTF9GTEFHU19LSU5EX01BU0sgPSAweDAzdSwKKyAgRVhQT1JUX1NZTUJPTF9GTEFHU19XRUFLX0RFRklOSVRJT04gPSAweDA0dSwKKyAgRVhQT1JUX1NZTUJPTF9GTEFHU19SRUVYUE9SVCA9IDB4MDh1LAorICBFWFBPUlRfU1lNQk9MX0ZMQUdTX1NUVUJfQU5EX1JFU09MVkVSID0gMHgxMHUKK307CisKK2VudW0gRXhwb3J0U3ltYm9sS2luZCB7CisgIEVYUE9SVF9TWU1CT0xfRkxBR1NfS0lORF9SRUdVTEFSID0gMHgwMHUsCisgIEVYUE9SVF9TWU1CT0xfRkxBR1NfS0lORF9USFJFQURfTE9DQUwgPSAweDAxdSwKKyAgRVhQT1JUX1NZTUJPTF9GTEFHU19LSU5EX0FCU09MVVRFID0gMHgwMnUKK307CisKK2VudW0geworICAvLyBDb25zdGFudCBtYXNrcyBmb3IgdGhlICJuX3R5cGUiIGZpZWxkIGluIGxsdm06Ok1hY2hPOjpubGlzdCBhbmQKKyAgLy8gbGx2bTo6TWFjaE86Om5saXN0XzY0CisgIE5fU1RBQiA9IDB4ZTAsCisgIE5fUEVYVCA9IDB4MTAsCisgIE5fVFlQRSA9IDB4MGUsCisgIE5fRVhUID0gMHgwMQorfTsKKworZW51bSBOTGlzdFR5cGUgOiB1aW50OF90IHsKKyAgLy8gQ29uc3RhbnRzIGZvciB0aGUgIm5fdHlwZSAmIE5fVFlQRSIgbGx2bTo6TWFjaE86Om5saXN0IGFuZAorICAvLyBsbHZtOjpNYWNoTzo6bmxpc3RfNjQKKyAgTl9VTkRGID0gMHgwdSwKKyAgTl9BQlMgPSAweDJ1LAorICBOX1NFQ1QgPSAweGV1LAorICBOX1BCVUQgPSAweGN1LAorICBOX0lORFIgPSAweGF1Cit9OworCitlbnVtIFNlY3Rpb25PcmRpbmFsIHsKKyAgLy8gQ29uc3RhbnRzIGZvciB0aGUgIm5fc2VjdCIgZmllbGQgaW4gbGx2bTo6TWFjaE86Om5saXN0IGFuZAorICAvLyBsbHZtOjpNYWNoTzo6bmxpc3RfNjQKKyAgTk9fU0VDVCA9IDB1LAorICBNQVhfU0VDVCA9IDB4ZmZ1Cit9OworCitlbnVtIHsKKyAgLy8gQ29uc3RhbnQgbWFza3MgZm9yIHRoZSAibl9kZXNjIiBmaWVsZCBpbiBsbHZtOjpNYWNoTzo6bmxpc3QgYW5kCisgIC8vIGxsdm06Ok1hY2hPOjpubGlzdF82NAorICAvLyBUaGUgbG93IDMgYml0cyBhcmUgdGhlIGZvciB0aGUgUkVGRVJFTkNFX1RZUEUuCisgIFJFRkVSRU5DRV9UWVBFID0gMHg3LAorICBSRUZFUkVOQ0VfRkxBR19VTkRFRklORURfTk9OX0xBWlkgPSAwLAorICBSRUZFUkVOQ0VfRkxBR19VTkRFRklORURfTEFaWSA9IDEsCisgIFJFRkVSRU5DRV9GTEFHX0RFRklORUQgPSAyLAorICBSRUZFUkVOQ0VfRkxBR19QUklWQVRFX0RFRklORUQgPSAzLAorICBSRUZFUkVOQ0VfRkxBR19QUklWQVRFX1VOREVGSU5FRF9OT05fTEFaWSA9IDQsCisgIFJFRkVSRU5DRV9GTEFHX1BSSVZBVEVfVU5ERUZJTkVEX0xBWlkgPSA1LAorICAvLyBGbGFnIGJpdHMgKHNvbWUgb3ZlcmxhcCB3aXRoIHRoZSBsaWJyYXJ5IG9yZGluYWwgYml0cykuCisgIE5fQVJNX1RIVU1CX0RFRiA9IDB4MDAwOHUsCisgIFJFRkVSRU5DRURfRFlOQU1JQ0FMTFkgPSAweDAwMTB1LAorICBOX05PX0RFQURfU1RSSVAgPSAweDAwMjB1LAorICBOX1dFQUtfUkVGID0gMHgwMDQwdSwKKyAgTl9XRUFLX0RFRiA9IDB4MDA4MHUsCisgIE5fU1lNQk9MX1JFU09MVkVSID0gMHgwMTAwdSwKKyAgTl9BTFRfRU5UUlkgPSAweDAyMDB1LAorICAvLyBGb3IgdW5kZWZpbmVkIHN5bWJvbHMgY29taW5nIGZyb20gbGlicmFyaWVzLCBzZWUgR0VUX0xJQlJBUllfT1JESU5BTCgpCisgIC8vIGFzIHRoZXNlIGFyZSBpbiB0aGUgdG9wIDggYml0cy4KKyAgU0VMRl9MSUJSQVJZX09SRElOQUwgPSAweDAsCisgIE1BWF9MSUJSQVJZX09SRElOQUwgPSAweGZkLAorICBEWU5BTUlDX0xPT0tVUF9PUkRJTkFMID0gMHhmZSwKKyAgRVhFQ1VUQUJMRV9PUkRJTkFMID0gMHhmZgorfTsKKworZW51bSBTdGFiVHlwZSB7CisgIC8vIENvbnN0YW50IHZhbHVlcyBmb3IgdGhlICJuX3R5cGUiIGZpZWxkIGluIGxsdm06Ok1hY2hPOjpubGlzdCBhbmQKKyAgLy8gbGx2bTo6TWFjaE86Om5saXN0XzY0IHdoZW4gIihuX3R5cGUgJiBOX1NUQUIpICE9IDAiCisgIE5fR1NZTSA9IDB4MjB1LAorICBOX0ZOQU1FID0gMHgyMnUsCisgIE5fRlVOID0gMHgyNHUsCisgIE5fU1RTWU0gPSAweDI2dSwKKyAgTl9MQ1NZTSA9IDB4Mjh1LAorICBOX0JOU1lNID0gMHgyRXUsCisgIE5fUEMgPSAweDMwdSwKKyAgTl9BU1QgPSAweDMydSwKKyAgTl9PUFQgPSAweDNDdSwKKyAgTl9SU1lNID0gMHg0MHUsCisgIE5fU0xJTkUgPSAweDQ0dSwKKyAgTl9FTlNZTSA9IDB4NEV1LAorICBOX1NTWU0gPSAweDYwdSwKKyAgTl9TTyA9IDB4NjR1LAorICBOX09TTyA9IDB4NjZ1LAorICBOX0xTWU0gPSAweDgwdSwKKyAgTl9CSU5DTCA9IDB4ODJ1LAorICBOX1NPTCA9IDB4ODR1LAorICBOX1BBUkFNUyA9IDB4ODZ1LAorICBOX1ZFUlNJT04gPSAweDg4dSwKKyAgTl9PTEVWRUwgPSAweDhBdSwKKyAgTl9QU1lNID0gMHhBMHUsCisgIE5fRUlOQ0wgPSAweEEydSwKKyAgTl9FTlRSWSA9IDB4QTR1LAorICBOX0xCUkFDID0gMHhDMHUsCisgIE5fRVhDTCA9IDB4QzJ1LAorICBOX1JCUkFDID0gMHhFMHUsCisgIE5fQkNPTU0gPSAweEUydSwKKyAgTl9FQ09NTSA9IDB4RTR1LAorICBOX0VDT01MID0gMHhFOHUsCisgIE5fTEVORyA9IDB4RkV1Cit9OworCitlbnVtIDogdWludDMyX3QgeworICAvLyBDb25zdGFudCB2YWx1ZXMgZm9yIHRoZSByX3N5bWJvbG51bSBmaWVsZCBpbiBhbgorICAvLyBsbHZtOjpNYWNoTzo6cmVsb2NhdGlvbl9pbmZvIHN0cnVjdHVyZSB3aGVuIHJfZXh0ZXJuIGlzIDAuCisgIFJfQUJTID0gMCwKKworICAvLyBDb25zdGFudCBiaXRzIGZvciB0aGUgcl9hZGRyZXNzIGZpZWxkIGluIGFuCisgIC8vIGxsdm06Ok1hY2hPOjpyZWxvY2F0aW9uX2luZm8gc3RydWN0dXJlLgorICBSX1NDQVRURVJFRCA9IDB4ODAwMDAwMDAKK307CisKK2VudW0gUmVsb2NhdGlvbkluZm9UeXBlIHsKKyAgLy8gQ29uc3RhbnQgdmFsdWVzIGZvciB0aGUgcl90eXBlIGZpZWxkIGluIGFuCisgIC8vIGxsdm06Ok1hY2hPOjpyZWxvY2F0aW9uX2luZm8gb3IgbGx2bTo6TWFjaE86OnNjYXR0ZXJlZF9yZWxvY2F0aW9uX2luZm8KKyAgLy8gc3RydWN0dXJlLgorICBHRU5FUklDX1JFTE9DX1ZBTklMTEEgPSAwLAorICBHRU5FUklDX1JFTE9DX1BBSVIgPSAxLAorICBHRU5FUklDX1JFTE9DX1NFQ1RESUZGID0gMiwKKyAgR0VORVJJQ19SRUxPQ19QQl9MQV9QVFIgPSAzLAorICBHRU5FUklDX1JFTE9DX0xPQ0FMX1NFQ1RESUZGID0gNCwKKyAgR0VORVJJQ19SRUxPQ19UTFYgPSA1LAorCisgIC8vIENvbnN0YW50IHZhbHVlcyBmb3IgdGhlIHJfdHlwZSBmaWVsZCBpbiBhIFBvd2VyUEMgYXJjaGl0ZWN0dXJlCisgIC8vIGxsdm06Ok1hY2hPOjpyZWxvY2F0aW9uX2luZm8gb3IgbGx2bTo6TWFjaE86OnNjYXR0ZXJlZF9yZWxvY2F0aW9uX2luZm8KKyAgLy8gc3RydWN0dXJlLgorICBQUENfUkVMT0NfVkFOSUxMQSA9IEdFTkVSSUNfUkVMT0NfVkFOSUxMQSwKKyAgUFBDX1JFTE9DX1BBSVIgPSBHRU5FUklDX1JFTE9DX1BBSVIsCisgIFBQQ19SRUxPQ19CUjE0ID0gMiwKKyAgUFBDX1JFTE9DX0JSMjQgPSAzLAorICBQUENfUkVMT0NfSEkxNiA9IDQsCisgIFBQQ19SRUxPQ19MTzE2ID0gNSwKKyAgUFBDX1JFTE9DX0hBMTYgPSA2LAorICBQUENfUkVMT0NfTE8xNCA9IDcsCisgIFBQQ19SRUxPQ19TRUNURElGRiA9IDgsCisgIFBQQ19SRUxPQ19QQl9MQV9QVFIgPSA5LAorICBQUENfUkVMT0NfSEkxNl9TRUNURElGRiA9IDEwLAorICBQUENfUkVMT0NfTE8xNl9TRUNURElGRiA9IDExLAorICBQUENfUkVMT0NfSEExNl9TRUNURElGRiA9IDEyLAorICBQUENfUkVMT0NfSkJTUiA9IDEzLAorICBQUENfUkVMT0NfTE8xNF9TRUNURElGRiA9IDE0LAorICBQUENfUkVMT0NfTE9DQUxfU0VDVERJRkYgPSAxNSwKKworICAvLyBDb25zdGFudCB2YWx1ZXMgZm9yIHRoZSByX3R5cGUgZmllbGQgaW4gYW4gQVJNIGFyY2hpdGVjdHVyZQorICAvLyBsbHZtOjpNYWNoTzo6cmVsb2NhdGlvbl9pbmZvIG9yIGxsdm06Ok1hY2hPOjpzY2F0dGVyZWRfcmVsb2NhdGlvbl9pbmZvCisgIC8vIHN0cnVjdHVyZS4KKyAgQVJNX1JFTE9DX1ZBTklMTEEgPSBHRU5FUklDX1JFTE9DX1ZBTklMTEEsCisgIEFSTV9SRUxPQ19QQUlSID0gR0VORVJJQ19SRUxPQ19QQUlSLAorICBBUk1fUkVMT0NfU0VDVERJRkYgPSBHRU5FUklDX1JFTE9DX1NFQ1RESUZGLAorICBBUk1fUkVMT0NfTE9DQUxfU0VDVERJRkYgPSAzLAorICBBUk1fUkVMT0NfUEJfTEFfUFRSID0gNCwKKyAgQVJNX1JFTE9DX0JSMjQgPSA1LAorICBBUk1fVEhVTUJfUkVMT0NfQlIyMiA9IDYsCisgIEFSTV9USFVNQl8zMkJJVF9CUkFOQ0ggPSA3LCAvLyBvYnNvbGV0ZQorICBBUk1fUkVMT0NfSEFMRiA9IDgsCisgIEFSTV9SRUxPQ19IQUxGX1NFQ1RESUZGID0gOSwKKworICAvLyBDb25zdGFudCB2YWx1ZXMgZm9yIHRoZSByX3R5cGUgZmllbGQgaW4gYW4gQVJNNjQgYXJjaGl0ZWN0dXJlCisgIC8vIGxsdm06Ok1hY2hPOjpyZWxvY2F0aW9uX2luZm8gb3IgbGx2bTo6TWFjaE86OnNjYXR0ZXJlZF9yZWxvY2F0aW9uX2luZm8KKyAgLy8gc3RydWN0dXJlLgorCisgIC8vIEZvciBwb2ludGVycy4KKyAgQVJNNjRfUkVMT0NfVU5TSUdORUQgPSAwLAorICAvLyBNdXN0IGJlIGZvbGxvd2VkIGJ5IGFuIEFSTTY0X1JFTE9DX1VOU0lHTkVECisgIEFSTTY0X1JFTE9DX1NVQlRSQUNUT1IgPSAxLAorICAvLyBBIEIvQkwgaW5zdHJ1Y3Rpb24gd2l0aCAyNi1iaXQgZGlzcGxhY2VtZW50LgorICBBUk02NF9SRUxPQ19CUkFOQ0gyNiA9IDIsCisgIC8vIFBDLXJlbCBkaXN0YW5jZSB0byBwYWdlIG9mIHRhcmdldC4KKyAgQVJNNjRfUkVMT0NfUEFHRTIxID0gMywKKyAgLy8gT2Zmc2V0IHdpdGhpbiBwYWdlLCBzY2FsZWQgYnkgcl9sZW5ndGguCisgIEFSTTY0X1JFTE9DX1BBR0VPRkYxMiA9IDQsCisgIC8vIFBDLXJlbCBkaXN0YW5jZSB0byBwYWdlIG9mIEdPVCBzbG90LgorICBBUk02NF9SRUxPQ19HT1RfTE9BRF9QQUdFMjEgPSA1LAorICAvLyBPZmZzZXQgd2l0aGluIHBhZ2Ugb2YgR09UIHNsb3QsIHNjYWxlZCBieSByX2xlbmd0aC4KKyAgQVJNNjRfUkVMT0NfR09UX0xPQURfUEFHRU9GRjEyID0gNiwKKyAgLy8gRm9yIHBvaW50ZXJzIHRvIEdPVCBzbG90cy4KKyAgQVJNNjRfUkVMT0NfUE9JTlRFUl9UT19HT1QgPSA3LAorICAvLyBQQy1yZWwgZGlzdGFuY2UgdG8gcGFnZSBvZiBUTFZQIHNsb3QuCisgIEFSTTY0X1JFTE9DX1RMVlBfTE9BRF9QQUdFMjEgPSA4LAorICAvLyBPZmZzZXQgd2l0aGluIHBhZ2Ugb2YgVExWUCBzbG90LCBzY2FsZWQgYnkgcl9sZW5ndGguCisgIEFSTTY0X1JFTE9DX1RMVlBfTE9BRF9QQUdFT0ZGMTIgPSA5LAorICAvLyBNdXN0IGJlIGZvbGxvd2VkIGJ5IEFSTTY0X1JFTE9DX1BBR0UyMSBvciBBUk02NF9SRUxPQ19QQUdFT0ZGMTIuCisgIEFSTTY0X1JFTE9DX0FEREVORCA9IDEwLAorCisgIC8vIENvbnN0YW50IHZhbHVlcyBmb3IgdGhlIHJfdHlwZSBmaWVsZCBpbiBhbiB4ODZfNjQgYXJjaGl0ZWN0dXJlCisgIC8vIGxsdm06Ok1hY2hPOjpyZWxvY2F0aW9uX2luZm8gb3IgbGx2bTo6TWFjaE86OnNjYXR0ZXJlZF9yZWxvY2F0aW9uX2luZm8KKyAgLy8gc3RydWN0dXJlCisgIFg4Nl82NF9SRUxPQ19VTlNJR05FRCA9IDAsCisgIFg4Nl82NF9SRUxPQ19TSUdORUQgPSAxLAorICBYODZfNjRfUkVMT0NfQlJBTkNIID0gMiwKKyAgWDg2XzY0X1JFTE9DX0dPVF9MT0FEID0gMywKKyAgWDg2XzY0X1JFTE9DX0dPVCA9IDQsCisgIFg4Nl82NF9SRUxPQ19TVUJUUkFDVE9SID0gNSwKKyAgWDg2XzY0X1JFTE9DX1NJR05FRF8xID0gNiwKKyAgWDg2XzY0X1JFTE9DX1NJR05FRF8yID0gNywKKyAgWDg2XzY0X1JFTE9DX1NJR05FRF80ID0gOCwKKyAgWDg2XzY0X1JFTE9DX1RMViA9IDkKK307CisKKy8vIFZhbHVlcyBmb3Igc2VnbWVudF9jb21tYW5kLmluaXRwcm90LgorLy8gRnJvbSA8bWFjaC92bV9wcm90Lmg+CitlbnVtIHsgVk1fUFJPVF9SRUFEID0gMHgxLCBWTV9QUk9UX1dSSVRFID0gMHgyLCBWTV9QUk9UX0VYRUNVVEUgPSAweDQgfTsKKworLy8gVmFsdWVzIGZvciBwbGF0Zm9ybSBmaWVsZCBpbiBidWlsZF92ZXJzaW9uX2NvbW1hbmQuCitlbnVtIFBsYXRmb3JtVHlwZSB7CisgIFBMQVRGT1JNX01BQ09TID0gMSwKKyAgUExBVEZPUk1fSU9TID0gMiwKKyAgUExBVEZPUk1fVFZPUyA9IDMsCisgIFBMQVRGT1JNX1dBVENIT1MgPSA0LAorICBQTEFURk9STV9CUklER0VPUyA9IDUKK307CisKKy8vIFZhbHVlcyBmb3IgdG9vbHMgZW51bSBpbiBidWlsZF90b29sX3ZlcnNpb24uCitlbnVtIHsgVE9PTF9DTEFORyA9IDEsIFRPT0xfU1dJRlQgPSAyLCBUT09MX0xEID0gMyB9OworCisvLyBTdHJ1Y3RzIGZyb20gPG1hY2gtby9sb2FkZXIuaD4KKworc3RydWN0IG1hY2hfaGVhZGVyIHsKKyAgdWludDMyX3QgbWFnaWM7CisgIHVpbnQzMl90IGNwdXR5cGU7CisgIHVpbnQzMl90IGNwdXN1YnR5cGU7CisgIHVpbnQzMl90IGZpbGV0eXBlOworICB1aW50MzJfdCBuY21kczsKKyAgdWludDMyX3Qgc2l6ZW9mY21kczsKKyAgdWludDMyX3QgZmxhZ3M7Cit9OworCitzdHJ1Y3QgbWFjaF9oZWFkZXJfNjQgeworICB1aW50MzJfdCBtYWdpYzsKKyAgdWludDMyX3QgY3B1dHlwZTsKKyAgdWludDMyX3QgY3B1c3VidHlwZTsKKyAgdWludDMyX3QgZmlsZXR5cGU7CisgIHVpbnQzMl90IG5jbWRzOworICB1aW50MzJfdCBzaXplb2ZjbWRzOworICB1aW50MzJfdCBmbGFnczsKKyAgdWludDMyX3QgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgbG9hZF9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworfTsKKworc3RydWN0IHNlZ21lbnRfY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgY2hhciBzZWduYW1lWzE2XTsKKyAgdWludDMyX3Qgdm1hZGRyOworICB1aW50MzJfdCB2bXNpemU7CisgIHVpbnQzMl90IGZpbGVvZmY7CisgIHVpbnQzMl90IGZpbGVzaXplOworICB1aW50MzJfdCBtYXhwcm90OworICB1aW50MzJfdCBpbml0cHJvdDsKKyAgdWludDMyX3QgbnNlY3RzOworICB1aW50MzJfdCBmbGFnczsKK307CisKK3N0cnVjdCBzZWdtZW50X2NvbW1hbmRfNjQgeworICB1aW50MzJfdCBjbWQ7CisgIHVpbnQzMl90IGNtZHNpemU7CisgIGNoYXIgc2VnbmFtZVsxNl07CisgIHVpbnQ2NF90IHZtYWRkcjsKKyAgdWludDY0X3Qgdm1zaXplOworICB1aW50NjRfdCBmaWxlb2ZmOworICB1aW50NjRfdCBmaWxlc2l6ZTsKKyAgdWludDMyX3QgbWF4cHJvdDsKKyAgdWludDMyX3QgaW5pdHByb3Q7CisgIHVpbnQzMl90IG5zZWN0czsKKyAgdWludDMyX3QgZmxhZ3M7Cit9OworCitzdHJ1Y3Qgc2VjdGlvbiB7CisgIGNoYXIgc2VjdG5hbWVbMTZdOworICBjaGFyIHNlZ25hbWVbMTZdOworICB1aW50MzJfdCBhZGRyOworICB1aW50MzJfdCBzaXplOworICB1aW50MzJfdCBvZmZzZXQ7CisgIHVpbnQzMl90IGFsaWduOworICB1aW50MzJfdCByZWxvZmY7CisgIHVpbnQzMl90IG5yZWxvYzsKKyAgdWludDMyX3QgZmxhZ3M7CisgIHVpbnQzMl90IHJlc2VydmVkMTsKKyAgdWludDMyX3QgcmVzZXJ2ZWQyOworfTsKKworc3RydWN0IHNlY3Rpb25fNjQgeworICBjaGFyIHNlY3RuYW1lWzE2XTsKKyAgY2hhciBzZWduYW1lWzE2XTsKKyAgdWludDY0X3QgYWRkcjsKKyAgdWludDY0X3Qgc2l6ZTsKKyAgdWludDMyX3Qgb2Zmc2V0OworICB1aW50MzJfdCBhbGlnbjsKKyAgdWludDMyX3QgcmVsb2ZmOworICB1aW50MzJfdCBucmVsb2M7CisgIHVpbnQzMl90IGZsYWdzOworICB1aW50MzJfdCByZXNlcnZlZDE7CisgIHVpbnQzMl90IHJlc2VydmVkMjsKKyAgdWludDMyX3QgcmVzZXJ2ZWQzOworfTsKKworc3RydWN0IGZ2bWxpYiB7CisgIHVpbnQzMl90IG5hbWU7CisgIHVpbnQzMl90IG1pbm9yX3ZlcnNpb247CisgIHVpbnQzMl90IGhlYWRlcl9hZGRyOworfTsKKworLy8gVGhlIGZ2bWxpYl9jb21tYW5kIGlzIG9ic29sZXRlIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgorc3RydWN0IGZ2bWxpYl9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICBzdHJ1Y3QgZnZtbGliIGZ2bWxpYjsKK307CisKK3N0cnVjdCBkeWxpYiB7CisgIHVpbnQzMl90IG5hbWU7CisgIHVpbnQzMl90IHRpbWVzdGFtcDsKKyAgdWludDMyX3QgY3VycmVudF92ZXJzaW9uOworICB1aW50MzJfdCBjb21wYXRpYmlsaXR5X3ZlcnNpb247Cit9OworCitzdHJ1Y3QgZHlsaWJfY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgc3RydWN0IGR5bGliIGR5bGliOworfTsKKworc3RydWN0IHN1Yl9mcmFtZXdvcmtfY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDMyX3QgdW1icmVsbGE7Cit9OworCitzdHJ1Y3Qgc3ViX2NsaWVudF9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICB1aW50MzJfdCBjbGllbnQ7Cit9OworCitzdHJ1Y3Qgc3ViX3VtYnJlbGxhX2NvbW1hbmQgeworICB1aW50MzJfdCBjbWQ7CisgIHVpbnQzMl90IGNtZHNpemU7CisgIHVpbnQzMl90IHN1Yl91bWJyZWxsYTsKK307CisKK3N0cnVjdCBzdWJfbGlicmFyeV9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICB1aW50MzJfdCBzdWJfbGlicmFyeTsKK307CisKKy8vIFRoZSBwcmVib3VuZF9keWxpYl9jb21tYW5kIGlzIG9ic29sZXRlIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgorc3RydWN0IHByZWJvdW5kX2R5bGliX2NvbW1hbmQgeworICB1aW50MzJfdCBjbWQ7CisgIHVpbnQzMl90IGNtZHNpemU7CisgIHVpbnQzMl90IG5hbWU7CisgIHVpbnQzMl90IG5tb2R1bGVzOworICB1aW50MzJfdCBsaW5rZWRfbW9kdWxlczsKK307CisKK3N0cnVjdCBkeWxpbmtlcl9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICB1aW50MzJfdCBuYW1lOworfTsKKworc3RydWN0IHRocmVhZF9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworfTsKKworc3RydWN0IHJvdXRpbmVzX2NvbW1hbmQgeworICB1aW50MzJfdCBjbWQ7CisgIHVpbnQzMl90IGNtZHNpemU7CisgIHVpbnQzMl90IGluaXRfYWRkcmVzczsKKyAgdWludDMyX3QgaW5pdF9tb2R1bGU7CisgIHVpbnQzMl90IHJlc2VydmVkMTsKKyAgdWludDMyX3QgcmVzZXJ2ZWQyOworICB1aW50MzJfdCByZXNlcnZlZDM7CisgIHVpbnQzMl90IHJlc2VydmVkNDsKKyAgdWludDMyX3QgcmVzZXJ2ZWQ1OworICB1aW50MzJfdCByZXNlcnZlZDY7Cit9OworCitzdHJ1Y3Qgcm91dGluZXNfY29tbWFuZF82NCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDY0X3QgaW5pdF9hZGRyZXNzOworICB1aW50NjRfdCBpbml0X21vZHVsZTsKKyAgdWludDY0X3QgcmVzZXJ2ZWQxOworICB1aW50NjRfdCByZXNlcnZlZDI7CisgIHVpbnQ2NF90IHJlc2VydmVkMzsKKyAgdWludDY0X3QgcmVzZXJ2ZWQ0OworICB1aW50NjRfdCByZXNlcnZlZDU7CisgIHVpbnQ2NF90IHJlc2VydmVkNjsKK307CisKK3N0cnVjdCBzeW10YWJfY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDMyX3Qgc3ltb2ZmOworICB1aW50MzJfdCBuc3ltczsKKyAgdWludDMyX3Qgc3Ryb2ZmOworICB1aW50MzJfdCBzdHJzaXplOworfTsKKworc3RydWN0IGR5c3ltdGFiX2NvbW1hbmQgeworICB1aW50MzJfdCBjbWQ7CisgIHVpbnQzMl90IGNtZHNpemU7CisgIHVpbnQzMl90IGlsb2NhbHN5bTsKKyAgdWludDMyX3QgbmxvY2Fsc3ltOworICB1aW50MzJfdCBpZXh0ZGVmc3ltOworICB1aW50MzJfdCBuZXh0ZGVmc3ltOworICB1aW50MzJfdCBpdW5kZWZzeW07CisgIHVpbnQzMl90IG51bmRlZnN5bTsKKyAgdWludDMyX3QgdG9jb2ZmOworICB1aW50MzJfdCBudG9jOworICB1aW50MzJfdCBtb2R0YWJvZmY7CisgIHVpbnQzMl90IG5tb2R0YWI7CisgIHVpbnQzMl90IGV4dHJlZnN5bW9mZjsKKyAgdWludDMyX3QgbmV4dHJlZnN5bXM7CisgIHVpbnQzMl90IGluZGlyZWN0c3ltb2ZmOworICB1aW50MzJfdCBuaW5kaXJlY3RzeW1zOworICB1aW50MzJfdCBleHRyZWxvZmY7CisgIHVpbnQzMl90IG5leHRyZWw7CisgIHVpbnQzMl90IGxvY3JlbG9mZjsKKyAgdWludDMyX3QgbmxvY3JlbDsKK307CisKK3N0cnVjdCBkeWxpYl90YWJsZV9vZl9jb250ZW50cyB7CisgIHVpbnQzMl90IHN5bWJvbF9pbmRleDsKKyAgdWludDMyX3QgbW9kdWxlX2luZGV4OworfTsKKworc3RydWN0IGR5bGliX21vZHVsZSB7CisgIHVpbnQzMl90IG1vZHVsZV9uYW1lOworICB1aW50MzJfdCBpZXh0ZGVmc3ltOworICB1aW50MzJfdCBuZXh0ZGVmc3ltOworICB1aW50MzJfdCBpcmVmc3ltOworICB1aW50MzJfdCBucmVmc3ltOworICB1aW50MzJfdCBpbG9jYWxzeW07CisgIHVpbnQzMl90IG5sb2NhbHN5bTsKKyAgdWludDMyX3QgaWV4dHJlbDsKKyAgdWludDMyX3QgbmV4dHJlbDsKKyAgdWludDMyX3QgaWluaXRfaXRlcm07CisgIHVpbnQzMl90IG5pbml0X250ZXJtOworICB1aW50MzJfdCBvYmpjX21vZHVsZV9pbmZvX2FkZHI7CisgIHVpbnQzMl90IG9iamNfbW9kdWxlX2luZm9fc2l6ZTsKK307CisKK3N0cnVjdCBkeWxpYl9tb2R1bGVfNjQgeworICB1aW50MzJfdCBtb2R1bGVfbmFtZTsKKyAgdWludDMyX3QgaWV4dGRlZnN5bTsKKyAgdWludDMyX3QgbmV4dGRlZnN5bTsKKyAgdWludDMyX3QgaXJlZnN5bTsKKyAgdWludDMyX3QgbnJlZnN5bTsKKyAgdWludDMyX3QgaWxvY2Fsc3ltOworICB1aW50MzJfdCBubG9jYWxzeW07CisgIHVpbnQzMl90IGlleHRyZWw7CisgIHVpbnQzMl90IG5leHRyZWw7CisgIHVpbnQzMl90IGlpbml0X2l0ZXJtOworICB1aW50MzJfdCBuaW5pdF9udGVybTsKKyAgdWludDMyX3Qgb2JqY19tb2R1bGVfaW5mb19zaXplOworICB1aW50NjRfdCBvYmpjX21vZHVsZV9pbmZvX2FkZHI7Cit9OworCitzdHJ1Y3QgZHlsaWJfcmVmZXJlbmNlIHsKKyAgdWludDMyX3QgaXN5bSA6IDI0LCBmbGFncyA6IDg7Cit9OworCisvLyBUaGUgdHdvbGV2ZWxfaGludHNfY29tbWFuZCBpcyBvYnNvbGV0ZSBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK3N0cnVjdCB0d29sZXZlbF9oaW50c19jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICB1aW50MzJfdCBvZmZzZXQ7CisgIHVpbnQzMl90IG5oaW50czsKK307CisKKy8vIFRoZSB0d29sZXZlbF9oaW50c19jb21tYW5kIGlzIG9ic29sZXRlIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgorc3RydWN0IHR3b2xldmVsX2hpbnQgeworICB1aW50MzJfdCBpc3ViX2ltYWdlIDogOCwgaXRvYyA6IDI0OworfTsKKworLy8gVGhlIHByZWJpbmRfY2tzdW1fY29tbWFuZCBpcyBvYnNvbGV0ZSBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK3N0cnVjdCBwcmViaW5kX2Nrc3VtX2NvbW1hbmQgeworICB1aW50MzJfdCBjbWQ7CisgIHVpbnQzMl90IGNtZHNpemU7CisgIHVpbnQzMl90IGNrc3VtOworfTsKKworc3RydWN0IHV1aWRfY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDhfdCB1dWlkWzE2XTsKK307CisKK3N0cnVjdCBycGF0aF9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICB1aW50MzJfdCBwYXRoOworfTsKKworc3RydWN0IGxpbmtlZGl0X2RhdGFfY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDMyX3QgZGF0YW9mZjsKKyAgdWludDMyX3QgZGF0YXNpemU7Cit9OworCitzdHJ1Y3QgZGF0YV9pbl9jb2RlX2VudHJ5IHsKKyAgdWludDMyX3Qgb2Zmc2V0OworICB1aW50MTZfdCBsZW5ndGg7CisgIHVpbnQxNl90IGtpbmQ7Cit9OworCitzdHJ1Y3Qgc291cmNlX3ZlcnNpb25fY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDY0X3QgdmVyc2lvbjsKK307CisKK3N0cnVjdCBlbmNyeXB0aW9uX2luZm9fY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDMyX3QgY3J5cHRvZmY7CisgIHVpbnQzMl90IGNyeXB0c2l6ZTsKKyAgdWludDMyX3QgY3J5cHRpZDsKK307CisKK3N0cnVjdCBlbmNyeXB0aW9uX2luZm9fY29tbWFuZF82NCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDMyX3QgY3J5cHRvZmY7CisgIHVpbnQzMl90IGNyeXB0c2l6ZTsKKyAgdWludDMyX3QgY3J5cHRpZDsKKyAgdWludDMyX3QgcGFkOworfTsKKworc3RydWN0IHZlcnNpb25fbWluX2NvbW1hbmQgeworICB1aW50MzJfdCBjbWQ7ICAgICAvLyBMQ19WRVJTSU9OX01JTl9NQUNPU1ggb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gTENfVkVSU0lPTl9NSU5fSVBIT05FT1MKKyAgdWludDMyX3QgY21kc2l6ZTsgLy8gc2l6ZW9mKHN0cnVjdCB2ZXJzaW9uX21pbl9jb21tYW5kKQorICB1aW50MzJfdCB2ZXJzaW9uOyAvLyBYLlkuWiBpcyBlbmNvZGVkIGluIG5pYmJsZXMgeHh4eC55eS56egorICB1aW50MzJfdCBzZGs7ICAgICAvLyBYLlkuWiBpcyBlbmNvZGVkIGluIG5pYmJsZXMgeHh4eC55eS56egorfTsKKworc3RydWN0IG5vdGVfY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsgICAgICAgIC8vIExDX05PVEUKKyAgdWludDMyX3QgY21kc2l6ZTsgICAgLy8gc2l6ZW9mKHN0cnVjdCBub3RlX2NvbW1hbmQpCisgIGNoYXIgZGF0YV9vd25lclsxNl07IC8vIG93bmVyIG5hbWUgZm9yIHRoaXMgTENfTk9URQorICB1aW50NjRfdCBvZmZzZXQ7ICAgICAvLyBmaWxlIG9mZnNldCBvZiB0aGlzIGRhdGEKKyAgdWludDY0X3Qgc2l6ZTsgICAgICAgLy8gbGVuZ3RoIG9mIGRhdGEgcmVnaW9uCit9OworCitzdHJ1Y3QgYnVpbGRfdG9vbF92ZXJzaW9uIHsKKyAgdWludDMyX3QgdG9vbDsgICAgLy8gZW51bSBmb3IgdGhlIHRvb2wKKyAgdWludDMyX3QgdmVyc2lvbjsgLy8gdmVyc2lvbiBvZiB0aGUgdG9vbAorfTsKKworc3RydWN0IGJ1aWxkX3ZlcnNpb25fY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsgICAgICAvLyBMQ19CVUlMRF9WRVJTSU9OCisgIHVpbnQzMl90IGNtZHNpemU7ICAvLyBzaXplb2Yoc3RydWN0IGJ1aWxkX3ZlcnNpb25fY29tbWFuZCkgKworICAgICAgICAgICAgICAgICAgICAgLy8gbnRvb2xzICogc2l6ZW9mKHN0cnVjdCBidWlsZF90b29sX3ZlcnNpb24pCisgIHVpbnQzMl90IHBsYXRmb3JtOyAvLyBwbGF0Zm9ybQorICB1aW50MzJfdCBtaW5vczsgICAgLy8gWC5ZLlogaXMgZW5jb2RlZCBpbiBuaWJibGVzIHh4eHgueXkuenoKKyAgdWludDMyX3Qgc2RrOyAgICAgIC8vIFguWS5aIGlzIGVuY29kZWQgaW4gbmliYmxlcyB4eHh4Lnl5Lnp6CisgIHVpbnQzMl90IG50b29sczsgICAvLyBudW1iZXIgb2YgdG9vbCBlbnRyaWVzIGZvbGxvd2luZyB0aGlzCit9OworCitzdHJ1Y3QgZHlsZF9pbmZvX2NvbW1hbmQgeworICB1aW50MzJfdCBjbWQ7CisgIHVpbnQzMl90IGNtZHNpemU7CisgIHVpbnQzMl90IHJlYmFzZV9vZmY7CisgIHVpbnQzMl90IHJlYmFzZV9zaXplOworICB1aW50MzJfdCBiaW5kX29mZjsKKyAgdWludDMyX3QgYmluZF9zaXplOworICB1aW50MzJfdCB3ZWFrX2JpbmRfb2ZmOworICB1aW50MzJfdCB3ZWFrX2JpbmRfc2l6ZTsKKyAgdWludDMyX3QgbGF6eV9iaW5kX29mZjsKKyAgdWludDMyX3QgbGF6eV9iaW5kX3NpemU7CisgIHVpbnQzMl90IGV4cG9ydF9vZmY7CisgIHVpbnQzMl90IGV4cG9ydF9zaXplOworfTsKKworc3RydWN0IGxpbmtlcl9vcHRpb25fY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDMyX3QgY291bnQ7Cit9OworCisvLyBUaGUgc3ltc2VnX2NvbW1hbmQgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitzdHJ1Y3Qgc3ltc2VnX2NvbW1hbmQgeworICB1aW50MzJfdCBjbWQ7CisgIHVpbnQzMl90IGNtZHNpemU7CisgIHVpbnQzMl90IG9mZnNldDsKKyAgdWludDMyX3Qgc2l6ZTsKK307CisKKy8vIFRoZSBpZGVudF9jb21tYW5kIGlzIG9ic29sZXRlIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgorc3RydWN0IGlkZW50X2NvbW1hbmQgeworICB1aW50MzJfdCBjbWQ7CisgIHVpbnQzMl90IGNtZHNpemU7Cit9OworCisvLyBUaGUgZnZtZmlsZV9jb21tYW5kIGlzIG9ic29sZXRlIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgorc3RydWN0IGZ2bWZpbGVfY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDMyX3QgbmFtZTsKKyAgdWludDMyX3QgaGVhZGVyX2FkZHI7Cit9OworCitzdHJ1Y3QgdGx2X2Rlc2NyaXB0b3JfMzIgeworICB1aW50MzJfdCB0aHVuazsKKyAgdWludDMyX3Qga2V5OworICB1aW50MzJfdCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgdGx2X2Rlc2NyaXB0b3JfNjQgeworICB1aW50NjRfdCB0aHVuazsKKyAgdWludDY0X3Qga2V5OworICB1aW50NjRfdCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgdGx2X2Rlc2NyaXB0b3IgeworICB1aW50cHRyX3QgdGh1bms7CisgIHVpbnRwdHJfdCBrZXk7CisgIHVpbnRwdHJfdCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgZW50cnlfcG9pbnRfY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDY0X3QgZW50cnlvZmY7CisgIHVpbnQ2NF90IHN0YWNrc2l6ZTsKK307CisKKy8vIFN0cnVjdHMgZnJvbSA8bWFjaC1vL2ZhdC5oPgorc3RydWN0IGZhdF9oZWFkZXIgeworICB1aW50MzJfdCBtYWdpYzsKKyAgdWludDMyX3QgbmZhdF9hcmNoOworfTsKKworc3RydWN0IGZhdF9hcmNoIHsKKyAgdWludDMyX3QgY3B1dHlwZTsKKyAgdWludDMyX3QgY3B1c3VidHlwZTsKKyAgdWludDMyX3Qgb2Zmc2V0OworICB1aW50MzJfdCBzaXplOworICB1aW50MzJfdCBhbGlnbjsKK307CisKK3N0cnVjdCBmYXRfYXJjaF82NCB7CisgIHVpbnQzMl90IGNwdXR5cGU7CisgIHVpbnQzMl90IGNwdXN1YnR5cGU7CisgIHVpbnQ2NF90IG9mZnNldDsKKyAgdWludDY0X3Qgc2l6ZTsKKyAgdWludDMyX3QgYWxpZ247CisgIHVpbnQzMl90IHJlc2VydmVkOworfTsKKworLy8gU3RydWN0cyBmcm9tIDxtYWNoLW8vcmVsb2MuaD4KK3N0cnVjdCByZWxvY2F0aW9uX2luZm8geworICBpbnQzMl90IHJfYWRkcmVzczsKKyAgdWludDMyX3Qgcl9zeW1ib2xudW0gOiAyNCwgcl9wY3JlbCA6IDEsIHJfbGVuZ3RoIDogMiwgcl9leHRlcm4gOiAxLAorICAgICAgcl90eXBlIDogNDsKK307CisKK3N0cnVjdCBzY2F0dGVyZWRfcmVsb2NhdGlvbl9pbmZvIHsKKyNpZiBkZWZpbmVkKEJZVEVfT1JERVIpICYmIGRlZmluZWQoQklHX0VORElBTikgJiYgKEJZVEVfT1JERVIgPT0gQklHX0VORElBTikKKyAgdWludDMyX3Qgcl9zY2F0dGVyZWQgOiAxLCByX3BjcmVsIDogMSwgcl9sZW5ndGggOiAyLCByX3R5cGUgOiA0LAorICAgICAgcl9hZGRyZXNzIDogMjQ7CisjZWxzZQorICB1aW50MzJfdCByX2FkZHJlc3MgOiAyNCwgcl90eXBlIDogNCwgcl9sZW5ndGggOiAyLCByX3BjcmVsIDogMSwKKyAgICAgIHJfc2NhdHRlcmVkIDogMTsKKyNlbmRpZgorICBpbnQzMl90IHJfdmFsdWU7Cit9OworCisvLyBTdHJ1Y3RzIE5PVCBmcm9tIDxtYWNoLW8vcmVsb2MuaD4sIGJ1dCB0aGF0IG1ha2UgTExWTSdzIGxpZmUgZWFzaWVyCitzdHJ1Y3QgYW55X3JlbG9jYXRpb25faW5mbyB7CisgIHVpbnQzMl90IHJfd29yZDAsIHJfd29yZDE7Cit9OworCisvLyBTdHJ1Y3RzIGZyb20gPG1hY2gtby9ubGlzdC5oPgorc3RydWN0IG5saXN0X2Jhc2UgeworICB1aW50MzJfdCBuX3N0cng7CisgIHVpbnQ4X3Qgbl90eXBlOworICB1aW50OF90IG5fc2VjdDsKKyAgdWludDE2X3Qgbl9kZXNjOworfTsKKworc3RydWN0IG5saXN0IHsKKyAgdWludDMyX3Qgbl9zdHJ4OworICB1aW50OF90IG5fdHlwZTsKKyAgdWludDhfdCBuX3NlY3Q7CisgIGludDE2X3Qgbl9kZXNjOworICB1aW50MzJfdCBuX3ZhbHVlOworfTsKKworc3RydWN0IG5saXN0XzY0IHsKKyAgdWludDMyX3Qgbl9zdHJ4OworICB1aW50OF90IG5fdHlwZTsKKyAgdWludDhfdCBuX3NlY3Q7CisgIHVpbnQxNl90IG5fZGVzYzsKKyAgdWludDY0X3Qgbl92YWx1ZTsKK307CisKKy8vIEJ5dGUgb3JkZXIgc3dhcHBpbmcgZnVuY3Rpb25zIGZvciBNYWNoTyBzdHJ1Y3RzCisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoZmF0X2hlYWRlciAmbWgpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKG1oLm1hZ2ljKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKG1oLm5mYXRfYXJjaCk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoZmF0X2FyY2ggJm1oKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihtaC5jcHV0eXBlKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKG1oLmNwdXN1YnR5cGUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIobWgub2Zmc2V0KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKG1oLnNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIobWguYWxpZ24pOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGZhdF9hcmNoXzY0ICZtaCkgeworICBzeXM6OnN3YXBCeXRlT3JkZXIobWguY3B1dHlwZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihtaC5jcHVzdWJ0eXBlKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKG1oLm9mZnNldCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihtaC5zaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKG1oLmFsaWduKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKG1oLnJlc2VydmVkKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChtYWNoX2hlYWRlciAmbWgpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKG1oLm1hZ2ljKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKG1oLmNwdXR5cGUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIobWguY3B1c3VidHlwZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihtaC5maWxldHlwZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihtaC5uY21kcyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihtaC5zaXplb2ZjbWRzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKG1oLmZsYWdzKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChtYWNoX2hlYWRlcl82NCAmSCkgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoSC5tYWdpYyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihILmNwdXR5cGUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoSC5jcHVzdWJ0eXBlKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEguZmlsZXR5cGUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoSC5uY21kcyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihILnNpemVvZmNtZHMpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoSC5mbGFncyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihILnJlc2VydmVkKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChsb2FkX2NvbW1hbmQgJmxjKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihsYy5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIobGMuY21kc2l6ZSk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3Qoc3ltdGFiX2NvbW1hbmQgJmxjKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihsYy5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIobGMuY21kc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihsYy5zeW1vZmYpOworICBzeXM6OnN3YXBCeXRlT3JkZXIobGMubnN5bXMpOworICBzeXM6OnN3YXBCeXRlT3JkZXIobGMuc3Ryb2ZmKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGxjLnN0cnNpemUpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHNlZ21lbnRfY29tbWFuZF82NCAmc2VnKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWcuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlZy5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlZy52bWFkZHIpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VnLnZtc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWcuZmlsZW9mZik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWcuZmlsZXNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VnLm1heHByb3QpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VnLmluaXRwcm90KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlZy5uc2VjdHMpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VnLmZsYWdzKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChzZWdtZW50X2NvbW1hbmQgJnNlZykgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VnLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWcuY21kc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWcudm1hZGRyKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlZy52bXNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VnLmZpbGVvZmYpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VnLmZpbGVzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlZy5tYXhwcm90KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlZy5pbml0cHJvdCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWcubnNlY3RzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlZy5mbGFncyk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3Qoc2VjdGlvbl82NCAmc2VjdCkgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VjdC5hZGRyKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlY3Quc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWN0Lm9mZnNldCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWN0LmFsaWduKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlY3QucmVsb2ZmKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlY3QubnJlbG9jKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlY3QuZmxhZ3MpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VjdC5yZXNlcnZlZDEpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VjdC5yZXNlcnZlZDIpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHNlY3Rpb24gJnNlY3QpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlY3QuYWRkcik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWN0LnNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VjdC5vZmZzZXQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VjdC5hbGlnbik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWN0LnJlbG9mZik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWN0Lm5yZWxvYyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWN0LmZsYWdzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlY3QucmVzZXJ2ZWQxKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlY3QucmVzZXJ2ZWQyKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChkeWxkX2luZm9fY29tbWFuZCAmaW5mbykgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoaW5mby5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoaW5mby5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGluZm8ucmViYXNlX29mZik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihpbmZvLnJlYmFzZV9zaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGluZm8uYmluZF9vZmYpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoaW5mby5iaW5kX3NpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoaW5mby53ZWFrX2JpbmRfb2ZmKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGluZm8ud2Vha19iaW5kX3NpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoaW5mby5sYXp5X2JpbmRfb2ZmKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGluZm8ubGF6eV9iaW5kX3NpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoaW5mby5leHBvcnRfb2ZmKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGluZm8uZXhwb3J0X3NpemUpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGR5bGliX2NvbW1hbmQgJmQpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGQuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGQuY21kc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkLmR5bGliLm5hbWUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZC5keWxpYi50aW1lc3RhbXApOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZC5keWxpYi5jdXJyZW50X3ZlcnNpb24pOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZC5keWxpYi5jb21wYXRpYmlsaXR5X3ZlcnNpb24pOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHN1Yl9mcmFtZXdvcmtfY29tbWFuZCAmcykgeworICBzeXM6OnN3YXBCeXRlT3JkZXIocy5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIocy5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHMudW1icmVsbGEpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHN1Yl91bWJyZWxsYV9jb21tYW5kICZzKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIocy5zdWJfdW1icmVsbGEpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHN1Yl9saWJyYXJ5X2NvbW1hbmQgJnMpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHMuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHMuY21kc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzLnN1Yl9saWJyYXJ5KTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChzdWJfY2xpZW50X2NvbW1hbmQgJnMpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHMuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHMuY21kc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzLmNsaWVudCk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3Qocm91dGluZXNfY29tbWFuZCAmcikgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHIuaW5pdF9hZGRyZXNzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHIuaW5pdF9tb2R1bGUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5yZXNlcnZlZDEpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5yZXNlcnZlZDIpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5yZXNlcnZlZDMpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5yZXNlcnZlZDQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5yZXNlcnZlZDUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5yZXNlcnZlZDYpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHJvdXRpbmVzX2NvbW1hbmRfNjQgJnIpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHIuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHIuY21kc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihyLmluaXRfYWRkcmVzcyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihyLmluaXRfbW9kdWxlKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHIucmVzZXJ2ZWQxKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHIucmVzZXJ2ZWQyKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHIucmVzZXJ2ZWQzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHIucmVzZXJ2ZWQ0KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHIucmVzZXJ2ZWQ1KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHIucmVzZXJ2ZWQ2KTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdCh0aHJlYWRfY29tbWFuZCAmdCkgeworICBzeXM6OnN3YXBCeXRlT3JkZXIodC5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIodC5jbWRzaXplKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChkeWxpbmtlcl9jb21tYW5kICZkKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZC5uYW1lKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdCh1dWlkX2NvbW1hbmQgJnUpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHUuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHUuY21kc2l6ZSk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QocnBhdGhfY29tbWFuZCAmcikgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHIucGF0aCk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3Qoc291cmNlX3ZlcnNpb25fY29tbWFuZCAmcykgeworICBzeXM6OnN3YXBCeXRlT3JkZXIocy5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIocy5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHMudmVyc2lvbik7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoZW50cnlfcG9pbnRfY29tbWFuZCAmZSkgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoZS5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZS5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGUuZW50cnlvZmYpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZS5zdGFja3NpemUpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGVuY3J5cHRpb25faW5mb19jb21tYW5kICZlKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihlLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihlLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZS5jcnlwdG9mZik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihlLmNyeXB0c2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihlLmNyeXB0aWQpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGVuY3J5cHRpb25faW5mb19jb21tYW5kXzY0ICZlKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihlLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihlLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZS5jcnlwdG9mZik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihlLmNyeXB0c2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihlLmNyeXB0aWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZS5wYWQpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGR5c3ltdGFiX2NvbW1hbmQgJmRzdCkgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoZHN0LmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkc3QuY21kc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkc3QuaWxvY2Fsc3ltKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGRzdC5ubG9jYWxzeW0pOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZHN0LmlleHRkZWZzeW0pOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZHN0Lm5leHRkZWZzeW0pOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZHN0Lml1bmRlZnN5bSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkc3QubnVuZGVmc3ltKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGRzdC50b2NvZmYpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZHN0Lm50b2MpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZHN0Lm1vZHRhYm9mZik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkc3Qubm1vZHRhYik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkc3QuZXh0cmVmc3ltb2ZmKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGRzdC5uZXh0cmVmc3ltcyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkc3QuaW5kaXJlY3RzeW1vZmYpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZHN0Lm5pbmRpcmVjdHN5bXMpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZHN0LmV4dHJlbG9mZik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkc3QubmV4dHJlbCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkc3QubG9jcmVsb2ZmKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGRzdC5ubG9jcmVsKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChhbnlfcmVsb2NhdGlvbl9pbmZvICZyZWxvYykgeworICBzeXM6OnN3YXBCeXRlT3JkZXIocmVsb2Mucl93b3JkMCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihyZWxvYy5yX3dvcmQxKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChubGlzdF9iYXNlICZTKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihTLm5fc3RyeCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihTLm5fZGVzYyk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3Qobmxpc3QgJnN5bSkgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoc3ltLm5fc3RyeCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzeW0ubl9kZXNjKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHN5bS5uX3ZhbHVlKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChubGlzdF82NCAmc3ltKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzeW0ubl9zdHJ4KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHN5bS5uX2Rlc2MpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc3ltLm5fdmFsdWUpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGxpbmtlZGl0X2RhdGFfY29tbWFuZCAmQykgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuZGF0YW9mZik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmRhdGFzaXplKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChsaW5rZXJfb3B0aW9uX2NvbW1hbmQgJkMpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY21kc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmNvdW50KTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdCh2ZXJzaW9uX21pbl9jb21tYW5kICZDKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy52ZXJzaW9uKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuc2RrKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChub3RlX2NvbW1hbmQgJkMpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY21kc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLm9mZnNldCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLnNpemUpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGJ1aWxkX3ZlcnNpb25fY29tbWFuZCAmQykgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMucGxhdGZvcm0pOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5taW5vcyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLnNkayk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLm50b29scyk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoYnVpbGRfdG9vbF92ZXJzaW9uICZDKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLnRvb2wpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy52ZXJzaW9uKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChkYXRhX2luX2NvZGVfZW50cnkgJkMpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMub2Zmc2V0KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMubGVuZ3RoKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMua2luZCk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QodWludDMyX3QgJkMpIHsgc3lzOjpzd2FwQnl0ZU9yZGVyKEMpOyB9CisKKy8vIFRoZSBwcmViaW5kX2Nrc3VtX2NvbW1hbmQgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHByZWJpbmRfY2tzdW1fY29tbWFuZCAmQykgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY2tzdW0pOworfQorCisvLyBUaGUgdHdvbGV2ZWxfaGludHNfY29tbWFuZCBpcyBvYnNvbGV0ZSBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QodHdvbGV2ZWxfaGludHNfY29tbWFuZCAmQykgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMub2Zmc2V0KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMubmhpbnRzKTsKK30KKworLy8gVGhlIHByZWJvdW5kX2R5bGliX2NvbW1hbmQgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHByZWJvdW5kX2R5bGliX2NvbW1hbmQgJkMpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY21kc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLm5hbWUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5ubW9kdWxlcyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmxpbmtlZF9tb2R1bGVzKTsKK30KKworLy8gVGhlIGZ2bWZpbGVfY29tbWFuZCBpcyBvYnNvbGV0ZSBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoZnZtZmlsZV9jb21tYW5kICZDKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5uYW1lKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuaGVhZGVyX2FkZHIpOworfQorCisvLyBUaGUgc3ltc2VnX2NvbW1hbmQgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHN5bXNlZ19jb21tYW5kICZDKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5vZmZzZXQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5zaXplKTsKK30KKworLy8gVGhlIGlkZW50X2NvbW1hbmQgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGlkZW50X2NvbW1hbmQgJkMpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY21kc2l6ZSk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoZnZtbGliICZDKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLm5hbWUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5taW5vcl92ZXJzaW9uKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuaGVhZGVyX2FkZHIpOworfQorCisvLyBUaGUgZnZtbGliX2NvbW1hbmQgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGZ2bWxpYl9jb21tYW5kICZDKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmNtZHNpemUpOworICBzd2FwU3RydWN0KEMuZnZtbGliKTsKK30KKworLy8gR2V0L1NldCBmdW5jdGlvbnMgZnJvbSA8bWFjaC1vL25saXN0Lmg+CisKK2lubGluZSB1aW50MTZfdCBHRVRfTElCUkFSWV9PUkRJTkFMKHVpbnQxNl90IG5fZGVzYykgeworICByZXR1cm4gKCgobl9kZXNjKSA+PiA4dSkgJiAweGZmdSk7Cit9CisKK2lubGluZSB2b2lkIFNFVF9MSUJSQVJZX09SRElOQUwodWludDE2X3QgJm5fZGVzYywgdWludDhfdCBvcmRpbmFsKSB7CisgIG5fZGVzYyA9ICgoKG5fZGVzYykmMHgwMGZmKSB8ICgoKG9yZGluYWwpJjB4ZmYpIDw8IDgpKTsKK30KKworaW5saW5lIHVpbnQ4X3QgR0VUX0NPTU1fQUxJR04odWludDE2X3Qgbl9kZXNjKSB7CisgIHJldHVybiAobl9kZXNjID4+IDh1KSAmIDB4MGZ1OworfQorCitpbmxpbmUgdm9pZCBTRVRfQ09NTV9BTElHTih1aW50MTZfdCAmbl9kZXNjLCB1aW50OF90IGFsaWduKSB7CisgIG5fZGVzYyA9ICgobl9kZXNjICYgMHhmMGZmdSkgfCAoKGFsaWduICYgMHgwZnUpIDw8IDh1KSk7Cit9CisKKy8vIEVudW1zIGZyb20gPG1hY2gvbWFjaGluZS5oPgorZW51bSA6IHVpbnQzMl90IHsKKyAgLy8gQ2FwYWJpbGl0eSBiaXRzIHVzZWQgaW4gdGhlIGRlZmluaXRpb24gb2YgY3B1X3R5cGUuCisgIENQVV9BUkNIX01BU0sgPSAweGZmMDAwMDAwLCAvLyBNYXNrIGZvciBhcmNoaXRlY3R1cmUgYml0cworICBDUFVfQVJDSF9BQkk2NCA9IDB4MDEwMDAwMDAgLy8gNjQgYml0IEFCSQorfTsKKworLy8gQ29uc3RhbnRzIGZvciB0aGUgY3B1dHlwZSBmaWVsZC4KK2VudW0gQ1BVVHlwZSB7CisgIENQVV9UWVBFX0FOWSA9IC0xLAorICBDUFVfVFlQRV9YODYgPSA3LAorICBDUFVfVFlQRV9JMzg2ID0gQ1BVX1RZUEVfWDg2LAorICBDUFVfVFlQRV9YODZfNjQgPSBDUFVfVFlQRV9YODYgfCBDUFVfQVJDSF9BQkk2NCwKKyAgLyogQ1BVX1RZUEVfTUlQUyAgICAgID0gOCwgKi8KKyAgQ1BVX1RZUEVfTUM5ODAwMCA9IDEwLCAvLyBPbGQgTW90b3JvbGEgUG93ZXJQQworICBDUFVfVFlQRV9BUk0gPSAxMiwKKyAgQ1BVX1RZUEVfQVJNNjQgPSBDUFVfVFlQRV9BUk0gfCBDUFVfQVJDSF9BQkk2NCwKKyAgQ1BVX1RZUEVfU1BBUkMgPSAxNCwKKyAgQ1BVX1RZUEVfUE9XRVJQQyA9IDE4LAorICBDUFVfVFlQRV9QT1dFUlBDNjQgPSBDUFVfVFlQRV9QT1dFUlBDIHwgQ1BVX0FSQ0hfQUJJNjQKK307CisKK2VudW0gOiB1aW50MzJfdCB7CisgIC8vIENhcGFiaWxpdHkgYml0cyB1c2VkIGluIHRoZSBkZWZpbml0aW9uIG9mIGNwdXN1YnR5cGUuCisgIENQVV9TVUJUWVBFX01BU0sgPSAweGZmMDAwMDAwLCAgLy8gTWFzayBmb3IgYXJjaGl0ZWN0dXJlIGJpdHMKKyAgQ1BVX1NVQlRZUEVfTElCNjQgPSAweDgwMDAwMDAwLCAvLyA2NCBiaXQgbGlicmFyaWVzCisKKyAgLy8gU3BlY2lhbCBDUFUgc3VidHlwZSBjb25zdGFudHMuCisgIENQVV9TVUJUWVBFX01VTFRJUExFID0gfjB1Cit9OworCisvLyBDb25zdGFudHMgZm9yIHRoZSBjcHVzdWJ0eXBlIGZpZWxkLgorZW51bSBDUFVTdWJUeXBlWDg2IHsKKyAgQ1BVX1NVQlRZUEVfSTM4Nl9BTEwgPSAzLAorICBDUFVfU1VCVFlQRV8zODYgPSAzLAorICBDUFVfU1VCVFlQRV80ODYgPSA0LAorICBDUFVfU1VCVFlQRV80ODZTWCA9IDB4ODQsCisgIENQVV9TVUJUWVBFXzU4NiA9IDUsCisgIENQVV9TVUJUWVBFX1BFTlQgPSBDUFVfU1VCVFlQRV81ODYsCisgIENQVV9TVUJUWVBFX1BFTlRQUk8gPSAweDE2LAorICBDUFVfU1VCVFlQRV9QRU5USUlfTTMgPSAweDM2LAorICBDUFVfU1VCVFlQRV9QRU5USUlfTTUgPSAweDU2LAorICBDUFVfU1VCVFlQRV9DRUxFUk9OID0gMHg2NywKKyAgQ1BVX1NVQlRZUEVfQ0VMRVJPTl9NT0JJTEUgPSAweDc3LAorICBDUFVfU1VCVFlQRV9QRU5USVVNXzMgPSAweDA4LAorICBDUFVfU1VCVFlQRV9QRU5USVVNXzNfTSA9IDB4MTgsCisgIENQVV9TVUJUWVBFX1BFTlRJVU1fM19YRU9OID0gMHgyOCwKKyAgQ1BVX1NVQlRZUEVfUEVOVElVTV9NID0gMHgwOSwKKyAgQ1BVX1NVQlRZUEVfUEVOVElVTV80ID0gMHgwYSwKKyAgQ1BVX1NVQlRZUEVfUEVOVElVTV80X00gPSAweDFhLAorICBDUFVfU1VCVFlQRV9JVEFOSVVNID0gMHgwYiwKKyAgQ1BVX1NVQlRZUEVfSVRBTklVTV8yID0gMHgxYiwKKyAgQ1BVX1NVQlRZUEVfWEVPTiA9IDB4MGMsCisgIENQVV9TVUJUWVBFX1hFT05fTVAgPSAweDFjLAorCisgIENQVV9TVUJUWVBFX1g4Nl9BTEwgPSAzLAorICBDUFVfU1VCVFlQRV9YODZfNjRfQUxMID0gMywKKyAgQ1BVX1NVQlRZUEVfWDg2X0FSQ0gxID0gNCwKKyAgQ1BVX1NVQlRZUEVfWDg2XzY0X0ggPSA4Cit9OworaW5saW5lIGludCBDUFVfU1VCVFlQRV9JTlRFTChpbnQgRmFtaWx5LCBpbnQgTW9kZWwpIHsKKyAgcmV0dXJuIEZhbWlseSB8IChNb2RlbCA8PCA0KTsKK30KK2lubGluZSBpbnQgQ1BVX1NVQlRZUEVfSU5URUxfRkFNSUxZKENQVVN1YlR5cGVYODYgU1QpIHsKKyAgcmV0dXJuICgoaW50KVNUKSAmIDB4MGY7Cit9CitpbmxpbmUgaW50IENQVV9TVUJUWVBFX0lOVEVMX01PREVMKENQVVN1YlR5cGVYODYgU1QpIHsgcmV0dXJuICgoaW50KVNUKSA+PiA0OyB9CitlbnVtIHsgQ1BVX1NVQlRZUEVfSU5URUxfRkFNSUxZX01BWCA9IDE1LCBDUFVfU1VCVFlQRV9JTlRFTF9NT0RFTF9BTEwgPSAwIH07CisKK2VudW0gQ1BVU3ViVHlwZUFSTSB7CisgIENQVV9TVUJUWVBFX0FSTV9BTEwgPSAwLAorICBDUFVfU1VCVFlQRV9BUk1fVjRUID0gNSwKKyAgQ1BVX1NVQlRZUEVfQVJNX1Y2ID0gNiwKKyAgQ1BVX1NVQlRZUEVfQVJNX1Y1ID0gNywKKyAgQ1BVX1NVQlRZUEVfQVJNX1Y1VEVKID0gNywKKyAgQ1BVX1NVQlRZUEVfQVJNX1hTQ0FMRSA9IDgsCisgIENQVV9TVUJUWVBFX0FSTV9WNyA9IDksCisgIC8vICB1bnVzZWQgIEFSTV9WN0YgICAgID0gMTAsCisgIENQVV9TVUJUWVBFX0FSTV9WN1MgPSAxMSwKKyAgQ1BVX1NVQlRZUEVfQVJNX1Y3SyA9IDEyLAorICBDUFVfU1VCVFlQRV9BUk1fVjZNID0gMTQsCisgIENQVV9TVUJUWVBFX0FSTV9WN00gPSAxNSwKKyAgQ1BVX1NVQlRZUEVfQVJNX1Y3RU0gPSAxNgorfTsKKworZW51bSBDUFVTdWJUeXBlQVJNNjQgeyBDUFVfU1VCVFlQRV9BUk02NF9BTEwgPSAwIH07CisKK2VudW0gQ1BVU3ViVHlwZVNQQVJDIHsgQ1BVX1NVQlRZUEVfU1BBUkNfQUxMID0gMCB9OworCitlbnVtIENQVVN1YlR5cGVQb3dlclBDIHsKKyAgQ1BVX1NVQlRZUEVfUE9XRVJQQ19BTEwgPSAwLAorICBDUFVfU1VCVFlQRV9QT1dFUlBDXzYwMSA9IDEsCisgIENQVV9TVUJUWVBFX1BPV0VSUENfNjAyID0gMiwKKyAgQ1BVX1NVQlRZUEVfUE9XRVJQQ182MDMgPSAzLAorICBDUFVfU1VCVFlQRV9QT1dFUlBDXzYwM2UgPSA0LAorICBDUFVfU1VCVFlQRV9QT1dFUlBDXzYwM2V2ID0gNSwKKyAgQ1BVX1NVQlRZUEVfUE9XRVJQQ182MDQgPSA2LAorICBDUFVfU1VCVFlQRV9QT1dFUlBDXzYwNGUgPSA3LAorICBDUFVfU1VCVFlQRV9QT1dFUlBDXzYyMCA9IDgsCisgIENQVV9TVUJUWVBFX1BPV0VSUENfNzUwID0gOSwKKyAgQ1BVX1NVQlRZUEVfUE9XRVJQQ183NDAwID0gMTAsCisgIENQVV9TVUJUWVBFX1BPV0VSUENfNzQ1MCA9IDExLAorICBDUFVfU1VCVFlQRV9QT1dFUlBDXzk3MCA9IDEwMCwKKworICBDUFVfU1VCVFlQRV9NQzk4MDAwMF9BTEwgPSBDUFVfU1VCVFlQRV9QT1dFUlBDX0FMTCwKKyAgQ1BVX1NVQlRZUEVfTUM5ODYwMSA9IENQVV9TVUJUWVBFX1BPV0VSUENfNjAxCit9OworCitzdHJ1Y3QgeDg2X3RocmVhZF9zdGF0ZTMyX3QgeworICB1aW50MzJfdCBlYXg7CisgIHVpbnQzMl90IGVieDsKKyAgdWludDMyX3QgZWN4OworICB1aW50MzJfdCBlZHg7CisgIHVpbnQzMl90IGVkaTsKKyAgdWludDMyX3QgZXNpOworICB1aW50MzJfdCBlYnA7CisgIHVpbnQzMl90IGVzcDsKKyAgdWludDMyX3Qgc3M7CisgIHVpbnQzMl90IGVmbGFnczsKKyAgdWludDMyX3QgZWlwOworICB1aW50MzJfdCBjczsKKyAgdWludDMyX3QgZHM7CisgIHVpbnQzMl90IGVzOworICB1aW50MzJfdCBmczsKKyAgdWludDMyX3QgZ3M7Cit9OworCitzdHJ1Y3QgeDg2X3RocmVhZF9zdGF0ZTY0X3QgeworICB1aW50NjRfdCByYXg7CisgIHVpbnQ2NF90IHJieDsKKyAgdWludDY0X3QgcmN4OworICB1aW50NjRfdCByZHg7CisgIHVpbnQ2NF90IHJkaTsKKyAgdWludDY0X3QgcnNpOworICB1aW50NjRfdCByYnA7CisgIHVpbnQ2NF90IHJzcDsKKyAgdWludDY0X3Qgcjg7CisgIHVpbnQ2NF90IHI5OworICB1aW50NjRfdCByMTA7CisgIHVpbnQ2NF90IHIxMTsKKyAgdWludDY0X3QgcjEyOworICB1aW50NjRfdCByMTM7CisgIHVpbnQ2NF90IHIxNDsKKyAgdWludDY0X3QgcjE1OworICB1aW50NjRfdCByaXA7CisgIHVpbnQ2NF90IHJmbGFnczsKKyAgdWludDY0X3QgY3M7CisgIHVpbnQ2NF90IGZzOworICB1aW50NjRfdCBnczsKK307CisKK2VudW0geDg2X2ZwX2NvbnRyb2xfcHJlY2lzIHsKKyAgeDg2X0ZQX1BSRUNfMjRCID0gMCwKKyAgeDg2X0ZQX1BSRUNfNTNCID0gMiwKKyAgeDg2X0ZQX1BSRUNfNjRCID0gMworfTsKKworZW51bSB4ODZfZnBfY29udHJvbF9yYyB7CisgIHg4Nl9GUF9STkRfTkVBUiA9IDAsCisgIHg4Nl9GUF9STkRfRE9XTiA9IDEsCisgIHg4Nl9GUF9STkRfVVAgPSAyLAorICB4ODZfRlBfQ0hPUCA9IDMKK307CisKK3N0cnVjdCBmcF9jb250cm9sX3QgeworICB1bnNpZ25lZCBzaG9ydCBpbnZhbGlkIDogMSwgZGVub3JtIDogMSwgemRpdiA6IDEsIG92cmZsIDogMSwgdW5kZmwgOiAxLAorICAgICAgcHJlY2lzIDogMSwgOiAyLCBwYyA6IDIsIHJjIDogMiwgOiAxLCA6IDM7Cit9OworCitzdHJ1Y3QgZnBfc3RhdHVzX3QgeworICB1bnNpZ25lZCBzaG9ydCBpbnZhbGlkIDogMSwgZGVub3JtIDogMSwgemRpdiA6IDEsIG92cmZsIDogMSwgdW5kZmwgOiAxLAorICAgICAgcHJlY2lzIDogMSwgc3RrZmx0IDogMSwgZXJyc3VtbSA6IDEsIGMwIDogMSwgYzEgOiAxLCBjMiA6IDEsIHRvcyA6IDMsCisgICAgICBjMyA6IDEsIGJ1c3kgOiAxOworfTsKKworc3RydWN0IG1tc3RfcmVnX3QgeworICBjaGFyIG1tc3RfcmVnWzEwXTsKKyAgY2hhciBtbXN0X3JzcnZbNl07Cit9OworCitzdHJ1Y3QgeG1tX3JlZ190IHsKKyAgY2hhciB4bW1fcmVnWzE2XTsKK307CisKK3N0cnVjdCB4ODZfZmxvYXRfc3RhdGU2NF90IHsKKyAgaW50MzJfdCBmcHVfcmVzZXJ2ZWRbMl07CisgIGZwX2NvbnRyb2xfdCBmcHVfZmN3OworICBmcF9zdGF0dXNfdCBmcHVfZnN3OworICB1aW50OF90IGZwdV9mdHc7CisgIHVpbnQ4X3QgZnB1X3JzcnYxOworICB1aW50MTZfdCBmcHVfZm9wOworICB1aW50MzJfdCBmcHVfaXA7CisgIHVpbnQxNl90IGZwdV9jczsKKyAgdWludDE2X3QgZnB1X3JzcnYyOworICB1aW50MzJfdCBmcHVfZHA7CisgIHVpbnQxNl90IGZwdV9kczsKKyAgdWludDE2X3QgZnB1X3JzcnYzOworICB1aW50MzJfdCBmcHVfbXhjc3I7CisgIHVpbnQzMl90IGZwdV9teGNzcm1hc2s7CisgIG1tc3RfcmVnX3QgZnB1X3N0bW0wOworICBtbXN0X3JlZ190IGZwdV9zdG1tMTsKKyAgbW1zdF9yZWdfdCBmcHVfc3RtbTI7CisgIG1tc3RfcmVnX3QgZnB1X3N0bW0zOworICBtbXN0X3JlZ190IGZwdV9zdG1tNDsKKyAgbW1zdF9yZWdfdCBmcHVfc3RtbTU7CisgIG1tc3RfcmVnX3QgZnB1X3N0bW02OworICBtbXN0X3JlZ190IGZwdV9zdG1tNzsKKyAgeG1tX3JlZ190IGZwdV94bW0wOworICB4bW1fcmVnX3QgZnB1X3htbTE7CisgIHhtbV9yZWdfdCBmcHVfeG1tMjsKKyAgeG1tX3JlZ190IGZwdV94bW0zOworICB4bW1fcmVnX3QgZnB1X3htbTQ7CisgIHhtbV9yZWdfdCBmcHVfeG1tNTsKKyAgeG1tX3JlZ190IGZwdV94bW02OworICB4bW1fcmVnX3QgZnB1X3htbTc7CisgIHhtbV9yZWdfdCBmcHVfeG1tODsKKyAgeG1tX3JlZ190IGZwdV94bW05OworICB4bW1fcmVnX3QgZnB1X3htbTEwOworICB4bW1fcmVnX3QgZnB1X3htbTExOworICB4bW1fcmVnX3QgZnB1X3htbTEyOworICB4bW1fcmVnX3QgZnB1X3htbTEzOworICB4bW1fcmVnX3QgZnB1X3htbTE0OworICB4bW1fcmVnX3QgZnB1X3htbTE1OworICBjaGFyIGZwdV9yc3J2NFs2ICogMTZdOworICB1aW50MzJfdCBmcHVfcmVzZXJ2ZWQxOworfTsKKworc3RydWN0IHg4Nl9leGNlcHRpb25fc3RhdGU2NF90IHsKKyAgdWludDE2X3QgdHJhcG5vOworICB1aW50MTZfdCBjcHU7CisgIHVpbnQzMl90IGVycjsKKyAgdWludDY0X3QgZmF1bHR2YWRkcjsKK307CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoeDg2X3RocmVhZF9zdGF0ZTMyX3QgJngpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZWF4KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZWJ4KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZWN4KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZWR4KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZWRpKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZXNpKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZWJwKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZXNwKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguc3MpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5lZmxhZ3MpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5laXApOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5jcyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmRzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZXMpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5mcyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmdzKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdCh4ODZfdGhyZWFkX3N0YXRlNjRfdCAmeCkgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yYXgpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yYngpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yY3gpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yZHgpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yZGkpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yc2kpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yYnApOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yc3ApOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yOCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnI5KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjEwKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjExKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjEyKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjEzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjE0KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjE1KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucmlwKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucmZsYWdzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguY3MpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5mcyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmdzKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdCh4ODZfZmxvYXRfc3RhdGU2NF90ICZ4KSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZwdV9yZXNlcnZlZFswXSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZwdV9yZXNlcnZlZFsxXSk7CisgIC8vIFRPRE8gc3dhcDogZnBfY29udHJvbF90IGZwdV9mY3c7CisgIC8vIFRPRE8gc3dhcDogZnBfc3RhdHVzX3QgZnB1X2ZzdzsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZnB1X2ZvcCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZwdV9pcCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZwdV9jcyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZwdV9yc3J2Mik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZwdV9kcCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZwdV9kcyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZwdV9yc3J2Myk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZwdV9teGNzcik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZwdV9teGNzcm1hc2spOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5mcHVfcmVzZXJ2ZWQxKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdCh4ODZfZXhjZXB0aW9uX3N0YXRlNjRfdCAmeCkgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC50cmFwbm8pOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5jcHUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5lcnIpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5mYXVsdHZhZGRyKTsKK30KKworc3RydWN0IHg4Nl9zdGF0ZV9oZHJfdCB7CisgIHVpbnQzMl90IGZsYXZvcjsKKyAgdWludDMyX3QgY291bnQ7Cit9OworCitzdHJ1Y3QgeDg2X3RocmVhZF9zdGF0ZV90IHsKKyAgeDg2X3N0YXRlX2hkcl90IHRzaDsKKyAgdW5pb24geworICAgIHg4Nl90aHJlYWRfc3RhdGU2NF90IHRzNjQ7CisgICAgeDg2X3RocmVhZF9zdGF0ZTMyX3QgdHMzMjsKKyAgfSB1dHM7Cit9OworCitzdHJ1Y3QgeDg2X2Zsb2F0X3N0YXRlX3QgeworICB4ODZfc3RhdGVfaGRyX3QgZnNoOworICB1bmlvbiB7CisgICAgeDg2X2Zsb2F0X3N0YXRlNjRfdCBmczY0OworICB9IHVmczsKK307CisKK3N0cnVjdCB4ODZfZXhjZXB0aW9uX3N0YXRlX3QgeworICB4ODZfc3RhdGVfaGRyX3QgZXNoOworICB1bmlvbiB7CisgICAgeDg2X2V4Y2VwdGlvbl9zdGF0ZTY0X3QgZXM2NDsKKyAgfSB1ZXM7Cit9OworCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHg4Nl9zdGF0ZV9oZHJfdCAmeCkgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5mbGF2b3IpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5jb3VudCk7Cit9CisKK2VudW0gWDg2VGhyZWFkRmxhdm9ycyB7CisgIHg4Nl9USFJFQURfU1RBVEUzMiA9IDEsCisgIHg4Nl9GTE9BVF9TVEFURTMyID0gMiwKKyAgeDg2X0VYQ0VQVElPTl9TVEFURTMyID0gMywKKyAgeDg2X1RIUkVBRF9TVEFURTY0ID0gNCwKKyAgeDg2X0ZMT0FUX1NUQVRFNjQgPSA1LAorICB4ODZfRVhDRVBUSU9OX1NUQVRFNjQgPSA2LAorICB4ODZfVEhSRUFEX1NUQVRFID0gNywKKyAgeDg2X0ZMT0FUX1NUQVRFID0gOCwKKyAgeDg2X0VYQ0VQVElPTl9TVEFURSA9IDksCisgIHg4Nl9ERUJVR19TVEFURTMyID0gMTAsCisgIHg4Nl9ERUJVR19TVEFURTY0ID0gMTEsCisgIHg4Nl9ERUJVR19TVEFURSA9IDEyCit9OworCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHg4Nl90aHJlYWRfc3RhdGVfdCAmeCkgeworICBzd2FwU3RydWN0KHgudHNoKTsKKyAgaWYgKHgudHNoLmZsYXZvciA9PSB4ODZfVEhSRUFEX1NUQVRFNjQpCisgICAgc3dhcFN0cnVjdCh4LnV0cy50czY0KTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdCh4ODZfZmxvYXRfc3RhdGVfdCAmeCkgeworICBzd2FwU3RydWN0KHguZnNoKTsKKyAgaWYgKHguZnNoLmZsYXZvciA9PSB4ODZfRkxPQVRfU1RBVEU2NCkKKyAgICBzd2FwU3RydWN0KHgudWZzLmZzNjQpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHg4Nl9leGNlcHRpb25fc3RhdGVfdCAmeCkgeworICBzd2FwU3RydWN0KHguZXNoKTsKKyAgaWYgKHguZXNoLmZsYXZvciA9PSB4ODZfRVhDRVBUSU9OX1NUQVRFNjQpCisgICAgc3dhcFN0cnVjdCh4LnVlcy5lczY0KTsKK30KKworY29uc3QgdWludDMyX3QgeDg2X1RIUkVBRF9TVEFURTMyX0NPVU5UID0KKyAgICBzaXplb2YoeDg2X3RocmVhZF9zdGF0ZTMyX3QpIC8gc2l6ZW9mKHVpbnQzMl90KTsKKworY29uc3QgdWludDMyX3QgeDg2X1RIUkVBRF9TVEFURTY0X0NPVU5UID0KKyAgICBzaXplb2YoeDg2X3RocmVhZF9zdGF0ZTY0X3QpIC8gc2l6ZW9mKHVpbnQzMl90KTsKK2NvbnN0IHVpbnQzMl90IHg4Nl9GTE9BVF9TVEFURTY0X0NPVU5UID0KKyAgICBzaXplb2YoeDg2X2Zsb2F0X3N0YXRlNjRfdCkgLyBzaXplb2YodWludDMyX3QpOworY29uc3QgdWludDMyX3QgeDg2X0VYQ0VQVElPTl9TVEFURTY0X0NPVU5UID0KKyAgICBzaXplb2YoeDg2X2V4Y2VwdGlvbl9zdGF0ZTY0X3QpIC8gc2l6ZW9mKHVpbnQzMl90KTsKKworY29uc3QgdWludDMyX3QgeDg2X1RIUkVBRF9TVEFURV9DT1VOVCA9CisgICAgc2l6ZW9mKHg4Nl90aHJlYWRfc3RhdGVfdCkgLyBzaXplb2YodWludDMyX3QpOworY29uc3QgdWludDMyX3QgeDg2X0ZMT0FUX1NUQVRFX0NPVU5UID0KKyAgICBzaXplb2YoeDg2X2Zsb2F0X3N0YXRlX3QpIC8gc2l6ZW9mKHVpbnQzMl90KTsKK2NvbnN0IHVpbnQzMl90IHg4Nl9FWENFUFRJT05fU1RBVEVfQ09VTlQgPQorICAgIHNpemVvZih4ODZfZXhjZXB0aW9uX3N0YXRlX3QpIC8gc2l6ZW9mKHVpbnQzMl90KTsKKworc3RydWN0IGFybV90aHJlYWRfc3RhdGUzMl90IHsKKyAgdWludDMyX3QgclsxM107CisgIHVpbnQzMl90IHNwOworICB1aW50MzJfdCBscjsKKyAgdWludDMyX3QgcGM7CisgIHVpbnQzMl90IGNwc3I7Cit9OworCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGFybV90aHJlYWRfc3RhdGUzMl90ICZ4KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTM7IGkrKykKKyAgICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yW2ldKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguc3ApOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5scik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnBjKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguY3Bzcik7Cit9CisKK3N0cnVjdCBhcm1fdGhyZWFkX3N0YXRlNjRfdCB7CisgIHVpbnQ2NF90IHhbMjldOworICB1aW50NjRfdCBmcDsKKyAgdWludDY0X3QgbHI7CisgIHVpbnQ2NF90IHNwOworICB1aW50NjRfdCBwYzsKKyAgdWludDMyX3QgY3BzcjsKKyAgdWludDMyX3QgcGFkOworfTsKKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChhcm1fdGhyZWFkX3N0YXRlNjRfdCAmeCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IDI5OyBpKyspCisgICAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgueFtpXSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZwKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgubHIpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5zcCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnBjKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguY3Bzcik7Cit9CisKK3N0cnVjdCBhcm1fc3RhdGVfaGRyX3QgeworICB1aW50MzJfdCBmbGF2b3I7CisgIHVpbnQzMl90IGNvdW50OworfTsKKworc3RydWN0IGFybV90aHJlYWRfc3RhdGVfdCB7CisgIGFybV9zdGF0ZV9oZHJfdCB0c2g7CisgIHVuaW9uIHsKKyAgICBhcm1fdGhyZWFkX3N0YXRlMzJfdCB0czMyOworICB9IHV0czsKK307CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoYXJtX3N0YXRlX2hkcl90ICZ4KSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZsYXZvcik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmNvdW50KTsKK30KKworZW51bSBBUk1UaHJlYWRGbGF2b3JzIHsKKyAgQVJNX1RIUkVBRF9TVEFURSA9IDEsCisgIEFSTV9WRlBfU1RBVEUgPSAyLAorICBBUk1fRVhDRVBUSU9OX1NUQVRFID0gMywKKyAgQVJNX0RFQlVHX1NUQVRFID0gNCwKKyAgQVJOX1RIUkVBRF9TVEFURV9OT05FID0gNSwKKyAgQVJNX1RIUkVBRF9TVEFURTY0ID0gNiwKKyAgQVJNX0VYQ0VQVElPTl9TVEFURTY0ID0gNworfTsKKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChhcm1fdGhyZWFkX3N0YXRlX3QgJngpIHsKKyAgc3dhcFN0cnVjdCh4LnRzaCk7CisgIGlmICh4LnRzaC5mbGF2b3IgPT0gQVJNX1RIUkVBRF9TVEFURSkKKyAgICBzd2FwU3RydWN0KHgudXRzLnRzMzIpOworfQorCitjb25zdCB1aW50MzJfdCBBUk1fVEhSRUFEX1NUQVRFX0NPVU5UID0KKyAgICBzaXplb2YoYXJtX3RocmVhZF9zdGF0ZTMyX3QpIC8gc2l6ZW9mKHVpbnQzMl90KTsKKworY29uc3QgdWludDMyX3QgQVJNX1RIUkVBRF9TVEFURTY0X0NPVU5UID0KKyAgICBzaXplb2YoYXJtX3RocmVhZF9zdGF0ZTY0X3QpIC8gc2l6ZW9mKHVpbnQzMl90KTsKKworc3RydWN0IHBwY190aHJlYWRfc3RhdGUzMl90IHsKKyAgdWludDMyX3Qgc3JyMDsKKyAgdWludDMyX3Qgc3JyMTsKKyAgdWludDMyX3QgcjA7CisgIHVpbnQzMl90IHIxOworICB1aW50MzJfdCByMjsKKyAgdWludDMyX3QgcjM7CisgIHVpbnQzMl90IHI0OworICB1aW50MzJfdCByNTsKKyAgdWludDMyX3QgcjY7CisgIHVpbnQzMl90IHI3OworICB1aW50MzJfdCByODsKKyAgdWludDMyX3Qgcjk7CisgIHVpbnQzMl90IHIxMDsKKyAgdWludDMyX3QgcjExOworICB1aW50MzJfdCByMTI7CisgIHVpbnQzMl90IHIxMzsKKyAgdWludDMyX3QgcjE0OworICB1aW50MzJfdCByMTU7CisgIHVpbnQzMl90IHIxNjsKKyAgdWludDMyX3QgcjE3OworICB1aW50MzJfdCByMTg7CisgIHVpbnQzMl90IHIxOTsKKyAgdWludDMyX3QgcjIwOworICB1aW50MzJfdCByMjE7CisgIHVpbnQzMl90IHIyMjsKKyAgdWludDMyX3QgcjIzOworICB1aW50MzJfdCByMjQ7CisgIHVpbnQzMl90IHIyNTsKKyAgdWludDMyX3QgcjI2OworICB1aW50MzJfdCByMjc7CisgIHVpbnQzMl90IHIyODsKKyAgdWludDMyX3QgcjI5OworICB1aW50MzJfdCByMzA7CisgIHVpbnQzMl90IHIzMTsKKyAgdWludDMyX3QgY3Q7CisgIHVpbnQzMl90IHhlcjsKKyAgdWludDMyX3QgbHI7CisgIHVpbnQzMl90IGN0cjsKKyAgdWludDMyX3QgbXE7CisgIHVpbnQzMl90IHZyc2F2ZTsKK307CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QocHBjX3RocmVhZF9zdGF0ZTMyX3QgJngpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguc3JyMCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnNycjEpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yMCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIxKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjIpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yMyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnI0KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yNik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnI3KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjgpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yOSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIxMCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIxMSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIxMik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIxMyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIxNCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIxNSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIxNik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIxNyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIxOCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIxOSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIyMCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIyMSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIyMik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIyMyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIyNCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIyNSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIyNik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIyNyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIyOCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIyOSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIzMCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIzMSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmN0KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgueGVyKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgubHIpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5jdHIpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5tcSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnZyc2F2ZSk7Cit9CisKK3N0cnVjdCBwcGNfc3RhdGVfaGRyX3QgeworICB1aW50MzJfdCBmbGF2b3I7CisgIHVpbnQzMl90IGNvdW50OworfTsKKworc3RydWN0IHBwY190aHJlYWRfc3RhdGVfdCB7CisgIHBwY19zdGF0ZV9oZHJfdCB0c2g7CisgIHVuaW9uIHsKKyAgICBwcGNfdGhyZWFkX3N0YXRlMzJfdCB0czMyOworICB9IHV0czsKK307CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QocHBjX3N0YXRlX2hkcl90ICZ4KSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZsYXZvcik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmNvdW50KTsKK30KKworZW51bSBQUENUaHJlYWRGbGF2b3JzIHsKKyAgUFBDX1RIUkVBRF9TVEFURSA9IDEsCisgIFBQQ19GTE9BVF9TVEFURSA9IDIsCisgIFBQQ19FWENFUFRJT05fU1RBVEUgPSAzLAorICBQUENfVkVDVE9SX1NUQVRFID0gNCwKKyAgUFBDX1RIUkVBRF9TVEFURTY0ID0gNSwKKyAgUFBDX0VYQ0VQVElPTl9TVEFURTY0ID0gNiwKKyAgUFBDX1RIUkVBRF9TVEFURV9OT05FID0gNworfTsKKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChwcGNfdGhyZWFkX3N0YXRlX3QgJngpIHsKKyAgc3dhcFN0cnVjdCh4LnRzaCk7CisgIGlmICh4LnRzaC5mbGF2b3IgPT0gUFBDX1RIUkVBRF9TVEFURSkKKyAgICBzd2FwU3RydWN0KHgudXRzLnRzMzIpOworfQorCitjb25zdCB1aW50MzJfdCBQUENfVEhSRUFEX1NUQVRFX0NPVU5UID0KKyAgICBzaXplb2YocHBjX3RocmVhZF9zdGF0ZTMyX3QpIC8gc2l6ZW9mKHVpbnQzMl90KTsKKworLy8gRGVmaW5lIGEgdW5pb24gb2YgYWxsIGxvYWQgY29tbWFuZCBzdHJ1Y3RzCisjZGVmaW5lIExPQURfQ09NTUFORF9TVFJVQ1QoTENTdHJ1Y3QpIExDU3RydWN0IExDU3RydWN0IyNfZGF0YTsKKwordW5pb24gbWFjaG9fbG9hZF9jb21tYW5kIHsKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9NYWNoTy5kZWYiCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgTWFjaE8KK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvTWFnaWMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L01hZ2ljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjODI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L01hZ2ljLmgKQEAgLTAsMCArMSw3NCBAQAorLy89PT0tIGxsdm0vQmluYXJ5Rm9ybWF0L01hZ2ljLmggLSBGaWxlIG1hZ2ljIGlkZW50aWZpY2F0aW9uIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0JJTkFSWUZPUk1BVF9NQUdJQ19ICisjZGVmaW5lIExMVk1fQklOQVJZRk9STUFUX01BR0lDX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisKKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKy8vLyBmaWxlX21hZ2ljIC0gQW4gImVudW0gY2xhc3MiIGVudW1lcmF0aW9uIG9mIGZpbGUgdHlwZXMgYmFzZWQgb24gbWFnaWMgKHRoZQorLy8vIGZpcnN0IE4gYnl0ZXMgb2YgdGhlIGZpbGUpLgorc3RydWN0IGZpbGVfbWFnaWMgeworICBlbnVtIEltcGwgeworICAgIHVua25vd24gPSAwLCAgICAgICAvLy88IFVucmVjb2duaXplZCBmaWxlCisgICAgYml0Y29kZSwgICAgICAgICAgIC8vLzwgQml0Y29kZSBmaWxlCisgICAgYXJjaGl2ZSwgICAgICAgICAgIC8vLzwgYXIgc3R5bGUgYXJjaGl2ZSBmaWxlCisgICAgZWxmLCAgICAgICAgICAgICAgIC8vLzwgRUxGIFVua25vd24gdHlwZQorICAgIGVsZl9yZWxvY2F0YWJsZSwgICAvLy88IEVMRiBSZWxvY2F0YWJsZSBvYmplY3QgZmlsZQorICAgIGVsZl9leGVjdXRhYmxlLCAgICAvLy88IEVMRiBFeGVjdXRhYmxlIGltYWdlCisgICAgZWxmX3NoYXJlZF9vYmplY3QsIC8vLzwgRUxGIGR5bmFtaWNhbGx5IGxpbmtlZCBzaGFyZWQgbGliCisgICAgZWxmX2NvcmUsICAgICAgICAgIC8vLzwgRUxGIGNvcmUgaW1hZ2UKKyAgICBtYWNob19vYmplY3QsICAgICAgLy8vPCBNYWNoLU8gT2JqZWN0IGZpbGUKKyAgICBtYWNob19leGVjdXRhYmxlLCAgLy8vPCBNYWNoLU8gRXhlY3V0YWJsZQorICAgIG1hY2hvX2ZpeGVkX3ZpcnR1YWxfbWVtb3J5X3NoYXJlZF9saWIsICAgIC8vLzwgTWFjaC1PIFNoYXJlZCBMaWIsIEZWTQorICAgIG1hY2hvX2NvcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTWFjaC1PIENvcmUgRmlsZQorICAgIG1hY2hvX3ByZWxvYWRfZXhlY3V0YWJsZSwgICAgICAgICAgICAgICAgIC8vLzwgTWFjaC1PIFByZWxvYWRlZCBFeGVjdXRhYmxlCisgICAgbWFjaG9fZHluYW1pY2FsbHlfbGlua2VkX3NoYXJlZF9saWIsICAgICAgLy8vPCBNYWNoLU8gZHlubGlua2VkIHNoYXJlZCBsaWIKKyAgICBtYWNob19keW5hbWljX2xpbmtlciwgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSBNYWNoLU8gZHluYW1pYyBsaW5rZXIKKyAgICBtYWNob19idW5kbGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1hY2gtTyBCdW5kbGUgZmlsZQorICAgIG1hY2hvX2R5bmFtaWNhbGx5X2xpbmtlZF9zaGFyZWRfbGliX3N0dWIsIC8vLzwgTWFjaC1PIFNoYXJlZCBsaWIgc3R1YgorICAgIG1hY2hvX2RzeW1fY29tcGFuaW9uLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgTWFjaC1PIGRTWU0gY29tcGFuaW9uIGZpbGUKKyAgICBtYWNob19rZXh0X2J1bmRsZSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1hY2gtTyBrZXh0IGJ1bmRsZSBmaWxlCisgICAgbWFjaG9fdW5pdmVyc2FsX2JpbmFyeSwgICAgICAgICAgICAgICAgICAgLy8vPCBNYWNoLU8gdW5pdmVyc2FsIGJpbmFyeQorICAgIGNvZmZfY2xfZ2xfb2JqZWN0LCAgIC8vLzwgTWljcm9zb2Z0IGNsLmV4ZSdzIGludGVybWVkaWF0ZSBjb2RlIGZpbGUKKyAgICBjb2ZmX29iamVjdCwgICAgICAgICAvLy88IENPRkYgb2JqZWN0IGZpbGUKKyAgICBjb2ZmX2ltcG9ydF9saWJyYXJ5LCAvLy88IENPRkYgaW1wb3J0IGxpYnJhcnkKKyAgICBwZWNvZmZfZXhlY3V0YWJsZSwgICAvLy88IFBFQ09GRiBleGVjdXRhYmxlIGZpbGUKKyAgICB3aW5kb3dzX3Jlc291cmNlLCAgICAvLy88IFdpbmRvd3MgY29tcGlsZWQgcmVzb3VyY2UgZmlsZSAoLnJlcykKKyAgICB3YXNtX29iamVjdCwgICAgICAgICAvLy88IFdlYkFzc2VtYmx5IE9iamVjdCBmaWxlCisgICAgcGRiLCAgICAgICAgICAgICAgICAgLy8vPCBXaW5kb3dzIFBEQiBkZWJ1ZyBpbmZvIGZpbGUKKyAgfTsKKworICBib29sIGlzX29iamVjdCgpIGNvbnN0IHsgcmV0dXJuIFYgIT0gdW5rbm93bjsgfQorCisgIGZpbGVfbWFnaWMoKSA9IGRlZmF1bHQ7CisgIGZpbGVfbWFnaWMoSW1wbCBWKSA6IFYoVikge30KKyAgb3BlcmF0b3IgSW1wbCgpIGNvbnN0IHsgcmV0dXJuIFY7IH0KKworcHJpdmF0ZToKKyAgSW1wbCBWID0gdW5rbm93bjsKK307CisKKy8vLyBAYnJpZWYgSWRlbnRpZnkgdGhlIHR5cGUgb2YgYSBiaW5hcnkgZmlsZSBiYXNlZCBvbiBob3cgbWFnaWNhbCBpdCBpcy4KK2ZpbGVfbWFnaWMgaWRlbnRpZnlfbWFnaWMoU3RyaW5nUmVmIG1hZ2ljKTsKKworLy8vIEBicmllZiBHZXQgYW5kIGlkZW50aWZ5IFxhIHBhdGgncyB0eXBlIGJhc2VkIG9uIGl0cyBjb250ZW50LgorLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcGFyYW0gcmVzdWx0IFNldCB0byB0aGUgdHlwZSBvZiBmaWxlLCBvciBmaWxlX21hZ2ljOjp1bmtub3duLgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgcmVzdWx0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZXQsIG90aGVyd2lzZSBhCisvLy8gICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZS4KK3N0ZDo6ZXJyb3JfY29kZSBpZGVudGlmeV9tYWdpYyhjb25zdCBUd2luZSAmcGF0aCwgZmlsZV9tYWdpYyAmcmVzdWx0KTsKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9XYXNtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9XYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiMjE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L1dhc20uaApAQCAtMCwwICsxLDI5MCBAQAorLy89PT0tIFdhc20uaCAtIFdhc20gb2JqZWN0IGZpbGUgZm9ybWF0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBtYW5pZmVzdCBjb25zdGFudHMgZm9yIHRoZSB3YXNtIG9iamVjdCBmaWxlIGZvcm1hdC4KKy8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL1dlYkFzc2VtYmx5L2Rlc2lnbi9ibG9iL21hc3Rlci9CaW5hcnlFbmNvZGluZy5tZAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9CSU5BUllGT1JNQVRfV0FTTV9ICisjZGVmaW5lIExMVk1fQklOQVJZRk9STUFUX1dBU01fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHdhc20geworCisvLyBPYmplY3QgZmlsZSBtYWdpYyBzdHJpbmcuCitjb25zdCBjaGFyIFdhc21NYWdpY1tdID0geydcMCcsICdhJywgJ3MnLCAnbSd9OworLy8gV2FzbSBiaW5hcnkgZm9ybWF0IHZlcnNpb24KK2NvbnN0IHVpbnQzMl90IFdhc21WZXJzaW9uID0gMHgxOworLy8gV2FzbSB1c2VzIGEgNjRrIHBhZ2Ugc2l6ZQorY29uc3QgdWludDMyX3QgV2FzbVBhZ2VTaXplID0gNjU1MzY7CisKK3N0cnVjdCBXYXNtT2JqZWN0SGVhZGVyIHsKKyAgU3RyaW5nUmVmIE1hZ2ljOworICB1aW50MzJfdCBWZXJzaW9uOworfTsKKworc3RydWN0IFdhc21TaWduYXR1cmUgeworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBQYXJhbVR5cGVzOworICB1aW50OF90IFJldHVyblR5cGU7Cit9OworCitzdHJ1Y3QgV2FzbUV4cG9ydCB7CisgIFN0cmluZ1JlZiBOYW1lOworICB1aW50OF90IEtpbmQ7CisgIHVpbnQzMl90IEluZGV4OworfTsKKworc3RydWN0IFdhc21MaW1pdHMgeworICB1aW50OF90IEZsYWdzOworICB1aW50MzJfdCBJbml0aWFsOworICB1aW50MzJfdCBNYXhpbXVtOworfTsKKworc3RydWN0IFdhc21UYWJsZSB7CisgIHVpbnQ4X3QgRWxlbVR5cGU7CisgIFdhc21MaW1pdHMgTGltaXRzOworfTsKKworc3RydWN0IFdhc21Jbml0RXhwciB7CisgIHVpbnQ4X3QgT3Bjb2RlOworICB1bmlvbiB7CisgICAgaW50MzJfdCBJbnQzMjsKKyAgICBpbnQ2NF90IEludDY0OworICAgIGludDMyX3QgRmxvYXQzMjsKKyAgICBpbnQ2NF90IEZsb2F0NjQ7CisgICAgdWludDMyX3QgR2xvYmFsOworICB9IFZhbHVlOworfTsKKworc3RydWN0IFdhc21HbG9iYWxUeXBlIHsKKyAgdWludDhfdCBUeXBlOworICBib29sIE11dGFibGU7Cit9OworCitzdHJ1Y3QgV2FzbUdsb2JhbCB7CisgIHVpbnQzMl90IEluZGV4OworICBXYXNtR2xvYmFsVHlwZSBUeXBlOworICBXYXNtSW5pdEV4cHIgSW5pdEV4cHI7CisgIFN0cmluZ1JlZiBOYW1lOyAvLyBmcm9tIHRoZSAibGlua2luZyIgb3IgIm5hbWVzIiBzZWN0aW9uCit9OworCitzdHJ1Y3QgV2FzbUltcG9ydCB7CisgIFN0cmluZ1JlZiBNb2R1bGU7CisgIFN0cmluZ1JlZiBGaWVsZDsKKyAgdWludDhfdCBLaW5kOworICB1bmlvbiB7CisgICAgdWludDMyX3QgU2lnSW5kZXg7CisgICAgV2FzbUdsb2JhbFR5cGUgR2xvYmFsOworICAgIFdhc21UYWJsZSBUYWJsZTsKKyAgICBXYXNtTGltaXRzIE1lbW9yeTsKKyAgfTsKK307CisKK3N0cnVjdCBXYXNtTG9jYWxEZWNsIHsKKyAgdWludDhfdCBUeXBlOworICB1aW50MzJfdCBDb3VudDsKK307CisKK3N0cnVjdCBXYXNtRnVuY3Rpb24geworICB1aW50MzJfdCBJbmRleDsKKyAgc3RkOjp2ZWN0b3I8V2FzbUxvY2FsRGVjbD4gTG9jYWxzOworICBBcnJheVJlZjx1aW50OF90PiBCb2R5OworICB1aW50MzJfdCBDb2RlU2VjdGlvbk9mZnNldDsKKyAgdWludDMyX3QgU2l6ZTsKKyAgU3RyaW5nUmVmIE5hbWU7IC8vIGZyb20gdGhlICJsaW5raW5nIiBvciAibmFtZXMiIHNlY3Rpb24KKyAgdWludDMyX3QgQ29tZGF0OyAvLyBmcm9tIHRoZSAiY29tZGF0IGluZm8iIHNlY3Rpb24KK307CisKK3N0cnVjdCBXYXNtRGF0YVNlZ21lbnQgeworICB1aW50MzJfdCBNZW1vcnlJbmRleDsKKyAgV2FzbUluaXRFeHByIE9mZnNldDsKKyAgQXJyYXlSZWY8dWludDhfdD4gQ29udGVudDsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIHVpbnQzMl90IEFsaWdubWVudDsKKyAgdWludDMyX3QgRmxhZ3M7CisgIHVpbnQzMl90IENvbWRhdDsgLy8gZnJvbSB0aGUgImNvbWRhdCBpbmZvIiBzZWN0aW9uCit9OworCitzdHJ1Y3QgV2FzbUVsZW1TZWdtZW50IHsKKyAgdWludDMyX3QgVGFibGVJbmRleDsKKyAgV2FzbUluaXRFeHByIE9mZnNldDsKKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IEZ1bmN0aW9uczsKK307CisKKy8vIFJlcHJlc2VudHMgdGhlIGxvY2F0aW9uIG9mIGEgV2FzbSBkYXRhIHN5bWJvbCB3aXRoaW4gYSBXYXNtRGF0YVNlZ21lbnQsIGFzCisvLyB0aGUgaW5kZXggb2YgdGhlIHNlZ21lbnQsIGFuZCB0aGUgb2Zmc2V0IGFuZCBzaXplIHdpdGhpbiB0aGUgc2VnbWVudC4KK3N0cnVjdCBXYXNtRGF0YVJlZmVyZW5jZSB7CisgIHVpbnQzMl90IFNlZ21lbnQ7CisgIHVpbnQzMl90IE9mZnNldDsKKyAgdWludDMyX3QgU2l6ZTsKK307CisKK3N0cnVjdCBXYXNtUmVsb2NhdGlvbiB7CisgIHVpbnQ4X3QgVHlwZTsgICAgLy8gVGhlIHR5cGUgb2YgdGhlIHJlbG9jYXRpb24uCisgIHVpbnQzMl90IEluZGV4OyAgLy8gSW5kZXggaW50byBlaXRoZXIgc3ltYm9sIG9yIHR5cGUgaW5kZXggc3BhY2UuCisgIHVpbnQ2NF90IE9mZnNldDsgLy8gT2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLgorICBpbnQ2NF90IEFkZGVuZDsgIC8vIEEgdmFsdWUgdG8gYWRkIHRvIHRoZSBzeW1ib2wuCit9OworCitzdHJ1Y3QgV2FzbUluaXRGdW5jIHsKKyAgdWludDMyX3QgUHJpb3JpdHk7CisgIHVpbnQzMl90IFN5bWJvbDsKK307CisKK3N0cnVjdCBXYXNtU3ltYm9sSW5mbyB7CisgIFN0cmluZ1JlZiBOYW1lOworICB1aW50OF90IEtpbmQ7CisgIHVpbnQzMl90IEZsYWdzOworICB1bmlvbiB7CisgICAgLy8gRm9yIGZ1bmN0aW9uIG9yIGdsb2JhbCBzeW1ib2xzLCB0aGUgaW5kZXggaW4gZnVuY3Rpb24gb2YgZ2xvYmFsIGluZGV4CisgICAgLy8gc3BhY2UuCisgICAgdWludDMyX3QgRWxlbWVudEluZGV4OworICAgIC8vIEZvciBhIGRhdGEgc3ltYm9scywgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgcmVsYXRpdmUgdG8gc2VnbWVudC4KKyAgICBXYXNtRGF0YVJlZmVyZW5jZSBEYXRhUmVmOworICB9OworfTsKKworc3RydWN0IFdhc21GdW5jdGlvbk5hbWUgeworICB1aW50MzJfdCBJbmRleDsKKyAgU3RyaW5nUmVmIE5hbWU7Cit9OworCitzdHJ1Y3QgV2FzbUxpbmtpbmdEYXRhIHsKKyAgc3RkOjp2ZWN0b3I8V2FzbUluaXRGdW5jPiBJbml0RnVuY3Rpb25zOworICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IENvbWRhdHM7CisgIHN0ZDo6dmVjdG9yPFdhc21TeW1ib2xJbmZvPiBTeW1ib2xUYWJsZTsKK307CisKK2VudW0gOiB1bnNpZ25lZCB7CisgIFdBU01fU0VDX0NVU1RPTSA9IDAsICAgLy8gQ3VzdG9tIC8gVXNlci1kZWZpbmVkIHNlY3Rpb24KKyAgV0FTTV9TRUNfVFlQRSA9IDEsICAgICAvLyBGdW5jdGlvbiBzaWduYXR1cmUgZGVjbGFyYXRpb25zCisgIFdBU01fU0VDX0lNUE9SVCA9IDIsICAgLy8gSW1wb3J0IGRlY2xhcmF0aW9ucworICBXQVNNX1NFQ19GVU5DVElPTiA9IDMsIC8vIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucworICBXQVNNX1NFQ19UQUJMRSA9IDQsICAgIC8vIEluZGlyZWN0IGZ1bmN0aW9uIHRhYmxlIGFuZCBvdGhlciB0YWJsZXMKKyAgV0FTTV9TRUNfTUVNT1JZID0gNSwgICAvLyBNZW1vcnkgYXR0cmlidXRlcworICBXQVNNX1NFQ19HTE9CQUwgPSA2LCAgIC8vIEdsb2JhbCBkZWNsYXJhdGlvbnMKKyAgV0FTTV9TRUNfRVhQT1JUID0gNywgICAvLyBFeHBvcnRzCisgIFdBU01fU0VDX1NUQVJUID0gOCwgICAgLy8gU3RhcnQgZnVuY3Rpb24gZGVjbGFyYXRpb24KKyAgV0FTTV9TRUNfRUxFTSA9IDksICAgICAvLyBFbGVtZW50cyBzZWN0aW9uCisgIFdBU01fU0VDX0NPREUgPSAxMCwgICAgLy8gRnVuY3Rpb24gYm9kaWVzIChjb2RlKQorICBXQVNNX1NFQ19EQVRBID0gMTEgICAgIC8vIERhdGEgc2VnbWVudHMKK307CisKKy8vIFR5cGUgaW1tZWRpYXRlIGVuY29kaW5ncyB1c2VkIGluIHZhcmlvdXMgY29udGV4dHMuCitlbnVtIDogdW5zaWduZWQgeworICBXQVNNX1RZUEVfSTMyID0gMHg3RiwKKyAgV0FTTV9UWVBFX0k2NCA9IDB4N0UsCisgIFdBU01fVFlQRV9GMzIgPSAweDdELAorICBXQVNNX1RZUEVfRjY0ID0gMHg3QywKKyAgV0FTTV9UWVBFX0FOWUZVTkMgPSAweDcwLAorICBXQVNNX1RZUEVfRVhDRVBUX1JFRiA9IDB4NjgsCisgIFdBU01fVFlQRV9GVU5DID0gMHg2MCwKKyAgV0FTTV9UWVBFX05PUkVTVUxUID0gMHg0MCwgLy8gZm9yIGJsb2NrcyB3aXRoIG5vIHJlc3VsdCB2YWx1ZXMKK307CisKKy8vIEtpbmRzIG9mIGV4dGVybmFscyAoZm9yIGltcG9ydHMgYW5kIGV4cG9ydHMpLgorZW51bSA6IHVuc2lnbmVkIHsKKyAgV0FTTV9FWFRFUk5BTF9GVU5DVElPTiA9IDB4MCwKKyAgV0FTTV9FWFRFUk5BTF9UQUJMRSA9IDB4MSwKKyAgV0FTTV9FWFRFUk5BTF9NRU1PUlkgPSAweDIsCisgIFdBU01fRVhURVJOQUxfR0xPQkFMID0gMHgzLAorfTsKKworLy8gT3Bjb2RlcyB1c2VkIGluIGluaXRpYWxpemVyIGV4cHJlc3Npb25zLgorZW51bSA6IHVuc2lnbmVkIHsKKyAgV0FTTV9PUENPREVfRU5EID0gMHgwYiwKKyAgV0FTTV9PUENPREVfR0VUX0dMT0JBTCA9IDB4MjMsCisgIFdBU01fT1BDT0RFX0kzMl9DT05TVCA9IDB4NDEsCisgIFdBU01fT1BDT0RFX0k2NF9DT05TVCA9IDB4NDIsCisgIFdBU01fT1BDT0RFX0YzMl9DT05TVCA9IDB4NDMsCisgIFdBU01fT1BDT0RFX0Y2NF9DT05TVCA9IDB4NDQsCit9OworCitlbnVtIDogdW5zaWduZWQgeworICBXQVNNX0xJTUlUU19GTEFHX0hBU19NQVggPSAweDEsCit9OworCisvLyBTdWJzZXQgb2YgdHlwZXMgdGhhdCBhIHZhbHVlIGNhbiBoYXZlCitlbnVtIGNsYXNzIFZhbFR5cGUgeworICBJMzIgPSBXQVNNX1RZUEVfSTMyLAorICBJNjQgPSBXQVNNX1RZUEVfSTY0LAorICBGMzIgPSBXQVNNX1RZUEVfRjMyLAorICBGNjQgPSBXQVNNX1RZUEVfRjY0LAorICBFWENFUFRfUkVGID0gV0FTTV9UWVBFX0VYQ0VQVF9SRUYsCit9OworCisvLyBLaW5kIGNvZGVzIHVzZWQgaW4gdGhlIGN1c3RvbSAibmFtZSIgc2VjdGlvbgorZW51bSA6IHVuc2lnbmVkIHsKKyAgV0FTTV9OQU1FU19GVU5DVElPTiA9IDB4MSwKKyAgV0FTTV9OQU1FU19MT0NBTCAgICA9IDB4MiwKK307CisKKy8vIEtpbmQgY29kZXMgdXNlZCBpbiB0aGUgY3VzdG9tICJsaW5raW5nIiBzZWN0aW9uCitlbnVtIDogdW5zaWduZWQgeworICBXQVNNX1NFR01FTlRfSU5GTyAgID0gMHg1LAorICBXQVNNX0lOSVRfRlVOQ1MgICAgID0gMHg2LAorICBXQVNNX0NPTURBVF9JTkZPICAgID0gMHg3LAorICBXQVNNX1NZTUJPTF9UQUJMRSAgID0gMHg4LAorfTsKKworLy8gS2luZCBjb2RlcyB1c2VkIGluIHRoZSBjdXN0b20gImxpbmtpbmciIHNlY3Rpb24gaW4gdGhlIFdBU01fQ09NREFUX0lORk8KK2VudW0gOiB1bnNpZ25lZCB7CisgIFdBU01fQ09NREFUX0RBVEEgICAgICAgID0gMHgwLAorICBXQVNNX0NPTURBVF9GVU5DVElPTiAgICA9IDB4MSwKK307CisKKy8vIEtpbmQgY29kZXMgdXNlZCBpbiB0aGUgY3VzdG9tICJsaW5raW5nIiBzZWN0aW9uIGluIHRoZSBXQVNNX1NZTUJPTF9UQUJMRQorZW51bSBXYXNtU3ltYm9sVHlwZSA6IHVuc2lnbmVkIHsKKyAgV0FTTV9TWU1CT0xfVFlQRV9GVU5DVElPTiA9IDB4MCwKKyAgV0FTTV9TWU1CT0xfVFlQRV9EQVRBICAgICA9IDB4MSwKKyAgV0FTTV9TWU1CT0xfVFlQRV9HTE9CQUwgICA9IDB4MiwKK307CisKK2NvbnN0IHVuc2lnbmVkIFdBU01fU1lNQk9MX0JJTkRJTkdfTUFTSyAgICAgICA9IDB4MzsKK2NvbnN0IHVuc2lnbmVkIFdBU01fU1lNQk9MX1ZJU0lCSUxJVFlfTUFTSyAgICA9IDB4YzsKKworY29uc3QgdW5zaWduZWQgV0FTTV9TWU1CT0xfQklORElOR19HTE9CQUwgICAgID0gMHgwOworY29uc3QgdW5zaWduZWQgV0FTTV9TWU1CT0xfQklORElOR19XRUFLICAgICAgID0gMHgxOworY29uc3QgdW5zaWduZWQgV0FTTV9TWU1CT0xfQklORElOR19MT0NBTCAgICAgID0gMHgyOworY29uc3QgdW5zaWduZWQgV0FTTV9TWU1CT0xfVklTSUJJTElUWV9ERUZBVUxUID0gMHgwOworY29uc3QgdW5zaWduZWQgV0FTTV9TWU1CT0xfVklTSUJJTElUWV9ISURERU4gID0gMHg0OworY29uc3QgdW5zaWduZWQgV0FTTV9TWU1CT0xfVU5ERUZJTkVEICAgICAgICAgID0gMHgxMDsKKworI2RlZmluZSBXQVNNX1JFTE9DKG5hbWUsIHZhbHVlKSBuYW1lID0gdmFsdWUsCisKK2VudW0gOiB1bnNpZ25lZCB7CisjaW5jbHVkZSAiV2FzbVJlbG9jcy5kZWYiCit9OworCisjdW5kZWYgV0FTTV9SRUxPQworCisvLyBVc2VmdWwgY29tcGFyaXNvbiBvcGVyYXRvcnMKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgV2FzbVNpZ25hdHVyZSAmTEhTLCBjb25zdCBXYXNtU2lnbmF0dXJlICZSSFMpIHsKKyAgcmV0dXJuIExIUy5SZXR1cm5UeXBlID09IFJIUy5SZXR1cm5UeXBlICYmIExIUy5QYXJhbVR5cGVzID09IFJIUy5QYXJhbVR5cGVzOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFdhc21TaWduYXR1cmUgJkxIUywgY29uc3QgV2FzbVNpZ25hdHVyZSAmUkhTKSB7CisgIHJldHVybiAhKExIUyA9PSBSSFMpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFdhc21HbG9iYWxUeXBlICZMSFMsIGNvbnN0IFdhc21HbG9iYWxUeXBlICZSSFMpIHsKKyAgcmV0dXJuIExIUy5UeXBlID09IFJIUy5UeXBlICYmIExIUy5NdXRhYmxlID09IFJIUy5NdXRhYmxlOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFdhc21HbG9iYWxUeXBlICZMSFMsIGNvbnN0IFdhc21HbG9iYWxUeXBlICZSSFMpIHsKKyAgcmV0dXJuICEoTEhTID09IFJIUyk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSB3YXNtCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L1dhc21SZWxvY3MuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvV2FzbVJlbG9jcy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZmMGU0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L1dhc21SZWxvY3MuZGVmCkBAIC0wLDAgKzEsMTMgQEAKKworI2lmbmRlZiBXQVNNX1JFTE9DCisjZXJyb3IgIldBU01fUkVMT0MgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKK1dBU01fUkVMT0MoUl9XRUJBU1NFTUJMWV9GVU5DVElPTl9JTkRFWF9MRUIsICAgMCkKK1dBU01fUkVMT0MoUl9XRUJBU1NFTUJMWV9UQUJMRV9JTkRFWF9TTEVCLCAgICAgMSkKK1dBU01fUkVMT0MoUl9XRUJBU1NFTUJMWV9UQUJMRV9JTkRFWF9JMzIsICAgICAgMikKK1dBU01fUkVMT0MoUl9XRUJBU1NFTUJMWV9NRU1PUllfQUREUl9MRUIsICAgICAgMykKK1dBU01fUkVMT0MoUl9XRUJBU1NFTUJMWV9NRU1PUllfQUREUl9TTEVCLCAgICAgNCkKK1dBU01fUkVMT0MoUl9XRUJBU1NFTUJMWV9NRU1PUllfQUREUl9JMzIsICAgICAgNSkKK1dBU01fUkVMT0MoUl9XRUJBU1NFTUJMWV9UWVBFX0lOREVYX0xFQiwgICAgICAgNikKK1dBU01fUkVMT0MoUl9XRUJBU1NFTUJMWV9HTE9CQUxfSU5ERVhfTEVCLCAgICAgNykKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQml0Y29kZS9CaXRDb2Rlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0JpdENvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyMWUxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQml0Y29kZS9CaXRDb2Rlcy5oCkBAIC0wLDAgKzEsMTg1IEBACisvLz09PS0gQml0Q29kZXMuaCAtIEVudW0gdmFsdWVzIGZvciB0aGUgYml0Y29kZSBmb3JtYXQgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIEJpdGNvZGUgZW51bSB2YWx1ZXMuCisvLworLy8gVGhlIGVudW0gdmFsdWVzIGRlZmluZWQgaW4gdGhpcyBmaWxlIHNob3VsZCBiZSBjb25zaWRlcmVkIHBlcm1hbmVudC4gIElmCisvLyBuZXcgZmVhdHVyZXMgYXJlIGFkZGVkLCB0aGV5IHNob3VsZCBoYXZlIHZhbHVlcyBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZQorLy8gcmVzcGVjdGl2ZSBsaXN0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQklUQ09ERV9CSVRDT0RFU19ICisjZGVmaW5lIExMVk1fQklUQ09ERV9CSVRDT0RFU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKy8vLyBPZmZzZXRzIG9mIHRoZSAzMi1iaXQgZmllbGRzIG9mIGJpdGNvZGUgd3JhcHBlciBoZWFkZXIuCitzdGF0aWMgY29uc3QgdW5zaWduZWQgQldIX01hZ2ljRmllbGQgPSAwICogNDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBCV0hfVmVyc2lvbkZpZWxkID0gMSAqIDQ7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgQldIX09mZnNldEZpZWxkID0gMiAqIDQ7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgQldIX1NpemVGaWVsZCA9IDMgKiA0Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIEJXSF9DUFVUeXBlRmllbGQgPSA0ICogNDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBCV0hfSGVhZGVyU2l6ZSA9IDUgKiA0OworCituYW1lc3BhY2UgYml0YyB7CisgIGVudW0gU3RhbmRhcmRXaWR0aHMgeworICAgIEJsb2NrSURXaWR0aCAgID0gOCwgIC8vIFdlIHVzZSBWQlItOCBmb3IgYmxvY2sgSURzLgorICAgIENvZGVMZW5XaWR0aCAgID0gNCwgIC8vIENvZGVsZW4gYXJlIFZCUi00LgorICAgIEJsb2NrU2l6ZVdpZHRoID0gMzIgIC8vIEJsb2NrU2l6ZSB1cCB0byAyXjMyIDMyLWJpdCB3b3JkcyA9IDE2R0IgcGVyIGJsb2NrLgorICB9OworCisgIC8vIFRoZSBzdGFuZGFyZCBhYmJyZXYgbmFtZXNwYWNlIGFsd2F5cyBoYXMgYSB3YXkgdG8gZXhpdCBhIGJsb2NrLCBlbnRlciBhCisgIC8vIG5lc3RlZCBibG9jaywgZGVmaW5lIGFiYnJldnMsIGFuZCBkZWZpbmUgYW4gdW5hYmJyZXZpYXRlZCByZWNvcmQuCisgIGVudW0gRml4ZWRBYmJyZXZJRHMgeworICAgIEVORF9CTE9DSyA9IDAsICAvLyBNdXN0IGJlIHplcm8gdG8gZ3VhcmFudGVlIHRlcm1pbmF0aW9uIGZvciBicm9rZW4gYml0Y29kZS4KKyAgICBFTlRFUl9TVUJCTE9DSyA9IDEsCisKKyAgICAvLy8gREVGSU5FX0FCQlJFViAtIERlZmluZXMgYW4gYWJicmV2IGZvciB0aGUgY3VycmVudCBibG9jay4gIEl0IGNvbnNpc3RzCisgICAgLy8vIG9mIGEgdmJyNSBmb3IgIyBvcGVyYW5kIGluZm9zLiAgRWFjaCBvcGVyYW5kIGluZm8gaXMgZW1pdHRlZCB3aXRoIGEKKyAgICAvLy8gc2luZ2xlIGJpdCB0byBpbmRpY2F0ZSBpZiBpdCBpcyBhIGxpdGVyYWwgZW5jb2RpbmcuICBJZiBzbywgdGhlIHZhbHVlIGlzCisgICAgLy8vIGVtaXR0ZWQgd2l0aCBhIHZicjguICBJZiBub3QsIHRoZSBlbmNvZGluZyBpcyBlbWl0dGVkIGFzIDMgYml0cyBmb2xsb3dlZAorICAgIC8vLyBieSB0aGUgaW5mbyB2YWx1ZSBhcyBhIHZicjUgaWYgbmVlZGVkLgorICAgIERFRklORV9BQkJSRVYgPSAyLAorCisgICAgLy8gVU5BQkJSRVZfUkVDT1JEcyBhcmUgZW1pdHRlZCB3aXRoIGEgdmJyNiBmb3IgdGhlIHJlY29yZCBjb2RlLCBmb2xsb3dlZCBieQorICAgIC8vIGEgdmJyNiBmb3IgdGhlICMgb3BlcmFuZHMsIGZvbGxvd2VkIGJ5IHZicjYncyBmb3IgZWFjaCBvcGVyYW5kLgorICAgIFVOQUJCUkVWX1JFQ09SRCA9IDMsCisKKyAgICAvLyBUaGlzIGlzIG5vdCBhIGNvZGUsIHRoaXMgaXMgYSBtYXJrZXIgZm9yIHRoZSBmaXJzdCBhYmJyZXYgYXNzaWdubWVudC4KKyAgICBGSVJTVF9BUFBMSUNBVElPTl9BQkJSRVYgPSA0CisgIH07CisKKyAgLy8vIFN0YW5kYXJkQmxvY2tJRHMgLSBBbGwgYml0Y29kZSBmaWxlcyBjYW4gb3B0aW9uYWxseSBpbmNsdWRlIGEgQkxPQ0tJTkZPCisgIC8vLyBibG9jaywgd2hpY2ggY29udGFpbnMgbWV0YWRhdGEgYWJvdXQgb3RoZXIgYmxvY2tzIGluIHRoZSBmaWxlLgorICBlbnVtIFN0YW5kYXJkQmxvY2tJRHMgeworICAgIC8vLyBCTE9DS0lORk9fQkxPQ0sgaXMgdXNlZCB0byBkZWZpbmUgbWV0YWRhdGEgYWJvdXQgYmxvY2tzLCBmb3IgZXhhbXBsZSwKKyAgICAvLy8gc3RhbmRhcmQgYWJicmV2cyB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUgdG8gYWxsIGJsb2NrcyBvZiBhIHNwZWNpZmllZAorICAgIC8vLyBJRC4KKyAgICBCTE9DS0lORk9fQkxPQ0tfSUQgPSAwLAorCisgICAgLy8gQmxvY2sgSURzIDEtNyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24uCisgICAgRklSU1RfQVBQTElDQVRJT05fQkxPQ0tJRCA9IDgKKyAgfTsKKworICAvLy8gQmxvY2tJbmZvQ29kZXMgLSBUaGUgYmxvY2tpbmZvIGJsb2NrIGNvbnRhaW5zIG1ldGFkYXRhIGFib3V0IHVzZXItZGVmaW5lZAorICAvLy8gYmxvY2tzLgorICBlbnVtIEJsb2NrSW5mb0NvZGVzIHsKKyAgICAvLyBERUZJTkVfQUJCUkVWIGhhcyBtYWdpYyBzZW1hbnRpY3MgaGVyZSwgYXBwbHlpbmcgdG8gdGhlIGN1cnJlbnQgU0VUQklEJ2QKKyAgICAvLyBibG9jaywgaW5zdGVhZCBvZiB0aGUgQmxvY2tJbmZvIGJsb2NrLgorCisgICAgQkxPQ0tJTkZPX0NPREVfU0VUQklEICAgICAgICA9IDEsIC8vIFNFVEJJRDogW2Jsb2NraWQjXQorICAgIEJMT0NLSU5GT19DT0RFX0JMT0NLTkFNRSAgICAgPSAyLCAvLyBCTE9DS05BTUU6IFtuYW1lXQorICAgIEJMT0NLSU5GT19DT0RFX1NFVFJFQ09SRE5BTUUgPSAzICAvLyBCTE9DS0lORk9fQ09ERV9TRVRSRUNPUkROQU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkLCBuYW1lXQorICB9OworCit9IC8vIEVuZCBiaXRjIG5hbWVzcGFjZQorCisvLy8gQml0Q29kZUFiYnJldk9wIC0gVGhpcyBkZXNjcmliZXMgb25lIG9yIG1vcmUgb3BlcmFuZHMgaW4gYW4gYWJicmV2aWF0aW9uLgorLy8vIFRoaXMgaXMgYWN0dWFsbHkgYSB1bmlvbiBvZiB0d28gZGlmZmVyZW50IHRoaW5nczoKKy8vLyAgIDEuIEl0IGNvdWxkIGJlIGEgbGl0ZXJhbCBpbnRlZ2VyIHZhbHVlICgidGhlIG9wZXJhbmQgaXMgYWx3YXlzIDE3IikuCisvLy8gICAyLiBJdCBjb3VsZCBiZSBhbiBlbmNvZGluZyBzcGVjaWZpY2F0aW9uICgidGhpcyBvcGVyYW5kIGVuY29kZWQgbGlrZSBzbyIpLgorLy8vCitjbGFzcyBCaXRDb2RlQWJicmV2T3AgeworICB1aW50NjRfdCBWYWw7ICAgICAgICAgICAvLyBBIGxpdGVyYWwgdmFsdWUgb3IgZGF0YSBmb3IgYW4gZW5jb2RpbmcuCisgIGJvb2wgSXNMaXRlcmFsIDogMTsgICAgIC8vIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhIGxpdGVyYWwgdmFsdWUgb3Igbm90LgorICB1bnNpZ25lZCBFbmMgICA6IDM7ICAgICAvLyBUaGUgZW5jb2RpbmcgdG8gdXNlLgorcHVibGljOgorICBlbnVtIEVuY29kaW5nIHsKKyAgICBGaXhlZCA9IDEsICAvLyBBIGZpeGVkIHdpZHRoIGZpZWxkLCBWYWwgc3BlY2lmaWVzIG51bWJlciBvZiBiaXRzLgorICAgIFZCUiAgID0gMiwgIC8vIEEgVkJSIGZpZWxkIHdoZXJlIFZhbCBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIGVhY2ggY2h1bmsuCisgICAgQXJyYXkgPSAzLCAgLy8gQSBzZXF1ZW5jZSBvZiBmaWVsZHMsIG5leHQgZmllbGQgc3BlY2llcyBlbHQgZW5jb2RpbmcuCisgICAgQ2hhcjYgPSA0LCAgLy8gQSA2LWJpdCBmaXhlZCBmaWVsZCB3aGljaCBtYXBzIHRvIFthLXpBLVowLTkuX10uCisgICAgQmxvYiAgPSA1ICAgLy8gMzItYml0IGFsaWduZWQgYXJyYXkgb2YgOC1iaXQgY2hhcmFjdGVycy4KKyAgfTsKKworICBleHBsaWNpdCBCaXRDb2RlQWJicmV2T3AodWludDY0X3QgVikgOiAgVmFsKFYpLCBJc0xpdGVyYWwodHJ1ZSkge30KKyAgZXhwbGljaXQgQml0Q29kZUFiYnJldk9wKEVuY29kaW5nIEUsIHVpbnQ2NF90IERhdGEgPSAwKQorICAgIDogVmFsKERhdGEpLCBJc0xpdGVyYWwoZmFsc2UpLCBFbmMoRSkge30KKworICBib29sIGlzTGl0ZXJhbCgpIGNvbnN0ICB7IHJldHVybiBJc0xpdGVyYWw7IH0KKyAgYm9vbCBpc0VuY29kaW5nKCkgY29uc3QgeyByZXR1cm4gIUlzTGl0ZXJhbDsgfQorCisgIC8vIEFjY2Vzc29ycyBmb3IgbGl0ZXJhbHMuCisgIHVpbnQ2NF90IGdldExpdGVyYWxWYWx1ZSgpIGNvbnN0IHsgYXNzZXJ0KGlzTGl0ZXJhbCgpKTsgcmV0dXJuIFZhbDsgfQorCisgIC8vIEFjY2Vzc29ycyBmb3IgZW5jb2RpbmcgaW5mby4KKyAgRW5jb2RpbmcgZ2V0RW5jb2RpbmcoKSBjb25zdCB7IGFzc2VydChpc0VuY29kaW5nKCkpOyByZXR1cm4gKEVuY29kaW5nKUVuYzsgfQorICB1aW50NjRfdCBnZXRFbmNvZGluZ0RhdGEoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzRW5jb2RpbmcoKSAmJiBoYXNFbmNvZGluZ0RhdGEoKSk7CisgICAgcmV0dXJuIFZhbDsKKyAgfQorCisgIGJvb2wgaGFzRW5jb2RpbmdEYXRhKCkgY29uc3QgeyByZXR1cm4gaGFzRW5jb2RpbmdEYXRhKGdldEVuY29kaW5nKCkpOyB9CisgIHN0YXRpYyBib29sIGhhc0VuY29kaW5nRGF0YShFbmNvZGluZyBFKSB7CisgICAgc3dpdGNoIChFKSB7CisgICAgY2FzZSBGaXhlZDoKKyAgICBjYXNlIFZCUjoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgQXJyYXk6CisgICAgY2FzZSBDaGFyNjoKKyAgICBjYXNlIEJsb2I6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiSW52YWxpZCBlbmNvZGluZyIpOworICB9CisKKyAgLy8vIGlzQ2hhcjYgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGNoYXJhY3RlciBpcyBsZWdhbCBpbiB0aGUgQ2hhcjYgZW5jb2RpbmcuCisgIHN0YXRpYyBib29sIGlzQ2hhcjYoY2hhciBDKSB7CisgICAgaWYgKEMgPj0gJ2EnICYmIEMgPD0gJ3onKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoQyA+PSAnQScgJiYgQyA8PSAnWicpIHJldHVybiB0cnVlOworICAgIGlmIChDID49ICcwJyAmJiBDIDw9ICc5JykgcmV0dXJuIHRydWU7CisgICAgaWYgKEMgPT0gJy4nIHx8IEMgPT0gJ18nKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIEVuY29kZUNoYXI2KGNoYXIgQykgeworICAgIGlmIChDID49ICdhJyAmJiBDIDw9ICd6JykgcmV0dXJuIEMtJ2EnOworICAgIGlmIChDID49ICdBJyAmJiBDIDw9ICdaJykgcmV0dXJuIEMtJ0EnKzI2OworICAgIGlmIChDID49ICcwJyAmJiBDIDw9ICc5JykgcmV0dXJuIEMtJzAnKzI2KzI2OworICAgIGlmIChDID09ICcuJykgICAgICAgICAgICAgcmV0dXJuIDYyOworICAgIGlmIChDID09ICdfJykgICAgICAgICAgICAgcmV0dXJuIDYzOworICAgIGxsdm1fdW5yZWFjaGFibGUoIk5vdCBhIHZhbHVlIENoYXI2IGNoYXJhY3RlciEiKTsKKyAgfQorCisgIHN0YXRpYyBjaGFyIERlY29kZUNoYXI2KHVuc2lnbmVkIFYpIHsKKyAgICBhc3NlcnQoKFYgJiB+NjMpID09IDAgJiYgIk5vdCBhIENoYXI2IGVuY29kZWQgY2hhcmFjdGVyISIpOworICAgIHJldHVybiAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkuXyIKKyAgICAgICAgW1ZdOworICB9CisKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc1BvZExpa2U8Qml0Q29kZUFiYnJldk9wPiB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlPXRydWU7IH07CisKKy8vLyBCaXRDb2RlQWJicmV2IC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGFiYnJldmlhdGlvbiByZWNvcmQuICBBbgorLy8vIGFiYnJldmlhdGlvbiBhbGxvd3MgYSBjb21wbGV4IHJlY29yZCB0aGF0IGhhcyByZWR1bmRhbmN5IHRvIGJlIHN0b3JlZCBpbiBhCisvLy8gc3BlY2lhbGl6ZWQgZm9ybWF0IGluc3RlYWQgb2YgdGhlIGZ1bGx5LWdlbmVyYWwsIGZ1bGx5LXZiciwgZm9ybWF0LgorY2xhc3MgQml0Q29kZUFiYnJldiB7CisgIFNtYWxsVmVjdG9yPEJpdENvZGVBYmJyZXZPcCwgMzI+IE9wZXJhbmRMaXN0OworCitwdWJsaWM6CisgIHVuc2lnbmVkIGdldE51bU9wZXJhbmRJbmZvcygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KE9wZXJhbmRMaXN0LnNpemUoKSk7CisgIH0KKyAgY29uc3QgQml0Q29kZUFiYnJldk9wICZnZXRPcGVyYW5kSW5mbyh1bnNpZ25lZCBOKSBjb25zdCB7CisgICAgcmV0dXJuIE9wZXJhbmRMaXN0W05dOworICB9CisKKyAgdm9pZCBBZGQoY29uc3QgQml0Q29kZUFiYnJldk9wICZPcEluZm8pIHsKKyAgICBPcGVyYW5kTGlzdC5wdXNoX2JhY2soT3BJbmZvKTsKKyAgfQorfTsKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0JpdGNvZGVSZWFkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQml0Y29kZS9CaXRjb2RlUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4YmRkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQml0Y29kZS9CaXRjb2RlUmVhZGVyLmgKQEAgLTAsMCArMSwyNzIgQEAKKy8vPT09LSBsbHZtL0JpdGNvZGUvQml0Y29kZVJlYWRlci5oIC0gQml0Y29kZSByZWFkZXIgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyBpbnRlcmZhY2VzIHRvIHJlYWQgTExWTSBiaXRjb2RlIGZpbGVzL3N0cmVhbXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0JJVENPREVfQklUQ09ERVJFQURFUl9ICisjZGVmaW5lIExMVk1fQklUQ09ERV9CSVRDT0RFUkVBREVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9CaXRjb2RlL0JpdENvZGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGVTdW1tYXJ5SW5kZXguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yT3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKyNpbmNsdWRlIDx2ZWN0b3I+CituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgTW9kdWxlOworCisgIC8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZm9yIGNvbnZlcnRpbmcgRXhwZWN0ZWQvRXJyb3IgdmFsdWVzIHRvCisgIC8vIEVycm9yT3Ivc3RkOjplcnJvcl9jb2RlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IGNsaWVudHMuIEZJWE1FOgorICAvLyBSZW1vdmUgdGhlc2UgZnVuY3Rpb25zIG9uY2Ugbm8gbG9uZ2VyIG5lZWRlZCBieSB0aGUgQyBhbmQgbGliTFRPIEFQSXMuCisKKyAgc3RkOjplcnJvcl9jb2RlIGVycm9yVG9FcnJvckNvZGVBbmRFbWl0RXJyb3JzKExMVk1Db250ZXh0ICZDdHgsIEVycm9yIEVycik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIEVycm9yT3I8VD4gZXhwZWN0ZWRUb0Vycm9yT3JBbmRFbWl0RXJyb3JzKExMVk1Db250ZXh0ICZDdHgsIEV4cGVjdGVkPFQ+IFZhbCkgeworICAgIGlmICghVmFsKQorICAgICAgcmV0dXJuIGVycm9yVG9FcnJvckNvZGVBbmRFbWl0RXJyb3JzKEN0eCwgVmFsLnRha2VFcnJvcigpKTsKKyAgICByZXR1cm4gc3RkOjptb3ZlKCpWYWwpOworICB9CisKKyAgc3RydWN0IEJpdGNvZGVGaWxlQ29udGVudHM7CisKKyAgLy8vIEJhc2ljIGluZm9ybWF0aW9uIGV4dHJhY3RlZCBmcm9tIGEgYml0Y29kZSBtb2R1bGUgdG8gYmUgdXNlZCBmb3IgTFRPLgorICBzdHJ1Y3QgQml0Y29kZUxUT0luZm8geworICAgIGJvb2wgSXNUaGluTFRPOworICAgIGJvb2wgSGFzU3VtbWFyeTsKKyAgfTsKKworICAvLy8gUmVwcmVzZW50cyBhIG1vZHVsZSBpbiBhIGJpdGNvZGUgZmlsZS4KKyAgY2xhc3MgQml0Y29kZU1vZHVsZSB7CisgICAgLy8gVGhpcyBjb3ZlcnMgdGhlIGlkZW50aWZpY2F0aW9uIChpZiBwcmVzZW50KSBhbmQgbW9kdWxlIGJsb2Nrcy4KKyAgICBBcnJheVJlZjx1aW50OF90PiBCdWZmZXI7CisgICAgU3RyaW5nUmVmIE1vZHVsZUlkZW50aWZpZXI7CisKKyAgICAvLyBUaGUgc3RyaW5nIHRhYmxlIHVzZWQgdG8gaW50ZXJwcmV0IHRoaXMgbW9kdWxlLgorICAgIFN0cmluZ1JlZiBTdHJ0YWI7CisKKyAgICAvLyBUaGUgYml0c3RyZWFtIGxvY2F0aW9uIG9mIHRoZSBJREVOVElGSUNBVElPTl9CTE9DSy4KKyAgICB1aW50NjRfdCBJZGVudGlmaWNhdGlvbkJpdDsKKworICAgIC8vIFRoZSBiaXRzdHJlYW0gbG9jYXRpb24gb2YgdGhpcyBtb2R1bGUncyBNT0RVTEVfQkxPQ0suCisgICAgdWludDY0X3QgTW9kdWxlQml0OworCisgICAgQml0Y29kZU1vZHVsZShBcnJheVJlZjx1aW50OF90PiBCdWZmZXIsIFN0cmluZ1JlZiBNb2R1bGVJZGVudGlmaWVyLAorICAgICAgICAgICAgICAgICAgdWludDY0X3QgSWRlbnRpZmljYXRpb25CaXQsIHVpbnQ2NF90IE1vZHVsZUJpdCkKKyAgICAgICAgOiBCdWZmZXIoQnVmZmVyKSwgTW9kdWxlSWRlbnRpZmllcihNb2R1bGVJZGVudGlmaWVyKSwKKyAgICAgICAgICBJZGVudGlmaWNhdGlvbkJpdChJZGVudGlmaWNhdGlvbkJpdCksIE1vZHVsZUJpdChNb2R1bGVCaXQpIHt9CisKKyAgICAvLyBDYWxscyB0aGUgY3Rvci4KKyAgICBmcmllbmQgRXhwZWN0ZWQ8Qml0Y29kZUZpbGVDb250ZW50cz4KKyAgICBnZXRCaXRjb2RlRmlsZUNvbnRlbnRzKE1lbW9yeUJ1ZmZlclJlZiBCdWZmZXIpOworCisgICAgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4+IGdldE1vZHVsZUltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNYXRlcmlhbGl6ZUFsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZExhenlMb2FkTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0ltcG9ydGluZyk7CisKKyAgcHVibGljOgorICAgIFN0cmluZ1JlZiBnZXRCdWZmZXIoKSBjb25zdCB7CisgICAgICByZXR1cm4gU3RyaW5nUmVmKChjb25zdCBjaGFyICopQnVmZmVyLmJlZ2luKCksIEJ1ZmZlci5zaXplKCkpOworICAgIH0KKworICAgIFN0cmluZ1JlZiBnZXRTdHJ0YWIoKSBjb25zdCB7IHJldHVybiBTdHJ0YWI7IH0KKworICAgIFN0cmluZ1JlZiBnZXRNb2R1bGVJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gTW9kdWxlSWRlbnRpZmllcjsgfQorCisgICAgLy8vIFJlYWQgdGhlIGJpdGNvZGUgbW9kdWxlIGFuZCBwcmVwYXJlIGZvciBsYXp5IGRlc2VyaWFsaXphdGlvbiBvZiBmdW5jdGlvbgorICAgIC8vLyBib2RpZXMuIElmIFNob3VsZExhenlMb2FkTWV0YWRhdGEgaXMgdHJ1ZSwgbGF6aWx5IGxvYWQgbWV0YWRhdGEgYXMgd2VsbC4KKyAgICAvLy8gSWYgSXNJbXBvcnRpbmcgaXMgdHJ1ZSwgdGhpcyBtb2R1bGUgaXMgYmVpbmcgcGFyc2VkIGZvciBUaGluTFRPCisgICAgLy8vIGltcG9ydGluZyBpbnRvIGFub3RoZXIgbW9kdWxlLgorICAgIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+PiBnZXRMYXp5TW9kdWxlKExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkTGF6eUxvYWRNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzSW1wb3J0aW5nKTsKKworICAgIC8vLyBSZWFkIHRoZSBlbnRpcmUgYml0Y29kZSBtb2R1bGUgYW5kIHJldHVybiBpdC4KKyAgICBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPj4gcGFyc2VNb2R1bGUoTExWTUNvbnRleHQgJkNvbnRleHQpOworCisgICAgLy8vIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vZHVsZSB0byBiZSB1c2VkIGZvciBMVE86IHdoZXRoZXIgdG8KKyAgICAvLy8gY29tcGlsZSB3aXRoIFRoaW5MVE8sIGFuZCB3aGV0aGVyIGl0IGhhcyBhIHN1bW1hcnkuCisgICAgRXhwZWN0ZWQ8Qml0Y29kZUxUT0luZm8+IGdldExUT0luZm8oKTsKKworICAgIC8vLyBQYXJzZSB0aGUgc3BlY2lmaWVkIGJpdGNvZGUgYnVmZmVyLCByZXR1cm5pbmcgdGhlIG1vZHVsZSBzdW1tYXJ5IGluZGV4LgorICAgIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGVTdW1tYXJ5SW5kZXg+PiBnZXRTdW1tYXJ5KCk7CisKKyAgICAvLy8gUGFyc2UgdGhlIHNwZWNpZmllZCBiaXRjb2RlIGJ1ZmZlciBhbmQgbWVyZ2UgaXRzIG1vZHVsZSBzdW1tYXJ5IGluZGV4CisgICAgLy8vIGludG8gQ29tYmluZWRJbmRleC4KKyAgICBFcnJvciByZWFkU3VtbWFyeShNb2R1bGVTdW1tYXJ5SW5kZXggJkNvbWJpbmVkSW5kZXgsIFN0cmluZ1JlZiBNb2R1bGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE1vZHVsZUlkKTsKKyAgfTsKKworICBzdHJ1Y3QgQml0Y29kZUZpbGVDb250ZW50cyB7CisgICAgc3RkOjp2ZWN0b3I8Qml0Y29kZU1vZHVsZT4gTW9kczsKKyAgICBTdHJpbmdSZWYgU3ltdGFiLCBTdHJ0YWJGb3JTeW10YWI7CisgIH07CisKKyAgLy8vIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIGEgYml0Y29kZSBmaWxlLiBUaGlzIGluY2x1ZGVzIHRoZSByYXcgY29udGVudHMgb2YKKyAgLy8vIHRoZSBzeW1ib2wgdGFibGUgZW1iZWRkZWQgaW4gdGhlIGJpdGNvZGUgZmlsZS4gQ2xpZW50cyB3aGljaCByZXF1aXJlIGEKKyAgLy8vIHN5bWJvbCB0YWJsZSBzaG91bGQgcHJlZmVyIHRvIHVzZSBpcnN5bXRhYjo6cmVhZCBpbnN0ZWFkIG9mIHRoaXMgZnVuY3Rpb24KKyAgLy8vIGJlY2F1c2UgaXQgY3JlYXRlcyBhIHJlYWRlciBmb3IgdGhlIGlyc3ltdGFiIGFuZCBoYW5kbGVzIHVwZ3JhZGluZyBiaXRjb2RlCisgIC8vLyBmaWxlcyB3aXRob3V0IGEgc3ltYm9sIHRhYmxlIG9yIHdpdGggYW4gb2xkIHN5bWJvbCB0YWJsZS4KKyAgRXhwZWN0ZWQ8Qml0Y29kZUZpbGVDb250ZW50cz4gZ2V0Qml0Y29kZUZpbGVDb250ZW50cyhNZW1vcnlCdWZmZXJSZWYgQnVmZmVyKTsKKworICAvLy8gUmV0dXJucyBhIGxpc3Qgb2YgbW9kdWxlcyBpbiB0aGUgc3BlY2lmaWVkIGJpdGNvZGUgYnVmZmVyLgorICBFeHBlY3RlZDxzdGQ6OnZlY3RvcjxCaXRjb2RlTW9kdWxlPj4KKyAgZ2V0Qml0Y29kZU1vZHVsZUxpc3QoTWVtb3J5QnVmZmVyUmVmIEJ1ZmZlcik7CisKKyAgLy8vIFJlYWQgdGhlIGhlYWRlciBvZiB0aGUgc3BlY2lmaWVkIGJpdGNvZGUgYnVmZmVyIGFuZCBwcmVwYXJlIGZvciBsYXp5CisgIC8vLyBkZXNlcmlhbGl6YXRpb24gb2YgZnVuY3Rpb24gYm9kaWVzLiBJZiBTaG91bGRMYXp5TG9hZE1ldGFkYXRhIGlzIHRydWUsCisgIC8vLyBsYXppbHkgbG9hZCBtZXRhZGF0YSBhcyB3ZWxsLiBJZiBJc0ltcG9ydGluZyBpcyB0cnVlLCB0aGlzIG1vZHVsZSBpcworICAvLy8gYmVpbmcgcGFyc2VkIGZvciBUaGluTFRPIGltcG9ydGluZyBpbnRvIGFub3RoZXIgbW9kdWxlLgorICBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPj4KKyAgZ2V0TGF6eUJpdGNvZGVNb2R1bGUoTWVtb3J5QnVmZmVyUmVmIEJ1ZmZlciwgTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkTGF6eUxvYWRNZXRhZGF0YSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIElzSW1wb3J0aW5nID0gZmFsc2UpOworCisgIC8vLyBMaWtlIGdldExhenlCaXRjb2RlTW9kdWxlLCBleGNlcHQgdGhhdCB0aGUgbW9kdWxlIHRha2VzIG93bmVyc2hpcCBvZgorICAvLy8gdGhlIG1lbW9yeSBidWZmZXIgaWYgc3VjY2Vzc2Z1bC4gSWYgc3VjY2Vzc2Z1bCwgdGhpcyBtb3ZlcyBCdWZmZXIuIE9uCisgIC8vLyBlcnJvciwgdGhpcyAqZG9lcyBub3QqIG1vdmUgQnVmZmVyLiBJZiBJc0ltcG9ydGluZyBpcyB0cnVlLCB0aGlzIG1vZHVsZSBpcworICAvLy8gYmVpbmcgcGFyc2VkIGZvciBUaGluTFRPIGltcG9ydGluZyBpbnRvIGFub3RoZXIgbW9kdWxlLgorICBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPj4gZ2V0T3duaW5nTGF6eUJpdGNvZGVNb2R1bGUoCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiAmJkJ1ZmZlciwgTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICBib29sIFNob3VsZExhenlMb2FkTWV0YWRhdGEgPSBmYWxzZSwgYm9vbCBJc0ltcG9ydGluZyA9IGZhbHNlKTsKKworICAvLy8gUmVhZCB0aGUgaGVhZGVyIG9mIHRoZSBzcGVjaWZpZWQgYml0Y29kZSBidWZmZXIgYW5kIGV4dHJhY3QganVzdCB0aGUKKyAgLy8vIHRyaXBsZSBpbmZvcm1hdGlvbi4gSWYgc3VjY2Vzc2Z1bCwgdGhpcyByZXR1cm5zIGEgc3RyaW5nLiBPbiBlcnJvciwgdGhpcworICAvLy8gcmV0dXJucyAiIi4KKyAgRXhwZWN0ZWQ8c3RkOjpzdHJpbmc+IGdldEJpdGNvZGVUYXJnZXRUcmlwbGUoTWVtb3J5QnVmZmVyUmVmIEJ1ZmZlcik7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIFxwIEJ1ZmZlciBjb250YWlucyBhIGJpdGNvZGUgZmlsZSB3aXRoIE9iakMgY29kZSAoY2F0ZWdvcnkKKyAgLy8vIG9yIGNsYXNzKSBpbiBpdC4KKyAgRXhwZWN0ZWQ8Ym9vbD4gaXNCaXRjb2RlQ29udGFpbmluZ09iakNDYXRlZ29yeShNZW1vcnlCdWZmZXJSZWYgQnVmZmVyKTsKKworICAvLy8gUmVhZCB0aGUgaGVhZGVyIG9mIHRoZSBzcGVjaWZpZWQgYml0Y29kZSBidWZmZXIgYW5kIGV4dHJhY3QganVzdCB0aGUKKyAgLy8vIHByb2R1Y2VyIHN0cmluZyBpbmZvcm1hdGlvbi4gSWYgc3VjY2Vzc2Z1bCwgdGhpcyByZXR1cm5zIGEgc3RyaW5nLiBPbgorICAvLy8gZXJyb3IsIHRoaXMgcmV0dXJucyAiIi4KKyAgRXhwZWN0ZWQ8c3RkOjpzdHJpbmc+IGdldEJpdGNvZGVQcm9kdWNlclN0cmluZyhNZW1vcnlCdWZmZXJSZWYgQnVmZmVyKTsKKworICAvLy8gUmVhZCB0aGUgc3BlY2lmaWVkIGJpdGNvZGUgZmlsZSwgcmV0dXJuaW5nIHRoZSBtb2R1bGUuCisgIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+PiBwYXJzZUJpdGNvZGVGaWxlKE1lbW9yeUJ1ZmZlclJlZiBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDb250ZXh0KTsKKworICAvLy8gUmV0dXJucyBMVE8gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgYml0Y29kZSBmaWxlLgorICBFeHBlY3RlZDxCaXRjb2RlTFRPSW5mbz4gZ2V0Qml0Y29kZUxUT0luZm8oTWVtb3J5QnVmZmVyUmVmIEJ1ZmZlcik7CisKKyAgLy8vIFBhcnNlIHRoZSBzcGVjaWZpZWQgYml0Y29kZSBidWZmZXIsIHJldHVybmluZyB0aGUgbW9kdWxlIHN1bW1hcnkgaW5kZXguCisgIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGVTdW1tYXJ5SW5kZXg+PgorICBnZXRNb2R1bGVTdW1tYXJ5SW5kZXgoTWVtb3J5QnVmZmVyUmVmIEJ1ZmZlcik7CisKKyAgLy8vIFBhcnNlIHRoZSBzcGVjaWZpZWQgYml0Y29kZSBidWZmZXIgYW5kIG1lcmdlIHRoZSBpbmRleCBpbnRvIENvbWJpbmVkSW5kZXguCisgIEVycm9yIHJlYWRNb2R1bGVTdW1tYXJ5SW5kZXgoTWVtb3J5QnVmZmVyUmVmIEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVTdW1tYXJ5SW5kZXggJkNvbWJpbmVkSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgTW9kdWxlSWQpOworCisgIC8vLyBQYXJzZSB0aGUgbW9kdWxlIHN1bW1hcnkgaW5kZXggb3V0IG9mIGFuIElSIGZpbGUgYW5kIHJldHVybiB0aGUgbW9kdWxlCisgIC8vLyBzdW1tYXJ5IGluZGV4IG9iamVjdCBpZiBmb3VuZCwgb3IgYW4gZW1wdHkgc3VtbWFyeSBpZiBub3QuIElmIFBhdGggcmVmZXJzCisgIC8vLyB0byBhbiBlbXB0eSBmaWxlIGFuZCBJZ25vcmVFbXB0eVRoaW5MVE9JbmRleEZpbGUgaXMgdHJ1ZSwgdGhlbgorICAvLy8gdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBudWxscHRyLgorICBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlU3VtbWFyeUluZGV4Pj4KKyAgZ2V0TW9kdWxlU3VtbWFyeUluZGV4Rm9yRmlsZShTdHJpbmdSZWYgUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElnbm9yZUVtcHR5VGhpbkxUT0luZGV4RmlsZSA9IGZhbHNlKTsKKworICAvLy8gaXNCaXRjb2RlV3JhcHBlciAtIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBieXRlcyBhcmUgdGhlIG1hZ2ljIGJ5dGVzCisgIC8vLyBmb3IgYW4gTExWTSBJUiBiaXRjb2RlIHdyYXBwZXIuCisgIGlubGluZSBib29sIGlzQml0Y29kZVdyYXBwZXIoY29uc3QgdW5zaWduZWQgY2hhciAqQnVmUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKkJ1ZkVuZCkgeworICAgIC8vIFNlZSBpZiB5b3UgY2FuIGZpbmQgdGhlIGhpZGRlbiBtZXNzYWdlIGluIHRoZSBtYWdpYyBieXRlcyA6LSkuCisgICAgLy8gKEhpbnQ6IGl0J3MgYSBsaXR0bGUtZW5kaWFuIGVuY29kaW5nLikKKyAgICByZXR1cm4gQnVmUHRyICE9IEJ1ZkVuZCAmJgorICAgICAgICAgICBCdWZQdHJbMF0gPT0gMHhERSAmJgorICAgICAgICAgICBCdWZQdHJbMV0gPT0gMHhDMCAmJgorICAgICAgICAgICBCdWZQdHJbMl0gPT0gMHgxNyAmJgorICAgICAgICAgICBCdWZQdHJbM10gPT0gMHgwQjsKKyAgfQorCisgIC8vLyBpc1Jhd0JpdGNvZGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZXMgYXJlIHRoZSBtYWdpYyBieXRlcyBmb3IKKyAgLy8vIHJhdyBMTFZNIElSIGJpdGNvZGUgKHdpdGhvdXQgYSB3cmFwcGVyKS4KKyAgaW5saW5lIGJvb2wgaXNSYXdCaXRjb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKkJ1ZlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKkJ1ZkVuZCkgeworICAgIC8vIFRoZXNlIGJ5dGVzIHNvcnQgb2YgaGF2ZSBhIGhpZGRlbiBtZXNzYWdlLCBidXQgaXQncyBub3QgaW4KKyAgICAvLyBsaXR0bGUtZW5kaWFuIHRoaXMgdGltZSwgYW5kIGl0J3MgYSBsaXR0bGUgcmVkdW5kYW50LgorICAgIHJldHVybiBCdWZQdHIgIT0gQnVmRW5kICYmCisgICAgICAgICAgIEJ1ZlB0clswXSA9PSAnQicgJiYKKyAgICAgICAgICAgQnVmUHRyWzFdID09ICdDJyAmJgorICAgICAgICAgICBCdWZQdHJbMl0gPT0gMHhjMCAmJgorICAgICAgICAgICBCdWZQdHJbM10gPT0gMHhkZTsKKyAgfQorCisgIC8vLyBpc0JpdGNvZGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZXMgYXJlIHRoZSBtYWdpYyBieXRlcyBmb3IKKyAgLy8vIExMVk0gSVIgYml0Y29kZSwgZWl0aGVyIHdpdGggb3Igd2l0aG91dCBhIHdyYXBwZXIuCisgIGlubGluZSBib29sIGlzQml0Y29kZShjb25zdCB1bnNpZ25lZCBjaGFyICpCdWZQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpCdWZFbmQpIHsKKyAgICByZXR1cm4gaXNCaXRjb2RlV3JhcHBlcihCdWZQdHIsIEJ1ZkVuZCkgfHwKKyAgICAgICAgICAgaXNSYXdCaXRjb2RlKEJ1ZlB0ciwgQnVmRW5kKTsKKyAgfQorCisgIC8vLyBTa2lwQml0Y29kZVdyYXBwZXJIZWFkZXIgLSBTb21lIHN5c3RlbXMgd3JhcCBiYyBmaWxlcyB3aXRoIGEgc3BlY2lhbAorICAvLy8gaGVhZGVyIGZvciBwYWRkaW5nIG9yIG90aGVyIHJlYXNvbnMuICBUaGUgZm9ybWF0IG9mIHRoaXMgaGVhZGVyIGlzOgorICAvLy8KKyAgLy8vIHN0cnVjdCBiY19oZWFkZXIgeworICAvLy8gICB1aW50MzJfdCBNYWdpYzsgICAgICAgICAvLyAweDBCMTdDMERFCisgIC8vLyAgIHVpbnQzMl90IFZlcnNpb247ICAgICAgIC8vIFZlcnNpb24sIGN1cnJlbnRseSBhbHdheXMgMC4KKyAgLy8vICAgdWludDMyX3QgQml0Y29kZU9mZnNldDsgLy8gT2Zmc2V0IHRvIHRyYWRpdGlvbmFsIGJpdGNvZGUgZmlsZS4KKyAgLy8vICAgdWludDMyX3QgQml0Y29kZVNpemU7ICAgLy8gU2l6ZSBvZiB0cmFkaXRpb25hbCBiaXRjb2RlIGZpbGUuCisgIC8vLyAgIC4uLiBwb3RlbnRpYWxseSBvdGhlciBndW5rIC4uLgorICAvLy8gfTsKKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIGZpbmQgYSBmaWxlIHdpdGggYSBtYXRjaGluZyBtYWdpYyBudW1iZXIuCisgIC8vLyBJbiB0aGlzIGNhc2UsIHNraXAgZG93biB0byB0aGUgc3Vic2VjdGlvbiBvZiB0aGUgZmlsZSB0aGF0IGlzIGFjdHVhbGx5IGEKKyAgLy8vIEJDIGZpbGUuCisgIC8vLyBJZiAnVmVyaWZ5QnVmZmVyU2l6ZScgaXMgdHJ1ZSwgY2hlY2sgdGhhdCB0aGUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0bworICAvLy8gY29udGFpbiB0aGUgd2hvbGUgYml0Y29kZSBmaWxlLgorICBpbmxpbmUgYm9vbCBTa2lwQml0Y29kZVdyYXBwZXJIZWFkZXIoY29uc3QgdW5zaWduZWQgY2hhciAqJkJ1ZlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiZCdWZFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFZlcmlmeUJ1ZmZlclNpemUpIHsKKyAgICAvLyBNdXN0IGNvbnRhaW4gdGhlIG9mZnNldCBhbmQgc2l6ZSBmaWVsZCEKKyAgICBpZiAodW5zaWduZWQoQnVmRW5kIC0gQnVmUHRyKSA8IEJXSF9TaXplRmllbGQgKyA0KQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB1bnNpZ25lZCBPZmZzZXQgPSBzdXBwb3J0OjplbmRpYW46OnJlYWQzMmxlKCZCdWZQdHJbQldIX09mZnNldEZpZWxkXSk7CisgICAgdW5zaWduZWQgU2l6ZSA9IHN1cHBvcnQ6OmVuZGlhbjo6cmVhZDMybGUoJkJ1ZlB0cltCV0hfU2l6ZUZpZWxkXSk7CisgICAgdWludDY0X3QgQml0Y29kZU9mZnNldEVuZCA9ICh1aW50NjRfdClPZmZzZXQgKyAodWludDY0X3QpU2l6ZTsKKworICAgIC8vIFZlcmlmeSB0aGF0IE9mZnNldCtTaXplIGZpdHMgaW4gdGhlIGZpbGUuCisgICAgaWYgKFZlcmlmeUJ1ZmZlclNpemUgJiYgQml0Y29kZU9mZnNldEVuZCA+IHVpbnQ2NF90KEJ1ZkVuZC1CdWZQdHIpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgQnVmUHRyICs9IE9mZnNldDsKKyAgICBCdWZFbmQgPSBCdWZQdHIrU2l6ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb25zdCBzdGQ6OmVycm9yX2NhdGVnb3J5ICZCaXRjb2RlRXJyb3JDYXRlZ29yeSgpOworICBlbnVtIGNsYXNzIEJpdGNvZGVFcnJvciB7IENvcnJ1cHRlZEJpdGNvZGUgPSAxIH07CisgIGlubGluZSBzdGQ6OmVycm9yX2NvZGUgbWFrZV9lcnJvcl9jb2RlKEJpdGNvZGVFcnJvciBFKSB7CisgICAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZShzdGF0aWNfY2FzdDxpbnQ+KEUpLCBCaXRjb2RlRXJyb3JDYXRlZ29yeSgpKTsKKyAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCituYW1lc3BhY2Ugc3RkIHsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzX2Vycm9yX2NvZGVfZW51bTxsbHZtOjpCaXRjb2RlRXJyb3I+IDogc3RkOjp0cnVlX3R5cGUge307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIExMVk1fQklUQ09ERV9CSVRDT0RFUkVBREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQml0Y29kZS9CaXRjb2RlV3JpdGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpdGNvZGUvQml0Y29kZVdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMzIyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpdGNvZGUvQml0Y29kZVdyaXRlci5oCkBAIC0wLDAgKzEsMTU3IEBACisvLz09PS0gbGx2bS9CaXRjb2RlL0JpdGNvZGVXcml0ZXIuaCAtIEJpdGNvZGUgd3JpdGVycyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgaW50ZXJmYWNlcyB0byB3cml0ZSBMTFZNIGJpdGNvZGUgZmlsZXMvc3RyZWFtcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQklUQ09ERV9CSVRDT0RFV1JJVEVSX0gKKyNkZWZpbmUgTExWTV9CSVRDT0RFX0JJVENPREVXUklURVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGVTdW1tYXJ5SW5kZXguaCIKKyNpbmNsdWRlICJsbHZtL01DL1N0cmluZ1RhYmxlQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQml0c3RyZWFtV3JpdGVyOworY2xhc3MgTW9kdWxlOworY2xhc3MgcmF3X29zdHJlYW07CisKKyAgY2xhc3MgQml0Y29kZVdyaXRlciB7CisgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZCdWZmZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJpdHN0cmVhbVdyaXRlcj4gU3RyZWFtOworCisgICAgU3RyaW5nVGFibGVCdWlsZGVyIFN0cnRhYkJ1aWxkZXJ7U3RyaW5nVGFibGVCdWlsZGVyOjpSQVd9OworCisgICAgLy8gT3ducyBhbnkgc3RyaW5ncyBjcmVhdGVkIGJ5IHRoZSBpcnN5bXRhYiB3cml0ZXIgdW50aWwgd2UgY3JlYXRlIHRoZQorICAgIC8vIHN0cmluZyB0YWJsZS4KKyAgICBCdW1wUHRyQWxsb2NhdG9yIEFsbG9jOworCisgICAgYm9vbCBXcm90ZVN0cnRhYiA9IGZhbHNlLCBXcm90ZVN5bXRhYiA9IGZhbHNlOworCisgICAgdm9pZCB3cml0ZUJsb2IodW5zaWduZWQgQmxvY2ssIHVuc2lnbmVkIFJlY29yZCwgU3RyaW5nUmVmIEJsb2IpOworCisgICAgc3RkOjp2ZWN0b3I8TW9kdWxlICo+IE1vZHM7CisKKyAgcHVibGljOgorICAgIC8vLyBDcmVhdGUgYSBCaXRjb2RlV3JpdGVyIHRoYXQgd3JpdGVzIHRvIEJ1ZmZlci4KKyAgICBCaXRjb2RlV3JpdGVyKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmQnVmZmVyKTsKKworICAgIH5CaXRjb2RlV3JpdGVyKCk7CisKKyAgICAvLy8gQXR0ZW1wdCB0byB3cml0ZSBhIHN5bWJvbCB0YWJsZSB0byB0aGUgYml0Y29kZSBmaWxlLiBUaGlzIG11c3QgYmUgY2FsbGVkCisgICAgLy8vIGF0IG1vc3Qgb25jZSBhZnRlciBhbGwgbW9kdWxlcyBoYXZlIGJlZW4gd3JpdHRlbi4KKyAgICAvLy8KKyAgICAvLy8gQSByZWFkZXIgZG9lcyBub3QgcmVxdWlyZSBhIHN5bWJvbCB0YWJsZSB0byBpbnRlcnByZXQgYSBiaXRjb2RlIGZpbGU7CisgICAgLy8vIHRoZSBzeW1ib2wgdGFibGUgaXMgbmVlZGVkIG9ubHkgdG8gaW1wcm92ZSBsaW5rLXRpbWUgcGVyZm9ybWFuY2UuIFNvCisgICAgLy8vIHRoaXMgZnVuY3Rpb24gbWF5IGRlY2lkZSBub3QgdG8gd3JpdGUgYSBzeW1ib2wgdGFibGUuIEl0IG1heSBzbyBkZWNpZGUKKyAgICAvLy8gaWYsIGZvciBleGFtcGxlLCB0aGUgdGFyZ2V0IGlzIHVucmVnaXN0ZXJlZCBvciB0aGUgSVIgaXMgbWFsZm9ybWVkLgorICAgIHZvaWQgd3JpdGVTeW10YWIoKTsKKworICAgIC8vLyBXcml0ZSB0aGUgYml0Y29kZSBmaWxlJ3Mgc3RyaW5nIHRhYmxlLiBUaGlzIG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZQorICAgIC8vLyBhZnRlciBhbGwgbW9kdWxlcyBhbmQgdGhlIG9wdGlvbmFsIHN5bWJvbCB0YWJsZSBoYXZlIGJlZW4gd3JpdHRlbi4KKyAgICB2b2lkIHdyaXRlU3RydGFiKCk7CisKKyAgICAvLy8gQ29weSB0aGUgc3RyaW5nIHRhYmxlIGZvciBhbm90aGVyIG1vZHVsZSBpbnRvIHRoaXMgYml0Y29kZSBmaWxlLiBUaGlzCisgICAgLy8vIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgY29weWluZyB0aGUgbW9kdWxlIGl0c2VsZiBpbnRvIHRoZSBiaXRjb2RlIGZpbGUuCisgICAgdm9pZCBjb3B5U3RydGFiKFN0cmluZ1JlZiBTdHJ0YWIpOworCisgICAgLy8vIFdyaXRlIHRoZSBzcGVjaWZpZWQgbW9kdWxlIHRvIHRoZSBidWZmZXIgc3BlY2lmaWVkIGF0IGNvbnN0cnVjdGlvbiB0aW1lLgorICAgIC8vLworICAgIC8vLyBJZiBcYyBTaG91bGRQcmVzZXJ2ZVVzZUxpc3RPcmRlciwgZW5jb2RlIHRoZSB1c2UtbGlzdCBvcmRlciBmb3IgZWFjaCBcYQorICAgIC8vLyBWYWx1ZSBpbiBcYyBNLiAgVGhlc2Ugd2lsbCBiZSByZWNvbnN0cnVjdGVkIGV4YWN0bHkgd2hlbiBcYSBNIGlzCisgICAgLy8vIGRlc2VyaWFsaXplZC4KKyAgICAvLy8KKyAgICAvLy8gSWYgXGMgSW5kZXggaXMgc3VwcGxpZWQsIHRoZSBiaXRjb2RlIHdpbGwgY29udGFpbiB0aGUgc3VtbWFyeSBpbmRleAorICAgIC8vLyAoY3VycmVudGx5IGZvciB1c2UgaW4gVGhpbkxUTyBvcHRpbWl6YXRpb24pLgorICAgIC8vLworICAgIC8vLyBccCBHZW5lcmF0ZUhhc2ggZW5hYmxlcyBoYXNoaW5nIHRoZSBNb2R1bGUgYW5kIGluY2x1ZGluZyB0aGUgaGFzaCBpbiB0aGUKKyAgICAvLy8gYml0Y29kZSAoY3VycmVudGx5IGZvciB1c2UgaW4gVGhpbkxUTyBpbmNyZW1lbnRhbCBidWlsZCkuCisgICAgLy8vCisgICAgLy8vIElmIFxwIE1vZEhhc2ggaXMgbm9uLW51bGwsIHdoZW4gR2VuZXJhdGVIYXNoIGlzIHRydWUsIHRoZSByZXN1bHRpbmcKKyAgICAvLy8gaGFzaCBpcyB3cml0dGVuIGludG8gTW9kSGFzaC4gV2hlbiBHZW5lcmF0ZUhhc2ggaXMgZmFsc2UsIHRoYXQgdmFsdWUKKyAgICAvLy8gaXMgdXNlZCBhcyB0aGUgaGFzaCBpbnN0ZWFkIG9mIGNvbXB1dGluZyBmcm9tIHRoZSBnZW5lcmF0ZWQgYml0Y29kZS4KKyAgICAvLy8gQ2FuIGJlIHVzZWQgdG8gcHJvZHVjZSB0aGUgc2FtZSBtb2R1bGUgaGFzaCBmb3IgYSBtaW5pbWl6ZWQgYml0Y29kZQorICAgIC8vLyB1c2VkIGp1c3QgZm9yIHRoZSB0aGluIGxpbmsgYXMgaW4gdGhlIHJlZ3VsYXIgZnVsbCBiaXRjb2RlIHRoYXQgd2lsbAorICAgIC8vLyBiZSB1c2VkIGluIHRoZSBiYWNrZW5kLgorICAgIHZvaWQgd3JpdGVNb2R1bGUoY29uc3QgTW9kdWxlICZNLCBib29sIFNob3VsZFByZXNlcnZlVXNlTGlzdE9yZGVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGVTdW1tYXJ5SW5kZXggKkluZGV4ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgR2VuZXJhdGVIYXNoID0gZmFsc2UsIE1vZHVsZUhhc2ggKk1vZEhhc2ggPSBudWxscHRyKTsKKworICAgIC8vLyBXcml0ZSB0aGUgc3BlY2lmaWVkIHRoaW4gbGluayBiaXRjb2RlIGZpbGUgKGkuZS4sIHRoZSBtaW5pbWl6ZWQgYml0Y29kZQorICAgIC8vLyBmaWxlKSB0byB0aGUgYnVmZmVyIHNwZWNpZmllZCBhdCBjb25zdHJ1Y3Rpb24gdGltZS4gVGhlIHRoaW4gbGluaworICAgIC8vLyBiaXRjb2RlIGZpbGUgaXMgdXNlZCBmb3IgdGhpbiBsaW5rLCBhbmQgaXQgb25seSBjb250YWlucyB0aGUgbmVjZXNzYXJ5CisgICAgLy8vIGluZm9ybWF0aW9uIGZvciB0aGluIGxpbmsuCisgICAgLy8vCisgICAgLy8vIE1vZEhhc2ggaXMgZm9yIHVzZSBpbiBUaGluTFRPIGluY3JlbWVudGFsIGJ1aWxkLCBnZW5lcmF0ZWQgd2hpbGUgdGhlCisgICAgLy8vIElSIGJpdGNvZGUgZmlsZSB3cml0aW5nLgorICAgIHZvaWQgd3JpdGVUaGluTGlua0JpdGNvZGUoY29uc3QgTW9kdWxlICZNLCBjb25zdCBNb2R1bGVTdW1tYXJ5SW5kZXggJkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTW9kdWxlSGFzaCAmTW9kSGFzaCk7CisKKyAgICB2b2lkIHdyaXRlSW5kZXgoCisgICAgICAgIGNvbnN0IE1vZHVsZVN1bW1hcnlJbmRleCAqSW5kZXgsCisgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBHVlN1bW1hcnlNYXBUeT4gKk1vZHVsZVRvU3VtbWFyaWVzRm9ySW5kZXgpOworICB9OworCisgIC8vLyBcYnJpZWYgV3JpdGUgdGhlIHNwZWNpZmllZCBtb2R1bGUgdG8gdGhlIHNwZWNpZmllZCByYXcgb3V0cHV0IHN0cmVhbS4KKyAgLy8vCisgIC8vLyBGb3Igc3RyZWFtcyB3aGVyZSBpdCBtYXR0ZXJzLCB0aGUgZ2l2ZW4gc3RyZWFtIHNob3VsZCBiZSBpbiAiYmluYXJ5IgorICAvLy8gbW9kZS4KKyAgLy8vCisgIC8vLyBJZiBcYyBTaG91bGRQcmVzZXJ2ZVVzZUxpc3RPcmRlciwgZW5jb2RlIHRoZSB1c2UtbGlzdCBvcmRlciBmb3IgZWFjaCBcYQorICAvLy8gVmFsdWUgaW4gXGMgTS4gIFRoZXNlIHdpbGwgYmUgcmVjb25zdHJ1Y3RlZCBleGFjdGx5IHdoZW4gXGEgTSBpcworICAvLy8gZGVzZXJpYWxpemVkLgorICAvLy8KKyAgLy8vIElmIFxjIEluZGV4IGlzIHN1cHBsaWVkLCB0aGUgYml0Y29kZSB3aWxsIGNvbnRhaW4gdGhlIHN1bW1hcnkgaW5kZXgKKyAgLy8vIChjdXJyZW50bHkgZm9yIHVzZSBpbiBUaGluTFRPIG9wdGltaXphdGlvbikuCisgIC8vLworICAvLy8gXHAgR2VuZXJhdGVIYXNoIGVuYWJsZXMgaGFzaGluZyB0aGUgTW9kdWxlIGFuZCBpbmNsdWRpbmcgdGhlIGhhc2ggaW4gdGhlCisgIC8vLyBiaXRjb2RlIChjdXJyZW50bHkgZm9yIHVzZSBpbiBUaGluTFRPIGluY3JlbWVudGFsIGJ1aWxkKS4KKyAgLy8vCisgIC8vLyBJZiBccCBNb2RIYXNoIGlzIG5vbi1udWxsLCB3aGVuIEdlbmVyYXRlSGFzaCBpcyB0cnVlLCB0aGUgcmVzdWx0aW5nCisgIC8vLyBoYXNoIGlzIHdyaXR0ZW4gaW50byBNb2RIYXNoLiBXaGVuIEdlbmVyYXRlSGFzaCBpcyBmYWxzZSwgdGhhdCB2YWx1ZQorICAvLy8gaXMgdXNlZCBhcyB0aGUgaGFzaCBpbnN0ZWFkIG9mIGNvbXB1dGluZyBmcm9tIHRoZSBnZW5lcmF0ZWQgYml0Y29kZS4KKyAgLy8vIENhbiBiZSB1c2VkIHRvIHByb2R1Y2UgdGhlIHNhbWUgbW9kdWxlIGhhc2ggZm9yIGEgbWluaW1pemVkIGJpdGNvZGUKKyAgLy8vIHVzZWQganVzdCBmb3IgdGhlIHRoaW4gbGluayBhcyBpbiB0aGUgcmVndWxhciBmdWxsIGJpdGNvZGUgdGhhdCB3aWxsCisgIC8vLyBiZSB1c2VkIGluIHRoZSBiYWNrZW5kLgorICB2b2lkIFdyaXRlQml0Y29kZVRvRmlsZShjb25zdCBNb2R1bGUgJk0sIHJhd19vc3RyZWFtICZPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkUHJlc2VydmVVc2VMaXN0T3JkZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTW9kdWxlU3VtbWFyeUluZGV4ICpJbmRleCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgR2VuZXJhdGVIYXNoID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUhhc2ggKk1vZEhhc2ggPSBudWxscHRyKTsKKworICAvLy8gV3JpdGUgdGhlIHNwZWNpZmllZCB0aGluIGxpbmsgYml0Y29kZSBmaWxlIChpLmUuLCB0aGUgbWluaW1pemVkIGJpdGNvZGUKKyAgLy8vIGZpbGUpIHRvIHRoZSBnaXZlbiByYXcgb3V0cHV0IHN0cmVhbSwgd2hlcmUgaXQgd2lsbCBiZSB3cml0dGVuIGluIGEgbmV3CisgIC8vLyBiaXRjb2RlIGJsb2NrLiBUaGUgdGhpbiBsaW5rIGJpdGNvZGUgZmlsZSBpcyB1c2VkIGZvciB0aGluIGxpbmssIGFuZCBpdAorICAvLy8gb25seSBjb250YWlucyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciB0aGluIGxpbmsuCisgIC8vLworICAvLy8gTW9kSGFzaCBpcyBmb3IgdXNlIGluIFRoaW5MVE8gaW5jcmVtZW50YWwgYnVpbGQsIGdlbmVyYXRlZCB3aGlsZSB0aGUgSVIKKyAgLy8vIGJpdGNvZGUgZmlsZSB3cml0aW5nLgorICB2b2lkIFdyaXRlVGhpbkxpbmtCaXRjb2RlVG9GaWxlKGNvbnN0IE1vZHVsZSAmTSwgcmF3X29zdHJlYW0gJk91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGVTdW1tYXJ5SW5kZXggJkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZUhhc2ggJk1vZEhhc2gpOworCisgIC8vLyBXcml0ZSB0aGUgc3BlY2lmaWVkIG1vZHVsZSBzdW1tYXJ5IGluZGV4IHRvIHRoZSBnaXZlbiByYXcgb3V0cHV0IHN0cmVhbSwKKyAgLy8vIHdoZXJlIGl0IHdpbGwgYmUgd3JpdHRlbiBpbiBhIG5ldyBiaXRjb2RlIGJsb2NrLiBUaGlzIGlzIHVzZWQgd2hlbgorICAvLy8gd3JpdGluZyB0aGUgY29tYmluZWQgaW5kZXggZmlsZSBmb3IgVGhpbkxUTy4gV2hlbiB3cml0aW5nIGEgc3Vic2V0IG9mIHRoZQorICAvLy8gaW5kZXggZm9yIGEgZGlzdHJpYnV0ZWQgYmFja2VuZCwgcHJvdmlkZSB0aGUgXHAgTW9kdWxlVG9TdW1tYXJpZXNGb3JJbmRleAorICAvLy8gbWFwLgorICB2b2lkIFdyaXRlSW5kZXhUb0ZpbGUoY29uc3QgTW9kdWxlU3VtbWFyeUluZGV4ICZJbmRleCwgcmF3X29zdHJlYW0gJk91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBHVlN1bW1hcnlNYXBUeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTW9kdWxlVG9TdW1tYXJpZXNGb3JJbmRleCA9IG51bGxwdHIpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9CSVRDT0RFX0JJVENPREVXUklURVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0JpdGNvZGVXcml0ZXJQYXNzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpdGNvZGUvQml0Y29kZVdyaXRlclBhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWM2ZmJhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0JpdGNvZGVXcml0ZXJQYXNzLmgKQEAgLTAsMCArMSw3NSBAQAorLy89PT0tLSBCaXRjb2RlV3JpdGVyUGFzcy5oIC0gQml0Y29kZSB3cml0aW5nIHBhc3MgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vCisvLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGEgYml0Y29kZSB3cml0aW5nIHBhc3MuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9CSVRDT0RFX0JJVENPREVXUklURVJQQVNTX0gKKyNkZWZpbmUgTExWTV9CSVRDT0RFX0JJVENPREVXUklURVJQQVNTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTW9kdWxlOworY2xhc3MgTW9kdWxlUGFzczsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gXGJyaWVmIENyZWF0ZSBhbmQgcmV0dXJuIGEgcGFzcyB0aGF0IHdyaXRlcyB0aGUgbW9kdWxlIHRvIHRoZSBzcGVjaWZpZWQKKy8vLyBvc3RyZWFtLiBOb3RlIHRoYXQgdGhpcyBwYXNzIGlzIGRlc2lnbmVkIGZvciB1c2Ugd2l0aCB0aGUgbGVnYWN5IHBhc3MKKy8vLyBtYW5hZ2VyLgorLy8vCisvLy8gSWYgXGMgU2hvdWxkUHJlc2VydmVVc2VMaXN0T3JkZXIsIGVuY29kZSB1c2UtbGlzdCBvcmRlciBzbyBpdCBjYW4gYmUKKy8vLyByZXByb2R1Y2VkIHdoZW4gZGVzZXJpYWxpemVkLgorLy8vCisvLy8gSWYgXGMgRW1pdFN1bW1hcnlJbmRleCwgZW1pdCB0aGUgc3VtbWFyeSBpbmRleCAoY3VycmVudGx5IGZvciB1c2UgaW4gVGhpbkxUTworLy8vIG9wdGltaXphdGlvbikuCisvLy8KKy8vLyBJZiBcYyBFbWl0TW9kdWxlSGFzaCwgY29tcHV0ZSBhbmQgZW1pdCB0aGUgbW9kdWxlIGhhc2ggaW4gdGhlIGJpdGNvZGUKKy8vLyAoY3VycmVudGx5IGZvciB1c2UgaW4gVGhpbkxUTyBpbmNyZW1lbnRhbCBidWlsZCkuCitNb2R1bGVQYXNzICpjcmVhdGVCaXRjb2RlV3JpdGVyUGFzcyhyYXdfb3N0cmVhbSAmU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRQcmVzZXJ2ZVVzZUxpc3RPcmRlciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbWl0U3VtbWFyeUluZGV4ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEVtaXRNb2R1bGVIYXNoID0gZmFsc2UpOworCisvLy8gXGJyaWVmIFBhc3MgZm9yIHdyaXRpbmcgYSBtb2R1bGUgb2YgSVIgb3V0IHRvIGEgYml0Y29kZSBmaWxlLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIHRoZSBuZXcgcGFzcyBtYW5hZ2VyLiBUbyBjb25zdHJ1Y3QKKy8vLyBhIHBhc3MgZm9yIHRoZSBsZWdhY3kgcGFzcyBtYW5hZ2VyLCB1c2UgdGhlIGZ1bmN0aW9uIGFib3ZlLgorY2xhc3MgQml0Y29kZVdyaXRlclBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxCaXRjb2RlV3JpdGVyUGFzcz4geworICByYXdfb3N0cmVhbSAmT1M7CisgIGJvb2wgU2hvdWxkUHJlc2VydmVVc2VMaXN0T3JkZXI7CisgIGJvb2wgRW1pdFN1bW1hcnlJbmRleDsKKyAgYm9vbCBFbWl0TW9kdWxlSGFzaDsKKworcHVibGljOgorICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIGJpdGNvZGUgd3JpdGVyIHBhc3MgYXJvdW5kIGEgcGFydGljdWxhciBvdXRwdXQgc3RyZWFtLgorICAvLy8KKyAgLy8vIElmIFxjIFNob3VsZFByZXNlcnZlVXNlTGlzdE9yZGVyLCBlbmNvZGUgdXNlLWxpc3Qgb3JkZXIgc28gaXQgY2FuIGJlCisgIC8vLyByZXByb2R1Y2VkIHdoZW4gZGVzZXJpYWxpemVkLgorICAvLy8KKyAgLy8vIElmIFxjIEVtaXRTdW1tYXJ5SW5kZXgsIGVtaXQgdGhlIHN1bW1hcnkgaW5kZXggKGN1cnJlbnRseQorICAvLy8gZm9yIHVzZSBpbiBUaGluTFRPIG9wdGltaXphdGlvbikuCisgIGV4cGxpY2l0IEJpdGNvZGVXcml0ZXJQYXNzKHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRQcmVzZXJ2ZVVzZUxpc3RPcmRlciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEVtaXRTdW1tYXJ5SW5kZXggPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbWl0TW9kdWxlSGFzaCA9IGZhbHNlKQorICAgICAgOiBPUyhPUyksIFNob3VsZFByZXNlcnZlVXNlTGlzdE9yZGVyKFNob3VsZFByZXNlcnZlVXNlTGlzdE9yZGVyKSwKKyAgRW1pdFN1bW1hcnlJbmRleChFbWl0U3VtbWFyeUluZGV4KSwgRW1pdE1vZHVsZUhhc2goRW1pdE1vZHVsZUhhc2gpIHt9CisKKyAgLy8vIFxicmllZiBSdW4gdGhlIGJpdGNvZGUgd3JpdGVyIHBhc3MsIGFuZCBvdXRwdXQgdGhlIG1vZHVsZSB0byB0aGUgc2VsZWN0ZWQKKyAgLy8vIG91dHB1dCBzdHJlYW0uCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmKTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpdGNvZGUvQml0c3RyZWFtUmVhZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpdGNvZGUvQml0c3RyZWFtUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4NGZhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQml0Y29kZS9CaXRzdHJlYW1SZWFkZXIuaApAQCAtMCwwICsxLDUwNiBAQAorLy89PT0tIEJpdHN0cmVhbVJlYWRlci5oIC0gTG93LWxldmVsIGJpdHN0cmVhbSByZWFkZXIgaW50ZXJmYWNlIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBkZWZpbmVzIHRoZSBCaXRzdHJlYW1SZWFkZXIgY2xhc3MuICBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvCisvLyByZWFkIGFuIGFyYml0cmFyeSBiaXRzdHJlYW0sIHJlZ2FyZGxlc3Mgb2YgaXRzIGNvbnRlbnRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9CSVRDT0RFX0JJVFNUUkVBTVJFQURFUl9ICisjZGVmaW5lIExMVk1fQklUQ09ERV9CSVRTVFJFQU1SRUFERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQml0Y29kZS9CaXRDb2Rlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFRoaXMgY2xhc3MgbWFpbnRhaW5zIHRoZSBhYmJyZXZpYXRpb25zIHJlYWQgZnJvbSBhIGJsb2NrIGluZm8gYmxvY2suCitjbGFzcyBCaXRzdHJlYW1CbG9ja0luZm8geworcHVibGljOgorICAvLy8gVGhpcyBjb250YWlucyBpbmZvcm1hdGlvbiBlbWl0dGVkIHRvIEJMT0NLSU5GT19CTE9DSyBibG9ja3MuIFRoZXNlCisgIC8vLyBkZXNjcmliZSBhYmJyZXZpYXRpb25zIHRoYXQgYWxsIGJsb2NrcyBvZiB0aGUgc3BlY2lmaWVkIElEIGluaGVyaXQuCisgIHN0cnVjdCBCbG9ja0luZm8geworICAgIHVuc2lnbmVkIEJsb2NrSUQ7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEJpdENvZGVBYmJyZXY+PiBBYmJyZXZzOworICAgIHN0ZDo6c3RyaW5nIE5hbWU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCBzdGQ6OnN0cmluZz4+IFJlY29yZE5hbWVzOworICB9OworCitwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxCbG9ja0luZm8+IEJsb2NrSW5mb1JlY29yZHM7CisKK3B1YmxpYzoKKyAgLy8vIElmIHRoZXJlIGlzIGJsb2NrIGluZm8gZm9yIHRoZSBzcGVjaWZpZWQgSUQsIHJldHVybiBpdCwgb3RoZXJ3aXNlIHJldHVybgorICAvLy8gbnVsbC4KKyAgY29uc3QgQmxvY2tJbmZvICpnZXRCbG9ja0luZm8odW5zaWduZWQgQmxvY2tJRCkgY29uc3QgeworICAgIC8vIENvbW1vbiBjYXNlLCB0aGUgbW9zdCByZWNlbnQgZW50cnkgbWF0Y2hlcyBCbG9ja0lELgorICAgIGlmICghQmxvY2tJbmZvUmVjb3Jkcy5lbXB0eSgpICYmIEJsb2NrSW5mb1JlY29yZHMuYmFjaygpLkJsb2NrSUQgPT0gQmxvY2tJRCkKKyAgICAgIHJldHVybiAmQmxvY2tJbmZvUmVjb3Jkcy5iYWNrKCk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KEJsb2NrSW5mb1JlY29yZHMuc2l6ZSgpKTsKKyAgICAgICAgIGkgIT0gZTsgKytpKQorICAgICAgaWYgKEJsb2NrSW5mb1JlY29yZHNbaV0uQmxvY2tJRCA9PSBCbG9ja0lEKQorICAgICAgICByZXR1cm4gJkJsb2NrSW5mb1JlY29yZHNbaV07CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBCbG9ja0luZm8gJmdldE9yQ3JlYXRlQmxvY2tJbmZvKHVuc2lnbmVkIEJsb2NrSUQpIHsKKyAgICBpZiAoY29uc3QgQmxvY2tJbmZvICpCSSA9IGdldEJsb2NrSW5mbyhCbG9ja0lEKSkKKyAgICAgIHJldHVybiAqY29uc3RfY2FzdDxCbG9ja0luZm8qPihCSSk7CisKKyAgICAvLyBPdGhlcndpc2UsIGFkZCBhIG5ldyByZWNvcmQuCisgICAgQmxvY2tJbmZvUmVjb3Jkcy5lbXBsYWNlX2JhY2soKTsKKyAgICBCbG9ja0luZm9SZWNvcmRzLmJhY2soKS5CbG9ja0lEID0gQmxvY2tJRDsKKyAgICByZXR1cm4gQmxvY2tJbmZvUmVjb3Jkcy5iYWNrKCk7CisgIH0KK307CisKKy8vLyBUaGlzIHJlcHJlc2VudHMgYSBwb3NpdGlvbiB3aXRoaW4gYSBiaXRzdHJlYW0uIFRoZXJlIG1heSBiZSBtdWx0aXBsZQorLy8vIGluZGVwZW5kZW50IGN1cnNvcnMgcmVhZGluZyB3aXRoaW4gb25lIGJpdHN0cmVhbSwgZWFjaCBtYWludGFpbmluZyB0aGVpcgorLy8vIG93biBsb2NhbCBzdGF0ZS4KK2NsYXNzIFNpbXBsZUJpdHN0cmVhbUN1cnNvciB7CisgIEFycmF5UmVmPHVpbnQ4X3Q+IEJpdGNvZGVCeXRlczsKKyAgc2l6ZV90IE5leHRDaGFyID0gMDsKKworcHVibGljOgorICAvLy8gVGhpcyBpcyB0aGUgY3VycmVudCBkYXRhIHdlIGhhdmUgcHVsbGVkIGZyb20gdGhlIHN0cmVhbSBidXQgaGF2ZSBub3QKKyAgLy8vIHJldHVybmVkIHRvIHRoZSBjbGllbnQuIFRoaXMgaXMgc3BlY2lmaWNhbGx5IGFuZCBpbnRlbnRpb25hbGx5IGRlZmluZWQgdG8KKyAgLy8vIGZvbGxvdyB0aGUgd29yZCBzaXplIG9mIHRoZSBob3N0IG1hY2hpbmUgZm9yIGVmZmljaWVuY3kuIFdlIHVzZSB3b3JkX3QgaW4KKyAgLy8vIHBsYWNlcyB0aGF0IGFyZSBhd2FyZSBvZiB0aGlzIHRvIG1ha2UgaXQgcGVyZmVjdGx5IGV4cGxpY2l0IHdoYXQgaXMgZ29pbmcKKyAgLy8vIG9uLgorICB1c2luZyB3b3JkX3QgPSBzaXplX3Q7CisKK3ByaXZhdGU6CisgIHdvcmRfdCBDdXJXb3JkID0gMDsKKworICAvLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gQ3VyV29yZCB0aGF0IGFyZSB2YWxpZC4gVGhpcyBpcyBhbHdheXMgZnJvbQorICAvLy8gWzAuLi5iaXRzX29mKHNpemVfdCktMV0gaW5jbHVzaXZlLgorICB1bnNpZ25lZCBCaXRzSW5DdXJXb3JkID0gMDsKKworcHVibGljOgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IE1heENodW5rU2l6ZSA9IHNpemVvZih3b3JkX3QpICogODsKKworICBTaW1wbGVCaXRzdHJlYW1DdXJzb3IoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFNpbXBsZUJpdHN0cmVhbUN1cnNvcihBcnJheVJlZjx1aW50OF90PiBCaXRjb2RlQnl0ZXMpCisgICAgICA6IEJpdGNvZGVCeXRlcyhCaXRjb2RlQnl0ZXMpIHt9CisgIGV4cGxpY2l0IFNpbXBsZUJpdHN0cmVhbUN1cnNvcihTdHJpbmdSZWYgQml0Y29kZUJ5dGVzKQorICAgICAgOiBCaXRjb2RlQnl0ZXMocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KEJpdGNvZGVCeXRlcy5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgQml0Y29kZUJ5dGVzLnNpemUoKSkge30KKyAgZXhwbGljaXQgU2ltcGxlQml0c3RyZWFtQ3Vyc29yKE1lbW9yeUJ1ZmZlclJlZiBCaXRjb2RlQnl0ZXMpCisgICAgICA6IFNpbXBsZUJpdHN0cmVhbUN1cnNvcihCaXRjb2RlQnl0ZXMuZ2V0QnVmZmVyKCkpIHt9CisKKyAgYm9vbCBjYW5Ta2lwVG9Qb3Moc2l6ZV90IHBvcykgY29uc3QgeworICAgIC8vIHBvcyBjYW4gYmUgc2tpcHBlZCB0byBpZiBpdCBpcyBhIHZhbGlkIGFkZHJlc3Mgb3Igb25lIGJ5dGUgcGFzdCB0aGUgZW5kLgorICAgIHJldHVybiBwb3MgPD0gQml0Y29kZUJ5dGVzLnNpemUoKTsKKyAgfQorCisgIGJvb2wgQXRFbmRPZlN0cmVhbSgpIHsKKyAgICByZXR1cm4gQml0c0luQ3VyV29yZCA9PSAwICYmIEJpdGNvZGVCeXRlcy5zaXplKCkgPD0gTmV4dENoYXI7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBiaXQgIyBvZiB0aGUgYml0IHdlIGFyZSByZWFkaW5nLgorICB1aW50NjRfdCBHZXRDdXJyZW50Qml0Tm8oKSBjb25zdCB7CisgICAgcmV0dXJuIE5leHRDaGFyKkNIQVJfQklUIC0gQml0c0luQ3VyV29yZDsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgYnl0ZSAjIG9mIHRoZSBjdXJyZW50IGJpdC4KKyAgdWludDY0X3QgZ2V0Q3VycmVudEJ5dGVObygpIGNvbnN0IHsgcmV0dXJuIEdldEN1cnJlbnRCaXRObygpIC8gODsgfQorCisgIEFycmF5UmVmPHVpbnQ4X3Q+IGdldEJpdGNvZGVCeXRlcygpIGNvbnN0IHsgcmV0dXJuIEJpdGNvZGVCeXRlczsgfQorCisgIC8vLyBSZXNldCB0aGUgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQgYml0IG51bWJlci4KKyAgdm9pZCBKdW1wVG9CaXQodWludDY0X3QgQml0Tm8pIHsKKyAgICBzaXplX3QgQnl0ZU5vID0gc2l6ZV90KEJpdE5vLzgpICYgfihzaXplb2Yod29yZF90KS0xKTsKKyAgICB1bnNpZ25lZCBXb3JkQml0Tm8gPSB1bnNpZ25lZChCaXRObyAmIChzaXplb2Yod29yZF90KSo4LTEpKTsKKyAgICBhc3NlcnQoY2FuU2tpcFRvUG9zKEJ5dGVObykgJiYgIkludmFsaWQgbG9jYXRpb24iKTsKKworICAgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgcmlnaHQgd29yZC4KKyAgICBOZXh0Q2hhciA9IEJ5dGVObzsKKyAgICBCaXRzSW5DdXJXb3JkID0gMDsKKworICAgIC8vIFNraXAgb3ZlciBhbnkgYml0cyB0aGF0IGFyZSBhbHJlYWR5IGNvbnN1bWVkLgorICAgIGlmIChXb3JkQml0Tm8pCisgICAgICBSZWFkKFdvcmRCaXRObyk7CisgIH0KKworICAvLy8gR2V0IGEgcG9pbnRlciBpbnRvIHRoZSBiaXRzdHJlYW0gYXQgdGhlIHNwZWNpZmllZCBieXRlIG9mZnNldC4KKyAgY29uc3QgdWludDhfdCAqZ2V0UG9pbnRlclRvQnl0ZSh1aW50NjRfdCBCeXRlTm8sIHVpbnQ2NF90IE51bUJ5dGVzKSB7CisgICAgcmV0dXJuIEJpdGNvZGVCeXRlcy5kYXRhKCkgKyBCeXRlTm87CisgIH0KKworICAvLy8gR2V0IGEgcG9pbnRlciBpbnRvIHRoZSBiaXRzdHJlYW0gYXQgdGhlIHNwZWNpZmllZCBiaXQgb2Zmc2V0LgorICAvLy8KKyAgLy8vIFRoZSBiaXQgb2Zmc2V0IG11c3QgYmUgb24gYSBieXRlIGJvdW5kYXJ5LgorICBjb25zdCB1aW50OF90ICpnZXRQb2ludGVyVG9CaXQodWludDY0X3QgQml0Tm8sIHVpbnQ2NF90IE51bUJ5dGVzKSB7CisgICAgYXNzZXJ0KCEoQml0Tm8gJSA4KSAmJiAiRXhwZWN0ZWQgYml0IG9uIGJ5dGUgYm91bmRhcnkiKTsKKyAgICByZXR1cm4gZ2V0UG9pbnRlclRvQnl0ZShCaXRObyAvIDgsIE51bUJ5dGVzKTsKKyAgfQorCisgIHZvaWQgZmlsbEN1cldvcmQoKSB7CisgICAgaWYgKE5leHRDaGFyID49IEJpdGNvZGVCeXRlcy5zaXplKCkpCisgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKworICAgIC8vIFJlYWQgdGhlIG5leHQgd29yZCBmcm9tIHRoZSBzdHJlYW0uCisgICAgY29uc3QgdWludDhfdCAqTmV4dENoYXJQdHIgPSBCaXRjb2RlQnl0ZXMuZGF0YSgpICsgTmV4dENoYXI7CisgICAgdW5zaWduZWQgQnl0ZXNSZWFkOworICAgIGlmIChCaXRjb2RlQnl0ZXMuc2l6ZSgpID49IE5leHRDaGFyICsgc2l6ZW9mKHdvcmRfdCkpIHsKKyAgICAgIEJ5dGVzUmVhZCA9IHNpemVvZih3b3JkX3QpOworICAgICAgQ3VyV29yZCA9CisgICAgICAgICAgc3VwcG9ydDo6ZW5kaWFuOjpyZWFkPHdvcmRfdCwgc3VwcG9ydDo6bGl0dGxlLCBzdXBwb3J0Ojp1bmFsaWduZWQ+KAorICAgICAgICAgICAgICBOZXh0Q2hhclB0cik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFNob3J0IHJlYWQuCisgICAgICBCeXRlc1JlYWQgPSBCaXRjb2RlQnl0ZXMuc2l6ZSgpIC0gTmV4dENoYXI7CisgICAgICBDdXJXb3JkID0gMDsKKyAgICAgIGZvciAodW5zaWduZWQgQiA9IDA7IEIgIT0gQnl0ZXNSZWFkOyArK0IpCisgICAgICAgIEN1cldvcmQgfD0gdWludDY0X3QoTmV4dENoYXJQdHJbQl0pIDw8IChCICogOCk7CisgICAgfQorICAgIE5leHRDaGFyICs9IEJ5dGVzUmVhZDsKKyAgICBCaXRzSW5DdXJXb3JkID0gQnl0ZXNSZWFkICogODsKKyAgfQorCisgIHdvcmRfdCBSZWFkKHVuc2lnbmVkIE51bUJpdHMpIHsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQml0c0luV29yZCA9IE1heENodW5rU2l6ZTsKKworICAgIGFzc2VydChOdW1CaXRzICYmIE51bUJpdHMgPD0gQml0c0luV29yZCAmJgorICAgICAgICAgICAiQ2Fubm90IHJldHVybiB6ZXJvIG9yIG1vcmUgdGhhbiBCaXRzSW5Xb3JkIGJpdHMhIik7CisKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgTWFzayA9IHNpemVvZih3b3JkX3QpID4gNCA/IDB4M2YgOiAweDFmOworCisgICAgLy8gSWYgdGhlIGZpZWxkIGlzIGZ1bGx5IGNvbnRhaW5lZCBieSBDdXJXb3JkLCByZXR1cm4gaXQgcXVpY2tseS4KKyAgICBpZiAoQml0c0luQ3VyV29yZCA+PSBOdW1CaXRzKSB7CisgICAgICB3b3JkX3QgUiA9IEN1cldvcmQgJiAofndvcmRfdCgwKSA+PiAoQml0c0luV29yZCAtIE51bUJpdHMpKTsKKworICAgICAgLy8gVXNlIGEgbWFzayB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgICBDdXJXb3JkID4+PSAoTnVtQml0cyAmIE1hc2spOworCisgICAgICBCaXRzSW5DdXJXb3JkIC09IE51bUJpdHM7CisgICAgICByZXR1cm4gUjsKKyAgICB9CisKKyAgICB3b3JkX3QgUiA9IEJpdHNJbkN1cldvcmQgPyBDdXJXb3JkIDogMDsKKyAgICB1bnNpZ25lZCBCaXRzTGVmdCA9IE51bUJpdHMgLSBCaXRzSW5DdXJXb3JkOworCisgICAgZmlsbEN1cldvcmQoKTsKKworICAgIC8vIElmIHdlIHJ1biBvdXQgb2YgZGF0YSwgYWJvcnQuCisgICAgaWYgKEJpdHNMZWZ0ID4gQml0c0luQ3VyV29yZCkKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCisgICAgd29yZF90IFIyID0gQ3VyV29yZCAmICh+d29yZF90KDApID4+IChCaXRzSW5Xb3JkIC0gQml0c0xlZnQpKTsKKworICAgIC8vIFVzZSBhIG1hc2sgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgIEN1cldvcmQgPj49IChCaXRzTGVmdCAmIE1hc2spOworCisgICAgQml0c0luQ3VyV29yZCAtPSBCaXRzTGVmdDsKKworICAgIFIgfD0gUjIgPDwgKE51bUJpdHMgLSBCaXRzTGVmdCk7CisKKyAgICByZXR1cm4gUjsKKyAgfQorCisgIHVpbnQzMl90IFJlYWRWQlIodW5zaWduZWQgTnVtQml0cykgeworICAgIHVpbnQzMl90IFBpZWNlID0gUmVhZChOdW1CaXRzKTsKKyAgICBpZiAoKFBpZWNlICYgKDFVIDw8IChOdW1CaXRzLTEpKSkgPT0gMCkKKyAgICAgIHJldHVybiBQaWVjZTsKKworICAgIHVpbnQzMl90IFJlc3VsdCA9IDA7CisgICAgdW5zaWduZWQgTmV4dEJpdCA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIFJlc3VsdCB8PSAoUGllY2UgJiAoKDFVIDw8IChOdW1CaXRzLTEpKS0xKSkgPDwgTmV4dEJpdDsKKworICAgICAgaWYgKChQaWVjZSAmICgxVSA8PCAoTnVtQml0cy0xKSkpID09IDApCisgICAgICAgIHJldHVybiBSZXN1bHQ7CisKKyAgICAgIE5leHRCaXQgKz0gTnVtQml0cy0xOworICAgICAgUGllY2UgPSBSZWFkKE51bUJpdHMpOworICAgIH0KKyAgfQorCisgIC8vIFJlYWQgYSBWQlIgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHVwIHRvIDY0LWJpdHMgaW4gc2l6ZS4gVGhlIGNodW5rIHNpemUgb2YKKyAgLy8gdGhlIFZCUiBtdXN0IHN0aWxsIGJlIDw9IDMyIGJpdHMgdGhvdWdoLgorICB1aW50NjRfdCBSZWFkVkJSNjQodW5zaWduZWQgTnVtQml0cykgeworICAgIHVpbnQzMl90IFBpZWNlID0gUmVhZChOdW1CaXRzKTsKKyAgICBpZiAoKFBpZWNlICYgKDFVIDw8IChOdW1CaXRzLTEpKSkgPT0gMCkKKyAgICAgIHJldHVybiB1aW50NjRfdChQaWVjZSk7CisKKyAgICB1aW50NjRfdCBSZXN1bHQgPSAwOworICAgIHVuc2lnbmVkIE5leHRCaXQgPSAwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBSZXN1bHQgfD0gdWludDY0X3QoUGllY2UgJiAoKDFVIDw8IChOdW1CaXRzLTEpKS0xKSkgPDwgTmV4dEJpdDsKKworICAgICAgaWYgKChQaWVjZSAmICgxVSA8PCAoTnVtQml0cy0xKSkpID09IDApCisgICAgICAgIHJldHVybiBSZXN1bHQ7CisKKyAgICAgIE5leHRCaXQgKz0gTnVtQml0cy0xOworICAgICAgUGllY2UgPSBSZWFkKE51bUJpdHMpOworICAgIH0KKyAgfQorCisgIHZvaWQgU2tpcFRvRm91ckJ5dGVCb3VuZGFyeSgpIHsKKyAgICAvLyBJZiB3b3JkX3QgaXMgNjQtYml0cyBhbmQgaWYgd2UndmUgcmVhZCBsZXNzIHRoYW4gMzIgYml0cywganVzdCBkdW1wCisgICAgLy8gdGhlIGJpdHMgd2UgaGF2ZSB1cCB0byB0aGUgbmV4dCAzMi1iaXQgYm91bmRhcnkuCisgICAgaWYgKHNpemVvZih3b3JkX3QpID4gNCAmJgorICAgICAgICBCaXRzSW5DdXJXb3JkID49IDMyKSB7CisgICAgICBDdXJXb3JkID4+PSBCaXRzSW5DdXJXb3JkLTMyOworICAgICAgQml0c0luQ3VyV29yZCA9IDMyOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEJpdHNJbkN1cldvcmQgPSAwOworICB9CisKKyAgLy8vIFNraXAgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAgdm9pZCBza2lwVG9FbmQoKSB7IE5leHRDaGFyID0gQml0Y29kZUJ5dGVzLnNpemUoKTsgfQorfTsKKworLy8vIFdoZW4gYWR2YW5jaW5nIHRocm91Z2ggYSBiaXRzdHJlYW0gY3Vyc29yLCBlYWNoIGFkdmFuY2UgY2FuIGRpc2NvdmVyIGEgZmV3CisvLy8gZGlmZmVyZW50IGtpbmRzIG9mIGVudHJpZXM6CitzdHJ1Y3QgQml0c3RyZWFtRW50cnkgeworICBlbnVtIHsKKyAgICBFcnJvciwgICAgLy8gTWFsZm9ybWVkIGJpdGNvZGUgd2FzIGZvdW5kLgorICAgIEVuZEJsb2NrLCAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgYmxvY2ssIChvciB0aGUgZW5kIG9mIHRoZQorICAgICAgICAgICAgICAvLyBmaWxlLCB3aGljaCBpcyB0cmVhdGVkIGxpa2UgYSBzZXJpZXMgb2YgRW5kQmxvY2sgcmVjb3Jkcy4KKyAgICBTdWJCbG9jaywgLy8gVGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBuZXcgc3ViYmxvY2sgb2YgYSBzcGVjaWZpYyBJRC4KKyAgICBSZWNvcmQgICAgLy8gVGhpcyBpcyBhIHJlY29yZCB3aXRoIGEgc3BlY2lmaWMgQWJicmV2SUQuCisgIH0gS2luZDsKKworICB1bnNpZ25lZCBJRDsKKworICBzdGF0aWMgQml0c3RyZWFtRW50cnkgZ2V0RXJyb3IoKSB7CisgICAgQml0c3RyZWFtRW50cnkgRTsgRS5LaW5kID0gRXJyb3I7IHJldHVybiBFOworICB9CisKKyAgc3RhdGljIEJpdHN0cmVhbUVudHJ5IGdldEVuZEJsb2NrKCkgeworICAgIEJpdHN0cmVhbUVudHJ5IEU7IEUuS2luZCA9IEVuZEJsb2NrOyByZXR1cm4gRTsKKyAgfQorCisgIHN0YXRpYyBCaXRzdHJlYW1FbnRyeSBnZXRTdWJCbG9jayh1bnNpZ25lZCBJRCkgeworICAgIEJpdHN0cmVhbUVudHJ5IEU7IEUuS2luZCA9IFN1YkJsb2NrOyBFLklEID0gSUQ7IHJldHVybiBFOworICB9CisKKyAgc3RhdGljIEJpdHN0cmVhbUVudHJ5IGdldFJlY29yZCh1bnNpZ25lZCBBYmJyZXZJRCkgeworICAgIEJpdHN0cmVhbUVudHJ5IEU7IEUuS2luZCA9IFJlY29yZDsgRS5JRCA9IEFiYnJldklEOyByZXR1cm4gRTsKKyAgfQorfTsKKworLy8vIFRoaXMgcmVwcmVzZW50cyBhIHBvc2l0aW9uIHdpdGhpbiBhIGJpdGNvZGUgZmlsZSwgaW1wbGVtZW50ZWQgb24gdG9wIG9mIGEKKy8vLyBTaW1wbGVCaXRzdHJlYW1DdXJzb3IuCisvLy8KKy8vLyBVbmxpa2UgaXRlcmF0b3JzLCBCaXRzdHJlYW1DdXJzb3JzIGFyZSBoZWF2eS13ZWlnaHQgb2JqZWN0cyB0aGF0IHNob3VsZCBub3QKKy8vLyBiZSBwYXNzZWQgYnkgdmFsdWUuCitjbGFzcyBCaXRzdHJlYW1DdXJzb3IgOiBTaW1wbGVCaXRzdHJlYW1DdXJzb3IgeworICAvLyBUaGlzIGlzIHRoZSBkZWNsYXJlZCBzaXplIG9mIGNvZGUgdmFsdWVzIHVzZWQgZm9yIHRoZSBjdXJyZW50IGJsb2NrLCBpbgorICAvLyBiaXRzLgorICB1bnNpZ25lZCBDdXJDb2RlU2l6ZSA9IDI7CisKKyAgLy8vIEFiYnJldnMgaW5zdGFsbGVkIGF0IGluIHRoaXMgYmxvY2suCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxCaXRDb2RlQWJicmV2Pj4gQ3VyQWJicmV2czsKKworICBzdHJ1Y3QgQmxvY2sgeworICAgIHVuc2lnbmVkIFByZXZDb2RlU2l6ZTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Qml0Q29kZUFiYnJldj4+IFByZXZBYmJyZXZzOworCisgICAgZXhwbGljaXQgQmxvY2sodW5zaWduZWQgUENTKSA6IFByZXZDb2RlU2l6ZShQQ1MpIHt9CisgIH07CisKKyAgLy8vIFRoaXMgdHJhY2tzIHRoZSBjb2Rlc2l6ZSBvZiBwYXJlbnQgYmxvY2tzLgorICBTbWFsbFZlY3RvcjxCbG9jaywgOD4gQmxvY2tTY29wZTsKKworICBCaXRzdHJlYW1CbG9ja0luZm8gKkJsb2NrSW5mbyA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBNYXhDaHVua1NpemUgPSBzaXplb2Yod29yZF90KSAqIDg7CisKKyAgQml0c3RyZWFtQ3Vyc29yKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBCaXRzdHJlYW1DdXJzb3IoQXJyYXlSZWY8dWludDhfdD4gQml0Y29kZUJ5dGVzKQorICAgICAgOiBTaW1wbGVCaXRzdHJlYW1DdXJzb3IoQml0Y29kZUJ5dGVzKSB7fQorICBleHBsaWNpdCBCaXRzdHJlYW1DdXJzb3IoU3RyaW5nUmVmIEJpdGNvZGVCeXRlcykKKyAgICAgIDogU2ltcGxlQml0c3RyZWFtQ3Vyc29yKEJpdGNvZGVCeXRlcykge30KKyAgZXhwbGljaXQgQml0c3RyZWFtQ3Vyc29yKE1lbW9yeUJ1ZmZlclJlZiBCaXRjb2RlQnl0ZXMpCisgICAgICA6IFNpbXBsZUJpdHN0cmVhbUN1cnNvcihCaXRjb2RlQnl0ZXMpIHt9CisKKyAgdXNpbmcgU2ltcGxlQml0c3RyZWFtQ3Vyc29yOjpjYW5Ta2lwVG9Qb3M7CisgIHVzaW5nIFNpbXBsZUJpdHN0cmVhbUN1cnNvcjo6QXRFbmRPZlN0cmVhbTsKKyAgdXNpbmcgU2ltcGxlQml0c3RyZWFtQ3Vyc29yOjpnZXRCaXRjb2RlQnl0ZXM7CisgIHVzaW5nIFNpbXBsZUJpdHN0cmVhbUN1cnNvcjo6R2V0Q3VycmVudEJpdE5vOworICB1c2luZyBTaW1wbGVCaXRzdHJlYW1DdXJzb3I6OmdldEN1cnJlbnRCeXRlTm87CisgIHVzaW5nIFNpbXBsZUJpdHN0cmVhbUN1cnNvcjo6Z2V0UG9pbnRlclRvQnl0ZTsKKyAgdXNpbmcgU2ltcGxlQml0c3RyZWFtQ3Vyc29yOjpKdW1wVG9CaXQ7CisgIHVzaW5nIFNpbXBsZUJpdHN0cmVhbUN1cnNvcjo6ZmlsbEN1cldvcmQ7CisgIHVzaW5nIFNpbXBsZUJpdHN0cmVhbUN1cnNvcjo6UmVhZDsKKyAgdXNpbmcgU2ltcGxlQml0c3RyZWFtQ3Vyc29yOjpSZWFkVkJSOworICB1c2luZyBTaW1wbGVCaXRzdHJlYW1DdXJzb3I6OlJlYWRWQlI2NDsKKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIHRvIGVuY29kZSBhbiBhYmJyZXYgIy4KKyAgdW5zaWduZWQgZ2V0QWJicmV2SURXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIEN1ckNvZGVTaXplOyB9CisKKyAgLy8vIEZsYWdzIHRoYXQgbW9kaWZ5IHRoZSBiZWhhdmlvciBvZiBhZHZhbmNlKCkuCisgIGVudW0geworICAgIC8vLyBJZiB0aGlzIGZsYWcgaXMgdXNlZCwgdGhlIGFkdmFuY2UoKSBtZXRob2QgZG9lcyBub3QgYXV0b21hdGljYWxseSBwb3AKKyAgICAvLy8gdGhlIGJsb2NrIHNjb3BlIHdoZW4gdGhlIGVuZCBvZiBhIGJsb2NrIGlzIHJlYWNoZWQuCisgICAgQUZfRG9udFBvcEJsb2NrQXRFbmQgPSAxLAorCisgICAgLy8vIElmIHRoaXMgZmxhZyBpcyB1c2VkLCBhYmJyZXYgZW50cmllcyBhcmUgcmV0dXJuZWQganVzdCBsaWtlIG5vcm1hbAorICAgIC8vLyByZWNvcmRzLgorICAgIEFGX0RvbnRBdXRvcHJvY2Vzc0FiYnJldnMgPSAyCisgIH07CisKKyAgLy8vIEFkdmFuY2UgdGhlIGN1cnJlbnQgYml0c3RyZWFtLCByZXR1cm5pbmcgdGhlIG5leHQgZW50cnkgaW4gdGhlIHN0cmVhbS4KKyAgQml0c3RyZWFtRW50cnkgYWR2YW5jZSh1bnNpZ25lZCBGbGFncyA9IDApIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKEF0RW5kT2ZTdHJlYW0oKSkKKyAgICAgICAgcmV0dXJuIEJpdHN0cmVhbUVudHJ5OjpnZXRFcnJvcigpOworCisgICAgICB1bnNpZ25lZCBDb2RlID0gUmVhZENvZGUoKTsKKyAgICAgIGlmIChDb2RlID09IGJpdGM6OkVORF9CTE9DSykgeworICAgICAgICAvLyBQb3AgdGhlIGVuZCBvZiB0aGUgYmxvY2sgdW5sZXNzIEZsYWdzIHRlbGxzIHVzIG5vdCB0by4KKyAgICAgICAgaWYgKCEoRmxhZ3MgJiBBRl9Eb250UG9wQmxvY2tBdEVuZCkgJiYgUmVhZEJsb2NrRW5kKCkpCisgICAgICAgICAgcmV0dXJuIEJpdHN0cmVhbUVudHJ5OjpnZXRFcnJvcigpOworICAgICAgICByZXR1cm4gQml0c3RyZWFtRW50cnk6OmdldEVuZEJsb2NrKCk7CisgICAgICB9CisKKyAgICAgIGlmIChDb2RlID09IGJpdGM6OkVOVEVSX1NVQkJMT0NLKQorICAgICAgICByZXR1cm4gQml0c3RyZWFtRW50cnk6OmdldFN1YkJsb2NrKFJlYWRTdWJCbG9ja0lEKCkpOworCisgICAgICBpZiAoQ29kZSA9PSBiaXRjOjpERUZJTkVfQUJCUkVWICYmCisgICAgICAgICAgIShGbGFncyAmIEFGX0RvbnRBdXRvcHJvY2Vzc0FiYnJldnMpKSB7CisgICAgICAgIC8vIFdlIHJlYWQgYW5kIGFjY3VtdWxhdGUgYWJicmV2J3MsIHRoZSBjbGllbnQgY2FuJ3QgZG8gYW55dGhpbmcgd2l0aAorICAgICAgICAvLyB0aGVtIGFueXdheS4KKyAgICAgICAgUmVhZEFiYnJldlJlY29yZCgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIEJpdHN0cmVhbUVudHJ5OjpnZXRSZWNvcmQoQ29kZSk7CisgICAgfQorICB9CisKKyAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgY2xpZW50cyB0aGF0IGRvbid0IGV4cGVjdCBhbnkKKyAgLy8vIHN1YmJsb2Nrcy4gVGhpcyBqdXN0IHNraXBzIG92ZXIgdGhlbSBhdXRvbWF0aWNhbGx5LgorICBCaXRzdHJlYW1FbnRyeSBhZHZhbmNlU2tpcHBpbmdTdWJibG9ja3ModW5zaWduZWQgRmxhZ3MgPSAwKSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIC8vIElmIHdlIGZvdW5kIGEgbm9ybWFsIGVudHJ5LCByZXR1cm4gaXQuCisgICAgICBCaXRzdHJlYW1FbnRyeSBFbnRyeSA9IGFkdmFuY2UoRmxhZ3MpOworICAgICAgaWYgKEVudHJ5LktpbmQgIT0gQml0c3RyZWFtRW50cnk6OlN1YkJsb2NrKQorICAgICAgICByZXR1cm4gRW50cnk7CisKKyAgICAgIC8vIElmIHdlIGZvdW5kIGEgc3ViLWJsb2NrLCBqdXN0IHNraXAgb3ZlciBpdCBhbmQgY2hlY2sgdGhlIG5leHQgZW50cnkuCisgICAgICBpZiAoU2tpcEJsb2NrKCkpCisgICAgICAgIHJldHVybiBCaXRzdHJlYW1FbnRyeTo6Z2V0RXJyb3IoKTsKKyAgICB9CisgIH0KKworICB1bnNpZ25lZCBSZWFkQ29kZSgpIHsKKyAgICByZXR1cm4gUmVhZChDdXJDb2RlU2l6ZSk7CisgIH0KKworICAvLyBCbG9jayBoZWFkZXI6CisgIC8vICAgIFtFTlRFUl9TVUJCTE9DSywgYmxvY2tpZCwgbmV3Y29kZWxlbiwgPGFsaWduNGJ5dGVzPiwgYmxvY2tsZW5dCisKKyAgLy8vIEhhdmluZyByZWFkIHRoZSBFTlRFUl9TVUJCTE9DSyBjb2RlLCByZWFkIHRoZSBCbG9ja0lEIGZvciB0aGUgYmxvY2suCisgIHVuc2lnbmVkIFJlYWRTdWJCbG9ja0lEKCkgeworICAgIHJldHVybiBSZWFkVkJSKGJpdGM6OkJsb2NrSURXaWR0aCk7CisgIH0KKworICAvLy8gSGF2aW5nIHJlYWQgdGhlIEVOVEVSX1NVQkJMT0NLIGFiYnJldmlkIGFuZCBhIEJsb2NrSUQsIHNraXAgb3ZlciB0aGUgYm9keQorICAvLy8gb2YgdGhpcyBibG9jay4gSWYgdGhlIGJsb2NrIHJlY29yZCBpcyBtYWxmb3JtZWQsIHJldHVybiB0cnVlLgorICBib29sIFNraXBCbG9jaygpIHsKKyAgICAvLyBSZWFkIGFuZCBpZ25vcmUgdGhlIGNvZGVsZW4gdmFsdWUuICBTaW5jZSB3ZSBhcmUgc2tpcHBpbmcgdGhpcyBibG9jaywgd2UKKyAgICAvLyBkb24ndCBjYXJlIHdoYXQgY29kZSB3aWR0aHMgYXJlIHVzZWQgaW5zaWRlIG9mIGl0LgorICAgIFJlYWRWQlIoYml0Yzo6Q29kZUxlbldpZHRoKTsKKyAgICBTa2lwVG9Gb3VyQnl0ZUJvdW5kYXJ5KCk7CisgICAgdW5zaWduZWQgTnVtRm91ckJ5dGVzID0gUmVhZChiaXRjOjpCbG9ja1NpemVXaWR0aCk7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBibG9jayB3YXNuJ3QgcGFydGlhbGx5IGRlZmluZWQsIGFuZCB0aGF0IHRoZSBvZmZzZXQgaXNuJ3QKKyAgICAvLyBib2d1cy4KKyAgICBzaXplX3QgU2tpcFRvID0gR2V0Q3VycmVudEJpdE5vKCkgKyBOdW1Gb3VyQnl0ZXMqNCo4OworICAgIGlmIChBdEVuZE9mU3RyZWFtKCkgfHwgIWNhblNraXBUb1BvcyhTa2lwVG8vOCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIEp1bXBUb0JpdChTa2lwVG8pOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBIYXZpbmcgcmVhZCB0aGUgRU5URVJfU1VCQkxPQ0sgYWJicmV2aWQsIGVudGVyIHRoZSBibG9jaywgYW5kIHJldHVybiB0cnVlCisgIC8vLyBpZiB0aGUgYmxvY2sgaGFzIGFuIGVycm9yLgorICBib29sIEVudGVyU3ViQmxvY2sodW5zaWduZWQgQmxvY2tJRCwgdW5zaWduZWQgKk51bVdvcmRzUCA9IG51bGxwdHIpOworCisgIGJvb2wgUmVhZEJsb2NrRW5kKCkgeworICAgIGlmIChCbG9ja1Njb3BlLmVtcHR5KCkpIHJldHVybiB0cnVlOworCisgICAgLy8gQmxvY2sgdGFpbDoKKyAgICAvLyAgICBbRU5EX0JMT0NLLCA8YWxpZ240Ynl0ZXM+XQorICAgIFNraXBUb0ZvdXJCeXRlQm91bmRhcnkoKTsKKworICAgIHBvcEJsb2NrU2NvcGUoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBwb3BCbG9ja1Njb3BlKCkgeworICAgIEN1ckNvZGVTaXplID0gQmxvY2tTY29wZS5iYWNrKCkuUHJldkNvZGVTaXplOworCisgICAgQ3VyQWJicmV2cyA9IHN0ZDo6bW92ZShCbG9ja1Njb3BlLmJhY2soKS5QcmV2QWJicmV2cyk7CisgICAgQmxvY2tTY29wZS5wb3BfYmFjaygpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFJlY29yZCBQcm9jZXNzaW5nCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitwdWJsaWM6CisgIC8vLyBSZXR1cm4gdGhlIGFiYnJldmlhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBBYmJyZXZJZC4KKyAgY29uc3QgQml0Q29kZUFiYnJldiAqZ2V0QWJicmV2KHVuc2lnbmVkIEFiYnJldklEKSB7CisgICAgdW5zaWduZWQgQWJicmV2Tm8gPSBBYmJyZXZJRCAtIGJpdGM6OkZJUlNUX0FQUExJQ0FUSU9OX0FCQlJFVjsKKyAgICBpZiAoQWJicmV2Tm8gPj0gQ3VyQWJicmV2cy5zaXplKCkpCisgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIkludmFsaWQgYWJicmV2IG51bWJlciIpOworICAgIHJldHVybiBDdXJBYmJyZXZzW0FiYnJldk5vXS5nZXQoKTsKKyAgfQorCisgIC8vLyBSZWFkIHRoZSBjdXJyZW50IHJlY29yZCBhbmQgZGlzY2FyZCBpdCwgcmV0dXJuaW5nIHRoZSBjb2RlIGZvciB0aGUgcmVjb3JkLgorICB1bnNpZ25lZCBza2lwUmVjb3JkKHVuc2lnbmVkIEFiYnJldklEKTsKKworICB1bnNpZ25lZCByZWFkUmVjb3JkKHVuc2lnbmVkIEFiYnJldklELCBTbWFsbFZlY3RvckltcGw8dWludDY0X3Q+ICZWYWxzLAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAqQmxvYiA9IG51bGxwdHIpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBYmJyZXYgUHJvY2Vzc2luZworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgdm9pZCBSZWFkQWJicmV2UmVjb3JkKCk7CisKKyAgLy8vIFJlYWQgYW5kIHJldHVybiBhIGJsb2NrIGluZm8gYmxvY2sgZnJvbSB0aGUgYml0c3RyZWFtLiBJZiBhbiBlcnJvciB3YXMKKyAgLy8vIGVuY291bnRlcmVkLCByZXR1cm4gTm9uZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gUmVhZEJsb2NrSW5mb05hbWVzIFdoZXRoZXIgdG8gcmVhZCBibG9jay9yZWNvcmQgbmFtZSBpbmZvcm1hdGlvbiBpbgorICAvLy8gdGhlIEJsb2NrSW5mbyBibG9jay4gT25seSBsbHZtLWJjYW5hbHl6ZXIgdXNlcyB0aGlzLgorICBPcHRpb25hbDxCaXRzdHJlYW1CbG9ja0luZm8+CisgIFJlYWRCbG9ja0luZm9CbG9jayhib29sIFJlYWRCbG9ja0luZm9OYW1lcyA9IGZhbHNlKTsKKworICAvLy8gU2V0IHRoZSBibG9jayBpbmZvIHRvIGJlIHVzZWQgYnkgdGhpcyBCaXRzdHJlYW1DdXJzb3IgdG8gaW50ZXJwcmV0CisgIC8vLyBhYmJyZXZpYXRlZCByZWNvcmRzLgorICB2b2lkIHNldEJsb2NrSW5mbyhCaXRzdHJlYW1CbG9ja0luZm8gKkJJKSB7IEJsb2NrSW5mbyA9IEJJOyB9Cit9OworCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gTExWTV9CSVRDT0RFX0JJVFNUUkVBTVJFQURFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpdGNvZGUvQml0c3RyZWFtV3JpdGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpdGNvZGUvQml0c3RyZWFtV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI3NmRiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQml0Y29kZS9CaXRzdHJlYW1Xcml0ZXIuaApAQCAtMCwwICsxLDU1MCBAQAorLy89PT0tIEJpdHN0cmVhbVdyaXRlci5oIC0gTG93LWxldmVsIGJpdHN0cmVhbSB3cml0ZXIgaW50ZXJmYWNlIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBkZWZpbmVzIHRoZSBCaXRzdHJlYW1Xcml0ZXIgY2xhc3MuICBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvCisvLyB3cml0ZSBhbiBhcmJpdHJhcnkgYml0c3RyZWFtLCByZWdhcmRsZXNzIG9mIGl0cyBjb250ZW50cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQklUQ09ERV9CSVRTVFJFQU1XUklURVJfSAorI2RlZmluZSBMTFZNX0JJVENPREVfQklUU1RSRUFNV1JJVEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQml0Y29kZS9CaXRDb2Rlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQml0c3RyZWFtV3JpdGVyIHsKKyAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZPdXQ7CisKKyAgLy8vIEN1ckJpdCAtIEFsd2F5cyBiZXR3ZWVuIDAgYW5kIDMxIGluY2x1c2l2ZSwgc3BlY2lmaWVzIHRoZSBuZXh0IGJpdCB0byB1c2UuCisgIHVuc2lnbmVkIEN1ckJpdDsKKworICAvLy8gQ3VyVmFsdWUgLSBUaGUgY3VycmVudCB2YWx1ZS4gIE9ubHkgYml0cyA8IEN1ckJpdCBhcmUgdmFsaWQuCisgIHVpbnQzMl90IEN1clZhbHVlOworCisgIC8vLyBDdXJDb2RlU2l6ZSAtIFRoaXMgaXMgdGhlIGRlY2xhcmVkIHNpemUgb2YgY29kZSB2YWx1ZXMgdXNlZCBmb3IgdGhlCisgIC8vLyBjdXJyZW50IGJsb2NrLCBpbiBiaXRzLgorICB1bnNpZ25lZCBDdXJDb2RlU2l6ZTsKKworICAvLy8gQmxvY2tJbmZvQ3VyQklEIC0gV2hlbiBlbWl0dGluZyBhIEJMT0NLSU5GT19CTE9DSywgdGhpcyBpcyB0aGUgY3VycmVudGx5CisgIC8vLyBzZWxlY3RlZCBCTE9DSyBJRC4KKyAgdW5zaWduZWQgQmxvY2tJbmZvQ3VyQklEOworCisgIC8vLyBDdXJBYmJyZXZzIC0gQWJicmV2cyBpbnN0YWxsZWQgYXQgaW4gdGhpcyBibG9jay4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEJpdENvZGVBYmJyZXY+PiBDdXJBYmJyZXZzOworCisgIHN0cnVjdCBCbG9jayB7CisgICAgdW5zaWduZWQgUHJldkNvZGVTaXplOworICAgIHNpemVfdCBTdGFydFNpemVXb3JkOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxCaXRDb2RlQWJicmV2Pj4gUHJldkFiYnJldnM7CisgICAgQmxvY2sodW5zaWduZWQgUENTLCBzaXplX3QgU1NXKSA6IFByZXZDb2RlU2l6ZShQQ1MpLCBTdGFydFNpemVXb3JkKFNTVykge30KKyAgfTsKKworICAvLy8gQmxvY2tTY29wZSAtIFRoaXMgdHJhY2tzIHRoZSBjdXJyZW50IGJsb2NrcyB0aGF0IHdlIGhhdmUgZW50ZXJlZC4KKyAgc3RkOjp2ZWN0b3I8QmxvY2s+IEJsb2NrU2NvcGU7CisKKyAgLy8vIEJsb2NrSW5mbyAtIFRoaXMgY29udGFpbnMgaW5mb3JtYXRpb24gZW1pdHRlZCB0byBCTE9DS0lORk9fQkxPQ0sgYmxvY2tzLgorICAvLy8gVGhlc2UgZGVzY3JpYmUgYWJicmV2aWF0aW9ucyB0aGF0IGFsbCBibG9ja3Mgb2YgdGhlIHNwZWNpZmllZCBJRCBpbmhlcml0LgorICBzdHJ1Y3QgQmxvY2tJbmZvIHsKKyAgICB1bnNpZ25lZCBCbG9ja0lEOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxCaXRDb2RlQWJicmV2Pj4gQWJicmV2czsKKyAgfTsKKyAgc3RkOjp2ZWN0b3I8QmxvY2tJbmZvPiBCbG9ja0luZm9SZWNvcmRzOworCisgIHZvaWQgV3JpdGVCeXRlKHVuc2lnbmVkIGNoYXIgVmFsdWUpIHsKKyAgICBPdXQucHVzaF9iYWNrKFZhbHVlKTsKKyAgfQorCisgIHZvaWQgV3JpdGVXb3JkKHVuc2lnbmVkIFZhbHVlKSB7CisgICAgVmFsdWUgPSBzdXBwb3J0OjplbmRpYW46OmJ5dGVfc3dhcDx1aW50MzJfdCwgc3VwcG9ydDo6bGl0dGxlPihWYWx1ZSk7CisgICAgT3V0LmFwcGVuZChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJlZhbHVlKSwKKyAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmVmFsdWUgKyAxKSk7CisgIH0KKworICBzaXplX3QgR2V0QnVmZmVyT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gT3V0LnNpemUoKTsgfQorCisgIHNpemVfdCBHZXRXb3JkSW5kZXgoKSBjb25zdCB7CisgICAgc2l6ZV90IE9mZnNldCA9IEdldEJ1ZmZlck9mZnNldCgpOworICAgIGFzc2VydCgoT2Zmc2V0ICYgMykgPT0gMCAmJiAiTm90IDMyLWJpdCBhbGlnbmVkIik7CisgICAgcmV0dXJuIE9mZnNldCAvIDQ7CisgIH0KKworcHVibGljOgorICBleHBsaWNpdCBCaXRzdHJlYW1Xcml0ZXIoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZPKQorICAgIDogT3V0KE8pLCBDdXJCaXQoMCksIEN1clZhbHVlKDApLCBDdXJDb2RlU2l6ZSgyKSB7fQorCisgIH5CaXRzdHJlYW1Xcml0ZXIoKSB7CisgICAgYXNzZXJ0KEN1ckJpdCA9PSAwICYmICJVbmZsdXNoZWQgZGF0YSByZW1haW5pbmciKTsKKyAgICBhc3NlcnQoQmxvY2tTY29wZS5lbXB0eSgpICYmIEN1ckFiYnJldnMuZW1wdHkoKSAmJiAiQmxvY2sgaW1iYWxhbmNlIik7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0sIGluIGJpdHMuCisgIHVpbnQ2NF90IEdldEN1cnJlbnRCaXRObygpIGNvbnN0IHsgcmV0dXJuIEdldEJ1ZmZlck9mZnNldCgpICogOCArIEN1ckJpdDsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG51bWJlciBvZiBiaXRzIGN1cnJlbnRseSB1c2VkIHRvIGVuY29kZSBhbiBhYmJyZXYgSUQuCisgIHVuc2lnbmVkIEdldEFiYnJldklEV2lkdGgoKSBjb25zdCB7IHJldHVybiBDdXJDb2RlU2l6ZTsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBCYXNpYyBQcmltaXRpdmVzIGZvciBlbWl0dGluZyBiaXRzIHRvIHRoZSBzdHJlYW0uCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBCYWNrcGF0Y2ggYSAzMi1iaXQgd29yZCBpbiB0aGUgb3V0cHV0IGF0IHRoZSBnaXZlbiBiaXQgb2Zmc2V0CisgIC8vLyB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgIHZvaWQgQmFja3BhdGNoV29yZCh1aW50NjRfdCBCaXRObywgdW5zaWduZWQgTmV3V29yZCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworICAgIHVuc2lnbmVkIEJ5dGVObyA9IEJpdE5vIC8gODsKKyAgICBhc3NlcnQoKCFlbmRpYW46OnJlYWRBdEJpdEFsaWdubWVudDx1aW50MzJfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KAorICAgICAgICAgICAgICAgJk91dFtCeXRlTm9dLCBCaXRObyAmIDcpKSAmJgorICAgICAgICAgICAiRXhwZWN0ZWQgdG8gYmUgcGF0Y2hpbmcgb3ZlciAwLXZhbHVlIHBsYWNlaG9sZGVycyIpOworICAgIGVuZGlhbjo6d3JpdGVBdEJpdEFsaWdubWVudDx1aW50MzJfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KAorICAgICAgICAmT3V0W0J5dGVOb10sIE5ld1dvcmQsIEJpdE5vICYgNyk7CisgIH0KKworICB2b2lkIEJhY2twYXRjaFdvcmQ2NCh1aW50NjRfdCBCaXRObywgdWludDY0X3QgVmFsKSB7CisgICAgQmFja3BhdGNoV29yZChCaXRObywgKHVpbnQzMl90KVZhbCk7CisgICAgQmFja3BhdGNoV29yZChCaXRObyArIDMyLCAodWludDMyX3QpKFZhbCA+PiAzMikpOworICB9CisKKyAgdm9pZCBFbWl0KHVpbnQzMl90IFZhbCwgdW5zaWduZWQgTnVtQml0cykgeworICAgIGFzc2VydChOdW1CaXRzICYmIE51bUJpdHMgPD0gMzIgJiYgIkludmFsaWQgdmFsdWUgc2l6ZSEiKTsKKyAgICBhc3NlcnQoKFZhbCAmIH4ofjBVID4+ICgzMi1OdW1CaXRzKSkpID09IDAgJiYgIkhpZ2ggYml0cyBzZXQhIik7CisgICAgQ3VyVmFsdWUgfD0gVmFsIDw8IEN1ckJpdDsKKyAgICBpZiAoQ3VyQml0ICsgTnVtQml0cyA8IDMyKSB7CisgICAgICBDdXJCaXQgKz0gTnVtQml0czsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBBZGQgdGhlIGN1cnJlbnQgd29yZC4KKyAgICBXcml0ZVdvcmQoQ3VyVmFsdWUpOworCisgICAgaWYgKEN1ckJpdCkKKyAgICAgIEN1clZhbHVlID0gVmFsID4+ICgzMi1DdXJCaXQpOworICAgIGVsc2UKKyAgICAgIEN1clZhbHVlID0gMDsKKyAgICBDdXJCaXQgPSAoQ3VyQml0K051bUJpdHMpICYgMzE7CisgIH0KKworICB2b2lkIEZsdXNoVG9Xb3JkKCkgeworICAgIGlmIChDdXJCaXQpIHsKKyAgICAgIFdyaXRlV29yZChDdXJWYWx1ZSk7CisgICAgICBDdXJCaXQgPSAwOworICAgICAgQ3VyVmFsdWUgPSAwOworICAgIH0KKyAgfQorCisgIHZvaWQgRW1pdFZCUih1aW50MzJfdCBWYWwsIHVuc2lnbmVkIE51bUJpdHMpIHsKKyAgICBhc3NlcnQoTnVtQml0cyA8PSAzMiAmJiAiVG9vIG1hbnkgYml0cyB0byBlbWl0ISIpOworICAgIHVpbnQzMl90IFRocmVzaG9sZCA9IDFVIDw8IChOdW1CaXRzLTEpOworCisgICAgLy8gRW1pdCB0aGUgYml0cyB3aXRoIFZCUiBlbmNvZGluZywgTnVtQml0cy0xIGJpdHMgYXQgYSB0aW1lLgorICAgIHdoaWxlIChWYWwgPj0gVGhyZXNob2xkKSB7CisgICAgICBFbWl0KChWYWwgJiAoKDEgPDwgKE51bUJpdHMtMSkpLTEpKSB8ICgxIDw8IChOdW1CaXRzLTEpKSwgTnVtQml0cyk7CisgICAgICBWYWwgPj49IE51bUJpdHMtMTsKKyAgICB9CisKKyAgICBFbWl0KFZhbCwgTnVtQml0cyk7CisgIH0KKworICB2b2lkIEVtaXRWQlI2NCh1aW50NjRfdCBWYWwsIHVuc2lnbmVkIE51bUJpdHMpIHsKKyAgICBhc3NlcnQoTnVtQml0cyA8PSAzMiAmJiAiVG9vIG1hbnkgYml0cyB0byBlbWl0ISIpOworICAgIGlmICgodWludDMyX3QpVmFsID09IFZhbCkKKyAgICAgIHJldHVybiBFbWl0VkJSKCh1aW50MzJfdClWYWwsIE51bUJpdHMpOworCisgICAgdWludDMyX3QgVGhyZXNob2xkID0gMVUgPDwgKE51bUJpdHMtMSk7CisKKyAgICAvLyBFbWl0IHRoZSBiaXRzIHdpdGggVkJSIGVuY29kaW5nLCBOdW1CaXRzLTEgYml0cyBhdCBhIHRpbWUuCisgICAgd2hpbGUgKFZhbCA+PSBUaHJlc2hvbGQpIHsKKyAgICAgIEVtaXQoKCh1aW50MzJfdClWYWwgJiAoKDEgPDwgKE51bUJpdHMtMSkpLTEpKSB8CisgICAgICAgICAgICgxIDw8IChOdW1CaXRzLTEpKSwgTnVtQml0cyk7CisgICAgICBWYWwgPj49IE51bUJpdHMtMTsKKyAgICB9CisKKyAgICBFbWl0KCh1aW50MzJfdClWYWwsIE51bUJpdHMpOworICB9CisKKyAgLy8vIEVtaXRDb2RlIC0gRW1pdCB0aGUgc3BlY2lmaWVkIGNvZGUuCisgIHZvaWQgRW1pdENvZGUodW5zaWduZWQgVmFsKSB7CisgICAgRW1pdChWYWwsIEN1ckNvZGVTaXplKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBCbG9jayBNYW5pcHVsYXRpb24KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIGdldEJsb2NrSW5mbyAtIElmIHRoZXJlIGlzIGJsb2NrIGluZm8gZm9yIHRoZSBzcGVjaWZpZWQgSUQsIHJldHVybiBpdCwKKyAgLy8vIG90aGVyd2lzZSByZXR1cm4gbnVsbC4KKyAgQmxvY2tJbmZvICpnZXRCbG9ja0luZm8odW5zaWduZWQgQmxvY2tJRCkgeworICAgIC8vIENvbW1vbiBjYXNlLCB0aGUgbW9zdCByZWNlbnQgZW50cnkgbWF0Y2hlcyBCbG9ja0lELgorICAgIGlmICghQmxvY2tJbmZvUmVjb3Jkcy5lbXB0eSgpICYmIEJsb2NrSW5mb1JlY29yZHMuYmFjaygpLkJsb2NrSUQgPT0gQmxvY2tJRCkKKyAgICAgIHJldHVybiAmQmxvY2tJbmZvUmVjb3Jkcy5iYWNrKCk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KEJsb2NrSW5mb1JlY29yZHMuc2l6ZSgpKTsKKyAgICAgICAgIGkgIT0gZTsgKytpKQorICAgICAgaWYgKEJsb2NrSW5mb1JlY29yZHNbaV0uQmxvY2tJRCA9PSBCbG9ja0lEKQorICAgICAgICByZXR1cm4gJkJsb2NrSW5mb1JlY29yZHNbaV07CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB2b2lkIEVudGVyU3ViYmxvY2sodW5zaWduZWQgQmxvY2tJRCwgdW5zaWduZWQgQ29kZUxlbikgeworICAgIC8vIEJsb2NrIGhlYWRlcjoKKyAgICAvLyAgICBbRU5URVJfU1VCQkxPQ0ssIGJsb2NraWQsIG5ld2NvZGVsZW4sIDxhbGlnbjRieXRlcz4sIGJsb2NrbGVuXQorICAgIEVtaXRDb2RlKGJpdGM6OkVOVEVSX1NVQkJMT0NLKTsKKyAgICBFbWl0VkJSKEJsb2NrSUQsIGJpdGM6OkJsb2NrSURXaWR0aCk7CisgICAgRW1pdFZCUihDb2RlTGVuLCBiaXRjOjpDb2RlTGVuV2lkdGgpOworICAgIEZsdXNoVG9Xb3JkKCk7CisKKyAgICBzaXplX3QgQmxvY2tTaXplV29yZEluZGV4ID0gR2V0V29yZEluZGV4KCk7CisgICAgdW5zaWduZWQgT2xkQ29kZVNpemUgPSBDdXJDb2RlU2l6ZTsKKworICAgIC8vIEVtaXQgYSBwbGFjZWhvbGRlciwgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCB3aGVuIHRoZSBibG9jayBpcyBwb3BwZWQuCisgICAgRW1pdCgwLCBiaXRjOjpCbG9ja1NpemVXaWR0aCk7CisKKyAgICBDdXJDb2RlU2l6ZSA9IENvZGVMZW47CisKKyAgICAvLyBQdXNoIHRoZSBvdXRlciBibG9jaydzIGFiYnJldiBzZXQgb250byB0aGUgc3RhY2ssIHN0YXJ0IG91dCB3aXRoIGFuCisgICAgLy8gZW1wdHkgYWJicmV2IHNldC4KKyAgICBCbG9ja1Njb3BlLmVtcGxhY2VfYmFjayhPbGRDb2RlU2l6ZSwgQmxvY2tTaXplV29yZEluZGV4KTsKKyAgICBCbG9ja1Njb3BlLmJhY2soKS5QcmV2QWJicmV2cy5zd2FwKEN1ckFiYnJldnMpOworCisgICAgLy8gSWYgdGhlcmUgaXMgYSBibG9ja2luZm8gZm9yIHRoaXMgQmxvY2tJRCwgYWRkIGFsbCB0aGUgcHJlZGVmaW5lZCBhYmJyZXZzCisgICAgLy8gdG8gdGhlIGFiYnJldiBsaXN0LgorICAgIGlmIChCbG9ja0luZm8gKkluZm8gPSBnZXRCbG9ja0luZm8oQmxvY2tJRCkpIHsKKyAgICAgIEN1ckFiYnJldnMuaW5zZXJ0KEN1ckFiYnJldnMuZW5kKCksIEluZm8tPkFiYnJldnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEluZm8tPkFiYnJldnMuZW5kKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgRXhpdEJsb2NrKCkgeworICAgIGFzc2VydCghQmxvY2tTY29wZS5lbXB0eSgpICYmICJCbG9jayBzY29wZSBpbWJhbGFuY2UhIik7CisgICAgY29uc3QgQmxvY2sgJkIgPSBCbG9ja1Njb3BlLmJhY2soKTsKKworICAgIC8vIEJsb2NrIHRhaWw6CisgICAgLy8gICAgW0VORF9CTE9DSywgPGFsaWduNGJ5dGVzPl0KKyAgICBFbWl0Q29kZShiaXRjOjpFTkRfQkxPQ0spOworICAgIEZsdXNoVG9Xb3JkKCk7CisKKyAgICAvLyBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBibG9jaywgaW4gd29yZHMsIG5vdCBjb3VudGluZyB0aGUgc2l6ZSBmaWVsZC4KKyAgICBzaXplX3QgU2l6ZUluV29yZHMgPSBHZXRXb3JkSW5kZXgoKSAtIEIuU3RhcnRTaXplV29yZCAtIDE7CisgICAgdWludDY0X3QgQml0Tm8gPSB1aW50NjRfdChCLlN0YXJ0U2l6ZVdvcmQpICogMzI7CisKKyAgICAvLyBVcGRhdGUgdGhlIGJsb2NrIHNpemUgZmllbGQgaW4gdGhlIGhlYWRlciBvZiB0aGlzIHN1Yi1ibG9jay4KKyAgICBCYWNrcGF0Y2hXb3JkKEJpdE5vLCBTaXplSW5Xb3Jkcyk7CisKKyAgICAvLyBSZXN0b3JlIHRoZSBpbm5lciBibG9jaydzIGNvZGUgc2l6ZSBhbmQgYWJicmV2IHRhYmxlLgorICAgIEN1ckNvZGVTaXplID0gQi5QcmV2Q29kZVNpemU7CisgICAgQ3VyQWJicmV2cyA9IHN0ZDo6bW92ZShCLlByZXZBYmJyZXZzKTsKKyAgICBCbG9ja1Njb3BlLnBvcF9iYWNrKCk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUmVjb3JkIEVtaXNzaW9uCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitwcml2YXRlOgorICAvLy8gRW1pdEFiYnJldmlhdGVkTGl0ZXJhbCAtIEVtaXQgYSBsaXRlcmFsIHZhbHVlIGFjY29yZGluZyB0byBpdHMgYWJicmV2CisgIC8vLyByZWNvcmQuICBUaGlzIGlzIGEgbm8tb3AsIHNpbmNlIHRoZSBhYmJyZXYgc3BlY2lmaWVzIHRoZSBsaXRlcmFsIHRvIHVzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgdWludHR5PgorICB2b2lkIEVtaXRBYmJyZXZpYXRlZExpdGVyYWwoY29uc3QgQml0Q29kZUFiYnJldk9wICZPcCwgdWludHR5IFYpIHsKKyAgICBhc3NlcnQoT3AuaXNMaXRlcmFsKCkgJiYgIk5vdCBhIGxpdGVyYWwiKTsKKyAgICAvLyBJZiB0aGUgYWJicmV2IHNwZWNpZmllcyB0aGUgbGl0ZXJhbCB2YWx1ZSB0byB1c2UsIGRvbid0IGVtaXQKKyAgICAvLyBhbnl0aGluZy4KKyAgICBhc3NlcnQoViA9PSBPcC5nZXRMaXRlcmFsVmFsdWUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBhYmJyZXYgZm9yIHJlY29yZCEiKTsKKyAgfQorCisgIC8vLyBFbWl0QWJicmV2aWF0ZWRGaWVsZCAtIEVtaXQgYSBzaW5nbGUgc2NhbGFyIGZpZWxkIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZAorICAvLy8gZW5jb2RpbmcuCisgIHRlbXBsYXRlPHR5cGVuYW1lIHVpbnR0eT4KKyAgdm9pZCBFbWl0QWJicmV2aWF0ZWRGaWVsZChjb25zdCBCaXRDb2RlQWJicmV2T3AgJk9wLCB1aW50dHkgVikgeworICAgIGFzc2VydCghT3AuaXNMaXRlcmFsKCkgJiYgIkxpdGVyYWxzIHNob3VsZCB1c2UgRW1pdEFiYnJldmlhdGVkTGl0ZXJhbCEiKTsKKworICAgIC8vIEVuY29kZSB0aGUgdmFsdWUgYXMgd2UgYXJlIGNvbW1hbmRlZC4KKyAgICBzd2l0Y2ggKE9wLmdldEVuY29kaW5nKCkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIGVuY29kaW5nISIpOworICAgIGNhc2UgQml0Q29kZUFiYnJldk9wOjpGaXhlZDoKKyAgICAgIGlmIChPcC5nZXRFbmNvZGluZ0RhdGEoKSkKKyAgICAgICAgRW1pdCgodW5zaWduZWQpViwgKHVuc2lnbmVkKU9wLmdldEVuY29kaW5nRGF0YSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQml0Q29kZUFiYnJldk9wOjpWQlI6CisgICAgICBpZiAoT3AuZ2V0RW5jb2RpbmdEYXRhKCkpCisgICAgICAgIEVtaXRWQlI2NChWLCAodW5zaWduZWQpT3AuZ2V0RW5jb2RpbmdEYXRhKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaXRDb2RlQWJicmV2T3A6OkNoYXI2OgorICAgICAgRW1pdChCaXRDb2RlQWJicmV2T3A6OkVuY29kZUNoYXI2KChjaGFyKVYpLCA2KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vLyBFbWl0UmVjb3JkV2l0aEFiYnJldkltcGwgLSBUaGlzIGlzIHRoZSBjb3JlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZWNvcmQKKyAgLy8vIGVtaXNzaW9uIGNvZGUuICBJZiBCbG9iRGF0YSBpcyBub24tbnVsbCwgdGhlbiBpdCBzcGVjaWZpZXMgYW4gYXJyYXkgb2YKKyAgLy8vIGRhdGEgdGhhdCBzaG91bGQgYmUgZW1pdHRlZCBhcyBwYXJ0IG9mIHRoZSBCbG9iIG9yIEFycmF5IG9wZXJhbmQgdGhhdCBpcworICAvLy8ga25vd24gdG8gZXhpc3QgYXQgdGhlIGVuZCBvZiB0aGUgcmVjb3JkLiBJZiBDb2RlIGlzIHNwZWNpZmllZCwgdGhlbgorICAvLy8gaXQgaXMgdGhlIHJlY29yZCBjb2RlIHRvIGVtaXQgYmVmb3JlIHRoZSBWYWxzLCB3aGljaCBtdXN0IG5vdCBjb250YWluCisgIC8vLyB0aGUgY29kZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHVpbnR0eT4KKyAgdm9pZCBFbWl0UmVjb3JkV2l0aEFiYnJldkltcGwodW5zaWduZWQgQWJicmV2LCBBcnJheVJlZjx1aW50dHk+IFZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBCbG9iLCBPcHRpb25hbDx1bnNpZ25lZD4gQ29kZSkgeworICAgIGNvbnN0IGNoYXIgKkJsb2JEYXRhID0gQmxvYi5kYXRhKCk7CisgICAgdW5zaWduZWQgQmxvYkxlbiA9ICh1bnNpZ25lZCkgQmxvYi5zaXplKCk7CisgICAgdW5zaWduZWQgQWJicmV2Tm8gPSBBYmJyZXYtYml0Yzo6RklSU1RfQVBQTElDQVRJT05fQUJCUkVWOworICAgIGFzc2VydChBYmJyZXZObyA8IEN1ckFiYnJldnMuc2l6ZSgpICYmICJJbnZhbGlkIGFiYnJldiAjISIpOworICAgIGNvbnN0IEJpdENvZGVBYmJyZXYgKkFiYnYgPSBDdXJBYmJyZXZzW0FiYnJldk5vXS5nZXQoKTsKKworICAgIEVtaXRDb2RlKEFiYnJldik7CisKKyAgICB1bnNpZ25lZCBpID0gMCwgZSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihBYmJ2LT5nZXROdW1PcGVyYW5kSW5mb3MoKSk7CisgICAgaWYgKENvZGUpIHsKKyAgICAgIGFzc2VydChlICYmICJFeHBlY3RlZCBub24tZW1wdHkgYWJicmV2aWF0aW9uIik7CisgICAgICBjb25zdCBCaXRDb2RlQWJicmV2T3AgJk9wID0gQWJidi0+Z2V0T3BlcmFuZEluZm8oaSsrKTsKKworICAgICAgaWYgKE9wLmlzTGl0ZXJhbCgpKQorICAgICAgICBFbWl0QWJicmV2aWF0ZWRMaXRlcmFsKE9wLCBDb2RlLmdldFZhbHVlKCkpOworICAgICAgZWxzZSB7CisgICAgICAgIGFzc2VydChPcC5nZXRFbmNvZGluZygpICE9IEJpdENvZGVBYmJyZXZPcDo6QXJyYXkgJiYKKyAgICAgICAgICAgICAgIE9wLmdldEVuY29kaW5nKCkgIT0gQml0Q29kZUFiYnJldk9wOjpCbG9iICYmCisgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbGl0ZXJhbCBvciBzY2FsYXIiKTsKKyAgICAgICAgRW1pdEFiYnJldmlhdGVkRmllbGQoT3AsIENvZGUuZ2V0VmFsdWUoKSk7CisgICAgICB9CisgICAgfQorCisgICAgdW5zaWduZWQgUmVjb3JkSWR4ID0gMDsKKyAgICBmb3IgKDsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNvbnN0IEJpdENvZGVBYmJyZXZPcCAmT3AgPSBBYmJ2LT5nZXRPcGVyYW5kSW5mbyhpKTsKKyAgICAgIGlmIChPcC5pc0xpdGVyYWwoKSkgeworICAgICAgICBhc3NlcnQoUmVjb3JkSWR4IDwgVmFscy5zaXplKCkgJiYgIkludmFsaWQgYWJicmV2L3JlY29yZCIpOworICAgICAgICBFbWl0QWJicmV2aWF0ZWRMaXRlcmFsKE9wLCBWYWxzW1JlY29yZElkeF0pOworICAgICAgICArK1JlY29yZElkeDsKKyAgICAgIH0gZWxzZSBpZiAoT3AuZ2V0RW5jb2RpbmcoKSA9PSBCaXRDb2RlQWJicmV2T3A6OkFycmF5KSB7CisgICAgICAgIC8vIEFycmF5IGNhc2UuCisgICAgICAgIGFzc2VydChpICsgMiA9PSBlICYmICJhcnJheSBvcCBub3Qgc2Vjb25kIHRvIGxhc3Q/Iik7CisgICAgICAgIGNvbnN0IEJpdENvZGVBYmJyZXZPcCAmRWx0RW5jID0gQWJidi0+Z2V0T3BlcmFuZEluZm8oKytpKTsKKworICAgICAgICAvLyBJZiB0aGlzIHJlY29yZCBoYXMgYmxvYiBkYXRhLCBlbWl0IGl0LCBvdGhlcndpc2Ugd2UgbXVzdCBoYXZlIHJlY29yZAorICAgICAgICAvLyBlbnRyaWVzIHRvIGVuY29kZSB0aGlzIHdheS4KKyAgICAgICAgaWYgKEJsb2JEYXRhKSB7CisgICAgICAgICAgYXNzZXJ0KFJlY29yZElkeCA9PSBWYWxzLnNpemUoKSAmJgorICAgICAgICAgICAgICAgICAiQmxvYiBkYXRhIGFuZCByZWNvcmQgZW50cmllcyBzcGVjaWZpZWQgZm9yIGFycmF5ISIpOworICAgICAgICAgIC8vIEVtaXQgYSB2YnI2IHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcHJlc2VudC4KKyAgICAgICAgICBFbWl0VkJSKHN0YXRpY19jYXN0PHVpbnQzMl90PihCbG9iTGVuKSwgNik7CisKKyAgICAgICAgICAvLyBFbWl0IGVhY2ggZmllbGQuCisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBCbG9iTGVuOyArK2kpCisgICAgICAgICAgICBFbWl0QWJicmV2aWF0ZWRGaWVsZChFbHRFbmMsICh1bnNpZ25lZCBjaGFyKUJsb2JEYXRhW2ldKTsKKworICAgICAgICAgIC8vIEtub3cgdGhhdCBibG9iIGRhdGEgaXMgY29uc3VtZWQgZm9yIGFzc2VydGlvbiBiZWxvdy4KKyAgICAgICAgICBCbG9iRGF0YSA9IG51bGxwdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gRW1pdCBhIHZicjYgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiBlbGVtZW50cyBwcmVzZW50LgorICAgICAgICAgIEVtaXRWQlIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFZhbHMuc2l6ZSgpLVJlY29yZElkeCksIDYpOworCisgICAgICAgICAgLy8gRW1pdCBlYWNoIGZpZWxkLgorICAgICAgICAgIGZvciAodW5zaWduZWQgZSA9IFZhbHMuc2l6ZSgpOyBSZWNvcmRJZHggIT0gZTsgKytSZWNvcmRJZHgpCisgICAgICAgICAgICBFbWl0QWJicmV2aWF0ZWRGaWVsZChFbHRFbmMsIFZhbHNbUmVjb3JkSWR4XSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoT3AuZ2V0RW5jb2RpbmcoKSA9PSBCaXRDb2RlQWJicmV2T3A6OkJsb2IpIHsKKyAgICAgICAgLy8gSWYgdGhpcyByZWNvcmQgaGFzIGJsb2IgZGF0YSwgZW1pdCBpdCwgb3RoZXJ3aXNlIHdlIG11c3QgaGF2ZSByZWNvcmQKKyAgICAgICAgLy8gZW50cmllcyB0byBlbmNvZGUgdGhpcyB3YXkuCisKKyAgICAgICAgaWYgKEJsb2JEYXRhKSB7CisgICAgICAgICAgYXNzZXJ0KFJlY29yZElkeCA9PSBWYWxzLnNpemUoKSAmJgorICAgICAgICAgICAgICAgICAiQmxvYiBkYXRhIGFuZCByZWNvcmQgZW50cmllcyBzcGVjaWZpZWQgZm9yIGJsb2Igb3BlcmFuZCEiKTsKKworICAgICAgICAgIGFzc2VydChCbG9iLmRhdGEoKSA9PSBCbG9iRGF0YSAmJiAiQmxvYkRhdGEgZ290IG1vdmVkIik7CisgICAgICAgICAgYXNzZXJ0KEJsb2Iuc2l6ZSgpID09IEJsb2JMZW4gJiYgIkJsb2JMZW4gZ290IGNoYW5nZWQiKTsKKyAgICAgICAgICBlbWl0QmxvYihCbG9iKTsKKyAgICAgICAgICBCbG9iRGF0YSA9IG51bGxwdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZW1pdEJsb2IoVmFscy5zbGljZShSZWNvcmRJZHgpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsgIC8vIFNpbmdsZSBzY2FsYXIgZmllbGQuCisgICAgICAgIGFzc2VydChSZWNvcmRJZHggPCBWYWxzLnNpemUoKSAmJiAiSW52YWxpZCBhYmJyZXYvcmVjb3JkIik7CisgICAgICAgIEVtaXRBYmJyZXZpYXRlZEZpZWxkKE9wLCBWYWxzW1JlY29yZElkeF0pOworICAgICAgICArK1JlY29yZElkeDsKKyAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0KFJlY29yZElkeCA9PSBWYWxzLnNpemUoKSAmJiAiTm90IGFsbCByZWNvcmQgb3BlcmFuZHMgZW1pdHRlZCEiKTsKKyAgICBhc3NlcnQoQmxvYkRhdGEgPT0gbnVsbHB0ciAmJgorICAgICAgICAgICAiQmxvYiBkYXRhIHNwZWNpZmllZCBmb3IgcmVjb3JkIHRoYXQgZG9lc24ndCB1c2UgaXQhIik7CisgIH0KKworcHVibGljOgorICAvLy8gRW1pdCBhIGJsb2IsIGluY2x1ZGluZyBmbHVzaGluZyBiZWZvcmUgYW5kIHRhaWwtcGFkZGluZy4KKyAgdGVtcGxhdGUgPGNsYXNzIFVJbnRUeT4KKyAgdm9pZCBlbWl0QmxvYihBcnJheVJlZjxVSW50VHk+IEJ5dGVzLCBib29sIFNob3VsZEVtaXRTaXplID0gdHJ1ZSkgeworICAgIC8vIEVtaXQgYSB2YnI2IHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcHJlc2VudC4KKyAgICBpZiAoU2hvdWxkRW1pdFNpemUpCisgICAgICBFbWl0VkJSKHN0YXRpY19jYXN0PHVpbnQzMl90PihCeXRlcy5zaXplKCkpLCA2KTsKKworICAgIC8vIEZsdXNoIHRvIGEgMzItYml0IGFsaWdubWVudCBib3VuZGFyeS4KKyAgICBGbHVzaFRvV29yZCgpOworCisgICAgLy8gRW1pdCBsaXRlcmFsIGJ5dGVzLgorICAgIGZvciAoY29uc3QgYXV0byAmQiA6IEJ5dGVzKSB7CisgICAgICBhc3NlcnQoaXNVSW50PDg+KEIpICYmICJWYWx1ZSB0b28gbGFyZ2UgdG8gZW1pdCBhcyBieXRlIik7CisgICAgICBXcml0ZUJ5dGUoKHVuc2lnbmVkIGNoYXIpQik7CisgICAgfQorCisgICAgLy8gQWxpZ24gZW5kIHRvIDMyLWJpdHMuCisgICAgd2hpbGUgKEdldEJ1ZmZlck9mZnNldCgpICYgMykKKyAgICAgIFdyaXRlQnl0ZSgwKTsKKyAgfQorICB2b2lkIGVtaXRCbG9iKFN0cmluZ1JlZiBCeXRlcywgYm9vbCBTaG91bGRFbWl0U2l6ZSA9IHRydWUpIHsKKyAgICBlbWl0QmxvYihtYWtlQXJyYXlSZWYoKGNvbnN0IHVpbnQ4X3QgKilCeXRlcy5kYXRhKCksIEJ5dGVzLnNpemUoKSksCisgICAgICAgICAgICAgU2hvdWxkRW1pdFNpemUpOworICB9CisKKyAgLy8vIEVtaXRSZWNvcmQgLSBFbWl0IHRoZSBzcGVjaWZpZWQgcmVjb3JkIHRvIHRoZSBzdHJlYW0sIHVzaW5nIGFuIGFiYnJldiBpZgorICAvLy8gd2UgaGF2ZSBvbmUgdG8gY29tcHJlc3MgdGhlIG91dHB1dC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KKyAgdm9pZCBFbWl0UmVjb3JkKHVuc2lnbmVkIENvZGUsIGNvbnN0IENvbnRhaW5lciAmVmFscywgdW5zaWduZWQgQWJicmV2ID0gMCkgeworICAgIGlmICghQWJicmV2KSB7CisgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFuIGFiYnJldiB0byB1c2UsIGVtaXQgdGhpcyBpbiBpdHMgZnVsbHkgdW5hYmJyZXZpYXRlZAorICAgICAgLy8gZm9ybS4KKyAgICAgIGF1dG8gQ291bnQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obWFrZUFycmF5UmVmKFZhbHMpLnNpemUoKSk7CisgICAgICBFbWl0Q29kZShiaXRjOjpVTkFCQlJFVl9SRUNPUkQpOworICAgICAgRW1pdFZCUihDb2RlLCA2KTsKKyAgICAgIEVtaXRWQlIoQ291bnQsIDYpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENvdW50OyBpICE9IGU7ICsraSkKKyAgICAgICAgRW1pdFZCUjY0KFZhbHNbaV0sIDYpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEVtaXRSZWNvcmRXaXRoQWJicmV2SW1wbChBYmJyZXYsIG1ha2VBcnJheVJlZihWYWxzKSwgU3RyaW5nUmVmKCksIENvZGUpOworICB9CisKKyAgLy8vIEVtaXRSZWNvcmRXaXRoQWJicmV2IC0gRW1pdCBhIHJlY29yZCB3aXRoIHRoZSBzcGVjaWZpZWQgYWJicmV2aWF0aW9uLgorICAvLy8gVW5saWtlIEVtaXRSZWNvcmQsIHRoZSBjb2RlIGZvciB0aGUgcmVjb3JkIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBWYWxzIGFzCisgIC8vLyB0aGUgZmlyc3QgZW50cnkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+CisgIHZvaWQgRW1pdFJlY29yZFdpdGhBYmJyZXYodW5zaWduZWQgQWJicmV2LCBjb25zdCBDb250YWluZXIgJlZhbHMpIHsKKyAgICBFbWl0UmVjb3JkV2l0aEFiYnJldkltcGwoQWJicmV2LCBtYWtlQXJyYXlSZWYoVmFscyksIFN0cmluZ1JlZigpLCBOb25lKTsKKyAgfQorCisgIC8vLyBFbWl0UmVjb3JkV2l0aEJsb2IgLSBFbWl0IHRoZSBzcGVjaWZpZWQgcmVjb3JkIHRvIHRoZSBzdHJlYW0sIHVzaW5nIGFuCisgIC8vLyBhYmJyZXYgdGhhdCBpbmNsdWRlcyBhIGJsb2IgYXQgdGhlIGVuZC4gIFRoZSBibG9iIGRhdGEgdG8gZW1pdCBpcworICAvLy8gc3BlY2lmaWVkIGJ5IHRoZSBwb2ludGVyIGFuZCBsZW5ndGggc3BlY2lmaWVkIGF0IHRoZSBlbmQuICBJbiBjb250cmFzdCB0bworICAvLy8gRW1pdFJlY29yZCwgdGhpcyByb3V0aW5lIGV4cGVjdHMgdGhhdCB0aGUgZmlyc3QgZW50cnkgaW4gVmFscyBpcyB0aGUgY29kZQorICAvLy8gb2YgdGhlIHJlY29yZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KKyAgdm9pZCBFbWl0UmVjb3JkV2l0aEJsb2IodW5zaWduZWQgQWJicmV2LCBjb25zdCBDb250YWluZXIgJlZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBCbG9iKSB7CisgICAgRW1pdFJlY29yZFdpdGhBYmJyZXZJbXBsKEFiYnJldiwgbWFrZUFycmF5UmVmKFZhbHMpLCBCbG9iLCBOb25lKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgorICB2b2lkIEVtaXRSZWNvcmRXaXRoQmxvYih1bnNpZ25lZCBBYmJyZXYsIGNvbnN0IENvbnRhaW5lciAmVmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqQmxvYkRhdGEsIHVuc2lnbmVkIEJsb2JMZW4pIHsKKyAgICByZXR1cm4gRW1pdFJlY29yZFdpdGhBYmJyZXZJbXBsKEFiYnJldiwgbWFrZUFycmF5UmVmKFZhbHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmKEJsb2JEYXRhLCBCbG9iTGVuKSwgTm9uZSk7CisgIH0KKworICAvLy8gRW1pdFJlY29yZFdpdGhBcnJheSAtIEp1c3QgbGlrZSBFbWl0UmVjb3JkV2l0aEJsb2IsIHdvcmtzIHdpdGggcmVjb3JkcworICAvLy8gdGhhdCBlbmQgd2l0aCBhbiBhcnJheS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KKyAgdm9pZCBFbWl0UmVjb3JkV2l0aEFycmF5KHVuc2lnbmVkIEFiYnJldiwgY29uc3QgQ29udGFpbmVyICZWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEFycmF5KSB7CisgICAgRW1pdFJlY29yZFdpdGhBYmJyZXZJbXBsKEFiYnJldiwgbWFrZUFycmF5UmVmKFZhbHMpLCBBcnJheSwgTm9uZSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KKyAgdm9pZCBFbWl0UmVjb3JkV2l0aEFycmF5KHVuc2lnbmVkIEFiYnJldiwgY29uc3QgQ29udGFpbmVyICZWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqQXJyYXlEYXRhLCB1bnNpZ25lZCBBcnJheUxlbikgeworICAgIHJldHVybiBFbWl0UmVjb3JkV2l0aEFiYnJldkltcGwoQWJicmV2LCBtYWtlQXJyYXlSZWYoVmFscyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYoQXJyYXlEYXRhLCBBcnJheUxlbiksIE5vbmUpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEFiYnJldiBFbWlzc2lvbgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworcHJpdmF0ZToKKyAgLy8gRW1pdCB0aGUgYWJicmV2aWF0aW9uIGFzIGEgREVGSU5FX0FCQlJFViByZWNvcmQuCisgIHZvaWQgRW5jb2RlQWJicmV2KGNvbnN0IEJpdENvZGVBYmJyZXYgJkFiYnYpIHsKKyAgICBFbWl0Q29kZShiaXRjOjpERUZJTkVfQUJCUkVWKTsKKyAgICBFbWl0VkJSKEFiYnYuZ2V0TnVtT3BlcmFuZEluZm9zKCksIDUpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oQWJidi5nZXROdW1PcGVyYW5kSW5mb3MoKSk7CisgICAgICAgICBpICE9IGU7ICsraSkgeworICAgICAgY29uc3QgQml0Q29kZUFiYnJldk9wICZPcCA9IEFiYnYuZ2V0T3BlcmFuZEluZm8oaSk7CisgICAgICBFbWl0KE9wLmlzTGl0ZXJhbCgpLCAxKTsKKyAgICAgIGlmIChPcC5pc0xpdGVyYWwoKSkgeworICAgICAgICBFbWl0VkJSNjQoT3AuZ2V0TGl0ZXJhbFZhbHVlKCksIDgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRW1pdChPcC5nZXRFbmNvZGluZygpLCAzKTsKKyAgICAgICAgaWYgKE9wLmhhc0VuY29kaW5nRGF0YSgpKQorICAgICAgICAgIEVtaXRWQlI2NChPcC5nZXRFbmNvZGluZ0RhdGEoKSwgNSk7CisgICAgICB9CisgICAgfQorICB9CitwdWJsaWM6CisKKyAgLy8vIEVtaXRBYmJyZXYgLSBUaGlzIGVtaXRzIGFuIGFiYnJldmlhdGlvbiB0byB0aGUgc3RyZWFtLiAgTm90ZSB0aGF0IHRoaXMKKyAgLy8vIG1ldGhvZCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIHNwZWNpZmllZCBhYmJyZXYuCisgIHVuc2lnbmVkIEVtaXRBYmJyZXYoc3RkOjpzaGFyZWRfcHRyPEJpdENvZGVBYmJyZXY+IEFiYnYpIHsKKyAgICAvLyBFbWl0IHRoZSBhYmJyZXZpYXRpb24gYXMgYSByZWNvcmQuCisgICAgRW5jb2RlQWJicmV2KCpBYmJ2KTsKKyAgICBDdXJBYmJyZXZzLnB1c2hfYmFjayhzdGQ6Om1vdmUoQWJidikpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oQ3VyQWJicmV2cy5zaXplKCkpLTEgKworICAgICAgYml0Yzo6RklSU1RfQVBQTElDQVRJT05fQUJCUkVWOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEJsb2NrSW5mbyBCbG9jayBFbWlzc2lvbgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gRW50ZXJCbG9ja0luZm9CbG9jayAtIFN0YXJ0IGVtaXR0aW5nIHRoZSBCTE9DS0lORk9fQkxPQ0suCisgIHZvaWQgRW50ZXJCbG9ja0luZm9CbG9jaygpIHsKKyAgICBFbnRlclN1YmJsb2NrKGJpdGM6OkJMT0NLSU5GT19CTE9DS19JRCwgMik7CisgICAgQmxvY2tJbmZvQ3VyQklEID0gfjBVOworICAgIEJsb2NrSW5mb1JlY29yZHMuY2xlYXIoKTsKKyAgfQorcHJpdmF0ZToKKyAgLy8vIFN3aXRjaFRvQmxvY2tJRCAtIElmIHdlIGFyZW4ndCBhbHJlYWR5IHRhbGtpbmcgYWJvdXQgdGhlIHNwZWNpZmllZCBibG9jaworICAvLy8gSUQsIGVtaXQgYSBCTE9DS0lORk9fQ09ERV9TRVRCSUQgcmVjb3JkLgorICB2b2lkIFN3aXRjaFRvQmxvY2tJRCh1bnNpZ25lZCBCbG9ja0lEKSB7CisgICAgaWYgKEJsb2NrSW5mb0N1ckJJRCA9PSBCbG9ja0lEKSByZXR1cm47CisgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDI+IFY7CisgICAgVi5wdXNoX2JhY2soQmxvY2tJRCk7CisgICAgRW1pdFJlY29yZChiaXRjOjpCTE9DS0lORk9fQ09ERV9TRVRCSUQsIFYpOworICAgIEJsb2NrSW5mb0N1ckJJRCA9IEJsb2NrSUQ7CisgIH0KKworICBCbG9ja0luZm8gJmdldE9yQ3JlYXRlQmxvY2tJbmZvKHVuc2lnbmVkIEJsb2NrSUQpIHsKKyAgICBpZiAoQmxvY2tJbmZvICpCSSA9IGdldEJsb2NrSW5mbyhCbG9ja0lEKSkKKyAgICAgIHJldHVybiAqQkk7CisKKyAgICAvLyBPdGhlcndpc2UsIGFkZCBhIG5ldyByZWNvcmQuCisgICAgQmxvY2tJbmZvUmVjb3Jkcy5lbXBsYWNlX2JhY2soKTsKKyAgICBCbG9ja0luZm9SZWNvcmRzLmJhY2soKS5CbG9ja0lEID0gQmxvY2tJRDsKKyAgICByZXR1cm4gQmxvY2tJbmZvUmVjb3Jkcy5iYWNrKCk7CisgIH0KKworcHVibGljOgorCisgIC8vLyBFbWl0QmxvY2tJbmZvQWJicmV2IC0gRW1pdCBhIERFRklORV9BQkJSRVYgcmVjb3JkIGZvciB0aGUgc3BlY2lmaWVkCisgIC8vLyBCbG9ja0lELgorICB1bnNpZ25lZCBFbWl0QmxvY2tJbmZvQWJicmV2KHVuc2lnbmVkIEJsb2NrSUQsIHN0ZDo6c2hhcmVkX3B0cjxCaXRDb2RlQWJicmV2PiBBYmJ2KSB7CisgICAgU3dpdGNoVG9CbG9ja0lEKEJsb2NrSUQpOworICAgIEVuY29kZUFiYnJldigqQWJidik7CisKKyAgICAvLyBBZGQgdGhlIGFiYnJldiB0byB0aGUgc3BlY2lmaWVkIGJsb2NrIHJlY29yZC4KKyAgICBCbG9ja0luZm8gJkluZm8gPSBnZXRPckNyZWF0ZUJsb2NrSW5mbyhCbG9ja0lEKTsKKyAgICBJbmZvLkFiYnJldnMucHVzaF9iYWNrKHN0ZDo6bW92ZShBYmJ2KSk7CisKKyAgICByZXR1cm4gSW5mby5BYmJyZXZzLnNpemUoKS0xK2JpdGM6OkZJUlNUX0FQUExJQ0FUSU9OX0FCQlJFVjsKKyAgfQorfTsKKworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQml0Y29kZS9MTFZNQml0Q29kZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQml0Y29kZS9MTFZNQml0Q29kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzUwMGUxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0xMVk1CaXRDb2Rlcy5oCkBAIC0wLDAgKzEsNjEzIEBACisvLz09PS0gTExWTUJpdENvZGVzLmggLSBFbnVtIHZhbHVlcyBmb3IgdGhlIExMVk0gYml0Y29kZSBmb3JtYXQgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgQml0Y29kZSBlbnVtIHZhbHVlcyBmb3IgTExWTSBJUiBiaXRjb2RlIGZpbGVzLgorLy8KKy8vIFRoZSBlbnVtIHZhbHVlcyBkZWZpbmVkIGluIHRoaXMgZmlsZSBzaG91bGQgYmUgY29uc2lkZXJlZCBwZXJtYW5lbnQuICBJZgorLy8gbmV3IGZlYXR1cmVzIGFyZSBhZGRlZCwgdGhleSBzaG91bGQgaGF2ZSB2YWx1ZXMgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUKKy8vIHJlc3BlY3RpdmUgbGlzdHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0JJVENPREVfTExWTUJJVENPREVTX0gKKyNkZWZpbmUgTExWTV9CSVRDT0RFX0xMVk1CSVRDT0RFU19ICisKKyNpbmNsdWRlICJsbHZtL0JpdGNvZGUvQml0Q29kZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGJpdGMgeworLy8gVGhlIG9ubHkgdG9wLWxldmVsIGJsb2NrIHR5cGVzIGFyZSBNT0RVTEUsIElERU5USUZJQ0FUSU9OLCBTVFJUQUIgYW5kIFNZTVRBQi4KK2VudW0gQmxvY2tJRHMgeworICAvLyBCbG9ja3MKKyAgTU9EVUxFX0JMT0NLX0lEID0gRklSU1RfQVBQTElDQVRJT05fQkxPQ0tJRCwKKworICAvLyBNb2R1bGUgc3ViLWJsb2NrIGlkJ3MuCisgIFBBUkFNQVRUUl9CTE9DS19JRCwKKyAgUEFSQU1BVFRSX0dST1VQX0JMT0NLX0lELAorCisgIENPTlNUQU5UU19CTE9DS19JRCwKKyAgRlVOQ1RJT05fQkxPQ0tfSUQsCisKKyAgLy8gQmxvY2sgaW50ZW5kZWQgdG8gY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGJpdGNvZGUgdmVyc2lvbmluZy4KKyAgLy8gQ2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgd2hlbiB3ZSBmYWlsIHRvIHBhcnNlIGEKKyAgLy8gYml0Y29kZSBmaWxlLgorICBJREVOVElGSUNBVElPTl9CTE9DS19JRCwKKworICBWQUxVRV9TWU1UQUJfQkxPQ0tfSUQsCisgIE1FVEFEQVRBX0JMT0NLX0lELAorICBNRVRBREFUQV9BVFRBQ0hNRU5UX0lELAorCisgIFRZUEVfQkxPQ0tfSURfTkVXLAorCisgIFVTRUxJU1RfQkxPQ0tfSUQsCisKKyAgTU9EVUxFX1NUUlRBQl9CTE9DS19JRCwKKyAgR0xPQkFMVkFMX1NVTU1BUllfQkxPQ0tfSUQsCisKKyAgT1BFUkFORF9CVU5ETEVfVEFHU19CTE9DS19JRCwKKworICBNRVRBREFUQV9LSU5EX0JMT0NLX0lELAorCisgIFNUUlRBQl9CTE9DS19JRCwKKworICBGVUxMX0xUT19HTE9CQUxWQUxfU1VNTUFSWV9CTE9DS19JRCwKKworICBTWU1UQUJfQkxPQ0tfSUQsCisKKyAgU1lOQ19TQ09QRV9OQU1FU19CTE9DS19JRCwKK307CisKKy8vLyBJZGVudGlmaWNhdGlvbiBibG9jayBjb250YWlucyBhIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgcHJvZHVjZXIgZGV0YWlscywKKy8vLyBhbmQgYW4gZXBvY2ggdGhhdCBkZWZpbmVzIHRoZSBhdXRvLXVwZ3JhZGUgY2FwYWJpbGl0eS4KK2VudW0gSWRlbnRpZmljYXRpb25Db2RlcyB7CisgIElERU5USUZJQ0FUSU9OX0NPREVfU1RSSU5HID0gMSwgLy8gSURFTlRJRklDQVRJT046ICAgICAgW3N0cmNociB4IE5dCisgIElERU5USUZJQ0FUSU9OX0NPREVfRVBPQ0ggPSAyLCAgLy8gRVBPQ0g6ICAgICAgICAgICAgICAgW2Vwb2NoI10KK307CisKKy8vLyBUaGUgZXBvY2ggdGhhdCBkZWZpbmVzIHRoZSBhdXRvLXVwZ3JhZGUgY29tcGF0aWJpbGl0eSBmb3IgdGhlIGJpdGNvZGUuCisvLy8KKy8vLyBMTFZNIGd1YXJhbnRlZXMgaW4gYSBtYWpvciByZWxlYXNlIHRoYXQgYSBtaW5vciByZWxlYXNlIGNhbiByZWFkIGJpdGNvZGUKKy8vLyBnZW5lcmF0ZWQgYnkgcHJldmlvdXMgbWlub3IgcmVsZWFzZXMuIFdlIHRyYW5zbGF0ZSB0aGlzIGJ5IG1ha2luZyB0aGUgcmVhZGVyCisvLy8gYWNjZXB0aW5nIG9ubHkgYml0Y29kZSB3aXRoIHRoZSBzYW1lIGVwb2NoLCBleGNlcHQgZm9yIHRoZSBYLjAgcmVsZWFzZSB3aGljaAorLy8vIGFsc28gYWNjZXB0cyBOLTEuCitlbnVtIHsgQklUQ09ERV9DVVJSRU5UX0VQT0NIID0gMCB9OworCisvLy8gTU9EVUxFIGJsb2NrcyBoYXZlIGEgbnVtYmVyIG9mIG9wdGlvbmFsIGZpZWxkcyBhbmQgc3ViYmxvY2tzLgorZW51bSBNb2R1bGVDb2RlcyB7CisgIE1PRFVMRV9DT0RFX1ZFUlNJT04gPSAxLCAgICAgLy8gVkVSU0lPTjogICAgIFt2ZXJzaW9uI10KKyAgTU9EVUxFX0NPREVfVFJJUExFID0gMiwgICAgICAvLyBUUklQTEU6ICAgICAgW3N0cmNociB4IE5dCisgIE1PRFVMRV9DT0RFX0RBVEFMQVlPVVQgPSAzLCAgLy8gREFUQUxBWU9VVDogIFtzdHJjaHIgeCBOXQorICBNT0RVTEVfQ09ERV9BU00gPSA0LCAgICAgICAgIC8vIEFTTTogICAgICAgICBbc3RyY2hyIHggTl0KKyAgTU9EVUxFX0NPREVfU0VDVElPTk5BTUUgPSA1LCAvLyBTRUNUSU9OTkFNRTogW3N0cmNociB4IE5dCisKKyAgLy8gRklYTUU6IFJlbW92ZSBERVBMSUIgaW4gNC4wLgorICBNT0RVTEVfQ09ERV9ERVBMSUIgPSA2LCAvLyBERVBMSUI6ICAgICAgW3N0cmNociB4IE5dCisKKyAgLy8gR0xPQkFMVkFSOiBbcG9pbnRlciB0eXBlLCBpc2NvbnN0LCBpbml0aWQsCisgIC8vICAgICAgICAgICAgIGxpbmthZ2UsIGFsaWdubWVudCwgc2VjdGlvbiwgdmlzaWJpbGl0eSwgdGhyZWFkbG9jYWxdCisgIE1PRFVMRV9DT0RFX0dMT0JBTFZBUiA9IDcsCisKKyAgLy8gRlVOQ1RJT046ICBbdHlwZSwgY2FsbGluZ2NvbnYsIGlzcHJvdG8sIGxpbmthZ2UsIHBhcmFtYXR0cnMsIGFsaWdubWVudCwKKyAgLy8gICAgICAgICAgICAgc2VjdGlvbiwgdmlzaWJpbGl0eSwgZ2MsIHVubmFtZWRfYWRkcl0KKyAgTU9EVUxFX0NPREVfRlVOQ1RJT04gPSA4LAorCisgIC8vIEFMSUFTOiBbYWxpYXMgdHlwZSwgYWxpYXNlZSB2YWwjLCBsaW5rYWdlLCB2aXNpYmlsaXR5XQorICBNT0RVTEVfQ09ERV9BTElBU19PTEQgPSA5LAorCisgIE1PRFVMRV9DT0RFX0dDTkFNRSA9IDExLCAvLyBHQ05BTUU6IFtzdHJjaHIgeCBOXQorICBNT0RVTEVfQ09ERV9DT01EQVQgPSAxMiwgLy8gQ09NREFUOiBbc2VsZWN0aW9uX2tpbmQsIG5hbWVdCisKKyAgTU9EVUxFX0NPREVfVlNUT0ZGU0VUID0gMTMsIC8vIFZTVE9GRlNFVDogW29mZnNldF0KKworICAvLyBBTElBUzogW2FsaWFzIHZhbHVlIHR5cGUsIGFkZHJzcGFjZSwgYWxpYXNlZSB2YWwjLCBsaW5rYWdlLCB2aXNpYmlsaXR5XQorICBNT0RVTEVfQ09ERV9BTElBUyA9IDE0LAorCisgIE1PRFVMRV9DT0RFX01FVEFEQVRBX1ZBTFVFU19VTlVTRUQgPSAxNSwKKworICAvLyBTT1VSQ0VfRklMRU5BTUU6IFtuYW1lY2hhciB4IE5dCisgIE1PRFVMRV9DT0RFX1NPVVJDRV9GSUxFTkFNRSA9IDE2LAorCisgIC8vIEhBU0g6IFs1KmkzMl0KKyAgTU9EVUxFX0NPREVfSEFTSCA9IDE3LAorCisgIC8vIElGVU5DOiBbaWZ1bmMgdmFsdWUgdHlwZSwgYWRkcnNwYWNlLCByZXNvbHZlciB2YWwjLCBsaW5rYWdlLCB2aXNpYmlsaXR5XQorICBNT0RVTEVfQ09ERV9JRlVOQyA9IDE4LAorfTsKKworLy8vIFBBUkFNQVRUUiBibG9ja3MgaGF2ZSBjb2RlIGZvciBkZWZpbmluZyBhIHBhcmFtZXRlciBhdHRyaWJ1dGUgc2V0LgorZW51bSBBdHRyaWJ1dGVDb2RlcyB7CisgIC8vIEZJWE1FOiBSZW1vdmUgYFBBUkFNQVRUUl9DT0RFX0VOVFJZX09MRCcgaW4gNC4wCisgIFBBUkFNQVRUUl9DT0RFX0VOVFJZX09MRCA9IDEsIC8vIEVOVFJZOiBbcGFyYW1pZHgwLCBhdHRyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBwYXJhbWlkeDEsIGF0dHIxLi4uXQorICBQQVJBTUFUVFJfQ09ERV9FTlRSWSA9IDIsICAgICAvLyBFTlRSWTogW2F0dHJncnAwLCBhdHRyZ3JwMSwgLi4uXQorICBQQVJBTUFUVFJfR1JQX0NPREVfRU5UUlkgPSAzICAvLyBFTlRSWTogW2dycGlkLCBpZHgsIGF0dHIwLCBhdHRyMSwgLi4uXQorfTsKKworLy8vIFRZUEUgYmxvY2tzIGhhdmUgY29kZXMgZm9yIGVhY2ggdHlwZSBwcmltaXRpdmUgdGhleSB1c2UuCitlbnVtIFR5cGVDb2RlcyB7CisgIFRZUEVfQ09ERV9OVU1FTlRSWSA9IDEsIC8vIE5VTUVOVFJZOiBbbnVtZW50cmllc10KKworICAvLyBUeXBlIENvZGVzCisgIFRZUEVfQ09ERV9WT0lEID0gMiwgICAgLy8gVk9JRAorICBUWVBFX0NPREVfRkxPQVQgPSAzLCAgIC8vIEZMT0FUCisgIFRZUEVfQ09ERV9ET1VCTEUgPSA0LCAgLy8gRE9VQkxFCisgIFRZUEVfQ09ERV9MQUJFTCA9IDUsICAgLy8gTEFCRUwKKyAgVFlQRV9DT0RFX09QQVFVRSA9IDYsICAvLyBPUEFRVUUKKyAgVFlQRV9DT0RFX0lOVEVHRVIgPSA3LCAvLyBJTlRFR0VSOiBbd2lkdGhdCisgIFRZUEVfQ09ERV9QT0lOVEVSID0gOCwgLy8gUE9JTlRFUjogW3BvaW50ZWUgdHlwZV0KKworICBUWVBFX0NPREVfRlVOQ1RJT05fT0xEID0gOSwgLy8gRlVOQ1RJT046IFt2YXJhcmcsIGF0dHJpZCwgcmV0dHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIHBhcmFtdHkgeCBOXQorCisgIFRZUEVfQ09ERV9IQUxGID0gMTAsIC8vIEhBTEYKKworICBUWVBFX0NPREVfQVJSQVkgPSAxMSwgIC8vIEFSUkFZOiBbbnVtZWx0cywgZWx0dHldCisgIFRZUEVfQ09ERV9WRUNUT1IgPSAxMiwgLy8gVkVDVE9SOiBbbnVtZWx0cywgZWx0dHldCisKKyAgLy8gVGhlc2UgYXJlIG5vdCB3aXRoIHRoZSBvdGhlciBmbG9hdGluZyBwb2ludCB0eXBlcyBiZWNhdXNlIHRoZXkncmUKKyAgLy8gYSBsYXRlIGFkZGl0aW9uLCBhbmQgcHV0dGluZyB0aGVtIGluIHRoZSByaWdodCBwbGFjZSBicmVha3MKKyAgLy8gYmluYXJ5IGNvbXBhdGliaWxpdHkuCisgIFRZUEVfQ09ERV9YODZfRlA4MCA9IDEzLCAgLy8gWDg2IExPTkcgRE9VQkxFCisgIFRZUEVfQ09ERV9GUDEyOCA9IDE0LCAgICAgLy8gTE9ORyBET1VCTEUgKDExMiBiaXQgbWFudGlzc2EpCisgIFRZUEVfQ09ERV9QUENfRlAxMjggPSAxNSwgLy8gUFBDIExPTkcgRE9VQkxFICgyIGRvdWJsZXMpCisKKyAgVFlQRV9DT0RFX01FVEFEQVRBID0gMTYsIC8vIE1FVEFEQVRBCisKKyAgVFlQRV9DT0RFX1g4Nl9NTVggPSAxNywgLy8gWDg2IE1NWAorCisgIFRZUEVfQ09ERV9TVFJVQ1RfQU5PTiA9IDE4LCAgLy8gU1RSVUNUX0FOT046IFtpc3BhY2tlZCwgZWx0dHkgeCBOXQorICBUWVBFX0NPREVfU1RSVUNUX05BTUUgPSAxOSwgIC8vIFNUUlVDVF9OQU1FOiBbc3RyY2hyIHggTl0KKyAgVFlQRV9DT0RFX1NUUlVDVF9OQU1FRCA9IDIwLCAvLyBTVFJVQ1RfTkFNRUQ6IFtpc3BhY2tlZCwgZWx0dHkgeCBOXQorCisgIFRZUEVfQ09ERV9GVU5DVElPTiA9IDIxLCAvLyBGVU5DVElPTjogW3ZhcmFyZywgcmV0dHksIHBhcmFtdHkgeCBOXQorCisgIFRZUEVfQ09ERV9UT0tFTiA9IDIyIC8vIFRPS0VOCit9OworCitlbnVtIE9wZXJhbmRCdW5kbGVUYWdDb2RlIHsKKyAgT1BFUkFORF9CVU5ETEVfVEFHID0gMSwgLy8gVEFHOiBbc3RyY2hyIHggTl0KK307CisKK2VudW0gU3luY1Njb3BlTmFtZUNvZGUgeworICBTWU5DX1NDT1BFX05BTUUgPSAxLAorfTsKKworLy8gVmFsdWUgc3ltYm9sIHRhYmxlIGNvZGVzLgorZW51bSBWYWx1ZVN5bXRhYkNvZGVzIHsKKyAgVlNUX0NPREVfRU5UUlkgPSAxLCAgIC8vIFZTVF9FTlRSWTogW3ZhbHVlaWQsIG5hbWVjaGFyIHggTl0KKyAgVlNUX0NPREVfQkJFTlRSWSA9IDIsIC8vIFZTVF9CQkVOVFJZOiBbYmJpZCwgbmFtZWNoYXIgeCBOXQorICBWU1RfQ09ERV9GTkVOVFJZID0gMywgLy8gVlNUX0ZORU5UUlk6IFt2YWx1ZWlkLCBvZmZzZXQsIG5hbWVjaGFyIHggTl0KKyAgLy8gVlNUX0NPTUJJTkVEX0VOVFJZOiBbdmFsdWVpZCwgcmVmZ3VpZF0KKyAgVlNUX0NPREVfQ09NQklORURfRU5UUlkgPSA1Cit9OworCisvLyBUaGUgbW9kdWxlIHBhdGggc3ltYm9sIHRhYmxlIG9ubHkgaGFzIG9uZSBjb2RlIChNU1RfQ09ERV9FTlRSWSkuCitlbnVtIE1vZHVsZVBhdGhTeW10YWJDb2RlcyB7CisgIE1TVF9DT0RFX0VOVFJZID0gMSwgLy8gTVNUX0VOVFJZOiBbbW9kaWQsIG5hbWVjaGFyIHggTl0KKyAgTVNUX0NPREVfSEFTSCA9IDIsICAvLyBNU1RfSEFTSDogIFs1KmkzMl0KK307CisKKy8vIFRoZSBzdW1tYXJ5IHNlY3Rpb24gdXNlcyBkaWZmZXJlbnQgY29kZXMgaW4gdGhlIHBlci1tb2R1bGUKKy8vIGFuZCBjb21iaW5lZCBpbmRleCBjYXNlcy4KK2VudW0gR2xvYmFsVmFsdWVTdW1tYXJ5U3ltdGFiQ29kZXMgeworICAvLyBQRVJNT0RVTEU6IFt2YWx1ZWlkLCBmbGFncywgaW5zdGNvdW50LCBudW1yZWZzLCBudW1yZWZzIHggdmFsdWVpZCwKKyAgLy8gICAgICAgICAgICAgbiB4ICh2YWx1ZWlkKV0KKyAgRlNfUEVSTU9EVUxFID0gMSwKKyAgLy8gUEVSTU9EVUxFX1BST0ZJTEU6IFt2YWx1ZWlkLCBmbGFncywgaW5zdGNvdW50LCBudW1yZWZzLAorICAvLyAgICAgICAgICAgICAgICAgICAgIG51bXJlZnMgeCB2YWx1ZWlkLAorICAvLyAgICAgICAgICAgICAgICAgICAgIG4geCAodmFsdWVpZCwgaG90bmVzcyldCisgIEZTX1BFUk1PRFVMRV9QUk9GSUxFID0gMiwKKyAgLy8gUEVSTU9EVUxFX0dMT0JBTFZBUl9JTklUX1JFRlM6IFt2YWx1ZWlkLCBmbGFncywgbiB4IHZhbHVlaWRdCisgIEZTX1BFUk1PRFVMRV9HTE9CQUxWQVJfSU5JVF9SRUZTID0gMywKKyAgLy8gQ09NQklORUQ6IFt2YWx1ZWlkLCBtb2RpZCwgZmxhZ3MsIGluc3Rjb3VudCwgbnVtcmVmcywgbnVtcmVmcyB4IHZhbHVlaWQsCisgIC8vICAgICAgICAgICAgbiB4ICh2YWx1ZWlkKV0KKyAgRlNfQ09NQklORUQgPSA0LAorICAvLyBDT01CSU5FRF9QUk9GSUxFOiBbdmFsdWVpZCwgbW9kaWQsIGZsYWdzLCBpbnN0Y291bnQsIG51bXJlZnMsCisgIC8vICAgICAgICAgICAgICAgICAgICBudW1yZWZzIHggdmFsdWVpZCwKKyAgLy8gICAgICAgICAgICAgICAgICAgIG4geCAodmFsdWVpZCwgaG90bmVzcyldCisgIEZTX0NPTUJJTkVEX1BST0ZJTEUgPSA1LAorICAvLyBDT01CSU5FRF9HTE9CQUxWQVJfSU5JVF9SRUZTOiBbdmFsdWVpZCwgbW9kaWQsIGZsYWdzLCBuIHggdmFsdWVpZF0KKyAgRlNfQ09NQklORURfR0xPQkFMVkFSX0lOSVRfUkVGUyA9IDYsCisgIC8vIEFMSUFTOiBbdmFsdWVpZCwgZmxhZ3MsIHZhbHVlaWRdCisgIEZTX0FMSUFTID0gNywKKyAgLy8gQ09NQklORURfQUxJQVM6IFt2YWx1ZWlkLCBtb2RpZCwgZmxhZ3MsIHZhbHVlaWRdCisgIEZTX0NPTUJJTkVEX0FMSUFTID0gOCwKKyAgLy8gQ09NQklORURfT1JJR0lOQUxfTkFNRTogW29yaWdpbmFsX25hbWVfaGFzaF0KKyAgRlNfQ09NQklORURfT1JJR0lOQUxfTkFNRSA9IDksCisgIC8vIFZFUlNJT04gb2YgdGhlIHN1bW1hcnksIGJ1bXBlZCB3aGVuIGFkZGluZyBmbGFncyBmb3IgaW5zdGFuY2UuCisgIEZTX1ZFUlNJT04gPSAxMCwKKyAgLy8gVGhlIGxpc3Qgb2YgbGx2bS50eXBlLnRlc3QgdHlwZSBpZGVudGlmaWVycyB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24KKyAgLy8gdGhhdCBhcmUgdXNlZCBvdGhlciB0aGFuIGJ5IGFuIGxsdm0uYXNzdW1lLgorICAvLyBbbiB4IHR5cGVpZF0KKyAgRlNfVFlQRV9URVNUUyA9IDExLAorICAvLyBUaGUgbGlzdCBvZiB2aXJ0dWFsIGNhbGxzIG1hZGUgYnkgdGhpcyBmdW5jdGlvbiB1c2luZworICAvLyBsbHZtLmFzc3VtZShsbHZtLnR5cGUudGVzdCkgaW50cmluc2ljcyB0aGF0IGRvIG5vdCBoYXZlIGFsbCBjb25zdGFudAorICAvLyBpbnRlZ2VyIGFyZ3VtZW50cy4KKyAgLy8gW24geCAodHlwZWlkLCBvZmZzZXQpXQorICBGU19UWVBFX1RFU1RfQVNTVU1FX1ZDQUxMUyA9IDEyLAorICAvLyBUaGUgbGlzdCBvZiB2aXJ0dWFsIGNhbGxzIG1hZGUgYnkgdGhpcyBmdW5jdGlvbiB1c2luZworICAvLyBsbHZtLnR5cGUuY2hlY2tlZC5sb2FkIGludHJpbnNpY3MgdGhhdCBkbyBub3QgaGF2ZSBhbGwgY29uc3RhbnQgaW50ZWdlcgorICAvLyBhcmd1bWVudHMuCisgIC8vIFtuIHggKHR5cGVpZCwgb2Zmc2V0KV0KKyAgRlNfVFlQRV9DSEVDS0VEX0xPQURfVkNBTExTID0gMTMsCisgIC8vIElkZW50aWZpZXMgYSB2aXJ0dWFsIGNhbGwgbWFkZSBieSB0aGlzIGZ1bmN0aW9uIHVzaW5nIGFuCisgIC8vIGxsdm0uYXNzdW1lKGxsdm0udHlwZS50ZXN0KSBpbnRyaW5zaWMgd2l0aCBhbGwgY29uc3RhbnQgaW50ZWdlciBhcmd1bWVudHMuCisgIC8vIFt0eXBlaWQsIG9mZnNldCwgbiB4IGFyZ10KKyAgRlNfVFlQRV9URVNUX0FTU1VNRV9DT05TVF9WQ0FMTCA9IDE0LAorICAvLyBJZGVudGlmaWVzIGEgdmlydHVhbCBjYWxsIG1hZGUgYnkgdGhpcyBmdW5jdGlvbiB1c2luZyBhbgorICAvLyBsbHZtLnR5cGUuY2hlY2tlZC5sb2FkIGludHJpbnNpYyB3aXRoIGFsbCBjb25zdGFudCBpbnRlZ2VyIGFyZ3VtZW50cy4KKyAgLy8gW3R5cGVpZCwgb2Zmc2V0LCBuIHggYXJnXQorICBGU19UWVBFX0NIRUNLRURfTE9BRF9DT05TVF9WQ0FMTCA9IDE1LAorICAvLyBBc3NpZ25zIGEgR1VJRCB0byBhIHZhbHVlIElELiBUaGlzIG5vcm1hbGx5IGFwcGVhcnMgb25seSBpbiBjb21iaW5lZAorICAvLyBzdW1tYXJpZXMsIGJ1dCBpdCBjYW4gYWxzbyBhcHBlYXIgaW4gcGVyLW1vZHVsZSBzdW1tYXJpZXMgZm9yIFBHTyBkYXRhLgorICAvLyBbdmFsdWVpZCwgZ3VpZF0KKyAgRlNfVkFMVUVfR1VJRCA9IDE2LAorICAvLyBUaGUgbGlzdCBvZiBsb2NhbCBmdW5jdGlvbnMgd2l0aCBDRkkganVtcCB0YWJsZXMuIEZ1bmN0aW9uIG5hbWVzIGFyZQorICAvLyBzdHJpbmdzIGluIHN0cnRhYi4KKyAgLy8gW24gKiBuYW1lXQorICBGU19DRklfRlVOQ1RJT05fREVGUyA9IDE3LAorICAvLyBUaGUgbGlzdCBvZiBleHRlcm5hbCBmdW5jdGlvbnMgd2l0aCBDRkkganVtcCB0YWJsZXMuIEZ1bmN0aW9uIG5hbWVzIGFyZQorICAvLyBzdHJpbmdzIGluIHN0cnRhYi4KKyAgLy8gW24gKiBuYW1lXQorICBGU19DRklfRlVOQ1RJT05fREVDTFMgPSAxOCwKKyAgLy8gUGVyLW1vZHVsZSBzdW1tYXJ5IHRoYXQgYWxzbyBhZGRzIHJlbGF0aXZlIGJsb2NrIGZyZXF1ZW5jeSB0byBjYWxsZWUgaW5mby4KKyAgLy8gUEVSTU9EVUxFX1JFTEJGOiBbdmFsdWVpZCwgZmxhZ3MsIGluc3Rjb3VudCwgbnVtcmVmcywKKyAgLy8gICAgICAgICAgICAgICAgICAgbnVtcmVmcyB4IHZhbHVlaWQsCisgIC8vICAgICAgICAgICAgICAgICAgIG4geCAodmFsdWVpZCwgcmVsYmxvY2tmcmVxKV0KKyAgRlNfUEVSTU9EVUxFX1JFTEJGID0gMTksCisgIC8vIEluZGV4LXdpZGUgZmxhZ3MKKyAgRlNfRkxBR1MgPSAyMCwKKyAgLy8gTWFwcyB0eXBlIGlkZW50aWZpZXIgdG8gc3VtbWFyeSBpbmZvcm1hdGlvbiBmb3IgdGhhdCB0eXBlIGlkZW50aWZpZXIuCisgIC8vIFRZUEVfSUQ6IFt0eXBlaWQsIGtpbmQsIGJpdHdpZHRoLCBhbGlnbiwgc2l6ZSwgYml0bWFzaywgaW5saW5lYml0cywKKyAgLy8gICAgICAgICAgIG4geCAodHlwZWlkLCBraW5kLCBuYW1lLCBudW1yYmEsCisgIC8vICAgICAgICAgICAgICAgIG51bXJiYSB4IChudW1hcmcsIG51bWFyZyB4IGFyZywga2luZCwgaW5mbywgYnl0ZSwgYml0KSldCisgIEZTX1RZUEVfSUQgPSAyMSwKK307CisKK2VudW0gTWV0YWRhdGFDb2RlcyB7CisgIE1FVEFEQVRBX1NUUklOR19PTEQgPSAxLCAgICAgLy8gTURTVFJJTkc6ICAgICAgW3ZhbHVlc10KKyAgTUVUQURBVEFfVkFMVUUgPSAyLCAgICAgICAgICAvLyBWQUxVRTogICAgICAgICBbdHlwZSBudW0sIHZhbHVlIG51bV0KKyAgTUVUQURBVEFfTk9ERSA9IDMsICAgICAgICAgICAvLyBOT0RFOiAgICAgICAgICBbbiB4IG1kIG51bV0KKyAgTUVUQURBVEFfTkFNRSA9IDQsICAgICAgICAgICAvLyBTVFJJTkc6ICAgICAgICBbdmFsdWVzXQorICBNRVRBREFUQV9ESVNUSU5DVF9OT0RFID0gNSwgIC8vIERJU1RJTkNUX05PREU6IFtuIHggbWQgbnVtXQorICBNRVRBREFUQV9LSU5EID0gNiwgICAgICAgICAgIC8vIFtuIHggW2lkLCBuYW1lXV0KKyAgTUVUQURBVEFfTE9DQVRJT04gPSA3LCAgICAgICAvLyBbZGlzdGluY3QsIGxpbmUsIGNvbCwgc2NvcGUsIGlubGluZWQtYXQ/XQorICBNRVRBREFUQV9PTERfTk9ERSA9IDgsICAgICAgIC8vIE9MRF9OT0RFOiAgICAgIFtuIHggKHR5cGUgbnVtLCB2YWx1ZSBudW0pXQorICBNRVRBREFUQV9PTERfRk5fTk9ERSA9IDksICAgIC8vIE9MRF9GTl9OT0RFOiAgIFtuIHggKHR5cGUgbnVtLCB2YWx1ZSBudW0pXQorICBNRVRBREFUQV9OQU1FRF9OT0RFID0gMTAsICAgIC8vIE5BTUVEX05PREU6ICAgIFtuIHggbWRub2Rlc10KKyAgTUVUQURBVEFfQVRUQUNITUVOVCA9IDExLCAgICAvLyBbbSB4IFt2YWx1ZSwgW24geCBbaWQsIG1kbm9kZV1dXQorICBNRVRBREFUQV9HRU5FUklDX0RFQlVHID0gMTIsIC8vIFtkaXN0aW5jdCwgdGFnLCB2ZXJzLCBoZWFkZXIsIG4geCBtZCBudW1dCisgIE1FVEFEQVRBX1NVQlJBTkdFID0gMTMsICAgICAgLy8gW2Rpc3RpbmN0LCBjb3VudCwgbG9dCisgIE1FVEFEQVRBX0VOVU1FUkFUT1IgPSAxNCwgICAgLy8gW2lzVW5zaWduZWR8ZGlzdGluY3QsIHZhbHVlLCBuYW1lXQorICBNRVRBREFUQV9CQVNJQ19UWVBFID0gMTUsICAgIC8vIFtkaXN0aW5jdCwgdGFnLCBuYW1lLCBzaXplLCBhbGlnbiwgZW5jXQorICBNRVRBREFUQV9GSUxFID0gMTYsIC8vIFtkaXN0aW5jdCwgZmlsZW5hbWUsIGRpcmVjdG9yeSwgY2hlY2tzdW1raW5kLCBjaGVja3N1bV0KKyAgTUVUQURBVEFfREVSSVZFRF9UWVBFID0gMTcsICAgICAgIC8vIFtkaXN0aW5jdCwgLi4uXQorICBNRVRBREFUQV9DT01QT1NJVEVfVFlQRSA9IDE4LCAgICAgLy8gW2Rpc3RpbmN0LCAuLi5dCisgIE1FVEFEQVRBX1NVQlJPVVRJTkVfVFlQRSA9IDE5LCAgICAvLyBbZGlzdGluY3QsIGZsYWdzLCB0eXBlcywgY2NdCisgIE1FVEFEQVRBX0NPTVBJTEVfVU5JVCA9IDIwLCAgICAgICAvLyBbZGlzdGluY3QsIC4uLl0KKyAgTUVUQURBVEFfU1VCUFJPR1JBTSA9IDIxLCAgICAgICAgIC8vIFtkaXN0aW5jdCwgLi4uXQorICBNRVRBREFUQV9MRVhJQ0FMX0JMT0NLID0gMjIsICAgICAgLy8gW2Rpc3RpbmN0LCBzY29wZSwgZmlsZSwgbGluZSwgY29sdW1uXQorICBNRVRBREFUQV9MRVhJQ0FMX0JMT0NLX0ZJTEUgPSAyMywgLy9bZGlzdGluY3QsIHNjb3BlLCBmaWxlLCBkaXNjcmltaW5hdG9yXQorICBNRVRBREFUQV9OQU1FU1BBQ0UgPSAyNCwgLy8gW2Rpc3RpbmN0LCBzY29wZSwgZmlsZSwgbmFtZSwgbGluZSwgZXhwb3J0U3ltYm9sc10KKyAgTUVUQURBVEFfVEVNUExBVEVfVFlQRSA9IDI1LCAgIC8vIFtkaXN0aW5jdCwgc2NvcGUsIG5hbWUsIHR5cGUsIC4uLl0KKyAgTUVUQURBVEFfVEVNUExBVEVfVkFMVUUgPSAyNiwgIC8vIFtkaXN0aW5jdCwgc2NvcGUsIG5hbWUsIHR5cGUsIHZhbHVlLCAuLi5dCisgIE1FVEFEQVRBX0dMT0JBTF9WQVIgPSAyNywgICAgICAvLyBbZGlzdGluY3QsIC4uLl0KKyAgTUVUQURBVEFfTE9DQUxfVkFSID0gMjgsICAgICAgIC8vIFtkaXN0aW5jdCwgLi4uXQorICBNRVRBREFUQV9FWFBSRVNTSU9OID0gMjksICAgICAgLy8gW2Rpc3RpbmN0LCBuIHggZWxlbWVudF0KKyAgTUVUQURBVEFfT0JKQ19QUk9QRVJUWSA9IDMwLCAgIC8vIFtkaXN0aW5jdCwgbmFtZSwgZmlsZSwgbGluZSwgLi4uXQorICBNRVRBREFUQV9JTVBPUlRFRF9FTlRJVFkgPSAzMSwgLy8gW2Rpc3RpbmN0LCB0YWcsIHNjb3BlLCBlbnRpdHksIGxpbmUsIG5hbWVdCisgIE1FVEFEQVRBX01PRFVMRSA9IDMyLCAgICAgICAgICAvLyBbZGlzdGluY3QsIHNjb3BlLCBuYW1lLCAuLi5dCisgIE1FVEFEQVRBX01BQ1JPID0gMzMsICAgICAgICAgICAvLyBbZGlzdGluY3QsIG1hY2luZm8sIGxpbmUsIG5hbWUsIHZhbHVlXQorICBNRVRBREFUQV9NQUNST19GSUxFID0gMzQsICAgICAgLy8gW2Rpc3RpbmN0LCBtYWNpbmZvLCBsaW5lLCBmaWxlLCAuLi5dCisgIE1FVEFEQVRBX1NUUklOR1MgPSAzNSwgICAgICAgICAvLyBbY291bnQsIG9mZnNldF0gYmxvYihbbGVuZ3Roc11bY2hhcnNdKQorICBNRVRBREFUQV9HTE9CQUxfREVDTF9BVFRBQ0hNRU5UID0gMzYsIC8vIFt2YWx1ZWlkLCBuIHggW2lkLCBtZG5vZGVdXQorICBNRVRBREFUQV9HTE9CQUxfVkFSX0VYUFIgPSAzNywgICAgICAgIC8vIFtkaXN0aW5jdCwgdmFyLCBleHByXQorICBNRVRBREFUQV9JTkRFWF9PRkZTRVQgPSAzOCwgICAgICAgICAgIC8vIFtvZmZzZXRdCisgIE1FVEFEQVRBX0lOREVYID0gMzksICAgICAgICAgICAgICAgICAgLy8gW2JpdHBvc10KK307CisKKy8vIFRoZSBjb25zdGFudHMgYmxvY2sgKENPTlNUQU5UU19CTE9DS19JRCkgZGVzY3JpYmVzIGVtaXNzaW9uIGZvciBlYWNoCisvLyBjb25zdGFudCBhbmQgbWFpbnRhaW5zIGFuIGltcGxpY2l0IGN1cnJlbnQgdHlwZSB2YWx1ZS4KK2VudW0gQ29uc3RhbnRzQ29kZXMgeworICBDU1RfQ09ERV9TRVRUWVBFID0gMSwgICAgICAgICAgLy8gU0VUVFlQRTogICAgICAgW3R5cGVpZF0KKyAgQ1NUX0NPREVfTlVMTCA9IDIsICAgICAgICAgICAgIC8vIE5VTEwKKyAgQ1NUX0NPREVfVU5ERUYgPSAzLCAgICAgICAgICAgIC8vIFVOREVGCisgIENTVF9DT0RFX0lOVEVHRVIgPSA0LCAgICAgICAgICAvLyBJTlRFR0VSOiAgICAgICBbaW50dmFsXQorICBDU1RfQ09ERV9XSURFX0lOVEVHRVIgPSA1LCAgICAgLy8gV0lERV9JTlRFR0VSOiAgW24geCBpbnR2YWxdCisgIENTVF9DT0RFX0ZMT0FUID0gNiwgICAgICAgICAgICAvLyBGTE9BVDogICAgICAgICBbZnB2YWxdCisgIENTVF9DT0RFX0FHR1JFR0FURSA9IDcsICAgICAgICAvLyBBR0dSRUdBVEU6ICAgICBbbiB4IHZhbHVlIG51bWJlcl0KKyAgQ1NUX0NPREVfU1RSSU5HID0gOCwgICAgICAgICAgIC8vIFNUUklORzogICAgICAgIFt2YWx1ZXNdCisgIENTVF9DT0RFX0NTVFJJTkcgPSA5LCAgICAgICAgICAvLyBDU1RSSU5HOiAgICAgICBbdmFsdWVzXQorICBDU1RfQ09ERV9DRV9CSU5PUCA9IDEwLCAgICAgICAgLy8gQ0VfQklOT1A6ICAgICAgW29wY29kZSwgb3B2YWwsIG9wdmFsXQorICBDU1RfQ09ERV9DRV9DQVNUID0gMTEsICAgICAgICAgLy8gQ0VfQ0FTVDogICAgICAgW29wY29kZSwgb3B0eSwgb3B2YWxdCisgIENTVF9DT0RFX0NFX0dFUCA9IDEyLCAgICAgICAgICAvLyBDRV9HRVA6ICAgICAgICBbbiB4IG9wZXJhbmRzXQorICBDU1RfQ09ERV9DRV9TRUxFQ1QgPSAxMywgICAgICAgLy8gQ0VfU0VMRUNUOiAgICAgW29wdmFsLCBvcHZhbCwgb3B2YWxdCisgIENTVF9DT0RFX0NFX0VYVFJBQ1RFTFQgPSAxNCwgICAvLyBDRV9FWFRSQUNURUxUOiBbb3B0eSwgb3B2YWwsIG9wdmFsXQorICBDU1RfQ09ERV9DRV9JTlNFUlRFTFQgPSAxNSwgICAgLy8gQ0VfSU5TRVJURUxUOiAgW29wdmFsLCBvcHZhbCwgb3B2YWxdCisgIENTVF9DT0RFX0NFX1NIVUZGTEVWRUMgPSAxNiwgICAvLyBDRV9TSFVGRkxFVkVDOiBbb3B2YWwsIG9wdmFsLCBvcHZhbF0KKyAgQ1NUX0NPREVfQ0VfQ01QID0gMTcsICAgICAgICAgIC8vIENFX0NNUDogICAgICAgIFtvcHR5LCBvcHZhbCwgb3B2YWwsIHByZWRdCisgIENTVF9DT0RFX0lOTElORUFTTV9PTEQgPSAxOCwgICAvLyBJTkxJTkVBU006ICAgICBbc2lkZWVmZmVjdHxhbGlnbnN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIGFzbXN0cixjb25zdHN0cl0KKyAgQ1NUX0NPREVfQ0VfU0hVRlZFQ19FWCA9IDE5LCAgIC8vIFNIVUZWRUNfRVg6ICAgIFtvcHR5LCBvcHZhbCwgb3B2YWwsIG9wdmFsXQorICBDU1RfQ09ERV9DRV9JTkJPVU5EU19HRVAgPSAyMCwgLy8gSU5CT1VORFNfR0VQOiAgW24geCBvcGVyYW5kc10KKyAgQ1NUX0NPREVfQkxPQ0tBRERSRVNTID0gMjEsICAgIC8vIENTVF9DT0RFX0JMT0NLQUREUkVTUyBbZm50eSwgZm52YWwsIGJiI10KKyAgQ1NUX0NPREVfREFUQSA9IDIyLCAgICAgICAgICAgIC8vIERBVEE6ICAgICAgICAgIFtuIHggZWxlbWVudHNdCisgIENTVF9DT0RFX0lOTElORUFTTSA9IDIzLCAgICAgICAvLyBJTkxJTkVBU006ICAgICBbc2lkZWVmZmVjdHxhbGlnbnN0YWNrfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIGFzbWRpYWxlY3QsYXNtc3RyLGNvbnN0c3RyXQorICBDU1RfQ09ERV9DRV9HRVBfV0lUSF9JTlJBTkdFX0lOREVYID0gMjQsIC8vICAgICAgW29wdHksIGZsYWdzLCBuIHggb3BlcmFuZHNdCit9OworCisvLy8gQ2FzdE9wY29kZXMgLSBUaGVzZSBhcmUgdmFsdWVzIHVzZWQgaW4gdGhlIGJpdGNvZGUgZmlsZXMgdG8gZW5jb2RlIHdoaWNoCisvLy8gY2FzdCBhIENTVF9DT0RFX0NFX0NBU1Qgb3IgYSBYWFggcmVmZXJzIHRvLiAgVGhlIHZhbHVlcyBvZiB0aGVzZSBlbnVtcworLy8vIGhhdmUgbm8gZml4ZWQgcmVsYXRpb24gdG8gdGhlIExMVk0gSVIgZW51bSB2YWx1ZXMuICBDaGFuZ2luZyB0aGVzZSB3aWxsCisvLy8gYnJlYWsgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBmaWxlcy4KK2VudW0gQ2FzdE9wY29kZXMgeworICBDQVNUX1RSVU5DID0gMCwKKyAgQ0FTVF9aRVhUID0gMSwKKyAgQ0FTVF9TRVhUID0gMiwKKyAgQ0FTVF9GUFRPVUkgPSAzLAorICBDQVNUX0ZQVE9TSSA9IDQsCisgIENBU1RfVUlUT0ZQID0gNSwKKyAgQ0FTVF9TSVRPRlAgPSA2LAorICBDQVNUX0ZQVFJVTkMgPSA3LAorICBDQVNUX0ZQRVhUID0gOCwKKyAgQ0FTVF9QVFJUT0lOVCA9IDksCisgIENBU1RfSU5UVE9QVFIgPSAxMCwKKyAgQ0FTVF9CSVRDQVNUID0gMTEsCisgIENBU1RfQUREUlNQQUNFQ0FTVCA9IDEyCit9OworCisvLy8gQmluYXJ5T3Bjb2RlcyAtIFRoZXNlIGFyZSB2YWx1ZXMgdXNlZCBpbiB0aGUgYml0Y29kZSBmaWxlcyB0byBlbmNvZGUgd2hpY2gKKy8vLyBiaW5vcCBhIENTVF9DT0RFX0NFX0JJTk9QIG9yIGEgWFhYIHJlZmVycyB0by4gIFRoZSB2YWx1ZXMgb2YgdGhlc2UgZW51bXMKKy8vLyBoYXZlIG5vIGZpeGVkIHJlbGF0aW9uIHRvIHRoZSBMTFZNIElSIGVudW0gdmFsdWVzLiAgQ2hhbmdpbmcgdGhlc2Ugd2lsbAorLy8vIGJyZWFrIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgZmlsZXMuCitlbnVtIEJpbmFyeU9wY29kZXMgeworICBCSU5PUF9BREQgPSAwLAorICBCSU5PUF9TVUIgPSAxLAorICBCSU5PUF9NVUwgPSAyLAorICBCSU5PUF9VRElWID0gMywKKyAgQklOT1BfU0RJViA9IDQsIC8vIG92ZXJsb2FkZWQgZm9yIEZQCisgIEJJTk9QX1VSRU0gPSA1LAorICBCSU5PUF9TUkVNID0gNiwgLy8gb3ZlcmxvYWRlZCBmb3IgRlAKKyAgQklOT1BfU0hMID0gNywKKyAgQklOT1BfTFNIUiA9IDgsCisgIEJJTk9QX0FTSFIgPSA5LAorICBCSU5PUF9BTkQgPSAxMCwKKyAgQklOT1BfT1IgPSAxMSwKKyAgQklOT1BfWE9SID0gMTIKK307CisKKy8vLyBUaGVzZSBhcmUgdmFsdWVzIHVzZWQgaW4gdGhlIGJpdGNvZGUgZmlsZXMgdG8gZW5jb2RlIEF0b21pY1JNVyBvcGVyYXRpb25zLgorLy8vIFRoZSB2YWx1ZXMgb2YgdGhlc2UgZW51bXMgaGF2ZSBubyBmaXhlZCByZWxhdGlvbiB0byB0aGUgTExWTSBJUiBlbnVtCisvLy8gdmFsdWVzLiAgQ2hhbmdpbmcgdGhlc2Ugd2lsbCBicmVhayBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGZpbGVzLgorZW51bSBSTVdPcGVyYXRpb25zIHsKKyAgUk1XX1hDSEcgPSAwLAorICBSTVdfQUREID0gMSwKKyAgUk1XX1NVQiA9IDIsCisgIFJNV19BTkQgPSAzLAorICBSTVdfTkFORCA9IDQsCisgIFJNV19PUiA9IDUsCisgIFJNV19YT1IgPSA2LAorICBSTVdfTUFYID0gNywKKyAgUk1XX01JTiA9IDgsCisgIFJNV19VTUFYID0gOSwKKyAgUk1XX1VNSU4gPSAxMAorfTsKKworLy8vIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3JPcHRpb25hbEZsYWdzIC0gRmxhZ3MgZm9yIHNlcmlhbGl6aW5nCisvLy8gT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvcidzIFN1YmNsYXNzT3B0aW9uYWxEYXRhIGNvbnRlbnRzLgorZW51bSBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yT3B0aW9uYWxGbGFncyB7CisgIE9CT19OT19VTlNJR05FRF9XUkFQID0gMCwKKyAgT0JPX05PX1NJR05FRF9XUkFQID0gMQorfTsKKworLy8vIEZhc3RNYXRoIEZsYWdzCisvLy8gVGhpcyBpcyBhIGZpeGVkIGxheW91dCBkZXJpdmVkIGZyb20gdGhlIGJpdGNvZGUgZW1pdHRlZCBieSBMTFZNIDUuMAorLy8vIGludGVuZGVkIHRvIGRlY291cGxlIHRoZSBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gZnJvbSB0aGUgc2VyaWFsaXphdGlvbi4KK2VudW0gRmFzdE1hdGhNYXAgeworICBVbnNhZmVBbGdlYnJhICAgPSAoMSA8PCAwKSwgLy8gTGVnYWN5CisgIE5vTmFOcyAgICAgICAgICA9ICgxIDw8IDEpLAorICBOb0luZnMgICAgICAgICAgPSAoMSA8PCAyKSwKKyAgTm9TaWduZWRaZXJvcyAgID0gKDEgPDwgMyksCisgIEFsbG93UmVjaXByb2NhbCA9ICgxIDw8IDQpLAorICBBbGxvd0NvbnRyYWN0ICAgPSAoMSA8PCA1KSwKKyAgQXBwcm94RnVuYyAgICAgID0gKDEgPDwgNiksCisgIEFsbG93UmVhc3NvYyAgICA9ICgxIDw8IDcpCit9OworCisvLy8gUG9zc2libHlFeGFjdE9wZXJhdG9yT3B0aW9uYWxGbGFncyAtIEZsYWdzIGZvciBzZXJpYWxpemluZworLy8vIFBvc3NpYmx5RXhhY3RPcGVyYXRvcidzIFN1YmNsYXNzT3B0aW9uYWxEYXRhIGNvbnRlbnRzLgorZW51bSBQb3NzaWJseUV4YWN0T3BlcmF0b3JPcHRpb25hbEZsYWdzIHsgUEVPX0VYQUNUID0gMCB9OworCisvLy8gRW5jb2RlZCBBdG9taWNPcmRlcmluZyB2YWx1ZXMuCitlbnVtIEF0b21pY09yZGVyaW5nQ29kZXMgeworICBPUkRFUklOR19OT1RBVE9NSUMgPSAwLAorICBPUkRFUklOR19VTk9SREVSRUQgPSAxLAorICBPUkRFUklOR19NT05PVE9OSUMgPSAyLAorICBPUkRFUklOR19BQ1FVSVJFID0gMywKKyAgT1JERVJJTkdfUkVMRUFTRSA9IDQsCisgIE9SREVSSU5HX0FDUVJFTCA9IDUsCisgIE9SREVSSU5HX1NFUUNTVCA9IDYKK307CisKKy8vLyBNYXJrZXJzIGFuZCBmbGFncyBmb3IgY2FsbCBpbnN0cnVjdGlvbi4KK2VudW0gQ2FsbE1hcmtlcnNGbGFncyB7CisgIENBTExfVEFJTCA9IDAsCisgIENBTExfQ0NPTlYgPSAxLAorICBDQUxMX01VU1RUQUlMID0gMTQsCisgIENBTExfRVhQTElDSVRfVFlQRSA9IDE1LAorICBDQUxMX05PVEFJTCA9IDE2LAorICBDQUxMX0ZNRiA9IDE3IC8vIENhbGwgaGFzIG9wdGlvbmFsIGZhc3QtbWF0aC1mbGFncy4KK307CisKKy8vIFRoZSBmdW5jdGlvbiBib2R5IGJsb2NrIChGVU5DVElPTl9CTE9DS19JRCkgZGVzY3JpYmVzIGZ1bmN0aW9uIGJvZGllcy4gIEl0CisvLyBjYW4gY29udGFpbiBhIGNvbnN0YW50IGJsb2NrIChDT05TVEFOVFNfQkxPQ0tfSUQpLgorZW51bSBGdW5jdGlvbkNvZGVzIHsKKyAgRlVOQ19DT0RFX0RFQ0xBUkVCTE9DS1MgPSAxLCAvLyBERUNMQVJFQkxPQ0tTOiBbbl0KKworICBGVU5DX0NPREVfSU5TVF9CSU5PUCA9IDIsICAgICAgLy8gQklOT1A6ICAgICAgW29wY29kZSwgdHksIG9wdmFsLCBvcHZhbF0KKyAgRlVOQ19DT0RFX0lOU1RfQ0FTVCA9IDMsICAgICAgIC8vIENBU1Q6ICAgICAgIFtvcGNvZGUsIHR5LCBvcHR5LCBvcHZhbF0KKyAgRlVOQ19DT0RFX0lOU1RfR0VQX09MRCA9IDQsICAgIC8vIEdFUDogICAgICAgIFtuIHggb3BlcmFuZHNdCisgIEZVTkNfQ09ERV9JTlNUX1NFTEVDVCA9IDUsICAgICAvLyBTRUxFQ1Q6ICAgICBbdHksIG9wdmFsLCBvcHZhbCwgb3B2YWxdCisgIEZVTkNfQ09ERV9JTlNUX0VYVFJBQ1RFTFQgPSA2LCAvLyBFWFRSQUNURUxUOiBbb3B0eSwgb3B2YWwsIG9wdmFsXQorICBGVU5DX0NPREVfSU5TVF9JTlNFUlRFTFQgPSA3LCAgLy8gSU5TRVJURUxUOiAgW3R5LCBvcHZhbCwgb3B2YWwsIG9wdmFsXQorICBGVU5DX0NPREVfSU5TVF9TSFVGRkxFVkVDID0gOCwgLy8gU0hVRkZMRVZFQzogW3R5LCBvcHZhbCwgb3B2YWwsIG9wdmFsXQorICBGVU5DX0NPREVfSU5TVF9DTVAgPSA5LCAgICAgICAgLy8gQ01QOiAgICAgICAgW29wdHksIG9wdmFsLCBvcHZhbCwgcHJlZF0KKworICBGVU5DX0NPREVfSU5TVF9SRVQgPSAxMCwgICAgLy8gUkVUOiAgICAgICAgW29wdHksb3B2YWw8Ym90aCBvcHRpb25hbD5dCisgIEZVTkNfQ09ERV9JTlNUX0JSID0gMTEsICAgICAvLyBCUjogICAgICAgICBbYmIjLCBiYiMsIGNvbmRdIG9yIFtiYiNdCisgIEZVTkNfQ09ERV9JTlNUX1NXSVRDSCA9IDEyLCAvLyBTV0lUQ0g6ICAgICBbb3B0eSwgb3AwLCBvcDEsIC4uLl0KKyAgRlVOQ19DT0RFX0lOU1RfSU5WT0tFID0gMTMsIC8vIElOVk9LRTogICAgIFthdHRyLCBmbnR5LCBvcDAsb3AxLCAuLi5dCisgIC8vIDE0IGlzIHVudXNlZC4KKyAgRlVOQ19DT0RFX0lOU1RfVU5SRUFDSEFCTEUgPSAxNSwgLy8gVU5SRUFDSEFCTEUKKworICBGVU5DX0NPREVfSU5TVF9QSEkgPSAxNiwgLy8gUEhJOiAgICAgICAgW3R5LCB2YWwwLGJiMCwgLi4uXQorICAvLyAxNyBpcyB1bnVzZWQuCisgIC8vIDE4IGlzIHVudXNlZC4KKyAgRlVOQ19DT0RFX0lOU1RfQUxMT0NBID0gMTksIC8vIEFMTE9DQTogICAgIFtpbnN0dHksIG9wdHksIG9wLCBhbGlnbl0KKyAgRlVOQ19DT0RFX0lOU1RfTE9BRCA9IDIwLCAgIC8vIExPQUQ6ICAgICAgIFtvcHR5LCBvcCwgYWxpZ24sIHZvbF0KKyAgLy8gMjEgaXMgdW51c2VkLgorICAvLyAyMiBpcyB1bnVzZWQuCisgIEZVTkNfQ09ERV9JTlNUX1ZBQVJHID0gMjMsIC8vIFZBQVJHOiAgICAgIFt2YWxpc3R0eSwgdmFsaXN0LCBpbnN0dHldCisgIC8vIFRoaXMgc3RvcmUgY29kZSBlbmNvZGVzIHRoZSBwb2ludGVyIHR5cGUsIHJhdGhlciB0aGFuIHRoZSB2YWx1ZSB0eXBlCisgIC8vIHRoaXMgaXMgc28gaW5mb3JtYXRpb24gb25seSBhdmFpbGFibGUgaW4gdGhlIHBvaW50ZXIgdHlwZSAoZS5nLiBhZGRyZXNzCisgIC8vIHNwYWNlcykgaXMgcmV0YWluZWQuCisgIEZVTkNfQ09ERV9JTlNUX1NUT1JFX09MRCA9IDI0LCAvLyBTVE9SRTogICAgICBbcHRydHkscHRyLHZhbCwgYWxpZ24sIHZvbF0KKyAgLy8gMjUgaXMgdW51c2VkLgorICBGVU5DX0NPREVfSU5TVF9FWFRSQUNUVkFMID0gMjYsIC8vIEVYVFJBQ1RWQUw6IFtuIHggb3BlcmFuZHNdCisgIEZVTkNfQ09ERV9JTlNUX0lOU0VSVFZBTCA9IDI3LCAgLy8gSU5TRVJUVkFMOiAgW24geCBvcGVyYW5kc10KKyAgLy8gZmNtcC9pY21wIHJldHVybmluZyBJbnQxVFkgb3IgdmVjdG9yIG9mIEludDFUeS4gU2FtZSBhcyBDTVAsIGV4aXN0cyB0bworICAvLyBzdXBwb3J0IGxlZ2FjeSB2aWNtcC92ZmNtcCBpbnN0cnVjdGlvbnMuCisgIEZVTkNfQ09ERV9JTlNUX0NNUDIgPSAyOCwgLy8gQ01QMjogICAgICAgW29wdHksIG9wdmFsLCBvcHZhbCwgcHJlZF0KKyAgLy8gbmV3IHNlbGVjdCBvbiBpMSBvciBbTiB4IGkxXQorICBGVU5DX0NPREVfSU5TVF9WU0VMRUNUID0gMjksIC8vIFZTRUxFQ1Q6ICAgIFt0eSxvcHZhbCxvcHZhbCxwcmVkdHkscHJlZF0KKyAgRlVOQ19DT0RFX0lOU1RfSU5CT1VORFNfR0VQX09MRCA9IDMwLCAvLyBJTkJPVU5EU19HRVA6IFtuIHggb3BlcmFuZHNdCisgIEZVTkNfQ09ERV9JTlNUX0lORElSRUNUQlIgPSAzMSwgICAgICAgLy8gSU5ESVJFQ1RCUjogW29wdHksIG9wMCwgb3AxLCAuLi5dCisgIC8vIDMyIGlzIHVudXNlZC4KKyAgRlVOQ19DT0RFX0RFQlVHX0xPQ19BR0FJTiA9IDMzLCAvLyBERUJVR19MT0NfQUdBSU4KKworICBGVU5DX0NPREVfSU5TVF9DQUxMID0gMzQsIC8vIENBTEw6ICAgIFthdHRyLCBjYywgZm50eSwgZm5pZCwgYXJncy4uLl0KKworICBGVU5DX0NPREVfREVCVUdfTE9DID0gMzUsICAgICAgICAvLyBERUJVR19MT0M6ICBbTGluZSxDb2wsU2NvcGVWYWwsIElBVmFsXQorICBGVU5DX0NPREVfSU5TVF9GRU5DRSA9IDM2LCAgICAgICAvLyBGRU5DRTogW29yZGVyaW5nLCBzeW5jaHNjb3BlXQorICBGVU5DX0NPREVfSU5TVF9DTVBYQ0hHX09MRCA9IDM3LCAvLyBDTVBYQ0hHOiBbcHRydHkscHRyLGNtcCxuZXcsIGFsaWduLCB2b2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICBvcmRlcmluZywgc3luY2hzY29wZV0KKyAgRlVOQ19DT0RFX0lOU1RfQVRPTUlDUk1XID0gMzgsICAgLy8gQVRPTUlDUk1XOiBbcHRydHkscHRyLHZhbCwgb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBhbGlnbiwgdm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBvcmRlcmluZywgc3luY2hzY29wZV0KKyAgRlVOQ19DT0RFX0lOU1RfUkVTVU1FID0gMzksICAgICAgLy8gUkVTVU1FOiAgICAgW29wdmFsXQorICBGVU5DX0NPREVfSU5TVF9MQU5ESU5HUEFEX09MRCA9CisgICAgICA0MCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTEFORElOR1BBRDogW3R5LHZhbCx2YWwsbnVtLGlkMCx2YWwwLi4uXQorICBGVU5DX0NPREVfSU5TVF9MT0FEQVRPTUlDID0gNDEsIC8vIExPQUQ6IFtvcHR5LCBvcCwgYWxpZ24sIHZvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgb3JkZXJpbmcsIHN5bmNoc2NvcGVdCisgIEZVTkNfQ09ERV9JTlNUX1NUT1JFQVRPTUlDX09MRCA9IDQyLCAvLyBTVE9SRTogW3B0cnR5LHB0cix2YWwsIGFsaWduLCB2b2wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgb3JkZXJpbmcsIHN5bmNoc2NvcGVdCisgIEZVTkNfQ09ERV9JTlNUX0dFUCA9IDQzLCAgICAgICAgICAgICAvLyBHRVA6ICBbaW5ib3VuZHMsIG4geCBvcGVyYW5kc10KKyAgRlVOQ19DT0RFX0lOU1RfU1RPUkUgPSA0NCwgICAgICAgLy8gU1RPUkU6IFtwdHJ0eSxwdHIsdmFsdHksdmFsLCBhbGlnbiwgdm9sXQorICBGVU5DX0NPREVfSU5TVF9TVE9SRUFUT01JQyA9IDQ1LCAvLyBTVE9SRTogW3B0cnR5LHB0cix2YWwsIGFsaWduLCB2b2wKKyAgRlVOQ19DT0RFX0lOU1RfQ01QWENIRyA9IDQ2LCAgICAgLy8gQ01QWENIRzogW3B0cnR5LHB0cix2YWx0eSxjbXAsbmV3LCBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIHZvbCxvcmRlcmluZyxzeW5jaHNjb3BlXQorICBGVU5DX0NPREVfSU5TVF9MQU5ESU5HUEFEID0gNDcsICAvLyBMQU5ESU5HUEFEOiBbdHksdmFsLG51bSxpZDAsdmFsMC4uLl0KKyAgRlVOQ19DT0RFX0lOU1RfQ0xFQU5VUFJFVCA9IDQ4LCAgLy8gQ0xFQU5VUFJFVDogW3ZhbF0gb3IgW3ZhbCxiYiNdCisgIEZVTkNfQ09ERV9JTlNUX0NBVENIUkVUID0gNDksICAgIC8vIENBVENIUkVUOiBbdmFsLGJiI10KKyAgRlVOQ19DT0RFX0lOU1RfQ0FUQ0hQQUQgPSA1MCwgICAgLy8gQ0FUQ0hQQUQ6IFtiYiMsYmIjLG51bSxhcmdzLi4uXQorICBGVU5DX0NPREVfSU5TVF9DTEVBTlVQUEFEID0gNTEsICAvLyBDTEVBTlVQUEFEOiBbbnVtLGFyZ3MuLi5dCisgIEZVTkNfQ09ERV9JTlNUX0NBVENIU1dJVENIID0KKyAgICAgIDUyLCAvLyBDQVRDSFNXSVRDSDogW251bSxhcmdzLi4uXSBvciBbbnVtLGFyZ3MuLi4sYmJdCisgIC8vIDUzIGlzIHVudXNlZC4KKyAgLy8gNTQgaXMgdW51c2VkLgorICBGVU5DX0NPREVfT1BFUkFORF9CVU5ETEUgPSA1NSwgLy8gT1BFUkFORF9CVU5ETEU6IFt0YWcjLCB2YWx1ZS4uLl0KK307CisKK2VudW0gVXNlTGlzdENvZGVzIHsKKyAgVVNFTElTVF9DT0RFX0RFRkFVTFQgPSAxLCAvLyBERUZBVUxUOiBbaW5kZXguLi4sIHZhbHVlLWlkXQorICBVU0VMSVNUX0NPREVfQkIgPSAyICAgICAgIC8vIEJCOiBbaW5kZXguLi4sIGJiLWlkXQorfTsKKworZW51bSBBdHRyaWJ1dGVLaW5kQ29kZXMgeworICAvLyA9IDAgaXMgdW51c2VkCisgIEFUVFJfS0lORF9BTElHTk1FTlQgPSAxLAorICBBVFRSX0tJTkRfQUxXQVlTX0lOTElORSA9IDIsCisgIEFUVFJfS0lORF9CWV9WQUwgPSAzLAorICBBVFRSX0tJTkRfSU5MSU5FX0hJTlQgPSA0LAorICBBVFRSX0tJTkRfSU5fUkVHID0gNSwKKyAgQVRUUl9LSU5EX01JTl9TSVpFID0gNiwKKyAgQVRUUl9LSU5EX05BS0VEID0gNywKKyAgQVRUUl9LSU5EX05FU1QgPSA4LAorICBBVFRSX0tJTkRfTk9fQUxJQVMgPSA5LAorICBBVFRSX0tJTkRfTk9fQlVJTFRJTiA9IDEwLAorICBBVFRSX0tJTkRfTk9fQ0FQVFVSRSA9IDExLAorICBBVFRSX0tJTkRfTk9fRFVQTElDQVRFID0gMTIsCisgIEFUVFJfS0lORF9OT19JTVBMSUNJVF9GTE9BVCA9IDEzLAorICBBVFRSX0tJTkRfTk9fSU5MSU5FID0gMTQsCisgIEFUVFJfS0lORF9OT05fTEFaWV9CSU5EID0gMTUsCisgIEFUVFJfS0lORF9OT19SRURfWk9ORSA9IDE2LAorICBBVFRSX0tJTkRfTk9fUkVUVVJOID0gMTcsCisgIEFUVFJfS0lORF9OT19VTldJTkQgPSAxOCwKKyAgQVRUUl9LSU5EX09QVElNSVpFX0ZPUl9TSVpFID0gMTksCisgIEFUVFJfS0lORF9SRUFEX05PTkUgPSAyMCwKKyAgQVRUUl9LSU5EX1JFQURfT05MWSA9IDIxLAorICBBVFRSX0tJTkRfUkVUVVJORUQgPSAyMiwKKyAgQVRUUl9LSU5EX1JFVFVSTlNfVFdJQ0UgPSAyMywKKyAgQVRUUl9LSU5EX1NfRVhUID0gMjQsCisgIEFUVFJfS0lORF9TVEFDS19BTElHTk1FTlQgPSAyNSwKKyAgQVRUUl9LSU5EX1NUQUNLX1BST1RFQ1QgPSAyNiwKKyAgQVRUUl9LSU5EX1NUQUNLX1BST1RFQ1RfUkVRID0gMjcsCisgIEFUVFJfS0lORF9TVEFDS19QUk9URUNUX1NUUk9ORyA9IDI4LAorICBBVFRSX0tJTkRfU1RSVUNUX1JFVCA9IDI5LAorICBBVFRSX0tJTkRfU0FOSVRJWkVfQUREUkVTUyA9IDMwLAorICBBVFRSX0tJTkRfU0FOSVRJWkVfVEhSRUFEID0gMzEsCisgIEFUVFJfS0lORF9TQU5JVElaRV9NRU1PUlkgPSAzMiwKKyAgQVRUUl9LSU5EX1VXX1RBQkxFID0gMzMsCisgIEFUVFJfS0lORF9aX0VYVCA9IDM0LAorICBBVFRSX0tJTkRfQlVJTFRJTiA9IDM1LAorICBBVFRSX0tJTkRfQ09MRCA9IDM2LAorICBBVFRSX0tJTkRfT1BUSU1JWkVfTk9ORSA9IDM3LAorICBBVFRSX0tJTkRfSU5fQUxMT0NBID0gMzgsCisgIEFUVFJfS0lORF9OT05fTlVMTCA9IDM5LAorICBBVFRSX0tJTkRfSlVNUF9UQUJMRSA9IDQwLAorICBBVFRSX0tJTkRfREVSRUZFUkVOQ0VBQkxFID0gNDEsCisgIEFUVFJfS0lORF9ERVJFRkVSRU5DRUFCTEVfT1JfTlVMTCA9IDQyLAorICBBVFRSX0tJTkRfQ09OVkVSR0VOVCA9IDQzLAorICBBVFRSX0tJTkRfU0FGRVNUQUNLID0gNDQsCisgIEFUVFJfS0lORF9BUkdNRU1PTkxZID0gNDUsCisgIEFUVFJfS0lORF9TV0lGVF9TRUxGID0gNDYsCisgIEFUVFJfS0lORF9TV0lGVF9FUlJPUiA9IDQ3LAorICBBVFRSX0tJTkRfTk9fUkVDVVJTRSA9IDQ4LAorICBBVFRSX0tJTkRfSU5BQ0NFU1NJQkxFTUVNX09OTFkgPSA0OSwKKyAgQVRUUl9LSU5EX0lOQUNDRVNTSUJMRU1FTV9PUl9BUkdNRU1PTkxZID0gNTAsCisgIEFUVFJfS0lORF9BTExPQ19TSVpFID0gNTEsCisgIEFUVFJfS0lORF9XUklURU9OTFkgPSA1MiwKKyAgQVRUUl9LSU5EX1NQRUNVTEFUQUJMRSA9IDUzLAorICBBVFRSX0tJTkRfU1RSSUNUX0ZQID0gNTQsCisgIEFUVFJfS0lORF9TQU5JVElaRV9IV0FERFJFU1MgPSA1NSwKKyAgQVRUUl9LSU5EX05PQ0ZfQ0hFQ0sgPSA1NiwKKyAgQVRUUl9LSU5EX09QVF9GT1JfRlVaWklORyA9IDU3LAorfTsKKworZW51bSBDb21kYXRTZWxlY3Rpb25LaW5kQ29kZXMgeworICBDT01EQVRfU0VMRUNUSU9OX0tJTkRfQU5ZID0gMSwKKyAgQ09NREFUX1NFTEVDVElPTl9LSU5EX0VYQUNUX01BVENIID0gMiwKKyAgQ09NREFUX1NFTEVDVElPTl9LSU5EX0xBUkdFU1QgPSAzLAorICBDT01EQVRfU0VMRUNUSU9OX0tJTkRfTk9fRFVQTElDQVRFUyA9IDQsCisgIENPTURBVF9TRUxFQ1RJT05fS0lORF9TQU1FX1NJWkUgPSA1LAorfTsKKworZW51bSBTdHJ0YWJDb2RlcyB7CisgIFNUUlRBQl9CTE9CID0gMSwKK307CisKK2VudW0gU3ltdGFiQ29kZXMgeworICBTWU1UQUJfQkxPQiA9IDEsCit9OworCit9IC8vIEVuZCBiaXRjIG5hbWVzcGFjZQorfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQWNjZWxUYWJsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0FjY2VsVGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzg1MGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0FjY2VsVGFibGUuaApAQCAtMCwwICsxLDM3MyBAQAorLy89PS0gaW5jbHVkZS9sbHZtL0NvZGVHZW4vQWNjZWxUYWJsZS5oIC0gQWNjZWxlcmF0b3IgVGFibGVzIC0tLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgc3VwcG9ydCBmb3Igd3JpdGluZyBhY2NlbGVyYXRvciB0YWJsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fRFdBUkZBQ0NFTFRBQkxFX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0RXQVJGQUNDRUxUQUJMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vRElFLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0R3YXJmU3RyaW5nUG9vbEVudHJ5LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvREpCLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vLyBUaGUgRFdBUkYgYW5kIEFwcGxlIGFjY2VsZXJhdG9yIHRhYmxlcyBhcmUgYW4gaW5kaXJlY3QgaGFzaCB0YWJsZSBvcHRpbWl6ZWQKKy8vLyBmb3IgbnVsbCBsb29rdXAgcmF0aGVyIHRoYW4gYWNjZXNzIHRvIGtub3duIGRhdGEuIFRoZSBBcHBsZSBhY2NlbGVyYXRvcgorLy8vIHRhYmxlcyBhcmUgYSBwcmVjdXJzb3Igb2YgdGhlIG5ld2VyIERXQVJGIHY1IGFjY2VsZXJhdG9yIHRhYmxlcy4gQm90aAorLy8vIGZvcm1hdHMgc2hhcmUgY29tbW9uIGRlc2lnbiBpZGVhcy4KKy8vLworLy8vIFRoZSBBcHBsZSBhY2NlbGVyYXRvciB0YWJsZSBhcmUgb3V0cHV0IGludG8gYW4gb24tZGlzayBmb3JtYXQgdGhhdCBsb29rcworLy8vIGxpa2UgdGhpczoKKy8vLworLy8vIC4tLS0tLS0tLS0tLS0tLS0tLS0uCisvLy8gfCAgSEVBREVSICAgICAgICAgIHwKKy8vLyB8LS0tLS0tLS0tLS0tLS0tLS0tfAorLy8vIHwgIEJVQ0tFVFMgICAgICAgICB8CisvLy8gfC0tLS0tLS0tLS0tLS0tLS0tLXwKKy8vLyB8ICBIQVNIRVMgICAgICAgICAgfAorLy8vIHwtLS0tLS0tLS0tLS0tLS0tLS18CisvLy8gfCAgT0ZGU0VUUyAgICAgICAgIHwKKy8vLyB8LS0tLS0tLS0tLS0tLS0tLS0tfAorLy8vIHwgIERBVEEgICAgICAgICAgICB8CisvLy8gYC0tLS0tLS0tLS0tLS0tLS0tLScKKy8vLworLy8vIFRoZSBoZWFkZXIgY29udGFpbnMgYSBtYWdpYyBudW1iZXIsIHZlcnNpb24sIHR5cGUgb2YgaGFzaCBmdW5jdGlvbiwKKy8vLyB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMsIHRvdGFsIG51bWJlciBvZiBoYXNoZXMsIGFuZCByb29tIGZvciBhIHNwZWNpYWwgc3RydWN0CisvLy8gb2YgZGF0YSBhbmQgdGhlIGxlbmd0aCBvZiB0aGF0IHN0cnVjdC4KKy8vLworLy8vIFRoZSBidWNrZXRzIGNvbnRhaW4gYW4gaW5kZXggKGUuZy4gNikgaW50byB0aGUgaGFzaGVzIGFycmF5LiBUaGUgaGFzaGVzCisvLy8gc2VjdGlvbiBjb250YWlucyBhbGwgb2YgdGhlIDMyLWJpdCBoYXNoIHZhbHVlcyBpbiBjb250aWd1b3VzIG1lbW9yeSwgYW5kIHRoZQorLy8vIG9mZnNldHMgY29udGFpbiB0aGUgb2Zmc2V0IGludG8gdGhlIGRhdGEgYXJlYSBmb3IgdGhlIHBhcnRpY3VsYXIgaGFzaC4KKy8vLworLy8vIEZvciBhIGxvb2t1cCBleGFtcGxlLCB3ZSBjb3VsZCBoYXNoIGEgZnVuY3Rpb24gbmFtZSBhbmQgdGFrZSBpdCBtb2R1bG8gdGhlCisvLy8gbnVtYmVyIG9mIGJ1Y2tldHMgZ2l2aW5nIHVzIG91ciBidWNrZXQuIEZyb20gdGhlcmUgd2UgdGFrZSB0aGUgYnVja2V0IHZhbHVlCisvLy8gYXMgYW4gaW5kZXggaW50byB0aGUgaGFzaGVzIHRhYmxlIGFuZCBsb29rIGF0IGVhY2ggc3VjY2Vzc2l2ZSBoYXNoIGFzIGxvbmcKKy8vLyBhcyB0aGUgaGFzaCB2YWx1ZSBpcyBzdGlsbCB0aGUgc2FtZSBtb2R1bG8gcmVzdWx0IChidWNrZXQgdmFsdWUpIGFzIGVhcmxpZXIuCisvLy8gSWYgd2UgaGF2ZSBhIG1hdGNoIHdlIGxvb2sgYXQgdGhhdCBzYW1lIGVudHJ5IGluIHRoZSBvZmZzZXRzIHRhYmxlIGFuZCBncmFiCisvLy8gdGhlIG9mZnNldCBpbiB0aGUgZGF0YSBmb3Igb3VyIGZpbmFsIG1hdGNoLgorLy8vCisvLy8gVGhlIERXQVJGIHY1IGFjY2VsZXJhdG9yIHRhYmxlIGNvbnNpc3RzIG9mIHplcm8gb3IgbW9yZSBuYW1lIGluZGljZXMgdGhhdAorLy8vIGFyZSBvdXRwdXQgaW50byBhbiBvbi1kaXNrIGZvcm1hdCB0aGF0IGxvb2tzIGxpa2UgdGhpczoKKy8vLworLy8vIC4tLS0tLS0tLS0tLS0tLS0tLS0uCisvLy8gfCAgSEVBREVSICAgICAgICAgIHwKKy8vLyB8LS0tLS0tLS0tLS0tLS0tLS0tfAorLy8vIHwgIENVIExJU1QgICAgICAgICB8CisvLy8gfC0tLS0tLS0tLS0tLS0tLS0tLXwKKy8vLyB8ICBMT0NBTCBUVSBMSVNUICAgfAorLy8vIHwtLS0tLS0tLS0tLS0tLS0tLS18CisvLy8gfCAgRk9SRUlHTiBUVSBMSVNUIHwKKy8vLyB8LS0tLS0tLS0tLS0tLS0tLS0tfAorLy8vIHwgIEhBU0ggVEFCTEUgICAgICB8CisvLy8gfC0tLS0tLS0tLS0tLS0tLS0tLXwKKy8vLyB8ICBOQU1FIFRBQkxFICAgICAgfAorLy8vIHwtLS0tLS0tLS0tLS0tLS0tLS18CisvLy8gfCAgQUJCUkVWIFRBQkxFICAgIHwKKy8vLyB8LS0tLS0tLS0tLS0tLS0tLS0tfAorLy8vIHwgIEVOVFJZIFBPT0wgICAgICB8CisvLy8gYC0tLS0tLS0tLS0tLS0tLS0tLScKKy8vLworLy8vIEZvciB0aGUgZnVsbCBkb2N1bWVudGF0aW9uIHBsZWFzZSByZWZlciB0byB0aGUgRFdBUkYgNSBzdGFuZGFyZC4KKy8vLworLy8vCisvLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGNsYXNzIHRlbXBsYXRlIEFjY2VsVGFibGUsIHdoaWNoIGlzIHJlcHJlc2VudHMgYW4KKy8vLyBhYnN0cmFjdCB2aWV3IG9mIGFuIEFjY2VsZXJhdG9yIHRhYmxlLCB3aXRob3V0IGFueSBub3Rpb24gb2YgYW4gb24tZGlzaworLy8vIGxheW91dC4gVGhpcyBjbGFzcyBpcyBwYXJhbWV0ZXJpemVkIGJ5IGFuIGVudHJ5IHR5cGUsIHdoaWNoIHNob3VsZCBkZXJpdmUKKy8vLyBmcm9tIEFjY2VsVGFibGVEYXRhLiBUaGlzIGlzIHRoZSB0eXBlIG9mIGluZGl2aWR1YWwgZW50cmllcyBpbiB0aGUgdGFibGUsCisvLy8gYW5kIGl0IHNob3VsZCBzdG9yZSB0aGUgZGF0YSBuZWNlc3NhcnkgdG8gZW1pdCB0aGVtLiBBcHBsZUFjY2VsVGFibGVEYXRhIGlzCisvLy8gdGhlIGJhc2UgY2xhc3MgZm9yIEFwcGxlIEFjY2VsZXJhdG9yIFRhYmxlIGVudHJpZXMsIHdoaWNoIGhhdmUgYSB1bmlmb3JtCisvLy8gc3RydWN0dXJlIGJhc2VkIG9uIGEgc2VxdWVuY2Ugb2YgQXRvbXMuIFRoZXJlIGFyZSBkaWZmZXJlbnQgc3ViLWNsYXNzZXMKKy8vLyBkZXJpdmVkIGZyb20gQXBwbGVBY2NlbFRhYmxlLCB3aGljaCBkaWZmZXIgaW4gdGhlIHNldCBvZiBBdG9tcyBhbmQgaG93IHRoZXkKKy8vLyBvYnRhaW4gdGhlaXIgdmFsdWVzLgorLy8vCisvLy8gQW4gQXBwbGUgQWNjZWxlcmF0b3IgVGFibGUgY2FuIGJlIHNlcmlhbGl6ZWQgYnkgY2FsbGluZyBlbWl0QXBwbGVBY2NlbFRhYmxlCisvLy8gZnVuY3Rpb24uCisvLy8KKy8vLyBUT0RPOiBBZGQgRFdBUkYgdjUgZW1pc3Npb24gY29kZS4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc21QcmludGVyOworCisvLy8gSW50ZXJmYWNlIHdoaWNoIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgYWNjZWxlcmF0b3IgdGFibGUgZGF0YSBoYXZlIHRvCisvLy8gY29uZm9ybS4gSXQgc2VydmVzIGFzIGEgYmFzZSBjbGFzcyBmb3IgZGlmZmVyZW50IHZhbHVlcyBvZiB0aGUgdGVtcGxhdGUKKy8vLyBhcmd1bWVudCBvZiB0aGUgQWNjZWxUYWJsZSBjbGFzcyB0ZW1wbGF0ZS4KK2NsYXNzIEFjY2VsVGFibGVEYXRhIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+QWNjZWxUYWJsZURhdGEoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQWNjZWxUYWJsZURhdGEgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIG9yZGVyKCkgPCBPdGhlci5vcmRlcigpOworICB9CisKKyAgLy8gU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50OgorICAvLyBzdGF0aWMgdWludDMyX3QgaGFzaChTdHJpbmdSZWYgTmFtZSk7CisKKyNpZm5kZWYgTkRFQlVHCisgIHZpcnR1YWwgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0ID0gMDsKKyNlbmRpZgorcHJvdGVjdGVkOgorICB2aXJ0dWFsIHVpbnQ2NF90IG9yZGVyKCkgY29uc3QgPSAwOworfTsKKworLy8vIEEgYmFzZSBjbGFzcyBob2xkaW5nIG5vbi10ZW1wbGF0ZS1kZXBlbmRhbnQgZnVuY3Rpb25hbGl0eSBvZiB0aGUgQWNjZWxUYWJsZQorLy8vIGNsYXNzLiBDbGllbnRzIHNob3VsZCBub3QgdXNlIHRoaXMgY2xhc3MgZGlyZWN0bHkgYnV0IHJhdGhlciBpbnN0YW50aWF0ZQorLy8vIEFjY2VsVGFibGUgd2l0aCBhIHR5cGUgZGVyaXZlZCBmcm9tIEFjY2VsVGFibGVEYXRhLgorY2xhc3MgQWNjZWxUYWJsZUJhc2UgeworcHVibGljOgorICB1c2luZyBIYXNoRm4gPSB1aW50MzJfdChTdHJpbmdSZWYpOworCisgIC8vLyBSZXByZXNlbnRzIGEgZ3JvdXAgb2YgZW50cmllcyB3aXRoIGlkZW50aWNhbCBuYW1lIChhbmQgaGVuY2UsIGhhc2ggdmFsdWUpLgorICBzdHJ1Y3QgSGFzaERhdGEgeworICAgIER3YXJmU3RyaW5nUG9vbEVudHJ5UmVmIE5hbWU7CisgICAgdWludDMyX3QgSGFzaFZhbHVlOworICAgIHN0ZDo6dmVjdG9yPEFjY2VsVGFibGVEYXRhICo+IFZhbHVlczsKKyAgICBNQ1N5bWJvbCAqU3ltOworCisgICAgSGFzaERhdGEoRHdhcmZTdHJpbmdQb29sRW50cnlSZWYgTmFtZSwgSGFzaEZuICpIYXNoKQorICAgICAgICA6IE5hbWUoTmFtZSksIEhhc2hWYWx1ZShIYXNoKE5hbWUuZ2V0U3RyaW5nKCkpKSB7fQorCisjaWZuZGVmIE5ERUJVRworICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoKSBjb25zdCB7IHByaW50KGRiZ3MoKSk7IH0KKyNlbmRpZgorICB9OworICB1c2luZyBIYXNoTGlzdCA9IHN0ZDo6dmVjdG9yPEhhc2hEYXRhICo+OworICB1c2luZyBCdWNrZXRMaXN0ID0gc3RkOjp2ZWN0b3I8SGFzaExpc3Q+OworCitwcm90ZWN0ZWQ6CisgIC8vLyBBbGxvY2F0b3IgZm9yIEhhc2hEYXRhIGFuZCBWYWx1ZXMuCisgIEJ1bXBQdHJBbGxvY2F0b3IgQWxsb2NhdG9yOworCisgIHVzaW5nIFN0cmluZ0VudHJpZXMgPSBTdHJpbmdNYXA8SGFzaERhdGEsIEJ1bXBQdHJBbGxvY2F0b3IgJj47CisgIFN0cmluZ0VudHJpZXMgRW50cmllczsKKworICBIYXNoRm4gKkhhc2g7CisgIHVpbnQzMl90IEJ1Y2tldENvdW50OworICB1aW50MzJfdCBVbmlxdWVIYXNoQ291bnQ7CisKKyAgSGFzaExpc3QgSGFzaGVzOworICBCdWNrZXRMaXN0IEJ1Y2tldHM7CisKKyAgdm9pZCBjb21wdXRlQnVja2V0Q291bnQoKTsKKworICBBY2NlbFRhYmxlQmFzZShIYXNoRm4gKkhhc2gpIDogRW50cmllcyhBbGxvY2F0b3IpLCBIYXNoKEhhc2gpIHt9CisKK3B1YmxpYzoKKyAgdm9pZCBmaW5hbGl6ZShBc21QcmludGVyICpBc20sIFN0cmluZ1JlZiBQcmVmaXgpOworICBBcnJheVJlZjxIYXNoTGlzdD4gZ2V0QnVja2V0cygpIGNvbnN0IHsgcmV0dXJuIEJ1Y2tldHM7IH0KKyAgdWludDMyX3QgZ2V0QnVja2V0Q291bnQoKSBjb25zdCB7IHJldHVybiBCdWNrZXRDb3VudDsgfQorICB1aW50MzJfdCBnZXRVbmlxdWVIYXNoQ291bnQoKSBjb25zdCB7IHJldHVybiBVbmlxdWVIYXNoQ291bnQ7IH0KKyAgdWludDMyX3QgZ2V0VW5pcXVlTmFtZUNvdW50KCkgY29uc3QgeyByZXR1cm4gRW50cmllcy5zaXplKCk7IH0KKworI2lmbmRlZiBOREVCVUcKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdCB7IHByaW50KGRiZ3MoKSk7IH0KKyNlbmRpZgorCisgIEFjY2VsVGFibGVCYXNlKGNvbnN0IEFjY2VsVGFibGVCYXNlICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBBY2NlbFRhYmxlQmFzZSAmKSA9IGRlbGV0ZTsKK307CisKKy8vLyBUaGlzIGNsYXNzIGhvbGRzIGFuIGFic3RyYWN0IHJlcHJlc2VudGF0aW9uIG9mIGFuIEFjY2VsZXJhdG9yIFRhYmxlLAorLy8vIGNvbnNpc3Rpbmcgb2YgYSBzZXF1ZW5jZSBvZiBidWNrZXRzLCBlYWNoIGJ1Y2tldCBjb250YWluaW50IGEgc2VxdWVuY2Ugb2YKKy8vLyBIYXNoRGF0YSBlbnRyaWVzLiBUaGUgY2xhc3MgaXMgcGFyYW1ldGVyaXplZCBieSB0aGUgdHlwZSBvZiBlbnRyaWVzIGl0CisvLy8gaG9sZHMuIFRoZSB0eXBlIHRlbXBsYXRlIHBhcmFtZXRlciBhbHNvIGRlZmluZXMgdGhlIGhhc2ggZnVuY3Rpb24gdG8gdXNlIGZvcgorLy8vIGhhc2hpbmcgbmFtZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVQ+IGNsYXNzIEFjY2VsVGFibGUgOiBwdWJsaWMgQWNjZWxUYWJsZUJhc2UgeworcHVibGljOgorICBBY2NlbFRhYmxlKCkgOiBBY2NlbFRhYmxlQmFzZShEYXRhVDo6aGFzaCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHlwZXM+CisgIHZvaWQgYWRkTmFtZShEd2FyZlN0cmluZ1Bvb2xFbnRyeVJlZiBOYW1lLCBUeXBlcyAmJi4uLiBBcmdzKTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBY2NlbFRhYmxlRGF0YVQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHlwZXM+Cit2b2lkIEFjY2VsVGFibGU8QWNjZWxUYWJsZURhdGFUPjo6YWRkTmFtZShEd2FyZlN0cmluZ1Bvb2xFbnRyeVJlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZXMgJiYuLi4gQXJncykgeworICBhc3NlcnQoQnVja2V0cy5lbXB0eSgpICYmICJBbHJlYWR5IGZpbmFsaXplZCEiKTsKKyAgLy8gSWYgdGhlIHN0cmluZyBpcyBpbiB0aGUgbGlzdCBhbHJlYWR5IHRoZW4gYWRkIHRoaXMgZGllIHRvIHRoZSBsaXN0CisgIC8vIG90aGVyd2lzZSBhZGQgYSBuZXcgb25lLgorICBhdXRvIEl0ZXIgPSBFbnRyaWVzLnRyeV9lbXBsYWNlKE5hbWUuZ2V0U3RyaW5nKCksIE5hbWUsIEhhc2gpLmZpcnN0OworICBhc3NlcnQoSXRlci0+c2Vjb25kLk5hbWUgPT0gTmFtZSk7CisgIEl0ZXItPnNlY29uZC5WYWx1ZXMucHVzaF9iYWNrKAorICAgICAgbmV3IChBbGxvY2F0b3IpIEFjY2VsVGFibGVEYXRhVChzdGQ6OmZvcndhcmQ8VHlwZXM+KEFyZ3MpLi4uKSk7Cit9CisKKy8vLyBBIGJhc2UgY2xhc3MgZm9yIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgRGF0YSBjbGFzc2VzIGZvciBBcHBsZQorLy8vIEFjY2VsZXJhdG9yIFRhYmxlcy4gVGhlIGNvbHVtbnMgaW4gdGhlIHRhYmxlIGFyZSBkZWZpbmVkIGJ5IHRoZSBzdGF0aWMgQXRvbXMKKy8vLyB2YXJpYWJsZSBkZWZpbmVkIG9uIHRoZSBzdWJjbGFzc2VzLgorY2xhc3MgQXBwbGVBY2NlbFRhYmxlRGF0YSA6IHB1YmxpYyBBY2NlbFRhYmxlRGF0YSB7CitwdWJsaWM6CisgIC8vLyBBbiBBdG9tIGRlZmluZXMgdGhlIGZvcm0gb2YgdGhlIGRhdGEgaW4gYW4gQXBwbGUgYWNjZWxlcmF0b3IgdGFibGUuCisgIC8vLyBDb25jZXB0dWFsbHkgaXQgaXMgYSBjb2x1bW4gaW4gdGhlIGFjY2VsZXJhdG9yIGNvbnNpc3Rpbmcgb2YgYSB0eXBlIGFuZCBhCisgIC8vLyBzcGVjaWZpY2F0aW9uIG9mIHRoZSBmb3JtIG9mIGl0cyBkYXRhLgorICBzdHJ1Y3QgQXRvbSB7CisgICAgLy8vIEF0b20gVHlwZS4KKyAgICBjb25zdCB1aW50MTZfdCBUeXBlOworICAgIC8vLyBEV0FSRiBGb3JtLgorICAgIGNvbnN0IHVpbnQxNl90IEZvcm07CisKKyAgICBjb25zdGV4cHIgQXRvbSh1aW50MTZfdCBUeXBlLCB1aW50MTZfdCBGb3JtKSA6IFR5cGUoVHlwZSksIEZvcm0oRm9ybSkge30KKworI2lmbmRlZiBOREVCVUcKKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgICAgdm9pZCBkdW1wKCkgY29uc3QgeyBwcmludChkYmdzKCkpOyB9CisjZW5kaWYKKyAgfTsKKyAgLy8gU3ViY2xhc3NlcyBzaG91bGQgZGVmaW5lOgorICAvLyBzdGF0aWMgY29uc3RleHByIEF0b20gQXRvbXNbXTsKKworICB2aXJ0dWFsIHZvaWQgZW1pdChBc21QcmludGVyICpBc20pIGNvbnN0ID0gMDsKKworICBzdGF0aWMgdWludDMyX3QgaGFzaChTdHJpbmdSZWYgQnVmZmVyKSB7IHJldHVybiBkamJIYXNoKEJ1ZmZlcik7IH0KK307CisKK3ZvaWQgZW1pdEFwcGxlQWNjZWxUYWJsZUltcGwoQXNtUHJpbnRlciAqQXNtLCBBY2NlbFRhYmxlQmFzZSAmQ29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBQcmVmaXgsIGNvbnN0IE1DU3ltYm9sICpTZWNCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8QXBwbGVBY2NlbFRhYmxlRGF0YTo6QXRvbT4gQXRvbXMpOworCisvLy8gRW1pdCBhbiBBcHBsZSBBY2NlbGVyYXRvciBUYWJsZSBjb25zaXN0aW5nIG9mIGVudHJpZXMgaW4gdGhlIHNwZWNpZmllZAorLy8vIEFjY2VsVGFibGUuIFRoZSBEYXRhVCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIGRlcml2ZWQgZnJvbQorLy8vIEFwcGxlQWNjZWxUYWJsZURhdGEuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVQ+Cit2b2lkIGVtaXRBcHBsZUFjY2VsVGFibGUoQXNtUHJpbnRlciAqQXNtLCBBY2NlbFRhYmxlPERhdGFUPiAmQ29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFByZWZpeCwgY29uc3QgTUNTeW1ib2wgKlNlY0JlZ2luKSB7CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19jb252ZXJ0aWJsZTxEYXRhVCAqLCBBcHBsZUFjY2VsVGFibGVEYXRhICo+Ojp2YWx1ZSwgIiIpOworICBlbWl0QXBwbGVBY2NlbFRhYmxlSW1wbChBc20sIENvbnRlbnRzLCBQcmVmaXgsIFNlY0JlZ2luLCBEYXRhVDo6QXRvbXMpOworfQorCisvLy8gQWNjZWxlcmF0b3IgdGFibGUgZGF0YSBpbXBsZW1lbnRhdGlvbiBmb3Igc2ltcGxlIEFwcGxlIGFjY2VsZXJhdG9yIHRhYmxlcworLy8vIHdpdGgganVzdCBhIERJRSByZWZlcmVuY2UuCitjbGFzcyBBcHBsZUFjY2VsVGFibGVPZmZzZXREYXRhIDogcHVibGljIEFwcGxlQWNjZWxUYWJsZURhdGEgeworcHVibGljOgorICBBcHBsZUFjY2VsVGFibGVPZmZzZXREYXRhKGNvbnN0IERJRSAqRCkgOiBEaWUoRCkge30KKworICB2b2lkIGVtaXQoQXNtUHJpbnRlciAqQXNtKSBjb25zdCBvdmVycmlkZTsKKworI2lmbmRlZiBfTVNDX1ZFUgorICAvLyBUaGUgbGluZSBiZWxvdyBpcyByZWplY3RlZCBieSBvbGRlciB2ZXJzaW9ucyAoVEJEKSBvZiBNU1ZDLgorICBzdGF0aWMgY29uc3RleHByIEF0b20gQXRvbXNbXSA9IHsKKyAgICAgIEF0b20oZHdhcmY6OkRXX0FUT01fZGllX29mZnNldCwgZHdhcmY6OkRXX0ZPUk1fZGF0YTQpfTsKKyNlbHNlCisgIC8vIEZJWE1FOiBFcmFzZSB0aGlzIHBhdGggb25jZSB0aGUgbWluaW11bSBNU0NWIHZlcnNpb24gaGFzIGJlZW4gYnVtcGVkLgorICBzdGF0aWMgY29uc3QgU21hbGxWZWN0b3I8QXRvbSwgND4gQXRvbXM7CisjZW5kaWYKKworI2lmbmRlZiBOREVCVUcKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworI2VuZGlmCitwcm90ZWN0ZWQ6CisgIHVpbnQ2NF90IG9yZGVyKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gRGllLT5nZXRPZmZzZXQoKTsgfQorCisgIGNvbnN0IERJRSAqRGllOworfTsKKworLy8vIEFjY2VsZXJhdG9yIHRhYmxlIGRhdGEgaW1wbGVtZW50YXRpb24gZm9yIEFwcGxlIHR5cGUgYWNjZWxlcmF0b3IgdGFibGVzLgorY2xhc3MgQXBwbGVBY2NlbFRhYmxlVHlwZURhdGEgOiBwdWJsaWMgQXBwbGVBY2NlbFRhYmxlT2Zmc2V0RGF0YSB7CitwdWJsaWM6CisgIEFwcGxlQWNjZWxUYWJsZVR5cGVEYXRhKGNvbnN0IERJRSAqRCkgOiBBcHBsZUFjY2VsVGFibGVPZmZzZXREYXRhKEQpIHt9CisKKyAgdm9pZCBlbWl0KEFzbVByaW50ZXIgKkFzbSkgY29uc3Qgb3ZlcnJpZGU7CisKKyNpZm5kZWYgX01TQ19WRVIKKyAgLy8gVGhlIGxpbmUgYmVsb3cgaXMgcmVqZWN0ZWQgYnkgb2xkZXIgdmVyc2lvbnMgKFRCRCkgb2YgTVNWQy4KKyAgc3RhdGljIGNvbnN0ZXhwciBBdG9tIEF0b21zW10gPSB7CisgICAgICBBdG9tKGR3YXJmOjpEV19BVE9NX2RpZV9vZmZzZXQsIGR3YXJmOjpEV19GT1JNX2RhdGE0KSwKKyAgICAgIEF0b20oZHdhcmY6OkRXX0FUT01fZGllX3RhZywgZHdhcmY6OkRXX0ZPUk1fZGF0YTIpLAorICAgICAgQXRvbShkd2FyZjo6RFdfQVRPTV90eXBlX2ZsYWdzLCBkd2FyZjo6RFdfRk9STV9kYXRhMSl9OworI2Vsc2UKKyAgLy8gRklYTUU6IEVyYXNlIHRoaXMgcGF0aCBvbmNlIHRoZSBtaW5pbXVtIE1TQ1YgdmVyc2lvbiBoYXMgYmVlbiBidW1wZWQuCisgIHN0YXRpYyBjb25zdCBTbWFsbFZlY3RvcjxBdG9tLCA0PiBBdG9tczsKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CisjZW5kaWYKK307CisKKy8vLyBBY2NlbGVyYXRvciB0YWJsZSBkYXRhIGltcGxlbWVudGF0aW9uIGZvciBzaW1wbGUgQXBwbGUgYWNjZWxlcmF0b3IgdGFibGVzCisvLy8gd2l0aCBhIERJRSBvZmZzZXQgYnV0IG5vIGFjdHVhbCBESUUgcG9pbnRlci4KK2NsYXNzIEFwcGxlQWNjZWxUYWJsZVN0YXRpY09mZnNldERhdGEgOiBwdWJsaWMgQXBwbGVBY2NlbFRhYmxlRGF0YSB7CitwdWJsaWM6CisgIEFwcGxlQWNjZWxUYWJsZVN0YXRpY09mZnNldERhdGEodWludDMyX3QgT2Zmc2V0KSA6IE9mZnNldChPZmZzZXQpIHt9CisKKyAgdm9pZCBlbWl0KEFzbVByaW50ZXIgKkFzbSkgY29uc3Qgb3ZlcnJpZGU7CisKKyNpZm5kZWYgX01TQ19WRVIKKyAgLy8gVGhlIGxpbmUgYmVsb3cgaXMgcmVqZWN0ZWQgYnkgb2xkZXIgdmVyc2lvbnMgKFRCRCkgb2YgTVNWQy4KKyAgc3RhdGljIGNvbnN0ZXhwciBBdG9tIEF0b21zW10gPSB7CisgICAgICBBdG9tKGR3YXJmOjpEV19BVE9NX2RpZV9vZmZzZXQsIGR3YXJmOjpEV19GT1JNX2RhdGE0KX07CisjZWxzZQorICAvLyBGSVhNRTogRXJhc2UgdGhpcyBwYXRoIG9uY2UgdGhlIG1pbmltdW0gTVNDViB2ZXJzaW9uIGhhcyBiZWVuIGJ1bXBlZC4KKyAgc3RhdGljIGNvbnN0IFNtYWxsVmVjdG9yPEF0b20sIDQ+IEF0b21zOworI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKKyNlbmRpZgorcHJvdGVjdGVkOgorICB1aW50NjRfdCBvcmRlcigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIE9mZnNldDsgfQorCisgIHVpbnQzMl90IE9mZnNldDsKK307CisKKy8vLyBBY2NlbGVyYXRvciB0YWJsZSBkYXRhIGltcGxlbWVudGF0aW9uIGZvciB0eXBlIGFjY2VsZXJhdG9yIHRhYmxlcyB3aXRoCisvLy8gYSBESUUgb2Zmc2V0IGJ1dCBubyBhY3R1YWwgRElFIHBvaW50ZXIuCitjbGFzcyBBcHBsZUFjY2VsVGFibGVTdGF0aWNUeXBlRGF0YSA6IHB1YmxpYyBBcHBsZUFjY2VsVGFibGVTdGF0aWNPZmZzZXREYXRhIHsKK3B1YmxpYzoKKyAgQXBwbGVBY2NlbFRhYmxlU3RhdGljVHlwZURhdGEodWludDMyX3QgT2Zmc2V0LCB1aW50MTZfdCBUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT2JqQ0NsYXNzSXNJbXBsZW1lbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUXVhbGlmaWVkTmFtZUhhc2gpCisgICAgICA6IEFwcGxlQWNjZWxUYWJsZVN0YXRpY09mZnNldERhdGEoT2Zmc2V0KSwKKyAgICAgICAgUXVhbGlmaWVkTmFtZUhhc2goUXVhbGlmaWVkTmFtZUhhc2gpLCBUYWcoVGFnKSwKKyAgICAgICAgT2JqQ0NsYXNzSXNJbXBsZW1lbnRhdGlvbihPYmpDQ2xhc3NJc0ltcGxlbWVudGF0aW9uKSB7fQorCisgIHZvaWQgZW1pdChBc21QcmludGVyICpBc20pIGNvbnN0IG92ZXJyaWRlOworCisjaWZuZGVmIF9NU0NfVkVSCisgIC8vIFRoZSBsaW5lIGJlbG93IGlzIHJlamVjdGVkIGJ5IG9sZGVyIHZlcnNpb25zIChUQkQpIG9mIE1TVkMuCisgIHN0YXRpYyBjb25zdGV4cHIgQXRvbSBBdG9tc1tdID0geworICAgICAgQXRvbShkd2FyZjo6RFdfQVRPTV9kaWVfb2Zmc2V0LCBkd2FyZjo6RFdfRk9STV9kYXRhNCksCisgICAgICBBdG9tKGR3YXJmOjpEV19BVE9NX2RpZV90YWcsIGR3YXJmOjpEV19GT1JNX2RhdGEyKSwKKyAgICAgIEF0b20oNSwgZHdhcmY6OkRXX0ZPUk1fZGF0YTEpLCBBdG9tKDYsIGR3YXJmOjpEV19GT1JNX2RhdGE0KX07CisjZWxzZQorICAvLyBGSVhNRTogRXJhc2UgdGhpcyBwYXRoIG9uY2UgdGhlIG1pbmltdW0gTVNDViB2ZXJzaW9uIGhhcyBiZWVuIGJ1bXBlZC4KKyAgc3RhdGljIGNvbnN0IFNtYWxsVmVjdG9yPEF0b20sIDQ+IEF0b21zOworI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKKyNlbmRpZgorcHJvdGVjdGVkOgorICB1aW50NjRfdCBvcmRlcigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIE9mZnNldDsgfQorCisgIHVpbnQzMl90IFF1YWxpZmllZE5hbWVIYXNoOworICB1aW50MTZfdCBUYWc7CisgIGJvb2wgT2JqQ0NsYXNzSXNJbXBsZW1lbnRhdGlvbjsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fRFdBUkZBQ0NFTFRBQkxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9BbmFseXNpcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0FuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4OGYxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9BbmFseXNpcy5oCkBAIC0wLDAgKzEsMTMxIEBACisvLz09PS0gQ29kZUdlbi9BbmFseXNpcy5oIC0gQ29kZUdlbiBMTFZNIElSIEFuYWx5c2lzIFV0aWxpdGllcyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBzZXZlcmFsIENvZGVHZW4tc3BlY2lmaWMgTExWTSBJUiBhbmFseXNpcyB1dGlsaXRpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fQU5BTFlTSVNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fQU5BTFlTSVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0lTRE9wY29kZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbmxpbmVBc20uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db2RlR2VuLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEdsb2JhbFZhbHVlOworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBUYXJnZXRMb3dlcmluZ0Jhc2U7CitjbGFzcyBUYXJnZXRMb3dlcmluZzsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CitjbGFzcyBTRE5vZGU7CitjbGFzcyBTRFZhbHVlOworY2xhc3MgU2VsZWN0aW9uREFHOworc3RydWN0IEVWVDsKKworLy8vIFxicmllZiBDb21wdXRlIHRoZSBsaW5lYXJpemVkIGluZGV4IG9mIGEgbWVtYmVyIGluIGEgbmVzdGVkCisvLy8gYWdncmVnYXRlL3N0cnVjdC9hcnJheS4KKy8vLworLy8vIEdpdmVuIGFuIExMVk0gSVIgYWdncmVnYXRlIHR5cGUgYW5kIGEgc2VxdWVuY2Ugb2YgaW5zZXJ0dmFsdWUgb3IKKy8vLyBleHRyYWN0dmFsdWUgaW5kaWNlcyB0aGF0IGlkZW50aWZ5IGEgbWVtYmVyLCByZXR1cm4gdGhlIGxpbmVhcml6ZWQgaW5kZXggb2YKKy8vLyB0aGUgc3RhcnQgb2YgdGhlIG1lbWJlciwgaS5lIHRoZSBudW1iZXIgb2YgZWxlbWVudCBpbiBtZW1vcnkgYmVmb3JlIHRoZQorLy8vIHNvdWdodCBvbmUuIFRoaXMgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIG51bWJlciBvZiBieXRlcy4KKy8vLworLy8vIFxwYXJhbSBUeSBpcyB0aGUgdHlwZSBpbmRleGVkIGJ5IFxwIEluZGljZXMuCisvLy8gXHBhcmFtIEluZGljZXMgaXMgYW4gb3B0aW9uYWwgcG9pbnRlciBpbiB0aGUgaW5kaWNlcyBsaXN0IHRvIHRoZSBjdXJyZW50CisvLy8gaW5kZXguCisvLy8gXHBhcmFtIEluZGljZXNFbmQgaXMgdGhlIGVuZCBvZiB0aGUgaW5kaWNlcyBsaXN0LgorLy8vIFxwYXJhbSBDdXJJbmRleCBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgcmVjdXJzaW9uLgorLy8vCisvLy8gXHJldHVybnMgXHAgQ3VySW5kZXggcGx1cyB0aGUgbGluZWFyIGluZGV4IGluIFxwIFR5ICB0aGUgaW5kaWNlcyBsaXN0LgordW5zaWduZWQgQ29tcHV0ZUxpbmVhckluZGV4KFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkICpJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkICpJbmRpY2VzRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEN1ckluZGV4ID0gMCk7CisKK2lubGluZSB1bnNpZ25lZCBDb21wdXRlTGluZWFySW5kZXgoVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDdXJJbmRleCA9IDApIHsKKyAgcmV0dXJuIENvbXB1dGVMaW5lYXJJbmRleChUeSwgSW5kaWNlcy5iZWdpbigpLCBJbmRpY2VzLmVuZCgpLCBDdXJJbmRleCk7Cit9CisKKy8vLyBDb21wdXRlVmFsdWVWVHMgLSBHaXZlbiBhbiBMTFZNIElSIHR5cGUsIGNvbXB1dGUgYSBzZXF1ZW5jZSBvZgorLy8vIEVWVHMgdGhhdCByZXByZXNlbnQgYWxsIHRoZSBpbmRpdmlkdWFsIHVuZGVybHlpbmcKKy8vLyBub24tYWdncmVnYXRlIHR5cGVzIHRoYXQgY29tcHJpc2UgaXQuCisvLy8KKy8vLyBJZiBPZmZzZXRzIGlzIG5vbi1udWxsLCBpdCBwb2ludHMgdG8gYSB2ZWN0b3IgdG8gYmUgZmlsbGVkIGluCisvLy8gd2l0aCB0aGUgaW4tbWVtb3J5IG9mZnNldHMgb2YgZWFjaCBvZiB0aGUgaW5kaXZpZHVhbCB2YWx1ZXMuCisvLy8KK3ZvaWQgQ29tcHV0ZVZhbHVlVlRzKGNvbnN0IFRhcmdldExvd2VyaW5nICZUTEksIGNvbnN0IERhdGFMYXlvdXQgJkRMLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxFVlQ+ICZWYWx1ZVZUcywKKyAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDx1aW50NjRfdD4gKk9mZnNldHMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU3RhcnRpbmdPZmZzZXQgPSAwKTsKKworLy8vIEV4dHJhY3RUeXBlSW5mbyAtIFJldHVybnMgdGhlIHR5cGUgaW5mbywgcG9zc2libHkgYml0Y2FzdCwgZW5jb2RlZCBpbiBWLgorR2xvYmFsVmFsdWUgKkV4dHJhY3RUeXBlSW5mbyhWYWx1ZSAqVik7CisKKy8vLyBoYXNJbmxpbmVBc21NZW1Db25zdHJhaW50IC0gUmV0dXJuIHRydWUgaWYgdGhlIGlubGluZSBhc20gaW5zdHJ1Y3Rpb24gYmVpbmcKKy8vLyBwcm9jZXNzZWQgdXNlcyBhIG1lbW9yeSAnbScgY29uc3RyYWludC4KK2Jvb2wgaGFzSW5saW5lQXNtTWVtQ29uc3RyYWludChJbmxpbmVBc206OkNvbnN0cmFpbnRJbmZvVmVjdG9yICZDSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSk7CisKKy8vLyBnZXRGQ21wQ29uZENvZGUgLSBSZXR1cm4gdGhlIElTRCBjb25kaXRpb24gY29kZSBjb3JyZXNwb25kaW5nIHRvCisvLy8gdGhlIGdpdmVuIExMVk0gSVIgZmxvYXRpbmctcG9pbnQgY29uZGl0aW9uIGNvZGUuICBUaGlzIGluY2x1ZGVzCisvLy8gY29uc2lkZXJhdGlvbiBvZiBnbG9iYWwgZmxvYXRpbmctcG9pbnQgbWF0aCBmbGFncy4KKy8vLworSVNEOjpDb25kQ29kZSBnZXRGQ21wQ29uZENvZGUoRkNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkKTsKKworLy8vIGdldEZDbXBDb2RlV2l0aG91dE5hTiAtIEdpdmVuIGFuIElTRCBjb25kaXRpb24gY29kZSBjb21wYXJpbmcgZmxvYXRzLAorLy8vIHJldHVybiB0aGUgZXF1aXZhbGVudCBjb2RlIGlmIHdlJ3JlIGFsbG93ZWQgdG8gYXNzdW1lIHRoYXQgTmFOcyB3b24ndCBvY2N1ci4KK0lTRDo6Q29uZENvZGUgZ2V0RkNtcENvZGVXaXRob3V0TmFOKElTRDo6Q29uZENvZGUgQ0MpOworCisvLy8gZ2V0SUNtcENvbmRDb2RlIC0gUmV0dXJuIHRoZSBJU0QgY29uZGl0aW9uIGNvZGUgY29ycmVzcG9uZGluZyB0bworLy8vIHRoZSBnaXZlbiBMTFZNIElSIGludGVnZXIgY29uZGl0aW9uIGNvZGUuCisvLy8KK0lTRDo6Q29uZENvZGUgZ2V0SUNtcENvbmRDb2RlKElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCk7CisKKy8vLyBUZXN0IGlmIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBpcyBpbiBhIHBvc2l0aW9uIHRvIGJlIG9wdGltaXplZAorLy8vIHdpdGggYSB0YWlsLWNhbGwuIFRoaXMgcm91Z2hseSBtZWFucyB0aGF0IGl0J3MgaW4gYSBibG9jayB3aXRoCisvLy8gYSByZXR1cm4gYW5kIHRoZXJlJ3Mgbm90aGluZyB0aGF0IG5lZWRzIHRvIGJlIHNjaGVkdWxlZAorLy8vIGJldHdlZW4gaXQgYW5kIHRoZSByZXR1cm4uCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIG9ubHkgdGVzdHMgdGFyZ2V0LWluZGVwZW5kZW50IHJlcXVpcmVtZW50cy4KK2Jvb2wgaXNJblRhaWxDYWxsUG9zaXRpb24oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKTsKKworLy8vIFRlc3QgaWYgZ2l2ZW4gdGhhdCB0aGUgaW5wdXQgaW5zdHJ1Y3Rpb24gaXMgaW4gdGhlIHRhaWwgY2FsbCBwb3NpdGlvbiwgaWYKKy8vLyB0aGVyZSBpcyBhbiBhdHRyaWJ1dGUgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgY2FsbGVyIGFuZCB0aGUgY2FsbGVlIHRoYXQgd2lsbAorLy8vIGluaGliaXQgdGFpbCBjYWxsIG9wdGltaXphdGlvbnMuCisvLy8gXHAgQWxsb3dEaWZmZXJpbmdTaXplcyBpcyBhbiBvdXRwdXQgcGFyYW1ldGVyIHdoaWNoLCBpZiBmb3JtaW5nIGEgdGFpbCBjYWxsCisvLy8gaXMgcGVybWl0dGVkLCBkZXRlcm1pbmVzIHdoZXRoZXIgaXQncyBwZXJtaXR0ZWQgb25seSBpZiB0aGUgc2l6ZSBvZiB0aGUKKy8vLyBjYWxsZXIncyBhbmQgY2FsbGVlJ3MgcmV0dXJuIHR5cGVzIG1hdGNoIGV4YWN0bHkuCitib29sIGF0dHJpYnV0ZXNQZXJtaXRUYWlsQ2FsbChjb25zdCBGdW5jdGlvbiAqRiwgY29uc3QgSW5zdHJ1Y3Rpb24gKkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXR1cm5JbnN0ICpSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMb3dlcmluZ0Jhc2UgJlRMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKkFsbG93RGlmZmVyaW5nU2l6ZXMgPSBudWxscHRyKTsKKworLy8vIFRlc3QgaWYgZ2l2ZW4gdGhhdCB0aGUgaW5wdXQgaW5zdHJ1Y3Rpb24gaXMgaW4gdGhlIHRhaWwgY2FsbCBwb3NpdGlvbiBpZiB0aGUKKy8vLyByZXR1cm4gdHlwZSBvciBhbnkgYXR0cmlidXRlcyBvZiB0aGUgZnVuY3Rpb24gd2lsbCBpbmhpYml0IHRhaWwgY2FsbAorLy8vIG9wdGltaXphdGlvbi4KK2Jvb2wgcmV0dXJuVHlwZUlzRWxpZ2libGVGb3JUYWlsQ2FsbChjb25zdCBGdW5jdGlvbiAqRiwgY29uc3QgSW5zdHJ1Y3Rpb24gKkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0dXJuSW5zdCAqUmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExvd2VyaW5nQmFzZSAmVExJKTsKKworRGVuc2VNYXA8Y29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKiwgaW50PgorZ2V0RnVuY2xldE1lbWJlcnNoaXAoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRik7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0FzbVByaW50ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Bc21QcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzYmQzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Bc21QcmludGVyLmgKQEAgLTAsMCArMSw2NDUgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vQXNtUHJpbnRlci5oIC0gQXNtUHJpbnRlciBGcmFtZXdvcmsgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGEgY2xhc3MgdG8gYmUgdXNlZCBhcyB0aGUgYmFzZSBjbGFzcyBmb3IgdGFyZ2V0IHNwZWNpZmljCisvLyBhc20gd3JpdGVycy4gIFRoaXMgY2xhc3MgcHJpbWFyaWx5IGhhbmRsZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgdXNlZCBieQorLy8gYWxsIGFzbSB3cml0ZXJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0FTTVBSSU5URVJfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fQVNNUFJJTlRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9NYXBWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0R3YXJmU3RyaW5nUG9vbEVudHJ5LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0lubGluZUFzbS5oIgorI2luY2x1ZGUgImxsdm0vSVIvTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Tb3VyY2VNZ3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc21QcmludGVySGFuZGxlcjsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBCbG9ja0FkZHJlc3M7CitjbGFzcyBDb25zdGFudDsKK2NsYXNzIENvbnN0YW50QXJyYXk7CitjbGFzcyBEYXRhTGF5b3V0OworY2xhc3MgRElFOworY2xhc3MgRElFQWJicmV2OworY2xhc3MgRHdhcmZEZWJ1ZzsKK2NsYXNzIEdDTWV0YWRhdGFQcmludGVyOworY2xhc3MgR0NTdHJhdGVneTsKK2NsYXNzIEdsb2JhbEluZGlyZWN0U3ltYm9sOworY2xhc3MgR2xvYmFsT2JqZWN0OworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBHbG9iYWxWYXJpYWJsZTsKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTWFjaGluZUp1bXBUYWJsZUluZm87CitjbGFzcyBNYWNoaW5lTG9vcEluZm87CitjbGFzcyBNYWNoaW5lTW9kdWxlSW5mbzsKK2NsYXNzIE1hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyOworY2xhc3MgTUNBc21JbmZvOworY2xhc3MgTUNDRklJbnN0cnVjdGlvbjsKK3N0cnVjdCBNQ0NvZGVQYWRkaW5nQ29udGV4dDsKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIE1DSW5zdDsKK2NsYXNzIE1DU2VjdGlvbjsKK2NsYXNzIE1DU3RyZWFtZXI7CitjbGFzcyBNQ1N1YnRhcmdldEluZm87CitjbGFzcyBNQ1N5bWJvbDsKK2NsYXNzIE1DVGFyZ2V0T3B0aW9uczsKK2NsYXNzIE1ETm9kZTsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKKworLy8vIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBhIGRyaXZpbmcgY2xhc3MgZm9yIGFsbCBhc20gd3JpdGVycy4KK2NsYXNzIEFzbVByaW50ZXIgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CitwdWJsaWM6CisgIC8vLyBUYXJnZXQgbWFjaGluZSBkZXNjcmlwdGlvbi4KKyAgVGFyZ2V0TWFjaGluZSAmVE07CisKKyAgLy8vIFRhcmdldCBBc20gUHJpbnRlciBpbmZvcm1hdGlvbi4KKyAgY29uc3QgTUNBc21JbmZvICpNQUk7CisKKyAgLy8vIFRoaXMgaXMgdGhlIGNvbnRleHQgZm9yIHRoZSBvdXRwdXQgZmlsZSB0aGF0IHdlIGFyZSBzdHJlYW1pbmcuIFRoaXMgb3ducworICAvLy8gYWxsIG9mIHRoZSBnbG9iYWwgTUMtcmVsYXRlZCBvYmplY3RzIGZvciB0aGUgZ2VuZXJhdGVkIHRyYW5zbGF0aW9uIHVuaXQuCisgIE1DQ29udGV4dCAmT3V0Q29udGV4dDsKKworICAvLy8gVGhpcyBpcyB0aGUgTUNTdHJlYW1lciBvYmplY3QgZm9yIHRoZSBmaWxlIHdlIGFyZSBnZW5lcmF0aW5nLiBUaGlzCisgIC8vLyBjb250YWlucyB0aGUgdHJhbnNpZW50IHN0YXRlIGZvciB0aGUgY3VycmVudCB0cmFuc2xhdGlvbiB1bml0IHRoYXQgd2UgYXJlCisgIC8vLyBnZW5lcmF0aW5nIChzdWNoIGFzIHRoZSBjdXJyZW50IHNlY3Rpb24gZXRjKS4KKyAgc3RkOjp1bmlxdWVfcHRyPE1DU3RyZWFtZXI+IE91dFN0cmVhbWVyOworCisgIC8vLyBUaGUgY3VycmVudCBtYWNoaW5lIGZ1bmN0aW9uLgorICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GID0gbnVsbHB0cjsKKworICAvLy8gVGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgTWFjaGluZU1vZHVsZUluZm8uCisgIE1hY2hpbmVNb2R1bGVJbmZvICpNTUkgPSBudWxscHRyOworCisgIC8vLyBPcHRpbWl6YXRpb24gcmVtYXJrIGVtaXR0ZXIuCisgIE1hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICpPUkU7CisKKyAgLy8vIFRoZSBzeW1ib2wgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiBUaGlzIGlzIHJlY2FsY3VsYXRlZCBhdCB0aGUgYmVnaW5uaW5nCisgIC8vLyBvZiBlYWNoIGNhbGwgdG8gcnVuT25NYWNoaW5lRnVuY3Rpb24oKS4KKyAgTUNTeW1ib2wgKkN1cnJlbnRGblN5bSA9IG51bGxwdHI7CisKKyAgLy8vIFRoZSBzeW1ib2wgdXNlZCB0byByZXByZXNlbnQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGZvciB0aGUKKyAgLy8vIHB1cnBvc2Ugb2YgY2FsY3VsYXRpbmcgaXRzIHNpemUgKGUuZy4gdXNpbmcgdGhlIC5zaXplIGRpcmVjdGl2ZSkuIEJ5CisgIC8vLyBkZWZhdWx0LCB0aGlzIGlzIGVxdWFsIHRvIEN1cnJlbnRGblN5bS4KKyAgTUNTeW1ib2wgKkN1cnJlbnRGblN5bUZvclNpemUgPSBudWxscHRyOworCisgIC8vLyBNYXAgZ2xvYmFsIEdPVCBlcXVpdmFsZW50IE1DU3ltYm9scyB0byBHbG9iYWxWYXJpYWJsZXMgYW5kIGtlZXAgdHJhY2sgb2YKKyAgLy8vIGl0cyBudW1iZXIgb2YgdXNlcyBieSBvdGhlciBnbG9iYWxzLgorICB1c2luZyBHT1RFcXVpdlVzZVBhaXIgPSBzdGQ6OnBhaXI8Y29uc3QgR2xvYmFsVmFyaWFibGUgKiwgdW5zaWduZWQ+OworICBNYXBWZWN0b3I8Y29uc3QgTUNTeW1ib2wgKiwgR09URXF1aXZVc2VQYWlyPiBHbG9iYWxHT1RFcXVpdnM7CisKKyAgLy8vIEVuYWJsZSBwcmludCBbbGF0ZW5jeTp0aHJvdWdocHV0XSBpbiBvdXRwdXQuCisgIGJvb2wgRW5hYmxlUHJpbnRTY2hlZEluZm8gPSBmYWxzZTsKKworcHJpdmF0ZToKKyAgTUNTeW1ib2wgKkN1cnJlbnRGbkJlZ2luID0gbnVsbHB0cjsKKyAgTUNTeW1ib2wgKkN1cnJlbnRGbkVuZCA9IG51bGxwdHI7CisgIE1DU3ltYm9sICpDdXJFeGNlcHRpb25TeW0gPSBudWxscHRyOworCisgIC8vIFRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gbWV0YWRhdGEgcHJpbnRlciB0YWJsZS4KKyAgdm9pZCAqR0NNZXRhZGF0YVByaW50ZXJzID0gbnVsbHB0cjsgLy8gUmVhbGx5IGEgRGVuc2VNYXAuCisKKyAgLy8vIEVtaXQgY29tbWVudHMgaW4gYXNzZW1ibHkgb3V0cHV0IGlmIHRoaXMgaXMgdHJ1ZS4KKyAgYm9vbCBWZXJib3NlQXNtOworCisgIHN0YXRpYyBjaGFyIElEOworCisgIC8vLyBJZiBWZXJib3NlQXNtIGlzIHNldCwgYSBwb2ludGVyIHRvIHRoZSBsb29wIGluZm8gZm9yIHRoaXMgZnVuY3Rpb24uCisgIE1hY2hpbmVMb29wSW5mbyAqTEkgPSBudWxscHRyOworCisgIHN0cnVjdCBIYW5kbGVySW5mbyB7CisgICAgQXNtUHJpbnRlckhhbmRsZXIgKkhhbmRsZXI7CisgICAgY29uc3QgY2hhciAqVGltZXJOYW1lOworICAgIGNvbnN0IGNoYXIgKlRpbWVyRGVzY3JpcHRpb247CisgICAgY29uc3QgY2hhciAqVGltZXJHcm91cE5hbWU7CisgICAgY29uc3QgY2hhciAqVGltZXJHcm91cERlc2NyaXB0aW9uOworCisgICAgSGFuZGxlckluZm8oQXNtUHJpbnRlckhhbmRsZXIgKkhhbmRsZXIsIGNvbnN0IGNoYXIgKlRpbWVyTmFtZSwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpUaW1lckRlc2NyaXB0aW9uLCBjb25zdCBjaGFyICpUaW1lckdyb3VwTmFtZSwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpUaW1lckdyb3VwRGVzY3JpcHRpb24pCisgICAgICAgIDogSGFuZGxlcihIYW5kbGVyKSwgVGltZXJOYW1lKFRpbWVyTmFtZSksCisgICAgICAgICAgVGltZXJEZXNjcmlwdGlvbihUaW1lckRlc2NyaXB0aW9uKSwgVGltZXJHcm91cE5hbWUoVGltZXJHcm91cE5hbWUpLAorICAgICAgICAgIFRpbWVyR3JvdXBEZXNjcmlwdGlvbihUaW1lckdyb3VwRGVzY3JpcHRpb24pIHt9CisgIH07CisKKyAgLy8vIEEgdmVjdG9yIG9mIGFsbCBkZWJ1Zy9FSCBpbmZvIGVtaXR0ZXJzIHdlIHNob3VsZCB1c2UuIFRoaXMgdmVjdG9yCisgIC8vLyBtYWludGFpbnMgb3duZXJzaGlwIG9mIHRoZSBlbWl0dGVycy4KKyAgU21hbGxWZWN0b3I8SGFuZGxlckluZm8sIDE+IEhhbmRsZXJzOworCitwdWJsaWM6CisgIHN0cnVjdCBTcmNNZ3JEaWFnSW5mbyB7CisgICAgU291cmNlTWdyIFNyY01ncjsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBNRE5vZGUgKj4gTG9jSW5mb3M7CisgICAgTExWTUNvbnRleHQ6OklubGluZUFzbURpYWdIYW5kbGVyVHkgRGlhZ0hhbmRsZXI7CisgICAgdm9pZCAqRGlhZ0NvbnRleHQ7CisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBTdHJ1Y3R1cmUgZm9yIGdlbmVyYXRpbmcgZGlhZ25vc3RpY3MgZm9yIGlubGluZSBhc3NlbWJseS4gT25seSBpbml0aWFsaXNlZAorICAvLy8gd2hlbiBuZWNlc3NhcnkuCisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPFNyY01nckRpYWdJbmZvPiBEaWFnSW5mbzsKKworICAvLy8gSWYgdGhlIHRhcmdldCBzdXBwb3J0cyBkd2FyZiBkZWJ1ZyBpbmZvLCB0aGlzIHBvaW50ZXIgaXMgbm9uLW51bGwuCisgIER3YXJmRGVidWcgKkREID0gbnVsbHB0cjsKKworICAvLy8gSWYgdGhlIGN1cnJlbnQgbW9kdWxlIHVzZXMgZHdhcmYgQ0ZJIGFubm90YXRpb25zIHN0cmljdGx5IGZvciBkZWJ1Z2dpbmcuCisgIGJvb2wgaXNDRklNb3ZlRm9yRGVidWdnaW5nID0gZmFsc2U7CisKK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgQXNtUHJpbnRlcihUYXJnZXRNYWNoaW5lICZUTSwgc3RkOjp1bmlxdWVfcHRyPE1DU3RyZWFtZXI+IFN0cmVhbWVyKTsKKworcHVibGljOgorICB+QXNtUHJpbnRlcigpIG92ZXJyaWRlOworCisgIER3YXJmRGVidWcgKmdldER3YXJmRGVidWcoKSB7IHJldHVybiBERDsgfQorICBEd2FyZkRlYnVnICpnZXREd2FyZkRlYnVnKCkgY29uc3QgeyByZXR1cm4gREQ7IH0KKworICB1aW50MTZfdCBnZXREd2FyZlZlcnNpb24oKSBjb25zdDsKKyAgdm9pZCBzZXREd2FyZlZlcnNpb24odWludDE2X3QgVmVyc2lvbik7CisKKyAgYm9vbCBpc1Bvc2l0aW9uSW5kZXBlbmRlbnQoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgYXNzZW1ibHkgb3V0cHV0IHNob3VsZCBjb250YWluIGNvbW1lbnRzLgorICBib29sIGlzVmVyYm9zZSgpIGNvbnN0IHsgcmV0dXJuIFZlcmJvc2VBc207IH0KKworICAvLy8gUmV0dXJuIGEgdW5pcXVlIElEIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgdW5zaWduZWQgZ2V0RnVuY3Rpb25OdW1iZXIoKSBjb25zdDsKKworICBNQ1N5bWJvbCAqZ2V0RnVuY3Rpb25CZWdpbigpIGNvbnN0IHsgcmV0dXJuIEN1cnJlbnRGbkJlZ2luOyB9CisgIE1DU3ltYm9sICpnZXRGdW5jdGlvbkVuZCgpIGNvbnN0IHsgcmV0dXJuIEN1cnJlbnRGbkVuZDsgfQorICBNQ1N5bWJvbCAqZ2V0Q3VyRXhjZXB0aW9uU3ltKCk7CisKKyAgLy8vIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBvYmplY3QgZmlsZSBsb3dlcmluZy4KKyAgY29uc3QgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlICZnZXRPYmpGaWxlTG93ZXJpbmcoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGRhdGEgbGF5b3V0LgorICBjb25zdCBEYXRhTGF5b3V0ICZnZXREYXRhTGF5b3V0KCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgcG9pbnRlciBzaXplIGZyb20gdGhlIFRhcmdldE1hY2hpbmUKKyAgdW5zaWduZWQgZ2V0UG9pbnRlclNpemUoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHN1YnRhcmdldC4KKyAgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZnZXRTdWJ0YXJnZXRJbmZvKCkgY29uc3Q7CisKKyAgdm9pZCBFbWl0VG9TdHJlYW1lcihNQ1N0cmVhbWVyICZTLCBjb25zdCBNQ0luc3QgJkluc3QpOworCisgIC8vLyBSZXR1cm4gdGhlIGN1cnJlbnQgc2VjdGlvbiB3ZSBhcmUgZW1pdHRpbmcgdG8uCisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0Q3VycmVudFNlY3Rpb24oKSBjb25zdDsKKworICB2b2lkIGdldE5hbWVXaXRoUHJlZml4KFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YpIGNvbnN0OworCisgIE1DU3ltYm9sICpnZXRTeW1ib2woY29uc3QgR2xvYmFsVmFsdWUgKkdWKSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFhSYXkgaW5zdHJ1bWVudGF0aW9uIGltcGxlbWVudGF0aW9uLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitwdWJsaWM6CisgIC8vIFRoaXMgZGVzY3JpYmVzIHRoZSBraW5kIG9mIHNsZWQgd2UncmUgc3RvcmluZyBpbiB0aGUgWFJheSB0YWJsZS4KKyAgZW51bSBjbGFzcyBTbGVkS2luZCA6IHVpbnQ4X3QgeworICAgIEZVTkNUSU9OX0VOVEVSID0gMCwKKyAgICBGVU5DVElPTl9FWElUID0gMSwKKyAgICBUQUlMX0NBTEwgPSAyLAorICAgIExPR19BUkdTX0VOVEVSID0gMywKKyAgICBDVVNUT01fRVZFTlQgPSA0LAorICB9OworCisgIC8vIFRoZSB0YWJsZSB3aWxsIGNvbnRhaW4gdGhlc2Ugc3RydWN0cyB0aGF0IHBvaW50IHRvIHRoZSBzbGVkLCB0aGUgZnVuY3Rpb24KKyAgLy8gY29udGFpbmluZyB0aGUgc2xlZCwgYW5kIHdoYXQga2luZCBvZiBzbGVkIChhbmQgd2hldGhlciB0aGV5IHNob3VsZCBhbHdheXMKKyAgLy8gYmUgaW5zdHJ1bWVudGVkKS4gV2UgYWxzbyB1c2UgYSB2ZXJzaW9uIGlkZW50aWZpZXIgdGhhdCB0aGUgcnVudGltZSBjYW4gdXNlCisgIC8vIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIHNsZWQsIGRlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiB0aGUgc2xlZC4KKyAgc3RydWN0IFhSYXlGdW5jdGlvbkVudHJ5IHsKKyAgICBjb25zdCBNQ1N5bWJvbCAqU2xlZDsKKyAgICBjb25zdCBNQ1N5bWJvbCAqRnVuY3Rpb247CisgICAgU2xlZEtpbmQgS2luZDsKKyAgICBib29sIEFsd2F5c0luc3RydW1lbnQ7CisgICAgY29uc3QgY2xhc3MgRnVuY3Rpb24gKkZuOworICAgIHVpbnQ4X3QgVmVyc2lvbjsKKworICAgIHZvaWQgZW1pdChpbnQsIE1DU3RyZWFtZXIgKiwgY29uc3QgTUNTeW1ib2wgKikgY29uc3Q7CisgIH07CisKKyAgLy8gQWxsIHRoZSBzbGVkcyB0byBiZSBlbWl0dGVkLgorICBTbWFsbFZlY3RvcjxYUmF5RnVuY3Rpb25FbnRyeSwgND4gU2xlZHM7CisKKyAgLy8gQSB1bmlxdWUgSUQgdXNlZCBmb3IgRUxGIHNlY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgZnVuY3Rpb24uCisgIHVuc2lnbmVkIFhSYXlGblVuaXF1ZUlEID0gMDsKKworICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gcmVjb3JkIGEgZ2l2ZW4gWFJheSBzbGVkLgorICB2b2lkIHJlY29yZFNsZWQoTUNTeW1ib2wgKlNsZWQsIGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksIFNsZWRLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICB1aW50OF90IFZlcnNpb24gPSAwKTsKKworICAvLy8gRW1pdCBhIHRhYmxlIHdpdGggYWxsIFhSYXkgaW5zdHJ1bWVudGF0aW9uIHBvaW50cy4KKyAgdm9pZCBlbWl0WFJheVRhYmxlKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBNYWNoaW5lRnVuY3Rpb25QYXNzIEltcGxlbWVudGF0aW9uLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFJlY29yZCBhbmFseXNpcyB1c2FnZS4KKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gU2V0IHVwIHRoZSBBc21QcmludGVyIHdoZW4gd2UgYXJlIHdvcmtpbmcgb24gYSBuZXcgbW9kdWxlLiBJZiB5b3VyIHBhc3MKKyAgLy8vIG92ZXJyaWRlcyB0aGlzLCBpdCBtdXN0IG1ha2Ugc3VyZSB0byBleHBsaWNpdGx5IGNhbGwgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgYm9vbCBkb0luaXRpYWxpemF0aW9uKE1vZHVsZSAmTSkgb3ZlcnJpZGU7CisKKyAgLy8vIFNodXQgZG93biB0aGUgYXNtcHJpbnRlci4gSWYgeW91IG92ZXJyaWRlIHRoaXMgaW4geW91ciBwYXNzLCB5b3UgbXVzdCBtYWtlCisgIC8vLyBzdXJlIHRvIGNhbGwgaXQgZXhwbGljaXRseS4KKyAgYm9vbCBkb0ZpbmFsaXphdGlvbihNb2R1bGUgJk0pIG92ZXJyaWRlOworCisgIC8vLyBFbWl0IHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gb3V0IHRvIHRoZSBPdXRTdHJlYW1lci4KKyAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSBvdmVycmlkZSB7CisgICAgU2V0dXBNYWNoaW5lRnVuY3Rpb24oTUYpOworICAgIEVtaXRGdW5jdGlvbkJvZHkoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIENvYXJzZSBncmFpbmVkIElSIGxvd2VyaW5nIHJvdXRpbmVzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgbmV3IE1hY2hpbmVGdW5jdGlvbiBpcyBiZWluZyBwcm9jZXNzZWQgZnJvbQorICAvLy8gcnVuT25NYWNoaW5lRnVuY3Rpb24uCisgIHZvaWQgU2V0dXBNYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGVtaXRzIHRoZSBib2R5IGFuZCB0cmFpbGVyIGZvciBhIGZ1bmN0aW9uLgorICB2b2lkIEVtaXRGdW5jdGlvbkJvZHkoKTsKKworICB2b2lkIGVtaXRDRklJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKworICB2b2lkIGVtaXRGcmFtZUFsbG9jKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpOworCisgIHZvaWQgZW1pdFN0YWNrU2l6ZVNlY3Rpb24oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKyAgZW51bSBDRklNb3ZlVHlwZSB7IENGSV9NX05vbmUsIENGSV9NX0VILCBDRklfTV9EZWJ1ZyB9OworICBDRklNb3ZlVHlwZSBuZWVkc0NGSU1vdmVzKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgZmFsc2UgaWYgbmVlZHNDRklNb3ZlcygpID09IENGSV9NX0VIIGZvciBhbnkgZnVuY3Rpb24KKyAgLy8vIGluIHRoZSBtb2R1bGUuCisgIGJvb2wgbmVlZHNPbmx5RGVidWdDRklNb3ZlcygpIGNvbnN0IHsgcmV0dXJuIGlzQ0ZJTW92ZUZvckRlYnVnZ2luZzsgfQorCisgIGJvb2wgbmVlZHNTRUhNb3ZlcygpOworCisgIC8vLyBQcmludCB0byB0aGUgY3VycmVudCBvdXRwdXQgc3RyZWFtIGFzc2VtYmx5IHJlcHJlc2VudGF0aW9ucyBvZiB0aGUKKyAgLy8vIGNvbnN0YW50cyBpbiB0aGUgY29uc3RhbnQgcG9vbCBNQ1AuIFRoaXMgaXMgdXNlZCB0byBwcmludCBvdXQgY29uc3RhbnRzCisgIC8vLyB3aGljaCBoYXZlIGJlZW4gInNwaWxsZWQgdG8gbWVtb3J5IiBieSB0aGUgY29kZSBnZW5lcmF0b3IuCisgIHZpcnR1YWwgdm9pZCBFbWl0Q29uc3RhbnRQb29sKCk7CisKKyAgLy8vIFByaW50IGFzc2VtYmx5IHJlcHJlc2VudGF0aW9ucyBvZiB0aGUganVtcCB0YWJsZXMgdXNlZCBieSB0aGUgY3VycmVudAorICAvLy8gZnVuY3Rpb24gdG8gdGhlIGN1cnJlbnQgb3V0cHV0IHN0cmVhbS4KKyAgdmlydHVhbCB2b2lkIEVtaXRKdW1wVGFibGVJbmZvKCk7CisKKyAgLy8vIEVtaXQgdGhlIHNwZWNpZmllZCBnbG9iYWwgdmFyaWFibGUgdG8gdGhlIC5zIGZpbGUuCisgIHZpcnR1YWwgdm9pZCBFbWl0R2xvYmFsVmFyaWFibGUoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWKTsKKworICAvLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBzcGVjaWZpZWQgZ2xvYmFsIGlzIGEgc3BlY2lhbCBnbG9iYWwgdXNlZCBieSBMTFZNLiBJZgorICAvLy8gc28sIGVtaXQgaXQgYW5kIHJldHVybiB0cnVlLCBvdGhlcndpc2UgZG8gbm90aGluZyBhbmQgcmV0dXJuIGZhbHNlLgorICBib29sIEVtaXRTcGVjaWFsTExWTUdsb2JhbChjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpOworCisgIC8vLyBFbWl0IGFuIGFsaWdubWVudCBkaXJlY3RpdmUgdG8gdGhlIHNwZWNpZmllZCBwb3dlciBvZiB0d28gYm91bmRhcnkuIEZvcgorICAvLy8gZXhhbXBsZSwgaWYgeW91IHBhc3MgaW4gMyBoZXJlLCB5b3Ugd2lsbCBnZXQgYW4gOCBieXRlIGFsaWdubWVudC4gSWYgYQorICAvLy8gZ2xvYmFsIHZhbHVlIGlzIHNwZWNpZmllZCwgYW5kIGlmIHRoYXQgZ2xvYmFsIGhhcyBhbiBleHBsaWNpdCBhbGlnbm1lbnQKKyAgLy8vIHJlcXVlc3RlZCwgaXQgd2lsbCBvdmVycmlkZSB0aGUgYWxpZ25tZW50IHJlcXVlc3QgaWYgcmVxdWlyZWQgZm9yCisgIC8vLyBjb3JyZWN0bmVzcy4KKyAgdm9pZCBFbWl0QWxpZ25tZW50KHVuc2lnbmVkIE51bUJpdHMsIGNvbnN0IEdsb2JhbE9iamVjdCAqR08gPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gTG93ZXIgdGhlIHNwZWNpZmllZCBMTFZNIENvbnN0YW50IHRvIGFuIE1DRXhwci4KKyAgdmlydHVhbCBjb25zdCBNQ0V4cHIgKmxvd2VyQ29uc3RhbnQoY29uc3QgQ29uc3RhbnQgKkNWKTsKKworICAvLy8gXGJyaWVmIFByaW50IGEgZ2VuZXJhbCBMTFZNIGNvbnN0YW50IHRvIHRoZSAucyBmaWxlLgorICB2b2lkIEVtaXRHbG9iYWxDb25zdGFudChjb25zdCBEYXRhTGF5b3V0ICZETCwgY29uc3QgQ29uc3RhbnQgKkNWKTsKKworICAvLy8gXGJyaWVmIFVubmFtZWQgY29uc3RhbnQgZ2xvYmFsIHZhcmlhYmxlcyBzb2xlbHkgY29udGFuaW5nIGEgcG9pbnRlciB0bworICAvLy8gYW5vdGhlciBnbG9iYWxzIHZhcmlhYmxlIGFjdCBsaWtlIGEgZ2xvYmFsIHZhcmlhYmxlICJwcm94eSIsIG9yIEdPVAorICAvLy8gZXF1aXZhbGVudHMsIGkuZS4sIGl0J3Mgb25seSB1c2VkIHRvIGhvbGQgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhdHRlci4gT25lCisgIC8vLyBvcHRpbWl6YXRpb24gaXMgdG8gcmVwbGFjZSBhY2Nlc3NlcyB0byB0aGVzZSBwcm94aWVzIGJ5IHVzaW5nIHRoZSBHT1QKKyAgLy8vIGVudHJ5IGZvciB0aGUgZmluYWwgZ2xvYmFsIGluc3RlYWQuIEhlbmNlLCB3ZSBzZWxlY3QgR09UIGVxdWl2YWxlbnQKKyAgLy8vIGNhbmRpZGF0ZXMgYW1vbmcgYWxsIHRoZSBtb2R1bGUgZ2xvYmFsIHZhcmlhYmxlcywgYXZvaWQgZW1pdHRpbmcgdGhlbQorICAvLy8gdW5uZWNlc3NhcmlseSBhbmQgZmluYWxseSByZXBsYWNlIHJlZmVyZW5jZXMgdG8gdGhlbSBieSBwYyByZWxhdGl2ZQorICAvLy8gYWNjZXNzZXMgdG8gR09UIGVudHJpZXMuCisgIHZvaWQgY29tcHV0ZUdsb2JhbEdPVEVxdWl2cyhNb2R1bGUgJk0pOworCisgIC8vLyBcYnJpZWYgQ29uc3RhbnQgZXhwcmVzc2lvbnMgdXNpbmcgR09UIGVxdWl2YWxlbnQgZ2xvYmFscyBtYXkgbm90IGJlCisgIC8vLyBlbGlnaWJsZSBmb3IgUEMgcmVsYXRpdmUgR09UIGVudHJ5IGNvbnZlcnNpb24sIGluIHN1Y2ggY2FzZXMgd2UgbmVlZCB0bworICAvLy8gZW1pdCB0aGUgcHJveGllcyB3ZSBwcmV2aW91c2x5IG9taXR0ZWQgaW4gRW1pdEdsb2JhbFZhcmlhYmxlLgorICB2b2lkIGVtaXRHbG9iYWxHT1RFcXVpdnMoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE92ZXJyaWRhYmxlIEhvb2tzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLyBUYXJnZXRzIGNhbiwgb3IgaW4gdGhlIGNhc2Ugb2YgRW1pdEluc3RydWN0aW9uLCBtdXN0IGltcGxlbWVudCB0aGVzZSB0bworICAvLyBjdXN0b21pemUgb3V0cHV0LgorCisgIC8vLyBUaGlzIHZpcnR1YWwgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRhcmdldHMgdGhhdCB3YW50IHRvIGVtaXQKKyAgLy8vIHNvbWV0aGluZyBhdCB0aGUgc3RhcnQgb2YgdGhlaXIgZmlsZS4KKyAgdmlydHVhbCB2b2lkIEVtaXRTdGFydE9mQXNtRmlsZShNb2R1bGUgJikge30KKworICAvLy8gVGhpcyB2aXJ0dWFsIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0YXJnZXRzIHRoYXQgd2FudCB0byBlbWl0CisgIC8vLyBzb21ldGhpbmcgYXQgdGhlIGVuZCBvZiB0aGVpciBmaWxlLgorICB2aXJ0dWFsIHZvaWQgRW1pdEVuZE9mQXNtRmlsZShNb2R1bGUgJikge30KKworICAvLy8gVGFyZ2V0cyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBlbWl0IHN0dWZmIGJlZm9yZSB0aGUgZmlyc3QgYmFzaWMgYmxvY2sgaW4KKyAgLy8vIHRoZSBmdW5jdGlvbi4KKyAgdmlydHVhbCB2b2lkIEVtaXRGdW5jdGlvbkJvZHlTdGFydCgpIHt9CisKKyAgLy8vIFRhcmdldHMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gZW1pdCBzdHVmZiBhZnRlciB0aGUgbGFzdCBiYXNpYyBibG9jayBpbiB0aGUKKyAgLy8vIGZ1bmN0aW9uLgorICB2aXJ0dWFsIHZvaWQgRW1pdEZ1bmN0aW9uQm9keUVuZCgpIHt9CisKKyAgLy8vIFRhcmdldHMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gZW1pdCBzdHVmZiBhdCB0aGUgc3RhcnQgb2YgYSBiYXNpYyBibG9jay4KKyAgLy8vIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIHByaW50cyB0aGUgbGFiZWwgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIE1hY2hpbmVCYXNpY0Jsb2NrLCBhbiBhbGlnbm1lbnQgKGlmIHByZXNlbnQpIGFuZCBhIGNvbW1lbnQgZGVzY3JpYmluZyBpdAorICAvLy8gaWYgYXBwcm9wcmlhdGUuCisgIHZpcnR1YWwgdm9pZCBFbWl0QmFzaWNCbG9ja1N0YXJ0KGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIGNvbnN0OworCisgIC8vLyBUYXJnZXRzIGNhbiBvdmVycmlkZSB0aGlzIHRvIGVtaXQgc3R1ZmYgYXQgdGhlIGVuZCBvZiBhIGJhc2ljIGJsb2NrLgorICB2aXJ0dWFsIHZvaWQgRW1pdEJhc2ljQmxvY2tFbmQoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKyAgLy8vIFRhcmdldHMgc2hvdWxkIGltcGxlbWVudCB0aGlzIHRvIGVtaXQgaW5zdHJ1Y3Rpb25zLgorICB2aXJ0dWFsIHZvaWQgRW1pdEluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAqKSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiRW1pdEluc3RydWN0aW9uIG5vdCBpbXBsZW1lbnRlZCIpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgc3ltYm9sIGZvciB0aGUgc3BlY2lmaWVkIGNvbnN0YW50IHBvb2wgZW50cnkuCisgIHZpcnR1YWwgTUNTeW1ib2wgKkdldENQSVN5bWJvbCh1bnNpZ25lZCBDUElEKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgRW1pdEZ1bmN0aW9uRW50cnlMYWJlbCgpOworCisgIHZpcnR1YWwgdm9pZCBFbWl0TWFjaGluZUNvbnN0YW50UG9vbFZhbHVlKE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSAqTUNQVik7CisKKyAgLy8vIFRhcmdldHMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gY2hhbmdlIGhvdyBnbG9iYWwgY29uc3RhbnRzIHRoYXQgYXJlIHBhcnQgb2YKKyAgLy8vIGEgQysrIHN0YXRpYy9nbG9iYWwgY29uc3RydWN0b3IgbGlzdCBhcmUgZW1pdHRlZC4KKyAgdmlydHVhbCB2b2lkIEVtaXRYWFN0cnVjdG9yKGNvbnN0IERhdGFMYXlvdXQgJkRMLCBjb25zdCBDb25zdGFudCAqQ1YpIHsKKyAgICBFbWl0R2xvYmFsQ29uc3RhbnQoREwsIENWKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYmFzaWMgYmxvY2sgaGFzIGV4YWN0bHkgb25lIHByZWRlY2Vzc29yIGFuZCB0aGUgY29udHJvbAorICAvLy8gdHJhbnNmZXIgbWVjaGFuaXNtIGJldHdlZW4gdGhlIHByZWRlY2Vzc29yIGFuZCB0aGlzIGJsb2NrIGlzIGEKKyAgLy8vIGZhbGwtdGhyb3VnaC4KKyAgdmlydHVhbCBib29sCisgIGlzQmxvY2tPbmx5UmVhY2hhYmxlQnlGYWxsdGhyb3VnaChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKKworICAvLy8gVGFyZ2V0cyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBjdXN0b21pemUgdGhlIG91dHB1dCBvZiBJTVBMSUNJVF9ERUYKKyAgLy8vIGluc3RydWN0aW9ucyBpbiB2ZXJib3NlIG1vZGUuCisgIHZpcnR1YWwgdm9pZCBlbWl0SW1wbGljaXREZWYoY29uc3QgTWFjaGluZUluc3RyICpNSSkgY29uc3Q7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBTeW1ib2wgTG93ZXJpbmcgUm91dGluZXMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBNQ1N5bWJvbCAqY3JlYXRlVGVtcFN5bWJvbChjb25zdCBUd2luZSAmTmFtZSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgTUNTeW1ib2wgZm9yIGEgcHJpdmF0ZSBzeW1ib2wgd2l0aCBnbG9iYWwgdmFsdWUgbmFtZSBhcyBpdHMKKyAgLy8vIGJhc2UsIHdpdGggdGhlIHNwZWNpZmllZCBzdWZmaXguCisgIE1DU3ltYm9sICpnZXRTeW1ib2xXaXRoR2xvYmFsVmFsdWVCYXNlKGNvbnN0IEdsb2JhbFZhbHVlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFN1ZmZpeCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgTUNTeW1ib2wgZm9yIHRoZSBzcGVjaWZpZWQgRXh0ZXJuYWxTeW1ib2wuCisgIE1DU3ltYm9sICpHZXRFeHRlcm5hbFN5bWJvbFN5bWJvbChTdHJpbmdSZWYgU3ltKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBzeW1ib2wgZm9yIHRoZSBzcGVjaWZpZWQganVtcCB0YWJsZSBlbnRyeS4KKyAgTUNTeW1ib2wgKkdldEpUSVN5bWJvbCh1bnNpZ25lZCBKVElELCBib29sIGlzTGlua2VyUHJpdmF0ZSA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBzeW1ib2wgZm9yIHRoZSBzcGVjaWZpZWQganVtcCB0YWJsZSAuc2V0CisgIC8vLyBGSVhNRTogcHJpdmF0aXplIHRvIEFzbVByaW50ZXIuCisgIE1DU3ltYm9sICpHZXRKVFNldFN5bWJvbCh1bnNpZ25lZCBVSUQsIHVuc2lnbmVkIE1CQklEKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBNQ1N5bWJvbCB1c2VkIHRvIHNhdGlzZnkgQmxvY2tBZGRyZXNzIHVzZXMgb2YgdGhlIHNwZWNpZmllZAorICAvLy8gYmFzaWMgYmxvY2suCisgIE1DU3ltYm9sICpHZXRCbG9ja0FkZHJlc3NTeW1ib2woY29uc3QgQmxvY2tBZGRyZXNzICpCQSkgY29uc3Q7CisgIE1DU3ltYm9sICpHZXRCbG9ja0FkZHJlc3NTeW1ib2woY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gRW1pc3Npb24gSGVscGVyIFJvdXRpbmVzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFRoaXMgaXMganVzdCBjb252ZW5pZW50IGhhbmRsZXIgZm9yIHByaW50aW5nIG9mZnNldHMuCisgIHZvaWQgcHJpbnRPZmZzZXQoaW50NjRfdCBPZmZzZXQsIHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8vIEVtaXQgYSBieXRlIGRpcmVjdGl2ZSBhbmQgdmFsdWUuCisgIHZvaWQgZW1pdEludDgoaW50IFZhbHVlKSBjb25zdDsKKworICAvLy8gRW1pdCBhIHNob3J0IGRpcmVjdGl2ZSBhbmQgdmFsdWUuCisgIHZvaWQgZW1pdEludDE2KGludCBWYWx1ZSkgY29uc3Q7CisKKyAgLy8vIEVtaXQgYSBsb25nIGRpcmVjdGl2ZSBhbmQgdmFsdWUuCisgIHZvaWQgZW1pdEludDMyKGludCBWYWx1ZSkgY29uc3Q7CisKKyAgLy8vIEVtaXQgc29tZXRoaW5nIGxpa2UgIi5sb25nIEhpLUxvIiB3aGVyZSB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZGlyZWN0aXZlCisgIC8vLyBpcyBzcGVjaWZpZWQgYnkgU2l6ZSBhbmQgSGkvTG8gc3BlY2lmeSB0aGUgbGFiZWxzLiAgVGhpcyBpbXBsaWNpdGx5IHVzZXMKKyAgLy8vIC5zZXQgaWYgaXQgaXMgYXZhaWxhYmxlLgorICB2b2lkIEVtaXRMYWJlbERpZmZlcmVuY2UoY29uc3QgTUNTeW1ib2wgKkhpLCBjb25zdCBNQ1N5bWJvbCAqTG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTaXplKSBjb25zdDsKKworICAvLy8gRW1pdCBzb21ldGhpbmcgbGlrZSAiLnVsZWIxMjggSGktTG8iLgorICB2b2lkIEVtaXRMYWJlbERpZmZlcmVuY2VBc1VMRUIxMjgoY29uc3QgTUNTeW1ib2wgKkhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKkxvKSBjb25zdDsKKworICAvLy8gRW1pdCBzb21ldGhpbmcgbGlrZSAiLmxvbmcgTGFiZWwrT2Zmc2V0IiB3aGVyZSB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUKKyAgLy8vIGRpcmVjdGl2ZSBpcyBzcGVjaWZpZWQgYnkgU2l6ZSBhbmQgTGFiZWwgc3BlY2lmaWVzIHRoZSBsYWJlbC4gIFRoaXMKKyAgLy8vIGltcGxpY2l0bHkgdXNlcyAuc2V0IGlmIGl0IGlzIGF2YWlsYWJsZS4KKyAgdm9pZCBFbWl0TGFiZWxQbHVzT2Zmc2V0KGNvbnN0IE1DU3ltYm9sICpMYWJlbCwgdWludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSwgYm9vbCBJc1NlY3Rpb25SZWxhdGl2ZSA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gRW1pdCBzb21ldGhpbmcgbGlrZSAiLmxvbmcgTGFiZWwiIHdoZXJlIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBkaXJlY3RpdmUKKyAgLy8vIGlzIHNwZWNpZmllZCBieSBTaXplIGFuZCBMYWJlbCBzcGVjaWZpZXMgdGhlIGxhYmVsLgorICB2b2lkIEVtaXRMYWJlbFJlZmVyZW5jZShjb25zdCBNQ1N5bWJvbCAqTGFiZWwsIHVuc2lnbmVkIFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNTZWN0aW9uUmVsYXRpdmUgPSBmYWxzZSkgY29uc3QgeworICAgIEVtaXRMYWJlbFBsdXNPZmZzZXQoTGFiZWwsIDAsIFNpemUsIElzU2VjdGlvblJlbGF0aXZlKTsKKyAgfQorCisgIC8vLyBFbWl0IHNvbWV0aGluZyBsaWtlICIubG9uZyBMYWJlbCArIE9mZnNldCIuCisgIHZvaWQgRW1pdER3YXJmT2Zmc2V0KGNvbnN0IE1DU3ltYm9sICpMYWJlbCwgdWludDY0X3QgT2Zmc2V0KSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIER3YXJmIEVtaXNzaW9uIEhlbHBlciBSb3V0aW5lcworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIEVtaXQgdGhlIHNwZWNpZmllZCBzaWduZWQgbGViMTI4IHZhbHVlLgorICB2b2lkIEVtaXRTTEVCMTI4KGludDY0X3QgVmFsdWUsIGNvbnN0IGNoYXIgKkRlc2MgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gRW1pdCB0aGUgc3BlY2lmaWVkIHVuc2lnbmVkIGxlYjEyOCB2YWx1ZS4KKyAgdm9pZCBFbWl0VUxFQjEyOCh1aW50NjRfdCBWYWx1ZSwgY29uc3QgY2hhciAqRGVzYyA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBFbWl0IGEgLmJ5dGUgNDIgZGlyZWN0aXZlIHRoYXQgY29ycmVzcG9uZHMgdG8gYW4gZW5jb2RpbmcuICBJZiB2ZXJib3NlCisgIC8vLyBhc3NlbWJseSBvdXRwdXQgaXMgZW5hYmxlZCwgd2Ugb3V0cHV0IGNvbW1lbnRzIGRlc2NyaWJpbmcgdGhlIGVuY29kaW5nLgorICAvLy8gRGVzYyBpcyBhIHN0cmluZyBzYXlpbmcgd2hhdCB0aGUgZW5jb2RpbmcgaXMgc3BlY2lmeWluZyAoZS5nLiAiTFNEQSIpLgorICB2b2lkIEVtaXRFbmNvZGluZ0J5dGUodW5zaWduZWQgVmFsLCBjb25zdCBjaGFyICpEZXNjID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZW5jb2RpbmcgaW4gYnl0ZXMuCisgIHVuc2lnbmVkIEdldFNpemVPZkVuY29kZWRWYWx1ZSh1bnNpZ25lZCBFbmNvZGluZykgY29uc3Q7CisKKyAgLy8vIEVtaXQgcmVmZXJlbmNlIHRvIGEgdHR5cGUgZ2xvYmFsIHdpdGggYSBzcGVjaWZpZWQgZW5jb2RpbmcuCisgIHZvaWQgRW1pdFRUeXBlUmVmZXJlbmNlKGNvbnN0IEdsb2JhbFZhbHVlICpHViwgdW5zaWduZWQgRW5jb2RpbmcpIGNvbnN0OworCisgIC8vLyBFbWl0IGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGZvciB1c2UgaW4gZHdhcmYuIERpZmZlcmVudCBvYmplY3QgZm9ybWF0cworICAvLy8gcmVwcmVzZW50IHRoaXMgaW4gZGlmZmVyZW50IHdheXMuIFNvbWUgdXNlIGEgcmVsb2NhdGlvbiBvdGhlcnMgZW5jb2RlCisgIC8vLyB0aGUgbGFiZWwgb2Zmc2V0IGluIGl0cyBzZWN0aW9uLgorICB2b2lkIGVtaXREd2FyZlN5bWJvbFJlZmVyZW5jZShjb25zdCBNQ1N5bWJvbCAqTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRm9yY2VPZmZzZXQgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIEVtaXQgdGhlIDQtYnl0ZSBvZmZzZXQgb2YgYSBzdHJpbmcgZnJvbSB0aGUgc3RhcnQgb2YgaXRzIHNlY3Rpb24uCisgIC8vLworICAvLy8gV2hlbiBwb3NzaWJsZSwgZW1pdCBhIER3YXJmU3RyaW5nUG9vbCBzZWN0aW9uIG9mZnNldCB3aXRob3V0IGFueQorICAvLy8gcmVsb2NhdGlvbnMsIGFuZCB3aXRob3V0IHVzaW5nIHRoZSBzeW1ib2wuICBPdGhlcndpc2UsIGRlZmVycyB0byBcYQorICAvLy8gZW1pdER3YXJmU3ltYm9sUmVmZXJlbmNlKCkuCisgIHZvaWQgZW1pdER3YXJmU3RyaW5nT2Zmc2V0KER3YXJmU3RyaW5nUG9vbEVudHJ5IFMpIGNvbnN0OworCisgIC8vLyBFbWl0IHRoZSA0LWJ5dGUgb2Zmc2V0IG9mIGEgc3RyaW5nIGZyb20gdGhlIHN0YXJ0IG9mIGl0cyBzZWN0aW9uLgorICB2b2lkIGVtaXREd2FyZlN0cmluZ09mZnNldChEd2FyZlN0cmluZ1Bvb2xFbnRyeVJlZiBTKSBjb25zdCB7CisgICAgZW1pdER3YXJmU3RyaW5nT2Zmc2V0KFMuZ2V0RW50cnkoKSk7CisgIH0KKworICAvLy8gR2V0IHRoZSB2YWx1ZSBmb3IgRFdfQVRfQVBQTEVfaXNhLiBaZXJvIGlmIG5vIGlzYSBlbmNvZGluZyBzcGVjaWZpZWQuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SVNBRW5jb2RpbmcoKSB7IHJldHVybiAwOyB9CisKKyAgLy8vIEVtaXQgdGhlIGRpcmVjdGl2ZSBhbmQgdmFsdWUgZm9yIGRlYnVnIHRocmVhZCBsb2NhbCBleHByZXNzaW9uCisgIC8vLworICAvLy8gXHAgVmFsdWUgLSBUaGUgdmFsdWUgdG8gZW1pdC4KKyAgLy8vIFxwIFNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgaW50ZWdlciAoaW4gYnl0ZXMpIHRvIGVtaXQuCisgIHZpcnR1YWwgdm9pZCBFbWl0RGVidWdUaHJlYWRMb2NhbChjb25zdCBNQ0V4cHIgKlZhbHVlLCB1bnNpZ25lZCBTaXplKSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIER3YXJmIExvd2VyaW5nIFJvdXRpbmVzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIEVtaXQgZnJhbWUgaW5zdHJ1Y3Rpb24gdG8gZGVzY3JpYmUgdGhlIGxheW91dCBvZiB0aGUgZnJhbWUuCisgIHZvaWQgZW1pdENGSUluc3RydWN0aW9uKGNvbnN0IE1DQ0ZJSW5zdHJ1Y3Rpb24gJkluc3QpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRW1pdCBEd2FyZiBhYmJyZXZpYXRpb24gdGFibGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGVtaXREd2FyZkFiYnJldnMoY29uc3QgVCAmQWJicmV2cykgY29uc3QgeworICAgIC8vIEZvciBlYWNoIGFiYnJldmlhdGlvbi4KKyAgICBmb3IgKGNvbnN0IGF1dG8gJkFiYnJldiA6IEFiYnJldnMpCisgICAgICBlbWl0RHdhcmZBYmJyZXYoKkFiYnJldik7CisKKyAgICAvLyBNYXJrIGVuZCBvZiBhYmJyZXZpYXRpb25zLgorICAgIEVtaXRVTEVCMTI4KDAsICJFT00oMykiKTsKKyAgfQorCisgIHZvaWQgZW1pdER3YXJmQWJicmV2KGNvbnN0IERJRUFiYnJldiAmQWJicmV2KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJlY3Vyc2l2ZWx5IGVtaXQgRHdhcmYgRElFIHRyZWUuCisgIHZvaWQgZW1pdER3YXJmRElFKGNvbnN0IERJRSAmRGllKSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIElubGluZSBBc20gU3VwcG9ydAorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8gVGhlc2UgYXJlIGhvb2tzIHRoYXQgdGFyZ2V0cyBjYW4gb3ZlcnJpZGUgdG8gaW1wbGVtZW50IGlubGluZSBhc20KKyAgLy8gc3VwcG9ydC4gIFRoZXNlIHNob3VsZCBwcm9iYWJseSBiZSBtb3ZlZCBvdXQgb2YgQXNtUHJpbnRlciBzb21lZGF5LgorCisgIC8vLyBQcmludCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0ciB0aGF0IGlzCisgIC8vLyBpbmRlcGVuZGVudCBvZiB0aGUgb3BlcmFuZCwgYW5kIG1heSBiZSBpbmRlcGVuZGVudCBvZiB0aGUgaW5zdHIgaXRzZWxmLgorICAvLy8gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBwb3J0YWJseSBlbmNvZGluZyB0aGUgY29tbWVudCBjaGFyYWN0ZXIgb3Igb3RoZXIKKyAgLy8vIGJpdHMgb2YgdGFyZ2V0LXNwZWNpZmljIGtub3dsZWRnZSBpbnRvIHRoZSBhc21zdHJpbmdzLiAgVGhlIHN5bnRheCB1c2VkIGlzCisgIC8vLyAkezpjb21tZW50fS4gIFRhcmdldHMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gYWRkIHN1cHBvcnQgZm9yIHRoZWlyIG93bgorICAvLy8gc3RyYW5nZSBjb2Rlcy4KKyAgdmlydHVhbCB2b2lkIFByaW50U3BlY2lhbChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCByYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqQ29kZSkgY29uc3Q7CisKKyAgLy8vIFByaW50IHRoZSBzcGVjaWZpZWQgb3BlcmFuZCBvZiBNSSwgYW4gSU5MSU5FQVNNIGluc3RydWN0aW9uLCB1c2luZyB0aGUKKyAgLy8vIHNwZWNpZmllZCBhc3NlbWJsZXIgdmFyaWFudC4gIFRhcmdldHMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgdG8gZm9ybWF0IGFzCisgIC8vLyBhcHByb3ByaWF0ZS4gIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gdHJ1ZSBpZiB0aGUgb3BlcmFuZCBpcyBlcnJvbmVvdXMuCisgIHZpcnR1YWwgYm9vbCBQcmludEFzbU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBc21WYXJpYW50LCBjb25zdCBjaGFyICpFeHRyYUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKTsKKworICAvLy8gUHJpbnQgdGhlIHNwZWNpZmllZCBvcGVyYW5kIG9mIE1JLCBhbiBJTkxJTkVBU00gaW5zdHJ1Y3Rpb24sIHVzaW5nIHRoZQorICAvLy8gc3BlY2lmaWVkIGFzc2VtYmxlciB2YXJpYW50IGFzIGFuIGFkZHJlc3MuIFRhcmdldHMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgdG8KKyAgLy8vIGZvcm1hdCBhcyBhcHByb3ByaWF0ZS4gIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gdHJ1ZSBpZiB0aGUgb3BlcmFuZCBpcworICAvLy8gZXJyb25lb3VzLgorICB2aXJ0dWFsIGJvb2wgUHJpbnRBc21NZW1vcnlPcGVyYW5kKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHVuc2lnbmVkIE9wTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXNtVmFyaWFudCwgY29uc3QgY2hhciAqRXh0cmFDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUyk7CisKKyAgLy8vIExldCB0aGUgdGFyZ2V0IGRvIGFueXRoaW5nIGl0IG5lZWRzIHRvIGRvIGJlZm9yZSBlbWl0dGluZyBpbmxpbmVhc20uCisgIC8vLyBccCBTdGFydEluZm8gLSB0aGUgc3VidGFyZ2V0IGluZm8gYmVmb3JlIHBhcnNpbmcgaW5saW5lIGFzbQorICB2aXJ0dWFsIHZvaWQgZW1pdElubGluZUFzbVN0YXJ0KCkgY29uc3Q7CisKKyAgLy8vIExldCB0aGUgdGFyZ2V0IGRvIGFueXRoaW5nIGl0IG5lZWRzIHRvIGRvIGFmdGVyIGVtaXR0aW5nIGlubGluZWFzbS4KKyAgLy8vIFRoaXMgY2FsbGJhY2sgY2FuIGJlIHVzZWQgcmVzdG9yZSB0aGUgb3JpZ2luYWwgbW9kZSBpbiBjYXNlIHRoZQorICAvLy8gaW5saW5lYXNtIGNvbnRhaW5zIGRpcmVjdGl2ZXMgdG8gc3dpdGNoIG1vZGVzLgorICAvLy8gXHAgU3RhcnRJbmZvIC0gdGhlIG9yaWdpbmFsIHN1YnRhcmdldCBpbmZvIGJlZm9yZSBpbmxpbmUgYXNtCisgIC8vLyBccCBFbmRJbmZvICAgLSB0aGUgZmluYWwgc3VidGFyZ2V0IGluZm8gYWZ0ZXIgcGFyc2luZyB0aGUgaW5saW5lIGFzbSwKKyAgLy8vICAgICAgICAgICAgICAgIG9yIE5VTEwgaWYgdGhlIHZhbHVlIGlzIHVua25vd24uCisgIHZpcnR1YWwgdm9pZCBlbWl0SW5saW5lQXNtRW5kKGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU3RhcnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N1YnRhcmdldEluZm8gKkVuZEluZm8pIGNvbnN0OworCitwcml2YXRlOgorICAvLy8gUHJpdmF0ZSBzdGF0ZSBmb3IgUHJpbnRTcGVjaWFsKCkKKyAgLy8gQXNzaWduIGEgdW5pcXVlIElEIHRvIHRoaXMgbWFjaGluZSBpbnN0cnVjdGlvbi4KKyAgbXV0YWJsZSBjb25zdCBNYWNoaW5lSW5zdHIgKkxhc3RNSSA9IG51bGxwdHI7CisgIG11dGFibGUgdW5zaWduZWQgTGFzdEZuID0gMDsKKyAgbXV0YWJsZSB1bnNpZ25lZCBDb3VudGVyID0gfjBVOworCisgIC8vLyBUaGlzIG1ldGhvZCBlbWl0cyB0aGUgaGVhZGVyIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgdmlydHVhbCB2b2lkIEVtaXRGdW5jdGlvbkhlYWRlcigpOworCisgIC8vLyBFbWl0IGEgYmxvYiBvZiBpbmxpbmUgYXNtIHRvIHRoZSBvdXRwdXQgc3RyZWFtZXIuCisgIHZvaWQKKyAgRW1pdElubGluZUFzbShTdHJpbmdSZWYgU3RyLCBjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSwKKyAgICAgICAgICAgICAgICBjb25zdCBNQ1RhcmdldE9wdGlvbnMgJk1DT3B0aW9ucywKKyAgICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKkxvY01ETm9kZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgSW5saW5lQXNtOjpBc21EaWFsZWN0IEFzbURpYWxlY3QgPSBJbmxpbmVBc206OkFEX0FUVCkgY29uc3Q7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGZvcm1hdHMgYW5kIGVtaXRzIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0cnVjdGlvbiB0aGF0IGlzIGFuCisgIC8vLyBpbmxpbmUgYXNtLgorICB2b2lkIEVtaXRJbmxpbmVBc20oY29uc3QgTWFjaGluZUluc3RyICpNSSkgY29uc3Q7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnRlcm5hbCBJbXBsZW1lbnRhdGlvbiBEZXRhaWxzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gVGhpcyBlbWl0cyB2aXNpYmlsaXR5IGluZm9ybWF0aW9uIGFib3V0IHN5bWJvbCwgaWYgdGhpcyBpcyBzdXBwb3J0ZWQgYnkKKyAgLy8vIHRoZSB0YXJnZXQuCisgIHZvaWQgRW1pdFZpc2liaWxpdHkoTUNTeW1ib2wgKlN5bSwgdW5zaWduZWQgVmlzaWJpbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIElzRGVmaW5pdGlvbiA9IHRydWUpIGNvbnN0OworCisgIHZvaWQgRW1pdExpbmthZ2UoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCBNQ1N5bWJvbCAqR1ZTeW0pIGNvbnN0OworCisgIHZvaWQgRW1pdEp1bXBUYWJsZUVudHJ5KGNvbnN0IE1hY2hpbmVKdW1wVGFibGVJbmZvICpNSlRJLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLCB1bnNpZ25lZCB1aWQpIGNvbnN0OworICB2b2lkIEVtaXRMTFZNVXNlZExpc3QoY29uc3QgQ29uc3RhbnRBcnJheSAqSW5pdExpc3QpOworICAvLy8gRW1pdCBsbHZtLmlkZW50IG1ldGFkYXRhIGluIGFuICcuaWRlbnQnIGRpcmVjdGl2ZS4KKyAgdm9pZCBFbWl0TW9kdWxlSWRlbnRzKE1vZHVsZSAmTSk7CisgIHZvaWQgRW1pdFhYU3RydWN0b3JMaXN0KGNvbnN0IERhdGFMYXlvdXQgJkRMLCBjb25zdCBDb25zdGFudCAqTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0N0b3IpOworCisgIEdDTWV0YWRhdGFQcmludGVyICpHZXRPckNyZWF0ZUdDUHJpbnRlcihHQ1N0cmF0ZWd5ICZDKTsKKyAgLy8vIEVtaXQgR2xvYmFsQWxpYXMgb3IgR2xvYmFsSUZ1bmMuCisgIHZvaWQgZW1pdEdsb2JhbEluZGlyZWN0U3ltYm9sKE1vZHVsZSAmTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR2xvYmFsSW5kaXJlY3RTeW1ib2wmIEdJUyk7CisgIHZvaWQgc2V0dXBDb2RlUGFkZGluZ0NvbnRleHQoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvZGVQYWRkaW5nQ29udGV4dCAmQ29udGV4dCkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0FTTVBSSU5URVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0F0b21pY0V4cGFuZFV0aWxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQXRvbWljRXhwYW5kVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjljOTZiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0F0b21pY0V4cGFuZFV0aWxzLmgKQEAgLTAsMCArMSw2NSBAQAorLy89PT0tIEF0b21pY0V4cGFuZFV0aWxzLmggLSBVdGlsaXRpZXMgZm9yIGV4cGFuZGluZyBhdG9taWMgaW5zdHJ1Y3Rpb25zIC0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fQVRPTUlDRVhQQU5EVVRJTFNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fQVRPTUlDRVhQQU5EVVRJTFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JUkJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQXRvbWljT3JkZXJpbmcuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBdG9taWNSTVdJbnN0OworY2xhc3MgVmFsdWU7CisKKy8vLyBQYXJhbWV0ZXJzIChzZWUgdGhlIGV4cGFuc2lvbiBleGFtcGxlIGJlbG93KToKKy8vLyAodGhlIGJ1aWxkZXIsICVhZGRyLCAlbG9hZGVkLCAlbmV3X3ZhbCwgb3JkZXJpbmcsCisvLy8gIC8qIE9VVCAqLyAlc3VjY2VzcywgLyogT1VUICovICVuZXdfbG9hZGVkKQordXNpbmcgQ3JlYXRlQ21wWGNoZ0luc3RGdW4gPQorICAgIGZ1bmN0aW9uX3JlZjx2b2lkKElSQnVpbGRlcjw+ICYsIFZhbHVlICosIFZhbHVlICosIFZhbHVlICosIEF0b21pY09yZGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIComLCBWYWx1ZSAqJik+OworCisvLy8gXGJyaWVmIEV4cGFuZCBhbiBhdG9taWMgUk1XIGluc3RydWN0aW9uIGludG8gYSBsb29wIHV0aWxpemluZworLy8vIGNtcHhjaGcuIFlvdSdsbCB3YW50IHRvIG1ha2Ugc3VyZSB5b3VyIHRhcmdldCBtYWNoaW5lIGxpa2VzIGNtcHhjaGcKKy8vLyBpbnN0cnVjdGlvbnMgaW4gdGhlIGZpcnN0IHBsYWNlIGFuZCB0aGF0IHRoZXJlIGlzbid0IGFub3RoZXIsIGJldHRlciwKKy8vLyB0cmFuc2Zvcm1hdGlvbiBhdmFpbGFibGUgKGZvciBleGFtcGxlIEFBcmNoMzIvQUFyY2g2NCBoYXZlIGxpbmtlZCBsb2FkcykuCisvLy8KKy8vLyBUaGlzIGlzIHVzZWZ1bCBpbiBwYXNzZXMgd2hpY2ggY2FuJ3QgcmV3cml0ZSB0aGUgbW9yZSBleG90aWMgUk1XCisvLy8gaW5zdHJ1Y3Rpb25zIGRpcmVjdGx5IGludG8gYSBwbGF0Zm9ybSBzcGVjaWZpYyBpbnRyaW5zaWNzIChiZWNhdXNlLCBzYXksCisvLy8gdGhvc2UgaW50cmluc2ljcyBkb24ndCBleGlzdCkuIElmIHN1Y2ggYSBwYXNzIGlzIGFibGUgdG8gZXhwYW5kIGNtcHhjaGcKKy8vLyBpbnN0cnVjdGlvbnMgZGlyZWN0bHkgaG93ZXZlciwgdGhlbiwgd2l0aCB0aGlzIGZ1bmN0aW9uLCBpdCBjb3VsZCBhdm9pZCB0d28KKy8vLyBleHRyYSBtb2R1bGUgcGFzc2VzIChhdm9pZGluZyBwYXNzZXMgYnkgYC1hdG9taWMtZXhwYW5kYCBhbmQgaXRzZWxmKS4gQQorLy8vIHNwZWNpZmljIGV4YW1wbGUgd291bGQgYmUgUE5hQ2wncyBgUmV3cml0ZUF0b21pY3NgIHBhc3MuCisvLy8KKy8vLyBHaXZlbjogYXRvbWljcm13IHNvbWVfb3AgaU4qICVhZGRyLCBpTiAlaW5jciBvcmRlcmluZworLy8vCisvLy8gVGhlIHN0YW5kYXJkIGV4cGFuc2lvbiB3ZSBwcm9kdWNlIGlzOgorLy8vICAgICBbLi4uXQorLy8vICAgICAlaW5pdF9sb2FkZWQgPSBsb2FkIGF0b21pYyBpTiogJWFkZHIKKy8vLyAgICAgYnIgbGFiZWwgJWxvb3AKKy8vLyBsb29wOgorLy8vICAgICAlbG9hZGVkID0gcGhpIGlOIFsgJWluaXRfbG9hZGVkLCAlZW50cnkgXSwgWyAlbmV3X2xvYWRlZCwgJWxvb3AgXQorLy8vICAgICAlbmV3ID0gc29tZV9vcCBpTiAlbG9hZGVkLCAlaW5jcgorLy8vIDsgVGhpcyBpcyB3aGF0IC1hdG9taWMtZXhwYW5kIHdpbGwgcHJvZHVjZSB1c2luZyB0aGlzIGZ1bmN0aW9uIG9uIGk2ODYKKy8vLyB0YXJnZXRzOgorLy8vICAgICAlcGFpciA9IGNtcHhjaGcgaU4qICVhZGRyLCBpTiAlbG9hZGVkLCBpTiAlbmV3X3ZhbAorLy8vICAgICAlbmV3X2xvYWRlZCA9IGV4dHJhY3R2YWx1ZSB7IGlOLCBpMSB9ICVwYWlyLCAwCisvLy8gICAgICVzdWNjZXNzID0gZXh0cmFjdHZhbHVlIHsgaU4sIGkxIH0gJXBhaXIsIDEKKy8vLyA7IEVuZCBjYWxsYmFjayBwcm9kdWNlZCBJUgorLy8vICAgICBiciBpMSAlc3VjY2VzcywgbGFiZWwgJWF0b21pY3Jtdy5lbmQsIGxhYmVsICVsb29wCisvLy8gYXRvbWljcm13LmVuZDoKKy8vLyAgICAgWy4uLl0KKy8vLworLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGFpbmluZyBmdW5jdGlvbiB3YXMgbW9kaWZpZWQuCitib29sIGV4cGFuZEF0b21pY1JNV1RvQ21wWGNoZyhBdG9taWNSTVdJbnN0ICpBSSwgQ3JlYXRlQ21wWGNoZ0luc3RGdW4gRmFjdG9yeSk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fQVRPTUlDRVhQQU5EVVRJTFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0Jhc2ljVFRJSW1wbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0Jhc2ljVFRJSW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOTYyNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQmFzaWNUVElJbXBsLmgKQEAgLTAsMCArMSwxMzgzIEBACisvLz09PS0gQmFzaWNUVElJbXBsLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFRoaXMgZmlsZSBwcm92aWRlcyBhIGhlbHBlciB0aGF0IGltcGxlbWVudHMgbXVjaCBvZiB0aGUgVFRJIGludGVyZmFjZSBpbgorLy8vIHRlcm1zIG9mIHRoZSB0YXJnZXQtaW5kZXBlbmRlbnQgY29kZSBnZW5lcmF0b3IgYW5kIFRhcmdldExvd2VyaW5nCisvLy8gaW50ZXJmYWNlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9CQVNJQ1RUSUlNUExfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fQkFTSUNUVElJTVBMX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FQSW50LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVGFyZ2V0VHJhbnNmb3JtSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVGFyZ2V0VHJhbnNmb3JtSW5mb0ltcGwuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vSVNET3Bjb2Rlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRMb3dlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRTdWJ0YXJnZXRJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudC5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EYXRhTGF5b3V0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RyVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL0lSL09wZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTY2hlZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWFjaGluZVZhbHVlVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEdsb2JhbFZhbHVlOworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBTY2FsYXJFdm9sdXRpb247CitjbGFzcyBTQ0VWOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKKworZXh0ZXJuIGNsOjpvcHQ8dW5zaWduZWQ+IFBhcnRpYWxVbnJvbGxpbmdUaHJlc2hvbGQ7CisKKy8vLyBcYnJpZWYgQmFzZSBjbGFzcyB3aGljaCBjYW4gYmUgdXNlZCB0byBoZWxwIGJ1aWxkIGEgVFRJIGltcGxlbWVudGF0aW9uLgorLy8vCisvLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhcyBtdWNoIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVEkgaW50ZXJmYWNlIGFzIGlzCisvLy8gcG9zc2libGUgdXNpbmcgdGhlIHRhcmdldCBpbmRlcGVuZGVudCBwYXJ0cyBvZiB0aGUgY29kZSBnZW5lcmF0b3IuCisvLy8KKy8vLyBJbiBvcmRlciB0byBzdWJjbGFzcyBpdCwgeW91ciBjbGFzcyBtdXN0IGltcGxlbWVudCBhIGdldFNUKCkgbWV0aG9kIHRvCisvLy8gcmV0dXJuIHRoZSBzdWJ0YXJnZXQsIGFuZCBhIGdldFRMSSgpIG1ldGhvZCB0byByZXR1cm4gdGhlIHRhcmdldCBsb3dlcmluZy4KKy8vLyBXZSBuZWVkIHRoZXNlIG1ldGhvZHMgaW1wbGVtZW50ZWQgaW4gdGhlIGRlcml2ZWQgY2xhc3Mgc28gdGhhdCB0aGlzIGNsYXNzCisvLy8gZG9lc24ndCBoYXZlIHRvIGR1cGxpY2F0ZSBzdG9yYWdlIGZvciB0aGVtLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBCYXNpY1RUSUltcGxCYXNlIDogcHVibGljIFRhcmdldFRyYW5zZm9ybUluZm9JbXBsQ1JUUEJhc2U8VD4geworcHJpdmF0ZToKKyAgdXNpbmcgQmFzZVQgPSBUYXJnZXRUcmFuc2Zvcm1JbmZvSW1wbENSVFBCYXNlPFQ+OworICB1c2luZyBUVEkgPSBUYXJnZXRUcmFuc2Zvcm1JbmZvOworCisgIC8vLyBFc3RpbWF0ZSBhIGNvc3Qgb2Ygc2h1ZmZsZSBhcyBhIHNlcXVlbmNlIG9mIGV4dHJhY3QgYW5kIGluc2VydAorICAvLy8gb3BlcmF0aW9ucy4KKyAgdW5zaWduZWQgZ2V0UGVybXV0ZVNodWZmbGVPdmVyaGVhZChUeXBlICpUeSkgeworICAgIGFzc2VydChUeS0+aXNWZWN0b3JUeSgpICYmICJDYW4gb25seSBzaHVmZmxlIHZlY3RvcnMiKTsKKyAgICB1bnNpZ25lZCBDb3N0ID0gMDsKKyAgICAvLyBTaHVmZmxlIGNvc3QgaXMgZXF1YWwgdG8gdGhlIGNvc3Qgb2YgZXh0cmFjdGluZyBlbGVtZW50IGZyb20gaXRzIGFyZ3VtZW50CisgICAgLy8gcGx1cyB0aGUgY29zdCBvZiBpbnNlcnRpbmcgdGhlbSBvbnRvIHRoZSByZXN1bHQgdmVjdG9yLgorCisgICAgLy8gZS5nLiA8NCB4IGZsb2F0PiBoYXMgYSBtYXNrIG9mIDwwLDUsMiw3PiBpLmUgd2UgbmVlZCB0byBleHRyYWN0IGZyb20KKyAgICAvLyBpbmRleCAwIG9mIGZpcnN0IHZlY3RvciwgaW5kZXggMSBvZiBzZWNvbmQgdmVjdG9yLGluZGV4IDIgb2YgZmlyc3QKKyAgICAvLyB2ZWN0b3IgYW5kIGZpbmFsbHkgaW5kZXggMyBvZiBzZWNvbmQgdmVjdG9yIGFuZCBpbnNlcnQgdGhlbSBhdCBpbmRleAorICAgIC8vIDwwLDEsMiwzPiBvZiByZXN1bHQgdmVjdG9yLgorICAgIGZvciAoaW50IGkgPSAwLCBlID0gVHktPmdldFZlY3Rvck51bUVsZW1lbnRzKCk7IGkgPCBlOyArK2kpIHsKKyAgICAgIENvc3QgKz0gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKQorICAgICAgICAgICAgICAgICAgLT5nZXRWZWN0b3JJbnN0ckNvc3QoSW5zdHJ1Y3Rpb246Okluc2VydEVsZW1lbnQsIFR5LCBpKTsKKyAgICAgIENvc3QgKz0gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKQorICAgICAgICAgICAgICAgICAgLT5nZXRWZWN0b3JJbnN0ckNvc3QoSW5zdHJ1Y3Rpb246OkV4dHJhY3RFbGVtZW50LCBUeSwgaSk7CisgICAgfQorICAgIHJldHVybiBDb3N0OworICB9CisKKyAgLy8vIFxicmllZiBMb2NhbCBxdWVyeSBtZXRob2QgZGVsZWdhdGVzIHVwIHRvIFQgd2hpY2ggKm11c3QqIGltcGxlbWVudCB0aGlzIQorICBjb25zdCBUYXJnZXRTdWJ0YXJnZXRJbmZvICpnZXRTVCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgVCAqPih0aGlzKS0+Z2V0U1QoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTG9jYWwgcXVlcnkgbWV0aG9kIGRlbGVnYXRlcyB1cCB0byBUIHdoaWNoICptdXN0KiBpbXBsZW1lbnQgdGhpcyEKKyAgY29uc3QgVGFyZ2V0TG93ZXJpbmdCYXNlICpnZXRUTEkoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFQgKj4odGhpcyktPmdldFRMSSgpOworICB9CisKKyAgc3RhdGljIElTRDo6TWVtSW5kZXhlZE1vZGUgZ2V0SVNESW5kZXhlZE1vZGUoVFRJOjpNZW1JbmRleGVkTW9kZSBNKSB7CisgICAgc3dpdGNoIChNKSB7CisgICAgICBjYXNlIFRUSTo6TUlNX1VuaW5kZXhlZDoKKyAgICAgICAgcmV0dXJuIElTRDo6VU5JTkRFWEVEOworICAgICAgY2FzZSBUVEk6Ok1JTV9QcmVJbmM6CisgICAgICAgIHJldHVybiBJU0Q6OlBSRV9JTkM7CisgICAgICBjYXNlIFRUSTo6TUlNX1ByZURlYzoKKyAgICAgICAgcmV0dXJuIElTRDo6UFJFX0RFQzsKKyAgICAgIGNhc2UgVFRJOjpNSU1fUG9zdEluYzoKKyAgICAgICAgcmV0dXJuIElTRDo6UE9TVF9JTkM7CisgICAgICBjYXNlIFRUSTo6TUlNX1Bvc3REZWM6CisgICAgICAgIHJldHVybiBJU0Q6OlBPU1RfREVDOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIE1lbUluZGV4ZWRNb2RlIik7CisgIH0KKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBCYXNpY1RUSUltcGxCYXNlKGNvbnN0IFRhcmdldE1hY2hpbmUgKlRNLCBjb25zdCBEYXRhTGF5b3V0ICZETCkKKyAgICAgIDogQmFzZVQoREwpIHt9CisKKyAgdXNpbmcgVGFyZ2V0VHJhbnNmb3JtSW5mb0ltcGxCYXNlOjpETDsKKworcHVibGljOgorICAvLy8gXG5hbWUgU2NhbGFyIFRUSSBJbXBsZW1lbnRhdGlvbnMKKyAgLy8vIEB7CisgIGJvb2wgYWxsb3dzTWlzYWxpZ25lZE1lbW9yeUFjY2Vzc2VzKExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCaXRXaWR0aCwgdW5zaWduZWQgQWRkcmVzc1NwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQsIGJvb2wgKkZhc3QpIGNvbnN0IHsKKyAgICBFVlQgRSA9IEVWVDo6Z2V0SW50ZWdlclZUKENvbnRleHQsIEJpdFdpZHRoKTsKKyAgICByZXR1cm4gZ2V0VExJKCktPmFsbG93c01pc2FsaWduZWRNZW1vcnlBY2Nlc3NlcyhFLCBBZGRyZXNzU3BhY2UsIEFsaWdubWVudCwgRmFzdCk7CisgIH0KKworICBib29sIGhhc0JyYW5jaERpdmVyZ2VuY2UoKSB7IHJldHVybiBmYWxzZTsgfQorCisgIGJvb2wgaXNTb3VyY2VPZkRpdmVyZ2VuY2UoY29uc3QgVmFsdWUgKlYpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgYm9vbCBpc0Fsd2F5c1VuaWZvcm0oY29uc3QgVmFsdWUgKlYpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgdW5zaWduZWQgZ2V0RmxhdEFkZHJlc3NTcGFjZSgpIHsKKyAgICAvLyBSZXR1cm4gYW4gaW52YWxpZCBhZGRyZXNzIHNwYWNlLgorICAgIHJldHVybiAtMTsKKyAgfQorCisgIGJvb2wgaXNMZWdhbEFkZEltbWVkaWF0ZShpbnQ2NF90IGltbSkgeworICAgIHJldHVybiBnZXRUTEkoKS0+aXNMZWdhbEFkZEltbWVkaWF0ZShpbW0pOworICB9CisKKyAgYm9vbCBpc0xlZ2FsSUNtcEltbWVkaWF0ZShpbnQ2NF90IGltbSkgeworICAgIHJldHVybiBnZXRUTEkoKS0+aXNMZWdhbElDbXBJbW1lZGlhdGUoaW1tKTsKKyAgfQorCisgIGJvb2wgaXNMZWdhbEFkZHJlc3NpbmdNb2RlKFR5cGUgKlR5LCBHbG9iYWxWYWx1ZSAqQmFzZUdWLCBpbnQ2NF90IEJhc2VPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzQmFzZVJlZywgaW50NjRfdCBTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkclNwYWNlLCBJbnN0cnVjdGlvbiAqSSA9IG51bGxwdHIpIHsKKyAgICBUYXJnZXRMb3dlcmluZ0Jhc2U6OkFkZHJNb2RlIEFNOworICAgIEFNLkJhc2VHViA9IEJhc2VHVjsKKyAgICBBTS5CYXNlT2ZmcyA9IEJhc2VPZmZzZXQ7CisgICAgQU0uSGFzQmFzZVJlZyA9IEhhc0Jhc2VSZWc7CisgICAgQU0uU2NhbGUgPSBTY2FsZTsKKyAgICByZXR1cm4gZ2V0VExJKCktPmlzTGVnYWxBZGRyZXNzaW5nTW9kZShETCwgQU0sIFR5LCBBZGRyU3BhY2UsIEkpOworICB9CisKKyAgYm9vbCBpc0luZGV4ZWRMb2FkTGVnYWwoVFRJOjpNZW1JbmRleGVkTW9kZSBNLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpIGNvbnN0IHsKKyAgICBFVlQgVlQgPSBnZXRUTEkoKS0+Z2V0VmFsdWVUeXBlKERMLCBUeSk7CisgICAgcmV0dXJuIGdldFRMSSgpLT5pc0luZGV4ZWRMb2FkTGVnYWwoZ2V0SVNESW5kZXhlZE1vZGUoTSksIFZUKTsKKyAgfQorCisgIGJvb2wgaXNJbmRleGVkU3RvcmVMZWdhbChUVEk6Ok1lbUluZGV4ZWRNb2RlIE0sIFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpIGNvbnN0IHsKKyAgICBFVlQgVlQgPSBnZXRUTEkoKS0+Z2V0VmFsdWVUeXBlKERMLCBUeSk7CisgICAgcmV0dXJuIGdldFRMSSgpLT5pc0luZGV4ZWRTdG9yZUxlZ2FsKGdldElTREluZGV4ZWRNb2RlKE0pLCBWVCk7CisgIH0KKworICBib29sIGlzTFNSQ29zdExlc3MoVFRJOjpMU1JDb3N0IEMxLCBUVEk6OkxTUkNvc3QgQzIpIHsKKyAgICByZXR1cm4gVGFyZ2V0VHJhbnNmb3JtSW5mb0ltcGxCYXNlOjppc0xTUkNvc3RMZXNzKEMxLCBDMik7CisgIH0KKworICBpbnQgZ2V0U2NhbGluZ0ZhY3RvckNvc3QoVHlwZSAqVHksIEdsb2JhbFZhbHVlICpCYXNlR1YsIGludDY0X3QgQmFzZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzQmFzZVJlZywgaW50NjRfdCBTY2FsZSwgdW5zaWduZWQgQWRkclNwYWNlKSB7CisgICAgVGFyZ2V0TG93ZXJpbmdCYXNlOjpBZGRyTW9kZSBBTTsKKyAgICBBTS5CYXNlR1YgPSBCYXNlR1Y7CisgICAgQU0uQmFzZU9mZnMgPSBCYXNlT2Zmc2V0OworICAgIEFNLkhhc0Jhc2VSZWcgPSBIYXNCYXNlUmVnOworICAgIEFNLlNjYWxlID0gU2NhbGU7CisgICAgcmV0dXJuIGdldFRMSSgpLT5nZXRTY2FsaW5nRmFjdG9yQ29zdChETCwgQU0sIFR5LCBBZGRyU3BhY2UpOworICB9CisKKyAgYm9vbCBpc1RydW5jYXRlRnJlZShUeXBlICpUeTEsIFR5cGUgKlR5MikgeworICAgIHJldHVybiBnZXRUTEkoKS0+aXNUcnVuY2F0ZUZyZWUoVHkxLCBUeTIpOworICB9CisKKyAgYm9vbCBpc1Byb2ZpdGFibGVUb0hvaXN0KEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIGdldFRMSSgpLT5pc1Byb2ZpdGFibGVUb0hvaXN0KEkpOworICB9CisKKyAgYm9vbCB1c2VBQSgpIGNvbnN0IHsgcmV0dXJuIGdldFNUKCktPnVzZUFBKCk7IH0KKworICBib29sIGlzVHlwZUxlZ2FsKFR5cGUgKlR5KSB7CisgICAgRVZUIFZUID0gZ2V0VExJKCktPmdldFZhbHVlVHlwZShETCwgVHkpOworICAgIHJldHVybiBnZXRUTEkoKS0+aXNUeXBlTGVnYWwoVlQpOworICB9CisKKyAgaW50IGdldEdFUENvc3QoVHlwZSAqUG9pbnRlZVR5cGUsIGNvbnN0IFZhbHVlICpQdHIsCisgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IE9wZXJhbmRzKSB7CisgICAgcmV0dXJuIEJhc2VUOjpnZXRHRVBDb3N0KFBvaW50ZWVUeXBlLCBQdHIsIE9wZXJhbmRzKTsKKyAgfQorCisgIGludCBnZXRFeHRDb3N0KGNvbnN0IEluc3RydWN0aW9uICpJLCBjb25zdCBWYWx1ZSAqU3JjKSB7CisgICAgaWYgKGdldFRMSSgpLT5pc0V4dEZyZWUoSSkpCisgICAgICByZXR1cm4gVGFyZ2V0VHJhbnNmb3JtSW5mbzo6VENDX0ZyZWU7CisKKyAgICBpZiAoaXNhPFpFeHRJbnN0PihJKSB8fCBpc2E8U0V4dEluc3Q+KEkpKQorICAgICAgaWYgKGNvbnN0IExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihTcmMpKQorICAgICAgICBpZiAoZ2V0VExJKCktPmlzRXh0TG9hZChMSSwgSSwgREwpKQorICAgICAgICAgIHJldHVybiBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpUQ0NfRnJlZTsKKworICAgIHJldHVybiBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpUQ0NfQmFzaWM7CisgIH0KKworICB1bnNpZ25lZCBnZXRJbnRyaW5zaWNDb3N0KEludHJpbnNpYzo6SUQgSUlELCBUeXBlICpSZXRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBBcmd1bWVudHMpIHsKKyAgICByZXR1cm4gQmFzZVQ6OmdldEludHJpbnNpY0Nvc3QoSUlELCBSZXRUeSwgQXJndW1lbnRzKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldEludHJpbnNpY0Nvc3QoSW50cmluc2ljOjpJRCBJSUQsIFR5cGUgKlJldFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFR5cGUgKj4gUGFyYW1UeXMpIHsKKyAgICBpZiAoSUlEID09IEludHJpbnNpYzo6Y3R0eikgeworICAgICAgaWYgKGdldFRMSSgpLT5pc0NoZWFwVG9TcGVjdWxhdGVDdHR6KCkpCisgICAgICAgIHJldHVybiBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpUQ0NfQmFzaWM7CisgICAgICByZXR1cm4gVGFyZ2V0VHJhbnNmb3JtSW5mbzo6VENDX0V4cGVuc2l2ZTsKKyAgICB9CisKKyAgICBpZiAoSUlEID09IEludHJpbnNpYzo6Y3RseikgeworICAgICAgaWYgKGdldFRMSSgpLT5pc0NoZWFwVG9TcGVjdWxhdGVDdGx6KCkpCisgICAgICAgIHJldHVybiBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpUQ0NfQmFzaWM7CisgICAgICByZXR1cm4gVGFyZ2V0VHJhbnNmb3JtSW5mbzo6VENDX0V4cGVuc2l2ZTsKKyAgICB9CisKKyAgICByZXR1cm4gQmFzZVQ6OmdldEludHJpbnNpY0Nvc3QoSUlELCBSZXRUeSwgUGFyYW1UeXMpOworICB9CisKKyAgdW5zaWduZWQgZ2V0RXN0aW1hdGVkTnVtYmVyT2ZDYXNlQ2x1c3RlcnMoY29uc3QgU3dpdGNoSW5zdCAmU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZKdW1wVGFibGVTaXplKSB7CisgICAgLy8vIFRyeSB0byBmaW5kIHRoZSBlc3RpbWF0ZWQgbnVtYmVyIG9mIGNsdXN0ZXJzLiBOb3RlIHRoYXQgdGhlIG51bWJlciBvZgorICAgIC8vLyBjbHVzdGVycyBpZGVudGlmaWVkIGluIHRoaXMgZnVuY3Rpb24gY291bGQgYmUgZGlmZmVyZW50IGZyb20gdGhlIGFjdHVyYWwKKyAgICAvLy8gbnVtYmVycyBmb3VuZCBpbiBsb3dlcmluZy4gVGhpcyBmdW5jdGlvbiBpZ25vcmUgc3dpdGNoZXMgdGhhdCBhcmUKKyAgICAvLy8gbG93ZXJlZCB3aXRoIGEgbWl4IG9mIGp1bXAgdGFibGUgLyBiaXQgdGVzdCAvIEJUcmVlLiBUaGlzIGZ1bmN0aW9uIHdhcworICAgIC8vLyBpbml0aWFsbHkgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aGVuIGVzdGltYXRpbmcgdGhlIGNvc3Qgb2Ygc3dpdGNoIGluCisgICAgLy8vIGlubGluZSBjb3N0IGhldXJpc3RpYywgYnV0IGl0J3MgYSBnZW5lcmljIGNvc3QgbW9kZWwgdG8gYmUgdXNlZCBpbiBvdGhlcgorICAgIC8vLyBwbGFjZXMgKGUuZy4sIGluIGxvb3AgdW5yb2xsaW5nKS4KKyAgICB1bnNpZ25lZCBOID0gU0kuZ2V0TnVtQ2FzZXMoKTsKKyAgICBjb25zdCBUYXJnZXRMb3dlcmluZ0Jhc2UgKlRMSSA9IGdldFRMSSgpOworICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMID0gdGhpcy0+Z2V0RGF0YUxheW91dCgpOworCisgICAgSnVtcFRhYmxlU2l6ZSA9IDA7CisgICAgYm9vbCBJc0pUQWxsb3dlZCA9IFRMSS0+YXJlSlRzQWxsb3dlZChTSS5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCkpOworCisgICAgLy8gRWFybHkgZXhpdCBpZiBib3RoIGEganVtcCB0YWJsZSBhbmQgYml0IHRlc3QgYXJlIG5vdCBhbGxvd2VkLgorICAgIGlmIChOIDwgMSB8fCAoIUlzSlRBbGxvd2VkICYmIERMLmdldEluZGV4U2l6ZUluQml0cygwdSkgPCBOKSkKKyAgICAgIHJldHVybiBOOworCisgICAgQVBJbnQgTWF4Q2FzZVZhbCA9IFNJLmNhc2VfYmVnaW4oKS0+Z2V0Q2FzZVZhbHVlKCktPmdldFZhbHVlKCk7CisgICAgQVBJbnQgTWluQ2FzZVZhbCA9IE1heENhc2VWYWw7CisgICAgZm9yIChhdXRvIENJIDogU0kuY2FzZXMoKSkgeworICAgICAgY29uc3QgQVBJbnQgJkNhc2VWYWwgPSBDSS5nZXRDYXNlVmFsdWUoKS0+Z2V0VmFsdWUoKTsKKyAgICAgIGlmIChDYXNlVmFsLnNndChNYXhDYXNlVmFsKSkKKyAgICAgICAgTWF4Q2FzZVZhbCA9IENhc2VWYWw7CisgICAgICBpZiAoQ2FzZVZhbC5zbHQoTWluQ2FzZVZhbCkpCisgICAgICAgIE1pbkNhc2VWYWwgPSBDYXNlVmFsOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIHN1aXRhYmxlIGZvciBhIGJpdCB0ZXN0CisgICAgaWYgKE4gPD0gREwuZ2V0SW5kZXhTaXplSW5CaXRzKDB1KSkgeworICAgICAgU21hbGxQdHJTZXQ8Y29uc3QgQmFzaWNCbG9jayAqLCA0PiBEZXN0czsKKyAgICAgIGZvciAoYXV0byBJIDogU0kuY2FzZXMoKSkKKyAgICAgICAgRGVzdHMuaW5zZXJ0KEkuZ2V0Q2FzZVN1Y2Nlc3NvcigpKTsKKworICAgICAgaWYgKFRMSS0+aXNTdWl0YWJsZUZvckJpdFRlc3RzKERlc3RzLnNpemUoKSwgTiwgTWluQ2FzZVZhbCwgTWF4Q2FzZVZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETCkpCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIHN1aXRhYmxlIGZvciBhIGp1bXAgdGFibGUuCisgICAgaWYgKElzSlRBbGxvd2VkKSB7CisgICAgICBpZiAoTiA8IDIgfHwgTiA8IFRMSS0+Z2V0TWluaW11bUp1bXBUYWJsZUVudHJpZXMoKSkKKyAgICAgICAgcmV0dXJuIE47CisgICAgICB1aW50NjRfdCBSYW5nZSA9CisgICAgICAgICAgKE1heENhc2VWYWwgLSBNaW5DYXNlVmFsKQorICAgICAgICAgICAgICAuZ2V0TGltaXRlZFZhbHVlKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKSAtIDEpICsgMTsKKyAgICAgIC8vIENoZWNrIHdoZXRoZXIgYSByYW5nZSBvZiBjbHVzdGVycyBpcyBkZW5zZSBlbm91Z2ggZm9yIGEganVtcCB0YWJsZQorICAgICAgaWYgKFRMSS0+aXNTdWl0YWJsZUZvckp1bXBUYWJsZSgmU0ksIE4sIFJhbmdlKSkgeworICAgICAgICBKdW1wVGFibGVTaXplID0gUmFuZ2U7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTjsKKyAgfQorCisgIHVuc2lnbmVkIGdldEp1bXBCdWZBbGlnbm1lbnQoKSB7IHJldHVybiBnZXRUTEkoKS0+Z2V0SnVtcEJ1ZkFsaWdubWVudCgpOyB9CisKKyAgdW5zaWduZWQgZ2V0SnVtcEJ1ZlNpemUoKSB7IHJldHVybiBnZXRUTEkoKS0+Z2V0SnVtcEJ1ZlNpemUoKTsgfQorCisgIGJvb2wgc2hvdWxkQnVpbGRMb29rdXBUYWJsZXMoKSB7CisgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmdCYXNlICpUTEkgPSBnZXRUTEkoKTsKKyAgICByZXR1cm4gVExJLT5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpCUl9KVCwgTVZUOjpPdGhlcikgfHwKKyAgICAgICAgICAgVExJLT5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpCUklORCwgTVZUOjpPdGhlcik7CisgIH0KKworICBib29sIGhhdmVGYXN0U3FydChUeXBlICpUeSkgeworICAgIGNvbnN0IFRhcmdldExvd2VyaW5nQmFzZSAqVExJID0gZ2V0VExJKCk7CisgICAgRVZUIFZUID0gVExJLT5nZXRWYWx1ZVR5cGUoREwsIFR5KTsKKyAgICByZXR1cm4gVExJLT5pc1R5cGVMZWdhbChWVCkgJiYKKyAgICAgICAgICAgVExJLT5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpGU1FSVCwgVlQpOworICB9CisKKyAgYm9vbCBpc0ZDbXBPcmRDaGVhcGVyVGhhbkZDbXBaZXJvKFR5cGUgKlR5KSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB1bnNpZ25lZCBnZXRGUE9wQ29zdChUeXBlICpUeSkgeworICAgIC8vIENoZWNrIHdoZXRoZXIgRkFERCBpcyBhdmFpbGFibGUsIGFzIGEgcHJveHkgZm9yIGZsb2F0aW5nLXBvaW50IGluCisgICAgLy8gZ2VuZXJhbC4KKyAgICBjb25zdCBUYXJnZXRMb3dlcmluZ0Jhc2UgKlRMSSA9IGdldFRMSSgpOworICAgIEVWVCBWVCA9IFRMSS0+Z2V0VmFsdWVUeXBlKERMLCBUeSk7CisgICAgaWYgKFRMSS0+aXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tT3JQcm9tb3RlKElTRDo6RkFERCwgVlQpKQorICAgICAgcmV0dXJuIFRhcmdldFRyYW5zZm9ybUluZm86OlRDQ19CYXNpYzsKKyAgICByZXR1cm4gVGFyZ2V0VHJhbnNmb3JtSW5mbzo6VENDX0V4cGVuc2l2ZTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE9wZXJhdGlvbkNvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpUeSwgVHlwZSAqT3BUeSkgeworICAgIGNvbnN0IFRhcmdldExvd2VyaW5nQmFzZSAqVExJID0gZ2V0VExJKCk7CisgICAgc3dpdGNoIChPcGNvZGUpIHsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpUcnVuYzoKKyAgICAgIGlmIChUTEktPmlzVHJ1bmNhdGVGcmVlKE9wVHksIFR5KSkKKyAgICAgICAgcmV0dXJuIFRhcmdldFRyYW5zZm9ybUluZm86OlRDQ19GcmVlOworICAgICAgcmV0dXJuIFRhcmdldFRyYW5zZm9ybUluZm86OlRDQ19CYXNpYzsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpaRXh0OgorICAgICAgaWYgKFRMSS0+aXNaRXh0RnJlZShPcFR5LCBUeSkpCisgICAgICAgIHJldHVybiBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpUQ0NfRnJlZTsKKyAgICAgIHJldHVybiBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpUQ0NfQmFzaWM7CisgICAgfQorCisgICAgcmV0dXJuIEJhc2VUOjpnZXRPcGVyYXRpb25Db3N0KE9wY29kZSwgVHksIE9wVHkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0SW5saW5pbmdUaHJlc2hvbGRNdWx0aXBsaWVyKCkgeyByZXR1cm4gMTsgfQorCisgIHZvaWQgZ2V0VW5yb2xsaW5nUHJlZmVyZW5jZXMoTG9vcCAqTCwgU2NhbGFyRXZvbHV0aW9uICZTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVEk6OlVucm9sbGluZ1ByZWZlcmVuY2VzICZVUCkgeworICAgIC8vIFRoaXMgdW5yb2xsaW5nIGZ1bmN0aW9uYWxpdHkgaXMgdGFyZ2V0IGluZGVwZW5kZW50LCBidXQgdG8gcHJvdmlkZSBzb21lCisgICAgLy8gbW90aXZhdGlvbiBmb3IgaXRzIGludGVuZGVkIHVzZSwgZm9yIHg4NjoKKworICAgIC8vIEFjY29yZGluZyB0byB0aGUgSW50ZWwgNjQgYW5kIElBLTMyIEFyY2hpdGVjdHVyZXMgT3B0aW1pemF0aW9uIFJlZmVyZW5jZQorICAgIC8vIE1hbnVhbCwgSW50ZWwgQ29yZSBtb2RlbHMgYW5kIGxhdGVyIGhhdmUgYSBsb29wIHN0cmVhbSBkZXRlY3RvciAoYW5kCisgICAgLy8gYXNzb2NpYXRlZCB1b3AgcXVldWUpIHRoYXQgY2FuIGJlbmVmaXQgZnJvbSBwYXJ0aWFsIHVucm9sbGluZy4KKyAgICAvLyBUaGUgcmVsZXZhbnQgcmVxdWlyZW1lbnRzIGFyZToKKyAgICAvLyAgLSBUaGUgbG9vcCBtdXN0IGhhdmUgbm8gbW9yZSB0aGFuIDQgKDggZm9yIE5laGFsZW0gYW5kIGxhdGVyKSBicmFuY2hlcworICAgIC8vICAgIHRha2VuLCBhbmQgbm9uZSBvZiB0aGVtIG1heSBiZSBjYWxscy4KKyAgICAvLyAgLSBUaGUgbG9vcCBjYW4gaGF2ZSBubyBtb3JlIHRoYW4gMTggKDI4IGZvciBOZWhhbGVtIGFuZCBsYXRlcikgdW9wcy4KKworICAgIC8vIEFjY29yZGluZyB0byB0aGUgU29mdHdhcmUgT3B0aW1pemF0aW9uIEd1aWRlIGZvciBBTUQgRmFtaWx5IDE1aAorICAgIC8vIFByb2Nlc3NvcnMsIG1vZGVscyAzMGgtNGZoIChTdGVhbXJvbGxlciBhbmQgbGF0ZXIpIGhhdmUgYSBsb29wIHByZWRpY3RvcgorICAgIC8vIGFuZCBsb29wIGJ1ZmZlciB3aGljaCBjYW4gYmVuZWZpdCBmcm9tIHBhcnRpYWwgdW5yb2xsaW5nLgorICAgIC8vIFRoZSByZWxldmFudCByZXF1aXJlbWVudHMgYXJlOgorICAgIC8vICAtIFRoZSBsb29wIG11c3QgaGF2ZSBmZXdlciB0aGFuIDE2IGJyYW5jaGVzCisgICAgLy8gIC0gVGhlIGxvb3AgbXVzdCBoYXZlIGxlc3MgdGhhbiA0MCB1b3BzIGluIGFsbCBleGVjdXRlZCBsb29wIGJyYW5jaGVzCisKKyAgICAvLyBUaGUgbnVtYmVyIG9mIHRha2VuIGJyYW5jaGVzIGluIGEgbG9vcCBpcyBoYXJkIHRvIGVzdGltYXRlIGhlcmUsIGFuZAorICAgIC8vIGJlbmNobWFya2luZyBoYXMgcmV2ZWFsZWQgdGhhdCBpdCBpcyBiZXR0ZXIgbm90IHRvIGJlIGNvbnNlcnZhdGl2ZSB3aGVuCisgICAgLy8gZXN0aW1hdGluZyB0aGUgYnJhbmNoIGNvdW50LiBBcyBhIHJlc3VsdCwgd2UnbGwgaWdub3JlIHRoZSBicmFuY2ggbGltaXRzCisgICAgLy8gdW50aWwgc29tZW9uZSBmaW5kcyBhIGNhc2Ugd2hlcmUgaXQgbWF0dGVycyBpbiBwcmFjdGljZS4KKworICAgIHVuc2lnbmVkIE1heE9wczsKKyAgICBjb25zdCBUYXJnZXRTdWJ0YXJnZXRJbmZvICpTVCA9IGdldFNUKCk7CisgICAgaWYgKFBhcnRpYWxVbnJvbGxpbmdUaHJlc2hvbGQuZ2V0TnVtT2NjdXJyZW5jZXMoKSA+IDApCisgICAgICBNYXhPcHMgPSBQYXJ0aWFsVW5yb2xsaW5nVGhyZXNob2xkOworICAgIGVsc2UgaWYgKFNULT5nZXRTY2hlZE1vZGVsKCkuTG9vcE1pY3JvT3BCdWZmZXJTaXplID4gMCkKKyAgICAgIE1heE9wcyA9IFNULT5nZXRTY2hlZE1vZGVsKCkuTG9vcE1pY3JvT3BCdWZmZXJTaXplOworICAgIGVsc2UKKyAgICAgIHJldHVybjsKKworICAgIC8vIFNjYW4gdGhlIGxvb3A6IGRvbid0IHVucm9sbCBsb29wcyB3aXRoIGNhbGxzLgorICAgIGZvciAoTG9vcDo6YmxvY2tfaXRlcmF0b3IgSSA9IEwtPmJsb2NrX2JlZ2luKCksIEUgPSBMLT5ibG9ja19lbmQoKTsgSSAhPSBFOworICAgICAgICAgKytJKSB7CisgICAgICBCYXNpY0Jsb2NrICpCQiA9ICpJOworCisgICAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEogPSBCQi0+YmVnaW4oKSwgSkUgPSBCQi0+ZW5kKCk7IEogIT0gSkU7ICsrSikKKyAgICAgICAgaWYgKGlzYTxDYWxsSW5zdD4oSikgfHwgaXNhPEludm9rZUluc3Q+KEopKSB7CisgICAgICAgICAgSW1tdXRhYmxlQ2FsbFNpdGUgQ1MoJipKKTsKKyAgICAgICAgICBpZiAoY29uc3QgRnVuY3Rpb24gKkYgPSBDUy5nZXRDYWxsZWRGdW5jdGlvbigpKSB7CisgICAgICAgICAgICBpZiAoIXN0YXRpY19jYXN0PFQgKj4odGhpcyktPmlzTG93ZXJlZFRvQ2FsbChGKSkKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRW5hYmxlIHJ1bnRpbWUgYW5kIHBhcnRpYWwgdW5yb2xsaW5nIHVwIHRvIHRoZSBzcGVjaWZpZWQgc2l6ZS4KKyAgICAvLyBFbmFibGUgdXNpbmcgdHJpcCBjb3VudCB1cHBlciBib3VuZCB0byB1bnJvbGwgbG9vcHMuCisgICAgVVAuUGFydGlhbCA9IFVQLlJ1bnRpbWUgPSBVUC5VcHBlckJvdW5kID0gdHJ1ZTsKKyAgICBVUC5QYXJ0aWFsVGhyZXNob2xkID0gTWF4T3BzOworCisgICAgLy8gQXZvaWQgdW5yb2xsaW5nIHdoZW4gb3B0aW1pemluZyBmb3Igc2l6ZS4KKyAgICBVUC5PcHRTaXplVGhyZXNob2xkID0gMDsKKyAgICBVUC5QYXJ0aWFsT3B0U2l6ZVRocmVzaG9sZCA9IDA7CisKKyAgICAvLyBTZXQgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBvcHRpbWl6ZWQgd2hlbiAiYmFjayBlZGdlIgorICAgIC8vIGJlY29tZXMgImZhbGwgdGhyb3VnaCIgdG8gZGVmYXVsdCB2YWx1ZSBvZiAyLgorICAgIFVQLkJFSW5zbnMgPSAyOworICB9CisKKyAgaW50IGdldEluc3RydWN0aW9uTGF0ZW5jeShjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIGlmIChpc2E8TG9hZEluc3Q+KEkpKQorICAgICAgcmV0dXJuIGdldFNUKCktPmdldFNjaGVkTW9kZWwoKS5EZWZhdWx0TG9hZExhdGVuY3k7CisKKyAgICByZXR1cm4gQmFzZVQ6OmdldEluc3RydWN0aW9uTGF0ZW5jeShJKTsKKyAgfQorCisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBWZWN0b3IgVFRJIEltcGxlbWVudGF0aW9ucworICAvLy8gQHsKKworICB1bnNpZ25lZCBnZXROdW1iZXJPZlJlZ2lzdGVycyhib29sIFZlY3RvcikgeyByZXR1cm4gVmVjdG9yID8gMCA6IDE7IH0KKworICB1bnNpZ25lZCBnZXRSZWdpc3RlckJpdFdpZHRoKGJvb2wgVmVjdG9yKSBjb25zdCB7IHJldHVybiAzMjsgfQorCisgIC8vLyBFc3RpbWF0ZSB0aGUgb3ZlcmhlYWQgb2Ygc2NhbGFyaXppbmcgYW4gaW5zdHJ1Y3Rpb24uIEluc2VydCBhbmQgRXh0cmFjdAorICAvLy8gYXJlIHNldCBpZiB0aGUgcmVzdWx0IG5lZWRzIHRvIGJlIGluc2VydGVkIGFuZC9vciBleHRyYWN0ZWQgZnJvbSB2ZWN0b3JzLgorICB1bnNpZ25lZCBnZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoVHlwZSAqVHksIGJvb2wgSW5zZXJ0LCBib29sIEV4dHJhY3QpIHsKKyAgICBhc3NlcnQoVHktPmlzVmVjdG9yVHkoKSAmJiAiQ2FuIG9ubHkgc2NhbGFyaXplIHZlY3RvcnMiKTsKKyAgICB1bnNpZ25lZCBDb3N0ID0gMDsKKworICAgIGZvciAoaW50IGkgPSAwLCBlID0gVHktPmdldFZlY3Rvck51bUVsZW1lbnRzKCk7IGkgPCBlOyArK2kpIHsKKyAgICAgIGlmIChJbnNlcnQpCisgICAgICAgIENvc3QgKz0gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKQorICAgICAgICAgICAgICAgICAgICAtPmdldFZlY3Rvckluc3RyQ29zdChJbnN0cnVjdGlvbjo6SW5zZXJ0RWxlbWVudCwgVHksIGkpOworICAgICAgaWYgKEV4dHJhY3QpCisgICAgICAgIENvc3QgKz0gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKQorICAgICAgICAgICAgICAgICAgICAtPmdldFZlY3Rvckluc3RyQ29zdChJbnN0cnVjdGlvbjo6RXh0cmFjdEVsZW1lbnQsIFR5LCBpKTsKKyAgICB9CisKKyAgICByZXR1cm4gQ29zdDsKKyAgfQorCisgIC8vLyBFc3RpbWF0ZSB0aGUgb3ZlcmhlYWQgb2Ygc2NhbGFyaXppbmcgYW4gaW5zdHJ1Y3Rpb25zIHVuaXF1ZQorICAvLy8gbm9uLWNvbnN0YW50IG9wZXJhbmRzLiBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyBhcmUgb3JkaW5hcmlseQorICAvLy8gc2NhbGFyLCBpbiB3aGljaCBjYXNlIHRoZSBjb3N0cyBhcmUgbXVsdGlwbGllZCB3aXRoIFZGLgorICB1bnNpZ25lZCBnZXRPcGVyYW5kc1NjYWxhcml6YXRpb25PdmVyaGVhZChBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWRikgeworICAgIHVuc2lnbmVkIENvc3QgPSAwOworICAgIFNtYWxsUHRyU2V0PGNvbnN0IFZhbHVlKiwgND4gVW5pcXVlT3BlcmFuZHM7CisgICAgZm9yIChjb25zdCBWYWx1ZSAqQSA6IEFyZ3MpIHsKKyAgICAgIGlmICghaXNhPENvbnN0YW50PihBKSAmJiBVbmlxdWVPcGVyYW5kcy5pbnNlcnQoQSkuc2Vjb25kKSB7CisgICAgICAgIFR5cGUgKlZlY1R5ID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKEEtPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpKSB7CisgICAgICAgICAgVmVjVHkgPSBBLT5nZXRUeXBlKCk7CisgICAgICAgICAgLy8gSWYgQSBpcyBhIHZlY3RvciBvcGVyYW5kLCBWRiBzaG91bGQgYmUgMSBvciBjb3JyZXNwb25kIHRvIEEuCisgICAgICAgICAgYXNzZXJ0KChWRiA9PSAxIHx8IFZGID09IFZlY1R5LT5nZXRWZWN0b3JOdW1FbGVtZW50cygpKSAmJgorICAgICAgICAgICAgICAgICAiVmVjdG9yIGFyZ3VtZW50IGRvZXMgbm90IG1hdGNoIFZGIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIFZlY1R5ID0gVmVjdG9yVHlwZTo6Z2V0KEEtPmdldFR5cGUoKSwgVkYpOworCisgICAgICAgIENvc3QgKz0gZ2V0U2NhbGFyaXphdGlvbk92ZXJoZWFkKFZlY1R5LCBmYWxzZSwgdHJ1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENvc3Q7CisgIH0KKworICB1bnNpZ25lZCBnZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoVHlwZSAqVmVjVHksIEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IEFyZ3MpIHsKKyAgICBhc3NlcnQoVmVjVHktPmlzVmVjdG9yVHkoKSk7CisKKyAgICB1bnNpZ25lZCBDb3N0ID0gMDsKKworICAgIENvc3QgKz0gZ2V0U2NhbGFyaXphdGlvbk92ZXJoZWFkKFZlY1R5LCB0cnVlLCBmYWxzZSk7CisgICAgaWYgKCFBcmdzLmVtcHR5KCkpCisgICAgICBDb3N0ICs9IGdldE9wZXJhbmRzU2NhbGFyaXphdGlvbk92ZXJoZWFkKEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY1R5LT5nZXRWZWN0b3JOdW1FbGVtZW50cygpKTsKKyAgICBlbHNlCisgICAgICAvLyBXaGVuIG5vIGluZm9ybWF0aW9uIG9uIGFyZ3VtZW50cyBpcyBwcm92aWRlZCwgd2UgYWRkIHRoZSBjb3N0CisgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggb25lIGFyZ3VtZW50IGFzIGEgaGV1cmlzdGljLgorICAgICAgQ29zdCArPSBnZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoVmVjVHksIGZhbHNlLCB0cnVlKTsKKworICAgIHJldHVybiBDb3N0OworICB9CisKKyAgdW5zaWduZWQgZ2V0TWF4SW50ZXJsZWF2ZUZhY3Rvcih1bnNpZ25lZCBWRikgeyByZXR1cm4gMTsgfQorCisgIHVuc2lnbmVkIGdldEFyaXRobWV0aWNJbnN0ckNvc3QoCisgICAgICB1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlR5LAorICAgICAgVFRJOjpPcGVyYW5kVmFsdWVLaW5kIE9wZDFJbmZvID0gVFRJOjpPS19BbnlWYWx1ZSwKKyAgICAgIFRUSTo6T3BlcmFuZFZhbHVlS2luZCBPcGQySW5mbyA9IFRUSTo6T0tfQW55VmFsdWUsCisgICAgICBUVEk6Ok9wZXJhbmRWYWx1ZVByb3BlcnRpZXMgT3BkMVByb3BJbmZvID0gVFRJOjpPUF9Ob25lLAorICAgICAgVFRJOjpPcGVyYW5kVmFsdWVQcm9wZXJ0aWVzIE9wZDJQcm9wSW5mbyA9IFRUSTo6T1BfTm9uZSwKKyAgICAgIEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IEFyZ3MgPSBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPigpKSB7CisgICAgLy8gQ2hlY2sgaWYgYW55IG9mIHRoZSBvcGVyYW5kcyBhcmUgdmVjdG9yIG9wZXJhbmRzLgorICAgIGNvbnN0IFRhcmdldExvd2VyaW5nQmFzZSAqVExJID0gZ2V0VExJKCk7CisgICAgaW50IElTRCA9IFRMSS0+SW5zdHJ1Y3Rpb25PcGNvZGVUb0lTRChPcGNvZGUpOworICAgIGFzc2VydChJU0QgJiYgIkludmFsaWQgb3Bjb2RlIik7CisKKyAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIE1WVD4gTFQgPSBUTEktPmdldFR5cGVMZWdhbGl6YXRpb25Db3N0KERMLCBUeSk7CisKKyAgICBib29sIElzRmxvYXQgPSBUeS0+aXNGUE9yRlBWZWN0b3JUeSgpOworICAgIC8vIEFzc3VtZSB0aGF0IGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMgb3BlcmF0aW9ucyBjb3N0IHR3aWNlIGFzIG11Y2ggYXMKKyAgICAvLyBpbnRlZ2VyIG9wZXJhdGlvbnMuCisgICAgdW5zaWduZWQgT3BDb3N0ID0gKElzRmxvYXQgPyAyIDogMSk7CisKKyAgICBpZiAoVExJLT5pc09wZXJhdGlvbkxlZ2FsT3JQcm9tb3RlKElTRCwgTFQuc2Vjb25kKSkgeworICAgICAgLy8gVGhlIG9wZXJhdGlvbiBpcyBsZWdhbC4gQXNzdW1lIGl0IGNvc3RzIDEuCisgICAgICAvLyBUT0RPOiBPbmNlIHdlIGhhdmUgZXh0cmFjdC9pbnNlcnQgc3VidmVjdG9yIGNvc3Qgd2UgbmVlZCB0byB1c2UgdGhlbS4KKyAgICAgIHJldHVybiBMVC5maXJzdCAqIE9wQ29zdDsKKyAgICB9CisKKyAgICBpZiAoIVRMSS0+aXNPcGVyYXRpb25FeHBhbmQoSVNELCBMVC5zZWNvbmQpKSB7CisgICAgICAvLyBJZiB0aGUgb3BlcmF0aW9uIGlzIGN1c3RvbSBsb3dlcmVkLCB0aGVuIGFzc3VtZSB0aGF0IHRoZSBjb2RlIGlzIHR3aWNlCisgICAgICAvLyBhcyBleHBlbnNpdmUuCisgICAgICByZXR1cm4gTFQuZmlyc3QgKiAyICogT3BDb3N0OworICAgIH0KKworICAgIC8vIEVsc2UsIGFzc3VtZSB0aGF0IHdlIG5lZWQgdG8gc2NhbGFyaXplIHRoaXMgb3AuCisgICAgLy8gVE9ETzogSWYgb25lIG9mIHRoZSB0eXBlcyBnZXQgbGVnYWxpemVkIGJ5IHNwbGl0dGluZywgaGFuZGxlIHRoaXMKKyAgICAvLyBzaW1pbGFybHkgdG8gd2hhdCBnZXRDYXN0SW5zdHJDb3N0KCkgZG9lcy4KKyAgICBpZiAoVHktPmlzVmVjdG9yVHkoKSkgeworICAgICAgdW5zaWduZWQgTnVtID0gVHktPmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgICB1bnNpZ25lZCBDb3N0ID0gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAtPmdldEFyaXRobWV0aWNJbnN0ckNvc3QoT3Bjb2RlLCBUeS0+Z2V0U2NhbGFyVHlwZSgpKTsKKyAgICAgIC8vIFJldHVybiB0aGUgY29zdCBvZiBtdWx0aXBsZSBzY2FsYXIgaW52b2NhdGlvbiBwbHVzIHRoZSBjb3N0IG9mCisgICAgICAvLyBpbnNlcnRpbmcgYW5kIGV4dHJhY3RpbmcgdGhlIHZhbHVlcy4KKyAgICAgIHJldHVybiBnZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoVHksIEFyZ3MpICsgTnVtICogQ29zdDsKKyAgICB9CisKKyAgICAvLyBXZSBkb24ndCBrbm93IGFueXRoaW5nIGFib3V0IHRoaXMgc2NhbGFyIGluc3RydWN0aW9uLgorICAgIHJldHVybiBPcENvc3Q7CisgIH0KKworICB1bnNpZ25lZCBnZXRTaHVmZmxlQ29zdChUVEk6OlNodWZmbGVLaW5kIEtpbmQsIFR5cGUgKlRwLCBpbnQgSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKlN1YlRwKSB7CisgICAgaWYgKEtpbmQgPT0gVFRJOjpTS19BbHRlcm5hdGUgfHwgS2luZCA9PSBUVEk6OlNLX1Blcm11dGVUd29TcmMgfHwKKyAgICAgICAgS2luZCA9PSBUVEk6OlNLX1Blcm11dGVTaW5nbGVTcmMpIHsKKyAgICAgIHJldHVybiBnZXRQZXJtdXRlU2h1ZmZsZU92ZXJoZWFkKFRwKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKworICB1bnNpZ25lZCBnZXRDYXN0SW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqRHN0LCBUeXBlICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkkgPSBudWxscHRyKSB7CisgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmdCYXNlICpUTEkgPSBnZXRUTEkoKTsKKyAgICBpbnQgSVNEID0gVExJLT5JbnN0cnVjdGlvbk9wY29kZVRvSVNEKE9wY29kZSk7CisgICAgYXNzZXJ0KElTRCAmJiAiSW52YWxpZCBvcGNvZGUiKTsKKyAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIE1WVD4gU3JjTFQgPSBUTEktPmdldFR5cGVMZWdhbGl6YXRpb25Db3N0KERMLCBTcmMpOworICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgTVZUPiBEc3RMVCA9IFRMSS0+Z2V0VHlwZUxlZ2FsaXphdGlvbkNvc3QoREwsIERzdCk7CisKKyAgICAvLyBDaGVjayBmb3IgTk9PUCBjb252ZXJzaW9ucy4KKyAgICBpZiAoU3JjTFQuZmlyc3QgPT0gRHN0TFQuZmlyc3QgJiYKKyAgICAgICAgU3JjTFQuc2Vjb25kLmdldFNpemVJbkJpdHMoKSA9PSBEc3RMVC5zZWNvbmQuZ2V0U2l6ZUluQml0cygpKSB7CisKKyAgICAgIC8vIEJpdGNhc3QgYmV0d2VlbiB0eXBlcyB0aGF0IGFyZSBsZWdhbGl6ZWQgdG8gdGhlIHNhbWUgdHlwZSBhcmUgZnJlZS4KKyAgICAgIGlmIChPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OkJpdENhc3QgfHwgT3Bjb2RlID09IEluc3RydWN0aW9uOjpUcnVuYykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6VHJ1bmMgJiYKKyAgICAgICAgVExJLT5pc1RydW5jYXRlRnJlZShTcmNMVC5zZWNvbmQsIERzdExULnNlY29uZCkpCisgICAgICByZXR1cm4gMDsKKworICAgIGlmIChPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OlpFeHQgJiYKKyAgICAgICAgVExJLT5pc1pFeHRGcmVlKFNyY0xULnNlY29uZCwgRHN0TFQuc2Vjb25kKSkKKyAgICAgIHJldHVybiAwOworCisgICAgaWYgKE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6QWRkclNwYWNlQ2FzdCAmJgorICAgICAgICBUTEktPmlzTm9vcEFkZHJTcGFjZUNhc3QoU3JjLT5nZXRQb2ludGVyQWRkcmVzc1NwYWNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEc3QtPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKSkpCisgICAgICByZXR1cm4gMDsKKworICAgIC8vIElmIHRoaXMgaXMgYSB6ZXh0L3NleHQgb2YgYSBsb2FkLCByZXR1cm4gMCBpZiB0aGUgY29ycmVzcG9uZGluZworICAgIC8vIGV4dGVuZGluZyBsb2FkIGV4aXN0cyBvbiB0YXJnZXQuCisgICAgaWYgKChPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OlpFeHQgfHwgT3Bjb2RlID09IEluc3RydWN0aW9uOjpTRXh0KSAmJgorICAgICAgICBJICYmIGlzYTxMb2FkSW5zdD4oSS0+Z2V0T3BlcmFuZCgwKSkpIHsKKyAgICAgICAgRVZUIEV4dFZUID0gRVZUOjpnZXRFVlQoRHN0KTsKKyAgICAgICAgRVZUIExvYWRWVCA9IEVWVDo6Z2V0RVZUKFNyYyk7CisgICAgICAgIHVuc2lnbmVkIExUeXBlID0KKyAgICAgICAgICAoKE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6WkV4dCkgPyBJU0Q6OlpFWFRMT0FEIDogSVNEOjpTRVhUTE9BRCk7CisgICAgICAgIGlmIChUTEktPmlzTG9hZEV4dExlZ2FsKExUeXBlLCBFeHRWVCwgTG9hZFZUKSkKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgY2FzdCBpcyBtYXJrZWQgYXMgbGVnYWwgKG9yIHByb21vdGUpIHRoZW4gYXNzdW1lIGxvdyBjb3N0LgorICAgIGlmIChTcmNMVC5maXJzdCA9PSBEc3RMVC5maXJzdCAmJgorICAgICAgICBUTEktPmlzT3BlcmF0aW9uTGVnYWxPclByb21vdGUoSVNELCBEc3RMVC5zZWNvbmQpKQorICAgICAgcmV0dXJuIDE7CisKKyAgICAvLyBIYW5kbGUgc2NhbGFyIGNvbnZlcnNpb25zLgorICAgIGlmICghU3JjLT5pc1ZlY3RvclR5KCkgJiYgIURzdC0+aXNWZWN0b3JUeSgpKSB7CisgICAgICAvLyBTY2FsYXIgYml0Y2FzdHMgYXJlIHVzdWFsbHkgZnJlZS4KKyAgICAgIGlmIChPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OkJpdENhc3QpCisgICAgICAgIHJldHVybiAwOworCisgICAgICAvLyBKdXN0IGNoZWNrIHRoZSBvcCBjb3N0LiBJZiB0aGUgb3BlcmF0aW9uIGlzIGxlZ2FsIHRoZW4gYXNzdW1lIGl0IGNvc3RzCisgICAgICAvLyAxLgorICAgICAgaWYgKCFUTEktPmlzT3BlcmF0aW9uRXhwYW5kKElTRCwgRHN0TFQuc2Vjb25kKSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgIC8vIEFzc3VtZSB0aGF0IGlsbGVnYWwgc2NhbGFyIGluc3RydWN0aW9uIGFyZSBleHBlbnNpdmUuCisgICAgICByZXR1cm4gNDsKKyAgICB9CisKKyAgICAvLyBDaGVjayB2ZWN0b3ItdG8tdmVjdG9yIGNhc3RzLgorICAgIGlmIChEc3QtPmlzVmVjdG9yVHkoKSAmJiBTcmMtPmlzVmVjdG9yVHkoKSkgeworICAgICAgLy8gSWYgdGhlIGNhc3QgaXMgYmV0d2VlbiBzYW1lLXNpemVkIHJlZ2lzdGVycywgdGhlbiB0aGUgY2hlY2sgaXMgc2ltcGxlLgorICAgICAgaWYgKFNyY0xULmZpcnN0ID09IERzdExULmZpcnN0ICYmCisgICAgICAgICAgU3JjTFQuc2Vjb25kLmdldFNpemVJbkJpdHMoKSA9PSBEc3RMVC5zZWNvbmQuZ2V0U2l6ZUluQml0cygpKSB7CisKKyAgICAgICAgLy8gQXNzdW1lIHRoYXQgWmV4dCBpcyBkb25lIHVzaW5nIEFORC4KKyAgICAgICAgaWYgKE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6WkV4dCkKKyAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAvLyBBc3N1bWUgdGhhdCBzZXh0IGlzIGRvbmUgdXNpbmcgU0hMIGFuZCBTUkEuCisgICAgICAgIGlmIChPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OlNFeHQpCisgICAgICAgICAgcmV0dXJuIDI7CisKKyAgICAgICAgLy8gSnVzdCBjaGVjayB0aGUgb3AgY29zdC4gSWYgdGhlIG9wZXJhdGlvbiBpcyBsZWdhbCB0aGVuIGFzc3VtZSBpdAorICAgICAgICAvLyBjb3N0cworICAgICAgICAvLyAxIGFuZCBtdWx0aXBseSBieSB0aGUgdHlwZS1sZWdhbGl6YXRpb24gb3ZlcmhlYWQuCisgICAgICAgIGlmICghVExJLT5pc09wZXJhdGlvbkV4cGFuZChJU0QsIERzdExULnNlY29uZCkpCisgICAgICAgICAgcmV0dXJuIFNyY0xULmZpcnN0ICogMTsKKyAgICAgIH0KKworICAgICAgLy8gSWYgd2UgYXJlIGxlZ2FsaXppbmcgYnkgc3BsaXR0aW5nLCBxdWVyeSB0aGUgY29uY3JldGUgVFRJIGZvciB0aGUgY29zdAorICAgICAgLy8gb2YgY2FzdGluZyB0aGUgb3JpZ2luYWwgdmVjdG9yIHR3aWNlLiBXZSBhbHNvIG5lZWQgdG8gZmFjdG9yIGluIHRoZQorICAgICAgLy8gY29zdCBvZiB0aGUgc3BsaXQgaXRzZWxmLiBDb3VudCB0aGF0IGFzIDEsIHRvIGJlIGNvbnNpc3RlbnQgd2l0aAorICAgICAgLy8gVExJLT5nZXRUeXBlTGVnYWxpemF0aW9uQ29zdCgpLgorICAgICAgaWYgKChUTEktPmdldFR5cGVBY3Rpb24oU3JjLT5nZXRDb250ZXh0KCksIFRMSS0+Z2V0VmFsdWVUeXBlKERMLCBTcmMpKSA9PQorICAgICAgICAgICBUYXJnZXRMb3dlcmluZzo6VHlwZVNwbGl0VmVjdG9yKSB8fAorICAgICAgICAgIChUTEktPmdldFR5cGVBY3Rpb24oRHN0LT5nZXRDb250ZXh0KCksIFRMSS0+Z2V0VmFsdWVUeXBlKERMLCBEc3QpKSA9PQorICAgICAgICAgICBUYXJnZXRMb3dlcmluZzo6VHlwZVNwbGl0VmVjdG9yKSkgeworICAgICAgICBUeXBlICpTcGxpdERzdCA9IFZlY3RvclR5cGU6OmdldChEc3QtPmdldFZlY3RvckVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERzdC0+Z2V0VmVjdG9yTnVtRWxlbWVudHMoKSAvIDIpOworICAgICAgICBUeXBlICpTcGxpdFNyYyA9IFZlY3RvclR5cGU6OmdldChTcmMtPmdldFZlY3RvckVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyYy0+Z2V0VmVjdG9yTnVtRWxlbWVudHMoKSAvIDIpOworICAgICAgICBUICpUVEkgPSBzdGF0aWNfY2FzdDxUICo+KHRoaXMpOworICAgICAgICByZXR1cm4gVFRJLT5nZXRWZWN0b3JTcGxpdENvc3QoKSArCisgICAgICAgICAgICAgICAoMiAqIFRUSS0+Z2V0Q2FzdEluc3RyQ29zdChPcGNvZGUsIFNwbGl0RHN0LCBTcGxpdFNyYywgSSkpOworICAgICAgfQorCisgICAgICAvLyBJbiBvdGhlciBjYXNlcyB3aGVyZSB0aGUgc291cmNlIG9yIGRlc3RpbmF0aW9uIGFyZSBpbGxlZ2FsLCBhc3N1bWUKKyAgICAgIC8vIHRoZSBvcGVyYXRpb24gd2lsbCBnZXQgc2NhbGFyaXplZC4KKyAgICAgIHVuc2lnbmVkIE51bSA9IERzdC0+Z2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICAgIHVuc2lnbmVkIENvc3QgPSBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRDYXN0SW5zdHJDb3N0KAorICAgICAgICAgIE9wY29kZSwgRHN0LT5nZXRTY2FsYXJUeXBlKCksIFNyYy0+Z2V0U2NhbGFyVHlwZSgpLCBJKTsKKworICAgICAgLy8gUmV0dXJuIHRoZSBjb3N0IG9mIG11bHRpcGxlIHNjYWxhciBpbnZvY2F0aW9uIHBsdXMgdGhlIGNvc3Qgb2YKKyAgICAgIC8vIGluc2VydGluZyBhbmQgZXh0cmFjdGluZyB0aGUgdmFsdWVzLgorICAgICAgcmV0dXJuIGdldFNjYWxhcml6YXRpb25PdmVyaGVhZChEc3QsIHRydWUsIHRydWUpICsgTnVtICogQ29zdDsKKyAgICB9CisKKyAgICAvLyBXZSBhbHJlYWR5IGhhbmRsZWQgdmVjdG9yLXRvLXZlY3RvciBhbmQgc2NhbGFyLXRvLXNjYWxhciBjb252ZXJzaW9ucy4KKyAgICAvLyBUaGlzCisgICAgLy8gaXMgd2hlcmUgd2UgaGFuZGxlIGJpdGNhc3QgYmV0d2VlbiB2ZWN0b3JzIGFuZCBzY2FsYXJzLiBXZSBuZWVkIHRvIGFzc3VtZQorICAgIC8vICB0aGF0IHRoZSBjb252ZXJzaW9uIGlzIHNjYWxhcml6ZWQgaW4gb25lIHdheSBvciBhbm90aGVyLgorICAgIGlmIChPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OkJpdENhc3QpCisgICAgICAvLyBJbGxlZ2FsIGJpdGNhc3RzIGFyZSBkb25lIGJ5IHN0b3JpbmcgYW5kIGxvYWRpbmcgZnJvbSBhIHN0YWNrIHNsb3QuCisgICAgICByZXR1cm4gKFNyYy0+aXNWZWN0b3JUeSgpID8gZ2V0U2NhbGFyaXphdGlvbk92ZXJoZWFkKFNyYywgZmFsc2UsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCkgKworICAgICAgICAgICAgIChEc3QtPmlzVmVjdG9yVHkoKSA/IGdldFNjYWxhcml6YXRpb25PdmVyaGVhZChEc3QsIHRydWUsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDApOworCisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5oYW5kbGVkIGNhc3QiKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldEV4dHJhY3RXaXRoRXh0ZW5kQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKkRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvclR5cGUgKlZlY1R5LCB1bnNpZ25lZCBJbmRleCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRWZWN0b3JJbnN0ckNvc3QoCisgICAgICAgICAgICAgICBJbnN0cnVjdGlvbjo6RXh0cmFjdEVsZW1lbnQsIFZlY1R5LCBJbmRleCkgKworICAgICAgICAgICBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRDYXN0SW5zdHJDb3N0KE9wY29kZSwgRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY1R5LT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldENGSW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSkgeworICAgIC8vIEJyYW5jaGVzIGFyZSBhc3N1bWVkIHRvIGJlIHByZWRpY3RlZC4KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHVuc2lnbmVkIGdldENtcFNlbEluc3RyQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlZhbFR5LCBUeXBlICpDb25kVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIGNvbnN0IFRhcmdldExvd2VyaW5nQmFzZSAqVExJID0gZ2V0VExJKCk7CisgICAgaW50IElTRCA9IFRMSS0+SW5zdHJ1Y3Rpb25PcGNvZGVUb0lTRChPcGNvZGUpOworICAgIGFzc2VydChJU0QgJiYgIkludmFsaWQgb3Bjb2RlIik7CisKKyAgICAvLyBTZWxlY3RzIG9uIHZlY3RvcnMgYXJlIGFjdHVhbGx5IHZlY3RvciBzZWxlY3RzLgorICAgIGlmIChJU0QgPT0gSVNEOjpTRUxFQ1QpIHsKKyAgICAgIGFzc2VydChDb25kVHkgJiYgIkNvbmRUeSBtdXN0IGV4aXN0Iik7CisgICAgICBpZiAoQ29uZFR5LT5pc1ZlY3RvclR5KCkpCisgICAgICAgIElTRCA9IElTRDo6VlNFTEVDVDsKKyAgICB9CisgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCBNVlQ+IExUID0gVExJLT5nZXRUeXBlTGVnYWxpemF0aW9uQ29zdChETCwgVmFsVHkpOworCisgICAgaWYgKCEoVmFsVHktPmlzVmVjdG9yVHkoKSAmJiAhTFQuc2Vjb25kLmlzVmVjdG9yKCkpICYmCisgICAgICAgICFUTEktPmlzT3BlcmF0aW9uRXhwYW5kKElTRCwgTFQuc2Vjb25kKSkgeworICAgICAgLy8gVGhlIG9wZXJhdGlvbiBpcyBsZWdhbC4gQXNzdW1lIGl0IGNvc3RzIDEuIE11bHRpcGx5CisgICAgICAvLyBieSB0aGUgdHlwZS1sZWdhbGl6YXRpb24gb3ZlcmhlYWQuCisgICAgICByZXR1cm4gTFQuZmlyc3QgKiAxOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSwgYXNzdW1lIHRoYXQgdGhlIGNhc3QgaXMgc2NhbGFyaXplZC4KKyAgICAvLyBUT0RPOiBJZiBvbmUgb2YgdGhlIHR5cGVzIGdldCBsZWdhbGl6ZWQgYnkgc3BsaXR0aW5nLCBoYW5kbGUgdGhpcworICAgIC8vIHNpbWlsYXJseSB0byB3aGF0IGdldENhc3RJbnN0ckNvc3QoKSBkb2VzLgorICAgIGlmIChWYWxUeS0+aXNWZWN0b3JUeSgpKSB7CisgICAgICB1bnNpZ25lZCBOdW0gPSBWYWxUeS0+Z2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICAgIGlmIChDb25kVHkpCisgICAgICAgIENvbmRUeSA9IENvbmRUeS0+Z2V0U2NhbGFyVHlwZSgpOworICAgICAgdW5zaWduZWQgQ29zdCA9IHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldENtcFNlbEluc3RyQ29zdCgKKyAgICAgICAgICBPcGNvZGUsIFZhbFR5LT5nZXRTY2FsYXJUeXBlKCksIENvbmRUeSwgSSk7CisKKyAgICAgIC8vIFJldHVybiB0aGUgY29zdCBvZiBtdWx0aXBsZSBzY2FsYXIgaW52b2NhdGlvbiBwbHVzIHRoZSBjb3N0IG9mCisgICAgICAvLyBpbnNlcnRpbmcgYW5kIGV4dHJhY3RpbmcgdGhlIHZhbHVlcy4KKyAgICAgIHJldHVybiBnZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoVmFsVHksIHRydWUsIGZhbHNlKSArIE51bSAqIENvc3Q7CisgICAgfQorCisgICAgLy8gVW5rbm93biBzY2FsYXIgb3Bjb2RlLgorICAgIHJldHVybiAxOworICB9CisKKyAgdW5zaWduZWQgZ2V0VmVjdG9ySW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVmFsLCB1bnNpZ25lZCBJbmRleCkgeworICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgTVZUPiBMVCA9CisgICAgICAgIGdldFRMSSgpLT5nZXRUeXBlTGVnYWxpemF0aW9uQ29zdChETCwgVmFsLT5nZXRTY2FsYXJUeXBlKCkpOworCisgICAgcmV0dXJuIExULmZpcnN0OworICB9CisKKyAgdW5zaWduZWQgZ2V0TWVtb3J5T3BDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqU3JjLCB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSwgY29uc3QgSW5zdHJ1Y3Rpb24gKkkgPSBudWxscHRyKSB7CisgICAgYXNzZXJ0KCFTcmMtPmlzVm9pZFR5KCkgJiYgIkludmFsaWQgdHlwZSIpOworICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgTVZUPiBMVCA9IGdldFRMSSgpLT5nZXRUeXBlTGVnYWxpemF0aW9uQ29zdChETCwgU3JjKTsKKworICAgIC8vIEFzc3VtaW5nIHRoYXQgYWxsIGxvYWRzIG9mIGxlZ2FsIHR5cGVzIGNvc3QgMS4KKyAgICB1bnNpZ25lZCBDb3N0ID0gTFQuZmlyc3Q7CisKKyAgICBpZiAoU3JjLT5pc1ZlY3RvclR5KCkgJiYKKyAgICAgICAgU3JjLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkgPCBMVC5zZWNvbmQuZ2V0U2l6ZUluQml0cygpKSB7CisgICAgICAvLyBUaGlzIGlzIGEgdmVjdG9yIGxvYWQgdGhhdCBsZWdhbGl6ZXMgdG8gYSBsYXJnZXIgdHlwZSB0aGFuIHRoZSB2ZWN0b3IKKyAgICAgIC8vIGl0c2VsZi4gVW5sZXNzIHRoZSBjb3JyZXNwb25kaW5nIGV4dGVuZGluZyBsb2FkIG9yIHRydW5jYXRpbmcgc3RvcmUgaXMKKyAgICAgIC8vIGxlZ2FsLCB0aGVuIHRoaXMgd2lsbCBzY2FsYXJpemUuCisgICAgICBUYXJnZXRMb3dlcmluZzo6TGVnYWxpemVBY3Rpb24gTEEgPSBUYXJnZXRMb3dlcmluZzo6RXhwYW5kOworICAgICAgRVZUIE1lbVZUID0gZ2V0VExJKCktPmdldFZhbHVlVHlwZShETCwgU3JjKTsKKyAgICAgIGlmIChPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OlN0b3JlKQorICAgICAgICBMQSA9IGdldFRMSSgpLT5nZXRUcnVuY1N0b3JlQWN0aW9uKExULnNlY29uZCwgTWVtVlQpOworICAgICAgZWxzZQorICAgICAgICBMQSA9IGdldFRMSSgpLT5nZXRMb2FkRXh0QWN0aW9uKElTRDo6RVhUTE9BRCwgTFQuc2Vjb25kLCBNZW1WVCk7CisKKyAgICAgIGlmIChMQSAhPSBUYXJnZXRMb3dlcmluZzo6TGVnYWwgJiYgTEEgIT0gVGFyZ2V0TG93ZXJpbmc6OkN1c3RvbSkgeworICAgICAgICAvLyBUaGlzIGlzIGEgdmVjdG9yIGxvYWQvc3RvcmUgZm9yIHNvbWUgaWxsZWdhbCB0eXBlIHRoYXQgaXMgc2NhbGFyaXplZC4KKyAgICAgICAgLy8gV2UgbXVzdCBhY2NvdW50IGZvciB0aGUgY29zdCBvZiBidWlsZGluZyBvciBkZWNvbXBvc2luZyB0aGUgdmVjdG9yLgorICAgICAgICBDb3N0ICs9IGdldFNjYWxhcml6YXRpb25PdmVyaGVhZChTcmMsIE9wY29kZSAhPSBJbnN0cnVjdGlvbjo6U3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6U3RvcmUpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDb3N0OworICB9CisKKyAgdW5zaWduZWQgZ2V0SW50ZXJsZWF2ZWRNZW1vcnlPcENvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpWZWNUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyZXNzU3BhY2UpIHsKKyAgICBWZWN0b3JUeXBlICpWVCA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KFZlY1R5KTsKKyAgICBhc3NlcnQoVlQgJiYgIkV4cGVjdCBhIHZlY3RvciB0eXBlIGZvciBpbnRlcmxlYXZlZCBtZW1vcnkgb3AiKTsKKworICAgIHVuc2lnbmVkIE51bUVsdHMgPSBWVC0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgICBhc3NlcnQoRmFjdG9yID4gMSAmJiBOdW1FbHRzICUgRmFjdG9yID09IDAgJiYgIkludmFsaWQgaW50ZXJsZWF2ZSBmYWN0b3IiKTsKKworICAgIHVuc2lnbmVkIE51bVN1YkVsdHMgPSBOdW1FbHRzIC8gRmFjdG9yOworICAgIFZlY3RvclR5cGUgKlN1YlZUID0gVmVjdG9yVHlwZTo6Z2V0KFZULT5nZXRFbGVtZW50VHlwZSgpLCBOdW1TdWJFbHRzKTsKKworICAgIC8vIEZpcnN0bHksIHRoZSBjb3N0IG9mIGxvYWQvc3RvcmUgb3BlcmF0aW9uLgorICAgIHVuc2lnbmVkIENvc3QgPSBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRNZW1vcnlPcENvc3QoCisgICAgICAgIE9wY29kZSwgVmVjVHksIEFsaWdubWVudCwgQWRkcmVzc1NwYWNlKTsKKworICAgIC8vIExlZ2FsaXplIHRoZSB2ZWN0b3IgdHlwZSwgYW5kIGdldCB0aGUgbGVnYWxpemVkIGFuZCB1bmxlZ2FsaXplZCB0eXBlCisgICAgLy8gc2l6ZXMuCisgICAgTVZUIFZlY1R5TFQgPSBnZXRUTEkoKS0+Z2V0VHlwZUxlZ2FsaXphdGlvbkNvc3QoREwsIFZlY1R5KS5zZWNvbmQ7CisgICAgdW5zaWduZWQgVmVjVHlTaXplID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0RGF0YUxheW91dCgpLmdldFR5cGVTdG9yZVNpemUoVmVjVHkpOworICAgIHVuc2lnbmVkIFZlY1R5TFRTaXplID0gVmVjVHlMVC5nZXRTdG9yZVNpemUoKTsKKworICAgIC8vIFJldHVybiB0aGUgY2VpbGluZyBvZiBkaXZpZGluZyBBIGJ5IEIuCisgICAgYXV0byBjZWlsID0gW10odW5zaWduZWQgQSwgdW5zaWduZWQgQikgeyByZXR1cm4gKEEgKyBCIC0gMSkgLyBCOyB9OworCisgICAgLy8gU2NhbGUgdGhlIGNvc3Qgb2YgdGhlIG1lbW9yeSBvcGVyYXRpb24gYnkgdGhlIGZyYWN0aW9uIG9mIGxlZ2FsaXplZAorICAgIC8vIGluc3RydWN0aW9ucyB0aGF0IHdpbGwgYWN0dWFsbHkgYmUgdXNlZC4gV2Ugc2hvdWxkbid0IGFjY291bnQgZm9yIHRoZQorICAgIC8vIGNvc3Qgb2YgZGVhZCBpbnN0cnVjdGlvbnMgc2luY2UgdGhleSB3aWxsIGJlIHJlbW92ZWQuCisgICAgLy8KKyAgICAvLyBFLmcuLCBBbiBpbnRlcmxlYXZlZCBsb2FkIG9mIGZhY3RvciA4OgorICAgIC8vICAgICAgICV2ZWMgPSBsb2FkIDwxNiB4IGk2ND4sIDwxNiB4IGk2ND4qICVwdHIKKyAgICAvLyAgICAgICAldjAgPSBzaHVmZmxldmVjdG9yICV2ZWMsIHVuZGVmLCA8MCwgOD4KKyAgICAvLworICAgIC8vIElmIDwxNiB4IGk2ND4gaXMgbGVnYWxpemVkIHRvIDggdjJpNjQgbG9hZHMsIG9ubHkgMiBvZiB0aGUgbG9hZHMgd2lsbCBiZQorICAgIC8vIHVzZWQgKHRob3NlIGNvcnJlc3BvbmRpbmcgdG8gZWxlbWVudHMgWzA6MV0gYW5kIFs4OjldIG9mIHRoZSB1bmxlZ2FsaXplZAorICAgIC8vIHR5cGUpLiBUaGUgb3RoZXIgbG9hZHMgYXJlIHVudXNlZC4KKyAgICAvLworICAgIC8vIFdlIG9ubHkgc2NhbGUgdGhlIGNvc3Qgb2YgbG9hZHMgc2luY2UgaW50ZXJsZWF2ZWQgc3RvcmUgZ3JvdXBzIGFyZW4ndAorICAgIC8vIGFsbG93ZWQgdG8gaGF2ZSBnYXBzLgorICAgIGlmIChPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OkxvYWQgJiYgVmVjVHlTaXplID4gVmVjVHlMVFNpemUpIHsKKyAgICAgIC8vIFRoZSBudW1iZXIgb2YgbG9hZHMgb2YgYSBsZWdhbCB0eXBlIGl0IHdpbGwgdGFrZSB0byByZXByZXNlbnQgYSBsb2FkCisgICAgICAvLyBvZiB0aGUgdW5sZWdhbGl6ZWQgdmVjdG9yIHR5cGUuCisgICAgICB1bnNpZ25lZCBOdW1MZWdhbEluc3RzID0gY2VpbChWZWNUeVNpemUsIFZlY1R5TFRTaXplKTsKKworICAgICAgLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgdW5sZWdhbGl6ZWQgdHlwZSB0aGF0IGNvcnJlc3BvbmQgdG8gYQorICAgICAgLy8gc2luZ2xlIGxlZ2FsIGluc3RydWN0aW9uLgorICAgICAgdW5zaWduZWQgTnVtRWx0c1BlckxlZ2FsSW5zdCA9IGNlaWwoTnVtRWx0cywgTnVtTGVnYWxJbnN0cyk7CisKKyAgICAgIC8vIERldGVybWluZSB3aGljaCBsZWdhbCBpbnN0cnVjdGlvbnMgd2lsbCBiZSB1c2VkLgorICAgICAgQml0VmVjdG9yIFVzZWRJbnN0cyhOdW1MZWdhbEluc3RzLCBmYWxzZSk7CisgICAgICBmb3IgKHVuc2lnbmVkIEluZGV4IDogSW5kaWNlcykKKyAgICAgICAgZm9yICh1bnNpZ25lZCBFbHQgPSAwOyBFbHQgPCBOdW1TdWJFbHRzOyArK0VsdCkKKyAgICAgICAgICBVc2VkSW5zdHMuc2V0KChJbmRleCArIEVsdCAqIEZhY3RvcikgLyBOdW1FbHRzUGVyTGVnYWxJbnN0KTsKKworICAgICAgLy8gU2NhbGUgdGhlIGNvc3Qgb2YgdGhlIGxvYWQgYnkgdGhlIGZyYWN0aW9uIG9mIGxlZ2FsIGluc3RydWN0aW9ucyB0aGF0CisgICAgICAvLyB3aWxsIGJlIHVzZWQuCisgICAgICBDb3N0ICo9IFVzZWRJbnN0cy5jb3VudCgpIC8gTnVtTGVnYWxJbnN0czsKKyAgICB9CisKKyAgICAvLyBUaGVuIHBsdXMgdGhlIGNvc3Qgb2YgaW50ZXJsZWF2ZSBvcGVyYXRpb24uCisgICAgaWYgKE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6TG9hZCkgeworICAgICAgLy8gVGhlIGludGVybGVhdmUgY29zdCBpcyBzaW1pbGFyIHRvIGV4dHJhY3Qgc3ViIHZlY3RvcnMnIGVsZW1lbnRzCisgICAgICAvLyBmcm9tIHRoZSB3aWRlIHZlY3RvciwgYW5kIGluc2VydCB0aGVtIGludG8gc3ViIHZlY3RvcnMuCisgICAgICAvLworICAgICAgLy8gRS5nLiBBbiBpbnRlcmxlYXZlZCBsb2FkIG9mIGZhY3RvciAyICh3aXRoIG9uZSBtZW1iZXIgb2YgaW5kZXggMCk6CisgICAgICAvLyAgICAgICV2ZWMgPSBsb2FkIDw4IHggaTMyPiwgPDggeCBpMzI+KiAlcHRyCisgICAgICAvLyAgICAgICV2MCA9IHNodWZmbGUgJXZlYywgdW5kZWYsIDwwLCAyLCA0LCA2PiAgICAgICAgIDsgSW5kZXggMAorICAgICAgLy8gVGhlIGNvc3QgaXMgZXN0aW1hdGVkIGFzIGV4dHJhY3QgZWxlbWVudHMgYXQgMCwgMiwgNCwgNiBmcm9tIHRoZQorICAgICAgLy8gPDggeCBpMzI+IHZlY3RvciBhbmQgaW5zZXJ0IHRoZW0gaW50byBhIDw0IHggaTMyPiB2ZWN0b3IuCisKKyAgICAgIGFzc2VydChJbmRpY2VzLnNpemUoKSA8PSBGYWN0b3IgJiYKKyAgICAgICAgICAgICAiSW50ZXJsZWF2ZWQgbWVtb3J5IG9wIGhhcyB0b28gbWFueSBtZW1iZXJzIik7CisKKyAgICAgIGZvciAodW5zaWduZWQgSW5kZXggOiBJbmRpY2VzKSB7CisgICAgICAgIGFzc2VydChJbmRleCA8IEZhY3RvciAmJiAiSW52YWxpZCBpbmRleCBmb3IgaW50ZXJsZWF2ZWQgbWVtb3J5IG9wIik7CisKKyAgICAgICAgLy8gRXh0cmFjdCBlbGVtZW50cyBmcm9tIGxvYWRlZCB2ZWN0b3IgZm9yIGVhY2ggc3ViIHZlY3Rvci4KKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bVN1YkVsdHM7IGkrKykKKyAgICAgICAgICBDb3N0ICs9IHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldFZlY3Rvckluc3RyQ29zdCgKKyAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb246OkV4dHJhY3RFbGVtZW50LCBWVCwgSW5kZXggKyBpICogRmFjdG9yKTsKKyAgICAgIH0KKworICAgICAgdW5zaWduZWQgSW5zU3ViQ29zdCA9IDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtU3ViRWx0czsgaSsrKQorICAgICAgICBJbnNTdWJDb3N0ICs9IHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldFZlY3Rvckluc3RyQ29zdCgKKyAgICAgICAgICAgIEluc3RydWN0aW9uOjpJbnNlcnRFbGVtZW50LCBTdWJWVCwgaSk7CisKKyAgICAgIENvc3QgKz0gSW5kaWNlcy5zaXplKCkgKiBJbnNTdWJDb3N0OworICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGUgaW50ZXJsZWF2ZSBjb3N0IGlzIGV4dHJhY3QgYWxsIGVsZW1lbnRzIGZyb20gc3ViIHZlY3RvcnMsIGFuZAorICAgICAgLy8gaW5zZXJ0IHRoZW0gaW50byB0aGUgd2lkZSB2ZWN0b3IuCisgICAgICAvLworICAgICAgLy8gRS5nLiBBbiBpbnRlcmxlYXZlZCBzdG9yZSBvZiBmYWN0b3IgMjoKKyAgICAgIC8vICAgICAgJXYwX3YxID0gc2h1ZmZsZSAldjAsICV2MSwgPDAsIDQsIDEsIDUsIDIsIDYsIDMsIDc+CisgICAgICAvLyAgICAgIHN0b3JlIDw4IHggaTMyPiAlaW50ZXJsZWF2ZWQudmVjLCA8OCB4IGkzMj4qICVwdHIKKyAgICAgIC8vIFRoZSBjb3N0IGlzIGVzdGltYXRlZCBhcyBleHRyYWN0IGFsbCBlbGVtZW50cyBmcm9tIGJvdGggPDQgeCBpMzI+CisgICAgICAvLyB2ZWN0b3JzIGFuZCBpbnNlcnQgaW50byB0aGUgPDggeCBpMzI+IHZlY3Rvci4KKworICAgICAgdW5zaWduZWQgRXh0U3ViQ29zdCA9IDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtU3ViRWx0czsgaSsrKQorICAgICAgICBFeHRTdWJDb3N0ICs9IHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldFZlY3Rvckluc3RyQ29zdCgKKyAgICAgICAgICAgIEluc3RydWN0aW9uOjpFeHRyYWN0RWxlbWVudCwgU3ViVlQsIGkpOworICAgICAgQ29zdCArPSBFeHRTdWJDb3N0ICogRmFjdG9yOworCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtRWx0czsgaSsrKQorICAgICAgICBDb3N0ICs9IHN0YXRpY19jYXN0PFQgKj4odGhpcykKKyAgICAgICAgICAgICAgICAgICAgLT5nZXRWZWN0b3JJbnN0ckNvc3QoSW5zdHJ1Y3Rpb246Okluc2VydEVsZW1lbnQsIFZULCBpKTsKKyAgICB9CisKKyAgICByZXR1cm4gQ29zdDsKKyAgfQorCisgIC8vLyBHZXQgaW50cmluc2ljIGNvc3QgYmFzZWQgb24gYXJndW1lbnRzLgorICB1bnNpZ25lZCBnZXRJbnRyaW5zaWNJbnN0ckNvc3QoSW50cmluc2ljOjpJRCBJSUQsIFR5cGUgKlJldFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywgRmFzdE1hdGhGbGFncyBGTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWRiA9IDEpIHsKKyAgICB1bnNpZ25lZCBSZXRWRiA9IChSZXRUeS0+aXNWZWN0b3JUeSgpID8gUmV0VHktPmdldFZlY3Rvck51bUVsZW1lbnRzKCkgOiAxKTsKKyAgICBhc3NlcnQoKFJldFZGID09IDEgfHwgVkYgPT0gMSkgJiYgIlZGID4gMSBhbmQgUmV0VkYgaXMgYSB2ZWN0b3IgdHlwZSIpOworCisgICAgc3dpdGNoIChJSUQpIHsKKyAgICBkZWZhdWx0OiB7CisgICAgICAvLyBBc3N1bWUgdGhhdCB3ZSBuZWVkIHRvIHNjYWxhcml6ZSB0aGlzIGludHJpbnNpYy4KKyAgICAgIFNtYWxsVmVjdG9yPFR5cGUgKiwgND4gVHlwZXM7CisgICAgICBmb3IgKFZhbHVlICpPcCA6IEFyZ3MpIHsKKyAgICAgICAgVHlwZSAqT3BUeSA9IE9wLT5nZXRUeXBlKCk7CisgICAgICAgIGFzc2VydChWRiA9PSAxIHx8ICFPcFR5LT5pc1ZlY3RvclR5KCkpOworICAgICAgICBUeXBlcy5wdXNoX2JhY2soVkYgPT0gMSA/IE9wVHkgOiBWZWN0b3JUeXBlOjpnZXQoT3BUeSwgVkYpKTsKKyAgICAgIH0KKworICAgICAgaWYgKFZGID4gMSAmJiAhUmV0VHktPmlzVm9pZFR5KCkpCisgICAgICAgIFJldFR5ID0gVmVjdG9yVHlwZTo6Z2V0KFJldFR5LCBWRik7CisKKyAgICAgIC8vIENvbXB1dGUgdGhlIHNjYWxhcml6YXRpb24gb3ZlcmhlYWQgYmFzZWQgb24gQXJncyBmb3IgYSB2ZWN0b3IKKyAgICAgIC8vIGludHJpbnNpYy4gQSB2ZWN0b3JpemVyIHdpbGwgcGFzcyBhIHNjYWxhciBSZXRUeSBhbmQgVkYgPiAxLCB3aGlsZQorICAgICAgLy8gQ29zdE1vZGVsIHdpbGwgcGFzcyBhIHZlY3RvciBSZXRUeSBhbmQgVkYgaXMgMS4KKyAgICAgIHVuc2lnbmVkIFNjYWxhcml6YXRpb25Db3N0ID0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpOworICAgICAgaWYgKFJldFZGID4gMSB8fCBWRiA+IDEpIHsKKyAgICAgICAgU2NhbGFyaXphdGlvbkNvc3QgPSAwOworICAgICAgICBpZiAoIVJldFR5LT5pc1ZvaWRUeSgpKQorICAgICAgICAgIFNjYWxhcml6YXRpb25Db3N0ICs9IGdldFNjYWxhcml6YXRpb25PdmVyaGVhZChSZXRUeSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBTY2FsYXJpemF0aW9uQ29zdCArPSBnZXRPcGVyYW5kc1NjYWxhcml6YXRpb25PdmVyaGVhZChBcmdzLCBWRik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT4KKyAgICAgICAgZ2V0SW50cmluc2ljSW5zdHJDb3N0KElJRCwgUmV0VHksIFR5cGVzLCBGTUYsIFNjYWxhcml6YXRpb25Db3N0KTsKKyAgICB9CisgICAgY2FzZSBJbnRyaW5zaWM6Om1hc2tlZF9zY2F0dGVyOiB7CisgICAgICBhc3NlcnQoVkYgPT0gMSAmJiAiQ2FuJ3QgdmVjdG9yaXplIHR5cGVzIGhlcmUuIik7CisgICAgICBWYWx1ZSAqTWFzayA9IEFyZ3NbM107CisgICAgICBib29sIFZhck1hc2sgPSAhaXNhPENvbnN0YW50PihNYXNrKTsKKyAgICAgIHVuc2lnbmVkIEFsaWdubWVudCA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEFyZ3NbMl0pLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIHJldHVybgorICAgICAgICBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRHYXRoZXJTY2F0dGVyT3BDb3N0KEluc3RydWN0aW9uOjpTdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzWzBdLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnc1sxXSwgVmFyTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQpOworICAgIH0KKyAgICBjYXNlIEludHJpbnNpYzo6bWFza2VkX2dhdGhlcjogeworICAgICAgYXNzZXJ0KFZGID09IDEgJiYgIkNhbid0IHZlY3Rvcml6ZSB0eXBlcyBoZXJlLiIpOworICAgICAgVmFsdWUgKk1hc2sgPSBBcmdzWzJdOworICAgICAgYm9vbCBWYXJNYXNrID0gIWlzYTxDb25zdGFudD4oTWFzayk7CisgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQgPSBjYXN0PENvbnN0YW50SW50PihBcmdzWzFdKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICByZXR1cm4KKyAgICAgICAgc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0R2F0aGVyU2NhdHRlck9wQ29zdChJbnN0cnVjdGlvbjo6TG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXRUeSwgQXJnc1swXSwgVmFyTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQpOworICAgIH0KKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfYWRkOgorICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9tdWw6CisgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX2FuZDoKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2Vfb3I6CisgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX3hvcjoKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfZmFkZDoKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfZm11bDoKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2Vfc21heDoKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2Vfc21pbjoKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfZm1heDoKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfZm1pbjoKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfdW1heDoKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfdW1pbjoKKyAgICAgIHJldHVybiBnZXRJbnRyaW5zaWNJbnN0ckNvc3QoSUlELCBSZXRUeSwgQXJnc1swXS0+Z2V0VHlwZSgpLCBGTUYpOworICAgIH0KKyAgfQorCisgIC8vLyBHZXQgaW50cmluc2ljIGNvc3QgYmFzZWQgb24gYXJndW1lbnQgdHlwZXMuCisgIC8vLyBJZiBTY2FsYXJpemF0aW9uQ29zdFBhc3NlZCBpcyBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCksIHRoZQorICAvLy8gY29zdCBvZiBzY2FsYXJpemluZyB0aGUgYXJndW1lbnRzIGFuZCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgY29tcHV0ZWQKKyAgLy8vIGJhc2VkIG9uIHR5cGVzLgorICB1bnNpZ25lZCBnZXRJbnRyaW5zaWNJbnN0ckNvc3QoCisgICAgICBJbnRyaW5zaWM6OklEIElJRCwgVHlwZSAqUmV0VHksIEFycmF5UmVmPFR5cGUgKj4gVHlzLCBGYXN0TWF0aEZsYWdzIEZNRiwKKyAgICAgIHVuc2lnbmVkIFNjYWxhcml6YXRpb25Db3N0UGFzc2VkID0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpKSB7CisgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDI+IElTRHM7CisgICAgdW5zaWduZWQgU2luZ2xlQ2FsbENvc3QgPSAxMDsgLy8gTGlicmFyeSBjYWxsIGNvc3QuIE1ha2UgaXQgZXhwZW5zaXZlLgorICAgIHN3aXRjaCAoSUlEKSB7CisgICAgZGVmYXVsdDogeworICAgICAgLy8gQXNzdW1lIHRoYXQgd2UgbmVlZCB0byBzY2FsYXJpemUgdGhpcyBpbnRyaW5zaWMuCisgICAgICB1bnNpZ25lZCBTY2FsYXJpemF0aW9uQ29zdCA9IFNjYWxhcml6YXRpb25Db3N0UGFzc2VkOworICAgICAgdW5zaWduZWQgU2NhbGFyQ2FsbHMgPSAxOworICAgICAgVHlwZSAqU2NhbGFyUmV0VHkgPSBSZXRUeTsKKyAgICAgIGlmIChSZXRUeS0+aXNWZWN0b3JUeSgpKSB7CisgICAgICAgIGlmIChTY2FsYXJpemF0aW9uQ29zdFBhc3NlZCA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkpCisgICAgICAgICAgU2NhbGFyaXphdGlvbkNvc3QgPSBnZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoUmV0VHksIHRydWUsIGZhbHNlKTsKKyAgICAgICAgU2NhbGFyQ2FsbHMgPSBzdGQ6Om1heChTY2FsYXJDYWxscywgUmV0VHktPmdldFZlY3Rvck51bUVsZW1lbnRzKCkpOworICAgICAgICBTY2FsYXJSZXRUeSA9IFJldFR5LT5nZXRTY2FsYXJUeXBlKCk7CisgICAgICB9CisgICAgICBTbWFsbFZlY3RvcjxUeXBlICosIDQ+IFNjYWxhclR5czsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGllID0gVHlzLnNpemUoKTsgaSAhPSBpZTsgKytpKSB7CisgICAgICAgIFR5cGUgKlR5ID0gVHlzW2ldOworICAgICAgICBpZiAoVHktPmlzVmVjdG9yVHkoKSkgeworICAgICAgICAgIGlmIChTY2FsYXJpemF0aW9uQ29zdFBhc3NlZCA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkpCisgICAgICAgICAgICBTY2FsYXJpemF0aW9uQ29zdCArPSBnZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoVHksIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICBTY2FsYXJDYWxscyA9IHN0ZDo6bWF4KFNjYWxhckNhbGxzLCBUeS0+Z2V0VmVjdG9yTnVtRWxlbWVudHMoKSk7CisgICAgICAgICAgVHkgPSBUeS0+Z2V0U2NhbGFyVHlwZSgpOworICAgICAgICB9CisgICAgICAgIFNjYWxhclR5cy5wdXNoX2JhY2soVHkpOworICAgICAgfQorICAgICAgaWYgKFNjYWxhckNhbGxzID09IDEpCisgICAgICAgIHJldHVybiAxOyAvLyBSZXR1cm4gY29zdCBvZiBhIHNjYWxhciBpbnRyaW5zaWMuIEFzc3VtZSBpdCB0byBiZSBjaGVhcC4KKworICAgICAgdW5zaWduZWQgU2NhbGFyQ29zdCA9IHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldEludHJpbnNpY0luc3RyQ29zdCgKKyAgICAgICAgICBJSUQsIFNjYWxhclJldFR5LCBTY2FsYXJUeXMsIEZNRik7CisKKyAgICAgIHJldHVybiBTY2FsYXJDYWxscyAqIFNjYWxhckNvc3QgKyBTY2FsYXJpemF0aW9uQ29zdDsKKyAgICB9CisgICAgLy8gTG9vayBmb3IgaW50cmluc2ljcyB0aGF0IGNhbiBiZSBsb3dlcmVkIGRpcmVjdGx5IG9yIHR1cm5lZCBpbnRvIGEgc2NhbGFyCisgICAgLy8gaW50cmluc2ljIGNhbGwuCisgICAgY2FzZSBJbnRyaW5zaWM6OnNxcnQ6CisgICAgICBJU0RzLnB1c2hfYmFjayhJU0Q6OkZTUVJUKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjpzaW46CisgICAgICBJU0RzLnB1c2hfYmFjayhJU0Q6OkZTSU4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6OmNvczoKKyAgICAgIElTRHMucHVzaF9iYWNrKElTRDo6RkNPUyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwOgorICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGRVhQKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjpleHAyOgorICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGRVhQMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6bG9nOgorICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGTE9HKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjpsb2cxMDoKKyAgICAgIElTRHMucHVzaF9iYWNrKElTRDo6RkxPRzEwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjpsb2cyOgorICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGTE9HMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6ZmFiczoKKyAgICAgIElTRHMucHVzaF9iYWNrKElTRDo6RkFCUyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6bWlubnVtOgorICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGTUlOTlVNKTsKKyAgICAgIGlmIChGTUYubm9OYU5zKCkpCisgICAgICAgIElTRHMucHVzaF9iYWNrKElTRDo6Rk1JTk5BTik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6bWF4bnVtOgorICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGTUFYTlVNKTsKKyAgICAgIGlmIChGTUYubm9OYU5zKCkpCisgICAgICAgIElTRHMucHVzaF9iYWNrKElTRDo6Rk1BWE5BTik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6Y29weXNpZ246CisgICAgICBJU0RzLnB1c2hfYmFjayhJU0Q6OkZDT1BZU0lHTik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6Zmxvb3I6CisgICAgICBJU0RzLnB1c2hfYmFjayhJU0Q6OkZGTE9PUik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6Y2VpbDoKKyAgICAgIElTRHMucHVzaF9iYWNrKElTRDo6RkNFSUwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6OnRydW5jOgorICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGVFJVTkMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6Om5lYXJieWludDoKKyAgICAgIElTRHMucHVzaF9iYWNrKElTRDo6Rk5FQVJCWUlOVCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6cmludDoKKyAgICAgIElTRHMucHVzaF9iYWNrKElTRDo6RlJJTlQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6OnJvdW5kOgorICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGUk9VTkQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6OnBvdzoKKyAgICAgIElTRHMucHVzaF9iYWNrKElTRDo6RlBPVyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6Zm1hOgorICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGTUEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6OmZtdWxhZGQ6CisgICAgICBJU0RzLnB1c2hfYmFjayhJU0Q6OkZNQSk7CisgICAgICBicmVhazsKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHJldHVybiAwIHdoZW5ldmVyIGdldEludHJpbnNpY0Nvc3QgPT0gVENDX0ZyZWUuCisgICAgY2FzZSBJbnRyaW5zaWM6OmxpZmV0aW1lX3N0YXJ0OgorICAgIGNhc2UgSW50cmluc2ljOjpsaWZldGltZV9lbmQ6CisgICAgY2FzZSBJbnRyaW5zaWM6OnNpZGVlZmZlY3Q6CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIEludHJpbnNpYzo6bWFza2VkX3N0b3JlOgorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4odGhpcykKKyAgICAgICAgICAtPmdldE1hc2tlZE1lbW9yeU9wQ29zdChJbnN0cnVjdGlvbjo6U3RvcmUsIFR5c1swXSwgMCwgMCk7CisgICAgY2FzZSBJbnRyaW5zaWM6Om1hc2tlZF9sb2FkOgorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4odGhpcykKKyAgICAgICAgICAtPmdldE1hc2tlZE1lbW9yeU9wQ29zdChJbnN0cnVjdGlvbjo6TG9hZCwgUmV0VHksIDAsIDApOworICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9hZGQ6CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0QXJpdGhtZXRpY1JlZHVjdGlvbkNvc3QoCisgICAgICAgICAgSW5zdHJ1Y3Rpb246OkFkZCwgVHlzWzBdLCAvKklzUGFpcndpc2VGb3JtPSovZmFsc2UpOworICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9tdWw6CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0QXJpdGhtZXRpY1JlZHVjdGlvbkNvc3QoCisgICAgICAgICAgSW5zdHJ1Y3Rpb246Ok11bCwgVHlzWzBdLCAvKklzUGFpcndpc2VGb3JtPSovZmFsc2UpOworICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9hbmQ6CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0QXJpdGhtZXRpY1JlZHVjdGlvbkNvc3QoCisgICAgICAgICAgSW5zdHJ1Y3Rpb246OkFuZCwgVHlzWzBdLCAvKklzUGFpcndpc2VGb3JtPSovZmFsc2UpOworICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9vcjoKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRBcml0aG1ldGljUmVkdWN0aW9uQ29zdCgKKyAgICAgICAgICBJbnN0cnVjdGlvbjo6T3IsIFR5c1swXSwgLypJc1BhaXJ3aXNlRm9ybT0qL2ZhbHNlKTsKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfeG9yOgorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldEFyaXRobWV0aWNSZWR1Y3Rpb25Db3N0KAorICAgICAgICAgIEluc3RydWN0aW9uOjpYb3IsIFR5c1swXSwgLypJc1BhaXJ3aXNlRm9ybT0qL2ZhbHNlKTsKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfZmFkZDoKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRBcml0aG1ldGljUmVkdWN0aW9uQ29zdCgKKyAgICAgICAgICBJbnN0cnVjdGlvbjo6RkFkZCwgVHlzWzBdLCAvKklzUGFpcndpc2VGb3JtPSovZmFsc2UpOworICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9mbXVsOgorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldEFyaXRobWV0aWNSZWR1Y3Rpb25Db3N0KAorICAgICAgICAgIEluc3RydWN0aW9uOjpGTXVsLCBUeXNbMF0sIC8qSXNQYWlyd2lzZUZvcm09Ki9mYWxzZSk7CisgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX3NtYXg6CisgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX3NtaW46CisgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX2ZtYXg6CisgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX2ZtaW46CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0TWluTWF4UmVkdWN0aW9uQ29zdCgKKyAgICAgICAgICBUeXNbMF0sIENtcEluc3Q6Om1ha2VDbXBSZXN1bHRUeXBlKFR5c1swXSksIC8qSXNQYWlyd2lzZUZvcm09Ki9mYWxzZSwKKyAgICAgICAgICAvKklzU2lnbmVkPSovdHJ1ZSk7CisgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX3VtYXg6CisgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX3VtaW46CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0TWluTWF4UmVkdWN0aW9uQ29zdCgKKyAgICAgICAgICBUeXNbMF0sIENtcEluc3Q6Om1ha2VDbXBSZXN1bHRUeXBlKFR5c1swXSksIC8qSXNQYWlyd2lzZUZvcm09Ki9mYWxzZSwKKyAgICAgICAgICAvKklzU2lnbmVkPSovZmFsc2UpOworICAgIGNhc2UgSW50cmluc2ljOjpjdHBvcDoKKyAgICAgIElTRHMucHVzaF9iYWNrKElTRDo6Q1RQT1ApOworICAgICAgLy8gSW4gY2FzZSBvZiBsZWdhbGl6YXRpb24gdXNlIFRDQ19FeHBlbnNpdmUuIFRoaXMgaXMgY2hlYXBlciB0aGFuIGEKKyAgICAgIC8vIGxpYnJhcnkgY2FsbCBidXQgc3RpbGwgbm90IGEgY2hlYXAgaW5zdHJ1Y3Rpb24uCisgICAgICBTaW5nbGVDYWxsQ29zdCA9IFRhcmdldFRyYW5zZm9ybUluZm86OlRDQ19FeHBlbnNpdmU7CisgICAgICBicmVhazsKKyAgICAvLyBGSVhNRTogY3RseiwgY3R0eiwgLi4uCisgICAgfQorCisgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmdCYXNlICpUTEkgPSBnZXRUTEkoKTsKKyAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIE1WVD4gTFQgPSBUTEktPmdldFR5cGVMZWdhbGl6YXRpb25Db3N0KERMLCBSZXRUeSk7CisKKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMj4gTGVnYWxDb3N0OworICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAyPiBDdXN0b21Db3N0OworICAgIGZvciAodW5zaWduZWQgSVNEIDogSVNEcykgeworICAgICAgaWYgKFRMSS0+aXNPcGVyYXRpb25MZWdhbE9yUHJvbW90ZShJU0QsIExULnNlY29uZCkpIHsKKyAgICAgICAgaWYgKElJRCA9PSBJbnRyaW5zaWM6OmZhYnMgJiYgVExJLT5pc0ZBYnNGcmVlKExULnNlY29uZCkpIHsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBvcGVyYXRpb24gaXMgbGVnYWwuIEFzc3VtZSBpdCBjb3N0cyAxLgorICAgICAgICAvLyBJZiB0aGUgdHlwZSBpcyBzcGxpdCB0byBtdWx0aXBsZSByZWdpc3RlcnMsIGFzc3VtZSB0aGF0IHRoZXJlIGlzIHNvbWUKKyAgICAgICAgLy8gb3ZlcmhlYWQgdG8gdGhpcy4KKyAgICAgICAgLy8gVE9ETzogT25jZSB3ZSBoYXZlIGV4dHJhY3QvaW5zZXJ0IHN1YnZlY3RvciBjb3N0IHdlIG5lZWQgdG8gdXNlIHRoZW0uCisgICAgICAgIGlmIChMVC5maXJzdCA+IDEpCisgICAgICAgICAgTGVnYWxDb3N0LnB1c2hfYmFjayhMVC5maXJzdCAqIDIpOworICAgICAgICBlbHNlCisgICAgICAgICAgTGVnYWxDb3N0LnB1c2hfYmFjayhMVC5maXJzdCAqIDEpOworICAgICAgfSBlbHNlIGlmICghVExJLT5pc09wZXJhdGlvbkV4cGFuZChJU0QsIExULnNlY29uZCkpIHsKKyAgICAgICAgLy8gSWYgdGhlIG9wZXJhdGlvbiBpcyBjdXN0b20gbG93ZXJlZCB0aGVuIGFzc3VtZQorICAgICAgICAvLyB0aGF0IHRoZSBjb2RlIGlzIHR3aWNlIGFzIGV4cGVuc2l2ZS4KKyAgICAgICAgQ3VzdG9tQ29zdC5wdXNoX2JhY2soTFQuZmlyc3QgKiAyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIE1pbkxlZ2FsQ29zdEkgPSBzdGQ6Om1pbl9lbGVtZW50KExlZ2FsQ29zdC5iZWdpbigpLCBMZWdhbENvc3QuZW5kKCkpOworICAgIGlmIChNaW5MZWdhbENvc3RJICE9IExlZ2FsQ29zdC5lbmQoKSkKKyAgICAgIHJldHVybiAqTWluTGVnYWxDb3N0STsKKworICAgIGF1dG8gTWluQ3VzdG9tQ29zdEkgPSBzdGQ6Om1pbl9lbGVtZW50KEN1c3RvbUNvc3QuYmVnaW4oKSwgQ3VzdG9tQ29zdC5lbmQoKSk7CisgICAgaWYgKE1pbkN1c3RvbUNvc3RJICE9IEN1c3RvbUNvc3QuZW5kKCkpCisgICAgICByZXR1cm4gKk1pbkN1c3RvbUNvc3RJOworCisgICAgLy8gSWYgd2UgY2FuJ3QgbG93ZXIgZm11bGFkZCBpbnRvIGFuIEZNQSBlc3RpbWF0ZSB0aGUgY29zdCBhcyBhIGZsb2F0aW5nCisgICAgLy8gcG9pbnQgbXVsIGZvbGxvd2VkIGJ5IGFuIGFkZC4KKyAgICBpZiAoSUlEID09IEludHJpbnNpYzo6Zm11bGFkZCkKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpCisgICAgICAgICAgICAgICAgIC0+Z2V0QXJpdGhtZXRpY0luc3RyQ29zdChCaW5hcnlPcGVyYXRvcjo6Rk11bCwgUmV0VHkpICsKKyAgICAgICAgICAgICBzdGF0aWNfY2FzdDxUICo+KHRoaXMpCisgICAgICAgICAgICAgICAgIC0+Z2V0QXJpdGhtZXRpY0luc3RyQ29zdChCaW5hcnlPcGVyYXRvcjo6RkFkZCwgUmV0VHkpOworCisgICAgLy8gRWxzZSwgYXNzdW1lIHRoYXQgd2UgbmVlZCB0byBzY2FsYXJpemUgdGhpcyBpbnRyaW5zaWMuIEZvciBtYXRoIGJ1aWx0aW5zCisgICAgLy8gdGhpcyB3aWxsIGVtaXQgYSBjb3N0bHkgbGliY2FsbCwgYWRkaW5nIGNhbGwgb3ZlcmhlYWQgYW5kIHNwaWxscy4gTWFrZSBpdAorICAgIC8vIHZlcnkgZXhwZW5zaXZlLgorICAgIGlmIChSZXRUeS0+aXNWZWN0b3JUeSgpKSB7CisgICAgICB1bnNpZ25lZCBTY2FsYXJpemF0aW9uQ29zdCA9CisgICAgICAgICAgKChTY2FsYXJpemF0aW9uQ29zdFBhc3NlZCAhPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkpCisgICAgICAgICAgICAgICA/IFNjYWxhcml6YXRpb25Db3N0UGFzc2VkCisgICAgICAgICAgICAgICA6IGdldFNjYWxhcml6YXRpb25PdmVyaGVhZChSZXRUeSwgdHJ1ZSwgZmFsc2UpKTsKKyAgICAgIHVuc2lnbmVkIFNjYWxhckNhbGxzID0gUmV0VHktPmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgICBTbWFsbFZlY3RvcjxUeXBlICosIDQ+IFNjYWxhclR5czsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGllID0gVHlzLnNpemUoKTsgaSAhPSBpZTsgKytpKSB7CisgICAgICAgIFR5cGUgKlR5ID0gVHlzW2ldOworICAgICAgICBpZiAoVHktPmlzVmVjdG9yVHkoKSkKKyAgICAgICAgICBUeSA9IFR5LT5nZXRTY2FsYXJUeXBlKCk7CisgICAgICAgIFNjYWxhclR5cy5wdXNoX2JhY2soVHkpOworICAgICAgfQorICAgICAgdW5zaWduZWQgU2NhbGFyQ29zdCA9IHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldEludHJpbnNpY0luc3RyQ29zdCgKKyAgICAgICAgICBJSUQsIFJldFR5LT5nZXRTY2FsYXJUeXBlKCksIFNjYWxhclR5cywgRk1GKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGllID0gVHlzLnNpemUoKTsgaSAhPSBpZTsgKytpKSB7CisgICAgICAgIGlmIChUeXNbaV0tPmlzVmVjdG9yVHkoKSkgeworICAgICAgICAgIGlmIChTY2FsYXJpemF0aW9uQ29zdFBhc3NlZCA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkpCisgICAgICAgICAgICBTY2FsYXJpemF0aW9uQ29zdCArPSBnZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoVHlzW2ldLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgU2NhbGFyQ2FsbHMgPSBzdGQ6Om1heChTY2FsYXJDYWxscywgVHlzW2ldLT5nZXRWZWN0b3JOdW1FbGVtZW50cygpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gU2NhbGFyQ2FsbHMgKiBTY2FsYXJDb3N0ICsgU2NhbGFyaXphdGlvbkNvc3Q7CisgICAgfQorCisgICAgLy8gVGhpcyBpcyBnb2luZyB0byBiZSB0dXJuZWQgaW50byBhIGxpYnJhcnkgY2FsbCwgbWFrZSBpdCBleHBlbnNpdmUuCisgICAgcmV0dXJuIFNpbmdsZUNhbGxDb3N0OworICB9CisKKyAgLy8vIFxicmllZiBDb21wdXRlIGEgY29zdCBvZiB0aGUgZ2l2ZW4gY2FsbCBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBDb21wdXRlIHRoZSBjb3N0IG9mIGNhbGxpbmcgZnVuY3Rpb24gRiB3aXRoIHJldHVybiB0eXBlIFJldFR5IGFuZAorICAvLy8gYXJndW1lbnQgdHlwZXMgVHlzLiBGIG1pZ2h0IGJlIG51bGxwdHIsIGluIHRoaXMgY2FzZSB0aGUgY29zdCBvZiBhbgorICAvLy8gYXJiaXRyYXJ5IGNhbGwgd2l0aCB0aGUgc3BlY2lmaWVkIHNpZ25hdHVyZSB3aWxsIGJlIHJldHVybmVkLgorICAvLy8gVGhpcyBpcyB1c2VkLCBmb3IgaW5zdGFuY2UsICB3aGVuIHdlIGVzdGltYXRlIGNhbGwgb2YgYSB2ZWN0b3IKKyAgLy8vIGNvdW50ZXJwYXJ0IG9mIHRoZSBnaXZlbiBmdW5jdGlvbi4KKyAgLy8vIFxwYXJhbSBGIENhbGxlZCBmdW5jdGlvbiwgbWlnaHQgYmUgbnVsbHB0ci4KKyAgLy8vIFxwYXJhbSBSZXRUeSBSZXR1cm4gdmFsdWUgdHlwZXMuCisgIC8vLyBccGFyYW0gVHlzIEFyZ3VtZW50IHR5cGVzLgorICAvLy8gXHJldHVybnMgVGhlIGNvc3Qgb2YgQ2FsbCBpbnN0cnVjdGlvbi4KKyAgdW5zaWduZWQgZ2V0Q2FsbEluc3RyQ29zdChGdW5jdGlvbiAqRiwgVHlwZSAqUmV0VHksIEFycmF5UmVmPFR5cGUgKj4gVHlzKSB7CisgICAgcmV0dXJuIDEwOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtYmVyT2ZQYXJ0cyhUeXBlICpUcCkgeworICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgTVZUPiBMVCA9IGdldFRMSSgpLT5nZXRUeXBlTGVnYWxpemF0aW9uQ29zdChETCwgVHApOworICAgIHJldHVybiBMVC5maXJzdDsKKyAgfQorCisgIHVuc2lnbmVkIGdldEFkZHJlc3NDb21wdXRhdGlvbkNvc3QoVHlwZSAqVHksIFNjYWxhckV2b2x1dGlvbiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKikgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIFRyeSB0byBjYWxjdWxhdGUgYXJpdGhtZXRpYyBhbmQgc2h1ZmZsZSBvcCBjb3N0cyBmb3IgcmVkdWN0aW9uIG9wZXJhdGlvbnMuCisgIC8vLyBXZSdyZSBhc3N1bWluZyB0aGF0IHJlZHVjdGlvbiBvcGVyYXRpb24gYXJlIHBlcmZvcm1pbmcgdGhlIGZvbGxvd2luZyB3YXk6CisgIC8vLyAxLiBOb24tcGFpcndpc2UgcmVkdWN0aW9uCisgIC8vLyAldmFsMSA9IHNodWZmbGV2ZWN0b3I8biB4IHQ+ICV2YWwsIDxuIHggdD4gJXVuZGVmLAorICAvLy8gPG4geCBpMzI+IDxpMzIgbi8yLCBpMzIgbi8yICsgMSwgLi4uLCBpMzIgbiwgaTMyIHVuZGVmLCAuLi4sIGkzMiB1bmRlZj4KKyAgLy8vICAgICAgICAgICAgXC0tLS0tLS0tLS0tLS0tLS12LS0tLS0tLS0tLS0tLS8gIFwtLS0tLS0tLS0tdi0tLS0tLS0tLS0tLS8KKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4vMiBlbGVtZW50cyAgICAgICAgICAgICAgIG4vMiBlbGVtZW50cworICAvLy8gJXJlZDEgPSBvcCA8biB4IHQ+ICV2YWwsIDxuIHggdD4gdmFsMQorICAvLy8gQWZ0ZXIgdGhpcyBvcGVyYXRpb24gd2UgaGF2ZSBhIHZlY3RvciAlcmVkMSB3aGVyZSBvbmx5IHRoZSBmaXJzdCBuLzIKKyAgLy8vIGVsZW1lbnRzIGFyZSBtZWFuaW5nZnVsLCB0aGUgc2Vjb25kIG4vMiBlbGVtZW50cyBhcmUgdW5kZWZpbmVkIGFuZCBjYW4gYmUKKyAgLy8vIGRyb3BwZWQuIEFsbCBvdGhlciBvcGVyYXRpb25zIGFyZSBhY3R1YWxseSB3b3JraW5nIHdpdGggdGhlIHZlY3RvciBvZgorICAvLy8gbGVuZ3RoIG4vMiwgbm90IG4sIHRob3VnaCB0aGUgcmVhbCB2ZWN0b3IgbGVuZ3RoIGlzIHN0aWxsIG4uCisgIC8vLyAldmFsMiA9IHNodWZmbGV2ZWN0b3I8biB4IHQ+ICVyZWQxLCA8biB4IHQ+ICV1bmRlZiwKKyAgLy8vIDxuIHggaTMyPiA8aTMyIG4vNCwgaTMyIG4vNCArIDEsIC4uLiwgaTMyIG4vMiwgaTMyIHVuZGVmLCAuLi4sIGkzMiB1bmRlZj4KKyAgLy8vICAgICAgICAgICAgXC0tLS0tLS0tLS0tLS0tLS12LS0tLS0tLS0tLS0tLS8gIFwtLS0tLS0tLS0tdi0tLS0tLS0tLS0tLS8KKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4vNCBlbGVtZW50cyAgICAgICAgICAgICAgIDMqbi80IGVsZW1lbnRzCisgIC8vLyAlcmVkMiA9IG9wIDxuIHggdD4gJXJlZDEsIDxuIHggdD4gdmFsMiAgLSB3b3JraW5nIHdpdGggdGhlIHZlY3RvciBvZgorICAvLy8gbGVuZ3RoIG4vMiwgdGhlIHJlc3VsdGluZyB2ZWN0b3IgaGFzIGxlbmd0aCBuLzQgZXRjLgorICAvLy8gMi4gUGFpcndpc2UgcmVkdWN0aW9uOgorICAvLy8gRXZlcnl0aGluZyBpcyB0aGUgc2FtZSBleGNlcHQgZm9yIGFuIGFkZGl0aW9uYWwgc2h1ZmZsZSBvcGVyYXRpb24gd2hpY2gKKyAgLy8vIGlzIHVzZWQgdG8gcHJvZHVjZSBvcGVyYW5kcyBmb3IgcGFpcndpc2Uga2luZCBvZiByZWR1Y3Rpb25zLgorICAvLy8gJXZhbDEgPSBzaHVmZmxldmVjdG9yPG4geCB0PiAldmFsLCA8biB4IHQ+ICV1bmRlZiwKKyAgLy8vIDxuIHggaTMyPiA8aTMyIDAsIGkzMiAyLCAuLi4sIGkzMiBuLTIsIGkzMiB1bmRlZiwgLi4uLCBpMzIgdW5kZWY+CisgIC8vLyAgICAgICAgICAgIFwtLS0tLS0tLS0tLS0tdi0tLS0tLS0tLS0vICBcLS0tLS0tLS0tLXYtLS0tLS0tLS0tLS0vCisgIC8vLyAgICAgICAgICAgICAgICAgICBuLzIgZWxlbWVudHMgICAgICAgICAgICAgICBuLzIgZWxlbWVudHMKKyAgLy8vICV2YWwyID0gc2h1ZmZsZXZlY3RvcjxuIHggdD4gJXZhbCwgPG4geCB0PiAldW5kZWYsCisgIC8vLyA8biB4IGkzMj4gPGkzMiAxLCBpMzIgMywgLi4uLCBpMzIgbi0xLCBpMzIgdW5kZWYsIC4uLiwgaTMyIHVuZGVmPgorICAvLy8gICAgICAgICAgICBcLS0tLS0tLS0tLS0tLXYtLS0tLS0tLS0tLyAgXC0tLS0tLS0tLS12LS0tLS0tLS0tLS0tLworICAvLy8gICAgICAgICAgICAgICAgICAgbi8yIGVsZW1lbnRzICAgICAgICAgICAgICAgbi8yIGVsZW1lbnRzCisgIC8vLyAlcmVkMSA9IG9wIDxuIHggdD4gJXZhbDEsIDxuIHggdD4gdmFsMgorICAvLy8gQWdhaW4sIHRoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIDxuIHggdD4gdmVjdG9yLCBidXQgdGhlIHJlc3VsdGluZworICAvLy8gdmVjdG9yICVyZWQxIGlzIDxuLzIgeCB0PiB2ZWN0b3IuCisgIC8vLworICAvLy8gVGhlIGNvc3QgbW9kZWwgc2hvdWxkIHRha2UgaW50byBhY2NvdW50IHRoYXQgdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlCisgIC8vLyB2ZWN0b3IgaXMgcmVkdWNlZCBvbiBlYWNoIGl0ZXJhdGlvbi4KKyAgdW5zaWduZWQgZ2V0QXJpdGhtZXRpY1JlZHVjdGlvbkNvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1BhaXJ3aXNlKSB7CisgICAgYXNzZXJ0KFR5LT5pc1ZlY3RvclR5KCkgJiYgIkV4cGVjdCBhIHZlY3RvciB0eXBlIik7CisgICAgVHlwZSAqU2NhbGFyVHkgPSBUeS0+Z2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgICB1bnNpZ25lZCBOdW1WZWNFbHRzID0gVHktPmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgdW5zaWduZWQgTnVtUmVkdXhMZXZlbHMgPSBMb2cyXzMyKE51bVZlY0VsdHMpOworICAgIHVuc2lnbmVkIEFyaXRoQ29zdCA9IDA7CisgICAgdW5zaWduZWQgU2h1ZmZsZUNvc3QgPSAwOworICAgIGF1dG8gKkNvbmNyZXRlVFRJID0gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKTsKKyAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIE1WVD4gTFQgPQorICAgICAgICBDb25jcmV0ZVRUSS0+Z2V0VExJKCktPmdldFR5cGVMZWdhbGl6YXRpb25Db3N0KERMLCBUeSk7CisgICAgdW5zaWduZWQgTG9uZ1ZlY3RvckNvdW50ID0gMDsKKyAgICB1bnNpZ25lZCBNVlRMZW4gPQorICAgICAgICBMVC5zZWNvbmQuaXNWZWN0b3IoKSA/IExULnNlY29uZC5nZXRWZWN0b3JOdW1FbGVtZW50cygpIDogMTsKKyAgICB3aGlsZSAoTnVtVmVjRWx0cyA+IE1WVExlbikgeworICAgICAgTnVtVmVjRWx0cyAvPSAyOworICAgICAgLy8gQXNzdW1lIHRoZSBwYWlyd2lzZSBzaHVmZmxlcyBhZGQgYSBjb3N0LgorICAgICAgU2h1ZmZsZUNvc3QgKz0gKElzUGFpcndpc2UgKyAxKSAqCisgICAgICAgICAgICAgICAgICAgICBDb25jcmV0ZVRUSS0+Z2V0U2h1ZmZsZUNvc3QoVFRJOjpTS19FeHRyYWN0U3VidmVjdG9yLCBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1WZWNFbHRzLCBUeSk7CisgICAgICBBcml0aENvc3QgKz0gQ29uY3JldGVUVEktPmdldEFyaXRobWV0aWNJbnN0ckNvc3QoT3Bjb2RlLCBUeSk7CisgICAgICBUeSA9IFZlY3RvclR5cGU6OmdldChTY2FsYXJUeSwgTnVtVmVjRWx0cyk7CisgICAgICArK0xvbmdWZWN0b3JDb3VudDsKKyAgICB9CisgICAgLy8gVGhlIG1pbmltYWwgbGVuZ3RoIG9mIHRoZSB2ZWN0b3IgaXMgbGltaXRlZCBieSB0aGUgcmVhbCBsZW5ndGggb2YgdmVjdG9yCisgICAgLy8gb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlIGN1cnJlbnQgcGxhdGZvcm0uIFRoYXQncyB3aHkgc2V2ZXJhbCBmaW5hbAorICAgIC8vIHJlZHVjdGlvbiBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgb24gdGhlIHZlY3RvcnMgd2l0aCB0aGUgc2FtZQorICAgIC8vIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgbGVuZ3RoLgorICAgIFNodWZmbGVDb3N0ICs9IChOdW1SZWR1eExldmVscyAtIExvbmdWZWN0b3JDb3VudCkgKiAoSXNQYWlyd2lzZSArIDEpICoKKyAgICAgICAgICAgICAgICAgICBDb25jcmV0ZVRUSS0+Z2V0U2h1ZmZsZUNvc3QoVFRJOjpTS19FeHRyYWN0U3VidmVjdG9yLCBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtVmVjRWx0cywgVHkpOworICAgIEFyaXRoQ29zdCArPSAoTnVtUmVkdXhMZXZlbHMgLSBMb25nVmVjdG9yQ291bnQpICoKKyAgICAgICAgICAgICAgICAgQ29uY3JldGVUVEktPmdldEFyaXRobWV0aWNJbnN0ckNvc3QoT3Bjb2RlLCBUeSk7CisgICAgcmV0dXJuIFNodWZmbGVDb3N0ICsgQXJpdGhDb3N0ICsgZ2V0U2NhbGFyaXphdGlvbk92ZXJoZWFkKFR5LCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICAvLy8gVHJ5IHRvIGNhbGN1bGF0ZSBvcCBjb3N0cyBmb3IgbWluL21heCByZWR1Y3Rpb24gb3BlcmF0aW9ucy4KKyAgLy8vIFxwYXJhbSBDb25kVHkgQ29uZGl0aW9uYWwgdHlwZSBmb3IgdGhlIFNlbGVjdCBpbnN0cnVjdGlvbi4KKyAgdW5zaWduZWQgZ2V0TWluTWF4UmVkdWN0aW9uQ29zdChUeXBlICpUeSwgVHlwZSAqQ29uZFR5LCBib29sIElzUGFpcndpc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCkgeworICAgIGFzc2VydChUeS0+aXNWZWN0b3JUeSgpICYmICJFeHBlY3QgYSB2ZWN0b3IgdHlwZSIpOworICAgIFR5cGUgKlNjYWxhclR5ID0gVHktPmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgICAgVHlwZSAqU2NhbGFyQ29uZFR5ID0gQ29uZFR5LT5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICAgIHVuc2lnbmVkIE51bVZlY0VsdHMgPSBUeS0+Z2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICB1bnNpZ25lZCBOdW1SZWR1eExldmVscyA9IExvZzJfMzIoTnVtVmVjRWx0cyk7CisgICAgdW5zaWduZWQgQ21wT3Bjb2RlOworICAgIGlmIChUeS0+aXNGUE9yRlBWZWN0b3JUeSgpKSB7CisgICAgICBDbXBPcGNvZGUgPSBJbnN0cnVjdGlvbjo6RkNtcDsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KFR5LT5pc0ludE9ySW50VmVjdG9yVHkoKSAmJgorICAgICAgICAgICAgICJleHBlY3RpbmcgZmxvYXRpbmcgcG9pbnQgb3IgaW50ZWdlciB0eXBlIGZvciBtaW4vbWF4IHJlZHVjdGlvbiIpOworICAgICAgQ21wT3Bjb2RlID0gSW5zdHJ1Y3Rpb246OklDbXA7CisgICAgfQorICAgIHVuc2lnbmVkIE1pbk1heENvc3QgPSAwOworICAgIHVuc2lnbmVkIFNodWZmbGVDb3N0ID0gMDsKKyAgICBhdXRvICpDb25jcmV0ZVRUSSA9IHN0YXRpY19jYXN0PFQgKj4odGhpcyk7CisgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCBNVlQ+IExUID0KKyAgICAgICAgQ29uY3JldGVUVEktPmdldFRMSSgpLT5nZXRUeXBlTGVnYWxpemF0aW9uQ29zdChETCwgVHkpOworICAgIHVuc2lnbmVkIExvbmdWZWN0b3JDb3VudCA9IDA7CisgICAgdW5zaWduZWQgTVZUTGVuID0KKyAgICAgICAgTFQuc2Vjb25kLmlzVmVjdG9yKCkgPyBMVC5zZWNvbmQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSA6IDE7CisgICAgd2hpbGUgKE51bVZlY0VsdHMgPiBNVlRMZW4pIHsKKyAgICAgIE51bVZlY0VsdHMgLz0gMjsKKyAgICAgIC8vIEFzc3VtZSB0aGUgcGFpcndpc2Ugc2h1ZmZsZXMgYWRkIGEgY29zdC4KKyAgICAgIFNodWZmbGVDb3N0ICs9IChJc1BhaXJ3aXNlICsgMSkgKgorICAgICAgICAgICAgICAgICAgICAgQ29uY3JldGVUVEktPmdldFNodWZmbGVDb3N0KFRUSTo6U0tfRXh0cmFjdFN1YnZlY3RvciwgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtVmVjRWx0cywgVHkpOworICAgICAgTWluTWF4Q29zdCArPQorICAgICAgICAgIENvbmNyZXRlVFRJLT5nZXRDbXBTZWxJbnN0ckNvc3QoQ21wT3Bjb2RlLCBUeSwgQ29uZFR5LCBudWxscHRyKSArCisgICAgICAgICAgQ29uY3JldGVUVEktPmdldENtcFNlbEluc3RyQ29zdChJbnN0cnVjdGlvbjo6U2VsZWN0LCBUeSwgQ29uZFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICBUeSA9IFZlY3RvclR5cGU6OmdldChTY2FsYXJUeSwgTnVtVmVjRWx0cyk7CisgICAgICBDb25kVHkgPSBWZWN0b3JUeXBlOjpnZXQoU2NhbGFyQ29uZFR5LCBOdW1WZWNFbHRzKTsKKyAgICAgICsrTG9uZ1ZlY3RvckNvdW50OworICAgIH0KKyAgICAvLyBUaGUgbWluaW1hbCBsZW5ndGggb2YgdGhlIHZlY3RvciBpcyBsaW1pdGVkIGJ5IHRoZSByZWFsIGxlbmd0aCBvZiB2ZWN0b3IKKyAgICAvLyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiB0aGUgY3VycmVudCBwbGF0Zm9ybS4gVGhhdCdzIHdoeSBzZXZlcmFsIGZpbmFsCisgICAgLy8gcmVkdWN0aW9uIG9wZXJ0aW9ucyBhcmUgcGVyZm9tZWQgb24gdGhlIHZlY3RvcnMgd2l0aCB0aGUgc2FtZQorICAgIC8vIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgbGVuZ3RoLgorICAgIFNodWZmbGVDb3N0ICs9IChOdW1SZWR1eExldmVscyAtIExvbmdWZWN0b3JDb3VudCkgKiAoSXNQYWlyd2lzZSArIDEpICoKKyAgICAgICAgICAgICAgICAgICBDb25jcmV0ZVRUSS0+Z2V0U2h1ZmZsZUNvc3QoVFRJOjpTS19FeHRyYWN0U3VidmVjdG9yLCBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtVmVjRWx0cywgVHkpOworICAgIE1pbk1heENvc3QgKz0KKyAgICAgICAgKE51bVJlZHV4TGV2ZWxzIC0gTG9uZ1ZlY3RvckNvdW50KSAqCisgICAgICAgIChDb25jcmV0ZVRUSS0+Z2V0Q21wU2VsSW5zdHJDb3N0KENtcE9wY29kZSwgVHksIENvbmRUeSwgbnVsbHB0cikgKworICAgICAgICAgQ29uY3JldGVUVEktPmdldENtcFNlbEluc3RyQ29zdChJbnN0cnVjdGlvbjo6U2VsZWN0LCBUeSwgQ29uZFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSk7CisgICAgLy8gTmVlZCAzIGV4dHJhY3RlbGVtZW50IGluc3RydWN0aW9ucyBmb3Igc2NhbGFyaXphdGlvbiArIGFuIGFkZGl0aW9uYWwKKyAgICAvLyBzY2FsYXIgc2VsZWN0IGluc3RydWN0aW9uLgorICAgIHJldHVybiBTaHVmZmxlQ29zdCArIE1pbk1heENvc3QgKworICAgICAgICAgICAzICogZ2V0U2NhbGFyaXphdGlvbk92ZXJoZWFkKFR5LCAvKkluc2VydD0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRXh0cmFjdD0qL3RydWUpICsKKyAgICAgICAgICAgQ29uY3JldGVUVEktPmdldENtcFNlbEluc3RyQ29zdChJbnN0cnVjdGlvbjo6U2VsZWN0LCBTY2FsYXJUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJDb25kVHksIG51bGxwdHIpOworICB9CisKKyAgdW5zaWduZWQgZ2V0VmVjdG9yU3BsaXRDb3N0KCkgeyByZXR1cm4gMTsgfQorCisgIC8vLyBAfQorfTsKKworLy8vIFxicmllZiBDb25jcmV0ZSBCYXNpY1RUSUltcGwgdGhhdCBjYW4gYmUgdXNlZCBpZiBubyBmdXJ0aGVyIGN1c3RvbWl6YXRpb24KKy8vLyBpcyBuZWVkZWQuCitjbGFzcyBCYXNpY1RUSUltcGwgOiBwdWJsaWMgQmFzaWNUVElJbXBsQmFzZTxCYXNpY1RUSUltcGw+IHsKKyAgdXNpbmcgQmFzZVQgPSBCYXNpY1RUSUltcGxCYXNlPEJhc2ljVFRJSW1wbD47CisKKyAgZnJpZW5kIGNsYXNzIEJhc2ljVFRJSW1wbEJhc2U8QmFzaWNUVElJbXBsPjsKKworICBjb25zdCBUYXJnZXRTdWJ0YXJnZXRJbmZvICpTVDsKKyAgY29uc3QgVGFyZ2V0TG93ZXJpbmdCYXNlICpUTEk7CisKKyAgY29uc3QgVGFyZ2V0U3VidGFyZ2V0SW5mbyAqZ2V0U1QoKSBjb25zdCB7IHJldHVybiBTVDsgfQorICBjb25zdCBUYXJnZXRMb3dlcmluZ0Jhc2UgKmdldFRMSSgpIGNvbnN0IHsgcmV0dXJuIFRMSTsgfQorCitwdWJsaWM6CisgIGV4cGxpY2l0IEJhc2ljVFRJSW1wbChjb25zdCBUYXJnZXRNYWNoaW5lICpTVCwgY29uc3QgRnVuY3Rpb24gJkYpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9CQVNJQ1RUSUlNUExfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0NhbGNTcGlsbFdlaWdodHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9DYWxjU3BpbGxXZWlnaHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllODIwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9DYWxjU3BpbGxXZWlnaHRzLmgKQEAgLTAsMCArMSwxMDggQEAKKy8vPT09LSBsaWIvQ29kZUdlbi9DYWxjU3BpbGxXZWlnaHRzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0NBTENTUElMTFdFSUdIVFNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fQ0FMQ1NQSUxMV0VJR0hUU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TbG90SW5kZXhlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExpdmVJbnRlcnZhbDsKK2NsYXNzIExpdmVJbnRlcnZhbHM7CitjbGFzcyBNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZUxvb3BJbmZvOworY2xhc3MgVmlydFJlZ01hcDsKKworICAvLy8gXGJyaWVmIE5vcm1hbGl6ZSB0aGUgc3BpbGwgd2VpZ2h0IG9mIGEgbGl2ZSBpbnRlcnZhbAorICAvLy8KKyAgLy8vIFRoZSBzcGlsbCB3ZWlnaHQgb2YgYSBsaXZlIGludGVydmFsIGlzIGNvbXB1dGVkIGFzOgorICAvLy8KKyAgLy8vICAgKHN1bSh1c2UgZnJlcSkgKyBzdW0oZGVmIGZyZXEpKSAvIChLICsgc2l6ZSkKKyAgLy8vCisgIC8vLyBAcGFyYW0gVXNlRGVmRnJlcSBFeHBlY3RlZCBudW1iZXIgb2YgZXhlY3V0ZWQgdXNlIGFuZCBkZWYgaW5zdHJ1Y3Rpb25zCisgIC8vLyAgICAgICAgICAgICAgICAgICBwZXIgZnVuY3Rpb24gY2FsbC4gRGVyaXZlZCBmcm9tIGJsb2NrIGZyZXF1ZW5jaWVzLgorICAvLy8gQHBhcmFtIFNpemUgICAgICAgU2l6ZSBvZiBsaXZlIGludGVydmFsIGFzIHJldHVybmV4ZCBieSBnZXRTaXplKCkKKyAgLy8vIEBwYXJhbSBOdW1JbnN0ciAgIE51bWJlciBvZiBpbnN0cnVjdGlvbnMgdXNpbmcgdGhpcyBsaXZlIGludGVydmFsCisgIHN0YXRpYyBpbmxpbmUgZmxvYXQgbm9ybWFsaXplU3BpbGxXZWlnaHQoZmxvYXQgVXNlRGVmRnJlcSwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JbnN0cikgeworICAgIC8vIFRoZSBjb25zdGFudCAyNSBpbnN0cnVjdGlvbnMgaXMgYWRkZWQgdG8gYXZvaWQgZGVwZW5kaW5nIHRvbyBtdWNoIG9uCisgICAgLy8gYWNjaWRlbnRhbCBTbG90SW5kZXggZ2FwcyBmb3Igc21hbGwgaW50ZXJ2YWxzLiBUaGUgZWZmZWN0IGlzIHRoYXQgc21hbGwKKyAgICAvLyBpbnRlcnZhbHMgaGF2ZSBhIHNwaWxsIHdlaWdodCB0aGF0IGlzIG1vc3RseSBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlcgorICAgIC8vIG9mIHVzZXMsIHdoaWxlIGxhcmdlIGludGVydmFscyBnZXQgYSBzcGlsbCB3ZWlnaHQgdGhhdCBpcyBjbG9zZXIgdG8gYSB1c2UKKyAgICAvLyBkZW5zaXR5LgorICAgIHJldHVybiBVc2VEZWZGcmVxIC8gKFNpemUgKyAyNSpTbG90SW5kZXg6Okluc3RyRGlzdCk7CisgIH0KKworICAvLy8gXGJyaWVmIENhbGN1bGF0ZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24gZm9yIGEgdmlydHVhbCByZWdpc3RlciBzdWNoIGFzIGl0cworICAvLy8gc3BpbGwgd2VpZ2h0IGFuZCBhbGxvY2F0aW9uIGhpbnQuCisgIGNsYXNzIFZpcnRSZWdBdXhJbmZvIHsKKyAgcHVibGljOgorICAgIHVzaW5nIE5vcm1hbGl6aW5nRm4gPSBmbG9hdCAoKikoZmxvYXQsIHVuc2lnbmVkLCB1bnNpZ25lZCk7CisKKyAgcHJpdmF0ZToKKyAgICBNYWNoaW5lRnVuY3Rpb24gJk1GOworICAgIExpdmVJbnRlcnZhbHMgJkxJUzsKKyAgICBWaXJ0UmVnTWFwICpWUk07CisgICAgY29uc3QgTWFjaGluZUxvb3BJbmZvICZMb29wczsKKyAgICBjb25zdCBNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvICZNQkZJOworICAgIERlbnNlTWFwPHVuc2lnbmVkLCBmbG9hdD4gSGludDsKKyAgICBOb3JtYWxpemluZ0ZuIG5vcm1hbGl6ZTsKKworICBwdWJsaWM6CisgICAgVmlydFJlZ0F1eEluZm8oTWFjaGluZUZ1bmN0aW9uICZtZiwgTGl2ZUludGVydmFscyAmbGlzLAorICAgICAgICAgICAgICAgICAgIFZpcnRSZWdNYXAgKnZybSwgY29uc3QgTWFjaGluZUxvb3BJbmZvICZsb29wcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvICZtYmZpLAorICAgICAgICAgICAgICAgICAgIE5vcm1hbGl6aW5nRm4gbm9ybSA9IG5vcm1hbGl6ZVNwaWxsV2VpZ2h0KQorICAgICAgICA6IE1GKG1mKSwgTElTKGxpcyksIFZSTSh2cm0pLCBMb29wcyhsb29wcyksIE1CRkkobWJmaSksIG5vcm1hbGl6ZShub3JtKSB7fQorCisgICAgLy8vIFxicmllZiAocmUpY29tcHV0ZSBsaSdzIHNwaWxsIHdlaWdodCBhbmQgYWxsb2NhdGlvbiBoaW50LgorICAgIHZvaWQgY2FsY3VsYXRlU3BpbGxXZWlnaHRBbmRIaW50KExpdmVJbnRlcnZhbCAmbGkpOworCisgICAgLy8vIFxicmllZiBDb21wdXRlIGZ1dHVyZSBleHBlY3RlZCBzcGlsbCB3ZWlnaHQgb2YgYSBzcGxpdCBhcnRpZmFjdCBvZiBsaQorICAgIC8vLyB0aGF0IHdpbGwgc3BhbiBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgc2xvdCBpbmRleGVzLgorICAgIC8vLyBccGFyYW0gbGkgICAgIFRoZSBsaXZlIGludGVydmFsIHRvIGJlIHNwbGl0LgorICAgIC8vLyBccGFyYW0gc3RhcnQgIFRoZSBleHBlY3RlZCBiZWdpbmluZyBvZiB0aGUgc3BsaXQgYXJ0aWZhY3QuIEluc3RydWN0aW9ucworICAgIC8vLyAgICAgICAgICAgICAgIGJlZm9yZSBzdGFydCB3aWxsIG5vdCBhZmZlY3QgdGhlIHdlaWdodC4KKyAgICAvLy8gXHBhcmFtIGVuZCAgICBUaGUgZXhwZWN0ZWQgZW5kIG9mIHRoZSBzcGxpdCBhcnRpZmFjdC4gSW5zdHJ1Y3Rpb25zCisgICAgLy8vICAgICAgICAgICAgICAgYWZ0ZXIgZW5kIHdpbGwgbm90IGFmZmVjdCB0aGUgd2VpZ2h0LgorICAgIC8vLyBccmV0dXJuIFRoZSBleHBlY3RlZCBzcGlsbCB3ZWlnaHQgb2YgdGhlIHNwbGl0IGFydGlmYWN0LiBSZXR1cm5zCisgICAgLy8vIG5lZ2F0aXZlIHdlaWdodCBmb3IgdW5zcGlsbGFibGUgbGkuCisgICAgZmxvYXQgZnV0dXJlV2VpZ2h0KExpdmVJbnRlcnZhbCAmbGksIFNsb3RJbmRleCBzdGFydCwgU2xvdEluZGV4IGVuZCk7CisKKyAgICAvLy8gXGJyaWVmIEhlbHBlciBmdW5jdGlvbiBmb3Igd2VpZ2h0IGNhbGN1bGF0aW9ucy4KKyAgICAvLy8gKFJlKWNvbXB1dGUgbGkncyBzcGlsbCB3ZWlnaHQgYW5kIGFsbG9jYXRpb24gaGludCwgb3IsIGZvciBub24gbnVsbAorICAgIC8vLyBzdGFydCBhbmQgZW5kIC0gY29tcHV0ZSBmdXR1cmUgZXhwZWN0ZWQgc3BpbGwgd2VpZ2h0IG9mIGEgc3BsaXQKKyAgICAvLy8gYXJ0aWZhY3Qgb2YgbGkgdGhhdCB3aWxsIHNwYW4gYmV0d2VlbiBzdGFydCBhbmQgZW5kIHNsb3QgaW5kZXhlcy4KKyAgICAvLy8gXHBhcmFtIGxpICAgICBUaGUgbGl2ZSBpbnRlcnZhbCBmb3Igd2hpY2ggdG8gY29tcHV0ZSB0aGUgd2VpZ2h0LgorICAgIC8vLyBccGFyYW0gc3RhcnQgIFRoZSBleHBlY3RlZCBiZWdpbmluZyBvZiB0aGUgc3BsaXQgYXJ0aWZhY3QuIEluc3RydWN0aW9ucworICAgIC8vLyAgICAgICAgICAgICAgIGJlZm9yZSBzdGFydCB3aWxsIG5vdCBhZmZlY3QgdGhlIHdlaWdodC4gUmVsZXZhbnQgZm9yCisgICAgLy8vICAgICAgICAgICAgICAgd2VpZ2h0IGNhbGN1bGF0aW9uIG9mIGZ1dHVyZSBzcGxpdCBhcnRpZmFjdC4KKyAgICAvLy8gXHBhcmFtIGVuZCAgICBUaGUgZXhwZWN0ZWQgZW5kIG9mIHRoZSBzcGxpdCBhcnRpZmFjdC4gSW5zdHJ1Y3Rpb25zCisgICAgLy8vICAgICAgICAgICAgICAgYWZ0ZXIgZW5kIHdpbGwgbm90IGFmZmVjdCB0aGUgd2VpZ2h0LiBSZWxldmFudCBmb3IKKyAgICAvLy8gICAgICAgICAgICAgICB3ZWlnaHQgY2FsY3VsYXRpb24gb2YgZnV0dXJlIHNwbGl0IGFydGlmYWN0LgorICAgIC8vLyBccmV0dXJuIFRoZSBzcGlsbCB3ZWlnaHQuIFJldHVybnMgbmVnYXRpdmUgd2VpZ2h0IGZvciB1bnNwaWxsYWJsZSBsaS4KKyAgICBmbG9hdCB3ZWlnaHRDYWxjSGVscGVyKExpdmVJbnRlcnZhbCAmbGksIFNsb3RJbmRleCAqc3RhcnQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdEluZGV4ICplbmQgPSBudWxscHRyKTsKKyAgfTsKKworICAvLy8gXGJyaWVmIENvbXB1dGUgc3BpbGwgd2VpZ2h0cyBhbmQgYWxsb2NhdGlvbiBoaW50cyBmb3IgYWxsIHZpcnR1YWwgcmVnaXN0ZXIKKyAgLy8vIGxpdmUgaW50ZXJ2YWxzLgorICB2b2lkIGNhbGN1bGF0ZVNwaWxsV2VpZ2h0c0FuZEhpbnRzKExpdmVJbnRlcnZhbHMgJkxJUywgTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXJ0UmVnTWFwICpWUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUxvb3BJbmZvICZNTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mbyAmTUJGSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXJ0UmVnQXV4SW5mbzo6Tm9ybWFsaXppbmdGbiBub3JtID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplU3BpbGxXZWlnaHQpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0NBTENTUElMTFdFSUdIVFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0NhbGxpbmdDb252TG93ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9DYWxsaW5nQ29udkxvd2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwYTI3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9DYWxsaW5nQ29udkxvd2VyLmgKQEAgLTAsMCArMSw1NzYgQEAKKy8vPT09LSBsbHZtL0NhbGxpbmdDb252TG93ZXIuaCAtIENhbGxpbmcgQ29udmVudGlvbnMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBDQ1N0YXRlIGFuZCBDQ1ZhbEFzc2lnbiBjbGFzc2VzLCB1c2VkIGZvciBsb3dlcmluZworLy8gYW5kIGltcGxlbWVudGluZyBjYWxsaW5nIGNvbnZlbnRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0NBTExJTkdDT05WTE9XRVJfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fQ0FMTElOR0NPTlZMT1dFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRDYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUmVnaXN0ZXJJbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ0NTdGF0ZTsKK2NsYXNzIE1WVDsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CisKKy8vLyBDQ1ZhbEFzc2lnbiAtIFJlcHJlc2VudCBhc3NpZ25tZW50IG9mIG9uZSBhcmcvcmV0dmFsIHRvIGEgbG9jYXRpb24uCitjbGFzcyBDQ1ZhbEFzc2lnbiB7CitwdWJsaWM6CisgIGVudW0gTG9jSW5mbyB7CisgICAgRnVsbCwgICAgICAvLyBUaGUgdmFsdWUgZmlsbHMgdGhlIGZ1bGwgbG9jYXRpb24uCisgICAgU0V4dCwgICAgICAvLyBUaGUgdmFsdWUgaXMgc2lnbiBleHRlbmRlZCBpbiB0aGUgbG9jYXRpb24uCisgICAgWkV4dCwgICAgICAvLyBUaGUgdmFsdWUgaXMgemVybyBleHRlbmRlZCBpbiB0aGUgbG9jYXRpb24uCisgICAgQUV4dCwgICAgICAvLyBUaGUgdmFsdWUgaXMgZXh0ZW5kZWQgd2l0aCB1bmRlZmluZWQgdXBwZXIgYml0cy4KKyAgICBTRXh0VXBwZXIsIC8vIFRoZSB2YWx1ZSBpcyBpbiB0aGUgdXBwZXIgYml0cyBvZiB0aGUgbG9jYXRpb24gYW5kIHNob3VsZCBiZQorICAgICAgICAgICAgICAgLy8gc2lnbiBleHRlbmRlZCB3aGVuIHJldHJpZXZlZC4KKyAgICBaRXh0VXBwZXIsIC8vIFRoZSB2YWx1ZSBpcyBpbiB0aGUgdXBwZXIgYml0cyBvZiB0aGUgbG9jYXRpb24gYW5kIHNob3VsZCBiZQorICAgICAgICAgICAgICAgLy8gemVybyBleHRlbmRlZCB3aGVuIHJldHJpZXZlZC4KKyAgICBBRXh0VXBwZXIsIC8vIFRoZSB2YWx1ZSBpcyBpbiB0aGUgdXBwZXIgYml0cyBvZiB0aGUgbG9jYXRpb24gYW5kIHNob3VsZCBiZQorICAgICAgICAgICAgICAgLy8gZXh0ZW5kZWQgd2l0aCB1bmRlZmluZWQgdXBwZXIgYml0cyB3aGVuIHJldHJpZXZlZC4KKyAgICBCQ3Z0LCAgICAgIC8vIFRoZSB2YWx1ZSBpcyBiaXQtY29udmVydGVkIGluIHRoZSBsb2NhdGlvbi4KKyAgICBWRXh0LCAgICAgIC8vIFRoZSB2YWx1ZSBpcyB2ZWN0b3Itd2lkZW5lZCBpbiB0aGUgbG9jYXRpb24uCisgICAgICAgICAgICAgICAvLyBGSVhNRTogTm90IGltcGxlbWVudGVkIHlldC4gQ29kZSB0aGF0IHVzZXMgQUV4dCB0byBtZWFuCisgICAgICAgICAgICAgICAvLyB2ZWN0b3Itd2lkZW4gc2hvdWxkIGJlIGZpeGVkIHRvIHVzZSBWRXh0IGluc3RlYWQuCisgICAgRlBFeHQsICAgICAvLyBUaGUgZmxvYXRpbmctcG9pbnQgdmFsdWUgaXMgZnAtZXh0ZW5kZWQgaW4gdGhlIGxvY2F0aW9uLgorICAgIEluZGlyZWN0ICAgLy8gVGhlIGxvY2F0aW9uIGNvbnRhaW5zIHBvaW50ZXIgdG8gdGhlIHZhbHVlLgorICAgIC8vIFRPRE86IGEgc3Vic2V0IG9mIHRoZSB2YWx1ZSBpcyBpbiB0aGUgbG9jYXRpb24uCisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBWYWxObyAtIFRoaXMgaXMgdGhlIHZhbHVlIG51bWJlciBiZWdpbiBhc3NpZ25lZCAoZS5nLiBhbiBhcmd1bWVudCBudW1iZXIpLgorICB1bnNpZ25lZCBWYWxObzsKKworICAvLy8gTG9jIGlzIGVpdGhlciBhIHN0YWNrIG9mZnNldCBvciBhIHJlZ2lzdGVyIG51bWJlci4KKyAgdW5zaWduZWQgTG9jOworCisgIC8vLyBpc01lbSAtIFRydWUgaWYgdGhpcyBpcyBhIG1lbW9yeSBsb2MsIGZhbHNlIGlmIGl0IGlzIGEgcmVnaXN0ZXIgbG9jLgorICB1bnNpZ25lZCBpc01lbSA6IDE7CisKKyAgLy8vIGlzQ3VzdG9tIC0gVHJ1ZSBpZiB0aGlzIGFyZy9yZXR2YWwgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZy4KKyAgdW5zaWduZWQgaXNDdXN0b20gOiAxOworCisgIC8vLyBJbmZvcm1hdGlvbiBhYm91dCBob3cgdGhlIHZhbHVlIGlzIGFzc2lnbmVkLgorICBMb2NJbmZvIEhUUCA6IDY7CisKKyAgLy8vIFZhbFZUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGJlaW5nIGFzc2lnbmVkLgorICBNVlQgVmFsVlQ7CisKKyAgLy8vIExvY1ZUIC0gVGhlIHR5cGUgb2YgdGhlIGxvY2F0aW9uIGJlaW5nIGFzc2lnbmVkIHRvLgorICBNVlQgTG9jVlQ7CitwdWJsaWM6CisKKyAgc3RhdGljIENDVmFsQXNzaWduIGdldFJlZyh1bnNpZ25lZCBWYWxObywgTVZUIFZhbFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZ05vLCBNVlQgTG9jVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jSW5mbyBIVFApIHsKKyAgICBDQ1ZhbEFzc2lnbiBSZXQ7CisgICAgUmV0LlZhbE5vID0gVmFsTm87CisgICAgUmV0LkxvYyA9IFJlZ05vOworICAgIFJldC5pc01lbSA9IGZhbHNlOworICAgIFJldC5pc0N1c3RvbSA9IGZhbHNlOworICAgIFJldC5IVFAgPSBIVFA7CisgICAgUmV0LlZhbFZUID0gVmFsVlQ7CisgICAgUmV0LkxvY1ZUID0gTG9jVlQ7CisgICAgcmV0dXJuIFJldDsKKyAgfQorCisgIHN0YXRpYyBDQ1ZhbEFzc2lnbiBnZXRDdXN0b21SZWcodW5zaWduZWQgVmFsTm8sIE1WVCBWYWxWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWdObywgTVZUIExvY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY0luZm8gSFRQKSB7CisgICAgQ0NWYWxBc3NpZ24gUmV0OworICAgIFJldCA9IGdldFJlZyhWYWxObywgVmFsVlQsIFJlZ05vLCBMb2NWVCwgSFRQKTsKKyAgICBSZXQuaXNDdXN0b20gPSB0cnVlOworICAgIHJldHVybiBSZXQ7CisgIH0KKworICBzdGF0aWMgQ0NWYWxBc3NpZ24gZ2V0TWVtKHVuc2lnbmVkIFZhbE5vLCBNVlQgVmFsVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT2Zmc2V0LCBNVlQgTG9jVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jSW5mbyBIVFApIHsKKyAgICBDQ1ZhbEFzc2lnbiBSZXQ7CisgICAgUmV0LlZhbE5vID0gVmFsTm87CisgICAgUmV0LkxvYyA9IE9mZnNldDsKKyAgICBSZXQuaXNNZW0gPSB0cnVlOworICAgIFJldC5pc0N1c3RvbSA9IGZhbHNlOworICAgIFJldC5IVFAgPSBIVFA7CisgICAgUmV0LlZhbFZUID0gVmFsVlQ7CisgICAgUmV0LkxvY1ZUID0gTG9jVlQ7CisgICAgcmV0dXJuIFJldDsKKyAgfQorCisgIHN0YXRpYyBDQ1ZhbEFzc2lnbiBnZXRDdXN0b21NZW0odW5zaWduZWQgVmFsTm8sIE1WVCBWYWxWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPZmZzZXQsIE1WVCBMb2NWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NJbmZvIEhUUCkgeworICAgIENDVmFsQXNzaWduIFJldDsKKyAgICBSZXQgPSBnZXRNZW0oVmFsTm8sIFZhbFZULCBPZmZzZXQsIExvY1ZULCBIVFApOworICAgIFJldC5pc0N1c3RvbSA9IHRydWU7CisgICAgcmV0dXJuIFJldDsKKyAgfQorCisgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgcGVuZGluZyBDQ1ZhbEFzc2lnbiBhbmQgb3RoZXIKKyAgLy8ga2luZHMsIGFzIHRoZXkgYXJlIHN0b3JlZCBpbiBhIGRpZmZlcmVudCBsaXN0LgorICBzdGF0aWMgQ0NWYWxBc3NpZ24gZ2V0UGVuZGluZyh1bnNpZ25lZCBWYWxObywgTVZUIFZhbFZULCBNVlQgTG9jVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY0luZm8gSFRQLCB1bnNpZ25lZCBFeHRyYUluZm8gPSAwKSB7CisgICAgcmV0dXJuIGdldFJlZyhWYWxObywgVmFsVlQsIEV4dHJhSW5mbywgTG9jVlQsIEhUUCk7CisgIH0KKworICB2b2lkIGNvbnZlcnRUb1JlZyh1bnNpZ25lZCBSZWdObykgeworICAgIExvYyA9IFJlZ05vOworICAgIGlzTWVtID0gZmFsc2U7CisgIH0KKworICB2b2lkIGNvbnZlcnRUb01lbSh1bnNpZ25lZCBPZmZzZXQpIHsKKyAgICBMb2MgPSBPZmZzZXQ7CisgICAgaXNNZW0gPSB0cnVlOworICB9CisKKyAgdW5zaWduZWQgZ2V0VmFsTm8oKSBjb25zdCB7IHJldHVybiBWYWxObzsgfQorICBNVlQgZ2V0VmFsVlQoKSBjb25zdCB7IHJldHVybiBWYWxWVDsgfQorCisgIGJvb2wgaXNSZWdMb2MoKSBjb25zdCB7IHJldHVybiAhaXNNZW07IH0KKyAgYm9vbCBpc01lbUxvYygpIGNvbnN0IHsgcmV0dXJuIGlzTWVtOyB9CisKKyAgYm9vbCBuZWVkc0N1c3RvbSgpIGNvbnN0IHsgcmV0dXJuIGlzQ3VzdG9tOyB9CisKKyAgdW5zaWduZWQgZ2V0TG9jUmVnKCkgY29uc3QgeyBhc3NlcnQoaXNSZWdMb2MoKSk7IHJldHVybiBMb2M7IH0KKyAgdW5zaWduZWQgZ2V0TG9jTWVtT2Zmc2V0KCkgY29uc3QgeyBhc3NlcnQoaXNNZW1Mb2MoKSk7IHJldHVybiBMb2M7IH0KKyAgdW5zaWduZWQgZ2V0RXh0cmFJbmZvKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9CisgIE1WVCBnZXRMb2NWVCgpIGNvbnN0IHsgcmV0dXJuIExvY1ZUOyB9CisKKyAgTG9jSW5mbyBnZXRMb2NJbmZvKCkgY29uc3QgeyByZXR1cm4gSFRQOyB9CisgIGJvb2wgaXNFeHRJbkxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gKEhUUCA9PSBBRXh0IHx8IEhUUCA9PSBTRXh0IHx8IEhUUCA9PSBaRXh0KTsKKyAgfQorCisgIGJvb2wgaXNVcHBlckJpdHNJbkxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gSFRQID09IEFFeHRVcHBlciB8fCBIVFAgPT0gU0V4dFVwcGVyIHx8IEhUUCA9PSBaRXh0VXBwZXI7CisgIH0KK307CisKKy8vLyBEZXNjcmliZXMgYSByZWdpc3RlciB0aGF0IG5lZWRzIHRvIGJlIGZvcndhcmRlZCBmcm9tIHRoZSBwcm9sb2d1ZSB0byBhCisvLy8gbXVzdHRhaWwgY2FsbC4KK3N0cnVjdCBGb3J3YXJkZWRSZWdpc3RlciB7CisgIEZvcndhcmRlZFJlZ2lzdGVyKHVuc2lnbmVkIFZSZWcsIE1DUGh5c1JlZyBQUmVnLCBNVlQgVlQpCisgICAgICA6IFZSZWcoVlJlZyksIFBSZWcoUFJlZyksIFZUKFZUKSB7fQorICB1bnNpZ25lZCBWUmVnOworICBNQ1BoeXNSZWcgUFJlZzsKKyAgTVZUIFZUOworfTsKKworLy8vIENDQXNzaWduRm4gLSBUaGlzIGZ1bmN0aW9uIGFzc2lnbnMgYSBsb2NhdGlvbiBmb3IgVmFsLCB1cGRhdGluZyBTdGF0ZSB0bworLy8vIHJlZmxlY3QgdGhlIGNoYW5nZS4gIEl0IHJldHVybnMgJ3RydWUnIGlmIGl0IGZhaWxlZCB0byBoYW5kbGUgVmFsLgordHlwZWRlZiBib29sIENDQXNzaWduRm4odW5zaWduZWQgVmFsTm8sIE1WVCBWYWxWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1WVCBMb2NWVCwgQ0NWYWxBc3NpZ246OkxvY0luZm8gTG9jSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOworCisvLy8gQ0NDdXN0b21GbiAtIFRoaXMgZnVuY3Rpb24gYXNzaWducyBhIGxvY2F0aW9uIGZvciBWYWwsIHBvc3NpYmx5IHVwZGF0aW5nCisvLy8gYWxsIGFyZ3MgdG8gcmVmbGVjdCBjaGFuZ2VzIGFuZCBpbmRpY2F0ZXMgaWYgaXQgaGFuZGxlZCBpdC4gSXQgbXVzdCBzZXQKKy8vLyBpc0N1c3RvbSBpZiBpdCBoYW5kbGVzIHRoZSBhcmcgYW5kIHJldHVybnMgdHJ1ZS4KK3R5cGVkZWYgYm9vbCBDQ0N1c3RvbUZuKHVuc2lnbmVkICZWYWxObywgTVZUICZWYWxWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1WVCAmTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvICZMb2NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpBcmdGbGFnc1R5ICZBcmdGbGFncywgQ0NTdGF0ZSAmU3RhdGUpOworCisvLy8gQ0NTdGF0ZSAtIFRoaXMgY2xhc3MgaG9sZHMgaW5mb3JtYXRpb24gbmVlZGVkIHdoaWxlIGxvd2VyaW5nIGFyZ3VtZW50cyBhbmQKKy8vLyByZXR1cm4gdmFsdWVzLiAgSXQgY2FwdHVyZXMgd2hpY2ggcmVnaXN0ZXJzIGFyZSBhbHJlYWR5IGFzc2lnbmVkIGFuZCB3aGljaAorLy8vIHN0YWNrIHNsb3RzIGFyZSB1c2VkLiAgSXQgcHJvdmlkZXMgYWNjZXNzb3JzIHRvIGFsbG9jYXRlIHRoZXNlIHZhbHVlcy4KK2NsYXNzIENDU3RhdGUgeworcHJpdmF0ZToKKyAgQ2FsbGluZ0NvbnY6OklEIENhbGxpbmdDb252OworICBib29sIElzVmFyQXJnOworICBib29sIEFuYWx5emluZ011c3RUYWlsRm9yd2FyZGVkUmVncyA9IGZhbHNlOworICBNYWNoaW5lRnVuY3Rpb24gJk1GOworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSTsKKyAgU21hbGxWZWN0b3JJbXBsPENDVmFsQXNzaWduPiAmTG9jczsKKyAgTExWTUNvbnRleHQgJkNvbnRleHQ7CisKKyAgdW5zaWduZWQgU3RhY2tPZmZzZXQ7CisgIHVuc2lnbmVkIE1heFN0YWNrQXJnQWxpZ247CisgIFNtYWxsVmVjdG9yPHVpbnQzMl90LCAxNj4gVXNlZFJlZ3M7CisgIFNtYWxsVmVjdG9yPENDVmFsQXNzaWduLCA0PiBQZW5kaW5nTG9jczsKKyAgU21hbGxWZWN0b3I8SVNEOjpBcmdGbGFnc1R5LCA0PiBQZW5kaW5nQXJnRmxhZ3M7CisKKyAgLy8gQnlWYWxJbmZvIGFuZCBTbWFsbFZlY3RvcjxCeVZhbEluZm8sIDQ+IEJ5VmFsUmVnczoKKyAgLy8KKyAgLy8gVmVjdG9yIG9mIEJ5VmFsSW5mbyBpbnN0YW5jZXMgKEJ5VmFsUmVncykgaXMgaW50cm9kdWNlZCBmb3IgYnl2YWwgcmVnaXN0ZXJzCisgIC8vIHRyYWNraW5nLgorICAvLyBPciwgaW4gYW5vdGhlciB3b3JkcyBpdCB0cmFja3MgYnl2YWwgcGFyYW1ldGVycyB0aGF0IGFyZSBzdG9yZWQgaW4KKyAgLy8gZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycy4KKyAgLy8KKyAgLy8gRm9yIDQgYnl0ZSBzdGFjayBhbGlnbm1lbnQsCisgIC8vIGluc3RhbmNlIGluZGV4IG1lYW5zIGJ5dmFsIHBhcmFtZXRlciBudW1iZXIgaW4gZm9ybWFsCisgIC8vIGFyZ3VtZW50cyBzZXQuIEFzc3VtZSwgd2UgaGF2ZSBzb21lICJzdHJ1Y3RfdHlwZSIgd2l0aCBzaXplID0gNCBieXRlcywKKyAgLy8gdGhlbiwgZm9yIGZ1bmN0aW9uICJmb28iOgorICAvLworICAvLyBpMzIgZm9vKGkzMiAlcCwgJXN0cnVjdF90eXBlKiAlciwgaTMyICVzLCAlc3RydWN0X3R5cGUqICV0KQorICAvLworICAvLyBCeVZhbFJlZ3NbMF0gZGVzY3JpYmVzIGhvdyAiJXIiIGlzIHN0b3JlZCAoQmVnaW4gPT0gcjEsIEVuZCA9PSByMikKKyAgLy8gQnlWYWxSZWdzWzFdIGRlc2NyaWJlcyBob3cgIiV0IiBpcyBzdG9yZWQgKEJlZ2luID09IHIzLCBFbmQgPT0gcjQpLgorICAvLworICAvLyBJbiBjYXNlIG9mIDggYnl0ZXMgc3RhY2sgYWxpZ25tZW50LAorICAvLyBCeVZhbFJlZ3MgbWF5IGFsc28gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB3YXN0ZWQgcmVnaXN0ZXJzLgorICAvLyBJbiBmdW5jdGlvbiBzaG93biBhYm92ZSwgcjMgd291bGQgYmUgd2FzdGVkIGFjY29yZGluZyB0byBBQVBDUyBydWxlcy4KKyAgLy8gQW5kIGluIHRoYXQgY2FzZSBCeVZhbFJlZ3NbMV0uV2FzdGUgd291bGQgYmUgInRydWUiLgorICAvLyBCeVZhbFJlZ3MgdmVjdG9yIHNpemUgc3RpbGwgd291bGQgYmUgMiwKKyAgLy8gd2hpbGUgIiV0IiBnb2VzIHRvIHRoZSBzdGFjazogaXQgd291bGRuJ3QgYmUgZGVzY3JpYmVkIGluIEJ5VmFsUmVncy4KKyAgLy8KKyAgLy8gU3VwcG9zZWQgdXNlLWNhc2UgZm9yIHRoaXMgY29sbGVjdGlvbjoKKyAgLy8gMS4gSW5pdGlhbGx5IEJ5VmFsUmVncyBpcyBlbXB0eSwgSW5SZWdzUGFyYW1zUHJvY2Vzc2VkIGlzIDAuCisgIC8vIDIuIEhhbmRsZUJ5VmFsIGZpbGx1cHMgQnlWYWxSZWdzLgorICAvLyAzLiBBcmd1bWVudCBhbmFseXNpcyAoTG93ZXJGb3JtYXRBcmd1bWVudHMsIGZvciBleGFtcGxlKS4gQWZ0ZXIKKyAgLy8gc29tZSBieXZhbCBhcmd1bWVudCB3YXMgYW5hbHl6ZWQsIEluUmVnc1BhcmFtc1Byb2Nlc3NlZCBpcyBpbmNyZWFzZWQuCisgIHN0cnVjdCBCeVZhbEluZm8geworICAgIEJ5VmFsSW5mbyh1bnNpZ25lZCBCLCB1bnNpZ25lZCBFLCBib29sIElzV2FzdGUgPSBmYWxzZSkgOgorICAgICAgQmVnaW4oQiksIEVuZChFKSwgV2FzdGUoSXNXYXN0ZSkge30KKyAgICAvLyBGaXJzdCByZWdpc3RlciBhbGxvY2F0ZWQgZm9yIGN1cnJlbnQgcGFyYW1ldGVyLgorICAgIHVuc2lnbmVkIEJlZ2luOworCisgICAgLy8gRmlyc3QgYWZ0ZXIgbGFzdCByZWdpc3RlciBhbGxvY2F0ZWQgZm9yIGN1cnJlbnQgcGFyYW1ldGVyLgorICAgIHVuc2lnbmVkIEVuZDsKKworICAgIC8vIE1lYW5zIHRoYXQgY3VycmVudCByYW5nZSBvZiByZWdpc3RlcnMgZG9lc24ndCBiZWxvbmcgdG8gYW55CisgICAgLy8gcGFyYW1ldGVycy4gSXQgd2FzIHdhc3RlZCBkdWUgdG8gc3RhY2sgYWxpZ25tZW50IHJ1bGVzLgorICAgIC8vIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZToKKyAgICAvLyBBQVBDUywgNS41IFBhcmFtZXRlciBQYXNzaW5nLCBTdGFnZSBDLCBDLjMuCisgICAgYm9vbCBXYXN0ZTsKKyAgfTsKKyAgU21hbGxWZWN0b3I8QnlWYWxJbmZvLCA0ID4gQnlWYWxSZWdzOworCisgIC8vIEluUmVnc1BhcmFtc1Byb2Nlc3NlZCAtIHNob3dzIGhvdyBtYW55IGluc3RhbmNlcyBvZiBCeVZhbFJlZ3Mgd2FzIHByb2NlZWQKKyAgLy8gZHVyaW5nIGFyZ3VtZW50IGFuYWx5c2lzLgorICB1bnNpZ25lZCBJblJlZ3NQYXJhbXNQcm9jZXNzZWQ7CisKK3B1YmxpYzoKKyAgQ0NTdGF0ZShDYWxsaW5nQ29udjo6SUQgQ0MsIGJvb2wgaXNWYXJBcmcsIE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPENDVmFsQXNzaWduPiAmbG9jcywgTExWTUNvbnRleHQgJkMpOworCisgIHZvaWQgYWRkTG9jKGNvbnN0IENDVmFsQXNzaWduICZWKSB7CisgICAgTG9jcy5wdXNoX2JhY2soVik7CisgIH0KKworICBMTFZNQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIENvbnRleHQ7IH0KKyAgTWFjaGluZUZ1bmN0aW9uICZnZXRNYWNoaW5lRnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBNRjsgfQorICBDYWxsaW5nQ29udjo6SUQgZ2V0Q2FsbGluZ0NvbnYoKSBjb25zdCB7IHJldHVybiBDYWxsaW5nQ29udjsgfQorICBib29sIGlzVmFyQXJnKCkgY29uc3QgeyByZXR1cm4gSXNWYXJBcmc7IH0KKworICAvLy8gZ2V0TmV4dFN0YWNrT2Zmc2V0IC0gUmV0dXJuIHRoZSBuZXh0IHN0YWNrIG9mZnNldCBzdWNoIHRoYXQgYWxsIHN0YWNrCisgIC8vLyBzbG90cyBzYXRpc2Z5IHRoZWlyIGFsaWdubWVudCByZXF1aXJlbWVudHMuCisgIHVuc2lnbmVkIGdldE5leHRTdGFja09mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RhY2tPZmZzZXQ7CisgIH0KKworICAvLy8gZ2V0QWxpZ25lZENhbGxGcmFtZVNpemUgLSBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGNhbGwgZnJhbWUgbmVlZGVkIHRvCisgIC8vLyBiZSBhYmxlIHRvIHN0b3JlIGFsbCBhcmd1bWVudHMgYW5kIHN1Y2ggdGhhdCB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50CisgIC8vLyBvZiBlYWNoIG9mIHRoZSBhcmd1bWVudHMgaXMgc2F0aXNmaWVkLgorICB1bnNpZ25lZCBnZXRBbGlnbmVkQ2FsbEZyYW1lU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gYWxpZ25UbyhTdGFja09mZnNldCwgTWF4U3RhY2tBcmdBbGlnbik7CisgIH0KKworICAvLy8gaXNBbGxvY2F0ZWQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIChvciBhbiBhbGlhcykgaXMKKyAgLy8vIGFsbG9jYXRlZC4KKyAgYm9vbCBpc0FsbG9jYXRlZCh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gVXNlZFJlZ3NbUmVnLzMyXSAmICgxIDw8IChSZWcmMzEpKTsKKyAgfQorCisgIC8vLyBBbmFseXplRm9ybWFsQXJndW1lbnRzIC0gQW5hbHl6ZSBhbiBhcnJheSBvZiBhcmd1bWVudCB2YWx1ZXMsCisgIC8vLyBpbmNvcnBvcmF0aW5nIGluZm8gYWJvdXQgdGhlIGZvcm1hbHMgaW50byB0aGlzIHN0YXRlLgorICB2b2lkIEFuYWx5emVGb3JtYWxBcmd1bWVudHMoY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ0Fzc2lnbkZuIEZuKTsKKworICAvLy8gVGhlIGZ1bmN0aW9uIHdpbGwgaW52b2tlIEFuYWx5emVGb3JtYWxBcmd1bWVudHMuCisgIHZvaWQgQW5hbHl6ZUFyZ3VtZW50cyhjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgIENDQXNzaWduRm4gRm4pIHsKKyAgICBBbmFseXplRm9ybWFsQXJndW1lbnRzKElucywgRm4pOworICB9CisKKyAgLy8vIEFuYWx5emVSZXR1cm4gLSBBbmFseXplIHRoZSByZXR1cm5lZCB2YWx1ZXMgb2YgYSByZXR1cm4sCisgIC8vLyBpbmNvcnBvcmF0aW5nIGluZm8gYWJvdXQgdGhlIHJlc3VsdCB2YWx1ZXMgaW50byB0aGlzIHN0YXRlLgorICB2b2lkIEFuYWx5emVSZXR1cm4oY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgIENDQXNzaWduRm4gRm4pOworCisgIC8vLyBDaGVja1JldHVybiAtIEFuYWx5emUgdGhlIHJldHVybiB2YWx1ZXMgb2YgYSBmdW5jdGlvbiwgcmV0dXJuaW5nCisgIC8vLyB0cnVlIGlmIHRoZSByZXR1cm4gY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IHNyZXQtZGVtb3Rpb24sIGFuZAorICAvLy8gZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIENoZWNrUmV0dXJuKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJkFyZ3NGbGFncywKKyAgICAgICAgICAgICAgICAgICBDQ0Fzc2lnbkZuIEZuKTsKKworICAvLy8gQW5hbHl6ZUNhbGxPcGVyYW5kcyAtIEFuYWx5emUgdGhlIG91dGdvaW5nIGFyZ3VtZW50cyB0byBhIGNhbGwsCisgIC8vLyBpbmNvcnBvcmF0aW5nIGluZm8gYWJvdXQgdGhlIHBhc3NlZCB2YWx1ZXMgaW50byB0aGlzIHN0YXRlLgorICB2b2lkIEFuYWx5emVDYWxsT3BlcmFuZHMoY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENDQXNzaWduRm4gRm4pOworCisgIC8vLyBBbmFseXplQ2FsbE9wZXJhbmRzIC0gU2FtZSBhcyBhYm92ZSBleGNlcHQgaXQgdGFrZXMgdmVjdG9ycyBvZiB0eXBlcworICAvLy8gYW5kIGFyZ3VtZW50IGZsYWdzLgorICB2b2lkIEFuYWx5emVDYWxsT3BlcmFuZHMoU21hbGxWZWN0b3JJbXBsPE1WVD4gJkFyZ1ZUcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxJU0Q6OkFyZ0ZsYWdzVHk+ICZGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENDQXNzaWduRm4gRm4pOworCisgIC8vLyBUaGUgZnVuY3Rpb24gd2lsbCBpbnZva2UgQW5hbHl6ZUNhbGxPcGVyYW5kcy4KKyAgdm9pZCBBbmFseXplQXJndW1lbnRzKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICBDQ0Fzc2lnbkZuIEZuKSB7CisgICAgQW5hbHl6ZUNhbGxPcGVyYW5kcyhPdXRzLCBGbik7CisgIH0KKworICAvLy8gQW5hbHl6ZUNhbGxSZXN1bHQgLSBBbmFseXplIHRoZSByZXR1cm4gdmFsdWVzIG9mIGEgY2FsbCwKKyAgLy8vIGluY29ycG9yYXRpbmcgaW5mbyBhYm91dCB0aGUgcGFzc2VkIHZhbHVlcyBpbnRvIHRoaXMgc3RhdGUuCisgIHZvaWQgQW5hbHl6ZUNhbGxSZXN1bHQoY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0NBc3NpZ25GbiBGbik7CisKKyAgLy8vIEEgc2hhZG93IGFsbG9jYXRlZCByZWdpc3RlciBpcyBhIHJlZ2lzdGVyIHRoYXQgd2FzIGFsbG9jYXRlZAorICAvLy8gYnV0IHdhc24ndCBhZGRlZCB0byB0aGUgbG9jYXRpb24gbGlzdCAoTG9jcykuCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZSByZWdpc3RlciB3YXMgYWxsb2NhdGVkIGFzIHNoYWRvdyBvciBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgSXNTaGFkb3dBbGxvY2F0ZWRSZWcodW5zaWduZWQgUmVnKSBjb25zdDsKKworICAvLy8gQW5hbHl6ZUNhbGxSZXN1bHQgLSBTYW1lIGFzIGFib3ZlIGV4Y2VwdCBpdCdzIHNwZWNpYWxpemVkIGZvciBjYWxscyB3aGljaAorICAvLy8gcHJvZHVjZSBhIHNpbmdsZSB2YWx1ZS4KKyAgdm9pZCBBbmFseXplQ2FsbFJlc3VsdChNVlQgVlQsIENDQXNzaWduRm4gRm4pOworCisgIC8vLyBnZXRGaXJzdFVuYWxsb2NhdGVkIC0gUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5hbGxvY2F0ZWQgcmVnaXN0ZXIKKyAgLy8vIGluIHRoZSBzZXQsIG9yIFJlZ3Muc2l6ZSgpIGlmIHRoZXkgYXJlIGFsbCBhbGxvY2F0ZWQuCisgIHVuc2lnbmVkIGdldEZpcnN0VW5hbGxvY2F0ZWQoQXJyYXlSZWY8TUNQaHlzUmVnPiBSZWdzKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFJlZ3Muc2l6ZSgpOyArK2kpCisgICAgICBpZiAoIWlzQWxsb2NhdGVkKFJlZ3NbaV0pKQorICAgICAgICByZXR1cm4gaTsKKyAgICByZXR1cm4gUmVncy5zaXplKCk7CisgIH0KKworICAvLy8gQWxsb2NhdGVSZWcgLSBBdHRlbXB0IHRvIGFsbG9jYXRlIG9uZSByZWdpc3Rlci4gIElmIGl0IGlzIG5vdCBhdmFpbGFibGUsCisgIC8vLyByZXR1cm4gemVyby4gIE90aGVyd2lzZSwgcmV0dXJuIHRoZSByZWdpc3RlciwgbWFya2luZyBpdCBhbmQgYW55IGFsaWFzZXMKKyAgLy8vIGFzIGFsbG9jYXRlZC4KKyAgdW5zaWduZWQgQWxsb2NhdGVSZWcodW5zaWduZWQgUmVnKSB7CisgICAgaWYgKGlzQWxsb2NhdGVkKFJlZykpIHJldHVybiAwOworICAgIE1hcmtBbGxvY2F0ZWQoUmVnKTsKKyAgICByZXR1cm4gUmVnOworICB9CisKKyAgLy8vIFZlcnNpb24gb2YgQWxsb2NhdGVSZWcgd2l0aCBleHRyYSByZWdpc3RlciB0byBiZSBzaGFkb3dlZC4KKyAgdW5zaWduZWQgQWxsb2NhdGVSZWcodW5zaWduZWQgUmVnLCB1bnNpZ25lZCBTaGFkb3dSZWcpIHsKKyAgICBpZiAoaXNBbGxvY2F0ZWQoUmVnKSkgcmV0dXJuIDA7CisgICAgTWFya0FsbG9jYXRlZChSZWcpOworICAgIE1hcmtBbGxvY2F0ZWQoU2hhZG93UmVnKTsKKyAgICByZXR1cm4gUmVnOworICB9CisKKyAgLy8vIEFsbG9jYXRlUmVnIC0gQXR0ZW1wdCB0byBhbGxvY2F0ZSBvbmUgb2YgdGhlIHNwZWNpZmllZCByZWdpc3RlcnMuICBJZiBub25lCisgIC8vLyBhcmUgYXZhaWxhYmxlLCByZXR1cm4gemVyby4gIE90aGVyd2lzZSwgcmV0dXJuIHRoZSBmaXJzdCBvbmUgYXZhaWxhYmxlLAorICAvLy8gbWFya2luZyBpdCBhbmQgYW55IGFsaWFzZXMgYXMgYWxsb2NhdGVkLgorICB1bnNpZ25lZCBBbGxvY2F0ZVJlZyhBcnJheVJlZjxNQ1BoeXNSZWc+IFJlZ3MpIHsKKyAgICB1bnNpZ25lZCBGaXJzdFVuYWxsb2MgPSBnZXRGaXJzdFVuYWxsb2NhdGVkKFJlZ3MpOworICAgIGlmIChGaXJzdFVuYWxsb2MgPT0gUmVncy5zaXplKCkpCisgICAgICByZXR1cm4gMDsgICAgLy8gRGlkbid0IGZpbmQgdGhlIHJlZy4KKworICAgIC8vIE1hcmsgdGhlIHJlZ2lzdGVyIGFuZCBhbnkgYWxpYXNlcyBhcyBhbGxvY2F0ZWQuCisgICAgdW5zaWduZWQgUmVnID0gUmVnc1tGaXJzdFVuYWxsb2NdOworICAgIE1hcmtBbGxvY2F0ZWQoUmVnKTsKKyAgICByZXR1cm4gUmVnOworICB9CisKKyAgLy8vIEFsbG9jYXRlUmVnQmxvY2sgLSBBdHRlbXB0IHRvIGFsbG9jYXRlIGEgYmxvY2sgb2YgUmVnc1JlcXVpcmVkIGNvbnNlY3V0aXZlCisgIC8vLyByZWdpc3RlcnMuIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCByZXR1cm4gemVyby4gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGZpcnN0CisgIC8vLyByZWdpc3RlciBvZiB0aGUgYmxvY2sgdGhhdCB3ZXJlIGFsbG9jYXRlZCwgbWFya2luZyB0aGUgZW50aXJlIGJsb2NrIGFzIGFsbG9jYXRlZC4KKyAgdW5zaWduZWQgQWxsb2NhdGVSZWdCbG9jayhBcnJheVJlZjxNQ1BoeXNSZWc+IFJlZ3MsIHVuc2lnbmVkIFJlZ3NSZXF1aXJlZCkgeworICAgIGlmIChSZWdzUmVxdWlyZWQgPiBSZWdzLnNpemUoKSkKKyAgICAgIHJldHVybiAwOworCisgICAgZm9yICh1bnNpZ25lZCBTdGFydElkeCA9IDA7IFN0YXJ0SWR4IDw9IFJlZ3Muc2l6ZSgpIC0gUmVnc1JlcXVpcmVkOworICAgICAgICAgKytTdGFydElkeCkgeworICAgICAgYm9vbCBCbG9ja0F2YWlsYWJsZSA9IHRydWU7CisgICAgICAvLyBDaGVjayBmb3IgYWxyZWFkeS1hbGxvY2F0ZWQgcmVncyBpbiB0aGlzIGJsb2NrCisgICAgICBmb3IgKHVuc2lnbmVkIEJsb2NrSWR4ID0gMDsgQmxvY2tJZHggPCBSZWdzUmVxdWlyZWQ7ICsrQmxvY2tJZHgpIHsKKyAgICAgICAgaWYgKGlzQWxsb2NhdGVkKFJlZ3NbU3RhcnRJZHggKyBCbG9ja0lkeF0pKSB7CisgICAgICAgICAgQmxvY2tBdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKEJsb2NrQXZhaWxhYmxlKSB7CisgICAgICAgIC8vIE1hcmsgdGhlIGVudGlyZSBibG9jayBhcyBhbGxvY2F0ZWQKKyAgICAgICAgZm9yICh1bnNpZ25lZCBCbG9ja0lkeCA9IDA7IEJsb2NrSWR4IDwgUmVnc1JlcXVpcmVkOyArK0Jsb2NrSWR4KSB7CisgICAgICAgICAgTWFya0FsbG9jYXRlZChSZWdzW1N0YXJ0SWR4ICsgQmxvY2tJZHhdKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVnc1tTdGFydElkeF07CisgICAgICB9CisgICAgfQorICAgIC8vIE5vIGJsb2NrIHdhcyBhdmFpbGFibGUKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBWZXJzaW9uIG9mIEFsbG9jYXRlUmVnIHdpdGggbGlzdCBvZiByZWdpc3RlcnMgdG8gYmUgc2hhZG93ZWQuCisgIHVuc2lnbmVkIEFsbG9jYXRlUmVnKEFycmF5UmVmPE1DUGh5c1JlZz4gUmVncywgY29uc3QgTUNQaHlzUmVnICpTaGFkb3dSZWdzKSB7CisgICAgdW5zaWduZWQgRmlyc3RVbmFsbG9jID0gZ2V0Rmlyc3RVbmFsbG9jYXRlZChSZWdzKTsKKyAgICBpZiAoRmlyc3RVbmFsbG9jID09IFJlZ3Muc2l6ZSgpKQorICAgICAgcmV0dXJuIDA7ICAgIC8vIERpZG4ndCBmaW5kIHRoZSByZWcuCisKKyAgICAvLyBNYXJrIHRoZSByZWdpc3RlciBhbmQgYW55IGFsaWFzZXMgYXMgYWxsb2NhdGVkLgorICAgIHVuc2lnbmVkIFJlZyA9IFJlZ3NbRmlyc3RVbmFsbG9jXSwgU2hhZG93UmVnID0gU2hhZG93UmVnc1tGaXJzdFVuYWxsb2NdOworICAgIE1hcmtBbGxvY2F0ZWQoUmVnKTsKKyAgICBNYXJrQWxsb2NhdGVkKFNoYWRvd1JlZyk7CisgICAgcmV0dXJuIFJlZzsKKyAgfQorCisgIC8vLyBBbGxvY2F0ZVN0YWNrIC0gQWxsb2NhdGUgYSBjaHVuayBvZiBzdGFjayBzcGFjZSB3aXRoIHRoZSBzcGVjaWZpZWQgc2l6ZQorICAvLy8gYW5kIGFsaWdubWVudC4KKyAgdW5zaWduZWQgQWxsb2NhdGVTdGFjayh1bnNpZ25lZCBTaXplLCB1bnNpZ25lZCBBbGlnbikgeworICAgIGFzc2VydChBbGlnbiAmJiAoKEFsaWduIC0gMSkgJiBBbGlnbikgPT0gMCk7IC8vIEFsaWduIGlzIHBvd2VyIG9mIDIuCisgICAgU3RhY2tPZmZzZXQgPSBhbGlnblRvKFN0YWNrT2Zmc2V0LCBBbGlnbik7CisgICAgdW5zaWduZWQgUmVzdWx0ID0gU3RhY2tPZmZzZXQ7CisgICAgU3RhY2tPZmZzZXQgKz0gU2l6ZTsKKyAgICBNYXhTdGFja0FyZ0FsaWduID0gc3RkOjptYXgoQWxpZ24sIE1heFN0YWNrQXJnQWxpZ24pOworICAgIGVuc3VyZU1heEFsaWdubWVudChBbGlnbik7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIHZvaWQgZW5zdXJlTWF4QWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKSB7CisgICAgaWYgKCFBbmFseXppbmdNdXN0VGFpbEZvcndhcmRlZFJlZ3MpCisgICAgICBNRi5nZXRGcmFtZUluZm8oKS5lbnN1cmVNYXhBbGlnbm1lbnQoQWxpZ24pOworICB9CisKKyAgLy8vIFZlcnNpb24gb2YgQWxsb2NhdGVTdGFjayB3aXRoIGV4dHJhIHJlZ2lzdGVyIHRvIGJlIHNoYWRvd2VkLgorICB1bnNpZ25lZCBBbGxvY2F0ZVN0YWNrKHVuc2lnbmVkIFNpemUsIHVuc2lnbmVkIEFsaWduLCB1bnNpZ25lZCBTaGFkb3dSZWcpIHsKKyAgICBNYXJrQWxsb2NhdGVkKFNoYWRvd1JlZyk7CisgICAgcmV0dXJuIEFsbG9jYXRlU3RhY2soU2l6ZSwgQWxpZ24pOworICB9CisKKyAgLy8vIFZlcnNpb24gb2YgQWxsb2NhdGVTdGFjayB3aXRoIGxpc3Qgb2YgZXh0cmEgcmVnaXN0ZXJzIHRvIGJlIHNoYWRvd2VkLgorICAvLy8gTm90ZSB0aGF0LCB1bmxpa2UgQWxsb2NhdGVSZWcsIHRoaXMgc2hhZG93cyBBTEwgb2YgdGhlIHNoYWRvdyByZWdpc3RlcnMuCisgIHVuc2lnbmVkIEFsbG9jYXRlU3RhY2sodW5zaWduZWQgU2l6ZSwgdW5zaWduZWQgQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8TUNQaHlzUmVnPiBTaGFkb3dSZWdzKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFNoYWRvd1JlZ3Muc2l6ZSgpOyArK2kpCisgICAgICBNYXJrQWxsb2NhdGVkKFNoYWRvd1JlZ3NbaV0pOworICAgIHJldHVybiBBbGxvY2F0ZVN0YWNrKFNpemUsIEFsaWduKTsKKyAgfQorCisgIC8vIEhhbmRsZUJ5VmFsIC0gQWxsb2NhdGUgYSBzdGFjayBzbG90IGxhcmdlIGVub3VnaCB0byBwYXNzIGFuIGFyZ3VtZW50IGJ5CisgIC8vIHZhbHVlLiBUaGUgc2l6ZSBhbmQgYWxpZ25tZW50IGluZm9ybWF0aW9uIG9mIHRoZSBhcmd1bWVudCBpcyBlbmNvZGVkIGluIGl0cworICAvLyBwYXJhbWV0ZXIgYXR0cmlidXRlLgorICB2b2lkIEhhbmRsZUJ5VmFsKHVuc2lnbmVkIFZhbE5vLCBNVlQgVmFsVlQsCisgICAgICAgICAgICAgICAgICAgTVZUIExvY1ZULCBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyBMb2NJbmZvLAorICAgICAgICAgICAgICAgICAgIGludCBNaW5TaXplLCBpbnQgTWluQWxpZ24sIElTRDo6QXJnRmxhZ3NUeSBBcmdGbGFncyk7CisKKyAgLy8gUmV0dXJucyBjb3VudCBvZiBieXZhbCBhcmd1bWVudHMgdGhhdCBhcmUgdG8gYmUgc3RvcmVkIChldmVuIHBhcnRseSkKKyAgLy8gaW4gcmVnaXN0ZXJzLgorICB1bnNpZ25lZCBnZXRJblJlZ3NQYXJhbXNDb3VudCgpIGNvbnN0IHsgcmV0dXJuIEJ5VmFsUmVncy5zaXplKCk7IH0KKworICAvLyBSZXR1cm5zIGNvdW50IG9mIGJ5dmFsIGluLXJlZ3MgYXJndW1lbnRzIHByb2NlZWQuCisgIHVuc2lnbmVkIGdldEluUmVnc1BhcmFtc1Byb2Nlc3NlZCgpIGNvbnN0IHsgcmV0dXJuIEluUmVnc1BhcmFtc1Byb2Nlc3NlZDsgfQorCisgIC8vIEdldCBpbmZvcm1hdGlvbiBhYm91dCBOLXRoIGJ5dmFsIHBhcmFtZXRlciB0aGF0IGlzIHN0b3JlZCBpbiByZWdpc3RlcnMuCisgIC8vIEhlcmUgIkJ5VmFsUGFyYW1JbmRleCIgaXMgTi4KKyAgdm9pZCBnZXRJblJlZ3NQYXJhbUluZm8odW5zaWduZWQgSW5SZWdzUGFyYW1SZWNvcmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQmIEJlZ2luUmVnLCB1bnNpZ25lZCYgRW5kUmVnKSBjb25zdCB7CisgICAgYXNzZXJ0KEluUmVnc1BhcmFtUmVjb3JkSW5kZXggPCBCeVZhbFJlZ3Muc2l6ZSgpICYmCisgICAgICAgICAgICJXcm9uZyBCeVZhbCBwYXJhbWV0ZXIgaW5kZXgiKTsKKworICAgIGNvbnN0IEJ5VmFsSW5mbyYgaW5mbyA9IEJ5VmFsUmVnc1tJblJlZ3NQYXJhbVJlY29yZEluZGV4XTsKKyAgICBCZWdpblJlZyA9IGluZm8uQmVnaW47CisgICAgRW5kUmVnID0gaW5mby5FbmQ7CisgIH0KKworICAvLyBBZGQgaW5mb3JtYXRpb24gYWJvdXQgcGFyYW1ldGVyIHRoYXQgaXMga2VwdCBpbiByZWdpc3RlcnMuCisgIHZvaWQgYWRkSW5SZWdzUGFyYW1JbmZvKHVuc2lnbmVkIFJlZ0JlZ2luLCB1bnNpZ25lZCBSZWdFbmQpIHsKKyAgICBCeVZhbFJlZ3MucHVzaF9iYWNrKEJ5VmFsSW5mbyhSZWdCZWdpbiwgUmVnRW5kKSk7CisgIH0KKworICAvLyBHb2VzIGVpdGhlciB0byBuZXh0IGJ5dmFsIHBhcmFtZXRlciAoZXhjbHVkaW5nICJ3YXN0ZSIgcmVjb3JkKSwgb3IKKyAgLy8gdG8gdGhlIGVuZCBvZiBjb2xsZWN0aW9uLgorICAvLyBSZXR1cm5zIGZhbHNlLCBpZiBlbmQgaXMgcmVhY2hlZC4KKyAgYm9vbCBuZXh0SW5SZWdzUGFyYW0oKSB7CisgICAgdW5zaWduZWQgZSA9IEJ5VmFsUmVncy5zaXplKCk7CisgICAgaWYgKEluUmVnc1BhcmFtc1Byb2Nlc3NlZCA8IGUpCisgICAgICArK0luUmVnc1BhcmFtc1Byb2Nlc3NlZDsKKyAgICByZXR1cm4gSW5SZWdzUGFyYW1zUHJvY2Vzc2VkIDwgZTsKKyAgfQorCisgIC8vIENsZWFyIGJ5dmFsIHJlZ2lzdGVycyB0cmFja2luZyBpbmZvLgorICB2b2lkIGNsZWFyQnlWYWxSZWdzSW5mbygpIHsKKyAgICBJblJlZ3NQYXJhbXNQcm9jZXNzZWQgPSAwOworICAgIEJ5VmFsUmVncy5jbGVhcigpOworICB9CisKKyAgLy8gUmV3aW5kIGJ5dmFsIHJlZ2lzdGVycyB0cmFja2luZyBpbmZvLgorICB2b2lkIHJld2luZEJ5VmFsUmVnc0luZm8oKSB7CisgICAgSW5SZWdzUGFyYW1zUHJvY2Vzc2VkID0gMDsKKyAgfQorCisgIC8vIEdldCBsaXN0IG9mIHBlbmRpbmcgYXNzaWdubWVudHMKKyAgU21hbGxWZWN0b3JJbXBsPENDVmFsQXNzaWduPiAmZ2V0UGVuZGluZ0xvY3MoKSB7CisgICAgcmV0dXJuIFBlbmRpbmdMb2NzOworICB9CisKKyAgLy8gR2V0IGEgbGlzdCBvZiBhcmdmbGFncyBmb3IgcGVuZGluZyBhc3NpZ25tZW50cy4KKyAgU21hbGxWZWN0b3JJbXBsPElTRDo6QXJnRmxhZ3NUeT4gJmdldFBlbmRpbmdBcmdGbGFncygpIHsKKyAgICByZXR1cm4gUGVuZGluZ0FyZ0ZsYWdzOworICB9CisKKyAgLy8vIENvbXB1dGUgdGhlIHJlbWFpbmluZyB1bnVzZWQgcmVnaXN0ZXIgcGFyYW1ldGVycyB0aGF0IHdvdWxkIGJlIHVzZWQgZm9yCisgIC8vLyB0aGUgZ2l2ZW4gdmFsdWUgdHlwZS4gVGhpcyBpcyB1c2VmdWwgd2hlbiB2YXJhcmdzIGFyZSBwYXNzZWQgaW4gdGhlCisgIC8vLyByZWdpc3RlcnMgdGhhdCBub3JtYWwgcHJvdG90eXBlZCBwYXJhbWV0ZXJzIHdvdWxkIGJlIHBhc3NlZCBpbiwgb3IgZm9yCisgIC8vLyBpbXBsZW1lbnRpbmcgcGVyZmVjdCBmb3J3YXJkaW5nLgorICB2b2lkIGdldFJlbWFpbmluZ1JlZ1Bhcm1zRm9yVHlwZShTbWFsbFZlY3RvckltcGw8TUNQaHlzUmVnPiAmUmVncywgTVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ0Fzc2lnbkZuIEZuKTsKKworICAvLy8gQ29tcHV0ZSB0aGUgc2V0IG9mIHJlZ2lzdGVycyB0aGF0IG5lZWQgdG8gYmUgcHJlc2VydmVkIGFuZCBmb3J3YXJkZWQgdG8KKyAgLy8vIGFueSBtdXN0dGFpbCBjYWxscy4KKyAgdm9pZCBhbmFseXplTXVzdFRhaWxGb3J3YXJkZWRSZWdpc3RlcnMoCisgICAgICBTbWFsbFZlY3RvckltcGw8Rm9yd2FyZGVkUmVnaXN0ZXI+ICZGb3J3YXJkcywgQXJyYXlSZWY8TVZUPiBSZWdQYXJtVHlwZXMsCisgICAgICBDQ0Fzc2lnbkZuIEZuKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSByZXN1bHRzIG9mIHRoZSB0d28gY2FsbGluZyBjb252ZW50aW9ucyBhcmUgY29tcGF0aWJsZS4KKyAgLy8vIFRoaXMgaXMgdXN1YWxseSBwYXJ0IG9mIHRoZSBjaGVjayBmb3IgdGFpbGNhbGwgZWxpZ2liaWxpdHkuCisgIHN0YXRpYyBib29sIHJlc3VsdHNDb21wYXRpYmxlKENhbGxpbmdDb252OjpJRCBDYWxsZWVDQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxlckNDLCBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6SW5wdXRBcmc+ICZJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDQXNzaWduRm4gQ2FsbGVlRm4sIENDQXNzaWduRm4gQ2FsbGVyRm4pOworCisgIC8vLyBUaGUgZnVuY3Rpb24gcnVucyBhbiBhZGRpdGlvbmFsIGFuYWx5c2lzIHBhc3Mgb3ZlciBmdW5jdGlvbiBhcmd1bWVudHMuCisgIC8vLyBJdCB3aWxsIG1hcmsgZWFjaCBhcmd1bWVudCB3aXRoIHRoZSBhdHRyaWJ1dGUgZmxhZyBTZWNBcmdQYXNzLgorICAvLy8gQWZ0ZXIgcnVubmluZywgaXQgd2lsbCBzb3J0IHRoZSBsb2NzIGxpc3QuCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICB2b2lkIEFuYWx5emVBcmd1bWVudHNTZWNvbmRQYXNzKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxUPiAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ0Fzc2lnbkZuIEZuKSB7CisgICAgdW5zaWduZWQgTnVtRmlyc3RQYXNzTG9jcyA9IExvY3Muc2l6ZSgpOworCisgICAgLy8vIENyZWF0ZXMgc2ltaWxhciBhcmd1bWVudCBsaXN0IHRvIFxwIEFyZ3MgaW4gd2hpY2ggZWFjaCBhcmd1bWVudCBpcworICAgIC8vLyBtYXJrZWQgdXNpbmcgU2VjQXJnUGFzcyBmbGFnLgorICAgIFNtYWxsVmVjdG9yPFQsIDE2PiBTZWNQYXNzQXJnOworICAgIC8vIFNtYWxsVmVjdG9yPElTRDo6SW5wdXRBcmcsIDE2PiBTZWNQYXNzQXJnOworICAgIGZvciAoYXV0byBBcmcgOiBBcmdzKSB7CisgICAgICBBcmcuRmxhZ3Muc2V0U2VjQXJnUGFzcygpOworICAgICAgU2VjUGFzc0FyZy5wdXNoX2JhY2soQXJnKTsKKyAgICB9CisKKyAgICAvLyBSdW4gdGhlIHNlY29uZCBhcmd1bWVudCBwYXNzCisgICAgQW5hbHl6ZUFyZ3VtZW50cyhTZWNQYXNzQXJnLCBGbik7CisKKyAgICAvLyBTb3J0IHRoZSBsb2NhdGlvbnMgb2YgdGhlIGFyZ3VtZW50cyBhY2NvcmRpbmcgdG8gdGhlaXIgb3JpZ2luYWwgcG9zaXRpb24uCisgICAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDE2PiBUbXBBcmdMb2NzOworICAgIHN0ZDo6c3dhcChUbXBBcmdMb2NzLCBMb2NzKTsKKyAgICBhdXRvIEIgPSBUbXBBcmdMb2NzLmJlZ2luKCksIEUgPSBUbXBBcmdMb2NzLmVuZCgpOworICAgIHN0ZDo6bWVyZ2UoQiwgQiArIE51bUZpcnN0UGFzc0xvY3MsIEIgKyBOdW1GaXJzdFBhc3NMb2NzLCBFLAorICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKExvY3MpLAorICAgICAgICAgICAgICAgW10oY29uc3QgQ0NWYWxBc3NpZ24gJkEsIGNvbnN0IENDVmFsQXNzaWduICZCKSAtPiBib29sIHsKKyAgICAgICAgICAgICAgICAgcmV0dXJuIEEuZ2V0VmFsTm8oKSA8IEIuZ2V0VmFsTm8oKTsKKyAgICAgICAgICAgICAgIH0pOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBNYXJrQWxsb2NhdGVkIC0gTWFyayBhIHJlZ2lzdGVyIGFuZCBhbGwgb2YgaXRzIGFsaWFzZXMgYXMgYWxsb2NhdGVkLgorICB2b2lkIE1hcmtBbGxvY2F0ZWQodW5zaWduZWQgUmVnKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fQ0FMTElOR0NPTlZMT1dFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQ29tbWFuZEZsYWdzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Db21tYW5kRmxhZ3MuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MDhjMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQ29tbWFuZEZsYWdzLmRlZgpAQCAtMCwwICsxLDM4OSBAQAorLy89PT0tLSBDb21tYW5kRmxhZ3MuaCAtIENvbW1hbmQgTGluZSBGbGFncyBJbnRlcmZhY2UgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgY29kZWdlbi1zcGVjaWZpYyBmbGFncyB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQKKy8vIGNvbW1hbmQgbGluZSB0b29scy4gVGhlIHRvb2xzICJsbGMiIGFuZCAib3B0IiBib3RoIHVzZSB0aGlzIGZpbGUgdG8gcHJldmVudAorLy8gZmxhZyBkdXBsaWNhdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNUYXJnZXRPcHRpb25zQ29tbWFuZEZsYWdzLmRlZiIKKyNpbmNsdWRlICJsbHZtL01DL1N1YnRhcmdldEZlYXR1cmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29kZUdlbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Ib3N0LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlIDxzdHJpbmc+Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKKworc3RhdGljIGNsOjpvcHQ8c3RkOjpzdHJpbmc+CisgICAgTUFyY2goIm1hcmNoIiwKKyAgICAgICAgICBjbDo6ZGVzYygiQXJjaGl0ZWN0dXJlIHRvIGdlbmVyYXRlIGNvZGUgZm9yIChzZWUgLS12ZXJzaW9uKSIpKTsKKworc3RhdGljIGNsOjpvcHQ8c3RkOjpzdHJpbmc+CisgICAgTUNQVSgibWNwdSIsCisgICAgICAgICBjbDo6ZGVzYygiVGFyZ2V0IGEgc3BlY2lmaWMgY3B1IHR5cGUgKC1tY3B1PWhlbHAgZm9yIGRldGFpbHMpIiksCisgICAgICAgICBjbDo6dmFsdWVfZGVzYygiY3B1LW5hbWUiKSwgY2w6OmluaXQoIiIpKTsKKworc3RhdGljIGNsOjpsaXN0PHN0ZDo6c3RyaW5nPgorICAgIE1BdHRycygibWF0dHIiLCBjbDo6Q29tbWFTZXBhcmF0ZWQsCisgICAgICAgICAgIGNsOjpkZXNjKCJUYXJnZXQgc3BlY2lmaWMgYXR0cmlidXRlcyAoLW1hdHRyPWhlbHAgZm9yIGRldGFpbHMpIiksCisgICAgICAgICAgIGNsOjp2YWx1ZV9kZXNjKCJhMSwrYTIsLWEzLC4uLiIpKTsKKworc3RhdGljIGNsOjpvcHQ8UmVsb2M6Ok1vZGVsPiBSZWxvY01vZGVsKAorICAgICJyZWxvY2F0aW9uLW1vZGVsIiwgY2w6OmRlc2MoIkNob29zZSByZWxvY2F0aW9uIG1vZGVsIiksCisgICAgY2w6OnZhbHVlcygKKyAgICAgICAgY2xFbnVtVmFsTihSZWxvYzo6U3RhdGljLCAic3RhdGljIiwgIk5vbi1yZWxvY2F0YWJsZSBjb2RlIiksCisgICAgICAgIGNsRW51bVZhbE4oUmVsb2M6OlBJQ18sICJwaWMiLAorICAgICAgICAgICAgICAgICAgICJGdWxseSByZWxvY2F0YWJsZSwgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSIpLAorICAgICAgICBjbEVudW1WYWxOKFJlbG9jOjpEeW5hbWljTm9QSUMsICJkeW5hbWljLW5vLXBpYyIsCisgICAgICAgICAgICAgICAgICAgIlJlbG9jYXRhYmxlIGV4dGVybmFsIHJlZmVyZW5jZXMsIG5vbi1yZWxvY2F0YWJsZSBjb2RlIiksCisgICAgICAgIGNsRW51bVZhbE4oUmVsb2M6OlJPUEksICJyb3BpIiwKKyAgICAgICAgICAgICAgICAgICAiQ29kZSBhbmQgcmVhZC1vbmx5IGRhdGEgcmVsb2NhdGFibGUsIGFjY2Vzc2VkIFBDLXJlbGF0aXZlIiksCisgICAgICAgIGNsRW51bVZhbE4oCisgICAgICAgICAgICBSZWxvYzo6UldQSSwgInJ3cGkiLAorICAgICAgICAgICAgIlJlYWQtd3JpdGUgZGF0YSByZWxvY2F0YWJsZSwgYWNjZXNzZWQgcmVsYXRpdmUgdG8gc3RhdGljIGJhc2UiKSwKKyAgICAgICAgY2xFbnVtVmFsTihSZWxvYzo6Uk9QSV9SV1BJLCAicm9waS1yd3BpIiwKKyAgICAgICAgICAgICAgICAgICAiQ29tYmluYXRpb24gb2Ygcm9waSBhbmQgcndwaSIpKSk7CisKK0xMVk1fQVRUUklCVVRFX1VOVVNFRCBzdGF0aWMgT3B0aW9uYWw8UmVsb2M6Ok1vZGVsPiBnZXRSZWxvY01vZGVsKCkgeworICBpZiAoUmVsb2NNb2RlbC5nZXROdW1PY2N1cnJlbmNlcygpKSB7CisgICAgUmVsb2M6Ok1vZGVsIFIgPSBSZWxvY01vZGVsOworICAgIHJldHVybiBSOworICB9CisgIHJldHVybiBOb25lOworfQorCitzdGF0aWMgY2w6Om9wdDxUaHJlYWRNb2RlbDo6TW9kZWw+IFRNTW9kZWwoCisgICAgInRocmVhZC1tb2RlbCIsIGNsOjpkZXNjKCJDaG9vc2UgdGhyZWFkaW5nIG1vZGVsIiksCisgICAgY2w6OmluaXQoVGhyZWFkTW9kZWw6OlBPU0lYKSwKKyAgICBjbDo6dmFsdWVzKGNsRW51bVZhbE4oVGhyZWFkTW9kZWw6OlBPU0lYLCAicG9zaXgiLCAiUE9TSVggdGhyZWFkIG1vZGVsIiksCisgICAgICAgICAgICAgICBjbEVudW1WYWxOKFRocmVhZE1vZGVsOjpTaW5nbGUsICJzaW5nbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiU2luZ2xlIHRocmVhZCBtb2RlbCIpKSk7CisKK3N0YXRpYyBjbDo6b3B0PGxsdm06OkNvZGVNb2RlbDo6TW9kZWw+IENNTW9kZWwoCisgICAgImNvZGUtbW9kZWwiLCBjbDo6ZGVzYygiQ2hvb3NlIGNvZGUgbW9kZWwiKSwKKyAgICBjbDo6dmFsdWVzKGNsRW51bVZhbE4oQ29kZU1vZGVsOjpTbWFsbCwgInNtYWxsIiwgIlNtYWxsIGNvZGUgbW9kZWwiKSwKKyAgICAgICAgICAgICAgIGNsRW51bVZhbE4oQ29kZU1vZGVsOjpLZXJuZWwsICJrZXJuZWwiLCAiS2VybmVsIGNvZGUgbW9kZWwiKSwKKyAgICAgICAgICAgICAgIGNsRW51bVZhbE4oQ29kZU1vZGVsOjpNZWRpdW0sICJtZWRpdW0iLCAiTWVkaXVtIGNvZGUgbW9kZWwiKSwKKyAgICAgICAgICAgICAgIGNsRW51bVZhbE4oQ29kZU1vZGVsOjpMYXJnZSwgImxhcmdlIiwgIkxhcmdlIGNvZGUgbW9kZWwiKSkpOworCitMTFZNX0FUVFJJQlVURV9VTlVTRUQgc3RhdGljIE9wdGlvbmFsPENvZGVNb2RlbDo6TW9kZWw+IGdldENvZGVNb2RlbCgpIHsKKyAgaWYgKENNTW9kZWwuZ2V0TnVtT2NjdXJyZW5jZXMoKSkgeworICAgIENvZGVNb2RlbDo6TW9kZWwgTSA9IENNTW9kZWw7CisgICAgcmV0dXJuIE07CisgIH0KKyAgcmV0dXJuIE5vbmU7Cit9CisKK3N0YXRpYyBjbDo6b3B0PGxsdm06OkV4Y2VwdGlvbkhhbmRsaW5nPiBFeGNlcHRpb25Nb2RlbCgKKyAgICAiZXhjZXB0aW9uLW1vZGVsIiwgY2w6OmRlc2MoImV4Y2VwdGlvbiBtb2RlbCIpLAorICAgIGNsOjppbml0KEV4Y2VwdGlvbkhhbmRsaW5nOjpOb25lKSwKKyAgICBjbDo6dmFsdWVzKAorICAgICAgICBjbEVudW1WYWxOKEV4Y2VwdGlvbkhhbmRsaW5nOjpOb25lLCAiZGVmYXVsdCIsCisgICAgICAgICAgICAgICAgICAgImRlZmF1bHQgZXhjZXB0aW9uIGhhbmRsaW5nIG1vZGVsIiksCisgICAgICAgIGNsRW51bVZhbE4oRXhjZXB0aW9uSGFuZGxpbmc6OkR3YXJmQ0ZJLCAiZHdhcmYiLAorICAgICAgICAgICAgICAgICAgICJEV0FSRi1saWtlIENGSSBiYXNlZCBleGNlcHRpb24gaGFuZGxpbmciKSwKKyAgICAgICAgY2xFbnVtVmFsTihFeGNlcHRpb25IYW5kbGluZzo6U2pMaiwgInNqbGoiLCAiU2pMaiBleGNlcHRpb24gaGFuZGxpbmciKSwKKyAgICAgICAgY2xFbnVtVmFsTihFeGNlcHRpb25IYW5kbGluZzo6QVJNLCAiYXJtIiwgIkFSTSBFSEFCSSBleGNlcHRpb25zIiksCisgICAgICAgIGNsRW51bVZhbE4oRXhjZXB0aW9uSGFuZGxpbmc6OldpbkVILCAid2luZWgiLAorICAgICAgICAgICAgICAgICAgICJXaW5kb3dzIGV4Y2VwdGlvbiBtb2RlbCIpLAorICAgICAgICBjbEVudW1WYWxOKEV4Y2VwdGlvbkhhbmRsaW5nOjpXYXNtLCAid2FzbSIsCisgICAgICAgICAgICAgICAgICAgIldlYkFzc2VtYmx5IGV4Y2VwdGlvbiBoYW5kbGluZyIpKSk7CisKK3N0YXRpYyBjbDo6b3B0PFRhcmdldE1hY2hpbmU6OkNvZGVHZW5GaWxlVHlwZT4gRmlsZVR5cGUoCisgICAgImZpbGV0eXBlIiwgY2w6OmluaXQoVGFyZ2V0TWFjaGluZTo6Q0dGVF9Bc3NlbWJseUZpbGUpLAorICAgIGNsOjpkZXNjKAorICAgICAgICAiQ2hvb3NlIGEgZmlsZSB0eXBlIChub3QgYWxsIHR5cGVzIGFyZSBzdXBwb3J0ZWQgYnkgYWxsIHRhcmdldHMpOiIpLAorICAgIGNsOjp2YWx1ZXMoY2xFbnVtVmFsTihUYXJnZXRNYWNoaW5lOjpDR0ZUX0Fzc2VtYmx5RmlsZSwgImFzbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFbWl0IGFuIGFzc2VtYmx5ICgnLnMnKSBmaWxlIiksCisgICAgICAgICAgICAgICBjbEVudW1WYWxOKFRhcmdldE1hY2hpbmU6OkNHRlRfT2JqZWN0RmlsZSwgIm9iaiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFbWl0IGEgbmF0aXZlIG9iamVjdCAoJy5vJykgZmlsZSIpLAorICAgICAgICAgICAgICAgY2xFbnVtVmFsTihUYXJnZXRNYWNoaW5lOjpDR0ZUX051bGwsICJudWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkVtaXQgbm90aGluZywgZm9yIHBlcmZvcm1hbmNlIHRlc3RpbmciKSkpOworCitzdGF0aWMgY2w6Om9wdDxib29sPgorICAgIERpc2FibGVGUEVsaW0oImRpc2FibGUtZnAtZWxpbSIsCisgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiRGlzYWJsZSBmcmFtZSBwb2ludGVyIGVsaW1pbmF0aW9uIG9wdGltaXphdGlvbiIpLAorICAgICAgICAgICAgICAgICAgY2w6OmluaXQoZmFsc2UpKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4gRW5hYmxlVW5zYWZlRlBNYXRoKAorICAgICJlbmFibGUtdW5zYWZlLWZwLW1hdGgiLAorICAgIGNsOjpkZXNjKCJFbmFibGUgb3B0aW1pemF0aW9ucyB0aGF0IG1heSBkZWNyZWFzZSBGUCBwcmVjaXNpb24iKSwKKyAgICBjbDo6aW5pdChmYWxzZSkpOworCitzdGF0aWMgY2w6Om9wdDxib29sPiBFbmFibGVOb0luZnNGUE1hdGgoCisgICAgImVuYWJsZS1uby1pbmZzLWZwLW1hdGgiLAorICAgIGNsOjpkZXNjKCJFbmFibGUgRlAgbWF0aCBvcHRpbWl6YXRpb25zIHRoYXQgYXNzdW1lIG5vICstSW5mcyIpLAorICAgIGNsOjppbml0KGZhbHNlKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IEVuYWJsZU5vTmFOc0ZQTWF0aCgKKyAgICAiZW5hYmxlLW5vLW5hbnMtZnAtbWF0aCIsCisgICAgY2w6OmRlc2MoIkVuYWJsZSBGUCBtYXRoIG9wdGltaXphdGlvbnMgdGhhdCBhc3N1bWUgbm8gTmFOcyIpLAorICAgIGNsOjppbml0KGZhbHNlKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IEVuYWJsZU5vU2lnbmVkWmVyb3NGUE1hdGgoCisgICAgImVuYWJsZS1uby1zaWduZWQtemVyb3MtZnAtbWF0aCIsCisgICAgY2w6OmRlc2MoIkVuYWJsZSBGUCBtYXRoIG9wdGltaXphdGlvbnMgdGhhdCBhc3N1bWUgIgorICAgICAgICAgICAgICJ0aGUgc2lnbiBvZiAwIGlzIGluc2lnbmlmaWNhbnQiKSwKKyAgICBjbDo6aW5pdChmYWxzZSkpOworCitzdGF0aWMgY2w6Om9wdDxib29sPgorICAgIEVuYWJsZU5vVHJhcHBpbmdGUE1hdGgoImVuYWJsZS1uby10cmFwcGluZy1mcC1tYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJFbmFibGUgc2V0dGluZyB0aGUgRlAgZXhjZXB0aW9ucyBidWlsZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIG5vdCB0byB1c2UgZXhjZXB0aW9ucyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmluaXQoZmFsc2UpKTsKKworc3RhdGljIGNsOjpvcHQ8bGx2bTo6RlBEZW5vcm1hbDo6RGVub3JtYWxNb2RlPiBEZW5vcm1hbE1vZGUoCisgICAgImRlbm9ybWFsLWZwLW1hdGgiLAorICAgIGNsOjpkZXNjKCJTZWxlY3Qgd2hpY2ggZGVub3JtYWwgbnVtYmVycyB0aGUgY29kZSBpcyBwZXJtaXR0ZWQgdG8gcmVxdWlyZSIpLAorICAgIGNsOjppbml0KEZQRGVub3JtYWw6OklFRUUpLAorICAgIGNsOjp2YWx1ZXMoY2xFbnVtVmFsTihGUERlbm9ybWFsOjpJRUVFLCAiaWVlZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJRUVFIDc1NCBkZW5vcm1hbCBudW1iZXJzIiksCisgICAgICAgICAgICAgICBjbEVudW1WYWxOKEZQRGVub3JtYWw6OlByZXNlcnZlU2lnbiwgInByZXNlcnZlLXNpZ24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHNpZ24gb2YgYSAgZmx1c2hlZC10by16ZXJvIG51bWJlciBpcyBwcmVzZXJ2ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gdGhlIHNpZ24gb2YgMCIpLAorICAgICAgICAgICAgICAgY2xFbnVtVmFsTihGUERlbm9ybWFsOjpQb3NpdGl2ZVplcm8sICJwb3NpdGl2ZS16ZXJvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImRlbm9ybWFscyBhcmUgZmx1c2hlZCB0byBwb3NpdGl2ZSB6ZXJvIikpKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4gRW5hYmxlSG9ub3JTaWduRGVwZW5kZW50Um91bmRpbmdGUE1hdGgoCisgICAgImVuYWJsZS1zaWduLWRlcGVuZGVudC1yb3VuZGluZy1mcC1tYXRoIiwgY2w6OkhpZGRlbiwKKyAgICBjbDo6ZGVzYygiRm9yY2UgY29kZWdlbiB0byBhc3N1bWUgcm91bmRpbmcgbW9kZSBjYW4gY2hhbmdlIGR5bmFtaWNhbGx5IiksCisgICAgY2w6OmluaXQoZmFsc2UpKTsKKworc3RhdGljIGNsOjpvcHQ8bGx2bTo6RmxvYXRBQkk6OkFCSVR5cGU+IEZsb2F0QUJJRm9yQ2FsbHMoCisgICAgImZsb2F0LWFiaSIsIGNsOjpkZXNjKCJDaG9vc2UgZmxvYXQgQUJJIHR5cGUiKSwgY2w6OmluaXQoRmxvYXRBQkk6OkRlZmF1bHQpLAorICAgIGNsOjp2YWx1ZXMoY2xFbnVtVmFsTihGbG9hdEFCSTo6RGVmYXVsdCwgImRlZmF1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVGFyZ2V0IGRlZmF1bHQgZmxvYXQgQUJJIHR5cGUiKSwKKyAgICAgICAgICAgICAgIGNsRW51bVZhbE4oRmxvYXRBQkk6OlNvZnQsICJzb2Z0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvZnQgZmxvYXQgQUJJIChpbXBsaWVkIGJ5IC1zb2Z0LWZsb2F0KSIpLAorICAgICAgICAgICAgICAgY2xFbnVtVmFsTihGbG9hdEFCSTo6SGFyZCwgImhhcmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSGFyZCBmbG9hdCBBQkkgKHVzZXMgRlAgcmVnaXN0ZXJzKSIpKSk7CisKK3N0YXRpYyBjbDo6b3B0PGxsdm06OkZQT3BGdXNpb246OkZQT3BGdXNpb25Nb2RlPiBGdXNlRlBPcHMoCisgICAgImZwLWNvbnRyYWN0IiwgY2w6OmRlc2MoIkVuYWJsZSBhZ2dyZXNzaXZlIGZvcm1hdGlvbiBvZiBmdXNlZCBGUCBvcHMiKSwKKyAgICBjbDo6aW5pdChGUE9wRnVzaW9uOjpTdGFuZGFyZCksCisgICAgY2w6OnZhbHVlcygKKyAgICAgICAgY2xFbnVtVmFsTihGUE9wRnVzaW9uOjpGYXN0LCAiZmFzdCIsICJGdXNlIEZQIG9wcyB3aGVuZXZlciBwcm9maXRhYmxlIiksCisgICAgICAgIGNsRW51bVZhbE4oRlBPcEZ1c2lvbjo6U3RhbmRhcmQsICJvbiIsICJPbmx5IGZ1c2UgJ2JsZXNzZWQnIEZQIG9wcy4iKSwKKyAgICAgICAgY2xFbnVtVmFsTihGUE9wRnVzaW9uOjpTdHJpY3QsICJvZmYiLAorICAgICAgICAgICAgICAgICAgICJPbmx5IGZ1c2UgRlAgb3BzIHdoZW4gdGhlIHJlc3VsdCB3b24ndCBiZSBhZmZlY3RlZC4iKSkpOworCitzdGF0aWMgY2w6Om9wdDxib29sPiBEb250UGxhY2VaZXJvc0luQlNTKAorICAgICJub3plcm8taW5pdGlhbGl6ZWQtaW4tYnNzIiwKKyAgICBjbDo6ZGVzYygiRG9uJ3QgcGxhY2UgemVyby1pbml0aWFsaXplZCBzeW1ib2xzIGludG8gYnNzIHNlY3Rpb24iKSwKKyAgICBjbDo6aW5pdChmYWxzZSkpOworCitzdGF0aWMgY2w6Om9wdDxib29sPiBFbmFibGVHdWFyYW50ZWVkVGFpbENhbGxPcHQoCisgICAgInRhaWxjYWxsb3B0IiwKKyAgICBjbDo6ZGVzYygKKyAgICAgICAgIlR1cm4gZmFzdGNjIGNhbGxzIGludG8gdGFpbCBjYWxscyBieSAocG90ZW50aWFsbHkpIGNoYW5naW5nIEFCSS4iKSwKKyAgICBjbDo6aW5pdChmYWxzZSkpOworCitzdGF0aWMgY2w6Om9wdDxib29sPiBEaXNhYmxlVGFpbENhbGxzKCJkaXNhYmxlLXRhaWwtY2FsbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiTmV2ZXIgZW1pdCB0YWlsIGNhbGxzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjppbml0KGZhbHNlKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IFN0YWNrU3ltYm9sT3JkZXJpbmcoInN0YWNrLXN5bWJvbC1vcmRlcmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJPcmRlciBsb2NhbCBzdGFjayBzeW1ib2xzLiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbDo6aW5pdCh0cnVlKSk7CisKK3N0YXRpYyBjbDo6b3B0PHVuc2lnbmVkPgorICAgIE92ZXJyaWRlU3RhY2tBbGlnbm1lbnQoInN0YWNrLWFsaWdubWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiT3ZlcnJpZGUgZGVmYXVsdCBzdGFjayBhbGlnbm1lbnQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjppbml0KDApKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KKyAgICBTdGFja1JlYWxpZ24oInN0YWNrcmVhbGlnbiIsCisgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJGb3JjZSBhbGlnbiB0aGUgc3RhY2sgdG8gdGhlIG1pbmltdW0gYWxpZ25tZW50IiksCisgICAgICAgICAgICAgICAgIGNsOjppbml0KGZhbHNlKSk7CisKK3N0YXRpYyBjbDo6b3B0PHN0ZDo6c3RyaW5nPiBUcmFwRnVuY05hbWUoCisgICAgInRyYXAtZnVuYyIsIGNsOjpIaWRkZW4sCisgICAgY2w6OmRlc2MoIkVtaXQgYSBjYWxsIHRvIHRyYXAgZnVuY3Rpb24gcmF0aGVyIHRoYW4gYSB0cmFwIGluc3RydWN0aW9uIiksCisgICAgY2w6OmluaXQoIiIpKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4gVXNlQ3RvcnMoInVzZS1jdG9ycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiVXNlIC5jdG9ycyBpbnN0ZWFkIG9mIC5pbml0X2FycmF5LiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmluaXQoZmFsc2UpKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4gUmVsYXhFTEZSZWxvY2F0aW9ucygKKyAgICAicmVsYXgtZWxmLXJlbG9jYXRpb25zIiwKKyAgICBjbDo6ZGVzYygiRW1pdCBHT1RQQ1JFTFgvUkVYX0dPVFBDUkVMWCBpbnN0ZWFkIG9mIEdPVFBDUkVMIG9uIHg4Ni02NCBFTEYiKSwKKyAgICBjbDo6aW5pdChmYWxzZSkpOworCitzdGF0aWMgY2w6Om9wdDxib29sPiBEYXRhU2VjdGlvbnMoImRhdGEtc2VjdGlvbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJFbWl0IGRhdGEgaW50byBzZXBhcmF0ZSBzZWN0aW9ucyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjppbml0KGZhbHNlKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CisgICAgRnVuY3Rpb25TZWN0aW9ucygiZnVuY3Rpb24tc2VjdGlvbnMiLAorICAgICAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIkVtaXQgZnVuY3Rpb25zIGludG8gc2VwYXJhdGUgc2VjdGlvbnMiKSwKKyAgICAgICAgICAgICAgICAgICAgIGNsOjppbml0KGZhbHNlKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IEVtdWxhdGVkVExTKCJlbXVsYXRlZC10bHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIlVzZSBlbXVsYXRlZCBUTFMgbW9kZWwiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjppbml0KGZhbHNlKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CisgICAgVW5pcXVlU2VjdGlvbk5hbWVzKCJ1bmlxdWUtc2VjdGlvbi1uYW1lcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJHaXZlIHVuaXF1ZSBuYW1lcyB0byBldmVyeSBzZWN0aW9uIiksCisgICAgICAgICAgICAgICAgICAgICAgIGNsOjppbml0KHRydWUpKTsKKworc3RhdGljIGNsOjpvcHQ8bGx2bTo6RUFCST4KKyAgICBFQUJJVmVyc2lvbigibWVhYmkiLCBjbDo6ZGVzYygiU2V0IEVBQkkgdHlwZSAoZGVmYXVsdCBkZXBlbmRzIG9uIHRyaXBsZSk6IiksCisgICAgICAgICAgICAgICAgY2w6OmluaXQoRUFCSTo6RGVmYXVsdCksCisgICAgICAgICAgICAgICAgY2w6OnZhbHVlcyhjbEVudW1WYWxOKEVBQkk6OkRlZmF1bHQsICJkZWZhdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyaXBsZSBkZWZhdWx0IEVBQkkgdmVyc2lvbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xFbnVtVmFsTihFQUJJOjpFQUJJNCwgIjQiLCAiRUFCSSB2ZXJzaW9uIDQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oRUFCSTo6RUFCSTUsICI1IiwgIkVBQkkgdmVyc2lvbiA1IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbEVudW1WYWxOKEVBQkk6OkdOVSwgImdudSIsICJFQUJJIEdOVSIpKSk7CisKK3N0YXRpYyBjbDo6b3B0PERlYnVnZ2VyS2luZD4gRGVidWdnZXJUdW5pbmdPcHQoCisgICAgImRlYnVnZ2VyLXR1bmUiLCBjbDo6ZGVzYygiVHVuZSBkZWJ1ZyBpbmZvIGZvciBhIHBhcnRpY3VsYXIgZGVidWdnZXIiKSwKKyAgICBjbDo6aW5pdChEZWJ1Z2dlcktpbmQ6OkRlZmF1bHQpLAorICAgIGNsOjp2YWx1ZXMoY2xFbnVtVmFsTihEZWJ1Z2dlcktpbmQ6OkdEQiwgImdkYiIsICJnZGIiKSwKKyAgICAgICAgICAgICAgIGNsRW51bVZhbE4oRGVidWdnZXJLaW5kOjpMTERCLCAibGxkYiIsICJsbGRiIiksCisgICAgICAgICAgICAgICBjbEVudW1WYWxOKERlYnVnZ2VyS2luZDo6U0NFLCAic2NlIiwgIlNDRSB0YXJnZXRzIChlLmcuIFBTNCkiKSkpOworCitzdGF0aWMgY2w6Om9wdDxib29sPiBFbmFibGVTdGFja1NpemVTZWN0aW9uKAorICAgICJzdGFjay1zaXplLXNlY3Rpb24iLAorICAgIGNsOjpkZXNjKCJFbWl0IGEgc2VjdGlvbiBjb250YWluaW5nIHN0YWNrIHNpemUgbWV0YWRhdGEiKSwgY2w6OmluaXQoZmFsc2UpKTsKKworLy8gQ29tbW9uIHV0aWxpdHkgZnVuY3Rpb24gdGlnaHRseSB0aWVkIHRvIHRoZSBvcHRpb25zIGxpc3RlZCBoZXJlLiBJbml0aWFsaXplcworLy8gYSBUYXJnZXRPcHRpb25zIG9iamVjdCB3aXRoIENvZGVHZW4gZmxhZ3MgYW5kIHJldHVybnMgaXQuCitzdGF0aWMgVGFyZ2V0T3B0aW9ucyBJbml0VGFyZ2V0T3B0aW9uc0Zyb21Db2RlR2VuRmxhZ3MoKSB7CisgIFRhcmdldE9wdGlvbnMgT3B0aW9uczsKKyAgT3B0aW9ucy5BbGxvd0ZQT3BGdXNpb24gPSBGdXNlRlBPcHM7CisgIE9wdGlvbnMuVW5zYWZlRlBNYXRoID0gRW5hYmxlVW5zYWZlRlBNYXRoOworICBPcHRpb25zLk5vSW5mc0ZQTWF0aCA9IEVuYWJsZU5vSW5mc0ZQTWF0aDsKKyAgT3B0aW9ucy5Ob05hTnNGUE1hdGggPSBFbmFibGVOb05hTnNGUE1hdGg7CisgIE9wdGlvbnMuTm9TaWduZWRaZXJvc0ZQTWF0aCA9IEVuYWJsZU5vU2lnbmVkWmVyb3NGUE1hdGg7CisgIE9wdGlvbnMuTm9UcmFwcGluZ0ZQTWF0aCA9IEVuYWJsZU5vVHJhcHBpbmdGUE1hdGg7CisgIE9wdGlvbnMuRlBEZW5vcm1hbE1vZGUgPSBEZW5vcm1hbE1vZGU7CisgIE9wdGlvbnMuSG9ub3JTaWduRGVwZW5kZW50Um91bmRpbmdGUE1hdGhPcHRpb24gPQorICAgICAgRW5hYmxlSG9ub3JTaWduRGVwZW5kZW50Um91bmRpbmdGUE1hdGg7CisgIGlmIChGbG9hdEFCSUZvckNhbGxzICE9IEZsb2F0QUJJOjpEZWZhdWx0KQorICAgIE9wdGlvbnMuRmxvYXRBQklUeXBlID0gRmxvYXRBQklGb3JDYWxsczsKKyAgT3B0aW9ucy5Ob1plcm9zSW5CU1MgPSBEb250UGxhY2VaZXJvc0luQlNTOworICBPcHRpb25zLkd1YXJhbnRlZWRUYWlsQ2FsbE9wdCA9IEVuYWJsZUd1YXJhbnRlZWRUYWlsQ2FsbE9wdDsKKyAgT3B0aW9ucy5TdGFja0FsaWdubWVudE92ZXJyaWRlID0gT3ZlcnJpZGVTdGFja0FsaWdubWVudDsKKyAgT3B0aW9ucy5TdGFja1N5bWJvbE9yZGVyaW5nID0gU3RhY2tTeW1ib2xPcmRlcmluZzsKKyAgT3B0aW9ucy5Vc2VJbml0QXJyYXkgPSAhVXNlQ3RvcnM7CisgIE9wdGlvbnMuUmVsYXhFTEZSZWxvY2F0aW9ucyA9IFJlbGF4RUxGUmVsb2NhdGlvbnM7CisgIE9wdGlvbnMuRGF0YVNlY3Rpb25zID0gRGF0YVNlY3Rpb25zOworICBPcHRpb25zLkZ1bmN0aW9uU2VjdGlvbnMgPSBGdW5jdGlvblNlY3Rpb25zOworICBPcHRpb25zLlVuaXF1ZVNlY3Rpb25OYW1lcyA9IFVuaXF1ZVNlY3Rpb25OYW1lczsKKyAgT3B0aW9ucy5FbXVsYXRlZFRMUyA9IEVtdWxhdGVkVExTOworICBPcHRpb25zLkV4cGxpY2l0RW11bGF0ZWRUTFMgPSBFbXVsYXRlZFRMUy5nZXROdW1PY2N1cnJlbmNlcygpID4gMDsKKyAgT3B0aW9ucy5FeGNlcHRpb25Nb2RlbCA9IEV4Y2VwdGlvbk1vZGVsOworICBPcHRpb25zLkVtaXRTdGFja1NpemVTZWN0aW9uID0gRW5hYmxlU3RhY2tTaXplU2VjdGlvbjsKKworICBPcHRpb25zLk1DT3B0aW9ucyA9IEluaXRNQ1RhcmdldE9wdGlvbnNGcm9tRmxhZ3MoKTsKKworICBPcHRpb25zLlRocmVhZE1vZGVsID0gVE1Nb2RlbDsKKyAgT3B0aW9ucy5FQUJJVmVyc2lvbiA9IEVBQklWZXJzaW9uOworICBPcHRpb25zLkRlYnVnZ2VyVHVuaW5nID0gRGVidWdnZXJUdW5pbmdPcHQ7CisKKyAgcmV0dXJuIE9wdGlvbnM7Cit9CisKK0xMVk1fQVRUUklCVVRFX1VOVVNFRCBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0Q1BVU3RyKCkgeworICAvLyBJZiB1c2VyIGFza2VkIGZvciB0aGUgJ25hdGl2ZScgQ1BVLCBhdXRvZGV0ZWN0IGhlcmUuIElmIGF1dG9kZWN0aW9uIGZhaWxzLAorICAvLyB0aGlzIHdpbGwgc2V0IHRoZSBDUFUgdG8gYW4gZW1wdHkgc3RyaW5nIHdoaWNoIHRlbGxzIHRoZSB0YXJnZXQgdG8KKyAgLy8gcGljayBhIGJhc2ljIGRlZmF1bHQuCisgIGlmIChNQ1BVID09ICJuYXRpdmUiKQorICAgIHJldHVybiBzeXM6OmdldEhvc3RDUFVOYW1lKCk7CisKKyAgcmV0dXJuIE1DUFU7Cit9CisKK0xMVk1fQVRUUklCVVRFX1VOVVNFRCBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RmVhdHVyZXNTdHIoKSB7CisgIFN1YnRhcmdldEZlYXR1cmVzIEZlYXR1cmVzOworCisgIC8vIElmIHVzZXIgYXNrZWQgZm9yIHRoZSAnbmF0aXZlJyBDUFUsIHdlIG5lZWQgdG8gYXV0b2RldGVjdCBmZWF0dXJlcy4KKyAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIHg4NiB3aGVyZSB0aGUgQ1BVIG1pZ2h0IG5vdCBzdXBwb3J0IGFsbCB0aGUKKyAgLy8gZmVhdHVyZXMgdGhlIGF1dG9kZXRlY3RlZCBDUFUgbmFtZSBsaXN0cyBpbiB0aGUgdGFyZ2V0LiBGb3IgZXhhbXBsZSwKKyAgLy8gbm90IGFsbCBTYW5keWJyaWRnZSBwcm9jZXNzb3JzIHN1cHBvcnQgQVZYLgorICBpZiAoTUNQVSA9PSAibmF0aXZlIikgeworICAgIFN0cmluZ01hcDxib29sPiBIb3N0RmVhdHVyZXM7CisgICAgaWYgKHN5czo6Z2V0SG9zdENQVUZlYXR1cmVzKEhvc3RGZWF0dXJlcykpCisgICAgICBmb3IgKGF1dG8gJkYgOiBIb3N0RmVhdHVyZXMpCisgICAgICAgIEZlYXR1cmVzLkFkZEZlYXR1cmUoRi5maXJzdCgpLCBGLnNlY29uZCk7CisgIH0KKworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE1BdHRycy5zaXplKCk7ICsraSkKKyAgICBGZWF0dXJlcy5BZGRGZWF0dXJlKE1BdHRyc1tpXSk7CisKKyAgcmV0dXJuIEZlYXR1cmVzLmdldFN0cmluZygpOworfQorCitMTFZNX0FUVFJJQlVURV9VTlVTRUQgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBnZXRGZWF0dXJlTGlzdCgpIHsKKyAgU3VidGFyZ2V0RmVhdHVyZXMgRmVhdHVyZXM7CisKKyAgLy8gSWYgdXNlciBhc2tlZCBmb3IgdGhlICduYXRpdmUnIENQVSwgd2UgbmVlZCB0byBhdXRvZGV0ZWN0IGZlYXR1cmVzLgorICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgeDg2IHdoZXJlIHRoZSBDUFUgbWlnaHQgbm90IHN1cHBvcnQgYWxsIHRoZQorICAvLyBmZWF0dXJlcyB0aGUgYXV0b2RldGVjdGVkIENQVSBuYW1lIGxpc3RzIGluIHRoZSB0YXJnZXQuIEZvciBleGFtcGxlLAorICAvLyBub3QgYWxsIFNhbmR5YnJpZGdlIHByb2Nlc3NvcnMgc3VwcG9ydCBBVlguCisgIGlmIChNQ1BVID09ICJuYXRpdmUiKSB7CisgICAgU3RyaW5nTWFwPGJvb2w+IEhvc3RGZWF0dXJlczsKKyAgICBpZiAoc3lzOjpnZXRIb3N0Q1BVRmVhdHVyZXMoSG9zdEZlYXR1cmVzKSkKKyAgICAgIGZvciAoYXV0byAmRiA6IEhvc3RGZWF0dXJlcykKKyAgICAgICAgRmVhdHVyZXMuQWRkRmVhdHVyZShGLmZpcnN0KCksIEYuc2Vjb25kKTsKKyAgfQorCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTUF0dHJzLnNpemUoKTsgKytpKQorICAgIEZlYXR1cmVzLkFkZEZlYXR1cmUoTUF0dHJzW2ldKTsKKworICByZXR1cm4gRmVhdHVyZXMuZ2V0RmVhdHVyZXMoKTsKK30KKworLy8vIFxicmllZiBTZXQgZnVuY3Rpb24gYXR0cmlidXRlcyBvZiBmdW5jdGlvbnMgaW4gTW9kdWxlIE0gYmFzZWQgb24gQ1BVLAorLy8vIEZlYXR1cmVzLCBhbmQgY29tbWFuZCBsaW5lIGZsYWdzLgorTExWTV9BVFRSSUJVVEVfVU5VU0VEIHN0YXRpYyB2b2lkCitzZXRGdW5jdGlvbkF0dHJpYnV0ZXMoU3RyaW5nUmVmIENQVSwgU3RyaW5nUmVmIEZlYXR1cmVzLCBNb2R1bGUgJk0pIHsKKyAgZm9yIChhdXRvICZGIDogTSkgeworICAgIGF1dG8gJkN0eCA9IEYuZ2V0Q29udGV4dCgpOworICAgIEF0dHJpYnV0ZUxpc3QgQXR0cnMgPSBGLmdldEF0dHJpYnV0ZXMoKTsKKyAgICBBdHRyQnVpbGRlciBOZXdBdHRyczsKKworICAgIGlmICghQ1BVLmVtcHR5KCkpCisgICAgICBOZXdBdHRycy5hZGRBdHRyaWJ1dGUoInRhcmdldC1jcHUiLCBDUFUpOworICAgIGlmICghRmVhdHVyZXMuZW1wdHkoKSkKKyAgICAgIE5ld0F0dHJzLmFkZEF0dHJpYnV0ZSgidGFyZ2V0LWZlYXR1cmVzIiwgRmVhdHVyZXMpOworICAgIGlmIChEaXNhYmxlRlBFbGltLmdldE51bU9jY3VycmVuY2VzKCkgPiAwKQorICAgICAgTmV3QXR0cnMuYWRkQXR0cmlidXRlKCJuby1mcmFtZS1wb2ludGVyLWVsaW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVGUEVsaW0gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICBpZiAoRGlzYWJsZVRhaWxDYWxscy5nZXROdW1PY2N1cnJlbmNlcygpID4gMCkKKyAgICAgIE5ld0F0dHJzLmFkZEF0dHJpYnV0ZSgiZGlzYWJsZS10YWlsLWNhbGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1N0cmluZ1JlZihEaXNhYmxlVGFpbENhbGxzKSk7CisgICAgaWYgKFN0YWNrUmVhbGlnbikKKyAgICAgIE5ld0F0dHJzLmFkZEF0dHJpYnV0ZSgic3RhY2tyZWFsaWduIik7CisKKyAgICBpZiAoVHJhcEZ1bmNOYW1lLmdldE51bU9jY3VycmVuY2VzKCkgPiAwKQorICAgICAgZm9yIChhdXRvICZCIDogRikKKyAgICAgICAgZm9yIChhdXRvICZJIDogQikKKyAgICAgICAgICBpZiAoYXV0byAqQ2FsbCA9IGR5bl9jYXN0PENhbGxJbnN0PigmSSkpCisgICAgICAgICAgICBpZiAoY29uc3QgYXV0byAqRiA9IENhbGwtPmdldENhbGxlZEZ1bmN0aW9uKCkpCisgICAgICAgICAgICAgIGlmIChGLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6ZGVidWd0cmFwIHx8CisgICAgICAgICAgICAgICAgICBGLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6dHJhcCkKKyAgICAgICAgICAgICAgICBDYWxsLT5hZGRBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgIGxsdm06OkF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZTo6Z2V0KEN0eCwgInRyYXAtZnVuYy1uYW1lIiwgVHJhcEZ1bmNOYW1lKSk7CisKKyAgICAvLyBMZXQgTmV3QXR0cnMgb3ZlcnJpZGUgQXR0cnMuCisgICAgRi5zZXRBdHRyaWJ1dGVzKAorICAgICAgICBBdHRycy5hZGRBdHRyaWJ1dGVzKEN0eCwgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgTmV3QXR0cnMpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0Nvc3RUYWJsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0Nvc3RUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYzE2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQ29zdFRhYmxlLmgKQEAgLTAsMCArMSw2OSBAQAorLy89PT0tLSBDb3N0VGFibGUuaCAtIEluc3RydWN0aW9uIENvc3QgVGFibGUgaGFuZGxpbmcgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIENvc3QgdGFibGVzIGFuZCBzaW1wbGUgbG9va3VwIGZ1bmN0aW9ucworLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9DT1NUVEFCTEVfSF8KKyNkZWZpbmUgTExWTV9DT0RFR0VOX0NPU1RUQUJMRV9IXworCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWFjaGluZVZhbHVlVHlwZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBDb3N0IFRhYmxlIEVudHJ5CitzdHJ1Y3QgQ29zdFRibEVudHJ5IHsKKyAgaW50IElTRDsKKyAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgVHlwZTsKKyAgdW5zaWduZWQgQ29zdDsKK307CisKKy8vLyBGaW5kIGluIGNvc3QgdGFibGUsIFR5cGVUeSBtdXN0IGJlIGNvbXBhcmFibGUgdG8gQ29tcGFyZVR5IGJ5ID09CitpbmxpbmUgY29uc3QgQ29zdFRibEVudHJ5ICpDb3N0VGFibGVMb29rdXAoQXJyYXlSZWY8Q29zdFRibEVudHJ5PiBUYmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IElTRCwgTVZUIFR5KSB7CisgIGF1dG8gSSA9IGZpbmRfaWYoVGJsLCBbPV0oY29uc3QgQ29zdFRibEVudHJ5ICZFbnRyeSkgeworICAgIHJldHVybiBJU0QgPT0gRW50cnkuSVNEICYmIFR5ID09IEVudHJ5LlR5cGU7CisgIH0pOworICBpZiAoSSAhPSBUYmwuZW5kKCkpCisgICAgcmV0dXJuIEk7CisKKyAgLy8gQ291bGQgbm90IGZpbmQgYW4gZW50cnkuCisgIHJldHVybiBudWxscHRyOworfQorCisvLy8gVHlwZSBDb252ZXJzaW9uIENvc3QgVGFibGUKK3N0cnVjdCBUeXBlQ29udmVyc2lvbkNvc3RUYmxFbnRyeSB7CisgIGludCBJU0Q7CisgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIERzdDsKKyAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgU3JjOworICB1bnNpZ25lZCBDb3N0OworfTsKKworLy8vIEZpbmQgaW4gdHlwZSBjb252ZXJzaW9uIGNvc3QgdGFibGUsIFR5cGVUeSBtdXN0IGJlIGNvbXBhcmFibGUgdG8gQ29tcGFyZVR5CisvLy8gYnkgPT0KK2lubGluZSBjb25zdCBUeXBlQ29udmVyc2lvbkNvc3RUYmxFbnRyeSAqCitDb252ZXJ0Q29zdFRhYmxlTG9va3VwKEFycmF5UmVmPFR5cGVDb252ZXJzaW9uQ29zdFRibEVudHJ5PiBUYmwsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBJU0QsIE1WVCBEc3QsIE1WVCBTcmMpIHsKKyAgYXV0byBJID0gZmluZF9pZihUYmwsIFs9XShjb25zdCBUeXBlQ29udmVyc2lvbkNvc3RUYmxFbnRyeSAmRW50cnkpIHsKKyAgICByZXR1cm4gSVNEID09IEVudHJ5LklTRCAmJiBTcmMgPT0gRW50cnkuU3JjICYmIERzdCA9PSBFbnRyeS5Ec3Q7CisgIH0pOworICBpZiAoSSAhPSBUYmwuZW5kKCkpCisgICAgcmV0dXJuIEk7CisKKyAgLy8gQ291bGQgbm90IGZpbmQgYW4gZW50cnkuCisgIHJldHVybiBudWxscHRyOworfQorCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvKiBMTFZNX0NPREVHRU5fQ09TVFRBQkxFX0hfICovCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vREFHQ29tYmluZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0RBR0NvbWJpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjU5MTkwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0RBR0NvbWJpbmUuaApAQCAtMCwwICsxLDI1IEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9EQUdDb21iaW5lLmggIC0tLS0tLS0gU2VsZWN0aW9uREFHIE5vZGVzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fREFHQ09NQklORV9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9EQUdDT01CSU5FX0gKKworbmFtZXNwYWNlIGxsdm0geworCitlbnVtIENvbWJpbmVMZXZlbCB7CisgIEJlZm9yZUxlZ2FsaXplVHlwZXMsCisgIEFmdGVyTGVnYWxpemVUeXBlcywKKyAgQWZ0ZXJMZWdhbGl6ZVZlY3Rvck9wcywKKyAgQWZ0ZXJMZWdhbGl6ZURBRworfTsKKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vREZBUGFja2V0aXplci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0RGQVBhY2tldGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2FhYmUyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0RGQVBhY2tldGl6ZXIuaApAQCAtMCwwICsxLDIyMiBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9ERkFQYWNrZXRpemVyLmggLSBERkEgUGFja2V0aXplciBmb3IgVkxJVyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIGRldGVybWluaXN0aWMgZmluaXRlIGF1dG9tYXRvbiAoREZBKSBiYXNlZAorLy8gcGFja2V0aXppbmcgbWVjaGFuaXNtIGZvciBWTElXIGFyY2hpdGVjdHVyZXMuIEl0IHByb3ZpZGVzIEFQSXMgdG8KKy8vIGRldGVybWluZSB3aGV0aGVyIHRoZXJlIGV4aXN0cyBhIGxlZ2FsIG1hcHBpbmcgb2YgaW5zdHJ1Y3Rpb25zIHRvCisvLyBmdW5jdGlvbmFsIHVuaXQgYXNzaWdubWVudHMgaW4gYSBwYWNrZXQuIFRoZSBERkEgaXMgYXV0by1nZW5lcmF0ZWQgZnJvbQorLy8gdGhlIHRhcmdldCdzIFNjaGVkdWxlLnRkIGZpbGUuCisvLworLy8gQSBERkEgY29uc2lzdHMgb2YgMyBtYWpvciBlbGVtZW50czogc3RhdGVzLCBpbnB1dHMsIGFuZCB0cmFuc2l0aW9ucy4gRm9yCisvLyB0aGUgcGFja2V0aXppbmcgbWVjaGFuaXNtLCB0aGUgaW5wdXQgaXMgdGhlIHNldCBvZiBpbnN0cnVjdGlvbiBjbGFzc2VzIGZvcgorLy8gYSB0YXJnZXQuIFRoZSBzdGF0ZSBtb2RlbHMgYWxsIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiBmdW5jdGlvbmFsIHVuaXQKKy8vIGNvbnN1bXB0aW9uIGZvciBhIGdpdmVuIHNldCBvZiBpbnN0cnVjdGlvbnMgaW4gYSBwYWNrZXQuIEEgdHJhbnNpdGlvbgorLy8gbW9kZWxzIHRoZSBhZGRpdGlvbiBvZiBhbiBpbnN0cnVjdGlvbiB0byBhIHBhY2tldC4gSW4gdGhlIERGQSBjb25zdHJ1Y3RlZAorLy8gYnkgdGhpcyBjbGFzcywgaWYgYW4gaW5zdHJ1Y3Rpb24gY2FuIGJlIGFkZGVkIHRvIGEgcGFja2V0LCB0aGVuIGEgdmFsaWQKKy8vIHRyYW5zaXRpb24gZXhpc3RzIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGUuIEludmFsaWQgdHJhbnNpdGlvbnMKKy8vIGluZGljYXRlIHRoYXQgdGhlIGluc3RydWN0aW9uIGNhbm5vdCBiZSBhZGRlZCB0byB0aGUgY3VycmVudCBwYWNrZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fREZBUEFDS0VUSVpFUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9ERkFQQUNLRVRJWkVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHTXV0YXRpb24uaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRGVmYXVsdFZMSVdTY2hlZHVsZXI7CitjbGFzcyBJbnN0ckl0aW5lcmFyeURhdGE7CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBNYWNoaW5lTG9vcEluZm87CitjbGFzcyBNQ0luc3RyRGVzYzsKK2NsYXNzIFNVbml0OworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVmaW5pdGlvbnMgc2hhcmVkIGJldHdlZW4gREZBUGFja2V0aXplci5jcHAgYW5kIERGQVBhY2tldGl6ZXJFbWl0dGVyLmNwcAorCisvLyBERkFfTUFYX1JFU1RFUk1TICogREZBX01BWF9SRVNPVVJDRVMgbXVzdCBmaXQgd2l0aGluIHNpemVvZiBERkFJbnB1dC4KKy8vIFRoaXMgaXMgdmVyaWZpZWQgaW4gREZBUGFja2V0aXplci5jcHA6REZBUGFja2V0aXplcjo6REZBUGFja2V0aXplci4KKy8vCisvLyBlLmcuIHRlcm1zIHggcmVzb3VyY2UgYml0IGNvbWJpbmF0aW9ucyB0aGF0IGZpdCBpbiB1aW50MzJfdDoKKy8vICAgICAgNCB0ZXJtcyB4IDggIGJpdHMgPSAzMiBiaXRzCisvLyAgICAgIDMgdGVybXMgeCAxMCBiaXRzID0gMzAgYml0cworLy8gICAgICAyIHRlcm1zIHggMTYgYml0cyA9IDMyIGJpdHMKKy8vCisvLyBlLmcuIHRlcm1zIHggcmVzb3VyY2UgYml0IGNvbWJpbmF0aW9ucyB0aGF0IGZpdCBpbiB1aW50NjRfdDoKKy8vICAgICAgOCB0ZXJtcyB4IDggIGJpdHMgPSA2NCBiaXRzCisvLyAgICAgIDcgdGVybXMgeCA5ICBiaXRzID0gNjMgYml0cworLy8gICAgICA2IHRlcm1zIHggMTAgYml0cyA9IDYwIGJpdHMKKy8vICAgICAgNSB0ZXJtcyB4IDEyIGJpdHMgPSA2MCBiaXRzCisvLyAgICAgIDQgdGVybXMgeCAxNiBiaXRzID0gNjQgYml0cyA8LS0tIGN1cnJlbnQKKy8vICAgICAgMyB0ZXJtcyB4IDIxIGJpdHMgPSA2MyBiaXRzCisvLyAgICAgIDIgdGVybXMgeCAzMiBiaXRzID0gNjQgYml0cworLy8KKyNkZWZpbmUgREZBX01BWF9SRVNURVJNUyAgICAgICAgNCAgIC8vIFRoZSBtYXggIyBvZiBBTkQnZWQgcmVzb3VyY2UgdGVybXMuCisjZGVmaW5lIERGQV9NQVhfUkVTT1VSQ0VTICAgICAgIDE2ICAvLyBUaGUgbWF4ICMgb2YgcmVzb3VyY2UgYml0cyBpbiBvbmUgdGVybS4KKwordXNpbmcgREZBSW5wdXQgPSB1aW50NjRfdDsKK3VzaW5nIERGQVN0YXRlSW5wdXQgPSBpbnQ2NF90OworCisjZGVmaW5lIERGQV9UQkxUWVBFICAgICAgICAgICAgICJpbnQ2NF90IiAvLyBGb3IgZ2VuZXJhdGluZyBERkFTdGF0ZUlucHV0VGFibGUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBERkFQYWNrZXRpemVyIHsKK3ByaXZhdGU6CisgIHVzaW5nIFVuc2lnblBhaXIgPSBzdGQ6OnBhaXI8dW5zaWduZWQsIERGQUlucHV0PjsKKworICBjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgKkluc3RySXRpbnM7CisgIGludCBDdXJyZW50U3RhdGUgPSAwOworICBjb25zdCBERkFTdGF0ZUlucHV0ICgqREZBU3RhdGVJbnB1dFRhYmxlKVsyXTsKKyAgY29uc3QgdW5zaWduZWQgKkRGQVN0YXRlRW50cnlUYWJsZTsKKworICAvLyBDYWNoZWRUYWJsZSBpcyBhIG1hcCBmcm9tIDxGcm9tU3RhdGUsIElucHV0PiB0byBUb1N0YXRlLgorICBEZW5zZU1hcDxVbnNpZ25QYWlyLCB1bnNpZ25lZD4gQ2FjaGVkVGFibGU7CisKKyAgLy8gUmVhZCB0aGUgREZBIHRyYW5zaXRpb24gdGFibGUgYW5kIHVwZGF0ZSBDYWNoZWRUYWJsZS4KKyAgdm9pZCBSZWFkVGFibGUodW5zaWduZWQgc3RhdGUpOworCitwdWJsaWM6CisgIERGQVBhY2tldGl6ZXIoY29uc3QgSW5zdHJJdGluZXJhcnlEYXRhICpJLCBjb25zdCBERkFTdGF0ZUlucHV0ICgqU0lUKVsyXSwKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCAqU0VUKTsKKworICAvLyBSZXNldCB0aGUgY3VycmVudCBzdGF0ZSB0byBtYWtlIGFsbCByZXNvdXJjZXMgYXZhaWxhYmxlLgorICB2b2lkIGNsZWFyUmVzb3VyY2VzKCkgeworICAgIEN1cnJlbnRTdGF0ZSA9IDA7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIERGQUlucHV0IGZvciBhbiBpbnN0cnVjdGlvbiBjbGFzcy4KKyAgREZBSW5wdXQgZ2V0SW5zbklucHV0KHVuc2lnbmVkIEluc25DbGFzcyk7CisKKyAgLy8gUmV0dXJuIHRoZSBERkFJbnB1dCBmb3IgYW4gaW5zdHJ1Y3Rpb24gY2xhc3MgaW5wdXQgdmVjdG9yLgorICBzdGF0aWMgREZBSW5wdXQgZ2V0SW5zbklucHV0KGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmSW5zbkNsYXNzKTsKKworICAvLyBDaGVjayBpZiB0aGUgcmVzb3VyY2VzIG9jY3VwaWVkIGJ5IGEgTUNJbnN0ckRlc2MgYXJlIGF2YWlsYWJsZSBpbgorICAvLyB0aGUgY3VycmVudCBzdGF0ZS4KKyAgYm9vbCBjYW5SZXNlcnZlUmVzb3VyY2VzKGNvbnN0IE1DSW5zdHJEZXNjICpNSUQpOworCisgIC8vIFJlc2VydmUgdGhlIHJlc291cmNlcyBvY2N1cGllZCBieSBhIE1DSW5zdHJEZXNjIGFuZCBjaGFuZ2UgdGhlIGN1cnJlbnQKKyAgLy8gc3RhdGUgdG8gcmVmbGVjdCB0aGF0IGNoYW5nZS4KKyAgdm9pZCByZXNlcnZlUmVzb3VyY2VzKGNvbnN0IE1DSW5zdHJEZXNjICpNSUQpOworCisgIC8vIENoZWNrIGlmIHRoZSByZXNvdXJjZXMgb2NjdXBpZWQgYnkgYSBtYWNoaW5lIGluc3RydWN0aW9uIGFyZSBhdmFpbGFibGUKKyAgLy8gaW4gdGhlIGN1cnJlbnQgc3RhdGUuCisgIGJvb2wgY2FuUmVzZXJ2ZVJlc291cmNlcyhNYWNoaW5lSW5zdHIgJk1JKTsKKworICAvLyBSZXNlcnZlIHRoZSByZXNvdXJjZXMgb2NjdXBpZWQgYnkgYSBtYWNoaW5lIGluc3RydWN0aW9uIGFuZCBjaGFuZ2UgdGhlCisgIC8vIGN1cnJlbnQgc3RhdGUgdG8gcmVmbGVjdCB0aGF0IGNoYW5nZS4KKyAgdm9pZCByZXNlcnZlUmVzb3VyY2VzKE1hY2hpbmVJbnN0ciAmTUkpOworCisgIGNvbnN0IEluc3RySXRpbmVyYXJ5RGF0YSAqZ2V0SW5zdHJJdGlucygpIGNvbnN0IHsgcmV0dXJuIEluc3RySXRpbnM7IH0KK307CisKKy8vIFZMSVdQYWNrZXRpemVyTGlzdCBpbXBsZW1lbnRzIGEgc2ltcGxlIFZMSVcgcGFja2V0aXplciB1c2luZyBERkEuIFRoZQorLy8gcGFja2V0aXplciB3b3JrcyBvbiBtYWNoaW5lIGJhc2ljIGJsb2Nrcy4gRm9yIGVhY2ggaW5zdHJ1Y3Rpb24gSSBpbiBCQiwKKy8vIHRoZSBwYWNrZXRpemVyIGNvbnN1bHRzIHRoZSBERkEgdG8gc2VlIGlmIG1hY2hpbmUgcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUKKy8vIHRvIGV4ZWN1dGUgSS4gSWYgc28sIHRoZSBwYWNrZXRpemVyIGNoZWNrcyBpZiBJIGRlcGVuZHMgb24gYW55IGluc3RydWN0aW9uCisvLyBpbiB0aGUgY3VycmVudCBwYWNrZXQuIElmIG5vIGRlcGVuZGVuY3kgaXMgZm91bmQsIEkgaXMgYWRkZWQgdG8gY3VycmVudAorLy8gcGFja2V0IGFuZCB0aGUgbWFjaGluZSByZXNvdXJjZSBpcyBtYXJrZWQgYXMgdGFrZW4uIElmIGFueSBkZXBlbmRlbmN5IGlzCisvLyBmb3VuZCwgYSB0YXJnZXQgQVBJIGNhbGwgaXMgbWFkZSB0byBwcnVuZSB0aGUgZGVwZW5kZW5jZS4KK2NsYXNzIFZMSVdQYWNrZXRpemVyTGlzdCB7Citwcm90ZWN0ZWQ6CisgIE1hY2hpbmVGdW5jdGlvbiAmTUY7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJOworICBBbGlhc0FuYWx5c2lzICpBQTsKKworICAvLyBUaGUgVkxJVyBTY2hlZHVsZXIuCisgIERlZmF1bHRWTElXU2NoZWR1bGVyICpWTElXU2NoZWR1bGVyOworICAvLyBWZWN0b3Igb2YgaW5zdHJ1Y3Rpb25zIGFzc2lnbmVkIHRvIHRoZSBjdXJyZW50IHBhY2tldC4KKyAgc3RkOjp2ZWN0b3I8TWFjaGluZUluc3RyKj4gQ3VycmVudFBhY2tldE1JczsKKyAgLy8gREZBIHJlc291cmNlIHRyYWNrZXIuCisgIERGQVBhY2tldGl6ZXIgKlJlc291cmNlVHJhY2tlcjsKKyAgLy8gTWFwOiBNSSAtPiBTVS4KKyAgc3RkOjptYXA8TWFjaGluZUluc3RyKiwgU1VuaXQqPiBNSVRvU1VuaXQ7CisKK3B1YmxpYzoKKyAgLy8gVGhlIEFsaWFzQW5hbHlzaXMgcGFyYW1ldGVyIGNhbiBiZSBudWxscHRyLgorICBWTElXUGFja2V0aXplckxpc3QoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUxvb3BJbmZvICZNTEksCisgICAgICAgICAgICAgICAgICAgICBBbGlhc0FuYWx5c2lzICpBQSk7CisKKyAgdmlydHVhbCB+VkxJV1BhY2tldGl6ZXJMaXN0KCk7CisKKyAgLy8gSW1wbGVtZW50IHRoaXMgQVBJIGluIHRoZSBiYWNrZW5kIHRvIGJ1bmRsZSBpbnN0cnVjdGlvbnMuCisgIHZvaWQgUGFja2V0aXplTUlzKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCZWdpbkl0ciwKKyAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEVuZEl0cik7CisKKyAgLy8gUmV0dXJuIHRoZSBSZXNvdXJjZVRyYWNrZXIuCisgIERGQVBhY2tldGl6ZXIgKmdldFJlc291cmNlVHJhY2tlcigpIHtyZXR1cm4gUmVzb3VyY2VUcmFja2VyO30KKworICAvLyBhZGRUb1BhY2tldCAtIEFkZCBNSSB0byB0aGUgY3VycmVudCBwYWNrZXQuCisgIHZpcnR1YWwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIGFkZFRvUGFja2V0KE1hY2hpbmVJbnN0ciAmTUkpIHsKKyAgICBDdXJyZW50UGFja2V0TUlzLnB1c2hfYmFjaygmTUkpOworICAgIFJlc291cmNlVHJhY2tlci0+cmVzZXJ2ZVJlc291cmNlcyhNSSk7CisgICAgcmV0dXJuIE1JOworICB9CisKKyAgLy8gRW5kIHRoZSBjdXJyZW50IHBhY2tldCBhbmQgcmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBwYWNrZXRpemVyLgorICAvLyBPdmVycmlkaW5nIHRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSB0YXJnZXQtc3BlY2lmaWMgcGFja2V0aXplcgorICAvLyB0byBwZXJmb3JtIGN1c3RvbSBmaW5hbGl6YXRpb24uCisgIHZpcnR1YWwgdm9pZCBlbmRQYWNrZXQoTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUkpOworCisgIC8vIFBlcmZvcm0gaW5pdGlhbGl6YXRpb24gYmVmb3JlIHBhY2tldGl6aW5nIGFuIGluc3RydWN0aW9uLiBUaGlzCisgIC8vIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGJlIG92ZXJyaWRlZCBieSB0aGUgdGFyZ2V0IGRlcGVuZGVudCBwYWNrZXRpemVyLgorICB2aXJ0dWFsIHZvaWQgaW5pdFBhY2tldGl6ZXJTdGF0ZSgpIHt9CisKKyAgLy8gQ2hlY2sgaWYgdGhlIGdpdmVuIGluc3RydWN0aW9uIEkgc2hvdWxkIGJlIGlnbm9yZWQgYnkgdGhlIHBhY2tldGl6ZXIuCisgIHZpcnR1YWwgYm9vbCBpZ25vcmVQc2V1ZG9JbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gUmV0dXJuIHRydWUgaWYgaW5zdHJ1Y3Rpb24gTUkgY2FuIG5vdCBiZSBwYWNrZXRpemVkIHdpdGggYW55IG90aGVyCisgIC8vIGluc3RydWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IE1JIGl0c2VsZiBpcyBhIHBhY2tldC4KKyAgdmlydHVhbCBib29sIGlzU29sb0luc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIHsgcmV0dXJuIHRydWU7IH0KKworICAvLyBDaGVjayBpZiB0aGUgcGFja2V0aXplciBzaG91bGQgdHJ5IHRvIGFkZCB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gdG8KKyAgLy8gdGhlIGN1cnJlbnQgcGFja2V0LiBPbmUgcmVhc29ucyBmb3Igd2hpY2ggaXQgbWF5IG5vdCBiZSBkZXNpcmFibGUKKyAgLy8gdG8gaW5jbHVkZSBhbiBpbnN0cnVjdGlvbiBpbiB0aGUgY3VycmVudCBwYWNrZXQgY291bGQgYmUgdGhhdCBpdAorICAvLyB3b3VsZCBjYXVzZSBhIHN0YWxsLgorICAvLyBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgImZhbHNlIiwgdGhlIGN1cnJlbnQgcGFja2V0IHdpbGwgYmUgZW5kZWQsCisgIC8vIGFuZCB0aGUgaW5zdHJ1Y3Rpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgbmV4dCBwYWNrZXQuCisgIHZpcnR1YWwgYm9vbCBzaG91bGRBZGRUb1BhY2tldChjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8gQ2hlY2sgaWYgaXQgaXMgbGVnYWwgdG8gcGFja2V0aXplIFNVSSBhbmQgU1VKIHRvZ2V0aGVyLgorICB2aXJ0dWFsIGJvb2wgaXNMZWdhbFRvUGFja2V0aXplVG9nZXRoZXIoU1VuaXQgKlNVSSwgU1VuaXQgKlNVSikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIENoZWNrIGlmIGl0IGlzIGxlZ2FsIHRvIHBydW5lIGRlcGVuZGVjZSBiZXR3ZWVuIFNVSSBhbmQgU1VKLgorICB2aXJ0dWFsIGJvb2wgaXNMZWdhbFRvUHJ1bmVEZXBlbmRlbmNpZXMoU1VuaXQgKlNVSSwgU1VuaXQgKlNVSikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEFkZCBhIERBRyBtdXRhdGlvbiB0byBiZSBkb25lIGJlZm9yZSB0aGUgcGFja2V0aXphdGlvbiBiZWdpbnMuCisgIHZvaWQgYWRkTXV0YXRpb24oc3RkOjp1bmlxdWVfcHRyPFNjaGVkdWxlREFHTXV0YXRpb24+IE11dGF0aW9uKTsKKworICBib29sIGFsaWFzKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkxLCBjb25zdCBNYWNoaW5lSW5zdHIgJk1JMiwKKyAgICAgICAgICAgICBib29sIFVzZVRCQUEgPSB0cnVlKSBjb25zdDsKKworcHJpdmF0ZToKKyAgYm9vbCBhbGlhcyhjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAmT3AxLCBjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAmT3AyLAorICAgICAgICAgICAgIGJvb2wgVXNlVEJBQSA9IHRydWUpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9ERkFQQUNLRVRJWkVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9ESUUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9ESUUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODA5ZmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0RJRS5oCkBAIC0wLDAgKzEsOTEwIEBACisvLz09PS0gbGliL0NvZGVHZW4vRElFLmggLSBEV0FSRiBJbmZvIEVudHJpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIERhdGEgc3RydWN0dXJlcyBmb3IgRFdBUkYgaW5mbyBlbnRyaWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9MSUJfQ09ERUdFTl9BU01QUklOVEVSX0RJRV9ICisjZGVmaW5lIExMVk1fTElCX0NPREVHRU5fQVNNUFJJTlRFUl9ESUVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlclVuaW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vRHdhcmZTdHJpbmdQb29sRW50cnkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxpZ25PZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQXNtUHJpbnRlcjsKK2NsYXNzIERJRTsKK2NsYXNzIERJRVVuaXQ7CitjbGFzcyBNQ0V4cHI7CitjbGFzcyBNQ1NlY3Rpb247CitjbGFzcyBNQ1N5bWJvbDsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBEd2FyZiBhYmJyZXZpYXRpb24gZGF0YSwgZGVzY3JpYmVzIG9uZSBhdHRyaWJ1dGUgb2YgYSBEd2FyZiBhYmJyZXZpYXRpb24uCitjbGFzcyBESUVBYmJyZXZEYXRhIHsKKyAgLy8vIER3YXJmIGF0dHJpYnV0ZSBjb2RlLgorICBkd2FyZjo6QXR0cmlidXRlIEF0dHJpYnV0ZTsKKworICAvLy8gRHdhcmYgZm9ybSBjb2RlLgorICBkd2FyZjo6Rm9ybSBGb3JtOworCisgIC8vLyBEd2FyZiBhdHRyaWJ1dGUgdmFsdWUgZm9yIERXX0ZPUk1faW1wbGljaXRfY29uc3QKKyAgaW50NjRfdCBWYWx1ZSA9IDA7CisKK3B1YmxpYzoKKyAgRElFQWJicmV2RGF0YShkd2FyZjo6QXR0cmlidXRlIEEsIGR3YXJmOjpGb3JtIEYpCisgICAgICA6IEF0dHJpYnV0ZShBKSwgRm9ybShGKSB7fQorICBESUVBYmJyZXZEYXRhKGR3YXJmOjpBdHRyaWJ1dGUgQSwgaW50NjRfdCBWKQorICAgICAgOiBBdHRyaWJ1dGUoQSksIEZvcm0oZHdhcmY6OkRXX0ZPUk1faW1wbGljaXRfY29uc3QpLCBWYWx1ZShWKSB7fQorCisgIC8vLyBBY2Nlc3NvcnMuCisgIC8vLyBAeworICBkd2FyZjo6QXR0cmlidXRlIGdldEF0dHJpYnV0ZSgpIGNvbnN0IHsgcmV0dXJuIEF0dHJpYnV0ZTsgfQorICBkd2FyZjo6Rm9ybSBnZXRGb3JtKCkgY29uc3QgeyByZXR1cm4gRm9ybTsgfQorICBpbnQ2NF90IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKyAgLy8vIEB9CisKKyAgLy8vIFVzZWQgdG8gZ2F0aGVyIHVuaXF1ZSBkYXRhIGZvciB0aGUgYWJicmV2aWF0aW9uIGZvbGRpbmcgc2V0LgorICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRHdhcmYgYWJicmV2aWF0aW9uLCBkZXNjcmliZXMgdGhlIG9yZ2FuaXphdGlvbiBvZiBhIGRlYnVnIGluZm9ybWF0aW9uCisvLy8gb2JqZWN0LgorY2xhc3MgRElFQWJicmV2IDogcHVibGljIEZvbGRpbmdTZXROb2RlIHsKKyAgLy8vIFVuaXF1ZSBudW1iZXIgZm9yIG5vZGUuCisgIHVuc2lnbmVkIE51bWJlcjsKKworICAvLy8gRHdhcmYgdGFnIGNvZGUuCisgIGR3YXJmOjpUYWcgVGFnOworCisgIC8vLyBXaGV0aGVyIG9yIG5vdCB0aGlzIG5vZGUgaGFzIGNoaWxkcmVuLgorICAvLy8KKyAgLy8vIFRoaXMgY2hlYXRzIGEgYml0IGluIGFsbCBvZiB0aGUgdXNlcyBzaW5jZSB0aGUgdmFsdWVzIGluIHRoZSBzdGFuZGFyZAorICAvLy8gYXJlIDAgYW5kIDEgZm9yIG5vIGNoaWxkcmVuIGFuZCBjaGlsZHJlbiByZXNwZWN0aXZlbHkuCisgIGJvb2wgQ2hpbGRyZW47CisKKyAgLy8vIFJhdyBkYXRhIGJ5dGVzIGZvciBhYmJyZXZpYXRpb24uCisgIFNtYWxsVmVjdG9yPERJRUFiYnJldkRhdGEsIDEyPiBEYXRhOworCitwdWJsaWM6CisgIERJRUFiYnJldihkd2FyZjo6VGFnIFQsIGJvb2wgQykgOiBUYWcoVCksIENoaWxkcmVuKEMpIHt9CisKKyAgLy8vIEFjY2Vzc29ycy4KKyAgLy8vIEB7CisgIGR3YXJmOjpUYWcgZ2V0VGFnKCkgY29uc3QgeyByZXR1cm4gVGFnOyB9CisgIHVuc2lnbmVkIGdldE51bWJlcigpIGNvbnN0IHsgcmV0dXJuIE51bWJlcjsgfQorICBib29sIGhhc0NoaWxkcmVuKCkgY29uc3QgeyByZXR1cm4gQ2hpbGRyZW47IH0KKyAgY29uc3QgU21hbGxWZWN0b3JJbXBsPERJRUFiYnJldkRhdGE+ICZnZXREYXRhKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorICB2b2lkIHNldENoaWxkcmVuRmxhZyhib29sIGhhc0NoaWxkKSB7IENoaWxkcmVuID0gaGFzQ2hpbGQ7IH0KKyAgdm9pZCBzZXROdW1iZXIodW5zaWduZWQgTikgeyBOdW1iZXIgPSBOOyB9CisgIC8vLyBAfQorCisgIC8vLyBBZGRzIGFub3RoZXIgc2V0IG9mIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiB0byB0aGUgYWJicmV2aWF0aW9uLgorICB2b2lkIEFkZEF0dHJpYnV0ZShkd2FyZjo6QXR0cmlidXRlIEF0dHJpYnV0ZSwgZHdhcmY6OkZvcm0gRm9ybSkgeworICAgIERhdGEucHVzaF9iYWNrKERJRUFiYnJldkRhdGEoQXR0cmlidXRlLCBGb3JtKSk7CisgIH0KKworICAvLy8gQWRkcyBhdHRyaWJ1dGUgd2l0aCBEV19GT1JNX2ltcGxpY2l0X2NvbnN0IHZhbHVlCisgIHZvaWQgQWRkSW1wbGljaXRDb25zdEF0dHJpYnV0ZShkd2FyZjo6QXR0cmlidXRlIEF0dHJpYnV0ZSwgaW50NjRfdCBWYWx1ZSkgeworICAgIERhdGEucHVzaF9iYWNrKERJRUFiYnJldkRhdGEoQXR0cmlidXRlLCBWYWx1ZSkpOworICB9CisKKyAgLy8vIFVzZWQgdG8gZ2F0aGVyIHVuaXF1ZSBkYXRhIGZvciB0aGUgYWJicmV2aWF0aW9uIGZvbGRpbmcgc2V0LgorICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworCisgIC8vLyBQcmludCB0aGUgYWJicmV2aWF0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgYXNtIHByaW50ZXIuCisgIHZvaWQgRW1pdChjb25zdCBBc21QcmludGVyICpBUCkgY29uc3Q7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gSGVscHMgdW5pcXVlIERJRUFiYnJldiBvYmplY3RzIGFuZCBhc3NpZ25zIGFiYnJldmlhdGlvbiBudW1iZXJzLgorLy8vCisvLy8gVGhpcyBjbGFzcyB3aWxsIHVuaXF1ZSB0aGUgRElFIGFiYnJldmlhdGlvbnMgZm9yIGEgbGx2bTo6RElFIG9iamVjdCBhbmQKKy8vLyBhc3NpZ24gYSB1bmlxdWUgYWJicmV2aWF0aW9uIG51bWJlciB0byBlYWNoIHVuaXF1ZSBESUVBYmJyZXYgb2JqZWN0IGl0CisvLy8gZmluZHMuIFRoZSByZXN1bHRpbmcgY29sbGVjdGlvbiBvZiBESUVBYmJyZXYgb2JqZWN0cyBjYW4gdGhlbiBiZSBlbWl0dGVkCisvLy8gaW50byB0aGUgLmRlYnVnX2FiYnJldiBzZWN0aW9uLgorY2xhc3MgRElFQWJicmV2U2V0IHsKKyAgLy8vIFRoZSBidW1wIGFsbG9jYXRvciB0byB1c2Ugd2hlbiBjcmVhdGluZyBESUVBYmJyZXYgb2JqZWN0cyBpbiB0aGUgdW5pcXVlZAorICAvLy8gc3RvcmFnZSBjb250YWluZXIuCisgIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jOworICAvLy8gXGJyaWVmIEZvbGRpbmdTZXQgdGhhdCB1bmlxdWVzIHRoZSBhYmJyZXZpYXRpb25zLgorICBGb2xkaW5nU2V0PERJRUFiYnJldj4gQWJicmV2aWF0aW9uc1NldDsKKyAgLy8vIEEgbGlzdCBvZiBhbGwgdGhlIHVuaXF1ZSBhYmJyZXZpYXRpb25zIGluIHVzZS4KKyAgc3RkOjp2ZWN0b3I8RElFQWJicmV2ICo+IEFiYnJldmlhdGlvbnM7CisKK3B1YmxpYzoKKyAgRElFQWJicmV2U2V0KEJ1bXBQdHJBbGxvY2F0b3IgJkEpIDogQWxsb2MoQSkge30KKyAgfkRJRUFiYnJldlNldCgpOworCisgIC8vLyBHZW5lcmF0ZSB0aGUgYWJicmV2aWF0aW9uIGRlY2xhcmF0aW9uIGZvciBhIERJRSBhbmQgcmV0dXJuIGEgcG9pbnRlciB0bworICAvLy8gdGhlIGdlbmVyYXRlZCBhYmJyZXZpYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIERpZSB0aGUgZGVidWcgaW5mbyBlbnRyeSB0byBnZW5lcmF0ZSB0aGUgYWJicmV2aWF0aW9uIGZvci4KKyAgLy8vIFxyZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSB1bmlxdWVkIGFiYnJldmlhdGlvbiBkZWNsYXJhdGlvbiB0aGF0IGlzCisgIC8vLyBvd25lZCBieSB0aGlzIGNsYXNzLgorICBESUVBYmJyZXYgJnVuaXF1ZUFiYnJldmlhdGlvbihESUUgJkRpZSk7CisKKyAgLy8vIFByaW50IGFsbCBhYmJyZXZpYXRpb25zIHVzaW5nIHRoZSBzcGVjaWZpZWQgYXNtIHByaW50ZXIuCisgIHZvaWQgRW1pdChjb25zdCBBc21QcmludGVyICpBUCwgTUNTZWN0aW9uICpTZWN0aW9uKSBjb25zdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEFuIGludGVnZXIgdmFsdWUgRElFLgorLy8vCitjbGFzcyBESUVJbnRlZ2VyIHsKKyAgdWludDY0X3QgSW50ZWdlcjsKKworcHVibGljOgorICBleHBsaWNpdCBESUVJbnRlZ2VyKHVpbnQ2NF90IEkpIDogSW50ZWdlcihJKSB7fQorCisgIC8vLyBDaG9vc2UgdGhlIGJlc3QgZm9ybSBmb3IgaW50ZWdlci4KKyAgc3RhdGljIGR3YXJmOjpGb3JtIEJlc3RGb3JtKGJvb2wgSXNTaWduZWQsIHVpbnQ2NF90IEludCkgeworICAgIGlmIChJc1NpZ25lZCkgeworICAgICAgY29uc3QgaW50NjRfdCBTaWduZWRJbnQgPSBJbnQ7CisgICAgICBpZiAoKGNoYXIpSW50ID09IFNpZ25lZEludCkKKyAgICAgICAgcmV0dXJuIGR3YXJmOjpEV19GT1JNX2RhdGExOworICAgICAgaWYgKChzaG9ydClJbnQgPT0gU2lnbmVkSW50KQorICAgICAgICByZXR1cm4gZHdhcmY6OkRXX0ZPUk1fZGF0YTI7CisgICAgICBpZiAoKGludClJbnQgPT0gU2lnbmVkSW50KQorICAgICAgICByZXR1cm4gZHdhcmY6OkRXX0ZPUk1fZGF0YTQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICgodW5zaWduZWQgY2hhcilJbnQgPT0gSW50KQorICAgICAgICByZXR1cm4gZHdhcmY6OkRXX0ZPUk1fZGF0YTE7CisgICAgICBpZiAoKHVuc2lnbmVkIHNob3J0KUludCA9PSBJbnQpCisgICAgICAgIHJldHVybiBkd2FyZjo6RFdfRk9STV9kYXRhMjsKKyAgICAgIGlmICgodW5zaWduZWQgaW50KUludCA9PSBJbnQpCisgICAgICAgIHJldHVybiBkd2FyZjo6RFdfRk9STV9kYXRhNDsKKyAgICB9CisgICAgcmV0dXJuIGR3YXJmOjpEV19GT1JNX2RhdGE4OworICB9CisKKyAgdWludDY0X3QgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBJbnRlZ2VyOyB9CisgIHZvaWQgc2V0VmFsdWUodWludDY0X3QgVmFsKSB7IEludGVnZXIgPSBWYWw7IH0KKworICB2b2lkIEVtaXRWYWx1ZShjb25zdCBBc21QcmludGVyICpBUCwgZHdhcmY6OkZvcm0gRm9ybSkgY29uc3Q7CisgIHVuc2lnbmVkIFNpemVPZihjb25zdCBBc21QcmludGVyICpBUCwgZHdhcmY6OkZvcm0gRm9ybSkgY29uc3Q7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTykgY29uc3Q7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBBbiBleHByZXNzaW9uIERJRS4KK2NsYXNzIERJRUV4cHIgeworICBjb25zdCBNQ0V4cHIgKkV4cHI7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgRElFRXhwcihjb25zdCBNQ0V4cHIgKkUpIDogRXhwcihFKSB7fQorCisgIC8vLyBHZXQgTUNFeHByLgorICBjb25zdCBNQ0V4cHIgKmdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gRXhwcjsgfQorCisgIHZvaWQgRW1pdFZhbHVlKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKyAgdW5zaWduZWQgU2l6ZU9mKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEEgbGFiZWwgRElFLgorY2xhc3MgRElFTGFiZWwgeworICBjb25zdCBNQ1N5bWJvbCAqTGFiZWw7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgRElFTGFiZWwoY29uc3QgTUNTeW1ib2wgKkwpIDogTGFiZWwoTCkge30KKworICAvLy8gR2V0IE1DU3ltYm9sLgorICBjb25zdCBNQ1N5bWJvbCAqZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBMYWJlbDsgfQorCisgIHZvaWQgRW1pdFZhbHVlKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKyAgdW5zaWduZWQgU2l6ZU9mKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEEgc2ltcGxlIGxhYmVsIGRpZmZlcmVuY2UgRElFLgorLy8vCitjbGFzcyBESUVEZWx0YSB7CisgIGNvbnN0IE1DU3ltYm9sICpMYWJlbEhpOworICBjb25zdCBNQ1N5bWJvbCAqTGFiZWxMbzsKKworcHVibGljOgorICBESUVEZWx0YShjb25zdCBNQ1N5bWJvbCAqSGksIGNvbnN0IE1DU3ltYm9sICpMbykgOiBMYWJlbEhpKEhpKSwgTGFiZWxMbyhMbykge30KKworICB2b2lkIEVtaXRWYWx1ZShjb25zdCBBc21QcmludGVyICpBUCwgZHdhcmY6OkZvcm0gRm9ybSkgY29uc3Q7CisgIHVuc2lnbmVkIFNpemVPZihjb25zdCBBc21QcmludGVyICpBUCwgZHdhcmY6OkZvcm0gRm9ybSkgY29uc3Q7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTykgY29uc3Q7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBBIGNvbnRhaW5lciBmb3Igc3RyaW5nIHBvb2wgc3RyaW5nIHZhbHVlcy4KKy8vLworLy8vIFRoaXMgY2xhc3MgaXMgdXNlZCB3aXRoIHRoZSBEV19GT1JNX3N0cnAgYW5kIERXX0ZPUk1fR05VX3N0cl9pbmRleCBmb3Jtcy4KK2NsYXNzIERJRVN0cmluZyB7CisgIER3YXJmU3RyaW5nUG9vbEVudHJ5UmVmIFM7CisKK3B1YmxpYzoKKyAgRElFU3RyaW5nKER3YXJmU3RyaW5nUG9vbEVudHJ5UmVmIFMpIDogUyhTKSB7fQorCisgIC8vLyBHcmFiIHRoZSBzdHJpbmcgb3V0IG9mIHRoZSBvYmplY3QuCisgIFN0cmluZ1JlZiBnZXRTdHJpbmcoKSBjb25zdCB7IHJldHVybiBTLmdldFN0cmluZygpOyB9CisKKyAgdm9pZCBFbWl0VmFsdWUoY29uc3QgQXNtUHJpbnRlciAqQVAsIGR3YXJmOjpGb3JtIEZvcm0pIGNvbnN0OworICB1bnNpZ25lZCBTaXplT2YoY29uc3QgQXNtUHJpbnRlciAqQVAsIGR3YXJmOjpGb3JtIEZvcm0pIGNvbnN0OworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8pIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQSBjb250YWluZXIgZm9yIGlubGluZSBzdHJpbmcgdmFsdWVzLgorLy8vCisvLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHdpdGggdGhlIERXX0ZPUk1fc3RyaW5nIGZvcm0uCitjbGFzcyBESUVJbmxpbmVTdHJpbmcgeworICBTdHJpbmdSZWYgUzsKKworcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQWxsb2NhdG9yPgorICBleHBsaWNpdCBESUVJbmxpbmVTdHJpbmcoU3RyaW5nUmVmIFN0ciwgQWxsb2NhdG9yICZBKSA6IFMoU3RyLmNvcHkoQSkpIHt9CisKKyAgfkRJRUlubGluZVN0cmluZygpID0gZGVmYXVsdDsKKworICAvLy8gR3JhYiB0aGUgc3RyaW5nIG91dCBvZiB0aGUgb2JqZWN0LgorICBTdHJpbmdSZWYgZ2V0U3RyaW5nKCkgY29uc3QgeyByZXR1cm4gUzsgfQorCisgIHZvaWQgRW1pdFZhbHVlKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKyAgdW5zaWduZWQgU2l6ZU9mKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEEgcG9pbnRlciB0byBhbm90aGVyIGRlYnVnIGluZm9ybWF0aW9uIGVudHJ5LiAgQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBjYW4KKy8vLyBhbHNvIGJlIHVzZWQgYXMgYSBwcm94eSBmb3IgYSBkZWJ1ZyBpbmZvcm1hdGlvbiBlbnRyeSBub3QgeWV0IGRlZmluZWQKKy8vLyAoaWUuIHR5cGVzLikKK2NsYXNzIERJRUVudHJ5IHsKKyAgRElFICpFbnRyeTsKKworcHVibGljOgorICBESUVFbnRyeSgpID0gZGVsZXRlOworICBleHBsaWNpdCBESUVFbnRyeShESUUgJkUpIDogRW50cnkoJkUpIHt9CisKKyAgRElFICZnZXRFbnRyeSgpIGNvbnN0IHsgcmV0dXJuICpFbnRyeTsgfQorCisgIHZvaWQgRW1pdFZhbHVlKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKyAgdW5zaWduZWQgU2l6ZU9mKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFJlcHJlc2VudHMgYSBwb2ludGVyIHRvIGEgbG9jYXRpb24gbGlzdCBpbiB0aGUgZGVidWdfbG9jCisvLy8gc2VjdGlvbi4KK2NsYXNzIERJRUxvY0xpc3QgeworICAvLy8gSW5kZXggaW50byB0aGUgLmRlYnVnX2xvYyB2ZWN0b3IuCisgIHNpemVfdCBJbmRleDsKKworcHVibGljOgorICBESUVMb2NMaXN0KHNpemVfdCBJKSA6IEluZGV4KEkpIHt9CisKKyAgLy8vIEdyYWIgdGhlIGN1cnJlbnQgaW5kZXggb3V0LgorICBzaXplX3QgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBJbmRleDsgfQorCisgIHZvaWQgRW1pdFZhbHVlKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKyAgdW5zaWduZWQgU2l6ZU9mKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEEgZGVidWcgaW5mb3JtYXRpb24gZW50cnkgdmFsdWUuIFNvbWUgb2YgdGhlc2Ugcm91Z2hseSBjb3JyZWxhdGUKKy8vLyB0byBEV0FSRiBhdHRyaWJ1dGUgY2xhc3Nlcy4KK2NsYXNzIERJRUJsb2NrOworY2xhc3MgRElFTG9jOworY2xhc3MgRElFVmFsdWUgeworcHVibGljOgorICBlbnVtIFR5cGUgeworICAgIGlzTm9uZSwKKyNkZWZpbmUgSEFORExFX0RJRVZBTFVFKFQpIGlzIyNULAorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9ESUVWYWx1ZS5kZWYiCisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBUeXBlIG9mIGRhdGEgc3RvcmVkIGluIHRoZSB2YWx1ZS4KKyAgVHlwZSBUeSA9IGlzTm9uZTsKKyAgZHdhcmY6OkF0dHJpYnV0ZSBBdHRyaWJ1dGUgPSAoZHdhcmY6OkF0dHJpYnV0ZSkwOworICBkd2FyZjo6Rm9ybSBGb3JtID0gKGR3YXJmOjpGb3JtKTA7CisKKyAgLy8vIFN0b3JhZ2UgZm9yIHRoZSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBBbGwgdmFsdWVzIHRoYXQgYXJlbid0IHN0YW5kYXJkIGxheW91dCAob3IgYXJlIGxhcmdlciB0aGFuIDggYnl0ZXMpCisgIC8vLyBzaG91bGQgYmUgc3RvcmVkIGJ5IHJlZmVyZW5jZSBpbnN0ZWFkIG9mIGJ5IHZhbHVlLgorICB1c2luZyBWYWxUeSA9IEFsaWduZWRDaGFyQXJyYXlVbmlvbjxESUVJbnRlZ2VyLCBESUVTdHJpbmcsIERJRUV4cHIsIERJRUxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUVEZWx0YSAqLCBESUVFbnRyeSwgRElFQmxvY2sgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElFTG9jICosIERJRUxvY0xpc3Q+OworCisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFZhbFR5KSA8PSBzaXplb2YodWludDY0X3QpIHx8CisgICAgICAgICAgICAgICAgICAgIHNpemVvZihWYWxUeSkgPD0gc2l6ZW9mKHZvaWQgKiksCisgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGFsbCBsYXJnZSB0eXBlcyB0byBiZSBzdG9yZWQgdmlhIHBvaW50ZXIiKTsKKworICAvLy8gVW5kZXJseWluZyBzdG9yZWQgdmFsdWUuCisgIFZhbFR5IFZhbDsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBjb25zdHJ1Y3QoVCBWKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxUPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIHN0YW5kYXJkIGxheW91dCBvciBwb2ludGVyIik7CisgICAgbmV3IChyZWludGVycHJldF9jYXN0PHZvaWQgKj4oVmFsLmJ1ZmZlcikpIFQoVik7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gVCAqZ2V0KCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUICo+KFZhbC5idWZmZXIpOyB9CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBjb25zdCBUICpnZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCAqPihWYWwuYnVmZmVyKTsKKyAgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBkZXN0cnVjdCgpIHsgZ2V0PFQ+KCktPn5UKCk7IH0KKworICAvLy8gRGVzdHJveSB0aGUgdW5kZXJseWluZyB2YWx1ZS4KKyAgLy8vCisgIC8vLyBUaGlzIHNob3VsZCBnZXQgb3B0aW1pemVkIGRvd24gdG8gYSBuby1vcC4gIFdlIGNvdWxkIHNraXAgaXQgaWYgd2UgY291bGQKKyAgLy8vIGFkZCBhIHN0YXRpYyBhc3NlcnQgb24gXGEgc3RkOjppc190cml2aWFsbHlfY29weWFibGUoKSwgYnV0IHdlIGN1cnJlbnRseQorICAvLy8gc3VwcG9ydCB2ZXJzaW9ucyBvZiBHQ0MgdGhhdCBkb24ndCB1bmRlcnN0YW5kIHRoYXQuCisgIHZvaWQgZGVzdHJveVZhbCgpIHsKKyAgICBzd2l0Y2ggKFR5KSB7CisgICAgY2FzZSBpc05vbmU6CisgICAgICByZXR1cm47CisjZGVmaW5lIEhBTkRMRV9ESUVWQUxVRV9TTUFMTChUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIGlzIyNUOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZXN0cnVjdDxESUUjI1Q+KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuOworI2RlZmluZSBIQU5ETEVfRElFVkFMVUVfTEFSR0UoVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBpcyMjVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVzdHJ1Y3Q8Y29uc3QgRElFIyNUICo+KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybjsKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vRElFVmFsdWUuZGVmIgorICAgIH0KKyAgfQorCisgIC8vLyBDb3B5IHRoZSB1bmRlcmx5aW5nIHZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgc2hvdWxkIGdldCBvcHRpbWl6ZWQgZG93biB0byBhIHNpbXBsZSBjb3B5LiAgV2UgbmVlZCB0byBhY3R1YWxseQorICAvLy8gY29uc3RydWN0IHRoZSB2YWx1ZSwgcmF0aGVyIHRoYW4gY2FsbGluZyBtZW1jcHksIHRvIHNhdGlzZnkgc3RyaWN0CisgIC8vLyBhbGlhc2luZyBydWxlcy4KKyAgdm9pZCBjb3B5VmFsKGNvbnN0IERJRVZhbHVlICZYKSB7CisgICAgc3dpdGNoIChUeSkgeworICAgIGNhc2UgaXNOb25lOgorICAgICAgcmV0dXJuOworI2RlZmluZSBIQU5ETEVfRElFVkFMVUVfU01BTEwoVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBpcyMjVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3RydWN0PERJRSMjVD4oKlguZ2V0PERJRSMjVD4oKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybjsKKyNkZWZpbmUgSEFORExFX0RJRVZBTFVFX0xBUkdFKFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgaXMjI1Q6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0cnVjdDxjb25zdCBESUUjI1QgKj4oKlguZ2V0PGNvbnN0IERJRSMjVCAqPigpKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm47CisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0RJRVZhbHVlLmRlZiIKKyAgICB9CisgIH0KKworcHVibGljOgorICBESUVWYWx1ZSgpID0gZGVmYXVsdDsKKworICBESUVWYWx1ZShjb25zdCBESUVWYWx1ZSAmWCkgOiBUeShYLlR5KSwgQXR0cmlidXRlKFguQXR0cmlidXRlKSwgRm9ybShYLkZvcm0pIHsKKyAgICBjb3B5VmFsKFgpOworICB9CisKKyAgRElFVmFsdWUgJm9wZXJhdG9yPShjb25zdCBESUVWYWx1ZSAmWCkgeworICAgIGRlc3Ryb3lWYWwoKTsKKyAgICBUeSA9IFguVHk7CisgICAgQXR0cmlidXRlID0gWC5BdHRyaWJ1dGU7CisgICAgRm9ybSA9IFguRm9ybTsKKyAgICBjb3B5VmFsKFgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIH5ESUVWYWx1ZSgpIHsgZGVzdHJveVZhbCgpOyB9CisKKyNkZWZpbmUgSEFORExFX0RJRVZBTFVFX1NNQUxMKFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERJRVZhbHVlKGR3YXJmOjpBdHRyaWJ1dGUgQXR0cmlidXRlLCBkd2FyZjo6Rm9ybSBGb3JtLCBjb25zdCBESUUjI1QgJlYpICAgICAgXAorICAgICAgOiBUeShpcyMjVCksIEF0dHJpYnV0ZShBdHRyaWJ1dGUpLCBGb3JtKEZvcm0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdHJ1Y3Q8RElFIyNUPihWKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgSEFORExFX0RJRVZBTFVFX0xBUkdFKFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERJRVZhbHVlKGR3YXJmOjpBdHRyaWJ1dGUgQXR0cmlidXRlLCBkd2FyZjo6Rm9ybSBGb3JtLCBjb25zdCBESUUjI1QgKlYpICAgICAgXAorICAgICAgOiBUeShpcyMjVCksIEF0dHJpYnV0ZShBdHRyaWJ1dGUpLCBGb3JtKEZvcm0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc3NlcnQoViAmJiAiRXhwZWN0ZWQgdmFsaWQgdmFsdWUiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3RydWN0PGNvbnN0IERJRSMjVCAqPihWKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0RJRVZhbHVlLmRlZiIKKworICAvLy8gQWNjZXNzb3JzLgorICAvLy8gQHsKKyAgVHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVHk7IH0KKyAgZHdhcmY6OkF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoKSBjb25zdCB7IHJldHVybiBBdHRyaWJ1dGU7IH0KKyAgZHdhcmY6OkZvcm0gZ2V0Rm9ybSgpIGNvbnN0IHsgcmV0dXJuIEZvcm07IH0KKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIFR5OyB9CisgIC8vLyBAfQorCisjZGVmaW5lIEhBTkRMRV9ESUVWQUxVRV9TTUFMTChUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBESUUjI1QgJmdldERJRSMjVCgpIGNvbnN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc3NlcnQoZ2V0VHlwZSgpID09IGlzIyNUICYmICJFeHBlY3RlZCAiICNUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICpnZXQ8RElFIyNUPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIEhBTkRMRV9ESUVWQUxVRV9MQVJHRShUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBESUUjI1QgJmdldERJRSMjVCgpIGNvbnN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc3NlcnQoZ2V0VHlwZSgpID09IGlzIyNUICYmICJFeHBlY3RlZCAiICNUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICoqZ2V0PGNvbnN0IERJRSMjVCAqPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0RJRVZhbHVlLmRlZiIKKworICAvLy8gRW1pdCB2YWx1ZSB2aWEgdGhlIER3YXJmIHdyaXRlci4KKyAgdm9pZCBFbWl0VmFsdWUoY29uc3QgQXNtUHJpbnRlciAqQVApIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHNpemUgb2YgYSB2YWx1ZSBpbiBieXRlcy4KKyAgdW5zaWduZWQgU2l6ZU9mKGNvbnN0IEFzbVByaW50ZXIgKkFQKSBjb25zdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCitzdHJ1Y3QgSW50cnVzaXZlQmFja0xpc3ROb2RlIHsKKyAgUG9pbnRlckludFBhaXI8SW50cnVzaXZlQmFja0xpc3ROb2RlICosIDE+IE5leHQ7CisKKyAgSW50cnVzaXZlQmFja0xpc3ROb2RlKCkgOiBOZXh0KHRoaXMsIHRydWUpIHt9CisKKyAgSW50cnVzaXZlQmFja0xpc3ROb2RlICpnZXROZXh0KCkgY29uc3QgeworICAgIHJldHVybiBOZXh0LmdldEludCgpID8gbnVsbHB0ciA6IE5leHQuZ2V0UG9pbnRlcigpOworICB9Cit9OworCitzdHJ1Y3QgSW50cnVzaXZlQmFja0xpc3RCYXNlIHsKKyAgdXNpbmcgTm9kZSA9IEludHJ1c2l2ZUJhY2tMaXN0Tm9kZTsKKworICBOb2RlICpMYXN0ID0gbnVsbHB0cjsKKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gIUxhc3Q7IH0KKworICB2b2lkIHB1c2hfYmFjayhOb2RlICZOKSB7CisgICAgYXNzZXJ0KE4uTmV4dC5nZXRQb2ludGVyKCkgPT0gJk4gJiYgIkV4cGVjdGVkIHVubGlua2VkIG5vZGUiKTsKKyAgICBhc3NlcnQoTi5OZXh0LmdldEludCgpID09IHRydWUgJiYgIkV4cGVjdGVkIHVubGlua2VkIG5vZGUiKTsKKworICAgIGlmIChMYXN0KSB7CisgICAgICBOLk5leHQgPSBMYXN0LT5OZXh0OworICAgICAgTGFzdC0+TmV4dC5zZXRQb2ludGVyQW5kSW50KCZOLCBmYWxzZSk7CisgICAgfQorICAgIExhc3QgPSAmTjsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIEludHJ1c2l2ZUJhY2tMaXN0IDogSW50cnVzaXZlQmFja0xpc3RCYXNlIHsKK3B1YmxpYzoKKyAgdXNpbmcgSW50cnVzaXZlQmFja0xpc3RCYXNlOjplbXB0eTsKKworICB2b2lkIHB1c2hfYmFjayhUICZOKSB7IEludHJ1c2l2ZUJhY2tMaXN0QmFzZTo6cHVzaF9iYWNrKE4pOyB9CisgIFQgJmJhY2soKSB7IHJldHVybiAqc3RhdGljX2Nhc3Q8VCAqPihMYXN0KTsgfQorICBjb25zdCBUICZiYWNrKCkgY29uc3QgeyByZXR1cm4gKnN0YXRpY19jYXN0PFQgKj4oTGFzdCk7IH0KKworICBjbGFzcyBjb25zdF9pdGVyYXRvcjsKKyAgY2xhc3MgaXRlcmF0b3IKKyAgICAgIDogcHVibGljIGl0ZXJhdG9yX2ZhY2FkZV9iYXNlPGl0ZXJhdG9yLCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBUPiB7CisgICAgZnJpZW5kIGNsYXNzIGNvbnN0X2l0ZXJhdG9yOworCisgICAgTm9kZSAqTiA9IG51bGxwdHI7CisKKyAgcHVibGljOgorICAgIGl0ZXJhdG9yKCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IGl0ZXJhdG9yKFQgKk4pIDogTihOKSB7fQorCisgICAgaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgICBOID0gTi0+Z2V0TmV4dCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBOOyB9CisgICAgVCAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnN0YXRpY19jYXN0PFQgKj4oTik7IH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciAmWCkgY29uc3QgeyByZXR1cm4gTiA9PSBYLk47IH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3IgJlgpIGNvbnN0IHsgcmV0dXJuIE4gIT0gWC5OOyB9CisgIH07CisKKyAgY2xhc3MgY29uc3RfaXRlcmF0b3IKKyAgICAgIDogcHVibGljIGl0ZXJhdG9yX2ZhY2FkZV9iYXNlPGNvbnN0X2l0ZXJhdG9yLCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVD4geworICAgIGNvbnN0IE5vZGUgKk4gPSBudWxscHRyOworCisgIHB1YmxpYzoKKyAgICBjb25zdF9pdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgICAvLyBQbGFjYXRlIE1TVkMgYnkgZXhwbGljaXRseSBzY29waW5nICdpdGVyYXRvcicuCisgICAgY29uc3RfaXRlcmF0b3IodHlwZW5hbWUgSW50cnVzaXZlQmFja0xpc3Q8VD46Oml0ZXJhdG9yIFgpIDogTihYLk4pIHt9CisgICAgZXhwbGljaXQgY29uc3RfaXRlcmF0b3IoY29uc3QgVCAqTikgOiBOKE4pIHt9CisKKyAgICBjb25zdF9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICAgIE4gPSBOLT5nZXROZXh0KCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIE47IH0KKyAgICBjb25zdCBUICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgVCAqPihOKTsgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNvbnN0X2l0ZXJhdG9yICZYKSBjb25zdCB7IHJldHVybiBOID09IFguTjsgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBjb25zdF9pdGVyYXRvciAmWCkgY29uc3QgeyByZXR1cm4gTiAhPSBYLk47IH0KKyAgfTsKKworICBpdGVyYXRvciBiZWdpbigpIHsKKyAgICByZXR1cm4gTGFzdCA/IGl0ZXJhdG9yKHN0YXRpY19jYXN0PFQgKj4oTGFzdC0+TmV4dC5nZXRQb2ludGVyKCkpKSA6IGVuZCgpOworICB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PEludHJ1c2l2ZUJhY2tMaXN0ICo+KHRoaXMpLT5iZWdpbigpOworICB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGl0ZXJhdG9yKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoKTsgfQorCisgIHN0YXRpYyBpdGVyYXRvciB0b0l0ZXJhdG9yKFQgJk4pIHsgcmV0dXJuIGl0ZXJhdG9yKCZOKTsgfQorICBzdGF0aWMgY29uc3RfaXRlcmF0b3IgdG9JdGVyYXRvcihjb25zdCBUICZOKSB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmTik7IH0KK307CisKKy8vLyBBIGxpc3Qgb2YgRElFIHZhbHVlcy4KKy8vLworLy8vIFRoaXMgaXMgYSBzaW5nbHktbGlua2VkIGxpc3QsIGJ1dCBpbnN0ZWFkIG9mIHJldmVyc2luZyB0aGUgb3JkZXIgb2YKKy8vLyBpbnNlcnRpb24sIHdlIGtlZXAgYSBwb2ludGVyIHRvIHRoZSBiYWNrIG9mIHRoZSBsaXN0IHNvIHdlIGNhbiBwdXNoIGluCisvLy8gb3JkZXIuCisvLy8KKy8vLyBUaGVyZSBhcmUgdHdvIG1haW4gcmVhc29ucyB0byBjaG9vc2UgYSBsaW5rZWQgbGlzdCBvdmVyIGEgY3VzdG9taXplZAorLy8vIHZlY3Rvci1saWtlIGRhdGEgc3RydWN0dXJlLgorLy8vCisvLy8gIDEuIEZvciB0ZWFyZG93biBlZmZpY2llbmN5LCB3ZSB3YW50IERJRXMgdG8gYmUgQnVtcFB0ckFsbG9jYXRlZC4gIFVzaW5nIGEKKy8vLyAgICAgbGlua2VkIGxpc3QgaGVyZSBtYWtlcyB0aGlzIHdheSBlYXNpZXIgdG8gYWNjb21wbGlzaC4KKy8vLyAgMi4gQ2FycnlpbmcgYW4gZXh0cmEgcG9pbnRlciBwZXIgXGEgRElFVmFsdWUgaXNuJ3QgZXhwZW5zaXZlLiAgNDUlIG9mIERJRXMKKy8vLyAgICAgaGF2ZSAyIG9yIGZld2VyIHZhbHVlcywgYW5kIDkwJSBoYXZlIDUgb3IgZmV3ZXIuICBBIHZlY3RvciB3b3VsZCBiZQorLy8vICAgICBvdmVyLWFsbG9jYXRlZCBieSA1MCUgb24gYXZlcmFnZSBhbnl3YXksIHRoZSBzYW1lIGNvc3QgYXMgdGhlCisvLy8gICAgIGxpbmtlZC1saXN0IG5vZGUuCitjbGFzcyBESUVWYWx1ZUxpc3QgeworICBzdHJ1Y3QgTm9kZSA6IEludHJ1c2l2ZUJhY2tMaXN0Tm9kZSB7CisgICAgRElFVmFsdWUgVjsKKworICAgIGV4cGxpY2l0IE5vZGUoRElFVmFsdWUgVikgOiBWKFYpIHt9CisgIH07CisKKyAgdXNpbmcgTGlzdFR5ID0gSW50cnVzaXZlQmFja0xpc3Q8Tm9kZT47CisKKyAgTGlzdFR5IExpc3Q7CisKK3B1YmxpYzoKKyAgY2xhc3MgY29uc3RfdmFsdWVfaXRlcmF0b3I7CisgIGNsYXNzIHZhbHVlX2l0ZXJhdG9yCisgICAgICA6IHB1YmxpYyBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8dmFsdWVfaXRlcmF0b3IsIExpc3RUeTo6aXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgRElFVmFsdWU+IHsKKyAgICBmcmllbmQgY2xhc3MgY29uc3RfdmFsdWVfaXRlcmF0b3I7CisKKyAgICB1c2luZyBpdGVyYXRvcl9hZGFwdG9yID0KKyAgICAgICAgaXRlcmF0b3JfYWRhcHRvcl9iYXNlPHZhbHVlX2l0ZXJhdG9yLCBMaXN0VHk6Oml0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgRElFVmFsdWU+OworCisgIHB1YmxpYzoKKyAgICB2YWx1ZV9pdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCB2YWx1ZV9pdGVyYXRvcihMaXN0VHk6Oml0ZXJhdG9yIFgpIDogaXRlcmF0b3JfYWRhcHRvcihYKSB7fQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGJvb2wod3JhcHBlZCgpKTsgfQorICAgIERJRVZhbHVlICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiB3cmFwcGVkKCktPlY7IH0KKyAgfTsKKworICBjbGFzcyBjb25zdF92YWx1ZV9pdGVyYXRvciA6IHB1YmxpYyBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3ZhbHVlX2l0ZXJhdG9yLCBMaXN0VHk6OmNvbnN0X2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBjb25zdCBESUVWYWx1ZT4geworICAgIHVzaW5nIGl0ZXJhdG9yX2FkYXB0b3IgPQorICAgICAgICBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8Y29uc3RfdmFsdWVfaXRlcmF0b3IsIExpc3RUeTo6Y29uc3RfaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBjb25zdCBESUVWYWx1ZT47CisKKyAgcHVibGljOgorICAgIGNvbnN0X3ZhbHVlX2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworICAgIGNvbnN0X3ZhbHVlX2l0ZXJhdG9yKERJRVZhbHVlTGlzdDo6dmFsdWVfaXRlcmF0b3IgWCkKKyAgICAgICAgOiBpdGVyYXRvcl9hZGFwdG9yKFgud3JhcHBlZCgpKSB7fQorICAgIGV4cGxpY2l0IGNvbnN0X3ZhbHVlX2l0ZXJhdG9yKExpc3RUeTo6Y29uc3RfaXRlcmF0b3IgWCkKKyAgICAgICAgOiBpdGVyYXRvcl9hZGFwdG9yKFgpIHt9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gYm9vbCh3cmFwcGVkKCkpOyB9CisgICAgY29uc3QgRElFVmFsdWUgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIHdyYXBwZWQoKS0+VjsgfQorICB9OworCisgIHVzaW5nIHZhbHVlX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8dmFsdWVfaXRlcmF0b3I+OworICB1c2luZyBjb25zdF92YWx1ZV9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPGNvbnN0X3ZhbHVlX2l0ZXJhdG9yPjsKKworICB2YWx1ZV9pdGVyYXRvciBhZGRWYWx1ZShCdW1wUHRyQWxsb2NhdG9yICZBbGxvYywgY29uc3QgRElFVmFsdWUgJlYpIHsKKyAgICBMaXN0LnB1c2hfYmFjaygqbmV3IChBbGxvYykgTm9kZShWKSk7CisgICAgcmV0dXJuIHZhbHVlX2l0ZXJhdG9yKExpc3RUeTo6dG9JdGVyYXRvcihMaXN0LmJhY2soKSkpOworICB9CisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICB2YWx1ZV9pdGVyYXRvciBhZGRWYWx1ZShCdW1wUHRyQWxsb2NhdG9yICZBbGxvYywgZHdhcmY6OkF0dHJpYnV0ZSBBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgIGR3YXJmOjpGb3JtIEZvcm0sIFQgJiZWYWx1ZSkgeworICAgIHJldHVybiBhZGRWYWx1ZShBbGxvYywgRElFVmFsdWUoQXR0cmlidXRlLCBGb3JtLCBzdGQ6OmZvcndhcmQ8VD4oVmFsdWUpKSk7CisgIH0KKworICB2YWx1ZV9yYW5nZSB2YWx1ZXMoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UodmFsdWVfaXRlcmF0b3IoTGlzdC5iZWdpbigpKSwgdmFsdWVfaXRlcmF0b3IoTGlzdC5lbmQoKSkpOworICB9CisgIGNvbnN0X3ZhbHVlX3JhbmdlIHZhbHVlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShjb25zdF92YWx1ZV9pdGVyYXRvcihMaXN0LmJlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3ZhbHVlX2l0ZXJhdG9yKExpc3QuZW5kKCkpKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQSBzdHJ1Y3R1cmVkIGRlYnVnIGluZm9ybWF0aW9uIGVudHJ5LiAgSGFzIGFuIGFiYnJldmlhdGlvbiB3aGljaAorLy8vIGRlc2NyaWJlcyBpdHMgb3JnYW5pemF0aW9uLgorY2xhc3MgRElFIDogSW50cnVzaXZlQmFja0xpc3ROb2RlLCBwdWJsaWMgRElFVmFsdWVMaXN0IHsKKyAgZnJpZW5kIGNsYXNzIEludHJ1c2l2ZUJhY2tMaXN0PERJRT47CisgIGZyaWVuZCBjbGFzcyBESUVVbml0OworCisgIC8vLyBEd2FyZiB1bml0IHJlbGF0aXZlIG9mZnNldC4KKyAgdW5zaWduZWQgT2Zmc2V0ID0gMDsKKyAgLy8vIFNpemUgb2YgaW5zdGFuY2UgKyBjaGlsZHJlbi4KKyAgdW5zaWduZWQgU2l6ZSA9IDA7CisgIHVuc2lnbmVkIEFiYnJldk51bWJlciA9IH4wdTsKKyAgLy8vIER3YXJmIHRhZyBjb2RlLgorICBkd2FyZjo6VGFnIFRhZyA9IChkd2FyZjo6VGFnKTA7CisgIC8vLyBTZXQgdG8gdHJ1ZSB0byBmb3JjZSBhIERJRSB0byBlbWl0IGFuIGFiYnJldmlhdGlvbiB0aGF0IHNheXMgaXQgaGFzCisgIC8vLyBjaGlsZHJlbiBldmVuIHdoZW4gaXQgZG9lc24ndC4gVGhpcyBpcyB1c2VkIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMuCisgIGJvb2wgRm9yY2VDaGlsZHJlbiA9IGZhbHNlOworICAvLy8gQ2hpbGRyZW4gRElFcy4KKyAgSW50cnVzaXZlQmFja0xpc3Q8RElFPiBDaGlsZHJlbjsKKworICAvLy8gVGhlIG93bmVyIGlzIGVpdGhlciB0aGUgcGFyZW50IERJRSBmb3IgY2hpbGRyZW4gb2Ygb3RoZXIgRElFcywgb3IgYQorICAvLy8gRElFVW5pdCB3aGljaCBjb250YWlucyB0aGlzIERJRSBhcyBpdHMgdW5pdCBESUUuCisgIFBvaW50ZXJVbmlvbjxESUUgKiwgRElFVW5pdCAqPiBPd25lcjsKKworICBleHBsaWNpdCBESUUoZHdhcmY6OlRhZyBUYWcpIDogVGFnKFRhZykge30KKworcHVibGljOgorICBESUUoKSA9IGRlbGV0ZTsKKyAgRElFKGNvbnN0IERJRSAmUkhTKSA9IGRlbGV0ZTsKKyAgRElFKERJRSAmJlJIUykgPSBkZWxldGU7CisgIERJRSAmb3BlcmF0b3I9KGNvbnN0IERJRSAmUkhTKSA9IGRlbGV0ZTsKKyAgRElFICZvcGVyYXRvcj0oY29uc3QgRElFICYmUkhTKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgRElFICpnZXQoQnVtcFB0ckFsbG9jYXRvciAmQWxsb2MsIGR3YXJmOjpUYWcgVGFnKSB7CisgICAgcmV0dXJuIG5ldyAoQWxsb2MpIERJRShUYWcpOworICB9CisKKyAgLy8gQWNjZXNzb3JzLgorICB1bnNpZ25lZCBnZXRBYmJyZXZOdW1iZXIoKSBjb25zdCB7IHJldHVybiBBYmJyZXZOdW1iZXI7IH0KKyAgZHdhcmY6OlRhZyBnZXRUYWcoKSBjb25zdCB7IHJldHVybiBUYWc7IH0KKyAgLy8vIEdldCB0aGUgY29tcGlsZS90eXBlIHVuaXQgcmVsYXRpdmUgb2Zmc2V0IG9mIHRoaXMgRElFLgorICB1bnNpZ25lZCBnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBPZmZzZXQ7IH0KKyAgdW5zaWduZWQgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKyAgYm9vbCBoYXNDaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIEZvcmNlQ2hpbGRyZW4gfHwgIUNoaWxkcmVuLmVtcHR5KCk7IH0KKyAgdm9pZCBzZXRGb3JjZUNoaWxkcmVuKGJvb2wgQikgeyBGb3JjZUNoaWxkcmVuID0gQjsgfQorCisgIHVzaW5nIGNoaWxkX2l0ZXJhdG9yID0gSW50cnVzaXZlQmFja0xpc3Q8RElFPjo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2NoaWxkX2l0ZXJhdG9yID0gSW50cnVzaXZlQmFja0xpc3Q8RElFPjo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIGNoaWxkX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8Y2hpbGRfaXRlcmF0b3I+OworICB1c2luZyBjb25zdF9jaGlsZF9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPGNvbnN0X2NoaWxkX2l0ZXJhdG9yPjsKKworICBjaGlsZF9yYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShDaGlsZHJlbi5iZWdpbigpLCBDaGlsZHJlbi5lbmQoKSk7CisgIH0KKyAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoQ2hpbGRyZW4uYmVnaW4oKSwgQ2hpbGRyZW4uZW5kKCkpOworICB9CisKKyAgRElFICpnZXRQYXJlbnQoKSBjb25zdDsKKworICAvLy8gR2VuZXJhdGUgdGhlIGFiYnJldmlhdGlvbiBmb3IgdGhpcyBESUUuCisgIC8vLworICAvLy8gQ2FsY3VsYXRlIHRoZSBhYmJyZXZpYXRpb24gZm9yIHRoaXMsIHdoaWNoIHNob3VsZCBiZSB1bmlxdWVkIGFuZAorICAvLy8gZXZlbnR1YWxseSB1c2VkIHRvIGNhbGwgXGEgc2V0QWJicmV2TnVtYmVyKCkuCisgIERJRUFiYnJldiBnZW5lcmF0ZUFiYnJldigpIGNvbnN0OworCisgIC8vLyBTZXQgdGhlIGFiYnJldmlhdGlvbiBudW1iZXIgZm9yIHRoaXMgRElFLgorICB2b2lkIHNldEFiYnJldk51bWJlcih1bnNpZ25lZCBJKSB7IEFiYnJldk51bWJlciA9IEk7IH0KKworICAvLy8gR2V0IHRoZSBhYnNvbHV0ZSBvZmZzZXQgd2l0aGluIHRoZSAuZGVidWdfaW5mbyBvciAuZGVidWdfdHlwZXMgc2VjdGlvbgorICAvLy8gZm9yIHRoaXMgRElFLgorICB1bnNpZ25lZCBnZXREZWJ1Z1NlY3Rpb25PZmZzZXQoKSBjb25zdDsKKworICAvLy8gQ29tcHV0ZSB0aGUgb2Zmc2V0IG9mIHRoaXMgRElFIGFuZCBhbGwgaXRzIGNoaWxkcmVuLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQganVzdCBiZWZvcmUgd2UgYXJlIGdvaW5nIHRvIGdlbmVyYXRlIHRoZSBkZWJ1ZworICAvLy8gaW5mb3JtYXRpb24gYW5kIGdpdmVzIGVhY2ggRElFIGEgY2hhbmNlIHRvIGZpZ3VyZSBvdXQgaXRzIENVIHJlbGF0aXZlIERJRQorICAvLy8gb2Zmc2V0LCB1bmlxdWUgaXRzIGFiYnJldmlhdGlvbiBhbmQgZmlsbCBpbiB0aGUgYWJicmV2aWF0aW9uIGNvZGUsIGFuZAorICAvLy8gcmV0dXJuIHRoZSB1bml0IG9mZnNldCB0aGF0IHBvaW50cyB0byB3aGVyZSB0aGUgbmV4dCBESUUgd2lsbCBiZSBlbWl0dGVkCisgIC8vLyB3aXRoaW4gdGhlIGRlYnVnIHVuaXQgc2VjdGlvbi4gQWZ0ZXIgdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWQgZm9yIGFsbAorICAvLy8gRElFIG9iamVjdHMsIHRoZSBEV0FSRiBjYW4gYmUgZ2VuZXJhdGVkIHNpbmNlIGFsbCBESUVzIHdpbGwgYmUgYWJsZSB0bworICAvLy8gcHJvcGVybHkgcmVmZXIgdG8gb3RoZXIgRElFIG9iamVjdHMgc2luY2UgYWxsIERJRXMgaGF2ZSBjYWxjdWxhdGVkIHRoZWlyCisgIC8vLyBvZmZzZXRzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBBUCBBc21QcmludGVyIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHNpemVzLgorICAvLy8gXHBhcmFtIEFiYnJldlNldCB0aGUgYWJicmV2aWF0aW9uIHVzZWQgdG8gdW5pcXVlIERJRSBhYmJyZXZpYXRpb25zLgorICAvLy8gXHBhcmFtIENVT2Zmc2V0IHRoZSBjb21waWxlL3R5cGUgdW5pdCByZWxhdGl2ZSBvZmZzZXQgaW4gYnl0ZXMuCisgIC8vLyBccmV0dXJucyB0aGUgb2Zmc2V0IGZvciB0aGUgRElFIHRoYXQgZm9sbG93cyB0aGlzIERJRSB3aXRoaW4gdGhlCisgIC8vLyBjdXJyZW50IGNvbXBpbGUvdHlwZSB1bml0LgorICB1bnNpZ25lZCBjb21wdXRlT2Zmc2V0c0FuZEFiYnJldnMoY29uc3QgQXNtUHJpbnRlciAqQVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUVBYmJyZXZTZXQgJkFiYnJldlNldCwgdW5zaWduZWQgQ1VPZmZzZXQpOworCisgIC8vLyBDbGltYiB1cCB0aGUgcGFyZW50IGNoYWluIHRvIGdldCB0aGUgY29tcGlsZSB1bml0IG9yIHR5cGUgdW5pdCBESUUgdGhhdAorICAvLy8gdGhpcyBESUUgYmVsb25ncyB0by4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgY29tcGlsZSBvciB0eXBlIHVuaXQgRElFIHRoYXQgb3ducyB0aGlzIERJRSwgb3IgTlVMTCBpZgorICAvLy8gdGhpcyBESUUgaGFzbid0IGJlZW4gYWRkZWQgdG8gYSB1bml0IERJRS4KKyAgY29uc3QgRElFICpnZXRVbml0RGllKCkgY29uc3Q7CisKKyAgLy8vIENsaW1iIHVwIHRoZSBwYXJlbnQgY2hhaW4gdG8gZ2V0IHRoZSBjb21waWxlIHVuaXQgb3IgdHlwZSB1bml0IHRoYXQgdGhpcworICAvLy8gRElFIGJlbG9uZ3MgdG8uCisgIC8vLworICAvLy8gXHJldHVybnMgdGhlIERJRVVuaXQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21waWxlIG9yIHR5cGUgdW5pdCB0aGF0IG93bnMKKyAgLy8vIHRoaXMgRElFLCBvciBOVUxMIGlmIHRoaXMgRElFIGhhc24ndCBiZWVuIGFkZGVkIHRvIGEgdW5pdCBESUUuCisgIGNvbnN0IERJRVVuaXQgKmdldFVuaXQoKSBjb25zdDsKKworICB2b2lkIHNldE9mZnNldCh1bnNpZ25lZCBPKSB7IE9mZnNldCA9IE87IH0KKyAgdm9pZCBzZXRTaXplKHVuc2lnbmVkIFMpIHsgU2l6ZSA9IFM7IH0KKworICAvLy8gQWRkIGEgY2hpbGQgdG8gdGhlIERJRS4KKyAgRElFICZhZGRDaGlsZChESUUgKkNoaWxkKSB7CisgICAgYXNzZXJ0KCFDaGlsZC0+Z2V0UGFyZW50KCkgJiYgIkNoaWxkIHNob3VsZCBiZSBvcnBoYW5lZCIpOworICAgIENoaWxkLT5Pd25lciA9IHRoaXM7CisgICAgQ2hpbGRyZW4ucHVzaF9iYWNrKCpDaGlsZCk7CisgICAgcmV0dXJuIENoaWxkcmVuLmJhY2soKTsKKyAgfQorCisgIC8vLyBGaW5kIGEgdmFsdWUgaW4gdGhlIERJRSB3aXRoIHRoZSBhdHRyaWJ1dGUgZ2l2ZW4uCisgIC8vLworICAvLy8gUmV0dXJucyBhIGRlZmF1bHQtY29uc3RydWN0ZWQgRElFVmFsdWUgKHdoZXJlIFxhIERJRVZhbHVlOjpnZXRUeXBlKCkKKyAgLy8vIGdpdmVzIFxhIERJRVZhbHVlOjppc05vbmUpIGlmIG5vIHN1Y2ggYXR0cmlidXRlIGV4aXN0cy4KKyAgRElFVmFsdWUgZmluZEF0dHJpYnV0ZShkd2FyZjo6QXR0cmlidXRlIEF0dHJpYnV0ZSkgY29uc3Q7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTywgdW5zaWduZWQgSW5kZW50Q291bnQgPSAwKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBSZXByZXNlbnRzIGEgY29tcGlsZSBvciB0eXBlIHVuaXQuCitjbGFzcyBESUVVbml0IHsKKyAgLy8vIFRoZSBjb21waWxlIHVuaXQgb3IgdHlwZSB1bml0IERJRS4gVGhpcyB2YXJpYWJsZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mCisgIC8vLyBESUUgc28gdGhhdCB3ZSBjYW4gY2FsY3VsYXRlIHRoZSBESUVVbml0IGZyb20gYW55IERJRSBieSB0cmF2ZXJzaW5nIHRoZQorICAvLy8gcGFyZW50IGJhY2tjaGFpbiBhbmQgZ2V0dGluZyB0aGUgVW5pdCBESUUsIGFuZCB0aGVuIGNhc3RpbmcgaXRzZWxmIHRvIGEKKyAgLy8vIERJRVVuaXQuIFRoaXMgYWxsb3dzIHVzIHRvIGJlIGFibGUgdG8gZmluZCB0aGUgRElFVW5pdCBmb3IgYW55IERJRSB3aXRob3V0CisgIC8vLyBoYXZpbmcgdG8gc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBESUVVbml0IGluIGVhY2ggRElFIGluc3RhbmNlLgorICBESUUgRGllOworICAvLy8gVGhlIHNlY3Rpb24gdGhpcyB1bml0IHdpbGwgYmUgZW1pdHRlZCBpbi4gVGhpcyBtYXkgb3IgbWF5IG5vdCBiZSBzZXQgdG8KKyAgLy8vIGEgdmFsaWQgc2VjdGlvbiBkZXBlbmRpbmcgb24gdGhlIGNsaWVudCB0aGF0IGlzIGVtaXR0aW5nIERXQVJGLgorICBNQ1NlY3Rpb24gKlNlY3Rpb247CisgIHVpbnQ2NF90IE9mZnNldDsgLy8vIC5kZWJ1Z19pbmZvIG9yIC5kZWJ1Z190eXBlcyBhYnNvbHV0ZSBzZWN0aW9uIG9mZnNldC4KKyAgdWludDMyX3QgTGVuZ3RoOyAvLy8gVGhlIGxlbmd0aCBpbiBieXRlcyBvZiBhbGwgb2YgdGhlIERJRXMgaW4gdGhpcyB1bml0LgorICBjb25zdCB1aW50MTZfdCBWZXJzaW9uOyAvLy8gVGhlIER3YXJmIHZlcnNpb24gbnVtYmVyIGZvciB0aGlzIHVuaXQuCisgIGNvbnN0IHVpbnQ4X3QgQWRkclNpemU7IC8vLyBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBhZGRyZXNzIGZvciB0aGlzIHVuaXQuCitwcm90ZWN0ZWQ6CisgIH5ESUVVbml0KCkgPSBkZWZhdWx0OworCitwdWJsaWM6CisgIERJRVVuaXQodWludDE2X3QgVmVyc2lvbiwgdWludDhfdCBBZGRyU2l6ZSwgZHdhcmY6OlRhZyBVbml0VGFnKTsKKyAgRElFVW5pdChjb25zdCBESUVVbml0ICZSSFMpID0gZGVsZXRlOworICBESUVVbml0KERJRVVuaXQgJiZSSFMpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBESUVVbml0ICZSSFMpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBESUVVbml0ICYmUkhTKSA9IGRlbGV0ZTsKKyAgLy8vIFNldCB0aGUgc2VjdGlvbiB0aGF0IHRoaXMgRElFVW5pdCB3aWxsIGJlIGVtaXR0ZWQgaW50by4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgc29tZSBjbGllbnRzIHRvIHNldCB0aGUgc2VjdGlvbi4gTm90IGFsbCBjbGllbnRzCisgIC8vLyB0aGF0IGVtaXQgRFdBUkYgdXNlIHRoaXMgc2VjdGlvbiB2YXJpYWJsZS4KKyAgdm9pZCBzZXRTZWN0aW9uKE1DU2VjdGlvbiAqU2VjdGlvbikgeworICAgIGFzc2VydCghdGhpcy0+U2VjdGlvbik7CisgICAgdGhpcy0+U2VjdGlvbiA9IFNlY3Rpb247CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IE1DU3ltYm9sICpnZXRDcm9zc1NlY3Rpb25SZWxhdGl2ZUJhc2VBZGRyZXNzKCkgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgc2VjdGlvbiB0aGF0IHRoaXMgRElFVW5pdCB3aWxsIGJlIGVtaXR0ZWQgaW50by4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBTZWN0aW9uIHBvaW50ZXIgd2hpY2ggY2FuIGJlIE5VTEwuCisgIE1DU2VjdGlvbiAqZ2V0U2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIFNlY3Rpb247IH0KKyAgdm9pZCBzZXREZWJ1Z1NlY3Rpb25PZmZzZXQodW5zaWduZWQgTykgeyBPZmZzZXQgPSBPOyB9CisgIHVuc2lnbmVkIGdldERlYnVnU2VjdGlvbk9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIE9mZnNldDsgfQorICB2b2lkIHNldExlbmd0aCh1aW50NjRfdCBMKSB7IExlbmd0aCA9IEw7IH0KKyAgdWludDY0X3QgZ2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gTGVuZ3RoOyB9CisgIHVpbnQxNl90IGdldER3YXJmVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIFZlcnNpb247IH0KKyAgdWludDE2X3QgZ2V0QWRkcmVzc1NpemUoKSBjb25zdCB7IHJldHVybiBBZGRyU2l6ZTsgfQorICBESUUgJmdldFVuaXREaWUoKSB7IHJldHVybiBEaWU7IH0KKyAgY29uc3QgRElFICZnZXRVbml0RGllKCkgY29uc3QgeyByZXR1cm4gRGllOyB9Cit9OworCitzdHJ1Y3QgQmFzaWNESUVVbml0IGZpbmFsIDogRElFVW5pdCB7CisgIEJhc2ljRElFVW5pdCh1aW50MTZfdCBWZXJzaW9uLCB1aW50OF90IEFkZHJTaXplLCBkd2FyZjo6VGFnIFVuaXRUYWcpCisgICAgICA6IERJRVVuaXQoVmVyc2lvbiwgQWRkclNpemUsIFVuaXRUYWcpIHt9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBESUVMb2MgLSBSZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gbG9jYXRpb24uCisvLworY2xhc3MgRElFTG9jIDogcHVibGljIERJRVZhbHVlTGlzdCB7CisgIG11dGFibGUgdW5zaWduZWQgU2l6ZSA9IDA7IC8vIFNpemUgaW4gYnl0ZXMgZXhjbHVkaW5nIHNpemUgaGVhZGVyLgorCitwdWJsaWM6CisgIERJRUxvYygpID0gZGVmYXVsdDsKKworICAvLy8gQ29tcHV0ZVNpemUgLSBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGxvY2F0aW9uIGV4cHJlc3Npb24uCisgIC8vLworICB1bnNpZ25lZCBDb21wdXRlU2l6ZShjb25zdCBBc21QcmludGVyICpBUCkgY29uc3Q7CisKKyAgLy8vIEJlc3RGb3JtIC0gQ2hvb3NlIHRoZSBiZXN0IGZvcm0gZm9yIGRhdGEuCisgIC8vLworICBkd2FyZjo6Rm9ybSBCZXN0Rm9ybSh1bnNpZ25lZCBEd2FyZlZlcnNpb24pIGNvbnN0IHsKKyAgICBpZiAoRHdhcmZWZXJzaW9uID4gMykKKyAgICAgIHJldHVybiBkd2FyZjo6RFdfRk9STV9leHBybG9jOworICAgIC8vIFByZS1EV0FSRjQgbG9jYXRpb24gZXhwcmVzc2lvbnMgd2VyZSBibG9ja3MgYW5kIG5vdCBleHBybG9jLgorICAgIGlmICgodW5zaWduZWQgY2hhcilTaXplID09IFNpemUpCisgICAgICByZXR1cm4gZHdhcmY6OkRXX0ZPUk1fYmxvY2sxOworICAgIGlmICgodW5zaWduZWQgc2hvcnQpU2l6ZSA9PSBTaXplKQorICAgICAgcmV0dXJuIGR3YXJmOjpEV19GT1JNX2Jsb2NrMjsKKyAgICBpZiAoKHVuc2lnbmVkIGludClTaXplID09IFNpemUpCisgICAgICByZXR1cm4gZHdhcmY6OkRXX0ZPUk1fYmxvY2s0OworICAgIHJldHVybiBkd2FyZjo6RFdfRk9STV9ibG9jazsKKyAgfQorCisgIHZvaWQgRW1pdFZhbHVlKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKyAgdW5zaWduZWQgU2l6ZU9mKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIERJRUJsb2NrIC0gUmVwcmVzZW50cyBhIGJsb2NrIG9mIHZhbHVlcy4KKy8vCitjbGFzcyBESUVCbG9jayA6IHB1YmxpYyBESUVWYWx1ZUxpc3QgeworICBtdXRhYmxlIHVuc2lnbmVkIFNpemUgPSAwOyAvLyBTaXplIGluIGJ5dGVzIGV4Y2x1ZGluZyBzaXplIGhlYWRlci4KKworcHVibGljOgorICBESUVCbG9jaygpID0gZGVmYXVsdDsKKworICAvLy8gQ29tcHV0ZVNpemUgLSBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGxvY2F0aW9uIGV4cHJlc3Npb24uCisgIC8vLworICB1bnNpZ25lZCBDb21wdXRlU2l6ZShjb25zdCBBc21QcmludGVyICpBUCkgY29uc3Q7CisKKyAgLy8vIEJlc3RGb3JtIC0gQ2hvb3NlIHRoZSBiZXN0IGZvcm0gZm9yIGRhdGEuCisgIC8vLworICBkd2FyZjo6Rm9ybSBCZXN0Rm9ybSgpIGNvbnN0IHsKKyAgICBpZiAoKHVuc2lnbmVkIGNoYXIpU2l6ZSA9PSBTaXplKQorICAgICAgcmV0dXJuIGR3YXJmOjpEV19GT1JNX2Jsb2NrMTsKKyAgICBpZiAoKHVuc2lnbmVkIHNob3J0KVNpemUgPT0gU2l6ZSkKKyAgICAgIHJldHVybiBkd2FyZjo6RFdfRk9STV9ibG9jazI7CisgICAgaWYgKCh1bnNpZ25lZCBpbnQpU2l6ZSA9PSBTaXplKQorICAgICAgcmV0dXJuIGR3YXJmOjpEV19GT1JNX2Jsb2NrNDsKKyAgICByZXR1cm4gZHdhcmY6OkRXX0ZPUk1fYmxvY2s7CisgIH0KKworICB2b2lkIEVtaXRWYWx1ZShjb25zdCBBc21QcmludGVyICpBUCwgZHdhcmY6OkZvcm0gRm9ybSkgY29uc3Q7CisgIHVuc2lnbmVkIFNpemVPZihjb25zdCBBc21QcmludGVyICpBUCwgZHdhcmY6OkZvcm0gRm9ybSkgY29uc3Q7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTykgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9MSUJfQ09ERUdFTl9BU01QUklOVEVSX0RJRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRElFVmFsdWUuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0RJRVZhbHVlLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ZjZTliCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0RJRVZhbHVlLmRlZgpAQCAtMCwwICsxLDQ3IEBACisvLz09PS0gbGx2bS9Db2RlR2VuL0RJRVZhbHVlLmRlZiAtIERJRVZhbHVlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE1hY3JvcyBmb3IgcnVubmluZyB0aHJvdWdoIGFsbCB0eXBlcyBvZiBESUVWYWx1ZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWYgIShkZWZpbmVkIEhBTkRMRV9ESUVWQUxVRSB8fCBkZWZpbmVkIEhBTkRMRV9ESUVWQUxVRV9TTUFMTCB8fCAgICAgICAgICAgICAgXAorICAgICAgZGVmaW5lZCBIQU5ETEVfRElFVkFMVUVfTEFSR0UpCisjZXJyb3IgIk1pc3NpbmcgbWFjcm8gZGVmaW5pdGlvbiBvZiBIQU5ETEVfRElFVkFMVUUiCisjZW5kaWYKKworLy8gSGFuZGxlciBmb3IgYWxsIHZhbHVlcy4KKyNpZm5kZWYgSEFORExFX0RJRVZBTFVFCisjZGVmaW5lIEhBTkRMRV9ESUVWQUxVRShUKQorI2VuZGlmCisKKy8vIEhhbmRsZXIgZm9yIHNtYWxsIHZhbHVlcy4KKyNpZm5kZWYgSEFORExFX0RJRVZBTFVFX1NNQUxMCisjZGVmaW5lIEhBTkRMRV9ESUVWQUxVRV9TTUFMTChUKSBIQU5ETEVfRElFVkFMVUUoVCkKKyNlbmRpZgorCisvLyBIYW5kbGVyIGZvciBsYXJnZSB2YWx1ZXMuCisjaWZuZGVmIEhBTkRMRV9ESUVWQUxVRV9MQVJHRQorI2RlZmluZSBIQU5ETEVfRElFVkFMVUVfTEFSR0UoVCkgSEFORExFX0RJRVZBTFVFKFQpCisjZW5kaWYKKworSEFORExFX0RJRVZBTFVFX1NNQUxMKEludGVnZXIpCitIQU5ETEVfRElFVkFMVUVfU01BTEwoU3RyaW5nKQorSEFORExFX0RJRVZBTFVFX1NNQUxMKEV4cHIpCitIQU5ETEVfRElFVkFMVUVfU01BTEwoTGFiZWwpCitIQU5ETEVfRElFVkFMVUVfTEFSR0UoRGVsdGEpCitIQU5ETEVfRElFVkFMVUVfU01BTEwoRW50cnkpCitIQU5ETEVfRElFVkFMVUVfTEFSR0UoQmxvY2spCitIQU5ETEVfRElFVkFMVUVfTEFSR0UoTG9jKQorSEFORExFX0RJRVZBTFVFX1NNQUxMKExvY0xpc3QpCitIQU5ETEVfRElFVkFMVUVfTEFSR0UoSW5saW5lU3RyaW5nKQorCisjdW5kZWYgSEFORExFX0RJRVZBTFVFCisjdW5kZWYgSEFORExFX0RJRVZBTFVFX1NNQUxMCisjdW5kZWYgSEFORExFX0RJRVZBTFVFX0xBUkdFCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRHdhcmZTdHJpbmdQb29sRW50cnkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Ed2FyZlN0cmluZ1Bvb2xFbnRyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YzA0ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRHdhcmZTdHJpbmdQb29sRW50cnkuaApAQCAtMCwwICsxLDUzIEBACisvLz09PS0gbGx2bS9Db2RlR2VuL0R3YXJmU3RyaW5nUG9vbEVudHJ5LmggLSBTdHJpbmcgcG9vbCBlbnRyeSAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9EV0FSRlNUUklOR1BPT0xFTlRSWV9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9EV0FSRlNUUklOR1BPT0xFTlRSWV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ1N5bWJvbDsKKworLy8vIERhdGEgZm9yIGEgc3RyaW5nIHBvb2wgZW50cnkuCitzdHJ1Y3QgRHdhcmZTdHJpbmdQb29sRW50cnkgeworICBNQ1N5bWJvbCAqU3ltYm9sOworICB1bnNpZ25lZCBPZmZzZXQ7CisgIHVuc2lnbmVkIEluZGV4OworfTsKKworLy8vIFN0cmluZyBwb29sIGVudHJ5IHJlZmVyZW5jZS4KK3N0cnVjdCBEd2FyZlN0cmluZ1Bvb2xFbnRyeVJlZiB7CisgIGNvbnN0IFN0cmluZ01hcEVudHJ5PER3YXJmU3RyaW5nUG9vbEVudHJ5PiAqSSA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgRHdhcmZTdHJpbmdQb29sRW50cnlSZWYoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IER3YXJmU3RyaW5nUG9vbEVudHJ5UmVmKAorICAgICAgY29uc3QgU3RyaW5nTWFwRW50cnk8RHdhcmZTdHJpbmdQb29sRW50cnk+ICZJKQorICAgICAgOiBJKCZJKSB7fQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBJOyB9CisgIE1DU3ltYm9sICpnZXRTeW1ib2woKSBjb25zdCB7CisgICAgYXNzZXJ0KEktPnNlY29uZC5TeW1ib2wgJiYgIk5vIHN5bWJvbCBhdmFpbGFibGUhIik7CisgICAgcmV0dXJuIEktPnNlY29uZC5TeW1ib2w7CisgIH0KKyAgdW5zaWduZWQgZ2V0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gSS0+c2Vjb25kLk9mZnNldDsgfQorICB1bnNpZ25lZCBnZXRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIEktPnNlY29uZC5JbmRleDsgfQorICBTdHJpbmdSZWYgZ2V0U3RyaW5nKCkgY29uc3QgeyByZXR1cm4gSS0+Zmlyc3QoKTsgfQorICAvLy8gUmV0dXJuIHRoZSBlbnRpcmUgc3RyaW5nIHBvb2wgZW50cnkgZm9yIGNvbnZlbmllbmNlLgorICBEd2FyZlN0cmluZ1Bvb2xFbnRyeSBnZXRFbnRyeSgpIGNvbnN0IHsgcmV0dXJuIEktPmdldFZhbHVlKCk7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgRHdhcmZTdHJpbmdQb29sRW50cnlSZWYgJlgpIGNvbnN0IHsgcmV0dXJuIEkgPT0gWC5JOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBEd2FyZlN0cmluZ1Bvb2xFbnRyeVJlZiAmWCkgY29uc3QgeyByZXR1cm4gSSAhPSBYLkk7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0VkZ2VCdW5kbGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRWRnZUJ1bmRsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzFmYWQyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0VkZ2VCdW5kbGVzLmgKQEAgLTAsMCArMSw2NCBAQAorLy89PT0tLS0tLS0tLSBFZGdlQnVuZGxlcy5oIC0gQnVuZGxlcyBvZiBDRkcgZWRnZXMgLS0tLS0tLS0tLS0tLS0qLSBjKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGUgRWRnZUJ1bmRsZXMgYW5hbHlzaXMgZm9ybXMgZXF1aXZhbGVuY2UgY2xhc3NlcyBvZiBDRkcgZWRnZXMgc3VjaCB0aGF0IGFsbAorLy8gZWRnZXMgbGVhdmluZyBhIG1hY2hpbmUgYmFzaWMgYmxvY2sgYXJlIGluIHRoZSBzYW1lIGJ1bmRsZSwgYW5kIGFsbCBlZGdlcworLy8gbGVhdmluZyBhIGJhc2ljIGJsb2NrIGFyZSBpbiB0aGUgc2FtZSBidW5kbGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fRURHRUJVTkRMRVNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fRURHRUJVTkRMRVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbnRFcUNsYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRWRnZUJ1bmRsZXMgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUY7CisKKyAgLy8vIEVDIC0gRWFjaCBlZGdlIGJ1bmRsZSBpcyBhbiBlcXVpdmFsZW5jZSBjbGFzcy4gVGhlIGtleXMgYXJlOgorICAvLy8gICAyKkJCLT5nZXROdW1iZXIoKSAgIC0+IEluZ29pbmcgYnVuZGxlLgorICAvLy8gICAyKkJCLT5nZXROdW1iZXIoKSsxIC0+IE91dGdvaW5nIGJ1bmRsZS4KKyAgSW50RXFDbGFzc2VzIEVDOworCisgIC8vLyBCbG9ja3MgLSBNYXAgZWFjaCBidW5kbGUgdG8gYSBsaXN0IG9mIGJhc2ljIGJsb2NrIG51bWJlcnMuCisgIFNtYWxsVmVjdG9yPFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA4PiwgND4gQmxvY2tzOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworICBFZGdlQnVuZGxlcygpIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCkge30KKworICAvLy8gZ2V0QnVuZGxlIC0gUmV0dXJuIHRoZSBpbmdvaW5nIChPdXQgPSBmYWxzZSkgb3Igb3V0Z29pbmcgKE91dCA9IHRydWUpCisgIC8vLyBidW5kbGUgbnVtYmVyIGZvciBiYXNpYyBibG9jayAjTgorICB1bnNpZ25lZCBnZXRCdW5kbGUodW5zaWduZWQgTiwgYm9vbCBPdXQpIGNvbnN0IHsgcmV0dXJuIEVDWzIgKiBOICsgT3V0XTsgfQorCisgIC8vLyBnZXROdW1CdW5kbGVzIC0gUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgYnVuZGxlcyBpbiB0aGUgQ0ZHLgorICB1bnNpZ25lZCBnZXROdW1CdW5kbGVzKCkgY29uc3QgeyByZXR1cm4gRUMuZ2V0TnVtQ2xhc3NlcygpOyB9CisKKyAgLy8vIGdldEJsb2NrcyAtIFJldHVybiBhbiBhcnJheSBvZiBibG9ja3MgdGhhdCBhcmUgY29ubmVjdGVkIHRvIEJ1bmRsZS4KKyAgQXJyYXlSZWY8dW5zaWduZWQ+IGdldEJsb2Nrcyh1bnNpZ25lZCBCdW5kbGUpIGNvbnN0IHsgcmV0dXJuIEJsb2Nrc1tCdW5kbGVdOyB9CisKKyAgLy8vIGdldE1hY2hpbmVGdW5jdGlvbiAtIFJldHVybiB0aGUgbGFzdCBtYWNoaW5lIGZ1bmN0aW9uIGNvbXB1dGVkLgorICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gKmdldE1hY2hpbmVGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIE1GOyB9CisKKyAgLy8vIHZpZXcgLSBWaXN1YWxpemUgdGhlIGFubm90YXRlZCBiaXBhcnRpdGUgQ0ZHIHdpdGggR3JhcGh2aXouCisgIHZvaWQgdmlldygpIGNvbnN0OworCitwcml2YXRlOgorICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiYpIG92ZXJyaWRlOworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSYpIGNvbnN0IG92ZXJyaWRlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRXhlY3V0aW9uRG9tYWluRml4LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRXhlY3V0aW9uRG9tYWluRml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM4YzIxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9FeGVjdXRpb25Eb21haW5GaXguaApAQCAtMCwwICsxLDIxMyBAQAorLy89PS0tIGxsdm0vQ29kZUdlbi9FeGVjdXRpb25Eb21haW5GaXguaCAtIEV4ZWN1dGlvbiBEb21haW4gRml4IC0qLSBDKysgLSotLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUgRXhlY3V0aW9uIERvbWFpbiBGaXggcGFzcy4KKy8vLworLy8vIFNvbWUgWDg2IFNTRSBpbnN0cnVjdGlvbnMgbGlrZSBtb3YsIGFuZCwgb3IsIHhvciBhcmUgYXZhaWxhYmxlIGluIGRpZmZlcmVudAorLy8vIHZhcmlhbnRzIGZvciBkaWZmZXJlbnQgb3BlcmFuZCB0eXBlcy4gVGhlc2UgdmFyaWFudCBpbnN0cnVjdGlvbnMgYXJlCisvLy8gZXF1aXZhbGVudCwgYnV0IG9uIE5laGFsZW0gYW5kIG5ld2VyIGNwdXMgdGhlcmUgaXMgZXh0cmEgbGF0ZW5jeQorLy8vIHRyYW5zZmVycmluZyBkYXRhIGJldHdlZW4gaW50ZWdlciBhbmQgZmxvYXRpbmcgcG9pbnQgZG9tYWlucy4gIEFSTSBjb3JlcworLy8vIGhhdmUgc2ltaWxhciBpc3N1ZXMgd2hlbiB0aGV5IGFyZSBjb25maWd1cmVkIHdpdGggYm90aCBWRlAgYW5kIE5FT04KKy8vLyBwaXBlbGluZXMuCisvLy8KKy8vLyBUaGlzIHBhc3MgY2hhbmdlcyB0aGUgdmFyaWFudCBpbnN0cnVjdGlvbnMgdG8gbWluaW1pemUgZG9tYWluIGNyb3NzaW5ncy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9FWEVDVVRJT05ET01BSU5GSVhfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fRVhFQ1VUSU9ORE9NQUlORklYX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xvb3BUcmF2ZXJzYWwuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9SZWFjaGluZ0RlZkFuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldFJlZ2lzdGVySW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworCisvLy8gQSBEb21haW5WYWx1ZSBpcyBhIGJpdCBsaWtlIExpdmVJbnRlcnZhbHMnIFZhbE5vLCBidXQgaXQgYWxzbyBrZWVwcyB0cmFjaworLy8vIG9mIGV4ZWN1dGlvbiBkb21haW5zLgorLy8vCisvLy8gQW4gb3BlbiBEb21haW5WYWx1ZSByZXByZXNlbnRzIGEgc2V0IG9mIGluc3RydWN0aW9ucyB0aGF0IGNhbiBzdGlsbCBzd2l0Y2gKKy8vLyBleGVjdXRpb24gZG9tYWluLiBNdWx0aXBsZSByZWdpc3RlcnMgbWF5IHJlZmVyIHRvIHRoZSBzYW1lIG9wZW4KKy8vLyBEb21haW5WYWx1ZSAtIHRoZXkgd2lsbCBldmVudHVhbGx5IGJlIGNvbGxhcHNlZCB0byB0aGUgc2FtZSBleGVjdXRpb24KKy8vLyBkb21haW4uCisvLy8KKy8vLyBBIGNvbGxhcHNlZCBEb21haW5WYWx1ZSByZXByZXNlbnRzIGEgc2luZ2xlIHJlZ2lzdGVyIHRoYXQgaGFzIGJlZW4gZm9yY2VkCisvLy8gaW50byBvbmUgb2YgbW9yZSBleGVjdXRpb24gZG9tYWlucy4gVGhlcmUgaXMgYSBzZXBhcmF0ZSBjb2xsYXBzZWQKKy8vLyBEb21haW5WYWx1ZSBmb3IgZWFjaCByZWdpc3RlciwgYnV0IGl0IG1heSBjb250YWluIG11bHRpcGxlIGV4ZWN1dGlvbgorLy8vIGRvbWFpbnMuIEEgcmVnaXN0ZXIgdmFsdWUgaXMgaW5pdGlhbGx5IGNyZWF0ZWQgaW4gYSBzaW5nbGUgZXhlY3V0aW9uCisvLy8gZG9tYWluLCBidXQgaWYgd2Ugd2VyZSBmb3JjZWQgdG8gcGF5IHRoZSBwZW5hbHR5IG9mIGEgZG9tYWluIGNyb3NzaW5nLCB3ZQorLy8vIGtlZXAgdHJhY2sgb2YgdGhlIGZhY3QgdGhhdCB0aGUgcmVnaXN0ZXIgaXMgbm93IGF2YWlsYWJsZSBpbiBtdWx0aXBsZQorLy8vIGRvbWFpbnMuCitzdHJ1Y3QgRG9tYWluVmFsdWUgeworICAvLy8gQmFzaWMgcmVmZXJlbmNlIGNvdW50aW5nLgorICB1bnNpZ25lZCBSZWZzID0gMDsKKworICAvLy8gQml0bWFzayBvZiBhdmFpbGFibGUgZG9tYWlucy4gRm9yIGFuIG9wZW4gRG9tYWluVmFsdWUsIGl0IGlzIHRoZSBzdGlsbAorICAvLy8gcG9zc2libGUgZG9tYWlucyBmb3IgY29sbGFwc2luZy4gRm9yIGEgY29sbGFwc2VkIERvbWFpblZhbHVlIGl0IGlzIHRoZQorICAvLy8gZG9tYWlucyB3aGVyZSB0aGUgcmVnaXN0ZXIgaXMgYXZhaWxhYmxlIGZvciBmcmVlLgorICB1bnNpZ25lZCBBdmFpbGFibGVEb21haW5zOworCisgIC8vLyBQb2ludGVyIHRvIHRoZSBuZXh0IERvbWFpblZhbHVlIGluIGEgY2hhaW4uICBXaGVuIHR3byBEb21haW5WYWx1ZXMgYXJlCisgIC8vLyBtZXJnZWQsIFZpY3RpbS5OZXh0IGlzIHNldCB0byBwb2ludCB0byBWaWN0b3IsIHNvIG9sZCBEb21haW5WYWx1ZQorICAvLy8gcmVmZXJlbmNlcyBjYW4gYmUgdXBkYXRlZCBieSBmb2xsb3dpbmcgdGhlIGNoYWluLgorICBEb21haW5WYWx1ZSAqTmV4dDsKKworICAvLy8gVHdpZGRsZWFibGUgaW5zdHJ1Y3Rpb25zIHVzaW5nIG9yIGRlZmluaW5nIHRoZXNlIHJlZ2lzdGVycy4KKyAgU21hbGxWZWN0b3I8TWFjaGluZUluc3RyICosIDg+IEluc3RyczsKKworICBEb21haW5WYWx1ZSgpIHsgY2xlYXIoKTsgfQorCisgIC8vLyBBIGNvbGxhcHNlZCBEb21haW5WYWx1ZSBoYXMgbm8gaW5zdHJ1Y3Rpb25zIHRvIHR3aWRkbGUgLSBpdCBzaW1wbHkga2VlcHMKKyAgLy8vIHRyYWNrIG9mIHRoZSBkb21haW5zIHdoZXJlIHRoZSByZWdpc3RlcnMgYXJlIGFscmVhZHkgYXZhaWxhYmxlLgorICBib29sIGlzQ29sbGFwc2VkKCkgY29uc3QgeyByZXR1cm4gSW5zdHJzLmVtcHR5KCk7IH0KKworICAvLy8gSXMgZG9tYWluIGF2YWlsYWJsZT8KKyAgYm9vbCBoYXNEb21haW4odW5zaWduZWQgZG9tYWluKSBjb25zdCB7CisgICAgYXNzZXJ0KGRvbWFpbiA8CisgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46OmRpZ2l0cykgJiYKKyAgICAgICAgICAgInVuZGVmaW5lZCBiZWhhdmlvciIpOworICAgIHJldHVybiBBdmFpbGFibGVEb21haW5zICYgKDF1IDw8IGRvbWFpbik7CisgIH0KKworICAvLy8gTWFyayBkb21haW4gYXMgYXZhaWxhYmxlLgorICB2b2lkIGFkZERvbWFpbih1bnNpZ25lZCBkb21haW4pIHsgQXZhaWxhYmxlRG9tYWlucyB8PSAxdSA8PCBkb21haW47IH0KKworICAvLyBSZXN0cmljdCB0byBhIHNpbmdsZSBkb21haW4gYXZhaWxhYmxlLgorICB2b2lkIHNldFNpbmdsZURvbWFpbih1bnNpZ25lZCBkb21haW4pIHsgQXZhaWxhYmxlRG9tYWlucyA9IDF1IDw8IGRvbWFpbjsgfQorCisgIC8vLyBSZXR1cm4gYml0bWFzayBvZiBkb21haW5zIHRoYXQgYXJlIGF2YWlsYWJsZSBhbmQgaW4gbWFzay4KKyAgdW5zaWduZWQgZ2V0Q29tbW9uRG9tYWlucyh1bnNpZ25lZCBtYXNrKSBjb25zdCB7CisgICAgcmV0dXJuIEF2YWlsYWJsZURvbWFpbnMgJiBtYXNrOworICB9CisKKyAgLy8vIEZpcnN0IGRvbWFpbiBhdmFpbGFibGUuCisgIHVuc2lnbmVkIGdldEZpcnN0RG9tYWluKCkgY29uc3QgeworICAgIHJldHVybiBjb3VudFRyYWlsaW5nWmVyb3MoQXZhaWxhYmxlRG9tYWlucyk7CisgIH0KKworICAvLy8gQ2xlYXIgdGhpcyBEb21haW5WYWx1ZSBhbmQgcG9pbnQgdG8gbmV4dCB3aGljaCBoYXMgYWxsIGl0cyBkYXRhLgorICB2b2lkIGNsZWFyKCkgeworICAgIEF2YWlsYWJsZURvbWFpbnMgPSAwOworICAgIE5leHQgPSBudWxscHRyOworICAgIEluc3Rycy5jbGVhcigpOworICB9Cit9OworCitjbGFzcyBFeGVjdXRpb25Eb21haW5GaXggOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgIFNwZWNpZmljQnVtcFB0ckFsbG9jYXRvcjxEb21haW5WYWx1ZT4gQWxsb2NhdG9yOworICBTbWFsbFZlY3RvcjxEb21haW5WYWx1ZSAqLCAxNj4gQXZhaWw7CisKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqY29uc3QgUkM7CisgIE1hY2hpbmVGdW5jdGlvbiAqTUY7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJOworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSTsKKyAgc3RkOjp2ZWN0b3I8U21hbGxWZWN0b3I8aW50LCAxPj4gQWxpYXNNYXA7CisgIGNvbnN0IHVuc2lnbmVkIE51bVJlZ3M7CisgIC8vLyBWYWx1ZSBjdXJyZW50bHkgaW4gZWFjaCByZWdpc3Rlciwgb3IgTlVMTCB3aGVuIG5vIHZhbHVlIGlzIGJlaW5nIHRyYWNrZWQuCisgIC8vLyBUaGlzIGNvdW50cyBhcyBhIERvbWFpblZhbHVlIHJlZmVyZW5jZS4KKyAgdXNpbmcgTGl2ZVJlZ3NEVkluZm8gPSBzdGQ6OnZlY3RvcjxEb21haW5WYWx1ZSAqPjsKKyAgTGl2ZVJlZ3NEVkluZm8gTGl2ZVJlZ3M7CisgIC8vLyBLZWVwcyBkb21haW4gaW5mb3JtYXRpb24gZm9yIGFsbCByZWdpc3RlcnMuIE5vdGUgdGhhdCB0aGlzCisgIC8vLyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgdXN1YWwgZGVmaW5pdGlvbiBub3Rpb24gb2YgbGl2ZW5lc3MuIFRoZSBDUFUKKyAgLy8vIGRvZXNuJ3QgY2FyZSB3aGV0aGVyIG9yIG5vdCB3ZSBjb25zaWRlciBhIHJlZ2lzdGVyIGtpbGxlZC4KKyAgdXNpbmcgT3V0UmVnc0luZm9NYXAgPSBTbWFsbFZlY3RvcjxMaXZlUmVnc0RWSW5mbywgND47CisgIE91dFJlZ3NJbmZvTWFwIE1CQk91dFJlZ3NJbmZvczsKKworICBSZWFjaGluZ0RlZkFuYWx5c2lzICpSREE7CisKK3B1YmxpYzoKKyAgRXhlY3V0aW9uRG9tYWluRml4KGNoYXIgJlBhc3NJRCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAmUkMpCisgICAgICA6IE1hY2hpbmVGdW5jdGlvblBhc3MoUGFzc0lEKSwgUkMoJlJDKSwgTnVtUmVncyhSQy5nZXROdW1SZWdzKCkpIHt9CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZSB7CisgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgICAgQVUuYWRkUmVxdWlyZWQ8UmVhY2hpbmdEZWZBbmFseXNpcz4oKTsKKyAgICBNYWNoaW5lRnVuY3Rpb25QYXNzOjpnZXRBbmFseXNpc1VzYWdlKEFVKTsKKyAgfQorCisgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRikgb3ZlcnJpZGU7CisKKyAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyBnZXRSZXF1aXJlZFByb3BlcnRpZXMoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMoKS5zZXQoCisgICAgICAgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXM6OlByb3BlcnR5OjpOb1ZSZWdzKTsKKyAgfQorCitwcml2YXRlOgorICAvLy8gVHJhbnNsYXRlIFRSSSByZWdpc3RlciBudW1iZXIgdG8gYSBsaXN0IG9mIGluZGljZXMgaW50byBvdXIgc21hbGxlciB0YWJsZXMKKyAgLy8vIG9mIGludGVyZXN0aW5nIHJlZ2lzdGVycy4KKyAgaXRlcmF0b3JfcmFuZ2U8U21hbGxWZWN0b3JJbXBsPGludD46OmNvbnN0X2l0ZXJhdG9yPgorICByZWdJbmRpY2VzKHVuc2lnbmVkIFJlZykgY29uc3Q7CisKKyAgLy8vIERvbWFpblZhbHVlIGFsbG9jYXRpb24uCisgIERvbWFpblZhbHVlICphbGxvYyhpbnQgZG9tYWluID0gLTEpOworCisgIC8vLyBBZGQgcmVmZXJlbmNlIHRvIERWLgorICBEb21haW5WYWx1ZSAqcmV0YWluKERvbWFpblZhbHVlICpEVikgeworICAgIGlmIChEVikKKyAgICAgICsrRFYtPlJlZnM7CisgICAgcmV0dXJuIERWOworICB9CisKKyAgLy8vIFJlbGVhc2UgYSByZWZlcmVuY2UgdG8gRFYuICBXaGVuIHRoZSBsYXN0IHJlZmVyZW5jZSBpcyByZWxlYXNlZCwKKyAgLy8vIGNvbGxhcHNlIGlmIG5lZWRlZC4KKyAgdm9pZCByZWxlYXNlKERvbWFpblZhbHVlICopOworCisgIC8vLyBGb2xsb3cgdGhlIGNoYWluIG9mIGRlYWQgRG9tYWluVmFsdWVzIHVudGlsIGEgbGl2ZSBEb21haW5WYWx1ZSBpcyByZWFjaGVkLgorICAvLy8gVXBkYXRlIHRoZSByZWZlcmVuY2VkIHBvaW50ZXIgd2hlbiBuZWNlc3NhcnkuCisgIERvbWFpblZhbHVlICpyZXNvbHZlKERvbWFpblZhbHVlIComKTsKKworICAvLy8gU2V0IExpdmVSZWdzW3J4XSA9IGR2LCB1cGRhdGluZyByZWZlcmVuY2UgY291bnRzLgorICB2b2lkIHNldExpdmVSZWcoaW50IHJ4LCBEb21haW5WYWx1ZSAqRFYpOworCisgIC8vLyBLaWxsIHJlZ2lzdGVyIHJ4LCByZWN5Y2xlIG9yIGNvbGxhcHNlIGFueSBEb21haW5WYWx1ZS4KKyAgdm9pZCBraWxsKGludCByeCk7CisKKyAgLy8vIEZvcmNlIHJlZ2lzdGVyIHJ4IGludG8gZG9tYWluLgorICB2b2lkIGZvcmNlKGludCByeCwgdW5zaWduZWQgZG9tYWluKTsKKworICAvLy8gQ29sbGFwc2Ugb3BlbiBEb21haW5WYWx1ZSBpbnRvIGdpdmVuIGRvbWFpbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCisgIC8vLyByZWdpc3RlcnMgdXNpbmcgZHYsIHRoZXkgZWFjaCBnZXQgYSB1bmlxdWUgY29sbGFwc2VkIERvbWFpblZhbHVlLgorICB2b2lkIGNvbGxhcHNlKERvbWFpblZhbHVlICpkdiwgdW5zaWduZWQgZG9tYWluKTsKKworICAvLy8gQWxsIGluc3RydWN0aW9ucyBhbmQgcmVnaXN0ZXJzIGluIEIgYXJlIG1vdmVkIHRvIEEsIGFuZCBCIGlzIHJlbGVhc2VkLgorICBib29sIG1lcmdlKERvbWFpblZhbHVlICpBLCBEb21haW5WYWx1ZSAqQik7CisKKyAgLy8vIFNldCB1cCBMaXZlUmVncyBieSBtZXJnaW5nIHByZWRlY2Vzc29yIGxpdmUtb3V0IHZhbHVlcy4KKyAgdm9pZCBlbnRlckJhc2ljQmxvY2soY29uc3QgTG9vcFRyYXZlcnNhbDo6VHJhdmVyc2VkTUJCSW5mbyAmVHJhdmVyc2VkTUJCKTsKKworICAvLy8gVXBkYXRlIGxpdmUtb3V0IHZhbHVlcy4KKyAgdm9pZCBsZWF2ZUJhc2ljQmxvY2soY29uc3QgTG9vcFRyYXZlcnNhbDo6VHJhdmVyc2VkTUJCSW5mbyAmVHJhdmVyc2VkTUJCKTsKKworICAvLy8gUHJvY2VzcyBoZSBnaXZlbiBiYXNpYyBibG9jay4KKyAgdm9pZCBwcm9jZXNzQmFzaWNCbG9jayhjb25zdCBMb29wVHJhdmVyc2FsOjpUcmF2ZXJzZWRNQkJJbmZvICZUcmF2ZXJzZWRNQkIpOworCisgIC8vLyBWaXNpdCBnaXZlbiBpbnN0dXJjaW9uLgorICBib29sIHZpc2l0SW5zdHIoTWFjaGluZUluc3RyICopOworCisgIC8vLyBVcGRhdGUgZGVmLWFnZXMgZm9yIHJlZ2lzdGVycyBkZWZpbmVkIGJ5IE1JLgorICAvLy8gSWYgS2lsbCBpcyBzZXQsIGFsc28ga2lsbCBvZmYgRG9tYWluVmFsdWVzIGNsb2JiZXJlZCBieSB0aGUgZGVmcy4KKyAgdm9pZCBwcm9jZXNzRGVmcyhNYWNoaW5lSW5zdHIgKiwgYm9vbCBLaWxsKTsKKworICAvLy8gQSBzb2Z0IGluc3RydWN0aW9uIGNhbiBiZSBjaGFuZ2VkIHRvIHdvcmsgaW4gb3RoZXIgZG9tYWlucyBnaXZlbiBieSBtYXNrLgorICB2b2lkIHZpc2l0U29mdEluc3RyKE1hY2hpbmVJbnN0ciAqLCB1bnNpZ25lZCBtYXNrKTsKKworICAvLy8gQSBoYXJkIGluc3RydWN0aW9uIG9ubHkgd29ya3MgaW4gb25lIGRvbWFpbi4gQWxsIGlucHV0IHJlZ2lzdGVycyB3aWxsIGJlCisgIC8vLyBmb3JjZWQgaW50byB0aGF0IGRvbWFpbi4KKyAgdm9pZCB2aXNpdEhhcmRJbnN0cihNYWNoaW5lSW5zdHIgKiwgdW5zaWduZWQgZG9tYWluKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9FWEVDVVRJT05ET01BSU5GSVhfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0V4cGFuZFJlZHVjdGlvbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9FeHBhbmRSZWR1Y3Rpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhYWFhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9FeHBhbmRSZWR1Y3Rpb25zLmgKQEAgLTAsMCArMSwyNCBAQAorLy89PT0tLS0tLSBFeHBhbmRSZWR1Y3Rpb25zLmggLSBFeHBhbmQgZXhwZXJpbWVudGFsIHJlZHVjdGlvbiBpbnRyaW5zaWNzIC0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fRVhQQU5EUkVEVUNUSU9OU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9FWFBBTkRSRURVQ1RJT05TX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBFeHBhbmRSZWR1Y3Rpb25zUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48RXhwYW5kUmVkdWN0aW9uc1Bhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fRVhQQU5EUkVEVUNUSU9OU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRmFzdElTZWwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9GYXN0SVNlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MmJkNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRmFzdElTZWwuaApAQCAtMCwwICsxLDU5MyBAQAorLy89PT0tIEZhc3RJU2VsLmggLSBEZWZpbml0aW9uIG9mIHRoZSBGYXN0SVNlbCBjbGFzcyAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEZhc3RJU2VsIGNsYXNzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9GQVNUSVNFTF9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9GQVNUSVNFTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldExvd2VyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9JUi9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RlYnVnTG9jLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RyVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWFjaGluZVZhbHVlVHlwZS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQWxsb2NhSW5zdDsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBDYWxsSW5zdDsKK2NsYXNzIENvbnN0YW50OworY2xhc3MgQ29uc3RhbnRGUDsKK2NsYXNzIERhdGFMYXlvdXQ7CitjbGFzcyBGdW5jdGlvbkxvd2VyaW5nSW5mbzsKK2NsYXNzIExvYWRJbnN0OworY2xhc3MgTWFjaGluZUNvbnN0YW50UG9vbDsKK2NsYXNzIE1hY2hpbmVGcmFtZUluZm87CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBNYWNoaW5lTWVtT3BlcmFuZDsKK2NsYXNzIE1hY2hpbmVPcGVyYW5kOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DSW5zdHJEZXNjOworY2xhc3MgTUNTeW1ib2w7CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CitjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbzsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CitjbGFzcyBUYXJnZXRSZWdpc3RlckNsYXNzOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworY2xhc3MgVHlwZTsKK2NsYXNzIFVzZXI7CitjbGFzcyBWYWx1ZTsKKworLy8vIFxicmllZiBUaGlzIGlzIGEgZmFzdC1wYXRoIGluc3RydWN0aW9uIHNlbGVjdGlvbiBjbGFzcyB0aGF0IGdlbmVyYXRlcyBwb29yCisvLy8gY29kZSBhbmQgZG9lc24ndCBzdXBwb3J0IGlsbGVnYWwgdHlwZXMgb3Igbm9uLXRyaXZpYWwgbG93ZXJpbmcsIGJ1dCBydW5zCisvLy8gcXVpY2tseS4KK2NsYXNzIEZhc3RJU2VsIHsKK3B1YmxpYzoKKyAgdXNpbmcgQXJnTGlzdEVudHJ5ID0gVGFyZ2V0TG93ZXJpbmdCYXNlOjpBcmdMaXN0RW50cnk7CisgIHVzaW5nIEFyZ0xpc3RUeSA9IFRhcmdldExvd2VyaW5nQmFzZTo6QXJnTGlzdFR5OworICBzdHJ1Y3QgQ2FsbExvd2VyaW5nSW5mbyB7CisgICAgVHlwZSAqUmV0VHkgPSBudWxscHRyOworICAgIGJvb2wgUmV0U0V4dCA6IDE7CisgICAgYm9vbCBSZXRaRXh0IDogMTsKKyAgICBib29sIElzVmFyQXJnIDogMTsKKyAgICBib29sIElzSW5SZWcgOiAxOworICAgIGJvb2wgRG9lc05vdFJldHVybiA6IDE7CisgICAgYm9vbCBJc1JldHVyblZhbHVlVXNlZCA6IDE7CisgICAgYm9vbCBJc1BhdGNoUG9pbnQgOiAxOworCisgICAgLy8gXGJyaWVmIElzVGFpbENhbGwgU2hvdWxkIGJlIG1vZGlmaWVkIGJ5IGltcGxlbWVudGF0aW9ucyBvZiBGYXN0TG93ZXJDYWxsCisgICAgLy8gdGhhdCBwZXJmb3JtIHRhaWwgY2FsbCBjb252ZXJzaW9ucy4KKyAgICBib29sIElzVGFpbENhbGwgPSBmYWxzZTsKKworICAgIHVuc2lnbmVkIE51bUZpeGVkQXJncyA9IC0xOworICAgIENhbGxpbmdDb252OjpJRCBDYWxsQ29udiA9IENhbGxpbmdDb252OjpDOworICAgIGNvbnN0IFZhbHVlICpDYWxsZWUgPSBudWxscHRyOworICAgIE1DU3ltYm9sICpTeW1ib2wgPSBudWxscHRyOworICAgIEFyZ0xpc3RUeSBBcmdzOworICAgIEltbXV0YWJsZUNhbGxTaXRlICpDUyA9IG51bGxwdHI7CisgICAgTWFjaGluZUluc3RyICpDYWxsID0gbnVsbHB0cjsKKyAgICB1bnNpZ25lZCBSZXN1bHRSZWcgPSAwOworICAgIHVuc2lnbmVkIE51bVJlc3VsdFJlZ3MgPSAwOworCisgICAgU21hbGxWZWN0b3I8VmFsdWUgKiwgMTY+IE91dFZhbHM7CisgICAgU21hbGxWZWN0b3I8SVNEOjpBcmdGbGFnc1R5LCAxNj4gT3V0RmxhZ3M7CisgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDE2PiBPdXRSZWdzOworICAgIFNtYWxsVmVjdG9yPElTRDo6SW5wdXRBcmcsIDQ+IEluczsKKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gSW5SZWdzOworCisgICAgQ2FsbExvd2VyaW5nSW5mbygpCisgICAgICAgIDogUmV0U0V4dChmYWxzZSksIFJldFpFeHQoZmFsc2UpLCBJc1ZhckFyZyhmYWxzZSksIElzSW5SZWcoZmFsc2UpLAorICAgICAgICAgIERvZXNOb3RSZXR1cm4oZmFsc2UpLCBJc1JldHVyblZhbHVlVXNlZCh0cnVlKSwgSXNQYXRjaFBvaW50KGZhbHNlKSB7fQorCisgICAgQ2FsbExvd2VyaW5nSW5mbyAmc2V0Q2FsbGVlKFR5cGUgKlJlc3VsdFR5LCBGdW5jdGlvblR5cGUgKkZ1bmNUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKlRhcmdldCwgQXJnTGlzdFR5ICYmQXJnc0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUNhbGxTaXRlICZDYWxsKSB7CisgICAgICBSZXRUeSA9IFJlc3VsdFR5OworICAgICAgQ2FsbGVlID0gVGFyZ2V0OworCisgICAgICBJc0luUmVnID0gQ2FsbC5oYXNSZXRBdHRyKEF0dHJpYnV0ZTo6SW5SZWcpOworICAgICAgRG9lc05vdFJldHVybiA9IENhbGwuZG9lc05vdFJldHVybigpOworICAgICAgSXNWYXJBcmcgPSBGdW5jVHktPmlzVmFyQXJnKCk7CisgICAgICBJc1JldHVyblZhbHVlVXNlZCA9ICFDYWxsLmdldEluc3RydWN0aW9uKCktPnVzZV9lbXB0eSgpOworICAgICAgUmV0U0V4dCA9IENhbGwuaGFzUmV0QXR0cihBdHRyaWJ1dGU6OlNFeHQpOworICAgICAgUmV0WkV4dCA9IENhbGwuaGFzUmV0QXR0cihBdHRyaWJ1dGU6OlpFeHQpOworCisgICAgICBDYWxsQ29udiA9IENhbGwuZ2V0Q2FsbGluZ0NvbnYoKTsKKyAgICAgIEFyZ3MgPSBzdGQ6Om1vdmUoQXJnc0xpc3QpOworICAgICAgTnVtRml4ZWRBcmdzID0gRnVuY1R5LT5nZXROdW1QYXJhbXMoKTsKKworICAgICAgQ1MgPSAmQ2FsbDsKKworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENhbGxMb3dlcmluZ0luZm8gJnNldENhbGxlZShUeXBlICpSZXN1bHRUeSwgRnVuY3Rpb25UeXBlICpGdW5jVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU3ltYm9sICpUYXJnZXQsIEFyZ0xpc3RUeSAmJkFyZ3NMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVDYWxsU2l0ZSAmQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRml4ZWRBcmdzID0gfjBVKSB7CisgICAgICBSZXRUeSA9IFJlc3VsdFR5OworICAgICAgQ2FsbGVlID0gQ2FsbC5nZXRDYWxsZWRWYWx1ZSgpOworICAgICAgU3ltYm9sID0gVGFyZ2V0OworCisgICAgICBJc0luUmVnID0gQ2FsbC5oYXNSZXRBdHRyKEF0dHJpYnV0ZTo6SW5SZWcpOworICAgICAgRG9lc05vdFJldHVybiA9IENhbGwuZG9lc05vdFJldHVybigpOworICAgICAgSXNWYXJBcmcgPSBGdW5jVHktPmlzVmFyQXJnKCk7CisgICAgICBJc1JldHVyblZhbHVlVXNlZCA9ICFDYWxsLmdldEluc3RydWN0aW9uKCktPnVzZV9lbXB0eSgpOworICAgICAgUmV0U0V4dCA9IENhbGwuaGFzUmV0QXR0cihBdHRyaWJ1dGU6OlNFeHQpOworICAgICAgUmV0WkV4dCA9IENhbGwuaGFzUmV0QXR0cihBdHRyaWJ1dGU6OlpFeHQpOworCisgICAgICBDYWxsQ29udiA9IENhbGwuZ2V0Q2FsbGluZ0NvbnYoKTsKKyAgICAgIEFyZ3MgPSBzdGQ6Om1vdmUoQXJnc0xpc3QpOworICAgICAgTnVtRml4ZWRBcmdzID0gKEZpeGVkQXJncyA9PSB+MFUpID8gRnVuY1R5LT5nZXROdW1QYXJhbXMoKSA6IEZpeGVkQXJnczsKKworICAgICAgQ1MgPSAmQ2FsbDsKKworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENhbGxMb3dlcmluZ0luZm8gJnNldENhbGxlZShDYWxsaW5nQ29udjo6SUQgQ0MsIFR5cGUgKlJlc3VsdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqVGFyZ2V0LCBBcmdMaXN0VHkgJiZBcmdzTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRml4ZWRBcmdzID0gfjBVKSB7CisgICAgICBSZXRUeSA9IFJlc3VsdFR5OworICAgICAgQ2FsbGVlID0gVGFyZ2V0OworICAgICAgQ2FsbENvbnYgPSBDQzsKKyAgICAgIEFyZ3MgPSBzdGQ6Om1vdmUoQXJnc0xpc3QpOworICAgICAgTnVtRml4ZWRBcmdzID0gKEZpeGVkQXJncyA9PSB+MFUpID8gQXJncy5zaXplKCkgOiBGaXhlZEFyZ3M7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2FsbExvd2VyaW5nSW5mbyAmc2V0Q2FsbGVlKGNvbnN0IERhdGFMYXlvdXQgJkRMLCBNQ0NvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEIENDLCBUeXBlICpSZXN1bHRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFRhcmdldCwgQXJnTGlzdFR5ICYmQXJnc0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZpeGVkQXJncyA9IH4wVSk7CisKKyAgICBDYWxsTG93ZXJpbmdJbmZvICZzZXRDYWxsZWUoQ2FsbGluZ0NvbnY6OklEIENDLCBUeXBlICpSZXN1bHRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTeW1ib2wgKlRhcmdldCwgQXJnTGlzdFR5ICYmQXJnc0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZpeGVkQXJncyA9IH4wVSkgeworICAgICAgUmV0VHkgPSBSZXN1bHRUeTsKKyAgICAgIFN5bWJvbCA9IFRhcmdldDsKKyAgICAgIENhbGxDb252ID0gQ0M7CisgICAgICBBcmdzID0gc3RkOjptb3ZlKEFyZ3NMaXN0KTsKKyAgICAgIE51bUZpeGVkQXJncyA9IChGaXhlZEFyZ3MgPT0gfjBVKSA/IEFyZ3Muc2l6ZSgpIDogRml4ZWRBcmdzOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENhbGxMb3dlcmluZ0luZm8gJnNldFRhaWxDYWxsKGJvb2wgVmFsdWUgPSB0cnVlKSB7CisgICAgICBJc1RhaWxDYWxsID0gVmFsdWU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2FsbExvd2VyaW5nSW5mbyAmc2V0SXNQYXRjaFBvaW50KGJvb2wgVmFsdWUgPSB0cnVlKSB7CisgICAgICBJc1BhdGNoUG9pbnQgPSBWYWx1ZTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBBcmdMaXN0VHkgJmdldEFyZ3MoKSB7IHJldHVybiBBcmdzOyB9CisKKyAgICB2b2lkIGNsZWFyT3V0cygpIHsKKyAgICAgIE91dFZhbHMuY2xlYXIoKTsKKyAgICAgIE91dEZsYWdzLmNsZWFyKCk7CisgICAgICBPdXRSZWdzLmNsZWFyKCk7CisgICAgfQorCisgICAgdm9pZCBjbGVhcklucygpIHsKKyAgICAgIElucy5jbGVhcigpOworICAgICAgSW5SZWdzLmNsZWFyKCk7CisgICAgfQorICB9OworCitwcm90ZWN0ZWQ6CisgIERlbnNlTWFwPGNvbnN0IFZhbHVlICosIHVuc2lnbmVkPiBMb2NhbFZhbHVlTWFwOworICBGdW5jdGlvbkxvd2VyaW5nSW5mbyAmRnVuY0luZm87CisgIE1hY2hpbmVGdW5jdGlvbiAqTUY7CisgIE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSTsKKyAgTWFjaGluZUZyYW1lSW5mbyAmTUZJOworICBNYWNoaW5lQ29uc3RhbnRQb29sICZNQ1A7CisgIERlYnVnTG9jIERiZ0xvYzsKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE07CisgIGNvbnN0IERhdGFMYXlvdXQgJkRMOworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSTsKKyAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSTsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkk7CisgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpMaWJJbmZvOworICBib29sIFNraXBUYXJnZXRJbmRlcGVuZGVudElTZWw7CisKKyAgLy8vIFxicmllZiBUaGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gZm9yIG1hdGVyaWFsaXppbmcgY29uc3RhbnRzCisgIC8vLyBmb3IgdXNlIGluIHRoZSBjdXJyZW50IGJsb2NrLiBJdCByZXNldHMgdG8gRW1pdFN0YXJ0UHQgd2hlbiBpdCBtYWtlcyBzZW5zZQorICAvLy8gKGZvciBleGFtcGxlLCBpdCdzIHVzdWFsbHkgcHJvZml0YWJsZSB0byBhdm9pZCBmdW5jdGlvbiBjYWxscyBiZXR3ZWVuIHRoZQorICAvLy8gZGVmaW5pdGlvbiBhbmQgdGhlIHVzZSkKKyAgTWFjaGluZUluc3RyICpMYXN0TG9jYWxWYWx1ZTsKKworICAvLy8gXGJyaWVmIFRoZSB0b3AgbW9zdCBpbnN0cnVjdGlvbiBpbiB0aGUgY3VycmVudCBibG9jayB0aGF0IGlzIGFsbG93ZWQgZm9yCisgIC8vLyBlbWl0dGluZyBsb2NhbCB2YXJpYWJsZXMuIExhc3RMb2NhbFZhbHVlIHJlc2V0cyB0byBFbWl0U3RhcnRQdCB3aGVuIGl0CisgIC8vLyBtYWtlcyBzZW5zZSAoZm9yIGV4YW1wbGUsIG9uIGZ1bmN0aW9uIGNhbGxzKQorICBNYWNoaW5lSW5zdHIgKkVtaXRTdGFydFB0OworCitwdWJsaWM6CisgIHZpcnR1YWwgfkZhc3RJU2VsKCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IGluc3RydWN0aW9uIGVtaXR0ZWQgZm9yCisgIC8vLyBtYXRlcmlhbGl6aW5nIGNvbnN0YW50cyBmb3IgdXNlIGluIHRoZSBjdXJyZW50IGJsb2NrLgorICBNYWNoaW5lSW5zdHIgKmdldExhc3RMb2NhbFZhbHVlKCkgeyByZXR1cm4gTGFzdExvY2FsVmFsdWU7IH0KKworICAvLy8gXGJyaWVmIFVwZGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gZW1pdHRlZCBmb3IKKyAgLy8vIG1hdGVyaWFsaXppbmcgY29uc3RhbnRzIGZvciB1c2UgaW4gdGhlIGN1cnJlbnQgYmxvY2suCisgIHZvaWQgc2V0TGFzdExvY2FsVmFsdWUoTWFjaGluZUluc3RyICpJKSB7CisgICAgRW1pdFN0YXJ0UHQgPSBJOworICAgIExhc3RMb2NhbFZhbHVlID0gSTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBjdXJyZW50IGJsb2NrIHRvIHdoaWNoIGdlbmVyYXRlZCBtYWNoaW5lIGluc3RydWN0aW9ucyB3aWxsCisgIC8vLyBiZSBhcHBlbmRlZC4KKyAgdm9pZCBzdGFydE5ld0Jsb2NrKCk7CisKKyAgLy8vIEZsdXNoIHRoZSBsb2NhbCB2YWx1ZSBtYXAgYW5kIHNpbmsgbG9jYWwgdmFsdWVzIGlmIHBvc3NpYmxlLgorICB2b2lkIGZpbmlzaEJhc2ljQmxvY2soKTsKKworICAvLy8gXGJyaWVmIFJldHVybiBjdXJyZW50IGRlYnVnIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorICBEZWJ1Z0xvYyBnZXRDdXJEZWJ1Z0xvYygpIGNvbnN0IHsgcmV0dXJuIERiZ0xvYzsgfQorCisgIC8vLyBcYnJpZWYgRG8gImZhc3QiIGluc3RydWN0aW9uIHNlbGVjdGlvbiBmb3IgZnVuY3Rpb24gYXJndW1lbnRzIGFuZCBhcHBlbmQKKyAgLy8vIHRoZSBtYWNoaW5lIGluc3RydWN0aW9ucyB0byB0aGUgY3VycmVudCBibG9jay4gUmV0dXJucyB0cnVlIHdoZW4KKyAgLy8vIHN1Y2Nlc3NmdWwuCisgIGJvb2wgbG93ZXJBcmd1bWVudHMoKTsKKworICAvLy8gXGJyaWVmIERvICJmYXN0IiBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gZm9yIHRoZSBnaXZlbiBMTFZNIElSIGluc3RydWN0aW9uCisgIC8vLyBhbmQgYXBwZW5kIHRoZSBnZW5lcmF0ZWQgbWFjaGluZSBpbnN0cnVjdGlvbnMgdG8gdGhlIGN1cnJlbnQgYmxvY2suCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgc2VsZWN0aW9uIHdhcyBzdWNjZXNzZnVsLgorICBib29sIHNlbGVjdEluc3RydWN0aW9uKGNvbnN0IEluc3RydWN0aW9uICpJKTsKKworICAvLy8gXGJyaWVmIERvICJmYXN0IiBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gZm9yIHRoZSBnaXZlbiBMTFZNIElSIG9wZXJhdG9yCisgIC8vLyAoSW5zdHJ1Y3Rpb24gb3IgQ29uc3RhbnRFeHByKSwgYW5kIGFwcGVuZCBnZW5lcmF0ZWQgbWFjaGluZSBpbnN0cnVjdGlvbnMKKyAgLy8vIHRvIHRoZSBjdXJyZW50IGJsb2NrLiBSZXR1cm4gdHJ1ZSBpZiBzZWxlY3Rpb24gd2FzIHN1Y2Nlc3NmdWwuCisgIGJvb2wgc2VsZWN0T3BlcmF0b3IoY29uc3QgVXNlciAqSSwgdW5zaWduZWQgT3Bjb2RlKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIHZpcnR1YWwgcmVnaXN0ZXIgYW5kIGFycmFuZ2UgZm9yIGl0IHRvIGJlIGFzc2lnbmVkIHRoZQorICAvLy8gdmFsdWUgZm9yIHRoZSBnaXZlbiBMTFZNIHZhbHVlLgorICB1bnNpZ25lZCBnZXRSZWdGb3JWYWx1ZShjb25zdCBWYWx1ZSAqVik7CisKKyAgLy8vIFxicmllZiBMb29rIHVwIHRoZSB2YWx1ZSB0byBzZWUgaWYgaXRzIHZhbHVlIGlzIGFscmVhZHkgY2FjaGVkIGluIGEKKyAgLy8vIHJlZ2lzdGVyLiBJdCBtYXkgYmUgZGVmaW5lZCBieSBpbnN0cnVjdGlvbnMgYWNyb3NzIGJsb2NrcyBvciBkZWZpbmVkCisgIC8vLyBsb2NhbGx5LgorICB1bnNpZ25lZCBsb29rVXBSZWdGb3JWYWx1ZShjb25zdCBWYWx1ZSAqVik7CisKKyAgLy8vIFxicmllZiBUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgZ2V0UmVnRm9yVmFsdWUgdGhhdCBhbHNvIHRha2VzIGNhcmUgb2YKKyAgLy8vIHRydW5jYXRpbmcgb3Igc2lnbi1leHRlbmRpbmcgdGhlIGdpdmVuIGdldGVsZW1lbnRwdHIgaW5kZXggdmFsdWUuCisgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgYm9vbD4gZ2V0UmVnRm9yR0VQSW5kZXgoY29uc3QgVmFsdWUgKlYpOworCisgIC8vLyBcYnJpZWYgV2UncmUgY2hlY2tpbmcgdG8gc2VlIGlmIHdlIGNhbiBmb2xkIFxwIExJIGludG8gXHAgRm9sZEluc3QuIE5vdGUKKyAgLy8vIHRoYXQgd2UgY291bGQgaGF2ZSBhIHNlcXVlbmNlIHdoZXJlIG11bHRpcGxlIExMVk0gSVIgaW5zdHJ1Y3Rpb25zIGFyZQorICAvLy8gZm9sZGVkIGludG8gdGhlIHNhbWUgbWFjaGluZWluc3RyLiAgRm9yIGV4YW1wbGUgd2UgY291bGQgaGF2ZToKKyAgLy8vCisgIC8vLyAgIEE6IHggPSBsb2FkIGkzMiAqUAorICAvLy8gICBCOiB5ID0gaWNtcCBBLCA0MgorICAvLy8gICBDOiBiciB5LCAuLi4KKyAgLy8vCisgIC8vLyBJbiB0aGlzIHNjZW5hcmlvLCBccCBMSSBpcyAiQSIsIGFuZCBccCBGb2xkSW5zdCBpcyAiQyIuICBXZSBrbm93IGFib3V0ICJCIgorICAvLy8gKGFuZCBhbnkgb3RoZXIgZm9sZGVkIGluc3RydWN0aW9ucykgYmVjYXVzZSBpdCBpcyBiZXR3ZWVuIEEgYW5kIEMuCisgIC8vLworICAvLy8gSWYgd2Ugc3VjY2VlZCBmb2xkaW5nLCByZXR1cm4gdHJ1ZS4KKyAgYm9vbCB0cnlUb0ZvbGRMb2FkKGNvbnN0IExvYWRJbnN0ICpMSSwgY29uc3QgSW5zdHJ1Y3Rpb24gKkZvbGRJbnN0KTsKKworICAvLy8gXGJyaWVmIFRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0ciBvcGVyYW5kIGlzIGEgdnJlZywgYW5kIHRoYXQgdnJlZyBpcworICAvLy8gYmVpbmcgcHJvdmlkZWQgYnkgdGhlIHNwZWNpZmllZCBsb2FkIGluc3RydWN0aW9uLiAgSWYgcG9zc2libGUsIHRyeSB0bworICAvLy8gZm9sZCB0aGUgbG9hZCBhcyBhbiBvcGVyYW5kIHRvIHRoZSBpbnN0cnVjdGlvbiwgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8vIHBvc3NpYmxlLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB0YXJnZXRzLgorICB2aXJ0dWFsIGJvb2wgdHJ5VG9Gb2xkTG9hZEludG9NSShNYWNoaW5lSW5zdHIgKiAvKk1JKi8sIHVuc2lnbmVkIC8qT3BObyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2FkSW5zdCAqIC8qTEkqLykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVzZXQgSW5zZXJ0UHQgdG8gcHJlcGFyZSBmb3IgaW5zZXJ0aW5nIGluc3RydWN0aW9ucyBpbnRvIHRoZQorICAvLy8gY3VycmVudCBibG9jay4KKyAgdm9pZCByZWNvbXB1dGVJbnNlcnRQdCgpOworCisgIC8vLyBcYnJpZWYgUmVtb3ZlIGFsbCBkZWFkIGluc3RydWN0aW9ucyBiZXR3ZWVuIHRoZSBJIGFuZCBFLgorICB2b2lkIHJlbW92ZURlYWRDb2RlKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBFKTsKKworICBzdHJ1Y3QgU2F2ZVBvaW50IHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UHQ7CisgICAgRGVidWdMb2MgREw7CisgIH07CisKKyAgLy8vIFxicmllZiBQcmVwYXJlIEluc2VydFB0IHRvIGJlZ2luIGluc2VydGluZyBpbnN0cnVjdGlvbnMgaW50byB0aGUgbG9jYWwKKyAgLy8vIHZhbHVlIGFyZWEgYW5kIHJldHVybiB0aGUgb2xkIGluc2VydCBwb3NpdGlvbi4KKyAgU2F2ZVBvaW50IGVudGVyTG9jYWxWYWx1ZUFyZWEoKTsKKworICAvLy8gXGJyaWVmIFJlc2V0IEluc2VydFB0IHRvIHRoZSBnaXZlbiBvbGQgaW5zZXJ0IHBvc2l0aW9uLgorICB2b2lkIGxlYXZlTG9jYWxWYWx1ZUFyZWEoU2F2ZVBvaW50IE9sZCk7CisKK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgRmFzdElTZWwoRnVuY3Rpb25Mb3dlcmluZ0luZm8gJkZ1bmNJbmZvLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqTGliSW5mbywKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBTa2lwVGFyZ2V0SW5kZXBlbmRlbnRJU2VsID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRhcmdldC1pbmRlcGVuZGVudCBjb2RlIHdoZW4gdGhlIG5vcm1hbAorICAvLy8gRmFzdElTZWwgcHJvY2VzcyBmYWlscyB0byBzZWxlY3QgYW4gaW5zdHJ1Y3Rpb24uIFRoaXMgZ2l2ZXMgdGFyZ2V0cyBhCisgIC8vLyBjaGFuY2UgdG8gZW1pdCBjb2RlIGZvciBhbnl0aGluZyB0aGF0IGRvZXNuJ3QgZml0IGludG8gRmFzdElTZWwncworICAvLy8gZnJhbWV3b3JrLiBJdCByZXR1cm5zIHRydWUgaWYgaXQgd2FzIHN1Y2Nlc3NmdWwuCisgIHZpcnR1YWwgYm9vbCBmYXN0U2VsZWN0SW5zdHJ1Y3Rpb24oY29uc3QgSW5zdHJ1Y3Rpb24gKkkpID0gMDsKKworICAvLy8gXGJyaWVmIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0YXJnZXQtaW5kZXBlbmRlbnQgY29kZSB0byBkbyB0YXJnZXQtCisgIC8vLyBzcGVjaWZpYyBhcmd1bWVudCBsb3dlcmluZy4gSXQgcmV0dXJucyB0cnVlIGlmIGl0IHdhcyBzdWNjZXNzZnVsLgorICB2aXJ0dWFsIGJvb2wgZmFzdExvd2VyQXJndW1lbnRzKCk7CisKKyAgLy8vIFxicmllZiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGFyZ2V0LWluZGVwZW5kZW50IGNvZGUgdG8gZG8gdGFyZ2V0LQorICAvLy8gc3BlY2lmaWMgY2FsbCBsb3dlcmluZy4gSXQgcmV0dXJucyB0cnVlIGlmIGl0IHdhcyBzdWNjZXNzZnVsLgorICB2aXJ0dWFsIGJvb2wgZmFzdExvd2VyQ2FsbChDYWxsTG93ZXJpbmdJbmZvICZDTEkpOworCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRhcmdldC1pbmRlcGVuZGVudCBjb2RlIHRvIGRvIHRhcmdldC0KKyAgLy8vIHNwZWNpZmljIGludHJpbnNpYyBsb3dlcmluZy4gSXQgcmV0dXJucyB0cnVlIGlmIGl0IHdhcyBzdWNjZXNzZnVsLgorICB2aXJ0dWFsIGJvb2wgZmFzdExvd2VySW50cmluc2ljQ2FsbChjb25zdCBJbnRyaW5zaWNJbnN0ICpJSSk7CisKKyAgLy8vIFxicmllZiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGFyZ2V0LWluZGVwZW5kZW50IGNvZGUgdG8gcmVxdWVzdCB0aGF0IGFuCisgIC8vLyBpbnN0cnVjdGlvbiB3aXRoIHRoZSBnaXZlbiB0eXBlIGFuZCBvcGNvZGUgYmUgZW1pdHRlZC4KKyAgdmlydHVhbCB1bnNpZ25lZCBmYXN0RW1pdF8oTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wY29kZSk7CisKKyAgLy8vIFxicmllZiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGFyZ2V0LWluZGVwZW5kZW50IGNvZGUgdG8gcmVxdWVzdCB0aGF0IGFuCisgIC8vLyBpbnN0cnVjdGlvbiB3aXRoIHRoZSBnaXZlbiB0eXBlLCBvcGNvZGUsIGFuZCByZWdpc3RlciBvcGVyYW5kIGJlIGVtaXR0ZWQuCisgIHZpcnR1YWwgdW5zaWduZWQgZmFzdEVtaXRfcihNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3Bjb2RlLCB1bnNpZ25lZCBPcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9wMElzS2lsbCk7CisKKyAgLy8vIFxicmllZiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGFyZ2V0LWluZGVwZW5kZW50IGNvZGUgdG8gcmVxdWVzdCB0aGF0IGFuCisgIC8vLyBpbnN0cnVjdGlvbiB3aXRoIHRoZSBnaXZlbiB0eXBlLCBvcGNvZGUsIGFuZCByZWdpc3RlciBvcGVyYW5kcyBiZSBlbWl0dGVkLgorICB2aXJ0dWFsIHVuc2lnbmVkIGZhc3RFbWl0X3JyKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcGNvZGUsIHVuc2lnbmVkIE9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9wMElzS2lsbCwgdW5zaWduZWQgT3AxLCBib29sIE9wMUlzS2lsbCk7CisKKyAgLy8vIFxicmllZiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGFyZ2V0LWluZGVwZW5kZW50IGNvZGUgdG8gcmVxdWVzdCB0aGF0IGFuCisgIC8vLyBpbnN0cnVjdGlvbiB3aXRoIHRoZSBnaXZlbiB0eXBlLCBvcGNvZGUsIGFuZCByZWdpc3RlciBhbmQgaW1tZWRpYXRlCisgIC8vLyBvcGVyYW5kcyBiZSBlbWl0dGVkLgorICB2aXJ0dWFsIHVuc2lnbmVkIGZhc3RFbWl0X3JpKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcGNvZGUsIHVuc2lnbmVkIE9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9wMElzS2lsbCwgdWludDY0X3QgSW1tKTsKKworICAvLy8gXGJyaWVmIFRoaXMgbWV0aG9kIGlzIGEgd3JhcHBlciBvZiBmYXN0RW1pdF9yaS4KKyAgLy8vCisgIC8vLyBJdCBmaXJzdCB0cmllcyB0byBlbWl0IGFuIGluc3RydWN0aW9uIHdpdGggYW4gaW1tZWRpYXRlIG9wZXJhbmQgdXNpbmcKKyAgLy8vIGZhc3RFbWl0X3JpLiAgSWYgdGhhdCBmYWlscywgaXQgbWF0ZXJpYWxpemVzIHRoZSBpbW1lZGlhdGUgaW50byBhIHJlZ2lzdGVyCisgIC8vLyBhbmQgdHJ5IGZhc3RFbWl0X3JyIGluc3RlYWQuCisgIHVuc2lnbmVkIGZhc3RFbWl0X3JpXyhNVlQgVlQsIHVuc2lnbmVkIE9wY29kZSwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEltbSwgTVZUIEltbVR5cGUpOworCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRhcmdldC1pbmRlcGVuZGVudCBjb2RlIHRvIHJlcXVlc3QgdGhhdCBhbgorICAvLy8gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgZ2l2ZW4gdHlwZSwgb3Bjb2RlLCBhbmQgaW1tZWRpYXRlIG9wZXJhbmQgYmUgZW1pdHRlZC4KKyAgdmlydHVhbCB1bnNpZ25lZCBmYXN0RW1pdF9pKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcGNvZGUsIHVpbnQ2NF90IEltbSk7CisKKyAgLy8vIFxicmllZiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGFyZ2V0LWluZGVwZW5kZW50IGNvZGUgdG8gcmVxdWVzdCB0aGF0IGFuCisgIC8vLyBpbnN0cnVjdGlvbiB3aXRoIHRoZSBnaXZlbiB0eXBlLCBvcGNvZGUsIGFuZCBmbG9hdGluZy1wb2ludCBpbW1lZGlhdGUKKyAgLy8vIG9wZXJhbmQgYmUgZW1pdHRlZC4KKyAgdmlydHVhbCB1bnNpZ25lZCBmYXN0RW1pdF9mKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25zdGFudEZQICpGUEltbSk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgTWFjaGluZUluc3RyIHdpdGggbm8gb3BlcmFuZHMgYW5kIGEgcmVzdWx0IHJlZ2lzdGVyIGluIHRoZQorICAvLy8gZ2l2ZW4gcmVnaXN0ZXIgY2xhc3MuCisgIHVuc2lnbmVkIGZhc3RFbWl0SW5zdF8odW5zaWduZWQgTWFjaGluZUluc3RPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIE1hY2hpbmVJbnN0ciB3aXRoIG9uZSByZWdpc3RlciBvcGVyYW5kIGFuZCBhIHJlc3VsdCByZWdpc3RlcgorICAvLy8gaW4gdGhlIGdpdmVuIHJlZ2lzdGVyIGNsYXNzLgorICB1bnNpZ25lZCBmYXN0RW1pdEluc3Rfcih1bnNpZ25lZCBNYWNoaW5lSW5zdE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsIHVuc2lnbmVkIE9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPcDBJc0tpbGwpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIE1hY2hpbmVJbnN0ciB3aXRoIHR3byByZWdpc3RlciBvcGVyYW5kcyBhbmQgYSByZXN1bHQKKyAgLy8vIHJlZ2lzdGVyIGluIHRoZSBnaXZlbiByZWdpc3RlciBjbGFzcy4KKyAgdW5zaWduZWQgZmFzdEVtaXRJbnN0X3JyKHVuc2lnbmVkIE1hY2hpbmVJbnN0T3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsIHVuc2lnbmVkIE9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKTsKKworICAvLy8gXGJyaWVmIEVtaXQgYSBNYWNoaW5lSW5zdHIgd2l0aCB0aHJlZSByZWdpc3RlciBvcGVyYW5kcyBhbmQgYSByZXN1bHQKKyAgLy8vIHJlZ2lzdGVyIGluIHRoZSBnaXZlbiByZWdpc3RlciBjbGFzcy4KKyAgdW5zaWduZWQgZmFzdEVtaXRJbnN0X3Jycih1bnNpZ25lZCBNYWNoaW5lSW5zdE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywgdW5zaWduZWQgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wMiwgYm9vbCBPcDJJc0tpbGwpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIE1hY2hpbmVJbnN0ciB3aXRoIGEgcmVnaXN0ZXIgb3BlcmFuZCwgYW4gaW1tZWRpYXRlLCBhbmQgYQorICAvLy8gcmVzdWx0IHJlZ2lzdGVyIGluIHRoZSBnaXZlbiByZWdpc3RlciBjbGFzcy4KKyAgdW5zaWduZWQgZmFzdEVtaXRJbnN0X3JpKHVuc2lnbmVkIE1hY2hpbmVJbnN0T3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsIHVuc2lnbmVkIE9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT3AwSXNLaWxsLCB1aW50NjRfdCBJbW0pOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIE1hY2hpbmVJbnN0ciB3aXRoIG9uZSByZWdpc3RlciBvcGVyYW5kIGFuZCB0d28gaW1tZWRpYXRlCisgIC8vLyBvcGVyYW5kcy4KKyAgdW5zaWduZWQgZmFzdEVtaXRJbnN0X3JpaSh1bnNpZ25lZCBNYWNoaW5lSW5zdE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywgdW5zaWduZWQgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT3AwSXNLaWxsLCB1aW50NjRfdCBJbW0xLCB1aW50NjRfdCBJbW0yKTsKKworICAvLy8gXGJyaWVmIEVtaXQgYSBNYWNoaW5lSW5zdHIgd2l0aCBhIGZsb2F0aW5nIHBvaW50IGltbWVkaWF0ZSwgYW5kIGEgcmVzdWx0CisgIC8vLyByZWdpc3RlciBpbiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgY2xhc3MuCisgIHVuc2lnbmVkIGZhc3RFbWl0SW5zdF9mKHVuc2lnbmVkIE1hY2hpbmVJbnN0T3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uc3RhbnRGUCAqRlBJbW0pOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIE1hY2hpbmVJbnN0ciB3aXRoIHR3byByZWdpc3RlciBvcGVyYW5kcywgYW4gaW1tZWRpYXRlLCBhbmQgYQorICAvLy8gcmVzdWx0IHJlZ2lzdGVyIGluIHRoZSBnaXZlbiByZWdpc3RlciBjbGFzcy4KKyAgdW5zaWduZWQgZmFzdEVtaXRJbnN0X3JyaSh1bnNpZ25lZCBNYWNoaW5lSW5zdE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywgdW5zaWduZWQgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEltbSk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgTWFjaGluZUluc3RyIHdpdGggYSBzaW5nbGUgaW1tZWRpYXRlIG9wZXJhbmQsIGFuZCBhIHJlc3VsdAorICAvLy8gcmVnaXN0ZXIgaW4gdGhlIGdpdmVuIHJlZ2lzdGVyIGNsYXNzLgorICB1bnNpZ25lZCBmYXN0RW1pdEluc3RfaSh1bnNpZ25lZCBNYWNoaW5lSW5zdHJPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLCB1aW50NjRfdCBJbW0pOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIE1hY2hpbmVJbnN0ciBmb3IgYW4gZXh0cmFjdF9zdWJyZWcgZnJvbSBhIHNwZWNpZmllZCBpbmRleCBvZgorICAvLy8gYSBzdXBlcnJlZ2lzdGVyIHRvIGEgc3BlY2lmaWVkIHR5cGUuCisgIHVuc2lnbmVkIGZhc3RFbWl0SW5zdF9leHRyYWN0c3VicmVnKE1WVCBSZXRWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSWR4KTsKKworICAvLy8gXGJyaWVmIEVtaXQgTWFjaGluZUluc3RycyB0byBjb21wdXRlIHRoZSB2YWx1ZSBvZiBPcCB3aXRoIGFsbCBidXQgdGhlCisgIC8vLyBsZWFzdCBzaWduaWZpY2FudCBiaXQgc2V0IHRvIHplcm8uCisgIHVuc2lnbmVkIGZhc3RFbWl0WkV4dEZyb21JMShNVlQgVlQsIHVuc2lnbmVkIE9wMCwgYm9vbCBPcDBJc0tpbGwpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCB0byB0aGUgZ2l2ZW4gYmxvY2ssIHVubGVzcyBpdCBpcyB0aGUKKyAgLy8vIGltbWVkaWF0ZSAoZmFsbC10aHJvdWdoKSBzdWNjZXNzb3IsIGFuZCB1cGRhdGUgdGhlIENGRy4KKyAgdm9pZCBmYXN0RW1pdEJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAqTUJCLCBjb25zdCBEZWJ1Z0xvYyAmREwpOworCisgIC8vLyBFbWl0IGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIHRvIFxwIEZhbHNlTUJCLCBvYnRhaW5zIHRoZSBicmFuY2ggd2VpZ2h0CisgIC8vLyBhbmQgYWRkcyBUcnVlTUJCIGFuZCBGYWxzZU1CQiB0byB0aGUgc3VjY2Vzc29yIGxpc3QuCisgIHZvaWQgZmluaXNoQ29uZEJyYW5jaChjb25zdCBCYXNpY0Jsb2NrICpCcmFuY2hCQiwgTWFjaGluZUJhc2ljQmxvY2sgKlRydWVNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRmFsc2VNQkIpOworCisgIC8vLyBcYnJpZWYgVXBkYXRlIHRoZSB2YWx1ZSBtYXAgdG8gaW5jbHVkZSB0aGUgbmV3IG1hcHBpbmcgZm9yIHRoaXMKKyAgLy8vIGluc3RydWN0aW9uLCBvciBpbnNlcnQgYW4gZXh0cmEgY29weSB0byBnZXQgdGhlIHJlc3VsdCBpbiBhIHByZXZpb3VzCisgIC8vLyBkZXRlcm1pbmVkIHJlZ2lzdGVyLgorICAvLy8KKyAgLy8vIE5PVEU6IFRoaXMgaXMgb25seSBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBtaWdodCBzZWxlY3QgYSBibG9jayB0aGF0IHVzZXMgYQorICAvLy8gdmFsdWUgYmVmb3JlIHdlIHNlbGVjdCB0aGUgYmxvY2sgdGhhdCBkZWZpbmVzIHRoZSB2YWx1ZS4gSXQgbWlnaHQgYmUKKyAgLy8vIHBvc3NpYmxlIHRvIGZpeCB0aGlzIGJ5IHNlbGVjdGluZyBibG9ja3MgaW4gcmV2ZXJzZSBwb3N0b3JkZXIuCisgIHZvaWQgdXBkYXRlVmFsdWVNYXAoY29uc3QgVmFsdWUgKkksIHVuc2lnbmVkIFJlZywgdW5zaWduZWQgTnVtUmVncyA9IDEpOworCisgIHVuc2lnbmVkIGNyZWF0ZVJlc3VsdFJlZyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyk7CisKKyAgLy8vIFxicmllZiBUcnkgdG8gY29uc3RyYWluIE9wIHNvIHRoYXQgaXQgaXMgdXNhYmxlIGJ5IGFyZ3VtZW50IE9wTnVtIG9mIHRoZQorICAvLy8gcHJvdmlkZWQgTUNJbnN0ckRlc2MuIElmIHRoaXMgZmFpbHMsIGNyZWF0ZSBhIG5ldyB2aXJ0dWFsIHJlZ2lzdGVyIGluIHRoZQorICAvLy8gY29ycmVjdCBjbGFzcyBhbmQgQ09QWSB0aGUgdmFsdWUgdGhlcmUuCisgIHVuc2lnbmVkIGNvbnN0cmFpbk9wZXJhbmRSZWdDbGFzcyhjb25zdCBNQ0luc3RyRGVzYyAmSUksIHVuc2lnbmVkIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BOdW0pOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIGNvbnN0YW50IGluIGEgcmVnaXN0ZXIgdXNpbmcgdGFyZ2V0LXNwZWNpZmljIGxvZ2ljLCBzdWNoIGFzCisgIC8vLyBjb25zdGFudCBwb29sIGxvYWRzLgorICB2aXJ0dWFsIHVuc2lnbmVkIGZhc3RNYXRlcmlhbGl6ZUNvbnN0YW50KGNvbnN0IENvbnN0YW50ICpDKSB7IHJldHVybiAwOyB9CisKKyAgLy8vIFxicmllZiBFbWl0IGFuIGFsbG9jYSBhZGRyZXNzIGluIGEgcmVnaXN0ZXIgdXNpbmcgdGFyZ2V0LXNwZWNpZmljIGxvZ2ljLgorICB2aXJ0dWFsIHVuc2lnbmVkIGZhc3RNYXRlcmlhbGl6ZUFsbG9jYShjb25zdCBBbGxvY2FJbnN0ICpDKSB7IHJldHVybiAwOyB9CisKKyAgLy8vIFxicmllZiBFbWl0IHRoZSBmbG9hdGluZy1wb2ludCBjb25zdGFudCArMC4wIGluIGEgcmVnaXN0ZXIgdXNpbmcgdGFyZ2V0LQorICAvLy8gc3BlY2lmaWMgbG9naWMuCisgIHZpcnR1YWwgdW5zaWduZWQgZmFzdE1hdGVyaWFsaXplRmxvYXRaZXJvKGNvbnN0IENvbnN0YW50RlAgKkNGKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gXGJyaWVmIENoZWNrIGlmIFxjIEFkZCBpcyBhbiBhZGQgdGhhdCBjYW4gYmUgc2FmZWx5IGZvbGRlZCBpbnRvIFxjIEdFUC4KKyAgLy8vCisgIC8vLyBcYyBBZGQgY2FuIGJlIGZvbGRlZCBpbnRvIFxjIEdFUCBpZjoKKyAgLy8vIC0gXGMgQWRkIGlzIGFuIGFkZCwKKyAgLy8vIC0gXGMgQWRkJ3Mgc2l6ZSBtYXRjaGVzIFxjIEdFUCdzLAorICAvLy8gLSBcYyBBZGQgaXMgaW4gdGhlIHNhbWUgYmFzaWMgYmxvY2sgYXMgXGMgR0VQLCBhbmQKKyAgLy8vIC0gXGMgQWRkIGhhcyBhIGNvbnN0YW50IG9wZXJhbmQuCisgIGJvb2wgY2FuRm9sZEFkZEludG9HRVAoY29uc3QgVXNlciAqR0VQLCBjb25zdCBWYWx1ZSAqQWRkKTsKKworICAvLy8gXGJyaWVmIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaGFzIGV4YWN0bHkgb25lIHVzZS4KKyAgYm9vbCBoYXNUcml2aWFsS2lsbChjb25zdCBWYWx1ZSAqVik7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBtYWNoaW5lIG1lbSBvcGVyYW5kIGZyb20gdGhlIGdpdmVuIGluc3RydWN0aW9uLgorICBNYWNoaW5lTWVtT3BlcmFuZCAqY3JlYXRlTWFjaGluZU1lbU9wZXJhbmRGb3IoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0OworCisgIENtcEluc3Q6OlByZWRpY2F0ZSBvcHRpbWl6ZUNtcFByZWRpY2F0ZShjb25zdCBDbXBJbnN0ICpDSSkgY29uc3Q7CisKKyAgYm9vbCBsb3dlckNhbGxUbyhjb25zdCBDYWxsSW5zdCAqQ0ksIE1DU3ltYm9sICpTeW1ib2wsIHVuc2lnbmVkIE51bUFyZ3MpOworICBib29sIGxvd2VyQ2FsbFRvKGNvbnN0IENhbGxJbnN0ICpDSSwgY29uc3QgY2hhciAqU3ltYm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1BcmdzKTsKKyAgYm9vbCBsb3dlckNhbGxUbyhDYWxsTG93ZXJpbmdJbmZvICZDTEkpOworCisgIGJvb2wgaXNDb21tdXRhdGl2ZUludHJpbnNpYyhJbnRyaW5zaWNJbnN0IGNvbnN0ICpJSSkgeworICAgIHN3aXRjaCAoSUktPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICBjYXNlIEludHJpbnNpYzo6c2FkZF93aXRoX292ZXJmbG93OgorICAgIGNhc2UgSW50cmluc2ljOjp1YWRkX3dpdGhfb3ZlcmZsb3c6CisgICAgY2FzZSBJbnRyaW5zaWM6OnNtdWxfd2l0aF9vdmVyZmxvdzoKKyAgICBjYXNlIEludHJpbnNpYzo6dW11bF93aXRoX292ZXJmbG93OgorICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBib29sIGxvd2VyQ2FsbChjb25zdCBDYWxsSW5zdCAqSSk7CisgIC8vLyBcYnJpZWYgU2VsZWN0IGFuZCBlbWl0IGNvZGUgZm9yIGEgYmluYXJ5IG9wZXJhdG9yIGluc3RydWN0aW9uLCB3aGljaCBoYXMKKyAgLy8vIGFuIG9wY29kZSB3aGljaCBkaXJlY3RseSBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gSVNEIG9wY29kZS4KKyAgYm9vbCBzZWxlY3RCaW5hcnlPcChjb25zdCBVc2VyICpJLCB1bnNpZ25lZCBJU0RPcGNvZGUpOworICBib29sIHNlbGVjdEZOZWcoY29uc3QgVXNlciAqSSk7CisgIGJvb2wgc2VsZWN0R2V0RWxlbWVudFB0cihjb25zdCBVc2VyICpJKTsKKyAgYm9vbCBzZWxlY3RTdGFja21hcChjb25zdCBDYWxsSW5zdCAqSSk7CisgIGJvb2wgc2VsZWN0UGF0Y2hwb2ludChjb25zdCBDYWxsSW5zdCAqSSk7CisgIGJvb2wgc2VsZWN0Q2FsbChjb25zdCBVc2VyICpDYWxsKTsKKyAgYm9vbCBzZWxlY3RJbnRyaW5zaWNDYWxsKGNvbnN0IEludHJpbnNpY0luc3QgKklJKTsKKyAgYm9vbCBzZWxlY3RCaXRDYXN0KGNvbnN0IFVzZXIgKkkpOworICBib29sIHNlbGVjdENhc3QoY29uc3QgVXNlciAqSSwgdW5zaWduZWQgT3Bjb2RlKTsKKyAgYm9vbCBzZWxlY3RFeHRyYWN0VmFsdWUoY29uc3QgVXNlciAqSSk7CisgIGJvb2wgc2VsZWN0SW5zZXJ0VmFsdWUoY29uc3QgVXNlciAqSSk7CisgIGJvb2wgc2VsZWN0WFJheUN1c3RvbUV2ZW50KGNvbnN0IENhbGxJbnN0ICpJSSk7CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgSGFuZGxlIFBISSBub2RlcyBpbiBzdWNjZXNzb3IgYmxvY2tzLgorICAvLy8KKyAgLy8vIEVtaXQgY29kZSB0byBlbnN1cmUgY29uc3RhbnRzIGFyZSBjb3BpZWQgaW50byByZWdpc3RlcnMgd2hlbiBuZWVkZWQuCisgIC8vLyBSZW1lbWJlciB0aGUgdmlydHVhbCByZWdpc3RlcnMgdGhhdCBuZWVkIHRvIGJlIGFkZGVkIHRvIHRoZSBNYWNoaW5lIFBISQorICAvLy8gbm9kZXMgYXMgaW5wdXQuICBXZSBjYW5ub3QganVzdCBkaXJlY3RseSBhZGQgdGhlbSwgYmVjYXVzZSBleHBhbnNpb24gbWlnaHQKKyAgLy8vIHJlc3VsdCBpbiBtdWx0aXBsZSBNQkIncyBmb3Igb25lIEJCLiAgQXMgc3VjaCwgdGhlIHN0YXJ0IG9mIHRoZSBCQiBtaWdodAorICAvLy8gY29ycmVzcG9uZCB0byBhIGRpZmZlcmVudCBNQkIgdGhhbiB0aGUgZW5kLgorICBib29sIGhhbmRsZVBISU5vZGVzSW5TdWNjZXNzb3JCbG9ja3MoY29uc3QgQmFzaWNCbG9jayAqTExWTUJCKTsKKworICAvLy8gXGJyaWVmIEhlbHBlciBmb3IgbWF0ZXJpYWxpemVSZWdGb3JWYWx1ZSB0byBtYXRlcmlhbGl6ZSBhIGNvbnN0YW50IGluIGEKKyAgLy8vIHRhcmdldC1pbmRlcGVuZGVudCB3YXkuCisgIHVuc2lnbmVkIG1hdGVyaWFsaXplQ29uc3RhbnQoY29uc3QgVmFsdWUgKlYsIE1WVCBWVCk7CisKKyAgLy8vIFxicmllZiBIZWxwZXIgZm9yIGdldFJlZ0ZvclZhbGUuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHZhbHVlCisgIC8vLyBpc24ndCBhbHJlYWR5IGF2YWlsYWJsZSBpbiBhIHJlZ2lzdGVyIGFuZCBtdXN0IGJlIG1hdGVyaWFsaXplZCB3aXRoIG5ldworICAvLy8gaW5zdHJ1Y3Rpb25zLgorICB1bnNpZ25lZCBtYXRlcmlhbGl6ZVJlZ0ZvclZhbHVlKGNvbnN0IFZhbHVlICpWLCBNVlQgVlQpOworCisgIC8vLyBcYnJpZWYgQ2xlYXJzIExvY2FsVmFsdWVNYXAgYW5kIG1vdmVzIHRoZSBhcmVhIGZvciB0aGUgbmV3IGxvY2FsIHZhcmlhYmxlcworICAvLy8gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2suIEl0IGhlbHBzIHRvIGF2b2lkIHNwaWxsaW5nIGNhY2hlZCB2YXJpYWJsZXMKKyAgLy8vIGFjcm9zcyBoZWF2eSBpbnN0cnVjdGlvbnMgbGlrZSBjYWxscy4KKyAgdm9pZCBmbHVzaExvY2FsVmFsdWVNYXAoKTsKKworICAvLy8gXGJyaWVmIFJlbW92ZXMgZGVhZCBsb2NhbCB2YWx1ZSBpbnN0cnVjdGlvbnMgYWZ0ZXIgU2F2ZWRMYXN0TG9jYWx2YWx1ZS4KKyAgdm9pZCByZW1vdmVEZWFkTG9jYWxWYWx1ZUNvZGUoTWFjaGluZUluc3RyICpTYXZlZExhc3RMb2NhbFZhbHVlKTsKKworICBzdHJ1Y3QgSW5zdE9yZGVyTWFwIHsKKyAgICBEZW5zZU1hcDxNYWNoaW5lSW5zdHIgKiwgdW5zaWduZWQ+IE9yZGVyczsKKyAgICBNYWNoaW5lSW5zdHIgKkZpcnN0VGVybWluYXRvciA9IG51bGxwdHI7CisgICAgdW5zaWduZWQgRmlyc3RUZXJtaW5hdG9yT3JkZXIgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCk7CisKKyAgICB2b2lkIGluaXRpYWxpemUoTWFjaGluZUJhc2ljQmxvY2sgKk1CQik7CisgIH07CisKKyAgLy8vIFNpbmtzIHRoZSBsb2NhbCB2YWx1ZSBtYXRlcmlhbGl6YXRpb24gaW5zdHJ1Y3Rpb24gTG9jYWxNSSB0byBpdHMgZmlyc3QgdXNlCisgIC8vLyBpbiB0aGUgYmFzaWMgYmxvY2ssIG9yIGRlbGV0ZXMgaXQgaWYgaXQgaXMgbm90IHVzZWQuCisgIHZvaWQgc2lua0xvY2FsVmFsdWVNYXRlcmlhbGl6YXRpb24oTWFjaGluZUluc3RyICZMb2NhbE1JLCB1bnNpZ25lZCBEZWZSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdE9yZGVyTWFwICZPcmRlck1hcCk7CisKKyAgLy8vIFxicmllZiBJbnNlcnRpb24gcG9pbnQgYmVmb3JlIHRyeWluZyB0byBzZWxlY3QgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBTYXZlZEluc2VydFB0OworCisgIC8vLyBcYnJpZWYgQWRkIGEgc3RhY2ttYXAgb3IgcGF0Y2hwb2ludCBpbnRyaW5zaWMgY2FsbCdzIGxpdmUgdmFyaWFibGUKKyAgLy8vIG9wZXJhbmRzIHRvIGEgc3RhY2ttYXAgb3IgcGF0Y2hwb2ludCBtYWNoaW5lIGluc3RydWN0aW9uLgorICBib29sIGFkZFN0YWNrTWFwTGl2ZVZhcnMoU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEluc3QgKkNJLCB1bnNpZ25lZCBTdGFydElkeCk7CisgIGJvb2wgbG93ZXJDYWxsT3BlcmFuZHMoY29uc3QgQ2FsbEluc3QgKkNJLCB1bnNpZ25lZCBBcmdJZHgsIHVuc2lnbmVkIE51bUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKkNhbGxlZSwgYm9vbCBGb3JjZVJldFZvaWRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsTG93ZXJpbmdJbmZvICZDTEkpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9GQVNUSVNFTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRmF1bHRNYXBzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRmF1bHRNYXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlMjVjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9GYXVsdE1hcHMuaApAQCAtMCwwICsxLDIxOCBAQAorLy89PT0tIEZhdWx0TWFwcy5oIC0gVGhlICJGYXVsdE1hcHMiIHNlY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fRkFVTFRNQVBTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0ZBVUxUTUFQU19ICisKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQXNtUHJpbnRlcjsKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIHJhd19vc3RyZWFtOworCitjbGFzcyBGYXVsdE1hcHMgeworcHVibGljOgorICBlbnVtIEZhdWx0S2luZCB7CisgICAgRmF1bHRpbmdMb2FkID0gMSwKKyAgICBGYXVsdGluZ0xvYWRTdG9yZSwKKyAgICBGYXVsdGluZ1N0b3JlLAorICAgIEZhdWx0S2luZE1heAorICB9OworCisgIGV4cGxpY2l0IEZhdWx0TWFwcyhBc21QcmludGVyICZBUCk7CisKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmZhdWx0VHlwZVRvU3RyaW5nKEZhdWx0S2luZCk7CisKKyAgdm9pZCByZWNvcmRGYXVsdGluZ09wKEZhdWx0S2luZCBGYXVsdFR5LCBjb25zdCBNQ1N5bWJvbCAqSGFuZGxlckxhYmVsKTsKKyAgdm9pZCBzZXJpYWxpemVUb0ZhdWx0TWFwU2VjdGlvbigpOworICB2b2lkIHJlc2V0KCkgeworICAgIEZ1bmN0aW9uSW5mb3MuY2xlYXIoKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgY29uc3QgY2hhciAqV0ZNUDsKKworICBzdHJ1Y3QgRmF1bHRJbmZvIHsKKyAgICBGYXVsdEtpbmQgS2luZCA9IEZhdWx0S2luZE1heDsKKyAgICBjb25zdCBNQ0V4cHIgKkZhdWx0aW5nT2Zmc2V0RXhwciA9IG51bGxwdHI7CisgICAgY29uc3QgTUNFeHByICpIYW5kbGVyT2Zmc2V0RXhwciA9IG51bGxwdHI7CisKKyAgICBGYXVsdEluZm8oKSA9IGRlZmF1bHQ7CisKKyAgICBleHBsaWNpdCBGYXVsdEluZm8oRmF1bHRNYXBzOjpGYXVsdEtpbmQgS2luZCwgY29uc3QgTUNFeHByICpGYXVsdGluZ09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNFeHByICpIYW5kbGVyT2Zmc2V0KQorICAgICAgICA6IEtpbmQoS2luZCksIEZhdWx0aW5nT2Zmc2V0RXhwcihGYXVsdGluZ09mZnNldCksCisgICAgICAgICAgSGFuZGxlck9mZnNldEV4cHIoSGFuZGxlck9mZnNldCkge30KKyAgfTsKKworICB1c2luZyBGdW5jdGlvbkZhdWx0SW5mb3MgPSBzdGQ6OnZlY3RvcjxGYXVsdEluZm8+OworCisgIC8vIFdlJ2QgbGlrZSB0byBrZWVwIGEgc3RhYmxlIGl0ZXJhdGlvbiBvcmRlciBmb3IgRnVuY3Rpb25JbmZvcyB0byBoZWxwCisgIC8vIEZpbGVDaGVjayBiYXNlZCB0ZXN0aW5nLgorICBzdHJ1Y3QgTUNTeW1ib2xDb21wYXJhdG9yIHsKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgTUNTeW1ib2wgKkxIUywgY29uc3QgTUNTeW1ib2wgKlJIUykgY29uc3QgeworICAgICAgcmV0dXJuIExIUy0+Z2V0TmFtZSgpIDwgUkhTLT5nZXROYW1lKCk7CisgICAgfQorICB9OworCisgIHN0ZDo6bWFwPGNvbnN0IE1DU3ltYm9sICosIEZ1bmN0aW9uRmF1bHRJbmZvcywgTUNTeW1ib2xDb21wYXJhdG9yPgorICAgICAgRnVuY3Rpb25JbmZvczsKKyAgQXNtUHJpbnRlciAmQVA7CisKKyAgdm9pZCBlbWl0RnVuY3Rpb25JbmZvKGNvbnN0IE1DU3ltYm9sICpGbkxhYmVsLCBjb25zdCBGdW5jdGlvbkZhdWx0SW5mb3MgJkZGSSk7Cit9OworCisvLy8gQSBwYXJzZXIgZm9yIHRoZSBfX2xsdm1fZmF1bHRtYXBzIHNlY3Rpb24gZ2VuZXJhdGVkIGJ5IHRoZSBGYXVsdE1hcHMgY2xhc3MKKy8vLyBhYm92ZS4gIFRoaXMgcGFyc2VyIGlzIHZlcnNpb24gbG9ja2VkIHdpdGggd2l0aCB0aGUgX19sbHZtX2ZhdWx0bWFwcyBzZWN0aW9uCisvLy8gZ2VuZXJhdGVkIGJ5IHRoZSB2ZXJzaW9uIG9mIExMVk0gdGhhdCBpbmNsdWRlcyBpdC4gIE5vIGd1YXJhbnRlZXMgYXJlIG1hZGUKKy8vLyB3aXRoIHJlc3BlY3QgdG8gZm9yd2FyZCBvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorY2xhc3MgRmF1bHRNYXBQYXJzZXIgeworICB1c2luZyBGYXVsdE1hcFZlcnNpb25UeXBlID0gdWludDhfdDsKKyAgdXNpbmcgUmVzZXJ2ZWQwVHlwZSA9IHVpbnQ4X3Q7CisgIHVzaW5nIFJlc2VydmVkMVR5cGUgPSB1aW50MTZfdDsKKyAgdXNpbmcgTnVtRnVuY3Rpb25zVHlwZSA9IHVpbnQzMl90OworCisgIHN0YXRpYyBjb25zdCBzaXplX3QgRmF1bHRNYXBWZXJzaW9uT2Zmc2V0ID0gMDsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBSZXNlcnZlZDBPZmZzZXQgPQorICAgICAgRmF1bHRNYXBWZXJzaW9uT2Zmc2V0ICsgc2l6ZW9mKEZhdWx0TWFwVmVyc2lvblR5cGUpOworICBzdGF0aWMgY29uc3Qgc2l6ZV90IFJlc2VydmVkMU9mZnNldCA9IFJlc2VydmVkME9mZnNldCArIHNpemVvZihSZXNlcnZlZDBUeXBlKTsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBOdW1GdW5jdGlvbnNPZmZzZXQgPQorICAgICAgUmVzZXJ2ZWQxT2Zmc2V0ICsgc2l6ZW9mKFJlc2VydmVkMVR5cGUpOworICBzdGF0aWMgY29uc3Qgc2l6ZV90IEZ1bmN0aW9uSW5mb3NPZmZzZXQgPQorICAgICAgTnVtRnVuY3Rpb25zT2Zmc2V0ICsgc2l6ZW9mKE51bUZ1bmN0aW9uc1R5cGUpOworCisgIGNvbnN0IHVpbnQ4X3QgKlA7CisgIGNvbnN0IHVpbnQ4X3QgKkU7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0YXRpYyBUIHJlYWQoY29uc3QgdWludDhfdCAqUCwgY29uc3QgdWludDhfdCAqRSkgeworICAgIGFzc2VydChQICsgc2l6ZW9mKFQpIDw9IEUgJiYgIm91dCBvZiBib3VuZHMgcmVhZCEiKTsKKyAgICByZXR1cm4gc3VwcG9ydDo6ZW5kaWFuOjpyZWFkPFQsIHN1cHBvcnQ6OmxpdHRsZSwgMT4oUCk7CisgIH0KKworcHVibGljOgorICBjbGFzcyBGdW5jdGlvbkZhdWx0SW5mb0FjY2Vzc29yIHsKKyAgICB1c2luZyBGYXVsdEtpbmRUeXBlID0gdWludDMyX3Q7CisgICAgdXNpbmcgRmF1bHRpbmdQQ09mZnNldFR5cGUgPSB1aW50MzJfdDsKKyAgICB1c2luZyBIYW5kbGVyUENPZmZzZXRUeXBlID0gdWludDMyX3Q7CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IEZhdWx0S2luZE9mZnNldCA9IDA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBGYXVsdGluZ1BDT2Zmc2V0T2Zmc2V0ID0KKyAgICAgICAgRmF1bHRLaW5kT2Zmc2V0ICsgc2l6ZW9mKEZhdWx0S2luZFR5cGUpOworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgSGFuZGxlclBDT2Zmc2V0T2Zmc2V0ID0KKyAgICAgICAgRmF1bHRpbmdQQ09mZnNldE9mZnNldCArIHNpemVvZihGYXVsdGluZ1BDT2Zmc2V0VHlwZSk7CisKKyAgICBjb25zdCB1aW50OF90ICpQOworICAgIGNvbnN0IHVpbnQ4X3QgKkU7CisKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBzaXplX3QgU2l6ZSA9CisgICAgICAgIEhhbmRsZXJQQ09mZnNldE9mZnNldCArIHNpemVvZihIYW5kbGVyUENPZmZzZXRUeXBlKTsKKworICAgIGV4cGxpY2l0IEZ1bmN0aW9uRmF1bHRJbmZvQWNjZXNzb3IoY29uc3QgdWludDhfdCAqUCwgY29uc3QgdWludDhfdCAqRSkKKyAgICAgICAgOiBQKFApLCBFKEUpIHt9CisKKyAgICBGYXVsdEtpbmRUeXBlIGdldEZhdWx0S2luZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiByZWFkPEZhdWx0S2luZFR5cGU+KFAgKyBGYXVsdEtpbmRPZmZzZXQsIEUpOworICAgIH0KKworICAgIEZhdWx0aW5nUENPZmZzZXRUeXBlIGdldEZhdWx0aW5nUENPZmZzZXQoKSBjb25zdCB7CisgICAgICByZXR1cm4gcmVhZDxGYXVsdGluZ1BDT2Zmc2V0VHlwZT4oUCArIEZhdWx0aW5nUENPZmZzZXRPZmZzZXQsIEUpOworICAgIH0KKworICAgIEhhbmRsZXJQQ09mZnNldFR5cGUgZ2V0SGFuZGxlclBDT2Zmc2V0KCkgY29uc3QgeworICAgICAgcmV0dXJuIHJlYWQ8SGFuZGxlclBDT2Zmc2V0VHlwZT4oUCArIEhhbmRsZXJQQ09mZnNldE9mZnNldCwgRSk7CisgICAgfQorICB9OworCisgIGNsYXNzIEZ1bmN0aW9uSW5mb0FjY2Vzc29yIHsKKyAgICB1c2luZyBGdW5jdGlvbkFkZHJUeXBlID0gdWludDY0X3Q7CisgICAgdXNpbmcgTnVtRmF1bHRpbmdQQ3NUeXBlID0gdWludDMyX3Q7CisgICAgdXNpbmcgUmVzZXJ2ZWRUeXBlID0gdWludDMyX3Q7CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IEZ1bmN0aW9uQWRkck9mZnNldCA9IDA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBOdW1GYXVsdGluZ1BDc09mZnNldCA9CisgICAgICAgIEZ1bmN0aW9uQWRkck9mZnNldCArIHNpemVvZihGdW5jdGlvbkFkZHJUeXBlKTsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IFJlc2VydmVkT2Zmc2V0ID0KKyAgICAgICAgTnVtRmF1bHRpbmdQQ3NPZmZzZXQgKyBzaXplb2YoTnVtRmF1bHRpbmdQQ3NUeXBlKTsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IEZ1bmN0aW9uRmF1bHRJbmZvc09mZnNldCA9CisgICAgICAgIFJlc2VydmVkT2Zmc2V0ICsgc2l6ZW9mKFJlc2VydmVkVHlwZSk7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBGdW5jdGlvbkluZm9IZWFkZXJTaXplID0gRnVuY3Rpb25GYXVsdEluZm9zT2Zmc2V0OworCisgICAgY29uc3QgdWludDhfdCAqUCA9IG51bGxwdHI7CisgICAgY29uc3QgdWludDhfdCAqRSA9IG51bGxwdHI7CisKKyAgcHVibGljOgorICAgIEZ1bmN0aW9uSW5mb0FjY2Vzc29yKCkgPSBkZWZhdWx0OworCisgICAgZXhwbGljaXQgRnVuY3Rpb25JbmZvQWNjZXNzb3IoY29uc3QgdWludDhfdCAqUCwgY29uc3QgdWludDhfdCAqRSkKKyAgICAgICAgOiBQKFApLCBFKEUpIHt9CisKKyAgICBGdW5jdGlvbkFkZHJUeXBlIGdldEZ1bmN0aW9uQWRkcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiByZWFkPEZ1bmN0aW9uQWRkclR5cGU+KFAgKyBGdW5jdGlvbkFkZHJPZmZzZXQsIEUpOworICAgIH0KKworICAgIE51bUZhdWx0aW5nUENzVHlwZSBnZXROdW1GYXVsdGluZ1BDcygpIGNvbnN0IHsKKyAgICAgIHJldHVybiByZWFkPE51bUZhdWx0aW5nUENzVHlwZT4oUCArIE51bUZhdWx0aW5nUENzT2Zmc2V0LCBFKTsKKyAgICB9CisKKyAgICBGdW5jdGlvbkZhdWx0SW5mb0FjY2Vzc29yIGdldEZ1bmN0aW9uRmF1bHRJbmZvQXQodWludDMyX3QgSW5kZXgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChJbmRleCA8IGdldE51bUZhdWx0aW5nUENzKCkgJiYgImluZGV4IG91dCBvZiBib3VuZHMhIik7CisgICAgICBjb25zdCB1aW50OF90ICpCZWdpbiA9IFAgKyBGdW5jdGlvbkZhdWx0SW5mb3NPZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkZhdWx0SW5mb0FjY2Vzc29yOjpTaXplICogSW5kZXg7CisgICAgICByZXR1cm4gRnVuY3Rpb25GYXVsdEluZm9BY2Nlc3NvcihCZWdpbiwgRSk7CisgICAgfQorCisgICAgRnVuY3Rpb25JbmZvQWNjZXNzb3IgZ2V0TmV4dEZ1bmN0aW9uSW5mbygpIGNvbnN0IHsKKyAgICAgIHNpemVfdCBNeVNpemUgPSBGdW5jdGlvbkluZm9IZWFkZXJTaXplICsKKyAgICAgICAgICAgICAgICAgICAgICBnZXROdW1GYXVsdGluZ1BDcygpICogRnVuY3Rpb25GYXVsdEluZm9BY2Nlc3Nvcjo6U2l6ZTsKKworICAgICAgY29uc3QgdWludDhfdCAqQmVnaW4gPSBQICsgTXlTaXplOworICAgICAgYXNzZXJ0KEJlZ2luIDwgRSAmJiAib3V0IG9mIGJvdW5kcyEiKTsKKyAgICAgIHJldHVybiBGdW5jdGlvbkluZm9BY2Nlc3NvcihCZWdpbiwgRSk7CisgICAgfQorICB9OworCisgIGV4cGxpY2l0IEZhdWx0TWFwUGFyc2VyKGNvbnN0IHVpbnQ4X3QgKkJlZ2luLCBjb25zdCB1aW50OF90ICpFbmQpCisgICAgICA6IFAoQmVnaW4pLCBFKEVuZCkge30KKworICBGYXVsdE1hcFZlcnNpb25UeXBlIGdldEZhdWx0TWFwVmVyc2lvbigpIGNvbnN0IHsKKyAgICBhdXRvIFZlcnNpb24gPSByZWFkPEZhdWx0TWFwVmVyc2lvblR5cGU+KFAgKyBGYXVsdE1hcFZlcnNpb25PZmZzZXQsIEUpOworICAgIGFzc2VydChWZXJzaW9uID09IDEgJiYgIm9ubHkgdmVyc2lvbiAxIHN1cHBvcnRlZCEiKTsKKyAgICByZXR1cm4gVmVyc2lvbjsKKyAgfQorCisgIE51bUZ1bmN0aW9uc1R5cGUgZ2V0TnVtRnVuY3Rpb25zKCkgY29uc3QgeworICAgIHJldHVybiByZWFkPE51bUZ1bmN0aW9uc1R5cGU+KFAgKyBOdW1GdW5jdGlvbnNPZmZzZXQsIEUpOworICB9CisKKyAgRnVuY3Rpb25JbmZvQWNjZXNzb3IgZ2V0Rmlyc3RGdW5jdGlvbkluZm8oKSBjb25zdCB7CisgICAgY29uc3QgdWludDhfdCAqQmVnaW4gPSBQICsgRnVuY3Rpb25JbmZvc09mZnNldDsKKyAgICByZXR1cm4gRnVuY3Rpb25JbmZvQWNjZXNzb3IoQmVnaW4sIEUpOworICB9Cit9OworCityYXdfb3N0cmVhbSAmCitvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgRmF1bHRNYXBQYXJzZXI6OkZ1bmN0aW9uRmF1bHRJbmZvQWNjZXNzb3IgJik7CisKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhdWx0TWFwUGFyc2VyOjpGdW5jdGlvbkluZm9BY2Nlc3NvciAmKTsKKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBGYXVsdE1hcFBhcnNlciAmKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9GQVVMVE1BUFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0Z1bmN0aW9uTG93ZXJpbmdJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRnVuY3Rpb25Mb3dlcmluZ0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGEwMGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0Z1bmN0aW9uTG93ZXJpbmdJbmZvLmgKQEAgLTAsMCArMSwzMjUgQEAKKy8vPT09LSBGdW5jdGlvbkxvd2VyaW5nSW5mby5oIC0gTG93ZXIgZnVuY3Rpb25zIGZyb20gTExWTSBJUiB0byBDb2RlR2VuIC0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpbXBsZW1lbnRzIHJvdXRpbmVzIGZvciB0cmFuc2xhdGluZyBmdW5jdGlvbnMgZnJvbSBMTFZNIElSIGludG8KKy8vIE1hY2hpbmUgSVIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fRlVOQ1RJT05MT1dFUklOR0lORk9fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fRlVOQ1RJT05MT1dFUklOR0lORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0luZGV4ZWRNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vSVNET3Bjb2Rlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSVIvVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvS25vd25CaXRzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBcmd1bWVudDsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBCcmFuY2hQcm9iYWJpbGl0eUluZm87CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIE1WVDsKK2NsYXNzIFNlbGVjdGlvbkRBRzsKK2NsYXNzIFRhcmdldExvd2VyaW5nOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBGdW5jdGlvbkxvd2VyaW5nSW5mbyAtIFRoaXMgY29udGFpbnMgaW5mb3JtYXRpb24gdGhhdCBpcyBnbG9iYWwgdG8gYQorLy8vIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB3aGVuIGxvd2VyaW5nIGEgcmVnaW9uIG9mIHRoZSBmdW5jdGlvbi4KKy8vLworY2xhc3MgRnVuY3Rpb25Mb3dlcmluZ0luZm8geworcHVibGljOgorICBjb25zdCBGdW5jdGlvbiAqRm47CisgIE1hY2hpbmVGdW5jdGlvbiAqTUY7CisgIGNvbnN0IFRhcmdldExvd2VyaW5nICpUTEk7CisgIE1hY2hpbmVSZWdpc3RlckluZm8gKlJlZ0luZm87CisgIEJyYW5jaFByb2JhYmlsaXR5SW5mbyAqQlBJOworICAvLy8gQ2FuTG93ZXJSZXR1cm4gLSB0cnVlIGlmZiB0aGUgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgY2FuIGJlIGxvd2VyZWQgdG8KKyAgLy8vIHJlZ2lzdGVycy4KKyAgYm9vbCBDYW5Mb3dlclJldHVybjsKKworICAvLy8gVHJ1ZSBpZiBwYXJ0IG9mIHRoZSBDU1JzIHdpbGwgYmUgaGFuZGxlZCB2aWEgZXhwbGljaXQgY29waWVzLgorICBib29sIFNwbGl0Q1NSOworCisgIC8vLyBEZW1vdGVSZWdpc3RlciAtIGlmIENhbkxvd2VyUmV0dXJuIGlzIGZhbHNlLCBEZW1vdGVSZWdpc3RlciBpcyBhIHZyZWcKKyAgLy8vIGFsbG9jYXRlZCB0byBob2xkIGEgcG9pbnRlciB0byB0aGUgaGlkZGVuIHNyZXQgcGFyYW1ldGVyLgorICB1bnNpZ25lZCBEZW1vdGVSZWdpc3RlcjsKKworICAvLy8gTUJCTWFwIC0gQSBtYXBwaW5nIGZyb20gTExWTSBiYXNpYyBibG9ja3MgdG8gdGhlaXIgbWFjaGluZSBjb2RlIGVudHJ5LgorICBEZW5zZU1hcDxjb25zdCBCYXNpY0Jsb2NrKiwgTWFjaGluZUJhc2ljQmxvY2sgKj4gTUJCTWFwOworCisgIC8vLyBBIG1hcCBmcm9tIHN3aWZ0ZXJyb3IgdmFsdWUgaW4gYSBiYXNpYyBibG9jayB0byB0aGUgdmlydHVhbCByZWdpc3RlciBpdCBpcworICAvLy8gY3VycmVudGx5IHJlcHJlc2VudGVkIGJ5LgorICBEZW5zZU1hcDxzdGQ6OnBhaXI8Y29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKiwgY29uc3QgVmFsdWUgKj4sIHVuc2lnbmVkPgorICAgICAgU3dpZnRFcnJvclZSZWdEZWZNYXA7CisKKyAgLy8vIEEgbGlzdCBvZiB1cHdhcmQgZXhwb3NlZCB2cmVnIHVzZXMgdGhhdCBuZWVkIHRvIGJlIHNhdGlzZmllZCBieSBlaXRoZXIgYQorICAvLy8gY29weSBkZWYgb3IgYSBwaGkgbm9kZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBiYXNpYyBibG9jayByZXByZXNlbnRpbmcKKyAgLy8vIHRoZSBwcmVkZWNlc3NvcihzKSBzd2lmdGVycm9yIHZhbHVlLgorICBEZW5zZU1hcDxzdGQ6OnBhaXI8Y29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKiwgY29uc3QgVmFsdWUgKj4sIHVuc2lnbmVkPgorICAgICAgU3dpZnRFcnJvclZSZWdVcHdhcmRzVXNlOworCisgIC8vLyBBIG1hcCBmcm9tIGluc3RydWN0aW9ucyB0aGF0IGRlZmluZS91c2UgYSBzd2lmdGVycm9yIHZhbHVlIHRvIHRoZSB2aXJ0dWFsCisgIC8vLyByZWdpc3RlciB0aGF0IHJlcHJlc2VudHMgdGhhdCBkZWYvdXNlLgorICBsbHZtOjpEZW5zZU1hcDxQb2ludGVySW50UGFpcjxjb25zdCBJbnN0cnVjdGlvbiAqLCAxLCBib29sPiwgdW5zaWduZWQ+CisgICAgICBTd2lmdEVycm9yVlJlZ0RlZlVzZXM7CisKKyAgLy8vIFRoZSBzd2lmdGVycm9yIGFyZ3VtZW50IG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICBjb25zdCBWYWx1ZSAqU3dpZnRFcnJvckFyZzsKKworICB1c2luZyBTd2lmdEVycm9yVmFsdWVzID0gU21hbGxWZWN0b3I8Y29uc3QgVmFsdWUqLCAxPjsKKyAgLy8vIEEgZnVuY3Rpb24gY2FuIG9ubHkgaGF2ZSBhIHNpbmdsZSBzd2lmdGVycm9yIGFyZ3VtZW50LiBBbmQgaWYgaXQgZG9lcworICAvLy8gaGF2ZSBhIHN3aWZ0ZXJyb3IgYXJndW1lbnQsIGl0IG11c3QgYmUgdGhlIGZpcnN0IGVudHJ5IGluCisgIC8vLyBTd2lmdEVycm9yVmFscy4KKyAgU3dpZnRFcnJvclZhbHVlcyBTd2lmdEVycm9yVmFsczsKKworICAvLy8gR2V0IG9yIGNyZWF0ZSB0aGUgc3dpZnRlcnJvciB2YWx1ZSB2aXJ0dWFsIHJlZ2lzdGVyIGluCisgIC8vLyBTd2lmdEVycm9yVlJlZ0RlZk1hcCBmb3IgdGhpcyBiYXNpYyBibG9jay4KKyAgdW5zaWduZWQgZ2V0T3JDcmVhdGVTd2lmdEVycm9yVlJlZyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICopOworCisgIC8vLyBTZXQgdGhlIHN3aWZ0ZXJyb3IgdmlydHVhbCByZWdpc3RlciBpbiB0aGUgU3dpZnRFcnJvclZSZWdEZWZNYXAgZm9yIHRoaXMKKyAgLy8vIGJhc2ljIGJsb2NrLgorICB2b2lkIHNldEN1cnJlbnRTd2lmdEVycm9yVlJlZyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLCBjb25zdCBWYWx1ZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCk7CisKKyAgLy8vIEdldCBvciBjcmVhdGUgdGhlIHN3aWZ0ZXJyb3IgdmFsdWUgdmlydHVhbCByZWdpc3RlciBmb3IgYSBkZWYgb2YgYQorICAvLy8gc3dpZnRlcnJvciBieSBhbiBpbnN0cnVjdGlvbi4KKyAgc3RkOjpwYWlyPHVuc2lnbmVkLCBib29sPiBnZXRPckNyZWF0ZVN3aWZ0RXJyb3JWUmVnRGVmQXQoY29uc3QgSW5zdHJ1Y3Rpb24gKik7CisgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgYm9vbD4KKyAgZ2V0T3JDcmVhdGVTd2lmdEVycm9yVlJlZ1VzZUF0KGNvbnN0IEluc3RydWN0aW9uICosIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqKTsKKworICAvLy8gVmFsdWVNYXAgLSBTaW5jZSB3ZSBlbWl0IGNvZGUgZm9yIHRoZSBmdW5jdGlvbiBhIGJhc2ljIGJsb2NrIGF0IGEgdGltZSwKKyAgLy8vIHdlIG11c3QgcmVtZW1iZXIgd2hpY2ggdmlydHVhbCByZWdpc3RlcnMgaG9sZCB0aGUgdmFsdWVzIGZvcgorICAvLy8gY3Jvc3MtYmFzaWMtYmxvY2sgdmFsdWVzLgorICBEZW5zZU1hcDxjb25zdCBWYWx1ZSAqLCB1bnNpZ25lZD4gVmFsdWVNYXA7CisKKyAgLy8vIFZpcnRSZWcyVmFsdWUgbWFwIGlzIG5lZWRlZCBieSB0aGUgRGl2ZXJnZW5jZSBBbmFseXNpcyBkcml2ZW4KKyAgLy8vIGluc3RydWN0aW9uIHNlbGVjdGlvbi4gSXQgaXMgcmV2ZXJ0ZWQgVmFsdWVNYXAuIEl0IGlzIGNvbXB1dGVkCisgIC8vLyBpbiBsYXp5IHN0eWxlIC0gb24gZGVtYW5kLiBJdCBpcyB1c2VkIHRvIGdldCB0aGUgVmFsdWUgY29ycmVzcG9uZGluZworICAvLy8gdG8gdGhlIGxpdmUgaW4gdmlydHVhbCByZWdpc3RlciBhbmQgaXMgY2FsbGVkIGZyb20gdGhlCisgIC8vLyBUYXJnZXRMb3dlcmluSW5mbzo6aXNTRE5vZGVTb3VyY2VPZkRpdmVyZ2VuY2UuCisgIERlbnNlTWFwPHVuc2lnbmVkLCBjb25zdCBWYWx1ZSo+IFZpcnRSZWcyVmFsdWU7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIFRhcmdldExvd2VyaW5JbmZvOjppc1NETm9kZVNvdXJjZU9mRGl2ZXJnZW5jZQorICAvLy8gdG8gZ2V0IHRoZSBWYWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBsaXZlLWluIHZpcnR1YWwgcmVnaXN0ZXIuCisgIGNvbnN0IFZhbHVlICogZ2V0VmFsdWVGcm9tVmlydHVhbFJlZyh1bnNpZ25lZCBWcmVnKTsKKworICAvLy8gVHJhY2sgdmlydHVhbCByZWdpc3RlcnMgY3JlYXRlZCBmb3IgZXhjZXB0aW9uIHBvaW50ZXJzLgorICBEZW5zZU1hcDxjb25zdCBWYWx1ZSAqLCB1bnNpZ25lZD4gQ2F0Y2hQYWRFeGNlcHRpb25Qb2ludGVyczsKKworICAvLy8gS2VlcCB0cmFjayBvZiBmcmFtZSBpbmRpY2VzIGFsbG9jYXRlZCBmb3Igc3RhdGVwb2ludHMgYXMgdGhleSBjb3VsZCBiZQorICAvLy8gdXNlZCBhY3Jvc3MgYmFzaWMgYmxvY2sgYm91bmRhcmllcy4gIFRoaXMgc3RydWN0IGlzIG1vcmUgY29tcGxleCB0aGFuIGEKKyAgLy8vIHNpbXBsZSBtYXAgYmVjYXVzZSB0aGUgc3RhdGVvcGludCBsb3dlcmluZyBjb2RlIGRlLWR1cGxpY2F0ZXMgZ2MgcG9pbnRlcnMKKyAgLy8vIGJhc2VkIG9uIHRoZWlyIFNEVmFsdWUgKHNvICVwIGFuZCAoYml0Y2FzdCAlcCB0byBUKSB3aWxsIGdldCB0aGUgc2FtZQorICAvLy8gc2xvdCksIGFuZCB3ZSB0cmFjayB0aGF0IGhlcmUuCisKKyAgc3RydWN0IFN0YXRlcG9pbnRTcGlsbE1hcCB7CisgICAgdXNpbmcgU2xvdE1hcFR5ID0gRGVuc2VNYXA8Y29uc3QgVmFsdWUgKiwgT3B0aW9uYWw8aW50Pj47CisKKyAgICAvLy8gTWFwcyB1bmlxdWVkIGxsdm0gSVIgdmFsdWVzIHRvIHRoZSBzbG90cyB0aGV5IHdlcmUgc3BpbGxlZCBpbi4gIElmIGEKKyAgICAvLy8gdmFsdWUgaXMgbWFwcGVkIHRvIE5vbmUgaXQgbWVhbnMgd2UgdmlzaXRlZCB0aGUgdmFsdWUgYnV0IGRpZG4ndCBzcGlsbAorICAgIC8vLyBpdCAoYmVjYXVzZSBpdCB3YXMgYSBjb25zdGFudCwgZm9yIGluc3RhbmNlKS4KKyAgICBTbG90TWFwVHkgU2xvdE1hcDsKKworICAgIC8vLyBNYXBzIGxsdm0gSVIgdmFsdWVzIHRvIHRoZSB2YWx1ZXMgdGhleSB3ZXJlIGRlLWR1cGxpY2F0ZWQgdG8uCisgICAgRGVuc2VNYXA8Y29uc3QgVmFsdWUgKiwgY29uc3QgVmFsdWUgKj4gRHVwbGljYXRlTWFwOworCisgICAgU2xvdE1hcFR5Ojpjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IFZhbHVlICpWKSBjb25zdCB7CisgICAgICBhdXRvIER1cGxJdCA9IER1cGxpY2F0ZU1hcC5maW5kKFYpOworICAgICAgaWYgKER1cGxJdCAhPSBEdXBsaWNhdGVNYXAuZW5kKCkpCisgICAgICAgIFYgPSBEdXBsSXQtPnNlY29uZDsKKyAgICAgIHJldHVybiBTbG90TWFwLmZpbmQoVik7CisgICAgfQorCisgICAgU2xvdE1hcFR5Ojpjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBTbG90TWFwLmVuZCgpOyB9CisgIH07CisKKyAgLy8vIE1hcHMgZ2Muc3RhdGVwb2ludCBpbnN0cnVjdGlvbnMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBTdGF0ZXBvaW50U3BpbGxNYXAKKyAgLy8vIGluc3RhbmNlcy4KKyAgRGVuc2VNYXA8Y29uc3QgSW5zdHJ1Y3Rpb24gKiwgU3RhdGVwb2ludFNwaWxsTWFwPiBTdGF0ZXBvaW50U3BpbGxNYXBzOworCisgIC8vLyBTdGF0aWNBbGxvY2FNYXAgLSBLZWVwIHRyYWNrIG9mIGZyYW1lIGluZGljZXMgZm9yIGZpeGVkIHNpemVkIGFsbG9jYXMgaW4KKyAgLy8vIHRoZSBlbnRyeSBibG9jay4gIFRoaXMgYWxsb3dzIHRoZSBhbGxvY2FzIHRvIGJlIGVmZmljaWVudGx5IHJlZmVyZW5jZWQKKyAgLy8vIGFueXdoZXJlIGluIHRoZSBmdW5jdGlvbi4KKyAgRGVuc2VNYXA8Y29uc3QgQWxsb2NhSW5zdCosIGludD4gU3RhdGljQWxsb2NhTWFwOworCisgIC8vLyBCeVZhbEFyZ0ZyYW1lSW5kZXhNYXAgLSBLZWVwIHRyYWNrIG9mIGZyYW1lIGluZGljZXMgZm9yIGJ5dmFsIGFyZ3VtZW50cy4KKyAgRGVuc2VNYXA8Y29uc3QgQXJndW1lbnQqLCBpbnQ+IEJ5VmFsQXJnRnJhbWVJbmRleE1hcDsKKworICAvLy8gQXJnRGJnVmFsdWVzIC0gQSBsaXN0IG9mIERCR19WQUxVRSBpbnN0cnVjdGlvbnMgY3JlYXRlZCBkdXJpbmcgaXNlbCBmb3IKKyAgLy8vIGZ1bmN0aW9uIGFyZ3VtZW50cyB0aGF0IGFyZSBpbnNlcnRlZCBhZnRlciBzY2hlZHVsaW5nIGlzIGNvbXBsZXRlZC4KKyAgU21hbGxWZWN0b3I8TWFjaGluZUluc3RyKiwgOD4gQXJnRGJnVmFsdWVzOworCisgIC8vLyBSZWdGaXh1cHMgLSBSZWdpc3RlcnMgd2hpY2ggbmVlZCB0byBiZSByZXBsYWNlZCBhZnRlciBpc2VsIGlzIGRvbmUuCisgIERlbnNlTWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4gUmVnRml4dXBzOworCisgIERlbnNlU2V0PHVuc2lnbmVkPiBSZWdzV2l0aEZpeHVwczsKKworICAvLy8gU3RhdGVwb2ludFN0YWNrU2xvdHMgLSBBIGxpc3Qgb2YgdGVtcG9yYXJ5IHN0YWNrIHNsb3RzIChmcmFtZSBpbmRpY2VzKQorICAvLy8gdXNlZCB0byBzcGlsbCB2YWx1ZXMgYXQgYSBzdGF0ZXBvaW50LiAgV2Ugc3RvcmUgdGhlbSBoZXJlIHRvIGVuYWJsZQorICAvLy8gcmV1c2Ugb2YgdGhlIHNhbWUgc3RhY2sgc2xvdHMgYWNyb3NzIGRpZmZlcmVudCBzdGF0ZXBvaW50cyBpbiBkaWZmZXJlbnQKKyAgLy8vIGJhc2ljIGJsb2Nrcy4KKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDUwPiBTdGF0ZXBvaW50U3RhY2tTbG90czsKKworICAvLy8gTUJCIC0gVGhlIGN1cnJlbnQgYmxvY2suCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkI7CisKKyAgLy8vIE1CQiAtIFRoZSBjdXJyZW50IGluc2VydCBwb3NpdGlvbiBpbnNpZGUgdGhlIGN1cnJlbnQgYmxvY2suCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQdDsKKworICBzdHJ1Y3QgTGl2ZU91dEluZm8geworICAgIHVuc2lnbmVkIE51bVNpZ25CaXRzIDogMzE7CisgICAgdW5zaWduZWQgSXNWYWxpZCA6IDE7CisgICAgS25vd25CaXRzIEtub3duID0gMTsKKworICAgIExpdmVPdXRJbmZvKCkgOiBOdW1TaWduQml0cygwKSwgSXNWYWxpZCh0cnVlKSB7fQorICB9OworCisgIC8vLyBSZWNvcmQgdGhlIHByZWZlcnJlZCBleHRlbmQgdHlwZSAoSVNEOjpTSUdOX0VYVEVORCBvciBJU0Q6OlpFUk9fRVhURU5EKQorICAvLy8gZm9yIGEgdmFsdWUuCisgIERlbnNlTWFwPGNvbnN0IFZhbHVlICosIElTRDo6Tm9kZVR5cGU+IFByZWZlcnJlZEV4dGVuZFR5cGU7CisKKyAgLy8vIFZpc2l0ZWRCQnMgLSBUaGUgc2V0IG9mIGJhc2ljIGJsb2NrcyB2aXNpdGVkIHRodXMgZmFyIGJ5IGluc3RydWN0aW9uCisgIC8vLyBzZWxlY3Rpb24uCisgIFNtYWxsUHRyU2V0PGNvbnN0IEJhc2ljQmxvY2sqLCA0PiBWaXNpdGVkQkJzOworCisgIC8vLyBQSElOb2Rlc1RvVXBkYXRlIC0gQSBsaXN0IG9mIHBoaSBpbnN0cnVjdGlvbnMgd2hvc2Ugb3BlcmFuZCBsaXN0IHdpbGwKKyAgLy8vIGJlIHVwZGF0ZWQgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgY3VycmVudCBiYXNpYyBibG9jay4KKyAgLy8vIFRPRE86IFRoaXMgaXNuJ3QgcGVyLWZ1bmN0aW9uIHN0YXRlLCBpdCdzIHBlci1iYXNpYy1ibG9jayBzdGF0ZS4gQnV0CisgIC8vLyB0aGVyZSdzIG5vIG90aGVyIGNvbnZlbmllbnQgcGxhY2UgZm9yIGl0IHRvIGxpdmUgcmlnaHQgbm93LgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8TWFjaGluZUluc3RyKiwgdW5zaWduZWQ+ID4gUEhJTm9kZXNUb1VwZGF0ZTsKKyAgdW5zaWduZWQgT3JpZ051bVBISU5vZGVzVG9VcGRhdGU7CisKKyAgLy8vIElmIHRoZSBjdXJyZW50IE1CQiBpcyBhIGxhbmRpbmcgcGFkLCB0aGUgZXhjZXB0aW9uIHBvaW50ZXIgYW5kIGV4Y2VwdGlvbgorICAvLy8gc2VsZWN0b3IgcmVnaXN0ZXJzIGFyZSBjb3BpZWQgaW50byB0aGVzZSB2aXJ0dWFsIHJlZ2lzdGVycyBieQorICAvLy8gU2VsZWN0aW9uREFHSVNlbDo6UHJlcGFyZUVITGFuZGluZ1BhZCgpLgorICB1bnNpZ25lZCBFeGNlcHRpb25Qb2ludGVyVmlydFJlZywgRXhjZXB0aW9uU2VsZWN0b3JWaXJ0UmVnOworCisgIC8vLyBzZXQgLSBJbml0aWFsaXplIHRoaXMgRnVuY3Rpb25Mb3dlcmluZ0luZm8gd2l0aCB0aGUgZ2l2ZW4gRnVuY3Rpb24KKyAgLy8vIGFuZCBpdHMgYXNzb2NpYXRlZCBNYWNoaW5lRnVuY3Rpb24uCisgIC8vLworICB2b2lkIHNldChjb25zdCBGdW5jdGlvbiAmRm4sIE1hY2hpbmVGdW5jdGlvbiAmTUYsIFNlbGVjdGlvbkRBRyAqREFHKTsKKworICAvLy8gY2xlYXIgLSBDbGVhciBvdXQgYWxsIHRoZSBmdW5jdGlvbi1zcGVjaWZpYyBzdGF0ZS4gVGhpcyByZXR1cm5zIHRoaXMKKyAgLy8vIEZ1bmN0aW9uTG93ZXJpbmdJbmZvIHRvIGFuIGVtcHR5IHN0YXRlLCByZWFkeSB0byBiZSB1c2VkIGZvciBhCisgIC8vLyBkaWZmZXJlbnQgZnVuY3Rpb24uCisgIHZvaWQgY2xlYXIoKTsKKworICAvLy8gaXNFeHBvcnRlZEluc3QgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGFuIGluc3RydWN0aW9uCisgIC8vLyBleHBvcnRlZCBmcm9tIGl0cyBibG9jay4KKyAgYm9vbCBpc0V4cG9ydGVkSW5zdChjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWYWx1ZU1hcC5jb3VudChWKTsKKyAgfQorCisgIHVuc2lnbmVkIENyZWF0ZVJlZyhNVlQgVlQpOworCisgIHVuc2lnbmVkIENyZWF0ZVJlZ3MoVHlwZSAqVHkpOworCisgIHVuc2lnbmVkIEluaXRpYWxpemVSZWdGb3JWYWx1ZShjb25zdCBWYWx1ZSAqVikgeworICAgIC8vIFRva2VucyBuZXZlciBsaXZlIGluIHZyZWdzLgorICAgIGlmIChWLT5nZXRUeXBlKCktPmlzVG9rZW5UeSgpKQorICAgICAgcmV0dXJuIDA7CisgICAgdW5zaWduZWQgJlIgPSBWYWx1ZU1hcFtWXTsKKyAgICBhc3NlcnQoUiA9PSAwICYmICJBbHJlYWR5IGluaXRpYWxpemVkIHRoaXMgdmFsdWUgcmVnaXN0ZXIhIik7CisgICAgcmV0dXJuIFIgPSBDcmVhdGVSZWdzKFYtPmdldFR5cGUoKSk7CisgIH0KKworICAvLy8gR2V0TGl2ZU91dFJlZ0luZm8gLSBHZXRzIExpdmVPdXRJbmZvIGZvciBhIHJlZ2lzdGVyLCByZXR1cm5pbmcgTlVMTCBpZiB0aGUKKyAgLy8vIHJlZ2lzdGVyIGlzIGEgUEhJIGRlc3RpbmF0aW9uIGFuZCB0aGUgUEhJJ3MgTGl2ZU91dEluZm8gaXMgbm90IHZhbGlkLgorICBjb25zdCBMaXZlT3V0SW5mbyAqR2V0TGl2ZU91dFJlZ0luZm8odW5zaWduZWQgUmVnKSB7CisgICAgaWYgKCFMaXZlT3V0UmVnSW5mby5pbkJvdW5kcyhSZWcpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBjb25zdCBMaXZlT3V0SW5mbyAqTE9JID0gJkxpdmVPdXRSZWdJbmZvW1JlZ107CisgICAgaWYgKCFMT0ktPklzVmFsaWQpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIHJldHVybiBMT0k7CisgIH0KKworICAvLy8gR2V0TGl2ZU91dFJlZ0luZm8gLSBHZXRzIExpdmVPdXRJbmZvIGZvciBhIHJlZ2lzdGVyLCByZXR1cm5pbmcgTlVMTCBpZiB0aGUKKyAgLy8vIHJlZ2lzdGVyIGlzIGEgUEhJIGRlc3RpbmF0aW9uIGFuZCB0aGUgUEhJJ3MgTGl2ZU91dEluZm8gaXMgbm90IHZhbGlkLiBJZgorICAvLy8gdGhlIHJlZ2lzdGVyJ3MgTGl2ZU91dEluZm8gaXMgZm9yIGEgc21hbGxlciBiaXQgd2lkdGgsIGl0IGlzIGV4dGVuZGVkIHRvCisgIC8vLyB0aGUgbGFyZ2VyIGJpdCB3aWR0aCBieSB6ZXJvIGV4dGVuc2lvbi4gVGhlIGJpdCB3aWR0aCBtdXN0IGJlIG5vIHNtYWxsZXIKKyAgLy8vIHRoYW4gdGhlIExpdmVPdXRJbmZvJ3MgZXhpc3RpbmcgYml0IHdpZHRoLgorICBjb25zdCBMaXZlT3V0SW5mbyAqR2V0TGl2ZU91dFJlZ0luZm8odW5zaWduZWQgUmVnLCB1bnNpZ25lZCBCaXRXaWR0aCk7CisKKyAgLy8vIEFkZExpdmVPdXRSZWdJbmZvIC0gQWRkcyBMaXZlT3V0SW5mbyBmb3IgYSByZWdpc3Rlci4KKyAgdm9pZCBBZGRMaXZlT3V0UmVnSW5mbyh1bnNpZ25lZCBSZWcsIHVuc2lnbmVkIE51bVNpZ25CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEtub3duQml0cyAmS25vd24pIHsKKyAgICAvLyBPbmx5IGluc3RhbGwgdGhpcyBpbmZvcm1hdGlvbiBpZiBpdCB0ZWxscyB1cyBzb21ldGhpbmcuCisgICAgaWYgKE51bVNpZ25CaXRzID09IDEgJiYgS25vd24uaXNVbmtub3duKCkpCisgICAgICByZXR1cm47CisKKyAgICBMaXZlT3V0UmVnSW5mby5ncm93KFJlZyk7CisgICAgTGl2ZU91dEluZm8gJkxPSSA9IExpdmVPdXRSZWdJbmZvW1JlZ107CisgICAgTE9JLk51bVNpZ25CaXRzID0gTnVtU2lnbkJpdHM7CisgICAgTE9JLktub3duLk9uZSA9IEtub3duLk9uZTsKKyAgICBMT0kuS25vd24uWmVybyA9IEtub3duLlplcm87CisgIH0KKworICAvLy8gQ29tcHV0ZVBISUxpdmVPdXRSZWdJbmZvIC0gQ29tcHV0ZSBMaXZlT3V0SW5mbyBmb3IgYSBQSEkncyBkZXN0aW5hdGlvbgorICAvLy8gcmVnaXN0ZXIgYmFzZWQgb24gdGhlIExpdmVPdXRJbmZvIG9mIGl0cyBvcGVyYW5kcy4KKyAgdm9pZCBDb21wdXRlUEhJTGl2ZU91dFJlZ0luZm8oY29uc3QgUEhJTm9kZSopOworCisgIC8vLyBJbnZhbGlkYXRlUEhJTGl2ZU91dFJlZ0luZm8gLSBJbnZhbGlkYXRlcyBhIFBISSdzIExpdmVPdXRJbmZvLCB0byBiZQorICAvLy8gY2FsbGVkIHdoZW4gYSBibG9jayBpcyB2aXNpdGVkIGJlZm9yZSBhbGwgb2YgaXRzIHByZWRlY2Vzc29ycy4KKyAgdm9pZCBJbnZhbGlkYXRlUEhJTGl2ZU91dFJlZ0luZm8oY29uc3QgUEhJTm9kZSAqUE4pIHsKKyAgICAvLyBQSElzIHdpdGggbm8gdXNlcyBoYXZlIG5vIFZhbHVlTWFwIGVudHJ5LgorICAgIERlbnNlTWFwPGNvbnN0IFZhbHVlKiwgdW5zaWduZWQ+Ojpjb25zdF9pdGVyYXRvciBJdCA9IFZhbHVlTWFwLmZpbmQoUE4pOworICAgIGlmIChJdCA9PSBWYWx1ZU1hcC5lbmQoKSkKKyAgICAgIHJldHVybjsKKworICAgIHVuc2lnbmVkIFJlZyA9IEl0LT5zZWNvbmQ7CisgICAgaWYgKFJlZyA9PSAwKQorICAgICAgcmV0dXJuOworCisgICAgTGl2ZU91dFJlZ0luZm8uZ3JvdyhSZWcpOworICAgIExpdmVPdXRSZWdJbmZvW1JlZ10uSXNWYWxpZCA9IGZhbHNlOworICB9CisKKyAgLy8vIHNldEFyZ3VtZW50RnJhbWVJbmRleCAtIFJlY29yZCBmcmFtZSBpbmRleCBmb3IgdGhlIGJ5dmFsCisgIC8vLyBhcmd1bWVudC4KKyAgdm9pZCBzZXRBcmd1bWVudEZyYW1lSW5kZXgoY29uc3QgQXJndW1lbnQgKkEsIGludCBGSSk7CisKKyAgLy8vIGdldEFyZ3VtZW50RnJhbWVJbmRleCAtIEdldCBmcmFtZSBpbmRleCBmb3IgdGhlIGJ5dmFsIGFyZ3VtZW50LgorICBpbnQgZ2V0QXJndW1lbnRGcmFtZUluZGV4KGNvbnN0IEFyZ3VtZW50ICpBKTsKKworICB1bnNpZ25lZCBnZXRDYXRjaFBhZEV4Y2VwdGlvblBvaW50ZXJWUmVnKGNvbnN0IFZhbHVlICpDUEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpOworCitwcml2YXRlOgorICB2b2lkIGFkZFNFSEhhbmRsZXJzRm9yTFBhZHMoQXJyYXlSZWY8Y29uc3QgTGFuZGluZ1BhZEluc3QgKj4gTFBhZHMpOworCisgIC8vLyBMaXZlT3V0UmVnSW5mbyAtIEluZm9ybWF0aW9uIGFib3V0IGxpdmUgb3V0IHZyZWdzLgorICBJbmRleGVkTWFwPExpdmVPdXRJbmZvLCBWaXJ0UmVnMkluZGV4RnVuY3Rvcj4gTGl2ZU91dFJlZ0luZm87Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0ZVTkNUSU9OTE9XRVJJTkdJTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HQ01ldGFkYXRhLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR0NNZXRhZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMjU5OWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR0NNZXRhZGF0YS5oCkBAIC0wLDAgKzEsMjA3IEBACisvLz09PS0gR0NNZXRhZGF0YS5oIC0gR2FyYmFnZSBjb2xsZWN0b3IgbWV0YWRhdGEgLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgR0NGdW5jdGlvbkluZm8gYW5kIEdDTW9kdWxlSW5mbyBjbGFzc2VzLCB3aGljaCBhcmUKKy8vIHVzZWQgYXMgYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgZnJvbSB0aGUgdGFyZ2V0IGNvZGUgZ2VuZXJhdG9yIHRvIHRoZSB0YXJnZXQKKy8vIGdhcmJhZ2UgY29sbGVjdG9ycy4gVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGNvZGUgZ2VuZXJhdG9ycyBhbmQgZ2FyYmFnZQorLy8gY29sbGVjdG9ycyB0byBiZSBkZXZlbG9wZWQgaW5kZXBlbmRlbnRseS4KKy8vCisvLyBUaGUgR0NGdW5jdGlvbkluZm8gY2xhc3MgbG9ncyB0aGUgZGF0YSBuZWNlc3NhcnkgdG8gYnVpbGQgYSB0eXBlIGFjY3VyYXRlCisvLyBzdGFjayBtYXAuIFRoZSBjb2RlIGdlbmVyYXRvciBvdXRwdXRzOgorLy8KKy8vICAgLSBTYWZlIHBvaW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEdDU3RyYXRlZ3kncyBOZWVkZWRTYWZlUG9pbnRzLgorLy8gICAtIFN0YWNrIG9mZnNldHMgZm9yIEdDIHJvb3RzLCBhcyBzcGVjaWZpZWQgYnkgY2FsbHMgdG8gbGx2bS5nY3Jvb3QKKy8vCisvLyBBcyBhIHJlZmluZW1lbnQsIGxpdmVuZXNzIGFuYWx5c2lzIGNhbGN1bGF0ZXMgdGhlIHNldCBvZiBsaXZlIHJvb3RzIGF0IGVhY2gKKy8vIHNhZmUgcG9pbnQuIExpdmVuZXNzIGFuYWx5c2lzIGlzIG5vdCBwcmVzZW50bHkgcGVyZm9ybWVkIGJ5IHRoZSBjb2RlCisvLyBnZW5lcmF0b3IsIHNvIGFsbCByb290cyBhcmUgYXNzdW1lZCBsaXZlLgorLy8KKy8vIEdDTW9kdWxlSW5mbyBzaW1wbHkgY29sbGVjdHMgR0NGdW5jdGlvbkluZm8gaW5zdGFuY2VzIGZvciBlYWNoIEZ1bmN0aW9uIGFzCisvLyB0aGV5IGFyZSBjb21waWxlZC4gVGhpcyBhY2NyZXRpb24gaXMgbmVjZXNzYXJ5IGZvciBjb2xsZWN0b3JzIHdoaWNoIG11c3QgZW1pdAorLy8gYSBzdGFjayBtYXAgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0IGFzIGEgd2hvbGUuIFRoZXJlZm9yZSwgR0NGdW5jdGlvbkluZm8KKy8vIG91dGxpdmVzIHRoZSBNYWNoaW5lRnVuY3Rpb24gZnJvbSB3aGljaCBpdCBpcyBkZXJpdmVkIGFuZCBtdXN0IG5vdCByZWZlciB0bworLy8gYW55IGNvZGUgZ2VuZXJhdG9yIGRhdGEgc3RydWN0dXJlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HQ01FVEFEQVRBX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0dDTUVUQURBVEFfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HQ1N0cmF0ZWd5LmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZWJ1Z0xvYy5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBDb25zdGFudDsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTUNTeW1ib2w7CisKKy8vLyBHQ1BvaW50IC0gTWV0YWRhdGEgZm9yIGEgY29sbGVjdG9yLXNhZmUgcG9pbnQgaW4gbWFjaGluZSBjb2RlLgorLy8vCitzdHJ1Y3QgR0NQb2ludCB7CisgIEdDOjpQb2ludEtpbmQgS2luZDsgLy8vPCBUaGUga2luZCBvZiB0aGUgc2FmZSBwb2ludC4KKyAgTUNTeW1ib2wgKkxhYmVsOyAgICAvLy88IEEgbGFiZWwuCisgIERlYnVnTG9jIExvYzsKKworICBHQ1BvaW50KEdDOjpQb2ludEtpbmQgSywgTUNTeW1ib2wgKkwsIERlYnVnTG9jIERMKQorICAgICAgOiBLaW5kKEspLCBMYWJlbChMKSwgTG9jKHN0ZDo6bW92ZShETCkpIHt9Cit9OworCisvLy8gR0NSb290IC0gTWV0YWRhdGEgZm9yIGEgcG9pbnRlciB0byBhbiBvYmplY3QgbWFuYWdlZCBieSB0aGUgZ2FyYmFnZQorLy8vIGNvbGxlY3Rvci4KK3N0cnVjdCBHQ1Jvb3QgeworICBpbnQgTnVtOyAgICAgICAgICAgICAgICAgIC8vLzwgVXN1YWxseSBhIGZyYW1lIGluZGV4LgorICBpbnQgU3RhY2tPZmZzZXQgPSAtMTsgICAgIC8vLzwgT2Zmc2V0IGZyb20gdGhlIHN0YWNrIHBvaW50ZXIuCisgIGNvbnN0IENvbnN0YW50ICpNZXRhZGF0YTsgLy8vPCBNZXRhZGF0YSBzdHJhaWdodCBmcm9tIHRoZSBjYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB0byBsbHZtLmdjcm9vdC4KKworICBHQ1Jvb3QoaW50IE4sIGNvbnN0IENvbnN0YW50ICpNRCkgOiBOdW0oTiksIE1ldGFkYXRhKE1EKSB7fQorfTsKKworLy8vIEdhcmJhZ2UgY29sbGVjdGlvbiBtZXRhZGF0YSBmb3IgYSBzaW5nbGUgZnVuY3Rpb24uICBDdXJyZW50bHksIHRoaXMKKy8vLyBpbmZvcm1hdGlvbiBvbmx5IGFwcGxpZXMgdG8gR0NTdHJhdGVnaWVzIHdoaWNoIHVzZSBHQ1Jvb3QuCitjbGFzcyBHQ0Z1bmN0aW9uSW5mbyB7CitwdWJsaWM6CisgIHVzaW5nIGl0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8R0NQb2ludD46Oml0ZXJhdG9yOworICB1c2luZyByb290c19pdGVyYXRvciA9IHN0ZDo6dmVjdG9yPEdDUm9vdD46Oml0ZXJhdG9yOworICB1c2luZyBsaXZlX2l0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8R0NSb290Pjo6Y29uc3RfaXRlcmF0b3I7CisKK3ByaXZhdGU6CisgIGNvbnN0IEZ1bmN0aW9uICZGOworICBHQ1N0cmF0ZWd5ICZTOworICB1aW50NjRfdCBGcmFtZVNpemU7CisgIHN0ZDo6dmVjdG9yPEdDUm9vdD4gUm9vdHM7CisgIHN0ZDo6dmVjdG9yPEdDUG9pbnQ+IFNhZmVQb2ludHM7CisKKyAgLy8gRklYTUU6IExpdmVuZXNzLiBBIDJEIEJpdFZlY3RvciwgcGVyaGFwcz8KKyAgLy8KKyAgLy8gICBCaXRWZWN0b3IgTGl2ZW5lc3M7CisgIC8vCisgIC8vICAgYm9vbCBpc2xpdmUoaW50IHBvaW50LCBpbnQgcm9vdCkgPQorICAvLyAgICAgTGl2ZW5lc3NbcG9pbnQgKiBTYWZlUG9pbnRzLnNpemUoKSArIHJvb3RdCisgIC8vCisgIC8vIFRoZSBiaXQgdmVjdG9yIGlzIHRoZSBtb3JlIGNvbXBhY3QgcmVwcmVzZW50YXRpb24gd2hlcmUgPjMuMiUgb2Ygcm9vdHMKKyAgLy8gYXJlIGxpdmUgcGVyIHNhZmUgcG9pbnQgKDEuNSUgb24gNjQtYml0IGhvc3RzKS4KKworcHVibGljOgorICBHQ0Z1bmN0aW9uSW5mbyhjb25zdCBGdW5jdGlvbiAmRiwgR0NTdHJhdGVneSAmUyk7CisgIH5HQ0Z1bmN0aW9uSW5mbygpOworCisgIC8vLyBnZXRGdW5jdGlvbiAtIFJldHVybiB0aGUgZnVuY3Rpb24gdG8gd2hpY2ggdGhpcyBtZXRhZGF0YSBhcHBsaWVzLgorICBjb25zdCBGdW5jdGlvbiAmZ2V0RnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBGOyB9CisKKyAgLy8vIGdldFN0cmF0ZWd5IC0gUmV0dXJuIHRoZSBHQyBzdHJhdGVneSBmb3IgdGhlIGZ1bmN0aW9uLgorICBHQ1N0cmF0ZWd5ICZnZXRTdHJhdGVneSgpIHsgcmV0dXJuIFM7IH0KKworICAvLy8gYWRkU3RhY2tSb290IC0gUmVnaXN0ZXJzIGEgcm9vdCB0aGF0IGxpdmVzIG9uIHRoZSBzdGFjay4gTnVtIGlzIHRoZQorICAvLy8gICAgICAgICAgICAgICAgc3RhY2sgb2JqZWN0IElEIGZvciB0aGUgYWxsb2NhIChpZiB0aGUgY29kZSBnZW5lcmF0b3IgaXMKKyAgLy8gICAgICAgICAgICAgICAgIHVzaW5nICBNYWNoaW5lRnJhbWVJbmZvKS4KKyAgdm9pZCBhZGRTdGFja1Jvb3QoaW50IE51bSwgY29uc3QgQ29uc3RhbnQgKk1ldGFkYXRhKSB7CisgICAgUm9vdHMucHVzaF9iYWNrKEdDUm9vdChOdW0sIE1ldGFkYXRhKSk7CisgIH0KKworICAvLy8gcmVtb3ZlU3RhY2tSb290IC0gUmVtb3ZlcyBhIHJvb3QuCisgIHJvb3RzX2l0ZXJhdG9yIHJlbW92ZVN0YWNrUm9vdChyb290c19pdGVyYXRvciBwb3NpdGlvbikgeworICAgIHJldHVybiBSb290cy5lcmFzZShwb3NpdGlvbik7CisgIH0KKworICAvLy8gYWRkU2FmZVBvaW50IC0gTm90ZXMgdGhlIGV4aXN0ZW5jZSBvZiBhIHNhZmUgcG9pbnQuIE51bSBpcyB0aGUgSUQgb2YgdGhlCisgIC8vLyBsYWJlbCBqdXN0IHByaW9yIHRvIHRoZSBzYWZlIHBvaW50IChpZiB0aGUgY29kZSBnZW5lcmF0b3IgaXMgdXNpbmcKKyAgLy8vIE1hY2hpbmVNb2R1bGVJbmZvKS4KKyAgdm9pZCBhZGRTYWZlUG9pbnQoR0M6OlBvaW50S2luZCBLaW5kLCBNQ1N5bWJvbCAqTGFiZWwsIGNvbnN0IERlYnVnTG9jICZETCkgeworICAgIFNhZmVQb2ludHMuZW1wbGFjZV9iYWNrKEtpbmQsIExhYmVsLCBETCk7CisgIH0KKworICAvLy8gZ2V0RnJhbWVTaXplL3NldEZyYW1lU2l6ZSAtIFJlY29yZHMgdGhlIGZ1bmN0aW9uJ3MgZnJhbWUgc2l6ZS4KKyAgdWludDY0X3QgZ2V0RnJhbWVTaXplKCkgY29uc3QgeyByZXR1cm4gRnJhbWVTaXplOyB9CisgIHZvaWQgc2V0RnJhbWVTaXplKHVpbnQ2NF90IFMpIHsgRnJhbWVTaXplID0gUzsgfQorCisgIC8vLyBiZWdpbi9lbmQgLSBJdGVyYXRvcnMgZm9yIHNhZmUgcG9pbnRzLgorICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIFNhZmVQb2ludHMuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBTYWZlUG9pbnRzLmVuZCgpOyB9CisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gU2FmZVBvaW50cy5zaXplKCk7IH0KKworICAvLy8gcm9vdHNfYmVnaW4vcm9vdHNfZW5kIC0gSXRlcmF0b3JzIGZvciBhbGwgcm9vdHMgaW4gdGhlIGZ1bmN0aW9uLgorICByb290c19pdGVyYXRvciByb290c19iZWdpbigpIHsgcmV0dXJuIFJvb3RzLmJlZ2luKCk7IH0KKyAgcm9vdHNfaXRlcmF0b3Igcm9vdHNfZW5kKCkgeyByZXR1cm4gUm9vdHMuZW5kKCk7IH0KKyAgc2l6ZV90IHJvb3RzX3NpemUoKSBjb25zdCB7IHJldHVybiBSb290cy5zaXplKCk7IH0KKworICAvLy8gbGl2ZV9iZWdpbi9saXZlX2VuZCAtIEl0ZXJhdG9ycyBmb3IgbGl2ZSByb290cyBhdCBhIGdpdmVuIHNhZmUgcG9pbnQuCisgIGxpdmVfaXRlcmF0b3IgbGl2ZV9iZWdpbihjb25zdCBpdGVyYXRvciAmcCkgeyByZXR1cm4gcm9vdHNfYmVnaW4oKTsgfQorICBsaXZlX2l0ZXJhdG9yIGxpdmVfZW5kKGNvbnN0IGl0ZXJhdG9yICZwKSB7IHJldHVybiByb290c19lbmQoKTsgfQorICBzaXplX3QgbGl2ZV9zaXplKGNvbnN0IGl0ZXJhdG9yICZwKSBjb25zdCB7IHJldHVybiByb290c19zaXplKCk7IH0KK307CisKKy8vLyBBbiBhbmFseXNpcyBwYXNzIHdoaWNoIGNhY2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZW50aXJlIE1vZHVsZS4KKy8vLyBSZWNvcmRzIGJvdGggdGhlIGZ1bmN0aW9uIGxldmVsIGluZm9ybWF0aW9uIHVzZWQgYnkgR0NSb290cyBhbmQgYQorLy8vIGNhY2hlIG9mIHRoZSAnYWN0aXZlJyBnYyBzdHJhdGVneSBvYmplY3RzIGZvciB0aGUgY3VycmVudCBNb2R1bGUuCitjbGFzcyBHQ01vZHVsZUluZm8gOiBwdWJsaWMgSW1tdXRhYmxlUGFzcyB7CisgIC8vLyBBbiBvd25pbmcgbGlzdCBvZiBhbGwgR0NTdHJhdGVnaWVzIHdoaWNoIGhhdmUgYmVlbiBjcmVhdGVkCisgIFNtYWxsVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxHQ1N0cmF0ZWd5PiwgMT4gR0NTdHJhdGVneUxpc3Q7CisgIC8vLyBBIGhlbHBlciBtYXAgdG8gc3BlZWR1cCBsb29rdXBzIGludG8gdGhlIGFib3ZlIGxpc3QKKyAgU3RyaW5nTWFwPEdDU3RyYXRlZ3kqPiBHQ1N0cmF0ZWd5TWFwOworCitwdWJsaWM6CisgIC8vLyBMb29rdXAgdGhlIEdDU3RyYXRlZ3kgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZ2MgbmFtZS4KKyAgLy8vIE9iamVjdHMgYXJlIG93bmVkIGludGVybmFsbHk7IE5vIGNhbGxlciBzaG91bGQgYXR0ZW1wdCB0byBkZWxldGUgdGhlCisgIC8vLyByZXR1cm5lZCBvYmplY3RzLgorICBHQ1N0cmF0ZWd5ICpnZXRHQ1N0cmF0ZWd5KGNvbnN0IFN0cmluZ1JlZiBOYW1lKTsKKworICAvLy8gTGlzdCBvZiBwZXIgZnVuY3Rpb24gaW5mbyBvYmplY3RzLiAgSW4gdGhlb3J5LCBFYWNoIG9mIHRoZXNlCisgIC8vLyBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIGEgZGlmZmVyZW50IEdDLgorICB1c2luZyBGdW5jSW5mb1ZlYyA9IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxHQ0Z1bmN0aW9uSW5mbz4+OworCisgIEZ1bmNJbmZvVmVjOjppdGVyYXRvciBmdW5jaW5mb19iZWdpbigpIHsgcmV0dXJuIEZ1bmN0aW9ucy5iZWdpbigpOyB9CisgIEZ1bmNJbmZvVmVjOjppdGVyYXRvciBmdW5jaW5mb19lbmQoKSB7IHJldHVybiBGdW5jdGlvbnMuZW5kKCk7IH0KKworcHJpdmF0ZToKKyAgLy8vIE93bmluZyBsaXN0IG9mIGFsbCBHQ0Z1bmN0aW9uSW5mb3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgTW9kdWxlCisgIEZ1bmNJbmZvVmVjIEZ1bmN0aW9uczsKKworICAvLy8gTm9uLW93bmluZyBtYXAgdG8gYnlwYXNzIGxpbmVhciBzZWFyY2ggd2hlbiBmaW5kaW5nIHRoZSBHQ0Z1bmN0aW9uSW5mbworICAvLy8gYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBGdW5jdGlvbi4KKyAgdXNpbmcgZmluZm9fbWFwX3R5cGUgPSBEZW5zZU1hcDxjb25zdCBGdW5jdGlvbiAqLCBHQ0Z1bmN0aW9uSW5mbyAqPjsKKyAgZmluZm9fbWFwX3R5cGUgRkluZm9NYXA7CisKK3B1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3IgPSBTbWFsbFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8R0NTdHJhdGVneT4sIDE+Ojpjb25zdF9pdGVyYXRvcjsKKworICBzdGF0aWMgY2hhciBJRDsKKworICBHQ01vZHVsZUluZm8oKTsKKworICAvLy8gY2xlYXIgLSBSZXNldHMgdGhlIHBhc3MuIEFueSBwYXNzLCB3aGljaCB1c2VzIEdDTW9kdWxlSW5mbywgc2hvdWxkCisgIC8vLyBjYWxsIGl0IGluIGRvRmluYWxpemF0aW9uKCkuCisgIC8vLworICB2b2lkIGNsZWFyKCk7CisKKyAgLy8vIGJlZ2luL2VuZCAtIEl0ZXJhdG9ycyBmb3IgdXNlZCBzdHJhdGVnaWVzLgorICAvLy8KKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBHQ1N0cmF0ZWd5TGlzdC5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEdDU3RyYXRlZ3lMaXN0LmVuZCgpOyB9CisKKyAgLy8vIGdldCAtIExvb2sgdXAgZnVuY3Rpb24gbWV0YWRhdGEuICBUaGlzIGlzIGN1cnJlbnRseSBhc3N1bWVkCisgIC8vLyBoYXZlIHRoZSBzaWRlIGVmZmVjdCBvZiBpbml0aWFsaXppbmcgdGhlIGFzc29jaWF0ZWQgR0NTdHJhdGVneS4gIFRoYXQKKyAgLy8vIHdpbGwgc29vbiBjaGFuZ2UuCisgIEdDRnVuY3Rpb25JbmZvICZnZXRGdW5jdGlvbkluZm8oY29uc3QgRnVuY3Rpb24gJkYpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9HQ01FVEFEQVRBX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HQ01ldGFkYXRhUHJpbnRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dDTWV0YWRhdGFQcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjNjlhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HQ01ldGFkYXRhUHJpbnRlci5oCkBAIC0wLDAgKzEsNjcgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vR0NNZXRhZGF0YVByaW50ZXIuaCAtIFByaW50cyBhc20gR0MgdGFibGVzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgR0NNZXRhZGF0YVByaW50ZXIgc3VwcG9ydHMgd3JpdGluZyBHQyBtZXRhZGF0YSB0YWJsZXMKKy8vIGFzIGFzc2VtYmx5IGNvZGUuIFRoaXMgaXMgYSBzZXBhcmF0ZSBjbGFzcyBmcm9tIEdDU3RyYXRlZ3kgaW4gb3JkZXIgdG8gYWxsb3cKKy8vIHVzZXJzIG9mIHRoZSBMTFZNIEpJVCB0byBhdm9pZCBsaW5raW5nIHdpdGggdGhlIEFzbVdyaXRlci4KKy8vCisvLyBTdWJjbGFzc2VzIG9mIEdDTWV0YWRhdGFQcmludGVyIG11c3QgYmUgcmVnaXN0ZXJlZCB1c2luZyB0aGUKKy8vIEdDTWV0YWRhdGFQcmludGVyUmVnaXN0cnkuIFRoaXMgaXMgc2VwYXJhdGUgZnJvbSB0aGUgR0NTdHJhdGVneSBpdHNlbGYKKy8vIGJlY2F1c2UgdGhlc2Ugc3ViY2xhc3NlcyBhcmUgbG9naWNhbGx5IHBsdWdpbnMgZm9yIHRoZSBBc21Xcml0ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fR0NNRVRBREFUQVBSSU5URVJfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0NNRVRBREFUQVBSSU5URVJfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1JlZ2lzdHJ5LmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQXNtUHJpbnRlcjsKK2NsYXNzIEdDTWV0YWRhdGFQcmludGVyOworY2xhc3MgR0NNb2R1bGVJbmZvOworY2xhc3MgR0NTdHJhdGVneTsKK2NsYXNzIE1vZHVsZTsKKworLy8vIEdDTWV0YWRhdGFQcmludGVyUmVnaXN0cnkgLSBUaGUgR0MgYXNzZW1ibHkgcHJpbnRlciByZWdpc3RyeSB1c2VzIGFsbCB0aGUKKy8vLyBkZWZhdWx0cyBmcm9tIFJlZ2lzdHJ5LgordXNpbmcgR0NNZXRhZGF0YVByaW50ZXJSZWdpc3RyeSA9IFJlZ2lzdHJ5PEdDTWV0YWRhdGFQcmludGVyPjsKKworLy8vIEdDTWV0YWRhdGFQcmludGVyIC0gRW1pdHMgR0MgbWV0YWRhdGEgYXMgYXNzZW1ibHkgY29kZS4gIEluc3RhbmNlcyBhcmUKKy8vLyBjcmVhdGVkLCBtYW5hZ2VkLCBhbmQgb3duZWQgYnkgdGhlIEFzbVByaW50ZXIuCitjbGFzcyBHQ01ldGFkYXRhUHJpbnRlciB7Citwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQXNtUHJpbnRlcjsKKworICBHQ1N0cmF0ZWd5ICpTOworCitwcm90ZWN0ZWQ6CisgIC8vIE1heSBvbmx5IGJlIHN1YmNsYXNzZWQuCisgIEdDTWV0YWRhdGFQcmludGVyKCk7CisKK3B1YmxpYzoKKyAgR0NNZXRhZGF0YVByaW50ZXIoY29uc3QgR0NNZXRhZGF0YVByaW50ZXIgJikgPSBkZWxldGU7CisgIEdDTWV0YWRhdGFQcmludGVyICZvcGVyYXRvcj0oY29uc3QgR0NNZXRhZGF0YVByaW50ZXIgJikgPSBkZWxldGU7CisgIHZpcnR1YWwgfkdDTWV0YWRhdGFQcmludGVyKCk7CisKKyAgR0NTdHJhdGVneSAmZ2V0U3RyYXRlZ3koKSB7IHJldHVybiAqUzsgfQorCisgIC8vLyBDYWxsZWQgYmVmb3JlIHRoZSBhc3NlbWJseSBmb3IgdGhlIG1vZHVsZSBpcyBnZW5lcmF0ZWQgYnkKKyAgLy8vIHRoZSBBc21QcmludGVyIChidXQgYWZ0ZXIgdGFyZ2V0IHNwZWNpZmljIGhvb2tzLikKKyAgdmlydHVhbCB2b2lkIGJlZ2luQXNzZW1ibHkoTW9kdWxlICZNLCBHQ01vZHVsZUluZm8gJkluZm8sIEFzbVByaW50ZXIgJkFQKSB7fQorCisgIC8vLyBDYWxsZWQgYWZ0ZXIgdGhlIGFzc2VtYmx5IGZvciB0aGUgbW9kdWxlIGlzIGdlbmVyYXRlZCBieQorICAvLy8gdGhlIEFzbVByaW50ZXIgKGJ1dCBiZWZvcmUgdGFyZ2V0IHNwZWNpZmljIGhvb2tzKQorICB2aXJ0dWFsIHZvaWQgZmluaXNoQXNzZW1ibHkoTW9kdWxlICZNLCBHQ01vZHVsZUluZm8gJkluZm8sIEFzbVByaW50ZXIgJkFQKSB7fQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9HQ01FVEFEQVRBUFJJTlRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR0NTdHJhdGVneS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dDU3RyYXRlZ3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjE2OGU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dDU3RyYXRlZ3kuaApAQCAtMCwwICsxLDE4MSBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9HQ1N0cmF0ZWd5LmggLSBHYXJiYWdlIGNvbGxlY3Rpb24gLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBHQ1N0cmF0ZWd5IGNvb3JkaW5hdGVzIGNvZGUgZ2VuZXJhdGlvbiBhbGdvcml0aG1zIGFuZCBpbXBsZW1lbnRzIHNvbWUgaXRzZWxmCisvLyBpbiBvcmRlciB0byBnZW5lcmF0ZSBjb2RlIGNvbXBhdGlibGUgd2l0aCBhIHRhcmdldCBjb2RlIGdlbmVyYXRvciBhcworLy8gc3BlY2lmaWVkIGluIGEgZnVuY3Rpb24ncyAnZ2MnIGF0dHJpYnV0ZS4gQWxnb3JpdGhtcyBhcmUgZW5hYmxlZCBieSBzZXR0aW5nCisvLyBmbGFncyBpbiBhIHN1YmNsYXNzJ3MgY29uc3RydWN0b3IsIGFuZCBzb21lIHZpcnR1YWwgbWV0aG9kcyBjYW4gYmUKKy8vIG92ZXJyaWRkZW4uCisvLworLy8gR0NTdHJhdGVneSBpcyByZWxldmFudCBmb3IgaW1wbGVtZW50YXRpb25zIHVzaW5nIGVpdGhlciBnYy5yb290IG9yCisvLyBnYy5zdGF0ZXBvaW50IGJhc2VkIGxvd2VyaW5nIHN0cmF0ZWdpZXMsIGJ1dCBpcyBjdXJyZW50bHkgZm9jdXNlZCBtb3N0bHkgb24KKy8vIG9wdGlvbnMgZm9yIGdjLnJvb3QuICBUaGlzIHdpbGwgY2hhbmdlIG92ZXIgdGltZS4KKy8vCisvLyBXaGVuIHJlcXVlc3RlZCBieSBhIHN1YmNsYXNzIG9mIEdDU3RyYXRlZ3ksIHRoZSBnYy5yb290IGltcGxlbWVudGF0aW9uIHdpbGwKKy8vIHBvcHVsYXRlIEdDTW9kdWxlSW5mbyBhbmQgR0NGdW5jdGlvbkluZm8gd2l0aCB0aGF0IGFib3V0IGVhY2ggRnVuY3Rpb24gaW4KKy8vIHRoZSBNb2R1bGUgdGhhdCBvcHRzIGluIHRvIGdhcmJhZ2UgY29sbGVjdGlvbi4gIFNwZWNpZmljYWxseToKKy8vCisvLyAtIFNhZmUgcG9pbnRzCisvLyAgIEdhcmJhZ2UgY29sbGVjdGlvbiBpcyBnZW5lcmFsbHkgb25seSBwb3NzaWJsZSBhdCBjZXJ0YWluIHBvaW50cyBpbiBjb2RlLgorLy8gICBHQ1N0cmF0ZWd5IGNhbiByZXF1ZXN0IHRoYXQgdGhlIGNvbGxlY3RvciBpbnNlcnQgc3VjaCBwb2ludHM6CisvLworLy8gICAgIC0gQXQgYW5kIGFmdGVyIGFueSBjYWxsIHRvIGEgc3Vicm91dGluZQorLy8gICAgIC0gQmVmb3JlIHJldHVybmluZyBmcm9tIHRoZSBjdXJyZW50IGZ1bmN0aW9uCisvLyAgICAgLSBCZWZvcmUgYmFja3dhcmRzIGJyYW5jaGVzIChsb29wcykKKy8vCisvLyAtIFJvb3RzCisvLyAgIFdoZW4gYSByZWZlcmVuY2UgdG8gYSBHQy1hbGxvY2F0ZWQgb2JqZWN0IGV4aXN0cyBvbiB0aGUgc3RhY2ssIGl0IG11c3QgYmUKKy8vICAgc3RvcmVkIGluIGFuIGFsbG9jYSByZWdpc3RlcmVkIHdpdGggbGx2bS5nY29vdC4KKy8vCisvLyBUaGlzIGluZm9ybWF0aW9uIGNhbiB1c2VkIHRvIGVtaXQgdGhlIG1ldGFkYXRhIHRhYmxlcyB3aGljaCBhcmUgcmVxdWlyZWQgYnkKKy8vIHRoZSB0YXJnZXQgZ2FyYmFnZSBjb2xsZWN0b3IgcnVudGltZS4KKy8vCisvLyBXaGVuIHVzZWQgd2l0aCBnYy5zdGF0ZXBvaW50LCBpbmZvcm1hdGlvbiBhYm91dCBzYWZlcG9pbnQgYW5kIHJvb3RzIGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIGJpbmFyeSBTdGFja01hcCBzZWN0aW9uIGFmdGVyIGNvZGUgZ2VuZXJhdGlvbi4gIFNhZmVwb2ludAorLy8gcGxhY2VtZW50IGlzIGN1cnJlbnRseSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGZyb250ZW5kLCB0aG91Z2ggbGF0ZQorLy8gaW5zZXJ0aW9uIHN1cHBvcnQgaXMgcGxhbm5lZC4gIGdjLnN0YXRlcG9pbnQgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQKKy8vIGN1c3RvbSBzdGFjayBtYXAgZm9ybWF0czsgc3VjaCBjYW4gYmUgZ2VuZXJhdGVkIGJ5IHBhcnNpbmcgdGhlIHN0YW5kYXJkCisvLyBzdGFjayBtYXAgc2VjdGlvbiBpZiBkZXNpcmVkLgorLy8KKy8vIFRoZSByZWFkIGFuZCB3cml0ZSBiYXJyaWVyIHN1cHBvcnQgY2FuIGJlIHVzZWQgd2l0aCBlaXRoZXIgaW1wbGVtZW50YXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fR0NTVFJBVEVHWV9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9HQ1NUUkFURUdZX0gKKworI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9SZWdpc3RyeS5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBUeXBlOworCituYW1lc3BhY2UgR0MgeworCisvLy8gUG9pbnRLaW5kIC0gVXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWxsIGluc3RydWN0aW9uCisvLy8gb3IgdGhlIGFkZHJlc3MgYWZ0ZXIgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gaXMgbGlzdGVkIGluIHRoZSBzdGFja21hcC4gIEZvcgorLy8vIG1vc3QgcnVudGltZXMsIFBvc3RDYWxsIHNhZmVwb2ludHMgYXJlIGFwcHJvcHJpYXRlLgorLy8vCitlbnVtIFBvaW50S2luZCB7CisgIFByZUNhbGwsIC8vLzwgSW5zdHIgaXMgYSBjYWxsIGluc3RydWN0aW9uLgorICBQb3N0Q2FsbCAvLy88IEluc3RyIGlzIHRoZSByZXR1cm4gYWRkcmVzcyBvZiBhIGNhbGwuCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgR0MKKworLy8vIEdDU3RyYXRlZ3kgZGVzY3JpYmVzIGEgZ2FyYmFnZSBjb2xsZWN0b3IgYWxnb3JpdGhtJ3MgY29kZSBnZW5lcmF0aW9uCisvLy8gcmVxdWlyZW1lbnRzLCBhbmQgcHJvdmlkZXMgb3ZlcnJpZGFibGUgaG9va3MgZm9yIHRob3NlIG5lZWRzIHdoaWNoIGNhbm5vdAorLy8vIGJlIGFic3RyYWN0bHkgZGVzY3JpYmVkLiAgR0NTdHJhdGVneSBvYmplY3RzIG11c3QgYmUgbG9va2VkIHVwIHRocm91Z2gKKy8vLyB0aGUgRnVuY3Rpb24uICBUaGUgb2JqZWN0cyB0aGVtc2VsdmVzIGFyZSBvd25lZCBieSB0aGUgQ29udGV4dCBhbmQgbXVzdAorLy8vIGJlIGltbXV0YWJsZS4KK2NsYXNzIEdDU3RyYXRlZ3kgeworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEdDTW9kdWxlSW5mbzsKKworICBzdGQ6OnN0cmluZyBOYW1lOworCitwcm90ZWN0ZWQ6CisgIGJvb2wgVXNlU3RhdGVwb2ludHMgPSBmYWxzZTsgLy8vIFVzZXMgZ2Muc3RhdGVwb2ludHMgYXMgb3Bwb3NlZCB0byBnYy5yb290cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gaWYgc2V0LCBub25lIG9mIHRoZSBvdGhlciBvcHRpb25zIGNhbiBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBhbnl0aGluZyBidXQgdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisKKyAgdW5zaWduZWQgTmVlZGVkU2FmZVBvaW50cyA9IDA7ICAgIC8vLzwgQml0bWFzayBvZiByZXF1aXJlZCBzYWZlIHBvaW50cy4KKyAgYm9vbCBDdXN0b21SZWFkQmFycmllcnMgPSBmYWxzZTsgIC8vLzwgRGVmYXVsdCBpcyB0byBpbnNlcnQgbG9hZHMuCisgIGJvb2wgQ3VzdG9tV3JpdGVCYXJyaWVycyA9IGZhbHNlOyAvLy88IERlZmF1bHQgaXMgdG8gaW5zZXJ0IHN0b3Jlcy4KKyAgYm9vbCBDdXN0b21Sb290cyA9IGZhbHNlOyAgICAgIC8vLzwgRGVmYXVsdCBpcyB0byBwYXNzIHRocm91Z2ggdG8gYmFja2VuZC4KKyAgYm9vbCBJbml0Um9vdHM9IHRydWU7ICAgICAgICAgIC8vLzwgSWYgc2V0LCByb290cyBhcmUgbnVsbGVkIGR1cmluZyBsb3dlcmluZy4KKyAgYm9vbCBVc2VzTWV0YWRhdGEgPSBmYWxzZTsgICAgIC8vLzwgSWYgc2V0LCBiYWNrZW5kIG11c3QgZW1pdCBtZXRhZGF0YSB0YWJsZXMuCisKK3B1YmxpYzoKKyAgR0NTdHJhdGVneSgpOworICB2aXJ0dWFsIH5HQ1N0cmF0ZWd5KCkgPSBkZWZhdWx0OworCisgIC8vLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIEdDIHN0cmF0ZWd5LiAgVGhpcyBpcyB0aGUgdmFsdWUgb2YgdGhlIGNvbGxlY3RvcgorICAvLy8gbmFtZSBzdHJpbmcgc3BlY2lmaWVkIG9uIGZ1bmN0aW9ucyB3aGljaCB1c2UgdGhpcyBzdHJhdGVneS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgLy8vIEJ5IGRlZmF1bHQsIHdyaXRlIGJhcnJpZXJzIGFyZSByZXBsYWNlZCB3aXRoIHNpbXBsZSBzdG9yZQorICAvLy8gaW5zdHJ1Y3Rpb25zLiBJZiB0cnVlLCB5b3UgbXVzdCBwcm92aWRlIGEgY3VzdG9tIHBhc3MgdG8gbG93ZXIgCisgIC8vLyBjYWxscyB0byBAbGx2bS5nY3dyaXRlLgorICBib29sIGN1c3RvbVdyaXRlQmFycmllcigpIGNvbnN0IHsgcmV0dXJuIEN1c3RvbVdyaXRlQmFycmllcnM7IH0KKworICAvLy8gQnkgZGVmYXVsdCwgcmVhZCBiYXJyaWVycyBhcmUgcmVwbGFjZWQgd2l0aCBzaW1wbGUgbG9hZAorICAvLy8gaW5zdHJ1Y3Rpb25zLiBJZiB0cnVlLCB5b3UgbXVzdCBwcm92aWRlIGEgY3VzdG9tIHBhc3MgdG8gbG93ZXIgCisgIC8vLyBjYWxscyB0byBAbGx2bS5nY3JlYWQuCisgIGJvb2wgY3VzdG9tUmVhZEJhcnJpZXIoKSBjb25zdCB7IHJldHVybiBDdXN0b21SZWFkQmFycmllcnM7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgc3RyYXRlZ3kgaXMgZXhwZWN0aW5nIHRoZSB1c2Ugb2YgZ2Muc3RhdGVwb2ludHMsCisgIC8vLyBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIHVzZVN0YXRlcG9pbnRzKCkgY29uc3QgeyByZXR1cm4gVXNlU3RhdGVwb2ludHM7IH0KKworICAvKiogQG5hbWUgU3RhdGVwb2ludCBTcGVjaWZpYyBQcm9wZXJ0aWVzICovCisgIC8vL0B7CisKKyAgLy8vIElmIHRoZSB0eXBlIHNwZWNpZmllZCBjYW4gYmUgcmVsaWFibHkgZGlzdGluZ3Vpc2hlZCwgcmV0dXJucyB0cnVlIGZvcgorICAvLy8gcG9pbnRlcnMgdG8gR0MgbWFuYWdlZCBsb2NhdGlvbnMgYW5kIGZhbHNlIGZvciBwb2ludGVycyB0byBub24tR0MKKyAgLy8vIG1hbmFnZWQgbG9jYXRpb25zLiAgTm90ZSBhIEdDU3RyYXRlZ3kgY2FuIGFsd2F5cyByZXR1cm4gJ05vbmUnIChpLmUuIGFuCisgIC8vLyBlbXB0eSBvcHRpb25hbCBpbmRpY2F0aW5nIGl0IGNhbid0IHJlbGlhYmx5IGRpc3Rpbmd1aXNoLgorICB2aXJ0dWFsIE9wdGlvbmFsPGJvb2w+IGlzR0NNYW5hZ2VkUG9pbnRlcihjb25zdCBUeXBlICpUeSkgY29uc3QgeworICAgIHJldHVybiBOb25lOworICB9CisgIC8vL0B9CisKKyAgLyoqIEBuYW1lIEdDUm9vdCBTcGVjaWZpYyBQcm9wZXJ0aWVzCisgICAqIFRoZXNlIHByb3BlcnRpZXMgYW5kIG92ZXJyaWRlcyBvbmx5IGFwcGx5IHRvIGNvbGxlY3RvciBzdHJhdGVnaWVzIHVzaW5nCisgICAqIEdDUm9vdC4KKyAgICovCisgIC8vL0B7CisKKyAgLy8vIFRydWUgaWYgc2FmZSBwb2ludHMgb2YgYW55IGtpbmQgYXJlIHJlcXVpcmVkLiBCeSBkZWZhdWx0LCBub25lIGFyZQorICAvLy8gcmVjb3JkZWQuCisgIGJvb2wgbmVlZHNTYWZlUG9pbnRzKCkgY29uc3QgeyByZXR1cm4gTmVlZGVkU2FmZVBvaW50cyAhPSAwOyB9CisKKyAgLy8vIFRydWUgaWYgdGhlIGdpdmVuIGtpbmQgb2Ygc2FmZSBwb2ludCBpcyByZXF1aXJlZC4gQnkgZGVmYXVsdCwgbm9uZSBhcmUKKyAgLy8vIHJlY29yZGVkLgorICBib29sIG5lZWRzU2FmZVBvaW50KEdDOjpQb2ludEtpbmQgS2luZCkgY29uc3QgeworICAgIHJldHVybiAoTmVlZGVkU2FmZVBvaW50cyAmIDEgPDwgS2luZCkgIT0gMDsKKyAgfQorCisgIC8vLyBCeSBkZWZhdWx0LCByb290cyBhcmUgbGVmdCBmb3IgdGhlIGNvZGUgZ2VuZXJhdG9yIHNvIGl0IGNhbiBnZW5lcmF0ZSBhCisgIC8vLyBzdGFjayBtYXAuIElmIHRydWUsIHlvdSBtdXN0IHByb3ZpZGUgYSBjdXN0b20gcGFzcyB0byBsb3dlciAKKyAgLy8vIGNhbGxzIHRvIEBsbHZtLmdjcm9vdC4KKyAgYm9vbCBjdXN0b21Sb290cygpIGNvbnN0IHsgcmV0dXJuIEN1c3RvbVJvb3RzOyB9CisKKyAgLy8vIElmIHNldCwgZ2Nyb290IGludHJpbnNpY3Mgc2hvdWxkIGluaXRpYWxpemUgdGhlaXIgYWxsb2NhcyB0byBudWxsCisgIC8vLyBiZWZvcmUgdGhlIGZpcnN0IHVzZS4gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIG1vc3QgR0NzIGFuZCBpcyBlbmFibGVkIGJ5CisgIC8vLyBkZWZhdWx0LgorICBib29sIGluaXRpYWxpemVSb290cygpIGNvbnN0IHsgcmV0dXJuIEluaXRSb290czsgfQorCisgIC8vLyBJZiBzZXQsIGFwcHJvcHJpYXRlIG1ldGFkYXRhIHRhYmxlcyBtdXN0IGJlIGVtaXR0ZWQgYnkgdGhlIGJhY2stZW5kCisgIC8vLyAoYXNzZW1ibGVyLCBKSVQsIG9yIG90aGVyd2lzZSkuIEZvciBzdGF0ZXBvaW50LCB0aGlzIG1ldGhvZCBpcworICAvLy8gY3VycmVudGx5IHVuc3VwcG9ydGVkLiAgVGhlIHN0YWNrbWFwIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUKKyAgLy8vIFN0YWNrTWFwIHNlY3Rpb24gYXMgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorICBib29sIHVzZXNNZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuIFVzZXNNZXRhZGF0YTsgfQorCisgIC8vL0B9Cit9OworCisvLy8gU3ViY2xhc3NlcyBvZiBHQ1N0cmF0ZWd5IGFyZSBtYWRlIGF2YWlsYWJsZSBmb3IgdXNlIGR1cmluZyBjb21waWxhdGlvbiBieQorLy8vIGFkZGluZyB0aGVtIHRvIHRoZSBnbG9iYWwgR0NSZWdpc3RyeS4gIFRoaXMgY2FuIGRvbmUgZWl0aGVyIHdpdGhpbiB0aGUKKy8vLyBMTFZNIHNvdXJjZSB0cmVlIG9yIHZpYSBhIGxvYWRhYmxlIHBsdWdpbi4gIEFuIGV4YW1wbGUgcmVnaXN0ZXJhdGlvbgorLy8vIHdvdWxkIGJlOgorLy8vIHN0YXRpYyBHQ1JlZ2lzdHJ5OjpBZGQ8Q3VzdG9tR0M+IFgoImN1c3RvbS1uYW1lIiwKKy8vLyAgICAgICAgIm15IGN1c3RvbSBzdXBwZXIgZmFuY3kgZ2Mgc3RyYXRlZ3kiKTsKKy8vLworLy8vIE5vdGUgdGhhdCB0byB1c2UgYSBjdXN0b20gR0NNZXRhZGF0YVByaW50ZXIgdy9nYy5yb290cywgeW91IG11c3QgYWxzbworLy8vIHJlZ2lzdGVyIHlvdXIgR0NNZXRhZGF0YVByaW50ZXIgc3ViY2xhc3Mgd2l0aCB0aGUKKy8vLyBHQ01ldGFkYXRhUHJpbnRlclJlZ2lzdGVyeSBhcyB3ZWxsLgordXNpbmcgR0NSZWdpc3RyeSA9IFJlZ2lzdHJ5PEdDU3RyYXRlZ3k+OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0dDU1RSQVRFR1lfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dDcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dDcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMDdmODAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR0NzLmgKQEAgLTAsMCArMSw0NiBAQAorLy89PT0tLSBHQ3MuaCAtIEdhcmJhZ2UgY29sbGVjdG9yIGxpbmthZ2UgaGFja3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgaGFjayBmdW5jdGlvbnMgdG8gZm9yY2UgbGlua2luZyBpbiB0aGUgR0MgY29tcG9uZW50cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HQ1NfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0NTX0gKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgR0NTdHJhdGVneTsKK2NsYXNzIEdDTWV0YWRhdGFQcmludGVyOworCisvLy8gRklYTUU6IENvbGxlY3RvciBpbnN0YW5jZXMgYXJlIG5vdCB1c2VmdWwgb24gdGhlaXIgb3duLiBUaGVzZSBubyBsb25nZXIKKy8vLyAgICAgICAgc2VydmUgYW55IHB1cnBvc2UgZXhjZXB0IHRvIGxpbmsgaW4gdGhlIHBsdWdpbnMuCisKKy8vLyBDcmVhdGVzIGEgQ29yZUNMUi1jb21wYXRpYmxlIGdhcmJhZ2UgY29sbGVjdG9yLgordm9pZCBsaW5rQ29yZUNMUkdDKCk7CisKKy8vLyBDcmVhdGVzIGFuIG9jYW1sLWNvbXBhdGlibGUgZ2FyYmFnZSBjb2xsZWN0b3IuCit2b2lkIGxpbmtPY2FtbEdDKCk7CisKKy8vLyBDcmVhdGVzIGFuIG9jYW1sLWNvbXBhdGlibGUgbWV0YWRhdGEgcHJpbnRlci4KK3ZvaWQgbGlua09jYW1sR0NQcmludGVyKCk7CisKKy8vLyBDcmVhdGVzIGFuIGVybGFuZy1jb21wYXRpYmxlIGdhcmJhZ2UgY29sbGVjdG9yLgordm9pZCBsaW5rRXJsYW5nR0MoKTsKKworLy8vIENyZWF0ZXMgYW4gZXJsYW5nLWNvbXBhdGlibGUgbWV0YWRhdGEgcHJpbnRlci4KK3ZvaWQgbGlua0VybGFuZ0dDUHJpbnRlcigpOworCisvLy8gQ3JlYXRlcyBhIHNoYWRvdyBzdGFjayBnYXJiYWdlIGNvbGxlY3Rvci4gVGhpcyBjb2xsZWN0b3IgcmVxdWlyZXMgbm8gY29kZQorLy8vIGdlbmVyYXRvciBzdXBwb3J0Lgordm9pZCBsaW5rU2hhZG93U3RhY2tHQygpOworCit2b2lkIGxpbmtTdGF0ZXBvaW50RXhhbXBsZUdDKCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvQ2FsbExvd2VyaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9DYWxsTG93ZXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDkxY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvQ2FsbExvd2VyaW5nLmgKQEAgLTAsMCArMSwyMTUgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9DYWxsTG93ZXJpbmcuaCAtIENhbGwgbG93ZXJpbmcgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgaG93IHRvIGxvd2VyIExMVk0gY2FsbHMgdG8gbWFjaGluZSBjb2RlIGNhbGxzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0NBTExMT1dFUklOR19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0NBTExMT1dFUklOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9DYWxsaW5nQ29udkxvd2VyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldENhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYWNoaW5lVmFsdWVUeXBlLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIERhdGFMYXlvdXQ7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVJUkJ1aWxkZXI7CitjbGFzcyBNYWNoaW5lT3BlcmFuZDsKK3N0cnVjdCBNYWNoaW5lUG9pbnRlckluZm87CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgVGFyZ2V0TG93ZXJpbmc7CitjbGFzcyBUeXBlOworY2xhc3MgVmFsdWU7CisKK2NsYXNzIENhbGxMb3dlcmluZyB7CisgIGNvbnN0IFRhcmdldExvd2VyaW5nICpUTEk7CisKK3B1YmxpYzoKKyAgc3RydWN0IEFyZ0luZm8geworICAgIHVuc2lnbmVkIFJlZzsKKyAgICBUeXBlICpUeTsKKyAgICBJU0Q6OkFyZ0ZsYWdzVHkgRmxhZ3M7CisgICAgYm9vbCBJc0ZpeGVkOworCisgICAgQXJnSW5mbyh1bnNpZ25lZCBSZWcsIFR5cGUgKlR5LCBJU0Q6OkFyZ0ZsYWdzVHkgRmxhZ3MgPSBJU0Q6OkFyZ0ZsYWdzVHl7fSwKKyAgICAgICAgICAgIGJvb2wgSXNGaXhlZCA9IHRydWUpCisgICAgICAgIDogUmVnKFJlZyksIFR5KFR5KSwgRmxhZ3MoRmxhZ3MpLCBJc0ZpeGVkKElzRml4ZWQpIHt9CisgIH07CisKKyAgLy8vIEFyZ3VtZW50IGhhbmRsaW5nIGlzIG1vc3RseSB1bmlmb3JtIGJldHdlZW4gdGhlIGZvdXIgcGxhY2VzIHRoYXQKKyAgLy8vIG1ha2UgdGhlc2UgZGVjaXNpb25zOiBmdW5jdGlvbiBmb3JtYWwgYXJndW1lbnRzLCBjYWxsCisgIC8vLyBpbnN0cnVjdGlvbiBhcmdzLCBjYWxsIGluc3RydWN0aW9uIHJldHVybnMgYW5kIGZ1bmN0aW9uCisgIC8vLyByZXR1cm5zLiBIb3dldmVyLCBvbmNlIGEgZGVjaXNpb24gaGFzIGJlZW4gbWFkZSBvbiB3aGVyZSBhbgorICAvLy8gYXJ1Z21lbnQgc2hvdWxkIGdvLCBleGFjdGx5IHdoYXQgaGFwcGVucyBjYW4gdmFyeSBzbGlnaHRseS4gVGhpcworICAvLy8gY2xhc3MgYWJzdHJhY3RzIHRoZSBkaWZmZXJlbmNlcy4KKyAgc3RydWN0IFZhbHVlSGFuZGxlciB7CisgICAgVmFsdWVIYW5kbGVyKE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIsIE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwKKyAgICAgICAgICAgICAgICAgQ0NBc3NpZ25GbiAqQXNzaWduRm4pCisgICAgICA6IE1JUkJ1aWxkZXIoTUlSQnVpbGRlciksIE1SSShNUkkpLCBBc3NpZ25GbihBc3NpZ25Gbikge30KKworICAgIHZpcnR1YWwgflZhbHVlSGFuZGxlcigpID0gZGVmYXVsdDsKKworICAgIC8vLyBNYXRlcmlhbGl6ZSBhIFZSZWcgY29udGFpbmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkCisgICAgLy8vIHN0YWNrLWJhc2VkIG9iamVjdC4gVGhpcyBpcyBlaXRoZXIgYmFzZWQgb24gYSBGcmFtZUluZGV4IG9yCisgICAgLy8vIGRpcmVjdCBTUCBtYW5pcHVsYXRpb24sIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dC4gXHAgTVBPCisgICAgLy8vIHNob3VsZCBiZSBpbml0aWFsaXplZCB0byBhbiBhcHByb3ByaWF0ZSBkZXNjcmlwdGlvbiBvZiB0aGUKKyAgICAvLy8gYWRkcmVzcyBjcmVhdGVkLgorICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0U3RhY2tBZGRyZXNzKHVpbnQ2NF90IFNpemUsIGludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVQb2ludGVySW5mbyAmTVBPKSA9IDA7CisKKyAgICAvLy8gVGhlIHNwZWNpZmllZCB2YWx1ZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBhIHBoeXNpY2FsIHJlZ2lzdGVyLAorICAgIC8vLyBoYW5kbGUgdGhlIGFwcHJvcHJpYXRlIENPUFkgKGVpdGhlciB0byBvciBmcm9tKSBhbmQgbWFyayBhbnkKKyAgICAvLy8gcmVsZXZhbnQgdXNlcy9kZWZpbmVzIGFzIG5lZWRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgYXNzaWduVmFsdWVUb1JlZyh1bnNpZ25lZCBWYWxWUmVnLCB1bnNpZ25lZCBQaHlzUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDVmFsQXNzaWduICZWQSkgPSAwOworCisgICAgLy8vIFRoZSBzcGVjaWZpZWQgdmFsdWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYSBzdGFjaworICAgIC8vLyBsb2NhdGlvbi4gTG9hZCBvciBzdG9yZSBpdCB0aGVyZSwgd2l0aCBhcHByb3ByaWF0ZSBleHRlbnNpb24KKyAgICAvLy8gaWYgbmVjZXNzYXJ5LgorICAgIHZpcnR1YWwgdm9pZCBhc3NpZ25WYWx1ZVRvQWRkcmVzcyh1bnNpZ25lZCBWYWxWUmVnLCB1bnNpZ25lZCBBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplLCBNYWNoaW5lUG9pbnRlckluZm8gJk1QTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NWYWxBc3NpZ24gJlZBKSA9IDA7CisKKyAgICAvLy8gSGFuZGxlIGN1c3RvbSB2YWx1ZXMsIHdoaWNoIG1heSBiZSBwYXNzZWQgaW50byBvbmUgb3IgbW9yZSBvZiBccCBWQXMuCisgICAgLy8vIFxyZXR1cm4gVGhlIG51bWJlciBvZiBccCBWQXMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQgYWZ0ZXIgdGhlIGZpcnN0CisgICAgLy8vICAgICAgICAgb25lLCBhbmQgd2hpY2ggc2hvdWxkIHRoZXJlZm9yZSBiZSBza2lwcGVkIGZyb20gZnVydGhlcgorICAgIC8vLyAgICAgICAgIHByb2Nlc3NpbmcuCisgICAgdmlydHVhbCB1bnNpZ25lZCBhc3NpZ25DdXN0b21WYWx1ZShjb25zdCBBcmdJbmZvICZBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDQ1ZhbEFzc2lnbj4gVkFzKSB7CisgICAgICAvLyBUaGlzIGlzIG5vdCBhIHB1cmUgdmlydHVhbCBtZXRob2QgYmVjYXVzZSBub3QgYWxsIHRhcmdldHMgbmVlZCB0byB3b3JyeQorICAgICAgLy8gYWJvdXQgY3VzdG9tIHZhbHVlcy4KKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkN1c3RvbSB2YWx1ZXMgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKworICAgIHVuc2lnbmVkIGV4dGVuZFJlZ2lzdGVyKHVuc2lnbmVkIFZhbFJlZywgQ0NWYWxBc3NpZ24gJlZBKTsKKworICAgIHZpcnR1YWwgYm9vbCBhc3NpZ25BcmcodW5zaWduZWQgVmFsTm8sIE1WVCBWYWxWVCwgTVZUIExvY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NWYWxBc3NpZ246OkxvY0luZm8gTG9jSW5mbywgY29uc3QgQXJnSW5mbyAmSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENDU3RhdGUgJlN0YXRlKSB7CisgICAgICByZXR1cm4gQXNzaWduRm4oVmFsTm8sIFZhbFZULCBMb2NWVCwgTG9jSW5mbywgSW5mby5GbGFncywgU3RhdGUpOworICAgIH0KKworICAgIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXI7CisgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJOworICAgIENDQXNzaWduRm4gKkFzc2lnbkZuOworICB9OworCitwcm90ZWN0ZWQ6CisgIC8vLyBHZXR0ZXIgZm9yIGdlbmVyaWMgVGFyZ2V0TG93ZXJpbmcgY2xhc3MuCisgIGNvbnN0IFRhcmdldExvd2VyaW5nICpnZXRUTEkoKSBjb25zdCB7CisgICAgcmV0dXJuIFRMSTsKKyAgfQorCisgIC8vLyBHZXR0ZXIgZm9yIHRhcmdldCBzcGVjaWZpYyBUYXJnZXRMb3dlcmluZyBjbGFzcy4KKyAgdGVtcGxhdGUgPGNsYXNzIFhYWFRhcmdldExvd2VyaW5nPgorICAgIGNvbnN0IFhYWFRhcmdldExvd2VyaW5nICpnZXRUTEkoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFhYWFRhcmdldExvd2VyaW5nICo+KFRMSSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY0luZm9UeT4KKyAgdm9pZCBzZXRBcmdGbGFncyhBcmdJbmZvICZBcmcsIHVuc2lnbmVkIE9wTnVtLCBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jSW5mb1R5ICZGdW5jSW5mbykgY29uc3Q7CisKKyAgLy8vIEludm9rZSBIYW5kbGVyOjphc3NpZ25Bcmcgb24gZWFjaCBvZiB0aGUgZ2l2ZW4gXHAgQXJncyBhbmQgdGhlbiB1c2UKKyAgLy8vIFxwIENhbGxiYWNrIHRvIG1vdmUgdGhlbSB0byB0aGUgYXNzaWduZWQgbG9jYXRpb25zLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVHJ1ZSBpZiBldmVyeXRoaW5nIGhhcyBzdWNjZWVkZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBoYW5kbGVBc3NpZ25tZW50cyhNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyLCBBcnJheVJlZjxBcmdJbmZvPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlSGFuZGxlciAmQ2FsbGJhY2spIGNvbnN0OworCitwdWJsaWM6CisgIENhbGxMb3dlcmluZyhjb25zdCBUYXJnZXRMb3dlcmluZyAqVExJKSA6IFRMSShUTEkpIHt9CisgIHZpcnR1YWwgfkNhbGxMb3dlcmluZygpID0gZGVmYXVsdDsKKworICAvLy8gVGhpcyBob29rIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gbG93ZXIgb3V0Z29pbmcgcmV0dXJuIHZhbHVlcywgZGVzY3JpYmVkCisgIC8vLyBieSBccCBWYWwsIGludG8gdGhlIHNwZWNpZmllZCB2aXJ0dWFsIHJlZ2lzdGVyIFxwIFZSZWcuCisgIC8vLyBUaGlzIGhvb2sgaXMgdXNlZCBieSBHbG9iYWxJU2VsLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVHJ1ZSBpZiB0aGUgbG93ZXJpbmcgc3VjY2VlZHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgdmlydHVhbCBib29sIGxvd2VyUmV0dXJuKE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqVmFsLCB1bnNpZ25lZCBWUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFRoaXMgaG9vayBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGxvd2VyIHRoZSBpbmNvbWluZyAoZm9ybWFsKQorICAvLy8gYXJndW1lbnRzLCBkZXNjcmliZWQgYnkgXHAgQXJncywgZm9yIEdsb2JhbElTZWwuIEVhY2ggYXJndW1lbnQKKyAgLy8vIG11c3QgZW5kIHVwIGluIHRoZSByZWxhdGVkIHZpcnR1YWwgcmVnaXN0ZXIgZGVzY3JpYmVkIGJ5IFZSZWdzLgorICAvLy8gSW4gb3RoZXIgd29yZHMsIHRoZSBmaXJzdCBhcmd1bWVudCBzaG91bGQgZW5kIHVwIGluIFZSZWdzWzBdLAorICAvLy8gdGhlIHNlY29uZCBpbiBWUmVnc1sxXSwgYW5kIHNvIG9uLgorICAvLy8gXHAgTUlSQnVpbGRlciBpcyBzZXQgdG8gdGhlIHByb3BlciBpbnNlcnRpb24gZm9yIHRoZSBhcmd1bWVudAorICAvLy8gbG93ZXJpbmcuCisgIC8vLworICAvLy8gXHJldHVybiBUcnVlIGlmIHRoZSBsb3dlcmluZyBzdWNjZWVkZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgdmlydHVhbCBib29sIGxvd2VyRm9ybWFsQXJndW1lbnRzKE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBWUmVncykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBUaGlzIGhvb2sgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBsb3dlciB0aGUgZ2l2ZW4gY2FsbCBpbnN0cnVjdGlvbiwKKyAgLy8vIGluY2x1ZGluZyBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlIG1hcnNoYWxsaW5nLgorICAvLy8KKyAgLy8vIFxwIENhbGxDb252IGlzIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gdG8gYmUgdXNlZCBmb3IgdGhlIGNhbGwuCisgIC8vLworICAvLy8gXHAgQ2FsbGVlIGlzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgY2FsbC4gSXQgc2hvdWxkIGJlIGVpdGhlciBhIHJlZ2lzdGVyLAorICAvLy8gZ2xvYmFsYWRkcmVzcywgb3IgZXh0ZXJuYWxzeW1ib2wuCisgIC8vLworICAvLy8gXHAgUmVzVHkgaXMgdGhlIHR5cGUgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uCisgIC8vLworICAvLy8gXHAgUmVzUmVnIGlzIHRoZSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgdGhhdCB0aGUgcmV0dXJuZWQKKyAgLy8vIHZhbHVlIHNob3VsZCBiZSBsb3dlcmVkIGludG8uCisgIC8vLworICAvLy8gXHAgQXJnVHlzIGlzIGEgbGlzdCBvZiB0aGUgdHlwZXMgZWFjaCBtZW1iZXIgb2YgXHAgQXJnUmVncyBoYXM7IHVzZWQgYnkKKyAgLy8vIHRoZSB0YXJnZXQgdG8gZGVjaWRlIHdoaWNoIHJlZ2lzdGVyL3N0YWNrIHNsb3Qgc2hvdWxkIGJlIGFsbG9jYXRlZC4KKyAgLy8vCisgIC8vLyBccCBBcmdSZWdzIGlzIGEgbGlzdCBvZiB2aXJ0dWFsIHJlZ2lzdGVycyBjb250YWluaW5nIGVhY2ggYXJndW1lbnQgdGhhdAorICAvLy8gbmVlZHMgdG8gYmUgcGFzc2VkLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gdHJ1ZSBpZiB0aGUgbG93ZXJpbmcgc3VjY2VlZGVkLCBmYWxzZSBvdGhlcndpc2UuCisgIHZpcnR1YWwgYm9vbCBsb3dlckNhbGwoTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlciwgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZDYWxsZWUsIGNvbnN0IEFyZ0luZm8gJk9yaWdSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8QXJnSW5mbz4gT3JpZ0FyZ3MpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gTG93ZXIgdGhlIGdpdmVuIGNhbGwgaW5zdHJ1Y3Rpb24sIGluY2x1ZGluZyBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlCisgIC8vLyBtYXJzaGFsbGluZy4KKyAgLy8vCisgIC8vLyBccCBDSSBpcyB0aGUgY2FsbC9pbnZva2UgaW5zdHJ1Y3Rpb24uCisgIC8vLworICAvLy8gXHAgUmVzUmVnIGlzIGEgcmVnaXN0ZXIgd2hlcmUgdGhlIGNhbGwncyByZXR1cm4gdmFsdWUgc2hvdWxkIGJlIHN0b3JlZCAob3IKKyAgLy8vIDAgaWYgdGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlKS4KKyAgLy8vCisgIC8vLyBccCBBcmdSZWdzIGlzIGEgbGlzdCBvZiB2aXJ0dWFsIHJlZ2lzdGVycyBjb250YWluaW5nIGVhY2ggYXJndW1lbnQgdGhhdAorICAvLy8gbmVlZHMgdG8gYmUgcGFzc2VkLgorICAvLy8KKyAgLy8vIFxwIEdldENhbGxlZVJlZyBpcyBhIGNhbGxiYWNrIHRvIG1hdGVyaWFsaXplIGEgcmVnaXN0ZXIgZm9yIHRoZSBjYWxsZWUgaWYKKyAgLy8vIHRoZSB0YXJnZXQgZGV0ZXJtaW5lcyBpdCBjYW5ub3QganVtcCB0byB0aGUgZGVzdGluYXRpb24gYmFzZWQgcHVyZWx5IG9uIFxwCisgIC8vLyBDSS4gVGhpcyBtaWdodCBiZSBiZWNhdXNlIFxwIENJIGlzIGluZGlyZWN0LCBvciBiZWNhdXNlIG9mIHRoZSBsaW1pdGVkCisgIC8vLyByYW5nZSBvZiBhbiBpbW1lZGlhdGUganVtcC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIHRydWUgaWYgdGhlIGxvd2VyaW5nIHN1Y2NlZWRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGxvd2VyQ2FsbChNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyLCBJbW11dGFibGVDYWxsU2l0ZSBDUywKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVzUmVnLCBBcnJheVJlZjx1bnNpZ25lZD4gQXJnUmVncywKKyAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx1bnNpZ25lZCgpPiBHZXRDYWxsZWVSZWcpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0NBTExMT1dFUklOR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9Db21iaW5lci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvQ29tYmluZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmEzM2RlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvQ29tYmluZXIuaApAQCAtMCwwICsxLDQzIEBACisvLz09IC0tLS0tIGxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0NvbWJpbmVyLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tID09IC8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFRoaXMgY29udGFpbnMgY29tbW9uIGNvZGUgdG8gZHJpdmUgY29tYmluZXMuIENvbWJpbmVyIFBhc3NlcyB3aWxsIG5lZWQgdG8KKy8vLyBzZXR1cCBhIENvbWJpbmVySW5mbyBhbmQgY2FsbCBjb21iaW5lTWFjaGluZUZ1bmN0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfQ09NQklORVJfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9DT01CSU5FUl9ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9NYWNoaW5lSVJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIENvbWJpbmVySW5mbzsKK2NsYXNzIFRhcmdldFBhc3NDb25maWc7CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CisKK2NsYXNzIENvbWJpbmVyIHsKK3B1YmxpYzoKKyAgQ29tYmluZXIoQ29tYmluZXJJbmZvICZDb21iaW5lckluZm8sIGNvbnN0IFRhcmdldFBhc3NDb25maWcgKlRQQyk7CisKKyAgYm9vbCBjb21iaW5lTWFjaGluZUluc3RycyhNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworcHJvdGVjdGVkOgorICBDb21iaW5lckluZm8gJkNJbmZvOworCisgIE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSA9IG51bGxwdHI7CisgIGNvbnN0IFRhcmdldFBhc3NDb25maWcgKlRQQzsKKyAgTWFjaGluZUlSQnVpbGRlciBCdWlsZGVyOworfTsKKworfSAvLyBFbmQgbmFtZXNwYWNlIGxsdm0uCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9HSUNPTUJJTkVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0NvbWJpbmVySGVscGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9Db21iaW5lckhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNWI4MzkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9Db21iaW5lckhlbHBlci5oCkBAIC0wLDAgKzEsNDQgQEAKKy8vPT0gbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvQ29tYmluZXJIZWxwZXIuaCAtLS0tLS0tLS0tLS0tLSAtKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFRoaXMgY29udGFpbnMgY29tbW9uIGNvbWJpbmUgdHJhbnNmb3JtYXRpb25zIHRoYXQgbWF5IGJlIHVzZWQgaW4gYSBjb21iaW5lCisvLy8gcGFzcyxvciBieSB0aGUgdGFyZ2V0IGVsc2V3aGVyZS4KKy8vLyBUYXJnZXRzIGNhbiBwaWNrIGluZGl2aWR1YWwgb3Bjb2RlIHRyYW5zZm9ybWF0aW9ucyBmcm9tIHRoZSBoZWxwZXIgb3IgdXNlCisvLy8gdHJ5Q29tYmluZSB3aGljaCBpbnZva2VzIGFsbCB0cmFuc2Zvcm1hdGlvbnMuIEFsbCBvZiB0aGUgdHJhbnNmb3JtYXRpb25zCisvLy8gcmV0dXJuIHRydWUgaWYgdGhlIE1hY2hpbmVJbnN0cnVjdGlvbiBjaGFuZ2VkIGFuZCBmYWxzZSBvdGhlcndpc2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfQ09NQklORVJfSEVMUEVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfQ09NQklORVJfSEVMUEVSX0gKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lSVJCdWlsZGVyOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKKworY2xhc3MgQ29tYmluZXJIZWxwZXIgeworICBNYWNoaW5lSVJCdWlsZGVyICZCdWlsZGVyOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkk7CisKK3B1YmxpYzoKKyAgQ29tYmluZXJIZWxwZXIoTWFjaGluZUlSQnVpbGRlciAmQik7CisKKyAgLy8vIElmIFxwIE1JIGlzIENPUFksIHRyeSB0byBjb21iaW5lIGl0LgorICAvLy8gUmV0dXJucyB0cnVlIGlmIE1JIGNoYW5nZWQuCisgIGJvb2wgdHJ5Q29tYmluZUNvcHkoTWFjaGluZUluc3RyICZNSSk7CisKKyAgLy8vIFRyeSB0byB0cmFuc2Zvcm0gXHAgTUkgYnkgdXNpbmcgYWxsIG9mIHRoZSBhYm92ZQorICAvLy8gY29tYmluZSBmdW5jdGlvbnMuIFJldHVybnMgdHJ1ZSBpZiBjaGFuZ2VkLgorICBib29sIHRyeUNvbWJpbmUoTWFjaGluZUluc3RyICZNSSk7Cit9OworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0NvbWJpbmVySW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvQ29tYmluZXJJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyNDg1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0NvbWJpbmVySW5mby5oCkBAIC0wLDAgKzEsNDggQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9Db21iaW5lckluZm8uaCAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gSW50ZXJmYWNlIGZvciBUYXJnZXRzIHRvIHNwZWNpZnkgd2hpY2ggb3BlcmF0aW9ucyBhcmUgY29tYmluZWQgaG93IGFuZCB3aGVuLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0NPTUJJTkVSX0lORk9fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9DT01CSU5FUl9JTkZPX0gKKworI2luY2x1ZGUgPGNhc3NlcnQ+CituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExlZ2FsaXplckluZm87CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBNYWNoaW5lSVJCdWlsZGVyOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKKy8vIENvbnRhaW5zIGluZm9ybWF0aW9uIHJlbGV2YW50IHRvIGVuYWJsaW5nL2Rpc2FibGluZyB2YXJpb3VzIGNvbWJpbmVzIGZvciBhCisvLyBwYXNzLgorY2xhc3MgQ29tYmluZXJJbmZvIHsKK3B1YmxpYzoKKyAgQ29tYmluZXJJbmZvKGJvb2wgQWxsb3dJbGxlZ2FsT3BzLCBib29sIFNob3VsZExlZ2FsaXplSWxsZWdhbCwKKyAgICAgICAgICAgICAgIExlZ2FsaXplckluZm8gKkxJbmZvKQorICAgICAgOiBJbGxlZ2FsT3BzQWxsb3dlZChBbGxvd0lsbGVnYWxPcHMpLAorICAgICAgICBMZWdhbGl6ZUlsbGVnYWxPcHMoU2hvdWxkTGVnYWxpemVJbGxlZ2FsKSwgTEluZm8oTEluZm8pIHsKKyAgICBhc3NlcnQoKChBbGxvd0lsbGVnYWxPcHMgfHwgIUxlZ2FsaXplSWxsZWdhbE9wcykgfHwgTEluZm8pICYmCisgICAgICAgICAgICJFeHBlY3RpbmcgbGVnYWxpemVySW5mbyB3aGVuIGlsbGVnYWxvcHMgbm90IGFsbG93ZWQiKTsKKyAgfQorICB2aXJ0dWFsIH5Db21iaW5lckluZm8oKSA9IGRlZmF1bHQ7CisgIC8vLyBJZiBccCBJbGxlZ2FsT3BzQWxsb3dlZCBpcyBmYWxzZSwgdGhlIENvbWJpbmVySGVscGVyIHdpbGwgbWFrZSB1c2Ugb2YKKyAgLy8vIHRoZSBsZWdhbGl6ZXJJbmZvIHRvIGNoZWNrIGZvciBsZWdhbGl0eSBiZWZvcmUgZWFjaCB0cmFuc2Zvcm1hdGlvbi4KKyAgYm9vbCBJbGxlZ2FsT3BzQWxsb3dlZDsgLy8gVE9ETzogTWFrZSB1c2Ugb2YgdGhpcy4KKworICAvLy8gSWYgXHAgTGVnYWxpemVJbGxlZ2FsT3BzIGlzIHRydWUsIHRoZSBDb21iaW5lciB3aWxsIGFsc28gbGVnYWxpemUgdGhlCisgIC8vLyBpbGxlZ2FsIG9wcyB0aGF0IGFyZSBjcmVhdGVkLgorICBib29sIExlZ2FsaXplSWxsZWdhbE9wczsgLy8gVE9ETzogTWFrZSB1c2Ugb2YgdGhpcy4KKyAgY29uc3QgTGVnYWxpemVySW5mbyAqTEluZm87CisgIHZpcnR1YWwgYm9vbCBjb21iaW5lKE1hY2hpbmVJbnN0ciAmTUksIE1hY2hpbmVJUkJ1aWxkZXIgJkIpIGNvbnN0ID0gMDsKK307Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvR0lTZWxXb3JrTGlzdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvR0lTZWxXb3JrTGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NzkwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9HSVNlbFdvcmtMaXN0LmgKQEAgLTAsMCArMSw2OSBAQAorLy89PT0tIEdJU2VsV29ya0xpc3QuaCAtIFdvcmtsaXN0IGZvciBHSVNlbCBwYXNzZXMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fR0lTRUxfV09SS0xJU1RfSAorI2RlZmluZSBMTFZNX0dJU0VMX1dPUktMSVNUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lSW5zdHI7CisKKy8vIFdvcmtsaXN0IHdoaWNoIG1vc3RseSB3b3JrcyBzaW1pbGFyIHRvIEluc3RDb21iaW5lV29ya0xpc3QsIGJ1dCBvbiBNYWNoaW5lSW5zdHJzLgorLy8gVGhlIG1haW4gZGlmZmVyZW5jZSB3aXRoIHNvbWV0aGluZyBsaWtlIGEgU2V0VmVjdG9yIGlzIHRoYXQgZXJhc2luZyBhbiBlbGVtZW50IGRvZXNuJ3QKKy8vIG1vdmUgYWxsIGVsZW1lbnRzIG92ZXIgb25lIHBsYWNlIC0gaW5zdGVhZCBqdXN0IG51bGxzIG91dCB0aGUgZWxlbWVudCBvZiB0aGUgdmVjdG9yLgorLy8gRklYTUU6IERvZXMgaXQgbWFrZSBzZW5zZSB0byBmYWN0b3Igb3V0IGNvbW1vbiBjb2RlIHdpdGggdGhlIGluc3Rjb21iaW5lcldvcmtMaXN0PwordGVtcGxhdGU8dW5zaWduZWQgTj4KK2NsYXNzIEdJU2VsV29ya0xpc3QgeworICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCBOPiBXb3JrbGlzdDsKKyAgRGVuc2VNYXA8TWFjaGluZUluc3RyKiwgdW5zaWduZWQ+IFdvcmtsaXN0TWFwOworCitwdWJsaWM6CisgIEdJU2VsV29ya0xpc3QoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFdvcmtsaXN0TWFwLmVtcHR5KCk7IH0KKworICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gV29ya2xpc3RNYXAuc2l6ZSgpOyB9CisKKyAgLy8vIEFkZCAtIEFkZCB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIHRvIHRoZSB3b3JrbGlzdCBpZiBpdCBpc24ndCBhbHJlYWR5CisgIC8vLyBpbiBpdC4KKyAgdm9pZCBpbnNlcnQoTWFjaGluZUluc3RyICpJKSB7CisgICAgaWYgKFdvcmtsaXN0TWFwLnRyeV9lbXBsYWNlKEksIFdvcmtsaXN0LnNpemUoKSkuc2Vjb25kKSB7CisgICAgICBXb3JrbGlzdC5wdXNoX2JhY2soSSk7CisgICAgfQorICB9CisKKyAgLy8vIFJlbW92ZSAtIHJlbW92ZSBJIGZyb20gdGhlIHdvcmtsaXN0IGlmIGl0IGV4aXN0cy4KKyAgdm9pZCByZW1vdmUoTWFjaGluZUluc3RyICpJKSB7CisgICAgYXV0byBJdCA9IFdvcmtsaXN0TWFwLmZpbmQoSSk7CisgICAgaWYgKEl0ID09IFdvcmtsaXN0TWFwLmVuZCgpKSByZXR1cm47IC8vIE5vdCBpbiB3b3JrbGlzdC4KKworICAgIC8vIERvbid0IGJvdGhlciBtb3ZpbmcgZXZlcnl0aGluZyBkb3duLCBqdXN0IG51bGwgb3V0IHRoZSBzbG90LgorICAgIFdvcmtsaXN0W0l0LT5zZWNvbmRdID0gbnVsbHB0cjsKKworICAgIFdvcmtsaXN0TWFwLmVyYXNlKEl0KTsKKyAgfQorCisgIE1hY2hpbmVJbnN0ciAqcG9wX2JhY2tfdmFsKCkgeworICAgIE1hY2hpbmVJbnN0ciAqSTsKKyAgICBkbyB7CisgICAgICBJID0gV29ya2xpc3QucG9wX2JhY2tfdmFsKCk7CisgICAgfSB3aGlsZSghSSk7CisgICAgYXNzZXJ0KEkgJiYgIlBvcCBiYWNrIG9uIGVtcHR5IHdvcmtsaXN0Iik7CisgICAgV29ya2xpc3RNYXAuZXJhc2UoSSk7CisgICAgcmV0dXJuIEk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtLgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0lSVHJhbnNsYXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvSVJUcmFuc2xhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2MWMwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0lSVHJhbnNsYXRvci5oCkBAIC0wLDAgKzEsNDQ0IEBACisvLz09PS0gbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvSVJUcmFuc2xhdG9yLmggLSBJUlRyYW5zbGF0b3IgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBJUlRyYW5zbGF0b3IgcGFzcy4KKy8vLyBUaGlzIHBhc3MgaXMgcmVzcG9uc2libGUgZm9yIHRyYW5zbGF0aW5nIExMVk0gSVIgaW50byBNYWNoaW5lSW5zdHIuCisvLy8gSXQgdXNlcyB0YXJnZXQgaG9va3MgdG8gbG93ZXIgdGhlIEFCSSBidXQgYXNpZGUgZnJvbSB0aGF0LCB0aGUgcGFzcworLy8vIGdlbmVyYXRlZCBjb2RlIGlzIGdlbmVyaWMuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdHJhbnNsYXRvciB1c2VkIGZvcgorLy8vIEdsb2JhbElTZWwuCisvLy8KKy8vLyBcdG9kbyBSZXBsYWNlIHRoZSBjb21tZW50cyB3aXRoIGFjdHVhbCBkb3h5Z2VuIGNvbW1lbnRzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9JUlRSQU5TTEFUT1JfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9JUlRSQU5TTEFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL01hY2hpbmVJUkJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9UeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQWxsb2NhSW5zdDsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBDYWxsSW5zdDsKK2NsYXNzIENhbGxMb3dlcmluZzsKK2NsYXNzIENvbnN0YW50OworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlcjsKK2NsYXNzIFBISU5vZGU7CitjbGFzcyBUYXJnZXRQYXNzQ29uZmlnOworY2xhc3MgVXNlcjsKK2NsYXNzIFZhbHVlOworCisvLyBUZWNobmljYWxseSB0aGUgcGFzcyBzaG91bGQgcnVuIG9uIGFuIGh5cG90aGV0aWNhbCBNYWNoaW5lTW9kdWxlLAorLy8gc2luY2UgaXQgc2hvdWxkIHRyYW5zbGF0ZSBHbG9iYWwgaW50byBzb21lIHNvcnQgb2YgTWFjaGluZUdsb2JhbC4KKy8vIFRoZSBNYWNoaW5lR2xvYmFsIHNob3VsZCB1bHRpbWF0ZWx5IGp1c3QgYmUgYSB0cmFuc2ZlciBvZiBvd25lcnNoaXAgb2YKKy8vIHRoZSBpbnRlcmVzdGluZyBiaXRzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHJlcHJlc2VudCBhIGdsb2JhbCB2YWx1ZS4KKy8vIFRoYXQgYmVpbmcgc2FpZCwgd2UgY291bGQgaW52ZXN0aWdhdGUgd2hhdCB3b3VsZCBpdCBjb3N0IHRvIGp1c3QgZHVwbGljYXRlCisvLyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgTExWTSBJUi4KKy8vIFRoZSBpZGVhIGlzIHRoYXQgdWx0aW1hdGVseSB3ZSB3b3VsZCBiZSBhYmxlIHRvIGZyZWUgdXAgdGhlIG1lbW9yeSB1c2VkCisvLyBieSB0aGUgTExWTSBJUiBhcyBzb29uIGFzIHRoZSB0cmFuc2xhdGlvbiBpcyBvdmVyLgorY2xhc3MgSVJUcmFuc2xhdG9yIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworcHJpdmF0ZToKKyAgLy8vIEludGVyZmFjZSB1c2VkIHRvIGxvd2VyIHRoZSBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gY2FsbHMuCisgIGNvbnN0IENhbGxMb3dlcmluZyAqQ0xJOworCisgIC8vLyBNYXBwaW5nIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIGN1cnJlbnQgTExWTSBJUiBmdW5jdGlvbgorICAvLy8gdG8gdGhlIHJlbGF0ZWQgdmlydHVhbCByZWdpc3RlcnMuCisgIFZhbHVlVG9WUmVnIFZhbFRvVlJlZzsKKworICAvLyBOLmIuIGl0J3Mgbm90IGNvbXBsZXRlbHkgb2J2aW91cyB0aGF0IHRoaXMgd2lsbCBiZSBzdWZmaWNpZW50IGZvciBldmVyeQorICAvLyBMTFZNIElSIGNvbnN0cnVjdCAod2l0aCAiaW52b2tlIiBiZWluZyB0aGUgb2J2aW91cyBjYW5kaWRhdGUgdG8gbWVzcyB1cCBvdXIKKyAgLy8gbGl2ZXMuCisgIERlbnNlTWFwPGNvbnN0IEJhc2ljQmxvY2sgKiwgTWFjaGluZUJhc2ljQmxvY2sgKj4gQkJUb01CQjsKKworICAvLyBPbmUgQmFzaWNCbG9jayBjYW4gYmUgdHJhbnNsYXRlZCB0byBtdWx0aXBsZSBNYWNoaW5lQmFzaWNCbG9ja3MuICBGb3Igc3VjaAorICAvLyBCYXNpY0Jsb2NrcyB0cmFuc2xhdGVkIHRvIG11bHRpcGxlIE1hY2hpbmVCYXNpY0Jsb2NrcywgTWFjaGluZVByZWRzIHJldGFpbnMKKyAgLy8gYSBtYXBwaW5nIGJldHdlZW4gdGhlIGVkZ2VzIGFycml2aW5nIGF0IHRoZSBCYXNpY0Jsb2NrIHRvIHRoZSBjb3JyZXNwb25kaW5nCisgIC8vIGNyZWF0ZWQgTWFjaGluZUJhc2ljQmxvY2tzLiBTb21lIEJhc2ljQmxvY2tzIHRoYXQgZ2V0IHRyYW5zbGF0ZWQgdG8gYQorICAvLyBzaW5nbGUgTWFjaGluZUJhc2ljQmxvY2sgbWF5IGFsc28gZW5kIHVwIGluIHRoaXMgTWFwLgorICB1c2luZyBDRkdFZGdlID0gc3RkOjpwYWlyPGNvbnN0IEJhc2ljQmxvY2sgKiwgY29uc3QgQmFzaWNCbG9jayAqPjsKKyAgRGVuc2VNYXA8Q0ZHRWRnZSwgU21hbGxWZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sgKiwgMT4+IE1hY2hpbmVQcmVkczsKKworICAvLyBMaXN0IG9mIHN0dWJiZWQgUEhJIGluc3RydWN0aW9ucywgZm9yIHZhbHVlcyBhbmQgYmFzaWMgYmxvY2tzIHRvIGJlIGZpbGxlZAorICAvLyBpbiBvbmNlIGFsbCBNYWNoaW5lQmFzaWNCbG9ja3MgaGF2ZSBiZWVuIGNyZWF0ZWQuCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBQSElOb2RlICosIE1hY2hpbmVJbnN0ciAqPiwgND4gUGVuZGluZ1BISXM7CisKKyAgLy8vIFJlY29yZCBvZiB3aGF0IGZyYW1lIGluZGV4IGhhcyBiZWVuIGFsbG9jYXRlZCB0byBzcGVjaWZpZWQgYWxsb2NhcyBmb3IKKyAgLy8vIHRoaXMgZnVuY3Rpb24uCisgIERlbnNlTWFwPGNvbnN0IEFsbG9jYUluc3QgKiwgaW50PiBGcmFtZUluZGljZXM7CisKKyAgLy8vIFxuYW1lIE1ldGhvZHMgZm9yIHRyYW5zbGF0aW5nIGZvcm0gTExWTSBJUiB0byBNYWNoaW5lSW5zdHIuCisgIC8vLyBcc2VlIDo6dHJhbnNsYXRlIGZvciBnZW5lcmFsIGluZm9ybWF0aW9uIG9uIHRoZSB0cmFuc2xhdGUgbWV0aG9kcy4KKyAgLy8vIEB7CisKKyAgLy8vIFRyYW5zbGF0ZSBccCBJbnN0IGludG8gaXRzIGNvcnJlc3BvbmRpbmcgTWFjaGluZUluc3RyIGluc3RydWN0aW9uKHMpLgorICAvLy8gSW5zZXJ0IHRoZSBuZXdseSB0cmFuc2xhdGVkIGluc3RydWN0aW9uKHMpIHJpZ2h0IHdoZXJlIHRoZSBDdXJCdWlsZGVyCisgIC8vLyBpcyBzZXQuCisgIC8vLworICAvLy8gVGhlIGdlbmVyYWwgYWxnb3JpdGhtIGlzOgorICAvLy8gMS4gTG9vayBmb3IgYSB2aXJ0dWFsIHJlZ2lzdGVyIGZvciBlYWNoIG9wZXJhbmQgb3IKKyAgLy8vICAgIGNyZWF0ZSBvbmUuCisgIC8vLyAyIFVwZGF0ZSB0aGUgVmFsVG9WUmVnIGFjY29yZGluZ2x5LgorICAvLy8gMi5hbHQuIEZvciBjb25zdGFudCBhcmd1bWVudHMsIGlmIHRoZXkgYXJlIGNvbXBpbGUgdGltZSBjb25zdGFudHMsCisgIC8vLyAgIHByb2R1Y2UgYW4gaW1tZWRpYXRlIGluIHRoZSByaWdodCBvcGVyYW5kIGFuZCBkbyBub3QgdG91Y2gKKyAgLy8vICAgVmFsVG9SZWcuIEFjdHVhbGx5IHdlIHdpbGwgZ28gd2l0aCBhIHZpcnR1YWwgcmVnaXN0ZXIgZm9yIGVhY2gKKyAgLy8vICAgY29uc3RhbnRzIGJlY2F1c2UgaXQgbWF5IGJlIGV4cGVuc2l2ZSB0byBhY3R1YWxseSBtYXRlcmlhbGl6ZSB0aGUKKyAgLy8vICAgY29uc3RhbnQuIE1vcmVvdmVyLCBpZiB0aGUgY29uc3RhbnQgc3BhbnMgb24gc2V2ZXJhbCBpbnN0cnVjdGlvbnMsCisgIC8vLyAgIENTRSBtYXkgbm90IGNhdGNoIHRoZW0uCisgIC8vLyAgID0+IFVwZGF0ZSBWYWxUb1ZSZWcgYW5kIHJlbWVtYmVyIHRoYXQgd2Ugc2F3IGEgY29uc3RhbnQgaW4gQ29uc3RhbnRzLgorICAvLy8gICBXZSB3aWxsIG1hdGVyaWFsaXplIGFsbCB0aGUgY29uc3RhbnRzIGluIGZpbmFsaXplLgorICAvLy8gTm90ZTogd2Ugd291bGQgbmVlZCB0byBkbyBzb21ldGhpbmcgc28gdGhhdCB3ZSBjYW4gcmVjb2duaXplIHN1Y2ggb3BlcmFuZAorICAvLy8gICAgICAgYXMgY29uc3RhbnRzLgorICAvLy8gMy4gQ3JlYXRlIHRoZSBnZW5lcmljIGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gdHJ1ZSBpZiB0aGUgdHJhbnNsYXRpb24gc3VjY2VlZGVkLgorICBib29sIHRyYW5zbGF0ZShjb25zdCBJbnN0cnVjdGlvbiAmSW5zdCk7CisKKyAgLy8vIE1hdGVyaWFsaXplIFxwIEMgaW50byB2aXJ0dWFsLXJlZ2lzdGVyIFxwIFJlZy4gVGhlIGdlbmVyaWMgaW5zdHJ1Y3Rpb25zCisgIC8vLyBwZXJmb3JtaW5nIHRoaXMgbWF0ZXJpYWxpemF0aW9uIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgZW50cnkgYmxvY2sgb2YKKyAgLy8vIHRoZSBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJuIHRydWUgaWYgdGhlIG1hdGVyaWFsaXphdGlvbiBzdWNjZWVkZWQuCisgIGJvb2wgdHJhbnNsYXRlKGNvbnN0IENvbnN0YW50ICZDLCB1bnNpZ25lZCBSZWcpOworCisgIC8vLyBUcmFuc2xhdGUgYW4gTExWTSBiaXRjYXN0IGludG8gZ2VuZXJpYyBJUi4gRWl0aGVyIGEgQ09QWSBvciBhIEdfQklUQ0FTVCBpcworICAvLy8gZW1pdHRlZC4KKyAgYm9vbCB0cmFuc2xhdGVCaXRDYXN0KGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIC8vLyBUcmFuc2xhdGUgYW4gTExWTSBsb2FkIGluc3RydWN0aW9uIGludG8gZ2VuZXJpYyBJUi4KKyAgYm9vbCB0cmFuc2xhdGVMb2FkKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIC8vLyBUcmFuc2xhdGUgYW4gTExWTSBzdG9yZSBpbnN0cnVjdGlvbiBpbnRvIGdlbmVyaWMgSVIuCisgIGJvb2wgdHJhbnNsYXRlU3RvcmUoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgLy8vIFRyYW5zbGF0ZSBhbiBMTFZNIHN0cmluZyBpbnRyaW5zaWMgKG1lbWNweSwgbWVtc2V0LCAuLi4pLgorICBib29sIHRyYW5zbGF0ZU1lbWZ1bmMoY29uc3QgQ2FsbEluc3QgJkNJLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW50cmluc2ljKTsKKworICB2b2lkIGdldFN0YWNrR3VhcmQodW5zaWduZWQgRHN0UmVnLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKTsKKworICBib29sIHRyYW5zbGF0ZU92ZXJmbG93SW50cmluc2ljKGNvbnN0IENhbGxJbnN0ICZDSSwgdW5zaWduZWQgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgYm9vbCB0cmFuc2xhdGVLbm93bkludHJpbnNpYyhjb25zdCBDYWxsSW5zdCAmQ0ksIEludHJpbnNpYzo6SUQgSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgYm9vbCB0cmFuc2xhdGVJbmxpbmVBc20oY29uc3QgQ2FsbEluc3QgJkNJLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKTsKKworICAvLy8gVHJhbnNsYXRlIGNhbGwgaW5zdHJ1Y3Rpb24uCisgIC8vLyBccHJlIFxwIFUgaXMgYSBjYWxsIGluc3RydWN0aW9uLgorICBib29sIHRyYW5zbGF0ZUNhbGwoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgYm9vbCB0cmFuc2xhdGVJbnZva2UoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgYm9vbCB0cmFuc2xhdGVMYW5kaW5nUGFkKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIC8vLyBUcmFuc2xhdGUgb25lIG9mIExMVk0ncyBjYXN0IGluc3RydWN0aW9ucyBpbnRvIE1hY2hpbmVJbnN0cnMsIHdpdGggdGhlCisgIC8vLyBnaXZlbiBnZW5lcmljIE9wY29kZS4KKyAgYm9vbCB0cmFuc2xhdGVDYXN0KHVuc2lnbmVkIE9wY29kZSwgY29uc3QgVXNlciAmVSwKKyAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIC8vLyBUcmFuc2xhdGUgYSBwaGkgaW5zdHJ1Y3Rpb24uCisgIGJvb2wgdHJhbnNsYXRlUEhJKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIC8vLyBUcmFuc2xhdGUgYSBjb21wYXJpc29uIChpY21wIG9yIGZjbXApIGluc3RydWN0aW9uIG9yIGNvbnN0YW50LgorICBib29sIHRyYW5zbGF0ZUNvbXBhcmUoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgLy8vIFRyYW5zbGF0ZSBhbiBpbnRlZ2VyIGNvbXBhcmUgaW5zdHJ1Y3Rpb24gKG9yIGNvbnN0YW50KS4KKyAgYm9vbCB0cmFuc2xhdGVJQ21wKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQ29tcGFyZShVLCBNSVJCdWlsZGVyKTsKKyAgfQorCisgIC8vLyBUcmFuc2xhdGUgYSBmbG9hdGluZy1wb2ludCBjb21wYXJlIGluc3RydWN0aW9uIChvciBjb25zdGFudCkuCisgIGJvb2wgdHJhbnNsYXRlRkNtcChjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUNvbXBhcmUoVSwgTUlSQnVpbGRlcik7CisgIH0KKworICAvLy8gQWRkIHJlbWFpbmluZyBvcGVyYW5kcyBvbnRvIHBoaXMgd2UndmUgdHJhbnNsYXRlZC4gRXhlY3V0ZWQgYWZ0ZXIgYWxsCisgIC8vLyBNYWNoaW5lQmFzaWNCbG9ja3MgZm9yIHRoZSBmdW5jdGlvbiBoYXZlIGJlZW4gY3JlYXRlZC4KKyAgdm9pZCBmaW5pc2hQZW5kaW5nUGhpcygpOworCisgIC8vLyBUcmFuc2xhdGUgXHAgSW5zdCBpbnRvIGEgYmluYXJ5IG9wZXJhdGlvbiBccCBPcGNvZGUuCisgIC8vLyBccHJlIFxwIFUgaXMgYSBiaW5hcnkgb3BlcmF0aW9uLgorICBib29sIHRyYW5zbGF0ZUJpbmFyeU9wKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgVXNlciAmVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKTsKKworICAvLy8gVHJhbnNsYXRlIGJyYW5jaCAoYnIpIGluc3RydWN0aW9uLgorICAvLy8gXHByZSBccCBVIGlzIGEgYnJhbmNoIGluc3RydWN0aW9uLgorICBib29sIHRyYW5zbGF0ZUJyKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIGJvb2wgdHJhbnNsYXRlU3dpdGNoKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIGJvb2wgdHJhbnNsYXRlSW5kaXJlY3RCcihjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKTsKKworICBib29sIHRyYW5zbGF0ZUV4dHJhY3RWYWx1ZShjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKTsKKworICBib29sIHRyYW5zbGF0ZUluc2VydFZhbHVlKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIGJvb2wgdHJhbnNsYXRlU2VsZWN0KGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIGJvb2wgdHJhbnNsYXRlR2V0RWxlbWVudFB0cihjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKTsKKworICBib29sIHRyYW5zbGF0ZUFsbG9jYShjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKTsKKworICAvLy8gVHJhbnNsYXRlIHJldHVybiAocmV0KSBpbnN0cnVjdGlvbi4KKyAgLy8vIFRoZSB0YXJnZXQgbmVlZHMgdG8gaW1wbGVtZW50IENhbGxMb3dlcmluZzo6bG93ZXJSZXR1cm4gZm9yCisgIC8vLyB0aGlzIHRvIHN1Y2NlZWQuCisgIC8vLyBccHJlIFxwIFUgaXMgYSByZXR1cm4gaW5zdHJ1Y3Rpb24uCisgIGJvb2wgdHJhbnNsYXRlUmV0KGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIGJvb2wgdHJhbnNsYXRlRlN1Yihjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKTsKKworICBib29sIHRyYW5zbGF0ZUFkZChjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJpbmFyeU9wKFRhcmdldE9wY29kZTo6R19BREQsIFUsIE1JUkJ1aWxkZXIpOworICB9CisgIGJvb2wgdHJhbnNsYXRlU3ViKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQmluYXJ5T3AoVGFyZ2V0T3Bjb2RlOjpHX1NVQiwgVSwgTUlSQnVpbGRlcik7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVBbmQoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVCaW5hcnlPcChUYXJnZXRPcGNvZGU6OkdfQU5ELCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorICBib29sIHRyYW5zbGF0ZU11bChjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJpbmFyeU9wKFRhcmdldE9wY29kZTo6R19NVUwsIFUsIE1JUkJ1aWxkZXIpOworICB9CisgIGJvb2wgdHJhbnNsYXRlT3IoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVCaW5hcnlPcChUYXJnZXRPcGNvZGU6OkdfT1IsIFUsIE1JUkJ1aWxkZXIpOworICB9CisgIGJvb2wgdHJhbnNsYXRlWG9yKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQmluYXJ5T3AoVGFyZ2V0T3Bjb2RlOjpHX1hPUiwgVSwgTUlSQnVpbGRlcik7CisgIH0KKworICBib29sIHRyYW5zbGF0ZVVEaXYoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVCaW5hcnlPcChUYXJnZXRPcGNvZGU6OkdfVURJViwgVSwgTUlSQnVpbGRlcik7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVTRGl2KGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQmluYXJ5T3AoVGFyZ2V0T3Bjb2RlOjpHX1NESVYsIFUsIE1JUkJ1aWxkZXIpOworICB9CisgIGJvb2wgdHJhbnNsYXRlVVJlbShjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJpbmFyeU9wKFRhcmdldE9wY29kZTo6R19VUkVNLCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorICBib29sIHRyYW5zbGF0ZVNSZW0oY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVCaW5hcnlPcChUYXJnZXRPcGNvZGU6OkdfU1JFTSwgVSwgTUlSQnVpbGRlcik7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVJbnRUb1B0cihjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUNhc3QoVGFyZ2V0T3Bjb2RlOjpHX0lOVFRPUFRSLCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorICBib29sIHRyYW5zbGF0ZVB0clRvSW50KGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQ2FzdChUYXJnZXRPcGNvZGU6OkdfUFRSVE9JTlQsIFUsIE1JUkJ1aWxkZXIpOworICB9CisgIGJvb2wgdHJhbnNsYXRlVHJ1bmMoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVDYXN0KFRhcmdldE9wY29kZTo6R19UUlVOQywgVSwgTUlSQnVpbGRlcik7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVGUFRydW5jKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQ2FzdChUYXJnZXRPcGNvZGU6OkdfRlBUUlVOQywgVSwgTUlSQnVpbGRlcik7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVGUEV4dChjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUNhc3QoVGFyZ2V0T3Bjb2RlOjpHX0ZQRVhULCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorICBib29sIHRyYW5zbGF0ZUZQVG9VSShjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUNhc3QoVGFyZ2V0T3Bjb2RlOjpHX0ZQVE9VSSwgVSwgTUlSQnVpbGRlcik7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVGUFRvU0koY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVDYXN0KFRhcmdldE9wY29kZTo6R19GUFRPU0ksIFUsIE1JUkJ1aWxkZXIpOworICB9CisgIGJvb2wgdHJhbnNsYXRlVUlUb0ZQKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQ2FzdChUYXJnZXRPcGNvZGU6OkdfVUlUT0ZQLCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorICBib29sIHRyYW5zbGF0ZVNJVG9GUChjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUNhc3QoVGFyZ2V0T3Bjb2RlOjpHX1NJVE9GUCwgVSwgTUlSQnVpbGRlcik7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVVbnJlYWNoYWJsZShjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVTRXh0KGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQ2FzdChUYXJnZXRPcGNvZGU6OkdfU0VYVCwgVSwgTUlSQnVpbGRlcik7CisgIH0KKworICBib29sIHRyYW5zbGF0ZVpFeHQoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVDYXN0KFRhcmdldE9wY29kZTo6R19aRVhULCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorCisgIGJvb2wgdHJhbnNsYXRlU2hsKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQmluYXJ5T3AoVGFyZ2V0T3Bjb2RlOjpHX1NITCwgVSwgTUlSQnVpbGRlcik7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVMU2hyKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQmluYXJ5T3AoVGFyZ2V0T3Bjb2RlOjpHX0xTSFIsIFUsIE1JUkJ1aWxkZXIpOworICB9CisgIGJvb2wgdHJhbnNsYXRlQVNocihjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJpbmFyeU9wKFRhcmdldE9wY29kZTo6R19BU0hSLCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorCisgIGJvb2wgdHJhbnNsYXRlRkFkZChjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJpbmFyeU9wKFRhcmdldE9wY29kZTo6R19GQURELCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorICBib29sIHRyYW5zbGF0ZUZNdWwoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVCaW5hcnlPcChUYXJnZXRPcGNvZGU6OkdfRk1VTCwgVSwgTUlSQnVpbGRlcik7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVGRGl2KGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQmluYXJ5T3AoVGFyZ2V0T3Bjb2RlOjpHX0ZESVYsIFUsIE1JUkJ1aWxkZXIpOworICB9CisgIGJvb2wgdHJhbnNsYXRlRlJlbShjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJpbmFyeU9wKFRhcmdldE9wY29kZTo6R19GUkVNLCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorCisgIGJvb2wgdHJhbnNsYXRlVkFBcmcoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgYm9vbCB0cmFuc2xhdGVJbnNlcnRFbGVtZW50KGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIGJvb2wgdHJhbnNsYXRlRXh0cmFjdEVsZW1lbnQoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgYm9vbCB0cmFuc2xhdGVTaHVmZmxlVmVjdG9yKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIC8vIFN0dWJzIHRvIGtlZXAgdGhlIGNvbXBpbGVyIGhhcHB5IHdoaWxlIHdlIGltcGxlbWVudCB0aGUgcmVzdCBvZiB0aGUKKyAgLy8gdHJhbnNsYXRpb24uCisgIGJvb2wgdHJhbnNsYXRlUmVzdW1lKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVDbGVhbnVwUmV0KGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVDYXRjaFJldChjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGJvb2wgdHJhbnNsYXRlQ2F0Y2hTd2l0Y2goY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIHRyYW5zbGF0ZUZlbmNlKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVBdG9taWNDbXBYY2hnKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVBdG9taWNSTVcoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIHRyYW5zbGF0ZUFkZHJTcGFjZUNhc3QoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIHRyYW5zbGF0ZUNsZWFudXBQYWQoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIHRyYW5zbGF0ZUNhdGNoUGFkKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVVc2VyT3AxKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVVc2VyT3AyKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gQH0KKworICAvLyBCdWlsZGVyIGZvciBtYWNoaW5lIGluc3RydWN0aW9uIGEgbGEgSVJCdWlsZGVyLgorICAvLyBJLmUuLCBjb21wYXJlZCB0byByZWd1bGFyIE1JQnVpbGRlciwgdGhpcyBvbmUgYWxzbyBpbnNlcnRzIHRoZSBpbnN0cnVjdGlvbgorICAvLyBpbiB0aGUgY3VycmVudCBibG9jaywgaXQgY2FuIGNyZWF0ZXMgYmxvY2ssIGV0Yy4sIGJhc2ljYWxseSBhIGtpbmQgb2YKKyAgLy8gSVJCdWlsZGVyLCBidXQgZm9yIE1hY2hpbmUgSVIuCisgIE1hY2hpbmVJUkJ1aWxkZXIgQ3VyQnVpbGRlcjsKKworICAvLyBCdWlsZGVyIHNldCB0byB0aGUgZW50cnkgYmxvY2sgKGp1c3QgYWZ0ZXIgQUJJIGxvd2VyaW5nIGluc3RydWN0aW9ucykuIFVzZWQKKyAgLy8gYXMgYSBjb252ZW5pZW50IGxvY2F0aW9uIGZvciBDb25zdGFudHMuCisgIE1hY2hpbmVJUkJ1aWxkZXIgRW50cnlCdWlsZGVyOworCisgIC8vIFRoZSBNYWNoaW5lRnVuY3Rpb24gY3VycmVudGx5IGJlaW5nIHRyYW5zbGF0ZWQuCisgIE1hY2hpbmVGdW5jdGlvbiAqTUY7CisKKyAgLy8vIE1hY2hpbmVSZWdpc3RlckluZm8gdXNlZCB0byBjcmVhdGUgdmlydHVhbCByZWdpc3RlcnMuCisgIE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSA9IG51bGxwdHI7CisKKyAgY29uc3QgRGF0YUxheW91dCAqREw7CisKKyAgLy8vIEN1cnJlbnQgdGFyZ2V0IGNvbmZpZ3VyYXRpb24uIENvbnRyb2xzIGhvdyB0aGUgcGFzcyBoYW5kbGVzIGVycm9ycy4KKyAgY29uc3QgVGFyZ2V0UGFzc0NvbmZpZyAqVFBDOworCisgIC8vLyBDdXJyZW50IG9wdGltaXphdGlvbiByZW1hcmsgZW1pdHRlci4gVXNlZCB0byByZXBvcnQgZmFpbHVyZXMuCisgIHN0ZDo6dW5pcXVlX3B0cjxPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyPiBPUkU7CisKKyAgLy8gKiBJbnNlcnQgYWxsIHRoZSBjb2RlIG5lZWRlZCB0byBtYXRlcmlhbGl6ZSB0aGUgY29uc3RhbnRzCisgIC8vIGF0IHRoZSBwcm9wZXIgcGxhY2UuIEUuZy4sIEVudHJ5IGJsb2NrIG9yIGRvbWluYXRvciBibG9jaworICAvLyBvZiBlYWNoIGNvbnN0YW50IGRlcGVuZGluZyBvbiBob3cgZmFuY3kgd2Ugd2FudCB0byBiZS4KKyAgLy8gKiBDbGVhciB0aGUgZGlmZmVyZW50IG1hcHMuCisgIHZvaWQgZmluYWxpemVGdW5jdGlvbigpOworCisgIC8vLyBHZXQgdGhlIFZSZWcgdGhhdCByZXByZXNlbnRzIFxwIFZhbC4KKyAgLy8vIElmIHN1Y2ggVlJlZyBkb2VzIG5vdCBleGlzdCwgaXQgaXMgY3JlYXRlZC4KKyAgdW5zaWduZWQgZ2V0T3JDcmVhdGVWUmVnKGNvbnN0IFZhbHVlICZWYWwpOworCisgIC8vLyBHZXQgdGhlIGZyYW1lIGluZGV4IHRoYXQgcmVwcmVzZW50cyBccCBWYWwuCisgIC8vLyBJZiBzdWNoIFZSZWcgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQuCisgIGludCBnZXRPckNyZWF0ZUZyYW1lSW5kZXgoY29uc3QgQWxsb2NhSW5zdCAmQUkpOworCisgIC8vLyBHZXQgdGhlIGFsaWdubWVudCBvZiB0aGUgZ2l2ZW4gbWVtb3J5IG9wZXJhdGlvbiBpbnN0cnVjdGlvbi4gVGhpcyB3aWxsCisgIC8vLyBlaXRoZXIgYmUgdGhlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBBQkktcmVxdWlyZWQgYWxpZ25tZW50IGZvcgorICAvLy8gdGhlIHR5cGUgYmVpbmcgYWNjZXNzZWQgKGFjY29yZGluZyB0byB0aGUgTW9kdWxlJ3MgRGF0YUxheW91dCkuCisgIHVuc2lnbmVkIGdldE1lbU9wQWxpZ25tZW50KGNvbnN0IEluc3RydWN0aW9uICZJKTsKKworICAvLy8gR2V0IHRoZSBNYWNoaW5lQmFzaWNCbG9jayB0aGF0IHJlcHJlc2VudHMgXHAgQkIuIFNwZWNpZmljYWxseSwgdGhlIGJsb2NrCisgIC8vLyByZXR1cm5lZCB3aWxsIGJlIHRoZSBoZWFkIG9mIHRoZSB0cmFuc2xhdGVkIGJsb2NrIChzdWl0YWJsZSBmb3IgYnJhbmNoCisgIC8vLyBkZXN0aW5hdGlvbnMpLgorICBNYWNoaW5lQmFzaWNCbG9jayAmZ2V0TUJCKGNvbnN0IEJhc2ljQmxvY2sgJkJCKTsKKworICAvLy8gUmVjb3JkIFxwIE5ld1ByZWQgYXMgYSBNYWNoaW5lIHByZWRlY2Vzc29yIHRvIGBFZGdlLnNlY29uZGAsIGNvcnJlc3BvbmRpbmcKKyAgLy8vIHRvIGBFZGdlLmZpcnN0YCBhdCB0aGUgSVIgbGV2ZWwuIFRoaXMgaXMgdXNlZCB3aGVuIElSVHJhbnNsYXRpb24gY3JlYXRlcworICAvLy8gbXVsdGlwbGUgTWFjaGluZUJhc2ljQmxvY2tzIGZvciBhIGdpdmVuIElSIGJsb2NrIGFuZCB0aGUgQ0ZHIGlzIG5vIGxvbmdlcgorICAvLy8gcmVwcmVzZW50ZWQgc2ltcGx5IGJ5IHRoZSBJUi1sZXZlbCBDRkcuCisgIHZvaWQgYWRkTWFjaGluZUNGR1ByZWQoQ0ZHRWRnZSBFZGdlLCBNYWNoaW5lQmFzaWNCbG9jayAqTmV3UHJlZCk7CisKKyAgLy8vIFJldHVybnMgdGhlIE1hY2hpbmUgSVIgcHJlZGVjZXNzb3JzIGZvciB0aGUgZ2l2ZW4gSVIgQ0ZHIGVkZ2UuIFVzdWFsbHkKKyAgLy8vIHRoaXMgaXMganVzdCB0aGUgc2luZ2xlIE1hY2hpbmVCYXNpY0Jsb2NrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByZWRlY2Vzc29yCisgIC8vLyBpbiB0aGUgSVIuIE1vcmUgY29tcGxleCBsb3dlcmluZyBjYW4gcmVzdWx0IGluIG11bHRpcGxlIE1hY2hpbmVCYXNpY0Jsb2NrcworICAvLy8gcHJlY2VkaW5nIHRoZSBvcmlnaW5hbCB0aG91Z2ggKGUuZy4gc3dpdGNoIGluc3RydWN0aW9ucykuCisgIFNtYWxsVmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrICosIDE+IGdldE1hY2hpbmVQcmVkQkJzKENGR0VkZ2UgRWRnZSkgeworICAgIGF1dG8gUmVtYXBwZWRFZGdlID0gTWFjaGluZVByZWRzLmZpbmQoRWRnZSk7CisgICAgaWYgKFJlbWFwcGVkRWRnZSAhPSBNYWNoaW5lUHJlZHMuZW5kKCkpCisgICAgICByZXR1cm4gUmVtYXBwZWRFZGdlLT5zZWNvbmQ7CisgICAgcmV0dXJuIFNtYWxsVmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrICosIDQ+KDEsICZnZXRNQkIoKkVkZ2UuZmlyc3QpKTsKKyAgfQorCitwdWJsaWM6CisgIC8vIEN0b3IsIG5vdGhpbmcgZmFuY3kuCisgIElSVHJhbnNsYXRvcigpOworCisgIFN0cmluZ1JlZiBnZXRQYXNzTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJJUlRyYW5zbGF0b3IiOyB9CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICAvLyBBbGdvOgorICAvLyAgIENhbGxMb3dlcmluZyA9IE1GLnN1YnRhcmdldC5nZXRDYWxsTG93ZXJpbmcoKQorICAvLyAgIEYgPSBNRi5nZXRQYXJlbnQoKQorICAvLyAgIE1JUkJ1aWxkZXIucmVzZXQoTUYpCisgIC8vICAgZ2V0TUJCKEYuZ2V0RW50cnlCQigpKQorICAvLyAgIENhbGxMb3dlcmluZy0+dHJhbnNsYXRlQXJndW1lbnRzKE1JUkJ1aWxkZXIsIEYsIFZhbFRvVlJlZykKKyAgLy8gICBmb3IgZWFjaCBiYiBpbiBGCisgIC8vICAgICBnZXRNQkIoYmIpCisgIC8vICAgICBmb3IgZWFjaCBpbnN0IGluIGJiCisgIC8vICAgICAgIGlmICghdHJhbnNsYXRlKE1JUkJ1aWxkZXIsIGluc3QsIFZhbFRvVlJlZywgQ29uc3RhbnRUb1NlcXVlbmNlKSkKKyAgLy8gICAgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIkRvbid0IGtub3cgaG93IHRvIHRyYW5zbGF0ZSBpbnB1dCIpOworICAvLyAgIGZpbmFsaXplKCkKKyAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSBvdmVycmlkZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9JUlRSQU5TTEFUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvSW5zdHJ1Y3Rpb25TZWxlY3QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0luc3RydWN0aW9uU2VsZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE1MjFjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0luc3RydWN0aW9uU2VsZWN0LmgKQEAgLTAsMCArMSw1MyBAQAorLy89PSBsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9JbnN0cnVjdGlvblNlbGVjdC5oIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZSBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIE1hY2hpbmVGdW5jdGlvblBhc3MKKy8vLyByZXNwb25zaWJsZSBmb3Igc2VsZWN0aW5nIChwb3NzaWJseSBnZW5lcmljKSBtYWNoaW5lIGluc3RydWN0aW9ucyB0bworLy8vIHRhcmdldC1zcGVjaWZpYyBpbnN0cnVjdGlvbnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0lOU1RSVUNUSU9OU0VMRUNUX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfSU5TVFJVQ1RJT05TRUxFQ1RfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvSW5zdHJ1Y3Rpb25TZWxlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKy8vLyBUaGlzIHBhc3MgaXMgcmVzcG9uc2libGUgZm9yIHNlbGVjdGluZyBnZW5lcmljIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIHRvCisvLy8gdGFyZ2V0LXNwZWNpZmljIGluc3RydWN0aW9ucy4gIEl0IHJlbGllcyBvbiB0aGUgSW5zdHJ1Y3Rpb25TZWxlY3RvciBwcm92aWRlZAorLy8vIGJ5IHRoZSB0YXJnZXQuCisvLy8gU2VsZWN0aW9uIGlzIGRvbmUgYnkgZXhhbWluaW5nIGJsb2NrcyBpbiBwb3N0LW9yZGVyLCBhbmQgaW5zdHJ1Y3Rpb25zIGluCisvLy8gcmV2ZXJzZSBvcmRlci4KKy8vLworLy8vIFxwb3N0IGZvciBhbGwgaW5zdCBpbiBNRjogbm90IGlzUHJlSVNlbEdlbmVyaWNPcGNvZGUoaW5zdC5vcGNvZGUpCitjbGFzcyBJbnN0cnVjdGlvblNlbGVjdCA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIFN0cmluZ1JlZiBnZXRQYXNzTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJJbnN0cnVjdGlvblNlbGVjdCI7IH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzKCkKKyAgICAgICAgLnNldChNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzOjpQcm9wZXJ0eTo6SXNTU0EpCisgICAgICAgIC5zZXQoTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllczo6UHJvcGVydHk6OkxlZ2FsaXplZCkKKyAgICAgICAgLnNldChNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzOjpQcm9wZXJ0eTo6UmVnQmFua1NlbGVjdGVkKTsKKyAgfQorCisgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgZ2V0U2V0UHJvcGVydGllcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcygpLnNldCgKKyAgICAgICAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllczo6UHJvcGVydHk6OlNlbGVjdGVkKTsKKyAgfQorCisgIEluc3RydWN0aW9uU2VsZWN0KCk7CisKKyAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSBvdmVycmlkZTsKK307Cit9IC8vIEVuZCBuYW1lc3BhY2UgbGx2bS4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9JbnN0cnVjdGlvblNlbGVjdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9JbnN0cnVjdGlvblNlbGVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjZDEzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0luc3RydWN0aW9uU2VsZWN0b3IuaApAQCAtMCwwICsxLDM4MSBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0luc3RydWN0aW9uU2VsZWN0b3IuaCAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBBUEkgZm9yIHRoZSBpbnN0cnVjdGlvbiBzZWxlY3Rvci4KKy8vLyBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBzZWxlY3RpbmcgbWFjaGluZSBpbnN0cnVjdGlvbnMuCisvLy8gSXQncyBpbXBsZW1lbnRlZCBieSB0aGUgdGFyZ2V0LiBJdCdzIHVzZWQgYnkgdGhlIEluc3RydWN0aW9uU2VsZWN0IHBhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9JTlNUUlVDVElPTlNFTEVDVE9SX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfSU5TVFJVQ1RJT05TRUxFQ1RPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29kZUdlbkNvdmVyYWdlLmgiCisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFQSW50OworY2xhc3MgQVBGbG9hdDsKK2NsYXNzIExMVDsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIE1hY2hpbmVJbnN0ckJ1aWxkZXI7CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lT3BlcmFuZDsKK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CitjbGFzcyBSZWdpc3RlckJhbmtJbmZvOworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJDbGFzczsKK2NsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKKworLy8vIENvbnRhaW5lciBjbGFzcyBmb3IgQ29kZUdlbiBwcmVkaWNhdGUgcmVzdWx0cy4KKy8vLyBUaGlzIGlzIGNvbnZlbmllbnQgYmVjYXVzZSBzdGQ6OmJpdHNldCBkb2VzIG5vdCBoYXZlIGEgY29uc3RydWN0b3IKKy8vLyB3aXRoIGFuIGluaXRpYWxpemVyIGxpc3Qgb2Ygc2V0IGJpdHMuCisvLy8KKy8vLyBFYWNoIEluc3RydWN0aW9uU2VsZWN0b3Igc3ViY2xhc3Mgc2hvdWxkIGRlZmluZSBhIFByZWRpY2F0ZUJpdHNldCBjbGFzcworLy8vIHdpdGg6CisvLy8gICBjb25zdCB1bnNpZ25lZCBNQVhfU1VCVEFSR0VUX1BSRURJQ0FURVMgPSAxOTI7CisvLy8gICB1c2luZyBQcmVkaWNhdGVCaXRzZXQgPSBQcmVkaWNhdGVCaXRzZXRJbXBsPE1BWF9TVUJUQVJHRVRfUFJFRElDQVRFUz47CisvLy8gYW5kIHVwZGF0aW5nIHRoZSBjb25zdGFudCB0byBzdWl0IHRoZSB0YXJnZXQuIFRhYmxlZ2VuIHByb3ZpZGVzIGEgc3VpdGFibGUKKy8vLyBkZWZpbml0aW9uIGZvciB0aGUgcHJlZGljYXRlcyBpbiB1c2UgaW4gPFRhcmdldD5HZW5HbG9iYWxJU2VsLmluYyB3aGVuCisvLy8gR0VUX0dMT0JBTElTRUxfUFJFRElDQVRFX0JJVFNFVCBpcyBkZWZpbmVkLgordGVtcGxhdGUgPHN0ZDo6c2l6ZV90IE1heFByZWRpY2F0ZXM+CitjbGFzcyBQcmVkaWNhdGVCaXRzZXRJbXBsIDogcHVibGljIHN0ZDo6Yml0c2V0PE1heFByZWRpY2F0ZXM+IHsKK3B1YmxpYzoKKyAgLy8gQ2Fubm90IGluaGVyaXQgY29uc3RydWN0b3JzIGJlY2F1c2UgaXQncyBub3Qgc3VwcG9ydGVkIGJ5IFZDKysuLgorICBQcmVkaWNhdGVCaXRzZXRJbXBsKCkgPSBkZWZhdWx0OworCisgIFByZWRpY2F0ZUJpdHNldEltcGwoY29uc3Qgc3RkOjpiaXRzZXQ8TWF4UHJlZGljYXRlcz4gJkIpCisgICAgICA6IHN0ZDo6Yml0c2V0PE1heFByZWRpY2F0ZXM+KEIpIHt9CisKKyAgUHJlZGljYXRlQml0c2V0SW1wbChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dW5zaWduZWQ+IEluaXQpIHsKKyAgICBmb3IgKGF1dG8gSSA6IEluaXQpCisgICAgICBzdGQ6OmJpdHNldDxNYXhQcmVkaWNhdGVzPjo6c2V0KEkpOworICB9Cit9OworCitlbnVtIHsKKyAgLy8vIEJlZ2luIGEgdHJ5LWJsb2NrIHRvIGF0dGVtcHQgYSBtYXRjaCBhbmQganVtcCB0byBPbkZhaWwgaWYgaXQgaXMKKyAgLy8vIHVuc3VjY2Vzc2Z1bC4KKyAgLy8vIC0gT25GYWlsIC0gVGhlIE1hdGNoVGFibGUgZW50cnkgYXQgd2hpY2ggdG8gcmVzdW1lIGlmIHRoZSBtYXRjaCBmYWlscy4KKyAgLy8vCisgIC8vLyBGSVhNRTogVGhpcyBvdWdodCB0byB0YWtlIGFuIGFyZ3VtZW50IGluZGljYXRpbmcgdGhlIG51bWJlciBvZiB0cnktYmxvY2tzCisgIC8vLyAgICAgICAgdG8gZXhpdCBvbiBmYWlsdXJlLiBJdCdzIHVzdWFsbHkgb25lIGJ1dCB0aGUgbGFzdCBtYXRjaCBhdHRlbXB0IG9mCisgIC8vLyAgICAgICAgYSBibG9jayB3aWxsIG5lZWQgbW9yZS4gVGhlIChpbXBsZW1lbnRlZCkgYWx0ZXJuYXRpdmUgaXMgdG8gdGFjayBhCisgIC8vLyAgICAgICAgR0lNX1JlamVjdCBvbiB0aGUgZW5kIG9mIGVhY2ggdHJ5LWJsb2NrIHdoaWNoIGlzIHNpbXBsZXIgYnV0CisgIC8vLyAgICAgICAgcmVxdWlyZXMgYW4gZXh0cmEgb3Bjb2RlIGFuZCBpdGVyYXRpb24gaW4gdGhlIGludGVycHJldGVyIG9uIGVhY2gKKyAgLy8vICAgICAgICBmYWlsZWQgbWF0Y2guCisgIEdJTV9UcnksCisKKyAgLy8vIFJlY29yZCB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uCisgIC8vLyAtIE5ld0luc25JRCAtIEluc3RydWN0aW9uIElEIHRvIGRlZmluZQorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRAorICAvLy8gLSBPcElkeCAtIE9wZXJhbmQgaW5kZXgKKyAgR0lNX1JlY29yZEluc24sCisKKyAgLy8vIENoZWNrIHRoZSBmZWF0dXJlIGJpdHMKKyAgLy8vIC0gRXhwZWN0ZWQgZmVhdHVyZXMKKyAgR0lNX0NoZWNrRmVhdHVyZXMsCisKKyAgLy8vIENoZWNrIHRoZSBvcGNvZGUgb24gdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbgorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRAorICAvLy8gLSBFeHBlY3RlZCBvcGNvZGUKKyAgR0lNX0NoZWNrT3Bjb2RlLAorICAvLy8gQ2hlY2sgdGhlIGluc3RydWN0aW9uIGhhcyB0aGUgcmlnaHQgbnVtYmVyIG9mIG9wZXJhbmRzCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElECisgIC8vLyAtIEV4cGVjdGVkIG51bWJlciBvZiBvcGVyYW5kcworICBHSU1fQ2hlY2tOdW1PcGVyYW5kcywKKyAgLy8vIENoZWNrIGFuIGltbWVkaWF0ZSBwcmVkaWNhdGUgb24gdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbgorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRAorICAvLy8gLSBUaGUgcHJlZGljYXRlIHRvIHRlc3QKKyAgR0lNX0NoZWNrSTY0SW1tUHJlZGljYXRlLAorICAvLy8gQ2hlY2sgYW4gaW1tZWRpYXRlIHByZWRpY2F0ZSBvbiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIHZpYSBhbiBBUEludC4KKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQKKyAgLy8vIC0gVGhlIHByZWRpY2F0ZSB0byB0ZXN0CisgIEdJTV9DaGVja0FQSW50SW1tUHJlZGljYXRlLAorICAvLy8gQ2hlY2sgYSBmbG9hdGluZyBwb2ludCBpbW1lZGlhdGUgcHJlZGljYXRlIG9uIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElECisgIC8vLyAtIFRoZSBwcmVkaWNhdGUgdG8gdGVzdAorICBHSU1fQ2hlY2tBUEZsb2F0SW1tUHJlZGljYXRlLAorICAvLy8gQ2hlY2sgYSBtZW1vcnkgb3BlcmF0aW9uIGhhcyB0aGUgc3BlY2lmaWVkIGF0b21pYyBvcmRlcmluZy4KKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQKKyAgLy8vIC0gT3JkZXJpbmcgLSBUaGUgQXRvbWljT3JkZXJpbmcgdmFsdWUKKyAgR0lNX0NoZWNrQXRvbWljT3JkZXJpbmcsCisgIEdJTV9DaGVja0F0b21pY09yZGVyaW5nT3JTdHJvbmdlclRoYW4sCisgIEdJTV9DaGVja0F0b21pY09yZGVyaW5nV2Vha2VyVGhhbiwKKworICAvLy8gQ2hlY2sgdGhlIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgb3BlcmFuZAorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRAorICAvLy8gLSBPcElkeCAtIE9wZXJhbmQgaW5kZXgKKyAgLy8vIC0gRXhwZWN0ZWQgdHlwZQorICBHSU1fQ2hlY2tUeXBlLAorICAvLy8gQ2hlY2sgdGhlIHR5cGUgb2YgYSBwb2ludGVyIHRvIGFueSBhZGRyZXNzIHNwYWNlLgorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRAorICAvLy8gLSBPcElkeCAtIE9wZXJhbmQgaW5kZXgKKyAgLy8vIC0gU2l6ZUluQml0cyAtIFRoZSBzaXplIG9mIHRoZSBwb2ludGVyIHZhbHVlIGluIGJpdHMuCisgIEdJTV9DaGVja1BvaW50ZXJUb0FueSwKKyAgLy8vIENoZWNrIHRoZSByZWdpc3RlciBiYW5rIGZvciB0aGUgc3BlY2lmaWVkIG9wZXJhbmQKKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQKKyAgLy8vIC0gT3BJZHggLSBPcGVyYW5kIGluZGV4CisgIC8vLyAtIEV4cGVjdGVkIHJlZ2lzdGVyIGJhbmsgKHNwZWNpZmllZCBhcyBhIHJlZ2lzdGVyIGNsYXNzKQorICBHSU1fQ2hlY2tSZWdCYW5rRm9yQ2xhc3MsCisgIC8vLyBDaGVjayB0aGUgb3BlcmFuZCBtYXRjaGVzIGEgY29tcGxleCBwcmVkaWNhdGUKKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQKKyAgLy8vIC0gT3BJZHggLSBPcGVyYW5kIGluZGV4CisgIC8vLyAtIFJlbmRlcmVySUQgLSBUaGUgcmVuZGVyZXIgdG8gaG9sZCB0aGUgcmVzdWx0CisgIC8vLyAtIENvbXBsZXggcHJlZGljYXRlIElECisgIEdJTV9DaGVja0NvbXBsZXhQYXR0ZXJuLAorICAvLy8gQ2hlY2sgdGhlIG9wZXJhbmQgaXMgYSBzcGVjaWZpYyBpbnRlZ2VyCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElECisgIC8vLyAtIE9wSWR4IC0gT3BlcmFuZCBpbmRleAorICAvLy8gLSBFeHBlY3RlZCBpbnRlZ2VyCisgIEdJTV9DaGVja0NvbnN0YW50SW50LAorICAvLy8gQ2hlY2sgdGhlIG9wZXJhbmQgaXMgYSBzcGVjaWZpYyBsaXRlcmFsIGludGVnZXIgKGkuZS4gTU8uaXNJbW0oKSBvcgorICAvLy8gTU8uaXNDSW1tKCkgaXMgdHJ1ZSkuCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElECisgIC8vLyAtIE9wSWR4IC0gT3BlcmFuZCBpbmRleAorICAvLy8gLSBFeHBlY3RlZCBpbnRlZ2VyCisgIEdJTV9DaGVja0xpdGVyYWxJbnQsCisgIC8vLyBDaGVjayB0aGUgb3BlcmFuZCBpcyBhIHNwZWNpZmljIGludHJpbnNpYyBJRAorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRAorICAvLy8gLSBPcElkeCAtIE9wZXJhbmQgaW5kZXgKKyAgLy8vIC0gRXhwZWN0ZWQgSW50cmluc2ljIElECisgIEdJTV9DaGVja0ludHJpbnNpY0lELAorICAvLy8gQ2hlY2sgdGhlIHNwZWNpZmllZCBvcGVyYW5kIGlzIGFuIE1CQgorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRAorICAvLy8gLSBPcElkeCAtIE9wZXJhbmQgaW5kZXgKKyAgR0lNX0NoZWNrSXNNQkIsCisKKyAgLy8vIENoZWNrIGlmIHRoZSBzcGVjaWZpZWQgb3BlcmFuZCBpcyBzYWZlIHRvIGZvbGQgaW50byB0aGUgY3VycmVudAorICAvLy8gaW5zdHJ1Y3Rpb24uCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElECisgIEdJTV9DaGVja0lzU2FmZVRvRm9sZCwKKworICAvLy8gQ2hlY2sgdGhlIHNwZWNpZmllZCBvcGVyYW5kcyBhcmUgaWRlbnRpY2FsLgorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRAorICAvLy8gLSBPcElkeCAtIE9wZXJhbmQgaW5kZXgKKyAgLy8vIC0gT3RoZXJJbnNuSUQgLSBPdGhlciBpbnN0cnVjdGlvbiBJRAorICAvLy8gLSBPdGhlck9wSWR4IC0gT3RoZXIgb3BlcmFuZCBpbmRleAorICBHSU1fQ2hlY2tJc1NhbWVPcGVyYW5kLAorCisgIC8vLyBGYWlsIHRoZSBjdXJyZW50IHRyeS1ibG9jaywgb3IgY29tcGxldGVseSBmYWlsIHRvIG1hdGNoIGlmIHRoZXJlIGlzIG5vCisgIC8vLyBjdXJyZW50IHRyeS1ibG9jay4KKyAgR0lNX1JlamVjdCwKKworICAvLz09PSBSZW5kZXJlcnMgPT09CisKKyAgLy8vIE11dGF0ZSBhbiBpbnN0cnVjdGlvbgorICAvLy8gLSBOZXdJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRCB0byBkZWZpbmUKKyAgLy8vIC0gT2xkSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gbXV0YXRlCisgIC8vLyAtIE5ld09wY29kZSAtIFRoZSBuZXcgb3Bjb2RlIHRvIHVzZQorICBHSVJfTXV0YXRlT3Bjb2RlLAorICAvLy8gQnVpbGQgYSBuZXcgaW5zdHJ1Y3Rpb24KKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gZGVmaW5lCisgIC8vLyAtIE9wY29kZSAtIFRoZSBuZXcgb3Bjb2RlIHRvIHVzZQorICBHSVJfQnVpbGRNSSwKKworICAvLy8gQ29weSBhbiBvcGVyYW5kIHRvIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24KKyAgLy8vIC0gTmV3SW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gbW9kaWZ5CisgIC8vLyAtIE9sZEluc25JRCAtIEluc3RydWN0aW9uIElEIHRvIGNvcHkgZnJvbQorICAvLy8gLSBPcElkeCAtIFRoZSBvcGVyYW5kIHRvIGNvcHkKKyAgR0lSX0NvcHksCisgIC8vLyBDb3B5IGFuIG9wZXJhbmQgdG8gdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBvciBhZGQgYSB6ZXJvIHJlZ2lzdGVyIGlmIHRoZQorICAvLy8gb3BlcmFuZCBpcyBhIHplcm8gaW1tZWRpYXRlLgorICAvLy8gLSBOZXdJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRCB0byBtb2RpZnkKKyAgLy8vIC0gT2xkSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gY29weSBmcm9tCisgIC8vLyAtIE9wSWR4IC0gVGhlIG9wZXJhbmQgdG8gY29weQorICAvLy8gLSBaZXJvUmVnIC0gVGhlIHplcm8gcmVnaXN0ZXIgdG8gdXNlCisgIEdJUl9Db3B5T3JBZGRaZXJvUmVnLAorICAvLy8gQ29weSBhbiBvcGVyYW5kIHRvIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24KKyAgLy8vIC0gTmV3SW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gbW9kaWZ5CisgIC8vLyAtIE9sZEluc25JRCAtIEluc3RydWN0aW9uIElEIHRvIGNvcHkgZnJvbQorICAvLy8gLSBPcElkeCAtIFRoZSBvcGVyYW5kIHRvIGNvcHkKKyAgLy8vIC0gU3ViUmVnSWR4IC0gVGhlIHN1YnJlZ2lzdGVyIHRvIGNvcHkKKyAgR0lSX0NvcHlTdWJSZWcsCisgIC8vLyBBZGQgYW4gaW1wbGljaXQgcmVnaXN0ZXIgZGVmIHRvIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24KKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gbW9kaWZ5CisgIC8vLyAtIFJlZ051bSAtIFRoZSByZWdpc3RlciB0byBhZGQKKyAgR0lSX0FkZEltcGxpY2l0RGVmLAorICAvLy8gQWRkIGFuIGltcGxpY2l0IHJlZ2lzdGVyIHVzZSB0byB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElEIHRvIG1vZGlmeQorICAvLy8gLSBSZWdOdW0gLSBUaGUgcmVnaXN0ZXIgdG8gYWRkCisgIEdJUl9BZGRJbXBsaWNpdFVzZSwKKyAgLy8vIEFkZCBhbiByZWdpc3RlciB0byB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElEIHRvIG1vZGlmeQorICAvLy8gLSBSZWdOdW0gLSBUaGUgcmVnaXN0ZXIgdG8gYWRkCisgIEdJUl9BZGRSZWdpc3RlciwKKyAgLy8vIEFkZCBhIHRlbXBvcmFyeSByZWdpc3RlciB0byB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElEIHRvIG1vZGlmeQorICAvLy8gLSBUZW1wUmVnSUQgLSBUaGUgdGVtcG9yYXJ5IHJlZ2lzdGVyIElEIHRvIGFkZAorICBHSVJfQWRkVGVtcFJlZ2lzdGVyLAorICAvLy8gQWRkIGFuIGltbWVkaWF0ZSB0byB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElEIHRvIG1vZGlmeQorICAvLy8gLSBJbW0gLSBUaGUgaW1tZWRpYXRlIHRvIGFkZAorICBHSVJfQWRkSW1tLAorICAvLy8gUmVuZGVyIGNvbXBsZXggb3BlcmFuZHMgdG8gdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbgorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRCB0byBtb2RpZnkKKyAgLy8vIC0gUmVuZGVyZXJJRCAtIFRoZSByZW5kZXJlciB0byBjYWxsCisgIEdJUl9Db21wbGV4UmVuZGVyZXIsCisgIC8vLyBSZW5kZXIgc3ViLW9wZXJhbmRzIG9mIGNvbXBsZXggb3BlcmFuZHMgdG8gdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbgorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRCB0byBtb2RpZnkKKyAgLy8vIC0gUmVuZGVyZXJJRCAtIFRoZSByZW5kZXJlciB0byBjYWxsCisgIC8vLyAtIFJlbmRlck9wSUQgLSBUaGUgc3Vib3BlcmFuZCB0byByZW5kZXIuCisgIEdJUl9Db21wbGV4U3ViT3BlcmFuZFJlbmRlcmVyLAorICAvLy8gUmVuZGVyIG9wZXJhbmRzIHRvIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gdXNpbmcgYSBjdXN0b20gZnVuY3Rpb24KKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gbW9kaWZ5CisgIC8vLyAtIE9sZEluc25JRCAtIEluc3RydWN0aW9uIElEIHRvIGdldCB0aGUgbWF0Y2hlZCBvcGVyYW5kIGZyb20KKyAgLy8vIC0gUmVuZGVyZXJGbklEIC0gQ3VzdG9tIHJlbmRlcmVyIGZ1bmN0aW9uIHRvIGNhbGwKKyAgR0lSX0N1c3RvbVJlbmRlcmVyLAorCisgIC8vLyBSZW5kZXIgYSBHX0NPTlNUQU5UIG9wZXJhdG9yIGFzIGEgc2lnbi1leHRlbmRlZCBpbW1lZGlhdGUuCisgIC8vLyAtIE5ld0luc25JRCAtIEluc3RydWN0aW9uIElEIHRvIG1vZGlmeQorICAvLy8gLSBPbGRJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRCB0byBjb3B5IGZyb20KKyAgLy8vIFRoZSBvcGVyYW5kIGluZGV4IGlzIGltcGxpY2l0bHkgMS4KKyAgR0lSX0NvcHlDb25zdGFudEFzU0ltbSwKKworICAvLy8gQ29uc3RyYWluIGFuIGluc3RydWN0aW9uIG9wZXJhbmQgdG8gYSByZWdpc3RlciBjbGFzcy4KKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gbW9kaWZ5CisgIC8vLyAtIE9wSWR4IC0gT3BlcmFuZCBpbmRleAorICAvLy8gLSBSQ0VudW0gLSBSZWdpc3RlciBjbGFzcyBlbnVtZXJhdGlvbiB2YWx1ZQorICBHSVJfQ29uc3RyYWluT3BlcmFuZFJDLAorICAvLy8gQ29uc3RyYWluIGFuIGluc3RydWN0aW9ucyBvcGVyYW5kcyBhY2NvcmRpbmcgdG8gdGhlIGluc3RydWN0aW9uCisgIC8vLyBkZXNjcmlwdGlvbi4KKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gbW9kaWZ5CisgIEdJUl9Db25zdHJhaW5TZWxlY3RlZEluc3RPcGVyYW5kcywKKyAgLy8vIE1lcmdlIGFsbCBtZW1vcnkgb3BlcmFuZHMgaW50byBpbnN0cnVjdGlvbi4KKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gbW9kaWZ5CisgIC8vLyAtIE1lcmdlSW5zbklELi4uIC0gT25lIG9yIG1vcmUgSW5zdHJ1Y3Rpb24gSUQgdG8gbWVyZ2UgaW50byB0aGUgcmVzdWx0LgorICAvLy8gLSBHSVVfTWVyZ2VNZW1PcGVyYW5kc19FbmRPZkxpc3QgLSBUZXJtaW5hdGVzIHRoZSBsaXN0IG9mIGluc3RydWN0aW9ucyB0bworICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZS4KKyAgR0lSX01lcmdlTWVtT3BlcmFuZHMsCisgIC8vLyBFcmFzZSBmcm9tIHBhcmVudC4KKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gZXJhc2UKKyAgR0lSX0VyYXNlRnJvbVBhcmVudCwKKyAgLy8vIENyZWF0ZSBhIG5ldyB0ZW1wb3JhcnkgcmVnaXN0ZXIgdGhhdCdzIG5vdCBjb25zdHJhaW5lZC4KKyAgLy8vIC0gVGVtcFJlZ0lEIC0gVGhlIHRlbXBvcmFyeSByZWdpc3RlciBJRCB0byBpbml0aWFsaXplLgorICAvLy8gLSBFeHBlY3RlZCB0eXBlCisgIEdJUl9NYWtlVGVtcFJlZywKKworICAvLy8gQSBzdWNjZXNzZnVsIGVtaXNzaW9uCisgIEdJUl9Eb25lLAorCisgIC8vLyBJbmNyZW1lbnQgdGhlIHJ1bGUgY292ZXJhZ2UgY291bnRlci4KKyAgLy8vIC0gUnVsZUlEIC0gVGhlIElEIG9mIHRoZSBydWxlIHRoYXQgd2FzIGNvdmVyZWQuCisgIEdJUl9Db3ZlcmFnZSwKK307CisKK2VudW0geworICAvLy8gSW5kaWNhdGVzIHRoZSBlbmQgb2YgdGhlIHZhcmlhYmxlLWxlbmd0aCBNZXJnZUluc25JRCBsaXN0IGluIGEKKyAgLy8vIEdJUl9NZXJnZU1lbU9wZXJhbmRzIG9wY29kZS4KKyAgR0lVX01lcmdlTWVtT3BlcmFuZHNfRW5kT2ZMaXN0ID0gLTEsCit9OworCisvLy8gUHJvdmlkZXMgdGhlIGxvZ2ljIHRvIHNlbGVjdCBnZW5lcmljIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLgorY2xhc3MgSW5zdHJ1Y3Rpb25TZWxlY3RvciB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkluc3RydWN0aW9uU2VsZWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFNlbGVjdCB0aGUgKHBvc3NpYmx5IGdlbmVyaWMpIGluc3RydWN0aW9uIFxwIEkgdG8gb25seSB1c2UgdGFyZ2V0LXNwZWNpZmljCisgIC8vLyBvcGNvZGVzLiBJdCBpcyBPSyB0byBpbnNlcnQgbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zLCBidXQgdGhleSBjYW5ub3QgYmUKKyAgLy8vIGdlbmVyaWMgcHJlLWlzZWwgaW5zdHJ1Y3Rpb25zLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHdoZXRoZXIgc2VsZWN0aW9uIHN1Y2NlZWRlZC4KKyAgLy8vIFxwcmUgIEkuZ2V0UGFyZW50KCkgJiYgSS5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCkKKyAgLy8vIFxwb3N0CisgIC8vLyAgIGlmIHJldHVybnMgdHJ1ZToKKyAgLy8vICAgICBmb3IgSSBpbiBhbGwgbXV0YXRlZC9pbnNlcnRlZCBpbnN0cnVjdGlvbnM6CisgIC8vLyAgICAgICAhaXNQcmVJU2VsR2VuZXJpY09wY29kZShJLmdldE9wY29kZSgpKQorICB2aXJ0dWFsIGJvb2wgc2VsZWN0KE1hY2hpbmVJbnN0ciAmSSwgQ29kZUdlbkNvdmVyYWdlICZDb3ZlcmFnZUluZm8pIGNvbnN0ID0gMDsKKworcHJvdGVjdGVkOgorICB1c2luZyBDb21wbGV4UmVuZGVyZXJGbnMgPQorICAgICAgT3B0aW9uYWw8U21hbGxWZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKE1hY2hpbmVJbnN0ckJ1aWxkZXIgJik+LCA0Pj47CisgIHVzaW5nIFJlY29yZGVkTUlWZWN0b3IgPSBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIgKiwgND47CisgIHVzaW5nIE5ld01JVmVjdG9yID0gU21hbGxWZWN0b3I8TWFjaGluZUluc3RyQnVpbGRlciwgND47CisKKyAgc3RydWN0IE1hdGNoZXJTdGF0ZSB7CisgICAgc3RkOjp2ZWN0b3I8Q29tcGxleFJlbmRlcmVyRm5zOjp2YWx1ZV90eXBlPiBSZW5kZXJlcnM7CisgICAgUmVjb3JkZWRNSVZlY3RvciBNSXM7CisgICAgRGVuc2VNYXA8dW5zaWduZWQsIHVuc2lnbmVkPiBUZW1wUmVnaXN0ZXJzOworCisgICAgTWF0Y2hlclN0YXRlKHVuc2lnbmVkIE1heFJlbmRlcmVycyk7CisgIH07CisKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFByZWRpY2F0ZUJpdHNldCwgY2xhc3MgQ29tcGxleE1hdGNoZXJNZW1GbiwKKyAgICAgICAgICAgIGNsYXNzIEN1c3RvbVJlbmRlcmVyRm4+CisgIHN0cnVjdCBJU2VsSW5mb1R5IHsKKyAgICBjb25zdCBMTFQgKlR5cGVPYmplY3RzOworICAgIGNvbnN0IFByZWRpY2F0ZUJpdHNldCAqRmVhdHVyZUJpdHNldHM7CisgICAgY29uc3QgQ29tcGxleE1hdGNoZXJNZW1GbiAqQ29tcGxleFByZWRpY2F0ZXM7CisgICAgY29uc3QgQ3VzdG9tUmVuZGVyZXJGbiAqQ3VzdG9tUmVuZGVyZXJzOworICB9OworCitwcm90ZWN0ZWQ6CisgIEluc3RydWN0aW9uU2VsZWN0b3IoKTsKKworICAvLy8gRXhlY3V0ZSBhIGdpdmVuIG1hdGNoZXIgdGFibGUgYW5kIHJldHVybiB0cnVlIGlmIHRoZSBtYXRjaCB3YXMgc3VjY2Vzc2Z1bAorICAvLy8gYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgdGVtcGxhdGUgPGNsYXNzIFRndEluc3RydWN0aW9uU2VsZWN0b3IsIGNsYXNzIFByZWRpY2F0ZUJpdHNldCwKKyAgICAgICAgICAgIGNsYXNzIENvbXBsZXhNYXRjaGVyTWVtRm4sIGNsYXNzIEN1c3RvbVJlbmRlcmVyRm4+CisgIGJvb2wgZXhlY3V0ZU1hdGNoVGFibGUoCisgICAgICBUZ3RJbnN0cnVjdGlvblNlbGVjdG9yICZJU2VsLCBOZXdNSVZlY3RvciAmT3V0TUlzLCBNYXRjaGVyU3RhdGUgJlN0YXRlLAorICAgICAgY29uc3QgSVNlbEluZm9UeTxQcmVkaWNhdGVCaXRzZXQsIENvbXBsZXhNYXRjaGVyTWVtRm4sIEN1c3RvbVJlbmRlcmVyRm4+CisgICAgICAgICAgJklTZWxJbmZvLAorICAgICAgY29uc3QgaW50NjRfdCAqTWF0Y2hUYWJsZSwgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUksCisgICAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJLAorICAgICAgY29uc3QgUmVnaXN0ZXJCYW5rSW5mbyAmUkJJLCBjb25zdCBQcmVkaWNhdGVCaXRzZXQgJkF2YWlsYWJsZUZlYXR1cmVzLAorICAgICAgQ29kZUdlbkNvdmVyYWdlICZDb3ZlcmFnZUluZm8pIGNvbnN0OworCisgIHZpcnR1YWwgYm9vbCB0ZXN0SW1tUHJlZGljYXRlX0k2NCh1bnNpZ25lZCwgaW50NjRfdCkgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIHRvIHVzZSB0YWJsZWdlbiIpOworICB9CisgIHZpcnR1YWwgYm9vbCB0ZXN0SW1tUHJlZGljYXRlX0FQSW50KHVuc2lnbmVkLCBjb25zdCBBUEludCAmKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgdG8gdXNlIHRhYmxlZ2VuIik7CisgIH0KKyAgdmlydHVhbCBib29sIHRlc3RJbW1QcmVkaWNhdGVfQVBGbG9hdCh1bnNpZ25lZCwgY29uc3QgQVBGbG9hdCAmKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgdG8gdXNlIHRhYmxlZ2VuIik7CisgIH0KKworICAvLy8gQ29uc3RyYWluIGEgcmVnaXN0ZXIgb3BlcmFuZCBvZiBhbiBpbnN0cnVjdGlvbiBccCBJIHRvIGEgc3BlY2lmaWVkCisgIC8vLyByZWdpc3RlciBjbGFzcy4gVGhpcyBjb3VsZCBpbnZvbHZlIGluc2VydGluZyBDT1BZcyBiZWZvcmUgKGZvciB1c2VzKSBvcgorICAvLy8gYWZ0ZXIgKGZvciBkZWZzKSBhbmQgbWF5IHJlcGxhY2UgdGhlIG9wZXJhbmQgb2YgXHAgSS4KKyAgLy8vIFxyZXR1cm5zIHdoZXRoZXIgb3BlcmFuZCByZWdjbGFzcyBjb25zdHJhaW5pbmcgc3VjY2VlZGVkLgorICBib29sIGNvbnN0cmFpbk9wZXJhbmRSZWdUb1JlZ0NsYXNzKE1hY2hpbmVJbnN0ciAmSSwgdW5zaWduZWQgT3BJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAmUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnaXN0ZXJCYW5rSW5mbyAmUkJJKSBjb25zdDsKKworICBib29sIGlzT3BlcmFuZEltbUVxdWFsKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTywgaW50NjRfdCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkkpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9wZXJhbmQgaXMgYSBHX0dFUCB3aXRoIGEgR19DT05TVEFOVCBvbiB0aGUKKyAgLy8vIHJpZ2h0LWhhbmQgc2lkZS4gR2xvYmFsSVNlbCdzIHNlcGFyYXRpb24gb2YgcG9pbnRlciBhbmQgaW50ZWdlciB0eXBlcworICAvLy8gbWVhbnMgdGhhdCB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IEdfT1Igd2l0aCBlcXVpdmFsZW50IHNlbWFudGljcy4KKyAgYm9vbCBpc0Jhc2VXaXRoQ29uc3RhbnRPZmZzZXQoY29uc3QgTWFjaGluZU9wZXJhbmQgJlJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIE1JIGNhbiBvYnZpb3VzbHkgYmUgZm9sZGVkIGludG8gSW50b01JLgorICAvLy8gTUkgYW5kIEludG9NSSBkbyBub3QgbmVlZCB0byBiZSBpbiB0aGUgc2FtZSBiYXNpYyBibG9ja3MsIGJ1dCBNSSBtdXN0CisgIC8vLyBwcmVjZWVkIEludG9NSS4KKyAgYm9vbCBpc09idmlvdXNseVNhZmVUb0ZvbGQoTWFjaGluZUluc3RyICZNSSwgTWFjaGluZUluc3RyICZJbnRvTUkpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0lOU1RSVUNUSU9OU0VMRUNUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvSW5zdHJ1Y3Rpb25TZWxlY3RvckltcGwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0luc3RydWN0aW9uU2VsZWN0b3JJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1OTNiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0luc3RydWN0aW9uU2VsZWN0b3JJbXBsLmgKQEAgLTAsMCArMSw3NjkgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9JbnN0cnVjdGlvblNlbGVjdG9ySW1wbC5oIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgQVBJIGZvciB0aGUgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IuCisvLy8gVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3Igc2VsZWN0aW5nIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLgorLy8vIEl0J3MgaW1wbGVtZW50ZWQgYnkgdGhlIHRhcmdldC4gSXQncyB1c2VkIGJ5IHRoZSBJbnN0cnVjdGlvblNlbGVjdCBwYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfSU5TVFJVQ1RJT05TRUxFQ1RPUklNUExfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9JTlNUUlVDVElPTlNFTEVDVE9SSU1QTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0luc3RydWN0aW9uU2VsZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9SZWdpc3RlckJhbmtJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvVXRpbHMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lT3BlcmFuZC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRPcGNvZGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gR2xvYmFsSVNlbCBQYXRGcmFnIFByZWRpY2F0ZXMKK2VudW0geworICBHSVBGUF9JNjRfSW52YWxpZCA9IDAsCisgIEdJUEZQX0FQSW50X0ludmFsaWQgPSAwLAorICBHSVBGUF9BUEZsb2F0X0ludmFsaWQgPSAwLAorfTsKKwordGVtcGxhdGUgPGNsYXNzIFRndEluc3RydWN0aW9uU2VsZWN0b3IsIGNsYXNzIFByZWRpY2F0ZUJpdHNldCwKKyAgICAgICAgICBjbGFzcyBDb21wbGV4TWF0Y2hlck1lbUZuLCBjbGFzcyBDdXN0b21SZW5kZXJlckZuPgorYm9vbCBJbnN0cnVjdGlvblNlbGVjdG9yOjpleGVjdXRlTWF0Y2hUYWJsZSgKKyAgICBUZ3RJbnN0cnVjdGlvblNlbGVjdG9yICZJU2VsLCBOZXdNSVZlY3RvciAmT3V0TUlzLCBNYXRjaGVyU3RhdGUgJlN0YXRlLAorICAgIGNvbnN0IElTZWxJbmZvVHk8UHJlZGljYXRlQml0c2V0LCBDb21wbGV4TWF0Y2hlck1lbUZuLCBDdXN0b21SZW5kZXJlckZuPgorICAgICAgICAmSVNlbEluZm8sCisgICAgY29uc3QgaW50NjRfdCAqTWF0Y2hUYWJsZSwgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUksCisgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSwKKyAgICBjb25zdCBSZWdpc3RlckJhbmtJbmZvICZSQkksIGNvbnN0IFByZWRpY2F0ZUJpdHNldCAmQXZhaWxhYmxlRmVhdHVyZXMsCisgICAgQ29kZUdlbkNvdmVyYWdlICZDb3ZlcmFnZUluZm8pIGNvbnN0IHsKKyAgdWludDY0X3QgQ3VycmVudElkeCA9IDA7CisgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCA4PiBPbkZhaWxSZXN1bWVBdDsKKworICBlbnVtIFJlamVjdEFjdGlvbiB7IFJlamVjdEFuZEdpdmVVcCwgUmVqZWN0QW5kUmVzdW1lIH07CisgIGF1dG8gaGFuZGxlUmVqZWN0ID0gWyZdKCkgLT4gUmVqZWN0QWN0aW9uIHsKKyAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBSZWplY3RlZFxuIik7CisgICAgaWYgKE9uRmFpbFJlc3VtZUF0LmVtcHR5KCkpCisgICAgICByZXR1cm4gUmVqZWN0QW5kR2l2ZVVwOworICAgIEN1cnJlbnRJZHggPSBPbkZhaWxSZXN1bWVBdC5iYWNrKCk7CisgICAgT25GYWlsUmVzdW1lQXQucG9wX2JhY2soKTsKKyAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBSZXN1bWUgYXQgIiA8PCBDdXJyZW50SWR4IDw8ICIgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IE9uRmFpbFJlc3VtZUF0LnNpemUoKSA8PCAiIHRyeS1ibG9ja3MgcmVtYWluKVxuIik7CisgICAgcmV0dXJuIFJlamVjdEFuZFJlc3VtZTsKKyAgfTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGFzc2VydChDdXJyZW50SWR4ICE9IH4wdSAmJiAiSW52YWxpZCBNYXRjaFRhYmxlIGluZGV4Iik7CisgICAgc3dpdGNoIChNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK10pIHsKKyAgICBjYXNlIEdJTV9Ucnk6IHsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogQmVnaW4gdHJ5LWJsb2NrXG4iKTsKKyAgICAgIE9uRmFpbFJlc3VtZUF0LnB1c2hfYmFjayhNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK10pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSU1fUmVjb3JkSW5zbjogeworICAgICAgaW50NjRfdCBOZXdJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgT3BJZHggPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisKKyAgICAgIC8vIEFzIGFuIG9wdGltaXNhdGlvbiB3ZSByZXF1aXJlIHRoYXQgTUlzWzBdIGlzIGFsd2F5cyB0aGUgcm9vdC4gUmVmdXNlCisgICAgICAvLyBhbnkgYXR0ZW1wdCB0byBtb2RpZnkgaXQuCisgICAgICBhc3NlcnQoTmV3SW5zbklEICE9IDAgJiYgIlJlZnVzaW5nIHRvIG1vZGlmeSBNSXNbMF0iKTsKKworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gU3RhdGUuTUlzW0luc25JRF0tPmdldE9wZXJhbmQoT3BJZHgpOworICAgICAgaWYgKCFNTy5pc1JlZygpKSB7CisgICAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBOb3QgYSByZWdpc3RlclxuIik7CisgICAgICAgIGlmIChoYW5kbGVSZWplY3QoKSA9PSBSZWplY3RBbmRHaXZlVXApCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChUUkkuaXNQaHlzaWNhbFJlZ2lzdGVyKE1PLmdldFJlZygpKSkgeworICAgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogSXMgYSBwaHlzaWNhbCByZWdpc3RlclxuIik7CisgICAgICAgIGlmIChoYW5kbGVSZWplY3QoKSA9PSBSZWplY3RBbmRHaXZlVXApCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgTWFjaGluZUluc3RyICpOZXdNSSA9IE1SSS5nZXRWUmVnRGVmKE1PLmdldFJlZygpKTsKKyAgICAgIGlmICgoc2l6ZV90KU5ld0luc25JRCA8IFN0YXRlLk1Jcy5zaXplKCkpCisgICAgICAgIFN0YXRlLk1Jc1tOZXdJbnNuSURdID0gTmV3TUk7CisgICAgICBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KChzaXplX3QpTmV3SW5zbklEID09IFN0YXRlLk1Jcy5zaXplKCkgJiYKKyAgICAgICAgICAgICAgICJFeHBlY3RlZCB0byBzdG9yZSBNSXMgaW4gb3JkZXIiKTsKKyAgICAgICAgU3RhdGUuTUlzLnB1c2hfYmFjayhOZXdNSSk7CisgICAgICB9CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IE1Jc1siIDw8IE5ld0luc25JRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXSA9IEdJTV9SZWNvcmRJbnNuKCIgPDwgSW5zbklEIDw8ICIsICIgPDwgT3BJZHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIilcbiIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSU1fQ2hlY2tGZWF0dXJlczogeworICAgICAgaW50NjRfdCBFeHBlY3RlZEJpdHNldElEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBHSU1fQ2hlY2tGZWF0dXJlcyhFeHBlY3RlZEJpdHNldElEPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRXhwZWN0ZWRCaXRzZXRJRCA8PCAiKVxuIik7CisgICAgICBpZiAoKEF2YWlsYWJsZUZlYXR1cmVzICYgSVNlbEluZm8uRmVhdHVyZUJpdHNldHNbRXhwZWN0ZWRCaXRzZXRJRF0pICE9CisgICAgICAgICAgSVNlbEluZm8uRmVhdHVyZUJpdHNldHNbRXhwZWN0ZWRCaXRzZXRJRF0pIHsKKyAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJTV9DaGVja09wY29kZTogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IEV4cGVjdGVkID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworCisgICAgICB1bnNpZ25lZCBPcGNvZGUgPSBTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0T3Bjb2RlKCk7CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJTV9DaGVja09wY29kZShNSXNbIiA8PCBJbnNuSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIl0sIEV4cGVjdGVkT3Bjb2RlPSIgPDwgRXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgLy8gR290PSIgPDwgT3Bjb2RlIDw8ICJcbiIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdICE9IG51bGxwdHIgJiYgIlVzZWQgaW5zbiBiZWZvcmUgZGVmaW5lZCIpOworICAgICAgaWYgKE9wY29kZSAhPSBFeHBlY3RlZCkgeworICAgICAgICBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lNX0NoZWNrTnVtT3BlcmFuZHM6IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBFeHBlY3RlZCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lNX0NoZWNrTnVtT3BlcmFuZHMoTUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5zbklEIDw8ICJdLCBFeHBlY3RlZD0iIDw8IEV4cGVjdGVkIDw8ICIpXG4iKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXSAhPSBudWxscHRyICYmICJVc2VkIGluc24gYmVmb3JlIGRlZmluZWQiKTsKKyAgICAgIGlmIChTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0TnVtT3BlcmFuZHMoKSAhPSBFeHBlY3RlZCkgeworICAgICAgICBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdJTV9DaGVja0k2NEltbVByZWRpY2F0ZTogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IFByZWRpY2F0ZSA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEN1cnJlbnRJZHggPDwgIjogR0lNX0NoZWNrSTY0SW1tUHJlZGljYXRlKE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXSwgUHJlZGljYXRlPSIgPDwgUHJlZGljYXRlIDw8ICIpXG4iKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXSAhPSBudWxscHRyICYmICJVc2VkIGluc24gYmVmb3JlIGRlZmluZWQiKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpHX0NPTlNUQU5UICYmCisgICAgICAgICAgICAgIkV4cGVjdGVkIEdfQ09OU1RBTlQiKTsKKyAgICAgIGFzc2VydChQcmVkaWNhdGUgPiBHSVBGUF9JNjRfSW52YWxpZCAmJiAiRXhwZWN0ZWQgYSB2YWxpZCBwcmVkaWNhdGUiKTsKKyAgICAgIGludDY0X3QgVmFsdWUgPSAwOworICAgICAgaWYgKFN0YXRlLk1Jc1tJbnNuSURdLT5nZXRPcGVyYW5kKDEpLmlzQ0ltbSgpKQorICAgICAgICBWYWx1ZSA9IFN0YXRlLk1Jc1tJbnNuSURdLT5nZXRPcGVyYW5kKDEpLmdldENJbW0oKS0+Z2V0U0V4dFZhbHVlKCk7CisgICAgICBlbHNlIGlmIChTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0T3BlcmFuZCgxKS5pc0ltbSgpKQorICAgICAgICBWYWx1ZSA9IFN0YXRlLk1Jc1tJbnNuSURdLT5nZXRPcGVyYW5kKDEpLmdldEltbSgpOworICAgICAgZWxzZQorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJFeHBlY3RlZCBJbW0gb3IgQ0ltbSBvcGVyYW5kIik7CisKKyAgICAgIGlmICghdGVzdEltbVByZWRpY2F0ZV9JNjQoUHJlZGljYXRlLCBWYWx1ZSkpCisgICAgICAgIGlmIChoYW5kbGVSZWplY3QoKSA9PSBSZWplY3RBbmRHaXZlVXApCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR0lNX0NoZWNrQVBJbnRJbW1QcmVkaWNhdGU6IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBQcmVkaWNhdGUgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBDdXJyZW50SWR4IDw8ICI6IEdJTV9DaGVja0FQSW50SW1tUHJlZGljYXRlKE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXSwgUHJlZGljYXRlPSIgPDwgUHJlZGljYXRlIDw8ICIpXG4iKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXSAhPSBudWxscHRyICYmICJVc2VkIGluc24gYmVmb3JlIGRlZmluZWQiKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0T3Bjb2RlKCkgJiYgIkV4cGVjdGVkIEdfQ09OU1RBTlQiKTsKKyAgICAgIGFzc2VydChQcmVkaWNhdGUgPiBHSVBGUF9BUEludF9JbnZhbGlkICYmICJFeHBlY3RlZCBhIHZhbGlkIHByZWRpY2F0ZSIpOworICAgICAgQVBJbnQgVmFsdWU7CisgICAgICBpZiAoU3RhdGUuTUlzW0luc25JRF0tPmdldE9wZXJhbmQoMSkuaXNDSW1tKCkpCisgICAgICAgIFZhbHVlID0gU3RhdGUuTUlzW0luc25JRF0tPmdldE9wZXJhbmQoMSkuZ2V0Q0ltbSgpLT5nZXRWYWx1ZSgpOworICAgICAgZWxzZQorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJFeHBlY3RlZCBJbW0gb3IgQ0ltbSBvcGVyYW5kIik7CisKKyAgICAgIGlmICghdGVzdEltbVByZWRpY2F0ZV9BUEludChQcmVkaWNhdGUsIFZhbHVlKSkKKyAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHSU1fQ2hlY2tBUEZsb2F0SW1tUHJlZGljYXRlOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgUHJlZGljYXRlID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgQ3VycmVudElkeCA8PCAiOiBHSU1fQ2hlY2tBUEZsb2F0SW1tUHJlZGljYXRlKE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXSwgUHJlZGljYXRlPSIgPDwgUHJlZGljYXRlIDw8ICIpXG4iKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXSAhPSBudWxscHRyICYmICJVc2VkIGluc24gYmVmb3JlIGRlZmluZWQiKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpHX0ZDT05TVEFOVCAmJgorICAgICAgICAgICAgICJFeHBlY3RlZCBHX0ZDT05TVEFOVCIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdLT5nZXRPcGVyYW5kKDEpLmlzRlBJbW0oKSAmJiAiRXhwZWN0ZWQgRlBJbW0gb3BlcmFuZCIpOworICAgICAgYXNzZXJ0KFByZWRpY2F0ZSA+IEdJUEZQX0FQRmxvYXRfSW52YWxpZCAmJiAiRXhwZWN0ZWQgYSB2YWxpZCBwcmVkaWNhdGUiKTsKKyAgICAgIEFQRmxvYXQgVmFsdWUgPSBTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0T3BlcmFuZCgxKS5nZXRGUEltbSgpLT5nZXRWYWx1ZUFQRigpOworCisgICAgICBpZiAoIXRlc3RJbW1QcmVkaWNhdGVfQVBGbG9hdChQcmVkaWNhdGUsIFZhbHVlKSkKKyAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHSU1fQ2hlY2tBdG9taWNPcmRlcmluZzogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBBdG9taWNPcmRlcmluZyBPcmRlcmluZyA9IChBdG9taWNPcmRlcmluZylNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJTV9DaGVja0F0b21pY09yZGVyaW5nKE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXSwgIiA8PCAodWludDY0X3QpT3JkZXJpbmcgPDwgIilcbiIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdICE9IG51bGxwdHIgJiYgIlVzZWQgaW5zbiBiZWZvcmUgZGVmaW5lZCIpOworCisgICAgICBpZiAoIVN0YXRlLk1Jc1tJbnNuSURdLT5oYXNPbmVNZW1PcGVyYW5kKCkpCisgICAgICAgIGlmIChoYW5kbGVSZWplY3QoKSA9PSBSZWplY3RBbmRHaXZlVXApCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBmb3IgKGNvbnN0IGF1dG8gJk1NTyA6IFN0YXRlLk1Jc1tJbnNuSURdLT5tZW1vcGVyYW5kcygpKQorICAgICAgICBpZiAoTU1PLT5nZXRPcmRlcmluZygpICE9IE9yZGVyaW5nKQorICAgICAgICAgIGlmIChoYW5kbGVSZWplY3QoKSA9PSBSZWplY3RBbmRHaXZlVXApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHSU1fQ2hlY2tBdG9taWNPcmRlcmluZ09yU3Ryb25nZXJUaGFuOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIEF0b21pY09yZGVyaW5nIE9yZGVyaW5nID0gKEF0b21pY09yZGVyaW5nKU1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjogR0lNX0NoZWNrQXRvbWljT3JkZXJpbmdPclN0cm9uZ2VyVGhhbihNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJbnNuSUQgPDwgIl0sICIgPDwgKHVpbnQ2NF90KU9yZGVyaW5nIDw8ICIpXG4iKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXSAhPSBudWxscHRyICYmICJVc2VkIGluc24gYmVmb3JlIGRlZmluZWQiKTsKKworICAgICAgaWYgKCFTdGF0ZS5NSXNbSW5zbklEXS0+aGFzT25lTWVtT3BlcmFuZCgpKQorICAgICAgICBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgZm9yIChjb25zdCBhdXRvICZNTU8gOiBTdGF0ZS5NSXNbSW5zbklEXS0+bWVtb3BlcmFuZHMoKSkKKyAgICAgICAgaWYgKCFpc0F0TGVhc3RPclN0cm9uZ2VyVGhhbihNTU8tPmdldE9yZGVyaW5nKCksIE9yZGVyaW5nKSkKKyAgICAgICAgICBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR0lNX0NoZWNrQXRvbWljT3JkZXJpbmdXZWFrZXJUaGFuOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIEF0b21pY09yZGVyaW5nIE9yZGVyaW5nID0gKEF0b21pY09yZGVyaW5nKU1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjogR0lNX0NoZWNrQXRvbWljT3JkZXJpbmdXZWFrZXJUaGFuKE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXSwgIiA8PCAodWludDY0X3QpT3JkZXJpbmcgPDwgIilcbiIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdICE9IG51bGxwdHIgJiYgIlVzZWQgaW5zbiBiZWZvcmUgZGVmaW5lZCIpOworCisgICAgICBpZiAoIVN0YXRlLk1Jc1tJbnNuSURdLT5oYXNPbmVNZW1PcGVyYW5kKCkpCisgICAgICAgIGlmIChoYW5kbGVSZWplY3QoKSA9PSBSZWplY3RBbmRHaXZlVXApCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBmb3IgKGNvbnN0IGF1dG8gJk1NTyA6IFN0YXRlLk1Jc1tJbnNuSURdLT5tZW1vcGVyYW5kcygpKQorICAgICAgICBpZiAoIWlzU3Ryb25nZXJUaGFuKE9yZGVyaW5nLCBNTU8tPmdldE9yZGVyaW5nKCkpKQorICAgICAgICAgIGlmIChoYW5kbGVSZWplY3QoKSA9PSBSZWplY3RBbmRHaXZlVXApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHSU1fQ2hlY2tUeXBlOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgT3BJZHggPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IFR5cGVJRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lNX0NoZWNrVHlwZShNSXNbIiA8PCBJbnNuSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIl0tPmdldE9wZXJhbmQoIiA8PCBPcElkeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSwgVHlwZUlEPSIgPDwgVHlwZUlEIDw8ICIpXG4iKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXSAhPSBudWxscHRyICYmICJVc2VkIGluc24gYmVmb3JlIGRlZmluZWQiKTsKKworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gU3RhdGUuTUlzW0luc25JRF0tPmdldE9wZXJhbmQoT3BJZHgpOworICAgICAgaWYgKCFNTy5pc1JlZygpIHx8CisgICAgICAgICAgTVJJLmdldFR5cGUoTU8uZ2V0UmVnKCkpICE9IElTZWxJbmZvLlR5cGVPYmplY3RzW1R5cGVJRF0pIHsKKyAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHSU1fQ2hlY2tQb2ludGVyVG9Bbnk6IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBPcElkeCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgU2l6ZUluQml0cyA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSU1fQ2hlY2tQb2ludGVyVG9BbnkoTUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5zbklEIDw8ICJdLT5nZXRPcGVyYW5kKCIgPDwgT3BJZHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiksIFNpemVJbkJpdHM9IiA8PCBTaXplSW5CaXRzIDw8ICIpXG4iKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXSAhPSBudWxscHRyICYmICJVc2VkIGluc24gYmVmb3JlIGRlZmluZWQiKTsKKworICAgICAgLy8gaVBUUiBtdXN0IGJlIGxvb2tlZCB1cCBpbiB0aGUgdGFyZ2V0LgorICAgICAgaWYgKFNpemVJbkJpdHMgPT0gMCkgeworICAgICAgICBNYWNoaW5lRnVuY3Rpb24gKk1GID0gU3RhdGUuTUlzW0luc25JRF0tPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgICAgICAgU2l6ZUluQml0cyA9IE1GLT5nZXREYXRhTGF5b3V0KCkuZ2V0UG9pbnRlclNpemVJbkJpdHMoMCk7CisgICAgICB9CisKKyAgICAgIGFzc2VydChTaXplSW5CaXRzICE9IDAgJiYgIlBvaW50ZXIgc2l6ZSBtdXN0IGJlIGtub3duIik7CisKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IFN0YXRlLk1Jc1tJbnNuSURdLT5nZXRPcGVyYW5kKE9wSWR4KTsKKyAgICAgIGlmIChNTy5pc1JlZygpKSB7CisgICAgICAgIGNvbnN0IExMVCAmVHkgPSBNUkkuZ2V0VHlwZShNTy5nZXRSZWcoKSk7CisgICAgICAgIGlmICghVHkuaXNQb2ludGVyKCkgfHwgVHkuZ2V0U2l6ZUluQml0cygpICE9IFNpemVJbkJpdHMpCisgICAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdJTV9DaGVja1JlZ0JhbmtGb3JDbGFzczogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IE9wSWR4ID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBSQ0VudW0gPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJTV9DaGVja1JlZ0JhbmtGb3JDbGFzcyhNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJbnNuSUQgPDwgIl0tPmdldE9wZXJhbmQoIiA8PCBPcElkeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSwgUkNFbnVtPSIgPDwgUkNFbnVtIDw8ICIpXG4iKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXSAhPSBudWxscHRyICYmICJVc2VkIGluc24gYmVmb3JlIGRlZmluZWQiKTsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IFN0YXRlLk1Jc1tJbnNuSURdLT5nZXRPcGVyYW5kKE9wSWR4KTsKKyAgICAgIGlmICghTU8uaXNSZWcoKSB8fAorICAgICAgICAgICZSQkkuZ2V0UmVnQmFua0Zyb21SZWdDbGFzcygqVFJJLmdldFJlZ0NsYXNzKFJDRW51bSkpICE9CisgICAgICAgICAgICAgIFJCSS5nZXRSZWdCYW5rKE1PLmdldFJlZygpLCBNUkksIFRSSSkpIHsKKyAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJTV9DaGVja0NvbXBsZXhQYXR0ZXJuOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgT3BJZHggPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IFJlbmRlcmVySUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IENvbXBsZXhQcmVkaWNhdGVJRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogU3RhdGUuUmVuZGVyZXJzWyIgPDwgUmVuZGVyZXJJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXSA9IEdJTV9DaGVja0NvbXBsZXhQYXR0ZXJuKE1Jc1siIDw8IEluc25JRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXS0+Z2V0T3BlcmFuZCgiIDw8IE9wSWR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpLCBDb21wbGV4UHJlZGljYXRlSUQ9IiA8PCBDb21wbGV4UHJlZGljYXRlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIilcbiIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdICE9IG51bGxwdHIgJiYgIlVzZWQgaW5zbiBiZWZvcmUgZGVmaW5lZCIpOworICAgICAgLy8gRklYTUU6IFVzZSBzdGQ6Omludm9rZSgpIHdoZW4gaXQncyBhdmFpbGFibGUuCisgICAgICBDb21wbGV4UmVuZGVyZXJGbnMgUmVuZGVyZXIgPQorICAgICAgICAgIChJU2VsLipJU2VsSW5mby5Db21wbGV4UHJlZGljYXRlc1tDb21wbGV4UHJlZGljYXRlSURdKSgKKyAgICAgICAgICAgICAgU3RhdGUuTUlzW0luc25JRF0tPmdldE9wZXJhbmQoT3BJZHgpKTsKKyAgICAgIGlmIChSZW5kZXJlci5oYXNWYWx1ZSgpKQorICAgICAgICBTdGF0ZS5SZW5kZXJlcnNbUmVuZGVyZXJJRF0gPSBSZW5kZXJlci5nZXRWYWx1ZSgpOworICAgICAgZWxzZQorICAgICAgICBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lNX0NoZWNrQ29uc3RhbnRJbnQ6IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBPcElkeCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgVmFsdWUgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJTV9DaGVja0NvbnN0YW50SW50KE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXS0+Z2V0T3BlcmFuZCgiIDw8IE9wSWR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpLCBWYWx1ZT0iIDw8IFZhbHVlIDw8ICIpXG4iKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXSAhPSBudWxscHRyICYmICJVc2VkIGluc24gYmVmb3JlIGRlZmluZWQiKTsKKworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gU3RhdGUuTUlzW0luc25JRF0tPmdldE9wZXJhbmQoT3BJZHgpOworICAgICAgaWYgKE1PLmlzUmVnKCkpIHsKKyAgICAgICAgLy8gaXNPcGVyYW5kSW1tRXF1YWwoKSB3aWxsIHNpZ24tZXh0ZW5kIHRvIDY0LWJpdHMsIHNvIHNob3VsZCB3ZS4KKyAgICAgICAgTExUIFR5ID0gTVJJLmdldFR5cGUoTU8uZ2V0UmVnKCkpOworICAgICAgICBWYWx1ZSA9IFNpZ25FeHRlbmQ2NChWYWx1ZSwgVHkuZ2V0U2l6ZUluQml0cygpKTsKKworICAgICAgICBpZiAoIWlzT3BlcmFuZEltbUVxdWFsKE1PLCBWYWx1ZSwgTVJJKSkgeworICAgICAgICAgIGlmIChoYW5kbGVSZWplY3QoKSA9PSBSZWplY3RBbmRHaXZlVXApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lNX0NoZWNrTGl0ZXJhbEludDogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IE9wSWR4ID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBWYWx1ZSA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lNX0NoZWNrTGl0ZXJhbEludChNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJbnNuSUQgPDwgIl0tPmdldE9wZXJhbmQoIiA8PCBPcElkeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSwgVmFsdWU9IiA8PCBWYWx1ZSA8PCAiKVxuIik7CisgICAgICBhc3NlcnQoU3RhdGUuTUlzW0luc25JRF0gIT0gbnVsbHB0ciAmJiAiVXNlZCBpbnNuIGJlZm9yZSBkZWZpbmVkIik7CisgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0T3BlcmFuZChPcElkeCk7CisgICAgICBpZiAoIU1PLmlzQ0ltbSgpIHx8ICFNTy5nZXRDSW1tKCktPmVxdWFsc0ludChWYWx1ZSkpIHsKKyAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJTV9DaGVja0ludHJpbnNpY0lEOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgT3BJZHggPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IFZhbHVlID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSU1fQ2hlY2tJbnRyaW5zaWNJRChNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJbnNuSUQgPDwgIl0tPmdldE9wZXJhbmQoIiA8PCBPcElkeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSwgVmFsdWU9IiA8PCBWYWx1ZSA8PCAiKVxuIik7CisgICAgICBhc3NlcnQoU3RhdGUuTUlzW0luc25JRF0gIT0gbnVsbHB0ciAmJiAiVXNlZCBpbnNuIGJlZm9yZSBkZWZpbmVkIik7CisgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0T3BlcmFuZChPcElkeCk7CisgICAgICBpZiAoIU1PLmlzSW50cmluc2ljSUQoKSB8fCBNTy5nZXRJbnRyaW5zaWNJRCgpICE9IFZhbHVlKQorICAgICAgICBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lNX0NoZWNrSXNNQkI6IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBPcElkeCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lNX0NoZWNrSXNNQkIoTUlzWyIgPDwgSW5zbklECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJdLT5nZXRPcGVyYW5kKCIgPDwgT3BJZHggPDwgIikpXG4iKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXSAhPSBudWxscHRyICYmICJVc2VkIGluc24gYmVmb3JlIGRlZmluZWQiKTsKKyAgICAgIGlmICghU3RhdGUuTUlzW0luc25JRF0tPmdldE9wZXJhbmQoT3BJZHgpLmlzTUJCKCkpIHsKKyAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJTV9DaGVja0lzU2FmZVRvRm9sZDogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJTV9DaGVja0lzU2FmZVRvRm9sZChNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJbnNuSUQgPDwgIl0pXG4iKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXSAhPSBudWxscHRyICYmICJVc2VkIGluc24gYmVmb3JlIGRlZmluZWQiKTsKKyAgICAgIGlmICghaXNPYnZpb3VzbHlTYWZlVG9Gb2xkKCpTdGF0ZS5NSXNbSW5zbklEXSwgKlN0YXRlLk1Jc1swXSkpIHsKKyAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHSU1fQ2hlY2tJc1NhbWVPcGVyYW5kOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgT3BJZHggPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IE90aGVySW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBPdGhlck9wSWR4ID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSU1fQ2hlY2tJc1NhbWVPcGVyYW5kKE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXVsiIDw8IE9wSWR4IDw8ICJdLCBNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBPdGhlckluc25JRCA8PCAiXVsiIDw8IE90aGVyT3BJZHggPDwgIl0pXG4iKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXSAhPSBudWxscHRyICYmICJVc2VkIGluc24gYmVmb3JlIGRlZmluZWQiKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbT3RoZXJJbnNuSURdICE9IG51bGxwdHIgJiYgIlVzZWQgaW5zbiBiZWZvcmUgZGVmaW5lZCIpOworICAgICAgaWYgKCFTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0T3BlcmFuZChPcElkeCkuaXNJZGVudGljYWxUbygKKyAgICAgICAgICAgICAgU3RhdGUuTUlzW090aGVySW5zbklEXS0+Z2V0T3BlcmFuZChPdGhlck9wSWR4KSkpIHsKKyAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHSU1fUmVqZWN0OgorICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSU1fUmVqZWN0Iik7CisgICAgICBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR0lSX011dGF0ZU9wY29kZTogeworICAgICAgaW50NjRfdCBPbGRJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICB1aW50NjRfdCBOZXdJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IE5ld09wY29kZSA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGlmIChOZXdJbnNuSUQgPj0gT3V0TUlzLnNpemUoKSkKKyAgICAgICAgT3V0TUlzLnJlc2l6ZShOZXdJbnNuSUQgKyAxKTsKKworICAgICAgT3V0TUlzW05ld0luc25JRF0gPSBNYWNoaW5lSW5zdHJCdWlsZGVyKCpTdGF0ZS5NSXNbT2xkSW5zbklEXS0+Z2V0TUYoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZS5NSXNbT2xkSW5zbklEXSk7CisgICAgICBPdXRNSXNbTmV3SW5zbklEXS0+c2V0RGVzYyhUSUkuZ2V0KE5ld09wY29kZSkpOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSVJfTXV0YXRlT3Bjb2RlKE91dE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IE5ld0luc25JRCA8PCAiXSwgTUlzWyIgPDwgT2xkSW5zbklEIDw8ICJdLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IE5ld09wY29kZSA8PCAiKVxuIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJUl9CdWlsZE1JOiB7CisgICAgICB1aW50NjRfdCBOZXdJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IE9wY29kZSA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGlmIChOZXdJbnNuSUQgPj0gT3V0TUlzLnNpemUoKSkKKyAgICAgICAgT3V0TUlzLnJlc2l6ZShOZXdJbnNuSUQgKyAxKTsKKworICAgICAgT3V0TUlzW05ld0luc25JRF0gPSBCdWlsZE1JKCpTdGF0ZS5NSXNbMF0tPmdldFBhcmVudCgpLCBTdGF0ZS5NSXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUuTUlzWzBdLT5nZXREZWJ1Z0xvYygpLCBUSUkuZ2V0KE9wY29kZSkpOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSVJfQnVpbGRNSShPdXRNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBOZXdJbnNuSUQgPDwgIl0sICIgPDwgT3Bjb2RlIDw8ICIpXG4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lSX0NvcHk6IHsKKyAgICAgIGludDY0X3QgTmV3SW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBPbGRJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IE9wSWR4ID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgYXNzZXJ0KE91dE1Jc1tOZXdJbnNuSURdICYmICJBdHRlbXB0ZWQgdG8gYWRkIHRvIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiIpOworICAgICAgT3V0TUlzW05ld0luc25JRF0uYWRkKFN0YXRlLk1Jc1tPbGRJbnNuSURdLT5nZXRPcGVyYW5kKE9wSWR4KSk7CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBDdXJyZW50SWR4IDw8ICI6IEdJUl9Db3B5KE91dE1Jc1siIDw8IE5ld0luc25JRAorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXSwgTUlzWyIgPDwgT2xkSW5zbklEIDw8ICJdLCAiIDw8IE9wSWR4IDw8ICIpXG4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lSX0NvcHlPckFkZFplcm9SZWc6IHsKKyAgICAgIGludDY0X3QgTmV3SW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBPbGRJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IE9wSWR4ID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBaZXJvUmVnID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgYXNzZXJ0KE91dE1Jc1tOZXdJbnNuSURdICYmICJBdHRlbXB0ZWQgdG8gYWRkIHRvIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiIpOworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gU3RhdGUuTUlzW09sZEluc25JRF0tPmdldE9wZXJhbmQoT3BJZHgpOworICAgICAgaWYgKGlzT3BlcmFuZEltbUVxdWFsKE1PLCAwLCBNUkkpKQorICAgICAgICBPdXRNSXNbTmV3SW5zbklEXS5hZGRSZWcoWmVyb1JlZyk7CisgICAgICBlbHNlCisgICAgICAgIE91dE1Jc1tOZXdJbnNuSURdLmFkZChNTyk7CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJUl9Db3B5T3JBZGRaZXJvUmVnKE91dE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IE5ld0luc25JRCA8PCAiXSwgTUlzWyIgPDwgT2xkSW5zbklEIDw8ICJdLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IE9wSWR4IDw8ICIsICIgPDwgWmVyb1JlZyA8PCAiKVxuIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJUl9Db3B5U3ViUmVnOiB7CisgICAgICBpbnQ2NF90IE5ld0luc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgT2xkSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBPcElkeCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgU3ViUmVnSWR4ID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgYXNzZXJ0KE91dE1Jc1tOZXdJbnNuSURdICYmICJBdHRlbXB0ZWQgdG8gYWRkIHRvIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiIpOworICAgICAgT3V0TUlzW05ld0luc25JRF0uYWRkUmVnKFN0YXRlLk1Jc1tPbGRJbnNuSURdLT5nZXRPcGVyYW5kKE9wSWR4KS5nZXRSZWcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTdWJSZWdJZHgpOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSVJfQ29weVN1YlJlZyhPdXRNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBOZXdJbnNuSUQgPDwgIl0sIE1Jc1siIDw8IE9sZEluc25JRCA8PCAiXSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBPcElkeCA8PCAiLCAiIDw8IFN1YlJlZ0lkeCA8PCAiKVxuIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJUl9BZGRJbXBsaWNpdERlZjogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IFJlZ051bSA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGFzc2VydChPdXRNSXNbSW5zbklEXSAmJiAiQXR0ZW1wdGVkIHRvIGFkZCB0byB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24iKTsKKyAgICAgIE91dE1Jc1tJbnNuSURdLmFkZERlZihSZWdOdW0sIFJlZ1N0YXRlOjpJbXBsaWNpdCk7CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJUl9BZGRJbXBsaWNpdERlZihPdXRNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJbnNuSUQgPDwgIl0sICIgPDwgUmVnTnVtIDw8ICIpXG4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lSX0FkZEltcGxpY2l0VXNlOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgUmVnTnVtID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgYXNzZXJ0KE91dE1Jc1tJbnNuSURdICYmICJBdHRlbXB0ZWQgdG8gYWRkIHRvIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiIpOworICAgICAgT3V0TUlzW0luc25JRF0uYWRkVXNlKFJlZ051bSwgUmVnU3RhdGU6OkltcGxpY2l0KTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lSX0FkZEltcGxpY2l0VXNlKE91dE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXSwgIiA8PCBSZWdOdW0gPDwgIilcbiIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSVJfQWRkUmVnaXN0ZXI6IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBSZWdOdW0gPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBhc3NlcnQoT3V0TUlzW0luc25JRF0gJiYgIkF0dGVtcHRlZCB0byBhZGQgdG8gdW5kZWZpbmVkIGluc3RydWN0aW9uIik7CisgICAgICBPdXRNSXNbSW5zbklEXS5hZGRSZWcoUmVnTnVtKTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lSX0FkZFJlZ2lzdGVyKE91dE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXSwgIiA8PCBSZWdOdW0gPDwgIilcbiIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSVJfQWRkVGVtcFJlZ2lzdGVyOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgVGVtcFJlZ0lEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgdWludDY0X3QgVGVtcFJlZ0ZsYWdzID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgYXNzZXJ0KE91dE1Jc1tJbnNuSURdICYmICJBdHRlbXB0ZWQgdG8gYWRkIHRvIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiIpOworICAgICAgT3V0TUlzW0luc25JRF0uYWRkUmVnKFN0YXRlLlRlbXBSZWdpc3RlcnNbVGVtcFJlZ0lEXSwgVGVtcFJlZ0ZsYWdzKTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lSX0FkZFRlbXBSZWdpc3RlcihPdXRNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJbnNuSUQgPDwgIl0sIFRlbXBSZWdpc3RlcnNbIiA8PCBUZW1wUmVnSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIl0sICIgPDwgVGVtcFJlZ0ZsYWdzIDw8ICIpXG4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lSX0FkZEltbTogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IEltbSA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGFzc2VydChPdXRNSXNbSW5zbklEXSAmJiAiQXR0ZW1wdGVkIHRvIGFkZCB0byB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24iKTsKKyAgICAgIE91dE1Jc1tJbnNuSURdLmFkZEltbShJbW0pOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSVJfQWRkSW1tKE91dE1Jc1siIDw8IEluc25JRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXSwgIiA8PCBJbW0gPDwgIilcbiIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSVJfQ29tcGxleFJlbmRlcmVyOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgUmVuZGVyZXJJRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGFzc2VydChPdXRNSXNbSW5zbklEXSAmJiAiQXR0ZW1wdGVkIHRvIGFkZCB0byB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24iKTsKKyAgICAgIGZvciAoY29uc3QgYXV0byAmUmVuZGVyT3BGbiA6IFN0YXRlLlJlbmRlcmVyc1tSZW5kZXJlcklEXSkKKyAgICAgICAgUmVuZGVyT3BGbihPdXRNSXNbSW5zbklEXSk7CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJUl9Db21wbGV4UmVuZGVyZXIoT3V0TUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5zbklEIDw8ICJdLCAiIDw8IFJlbmRlcmVySUQgPDwgIilcbiIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR0lSX0NvbXBsZXhTdWJPcGVyYW5kUmVuZGVyZXI6IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBSZW5kZXJlcklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBSZW5kZXJPcElEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgYXNzZXJ0KE91dE1Jc1tJbnNuSURdICYmICJBdHRlbXB0ZWQgdG8gYWRkIHRvIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiIpOworICAgICAgU3RhdGUuUmVuZGVyZXJzW1JlbmRlcmVySURdW1JlbmRlck9wSURdKE91dE1Jc1tJbnNuSURdKTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjogR0lSX0NvbXBsZXhTdWJPcGVyYW5kUmVuZGVyZXIoT3V0TUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5zbklEIDw8ICJdLCAiIDw8IFJlbmRlcmVySUQgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBSZW5kZXJPcElEIDw8ICIpXG4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lSX0NvcHlDb25zdGFudEFzU0ltbTogeworICAgICAgaW50NjRfdCBOZXdJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IE9sZEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGFzc2VydChPdXRNSXNbTmV3SW5zbklEXSAmJiAiQXR0ZW1wdGVkIHRvIGFkZCB0byB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24iKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbT2xkSW5zbklEXS0+Z2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpHX0NPTlNUQU5UICYmICJFeHBlY3RlZCBHX0NPTlNUQU5UIik7CisgICAgICBpZiAoU3RhdGUuTUlzW09sZEluc25JRF0tPmdldE9wZXJhbmQoMSkuaXNDSW1tKCkpIHsKKyAgICAgICAgT3V0TUlzW05ld0luc25JRF0uYWRkSW1tKAorICAgICAgICAgICAgU3RhdGUuTUlzW09sZEluc25JRF0tPmdldE9wZXJhbmQoMSkuZ2V0Q0ltbSgpLT5nZXRTRXh0VmFsdWUoKSk7CisgICAgICB9IGVsc2UgaWYgKFN0YXRlLk1Jc1tPbGRJbnNuSURdLT5nZXRPcGVyYW5kKDEpLmlzSW1tKCkpCisgICAgICAgIE91dE1Jc1tOZXdJbnNuSURdLmFkZChTdGF0ZS5NSXNbT2xkSW5zbklEXS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgICBlbHNlCisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkV4cGVjdGVkIEltbSBvciBDSW1tIG9wZXJhbmQiKTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lSX0NvcHlDb25zdGFudEFzU0ltbShPdXRNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBOZXdJbnNuSUQgPDwgIl0sIE1Jc1siIDw8IE9sZEluc25JRCA8PCAiXSlcbiIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSVJfQ3VzdG9tUmVuZGVyZXI6IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBPbGRJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IFJlbmRlcmVyRm5JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGFzc2VydChPdXRNSXNbSW5zbklEXSAmJiAiQXR0ZW1wdGVkIHRvIGFkZCB0byB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24iKTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lSX0N1c3RvbVJlbmRlcmVyKE91dE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXSwgTUlzWyIgPDwgT2xkSW5zbklEIDw8ICJdLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFJlbmRlcmVyRm5JRCA8PCAiKVxuIik7CisgICAgICAoSVNlbC4qSVNlbEluZm8uQ3VzdG9tUmVuZGVyZXJzW1JlbmRlcmVyRm5JRF0pKE91dE1Jc1tJbnNuSURdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU3RhdGUuTUlzW09sZEluc25JRF0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR0lSX0NvbnN0cmFpbk9wZXJhbmRSQzogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IE9wSWR4ID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBSQ0VudW0gPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBhc3NlcnQoT3V0TUlzW0luc25JRF0gJiYgIkF0dGVtcHRlZCB0byBhZGQgdG8gdW5kZWZpbmVkIGluc3RydWN0aW9uIik7CisgICAgICBjb25zdHJhaW5PcGVyYW5kUmVnVG9SZWdDbGFzcygqT3V0TUlzW0luc25JRF0uZ2V0SW5zdHIoKSwgT3BJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVFJJLmdldFJlZ0NsYXNzKFJDRW51bSksIFRJSSwgVFJJLCBSQkkpOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSVJfQ29uc3RyYWluT3BlcmFuZFJDKE91dE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXSwgIiA8PCBPcElkeCA8PCAiLCAiIDw8IFJDRW51bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKVxuIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJUl9Db25zdHJhaW5TZWxlY3RlZEluc3RPcGVyYW5kczogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBhc3NlcnQoT3V0TUlzW0luc25JRF0gJiYgIkF0dGVtcHRlZCB0byBhZGQgdG8gdW5kZWZpbmVkIGluc3RydWN0aW9uIik7CisgICAgICBjb25zdHJhaW5TZWxlY3RlZEluc3RSZWdPcGVyYW5kcygqT3V0TUlzW0luc25JRF0uZ2V0SW5zdHIoKSwgVElJLCBUUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQkkpOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBHSVJfQ29uc3RyYWluU2VsZWN0ZWRJbnN0T3BlcmFuZHMoT3V0TUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5zbklEIDw8ICJdKVxuIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJUl9NZXJnZU1lbU9wZXJhbmRzOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGFzc2VydChPdXRNSXNbSW5zbklEXSAmJiAiQXR0ZW1wdGVkIHRvIGFkZCB0byB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24iKTsKKworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSVJfTWVyZ2VNZW1PcGVyYW5kcyhPdXRNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJbnNuSUQgPDwgIl0iKTsKKyAgICAgIGludDY0X3QgTWVyZ2VJbnNuSUQgPSBHSVVfTWVyZ2VNZW1PcGVyYW5kc19FbmRPZkxpc3Q7CisgICAgICB3aGlsZSAoKE1lcmdlSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdKSAhPQorICAgICAgICAgICAgIEdJVV9NZXJnZU1lbU9wZXJhbmRzX0VuZE9mTGlzdCkgeworICAgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8ICIsIE1Jc1siIDw8IE1lcmdlSW5zbklEIDw8ICJdIik7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmTU1PIDogU3RhdGUuTUlzW01lcmdlSW5zbklEXS0+bWVtb3BlcmFuZHMoKSkKKyAgICAgICAgICBPdXRNSXNbSW5zbklEXS5hZGRNZW1PcGVyYW5kKE1NTyk7CisgICAgICB9CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLCBkYmdzKCkgPDwgIilcbiIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSVJfRXJhc2VGcm9tUGFyZW50OiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXSAmJgorICAgICAgICAgICAgICJBdHRlbXB0ZWQgdG8gZXJhc2UgYW4gdW5kZWZpbmVkIGluc3RydWN0aW9uIik7CisgICAgICBTdGF0ZS5NSXNbSW5zbklEXS0+ZXJhc2VGcm9tUGFyZW50KCk7CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJUl9FcmFzZUZyb21QYXJlbnQoTUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5zbklEIDw8ICJdKVxuIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJUl9NYWtlVGVtcFJlZzogeworICAgICAgaW50NjRfdCBUZW1wUmVnSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IFR5cGVJRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKworICAgICAgU3RhdGUuVGVtcFJlZ2lzdGVyc1tUZW1wUmVnSURdID0KKyAgICAgICAgICBNUkkuY3JlYXRlR2VuZXJpY1ZpcnR1YWxSZWdpc3RlcihJU2VsSW5mby5UeXBlT2JqZWN0c1tUeXBlSURdKTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogVGVtcFJlZ3NbIiA8PCBUZW1wUmVnSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIl0gPSBHSVJfTWFrZVRlbXBSZWcoIiA8PCBUeXBlSUQgPDwgIilcbiIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSVJfQ292ZXJhZ2U6IHsKKyAgICAgIGludDY0X3QgUnVsZUlEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgQ292ZXJhZ2VJbmZvLnNldENvdmVyZWQoUnVsZUlEKTsKKworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgQ3VycmVudElkeCA8PCAiOiBHSVJfQ292ZXJhZ2UoIiA8PCBSdWxlSUQgPDwgIikiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lSX0RvbmU6CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJUl9Eb25lIik7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGRlZmF1bHQ6CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIGNvbW1hbmQiKTsKKyAgICB9CisgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0lOU1RSVUNUSU9OU0VMRUNUT1JJTVBMX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0xlZ2FsaXphdGlvbkFydGlmYWN0Q29tYmluZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0xlZ2FsaXphdGlvbkFydGlmYWN0Q29tYmluZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWY1NjRiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTGVnYWxpemF0aW9uQXJ0aWZhY3RDb21iaW5lci5oCkBAIC0wLDAgKzEsMjg3IEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0xlZ2FsaXphdGlvbkFydGlmYWN0Q29tYmluZXIuaCAtLT09PT09PT09PT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGhlbHBlciBmdW5jdGlvbnMgd2hpY2ggdHJ5IHRvIGNsZWFudXAgYXJ0aWZhY3RzCisvLyBzdWNoIGFzIEdfVFJVTkNzL0dfW1pTQV1FWFRFTkRTIHRoYXQgd2VyZSBjcmVhdGVkIGR1cmluZyBsZWdhbGl6YXRpb24gdG8gbWFrZQorLy8gdGhlIHR5cGVzIG1hdGNoLiBUaGlzIGZpbGUgYWxzbyBjb250YWlucyBzb21lIGNvbWJpbmVzIG9mIG1lcmdlcyB0aGF0IGhhcHBlbnMKKy8vIGF0IHRoZSBlbmQgb2YgdGhlIGxlZ2FsaXphdGlvbi4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9MZWdhbGl6ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9MZWdhbGl6ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTWFjaGluZUlSQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1V0aWxzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKworI2RlZmluZSBERUJVR19UWVBFICJsZWdhbGl6ZXIiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIExlZ2FsaXphdGlvbkFydGlmYWN0Q29tYmluZXIgeworICBNYWNoaW5lSVJCdWlsZGVyICZCdWlsZGVyOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkk7CisgIGNvbnN0IExlZ2FsaXplckluZm8gJkxJOworCitwdWJsaWM6CisgIExlZ2FsaXphdGlvbkFydGlmYWN0Q29tYmluZXIoTWFjaGluZUlSQnVpbGRlciAmQiwgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBMZWdhbGl6ZXJJbmZvICZMSSkKKyAgICAgIDogQnVpbGRlcihCKSwgTVJJKE1SSSksIExJKExJKSB7fQorCisgIGJvb2wgdHJ5Q29tYmluZUFueUV4dChNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0ciAqPiAmRGVhZEluc3RzKSB7CisgICAgaWYgKE1JLmdldE9wY29kZSgpICE9IFRhcmdldE9wY29kZTo6R19BTllFWFQpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKE1hY2hpbmVJbnN0ciAqRGVmTUkgPSBnZXRPcGNvZGVEZWYoVGFyZ2V0T3Bjb2RlOjpHX1RSVU5DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JLmdldE9wZXJhbmQoMSkuZ2V0UmVnKCksIE1SSSkpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiLi4gQ29tYmluZSBNSTogIiA8PCBNSTspOworICAgICAgdW5zaWduZWQgRHN0UmVnID0gTUkuZ2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICAgIHVuc2lnbmVkIFNyY1JlZyA9IERlZk1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICAgICAgQnVpbGRlci5zZXRJbnN0cihNSSk7CisgICAgICAvLyBXZSBnZXQgYSBjb3B5L3RydW5jL2V4dGVuZCBkZXBlbmRpbmcgb24gdGhlIHNpemVzCisgICAgICBCdWlsZGVyLmJ1aWxkQW55RXh0T3JUcnVuYyhEc3RSZWcsIFNyY1JlZyk7CisgICAgICBtYXJrSW5zdEFuZERlZkRlYWQoTUksICpEZWZNSSwgRGVhZEluc3RzKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gdHJ5Rm9sZEltcGxpY2l0RGVmKE1JLCBEZWFkSW5zdHMpOworICB9CisKKyAgYm9vbCB0cnlDb21iaW5lWkV4dChNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIgKj4gJkRlYWRJbnN0cykgeworCisgICAgaWYgKE1JLmdldE9wY29kZSgpICE9IFRhcmdldE9wY29kZTo6R19aRVhUKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChNYWNoaW5lSW5zdHIgKkRlZk1JID0gZ2V0T3Bjb2RlRGVmKFRhcmdldE9wY29kZTo6R19UUlVOQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSS5nZXRPcGVyYW5kKDEpLmdldFJlZygpLCBNUkkpKSB7CisgICAgICB1bnNpZ25lZCBEc3RSZWcgPSBNSS5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgICAgTExUIERzdFR5ID0gTVJJLmdldFR5cGUoRHN0UmVnKTsKKyAgICAgIGlmIChpc0luc3RVbnN1cHBvcnRlZCh7VGFyZ2V0T3Bjb2RlOjpHX0FORCwge0RzdFR5fX0pIHx8CisgICAgICAgICAgaXNJbnN0VW5zdXBwb3J0ZWQoe1RhcmdldE9wY29kZTo6R19DT05TVEFOVCwge0RzdFR5fX0pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIi4uIENvbWJpbmUgTUk6ICIgPDwgTUk7KTsKKyAgICAgIEJ1aWxkZXIuc2V0SW5zdHIoTUkpOworICAgICAgdW5zaWduZWQgWkV4dFNyYyA9IE1JLmdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgICAgICBMTFQgWkV4dFNyY1R5ID0gTVJJLmdldFR5cGUoWkV4dFNyYyk7CisgICAgICBBUEludCBNYXNrID0gQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShaRXh0U3JjVHkuZ2V0U2l6ZUluQml0cygpKTsKKyAgICAgIGF1dG8gTWFza0NzdE1JQiA9IEJ1aWxkZXIuYnVpbGRDb25zdGFudChEc3RUeSwgTWFzay5nZXRaRXh0VmFsdWUoKSk7CisgICAgICB1bnNpZ25lZCBUcnVuY1NyYyA9IERlZk1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICAgICAgLy8gV2UgZ2V0IGEgY29weS90cnVuYy9leHRlbmQgZGVwZW5kaW5nIG9uIHRoZSBzaXplcworICAgICAgYXV0byBTcmNDb3B5T3JUcnVuYyA9IEJ1aWxkZXIuYnVpbGRBbnlFeHRPclRydW5jKERzdFR5LCBUcnVuY1NyYyk7CisgICAgICBCdWlsZGVyLmJ1aWxkQW5kKERzdFJlZywgU3JjQ29weU9yVHJ1bmMsIE1hc2tDc3RNSUIpOworICAgICAgbWFya0luc3RBbmREZWZEZWFkKE1JLCAqRGVmTUksIERlYWRJbnN0cyk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHRyeUZvbGRJbXBsaWNpdERlZihNSSwgRGVhZEluc3RzKTsKKyAgfQorCisgIGJvb2wgdHJ5Q29tYmluZVNFeHQoTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyICo+ICZEZWFkSW5zdHMpIHsKKworICAgIGlmIChNSS5nZXRPcGNvZGUoKSAhPSBUYXJnZXRPcGNvZGU6OkdfU0VYVCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoTWFjaGluZUluc3RyICpEZWZNSSA9IGdldE9wY29kZURlZihUYXJnZXRPcGNvZGU6OkdfVFJVTkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUkuZ2V0T3BlcmFuZCgxKS5nZXRSZWcoKSwgTVJJKSkgeworICAgICAgdW5zaWduZWQgRHN0UmVnID0gTUkuZ2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICAgIExMVCBEc3RUeSA9IE1SSS5nZXRUeXBlKERzdFJlZyk7CisgICAgICBpZiAoaXNJbnN0VW5zdXBwb3J0ZWQoe1RhcmdldE9wY29kZTo6R19TSEwsIHtEc3RUeX19KSB8fAorICAgICAgICAgIGlzSW5zdFVuc3VwcG9ydGVkKHtUYXJnZXRPcGNvZGU6OkdfQVNIUiwge0RzdFR5fX0pIHx8CisgICAgICAgICAgaXNJbnN0VW5zdXBwb3J0ZWQoe1RhcmdldE9wY29kZTo6R19DT05TVEFOVCwge0RzdFR5fX0pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIi4uIENvbWJpbmUgTUk6ICIgPDwgTUk7KTsKKyAgICAgIEJ1aWxkZXIuc2V0SW5zdHIoTUkpOworICAgICAgdW5zaWduZWQgU0V4dFNyYyA9IE1JLmdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgICAgICBMTFQgU0V4dFNyY1R5ID0gTVJJLmdldFR5cGUoU0V4dFNyYyk7CisgICAgICB1bnNpZ25lZCBTaXplRGlmZiA9IERzdFR5LmdldFNpemVJbkJpdHMoKSAtIFNFeHRTcmNUeS5nZXRTaXplSW5CaXRzKCk7CisgICAgICBhdXRvIFNpemVEaWZmTUlCID0gQnVpbGRlci5idWlsZENvbnN0YW50KERzdFR5LCBTaXplRGlmZik7CisgICAgICB1bnNpZ25lZCBUcnVuY1NyY1JlZyA9IERlZk1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICAgICAgLy8gV2UgZ2V0IGEgY29weS90cnVuYy9leHRlbmQgZGVwZW5kaW5nIG9uIHRoZSBzaXplcworICAgICAgYXV0byBTcmNDb3B5RXh0T3JUcnVuYyA9IEJ1aWxkZXIuYnVpbGRBbnlFeHRPclRydW5jKERzdFR5LCBUcnVuY1NyY1JlZyk7CisgICAgICBhdXRvIFNobE1JQiA9IEJ1aWxkZXIuYnVpbGRJbnN0cihUYXJnZXRPcGNvZGU6OkdfU0hMLCBEc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY0NvcHlFeHRPclRydW5jLCBTaXplRGlmZk1JQik7CisgICAgICBCdWlsZGVyLmJ1aWxkSW5zdHIoVGFyZ2V0T3Bjb2RlOjpHX0FTSFIsIERzdFJlZywgU2hsTUlCLCBTaXplRGlmZk1JQik7CisgICAgICBtYXJrSW5zdEFuZERlZkRlYWQoTUksICpEZWZNSSwgRGVhZEluc3RzKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gdHJ5Rm9sZEltcGxpY2l0RGVmKE1JLCBEZWFkSW5zdHMpOworICB9CisKKyAgLy8vIFRyeSB0byBmb2xkIHNiID0gRVhURU5EIChHX0lNUExJQ0lUX0RFRiBzYSkgLT4gc2IgPSBHX0lNUExJQ0lUX0RFRgorICBib29sIHRyeUZvbGRJbXBsaWNpdERlZihNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyICo+ICZEZWFkSW5zdHMpIHsKKyAgICB1bnNpZ25lZCBPcGNvZGUgPSBNSS5nZXRPcGNvZGUoKTsKKyAgICBpZiAoT3Bjb2RlICE9IFRhcmdldE9wY29kZTo6R19BTllFWFQgJiYgT3Bjb2RlICE9IFRhcmdldE9wY29kZTo6R19aRVhUICYmCisgICAgICAgIE9wY29kZSAhPSBUYXJnZXRPcGNvZGU6OkdfU0VYVCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChNYWNoaW5lSW5zdHIgKkRlZk1JID0gZ2V0T3Bjb2RlRGVmKFRhcmdldE9wY29kZTo6R19JTVBMSUNJVF9ERUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUkuZ2V0T3BlcmFuZCgxKS5nZXRSZWcoKSwgTVJJKSkgeworICAgICAgdW5zaWduZWQgRHN0UmVnID0gTUkuZ2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgICAgIExMVCBEc3RUeSA9IE1SSS5nZXRUeXBlKERzdFJlZyk7CisgICAgICBpZiAoaXNJbnN0VW5zdXBwb3J0ZWQoe1RhcmdldE9wY29kZTo6R19JTVBMSUNJVF9ERUYsIHtEc3RUeX19KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgREVCVUcoZGJncygpIDw8ICIuLiBDb21iaW5lIEVYVChJTVBMSUNJVF9ERUYpICIgPDwgTUk7KTsKKyAgICAgIEJ1aWxkZXIuc2V0SW5zdHIoTUkpOworICAgICAgQnVpbGRlci5idWlsZEluc3RyKFRhcmdldE9wY29kZTo6R19JTVBMSUNJVF9ERUYsIERzdFJlZyk7CisgICAgICBtYXJrSW5zdEFuZERlZkRlYWQoTUksICpEZWZNSSwgRGVhZEluc3RzKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIHRyeUNvbWJpbmVNZXJnZXMoTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIgKj4gJkRlYWRJbnN0cykgeworCisgICAgaWYgKE1JLmdldE9wY29kZSgpICE9IFRhcmdldE9wY29kZTo6R19VTk1FUkdFX1ZBTFVFUykKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIE51bURlZnMgPSBNSS5nZXROdW1PcGVyYW5kcygpIC0gMTsKKyAgICB1bnNpZ25lZCBTcmNSZWcgPSBNSS5nZXRPcGVyYW5kKE51bURlZnMpLmdldFJlZygpOworICAgIE1hY2hpbmVJbnN0ciAqTWVyZ2VJID0gTVJJLmdldFZSZWdEZWYoU3JjUmVnKTsKKyAgICBpZiAoIU1lcmdlSSB8fCAoTWVyZ2VJLT5nZXRPcGNvZGUoKSAhPSBUYXJnZXRPcGNvZGU6OkdfTUVSR0VfVkFMVUVTKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IHVuc2lnbmVkIE51bU1lcmdlUmVncyA9IE1lcmdlSS0+Z2V0TnVtT3BlcmFuZHMoKSAtIDE7CisKKyAgICBpZiAoTnVtTWVyZ2VSZWdzIDwgTnVtRGVmcykgeworICAgICAgaWYgKE51bURlZnMgJSBOdW1NZXJnZVJlZ3MgIT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBCdWlsZGVyLnNldEluc3RyKE1JKTsKKyAgICAgIC8vIFRyYW5zZm9ybSB0byBVTk1FUkdFcywgZm9yIGV4YW1wbGUKKyAgICAgIC8vICAgJTEgPSBHX01FUkdFX1ZBTFVFUyAlNCwgJTUKKyAgICAgIC8vICAgJTksICUxMCwgJTExLCAlMTIgPSBHX1VOTUVSR0VfVkFMVUVTICUxCisgICAgICAvLyB0bworICAgICAgLy8gICAlOSwgJTEwID0gR19VTk1FUkdFX1ZBTFVFUyAlNAorICAgICAgLy8gICAlMTEsICUxMiA9IEdfVU5NRVJHRV9WQUxVRVMgJTUKKworICAgICAgY29uc3QgdW5zaWduZWQgTmV3TnVtRGVmcyA9IE51bURlZnMgLyBOdW1NZXJnZVJlZ3M7CisgICAgICBmb3IgKHVuc2lnbmVkIElkeCA9IDA7IElkeCA8IE51bU1lcmdlUmVnczsgKytJZHgpIHsKKyAgICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDI+IERzdFJlZ3M7CisgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDAsIERlZklkeCA9IElkeCAqIE5ld051bURlZnM7IGogPCBOZXdOdW1EZWZzOworICAgICAgICAgICAgICsraiwgKytEZWZJZHgpCisgICAgICAgICAgRHN0UmVncy5wdXNoX2JhY2soTUkuZ2V0T3BlcmFuZChEZWZJZHgpLmdldFJlZygpKTsKKworICAgICAgICBCdWlsZGVyLmJ1aWxkVW5tZXJnZShEc3RSZWdzLCBNZXJnZUktPmdldE9wZXJhbmQoSWR4ICsgMSkuZ2V0UmVnKCkpOworICAgICAgfQorCisgICAgfSBlbHNlIGlmIChOdW1NZXJnZVJlZ3MgPiBOdW1EZWZzKSB7CisgICAgICBpZiAoTnVtTWVyZ2VSZWdzICUgTnVtRGVmcyAhPSAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIEJ1aWxkZXIuc2V0SW5zdHIoTUkpOworICAgICAgLy8gVHJhbnNmb3JtIHRvIE1FUkdFcworICAgICAgLy8gICAlNiA9IEdfTUVSR0VfVkFMVUVTICUxNywgJTE4LCAlMTksICUyMAorICAgICAgLy8gICAlNywgJTggPSBHX1VOTUVSR0VfVkFMVUVTICU2CisgICAgICAvLyB0bworICAgICAgLy8gICAlNyA9IEdfTUVSR0VfVkFMVUVTICUxNywgJTE4CisgICAgICAvLyAgICU4ID0gR19NRVJHRV9WQUxVRVMgJTE5LCAlMjAKKworICAgICAgY29uc3QgdW5zaWduZWQgTnVtUmVncyA9IE51bU1lcmdlUmVncyAvIE51bURlZnM7CisgICAgICBmb3IgKHVuc2lnbmVkIERlZklkeCA9IDA7IERlZklkeCA8IE51bURlZnM7ICsrRGVmSWR4KSB7CisgICAgICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAyPiBSZWdzOworICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwLCBJZHggPSBOdW1SZWdzICogRGVmSWR4ICsgMTsgaiA8IE51bVJlZ3M7CisgICAgICAgICAgICAgKytqLCArK0lkeCkKKyAgICAgICAgICBSZWdzLnB1c2hfYmFjayhNZXJnZUktPmdldE9wZXJhbmQoSWR4KS5nZXRSZWcoKSk7CisKKyAgICAgICAgQnVpbGRlci5idWlsZE1lcmdlKE1JLmdldE9wZXJhbmQoRGVmSWR4KS5nZXRSZWcoKSwgUmVncyk7CisgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgLy8gRklYTUU6IGlzIGEgQ09QWSBhcHByb3ByaWF0ZSBpZiB0aGUgdHlwZXMgbWlzbWF0Y2g/IFdlIGtub3cgYm90aAorICAgICAgLy8gcmVnaXN0ZXJzIGFyZSBhbGxvY2F0YWJsZSBieSBub3cuCisgICAgICBpZiAoTVJJLmdldFR5cGUoTUkuZ2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkgIT0KKyAgICAgICAgICBNUkkuZ2V0VHlwZShNZXJnZUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGZvciAodW5zaWduZWQgSWR4ID0gMDsgSWR4IDwgTnVtRGVmczsgKytJZHgpCisgICAgICAgIE1SSS5yZXBsYWNlUmVnV2l0aChNSS5nZXRPcGVyYW5kKElkeCkuZ2V0UmVnKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXJnZUktPmdldE9wZXJhbmQoSWR4ICsgMSkuZ2V0UmVnKCkpOworICAgIH0KKworICAgIG1hcmtJbnN0QW5kRGVmRGVhZChNSSwgKk1lcmdlSSwgRGVhZEluc3RzKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBUcnkgdG8gY29tYmluZSBhd2F5IE1JLgorICAvLy8gUmV0dXJucyB0cnVlIGlmIGl0IGNvbWJpbmVkIGF3YXkgdGhlIE1JLgorICAvLy8gQWRkcyBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgZGVhZCBhcyBhIHJlc3VsdCBvZiB0aGUgY29tYmluZQorICAvLy8gaW50byBEZWFkSW5zdHMsIHdoaWNoIGNhbiBpbmNsdWRlIE1JLgorICBib29sIHRyeUNvbWJpbmVJbnN0cnVjdGlvbihNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyICo+ICZEZWFkSW5zdHMpIHsKKyAgICBzd2l0Y2ggKE1JLmdldE9wY29kZSgpKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6R19BTllFWFQ6CisgICAgICByZXR1cm4gdHJ5Q29tYmluZUFueUV4dChNSSwgRGVhZEluc3RzKTsKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6R19aRVhUOgorICAgICAgcmV0dXJuIHRyeUNvbWJpbmVaRXh0KE1JLCBEZWFkSW5zdHMpOworICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpHX1NFWFQ6CisgICAgICByZXR1cm4gdHJ5Q29tYmluZVNFeHQoTUksIERlYWRJbnN0cyk7CisgICAgY2FzZSBUYXJnZXRPcGNvZGU6OkdfVU5NRVJHRV9WQUxVRVM6CisgICAgICByZXR1cm4gdHJ5Q29tYmluZU1lcmdlcyhNSSwgRGVhZEluc3RzKTsKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6R19UUlVOQzogeworICAgICAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgICAgICBmb3IgKGF1dG8gJlVzZSA6IE1SSS51c2VfaW5zdHJ1Y3Rpb25zKE1JLmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkpKQorICAgICAgICBDaGFuZ2VkIHw9IHRyeUNvbWJpbmVJbnN0cnVjdGlvbihVc2UsIERlYWRJbnN0cyk7CisgICAgICByZXR1cm4gQ2hhbmdlZDsKKyAgICB9CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIC8vLyBNYXJrIE1JIGFzIGRlYWQuIElmIGEgZGVmIG9mIG9uZSBvZiBNSSdzIG9wZXJhbmRzLCBEZWZNSSwgd291bGQgYWxzbyBiZQorICAvLy8gZGVhZCBkdWUgdG8gTUkgYmVpbmcga2lsbGVkLCB0aGVuIG1hcmsgRGVmTUkgYXMgZGVhZCB0b28uCisgIC8vLyBTb21lIG9mIHRoZSBjb21iaW5lcyAoZXh0ZW5kcyh0cnVuYykpLCB0cnkgdG8gd2FsayB0aHJvdWdoIHJlZHVuZGFudAorICAvLy8gY29waWVzIGluIGJldHdlZW4gdGhlIGV4dGVuZHMgYW5kIHRoZSB0cnVuY3MsIGFuZCB0aGlzIGF0dGVtcHRzIHRvIGNvbGxlY3QKKyAgLy8vIHRoZSBpbiBiZXR3ZWVuIGNvcGllcyBpZiB0aGV5J3JlIGRlYWQuCisgIHZvaWQgbWFya0luc3RBbmREZWZEZWFkKE1hY2hpbmVJbnN0ciAmTUksIE1hY2hpbmVJbnN0ciAmRGVmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIgKj4gJkRlYWRJbnN0cykgeworICAgIERlYWRJbnN0cy5wdXNoX2JhY2soJk1JKTsKKworICAgIC8vIENvbGxlY3QgYWxsIHRoZSBjb3B5IGluc3RydWN0aW9ucyB0aGF0IGFyZSBtYWRlIGRlYWQsIGR1ZSB0byBkZWxldGluZworICAgIC8vIHRoaXMgaW5zdHJ1Y3Rpb24uIENvbGxlY3QgYWxsIG9mIHRoZW0gdW50aWwgdGhlIFRydW5jKERlZk1JKS4KKyAgICAvLyBFZywKKyAgICAvLyAlMShzMSkgPSBHX1RSVU5DICUwKHMzMikKKyAgICAvLyAlMihzMSkgPSBDT1BZICUxKHMxKQorICAgIC8vICUzKHMxKSA9IENPUFkgJTIoczEpCisgICAgLy8gJTQoczMyKSA9IEdfQU5ZRVhUICUzKHMxKQorICAgIC8vIEluIHRoaXMgY2FzZSwgd2Ugd291bGQgaGF2ZSByZXBsYWNlZCAlNCB3aXRoIGEgY29weSBvZiAlMCwKKyAgICAvLyBhbmQgYXMgYSByZXN1bHQsICUzLCAlMiwgJTEgYXJlIGRlYWQuCisgICAgTWFjaGluZUluc3RyICpQcmV2TUkgPSAmTUk7CisgICAgd2hpbGUgKFByZXZNSSAhPSAmRGVmTUkpIHsKKyAgICAgIC8vIElmIHdlJ3JlIGRlYWxpbmcgd2l0aCBHX1VOTUVSR0VfVkFMVUVTLCB0cnlDb21iaW5lTWVyZ2VzIGRvZXNuJ3QgcmVhbGx5IHRyeQorICAgICAgLy8gdG8gZm9sZCBjb3BpZXMgaW4gYmV0d2VlbiBhbmQgd2UgY2FuIGlnbm9yZSB0aGVtIGhlcmUuCisgICAgICBpZiAoUHJldk1JLT5nZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OkdfVU5NRVJHRV9WQUxVRVMpCisgICAgICAgIGJyZWFrOworICAgICAgdW5zaWduZWQgUHJldlJlZ1NyYyA9IFByZXZNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgICAgIE1hY2hpbmVJbnN0ciAqVG1wRGVmID0gTVJJLmdldFZSZWdEZWYoUHJldlJlZ1NyYyk7CisgICAgICBpZiAoTVJJLmhhc09uZVVzZShQcmV2UmVnU3JjKSkgeworICAgICAgICBpZiAoVG1wRGVmICE9ICZEZWZNSSkgeworICAgICAgICAgIGFzc2VydChUbXBEZWYtPmdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6Q09QWSAmJgorICAgICAgICAgICAgICAgICAiRXhwZWN0aW5nIGNvcHkgaGVyZSIpOworICAgICAgICAgIERlYWRJbnN0cy5wdXNoX2JhY2soVG1wRGVmKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlCisgICAgICAgIGJyZWFrOworICAgICAgUHJldk1JID0gVG1wRGVmOworICAgIH0KKyAgICBpZiAoKFByZXZNSSA9PSAmRGVmTUkgfHwKKyAgICAgICAgIERlZk1JLmdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6R19NRVJHRV9WQUxVRVMpICYmCisgICAgICAgIE1SSS5oYXNPbmVVc2UoRGVmTUkuZ2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkpCisgICAgICBEZWFkSW5zdHMucHVzaF9iYWNrKCZEZWZNSSk7CisgIH0KKworICAvLy8gQ2hlY2tzIGlmIHRoZSB0YXJnZXQgbGVnYWxpemVyIGluZm8gaGFzIHNwZWNpZmllZCBhbnl0aGluZyBhYm91dCB0aGUKKyAgLy8vIGluc3RydWN0aW9uLCBvciBpZiB1bnN1cHBvcnRlZC4KKyAgYm9vbCBpc0luc3RVbnN1cHBvcnRlZChjb25zdCBMZWdhbGl0eVF1ZXJ5ICZRdWVyeSkgY29uc3QgeworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl6ZUFjdGlvbnM7CisgICAgYXV0byBTdGVwID0gTEkuZ2V0QWN0aW9uKFF1ZXJ5KTsKKyAgICByZXR1cm4gU3RlcC5BY3Rpb24gPT0gVW5zdXBwb3J0ZWQgfHwgU3RlcC5BY3Rpb24gPT0gTm90Rm91bmQ7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0xlZ2FsaXplci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTGVnYWxpemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI4NGFiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0xlZ2FsaXplci5oCkBAIC0wLDAgKzEsNjUgQEAKKy8vPT0gbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTGVnYWxpemVQYXNzLmggLS0tLS0tLS0tLS0tLSAtKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUgQSBwYXNzIHRvIGNvbnZlcnQgdGhlIHRhcmdldC1pbGxlZ2FsIG9wZXJhdGlvbnMgY3JlYXRlZCBieSBJUiAtPiBNSVIKKy8vLyB0cmFuc2xhdGlvbiBpbnRvIG9uZXMgdGhlIHRhcmdldCBleHBlY3RzIHRvIGJlIGFibGUgdG8gc2VsZWN0LiBUaGlzIG1heQorLy8vIG9jY3VyIGluIG11bHRpcGxlIHBoYXNlcywgZm9yIGV4YW1wbGUgR19BREQgPDIgeCBpOD4gLT4gR19BREQgPDIgeCBpMTY+IC0+CisvLy8gR19BREQgPDQgeCBpMTY+LgorLy8vCisvLy8gVGhlIExlZ2FsaXplSGVscGVyIGNsYXNzIGlzIHdoZXJlIG1vc3Qgb2YgdGhlIHdvcmsgaGFwcGVucywgYW5kIGlzIGRlc2lnbmVkCisvLy8gdG8gYmUgY2FsbGFibGUgZnJvbSBvdGhlciBwYXNzZXMgdGhhdCBmaW5kIHRoZW1zZWx2ZXMgd2l0aCBhbiBpbGxlZ2FsCisvLy8gaW5zdHJ1Y3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9MRUdBTElaRU1BQ0hJTkVJUlBBU1NfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9MRUdBTElaRU1BQ0hJTkVJUlBBU1NfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTWFjaGluZUlSQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKKworY2xhc3MgTGVnYWxpemVyIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworcHJpdmF0ZToKKworICAvLy8gSW5pdGlhbGl6ZSB0aGUgZmllbGQgbWVtYmVycyB1c2luZyBccCBNRi4KKyAgdm9pZCBpbml0KE1hY2hpbmVGdW5jdGlvbiAmTUYpOworCitwdWJsaWM6CisgIC8vIEN0b3IsIG5vdGhpbmcgZmFuY3kuCisgIExlZ2FsaXplcigpOworCisgIFN0cmluZ1JlZiBnZXRQYXNzTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJMZWdhbGl6ZXIiOyB9CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzIGdldFJlcXVpcmVkUHJvcGVydGllcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcygpLnNldCgKKyAgICAgICAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllczo6UHJvcGVydHk6OklzU1NBKTsKKyAgfQorCisgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgZ2V0U2V0UHJvcGVydGllcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcygpLnNldCgKKyAgICAgICAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllczo6UHJvcGVydHk6OkxlZ2FsaXplZCk7CisgIH0KKworICBib29sIGNvbWJpbmVFeHRyYWN0cyhNYWNoaW5lSW5zdHIgJk1JLCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJKTsKKworICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIG92ZXJyaWRlOworfTsKK30gLy8gRW5kIG5hbWVzcGFjZSBsbHZtLgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0xlZ2FsaXplckhlbHBlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTGVnYWxpemVySGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkOGE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0xlZ2FsaXplckhlbHBlci5oCkBAIC0wLDAgKzEsMTE1IEBACisvLz09IGxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0xlZ2FsaXplckhlbHBlci5oIC0tLS0tLS0tLS0tLS0tLS0gLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlIEEgcGFzcyB0byBjb252ZXJ0IHRoZSB0YXJnZXQtaWxsZWdhbCBvcGVyYXRpb25zIGNyZWF0ZWQgYnkgSVIgLT4gTUlSCisvLy8gdHJhbnNsYXRpb24gaW50byBvbmVzIHRoZSB0YXJnZXQgZXhwZWN0cyB0byBiZSBhYmxlIHRvIHNlbGVjdC4gVGhpcyBtYXkKKy8vLyBvY2N1ciBpbiBtdWx0aXBsZSBwaGFzZXMsIGZvciBleGFtcGxlIEdfQUREIDwyIHggaTg+IC0+IEdfQUREIDwyIHggaTE2PiAtPgorLy8vIEdfQUREIDw0IHggaTE2Pi4KKy8vLworLy8vIFRoZSBMZWdhbGl6ZXJIZWxwZXIgY2xhc3MgaXMgd2hlcmUgbW9zdCBvZiB0aGUgd29yayBoYXBwZW5zLCBhbmQgaXMKKy8vLyBkZXNpZ25lZCB0byBiZSBjYWxsYWJsZSBmcm9tIG90aGVyIHBhc3NlcyB0aGF0IGZpbmQgdGhlbXNlbHZlcyB3aXRoIGFuCisvLy8gaWxsZWdhbCBpbnN0cnVjdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX01BQ0hJTkVMRUdBTElaRUhFTFBFUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX01BQ0hJTkVMRUdBTElaRUhFTFBFUl9ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9DYWxsTG93ZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9NYWNoaW5lSVJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xvd0xldmVsVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1J1bnRpbWVMaWJjYWxscy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KK2NsYXNzIExlZ2FsaXplckluZm87CitjbGFzcyBMZWdhbGl6ZXI7CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworCitjbGFzcyBMZWdhbGl6ZXJIZWxwZXIgeworcHVibGljOgorICBlbnVtIExlZ2FsaXplUmVzdWx0IHsKKyAgICAvLy8gSW5zdHJ1Y3Rpb24gd2FzIGFscmVhZHkgbGVnYWwgYW5kIG5vIGNoYW5nZSB3YXMgbWFkZSB0byB0aGUKKyAgICAvLy8gTWFjaGluZUZ1bmN0aW9uLgorICAgIEFscmVhZHlMZWdhbCwKKworICAgIC8vLyBJbnN0cnVjdGlvbiBoYXMgYmVlbiBsZWdhbGl6ZWQgYW5kIHRoZSBNYWNoaW5lRnVuY3Rpb24gY2hhbmdlZC4KKyAgICBMZWdhbGl6ZWQsCisKKyAgICAvLy8gU29tZSBraW5kIG9mIGVycm9yIGhhcyBvY2N1cnJlZCBhbmQgd2UgY291bGQgbm90IGxlZ2FsaXplIHRoaXMKKyAgICAvLy8gaW5zdHJ1Y3Rpb24uCisgICAgVW5hYmxlVG9MZWdhbGl6ZSwKKyAgfTsKKworICBMZWdhbGl6ZXJIZWxwZXIoTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKyAgLy8vIFJlcGxhY2UgXHAgTUkgYnkgYSBzZXF1ZW5jZSBvZiBsZWdhbCBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gaW1wbGVtZW50IHRoZQorICAvLy8gc2FtZSBvcGVyYXRpb24uIE5vdGUgdGhhdCB0aGlzIG1lYW5zIFxwIE1JIG1heSBiZSBkZWxldGVkLCBzbyBhbnkgaXRlcmF0b3IKKyAgLy8vIHN0ZXBzIHNob3VsZCBiZSBwZXJmb3JtZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gXHAgSGVscGVyIHNob3VsZAorICAvLy8gYmUgaW5pdGlhbGl6ZWQgdG8gdGhlIE1hY2hpbmVGdW5jdGlvbiBjb250YWluaW5nIFxwIE1JLgorICAvLy8KKyAgLy8vIENvbnNpZGVyZWQgYXMgYW4gb3BhcXVlIGJsb2IsIHRoZSBsZWdhbCBjb2RlIHdpbGwgdXNlIGFuZCBkZWZpbmUgdGhlIHNhbWUKKyAgLy8vIHJlZ2lzdGVycyBhcyBccCBNSS4KKyAgTGVnYWxpemVSZXN1bHQgbGVnYWxpemVJbnN0clN0ZXAoTWFjaGluZUluc3RyICZNSSk7CisKKyAgLy8vIExlZ2FsaXplIGFuIGluc3RydWN0aW9uIGJ5IGVtaXRpbmcgYSBydW50aW1lIGxpYnJhcnkgY2FsbCBpbnN0ZWFkLgorICBMZWdhbGl6ZVJlc3VsdCBsaWJjYWxsKE1hY2hpbmVJbnN0ciAmTUkpOworCisgIC8vLyBMZWdhbGl6ZSBhbiBpbnN0cnVjdGlvbiBieSByZWR1Y2luZyB0aGUgd2lkdGggb2YgdGhlIHVuZGVybHlpbmcgc2NhbGFyCisgIC8vLyB0eXBlLgorICBMZWdhbGl6ZVJlc3VsdCBuYXJyb3dTY2FsYXIoTWFjaGluZUluc3RyICZNSSwgdW5zaWduZWQgVHlwZUlkeCwgTExUIE5hcnJvd1R5KTsKKworICAvLy8gTGVnYWxpemUgYW4gaW5zdHJ1Y3Rpb24gYnkgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uIG9uIGEgd2lkZXIgc2NhbGFyIHR5cGUKKyAgLy8vIChmb3IgZXhhbXBsZSBhIDE2LWJpdCBhZGRpdGlvbiBjYW4gYmUgc2FmZWx5IHBlcmZvcm1lZCBhdCAzMi1iaXRzCisgIC8vLyBwcmVjaXNpb24sIGlnbm9yaW5nIHRoZSB1bnVzZWQgYml0cykuCisgIExlZ2FsaXplUmVzdWx0IHdpZGVuU2NhbGFyKE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIFR5cGVJZHgsIExMVCBXaWRlVHkpOworCisgIC8vLyBMZWdhbGl6ZSBhbiBpbnN0cnVjdGlvbiBieSBzcGxpdHRpbmcgaXQgaW50byBzaW1wbGVyIHBhcnRzLCBob3BlZnVsbHkKKyAgLy8vIHVuZGVyc3Rvb2QgYnkgdGhlIHRhcmdldC4KKyAgTGVnYWxpemVSZXN1bHQgbG93ZXIoTWFjaGluZUluc3RyICZNSSwgdW5zaWduZWQgVHlwZUlkeCwgTExUIFR5KTsKKworICAvLy8gTGVnYWxpemUgYSB2ZWN0b3IgaW5zdHJ1Y3Rpb24gYnkgc3BsaXR0aW5nIGludG8gbXVsdGlwbGUgY29tcG9uZW50cywgZWFjaAorICAvLy8gYWN0aW5nIG9uIHRoZSBzYW1lIHNjYWxhciB0eXBlIGFzIHRoZSBvcmlnaW5hbCBidXQgd2l0aCBmZXdlciBlbGVtZW50cy4KKyAgTGVnYWxpemVSZXN1bHQgZmV3ZXJFbGVtZW50c1ZlY3RvcihNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBUeXBlSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVCBOYXJyb3dUeSk7CisKKyAgLy8vIExlZ2FsaXplIGEgdmVjdG9yIGluc3RydWN0aW9uIGJ5IGluY3JlYXNpbmcgdGhlIG51bWJlciBvZiB2ZWN0b3IgZWxlbWVudHMKKyAgLy8vIGludm9sdmVkIGFuZCBpZ25vcmluZyB0aGUgYWRkZWQgZWxlbWVudHMgbGF0ZXIuCisgIExlZ2FsaXplUmVzdWx0IG1vcmVFbGVtZW50c1ZlY3RvcihNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBUeXBlSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExUIFdpZGVUeSk7CisKKyAgLy8vIEV4cG9zZSBNSVJCdWlsZGVyIHNvIGNsaWVudHMgY2FuIHNldCB0aGVpciBvd24gUmVjb3JkSW5zZXJ0SW5zdHJ1Y3Rpb24KKyAgLy8vIGZ1bmN0aW9ucworICBNYWNoaW5lSVJCdWlsZGVyIE1JUkJ1aWxkZXI7CisKKyAgLy8vIEV4cG9zZSBMZWdhbGl6ZXJJbmZvIHNvIHRoZSBjbGllbnRzIGNhbiByZS11c2UuCisgIGNvbnN0IExlZ2FsaXplckluZm8gJmdldExlZ2FsaXplckluZm8oKSBjb25zdCB7IHJldHVybiBMSTsgfQorCitwcml2YXRlOgorCisgIC8vLyBIZWxwZXIgZnVuY3Rpb24gdG8gc3BsaXQgYSB3aWRlIGdlbmVyaWMgcmVnaXN0ZXIgaW50byBiaXR3aXNlIGJsb2NrcyB3aXRoCisgIC8vLyB0aGUgZ2l2ZW4gVHlwZSAod2hpY2ggaW1wbGllcyB0aGUgbnVtYmVyIG9mIGJsb2NrcyBuZWVkZWQpLiBUaGUgZ2VuZXJpYworICAvLy8gcmVnaXN0ZXJzIGNyZWF0ZWQgYXJlIGFwcGVuZGVkIHRvIE9wcywgc3RhcnRpbmcgYXQgYml0IDAgb2YgUmVnLgorICB2b2lkIGV4dHJhY3RQYXJ0cyh1bnNpZ25lZCBSZWcsIExMVCBUeSwgaW50IE51bVBhcnRzLAorICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZPcHMpOworCisgIE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSTsKKyAgY29uc3QgTGVnYWxpemVySW5mbyAmTEk7Cit9OworCisvLy8gSGVscGVyIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyB0aGUgZ2l2ZW4gbGliY2FsbC4KK0xlZ2FsaXplckhlbHBlcjo6TGVnYWxpemVSZXN1bHQKK2NyZWF0ZUxpYmNhbGwoTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlciwgUlRMSUI6OkxpYmNhbGwgTGliY2FsbCwKKyAgICAgICAgICAgICAgY29uc3QgQ2FsbExvd2VyaW5nOjpBcmdJbmZvICZSZXN1bHQsCisgICAgICAgICAgICAgIEFycmF5UmVmPENhbGxMb3dlcmluZzo6QXJnSW5mbz4gQXJncyk7CisKK30gLy8gRW5kIG5hbWVzcGFjZSBsbHZtLgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0xlZ2FsaXplckluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0xlZ2FsaXplckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTdjNzkxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTGVnYWxpemVySW5mby5oCkBAIC0wLDAgKzEsOTIwIEBACisvLz09PS0gbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTGVnYWxpemVySW5mby5oIC0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBJbnRlcmZhY2UgZm9yIFRhcmdldHMgdG8gc3BlY2lmeSB3aGljaCBvcGVyYXRpb25zIHRoZXkgY2FuIHN1Y2Nlc3NmdWxseQorLy8vIHNlbGVjdCBhbmQgaG93IHRoZSBvdGhlcnMgc2hvdWxkIGJlIGV4cGFuZGVkIG1vc3QgZWZmaWNpZW50bHkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9MRUdBTElaRVJJTkZPX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfTEVHQUxJWkVSSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRPcGNvZGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0xvd0xldmVsVHlwZUltcGwuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2V4dGVybiBjbDo6b3B0PGJvb2w+IERpc2FibGVHSVNlbExlZ2FsaXR5Q2hlY2s7CisKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIE1hY2hpbmVJUkJ1aWxkZXI7CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworCituYW1lc3BhY2UgTGVnYWxpemVBY3Rpb25zIHsKK2VudW0gTGVnYWxpemVBY3Rpb24gOiBzdGQ6OnVpbnQ4X3QgeworICAvLy8gVGhlIG9wZXJhdGlvbiBpcyBleHBlY3RlZCB0byBiZSBzZWxlY3RhYmxlIGRpcmVjdGx5IGJ5IHRoZSB0YXJnZXQsIGFuZAorICAvLy8gbm8gdHJhbnNmb3JtYXRpb24gaXMgbmVjZXNzYXJ5LgorICBMZWdhbCwKKworICAvLy8gVGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgc3ludGhlc2l6ZWQgZnJvbSBtdWx0aXBsZSBpbnN0cnVjdGlvbnMgYWN0aW5nIG9uCisgIC8vLyBhIG5hcnJvd2VyIHNjYWxhciBiYXNlLXR5cGUuIEZvciBleGFtcGxlIGEgNjQtYml0IGFkZCBtaWdodCBiZQorICAvLy8gaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgMzItYml0IGFkZC13aXRoLWNhcnJ5LgorICBOYXJyb3dTY2FsYXIsCisKKyAgLy8vIFRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIGEgd2lkZXIgc2NhbGFyCisgIC8vLyBiYXNlLXR5cGUuIEZvciBleGFtcGxlIGEgPDIgeCBzOD4gYWRkIGNvdWxkIGJlIGltcGxlbWVudGVkIGFzIGEgPDIKKyAgLy8vIHggczMyPiBhZGQgKGlnbm9yaW5nIHRoZSBoaWdoIGJpdHMpLgorICBXaWRlblNjYWxhciwKKworICAvLy8gVGhlICh2ZWN0b3IpIG9wZXJhdGlvbiBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgc3BsaXR0aW5nIGl0IGludG8KKyAgLy8vIHN1Yi12ZWN0b3JzIHdoZXJlIHRoZSBvcGVyYXRpb24gaXMgbGVnYWwuIEZvciBleGFtcGxlIGEgPDggeCBzNjQ+IGFkZAorICAvLy8gbWlnaHQgYmUgaW1wbGVtZW50ZWQgYXMgNCBzZXBhcmF0ZSA8MiB4IHM2ND4gYWRkcy4KKyAgRmV3ZXJFbGVtZW50cywKKworICAvLy8gVGhlICh2ZWN0b3IpIG9wZXJhdGlvbiBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgd2lkZW5pbmcgdGhlIGlucHV0CisgIC8vLyB2ZWN0b3IgYW5kIGlnbm9yaW5nIHRoZSBsYW5lcyBhZGRlZCBieSBkb2luZyBzby4gRm9yIGV4YW1wbGUgPDIgeCBpOD4gaXMKKyAgLy8vIHJhcmVseSBsZWdhbCwgYnV0IHlvdSBtaWdodCBwZXJmb3JtIGFuIDw4IHggaTg+IGFuZCB0aGVuIG9ubHkgbG9vayBhdAorICAvLy8gdGhlIGZpcnN0IHR3byByZXN1bHRzLgorICBNb3JlRWxlbWVudHMsCisKKyAgLy8vIFRoZSBvcGVyYXRpb24gaXRzZWxmIG11c3QgYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIHNpbXBsZXIgYWN0aW9ucyBvbgorICAvLy8gdGhpcyB0YXJnZXQuIEUuZy4gYSBTUkVNIHJlcGxhY2VkIGJ5IGFuIFNESVYgYW5kIHN1YnRyYWN0aW9uLgorICBMb3dlciwKKworICAvLy8gVGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYXMgYSBjYWxsIHRvIHNvbWUga2luZCBvZiBydW50aW1lCisgIC8vLyBzdXBwb3J0IGxpYnJhcnkuIEZvciBleGFtcGxlIHRoaXMgdXN1YWxseSBoYXBwZW5zIG9uIG1hY2hpbmVzIHRoYXQgZG9uJ3QKKyAgLy8vIHN1cHBvcnQgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBuYXRpdmVseS4KKyAgTGliY2FsbCwKKworICAvLy8gVGhlIHRhcmdldCB3YW50cyB0byBkbyBzb21ldGhpbmcgc3BlY2lhbCB3aXRoIHRoaXMgY29tYmluYXRpb24gb2YKKyAgLy8vIG9wZXJhbmQgYW5kIHR5cGUuIEEgY2FsbGJhY2sgd2lsbCBiZSBpc3N1ZWQgd2hlbiBpdCBpcyBuZWVkZWQuCisgIEN1c3RvbSwKKworICAvLy8gVGhpcyBvcGVyYXRpb24gaXMgY29tcGxldGVseSB1bnN1cHBvcnRlZCBvbiB0aGUgdGFyZ2V0LiBBIHByb2dyYW1taW5nCisgIC8vLyBlcnJvciBoYXMgb2NjdXJyZWQuCisgIFVuc3VwcG9ydGVkLAorCisgIC8vLyBTZW50aW5lbCB2YWx1ZSBmb3Igd2hlbiBubyBhY3Rpb24gd2FzIGZvdW5kIGluIHRoZSBzcGVjaWZpZWQgdGFibGUuCisgIE5vdEZvdW5kLAorCisgIC8vLyBGYWxsIGJhY2sgb250byB0aGUgb2xkIHJ1bGVzLgorICAvLy8gVE9ETzogUmVtb3ZlIHRoaXMgb25jZSB3ZSd2ZSBtaWdyYXRlZAorICBVc2VMZWdhY3lSdWxlcywKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgTGVnYWxpemVBY3Rpb25zCisKK3VzaW5nIExlZ2FsaXplQWN0aW9uczo6TGVnYWxpemVBY3Rpb247CisKKy8vLyBMZWdhbGl6YXRpb24gaXMgZGVjaWRlZCBiYXNlZCBvbiBhbiBpbnN0cnVjdGlvbidzIG9wY29kZSwgd2hpY2ggdHlwZSBzbG90CisvLy8gd2UncmUgY29uc2lkZXJpbmcsIGFuZCB3aGF0IHRoZSBleGlzdGluZyB0eXBlIGlzLiBUaGVzZSBhc3BlY3RzIGFyZSBnYXRoZXJlZAorLy8vIHRvZ2V0aGVyIGZvciBjb252ZW5pZW5jZSBpbiB0aGUgSW5zdHJBc3BlY3QgY2xhc3MuCitzdHJ1Y3QgSW5zdHJBc3BlY3QgeworICB1bnNpZ25lZCBPcGNvZGU7CisgIHVuc2lnbmVkIElkeCA9IDA7CisgIExMVCBUeXBlOworCisgIEluc3RyQXNwZWN0KHVuc2lnbmVkIE9wY29kZSwgTExUIFR5cGUpIDogT3Bjb2RlKE9wY29kZSksIFR5cGUoVHlwZSkge30KKyAgSW5zdHJBc3BlY3QodW5zaWduZWQgT3Bjb2RlLCB1bnNpZ25lZCBJZHgsIExMVCBUeXBlKQorICAgICAgOiBPcGNvZGUoT3Bjb2RlKSwgSWR4KElkeCksIFR5cGUoVHlwZSkge30KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW5zdHJBc3BlY3QgJlJIUykgY29uc3QgeworICAgIHJldHVybiBPcGNvZGUgPT0gUkhTLk9wY29kZSAmJiBJZHggPT0gUkhTLklkeCAmJiBUeXBlID09IFJIUy5UeXBlOworICB9Cit9OworCisvLy8gVGhlIExlZ2FsaXR5UXVlcnkgb2JqZWN0IGJ1bmRsZXMgdG9nZXRoZXIgYWxsIHRoZSBpbmZvcm1hdGlvbiB0aGF0J3MgbmVlZGVkCisvLy8gdG8gZGVjaWRlIHdoZXRoZXIgYSBnaXZlbiBvcGVyYXRpb24gaXMgbGVnYWwgb3Igbm90LgorLy8vIEZvciBlZmZpY2llbmN5LCBpdCBkb2Vzbid0IG1ha2UgYSBjb3B5IG9mIFR5cGVzIHNvIGNhcmUgbXVzdCBiZSB0YWtlbiBub3QKKy8vLyB0byBmcmVlIGl0IGJlZm9yZSB1c2luZyB0aGUgcXVlcnkuCitzdHJ1Y3QgTGVnYWxpdHlRdWVyeSB7CisgIHVuc2lnbmVkIE9wY29kZTsKKyAgQXJyYXlSZWY8TExUPiBUeXBlczsKKworICByYXdfb3N0cmVhbSAmcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKK307CisKKy8vLyBUaGUgcmVzdWx0IG9mIGEgcXVlcnkuIEl0IGVpdGhlciBpbmRpY2F0ZXMgYSBmaW5hbCBhbnN3ZXIgb2YgTGVnYWwgb3IKKy8vLyBVbnN1cHBvcnRlZCBvciBkZXNjcmliZXMgYW4gYWN0aW9uIHRoYXQgbXVzdCBiZSB0YWtlbiB0byBtYWtlIGFuIG9wZXJhdGlvbgorLy8vIG1vcmUgbGVnYWwuCitzdHJ1Y3QgTGVnYWxpemVBY3Rpb25TdGVwIHsKKyAgLy8vIFRoZSBhY3Rpb24gdG8gdGFrZSBvciB0aGUgZmluYWwgYW5zd2VyLgorICBMZWdhbGl6ZUFjdGlvbiBBY3Rpb247CisgIC8vLyBJZiBkZXNjcmliaW5nIGFuIGFjdGlvbiwgdGhlIHR5cGUgaW5kZXggdG8gY2hhbmdlLiBPdGhlcndpc2UgemVyby4KKyAgdW5zaWduZWQgVHlwZUlkeDsKKyAgLy8vIElmIGRlc2NyaWJpbmcgYW4gYWN0aW9uLCB0aGUgbmV3IHR5cGUgZm9yIFR5cGVJZHguIE90aGVyd2lzZSBMTFR7fS4KKyAgTExUIE5ld1R5cGU7CisKKyAgTGVnYWxpemVBY3Rpb25TdGVwKExlZ2FsaXplQWN0aW9uIEFjdGlvbiwgdW5zaWduZWQgVHlwZUlkeCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExMVCAmTmV3VHlwZSkKKyAgICAgIDogQWN0aW9uKEFjdGlvbiksIFR5cGVJZHgoVHlwZUlkeCksIE5ld1R5cGUoTmV3VHlwZSkge30KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTGVnYWxpemVBY3Rpb25TdGVwICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoQWN0aW9uLCBUeXBlSWR4LCBOZXdUeXBlKSA9PQorICAgICAgICBzdGQ6OnRpZShSSFMuQWN0aW9uLCBSSFMuVHlwZUlkeCwgUkhTLk5ld1R5cGUpOworICB9Cit9OworCit1c2luZyBMZWdhbGl0eVByZWRpY2F0ZSA9IHN0ZDo6ZnVuY3Rpb248Ym9vbCAoY29uc3QgTGVnYWxpdHlRdWVyeSAmKT47Cit1c2luZyBMZWdhbGl6ZU11dGF0aW9uID0KKyAgICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6cGFpcjx1bnNpZ25lZCwgTExUPihjb25zdCBMZWdhbGl0eVF1ZXJ5ICYpPjsKKworbmFtZXNwYWNlIExlZ2FsaXR5UHJlZGljYXRlcyB7CisvLy8gVHJ1ZSBpZmYgUDAgYW5kIFAxIGFyZSB0cnVlLgorTGVnYWxpdHlQcmVkaWNhdGUgYWxsKExlZ2FsaXR5UHJlZGljYXRlIFAwLCBMZWdhbGl0eVByZWRpY2F0ZSBQMSk7CisvLy8gVHJ1ZSBpZmYgdGhlIGdpdmVuIHR5cGUgaW5kZXggaXMgb25lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZXMuCitMZWdhbGl0eVByZWRpY2F0ZSB0eXBlSW5TZXQodW5zaWduZWQgVHlwZUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8TExUPiBUeXBlc0luaXQpOworLy8vIFRydWUgaWZmIHRoZSBnaXZlbiB0eXBlcyBmb3IgdGhlIGdpdmVuIHBhaXIgb2YgdHlwZSBpbmRleGVzIGlzIG9uZSBvZiB0aGUKKy8vLyBzcGVjaWZpZWQgdHlwZSBwYWlycy4KK0xlZ2FsaXR5UHJlZGljYXRlCit0eXBlUGFpckluU2V0KHVuc2lnbmVkIFR5cGVJZHgwLCB1bnNpZ25lZCBUeXBlSWR4MSwKKyAgICAgICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PHN0ZDo6cGFpcjxMTFQsIExMVD4+IFR5cGVzSW5pdCk7CisvLy8gVHJ1ZSBpZmYgdGhlIHNwZWNpZmllZCB0eXBlIGluZGV4IGlzIGEgc2NhbGFyLgorTGVnYWxpdHlQcmVkaWNhdGUgaXNTY2FsYXIodW5zaWduZWQgVHlwZUlkeCk7CisvLy8gVHJ1ZSBpZmYgdGhlIHNwZWNpZmllZCB0eXBlIGluZGV4IGlzIGEgc2NhbGFyIHRoYXQncyBuYXJyb3dlciB0aGFuIHRoZSBnaXZlbgorLy8vIHNpemUuCitMZWdhbGl0eVByZWRpY2F0ZSBuYXJyb3dlclRoYW4odW5zaWduZWQgVHlwZUlkeCwgdW5zaWduZWQgU2l6ZSk7CisvLy8gVHJ1ZSBpZmYgdGhlIHNwZWNpZmllZCB0eXBlIGluZGV4IGlzIGEgc2NhbGFyIHRoYXQncyB3aWRlciB0aGFuIHRoZSBnaXZlbgorLy8vIHNpemUuCitMZWdhbGl0eVByZWRpY2F0ZSB3aWRlclRoYW4odW5zaWduZWQgVHlwZUlkeCwgdW5zaWduZWQgU2l6ZSk7CisvLy8gVHJ1ZSBpZmYgdGhlIHNwZWNpZmllZCB0eXBlIGluZGV4IGlzIGEgc2NhbGFyIHdob3NlIHNpemUgaXMgbm90IGEgcG93ZXIgb2YKKy8vLyAyLgorTGVnYWxpdHlQcmVkaWNhdGUgc2l6ZU5vdFBvdzIodW5zaWduZWQgVHlwZUlkeCk7CisvLy8gVHJ1ZSBpZmYgdGhlIHNwZWNpZmllZCB0eXBlIGluZGV4IGlzIGEgdmVjdG9yIHdob3NlIGVsZW1lbnQgY291bnQgaXMgbm90IGEKKy8vLyBwb3dlciBvZiAyLgorTGVnYWxpdHlQcmVkaWNhdGUgbnVtRWxlbWVudHNOb3RQb3cyKHVuc2lnbmVkIFR5cGVJZHgpOworfSAvLyBlbmQgbmFtZXNwYWNlIExlZ2FsaXR5UHJlZGljYXRlcworCituYW1lc3BhY2UgTGVnYWxpemVNdXRhdGlvbnMgeworLy8vIFNlbGVjdCB0aGlzIHNwZWNpZmljIHR5cGUgZm9yIHRoZSBnaXZlbiB0eXBlIGluZGV4LgorTGVnYWxpemVNdXRhdGlvbiBjaGFuZ2VUbyh1bnNpZ25lZCBUeXBlSWR4LCBMTFQgVHkpOworLy8vIFdpZGVuIHRoZSB0eXBlIGZvciB0aGUgZ2l2ZW4gdHlwZSBpbmRleCB0byB0aGUgbmV4dCBwb3dlciBvZiAyLgorTGVnYWxpemVNdXRhdGlvbiB3aWRlblNjYWxhclRvTmV4dFBvdzIodW5zaWduZWQgVHlwZUlkeCwgdW5zaWduZWQgTWluID0gMCk7CisvLy8gQWRkIG1vcmUgZWxlbWVudHMgdG8gdGhlIHR5cGUgZm9yIHRoZSBnaXZlbiB0eXBlIGluZGV4IHRvIHRoZSBuZXh0IHBvd2VyIG9mCisvLy8gMi4KK0xlZ2FsaXplTXV0YXRpb24gbW9yZUVsZW1lbnRzVG9OZXh0UG93Mih1bnNpZ25lZCBUeXBlSWR4LCB1bnNpZ25lZCBNaW4gPSAwKTsKK30gLy8gZW5kIG5hbWVzcGFjZSBMZWdhbGl6ZU11dGF0aW9ucworCisvLy8gQSBzaW5nbGUgcnVsZSBpbiBhIGxlZ2FsaXplciBpbmZvIHJ1bGVzZXQuCisvLy8gVGhlIHNwZWNpZmllZCBhY3Rpb24gaXMgY2hvc2VuIHdoZW4gdGhlIHByZWRpY2F0ZSBpcyB0cnVlLiBXaGVyZSBhcHByb3ByaWF0ZQorLy8vIGZvciB0aGUgYWN0aW9uIChlLmcuIGZvciBXaWRlblNjYWxhcikgdGhlIG5ldyB0eXBlIGlzIHNlbGVjdGVkIHVzaW5nIHRoZQorLy8vIGdpdmVuIG11dGF0b3IuCitjbGFzcyBMZWdhbGl6ZVJ1bGUgeworICBMZWdhbGl0eVByZWRpY2F0ZSBQcmVkaWNhdGU7CisgIExlZ2FsaXplQWN0aW9uIEFjdGlvbjsKKyAgTGVnYWxpemVNdXRhdGlvbiBNdXRhdGlvbjsKKworcHVibGljOgorICBMZWdhbGl6ZVJ1bGUoTGVnYWxpdHlQcmVkaWNhdGUgUHJlZGljYXRlLCBMZWdhbGl6ZUFjdGlvbiBBY3Rpb24sCisgICAgICAgICAgICAgICBMZWdhbGl6ZU11dGF0aW9uIE11dGF0aW9uID0gbnVsbHB0cikKKyAgICAgIDogUHJlZGljYXRlKFByZWRpY2F0ZSksIEFjdGlvbihBY3Rpb24pLCBNdXRhdGlvbihNdXRhdGlvbikge30KKworICAvLy8gVGVzdCB3aGV0aGVyIHRoZSBMZWdhbGl0eVF1ZXJ5IG1hdGNoZXMuCisgIGJvb2wgbWF0Y2goY29uc3QgTGVnYWxpdHlRdWVyeSAmUXVlcnkpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZGljYXRlKFF1ZXJ5KTsKKyAgfQorCisgIExlZ2FsaXplQWN0aW9uIGdldEFjdGlvbigpIGNvbnN0IHsgcmV0dXJuIEFjdGlvbjsgfQorCisgIC8vLyBEZXRlcm1pbmUgdGhlIGNoYW5nZSB0byBtYWtlLgorICBzdGQ6OnBhaXI8dW5zaWduZWQsIExMVD4gZGV0ZXJtaW5lTXV0YXRpb24oY29uc3QgTGVnYWxpdHlRdWVyeSAmUXVlcnkpIGNvbnN0IHsKKyAgICBpZiAoTXV0YXRpb24pCisgICAgICByZXR1cm4gTXV0YXRpb24oUXVlcnkpOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwLCBMTFR7fSk7CisgIH0KK307CisKK2NsYXNzIExlZ2FsaXplUnVsZVNldCB7CisgIC8vLyBXaGVuIG5vbi16ZXJvLCB0aGUgb3Bjb2RlIHdlIGFyZSBhbiBhbGlhcyBvZgorICB1bnNpZ25lZCBBbGlhc09mOworICAvLy8gSWYgdHJ1ZSwgdGhlcmUgaXMgYW5vdGhlciBvcGNvZGUgdGhhdCBhbGlhc2VzIHRoaXMgb25lCisgIGJvb2wgSXNBbGlhc2VkQnlBbm90aGVyOworICBTbWFsbFZlY3RvcjxMZWdhbGl6ZVJ1bGUsIDI+IFJ1bGVzOworCisgIHZvaWQgYWRkKGNvbnN0IExlZ2FsaXplUnVsZSAmUnVsZSkgeworICAgIGFzc2VydChBbGlhc09mID09IDAgJiYKKyAgICAgICAgICAgIlJ1bGVTZXQgaXMgYWxpYXNlZCwgY2hhbmdlIHRoZSByZXByZXNlbnRhdGl2ZSBvcGNvZGUgaW5zdGVhZCIpOworICAgIFJ1bGVzLnB1c2hfYmFjayhSdWxlKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGFsd2F5cyhjb25zdCBMZWdhbGl0eVF1ZXJ5ICYpIHsgcmV0dXJuIHRydWU7IH0KKworICAvLy8gVXNlIHRoZSBnaXZlbiBhY3Rpb24gd2hlbiB0aGUgcHJlZGljYXRlIGlzIHRydWUuCisgIC8vLyBBY3Rpb24gc2hvdWxkIG5vdCBiZSBhbiBhY3Rpb24gdGhhdCByZXF1aXJlcyBtdXRhdGlvbi4KKyAgTGVnYWxpemVSdWxlU2V0ICZhY3Rpb25JZihMZWdhbGl6ZUFjdGlvbiBBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxpdHlQcmVkaWNhdGUgUHJlZGljYXRlKSB7CisgICAgYWRkKHtQcmVkaWNhdGUsIEFjdGlvbn0pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAvLy8gVXNlIHRoZSBnaXZlbiBhY3Rpb24gd2hlbiB0aGUgcHJlZGljYXRlIGlzIHRydWUuCisgIC8vLyBBY3Rpb24gc2hvdWxkIG5vdCBiZSBhbiBhY3Rpb24gdGhhdCByZXF1aXJlcyBtdXRhdGlvbi4KKyAgTGVnYWxpemVSdWxlU2V0ICZhY3Rpb25JZihMZWdhbGl6ZUFjdGlvbiBBY3Rpb24sIExlZ2FsaXR5UHJlZGljYXRlIFByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbGl6ZU11dGF0aW9uIE11dGF0aW9uKSB7CisgICAgYWRkKHtQcmVkaWNhdGUsIEFjdGlvbiwgTXV0YXRpb259KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgLy8vIFVzZSB0aGUgZ2l2ZW4gYWN0aW9uIHdoZW4gdHlwZSBpbmRleCAwIGlzIGFueSB0eXBlIGluIHRoZSBnaXZlbiBsaXN0LgorICAvLy8gQWN0aW9uIHNob3VsZCBub3QgYmUgYW4gYWN0aW9uIHRoYXQgcmVxdWlyZXMgbXV0YXRpb24uCisgIExlZ2FsaXplUnVsZVNldCAmYWN0aW9uRm9yKExlZ2FsaXplQWN0aW9uIEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PExMVD4gVHlwZXMpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgTGVnYWxpdHlQcmVkaWNhdGVzOworICAgIHJldHVybiBhY3Rpb25JZihBY3Rpb24sIHR5cGVJblNldCgwLCBUeXBlcykpOworICB9CisgIC8vLyBVc2UgdGhlIGdpdmVuIGFjdGlvbiB3aGVuIHR5cGUgaW5kZXhlcyAwIGFuZCAxIGlzIGFueSB0eXBlIHBhaXIgaW4gdGhlCisgIC8vLyBnaXZlbiBsaXN0LgorICAvLy8gQWN0aW9uIHNob3VsZCBub3QgYmUgYW4gYWN0aW9uIHRoYXQgcmVxdWlyZXMgbXV0YXRpb24uCisgIExlZ2FsaXplUnVsZVNldCAmCisgIGFjdGlvbkZvcihMZWdhbGl6ZUFjdGlvbiBBY3Rpb24sCisgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8c3RkOjpwYWlyPExMVCwgTExUPj4gVHlwZXMpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgTGVnYWxpdHlQcmVkaWNhdGVzOworICAgIHJldHVybiBhY3Rpb25JZihBY3Rpb24sIHR5cGVQYWlySW5TZXQoMCwgMSwgVHlwZXMpKTsKKyAgfQorICAvLy8gVXNlIHRoZSBnaXZlbiBhY3Rpb24gd2hlbiB0eXBlIGluZGV4ZXMgMCBhbmQgMSBhcmUgYm90aCBpbiB0aGUgZ2l2ZW4gbGlzdC4KKyAgLy8vIFRoYXQgaXMsIHRoZSB0eXBlIHBhaXIgaXMgaW4gdGhlIGNhcnRlc2lhbiBwcm9kdWN0IG9mIHRoZSBsaXN0LgorICAvLy8gQWN0aW9uIHNob3VsZCBub3QgYmUgYW4gYWN0aW9uIHRoYXQgcmVxdWlyZXMgbXV0YXRpb24uCisgIExlZ2FsaXplUnVsZVNldCAmYWN0aW9uRm9yQ2FydGVzaWFuUHJvZHVjdChMZWdhbGl6ZUFjdGlvbiBBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8TExUPiBUeXBlcykgeworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl0eVByZWRpY2F0ZXM7CisgICAgcmV0dXJuIGFjdGlvbklmKEFjdGlvbiwgYWxsKHR5cGVJblNldCgwLCBUeXBlcyksIHR5cGVJblNldCgxLCBUeXBlcykpKTsKKyAgfQorICAvLy8gVXNlIHRoZSBnaXZlbiBhY3Rpb24gd2hlbiB0eXBlIGluZGV4ZXMgMCBhbmQgMSBhcmUgYm90aCB0aGVpciByZXNwZWN0aXZlCisgIC8vLyBsaXN0cy4KKyAgLy8vIFRoYXQgaXMsIHRoZSB0eXBlIHBhaXIgaXMgaW4gdGhlIGNhcnRlc2lhbiBwcm9kdWN0IG9mIHRoZSBsaXN0cworICAvLy8gQWN0aW9uIHNob3VsZCBub3QgYmUgYW4gYWN0aW9uIHRoYXQgcmVxdWlyZXMgbXV0YXRpb24uCisgIExlZ2FsaXplUnVsZVNldCAmCisgIGFjdGlvbkZvckNhcnRlc2lhblByb2R1Y3QoTGVnYWxpemVBY3Rpb24gQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxMTFQ+IFR5cGVzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8TExUPiBUeXBlczEpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgTGVnYWxpdHlQcmVkaWNhdGVzOworICAgIHJldHVybiBhY3Rpb25JZihBY3Rpb24sIGFsbCh0eXBlSW5TZXQoMCwgVHlwZXMwKSwgdHlwZUluU2V0KDEsIFR5cGVzMSkpKTsKKyAgfQorCitwdWJsaWM6CisgIExlZ2FsaXplUnVsZVNldCgpIDogQWxpYXNPZigwKSwgSXNBbGlhc2VkQnlBbm90aGVyKGZhbHNlKSwgUnVsZXMoKSB7fQorCisgIGJvb2wgaXNBbGlhc2VkQnlBbm90aGVyKCkgeyByZXR1cm4gSXNBbGlhc2VkQnlBbm90aGVyOyB9CisgIHZvaWQgc2V0SXNBbGlhc2VkQnlBbm90aGVyKCkgeyBJc0FsaWFzZWRCeUFub3RoZXIgPSB0cnVlOyB9CisgIHZvaWQgYWxpYXNUbyh1bnNpZ25lZCBPcGNvZGUpIHsKKyAgICBhc3NlcnQoKEFsaWFzT2YgPT0gMCB8fCBBbGlhc09mID09IE9wY29kZSkgJiYKKyAgICAgICAgICAgIk9wY29kZSBpcyBhbHJlYWR5IGFsaWFzZWQgdG8gYW5vdGhlciBvcGNvZGUiKTsKKyAgICBhc3NlcnQoUnVsZXMuZW1wdHkoKSAmJiAiQWxpYXNpbmcgd2lsbCBkaXNjYXJkIHJ1bGVzIik7CisgICAgQWxpYXNPZiA9IE9wY29kZTsKKyAgfQorICB1bnNpZ25lZCBnZXRBbGlhcygpIGNvbnN0IHsgcmV0dXJuIEFsaWFzT2Y7IH0KKworICAvLy8gVGhlIGluc3RydWN0aW9uIGlzIGxlZ2FsIGlmIHByZWRpY2F0ZSBpcyB0cnVlLgorICBMZWdhbGl6ZVJ1bGVTZXQgJmxlZ2FsSWYoTGVnYWxpdHlQcmVkaWNhdGUgUHJlZGljYXRlKSB7CisgICAgcmV0dXJuIGFjdGlvbklmKExlZ2FsaXplQWN0aW9uOjpMZWdhbCwgUHJlZGljYXRlKTsKKyAgfQorICAvLy8gVGhlIGluc3RydWN0aW9uIGlzIGxlZ2FsIHdoZW4gdHlwZSBpbmRleCAwIGlzIGFueSB0eXBlIGluIHRoZSBnaXZlbiBsaXN0LgorICBMZWdhbGl6ZVJ1bGVTZXQgJmxlZ2FsRm9yKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxMTFQ+IFR5cGVzKSB7CisgICAgcmV0dXJuIGFjdGlvbkZvcihMZWdhbGl6ZUFjdGlvbjo6TGVnYWwsIFR5cGVzKTsKKyAgfQorICAvLy8gVGhlIGluc3RydWN0aW9uIGlzIGxlZ2FsIHdoZW4gdHlwZSBpbmRleGVzIDAgYW5kIDEgaXMgYW55IHR5cGUgcGFpciBpbiB0aGUKKyAgLy8vIGdpdmVuIGxpc3QuCisgIExlZ2FsaXplUnVsZVNldCAmbGVnYWxGb3Ioc3RkOjppbml0aWFsaXplcl9saXN0PHN0ZDo6cGFpcjxMTFQsIExMVD4+IFR5cGVzKSB7CisgICAgcmV0dXJuIGFjdGlvbkZvcihMZWdhbGl6ZUFjdGlvbjo6TGVnYWwsIFR5cGVzKTsKKyAgfQorICAvLy8gVGhlIGluc3RydWN0aW9uIGlzIGxlZ2FsIHdoZW4gdHlwZSBpbmRleGVzIDAgYW5kIDEgYXJlIGJvdGggaW4gdGhlIGdpdmVuCisgIC8vLyBsaXN0LiBUaGF0IGlzLCB0aGUgdHlwZSBwYWlyIGlzIGluIHRoZSBjYXJ0ZXNpYW4gcHJvZHVjdCBvZiB0aGUgbGlzdC4KKyAgTGVnYWxpemVSdWxlU2V0ICZsZWdhbEZvckNhcnRlc2lhblByb2R1Y3Qoc3RkOjppbml0aWFsaXplcl9saXN0PExMVD4gVHlwZXMpIHsKKyAgICByZXR1cm4gYWN0aW9uRm9yQ2FydGVzaWFuUHJvZHVjdChMZWdhbGl6ZUFjdGlvbjo6TGVnYWwsIFR5cGVzKTsKKyAgfQorICAvLy8gVGhlIGluc3RydWN0aW9uIGlzIGxlZ2FsIHdoZW4gdHlwZSBpbmRleGVzIDAgYW5kIDEgYXJlIGJvdGggdGhlaXIKKyAgLy8vIHJlc3BlY3RpdmUgbGlzdHMuCisgIExlZ2FsaXplUnVsZVNldCAmbGVnYWxGb3JDYXJ0ZXNpYW5Qcm9kdWN0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxMTFQ+IFR5cGVzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PExMVD4gVHlwZXMxKSB7CisgICAgcmV0dXJuIGFjdGlvbkZvckNhcnRlc2lhblByb2R1Y3QoTGVnYWxpemVBY3Rpb246OkxlZ2FsLCBUeXBlczAsIFR5cGVzMSk7CisgIH0KKworICAvLy8gTGlrZSBsZWdhbElmLCBidXQgZm9yIHRoZSBMaWJjYWxsIGFjdGlvbi4KKyAgTGVnYWxpemVSdWxlU2V0ICZsaWJjYWxsSWYoTGVnYWxpdHlQcmVkaWNhdGUgUHJlZGljYXRlKSB7CisgICAgcmV0dXJuIGFjdGlvbklmKExlZ2FsaXplQWN0aW9uOjpMaWJjYWxsLCBQcmVkaWNhdGUpOworICB9CisgIExlZ2FsaXplUnVsZVNldCAmbGliY2FsbEZvcihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8TExUPiBUeXBlcykgeworICAgIHJldHVybiBhY3Rpb25Gb3IoTGVnYWxpemVBY3Rpb246OkxpYmNhbGwsIFR5cGVzKTsKKyAgfQorICBMZWdhbGl6ZVJ1bGVTZXQgJgorICBsaWJjYWxsRm9yKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OnBhaXI8TExULCBMTFQ+PiBUeXBlcykgeworICAgIHJldHVybiBhY3Rpb25Gb3IoTGVnYWxpemVBY3Rpb246OkxpYmNhbGwsIFR5cGVzKTsKKyAgfQorICBMZWdhbGl6ZVJ1bGVTZXQgJgorICBsaWJjYWxsRm9yQ2FydGVzaWFuUHJvZHVjdChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8TExUPiBUeXBlcykgeworICAgIHJldHVybiBhY3Rpb25Gb3JDYXJ0ZXNpYW5Qcm9kdWN0KExlZ2FsaXplQWN0aW9uOjpMaWJjYWxsLCBUeXBlcyk7CisgIH0KKyAgTGVnYWxpemVSdWxlU2V0ICYKKyAgbGliY2FsbEZvckNhcnRlc2lhblByb2R1Y3Qoc3RkOjppbml0aWFsaXplcl9saXN0PExMVD4gVHlwZXMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8TExUPiBUeXBlczEpIHsKKyAgICByZXR1cm4gYWN0aW9uRm9yQ2FydGVzaWFuUHJvZHVjdChMZWdhbGl6ZUFjdGlvbjo6TGliY2FsbCwgVHlwZXMwLCBUeXBlczEpOworICB9CisKKyAgLy8vIFdpZGVuIHRoZSBzY2FsYXIgdG8gdGhlIG9uZSBzZWxlY3RlZCBieSB0aGUgbXV0YXRpb24gaWYgdGhlIHByZWRpY2F0ZSBpcworICAvLy8gdHJ1ZS4KKyAgTGVnYWxpemVSdWxlU2V0ICZ3aWRlblNjYWxhcklmKExlZ2FsaXR5UHJlZGljYXRlIFByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2FsaXplTXV0YXRpb24gTXV0YXRpb24pIHsKKyAgICByZXR1cm4gYWN0aW9uSWYoTGVnYWxpemVBY3Rpb246OldpZGVuU2NhbGFyLCBQcmVkaWNhdGUsIE11dGF0aW9uKTsKKyAgfQorICAvLy8gTmFycm93IHRoZSBzY2FsYXIgdG8gdGhlIG9uZSBzZWxlY3RlZCBieSB0aGUgbXV0YXRpb24gaWYgdGhlIHByZWRpY2F0ZSBpcworICAvLy8gdHJ1ZS4KKyAgTGVnYWxpemVSdWxlU2V0ICZuYXJyb3dTY2FsYXJJZihMZWdhbGl0eVByZWRpY2F0ZSBQcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxpemVNdXRhdGlvbiBNdXRhdGlvbikgeworICAgIHJldHVybiBhY3Rpb25JZihMZWdhbGl6ZUFjdGlvbjo6TmFycm93U2NhbGFyLCBQcmVkaWNhdGUsIE11dGF0aW9uKTsKKyAgfQorCisgIC8vLyBBZGQgbW9yZSBlbGVtZW50cyB0byByZWFjaCB0aGUgdHlwZSBzZWxlY3RlZCBieSB0aGUgbXV0YXRpb24gaWYgdGhlCisgIC8vLyBwcmVkaWNhdGUgaXMgdHJ1ZS4KKyAgTGVnYWxpemVSdWxlU2V0ICZtb3JlRWxlbWVudHNJZihMZWdhbGl0eVByZWRpY2F0ZSBQcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxpemVNdXRhdGlvbiBNdXRhdGlvbikgeworICAgIHJldHVybiBhY3Rpb25JZihMZWdhbGl6ZUFjdGlvbjo6TW9yZUVsZW1lbnRzLCBQcmVkaWNhdGUsIE11dGF0aW9uKTsKKyAgfQorICAvLy8gUmVtb3ZlIGVsZW1lbnRzIHRvIHJlYWNoIHRoZSB0eXBlIHNlbGVjdGVkIGJ5IHRoZSBtdXRhdGlvbiBpZiB0aGUKKyAgLy8vIHByZWRpY2F0ZSBpcyB0cnVlLgorICBMZWdhbGl6ZVJ1bGVTZXQgJmZld2VyRWxlbWVudHNJZihMZWdhbGl0eVByZWRpY2F0ZSBQcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2FsaXplTXV0YXRpb24gTXV0YXRpb24pIHsKKyAgICByZXR1cm4gYWN0aW9uSWYoTGVnYWxpemVBY3Rpb246OkZld2VyRWxlbWVudHMsIFByZWRpY2F0ZSwgTXV0YXRpb24pOworICB9CisKKyAgLy8vIFRoZSBpbnN0cnVjdGlvbiBpcyB1bnN1cHBvcnRlZC4KKyAgTGVnYWxpemVSdWxlU2V0ICZ1bnN1cHBvcnRlZCgpIHsKKyAgICByZXR1cm4gYWN0aW9uSWYoTGVnYWxpemVBY3Rpb246OlVuc3VwcG9ydGVkLCBhbHdheXMpOworICB9CisgIExlZ2FsaXplUnVsZVNldCAmdW5zdXBwb3J0ZWRJZihMZWdhbGl0eVByZWRpY2F0ZSBQcmVkaWNhdGUpIHsKKyAgICByZXR1cm4gYWN0aW9uSWYoTGVnYWxpemVBY3Rpb246OlVuc3VwcG9ydGVkLCBQcmVkaWNhdGUpOworICB9CisKKyAgTGVnYWxpemVSdWxlU2V0ICZjdXN0b21JZihMZWdhbGl0eVByZWRpY2F0ZSBQcmVkaWNhdGUpIHsKKyAgICByZXR1cm4gYWN0aW9uSWYoTGVnYWxpemVBY3Rpb246OkN1c3RvbSwgUHJlZGljYXRlKTsKKyAgfQorICBMZWdhbGl6ZVJ1bGVTZXQgJmN1c3RvbUZvcihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8TExUPiBUeXBlcykgeworICAgIHJldHVybiBhY3Rpb25Gb3IoTGVnYWxpemVBY3Rpb246OkN1c3RvbSwgVHlwZXMpOworICB9CisgIExlZ2FsaXplUnVsZVNldCAmY3VzdG9tRm9yQ2FydGVzaWFuUHJvZHVjdChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8TExUPiBUeXBlcykgeworICAgIHJldHVybiBhY3Rpb25Gb3JDYXJ0ZXNpYW5Qcm9kdWN0KExlZ2FsaXplQWN0aW9uOjpDdXN0b20sIFR5cGVzKTsKKyAgfQorICBMZWdhbGl6ZVJ1bGVTZXQgJgorICBjdXN0b21Gb3JDYXJ0ZXNpYW5Qcm9kdWN0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxMTFQ+IFR5cGVzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8TExUPiBUeXBlczEpIHsKKyAgICByZXR1cm4gYWN0aW9uRm9yQ2FydGVzaWFuUHJvZHVjdChMZWdhbGl6ZUFjdGlvbjo6Q3VzdG9tLCBUeXBlczAsIFR5cGVzMSk7CisgIH0KKworICAvLy8gV2lkZW4gdGhlIHNjYWxhciB0byB0aGUgbmV4dCBwb3dlciBvZiB0d28gdGhhdCBpcyBhdCBsZWFzdCBNaW5TaXplLgorICAvLy8gTm8gZWZmZWN0IGlmIHRoZSB0eXBlIGlzIG5vdCBhIHNjYWxhciBvciBpcyBhIHBvd2VyIG9mIHR3by4KKyAgTGVnYWxpemVSdWxlU2V0ICZ3aWRlblNjYWxhclRvTmV4dFBvdzIodW5zaWduZWQgVHlwZUlkeCwgdW5zaWduZWQgTWluU2l6ZSA9IDApIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgTGVnYWxpdHlQcmVkaWNhdGVzOworICAgIHJldHVybiB3aWRlblNjYWxhcklmKAorICAgICAgICBzaXplTm90UG93MihUeXBlSWR4KSwKKyAgICAgICAgTGVnYWxpemVNdXRhdGlvbnM6OndpZGVuU2NhbGFyVG9OZXh0UG93MihUeXBlSWR4LCBNaW5TaXplKSk7CisgIH0KKworICBMZWdhbGl6ZVJ1bGVTZXQgJm5hcnJvd1NjYWxhcih1bnNpZ25lZCBUeXBlSWR4LCBMZWdhbGl6ZU11dGF0aW9uIE11dGF0aW9uKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIExlZ2FsaXR5UHJlZGljYXRlczsKKyAgICByZXR1cm4gbmFycm93U2NhbGFySWYoaXNTY2FsYXIoVHlwZUlkeCksIE11dGF0aW9uKTsKKyAgfQorCisgIC8vLyBFbnN1cmUgdGhlIHNjYWxhciBpcyBhdCBsZWFzdCBhcyB3aWRlIGFzIFR5LgorICBMZWdhbGl6ZVJ1bGVTZXQgJm1pblNjYWxhcih1bnNpZ25lZCBUeXBlSWR4LCBjb25zdCBMTFQgJlR5KSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIExlZ2FsaXR5UHJlZGljYXRlczsKKyAgICB1c2luZyBuYW1lc3BhY2UgTGVnYWxpemVNdXRhdGlvbnM7CisgICAgcmV0dXJuIHdpZGVuU2NhbGFySWYobmFycm93ZXJUaGFuKFR5cGVJZHgsIFR5LmdldFNpemVJbkJpdHMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlVG8oVHlwZUlkeCwgVHkpKTsKKyAgfQorCisgIC8vLyBFbnN1cmUgdGhlIHNjYWxhciBpcyBhdCBtb3N0IGFzIHdpZGUgYXMgVHkuCisgIExlZ2FsaXplUnVsZVNldCAmbWF4U2NhbGFyKHVuc2lnbmVkIFR5cGVJZHgsIGNvbnN0IExMVCAmVHkpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgTGVnYWxpdHlQcmVkaWNhdGVzOworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl6ZU11dGF0aW9uczsKKyAgICByZXR1cm4gbmFycm93U2NhbGFySWYod2lkZXJUaGFuKFR5cGVJZHgsIFR5LmdldFNpemVJbkJpdHMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVRvKFR5cGVJZHgsIFR5KSk7CisgIH0KKworICAvLy8gQ29uZGl0aW9uYWxseSBsaW1pdCB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBzY2FsYXIuCisgIC8vLyBGb3IgZXhhbXBsZSwgd2hlbiB0aGUgbWF4aW11bSBzaXplIG9mIG9uZSB0eXBlIGRlcGVuZHMgb24gdGhlIHNpemUgb2YKKyAgLy8vIGFub3RoZXIgc3VjaCBhcyBleHRyYWN0aW5nIE4gYml0cyBmcm9tIGFuIE0gYml0IGNvbnRhaW5lci4KKyAgTGVnYWxpemVSdWxlU2V0ICZtYXhTY2FsYXJJZihMZWdhbGl0eVByZWRpY2F0ZSBQcmVkaWNhdGUsIHVuc2lnbmVkIFR5cGVJZHgsIGNvbnN0IExMVCAmVHkpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgTGVnYWxpdHlQcmVkaWNhdGVzOworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl6ZU11dGF0aW9uczsKKyAgICByZXR1cm4gbmFycm93U2NhbGFySWYoCisgICAgICAgIFs9XShjb25zdCBMZWdhbGl0eVF1ZXJ5ICZRdWVyeSkgeworICAgICAgICAgIHJldHVybiB3aWRlclRoYW4oVHlwZUlkeCwgVHkuZ2V0U2l6ZUluQml0cygpKSAmJgorICAgICAgICAgICAgICAgICBQcmVkaWNhdGUoUXVlcnkpOworICAgICAgICB9LAorICAgICAgICBjaGFuZ2VUbyhUeXBlSWR4LCBUeSkpOworICB9CisKKyAgLy8vIExpbWl0IHRoZSByYW5nZSBvZiBzY2FsYXIgc2l6ZXMgdG8gTWluVHkgYW5kIE1heFR5LgorICBMZWdhbGl6ZVJ1bGVTZXQgJmNsYW1wU2NhbGFyKHVuc2lnbmVkIFR5cGVJZHgsIGNvbnN0IExMVCAmTWluVHksIGNvbnN0IExMVCAmTWF4VHkpIHsKKyAgICBhc3NlcnQoTWluVHkuaXNTY2FsYXIoKSAmJiBNYXhUeS5pc1NjYWxhcigpICYmICJFeHBlY3RlZCBzY2FsYXIgdHlwZXMiKTsKKworICAgIHJldHVybiBtaW5TY2FsYXIoVHlwZUlkeCwgTWluVHkpCisgICAgICAgIC5tYXhTY2FsYXIoVHlwZUlkeCwgTWF4VHkpOworICB9CisKKyAgLy8vIEFkZCBtb3JlIGVsZW1lbnRzIHRvIHRoZSB2ZWN0b3IgdG8gcmVhY2ggdGhlIG5leHQgcG93ZXIgb2YgdHdvLgorICAvLy8gTm8gZWZmZWN0IGlmIHRoZSB0eXBlIGlzIG5vdCBhIHZlY3RvciBvciB0aGUgZWxlbWVudCBjb3VudCBpcyBhIHBvd2VyIG9mCisgIC8vLyB0d28uCisgIExlZ2FsaXplUnVsZVNldCAmbW9yZUVsZW1lbnRzVG9OZXh0UG93Mih1bnNpZ25lZCBUeXBlSWR4KSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIExlZ2FsaXR5UHJlZGljYXRlczsKKyAgICByZXR1cm4gbW9yZUVsZW1lbnRzSWYobnVtRWxlbWVudHNOb3RQb3cyKFR5cGVJZHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbGl6ZU11dGF0aW9uczo6bW9yZUVsZW1lbnRzVG9OZXh0UG93MihUeXBlSWR4KSk7CisgIH0KKworICAvLy8gTGltaXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBFbHRUeSB2ZWN0b3JzIHRvIGF0IGxlYXN0IE1pbkVsZW1lbnRzLgorICBMZWdhbGl6ZVJ1bGVTZXQgJmNsYW1wTWluTnVtRWxlbWVudHModW5zaWduZWQgVHlwZUlkeCwgY29uc3QgTExUICZFbHRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1pbkVsZW1lbnRzKSB7CisgICAgcmV0dXJuIG1vcmVFbGVtZW50c0lmKAorICAgICAgICBbPV0oY29uc3QgTGVnYWxpdHlRdWVyeSAmUXVlcnkpIHsKKyAgICAgICAgICBMTFQgVmVjVHkgPSBRdWVyeS5UeXBlc1tUeXBlSWR4XTsKKyAgICAgICAgICByZXR1cm4gVmVjVHkuZ2V0RWxlbWVudFR5cGUoKSA9PSBFbHRUeSAmJgorICAgICAgICAgICAgICAgICBWZWNUeS5nZXROdW1FbGVtZW50cygpIDwgTWluRWxlbWVudHM7CisgICAgICAgIH0sCisgICAgICAgIFs9XShjb25zdCBMZWdhbGl0eVF1ZXJ5ICZRdWVyeSkgeworICAgICAgICAgIExMVCBWZWNUeSA9IFF1ZXJ5LlR5cGVzW1R5cGVJZHhdOworICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgVHlwZUlkeCwgTExUOjp2ZWN0b3IoTWluRWxlbWVudHMsIFZlY1R5LmdldFNjYWxhclNpemVJbkJpdHMoKSkpOworICAgICAgICB9KTsKKyAgfQorICAvLy8gTGltaXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBFbHRUeSB2ZWN0b3JzIHRvIGF0IG1vc3QgTWF4RWxlbWVudHMuCisgIExlZ2FsaXplUnVsZVNldCAmY2xhbXBNYXhOdW1FbGVtZW50cyh1bnNpZ25lZCBUeXBlSWR4LCBjb25zdCBMTFQgJkVsdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4RWxlbWVudHMpIHsKKyAgICByZXR1cm4gZmV3ZXJFbGVtZW50c0lmKAorICAgICAgICBbPV0oY29uc3QgTGVnYWxpdHlRdWVyeSAmUXVlcnkpIHsKKyAgICAgICAgICBMTFQgVmVjVHkgPSBRdWVyeS5UeXBlc1tUeXBlSWR4XTsKKyAgICAgICAgICByZXR1cm4gVmVjVHkuZ2V0RWxlbWVudFR5cGUoKSA9PSBFbHRUeSAmJgorICAgICAgICAgICAgICAgICBWZWNUeS5nZXROdW1FbGVtZW50cygpID4gTWF4RWxlbWVudHM7CisgICAgICAgIH0sCisgICAgICAgIFs9XShjb25zdCBMZWdhbGl0eVF1ZXJ5ICZRdWVyeSkgeworICAgICAgICAgIExMVCBWZWNUeSA9IFF1ZXJ5LlR5cGVzW1R5cGVJZHhdOworICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgVHlwZUlkeCwgTExUOjp2ZWN0b3IoTWF4RWxlbWVudHMsIFZlY1R5LmdldFNjYWxhclNpemVJbkJpdHMoKSkpOworICAgICAgICB9KTsKKyAgfQorICAvLy8gTGltaXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBmb3IgdGhlIGdpdmVuIHZlY3RvcnMgdG8gYXQgbGVhc3QgTWluVHkncworICAvLy8gbnVtYmVyIG9mIGVsZW1lbnRzIGFuZCBhdCBtb3N0IE1heFR5J3MgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAvLy8KKyAgLy8vIE5vIGVmZmVjdCBpZiB0aGUgdHlwZSBpcyBub3QgYSB2ZWN0b3Igb3IgZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSBlbGVtZW50CisgIC8vLyB0eXBlIGFzIHRoZSBjb25zdHJhaW50cy4KKyAgLy8vIFRoZSBlbGVtZW50IHR5cGUgb2YgTWluVHkgYW5kIE1heFR5IG11c3QgbWF0Y2guCisgIExlZ2FsaXplUnVsZVNldCAmY2xhbXBOdW1FbGVtZW50cyh1bnNpZ25lZCBUeXBlSWR4LCBjb25zdCBMTFQgJk1pblR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTExUICZNYXhUeSkgeworICAgIGFzc2VydChNaW5UeS5nZXRFbGVtZW50VHlwZSgpID09IE1heFR5LmdldEVsZW1lbnRUeXBlKCkgJiYKKyAgICAgICAgICAgIkV4cGVjdGVkIGVsZW1lbnQgdHlwZXMgdG8gYWdyZWUiKTsKKworICAgIGNvbnN0IExMVCAmRWx0VHkgPSBNaW5UeS5nZXRFbGVtZW50VHlwZSgpOworICAgIHJldHVybiBjbGFtcE1pbk51bUVsZW1lbnRzKFR5cGVJZHgsIEVsdFR5LCBNaW5UeS5nZXROdW1FbGVtZW50cygpKQorICAgICAgICAuY2xhbXBNYXhOdW1FbGVtZW50cyhUeXBlSWR4LCBFbHRUeSwgTWF4VHkuZ2V0TnVtRWxlbWVudHMoKSk7CisgIH0KKworICAvLy8gRmFsbGJhY2sgb24gdGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uLiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hpbGUKKyAgLy8vIHBvcnRpbmcgYSBydWxlLgorICBMZWdhbGl6ZVJ1bGVTZXQgJmZhbGxiYWNrKCkgeworICAgIGFkZCh7YWx3YXlzLCBMZWdhbGl6ZUFjdGlvbjo6VXNlTGVnYWN5UnVsZXN9KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gQXBwbHkgdGhlIHJ1bGVzZXQgdG8gdGhlIGdpdmVuIExlZ2FsaXR5UXVlcnkuCisgIExlZ2FsaXplQWN0aW9uU3RlcCBhcHBseShjb25zdCBMZWdhbGl0eVF1ZXJ5ICZRdWVyeSkgY29uc3Q7Cit9OworCitjbGFzcyBMZWdhbGl6ZXJJbmZvIHsKK3B1YmxpYzoKKyAgTGVnYWxpemVySW5mbygpOworICB2aXJ0dWFsIH5MZWdhbGl6ZXJJbmZvKCkgPSBkZWZhdWx0OworCisgIHVuc2lnbmVkIGdldE9wY29kZUlkeEZvck9wY29kZSh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0OworICB1bnNpZ25lZCBnZXRBY3Rpb25EZWZpbml0aW9uc0lkeCh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0OworCisgIC8vLyBDb21wdXRlIGFueSBhbmNpbGxhcnkgdGFibGVzIG5lZWRlZCB0byBxdWlja2x5IGRlY2lkZSBob3cgYW4gb3BlcmF0aW9uCisgIC8vLyBzaG91bGQgYmUgaGFuZGxlZC4gVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBhbGwgInNldCpBY3Rpb24ibWV0aG9kcyBidXQKKyAgLy8vIGJlZm9yZSBhbnkgcXVlcnkgaXMgbWFkZSBvciBpbmNvcnJlY3QgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuCisgIHZvaWQgY29tcHV0ZVRhYmxlcygpOworCisgIHN0YXRpYyBib29sIG5lZWRzTGVnYWxpemluZ1RvRGlmZmVyZW50U2l6ZShjb25zdCBMZWdhbGl6ZUFjdGlvbiBBY3Rpb24pIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgTGVnYWxpemVBY3Rpb25zOworICAgIHN3aXRjaCAoQWN0aW9uKSB7CisgICAgY2FzZSBOYXJyb3dTY2FsYXI6CisgICAgY2FzZSBXaWRlblNjYWxhcjoKKyAgICBjYXNlIEZld2VyRWxlbWVudHM6CisgICAgY2FzZSBNb3JlRWxlbWVudHM6CisgICAgY2FzZSBVbnN1cHBvcnRlZDoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgdXNpbmcgU2l6ZUFuZEFjdGlvbiA9IHN0ZDo6cGFpcjx1aW50MTZfdCwgTGVnYWxpemVBY3Rpb24+OworICB1c2luZyBTaXplQW5kQWN0aW9uc1ZlYyA9IHN0ZDo6dmVjdG9yPFNpemVBbmRBY3Rpb24+OworICB1c2luZyBTaXplQ2hhbmdlU3RyYXRlZ3kgPQorICAgICAgc3RkOjpmdW5jdGlvbjxTaXplQW5kQWN0aW9uc1ZlYyhjb25zdCBTaXplQW5kQWN0aW9uc1ZlYyAmdik+OworCisgIC8vLyBNb3JlIGZyaWVuZGx5IHdheSB0byBzZXQgYW4gYWN0aW9uIGZvciBjb21tb24gdHlwZXMgdGhhdCBoYXZlIGFuIExMVAorICAvLy8gcmVwcmVzZW50YXRpb24uCisgIC8vLyBUaGUgTGVnYWxpemVBY3Rpb24gbXVzdCBiZSBvbmUgZm9yIHdoaWNoIE5lZWRzTGVnYWxpemluZ1RvRGlmZmVyZW50U2l6ZQorICAvLy8gcmV0dXJucyBmYWxzZS4KKyAgdm9pZCBzZXRBY3Rpb24oY29uc3QgSW5zdHJBc3BlY3QgJkFzcGVjdCwgTGVnYWxpemVBY3Rpb24gQWN0aW9uKSB7CisgICAgYXNzZXJ0KCFuZWVkc0xlZ2FsaXppbmdUb0RpZmZlcmVudFNpemUoQWN0aW9uKSk7CisgICAgVGFibGVzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBjb25zdCB1bnNpZ25lZCBPcGNvZGVJZHggPSBBc3BlY3QuT3Bjb2RlIC0gRmlyc3RPcDsKKyAgICBpZiAoU3BlY2lmaWVkQWN0aW9uc1tPcGNvZGVJZHhdLnNpemUoKSA8PSBBc3BlY3QuSWR4KQorICAgICAgU3BlY2lmaWVkQWN0aW9uc1tPcGNvZGVJZHhdLnJlc2l6ZShBc3BlY3QuSWR4ICsgMSk7CisgICAgU3BlY2lmaWVkQWN0aW9uc1tPcGNvZGVJZHhdW0FzcGVjdC5JZHhdW0FzcGVjdC5UeXBlXSA9IEFjdGlvbjsKKyAgfQorCisgIC8vLyBUaGUgc2V0QWN0aW9uIGNhbGxzIHJlY29yZCB0aGUgbm9uLXNpemUtY2hhbmdpbmcgbGVnYWxpemF0aW9uIGFjdGlvbnMKKyAgLy8vIHRvIHRha2Ugb24gc3BlY2lmaWNseS1zaXplZCB0eXBlcy4gVGhlIFNpemVDaGFuZ2VTdHJhdGVneSBkZWZpbmVzIHdoYXQKKyAgLy8vIHRvIGRvIHdoZW4gdGhlIHNpemUgb2YgdGhlIHR5cGUgbmVlZHMgdG8gYmUgY2hhbmdlZCB0byByZWFjaCBhIGxlZ2FsbHkKKyAgLy8vIHNpemVkIHR5cGUgKGkuZS4sIG9uZSB0aGF0IHdhcyBkZWZpbmVkIHRocm91Z2ggYSBzZXRBY3Rpb24gY2FsbCkuCisgIC8vLyBlLmcuCisgIC8vLyBzZXRBY3Rpb24gKHtHX0FERCwgMCwgTExUOjpzY2FsYXIoMzIpfSwgTGVnYWwpOworICAvLy8gc2V0TGVnYWxpemVTY2FsYXJUb0RpZmZlcmVudFNpemVTdHJhdGVneSgKKyAgLy8vICAgR19BREQsIDAsIHdpZGVuVG9MYXJnZXJUeXBlc0FuZE5hcnJvd1RvTGFyZ2VzdCk7CisgIC8vLyB3aWxsIGVuZCB1cCBkZWZpbmluZyBnZXRBY3Rpb24oe0dfQURELCAwLCBUfSkgdG8gcmV0dXJuIHRoZSBmb2xsb3dpbmcgCisgIC8vLyBhY3Rpb25zIGZvciBkaWZmZXJlbnQgc2NhbGFyIHR5cGVzIFQ6CisgIC8vLyAgTExUOjpzY2FsYXIoMSkuLkxMVDo6c2NhbGFyKDMxKToge1dpZGVuU2NhbGFyLCAwLCBMTFQ6OnNjYWxhcigzMil9CisgIC8vLyAgTExUOjpzY2FsYXIoMzIpOiAgICAgICAgICAgICAgICAge0xlZ2FsLCAwLCBMTFQ6OnNjYWxhcigzMil9CisgIC8vLyAgTExUOjpzY2FsYXIoMzMpLi46ICAgICAgICAgICAgICAge05hcnJvd1NjYWxhciwgMCwgTExUOjpzY2FsYXIoMzIpfQorICAvLy8KKyAgLy8vIElmIG5vIFNpemVDaGFuZ2VBY3Rpb24gZ2V0cyBkZWZpbmVkLCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24sCisgIC8vLyB0aGUgZGVmYXVsdCBpcyB1bnN1cHBvcnRlZEZvckRpZmZlcmVudFNpemVzLgorICB2b2lkIHNldExlZ2FsaXplU2NhbGFyVG9EaWZmZXJlbnRTaXplU3RyYXRlZ3koY29uc3QgdW5zaWduZWQgT3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgVHlwZUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemVDaGFuZ2VTdHJhdGVneSBTKSB7CisgICAgY29uc3QgdW5zaWduZWQgT3Bjb2RlSWR4ID0gT3Bjb2RlIC0gRmlyc3RPcDsKKyAgICBpZiAoU2NhbGFyU2l6ZUNoYW5nZVN0cmF0ZWdpZXNbT3Bjb2RlSWR4XS5zaXplKCkgPD0gVHlwZUlkeCkKKyAgICAgIFNjYWxhclNpemVDaGFuZ2VTdHJhdGVnaWVzW09wY29kZUlkeF0ucmVzaXplKFR5cGVJZHggKyAxKTsKKyAgICBTY2FsYXJTaXplQ2hhbmdlU3RyYXRlZ2llc1tPcGNvZGVJZHhdW1R5cGVJZHhdID0gUzsKKyAgfQorCisgIC8vLyBTZWUgYWxzbyBzZXRMZWdhbGl6ZVNjYWxhclRvRGlmZmVyZW50U2l6ZVN0cmF0ZWd5LgorICAvLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gc2V0IHRoZSBTaXplQ2hhbmdlU3RyYXRlZ3kgZm9yIHZlY3RvciBlbGVtZW50cy4KKyAgdm9pZCBzZXRMZWdhbGl6ZVZlY3RvckVsZW1lbnRUb0RpZmZlcmVudFNpemVTdHJhdGVneShjb25zdCB1bnNpZ25lZCBPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgVHlwZUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplQ2hhbmdlU3RyYXRlZ3kgUykgeworICAgIGNvbnN0IHVuc2lnbmVkIE9wY29kZUlkeCA9IE9wY29kZSAtIEZpcnN0T3A7CisgICAgaWYgKFZlY3RvckVsZW1lbnRTaXplQ2hhbmdlU3RyYXRlZ2llc1tPcGNvZGVJZHhdLnNpemUoKSA8PSBUeXBlSWR4KQorICAgICAgVmVjdG9yRWxlbWVudFNpemVDaGFuZ2VTdHJhdGVnaWVzW09wY29kZUlkeF0ucmVzaXplKFR5cGVJZHggKyAxKTsKKyAgICBWZWN0b3JFbGVtZW50U2l6ZUNoYW5nZVN0cmF0ZWdpZXNbT3Bjb2RlSWR4XVtUeXBlSWR4XSA9IFM7CisgIH0KKworICAvLy8gQSBTaXplQ2hhbmdlU3RyYXRlZ3kgZm9yIHRoZSBjb21tb24gY2FzZSB3aGVyZSBsZWdhbGl6YXRpb24gZm9yIGEgCisgIC8vLyBwYXJ0aWN1bGFyIG9wZXJhdGlvbiBjb25zaXN0cyBvZiBvbmx5IHN1cHBvcnRpbmcgYSBzcGVjaWZpYyBzZXQgb2YgdHlwZQorICAvLy8gc2l6ZXMuIEUuZy4KKyAgLy8vICAgc2V0QWN0aW9uICh7R19ESVYsIDAsIExMVDo6c2NhbGFyKDMyKX0sIExlZ2FsKTsKKyAgLy8vICAgc2V0QWN0aW9uICh7R19ESVYsIDAsIExMVDo6c2NhbGFyKDY0KX0sIExlZ2FsKTsKKyAgLy8vICAgc2V0TGVnYWxpemVTY2FsYXJUb0RpZmZlcmVudFNpemVTdHJhdGVneSgKKyAgLy8vICAgICBHX0RJViwgMCwgdW5zdXBwb3J0ZWRGb3JEaWZmZXJlbnRTaXplcyk7CisgIC8vLyB3aWxsIHJlc3VsdCBpbiBnZXRBY3Rpb24oe0dfRElWLCAwLCBUfSkgdG8gcmV0dXJuIExlZ2FsIGZvciBzMzIgYW5kIHM2NCwKKyAgLy8vIGFuZCBVbnN1cHBvcnRlZCBmb3IgYWxsIG90aGVyIHNjYWxhciB0eXBlcyBULgorICBzdGF0aWMgU2l6ZUFuZEFjdGlvbnNWZWMKKyAgdW5zdXBwb3J0ZWRGb3JEaWZmZXJlbnRTaXplcyhjb25zdCBTaXplQW5kQWN0aW9uc1ZlYyAmdikgeworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl6ZUFjdGlvbnM7CisgICAgcmV0dXJuIGluY3JlYXNlVG9MYXJnZXJUeXBlc0FuZERlY3JlYXNlVG9MYXJnZXN0KHYsIFVuc3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnN1cHBvcnRlZCk7CisgIH0KKworICAvLy8gQSBTaXplQ2hhbmdlU3RyYXRlZ3kgZm9yIHRoZSBjb21tb24gY2FzZSB3aGVyZSBsZWdhbGl6YXRpb24gZm9yIGEKKyAgLy8vIHBhcnRpY3VsYXIgb3BlcmF0aW9uIGNvbnNpc3RzIG9mIHdpZGVuaW5nIHRoZSB0eXBlIHRvIGEgbGFyZ2UgbGVnYWwgdHlwZSwKKyAgLy8vIHVubGVzcyB0aGVyZSBpcyBubyBzdWNoIHR5cGUgYW5kIHRoZW4gaW5zdGVhZCBpdCBzaG91bGQgYmUgbmFycm93ZWQgdG8gdGhlCisgIC8vLyBsYXJnZXN0IGxlZ2FsIHR5cGUuCisgIHN0YXRpYyBTaXplQW5kQWN0aW9uc1ZlYworICB3aWRlblRvTGFyZ2VyVHlwZXNBbmROYXJyb3dUb0xhcmdlc3QoY29uc3QgU2l6ZUFuZEFjdGlvbnNWZWMgJnYpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgTGVnYWxpemVBY3Rpb25zOworICAgIGFzc2VydCh2LnNpemUoKSA+IDAgJiYKKyAgICAgICAgICAgIkF0IGxlYXN0IG9uZSBzaXplIHRoYXQgY2FuIGJlIGxlZ2FsaXplZCB0b3dhcmRzIGlzIG5lZWRlZCIKKyAgICAgICAgICAgIiBmb3IgdGhpcyBTaXplQ2hhbmdlU3RyYXRlZ3kiKTsKKyAgICByZXR1cm4gaW5jcmVhc2VUb0xhcmdlclR5cGVzQW5kRGVjcmVhc2VUb0xhcmdlc3QodiwgV2lkZW5TY2FsYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hcnJvd1NjYWxhcik7CisgIH0KKworICBzdGF0aWMgU2l6ZUFuZEFjdGlvbnNWZWMKKyAgd2lkZW5Ub0xhcmdlclR5cGVzVW5zdXBwb3J0ZWRPdGhlcndpc2UoY29uc3QgU2l6ZUFuZEFjdGlvbnNWZWMgJnYpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgTGVnYWxpemVBY3Rpb25zOworICAgIHJldHVybiBpbmNyZWFzZVRvTGFyZ2VyVHlwZXNBbmREZWNyZWFzZVRvTGFyZ2VzdCh2LCBXaWRlblNjYWxhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5zdXBwb3J0ZWQpOworICB9CisKKyAgc3RhdGljIFNpemVBbmRBY3Rpb25zVmVjCisgIG5hcnJvd1RvU21hbGxlckFuZFVuc3VwcG9ydGVkSWZUb29TbWFsbChjb25zdCBTaXplQW5kQWN0aW9uc1ZlYyAmdikgeworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl6ZUFjdGlvbnM7CisgICAgcmV0dXJuIGRlY3JlYXNlVG9TbWFsbGVyVHlwZXNBbmRJbmNyZWFzZVRvU21hbGxlc3QodiwgTmFycm93U2NhbGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuc3VwcG9ydGVkKTsKKyAgfQorCisgIHN0YXRpYyBTaXplQW5kQWN0aW9uc1ZlYworICBuYXJyb3dUb1NtYWxsZXJBbmRXaWRlblRvU21hbGxlc3QoY29uc3QgU2l6ZUFuZEFjdGlvbnNWZWMgJnYpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgTGVnYWxpemVBY3Rpb25zOworICAgIGFzc2VydCh2LnNpemUoKSA+IDAgJiYKKyAgICAgICAgICAgIkF0IGxlYXN0IG9uZSBzaXplIHRoYXQgY2FuIGJlIGxlZ2FsaXplZCB0b3dhcmRzIGlzIG5lZWRlZCIKKyAgICAgICAgICAgIiBmb3IgdGhpcyBTaXplQ2hhbmdlU3RyYXRlZ3kiKTsKKyAgICByZXR1cm4gZGVjcmVhc2VUb1NtYWxsZXJUeXBlc0FuZEluY3JlYXNlVG9TbWFsbGVzdCh2LCBOYXJyb3dTY2FsYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZW5TY2FsYXIpOworICB9CisKKyAgLy8vIEEgU2l6ZUNoYW5nZVN0cmF0ZWd5IGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgbGVnYWxpemF0aW9uIGZvciBhCisgIC8vLyBwYXJ0aWN1bGFyIHZlY3RvciBvcGVyYXRpb24gY29uc2lzdHMgb2YgaGF2aW5nIG1vcmUgZWxlbWVudHMgaW4gdGhlCisgIC8vLyB2ZWN0b3IsIHRvIGEgdHlwZSB0aGF0IGlzIGxlZ2FsLiBVbmxlc3MgdGhlcmUgaXMgbm8gc3VjaCB0eXBlIGFuZCB0aGVuCisgIC8vLyBpbnN0ZWFkIGl0IHNob3VsZCBiZSBsZWdhbGl6ZWQgdG93YXJkcyB0aGUgd2lkZXN0IHZlY3RvciB0aGF0J3Mgc3RpbGwKKyAgLy8vIGxlZ2FsLiBFLmcuCisgIC8vLyAgIHNldEFjdGlvbih7R19BREQsIExMVDo6dmVjdG9yKDgsIDgpfSwgTGVnYWwpOworICAvLy8gICBzZXRBY3Rpb24oe0dfQURELCBMTFQ6OnZlY3RvcigxNiwgOCl9LCBMZWdhbCk7CisgIC8vLyAgIHNldEFjdGlvbih7R19BREQsIExMVDo6dmVjdG9yKDIsIDMyKX0sIExlZ2FsKTsKKyAgLy8vICAgc2V0QWN0aW9uKHtHX0FERCwgTExUOjp2ZWN0b3IoNCwgMzIpfSwgTGVnYWwpOworICAvLy8gICBzZXRMZWdhbGl6ZVZlY3RvckVsZW1lbnRUb0RpZmZlcmVudFNpemVTdHJhdGVneSgKKyAgLy8vICAgICBHX0FERCwgMCwgbW9yZVRvV2lkZXJUeXBlc0FuZExlc3NUb1dpZGVzdCk7CisgIC8vLyB3aWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGdldEFjdGlvbiByZXN1bHRzOgorICAvLy8gICAqIGdldEFjdGlvbih7R19BREQsIExMVDo6dmVjdG9yKDgsOCl9KSByZXR1cm5zCisgIC8vLyAgICAgICAoTGVnYWwsIHZlY3Rvcig4LDgpKS4KKyAgLy8vICAgKiBnZXRBY3Rpb24oe0dfQURELCBMTFQ6OnZlY3Rvcig5LDgpfSkgcmV0dXJucworICAvLy8gICAgICAgKE1vcmVFbGVtZW50cywgdmVjdG9yKDE2LDgpKS4KKyAgLy8vICAgKiBnZXRBY3Rpb24oe0dfQURELCBMTFQ6OnZlY3Rvcig4LDMyKX0pIHJldHVybnMKKyAgLy8vICAgICAgIChGZXdlckVsZW1lbnRzLCB2ZWN0b3IoNCwzMikpLgorICBzdGF0aWMgU2l6ZUFuZEFjdGlvbnNWZWMKKyAgbW9yZVRvV2lkZXJUeXBlc0FuZExlc3NUb1dpZGVzdChjb25zdCBTaXplQW5kQWN0aW9uc1ZlYyAmdikgeworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl6ZUFjdGlvbnM7CisgICAgcmV0dXJuIGluY3JlYXNlVG9MYXJnZXJUeXBlc0FuZERlY3JlYXNlVG9MYXJnZXN0KHYsIE1vcmVFbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmV3ZXJFbGVtZW50cyk7CisgIH0KKworICAvLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGltcGxlbWVudCBtYW55IHR5cGljYWwgU2l6ZUNoYW5nZVN0cmF0ZWd5IGZ1bmN0aW9ucy4KKyAgc3RhdGljIFNpemVBbmRBY3Rpb25zVmVjCisgIGluY3JlYXNlVG9MYXJnZXJUeXBlc0FuZERlY3JlYXNlVG9MYXJnZXN0KGNvbnN0IFNpemVBbmRBY3Rpb25zVmVjICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbGl6ZUFjdGlvbiBJbmNyZWFzZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxpemVBY3Rpb24gRGVjcmVhc2VBY3Rpb24pOworICAvLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGltcGxlbWVudCBtYW55IHR5cGljYWwgU2l6ZUNoYW5nZVN0cmF0ZWd5IGZ1bmN0aW9ucy4KKyAgc3RhdGljIFNpemVBbmRBY3Rpb25zVmVjCisgIGRlY3JlYXNlVG9TbWFsbGVyVHlwZXNBbmRJbmNyZWFzZVRvU21hbGxlc3QoY29uc3QgU2l6ZUFuZEFjdGlvbnNWZWMgJnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxpemVBY3Rpb24gRGVjcmVhc2VBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxpemVBY3Rpb24gSW5jcmVhc2VBY3Rpb24pOworCisgIC8vLyBHZXQgdGhlIGFjdGlvbiBkZWZpbml0aW9ucyBmb3IgdGhlIGdpdmVuIG9wY29kZS4gVXNlIHRoaXMgdG8gcnVuIGEKKyAgLy8vIExlZ2FsaXR5UXVlcnkgdGhyb3VnaCB0aGUgZGVmaW5pdGlvbnMuCisgIGNvbnN0IExlZ2FsaXplUnVsZVNldCAmZ2V0QWN0aW9uRGVmaW5pdGlvbnModW5zaWduZWQgT3Bjb2RlKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBhY3Rpb24gZGVmaW5pdGlvbiBidWlsZGVyIGZvciB0aGUgZ2l2ZW4gb3Bjb2RlLiBVc2UgdGhpcyB0byBkZWZpbmUKKyAgLy8vIHRoZSBhY3Rpb24gZGVmaW5pdGlvbnMuCisgIC8vLworICAvLy8gSXQgaXMgYW4gZXJyb3IgdG8gcmVxdWVzdCBhbiBvcGNvZGUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZCBieSB0aGUKKyAgLy8vIG11bHRpcGxlLW9wY29kZSB2YXJpYW50LgorICBMZWdhbGl6ZVJ1bGVTZXQgJmdldEFjdGlvbkRlZmluaXRpb25zQnVpbGRlcih1bnNpZ25lZCBPcGNvZGUpOworCisgIC8vLyBHZXQgdGhlIGFjdGlvbiBkZWZpbml0aW9uIGJ1aWxkZXIgZm9yIHRoZSBnaXZlbiBzZXQgb2Ygb3Bjb2Rlcy4gVXNlIHRoaXMKKyAgLy8vIHRvIGRlZmluZSB0aGUgYWN0aW9uIGRlZmluaXRpb25zIGZvciBtdWx0aXBsZSBvcGNvZGVzIGF0IG9uY2UuIFRoZSBmaXJzdAorICAvLy8gb3Bjb2RlIGdpdmVuIHdpbGwgYmUgY29uc2lkZXJlZCB0aGUgcmVwcmVzZW50YXRpdmUgb3Bjb2RlIGFuZCB3aWxsIGhvbGQKKyAgLy8vIHRoZSBkZWZpbml0aW9ucyB3aGVyZWFzIHRoZSBvdGhlciBvcGNvZGVzIHdpbGwgYmUgY29uZmlndXJlZCB0byByZWZlciB0bworICAvLy8gdGhlIHJlcHJlc2VudGF0aXZlIG9wY29kZS4gVGhpcyBsb3dlcnMgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgdmVyeQorICAvLy8gc2xpZ2h0bHkgaW1wcm92ZXMgcGVyZm9ybWFuY2UuCisgIC8vLworICAvLy8gSXQgd291bGQgYmUgdmVyeSBlYXN5IHRvIGludHJvZHVjZSB1bmV4cGVjdGVkIHNpZGUtZWZmZWN0cyBhcyBhIHJlc3VsdCBvZgorICAvLy8gdGhpcyBhbGlhc2luZyBpZiBpdCB3ZXJlIHBlcm1pdHRlZCB0byByZXF1ZXN0IGRpZmZlcmVudCBidXQgaW50ZXJzZWN0aW5nCisgIC8vLyBzZXRzIG9mIG9wY29kZXMgYnV0IHRoYXQgaXMgZGlmZmljdWx0IHRvIGtlZXAgdHJhY2sgb2YuIEl0IGlzIHRoZXJlZm9yZSBhbgorICAvLy8gZXJyb3IgdG8gcmVxdWVzdCB0aGUgc2FtZSBvcGNvZGUgdHdpY2UgdXNpbmcgdGhpcyBBUEksIHRvIHJlcXVlc3QgYW4KKyAgLy8vIG9wY29kZSB0aGF0IGFscmVhZHkgaGFzIGRlZmluaXRpb25zLCBvciB0byB1c2UgdGhlIHNpbmdsZS1vcGNvZGUgQVBJIG9uIGFuCisgIC8vLyBvcGNvZGUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZCBieSB0aGlzIEFQSS4KKyAgTGVnYWxpemVSdWxlU2V0ICYKKyAgZ2V0QWN0aW9uRGVmaW5pdGlvbnNCdWlsZGVyKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx1bnNpZ25lZD4gT3Bjb2Rlcyk7CisgIHZvaWQgYWxpYXNBY3Rpb25EZWZpbml0aW9ucyh1bnNpZ25lZCBPcGNvZGVUbywgdW5zaWduZWQgT3Bjb2RlRnJvbSk7CisKKyAgLy8vIERldGVybWluZSB3aGF0IGFjdGlvbiBzaG91bGQgYmUgdGFrZW4gdG8gbGVnYWxpemUgdGhlIGRlc2NyaWJlZAorICAvLy8gaW5zdHJ1Y3Rpb24uIFJlcXVpcmVzIGNvbXB1dGVUYWJsZXMgdG8gaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBuZXh0IGxlZ2FsaXphdGlvbiBzdGVwIHRvIHBlcmZvcm0uCisgIExlZ2FsaXplQWN0aW9uU3RlcCBnZXRBY3Rpb24oY29uc3QgTGVnYWxpdHlRdWVyeSAmUXVlcnkpIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgd2hhdCBhY3Rpb24gc2hvdWxkIGJlIHRha2VuIHRvIGxlZ2FsaXplIHRoZSBnaXZlbiBnZW5lcmljCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBuZXh0IGxlZ2FsaXphdGlvbiBzdGVwIHRvIHBlcmZvcm0uCisgIExlZ2FsaXplQWN0aW9uU3RlcCBnZXRBY3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkkpIGNvbnN0OworCisgIGJvb2wgaXNMZWdhbChjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkkpIGNvbnN0OworCisgIHZpcnR1YWwgYm9vbCBsZWdhbGl6ZUN1c3RvbShNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgY29uc3Q7CisKK3ByaXZhdGU6CisgIC8vLyBEZXRlcm1pbmUgd2hhdCBhY3Rpb24gc2hvdWxkIGJlIHRha2VuIHRvIGxlZ2FsaXplIHRoZSBnaXZlbiBnZW5lcmljCisgIC8vLyBpbnN0cnVjdGlvbiBvcGNvZGUsIHR5cGUtaW5kZXggYW5kIHR5cGUuIFJlcXVpcmVzIGNvbXB1dGVUYWJsZXMgdG8gaGF2ZQorICAvLy8gYmVlbiBjYWxsZWQuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBwYWlyIGNvbnNpc3Rpbmcgb2YgdGhlIGtpbmQgb2YgbGVnYWxpemF0aW9uIHRoYXQgc2hvdWxkIGJlCisgIC8vLyBwZXJmb3JtZWQgYW5kIHRoZSBkZXN0aW5hdGlvbiB0eXBlLgorICBzdGQ6OnBhaXI8TGVnYWxpemVBY3Rpb24sIExMVD4KKyAgZ2V0QXNwZWN0QWN0aW9uKGNvbnN0IEluc3RyQXNwZWN0ICZBc3BlY3QpIGNvbnN0OworCisgIC8vLyBUaGUgU2l6ZUFuZEFjdGlvbnNWZWMgaXMgYSByZXByZXNlbnRhdGlvbiBtYXBwaW5nIGJldHdlZW4gYWxsIG5hdHVyYWwKKyAgLy8vIG51bWJlcnMgYW5kIGFuIEFjdGlvbi4gVGhlIG5hdHVyYWwgbnVtYmVyIHJlcHJlc2VudHMgdGhlIGJpdCBzaXplIG9mCisgIC8vLyB0aGUgSW5zdHJBc3BlY3QuIEZvciBleGFtcGxlLCBmb3IgYSB0YXJnZXQgd2l0aCBuYXRpdmUgc3VwcG9ydCBmb3IgMzItYml0CisgIC8vLyBhbmQgNjQtYml0IGFkZGl0aW9ucywgeW91J2QgZXhwcmVzcyB0aGF0IGFzOgorICAvLy8gc2V0U2NhbGFyQWN0aW9uKEdfQURELCAwLAorICAvLy8gICAgICAgICAgIHt7MSwgV2lkZW5TY2FsYXJ9LCAgLy8gYml0IHNpemVzIFsgMSwgMzFbCisgIC8vLyAgICAgICAgICAgIHszMiwgTGVnYWx9LCAgICAgICAvLyBiaXQgc2l6ZXMgWzMyLCAzM1sKKyAgLy8vICAgICAgICAgICAgezMzLCBXaWRlblNjYWxhcn0sIC8vIGJpdCBzaXplcyBbMzMsIDY0WworICAvLy8gICAgICAgICAgICB7NjQsIExlZ2FsfSwgICAgICAgLy8gYml0IHNpemVzIFs2NCwgNjVbCisgIC8vLyAgICAgICAgICAgIHs2NSwgTmFycm93U2NhbGFyfSAvLyBiaXQgc2l6ZXMgWzY1LCAraW5mWworICAvLy8gICAgICAgICAgIH0pOworICAvLy8gSXQgbWF5IGJlIHRoYXQgb25seSA2NC1iaXQgcG9pbnRlcnMgYXJlIHN1cHBvcnRlZCBvbiB5b3VyIHRhcmdldDoKKyAgLy8vIHNldFBvaW50ZXJBY3Rpb24oR19HRVAsIDAsIExMVDpwb2ludGVyKDEpLAorICAvLy8gICAgICAgICAgIHt7MSwgVW5zdXBwb3J0ZWR9LCAgLy8gYml0IHNpemVzIFsgMSwgNjNbCisgIC8vLyAgICAgICAgICAgIHs2NCwgTGVnYWx9LCAgICAgICAvLyBiaXQgc2l6ZXMgWzY0LCA2NVsKKyAgLy8vICAgICAgICAgICAgezY1LCBVbnN1cHBvcnRlZH0sIC8vIGJpdCBzaXplcyBbNjUsICtpbmZbCisgIC8vLyAgICAgICAgICAgfSk7CisgIHZvaWQgc2V0U2NhbGFyQWN0aW9uKGNvbnN0IHVuc2lnbmVkIE9wY29kZSwgY29uc3QgdW5zaWduZWQgVHlwZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaXplQW5kQWN0aW9uc1ZlYyAmU2l6ZUFuZEFjdGlvbnMpIHsKKyAgICBjb25zdCB1bnNpZ25lZCBPcGNvZGVJZHggPSBPcGNvZGUgLSBGaXJzdE9wOworICAgIFNtYWxsVmVjdG9yPFNpemVBbmRBY3Rpb25zVmVjLCAxPiAmQWN0aW9ucyA9IFNjYWxhckFjdGlvbnNbT3Bjb2RlSWR4XTsKKyAgICBzZXRBY3Rpb25zKFR5cGVJbmRleCwgQWN0aW9ucywgU2l6ZUFuZEFjdGlvbnMpOworICB9CisgIHZvaWQgc2V0UG9pbnRlckFjdGlvbihjb25zdCB1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IHVuc2lnbmVkIFR5cGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIEFkZHJlc3NTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpemVBbmRBY3Rpb25zVmVjICZTaXplQW5kQWN0aW9ucykgeworICAgIGNvbnN0IHVuc2lnbmVkIE9wY29kZUlkeCA9IE9wY29kZSAtIEZpcnN0T3A7CisgICAgaWYgKEFkZHJTcGFjZTJQb2ludGVyQWN0aW9uc1tPcGNvZGVJZHhdLmZpbmQoQWRkcmVzc1NwYWNlKSA9PQorICAgICAgICBBZGRyU3BhY2UyUG9pbnRlckFjdGlvbnNbT3Bjb2RlSWR4XS5lbmQoKSkKKyAgICAgIEFkZHJTcGFjZTJQb2ludGVyQWN0aW9uc1tPcGNvZGVJZHhdW0FkZHJlc3NTcGFjZV0gPSB7e319OworICAgIFNtYWxsVmVjdG9yPFNpemVBbmRBY3Rpb25zVmVjLCAxPiAmQWN0aW9ucyA9CisgICAgICAgIEFkZHJTcGFjZTJQb2ludGVyQWN0aW9uc1tPcGNvZGVJZHhdLmZpbmQoQWRkcmVzc1NwYWNlKS0+c2Vjb25kOworICAgIHNldEFjdGlvbnMoVHlwZUluZGV4LCBBY3Rpb25zLCBTaXplQW5kQWN0aW9ucyk7CisgIH0KKworICAvLy8gSWYgYW4gb3BlcmF0aW9uIG9uIGEgZ2l2ZW4gdmVjdG9yIHR5cGUgKHNheSA8TSB4IGlOPikgaXNuJ3QgZXhwbGljaXRseQorICAvLy8gc3BlY2lmaWVkLCB3ZSBwcm9jZWVkIGluIDIgc3RhZ2VzLiBGaXJzdCB3ZSBsZWdhbGl6ZSB0aGUgdW5kZXJseWluZyBzY2FsYXIKKyAgLy8vIChzbyB0aGF0IHRoZXJlJ3MgYXQgbGVhc3Qgb25lIGxlZ2FsIHZlY3RvciB3aXRoIHRoYXQgc2NhbGFyKSwgdGhlbiB3ZQorICAvLy8gYWRqdXN0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHZlY3RvciBzbyB0aGF0IGl0IGlzIGxlZ2FsLiBUaGUKKyAgLy8vIGRlc2lyZWQgYWN0aW9uIGluIHRoZSBmaXJzdCBzdGVwIGlzIGNvbnRyb2xsZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAgdm9pZCBzZXRTY2FsYXJJblZlY3RvckFjdGlvbihjb25zdCB1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IHVuc2lnbmVkIFR5cGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaXplQW5kQWN0aW9uc1ZlYyAmU2l6ZUFuZEFjdGlvbnMpIHsKKyAgICB1bnNpZ25lZCBPcGNvZGVJZHggPSBPcGNvZGUgLSBGaXJzdE9wOworICAgIFNtYWxsVmVjdG9yPFNpemVBbmRBY3Rpb25zVmVjLCAxPiAmQWN0aW9ucyA9CisgICAgICAgIFNjYWxhckluVmVjdG9yQWN0aW9uc1tPcGNvZGVJZHhdOworICAgIHNldEFjdGlvbnMoVHlwZUluZGV4LCBBY3Rpb25zLCBTaXplQW5kQWN0aW9ucyk7CisgIH0KKworICAvLy8gU2VlIGFsc28gc2V0U2NhbGFySW5WZWN0b3JBY3Rpb24uCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGxldCdzIHlvdSBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSB2ZWN0b3IgdGhhdAorICAvLy8gYXJlIGxlZ2FsIGZvciBhIGxlZ2FsIGVsZW1lbnQgc2l6ZS4KKyAgdm9pZCBzZXRWZWN0b3JOdW1FbGVtZW50QWN0aW9uKGNvbnN0IHVuc2lnbmVkIE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIFR5cGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIEVsZW1lbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2l6ZUFuZEFjdGlvbnNWZWMgJlNpemVBbmRBY3Rpb25zKSB7CisgICAgY29uc3QgdW5zaWduZWQgT3Bjb2RlSWR4ID0gT3Bjb2RlIC0gRmlyc3RPcDsKKyAgICBpZiAoTnVtRWxlbWVudHMyQWN0aW9uc1tPcGNvZGVJZHhdLmZpbmQoRWxlbWVudFNpemUpID09CisgICAgICAgIE51bUVsZW1lbnRzMkFjdGlvbnNbT3Bjb2RlSWR4XS5lbmQoKSkKKyAgICAgIE51bUVsZW1lbnRzMkFjdGlvbnNbT3Bjb2RlSWR4XVtFbGVtZW50U2l6ZV0gPSB7e319OworICAgIFNtYWxsVmVjdG9yPFNpemVBbmRBY3Rpb25zVmVjLCAxPiAmQWN0aW9ucyA9CisgICAgICAgIE51bUVsZW1lbnRzMkFjdGlvbnNbT3Bjb2RlSWR4XS5maW5kKEVsZW1lbnRTaXplKS0+c2Vjb25kOworICAgIHNldEFjdGlvbnMoVHlwZUluZGV4LCBBY3Rpb25zLCBTaXplQW5kQWN0aW9ucyk7CisgIH0KKworICAvLy8gQSBwYXJ0aWFsIFNpemVBbmRBY3Rpb25zVmVjIHBvdGVudGlhbGx5IGRvZXNuJ3QgY292ZXIgYWxsIGJpdCBzaXplcywKKyAgLy8vIGkuZS4gaXQncyBPSyBpZiBpdCBkb2Vzbid0IHN0YXJ0IGZyb20gc2l6ZSAxLgorICBzdGF0aWMgdm9pZCBjaGVja1BhcnRpYWxTaXplQW5kQWN0aW9uc1ZlY3Rvcihjb25zdCBTaXplQW5kQWN0aW9uc1ZlYyYgdikgeworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl6ZUFjdGlvbnM7CisjaWZuZGVmIE5ERUJVRworICAgIC8vIFRoZSBzaXplcyBzaG91bGQgYmUgaW4gaW5jcmVhc2luZyBvcmRlcgorICAgIGludCBwcmV2X3NpemUgPSAtMTsKKyAgICBmb3IoYXV0byBTaXplQW5kQWN0aW9uOiB2KSB7CisgICAgICBhc3NlcnQoU2l6ZUFuZEFjdGlvbi5maXJzdCA+IHByZXZfc2l6ZSk7CisgICAgICBwcmV2X3NpemUgPSBTaXplQW5kQWN0aW9uLmZpcnN0OworICAgIH0KKyAgICAvLyAtIGZvciBldmVyeSBXaWRlbiBhY3Rpb24sIHRoZXJlIHNob3VsZCBiZSBhIGxhcmdlciBiaXRzaXplIHRoYXQKKyAgICAvLyAgIGNhbiBiZSBsZWdhbGl6ZWQgdG93YXJkcyAoZS5nLiBMZWdhbCwgTG93ZXIsIExpYmNhbGwgb3IgQ3VzdG9tCisgICAgLy8gICBhY3Rpb24pLgorICAgIC8vIC0gZm9yIGV2ZXJ5IE5hcnJvdyBhY3Rpb24sIHRoZXJlIHNob3VsZCBiZSBhIHNtYWxsZXIgYml0c2l6ZSB0aGF0CisgICAgLy8gICBjYW4gYmUgbGVnYWxpemVkIHRvd2FyZHMuCisgICAgaW50IFNtYWxsZXN0TmFycm93SWR4ID0gLTE7CisgICAgaW50IExhcmdlc3RXaWRlbklkeCA9IC0xOworICAgIGludCBTbWFsbGVzdExlZ2FsaXphYmxlVG9TYW1lU2l6ZUlkeCA9IC0xOworICAgIGludCBMYXJnZXN0TGVnYWxpemFibGVUb1NhbWVTaXplSWR4ID0gLTE7CisgICAgZm9yKHNpemVfdCBpPTA7IGk8di5zaXplKCk7ICsraSkgeworICAgICAgc3dpdGNoICh2W2ldLnNlY29uZCkgeworICAgICAgICBjYXNlIEZld2VyRWxlbWVudHM6CisgICAgICAgIGNhc2UgTmFycm93U2NhbGFyOgorICAgICAgICAgIGlmIChTbWFsbGVzdE5hcnJvd0lkeCA9PSAtMSkKKyAgICAgICAgICAgIFNtYWxsZXN0TmFycm93SWR4ID0gaTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXaWRlblNjYWxhcjoKKyAgICAgICAgY2FzZSBNb3JlRWxlbWVudHM6CisgICAgICAgICAgTGFyZ2VzdFdpZGVuSWR4ID0gaTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVbnN1cHBvcnRlZDoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpZiAoU21hbGxlc3RMZWdhbGl6YWJsZVRvU2FtZVNpemVJZHggPT0gLTEpCisgICAgICAgICAgICBTbWFsbGVzdExlZ2FsaXphYmxlVG9TYW1lU2l6ZUlkeCA9IGk7CisgICAgICAgICAgTGFyZ2VzdExlZ2FsaXphYmxlVG9TYW1lU2l6ZUlkeCA9IGk7CisgICAgICB9CisgICAgfQorICAgIGlmIChTbWFsbGVzdE5hcnJvd0lkeCAhPSAtMSkgeworICAgICAgYXNzZXJ0KFNtYWxsZXN0TGVnYWxpemFibGVUb1NhbWVTaXplSWR4ICE9IC0xKTsKKyAgICAgIGFzc2VydChTbWFsbGVzdE5hcnJvd0lkeCA+IFNtYWxsZXN0TGVnYWxpemFibGVUb1NhbWVTaXplSWR4KTsKKyAgICB9CisgICAgaWYgKExhcmdlc3RXaWRlbklkeCAhPSAtMSkKKyAgICAgIGFzc2VydChMYXJnZXN0V2lkZW5JZHggPCBMYXJnZXN0TGVnYWxpemFibGVUb1NhbWVTaXplSWR4KTsKKyNlbmRpZgorICB9CisKKyAgLy8vIEEgZnVsbCBTaXplQW5kQWN0aW9uc1ZlYyBtdXN0IGNvdmVyIGFsbCBiaXQgc2l6ZXMsIGkuZS4gbXVzdCBzdGFydCB3aXRoCisgIC8vLyBmcm9tIHNpemUgMS4KKyAgc3RhdGljIHZvaWQgY2hlY2tGdWxsU2l6ZUFuZEFjdGlvbnNWZWN0b3IoY29uc3QgU2l6ZUFuZEFjdGlvbnNWZWMmIHYpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgLy8gRGF0YSBzdHJ1Y3R1cmUgaW52YXJpYW50OiBUaGUgZmlyc3QgYml0IHNpemUgbXVzdCBiZSBzaXplIDEuCisgICAgYXNzZXJ0KHYuc2l6ZSgpID49IDEpOworICAgIGFzc2VydCh2WzBdLmZpcnN0ID09IDEpOworICAgIGNoZWNrUGFydGlhbFNpemVBbmRBY3Rpb25zVmVjdG9yKHYpOworI2VuZGlmCisgIH0KKworICAvLy8gU2V0cyBhY3Rpb25zIGZvciBhbGwgYml0IHNpemVzIG9uIGEgcGFydGljdWxhciBnZW5lcmljIG9wY29kZSwgdHlwZQorICAvLy8gaW5kZXggYW5kIHNjYWxhciBvciBwb2ludGVyIHR5cGUuCisgIHZvaWQgc2V0QWN0aW9ucyh1bnNpZ25lZCBUeXBlSW5kZXgsCisgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxTaXplQW5kQWN0aW9uc1ZlYywgMT4gJkFjdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBTaXplQW5kQWN0aW9uc1ZlYyAmU2l6ZUFuZEFjdGlvbnMpIHsKKyAgICBjaGVja0Z1bGxTaXplQW5kQWN0aW9uc1ZlY3RvcihTaXplQW5kQWN0aW9ucyk7CisgICAgaWYgKEFjdGlvbnMuc2l6ZSgpIDw9IFR5cGVJbmRleCkKKyAgICAgIEFjdGlvbnMucmVzaXplKFR5cGVJbmRleCArIDEpOworICAgIEFjdGlvbnNbVHlwZUluZGV4XSA9IFNpemVBbmRBY3Rpb25zOworICB9CisKKyAgc3RhdGljIFNpemVBbmRBY3Rpb24gZmluZEFjdGlvbihjb25zdCBTaXplQW5kQWN0aW9uc1ZlYyAmVmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IFNpemUpOworCisgIC8vLyBSZXR1cm5zIHRoZSBuZXh0IGFjdGlvbiBuZWVkZWQgdG8gZ2V0IHRoZSBzY2FsYXIgb3IgcG9pbnRlciB0eXBlIGNsb3NlcgorICAvLy8gdG8gYmVpbmcgbGVnYWwKKyAgLy8vIEUuZy4gZmluZExlZ2FsQWN0aW9uKHtHX1JFTSwgMTN9KSBzaG91bGQgcmV0dXJuCisgIC8vLyAoV2lkZW5TY2FsYXIsIDMyKS4gQWZ0ZXIgdGhhdCwgZmluZExlZ2FsQWN0aW9uKHtHX1JFTSwgMzJ9KSB3aWxsCisgIC8vLyBwcm9iYWJseSBiZSBjYWxsZWQsIHdoaWNoIHNob3VsZCByZXR1cm4gKExvd2VyLCAzMikuCisgIC8vLyBUaGlzIGlzIGFzc3VtaW5nIHRoZSBzZXRTY2FsYXJBY3Rpb24gb24gR19SRU0gd2FzIHNvbWV0aGluZyBsaWtlOgorICAvLy8gc2V0U2NhbGFyQWN0aW9uKEdfUkVNLCAwLAorICAvLy8gICAgICAgICAgIHt7MSwgV2lkZW5TY2FsYXJ9LCAgLy8gYml0IHNpemVzIFsgMSwgMzFbCisgIC8vLyAgICAgICAgICAgIHszMiwgTG93ZXJ9LCAgICAgICAvLyBiaXQgc2l6ZXMgWzMyLCAzM1sKKyAgLy8vICAgICAgICAgICAgezMzLCBOYXJyb3dTY2FsYXJ9IC8vIGJpdCBzaXplcyBbNjUsICtpbmZbCisgIC8vLyAgICAgICAgICAgfSk7CisgIHN0ZDo6cGFpcjxMZWdhbGl6ZUFjdGlvbiwgTExUPgorICBmaW5kU2NhbGFyTGVnYWxBY3Rpb24oY29uc3QgSW5zdHJBc3BlY3QgJkFzcGVjdCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIG5leHQgYWN0aW9uIG5lZWRlZCB0b3dhcmRzIGxlZ2FsaXppbmcgdGhlIHZlY3RvciB0eXBlLgorICBzdGQ6OnBhaXI8TGVnYWxpemVBY3Rpb24sIExMVD4KKyAgZmluZFZlY3RvckxlZ2FsQWN0aW9uKGNvbnN0IEluc3RyQXNwZWN0ICZBc3BlY3QpIGNvbnN0OworCisgIHN0YXRpYyBjb25zdCBpbnQgRmlyc3RPcCA9IFRhcmdldE9wY29kZTo6UFJFX0lTRUxfR0VORVJJQ19PUENPREVfU1RBUlQ7CisgIHN0YXRpYyBjb25zdCBpbnQgTGFzdE9wID0gVGFyZ2V0T3Bjb2RlOjpQUkVfSVNFTF9HRU5FUklDX09QQ09ERV9FTkQ7CisKKyAgLy8gRGF0YSBzdHJ1Y3R1cmVzIHVzZWQgdGVtcG9yYXJpbHkgZHVyaW5nIGNvbnN0cnVjdGlvbiBvZiBsZWdhbGl0eSBkYXRhOgorICB1c2luZyBUeXBlTWFwID0gRGVuc2VNYXA8TExULCBMZWdhbGl6ZUFjdGlvbj47CisgIFNtYWxsVmVjdG9yPFR5cGVNYXAsIDE+IFNwZWNpZmllZEFjdGlvbnNbTGFzdE9wIC0gRmlyc3RPcCArIDFdOworICBTbWFsbFZlY3RvcjxTaXplQ2hhbmdlU3RyYXRlZ3ksIDE+CisgICAgICBTY2FsYXJTaXplQ2hhbmdlU3RyYXRlZ2llc1tMYXN0T3AgLSBGaXJzdE9wICsgMV07CisgIFNtYWxsVmVjdG9yPFNpemVDaGFuZ2VTdHJhdGVneSwgMT4KKyAgICAgIFZlY3RvckVsZW1lbnRTaXplQ2hhbmdlU3RyYXRlZ2llc1tMYXN0T3AgLSBGaXJzdE9wICsgMV07CisgIGJvb2wgVGFibGVzSW5pdGlhbGl6ZWQ7CisKKyAgLy8gRGF0YSBzdHJ1Y3R1cmVzIHVzZWQgYnkgZ2V0QWN0aW9uOgorICBTbWFsbFZlY3RvcjxTaXplQW5kQWN0aW9uc1ZlYywgMT4gU2NhbGFyQWN0aW9uc1tMYXN0T3AgLSBGaXJzdE9wICsgMV07CisgIFNtYWxsVmVjdG9yPFNpemVBbmRBY3Rpb25zVmVjLCAxPiBTY2FsYXJJblZlY3RvckFjdGlvbnNbTGFzdE9wIC0gRmlyc3RPcCArIDFdOworICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDE2X3QsIFNtYWxsVmVjdG9yPFNpemVBbmRBY3Rpb25zVmVjLCAxPj4KKyAgICAgIEFkZHJTcGFjZTJQb2ludGVyQWN0aW9uc1tMYXN0T3AgLSBGaXJzdE9wICsgMV07CisgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MTZfdCwgU21hbGxWZWN0b3I8U2l6ZUFuZEFjdGlvbnNWZWMsIDE+PgorICAgICAgTnVtRWxlbWVudHMyQWN0aW9uc1tMYXN0T3AgLSBGaXJzdE9wICsgMV07CisKKyAgTGVnYWxpemVSdWxlU2V0IFJ1bGVzRm9yT3Bjb2RlW0xhc3RPcCAtIEZpcnN0T3AgKyAxXTsKK307CisKKyNpZm5kZWYgTkRFQlVHCisvLy8gQ2hlY2tzIHRoYXQgTUlSIGlzIGZ1bGx5IGxlZ2FsLCByZXR1cm5zIGFuIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gaWYgaXQncyBub3QsCisvLy8gbnVsbHB0ciBvdGhlcndpc2UKK2NvbnN0IE1hY2hpbmVJbnN0ciAqbWFjaGluZUZ1bmN0aW9uSXNJbGxlZ2FsKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpOworI2VuZGlmCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtLgorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfTEVHQUxJWkVSSU5GT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9Mb2NhbGl6ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0xvY2FsaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNDZlYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9Mb2NhbGl6ZXIuaApAQCAtMCwwICsxLDc4IEBACisvLz09IGxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0xvY2FsaXplci5oIC0gTG9jYWxpemVyIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZSBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIExvY2FsaXplciBwYXNzLgorLy8vIFRoaXMgcGFzcyBtb3Zlcy9kdXBsaWNhdGVzIGNvbnN0YW50LWxpa2UgaW5zdHJ1Y3Rpb25zIGNsb3NlIHRvIHRoZWlyIHVzZXMuCisvLy8gSXRzIHByaW1hcmlseSBnb2FsIGlzIHRvIHdvcmthcm91bmQgdGhlIGRlZmljaWVuY2llcyBvZiB0aGUgZmFzdCByZWdpc3RlcgorLy8vIGFsbG9jYXRvci4KKy8vLyBXaXRoIEdsb2JhbElTZWwgY29uc3RhbnRzIGFyZSBhbGwgbWF0ZXJpYWxpemVkIGluIHRoZSBlbnRyeSBibG9jayBvZgorLy8vIGEgZnVuY3Rpb24uIEhvd2V2ZXIsIHRoZSBmYXN0IGFsbG9jYXRvciBjYW5ub3QgcmVtYXRlcmlhbGl6ZSBjb25zdGFudHMgYW5kCisvLy8gaGFzIGEgbG90IG1vcmUgbGl2ZS1yYW5nZXMgdG8gZGVhbCB3aXRoIGFuZCB3aWxsIG1vc3QgbGlrZWx5IGVuZCB1cAorLy8vIHNwaWxsaW5nIGEgbG90LgorLy8vIEJ5IHB1c2hpbmcgdGhlIGNvbnN0YW50cyBjbG9zZSB0byB0aGVpciB1c2UsIHdlIG9ubHkgY3JlYXRlIHNtYWxsCisvLy8gbGl2ZS1yYW5nZXMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0xPQ0FMSVpFUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0xPQ0FMSVpFUl9ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9NYWNoaW5lSVJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworCisvLy8gVGhpcyBwYXNzIGltcGxlbWVudHMgdGhlIGxvY2FsaXphdGlvbiBtZWNoYW5pc20gZGVzY3JpYmVkIGF0IHRoZQorLy8vIHRvcCBvZiB0aGlzIGZpbGUuIE9uZSBzcGVjaWZpY2l0eSBvZiB0aGUgaW1wbGVtZW50YXRpb24gaXMgdGhhdAorLy8vIGl0IHdpbGwgbWF0ZXJpYWxpemUgb25lIGFuZCBvbmx5IG9uZSBpbnN0YW5jZSBvZiBhIGNvbnN0YW50IHBlcgorLy8vIGJhc2ljIGJsb2NrLCB0aHVzIGVuYWJsaW5nIHJldXNlIG9mIHRoYXQgY29uc3RhbnQgd2l0aGluIHRoYXQgYmxvY2suCisvLy8gTW9yZW92ZXIsIGl0IG9ubHkgbWF0ZXJpYWxpemVzIGNvbnN0YW50cyBpbiBibG9ja3Mgd2hlcmUgdGhleQorLy8vIGFyZSB1c2VkLiBQSEkgdXNlcyBhcmUgY29uc2lkZXJlZCBoYXBwZW5pbmcgYXQgdGhlIGVuZCBvZiB0aGUKKy8vLyByZWxhdGVkIHByZWRlY2Vzc29yLgorY2xhc3MgTG9jYWxpemVyIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworcHJpdmF0ZToKKyAgLy8vIE1SSSBjb250YWlucyBhbGwgdGhlIHJlZ2lzdGVyIGNsYXNzL2JhbmsgaW5mb3JtYXRpb24gdGhhdCB0aGlzCisgIC8vLyBwYXNzIHVzZXMgYW5kIHVwZGF0ZXMuCisgIE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSTsKKworICAvLy8gQ2hlY2sgd2hldGhlciBvciBub3QgXHAgTUkgbmVlZHMgdG8gYmUgbW92ZWQgY2xvc2UgdG8gaXRzIHVzZXMuCisgIHN0YXRpYyBib29sIHNob3VsZExvY2FsaXplKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpOworCisgIC8vLyBDaGVjayBpZiBccCBNT1VzZSBpcyB1c2VkIGluIHRoZSBzYW1lIGJhc2ljIGJsb2NrIGFzIFxwIERlZi4KKyAgLy8vIElmIHRoZSB1c2UgaXMgaW4gdGhlIHNhbWUgYmxvY2ssIHdlIHNheSBpdCBpcyBsb2NhbC4KKyAgLy8vIFdoZW4gdGhlIHVzZSBpcyBub3QgbG9jYWwsIFxwIEluc2VydE1CQiB3aWxsIGNvbnRhaW4gdGhlIGJhc2ljCisgIC8vLyBibG9jayB3aGVuIHRvIGluc2VydCBccCBEZWYgdG8gaGF2ZSBhIGxvY2FsIHVzZS4KKyAgc3RhdGljIGJvb2wgaXNMb2NhbFVzZShNYWNoaW5lT3BlcmFuZCAmTU9Vc2UsIGNvbnN0IE1hY2hpbmVJbnN0ciAmRGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrIComSW5zZXJ0TUJCKTsKKworICAvLy8gSW5pdGlhbGl6ZSB0aGUgZmllbGQgbWVtYmVycyB1c2luZyBccCBNRi4KKyAgdm9pZCBpbml0KE1hY2hpbmVGdW5jdGlvbiAmTUYpOworCitwdWJsaWM6CisgIExvY2FsaXplcigpOworCisgIFN0cmluZ1JlZiBnZXRQYXNzTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJMb2NhbGl6ZXIiOyB9CisKKyAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyBnZXRSZXF1aXJlZFByb3BlcnRpZXMoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMoKQorICAgICAgICAuc2V0KE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXM6OlByb3BlcnR5OjpJc1NTQSkKKyAgICAgICAgLnNldChNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzOjpQcm9wZXJ0eTo6TGVnYWxpemVkKQorICAgICAgICAuc2V0KE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXM6OlByb3BlcnR5OjpSZWdCYW5rU2VsZWN0ZWQpOworICB9CisKKyAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSBvdmVycmlkZTsKK307CisKK30gLy8gRW5kIG5hbWVzcGFjZSBsbHZtLgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL01JUGF0dGVybk1hdGNoLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9NSVBhdHRlcm5NYXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5N2Y1ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9NSVBhdHRlcm5NYXRjaC5oCkBAIC0wLDAgKzEsMzI3IEBACisvLz09IC0tLS0tIGxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL01JUGF0dGVybk1hdGNoLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tID09IC8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIENvbnRhaW5zIG1hdGNoZXJzIGZvciBtYXRjaGluZyBTU0EgTWFjaGluZSBJbnN0cnVjdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9HTUlSX1BBVFRFUk5NQVRDSF9ICisjZGVmaW5lIExMVk1fR01JUl9QQVRURVJOTUFUQ0hfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBGbG9hdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FQSW50LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvVXRpbHMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgTUlQYXR0ZXJuTWF0Y2ggeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVnLCB0eXBlbmFtZSBQYXR0ZXJuPgorYm9vbCBtaV9tYXRjaChSZWcgUiwgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLCBQYXR0ZXJuICYmUCkgeworICByZXR1cm4gUC5tYXRjaChNUkksIFIpOworfQorCisvLyBUT0RPOiBFeHRlbmQgZm9yIE4gdXNlLgordGVtcGxhdGUgPHR5cGVuYW1lIFN1YlBhdHRlcm5UPiBzdHJ1Y3QgT25lVXNlX21hdGNoIHsKKyAgU3ViUGF0dGVyblQgU3ViUGF0OworICBPbmVVc2VfbWF0Y2goY29uc3QgU3ViUGF0dGVyblQgJlNQKSA6IFN1YlBhdChTUCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4KKyAgYm9vbCBtYXRjaChjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIHVuc2lnbmVkIFJlZykgeworICAgIHJldHVybiBNUkkuaGFzT25lVXNlKFJlZykgJiYgU3ViUGF0Lm1hdGNoKE1SSSwgUmVnKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFN1YlBhdD4KK2lubGluZSBPbmVVc2VfbWF0Y2g8U3ViUGF0PiBtX09uZVVzZShjb25zdCBTdWJQYXQgJlNQKSB7CisgIHJldHVybiBTUDsKK30KKworc3RydWN0IENvbnN0YW50TWF0Y2ggeworICBpbnQ2NF90ICZDUjsKKyAgQ29uc3RhbnRNYXRjaChpbnQ2NF90ICZDKSA6IENSKEMpIHt9CisgIGJvb2wgbWF0Y2goY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLCB1bnNpZ25lZCBSZWcpIHsKKyAgICBpZiAoYXV0byBNYXliZUNzdCA9IGdldENvbnN0YW50VlJlZ1ZhbChSZWcsIE1SSSkpIHsKKyAgICAgIENSID0gKk1heWJlQ3N0OworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworaW5saW5lIENvbnN0YW50TWF0Y2ggbV9JQ3N0KGludDY0X3QgJkNzdCkgeyByZXR1cm4gQ29uc3RhbnRNYXRjaChDc3QpOyB9CisKKy8vIFRPRE86IFJld29yayB0aGlzIGZvciBkaWZmZXJlbnQga2luZHMgb2YgTWFjaGluZU9wZXJhbmQuCisvLyBDdXJyZW50bHkgYXNzdW1lcyB0aGUgU3JjIGZvciBhIG1hdGNoIGlzIGEgcmVnaXN0ZXIuCisvLyBXZSBtaWdodCB3YW50IHRvIHN1cHBvcnQgdGFraW5nIGluIHNvbWUgTWFjaGluZU9wZXJhbmRzIGFuZCBjYWxsIGdldFJlZyBvbgorLy8gdGhhdC4KKworc3RydWN0IG9wZXJhbmRfdHlwZV9tYXRjaCB7CisgIGJvb2wgbWF0Y2goY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLCB1bnNpZ25lZCBSZWcpIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCBtYXRjaChjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIE1hY2hpbmVPcGVyYW5kICpNTykgeworICAgIHJldHVybiBNTy0+aXNSZWcoKTsKKyAgfQorfTsKKworaW5saW5lIG9wZXJhbmRfdHlwZV9tYXRjaCBtX1JlZygpIHsgcmV0dXJuIG9wZXJhbmRfdHlwZV9tYXRjaCgpOyB9CisKKy8vLyBNYXRjaGluZyBjb21iaW5hdG9ycy4KK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBQcmVkcz4gc3RydWN0IEFuZCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaFNyYz4KKyAgYm9vbCBtYXRjaChNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIE1hdGNoU3JjICYmc3JjKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLCB0eXBlbmFtZS4uLiBQcmVkcz4KK3N0cnVjdCBBbmQ8UHJlZCwgUHJlZHMuLi4+IDogQW5kPFByZWRzLi4uPiB7CisgIFByZWQgUDsKKyAgQW5kKFByZWQgJiZwLCBQcmVkcyAmJi4uLiBwcmVkcykKKyAgICAgIDogQW5kPFByZWRzLi4uPihzdGQ6OmZvcndhcmQ8UHJlZHM+KHByZWRzKS4uLiksIFAoc3RkOjpmb3J3YXJkPFByZWQ+KHApKSB7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoU3JjPgorICBib29sIG1hdGNoKE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwgTWF0Y2hTcmMgJiZzcmMpIHsKKyAgICByZXR1cm4gUC5tYXRjaChNUkksIHNyYykgJiYgQW5kPFByZWRzLi4uPjo6bWF0Y2goTVJJLCBzcmMpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gUHJlZHM+IHN0cnVjdCBPciB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaFNyYz4KKyAgYm9vbCBtYXRjaChNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIE1hdGNoU3JjICYmc3JjKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCwgdHlwZW5hbWUuLi4gUHJlZHM+CitzdHJ1Y3QgT3I8UHJlZCwgUHJlZHMuLi4+IDogT3I8UHJlZHMuLi4+IHsKKyAgUHJlZCBQOworICBPcihQcmVkICYmcCwgUHJlZHMgJiYuLi4gcHJlZHMpCisgICAgICA6IE9yPFByZWRzLi4uPihzdGQ6OmZvcndhcmQ8UHJlZHM+KHByZWRzKS4uLiksIFAoc3RkOjpmb3J3YXJkPFByZWQ+KHApKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hTcmM+CisgIGJvb2wgbWF0Y2goTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLCBNYXRjaFNyYyAmJnNyYykgeworICAgIHJldHVybiBQLm1hdGNoKE1SSSwgc3JjKSB8fCBPcjxQcmVkcy4uLj46Om1hdGNoKE1SSSwgc3JjKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lLi4uIFByZWRzPiBBbmQ8UHJlZHMuLi4+IG1fYWxsX29mKFByZWRzICYmLi4uIHByZWRzKSB7CisgIHJldHVybiBBbmQ8UHJlZHMuLi4+KHN0ZDo6Zm9yd2FyZDxQcmVkcz4ocHJlZHMpLi4uKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lLi4uIFByZWRzPiBPcjxQcmVkcy4uLj4gbV9hbnlfb2YoUHJlZHMgJiYuLi4gcHJlZHMpIHsKKyAgcmV0dXJuIE9yPFByZWRzLi4uPihzdGQ6OmZvcndhcmQ8UHJlZHM+KHByZWRzKS4uLik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCaW5kVHk+IHN0cnVjdCBiaW5kX2hlbHBlciB7CisgIHN0YXRpYyBib29sIGJpbmQoY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLCBCaW5kVHkgJlZSLCBCaW5kVHkgJlYpIHsKKyAgICBWUiA9IFY7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBiaW5kX2hlbHBlcjxNYWNoaW5lSW5zdHIgKj4geworICBzdGF0aWMgYm9vbCBiaW5kKGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwgTWFjaGluZUluc3RyIComTUksCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnKSB7CisgICAgTUkgPSBNUkkuZ2V0VlJlZ0RlZihSZWcpOworICAgIGlmIChNSSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGJpbmRfaGVscGVyPExMVD4geworICBzdGF0aWMgYm9vbCBiaW5kKGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwgTExUICZUeSwgdW5zaWduZWQgUmVnKSB7CisgICAgVHkgPSBNUkkuZ2V0VHlwZShSZWcpOworICAgIGlmIChUeS5pc1ZhbGlkKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBiaW5kX2hlbHBlcjxjb25zdCBDb25zdGFudEZQICo+IHsKKyAgc3RhdGljIGJvb2wgYmluZChjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIGNvbnN0IENvbnN0YW50RlAgKiZGLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZykgeworICAgIEYgPSBnZXRDb25zdGFudEZQVlJlZ1ZhbChSZWcsIE1SSSk7CisgICAgaWYgKEYpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcz4gc3RydWN0IGJpbmRfdHkgeworICBDbGFzcyAmVlI7CisKKyAgYmluZF90eShDbGFzcyAmVikgOiBWUihWKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJVHk+IGJvb2wgbWF0Y2goY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLCBJVHkgJiZWKSB7CisgICAgcmV0dXJuIGJpbmRfaGVscGVyPENsYXNzPjo6YmluZChNUkksIFZSLCBWKTsKKyAgfQorfTsKKworaW5saW5lIGJpbmRfdHk8dW5zaWduZWQ+IG1fUmVnKHVuc2lnbmVkICZSKSB7IHJldHVybiBSOyB9CitpbmxpbmUgYmluZF90eTxNYWNoaW5lSW5zdHIgKj4gbV9NSW5zdHIoTWFjaGluZUluc3RyIComTUkpIHsgcmV0dXJuIE1JOyB9CitpbmxpbmUgYmluZF90eTxMTFQ+IG1fVHlwZShMTFQgJlR5KSB7IHJldHVybiBUeTsgfQorCisvLyBIZWxwZXIgZm9yIG1hdGNoaW5nIEdfRkNPTlNUQU5UCitpbmxpbmUgYmluZF90eTxjb25zdCBDb25zdGFudEZQICo+IG1fR0ZDc3QoY29uc3QgQ29uc3RhbnRGUCAqJkMpIHsgcmV0dXJuIEM7IH0KKworLy8gR2VuZXJhbCBoZWxwZXIgZm9yIGFsbCB0aGUgYmluYXJ5IGdlbmVyaWMgTUkgc3VjaCBhcyBHX0FERC9HX1NVQiBldGMKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFNfUCwgdHlwZW5hbWUgUkhTX1AsIHVuc2lnbmVkIE9wY29kZSwKKyAgICAgICAgICBib29sIENvbW11dGFibGUgPSBmYWxzZT4KK3N0cnVjdCBCaW5hcnlPcF9tYXRjaCB7CisgIExIU19QIEw7CisgIFJIU19QIFI7CisKKyAgQmluYXJ5T3BfbWF0Y2goY29uc3QgTEhTX1AgJkxIUywgY29uc3QgUkhTX1AgJlJIUykgOiBMKExIUyksIFIoUkhTKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4gYm9vbCBtYXRjaChNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIE9wVHkgJiZPcCkgeworICAgIE1hY2hpbmVJbnN0ciAqVG1wTUk7CisgICAgaWYgKG1pX21hdGNoKE9wLCBNUkksIG1fTUluc3RyKFRtcE1JKSkpIHsKKyAgICAgIGlmIChUbXBNSS0+Z2V0T3Bjb2RlKCkgPT0gT3Bjb2RlICYmIFRtcE1JLT5nZXROdW1PcGVyYW5kcygpID09IDMpIHsKKyAgICAgICAgcmV0dXJuIChMLm1hdGNoKE1SSSwgVG1wTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpICYmCisgICAgICAgICAgICAgICAgUi5tYXRjaChNUkksIFRtcE1JLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpKSkgfHwKKyAgICAgICAgICAgICAgIChDb21tdXRhYmxlICYmIChSLm1hdGNoKE1SSSwgVG1wTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTC5tYXRjaChNUkksIFRtcE1JLT5nZXRPcGVyYW5kKDIpLmdldFJlZygpKSkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgVGFyZ2V0T3Bjb2RlOjpHX0FERCwgdHJ1ZT4KK21fR0FkZChjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIFRhcmdldE9wY29kZTo6R19BREQsIHRydWU+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIFRhcmdldE9wY29kZTo6R19TVUI+IG1fR1N1Yihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBUYXJnZXRPcGNvZGU6OkdfU1VCPihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBUYXJnZXRPcGNvZGU6OkdfTVVMLCB0cnVlPgorbV9HTXVsKGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgVGFyZ2V0T3Bjb2RlOjpHX01VTCwgdHJ1ZT4oTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgVGFyZ2V0T3Bjb2RlOjpHX0ZBREQsIHRydWU+CittX0dGQWRkKGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgVGFyZ2V0T3Bjb2RlOjpHX0ZBREQsIHRydWU+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIFRhcmdldE9wY29kZTo6R19GTVVMLCB0cnVlPgorbV9HRk11bChjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIFRhcmdldE9wY29kZTo6R19GTVVMLCB0cnVlPihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBUYXJnZXRPcGNvZGU6OkdfQU5ELCB0cnVlPgorbV9HQW5kKGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgVGFyZ2V0T3Bjb2RlOjpHX0FORCwgdHJ1ZT4oTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgVGFyZ2V0T3Bjb2RlOjpHX09SLCB0cnVlPiBtX0dPcihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgVGFyZ2V0T3Bjb2RlOjpHX09SLCB0cnVlPihMLCBSKTsKK30KKworLy8gSGVscGVyIGZvciB1bmFyeSBpbnN0cnVjdGlvbnMgKEdfW1pTQV1FWFQvR19UUlVOQykgZXRjCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjVHksIHVuc2lnbmVkIE9wY29kZT4gc3RydWN0IFVuYXJ5T3BfbWF0Y2ggeworICBTcmNUeSBMOworCisgIFVuYXJ5T3BfbWF0Y2goY29uc3QgU3JjVHkgJkxIUykgOiBMKExIUykge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLCBPcFR5ICYmT3ApIHsKKyAgICBNYWNoaW5lSW5zdHIgKlRtcE1JOworICAgIGlmIChtaV9tYXRjaChPcCwgTVJJLCBtX01JbnN0cihUbXBNSSkpKSB7CisgICAgICBpZiAoVG1wTUktPmdldE9wY29kZSgpID09IE9wY29kZSAmJiBUbXBNSS0+Z2V0TnVtT3BlcmFuZHMoKSA9PSAyKSB7CisgICAgICAgIHJldHVybiBMLm1hdGNoKE1SSSwgVG1wTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTcmNUeT4KK2lubGluZSBVbmFyeU9wX21hdGNoPFNyY1R5LCBUYXJnZXRPcGNvZGU6OkdfQU5ZRVhUPgorbV9HQW55RXh0KGNvbnN0IFNyY1R5ICZTcmMpIHsKKyAgcmV0dXJuIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19BTllFWFQ+KFNyYyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTcmNUeT4KK2lubGluZSBVbmFyeU9wX21hdGNoPFNyY1R5LCBUYXJnZXRPcGNvZGU6OkdfU0VYVD4gbV9HU0V4dChjb25zdCBTcmNUeSAmU3JjKSB7CisgIHJldHVybiBVbmFyeU9wX21hdGNoPFNyY1R5LCBUYXJnZXRPcGNvZGU6OkdfU0VYVD4oU3JjKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNyY1R5PgoraW5saW5lIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19aRVhUPiBtX0daRXh0KGNvbnN0IFNyY1R5ICZTcmMpIHsKKyAgcmV0dXJuIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19aRVhUPihTcmMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjVHk+CitpbmxpbmUgVW5hcnlPcF9tYXRjaDxTcmNUeSwgVGFyZ2V0T3Bjb2RlOjpHX0ZQRVhUPiBtX0dGUEV4dChjb25zdCBTcmNUeSAmU3JjKSB7CisgIHJldHVybiBVbmFyeU9wX21hdGNoPFNyY1R5LCBUYXJnZXRPcGNvZGU6OkdfRlBFWFQ+KFNyYyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTcmNUeT4KK2lubGluZSBVbmFyeU9wX21hdGNoPFNyY1R5LCBUYXJnZXRPcGNvZGU6OkdfVFJVTkM+IG1fR1RydW5jKGNvbnN0IFNyY1R5ICZTcmMpIHsKKyAgcmV0dXJuIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19UUlVOQz4oU3JjKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNyY1R5PgoraW5saW5lIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19CSVRDQVNUPgorbV9HQml0Y2FzdChjb25zdCBTcmNUeSAmU3JjKSB7CisgIHJldHVybiBVbmFyeU9wX21hdGNoPFNyY1R5LCBUYXJnZXRPcGNvZGU6OkdfQklUQ0FTVD4oU3JjKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNyY1R5PgoraW5saW5lIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19QVFJUT0lOVD4KK21fR1B0clRvSW50KGNvbnN0IFNyY1R5ICZTcmMpIHsKKyAgcmV0dXJuIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19QVFJUT0lOVD4oU3JjKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNyY1R5PgoraW5saW5lIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19JTlRUT1BUUj4KK21fR0ludFRvUHRyKGNvbnN0IFNyY1R5ICZTcmMpIHsKKyAgcmV0dXJuIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19JTlRUT1BUUj4oU3JjKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNyY1R5PgoraW5saW5lIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19GUFRSVU5DPgorbV9HRlBUcnVuYyhjb25zdCBTcmNUeSAmU3JjKSB7CisgIHJldHVybiBVbmFyeU9wX21hdGNoPFNyY1R5LCBUYXJnZXRPcGNvZGU6OkdfRlBUUlVOQz4oU3JjKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNyY1R5PgoraW5saW5lIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19GQUJTPiBtX0dGYWJzKGNvbnN0IFNyY1R5ICZTcmMpIHsKKyAgcmV0dXJuIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19GQUJTPihTcmMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjVHk+CitpbmxpbmUgVW5hcnlPcF9tYXRjaDxTcmNUeSwgVGFyZ2V0T3Bjb2RlOjpDT1BZPiBtX0NvcHkoU3JjVHkgJiZTcmMpIHsKKyAgcmV0dXJuIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6Q09QWT4oc3RkOjpmb3J3YXJkPFNyY1R5PihTcmMpKTsKK30KKworLy8gSGVscGVyIGZvciBjaGVja2luZyBpZiBhIFJlZyBpcyBvZiBzcGVjaWZpYyB0eXBlLgorc3RydWN0IENoZWNrVHlwZSB7CisgIExMVCBUeTsKKyAgQ2hlY2tUeXBlKGNvbnN0IExMVCAmVHkpIDogVHkoVHkpIHt9CisKKyAgYm9vbCBtYXRjaChNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIHVuc2lnbmVkIFJlZykgeworICAgIHJldHVybiBNUkkuZ2V0VHlwZShSZWcpID09IFR5OworICB9Cit9OworCitpbmxpbmUgQ2hlY2tUeXBlIG1fU3BlY2lmaWNUeXBlKExMVCBUeSkgeyByZXR1cm4gVHk7IH0KKworfSAvLyBuYW1lc3BhY2UgR01JUGF0dGVybk1hdGNoCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTWFjaGluZUlSQnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTWFjaGluZUlSQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNGUwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9NYWNoaW5lSVJCdWlsZGVyLmgKQEAgLTAsMCArMSw4MDggQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTWFjaGluZUlSQnVpbGRlci5oIC0gTUlCdWlsZGVyIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1hY2hpbmVJUkJ1aWxkZXIgY2xhc3MuCisvLy8gVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0byBidWlsZCBNYWNoaW5lSW5zdHIuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX01BQ0hJTkVJUkJVSUxERVJfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9NQUNISU5FSVJCVUlMREVSX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1R5cGVzLmgiCisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTG93TGV2ZWxUeXBlLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZWJ1Z0xvYy5oIgorCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CisKKy8vLyBIZWxwZXIgY2xhc3MgdG8gYnVpbGQgTWFjaGluZUluc3RyLgorLy8vIEl0IGtlZXBzIGludGVybmFsbHkgdGhlIGluc2VydGlvbiBwb2ludCBhbmQgZGVidWcgbG9jYXRpb24gZm9yIGFsbAorLy8vIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zIHdlIHdhbnQgdG8gY3JlYXRlLgorLy8vIFRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIG1vZGlmeSB2aWEgdGhlIHJlbGF0ZWQgc2V0dGVycy4KK2NsYXNzIE1hY2hpbmVJUkJ1aWxkZXIgeworICAvLy8gTWFjaGluZUZ1bmN0aW9uIHVuZGVyIGNvbnN0cnVjdGlvbi4KKyAgTWFjaGluZUZ1bmN0aW9uICpNRjsKKyAgLy8vIEluZm9ybWF0aW9uIHVzZWQgdG8gYWNjZXNzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgb3Bjb2Rlcy4KKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisgIC8vLyBJbmZvcm1hdGlvbiB1c2VkIHRvIHZlcmlmeSB0eXBlcyBhcmUgY29uc2lzdGVudCBhbmQgdG8gY3JlYXRlIHZpcnR1YWwgcmVnaXN0ZXJzLgorICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkk7CisgIC8vLyBEZWJ1ZyBsb2NhdGlvbiB0byBiZSBzZXQgdG8gYW55IGluc3RydWN0aW9uIHdlIGNyZWF0ZS4KKyAgRGVidWdMb2MgREw7CisKKyAgLy8vIFxuYW1lIEZpZWxkcyBkZXNjcmliaW5nIHRoZSBpbnNlcnRpb24gcG9pbnQuCisgIC8vLyBAeworICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCOworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSUk7CisgIC8vLyBAfQorCisgIHN0ZDo6ZnVuY3Rpb248dm9pZChNYWNoaW5lSW5zdHIgKik+IEluc2VydGVkSW5zdHI7CisKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZnZXRUSUkoKSB7CisgICAgYXNzZXJ0KFRJSSAmJiAiVGFyZ2V0SW5zdHJJbmZvIGlzIG5vdCBzZXQiKTsKKyAgICByZXR1cm4gKlRJSTsKKyAgfQorCisgIHZvaWQgdmFsaWRhdGVUcnVuY0V4dCh1bnNpZ25lZCBEc3QsIHVuc2lnbmVkIFNyYywgYm9vbCBJc0V4dGVuZCk7CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRCaW5hcnlPcCh1bnNpZ25lZCBPcGNvZGUsIHVuc2lnbmVkIFJlcywgdW5zaWduZWQgT3AwLCB1bnNpZ25lZCBPcDEpOworCisgIHVuc2lnbmVkIGdldERlc3RGcm9tQXJnKHVuc2lnbmVkIFJlZykgeyByZXR1cm4gUmVnOyB9CisgIHVuc2lnbmVkIGdldERlc3RGcm9tQXJnKExMVCBUeSkgeworICAgIHJldHVybiBnZXRNRigpLmdldFJlZ0luZm8oKS5jcmVhdGVHZW5lcmljVmlydHVhbFJlZ2lzdGVyKFR5KTsKKyAgfQorICB1bnNpZ25lZCBnZXREZXN0RnJvbUFyZyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgeworICAgIHJldHVybiBnZXRNRigpLmdldFJlZ0luZm8oKS5jcmVhdGVWaXJ0dWFsUmVnaXN0ZXIoUkMpOworICB9CisKKyAgdm9pZCBhZGRVc2VGcm9tQXJnKE1hY2hpbmVJbnN0ckJ1aWxkZXIgJk1JQiwgdW5zaWduZWQgUmVnKSB7CisgICAgTUlCLmFkZFVzZShSZWcpOworICB9CisKKyAgdm9pZCBhZGRVc2VGcm9tQXJnKE1hY2hpbmVJbnN0ckJ1aWxkZXIgJk1JQiwgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmVXNlTUlCKSB7CisgICAgTUlCLmFkZFVzZShVc2VNSUItPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCkpOworICB9CisKKyAgdm9pZCBhZGRVc2VzRnJvbUFyZ3MoTWFjaGluZUluc3RyQnVpbGRlciAmTUlCKSB7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVXNlQXJnVHksIHR5cGVuYW1lIC4uLiBVc2VBcmdzVHk+CisgIHZvaWQgYWRkVXNlc0Zyb21BcmdzKE1hY2hpbmVJbnN0ckJ1aWxkZXIgJk1JQiwgVXNlQXJnVHkgJiZBcmcxLCBVc2VBcmdzVHkgJiYuLi4gQXJncykgeworICAgIGFkZFVzZUZyb21BcmcoTUlCLCBBcmcxKTsKKyAgICBhZGRVc2VzRnJvbUFyZ3MoTUlCLCBzdGQ6OmZvcndhcmQ8VXNlQXJnc1R5PihBcmdzKS4uLik7CisgIH0KKyAgdW5zaWduZWQgZ2V0UmVnRnJvbUFyZyh1bnNpZ25lZCBSZWcpIHsgcmV0dXJuIFJlZzsgfQorICB1bnNpZ25lZCBnZXRSZWdGcm9tQXJnKGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJk1JQikgeworICAgIHJldHVybiBNSUItPmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgIH0KKworcHVibGljOgorICAvLy8gU29tZSBjb25zdHJ1Y3RvcnMgZm9yIGVhc3kgdXNlLgorICBNYWNoaW5lSVJCdWlsZGVyKCkgPSBkZWZhdWx0OworICBNYWNoaW5lSVJCdWlsZGVyKE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsgc2V0TUYoTUYpOyB9CisgIE1hY2hpbmVJUkJ1aWxkZXIoTWFjaGluZUluc3RyICZNSSkgOiBNYWNoaW5lSVJCdWlsZGVyKCpNSS5nZXRNRigpKSB7CisgICAgc2V0SW5zdHIoTUkpOworICB9CisKKyAgLy8vIEdldHRlciBmb3IgdGhlIGZ1bmN0aW9uIHdlIGN1cnJlbnRseSBidWlsZC4KKyAgTWFjaGluZUZ1bmN0aW9uICZnZXRNRigpIHsKKyAgICBhc3NlcnQoTUYgJiYgIk1hY2hpbmVGdW5jdGlvbiBpcyBub3Qgc2V0Iik7CisgICAgcmV0dXJuICpNRjsKKyAgfQorCisgIC8vLyBHZXR0ZXIgZm9yIHRoZSBiYXNpYyBibG9jayB3ZSBjdXJyZW50bHkgYnVpbGQuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICZnZXRNQkIoKSB7CisgICAgYXNzZXJ0KE1CQiAmJiAiTWFjaGluZUJhc2ljQmxvY2sgaXMgbm90IHNldCIpOworICAgIHJldHVybiAqTUJCOworICB9CisKKyAgLy8vIEN1cnJlbnQgaW5zZXJ0aW9uIHBvaW50IGZvciBuZXcgaW5zdHJ1Y3Rpb25zLgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgZ2V0SW5zZXJ0UHQoKSB7CisgICAgcmV0dXJuIElJOworICB9CisKKyAgLy8vIFNldCB0aGUgaW5zZXJ0aW9uIHBvaW50IGJlZm9yZSB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLgorICAvLy8gXHByZSBNQkIgbXVzdCBiZSBpbiBnZXRNRigpLgorICAvLy8gXHByZSBJSSBtdXN0IGJlIGEgdmFsaWQgaXRlcmF0b3IgaW4gTUJCLgorICB2b2lkIHNldEluc2VydFB0KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJSSk7CisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBTZXR0ZXJzIGZvciB0aGUgaW5zZXJ0aW9uIHBvaW50LgorICAvLy8gQHsKKyAgLy8vIFNldCB0aGUgTWFjaGluZUZ1bmN0aW9uIHdoZXJlIHRvIGJ1aWxkIGluc3RydWN0aW9ucy4KKyAgdm9pZCBzZXRNRihNYWNoaW5lRnVuY3Rpb24gJik7CisKKyAgLy8vIFNldCB0aGUgaW5zZXJ0aW9uIHBvaW50IHRvIHRoZSAgZW5kIG9mIFxwIE1CQi4KKyAgLy8vIFxwcmUgXHAgTUJCIG11c3QgYmUgY29udGFpbmVkIGJ5IGdldE1GKCkuCisgIHZvaWQgc2V0TUJCKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworCisgIC8vLyBTZXQgdGhlIGluc2VydGlvbiBwb2ludCB0byBiZWZvcmUgTUkuCisgIC8vLyBccHJlIE1JIG11c3QgYmUgaW4gZ2V0TUYoKS4KKyAgdm9pZCBzZXRJbnN0cihNYWNoaW5lSW5zdHIgJk1JKTsKKyAgLy8vIEB9CisKKyAgLy8vIFxuYW1lIENvbnRyb2wgd2hlcmUgaW5zdHJ1Y3Rpb25zIHdlIGNyZWF0ZSBhcmUgcmVjb3JkZWQgKHR5cGljYWxseSBmb3IKKyAgLy8vIHZpc2l0aW5nIGFnYWluIGxhdGVyIGR1cmluZyBsZWdhbGl6YXRpb24pLgorICAvLy8gQHsKKyAgdm9pZCByZWNvcmRJbnNlcnRpb25zKHN0ZDo6ZnVuY3Rpb248dm9pZChNYWNoaW5lSW5zdHIgKik+IEluc2VydGVkSW5zdHIpOworICB2b2lkIHN0b3BSZWNvcmRpbmdJbnNlcnRpb25zKCk7CisgIC8vLyBAfQorCisgIC8vLyBTZXQgdGhlIGRlYnVnIGxvY2F0aW9uIHRvIFxwIERMIGZvciBhbGwgdGhlIG5leHQgYnVpbGQgaW5zdHJ1Y3Rpb25zLgorICB2b2lkIHNldERlYnVnTG9jKGNvbnN0IERlYnVnTG9jICZETCkgeyB0aGlzLT5ETCA9IERMOyB9CisKKyAgLy8vIEdldCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbidzIGRlYnVnIGxvY2F0aW9uLgorICBEZWJ1Z0xvYyBnZXREZWJ1Z0xvYygpIHsgcmV0dXJuIERMOyB9CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgPGVtcHR5PiA9IFxwIE9wY29kZSA8ZW1wdHk+LgorICAvLy8gVGhlIGluc2VydGlvbiBwb2ludCBpcyB0aGUgb25lIHNldCBieSB0aGUgbGFzdCBjYWxsIG9mIGVpdGhlcgorICAvLy8gc2V0QmFzaWNCbG9jayBvciBzZXRNSS4KKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gYSBNYWNoaW5lSW5zdHJCdWlsZGVyIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEluc3RyKHVuc2lnbmVkIE9wY29kZSk7CisKKyAgLy8vIERBRyBsaWtlIEdlbmVyaWMgbWV0aG9kIGZvciBidWlsZGluZyBhcmJpdHJhcnkgaW5zdHJ1Y3Rpb25zIGFzIGFib3ZlLgorICAvLy8gXE9wYyBvcGNvZGUgZm9yIHRoZSBpbnN0cnVjdGlvbi4KKyAgLy8vIFxUeSBFaXRoZXIgTExUL1RhcmdldFJlZ2lzdGVyQ2xhc3MvdW5zaWduZWQgdHlwZXMgZm9yIERzdAorICAvLy8gXEFyZ3MgVmFyaWFkaWMgbGlzdCBvZiB1c2VzIG9mIHR5cGVzKHVuc2lnbmVkL01hY2hpbmVJbnN0ckJ1aWxkZXIpCisgIC8vLyBVc2VzIG9mIHR5cGUgTWFjaGluZUluc3RyQnVpbGRlciB3aWxsIHBlcmZvcm0KKyAgLy8vIGdldE9wZXJhbmQoMCkuZ2V0UmVnKCkgdG8gY29udmVydCB0byByZWdpc3Rlci4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERzdFR5LCB0eXBlbmFtZS4uLiBVc2VBcmdzVHk+CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRJbnN0cih1bnNpZ25lZCBPcGMsIERzdFR5ICYmVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VBcmdzVHkgJiYuLi4gQXJncykgeworICAgIGF1dG8gTUlCID0gYnVpbGRJbnN0cihPcGMpLmFkZERlZihnZXREZXN0RnJvbUFyZyhUeSkpOworICAgIGFkZFVzZXNGcm9tQXJncyhNSUIsIHN0ZDo6Zm9yd2FyZDxVc2VBcmdzVHk+KEFyZ3MpLi4uKTsKKyAgICByZXR1cm4gTUlCOworICB9CisKKyAgLy8vIEJ1aWxkIGJ1dCBkb24ndCBpbnNlcnQgPGVtcHR5PiA9IFxwIE9wY29kZSA8ZW1wdHk+LgorICAvLy8KKyAgLy8vIFxwcmUgc2V0TUYsIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRJbnN0ck5vSW5zZXJ0KHVuc2lnbmVkIE9wY29kZSk7CisKKyAgLy8vIEluc2VydCBhbiBleGlzdGluZyBpbnN0cnVjdGlvbiBhdCB0aGUgaW5zZXJ0aW9uIHBvaW50LgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGluc2VydEluc3RyKE1hY2hpbmVJbnN0ckJ1aWxkZXIgTUlCKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBhIERCR19WQUxVRSBpbnN0cnVjdGlvbiBleHByZXNzaW5nIHRoZSBmYWN0IHRoYXQgdGhlCisgIC8vLyBhc3NvY2lhdGVkIFxwIFZhcmlhYmxlIGxpdmVzIGluIFxwIFJlZyAoc3VpdGFibHkgbW9kaWZpZWQgYnkgXHAgRXhwcikuCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGREaXJlY3REYmdWYWx1ZSh1bnNpZ25lZCBSZWcsIGNvbnN0IE1ETm9kZSAqVmFyaWFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKkV4cHIpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IGEgREJHX1ZBTFVFIGluc3RydWN0aW9uIGV4cHJlc3NpbmcgdGhlIGZhY3QgdGhhdCB0aGUKKyAgLy8vIGFzc29jaWF0ZWQgXHAgVmFyaWFibGUgbGl2ZXMgaW4gbWVtb3J5IGF0IFxwIFJlZyAoc3VpdGFibHkgbW9kaWZpZWQgYnkgXHAKKyAgLy8vIEV4cHIpLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkSW5kaXJlY3REYmdWYWx1ZSh1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ETm9kZSAqVmFyaWFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ETm9kZSAqRXhwcik7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgYSBEQkdfVkFMVUUgaW5zdHJ1Y3Rpb24gZXhwcmVzc2luZyB0aGUgZmFjdCB0aGF0IHRoZQorICAvLy8gYXNzb2NpYXRlZCBccCBWYXJpYWJsZSBsaXZlcyBpbiB0aGUgc3RhY2sgc2xvdCBzcGVjaWZpZWQgYnkgXHAgRkkKKyAgLy8vIChzdWl0YWJseSBtb2RpZmllZCBieSBccCBFeHByKS4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEZJRGJnVmFsdWUoaW50IEZJLCBjb25zdCBNRE5vZGUgKlZhcmlhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKkV4cHIpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IGEgREJHX1ZBTFVFIGluc3RydWN0aW9ucyBzcGVjaWZ5aW5nIHRoYXQgXHAgVmFyaWFibGUgaXMKKyAgLy8vIGdpdmVuIGJ5IFxwIEMgKHN1aXRhYmx5IG1vZGlmaWVkIGJ5IFxwIEV4cHIpLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkQ29uc3REYmdWYWx1ZShjb25zdCBDb25zdGFudCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUROb2RlICpWYXJpYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUROb2RlICpFeHByKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBccCBSZXMgPSBHX0ZSQU1FX0lOREVYIFxwIElkeAorICAvLy8KKyAgLy8vIEdfRlJBTUVfSU5ERVggbWF0ZXJpYWxpemVzIHRoZSBhZGRyZXNzIG9mIGFuIGFsbG9jYSB2YWx1ZSBvciBvdGhlcgorICAvLy8gc3RhY2stYmFzZWQgb2JqZWN0LgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFJlcyBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIHdpdGggcG9pbnRlciB0eXBlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gYSBNYWNoaW5lSW5zdHJCdWlsZGVyIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEZyYW1lSW5kZXgodW5zaWduZWQgUmVzLCBpbnQgSWR4KTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBccCBSZXMgPSBHX0dMT0JBTF9WQUxVRSBccCBHVgorICAvLy8KKyAgLy8vIEdfR0xPQkFMX1ZBTFVFIG1hdGVyaWFsaXplcyB0aGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkIGdsb2JhbAorICAvLy8gaW50byBccCBSZXMuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBwb2ludGVyIHR5cGUKKyAgLy8vICAgICAgaW4gdGhlIHNhbWUgYWRkcmVzcyBzcGFjZSBhcyBccCBHVi4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRHbG9iYWxWYWx1ZSh1bnNpZ25lZCBSZXMsIGNvbnN0IEdsb2JhbFZhbHVlICpHVik7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gR19BREQgXHAgT3AwLCBccCBPcDEKKyAgLy8vCisgIC8vLyBHX0FERCBzZXRzIFxwIFJlcyB0byB0aGUgc3VtIG9mIGludGVnZXIgcGFyYW1ldGVycyBccCBPcDAgYW5kIFxwIE9wMSwKKyAgLy8vIHRydW5jYXRlZCB0byB0aGVpciB3aWR0aC4KKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMsIFxwIE9wMCBhbmQgXHAgT3AxIG11c3QgYmUgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVycworICAvLy8gICAgICB3aXRoIHRoZSBzYW1lIChzY2FsYXIgb3IgdmVjdG9yKSB0eXBlKS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRBZGQodW5zaWduZWQgUmVzLCB1bnNpZ25lZCBPcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3AxKTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERzdFR5LCB0eXBlbmFtZS4uLiBVc2VBcmdzVHk+CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRBZGQoRHN0VHkgJiZUeSwgVXNlQXJnc1R5ICYmLi4uIFVzZUFyZ3MpIHsKKyAgICB1bnNpZ25lZCBSZXMgPSBnZXREZXN0RnJvbUFyZyhUeSk7CisgICAgcmV0dXJuIGJ1aWxkQWRkKFJlcywgKGdldFJlZ0Zyb21BcmcoVXNlQXJncykpLi4uKTsKKyAgfQorCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfU1VCIFxwIE9wMCwgXHAgT3AxCisgIC8vLworICAvLy8gR19TVUIgc2V0cyBccCBSZXMgdG8gdGhlIHN1bSBvZiBpbnRlZ2VyIHBhcmFtZXRlcnMgXHAgT3AwIGFuZCBccCBPcDEsCisgIC8vLyB0cnVuY2F0ZWQgdG8gdGhlaXIgd2lkdGguCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzLCBccCBPcDAgYW5kIFxwIE9wMSBtdXN0IGJlIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlcnMKKyAgLy8vICAgICAgd2l0aCB0aGUgc2FtZSAoc2NhbGFyIG9yIHZlY3RvcikgdHlwZSkuCisgIC8vLworICAvLy8gXHJldHVybiBhIE1hY2hpbmVJbnN0ckJ1aWxkZXIgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0VHksIHR5cGVuYW1lLi4uIFVzZUFyZ3NUeT4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZFN1YihEc3RUeSAmJlR5LCBVc2VBcmdzVHkgJiYuLi4gVXNlQXJncykgeworICAgIHVuc2lnbmVkIFJlcyA9IGdldERlc3RGcm9tQXJnKFR5KTsKKyAgICByZXR1cm4gYnVpbGRTdWIoUmVzLCAoZ2V0UmVnRnJvbUFyZyhVc2VBcmdzKSkuLi4pOworICB9CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRTdWIodW5zaWduZWQgUmVzLCB1bnNpZ25lZCBPcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3AxKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBccCBSZXMgPSBHX01VTCBccCBPcDAsIFxwIE9wMQorICAvLy8KKyAgLy8vIEdfTVVMIHNldHMgXHAgUmVzIHRvIHRoZSBzdW0gb2YgaW50ZWdlciBwYXJhbWV0ZXJzIFxwIE9wMCBhbmQgXHAgT3AxLAorICAvLy8gdHJ1bmNhdGVkIHRvIHRoZWlyIHdpZHRoLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFJlcywgXHAgT3AwIGFuZCBccCBPcDEgbXVzdCBiZSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXJzCisgIC8vLyAgICAgIHdpdGggdGhlIHNhbWUgKHNjYWxhciBvciB2ZWN0b3IpIHR5cGUpLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gYSBNYWNoaW5lSW5zdHJCdWlsZGVyIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERzdFR5LCB0eXBlbmFtZS4uLiBVc2VBcmdzVHk+CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRNdWwoRHN0VHkgJiZUeSwgVXNlQXJnc1R5ICYmLi4uIFVzZUFyZ3MpIHsKKyAgICB1bnNpZ25lZCBSZXMgPSBnZXREZXN0RnJvbUFyZyhUeSk7CisgICAgcmV0dXJuIGJ1aWxkTXVsKFJlcywgKGdldFJlZ0Zyb21BcmcoVXNlQXJncykpLi4uKTsKKyAgfQorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkTXVsKHVuc2lnbmVkIFJlcywgdW5zaWduZWQgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wMSk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gR19HRVAgXHAgT3AwLCBccCBPcDEKKyAgLy8vCisgIC8vLyBHX0dFUCBhZGRzIFxwIE9wMSBieXRlcyB0byB0aGUgcG9pbnRlciBzcGVjaWZpZWQgYnkgXHAgT3AwLAorICAvLy8gc3RvcmluZyB0aGUgcmVzdWx0aW5nIHBvaW50ZXIgaW4gXHAgUmVzLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFJlcyBhbmQgXHAgT3AwIG11c3QgYmUgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVycyB3aXRoIHBvaW50ZXIKKyAgLy8vICAgICAgdHlwZS4KKyAgLy8vIFxwcmUgXHAgT3AxIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIgdHlwZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRHRVAodW5zaWduZWQgUmVzLCB1bnNpZ25lZCBPcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3AxKTsKKworICAvLy8gTWF0ZXJpYWxpemUgYW5kIGluc2VydCBccCBSZXMgPSBHX0dFUCBccCBPcDAsIChHX0NPTlNUQU5UIFxwIFZhbHVlKQorICAvLy8KKyAgLy8vIEdfR0VQIGFkZHMgXHAgVmFsdWUgYnl0ZXMgdG8gdGhlIHBvaW50ZXIgc3BlY2lmaWVkIGJ5IFxwIE9wMCwKKyAgLy8vIHN0b3JpbmcgdGhlIHJlc3VsdGluZyBwb2ludGVyIGluIFxwIFJlcy4gSWYgXHAgVmFsdWUgaXMgemVybyB0aGVuIG5vCisgIC8vLyBHX0dFUCBvciBHX0NPTlNUQU5UIHdpbGwgYmUgY3JlYXRlZCBhbmQgXHByZSBPcDAgd2lsbCBiZSBhc3NpZ25lZCB0bworICAvLy8gXHAgUmVzLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIE9wMCBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIHdpdGggcG9pbnRlciB0eXBlLgorICAvLy8gXHByZSBccCBWYWx1ZVR5IG11c3QgYmUgYSBzY2FsYXIgdHlwZS4KKyAgLy8vIFxwcmUgXHAgUmVzIG11c3QgYmUgMC4gVGhpcyBpcyB0byBkZXRlY3QgY29uZnVzaW9uIGJldHdlZW4KKyAgLy8vICAgICAgbWF0ZXJpYWxpemVHRVAoKSBhbmQgYnVpbGRHRVAoKS4KKyAgLy8vIFxwb3N0IFxwIFJlcyB3aWxsIGVpdGhlciBiZSBhIG5ldyBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgb2YgdGhlIHNhbWUKKyAgLy8vICAgICAgIHR5cGUgYXMgXHAgT3AwIG9yIFxwIE9wMCBpdHNlbGYuCisgIC8vLworICAvLy8gXHJldHVybiBhIE1hY2hpbmVJbnN0ckJ1aWxkZXIgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBPcHRpb25hbDxNYWNoaW5lSW5zdHJCdWlsZGVyPiBtYXRlcmlhbGl6ZUdFUCh1bnNpZ25lZCAmUmVzLCB1bnNpZ25lZCBPcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExMVCAmVmFsdWVUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVmFsdWUpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfUFRSX01BU0sgXHAgT3AwLCBccCBOdW1CaXRzCisgIC8vLworICAvLy8gR19QVFJfTUFTSyBjbGVhcnMgdGhlIGxvdyBiaXRzIG9mIGEgcG9pbnRlciBvcGVyYW5kIHdpdGhvdXQgZGVzdHJveWluZyBpdHMKKyAgLy8vIHBvaW50ZXIgcHJvcGVydGllcy4gVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiByb3VuZGluZyB0aGUgYWRkcmVzcyAqZG93biogdG8KKyAgLy8vIGEgc3BlY2lmaWVkIGFsaWdubWVudCBpbiBiaXRzLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFJlcyBhbmQgXHAgT3AwIG11c3QgYmUgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVycyB3aXRoIHBvaW50ZXIKKyAgLy8vICAgICAgdHlwZS4KKyAgLy8vIFxwcmUgXHAgTnVtQml0cyBtdXN0IGJlIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgbG93IGJpdHMgdG8KKyAgLy8vICAgICAgYmUgY2xlYXJlZCBpbiBccCBPcDAuCisgIC8vLworICAvLy8gXHJldHVybiBhIE1hY2hpbmVJbnN0ckJ1aWxkZXIgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkUHRyTWFzayh1bnNpZ25lZCBSZXMsIHVuc2lnbmVkIE9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTnVtQml0cyk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzLCBccCBDYXJyeU91dCA9IEdfVUFEREUgXHAgT3AwLAorICAvLy8gXHAgT3AxLCBccCBDYXJyeUluCisgIC8vLworICAvLy8gR19VQURERSBzZXRzIFxwIFJlcyB0byBccCBPcDAgKyBccCBPcDEgKyBccCBDYXJyeUluICh0cnVuY2F0ZWQgdG8gdGhlIGJpdAorICAvLy8gd2lkdGgpIGFuZCBzZXRzIFxwIENhcnJ5T3V0IHRvIDEgaWYgdGhlIHJlc3VsdCBvdmVyZmxvd2VkIGluIHVuc2lnbmVkCisgIC8vLyBhcml0aG1ldGljLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFJlcywgXHAgT3AwIGFuZCBccCBPcDEgbXVzdCBiZSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXJzCisgIC8vLyAgICAgIHdpdGggdGhlIHNhbWUgc2NhbGFyIHR5cGUuCisgIC8vLyBccHJlIFxwIENhcnJ5T3V0IGFuZCBccCBDYXJyeUluIG11c3QgYmUgZ2VuZXJpYyB2aXJ0dWFsCisgIC8vLyAgICAgIHJlZ2lzdGVycyB3aXRoIHRoZSBzYW1lIHNjYWxhciB0eXBlICh0eXBpY2FsbHkgczEpCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZFVBZGRlKHVuc2lnbmVkIFJlcywgdW5zaWduZWQgQ2FycnlPdXQsIHVuc2lnbmVkIE9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wMSwgdW5zaWduZWQgQ2FycnlJbik7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gR19BTkQgXHAgT3AwLCBccCBPcDEKKyAgLy8vCisgIC8vLyBHX0FORCBzZXRzIFxwIFJlcyB0byB0aGUgYml0d2lzZSBhbmQgb2YgaW50ZWdlciBwYXJhbWV0ZXJzIFxwIE9wMCBhbmQgXHAKKyAgLy8vIE9wMS4KKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMsIFxwIE9wMCBhbmQgXHAgT3AxIG11c3QgYmUgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVycworICAvLy8gICAgICB3aXRoIHRoZSBzYW1lIChzY2FsYXIgb3IgdmVjdG9yKSB0eXBlKS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEc3RUeSwgdHlwZW5hbWUuLi4gVXNlQXJnc1R5PgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkQW5kKERzdFR5ICYmRHN0LCBVc2VBcmdzVHkgJiYuLi4gVXNlQXJncykgeworICAgIHJldHVybiBidWlsZEFuZChnZXREZXN0RnJvbUFyZyhEc3QpLCBnZXRSZWdGcm9tQXJnKFVzZUFyZ3MpLi4uKTsKKyAgfQorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkQW5kKHVuc2lnbmVkIFJlcywgdW5zaWduZWQgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wMSk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gR19PUiBccCBPcDAsIFxwIE9wMQorICAvLy8KKyAgLy8vIEdfT1Igc2V0cyBccCBSZXMgdG8gdGhlIGJpdHdpc2Ugb3Igb2YgaW50ZWdlciBwYXJhbWV0ZXJzIFxwIE9wMCBhbmQgXHAKKyAgLy8vIE9wMS4KKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMsIFxwIE9wMCBhbmQgXHAgT3AxIG11c3QgYmUgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVycworICAvLy8gICAgICB3aXRoIHRoZSBzYW1lIChzY2FsYXIgb3IgdmVjdG9yKSB0eXBlKS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEc3RUeSwgdHlwZW5hbWUuLi4gVXNlQXJnc1R5PgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkT3IoRHN0VHkgJiZEc3QsIFVzZUFyZ3NUeSAmJi4uLiBVc2VBcmdzKSB7CisgICAgcmV0dXJuIGJ1aWxkT3IoZ2V0RGVzdEZyb21BcmcoRHN0KSwgZ2V0UmVnRnJvbUFyZyhVc2VBcmdzKS4uLik7CisgIH0KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZE9yKHVuc2lnbmVkIFJlcywgdW5zaWduZWQgT3AwLCB1bnNpZ25lZCBPcDEpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfQU5ZRVhUIFxwIE9wMAorICAvLy8KKyAgLy8vIEdfQU5ZRVhUIHByb2R1Y2VzIGEgcmVnaXN0ZXIgb2YgdGhlIHNwZWNpZmllZCB3aWR0aCwgd2l0aCBiaXRzIDAgdG8KKyAgLy8vIHNpemVvZihccCBUeSkgKiA4IHNldCB0byBccCBPcC4gVGhlIHJlbWFpbmluZyBiaXRzIGFyZSB1bnNwZWNpZmllZAorICAvLy8gKGkuZS4gdGhpcyBpcyBuZWl0aGVyIHplcm8gbm9yIHNpZ24tZXh0ZW5zaW9uKS4gRm9yIGEgdmVjdG9yIHJlZ2lzdGVyLAorICAvLy8gZWFjaCBlbGVtZW50IGlzIGV4dGVuZGVkIGluZGl2aWR1YWxseS4KKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciBvciB2ZWN0b3IgdHlwZS4KKyAgLy8vIFxwcmUgXHAgT3AgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciBvciB2ZWN0b3IgdHlwZS4KKyAgLy8vIFxwcmUgXHAgT3AgbXVzdCBiZSBzbWFsbGVyIHRoYW4gXHAgUmVzCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKworICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkQW55RXh0KHVuc2lnbmVkIFJlcywgdW5zaWduZWQgT3ApOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0VHlwZSwgdHlwZW5hbWUgQXJnVHlwZT4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEFueUV4dChEc3RUeXBlICYmUmVzLCBBcmdUeXBlICYmQXJnKSB7CisgICAgcmV0dXJuIGJ1aWxkQW55RXh0KGdldERlc3RGcm9tQXJnKFJlcyksIGdldFJlZ0Zyb21BcmcoQXJnKSk7CisgIH0KKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBccCBSZXMgPSBHX1NFWFQgXHAgT3AKKyAgLy8vCisgIC8vLyBHX1NFWFQgcHJvZHVjZXMgYSByZWdpc3RlciBvZiB0aGUgc3BlY2lmaWVkIHdpZHRoLCB3aXRoIGJpdHMgMCB0bworICAvLy8gc2l6ZW9mKFxwIFR5KSAqIDggc2V0IHRvIFxwIE9wLiBUaGUgcmVtYWluaW5nIGJpdHMgYXJlIGR1cGxpY2F0ZWQgZnJvbSB0aGUKKyAgLy8vIGhpZ2ggYml0IG9mIFxwIE9wIChpLmUuIDJzLWNvbXBsZW1lbnQgc2lnbiBleHRlbmRlZCkuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIgb3IgdmVjdG9yIHR5cGUuCisgIC8vLyBccHJlIFxwIE9wIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIgb3IgdmVjdG9yIHR5cGUuCisgIC8vLyBccHJlIFxwIE9wIG11c3QgYmUgc21hbGxlciB0aGFuIFxwIFJlcworICAvLy8KKyAgLy8vIFxyZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEc3RUeXBlLCB0eXBlbmFtZSBBcmdUeXBlPgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkU0V4dChEc3RUeXBlICYmUmVzLCBBcmdUeXBlICYmQXJnKSB7CisgICAgcmV0dXJuIGJ1aWxkU0V4dChnZXREZXN0RnJvbUFyZyhSZXMpLCBnZXRSZWdGcm9tQXJnKEFyZykpOworICB9CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRTRXh0KHVuc2lnbmVkIFJlcywgdW5zaWduZWQgT3ApOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfWkVYVCBccCBPcAorICAvLy8KKyAgLy8vIEdfWkVYVCBwcm9kdWNlcyBhIHJlZ2lzdGVyIG9mIHRoZSBzcGVjaWZpZWQgd2lkdGgsIHdpdGggYml0cyAwIHRvCisgIC8vLyBzaXplb2YoXHAgVHkpICogOCBzZXQgdG8gXHAgT3AuIFRoZSByZW1haW5pbmcgYml0cyBhcmUgMC4gRm9yIGEgdmVjdG9yCisgIC8vLyByZWdpc3RlciwgZWFjaCBlbGVtZW50IGlzIGV4dGVuZGVkIGluZGl2aWR1YWxseS4KKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciBvciB2ZWN0b3IgdHlwZS4KKyAgLy8vIFxwcmUgXHAgT3AgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciBvciB2ZWN0b3IgdHlwZS4KKyAgLy8vIFxwcmUgXHAgT3AgbXVzdCBiZSBzbWFsbGVyIHRoYW4gXHAgUmVzCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERzdFR5cGUsIHR5cGVuYW1lIEFyZ1R5cGU+CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRaRXh0KERzdFR5cGUgJiZSZXMsIEFyZ1R5cGUgJiZBcmcpIHsKKyAgICByZXR1cm4gYnVpbGRaRXh0KGdldERlc3RGcm9tQXJnKFJlcyksIGdldFJlZ0Zyb21BcmcoQXJnKSk7CisgIH0KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZFpFeHQodW5zaWduZWQgUmVzLCB1bnNpZ25lZCBPcCk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gR19TRVhUIFxwIE9wLCBccCBSZXMgPSBHX1RSVU5DIFxwIE9wLCBvcgorICAvLy8gXHAgUmVzID0gQ09QWSBccCBPcCBkZXBlbmRpbmcgb24gdGhlIGRpZmZlcmluZyBzaXplcyBvZiBccCBSZXMgYW5kIFxwIE9wLgorICAvLy8gIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIgb3IgdmVjdG9yIHR5cGUuCisgIC8vLyBccHJlIFxwIE9wIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIgb3IgdmVjdG9yIHR5cGUuCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERzdFR5LCB0eXBlbmFtZSBVc2VBcmdUeT4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZFNFeHRPclRydW5jKERzdFR5ICYmRHN0LCBVc2VBcmdUeSAmJlVzZSkgeworICAgIHJldHVybiBidWlsZFNFeHRPclRydW5jKGdldERlc3RGcm9tQXJnKERzdCksIGdldFJlZ0Zyb21BcmcoVXNlKSk7CisgIH0KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZFNFeHRPclRydW5jKHVuc2lnbmVkIFJlcywgdW5zaWduZWQgT3ApOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfWkVYVCBccCBPcCwgXHAgUmVzID0gR19UUlVOQyBccCBPcCwgb3IKKyAgLy8vIFxwIFJlcyA9IENPUFkgXHAgT3AgZGVwZW5kaW5nIG9uIHRoZSBkaWZmZXJpbmcgc2l6ZXMgb2YgXHAgUmVzIGFuZCBccCBPcC4KKyAgLy8vICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFJlcyBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIHdpdGggc2NhbGFyIG9yIHZlY3RvciB0eXBlLgorICAvLy8gXHByZSBccCBPcCBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIHdpdGggc2NhbGFyIG9yIHZlY3RvciB0eXBlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEc3RUeSwgdHlwZW5hbWUgVXNlQXJnVHk+CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRaRXh0T3JUcnVuYyhEc3RUeSAmJkRzdCwgVXNlQXJnVHkgJiZVc2UpIHsKKyAgICByZXR1cm4gYnVpbGRaRXh0T3JUcnVuYyhnZXREZXN0RnJvbUFyZyhEc3QpLCBnZXRSZWdGcm9tQXJnKFVzZSkpOworICB9CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRaRXh0T3JUcnVuYyh1bnNpZ25lZCBSZXMsIHVuc2lnbmVkIE9wKTsKKworICAvLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfQU5ZRVhUIFxwIE9wLCBccCBSZXMgPSBHX1RSVU5DIFxwIE9wLCBvcgorICAvLy8gXHAgUmVzID0gQ09QWSBccCBPcCBkZXBlbmRpbmcgb24gdGhlIGRpZmZlcmluZyBzaXplcyBvZiBccCBSZXMgYW5kIFxwIE9wLgorICAvLy8gIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIgb3IgdmVjdG9yIHR5cGUuCisgIC8vLyBccHJlIFxwIE9wIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIgb3IgdmVjdG9yIHR5cGUuCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERzdFR5LCB0eXBlbmFtZSBVc2VBcmdUeT4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEFueUV4dE9yVHJ1bmMoRHN0VHkgJiZEc3QsIFVzZUFyZ1R5ICYmVXNlKSB7CisgICAgcmV0dXJuIGJ1aWxkQW55RXh0T3JUcnVuYyhnZXREZXN0RnJvbUFyZyhEc3QpLCBnZXRSZWdGcm9tQXJnKFVzZSkpOworICB9CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRBbnlFeHRPclRydW5jKHVuc2lnbmVkIFJlcywgdW5zaWduZWQgT3ApOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IFxwIEV4dE9wYywgXHAgUmVzID0gR19UUlVOQyBccAorICAvLy8gT3AsIG9yIFxwIFJlcyA9IENPUFkgXHAgT3AgZGVwZW5kaW5nIG9uIHRoZSBkaWZmZXJpbmcgc2l6ZXMgb2YgXHAgUmVzIGFuZAorICAvLy8gXHAgT3AuCisgIC8vLyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciBvciB2ZWN0b3IgdHlwZS4KKyAgLy8vIFxwcmUgXHAgT3AgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciBvciB2ZWN0b3IgdHlwZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkRXh0T3JUcnVuYyh1bnNpZ25lZCBFeHRPcGMsIHVuc2lnbmVkIFJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3ApOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IGFuIGFwcHJvcHJpYXRlIGNhc3QgYmV0d2VlbiB0d28gcmVnaXN0ZXJzIG9mIGVxdWFsIHNpemUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEc3RUeXBlLCB0eXBlbmFtZSBBcmdUeXBlPgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkQ2FzdChEc3RUeXBlICYmUmVzLCBBcmdUeXBlICYmQXJnKSB7CisgICAgcmV0dXJuIGJ1aWxkQ2FzdChnZXREZXN0RnJvbUFyZyhSZXMpLCBnZXRSZWdGcm9tQXJnKEFyZykpOworICB9CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRDYXN0KHVuc2lnbmVkIERzdCwgdW5zaWduZWQgU3JjKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBHX0JSIFxwIERlc3QKKyAgLy8vCisgIC8vLyBHX0JSIGlzIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIHRvIFxwIERlc3QuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRCcihNYWNoaW5lQmFzaWNCbG9jayAmQkIpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IEdfQlJDT05EIFxwIFRzdCwgXHAgRGVzdAorICAvLy8KKyAgLy8vIEdfQlJDT05EIGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoIHRvIFxwIERlc3QuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgVHN0IG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIKKyAgLy8vICAgICAgdHlwZS4gQXQgdGhlIGJlZ2lubmluZyBvZiBsZWdhbGl6YXRpb24sIHRoaXMgd2lsbCBiZSBhIHNpbmdsZQorICAvLy8gICAgICBiaXQgKHMxKS4gVGFyZ2V0cyB3aXRoIGludGVyZXN0aW5nIGZsYWdzIHJlZ2lzdGVycyBtYXkgY2hhbmdlCisgIC8vLyAgICAgIHRoaXMuIEZvciBhIHdpZGVyIHR5cGUsIHdoZXRoZXIgdGhlIGJyYW5jaCBpcyB0YWtlbiBtdXN0IG9ubHkKKyAgLy8vICAgICAgZGVwZW5kIG9uIGJpdCAwIChmb3Igbm93KS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkQnJDb25kKHVuc2lnbmVkIFRzdCwgTWFjaGluZUJhc2ljQmxvY2sgJkJCKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBHX0JSSU5ESVJFQ1QgXHAgVGd0CisgIC8vLworICAvLy8gR19CUklORElSRUNUIGlzIGFuIGluZGlyZWN0IGJyYW5jaCB0byBccCBUZ3QuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgVGd0IG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBwb2ludGVyIHR5cGUuCisgIC8vLworICAvLy8gXHJldHVybiBhIE1hY2hpbmVJbnN0ckJ1aWxkZXIgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkQnJJbmRpcmVjdCh1bnNpZ25lZCBUZ3QpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfQ09OU1RBTlQgXHAgVmFsCisgIC8vLworICAvLy8gR19DT05TVEFOVCBpcyBhbiBpbnRlZ2VyIGNvbnN0YW50IHdpdGggdGhlIHNwZWNpZmllZCBzaXplIGFuZCB2YWx1ZS4gXHAKKyAgLy8vIFZhbCB3aWxsIGJlIGV4dGVuZGVkIG9yIHRydW5jYXRlZCB0byB0aGUgc2l6ZSBvZiBccCBSZWcuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIgb3IgcG9pbnRlcgorICAvLy8gICAgICB0eXBlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRDb25zdGFudCh1bnNpZ25lZCBSZXMsIGNvbnN0IENvbnN0YW50SW50ICZWYWwpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfQ09OU1RBTlQgXHAgVmFsCisgIC8vLworICAvLy8gR19DT05TVEFOVCBpcyBhbiBpbnRlZ2VyIGNvbnN0YW50IHdpdGggdGhlIHNwZWNpZmllZCBzaXplIGFuZCB2YWx1ZS4KKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciB0eXBlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRDb25zdGFudCh1bnNpZ25lZCBSZXMsIGludDY0X3QgVmFsKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0VHlwZT4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZENvbnN0YW50KERzdFR5cGUgJiZSZXMsIGludDY0X3QgVmFsKSB7CisgICAgcmV0dXJuIGJ1aWxkQ29uc3RhbnQoZ2V0RGVzdEZyb21BcmcoUmVzKSwgVmFsKTsKKyAgfQorICAvLy8gQnVpbGQgYW5kIGluc2VydCBccCBSZXMgPSBHX0ZDT05TVEFOVCBccCBWYWwKKyAgLy8vCisgIC8vLyBHX0ZDT05TVEFOVCBpcyBhIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50IHdpdGggdGhlIHNwZWNpZmllZCBzaXplIGFuZAorICAvLy8gdmFsdWUuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIgdHlwZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0VHlwZT4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEZDb25zdGFudChEc3RUeXBlICYmUmVzLCBjb25zdCBDb25zdGFudEZQICZWYWwpIHsKKyAgICByZXR1cm4gYnVpbGRGQ29uc3RhbnQoZ2V0RGVzdEZyb21BcmcoUmVzKSwgVmFsKTsKKyAgfQorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkRkNvbnN0YW50KHVuc2lnbmVkIFJlcywgY29uc3QgQ29uc3RhbnRGUCAmVmFsKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0VHlwZT4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEZDb25zdGFudChEc3RUeXBlICYmUmVzLCBkb3VibGUgVmFsKSB7CisgICAgcmV0dXJuIGJ1aWxkRkNvbnN0YW50KGdldERlc3RGcm9tQXJnKFJlcyksIFZhbCk7CisgIH0KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEZDb25zdGFudCh1bnNpZ25lZCBSZXMsIGRvdWJsZSBWYWwpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IENPUFkgT3AKKyAgLy8vCisgIC8vLyBSZWdpc3Rlci10by1yZWdpc3RlciBDT1BZIHNldHMgXHAgUmVzIHRvIFxwIE9wLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLworICAvLy8gXHJldHVybiBhIE1hY2hpbmVJbnN0ckJ1aWxkZXIgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkQ29weSh1bnNpZ25lZCBSZXMsIHVuc2lnbmVkIE9wKTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERzdFR5cGUsIHR5cGVuYW1lIFNyY1R5cGU+CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRDb3B5KERzdFR5cGUgJiZSZXMsIFNyY1R5cGUgJiZTcmMpIHsKKyAgICByZXR1cm4gYnVpbGRDb3B5KGdldERlc3RGcm9tQXJnKFJlcyksIGdldFJlZ0Zyb21BcmcoU3JjKSk7CisgIH0KKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBgUmVzID0gR19MT0FEIEFkZHIsIE1NT2AuCisgIC8vLworICAvLy8gTG9hZHMgdGhlIHZhbHVlIHN0b3JlZCBhdCBccCBBZGRyLiBQdXRzIHRoZSByZXN1bHQgaW4gXHAgUmVzLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFJlcyBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyLgorICAvLy8gXHByZSBccCBBZGRyIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBwb2ludGVyIHR5cGUuCisgIC8vLworICAvLy8gXHJldHVybiBhIE1hY2hpbmVJbnN0ckJ1aWxkZXIgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkTG9hZCh1bnNpZ25lZCBSZXMsIHVuc2lnbmVkIEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICZNTU8pOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IGBHX1NUT1JFIFZhbCwgQWRkciwgTU1PYC4KKyAgLy8vCisgIC8vLyBTdG9yZXMgdGhlIHZhbHVlIFxwIFZhbCB0byBccCBBZGRyLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFZhbCBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyLgorICAvLy8gXHByZSBccCBBZGRyIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBwb2ludGVyIHR5cGUuCisgIC8vLworICAvLy8gXHJldHVybiBhIE1hY2hpbmVJbnN0ckJ1aWxkZXIgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkU3RvcmUodW5zaWduZWQgVmFsLCB1bnNpZ25lZCBBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgJk1NTyk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgYFJlczAsIC4uLiA9IEdfRVhUUkFDVCBTcmMsIElkeDBgLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFJlcyBhbmQgXHAgU3JjIG11c3QgYmUgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVycy4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRFeHRyYWN0KHVuc2lnbmVkIFJlcywgdW5zaWduZWQgU3JjLCB1aW50NjRfdCBJbmRleCk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gSU1QTElDSVRfREVGLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0VHlwZT4gTWFjaGluZUluc3RyQnVpbGRlciBidWlsZFVuZGVmKERzdFR5cGUgJiZSZXMpIHsKKyAgICByZXR1cm4gYnVpbGRVbmRlZihnZXREZXN0RnJvbUFyZyhSZXMpKTsKKyAgfQorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkVW5kZWYodW5zaWduZWQgRHN0KTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBpbnN0cnVjdGlvbnMgdG8gcHV0IFxwIE9wcyB0b2dldGhlciBhdCB0aGUgc3BlY2lmaWVkIHAKKyAgLy8vIEluZGljZXMgdG8gZm9ybSBhIGxhcmdlciByZWdpc3Rlci4KKyAgLy8vCisgIC8vLyBJZiB0aGUgdHlwZXMgb2YgdGhlIGlucHV0IHJlZ2lzdGVycyBhcmUgdW5pZm9ybSBhbmQgY292ZXIgdGhlIGVudGlyaXR5IG9mCisgIC8vLyBccCBSZXMgdGhlbiBhIEdfTUVSR0VfVkFMVUVTIHdpbGwgYmUgcHJvZHVjZWQuIE90aGVyd2lzZSBhbiBJTVBMSUNJVF9ERUYKKyAgLy8vIGZvbGxvd2VkIGJ5IGEgc2VxdWVuY2Ugb2YgR19JTlNFUlQgaW5zdHJ1Y3Rpb25zLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFRoZSBmaW5hbCBlbGVtZW50IG9mIHRoZSBzZXF1ZW5jZSBtdXN0IG5vdCBleHRlbmQgcGFzdCB0aGUgZW5kIG9mIHRoZQorICAvLy8gICAgICBkZXN0aW5hdGlvbiByZWdpc3Rlci4KKyAgLy8vIFxwcmUgVGhlIGJpdHMgZGVmaW5lZCBieSBlYWNoIE9wIChkZXJpdmVkIGZyb20gaW5kZXggYW5kIHNjYWxhciBzaXplKSBtdXN0CisgIC8vLyAgICAgIG5vdCBvdmVybGFwLgorICAvLy8gXHByZSBccCBJbmRpY2VzIG11c3QgYmUgaW4gYXNjZW5kaW5nIG9yZGVyIG9mIGJpdCBwb3NpdGlvbi4KKyAgdm9pZCBidWlsZFNlcXVlbmNlKHVuc2lnbmVkIFJlcywgQXJyYXlSZWY8dW5zaWduZWQ+IE9wcywKKyAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ2NF90PiBJbmRpY2VzKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBccCBSZXMgPSBHX01FUkdFX1ZBTFVFUyBccCBPcDAsIC4uLgorICAvLy8KKyAgLy8vIEdfTUVSR0VfVkFMVUVTIGNvbWJpbmVzIHRoZSBpbnB1dCBlbGVtZW50cyBjb250aWd1b3VzbHkgaW50byBhIGxhcmdlcgorICAvLy8gcmVnaXN0ZXIuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgVGhlIGVudGlyZSByZWdpc3RlciBccCBSZXMgKGFuZCBubyBtb3JlKSBtdXN0IGJlIGNvdmVyZWQgYnkgdGhlIGlucHV0CisgIC8vLyAgICAgIHJlZ2lzdGVycy4KKyAgLy8vIFxwcmUgVGhlIHR5cGUgb2YgYWxsIFxwIE9wcyByZWdpc3RlcnMgbXVzdCBiZSBpZGVudGljYWwuCisgIC8vLworICAvLy8gXHJldHVybiBhIE1hY2hpbmVJbnN0ckJ1aWxkZXIgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkTWVyZ2UodW5zaWduZWQgUmVzLCBBcnJheVJlZjx1bnNpZ25lZD4gT3BzKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBccCBSZXMwLCAuLi4gPSBHX1VOTUVSR0VfVkFMVUVTIFxwIE9wCisgIC8vLworICAvLy8gR19VTk1FUkdFX1ZBTFVFUyBzcGxpdHMgY29udGlndW91cyBiaXRzIG9mIHRoZSBpbnB1dCBpbnRvIG11bHRpcGxlCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgVGhlIGVudGlyZSByZWdpc3RlciBccCBSZXMgKGFuZCBubyBtb3JlKSBtdXN0IGJlIGNvdmVyZWQgYnkgdGhlIGlucHV0CisgIC8vLyAgICAgIHJlZ2lzdGVycy4KKyAgLy8vIFxwcmUgVGhlIHR5cGUgb2YgYWxsIFxwIFJlcyByZWdpc3RlcnMgbXVzdCBiZSBpZGVudGljYWwuCisgIC8vLworICAvLy8gXHJldHVybiBhIE1hY2hpbmVJbnN0ckJ1aWxkZXIgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkVW5tZXJnZShBcnJheVJlZjx1bnNpZ25lZD4gUmVzLCB1bnNpZ25lZCBPcCk7CisKKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEluc2VydCh1bnNpZ25lZCBSZXMsIHVuc2lnbmVkIFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcCwgdW5zaWduZWQgSW5kZXgpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IGVpdGhlciBhIEdfSU5UUklOU0lDIChpZiBccCBIYXNTaWRlRWZmZWN0cyBpcyBmYWxzZSkgb3IKKyAgLy8vIEdfSU5UUklOU0lDX1dfU0lERV9FRkZFQ1RTIGluc3RydWN0aW9uLiBJdHMgZmlyc3Qgb3BlcmFuZCB3aWxsIGJlIHRoZQorICAvLy8gcmVzdWx0IHJlZ2lzdGVyIGRlZmluaXRpb24gdW5sZXNzIFxwIFJlZyBpcyBOb1JlZyAoPT0gMCkuIFRoZSBzZWNvbmQKKyAgLy8vIG9wZXJhbmQgd2lsbCBiZSB0aGUgaW50cmluc2ljJ3MgSUQuCisgIC8vLworICAvLy8gQ2FsbGVycyBhcmUgZXhwZWN0ZWQgdG8gYWRkIHRoZSByZXF1aXJlZCBkZWZpbml0aW9ucyBhbmQgdXNlcyBhZnRlcndhcmRzLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLworICAvLy8gXHJldHVybiBhIE1hY2hpbmVJbnN0ckJ1aWxkZXIgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkSW50cmluc2ljKEludHJpbnNpYzo6SUQgSUQsIHVuc2lnbmVkIFJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc1NpZGVFZmZlY3RzKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBccCBSZXMgPSBHX0ZQVFJVTkMgXHAgT3AKKyAgLy8vCisgIC8vLyBHX0ZQVFJVTkMgY29udmVydHMgYSBmbG9hdGluZy1wb2ludCB2YWx1ZSBpbnRvIG9uZSB3aXRoIGEgc21hbGxlciB0eXBlLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFJlcyBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIHdpdGggc2NhbGFyIG9yIHZlY3RvciB0eXBlLgorICAvLy8gXHByZSBccCBPcCBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIHdpdGggc2NhbGFyIG9yIHZlY3RvciB0eXBlLgorICAvLy8gXHByZSBccCBSZXMgbXVzdCBiZSBzbWFsbGVyIHRoYW4gXHAgT3AKKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0VHlwZSwgdHlwZW5hbWUgU3JjVHlwZT4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEZQVHJ1bmMoRHN0VHlwZSAmJlJlcywgU3JjVHlwZSAmJlNyYykgeworICAgIHJldHVybiBidWlsZEZQVHJ1bmMoZ2V0RGVzdEZyb21BcmcoUmVzKSwgZ2V0UmVnRnJvbUFyZyhTcmMpKTsKKyAgfQorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkRlBUcnVuYyh1bnNpZ25lZCBSZXMsIHVuc2lnbmVkIE9wKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBccCBSZXMgPSBHX1RSVU5DIFxwIE9wCisgIC8vLworICAvLy8gR19UUlVOQyBleHRyYWN0cyB0aGUgbG93IGJpdHMgb2YgYSB0eXBlLiBGb3IgYSB2ZWN0b3IgdHlwZSBlYWNoIGVsZW1lbnQgaXMKKyAgLy8vIHRydW5jYXRlZCBpbmRlcGVuZGVudGx5IGJlZm9yZSBiZWluZyBwYWNrZWQgaW50byB0aGUgZGVzdGluYXRpb24uCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIgb3IgdmVjdG9yIHR5cGUuCisgIC8vLyBccHJlIFxwIE9wIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIgb3IgdmVjdG9yIHR5cGUuCisgIC8vLyBccHJlIFxwIFJlcyBtdXN0IGJlIHNtYWxsZXIgdGhhbiBccCBPcAorICAvLy8KKyAgLy8vIFxyZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRUcnVuYyh1bnNpZ25lZCBSZXMsIHVuc2lnbmVkIE9wKTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERzdFR5cGUsIHR5cGVuYW1lIFNyY1R5cGU+CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRUcnVuYyhEc3RUeXBlICYmUmVzLCBTcmNUeXBlICYmU3JjKSB7CisgICAgcmV0dXJuIGJ1aWxkVHJ1bmMoZ2V0RGVzdEZyb21BcmcoUmVzKSwgZ2V0UmVnRnJvbUFyZyhTcmMpKTsKKyAgfQorCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IGEgXHAgUmVzID0gR19JQ01QIFxwIFByZWQsIFxwIE9wMCwgXHAgT3AxCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworICAvLy8gXHByZSBccCBSZXMgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciBvcgorICAvLy8gICAgICB2ZWN0b3IgdHlwZS4gVHlwaWNhbGx5IHRoaXMgc3RhcnRzIGFzIHMxIG9yIDxOIHggczE+LgorICAvLy8gXHByZSBccCBPcDAgYW5kIE9wMSBtdXN0IGJlIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlcnMgd2l0aCB0aGUKKyAgLy8vICAgICAgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMgYXMgXHAgUmVzLiBJZiBccCBSZXMgaXMgYSBzY2FsYXIsCisgIC8vLyAgICAgIFxwIE9wMCBtdXN0IGJlIGVpdGhlciBhIHNjYWxhciBvciBwb2ludGVyLgorICAvLy8gXHByZSBccCBQcmVkIG11c3QgYmUgYW4gaW50ZWdlciBwcmVkaWNhdGUuCisgIC8vLworICAvLy8gXHJldHVybiBhIE1hY2hpbmVJbnN0ckJ1aWxkZXIgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkSUNtcChDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVzLCB1bnNpZ25lZCBPcDAsIHVuc2lnbmVkIE9wMSk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgYSBccCBSZXMgPSBHX0ZDTVAgXHAgUHJlZFxwIE9wMCwgXHAgT3AxCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworICAvLy8gXHByZSBccCBSZXMgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciBvcgorICAvLy8gICAgICB2ZWN0b3IgdHlwZS4gVHlwaWNhbGx5IHRoaXMgc3RhcnRzIGFzIHMxIG9yIDxOIHggczE+LgorICAvLy8gXHByZSBccCBPcDAgYW5kIE9wMSBtdXN0IGJlIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlcnMgd2l0aCB0aGUKKyAgLy8vICAgICAgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMgYXMgXHAgUmVzIChvciBzY2FsYXIsIGlmIFxwIFJlcyBpcworICAvLy8gICAgICBzY2FsYXIpLgorICAvLy8gXHByZSBccCBQcmVkIG11c3QgYmUgYSBmbG9hdGluZy1wb2ludCBwcmVkaWNhdGUuCisgIC8vLworICAvLy8gXHJldHVybiBhIE1hY2hpbmVJbnN0ckJ1aWxkZXIgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkRkNtcChDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVzLCB1bnNpZ25lZCBPcDAsIHVuc2lnbmVkIE9wMSk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgYSBccCBSZXMgPSBHX1NFTEVDVCBccCBUc3QsIFxwIE9wMCwgXHAgT3AxCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzLCBccCBPcDAgYW5kIFxwIE9wMSBtdXN0IGJlIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlcnMKKyAgLy8vICAgICAgd2l0aCB0aGUgc2FtZSB0eXBlLgorICAvLy8gXHByZSBccCBUc3QgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciwgcG9pbnRlciBvcgorICAvLy8gICAgICB2ZWN0b3IgdHlwZS4gSWYgdmVjdG9yIHRoZW4gaXQgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZgorICAvLy8gICAgICBlbGVtZW50cyBhcyB0aGUgb3RoZXIgcGFyYW1ldGVycy4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRTZWxlY3QodW5zaWduZWQgUmVzLCB1bnNpZ25lZCBUc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3AwLCB1bnNpZ25lZCBPcDEpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfSU5TRVJUX1ZFQ1RPUl9FTFQgXHAgVmFsLAorICAvLy8gXHAgRWx0LCBccCBJZHgKKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMgYW5kIFxwIFZhbCBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyCisgIC8vICAgICAgIHdpdGggdGhlIHNhbWUgdmVjdG9yIHR5cGUuCisgIC8vLyBccHJlIFxwIEVsdCBhbmQgXHAgSWR4IG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIKKyAgLy8vICAgICAgd2l0aCBzY2FsYXIgdHlwZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkSW5zZXJ0VmVjdG9yRWxlbWVudCh1bnNpZ25lZCBSZXMsIHVuc2lnbmVkIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRWx0LCB1bnNpZ25lZCBJZHgpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfRVhUUkFDVF9WRUNUT1JfRUxUIFxwIFZhbCwgXHAgSWR4CisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIgdHlwZS4KKyAgLy8vIFxwcmUgXHAgVmFsIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCB2ZWN0b3IgdHlwZS4KKyAgLy8vIFxwcmUgXHAgSWR4IG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIgdHlwZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkRXh0cmFjdFZlY3RvckVsZW1lbnQodW5zaWduZWQgUmVzLCB1bnNpZ25lZCBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJZHgpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IGBPbGRWYWxSZXMgPSBHX0FUT01JQ19DTVBYQ0hHIEFkZHIsIENtcFZhbCwgTmV3VmFsLAorICAvLy8gTU1PYC4KKyAgLy8vCisgIC8vLyBBdG9taWNhbGx5IHJlcGxhY2UgdGhlIHZhbHVlIGF0IFxwIEFkZHIgd2l0aCBccCBOZXdWYWwgaWYgaXQgaXMgY3VycmVudGx5CisgIC8vLyBccCBDbXBWYWwgb3RoZXJ3aXNlIGxlYXZlcyBpdCB1bmNoYW5nZWQuIFB1dHMgdGhlIG9yaWdpbmFsIHZhbHVlIGZyb20gXHAKKyAgLy8vIEFkZHIgaW4gXHAgUmVzLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIE9sZFZhbFJlcyBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIG9mIHNjYWxhciB0eXBlLgorICAvLy8gXHByZSBccCBBZGRyIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBwb2ludGVyIHR5cGUuCisgIC8vLyBccHJlIFxwIE9sZFZhbFJlcywgXHAgQ21wVmFsLCBhbmQgXHAgTmV3VmFsIG11c3QgYmUgZ2VuZXJpYyB2aXJ0dWFsCisgIC8vLyAgICAgIHJlZ2lzdGVycyBvZiB0aGUgc2FtZSB0eXBlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gYSBNYWNoaW5lSW5zdHJCdWlsZGVyIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEF0b21pY0NtcFhjaGcodW5zaWduZWQgT2xkVmFsUmVzLCB1bnNpZ25lZCBBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDbXBWYWwsIHVuc2lnbmVkIE5ld1ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgJk1NTyk7Cit9OworCit9IC8vIEVuZCBuYW1lc3BhY2UgbGx2bS4KKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9NQUNISU5FSVJCVUlMREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1JlZ0JhbmtTZWxlY3QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1JlZ0JhbmtTZWxlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTNhZTQxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvUmVnQmFua1NlbGVjdC5oCkBAIC0wLDAgKzEsNjY1IEBACisvLz0tIGxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1JlZ0JhbmtTZWxlY3QuaCAtIFJlZyBCYW5rIFNlbGVjdG9yIC0tKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZSBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIE1hY2hpbmVGdW5jdGlvblBhc3MKKy8vLyByZXNwb25zaWJsZSBmb3IgYXNzaWduaW5nIHRoZSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXJzIHRvIHJlZ2lzdGVyIGJhbmsuCisKKy8vLyBCeSBkZWZhdWx0LCB0aGUgcmVnIGJhbmsgc2VsZWN0b3IgcmVsaWVzIG9uIGxvY2FsIGRlY2lzaW9ucyB0bworLy8vIGFzc2lnbiB0aGUgcmVnaXN0ZXIgYmFuay4gSW4gb3RoZXIgd29yZHMsIGl0IGxvb2tzIGF0IG9uZSBpbnN0cnVjdGlvbgorLy8vIGF0IGEgdGltZSB0byBkZWNpZGUgd2hlcmUgdGhlIG9wZXJhbmQgb2YgdGhhdCBpbnN0cnVjdGlvbiBzaG91bGQgbGl2ZS4KKy8vLworLy8vIEF0IGhpZ2hlciBvcHRpbWl6YXRpb24gbGV2ZWwsIHdlIGNvdWxkIGltYWdpbmUgdGhhdCB0aGUgcmVnIGJhbmsgc2VsZWN0b3IKKy8vLyB3b3VsZCB1c2UgbW9yZSBnbG9iYWwgYW5hbHlzaXMgYW5kIGRvIGNyYXppZXIgdGhpbmcgbGlrZSBkdXBsaWNhdGluZworLy8vIGluc3RydWN0aW9ucyBhbmQgc28gb24uIFRoaXMgaXMgZnV0dXJlIHdvcmsuCisvLy8KKy8vLyBGb3Igbm93LCB0aGUgcGFzcyB1c2VzIGEgZ3JlZWR5IGFsZ29yaXRobSB0byBkZWNpZGUgd2hlcmUgdGhlIG9wZXJhbmQKKy8vLyBvZiBhbiBpbnN0cnVjdGlvbiBzaG91bGQgbGl2ZS4gSXQgYXNrcyB0aGUgdGFyZ2V0IHdoaWNoIGJhbmtzIG1heSBiZQorLy8vIHVzZWQgZm9yIGVhY2ggb3BlcmFuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24gYW5kIHdoYXQgaXMgdGhlIGNvc3QuIFRoZW4sCisvLy8gaXQgY2hvb3NlcyB0aGUgc29sdXRpb24gd2hpY2ggbWluaW1pemUgdGhlIGNvc3Qgb2YgdGhlIGluc3RydWN0aW9uIHBsdXMKKy8vLyB0aGUgY29zdCBvZiBhbnkgbW92ZSB0aGF0IG1heSBiZSBuZWVkZWQgdG8gdGhlIHZhbHVlcyBpbnRvIHRoZSByaWdodAorLy8vIHJlZ2lzdGVyIGJhbmsuCisvLy8gSW4gb3RoZXIgd29yZHMsIHRoZSBjb3N0IGZvciBhbiBpbnN0cnVjdGlvbiBvbiBhIHJlZ2lzdGVyIGJhbmsgUmVnQmFuaworLy8vIGlzOiBDb3N0IG9mIEkgb24gUmVnQmFuayBwbHVzIHRoZSBzdW0gb2YgdGhlIGNvc3QgZm9yIGJyaW5naW5nIHRoZQorLy8vIGlucHV0IG9wZXJhbmRzIGZyb20gdGhlaXIgY3VycmVudCByZWdpc3RlciBiYW5rIHRvIFJlZ0JhbmsuCisvLy8gVGh1cywgdGhlIGZvbGxvd2luZyBmb3JtdWxhOgorLy8vIGNvc3QoSSwgUmVnQmFuaykgPSBjb3N0KEkuT3Bjb2RlLCBSZWdCYW5rKSArCisvLy8gICAgc3VtKGZvciBlYWNoIGFyZyBpbiBJLmFyZ3VtZW50czogY29zdENyb3NzQ29weShhcmcuUmVnQmFuaywgUmVnQmFuaykpCisvLy8KKy8vLyBFLmcuLCBMZXQgc2F5IHdlIGFyZSBhc3NpZ25pbmcgdGhlIHJlZ2lzdGVyIGJhbmsgZm9yIHRoZSBpbnN0cnVjdGlvbgorLy8vIGRlZmluaW5nIHYyLgorLy8vIHYwKEFfUkVHQkFOSykgPSAuLi4KKy8vLyB2MShBX1JFR0JBTkspID0gLi4uCisvLy8gdjIgPSBHX0FERCBpMzIgdjAsIHYxIDwtLSBNSQorLy8vCisvLy8gVGhlIHRhcmdldCBtYXkgc2F5IGl0IGNhbiBnZW5lcmF0ZSBHX0FERCBpMzIgb24gcmVnaXN0ZXIgYmFuayBBIGFuZCBCCisvLy8gd2l0aCBhIGNvc3Qgb2YgcmVzcGVjdGl2ZWx5IDUgYW5kIDEuCisvLy8gVGhlbiwgbGV0IHNheSB0aGUgY29zdCBvZiBhIGNyb3NzIHJlZ2lzdGVyIGJhbmsgY29waWVzIGZyb20gQSB0byBCIGlzIDEuCisvLy8gVGhlIHJlZyBiYW5rIHNlbGVjdG9yIHdvdWxkIGNvbXBhcmUgdGhlIGZvbGxvd2luZyB0d28gY29zdHM6CisvLy8gY29zdChNSSwgQV9SRUdCQU5LKSA9IGNvc3QoR19BREQsIEFfUkVHQkFOSykgKyBjb3N0KHYwLlJlZ0JhbmssIEFfUkVHQkFOSykgKworLy8vICAgIGNvc3QodjEuUmVnQmFuaywgQV9SRUdCQU5LKQorLy8vICAgICAgICAgICAgICAgICAgICAgPSA1ICsgY29zdChBX1JFR0JBTkssIEFfUkVHQkFOSykgKyBjb3N0KEFfUkVHQkFOSywKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBX1JFR0JBTkspCisvLy8gICAgICAgICAgICAgICAgICAgICA9IDUgKyAwICsgMCA9IDUKKy8vLyBjb3N0KE1JLCBCX1JFR0JBTkspID0gY29zdChHX0FERCwgQl9SRUdCQU5LKSArIGNvc3QodjAuUmVnQmFuaywgQl9SRUdCQU5LKSArCisvLy8gICAgY29zdCh2MS5SZWdCYW5rLCBCX1JFR0JBTkspCisvLy8gICAgICAgICAgICAgICAgICAgICA9IDEgKyBjb3N0KEFfUkVHQkFOSywgQl9SRUdCQU5LKSArIGNvc3QoQV9SRUdCQU5LLAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJfUkVHQkFOSykKKy8vLyAgICAgICAgICAgICAgICAgICAgID0gMSArIDEgKyAxID0gMworLy8vIFRoZXJlZm9yZSwgaW4gdGhpcyBzcGVjaWZpYyBleGFtcGxlLCB0aGUgcmVnIGJhbmsgc2VsZWN0b3Igd291bGQgY2hvb3NlCisvLy8gYmFuayBCIGZvciBNSS4KKy8vLyB2MChBX1JFR0JBTkspID0gLi4uCisvLy8gdjEoQV9SRUdCQU5LKSA9IC4uLgorLy8vIHRtcDAoQl9SRUdCQU5LKSA9IENPUFkgdjAKKy8vLyB0bXAxKEJfUkVHQkFOSykgPSBDT1BZIHYxCisvLy8gdjIoQl9SRUdCQU5LKSA9IEdfQUREIGkzMiB0bXAwLCB0bXAxCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9SRUdCQU5LU0VMRUNUX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfUkVHQkFOS1NFTEVDVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL01hY2hpbmVJUkJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9SZWdpc3RlckJhbmtJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJsb2NrRnJlcXVlbmN5OworY2xhc3MgTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mbzsKK2NsYXNzIE1hY2hpbmVCcmFuY2hQcm9iYWJpbGl0eUluZm87CitjbGFzcyBNYWNoaW5lT3BlcmFuZDsKK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CitjbGFzcyBQYXNzOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBUYXJnZXRQYXNzQ29uZmlnOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworCisvLy8gVGhpcyBwYXNzIGltcGxlbWVudHMgdGhlIHJlZyBiYW5rIHNlbGVjdG9yIHBhc3MgdXNlZCBpbiB0aGUgR2xvYmFsSVNlbAorLy8vIHBpcGVsaW5lLiBBdCB0aGUgZW5kIG9mIHRoaXMgcGFzcywgYWxsIHJlZ2lzdGVyIG9wZXJhbmRzIGhhdmUgYmVlbiBhc3NpZ25lZAorY2xhc3MgUmVnQmFua1NlbGVjdCA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgLy8vIExpc3Qgb2YgdGhlIG1vZGVzIHN1cHBvcnRlZCBieSB0aGUgUmVnQmFua1NlbGVjdCBwYXNzLgorICBlbnVtIE1vZGUgeworICAgIC8vLyBBc3NpZ24gdGhlIHJlZ2lzdGVyIGJhbmtzIGFzIGZhc3QgYXMgcG9zc2libGUgKGRlZmF1bHQpLgorICAgIEZhc3QsCisgICAgLy8vIEdyZWVkaWx5IG1pbmltaXplIHRoZSBjb3N0IG9mIGFzc2lnbmluZyByZWdpc3RlciBiYW5rcy4KKyAgICAvLy8gVGhpcyBzaG91bGQgcHJvZHVjZSBjb2RlIG9mIGdyZWF0ZXIgcXVhbGl0eSwgYnV0IHdpbGwKKyAgICAvLy8gcmVxdWlyZSBtb3JlIGNvbXBpbGUgdGltZS4KKyAgICBHcmVlZHkKKyAgfTsKKworICAvLy8gQWJzdHJhY3QgY2xhc3MgdXNlZCB0byByZXByZXNlbnQgYW4gaW5zZXJ0aW9uIHBvaW50IGluIGEgQ0ZHLgorICAvLy8gVGhpcyBjbGFzcyByZWNvcmRzIGFuIGluc2VydGlvbiBwb2ludCBhbmQgbWF0ZXJpYWxpemVzIGl0IG9uCisgIC8vLyBkZW1hbmQuCisgIC8vLyBJdCBhbGxvd3MgdG8gcmVhc29uIGFib3V0IHRoZSBmcmVxdWVuY3kgb2YgdGhpcyBpbnNlcnRpb24gcG9pbnQsCisgIC8vLyB3aXRob3V0IGhhdmluZyB0byBsb2dpY2FsbHkgbWF0ZXJpYWxpemUgaXQgKGUuZy4sIG9uIGFuIGVkZ2UpLAorICAvLy8gYmVmb3JlIHdlIGFjdHVhbGx5IG5lZWQgdG8gaW5zZXJ0IHNvbWV0aGluZy4KKyAgY2xhc3MgSW5zZXJ0UG9pbnQgeworICBwcm90ZWN0ZWQ6CisgICAgLy8vIFRlbGwgaWYgdGhlIGluc2VydCBwb2ludCBoYXMgYWxyZWFkeSBiZWVuIG1hdGVyaWFsaXplZC4KKyAgICBib29sIFdhc01hdGVyaWFsaXplZCA9IGZhbHNlOworCisgICAgLy8vIE1hdGVyaWFsaXplIHRoZSBpbnNlcnRpb24gcG9pbnQuCisgICAgLy8vCisgICAgLy8vIElmIGlzU3BsaXQoKSBpcyB0cnVlLCB0aGlzIGludm9sdmVzIGFjdHVhbGx5IHNwbGl0dGluZworICAgIC8vLyB0aGUgYmxvY2sgb3IgZWRnZS4KKyAgICAvLy8KKyAgICAvLy8gXHBvc3QgZ2V0UG9pbnRJbXBsKCkgcmV0dXJucyBhIHZhbGlkIGl0ZXJhdG9yLgorICAgIC8vLyBccG9zdCBnZXRJbnNlcnRNQkJJbXBsKCkgcmV0dXJucyBhIHZhbGlkIGJhc2ljIGJsb2NrLgorICAgIC8vLyBccG9zdCBpc1NwbGl0KCkgPT0gZmFsc2UgOyBubyBtb3JlIHNwbGl0dGluZyBzaG91bGQgYmUgcmVxdWlyZWQuCisgICAgdmlydHVhbCB2b2lkIG1hdGVyaWFsaXplKCkgPSAwOworCisgICAgLy8vIFJldHVybiB0aGUgbWF0ZXJpYWxpemVkIGluc2VydGlvbiBiYXNpYyBibG9jay4KKyAgICAvLy8gQ29kZSB3aWxsIGJlIGluc2VydGVkIGludG8gdGhhdCBiYXNpYyBibG9jay4KKyAgICAvLy8KKyAgICAvLy8gXHByZSA6Om1hdGVyaWFsaXplIGhhcyBiZWVuIGNhbGxlZC4KKyAgICB2aXJ0dWFsIE1hY2hpbmVCYXNpY0Jsb2NrICZnZXRJbnNlcnRNQkJJbXBsKCkgPSAwOworCisgICAgLy8vIFJldHVybiB0aGUgbWF0ZXJpYWxpemVkIGluc2VydGlvbiBwb2ludC4KKyAgICAvLy8gQ29kZSB3aWxsIGJlIGluc2VydGVkIGJlZm9yZSB0aGF0IHBvaW50LgorICAgIC8vLworICAgIC8vLyBccHJlIDo6bWF0ZXJpYWxpemUgaGFzIGJlZW4gY2FsbGVkLgorICAgIHZpcnR1YWwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIGdldFBvaW50SW1wbCgpID0gMDsKKworICBwdWJsaWM6CisgICAgdmlydHVhbCB+SW5zZXJ0UG9pbnQoKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gVGhlIGZpcnN0IGNhbGwgdG8gdGhpcyBtZXRob2Qgd2lsbCBjYXVzZSB0aGUgc3BsaXR0aW5nIHRvCisgICAgLy8vIGhhcHBlbiBpZiBuZWVkIGJlLCB0aGVuIHN1YiBzZXF1ZW50IGNhbGxzIGp1c3QgcmV0dXJuCisgICAgLy8vIHRoZSBpdGVyYXRvciB0byB0aGF0IHBvaW50LiBJLmUuLCBubyBtb3JlIHNwbGl0dGluZyB3aWxsCisgICAgLy8vIG9jY3VyLgorICAgIC8vLworICAgIC8vLyBccmV0dXJuIFRoZSBpdGVyYXRvciB0aGF0IHNob3VsZCBiZSB1c2VkIHdpdGgKKyAgICAvLy8gTWFjaGluZUJhc2ljQmxvY2s6Omluc2VydC4gSS5lLiwgYWRkaXRpb25hbCBjb2RlIGhhcHBlbnMKKyAgICAvLy8gYmVmb3JlIHRoYXQgcG9pbnQuCisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIGdldFBvaW50KCkgeworICAgICAgaWYgKCFXYXNNYXRlcmlhbGl6ZWQpIHsKKyAgICAgICAgV2FzTWF0ZXJpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgYXNzZXJ0KGNhbk1hdGVyaWFsaXplKCkgJiYgIkltcG9zc2libGUgdG8gbWF0ZXJpYWxpemUgdGhpcyBwb2ludCIpOworICAgICAgICBtYXRlcmlhbGl6ZSgpOworICAgICAgfQorICAgICAgLy8gV2hlbiB3ZSBtYXRlcmlhbGl6ZWQgdGhlIHBvaW50IHdlIHNob3VsZCBoYXZlIGRvbmUgdGhlIHNwbGl0dGluZy4KKyAgICAgIGFzc2VydCghaXNTcGxpdCgpICYmICJXcm9uZyBwcmUtY29uZGl0aW9uIik7CisgICAgICByZXR1cm4gZ2V0UG9pbnRJbXBsKCk7CisgICAgfQorCisgICAgLy8vIFRoZSBmaXJzdCBjYWxsIHRvIHRoaXMgbWV0aG9kIHdpbGwgY2F1c2UgdGhlIHNwbGl0dGluZyB0bworICAgIC8vLyBoYXBwZW4gaWYgbmVlZCBiZSwgdGhlbiBzdWIgc2VxdWVudCBjYWxscyBqdXN0IHJldHVybgorICAgIC8vLyB0aGUgYmFzaWMgYmxvY2sgdGhhdCBjb250YWlucyB0aGUgaW5zZXJ0aW9uIHBvaW50LgorICAgIC8vLyBJLmUuLCBubyBtb3JlIHNwbGl0dGluZyB3aWxsIG9jY3VyLgorICAgIC8vLworICAgIC8vLyBccmV0dXJuIFRoZSBiYXNpYyBibG9jayBzaG91bGQgYmUgdXNlZCB3aXRoCisgICAgLy8vIE1hY2hpbmVCYXNpY0Jsb2NrOjppbnNlcnQgYW5kIDo6Z2V0UG9pbnQuIFRoZSBuZXcgY29kZSBzaG91bGQKKyAgICAvLy8gaGFwcGVuIGJlZm9yZSB0aGF0IHBvaW50LgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZnZXRJbnNlcnRNQkIoKSB7CisgICAgICBpZiAoIVdhc01hdGVyaWFsaXplZCkgeworICAgICAgICBXYXNNYXRlcmlhbGl6ZWQgPSB0cnVlOworICAgICAgICBhc3NlcnQoY2FuTWF0ZXJpYWxpemUoKSAmJiAiSW1wb3NzaWJsZSB0byBtYXRlcmlhbGl6ZSB0aGlzIHBvaW50Iik7CisgICAgICAgIG1hdGVyaWFsaXplKCk7CisgICAgICB9CisgICAgICAvLyBXaGVuIHdlIG1hdGVyaWFsaXplZCB0aGUgcG9pbnQgd2Ugc2hvdWxkIGhhdmUgZG9uZSB0aGUgc3BsaXR0aW5nLgorICAgICAgYXNzZXJ0KCFpc1NwbGl0KCkgJiYgIldyb25nIHByZS1jb25kaXRpb24iKTsKKyAgICAgIHJldHVybiBnZXRJbnNlcnRNQkJJbXBsKCk7CisgICAgfQorCisgICAgLy8vIEluc2VydCBccCBNSSBpbiB0aGUganVzdCBiZWZvcmUgOjpnZXRQb2ludCgpCisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIGluc2VydChNYWNoaW5lSW5zdHIgJk1JKSB7CisgICAgICByZXR1cm4gZ2V0SW5zZXJ0TUJCKCkuaW5zZXJ0KGdldFBvaW50KCksICZNSSk7CisgICAgfQorCisgICAgLy8vIERvZXMgdGhpcyBwb2ludCBpbnZvbHZlIHNwbGl0dGluZyBhbiBlZGdlIG9yIGJsb2NrPworICAgIC8vLyBBcyBzb29uIGFzIDo6Z2V0UG9pbnQgaXMgY2FsbGVkIGFuZCB0aHVzLCB0aGUgcG9pbnQKKyAgICAvLy8gbWF0ZXJpYWxpemVkLCB0aGUgcG9pbnQgd2lsbCBub3QgcmVxdWlyZSBzcGxpdHRpbmcgYW55bW9yZSwKKyAgICAvLy8gaS5lLiwgdGhpcyB3aWxsIHJldHVybiBmYWxzZS4KKyAgICB2aXJ0dWFsIGJvb2wgaXNTcGxpdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAvLy8gRnJlcXVlbmN5IG9mIHRoZSBpbnNlcnRpb24gcG9pbnQuCisgICAgLy8vIFxwIFAgaXMgdXNlZCB0byBhY2Nlc3MgdGhlIHZhcmlvdXMgYW5hbHlzaXMgdGhhdCB3aWxsIGhlbHAgdG8KKyAgICAvLy8gZ2V0IHRoYXQgaW5mb3JtYXRpb24sIGxpa2UgTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mby4gIElmIFxwIFAKKyAgICAvLy8gZG9lcyBub3QgY29udGFpbiBlbm91Z2ggZW5vdWdoIHRvIHJldHVybiB0aGUgYWN0dWFsIGZyZXF1ZW5jeSwKKyAgICAvLy8gdGhpcyByZXR1cm5zIDEuCisgICAgdmlydHVhbCB1aW50NjRfdCBmcmVxdWVuY3koY29uc3QgUGFzcyAmUCkgY29uc3QgeyByZXR1cm4gMTsgfQorCisgICAgLy8vIENoZWNrIHdoZXRoZXIgdGhpcyBpbnNlcnRpb24gcG9pbnQgY2FuIGJlIG1hdGVyaWFsaXplZC4KKyAgICAvLy8gQXMgc29vbiBhcyA6OmdldFBvaW50IGlzIGNhbGxlZCBhbmQgdGh1cywgdGhlIHBvaW50IG1hdGVyaWFsaXplZAorICAgIC8vLyBjYWxsaW5nIHRoaXMgbWV0aG9kIGRvZXMgbm90IG1ha2Ugc2Vuc2UuCisgICAgdmlydHVhbCBib29sIGNhbk1hdGVyaWFsaXplKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgfTsKKworICAvLy8gSW5zZXJ0aW9uIHBvaW50IGJlZm9yZSBvciBhZnRlciBhbiBpbnN0cnVjdGlvbi4KKyAgY2xhc3MgSW5zdHJJbnNlcnRQb2ludCA6IHB1YmxpYyBJbnNlcnRQb2ludCB7CisgIHByaXZhdGU6CisgICAgLy8vIEluc2VydGlvbiBwb2ludC4KKyAgICBNYWNoaW5lSW5zdHIgJkluc3RyOworCisgICAgLy8vIERvZXMgdGhlIGluc2VydGlvbiBwb2ludCBpcyBiZWZvcmUgb3IgYWZ0ZXIgSW5zdHIuCisgICAgYm9vbCBCZWZvcmU7CisKKyAgICB2b2lkIG1hdGVyaWFsaXplKCkgb3ZlcnJpZGU7CisKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgZ2V0UG9pbnRJbXBsKCkgb3ZlcnJpZGUgeworICAgICAgaWYgKEJlZm9yZSkKKyAgICAgICAgcmV0dXJuIEluc3RyOworICAgICAgcmV0dXJuIEluc3RyLmdldE5leHROb2RlKCkgPyAqSW5zdHIuZ2V0TmV4dE5vZGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJbnN0ci5nZXRQYXJlbnQoKS0+ZW5kKCk7CisgICAgfQorCisgICAgTWFjaGluZUJhc2ljQmxvY2sgJmdldEluc2VydE1CQkltcGwoKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gKkluc3RyLmdldFBhcmVudCgpOworICAgIH0KKworICBwdWJsaWM6CisgICAgLy8vIENyZWF0ZSBhbiBpbnNlcnRpb24gcG9pbnQgYmVmb3JlIChccCBCZWZvcmU9dHJ1ZSkgb3IgYWZ0ZXIgXHAgSW5zdHIuCisgICAgSW5zdHJJbnNlcnRQb2ludChNYWNoaW5lSW5zdHIgJkluc3RyLCBib29sIEJlZm9yZSA9IHRydWUpOworCisgICAgYm9vbCBpc1NwbGl0KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdWludDY0X3QgZnJlcXVlbmN5KGNvbnN0IFBhc3MgJlApIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gV29yc3QgY2FzZSwgd2UgbmVlZCB0byBzbGljZSB0aGUgYmFzaWMgYmxvY2ssIGJ1dCB0aGF0IGlzIHN0aWxsIGRvYWJsZS4KKyAgICBib29sIGNhbk1hdGVyaWFsaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICB9OworCisgIC8vLyBJbnNlcnRpb24gcG9pbnQgYXQgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgYSBiYXNpYyBibG9jay4KKyAgY2xhc3MgTUJCSW5zZXJ0UG9pbnQgOiBwdWJsaWMgSW5zZXJ0UG9pbnQgeworICBwcml2YXRlOgorICAgIC8vLyBJbnNlcnRpb24gcG9pbnQuCisgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQjsKKworICAgIC8vLyBEb2VzIHRoZSBpbnNlcnRpb24gcG9pbnQgaXMgYXQgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgTUJCLgorICAgIGJvb2wgQmVnaW5uaW5nOworCisgICAgdm9pZCBtYXRlcmlhbGl6ZSgpIG92ZXJyaWRlIHsgLypOb3RoaW5nIHRvIGRvIHRvIG1hdGVyaWFsaXplKi8KKyAgICB9CisKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgZ2V0UG9pbnRJbXBsKCkgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIEJlZ2lubmluZyA/IE1CQi5iZWdpbigpIDogTUJCLmVuZCgpOworICAgIH0KKworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZnZXRJbnNlcnRNQkJJbXBsKCkgb3ZlcnJpZGUgeyByZXR1cm4gTUJCOyB9CisKKyAgcHVibGljOgorICAgIE1CQkluc2VydFBvaW50KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIGJvb2wgQmVnaW5uaW5nID0gdHJ1ZSkKKyAgICAgICAgOiBJbnNlcnRQb2ludCgpLCBNQkIoTUJCKSwgQmVnaW5uaW5nKEJlZ2lubmluZykgeworICAgICAgLy8gSWYgd2UgdHJ5IHRvIGluc2VydCBiZWZvcmUgcGhpcywgd2Ugc2hvdWxkIHVzZSB0aGUgaW5zZXJ0aW9uCisgICAgICAvLyBwb2ludHMgb24gdGhlIGluY29taW5nIGVkZ2VzLgorICAgICAgYXNzZXJ0KCghQmVnaW5uaW5nIHx8IE1CQi5nZXRGaXJzdE5vblBISSgpID09IE1CQi5iZWdpbigpKSAmJgorICAgICAgICAgICAgICJJbnZhbGlkIGJlZ2lubmluZyBwb2ludCIpOworICAgICAgLy8gSWYgd2UgdHJ5IHRvIGluc2VydCBhZnRlciB0aGUgdGVybWluYXRvcnMsIHdlIHNob3VsZCB1c2UgdGhlCisgICAgICAvLyBwb2ludHMgb24gdGhlIG91dGNvbWluZyBlZGdlcy4KKyAgICAgIGFzc2VydCgoQmVnaW5uaW5nIHx8IE1CQi5nZXRGaXJzdFRlcm1pbmF0b3IoKSA9PSBNQkIuZW5kKCkpICYmCisgICAgICAgICAgICAgIkludmFsaWQgZW5kIHBvaW50Iik7CisgICAgfQorCisgICAgYm9vbCBpc1NwbGl0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB1aW50NjRfdCBmcmVxdWVuY3koY29uc3QgUGFzcyAmUCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBjYW5NYXRlcmlhbGl6ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH07CisgIH07CisKKyAgLy8vIEluc2VydGlvbiBwb2ludCBvbiBhbiBlZGdlLgorICBjbGFzcyBFZGdlSW5zZXJ0UG9pbnQgOiBwdWJsaWMgSW5zZXJ0UG9pbnQgeworICBwcml2YXRlOgorICAgIC8vLyBTb3VyY2Ugb2YgdGhlIGVkZ2UuCisgICAgTWFjaGluZUJhc2ljQmxvY2sgJlNyYzsKKworICAgIC8vLyBEZXN0aW5hdGlvbiBvZiB0aGUgZWRnZS4KKyAgICAvLy8gQWZ0ZXIgdGhlIG1hdGVyaWFsaXphdGlvbiBpcyBkb25lLCB0aGlzIGhvbGQgdGhlIGJhc2ljIGJsb2NrCisgICAgLy8vIHRoYXQgcmVzdWx0ZWQgZnJvbSB0aGUgc3BsaXR0aW5nLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpEc3RPclNwbGl0OworCisgICAgLy8vIFAgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGFuYWx5c2lzIHBhc3NlcyBhcyBhcHBsaWNhYmxlLgorICAgIFBhc3MgJlA7CisKKyAgICB2b2lkIG1hdGVyaWFsaXplKCkgb3ZlcnJpZGU7CisKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgZ2V0UG9pbnRJbXBsKCkgb3ZlcnJpZGUgeworICAgICAgLy8gRHN0T3JTcGxpdCBzaG91bGQgYmUgdGhlIFNwbGl0IGJsb2NrIGF0IHRoaXMgcG9pbnQuCisgICAgICAvLyBJLmUuLCBpdCBzaG91bGQgaGF2ZSBvbmUgcHJlZGVjZXNzb3IsIFNyYywgYW5kIG9uZSBzdWNjZXNzb3IsCisgICAgICAvLyB0aGUgb3JpZ2luYWwgRHN0LgorICAgICAgYXNzZXJ0KERzdE9yU3BsaXQgJiYgRHN0T3JTcGxpdC0+aXNQcmVkZWNlc3NvcigmU3JjKSAmJgorICAgICAgICAgICAgIERzdE9yU3BsaXQtPnByZWRfc2l6ZSgpID09IDEgJiYgRHN0T3JTcGxpdC0+c3VjY19zaXplKCkgPT0gMSAmJgorICAgICAgICAgICAgICJEaWQgbm90IHNwbGl0PyEiKTsKKyAgICAgIHJldHVybiBEc3RPclNwbGl0LT5iZWdpbigpOworICAgIH0KKworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZnZXRJbnNlcnRNQkJJbXBsKCkgb3ZlcnJpZGUgeyByZXR1cm4gKkRzdE9yU3BsaXQ7IH0KKworICBwdWJsaWM6CisgICAgRWRnZUluc2VydFBvaW50KE1hY2hpbmVCYXNpY0Jsb2NrICZTcmMsIE1hY2hpbmVCYXNpY0Jsb2NrICZEc3QsIFBhc3MgJlApCisgICAgICAgIDogSW5zZXJ0UG9pbnQoKSwgU3JjKFNyYyksIERzdE9yU3BsaXQoJkRzdCksIFAoUCkge30KKworICAgIGJvb2wgaXNTcGxpdCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBTcmMuc3VjY19zaXplKCkgPiAxICYmIERzdE9yU3BsaXQtPnByZWRfc2l6ZSgpID4gMTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBmcmVxdWVuY3koY29uc3QgUGFzcyAmUCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBjYW5NYXRlcmlhbGl6ZSgpIGNvbnN0IG92ZXJyaWRlOworICB9OworCisgIC8vLyBTdHJ1Y3QgdXNlZCB0byByZXByZXNlbnQgdGhlIHBsYWNlbWVudCBvZiBhIHJlcGFpcmluZyBwb2ludCBmb3IKKyAgLy8vIGEgZ2l2ZW4gb3BlcmFuZC4KKyAgY2xhc3MgUmVwYWlyaW5nUGxhY2VtZW50IHsKKyAgcHVibGljOgorICAgIC8vLyBEZWZpbmUgdGhlIGtpbmQgb2YgYWN0aW9uIHRoaXMgcmVwYWlyaW5nIG5lZWRzLgorICAgIGVudW0gUmVwYWlyaW5nS2luZCB7CisgICAgICAvLy8gTm90aGluZyB0byByZXBhaXIsIGp1c3QgZHJvcCB0aGlzIGFjdGlvbi4KKyAgICAgIE5vbmUsCisgICAgICAvLy8gUmVwYXJpbmcgY29kZSBuZWVkcyB0byBoYXBwZW4gYmVmb3JlIEluc2VydFBvaW50cy4KKyAgICAgIEluc2VydCwKKyAgICAgIC8vLyAoUmUpYXNzaWduIHRoZSByZWdpc3RlciBiYW5rIG9mIHRoZSBvcGVyYW5kLgorICAgICAgUmVhc3NpZ24sCisgICAgICAvLy8gTWFyayB0aGlzIHJlcGFpcmluZyBwbGFjZW1lbnQgYXMgaW1wb3NzaWJsZS4KKyAgICAgIEltcG9zc2libGUKKyAgICB9OworCisgICAgLy8vIFxuYW1lIENvbnZlbmllbnQgdHlwZXMgZm9yIGEgbGlzdCBvZiBpbnNlcnRpb24gcG9pbnRzLgorICAgIC8vLyBAeworICAgIHVzaW5nIEluc2VydGlvblBvaW50cyA9IFNtYWxsVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxJbnNlcnRQb2ludD4sIDI+OworICAgIHVzaW5nIGluc2VydHB0X2l0ZXJhdG9yID0gSW5zZXJ0aW9uUG9pbnRzOjppdGVyYXRvcjsKKyAgICB1c2luZyBjb25zdF9pbnNlcnRwdF9pdGVyYXRvciA9IEluc2VydGlvblBvaW50czo6Y29uc3RfaXRlcmF0b3I7CisgICAgLy8vIEB9CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gS2luZCBvZiByZXBhaXJpbmcuCisgICAgUmVwYWlyaW5nS2luZCBLaW5kOworICAgIC8vLyBJbmRleCBvZiB0aGUgb3BlcmFuZCB0aGF0IHdpbGwgYmUgcmVwYWlyZWQuCisgICAgdW5zaWduZWQgT3BJZHg7CisgICAgLy8vIEFyZSBhbGwgdGhlIGluc2VydCBwb2ludHMgbWF0ZXJpYWxpemVhYmxlPworICAgIGJvb2wgQ2FuTWF0ZXJpYWxpemU7CisgICAgLy8vIElzIHRoZXJlIGFueSBvZiB0aGUgaW5zZXJ0IHBvaW50cyBuZWVkaW5nIHNwbGl0dGluZz8KKyAgICBib29sIEhhc1NwbGl0ID0gZmFsc2U7CisgICAgLy8vIEluc2VydGlvbiBwb2ludCBmb3IgdGhlIHJlcGFpciBjb2RlLgorICAgIC8vLyBUaGUgcmVwYWlyaW5nIGNvZGUgbmVlZHMgdG8gaGFwcGVuIGp1c3QgYmVmb3JlIHRoZXNlIHBvaW50cy4KKyAgICBJbnNlcnRpb25Qb2ludHMgSW5zZXJ0UG9pbnRzOworICAgIC8vLyBTb21lIGluc2VydGlvbiBwb2ludHMgbWF5IG5lZWQgdG8gdXBkYXRlIHRoZSBsaXZlbmVzcyBhbmQgc3VjaC4KKyAgICBQYXNzICZQOworCisgIHB1YmxpYzoKKyAgICAvLy8gQ3JlYXRlIGEgcmVwYWlyaW5nIHBsYWNlbWVudCBmb3IgdGhlIFxwIE9wSWR4LXRoIG9wZXJhbmQgb2YKKyAgICAvLy8gXHAgTUkuIFxwIFRSSSBpcyB1c2VkIHRvIG1ha2Ugc29tZSBjaGVja3Mgb24gdGhlIHJlZ2lzdGVyIGFsaWFzZXMKKyAgICAvLy8gaWYgdGhlIG1hY2hpbmUgb3BlcmFuZCBpcyBhIHBoeXNpY2FsIHJlZ2lzdGVyLiBccCBQIGlzIHVzZWQgdG8KKyAgICAvLy8gdG8gdXBkYXRlIGxpdmVuZXNzIGluZm9ybWF0aW9uIGFuZCBzdWNoIHdoZW4gbWF0ZXJpYWxpemluZyB0aGUKKyAgICAvLy8gcG9pbnRzLgorICAgIFJlcGFpcmluZ1BsYWNlbWVudChNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBPcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkksIFBhc3MgJlAsCisgICAgICAgICAgICAgICAgICAgICAgIFJlcGFpcmluZ0tpbmQgS2luZCA9IFJlcGFpcmluZ0tpbmQ6Okluc2VydCk7CisKKyAgICAvLy8gXG5hbWUgR2V0dGVycy4KKyAgICAvLy8gQHsKKyAgICBSZXBhaXJpbmdLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisgICAgdW5zaWduZWQgZ2V0T3BJZHgoKSBjb25zdCB7IHJldHVybiBPcElkeDsgfQorICAgIGJvb2wgY2FuTWF0ZXJpYWxpemUoKSBjb25zdCB7IHJldHVybiBDYW5NYXRlcmlhbGl6ZTsgfQorICAgIGJvb2wgaGFzU3BsaXQoKSB7IHJldHVybiBIYXNTcGxpdDsgfQorICAgIC8vLyBAfQorCisgICAgLy8vIFxuYW1lIE92ZXJsb2FkZWQgbWV0aG9kcyB0byBhZGQgYW4gaW5zZXJ0aW9uIHBvaW50LgorICAgIC8vLyBAeworICAgIC8vLyBBZGQgYSBNQkJJbnNlcnRpb25Qb2ludCB0byB0aGUgbGlzdCBvZiBJbnNlcnRQb2ludHMuCisgICAgdm9pZCBhZGRJbnNlcnRQb2ludChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBib29sIEJlZ2lubmluZyk7CisgICAgLy8vIEFkZCBhIEluc3RySW5zZXJ0aW9uUG9pbnQgdG8gdGhlIGxpc3Qgb2YgSW5zZXJ0UG9pbnRzLgorICAgIHZvaWQgYWRkSW5zZXJ0UG9pbnQoTWFjaGluZUluc3RyICZNSSwgYm9vbCBCZWZvcmUpOworICAgIC8vLyBBZGQgYW4gRWRnZUluc2VydGlvblBvaW50IChccCBTcmMsIFxwIERzdCkgdG8gdGhlIGxpc3Qgb2YgSW5zZXJ0UG9pbnRzLgorICAgIHZvaWQgYWRkSW5zZXJ0UG9pbnQoTWFjaGluZUJhc2ljQmxvY2sgJlNyYywgTWFjaGluZUJhc2ljQmxvY2sgJkRzdCk7CisgICAgLy8vIEFkZCBhbiBJbnNlcnRQb2ludCB0byB0aGUgbGlzdCBvZiBpbnNlcnQgcG9pbnRzLgorICAgIC8vLyBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgb3duZXJzaGlwIG9mICZccCBQb2ludC4KKyAgICB2b2lkIGFkZEluc2VydFBvaW50KEluc2VydFBvaW50ICZQb2ludCk7CisgICAgLy8vIEB9CisKKyAgICAvLy8gXG5hbWUgQWNjZXNzb3JzIHJlbGF0ZWQgdG8gdGhlIGluc2VydGlvbiBwb2ludHMuCisgICAgLy8vIEB7CisgICAgaW5zZXJ0cHRfaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBJbnNlcnRQb2ludHMuYmVnaW4oKTsgfQorICAgIGluc2VydHB0X2l0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIEluc2VydFBvaW50cy5lbmQoKTsgfQorCisgICAgY29uc3RfaW5zZXJ0cHRfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBJbnNlcnRQb2ludHMuYmVnaW4oKTsgfQorICAgIGNvbnN0X2luc2VydHB0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEluc2VydFBvaW50cy5lbmQoKTsgfQorCisgICAgdW5zaWduZWQgZ2V0TnVtSW5zZXJ0UG9pbnRzKCkgY29uc3QgeyByZXR1cm4gSW5zZXJ0UG9pbnRzLnNpemUoKTsgfQorICAgIC8vLyBAfQorCisgICAgLy8vIENoYW5nZSB0aGUgdHlwZSBvZiB0aGlzIHJlcGFpcmluZyBwbGFjZW1lbnQgdG8gXHAgTmV3S2luZC4KKyAgICAvLy8gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHN3aXRjaCBhIHJlcGFpcmluZyBwbGFjZW1lbnQgdG8gdGhlCisgICAgLy8vIFJlcGFpcmluZ0tpbmQ6Okluc2VydC4gVGhlcmUgaXMgbm8gZnVuZGFtZW50YWwgcHJvYmxlbSB3aXRoCisgICAgLy8vIHRoYXQsIGJ1dCBubyB1c2VzIGFzIHdlbGwsIHNvIGRvIG5vdCBzdXBwb3J0IGl0IGZvciBub3cuCisgICAgLy8vCisgICAgLy8vIFxwcmUgTmV3S2luZCAhPSBSZXBhaXJpbmdLaW5kOjpJbnNlcnQKKyAgICAvLy8gXHBvc3QgZ2V0S2luZCgpID09IE5ld0tpbmQKKyAgICB2b2lkIHN3aXRjaFRvKFJlcGFpcmluZ0tpbmQgTmV3S2luZCkgeworICAgICAgYXNzZXJ0KE5ld0tpbmQgIT0gS2luZCAmJiAiQWxyZWFkeSBvZiB0aGUgcmlnaHQgS2luZCIpOworICAgICAgS2luZCA9IE5ld0tpbmQ7CisgICAgICBJbnNlcnRQb2ludHMuY2xlYXIoKTsKKyAgICAgIENhbk1hdGVyaWFsaXplID0gTmV3S2luZCAhPSBSZXBhaXJpbmdLaW5kOjpJbXBvc3NpYmxlOworICAgICAgSGFzU3BsaXQgPSBmYWxzZTsKKyAgICAgIGFzc2VydChOZXdLaW5kICE9IFJlcGFpcmluZ0tpbmQ6Okluc2VydCAmJgorICAgICAgICAgICAgICJXZSB3b3VsZCBuZWVkIG1vcmUgTUkgdG8gc3dpdGNoIHRvIEluc2VydCIpOworICAgIH0KKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIEhlbHBlciBjbGFzcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29zdCBmb3IgbWFwcGluZyBhbiBpbnN0cnVjdGlvbi4KKyAgLy8vIFdoZW4gbWFwcGluZyBhbiBpbnN0cnVjdGlvbiwgd2UgbWF5IGludHJvZHVjZSBzb21lIHJlcGFpcmluZyBjb2RlLgorICAvLy8gSW4gbW9zdCBjYXNlcywgdGhlIHJlcGFpcmluZyBjb2RlIGlzIGxvY2FsIHRvIHRoZSBpbnN0cnVjdGlvbiwKKyAgLy8vIHRodXMsIHdlIGNhbiBvbWl0IHRoZSBiYXNpYyBibG9jayBmcmVxdWVuY3kgZnJvbSB0aGUgY29zdC4KKyAgLy8vIEhvd2V2ZXIsIHNvbWUgYWx0ZXJuYXRpdmVzIG1heSBwcm9kdWNlIG5vbi1sb2NhbCBjb3N0LCBlLmcuLCB3aGVuCisgIC8vLyByZXBhaXJpbmcgYSBwaGksIGFuZCB0aHVzIHdlIHRoZW4gbmVlZCB0byBzY2FsZSB0aGUgbG9jYWwgY29zdAorICAvLy8gdG8gdGhlIG5vbi1sb2NhbCBjb3N0LiBUaGlzIGNsYXNzIGRvZXMgdGhpcyBmb3IgdXMuCisgIC8vLyBcbm90ZTogV2UgY291bGQgc2ltcGx5IGFsd2F5cyBzY2FsZSB0aGUgY29zdC4gVGhlIHByb2JsZW0gaXMgdGhhdAorICAvLy8gdGhlcmUgYXJlIGhpZ2hlciBjaGFuY2VzIHRoYXQgd2Ugc2F0dXJhdGUgdGhlIGNvc3QgZWFzaWVyIGFuZCBlbmQKKyAgLy8vIHVwIGhhdmluZyB0aGUgc2FtZSBjb3N0IGZvciBhY3R1YWxseSBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzLgorICAvLy8gQW5vdGhlciBvcHRpb24gd291bGQgYmUgdG8gdXNlIEFQSW50IGV2ZXJ5d2hlcmUuCisgIGNsYXNzIE1hcHBpbmdDb3N0IHsKKyAgcHJpdmF0ZToKKyAgICAvLy8gQ29zdCBvZiB0aGUgbG9jYWwgaW5zdHJ1Y3Rpb25zLgorICAgIC8vLyBUaGlzIGNvc3QgaXMgZnJlZSBvZiBiYXNpYyBibG9jayBmcmVxdWVuY3kuCisgICAgdWludDY0X3QgTG9jYWxDb3N0ID0gMDsKKyAgICAvLy8gQ29zdCBvZiB0aGUgbm9uLWxvY2FsIGluc3RydWN0aW9ucy4KKyAgICAvLy8gVGhpcyBjb3N0IHNob3VsZCBpbmNsdWRlIHRoZSBmcmVxdWVuY3kgb2YgdGhlIHJlbGF0ZWQgYmxvY2tzLgorICAgIHVpbnQ2NF90IE5vbkxvY2FsQ29zdCA9IDA7CisgICAgLy8vIEZyZXF1ZW5jeSBvZiB0aGUgYmxvY2sgd2hlcmUgdGhlIGxvY2FsIGluc3RydWN0aW9ucyBsaXZlLgorICAgIHVpbnQ2NF90IExvY2FsRnJlcTsKKworICAgIE1hcHBpbmdDb3N0KHVpbnQ2NF90IExvY2FsQ29zdCwgdWludDY0X3QgTm9uTG9jYWxDb3N0LCB1aW50NjRfdCBMb2NhbEZyZXEpCisgICAgICAgIDogTG9jYWxDb3N0KExvY2FsQ29zdCksIE5vbkxvY2FsQ29zdChOb25Mb2NhbENvc3QpLAorICAgICAgICAgIExvY2FsRnJlcShMb2NhbEZyZXEpIHt9CisKKyAgICAvLy8gQ2hlY2sgaWYgdGhpcyBjb3N0IGlzIHNhdHVyYXRlZC4KKyAgICBib29sIGlzU2F0dXJhdGVkKCkgY29uc3Q7CisKKyAgcHVibGljOgorICAgIC8vLyBDcmVhdGUgYSBNYXBwaW5nQ29zdCBhc3N1bWluZyB0aGF0IG1vc3Qgb2YgdGhlIGluc3RydWN0aW9ucworICAgIC8vLyB3aWxsIG9jY3VyIGluIGEgYmFzaWMgYmxvY2sgd2l0aCBccCBMb2NhbEZyZXEgZnJlcXVlbmN5LgorICAgIE1hcHBpbmdDb3N0KGNvbnN0IEJsb2NrRnJlcXVlbmN5ICZMb2NhbEZyZXEpOworCisgICAgLy8vIEFkZCBccCBDb3N0IHRvIHRoZSBsb2NhbCBjb3N0LgorICAgIC8vLyBccmV0dXJuIHRydWUgaWYgdGhpcyBjb3N0IGlzIHNhdHVyYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgYWRkTG9jYWxDb3N0KHVpbnQ2NF90IENvc3QpOworCisgICAgLy8vIEFkZCBccCBDb3N0IHRvIHRoZSBub24tbG9jYWwgY29zdC4KKyAgICAvLy8gTm9uLWxvY2FsIGNvc3Qgc2hvdWxkIHJlZmxlY3QgdGhlIGZyZXF1ZW5jeSBvZiB0aGVpciBwbGFjZW1lbnQuCisgICAgLy8vIFxyZXR1cm4gdHJ1ZSBpZiB0aGlzIGNvc3QgaXMgc2F0dXJhdGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCBhZGROb25Mb2NhbENvc3QodWludDY0X3QgQ29zdCk7CisKKyAgICAvLy8gU2F0dXJhdGUgdGhlIGNvc3QgdG8gdGhlIG1heGltYWwgcmVwcmVzZW50YWJsZSB2YWx1ZS4KKyAgICB2b2lkIHNhdHVyYXRlKCk7CisKKyAgICAvLy8gUmV0dXJuIGFuIGluc3RhbmNlIG9mIE1hcHBpbmdDb3N0IHRoYXQgcmVwcmVzZW50cyBhbgorICAgIC8vLyBpbXBvc3NpYmxlIG1hcHBpbmcuCisgICAgc3RhdGljIE1hcHBpbmdDb3N0IEltcG9zc2libGVDb3N0KCk7CisKKyAgICAvLy8gQ2hlY2sgaWYgdGhpcyBpcyBsZXNzIHRoYW4gXHAgQ29zdC4KKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBNYXBwaW5nQ29zdCAmQ29zdCkgY29uc3Q7CisgICAgLy8vIENoZWNrIGlmIHRoaXMgaXMgZXF1YWwgdG8gXHAgQ29zdC4KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFwcGluZ0Nvc3QgJkNvc3QpIGNvbnN0OworICAgIC8vLyBDaGVjayBpZiB0aGlzIGlzIG5vdCBlcXVhbCB0byBccCBDb3N0LgorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNYXBwaW5nQ29zdCAmQ29zdCkgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBDb3N0KTsgfQorICAgIC8vLyBDaGVjayBpZiB0aGlzIGlzIGdyZWF0ZXIgdGhhbiBccCBDb3N0LgorICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE1hcHBpbmdDb3N0ICZDb3N0KSBjb25zdCB7CisgICAgICByZXR1cm4gKnRoaXMgIT0gQ29zdCAmJiBDb3N0IDwgKnRoaXM7CisgICAgfQorCisgICAgLy8vIFByaW50IHRoaXMgb24gZGJncygpIHN0cmVhbS4KKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAgIC8vLyBQcmludCB0aGlzIG9uIFxwIE9TOworICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAgIC8vLyBPdmVybG9hZCB0aGUgc3RyZWFtIG9wZXJhdG9yIGZvciBlYXN5IGRlYnVnIHByaW50aW5nLgorICAgIGZyaWVuZCByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1hcHBpbmdDb3N0ICZDb3N0KSB7CisgICAgICBDb3N0LnByaW50KE9TKTsKKyAgICAgIHJldHVybiBPUzsKKyAgICB9CisgIH07CisKKyAgLy8vIEludGVyZmFjZSB0byB0aGUgdGFyZ2V0IGxvd2VyaW5nIGluZm8gcmVsYXRlZAorICAvLy8gdG8gcmVnaXN0ZXIgYmFua3MuCisgIGNvbnN0IFJlZ2lzdGVyQmFua0luZm8gKlJCSSA9IG51bGxwdHI7CisKKyAgLy8vIE1SSSBjb250YWlucyBhbGwgdGhlIHJlZ2lzdGVyIGNsYXNzL2JhbmsgaW5mb3JtYXRpb24gdGhhdCB0aGlzCisgIC8vLyBwYXNzIHVzZXMgYW5kIHVwZGF0ZXMuCisgIE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSA9IG51bGxwdHI7CisKKyAgLy8vIEluZm9ybWF0aW9uIG9uIHRoZSByZWdpc3RlciBjbGFzc2VzIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyOworCisgIC8vLyBHZXQgdGhlIGZyZXF1ZW5jeSBvZiBibG9ja3MuCisgIC8vLyBUaGlzIGlzIHJlcXVpcmVkIGZvciBub24tZmFzdCBtb2RlLgorICBNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvICpNQkZJID0gbnVsbHB0cjsKKworICAvLy8gR2V0IHRoZSBmcmVxdWVuY3kgb2YgdGhlIGVkZ2VzLgorICAvLy8gVGhpcyBpcyByZXF1aXJlZCBmb3Igbm9uLWZhc3QgbW9kZS4KKyAgTWFjaGluZUJyYW5jaFByb2JhYmlsaXR5SW5mbyAqTUJQSSA9IG51bGxwdHI7CisKKyAgLy8vIEN1cnJlbnQgb3B0aW1pemF0aW9uIHJlbWFyayBlbWl0dGVyLiBVc2VkIHRvIHJlcG9ydCBmYWlsdXJlcy4KKyAgc3RkOjp1bmlxdWVfcHRyPE1hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyPiBNT1JFOworCisgIC8vLyBIZWxwZXIgY2xhc3MgdXNlZCBmb3IgZXZlcnkgY29kZSBtb3JwaGluZy4KKyAgTWFjaGluZUlSQnVpbGRlciBNSVJCdWlsZGVyOworCisgIC8vLyBPcHRpbWl6YXRpb24gbW9kZSBvZiB0aGUgcGFzcy4KKyAgTW9kZSBPcHRNb2RlOworCisgIC8vLyBDdXJyZW50IHRhcmdldCBjb25maWd1cmF0aW9uLiBDb250cm9scyBob3cgdGhlIHBhc3MgaGFuZGxlcyBlcnJvcnMuCisgIGNvbnN0IFRhcmdldFBhc3NDb25maWcgKlRQQzsKKworICAvLy8gQXNzaWduIHRoZSByZWdpc3RlciBiYW5rIG9mIGVhY2ggb3BlcmFuZCBvZiBccCBNSS4KKyAgLy8vIFxyZXR1cm4gVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgYXNzaWduSW5zdHIoTWFjaGluZUluc3RyICZNSSk7CisKKyAgLy8vIEluaXRpYWxpemUgdGhlIGZpZWxkIG1lbWJlcnMgdXNpbmcgXHAgTUYuCisgIHZvaWQgaW5pdChNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworICAvLy8gQ2hlY2sgaWYgXHAgUmVnIGlzIGFscmVhZHkgYXNzaWduZWQgd2hhdCBpcyBkZXNjcmliZWQgYnkgXHAgVmFsTWFwcGluZy4KKyAgLy8vIFxwIE9ubHlBc3NpZ24gPT0gdHJ1ZSBtZWFucyB0aGF0IFxwIFJlZyBqdXN0IG5lZWRzIHRvIGJlIGFzc2lnbmVkIGEKKyAgLy8vIHJlZ2lzdGVyIGJhbmsuICBJLmUuLCBubyByZXBhaXJpbmcgaXMgbmVjZXNzYXJ5IHRvIGhhdmUgdGhlCisgIC8vLyBhc3NpZ25tZW50IG1hdGNoLgorICBib29sIGFzc2lnbm1lbnRNYXRjaCh1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQmFua0luZm86OlZhbHVlTWFwcGluZyAmVmFsTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmT25seUFzc2lnbikgY29uc3Q7CisKKyAgLy8vIEluc2VydCByZXBhaXJpbmcgY29kZSBmb3IgXHAgUmVnIGFzIHNwZWNpZmllZCBieSBccCBWYWxNYXBwaW5nLgorICAvLy8gVGhlIHJlcGFpcmluZyBwbGFjZW1lbnQgaXMgc3BlY2lmaWVkIGJ5IFxwIFJlcGFpclB0LgorICAvLy8gXHAgTmV3VlJlZ3MgY29udGFpbnMgYWxsIHRoZSByZWdpc3RlcnMgcmVxdWlyZWQgdG8gcmVtYXAgXHAgUmVnLgorICAvLy8gSW4gb3RoZXIgd29yZHMsIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIGluIE5ld1ZSZWdzIG11c3QgYmUgZXF1YWwKKyAgLy8vIHRvIFZhbE1hcHBpbmcuQnJlYWtEb3duLnNpemUoKS4KKyAgLy8vCisgIC8vLyBUaGUgdHJhbnNmb3JtYXRpb24gY291bGQgYmUgc2tldGNoZWQgYXM6CisgIC8vLyBcY29kZQorICAvLy8gLi4uID0gb3AgUmVnCisgIC8vLyBcZW5kY29kZQorICAvLy8gQmVjb21lcworICAvLy8gXGNvZGUKKyAgLy8vIDxOZXdSZWdzPiA9IENPUFkgb3IgZXh0cmFjdCBSZWcKKyAgLy8vIC4uLiA9IG9wIFJlZworICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBhbmQKKyAgLy8vIFxjb2RlCisgIC8vLyBSZWcgPSBvcCAuLi4KKyAgLy8vIFxlbmRjb2RlCisgIC8vLyBCZWNvbWVzCisgIC8vLyBcY29kZQorICAvLy8gUmVnID0gb3AgLi4uCisgIC8vLyBSZWcgPSBDT1BZIG9yIGJ1aWxkX3NlcXVlbmNlIDxOZXdSZWdzPgorICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBccHJlIE5ld1ZSZWdzLnNpemUoKSA9PSBWYWxNYXBwaW5nLkJyZWFrRG93bi5zaXplKCkKKyAgLy8vCisgIC8vLyBcbm90ZSBUaGUgY2FsbGVyIGlzIHN1cHBvc2VkIHRvIGRvIHRoZSByZXdyaXRpbmcgb2Ygb3AgaWYgbmVlZCBiZS4KKyAgLy8vIEkuZS4sIFJlZyA9IG9wIC4uLiA9PiA8TmV3UmVncz4gPSBOZXdPcCAuLi4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRydWUgaWYgdGhlIHJlcGFpcmluZyB3b3JrZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCByZXBhaXJSZWcoTWFjaGluZU9wZXJhbmQgJk1PLAorICAgICAgICAgICAgICAgICBjb25zdCBSZWdpc3RlckJhbmtJbmZvOjpWYWx1ZU1hcHBpbmcgJlZhbE1hcHBpbmcsCisgICAgICAgICAgICAgICAgIFJlZ0JhbmtTZWxlY3Q6OlJlcGFpcmluZ1BsYWNlbWVudCAmUmVwYWlyUHQsCisgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yX3JhbmdlPFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD46OmNvbnN0X2l0ZXJhdG9yPgorICAgICAgICAgICAgICAgICAgICAgJk5ld1ZSZWdzKTsKKworICAvLy8gUmV0dXJuIHRoZSBjb3N0IG9mIHRoZSBpbnN0cnVjdGlvbiBuZWVkZWQgdG8gbWFwIFxwIE1PIHRvIFxwIFZhbE1hcHBpbmcuCisgIC8vLyBUaGUgY29zdCBpcyBmcmVlIG9mIGJhc2ljIGJsb2NrIGZyZXF1ZW5jaWVzLgorICAvLy8gXHByZSBNTy5pc1JlZygpCisgIC8vLyBccHJlIE1PIGlzIGFzc2lnbmVkIHRvIGEgcmVnaXN0ZXIgYmFuay4KKyAgLy8vIFxwcmUgVmFsTWFwcGluZyBpcyBhIHZhbGlkIG1hcHBpbmcgZm9yIE1PLgorICB1aW50NjRfdAorICBnZXRSZXBhaXJDb3N0KGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTywKKyAgICAgICAgICAgICAgICBjb25zdCBSZWdpc3RlckJhbmtJbmZvOjpWYWx1ZU1hcHBpbmcgJlZhbE1hcHBpbmcpIGNvbnN0OworCisgIC8vLyBGaW5kIHRoZSBiZXN0IG1hcHBpbmcgZm9yIFxwIE1JIGZyb20gXHAgUG9zc2libGVNYXBwaW5ncy4KKyAgLy8vIFxyZXR1cm4gYSByZWZlcmVuY2Ugb24gdGhlIGJlc3QgbWFwcGluZyBpbiBccCBQb3NzaWJsZU1hcHBpbmdzLgorICBjb25zdCBSZWdpc3RlckJhbmtJbmZvOjpJbnN0cnVjdGlvbk1hcHBpbmcgJgorICBmaW5kQmVzdE1hcHBpbmcoTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyQmFua0luZm86Okluc3RydWN0aW9uTWFwcGluZ3MgJlBvc3NpYmxlTWFwcGluZ3MsCisgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8UmVwYWlyaW5nUGxhY2VtZW50PiAmUmVwYWlyUHRzKTsKKworICAvLy8gQ29tcHV0ZSB0aGUgY29zdCBvZiBtYXBwaW5nIFxwIE1JIHdpdGggXHAgSW5zdHJNYXBwaW5nIGFuZAorICAvLy8gY29tcHV0ZSB0aGUgcmVwYWlyaW5nIHBsYWNlbWVudCBmb3Igc3VjaCBtYXBwaW5nIGluIFxwCisgIC8vLyBSZXBhaXJQdHMuCisgIC8vLyBccCBCZXN0Q29zdCBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlbiB0aGUgY29zdCBiZWNvbWVzIHRvbyBoaWdoCisgIC8vLyBhbmQgdGh1cyBpdCBpcyBub3Qgd29ydGggY29tcHV0aW5nIHRoZSBSZXBhaXJQdHMuICBNb3Jlb3ZlciBpZgorICAvLy8gXHAgQmVzdENvc3QgPT0gbnVsbHB0ciwgdGhlIG1hcHBpbmcgY29zdCBpcyBhY3R1YWxseSBub3QKKyAgLy8vIGNvbXB1dGVkLgorICBNYXBwaW5nQ29zdAorICBjb21wdXRlTWFwcGluZyhNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICBjb25zdCBSZWdpc3RlckJhbmtJbmZvOjpJbnN0cnVjdGlvbk1hcHBpbmcgJkluc3RyTWFwcGluZywKKyAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFJlcGFpcmluZ1BsYWNlbWVudD4gJlJlcGFpclB0cywKKyAgICAgICAgICAgICAgICAgY29uc3QgTWFwcGluZ0Nvc3QgKkJlc3RDb3N0ID0gbnVsbHB0cik7CisKKyAgLy8vIFdoZW4gXHAgUmVwYWlyUHQgaW52b2x2ZXMgc3BsaXR0aW5nIHRvIHJlcGFpciBccCBNTyBmb3IgdGhlCisgIC8vLyBnaXZlbiBccCBWYWxNYXBwaW5nLCB0cnkgdG8gY2hhbmdlIHRoZSB3YXkgd2UgcmVwYWlyIHN1Y2ggdGhhdAorICAvLy8gdGhlIHNwbGl0dGluZyBpcyBub3QgcmVxdWlyZWQgYW55bW9yZS4KKyAgLy8vCisgIC8vLyBccHJlIFxwIFJlcGFpclB0Lmhhc1NwbGl0KCkKKyAgLy8vIFxwcmUgXHAgTU8gPT0gTU8uZ2V0UGFyZW50KCktPmdldE9wZXJhbmQoXHAgUmVwYWlyUHQuZ2V0T3BJZHgoKSkKKyAgLy8vIFxwcmUgXHAgVmFsTWFwcGluZyBpcyB0aGUgbWFwcGluZyBvZiBccCBNTyBmb3IgTU8uZ2V0UGFyZW50KCkKKyAgLy8vICAgICAgdGhhdCBpbXBsaWVkIFxwIFJlcGFpclB0LgorICB2b2lkIHRyeUF2b2lkaW5nU3BsaXQoUmVnQmFua1NlbGVjdDo6UmVwYWlyaW5nUGxhY2VtZW50ICZSZXBhaXJQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQmFua0luZm86OlZhbHVlTWFwcGluZyAmVmFsTWFwcGluZykgY29uc3Q7CisKKyAgLy8vIEFwcGx5IFxwIE1hcHBpbmcgdG8gXHAgTUkuIFxwIFJlcGFpclB0cyByZXByZXNlbnRzIHRoZSBkaWZmZXJlbnQKKyAgLy8vIG1hcHBpbmcgYWN0aW9uIHRoYXQgbmVlZCB0byBoYXBwZW4gZm9yIHRoZSBtYXBwaW5nIHRvIGJlCisgIC8vLyBhcHBsaWVkLgorICAvLy8gXHJldHVybiBUcnVlIGlmIHRoZSBtYXBwaW5nIHdhcyBhcHBsaWVkIHN1Y2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgYXBwbHlNYXBwaW5nKE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQmFua0luZm86Okluc3RydWN0aW9uTWFwcGluZyAmSW5zdHJNYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8UmVwYWlyaW5nUGxhY2VtZW50PiAmUmVwYWlyUHRzKTsKKworcHVibGljOgorICAvLy8gQ3JlYXRlIGEgUmVnQmFua1NlbGVjdCBwYXNzIHdpdGggdGhlIHNwZWNpZmllZCBccCBSdW5uaW5nTW9kZS4KKyAgUmVnQmFua1NlbGVjdChNb2RlIFJ1bm5pbmdNb2RlID0gRmFzdCk7CisKKyAgU3RyaW5nUmVmIGdldFBhc3NOYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIlJlZ0JhbmtTZWxlY3QiOyB9CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzIGdldFJlcXVpcmVkUHJvcGVydGllcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcygpCisgICAgICAgIC5zZXQoTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllczo6UHJvcGVydHk6OklzU1NBKQorICAgICAgICAuc2V0KE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXM6OlByb3BlcnR5OjpMZWdhbGl6ZWQpOworICB9CisKKyAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyBnZXRTZXRQcm9wZXJ0aWVzKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzKCkuc2V0KAorICAgICAgICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzOjpQcm9wZXJ0eTo6UmVnQmFua1NlbGVjdGVkKTsKKyAgfQorCisgIC8vLyBXYWxrIHRocm91Z2ggXHAgTUYgYW5kIGFzc2lnbiBhIHJlZ2lzdGVyIGJhbmsgdG8gZXZlcnkgdmlydHVhbCByZWdpc3RlcgorICAvLy8gdGhhdCBhcmUgc3RpbGwgbWFwcGVkIHRvIG5vdGhpbmcuCisgIC8vLyBUaGUgdGFyZ2V0IG5lZWRzIHRvIHByb3ZpZGUgYSBSZWdpc3RlckJhbmtJbmZvIGFuZCBpbiBwYXJ0aWN1bGFyCisgIC8vLyBvdmVycmlkZSBSZWdpc3RlckJhbmtJbmZvOjpnZXRJbnN0ck1hcHBpbmcuCisgIC8vLworICAvLy8gU2ltcGxpZmllZCBhbGdvOgorICAvLy8gXGNvZGUKKyAgLy8vICAgUkJJID0gTUYuc3VidGFyZ2V0LmdldFJlZ0JhbmtJbmZvKCkKKyAgLy8vICAgTUlSQnVpbGRlci5zZXRNRihNRikKKyAgLy8vICAgZm9yIGVhY2ggYmIgaW4gTUYKKyAgLy8vICAgICBmb3IgZWFjaCBpbnN0IGluIGJiCisgIC8vLyAgICAgICBNSVJCdWlsZGVyLnNldEluc3RyKGluc3QpCisgIC8vLyAgICAgICBNYXBwaW5nQ29zdHMgPSBSQkkuZ2V0TWFwcGluZyhpbnN0KTsKKyAgLy8vICAgICAgIElkeCA9IGZpbmRJZHhPZk1pbkNvc3QoTWFwcGluZ0Nvc3RzKQorICAvLy8gICAgICAgQ3VyUmVnQmFuayA9IE1hcHBpbmdDb3N0c1tJZHhdLlJlZ0JhbmsKKyAgLy8vICAgICAgIE1SSS5zZXRSZWdCYW5rKGluc3QuZ2V0T3BlcmFuZCgwKS5nZXRSZWcoKSwgQ3VyUmVnQmFuaykKKyAgLy8vICAgICAgIGZvciBlYWNoIGFyZ3VtZW50IGluIGluc3QKKyAgLy8vICAgICAgICAgaWYgKEN1clJlZ0JhbmsgIT0gYXJndW1lbnQuUmVnQmFuaykKKyAgLy8vICAgICAgICAgICBBcmdSZWcgPSBhcmd1bWVudC5nZXRSZWcoKQorICAvLy8gICAgICAgICAgIFRtcCA9IE1SSS5jcmVhdGVOZXdWaXJ0dWFsKE1SSS5nZXRTaXplKEFyZ1JlZyksIEN1clJlZ0JhbmspCisgIC8vLyAgICAgICAgICAgTUlSQnVpbGRlci5idWlsZEluc3RyKENPUFksIFRtcCwgQXJnUmVnKQorICAvLy8gICAgICAgICAgIGluc3QuZ2V0T3BlcmFuZChhcmd1bWVudC5nZXRPcGVyYW5kTm8oKSkuc2V0UmVnKFRtcCkKKyAgLy8vIFxlbmRjb2RlCisgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRikgb3ZlcnJpZGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfUkVHQkFOS1NFTEVDVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9SZWdpc3RlckJhbmsuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1JlZ2lzdGVyQmFuay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNzU4NDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9SZWdpc3RlckJhbmsuaApAQCAtMCwwICsxLDk5IEBACisvLz09LS0gbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvUmVnaXN0ZXJCYW5rLmggLSBSZWdpc3RlciBCYW5rIC0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZSBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIEFQSSBvZiByZWdpc3RlciBiYW5rcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX1JFR0JBTktfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9SRUdCQU5LX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KK2NsYXNzIFJlZ2lzdGVyQmFua0luZm87CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CisKKy8vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHJlZ2lzdGVyIGJhbmsgY29uY2VwdC4KKy8vLyBUd28gaW5zdGFuY2VzIG9mIFJlZ2lzdGVyQmFuayBtdXN0IGhhdmUgZGlmZmVyZW50IElELgorLy8vIFRoaXMgcHJvcGVydHkgaXMgZW5mb3JjZWQgYnkgdGhlIFJlZ2lzdGVyQmFua0luZm8gY2xhc3MuCitjbGFzcyBSZWdpc3RlckJhbmsgeworcHJpdmF0ZToKKyAgdW5zaWduZWQgSUQ7CisgIGNvbnN0IGNoYXIgKk5hbWU7CisgIHVuc2lnbmVkIFNpemU7CisgIEJpdFZlY3RvciBDb250YWluZWRSZWdDbGFzc2VzOworCisgIC8vLyBTZW50aW5lbCB2YWx1ZSB1c2VkIHRvIHJlY29nbml6ZSByZWdpc3RlciBiYW5rIG5vdCBwcm9wZXJseQorICAvLy8gaW5pdGlhbGl6ZWQgeWV0LgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgSW52YWxpZElEOworCisgIC8vLyBPbmx5IHRoZSBSZWdpc3RlckJhbmtJbmZvIGNhbiBpbml0aWFsaXplIFJlZ2lzdGVyQmFuayBwcm9wZXJseS4KKyAgZnJpZW5kIFJlZ2lzdGVyQmFua0luZm87CisKK3B1YmxpYzoKKyAgUmVnaXN0ZXJCYW5rKHVuc2lnbmVkIElELCBjb25zdCBjaGFyICpOYW1lLCB1bnNpZ25lZCBTaXplLAorICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKkNvbnRhaW5lZFJlZ0NsYXNzZXMsIHVuc2lnbmVkIE51bVJlZ0NsYXNzZXMpOworCisgIC8vLyBHZXQgdGhlIGlkZW50aWZpZXIgb2YgdGhpcyByZWdpc3RlciBiYW5rLgorICB1bnNpZ25lZCBnZXRJRCgpIGNvbnN0IHsgcmV0dXJuIElEOyB9CisKKyAgLy8vIEdldCBhIHVzZXIgZnJpZW5kbHkgbmFtZSBvZiB0aGlzIHJlZ2lzdGVyIGJhbmsuCisgIC8vLyBTaG91bGQgYmUgdXNlZCBvbmx5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgLy8vIEdldCB0aGUgbWF4aW1hbCBzaXplIGluIGJpdHMgdGhhdCBmaXRzIGluIHRoaXMgcmVnaXN0ZXIgYmFuay4KKyAgdW5zaWduZWQgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKworICAvLy8gQ2hlY2sgd2hldGhlciB0aGlzIGluc3RhbmNlIGlzIHJlYWR5IHRvIGJlIHVzZWQuCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OworCisgIC8vLyBDaGVjayBpZiB0aGlzIHJlZ2lzdGVyIGJhbmsgaXMgdmFsaWQuIEluIG90aGVyIHdvcmRzLAorICAvLy8gaWYgaXQgaGFzIGJlZW4gcHJvcGVybHkgY29uc3RydWN0ZWQuCisgIC8vLworICAvLy8gXG5vdGUgVGhpcyBtZXRob2QgZG9lcyBub3QgY2hlY2sgYW55dGhpbmcgd2hlbiBhc3NlcnRpb25zIGFyZSBkaXNhYmxlZC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRydWUgaXMgdGhlIGNoZWNrIHdhcyBzdWNjZXNzZnVsLgorICBib29sIHZlcmlmeShjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSkgY29uc3Q7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgdGhpcyByZWdpc3RlciBiYW5rIGNvdmVycyBccCBSQy4KKyAgLy8vIEluIG90aGVyIHdvcmRzLCBjaGVjayBpZiB0aGlzIHJlZ2lzdGVyIGJhbmsgZnVsbHkgY292ZXJzCisgIC8vLyB0aGUgcmVnaXN0ZXJzIHRoYXQgXHAgUkMgY29udGFpbnMuCisgIC8vLyBccHJlIGlzVmFsaWQoKQorICBib29sIGNvdmVycyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICZSQykgY29uc3Q7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgXHAgT3RoZXJSQiBpcyB0aGUgc2FtZSBhcyB0aGlzLgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVnaXN0ZXJCYW5rICZPdGhlclJCKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJlZ2lzdGVyQmFuayAmT3RoZXJSQikgY29uc3QgeworICAgIHJldHVybiAhdGhpcy0+b3BlcmF0b3I9PShPdGhlclJCKTsKKyAgfQorCisgIC8vLyBEdW1wIHRoZSByZWdpc3RlciBtYXNrIG9uIGRiZ3MoKSBzdHJlYW0uCisgIC8vLyBUaGUgZHVtcCBpcyB2ZXJib3NlLgorICB2b2lkIGR1bXAoY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gUHJpbnQgdGhlIHJlZ2lzdGVyIG1hc2sgb24gT1MuCisgIC8vLyBJZiBJc0ZvckRlYnVnIGlzIGZhbHNlLCB0aGVuIG9ubHkgdGhlIG5hbWUgb2YgdGhlIHJlZ2lzdGVyIGJhbmsKKyAgLy8vIGlzIHByaW50ZWQuIE90aGVyd2lzZSwgYWxsIHRoZSBmaWVsZHMgYXJlIHByaW50aW5nLgorICAvLy8gVFJJIGlzIHRoZW4gdXNlZCB0byBwcmludCB0aGUgbmFtZSBvZiB0aGUgcmVnaXN0ZXIgY2xhc3NlcyB0aGF0CisgIC8vLyB0aGlzIHJlZ2lzdGVyIGJhbmsgY292ZXJzLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgYm9vbCBJc0ZvckRlYnVnID0gZmFsc2UsCisgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyKSBjb25zdDsKK307CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFJlZ2lzdGVyQmFuayAmUmVnQmFuaykgeworICBSZWdCYW5rLnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorfSAvLyBFbmQgbmFtZXNwYWNlIGxsdm0uCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvUmVnaXN0ZXJCYW5rSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvUmVnaXN0ZXJCYW5rSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZmQ3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9SZWdpc3RlckJhbmtJbmZvLmgKQEAgLTAsMCArMSw3NTcgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9SZWdpc3RlckJhbmtJbmZvLmggLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgQVBJIGZvciB0aGUgcmVnaXN0ZXIgYmFuayBpbmZvLgorLy8vIFRoaXMgQVBJIGlzIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyB0aGUgcmVnaXN0ZXIgYmFua3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9SRUdJU1RFUkJBTktJTkZPX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfUkVHSVNURVJCQU5LSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0hhc2hpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFJlZ2lzdGVyQmFuazsKK2NsYXNzIFRhcmdldEluc3RySW5mbzsKK2NsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CisKKy8vLyBIb2xkcyBhbGwgdGhlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gcmVnaXN0ZXIgYmFua3MuCitjbGFzcyBSZWdpc3RlckJhbmtJbmZvIHsKK3B1YmxpYzoKKyAgLy8vIEhlbHBlciBzdHJ1Y3QgdGhhdCByZXByZXNlbnRzIGhvdyBhIHZhbHVlIGlzIHBhcnRpYWxseSBtYXBwZWQKKyAgLy8vIGludG8gYSByZWdpc3Rlci4KKyAgLy8vIFRoZSBTdGFydElkeCBhbmQgTGVuZ3RoIHJlcHJlc2VudCB3aGF0IHJlZ2lvbiBvZiB0aGUgb3JnaW5hbAorICAvLy8gdmFsdWUgdGhpcyBwYXJ0aWFsIG1hcHBpbmcgY292ZXJzLgorICAvLy8gVGhpcyBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBNYXNrIG9mIGNvbnRpZ3VvdXMgYml0IHN0YXJ0aW5nCisgIC8vLyBhdCBTdGFydElkeCBiaXQgYW5kIHNwYW5uaW5nIExlbmd0aCBiaXRzLgorICAvLy8gU3RhcnRJZHggaXMgdGhlIG51bWJlciBvZiBiaXRzIGZyb20gdGhlIGxlc3Mgc2lnbmlmaWNhbnQgYml0cy4KKyAgc3RydWN0IFBhcnRpYWxNYXBwaW5nIHsKKyAgICAvLy8gTnVtYmVyIG9mIGJpdHMgYXQgd2hpY2ggdGhpcyBwYXJ0aWFsIG1hcHBpbmcgc3RhcnRzIGluIHRoZQorICAgIC8vLyBvcmlnaW5hbCB2YWx1ZS4gIFRoZSBiaXRzIGFyZSBjb3VudGVkIGZyb20gbGVzcyBzaWduaWZpY2FudAorICAgIC8vLyBiaXRzIHRvIG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4KKyAgICB1bnNpZ25lZCBTdGFydElkeDsKKworICAgIC8vLyBMZW5ndGggb2YgdGhpcyBtYXBwaW5nIGluIGJpdHMuIFRoaXMgaXMgaG93IG1hbnkgYml0cyB0aGlzCisgICAgLy8vIHBhcnRpYWwgbWFwcGluZyBjb3ZlcnMgaW4gdGhlIG9yaWdpbmFsIHZhbHVlOgorICAgIC8vLyBmcm9tIFN0YXJ0SWR4IHRvIFN0YXJ0SWR4ICsgTGVuZ3RoIC0xLgorICAgIHVuc2lnbmVkIExlbmd0aDsKKworICAgIC8vLyBSZWdpc3RlciBiYW5rIHdoZXJlIHRoZSBwYXJ0aWFsIHZhbHVlIGxpdmVzLgorICAgIGNvbnN0IFJlZ2lzdGVyQmFuayAqUmVnQmFuazsKKworICAgIFBhcnRpYWxNYXBwaW5nKCkgPSBkZWZhdWx0OworCisgICAgLy8vIFByb3ZpZGUgYSBzaG9ydGN1dCBmb3IgcXVpY2tseSBidWlsZGluZyBQYXJ0aWFsTWFwcGluZy4KKyAgICBQYXJ0aWFsTWFwcGluZyh1bnNpZ25lZCBTdGFydElkeCwgdW5zaWduZWQgTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQmFuayAmUmVnQmFuaykKKyAgICAgICAgOiBTdGFydElkeChTdGFydElkeCksIExlbmd0aChMZW5ndGgpLCBSZWdCYW5rKCZSZWdCYW5rKSB7fQorCisgICAgLy8vIFxyZXR1cm4gdGhlIGluZGV4IG9mIGluIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgbW9zdAorICAgIC8vLyBzaWduaWZpY2FudCBiaXQgdGhhdCB0aGlzIHBhcnRpYWwgbWFwcGluZyBjb3ZlcnMuCisgICAgdW5zaWduZWQgZ2V0SGlnaEJpdElkeCgpIGNvbnN0IHsgcmV0dXJuIFN0YXJ0SWR4ICsgTGVuZ3RoIC0gMTsgfQorCisgICAgLy8vIFByaW50IHRoaXMgcGFydGlhbCBtYXBwaW5nIG9uIGRiZ3MoKSBzdHJlYW0uCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgICAvLy8gUHJpbnQgdGhpcyBwYXJ0aWFsIG1hcHBpbmcgb24gXHAgT1M7CisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgICAgLy8vIENoZWNrIHRoYXQgdGhlIE1hc2sgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBSZWdCYW5rLgorICAgIC8vLyBJbmRlZWQsIGlmIHRoZSBSZWdCYW5rIGNhbm5vdCBhY2NvbWFkYXRlIHRoZSAiYWN0aXZlIGJpdHMiIG9mIHRoZSBtYXNrLAorICAgIC8vLyB0aGVyZSBpcyBubyB3YXkgdGhpcyBtYXBwaW5nIGlzIHZhbGlkLgorICAgIC8vLworICAgIC8vLyBcbm90ZSBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjaGVjayBhbnl0aGluZyB3aGVuIGFzc2VydGlvbnMgYXJlIGRpc2FibGVkLgorICAgIC8vLworICAgIC8vLyBccmV0dXJuIFRydWUgaXMgdGhlIGNoZWNrIHdhcyBzdWNjZXNzZnVsLgorICAgIGJvb2wgdmVyaWZ5KCkgY29uc3Q7CisgIH07CisKKyAgLy8vIEhlbHBlciBzdHJ1Y3QgdGhhdCByZXByZXNlbnRzIGhvdyBhIHZhbHVlIGlzIG1hcHBlZCB0aHJvdWdoCisgIC8vLyBkaWZmZXJlbnQgcmVnaXN0ZXIgYmFua3MuCisgIC8vLworICAvLy8gXG5vdGU6IFNvIGZhciB3ZSBkbyBub3QgaGF2ZSBhbnkgdXNlcnMgb2YgdGhlIGNvbXBsZXggbWFwcGluZ3MKKyAgLy8vIChtYXBwaW5ncyB3aXRoIG1vcmUgdGhhbiBvbmUgcGFydGlhbCBtYXBwaW5nKSwgYnV0IHdoZW4gd2UgZG8sCisgIC8vLyB3ZSB3b3VsZCBoYXZlIG5lZWRlZCB0byBkdXBsaWNhdGUgcGFydGlhbCBtYXBwaW5ncy4KKyAgLy8vIFRoZSBhbHRlcm5hdGl2ZSBjb3VsZCBiZSB0byB1c2UgYW4gYXJyYXkgb2YgcG9pbnRlcnMgb2YgcGFydGlhbAorICAvLy8gbWFwcGluZyAoaS5lLiwgUGFydGlhbE1hcHBpbmcgKipCcmVha0Rvd24pIGFuZCBkdXBsaWNhdGUgdGhlCisgIC8vLyBwb2ludGVycyBpbnN0ZWFkLgorICAvLy8KKyAgLy8vIEUuZy4sCisgIC8vLyBMZXQgc2F5IHdlIGhhdmUgYSAzMi1iaXQgYWRkIGFuZCBhIDwyIHggMzItYml0PiB2YWRkLiBXZQorICAvLy8gY2FuIGV4cGFuZCB0aGUKKyAgLy8vIDwyIHggMzItYml0PiBhZGQgaW50byAyIHggMzItYml0IGFkZC4KKyAgLy8vCisgIC8vLyBDdXJyZW50bHkgdGhlIFRhYmxlR2VuLWxpa2UgZmlsZSB3b3VsZCBsb29rIGxpa2U6CisgIC8vLyBcY29kZQorICAvLy8gUGFydGlhbE1hcHBpbmdbXSA9IHsKKyAgLy8vIC8qMzItYml0IGFkZCovIHswLCAzMiwgR1BSfSwKKyAgLy8vIC8qMngzMi1iaXQgYWRkKi8gezAsIDMyLCBHUFJ9LCB7MCwgMzIsIEdQUn0sIC8vIDwtLSBTYW1lIGVudHJ5IDN4CisgIC8vLyAvKjwyeDMyLWJpdD4gdmFkZCB7MCwgNjQsIFZQUn0KKyAgLy8vIH07IC8vIFBhcnRpYWxNYXBwaW5nIGR1cGxpY2F0ZWQuCisgIC8vLworICAvLy8gVmFsdWVNYXBwaW5nW10geworICAvLy8gICAvKnBsYWluIDMyLWJpdCBhZGQqLyB7JlBhcnRpYWxNYXBwaW5nWzBdLCAxfSwKKyAgLy8vICAgLypleHBhbmRlZCB2YWRkIG9uIDJ4YWRkKi8geyZQYXJ0aWFsTWFwcGluZ1sxXSwgMn0sCisgIC8vLyAgIC8qcGxhaW4gPDJ4MzItYml0PiB2YWRkKi8geyZQYXJ0aWFsTWFwcGluZ1szXSwgMX0KKyAgLy8vIH07CisgIC8vLyBcZW5kY29kZQorICAvLy8KKyAgLy8vIFdpdGggdGhlIGFycmF5IG9mIHBvaW50ZXIsIHdlIHdvdWxkIGhhdmU6CisgIC8vLyBcY29kZQorICAvLy8gUGFydGlhbE1hcHBpbmdbXSA9IHsKKyAgLy8vIC8qMzItYml0IGFkZCovIHswLCAzMiwgR1BSfSwKKyAgLy8vIC8qPDJ4MzItYml0PiB2YWRkIHswLCA2NCwgVlBSfQorICAvLy8gfTsgLy8gTm8gbW9yZSBkdXBsaWNhdGlvbi4KKyAgLy8vCisgIC8vLyBCcmVha0Rvd25zW10gPSB7CisgIC8vLyAvKkFkZEJyZWFrRG93biovICZQYXJ0aWFsTWFwcGluZ1swXSwKKyAgLy8vIC8qMnhBZGRCcmVha0Rvd24qLyAmUGFydGlhbE1hcHBpbmdbMF0sICZQYXJ0aWFsTWFwcGluZ1swXSwKKyAgLy8vIC8qVkFkZEJyZWFrRG93biovICZQYXJ0aWFsTWFwcGluZ1sxXQorICAvLy8gfTsgLy8gQWRkcmVzc2VzIG9mIFBhcnRpYWxNYXBwaW5nIGR1cGxpY2F0ZWQgKHNtYWxsZXIpLgorICAvLy8KKyAgLy8vIFZhbHVlTWFwcGluZ1tdIHsKKyAgLy8vICAgLypwbGFpbiAzMi1iaXQgYWRkKi8geyZCcmVha0Rvd25zWzBdLCAxfSwKKyAgLy8vICAgLypleHBhbmRlZCB2YWRkIG9uIDJ4YWRkKi8geyZCcmVha0Rvd25zWzFdLCAyfSwKKyAgLy8vICAgLypwbGFpbiA8MngzMi1iaXQ+IHZhZGQqLyB7JkJyZWFrRG93bnNbM10sIDF9CisgIC8vLyB9OworICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBHaXZlbiB0aGF0IGEgUGFydGlhbE1hcHBpbmcgaXMgYWN0dWFsbHkgc21hbGwsIHRoZSBjb2RlIHNpemUKKyAgLy8vIGltcGFjdCBpcyBhY3R1YWxseSBhIGRlZ3JhZGF0aW9uLiBNb3Jlb3ZlciB0aGUgY29tcGlsZSB0aW1lIHdpbGwKKyAgLy8vIGJlIGhpdCBieSB0aGUgYWRkaXRpb25hbCBpbmRpcmVjdGlvbi4KKyAgLy8vIElmIFBhcnRpYWxNYXBwaW5nIGdldHMgYmlnZ2VyIHdlIG1heSByZWNvbnNpZGVyLgorICBzdHJ1Y3QgVmFsdWVNYXBwaW5nIHsKKyAgICAvLy8gSG93IHRoZSB2YWx1ZSBpcyBicm9rZW4gZG93biBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgcmVnaXN0ZXIgYmFua3MuCisgICAgY29uc3QgUGFydGlhbE1hcHBpbmcgKkJyZWFrRG93bjsKKworICAgIC8vLyBOdW1iZXIgb2YgcGFydGlhbCBtYXBwaW5nIHRvIGJyZWFrIGRvd24gdGhpcyB2YWx1ZS4KKyAgICB1bnNpZ25lZCBOdW1CcmVha0Rvd25zOworCisgICAgLy8vIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gaW52YWxpZCAoaXNWYWxpZCgpID09IGZhbHNlKQorICAgIC8vLyBpbnN0YW5jZS4KKyAgICBWYWx1ZU1hcHBpbmcoKSA6IFZhbHVlTWFwcGluZyhudWxscHRyLCAwKSB7fQorCisgICAgLy8vIEluaXRpYWxpemUgYSBWYWx1ZU1hcHBpbmcgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVyLgorICAgIC8vLyBccCBCcmVha0Rvd24gbmVlZHMgdG8gaGF2ZSBhIGxpZmUgdGltZSBhdCBsZWFzdCBhcyBsb25nCisgICAgLy8vIGFzIHRoaXMgaW5zdGFuY2UuCisgICAgVmFsdWVNYXBwaW5nKGNvbnN0IFBhcnRpYWxNYXBwaW5nICpCcmVha0Rvd24sIHVuc2lnbmVkIE51bUJyZWFrRG93bnMpCisgICAgICAgIDogQnJlYWtEb3duKEJyZWFrRG93biksIE51bUJyZWFrRG93bnMoTnVtQnJlYWtEb3ducykge30KKworICAgIC8vLyBJdGVyYXRvcnMgdGhyb3VnaCB0aGUgUGFydGlhbE1hcHBpbmdzLgorICAgIGNvbnN0IFBhcnRpYWxNYXBwaW5nICpiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEJyZWFrRG93bjsgfQorICAgIGNvbnN0IFBhcnRpYWxNYXBwaW5nICplbmQoKSBjb25zdCB7IHJldHVybiBCcmVha0Rvd24gKyBOdW1CcmVha0Rvd25zOyB9CisKKyAgICAvLy8gQ2hlY2sgaWYgdGhpcyBWYWx1ZU1hcHBpbmcgaXMgdmFsaWQuCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gQnJlYWtEb3duICYmIE51bUJyZWFrRG93bnM7IH0KKworICAgIC8vLyBWZXJpZnkgdGhhdCB0aGlzIG1hcHBpbmcgbWFrZXMgc2Vuc2UgZm9yIGEgdmFsdWUgb2YKKyAgICAvLy8gXHAgTWVhbmluZ2Z1bEJpdFdpZHRoLgorICAgIC8vLyBcbm90ZSBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjaGVjayBhbnl0aGluZyB3aGVuIGFzc2VydGlvbnMgYXJlIGRpc2FibGVkLgorICAgIC8vLworICAgIC8vLyBccmV0dXJuIFRydWUgaXMgdGhlIGNoZWNrIHdhcyBzdWNjZXNzZnVsLgorICAgIGJvb2wgdmVyaWZ5KHVuc2lnbmVkIE1lYW5pbmdmdWxCaXRXaWR0aCkgY29uc3Q7CisKKyAgICAvLy8gUHJpbnQgdGhpcyBvbiBkYmdzKCkgc3RyZWFtLgorICAgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgICAgLy8vIFByaW50IHRoaXMgb24gXHAgT1M7CisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB9OworCisgIC8vLyBIZWxwZXIgY2xhc3MgdGhhdCByZXByZXNlbnRzIGhvdyB0aGUgdmFsdWUgb2YgYW4gaW5zdHJ1Y3Rpb24gbWF5IGJlCisgIC8vLyBtYXBwZWQgYW5kIHdoYXQgaXMgdGhlIHJlbGF0ZWQgY29zdCBvZiBzdWNoIG1hcHBpbmcuCisgIGNsYXNzIEluc3RydWN0aW9uTWFwcGluZyB7CisgICAgLy8vIElkZW50aWZpZXIgb2YgdGhlIG1hcHBpbmcuCisgICAgLy8vIFRoaXMgaXMgdXNlZCB0byBjb21tdW5pY2F0ZSBiZXR3ZWVuIHRoZSB0YXJnZXQgYW5kIHRoZSBvcHRpbWl6ZXJzCisgICAgLy8vIHdoaWNoIG1hcHBpbmcgc2hvdWxkIGJlIHJlYWxpemVkLgorICAgIHVuc2lnbmVkIElEID0gSW52YWxpZE1hcHBpbmdJRDsKKworICAgIC8vLyBDb3N0IG9mIHRoaXMgbWFwcGluZy4KKyAgICB1bnNpZ25lZCBDb3N0ID0gMDsKKworICAgIC8vLyBNYXBwaW5nIG9mIGFsbCB0aGUgb3BlcmFuZHMuCisgICAgY29uc3QgVmFsdWVNYXBwaW5nICpPcGVyYW5kc01hcHBpbmc7CisKKyAgICAvLy8gTnVtYmVyIG9mIG9wZXJhbmRzLgorICAgIHVuc2lnbmVkIE51bU9wZXJhbmRzID0gMDsKKworICAgIGNvbnN0IFZhbHVlTWFwcGluZyAmZ2V0T3BlcmFuZE1hcHBpbmcodW5zaWduZWQgaSkgeworICAgICAgYXNzZXJ0KGkgPCBnZXROdW1PcGVyYW5kcygpICYmICJPdXQgb2YgYm91bmQgb3BlcmFuZCIpOworICAgICAgcmV0dXJuIE9wZXJhbmRzTWFwcGluZ1tpXTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIC8vLyBDb25zdHJ1Y3RvciBmb3IgdGhlIG1hcHBpbmcgb2YgYW4gaW5zdHJ1Y3Rpb24uCisgICAgLy8vIFxwIE51bU9wZXJhbmRzIG11c3QgYmUgZXF1YWwgdG8gbnVtYmVyIG9mIGFsbCB0aGUgb3BlcmFuZHMgb2YKKyAgICAvLy8gdGhlIHJlbGF0ZWQgaW5zdHJ1Y3Rpb24uCisgICAgLy8vIFRoZSByYXRpb25hbGUgaXMgdGhhdCBpdCBpcyBtb3JlIGVmZmljaWVudCBmb3IgdGhlIG9wdGltaXplcnMKKyAgICAvLy8gdG8gYmUgYWJsZSB0byBhc3N1bWUgdGhhdCB0aGUgbWFwcGluZyBvZiB0aGUgaXRoIG9wZXJhbmQgaXMKKyAgICAvLy8gYXQgdGhlIGluZGV4IGkuCisgICAgLy8vCisgICAgLy8vIFxwcmUgSUQgIT0gSW52YWxpZE1hcHBpbmdJRAorICAgIEluc3RydWN0aW9uTWFwcGluZyh1bnNpZ25lZCBJRCwgdW5zaWduZWQgQ29zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVNYXBwaW5nICpPcGVyYW5kc01hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bU9wZXJhbmRzKQorICAgICAgICA6IElEKElEKSwgQ29zdChDb3N0KSwgT3BlcmFuZHNNYXBwaW5nKE9wZXJhbmRzTWFwcGluZyksCisgICAgICAgICAgTnVtT3BlcmFuZHMoTnVtT3BlcmFuZHMpIHsKKyAgICAgIGFzc2VydChnZXRJRCgpICE9IEludmFsaWRNYXBwaW5nSUQgJiYKKyAgICAgICAgICAgICAiVXNlIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBpbnZhbGlkIG1hcHBpbmciKTsKKyAgICB9CisKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAvLy8gVXNlIHRoaXMgY29uc3RydWN0b3IgdG8gZXhwcmVzcyB0aGF0IHRoZSBtYXBwaW5nIGlzIGludmFsaWQuCisgICAgSW5zdHJ1Y3Rpb25NYXBwaW5nKCkgPSBkZWZhdWx0OworCisgICAgLy8vIEdldCB0aGUgY29zdC4KKyAgICB1bnNpZ25lZCBnZXRDb3N0KCkgY29uc3QgeyByZXR1cm4gQ29zdDsgfQorCisgICAgLy8vIEdldCB0aGUgSUQuCisgICAgdW5zaWduZWQgZ2V0SUQoKSBjb25zdCB7IHJldHVybiBJRDsgfQorCisgICAgLy8vIEdldCB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzLgorICAgIHVuc2lnbmVkIGdldE51bU9wZXJhbmRzKCkgY29uc3QgeyByZXR1cm4gTnVtT3BlcmFuZHM7IH0KKworICAgIC8vLyBHZXQgdGhlIHZhbHVlIG1hcHBpbmcgb2YgdGhlIGl0aCBvcGVyYW5kLgorICAgIC8vLyBccHJlIFRoZSBtYXBwaW5nIGZvciB0aGUgaXRoIG9wZXJhbmQgaGFzIGJlZW4gc2V0LgorICAgIC8vLyBccHJlIFRoZSBpdGggb3BlcmFuZCBpcyBhIHJlZ2lzdGVyLgorICAgIGNvbnN0IFZhbHVlTWFwcGluZyAmZ2V0T3BlcmFuZE1hcHBpbmcodW5zaWduZWQgaSkgY29uc3QgeworICAgICAgY29uc3QgVmFsdWVNYXBwaW5nICZWYWxNYXBwaW5nID0KKyAgICAgICAgICBjb25zdF9jYXN0PEluc3RydWN0aW9uTWFwcGluZyAqPih0aGlzKS0+Z2V0T3BlcmFuZE1hcHBpbmcoaSk7CisgICAgICByZXR1cm4gVmFsTWFwcGluZzsKKyAgICB9CisKKyAgICAvLy8gU2V0IHRoZSBtYXBwaW5nIGZvciBhbGwgdGhlIG9wZXJhbmRzLgorICAgIC8vLyBJbiBvdGhlciB3b3JkcywgT3Bkc01hcHBpbmcgc2hvdWxkIGhvbGQgYXQgbGVhc3QgZ2V0TnVtT3BlcmFuZHMKKyAgICAvLy8gVmFsdWVNYXBwaW5nLgorICAgIHZvaWQgc2V0T3BlcmFuZHNNYXBwaW5nKGNvbnN0IFZhbHVlTWFwcGluZyAqT3Bkc01hcHBpbmcpIHsKKyAgICAgIE9wZXJhbmRzTWFwcGluZyA9IE9wZHNNYXBwaW5nOworICAgIH0KKworICAgIC8vLyBDaGVjayB3aGV0aGVyIHRoaXMgb2JqZWN0IGlzIHZhbGlkLgorICAgIC8vLyBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgY2hlY2sgZm9yIG9idmlvdXMgd3JvbmcgaW5zdGFuY2UuCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldElEKCkgIT0gSW52YWxpZE1hcHBpbmdJRCAmJiBPcGVyYW5kc01hcHBpbmc7CisgICAgfQorCisgICAgLy8vIFZlcmlmaXkgdGhhdCB0aGlzIG1hcHBpbmcgbWFrZXMgc2Vuc2UgZm9yIFxwIE1JLgorICAgIC8vLyBccHJlIFxwIE1JIG11c3QgYmUgY29ubmVjdGVkIHRvIGEgTWFjaGluZUZ1bmN0aW9uLgorICAgIC8vLworICAgIC8vLyBcbm90ZSBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjaGVjayBhbnl0aGluZyB3aGVuIGFzc2VydGlvbnMgYXJlIGRpc2FibGVkLgorICAgIC8vLworICAgIC8vLyBccmV0dXJuIFRydWUgaXMgdGhlIGNoZWNrIHdhcyBzdWNjZXNzZnVsLgorICAgIGJvb2wgdmVyaWZ5KGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0OworCisgICAgLy8vIFByaW50IHRoaXMgb24gZGJncygpIHN0cmVhbS4KKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAgIC8vLyBQcmludCB0aGlzIG9uIFxwIE9TOworICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgfTsKKworICAvLy8gQ29udmVuaWVudCB0eXBlIHRvIHJlcHJlc2VudCB0aGUgYWx0ZXJuYXRpdmVzIGZvciBtYXBwaW5nIGFuCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgLy8vIFx0b2RvIFdoZW4gd2UgbW92ZSB0byBUYWJsZUdlbiB0aGlzIHNob3VsZCBiZSBhbiBhcnJheSByZWYuCisgIHVzaW5nIEluc3RydWN0aW9uTWFwcGluZ3MgPSBTbWFsbFZlY3Rvcjxjb25zdCBJbnN0cnVjdGlvbk1hcHBpbmcgKiwgND47CisKKyAgLy8vIEhlbHBlciBjbGFzcyB1c2VkIHRvIGdldC9jcmVhdGUgdGhlIHZpcnR1YWwgcmVnaXN0ZXJzIHRoYXQgd2lsbCBiZSB1c2VkCisgIC8vLyB0byByZXBsYWNlIHRoZSBNYWNoaW5lT3BlcmFuZCB3aGVuIGFwcGx5aW5nIGEgbWFwcGluZy4KKyAgY2xhc3MgT3BlcmFuZHNNYXBwZXIgeworICAgIC8vLyBUaGUgT3BJZHgtdGggY2VsbCBjb250YWlucyB0aGUgaW5kZXggaW4gTmV3VlJlZ3Mgd2hlcmUgdGhlIFZSZWdzIG9mIHRoZQorICAgIC8vLyBPcElkeC10aCBvcGVyYW5kIHN0YXJ0cy4gLTEgbWVhbnMgd2UgZG8gbm90IGhhdmUgc3VjaCBtYXBwaW5nIHlldC4KKyAgICAvLy8gTm90ZTogV2UgdXNlIGEgU21hbGxWZWN0b3IgdG8gYXZvaWQgaGVhcCBhbGxvY2F0aW9uIGZvciBtb3N0IGNhc2VzLgorICAgIFNtYWxsVmVjdG9yPGludCwgOD4gT3BUb05ld1ZSZWdJZHg7CisKKyAgICAvLy8gSG9sZCB0aGUgcmVnaXN0ZXJzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1hcCBNSSB3aXRoIEluc3RyTWFwcGluZy4KKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgOD4gTmV3VlJlZ3M7CisKKyAgICAvLy8gQ3VycmVudCBNYWNoaW5lUmVnaXN0ZXJJbmZvLCB1c2VkIHRvIGNyZWF0ZSBuZXcgdmlydHVhbCByZWdpc3RlcnMuCisgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJOworCisgICAgLy8vIEluc3RydWN0aW9uIGJlaW5nIHJlbWFwcGVkLgorICAgIE1hY2hpbmVJbnN0ciAmTUk7CisKKyAgICAvLy8gTmV3IG1hcHBpbmcgb2YgdGhlIGluc3RydWN0aW9uLgorICAgIGNvbnN0IEluc3RydWN0aW9uTWFwcGluZyAmSW5zdHJNYXBwaW5nOworCisgICAgLy8vIENvbnN0YW50IHZhbHVlIGlkZW50aWZ5aW5nIHRoYXQgdGhlIGluZGV4IGluIE9wVG9OZXdWUmVnSWR4CisgICAgLy8vIGZvciBhbiBvcGVyYW5kIGhhcyBub3QgYmVlbiBzZXQgeWV0LgorICAgIHN0YXRpYyBjb25zdCBpbnQgRG9udEtub3dJZHg7CisKKyAgICAvLy8gR2V0IHRoZSByYW5nZSBpbiBOZXdWUmVncyB0byBzdG9yZSBhbGwgdGhlIHBhcnRpYWwKKyAgICAvLy8gdmFsdWVzIGZvciB0aGUgXHAgT3BJZHgtdGggb3BlcmFuZC4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybiBUaGUgaXRlcmF0b3IgcmFuZ2UgZm9yIHRoZSBzcGFjZSBjcmVhdGVkLgorICAgIC8vCisgICAgLy8vIFxwcmUgZ2V0TUkoKS5nZXRPcGVyYW5kKE9wSWR4KS5pc1JlZygpCisgICAgaXRlcmF0b3JfcmFuZ2U8U21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPjo6aXRlcmF0b3I+CisgICAgZ2V0VlJlZ3NNZW0odW5zaWduZWQgT3BJZHgpOworCisgICAgLy8vIEdldCB0aGUgZW5kIGl0ZXJhdG9yIGZvciBhIHJhbmdlIHN0YXJ0aW5nIGF0IFxwIFN0YXJ0SWR4IGFuZAorICAgIC8vLyBzcGFubmlnIFxwIE51bVZhbCBpbiBOZXdWUmVncy4KKyAgICAvLy8gXHByZSBTdGFydElkeCArIE51bVZhbCA8PSBOZXdWUmVncy5zaXplKCkKKyAgICBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+Ojpjb25zdF9pdGVyYXRvcgorICAgIGdldE5ld1ZSZWdzRW5kKHVuc2lnbmVkIFN0YXJ0SWR4LCB1bnNpZ25lZCBOdW1WYWwpIGNvbnN0OworICAgIFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD46Oml0ZXJhdG9yIGdldE5ld1ZSZWdzRW5kKHVuc2lnbmVkIFN0YXJ0SWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVZhbCk7CisKKyAgcHVibGljOgorICAgIC8vLyBDcmVhdGUgYW4gT3BlcmFuZHNNYXBwZXIgdGhhdCB3aWxsIGhvbGQgdGhlIGluZm9ybWF0aW9uIHRvIGFwcGx5IFxwCisgICAgLy8vIEluc3RyTWFwcGluZyB0byBccCBNSS4KKyAgICAvLy8gXHByZSBJbnN0ck1hcHBpbmcudmVyaWZ5KE1JKQorICAgIE9wZXJhbmRzTWFwcGVyKE1hY2hpbmVJbnN0ciAmTUksIGNvbnN0IEluc3RydWN0aW9uTWFwcGluZyAmSW5zdHJNYXBwaW5nLAorICAgICAgICAgICAgICAgICAgIE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSk7CisKKyAgICAvLy8gXG5hbWUgR2V0dGVycy4KKyAgICAvLy8gQHsKKyAgICAvLy8gVGhlIE1hY2hpbmVJbnN0ciBiZWluZyByZW1hcHBlZC4KKyAgICBNYWNoaW5lSW5zdHIgJmdldE1JKCkgY29uc3QgeyByZXR1cm4gTUk7IH0KKworICAgIC8vLyBUaGUgZmluYWwgbWFwcGluZyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgY29uc3QgSW5zdHJ1Y3Rpb25NYXBwaW5nICZnZXRJbnN0ck1hcHBpbmcoKSBjb25zdCB7IHJldHVybiBJbnN0ck1hcHBpbmc7IH0KKworICAgIC8vLyBUaGUgTWFjaGluZVJlZ2lzdGVySW5mbyB3ZSB1c2VkIHRvIHJlYWxpemUgdGhlIG1hcHBpbmcuCisgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAmZ2V0TVJJKCkgY29uc3QgeyByZXR1cm4gTVJJOyB9CisgICAgLy8vIEB9CisKKyAgICAvLy8gQ3JlYXRlIGFzIG1hbnkgbmV3IHZpcnR1YWwgcmVnaXN0ZXJzIGFzIG5lZWRlZCBmb3IgdGhlIG1hcHBpbmcgb2YgdGhlIFxwCisgICAgLy8vIE9wSWR4LXRoIG9wZXJhbmQuCisgICAgLy8vIFRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIGlzIGRldGVybWluZWQgYnkgdGhlIG51bWJlciBvZiBicmVha2Rvd24gZm9yIHRoZQorICAgIC8vLyByZWxhdGVkIG9wZXJhbmQgaW4gdGhlIGluc3RydWN0aW9uIG1hcHBpbmcuCisgICAgLy8vIFRoZSB0eXBlIG9mIHRoZSBuZXcgcmVnaXN0ZXJzIGlzIGEgcGxhaW4gc2NhbGFyIG9mIHRoZSByaWdodCBzaXplLgorICAgIC8vLyBUaGUgcHJvcGVyIHR5cGUgaXMgZXhwZWN0ZWQgdG8gYmUgc2V0IHdoZW4gdGhlIG1hcHBpbmcgaXMgYXBwbGllZCB0bworICAgIC8vLyB0aGUgaW5zdHJ1Y3Rpb24ocykgdGhhdCByZWFsaXplcyB0aGUgbWFwcGluZy4KKyAgICAvLy8KKyAgICAvLy8gXHByZSBnZXRNSSgpLmdldE9wZXJhbmQoT3BJZHgpLmlzUmVnKCkKKyAgICAvLy8KKyAgICAvLy8gXHBvc3QgQWxsIHRoZSBwYXJ0aWFsIG1hcHBpbmcgb2YgdGhlIFxwIE9wSWR4LXRoIG9wZXJhbmQgaGF2ZSBiZWVuCisgICAgLy8vIGFzc2lnbmVkIGEgbmV3IHZpcnR1YWwgcmVnaXN0ZXIuCisgICAgdm9pZCBjcmVhdGVWUmVncyh1bnNpZ25lZCBPcElkeCk7CisKKyAgICAvLy8gU2V0IHRoZSB2aXJ0dWFsIHJlZ2lzdGVyIG9mIHRoZSBccCBQYXJ0aWFsTWFwSWR4LXRoIHBhcnRpYWwgbWFwcGluZyBvZgorICAgIC8vLyB0aGUgT3BJZHgtdGggb3BlcmFuZCB0byBccCBOZXdWUmVnLgorICAgIC8vLworICAgIC8vLyBccHJlIGdldE1JKCkuZ2V0T3BlcmFuZChPcElkeCkuaXNSZWcoKQorICAgIC8vLyBccHJlIGdldEluc3RyTWFwcGluZygpLmdldE9wZXJhbmRNYXBwaW5nKE9wSWR4KS5CcmVha0Rvd24uc2l6ZSgpID4KKyAgICAvLy8gUGFydGlhbE1hcElkeAorICAgIC8vLyBccHJlIE5ld1JlZyAhPSAwCisgICAgLy8vCisgICAgLy8vIFxwb3N0IHRoZSBccCBQYXJ0aWFsTWFwSWR4LXRoIHJlZ2lzdGVyIG9mIHRoZSB2YWx1ZSBtYXBwaW5nIG9mIHRoZSBccAorICAgIC8vLyBPcElkeC10aCBvcGVyYW5kIGhhcyBiZWVuIHNldC4KKyAgICB2b2lkIHNldFZSZWdzKHVuc2lnbmVkIE9wSWR4LCB1bnNpZ25lZCBQYXJ0aWFsTWFwSWR4LCB1bnNpZ25lZCBOZXdWUmVnKTsKKworICAgIC8vLyBHZXQgYWxsIHRoZSB2aXJ0dWFsIHJlZ2lzdGVycyByZXF1aXJlZCB0byBtYXAgdGhlIFxwIE9wSWR4LXRoIG9wZXJhbmQgb2YKKyAgICAvLy8gdGhlIGluc3RydWN0aW9uLgorICAgIC8vLworICAgIC8vLyBUaGlzIHJldHVybiBhbiBlbXB0eSByYW5nZSB3aGVuIGNyZWF0ZVZSZWdzIG9yIHNldFZSZWdzIGhhcyBub3QgYmVlbgorICAgIC8vLyBjYWxsZWQuCisgICAgLy8vIFRoZSBpdGVyYXRvciBtYXkgYmUgaW52YWxpZGF0ZWQgYnkgYSBjYWxsIHRvIHNldFZSZWdzIG9yIGNyZWF0ZVZSZWdzLgorICAgIC8vLworICAgIC8vLyBXaGVuIFxwIEZvckRlYnVnIGlzIHRydWUsIHdlIHdpbGwgbm90IGNoZWNrIHRoYXQgdGhlIGxpc3Qgb2YgbmV3IHZpcnR1YWwKKyAgICAvLy8gcmVnaXN0ZXJzIGRvZXMgbm90IGNvbnRhaW4gdW5pbml0aWFsaXplZCB2YWx1ZXMuCisgICAgLy8vCisgICAgLy8vIFxwcmUgZ2V0TUkoKS5nZXRPcGVyYW5kKE9wSWR4KS5pc1JlZygpCisgICAgLy8vIFxwcmUgRm9yRGVidWcgfHwgQWxsIHBhcnRpYWwgbWFwcGluZ3MgaGF2ZSBiZWVuIHNldCBhIHJlZ2lzdGVyCisgICAgaXRlcmF0b3JfcmFuZ2U8U21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPjo6Y29uc3RfaXRlcmF0b3I+CisgICAgZ2V0VlJlZ3ModW5zaWduZWQgT3BJZHgsIGJvb2wgRm9yRGVidWcgPSBmYWxzZSkgY29uc3Q7CisKKyAgICAvLy8gUHJpbnQgdGhpcyBvcGVyYW5kcyBtYXBwZXIgb24gZGJncygpIHN0cmVhbS4KKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAgIC8vLyBQcmludCB0aGlzIG9wZXJhbmRzIG1hcHBlciBvbiBccCBPUyBzdHJlYW0uCisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGJvb2wgRm9yRGVidWcgPSBmYWxzZSkgY29uc3Q7CisgIH07CisKK3Byb3RlY3RlZDoKKyAgLy8vIEhvbGQgdGhlIHNldCBvZiBzdXBwb3J0ZWQgcmVnaXN0ZXIgYmFua3MuCisgIFJlZ2lzdGVyQmFuayAqKlJlZ0JhbmtzOworCisgIC8vLyBUb3RhbCBudW1iZXIgb2YgcmVnaXN0ZXIgYmFua3MuCisgIHVuc2lnbmVkIE51bVJlZ0JhbmtzOworCisgIC8vLyBLZWVwIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBQYXJ0aWFsTWFwcGluZyBpbiBhIHNlcGFyYXRlIG1hcC4KKyAgLy8vIFRoaXMgc2hvdWxkbid0IGJlIG5lZWRlZCB3aGVuIGV2ZXJ5dGhpbmcgZ2V0cyBUYWJsZUdlbidlZC4KKyAgbXV0YWJsZSBEZW5zZU1hcDx1bnNpZ25lZCwgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IFBhcnRpYWxNYXBwaW5nPj4KKyAgICAgIE1hcE9mUGFydGlhbE1hcHBpbmdzOworCisgIC8vLyBLZWVwIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBWYWx1ZU1hcHBpbmcgaW4gYSBzZXBhcmF0ZSBtYXAuCisgIC8vLyBUaGlzIHNob3VsZG4ndCBiZSBuZWVkZWQgd2hlbiBldmVyeXRoaW5nIGdldHMgVGFibGVHZW4nZWQuCisgIG11dGFibGUgRGVuc2VNYXA8dW5zaWduZWQsIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBWYWx1ZU1hcHBpbmc+PgorICAgICAgTWFwT2ZWYWx1ZU1hcHBpbmdzOworCisgIC8vLyBLZWVwIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhcnJheSBvZiBWYWx1ZU1hcHBpbmcgaW4gYSBzZXBhcmF0ZSBtYXAuCisgIC8vLyBUaGlzIHNob3VsZG4ndCBiZSBuZWVkZWQgd2hlbiBldmVyeXRoaW5nIGdldHMgVGFibGVHZW4nZWQuCisgIG11dGFibGUgRGVuc2VNYXA8dW5zaWduZWQsIHN0ZDo6dW5pcXVlX3B0cjxWYWx1ZU1hcHBpbmdbXT4+CisgICAgICBNYXBPZk9wZXJhbmRzTWFwcGluZ3M7CisKKyAgLy8vIEtlZXAgZHluYW1pY2FsbHkgYWxsb2NhdGVkIEluc3RydWN0aW9uTWFwcGluZyBpbiBhIHNlcGFyYXRlIG1hcC4KKyAgLy8vIFRoaXMgc2hvdWxkbid0IGJlIG5lZWRlZCB3aGVuIGV2ZXJ5dGhpbmcgZ2V0cyBUYWJsZUdlbidlZC4KKyAgbXV0YWJsZSBEZW5zZU1hcDx1bnNpZ25lZCwgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEluc3RydWN0aW9uTWFwcGluZz4+CisgICAgICBNYXBPZkluc3RydWN0aW9uTWFwcGluZ3M7CisKKyAgLy8vIEdldHRpbmcgdGhlIG1pbmltYWwgcmVnaXN0ZXIgY2xhc3Mgb2YgYSBwaHlzcmVnIGlzIGV4cGVuc2l2ZS4KKyAgLy8vIENhY2hlIHRoaXMgaW5mb3JtYXRpb24gYXMgd2UgZ2V0IGl0LgorICBtdXRhYmxlIERlbnNlTWFwPHVuc2lnbmVkLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICo+IFBoeXNSZWdNaW5pbWFsUkNzOworCisgIC8vLyBDcmVhdGUgYSBSZWdpc3RlckJhbmtJbmZvIHRoYXQgY2FuIGFjY29tbW9kYXRlIHVwIHRvIFxwIE51bVJlZ0JhbmtzCisgIC8vLyBSZWdpc3RlckJhbmsgaW5zdGFuY2VzLgorICBSZWdpc3RlckJhbmtJbmZvKFJlZ2lzdGVyQmFuayAqKlJlZ0JhbmtzLCB1bnNpZ25lZCBOdW1SZWdCYW5rcyk7CisKKyAgLy8vIFRoaXMgY29uc3RydWN0b3IgaXMgbWVhbmluZ2xlc3MuCisgIC8vLyBJdCBqdXN0IHByb3ZpZGVzIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciB0aGF0IGNhbiBiZSB1c2VkIGF0IGxpbmsgdGltZQorICAvLy8gd2hlbiBHbG9iYWxJU2VsIGlzIG5vdCBidWlsdC4KKyAgLy8vIFRoYXQgd2F5LCB0YXJnZXRzIGNhbiBzdGlsbCBpbmhlcml0IGZyb20gdGhpcyBjbGFzcyB3aXRob3V0IGRvaW5nCisgIC8vLyBjcmF6eSBneW1uYXN0aWMgdG8gYXZvaWQgbGluayB0aW1lIGZhaWx1cmVzLgorICAvLy8gXG5vdGUgVGhhdCB3b3JrcyBiZWNhdXNlIHRoZSBjb25zdHJ1Y3RvciBpcyBpbmxpbmVkLgorICBSZWdpc3RlckJhbmtJbmZvKCkgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlRoaXMgY29uc3RydWN0b3Igc2hvdWxkIG5vdCBiZSBleGVjdXRlZCIpOworICB9CisKKyAgLy8vIEdldCB0aGUgcmVnaXN0ZXIgYmFuayBpZGVudGlmaWVkIGJ5IFxwIElELgorICBSZWdpc3RlckJhbmsgJmdldFJlZ0JhbmsodW5zaWduZWQgSUQpIHsKKyAgICBhc3NlcnQoSUQgPCBnZXROdW1SZWdCYW5rcygpICYmICJBY2Nlc3NpbmcgYW4gdW5rbm93biByZWdpc3RlciBiYW5rIik7CisgICAgcmV0dXJuICpSZWdCYW5rc1tJRF07CisgIH0KKworICAvLy8gR2V0IHRoZSBNaW5pbWFsUGh5c1JlZ0NsYXNzIGZvciBSZWcuCisgIC8vLyBccHJlIFJlZyBpcyBhIHBoeXNpY2FsIHJlZ2lzdGVyLgorICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICYKKyAgZ2V0TWluaW1hbFBoeXNSZWdDbGFzcyh1bnNpZ25lZCBSZWcsIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKSBjb25zdDsKKworICAvLy8gVHJ5IHRvIGdldCB0aGUgbWFwcGluZyBvZiBccCBNSS4KKyAgLy8vIFNlZSBnZXRJbnN0ck1hcHBpbmcgZm9yIG1vcmUgZGV0YWlscyBvbiB3aGF0IGEgbWFwcGluZyByZXByZXNlbnRzLgorICAvLy8KKyAgLy8vIFVubGlrZSBnZXRJbnN0ck1hcHBpbmcgdGhlIHJldHVybmVkIEluc3RydWN0aW9uTWFwcGluZyBtYXkgYmUgaW52YWxpZAorICAvLy8gKGlzVmFsaWQoKSA9PSBmYWxzZSkuCisgIC8vLyBUaGlzIG1lYW5zIHRoYXQgdGhlIHRhcmdldCBpbmRlcGVuZGVudCBjb2RlIGlzIG5vdCBzbWFydCBlbm91Z2gKKyAgLy8vIHRvIGdldCB0aGUgbWFwcGluZyBvZiBccCBNSSBhbmQgdGh1cywgdGhlIHRhcmdldCBoYXMgdG8gcHJvdmlkZSB0aGUKKyAgLy8vIGluZm9ybWF0aW9uIGZvciBccCBNSS4KKyAgLy8vCisgIC8vLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGFibGUgdG8gZ2V0IHRoZSBtYXBwaW5nIG9mOgorICAvLy8gLSBUYXJnZXQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJ5IGxvb2tpbmcgYXQgdGhlIGVuY29kaW5nIGNvbnN0cmFpbnRzLgorICAvLy8gLSBBbnkgaW5zdHJ1Y3Rpb24gaWYgYWxsIHRoZSByZWdpc3RlciBvcGVyYW5kcyBoYXZlIGFscmVhZHkgYmVlbiBhc3NpZ25lZAorICAvLy8gICBhIHJlZ2lzdGVyLCBhIHJlZ2lzdGVyIGNsYXNzLCBvciBhIHJlZ2lzdGVyIGJhbmsuCisgIC8vLyAtIENvcGllcyBhbmQgcGhpcyBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIG9wZXJhbmRzIGhhcyBiZWVuIGFzc2lnbmVkIGEKKyAgLy8vICAgcmVnaXN0ZXIsIGEgcmVnaXN0ZXIgY2xhc3MsIG9yIGEgcmVnaXN0ZXIgYmFuay4KKyAgLy8vIEluIG90aGVyIHdvcmRzLCB0aGlzIG1ldGhvZCB3aWxsIGxpa2VseSBmYWlsIHRvIGZpbmQgYSBtYXBwaW5nIGZvcgorICAvLy8gYW55IGdlbmVyaWMgb3Bjb2RlIHRoYXQgaGFzIG5vdCBiZWVuIGxvd2VyZWQgYnkgdGFyZ2V0IHNwZWNpZmljIGNvZGUuCisgIGNvbnN0IEluc3RydWN0aW9uTWFwcGluZyAmZ2V0SW5zdHJNYXBwaW5nSW1wbChjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSB1bmlxdWVseSBnZW5lcmF0ZWQgUGFydGlhbE1hcHBpbmcgZm9yIHRoZQorICAvLy8gZ2l2ZW4gYXJndW1lbnRzLgorICBjb25zdCBQYXJ0aWFsTWFwcGluZyAmZ2V0UGFydGlhbE1hcHBpbmcodW5zaWduZWQgU3RhcnRJZHgsIHVuc2lnbmVkIExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQmFuayAmUmVnQmFuaykgY29uc3Q7CisKKyAgLy8vIFxuYW1lIE1ldGhvZHMgdG8gZ2V0IGEgdW5pcXVlbHkgZ2VuZXJhdGVkIFZhbHVlTWFwcGluZy4KKyAgLy8vIEB7CisKKyAgLy8vIFRoZSBtb3N0IGNvbW1vbiBWYWx1ZU1hcHBpbmcgY29uc2lzdHMgb2YgYSBzaW5nbGUgUGFydGlhbE1hcHBpbmcuCisgIC8vLyBGZWF0dXJlIGEgbWV0aG9kIGZvciB0aGF0LgorICBjb25zdCBWYWx1ZU1hcHBpbmcgJmdldFZhbHVlTWFwcGluZyh1bnNpZ25lZCBTdGFydElkeCwgdW5zaWduZWQgTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWdpc3RlckJhbmsgJlJlZ0JhbmspIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIFZhbHVlTWFwcGluZyBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgY29uc3QgVmFsdWVNYXBwaW5nICZnZXRWYWx1ZU1hcHBpbmcoY29uc3QgUGFydGlhbE1hcHBpbmcgKkJyZWFrRG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQnJlYWtEb3ducykgY29uc3Q7CisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBNZXRob2RzIHRvIGdldCBhIHVuaXF1ZWx5IGdlbmVyYXRlZCBhcnJheSBvZiBWYWx1ZU1hcHBpbmcuCisgIC8vLyBAeworCisgIC8vLyBHZXQgdGhlIHVuaXF1ZWx5IGdlbmVyYXRlZCBhcnJheSBvZiBWYWx1ZU1hcHBpbmcgZm9yIHRoZQorICAvLy8gZWxlbWVudHMgb2YgYmV0d2VlbiBccCBCZWdpbiBhbmQgXHAgRW5kLgorICAvLy8KKyAgLy8vIEVsZW1lbnRzIHRoYXQgYXJlIG51bGxwdHIgd2lsbCBiZSByZXBsYWNlZCBieQorICAvLy8gaW52YWxpZCBWYWx1ZU1hcHBpbmcgKFZhbHVlTWFwcGluZzo6aXNWYWxpZCA9PSBmYWxzZSkuCisgIC8vLworICAvLy8gXHByZSBUaGUgcG9pbnRlcnMgb24gVmFsdWVNYXBwaW5nIGJldHdlZW4gXHAgQmVnaW4gYW5kIFxwIEVuZAorICAvLy8gbXVzdCB1bmlxdWVseSBpZGVudGlmeSBhIFZhbHVlTWFwcGluZy4gT3RoZXJ3aXNlLCB0aGVyZSBpcyBubworICAvLy8gZ3VhcmFudGVlIHRoYXQgdGhlIHJldHVybiBpbnN0YW5jZSB3aWxsIGJlIHVuaXF1ZSwgaS5lLiwgYW5vdGhlcgorICAvLy8gT3BlcmFuZHNNYXBwaW5nIGNvdWxkIGhhdmUgdGhlIHNhbWUgY29udGVudC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yPgorICBjb25zdCBWYWx1ZU1hcHBpbmcgKmdldE9wZXJhbmRzTWFwcGluZyhJdGVyYXRvciBCZWdpbiwgSXRlcmF0b3IgRW5kKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSB1bmlxdWVseSBnZW5lcmF0ZWQgYXJyYXkgb2YgVmFsdWVNYXBwaW5nIGZvciB0aGUKKyAgLy8vIGVsZW1lbnRzIG9mIFxwIE9wZHNNYXBwaW5nLgorICAvLy8KKyAgLy8vIEVsZW1lbnRzIG9mIFxwIE9wZHNNYXBwaW5nIHRoYXQgYXJlIG51bGxwdHIgd2lsbCBiZSByZXBsYWNlZCBieQorICAvLy8gaW52YWxpZCBWYWx1ZU1hcHBpbmcgKFZhbHVlTWFwcGluZzo6aXNWYWxpZCA9PSBmYWxzZSkuCisgIGNvbnN0IFZhbHVlTWFwcGluZyAqZ2V0T3BlcmFuZHNNYXBwaW5nKAorICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPGNvbnN0IFZhbHVlTWFwcGluZyAqPiAmT3Bkc01hcHBpbmcpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIHVuaXF1ZWx5IGdlbmVyYXRlZCBhcnJheSBvZiBWYWx1ZU1hcHBpbmcgZm9yIHRoZQorICAvLy8gZ2l2ZW4gYXJndW1lbnRzLgorICAvLy8KKyAgLy8vIEFyZ3VtZW50cyB0aGF0IGFyZSBudWxscHRyIHdpbGwgYmUgcmVwbGFjZWQgYnkgaW52YWxpZAorICAvLy8gVmFsdWVNYXBwaW5nIChWYWx1ZU1hcHBpbmc6OmlzVmFsaWQgPT0gZmFsc2UpLgorICBjb25zdCBWYWx1ZU1hcHBpbmcgKmdldE9wZXJhbmRzTWFwcGluZygKKyAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBWYWx1ZU1hcHBpbmcgKj4gT3Bkc01hcHBpbmcpIGNvbnN0OworICAvLy8gQH0KKworICAvLy8gXG5hbWUgTWV0aG9kcyB0byBnZXQgYSB1bmlxdWVseSBnZW5lcmF0ZWQgSW5zdHJ1Y3Rpb25NYXBwaW5nLgorICAvLy8gQHsKKworcHJpdmF0ZToKKyAgLy8vIE1ldGhvZCB0byBnZXQgYSB1bmlxdWVseSBnZW5lcmF0ZWQgSW5zdHJ1Y3Rpb25NYXBwaW5nLgorICBjb25zdCBJbnN0cnVjdGlvbk1hcHBpbmcgJgorICBnZXRJbnN0cnVjdGlvbk1hcHBpbmdJbXBsKGJvb2wgSXNJbnZhbGlkLCB1bnNpZ25lZCBJRCA9IEludmFsaWRNYXBwaW5nSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29zdCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVNYXBwaW5nICpPcGVyYW5kc01hcHBpbmcgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bU9wZXJhbmRzID0gMCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIE1ldGhvZCB0byBnZXQgYSB1bmlxdWVseSBnZW5lcmF0ZWQgSW5zdHJ1Y3Rpb25NYXBwaW5nLgorICBjb25zdCBJbnN0cnVjdGlvbk1hcHBpbmcgJgorICBnZXRJbnN0cnVjdGlvbk1hcHBpbmcodW5zaWduZWQgSUQsIHVuc2lnbmVkIENvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZU1hcHBpbmcgKk9wZXJhbmRzTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bU9wZXJhbmRzKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEluc3RydWN0aW9uTWFwcGluZ0ltcGwoLypJc0ludmFsaWQqLyBmYWxzZSwgSUQsIENvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFuZHNNYXBwaW5nLCBOdW1PcGVyYW5kcyk7CisgIH0KKworICAvLy8gTWV0aG9kIHRvIGdldCBhIHVuaXF1ZWx5IGdlbmVyYXRlZCBpbnZhbGlkIEluc3RydWN0aW9uTWFwcGluZy4KKyAgY29uc3QgSW5zdHJ1Y3Rpb25NYXBwaW5nICZnZXRJbnZhbGlkSW5zdHJ1Y3Rpb25NYXBwaW5nKCkgY29uc3QgeworICAgIHJldHVybiBnZXRJbnN0cnVjdGlvbk1hcHBpbmdJbXBsKC8qSXNJbnZhbGlkKi8gdHJ1ZSk7CisgIH0KKyAgLy8vIEB9CisKKyAgLy8vIEdldCB0aGUgcmVnaXN0ZXIgYmFuayBmb3IgdGhlIFxwIE9wSWR4LXRoIG9wZXJhbmQgb2YgXHAgTUkgZm9ybQorICAvLy8gdGhlIGVuY29kaW5nIGNvbnN0cmFpbnRzLCBpZiBhbnkuCisgIC8vLworICAvLy8gXHJldHVybiBBIHJlZ2lzdGVyIGJhbmsgdGhhdCBjb3ZlcnMgdGhlIHJlZ2lzdGVyIGNsYXNzIG9mIHRoZQorICAvLy8gcmVsYXRlZCBlbmNvZGluZyBjb25zdHJhaW50cyBvciBudWxscHRyIGlmIFxwIE1JIGRpZCBub3QgcHJvdmlkZQorICAvLy8gZW5vdWdoIGluZm9ybWF0aW9uIHRvIGRlZHVjZSBpdC4KKyAgY29uc3QgUmVnaXN0ZXJCYW5rICoKKyAgZ2V0UmVnQmFua0Zyb21Db25zdHJhaW50cyhjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBPcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSkgY29uc3Q7CisKKyAgLy8vIEhlbHBlciBtZXRob2QgdG8gYXBwbHkgc29tZXRoaW5nIHRoYXQgaXMgbGlrZSB0aGUgZGVmYXVsdCBtYXBwaW5nLgorICAvLy8gQmFzaWNhbGx5LCB0aGF0IG1lYW5zIHRoYXQgXHAgT3BkTWFwcGVyLmdldE1JKCkgaXMgbGVmdCB1bnRvdWNoZWQKKyAgLy8vIGFzaWRlIGZyb20gdGhlIHJlYXNzaWdubWVudCBvZiB0aGUgcmVnaXN0ZXIgb3BlcmFuZCB0aGF0IGhhdmUgYmVlbgorICAvLy8gcmVtYXBwZWQuCisgIC8vLworICAvLy8gVGhlIHR5cGUgb2YgYWxsIHRoZSBuZXcgcmVnaXN0ZXJzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgdGhlCisgIC8vLyBtYXBwZXIgYXJlIHByb3Blcmx5IHJlbWFwcGVkIHRvIHRoZSB0eXBlIG9mIHRoZSBvcmlnaW5hbCByZWdpc3RlcnMKKyAgLy8vIHRoZXkgcmVwbGFjZS4gSW4gb3RoZXIgd29yZHMsIHRoZSBzZW1hbnRpYyBvZiB0aGUgaW5zdHJ1Y3Rpb24gZG9lcworICAvLy8gbm90IGNoYW5nZSwgb25seSB0aGUgcmVnaXN0ZXIgYmFua3MuCisgIC8vLworICAvLy8gSWYgdGhlIG1hcHBpbmcgb2Ygb25lIG9mIHRoZSBvcGVyYW5kIHNwYW5zIHNldmVyYWwgcmVnaXN0ZXJzLCB0aGlzCisgIC8vLyBtZXRob2Qgd2lsbCBhYm9ydCBhcyB0aGlzIGlzIG5vdCBsaWtlIGEgZGVmYXVsdCBtYXBwaW5nIGFueW1vcmUuCisgIC8vLworICAvLy8gXHByZSBGb3IgT3BJZHggaW4gezAuLlxwIE9wZE1hcHBlci5nZXRNSSgpLmdldE51bU9wZXJhbmRzKCkpCisgIC8vLyAgICAgICAgdGhlIHJhbmdlIE9wZE1hcHBlci5nZXRWUmVncyhPcElkeCkgaXMgZW1wdHkgb3Igb2Ygc2l6ZSAxLgorICBzdGF0aWMgdm9pZCBhcHBseURlZmF1bHRNYXBwaW5nKGNvbnN0IE9wZXJhbmRzTWFwcGVyICZPcGRNYXBwZXIpOworCisgIC8vLyBTZWUgOjphcHBseU1hcHBpbmcuCisgIHZpcnR1YWwgdm9pZCBhcHBseU1hcHBpbmdJbXBsKGNvbnN0IE9wZXJhbmRzTWFwcGVyICZPcGRNYXBwZXIpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUaGUgdGFyZ2V0IGhhcyB0byBpbXBsZW1lbnQgdGhhdCBwYXJ0Iik7CisgIH0KKworcHVibGljOgorICB2aXJ0dWFsIH5SZWdpc3RlckJhbmtJbmZvKCkgPSBkZWZhdWx0OworCisgIC8vLyBHZXQgdGhlIHJlZ2lzdGVyIGJhbmsgaWRlbnRpZmllZCBieSBccCBJRC4KKyAgY29uc3QgUmVnaXN0ZXJCYW5rICZnZXRSZWdCYW5rKHVuc2lnbmVkIElEKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8UmVnaXN0ZXJCYW5rSW5mbyAqPih0aGlzKS0+Z2V0UmVnQmFuayhJRCk7CisgIH0KKworICAvLy8gR2V0IHRoZSByZWdpc3RlciBiYW5rIG9mIFxwIFJlZy4KKyAgLy8vIElmIFJlZyBoYXMgbm90IGJlZW4gYXNzaWduZWQgYSByZWdpc3RlciwgYSByZWdpc3RlciBjbGFzcywKKyAgLy8vIG9yIGEgcmVnaXN0ZXIgYmFuaywgdGhlbiB0aGlzIHJldHVybnMgbnVsbHB0ci4KKyAgLy8vCisgIC8vLyBccHJlIFJlZyAhPSAwIChOb1JlZ2lzdGVyKQorICBjb25zdCBSZWdpc3RlckJhbmsgKmdldFJlZ0JhbmsodW5zaWduZWQgUmVnLCBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIHJlZ2lzdGVyIGJhbmtzLgorICB1bnNpZ25lZCBnZXROdW1SZWdCYW5rcygpIGNvbnN0IHsgcmV0dXJuIE51bVJlZ0JhbmtzOyB9CisKKyAgLy8vIEdldCBhIHJlZ2lzdGVyIGJhbmsgdGhhdCBjb3ZlcnMgXHAgUkMuCisgIC8vLworICAvLy8gXHByZSBccCBSQyBpcyBhIHVzZXItZGVmaW5lZCByZWdpc3RlciBjbGFzcyAoYXMgb3Bwb3NlZCBhcyBvbmUKKyAgLy8vIGdlbmVyYXRlZCBieSBUYWJsZUdlbikuCisgIC8vLworICAvLy8gXG5vdGUgVGhlIG1hcHBpbmcgUkMgLT4gUmVnQmFuayBjb3VsZCBiZSBidWlsdCB3aGlsZSBhZGRpbmcgdGhlCisgIC8vLyBjb3ZlcmFnZSBmb3IgdGhlIHJlZ2lzdGVyIGJhbmtzLiBIb3dldmVyLCB3ZSBkbyBub3QgZG8gaXQsIGJlY2F1c2UsCisgIC8vLyBhdCBsZWFzdCBmb3Igbm93LCB3ZSBvbmx5IG5lZWQgdGhpcyBpbmZvcm1hdGlvbiBmb3IgcmVnaXN0ZXIgY2xhc3NlcworICAvLy8gdGhhdCBhcmUgdXNlZCBpbiB0aGUgZGVzY3JpcHRpb24gb2YgaW5zdHJ1Y3Rpb24uIEluIG90aGVyIHdvcmRzLAorICAvLy8gdGhlcmUgYXJlIGp1c3QgYSBoYW5kZnVsIG9mIHRoZW0gYW5kIHdlIGRvIG5vdCB3YW50IHRvIHdhc3RlIHNwYWNlLgorICAvLy8KKyAgLy8vIFx0b2RvIFRoaXMgc2hvdWxkIGJlIFRhYmxlR2VuJ2VkLgorICB2aXJ0dWFsIGNvbnN0IFJlZ2lzdGVyQmFuayAmCisgIGdldFJlZ0JhbmtGcm9tUmVnQ2xhc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAmUkMpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUaGUgdGFyZ2V0IG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QiKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGNvc3Qgb2YgYSBjb3B5IGZyb20gXHAgQiB0byBccCBBLCBvciBwdXQgZGlmZmVyZW50bHksCisgIC8vLyBnZXQgdGhlIGNvc3Qgb2YgQSA9IENPUFkgQi4gU2luY2UgcmVnaXN0ZXIgYmFua3MgbWF5IGNvdmVyCisgIC8vLyBkaWZmZXJlbnQgc2l6ZSwgXHAgU2l6ZSBzcGVjaWZpZXMgd2hhdCB3aWxsIGJlIHRoZSBzaXplIGluIGJpdHMKKyAgLy8vIHRoYXQgd2lsbCBiZSBjb3BpZWQgYXJvdW5kLgorICAvLy8KKyAgLy8vIFxub3RlIFNpbmNlIHRoaXMgaXMgYSBjb3B5LCBib3RoIHJlZ2lzdGVycyBoYXZlIHRoZSBzYW1lIHNpemUuCisgIHZpcnR1YWwgdW5zaWduZWQgY29weUNvc3QoY29uc3QgUmVnaXN0ZXJCYW5rICZBLCBjb25zdCBSZWdpc3RlckJhbmsgJkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSkgY29uc3QgeworICAgIC8vIE9wdGltaXN0aWNhbGx5IGFzc3VtZSB0aGF0IGNvcGllcyBhcmUgY29hbGVzY2VkLiBJLmUuLCB3aGVuCisgICAgLy8gdGhleSBhcmUgb24gdGhlIHNhbWUgYmFuaywgdGhleSBhcmUgZnJlZS4KKyAgICAvLyBPdGhlcndpc2UgYXNzdW1lIGEgbm9uLXplcm8gY29zdCBvZiAxLiBUaGUgdGFyZ2V0cyBhcmUgc3VwcG9zZWQKKyAgICAvLyB0byBvdmVycmlkZSB0aGF0IHByb3Blcmx5IGFueXdheSBpZiB0aGV5IGNhcmUuCisgICAgcmV0dXJuICZBICE9ICZCOworICB9CisKKyAgLy8vIENvbnN0cmFpbiB0aGUgKHBvc3NpYmx5IGdlbmVyaWMpIHZpcnR1YWwgcmVnaXN0ZXIgXHAgUmVnIHRvIFxwIFJDLgorICAvLy8KKyAgLy8vIFxwcmUgXHAgUmVnIGlzIGEgdmlydHVhbCByZWdpc3RlciB0aGF0IGVpdGhlciBoYXMgYSBiYW5rIG9yIGEgY2xhc3MuCisgIC8vLyBccmV0dXJucyBUaGUgY29uc3RyYWluZWQgcmVnaXN0ZXIgY2xhc3MsIG9yIG51bGxwdHIgaWYgdGhlcmUgaXMgbm9uZS4KKyAgLy8vIFxub3RlIFRoaXMgaXMgYSBnZW5lcmljIHZhcmlhbnQgb2YgTWFjaGluZVJlZ2lzdGVySW5mbzo6Y29uc3RyYWluUmVnQ2xhc3MKKyAgLy8vIFxub3RlIFVzZSBNYWNoaW5lUmVnaXN0ZXJJbmZvOjpjb25zdHJhaW5SZWdBdHRycyBpbnN0ZWFkIGZvciBhbnkgbm9uLWlzZWwKKyAgLy8vIHB1cnBvc2UsIGluY2x1ZGluZyBub24tc2VsZWN0IHBhc3NlcyBvZiBHbG9iYWxJU2VsCisgIHN0YXRpYyBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICoKKyAgY29uc3RyYWluR2VuZXJpY1JlZ2lzdGVyKHVuc2lnbmVkIFJlZywgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAmUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkkpOworCisgIC8vLyBJZGVudGlmaWVyIHVzZWQgd2hlbiB0aGUgcmVsYXRlZCBpbnN0cnVjdGlvbiBtYXBwaW5nIGluc3RhbmNlCisgIC8vLyBpcyBnZW5lcmF0ZWQgYnkgdGFyZ2V0IGluZGVwZW5kZW50IGNvZGUuCisgIC8vLyBNYWtlIHN1cmUgbm90IHRvIHVzZSB0aGF0IGlkZW50aWZpZXIgdG8gYXZvaWQgcG9zc2libGUgY29sbGlzaW9uLgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgRGVmYXVsdE1hcHBpbmdJRDsKKworICAvLy8gSWRlbnRpZmllciB1c2VkIHdoZW4gdGhlIHJlbGF0ZWQgaW5zdHJ1Y3Rpb24gbWFwcGluZyBpbnN0YW5jZQorICAvLy8gaXMgZ2VuZXJhdGVkIGJ5IHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAvLy8gTWFrZSBzdXJlIG5vdCB0byB1c2UgdGhhdCBpZGVudGlmaWVyLgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgSW52YWxpZE1hcHBpbmdJRDsKKworICAvLy8gR2V0IHRoZSBtYXBwaW5nIG9mIHRoZSBkaWZmZXJlbnQgb3BlcmFuZHMgb2YgXHAgTUkKKyAgLy8vIG9uIHRoZSByZWdpc3RlciBiYW5rLgorICAvLy8gVGhpcyBtYXBwaW5nIHNob3VsZCBiZSB0aGUgZGlyZWN0IHRyYW5zbGF0aW9uIG9mIFxwIE1JLgorICAvLy8gSW4gb3RoZXIgd29yZHMsIHdoZW4gXHAgTUkgaXMgbWFwcGVkIHdpdGggdGhlIHJldHVybmVkIG1hcHBpbmcsCisgIC8vLyBvbmx5IHRoZSByZWdpc3RlciBiYW5rcyBvZiB0aGUgb3BlcmFuZHMgb2YgXHAgTUkgbmVlZCB0byBiZSB1cGRhdGVkLgorICAvLy8gSW4gcGFydGljdWxhciwgbmVpdGhlciB0aGUgb3Bjb2RlIG5vciB0aGUgdHlwZSBvZiBccCBNSSBuZWVkcyB0byBiZQorICAvLy8gdXBkYXRlZCBmb3IgdGhpcyBkaXJlY3QgbWFwcGluZy4KKyAgLy8vCisgIC8vLyBUaGUgdGFyZ2V0IGluZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIGdpdmVzIGEgbWFwcGluZyBiYXNlZCBvbgorICAvLy8gdGhlIHJlZ2lzdGVyIGNsYXNzZXMgZm9yIHRoZSB0YXJnZXQgc3BlY2lmaWMgb3Bjb2RlLgorICAvLy8gSXQgdXNlcyB0aGUgSUQgUmVnaXN0ZXJCYW5rSW5mbzo6RGVmYXVsdE1hcHBpbmdJRCBmb3IgdGhhdCBtYXBwaW5nLgorICAvLy8gTWFrZSBzdXJlIHlvdSBkbyBub3QgdXNlIHRoYXQgSUQgZm9yIHRoZSBhbHRlcm5hdGl2ZSBtYXBwaW5nCisgIC8vLyBmb3IgTUkuIFNlZSBnZXRJbnN0ckFsdGVybmF0aXZlTWFwcGluZ3MgZm9yIHRoZSBhbHRlcm5hdGl2ZQorICAvLy8gbWFwcGluZ3MuCisgIC8vLworICAvLy8gRm9yIGluc3RhbmNlLCBpZiBccCBNSSBpcyBhIHZlY3RvciBhZGQsIHRoZSBtYXBwaW5nIHNob3VsZAorICAvLy8gbm90IGJlIGEgc2NhbGFyaXphdGlvbiBvZiB0aGUgYWRkLgorICAvLy8KKyAgLy8vIFxwb3N0IHJldHVybmVkVmFsLnZlcmlmeShNSSkuCisgIC8vLworICAvLy8gXG5vdGUgSWYgcmV0dXJuZWRWYWwgZG9lcyBub3QgdmVyaWZ5IE1JLCB0aGlzIHdvdWxkIHByb2JhYmx5IG1lYW4KKyAgLy8vIHRoYXQgdGhlIHRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IHRoYXQgaW5zdHJ1Y3Rpb24uCisgIHZpcnR1YWwgY29uc3QgSW5zdHJ1Y3Rpb25NYXBwaW5nICYKKyAgZ2V0SW5zdHJNYXBwaW5nKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIGFsdGVybmF0aXZlIG1hcHBpbmdzIGZvciBccCBNSS4KKyAgLy8vIEFsdGVybmF0aXZlIGluIHRoZSBzZW5zZSBkaWZmZXJlbnQgZnJvbSBnZXRJbnN0ck1hcHBpbmcuCisgIHZpcnR1YWwgSW5zdHJ1Y3Rpb25NYXBwaW5ncworICBnZXRJbnN0ckFsdGVybmF0aXZlTWFwcGluZ3MoY29uc3QgTWFjaGluZUluc3RyICZNSSkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgcG9zc2libGUgbWFwcGluZyBmb3IgXHAgTUkuCisgIC8vLyBBIG1hcHBpbmcgZGVmaW5lcyB3aGVyZSB0aGUgZGlmZmVyZW50IG9wZXJhbmRzIG1heSBsaXZlIGFuZCBhdCB3aGF0IGNvc3QuCisgIC8vLyBGb3IgaW5zdGFuY2UsIGxldCB1cyBjb25zaWRlcjoKKyAgLy8vIHYwKDE2KSA9IEdfQUREIDwyIHggaTg+IHYxLCB2MgorICAvLy8gVGhlIHBvc3NpYmxlIG1hcHBpbmcgY291bGQgYmU6CisgIC8vLworICAvLy8gey8qSUQqL1ZlY3RvckFkZCwgLypDb3N0Ki8xLCAvKnYwKi97KDB4RkZGRiwgVlBSKX0sIC8qdjEqL3soMHhGRkZGLCBWUFIpfSwKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp2MioveygweEZGRkYsIFZQUil9fQorICAvLy8gey8qSUQqL1NjYWxhckFkZHgyLCAvKkNvc3QqLzIsIC8qdjAqL3soMHgwMEZGLCBHUFIpLCgweEZGMDAsIEdQUil9LAorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdjEqL3soMHgwMEZGLCBHUFIpLCgweEZGMDAsIEdQUil9LAorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdjIqL3soMHgwMEZGLCBHUFIpLCgweEZGMDAsIEdQUil9fQorICAvLy8KKyAgLy8vIFxub3RlIFRoZSBmaXJzdCBhbHRlcm5hdGl2ZSBvZiB0aGUgcmV0dXJuZWQgbWFwcGluZyBzaG91bGQgYmUgdGhlCisgIC8vLyBkaXJlY3QgdHJhbnNsYXRpb24gb2YgXHAgTUkgY3VycmVudCBmb3JtLgorICAvLy8KKyAgLy8vIFxwb3N0ICFyZXR1cm5lZFZhbC5lbXB0eSgpLgorICBJbnN0cnVjdGlvbk1hcHBpbmdzIGdldEluc3RyUG9zc2libGVNYXBwaW5ncyhjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdDsKKworICAvLy8gQXBwbHkgXHAgT3BkTWFwcGVyLmdldEluc3RyTWFwcGluZygpIHRvIFxwIE9wZE1hcHBlci5nZXRNSSgpLgorICAvLy8gQWZ0ZXIgdGhpcyBjYWxsIFxwIE9wZE1hcHBlci5nZXRNSSgpIG1heSBub3QgYmUgdmFsaWQgYW55bW9yZS4KKyAgLy8vIFxwIE9wZE1hcHBlci5nZXRJbnN0ck1hcHBpbmcoKS5nZXRJRCgpIGNhcnJpZXMgdGhlIGluZm9ybWF0aW9uIG9mCisgIC8vLyB3aGF0IGhhcyBiZWVuIGNob3NlbiB0byBtYXAgXHAgT3BkTWFwcGVyLmdldE1JKCkuIFRoaXMgSUQgaXMgc2V0CisgIC8vLyBieSB0aGUgdmFyaW91cyBnZXRJbnN0clhYWE1hcHBpbmcgbWV0aG9kLgorICAvLy8KKyAgLy8vIFRoZXJlZm9yZSwgZ2V0dGluZyB0aGUgbWFwcGluZyBhbmQgYXBwbHlpbmcgaXQgc2hvdWxkIGJlIGtlcHQgaW4KKyAgLy8vIHN5bmMuCisgIHZvaWQgYXBwbHlNYXBwaW5nKGNvbnN0IE9wZXJhbmRzTWFwcGVyICZPcGRNYXBwZXIpIGNvbnN0IHsKKyAgICAvLyBUaGUgb25seSBtYXBwaW5nIHdlIGtub3cgaG93IHRvIGhhbmRsZSBpcyB0aGUgZGVmYXVsdCBtYXBwaW5nLgorICAgIGlmIChPcGRNYXBwZXIuZ2V0SW5zdHJNYXBwaW5nKCkuZ2V0SUQoKSA9PSBEZWZhdWx0TWFwcGluZ0lEKQorICAgICAgcmV0dXJuIGFwcGx5RGVmYXVsdE1hcHBpbmcoT3BkTWFwcGVyKTsKKyAgICAvLyBGb3Igb3RoZXIgbWFwcGluZywgdGhlIHRhcmdldCBuZWVkcyB0byBkbyB0aGUgcmlnaHQgdGhpbmcuCisgICAgLy8gSWYgdGhhdCBtZWFucyBjYWxsaW5nIGFwcGx5RGVmYXVsdE1hcHBpbmcsIGZpbmUsIGJ1dCB0aGlzCisgICAgLy8gbXVzdCBiZSBleHBsaWNpdGx5IHN0YXRlZC4KKyAgICBhcHBseU1hcHBpbmdJbXBsKE9wZE1hcHBlcik7CisgIH0KKworICAvLy8gR2V0IHRoZSBzaXplIGluIGJpdHMgb2YgXHAgUmVnLgorICAvLy8gVXRpbGl0eSBtZXRob2QgdG8gZ2V0IHRoZSBzaXplIG9mIGFueSByZWdpc3RlcnMuIFVubGlrZQorICAvLy8gTWFjaGluZVJlZ2lzdGVySW5mbzo6Z2V0U2l6ZSwgdGhlIHJlZ2lzdGVyIGRvZXMgbm90IG5lZWQgdG8gYmUgYQorICAvLy8gdmlydHVhbCByZWdpc3Rlci4KKyAgLy8vCisgIC8vLyBccHJlIFxwIFJlZyAhPSAwIChOb1JlZ2lzdGVyKS4KKyAgdW5zaWduZWQgZ2V0U2l6ZUluQml0cyh1bnNpZ25lZCBSZWcsIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSkgY29uc3Q7CisKKyAgLy8vIENoZWNrIHRoYXQgaW5mb3JtYXRpb24gaG9sZCBieSB0aGlzIGluc3RhbmNlIG1ha2Ugc2Vuc2UgZm9yIHRoZQorICAvLy8gZ2l2ZW4gXHAgVFJJLgorICAvLy8KKyAgLy8vIFxub3RlIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNoZWNrIGFueXRoaW5nIHdoZW4gYXNzZXJ0aW9ucyBhcmUgZGlzYWJsZWQuCisgIC8vLworICAvLy8gXHJldHVybiBUcnVlIGlzIHRoZSBjaGVjayB3YXMgc3VjY2Vzc2Z1bC4KKyAgYm9vbCB2ZXJpZnkoY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkkpIGNvbnN0OworfTsKKworaW5saW5lIHJhd19vc3RyZWFtICYKK29wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICBjb25zdCBSZWdpc3RlckJhbmtJbmZvOjpQYXJ0aWFsTWFwcGluZyAmUGFydE1hcHBpbmcpIHsKKyAgUGFydE1hcHBpbmcucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK2lubGluZSByYXdfb3N0cmVhbSAmCitvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUmVnaXN0ZXJCYW5rSW5mbzo6VmFsdWVNYXBwaW5nICZWYWxNYXBwaW5nKSB7CisgIFZhbE1hcHBpbmcucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK2lubGluZSByYXdfb3N0cmVhbSAmCitvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgY29uc3QgUmVnaXN0ZXJCYW5rSW5mbzo6SW5zdHJ1Y3Rpb25NYXBwaW5nICZJbnN0ck1hcHBpbmcpIHsKKyAgSW5zdHJNYXBwaW5nLnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCitpbmxpbmUgcmF3X29zdHJlYW0gJgorb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFJlZ2lzdGVyQmFua0luZm86Ok9wZXJhbmRzTWFwcGVyICZPcGRNYXBwZXIpIHsKKyAgT3BkTWFwcGVyLnByaW50KE9TLCAvKkZvckRlYnVnKi8gZmFsc2UpOworICByZXR1cm4gT1M7Cit9CisKKy8vLyBIYXNoaW5nIGZ1bmN0aW9uIGZvciBQYXJ0aWFsTWFwcGluZy4KKy8vLyBJdCBpcyByZXF1aXJlZCBmb3IgdGhlIGhhc2hpbmcgb2YgVmFsdWVNYXBwaW5nLgoraGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3QgUmVnaXN0ZXJCYW5rSW5mbzo6UGFydGlhbE1hcHBpbmcgJlBhcnRNYXBwaW5nKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX1JFR0lTVEVSQkFOS0lORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvVHlwZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IyMmUzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1R5cGVzLmgKQEAgLTAsMCArMSwzNCBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1R5cGVzLmggLSBUeXBlcyB1c2VkIGJ5IEdJU2VsIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyBoaWdoIGxldmVsIHR5cGVzIHRoYXQgYXJlIHVzZWQgYnkgc2V2ZXJhbCBwYXNzZXMgb3IKKy8vLyBBUElzIGludm9sdmVkIGluIHRoZSBHbG9iYWxJU2VsIHBpcGVsaW5lLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9UWVBFU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX1RZUEVTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVmFsdWU7CisKKy8vLyBNYXAgYSB2YWx1ZSB0byBhIHZpcnR1YWwgcmVnaXN0ZXIuCisvLy8gRm9yIG5vdywgd2UgY2hvc2UgdG8gbWFwIGFnZ3JlZ2F0ZSB0eXBlcyB0byBvbiBzaW5nbGUgdmlydHVhbAorLy8vIHJlZ2lzdGVyLiBUaGlzIG1pZ2h0IGJlIHJldmlzaXRlZCBpZiBpdCB0dXJucyBvdXQgdG8gYmUgaW5lZmZpY2llbnQuCisvLy8gUFIyNjE2MSB0cmFja3MgdGhhdC4KKy8vLyBOb3RlOiBXZSBuZWVkIHRvIGV4cG9zZSB0aGlzIHR5cGUgdG8gdGhlIHRhcmdldCBob29rcyBmb3IgdGhpbmcgbGlrZQorLy8vIEFCSSBsb3dlcmluZyB0aGF0IHdvdWxkIGJlIHVzZWQgZHVyaW5nIElSVHJhbnNsYXRpb24uCit1c2luZyBWYWx1ZVRvVlJlZyA9IERlbnNlTWFwPGNvbnN0IFZhbHVlICosIHVuc2lnbmVkPjsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX1RZUEVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1V0aWxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNzAzNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9VdGlscy5oCkBAIC0wLDAgKzEsMTA2IEBACisvLz09LS0gbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvVXRpbHMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZSBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIEFQSSBvZiBoZWxwZXIgZnVuY3Rpb25zIHVzZWQgdGhyb3VnaG91dCB0aGUKKy8vLyBHbG9iYWxJU2VsIHBpcGVsaW5lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfVVRJTFNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9VVElMU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBNYWNoaW5lT3BlcmFuZDsKK2NsYXNzIE1hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyOworY2xhc3MgTWFjaGluZU9wdGltaXphdGlvblJlbWFya01pc3NlZDsKK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CitjbGFzcyBNQ0luc3RyRGVzYzsKK2NsYXNzIFJlZ2lzdGVyQmFua0luZm87CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CitjbGFzcyBUYXJnZXRQYXNzQ29uZmlnOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJDbGFzczsKK2NsYXNzIFR3aW5lOworY2xhc3MgQ29uc3RhbnRGUDsKK2NsYXNzIEFQRmxvYXQ7CisKKy8vLyBUcnkgdG8gY29uc3RyYWluIFJlZyB0byB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGNsYXNzLiBJZiB0aGlzIGZhaWxzLAorLy8vIGNyZWF0ZSBhIG5ldyB2aXJ0dWFsIHJlZ2lzdGVyIGluIHRoZSBjb3JyZWN0IGNsYXNzIGFuZCBpbnNlcnQgYSBDT1BZIGJlZm9yZQorLy8vIFxwIEluc2VydFB0LiBUaGUgZGVidWcgbG9jYXRpb24gb2YgXHAgSW5zZXJ0UHQgaXMgdXNlZCBmb3IgdGhlIG5ldyBjb3B5LgorLy8vCisvLy8gXHJldHVybiBUaGUgdmlydHVhbCByZWdpc3RlciBjb25zdHJhaW5lZCB0byB0aGUgcmlnaHQgcmVnaXN0ZXIgY2xhc3MuCit1bnNpZ25lZCBjb25zdHJhaW5SZWdUb0NsYXNzKE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQmFua0luZm8gJlJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICZJbnNlcnRQdCwgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICZSZWdDbGFzcyk7CisKKy8vLyBUcnkgdG8gY29uc3RyYWluIFJlZyBzbyB0aGF0IGl0IGlzIHVzYWJsZSBieSBhcmd1bWVudCBPcElkeCBvZiB0aGUKKy8vLyBwcm92aWRlZCBNQ0luc3RyRGVzYyBccCBJSS4gSWYgdGhpcyBmYWlscywgY3JlYXRlIGEgbmV3IHZpcnR1YWwKKy8vLyByZWdpc3RlciBpbiB0aGUgY29ycmVjdCBjbGFzcyBhbmQgaW5zZXJ0IGEgQ09QWSBiZWZvcmUgXHAgSW5zZXJ0UHQuCisvLy8gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNvbnN0cmFpblJlZ1RvQ2xhc3MoKSB3aXRoIFJlZ0NsYXNzIG9idGFpbmVkIGZyb20gdGhlCisvLy8gTUNJbnN0ckRlc2MuIFRoZSBkZWJ1ZyBsb2NhdGlvbiBvZiBccCBJbnNlcnRQdCBpcyB1c2VkIGZvciB0aGUgbmV3IGNvcHkuCisvLy8KKy8vLyBccmV0dXJuIFRoZSB2aXJ0dWFsIHJlZ2lzdGVyIGNvbnN0cmFpbmVkIHRvIHRoZSByaWdodCByZWdpc3RlciBjbGFzcy4KK3Vuc2lnbmVkIGNvbnN0cmFpbk9wZXJhbmRSZWdDbGFzcyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWdpc3RlckJhbmtJbmZvICZSQkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICZJbnNlcnRQdCwgY29uc3QgTUNJbnN0ckRlc2MgJklJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZSZWdNTywgdW5zaWduZWQgT3BJZHgpOworCisvLy8gTXV0YXRlIHRoZSBuZXdseS1zZWxlY3RlZCBpbnN0cnVjdGlvbiBccCBJIHRvIGNvbnN0cmFpbiBpdHMgKHBvc3NpYmx5CisvLy8gZ2VuZXJpYykgdmlydHVhbCByZWdpc3RlciBvcGVyYW5kcyB0byB0aGUgaW5zdHJ1Y3Rpb24ncyByZWdpc3RlciBjbGFzcy4KKy8vLyBUaGlzIGNvdWxkIGludm9sdmUgaW5zZXJ0aW5nIENPUFlzIGJlZm9yZSAoZm9yIHVzZXMpIG9yIGFmdGVyIChmb3IgZGVmcykuCisvLy8gVGhpcyByZXF1aXJlcyB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIHRvIG1hdGNoIHRoZSBpbnN0cnVjdGlvbiBkZXNjcmlwdGlvbi4KKy8vLyBccmV0dXJucyB3aGV0aGVyIG9wZXJhbmQgcmVnY2xhc3MgY29uc3RyYWluaW5nIHN1Y2NlZWRlZC4KKy8vLworLy8gRklYTUU6IE5vdCBhbGwgaW5zdHJ1Y3Rpb25zIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIG9wZXJhbmRzLiBXZSBzaG91bGQKKy8vIHByb2JhYmx5IGV4cG9zZSBhIGNvbnN0cmFpbiBoZWxwZXIgcGVyIG9wZXJhbmQgYW5kIGxldCB0aGUgdGFyZ2V0IHNlbGVjdG9yCisvLyBjb25zdHJhaW4gaW5kaXZpZHVhbCByZWdpc3RlcnMsIGxpa2UgZmFzdC1pc2VsLgorYm9vbCBjb25zdHJhaW5TZWxlY3RlZEluc3RSZWdPcGVyYW5kcyhNYWNoaW5lSW5zdHIgJkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnaXN0ZXJCYW5rSW5mbyAmUkJJKTsKKy8vLyBDaGVjayB3aGV0aGVyIGFuIGluc3RydWN0aW9uIFxwIE1JIGlzIGRlYWQ6IGl0IG9ubHkgZGVmaW5lcyBkZWFkIHZpcnR1YWwKKy8vLyByZWdpc3RlcnMsIGFuZCBkb2Vzbid0IGhhdmUgb3RoZXIgc2lkZSBlZmZlY3RzLgorYm9vbCBpc1RyaXZpYWxseURlYWQoY29uc3QgTWFjaGluZUluc3RyICZNSSwgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJKTsKKworLy8vIFJlcG9ydCBhbiBJU2VsIGVycm9yIGFzIGEgbWlzc2VkIG9wdGltaXphdGlvbiByZW1hcmsgdG8gdGhlIExMVk1Db250ZXh0J3MKKy8vLyBkaWFnbm9zdGljIHN0cmVhbS4gIFNldCB0aGUgRmFpbGVkSVNlbCBNYWNoaW5lRnVuY3Rpb24gcHJvcGVydHkuCit2b2lkIHJlcG9ydEdJU2VsRmFpbHVyZShNYWNoaW5lRnVuY3Rpb24gJk1GLCBjb25zdCBUYXJnZXRQYXNzQ29uZmlnICZUUEMsCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAmTU9SRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtNaXNzZWQgJlIpOworCit2b2lkIHJlcG9ydEdJU2VsRmFpbHVyZShNYWNoaW5lRnVuY3Rpb24gJk1GLCBjb25zdCBUYXJnZXRQYXNzQ29uZmlnICZUUEMsCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAmTU9SRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlBhc3NOYW1lLCBTdHJpbmdSZWYgTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisKK09wdGlvbmFsPGludDY0X3Q+IGdldENvbnN0YW50VlJlZ1ZhbCh1bnNpZ25lZCBWUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSk7Citjb25zdCBDb25zdGFudEZQKiBnZXRDb25zdGFudEZQVlJlZ1ZhbCh1bnNpZ25lZCBWUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJKTsKKworLy8vIFNlZSBpZiBSZWcgaXMgZGVmaW5lZCBieSBhbiBzaW5nbGUgZGVmIGluc3RydWN0aW9uIHRoYXQgaXMKKy8vLyBPcGNvZGUuIEFsc28gdHJ5IHRvIGRvIHRyaXZpYWwgZm9sZGluZyBpZiBpdCdzIGEgQ09QWSB3aXRoCisvLy8gc2FtZSB0eXBlcy4gUmV0dXJucyBudWxsIG90aGVyd2lzZS4KK01hY2hpbmVJbnN0ciAqZ2V0T3Bjb2RlRGVmKHVuc2lnbmVkIE9wY29kZSwgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJKTsKKworLy8vIFJldHVybnMgYW4gQVBGbG9hdCBmcm9tIFZhbCBjb252ZXJ0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIHNpemUuCitBUEZsb2F0IGdldEFQRmxvYXRGcm9tU2l6ZShkb3VibGUgVmFsLCB1bnNpZ25lZCBTaXplKTsKK30gLy8gRW5kIG5hbWVzcGFjZSBsbHZtLgorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vSVNET3Bjb2Rlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0lTRE9wY29kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTk0ODcxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0lTRE9wY29kZXMuaApAQCAtMCwwICsxLDk5NyBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vSVNET3Bjb2Rlcy5oIC0gQ29kZUdlbiBvcGNvZGVzIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgY29kZWdlbiBvcGNvZGVzIGFuZCByZWxhdGVkIHV0aWxpdGllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9JU0RPUENPREVTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0lTRE9QQ09ERVNfSAorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBJU0QgbmFtZXNwYWNlIC0gVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgYW4gZW51bSB3aGljaCByZXByZXNlbnRzIGFsbCBvZiB0aGUKKy8vLyBTZWxlY3Rpb25EQUcgbm9kZSB0eXBlcyBhbmQgdmFsdWUgdHlwZXMuCisvLy8KK25hbWVzcGFjZSBJU0QgeworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gSVNEOjpOb2RlVHlwZSBlbnVtIC0gVGhpcyBlbnVtIGRlZmluZXMgdGhlIHRhcmdldC1pbmRlcGVuZGVudCBvcGVyYXRvcnMKKyAgLy8vIGZvciBhIFNlbGVjdGlvbkRBRy4KKyAgLy8vCisgIC8vLyBUYXJnZXRzIG1heSBhbHNvIGRlZmluZSB0YXJnZXQtZGVwZW5kZW50IG9wZXJhdG9yIGNvZGVzIGZvciBTRE5vZGVzLiBGb3IKKyAgLy8vIGV4YW1wbGUsIG9uIHg4NiwgdGhlc2UgYXJlIHRoZSBlbnVtIHZhbHVlcyBpbiB0aGUgWDg2SVNEIG5hbWVzcGFjZS4KKyAgLy8vIFRhcmdldHMgc2hvdWxkIGFpbSB0byB1c2UgdGFyZ2V0LWluZGVwZW5kZW50IG9wZXJhdG9ycyB0byBtb2RlbCB0aGVpcgorICAvLy8gaW5zdHJ1Y3Rpb24gc2V0cyBhcyBtdWNoIGFzIHBvc3NpYmxlLCBhbmQgb25seSB1c2UgdGFyZ2V0LWRlcGVuZGVudAorICAvLy8gb3BlcmF0b3JzIHdoZW4gdGhleSBoYXZlIHNwZWNpYWwgcmVxdWlyZW1lbnRzLgorICAvLy8KKyAgLy8vIEZpbmFsbHksIGR1cmluZyBhbmQgYWZ0ZXIgc2VsZWN0aW9uIHByb3BlciwgU05vZGVzIG1heSB1c2Ugc3BlY2lhbAorICAvLy8gb3BlcmF0b3IgY29kZXMgdGhhdCBjb3JyZXNwb25kIGRpcmVjdGx5IHdpdGggTWFjaGluZUluc3RyIG9wY29kZXMuIFRoZXNlCisgIC8vLyBhcmUgdXNlZCB0byByZXByZXNlbnQgc2VsZWN0ZWQgaW5zdHJ1Y3Rpb25zLiBTZWUgdGhlIGlzTWFjaGluZU9wY29kZSgpCisgIC8vLyBhbmQgZ2V0TWFjaGluZU9wY29kZSgpIG1lbWJlciBmdW5jdGlvbnMgb2YgU0ROb2RlLgorICAvLy8KKyAgZW51bSBOb2RlVHlwZSB7CisgICAgLy8vIERFTEVURURfTk9ERSAtIFRoaXMgaXMgYW4gaWxsZWdhbCB2YWx1ZSB0aGF0IGlzIHVzZWQgdG8gY2F0Y2gKKyAgICAvLy8gZXJyb3JzLiAgVGhpcyBvcGNvZGUgaXMgbm90IGEgbGVnYWwgb3Bjb2RlIGZvciBhbnkgbm9kZS4KKyAgICBERUxFVEVEX05PREUsCisKKyAgICAvLy8gRW50cnlUb2tlbiAtIFRoaXMgaXMgdGhlIG1hcmtlciB1c2VkIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiBhIHJlZ2lvbi4KKyAgICBFbnRyeVRva2VuLAorCisgICAgLy8vIFRva2VuRmFjdG9yIC0gVGhpcyBub2RlIHRha2VzIG11bHRpcGxlIHRva2VucyBhcyBpbnB1dCBhbmQgcHJvZHVjZXMgYQorICAgIC8vLyBzaW5nbGUgdG9rZW4gcmVzdWx0LiBUaGlzIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBmYWN0IHRoYXQgdGhlIG9wZXJhbmQKKyAgICAvLy8gb3BlcmF0b3JzIGFyZSBpbmRlcGVuZGVudCBvZiBlYWNoIG90aGVyLgorICAgIFRva2VuRmFjdG9yLAorCisgICAgLy8vIEFzc2VydFNleHQsIEFzc2VydFpleHQgLSBUaGVzZSBub2RlcyByZWNvcmQgaWYgYSByZWdpc3RlciBjb250YWlucyBhCisgICAgLy8vIHZhbHVlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiB6ZXJvIG9yIHNpZ24gZXh0ZW5kZWQgZnJvbSBhIG5hcnJvd2VyIHR5cGUuCisgICAgLy8vIFRoZXNlIG5vZGVzIHRha2UgdHdvIG9wZXJhbmRzLiAgVGhlIGZpcnN0IGlzIHRoZSBub2RlIHRoYXQgaGFzIGFscmVhZHkKKyAgICAvLy8gYmVlbiBleHRlbmRlZCwgYW5kIHRoZSBzZWNvbmQgaXMgYSB2YWx1ZSB0eXBlIG5vZGUgaW5kaWNhdGluZyB0aGUgd2lkdGgKKyAgICAvLy8gb2YgdGhlIGV4dGVuc2lvbgorICAgIEFzc2VydFNleHQsIEFzc2VydFpleHQsCisKKyAgICAvLy8gVmFyaW91cyBsZWFmIG5vZGVzLgorICAgIEJhc2ljQmxvY2ssIFZBTFVFVFlQRSwgQ09ORENPREUsIFJlZ2lzdGVyLCBSZWdpc3Rlck1hc2ssCisgICAgQ29uc3RhbnQsIENvbnN0YW50RlAsCisgICAgR2xvYmFsQWRkcmVzcywgR2xvYmFsVExTQWRkcmVzcywgRnJhbWVJbmRleCwKKyAgICBKdW1wVGFibGUsIENvbnN0YW50UG9vbCwgRXh0ZXJuYWxTeW1ib2wsIEJsb2NrQWRkcmVzcywKKworICAgIC8vLyBUaGUgYWRkcmVzcyBvZiB0aGUgR09UCisgICAgR0xPQkFMX09GRlNFVF9UQUJMRSwKKworICAgIC8vLyBGUkFNRUFERFIsIFJFVFVSTkFERFIgLSBUaGVzZSBub2RlcyByZXByZXNlbnQgbGx2bS5mcmFtZWFkZHJlc3MgYW5kCisgICAgLy8vIGxsdm0ucmV0dXJuYWRkcmVzcyBvbiB0aGUgREFHLiAgVGhlc2Ugbm9kZXMgdGFrZSBvbmUgb3BlcmFuZCwgdGhlIGluZGV4CisgICAgLy8vIG9mIHRoZSBmcmFtZSBvciByZXR1cm4gYWRkcmVzcyB0byByZXR1cm4uICBBbiBpbmRleCBvZiB6ZXJvIGNvcnJlc3BvbmRzCisgICAgLy8vIHRvIHRoZSBjdXJyZW50IGZ1bmN0aW9uJ3MgZnJhbWUgb3IgcmV0dXJuIGFkZHJlc3MsIGFuIGluZGV4IG9mIG9uZSB0bworICAgIC8vLyB0aGUgcGFyZW50J3MgZnJhbWUgb3IgcmV0dXJuIGFkZHJlc3MsIGFuZCBzbyBvbi4KKyAgICBGUkFNRUFERFIsIFJFVFVSTkFERFIsIEFERFJPRlJFVFVSTkFERFIsCisKKyAgICAvLy8gTE9DQUxfUkVDT1ZFUiAtIFJlcHJlc2VudHMgdGhlIGxsdm0ubG9jYWxyZWNvdmVyIGludHJpbnNpYy4KKyAgICAvLy8gTWF0ZXJpYWxpemVzIHRoZSBvZmZzZXQgZnJvbSB0aGUgbG9jYWwgb2JqZWN0IHBvaW50ZXIgb2YgYW5vdGhlcgorICAgIC8vLyBmdW5jdGlvbiB0byBhIHBhcnRpY3VsYXIgbG9jYWwgb2JqZWN0IHBhc3NlZCB0byBsbHZtLmxvY2FsZXNjYXBlLiBUaGUKKyAgICAvLy8gb3BlcmFuZCBpcyB0aGUgTUNTeW1ib2wgbGFiZWwgdXNlZCB0byByZXByZXNlbnQgdGhpcyBvZmZzZXQsIHNpbmNlCisgICAgLy8vIHR5cGljYWxseSB0aGUgb2Zmc2V0IGlzIG5vdCBrbm93biB1bnRpbCBhZnRlciBjb2RlIGdlbmVyYXRpb24gb2YgdGhlCisgICAgLy8vIHBhcmVudC4KKyAgICBMT0NBTF9SRUNPVkVSLAorCisgICAgLy8vIFJFQURfUkVHSVNURVIsIFdSSVRFX1JFR0lTVEVSIC0gVGhpcyBub2RlIHJlcHJlc2VudHMgbGx2bS5yZWdpc3RlciBvbgorICAgIC8vLyB0aGUgREFHLCB3aGljaCBpbXBsZW1lbnRzIHRoZSBuYW1lZCByZWdpc3RlciBnbG9iYWwgdmFyaWFibGVzIGV4dGVuc2lvbi4KKyAgICBSRUFEX1JFR0lTVEVSLAorICAgIFdSSVRFX1JFR0lTVEVSLAorCisgICAgLy8vIEZSQU1FX1RPX0FSR1NfT0ZGU0VUIC0gVGhpcyBub2RlIHJlcHJlc2VudHMgb2Zmc2V0IGZyb20gZnJhbWUgcG9pbnRlciB0bworICAgIC8vLyBmaXJzdCAocG9zc2libGUpIG9uLXN0YWNrIGFyZ3VtZW50LiBUaGlzIGlzIG5lZWRlZCBmb3IgY29ycmVjdCBzdGFjaworICAgIC8vLyBhZGp1c3RtZW50IGR1cmluZyB1bndpbmQuCisgICAgRlJBTUVfVE9fQVJHU19PRkZTRVQsCisKKyAgICAvLy8gRUhfRFdBUkZfQ0ZBIC0gVGhpcyBub2RlIHJlcHJlc2VudHMgdGhlIHBvaW50ZXIgdG8gdGhlIERXQVJGIENhbm9uaWNhbAorICAgIC8vLyBGcmFtZSBBZGRyZXNzIChDRkEpLCBnZW5lcmFsbHkgdGhlIHZhbHVlIG9mIHRoZSBzdGFjayBwb2ludGVyIGF0IHRoZQorICAgIC8vLyBjYWxsIHNpdGUgaW4gdGhlIHByZXZpb3VzIGZyYW1lLgorICAgIEVIX0RXQVJGX0NGQSwKKworICAgIC8vLyBPVVRDSEFJTiA9IEVIX1JFVFVSTihJTkNIQUlOLCBPRkZTRVQsIEhBTkRMRVIpIC0gVGhpcyBub2RlIHJlcHJlc2VudHMKKyAgICAvLy8gJ2VoX3JldHVybicgZ2NjIGR3YXJmIGJ1aWx0aW4sIHdoaWNoIGlzIHVzZWQgdG8gcmV0dXJuIGZyb20KKyAgICAvLy8gZXhjZXB0aW9uLiBUaGUgZ2VuZXJhbCBtZWFuaW5nIGlzOiBhZGp1c3Qgc3RhY2sgYnkgT0ZGU0VUIGFuZCBwYXNzCisgICAgLy8vIGV4ZWN1dGlvbiB0byBIQU5ETEVSLiBNYW55IHBsYXRmb3JtLXJlbGF0ZWQgZGV0YWlscyBhbHNvIDopCisgICAgRUhfUkVUVVJOLAorCisgICAgLy8vIFJFU1VMVCwgT1VUQ0hBSU4gPSBFSF9TSkxKX1NFVEpNUChJTkNIQUlOLCBidWZmZXIpCisgICAgLy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGVoLnNqbGouc2V0am1wIGludHJpbnNpYy4KKyAgICAvLy8gSXQgdGFrZXMgYW4gaW5wdXQgY2hhaW4gYW5kIGEgcG9pbnRlciB0byB0aGUganVtcCBidWZmZXIgYXMgaW5wdXRzCisgICAgLy8vIGFuZCByZXR1cm5zIGFuIG91dGNoYWluLgorICAgIEVIX1NKTEpfU0VUSk1QLAorCisgICAgLy8vIE9VVENIQUlOID0gRUhfU0pMSl9MT05HSk1QKElOQ0hBSU4sIGJ1ZmZlcikKKyAgICAvLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgZWguc2psai5sb25nam1wIGludHJpbnNpYy4KKyAgICAvLy8gSXQgdGFrZXMgYW4gaW5wdXQgY2hhaW4gYW5kIGEgcG9pbnRlciB0byB0aGUganVtcCBidWZmZXIgYXMgaW5wdXRzCisgICAgLy8vIGFuZCByZXR1cm5zIGFuIG91dGNoYWluLgorICAgIEVIX1NKTEpfTE9OR0pNUCwKKworICAgIC8vLyBPVVRDSEFJTiA9IEVIX1NKTEpfU0VUVVBfRElTUEFUQ0goSU5DSEFJTikKKyAgICAvLy8gVGhlIHRhcmdldCBpbml0aWFsaXplcyB0aGUgZGlzcGF0Y2ggdGFibGUgaGVyZS4KKyAgICBFSF9TSkxKX1NFVFVQX0RJU1BBVENILAorCisgICAgLy8vIFRhcmdldENvbnN0YW50KiAtIExpa2UgQ29uc3RhbnQqLCBidXQgdGhlIERBRyBkb2VzIG5vdCBkbyBhbnkgZm9sZGluZywKKyAgICAvLy8gc2ltcGxpZmljYXRpb24sIG9yIGxvd2VyaW5nIG9mIHRoZSBjb25zdGFudC4gVGhleSBhcmUgdXNlZCBmb3IgY29uc3RhbnRzCisgICAgLy8vIHdoaWNoIGFyZSBrbm93biB0byBmaXQgaW4gdGhlIGltbWVkaWF0ZSBmaWVsZHMgb2YgdGhlaXIgdXNlcnMsIG9yIGZvcgorICAgIC8vLyBjYXJyeWluZyBtYWdpYyBudW1iZXJzIHdoaWNoIGFyZSBub3QgdmFsdWVzIHdoaWNoIG5lZWQgdG8gYmUKKyAgICAvLy8gbWF0ZXJpYWxpemVkIGluIHJlZ2lzdGVycy4KKyAgICBUYXJnZXRDb25zdGFudCwKKyAgICBUYXJnZXRDb25zdGFudEZQLAorCisgICAgLy8vIFRhcmdldEdsb2JhbEFkZHJlc3MgLSBMaWtlIEdsb2JhbEFkZHJlc3MsIGJ1dCB0aGUgREFHIGRvZXMgbm8gZm9sZGluZyBvcgorICAgIC8vLyBhbnl0aGluZyBlbHNlIHdpdGggdGhpcyBub2RlLCBhbmQgdGhpcyBpcyB2YWxpZCBpbiB0aGUgdGFyZ2V0LXNwZWNpZmljCisgICAgLy8vIGRhZywgdHVybmluZyBpbnRvIGEgR2xvYmFsQWRkcmVzcyBvcGVyYW5kLgorICAgIFRhcmdldEdsb2JhbEFkZHJlc3MsCisgICAgVGFyZ2V0R2xvYmFsVExTQWRkcmVzcywKKyAgICBUYXJnZXRGcmFtZUluZGV4LAorICAgIFRhcmdldEp1bXBUYWJsZSwKKyAgICBUYXJnZXRDb25zdGFudFBvb2wsCisgICAgVGFyZ2V0RXh0ZXJuYWxTeW1ib2wsCisgICAgVGFyZ2V0QmxvY2tBZGRyZXNzLAorCisgICAgTUNTeW1ib2wsCisKKyAgICAvLy8gVGFyZ2V0SW5kZXggLSBMaWtlIGEgY29uc3RhbnQgcG9vbCBlbnRyeSwgYnV0IHdpdGggY29tcGxldGVseQorICAgIC8vLyB0YXJnZXQtZGVwZW5kZW50IHNlbWFudGljcy4gSG9sZHMgdGFyZ2V0IGZsYWdzLCBhIDMyLWJpdCBpbmRleCwgYW5kIGEKKyAgICAvLy8gNjQtYml0IGluZGV4LiBUYXJnZXRzIGNhbiB1c2UgdGhpcyBob3dldmVyIHRoZXkgbGlrZS4KKyAgICBUYXJnZXRJbmRleCwKKworICAgIC8vLyBSRVNVTFQgPSBJTlRSSU5TSUNfV09fQ0hBSU4oSU5UUklOU0lDSUQsIGFyZzEsIGFyZzIsIC4uLikKKyAgICAvLy8gVGhpcyBub2RlIHJlcHJlc2VudHMgYSB0YXJnZXQgaW50cmluc2ljIGZ1bmN0aW9uIHdpdGggbm8gc2lkZSBlZmZlY3RzLgorICAgIC8vLyBUaGUgZmlyc3Qgb3BlcmFuZCBpcyB0aGUgSUQgbnVtYmVyIG9mIHRoZSBpbnRyaW5zaWMgZnJvbSB0aGUKKyAgICAvLy8gbGx2bTo6SW50cmluc2ljIG5hbWVzcGFjZS4gIFRoZSBvcGVyYW5kcyB0byB0aGUgaW50cmluc2ljIGZvbGxvdy4gIFRoZQorICAgIC8vLyBub2RlIHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgaW50cmluc2ljLgorICAgIElOVFJJTlNJQ19XT19DSEFJTiwKKworICAgIC8vLyBSRVNVTFQsT1VUQ0hBSU4gPSBJTlRSSU5TSUNfV19DSEFJTihJTkNIQUlOLCBJTlRSSU5TSUNJRCwgYXJnMSwgLi4uKQorICAgIC8vLyBUaGlzIG5vZGUgcmVwcmVzZW50cyBhIHRhcmdldCBpbnRyaW5zaWMgZnVuY3Rpb24gd2l0aCBzaWRlIGVmZmVjdHMgdGhhdAorICAgIC8vLyByZXR1cm5zIGEgcmVzdWx0LiAgVGhlIGZpcnN0IG9wZXJhbmQgaXMgYSBjaGFpbiBwb2ludGVyLiAgVGhlIHNlY29uZCBpcworICAgIC8vLyB0aGUgSUQgbnVtYmVyIG9mIHRoZSBpbnRyaW5zaWMgZnJvbSB0aGUgbGx2bTo6SW50cmluc2ljIG5hbWVzcGFjZS4gIFRoZQorICAgIC8vLyBvcGVyYW5kcyB0byB0aGUgaW50cmluc2ljIGZvbGxvdy4gIFRoZSBub2RlIGhhcyB0d28gcmVzdWx0cywgdGhlIHJlc3VsdAorICAgIC8vLyBvZiB0aGUgaW50cmluc2ljIGFuZCBhbiBvdXRwdXQgY2hhaW4uCisgICAgSU5UUklOU0lDX1dfQ0hBSU4sCisKKyAgICAvLy8gT1VUQ0hBSU4gPSBJTlRSSU5TSUNfVk9JRChJTkNIQUlOLCBJTlRSSU5TSUNJRCwgYXJnMSwgYXJnMiwgLi4uKQorICAgIC8vLyBUaGlzIG5vZGUgcmVwcmVzZW50cyBhIHRhcmdldCBpbnRyaW5zaWMgZnVuY3Rpb24gd2l0aCBzaWRlIGVmZmVjdHMgdGhhdAorICAgIC8vLyBkb2VzIG5vdCByZXR1cm4gYSByZXN1bHQuICBUaGUgZmlyc3Qgb3BlcmFuZCBpcyBhIGNoYWluIHBvaW50ZXIuICBUaGUKKyAgICAvLy8gc2Vjb25kIGlzIHRoZSBJRCBudW1iZXIgb2YgdGhlIGludHJpbnNpYyBmcm9tIHRoZSBsbHZtOjpJbnRyaW5zaWMKKyAgICAvLy8gbmFtZXNwYWNlLiAgVGhlIG9wZXJhbmRzIHRvIHRoZSBpbnRyaW5zaWMgZm9sbG93LgorICAgIElOVFJJTlNJQ19WT0lELAorCisgICAgLy8vIENvcHlUb1JlZyAtIFRoaXMgbm9kZSBoYXMgdGhyZWUgb3BlcmFuZHM6IGEgY2hhaW4sIGEgcmVnaXN0ZXIgbnVtYmVyIHRvCisgICAgLy8vIHNldCB0byB0aGlzIHZhbHVlLCBhbmQgYSB2YWx1ZS4KKyAgICBDb3B5VG9SZWcsCisKKyAgICAvLy8gQ29weUZyb21SZWcgLSBUaGlzIG5vZGUgaW5kaWNhdGVzIHRoYXQgdGhlIGlucHV0IHZhbHVlIGlzIGEgdmlydHVhbCBvcgorICAgIC8vLyBwaHlzaWNhbCByZWdpc3RlciB0aGF0IGlzIGRlZmluZWQgb3V0c2lkZSBvZiB0aGUgc2NvcGUgb2YgdGhpcworICAgIC8vLyBTZWxlY3Rpb25EQUcuICBUaGUgcmVnaXN0ZXIgaXMgYXZhaWxhYmxlIGZyb20gdGhlIFJlZ2lzdGVyU0ROb2RlIG9iamVjdC4KKyAgICBDb3B5RnJvbVJlZywKKworICAgIC8vLyBVTkRFRiAtIEFuIHVuZGVmaW5lZCBub2RlLgorICAgIFVOREVGLAorCisgICAgLy8vIEVYVFJBQ1RfRUxFTUVOVCAtIFRoaXMgaXMgdXNlZCB0byBnZXQgdGhlIGxvd2VyIG9yIHVwcGVyIChkZXRlcm1pbmVkIGJ5CisgICAgLy8vIGEgQ29uc3RhbnQsIHdoaWNoIGlzIHJlcXVpcmVkIHRvIGJlIG9wZXJhbmQgIzEpIGhhbGYgb2YgdGhlIGludGVnZXIgb3IKKyAgICAvLy8gZmxvYXQgdmFsdWUgc3BlY2lmaWVkIGFzIG9wZXJhbmQgIzAuICBUaGlzIGlzIG9ubHkgZm9yIHVzZSBiZWZvcmUKKyAgICAvLy8gbGVnYWxpemF0aW9uLCBmb3IgdmFsdWVzIHRoYXQgd2lsbCBiZSBicm9rZW4gaW50byBtdWx0aXBsZSByZWdpc3RlcnMuCisgICAgRVhUUkFDVF9FTEVNRU5ULAorCisgICAgLy8vIEJVSUxEX1BBSVIgLSBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZiBFWFRSQUNUX0VMRU1FTlQgaW4gc29tZSB3YXlzLgorICAgIC8vLyBHaXZlbiB0d28gdmFsdWVzIG9mIHRoZSBzYW1lIGludGVnZXIgdmFsdWUgdHlwZSwgdGhpcyBwcm9kdWNlcyBhIHZhbHVlCisgICAgLy8vIHR3aWNlIGFzIGJpZy4gIExpa2UgRVhUUkFDVF9FTEVNRU5ULCB0aGlzIGNhbiBvbmx5IGJlIHVzZWQgYmVmb3JlCisgICAgLy8vIGxlZ2FsaXphdGlvbi4gVGhlIGxvd2VyIHBhcnQgb2YgdGhlIGNvbXBvc2l0ZSB2YWx1ZSBzaG91bGQgYmUgaW4KKyAgICAvLy8gZWxlbWVudCAwIGFuZCB0aGUgdXBwZXIgcGFydCBzaG91bGQgYmUgaW4gZWxlbWVudCAxLgorICAgIEJVSUxEX1BBSVIsCisKKyAgICAvLy8gTUVSR0VfVkFMVUVTIC0gVGhpcyBub2RlIHRha2VzIG11bHRpcGxlIGRpc2NyZXRlIG9wZXJhbmRzIGFuZCByZXR1cm5zCisgICAgLy8vIHRoZW0gYWxsIGFzIGl0cyBpbmRpdmlkdWFsIHJlc3VsdHMuICBUaGlzIG5vZGVzIGhhcyBleGFjdGx5IHRoZSBzYW1lCisgICAgLy8vIG51bWJlciBvZiBpbnB1dHMgYW5kIG91dHB1dHMuIFRoaXMgbm9kZSBpcyB1c2VmdWwgZm9yIHNvbWUgcGllY2VzIG9mIHRoZQorICAgIC8vLyBjb2RlIGdlbmVyYXRvciB0aGF0IHdhbnQgdG8gdGhpbmsgYWJvdXQgYSBzaW5nbGUgbm9kZSB3aXRoIG11bHRpcGxlCisgICAgLy8vIHJlc3VsdHMsIG5vdCBtdWx0aXBsZSBub2Rlcy4KKyAgICBNRVJHRV9WQUxVRVMsCisKKyAgICAvLy8gU2ltcGxlIGludGVnZXIgYmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0b3JzLgorICAgIEFERCwgU1VCLCBNVUwsIFNESVYsIFVESVYsIFNSRU0sIFVSRU0sCisKKyAgICAvLy8gU01VTF9MT0hJL1VNVUxfTE9ISSAtIE11bHRpcGx5IHR3byBpbnRlZ2VycyBvZiB0eXBlIGlOLCBwcm9kdWNpbmcKKyAgICAvLy8gYSBzaWduZWQvdW5zaWduZWQgdmFsdWUgb2YgdHlwZSBpWzIqTl0sIGFuZCByZXR1cm4gdGhlIGZ1bGwgdmFsdWUgYXMKKyAgICAvLy8gdHdvIHJlc3VsdHMsIGVhY2ggb2YgdHlwZSBpTi4KKyAgICBTTVVMX0xPSEksIFVNVUxfTE9ISSwKKworICAgIC8vLyBTRElWUkVNL1VESVZSRU0gLSBEaXZpZGUgdHdvIGludGVnZXJzIGFuZCBwcm9kdWNlIGJvdGggYSBxdW90aWVudCBhbmQKKyAgICAvLy8gcmVtYWluZGVyIHJlc3VsdC4KKyAgICBTRElWUkVNLCBVRElWUkVNLAorCisgICAgLy8vIENBUlJZX0ZBTFNFIC0gVGhpcyBub2RlIGlzIHVzZWQgd2hlbiBmb2xkaW5nIG90aGVyIG5vZGVzLAorICAgIC8vLyBsaWtlIEFEREMvU1VCQywgd2hpY2ggaW5kaWNhdGUgdGhlIGNhcnJ5IHJlc3VsdCBpcyBhbHdheXMgZmFsc2UuCisgICAgQ0FSUllfRkFMU0UsCisKKyAgICAvLy8gQ2Fycnktc2V0dGluZyBub2RlcyBmb3IgbXVsdGlwbGUgcHJlY2lzaW9uIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbi4KKyAgICAvLy8gVGhlc2Ugbm9kZXMgdGFrZSB0d28gb3BlcmFuZHMgb2YgdGhlIHNhbWUgdmFsdWUgdHlwZSwgYW5kIHByb2R1Y2UgdHdvCisgICAgLy8vIHJlc3VsdHMuICBUaGUgZmlyc3QgcmVzdWx0IGlzIHRoZSBub3JtYWwgYWRkIG9yIHN1YiByZXN1bHQsIHRoZSBzZWNvbmQKKyAgICAvLy8gcmVzdWx0IGlzIHRoZSBjYXJyeSBmbGFnIHJlc3VsdC4KKyAgICAvLy8gRklYTUU6IFRoZXNlIG5vZGVzIGFyZSBkZXByZWNhdGVkIGluIGZhdm9yIG9mIEFERENBUlJZIGFuZCBTVUJDQVJSWS4KKyAgICAvLy8gVGhleSBhcmUga2VwdCBhcm91bmQgZm9yIG5vdyB0byBwcm92aWRlIGEgc21vb3RoIHRyYW5zaXRpb24gcGF0aAorICAgIC8vLyB0b3dhcmQgdGhlIHVzZSBvZiBBRERDQVJSWS9TVUJDQVJSWSBhbmQgd2lsbCBldmVudHVhbGx5IGJlIHJlbW92ZWQuCisgICAgQUREQywgU1VCQywKKworICAgIC8vLyBDYXJyeS11c2luZyBub2RlcyBmb3IgbXVsdGlwbGUgcHJlY2lzaW9uIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbi4gVGhlc2UKKyAgICAvLy8gbm9kZXMgdGFrZSB0aHJlZSBvcGVyYW5kczogVGhlIGZpcnN0IHR3byBhcmUgdGhlIG5vcm1hbCBsaHMgYW5kIHJocyB0bworICAgIC8vLyB0aGUgYWRkIG9yIHN1YiwgYW5kIHRoZSB0aGlyZCBpcyB0aGUgaW5wdXQgY2FycnkgZmxhZy4gIFRoZXNlIG5vZGVzCisgICAgLy8vIHByb2R1Y2UgdHdvIHJlc3VsdHM7IHRoZSBub3JtYWwgcmVzdWx0IG9mIHRoZSBhZGQgb3Igc3ViLCBhbmQgdGhlIG91dHB1dAorICAgIC8vLyBjYXJyeSBmbGFnLiAgVGhlc2Ugbm9kZXMgYm90aCByZWFkIGFuZCB3cml0ZSBhIGNhcnJ5IGZsYWcgdG8gYWxsb3cgdGhlbQorICAgIC8vLyB0byB0aGVtIHRvIGJlIGNoYWluZWQgdG9nZXRoZXIgZm9yIGFkZCBhbmQgc3ViIG9mIGFyYml0cmFyaWx5IGxhcmdlCisgICAgLy8vIHZhbHVlcy4KKyAgICBBRERFLCBTVUJFLAorCisgICAgLy8vIENhcnJ5LXVzaW5nIG5vZGVzIGZvciBtdWx0aXBsZSBwcmVjaXNpb24gYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uLgorICAgIC8vLyBUaGVzZSBub2RlcyB0YWtlIHRocmVlIG9wZXJhbmRzOiBUaGUgZmlyc3QgdHdvIGFyZSB0aGUgbm9ybWFsIGxocyBhbmQKKyAgICAvLy8gcmhzIHRvIHRoZSBhZGQgb3Igc3ViLCBhbmQgdGhlIHRoaXJkIGlzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZXJlCisgICAgLy8vIGlzIGFuIGluY29taW5nIGNhcnJ5LiBUaGVzZSBub2RlcyBwcm9kdWNlIHR3byByZXN1bHRzOiB0aGUgbm9ybWFsCisgICAgLy8vIHJlc3VsdCBvZiB0aGUgYWRkIG9yIHN1YiwgYW5kIHRoZSBvdXRwdXQgY2Fycnkgc28gdGhleSBjYW4gYmUgY2hhaW5lZAorICAgIC8vLyB0b2dldGhlci4gVGhlIHVzZSBvZiB0aGlzIG9wY29kZSBpcyBwcmVmZXJhYmxlIHRvIGFkZGUvc3ViZSBpZiB0aGUKKyAgICAvLy8gdGFyZ2V0IHN1cHBvcnRzIGl0LCBhcyB0aGUgY2FycnkgaXMgYSByZWd1bGFyIHZhbHVlIHJhdGhlciB0aGFuIGEKKyAgICAvLy8gZ2x1ZSwgd2hpY2ggYWxsb3dzIGZ1cnRoZXIgb3B0aW1pc2F0aW9uLgorICAgIEFERENBUlJZLCBTVUJDQVJSWSwKKworICAgIC8vLyBSRVNVTFQsIEJPT0wgPSBbU1VdQURETyhMSFMsIFJIUykgLSBPdmVyZmxvdy1hd2FyZSBub2RlcyBmb3IgYWRkaXRpb24uCisgICAgLy8vIFRoZXNlIG5vZGVzIHRha2UgdHdvIG9wZXJhbmRzOiB0aGUgbm9ybWFsIExIUyBhbmQgUkhTIHRvIHRoZSBhZGQuIFRoZXkKKyAgICAvLy8gcHJvZHVjZSB0d28gcmVzdWx0czogdGhlIG5vcm1hbCByZXN1bHQgb2YgdGhlIGFkZCwgYW5kIGEgYm9vbGVhbiB0aGF0CisgICAgLy8vIGluZGljYXRlcyBpZiBhbiBvdmVyZmxvdyBvY2N1cnJlZCAoKm5vdCogYSBmbGFnLCBiZWNhdXNlIGl0IG1heSBiZSBzdG9yZQorICAgIC8vLyB0byBtZW1vcnksIGV0Yy4pLiAgSWYgdGhlIHR5cGUgb2YgdGhlIGJvb2xlYW4gaXMgbm90IGkxIHRoZW4gdGhlIGhpZ2gKKyAgICAvLy8gYml0cyBjb25mb3JtIHRvIGdldEJvb2xlYW5Db250ZW50cy4KKyAgICAvLy8gVGhlc2Ugbm9kZXMgYXJlIGdlbmVyYXRlZCBmcm9tIGxsdm0uW3N1XWFkZC53aXRoLm92ZXJmbG93IGludHJpbnNpY3MuCisgICAgU0FERE8sIFVBRERPLAorCisgICAgLy8vIFNhbWUgZm9yIHN1YnRyYWN0aW9uLgorICAgIFNTVUJPLCBVU1VCTywKKworICAgIC8vLyBTYW1lIGZvciBtdWx0aXBsaWNhdGlvbi4KKyAgICBTTVVMTywgVU1VTE8sCisKKyAgICAvLy8gU2ltcGxlIGJpbmFyeSBmbG9hdGluZyBwb2ludCBvcGVyYXRvcnMuCisgICAgRkFERCwgRlNVQiwgRk1VTCwgRkRJViwgRlJFTSwKKworICAgIC8vLyBDb25zdHJhaW5lZCB2ZXJzaW9ucyBvZiB0aGUgYmluYXJ5IGZsb2F0aW5nIHBvaW50IG9wZXJhdG9ycy4KKyAgICAvLy8gVGhlc2Ugd2lsbCBiZSBsb3dlcmVkIHRvIHRoZSBzaW1wbGUgb3BlcmF0b3JzIGJlZm9yZSBmaW5hbCBzZWxlY3Rpb24uCisgICAgLy8vIFRoZXkgYXJlIHVzZWQgdG8gbGltaXQgb3B0aW1pemF0aW9ucyB3aGlsZSB0aGUgREFHIGlzIGJlaW5nCisgICAgLy8vIG9wdGltaXplZC4KKyAgICBTVFJJQ1RfRkFERCwgU1RSSUNUX0ZTVUIsIFNUUklDVF9GTVVMLCBTVFJJQ1RfRkRJViwgU1RSSUNUX0ZSRU0sCisgICAgU1RSSUNUX0ZNQSwKKworICAgIC8vLyBDb25zdHJhaW5lZCB2ZXJzaW9ucyBvZiBsaWJtLWVxdWl2YWxlbnQgZmxvYXRpbmcgcG9pbnQgaW50cmluc2ljcy4KKyAgICAvLy8gVGhlc2Ugd2lsbCBiZSBsb3dlcmVkIHRvIHRoZSBlcXVpdmFsZW50IG5vbi1jb25zdHJhaW5lZCBwc2V1ZG8tb3AKKyAgICAvLy8gKG9yIGV4cGFuZGVkIHRvIHRoZSBlcXVpdmFsZW50IGxpYnJhcnkgY2FsbCkgYmVmb3JlIGZpbmFsIHNlbGVjdGlvbi4KKyAgICAvLy8gVGhleSBhcmUgdXNlZCB0byBsaW1pdCBvcHRpbWl6YXRpb25zIHdoaWxlIHRoZSBEQUcgaXMgYmVpbmcgb3B0aW1pemVkLgorICAgIFNUUklDVF9GU1FSVCwgU1RSSUNUX0ZQT1csIFNUUklDVF9GUE9XSSwgU1RSSUNUX0ZTSU4sIFNUUklDVF9GQ09TLAorICAgIFNUUklDVF9GRVhQLCBTVFJJQ1RfRkVYUDIsIFNUUklDVF9GTE9HLCBTVFJJQ1RfRkxPRzEwLCBTVFJJQ1RfRkxPRzIsCisgICAgU1RSSUNUX0ZSSU5ULCBTVFJJQ1RfRk5FQVJCWUlOVCwKKworICAgIC8vLyBGTUEgLSBQZXJmb3JtIGEgKiBiICsgYyB3aXRoIG5vIGludGVybWVkaWF0ZSByb3VuZGluZyBzdGVwLgorICAgIEZNQSwKKworICAgIC8vLyBGTUFEIC0gUGVyZm9ybSBhICogYiArIGMsIHdoaWxlIGdldHRpbmcgdGhlIHNhbWUgcmVzdWx0IGFzIHRoZQorICAgIC8vLyBzZXBhcmF0ZWx5IHJvdW5kZWQgb3BlcmF0aW9ucy4KKyAgICBGTUFELAorCisgICAgLy8vIEZDT1BZU0lHTihYLCBZKSAtIFJldHVybiB0aGUgdmFsdWUgb2YgWCB3aXRoIHRoZSBzaWduIG9mIFkuICBOT1RFOiBUaGlzCisgICAgLy8vIERBRyBub2RlIGRvZXMgbm90IHJlcXVpcmUgdGhhdCBYIGFuZCBZIGhhdmUgdGhlIHNhbWUgdHlwZSwganVzdCB0aGF0CisgICAgLy8vIHRoZXkgYXJlIGJvdGggZmxvYXRpbmcgcG9pbnQuICBYIGFuZCB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlLgorICAgIC8vLyBGQ09QWVNJR04oZjMyLCBmNjQpIGlzIGFsbG93ZWQuCisgICAgRkNPUFlTSUdOLAorCisgICAgLy8vIElOVCA9IEZHRVRTSUdOKEZQKSAtIFJldHVybiB0aGUgc2lnbiBiaXQgb2YgdGhlIHNwZWNpZmllZCBmbG9hdGluZyBwb2ludAorICAgIC8vLyB2YWx1ZSBhcyBhbiBpbnRlZ2VyIDAvMSB2YWx1ZS4KKyAgICBGR0VUU0lHTiwKKworICAgIC8vLyBSZXR1cm5zIHBsYXRmb3JtIHNwZWNpZmljIGNhbm9uaWNhbCBlbmNvZGluZyBvZiBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4KKyAgICBGQ0FOT05JQ0FMSVpFLAorCisgICAgLy8vIEJVSUxEX1ZFQ1RPUihFTFQwLCBFTFQxLCBFTFQyLCBFTFQzLC4uLikgLSBSZXR1cm4gYSB2ZWN0b3Igd2l0aCB0aGUKKyAgICAvLy8gc3BlY2lmaWVkLCBwb3NzaWJseSB2YXJpYWJsZSwgZWxlbWVudHMuICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGlzCisgICAgLy8vIHJlcXVpcmVkIHRvIGJlIGEgcG93ZXIgb2YgdHdvLiAgVGhlIHR5cGVzIG9mIHRoZSBvcGVyYW5kcyBtdXN0IGFsbCBiZQorICAgIC8vLyB0aGUgc2FtZSBhbmQgbXVzdCBtYXRjaCB0aGUgdmVjdG9yIGVsZW1lbnQgdHlwZSwgZXhjZXB0IHRoYXQgaW50ZWdlcgorICAgIC8vLyB0eXBlcyBhcmUgYWxsb3dlZCB0byBiZSBsYXJnZXIgdGhhbiB0aGUgZWxlbWVudCB0eXBlLCBpbiB3aGljaCBjYXNlCisgICAgLy8vIHRoZSBvcGVyYW5kcyBhcmUgaW1wbGljaXRseSB0cnVuY2F0ZWQuCisgICAgQlVJTERfVkVDVE9SLAorCisgICAgLy8vIElOU0VSVF9WRUNUT1JfRUxUKFZFQ1RPUiwgVkFMLCBJRFgpIC0gUmV0dXJucyBWRUNUT1Igd2l0aCB0aGUgZWxlbWVudAorICAgIC8vLyBhdCBJRFggcmVwbGFjZWQgd2l0aCBWQUwuICBJZiB0aGUgdHlwZSBvZiBWQUwgaXMgbGFyZ2VyIHRoYW4gdGhlIHZlY3RvcgorICAgIC8vLyBlbGVtZW50IHR5cGUgdGhlbiBWQUwgaXMgdHJ1bmNhdGVkIGJlZm9yZSByZXBsYWNlbWVudC4KKyAgICBJTlNFUlRfVkVDVE9SX0VMVCwKKworICAgIC8vLyBFWFRSQUNUX1ZFQ1RPUl9FTFQoVkVDVE9SLCBJRFgpIC0gUmV0dXJucyBhIHNpbmdsZSBlbGVtZW50IGZyb20gVkVDVE9SCisgICAgLy8vIGlkZW50aWZpZWQgYnkgdGhlIChwb3RlbnRpYWxseSB2YXJpYWJsZSkgZWxlbWVudCBudW1iZXIgSURYLiAgSWYgdGhlCisgICAgLy8vIHJldHVybiB0eXBlIGlzIGFuIGludGVnZXIgdHlwZSBsYXJnZXIgdGhhbiB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZQorICAgIC8vLyB2ZWN0b3IsIHRoZSByZXN1bHQgaXMgZXh0ZW5kZWQgdG8gdGhlIHdpZHRoIG9mIHRoZSByZXR1cm4gdHlwZS4gSW4KKyAgICAvLy8gdGhhdCBjYXNlLCB0aGUgaGlnaCBiaXRzIGFyZSB1bmRlZmluZWQuCisgICAgRVhUUkFDVF9WRUNUT1JfRUxULAorCisgICAgLy8vIENPTkNBVF9WRUNUT1JTKFZFQ1RPUjAsIFZFQ1RPUjEsIC4uLikgLSBHaXZlbiBhIG51bWJlciBvZiB2YWx1ZXMgb2YKKyAgICAvLy8gdmVjdG9yIHR5cGUgd2l0aCB0aGUgc2FtZSBsZW5ndGggYW5kIGVsZW1lbnQgdHlwZSwgdGhpcyBwcm9kdWNlcyBhCisgICAgLy8vIGNvbmNhdGVuYXRlZCB2ZWN0b3IgcmVzdWx0IHZhbHVlLCB3aXRoIGxlbmd0aCBlcXVhbCB0byB0aGUgc3VtIG9mIHRoZQorICAgIC8vLyBsZW5ndGhzIG9mIHRoZSBpbnB1dCB2ZWN0b3JzLgorICAgIENPTkNBVF9WRUNUT1JTLAorCisgICAgLy8vIElOU0VSVF9TVUJWRUNUT1IoVkVDVE9SMSwgVkVDVE9SMiwgSURYKSAtIFJldHVybnMgYSB2ZWN0b3IKKyAgICAvLy8gd2l0aCBWRUNUT1IyIGluc2VydGVkIGludG8gVkVDVE9SMSBhdCB0aGUgKHBvdGVudGlhbGx5CisgICAgLy8vIHZhcmlhYmxlKSBlbGVtZW50IG51bWJlciBJRFgsIHdoaWNoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUKKyAgICAvLy8gVkVDVE9SMiB2ZWN0b3IgbGVuZ3RoLiAgVGhlIGVsZW1lbnRzIG9mIFZFQ1RPUjEgc3RhcnRpbmcgYXQKKyAgICAvLy8gSURYIGFyZSBvdmVyd3JpdHRlbiB3aXRoIFZFQ1RPUjIuICBFbGVtZW50cyBJRFggdGhyb3VnaAorICAgIC8vLyB2ZWN0b3JfbGVuZ3RoKFZFQ1RPUjIpIG11c3QgYmUgdmFsaWQgVkVDVE9SMSBpbmRpY2VzLgorICAgIElOU0VSVF9TVUJWRUNUT1IsCisKKyAgICAvLy8gRVhUUkFDVF9TVUJWRUNUT1IoVkVDVE9SLCBJRFgpIC0gUmV0dXJucyBhIHN1YnZlY3RvciBmcm9tIFZFQ1RPUiAoYW4KKyAgICAvLy8gdmVjdG9yIHZhbHVlKSBzdGFydGluZyB3aXRoIHRoZSBlbGVtZW50IG51bWJlciBJRFgsIHdoaWNoIG11c3QgYmUgYQorICAgIC8vLyBjb25zdGFudCBtdWx0aXBsZSBvZiB0aGUgcmVzdWx0IHZlY3RvciBsZW5ndGguCisgICAgRVhUUkFDVF9TVUJWRUNUT1IsCisKKyAgICAvLy8gVkVDVE9SX1NIVUZGTEUoVkVDMSwgVkVDMikgLSBSZXR1cm5zIGEgdmVjdG9yLCBvZiB0aGUgc2FtZSB0eXBlIGFzCisgICAgLy8vIFZFQzEvVkVDMi4gIEEgVkVDVE9SX1NIVUZGTEUgbm9kZSBhbHNvIGNvbnRhaW5zIGFuIGFycmF5IG9mIGNvbnN0YW50IGludAorICAgIC8vLyB2YWx1ZXMgdGhhdCBpbmRpY2F0ZSB3aGljaCB2YWx1ZSAob3IgdW5kZWYpIGVhY2ggcmVzdWx0IGVsZW1lbnQgd2lsbAorICAgIC8vLyBnZXQuICBUaGVzZSBjb25zdGFudCBpbnRzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlCisgICAgLy8vIFNodWZmbGVWZWN0b3JTRE5vZGUgY2xhc3MuICBUaGlzIGlzIHF1aXRlIHNpbWlsYXIgdG8gdGhlIEFsdGl2ZWMKKyAgICAvLy8gJ3ZwZXJtJyBpbnN0cnVjdGlvbiwgZXhjZXB0IHRoYXQgdGhlIGluZGljZXMgbXVzdCBiZSBjb25zdGFudHMgYW5kIGFyZQorICAgIC8vLyBpbiB0ZXJtcyBvZiB0aGUgZWxlbWVudCBzaXplIG9mIFZFQzEvVkVDMiwgbm90IGluIHRlcm1zIG9mIGJ5dGVzLgorICAgIFZFQ1RPUl9TSFVGRkxFLAorCisgICAgLy8vIFNDQUxBUl9UT19WRUNUT1IoVkFMKSAtIFRoaXMgcmVwcmVzZW50cyB0aGUgb3BlcmF0aW9uIG9mIGxvYWRpbmcgYQorICAgIC8vLyBzY2FsYXIgdmFsdWUgaW50byBlbGVtZW50IDAgb2YgdGhlIHJlc3VsdGFudCB2ZWN0b3IgdHlwZS4gIFRoZSB0b3AKKyAgICAvLy8gZWxlbWVudHMgMSB0byBOLTEgb2YgdGhlIE4tZWxlbWVudCB2ZWN0b3IgYXJlIHVuZGVmaW5lZC4gIFRoZSB0eXBlCisgICAgLy8vIG9mIHRoZSBvcGVyYW5kIG11c3QgbWF0Y2ggdGhlIHZlY3RvciBlbGVtZW50IHR5cGUsIGV4Y2VwdCB3aGVuIHRoZXkKKyAgICAvLy8gYXJlIGludGVnZXIgdHlwZXMuICBJbiB0aGlzIGNhc2UgdGhlIG9wZXJhbmQgaXMgYWxsb3dlZCB0byBiZSB3aWRlcgorICAgIC8vLyB0aGFuIHRoZSB2ZWN0b3IgZWxlbWVudCB0eXBlLCBhbmQgaXMgaW1wbGljaXRseSB0cnVuY2F0ZWQgdG8gaXQuCisgICAgU0NBTEFSX1RPX1ZFQ1RPUiwKKworICAgIC8vLyBNVUxIVS9NVUxIUyAtIE11bHRpcGx5IGhpZ2ggLSBNdWx0aXBseSB0d28gaW50ZWdlcnMgb2YgdHlwZSBpTiwKKyAgICAvLy8gcHJvZHVjaW5nIGFuIHVuc2lnbmVkL3NpZ25lZCB2YWx1ZSBvZiB0eXBlIGlbMipOXSwgdGhlbiByZXR1cm4gdGhlIHRvcAorICAgIC8vLyBwYXJ0LgorICAgIE1VTEhVLCBNVUxIUywKKworICAgIC8vLyBbVVNde01JTi9NQVh9IC0gQmluYXJ5IG1pbmltdW0gb3IgbWF4aW11bSBvciBzaWduZWQgb3IgdW5zaWduZWQKKyAgICAvLy8gaW50ZWdlcnMuCisgICAgU01JTiwgU01BWCwgVU1JTiwgVU1BWCwKKworICAgIC8vLyBCaXR3aXNlIG9wZXJhdG9ycyAtIGxvZ2ljYWwgYW5kLCBsb2dpY2FsIG9yLCBsb2dpY2FsIHhvci4KKyAgICBBTkQsIE9SLCBYT1IsCisKKyAgICAvLy8gQUJTIC0gRGV0ZXJtaW5lIHRoZSB1bnNpZ25lZCBhYnNvbHV0ZSB2YWx1ZSBvZiBhIHNpZ25lZCBpbnRlZ2VyIHZhbHVlIG9mCisgICAgLy8vIHRoZSBzYW1lIGJpdHdpZHRoLgorICAgIC8vLyBOb3RlOiBBIHZhbHVlIG9mIElOVF9NSU4gd2lsbCByZXR1cm4gSU5UX01JTiwgbm8gc2F0dXJhdGlvbiBvciBvdmVyZmxvdworICAgIC8vLyBpcyBwZXJmb3JtZWQuCisgICAgQUJTLAorCisgICAgLy8vIFNoaWZ0IGFuZCByb3RhdGlvbiBvcGVyYXRpb25zLiAgQWZ0ZXIgbGVnYWxpemF0aW9uLCB0aGUgdHlwZSBvZiB0aGUKKyAgICAvLy8gc2hpZnQgYW1vdW50IGlzIGtub3duIHRvIGJlIFRMSS5nZXRTaGlmdEFtb3VudFR5KCkuICBCZWZvcmUgbGVnYWxpemF0aW9uCisgICAgLy8vIHRoZSBzaGlmdCBhbW91bnQgY2FuIGJlIGFueSB0eXBlLCBidXQgY2FyZSBtdXN0IGJlIHRha2VuIHRvIGVuc3VyZSBpdCBpcworICAgIC8vLyBsYXJnZSBlbm91Z2guICBUTEkuZ2V0U2hpZnRBbW91bnRUeSgpIGlzIGk4IG9uIHNvbWUgdGFyZ2V0cywgYnV0IGJlZm9yZQorICAgIC8vLyBsZWdhbGl6YXRpb24sIHR5cGVzIGxpa2UgaTEwMjQgY2FuIG9jY3VyIGFuZCBpOCBkb2Vzbid0IGhhdmUgZW5vdWdoIGJpdHMKKyAgICAvLy8gdG8gcmVwcmVzZW50IHRoZSBzaGlmdCBhbW91bnQuCisgICAgLy8vIFdoZW4gdGhlIDFzdCBvcGVyYW5kIGlzIGEgdmVjdG9yLCB0aGUgc2hpZnQgYW1vdW50IG11c3QgYmUgaW4gdGhlIHNhbWUKKyAgICAvLy8gdHlwZS4gKFRMSS5nZXRTaGlmdEFtb3VudFR5KCkgd2lsbCByZXR1cm4gdGhlIHNhbWUgdHlwZSB3aGVuIHRoZSBpbnB1dAorICAgIC8vLyB0eXBlIGlzIGEgdmVjdG9yLikKKyAgICBTSEwsIFNSQSwgU1JMLCBST1RMLCBST1RSLAorCisgICAgLy8vIEJ5dGUgU3dhcCBhbmQgQ291bnRpbmcgb3BlcmF0b3JzLgorICAgIEJTV0FQLCBDVFRaLCBDVExaLCBDVFBPUCwgQklUUkVWRVJTRSwKKworICAgIC8vLyBCaXQgY291bnRpbmcgb3BlcmF0b3JzIHdpdGggYW4gdW5kZWZpbmVkIHJlc3VsdCBmb3IgemVybyBpbnB1dHMuCisgICAgQ1RUWl9aRVJPX1VOREVGLCBDVExaX1pFUk9fVU5ERUYsCisKKyAgICAvLy8gU2VsZWN0KENPTkQsIFRSVUVWQUwsIEZBTFNFVkFMKS4gIElmIHRoZSB0eXBlIG9mIHRoZSBib29sZWFuIENPTkQgaXMgbm90CisgICAgLy8vIGkxIHRoZW4gdGhlIGhpZ2ggYml0cyBtdXN0IGNvbmZvcm0gdG8gZ2V0Qm9vbGVhbkNvbnRlbnRzLgorICAgIFNFTEVDVCwKKworICAgIC8vLyBTZWxlY3Qgd2l0aCBhIHZlY3RvciBjb25kaXRpb24gKG9wICMwKSBhbmQgdHdvIHZlY3RvciBvcGVyYW5kcyAob3BzICMxCisgICAgLy8vIGFuZCAjMiksIHJldHVybmluZyBhIHZlY3RvciByZXN1bHQuICBBbGwgdmVjdG9ycyBoYXZlIHRoZSBzYW1lIGxlbmd0aC4KKyAgICAvLy8gTXVjaCBsaWtlIHRoZSBzY2FsYXIgc2VsZWN0IGFuZCBzZXRjYywgZWFjaCBiaXQgaW4gdGhlIGNvbmRpdGlvbiBzZWxlY3RzCisgICAgLy8vIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgcmVzdWx0IGVsZW1lbnQgaXMgdGFrZW4gZnJvbSBvcCAjMSBvciBvcCAjMi4KKyAgICAvLy8gQXQgZmlyc3QsIHRoZSBWU0VMRUNUIGNvbmRpdGlvbiBpcyBvZiB2WGkxIHR5cGUuIExhdGVyLCB0YXJnZXRzIG1heQorICAgIC8vLyBjaGFuZ2UgdGhlIGNvbmRpdGlvbiB0eXBlIGluIG9yZGVyIHRvIG1hdGNoIHRoZSBWU0VMRUNUIG5vZGUgdXNpbmcgYQorICAgIC8vLyBwYXR0ZXJuLiBUaGUgY29uZGl0aW9uIGZvbGxvd3MgdGhlIEJvb2xlYW5Db250ZW50IGZvcm1hdCBvZiB0aGUgdGFyZ2V0LgorICAgIFZTRUxFQ1QsCisKKyAgICAvLy8gU2VsZWN0IHdpdGggY29uZGl0aW9uIG9wZXJhdG9yIC0gVGhpcyBzZWxlY3RzIGJldHdlZW4gYSB0cnVlIHZhbHVlIGFuZAorICAgIC8vLyBhIGZhbHNlIHZhbHVlIChvcHMgIzIgYW5kICMzKSBiYXNlZCBvbiB0aGUgYm9vbGVhbiByZXN1bHQgb2YgY29tcGFyaW5nCisgICAgLy8vIHRoZSBsaHMgYW5kIHJocyAob3BzICMwIGFuZCAjMSkgb2YgYSBjb25kaXRpb25hbCBleHByZXNzaW9uIHdpdGggdGhlCisgICAgLy8vIGNvbmRpdGlvbiBjb2RlIGluIG9wICM0LCBhIENvbmRDb2RlU0ROb2RlLgorICAgIFNFTEVDVF9DQywKKworICAgIC8vLyBTZXRDQyBvcGVyYXRvciAtIFRoaXMgZXZhbHVhdGVzIHRvIGEgdHJ1ZSB2YWx1ZSBpZmYgdGhlIGNvbmRpdGlvbiBpcworICAgIC8vLyB0cnVlLiAgSWYgdGhlIHJlc3VsdCB2YWx1ZSB0eXBlIGlzIG5vdCBpMSB0aGVuIHRoZSBoaWdoIGJpdHMgY29uZm9ybQorICAgIC8vLyB0byBnZXRCb29sZWFuQ29udGVudHMuICBUaGUgb3BlcmFuZHMgdG8gdGhpcyBhcmUgdGhlIGxlZnQgYW5kIHJpZ2h0CisgICAgLy8vIG9wZXJhbmRzIHRvIGNvbXBhcmUgKG9wcyAjMCwgYW5kICMxKSBhbmQgdGhlIGNvbmRpdGlvbiBjb2RlIHRvIGNvbXBhcmUKKyAgICAvLy8gdGhlbSB3aXRoIChvcCAjMikgYXMgYSBDb25kQ29kZVNETm9kZS4gSWYgdGhlIG9wZXJhbmRzIGFyZSB2ZWN0b3IgdHlwZXMKKyAgICAvLy8gdGhlbiB0aGUgcmVzdWx0IHR5cGUgbXVzdCBhbHNvIGJlIGEgdmVjdG9yIHR5cGUuCisgICAgU0VUQ0MsCisKKyAgICAvLy8gTGlrZSBTZXRDQywgb3BzICMwIGFuZCAjMSBhcmUgdGhlIExIUyBhbmQgUkhTIG9wZXJhbmRzIHRvIGNvbXBhcmUsIGFuZAorICAgIC8vLyBvcCAjMiBpcyBhICpjYXJyeSB2YWx1ZSouIFRoaXMgb3BlcmF0b3IgY2hlY2tzIHRoZSByZXN1bHQgb2YKKyAgICAvLy8gIkxIUyAtIFJIUyAtIENhcnJ5IiwgYW5kIGNhbiBiZSB1c2VkIHRvIGNvbXBhcmUgdHdvIHdpZGUgaW50ZWdlcnM6CisgICAgLy8vIChzZXRjY2UgbGhzaGkgcmhzaGkgKHN1YmMgbGhzbG8gcmhzbG8pIGNjKS4gT25seSB2YWxpZCBmb3IgaW50ZWdlcnMuCisgICAgLy8vIEZJWE1FOiBUaGlzIG5vZGUgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBTRVRDQ0NBUlJZLgorICAgIC8vLyBJdCBpcyBrZXB0IGFyb3VuZCBmb3Igbm93IHRvIHByb3ZpZGUgYSBzbW9vdGggdHJhbnNpdGlvbiBwYXRoCisgICAgLy8vIHRvd2FyZCB0aGUgdXNlIG9mIFNFVENDQ0FSUlkgYW5kIHdpbGwgZXZlbnR1YWxseSBiZSByZW1vdmVkLgorICAgIFNFVENDRSwKKworICAgIC8vLyBMaWtlIFNldENDLCBvcHMgIzAgYW5kICMxIGFyZSB0aGUgTEhTIGFuZCBSSFMgb3BlcmFuZHMgdG8gY29tcGFyZSwgYnV0CisgICAgLy8vIG9wICMyIGlzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZXJlIGlzIGFuIGluY29taW5nIGNhcnJ5LiBUaGlzCisgICAgLy8vIG9wZXJhdG9yIGNoZWNrcyB0aGUgcmVzdWx0IG9mICJMSFMgLSBSSFMgLSBDYXJyeSIsIGFuZCBjYW4gYmUgdXNlZCB0bworICAgIC8vLyBjb21wYXJlIHR3byB3aWRlIGludGVnZXJzOiAoc2V0Y2NlIGxoc2hpIHJoc2hpIChzdWJjIGxoc2xvIHJoc2xvKSBjYykuCisgICAgLy8vIE9ubHkgdmFsaWQgZm9yIGludGVnZXJzLgorICAgIFNFVENDQ0FSUlksCisKKyAgICAvLy8gU0hMX1BBUlRTL1NSQV9QQVJUUy9TUkxfUEFSVFMgLSBUaGVzZSBvcGVyYXRvcnMgYXJlIHVzZWQgZm9yIGV4cGFuZGVkCisgICAgLy8vIGludGVnZXIgc2hpZnQgb3BlcmF0aW9ucy4gIFRoZSBvcGVyYXRpb24gb3JkZXJpbmcgaXM6CisgICAgLy8vICAgICAgIFtMbyxIaV0gPSBvcCBbTG9MSFMsSGlMSFNdLCBBbXQKKyAgICBTSExfUEFSVFMsIFNSQV9QQVJUUywgU1JMX1BBUlRTLAorCisgICAgLy8vIENvbnZlcnNpb24gb3BlcmF0b3JzLiAgVGhlc2UgYXJlIGFsbCBzaW5nbGUgaW5wdXQgc2luZ2xlIG91dHB1dAorICAgIC8vLyBvcGVyYXRpb25zLiAgRm9yIGFsbCBvZiB0aGVzZSwgdGhlIHJlc3VsdCB0eXBlIG11c3QgYmUgc3RyaWN0bHkKKyAgICAvLy8gd2lkZXIgb3IgbmFycm93ZXIgKGRlcGVuZGluZyBvbiB0aGUgb3BlcmF0aW9uKSB0aGFuIHRoZSBzb3VyY2UKKyAgICAvLy8gdHlwZS4KKworICAgIC8vLyBTSUdOX0VYVEVORCAtIFVzZWQgZm9yIGludGVnZXIgdHlwZXMsIHJlcGxpY2F0aW5nIHRoZSBzaWduIGJpdAorICAgIC8vLyBpbnRvIG5ldyBiaXRzLgorICAgIFNJR05fRVhURU5ELAorCisgICAgLy8vIFpFUk9fRVhURU5EIC0gVXNlZCBmb3IgaW50ZWdlciB0eXBlcywgemVyb2luZyB0aGUgbmV3IGJpdHMuCisgICAgWkVST19FWFRFTkQsCisKKyAgICAvLy8gQU5ZX0VYVEVORCAtIFVzZWQgZm9yIGludGVnZXIgdHlwZXMuICBUaGUgaGlnaCBiaXRzIGFyZSB1bmRlZmluZWQuCisgICAgQU5ZX0VYVEVORCwKKworICAgIC8vLyBUUlVOQ0FURSAtIENvbXBsZXRlbHkgZHJvcCB0aGUgaGlnaCBiaXRzLgorICAgIFRSVU5DQVRFLAorCisgICAgLy8vIFtTVV1JTlRfVE9fRlAgLSBUaGVzZSBvcGVyYXRvcnMgY29udmVydCBpbnRlZ2VycyAod2hvc2UgaW50ZXJwcmV0ZWQgc2lnbgorICAgIC8vLyBkZXBlbmRzIG9uIHRoZSBmaXJzdCBsZXR0ZXIpIHRvIGZsb2F0aW5nIHBvaW50LgorICAgIFNJTlRfVE9fRlAsCisgICAgVUlOVF9UT19GUCwKKworICAgIC8vLyBTSUdOX0VYVEVORF9JTlJFRyAtIFRoaXMgb3BlcmF0b3IgYXRvbWljYWxseSBwZXJmb3JtcyBhIFNITC9TUkEgcGFpciB0bworICAgIC8vLyBzaWduIGV4dGVuZCBhIHNtYWxsIHZhbHVlIGluIGEgbGFyZ2UgaW50ZWdlciByZWdpc3RlciAoZS5nLiBzaWduCisgICAgLy8vIGV4dGVuZGluZyB0aGUgbG93IDggYml0cyBvZiBhIDMyLWJpdCByZWdpc3RlciB0byBmaWxsIHRoZSB0b3AgMjQgYml0cworICAgIC8vLyB3aXRoIHRoZSA3dGggYml0KS4gIFRoZSBzaXplIG9mIHRoZSBzbWFsbGVyIHR5cGUgaXMgaW5kaWNhdGVkIGJ5IHRoZSAxdGgKKyAgICAvLy8gb3BlcmFuZCwgYSBWYWx1ZVR5cGUgbm9kZS4KKyAgICBTSUdOX0VYVEVORF9JTlJFRywKKworICAgIC8vLyBBTllfRVhURU5EX1ZFQ1RPUl9JTlJFRyhWZWN0b3IpIC0gVGhpcyBvcGVyYXRvciByZXByZXNlbnRzIGFuCisgICAgLy8vIGluLXJlZ2lzdGVyIGFueS1leHRlbnNpb24gb2YgdGhlIGxvdyBsYW5lcyBvZiBhbiBpbnRlZ2VyIHZlY3Rvci4gVGhlCisgICAgLy8vIHJlc3VsdCB0eXBlIG11c3QgaGF2ZSBmZXdlciBlbGVtZW50cyB0aGFuIHRoZSBvcGVyYW5kIHR5cGUsIGFuZCB0aG9zZQorICAgIC8vLyBlbGVtZW50cyBtdXN0IGJlIGxhcmdlciBpbnRlZ2VyIHR5cGVzIHN1Y2ggdGhhdCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKKyAgICAvLy8gb3BlcmFuZCB0eXBlIGFuZCB0aGUgcmVzdWx0IHR5cGUgbWF0Y2guIEVhY2ggb2YgdGhlIGxvdyBvcGVyYW5kCisgICAgLy8vIGVsZW1lbnRzIGlzIGFueS1leHRlbmRlZCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nLCB3aWRlciByZXN1bHQKKyAgICAvLy8gZWxlbWVudHMgd2l0aCB0aGUgaGlnaCBiaXRzIGJlY29taW5nIHVuZGVmLgorICAgIEFOWV9FWFRFTkRfVkVDVE9SX0lOUkVHLAorCisgICAgLy8vIFNJR05fRVhURU5EX1ZFQ1RPUl9JTlJFRyhWZWN0b3IpIC0gVGhpcyBvcGVyYXRvciByZXByZXNlbnRzIGFuCisgICAgLy8vIGluLXJlZ2lzdGVyIHNpZ24tZXh0ZW5zaW9uIG9mIHRoZSBsb3cgbGFuZXMgb2YgYW4gaW50ZWdlciB2ZWN0b3IuIFRoZQorICAgIC8vLyByZXN1bHQgdHlwZSBtdXN0IGhhdmUgZmV3ZXIgZWxlbWVudHMgdGhhbiB0aGUgb3BlcmFuZCB0eXBlLCBhbmQgdGhvc2UKKyAgICAvLy8gZWxlbWVudHMgbXVzdCBiZSBsYXJnZXIgaW50ZWdlciB0eXBlcyBzdWNoIHRoYXQgdGhlIHRvdGFsIHNpemUgb2YgdGhlCisgICAgLy8vIG9wZXJhbmQgdHlwZSBhbmQgdGhlIHJlc3VsdCB0eXBlIG1hdGNoLiBFYWNoIG9mIHRoZSBsb3cgb3BlcmFuZAorICAgIC8vLyBlbGVtZW50cyBpcyBzaWduLWV4dGVuZGVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcsIHdpZGVyIHJlc3VsdAorICAgIC8vLyBlbGVtZW50cy4KKyAgICAvLyBGSVhNRTogVGhlIFNJR05fRVhURU5EX0lOUkVHIG5vZGUgaXNuJ3Qgc3BlY2lmaWNhbGx5IGxpbWl0ZWQgdG8KKyAgICAvLyBzY2FsYXJzLCBidXQgaXQgYWxzbyBkb2Vzbid0IGhhbmRsZSB2ZWN0b3JzIHdlbGwuIEVpdGhlciBpdCBzaG91bGQgYmUKKyAgICAvLyByZXN0cmljdGVkIHRvIHNjYWxhcnMgb3IgdGhpcyBub2RlIChhbmQgaXRzIGhhbmRsaW5nKSBzaG91bGQgYmUgbWVyZ2VkCisgICAgLy8gaW50byBpdC4KKyAgICBTSUdOX0VYVEVORF9WRUNUT1JfSU5SRUcsCisKKyAgICAvLy8gWkVST19FWFRFTkRfVkVDVE9SX0lOUkVHKFZlY3RvcikgLSBUaGlzIG9wZXJhdG9yIHJlcHJlc2VudHMgYW4KKyAgICAvLy8gaW4tcmVnaXN0ZXIgemVyby1leHRlbnNpb24gb2YgdGhlIGxvdyBsYW5lcyBvZiBhbiBpbnRlZ2VyIHZlY3Rvci4gVGhlCisgICAgLy8vIHJlc3VsdCB0eXBlIG11c3QgaGF2ZSBmZXdlciBlbGVtZW50cyB0aGFuIHRoZSBvcGVyYW5kIHR5cGUsIGFuZCB0aG9zZQorICAgIC8vLyBlbGVtZW50cyBtdXN0IGJlIGxhcmdlciBpbnRlZ2VyIHR5cGVzIHN1Y2ggdGhhdCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKKyAgICAvLy8gb3BlcmFuZCB0eXBlIGFuZCB0aGUgcmVzdWx0IHR5cGUgbWF0Y2guIEVhY2ggb2YgdGhlIGxvdyBvcGVyYW5kCisgICAgLy8vIGVsZW1lbnRzIGlzIHplcm8tZXh0ZW5kZWQgaW50byB0aGUgY29ycmVzcG9uZGluZywgd2lkZXIgcmVzdWx0CisgICAgLy8vIGVsZW1lbnRzLgorICAgIFpFUk9fRVhURU5EX1ZFQ1RPUl9JTlJFRywKKworICAgIC8vLyBGUF9UT19bVVNdSU5UIC0gQ29udmVydCBhIGZsb2F0aW5nIHBvaW50IHZhbHVlIHRvIGEgc2lnbmVkIG9yIHVuc2lnbmVkCisgICAgLy8vIGludGVnZXIuCisgICAgRlBfVE9fU0lOVCwKKyAgICBGUF9UT19VSU5ULAorCisgICAgLy8vIFggPSBGUF9ST1VORChZLCBUUlVOQykgLSBSb3VuZGluZyAnWScgZnJvbSBhIGxhcmdlciBmbG9hdGluZyBwb2ludCB0eXBlCisgICAgLy8vIGRvd24gdG8gdGhlIHByZWNpc2lvbiBvZiB0aGUgZGVzdGluYXRpb24gVlQuICBUUlVOQyBpcyBhIGZsYWcsIHdoaWNoIGlzCisgICAgLy8vIGFsd2F5cyBhbiBpbnRlZ2VyIHRoYXQgaXMgemVybyBvciBvbmUuICBJZiBUUlVOQyBpcyAwLCB0aGlzIGlzIGEKKyAgICAvLy8gbm9ybWFsIHJvdW5kaW5nLCBpZiBpdCBpcyAxLCB0aGlzIEZQX1JPVU5EIGlzIGtub3duIHRvIG5vdCBjaGFuZ2UgdGhlCisgICAgLy8vIHZhbHVlIG9mIFkuCisgICAgLy8vCisgICAgLy8vIFRoZSBUUlVOQyA9IDEgY2FzZSBpcyB1c2VkIGluIGNhc2VzIHdoZXJlIHdlIGtub3cgdGhhdCB0aGUgdmFsdWUgd2lsbAorICAgIC8vLyBub3QgYmUgbW9kaWZpZWQgYnkgdGhlIG5vZGUsIGJlY2F1c2UgWSBpcyBub3QgdXNpbmcgYW55IG9mIHRoZSBleHRyYQorICAgIC8vLyBwcmVjaXNpb24gb2Ygc291cmNlIHR5cGUuICBUaGlzIGFsbG93cyBjZXJ0YWluIHRyYW5zZm9ybWF0aW9ucyBsaWtlCisgICAgLy8vIEZQX0VYVEVORChGUF9ST1VORChYLDEpKSAtPiBYIHdoaWNoIGFyZSBub3Qgc2FmZSBmb3IKKyAgICAvLy8gRlBfRVhURU5EKEZQX1JPVU5EKFgsMCkpIGJlY2F1c2UgdGhlIGV4dHJhIGJpdHMgYXJlbid0IHJlbW92ZWQuCisgICAgRlBfUk9VTkQsCisKKyAgICAvLy8gRkxUX1JPVU5EU18gLSBSZXR1cm5zIGN1cnJlbnQgcm91bmRpbmcgbW9kZToKKyAgICAvLy8gLTEgVW5kZWZpbmVkCisgICAgLy8vICAwIFJvdW5kIHRvIDAKKyAgICAvLy8gIDEgUm91bmQgdG8gbmVhcmVzdAorICAgIC8vLyAgMiBSb3VuZCB0byAraW5mCisgICAgLy8vICAzIFJvdW5kIHRvIC1pbmYKKyAgICBGTFRfUk9VTkRTXywKKworICAgIC8vLyBYID0gRlBfUk9VTkRfSU5SRUcoWSwgVlQpIC0gVGhpcyBvcGVyYXRvciB0YWtlcyBhbiBGUCByZWdpc3RlciwgYW5kCisgICAgLy8vIHJvdW5kcyBpdCB0byBhIGZsb2F0aW5nIHBvaW50IHZhbHVlLiAgSXQgdGhlbiBwcm9tb3RlcyBpdCBhbmQgcmV0dXJucyBpdAorICAgIC8vLyBpbiBhIHJlZ2lzdGVyIG9mIHRoZSBzYW1lIHNpemUuICBUaGlzIG9wZXJhdGlvbiBlZmZlY3RpdmVseSBqdXN0CisgICAgLy8vIGRpc2NhcmRzIGV4Y2VzcyBwcmVjaXNpb24uICBUaGUgdHlwZSB0byByb3VuZCBkb3duIHRvIGlzIHNwZWNpZmllZCBieQorICAgIC8vLyB0aGUgVlQgb3BlcmFuZCwgYSBWVFNETm9kZS4KKyAgICBGUF9ST1VORF9JTlJFRywKKworICAgIC8vLyBYID0gRlBfRVhURU5EKFkpIC0gRXh0ZW5kIGEgc21hbGxlciBGUCB0eXBlIGludG8gYSBsYXJnZXIgRlAgdHlwZS4KKyAgICBGUF9FWFRFTkQsCisKKyAgICAvLy8gQklUQ0FTVCAtIFRoaXMgb3BlcmF0b3IgY29udmVydHMgYmV0d2VlbiBpbnRlZ2VyLCB2ZWN0b3IgYW5kIEZQCisgICAgLy8vIHZhbHVlcywgYXMgaWYgdGhlIHZhbHVlIHdhcyBzdG9yZWQgdG8gbWVtb3J5IHdpdGggb25lIHR5cGUgYW5kIGxvYWRlZAorICAgIC8vLyBmcm9tIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aCB0aGUgb3RoZXIgdHlwZSAob3IgZXF1aXZhbGVudGx5IGZvciB2ZWN0b3IKKyAgICAvLy8gZm9ybWF0IGNvbnZlcnNpb25zLCBldGMpLiAgVGhlIHNvdXJjZSBhbmQgcmVzdWx0IGFyZSByZXF1aXJlZCB0byBoYXZlCisgICAgLy8vIHRoZSBzYW1lIGJpdCBzaXplIChlLmcuICBmMzIgPC0+IGkzMikuICBUaGlzIGNhbiBhbHNvIGJlIHVzZWQgZm9yCisgICAgLy8vIGludC10by1pbnQgb3IgZnAtdG8tZnAgY29udmVyc2lvbnMsIGJ1dCB0aGF0IGlzIGEgbm9vcCwgZGVsZXRlZCBieQorICAgIC8vLyBnZXROb2RlKCkuCisgICAgLy8vCisgICAgLy8vIFRoaXMgb3BlcmF0b3IgaXMgc3VidGx5IGRpZmZlcmVudCBmcm9tIHRoZSBiaXRjYXN0IGluc3RydWN0aW9uIGZyb20KKyAgICAvLy8gTExWTS1JUiBzaW5jZSB0aGlzIG5vZGUgbWF5IGNoYW5nZSB0aGUgYml0cyBpbiB0aGUgcmVnaXN0ZXIuIEZvcgorICAgIC8vLyBleGFtcGxlLCB0aGlzIG9jY3VycyBvbiBiaWctZW5kaWFuIE5FT04gYW5kIGJpZy1lbmRpYW4gTVNBIHdoZXJlIHRoZQorICAgIC8vLyBsYXlvdXQgb2YgdGhlIGJpdHMgaW4gdGhlIHJlZ2lzdGVyIGRlcGVuZHMgb24gdGhlIHZlY3RvciB0eXBlIGFuZCB0aGlzCisgICAgLy8vIG9wZXJhdG9yIGFjdHMgYXMgYSBzaHVmZmxlIG9wZXJhdGlvbiBmb3Igc29tZSB2ZWN0b3IgdHlwZSBjb21iaW5hdGlvbnMuCisgICAgQklUQ0FTVCwKKworICAgIC8vLyBBRERSU1BBQ0VDQVNUIC0gVGhpcyBvcGVyYXRvciBjb252ZXJ0cyBiZXR3ZWVuIHBvaW50ZXJzIG9mIGRpZmZlcmVudAorICAgIC8vLyBhZGRyZXNzIHNwYWNlcy4KKyAgICBBRERSU1BBQ0VDQVNULAorCisgICAgLy8vIEZQMTZfVE9fRlAsIEZQX1RPX0ZQMTYgLSBUaGVzZSBvcGVyYXRvcnMgYXJlIHVzZWQgdG8gcGVyZm9ybSBwcm9tb3Rpb25zCisgICAgLy8vIGFuZCB0cnVuY2F0aW9uIGZvciBoYWxmLXByZWNpc2lvbiAoMTYgYml0KSBmbG9hdGluZyBudW1iZXJzLiBUaGVzZSBub2RlcworICAgIC8vLyBmb3JtIGEgc2VtaS1zb2Z0ZW5lZCBpbnRlcmZhY2UgZm9yIGRlYWxpbmcgd2l0aCBmMTYgKGFzIGFuIGkxNiksIHdoaWNoCisgICAgLy8vIGlzIG9mdGVuIGEgc3RvcmFnZS1vbmx5IHR5cGUgYnV0IGhhcyBuYXRpdmUgY29udmVyc2lvbnMuCisgICAgRlAxNl9UT19GUCwgRlBfVE9fRlAxNiwKKworICAgIC8vLyBGTkVHLCBGQUJTLCBGU1FSVCwgRlNJTiwgRkNPUywgRlBPV0ksIEZQT1csCisgICAgLy8vIEZMT0csIEZMT0cyLCBGTE9HMTAsIEZFWFAsIEZFWFAyLAorICAgIC8vLyBGQ0VJTCwgRlRSVU5DLCBGUklOVCwgRk5FQVJCWUlOVCwgRlJPVU5ELCBGRkxPT1IgLSBQZXJmb3JtIHZhcmlvdXMgdW5hcnkKKyAgICAvLy8gZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucy4gVGhlc2UgYXJlIGluc3BpcmVkIGJ5IGxpYm0uCisgICAgRk5FRywgRkFCUywgRlNRUlQsIEZTSU4sIEZDT1MsIEZQT1dJLCBGUE9XLAorICAgIEZMT0csIEZMT0cyLCBGTE9HMTAsIEZFWFAsIEZFWFAyLAorICAgIEZDRUlMLCBGVFJVTkMsIEZSSU5ULCBGTkVBUkJZSU5ULCBGUk9VTkQsIEZGTE9PUiwKKyAgICAvLy8gRk1JTk5VTS9GTUFYTlVNIC0gUGVyZm9ybSBmbG9hdGluZy1wb2ludCBtaW5pbXVtIG9yIG1heGltdW0gb24gdHdvCisgICAgLy8vIHZhbHVlcy4KKyAgICAvLy8gSW4gdGhlIGNhc2Ugd2hlcmUgYSBzaW5nbGUgaW5wdXQgaXMgTmFOLCB0aGUgbm9uLU5hTiBpbnB1dCBpcyByZXR1cm5lZC4KKyAgICAvLy8KKyAgICAvLy8gVGhlIHJldHVybiB2YWx1ZSBvZiAoRk1JTk5VTSAwLjAsIC0wLjApIGNvdWxkIGJlIGVpdGhlciAwLjAgb3IgLTAuMC4KKyAgICBGTUlOTlVNLCBGTUFYTlVNLAorICAgIC8vLyBGTUlOTkFOL0ZNQVhOQU4gLSBCZWhhdmUgaWRlbnRpY2FsbHkgdG8gRk1JTk5VTS9GTUFYTlVNLCBleGNlcHQgdGhhdAorICAgIC8vLyB3aGVuIGEgc2luZ2xlIGlucHV0IGlzIE5hTiwgTmFOIGlzIHJldHVybmVkLgorICAgIEZNSU5OQU4sIEZNQVhOQU4sCisKKyAgICAvLy8gRlNJTkNPUyAtIENvbXB1dGUgYm90aCBmc2luIGFuZCBmY29zIGFzIGEgc2luZ2xlIG9wZXJhdGlvbi4KKyAgICBGU0lOQ09TLAorCisgICAgLy8vIExPQUQgYW5kIFNUT1JFIGhhdmUgdG9rZW4gY2hhaW5zIGFzIHRoZWlyIGZpcnN0IG9wZXJhbmQsIHRoZW4gdGhlIHNhbWUKKyAgICAvLy8gb3BlcmFuZHMgYXMgYW4gTExWTSBsb2FkL3N0b3JlIGluc3RydWN0aW9uLCB0aGVuIGFuIG9mZnNldCBub2RlIHRoYXQKKyAgICAvLy8gaXMgYWRkZWQgLyBzdWJ0cmFjdGVkIGZyb20gdGhlIGJhc2UgcG9pbnRlciB0byBmb3JtIHRoZSBhZGRyZXNzIChmb3IKKyAgICAvLy8gaW5kZXhlZCBtZW1vcnkgb3BzKS4KKyAgICBMT0FELCBTVE9SRSwKKworICAgIC8vLyBEWU5BTUlDX1NUQUNLQUxMT0MgLSBBbGxvY2F0ZSBzb21lIG51bWJlciBvZiBieXRlcyBvbiB0aGUgc3RhY2sgYWxpZ25lZAorICAgIC8vLyB0byBhIHNwZWNpZmllZCBib3VuZGFyeS4gIFRoaXMgbm9kZSBhbHdheXMgaGFzIHR3byByZXR1cm4gdmFsdWVzOiBhIG5ldworICAgIC8vLyBzdGFjayBwb2ludGVyIHZhbHVlIGFuZCBhIGNoYWluLiBUaGUgZmlyc3Qgb3BlcmFuZCBpcyB0aGUgdG9rZW4gY2hhaW4sCisgICAgLy8vIHRoZSBzZWNvbmQgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZSwgYW5kIHRoZSB0aGlyZCBpcyB0aGUKKyAgICAvLy8gYWxpZ25tZW50IGJvdW5kYXJ5LiAgVGhlIHNpemUgaXMgZ3VhcmFudGVlZCB0byBiZSBhIG11bHRpcGxlIG9mIHRoZQorICAgIC8vLyBzdGFjayBhbGlnbm1lbnQsIGFuZCB0aGUgYWxpZ25tZW50IGlzIGd1YXJhbnRlZWQgdG8gYmUgYmlnZ2VyIHRoYW4gdGhlCisgICAgLy8vIHN0YWNrIGFsaWdubWVudCAoaWYgcmVxdWlyZWQpIG9yIDAgdG8gZ2V0IHN0YW5kYXJkIHN0YWNrIGFsaWdubWVudC4KKyAgICBEWU5BTUlDX1NUQUNLQUxMT0MsCisKKyAgICAvLy8gQ29udHJvbCBmbG93IGluc3RydWN0aW9ucy4gIFRoZXNlIGFsbCBoYXZlIHRva2VuIGNoYWlucy4KKworICAgIC8vLyBCUiAtIFVuY29uZGl0aW9uYWwgYnJhbmNoLiAgVGhlIGZpcnN0IG9wZXJhbmQgaXMgdGhlIGNoYWluCisgICAgLy8vIG9wZXJhbmQsIHRoZSBzZWNvbmQgaXMgdGhlIE1CQiB0byBicmFuY2ggdG8uCisgICAgQlIsCisKKyAgICAvLy8gQlJJTkQgLSBJbmRpcmVjdCBicmFuY2guICBUaGUgZmlyc3Qgb3BlcmFuZCBpcyB0aGUgY2hhaW4sIHRoZSBzZWNvbmQKKyAgICAvLy8gaXMgdGhlIHZhbHVlIHRvIGJyYW5jaCB0bywgd2hpY2ggbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZQorICAgIC8vLyB0YXJnZXQncyBwb2ludGVyIHR5cGUuCisgICAgQlJJTkQsCisKKyAgICAvLy8gQlJfSlQgLSBKdW1wdGFibGUgYnJhbmNoLiBUaGUgZmlyc3Qgb3BlcmFuZCBpcyB0aGUgY2hhaW4sIHRoZSBzZWNvbmQKKyAgICAvLy8gaXMgdGhlIGp1bXB0YWJsZSBpbmRleCwgdGhlIGxhc3Qgb25lIGlzIHRoZSBqdW1wdGFibGUgZW50cnkgaW5kZXguCisgICAgQlJfSlQsCisKKyAgICAvLy8gQlJDT05EIC0gQ29uZGl0aW9uYWwgYnJhbmNoLiAgVGhlIGZpcnN0IG9wZXJhbmQgaXMgdGhlIGNoYWluLCB0aGUKKyAgICAvLy8gc2Vjb25kIGlzIHRoZSBjb25kaXRpb24sIHRoZSB0aGlyZCBpcyB0aGUgYmxvY2sgdG8gYnJhbmNoIHRvIGlmIHRoZQorICAgIC8vLyBjb25kaXRpb24gaXMgdHJ1ZS4gIElmIHRoZSB0eXBlIG9mIHRoZSBjb25kaXRpb24gaXMgbm90IGkxLCB0aGVuIHRoZQorICAgIC8vLyBoaWdoIGJpdHMgbXVzdCBjb25mb3JtIHRvIGdldEJvb2xlYW5Db250ZW50cy4KKyAgICBCUkNPTkQsCisKKyAgICAvLy8gQlJfQ0MgLSBDb25kaXRpb25hbCBicmFuY2guICBUaGUgYmVoYXZpb3IgaXMgbGlrZSB0aGF0IG9mIFNFTEVDVF9DQywgaW4KKyAgICAvLy8gdGhhdCB0aGUgY29uZGl0aW9uIGlzIHJlcHJlc2VudGVkIGFzIGNvbmRpdGlvbiBjb2RlLCBhbmQgdHdvIG5vZGVzIHRvCisgICAgLy8vIGNvbXBhcmUsIHJhdGhlciB0aGFuIGFzIGEgY29tYmluZWQgU2V0Q0Mgbm9kZS4gIFRoZSBvcGVyYW5kcyBpbiBvcmRlcgorICAgIC8vLyBhcmUgY2hhaW4sIGNjLCBsaHMsIHJocywgYmxvY2sgdG8gYnJhbmNoIHRvIGlmIGNvbmRpdGlvbiBpcyB0cnVlLgorICAgIEJSX0NDLAorCisgICAgLy8vIElOTElORUFTTSAtIFJlcHJlc2VudHMgYW4gaW5saW5lIGFzbSBibG9jay4gIFRoaXMgbm9kZSBhbHdheXMgaGFzIHR3bworICAgIC8vLyByZXR1cm4gdmFsdWVzOiBhIGNoYWluIGFuZCBhIGZsYWcgcmVzdWx0LiAgVGhlIGlucHV0cyBhcmUgYXMgZm9sbG93czoKKyAgICAvLy8gICBPcGVyYW5kICMwICA6IElucHV0IGNoYWluLgorICAgIC8vLyAgIE9wZXJhbmQgIzEgIDogYSBFeHRlcm5hbFN5bWJvbFNETm9kZSB3aXRoIGEgcG9pbnRlciB0byB0aGUgYXNtIHN0cmluZy4KKyAgICAvLy8gICBPcGVyYW5kICMyICA6IGEgTUROb2RlU0ROb2RlIHdpdGggdGhlICFzcmNsb2MgbWV0YWRhdGEuCisgICAgLy8vICAgT3BlcmFuZCAjMyAgOiBIYXNTaWRlRWZmZWN0LCBJc0FsaWduU3RhY2sgYml0cy4KKyAgICAvLy8gICBBZnRlciB0aGlzLCBpdCBpcyBmb2xsb3dlZCBieSBhIGxpc3Qgb2Ygb3BlcmFuZHMgd2l0aCB0aGlzIGZvcm1hdDoKKyAgICAvLy8gICAgIENvbnN0YW50U0ROb2RlOiBGbGFncyB0aGF0IGVuY29kZSB3aGV0aGVyIGl0IGlzIGEgbWVtIG9yIG5vdCwgdGhlCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgb2Ygb3BlcmFuZHMgdGhhdCBmb2xsb3csIGV0Yy4gIFNlZSBJbmxpbmVBc20uaC4KKyAgICAvLy8gICAgIC4uLiBob3dldmVyIG1hbnkgb3BlcmFuZHMgLi4uCisgICAgLy8vICAgT3BlcmFuZCAjbGFzdDogT3B0aW9uYWwsIGFuIGluY29taW5nIGZsYWcuCisgICAgLy8vCisgICAgLy8vIFRoZSB2YXJpYWJsZSB3aWR0aCBvcGVyYW5kcyBhcmUgcmVxdWlyZWQgdG8gcmVwcmVzZW50IHRhcmdldCBhZGRyZXNzaW5nCisgICAgLy8vIG1vZGVzIGFzIGEgc2luZ2xlICJvcGVyYW5kIiwgZXZlbiB0aG91Z2ggdGhleSBtYXkgaGF2ZSBtdWx0aXBsZQorICAgIC8vLyBTRE9wZXJhbmRzLgorICAgIElOTElORUFTTSwKKworICAgIC8vLyBFSF9MQUJFTCAtIFJlcHJlc2VudHMgYSBsYWJlbCBpbiBtaWQgYmFzaWMgYmxvY2sgdXNlZCB0byB0cmFjaworICAgIC8vLyBsb2NhdGlvbnMgbmVlZGVkIGZvciBkZWJ1ZyBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nIHRhYmxlcy4gIFRoZXNlIG5vZGVzCisgICAgLy8vIHRha2UgYSBjaGFpbiBhcyBpbnB1dCBhbmQgcmV0dXJuIGEgY2hhaW4uCisgICAgRUhfTEFCRUwsCisKKyAgICAvLy8gQU5OT1RBVElPTl9MQUJFTCAtIFJlcHJlc2VudHMgYSBtaWQgYmFzaWMgYmxvY2sgbGFiZWwgdXNlZCBieQorICAgIC8vLyBhbm5vdGF0aW9ucy4gVGhpcyBzaG91bGQgcmVtYWluIHdpdGhpbiB0aGUgYmFzaWMgYmxvY2sgYW5kIGJlIG9yZGVyZWQKKyAgICAvLy8gd2l0aCByZXNwZWN0IHRvIG90aGVyIGNhbGwgaW5zdHJ1Y3Rpb25zLCBidXQgbG9hZHMgYW5kIHN0b3JlcyBtYXkgZmxvYXQKKyAgICAvLy8gcGFzdCBpdC4KKyAgICBBTk5PVEFUSU9OX0xBQkVMLAorCisgICAgLy8vIENBVENIUEFEIC0gUmVwcmVzZW50cyBhIGNhdGNocGFkIGluc3RydWN0aW9uLgorICAgIENBVENIUEFELAorCisgICAgLy8vIENBVENIUkVUIC0gUmVwcmVzZW50cyBhIHJldHVybiBmcm9tIGEgY2F0Y2ggYmxvY2sgZnVuY2xldC4gVXNlZCBmb3IKKyAgICAvLy8gTVNWQyBjb21wYXRpYmxlIGV4Y2VwdGlvbiBoYW5kbGluZy4gVGFrZXMgYSBjaGFpbiBvcGVyYW5kIGFuZCBhCisgICAgLy8vIGRlc3RpbmF0aW9uIGJhc2ljIGJsb2NrIG9wZXJhbmQuCisgICAgQ0FUQ0hSRVQsCisKKyAgICAvLy8gQ0xFQU5VUFJFVCAtIFJlcHJlc2VudHMgYSByZXR1cm4gZnJvbSBhIGNsZWFudXAgYmxvY2sgZnVuY2xldC4gIFVzZWQgZm9yCisgICAgLy8vIE1TVkMgY29tcGF0aWJsZSBleGNlcHRpb24gaGFuZGxpbmcuIFRha2VzIG9ubHkgYSBjaGFpbiBvcGVyYW5kLgorICAgIENMRUFOVVBSRVQsCisKKyAgICAvLy8gU1RBQ0tTQVZFIC0gU1RBQ0tTQVZFIGhhcyBvbmUgb3BlcmFuZCwgYW4gaW5wdXQgY2hhaW4uICBJdCBwcm9kdWNlcyBhCisgICAgLy8vIHZhbHVlLCB0aGUgc2FtZSB0eXBlIGFzIHRoZSBwb2ludGVyIHR5cGUgZm9yIHRoZSBzeXN0ZW0sIGFuZCBhbiBvdXRwdXQKKyAgICAvLy8gY2hhaW4uCisgICAgU1RBQ0tTQVZFLAorCisgICAgLy8vIFNUQUNLUkVTVE9SRSBoYXMgdHdvIG9wZXJhbmRzLCBhbiBpbnB1dCBjaGFpbiBhbmQgYSBwb2ludGVyIHRvIHJlc3RvcmUKKyAgICAvLy8gdG8gaXQgcmV0dXJucyBhbiBvdXRwdXQgY2hhaW4uCisgICAgU1RBQ0tSRVNUT1JFLAorCisgICAgLy8vIENBTExTRVFfU1RBUlQvQ0FMTFNFUV9FTkQgLSBUaGVzZSBvcGVyYXRvcnMgbWFyayB0aGUgYmVnaW5uaW5nIGFuZCBlbmQKKyAgICAvLy8gb2YgYSBjYWxsIHNlcXVlbmNlLCBhbmQgY2FycnkgYXJiaXRyYXJ5IGluZm9ybWF0aW9uIHRoYXQgdGFyZ2V0IG1pZ2h0CisgICAgLy8vIHdhbnQgdG8ga25vdy4gIFRoZSBmaXJzdCBvcGVyYW5kIGlzIGEgY2hhaW4sIHRoZSByZXN0IGFyZSBzcGVjaWZpZWQgYnkKKyAgICAvLy8gdGhlIHRhcmdldCBhbmQgbm90IHRvdWNoZWQgYnkgdGhlIERBRyBvcHRpbWl6ZXJzLgorICAgIC8vLyBUYXJnZXRzIHRoYXQgbWF5IHVzZSBzdGFjayB0byBwYXNzIGNhbGwgYXJndW1lbnRzIGRlZmluZSBhZGRpdGlvbmFsCisgICAgLy8vIG9wZXJhbmRzOgorICAgIC8vLyAtIHNpemUgb2YgdGhlIGNhbGwgZnJhbWUgcGFydCB0aGF0IG11c3QgYmUgc2V0IHVwIHdpdGhpbiB0aGUKKyAgICAvLy8gICBDQUxMU0VRX1NUQVJULi5DQUxMU0VRX0VORCBwYWlyLAorICAgIC8vLyAtIHBhcnQgb2YgdGhlIGNhbGwgZnJhbWUgcHJlcGFyZWQgcHJpb3IgdG8gQ0FMTFNFUV9TVEFSVC4KKyAgICAvLy8gQm90aCB0aGVzZSBwYXJhbWV0ZXJzIG11c3QgYmUgY29uc3RhbnRzLCB0aGVpciBzdW0gaXMgdGhlIHRvdGFsIGNhbGwKKyAgICAvLy8gZnJhbWUgc2l6ZS4KKyAgICAvLy8gQ0FMTFNFUV9TVEFSVC4uQ0FMTFNFUV9FTkQgcGFpcnMgbWF5IG5vdCBiZSBuZXN0ZWQuCisgICAgQ0FMTFNFUV9TVEFSVCwgIC8vIEJlZ2lubmluZyBvZiBhIGNhbGwgc2VxdWVuY2UKKyAgICBDQUxMU0VRX0VORCwgICAgLy8gRW5kIG9mIGEgY2FsbCBzZXF1ZW5jZQorCisgICAgLy8vIFZBQVJHIC0gVkFBUkcgaGFzIGZvdXIgb3BlcmFuZHM6IGFuIGlucHV0IGNoYWluLCBhIHBvaW50ZXIsIGEgU1JDVkFMVUUsCisgICAgLy8vIGFuZCB0aGUgYWxpZ25tZW50LiBJdCByZXR1cm5zIGEgcGFpciBvZiB2YWx1ZXM6IHRoZSB2YWFyZyB2YWx1ZSBhbmQgYQorICAgIC8vLyBuZXcgY2hhaW4uCisgICAgVkFBUkcsCisKKyAgICAvLy8gVkFDT1BZIC0gVkFDT1BZIGhhcyA1IG9wZXJhbmRzOiBhbiBpbnB1dCBjaGFpbiwgYSBkZXN0aW5hdGlvbiBwb2ludGVyLAorICAgIC8vLyBhIHNvdXJjZSBwb2ludGVyLCBhIFNSQ1ZBTFVFIGZvciB0aGUgZGVzdGluYXRpb24sIGFuZCBhIFNSQ1ZBTFVFIGZvciB0aGUKKyAgICAvLy8gc291cmNlLgorICAgIFZBQ09QWSwKKworICAgIC8vLyBWQUVORCwgVkFTVEFSVCAtIFZBRU5EIGFuZCBWQVNUQVJUIGhhdmUgdGhyZWUgb3BlcmFuZHM6IGFuIGlucHV0IGNoYWluLAorICAgIC8vLyBwb2ludGVyLCBhbmQgYSBTUkNWQUxVRS4KKyAgICBWQUVORCwgVkFTVEFSVCwKKworICAgIC8vLyBTUkNWQUxVRSAtIFRoaXMgaXMgYSBub2RlIHR5cGUgdGhhdCBob2xkcyBhIFZhbHVlKiB0aGF0IGlzIHVzZWQgdG8KKyAgICAvLy8gbWFrZSByZWZlcmVuY2UgdG8gYSB2YWx1ZSBpbiB0aGUgTExWTSBJUi4KKyAgICBTUkNWQUxVRSwKKworICAgIC8vLyBNRE5PREVfU0ROT0RFIC0gVGhpcyBpcyBhIG5vZGUgdGhhdCBob2xkZXMgYW4gTUROb2RlKiwgd2hpY2ggaXMgdXNlZCB0bworICAgIC8vLyByZWZlcmVuY2UgbWV0YWRhdGEgaW4gdGhlIElSLgorICAgIE1ETk9ERV9TRE5PREUsCisKKyAgICAvLy8gUENNQVJLRVIgLSBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBwY21hcmtlciBpbnRyaW5zaWMuCisgICAgUENNQVJLRVIsCisKKyAgICAvLy8gUkVBRENZQ0xFQ09VTlRFUiAtIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHJlYWRjeWNsZWNvdW50ZXIgaW50cmluc2ljLgorICAgIC8vLyBJdCBwcm9kdWNlcyBhIGNoYWluIGFuZCBvbmUgaTY0IHZhbHVlLiBUaGUgb25seSBvcGVyYW5kIGlzIGEgY2hhaW4uCisgICAgLy8vIElmIGk2NCBpcyBub3QgbGVnYWwsIHRoZSByZXN1bHQgd2lsbCBiZSBleHBhbmRlZCBpbnRvIHNtYWxsZXIgdmFsdWVzLgorICAgIC8vLyBTdGlsbCwgaXQgcmV0dXJucyBhbiBpNjQsIHNvIHRhcmdldHMgc2hvdWxkIHNldCBsZWdhbGl0eSBmb3IgaTY0LgorICAgIC8vLyBUaGUgcmVzdWx0IGlzIHRoZSBjb250ZW50IG9mIHRoZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY3ljbGUKKyAgICAvLy8gY291bnRlci1saWtlIHJlZ2lzdGVyIChvciBvdGhlciBoaWdoIGFjY3VyYWN5IGxvdyBsYXRlbmN5IGNsb2NrIHNvdXJjZSkuCisgICAgUkVBRENZQ0xFQ09VTlRFUiwKKworICAgIC8vLyBIQU5ETEVOT0RFIG5vZGUgLSBVc2VkIGFzIGEgaGFuZGxlIGZvciB2YXJpb3VzIHB1cnBvc2VzLgorICAgIEhBTkRMRU5PREUsCisKKyAgICAvLy8gSU5JVF9UUkFNUE9MSU5FIC0gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgaW5pdF90cmFtcG9saW5lIGludHJpbnNpYy4gIEl0CisgICAgLy8vIHRha2VzIGFzIGlucHV0IGEgdG9rZW4gY2hhaW4sIHRoZSBwb2ludGVyIHRvIHRoZSB0cmFtcG9saW5lLCB0aGUgcG9pbnRlcgorICAgIC8vLyB0byB0aGUgbmVzdGVkIGZ1bmN0aW9uLCB0aGUgcG9pbnRlciB0byBwYXNzIGZvciB0aGUgJ25lc3QnIHBhcmFtZXRlciwgYQorICAgIC8vLyBTUkNWQUxVRSBmb3IgdGhlIHRyYW1wb2xpbmUgYW5kIGFub3RoZXIgZm9yIHRoZSBuZXN0ZWQgZnVuY3Rpb24KKyAgICAvLy8gKGFsbG93aW5nIHRhcmdldHMgdG8gYWNjZXNzIHRoZSBvcmlnaW5hbCBGdW5jdGlvbiopLgorICAgIC8vLyBJdCBwcm9kdWNlcyBhIHRva2VuIGNoYWluIGFzIG91dHB1dC4KKyAgICBJTklUX1RSQU1QT0xJTkUsCisKKyAgICAvLy8gQURKVVNUX1RSQU1QT0xJTkUgLSBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBhZGp1c3RfdHJhbXBvbGluZSBpbnRyaW5zaWMuCisgICAgLy8vIEl0IHRha2VzIGEgcG9pbnRlciB0byB0aGUgdHJhbXBvbGluZSBhbmQgcHJvZHVjZXMgYSAocG9zc2libHkpIG5ldworICAgIC8vLyBwb2ludGVyIHRvIHRoZSBzYW1lIHRyYW1wb2xpbmUgd2l0aCBwbGF0Zm9ybS1zcGVjaWZpYyBhZGp1c3RtZW50cworICAgIC8vLyBhcHBsaWVkLiAgVGhlIHBvaW50ZXIgaXQgcmV0dXJucyBwb2ludHMgdG8gYW4gZXhlY3V0YWJsZSBibG9jayBvZiBjb2RlLgorICAgIEFESlVTVF9UUkFNUE9MSU5FLAorCisgICAgLy8vIFRSQVAgLSBUcmFwcGluZyBpbnN0cnVjdGlvbgorICAgIFRSQVAsCisKKyAgICAvLy8gREVCVUdUUkFQIC0gVHJhcCBpbnRlbmRlZCB0byBnZXQgdGhlIGF0dGVudGlvbiBvZiBhIGRlYnVnZ2VyLgorICAgIERFQlVHVFJBUCwKKworICAgIC8vLyBQUkVGRVRDSCAtIFRoaXMgY29ycmVzcG9uZHMgdG8gYSBwcmVmZXRjaCBpbnRyaW5zaWMuIFRoZSBmaXJzdCBvcGVyYW5kCisgICAgLy8vIGlzIHRoZSBjaGFpbi4gIFRoZSBvdGhlciBvcGVyYW5kcyBhcmUgdGhlIGFkZHJlc3MgdG8gcHJlZmV0Y2gsCisgICAgLy8vIHJlYWQgLyB3cml0ZSBzcGVjaWZpZXIsIGxvY2FsaXR5IHNwZWNpZmllciBhbmQgaW5zdHJ1Y3Rpb24gLyBkYXRhIGNhY2hlCisgICAgLy8vIHNwZWNpZmllci4KKyAgICBQUkVGRVRDSCwKKworICAgIC8vLyBPVVRDSEFJTiA9IEFUT01JQ19GRU5DRShJTkNIQUlOLCBvcmRlcmluZywgc2NvcGUpCisgICAgLy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGZlbmNlIGluc3RydWN0aW9uLiBJdCB0YWtlcyBhbiBpbnB1dCBjaGFpbiwgYW5kCisgICAgLy8vIHR3byBpbnRlZ2VyIGNvbnN0YW50czogYW4gQXRvbWljT3JkZXJpbmcgYW5kIGEgU3luY2hyb25pemF0aW9uU2NvcGUuCisgICAgQVRPTUlDX0ZFTkNFLAorCisgICAgLy8vIFZhbCwgT1VUQ0hBSU4gPSBBVE9NSUNfTE9BRChJTkNIQUlOLCBwdHIpCisgICAgLy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gImxvYWQgYXRvbWljIiBpbnN0cnVjdGlvbi4KKyAgICBBVE9NSUNfTE9BRCwKKworICAgIC8vLyBPVVRDSEFJTiA9IEFUT01JQ19TVE9SRShJTkNIQUlOLCBwdHIsIHZhbCkKKyAgICAvLy8gVGhpcyBjb3JyZXNwb25kcyB0byAic3RvcmUgYXRvbWljIiBpbnN0cnVjdGlvbi4KKyAgICBBVE9NSUNfU1RPUkUsCisKKyAgICAvLy8gVmFsLCBPVVRDSEFJTiA9IEFUT01JQ19DTVBfU1dBUChJTkNIQUlOLCBwdHIsIGNtcCwgc3dhcCkKKyAgICAvLy8gRm9yIGRvdWJsZS13b3JkIGF0b21pYyBvcGVyYXRpb25zOgorICAgIC8vLyBWYWxMbywgVmFsSGksIE9VVENIQUlOID0gQVRPTUlDX0NNUF9TV0FQKElOQ0hBSU4sIHB0ciwgY21wTG8sIGNtcEhpLAorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBMbywgc3dhcEhpKQorICAgIC8vLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBjbXB4Y2hnIGluc3RydWN0aW9uLgorICAgIEFUT01JQ19DTVBfU1dBUCwKKworICAgIC8vLyBWYWwsIFN1Y2Nlc3MsIE9VVENIQUlOCisgICAgLy8vICAgICA9IEFUT01JQ19DTVBfU1dBUF9XSVRIX1NVQ0NFU1MoSU5DSEFJTiwgcHRyLCBjbXAsIHN3YXApCisgICAgLy8vIE4uYi4gdGhpcyBpcyBzdGlsbCBhIHN0cm9uZyBjbXB4Y2hnIG9wZXJhdGlvbiwgc28KKyAgICAvLy8gU3VjY2VzcyA9PSAiVmFsID09IGNtcCIuCisgICAgQVRPTUlDX0NNUF9TV0FQX1dJVEhfU1VDQ0VTUywKKworICAgIC8vLyBWYWwsIE9VVENIQUlOID0gQVRPTUlDX1NXQVAoSU5DSEFJTiwgcHRyLCBhbXQpCisgICAgLy8vIFZhbCwgT1VUQ0hBSU4gPSBBVE9NSUNfTE9BRF9bT3BOYW1lXShJTkNIQUlOLCBwdHIsIGFtdCkKKyAgICAvLy8gRm9yIGRvdWJsZS13b3JkIGF0b21pYyBvcGVyYXRpb25zOgorICAgIC8vLyBWYWxMbywgVmFsSGksIE9VVENIQUlOID0gQVRPTUlDX1NXQVAoSU5DSEFJTiwgcHRyLCBhbXRMbywgYW10SGkpCisgICAgLy8vIFZhbExvLCBWYWxIaSwgT1VUQ0hBSU4gPSBBVE9NSUNfTE9BRF9bT3BOYW1lXShJTkNIQUlOLCBwdHIsIGFtdExvLCBhbXRIaSkKKyAgICAvLy8gVGhlc2UgY29ycmVzcG9uZCB0byB0aGUgYXRvbWljcm13IGluc3RydWN0aW9uLgorICAgIEFUT01JQ19TV0FQLAorICAgIEFUT01JQ19MT0FEX0FERCwKKyAgICBBVE9NSUNfTE9BRF9TVUIsCisgICAgQVRPTUlDX0xPQURfQU5ELAorICAgIEFUT01JQ19MT0FEX0NMUiwKKyAgICBBVE9NSUNfTE9BRF9PUiwKKyAgICBBVE9NSUNfTE9BRF9YT1IsCisgICAgQVRPTUlDX0xPQURfTkFORCwKKyAgICBBVE9NSUNfTE9BRF9NSU4sCisgICAgQVRPTUlDX0xPQURfTUFYLAorICAgIEFUT01JQ19MT0FEX1VNSU4sCisgICAgQVRPTUlDX0xPQURfVU1BWCwKKworICAgIC8vIE1hc2tlZCBsb2FkIGFuZCBzdG9yZSAtIGNvbnNlY3V0aXZlIHZlY3RvciBsb2FkIGFuZCBzdG9yZSBvcGVyYXRpb25zCisgICAgLy8gd2l0aCBhZGRpdGlvbmFsIG1hc2sgb3BlcmFuZCB0aGF0IHByZXZlbnRzIG1lbW9yeSBhY2Nlc3NlcyB0byB0aGUKKyAgICAvLyBtYXNrZWQtb2ZmIGxhbmVzLgorICAgIE1MT0FELCBNU1RPUkUsCisKKyAgICAvLyBNYXNrZWQgZ2F0aGVyIGFuZCBzY2F0dGVyIC0gbG9hZCBhbmQgc3RvcmUgb3BlcmF0aW9ucyBmb3IgYSB2ZWN0b3Igb2YKKyAgICAvLyByYW5kb20gYWRkcmVzc2VzIHdpdGggYWRkaXRpb25hbCBtYXNrIG9wZXJhbmQgdGhhdCBwcmV2ZW50cyBtZW1vcnkKKyAgICAvLyBhY2Nlc3NlcyB0byB0aGUgbWFza2VkLW9mZiBsYW5lcy4KKyAgICBNR0FUSEVSLCBNU0NBVFRFUiwKKworICAgIC8vLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBsbHZtLmxpZmV0aW1lLiogaW50cmluc2ljcy4gVGhlIGZpcnN0IG9wZXJhbmQKKyAgICAvLy8gaXMgdGhlIGNoYWluIGFuZCB0aGUgc2Vjb25kIG9wZXJhbmQgaXMgdGhlIGFsbG9jYSBwb2ludGVyLgorICAgIExJRkVUSU1FX1NUQVJULCBMSUZFVElNRV9FTkQsCisKKyAgICAvLy8gR0NfVFJBTlNJVElPTl9TVEFSVC9HQ19UUkFOU0lUSU9OX0VORCAtIFRoZXNlIG9wZXJhdG9ycyBtYXJrIHRoZQorICAgIC8vLyBiZWdpbm5pbmcgYW5kIGVuZCBvZiBHQyB0cmFuc2l0aW9uICBzZXF1ZW5jZSwgYW5kIGNhcnJ5IGFyYml0cmFyeQorICAgIC8vLyBpbmZvcm1hdGlvbiB0aGF0IHRhcmdldCBtaWdodCBuZWVkIGZvciBsb3dlcmluZy4gIFRoZSBmaXJzdCBvcGVyYW5kIGlzCisgICAgLy8vIGEgY2hhaW4sIHRoZSByZXN0IGFyZSBzcGVjaWZpZWQgYnkgdGhlIHRhcmdldCBhbmQgbm90IHRvdWNoZWQgYnkgdGhlIERBRworICAgIC8vLyBvcHRpbWl6ZXJzLiBHQ19UUkFOU0lUSU9OX1NUQVJULi5HQ19UUkFOU0lUSU9OX0VORCBwYWlycyBtYXkgbm90IGJlCisgICAgLy8vIG5lc3RlZC4KKyAgICBHQ19UUkFOU0lUSU9OX1NUQVJULAorICAgIEdDX1RSQU5TSVRJT05fRU5ELAorCisgICAgLy8vIEdFVF9EWU5BTUlDX0FSRUFfT0ZGU0VUIC0gZ2V0IG9mZnNldCBmcm9tIG5hdGl2ZSBTUCB0byB0aGUgYWRkcmVzcyBvZgorICAgIC8vLyB0aGUgbW9zdCByZWNlbnQgZHluYW1pYyBhbGxvY2EuIEZvciBtb3N0IHRhcmdldHMgdGhhdCB3b3VsZCBiZSAwLCBidXQKKyAgICAvLy8gZm9yIHNvbWUgb3RoZXJzIChlLmcuIFBvd2VyUEMsIFBvd2VyUEM2NCkgdGhhdCB3b3VsZCBiZSBjb21waWxlLXRpbWUKKyAgICAvLy8ga25vd24gbm9uemVybyBjb25zdGFudC4gVGhlIG9ubHkgb3BlcmFuZCBoZXJlIGlzIHRoZSBjaGFpbi4KKyAgICBHRVRfRFlOQU1JQ19BUkVBX09GRlNFVCwKKworICAgIC8vLyBHZW5lcmljIHJlZHVjdGlvbiBub2Rlcy4gVGhlc2Ugbm9kZXMgcmVwcmVzZW50IGhvcml6b250YWwgdmVjdG9yCisgICAgLy8vIHJlZHVjdGlvbiBvcGVyYXRpb25zLCBwcm9kdWNpbmcgYSBzY2FsYXIgcmVzdWx0LgorICAgIC8vLyBUaGUgU1RSSUNUIHZhcmlhbnRzIHBlcmZvcm0gcmVkdWN0aW9ucyBpbiBzZXF1ZW50aWFsIG9yZGVyLiBUaGUgZmlyc3QKKyAgICAvLy8gb3BlcmFuZCBpcyBhbiBpbml0aWFsIHNjYWxhciBhY2N1bXVsYXRvciB2YWx1ZSwgYW5kIHRoZSBzZWNvbmQgb3BlcmFuZAorICAgIC8vLyBpcyB0aGUgdmVjdG9yIHRvIHJlZHVjZS4KKyAgICBWRUNSRURVQ0VfU1RSSUNUX0ZBREQsIFZFQ1JFRFVDRV9TVFJJQ1RfRk1VTCwKKyAgICAvLy8gVGhlc2UgcmVkdWN0aW9ucyBhcmUgbm9uLXN0cmljdCwgYW5kIGhhdmUgYSBzaW5nbGUgdmVjdG9yIG9wZXJhbmQuCisgICAgVkVDUkVEVUNFX0ZBREQsIFZFQ1JFRFVDRV9GTVVMLAorICAgIFZFQ1JFRFVDRV9BREQsIFZFQ1JFRFVDRV9NVUwsCisgICAgVkVDUkVEVUNFX0FORCwgVkVDUkVEVUNFX09SLCBWRUNSRURVQ0VfWE9SLAorICAgIFZFQ1JFRFVDRV9TTUFYLCBWRUNSRURVQ0VfU01JTiwgVkVDUkVEVUNFX1VNQVgsIFZFQ1JFRFVDRV9VTUlOLAorICAgIC8vLyBGTUlOL0ZNQVggbm9kZXMgY2FuIGhhdmUgZmxhZ3MsIGZvciBOYU4vTm9OYU4gdmFyaWFudHMuCisgICAgVkVDUkVEVUNFX0ZNQVgsIFZFQ1JFRFVDRV9GTUlOLAorCisgICAgLy8vIEJVSUxUSU5fT1BfRU5EIC0gVGhpcyBtdXN0IGJlIHRoZSBsYXN0IGVudW0gdmFsdWUgaW4gdGhpcyBsaXN0LgorICAgIC8vLyBUaGUgdGFyZ2V0LXNwZWNpZmljIHByZS1pc2VsIG9wY29kZSB2YWx1ZXMgc3RhcnQgaGVyZS4KKyAgICBCVUlMVElOX09QX0VORAorICB9OworCisgIC8vLyBGSVJTVF9UQVJHRVRfTUVNT1JZX09QQ09ERSAtIFRhcmdldC1zcGVjaWZpYyBwcmUtaXNlbCBvcGVyYXRpb25zCisgIC8vLyB3aGljaCBkbyBub3QgcmVmZXJlbmNlIGEgc3BlY2lmaWMgbWVtb3J5IGxvY2F0aW9uIHNob3VsZCBiZSBsZXNzIHRoYW4KKyAgLy8vIHRoaXMgdmFsdWUuIFRob3NlIHRoYXQgZG8gbXVzdCBub3QgYmUgbGVzcyB0aGFuIHRoaXMgdmFsdWUsIGFuZCBjYW4KKyAgLy8vIGJlIHVzZWQgd2l0aCBTZWxlY3Rpb25EQUc6OmdldE1lbUludHJpbnNpY05vZGUuCisgIHN0YXRpYyBjb25zdCBpbnQgRklSU1RfVEFSR0VUX01FTU9SWV9PUENPREUgPSBCVUlMVElOX09QX0VORCs0MDA7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBNZW1JbmRleGVkTW9kZSBlbnVtIC0gVGhpcyBlbnVtIGRlZmluZXMgdGhlIGxvYWQgLyBzdG9yZSBpbmRleGVkCisgIC8vLyBhZGRyZXNzaW5nIG1vZGVzLgorICAvLy8KKyAgLy8vIFVOSU5ERVhFRCAgICAiTm9ybWFsIiBsb2FkIC8gc3RvcmUuIFRoZSBlZmZlY3RpdmUgYWRkcmVzcyBpcyBhbHJlYWR5CisgIC8vLyAgICAgICAgICAgICAgY29tcHV0ZWQgYW5kIGlzIGF2YWlsYWJsZSBpbiB0aGUgYmFzZSBwb2ludGVyLiBUaGUgb2Zmc2V0CisgIC8vLyAgICAgICAgICAgICAgb3BlcmFuZCBpcyBhbHdheXMgdW5kZWZpbmVkLiBJbiBhZGRpdGlvbiB0byBwcm9kdWNpbmcgYQorICAvLy8gICAgICAgICAgICAgIGNoYWluLCBhbiB1bmluZGV4ZWQgbG9hZCBwcm9kdWNlcyBvbmUgdmFsdWUgKHJlc3VsdCBvZiB0aGUKKyAgLy8vICAgICAgICAgICAgICBsb2FkKTsgYW4gdW5pbmRleGVkIHN0b3JlIGRvZXMgbm90IHByb2R1Y2UgYSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBQUkVfSU5DICAgICAgU2ltaWxhciB0byB0aGUgdW5pbmRleGVkIG1vZGUgd2hlcmUgdGhlIGVmZmVjdGl2ZSBhZGRyZXNzIGlzCisgIC8vLyBQUkVfREVDICAgICAgdGhlIHZhbHVlIG9mIHRoZSBiYXNlIHBvaW50ZXIgYWRkIC8gc3VidHJhY3QgdGhlIG9mZnNldC4KKyAgLy8vICAgICAgICAgICAgICBJdCBjb25zaWRlcnMgdGhlIGNvbXB1dGF0aW9uIGFzIGJlaW5nIGZvbGRlZCBpbnRvIHRoZSBsb2FkIC8KKyAgLy8vICAgICAgICAgICAgICBzdG9yZSBvcGVyYXRpb24gKGkuZS4gdGhlIGxvYWQgLyBzdG9yZSBkb2VzIHRoZSBhZGRyZXNzCisgIC8vLyAgICAgICAgICAgICAgY29tcHV0YXRpb24gYXMgd2VsbCBhcyBwZXJmb3JtaW5nIHRoZSBtZW1vcnkgdHJhbnNhY3Rpb24pLgorICAvLy8gICAgICAgICAgICAgIFRoZSBiYXNlIG9wZXJhbmQgaXMgYWx3YXlzIHVuZGVmaW5lZC4gSW4gYWRkaXRpb24gdG8KKyAgLy8vICAgICAgICAgICAgICBwcm9kdWNpbmcgYSBjaGFpbiwgcHJlLWluZGV4ZWQgbG9hZCBwcm9kdWNlcyB0d28gdmFsdWVzCisgIC8vLyAgICAgICAgICAgICAgKHJlc3VsdCBvZiB0aGUgbG9hZCBhbmQgdGhlIHJlc3VsdCBvZiB0aGUgYWRkcmVzcworICAvLy8gICAgICAgICAgICAgIGNvbXB1dGF0aW9uKTsgYSBwcmUtaW5kZXhlZCBzdG9yZSBwcm9kdWNlcyBvbmUgdmFsdWUgKHJlc3VsdAorICAvLy8gICAgICAgICAgICAgIG9mIHRoZSBhZGRyZXNzIGNvbXB1dGF0aW9uKS4KKyAgLy8vCisgIC8vLyBQT1NUX0lOQyAgICAgVGhlIGVmZmVjdGl2ZSBhZGRyZXNzIGlzIHRoZSB2YWx1ZSBvZiB0aGUgYmFzZSBwb2ludGVyLiBUaGUKKyAgLy8vIFBPU1RfREVDICAgICB2YWx1ZSBvZiB0aGUgb2Zmc2V0IG9wZXJhbmQgaXMgdGhlbiBhZGRlZCB0byAvIHN1YnRyYWN0ZWQKKyAgLy8vICAgICAgICAgICAgICBmcm9tIHRoZSBiYXNlIGFmdGVyIG1lbW9yeSB0cmFuc2FjdGlvbi4gSW4gYWRkaXRpb24gdG8KKyAgLy8vICAgICAgICAgICAgICBwcm9kdWNpbmcgYSBjaGFpbiwgcG9zdC1pbmRleGVkIGxvYWQgcHJvZHVjZXMgdHdvIHZhbHVlcworICAvLy8gICAgICAgICAgICAgICh0aGUgcmVzdWx0IG9mIHRoZSBsb2FkIGFuZCB0aGUgcmVzdWx0IG9mIHRoZSBiYXNlICsvLSBvZmZzZXQKKyAgLy8vICAgICAgICAgICAgICBjb21wdXRhdGlvbik7IGEgcG9zdC1pbmRleGVkIHN0b3JlIHByb2R1Y2VzIG9uZSB2YWx1ZSAodGhlCisgIC8vLyAgICAgICAgICAgICAgdGhlIHJlc3VsdCBvZiB0aGUgYmFzZSArLy0gb2Zmc2V0IGNvbXB1dGF0aW9uKS4KKyAgZW51bSBNZW1JbmRleGVkTW9kZSB7CisgICAgVU5JTkRFWEVEID0gMCwKKyAgICBQUkVfSU5DLAorICAgIFBSRV9ERUMsCisgICAgUE9TVF9JTkMsCisgICAgUE9TVF9ERUMKKyAgfTsKKworICBzdGF0aWMgY29uc3QgaW50IExBU1RfSU5ERVhFRF9NT0RFID0gUE9TVF9ERUMgKyAxOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gTG9hZEV4dFR5cGUgZW51bSAtIFRoaXMgZW51bSBkZWZpbmVzIHRoZSB0aHJlZSB2YXJpYW50cyBvZiBMT0FERVhUCisgIC8vLyAobG9hZCB3aXRoIGV4dGVuc2lvbikuCisgIC8vLworICAvLy8gU0VYVExPQUQgbG9hZHMgdGhlIGludGVnZXIgb3BlcmFuZCBhbmQgc2lnbiBleHRlbmRzIGl0IHRvIGEgbGFyZ2VyCisgIC8vLyAgICAgICAgICBpbnRlZ2VyIHJlc3VsdCB0eXBlLgorICAvLy8gWkVYVExPQUQgbG9hZHMgdGhlIGludGVnZXIgb3BlcmFuZCBhbmQgemVybyBleHRlbmRzIGl0IHRvIGEgbGFyZ2VyCisgIC8vLyAgICAgICAgICBpbnRlZ2VyIHJlc3VsdCB0eXBlLgorICAvLy8gRVhUTE9BRCAgaXMgdXNlZCBmb3IgdHdvIHRoaW5nczogZmxvYXRpbmcgcG9pbnQgZXh0ZW5kaW5nIGxvYWRzIGFuZAorICAvLy8gICAgICAgICAgaW50ZWdlciBleHRlbmRpbmcgbG9hZHMgW3RoZSB0b3AgYml0cyBhcmUgdW5kZWZpbmVkXS4KKyAgZW51bSBMb2FkRXh0VHlwZSB7CisgICAgTk9OX0VYVExPQUQgPSAwLAorICAgIEVYVExPQUQsCisgICAgU0VYVExPQUQsCisgICAgWkVYVExPQUQKKyAgfTsKKworICBzdGF0aWMgY29uc3QgaW50IExBU1RfTE9BREVYVF9UWVBFID0gWkVYVExPQUQgKyAxOworCisgIE5vZGVUeXBlIGdldEV4dEZvckxvYWRFeHRUeXBlKGJvb2wgSXNGUCwgTG9hZEV4dFR5cGUpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gSVNEOjpDb25kQ29kZSBlbnVtIC0gVGhlc2UgYXJlIG9yZGVyZWQgY2FyZWZ1bGx5IHRvIG1ha2UgdGhlIGJpdGZpZWxkcworICAvLy8gYmVsb3cgd29yayBvdXQsIHdoZW4gY29uc2lkZXJpbmcgU0VURkFMU0UgKHNvbWV0aGluZyB0aGF0IG5ldmVyIGV4aXN0cworICAvLy8gZHluYW1pY2FsbHkpIGFzIDAuICAiVSIgLT4gVW5zaWduZWQgKGZvciBpbnRlZ2VyIG9wZXJhbmRzKSBvciBVbm9yZGVyZWQKKyAgLy8vIChmb3IgZmxvYXRpbmcgcG9pbnQpLCAiTCIgLT4gTGVzcyB0aGFuLCAiRyIgLT4gR3JlYXRlciB0aGFuLCAiRSIgLT4gRXF1YWwKKyAgLy8vIHRvLiAgSWYgdGhlICJOIiBjb2x1bW4gaXMgMSwgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpcyB1bmRlZmluZWQgaWYKKyAgLy8vIHRoZSBpbnB1dCBpcyBhIE5BTi4KKyAgLy8vCisgIC8vLyBBbGwgb2YgdGhlc2UgKGV4Y2VwdCBmb3IgdGhlICdhbHdheXMgZm9sZGVkIG9wcycpIHNob3VsZCBiZSBoYW5kbGVkIGZvcgorICAvLy8gZmxvYXRpbmcgcG9pbnQuICBGb3IgaW50ZWdlciwgb25seSB0aGUgU0VURVEsU0VUTkUsU0VUTFQsU0VUTEUsU0VUR1QsCisgIC8vLyBTRVRHRSxTRVRVTFQsU0VUVUxFLFNFVFVHVCwgYW5kIFNFVFVHRSBvcGNvZGVzIGFyZSB1c2VkLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGVzZSBhcmUgbGFpZCBvdXQgaW4gYSBzcGVjaWZpYyBvcmRlciB0byBhbGxvdyBiaXQtdHdpZGRsaW5nCisgIC8vLyB0byB0cmFuc2Zvcm0gY29uZGl0aW9ucy4KKyAgZW51bSBDb25kQ29kZSB7CisgICAgLy8gT3Bjb2RlICAgICAgICAgIE4gVSBMIEcgRSAgICAgICBJbnR1aXRpdmUgb3BlcmF0aW9uCisgICAgU0VURkFMU0UsICAgICAgLy8gICAgMCAwIDAgMCAgICAgICBBbHdheXMgZmFsc2UgKGFsd2F5cyBmb2xkZWQpCisgICAgU0VUT0VRLCAgICAgICAgLy8gICAgMCAwIDAgMSAgICAgICBUcnVlIGlmIG9yZGVyZWQgYW5kIGVxdWFsCisgICAgU0VUT0dULCAgICAgICAgLy8gICAgMCAwIDEgMCAgICAgICBUcnVlIGlmIG9yZGVyZWQgYW5kIGdyZWF0ZXIgdGhhbgorICAgIFNFVE9HRSwgICAgICAgIC8vICAgIDAgMCAxIDEgICAgICAgVHJ1ZSBpZiBvcmRlcmVkIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwKKyAgICBTRVRPTFQsICAgICAgICAvLyAgICAwIDEgMCAwICAgICAgIFRydWUgaWYgb3JkZXJlZCBhbmQgbGVzcyB0aGFuCisgICAgU0VUT0xFLCAgICAgICAgLy8gICAgMCAxIDAgMSAgICAgICBUcnVlIGlmIG9yZGVyZWQgYW5kIGxlc3MgdGhhbiBvciBlcXVhbAorICAgIFNFVE9ORSwgICAgICAgIC8vICAgIDAgMSAxIDAgICAgICAgVHJ1ZSBpZiBvcmRlcmVkIGFuZCBvcGVyYW5kcyBhcmUgdW5lcXVhbAorICAgIFNFVE8sICAgICAgICAgIC8vICAgIDAgMSAxIDEgICAgICAgVHJ1ZSBpZiBvcmRlcmVkIChubyBuYW5zKQorICAgIFNFVFVPLCAgICAgICAgIC8vICAgIDEgMCAwIDAgICAgICAgVHJ1ZSBpZiB1bm9yZGVyZWQ6IGlzbmFuKFgpIHwgaXNuYW4oWSkKKyAgICBTRVRVRVEsICAgICAgICAvLyAgICAxIDAgMCAxICAgICAgIFRydWUgaWYgdW5vcmRlcmVkIG9yIGVxdWFsCisgICAgU0VUVUdULCAgICAgICAgLy8gICAgMSAwIDEgMCAgICAgICBUcnVlIGlmIHVub3JkZXJlZCBvciBncmVhdGVyIHRoYW4KKyAgICBTRVRVR0UsICAgICAgICAvLyAgICAxIDAgMSAxICAgICAgIFRydWUgaWYgdW5vcmRlcmVkLCBncmVhdGVyIHRoYW4sIG9yIGVxdWFsCisgICAgU0VUVUxULCAgICAgICAgLy8gICAgMSAxIDAgMCAgICAgICBUcnVlIGlmIHVub3JkZXJlZCBvciBsZXNzIHRoYW4KKyAgICBTRVRVTEUsICAgICAgICAvLyAgICAxIDEgMCAxICAgICAgIFRydWUgaWYgdW5vcmRlcmVkLCBsZXNzIHRoYW4sIG9yIGVxdWFsCisgICAgU0VUVU5FLCAgICAgICAgLy8gICAgMSAxIDEgMCAgICAgICBUcnVlIGlmIHVub3JkZXJlZCBvciBub3QgZXF1YWwKKyAgICBTRVRUUlVFLCAgICAgICAvLyAgICAxIDEgMSAxICAgICAgIEFsd2F5cyB0cnVlIChhbHdheXMgZm9sZGVkKQorICAgIC8vIERvbid0IGNhcmUgb3BlcmF0aW9uczogdW5kZWZpbmVkIGlmIHRoZSBpbnB1dCBpcyBhIG5hbi4KKyAgICBTRVRGQUxTRTIsICAgICAvLyAgMSBYIDAgMCAwICAgICAgIEFsd2F5cyBmYWxzZSAoYWx3YXlzIGZvbGRlZCkKKyAgICBTRVRFUSwgICAgICAgICAvLyAgMSBYIDAgMCAxICAgICAgIFRydWUgaWYgZXF1YWwKKyAgICBTRVRHVCwgICAgICAgICAvLyAgMSBYIDAgMSAwICAgICAgIFRydWUgaWYgZ3JlYXRlciB0aGFuCisgICAgU0VUR0UsICAgICAgICAgLy8gIDEgWCAwIDEgMSAgICAgICBUcnVlIGlmIGdyZWF0ZXIgdGhhbiBvciBlcXVhbAorICAgIFNFVExULCAgICAgICAgIC8vICAxIFggMSAwIDAgICAgICAgVHJ1ZSBpZiBsZXNzIHRoYW4KKyAgICBTRVRMRSwgICAgICAgICAvLyAgMSBYIDEgMCAxICAgICAgIFRydWUgaWYgbGVzcyB0aGFuIG9yIGVxdWFsCisgICAgU0VUTkUsICAgICAgICAgLy8gIDEgWCAxIDEgMCAgICAgICBUcnVlIGlmIG5vdCBlcXVhbAorICAgIFNFVFRSVUUyLCAgICAgIC8vICAxIFggMSAxIDEgICAgICAgQWx3YXlzIHRydWUgKGFsd2F5cyBmb2xkZWQpCisKKyAgICBTRVRDQ19JTlZBTElEICAgICAgIC8vIE1hcmtlciB2YWx1ZS4KKyAgfTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHNldGNjIGluc3RydWN0aW9uIHRoYXQgcGVyZm9ybXMgYSBzaWduZWQKKyAgLy8vIGNvbXBhcmlzb24gd2hlbiB1c2VkIHdpdGggaW50ZWdlciBvcGVyYW5kcy4KKyAgaW5saW5lIGJvb2wgaXNTaWduZWRJbnRTZXRDQyhDb25kQ29kZSBDb2RlKSB7CisgICAgcmV0dXJuIENvZGUgPT0gU0VUR1QgfHwgQ29kZSA9PSBTRVRHRSB8fCBDb2RlID09IFNFVExUIHx8IENvZGUgPT0gU0VUTEU7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHNldGNjIGluc3RydWN0aW9uIHRoYXQgcGVyZm9ybXMgYW4gdW5zaWduZWQKKyAgLy8vIGNvbXBhcmlzb24gd2hlbiB1c2VkIHdpdGggaW50ZWdlciBvcGVyYW5kcy4KKyAgaW5saW5lIGJvb2wgaXNVbnNpZ25lZEludFNldENDKENvbmRDb2RlIENvZGUpIHsKKyAgICByZXR1cm4gQ29kZSA9PSBTRVRVR1QgfHwgQ29kZSA9PSBTRVRVR0UgfHwgQ29kZSA9PSBTRVRVTFQgfHwgQ29kZSA9PSBTRVRVTEU7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjb25kaXRpb24gcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gb3BlcmFuZHMgdG8KKyAgLy8vIHRoZSBjb25kaXRpb24gYXJlIGVxdWFsLiBOb3RlIHRoYXQgaWYgb25lIG9mIHRoZSB0d28gb3BlcmFuZHMgaXMgYSBOYU4sCisgIC8vLyB0aGlzIHZhbHVlIGlzIG1lYW5pbmdsZXNzLgorICBpbmxpbmUgYm9vbCBpc1RydWVXaGVuRXF1YWwoQ29uZENvZGUgQ29uZCkgeworICAgIHJldHVybiAoKGludClDb25kICYgMSkgIT0gMDsKKyAgfQorCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBpZiB0aGUgY29uZGl0aW9uIGlzIGFsd2F5cyBmYWxzZSBpZiBhbiBvcGVyYW5kIGlzCisgIC8vLyBhIE5hTiwgMSBpZiB0aGUgY29uZGl0aW9uIGlzIGFsd2F5cyB0cnVlIGlmIHRoZSBvcGVyYW5kIGlzIGEgTmFOLCBhbmQgMiBpZgorICAvLy8gdGhlIGNvbmRpdGlvbiBpcyB1bmRlZmluZWQgaWYgdGhlIG9wZXJhbmQgaXMgYSBOYU4uCisgIGlubGluZSB1bnNpZ25lZCBnZXRVbm9yZGVyZWRGbGF2b3IoQ29uZENvZGUgQ29uZCkgeworICAgIHJldHVybiAoKGludClDb25kID4+IDMpICYgMzsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIG9wZXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvICEoWCBvcCBZKSwgd2hlcmUgJ29wJyBpcyBhIHZhbGlkCisgIC8vLyBTZXRDQyBvcGVyYXRpb24uCisgIENvbmRDb2RlIGdldFNldENDSW52ZXJzZShDb25kQ29kZSBPcGVyYXRpb24sIGJvb2wgaXNJbnRlZ2VyKTsKKworICAvLy8gUmV0dXJuIHRoZSBvcGVyYXRpb24gY29ycmVzcG9uZGluZyB0byAoWSBvcCBYKSB3aGVuIGdpdmVuIHRoZSBvcGVyYXRpb24KKyAgLy8vIGZvciAoWCBvcCBZKS4KKyAgQ29uZENvZGUgZ2V0U2V0Q0NTd2FwcGVkT3BlcmFuZHMoQ29uZENvZGUgT3BlcmF0aW9uKTsKKworICAvLy8gUmV0dXJuIHRoZSByZXN1bHQgb2YgYSBsb2dpY2FsIE9SIGJldHdlZW4gZGlmZmVyZW50IGNvbXBhcmlzb25zIG9mCisgIC8vLyBpZGVudGljYWwgdmFsdWVzOiAoKFggb3AxIFkpIHwgKFggb3AyIFkpKS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zCisgIC8vLyBTRVRDQ19JTlZBTElEIGlmIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXByZXNlbnQgdGhlIHJlc3VsdGFudCBjb21wYXJpc29uLgorICBDb25kQ29kZSBnZXRTZXRDQ09yT3BlcmF0aW9uKENvbmRDb2RlIE9wMSwgQ29uZENvZGUgT3AyLCBib29sIGlzSW50ZWdlcik7CisKKyAgLy8vIFJldHVybiB0aGUgcmVzdWx0IG9mIGEgbG9naWNhbCBBTkQgYmV0d2VlbiBkaWZmZXJlbnQgY29tcGFyaXNvbnMgb2YKKyAgLy8vIGlkZW50aWNhbCB2YWx1ZXM6ICgoWCBvcDEgWSkgJiAoWCBvcDIgWSkpLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMKKyAgLy8vIFNFVENDX0lOVkFMSUQgaWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlcHJlc2VudCB0aGUgcmVzdWx0YW50IGNvbXBhcmlzb24uCisgIENvbmRDb2RlIGdldFNldENDQW5kT3BlcmF0aW9uKENvbmRDb2RlIE9wMSwgQ29uZENvZGUgT3AyLCBib29sIGlzSW50ZWdlcik7CisKK30gLy8gZW5kIGxsdm06OklTRCBuYW1lc3BhY2UKKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vSW50cmluc2ljTG93ZXJpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9JbnRyaW5zaWNMb3dlcmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5N2Q2ODQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vSW50cmluc2ljTG93ZXJpbmcuaApAQCAtMCwwICsxLDU0IEBACisvLz09PS0tIEludHJpbnNpY0xvd2VyaW5nLmggLSBJbnRyaW5zaWMgRnVuY3Rpb24gTG93ZXJpbmcgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBJbnRyaW5zaWNMb3dlcmluZyBpbnRlcmZhY2UuICBUaGlzIGludGVyZmFjZSBhbGxvd3MKKy8vIGFkZGl0aW9uIG9mIGRvbWFpbi1zcGVjaWZpYyBvciBmcm9udC1lbmQgc3BlY2lmaWMgaW50cmluc2ljcyB0byBMTFZNIHdpdGhvdXQKKy8vIGhhdmluZyB0byBtb2RpZnkgYWxsIG9mIHRoZSBDIGJhY2tlbmQgb3IgaW50ZXJwcmV0ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fSU5UUklOU0lDTE9XRVJJTkdfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fSU5UUklOU0lDTE9XRVJJTkdfSAorCisjaW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIENhbGxJbnN0OworY2xhc3MgTW9kdWxlOworY2xhc3MgRGF0YUxheW91dDsKKworY2xhc3MgSW50cmluc2ljTG93ZXJpbmcgeworICBjb25zdCBEYXRhTGF5b3V0ICZETDsKKworICBib29sIFdhcm5lZDsKKworcHVibGljOgorICBleHBsaWNpdCBJbnRyaW5zaWNMb3dlcmluZyhjb25zdCBEYXRhTGF5b3V0ICZETCkgOiBETChETCksIFdhcm5lZChmYWxzZSkge30KKworICAvLy8gQWRkIGFsbCBvZiB0aGUgcHJvdG90eXBlcyB0aGF0IG1pZ2h0IGJlIG5lZWRlZCBieSBhbiBpbnRyaW5zaWMgbG93ZXJpbmcKKyAgLy8vIGltcGxlbWVudGF0aW9uIHRvIGJlIGluc2VydGVkIGludG8gdGhlIG1vZHVsZSBzcGVjaWZpZWQuCisgIHZvaWQgQWRkUHJvdG90eXBlcyhNb2R1bGUgJk0pOworCisgIC8vLyBSZXBsYWNlIGEgY2FsbCB0byB0aGUgc3BlY2lmaWVkIGludHJpbnNpYyBmdW5jdGlvbi4KKyAgLy8vIElmIGFuIGludHJpbnNpYyBmdW5jdGlvbiBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBjb2RlIGdlbmVyYXRvcgorICAvLy8gKHN1Y2ggYXMgdmFfc3RhcnQpLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBwcmludCBhIG1lc3NhZ2UgYW5kIGFib3J0LgorICAvLy8KKyAgLy8vIE90aGVyd2lzZSwgaWYgYW4gaW50cmluc2ljIGZ1bmN0aW9uIGNhbGwgY2FuIGJlIGxvd2VyZWQsIHRoZSBjb2RlIHRvCisgIC8vLyBpbXBsZW1lbnQgaXQgKG9mdGVuIGEgY2FsbCB0byBhIG5vbi1pbnRyaW5zaWMgZnVuY3Rpb24pIGlzIGluc2VydGVkCisgIC8vLyBfYWZ0ZXJfIHRoZSBjYWxsIGluc3RydWN0aW9uIGFuZCB0aGUgY2FsbCBpcyBkZWxldGVkLiBUaGUgY2FsbGVyIG11c3QKKyAgLy8vIGJlIGNhcGFibGUgb2YgaGFuZGxpbmcgdGhpcyBraW5kIG9mIGNoYW5nZS4KKyAgdm9pZCBMb3dlckludHJpbnNpY0NhbGwoQ2FsbEluc3QgKkNJKTsKKworICAvLy8gVHJ5IHRvIHJlcGxhY2UgYSBjYWxsIGluc3RydWN0aW9uIHdpdGggYSBjYWxsIHRvIGEgYnN3YXAgaW50cmluc2ljLiBSZXR1cm4KKyAgLy8vIGZhbHNlIGlmIHRoZSBjYWxsIGlzIG5vdCBhIHNpbXBsZSBpbnRlZ2VyIGJzd2FwLgorICBzdGF0aWMgYm9vbCBMb3dlclRvQnl0ZVN3YXAoQ2FsbEluc3QgKkNJKTsKK307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xhdGVuY3lQcmlvcml0eVF1ZXVlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGF0ZW5jeVByaW9yaXR5UXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODhlNmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xhdGVuY3lQcmlvcml0eVF1ZXVlLmgKQEAgLTAsMCArMSw5OCBAQAorLy89PT0tLS0tIExhdGVuY3lQcmlvcml0eVF1ZXVlLmggLSBBIGxhdGVuY3ktb3JpZW50ZWQgcHJpb3JpdHkgcXVldWUgLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIExhdGVuY3lQcmlvcml0eVF1ZXVlIGNsYXNzLCB3aGljaCBpcyBhCisvLyBTY2hlZHVsaW5nUHJpb3JpdHlRdWV1ZSB0aGF0IHNjaGVkdWxlcyB1c2luZyBsYXRlbmN5IGluZm9ybWF0aW9uIHRvCisvLyByZWR1Y2UgdGhlIGxlbmd0aCBvZiB0aGUgY3JpdGljYWwgcGF0aCB0aHJvdWdoIHRoZSBiYXNpYyBibG9jay4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9MQVRFTkNZUFJJT1JJVFlRVUVVRV9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9MQVRFTkNZUFJJT1JJVFlRVUVVRV9ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUcuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBMYXRlbmN5UHJpb3JpdHlRdWV1ZTsKKworICAvLy8gU29ydGluZyBmdW5jdGlvbnMgZm9yIHRoZSBBdmFpbGFibGUgcXVldWUuCisgIHN0cnVjdCBsYXRlbmN5X3NvcnQgeworICAgIExhdGVuY3lQcmlvcml0eVF1ZXVlICpQUTsKKyAgICBleHBsaWNpdCBsYXRlbmN5X3NvcnQoTGF0ZW5jeVByaW9yaXR5UXVldWUgKnBxKSA6IFBRKHBxKSB7fQorCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFNVbml0KiBsZWZ0LCBjb25zdCBTVW5pdCogcmlnaHQpIGNvbnN0OworICB9OworCisgIGNsYXNzIExhdGVuY3lQcmlvcml0eVF1ZXVlIDogcHVibGljIFNjaGVkdWxpbmdQcmlvcml0eVF1ZXVlIHsKKyAgICAvLyBTVW5pdHMgLSBUaGUgU1VuaXRzIGZvciB0aGUgY3VycmVudCBncmFwaC4KKyAgICBzdGQ6OnZlY3RvcjxTVW5pdD4gKlNVbml0czsKKworICAgIC8vLyBOdW1Ob2Rlc1NvbGVseUJsb2NraW5nIC0gVGhpcyB2ZWN0b3IgY29udGFpbnMsIGZvciBldmVyeSBub2RlIGluIHRoZQorICAgIC8vLyBRdWV1ZSwgdGhlIG51bWJlciBvZiBub2RlcyB0aGF0IHRoZSBub2RlIGlzIHRoZSBzb2xlIHVuc2NoZWR1bGVkCisgICAgLy8vIHByZWRlY2Vzc29yIGZvci4gIFRoaXMgaXMgdXNlZCBhcyBhIHRpZS1icmVha2VyIGhldXJpc3RpYyBmb3IgYmV0dGVyCisgICAgLy8vIG1vYmlsaXR5LgorICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBOdW1Ob2Rlc1NvbGVseUJsb2NraW5nOworCisgICAgLy8vIFF1ZXVlIC0gVGhlIHF1ZXVlLgorICAgIHN0ZDo6dmVjdG9yPFNVbml0Kj4gUXVldWU7CisgICAgbGF0ZW5jeV9zb3J0IFBpY2tlcjsKKworICBwdWJsaWM6CisgICAgTGF0ZW5jeVByaW9yaXR5UXVldWUoKSA6IFBpY2tlcih0aGlzKSB7CisgICAgfQorCisgICAgYm9vbCBpc0JvdHRvbVVwKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIHZvaWQgaW5pdE5vZGVzKHN0ZDo6dmVjdG9yPFNVbml0PiAmc3VuaXRzKSBvdmVycmlkZSB7CisgICAgICBTVW5pdHMgPSAmc3VuaXRzOworICAgICAgTnVtTm9kZXNTb2xlbHlCbG9ja2luZy5yZXNpemUoU1VuaXRzLT5zaXplKCksIDApOworICAgIH0KKworICAgIHZvaWQgYWRkTm9kZShjb25zdCBTVW5pdCAqU1UpIG92ZXJyaWRlIHsKKyAgICAgIE51bU5vZGVzU29sZWx5QmxvY2tpbmcucmVzaXplKFNVbml0cy0+c2l6ZSgpLCAwKTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZU5vZGUoY29uc3QgU1VuaXQgKlNVKSBvdmVycmlkZSB7CisgICAgfQorCisgICAgdm9pZCByZWxlYXNlU3RhdGUoKSBvdmVycmlkZSB7CisgICAgICBTVW5pdHMgPSBudWxscHRyOworICAgIH0KKworICAgIHVuc2lnbmVkIGdldExhdGVuY3kodW5zaWduZWQgTm9kZU51bSkgY29uc3QgeworICAgICAgYXNzZXJ0KE5vZGVOdW0gPCAoKlNVbml0cykuc2l6ZSgpKTsKKyAgICAgIHJldHVybiAoKlNVbml0cylbTm9kZU51bV0uZ2V0SGVpZ2h0KCk7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0TnVtU29sZWx5QmxvY2tOb2Rlcyh1bnNpZ25lZCBOb2RlTnVtKSBjb25zdCB7CisgICAgICBhc3NlcnQoTm9kZU51bSA8IE51bU5vZGVzU29sZWx5QmxvY2tpbmcuc2l6ZSgpKTsKKyAgICAgIHJldHVybiBOdW1Ob2Rlc1NvbGVseUJsb2NraW5nW05vZGVOdW1dOworICAgIH0KKworICAgIGJvb2wgZW1wdHkoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBRdWV1ZS5lbXB0eSgpOyB9CisKKyAgICB2b2lkIHB1c2goU1VuaXQgKlUpIG92ZXJyaWRlOworCisgICAgU1VuaXQgKnBvcCgpIG92ZXJyaWRlOworCisgICAgdm9pZCByZW1vdmUoU1VuaXQgKlNVKSBvdmVycmlkZTsKKworICAgIC8vIHNjaGVkdWxlZE5vZGUgLSBBcyBub2RlcyBhcmUgc2NoZWR1bGVkLCB3ZSBsb29rIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55CisgICAgLy8gc3VjY2Vzc29yIG5vZGVzIHRoYXQgaGF2ZSBhIHNpbmdsZSB1bnNjaGVkdWxlZCBwcmVkZWNlc3Nvci4gIElmIHNvLCB0aGF0CisgICAgLy8gc2luZ2xlIHByZWRlY2Vzc29yIGhhcyBhIGhpZ2hlciBwcmlvcml0eSwgc2luY2Ugc2NoZWR1bGluZyBpdCB3aWxsIG1ha2UKKyAgICAvLyB0aGUgbm9kZSBhdmFpbGFibGUuCisgICAgdm9pZCBzY2hlZHVsZWROb2RlKFNVbml0ICpOb2RlKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICB2b2lkIEFkanVzdFByaW9yaXR5T2ZVbnNjaGVkdWxlZFByZWRzKFNVbml0ICpTVSk7CisgICAgU1VuaXQgKmdldFNpbmdsZVVuc2NoZWR1bGVkUHJlZChTVW5pdCAqU1UpOworICB9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MYXp5TWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xhenlNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ4ZWUxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MYXp5TWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mby5oCkBAIC0wLDAgKzEsNzYgQEAKKy8vLz09PS0gTGF6eU1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8uaCAtIExhenkgQmxvY2sgRnJlcXVlbmN5IC0qLSBDKysgLSotLT09PS8vCisvLy8KKy8vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLy8KKy8vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLy8KKy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIGFuYWx5c2lzIHBhc3MgdG8gTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mby4gIFRoZQorLy8vIGRpZmZlcmVuY2UgaXMgdGhhdCB3aXRoIHRoaXMgcGFzcyB0aGUgYmxvY2sgZnJlcXVlbmNpZXMgYXJlIG5vdCBjb21wdXRlZAorLy8vIHdoZW4gdGhlIGFuYWx5c2lzIHBhc3MgaXMgZXhlY3V0ZWQgYnV0IHJhdGhlciB3aGVuIHRoZSBCRkkgcmVzdWx0IGlzCisvLy8gZXhwbGljaXRseSByZXF1ZXN0ZWQgYnkgdGhlIGFuYWx5c2lzIGNsaWVudC4KKy8vLworLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0xBWllNQUNISU5FQkxPQ0tGUkVRVUVOQ1lJTkZPX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19MQVpZTUFDSElORUJMT0NLRlJFUVVFTkNZSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQnJhbmNoUHJvYmFiaWxpdHlJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVEb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVMb29wSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisvLy8gXGJyaWVmIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgYW5hbHlzaXMgcGFzcyB0byBNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvLgorLy8vIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgd2l0aCB0aGlzIHBhc3MsIHRoZSBibG9jayBmcmVxdWVuY2llcyBhcmUgbm90CisvLy8gY29tcHV0ZWQgd2hlbiB0aGUgYW5hbHlzaXMgcGFzcyBpcyBleGVjdXRlZCBidXQgcmF0aGVyIHdoZW4gdGhlIEJGSSByZXN1bHQKKy8vLyBpcyBleHBsaWNpdGx5IHJlcXVlc3RlZCBieSB0aGUgYW5hbHlzaXMgY2xpZW50LgorLy8vCisvLy8gVGhpcyB3b3JrcyBieSBjaGVja2luZyBxdWVyeWluZyBpZiBNQkZJIGlzIGF2YWlsYWJsZSBhbmQgb3RoZXJ3aXNlCisvLy8gZ2VuZXJhdGluZyBNQkZJIG9uIHRoZSBmbHkuICBJbiB0aGlzIGNhc2UgdGhlIHBhc3NlcyByZXF1aXJlZCBmb3IgKExJLCBEVCkKKy8vLyBhcmUgYWxzbyBxdWVyaWVkIGJlZm9yZSBiZWluZyBjb21wdXRlZCBvbiB0aGUgZmx5LgorLy8vCisvLy8gTm90ZSB0aGF0IGl0IGlzIGV4cGVjdGVkIHRoYXQgd2Ugd291bGRuJ3QgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZQorLy8vIG5ldyBQTSBzaW5jZSB3aXRoIHRoZSBuZXcgUE0sIGFuYWx5c2VzIGFyZSBleGVjdXRlZCBvbiBkZW1hbmQuCisKK2NsYXNzIExhenlNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvUGFzcyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKK3ByaXZhdGU6CisgIC8vLyBJZiBnZW5lcmF0ZWQgb24gdGhlIGZseSB0aGlzIG93biB0aGUgaW5zdGFuY2UuCisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8+IE93bmVkTUJGSTsKKworICAvLy8gSWYgZ2VuZXJhdGVkIG9uIHRoZSBmbHkgdGhpcyBvd24gdGhlIGluc3RhbmNlLgorICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxNYWNoaW5lTG9vcEluZm8+IE93bmVkTUxJOworCisgIC8vLyBJZiBnZW5lcmF0ZWQgb24gdGhlIGZseSB0aGlzIG93biB0aGUgaW5zdGFuY2UuCisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPE1hY2hpbmVEb21pbmF0b3JUcmVlPiBPd25lZE1EVDsKKworICAvLy8gVGhlIGZ1bmN0aW9uLgorICBNYWNoaW5lRnVuY3Rpb24gKk1GID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIENhbGN1bGF0ZSBNQkZJIGFuZCBhbGwgb3RoZXIgYW5hbHlzZXMgdGhhdCdzIG5vdCBhdmFpbGFibGUgYW5kCisgIC8vLyByZXF1aXJlZCBieSBCRkkuCisgIE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8gJmNhbGN1bGF0ZUlmTm90QXZhaWxhYmxlKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgTGF6eU1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm9QYXNzKCk7CisKKyAgLy8vIFxicmllZiBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGJsb2NrIGZyZXF1ZW5jaWVzLgorICBNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvICZnZXRCRkkoKSB7IHJldHVybiBjYWxjdWxhdGVJZk5vdEF2YWlsYWJsZSgpOyB9CisKKyAgLy8vIFxicmllZiBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGJsb2NrIGZyZXF1ZW5jaWVzLgorICBjb25zdCBNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvICZnZXRCRkkoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhbGN1bGF0ZUlmTm90QXZhaWxhYmxlKCk7CisgIH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGKSBvdmVycmlkZTsKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGU7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUgKk0pIGNvbnN0IG92ZXJyaWRlOworfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xleGljYWxTY29wZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MZXhpY2FsU2NvcGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhNTAzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MZXhpY2FsU2NvcGVzLmgKQEAgLTAsMCArMSwyNTggQEAKKy8vPT09LSBMZXhpY2FsU2NvcGVzLmNwcCAtIENvbGxlY3RpbmcgbGV4aWNhbCBzY29wZSBpbmZvIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgTGV4aWNhbFNjb3BlcyBhbmFseXNpcy4KKy8vCisvLyBUaGlzIHBhc3MgY29sbGVjdHMgbGV4aWNhbCBzY29wZSBpbmZvcm1hdGlvbiBhbmQgbWFwcyBtYWNoaW5lIGluc3RydWN0aW9ucworLy8gdG8gcmVzcGVjdGl2ZSBsZXhpY2FsIHNjb3Blcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9MRVhJQ0FMU0NPUEVTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0xFWElDQUxTQ09QRVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RlYnVnSW5mb01ldGFkYXRhLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBNRE5vZGU7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gSW5zblJhbmdlIC0gVGhpcyBpcyB1c2VkIHRvIHRyYWNrIHJhbmdlIG9mIGluc3RydWN0aW9ucyB3aXRoIGlkZW50aWNhbAorLy8vIGxleGljYWwgc2NvcGUuCisvLy8KK3VzaW5nIEluc25SYW5nZSA9IHN0ZDo6cGFpcjxjb25zdCBNYWNoaW5lSW5zdHIgKiwgY29uc3QgTWFjaGluZUluc3RyICo+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIExleGljYWxTY29wZSAtIFRoaXMgY2xhc3MgaXMgdXNlZCB0byB0cmFjayBzY29wZSBpbmZvcm1hdGlvbi4KKy8vLworY2xhc3MgTGV4aWNhbFNjb3BlIHsKK3B1YmxpYzoKKyAgTGV4aWNhbFNjb3BlKExleGljYWxTY29wZSAqUCwgY29uc3QgRElMb2NhbFNjb3BlICpELCBjb25zdCBESUxvY2F0aW9uICpJLAorICAgICAgICAgICAgICAgYm9vbCBBKQorICAgICAgOiBQYXJlbnQoUCksIERlc2MoRCksIElubGluZWRBdExvY2F0aW9uKEkpLCBBYnN0cmFjdFNjb3BlKEEpIHsKKyAgICBhc3NlcnQoRCk7CisgICAgYXNzZXJ0KEQtPmdldFN1YnByb2dyYW0oKS0+Z2V0VW5pdCgpLT5nZXRFbWlzc2lvbktpbmQoKSAhPQorICAgICAgICAgICBESUNvbXBpbGVVbml0OjpOb0RlYnVnICYmCisgICAgICAgICAgICJEb24ndCBidWlsZCBsZXhpY2FsIHNjb3BlcyBmb3Igbm9uLWRlYnVnIGxvY2F0aW9ucyIpOworICAgIGFzc2VydChELT5pc1Jlc29sdmVkKCkgJiYgIkV4cGVjdGVkIHJlc29sdmVkIG5vZGUiKTsKKyAgICBhc3NlcnQoKCFJIHx8IEktPmlzUmVzb2x2ZWQoKSkgJiYgIkV4cGVjdGVkIHJlc29sdmVkIG5vZGUiKTsKKyAgICBpZiAoUGFyZW50KQorICAgICAgUGFyZW50LT5hZGRDaGlsZCh0aGlzKTsKKyAgfQorCisgIC8vIEFjY2Vzc29ycy4KKyAgTGV4aWNhbFNjb3BlICpnZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBQYXJlbnQ7IH0KKyAgY29uc3QgTUROb2RlICpnZXREZXNjKCkgY29uc3QgeyByZXR1cm4gRGVzYzsgfQorICBjb25zdCBESUxvY2F0aW9uICpnZXRJbmxpbmVkQXQoKSBjb25zdCB7IHJldHVybiBJbmxpbmVkQXRMb2NhdGlvbjsgfQorICBjb25zdCBESUxvY2FsU2NvcGUgKmdldFNjb3BlTm9kZSgpIGNvbnN0IHsgcmV0dXJuIERlc2M7IH0KKyAgYm9vbCBpc0Fic3RyYWN0U2NvcGUoKSBjb25zdCB7IHJldHVybiBBYnN0cmFjdFNjb3BlOyB9CisgIFNtYWxsVmVjdG9ySW1wbDxMZXhpY2FsU2NvcGUgKj4gJmdldENoaWxkcmVuKCkgeyByZXR1cm4gQ2hpbGRyZW47IH0KKyAgU21hbGxWZWN0b3JJbXBsPEluc25SYW5nZT4gJmdldFJhbmdlcygpIHsgcmV0dXJuIFJhbmdlczsgfQorCisgIC8vLyBhZGRDaGlsZCAtIEFkZCBhIGNoaWxkIHNjb3BlLgorICB2b2lkIGFkZENoaWxkKExleGljYWxTY29wZSAqUykgeyBDaGlsZHJlbi5wdXNoX2JhY2soUyk7IH0KKworICAvLy8gb3Blbkluc25SYW5nZSAtIFRoaXMgc2NvcGUgY292ZXJzIGluc3RydWN0aW9uIHJhbmdlIHN0YXJ0aW5nIGZyb20gTUkuCisgIHZvaWQgb3Blbkluc25SYW5nZShjb25zdCBNYWNoaW5lSW5zdHIgKk1JKSB7CisgICAgaWYgKCFGaXJzdEluc24pCisgICAgICBGaXJzdEluc24gPSBNSTsKKworICAgIGlmIChQYXJlbnQpCisgICAgICBQYXJlbnQtPm9wZW5JbnNuUmFuZ2UoTUkpOworICB9CisKKyAgLy8vIGV4dGVuZEluc25SYW5nZSAtIEV4dGVuZCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiByYW5nZSBjb3ZlcmVkIGJ5CisgIC8vLyB0aGlzIHNjb3BlLgorICB2b2lkIGV4dGVuZEluc25SYW5nZShjb25zdCBNYWNoaW5lSW5zdHIgKk1JKSB7CisgICAgYXNzZXJ0KEZpcnN0SW5zbiAmJiAiTUkgUmFuZ2UgaXMgbm90IG9wZW4hIik7CisgICAgTGFzdEluc24gPSBNSTsKKyAgICBpZiAoUGFyZW50KQorICAgICAgUGFyZW50LT5leHRlbmRJbnNuUmFuZ2UoTUkpOworICB9CisKKyAgLy8vIGNsb3NlSW5zblJhbmdlIC0gQ3JlYXRlIGEgcmFuZ2UgYmFzZWQgb24gRmlyc3RJbnNuIGFuZCBMYXN0SW5zbiBjb2xsZWN0ZWQKKyAgLy8vIHVudGlsIG5vdy4gVGhpcyBpcyB1c2VkIHdoZW4gYSBuZXcgc2NvcGUgaXMgZW5jb3VudGVyZWQgd2hpbGUgd2Fsa2luZworICAvLy8gbWFjaGluZSBpbnN0cnVjdGlvbnMuCisgIHZvaWQgY2xvc2VJbnNuUmFuZ2UoTGV4aWNhbFNjb3BlICpOZXdTY29wZSA9IG51bGxwdHIpIHsKKyAgICBhc3NlcnQoTGFzdEluc24gJiYgIkxhc3QgaW5zbiBtaXNzaW5nISIpOworICAgIFJhbmdlcy5wdXNoX2JhY2soSW5zblJhbmdlKEZpcnN0SW5zbiwgTGFzdEluc24pKTsKKyAgICBGaXJzdEluc24gPSBudWxscHRyOworICAgIExhc3RJbnNuID0gbnVsbHB0cjsKKyAgICAvLyBJZiBQYXJlbnQgZG9taW5hdGVzIE5ld1Njb3BlIHRoZW4gZG8gbm90IGNsb3NlIFBhcmVudCdzIGluc3RydWN0aW9uCisgICAgLy8gcmFuZ2UuCisgICAgaWYgKFBhcmVudCAmJiAoIU5ld1Njb3BlIHx8ICFQYXJlbnQtPmRvbWluYXRlcyhOZXdTY29wZSkpKQorICAgICAgUGFyZW50LT5jbG9zZUluc25SYW5nZShOZXdTY29wZSk7CisgIH0KKworICAvLy8gZG9taW5hdGVzIC0gUmV0dXJuIHRydWUgaWYgY3VycmVudCBzY29wZSBkb21pbmF0ZXMgZ2l2ZW4gbGV4aWNhbCBzY29wZS4KKyAgYm9vbCBkb21pbmF0ZXMoY29uc3QgTGV4aWNhbFNjb3BlICpTKSBjb25zdCB7CisgICAgaWYgKFMgPT0gdGhpcykKKyAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChERlNJbiA8IFMtPmdldERGU0luKCkgJiYgREZTT3V0ID4gUy0+Z2V0REZTT3V0KCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBEZXB0aCBGaXJzdCBTZWFyY2ggc3VwcG9ydCB0byB3YWxrIGFuZCBtYW5pcHVsYXRlIExleGljYWxTY29wZSBoaWVyYXJjaHkuCisgIHVuc2lnbmVkIGdldERGU091dCgpIGNvbnN0IHsgcmV0dXJuIERGU091dDsgfQorICB2b2lkIHNldERGU091dCh1bnNpZ25lZCBPKSB7IERGU091dCA9IE87IH0KKyAgdW5zaWduZWQgZ2V0REZTSW4oKSBjb25zdCB7IHJldHVybiBERlNJbjsgfQorICB2b2lkIHNldERGU0luKHVuc2lnbmVkIEkpIHsgREZTSW4gPSBJOyB9CisKKyAgLy8vIGR1bXAgLSBwcmludCBsZXhpY2FsIHNjb3BlLgorICB2b2lkIGR1bXAodW5zaWduZWQgSW5kZW50ID0gMCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIExleGljYWxTY29wZSAqUGFyZW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcmVudCB0byB0aGlzIHNjb3BlLgorICBjb25zdCBESUxvY2FsU2NvcGUgKkRlc2M7ICAgICAgICAgICAgICAgICAgICAvLyBEZWJ1ZyBpbmZvIGRlc2NyaXB0b3IuCisgIGNvbnN0IERJTG9jYXRpb24gKklubGluZWRBdExvY2F0aW9uOyAgICAgICAgIC8vIExvY2F0aW9uIGF0IHdoaWNoIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NvcGUgaXMgaW5saW5lZC4KKyAgYm9vbCBBYnN0cmFjdFNjb3BlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWJzdHJhY3QgU2NvcGUKKyAgU21hbGxWZWN0b3I8TGV4aWNhbFNjb3BlICosIDQ+IENoaWxkcmVuOyAgICAgLy8gU2NvcGVzIGRlZmluZWQgaW4gc2NvcGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnRlbnRzIG5vdCBvd25lZC4KKyAgU21hbGxWZWN0b3I8SW5zblJhbmdlLCA0PiBSYW5nZXM7CisKKyAgY29uc3QgTWFjaGluZUluc3RyICpMYXN0SW5zbiA9IG51bGxwdHI7ICAvLyBMYXN0IGluc3RydWN0aW9uIG9mIHRoaXMgc2NvcGUuCisgIGNvbnN0IE1hY2hpbmVJbnN0ciAqRmlyc3RJbnNuID0gbnVsbHB0cjsgLy8gRmlyc3QgaW5zdHJ1Y3Rpb24gb2YgdGhpcyBzY29wZS4KKyAgdW5zaWduZWQgREZTSW4gPSAwOyAvLyBJbiAmIE91dCBEZXB0aCB1c2UgdG8gZGV0ZXJtaW5lIHNjb3BlIG5lc3RpbmcuCisgIHVuc2lnbmVkIERGU091dCA9IDA7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIExleGljYWxTY29wZXMgLSAgVGhpcyBjbGFzcyBwcm92aWRlcyBpbnRlcmZhY2UgdG8gY29sbGVjdCBhbmQgdXNlIGxleGljYWwKKy8vLyBzY29waW5nIGluZm9ybWF0aW9uIGZyb20gbWFjaGluZSBpbnN0cnVjdGlvbi4KKy8vLworY2xhc3MgTGV4aWNhbFNjb3BlcyB7CitwdWJsaWM6CisgIExleGljYWxTY29wZXMoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIGluaXRpYWxpemUgLSBTY2FuIG1hY2hpbmUgZnVuY3Rpb24gYW5kIGNvbnN0dWN0IGxleGljYWwgc2NvcGUgbmVzdCwgcmVzZXRzCisgIC8vLyB0aGUgaW5zdGFuY2UgaWYgbmVjZXNzYXJ5LgorICB2b2lkIGluaXRpYWxpemUoY29uc3QgTWFjaGluZUZ1bmN0aW9uICYpOworCisgIC8vLyByZWxlYXNlTWVtb3J5IC0gcmVsZWFzZSBtZW1vcnkuCisgIHZvaWQgcmVzZXQoKTsKKworICAvLy8gZW1wdHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhbnkgbGV4aWNhbCBzY29wZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUuCisgIGJvb2wgZW1wdHkoKSB7IHJldHVybiBDdXJyZW50Rm5MZXhpY2FsU2NvcGUgPT0gbnVsbHB0cjsgfQorCisgIC8vLyBnZXRDdXJyZW50RnVuY3Rpb25TY29wZSAtIFJldHVybiBsZXhpY2FsIHNjb3BlIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgTGV4aWNhbFNjb3BlICpnZXRDdXJyZW50RnVuY3Rpb25TY29wZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3VycmVudEZuTGV4aWNhbFNjb3BlOworICB9CisKKyAgLy8vIGdldE1hY2hpbmVCYXNpY0Jsb2NrcyAtIFBvcHVsYXRlIGdpdmVuIHNldCB1c2luZyBtYWNoaW5lIGJhc2ljIGJsb2NrcworICAvLy8gd2hpY2ggaGF2ZSBtYWNoaW5lIGluc3RydWN0aW9ucyB0aGF0IGJlbG9uZyB0byBsZXhpY2FsIHNjb3BlIGlkZW50aWZpZWQgYnkKKyAgLy8vIERlYnVnTG9jLgorICB2b2lkIGdldE1hY2hpbmVCYXNpY0Jsb2Nrcyhjb25zdCBESUxvY2F0aW9uICpETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXRJbXBsPGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICo+ICZNQkJzKTsKKworICAvLy8gZG9taW5hdGVzIC0gUmV0dXJuIHRydWUgaWYgRGVidWdMb2MncyBsZXhpY2FsIHNjb3BlIGRvbWluYXRlcyBhdCBsZWFzdCBvbmUKKyAgLy8vIG1hY2hpbmUgaW5zdHJ1Y3Rpb24ncyBsZXhpY2FsIHNjb3BlIGluIGEgZ2l2ZW4gbWFjaGluZSBiYXNpYyBibG9jay4KKyAgYm9vbCBkb21pbmF0ZXMoY29uc3QgRElMb2NhdGlvbiAqREwsIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpOworCisgIC8vLyBmaW5kTGV4aWNhbFNjb3BlIC0gRmluZCBsZXhpY2FsIHNjb3BlLCBlaXRoZXIgcmVndWxhciBvciBpbmxpbmVkLCBmb3IgdGhlCisgIC8vLyBnaXZlbiBEZWJ1Z0xvYy4gUmV0dXJuIE5VTEwgaWYgbm90IGZvdW5kLgorICBMZXhpY2FsU2NvcGUgKmZpbmRMZXhpY2FsU2NvcGUoY29uc3QgRElMb2NhdGlvbiAqREwpOworCisgIC8vLyBnZXRBYnN0cmFjdFNjb3Blc0xpc3QgLSBSZXR1cm4gYSByZWZlcmVuY2UgdG8gbGlzdCBvZiBhYnN0cmFjdCBzY29wZXMuCisgIEFycmF5UmVmPExleGljYWxTY29wZSAqPiBnZXRBYnN0cmFjdFNjb3Blc0xpc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIEFic3RyYWN0U2NvcGVzTGlzdDsKKyAgfQorCisgIC8vLyBmaW5kQWJzdHJhY3RTY29wZSAtIEZpbmQgYW4gYWJzdHJhY3Qgc2NvcGUgb3IgcmV0dXJuIG51bGwuCisgIExleGljYWxTY29wZSAqZmluZEFic3RyYWN0U2NvcGUoY29uc3QgRElMb2NhbFNjb3BlICpOKSB7CisgICAgYXV0byBJID0gQWJzdHJhY3RTY29wZU1hcC5maW5kKE4pOworICAgIHJldHVybiBJICE9IEFic3RyYWN0U2NvcGVNYXAuZW5kKCkgPyAmSS0+c2Vjb25kIDogbnVsbHB0cjsKKyAgfQorCisgIC8vLyBmaW5kSW5saW5lZFNjb3BlIC0gRmluZCBhbiBpbmxpbmVkIHNjb3BlIGZvciB0aGUgZ2l2ZW4gc2NvcGUvaW5saW5lZC1hdC4KKyAgTGV4aWNhbFNjb3BlICpmaW5kSW5saW5lZFNjb3BlKGNvbnN0IERJTG9jYWxTY29wZSAqTiwgY29uc3QgRElMb2NhdGlvbiAqSUEpIHsKKyAgICBhdXRvIEkgPSBJbmxpbmVkTGV4aWNhbFNjb3BlTWFwLmZpbmQoc3RkOjptYWtlX3BhaXIoTiwgSUEpKTsKKyAgICByZXR1cm4gSSAhPSBJbmxpbmVkTGV4aWNhbFNjb3BlTWFwLmVuZCgpID8gJkktPnNlY29uZCA6IG51bGxwdHI7CisgIH0KKworICAvLy8gZmluZExleGljYWxTY29wZSAtIEZpbmQgcmVndWxhciBsZXhpY2FsIHNjb3BlIG9yIHJldHVybiBudWxsLgorICBMZXhpY2FsU2NvcGUgKmZpbmRMZXhpY2FsU2NvcGUoY29uc3QgRElMb2NhbFNjb3BlICpOKSB7CisgICAgYXV0byBJID0gTGV4aWNhbFNjb3BlTWFwLmZpbmQoTik7CisgICAgcmV0dXJuIEkgIT0gTGV4aWNhbFNjb3BlTWFwLmVuZCgpID8gJkktPnNlY29uZCA6IG51bGxwdHI7CisgIH0KKworICAvLy8gZHVtcCAtIFByaW50IGRhdGEgc3RydWN0dXJlcyB0byBkYmdzKCkuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBnZXRPckNyZWF0ZUFic3RyYWN0U2NvcGUgLSBGaW5kIG9yIGNyZWF0ZSBhbiBhYnN0cmFjdCBsZXhpY2FsIHNjb3BlLgorICBMZXhpY2FsU2NvcGUgKmdldE9yQ3JlYXRlQWJzdHJhY3RTY29wZShjb25zdCBESUxvY2FsU2NvcGUgKlNjb3BlKTsKKworcHJpdmF0ZToKKyAgLy8vIGdldE9yQ3JlYXRlTGV4aWNhbFNjb3BlIC0gRmluZCBsZXhpY2FsIHNjb3BlIGZvciB0aGUgZ2l2ZW4gU2NvcGUvSUEuIElmCisgIC8vLyBub3QgYXZhaWxhYmxlIHRoZW4gY3JlYXRlIG5ldyBsZXhpY2FsIHNjb3BlLgorICBMZXhpY2FsU2NvcGUgKmdldE9yQ3JlYXRlTGV4aWNhbFNjb3BlKGNvbnN0IERJTG9jYWxTY29wZSAqU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRElMb2NhdGlvbiAqSUEgPSBudWxscHRyKTsKKyAgTGV4aWNhbFNjb3BlICpnZXRPckNyZWF0ZUxleGljYWxTY29wZShjb25zdCBESUxvY2F0aW9uICpETCkgeworICAgIHJldHVybiBETCA/IGdldE9yQ3JlYXRlTGV4aWNhbFNjb3BlKERMLT5nZXRTY29wZSgpLCBETC0+Z2V0SW5saW5lZEF0KCkpCisgICAgICAgICAgICAgIDogbnVsbHB0cjsKKyAgfQorCisgIC8vLyBnZXRPckNyZWF0ZVJlZ3VsYXJTY29wZSAtIEZpbmQgb3IgY3JlYXRlIGEgcmVndWxhciBsZXhpY2FsIHNjb3BlLgorICBMZXhpY2FsU2NvcGUgKmdldE9yQ3JlYXRlUmVndWxhclNjb3BlKGNvbnN0IERJTG9jYWxTY29wZSAqU2NvcGUpOworCisgIC8vLyBnZXRPckNyZWF0ZUlubGluZWRTY29wZSAtIEZpbmQgb3IgY3JlYXRlIGFuIGlubGluZWQgbGV4aWNhbCBzY29wZS4KKyAgTGV4aWNhbFNjb3BlICpnZXRPckNyZWF0ZUlubGluZWRTY29wZShjb25zdCBESUxvY2FsU2NvcGUgKlNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERJTG9jYXRpb24gKklubGluZWRBdCk7CisKKyAgLy8vIGV4dHJhY3RMZXhpY2FsU2NvcGVzIC0gRXh0cmFjdCBpbnN0cnVjdGlvbiByYW5nZXMgZm9yIGVhY2ggbGV4aWNhbCBzY29wZXMKKyAgLy8vIGZvciB0aGUgZ2l2ZW4gbWFjaGluZSBmdW5jdGlvbi4KKyAgdm9pZCBleHRyYWN0TGV4aWNhbFNjb3BlcyhTbWFsbFZlY3RvckltcGw8SW5zblJhbmdlPiAmTUlSYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8Y29uc3QgTWFjaGluZUluc3RyICosIExleGljYWxTY29wZSAqPiAmTSk7CisgIHZvaWQgY29uc3RydWN0U2NvcGVOZXN0KExleGljYWxTY29wZSAqU2NvcGUpOworICB2b2lkCisgIGFzc2lnbkluc3RydWN0aW9uUmFuZ2VzKFNtYWxsVmVjdG9ySW1wbDxJbnNuUmFuZ2U+ICZNSVJhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8Y29uc3QgTWFjaGluZUluc3RyICosIExleGljYWxTY29wZSAqPiAmTSk7CisKKyAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRiA9IG51bGxwdHI7CisKKyAgLy8vIExleGljYWxTY29wZU1hcCAtIFRyYWNrcyB0aGUgc2NvcGVzIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICAvLyBVc2UgYW4gdW5vcmRlcmVkX21hcCB0byBlbnN1cmUgdmFsdWUgcG9pbnRlciB2YWxpZGl0eSBvdmVyIGluc2VydGlvbi4KKyAgc3RkOjp1bm9yZGVyZWRfbWFwPGNvbnN0IERJTG9jYWxTY29wZSAqLCBMZXhpY2FsU2NvcGU+IExleGljYWxTY29wZU1hcDsKKworICAvLy8gSW5saW5lZExleGljYWxTY29wZU1hcCAtIFRyYWNrcyBpbmxpbmVkIGZ1bmN0aW9uIHNjb3BlcyBpbiBjdXJyZW50CisgIC8vLyBmdW5jdGlvbi4KKyAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6cGFpcjxjb25zdCBESUxvY2FsU2NvcGUgKiwgY29uc3QgRElMb2NhdGlvbiAqPiwKKyAgICAgICAgICAgICAgICAgICAgIExleGljYWxTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgIHBhaXJfaGFzaDxjb25zdCBESUxvY2FsU2NvcGUgKiwgY29uc3QgRElMb2NhdGlvbiAqPj4KKyAgICAgIElubGluZWRMZXhpY2FsU2NvcGVNYXA7CisKKyAgLy8vIEFic3RyYWN0U2NvcGVNYXAgLSBUaGVzZSBzY29wZXMgYXJlICBub3QgaW5jbHVkZWQgTGV4aWNhbFNjb3BlTWFwLgorICAvLyBVc2UgYW4gdW5vcmRlcmVkX21hcCB0byBlbnN1cmUgdmFsdWUgcG9pbnRlciB2YWxpZGl0eSBvdmVyIGluc2VydGlvbi4KKyAgc3RkOjp1bm9yZGVyZWRfbWFwPGNvbnN0IERJTG9jYWxTY29wZSAqLCBMZXhpY2FsU2NvcGU+IEFic3RyYWN0U2NvcGVNYXA7CisKKyAgLy8vIEFic3RyYWN0U2NvcGVzTGlzdCAtIFRyYWNrcyBhYnN0cmFjdCBzY29wZXMgY29uc3RydWN0ZWQgd2hpbGUgcHJvY2Vzc2luZworICAvLy8gYSBmdW5jdGlvbi4KKyAgU21hbGxWZWN0b3I8TGV4aWNhbFNjb3BlICosIDQ+IEFic3RyYWN0U2NvcGVzTGlzdDsKKworICAvLy8gQ3VycmVudEZuTGV4aWNhbFNjb3BlIC0gVG9wIGxldmVsIHNjb3BlIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgLy8vCisgIExleGljYWxTY29wZSAqQ3VycmVudEZuTGV4aWNhbFNjb3BlID0gbnVsbHB0cjsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTEVYSUNBTFNDT1BFU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGlua0FsbEFzbVdyaXRlckNvbXBvbmVudHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaW5rQWxsQXNtV3JpdGVyQ29tcG9uZW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMDQ2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGlua0FsbEFzbVdyaXRlckNvbXBvbmVudHMuaApAQCAtMCwwICsxLDM4IEBACisvLz09PS0gbGx2bS9Db2RlZ2VuL0xpbmtBbGxBc21Xcml0ZXJDb21wb25lbnRzLmggLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIHB1bGxzIGluIGFsbCBhc3NlbWJsZXIgd3JpdGVyIHJlbGF0ZWQgcGFzc2VzIGZvciB0b29scyBsaWtlCisvLyBsbGMgdGhhdCBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9MSU5LQUxMQVNNV1JJVEVSQ09NUE9ORU5UU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9MSU5LQUxMQVNNV1JJVEVSQ09NUE9ORU5UU19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR0NzLmgiCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworbmFtZXNwYWNlIHsKKyAgc3RydWN0IEZvcmNlQXNtV3JpdGVyTGlua2luZyB7CisgICAgRm9yY2VBc21Xcml0ZXJMaW5raW5nKCkgeworICAgICAgLy8gV2UgbXVzdCByZWZlcmVuY2UgdGhlIHBsdWctaW5zIGluIHN1Y2ggYSB3YXkgdGhhdCBjb21waWxlcnMgd2lsbCBub3QKKyAgICAgIC8vIGRlbGV0ZSBpdCBhbGwgYXMgZGVhZCBjb2RlLCBldmVuIHdpdGggd2hvbGUgcHJvZ3JhbSBvcHRpbWl6YXRpb24sCisgICAgICAvLyB5ZXQgaXMgZWZmZWN0aXZlbHkgYSBOTy1PUC4gQXMgdGhlIGNvbXBpbGVyIGlzbid0IHNtYXJ0IGVub3VnaAorICAgICAgLy8gdG8ga25vdyB0aGF0IGdldGVudigpIG5ldmVyIHJldHVybnMgLTEsIHRoaXMgd2lsbCBkbyB0aGUgam9iLgorICAgICAgaWYgKHN0ZDo6Z2V0ZW52KCJiYXIiKSAhPSAoY2hhciopIC0xKQorICAgICAgICByZXR1cm47CisKKyAgICAgIGxsdm06OmxpbmtPY2FtbEdDUHJpbnRlcigpOworICAgICAgbGx2bTo6bGlua0VybGFuZ0dDUHJpbnRlcigpOworCisgICAgfQorICB9IEZvcmNlQXNtV3JpdGVyTGlua2luZzsgLy8gRm9yY2UgbGluayBieSBjcmVhdGluZyBhIGdsb2JhbCBkZWZpbml0aW9uLgorfQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0xJTktBTExBU01XUklURVJDT01QT05FTlRTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaW5rQWxsQ29kZWdlbkNvbXBvbmVudHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaW5rQWxsQ29kZWdlbkNvbXBvbmVudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWUxMzFlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpbmtBbGxDb2RlZ2VuQ29tcG9uZW50cy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vPT09LSBsbHZtL0NvZGVnZW4vTGlua0FsbENvZGVnZW5Db21wb25lbnRzLmggLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgcHVsbHMgaW4gYWxsIGNvZGVnZW4gcmVsYXRlZCBwYXNzZXMgZm9yIHRvb2xzIGxpa2UgbGxpIGFuZAorLy8gbGxjIHRoYXQgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTElOS0FMTENPREVHRU5DT01QT05FTlRTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0xJTktBTExDT0RFR0VOQ09NUE9ORU5UU19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR0NzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TY2hlZHVsZXJSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlIDxjc3RkbGliPgorCituYW1lc3BhY2UgeworICBzdHJ1Y3QgRm9yY2VDb2RlZ2VuTGlua2luZyB7CisgICAgRm9yY2VDb2RlZ2VuTGlua2luZygpIHsKKyAgICAgIC8vIFdlIG11c3QgcmVmZXJlbmNlIHRoZSBwYXNzZXMgaW4gc3VjaCBhIHdheSB0aGF0IGNvbXBpbGVycyB3aWxsIG5vdAorICAgICAgLy8gZGVsZXRlIGl0IGFsbCBhcyBkZWFkIGNvZGUsIGV2ZW4gd2l0aCB3aG9sZSBwcm9ncmFtIG9wdGltaXphdGlvbiwKKyAgICAgIC8vIHlldCBpcyBlZmZlY3RpdmVseSBhIE5PLU9QLiBBcyB0aGUgY29tcGlsZXIgaXNuJ3Qgc21hcnQgZW5vdWdoCisgICAgICAvLyB0byBrbm93IHRoYXQgZ2V0ZW52KCkgbmV2ZXIgcmV0dXJucyAtMSwgdGhpcyB3aWxsIGRvIHRoZSBqb2IuCisgICAgICBpZiAoc3RkOjpnZXRlbnYoImJhciIpICE9IChjaGFyKikgLTEpCisgICAgICAgIHJldHVybjsKKworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUZhc3RSZWdpc3RlckFsbG9jYXRvcigpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUJhc2ljUmVnaXN0ZXJBbGxvY2F0b3IoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVHcmVlZHlSZWdpc3RlckFsbG9jYXRvcigpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZURlZmF1bHRQQlFQUmVnaXN0ZXJBbGxvY2F0b3IoKTsKKworICAgICAgbGx2bTo6bGlua0NvcmVDTFJHQygpOworICAgICAgbGx2bTo6bGlua09jYW1sR0MoKTsKKyAgICAgIGxsdm06OmxpbmtFcmxhbmdHQygpOworICAgICAgbGx2bTo6bGlua1NoYWRvd1N0YWNrR0MoKTsKKyAgICAgIGxsdm06OmxpbmtTdGF0ZXBvaW50RXhhbXBsZUdDKCk7CisKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVCVVJSTGlzdERBR1NjaGVkdWxlcihudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkNvZGVHZW5PcHQ6OkRlZmF1bHQpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVNvdXJjZUxpc3REQUdTY2hlZHVsZXIobnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkNvZGVHZW5PcHQ6OkRlZmF1bHQpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUh5YnJpZExpc3REQUdTY2hlZHVsZXIobnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkNvZGVHZW5PcHQ6OkRlZmF1bHQpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUZhc3REQUdTY2hlZHVsZXIobnVsbHB0ciwgbGx2bTo6Q29kZUdlbk9wdDo6RGVmYXVsdCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRGVmYXVsdFNjaGVkdWxlcihudWxscHRyLCBsbHZtOjpDb2RlR2VuT3B0OjpEZWZhdWx0KTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVWTElXREFHU2NoZWR1bGVyKG51bGxwdHIsIGxsdm06OkNvZGVHZW5PcHQ6OkRlZmF1bHQpOworCisgICAgfQorICB9IEZvcmNlQ29kZWdlbkxpbmtpbmc7IC8vIEZvcmNlIGxpbmsgYnkgY3JlYXRpbmcgYSBnbG9iYWwgZGVmaW5pdGlvbi4KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRmYTg3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWwuaApAQCAtMCwwICsxLDk0MyBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWwuaCAtIEludGVydmFsIHJlcHJlc2VudGF0aW9uIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgTGl2ZVJhbmdlIGFuZCBMaXZlSW50ZXJ2YWwgY2xhc3Nlcy4gIEdpdmVuIHNvbWUKKy8vIG51bWJlcmluZyBvZiBlYWNoIHRoZSBtYWNoaW5lIGluc3RydWN0aW9ucyBhbiBpbnRlcnZhbCBbaSwgaikgaXMgc2FpZCB0byBiZSBhCisvLyBsaXZlIHJhbmdlIGZvciByZWdpc3RlciB2IGlmIHRoZXJlIGlzIG5vIGluc3RydWN0aW9uIHdpdGggbnVtYmVyIGonID49IGoKKy8vIHN1Y2ggdGhhdCB2IGlzIGxpdmUgYXQgaicgYW5kIHRoZXJlIGlzIG5vIGluc3RydWN0aW9uIHdpdGggbnVtYmVyIGknIDwgaSBzdWNoCisvLyB0aGF0IHYgaXMgbGl2ZSBhdCBpJy4gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiByYW5nZXMgY2FuIGhhdmUgaG9sZXMsCisvLyBpLmUuIGEgcmFuZ2UgbWlnaHQgbG9vayBsaWtlIFsxLDIwKSwgWzUwLDY1KSwgWzEwMDAsMTAwMSkuICBFYWNoCisvLyBpbmRpdmlkdWFsIHNlZ21lbnQgaXMgcmVwcmVzZW50ZWQgYXMgYW4gaW5zdGFuY2Ugb2YgTGl2ZVJhbmdlOjpTZWdtZW50LAorLy8gYW5kIHRoZSB3aG9sZSByYW5nZSBpcyByZXByZXNlbnRlZCBhcyBhbiBpbnN0YW5jZSBvZiBMaXZlUmFuZ2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTElWRUlOVEVSVkFMX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0xJVkVJTlRFUlZBTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ludEVxQ2xhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2xvdEluZGV4ZXMuaCIKKyNpbmNsdWRlICJsbHZtL01DL0xhbmVCaXRtYXNrLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisgIGNsYXNzIENvYWxlc2NlclBhaXI7CisgIGNsYXNzIExpdmVJbnRlcnZhbHM7CisgIGNsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CisgIGNsYXNzIHJhd19vc3RyZWFtOworCisgIC8vLyBWTkluZm8gLSBWYWx1ZSBOdW1iZXIgSW5mb3JtYXRpb24uCisgIC8vLyBUaGlzIGNsYXNzIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGEgbWFjaGluZSBsZXZlbCB2YWx1ZXMsIGluY2x1ZGluZworICAvLy8gZGVmaW5pdGlvbiBhbmQgdXNlIHBvaW50cy4KKyAgLy8vCisgIGNsYXNzIFZOSW5mbyB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBBbGxvY2F0b3IgPSBCdW1wUHRyQWxsb2NhdG9yOworCisgICAgLy8vIFRoZSBJRCBudW1iZXIgb2YgdGhpcyB2YWx1ZS4KKyAgICB1bnNpZ25lZCBpZDsKKworICAgIC8vLyBUaGUgaW5kZXggb2YgdGhlIGRlZmluaW5nIGluc3RydWN0aW9uLgorICAgIFNsb3RJbmRleCBkZWY7CisKKyAgICAvLy8gVk5JbmZvIGNvbnN0cnVjdG9yLgorICAgIFZOSW5mbyh1bnNpZ25lZCBpLCBTbG90SW5kZXggZCkgOiBpZChpKSwgZGVmKGQpIHt9CisKKyAgICAvLy8gVk5JbmZvIGNvbnN0cnVjdG9yLCBjb3BpZXMgdmFsdWVzIGZyb20gb3JpZywgZXhjZXB0IGZvciB0aGUgdmFsdWUgbnVtYmVyLgorICAgIFZOSW5mbyh1bnNpZ25lZCBpLCBjb25zdCBWTkluZm8gJm9yaWcpIDogaWQoaSksIGRlZihvcmlnLmRlZikge30KKworICAgIC8vLyBDb3B5IGZyb20gdGhlIHBhcmFtZXRlciBpbnRvIHRoaXMgVk5JbmZvLgorICAgIHZvaWQgY29weUZyb20oVk5JbmZvICZzcmMpIHsKKyAgICAgIGRlZiA9IHNyYy5kZWY7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIGlzIGRlZmluZWQgYnkgYSBQSEkgaW5zdHJ1Y3Rpb24gKG9yIHdhcywKKyAgICAvLy8gUEhJIGluc3RydWN0aW9ucyBtYXkgaGF2ZSBiZWVuIGVsaW1pbmF0ZWQpLgorICAgIC8vLyBQSEktZGVmcyBiZWdpbiBhdCBhIGJsb2NrIGJvdW5kYXJ5LCBhbGwgb3RoZXIgZGVmcyBiZWdpbiBhdCByZWdpc3RlciBvcgorICAgIC8vLyBFQyBzbG90cy4KKyAgICBib29sIGlzUEhJRGVmKCkgY29uc3QgeyByZXR1cm4gZGVmLmlzQmxvY2soKTsgfQorCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIGlzIHVudXNlZC4KKyAgICBib29sIGlzVW51c2VkKCkgY29uc3QgeyByZXR1cm4gIWRlZi5pc1ZhbGlkKCk7IH0KKworICAgIC8vLyBNYXJrIHRoaXMgdmFsdWUgYXMgdW51c2VkLgorICAgIHZvaWQgbWFya1VudXNlZCgpIHsgZGVmID0gU2xvdEluZGV4KCk7IH0KKyAgfTsKKworICAvLy8gUmVzdWx0IG9mIGEgTGl2ZVJhbmdlIHF1ZXJ5LiBUaGlzIGNsYXNzIGhpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgIC8vLyBvZiBsaXZlIHJhbmdlcywgYW5kIGl0IHNob3VsZCBiZSB1c2VkIGFzIHRoZSBwcmltYXJ5IGludGVyZmFjZSBmb3IKKyAgLy8vIGV4YW1pbmluZyBsaXZlIHJhbmdlcyBhcm91bmQgaW5zdHJ1Y3Rpb25zLgorICBjbGFzcyBMaXZlUXVlcnlSZXN1bHQgeworICAgIFZOSW5mbyAqY29uc3QgRWFybHlWYWw7CisgICAgVk5JbmZvICpjb25zdCBMYXRlVmFsOworICAgIGNvbnN0IFNsb3RJbmRleCBFbmRQb2ludDsKKyAgICBjb25zdCBib29sIEtpbGw7CisKKyAgcHVibGljOgorICAgIExpdmVRdWVyeVJlc3VsdChWTkluZm8gKkVhcmx5VmFsLCBWTkluZm8gKkxhdGVWYWwsIFNsb3RJbmRleCBFbmRQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBLaWxsKQorICAgICAgOiBFYXJseVZhbChFYXJseVZhbCksIExhdGVWYWwoTGF0ZVZhbCksIEVuZFBvaW50KEVuZFBvaW50KSwgS2lsbChLaWxsKQorICAgIHt9CisKKyAgICAvLy8gUmV0dXJuIHRoZSB2YWx1ZSB0aGF0IGlzIGxpdmUtaW4gdG8gdGhlIGluc3RydWN0aW9uLiBUaGlzIGlzIHRoZSB2YWx1ZQorICAgIC8vLyB0aGF0IHdpbGwgYmUgcmVhZCBieSB0aGUgaW5zdHJ1Y3Rpb24ncyB1c2Ugb3BlcmFuZHMuIFJldHVybiBOVUxMIGlmIG5vCisgICAgLy8vIHZhbHVlIGlzIGxpdmUtaW4uCisgICAgVk5JbmZvICp2YWx1ZUluKCkgY29uc3QgeworICAgICAgcmV0dXJuIEVhcmx5VmFsOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGl2ZS1pbiB2YWx1ZSBpcyBraWxsZWQgYnkgdGhpcyBpbnN0cnVjdGlvbi4gVGhpcworICAgIC8vLyBtZWFucyB0aGF0IGVpdGhlciB0aGUgbGl2ZSByYW5nZSBlbmRzIGF0IHRoZSBpbnN0cnVjdGlvbiwgb3IgaXQgY2hhbmdlcworICAgIC8vLyB2YWx1ZS4KKyAgICBib29sIGlzS2lsbCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBLaWxsOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGhhcyBhIGRlYWQgZGVmLgorICAgIGJvb2wgaXNEZWFkRGVmKCkgY29uc3QgeworICAgICAgcmV0dXJuIEVuZFBvaW50LmlzRGVhZCgpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIHZhbHVlIGxlYXZpbmcgdGhlIGluc3RydWN0aW9uLCBpZiBhbnkuIFRoaXMgY2FuIGJlIGEKKyAgICAvLy8gbGl2ZS10aHJvdWdoIHZhbHVlLCBvciBhIGxpdmUgZGVmLiBBIGRlYWQgZGVmIHJldHVybnMgTlVMTC4KKyAgICBWTkluZm8gKnZhbHVlT3V0KCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzRGVhZERlZigpID8gbnVsbHB0ciA6IExhdGVWYWw7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIHZhbHVlIGFsaXZlIGF0IHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9uLCBpZiBhbnkuIFRoaXMgY2FuCisgICAgLy8vIGJlIGEgbGl2ZS10aHJvdWdoIHZhbHVlLCBhIGxpdmUgZGVmIG9yIGEgZGVhZCBkZWYuCisgICAgVk5JbmZvICp2YWx1ZU91dE9yRGVhZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMYXRlVmFsOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIHZhbHVlIGRlZmluZWQgYnkgdGhpcyBpbnN0cnVjdGlvbiwgaWYgYW55LiBUaGlzIGluY2x1ZGVzCisgICAgLy8vIGRlYWQgZGVmcywgaXQgaXMgdGhlIHZhbHVlIGNyZWF0ZWQgYnkgdGhlIGluc3RydWN0aW9uJ3MgZGVmIG9wZXJhbmRzLgorICAgIFZOSW5mbyAqdmFsdWVEZWZpbmVkKCkgY29uc3QgeworICAgICAgcmV0dXJuIEVhcmx5VmFsID09IExhdGVWYWwgPyBudWxscHRyIDogTGF0ZVZhbDsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGxhc3QgbGl2ZSByYW5nZSBzZWdtZW50IHRvIGludGVyYWN0IHdpdGgKKyAgICAvLy8gdGhlIGluc3RydWN0aW9uLCBpZiBhbnkuCisgICAgLy8vCisgICAgLy8vIFRoZSBlbmQgcG9pbnQgaXMgYW4gaW52YWxpZCBTbG90SW5kZXggb25seSBpZiB0aGUgbGl2ZSByYW5nZSBkb2Vzbid0CisgICAgLy8vIGludGVyc2VjdCB0aGUgaW5zdHJ1Y3Rpb24gYXQgYWxsLgorICAgIC8vLworICAgIC8vLyBUaGUgZW5kIHBvaW50IG1heSBiZSBhdCBvciBwYXN0IHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9uJ3MgYmFzaWMKKyAgICAvLy8gYmxvY2suIFRoYXQgbWVhbnMgdGhlIHZhbHVlIHdhcyBsaXZlIG91dCBvZiB0aGUgYmxvY2suCisgICAgU2xvdEluZGV4IGVuZFBvaW50KCkgY29uc3QgeworICAgICAgcmV0dXJuIEVuZFBvaW50OworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBsaXZlbmVzcyBvZiBhIHJlZ2lzdGVyLCBzdGFjayBzbG90LCBldGMuCisgIC8vLyBJdCBtYW5hZ2VzIGFuIG9yZGVyZWQgbGlzdCBvZiBTZWdtZW50IG9iamVjdHMuCisgIC8vLyBUaGUgU2VnbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBhIHN0YXRpYyBzaW5nbGUgYXNzaWdubWVudCBmb3JtOiBBdCBwbGFjZXMKKyAgLy8vIHdoZXJlIGEgbmV3IHZhbHVlIGlzIGRlZmluZWQgb3IgZGlmZmVyZW50IHZhbHVlcyByZWFjaCBhIENGRyBqb2luIGEgbmV3CisgIC8vLyBzZWdtZW50IHdpdGggYSBuZXcgdmFsdWUgbnVtYmVyIGlzIHVzZWQuCisgIGNsYXNzIExpdmVSYW5nZSB7CisgIHB1YmxpYzoKKyAgICAvLy8gVGhpcyByZXByZXNlbnRzIGEgc2ltcGxlIGNvbnRpbnVvdXMgbGl2ZW5lc3MgaW50ZXJ2YWwgZm9yIGEgdmFsdWUuCisgICAgLy8vIFRoZSBzdGFydCBwb2ludCBpcyBpbmNsdXNpdmUsIHRoZSBlbmQgcG9pbnQgZXhjbHVzaXZlLiBUaGVzZSBpbnRlcnZhbHMKKyAgICAvLy8gYXJlIHJlbmRlcmVkIGFzIFtzdGFydCxlbmQpLgorICAgIHN0cnVjdCBTZWdtZW50IHsKKyAgICAgIFNsb3RJbmRleCBzdGFydDsgIC8vIFN0YXJ0IHBvaW50IG9mIHRoZSBpbnRlcnZhbCAoaW5jbHVzaXZlKQorICAgICAgU2xvdEluZGV4IGVuZDsgICAgLy8gRW5kIHBvaW50IG9mIHRoZSBpbnRlcnZhbCAoZXhjbHVzaXZlKQorICAgICAgVk5JbmZvICp2YWxubyA9IG51bGxwdHI7IC8vIGlkZW50aWZpZXIgZm9yIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZ21lbnQuCisKKyAgICAgIFNlZ21lbnQoKSA9IGRlZmF1bHQ7CisKKyAgICAgIFNlZ21lbnQoU2xvdEluZGV4IFMsIFNsb3RJbmRleCBFLCBWTkluZm8gKlYpCisgICAgICAgIDogc3RhcnQoUyksIGVuZChFKSwgdmFsbm8oVikgeworICAgICAgICBhc3NlcnQoUyA8IEUgJiYgIkNhbm5vdCBjcmVhdGUgZW1wdHkgb3IgYmFja3dhcmRzIHNlZ21lbnQiKTsKKyAgICAgIH0KKworICAgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBpbmRleCBpcyBjb3ZlcmVkIGJ5IHRoaXMgc2VnbWVudC4KKyAgICAgIGJvb2wgY29udGFpbnMoU2xvdEluZGV4IEkpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXJ0IDw9IEkgJiYgSSA8IGVuZDsKKyAgICAgIH0KKworICAgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBpbnRlcnZhbCwgW1MsIEUpLCBpcyBjb3ZlcmVkIGJ5IHRoaXMgc2VnbWVudC4KKyAgICAgIGJvb2wgY29udGFpbnNJbnRlcnZhbChTbG90SW5kZXggUywgU2xvdEluZGV4IEUpIGNvbnN0IHsKKyAgICAgICAgYXNzZXJ0KChTIDwgRSkgJiYgIkJhY2t3YXJkcyBpbnRlcnZhbD8iKTsKKyAgICAgICAgcmV0dXJuIChzdGFydCA8PSBTICYmIFMgPCBlbmQpICYmIChzdGFydCA8IEUgJiYgRSA8PSBlbmQpOworICAgICAgfQorCisgICAgICBib29sIG9wZXJhdG9yPChjb25zdCBTZWdtZW50ICZPdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjp0aWUoc3RhcnQsIGVuZCkgPCBzdGQ6OnRpZShPdGhlci5zdGFydCwgT3RoZXIuZW5kKTsKKyAgICAgIH0KKyAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTZWdtZW50ICZPdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhcnQgPT0gT3RoZXIuc3RhcnQgJiYgZW5kID09IE90aGVyLmVuZDsKKyAgICAgIH0KKworICAgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisgICAgfTsKKworICAgIHVzaW5nIFNlZ21lbnRzID0gU21hbGxWZWN0b3I8U2VnbWVudCwgMj47CisgICAgdXNpbmcgVk5JbmZvTGlzdCA9IFNtYWxsVmVjdG9yPFZOSW5mbyAqLCAyPjsKKworICAgIFNlZ21lbnRzIHNlZ21lbnRzOyAgIC8vIHRoZSBsaXZlbmVzcyBzZWdtZW50cworICAgIFZOSW5mb0xpc3QgdmFsbm9zOyAgIC8vIHZhbHVlIydzCisKKyAgICAvLyBUaGUgc2VnbWVudCBzZXQgaXMgdXNlZCB0ZW1wb3JhcmlseSB0byBhY2NlbGVyYXRlIGluaXRpYWwgY29tcHV0YXRpb24KKyAgICAvLyBvZiBsaXZlIHJhbmdlcyBvZiBwaHlzaWNhbCByZWdpc3RlcnMgaW4gY29tcHV0ZVJlZ1VuaXRSYW5nZS4KKyAgICAvLyBBZnRlciB0aGF0IHRoZSBzZXQgaXMgZmx1c2hlZCB0byB0aGUgc2VnbWVudCB2ZWN0b3IgYW5kIGRlbGV0ZWQuCisgICAgdXNpbmcgU2VnbWVudFNldCA9IHN0ZDo6c2V0PFNlZ21lbnQ+OworICAgIHN0ZDo6dW5pcXVlX3B0cjxTZWdtZW50U2V0PiBzZWdtZW50U2V0OworCisgICAgdXNpbmcgaXRlcmF0b3IgPSBTZWdtZW50czo6aXRlcmF0b3I7CisgICAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBTZWdtZW50czo6Y29uc3RfaXRlcmF0b3I7CisKKyAgICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIHNlZ21lbnRzLmJlZ2luKCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSAgIHsgcmV0dXJuIHNlZ21lbnRzLmVuZCgpOyB9CisKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHNlZ21lbnRzLmJlZ2luKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCAgeyByZXR1cm4gc2VnbWVudHMuZW5kKCk7IH0KKworICAgIHVzaW5nIHZuaV9pdGVyYXRvciA9IFZOSW5mb0xpc3Q6Oml0ZXJhdG9yOworICAgIHVzaW5nIGNvbnN0X3ZuaV9pdGVyYXRvciA9IFZOSW5mb0xpc3Q6OmNvbnN0X2l0ZXJhdG9yOworCisgICAgdm5pX2l0ZXJhdG9yIHZuaV9iZWdpbigpIHsgcmV0dXJuIHZhbG5vcy5iZWdpbigpOyB9CisgICAgdm5pX2l0ZXJhdG9yIHZuaV9lbmQoKSAgIHsgcmV0dXJuIHZhbG5vcy5lbmQoKTsgfQorCisgICAgY29uc3Rfdm5pX2l0ZXJhdG9yIHZuaV9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIHZhbG5vcy5iZWdpbigpOyB9CisgICAgY29uc3Rfdm5pX2l0ZXJhdG9yIHZuaV9lbmQoKSBjb25zdCAgIHsgcmV0dXJuIHZhbG5vcy5lbmQoKTsgfQorCisgICAgLy8vIENvbnN0cnVjdHMgYSBuZXcgTGl2ZVJhbmdlIG9iamVjdC4KKyAgICBMaXZlUmFuZ2UoYm9vbCBVc2VTZWdtZW50U2V0ID0gZmFsc2UpCisgICAgICAgIDogc2VnbWVudFNldChVc2VTZWdtZW50U2V0ID8gbGx2bTo6bWFrZV91bmlxdWU8U2VnbWVudFNldD4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHIpIHt9CisKKyAgICAvLy8gQ29uc3RydWN0cyBhIG5ldyBMaXZlUmFuZ2Ugb2JqZWN0IGJ5IGNvcHlpbmcgc2VnbWVudHMgYW5kIHZhbG5vcyBmcm9tCisgICAgLy8vIGFub3RoZXIgTGl2ZVJhbmdlLgorICAgIExpdmVSYW5nZShjb25zdCBMaXZlUmFuZ2UgJk90aGVyLCBCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IpIHsKKyAgICAgIGFzc2VydChPdGhlci5zZWdtZW50U2V0ID09IG51bGxwdHIgJiYKKyAgICAgICAgICAgICAiQ29weWluZyBvZiBMaXZlUmFuZ2VzIHdpdGggYWN0aXZlIFNlZ21lbnRTZXRzIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgIGFzc2lnbihPdGhlciwgQWxsb2NhdG9yKTsKKyAgICB9CisKKyAgICAvLy8gQ29waWVzIHZhbHVlcyBudW1iZXJzIGFuZCBsaXZlIHNlZ21lbnRzIGZyb20gXHAgT3RoZXIgaW50byB0aGlzIHJhbmdlLgorICAgIHZvaWQgYXNzaWduKGNvbnN0IExpdmVSYW5nZSAmT3RoZXIsIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvcikgeworICAgICAgaWYgKHRoaXMgPT0gJk90aGVyKQorICAgICAgICByZXR1cm47CisKKyAgICAgIGFzc2VydChPdGhlci5zZWdtZW50U2V0ID09IG51bGxwdHIgJiYKKyAgICAgICAgICAgICAiQ29weWluZyBvZiBMaXZlUmFuZ2VzIHdpdGggYWN0aXZlIFNlZ21lbnRTZXRzIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgIC8vIER1cGxpY2F0ZSB2YWxub3MuCisgICAgICBmb3IgKGNvbnN0IFZOSW5mbyAqVk5JIDogT3RoZXIudmFsbm9zKQorICAgICAgICBjcmVhdGVWYWx1ZUNvcHkoVk5JLCBBbGxvY2F0b3IpOworICAgICAgLy8gTm93IHdlIGNhbiBjb3B5IHNlZ21lbnRzIGFuZCByZW1hcCB0aGVpciB2YWxub3MuCisgICAgICBmb3IgKGNvbnN0IFNlZ21lbnQgJlMgOiBPdGhlci5zZWdtZW50cykKKyAgICAgICAgc2VnbWVudHMucHVzaF9iYWNrKFNlZ21lbnQoUy5zdGFydCwgUy5lbmQsIHZhbG5vc1tTLnZhbG5vLT5pZF0pKTsKKyAgICB9CisKKyAgICAvLy8gYWR2YW5jZVRvIC0gQWR2YW5jZSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHRvIHBvaW50IHRvIHRoZSBTZWdtZW50CisgICAgLy8vIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiwgb3IgZW5kKCkgaWYgdGhlIHBvc2l0aW9uIGlzIHBhc3QgdGhlCisgICAgLy8vIGVuZCBvZiB0aGUgcmFuZ2UuICBJZiBubyBTZWdtZW50IGNvbnRhaW5zIHRoaXMgcG9zaXRpb24sIGJ1dCB0aGUKKyAgICAvLy8gcG9zaXRpb24gaXMgaW4gYSBob2xlLCB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZQorICAgIC8vLyBTZWdtZW50IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBob2xlLgorICAgIGl0ZXJhdG9yIGFkdmFuY2VUbyhpdGVyYXRvciBJLCBTbG90SW5kZXggUG9zKSB7CisgICAgICBhc3NlcnQoSSAhPSBlbmQoKSk7CisgICAgICBpZiAoUG9zID49IGVuZEluZGV4KCkpCisgICAgICAgIHJldHVybiBlbmQoKTsKKyAgICAgIHdoaWxlIChJLT5lbmQgPD0gUG9zKSArK0k7CisgICAgICByZXR1cm4gSTsKKyAgICB9CisKKyAgICBjb25zdF9pdGVyYXRvciBhZHZhbmNlVG8oY29uc3RfaXRlcmF0b3IgSSwgU2xvdEluZGV4IFBvcykgY29uc3QgeworICAgICAgYXNzZXJ0KEkgIT0gZW5kKCkpOworICAgICAgaWYgKFBvcyA+PSBlbmRJbmRleCgpKQorICAgICAgICByZXR1cm4gZW5kKCk7CisgICAgICB3aGlsZSAoSS0+ZW5kIDw9IFBvcykgKytJOworICAgICAgcmV0dXJuIEk7CisgICAgfQorCisgICAgLy8vIGZpbmQgLSBSZXR1cm4gYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IHNlZ21lbnQgdGhhdCBlbmRzIGFmdGVyCisgICAgLy8vIFBvcywgb3IgZW5kKCkuIFRoaXMgaXMgdGhlIHNhbWUgYXMgYWR2YW5jZVRvKGJlZ2luKCksIFBvcyksIGJ1dCBmYXN0ZXIKKyAgICAvLy8gd2hlbiBzZWFyY2hpbmcgbGFyZ2UgcmFuZ2VzLgorICAgIC8vLworICAgIC8vLyBJZiBQb3MgaXMgY29udGFpbmVkIGluIGEgU2VnbWVudCwgdGhhdCBzZWdtZW50IGlzIHJldHVybmVkLgorICAgIC8vLyBJZiBQb3MgaXMgaW4gYSBob2xlLCB0aGUgZm9sbG93aW5nIFNlZ21lbnQgaXMgcmV0dXJuZWQuCisgICAgLy8vIElmIFBvcyBpcyBiZXlvbmQgZW5kSW5kZXgsIGVuZCgpIGlzIHJldHVybmVkLgorICAgIGl0ZXJhdG9yIGZpbmQoU2xvdEluZGV4IFBvcyk7CisKKyAgICBjb25zdF9pdGVyYXRvciBmaW5kKFNsb3RJbmRleCBQb3MpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjb25zdF9jYXN0PExpdmVSYW5nZSo+KHRoaXMpLT5maW5kKFBvcyk7CisgICAgfQorCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgIHZhbG5vcy5jbGVhcigpOworICAgICAgc2VnbWVudHMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzZWdtZW50cy5zaXplKCk7CisgICAgfQorCisgICAgYm9vbCBoYXNBdExlYXN0T25lVmFsdWUoKSBjb25zdCB7IHJldHVybiAhdmFsbm9zLmVtcHR5KCk7IH0KKworICAgIGJvb2wgY29udGFpbnNPbmVWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbG5vcy5zaXplKCkgPT0gMTsgfQorCisgICAgdW5zaWduZWQgZ2V0TnVtVmFsTnVtcygpIGNvbnN0IHsgcmV0dXJuICh1bnNpZ25lZCl2YWxub3Muc2l6ZSgpOyB9CisKKyAgICAvLy8gZ2V0VmFsTnVtSW5mbyAtIFJldHVybnMgcG9pbnRlciB0byB0aGUgc3BlY2lmaWVkIHZhbCMuCisgICAgLy8vCisgICAgaW5saW5lIFZOSW5mbyAqZ2V0VmFsTnVtSW5mbyh1bnNpZ25lZCBWYWxObykgeworICAgICAgcmV0dXJuIHZhbG5vc1tWYWxOb107CisgICAgfQorICAgIGlubGluZSBjb25zdCBWTkluZm8gKmdldFZhbE51bUluZm8odW5zaWduZWQgVmFsTm8pIGNvbnN0IHsKKyAgICAgIHJldHVybiB2YWxub3NbVmFsTm9dOworICAgIH0KKworICAgIC8vLyBjb250YWluc1ZhbHVlIC0gUmV0dXJucyB0cnVlIGlmIFZOSSBiZWxvbmdzIHRvIHRoaXMgcmFuZ2UuCisgICAgYm9vbCBjb250YWluc1ZhbHVlKGNvbnN0IFZOSW5mbyAqVk5JKSBjb25zdCB7CisgICAgICByZXR1cm4gVk5JICYmIFZOSS0+aWQgPCBnZXROdW1WYWxOdW1zKCkgJiYgVk5JID09IGdldFZhbE51bUluZm8oVk5JLT5pZCk7CisgICAgfQorCisgICAgLy8vIGdldE5leHRWYWx1ZSAtIENyZWF0ZSBhIG5ldyB2YWx1ZSBudW1iZXIgYW5kIHJldHVybiBpdC4gIE1JSWR4IHNwZWNpZmllcworICAgIC8vLyB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCBkZWZpbmVzIHRoZSB2YWx1ZSBudW1iZXIuCisgICAgVk5JbmZvICpnZXROZXh0VmFsdWUoU2xvdEluZGV4IGRlZiwgVk5JbmZvOjpBbGxvY2F0b3IgJlZOSW5mb0FsbG9jYXRvcikgeworICAgICAgVk5JbmZvICpWTkkgPQorICAgICAgICBuZXcgKFZOSW5mb0FsbG9jYXRvcikgVk5JbmZvKCh1bnNpZ25lZCl2YWxub3Muc2l6ZSgpLCBkZWYpOworICAgICAgdmFsbm9zLnB1c2hfYmFjayhWTkkpOworICAgICAgcmV0dXJuIFZOSTsKKyAgICB9CisKKyAgICAvLy8gY3JlYXRlRGVhZERlZiAtIE1ha2Ugc3VyZSB0aGUgcmFuZ2UgaGFzIGEgdmFsdWUgZGVmaW5lZCBhdCBEZWYuCisgICAgLy8vIElmIG9uZSBhbHJlYWR5IGV4aXN0cywgcmV0dXJuIGl0LiBPdGhlcndpc2UgYWxsb2NhdGUgYSBuZXcgdmFsdWUgYW5kCisgICAgLy8vIGFkZCBsaXZlbmVzcyBmb3IgYSBkZWFkIGRlZi4KKyAgICBWTkluZm8gKmNyZWF0ZURlYWREZWYoU2xvdEluZGV4IERlZiwgVk5JbmZvOjpBbGxvY2F0b3IgJlZOSW5mb0FsbG9jYXRvcik7CisKKyAgICAvLy8gQ3JlYXRlIGEgZGVmIG9mIHZhbHVlIEBwIFZOSS4gUmV0dXJuIEBwIFZOSS4gSWYgdGhlcmUgYWxyZWFkeSBleGlzdHMKKyAgICAvLy8gYSBkZWZpbml0aW9uIGF0IFZOSS0+ZGVmLCB0aGUgdmFsdWUgZGVmaW5lZCB0aGVyZSBtdXN0IGJlIEBwIFZOSS4KKyAgICBWTkluZm8gKmNyZWF0ZURlYWREZWYoVk5JbmZvICpWTkkpOworCisgICAgLy8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGdpdmVuIHZhbHVlLiBUaGUgbmV3IHZhbHVlIHdpbGwgYmUgaWRlbnRpY2FsIGV4Y2VwdAorICAgIC8vLyBmb3IgdGhlIFZhbHVlIG51bWJlci4KKyAgICBWTkluZm8gKmNyZWF0ZVZhbHVlQ29weShjb25zdCBWTkluZm8gKm9yaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk5JbmZvOjpBbGxvY2F0b3IgJlZOSW5mb0FsbG9jYXRvcikgeworICAgICAgVk5JbmZvICpWTkkgPQorICAgICAgICBuZXcgKFZOSW5mb0FsbG9jYXRvcikgVk5JbmZvKCh1bnNpZ25lZCl2YWxub3Muc2l6ZSgpLCAqb3JpZyk7CisgICAgICB2YWxub3MucHVzaF9iYWNrKFZOSSk7CisgICAgICByZXR1cm4gVk5JOworICAgIH0KKworICAgIC8vLyBSZW51bWJlclZhbHVlcyAtIFJlbnVtYmVyIGFsbCB2YWx1ZXMgaW4gb3JkZXIgb2YgYXBwZWFyYW5jZSBhbmQgcmVtb3ZlCisgICAgLy8vIHVudXNlZCB2YWx1ZXMuCisgICAgdm9pZCBSZW51bWJlclZhbHVlcygpOworCisgICAgLy8vIE1lcmdlVmFsdWVOdW1iZXJJbnRvIC0gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdHdvIHZhbHVlIG51bWJlcnMKKyAgICAvLy8gYXJlIGZvdW5kIHRvIGJlIGVxdWl2YWxlbnQuICBUaGlzIGVsaW1pbmF0ZXMgVjEsIHJlcGxhY2luZyBhbGwKKyAgICAvLy8gc2VnbWVudHMgd2l0aCB0aGUgVjEgdmFsdWUgbnVtYmVyIHdpdGggdGhlIFYyIHZhbHVlIG51bWJlci4gIFRoaXMgY2FuCisgICAgLy8vIGNhdXNlIG1lcmdpbmcgb2YgVjEvVjIgdmFsdWVzIG51bWJlcnMgYW5kIGNvbXBhY3Rpb24gb2YgdGhlIHZhbHVlIHNwYWNlLgorICAgIFZOSW5mbyogTWVyZ2VWYWx1ZU51bWJlckludG8oVk5JbmZvICpWMSwgVk5JbmZvICpWMik7CisKKyAgICAvLy8gTWVyZ2UgYWxsIG9mIHRoZSBsaXZlIHNlZ21lbnRzIG9mIGEgc3BlY2lmaWMgdmFsIyBpbiBSSFMgaW50byB0aGlzIGxpdmUKKyAgICAvLy8gcmFuZ2UgYXMgdGhlIHNwZWNpZmllZCB2YWx1ZSBudW1iZXIuIFRoZSBzZWdtZW50cyBpbiBSSFMgYXJlIGFsbG93ZWQKKyAgICAvLy8gdG8gb3ZlcmxhcCB3aXRoIHNlZ21lbnRzIGluIHRoZSBjdXJyZW50IHJhbmdlLCBpdCB3aWxsIHJlcGxhY2UgdGhlCisgICAgLy8vIHZhbHVlIG51bWJlcnMgb2YgdGhlIG92ZXJsYXBlZCBsaXZlIHNlZ21lbnRzIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZQorICAgIC8vLyBudW1iZXIuCisgICAgdm9pZCBNZXJnZVNlZ21lbnRzSW5Bc1ZhbHVlKGNvbnN0IExpdmVSYW5nZSAmUkhTLCBWTkluZm8gKkxIU1ZhbE5vKTsKKworICAgIC8vLyBNZXJnZVZhbHVlSW5Bc1ZhbHVlIC0gTWVyZ2UgYWxsIG9mIHRoZSBzZWdtZW50cyBvZiBhIHNwZWNpZmljIHZhbCMKKyAgICAvLy8gaW4gUkhTIGludG8gdGhpcyBsaXZlIHJhbmdlIGFzIHRoZSBzcGVjaWZpZWQgdmFsdWUgbnVtYmVyLgorICAgIC8vLyBUaGUgc2VnbWVudHMgaW4gUkhTIGFyZSBhbGxvd2VkIHRvIG92ZXJsYXAgd2l0aCBzZWdtZW50cyBpbiB0aGUKKyAgICAvLy8gY3VycmVudCByYW5nZSwgYnV0IG9ubHkgaWYgdGhlIG92ZXJsYXBwaW5nIHNlZ21lbnRzIGhhdmUgdGhlCisgICAgLy8vIHNwZWNpZmllZCB2YWx1ZSBudW1iZXIuCisgICAgdm9pZCBNZXJnZVZhbHVlSW5Bc1ZhbHVlKGNvbnN0IExpdmVSYW5nZSAmUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWTkluZm8gKlJIU1ZhbE5vLCBWTkluZm8gKkxIU1ZhbE5vKTsKKworICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBzZWdtZW50cy5lbXB0eSgpOyB9CisKKyAgICAvLy8gYmVnaW5JbmRleCAtIFJldHVybiB0aGUgbG93ZXN0IG51bWJlcmVkIHNsb3QgY292ZXJlZC4KKyAgICBTbG90SW5kZXggYmVnaW5JbmRleCgpIGNvbnN0IHsKKyAgICAgIGFzc2VydCghZW1wdHkoKSAmJiAiQ2FsbCB0byBiZWdpbkluZGV4KCkgb24gZW1wdHkgcmFuZ2UuIik7CisgICAgICByZXR1cm4gc2VnbWVudHMuZnJvbnQoKS5zdGFydDsKKyAgICB9CisKKyAgICAvLy8gZW5kTnVtYmVyIC0gcmV0dXJuIHRoZSBtYXhpbXVtIHBvaW50IG9mIHRoZSByYW5nZSBvZiB0aGUgd2hvbGUsCisgICAgLy8vIGV4Y2x1c2l2ZS4KKyAgICBTbG90SW5kZXggZW5kSW5kZXgoKSBjb25zdCB7CisgICAgICBhc3NlcnQoIWVtcHR5KCkgJiYgIkNhbGwgdG8gZW5kSW5kZXgoKSBvbiBlbXB0eSByYW5nZS4iKTsKKyAgICAgIHJldHVybiBzZWdtZW50cy5iYWNrKCkuZW5kOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlZEF0KFNsb3RJbmRleCBpbmRleCkgY29uc3QgeworICAgICAgcmV0dXJuIGluZGV4ID49IGVuZEluZGV4KCk7CisgICAgfQorCisgICAgYm9vbCBsaXZlQXQoU2xvdEluZGV4IGluZGV4KSBjb25zdCB7CisgICAgICBjb25zdF9pdGVyYXRvciByID0gZmluZChpbmRleCk7CisgICAgICByZXR1cm4gciAhPSBlbmQoKSAmJiByLT5zdGFydCA8PSBpbmRleDsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSBzZWdtZW50IHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBpbmRleCwgb3IgbnVsbCBpZiB0aGVyZQorICAgIC8vLyBpcyBub25lLgorICAgIGNvbnN0IFNlZ21lbnQgKmdldFNlZ21lbnRDb250YWluaW5nKFNsb3RJbmRleCBJZHgpIGNvbnN0IHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIEkgPSBGaW5kU2VnbWVudENvbnRhaW5pbmcoSWR4KTsKKyAgICAgIHJldHVybiBJID09IGVuZCgpID8gbnVsbHB0ciA6ICYqSTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSBsaXZlIHNlZ21lbnQgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGluZGV4LCBvciBudWxsIGlmCisgICAgLy8vIHRoZXJlIGlzIG5vbmUuCisgICAgU2VnbWVudCAqZ2V0U2VnbWVudENvbnRhaW5pbmcoU2xvdEluZGV4IElkeCkgeworICAgICAgaXRlcmF0b3IgSSA9IEZpbmRTZWdtZW50Q29udGFpbmluZyhJZHgpOworICAgICAgcmV0dXJuIEkgPT0gZW5kKCkgPyBudWxscHRyIDogJipJOworICAgIH0KKworICAgIC8vLyBnZXRWTkluZm9BdCAtIFJldHVybiB0aGUgVk5JbmZvIHRoYXQgaXMgbGl2ZSBhdCBJZHgsIG9yIE5VTEwuCisgICAgVk5JbmZvICpnZXRWTkluZm9BdChTbG90SW5kZXggSWR4KSBjb25zdCB7CisgICAgICBjb25zdF9pdGVyYXRvciBJID0gRmluZFNlZ21lbnRDb250YWluaW5nKElkeCk7CisgICAgICByZXR1cm4gSSA9PSBlbmQoKSA/IG51bGxwdHIgOiBJLT52YWxubzsKKyAgICB9CisKKyAgICAvLy8gZ2V0Vk5JbmZvQmVmb3JlIC0gUmV0dXJuIHRoZSBWTkluZm8gdGhhdCBpcyBsaXZlIHVwIHRvIGJ1dCBub3QKKyAgICAvLy8gbmVjZXNzYXJpbGx5IGluY2x1ZGluZyBJZHgsIG9yIE5VTEwuIFVzZSB0aGlzIHRvIGZpbmQgdGhlIHJlYWNoaW5nIGRlZgorICAgIC8vLyB1c2VkIGJ5IGFuIGluc3RydWN0aW9uIGF0IHRoaXMgU2xvdEluZGV4IHBvc2l0aW9uLgorICAgIFZOSW5mbyAqZ2V0Vk5JbmZvQmVmb3JlKFNsb3RJbmRleCBJZHgpIGNvbnN0IHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIEkgPSBGaW5kU2VnbWVudENvbnRhaW5pbmcoSWR4LmdldFByZXZTbG90KCkpOworICAgICAgcmV0dXJuIEkgPT0gZW5kKCkgPyBudWxscHRyIDogSS0+dmFsbm87CisgICAgfQorCisgICAgLy8vIFJldHVybiBhbiBpdGVyYXRvciB0byB0aGUgc2VnbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgaW5kZXgsIG9yCisgICAgLy8vIGVuZCgpIGlmIHRoZXJlIGlzIG5vbmUuCisgICAgaXRlcmF0b3IgRmluZFNlZ21lbnRDb250YWluaW5nKFNsb3RJbmRleCBJZHgpIHsKKyAgICAgIGl0ZXJhdG9yIEkgPSBmaW5kKElkeCk7CisgICAgICByZXR1cm4gSSAhPSBlbmQoKSAmJiBJLT5zdGFydCA8PSBJZHggPyBJIDogZW5kKCk7CisgICAgfQorCisgICAgY29uc3RfaXRlcmF0b3IgRmluZFNlZ21lbnRDb250YWluaW5nKFNsb3RJbmRleCBJZHgpIGNvbnN0IHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIEkgPSBmaW5kKElkeCk7CisgICAgICByZXR1cm4gSSAhPSBlbmQoKSAmJiBJLT5zdGFydCA8PSBJZHggPyBJIDogZW5kKCk7CisgICAgfQorCisgICAgLy8vIG92ZXJsYXBzIC0gUmV0dXJuIHRydWUgaWYgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIGxpdmUgcmFuZ2VzIGlzCisgICAgLy8vIG5vdCBlbXB0eS4KKyAgICBib29sIG92ZXJsYXBzKGNvbnN0IExpdmVSYW5nZSAmb3RoZXIpIGNvbnN0IHsKKyAgICAgIGlmIChvdGhlci5lbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gb3ZlcmxhcHNGcm9tKG90aGVyLCBvdGhlci5iZWdpbigpKTsKKyAgICB9CisKKyAgICAvLy8gb3ZlcmxhcHMgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHdvIHJhbmdlcyBoYXZlIG92ZXJsYXBwaW5nIHNlZ21lbnRzCisgICAgLy8vIHRoYXQgYXJlIG5vdCBjb2FsZXNjYWJsZSBhY2NvcmRpbmcgdG8gQ1AuCisgICAgLy8vCisgICAgLy8vIE92ZXJsYXBwaW5nIHNlZ21lbnRzIHdoZXJlIG9uZSByYW5nZSBpcyBkZWZpbmVkIGJ5IGEgY29hbGVzY2FibGUKKyAgICAvLy8gY29weSBhcmUgYWxsb3dlZC4KKyAgICBib29sIG92ZXJsYXBzKGNvbnN0IExpdmVSYW5nZSAmT3RoZXIsIGNvbnN0IENvYWxlc2NlclBhaXIgJkNQLAorICAgICAgICAgICAgICAgICAgY29uc3QgU2xvdEluZGV4ZXMmKSBjb25zdDsKKworICAgIC8vLyBvdmVybGFwcyAtIFJldHVybiB0cnVlIGlmIHRoZSBsaXZlIHJhbmdlIG92ZXJsYXBzIGFuIGludGVydmFsIHNwZWNpZmllZAorICAgIC8vLyBieSBbU3RhcnQsIEVuZCkuCisgICAgYm9vbCBvdmVybGFwcyhTbG90SW5kZXggU3RhcnQsIFNsb3RJbmRleCBFbmQpIGNvbnN0OworCisgICAgLy8vIG92ZXJsYXBzRnJvbSAtIFJldHVybiB0cnVlIGlmIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBsaXZlIHJhbmdlcworICAgIC8vLyBpcyBub3QgZW1wdHkuICBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGlzIGEgaGludCB0aGF0IHdlIGNhbiBiZWdpbgorICAgIC8vLyBzY2FubmluZyB0aGUgT3RoZXIgcmFuZ2Ugc3RhcnRpbmcgYXQgSS4KKyAgICBib29sIG92ZXJsYXBzRnJvbShjb25zdCBMaXZlUmFuZ2UgJk90aGVyLCBjb25zdF9pdGVyYXRvciBJKSBjb25zdDsKKworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgYWxsIHNlZ21lbnRzIG9mIHRoZSBAcCBPdGhlciBsaXZlIHJhbmdlIGFyZSBjb21wbGV0ZWx5CisgICAgLy8vIGNvdmVyZWQgYnkgdGhpcyBsaXZlIHJhbmdlLgorICAgIC8vLyBBZGphY2VudCBsaXZlIHJhbmdlcyBkbyBub3QgYWZmZWN0IHRoZSBjb3ZlcmluZzp0aGUgbGl2ZXJhbmdlCisgICAgLy8vIFsxLDVdKDUsMTBdIGNvdmVycyAoMyw3XS4KKyAgICBib29sIGNvdmVycyhjb25zdCBMaXZlUmFuZ2UgJk90aGVyKSBjb25zdDsKKworICAgIC8vLyBBZGQgdGhlIHNwZWNpZmllZCBTZWdtZW50IHRvIHRoaXMgcmFuZ2UsIG1lcmdpbmcgc2VnbWVudHMgYXMKKyAgICAvLy8gYXBwcm9wcmlhdGUuICBUaGlzIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGluc2VydGVkIHNlZ21lbnQgKHdoaWNoCisgICAgLy8vIG1heSBoYXZlIGdyb3duIHNpbmNlIGl0IHdhcyBpbnNlcnRlZCkuCisgICAgaXRlcmF0b3IgYWRkU2VnbWVudChTZWdtZW50IFMpOworCisgICAgLy8vIEF0dGVtcHQgdG8gZXh0ZW5kIGEgdmFsdWUgZGVmaW5lZCBhZnRlciBAcCBTdGFydElkeCB0byBpbmNsdWRlIEBwIFVzZS4KKyAgICAvLy8gQm90aCBAcCBTdGFydElkeCBhbmQgQHAgVXNlIHNob3VsZCBiZSBpbiB0aGUgc2FtZSBiYXNpYyBibG9jay4gSW4gY2FzZQorICAgIC8vLyBvZiBzdWJyYW5nZXMsIGFuIGV4dGVuc2lvbiBjb3VsZCBiZSBwcmV2ZW50ZWQgYnkgYW4gZXhwbGljaXQgInVuZGVmIgorICAgIC8vLyBjYXVzZWQgYnkgYSA8ZGVmLHJlYWQtdW5kZWY+IG9uIGEgbm9uLW92ZXJsYXBwaW5nIGxhbmUuIFRoZSBsaXN0IG9mCisgICAgLy8vIGxvY2F0aW9uIG9mIHN1Y2ggInVuZGVmcyIgc2hvdWxkIGJlIHByb3ZpZGVkIGluIEBwIFVuZGVmcy4KKyAgICAvLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBhaXI6IHRoZSBmaXJzdCBlbGVtZW50IGlzIFZOSW5mbyBvZiB0aGUgdmFsdWUKKyAgICAvLy8gdGhhdCB3YXMgZXh0ZW5kZWQgKHBvc3NpYmx5IG51bGxwdHIpLCB0aGUgc2Vjb25kIGlzIGEgYm9vbGVhbiB2YWx1ZQorICAgIC8vLyBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gInVuZGVmIiB3YXMgZW5jb3VudGVyZWQuCisgICAgLy8vIElmIHRoaXMgcmFuZ2UgaXMgbGl2ZSBiZWZvcmUgQHAgVXNlIGluIHRoZSBiYXNpYyBibG9jayB0aGF0IHN0YXJ0cyBhdAorICAgIC8vLyBAcCBTdGFydElkeCwgYW5kIHRoZXJlIGlzIG5vIGludGVydmVuaW5nICJ1bmRlZiIsIGV4dGVuZCBpdCB0byBiZSBsaXZlCisgICAgLy8vIHVwIHRvIEBwIFVzZSwgYW5kIHJldHVybiB0aGUgcGFpciB7dmFsdWUsIGZhbHNlfS4gSWYgdGhlcmUgaXMgbm8KKyAgICAvLy8gc2VnbWVudCBiZWZvcmUgQHAgVXNlIGFuZCB0aGVyZSBpcyBubyAidW5kZWYiIGJldHdlZW4gQHAgU3RhcnRJZHggYW5kCisgICAgLy8vIEBwIFVzZSwgcmV0dXJuIHtudWxscHRyLCBmYWxzZX0uIElmIHRoZXJlIGlzIGFuICJ1bmRlZiIgYmVmb3JlIEBwIFVzZSwKKyAgICAvLy8gcmV0dXJuIHtudWxscHRyLCB0cnVlfS4KKyAgICBzdGQ6OnBhaXI8Vk5JbmZvKixib29sPiBleHRlbmRJbkJsb2NrKEFycmF5UmVmPFNsb3RJbmRleD4gVW5kZWZzLAorICAgICAgICBTbG90SW5kZXggU3RhcnRJZHgsIFNsb3RJbmRleCBVc2UpOworCisgICAgLy8vIFNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgYWJvdmUgImV4dGVuZEluQmxvY2siLCB3aGljaCBhc3N1bWVzIHRoYXQKKyAgICAvLy8gbm8gcmVnaXN0ZXIgbGFuZXMgYXJlIHVuZGVmaW5lZCBieSA8ZGVmLHJlYWQtdW5kZWY+IG9wZXJhbmRzLgorICAgIC8vLyBJZiB0aGlzIHJhbmdlIGlzIGxpdmUgYmVmb3JlIEBwIFVzZSBpbiB0aGUgYmFzaWMgYmxvY2sgdGhhdCBzdGFydHMKKyAgICAvLy8gYXQgQHAgU3RhcnRJZHgsIGV4dGVuZCBpdCB0byBiZSBsaXZlIHVwIHRvIEBwIFVzZSwgYW5kIHJldHVybiB0aGUKKyAgICAvLy8gdmFsdWUuIElmIHRoZXJlIGlzIG5vIHNlZ21lbnQgYmVmb3JlIEBwIFVzZSwgcmV0dXJuIG51bGxwdHIuCisgICAgVk5JbmZvICpleHRlbmRJbkJsb2NrKFNsb3RJbmRleCBTdGFydElkeCwgU2xvdEluZGV4IEtpbGwpOworCisgICAgLy8vIGpvaW4gLSBKb2luIHR3byBsaXZlIHJhbmdlcyAodGhpcywgYW5kIG90aGVyKSB0b2dldGhlci4gIFRoaXMgYXBwbGllcworICAgIC8vLyBtYXBwaW5ncyB0byB0aGUgdmFsdWUgbnVtYmVycyBpbiB0aGUgTEhTL1JIUyByYW5nZXMgYXMgc3BlY2lmaWVkLiAgSWYKKyAgICAvLy8gdGhlIHJhbmdlcyBhcmUgbm90IGpvaW5hYmxlLCB0aGlzIGFib3J0cy4KKyAgICB2b2lkIGpvaW4oTGl2ZVJhbmdlICZPdGhlciwKKyAgICAgICAgICAgICAgY29uc3QgaW50ICpWYWxOb0Fzc2lnbm1lbnRzLAorICAgICAgICAgICAgICBjb25zdCBpbnQgKlJIU1ZhbE5vQXNzaWdubWVudHMsCisgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxWTkluZm8gKj4gJk5ld1ZOSW5mbyk7CisKKyAgICAvLy8gVHJ1ZSBpZmYgdGhpcyBzZWdtZW50IGlzIGEgc2luZ2xlIHNlZ21lbnQgdGhhdCBsaWVzIGJldHdlZW4gdGhlCisgICAgLy8vIHNwZWNpZmllZCBib3VuZGFyaWVzLCBleGNsdXNpdmVseS4gVnJlZ3MgbGl2ZSBhY3Jvc3MgYSBiYWNrZWRnZSBhcmUgbm90CisgICAgLy8vIGNvbnNpZGVyZWQgbG9jYWwuIFRoZSBib3VuZGFyaWVzIGFyZSBleHBlY3RlZCB0byBsaWUgd2l0aGluIGFuIGV4dGVuZGVkCisgICAgLy8vIGJhc2ljIGJsb2NrLCBzbyB2cmVncyB0aGF0IGFyZSBub3QgbGl2ZSBvdXQgc2hvdWxkIGNvbnRhaW4gbm8gaG9sZXMuCisgICAgYm9vbCBpc0xvY2FsKFNsb3RJbmRleCBTdGFydCwgU2xvdEluZGV4IEVuZCkgY29uc3QgeworICAgICAgcmV0dXJuIGJlZ2luSW5kZXgoKSA+IFN0YXJ0LmdldEJhc2VJbmRleCgpICYmCisgICAgICAgIGVuZEluZGV4KCkgPCBFbmQuZ2V0Qm91bmRhcnlJbmRleCgpOworICAgIH0KKworICAgIC8vLyBSZW1vdmUgdGhlIHNwZWNpZmllZCBzZWdtZW50IGZyb20gdGhpcyByYW5nZS4gIE5vdGUgdGhhdCB0aGUgc2VnbWVudAorICAgIC8vLyBtdXN0IGJlIGEgc2luZ2xlIFNlZ21lbnQgaW4gaXRzIGVudGlyZXR5LgorICAgIHZvaWQgcmVtb3ZlU2VnbWVudChTbG90SW5kZXggU3RhcnQsIFNsb3RJbmRleCBFbmQsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVtb3ZlRGVhZFZhbE5vID0gZmFsc2UpOworCisgICAgdm9pZCByZW1vdmVTZWdtZW50KFNlZ21lbnQgUywgYm9vbCBSZW1vdmVEZWFkVmFsTm8gPSBmYWxzZSkgeworICAgICAgcmVtb3ZlU2VnbWVudChTLnN0YXJ0LCBTLmVuZCwgUmVtb3ZlRGVhZFZhbE5vKTsKKyAgICB9CisKKyAgICAvLy8gUmVtb3ZlIHNlZ21lbnQgcG9pbnRlZCB0byBieSBpdGVyYXRvciBAcCBJIGZyb20gdGhpcyByYW5nZS4gIFRoaXMgZG9lcworICAgIC8vLyBub3QgcmVtb3ZlIGRlYWQgdmFsdWUgbnVtYmVycy4KKyAgICBpdGVyYXRvciByZW1vdmVTZWdtZW50KGl0ZXJhdG9yIEkpIHsKKyAgICAgIHJldHVybiBzZWdtZW50cy5lcmFzZShJKTsKKyAgICB9CisKKyAgICAvLy8gUXVlcnkgTGl2ZW5lc3MgYXQgSWR4LgorICAgIC8vLyBUaGUgc3ViLWluc3RydWN0aW9uIHNsb3Qgb2YgSWR4IGRvZXNuJ3QgbWF0dGVyLCBvbmx5IHRoZSBpbnN0cnVjdGlvbgorICAgIC8vLyBpdCByZWZlcnMgdG8gaXMgY29uc2lkZXJlZC4KKyAgICBMaXZlUXVlcnlSZXN1bHQgUXVlcnkoU2xvdEluZGV4IElkeCkgY29uc3QgeworICAgICAgLy8gRmluZCB0aGUgc2VnbWVudCB0aGF0IGVudGVycyB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgICBjb25zdF9pdGVyYXRvciBJID0gZmluZChJZHguZ2V0QmFzZUluZGV4KCkpOworICAgICAgY29uc3RfaXRlcmF0b3IgRSA9IGVuZCgpOworICAgICAgaWYgKEkgPT0gRSkKKyAgICAgICAgcmV0dXJuIExpdmVRdWVyeVJlc3VsdChudWxscHRyLCBudWxscHRyLCBTbG90SW5kZXgoKSwgZmFsc2UpOworCisgICAgICAvLyBJcyB0aGlzIGFuIGluc3RydWN0aW9uIGxpdmUtaW4gc2VnbWVudD8KKyAgICAgIC8vIElmIElkeCBpcyB0aGUgc3RhcnQgaW5kZXggb2YgYSBiYXNpYyBibG9jaywgaW5jbHVkZSBsaXZlLWluIHNlZ21lbnRzCisgICAgICAvLyB0aGF0IHN0YXJ0IGF0IElkeC5nZXRCYXNlSW5kZXgoKS4KKyAgICAgIFZOSW5mbyAqRWFybHlWYWwgPSBudWxscHRyOworICAgICAgVk5JbmZvICpMYXRlVmFsICA9IG51bGxwdHI7CisgICAgICBTbG90SW5kZXggRW5kUG9pbnQ7CisgICAgICBib29sIEtpbGwgPSBmYWxzZTsKKyAgICAgIGlmIChJLT5zdGFydCA8PSBJZHguZ2V0QmFzZUluZGV4KCkpIHsKKyAgICAgICAgRWFybHlWYWwgPSBJLT52YWxubzsKKyAgICAgICAgRW5kUG9pbnQgPSBJLT5lbmQ7CisgICAgICAgIC8vIE1vdmUgdG8gdGhlIHBvdGVudGlhbGx5IGxpdmUtb3V0IHNlZ21lbnQuCisgICAgICAgIGlmIChTbG90SW5kZXg6OmlzU2FtZUluc3RyKElkeCwgSS0+ZW5kKSkgeworICAgICAgICAgIEtpbGwgPSB0cnVlOworICAgICAgICAgIGlmICgrK0kgPT0gRSkKKyAgICAgICAgICAgIHJldHVybiBMaXZlUXVlcnlSZXN1bHQoRWFybHlWYWwsIExhdGVWYWwsIEVuZFBvaW50LCBLaWxsKTsKKyAgICAgICAgfQorICAgICAgICAvLyBTcGVjaWFsIGNhc2U6IEEgUEhJRGVmIHZhbHVlIGNhbiBoYXZlIGl0cyBkZWYgaW4gdGhlIG1pZGRsZSBvZiBhCisgICAgICAgIC8vIHNlZ21lbnQgaWYgdGhlIHZhbHVlIGhhcHBlbnMgdG8gYmUgbGl2ZSBvdXQgb2YgdGhlIGxheW91dAorICAgICAgICAvLyBwcmVkZWNlc3Nvci4KKyAgICAgICAgLy8gU3VjaCBhIHZhbHVlIGlzIG5vdCBsaXZlLWluLgorICAgICAgICBpZiAoRWFybHlWYWwtPmRlZiA9PSBJZHguZ2V0QmFzZUluZGV4KCkpCisgICAgICAgICAgRWFybHlWYWwgPSBudWxscHRyOworICAgICAgfQorICAgICAgLy8gSSBub3cgcG9pbnRzIHRvIHRoZSBzZWdtZW50IHRoYXQgbWF5IGJlIGxpdmUtdGhyb3VnaCwgb3IgZGVmaW5lZCBieQorICAgICAgLy8gdGhpcyBpbnN0ci4gSWdub3JlIHNlZ21lbnRzIHN0YXJ0aW5nIGFmdGVyIHRoZSBjdXJyZW50IGluc3RyLgorICAgICAgaWYgKCFTbG90SW5kZXg6OmlzRWFybGllckluc3RyKElkeCwgSS0+c3RhcnQpKSB7CisgICAgICAgIExhdGVWYWwgPSBJLT52YWxubzsKKyAgICAgICAgRW5kUG9pbnQgPSBJLT5lbmQ7CisgICAgICB9CisgICAgICByZXR1cm4gTGl2ZVF1ZXJ5UmVzdWx0KEVhcmx5VmFsLCBMYXRlVmFsLCBFbmRQb2ludCwgS2lsbCk7CisgICAgfQorCisgICAgLy8vIHJlbW92ZVZhbE5vIC0gUmVtb3ZlIGFsbCB0aGUgc2VnbWVudHMgZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkIHZhbHVlIy4KKyAgICAvLy8gQWxzbyByZW1vdmUgdGhlIHZhbHVlIyBmcm9tIHZhbHVlIyBsaXN0LgorICAgIHZvaWQgcmVtb3ZlVmFsTm8oVk5JbmZvICpWYWxObyk7CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBsaXZlIHJhbmdlIGlzIHplcm8gbGVuZ3RoLCBpLmUuIG5vIGxpdmUgc2VnbWVudHMKKyAgICAvLy8gc3BhbiBpbnN0cnVjdGlvbnMuIEl0IGRvZXNuJ3QgcGF5IHRvIHNwaWxsIHN1Y2ggYSByYW5nZS4KKyAgICBib29sIGlzWmVyb0xlbmd0aChTbG90SW5kZXhlcyAqSW5kZXhlcykgY29uc3QgeworICAgICAgZm9yIChjb25zdCBTZWdtZW50ICZTIDogc2VnbWVudHMpCisgICAgICAgIGlmIChJbmRleGVzLT5nZXROZXh0Tm9uTnVsbEluZGV4KFMuc3RhcnQpLmdldEJhc2VJbmRleCgpIDwKKyAgICAgICAgICAgIFMuZW5kLmdldEJhc2VJbmRleCgpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgc2VnbWVudCBpbiB0aGUgbGl2ZSByYW5nZSBjb250YWlucyBhbnkgb2YgdGhlCisgICAgLy8gcHJvdmlkZWQgc2xvdCBpbmRleGVzLiAgU2xvdHMgd2hpY2ggb2NjdXIgaW4gaG9sZXMgYmV0d2VlbgorICAgIC8vIHNlZ21lbnRzIHdpbGwgbm90IGNhdXNlIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gdHJ1ZS4KKyAgICBib29sIGlzTGl2ZUF0SW5kZXhlcyhBcnJheVJlZjxTbG90SW5kZXg+IFNsb3RzKSBjb25zdDsKKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IExpdmVSYW5nZSYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIGNvbnN0IFNsb3RJbmRleCAmdGhpc0luZGV4ID0gYmVnaW5JbmRleCgpOworICAgICAgY29uc3QgU2xvdEluZGV4ICZvdGhlckluZGV4ID0gb3RoZXIuYmVnaW5JbmRleCgpOworICAgICAgcmV0dXJuIHRoaXNJbmRleCA8IG90aGVySW5kZXg7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhbiBleHBsaWNpdCAidW5kZWYiIGJldHdlZW4gQHAgQmVnaW4KKyAgICAvLy8gQHAgRW5kLgorICAgIGJvb2wgaXNVbmRlZkluKEFycmF5UmVmPFNsb3RJbmRleD4gVW5kZWZzLCBTbG90SW5kZXggQmVnaW4sCisgICAgICAgICAgICAgICAgICAgU2xvdEluZGV4IEVuZCkgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6YW55X29mKFVuZGVmcy5iZWdpbigpLCBVbmRlZnMuZW5kKCksCisgICAgICAgICAgICAgICAgW0JlZ2luLEVuZF0gKFNsb3RJbmRleCBJZHgpIC0+IGJvb2wgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIEJlZ2luIDw9IElkeCAmJiBJZHggPCBFbmQ7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgLy8vIEZsdXNoIHNlZ21lbnQgc2V0IGludG8gdGhlIHJlZ3VsYXIgc2VnbWVudCB2ZWN0b3IuCisgICAgLy8vIFRoZSBtZXRob2QgaXMgdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBsaXZlIHJhbmdlCisgICAgLy8vIGhhcyBiZWVuIGNyZWF0ZWQsIGlmIHVzZSBvZiB0aGUgc2VnbWVudCBzZXQgd2FzCisgICAgLy8vIGFjdGl2YXRlZCBpbiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGxpdmUgcmFuZ2UuCisgICAgdm9pZCBmbHVzaFNlZ21lbnRTZXQoKTsKKworICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAgIC8vLyBcYnJpZWYgV2FsayB0aGUgcmFuZ2UgYW5kIGFzc2VydCBpZiBhbnkgaW52YXJpYW50cyBmYWlsIHRvIGhvbGQuCisgICAgLy8vCisgICAgLy8vIE5vdGUgdGhhdCB0aGlzIGlzIGEgbm8tb3Agd2hlbiBhc3NlcnRzIGFyZSBkaXNhYmxlZC4KKyNpZmRlZiBOREVCVUcKKyAgICB2b2lkIHZlcmlmeSgpIGNvbnN0IHt9CisjZWxzZQorICAgIHZvaWQgdmVyaWZ5KCkgY29uc3Q7CisjZW5kaWYKKworICBwcm90ZWN0ZWQ6CisgICAgLy8vIEFwcGVuZCBhIHNlZ21lbnQgdG8gdGhlIGxpc3Qgb2Ygc2VnbWVudHMuCisgICAgdm9pZCBhcHBlbmQoY29uc3QgTGl2ZVJhbmdlOjpTZWdtZW50IFMpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIExpdmVSYW5nZVVwZGF0ZXI7CisgICAgdm9pZCBhZGRTZWdtZW50VG9TZXQoU2VnbWVudCBTKTsKKyAgICB2b2lkIG1hcmtWYWxOb0ZvckRlbGV0aW9uKFZOSW5mbyAqVik7CisgIH07CisKKyAgaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTGl2ZVJhbmdlICZMUikgeworICAgIExSLnByaW50KE9TKTsKKyAgICByZXR1cm4gT1M7CisgIH0KKworICAvLy8gTGl2ZUludGVydmFsIC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBsaXZlbmVzcyBvZiBhIHJlZ2lzdGVyLAorICAvLy8gb3Igc3RhY2sgc2xvdC4KKyAgY2xhc3MgTGl2ZUludGVydmFsIDogcHVibGljIExpdmVSYW5nZSB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBzdXBlciA9IExpdmVSYW5nZTsKKworICAgIC8vLyBBIGxpdmUgcmFuZ2UgZm9yIHN1YnJlZ2lzdGVycy4gVGhlIExhbmVNYXNrIHNwZWNpZmllcyB3aGljaCBwYXJ0cyBvZiB0aGUKKyAgICAvLy8gc3VwZXIgcmVnaXN0ZXIgYXJlIGNvdmVyZWQgYnkgdGhlIGludGVydmFsLgorICAgIC8vLyAoQHNhIFRhcmdldFJlZ2lzdGVySW5mbzo6Z2V0U3ViUmVnSW5kZXhMYW5lTWFzaygpKS4KKyAgICBjbGFzcyBTdWJSYW5nZSA6IHB1YmxpYyBMaXZlUmFuZ2UgeworICAgIHB1YmxpYzoKKyAgICAgIFN1YlJhbmdlICpOZXh0ID0gbnVsbHB0cjsKKyAgICAgIExhbmVCaXRtYXNrIExhbmVNYXNrOworCisgICAgICAvLy8gQ29uc3RydWN0cyBhIG5ldyBTdWJSYW5nZSBvYmplY3QuCisgICAgICBTdWJSYW5nZShMYW5lQml0bWFzayBMYW5lTWFzaykgOiBMYW5lTWFzayhMYW5lTWFzaykge30KKworICAgICAgLy8vIENvbnN0cnVjdHMgYSBuZXcgU3ViUmFuZ2Ugb2JqZWN0IGJ5IGNvcHlpbmcgbGl2ZW5lc3MgZnJvbSBAcCBPdGhlci4KKyAgICAgIFN1YlJhbmdlKExhbmVCaXRtYXNrIExhbmVNYXNrLCBjb25zdCBMaXZlUmFuZ2UgJk90aGVyLAorICAgICAgICAgICAgICAgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yKQorICAgICAgICA6IExpdmVSYW5nZShPdGhlciwgQWxsb2NhdG9yKSwgTGFuZU1hc2soTGFuZU1hc2spIHt9CisKKyAgICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgICAgIHZvaWQgZHVtcCgpIGNvbnN0OworICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICBTdWJSYW5nZSAqU3ViUmFuZ2VzID0gbnVsbHB0cjsgLy8vPCBTaW5nbGUgbGlua2VkIGxpc3Qgb2Ygc3VicmVnaXN0ZXIgbGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gcmFuZ2VzLgorCisgIHB1YmxpYzoKKyAgICBjb25zdCB1bnNpZ25lZCByZWc7ICAvLyB0aGUgcmVnaXN0ZXIgb3Igc3RhY2sgc2xvdCBvZiB0aGlzIGludGVydmFsLgorICAgIGZsb2F0IHdlaWdodDsgICAgICAgIC8vIHdlaWdodCBvZiB0aGlzIGludGVydmFsCisKKyAgICBMaXZlSW50ZXJ2YWwodW5zaWduZWQgUmVnLCBmbG9hdCBXZWlnaHQpIDogcmVnKFJlZyksIHdlaWdodChXZWlnaHQpIHt9CisKKyAgICB+TGl2ZUludGVydmFsKCkgeworICAgICAgY2xlYXJTdWJSYW5nZXMoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIFNpbmdsZUxpbmtlZExpc3RJdGVyYXRvciB7CisgICAgICBUICpQOworCisgICAgcHVibGljOgorICAgICAgU2luZ2xlTGlua2VkTGlzdEl0ZXJhdG9yPFQ+KFQgKlApIDogUChQKSB7fQorCisgICAgICBTaW5nbGVMaW5rZWRMaXN0SXRlcmF0b3I8VD4gJm9wZXJhdG9yKysoKSB7CisgICAgICAgIFAgPSBQLT5OZXh0OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICBTaW5nbGVMaW5rZWRMaXN0SXRlcmF0b3I8VD4gb3BlcmF0b3IrKyhpbnQpIHsKKyAgICAgICAgU2luZ2xlTGlua2VkTGlzdEl0ZXJhdG9yIHJlcyA9ICp0aGlzOworICAgICAgICArKyp0aGlzOworICAgICAgICByZXR1cm4gcmVzOworICAgICAgfQorICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNpbmdsZUxpbmtlZExpc3RJdGVyYXRvcjxUPiAmT3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIFAgIT0gT3RoZXIub3BlcmF0b3ItPigpOworICAgICAgfQorICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNpbmdsZUxpbmtlZExpc3RJdGVyYXRvcjxUPiAmT3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIFAgPT0gT3RoZXIub3BlcmF0b3ItPigpOworICAgICAgfQorICAgICAgVCAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKlA7CisgICAgICB9CisgICAgICBUICpvcGVyYXRvci0+KCkgY29uc3QgeworICAgICAgICByZXR1cm4gUDsKKyAgICAgIH0KKyAgICB9OworCisgICAgdXNpbmcgc3VicmFuZ2VfaXRlcmF0b3IgPSBTaW5nbGVMaW5rZWRMaXN0SXRlcmF0b3I8U3ViUmFuZ2U+OworICAgIHVzaW5nIGNvbnN0X3N1YnJhbmdlX2l0ZXJhdG9yID0gU2luZ2xlTGlua2VkTGlzdEl0ZXJhdG9yPGNvbnN0IFN1YlJhbmdlPjsKKworICAgIHN1YnJhbmdlX2l0ZXJhdG9yIHN1YnJhbmdlX2JlZ2luKCkgeworICAgICAgcmV0dXJuIHN1YnJhbmdlX2l0ZXJhdG9yKFN1YlJhbmdlcyk7CisgICAgfQorICAgIHN1YnJhbmdlX2l0ZXJhdG9yIHN1YnJhbmdlX2VuZCgpIHsKKyAgICAgIHJldHVybiBzdWJyYW5nZV9pdGVyYXRvcihudWxscHRyKTsKKyAgICB9CisKKyAgICBjb25zdF9zdWJyYW5nZV9pdGVyYXRvciBzdWJyYW5nZV9iZWdpbigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjb25zdF9zdWJyYW5nZV9pdGVyYXRvcihTdWJSYW5nZXMpOworICAgIH0KKyAgICBjb25zdF9zdWJyYW5nZV9pdGVyYXRvciBzdWJyYW5nZV9lbmQoKSBjb25zdCB7CisgICAgICByZXR1cm4gY29uc3Rfc3VicmFuZ2VfaXRlcmF0b3IobnVsbHB0cik7CisgICAgfQorCisgICAgaXRlcmF0b3JfcmFuZ2U8c3VicmFuZ2VfaXRlcmF0b3I+IHN1YnJhbmdlcygpIHsKKyAgICAgIHJldHVybiBtYWtlX3JhbmdlKHN1YnJhbmdlX2JlZ2luKCksIHN1YnJhbmdlX2VuZCgpKTsKKyAgICB9CisKKyAgICBpdGVyYXRvcl9yYW5nZTxjb25zdF9zdWJyYW5nZV9pdGVyYXRvcj4gc3VicmFuZ2VzKCkgY29uc3QgeworICAgICAgcmV0dXJuIG1ha2VfcmFuZ2Uoc3VicmFuZ2VfYmVnaW4oKSwgc3VicmFuZ2VfZW5kKCkpOworICAgIH0KKworICAgIC8vLyBDcmVhdGVzIGEgbmV3IGVtcHR5IHN1YnJlZ2lzdGVyIGxpdmUgcmFuZ2UuIFRoZSByYW5nZSBpcyBhZGRlZCBhdCB0aGUKKyAgICAvLy8gYmVnaW5uaW5nIG9mIHRoZSBzdWJyYW5nZSBsaXN0OyBzdWJyYW5nZSBpdGVyYXRvcnMgc3RheSB2YWxpZC4KKyAgICBTdWJSYW5nZSAqY3JlYXRlU3ViUmFuZ2UoQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYW5lQml0bWFzayBMYW5lTWFzaykgeworICAgICAgU3ViUmFuZ2UgKlJhbmdlID0gbmV3IChBbGxvY2F0b3IpIFN1YlJhbmdlKExhbmVNYXNrKTsKKyAgICAgIGFwcGVuZFN1YlJhbmdlKFJhbmdlKTsKKyAgICAgIHJldHVybiBSYW5nZTsKKyAgICB9CisKKyAgICAvLy8gTGlrZSBjcmVhdGVTdWJSYW5nZSgpIGJ1dCB0aGUgbmV3IHJhbmdlIGlzIGZpbGxlZCB3aXRoIGEgY29weSBvZiB0aGUKKyAgICAvLy8gbGl2ZW5lc3MgaW5mb3JtYXRpb24gaW4gQHAgQ29weUZyb20uCisgICAgU3ViUmFuZ2UgKmNyZWF0ZVN1YlJhbmdlRnJvbShCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYW5lQml0bWFzayBMYW5lTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExpdmVSYW5nZSAmQ29weUZyb20pIHsKKyAgICAgIFN1YlJhbmdlICpSYW5nZSA9IG5ldyAoQWxsb2NhdG9yKSBTdWJSYW5nZShMYW5lTWFzaywgQ29weUZyb20sIEFsbG9jYXRvcik7CisgICAgICBhcHBlbmRTdWJSYW5nZShSYW5nZSk7CisgICAgICByZXR1cm4gUmFuZ2U7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBzdWJyZWdpc3RlciBsaXZlbmVzcyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuCisgICAgYm9vbCBoYXNTdWJSYW5nZXMoKSBjb25zdCB7CisgICAgICByZXR1cm4gU3ViUmFuZ2VzICE9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8vIFJlbW92ZXMgYWxsIHN1YnJlZ2lzdGVyIGxpdmVuZXNzIGluZm9ybWF0aW9uLgorICAgIHZvaWQgY2xlYXJTdWJSYW5nZXMoKTsKKworICAgIC8vLyBSZW1vdmVzIGFsbCBzdWJyYW5nZXMgd2l0aG91dCBhbnkgc2VnbWVudHMgKHN1YnJhbmdlcyB3aXRob3V0IHNlZ21lbnRzCisgICAgLy8vIGFyZSBub3QgY29uc2lkZXJlZCB2YWxpZCBhbmQgc2hvdWxkIG9ubHkgZXhpc3QgdGVtcG9yYXJpbHkpLgorICAgIHZvaWQgcmVtb3ZlRW1wdHlTdWJSYW5nZXMoKTsKKworICAgIC8vLyBnZXRTaXplIC0gUmV0dXJucyB0aGUgc3VtIG9mIHNpemVzIG9mIGFsbCB0aGUgTGl2ZVJhbmdlJ3MuCisgICAgLy8vCisgICAgdW5zaWduZWQgZ2V0U2l6ZSgpIGNvbnN0OworCisgICAgLy8vIGlzU3BpbGxhYmxlIC0gQ2FuIHRoaXMgaW50ZXJ2YWwgYmUgc3BpbGxlZD8KKyAgICBib29sIGlzU3BpbGxhYmxlKCkgY29uc3QgeworICAgICAgcmV0dXJuIHdlaWdodCAhPSBodWdlX3ZhbGY7CisgICAgfQorCisgICAgLy8vIG1hcmtOb3RTcGlsbGFibGUgLSBNYXJrIGludGVydmFsIGFzIG5vdCBzcGlsbGFibGUKKyAgICB2b2lkIG1hcmtOb3RTcGlsbGFibGUoKSB7CisgICAgICB3ZWlnaHQgPSBodWdlX3ZhbGY7CisgICAgfQorCisgICAgLy8vIEZvciBhIGdpdmVuIGxhbmUgbWFzayBAcCBMYW5lTWFzaywgY29tcHV0ZSBpbmRleGVzIGF0IHdoaWNoIHRoZQorICAgIC8vLyBsYW5lIGlzIG1hcmtlZCB1bmRlZmluZWQgYnkgc3VicmVnaXN0ZXIgPGRlZixyZWFkLXVuZGVmPiBkZWZpbml0aW9ucy4KKyAgICB2b2lkIGNvbXB1dGVTdWJSYW5nZVVuZGVmcyhTbWFsbFZlY3RvckltcGw8U2xvdEluZGV4PiAmVW5kZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhbmVCaXRtYXNrIExhbmVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbG90SW5kZXhlcyAmSW5kZXhlcykgY29uc3Q7CisKKyAgICAvLy8gUmVmaW5lcyB0aGUgc3VicmFuZ2VzIHRvIHN1cHBvcnQgXHAgTGFuZU1hc2suIFRoaXMgbWF5IG9ubHkgYmUgY2FsbGVkCisgICAgLy8vIGZvciBMSS5oYXNTdWJyYW5nZSgpPT10cnVlLiBTdWJyZWdpc3RlciByYW5nZXMgYXJlIHNwbGl0IG9yIGNyZWF0ZWQKKyAgICAvLy8gdW50aWwgXHAgTGFuZU1hc2sgY2FuIGJlIG1hdGNoZWQgZXhhY3RseS4gXHAgTW9kIGlzIGV4ZWN1dGVkIG9uIHRoZQorICAgIC8vLyBtYXRjaGluZyBzdWJyYW5nZXMuCisgICAgLy8vCisgICAgLy8vIEV4YW1wbGU6CisgICAgLy8vICAgIEdpdmVuIGFuIGludGVydmFsIHdpdGggc3VicmFuZ2VzIHdpdGggbGFuZW1hc2tzIEwwRjAwLCBMMDBGMCBhbmQKKyAgICAvLy8gICAgTDAwMEYsIHJlZmluaW5nIGZvciBtYXNrIEwwMDE4LiBXaWxsIHNwbGl0IHRoZSBMMDBGMCBsYW5lIGludG8KKyAgICAvLy8gICAgTDAwRTAgYW5kIEwwMDEwIGFuZCB0aGUgTDAwMEYgbGFuZSBpbnRvIEwwMDA3IGFuZCBMMDAwOC4gVGhlIE1vZAorICAgIC8vLyAgICBmdW5jdGlvbiB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIEwwMDEwIGFuZCBMMDAwOCBzdWJyYW5nZXMuCisgICAgdm9pZCByZWZpbmVTdWJSYW5nZXMoQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yLCBMYW5lQml0bWFzayBMYW5lTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoTGl2ZUludGVydmFsOjpTdWJSYW5nZSYpPiBNb2QpOworCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgTGl2ZUludGVydmFsJiBvdGhlcikgY29uc3QgeworICAgICAgY29uc3QgU2xvdEluZGV4ICZ0aGlzSW5kZXggPSBiZWdpbkluZGV4KCk7CisgICAgICBjb25zdCBTbG90SW5kZXggJm90aGVySW5kZXggPSBvdGhlci5iZWdpbkluZGV4KCk7CisgICAgICByZXR1cm4gc3RkOjp0aWUodGhpc0luZGV4LCByZWcpIDwgc3RkOjp0aWUob3RoZXJJbmRleCwgb3RoZXIucmVnKTsKKyAgICB9CisKKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgICAvLy8gXGJyaWVmIFdhbGtzIHRoZSBpbnRlcnZhbCBhbmQgYXNzZXJ0IGlmIGFueSBpbnZhcmlhbnRzIGZhaWwgdG8gaG9sZC4KKyAgICAvLy8KKyAgICAvLy8gTm90ZSB0aGF0IHRoaXMgaXMgYSBuby1vcCB3aGVuIGFzc2VydHMgYXJlIGRpc2FibGVkLgorI2lmZGVmIE5ERUJVRworICAgIHZvaWQgdmVyaWZ5KGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSA9IG51bGxwdHIpIGNvbnN0IHt9CisjZWxzZQorICAgIHZvaWQgdmVyaWZ5KGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSA9IG51bGxwdHIpIGNvbnN0OworI2VuZGlmCisKKyAgcHJpdmF0ZToKKyAgICAvLy8gQXBwZW5kcyBAcCBSYW5nZSB0byBTdWJSYW5nZXMgbGlzdC4KKyAgICB2b2lkIGFwcGVuZFN1YlJhbmdlKFN1YlJhbmdlICpSYW5nZSkgeworICAgICAgUmFuZ2UtPk5leHQgPSBTdWJSYW5nZXM7CisgICAgICBTdWJSYW5nZXMgPSBSYW5nZTsKKyAgICB9CisKKyAgICAvLy8gRnJlZSBtZW1vcnkgaGVsZCBieSBTdWJSYW5nZS4KKyAgICB2b2lkIGZyZWVTdWJSYW5nZShTdWJSYW5nZSAqUyk7CisgIH07CisKKyAgaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExpdmVJbnRlcnZhbDo6U3ViUmFuZ2UgJlNSKSB7CisgICAgU1IucHJpbnQoT1MpOworICAgIHJldHVybiBPUzsKKyAgfQorCisgIGlubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IExpdmVJbnRlcnZhbCAmTEkpIHsKKyAgICBMSS5wcmludChPUyk7CisgICAgcmV0dXJuIE9TOworICB9CisKKyAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBMaXZlUmFuZ2U6OlNlZ21lbnQgJlMpOworCisgIGlubGluZSBib29sIG9wZXJhdG9yPChTbG90SW5kZXggViwgY29uc3QgTGl2ZVJhbmdlOjpTZWdtZW50ICZTKSB7CisgICAgcmV0dXJuIFYgPCBTLnN0YXJ0OworICB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IExpdmVSYW5nZTo6U2VnbWVudCAmUywgU2xvdEluZGV4IFYpIHsKKyAgICByZXR1cm4gUy5zdGFydCA8IFY7CisgIH0KKworICAvLy8gSGVscGVyIGNsYXNzIGZvciBwZXJmb3JtYW50IExpdmVSYW5nZSBidWxrIHVwZGF0ZXMuCisgIC8vLworICAvLy8gQ2FsbGluZyBMaXZlUmFuZ2U6OmFkZFNlZ21lbnQoKSByZXBlYXRlZGx5IGNhbiBiZSBleHBlbnNpdmUgb24gbGFyZ2UKKyAgLy8vIGxpdmUgcmFuZ2VzIGJlY2F1c2Ugc2VnbWVudHMgYWZ0ZXIgdGhlIGluc2VydGlvbiBwb2ludCBtYXkgbmVlZCB0byBiZQorICAvLy8gc2hpZnRlZC4gVGhlIExpdmVSYW5nZVVwZGF0ZXIgY2xhc3MgY2FuIGRlZmVyIHRoZSBzaGlmdGluZyB3aGVuIGFkZGluZworICAvLy8gbWFueSBzZWdtZW50cyBpbiBvcmRlci4KKyAgLy8vCisgIC8vLyBUaGUgTGl2ZVJhbmdlIHdpbGwgYmUgaW4gYW4gaW52YWxpZCBzdGF0ZSB1bnRpbCBmbHVzaCgpIGlzIGNhbGxlZC4KKyAgY2xhc3MgTGl2ZVJhbmdlVXBkYXRlciB7CisgICAgTGl2ZVJhbmdlICpMUjsKKyAgICBTbG90SW5kZXggTGFzdFN0YXJ0OworICAgIExpdmVSYW5nZTo6aXRlcmF0b3IgV3JpdGVJOworICAgIExpdmVSYW5nZTo6aXRlcmF0b3IgUmVhZEk7CisgICAgU21hbGxWZWN0b3I8TGl2ZVJhbmdlOjpTZWdtZW50LCAxNj4gU3BpbGxzOworICAgIHZvaWQgbWVyZ2VTcGlsbHMoKTsKKworICBwdWJsaWM6CisgICAgLy8vIENyZWF0ZSBhIExpdmVSYW5nZVVwZGF0ZXIgZm9yIGFkZGluZyBzZWdtZW50cyB0byBMUi4KKyAgICAvLy8gTFIgd2lsbCB0ZW1wb3JhcmlseSBiZSBpbiBhbiBpbnZhbGlkIHN0YXRlIHVudGlsIGZsdXNoKCkgaXMgY2FsbGVkLgorICAgIExpdmVSYW5nZVVwZGF0ZXIoTGl2ZVJhbmdlICpsciA9IG51bGxwdHIpIDogTFIobHIpIHt9CisKKyAgICB+TGl2ZVJhbmdlVXBkYXRlcigpIHsgZmx1c2goKTsgfQorCisgICAgLy8vIEFkZCBhIHNlZ21lbnQgdG8gTFIgYW5kIGNvYWxlc2NlIHdoZW4gcG9zc2libGUsIGp1c3QgbGlrZQorICAgIC8vLyBMUi5hZGRTZWdtZW50KCkuIFNlZ21lbnRzIHNob3VsZCBiZSBhZGRlZCBpbiBpbmNyZWFzaW5nIHN0YXJ0IG9yZGVyIGZvcgorICAgIC8vLyBiZXN0IHBlcmZvcm1hbmNlLgorICAgIHZvaWQgYWRkKExpdmVSYW5nZTo6U2VnbWVudCk7CisKKyAgICB2b2lkIGFkZChTbG90SW5kZXggU3RhcnQsIFNsb3RJbmRleCBFbmQsIFZOSW5mbyAqVk5JKSB7CisgICAgICBhZGQoTGl2ZVJhbmdlOjpTZWdtZW50KFN0YXJ0LCBFbmQsIFZOSSkpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgTFIgaXMgY3VycmVudGx5IGluIGFuIGludmFsaWQgc3RhdGUsIGFuZCBmbHVzaCgpCisgICAgLy8vIG5lZWRzIHRvIGJlIGNhbGxlZC4KKyAgICBib29sIGlzRGlydHkoKSBjb25zdCB7IHJldHVybiBMYXN0U3RhcnQuaXNWYWxpZCgpOyB9CisKKyAgICAvLy8gRmx1c2ggdGhlIHVwZGF0ZXIgc3RhdGUgdG8gTFIgc28gaXQgaXMgdmFsaWQgYW5kIGNvbnRhaW5zIGFsbCBhZGRlZAorICAgIC8vLyBzZWdtZW50cy4KKyAgICB2b2lkIGZsdXNoKCk7CisKKyAgICAvLy8gU2VsZWN0IGEgZGlmZmVyZW50IGRlc3RpbmF0aW9uIGxpdmUgcmFuZ2UuCisgICAgdm9pZCBzZXREZXN0KExpdmVSYW5nZSAqbHIpIHsKKyAgICAgIGlmIChMUiAhPSBsciAmJiBpc0RpcnR5KCkpCisgICAgICAgIGZsdXNoKCk7CisgICAgICBMUiA9IGxyOworICAgIH0KKworICAgIC8vLyBHZXQgdGhlIGN1cnJlbnQgZGVzdGluYXRpb24gbGl2ZSByYW5nZS4KKyAgICBMaXZlUmFuZ2UgKmdldERlc3QoKSBjb25zdCB7IHJldHVybiBMUjsgfQorCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSYpIGNvbnN0OworICB9OworCisgIGlubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IExpdmVSYW5nZVVwZGF0ZXIgJlgpIHsKKyAgICBYLnByaW50KE9TKTsKKyAgICByZXR1cm4gT1M7CisgIH0KKworICAvLy8gQ29ubmVjdGVkVk5JbmZvRXFDbGFzc2VzIC0gSGVscGVyIGNsYXNzIHRoYXQgY2FuIGRpdmlkZSBWTkluZm9zIGluIGEKKyAgLy8vIExpdmVJbnRlcnZhbCBpbnRvIGVxdWl2YWxlbmNlIGNsYXNlcyBvZiBjb25uZWN0ZWQgY29tcG9uZW50cy4gQQorICAvLy8gTGl2ZUludGVydmFsIHRoYXQgaGFzIG11bHRpcGxlIGNvbm5lY3RlZCBjb21wb25lbnRzIGNhbiBiZSBicm9rZW4gaW50bworICAvLy8gbXVsdGlwbGUgTGl2ZUludGVydmFscy4KKyAgLy8vCisgIC8vLyBHaXZlbiBhIExpdmVJbnRlcnZhbCB0aGF0IG1heSBoYXZlIG11bHRpcGxlIGNvbm5lY3RlZCBjb21wb25lbnRzLCBydW46CisgIC8vLworICAvLy8gICB1bnNpZ25lZCBudW1Db21wcyA9IENvbkVRLkNsYXNzaWZ5KExJKTsKKyAgLy8vICAgaWYgKG51bUNvbXBzID4gMSkgeworICAvLy8gICAgIC8vIGFsbG9jYXRlIG51bUNvbXBzLTEgbmV3IExpdmVJbnRlcnZhbHMgaW50byBMSVNbMS4uXQorICAvLy8gICAgIENvbkVRLkRpc3RyaWJ1dGUoTElTKTsKKyAgLy8vIH0KKworICBjbGFzcyBDb25uZWN0ZWRWTkluZm9FcUNsYXNzZXMgeworICAgIExpdmVJbnRlcnZhbHMgJkxJUzsKKyAgICBJbnRFcUNsYXNzZXMgRXFDbGFzczsKKworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQ29ubmVjdGVkVk5JbmZvRXFDbGFzc2VzKExpdmVJbnRlcnZhbHMgJmxpcykgOiBMSVMobGlzKSB7fQorCisgICAgLy8vIENsYXNzaWZ5IHRoZSB2YWx1ZXMgaW4gXHAgTFIgaW50byBjb25uZWN0ZWQgY29tcG9uZW50cy4KKyAgICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbm5lY3RlZCBjb21wb25lbnRzLgorICAgIHVuc2lnbmVkIENsYXNzaWZ5KGNvbnN0IExpdmVSYW5nZSAmTFIpOworCisgICAgLy8vIGdldEVxQ2xhc3MgLSBDbGFzc2lmeSBjcmVhdGVzIGVxdWl2YWxlbmNlIGNsYXNzZXMgbnVtYmVyZWQgMC4uTi4gUmV0dXJuCisgICAgLy8vIHRoZSBlcXVpdmFsZW5jZSBjbGFzcyBhc3NpZ25lZCB0aGUgVk5JLgorICAgIHVuc2lnbmVkIGdldEVxQ2xhc3MoY29uc3QgVk5JbmZvICpWTkkpIGNvbnN0IHsgcmV0dXJuIEVxQ2xhc3NbVk5JLT5pZF07IH0KKworICAgIC8vLyBEaXN0cmlidXRlIHZhbHVlcyBpbiBccCBMSSBpbnRvIGEgc2VwYXJhdGUgTGl2ZUludGVydmFscworICAgIC8vLyBmb3IgZWFjaCBjb25uZWN0ZWQgY29tcG9uZW50LiBMSVYgbXVzdCBoYXZlIGFuIGVtcHR5IExpdmVJbnRlcnZhbCBmb3IKKyAgICAvLy8gZWFjaCBhZGRpdGlvbmFsIGNvbm5lY3RlZCBjb21wb25lbnQuIFRoZSBmaXJzdCBjb25uZWN0ZWQgY29tcG9uZW50IGlzCisgICAgLy8vIGxlZnQgaW4gXHAgTEkuCisgICAgdm9pZCBEaXN0cmlidXRlKExpdmVJbnRlcnZhbCAmTEksIExpdmVJbnRlcnZhbCAqTElWW10sCisgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSk7CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTElWRUlOVEVSVkFMX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWxVbmlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbFVuaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyMmU1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWxVbmlvbi5oCkBAIC0wLDAgKzEsMTk5IEBACisvLz09PS0gTGl2ZUludGVydmFsVW5pb24uaCAtIExpdmUgaW50ZXJ2YWwgdW5pb24gZGF0YSBzdHJ1Y3QgLS0tKi0gQysrIC0qLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExpdmVJbnRlcnZhbFVuaW9uIGlzIGEgdW5pb24gb2YgbGl2ZSBzZWdtZW50cyBhY3Jvc3MgbXVsdGlwbGUgbGl2ZSB2aXJ0dWFsCisvLyByZWdpc3RlcnMuIFRoaXMgbWF5IGJlIHVzZWQgZHVyaW5nIGNvYWxlc2NpbmcgdG8gcmVwcmVzZW50IGEgY29uZ3J1ZW5jZQorLy8gY2xhc3MsIG9yIGR1cmluZyByZWdpc3RlciBhbGxvY2F0aW9uIHRvIG1vZGVsIGxpdmVuZXNzIG9mIGEgcGh5c2ljYWwKKy8vIHJlZ2lzdGVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0xJVkVJTlRFUlZBTFVOSU9OX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0xJVkVJTlRFUlZBTFVOSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0ludGVydmFsTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Nsb3RJbmRleGVzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxsaW1pdHM+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CisKKyNpZm5kZWYgTkRFQlVHCisvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCit0ZW1wbGF0ZSA8dW5zaWduZWQgRWxlbWVudD4gY2xhc3MgU3BhcnNlQml0VmVjdG9yOworCit1c2luZyBMaXZlVmlydFJlZ0JpdFNldCA9IFNwYXJzZUJpdFZlY3RvcjwxMjg+OworI2VuZGlmCisKKy8vLyBVbmlvbiBvZiBsaXZlIGludGVydmFscyB0aGF0IGFyZSBzdHJvbmcgY2FuZGlkYXRlcyBmb3IgY29hbGVzY2luZyBpbnRvIGEKKy8vLyBzaW5nbGUgcmVnaXN0ZXIgKGVpdGhlciBwaHlzaWNhbCBvciB2aXJ0dWFsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCkuICBXZQorLy8vIGV4cGVjdCB0aGUgY29uc3RpdHVlbnQgbGl2ZSBpbnRlcnZhbHMgdG8gYmUgZGlzam9pbnQsIGFsdGhvdWdoIHdlIG1heQorLy8vIGV2ZW50dWFsbHkgbWFrZSBleGNlcHRpb25zIHRvIGhhbmRsZSB2YWx1ZS1iYXNlZCBpbnRlcmZlcmVuY2UuCitjbGFzcyBMaXZlSW50ZXJ2YWxVbmlvbiB7CisgIC8vIEEgc2V0IG9mIGxpdmUgdmlydHVhbCByZWdpc3RlciBzZWdtZW50cyB0aGF0IHN1cHBvcnRzIGZhc3QgaW5zZXJ0aW9uLAorICAvLyBpbnRlcnNlY3Rpb24sIGFuZCByZW1vdmFsLgorICAvLyBNYXBwaW5nIFNsb3RJbmRleCBpbnRlcnZhbHMgdG8gdmlydHVhbCByZWdpc3RlciBudW1iZXJzLgorICB1c2luZyBMaXZlU2VnbWVudHMgPSBJbnRlcnZhbE1hcDxTbG90SW5kZXgsIExpdmVJbnRlcnZhbCo+OworCitwdWJsaWM6CisgIC8vIFNlZ21lbnRJdGVyIGNhbiBhZHZhbmNlIHRvIHRoZSBuZXh0IHNlZ21lbnQgb3JkZXJlZCBieSBzdGFydGluZyBwb3NpdGlvbgorICAvLyB3aGljaCBtYXkgYmVsb25nIHRvIGEgZGlmZmVyZW50IGxpdmUgdmlydHVhbCByZWdpc3Rlci4gV2UgYWxzbyBtdXN0IGJlIGFibGUKKyAgLy8gdG8gcmVhY2ggdGhlIGN1cnJlbnQgc2VnbWVudCdzIGNvbnRhaW5pbmcgdmlydHVhbCByZWdpc3Rlci4KKyAgdXNpbmcgU2VnbWVudEl0ZXIgPSBMaXZlU2VnbWVudHM6Oml0ZXJhdG9yOworCisgIC8vLyBDb25zdCB2ZXJzaW9uIG9mIFNlZ21lbnRJdGVyLgorICB1c2luZyBDb25zdFNlZ21lbnRJdGVyID0gTGl2ZVNlZ21lbnRzOjpjb25zdF9pdGVyYXRvcjsKKworICAvLyBMaXZlSW50ZXJ2YWxVbmlvbnMgc2hhcmUgYW4gZXh0ZXJuYWwgYWxsb2NhdG9yLgorICB1c2luZyBBbGxvY2F0b3IgPSBMaXZlU2VnbWVudHM6OkFsbG9jYXRvcjsKKworcHJpdmF0ZToKKyAgdW5zaWduZWQgVGFnID0gMDsgICAgICAgLy8gdW5pcXVlIHRhZyBmb3IgY3VycmVudCBjb250ZW50cy4KKyAgTGl2ZVNlZ21lbnRzIFNlZ21lbnRzOyAgLy8gdW5pb24gb2YgdmlydHVhbCByZWcgc2VnbWVudHMKKworcHVibGljOgorICBleHBsaWNpdCBMaXZlSW50ZXJ2YWxVbmlvbihBbGxvY2F0b3IgJmEpIDogU2VnbWVudHMoYSkge30KKworICAvLyBJdGVyYXRlIG92ZXIgYWxsIHNlZ21lbnRzIGluIHRoZSB1bmlvbiBvZiBsaXZlIHZpcnR1YWwgcmVnaXN0ZXJzIG9yZGVyZWQKKyAgLy8gYnkgdGhlaXIgc3RhcnRpbmcgcG9zaXRpb24uCisgIFNlZ21lbnRJdGVyIGJlZ2luKCkgeyByZXR1cm4gU2VnbWVudHMuYmVnaW4oKTsgfQorICBTZWdtZW50SXRlciBlbmQoKSB7IHJldHVybiBTZWdtZW50cy5lbmQoKTsgfQorICBTZWdtZW50SXRlciBmaW5kKFNsb3RJbmRleCB4KSB7IHJldHVybiBTZWdtZW50cy5maW5kKHgpOyB9CisgIENvbnN0U2VnbWVudEl0ZXIgYmVnaW4oKSBjb25zdCB7IHJldHVybiBTZWdtZW50cy5iZWdpbigpOyB9CisgIENvbnN0U2VnbWVudEl0ZXIgZW5kKCkgY29uc3QgeyByZXR1cm4gU2VnbWVudHMuZW5kKCk7IH0KKyAgQ29uc3RTZWdtZW50SXRlciBmaW5kKFNsb3RJbmRleCB4KSBjb25zdCB7IHJldHVybiBTZWdtZW50cy5maW5kKHgpOyB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFNlZ21lbnRzLmVtcHR5KCk7IH0KKyAgU2xvdEluZGV4IHN0YXJ0SW5kZXgoKSBjb25zdCB7IHJldHVybiBTZWdtZW50cy5zdGFydCgpOyB9CisKKyAgLy8gUHJvdmlkZSBwdWJsaWMgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIG1hcCB0byBhbGxvdyBvdmVybGFwIGl0ZXJhdGlvbi4KKyAgdXNpbmcgTWFwID0gTGl2ZVNlZ21lbnRzOworICBjb25zdCBNYXAgJmdldE1hcCgpIGNvbnN0IHsgcmV0dXJuIFNlZ21lbnRzOyB9CisKKyAgLy8vIGdldFRhZyAtIFJldHVybiBhbiBvcGFxdWUgdGFnIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdW5pb24uCisgIHVuc2lnbmVkIGdldFRhZygpIGNvbnN0IHsgcmV0dXJuIFRhZzsgfQorCisgIC8vLyBjaGFuZ2VkU2luY2UgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgdW5pb24gY2hhbmdlIHNpbmNlIGdldFRhZyByZXR1cm5lZCB0YWcuCisgIGJvb2wgY2hhbmdlZFNpbmNlKHVuc2lnbmVkIHRhZykgY29uc3QgeyByZXR1cm4gdGFnICE9IFRhZzsgfQorCisgIC8vIEFkZCBhIGxpdmUgdmlydHVhbCByZWdpc3RlciB0byB0aGlzIHVuaW9uIGFuZCBtZXJnZSBpdHMgc2VnbWVudHMuCisgIHZvaWQgdW5pZnkoTGl2ZUludGVydmFsICZWaXJ0UmVnLCBjb25zdCBMaXZlUmFuZ2UgJlJhbmdlKTsKKworICAvLyBSZW1vdmUgYSBsaXZlIHZpcnR1YWwgcmVnaXN0ZXIncyBzZWdtZW50cyBmcm9tIHRoaXMgdW5pb24uCisgIHZvaWQgZXh0cmFjdChMaXZlSW50ZXJ2YWwgJlZpcnRSZWcsIGNvbnN0IExpdmVSYW5nZSAmUmFuZ2UpOworCisgIC8vIFJlbW92ZSBhbGwgaW5zZXJ0ZWQgdmlydHVhbCByZWdpc3RlcnMuCisgIHZvaWQgY2xlYXIoKSB7IFNlZ21lbnRzLmNsZWFyKCk7ICsrVGFnOyB9CisKKyAgLy8gUHJpbnQgdW5pb24sIHVzaW5nIFRSSSB0byB0cmFuc2xhdGUgcmVnaXN0ZXIgbmFtZXMKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKworI2lmbmRlZiBOREVCVUcKKyAgLy8gVmVyaWZ5IHRoZSBsaXZlIGludGVydmFscyBpbiB0aGlzIHVuaW9uIGFuZCBhZGQgdGhlbSB0byB0aGUgdmlzaXRlZCBzZXQuCisgIHZvaWQgdmVyaWZ5KExpdmVWaXJ0UmVnQml0U2V0JiBWaXNpdGVkVlJlZ3MpOworI2VuZGlmCisKKyAgLy8vIFF1ZXJ5IGludGVyZmVyZW5jZXMgYmV0d2VlbiBhIHNpbmdsZSBsaXZlIHZpcnR1YWwgcmVnaXN0ZXIgYW5kIGEgbGl2ZQorICAvLy8gaW50ZXJ2YWwgdW5pb24uCisgIGNsYXNzIFF1ZXJ5IHsKKyAgICBjb25zdCBMaXZlSW50ZXJ2YWxVbmlvbiAqTGl2ZVVuaW9uID0gbnVsbHB0cjsKKyAgICBjb25zdCBMaXZlUmFuZ2UgKkxSID0gbnVsbHB0cjsKKyAgICBMaXZlUmFuZ2U6OmNvbnN0X2l0ZXJhdG9yIExSSTsgIC8vLzwgY3VycmVudCBwb3NpdGlvbiBpbiBMUgorICAgIENvbnN0U2VnbWVudEl0ZXIgTGl2ZVVuaW9uSTsgICAgLy8vPCBjdXJyZW50IHBvc2l0aW9uIGluIExpdmVVbmlvbgorICAgIFNtYWxsVmVjdG9yPExpdmVJbnRlcnZhbCosND4gSW50ZXJmZXJpbmdWUmVnczsKKyAgICBib29sIENoZWNrZWRGaXJzdEludGVyZmVyZW5jZSA9IGZhbHNlOworICAgIGJvb2wgU2VlbkFsbEludGVyZmVyZW5jZXMgPSBmYWxzZTsKKyAgICB1bnNpZ25lZCBUYWcgPSAwOworICAgIHVuc2lnbmVkIFVzZXJUYWcgPSAwOworCisgICAgdm9pZCByZXNldCh1bnNpZ25lZCBOZXdVc2VyVGFnLCBjb25zdCBMaXZlUmFuZ2UgJk5ld0xSLAorICAgICAgICAgICAgICAgY29uc3QgTGl2ZUludGVydmFsVW5pb24gJk5ld0xpdmVVbmlvbikgeworICAgICAgTGl2ZVVuaW9uID0gJk5ld0xpdmVVbmlvbjsKKyAgICAgIExSID0gJk5ld0xSOworICAgICAgSW50ZXJmZXJpbmdWUmVncy5jbGVhcigpOworICAgICAgQ2hlY2tlZEZpcnN0SW50ZXJmZXJlbmNlID0gZmFsc2U7CisgICAgICBTZWVuQWxsSW50ZXJmZXJlbmNlcyA9IGZhbHNlOworICAgICAgVGFnID0gTmV3TGl2ZVVuaW9uLmdldFRhZygpOworICAgICAgVXNlclRhZyA9IE5ld1VzZXJUYWc7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBRdWVyeSgpID0gZGVmYXVsdDsKKyAgICBRdWVyeShjb25zdCBMaXZlUmFuZ2UgJkxSLCBjb25zdCBMaXZlSW50ZXJ2YWxVbmlvbiAmTElVKToKKyAgICAgIExpdmVVbmlvbigmTElVKSwgTFIoJkxSKSB7fQorICAgIFF1ZXJ5KGNvbnN0IFF1ZXJ5ICYpID0gZGVsZXRlOworICAgIFF1ZXJ5ICZvcGVyYXRvcj0oY29uc3QgUXVlcnkgJikgPSBkZWxldGU7CisKKyAgICB2b2lkIGluaXQodW5zaWduZWQgTmV3VXNlclRhZywgY29uc3QgTGl2ZVJhbmdlICZOZXdMUiwKKyAgICAgICAgICAgICAgY29uc3QgTGl2ZUludGVydmFsVW5pb24gJk5ld0xpdmVVbmlvbikgeworICAgICAgaWYgKFVzZXJUYWcgPT0gTmV3VXNlclRhZyAmJiBMUiA9PSAmTmV3TFIgJiYgTGl2ZVVuaW9uID09ICZOZXdMaXZlVW5pb24gJiYKKyAgICAgICAgICAhTmV3TGl2ZVVuaW9uLmNoYW5nZWRTaW5jZShUYWcpKSB7CisgICAgICAgIC8vIFJldGFpbiBjYWNoZWQgcmVzdWx0cywgZS5nLiBmaXJzdEludGVyZmVyZW5jZS4KKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgcmVzZXQoTmV3VXNlclRhZywgTmV3TFIsIE5ld0xpdmVVbmlvbik7CisgICAgfQorCisgICAgLy8gRG9lcyB0aGlzIGxpdmUgdmlydHVhbCByZWdpc3RlciBpbnRlcmZlcmUgd2l0aCB0aGUgdW5pb24/CisgICAgYm9vbCBjaGVja0ludGVyZmVyZW5jZSgpIHsgcmV0dXJuIGNvbGxlY3RJbnRlcmZlcmluZ1ZSZWdzKDEpOyB9CisKKyAgICAvLyBDb3VudCB0aGUgdmlydHVhbCByZWdpc3RlcnMgaW4gdGhpcyB1bmlvbiB0aGF0IGludGVyZmVyZSB3aXRoIHRoaXMKKyAgICAvLyBxdWVyeSdzIGxpdmUgdmlydHVhbCByZWdpc3RlciwgdXAgdG8gbWF4SW50ZXJmZXJpbmdSZWdzLgorICAgIHVuc2lnbmVkIGNvbGxlY3RJbnRlcmZlcmluZ1ZSZWdzKAorICAgICAgICB1bnNpZ25lZCBNYXhJbnRlcmZlcmluZ1JlZ3MgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkpOworCisgICAgLy8gV2FzIHRoaXMgdmlydHVhbCByZWdpc3RlciB2aXNpdGVkIGR1cmluZyBjb2xsZWN0SW50ZXJmZXJpbmdWUmVncz8KKyAgICBib29sIGlzU2VlbkludGVyZmVyZW5jZShMaXZlSW50ZXJ2YWwgKlZSZWcpIGNvbnN0OworCisgICAgLy8gRGlkIGNvbGxlY3RJbnRlcmZlcmluZ1ZSZWdzIGNvbGxlY3QgYWxsIGludGVyZmVyZW5jZXM/CisgICAgYm9vbCBzZWVuQWxsSW50ZXJmZXJlbmNlcygpIGNvbnN0IHsgcmV0dXJuIFNlZW5BbGxJbnRlcmZlcmVuY2VzOyB9CisKKyAgICAvLyBWZWN0b3IgZ2VuZXJhdGVkIGJ5IGNvbGxlY3RJbnRlcmZlcmluZ1ZSZWdzLgorICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxMaXZlSW50ZXJ2YWwqPiAmaW50ZXJmZXJpbmdWUmVncygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBJbnRlcmZlcmluZ1ZSZWdzOworICAgIH0KKyAgfTsKKworICAvLyBBcnJheSBvZiBMaXZlSW50ZXJ2YWxVbmlvbnMuCisgIGNsYXNzIEFycmF5IHsKKyAgICB1bnNpZ25lZCBTaXplID0gMDsKKyAgICBMaXZlSW50ZXJ2YWxVbmlvbiAqTElVcyA9IG51bGxwdHI7CisKKyAgcHVibGljOgorICAgIEFycmF5KCkgPSBkZWZhdWx0OworICAgIH5BcnJheSgpIHsgY2xlYXIoKTsgfQorCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgYXJyYXkgdG8gaGF2ZSBTaXplIGVudHJpZXMuCisgICAgLy8gUmV1c2UgYW4gZXhpc3RpbmcgYWxsb2NhdGlvbiBpZiB0aGUgc2l6ZSBtYXRjaGVzLgorICAgIHZvaWQgaW5pdChMaXZlSW50ZXJ2YWxVbmlvbjo6QWxsb2NhdG9yJiwgdW5zaWduZWQgU2l6ZSk7CisKKyAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorCisgICAgdm9pZCBjbGVhcigpOworCisgICAgTGl2ZUludGVydmFsVW5pb24mIG9wZXJhdG9yW10odW5zaWduZWQgaWR4KSB7CisgICAgICBhc3NlcnQoaWR4IDwgIFNpemUgJiYgImlkeCBvdXQgb2YgYm91bmRzIik7CisgICAgICByZXR1cm4gTElVc1tpZHhdOworICAgIH0KKworICAgIGNvbnN0IExpdmVJbnRlcnZhbFVuaW9uJiBvcGVyYXRvcltdKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgICAgYXNzZXJ0KElkeCA8IFNpemUgJiYgIklkeCBvdXQgb2YgYm91bmRzIik7CisgICAgICByZXR1cm4gTElVc1tJZHhdOworICAgIH0KKyAgfTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTElWRUlOVEVSVkFMVU5JT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE1MGYzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWxzLmgKQEAgLTAsMCArMSw0ODEgQEAKKy8vPT09LSBMaXZlSW50ZXJ2YWxzLmggLSBMaXZlIEludGVydmFsIEFuYWx5c2lzIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBMaXZlSW50ZXJ2YWwgYW5hbHlzaXMgcGFzcy4gIEdpdmVuIHNvbWUKKy8vLyBudW1iZXJpbmcgb2YgZWFjaCB0aGUgbWFjaGluZSBpbnN0cnVjdGlvbnMgKGluIHRoaXMgaW1wbGVtZW50aW9uIGRlcHRoLWZpcnN0CisvLy8gb3JkZXIpIGFuIGludGVydmFsIFtpLCBqKSBpcyBzYWlkIHRvIGJlIGEgbGl2ZSBpbnRlcnZhbCBmb3IgcmVnaXN0ZXIgdiBpZgorLy8vIHRoZXJlIGlzIG5vIGluc3RydWN0aW9uIHdpdGggbnVtYmVyIGonID4gaiBzdWNoIHRoYXQgdiBpcyBsaXZlIGF0IGonIGFuZAorLy8vIHRoZXJlIGlzIG5vIGluc3RydWN0aW9uIHdpdGggbnVtYmVyIGknIDwgaSBzdWNoIHRoYXQgdiBpcyBsaXZlIGF0IGknLiBJbgorLy8vIHRoaXMgaW1wbGVtZW50YXRpb24gaW50ZXJ2YWxzIGNhbiBoYXZlIGhvbGVzLCBpLmUuIGFuIGludGVydmFsIG1pZ2h0IGxvb2sKKy8vLyBsaWtlIFsxLDIwKSwgWzUwLDY1KSwgWzEwMDAsMTAwMSkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTElWRUlOVEVSVkFMU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9MSVZFSU5URVJWQUxTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW5kZXhlZE1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Nsb3RJbmRleGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTGFuZUJpdG1hc2suaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2V4dGVybiBjbDo6b3B0PGJvb2w+IFVzZVNlZ21lbnRTZXRGb3JQaHlzUmVnczsKKworY2xhc3MgQml0VmVjdG9yOworY2xhc3MgTGl2ZVJhbmdlQ2FsYzsKK2NsYXNzIE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm87CitjbGFzcyBNYWNoaW5lRG9taW5hdG9yVHJlZTsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFRhcmdldEluc3RySW5mbzsKK2NsYXNzIFZpcnRSZWdNYXA7CisKKyAgY2xhc3MgTGl2ZUludGVydmFscyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgICBNYWNoaW5lRnVuY3Rpb24qIE1GOworICAgIE1hY2hpbmVSZWdpc3RlckluZm8qIE1SSTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8qIFRSSTsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8qIFRJSTsKKyAgICBBbGlhc0FuYWx5c2lzICpBQTsKKyAgICBTbG90SW5kZXhlcyogSW5kZXhlczsKKyAgICBNYWNoaW5lRG9taW5hdG9yVHJlZSAqRG9tVHJlZSA9IG51bGxwdHI7CisgICAgTGl2ZVJhbmdlQ2FsYyAqTFJDYWxjID0gbnVsbHB0cjsKKworICAgIC8vLyBTcGVjaWFsIHBvb2wgYWxsb2NhdG9yIGZvciBWTkluZm8ncyAoTGl2ZUludGVydmFsIHZhbCMpLgorICAgIFZOSW5mbzo6QWxsb2NhdG9yIFZOSW5mb0FsbG9jYXRvcjsKKworICAgIC8vLyBMaXZlIGludGVydmFsIHBvaW50ZXJzIGZvciBhbGwgdGhlIHZpcnR1YWwgcmVnaXN0ZXJzLgorICAgIEluZGV4ZWRNYXA8TGl2ZUludGVydmFsKiwgVmlydFJlZzJJbmRleEZ1bmN0b3I+IFZpcnRSZWdJbnRlcnZhbHM7CisKKyAgICAvLy8gU29ydGVkIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zIHdpdGggcmVnaXN0ZXIgbWFzayBvcGVyYW5kcy4gQWx3YXlzIHVzZSB0aGUKKyAgICAvLy8gJ3InIHNsb3QsIFJlZ01hc2tzIGFyZSBub3JtYWwgY2xvYmJlcnMsIG5vdCBlYXJseSBjbG9iYmVycy4KKyAgICBTbWFsbFZlY3RvcjxTbG90SW5kZXgsIDg+IFJlZ01hc2tTbG90czsKKworICAgIC8vLyBUaGlzIHZlY3RvciBpcyBwYXJhbGxlbCB0byBSZWdNYXNrU2xvdHMsIGl0IGhvbGRzIGEgcG9pbnRlciB0byB0aGUKKyAgICAvLy8gY29ycmVzcG9uZGluZyByZWdpc3RlciBtYXNrLiAgVGhpcyBwb2ludGVyIGNhbiBiZSByZWNvbXB1dGVkIGFzOgorICAgIC8vLworICAgIC8vLyAgIE1JID0gSW5kZXhlcy0+Z2V0SW5zdHJ1Y3Rpb25Gcm9tSW5kZXgoUmVnTWFza1Nsb3RbTl0pOworICAgIC8vLyAgIHVuc2lnbmVkIE9wTnVtID0gZmluZFJlZ01hc2tPcGVyYW5kKE1JKTsKKyAgICAvLy8gICBSZWdNYXNrQml0c1tOXSA9IE1JLT5nZXRPcGVyYW5kKE9wTnVtKS5nZXRSZWdNYXNrKCk7CisgICAgLy8vCisgICAgLy8vIFRoaXMgaXMga2VwdCBpbiBhIHNlcGFyYXRlIHZlY3RvciBwYXJ0bHkgYmVjYXVzZSBzb21lIHN0YW5kYXJkCisgICAgLy8vIGxpYnJhcmllcyBkb24ndCBzdXBwb3J0IGxvd2VyX2JvdW5kKCkgd2l0aCBtaXhlZCBvYmplY3RzLCBwYXJ0bHkgdG8KKyAgICAvLy8gaW1wcm92ZSBsb2NhbGl0eSB3aGVuIHNlYXJjaGluZyBpbiBSZWdNYXNrU2xvdHMuCisgICAgLy8vIEFsc28gc2VlIHRoZSBjb21tZW50IGluIExpdmVJbnRlcnZhbDo6ZmluZCgpLgorICAgIFNtYWxsVmVjdG9yPGNvbnN0IHVpbnQzMl90KiwgOD4gUmVnTWFza0JpdHM7CisKKyAgICAvLy8gRm9yIGVhY2ggYmFzaWMgYmxvY2sgbnVtYmVyLCBrZWVwIChiZWdpbiwgc2l6ZSkgcGFpcnMgaW5kZXhpbmcgaW50byB0aGUKKyAgICAvLy8gUmVnTWFza1Nsb3RzIGFuZCBSZWdNYXNrQml0cyBhcnJheXMuCisgICAgLy8vIE5vdGUgdGhhdCBiYXNpYyBibG9jayBudW1iZXJzIG1heSBub3QgYmUgbGF5b3V0IGNvbnRpZ3VvdXMsIHRoYXQncyB3aHkKKyAgICAvLy8gd2UgY2FuJ3QganVzdCBrZWVwIHRyYWNrIG9mIHRoZSBmaXJzdCByZWdpc3RlciBtYXNrIGluIGVhY2ggYmFzaWMKKyAgICAvLy8gYmxvY2suCisgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4sIDg+IFJlZ01hc2tCbG9ja3M7CisKKyAgICAvLy8gS2VlcHMgYSBsaXZlIHJhbmdlIHNldCBmb3IgZWFjaCByZWdpc3RlciB1bml0IHRvIHRyYWNrIGZpeGVkIHBoeXNyZWcKKyAgICAvLy8gaW50ZXJmZXJlbmNlLgorICAgIFNtYWxsVmVjdG9yPExpdmVSYW5nZSosIDA+IFJlZ1VuaXRSYW5nZXM7CisKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOworCisgICAgTGl2ZUludGVydmFscygpOworICAgIH5MaXZlSW50ZXJ2YWxzKCkgb3ZlcnJpZGU7CisKKyAgICAvLy8gQ2FsY3VsYXRlIHRoZSBzcGlsbCB3ZWlnaHQgdG8gYXNzaWduIHRvIGEgc2luZ2xlIGluc3RydWN0aW9uLgorICAgIHN0YXRpYyBmbG9hdCBnZXRTcGlsbFdlaWdodChib29sIGlzRGVmLCBib29sIGlzVXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvICpNQkZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgJkluc3RyKTsKKworICAgIC8vLyBDYWxjdWxhdGUgdGhlIHNwaWxsIHdlaWdodCB0byBhc3NpZ24gdG8gYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCisgICAgc3RhdGljIGZsb2F0IGdldFNwaWxsV2VpZ2h0KGJvb2wgaXNEZWYsIGJvb2wgaXNVc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8gKk1CRkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpOworCisgICAgTGl2ZUludGVydmFsICZnZXRJbnRlcnZhbCh1bnNpZ25lZCBSZWcpIHsKKyAgICAgIGlmIChoYXNJbnRlcnZhbChSZWcpKQorICAgICAgICByZXR1cm4gKlZpcnRSZWdJbnRlcnZhbHNbUmVnXTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUFuZENvbXB1dGVWaXJ0UmVnSW50ZXJ2YWwoUmVnKTsKKyAgICB9CisKKyAgICBjb25zdCBMaXZlSW50ZXJ2YWwgJmdldEludGVydmFsKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TGl2ZUludGVydmFscyo+KHRoaXMpLT5nZXRJbnRlcnZhbChSZWcpOworICAgIH0KKworICAgIGJvb2wgaGFzSW50ZXJ2YWwodW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgICByZXR1cm4gVmlydFJlZ0ludGVydmFscy5pbkJvdW5kcyhSZWcpICYmIFZpcnRSZWdJbnRlcnZhbHNbUmVnXTsKKyAgICB9CisKKyAgICAvLy8gSW50ZXJ2YWwgY3JlYXRpb24uCisgICAgTGl2ZUludGVydmFsICZjcmVhdGVFbXB0eUludGVydmFsKHVuc2lnbmVkIFJlZykgeworICAgICAgYXNzZXJ0KCFoYXNJbnRlcnZhbChSZWcpICYmICJJbnRlcnZhbCBhbHJlYWR5IGV4aXN0cyEiKTsKKyAgICAgIFZpcnRSZWdJbnRlcnZhbHMuZ3JvdyhSZWcpOworICAgICAgVmlydFJlZ0ludGVydmFsc1tSZWddID0gY3JlYXRlSW50ZXJ2YWwoUmVnKTsKKyAgICAgIHJldHVybiAqVmlydFJlZ0ludGVydmFsc1tSZWddOworICAgIH0KKworICAgIExpdmVJbnRlcnZhbCAmY3JlYXRlQW5kQ29tcHV0ZVZpcnRSZWdJbnRlcnZhbCh1bnNpZ25lZCBSZWcpIHsKKyAgICAgIExpdmVJbnRlcnZhbCAmTEkgPSBjcmVhdGVFbXB0eUludGVydmFsKFJlZyk7CisgICAgICBjb21wdXRlVmlydFJlZ0ludGVydmFsKExJKTsKKyAgICAgIHJldHVybiBMSTsKKyAgICB9CisKKyAgICAvLy8gSW50ZXJ2YWwgcmVtb3ZhbC4KKyAgICB2b2lkIHJlbW92ZUludGVydmFsKHVuc2lnbmVkIFJlZykgeworICAgICAgZGVsZXRlIFZpcnRSZWdJbnRlcnZhbHNbUmVnXTsKKyAgICAgIFZpcnRSZWdJbnRlcnZhbHNbUmVnXSA9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8vIEdpdmVuIGEgcmVnaXN0ZXIgYW5kIGFuIGluc3RydWN0aW9uLCBhZGRzIGEgbGl2ZSBzZWdtZW50IGZyb20gdGhhdAorICAgIC8vLyBpbnN0cnVjdGlvbiB0byB0aGUgZW5kIG9mIGl0cyBNQkIuCisgICAgTGl2ZUludGVydmFsOjpTZWdtZW50IGFkZFNlZ21lbnRUb0VuZE9mQmxvY2sodW5zaWduZWQgcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAmc3RhcnRJbnN0KTsKKworICAgIC8vLyBBZnRlciByZW1vdmluZyBzb21lIHVzZXMgb2YgYSByZWdpc3Rlciwgc2hyaW5rIGl0cyBsaXZlIHJhbmdlIHRvIGp1c3QKKyAgICAvLy8gdGhlIHJlbWFpbmluZyB1c2VzLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjb21wdXRlIHJlYWNoaW5nIGRlZnMgZm9yIG5ldworICAgIC8vLyB1c2VzLCBhbmQgaXQgZG9lc24ndCByZW1vdmUgZGVhZCBkZWZzLgorICAgIC8vLyBEZWFkIFBISURlZiB2YWx1ZXMgYXJlIG1hcmtlZCBhcyB1bnVzZWQuIE5ldyBkZWFkIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zCisgICAgLy8vIGFyZSBhZGRlZCB0byB0aGUgZGVhZCB2ZWN0b3IuIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW50ZXJ2YWwgbWF5IGhhdmUgYmVlbgorICAgIC8vLyBzZXBhcmF0ZWQgaW50byBtdWx0aXBsZSBjb25uZWN0ZWQgY29tcG9uZW50cy4KKyAgICBib29sIHNocmlua1RvVXNlcyhMaXZlSW50ZXJ2YWwgKmxpLAorICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIqPiAqZGVhZCA9IG51bGxwdHIpOworCisgICAgLy8vIFNwZWNpYWxpemVkIHZlcnNpb24gb2YKKyAgICAvLy8gc2hyaW5rVG9Vc2VzKExpdmVJbnRlcnZhbCAqbGksIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIqPiAqZGVhZCkKKyAgICAvLy8gdGhhdCB3b3JrcyBvbiBhIHN1YnJlZ2lzdGVyIGxpdmUgcmFuZ2UgYW5kIG9ubHkgbG9va3MgYXQgdXNlcyBtYXRjaGluZworICAgIC8vLyB0aGUgbGFuZSBtYXNrIG9mIHRoZSBzdWJyZWdpc3RlciByYW5nZS4KKyAgICAvLy8gVGhpcyBtYXkgbGVhdmUgdGhlIHN1YnJhbmdlIGVtcHR5IHdoaWNoIG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAgd2l0aAorICAgIC8vLyBMaXZlSW50ZXJ2YWw6OnJlbW92ZUVtcHR5U3VicmFuZ2VzKCkgYWZ0ZXJ3YXJkcy4KKyAgICB2b2lkIHNocmlua1RvVXNlcyhMaXZlSW50ZXJ2YWw6OlN1YlJhbmdlICZTUiwgdW5zaWduZWQgUmVnKTsKKworICAgIC8vLyBFeHRlbmQgdGhlIGxpdmUgcmFuZ2UgXHAgTFIgdG8gcmVhY2ggYWxsIHBvaW50cyBpbiBccCBJbmRpY2VzLiBUaGUKKyAgICAvLy8gcG9pbnRzIGluIHRoZSBccCBJbmRpY2VzIGFycmF5IG11c3QgYmUgam9pbnRseSBkb21pbmF0ZWQgYnkgdGhlIHVuaW9uCisgICAgLy8vIG9mIHRoZSBleGlzdGluZyBkZWZzIGluIFxwIExSIGFuZCBwb2ludHMgaW4gXHAgVW5kZWZzLgorICAgIC8vLworICAgIC8vLyBQSEktZGVmcyBhcmUgYWRkZWQgYXMgbmVlZGVkIHRvIG1haW50YWluIFNTQSBmb3JtLgorICAgIC8vLworICAgIC8vLyBJZiBhIFNsb3RJbmRleCBpbiBccCBJbmRpY2VzIGlzIHRoZSBlbmQgaW5kZXggb2YgYSBiYXNpYyBibG9jaywgXHAgTFIKKyAgICAvLy8gd2lsbCBiZSBleHRlbmRlZCB0byBiZSBsaXZlIG91dCBvZiB0aGUgYmFzaWMgYmxvY2suCisgICAgLy8vIElmIGEgU2xvdEluZGV4IGluIFxwIEluZGljZXMgaXMgam9pbnR5IGRvbWluYXRlZCBvbmx5IGJ5IHBvaW50cyBpbgorICAgIC8vLyBccCBVbmRlZnMsIHRoZSBsaXZlIHJhbmdlIHdpbGwgbm90IGJlIGV4dGVuZGVkIHRvIHRoYXQgcG9pbnQuCisgICAgLy8vCisgICAgLy8vIFNlZSBhbHNvIExpdmVSYW5nZUNhbGM6OmV4dGVuZCgpLgorICAgIHZvaWQgZXh0ZW5kVG9JbmRpY2VzKExpdmVSYW5nZSAmTFIsIEFycmF5UmVmPFNsb3RJbmRleD4gSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTbG90SW5kZXg+IFVuZGVmcyk7CisKKyAgICB2b2lkIGV4dGVuZFRvSW5kaWNlcyhMaXZlUmFuZ2UgJkxSLCBBcnJheVJlZjxTbG90SW5kZXg+IEluZGljZXMpIHsKKyAgICAgIGV4dGVuZFRvSW5kaWNlcyhMUiwgSW5kaWNlcywgLypVbmRlZnM9Ki97fSk7CisgICAgfQorCisgICAgLy8vIElmIFxwIExSIGhhcyBhIGxpdmUgdmFsdWUgYXQgXHAgS2lsbCwgcHJ1bmUgaXRzIGxpdmUgcmFuZ2UgYnkgcmVtb3ZpbmcKKyAgICAvLy8gYW55IGxpdmVuZXNzIHJlYWNoYWJsZSBmcm9tIEtpbGwuIEFkZCBsaXZlIHJhbmdlIGVuZCBwb2ludHMgdG8KKyAgICAvLy8gRW5kUG9pbnRzIHN1Y2ggdGhhdCBleHRlbmRUb0luZGljZXMoTEksIEVuZFBvaW50cykgd2lsbCByZWNvbnN0cnVjdCB0aGUKKyAgICAvLy8gdmFsdWUncyBsaXZlIHJhbmdlLgorICAgIC8vLworICAgIC8vLyBDYWxsaW5nIHBydW5lVmFsdWUoKSBhbmQgZXh0ZW5kVG9JbmRpY2VzKCkgY2FuIGJlIHVzZWQgdG8gcmVjb25zdHJ1Y3QKKyAgICAvLy8gU1NBIGZvcm0gYWZ0ZXIgYWRkaW5nIGRlZnMgdG8gYSB2aXJ0dWFsIHJlZ2lzdGVyLgorICAgIHZvaWQgcHJ1bmVWYWx1ZShMaXZlUmFuZ2UgJkxSLCBTbG90SW5kZXggS2lsbCwKKyAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNsb3RJbmRleD4gKkVuZFBvaW50cyk7CisKKyAgICAvLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQuIEl0cyBpbnRlbmQgaXMgdG8gdGVsbCB5b3UgdGhhdAorICAgIC8vLyB5b3UgYXJlIGRvaW5nIHNvbWV0aGluZyB3cm9uZyBpZiB5b3UgY2FsbCBwcnV2ZVZhbHVlIGRpcmVjdGx5IG9uIGEKKyAgICAvLy8gTGl2ZUludGVydmFsLiBJbmRlZWQsIHlvdSBhcmUgc3VwcG9zZWQgdG8gY2FsbCBwcnVuZVZhbHVlIG9uIHRoZSBtYWluCisgICAgLy8vIExpdmVSYW5nZSBhbmQgYWxsIHRoZSBMaXZlUmFuZ2Ugb2YgdGhlIHN1YnJhbmdlcyBpZiBhbnkuCisgICAgTExWTV9BVFRSSUJVVEVfVU5VU0VEIHZvaWQgcHJ1bmVWYWx1ZShMaXZlSW50ZXJ2YWwgJiwgU2xvdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNsb3RJbmRleD4gKikgeworICAgICAgbGx2bV91bnJlYWNoYWJsZSgKKyAgICAgICAgICAiVXNlIHBydW5lVmFsdWUgb24gdGhlIG1haW4gTGl2ZVJhbmdlIGFuZCBvbiBlYWNoIHN1YnJhbmdlIik7CisgICAgfQorCisgICAgU2xvdEluZGV4ZXMgKmdldFNsb3RJbmRleGVzKCkgY29uc3QgeworICAgICAgcmV0dXJuIEluZGV4ZXM7CisgICAgfQorCisgICAgQWxpYXNBbmFseXNpcyAqZ2V0QWxpYXNBbmFseXNpcygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBBQTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0ciBoYXMgYmVlbiByZW1vdmVkIG9yIHdhcworICAgIC8vLyBuZXZlciBlbnRlcmVkIGluIHRoZSBtYXAuCisgICAgYm9vbCBpc05vdEluTUlNYXAoY29uc3QgTWFjaGluZUluc3RyICZJbnN0cikgY29uc3QgeworICAgICAgcmV0dXJuICFJbmRleGVzLT5oYXNJbmRleChJbnN0cik7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIGJhc2UgaW5kZXggb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uLgorICAgIFNsb3RJbmRleCBnZXRJbnN0cnVjdGlvbkluZGV4KGNvbnN0IE1hY2hpbmVJbnN0ciAmSW5zdHIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBJbmRleGVzLT5nZXRJbnN0cnVjdGlvbkluZGV4KEluc3RyKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgaW5zdHJ1Y3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbmRleC4KKyAgICBNYWNoaW5lSW5zdHIqIGdldEluc3RydWN0aW9uRnJvbUluZGV4KFNsb3RJbmRleCBpbmRleCkgY29uc3QgeworICAgICAgcmV0dXJuIEluZGV4ZXMtPmdldEluc3RydWN0aW9uRnJvbUluZGV4KGluZGV4KTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSBmaXJzdCBpbmRleCBpbiB0aGUgZ2l2ZW4gYmFzaWMgYmxvY2suCisgICAgU2xvdEluZGV4IGdldE1CQlN0YXJ0SWR4KGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICptYmIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBJbmRleGVzLT5nZXRNQkJTdGFydElkeChtYmIpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIGxhc3QgaW5kZXggaW4gdGhlIGdpdmVuIGJhc2ljIGJsb2NrLgorICAgIFNsb3RJbmRleCBnZXRNQkJFbmRJZHgoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKm1iYikgY29uc3QgeworICAgICAgcmV0dXJuIEluZGV4ZXMtPmdldE1CQkVuZElkeChtYmIpOworICAgIH0KKworICAgIGJvb2wgaXNMaXZlSW5Ub01CQihjb25zdCBMaXZlUmFuZ2UgJkxSLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqbWJiKSBjb25zdCB7CisgICAgICByZXR1cm4gTFIubGl2ZUF0KGdldE1CQlN0YXJ0SWR4KG1iYikpOworICAgIH0KKworICAgIGJvb2wgaXNMaXZlT3V0T2ZNQkIoY29uc3QgTGl2ZVJhbmdlICZMUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICptYmIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMUi5saXZlQXQoZ2V0TUJCRW5kSWR4KG1iYikuZ2V0UHJldlNsb3QoKSk7CisgICAgfQorCisgICAgTWFjaGluZUJhc2ljQmxvY2sqIGdldE1CQkZyb21JbmRleChTbG90SW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBJbmRleGVzLT5nZXRNQkJGcm9tSW5kZXgoaW5kZXgpOworICAgIH0KKworICAgIHZvaWQgaW5zZXJ0TUJCSW5NYXBzKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsKKyAgICAgIEluZGV4ZXMtPmluc2VydE1CQkluTWFwcyhNQkIpOworICAgICAgYXNzZXJ0KHVuc2lnbmVkKE1CQi0+Z2V0TnVtYmVyKCkpID09IFJlZ01hc2tCbG9ja3Muc2l6ZSgpICYmCisgICAgICAgICAgICAgIkJsb2NrcyBtdXN0IGJlIGFkZGVkIGluIG9yZGVyLiIpOworICAgICAgUmVnTWFza0Jsb2Nrcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoUmVnTWFza1Nsb3RzLnNpemUoKSwgMCkpOworICAgIH0KKworICAgIFNsb3RJbmRleCBJbnNlcnRNYWNoaW5lSW5zdHJJbk1hcHMoTWFjaGluZUluc3RyICZNSSkgeworICAgICAgcmV0dXJuIEluZGV4ZXMtPmluc2VydE1hY2hpbmVJbnN0ckluTWFwcyhNSSk7CisgICAgfQorCisgICAgdm9pZCBJbnNlcnRNYWNoaW5lSW5zdHJSYW5nZUluTWFwcyhNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBFKSB7CisgICAgICBmb3IgKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJID0gQjsgSSAhPSBFOyArK0kpCisgICAgICAgIEluZGV4ZXMtPmluc2VydE1hY2hpbmVJbnN0ckluTWFwcygqSSk7CisgICAgfQorCisgICAgdm9pZCBSZW1vdmVNYWNoaW5lSW5zdHJGcm9tTWFwcyhNYWNoaW5lSW5zdHIgJk1JKSB7CisgICAgICBJbmRleGVzLT5yZW1vdmVNYWNoaW5lSW5zdHJGcm9tTWFwcyhNSSk7CisgICAgfQorCisgICAgU2xvdEluZGV4IFJlcGxhY2VNYWNoaW5lSW5zdHJJbk1hcHMoTWFjaGluZUluc3RyICZNSSwgTWFjaGluZUluc3RyICZOZXdNSSkgeworICAgICAgcmV0dXJuIEluZGV4ZXMtPnJlcGxhY2VNYWNoaW5lSW5zdHJJbk1hcHMoTUksIE5ld01JKTsKKyAgICB9CisKKyAgICBWTkluZm86OkFsbG9jYXRvciYgZ2V0Vk5JbmZvQWxsb2NhdG9yKCkgeyByZXR1cm4gVk5JbmZvQWxsb2NhdG9yOyB9CisKKyAgICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlOworCisgICAgLy8vIFBhc3MgZW50cnkgcG9pbnQ7IENhbGN1bGF0ZXMgTGl2ZUludGVydmFscy4KKyAgICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiYpIG92ZXJyaWRlOworCisgICAgLy8vIEltcGxlbWVudCB0aGUgZHVtcCBtZXRob2QuCisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTywgY29uc3QgTW9kdWxlKiA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8vIElmIExJIGlzIGNvbmZpbmVkIHRvIGEgc2luZ2xlIGJhc2ljIGJsb2NrLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoYXQKKyAgICAvLy8gYmxvY2suICBJZiBMSSBpcyBsaXZlIGluIHRvIG9yIG91dCBvZiBhbnkgYmxvY2ssIHJldHVybiBOVUxMLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrICppbnRlcnZhbElzSW5PbmVNQkIoY29uc3QgTGl2ZUludGVydmFsICZMSSkgY29uc3Q7CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIFZOSSBpcyBraWxsZWQgYnkgYW55IFBISS1kZWYgdmFsdWVzIGluIExJLgorICAgIC8vLyBUaGlzIG1heSBjb25zZXJ2YXRpdmVseSByZXR1cm4gdHJ1ZSB0byBhdm9pZCBleHBlbnNpdmUgY29tcHV0YXRpb25zLgorICAgIGJvb2wgaGFzUEhJS2lsbChjb25zdCBMaXZlSW50ZXJ2YWwgJkxJLCBjb25zdCBWTkluZm8gKlZOSSkgY29uc3Q7CisKKyAgICAvLy8gQWRkIGtpbGwgZmxhZ3MgdG8gYW55IGluc3RydWN0aW9uIHRoYXQga2lsbHMgYSB2aXJ0dWFsIHJlZ2lzdGVyLgorICAgIHZvaWQgYWRkS2lsbEZsYWdzKGNvbnN0IFZpcnRSZWdNYXAqKTsKKworICAgIC8vLyBDYWxsIHRoaXMgbWV0aG9kIHRvIG5vdGlmeSBMaXZlSW50ZXJ2YWxzIHRoYXQgaW5zdHJ1Y3Rpb24gXHAgTUkgaGFzIGJlZW4KKyAgICAvLy8gbW92ZWQgd2l0aGluIGEgYmFzaWMgYmxvY2suIFRoaXMgd2lsbCB1cGRhdGUgdGhlIGxpdmUgaW50ZXJ2YWxzIGZvciBhbGwKKyAgICAvLy8gb3BlcmFuZHMgb2YgXHAgTUkuIE1vdmVzIGJldHdlZW4gYmFzaWMgYmxvY2tzIGFyZSBub3Qgc3VwcG9ydGVkLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gVXBkYXRlRmxhZ3MgVXBkYXRlIGxpdmUgaW50ZXJ2YWxzIGZvciBub25hbGxvY2F0YWJsZSBwaHlzcmVncy4KKyAgICB2b2lkIGhhbmRsZU1vdmUoTWFjaGluZUluc3RyICZNSSwgYm9vbCBVcGRhdGVGbGFncyA9IGZhbHNlKTsKKworICAgIC8vLyBVcGRhdGUgaW50ZXJ2YWxzIGZvciBvcGVyYW5kcyBvZiBccCBNSSBzbyB0aGF0IHRoZXkgYmVnaW4vZW5kIG9uIHRoZQorICAgIC8vLyBTbG90SW5kZXggZm9yIFxwIEJ1bmRsZVN0YXJ0LgorICAgIC8vLworICAgIC8vLyBccGFyYW0gVXBkYXRlRmxhZ3MgVXBkYXRlIGxpdmUgaW50ZXJ2YWxzIGZvciBub25hbGxvY2F0YWJsZSBwaHlzcmVncy4KKyAgICAvLy8KKyAgICAvLy8gUmVxdWlyZXMgTUkgYW5kIEJ1bmRsZVN0YXJ0IHRvIGhhdmUgU2xvdEluZGV4ZXMsIGFuZCBhc3N1bWVzCisgICAgLy8vIGV4aXN0aW5nIGxpdmVuZXNzIGlzIGFjY3VyYXRlLiBCdW5kbGVTdGFydCBzaG91bGQgYmUgdGhlIGZpcnN0CisgICAgLy8vIGluc3RydWN0aW9uIGluIHRoZSBCdW5kbGUuCisgICAgdm9pZCBoYW5kbGVNb3ZlSW50b0J1bmRsZShNYWNoaW5lSW5zdHIgJk1JLCBNYWNoaW5lSW5zdHIgJkJ1bmRsZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVcGRhdGVGbGFncyA9IGZhbHNlKTsKKworICAgIC8vLyBVcGRhdGUgbGl2ZSBpbnRlcnZhbHMgZm9yIGluc3RydWN0aW9ucyBpbiBhIHJhbmdlIG9mIGl0ZXJhdG9ycy4gSXQgaXMKKyAgICAvLy8gaW50ZW5kZWQgZm9yIHVzZSBhZnRlciB0YXJnZXQgaG9va3MgdGhhdCBtYXkgaW5zZXJ0IG9yIHJlbW92ZQorICAgIC8vLyBpbnN0cnVjdGlvbnMsIGFuZCBpcyBvbmx5IGVmZmljaWVudCBmb3IgYSBzbWFsbCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLgorICAgIC8vLworICAgIC8vLyBPcmlnUmVncyBpcyBhIHZlY3RvciBvZiByZWdpc3RlcnMgdGhhdCB3ZXJlIG9yaWdpbmFsbHkgdXNlZCBieSB0aGUKKyAgICAvLy8gaW5zdHJ1Y3Rpb25zIGluIHRoZSByYW5nZSBiZXR3ZWVuIHRoZSB0d28gaXRlcmF0b3JzLgorICAgIC8vLworICAgIC8vLyBDdXJyZW50bHksIHRoZSBvbmx5IG9ubHkgY2hhbmdlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYXJlIHNpbXBsZSByZW1vdmFsCisgICAgLy8vIGFuZCBhZGRpdGlvbiBvZiB1c2VzLgorICAgIHZvaWQgcmVwYWlySW50ZXJ2YWxzSW5SYW5nZShNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBPcmlnUmVncyk7CisKKyAgICAvLyBSZWdpc3RlciBtYXNrIGZ1bmN0aW9ucy4KKyAgICAvLworICAgIC8vIE1hY2hpbmUgaW5zdHJ1Y3Rpb25zIG1heSB1c2UgYSByZWdpc3RlciBtYXNrIG9wZXJhbmQgdG8gaW5kaWNhdGUgdGhhdCBhCisgICAgLy8gbGFyZ2UgbnVtYmVyIG9mIHJlZ2lzdGVycyBhcmUgY2xvYmJlcmVkIGJ5IHRoZSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMKKyAgICAvLyB0eXBpY2FsbHkgdXNlZCBmb3IgY2FsbHMuCisgICAgLy8KKyAgICAvLyBGb3IgY29tcGlsZSB0aW1lIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZXNlIGNsb2JiZXJzIGFyZSBub3QgcmVjb3JkZWQgaW4KKyAgICAvLyB0aGUgbGl2ZSBpbnRlcnZhbHMgZm9yIGluZGl2aWR1YWwgcGh5c2ljYWwgcmVnaXN0ZXJzLiAgSW5zdGVhZCwKKyAgICAvLyBMaXZlSW50ZXJ2YWxBbmFseXNpcyBtYWludGFpbnMgYSBzb3J0ZWQgbGlzdCBvZiBpbnN0cnVjdGlvbnMgd2l0aAorICAgIC8vIHJlZ2lzdGVyIG1hc2sgb3BlcmFuZHMuCisKKyAgICAvLy8gUmV0dXJucyBhIHNvcnRlZCBhcnJheSBvZiBzbG90IGluZGljZXMgb2YgYWxsIGluc3RydWN0aW9ucyB3aXRoCisgICAgLy8vIHJlZ2lzdGVyIG1hc2sgb3BlcmFuZHMuCisgICAgQXJyYXlSZWY8U2xvdEluZGV4PiBnZXRSZWdNYXNrU2xvdHMoKSBjb25zdCB7IHJldHVybiBSZWdNYXNrU2xvdHM7IH0KKworICAgIC8vLyBSZXR1cm5zIGEgc29ydGVkIGFycmF5IG9mIHNsb3QgaW5kaWNlcyBvZiBhbGwgaW5zdHJ1Y3Rpb25zIHdpdGggcmVnaXN0ZXIKKyAgICAvLy8gbWFzayBvcGVyYW5kcyBpbiB0aGUgYmFzaWMgYmxvY2sgbnVtYmVyZWQgXHAgTUJCTnVtLgorICAgIEFycmF5UmVmPFNsb3RJbmRleD4gZ2V0UmVnTWFza1Nsb3RzSW5CbG9jayh1bnNpZ25lZCBNQkJOdW0pIGNvbnN0IHsKKyAgICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+IFAgPSBSZWdNYXNrQmxvY2tzW01CQk51bV07CisgICAgICByZXR1cm4gZ2V0UmVnTWFza1Nsb3RzKCkuc2xpY2UoUC5maXJzdCwgUC5zZWNvbmQpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIGFuIGFycmF5IG9mIHJlZ2lzdGVyIG1hc2sgcG9pbnRlcnMgY29ycmVzcG9uZGluZyB0bworICAgIC8vLyBnZXRSZWdNYXNrU2xvdHMoKS4KKyAgICBBcnJheVJlZjxjb25zdCB1aW50MzJfdCo+IGdldFJlZ01hc2tCaXRzKCkgY29uc3QgeyByZXR1cm4gUmVnTWFza0JpdHM7IH0KKworICAgIC8vLyBSZXR1cm5zIGFuIGFycmF5IG9mIG1hc2sgcG9pbnRlcnMgY29ycmVzcG9uZGluZyB0bworICAgIC8vLyBnZXRSZWdNYXNrU2xvdHNJbkJsb2NrKE1CQk51bSkuCisgICAgQXJyYXlSZWY8Y29uc3QgdWludDMyX3QqPiBnZXRSZWdNYXNrQml0c0luQmxvY2sodW5zaWduZWQgTUJCTnVtKSBjb25zdCB7CisgICAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiBQID0gUmVnTWFza0Jsb2Nrc1tNQkJOdW1dOworICAgICAgcmV0dXJuIGdldFJlZ01hc2tCaXRzKCkuc2xpY2UoUC5maXJzdCwgUC5zZWNvbmQpOworICAgIH0KKworICAgIC8vLyBUZXN0IGlmIFxwIExJIGlzIGxpdmUgYWNyb3NzIGFueSByZWdpc3RlciBtYXNrIGluc3RydWN0aW9ucywgYW5kCisgICAgLy8vIGNvbXB1dGUgYSBiaXQgbWFzayBvZiBwaHlzaWNhbCByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGNsb2JiZXJlZCBieSBhbnkKKyAgICAvLy8gb2YgdGhlbS4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJucyBmYWxzZSBpZiBccCBMSSBkb2Vzbid0IGNyb3NzIGFueSByZWdpc3RlciBtYXNrIGluc3RydWN0aW9ucy4gSW4KKyAgICAvLy8gdGhhdCBjYXNlLCB0aGUgYml0IHZlY3RvciBpcyBub3QgZmlsbGVkIGluLgorICAgIGJvb2wgY2hlY2tSZWdNYXNrSW50ZXJmZXJlbmNlKExpdmVJbnRlcnZhbCAmTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0VmVjdG9yICZVc2FibGVSZWdzKTsKKworICAgIC8vIFJlZ2lzdGVyIHVuaXQgZnVuY3Rpb25zLgorICAgIC8vCisgICAgLy8gRml4ZWQgaW50ZXJmZXJlbmNlIG9jY3VycyB3aGVuIE1hY2hpbmVJbnN0cnMgdXNlIHBoeXNyZWdzIGRpcmVjdGx5CisgICAgLy8gaW5zdGVhZCBvZiB2aXJ0dWFsIHJlZ2lzdGVycy4gVGhpcyB0eXBpY2FsbHkgaGFwcGVucyB3aGVuIHBhc3NpbmcKKyAgICAvLyBhcmd1bWVudHMgdG8gYSBmdW5jdGlvbiBjYWxsLCBvciB3aGVuIGluc3RydWN0aW9ucyByZXF1aXJlIG9wZXJhbmRzIGluCisgICAgLy8gZml4ZWQgcmVnaXN0ZXJzLgorICAgIC8vCisgICAgLy8gRWFjaCBwaHlzcmVnIGhhcyBvbmUgb3IgbW9yZSByZWdpc3RlciB1bml0cywgc2VlIE1DUmVnaXN0ZXJJbmZvLiBXZQorICAgIC8vIHRyYWNrIGxpdmVuZXNzIHBlciByZWdpc3RlciB1bml0IHRvIGhhbmRsZSBhbGlhc2luZyByZWdpc3RlcnMgbW9yZQorICAgIC8vIGVmZmljaWVudGx5LgorCisgICAgLy8vIFJldHVybiB0aGUgbGl2ZSByYW5nZSBmb3IgcmVnaXN0ZXIgdW5pdCBccCBVbml0LiBJdCB3aWxsIGJlIGNvbXB1dGVkIGlmCisgICAgLy8vIGl0IGRvZXNuJ3QgZXhpc3QuCisgICAgTGl2ZVJhbmdlICZnZXRSZWdVbml0KHVuc2lnbmVkIFVuaXQpIHsKKyAgICAgIExpdmVSYW5nZSAqTFIgPSBSZWdVbml0UmFuZ2VzW1VuaXRdOworICAgICAgaWYgKCFMUikgeworICAgICAgICAvLyBDb21wdXRlIG1pc3NpbmcgcmFuZ2VzIG9uIGRlbWFuZC4KKyAgICAgICAgLy8gVXNlIHNlZ21lbnQgc2V0IHRvIHNwZWVkLXVwIGluaXRpYWwgY29tcHV0YXRpb24gb2YgdGhlIGxpdmUgcmFuZ2UuCisgICAgICAgIFJlZ1VuaXRSYW5nZXNbVW5pdF0gPSBMUiA9IG5ldyBMaXZlUmFuZ2UoVXNlU2VnbWVudFNldEZvclBoeXNSZWdzKTsKKyAgICAgICAgY29tcHV0ZVJlZ1VuaXRSYW5nZSgqTFIsIFVuaXQpOworICAgICAgfQorICAgICAgcmV0dXJuICpMUjsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSBsaXZlIHJhbmdlIGZvciByZWdpc3RlciB1bml0IFxwIFVuaXQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbgorICAgIC8vLyBjb21wdXRlZCwgb3IgbnVsbHB0ciBpZiBpdCBoYXNuJ3QgYmVlbiBjb21wdXRlZCB5ZXQuCisgICAgTGl2ZVJhbmdlICpnZXRDYWNoZWRSZWdVbml0KHVuc2lnbmVkIFVuaXQpIHsKKyAgICAgIHJldHVybiBSZWdVbml0UmFuZ2VzW1VuaXRdOworICAgIH0KKworICAgIGNvbnN0IExpdmVSYW5nZSAqZ2V0Q2FjaGVkUmVnVW5pdCh1bnNpZ25lZCBVbml0KSBjb25zdCB7CisgICAgICByZXR1cm4gUmVnVW5pdFJhbmdlc1tVbml0XTsKKyAgICB9CisKKyAgICAvLy8gUmVtb3ZlIGNvbXB1dGVkIGxpdmUgcmFuZ2UgZm9yIHJlZ2lzdGVyIHVuaXQgXHAgVW5pdC4gU3Vic2VxdWVudCB1c2VzCisgICAgLy8vIHNob3VsZCByZWx5IG9uIG9uLWRlbWFuZCByZWNvbXB1dGF0aW9uLgorICAgIHZvaWQgcmVtb3ZlUmVnVW5pdCh1bnNpZ25lZCBVbml0KSB7CisgICAgICBkZWxldGUgUmVnVW5pdFJhbmdlc1tVbml0XTsKKyAgICAgIFJlZ1VuaXRSYW5nZXNbVW5pdF0gPSBudWxscHRyOworICAgIH0KKworICAgIC8vLyBSZW1vdmUgdmFsdWUgbnVtYmVycyBhbmQgcmVsYXRlZCBsaXZlIHNlZ21lbnRzIHN0YXJ0aW5nIGF0IHBvc2l0aW9uCisgICAgLy8vIFxwIFBvcyB0aGF0IGFyZSBwYXJ0IG9mIGFueSBsaXZlcmFuZ2Ugb2YgcGh5c2ljYWwgcmVnaXN0ZXIgXHAgUmVnIG9yIG9uZQorICAgIC8vLyBvZiBpdHMgc3VicmVnaXN0ZXJzLgorICAgIHZvaWQgcmVtb3ZlUGh5c1JlZ0RlZkF0KHVuc2lnbmVkIFJlZywgU2xvdEluZGV4IFBvcyk7CisKKyAgICAvLy8gUmVtb3ZlIHZhbHVlIG51bWJlciBhbmQgcmVsYXRlZCBsaXZlIHNlZ21lbnRzIG9mIFxwIExJIGFuZCBpdHMgc3VicmFuZ2VzCisgICAgLy8vIHRoYXQgc3RhcnQgYXQgcG9zaXRpb24gXHAgUG9zLgorICAgIHZvaWQgcmVtb3ZlVlJlZ0RlZkF0KExpdmVJbnRlcnZhbCAmTEksIFNsb3RJbmRleCBQb3MpOworCisgICAgLy8vIFNwbGl0IHNlcGFyYXRlIGNvbXBvbmVudHMgaW4gTGl2ZUludGVydmFsIFxwIExJIGludG8gc2VwYXJhdGUgaW50ZXJ2YWxzLgorICAgIHZvaWQgc3BsaXRTZXBhcmF0ZUNvbXBvbmVudHMoTGl2ZUludGVydmFsICZMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxMaXZlSW50ZXJ2YWwqPiAmU3BsaXRMSXMpOworCisgICAgLy8vIEZvciBsaXZlIGludGVydmFsIFxwIExJIHdpdGggY29ycmVjdCBTdWJSYW5nZXMgY29uc3RydWN0IG1hdGNoaW5nCisgICAgLy8vIGluZm9ybWF0aW9uIGZvciB0aGUgbWFpbiBsaXZlIHJhbmdlLiBFeHBlY3RzIHRoZSBtYWluIGxpdmUgcmFuZ2UgdG8gbm90CisgICAgLy8vIGhhdmUgYW55IHNlZ21lbnRzIG9yIHZhbHVlIG51bWJlcnMuCisgICAgdm9pZCBjb25zdHJ1Y3RNYWluUmFuZ2VGcm9tU3VicmFuZ2VzKExpdmVJbnRlcnZhbCAmTEkpOworCisgIHByaXZhdGU6CisgICAgLy8vIENvbXB1dGUgbGl2ZSBpbnRlcnZhbHMgZm9yIGFsbCB2aXJ0dWFsIHJlZ2lzdGVycy4KKyAgICB2b2lkIGNvbXB1dGVWaXJ0UmVncygpOworCisgICAgLy8vIENvbXB1dGUgUmVnTWFza1Nsb3RzIGFuZCBSZWdNYXNrQml0cy4KKyAgICB2b2lkIGNvbXB1dGVSZWdNYXNrcygpOworCisgICAgLy8vIFdhbGsgdGhlIHZhbHVlcyBpbiBccCBMSSBhbmQgY2hlY2sgZm9yIGRlYWQgdmFsdWVzOgorICAgIC8vLyAtIERlYWQgUEhJRGVmIHZhbHVlcyBhcmUgbWFya2VkIGFzIHVudXNlZC4KKyAgICAvLy8gLSBEZWFkIG9wZXJhbmRzIGFyZSBtYXJrZWQgYXMgc3VjaC4KKyAgICAvLy8gLSBDb21wbGV0ZWx5IGRlYWQgbWFjaGluZSBpbnN0cnVjdGlvbnMgYXJlIGFkZGVkIHRvIHRoZSBccCBkZWFkIHZlY3RvcgorICAgIC8vLyAgIGlmIGl0IGlzIG5vdCBudWxscHRyLgorICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW55IFBISSB2YWx1ZSBudW1iZXJzIGhhdmUgYmVlbiByZW1vdmVkIHdoaWNoIG1heQorICAgIC8vLyBoYXZlIHNlcGFyYXRlZCB0aGUgaW50ZXJ2YWwgaW50byBtdWx0aXBsZSBjb25uZWN0ZWQgY29tcG9uZW50cy4KKyAgICBib29sIGNvbXB1dGVEZWFkVmFsdWVzKExpdmVJbnRlcnZhbCAmTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyKj4gKmRlYWQpOworCisgICAgc3RhdGljIExpdmVJbnRlcnZhbCogY3JlYXRlSW50ZXJ2YWwodW5zaWduZWQgUmVnKTsKKworICAgIHZvaWQgcHJpbnRJbnN0cnMocmF3X29zdHJlYW0gJk8pIGNvbnN0OworICAgIHZvaWQgZHVtcEluc3RycygpIGNvbnN0OworCisgICAgdm9pZCBjb21wdXRlTGl2ZUluUmVnVW5pdHMoKTsKKyAgICB2b2lkIGNvbXB1dGVSZWdVbml0UmFuZ2UoTGl2ZVJhbmdlJiwgdW5zaWduZWQgVW5pdCk7CisgICAgdm9pZCBjb21wdXRlVmlydFJlZ0ludGVydmFsKExpdmVJbnRlcnZhbCYpOworCisKKyAgICAvLy8gSGVscGVyIGZ1bmN0aW9uIGZvciByZXBhaXJJbnRlcnZhbHNJblJhbmdlKCksIHdhbGtzIGJhY2t3YXJkcyBhbmQKKyAgICAvLy8gY3JlYXRlcy9tb2RpZmllcyBsaXZlIHNlZ21lbnRzIGluIFxwIExSIHRvIG1hdGNoIHRoZSBvcGVyYW5kcyBmb3VuZC4KKyAgICAvLy8gT25seSBmdWxsIG9wZXJhbmRzIG9yIG9wZXJhbmRzIHdpdGggc3VicmVnaXN0ZXJzIG1hdGNoaW5nIFxwIExhbmVNYXNrCisgICAgLy8vIGFyZSBjb25zaWRlcmVkLgorICAgIHZvaWQgcmVwYWlyT2xkUmVnSW5SYW5nZShNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNsb3RJbmRleCBlbmRJZHgsIExpdmVSYW5nZSAmTFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFuZUJpdG1hc2sgTGFuZU1hc2sgPSBMYW5lQml0bWFzazo6Z2V0QWxsKCkpOworCisgICAgY2xhc3MgSE1FZGl0b3I7CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVQaHlzUmVncy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVQaHlzUmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YWFiMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZVBoeXNSZWdzLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vTGl2ZVBoeXNSZWdzLmggLSBMaXZlIFBoeXNpY2FsIFJlZ2lzdGVyIFNldCAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIExpdmVQaHlzUmVncyB1dGlsaXR5IGZvciB0cmFja2luZyBsaXZlbmVzcyBvZgorLy8vIHBoeXNpY2FsIHJlZ2lzdGVycy4gVGhpcyBjYW4gYmUgdXNlZCBmb3IgYWQtaG9jIGxpdmVuZXNzIHRyYWNraW5nIGFmdGVyCisvLy8gcmVnaXN0ZXIgYWxsb2NhdGlvbi4gWW91IGNhbiBzdGFydCB3aXRoIHRoZSBsaXZlLWlucy9saXZlLW91dHMgYXQgdGhlCisvLy8gYmVnaW5uaW5nL2VuZCBvZiBhIGJsb2NrIGFuZCB1cGRhdGUgdGhlIGluZm9ybWF0aW9uIHdoaWxlIHdhbGtpbmcgdGhlCisvLy8gaW5zdHJ1Y3Rpb25zIGluc2lkZSB0aGUgYmxvY2suIFRoaXMgaW1wbGVtZW50YXRpb24gdHJhY2tzIHRoZSBsaXZlbmVzcyBvbiBhCisvLy8gc3ViLXJlZ2lzdGVyIGdyYW51bGFyaXR5LgorLy8vCisvLy8gV2UgYXNzdW1lIHRoYXQgdGhlIGhpZ2ggYml0cyBvZiBhIHBoeXNpY2FsIHN1cGVyLXJlZ2lzdGVyIGFyZSBub3QgcHJlc2VydmVkCisvLy8gdW5sZXNzIHRoZSBpbnN0cnVjdGlvbiBoYXMgYW4gaW1wbGljaXQtdXNlIG9wZXJhbmQgcmVhZGluZyB0aGUgc3VwZXItCisvLy8gcmVnaXN0ZXIuCisvLy8KKy8vLyBYODYgRXhhbXBsZToKKy8vLyAleW1tMCA9IC4uLgorLy8vICV4bW0wID0gLi4uIChLaWxscyAleG1tMCwgYWxsICV4bW0wcyBzdWItcmVnaXN0ZXJzLCBhbmQgJXltbTApCisvLy8KKy8vLyAleW1tMCA9IC4uLgorLy8vICV4bW0wID0gLi4uLCBpbXBsaWNpdCAleW1tMCAoJXltbTAgYW5kIGFsbCBpdHMgc3ViLXJlZ2lzdGVycyBhcmUgYWxpdmUpCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9MSVZFUEhZU1JFR1NfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTElWRVBIWVNSRUdTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NwYXJzZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIE1hY2hpbmVPcGVyYW5kOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gXGJyaWVmIEEgc2V0IG9mIHBoeXNpY2FsIHJlZ2lzdGVycyB3aXRoIHV0aWxpdHkgZnVuY3Rpb25zIHRvIHRyYWNrIGxpdmVuZXNzCisvLy8gd2hlbiB3YWxraW5nIGJhY2t3YXJkL2ZvcndhcmQgdGhyb3VnaCBhIGJhc2ljIGJsb2NrLgorY2xhc3MgTGl2ZVBoeXNSZWdzIHsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyOworICBTcGFyc2VTZXQ8dW5zaWduZWQ+IExpdmVSZWdzOworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3RzIGFuIHVuaXRpYWxpemVkIHNldC4gaW5pdCgpIG5lZWRzIHRvIGJlIGNhbGxlZCB0byBpbml0aWFsaXplIGl0LgorICBMaXZlUGh5c1JlZ3MoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIENvbnN0cnVjdHMgYW5kIGluaXRpYWxpemVzIGFuIGVtcHR5IHNldC4KKyAgTGl2ZVBoeXNSZWdzKGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKSA6IFRSSSgmVFJJKSB7CisgICAgTGl2ZVJlZ3Muc2V0VW5pdmVyc2UoVFJJLmdldE51bVJlZ3MoKSk7CisgIH0KKworICBMaXZlUGh5c1JlZ3MoY29uc3QgTGl2ZVBoeXNSZWdzJikgPSBkZWxldGU7CisgIExpdmVQaHlzUmVncyAmb3BlcmF0b3I9KGNvbnN0IExpdmVQaHlzUmVncyYpID0gZGVsZXRlOworCisgIC8vLyAocmUtKWluaXRpYWxpemVzIGFuZCBjbGVhcnMgdGhlIHNldC4KKyAgdm9pZCBpbml0KGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKSB7CisgICAgdGhpcy0+VFJJID0gJlRSSTsKKyAgICBMaXZlUmVncy5jbGVhcigpOworICAgIExpdmVSZWdzLnNldFVuaXZlcnNlKFRSSS5nZXROdW1SZWdzKCkpOworICB9CisKKyAgLy8vIENsZWFycyB0aGUgc2V0LgorICB2b2lkIGNsZWFyKCkgeyBMaXZlUmVncy5jbGVhcigpOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2V0IGlzIGVtcHR5LgorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gTGl2ZVJlZ3MuZW1wdHkoKTsgfQorCisgIC8vLyBBZGRzIGEgcGh5c2ljYWwgcmVnaXN0ZXIgYW5kIGFsbCBpdHMgc3ViLXJlZ2lzdGVycyB0byB0aGUgc2V0LgorICB2b2lkIGFkZFJlZyh1bnNpZ25lZCBSZWcpIHsKKyAgICBhc3NlcnQoVFJJICYmICJMaXZlUGh5c1JlZ3MgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgIGFzc2VydChSZWcgPD0gVFJJLT5nZXROdW1SZWdzKCkgJiYgIkV4cGVjdGVkIGEgcGh5c2ljYWwgcmVnaXN0ZXIuIik7CisgICAgZm9yIChNQ1N1YlJlZ0l0ZXJhdG9yIFN1YlJlZ3MoUmVnLCBUUkksIC8qSW5jbHVkZVNlbGY9Ki90cnVlKTsKKyAgICAgICAgIFN1YlJlZ3MuaXNWYWxpZCgpOyArK1N1YlJlZ3MpCisgICAgICBMaXZlUmVncy5pbnNlcnQoKlN1YlJlZ3MpOworICB9CisKKyAgLy8vIFxicmllZiBSZW1vdmVzIGEgcGh5c2ljYWwgcmVnaXN0ZXIsIGFsbCBpdHMgc3ViLXJlZ2lzdGVycywgYW5kIGFsbCBpdHMKKyAgLy8vIHN1cGVyLXJlZ2lzdGVycyBmcm9tIHRoZSBzZXQuCisgIHZvaWQgcmVtb3ZlUmVnKHVuc2lnbmVkIFJlZykgeworICAgIGFzc2VydChUUkkgJiYgIkxpdmVQaHlzUmVncyBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgYXNzZXJ0KFJlZyA8PSBUUkktPmdldE51bVJlZ3MoKSAmJiAiRXhwZWN0ZWQgYSBwaHlzaWNhbCByZWdpc3Rlci4iKTsKKyAgICBmb3IgKE1DUmVnQWxpYXNJdGVyYXRvciBSKFJlZywgVFJJLCB0cnVlKTsgUi5pc1ZhbGlkKCk7ICsrUikKKyAgICAgIExpdmVSZWdzLmVyYXNlKCpSKTsKKyAgfQorCisgIC8vLyBSZW1vdmVzIHBoeXNpY2FsIHJlZ2lzdGVycyBjbG9iYmVyZWQgYnkgdGhlIHJlZ21hc2sgb3BlcmFuZCBccCBNTy4KKyAgdm9pZCByZW1vdmVSZWdzSW5NYXNrKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTywKKyAgICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjx1bnNpZ25lZCwgY29uc3QgTWFjaGluZU9wZXJhbmQqPj4gKkNsb2JiZXJzID0KKyAgICAgICAgbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgcmVnaXN0ZXIgXHAgUmVnIGlzIGNvbnRhaW5lZCBpbiB0aGUgc2V0LiBUaGlzIGFsc28KKyAgLy8vIHdvcmtzIGlmIG9ubHkgdGhlIHN1cGVyIHJlZ2lzdGVyIG9mIFxwIFJlZyBoYXMgYmVlbiBkZWZpbmVkLCBiZWNhdXNlCisgIC8vLyBhZGRSZWcoKSBhbHdheXMgYWRkcyBhbGwgc3ViLXJlZ2lzdGVycyB0byB0aGUgc2V0IGFzIHdlbGwuCisgIC8vLyBOb3RlOiBSZXR1cm5zIGZhbHNlIGlmIGp1c3Qgc29tZSBzdWIgcmVnaXN0ZXJzIGFyZSBsaXZlLCB1c2UgYXZhaWxhYmxlKCkKKyAgLy8vIHdoZW4gc2VhcmNoaW5nIGEgZnJlZSByZWdpc3Rlci4KKyAgYm9vbCBjb250YWlucyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsgcmV0dXJuIExpdmVSZWdzLmNvdW50KFJlZyk7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHJlZ2lzdGVyIFxwIFJlZyBhbmQgbm8gYWxpYXNpbmcgcmVnaXN0ZXIgaXMgaW4gdGhlIHNldC4KKyAgYm9vbCBhdmFpbGFibGUoY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLCB1bnNpZ25lZCBSZWcpIGNvbnN0OworCisgIC8vLyBSZW1vdmUgZGVmaW5lZCByZWdpc3RlcnMgYW5kIHJlZ21hc2sga2lsbHMgZnJvbSB0aGUgc2V0LgorICB2b2lkIHJlbW92ZURlZnMoY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisKKyAgLy8vIEFkZCB1c2VzIHRvIHRoZSBzZXQuCisgIHZvaWQgYWRkVXNlcyhjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKworICAvLy8gU2ltdWxhdGVzIGxpdmVuZXNzIHdoZW4gc3RlcHBpbmcgYmFja3dhcmRzIG92ZXIgYW4gaW5zdHJ1Y3Rpb24oYnVuZGxlKS4KKyAgLy8vIFJlbW92ZSBEZWZzLCBhZGQgdXNlcy4gVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgd2F5IG9mIGNhbGN1bGF0aW5nCisgIC8vLyBsaXZlbmVzcy4KKyAgdm9pZCBzdGVwQmFja3dhcmQoY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisKKyAgLy8vIFNpbXVsYXRlcyBsaXZlbmVzcyB3aGVuIHN0ZXBwaW5nIGZvcndhcmQgb3ZlciBhbiBpbnN0cnVjdGlvbihidW5kbGUpLgorICAvLy8gUmVtb3ZlIGtpbGxlZC11c2VzLCBhZGQgZGVmcy4gVGhpcyBpcyB0aGUgbm90IHJlY29tbWVuZGVkIHdheSwgYmVjYXVzZSBpdAorICAvLy8gZGVwZW5kcyBvbiBhY2N1cmF0ZSBraWxsIGZsYWdzLiBJZiBwb3NzaWJsZSB1c2Ugc3RlcEJhY2t3YXJkKCkgaW5zdGVhZCBvZgorICAvLy8gdGhpcyBmdW5jdGlvbi4gVGhlIGNsb2JiZXJzIHNldCB3aWxsIGJlIHRoZSBsaXN0IG9mIHJlZ2lzdGVycyBlaXRoZXIKKyAgLy8vIGRlZmluZWQgb3IgY2xvYmJlcmVkIGJ5IGEgcmVnbWFzay4gIFRoZSBvcGVyYW5kIHdpbGwgaWRlbnRpZnkgd2hldGhlciB0aGlzCisgIC8vLyBpcyBhIHJlZ21hc2sgb3IgcmVnaXN0ZXIgb3BlcmFuZC4KKyAgdm9pZCBzdGVwRm9yd2FyZChjb25zdCBNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPHVuc2lnbmVkLCBjb25zdCBNYWNoaW5lT3BlcmFuZCo+PiAmQ2xvYmJlcnMpOworCisgIC8vLyBBZGRzIGFsbCBsaXZlLWluIHJlZ2lzdGVycyBvZiBiYXNpYyBibG9jayBccCBNQkIuCisgIC8vLyBMaXZlIGluIHJlZ2lzdGVycyBhcmUgdGhlIHJlZ2lzdGVycyBpbiB0aGUgYmxvY2tzIGxpdmUtaW4gbGlzdCBhbmQgdGhlCisgIC8vLyBwcmlzdGluZSByZWdpc3RlcnMuCisgIHZvaWQgYWRkTGl2ZUlucyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKworICAvLy8gQWRkcyBhbGwgbGl2ZS1vdXQgcmVnaXN0ZXJzIG9mIGJhc2ljIGJsb2NrIFxwIE1CQi4KKyAgLy8vIExpdmUgb3V0IHJlZ2lzdGVycyBhcmUgdGhlIHVuaW9uIG9mIHRoZSBsaXZlLWluIHJlZ2lzdGVycyBvZiB0aGUgc3VjY2Vzc29yCisgIC8vLyBibG9ja3MgYW5kIHByaXN0aW5lIHJlZ2lzdGVycy4gTGl2ZSBvdXQgcmVnaXN0ZXJzIG9mIHRoZSBlbmQgYmxvY2sgYXJlIHRoZQorICAvLy8gY2FsbGVlIHNhdmVkIHJlZ2lzdGVycy4KKyAgdm9pZCBhZGRMaXZlT3V0cyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKworICAvLy8gQWRkcyBhbGwgbGl2ZS1vdXQgcmVnaXN0ZXJzIG9mIGJhc2ljIGJsb2NrIFxwIE1CQiBidXQgc2tpcHMgcHJpc3RpbmUKKyAgLy8vIHJlZ2lzdGVycy4KKyAgdm9pZCBhZGRMaXZlT3V0c05vUHJpc3RpbmVzKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworCisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gU3BhcnNlU2V0PHVuc2lnbmVkPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBMaXZlUmVncy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIExpdmVSZWdzLmVuZCgpOyB9CisKKyAgLy8vIFByaW50cyB0aGUgY3VycmVudGx5IGxpdmUgcmVnaXN0ZXJzIHRvIFxwIE9TLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8vIER1bXBzIHRoZSBjdXJyZW50bHkgbGl2ZSByZWdpc3RlcnMgdG8gdGhlIGRlYnVnIG91dHB1dC4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgQWRkcyBsaXZlLWluIHJlZ2lzdGVycyBmcm9tIGJhc2ljIGJsb2NrIFxwIE1CQiwgdGFraW5nIGFzc29jaWF0ZWQKKyAgLy8vIGxhbmUgbWFza3MgaW50byBjb25zaWRlcmF0aW9uLgorICB2b2lkIGFkZEJsb2NrTGl2ZUlucyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKworICAvLy8gQWRkcyBwcmlzdGluZSByZWdpc3RlcnMuIFByaXN0aW5lIHJlZ2lzdGVycyBhcmUgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycworICAvLy8gdGhhdCBhcmUgdW51c2VkIGluIHRoZSBmdW5jdGlvbi4KKyAgdm9pZCBhZGRQcmlzdGluZXMoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRik7Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBMaXZlUGh5c1JlZ3MmIExSKSB7CisgIExSLnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCisvLy8gXGJyaWVmIENvbXB1dGVzIHJlZ2lzdGVycyBsaXZlLWluIHRvIFxwIE1CQiBhc3N1bWluZyBhbGwgb2YgaXRzIHN1Y2Nlc3NvcnMKKy8vLyBsaXZlLWluIGxpc3RzIGFyZSB1cC10by1kYXRlLiBQdXRzIHRoZSByZXN1bHQgaW50byB0aGUgZ2l2ZW4gTGl2ZVBoeXNSZWcKKy8vLyBpbnN0YW5jZSBccCBMaXZlUmVncy4KK3ZvaWQgY29tcHV0ZUxpdmVJbnMoTGl2ZVBoeXNSZWdzICZMaXZlUmVncywgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKy8vLyBSZWNvbXB1dGVzIGRlYWQgYW5kIGtpbGwgZmxhZ3MgaW4gXHAgTUJCLgordm9pZCByZWNvbXB1dGVMaXZlbmVzc0ZsYWdzKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworCisvLy8gQWRkcyByZWdpc3RlcnMgY29udGFpbmVkIGluIFxwIExpdmVSZWdzIHRvIHRoZSBibG9jayBsaXZlLWluIGxpc3Qgb2YgXHAgTUJCLgorLy8vIERvZXMgbm90IGFkZCByZXNlcnZlZCByZWdpc3RlcnMuCit2b2lkIGFkZExpdmVJbnMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgY29uc3QgTGl2ZVBoeXNSZWdzICZMaXZlUmVncyk7CisKKy8vLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBjb21iaW5pbmcgY29tcHV0ZUxpdmVJbnMoKSBhbmQgYWRkTGl2ZUlucygpLgordm9pZCBjb21wdXRlQW5kQWRkTGl2ZUlucyhMaXZlUGh5c1JlZ3MgJkxpdmVSZWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9MSVZFUEhZU1JFR1NfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVSYW5nZUVkaXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlUmFuZ2VFZGl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiMWYwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlUmFuZ2VFZGl0LmgKQEAgLTAsMCArMSwyNTggQEAKKy8vPT09LSBMaXZlUmFuZ2VFZGl0LmggLSBCYXNpYyB0b29scyBmb3Igc3BsaXQgYW5kIHNwaWxsIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlIExpdmVSYW5nZUVkaXQgY2xhc3MgcmVwcmVzZW50cyBjaGFuZ2VzIGRvbmUgdG8gYSB2aXJ0dWFsIHJlZ2lzdGVyIHdoZW4gaXQKKy8vIGlzIHNwaWxsZWQgb3Igc3BsaXQuCisvLworLy8gVGhlIHBhcmVudCByZWdpc3RlciBpcyBuZXZlciBjaGFuZ2VkLiBJbnN0ZWFkLCBhIG51bWJlciBvZiBuZXcgdmlydHVhbAorLy8gcmVnaXN0ZXJzIGFyZSBjcmVhdGVkIGFuZCBhZGRlZCB0byB0aGUgbmV3UmVncyB2ZWN0b3IuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTElWRVJBTkdFRURJVF9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9MSVZFUkFOR0VFRElUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Nsb3RJbmRleGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldFN1YnRhcmdldEluZm8uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExpdmVJbnRlcnZhbHM7CitjbGFzcyBNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvOworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTWFjaGluZUxvb3BJbmZvOworY2xhc3MgTWFjaGluZU9wZXJhbmQ7CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CitjbGFzcyBWaXJ0UmVnTWFwOworCitjbGFzcyBMaXZlUmFuZ2VFZGl0IDogcHJpdmF0ZSBNYWNoaW5lUmVnaXN0ZXJJbmZvOjpEZWxlZ2F0ZSB7CitwdWJsaWM6CisgIC8vLyBDYWxsYmFjayBtZXRob2RzIGZvciBMaXZlUmFuZ2VFZGl0IG93bmVycy4KKyAgY2xhc3MgRGVsZWdhdGUgeworICAgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworICBwdWJsaWM6CisgICAgdmlydHVhbCB+RGVsZWdhdGUoKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gQ2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBlcmFzaW5nIGEgZGVhZCBtYWNoaW5lIGluc3RydWN0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBMUkVfV2lsbEVyYXNlSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICpNSSkge30KKworICAgIC8vLyBDYWxsZWQgd2hlbiBhIHZpcnR1YWwgcmVnaXN0ZXIgaXMgbm8gbG9uZ2VyIHVzZWQuIFJldHVybiBmYWxzZSB0byBkZWZlcgorICAgIC8vLyBpdHMgZGVsZXRpb24gZnJvbSBMaXZlSW50ZXJ2YWxzLgorICAgIHZpcnR1YWwgYm9vbCBMUkVfQ2FuRXJhc2VWaXJ0UmVnKHVuc2lnbmVkKSB7IHJldHVybiB0cnVlOyB9CisKKyAgICAvLy8gQ2FsbGVkIGJlZm9yZSBzaHJpbmtpbmcgdGhlIGxpdmUgcmFuZ2Ugb2YgYSB2aXJ0dWFsIHJlZ2lzdGVyLgorICAgIHZpcnR1YWwgdm9pZCBMUkVfV2lsbFNocmlua1ZpcnRSZWcodW5zaWduZWQpIHt9CisKKyAgICAvLy8gQ2FsbGVkIGFmdGVyIGNsb25pbmcgYSB2aXJ0dWFsIHJlZ2lzdGVyLgorICAgIC8vLyBUaGlzIGlzIHVzZWQgZm9yIG5ldyByZWdpc3RlcnMgcmVwcmVzZW50aW5nIGNvbm5lY3RlZCBjb21wb25lbnRzIG9mIE9sZC4KKyAgICB2aXJ0dWFsIHZvaWQgTFJFX0RpZENsb25lVmlydFJlZyh1bnNpZ25lZCBOZXcsIHVuc2lnbmVkIE9sZCkge30KKyAgfTsKKworcHJpdmF0ZToKKyAgTGl2ZUludGVydmFsICpQYXJlbnQ7CisgIFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD4gJk5ld1JlZ3M7CisgIE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSTsKKyAgTGl2ZUludGVydmFscyAmTElTOworICBWaXJ0UmVnTWFwICpWUk07CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJOworICBEZWxlZ2F0ZSAqY29uc3QgVGhlRGVsZWdhdGU7CisKKyAgLy8vIEZpcnN0TmV3IC0gSW5kZXggb2YgdGhlIGZpcnN0IHJlZ2lzdGVyIGFkZGVkIHRvIE5ld1JlZ3MuCisgIGNvbnN0IHVuc2lnbmVkIEZpcnN0TmV3OworCisgIC8vLyBTY2FubmVkUmVtYXR0YWJsZSAtIHRydWUgd2hlbiByZW1hdHRhYmxlIHZhbHVlcyBoYXZlIGJlZW4gaWRlbnRpZmllZC4KKyAgYm9vbCBTY2FubmVkUmVtYXR0YWJsZSA9IGZhbHNlOworCisgIC8vLyBEZWFkUmVtYXRzIC0gVGhlIHNhdmVkIGluc3RydWN0aW9ucyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiBkZWFkIGFmdGVyCisgIC8vLyByZW1hdGVyaWFsaXphdGlvbiBidXQgbm90IGRlbGV0ZWQgeWV0IC0tIHRvIGJlIGRvbmUgaW4gcG9zdE9wdGltaXphdGlvbi4KKyAgU21hbGxQdHJTZXQ8TWFjaGluZUluc3RyICosIDMyPiAqRGVhZFJlbWF0czsKKworICAvLy8gUmVtYXR0YWJsZSAtIFZhbHVlcyBkZWZpbmVkIGJ5IHJlbWF0dGFibGUgaW5zdHJ1Y3Rpb25zIGFzIGlkZW50aWZpZWQgYnkKKyAgLy8vIHRpaS5pc1RyaXZpYWxseVJlTWF0ZXJpYWxpemFibGUoKS4KKyAgU21hbGxQdHJTZXQ8Y29uc3QgVk5JbmZvICosIDQ+IFJlbWF0dGFibGU7CisKKyAgLy8vIFJlbWF0dGVkIC0gVmFsdWVzIHRoYXQgd2VyZSBhY3R1YWxseSByZW1hdHRlZCwgYW5kIHNvIG5lZWQgdG8gaGF2ZSB0aGVpcgorICAvLy8gbGl2ZSByYW5nZSB0cmltbWVkIG9yIGVudGlyZWx5IHJlbW92ZWQuCisgIFNtYWxsUHRyU2V0PGNvbnN0IFZOSW5mbyAqLCA0PiBSZW1hdHRlZDsKKworICAvLy8gc2NhblJlbWF0dGFibGUgLSBJZGVudGlmeSB0aGUgUGFyZW50IHZhbHVlcyB0aGF0IG1heSByZW1hdGVyaWFsaXplLgorICB2b2lkIHNjYW5SZW1hdHRhYmxlKEFsaWFzQW5hbHlzaXMgKmFhKTsKKworICAvLy8gYWxsVXNlc0F2YWlsYWJsZUF0IC0gUmV0dXJuIHRydWUgaWYgYWxsIHJlZ2lzdGVycyB1c2VkIGJ5IE9yaWdNSSBhdAorICAvLy8gT3JpZ0lkeCBhcmUgYWxzbyBhdmFpbGFibGUgd2l0aCB0aGUgc2FtZSB2YWx1ZSBhdCBVc2VJZHguCisgIGJvb2wgYWxsVXNlc0F2YWlsYWJsZUF0KGNvbnN0IE1hY2hpbmVJbnN0ciAqT3JpZ01JLCBTbG90SW5kZXggT3JpZ0lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdEluZGV4IFVzZUlkeCkgY29uc3Q7CisKKyAgLy8vIGZvbGRBc0xvYWQgLSBJZiBMSSBoYXMgYSBzaW5nbGUgdXNlIGFuZCBhIHNpbmdsZSBkZWYgdGhhdCBjYW4gYmUgZm9sZGVkIGFzCisgIC8vLyBhIGxvYWQsIGVsaW1pbmF0ZSB0aGUgcmVnaXN0ZXIgYnkgZm9sZGluZyB0aGUgZGVmIGludG8gdGhlIHVzZS4KKyAgYm9vbCBmb2xkQXNMb2FkKExpdmVJbnRlcnZhbCAqTEksIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIgKj4gJkRlYWQpOworCisgIHVzaW5nIFRvU2hyaW5rU2V0ID0gU2V0VmVjdG9yPExpdmVJbnRlcnZhbCAqLCBTbWFsbFZlY3RvcjxMaXZlSW50ZXJ2YWwgKiwgOD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PExpdmVJbnRlcnZhbCAqLCA4Pj47CisKKyAgLy8vIEhlbHBlciBmb3IgZWxpbWluYXRlRGVhZERlZnMuCisgIHZvaWQgZWxpbWluYXRlRGVhZERlZihNYWNoaW5lSW5zdHIgKk1JLCBUb1Nocmlua1NldCAmVG9TaHJpbmssCisgICAgICAgICAgICAgICAgICAgICAgICBBbGlhc0FuYWx5c2lzICpBQSk7CisKKyAgLy8vIE1hY2hpbmVSZWdpc3RlckluZm8gY2FsbGJhY2sgdG8gbm90aWZ5IHdoZW4gbmV3IHZpcnR1YWwKKyAgLy8vIHJlZ2lzdGVycyBhcmUgY3JlYXRlZC4KKyAgdm9pZCBNUklfTm90ZU5ld1ZpcnR1YWxSZWdpc3Rlcih1bnNpZ25lZCBWUmVnKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIENoZWNrIGlmIE1hY2hpbmVPcGVyYW5kIFxwIE1PIGlzIGEgbGFzdCB1c2Uva2lsbCBlaXRoZXIgaW4gdGhlCisgIC8vLyBtYWluIGxpdmUgcmFuZ2Ugb2YgXHAgTEkgb3IgaW4gb25lIG9mIHRoZSBtYXRjaGluZyBzdWJyZWdpc3RlciByYW5nZXMuCisgIGJvb2wgdXNlSXNLaWxsKGNvbnN0IExpdmVJbnRlcnZhbCAmTEksIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTykgY29uc3Q7CisKKyAgLy8vIENyZWF0ZSBhIG5ldyBlbXB0eSBpbnRlcnZhbCBiYXNlZCBvbiBPbGRSZWcuCisgIExpdmVJbnRlcnZhbCAmY3JlYXRlRW1wdHlJbnRlcnZhbEZyb20odW5zaWduZWQgT2xkUmVnLCBib29sIGNyZWF0ZVN1YlJhbmdlcyk7CisKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZSBhIExpdmVSYW5nZUVkaXQgZm9yIGJyZWFraW5nIGRvd24gcGFyZW50IGludG8gc21hbGxlciBwaWVjZXMuCisgIC8vLyBAcGFyYW0gcGFyZW50IFRoZSByZWdpc3RlciBiZWluZyBzcGlsbGVkIG9yIHNwbGl0LgorICAvLy8gQHBhcmFtIG5ld1JlZ3MgTGlzdCB0byByZWNlaXZlIGFueSBuZXcgcmVnaXN0ZXJzIGNyZWF0ZWQuIFRoaXMgbmVlZG4ndCBiZQorICAvLy8gICAgICAgICAgICAgICAgZW1wdHkgaW5pdGlhbGx5LCBhbnkgZXhpc3RpbmcgcmVnaXN0ZXJzIGFyZSBpZ25vcmVkLgorICAvLy8gQHBhcmFtIE1GIFRoZSBNYWNoaW5lRnVuY3Rpb24gdGhlIGxpdmUgcmFuZ2UgZWRpdCBpcyB0YWtpbmcgcGxhY2UgaW4uCisgIC8vLyBAcGFyYW0gbGlzIFRoZSBjb2xsZWN0aW9uIG9mIGFsbCBsaXZlIGludGVydmFscyBpbiB0aGlzIGZ1bmN0aW9uLgorICAvLy8gQHBhcmFtIHZybSBNYXAgb2YgdmlydHVhbCByZWdpc3RlcnMgdG8gcGh5c2ljYWwgcmVnaXN0ZXJzIGZvciB0aGlzCisgIC8vLyAgICAgICAgICAgIGZ1bmN0aW9uLiAgSWYgTlVMTCwgbm8gdmlydHVhbCByZWdpc3RlciBtYXAgdXBkYXRlcyB3aWxsCisgIC8vLyAgICAgICAgICAgIGJlIGRvbmUuICBUaGlzIGNvdWxkIGJlIHRoZSBjYXNlIGlmIGNhbGxlZCBiZWZvcmUgUmVnYWxsb2MuCisgIC8vLyBAcGFyYW0gZGVhZFJlbWF0cyBUaGUgY29sbGVjdGlvbiBvZiBhbGwgdGhlIGluc3RydWN0aW9ucyBkZWZpbmluZyBhbgorICAvLy8gICAgICAgICAgICAgICAgICAgb3JpZ2luYWwgcmVnIGFuZCBhcmUgZGVhZCBhZnRlciByZW1hdC4KKyAgTGl2ZVJhbmdlRWRpdChMaXZlSW50ZXJ2YWwgKnBhcmVudCwgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmbmV3UmVncywKKyAgICAgICAgICAgICAgICBNYWNoaW5lRnVuY3Rpb24gJk1GLCBMaXZlSW50ZXJ2YWxzICZsaXMsIFZpcnRSZWdNYXAgKnZybSwKKyAgICAgICAgICAgICAgICBEZWxlZ2F0ZSAqZGVsZWdhdGUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0PE1hY2hpbmVJbnN0ciAqLCAzMj4gKmRlYWRSZW1hdHMgPSBudWxscHRyKQorICAgICAgOiBQYXJlbnQocGFyZW50KSwgTmV3UmVncyhuZXdSZWdzKSwgTVJJKE1GLmdldFJlZ0luZm8oKSksIExJUyhsaXMpLAorICAgICAgICBWUk0odnJtKSwgVElJKCpNRi5nZXRTdWJ0YXJnZXQoKS5nZXRJbnN0ckluZm8oKSksIFRoZURlbGVnYXRlKGRlbGVnYXRlKSwKKyAgICAgICAgRmlyc3ROZXcobmV3UmVncy5zaXplKCkpLCBEZWFkUmVtYXRzKGRlYWRSZW1hdHMpIHsKKyAgICBNUkkuc2V0RGVsZWdhdGUodGhpcyk7CisgIH0KKworICB+TGl2ZVJhbmdlRWRpdCgpIG92ZXJyaWRlIHsgTVJJLnJlc2V0RGVsZWdhdGUodGhpcyk7IH0KKworICBMaXZlSW50ZXJ2YWwgJmdldFBhcmVudCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoUGFyZW50ICYmICJObyBwYXJlbnQgTGl2ZUludGVydmFsIik7CisgICAgcmV0dXJuICpQYXJlbnQ7CisgIH0KKworICB1bnNpZ25lZCBnZXRSZWcoKSBjb25zdCB7IHJldHVybiBnZXRQYXJlbnQoKS5yZWc7IH0KKworICAvLy8gSXRlcmF0b3IgZm9yIGFjY2Vzc2luZyB0aGUgbmV3IHJlZ2lzdGVycyBhZGRlZCBieSB0aGlzIGVkaXQuCisgIHVzaW5nIGl0ZXJhdG9yID0gU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPjo6Y29uc3RfaXRlcmF0b3I7CisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gTmV3UmVncy5iZWdpbigpICsgRmlyc3ROZXc7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gTmV3UmVncy5lbmQoKTsgfQorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gTmV3UmVncy5zaXplKCkgLSBGaXJzdE5ldzsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KKyAgdW5zaWduZWQgZ2V0KHVuc2lnbmVkIGlkeCkgY29uc3QgeyByZXR1cm4gTmV3UmVnc1tpZHggKyBGaXJzdE5ld107IH0KKworICAvLy8gcG9wX2JhY2sgLSBJdCBhbGxvd3MgTGl2ZVJhbmdlRWRpdCB1c2VycyB0byBkcm9wIG5ldyByZWdpc3RlcnMuCisgIC8vLyBUaGUgY29udGV4dCBpcyB3aGVuIGFuIG9yaWdpbmFsIGRlZiBpbnN0cnVjdGlvbiBvZiBhIHJlZ2lzdGVyIGlzCisgIC8vLyBkZWFkIGFmdGVyIHJlbWF0ZXJpYWxpemF0aW9uLCB3ZSBzdGlsbCB3YW50IHRvIGtlZXAgaXQgZm9yIGZvbGxvd2luZworICAvLy8gcmVtYXRlcmlhbGl6YXRpb25zLiBXZSBzYXZlIHRoZSBkZWYgaW5zdHJ1Y3Rpb24gaW4gRGVhZFJlbWF0cywKKyAgLy8vIGFuZCByZXBsYWNlIHRoZSBvcmlnaW5hbCBkc3QgcmVnaXN0ZXIgd2l0aCBhIG5ldyBkdW1teSByZWdpc3RlciBzbworICAvLy8gdGhlIGxpdmUgcmFuZ2Ugb2Ygb3JpZ2luYWwgZHN0IHJlZ2lzdGVyIGNhbiBiZSBzaHJpbmtlZCBub3JtYWxseS4KKyAgLy8vIFdlIGRvbid0IHdhbnQgdG8gYWxsb2NhdGUgcGh5cyByZWdpc3RlciBmb3IgdGhlIGR1bW15IHJlZ2lzdGVyLCBzbworICAvLy8gd2Ugd2FudCB0byBkcm9wIGl0IGZyb20gdGhlIE5ld1JlZ3Mgc2V0LgorICB2b2lkIHBvcF9iYWNrKCkgeyBOZXdSZWdzLnBvcF9iYWNrKCk7IH0KKworICBBcnJheVJlZjx1bnNpZ25lZD4gcmVncygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZUFycmF5UmVmKE5ld1JlZ3MpLnNsaWNlKEZpcnN0TmV3KTsKKyAgfQorCisgIC8vLyBjcmVhdGVGcm9tIC0gQ3JlYXRlIGEgbmV3IHZpcnR1YWwgcmVnaXN0ZXIgYmFzZWQgb24gT2xkUmVnLgorICB1bnNpZ25lZCBjcmVhdGVGcm9tKHVuc2lnbmVkIE9sZFJlZyk7CisKKyAgLy8vIGNyZWF0ZSAtIENyZWF0ZSBhIG5ldyByZWdpc3RlciB3aXRoIHRoZSBzYW1lIGNsYXNzIGFuZCBvcmlnaW5hbCBzbG90IGFzCisgIC8vLyBwYXJlbnQuCisgIExpdmVJbnRlcnZhbCAmY3JlYXRlRW1wdHlJbnRlcnZhbCgpIHsKKyAgICByZXR1cm4gY3JlYXRlRW1wdHlJbnRlcnZhbEZyb20oZ2V0UmVnKCksIHRydWUpOworICB9CisKKyAgdW5zaWduZWQgY3JlYXRlKCkgeyByZXR1cm4gY3JlYXRlRnJvbShnZXRSZWcoKSk7IH0KKworICAvLy8gYW55UmVtYXRlcmlhbGl6YWJsZSAtIFJldHVybiB0cnVlIGlmIGFueSBwYXJlbnQgdmFsdWVzIG1heSBiZQorICAvLy8gcmVtYXRlcmlhbGl6YWJsZS4KKyAgLy8vIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSByZW1hdGVyaWFsaXphdGlvbiBpcyBhdHRlbXB0ZWQuCisgIGJvb2wgYW55UmVtYXRlcmlhbGl6YWJsZShBbGlhc0FuYWx5c2lzICopOworCisgIC8vLyBjaGVja1JlbWF0ZXJpYWxpemFibGUgLSBNYW51YWxseSBhZGQgVk5JIHRvIHRoZSBsaXN0IG9mIHJlbWF0ZXJpYWxpemFibGUKKyAgLy8vIHZhbHVlcyBpZiBEZWZNSSBtYXkgYmUgcmVtYXRlcmlhbGl6YWJsZS4KKyAgYm9vbCBjaGVja1JlbWF0ZXJpYWxpemFibGUoVk5JbmZvICpWTkksIGNvbnN0IE1hY2hpbmVJbnN0ciAqRGVmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgKik7CisKKyAgLy8vIFJlbWF0IC0gSW5mb3JtYXRpb24gbmVlZGVkIHRvIHJlbWF0ZXJpYWxpemUgYXQgYSBzcGVjaWZpYyBsb2NhdGlvbi4KKyAgc3RydWN0IFJlbWF0IHsKKyAgICBWTkluZm8gKlBhcmVudFZOSTsgICAgICAgICAgICAgIC8vIHBhcmVudF8ncyB2YWx1ZSBhdCB0aGUgcmVtYXQgbG9jYXRpb24uCisgICAgTWFjaGluZUluc3RyICpPcmlnTUkgPSBudWxscHRyOyAvLyBJbnN0cnVjdGlvbiBkZWZpbmluZyBPcmlnVk5JLiBJdCBjb250YWlucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYWwgZXhwciBmb3IgcmVtYXQuCisKKyAgICBleHBsaWNpdCBSZW1hdChWTkluZm8gKlBhcmVudFZOSSkgOiBQYXJlbnRWTkkoUGFyZW50Vk5JKSB7fQorICB9OworCisgIC8vLyBjYW5SZW1hdGVyaWFsaXplQXQgLSBEZXRlcm1pbmUgaWYgUGFyZW50Vk5JIGNhbiBiZSByZW1hdGVyaWFsaXplZCBhdAorICAvLy8gVXNlSWR4LiBJdCBpcyBhc3N1bWVkIHRoYXQgcGFyZW50Xy5nZXRWTklOZm9BdChVc2VJZHgpID09IFBhcmVudFZOSS4KKyAgLy8vIFdoZW4gY2hlYXBBc0FNb3ZlIGlzIHNldCwgb25seSBjaGVhcCByZW1hdHMgYXJlIGFsbG93ZWQuCisgIGJvb2wgY2FuUmVtYXRlcmlhbGl6ZUF0KFJlbWF0ICZSTSwgVk5JbmZvICpPcmlnVk5JLCBTbG90SW5kZXggVXNlSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNoZWFwQXNBTW92ZSk7CisKKyAgLy8vIHJlbWF0ZXJpYWxpemVBdCAtIFJlbWF0ZXJpYWxpemUgUk0uUGFyZW50Vk5JIGludG8gRGVzdFJlZyBieSBpbnNlcnRpbmcgYW4KKyAgLy8vIGluc3RydWN0aW9uIGludG8gTUJCIGJlZm9yZSBNSS4gVGhlIG5ldyBpbnN0cnVjdGlvbiBpcyBtYXBwZWQsIGJ1dAorICAvLy8gbGl2ZW5lc3MgaXMgbm90IHVwZGF0ZWQuCisgIC8vLyBSZXR1cm4gdGhlIFNsb3RJbmRleCBvZiB0aGUgbmV3IGluc3RydWN0aW9uLgorICBTbG90SW5kZXggcmVtYXRlcmlhbGl6ZUF0KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLCB1bnNpZ25lZCBEZXN0UmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbWF0ICZSTSwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBMYXRlID0gZmFsc2UpOworCisgIC8vLyBtYXJrUmVtYXRlcmlhbGl6ZWQgLSBleHBsaWNpdGx5IG1hcmsgYSB2YWx1ZSBhcyByZW1hdGVyaWFsaXplZCBhZnRlciBkb2luZworICAvLy8gaXQgbWFudWFsbHkuCisgIHZvaWQgbWFya1JlbWF0ZXJpYWxpemVkKGNvbnN0IFZOSW5mbyAqUGFyZW50Vk5JKSB7CisgICAgUmVtYXR0ZWQuaW5zZXJ0KFBhcmVudFZOSSk7CisgIH0KKworICAvLy8gZGlkUmVtYXRlcmlhbGl6ZSAtIFJldHVybiB0cnVlIGlmIFBhcmVudFZOSSB3YXMgcmVtYXRlcmlhbGl6ZWQgYW55d2hlcmUuCisgIGJvb2wgZGlkUmVtYXRlcmlhbGl6ZShjb25zdCBWTkluZm8gKlBhcmVudFZOSSkgY29uc3QgeworICAgIHJldHVybiBSZW1hdHRlZC5jb3VudChQYXJlbnRWTkkpOworICB9CisKKyAgLy8vIGVyYXNlVmlydFJlZyAtIE5vdGlmeSB0aGUgZGVsZWdhdGUgdGhhdCBSZWcgaXMgbm8gbG9uZ2VyIGluIHVzZSwgYW5kIHRyeQorICAvLy8gdG8gZXJhc2UgaXQgZnJvbSBMSVMuCisgIHZvaWQgZXJhc2VWaXJ0UmVnKHVuc2lnbmVkIFJlZyk7CisKKyAgLy8vIGVsaW1pbmF0ZURlYWREZWZzIC0gVHJ5IHRvIGRlbGV0ZSBtYWNoaW5lIGluc3RydWN0aW9ucyB0aGF0IGFyZSBub3cgZGVhZAorICAvLy8gKGFsbERlZnNBcmVEZWFkIHJldHVybnMgdHJ1ZSkuIFRoaXMgbWF5IGNhdXNlIGxpdmUgaW50ZXJ2YWxzIHRvIGJlIHRyaW1tZWQKKyAgLy8vIGFuZCBmdXJ0aGVyIGRlYWQgZWZzIHRvIGJlIGVsaW1pbmF0ZWQuCisgIC8vLyBSZWdzQmVpbmdTcGlsbGVkIGxpc3RzIHJlZ2lzdGVycyBjdXJyZW50bHkgYmVpbmcgc3BpbGxlZCBieSB0aGUgcmVnaXN0ZXIKKyAgLy8vIGFsbG9jYXRvci4gIFRoZXNlIHJlZ2lzdGVycyBzaG91bGQgbm90IGJlIHNwbGl0IGludG8gbmV3IGludGVydmFscworICAvLy8gYXMgY3VycmVudGx5IHRob3NlIG5ldyBpbnRlcnZhbHMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIHNwaWxsLgorICB2b2lkIGVsaW1pbmF0ZURlYWREZWZzKFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIgKj4gJkRlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IFJlZ3NCZWluZ1NwaWxsZWQgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgKkFBID0gbnVsbHB0cik7CisKKyAgLy8vIGNhbGN1bGF0ZVJlZ0NsYXNzQW5kSGludCAtIFJlY29tcHV0ZSByZWdpc3RlciBjbGFzcyBhbmQgaGludCBmb3IgZWFjaCBuZXcKKyAgLy8vIHJlZ2lzdGVyLgorICB2b2lkIGNhbGN1bGF0ZVJlZ0NsYXNzQW5kSGludChNYWNoaW5lRnVuY3Rpb24gJiwgY29uc3QgTWFjaGluZUxvb3BJbmZvICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8gJik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0xJVkVSQU5HRUVESVRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVSZWdNYXRyaXguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlUmVnTWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYyYTU1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlUmVnTWF0cml4LmgKQEAgLTAsMCArMSwxNjAgQEAKKy8vPT09LSBMaXZlUmVnTWF0cml4LmggLSBUcmFjayByZWdpc3RlciBpbnRlcmZlcmVuY2UgLS0tLS0tLS0tLSotIEMrKyAtKi0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlIExpdmVSZWdNYXRyaXggYW5hbHlzaXMgcGFzcyBrZWVwcyB0cmFjayBvZiB2aXJ0dWFsIHJlZ2lzdGVyIGludGVyZmVyZW5jZQorLy8gYWxvbmcgdHdvIGRpbWVuc2lvbnM6IFNsb3QgaW5kZXhlcyBhbmQgcmVnaXN0ZXIgdW5pdHMuIFRoZSBtYXRyaXggaXMgdXNlZCBieQorLy8gcmVnaXN0ZXIgYWxsb2NhdG9ycyB0byBlbnN1cmUgdGhhdCBubyBpbnRlcmZlcmluZyB2aXJ0dWFsIHJlZ2lzdGVycyBnZXQKKy8vIGFzc2lnbmVkIHRvIG92ZXJsYXBwaW5nIHBoeXNpY2FsIHJlZ2lzdGVycy4KKy8vCisvLyBSZWdpc3RlciB1bml0cyBhcmUgZGVmaW5lZCBpbiBNQ1JlZ2lzdGVySW5mby5oLCB0aGV5IHJlcHJlc2VudCB0aGUgc21hbGxlc3QKKy8vIHVuaXQgb2YgaW50ZXJmZXJlbmNlIHdoZW4gZGVhbGluZyB3aXRoIG92ZXJsYXBwaW5nIHBoeXNpY2FsIHJlZ2lzdGVycy4gVGhlCisvLyBMaXZlUmVnTWF0cml4IGlzIHJlcHJlc2VudGVkIGFzIGEgTGl2ZUludGVydmFsVW5pb24gcGVyIHJlZ2lzdGVyIHVuaXQuIFdoZW4KKy8vIGEgdmlydHVhbCByZWdpc3RlciBpcyBhc3NpZ25lZCB0byBhIHBoeXNpY2FsIHJlZ2lzdGVyLCB0aGUgbGl2ZSByYW5nZSBmb3IKKy8vIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyIGlzIGluc2VydGVkIGludG8gdGhlIExpdmVJbnRlcnZhbFVuaW9uIGZvciBlYWNoIHJlZ3VuaXQKKy8vIGluIHRoZSBwaHlzcmVnLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0xJVkVSRUdNQVRSSVhfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTElWRVJFR01BVFJJWF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBbmFseXNpc1VzYWdlOworY2xhc3MgTGl2ZUludGVydmFsOworY2xhc3MgTGl2ZUludGVydmFsczsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKK2NsYXNzIFZpcnRSZWdNYXA7CisKK2NsYXNzIExpdmVSZWdNYXRyaXggOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJOworICBMaXZlSW50ZXJ2YWxzICpMSVM7CisgIFZpcnRSZWdNYXAgKlZSTTsKKworICAvLyBVc2VyVGFnIGNoYW5nZXMgd2hlbmV2ZXIgdmlydHVhbCByZWdpc3RlcnMgaGF2ZSBiZWVuIG1vZGlmaWVkLgorICB1bnNpZ25lZCBVc2VyVGFnID0gMDsKKworICAvLyBUaGUgbWF0cml4IGlzIHJlcHJlc2VudGVkIGFzIGEgTGl2ZUludGVydmFsVW5pb24gcGVyIHJlZ2lzdGVyIHVuaXQuCisgIExpdmVJbnRlcnZhbFVuaW9uOjpBbGxvY2F0b3IgTElVQWxsb2M7CisgIExpdmVJbnRlcnZhbFVuaW9uOjpBcnJheSBNYXRyaXg7CisKKyAgLy8gQ2FjaGVkIHF1ZXJpZXMgcGVyIHJlZ2lzdGVyIHVuaXQuCisgIHN0ZDo6dW5pcXVlX3B0cjxMaXZlSW50ZXJ2YWxVbmlvbjo6UXVlcnlbXT4gUXVlcmllczsKKworICAvLyBDYWNoZWQgcmVnaXN0ZXIgbWFzayBpbnRlcmZlcmVuY2UgaW5mby4KKyAgdW5zaWduZWQgUmVnTWFza1RhZyA9IDA7CisgIHVuc2lnbmVkIFJlZ01hc2tWaXJ0UmVnID0gMDsKKyAgQml0VmVjdG9yIFJlZ01hc2tVc2FibGU7CisKKyAgLy8gTWFjaGluZUZ1bmN0aW9uUGFzcyBib2lsZXJwbGF0ZS4KKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJikgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICYpIG92ZXJyaWRlOworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBMaXZlUmVnTWF0cml4KCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEhpZ2gtbGV2ZWwgaW50ZXJmYWNlLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8gQ2hlY2sgZm9yIGludGVyZmVyZW5jZSBiZWZvcmUgYXNzaWduaW5nIHZpcnR1YWwgcmVnaXN0ZXJzIHRvIHBoeXNpY2FsCisgIC8vIHJlZ2lzdGVycy4KKyAgLy8KKworICAvLy8gSW52YWxpZGF0ZSBjYWNoZWQgaW50ZXJmZXJlbmNlIHF1ZXJpZXMgYWZ0ZXIgbW9kaWZ5aW5nIHZpcnR1YWwgcmVnaXN0ZXIKKyAgLy8vIGxpdmUgcmFuZ2VzLiBJbnRlcmZlcmVuY2UgY2hlY2tzIG1heSByZXR1cm4gc3RhbGUgaW5mb3JtYXRpb24gdW5sZXNzCisgIC8vLyBjYWNoZXMgYXJlIGludmFsaWRhdGVkLgorICB2b2lkIGludmFsaWRhdGVWaXJ0UmVncygpIHsgKytVc2VyVGFnOyB9CisKKyAgZW51bSBJbnRlcmZlcmVuY2VLaW5kIHsKKyAgICAvLy8gTm8gaW50ZXJmZXJlbmNlLCBnbyBhaGVhZCBhbmQgYXNzaWduLgorICAgIElLX0ZyZWUgPSAwLAorCisgICAgLy8vIFZpcnR1YWwgcmVnaXN0ZXIgaW50ZXJmZXJlbmNlLiBUaGVyZSBhcmUgaW50ZXJmZXJpbmcgdmlydHVhbCByZWdpc3RlcnMKKyAgICAvLy8gYXNzaWduZWQgdG8gUGh5c1JlZyBvciBpdHMgYWxpYXNlcy4gVGhpcyBpbnRlcmZlcmVuY2UgY291bGQgYmUgcmVzb2x2ZWQKKyAgICAvLy8gYnkgdW5hc3NpZ25pbmcgdGhvc2Ugb3RoZXIgdmlydHVhbCByZWdpc3RlcnMuCisgICAgSUtfVmlydFJlZywKKworICAgIC8vLyBSZWdpc3RlciB1bml0IGludGVyZmVyZW5jZS4gQSBmaXhlZCBsaXZlIHJhbmdlIGlzIGluIHRoZSB3YXksIHR5cGljYWxseQorICAgIC8vLyBhcmd1bWVudCByZWdpc3RlcnMgZm9yIGEgY2FsbC4gVGhpcyBjYW4ndCBiZSByZXNvbHZlZCBieSB1bmFzc2lnbmluZworICAgIC8vLyBvdGhlciB2aXJ0dWFsIHJlZ2lzdGVycy4KKyAgICBJS19SZWdVbml0LAorCisgICAgLy8vIFJlZ01hc2sgaW50ZXJmZXJlbmNlLiBUaGUgbGl2ZSByYW5nZSBpcyBjcm9zc2luZyBhbiBpbnN0cnVjdGlvbiB3aXRoIGEKKyAgICAvLy8gcmVnbWFzayBvcGVyYW5kIHRoYXQgZG9lc24ndCBwcmVzZXJ2ZSBQaHlzUmVnLiBUaGlzIHR5cGljYWxseSBtZWFucworICAgIC8vLyBWaXJ0UmVnIGlzIGxpdmUgYWNyb3NzIGEgY2FsbCwgYW5kIFBoeXNSZWcgaXNuJ3QgY2FsbC1wcmVzZXJ2ZWQuCisgICAgSUtfUmVnTWFzaworICB9OworCisgIC8vLyBDaGVjayBmb3IgaW50ZXJmZXJlbmNlIGJlZm9yZSBhc3NpZ25pbmcgVmlydFJlZyB0byBQaHlzUmVnLgorICAvLy8gSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIElLX0ZyZWUsIGl0IGlzIGxlZ2FsIHRvIGFzc2lnbihWaXJ0UmVnLCBQaHlzUmVnKS4KKyAgLy8vIFdoZW4gdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBraW5kIG9mIGludGVyZmVyZW5jZSwgdGhlIEludGVyZmVyZW5jZUtpbmQKKyAgLy8vIHdpdGggdGhlIGhpZ2hlc3QgZW51bSB2YWx1ZSBpcyByZXR1cm5lZC4KKyAgSW50ZXJmZXJlbmNlS2luZCBjaGVja0ludGVyZmVyZW5jZShMaXZlSW50ZXJ2YWwgJlZpcnRSZWcsIHVuc2lnbmVkIFBoeXNSZWcpOworCisgIC8vLyBDaGVjayBmb3IgaW50ZXJmZXJlbmNlIGluIHRoZSBzZWdtZW50IFtTdGFydCwgRW5kKSB0aGF0IG1heSBwcmV2ZW50CisgIC8vLyBhc3NpZ25tZW50IHRvIFBoeXNSZWcuIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCB0aGVyZSBpcworICAvLy8gaW50ZXJmZXJlbmNlIGluIHRoZSBzZWdtZW50IFtTdGFydCwgRW5kKSBvZiBzb21lIG90aGVyIGludGVydmFsIGFscmVhZHkKKyAgLy8vIGFzc2lnbmVkIHRvIFBoeXNSZWcuIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgUGh5c1JlZyBpcyBmcmVlIGF0CisgIC8vLyB0aGUgc2VnbWVudCBbU3RhcnQsIEVuZCkuCisgIGJvb2wgY2hlY2tJbnRlcmZlcmVuY2UoU2xvdEluZGV4IFN0YXJ0LCBTbG90SW5kZXggRW5kLCB1bnNpZ25lZCBQaHlzUmVnKTsKKworICAvLy8gQXNzaWduIFZpcnRSZWcgdG8gUGh5c1JlZy4KKyAgLy8vIFRoaXMgd2lsbCBtYXJrIFZpcnRSZWcncyBsaXZlIHJhbmdlIGFzIG9jY3VwaWVkIGluIHRoZSBMaXZlUmVnTWF0cml4IGFuZAorICAvLy8gdXBkYXRlIFZpcnRSZWdNYXAuIFRoZSBsaXZlIHJhbmdlIGlzIGV4cGVjdGVkIHRvIGJlIGF2YWlsYWJsZSBpbiBQaHlzUmVnLgorICB2b2lkIGFzc2lnbihMaXZlSW50ZXJ2YWwgJlZpcnRSZWcsIHVuc2lnbmVkIFBoeXNSZWcpOworCisgIC8vLyBVbmFzc2lnbiBWaXJ0UmVnIGZyb20gaXRzIFBoeXNSZWcuCisgIC8vLyBBc3N1bWluZyB0aGF0IFZpcnRSZWcgd2FzIHByZXZpb3VzbHkgYXNzaWduZWQgdG8gYSBQaHlzUmVnLCB0aGlzIHVuZG9lcworICAvLy8gdGhlIGFzc2lnbm1lbnQgYW5kIHVwZGF0ZXMgVmlydFJlZ01hcCBhY2NvcmRpbmdseS4KKyAgdm9pZCB1bmFzc2lnbihMaXZlSW50ZXJ2YWwgJlZpcnRSZWcpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIFxwIFBoeXNSZWcgaGFzIGFueSBsaXZlIGludGVydmFscyBhc3NpZ25lZC4KKyAgYm9vbCBpc1BoeXNSZWdVc2VkKHVuc2lnbmVkIFBoeXNSZWcpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBMb3ctbGV2ZWwgaW50ZXJmYWNlLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8gUHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgTGl2ZUludGVydmFsVW5pb25zLgorICAvLworCisgIC8vLyBDaGVjayBmb3IgcmVnbWFzayBpbnRlcmZlcmVuY2Ugb25seS4KKyAgLy8vIFJldHVybiB0cnVlIGlmIFZpcnRSZWcgY3Jvc3NlcyBhIHJlZ21hc2sgb3BlcmFuZCB0aGF0IGNsb2JiZXJzIFBoeXNSZWcuCisgIC8vLyBJZiBQaHlzUmVnIGlzIG51bGwsIGNoZWNrIGlmIFZpcnRSZWcgY3Jvc3NlcyBhbnkgcmVnbWFzayBvcGVyYW5kcy4KKyAgYm9vbCBjaGVja1JlZ01hc2tJbnRlcmZlcmVuY2UoTGl2ZUludGVydmFsICZWaXJ0UmVnLCB1bnNpZ25lZCBQaHlzUmVnID0gMCk7CisKKyAgLy8vIENoZWNrIGZvciByZWd1bml0IGludGVyZmVyZW5jZSBvbmx5LgorICAvLy8gUmV0dXJuIHRydWUgaWYgVmlydFJlZyBvdmVybGFwcyBhIGZpeGVkIGFzc2lnbm1lbnQgb2Ygb25lIG9mIFBoeXNSZWdzJ3MKKyAgLy8vIHJlZ2lzdGVyIHVuaXRzLgorICBib29sIGNoZWNrUmVnVW5pdEludGVyZmVyZW5jZShMaXZlSW50ZXJ2YWwgJlZpcnRSZWcsIHVuc2lnbmVkIFBoeXNSZWcpOworCisgIC8vLyBRdWVyeSBhIGxpbmUgb2YgdGhlIGFzc2lnbmVkIHZpcnR1YWwgcmVnaXN0ZXIgbWF0cml4IGRpcmVjdGx5LgorICAvLy8gVXNlIE1DUmVnVW5pdEl0ZXJhdG9yIHRvIGVudW1lcmF0ZSBhbGwgcmVndW5pdHMgaW4gdGhlIGRlc2lyZWQgUGh5c1JlZy4KKyAgLy8vIFRoaXMgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhbiBpbnRlcm5hbCBRdWVyeSBkYXRhIHN0cnVjdHVyZSB0aGF0IGlzIG9ubHkKKyAgLy8vIHZhbGlkIHVudGlsIHRoZSBuZXh0IHF1ZXJ5KCkgY2FsbC4KKyAgTGl2ZUludGVydmFsVW5pb246OlF1ZXJ5ICZxdWVyeShjb25zdCBMaXZlUmFuZ2UgJkxSLCB1bnNpZ25lZCBSZWdVbml0KTsKKworICAvLy8gRGlyZWN0bHkgYWNjZXNzIHRoZSBsaXZlIGludGVydmFsIHVuaW9ucyBwZXIgcmVndW5pdC4KKyAgLy8vIFRoaXMgcmV0dXJucyBhbiBhcnJheSBpbmRleGVkIGJ5IHRoZSByZWd1bml0IG51bWJlci4KKyAgTGl2ZUludGVydmFsVW5pb24gKmdldExpdmVVbmlvbnMoKSB7IHJldHVybiAmTWF0cml4WzBdOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0xJVkVSRUdNQVRSSVhfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVSZWdVbml0cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVSZWdVbml0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNDk1NmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZVJlZ1VuaXRzLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vTGl2ZVJlZ1VuaXRzLmggLSBSZWdpc3RlciBVbml0IFNldCAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gQSBzZXQgb2YgcmVnaXN0ZXIgdW5pdHMuIEl0IGlzIGludGVuZGVkIGZvciByZWdpc3RlciBsaXZlbmVzcyB0cmFja2luZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9MSVZFUkVHVU5JVFNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTElWRVJFR1VOSVRTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL0xhbmVCaXRtYXNrLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1JlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CisKKy8vLyBBIHNldCBvZiByZWdpc3RlciB1bml0cyB1c2VkIHRvIHRyYWNrIHJlZ2lzdGVyIGxpdmVuZXNzLgorY2xhc3MgTGl2ZVJlZ1VuaXRzIHsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyOworICBCaXRWZWN0b3IgVW5pdHM7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdHMgYSBuZXcgZW1wdHkgTGl2ZVJlZ1VuaXRzIHNldC4KKyAgTGl2ZVJlZ1VuaXRzKCkgPSBkZWZhdWx0OworCisgIC8vLyBDb25zdHJ1Y3RzIGFuZCBpbml0aWFsaXplIGFuIGVtcHR5IExpdmVSZWdVbml0cyBzZXQuCisgIExpdmVSZWdVbml0cyhjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSkgeworICAgIGluaXQoVFJJKTsKKyAgfQorCisgIC8vLyBJbml0aWFsaXplIGFuZCBjbGVhciB0aGUgc2V0LgorICB2b2lkIGluaXQoY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkkpIHsKKyAgICB0aGlzLT5UUkkgPSAmVFJJOworICAgIFVuaXRzLnJlc2V0KCk7CisgICAgVW5pdHMucmVzaXplKFRSSS5nZXROdW1SZWdVbml0cygpKTsKKyAgfQorCisgIC8vLyBDbGVhcnMgdGhlIHNldC4KKyAgdm9pZCBjbGVhcigpIHsgVW5pdHMucmVzZXQoKTsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNldCBpcyBlbXB0eS4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFVuaXRzLm5vbmUoKTsgfQorCisgIC8vLyBBZGRzIHJlZ2lzdGVyIHVuaXRzIGNvdmVyZWQgYnkgcGh5c2ljYWwgcmVnaXN0ZXIgXHAgUmVnLgorICB2b2lkIGFkZFJlZyh1bnNpZ25lZCBSZWcpIHsKKyAgICBmb3IgKE1DUmVnVW5pdEl0ZXJhdG9yIFVuaXQoUmVnLCBUUkkpOyBVbml0LmlzVmFsaWQoKTsgKytVbml0KQorICAgICAgVW5pdHMuc2V0KCpVbml0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWRkcyByZWdpc3RlciB1bml0cyBjb3ZlcmVkIGJ5IHBoeXNpY2FsIHJlZ2lzdGVyIFxwIFJlZyB0aGF0IGFyZQorICAvLy8gcGFydCBvZiB0aGUgbGFuZW1hc2sgXHAgTWFzay4KKyAgdm9pZCBhZGRSZWdNYXNrZWQodW5zaWduZWQgUmVnLCBMYW5lQml0bWFzayBNYXNrKSB7CisgICAgZm9yIChNQ1JlZ1VuaXRNYXNrSXRlcmF0b3IgVW5pdChSZWcsIFRSSSk7IFVuaXQuaXNWYWxpZCgpOyArK1VuaXQpIHsKKyAgICAgIExhbmVCaXRtYXNrIFVuaXRNYXNrID0gKCpVbml0KS5zZWNvbmQ7CisgICAgICBpZiAoVW5pdE1hc2subm9uZSgpIHx8IChVbml0TWFzayAmIE1hc2spLmFueSgpKQorICAgICAgICBVbml0cy5zZXQoKCpVbml0KS5maXJzdCk7CisgICAgfQorICB9CisKKyAgLy8vIFJlbW92ZXMgYWxsIHJlZ2lzdGVyIHVuaXRzIGNvdmVyZWQgYnkgcGh5c2ljYWwgcmVnaXN0ZXIgXHAgUmVnLgorICB2b2lkIHJlbW92ZVJlZyh1bnNpZ25lZCBSZWcpIHsKKyAgICBmb3IgKE1DUmVnVW5pdEl0ZXJhdG9yIFVuaXQoUmVnLCBUUkkpOyBVbml0LmlzVmFsaWQoKTsgKytVbml0KQorICAgICAgVW5pdHMucmVzZXQoKlVuaXQpOworICB9CisKKyAgLy8vIFJlbW92ZXMgcmVnaXN0ZXIgdW5pdHMgbm90IHByZXNlcnZlZCBieSB0aGUgcmVnbWFzayBccCBSZWdNYXNrLgorICAvLy8gVGhlIHJlZ21hc2sgaGFzIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgb25lIGluIHRoZSBSZWdNYXNrIG1hY2hpbmUgb3BlcmFuZC4KKyAgdm9pZCByZW1vdmVSZWdzTm90UHJlc2VydmVkKGNvbnN0IHVpbnQzMl90ICpSZWdNYXNrKTsKKworICAvLy8gQWRkcyByZWdpc3RlciB1bml0cyBub3QgcHJlc2VydmVkIGJ5IHRoZSByZWdtYXNrIFxwIFJlZ01hc2suCisgIC8vLyBUaGUgcmVnbWFzayBoYXMgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBvbmUgaW4gdGhlIFJlZ01hc2sgbWFjaGluZSBvcGVyYW5kLgorICB2b2lkIGFkZFJlZ3NJbk1hc2soY29uc3QgdWludDMyX3QgKlJlZ01hc2spOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgbm8gcGFydCBvZiBwaHlzaWNhbCByZWdpc3RlciBccCBSZWcgaXMgbGl2ZS4KKyAgYm9vbCBhdmFpbGFibGUodW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgZm9yIChNQ1JlZ1VuaXRJdGVyYXRvciBVbml0KFJlZywgVFJJKTsgVW5pdC5pc1ZhbGlkKCk7ICsrVW5pdCkgeworICAgICAgaWYgKFVuaXRzLnRlc3QoKlVuaXQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFVwZGF0ZXMgbGl2ZW5lc3Mgd2hlbiBzdGVwcGluZyBiYWNrd2FyZHMgb3ZlciB0aGUgaW5zdHJ1Y3Rpb24gXHAgTUkuCisgIC8vLyBUaGlzIHJlbW92ZXMgYWxsIHJlZ2lzdGVyIHVuaXRzIGRlZmluZWQgb3IgY2xvYmJlcmVkIGluIFxwIE1JIGFuZCB0aGVuCisgIC8vLyBhZGRzIHRoZSB1bml0cyB1c2VkIChhcyBpbiB1c2Ugb3BlcmFuZHMpIGluIFxwIE1JLgorICB2b2lkIHN0ZXBCYWNrd2FyZChjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKworICAvLy8gQWRkcyBhbGwgcmVnaXN0ZXIgdW5pdHMgdXNlZCwgZGVmaW5lZCBvciBjbG9iYmVyZWQgaW4gXHAgTUkuCisgIC8vLyBUaGlzIGlzIHVzZWZ1bCB3aGVuIHdhbGtpbmcgb3ZlciBhIHJhbmdlIG9mIGluc3RydWN0aW9uIHRvIGZpbmQgcmVnaXN0ZXJzCisgIC8vLyB1bnVzZWQgb3ZlciB0aGUgd2hvbGUgcmFuZ2UuCisgIHZvaWQgYWNjdW11bGF0ZShjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKworICAvLy8gQWRkcyByZWdpc3RlcnMgbGl2aW5nIG91dCBvZiBibG9jayBccCBNQkIuCisgIC8vLyBMaXZlIG91dCByZWdpc3RlcnMgYXJlIHRoZSB1bmlvbiBvZiB0aGUgbGl2ZS1pbiByZWdpc3RlcnMgb2YgdGhlIHN1Y2Nlc3NvcgorICAvLy8gYmxvY2tzIGFuZCBwcmlzdGluZSByZWdpc3RlcnMuIExpdmUgb3V0IHJlZ2lzdGVycyBvZiB0aGUgZW5kIGJsb2NrIGFyZSB0aGUKKyAgLy8vIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMuCisgIHZvaWQgYWRkTGl2ZU91dHMoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKyAgLy8vIEFkZHMgcmVnaXN0ZXJzIGxpdmluZyBpbnRvIGJsb2NrIFxwIE1CQi4KKyAgdm9pZCBhZGRMaXZlSW5zKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworCisgIC8vLyBBZGRzIGFsbCByZWdpc3RlciB1bml0cyBtYXJrZWQgaW4gdGhlIGJpdHZlY3RvciBccCBSZWdVbml0cy4KKyAgdm9pZCBhZGRVbml0cyhjb25zdCBCaXRWZWN0b3IgJlJlZ1VuaXRzKSB7CisgICAgVW5pdHMgfD0gUmVnVW5pdHM7CisgIH0KKyAgLy8vIFJlbW92ZXMgYWxsIHJlZ2lzdGVyIHVuaXRzIG1hcmtlZCBpbiB0aGUgYml0dmVjdG9yIFxwIFJlZ1VuaXRzLgorICB2b2lkIHJlbW92ZVVuaXRzKGNvbnN0IEJpdFZlY3RvciAmUmVnVW5pdHMpIHsKKyAgICBVbml0cy5yZXNldChSZWdVbml0cyk7CisgIH0KKyAgLy8vIFJldHVybiB0aGUgaW50ZXJuYWwgYml0dmVjdG9yIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZXQuCisgIGNvbnN0IEJpdFZlY3RvciAmZ2V0Qml0VmVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBVbml0czsKKyAgfQorCitwcml2YXRlOgorICAvLy8gQWRkcyBwcmlzdGluZSByZWdpc3RlcnMuIFByaXN0aW5lIHJlZ2lzdGVycyBhcmUgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycworICAvLy8gdGhhdCBhcmUgdW51c2VkIGluIHRoZSBmdW5jdGlvbi4KKyAgdm9pZCBhZGRQcmlzdGluZXMoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0xJVkVSRUdVTklUU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZVN0YWNrcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVTdGFja3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGVkNzg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVTdGFja3MuaApAQCAtMCwwICsxLDEwMyBAQAorLy89PT0tIExpdmVTdGFja3MuaCAtIExpdmUgU3RhY2sgU2xvdCBBbmFseXNpcyAtLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgbGl2ZSBzdGFjayBzbG90IGFuYWx5c2lzIHBhc3MuIEl0IGlzIGFuYWxvZ291cyB0bworLy8gbGl2ZSBpbnRlcnZhbCBhbmFseXNpcyBleGNlcHQgaXQncyBhbmFseXppbmcgbGl2ZW5lc3Mgb2Ygc3RhY2sgc2xvdHMgcmF0aGVyCisvLyB0aGFuIHJlZ2lzdGVycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9MSVZFU1RBQ0tTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0xJVkVTVEFDS1NfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBUYXJnZXRSZWdpc3RlckNsYXNzOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworCitjbGFzcyBMaXZlU3RhY2tzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSTsKKworICAvLy8gU3BlY2lhbCBwb29sIGFsbG9jYXRvciBmb3IgVk5JbmZvJ3MgKExpdmVJbnRlcnZhbCB2YWwjKS4KKyAgLy8vCisgIFZOSW5mbzo6QWxsb2NhdG9yIFZOSW5mb0FsbG9jYXRvcjsKKworICAvLy8gUzJJTWFwIC0gU3RhY2sgc2xvdCBpbmRpY2VzIHRvIGxpdmUgaW50ZXJ2YWwgbWFwcGluZy4KKyAgdXNpbmcgU1MySW50ZXJ2YWxNYXAgPSBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBMaXZlSW50ZXJ2YWw+OworICBTUzJJbnRlcnZhbE1hcCBTMklNYXA7CisKKyAgLy8vIFMyUkNNYXAgLSBTdGFjayBzbG90IGluZGljZXMgdG8gcmVnaXN0ZXIgY2xhc3MgbWFwcGluZy4KKyAgc3RkOjptYXA8aW50LCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICo+IFMyUkNNYXA7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKworICBMaXZlU3RhY2tzKCkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSB7CisgICAgaW5pdGlhbGl6ZUxpdmVTdGFja3NQYXNzKCpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpKTsKKyAgfQorCisgIHVzaW5nIGl0ZXJhdG9yID0gU1MySW50ZXJ2YWxNYXA6Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IFNTMkludGVydmFsTWFwOjpjb25zdF9pdGVyYXRvcjsKKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFMySU1hcC5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFMySU1hcC5lbmQoKTsgfQorICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIFMySU1hcC5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIFMySU1hcC5lbmQoKTsgfQorCisgIHVuc2lnbmVkIGdldE51bUludGVydmFscygpIGNvbnN0IHsgcmV0dXJuICh1bnNpZ25lZClTMklNYXAuc2l6ZSgpOyB9CisKKyAgTGl2ZUludGVydmFsICZnZXRPckNyZWF0ZUludGVydmFsKGludCBTbG90LCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyk7CisKKyAgTGl2ZUludGVydmFsICZnZXRJbnRlcnZhbChpbnQgU2xvdCkgeworICAgIGFzc2VydChTbG90ID49IDAgJiYgIlNwaWxsIHNsb3QgaW5kaWNlIG11c3QgYmUgPj0gMCIpOworICAgIFNTMkludGVydmFsTWFwOjppdGVyYXRvciBJID0gUzJJTWFwLmZpbmQoU2xvdCk7CisgICAgYXNzZXJ0KEkgIT0gUzJJTWFwLmVuZCgpICYmICJJbnRlcnZhbCBkb2VzIG5vdCBleGlzdCBmb3Igc3RhY2sgc2xvdCIpOworICAgIHJldHVybiBJLT5zZWNvbmQ7CisgIH0KKworICBjb25zdCBMaXZlSW50ZXJ2YWwgJmdldEludGVydmFsKGludCBTbG90KSBjb25zdCB7CisgICAgYXNzZXJ0KFNsb3QgPj0gMCAmJiAiU3BpbGwgc2xvdCBpbmRpY2UgbXVzdCBiZSA+PSAwIik7CisgICAgU1MySW50ZXJ2YWxNYXA6OmNvbnN0X2l0ZXJhdG9yIEkgPSBTMklNYXAuZmluZChTbG90KTsKKyAgICBhc3NlcnQoSSAhPSBTMklNYXAuZW5kKCkgJiYgIkludGVydmFsIGRvZXMgbm90IGV4aXN0IGZvciBzdGFjayBzbG90Iik7CisgICAgcmV0dXJuIEktPnNlY29uZDsKKyAgfQorCisgIGJvb2wgaGFzSW50ZXJ2YWwoaW50IFNsb3QpIGNvbnN0IHsgcmV0dXJuIFMySU1hcC5jb3VudChTbG90KTsgfQorCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKmdldEludGVydmFsUmVnQ2xhc3MoaW50IFNsb3QpIGNvbnN0IHsKKyAgICBhc3NlcnQoU2xvdCA+PSAwICYmICJTcGlsbCBzbG90IGluZGljZSBtdXN0IGJlID49IDAiKTsKKyAgICBzdGQ6Om1hcDxpbnQsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKj46OmNvbnN0X2l0ZXJhdG9yIEkgPQorICAgICAgICBTMlJDTWFwLmZpbmQoU2xvdCk7CisgICAgYXNzZXJ0KEkgIT0gUzJSQ01hcC5lbmQoKSAmJgorICAgICAgICAgICAiUmVnaXN0ZXIgY2xhc3MgaW5mbyBkb2VzIG5vdCBleGlzdCBmb3Igc3RhY2sgc2xvdCIpOworICAgIHJldHVybiBJLT5zZWNvbmQ7CisgIH0KKworICBWTkluZm86OkFsbG9jYXRvciAmZ2V0Vk5JbmZvQWxsb2NhdG9yKCkgeyByZXR1cm4gVk5JbmZvQWxsb2NhdG9yOyB9CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGU7CisKKyAgLy8vIHJ1bk9uTWFjaGluZUZ1bmN0aW9uIC0gcGFzcyBlbnRyeSBwb2ludAorICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmKSBvdmVycmlkZTsKKworICAvLy8gcHJpbnQgLSBJbXBsZW1lbnQgdGhlIGR1bXAgbWV0aG9kLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPLCBjb25zdCBNb2R1bGUgKiA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZVZhcmlhYmxlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVWYXJpYWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDhkYTg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVWYXJpYWJsZXMuaApAQCAtMCwwICsxLDMwOSBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vTGl2ZVZhcmlhYmxlcy5oIC0gTGl2ZSBWYXJpYWJsZSBBbmFseXNpcyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgTGl2ZVZhcmlhYmxlcyBhbmFseXNpcyBwYXNzLiAgRm9yIGVhY2ggbWFjaGluZQorLy8gaW5zdHJ1Y3Rpb24gaW4gdGhlIGZ1bmN0aW9uLCB0aGlzIHBhc3MgY2FsY3VsYXRlcyB0aGUgc2V0IG9mIHJlZ2lzdGVycyB0aGF0CisvLyBhcmUgaW1tZWRpYXRlbHkgZGVhZCBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24gKGkuZS4sIHRoZSBpbnN0cnVjdGlvbiBjYWxjdWxhdGVzCisvLyB0aGUgdmFsdWUsIGJ1dCBpdCBpcyBuZXZlciB1c2VkKSBhbmQgdGhlIHNldCBvZiByZWdpc3RlcnMgdGhhdCBhcmUgdXNlZCBieQorLy8gdGhlIGluc3RydWN0aW9uLCBidXQgYXJlIG5ldmVyIHVzZWQgYWZ0ZXIgdGhlIGluc3RydWN0aW9uIChpLmUuLCB0aGV5IGFyZQorLy8ga2lsbGVkKS4KKy8vCisvLyBUaGlzIGNsYXNzIGNvbXB1dGVzIGxpdmUgdmFyaWFibGVzIHVzaW5nIGEgc3BhcnNlIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uCisvLyB0aGUgbWFjaGluZSBjb2RlIFNTQSBmb3JtLiAgVGhpcyBjbGFzcyBjb21wdXRlcyBsaXZlIHZhcmlhYmxlIGluZm9ybWF0aW9uIGZvcgorLy8gZWFjaCB2aXJ0dWFsIGFuZCBfcmVnaXN0ZXIgYWxsb2NhdGFibGVfIHBoeXNpY2FsIHJlZ2lzdGVyIGluIGEgZnVuY3Rpb24uICBJdAorLy8gdXNlcyB0aGUgZG9taW5hbmNlIHByb3BlcnRpZXMgb2YgU1NBIGZvcm0gdG8gZWZmaWNpZW50bHkgY29tcHV0ZSBsaXZlCisvLyB2YXJpYWJsZXMgZm9yIHZpcnR1YWwgcmVnaXN0ZXJzLCBhbmQgYXNzdW1lcyB0aGF0IHBoeXNpY2FsIHJlZ2lzdGVycyBhcmUgb25seQorLy8gbGl2ZSB3aXRoaW4gYSBzaW5nbGUgYmFzaWMgYmxvY2sgKGFsbG93aW5nIGl0IHRvIGRvIGEgc2luZ2xlIGxvY2FsIGFuYWx5c2lzCisvLyB0byByZXNvbHZlIHBoeXNpY2FsIHJlZ2lzdGVyIGxpZmV0aW1lcyBpbiBlYWNoIGJhc2ljIGJsb2NrKS4gIElmIGEgcGh5c2ljYWwKKy8vIHJlZ2lzdGVyIGlzIG5vdCByZWdpc3RlciBhbGxvY2F0YWJsZSwgaXQgaXMgbm90IHRyYWNrZWQuICBUaGlzIGlzIHVzZWZ1bCBmb3IKKy8vIHRoaW5ncyBsaWtlIHRoZSBzdGFjayBwb2ludGVyIGFuZCBjb25kaXRpb24gY29kZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTElWRVZBUklBQkxFU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9MSVZFVkFSSUFCTEVTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW5kZXhlZE1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TcGFyc2VCaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworCitjbGFzcyBMaXZlVmFyaWFibGVzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorICBMaXZlVmFyaWFibGVzKCkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSB7CisgICAgaW5pdGlhbGl6ZUxpdmVWYXJpYWJsZXNQYXNzKCpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpKTsKKyAgfQorCisgIC8vLyBWYXJJbmZvIC0gVGhpcyByZXByZXNlbnRzIHRoZSByZWdpb25zIHdoZXJlIGEgdmlydHVhbCByZWdpc3RlciBpcyBsaXZlIGluCisgIC8vLyB0aGUgcHJvZ3JhbS4gIFdlIHJlcHJlc2VudCB0aGlzIHdpdGggdGhyZWUgZGlmZmVyZW50IHBpZWNlcyBvZgorICAvLy8gaW5mb3JtYXRpb246IHRoZSBzZXQgb2YgYmxvY2tzIGluIHdoaWNoIHRoZSBpbnN0cnVjdGlvbiBpcyBsaXZlCisgIC8vLyB0aHJvdWdob3V0LCB0aGUgc2V0IG9mIGJsb2NrcyBpbiB3aGljaCB0aGUgaW5zdHJ1Y3Rpb24gaXMgYWN0dWFsbHkgdXNlZCwKKyAgLy8vIGFuZCB0aGUgc2V0IG9mIG5vbi1waGkgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIHRoZSBsYXN0IHVzZXJzIG9mIHRoZSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBJbiB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgYSB2YWx1ZSBpcyBkZWZpbmVkIGFuZCBraWxsZWQgaW4gdGhlIHNhbWUgYmxvY2ssCisgIC8vLyBUaGVyZSBpcyBvbmUga2lsbGluZyBpbnN0cnVjdGlvbiwgYW5kIEFsaXZlQmxvY2tzIGlzIGVtcHR5LgorICAvLy8KKyAgLy8vIE90aGVyd2lzZSwgdGhlIHZhbHVlIGlzIGxpdmUgb3V0IG9mIHRoZSBibG9jay4gIElmIHRoZSB2YWx1ZSBpcyBsaXZlCisgIC8vLyB0aHJvdWdob3V0IGFueSBibG9ja3MsIHRoZXNlIGJsb2NrcyBhcmUgbGlzdGVkIGluIEFsaXZlQmxvY2tzLiAgQmxvY2tzCisgIC8vLyB3aGVyZSB0aGUgbGl2ZW5lc3MgcmFuZ2UgZW5kcyBhcmUgbm90IGluY2x1ZGVkIGluIEFsaXZlQmxvY2tzLCBpbnN0ZWFkCisgIC8vLyBiZWluZyBjYXB0dXJlZCBieSB0aGUgS2lsbHMgc2V0LiAgSW4gdGhlc2UgYmxvY2tzLCB0aGUgdmFsdWUgaXMgbGl2ZSBpbnRvCisgIC8vLyB0aGUgYmxvY2sgKHVubGVzcyB0aGUgdmFsdWUgaXMgZGVmaW5lZCBhbmQga2lsbGVkIGluIHRoZSBzYW1lIGJsb2NrKSBhbmQKKyAgLy8vIGxpdmVzIHVudGlsIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uICBOb3RlIHRoYXQgdGhlcmUgY2Fubm90IGV2ZXIgYmUgYQorICAvLy8gdmFsdWUgd2hvc2UgS2lsbHMgc2V0IGNvbnRhaW5zIHR3byBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgc2FtZSBiYXNpYyBibG9jay4KKyAgLy8vCisgIC8vLyBQSEkgbm9kZXMgY29tcGxpY2F0ZSB0aGluZ3MgYSBiaXQuICBJZiBhIFBISSBub2RlIGlzIHRoZSBsYXN0IHVzZXIgb2YgYQorICAvLy8gdmFsdWUgaW4gb25lIG9mIGl0cyBwcmVkZWNlc3NvciBibG9ja3MsIGl0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtpbGxzIHNldCwKKyAgLy8vIGJ1dCBkb2VzIGluY2x1ZGUgdGhlIHByZWRlY2Vzc29yIGJsb2NrIGluIHRoZSBBbGl2ZUJsb2NrcyBzZXQgKHVubGVzcyB0aGF0CisgIC8vLyBibG9jayBhbHNvIGRlZmluZXMgdGhlIHZhbHVlKS4gIFRoaXMgbGVhZHMgdG8gdGhlIChwZXJmZWN0bHkgc2Vuc2ljYWwpCisgIC8vLyBzaXR1YXRpb24gd2hlcmUgYSB2YWx1ZSBpcyBkZWZpbmVkIGluIGEgYmxvY2ssIGFuZCB0aGUgbGFzdCB1c2UgaXMgYSBwaGkKKyAgLy8vIG5vZGUgaW4gdGhlIHN1Y2Nlc3Nvci4gIEluIHRoaXMgY2FzZSwgQWxpdmVCbG9ja3MgaXMgZW1wdHkgKHRoZSB2YWx1ZSBpcworICAvLy8gbm90IGxpdmUgYWNyb3NzIGFueSAgYmxvY2tzKSBhbmQgS2lsbHMgaXMgZW1wdHkgKHBoaSBub2RlcyBhcmUgbm90CisgIC8vLyBpbmNsdWRlZCkuIFRoaXMgaXMgc2Vuc2ljYWwgYmVjYXVzZSB0aGUgdmFsdWUgbXVzdCBiZSBsaXZlIHRvIHRoZSBlbmQgb2YKKyAgLy8vIHRoZSBibG9jaywgYnV0IGlzIG5vdCBsaXZlIGluIGFueSBzdWNjZXNzb3IgYmxvY2tzLgorICBzdHJ1Y3QgVmFySW5mbyB7CisgICAgLy8vIEFsaXZlQmxvY2tzIC0gU2V0IG9mIGJsb2NrcyBpbiB3aGljaCB0aGlzIHZhbHVlIGlzIGFsaXZlIGNvbXBsZXRlbHkKKyAgICAvLy8gdGhyb3VnaC4gIFRoaXMgaXMgYSBiaXQgc2V0IHdoaWNoIHVzZXMgdGhlIGJhc2ljIGJsb2NrIG51bWJlciBhcyBhbgorICAgIC8vLyBpbmRleC4KKyAgICAvLy8KKyAgICBTcGFyc2VCaXRWZWN0b3I8PiBBbGl2ZUJsb2NrczsKKworICAgIC8vLyBLaWxscyAtIExpc3Qgb2YgTWFjaGluZUluc3RydWN0aW9uJ3Mgd2hpY2ggYXJlIHRoZSBsYXN0IHVzZSBvZiB0aGlzCisgICAgLy8vIHZpcnR1YWwgcmVnaXN0ZXIgKGtpbGwgaXQpIGluIHRoZWlyIGJhc2ljIGJsb2NrLgorICAgIC8vLworICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVJbnN0cio+IEtpbGxzOworCisgICAgLy8vIHJlbW92ZUtpbGwgLSBEZWxldGUgYSBraWxsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAgIC8vLyBtYWNoaW5lIGluc3RydWN0aW9uLiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgd2FzIGEga2lsbAorICAgIC8vLyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaW5zdHJ1Y3Rpb24sIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIHJlbW92ZUtpbGwoTWFjaGluZUluc3RyICZNSSkgeworICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZUluc3RyICo+OjppdGVyYXRvciBJID0gZmluZChLaWxscywgJk1JKTsKKyAgICAgIGlmIChJID09IEtpbGxzLmVuZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBLaWxscy5lcmFzZShJKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vLyBmaW5kS2lsbCAtIEZpbmQgYSBraWxsIGluc3RydWN0aW9uIGluIE1CQi4gUmV0dXJuIE5VTEwgaWYgbm9uZSBpcyBmb3VuZC4KKyAgICBNYWNoaW5lSW5zdHIgKmZpbmRLaWxsKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0OworCisgICAgLy8vIGlzTGl2ZUluIC0gSXMgUmVnIGxpdmUgaW4gdG8gTUJCPyBUaGlzIG1lYW5zIHRoYXQgUmVnIGlzIGxpdmUgdGhyb3VnaAorICAgIC8vLyBNQkIsIG9yIGl0IGlzIGtpbGxlZCBpbiBNQkIuIElmIFJlZyBpcyBvbmx5IHVzZWQgYnkgUEhJIGluc3RydWN0aW9ucyBpbgorICAgIC8vLyBNQkIsIGl0IGlzIG5vdCBjb25zaWRlcmVkIGxpdmUgaW4uCisgICAgYm9vbCBpc0xpdmVJbihjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJKTsKKworICAgIHZvaWQgZHVtcCgpIGNvbnN0OworICB9OworCitwcml2YXRlOgorICAvLy8gVmlydFJlZ0luZm8gLSBUaGlzIGxpc3QgaXMgYSBtYXBwaW5nIGZyb20gdmlydHVhbCByZWdpc3RlciBudW1iZXIgdG8KKyAgLy8vIHZhcmlhYmxlIGluZm9ybWF0aW9uLgorICAvLy8KKyAgSW5kZXhlZE1hcDxWYXJJbmZvLCBWaXJ0UmVnMkluZGV4RnVuY3Rvcj4gVmlydFJlZ0luZm87CisKKyAgLy8vIFBISUpvaW5zIC0gbGlzdCBvZiB2aXJ0dWFsIHJlZ2lzdGVycyB0aGF0IGFyZSBQSEkgam9pbnMuIFRoZXNlIHJlZ2lzdGVycworICAvLy8gbWF5IGhhdmUgbXVsdGlwbGUgZGVmaW5pdGlvbnMsIGFuZCB0aGV5IHJlcXVpcmUgc3BlY2lhbCBoYW5kbGluZyB3aGVuCisgIC8vLyBidWlsZGluZyBsaXZlIGludGVydmFscy4KKyAgU3BhcnNlQml0VmVjdG9yPD4gUEhJSm9pbnM7CisKK3ByaXZhdGU6ICAgLy8gSW50ZXJtZWRpYXRlIGRhdGEgc3RydWN0dXJlcworICBNYWNoaW5lRnVuY3Rpb24gKk1GOworCisgIE1hY2hpbmVSZWdpc3RlckluZm8qIE1SSTsKKworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSTsKKworICAvLyBQaHlzUmVnSW5mbyAtIEtlZXAgdHJhY2sgb2Ygd2hpY2ggaW5zdHJ1Y3Rpb24gd2FzIHRoZSBsYXN0IGRlZiBvZiBhCisgIC8vIHBoeXNpY2FsIHJlZ2lzdGVyLiBUaGlzIGlzIGEgcHVyZWx5IGxvY2FsIHByb3BlcnR5LCBiZWNhdXNlIGFsbCBwaHlzaWNhbAorICAvLyByZWdpc3RlciByZWZlcmVuY2VzIGFyZSBwcmVzdW1lZCBkZWFkIGFjcm9zcyBiYXNpYyBibG9ja3MuCisgIHN0ZDo6dmVjdG9yPE1hY2hpbmVJbnN0ciAqPiBQaHlzUmVnRGVmOworCisgIC8vIFBoeXNSZWdJbmZvIC0gS2VlcCB0cmFjayBvZiB3aGljaCBpbnN0cnVjdGlvbiB3YXMgdGhlIGxhc3QgdXNlIG9mIGEKKyAgLy8gcGh5c2ljYWwgcmVnaXN0ZXIuIFRoaXMgaXMgYSBwdXJlbHkgbG9jYWwgcHJvcGVydHksIGJlY2F1c2UgYWxsIHBoeXNpY2FsCisgIC8vIHJlZ2lzdGVyIHJlZmVyZW5jZXMgYXJlIHByZXN1bWVkIGRlYWQgYWNyb3NzIGJhc2ljIGJsb2Nrcy4KKyAgc3RkOjp2ZWN0b3I8TWFjaGluZUluc3RyICo+IFBoeXNSZWdVc2U7CisKKyAgc3RkOjp2ZWN0b3I8U21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+PiBQSElWYXJJbmZvOworCisgIC8vIERpc3RhbmNlTWFwIC0gS2VlcCB0cmFjayB0aGUgZGlzdGFuY2Ugb2YgYSBNSSBmcm9tIHRoZSBzdGFydCBvZiB0aGUKKyAgLy8gY3VycmVudCBiYXNpYyBibG9jay4KKyAgRGVuc2VNYXA8TWFjaGluZUluc3RyKiwgdW5zaWduZWQ+IERpc3RhbmNlTWFwOworCisgIC8vLyBIYW5kbGVQaHlzUmVnS2lsbCAtIEFkZCBraWxscyBvZiBSZWcgYW5kIGl0cyBzdWItcmVnaXN0ZXJzIHRvIHRoZQorICAvLy8gdXNlcy4gUGF5IHNwZWNpYWwgYXR0ZW50aW9uIHRvIHRoZSBzdWItcmVnaXN0ZXIgdXNlcyB3aGljaCBtYXkgY29tZSBiZWxvdworICAvLy8gdGhlIGxhc3QgdXNlIG9mIHRoZSB3aG9sZSByZWdpc3Rlci4KKyAgYm9vbCBIYW5kbGVQaHlzUmVnS2lsbCh1bnNpZ25lZCBSZWcsIE1hY2hpbmVJbnN0ciAqTUkpOworCisgIC8vLyBIYW5kbGVSZWdNYXNrIC0gQ2FsbCBIYW5kbGVQaHlzUmVnS2lsbCBmb3IgYWxsIHJlZ2lzdGVycyBjbG9iYmVyZWQgYnkgTWFzay4KKyAgdm9pZCBIYW5kbGVSZWdNYXNrKGNvbnN0IE1hY2hpbmVPcGVyYW5kJik7CisKKyAgdm9pZCBIYW5kbGVQaHlzUmVnVXNlKHVuc2lnbmVkIFJlZywgTWFjaGluZUluc3RyICZNSSk7CisgIHZvaWQgSGFuZGxlUGh5c1JlZ0RlZih1bnNpZ25lZCBSZWcsIE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZEZWZzKTsKKyAgdm9pZCBVcGRhdGVQaHlzUmVnRGVmcyhNYWNoaW5lSW5zdHIgJk1JLCBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZEZWZzKTsKKworICAvLy8gRmluZExhc3RSZWZPclBhcnRSZWYgLSBSZXR1cm4gdGhlIGxhc3QgcmVmZXJlbmNlIG9yIHBhcnRpYWwgcmVmZXJlbmNlIG9mCisgIC8vLyB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLgorICBNYWNoaW5lSW5zdHIgKkZpbmRMYXN0UmVmT3JQYXJ0UmVmKHVuc2lnbmVkIFJlZyk7CisKKyAgLy8vIEZpbmRMYXN0UGFydGlhbERlZiAtIFJldHVybiB0aGUgbGFzdCBwYXJ0aWFsIGRlZiBvZiB0aGUgc3BlY2lmaWVkCisgIC8vLyByZWdpc3Rlci4gQWxzbyByZXR1cm5zIHRoZSBzdWItcmVnaXN0ZXJzIHRoYXQncmUgZGVmaW5lZCBieSB0aGUKKyAgLy8vIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHIgKkZpbmRMYXN0UGFydGlhbERlZih1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsU2V0PHVuc2lnbmVkLDQ+ICZQYXJ0RGVmUmVncyk7CisKKyAgLy8vIGFuYWx5emVQSElOb2RlcyAtIEdhdGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgUEhJIG5vZGVzIGluIGhlcmUuIEluCisgIC8vLyBwYXJ0aWN1bGFyLCB3ZSB3YW50IHRvIG1hcCB0aGUgdmFyaWFibGUgaW5mb3JtYXRpb24gb2YgYSB2aXJ0dWFsCisgIC8vLyByZWdpc3RlciB3aGljaCBpcyB1c2VkIGluIGEgUEhJIG5vZGUuIFdlIG1hcCB0aGF0IHRvIHRoZSBCQiB0aGUgdnJlZworICAvLy8gaXMgY29taW5nIGZyb20uCisgIHZvaWQgYW5hbHl6ZVBISU5vZGVzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiYgRm4pOworCisgIHZvaWQgcnVuT25JbnN0cihNYWNoaW5lSW5zdHIgJk1JLCBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZEZWZzKTsKKworICB2b2lkIHJ1bk9uQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwgdW5zaWduZWQgTnVtUmVncyk7CitwdWJsaWM6CisKKyAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSBvdmVycmlkZTsKKworICAvLy8gUmVnaXN0ZXJEZWZJc0RlYWQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIGRlZmluZXMgdGhlCisgIC8vLyBzcGVjaWZpZWQgcmVnaXN0ZXIsIGJ1dCB0aGF0IGRlZmluaXRpb24gaXMgZGVhZC4KKyAgYm9vbCBSZWdpc3RlckRlZklzRGVhZChNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBSZWcpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyAgQVBJIHRvIHVwZGF0ZSBsaXZlIHZhcmlhYmxlIGluZm9ybWF0aW9uCisKKyAgLy8vIHJlcGxhY2VLaWxsSW5zdHJ1Y3Rpb24gLSBVcGRhdGUgcmVnaXN0ZXIga2lsbCBpbmZvIGJ5IHJlcGxhY2luZyBhIGtpbGwKKyAgLy8vIGluc3RydWN0aW9uIHdpdGggYSBuZXcgb25lLgorICB2b2lkIHJlcGxhY2VLaWxsSW5zdHJ1Y3Rpb24odW5zaWduZWQgUmVnLCBNYWNoaW5lSW5zdHIgJk9sZE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICZOZXdNSSk7CisKKyAgLy8vIGFkZFZpcnR1YWxSZWdpc3RlcktpbGxlZCAtIEFkZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmFjdCB0aGF0IHRoZQorICAvLy8gc3BlY2lmaWVkIHJlZ2lzdGVyIGlzIGtpbGxlZCBhZnRlciBiZWluZyB1c2VkIGJ5IHRoZSBzcGVjaWZpZWQKKyAgLy8vIGluc3RydWN0aW9uLiBJZiBBZGRJZk5vdEZvdW5kIGlzIHRydWUsIGFkZCBhIGltcGxpY2l0IG9wZXJhbmQgaWYgaXQncworICAvLy8gbm90IGZvdW5kLgorICB2b2lkIGFkZFZpcnR1YWxSZWdpc3RlcktpbGxlZCh1bnNpZ25lZCBJbmNvbWluZ1JlZywgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBZGRJZk5vdEZvdW5kID0gZmFsc2UpIHsKKyAgICBpZiAoTUkuYWRkUmVnaXN0ZXJLaWxsZWQoSW5jb21pbmdSZWcsIFRSSSwgQWRkSWZOb3RGb3VuZCkpCisgICAgICBnZXRWYXJJbmZvKEluY29taW5nUmVnKS5LaWxscy5wdXNoX2JhY2soJk1JKTsKKyAgfQorCisgIC8vLyByZW1vdmVWaXJ0dWFsUmVnaXN0ZXJLaWxsZWQgLSBSZW1vdmUgdGhlIHNwZWNpZmllZCBraWxsIG9mIHRoZSB2aXJ0dWFsCisgIC8vLyByZWdpc3RlciBmcm9tIHRoZSBsaXZlIHZhcmlhYmxlIGluZm9ybWF0aW9uLiBSZXR1cm5zIHRydWUgaWYgdGhlCisgIC8vLyB2YXJpYWJsZSB3YXMgbWFya2VkIGFzIGtpbGxlZCBieSB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLAorICAvLy8gZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIHJlbW92ZVZpcnR1YWxSZWdpc3RlcktpbGxlZCh1bnNpZ25lZCByZWcsIE1hY2hpbmVJbnN0ciAmTUkpIHsKKyAgICBpZiAoIWdldFZhckluZm8ocmVnKS5yZW1vdmVLaWxsKE1JKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgUmVtb3ZlZCA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUkuZ2V0T3BlcmFuZChpKTsKKyAgICAgIGlmIChNTy5pc1JlZygpICYmIE1PLmlzS2lsbCgpICYmIE1PLmdldFJlZygpID09IHJlZykgeworICAgICAgICBNTy5zZXRJc0tpbGwoZmFsc2UpOworICAgICAgICBSZW1vdmVkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgYXNzZXJ0KFJlbW92ZWQgJiYgIlJlZ2lzdGVyIGlzIG5vdCB1c2VkIGJ5IHRoaXMgaW5zdHJ1Y3Rpb24hIik7CisgICAgKHZvaWQpUmVtb3ZlZDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyByZW1vdmVWaXJ0dWFsUmVnaXN0ZXJzS2lsbGVkIC0gUmVtb3ZlIGFsbCBraWxsZWQgaW5mbyBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gaW5zdHJ1Y3Rpb24uCisgIHZvaWQgcmVtb3ZlVmlydHVhbFJlZ2lzdGVyc0tpbGxlZChNYWNoaW5lSW5zdHIgJk1JKTsKKworICAvLy8gYWRkVmlydHVhbFJlZ2lzdGVyRGVhZCAtIEFkZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmFjdCB0aGF0IHRoZSBzcGVjaWZpZWQKKyAgLy8vIHJlZ2lzdGVyIGlzIGRlYWQgYWZ0ZXIgYmVpbmcgdXNlZCBieSB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLiBJZgorICAvLy8gQWRkSWZOb3RGb3VuZCBpcyB0cnVlLCBhZGQgYSBpbXBsaWNpdCBvcGVyYW5kIGlmIGl0J3Mgbm90IGZvdW5kLgorICB2b2lkIGFkZFZpcnR1YWxSZWdpc3RlckRlYWQodW5zaWduZWQgSW5jb21pbmdSZWcsIE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFkZElmTm90Rm91bmQgPSBmYWxzZSkgeworICAgIGlmIChNSS5hZGRSZWdpc3RlckRlYWQoSW5jb21pbmdSZWcsIFRSSSwgQWRkSWZOb3RGb3VuZCkpCisgICAgICBnZXRWYXJJbmZvKEluY29taW5nUmVnKS5LaWxscy5wdXNoX2JhY2soJk1JKTsKKyAgfQorCisgIC8vLyByZW1vdmVWaXJ0dWFsUmVnaXN0ZXJEZWFkIC0gUmVtb3ZlIHRoZSBzcGVjaWZpZWQga2lsbCBvZiB0aGUgdmlydHVhbAorICAvLy8gcmVnaXN0ZXIgZnJvbSB0aGUgbGl2ZSB2YXJpYWJsZSBpbmZvcm1hdGlvbi4gUmV0dXJucyB0cnVlIGlmIHRoZQorICAvLy8gdmFyaWFibGUgd2FzIG1hcmtlZCBkZWFkIGF0IHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24sIGZhbHNlCisgIC8vLyBvdGhlcndpc2UuCisgIGJvb2wgcmVtb3ZlVmlydHVhbFJlZ2lzdGVyRGVhZCh1bnNpZ25lZCByZWcsIE1hY2hpbmVJbnN0ciAmTUkpIHsKKyAgICBpZiAoIWdldFZhckluZm8ocmVnKS5yZW1vdmVLaWxsKE1JKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgUmVtb3ZlZCA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNSS5nZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gTUkuZ2V0T3BlcmFuZChpKTsKKyAgICAgIGlmIChNTy5pc1JlZygpICYmIE1PLmlzRGVmKCkgJiYgTU8uZ2V0UmVnKCkgPT0gcmVnKSB7CisgICAgICAgIE1PLnNldElzRGVhZChmYWxzZSk7CisgICAgICAgIFJlbW92ZWQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0KFJlbW92ZWQgJiYgIlJlZ2lzdGVyIGlzIG5vdCBkZWZpbmVkIGJ5IHRoaXMgaW5zdHJ1Y3Rpb24hIik7CisgICAgKHZvaWQpUmVtb3ZlZDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGUgeworICAgIFZpcnRSZWdJbmZvLmNsZWFyKCk7CisgIH0KKworICAvLy8gZ2V0VmFySW5mbyAtIFJldHVybiB0aGUgVmFySW5mbyBzdHJ1Y3R1cmUgZm9yIHRoZSBzcGVjaWZpZWQgVklSVFVBTAorICAvLy8gcmVnaXN0ZXIuCisgIFZhckluZm8gJmdldFZhckluZm8odW5zaWduZWQgUmVnSWR4KTsKKworICB2b2lkIE1hcmtWaXJ0UmVnQWxpdmVJbkJsb2NrKFZhckluZm8mIFZSSW5mbywgTWFjaGluZUJhc2ljQmxvY2sqIERlZkJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQik7CisgIHZvaWQgTWFya1ZpcnRSZWdBbGl2ZUluQmxvY2soVmFySW5mbyYgVlJJbmZvLCBNYWNoaW5lQmFzaWNCbG9jayogRGVmQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKj4gJldvcmtMaXN0KTsKKyAgdm9pZCBIYW5kbGVWaXJ0UmVnRGVmKHVuc2lnbmVkIHJlZywgTWFjaGluZUluc3RyICZNSSk7CisgIHZvaWQgSGFuZGxlVmlydFJlZ1VzZSh1bnNpZ25lZCByZWcsIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsIE1hY2hpbmVJbnN0ciAmTUkpOworCisgIGJvb2wgaXNMaXZlSW4odW5zaWduZWQgUmVnLCBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSB7CisgICAgcmV0dXJuIGdldFZhckluZm8oUmVnKS5pc0xpdmVJbihNQkIsIFJlZywgKk1SSSk7CisgIH0KKworICAvLy8gaXNMaXZlT3V0IC0gRGV0ZXJtaW5lIGlmIFJlZyBpcyBsaXZlIG91dCBmcm9tIE1CQiwgd2hlbiBub3QgY29uc2lkZXJpbmcKKyAgLy8vIFBISSBub2Rlcy4gVGhpcyBtZWFucyB0aGF0IFJlZyBpcyBlaXRoZXIga2lsbGVkIGJ5IGEgc3VjY2Vzc29yIGJsb2NrIG9yCisgIC8vLyBwYXNzZWQgdGhyb3VnaCBvbmUuCisgIGJvb2wgaXNMaXZlT3V0KHVuc2lnbmVkIFJlZywgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKyAgLy8vIGFkZE5ld0Jsb2NrIC0gQWRkIGEgbmV3IGJhc2ljIGJsb2NrIEJCIGJldHdlZW4gRG9tQkIgYW5kIFN1Y2NCQi4gQWxsCisgIC8vLyB2YXJpYWJsZXMgdGhhdCBhcmUgbGl2ZSBvdXQgb2YgRG9tQkIgYW5kIGxpdmUgaW50byBTdWNjQkIgd2lsbCBiZSBtYXJrZWQKKyAgLy8vIGFzIHBhc3NpbmcgbGl2ZSB0aHJvdWdoIEJCLiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIG1hY2hpbmUgY29kZSBpcworICAvLy8gc3RpbGwgaW4gU1NBIGZvcm0uCisgIHZvaWQgYWRkTmV3QmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpEb21CQiwKKyAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqU3VjY0JCKTsKKworICAvLy8gaXNQSElKb2luIC0gUmV0dXJuIHRydWUgaWYgUmVnIGlzIGEgcGhpIGpvaW4gcmVnaXN0ZXIuCisgIGJvb2wgaXNQSElKb2luKHVuc2lnbmVkIFJlZykgeyByZXR1cm4gUEhJSm9pbnMudGVzdChSZWcpOyB9CisKKyAgLy8vIHNldFBISUpvaW4gLSBNYXJrIFJlZyBhcyBhIHBoaSBqb2luIHJlZ2lzdGVyLgorICB2b2lkIHNldFBISUpvaW4odW5zaWduZWQgUmVnKSB7IFBISUpvaW5zLnNldChSZWcpOyB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Mb29wVHJhdmVyc2FsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTG9vcFRyYXZlcnNhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTZmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTG9vcFRyYXZlcnNhbC5oCkBAIC0wLDAgKzEsMTE2IEBACisvLz09LS0tLS0tIGxsdm0vQ29kZUdlbi9Mb29wVHJhdmVyc2FsLmggLSBMb29wIFRyYXZlcnNhbCAtKi0gQysrIC0qLS0tLS0tLS0tPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZSBMb29wIFRyYXZlcnNhbCBsb2dpYy4KKy8vLworLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGJhc2ljIGJsb2NrcyB0cmF2ZXJzYWwgb3JkZXIgdXNlZCBieSBwYXNzZXMgbGlrZQorLy8vIFJlYWNoaW5nRGVmQW5hbHlzaXMgYW5kIEV4ZWN1dGlvbkRvbWFpbkZpeC4KKy8vLyBJdCBpZGVudGlmaWVzIGJhc2ljIGJsb2NrcyB0aGF0IGFyZSBwYXJ0IG9mIGxvb3BzIGFuZCBzaG91bGQgdG8gYmUgdmlzaXRlZAorLy8vIHR3aWNlIGFuZCByZXR1cm5zIGVmZmljaWVudCB0cmF2ZXJzYWwgb3JkZXIgZm9yIGFsbCB0aGUgYmxvY2tzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0xPT1BUUkFWRVJTQUxfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTE9PUFRSQVZFUlNBTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworCisvLy8gVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgYmFzaWMgYmxvY2tzIHRyYXZlcnNhbCBvcmRlciB1c2VkIGJ5IHBhc3NlcyBsaWtlCisvLy8gUmVhY2hpbmdEZWZBbmFseXNpcyBhbmQgRXhlY3V0aW9uRG9tYWluRml4LgorLy8vIEl0IGlkZW50aWZpZXMgYmFzaWMgYmxvY2tzIHRoYXQgYXJlIHBhcnQgb2YgbG9vcHMgYW5kIHNob3VsZCB0byBiZSB2aXNpdGVkCisvLy8gdHdpY2UgYW5kIHJldHVybnMgZWZmaWNpZW50IHRyYXZlcnNhbCBvcmRlciBmb3IgYWxsIHRoZSBibG9ja3MuCisvLy8KKy8vLyBXZSB3YW50IHRvIHZpc2l0IGV2ZXJ5IGluc3RydWN0aW9uIGluIGV2ZXJ5IGJhc2ljIGJsb2NrIGluIG9yZGVyIHRvIHVwZGF0ZQorLy8vIGl0J3MgZXhlY3V0aW9uIGRvbWFpbiBvciBjb2xsZWN0IGNsZWFyYW5jZSBpbmZvcm1hdGlvbi4gSG93ZXZlciwgZm9yIHRoZQorLy8vIGNsZWFyYW5jZSBjYWxjdWxhdGlvbiwgd2UgbmVlZCB0byBrbm93IGNsZWFyYW5jZXMgZnJvbSBhbGwgcHJlZGVjZXNzb3JzCisvLy8gKGluY2x1ZGluZyBhbnkgYmFja2VkZ2VzKSwgdGhlcmZvcmUgd2UgbmVlZCB0byB2aXNpdCBzb21lIGJsb2NrcyB0d2ljZS4KKy8vLyBBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGxvb3AuCisvLy8KKy8vLworLy8vICAgIFBIIC0+IEEgLT4gQiAoeG1tPFVuZGVmPiAtPiB4bW08RGVmPikgLT4gQyAtPiBEIC0+IEVYSVQKKy8vLyAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vLyAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vLworLy8vIFRoZSBpdGVyYXRpb24gb3JkZXIgdGhpcyBwYXNzIHdpbGwgcmV0dXJuIGlzIGFzIGZvbGxvd3M6CisvLy8gT3B0aW1pemVkOiBQSCBBIEIgQyBBJyBCJyBDJyBECisvLy8KKy8vLyBUaGUgYmFzaWMgYmxvY2sgb3JkZXIgaXMgY29uc3RydWN0ZWQgYXMgZm9sbG93czoKKy8vLyBPbmNlIHdlIGZpbmlzaCBwcm9jZXNzaW5nIHNvbWUgYmxvY2ssIHdlIHVwZGF0ZSB0aGUgY291bnRlcnMgaW4gTUJCSW5mb3MKKy8vLyBhbmQgcmUtcHJvY2VzcyBhbnkgc3VjY2Vzc29ycyB0aGF0IGFyZSBub3cgJ2RvbmUnLgorLy8vIFdlIGNhbGwgYSBibG9jayB0aGF0IGlzIHJlYWR5IGZvciBpdHMgZmluYWwgcm91bmQgb2YgcHJvY2Vzc2luZyBgZG9uZWAKKy8vLyAoaXNCbG9ja0RvbmUpLCBlLmcuIHdoZW4gYWxsIHByZWRlY2Vzc29yIGluZm9ybWF0aW9uIGlzIGtub3duLgorLy8vCisvLy8gTm90ZSB0aGF0IGEgbmFpdmUgdHJhdmVyc2FsIG9yZGVyIHdvdWxkIGJlIHRvIGRvIHR3byBjb21wbGV0ZSBwYXNzZXMgb3ZlcgorLy8vIGFsbCBiYXNpYyBibG9ja3MvaW5zdHJ1Y3Rpb25zLCB0aGUgZmlyc3QgZm9yIHJlY29yZGluZyBjbGVhcmFuY2VzLCB0aGUKKy8vLyBzZWNvbmQgZm9yIHVwZGF0aW5nIGNsZWFyYW5jZSBiYXNlZCBvbiBiYWNrZWRnZXMuCisvLy8gSG93ZXZlciwgZm9yIGZ1bmN0aW9ucyB3aXRob3V0IGJhY2tlZGdlcywgb3IgZnVuY3Rpb25zIHdpdGggYSBsb3Qgb2YKKy8vLyBzdHJhaWdodC1saW5lIGNvZGUsIGFuZCBhIHNtYWxsIGxvb3AsIHRoYXQgd291bGQgYmUgYSBsb3Qgb2YgdW5uZWNlc3NhcnkKKy8vLyB3b3JrIChzaW5jZSBvbmx5IHRoZSBCQnMgdGhhdCBhcmUgcGFydCBvZiB0aGUgbG9vcCByZXF1aXJlIHR3byBwYXNzZXMpLgorLy8vCisvLy8gRS5nLiwgdGhlIG5haXZlIGl0ZXJhdGlvbiBvcmRlciBmb3IgdGhlIGFib3ZlIGV4bXBsZSBpcyBhcyBmb2xsb3dzOgorLy8vIE5haXZlOiBQSCBBIEIgQyBEIEEnIEInIEMnIEQnCisvLy8KKy8vLyBJbiB0aGUgb3B0aW1pemVkIGFwcHJvYWNoIHdlIGF2b2lkIHByb2Nlc3NpbmcgRCB0d2ljZSwgYmVjYXVzZSB3ZQorLy8vIGNhbiBlbnRpcmVseSBwcm9jZXNzIHRoZSBwcmVkZWNlc3NvcnMgYmVmb3JlIGdldHRpbmcgdG8gRC4KK2NsYXNzIExvb3BUcmF2ZXJzYWwgeworcHJpdmF0ZToKKyAgc3RydWN0IE1CQkluZm8geworICAgIC8vLyBXaGV0aGVyIHdlIGhhdmUgZ290dGVuIHRvIHRoaXMgYmxvY2sgaW4gcHJpbWFyeSBwcm9jZXNzaW5nIHlldC4KKyAgICBib29sIFByaW1hcnlDb21wbGV0ZWQgPSBmYWxzZTsKKworICAgIC8vLyBUaGUgbnVtYmVyIG9mIHByZWRlY2Vzc29ycyBmb3Igd2hpY2ggcHJpbWFyeSBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQKKyAgICB1bnNpZ25lZCBJbmNvbWluZ1Byb2Nlc3NlZCA9IDA7CisKKyAgICAvLy8gVGhlIHZhbHVlIG9mIGBJbmNvbWluZ1Byb2Nlc3NlZGAgYXQgdGhlIHN0YXJ0IG9mIHByaW1hcnkgcHJvY2Vzc2luZworICAgIHVuc2lnbmVkIFByaW1hcnlJbmNvbWluZyA9IDA7CisKKyAgICAvLy8gVGhlIG51bWJlciBvZiBwcmVkZWNlc3NvcnMgZm9yIHdoaWNoIGFsbCBwcm9jZXNzaW5nIHN0ZXBzIGFyZSBkb25lLgorICAgIHVuc2lnbmVkIEluY29taW5nQ29tcGxldGVkID0gMDsKKworICAgIE1CQkluZm8oKSA9IGRlZmF1bHQ7CisgIH07CisgIHVzaW5nIE1CQkluZm9NYXAgPSBTbWFsbFZlY3RvcjxNQkJJbmZvLCA0PjsKKyAgLy8vIEhlbHBzIGtlZXAgdHJhY2sgaWYgd2UgcHJvY2Nlc3NlZCB0aGlzIGJsb2NrIGFuZCBhbGwgaXRzIHByZWRlY2Vzc29ycy4KKyAgTUJCSW5mb01hcCBNQkJJbmZvczsKKworcHVibGljOgorICBzdHJ1Y3QgVHJhdmVyc2VkTUJCSW5mbyB7CisgICAgLy8vIFRoZSBiYXNpYyBibG9jay4KKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gbnVsbHB0cjsKKworICAgIC8vLyBUcnVlIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgcHJvY2VzcyB0aGUgYmFzaWMgYmxvY2suCisgICAgYm9vbCBQcmltYXJ5UGFzcyA9IHRydWU7CisKKyAgICAvLy8gVHJ1ZSBpZiB0aGUgYmxvY2sgdGhhdCBpcyByZWFkeSBmb3IgaXRzIGZpbmFsIHJvdW5kIG9mIHByb2Nlc3NpbmcuCisgICAgYm9vbCBJc0RvbmUgPSB0cnVlOworCisgICAgVHJhdmVyc2VkTUJCSW5mbyhNYWNoaW5lQmFzaWNCbG9jayAqQkIgPSBudWxscHRyLCBib29sIFByaW1hcnkgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBEb25lID0gdHJ1ZSkKKyAgICAgICAgOiBNQkIoQkIpLCBQcmltYXJ5UGFzcyhQcmltYXJ5KSwgSXNEb25lKERvbmUpIHt9CisgIH07CisgIExvb3BUcmF2ZXJzYWwoKSB7fQorCisgIC8vLyBcYnJpZWYgSWRlbnRpZmllcyBiYXNpYyBibG9ja3MgdGhhdCBhcmUgcGFydCBvZiBsb29wcyBhbmQgc2hvdWxkIHRvIGJlCisgIC8vLyAgdmlzaXRlZCB0d2ljZSBhbmQgcmV0dXJucyBlZmZpY2llbnQgdHJhdmVyc2FsIG9yZGVyIGZvciBhbGwgdGhlIGJsb2Nrcy4KKyAgdHlwZWRlZiBTbWFsbFZlY3RvcjxUcmF2ZXJzZWRNQkJJbmZvLCA0PiBUcmF2ZXJzYWxPcmRlcjsKKyAgVHJhdmVyc2FsT3JkZXIgdHJhdmVyc2UoTWFjaGluZUZ1bmN0aW9uICZNRik7CisKK3ByaXZhdGU6CisgIC8vLyBSZXR1cmVucyB0cnVlIGlmIHRoZSBibG9jayBpcyByZWFkeSBmb3IgaXRzIGZpbmFsIHJvdW5kIG9mIHByb2Nlc3NpbmcuCisgIGJvb2wgaXNCbG9ja0RvbmUoTWFjaGluZUJhc2ljQmxvY2sgKk1CQik7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTE9PUFRSQVZFUlNBTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTG93TGV2ZWxUeXBlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTG93TGV2ZWxUeXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNjNWM5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Mb3dMZXZlbFR5cGUuaApAQCAtMCwwICsxLDMyIEBACisvLz09IGxsdm0vQ29kZUdlbi9Mb3dMZXZlbFR5cGUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBJbXBsZW1lbnQgYSBsb3ctbGV2ZWwgdHlwZSBzdWl0YWJsZSBmb3IgTWFjaGluZUluc3RyIGxldmVsIGluc3RydWN0aW9uCisvLy8gc2VsZWN0aW9uLgorLy8vCisvLy8gVGhpcyBwcm92aWRlcyB0aGUgQ29kZUdlbiBhc3BlY3RzIG9mIExvd0xldmVsVHlwZSwgc3VjaCBhcyBUeXBlIGNvbnZlcnNpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTE9XTEVWRUxUWVBFX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0xPV0xFVkVMVFlQRV9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTG93TGV2ZWxUeXBlSW1wbC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIERhdGFMYXlvdXQ7CitjbGFzcyBUeXBlOworCisvLy8gQ29uc3RydWN0IGEgbG93LWxldmVsIHR5cGUgYmFzZWQgb24gYW4gTExWTSB0eXBlLgorTExUIGdldExMVEZvclR5cGUoVHlwZSAmVHksIGNvbnN0IERhdGFMYXlvdXQgJkRMKTsKKworfQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0xPV0xFVkVMVFlQRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTUlSUGFyc2VyL01JUlBhcnNlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01JUlBhcnNlci9NSVJQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjMxYThjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01JUlBhcnNlci9NSVJQYXJzZXIuaApAQCAtMCwwICsxLDgxIEBACisvLz09PS0gTUlSUGFyc2VyLmggLSBNSVIgc2VyaWFsaXphdGlvbiBmb3JtYXQgcGFyc2VyIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgTUlSIHNlcmlhbGl6YXRpb24gbGlicmFyeSBpcyBjdXJyZW50bHkgYSB3b3JrIGluIHByb2dyZXNzLiBJdCBjYW4ndAorLy8gc2VyaWFsaXplIG1hY2hpbmUgZnVuY3Rpb25zIGF0IHRoaXMgdGltZS4KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGZ1bmN0aW9ucyB0aGF0IHBhcnNlIHRoZSBNSVIgc2VyaWFsaXphdGlvbiBmb3JtYXQKKy8vIGZpbGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01JUlBBUlNFUl9NSVJQQVJTRVJfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUlSUEFSU0VSX01JUlBBUlNFUl9ICisKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgTUlSUGFyc2VySW1wbDsKK2NsYXNzIE1hY2hpbmVNb2R1bGVJbmZvOworY2xhc3MgU01EaWFnbm9zdGljOworCisvLy8gVGhpcyBjbGFzcyBpbml0aWFsaXplcyBtYWNoaW5lIGZ1bmN0aW9ucyBieSBhcHBseWluZyB0aGUgc3RhdGUgbG9hZGVkIGZyb20KKy8vLyBhIE1JUiBmaWxlLgorY2xhc3MgTUlSUGFyc2VyIHsKKyAgc3RkOjp1bmlxdWVfcHRyPE1JUlBhcnNlckltcGw+IEltcGw7CisKK3B1YmxpYzoKKyAgTUlSUGFyc2VyKHN0ZDo6dW5pcXVlX3B0cjxNSVJQYXJzZXJJbXBsPiBJbXBsKTsKKyAgTUlSUGFyc2VyKGNvbnN0IE1JUlBhcnNlciAmKSA9IGRlbGV0ZTsKKyAgfk1JUlBhcnNlcigpOworCisgIC8vLyBQYXJzZXMgdGhlIG9wdGlvbmFsIExMVk0gSVIgbW9kdWxlIGluIHRoZSBNSVIgZmlsZS4KKyAgLy8vCisgIC8vLyBBIG5ldywgZW1wdHkgbW9kdWxlIGlzIGNyZWF0ZWQgaWYgdGhlIExMVk0gSVIgaXNuJ3QgcHJlc2VudC4KKyAgLy8vIFxyZXR1cm5zIG51bGxwdHIgaWYgYSBwYXJzaW5nIGVycm9yIG9jY3VycmVkLgorICBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBwYXJzZUlSTW9kdWxlKCk7CisKKyAgLy8vIFxicmllZiBQYXJzZXMgTWFjaGluZUZ1bmN0aW9ucyBpbiB0aGUgTUlSIGZpbGUgYW5kIGFkZCB0aGVtIHRvIHRoZSBnaXZlbgorICAvLy8gTWFjaGluZU1vZHVsZUluZm8gXHAgTU1JLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgIGJvb2wgcGFyc2VNYWNoaW5lRnVuY3Rpb25zKE1vZHVsZSAmTSwgTWFjaGluZU1vZHVsZUluZm8gJk1NSSk7Cit9OworCisvLy8gVGhpcyBmdW5jdGlvbiBpcyB0aGUgbWFpbiBpbnRlcmZhY2UgdG8gdGhlIE1JUiBzZXJpYWxpemF0aW9uIGZvcm1hdCBwYXJzZXIuCisvLy8KKy8vLyBJdCByZWFkcyBpbiBhIE1JUiBmaWxlIGFuZCByZXR1cm5zIGEgTUlSIHBhcnNlciB0aGF0IGNhbiBwYXJzZSB0aGUgZW1iZWRkZWQKKy8vLyBMTFZNIElSIG1vZHVsZSBhbmQgaW5pdGlhbGl6ZSB0aGUgbWFjaGluZSBmdW5jdGlvbnMgYnkgcGFyc2luZyB0aGUgbWFjaGluZQorLy8vIGZ1bmN0aW9uJ3Mgc3RhdGUuCisvLy8KKy8vLyBccGFyYW0gRmlsZW5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBwYXJzZS4KKy8vLyBccGFyYW0gRXJyb3IgLSBFcnJvciByZXN1bHQgaW5mby4KKy8vLyBccGFyYW0gQ29udGV4dCAtIENvbnRleHQgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciB0aGUgcGFyc2VkIExMVk0gSVIgbW9kdWxlLgorc3RkOjp1bmlxdWVfcHRyPE1JUlBhcnNlcj4gY3JlYXRlTUlSUGFyc2VyRnJvbUZpbGUoU3RyaW5nUmVmIEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01EaWFnbm9zdGljICZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDb250ZXh0KTsKKworLy8vIFRoaXMgZnVuY3Rpb24gaXMgYW5vdGhlciBpbnRlcmZhY2UgdG8gdGhlIE1JUiBzZXJpYWxpemF0aW9uIGZvcm1hdCBwYXJzZXIuCisvLy8KKy8vLyBJdCByZXR1cm5zIGEgTUlSIHBhcnNlciB0aGF0IHdvcmtzIHdpdGggdGhlIGdpdmVuIG1lbW9yeSBidWZmZXIgYW5kIHRoYXQgY2FuCisvLy8gcGFyc2UgdGhlIGVtYmVkZGVkIExMVk0gSVIgbW9kdWxlIGFuZCBpbml0aWFsaXplIHRoZSBtYWNoaW5lIGZ1bmN0aW9ucyBieQorLy8vIHBhcnNpbmcgdGhlIG1hY2hpbmUgZnVuY3Rpb24ncyBzdGF0ZS4KKy8vLworLy8vIFxwYXJhbSBDb250ZW50cyAtIFRoZSBNZW1vcnlCdWZmZXIgY29udGFpbmluZyB0aGUgbWFjaGluZSBsZXZlbCBJUi4KKy8vLyBccGFyYW0gQ29udGV4dCAtIENvbnRleHQgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciB0aGUgcGFyc2VkIExMVk0gSVIgbW9kdWxlLgorc3RkOjp1bmlxdWVfcHRyPE1JUlBhcnNlcj4KK2NyZWF0ZU1JUlBhcnNlcihzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBDb250ZW50cywgTExWTUNvbnRleHQgJkNvbnRleHQpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX01JUlBBUlNFUl9NSVJQQVJTRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01JUlByaW50ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NSVJQcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczYWRjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NSVJQcmludGVyLmgKQEAgLTAsMCArMSw0NiBAQAorLy89PT0tIE1JUlByaW50ZXIuaCAtIE1JUiBzZXJpYWxpemF0aW9uIGZvcm1hdCBwcmludGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGZ1bmN0aW9ucyB0aGF0IHByaW50IG91dCB0aGUgTExWTSBJUiBhbmQgdGhlIG1hY2hpbmUKKy8vIGZ1bmN0aW9ucyB1c2luZyB0aGUgTUlSIHNlcmlhbGl6YXRpb24gZm9ybWF0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9MSUJfQ09ERUdFTl9NSVJQUklOVEVSX0gKKyNkZWZpbmUgTExWTV9MSUJfQ09ERUdFTl9NSVJQUklOVEVSX0gKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIHJhd19vc3RyZWFtOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKKworLy8vIFByaW50IExMVk0gSVIgdXNpbmcgdGhlIE1JUiBzZXJpYWxpemF0aW9uIGZvcm1hdCB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KK3ZvaWQgcHJpbnRNSVIocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUgJk0pOworCisvLy8gUHJpbnQgYSBtYWNoaW5lIGZ1bmN0aW9uIHVzaW5nIHRoZSBNSVIgc2VyaWFsaXphdGlvbiBmb3JtYXQgdG8gdGhlIGdpdmVuCisvLy8gb3V0cHV0IHN0cmVhbS4KK3ZvaWQgcHJpbnRNSVIocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworLy8vIERldGVybWluZSBhIHBvc3NpYmxlIGxpc3Qgb2Ygc3VjY2Vzc29ycyBvZiBhIGJhc2ljIGJsb2NrIGJhc2VkIG9uIHRoZQorLy8vIGJhc2ljIGJsb2NrIG1hY2hpbmUgb3BlcmFuZCBiZWluZyB1c2VkIGluc2lkZSB0aGUgYmxvY2suIFRoaXMgc2hvdWxkIGdpdmUKKy8vLyB5b3UgdGhlIGNvcnJlY3QgbGlzdCBvZiBzdWNjZXNzb3IgYmxvY2tzIGluIG1vc3QgY2FzZXMgZXhjZXB0IGZvciB0aGluZ3MKKy8vLyBsaWtlIGp1bXAgdGFibGVzIHdoZXJlIHRoZSBiYXNpYyBibG9jayByZWZlcmVuY2VzIGNhbid0IGVhc2lseSBiZSBmb3VuZC4KKy8vLyBUaGUgTUlSUFJpbnRlciB3aWxsIHNraXAgcHJpbnRpbmcgc3VjY2Vzc29ycyBpZiB0aGV5IG1hdGNoIHRoZSByZXN1bHQgb2YKKy8vLyB0aGlzIGZ1bmNpdG9uIGFuZCB0aGUgcGFyc2VyIHdpbGwgdXNlIHRoaXMgZnVuY3Rpb24gdG8gY29uc3RydWN0IGEgbGlzdCBpZgorLy8vIGl0IGlzIG1pc3NpbmcuCit2b2lkIGd1ZXNzU3VjY2Vzc29ycyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVCYXNpY0Jsb2NrKj4gJlN1Y2Nlc3NvcnMsCisgICAgICAgICAgICAgICAgICAgICBib29sICZJc0ZhbGx0aHJvdWdoKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTUlSWWFtbE1hcHBpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NSVJZYW1sTWFwcGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NWY5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTUlSWWFtbE1hcHBpbmcuaApAQCAtMCwwICsxLDUyMyBAQAorLy89PT0tIE1JUllBTUxNYXBwaW5nLmggLSBEZXNjcmliZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiBNSVIgYW5kIFlBTUwgLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgbWFwcGluZyBiZXR3ZWVuIHZhcmlvdXMgTUlSIGRhdGEgc3RydWN0dXJlcyBhbmQKKy8vIHRoZWlyIGNvcnJlc3BvbmRpbmcgWUFNTCByZXByZXNlbnRhdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NSVJZQU1MTUFQUElOR19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NSVJZQU1MTUFQUElOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSnVtcFRhYmxlSW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TTUxvYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHlhbWwgeworCisvLy8gQSB3cmFwcGVyIGFyb3VuZCBzdGQ6OnN0cmluZyB3aGljaCBjb250YWlucyBhIHNvdXJjZSByYW5nZSB0aGF0J3MgYmVpbmcKKy8vLyBzZXQgZHVyaW5nIHBhcnNpbmcuCitzdHJ1Y3QgU3RyaW5nVmFsdWUgeworICBzdGQ6OnN0cmluZyBWYWx1ZTsKKyAgU01SYW5nZSBTb3VyY2VSYW5nZTsKKworICBTdHJpbmdWYWx1ZSgpID0gZGVmYXVsdDsKKyAgU3RyaW5nVmFsdWUoc3RkOjpzdHJpbmcgVmFsdWUpIDogVmFsdWUoc3RkOjptb3ZlKFZhbHVlKSkge30KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgU3RyaW5nVmFsdWUgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlID09IE90aGVyLlZhbHVlOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyVHJhaXRzPFN0cmluZ1ZhbHVlPiB7CisgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCBTdHJpbmdWYWx1ZSAmUywgdm9pZCAqLCByYXdfb3N0cmVhbSAmT1MpIHsKKyAgICBPUyA8PCBTLlZhbHVlOworICB9CisKKyAgc3RhdGljIFN0cmluZ1JlZiBpbnB1dChTdHJpbmdSZWYgU2NhbGFyLCB2b2lkICpDdHgsIFN0cmluZ1ZhbHVlICZTKSB7CisgICAgUy5WYWx1ZSA9IFNjYWxhci5zdHIoKTsKKyAgICBpZiAoY29uc3QgYXV0byAqTm9kZSA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHlhbWw6OklucHV0ICo+KEN0eCktPmdldEN1cnJlbnROb2RlKCkpCisgICAgICBTLlNvdXJjZVJhbmdlID0gTm9kZS0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZiBTKSB7IHJldHVybiBuZWVkc1F1b3RlcyhTKTsgfQorfTsKKworc3RydWN0IEZsb3dTdHJpbmdWYWx1ZSA6IFN0cmluZ1ZhbHVlIHsKKyAgRmxvd1N0cmluZ1ZhbHVlKCkgPSBkZWZhdWx0OworICBGbG93U3RyaW5nVmFsdWUoc3RkOjpzdHJpbmcgVmFsdWUpIDogU3RyaW5nVmFsdWUoc3RkOjptb3ZlKFZhbHVlKSkge30KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJUcmFpdHM8Rmxvd1N0cmluZ1ZhbHVlPiB7CisgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCBGbG93U3RyaW5nVmFsdWUgJlMsIHZvaWQgKiwgcmF3X29zdHJlYW0gJk9TKSB7CisgICAgcmV0dXJuIFNjYWxhclRyYWl0czxTdHJpbmdWYWx1ZT46Om91dHB1dChTLCBudWxscHRyLCBPUyk7CisgIH0KKworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiBTY2FsYXIsIHZvaWQgKkN0eCwgRmxvd1N0cmluZ1ZhbHVlICZTKSB7CisgICAgcmV0dXJuIFNjYWxhclRyYWl0czxTdHJpbmdWYWx1ZT46OmlucHV0KFNjYWxhciwgQ3R4LCBTKTsKKyAgfQorCisgIHN0YXRpYyBRdW90aW5nVHlwZSBtdXN0UXVvdGUoU3RyaW5nUmVmIFMpIHsgcmV0dXJuIG5lZWRzUXVvdGVzKFMpOyB9Cit9OworCitzdHJ1Y3QgQmxvY2tTdHJpbmdWYWx1ZSB7CisgIFN0cmluZ1ZhbHVlIFZhbHVlOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBCbG9ja1N0cmluZ1ZhbHVlICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBWYWx1ZSA9PSBPdGhlci5WYWx1ZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEJsb2NrU2NhbGFyVHJhaXRzPEJsb2NrU3RyaW5nVmFsdWU+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IEJsb2NrU3RyaW5nVmFsdWUgJlMsIHZvaWQgKkN0eCwgcmF3X29zdHJlYW0gJk9TKSB7CisgICAgcmV0dXJuIFNjYWxhclRyYWl0czxTdHJpbmdWYWx1ZT46Om91dHB1dChTLlZhbHVlLCBDdHgsIE9TKTsKKyAgfQorCisgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmIFNjYWxhciwgdm9pZCAqQ3R4LCBCbG9ja1N0cmluZ1ZhbHVlICZTKSB7CisgICAgcmV0dXJuIFNjYWxhclRyYWl0czxTdHJpbmdWYWx1ZT46OmlucHV0KFNjYWxhciwgQ3R4LCBTLlZhbHVlKTsKKyAgfQorfTsKKworLy8vIEEgd3JhcHBlciBhcm91bmQgdW5zaWduZWQgd2hpY2ggY29udGFpbnMgYSBzb3VyY2UgcmFuZ2UgdGhhdCdzIGJlaW5nIHNldAorLy8vIGR1cmluZyBwYXJzaW5nLgorc3RydWN0IFVuc2lnbmVkVmFsdWUgeworICB1bnNpZ25lZCBWYWx1ZSA9IDA7CisgIFNNUmFuZ2UgU291cmNlUmFuZ2U7CisKKyAgVW5zaWduZWRWYWx1ZSgpID0gZGVmYXVsdDsKKyAgVW5zaWduZWRWYWx1ZSh1bnNpZ25lZCBWYWx1ZSkgOiBWYWx1ZShWYWx1ZSkge30KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVW5zaWduZWRWYWx1ZSAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWUgPT0gT3RoZXIuVmFsdWU7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJUcmFpdHM8VW5zaWduZWRWYWx1ZT4geworICBzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgVW5zaWduZWRWYWx1ZSAmVmFsdWUsIHZvaWQgKkN0eCwgcmF3X29zdHJlYW0gJk9TKSB7CisgICAgcmV0dXJuIFNjYWxhclRyYWl0czx1bnNpZ25lZD46Om91dHB1dChWYWx1ZS5WYWx1ZSwgQ3R4LCBPUyk7CisgIH0KKworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiBTY2FsYXIsIHZvaWQgKkN0eCwgVW5zaWduZWRWYWx1ZSAmVmFsdWUpIHsKKyAgICBpZiAoY29uc3QgYXV0byAqTm9kZSA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHlhbWw6OklucHV0ICo+KEN0eCktPmdldEN1cnJlbnROb2RlKCkpCisgICAgICBWYWx1ZS5Tb3VyY2VSYW5nZSA9IE5vZGUtPmdldFNvdXJjZVJhbmdlKCk7CisgICAgcmV0dXJuIFNjYWxhclRyYWl0czx1bnNpZ25lZD46OmlucHV0KFNjYWxhciwgQ3R4LCBWYWx1ZS5WYWx1ZSk7CisgIH0KKworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZiBTY2FsYXIpIHsKKyAgICByZXR1cm4gU2NhbGFyVHJhaXRzPHVuc2lnbmVkPjo6bXVzdFF1b3RlKFNjYWxhcik7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxNYWNoaW5lSnVtcFRhYmxlSW5mbzo6SlRFbnRyeUtpbmQ+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oeWFtbDo6SU8gJklPLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6SlRFbnRyeUtpbmQgJkVudHJ5S2luZCkgeworICAgIElPLmVudW1DYXNlKEVudHJ5S2luZCwgImJsb2NrLWFkZHJlc3MiLAorICAgICAgICAgICAgICAgIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpFS19CbG9ja0FkZHJlc3MpOworICAgIElPLmVudW1DYXNlKEVudHJ5S2luZCwgImdwLXJlbDY0LWJsb2NrLWFkZHJlc3MiLAorICAgICAgICAgICAgICAgIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpFS19HUFJlbDY0QmxvY2tBZGRyZXNzKTsKKyAgICBJTy5lbnVtQ2FzZShFbnRyeUtpbmQsICJncC1yZWwzMi1ibG9jay1hZGRyZXNzIiwKKyAgICAgICAgICAgICAgICBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6RUtfR1BSZWwzMkJsb2NrQWRkcmVzcyk7CisgICAgSU8uZW51bUNhc2UoRW50cnlLaW5kLCAibGFiZWwtZGlmZmVyZW5jZTMyIiwKKyAgICAgICAgICAgICAgICBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6RUtfTGFiZWxEaWZmZXJlbmNlMzIpOworICAgIElPLmVudW1DYXNlKEVudHJ5S2luZCwgImlubGluZSIsIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpFS19JbmxpbmUpOworICAgIElPLmVudW1DYXNlKEVudHJ5S2luZCwgImN1c3RvbTMyIiwgTWFjaGluZUp1bXBUYWJsZUluZm86OkVLX0N1c3RvbTMyKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHlhbWwKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6eWFtbDo6U3RyaW5nVmFsdWUpCitMTFZNX1lBTUxfSVNfRkxPV19TRVFVRU5DRV9WRUNUT1IobGx2bTo6eWFtbDo6Rmxvd1N0cmluZ1ZhbHVlKQorTExWTV9ZQU1MX0lTX0ZMT1dfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OnlhbWw6OlVuc2lnbmVkVmFsdWUpCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSB5YW1sIHsKKworc3RydWN0IFZpcnR1YWxSZWdpc3RlckRlZmluaXRpb24geworICBVbnNpZ25lZFZhbHVlIElEOworICBTdHJpbmdWYWx1ZSBDbGFzczsKKyAgU3RyaW5nVmFsdWUgUHJlZmVycmVkUmVnaXN0ZXI7CisKKyAgLy8gVE9ETzogU2VyaWFsaXplIHRoZSB0YXJnZXQgc3BlY2lmaWMgcmVnaXN0ZXIgaGludHMuCisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZpcnR1YWxSZWdpc3RlckRlZmluaXRpb24gJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIElEID09IE90aGVyLklEICYmIENsYXNzID09IE90aGVyLkNsYXNzICYmCisgICAgICAgICAgIFByZWZlcnJlZFJlZ2lzdGVyID09IE90aGVyLlByZWZlcnJlZFJlZ2lzdGVyOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxWaXJ0dWFsUmVnaXN0ZXJEZWZpbml0aW9uPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJllhbWxJTywgVmlydHVhbFJlZ2lzdGVyRGVmaW5pdGlvbiAmUmVnKSB7CisgICAgWWFtbElPLm1hcFJlcXVpcmVkKCJpZCIsIFJlZy5JRCk7CisgICAgWWFtbElPLm1hcFJlcXVpcmVkKCJjbGFzcyIsIFJlZy5DbGFzcyk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJwcmVmZXJyZWQtcmVnaXN0ZXIiLCBSZWcuUHJlZmVycmVkUmVnaXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ZhbHVlKCkpOyAvLyBEb24ndCBwcmludCBvdXQgd2hlbiBpdCdzIGVtcHR5LgorICB9CisKKyAgc3RhdGljIGNvbnN0IGJvb2wgZmxvdyA9IHRydWU7Cit9OworCitzdHJ1Y3QgTWFjaGluZUZ1bmN0aW9uTGl2ZUluIHsKKyAgU3RyaW5nVmFsdWUgUmVnaXN0ZXI7CisgIFN0cmluZ1ZhbHVlIFZpcnR1YWxSZWdpc3RlcjsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFjaGluZUZ1bmN0aW9uTGl2ZUluICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBSZWdpc3RlciA9PSBPdGhlci5SZWdpc3RlciAmJgorICAgICAgICAgICBWaXJ0dWFsUmVnaXN0ZXIgPT0gT3RoZXIuVmlydHVhbFJlZ2lzdGVyOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoaW5lRnVuY3Rpb25MaXZlSW4+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmWWFtbElPLCBNYWNoaW5lRnVuY3Rpb25MaXZlSW4gJkxpdmVJbikgeworICAgIFlhbWxJTy5tYXBSZXF1aXJlZCgicmVnIiwgTGl2ZUluLlJlZ2lzdGVyKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoCisgICAgICAgICJ2aXJ0dWFsLXJlZyIsIExpdmVJbi5WaXJ0dWFsUmVnaXN0ZXIsCisgICAgICAgIFN0cmluZ1ZhbHVlKCkpOyAvLyBEb24ndCBwcmludCB0aGUgdmlydHVhbCByZWdpc3RlciB3aGVuIGl0J3MgZW1wdHkuCisgIH0KKworICBzdGF0aWMgY29uc3QgYm9vbCBmbG93ID0gdHJ1ZTsKK307CisKKy8vLyBTZXJpYWxpemFibGUgcmVwcmVzZW50YXRpb24gb2Ygc3RhY2sgb2JqZWN0IGZyb20gdGhlIE1hY2hpbmVGcmFtZUluZm8gY2xhc3MuCisvLy8KKy8vLyBUaGUgZmxhZ3MgJ2lzSW1tdXRhYmxlJyBhbmQgJ2lzQWxpYXNlZCcgYXJlbid0IHNlcmlhbGl6ZWQsIGFzIHRoZXkgYXJlCisvLy8gZGV0ZXJtaW5lZCBieSB0aGUgb2JqZWN0J3MgdHlwZSBhbmQgZnJhbWUgaW5mb3JtYXRpb24gZmxhZ3MuCisvLy8gRGVhZCBzdGFjayBvYmplY3RzIGFyZW4ndCBzZXJpYWxpemVkLgorLy8vCisvLy8gVGhlICdpc1ByZWFsbG9jYXRlZCcgZmxhZyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsb2NhbCBvZmZzZXQuCitzdHJ1Y3QgTWFjaGluZVN0YWNrT2JqZWN0IHsKKyAgZW51bSBPYmplY3RUeXBlIHsgRGVmYXVsdFR5cGUsIFNwaWxsU2xvdCwgVmFyaWFibGVTaXplZCB9OworICBVbnNpZ25lZFZhbHVlIElEOworICBTdHJpbmdWYWx1ZSBOYW1lOworICAvLyBUT0RPOiBTZXJpYWxpemUgdW5uYW1lZCBMTFZNIGFsbG9jYSByZWZlcmVuY2UuCisgIE9iamVjdFR5cGUgVHlwZSA9IERlZmF1bHRUeXBlOworICBpbnQ2NF90IE9mZnNldCA9IDA7CisgIHVpbnQ2NF90IFNpemUgPSAwOworICB1bnNpZ25lZCBBbGlnbm1lbnQgPSAwOworICB1aW50OF90IFN0YWNrSUQgPSAwOworICBTdHJpbmdWYWx1ZSBDYWxsZWVTYXZlZFJlZ2lzdGVyOworICBib29sIENhbGxlZVNhdmVkUmVzdG9yZWQgPSB0cnVlOworICBPcHRpb25hbDxpbnQ2NF90PiBMb2NhbE9mZnNldDsKKyAgU3RyaW5nVmFsdWUgRGVidWdWYXI7CisgIFN0cmluZ1ZhbHVlIERlYnVnRXhwcjsKKyAgU3RyaW5nVmFsdWUgRGVidWdMb2M7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hY2hpbmVTdGFja09iamVjdCAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gSUQgPT0gT3RoZXIuSUQgJiYgTmFtZSA9PSBPdGhlci5OYW1lICYmIFR5cGUgPT0gT3RoZXIuVHlwZSAmJgorICAgICAgICAgICBPZmZzZXQgPT0gT3RoZXIuT2Zmc2V0ICYmIFNpemUgPT0gT3RoZXIuU2l6ZSAmJgorICAgICAgICAgICBBbGlnbm1lbnQgPT0gT3RoZXIuQWxpZ25tZW50ICYmCisgICAgICAgICAgIFN0YWNrSUQgPT0gT3RoZXIuU3RhY2tJRCAmJgorICAgICAgICAgICBDYWxsZWVTYXZlZFJlZ2lzdGVyID09IE90aGVyLkNhbGxlZVNhdmVkUmVnaXN0ZXIgJiYKKyAgICAgICAgICAgQ2FsbGVlU2F2ZWRSZXN0b3JlZCA9PSBPdGhlci5DYWxsZWVTYXZlZFJlc3RvcmVkICYmCisgICAgICAgICAgIExvY2FsT2Zmc2V0ID09IE90aGVyLkxvY2FsT2Zmc2V0ICYmIERlYnVnVmFyID09IE90aGVyLkRlYnVnVmFyICYmCisgICAgICAgICAgIERlYnVnRXhwciA9PSBPdGhlci5EZWJ1Z0V4cHIgJiYgRGVidWdMb2MgPT0gT3RoZXIuRGVidWdMb2M7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxNYWNoaW5lU3RhY2tPYmplY3Q6Ok9iamVjdFR5cGU+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oeWFtbDo6SU8gJklPLCBNYWNoaW5lU3RhY2tPYmplY3Q6Ok9iamVjdFR5cGUgJlR5cGUpIHsKKyAgICBJTy5lbnVtQ2FzZShUeXBlLCAiZGVmYXVsdCIsIE1hY2hpbmVTdGFja09iamVjdDo6RGVmYXVsdFR5cGUpOworICAgIElPLmVudW1DYXNlKFR5cGUsICJzcGlsbC1zbG90IiwgTWFjaGluZVN0YWNrT2JqZWN0OjpTcGlsbFNsb3QpOworICAgIElPLmVudW1DYXNlKFR5cGUsICJ2YXJpYWJsZS1zaXplZCIsIE1hY2hpbmVTdGFja09iamVjdDo6VmFyaWFibGVTaXplZCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPE1hY2hpbmVTdGFja09iamVjdD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKHlhbWw6OklPICZZYW1sSU8sIE1hY2hpbmVTdGFja09iamVjdCAmT2JqZWN0KSB7CisgICAgWWFtbElPLm1hcFJlcXVpcmVkKCJpZCIsIE9iamVjdC5JRCk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJuYW1lIiwgT2JqZWN0Lk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ZhbHVlKCkpOyAvLyBEb24ndCBwcmludCBvdXQgYW4gZW1wdHkgbmFtZS4KKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoCisgICAgICAgICJ0eXBlIiwgT2JqZWN0LlR5cGUsCisgICAgICAgIE1hY2hpbmVTdGFja09iamVjdDo6RGVmYXVsdFR5cGUpOyAvLyBEb24ndCBwcmludCB0aGUgZGVmYXVsdCB0eXBlLgorICAgIFlhbWxJTy5tYXBPcHRpb25hbCgib2Zmc2V0IiwgT2JqZWN0Lk9mZnNldCwgKGludDY0X3QpMCk7CisgICAgaWYgKE9iamVjdC5UeXBlICE9IE1hY2hpbmVTdGFja09iamVjdDo6VmFyaWFibGVTaXplZCkKKyAgICAgIFlhbWxJTy5tYXBSZXF1aXJlZCgic2l6ZSIsIE9iamVjdC5TaXplKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImFsaWdubWVudCIsIE9iamVjdC5BbGlnbm1lbnQsICh1bnNpZ25lZCkwKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoInN0YWNrLWlkIiwgT2JqZWN0LlN0YWNrSUQpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiY2FsbGVlLXNhdmVkLXJlZ2lzdGVyIiwgT2JqZWN0LkNhbGxlZVNhdmVkUmVnaXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ZhbHVlKCkpOyAvLyBEb24ndCBwcmludCBpdCBvdXQgd2hlbiBpdCdzIGVtcHR5LgorICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiY2FsbGVlLXNhdmVkLXJlc3RvcmVkIiwgT2JqZWN0LkNhbGxlZVNhdmVkUmVzdG9yZWQsCisgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgibG9jYWwtb2Zmc2V0IiwgT2JqZWN0LkxvY2FsT2Zmc2V0LCBPcHRpb25hbDxpbnQ2NF90PigpKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImRpLXZhcmlhYmxlIiwgT2JqZWN0LkRlYnVnVmFyLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdWYWx1ZSgpKTsgLy8gRG9uJ3QgcHJpbnQgaXQgb3V0IHdoZW4gaXQncyBlbXB0eS4KKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImRpLWV4cHJlc3Npb24iLCBPYmplY3QuRGVidWdFeHByLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdWYWx1ZSgpKTsgLy8gRG9uJ3QgcHJpbnQgaXQgb3V0IHdoZW4gaXQncyBlbXB0eS4KKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImRpLWxvY2F0aW9uIiwgT2JqZWN0LkRlYnVnTG9jLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdWYWx1ZSgpKTsgLy8gRG9uJ3QgcHJpbnQgaXQgb3V0IHdoZW4gaXQncyBlbXB0eS4KKyAgfQorCisgIHN0YXRpYyBjb25zdCBib29sIGZsb3cgPSB0cnVlOworfTsKKworLy8vIFNlcmlhbGl6YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZml4ZWQgc3RhY2sgb2JqZWN0IGZyb20gdGhlCisvLy8gTWFjaGluZUZyYW1lSW5mbyBjbGFzcy4KK3N0cnVjdCBGaXhlZE1hY2hpbmVTdGFja09iamVjdCB7CisgIGVudW0gT2JqZWN0VHlwZSB7IERlZmF1bHRUeXBlLCBTcGlsbFNsb3QgfTsKKyAgVW5zaWduZWRWYWx1ZSBJRDsKKyAgT2JqZWN0VHlwZSBUeXBlID0gRGVmYXVsdFR5cGU7CisgIGludDY0X3QgT2Zmc2V0ID0gMDsKKyAgdWludDY0X3QgU2l6ZSA9IDA7CisgIHVuc2lnbmVkIEFsaWdubWVudCA9IDA7CisgIHVpbnQ4X3QgU3RhY2tJRCA9IDA7CisgIGJvb2wgSXNJbW11dGFibGUgPSBmYWxzZTsKKyAgYm9vbCBJc0FsaWFzZWQgPSBmYWxzZTsKKyAgU3RyaW5nVmFsdWUgQ2FsbGVlU2F2ZWRSZWdpc3RlcjsKKyAgYm9vbCBDYWxsZWVTYXZlZFJlc3RvcmVkID0gdHJ1ZTsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgRml4ZWRNYWNoaW5lU3RhY2tPYmplY3QgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIElEID09IE90aGVyLklEICYmIFR5cGUgPT0gT3RoZXIuVHlwZSAmJiBPZmZzZXQgPT0gT3RoZXIuT2Zmc2V0ICYmCisgICAgICAgICAgIFNpemUgPT0gT3RoZXIuU2l6ZSAmJiBBbGlnbm1lbnQgPT0gT3RoZXIuQWxpZ25tZW50ICYmCisgICAgICAgICAgIFN0YWNrSUQgPT0gT3RoZXIuU3RhY2tJRCAmJgorICAgICAgICAgICBJc0ltbXV0YWJsZSA9PSBPdGhlci5Jc0ltbXV0YWJsZSAmJiBJc0FsaWFzZWQgPT0gT3RoZXIuSXNBbGlhc2VkICYmCisgICAgICAgICAgIENhbGxlZVNhdmVkUmVnaXN0ZXIgPT0gT3RoZXIuQ2FsbGVlU2F2ZWRSZWdpc3RlciAmJgorICAgICAgICAgICBDYWxsZWVTYXZlZFJlc3RvcmVkID09IE90aGVyLkNhbGxlZVNhdmVkUmVzdG9yZWQ7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8Rml4ZWRNYWNoaW5lU3RhY2tPYmplY3Q6Ok9iamVjdFR5cGU+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oeWFtbDo6SU8gJklPLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhlZE1hY2hpbmVTdGFja09iamVjdDo6T2JqZWN0VHlwZSAmVHlwZSkgeworICAgIElPLmVudW1DYXNlKFR5cGUsICJkZWZhdWx0IiwgRml4ZWRNYWNoaW5lU3RhY2tPYmplY3Q6OkRlZmF1bHRUeXBlKTsKKyAgICBJTy5lbnVtQ2FzZShUeXBlLCAic3BpbGwtc2xvdCIsIEZpeGVkTWFjaGluZVN0YWNrT2JqZWN0OjpTcGlsbFNsb3QpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxGaXhlZE1hY2hpbmVTdGFja09iamVjdD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKHlhbWw6OklPICZZYW1sSU8sIEZpeGVkTWFjaGluZVN0YWNrT2JqZWN0ICZPYmplY3QpIHsKKyAgICBZYW1sSU8ubWFwUmVxdWlyZWQoImlkIiwgT2JqZWN0LklEKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoCisgICAgICAgICJ0eXBlIiwgT2JqZWN0LlR5cGUsCisgICAgICAgIEZpeGVkTWFjaGluZVN0YWNrT2JqZWN0OjpEZWZhdWx0VHlwZSk7IC8vIERvbid0IHByaW50IHRoZSBkZWZhdWx0IHR5cGUuCisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJvZmZzZXQiLCBPYmplY3QuT2Zmc2V0LCAoaW50NjRfdCkwKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoInNpemUiLCBPYmplY3QuU2l6ZSwgKHVpbnQ2NF90KTApOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiYWxpZ25tZW50IiwgT2JqZWN0LkFsaWdubWVudCwgKHVuc2lnbmVkKTApOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgic3RhY2staWQiLCBPYmplY3QuU3RhY2tJRCk7CisgICAgaWYgKE9iamVjdC5UeXBlICE9IEZpeGVkTWFjaGluZVN0YWNrT2JqZWN0OjpTcGlsbFNsb3QpIHsKKyAgICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiaXNJbW11dGFibGUiLCBPYmplY3QuSXNJbW11dGFibGUsIGZhbHNlKTsKKyAgICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiaXNBbGlhc2VkIiwgT2JqZWN0LklzQWxpYXNlZCwgZmFsc2UpOworICAgIH0KKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImNhbGxlZS1zYXZlZC1yZWdpc3RlciIsIE9iamVjdC5DYWxsZWVTYXZlZFJlZ2lzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdWYWx1ZSgpKTsgLy8gRG9uJ3QgcHJpbnQgaXQgb3V0IHdoZW4gaXQncyBlbXB0eS4KKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImNhbGxlZS1zYXZlZC1yZXN0b3JlZCIsIE9iamVjdC5DYWxsZWVTYXZlZFJlc3RvcmVkLAorICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgIH0KKworICBzdGF0aWMgY29uc3QgYm9vbCBmbG93ID0gdHJ1ZTsKK307CisKK3N0cnVjdCBNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWUgeworICBVbnNpZ25lZFZhbHVlIElEOworICBTdHJpbmdWYWx1ZSBWYWx1ZTsKKyAgdW5zaWduZWQgQWxpZ25tZW50ID0gMDsKKyAgYm9vbCBJc1RhcmdldFNwZWNpZmljID0gZmFsc2U7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gSUQgPT0gT3RoZXIuSUQgJiYgVmFsdWUgPT0gT3RoZXIuVmFsdWUgJiYKKyAgICAgICAgICAgQWxpZ25tZW50ID09IE90aGVyLkFsaWdubWVudCAmJgorICAgICAgICAgICBJc1RhcmdldFNwZWNpZmljID09IE90aGVyLklzVGFyZ2V0U3BlY2lmaWM7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZZYW1sSU8sIE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSAmQ29uc3RhbnQpIHsKKyAgICBZYW1sSU8ubWFwUmVxdWlyZWQoImlkIiwgQ29uc3RhbnQuSUQpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgidmFsdWUiLCBDb25zdGFudC5WYWx1ZSwgU3RyaW5nVmFsdWUoKSk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJhbGlnbm1lbnQiLCBDb25zdGFudC5BbGlnbm1lbnQsICh1bnNpZ25lZCkwKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImlzVGFyZ2V0U3BlY2lmaWMiLCBDb25zdGFudC5Jc1RhcmdldFNwZWNpZmljLCBmYWxzZSk7CisgIH0KK307CisKK3N0cnVjdCBNYWNoaW5lSnVtcFRhYmxlIHsKKyAgc3RydWN0IEVudHJ5IHsKKyAgICBVbnNpZ25lZFZhbHVlIElEOworICAgIHN0ZDo6dmVjdG9yPEZsb3dTdHJpbmdWYWx1ZT4gQmxvY2tzOworCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEVudHJ5ICZPdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIElEID09IE90aGVyLklEICYmIEJsb2NrcyA9PSBPdGhlci5CbG9ja3M7CisgICAgfQorICB9OworCisgIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpKVEVudHJ5S2luZCBLaW5kID0gTWFjaGluZUp1bXBUYWJsZUluZm86OkVLX0N1c3RvbTMyOworICBzdGQ6OnZlY3RvcjxFbnRyeT4gRW50cmllczsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFjaGluZUp1bXBUYWJsZSAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gS2luZCA9PSBPdGhlci5LaW5kICYmIEVudHJpZXMgPT0gT3RoZXIuRW50cmllczsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaGluZUp1bXBUYWJsZTo6RW50cnk+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmWWFtbElPLCBNYWNoaW5lSnVtcFRhYmxlOjpFbnRyeSAmRW50cnkpIHsKKyAgICBZYW1sSU8ubWFwUmVxdWlyZWQoImlkIiwgRW50cnkuSUQpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiYmxvY2tzIiwgRW50cnkuQmxvY2tzLCBzdGQ6OnZlY3RvcjxGbG93U3RyaW5nVmFsdWU+KCkpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgeWFtbAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjp5YW1sOjpNYWNoaW5lRnVuY3Rpb25MaXZlSW4pCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OnlhbWw6OlZpcnR1YWxSZWdpc3RlckRlZmluaXRpb24pCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OnlhbWw6Ok1hY2hpbmVTdGFja09iamVjdCkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6eWFtbDo6Rml4ZWRNYWNoaW5lU3RhY2tPYmplY3QpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OnlhbWw6Ok1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6eWFtbDo6TWFjaGluZUp1bXBUYWJsZTo6RW50cnkpCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSB5YW1sIHsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaGluZUp1bXBUYWJsZT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZZYW1sSU8sIE1hY2hpbmVKdW1wVGFibGUgJkpUKSB7CisgICAgWWFtbElPLm1hcFJlcXVpcmVkKCJraW5kIiwgSlQuS2luZCk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJlbnRyaWVzIiwgSlQuRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZUp1bXBUYWJsZTo6RW50cnk+KCkpOworICB9Cit9OworCisvLy8gU2VyaWFsaXphYmxlIHJlcHJlc2VudGF0aW9uIG9mIE1hY2hpbmVGcmFtZUluZm8uCisvLy8KKy8vLyBEb2Vzbid0IHNlcmlhbGl6ZSBhdHRyaWJ1dGVzIGxpa2UgJ1N0YWNrQWxpZ25tZW50JywgJ0lzU3RhY2tSZWFsaWduYWJsZScgYW5kCisvLy8gJ1JlYWxpZ25PcHRpb24nIGFzIHRoZXkgYXJlIGRldGVybWluZWQgYnkgdGhlIHRhcmdldCBhbmQgTExWTSBmdW5jdGlvbgorLy8vIGF0dHJpYnV0ZXMuCisvLy8gSXQgYWxzbyBkb2Vzbid0IHNlcmlhbGl6ZSBhdHRyaWJ1dGVzIGxpa2UgJ051bUZpeGVkT2JqZWN0JyBhbmQKKy8vLyAnSGFzVmFyU2l6ZWRPYmplY3RzJyBhcyB0aGV5IGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBmcmFtZSBvYmplY3RzIHRoZW1zZWx2ZXMuCitzdHJ1Y3QgTWFjaGluZUZyYW1lSW5mbyB7CisgIGJvb2wgSXNGcmFtZUFkZHJlc3NUYWtlbiA9IGZhbHNlOworICBib29sIElzUmV0dXJuQWRkcmVzc1Rha2VuID0gZmFsc2U7CisgIGJvb2wgSGFzU3RhY2tNYXAgPSBmYWxzZTsKKyAgYm9vbCBIYXNQYXRjaFBvaW50ID0gZmFsc2U7CisgIHVpbnQ2NF90IFN0YWNrU2l6ZSA9IDA7CisgIGludCBPZmZzZXRBZGp1c3RtZW50ID0gMDsKKyAgdW5zaWduZWQgTWF4QWxpZ25tZW50ID0gMDsKKyAgYm9vbCBBZGp1c3RzU3RhY2sgPSBmYWxzZTsKKyAgYm9vbCBIYXNDYWxscyA9IGZhbHNlOworICBTdHJpbmdWYWx1ZSBTdGFja1Byb3RlY3RvcjsKKyAgLy8gVE9ETzogU2VyaWFsaXplIEZ1bmN0aW9uQ29udGV4dElkeAorICB1bnNpZ25lZCBNYXhDYWxsRnJhbWVTaXplID0gfjB1OyAvLy88IH4wdSBtZWFuczogbm90IGNvbXB1dGVkIHlldC4KKyAgYm9vbCBIYXNPcGFxdWVTUEFkanVzdG1lbnQgPSBmYWxzZTsKKyAgYm9vbCBIYXNWQVN0YXJ0ID0gZmFsc2U7CisgIGJvb2wgSGFzTXVzdFRhaWxJblZhckFyZ0Z1bmMgPSBmYWxzZTsKKyAgU3RyaW5nVmFsdWUgU2F2ZVBvaW50OworICBTdHJpbmdWYWx1ZSBSZXN0b3JlUG9pbnQ7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIElzRnJhbWVBZGRyZXNzVGFrZW4gPT0gT3RoZXIuSXNGcmFtZUFkZHJlc3NUYWtlbiAmJgorICAgICAgICAgICBJc1JldHVybkFkZHJlc3NUYWtlbiA9PSBPdGhlci5Jc1JldHVybkFkZHJlc3NUYWtlbiAmJgorICAgICAgICAgICBIYXNTdGFja01hcCA9PSBPdGhlci5IYXNTdGFja01hcCAmJgorICAgICAgICAgICBIYXNQYXRjaFBvaW50ID09IE90aGVyLkhhc1BhdGNoUG9pbnQgJiYKKyAgICAgICAgICAgU3RhY2tTaXplID09IE90aGVyLlN0YWNrU2l6ZSAmJgorICAgICAgICAgICBPZmZzZXRBZGp1c3RtZW50ID09IE90aGVyLk9mZnNldEFkanVzdG1lbnQgJiYKKyAgICAgICAgICAgTWF4QWxpZ25tZW50ID09IE90aGVyLk1heEFsaWdubWVudCAmJgorICAgICAgICAgICBBZGp1c3RzU3RhY2sgPT0gT3RoZXIuQWRqdXN0c1N0YWNrICYmIEhhc0NhbGxzID09IE90aGVyLkhhc0NhbGxzICYmCisgICAgICAgICAgIFN0YWNrUHJvdGVjdG9yID09IE90aGVyLlN0YWNrUHJvdGVjdG9yICYmCisgICAgICAgICAgIE1heENhbGxGcmFtZVNpemUgPT0gT3RoZXIuTWF4Q2FsbEZyYW1lU2l6ZSAmJgorICAgICAgICAgICBIYXNPcGFxdWVTUEFkanVzdG1lbnQgPT0gT3RoZXIuSGFzT3BhcXVlU1BBZGp1c3RtZW50ICYmCisgICAgICAgICAgIEhhc1ZBU3RhcnQgPT0gT3RoZXIuSGFzVkFTdGFydCAmJgorICAgICAgICAgICBIYXNNdXN0VGFpbEluVmFyQXJnRnVuYyA9PSBPdGhlci5IYXNNdXN0VGFpbEluVmFyQXJnRnVuYyAmJgorICAgICAgICAgICBTYXZlUG9pbnQgPT0gT3RoZXIuU2F2ZVBvaW50ICYmIFJlc3RvcmVQb2ludCA9PSBPdGhlci5SZXN0b3JlUG9pbnQ7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPE1hY2hpbmVGcmFtZUluZm8+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmWWFtbElPLCBNYWNoaW5lRnJhbWVJbmZvICZNRkkpIHsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImlzRnJhbWVBZGRyZXNzVGFrZW4iLCBNRkkuSXNGcmFtZUFkZHJlc3NUYWtlbiwgZmFsc2UpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiaXNSZXR1cm5BZGRyZXNzVGFrZW4iLCBNRkkuSXNSZXR1cm5BZGRyZXNzVGFrZW4sIGZhbHNlKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImhhc1N0YWNrTWFwIiwgTUZJLkhhc1N0YWNrTWFwLCBmYWxzZSk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJoYXNQYXRjaFBvaW50IiwgTUZJLkhhc1BhdGNoUG9pbnQsIGZhbHNlKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoInN0YWNrU2l6ZSIsIE1GSS5TdGFja1NpemUsICh1aW50NjRfdCkwKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoIm9mZnNldEFkanVzdG1lbnQiLCBNRkkuT2Zmc2V0QWRqdXN0bWVudCwgKGludCkwKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoIm1heEFsaWdubWVudCIsIE1GSS5NYXhBbGlnbm1lbnQsICh1bnNpZ25lZCkwKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImFkanVzdHNTdGFjayIsIE1GSS5BZGp1c3RzU3RhY2ssIGZhbHNlKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImhhc0NhbGxzIiwgTUZJLkhhc0NhbGxzLCBmYWxzZSk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJzdGFja1Byb3RlY3RvciIsIE1GSS5TdGFja1Byb3RlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nVmFsdWUoKSk7IC8vIERvbid0IHByaW50IGl0IG91dCB3aGVuIGl0J3MgZW1wdHkuCisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJtYXhDYWxsRnJhbWVTaXplIiwgTUZJLk1heENhbGxGcmFtZVNpemUsICh1bnNpZ25lZCl+MCk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJoYXNPcGFxdWVTUEFkanVzdG1lbnQiLCBNRkkuSGFzT3BhcXVlU1BBZGp1c3RtZW50LAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJoYXNWQVN0YXJ0IiwgTUZJLkhhc1ZBU3RhcnQsIGZhbHNlKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImhhc011c3RUYWlsSW5WYXJBcmdGdW5jIiwgTUZJLkhhc011c3RUYWlsSW5WYXJBcmdGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJzYXZlUG9pbnQiLCBNRkkuU2F2ZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdWYWx1ZSgpKTsgLy8gRG9uJ3QgcHJpbnQgaXQgb3V0IHdoZW4gaXQncyBlbXB0eS4KKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoInJlc3RvcmVQb2ludCIsIE1GSS5SZXN0b3JlUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ZhbHVlKCkpOyAvLyBEb24ndCBwcmludCBpdCBvdXQgd2hlbiBpdCdzIGVtcHR5LgorICB9Cit9OworCitzdHJ1Y3QgTWFjaGluZUZ1bmN0aW9uIHsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIHVuc2lnbmVkIEFsaWdubWVudCA9IDA7CisgIGJvb2wgRXhwb3Nlc1JldHVybnNUd2ljZSA9IGZhbHNlOworICAvLyBHSVNlbCBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzLgorICBib29sIExlZ2FsaXplZCA9IGZhbHNlOworICBib29sIFJlZ0JhbmtTZWxlY3RlZCA9IGZhbHNlOworICBib29sIFNlbGVjdGVkID0gZmFsc2U7CisgIGJvb2wgRmFpbGVkSVNlbCA9IGZhbHNlOworICAvLyBSZWdpc3RlciBpbmZvcm1hdGlvbgorICBib29sIFRyYWNrc1JlZ0xpdmVuZXNzID0gZmFsc2U7CisgIHN0ZDo6dmVjdG9yPFZpcnR1YWxSZWdpc3RlckRlZmluaXRpb24+IFZpcnR1YWxSZWdpc3RlcnM7CisgIHN0ZDo6dmVjdG9yPE1hY2hpbmVGdW5jdGlvbkxpdmVJbj4gTGl2ZUluczsKKyAgT3B0aW9uYWw8c3RkOjp2ZWN0b3I8Rmxvd1N0cmluZ1ZhbHVlPj4gQ2FsbGVlU2F2ZWRSZWdpc3RlcnM7CisgIC8vIFRPRE86IFNlcmlhbGl6ZSB0aGUgdmFyaW91cyByZWdpc3RlciBtYXNrcy4KKyAgLy8gRnJhbWUgaW5mb3JtYXRpb24KKyAgTWFjaGluZUZyYW1lSW5mbyBGcmFtZUluZm87CisgIHN0ZDo6dmVjdG9yPEZpeGVkTWFjaGluZVN0YWNrT2JqZWN0PiBGaXhlZFN0YWNrT2JqZWN0czsKKyAgc3RkOjp2ZWN0b3I8TWFjaGluZVN0YWNrT2JqZWN0PiBTdGFja09iamVjdHM7CisgIHN0ZDo6dmVjdG9yPE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZT4gQ29uc3RhbnRzOyAvLy8gQ29uc3RhbnQgcG9vbC4KKyAgTWFjaGluZUp1bXBUYWJsZSBKdW1wVGFibGVJbmZvOworICBCbG9ja1N0cmluZ1ZhbHVlIEJvZHk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoaW5lRnVuY3Rpb24+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmWWFtbElPLCBNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgICAgWWFtbElPLm1hcFJlcXVpcmVkKCJuYW1lIiwgTUYuTmFtZSk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJhbGlnbm1lbnQiLCBNRi5BbGlnbm1lbnQsICh1bnNpZ25lZCkwKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImV4cG9zZXNSZXR1cm5zVHdpY2UiLCBNRi5FeHBvc2VzUmV0dXJuc1R3aWNlLCBmYWxzZSk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJsZWdhbGl6ZWQiLCBNRi5MZWdhbGl6ZWQsIGZhbHNlKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoInJlZ0JhbmtTZWxlY3RlZCIsIE1GLlJlZ0JhbmtTZWxlY3RlZCwgZmFsc2UpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgic2VsZWN0ZWQiLCBNRi5TZWxlY3RlZCwgZmFsc2UpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiZmFpbGVkSVNlbCIsIE1GLkZhaWxlZElTZWwsIGZhbHNlKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoInRyYWNrc1JlZ0xpdmVuZXNzIiwgTUYuVHJhY2tzUmVnTGl2ZW5lc3MsIGZhbHNlKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoInJlZ2lzdGVycyIsIE1GLlZpcnR1YWxSZWdpc3RlcnMsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZpcnR1YWxSZWdpc3RlckRlZmluaXRpb24+KCkpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgibGl2ZWlucyIsIE1GLkxpdmVJbnMsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVGdW5jdGlvbkxpdmVJbj4oKSk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJjYWxsZWVTYXZlZFJlZ2lzdGVycyIsIE1GLkNhbGxlZVNhdmVkUmVnaXN0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxzdGQ6OnZlY3RvcjxGbG93U3RyaW5nVmFsdWU+PigpKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImZyYW1lSW5mbyIsIE1GLkZyYW1lSW5mbywgTWFjaGluZUZyYW1lSW5mbygpKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImZpeGVkU3RhY2siLCBNRi5GaXhlZFN0YWNrT2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Rml4ZWRNYWNoaW5lU3RhY2tPYmplY3Q+KCkpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgic3RhY2siLCBNRi5TdGFja09iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVTdGFja09iamVjdD4oKSk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJjb25zdGFudHMiLCBNRi5Db25zdGFudHMsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZT4oKSk7CisgICAgaWYgKCFZYW1sSU8ub3V0cHV0dGluZygpIHx8ICFNRi5KdW1wVGFibGVJbmZvLkVudHJpZXMuZW1wdHkoKSkKKyAgICAgIFlhbWxJTy5tYXBPcHRpb25hbCgianVtcFRhYmxlIiwgTUYuSnVtcFRhYmxlSW5mbywgTWFjaGluZUp1bXBUYWJsZSgpKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImJvZHkiLCBNRi5Cb2R5LCBCbG9ja1N0cmluZ1ZhbHVlKCkpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgeWFtbAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9NSVJZQU1MTUFQUElOR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaE9SZWxvY2F0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaE9SZWxvY2F0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5YjdhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoT1JlbG9jYXRpb24uaApAQCAtMCwwICsxLDU2IEBACisvLz09PSBNYWNoT1JlbG9jYXRpb24uaCAtIE1hY2gtTyBSZWxvY2F0aW9uIEluZm8gLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNYWNoT1JlbG9jYXRpb24gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNIT1JFTE9DQVRJT05fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSE9SRUxPQ0FUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisgIC8vLyBNYWNoT1JlbG9jYXRpb24gLSBUaGlzIHN0cnVjdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHJlbG9jYXRpb24KKyAgLy8vIHRoYXQgbmVlZHMgdG8gYmUgZW1pdHRlZCB0byB0aGUgZmlsZS4KKyAgLy8vIHNlZSA8bWFjaC1vL3JlbG9jLmg+CisgIGNsYXNzIE1hY2hPUmVsb2NhdGlvbiB7CisgICAgdWludDMyX3Qgcl9hZGRyZXNzOyAgIC8vIG9mZnNldCBpbiB0aGUgc2VjdGlvbiB0byB3aGF0IGlzIGJlaW5nICByZWxvY2F0ZWQKKyAgICB1aW50MzJfdCByX3N5bWJvbG51bTsgLy8gc3ltYm9sIGluZGV4IGlmIHJfZXh0ZXJuID09IDEgZWxzZSBzZWN0aW9uIGluZGV4CisgICAgYm9vbCAgICAgcl9wY3JlbDsgICAgIC8vIHdhcyByZWxvY2F0ZWQgcGMtcmVsYXRpdmUgYWxyZWFkeQorICAgIHVpbnQ4X3QgIHJfbGVuZ3RoOyAgICAvLyBsZW5ndGggPSAyIF4gcl9sZW5ndGgKKyAgICBib29sICAgICByX2V4dGVybjsgICAgLy8gCisgICAgdWludDhfdCAgcl90eXBlOyAgICAgIC8vIGlmIG5vdCAwLCBtYWNoaW5lLXNwZWNpZmljIHJlbG9jYXRpb24gdHlwZS4KKyAgICBib29sICAgICByX3NjYXR0ZXJlZDsgLy8gMSA9IHNjYXR0ZXJlZCwgMCA9IG5vbi1zY2F0dGVyZWQKKyAgICBpbnQzMl90ICByX3ZhbHVlOyAgICAgLy8gdGhlIHZhbHVlIHRoZSBpdGVtIHRvIGJlIHJlbG9jYXRlZCBpcyByZWZlcnJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8uCisgIHB1YmxpYzogICAgICAKKyAgICB1aW50MzJfdCBnZXRQYWNrZWRGaWVsZHMoKSBjb25zdCB7CisgICAgICBpZiAocl9zY2F0dGVyZWQpCisgICAgICAgIHJldHVybiAoMSA8PCAzMSkgfCAocl9wY3JlbCA8PCAzMCkgfCAoKHJfbGVuZ3RoICYgMykgPDwgMjgpIHwgCisgICAgICAgICAgKChyX3R5cGUgJiAxNSkgPDwgMjQpIHwgKHJfYWRkcmVzcyAmIDB4MDBGRkZGRkYpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gKHJfc3ltYm9sbnVtIDw8IDgpIHwgKHJfcGNyZWwgPDwgNykgfCAoKHJfbGVuZ3RoICYgMykgPDwgNSkgfAorICAgICAgICAgIChyX2V4dGVybiA8PCA0KSB8IChyX3R5cGUgJiAxNSk7CisgICAgfQorICAgIHVpbnQzMl90IGdldEFkZHJlc3MoKSBjb25zdCB7IHJldHVybiByX3NjYXR0ZXJlZCA/IHJfdmFsdWUgOiByX2FkZHJlc3M7IH0KKyAgICB1aW50MzJfdCBnZXRSYXdBZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gcl9hZGRyZXNzOyB9CisKKyAgICBNYWNoT1JlbG9jYXRpb24odWludDMyX3QgYWRkciwgdWludDMyX3QgaW5kZXgsIGJvb2wgcGNyZWwsIHVpbnQ4X3QgbGVuLAorICAgICAgICAgICAgICAgICAgICBib29sIGV4dCwgdWludDhfdCB0eXBlLCBib29sIHNjYXR0ZXJlZCA9IGZhbHNlLCAKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSA9IDApIDogCisgICAgICByX2FkZHJlc3MoYWRkciksIHJfc3ltYm9sbnVtKGluZGV4KSwgcl9wY3JlbChwY3JlbCksIHJfbGVuZ3RoKGxlbiksCisgICAgICByX2V4dGVybihleHQpLCByX3R5cGUodHlwZSksIHJfc2NhdHRlcmVkKHNjYXR0ZXJlZCksIHJfdmFsdWUodmFsdWUpIHt9CisgIH07CisKK30gLy8gZW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUFDSE9SRUxPQ0FUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxMzBiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oCkBAIC0wLDAgKzEsOTE4IEBACisvLz09PS0gbGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENvbGxlY3QgdGhlIHNlcXVlbmNlIG9mIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGZvciBhIGJhc2ljIGJsb2NrLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVCQVNJQ0JMT0NLX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVCQVNJQ0JMT0NLX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9ub2RlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9zaW1wbGVfaWxpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZWJ1Z0xvYy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTGFuZUJpdG1hc2suaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JyYW5jaFByb2JhYmlsaXR5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1ByaW50YWJsZS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1DU3ltYm9sOworY2xhc3MgTW9kdWxlU2xvdFRyYWNrZXI7CitjbGFzcyBQYXNzOworY2xhc3MgU2xvdEluZGV4ZXM7CitjbGFzcyBTdHJpbmdSZWY7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpbGlzdF90cmFpdHM8TWFjaGluZUluc3RyPiB7Citwcml2YXRlOgorICBmcmllbmQgY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7IC8vIFNldCBieSB0aGUgb3duaW5nIE1hY2hpbmVCYXNpY0Jsb2NrLgorCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpQYXJlbnQ7CisKKyAgdXNpbmcgaW5zdHJfaXRlcmF0b3IgPQorICAgICAgc2ltcGxlX2lsaXN0PE1hY2hpbmVJbnN0ciwgaWxpc3Rfc2VudGluZWxfdHJhY2tpbmc8dHJ1ZT4+OjppdGVyYXRvcjsKKworcHVibGljOgorICB2b2lkIGFkZE5vZGVUb0xpc3QoTWFjaGluZUluc3RyICpOKTsKKyAgdm9pZCByZW1vdmVOb2RlRnJvbUxpc3QoTWFjaGluZUluc3RyICpOKTsKKyAgdm9pZCB0cmFuc2Zlck5vZGVzRnJvbUxpc3QoaWxpc3RfdHJhaXRzICZPbGRMaXN0LCBpbnN0cl9pdGVyYXRvciBGaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJfaXRlcmF0b3IgTGFzdCk7CisgIHZvaWQgZGVsZXRlTm9kZShNYWNoaW5lSW5zdHIgKk1JKTsKK307CisKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrCisgICAgOiBwdWJsaWMgaWxpc3Rfbm9kZV93aXRoX3BhcmVudDxNYWNoaW5lQmFzaWNCbG9jaywgTWFjaGluZUZ1bmN0aW9uPiB7CitwdWJsaWM6CisgIC8vLyBQYWlyIG9mIHBoeXNpY2FsIHJlZ2lzdGVyIGFuZCBsYW5lIG1hc2suCisgIC8vLyBUaGlzIGlzIG5vdCBzaW1wbHkgYSBzdGQ6OnBhaXIgdHlwZWRlZiBiZWNhdXNlIHRoZSBtZW1iZXJzIHNob3VsZCBiZSBuYW1lZAorICAvLy8gY2xlYXJseSBhcyB0aGV5IGJvdGggaGF2ZSBhbiBpbnRlZ2VyIHR5cGUuCisgIHN0cnVjdCBSZWdpc3Rlck1hc2tQYWlyIHsKKyAgcHVibGljOgorICAgIE1DUGh5c1JlZyBQaHlzUmVnOworICAgIExhbmVCaXRtYXNrIExhbmVNYXNrOworCisgICAgUmVnaXN0ZXJNYXNrUGFpcihNQ1BoeXNSZWcgUGh5c1JlZywgTGFuZUJpdG1hc2sgTGFuZU1hc2spCisgICAgICAgIDogUGh5c1JlZyhQaHlzUmVnKSwgTGFuZU1hc2soTGFuZU1hc2spIHt9CisgIH07CisKK3ByaXZhdGU6CisgIHVzaW5nIEluc3RydWN0aW9ucyA9IGlsaXN0PE1hY2hpbmVJbnN0ciwgaWxpc3Rfc2VudGluZWxfdHJhY2tpbmc8dHJ1ZT4+OworCisgIEluc3RydWN0aW9ucyBJbnN0czsKKyAgY29uc3QgQmFzaWNCbG9jayAqQkI7CisgIGludCBOdW1iZXI7CisgIE1hY2hpbmVGdW5jdGlvbiAqeFBhcmVudDsKKworICAvLy8gS2VlcCB0cmFjayBvZiB0aGUgcHJlZGVjZXNzb3IgLyBzdWNjZXNzb3IgYmFzaWMgYmxvY2tzLgorICBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayAqPiBQcmVkZWNlc3NvcnM7CisgIHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrICo+IFN1Y2Nlc3NvcnM7CisKKyAgLy8vIEtlZXAgdHJhY2sgb2YgdGhlIHByb2JhYmlsaXRpZXMgdG8gdGhlIHN1Y2Nlc3NvcnMuIFRoaXMgdmVjdG9yIGhhcyB0aGUKKyAgLy8vIHNhbWUgb3JkZXIgYXMgU3VjY2Vzc29ycywgb3IgaXQgaXMgZW1wdHkgaWYgd2UgZG9uJ3QgdXNlIGl0IChkaXNhYmxlCisgIC8vLyBvcHRpbWl6YXRpb24pLgorICBzdGQ6OnZlY3RvcjxCcmFuY2hQcm9iYWJpbGl0eT4gUHJvYnM7CisgIHVzaW5nIHByb2JhYmlsaXR5X2l0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8QnJhbmNoUHJvYmFiaWxpdHk+OjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfcHJvYmFiaWxpdHlfaXRlcmF0b3IgPQorICAgICAgc3RkOjp2ZWN0b3I8QnJhbmNoUHJvYmFiaWxpdHk+Ojpjb25zdF9pdGVyYXRvcjsKKworICBPcHRpb25hbDx1aW50NjRfdD4gSXJyTG9vcEhlYWRlcldlaWdodDsKKworICAvLy8gS2VlcCB0cmFjayBvZiB0aGUgcGh5c2ljYWwgcmVnaXN0ZXJzIHRoYXQgYXJlIGxpdmVpbiBvZiB0aGUgYmFzaWNibG9jay4KKyAgdXNpbmcgTGl2ZUluVmVjdG9yID0gc3RkOjp2ZWN0b3I8UmVnaXN0ZXJNYXNrUGFpcj47CisgIExpdmVJblZlY3RvciBMaXZlSW5zOworCisgIC8vLyBBbGlnbm1lbnQgb2YgdGhlIGJhc2ljIGJsb2NrLiBaZXJvIGlmIHRoZSBiYXNpYyBibG9jayBkb2VzIG5vdCBuZWVkIHRvIGJlCisgIC8vLyBhbGlnbmVkLiBUaGUgYWxpZ25tZW50IGlzIHNwZWNpZmllZCBhcyBsb2cyKGJ5dGVzKS4KKyAgdW5zaWduZWQgQWxpZ25tZW50ID0gMDsKKworICAvLy8gSW5kaWNhdGUgdGhhdCB0aGlzIGJhc2ljIGJsb2NrIGlzIGVudGVyZWQgdmlhIGFuIGV4Y2VwdGlvbiBoYW5kbGVyLgorICBib29sIElzRUhQYWQgPSBmYWxzZTsKKworICAvLy8gSW5kaWNhdGUgdGhhdCB0aGlzIGJhc2ljIGJsb2NrIGlzIHBvdGVudGlhbGx5IHRoZSB0YXJnZXQgb2YgYW4gaW5kaXJlY3QKKyAgLy8vIGJyYW5jaC4KKyAgYm9vbCBBZGRyZXNzVGFrZW4gPSBmYWxzZTsKKworICAvLy8gSW5kaWNhdGUgdGhhdCB0aGlzIGJhc2ljIGJsb2NrIGlzIHRoZSBlbnRyeSBibG9jayBvZiBhbiBFSCBmdW5jbGV0LgorICBib29sIElzRUhGdW5jbGV0RW50cnkgPSBmYWxzZTsKKworICAvLy8gSW5kaWNhdGUgdGhhdCB0aGlzIGJhc2ljIGJsb2NrIGlzIHRoZSBlbnRyeSBibG9jayBvZiBhIGNsZWFudXAgZnVuY2xldC4KKyAgYm9vbCBJc0NsZWFudXBGdW5jbGV0RW50cnkgPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIHNpbmNlIGdldFN5bWJvbCBpcyBhIHJlbGF0aXZlbHkgaGVhdnktd2VpZ2h0IG9wZXJhdGlvbiwgdGhlIHN5bWJvbAorICAvLy8gaXMgb25seSBjb21wdXRlZCBvbmNlIGFuZCBpcyBjYWNoZWQuCisgIG11dGFibGUgTUNTeW1ib2wgKkNhY2hlZE1DU3ltYm9sID0gbnVsbHB0cjsKKworICAvLyBJbnRydXNpdmUgbGlzdCBzdXBwb3J0CisgIE1hY2hpbmVCYXNpY0Jsb2NrKCkgPSBkZWZhdWx0OworCisgIGV4cGxpY2l0IE1hY2hpbmVCYXNpY0Jsb2NrKE1hY2hpbmVGdW5jdGlvbiAmTUYsIGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKKworICB+TWFjaGluZUJhc2ljQmxvY2soKTsKKworICAvLyBNYWNoaW5lQmFzaWNCbG9ja3MgYXJlIGFsbG9jYXRlZCBhbmQgb3duZWQgYnkgTWFjaGluZUZ1bmN0aW9uLgorICBmcmllbmQgY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworCitwdWJsaWM6CisgIC8vLyBSZXR1cm4gdGhlIExMVk0gYmFzaWMgYmxvY2sgdGhhdCB0aGlzIGluc3RhbmNlIGNvcnJlc3BvbmRlZCB0byBvcmlnaW5hbGx5LgorICAvLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIE5VTEwgaWYgdGhpcyBpbnN0YW5jZSBkb2VzIG5vdCBjb3JyZXNwb25kIGRpcmVjdGx5CisgIC8vLyB0byBhbiBMTFZNIGJhc2ljIGJsb2NrLgorICBjb25zdCBCYXNpY0Jsb2NrICpnZXRCYXNpY0Jsb2NrKCkgY29uc3QgeyByZXR1cm4gQkI7IH0KKworICAvLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIExMVk0gYmFzaWMgYmxvY2ssIG9yIGFuIGVtcHR5IHN0cmluZy4KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgZm9ybWF0dGVkIHN0cmluZyB0byBpZGVudGlmeSB0aGlzIGJsb2NrIGFuZCBpdHMgcGFyZW50IGZ1bmN0aW9uLgorICBzdGQ6OnN0cmluZyBnZXRGdWxsTmFtZSgpIGNvbnN0OworCisgIC8vLyBUZXN0IHdoZXRoZXIgdGhpcyBibG9jayBpcyBwb3RlbnRpYWxseSB0aGUgdGFyZ2V0IG9mIGFuIGluZGlyZWN0IGJyYW5jaC4KKyAgYm9vbCBoYXNBZGRyZXNzVGFrZW4oKSBjb25zdCB7IHJldHVybiBBZGRyZXNzVGFrZW47IH0KKworICAvLy8gU2V0IHRoaXMgYmxvY2sgdG8gcmVmbGVjdCB0aGF0IGl0IHBvdGVudGlhbGx5IGlzIHRoZSB0YXJnZXQgb2YgYW4gaW5kaXJlY3QKKyAgLy8vIGJyYW5jaC4KKyAgdm9pZCBzZXRIYXNBZGRyZXNzVGFrZW4oKSB7IEFkZHJlc3NUYWtlbiA9IHRydWU7IH0KKworICAvLy8gUmV0dXJuIHRoZSBNYWNoaW5lRnVuY3Rpb24gY29udGFpbmluZyB0aGlzIGJhc2ljIGJsb2NrLgorICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gKmdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIHhQYXJlbnQ7IH0KKyAgTWFjaGluZUZ1bmN0aW9uICpnZXRQYXJlbnQoKSB7IHJldHVybiB4UGFyZW50OyB9CisKKyAgdXNpbmcgaW5zdHJfaXRlcmF0b3IgPSBJbnN0cnVjdGlvbnM6Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pbnN0cl9pdGVyYXRvciA9IEluc3RydWN0aW9uczo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIHJldmVyc2VfaW5zdHJfaXRlcmF0b3IgPSBJbnN0cnVjdGlvbnM6OnJldmVyc2VfaXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X3JldmVyc2VfaW5zdHJfaXRlcmF0b3IgPSBJbnN0cnVjdGlvbnM6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvcjxNYWNoaW5lSW5zdHI+OworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yPGNvbnN0IE1hY2hpbmVJbnN0cj47CisgIHVzaW5nIHJldmVyc2VfaXRlcmF0b3IgPSBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvcjxNYWNoaW5lSW5zdHIsIHRydWU+OworICB1c2luZyBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yID0KKyAgICAgIE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yPGNvbnN0IE1hY2hpbmVJbnN0ciwgdHJ1ZT47CisKKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuICh1bnNpZ25lZClJbnN0cy5zaXplKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEluc3RzLmVtcHR5KCk7IH0KKworICBNYWNoaW5lSW5zdHIgICAgICAgJmluc3RyX2Zyb250KCkgICAgICAgeyByZXR1cm4gSW5zdHMuZnJvbnQoKTsgfQorICBNYWNoaW5lSW5zdHIgICAgICAgJmluc3RyX2JhY2soKSAgICAgICAgeyByZXR1cm4gSW5zdHMuYmFjaygpOyAgfQorICBjb25zdCBNYWNoaW5lSW5zdHIgJmluc3RyX2Zyb250KCkgY29uc3QgeyByZXR1cm4gSW5zdHMuZnJvbnQoKTsgfQorICBjb25zdCBNYWNoaW5lSW5zdHIgJmluc3RyX2JhY2soKSAgY29uc3QgeyByZXR1cm4gSW5zdHMuYmFjaygpOyAgfQorCisgIE1hY2hpbmVJbnN0ciAgICAgICAmZnJvbnQoKSAgICAgICAgICAgICB7IHJldHVybiBJbnN0cy5mcm9udCgpOyB9CisgIE1hY2hpbmVJbnN0ciAgICAgICAmYmFjaygpICAgICAgICAgICAgICB7IHJldHVybiAqLS1lbmQoKTsgICAgICB9CisgIGNvbnN0IE1hY2hpbmVJbnN0ciAmZnJvbnQoKSAgICAgICBjb25zdCB7IHJldHVybiBJbnN0cy5mcm9udCgpOyB9CisgIGNvbnN0IE1hY2hpbmVJbnN0ciAmYmFjaygpICAgICAgICBjb25zdCB7IHJldHVybiAqLS1lbmQoKTsgICAgICB9CisKKyAgaW5zdHJfaXRlcmF0b3IgICAgICAgICAgICAgICAgaW5zdHJfYmVnaW4oKSAgICAgICB7IHJldHVybiBJbnN0cy5iZWdpbigpOyAgfQorICBjb25zdF9pbnN0cl9pdGVyYXRvciAgICAgICAgICBpbnN0cl9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIEluc3RzLmJlZ2luKCk7ICB9CisgIGluc3RyX2l0ZXJhdG9yICAgICAgICAgICAgICAgICAgaW5zdHJfZW5kKCkgICAgICAgeyByZXR1cm4gSW5zdHMuZW5kKCk7ICAgIH0KKyAgY29uc3RfaW5zdHJfaXRlcmF0b3IgICAgICAgICAgICBpbnN0cl9lbmQoKSBjb25zdCB7IHJldHVybiBJbnN0cy5lbmQoKTsgICAgfQorICByZXZlcnNlX2luc3RyX2l0ZXJhdG9yICAgICAgIGluc3RyX3JiZWdpbigpICAgICAgIHsgcmV0dXJuIEluc3RzLnJiZWdpbigpOyB9CisgIGNvbnN0X3JldmVyc2VfaW5zdHJfaXRlcmF0b3IgaW5zdHJfcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gSW5zdHMucmJlZ2luKCk7IH0KKyAgcmV2ZXJzZV9pbnN0cl9pdGVyYXRvciAgICAgICBpbnN0cl9yZW5kICAoKSAgICAgICB7IHJldHVybiBJbnN0cy5yZW5kKCk7ICAgfQorICBjb25zdF9yZXZlcnNlX2luc3RyX2l0ZXJhdG9yIGluc3RyX3JlbmQgICgpIGNvbnN0IHsgcmV0dXJuIEluc3RzLnJlbmQoKTsgICB9CisKKyAgdXNpbmcgaW5zdHJfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxpbnN0cl9pdGVyYXRvcj47CisgIHVzaW5nIGNvbnN0X2luc3RyX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8Y29uc3RfaW5zdHJfaXRlcmF0b3I+OworICBpbnN0cl9yYW5nZSBpbnN0cnMoKSB7IHJldHVybiBpbnN0cl9yYW5nZShpbnN0cl9iZWdpbigpLCBpbnN0cl9lbmQoKSk7IH0KKyAgY29uc3RfaW5zdHJfcmFuZ2UgaW5zdHJzKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9pbnN0cl9yYW5nZShpbnN0cl9iZWdpbigpLCBpbnN0cl9lbmQoKSk7CisgIH0KKworICBpdGVyYXRvciAgICAgICAgICAgICAgICBiZWdpbigpICAgICAgIHsgcmV0dXJuIGluc3RyX2JlZ2luKCk7ICB9CisgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaW5zdHJfYmVnaW4oKTsgIH0KKyAgaXRlcmF0b3IgICAgICAgICAgICAgICAgZW5kICAoKSAgICAgICB7IHJldHVybiBpbnN0cl9lbmQoKTsgICAgfQorICBjb25zdF9pdGVyYXRvciAgICAgICAgICBlbmQgICgpIGNvbnN0IHsgcmV0dXJuIGluc3RyX2VuZCgpOyAgICB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeworICAgIHJldHVybiByZXZlcnNlX2l0ZXJhdG9yOjpnZXRBdEJ1bmRsZUJlZ2luKGluc3RyX3JiZWdpbigpKTsKKyAgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjo6Z2V0QXRCdW5kbGVCZWdpbihpbnN0cl9yYmVnaW4oKSk7CisgIH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihpbnN0cl9yZW5kKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihpbnN0cl9yZW5kKCkpOworICB9CisKKyAgLy8vIFN1cHBvcnQgZm9yIE1hY2hpbmVJbnN0cjo6Z2V0TmV4dE5vZGUoKS4KKyAgc3RhdGljIEluc3RydWN0aW9ucyBNYWNoaW5lQmFzaWNCbG9jazo6KmdldFN1Ymxpc3RBY2Nlc3MoTWFjaGluZUluc3RyICopIHsKKyAgICByZXR1cm4gJk1hY2hpbmVCYXNpY0Jsb2NrOjpJbnN0czsKKyAgfQorCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTxpdGVyYXRvcj4gdGVybWluYXRvcnMoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoZ2V0Rmlyc3RUZXJtaW5hdG9yKCksIGVuZCgpKTsKKyAgfQorICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfaXRlcmF0b3I+IHRlcm1pbmF0b3JzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGdldEZpcnN0VGVybWluYXRvcigpLCBlbmQoKSk7CisgIH0KKworICAvLy8gUmV0dXJucyBhIHJhbmdlIHRoYXQgaXRlcmF0ZXMgb3ZlciB0aGUgcGhpcyBpbiB0aGUgYmFzaWMgYmxvY2suCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTxpdGVyYXRvcj4gcGhpcygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShiZWdpbigpLCBnZXRGaXJzdE5vblBISSgpKTsKKyAgfQorICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfaXRlcmF0b3I+IHBoaXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TWFjaGluZUJhc2ljQmxvY2sgKj4odGhpcyktPnBoaXMoKTsKKyAgfQorCisgIC8vIE1hY2hpbmUtQ0ZHIGl0ZXJhdG9ycworICB1c2luZyBwcmVkX2l0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sgKj46Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9wcmVkX2l0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sgKj46OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBzdWNjX2l0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sgKj46Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9zdWNjX2l0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sgKj46OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBwcmVkX3JldmVyc2VfaXRlcmF0b3IgPQorICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sgKj46OnJldmVyc2VfaXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X3ByZWRfcmV2ZXJzZV9pdGVyYXRvciA9CisgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayAqPjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdXNpbmcgc3VjY19yZXZlcnNlX2l0ZXJhdG9yID0KKyAgICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrICo+OjpyZXZlcnNlX2l0ZXJhdG9yOworICB1c2luZyBjb25zdF9zdWNjX3JldmVyc2VfaXRlcmF0b3IgPQorICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sgKj46OmNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgIHByZWRfaXRlcmF0b3IgICAgICAgIHByZWRfYmVnaW4oKSAgICAgICB7IHJldHVybiBQcmVkZWNlc3NvcnMuYmVnaW4oKTsgfQorICBjb25zdF9wcmVkX2l0ZXJhdG9yICBwcmVkX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gUHJlZGVjZXNzb3JzLmJlZ2luKCk7IH0KKyAgcHJlZF9pdGVyYXRvciAgICAgICAgcHJlZF9lbmQoKSAgICAgICAgIHsgcmV0dXJuIFByZWRlY2Vzc29ycy5lbmQoKTsgICB9CisgIGNvbnN0X3ByZWRfaXRlcmF0b3IgIHByZWRfZW5kKCkgICBjb25zdCB7IHJldHVybiBQcmVkZWNlc3NvcnMuZW5kKCk7ICAgfQorICBwcmVkX3JldmVyc2VfaXRlcmF0b3IgICAgICAgIHByZWRfcmJlZ2luKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIFByZWRlY2Vzc29ycy5yYmVnaW4oKTt9CisgIGNvbnN0X3ByZWRfcmV2ZXJzZV9pdGVyYXRvciAgcHJlZF9yYmVnaW4oKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gUHJlZGVjZXNzb3JzLnJiZWdpbigpO30KKyAgcHJlZF9yZXZlcnNlX2l0ZXJhdG9yICAgICAgICBwcmVkX3JlbmQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gUHJlZGVjZXNzb3JzLnJlbmQoKTsgIH0KKyAgY29uc3RfcHJlZF9yZXZlcnNlX2l0ZXJhdG9yICBwcmVkX3JlbmQoKSAgIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBQcmVkZWNlc3NvcnMucmVuZCgpOyAgfQorICB1bnNpZ25lZCAgICAgICAgICAgICBwcmVkX3NpemUoKSAgY29uc3QgeworICAgIHJldHVybiAodW5zaWduZWQpUHJlZGVjZXNzb3JzLnNpemUoKTsKKyAgfQorICBib29sICAgICAgICAgICAgICAgICBwcmVkX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gUHJlZGVjZXNzb3JzLmVtcHR5KCk7IH0KKyAgc3VjY19pdGVyYXRvciAgICAgICAgc3VjY19iZWdpbigpICAgICAgIHsgcmV0dXJuIFN1Y2Nlc3NvcnMuYmVnaW4oKTsgICB9CisgIGNvbnN0X3N1Y2NfaXRlcmF0b3IgIHN1Y2NfYmVnaW4oKSBjb25zdCB7IHJldHVybiBTdWNjZXNzb3JzLmJlZ2luKCk7ICAgfQorICBzdWNjX2l0ZXJhdG9yICAgICAgICBzdWNjX2VuZCgpICAgICAgICAgeyByZXR1cm4gU3VjY2Vzc29ycy5lbmQoKTsgICAgIH0KKyAgY29uc3Rfc3VjY19pdGVyYXRvciAgc3VjY19lbmQoKSAgIGNvbnN0IHsgcmV0dXJuIFN1Y2Nlc3NvcnMuZW5kKCk7ICAgICB9CisgIHN1Y2NfcmV2ZXJzZV9pdGVyYXRvciAgICAgICAgc3VjY19yYmVnaW4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gU3VjY2Vzc29ycy5yYmVnaW4oKTsgIH0KKyAgY29uc3Rfc3VjY19yZXZlcnNlX2l0ZXJhdG9yICBzdWNjX3JiZWdpbigpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBTdWNjZXNzb3JzLnJiZWdpbigpOyAgfQorICBzdWNjX3JldmVyc2VfaXRlcmF0b3IgICAgICAgIHN1Y2NfcmVuZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBTdWNjZXNzb3JzLnJlbmQoKTsgICAgfQorICBjb25zdF9zdWNjX3JldmVyc2VfaXRlcmF0b3IgIHN1Y2NfcmVuZCgpICAgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIFN1Y2Nlc3NvcnMucmVuZCgpOyAgICB9CisgIHVuc2lnbmVkICAgICAgICAgICAgIHN1Y2Nfc2l6ZSgpICBjb25zdCB7CisgICAgcmV0dXJuICh1bnNpZ25lZClTdWNjZXNzb3JzLnNpemUoKTsKKyAgfQorICBib29sICAgICAgICAgICAgICAgICBzdWNjX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gU3VjY2Vzc29ycy5lbXB0eSgpOyAgIH0KKworICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8cHJlZF9pdGVyYXRvcj4gcHJlZGVjZXNzb3JzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHByZWRfYmVnaW4oKSwgcHJlZF9lbmQoKSk7CisgIH0KKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X3ByZWRfaXRlcmF0b3I+IHByZWRlY2Vzc29ycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShwcmVkX2JlZ2luKCksIHByZWRfZW5kKCkpOworICB9CisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTxzdWNjX2l0ZXJhdG9yPiBzdWNjZXNzb3JzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHN1Y2NfYmVnaW4oKSwgc3VjY19lbmQoKSk7CisgIH0KKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X3N1Y2NfaXRlcmF0b3I+IHN1Y2Nlc3NvcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2Uoc3VjY19iZWdpbigpLCBzdWNjX2VuZCgpKTsKKyAgfQorCisgIC8vIExpdmVJbiBtYW5hZ2VtZW50IG1ldGhvZHMuCisKKyAgLy8vIEFkZHMgdGhlIHNwZWNpZmllZCByZWdpc3RlciBhcyBhIGxpdmUgaW4uIE5vdGUgdGhhdCBpdCBpcyBhbiBlcnJvciB0byBhZGQKKyAgLy8vIHRoZSBzYW1lIHJlZ2lzdGVyIHRvIHRoZSBzYW1lIHNldCBtb3JlIHRoYW4gb25jZSB1bmxlc3MgdGhlIGludGVudGlvbiBpcworICAvLy8gdG8gY2FsbCBzb3J0VW5pcXVlTGl2ZUlucyBhZnRlciBhbGwgcmVnaXN0ZXJzIGFyZSBhZGRlZC4KKyAgdm9pZCBhZGRMaXZlSW4oTUNQaHlzUmVnIFBoeXNSZWcsCisgICAgICAgICAgICAgICAgIExhbmVCaXRtYXNrIExhbmVNYXNrID0gTGFuZUJpdG1hc2s6OmdldEFsbCgpKSB7CisgICAgTGl2ZUlucy5wdXNoX2JhY2soUmVnaXN0ZXJNYXNrUGFpcihQaHlzUmVnLCBMYW5lTWFzaykpOworICB9CisgIHZvaWQgYWRkTGl2ZUluKGNvbnN0IFJlZ2lzdGVyTWFza1BhaXIgJlJlZ01hc2tQYWlyKSB7CisgICAgTGl2ZUlucy5wdXNoX2JhY2soUmVnTWFza1BhaXIpOworICB9CisKKyAgLy8vIFNvcnRzIGFuZCB1bmlxdWVzIHRoZSBMaXZlSW5zIHZlY3Rvci4gSXQgY2FuIGJlIHNpZ25pZmljYW50bHkgZmFzdGVyIHRvIGRvCisgIC8vLyB0aGlzIHRoYW4gcmVwZWF0ZWRseSBjYWxsaW5nIGlzTGl2ZUluIGJlZm9yZSBjYWxsaW5nIGFkZExpdmVJbiBmb3IgZXZlcnkKKyAgLy8vIExpdmVJbiBpbnNlcnRpb24uCisgIHZvaWQgc29ydFVuaXF1ZUxpdmVJbnMoKTsKKworICAvLy8gQ2xlYXIgbGl2ZSBpbiBsaXN0LgorICB2b2lkIGNsZWFyTGl2ZUlucygpOworCisgIC8vLyBBZGQgUGh5c1JlZyBhcyBsaXZlIGluIHRvIHRoaXMgYmxvY2ssIGFuZCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBhIGNvcHkgb2YKKyAgLy8vIFBoeXNSZWcgdG8gYSB2aXJ0dWFsIHJlZ2lzdGVyIG9mIGNsYXNzIFJDLiBSZXR1cm4gdGhlIHZpcnR1YWwgcmVnaXN0ZXIKKyAgLy8vIHRoYXQgaXMgYSBjb3B5IG9mIHRoZSBsaXZlIGluIFBoeXNSZWcuCisgIHVuc2lnbmVkIGFkZExpdmVJbihNQ1BoeXNSZWcgUGh5c1JlZywgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpOworCisgIC8vLyBSZW1vdmUgdGhlIHNwZWNpZmllZCByZWdpc3RlciBmcm9tIHRoZSBsaXZlIGluIHNldC4KKyAgdm9pZCByZW1vdmVMaXZlSW4oTUNQaHlzUmVnIFJlZywKKyAgICAgICAgICAgICAgICAgICAgTGFuZUJpdG1hc2sgTGFuZU1hc2sgPSBMYW5lQml0bWFzazo6Z2V0QWxsKCkpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGlzIGluIHRoZSBsaXZlIGluIHNldC4KKyAgYm9vbCBpc0xpdmVJbihNQ1BoeXNSZWcgUmVnLAorICAgICAgICAgICAgICAgIExhbmVCaXRtYXNrIExhbmVNYXNrID0gTGFuZUJpdG1hc2s6OmdldEFsbCgpKSBjb25zdDsKKworICAvLyBJdGVyYXRpb24gc3VwcG9ydCBmb3IgbGl2ZSBpbiBzZXRzLiAgVGhlc2Ugc2V0cyBhcmUga2VwdCBpbiBzb3J0ZWQKKyAgLy8gb3JkZXIgYnkgdGhlaXIgcmVnaXN0ZXIgbnVtYmVyLgorICB1c2luZyBsaXZlaW5faXRlcmF0b3IgPSBMaXZlSW5WZWN0b3I6OmNvbnN0X2l0ZXJhdG9yOworI2lmbmRlZiBOREVCVUcKKyAgLy8vIFVubGlrZSBsaXZlaW5fYmVnaW4sIHRoaXMgbWV0aG9kIGRvZXMgbm90IGNoZWNrIHRoYXQgdGhlIGxpdmVuZXNzCisgIC8vLyBpbmZvcm1hdGlvbiBpcyBhY2N1cmF0ZS4gU3RpbGwgZm9yIGRlYnVnIHB1cnBvc2VzIGl0IG1heSBiZSB1c2VmdWwKKyAgLy8vIHRvIGhhdmUgaXRlcmF0b3JzIHRoYXQgd29uJ3QgYXNzZXJ0IGlmIHRoZSBsaXZlbmVzcyBpbmZvcm1hdGlvbgorICAvLy8gaXMgbm90IGN1cnJlbnQuCisgIGxpdmVpbl9pdGVyYXRvciBsaXZlaW5fYmVnaW5fZGJnKCkgY29uc3QgeyByZXR1cm4gTGl2ZUlucy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yX3JhbmdlPGxpdmVpbl9pdGVyYXRvcj4gbGl2ZWluc19kYmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UobGl2ZWluX2JlZ2luX2RiZygpLCBsaXZlaW5fZW5kKCkpOworICB9CisjZW5kaWYKKyAgbGl2ZWluX2l0ZXJhdG9yIGxpdmVpbl9iZWdpbigpIGNvbnN0OworICBsaXZlaW5faXRlcmF0b3IgbGl2ZWluX2VuZCgpICAgY29uc3QgeyByZXR1cm4gTGl2ZUlucy5lbmQoKTsgfQorICBib29sICAgICAgICAgICAgbGl2ZWluX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gTGl2ZUlucy5lbXB0eSgpOyB9CisgIGl0ZXJhdG9yX3JhbmdlPGxpdmVpbl9pdGVyYXRvcj4gbGl2ZWlucygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShsaXZlaW5fYmVnaW4oKSwgbGl2ZWluX2VuZCgpKTsKKyAgfQorCisgIC8vLyBSZW1vdmUgZW50cnkgZnJvbSB0aGUgbGl2ZWluIHNldCBhbmQgcmV0dXJuIGl0ZXJhdG9yIHRvIHRoZSBuZXh0LgorICBsaXZlaW5faXRlcmF0b3IgcmVtb3ZlTGl2ZUluKGxpdmVpbl9pdGVyYXRvciBJKTsKKworICAvLy8gR2V0IHRoZSBjbG9iYmVyIG1hc2sgZm9yIHRoZSBzdGFydCBvZiB0aGlzIGJhc2ljIGJsb2NrLiBGdW5jbGV0cyB1c2UgdGhpcworICAvLy8gdG8gcHJldmVudCByZWdpc3RlciBhbGxvY2F0aW9uIGFjcm9zcyBmdW5jbGV0IHRyYW5zaXRpb25zLgorICBjb25zdCB1aW50MzJfdCAqZ2V0QmVnaW5DbG9iYmVyTWFzayhjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgY2xvYmJlciBtYXNrIGZvciB0aGUgZW5kIG9mIHRoZSBiYXNpYyBibG9jay4KKyAgLy8vIFxzZWUgZ2V0QmVnaW5DbG9iYmVyTWFzaygpCisgIGNvbnN0IHVpbnQzMl90ICpnZXRFbmRDbG9iYmVyTWFzayhjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhbGlnbm1lbnQgb2YgdGhlIGJhc2ljIGJsb2NrLiBUaGUgYWxpZ25tZW50IGlzIHNwZWNpZmllZCBhcworICAvLy8gbG9nMihieXRlcykuCisgIHVuc2lnbmVkIGdldEFsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIEFsaWdubWVudDsgfQorCisgIC8vLyBTZXQgYWxpZ25tZW50IG9mIHRoZSBiYXNpYyBibG9jay4gVGhlIGFsaWdubWVudCBpcyBzcGVjaWZpZWQgYXMKKyAgLy8vIGxvZzIoYnl0ZXMpLgorICB2b2lkIHNldEFsaWdubWVudCh1bnNpZ25lZCBBbGlnbikgeyBBbGlnbm1lbnQgPSBBbGlnbjsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGJsb2NrIGlzIGEgbGFuZGluZyBwYWQuIFRoYXQgaXMgdGhpcyBiYXNpYyBibG9jayBpcworICAvLy8gZW50ZXJlZCB2aWEgYW4gZXhjZXB0aW9uIGhhbmRsZXIuCisgIGJvb2wgaXNFSFBhZCgpIGNvbnN0IHsgcmV0dXJuIElzRUhQYWQ7IH0KKworICAvLy8gSW5kaWNhdGVzIHRoZSBibG9jayBpcyBhIGxhbmRpbmcgcGFkLiAgVGhhdCBpcyB0aGlzIGJhc2ljIGJsb2NrIGlzIGVudGVyZWQKKyAgLy8vIHZpYSBhbiBleGNlcHRpb24gaGFuZGxlci4KKyAgdm9pZCBzZXRJc0VIUGFkKGJvb2wgViA9IHRydWUpIHsgSXNFSFBhZCA9IFY7IH0KKworICBib29sIGhhc0VIUGFkU3VjY2Vzc29yKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBlbnRyeSBibG9jayBvZiBhbiBFSCBmdW5jbGV0LgorICBib29sIGlzRUhGdW5jbGV0RW50cnkoKSBjb25zdCB7IHJldHVybiBJc0VIRnVuY2xldEVudHJ5OyB9CisKKyAgLy8vIEluZGljYXRlcyBpZiB0aGlzIGlzIHRoZSBlbnRyeSBibG9jayBvZiBhbiBFSCBmdW5jbGV0LgorICB2b2lkIHNldElzRUhGdW5jbGV0RW50cnkoYm9vbCBWID0gdHJ1ZSkgeyBJc0VIRnVuY2xldEVudHJ5ID0gVjsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyB0aGUgZW50cnkgYmxvY2sgb2YgYSBjbGVhbnVwIGZ1bmNsZXQuCisgIGJvb2wgaXNDbGVhbnVwRnVuY2xldEVudHJ5KCkgY29uc3QgeyByZXR1cm4gSXNDbGVhbnVwRnVuY2xldEVudHJ5OyB9CisKKyAgLy8vIEluZGljYXRlcyBpZiB0aGlzIGlzIHRoZSBlbnRyeSBibG9jayBvZiBhIGNsZWFudXAgZnVuY2xldC4KKyAgdm9pZCBzZXRJc0NsZWFudXBGdW5jbGV0RW50cnkoYm9vbCBWID0gdHJ1ZSkgeyBJc0NsZWFudXBGdW5jbGV0RW50cnkgPSBWOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCBpcyBsZWdhbCB0byBob2lzdCBpbnN0cnVjdGlvbnMgaW50byB0aGlzIGJsb2NrLgorICBib29sIGlzTGVnYWxUb0hvaXN0SW50bygpIGNvbnN0OworCisgIC8vIENvZGUgTGF5b3V0IG1ldGhvZHMuCisKKyAgLy8vIE1vdmUgJ3RoaXMnIGJsb2NrIGJlZm9yZSBvciBhZnRlciB0aGUgc3BlY2lmaWVkIGJsb2NrLiAgVGhpcyBvbmx5IG1vdmVzCisgIC8vLyB0aGUgYmxvY2ssIGl0IGRvZXMgbm90IG1vZGlmeSB0aGUgQ0ZHIG9yIGFkanVzdCBwb3RlbnRpYWwgZmFsbC10aHJvdWdocyBhdAorICAvLy8gdGhlIGVuZCBvZiB0aGUgYmxvY2suCisgIHZvaWQgbW92ZUJlZm9yZShNYWNoaW5lQmFzaWNCbG9jayAqTmV3QWZ0ZXIpOworICB2b2lkIG1vdmVBZnRlcihNYWNoaW5lQmFzaWNCbG9jayAqTmV3QmVmb3JlKTsKKworICAvLy8gVXBkYXRlIHRoZSB0ZXJtaW5hdG9yIGluc3RydWN0aW9ucyBpbiBibG9jayB0byBhY2NvdW50IGZvciBjaGFuZ2VzIHRvIHRoZQorICAvLy8gbGF5b3V0LiBJZiB0aGUgYmxvY2sgcHJldmlvdXNseSB1c2VkIGEgZmFsbHRocm91Z2gsIGl0IG1heSBub3cgbmVlZCBhCisgIC8vLyBicmFuY2gsIGFuZCBpZiBpdCBwcmV2aW91c2x5IHVzZWQgYnJhbmNoaW5nIGl0IG1heSBub3cgYmUgYWJsZSB0byB1c2UgYQorICAvLy8gZmFsbHRocm91Z2guCisgIHZvaWQgdXBkYXRlVGVybWluYXRvcigpOworCisgIC8vIE1hY2hpbmUtQ0ZHIG11dGF0b3JzCisKKyAgLy8vIEFkZCBTdWNjIGFzIGEgc3VjY2Vzc29yIG9mIHRoaXMgTWFjaGluZUJhc2ljQmxvY2suICBUaGUgUHJlZGVjZXNzb3JzIGxpc3QKKyAgLy8vIG9mIFN1Y2MgaXMgYXV0b21hdGljYWxseSB1cGRhdGVkLiBQUk9CIHBhcmFtZXRlciBpcyBzdG9yZWQgaW4KKyAgLy8vIFByb2JhYmlsaXRpZXMgbGlzdC4gVGhlIGRlZmF1bHQgcHJvYmFiaWxpdHkgaXMgc2V0IGFzIHVua25vd24uIE1peGluZworICAvLy8ga25vd24gYW5kIHVua25vd24gcHJvYmFiaWxpdGllcyBpbiBzdWNjZXNzb3IgbGlzdCBpcyBub3QgYWxsb3dlZC4gV2hlbiBhbGwKKyAgLy8vIHN1Y2Nlc3NvcnMgaGF2ZSB1bmtub3duIHByb2JhYmlsaXRpZXMsIDEgLyBOIGlzIHJldHVybmVkIGFzIHRoZQorICAvLy8gcHJvYmFiaWxpdHkgZm9yIGVhY2ggc3VjY2Vzc29yLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc29ycy4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgZHVwbGljYXRlIE1hY2hpbmUgQ0ZHIGVkZ2VzIGFyZSBub3QgYWxsb3dlZC4KKyAgdm9pZCBhZGRTdWNjZXNzb3IoTWFjaGluZUJhc2ljQmxvY2sgKlN1Y2MsCisgICAgICAgICAgICAgICAgICAgIEJyYW5jaFByb2JhYmlsaXR5IFByb2IgPSBCcmFuY2hQcm9iYWJpbGl0eTo6Z2V0VW5rbm93bigpKTsKKworICAvLy8gQWRkIFN1Y2MgYXMgYSBzdWNjZXNzb3Igb2YgdGhpcyBNYWNoaW5lQmFzaWNCbG9jay4gIFRoZSBQcmVkZWNlc3NvcnMgbGlzdAorICAvLy8gb2YgU3VjYyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQuIFRoZSBwcm9iYWJpbGl0eSBpcyBub3QgcHJvdmlkZWQgYmVjYXVzZQorICAvLy8gQlBJIGlzIG5vdCBhdmFpbGFibGUgKGUuZy4gLU8wIGlzIHVzZWQpLCBpbiB3aGljaCBjYXNlIGVkZ2UgcHJvYmFiaWxpdGllcworICAvLy8gd29uJ3QgYmUgdXNlZC4gVXNpbmcgdGhpcyBpbnRlcmZhY2UgY2FuIHNhdmUgc29tZSBzcGFjZS4KKyAgdm9pZCBhZGRTdWNjZXNzb3JXaXRob3V0UHJvYihNYWNoaW5lQmFzaWNCbG9jayAqU3VjYyk7CisKKyAgLy8vIFNldCBzdWNjZXNzb3IgcHJvYmFiaWxpdHkgb2YgYSBnaXZlbiBpdGVyYXRvci4KKyAgdm9pZCBzZXRTdWNjUHJvYmFiaWxpdHkoc3VjY19pdGVyYXRvciBJLCBCcmFuY2hQcm9iYWJpbGl0eSBQcm9iKTsKKworICAvLy8gTm9ybWFsaXplIHByb2JhYmlsaXRpZXMgb2YgYWxsIHN1Y2Nlc3NvcnMgc28gdGhhdCB0aGUgc3VtIG9mIHRoZW0gYmVjb21lcworICAvLy8gb25lLiBUaGlzIGlzIHVzdWFsbHkgZG9uZSB3aGVuIHRoZSBjdXJyZW50IHVwZGF0ZSBvbiB0aGlzIE1CQiBpcyBkb25lLCBhbmQKKyAgLy8vIHRoZSBzdW0gb2YgaXRzIHN1Y2Nlc3NvcnMnIHByb2JhYmlsaXRpZXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgb25lLiBUaGUKKyAgLy8vIHVzZXIgaXMgcmVzcG9uc2libGUgZm9yIHRoZSBjb3JyZWN0IHVzZSBvZiB0aGlzIGZ1bmN0aW9uLgorICAvLy8gTUJCOjpyZW1vdmVTdWNjZXNzb3IoKSBoYXMgYW4gb3B0aW9uIHRvIGRvIHRoaXMgYXV0b21hdGljYWxseS4KKyAgdm9pZCBub3JtYWxpemVTdWNjUHJvYnMoKSB7CisgICAgQnJhbmNoUHJvYmFiaWxpdHk6Om5vcm1hbGl6ZVByb2JhYmlsaXRpZXMoUHJvYnMuYmVnaW4oKSwgUHJvYnMuZW5kKCkpOworICB9CisKKyAgLy8vIFZhbGlkYXRlIHN1Y2Nlc3NvcnMnIHByb2JhYmlsaXRpZXMgYW5kIGNoZWNrIGlmIHRoZSBzdW0gb2YgdGhlbSBpcworICAvLy8gYXBwcm94aW1hdGUgb25lLiBUaGlzIG9ubHkgd29ya3MgaW4gREVCVUcgbW9kZS4KKyAgdm9pZCB2YWxpZGF0ZVN1Y2NQcm9icygpIGNvbnN0OworCisgIC8vLyBSZW1vdmUgc3VjY2Vzc29yIGZyb20gdGhlIHN1Y2Nlc3NvcnMgbGlzdCBvZiB0aGlzIE1hY2hpbmVCYXNpY0Jsb2NrLiBUaGUKKyAgLy8vIFByZWRlY2Vzc29ycyBsaXN0IG9mIFN1Y2MgaXMgYXV0b21hdGljYWxseSB1cGRhdGVkLgorICAvLy8gSWYgTm9ybWFsaXplU3VjY1Byb2JzIGlzIHRydWUsIHRoZW4gbm9ybWFsaXplIHN1Y2Nlc3NvcnMnIHByb2JhYmlsaXRpZXMKKyAgLy8vIGFmdGVyIHRoZSBzdWNjZXNzb3IgaXMgcmVtb3ZlZC4KKyAgdm9pZCByZW1vdmVTdWNjZXNzb3IoTWFjaGluZUJhc2ljQmxvY2sgKlN1Y2MsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTm9ybWFsaXplU3VjY1Byb2JzID0gZmFsc2UpOworCisgIC8vLyBSZW1vdmUgc3BlY2lmaWVkIHN1Y2Nlc3NvciBmcm9tIHRoZSBzdWNjZXNzb3JzIGxpc3Qgb2YgdGhpcworICAvLy8gTWFjaGluZUJhc2ljQmxvY2suIFRoZSBQcmVkZWNlc3NvcnMgbGlzdCBvZiBTdWNjIGlzIGF1dG9tYXRpY2FsbHkgdXBkYXRlZC4KKyAgLy8vIElmIE5vcm1hbGl6ZVN1Y2NQcm9icyBpcyB0cnVlLCB0aGVuIG5vcm1hbGl6ZSBzdWNjZXNzb3JzJyBwcm9iYWJpbGl0aWVzCisgIC8vLyBhZnRlciB0aGUgc3VjY2Vzc29yIGlzIHJlbW92ZWQuCisgIC8vLyBSZXR1cm4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBvbmUgcmVtb3ZlZC4KKyAgc3VjY19pdGVyYXRvciByZW1vdmVTdWNjZXNzb3Ioc3VjY19pdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE5vcm1hbGl6ZVN1Y2NQcm9icyA9IGZhbHNlKTsKKworICAvLy8gUmVwbGFjZSBzdWNjZXNzb3IgT0xEIHdpdGggTkVXIGFuZCB1cGRhdGUgcHJvYmFiaWxpdHkgaW5mby4KKyAgdm9pZCByZXBsYWNlU3VjY2Vzc29yKE1hY2hpbmVCYXNpY0Jsb2NrICpPbGQsIE1hY2hpbmVCYXNpY0Jsb2NrICpOZXcpOworCisgIC8vLyBDb3B5IGEgc3VjY2Vzc29yIChhbmQgYW55IHByb2JhYmlsaXR5IGluZm8pIGZyb20gb3JpZ2luYWwgYmxvY2sgdG8gdGhpcworICAvLy8gYmxvY2sncy4gVXNlcyBhbiBpdGVyYXRvciBpbnRvIHRoZSBvcmlnaW5hbCBibG9ja3Mgc3VjY2Vzc29ycy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWZ1bCB3aGVuIGRvaW5nIGEgcGFydGlhbCBjbG9uZSBvZiBzdWNjZXNzb3JzLiBBZnRlcndhcmQsIHRoZQorICAvLy8gcHJvYmFiaWxpdGllcyBtYXkgbmVlZCB0byBiZSBub3JtYWxpemVkLgorICB2b2lkIGNvcHlTdWNjZXNzb3IoTWFjaGluZUJhc2ljQmxvY2sgKk9yaWcsIHN1Y2NfaXRlcmF0b3IgSSk7CisKKyAgLy8vIFRyYW5zZmVycyBhbGwgdGhlIHN1Y2Nlc3NvcnMgZnJvbSBNQkIgdG8gdGhpcyBtYWNoaW5lIGJhc2ljIGJsb2NrIChpLmUuLAorICAvLy8gY29waWVzIGFsbCB0aGUgc3VjY2Vzc29ycyBGcm9tTUJCIGFuZCByZW1vdmUgYWxsIHRoZSBzdWNjZXNzb3JzIGZyb20KKyAgLy8vIEZyb21NQkIpLgorICB2b2lkIHRyYW5zZmVyU3VjY2Vzc29ycyhNYWNoaW5lQmFzaWNCbG9jayAqRnJvbU1CQik7CisKKyAgLy8vIFRyYW5zZmVycyBhbGwgdGhlIHN1Y2Nlc3NvcnMsIGFzIGluIHRyYW5zZmVyU3VjY2Vzc29ycywgYW5kIHVwZGF0ZSBQSEkKKyAgLy8vIG9wZXJhbmRzIGluIHRoZSBzdWNjZXNzb3IgYmxvY2tzIHdoaWNoIHJlZmVyIHRvIEZyb21NQkIgdG8gcmVmZXIgdG8gdGhpcy4KKyAgdm9pZCB0cmFuc2ZlclN1Y2Nlc3NvcnNBbmRVcGRhdGVQSElzKE1hY2hpbmVCYXNpY0Jsb2NrICpGcm9tTUJCKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgYW55IG9mIHRoZSBzdWNjZXNzb3JzIGhhdmUgcHJvYmFiaWxpdGllcyBhdHRhY2hlZCB0byB0aGVtLgorICBib29sIGhhc1N1Y2Nlc3NvclByb2JhYmlsaXRpZXMoKSBjb25zdCB7IHJldHVybiAhUHJvYnMuZW1wdHkoKTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIE1CQiBpcyBhIHByZWRlY2Vzc29yIG9mIHRoaXMgYmxvY2suCisgIGJvb2wgaXNQcmVkZWNlc3Nvcihjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBNQkIgaXMgYSBzdWNjZXNzb3Igb2YgdGhpcyBibG9jay4KKyAgYm9vbCBpc1N1Y2Nlc3Nvcihjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBNQkIgd2lsbCBiZSBlbWl0dGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMKKyAgLy8vIGJsb2NrLCBzdWNoIHRoYXQgaWYgdGhpcyBibG9jayBleGl0cyBieSBmYWxsaW5nIHRocm91Z2gsIGNvbnRyb2wgd2lsbAorICAvLy8gdHJhbnNmZXIgdG8gdGhlIHNwZWNpZmllZCBNQkIuIE5vdGUgdGhhdCBNQkIgbmVlZCBub3QgYmUgYSBzdWNjZXNzb3IgYXQKKyAgLy8vIGFsbCwgZm9yIGV4YW1wbGUgaWYgdGhpcyBibG9jayBlbmRzIHdpdGggYW4gdW5jb25kaXRpb25hbCBicmFuY2ggdG8gc29tZQorICAvLy8gb3RoZXIgYmxvY2suCisgIGJvb2wgaXNMYXlvdXRTdWNjZXNzb3IoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgZmFsbHRocm91Z2ggYmxvY2sgaWYgdGhlIGJsb2NrIGNhbiBpbXBsaWNpdGx5CisgIC8vLyB0cmFuc2ZlciBjb250cm9sIHRvIHRoZSBibG9jayBhZnRlciBpdCBieSBmYWxsaW5nIG9mZiB0aGUgZW5kIG9mCisgIC8vLyBpdC4gIFRoaXMgc2hvdWxkIHJldHVybiBudWxsIGlmIGl0IGNhbiByZWFjaCB0aGUgYmxvY2sgYWZ0ZXIKKyAgLy8vIGl0LCBidXQgaXQgdXNlcyBhbiBleHBsaWNpdCBicmFuY2ggdG8gZG8gc28gKGUuZy4sIGEgdGFibGUKKyAgLy8vIGp1bXApLiAgTm9uLW51bGwgcmV0dXJuICBpcyBhIGNvbnNlcnZhdGl2ZSBhbnN3ZXIuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpnZXRGYWxsVGhyb3VnaCgpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYmxvY2sgY2FuIGltcGxpY2l0bHkgdHJhbnNmZXIgY29udHJvbCB0byB0aGUKKyAgLy8vIGJsb2NrIGFmdGVyIGl0IGJ5IGZhbGxpbmcgb2ZmIHRoZSBlbmQgb2YgaXQuICBUaGlzIHNob3VsZCByZXR1cm4KKyAgLy8vIGZhbHNlIGlmIGl0IGNhbiByZWFjaCB0aGUgYmxvY2sgYWZ0ZXIgaXQsIGJ1dCBpdCB1c2VzIGFuCisgIC8vLyBleHBsaWNpdCBicmFuY2ggdG8gZG8gc28gKGUuZy4sIGEgdGFibGUganVtcCkuICBUcnVlIGlzIGEKKyAgLy8vIGNvbnNlcnZhdGl2ZSBhbnN3ZXIuCisgIGJvb2wgY2FuRmFsbFRocm91Z2goKTsKKworICAvLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGluc3RydWN0aW9uIGluIHRoaXMgYmxvY2sgdGhhdCBpcyBub3QgYQorICAvLy8gUEhJTm9kZSBpbnN0cnVjdGlvbi4gV2hlbiBhZGRpbmcgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgIC8vLyBiYXNpYyBibG9jaywgdGhleSBzaG91bGQgYmUgYWRkZWQgYmVmb3JlIHRoZSByZXR1cm5lZCB2YWx1ZSwgbm90IGJlZm9yZQorICAvLy8gdGhlIGZpcnN0IGluc3RydWN0aW9uLCB3aGljaCBtaWdodCBiZSBQSEkuCisgIC8vLyBSZXR1cm5zIGVuZCgpIGlzIHRoZXJlJ3Mgbm8gbm9uLVBISSBpbnN0cnVjdGlvbi4KKyAgaXRlcmF0b3IgZ2V0Rmlyc3ROb25QSEkoKTsKKworICAvLy8gUmV0dXJuIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpbiBNQkIgYWZ0ZXIgSSB0aGF0IGlzIG5vdCBhIFBISSBvciBhIGxhYmVsLgorICAvLy8gVGhpcyBpcyB0aGUgY29ycmVjdCBwb2ludCB0byBpbnNlcnQgbG93ZXJlZCBjb3BpZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhCisgIC8vLyBiYXNpYyBibG9jayB0aGF0IG11c3QgYmUgYmVmb3JlIGFueSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisgIGl0ZXJhdG9yIFNraXBQSElzQW5kTGFiZWxzKGl0ZXJhdG9yIEkpOworCisgIC8vLyBSZXR1cm4gdGhlIGZpcnN0IGluc3RydWN0aW9uIGluIE1CQiBhZnRlciBJIHRoYXQgaXMgbm90IGEgUEhJLCBsYWJlbCBvcgorICAvLy8gZGVidWcuICBUaGlzIGlzIHRoZSBjb3JyZWN0IHBvaW50IHRvIGluc2VydCBjb3BpZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhCisgIC8vLyBiYXNpYyBibG9jay4KKyAgaXRlcmF0b3IgU2tpcFBISXNMYWJlbHNBbmREZWJ1ZyhpdGVyYXRvciBJKTsKKworICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZmlyc3QgdGVybWluYXRvciBpbnN0cnVjdGlvbiBvZiB0aGlzIGJhc2ljCisgIC8vLyBibG9jay4gSWYgYSB0ZXJtaW5hdG9yIGRvZXMgbm90IGV4aXN0LCBpdCByZXR1cm5zIGVuZCgpLgorICBpdGVyYXRvciBnZXRGaXJzdFRlcm1pbmF0b3IoKTsKKyAgY29uc3RfaXRlcmF0b3IgZ2V0Rmlyc3RUZXJtaW5hdG9yKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PE1hY2hpbmVCYXNpY0Jsb2NrICo+KHRoaXMpLT5nZXRGaXJzdFRlcm1pbmF0b3IoKTsKKyAgfQorCisgIC8vLyBTYW1lIGdldEZpcnN0VGVybWluYXRvciBidXQgaXQgaWdub3JlcyBidW5kbGVzIGFuZCByZXR1cm4gYW4KKyAgLy8vIGluc3RyX2l0ZXJhdG9yIGluc3RlYWQuCisgIGluc3RyX2l0ZXJhdG9yIGdldEZpcnN0SW5zdHJUZXJtaW5hdG9yKCk7CisKKyAgLy8vIFJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGZpcnN0IG5vbi1kZWJ1ZyBpbnN0cnVjdGlvbiBpbiB0aGUgYmFzaWMgYmxvY2ssCisgIC8vLyBvciBlbmQoKS4KKyAgaXRlcmF0b3IgZ2V0Rmlyc3ROb25EZWJ1Z0luc3RyKCk7CisgIGNvbnN0X2l0ZXJhdG9yIGdldEZpcnN0Tm9uRGVidWdJbnN0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxNYWNoaW5lQmFzaWNCbG9jayAqPih0aGlzKS0+Z2V0Rmlyc3ROb25EZWJ1Z0luc3RyKCk7CisgIH0KKworICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgbGFzdCBub24tZGVidWcgaW5zdHJ1Y3Rpb24gaW4gdGhlIGJhc2ljIGJsb2NrLAorICAvLy8gb3IgZW5kKCkuCisgIGl0ZXJhdG9yIGdldExhc3ROb25EZWJ1Z0luc3RyKCk7CisgIGNvbnN0X2l0ZXJhdG9yIGdldExhc3ROb25EZWJ1Z0luc3RyKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PE1hY2hpbmVCYXNpY0Jsb2NrICo+KHRoaXMpLT5nZXRMYXN0Tm9uRGVidWdJbnN0cigpOworICB9CisKKyAgLy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBibG9jayBlbmRzIGluIGEgcmV0dXJuCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgYm9vbCBpc1JldHVybkJsb2NrKCkgY29uc3QgeworICAgIHJldHVybiAhZW1wdHkoKSAmJiBiYWNrKCkuaXNSZXR1cm4oKTsKKyAgfQorCisgIC8vLyBTcGxpdCB0aGUgY3JpdGljYWwgZWRnZSBmcm9tIHRoaXMgYmxvY2sgdG8gdGhlIGdpdmVuIHN1Y2Nlc3NvciBibG9jaywgYW5kCisgIC8vLyByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgYmxvY2ssIG9yIG51bGwgaWYgc3BsaXR0aW5nIGlzIG5vdCBwb3NzaWJsZS4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgTGl2ZVZhcmlhYmxlcywgTWFjaGluZURvbWluYXRvclRyZWUsIGFuZAorICAvLy8gTWFjaGluZUxvb3BJbmZvLCBhcyBhcHBsaWNhYmxlLgorICBNYWNoaW5lQmFzaWNCbG9jayAqU3BsaXRDcml0aWNhbEVkZ2UoTWFjaGluZUJhc2ljQmxvY2sgKlN1Y2MsIFBhc3MgJlApOworCisgIC8vLyBDaGVjayBpZiB0aGUgZWRnZSBiZXR3ZWVuIHRoaXMgYmxvY2sgYW5kIHRoZSBnaXZlbiBzdWNjZXNzb3IgXHAKKyAgLy8vIFN1Y2MsIGNhbiBiZSBzcGxpdC4gSWYgdGhpcyByZXR1cm5zIHRydWUgYSBzdWJzZXF1ZW50IGNhbGwgdG8KKyAgLy8vIFNwbGl0Q3JpdGljYWxFZGdlIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgdmFsaWQgYmFzaWMgYmxvY2sgaWYKKyAgLy8vIG5vIGNoYW5nZXMgb2NjdXJyZWQgaW4gdGhlIG1lYW50aW1lLgorICBib29sIGNhblNwbGl0Q3JpdGljYWxFZGdlKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpTdWNjKSBjb25zdDsKKworICB2b2lkIHBvcF9mcm9udCgpIHsgSW5zdHMucG9wX2Zyb250KCk7IH0KKyAgdm9pZCBwb3BfYmFjaygpIHsgSW5zdHMucG9wX2JhY2soKTsgfQorICB2b2lkIHB1c2hfYmFjayhNYWNoaW5lSW5zdHIgKk1JKSB7IEluc3RzLnB1c2hfYmFjayhNSSk7IH0KKworICAvLy8gSW5zZXJ0IE1JIGludG8gdGhlIGluc3RydWN0aW9uIGxpc3QgYmVmb3JlIEksIHBvc3NpYmx5IGluc2lkZSBhIGJ1bmRsZS4KKyAgLy8vCisgIC8vLyBJZiB0aGUgaW5zZXJ0aW9uIHBvaW50IGlzIGluc2lkZSBhIGJ1bmRsZSwgTUkgd2lsbCBiZSBhZGRlZCB0byB0aGUgYnVuZGxlLAorICAvLy8gb3RoZXJ3aXNlIE1JIHdpbGwgbm90IGJlIGFkZGVkIHRvIGFueSBidW5kbGUuIFRoYXQgbWVhbnMgdGhpcyBmdW5jdGlvbgorICAvLy8gYWxvbmUgY2FuJ3QgYmUgdXNlZCB0byBwcmVwZW5kIG9yIGFwcGVuZCBpbnN0cnVjdGlvbnMgdG8gYnVuZGxlcy4gU2VlCisgIC8vLyBNSUJ1bmRsZUJ1aWxkZXI6Omluc2VydCgpIGZvciBhIG1vcmUgcmVsaWFibGUgd2F5IG9mIGRvaW5nIHRoYXQuCisgIGluc3RyX2l0ZXJhdG9yIGluc2VydChpbnN0cl9pdGVyYXRvciBJLCBNYWNoaW5lSW5zdHIgKk0pOworCisgIC8vLyBJbnNlcnQgYSByYW5nZSBvZiBpbnN0cnVjdGlvbnMgaW50byB0aGUgaW5zdHJ1Y3Rpb24gbGlzdCBiZWZvcmUgSS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSVQ+CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIEksIElUIFMsIElUIEUpIHsKKyAgICBhc3NlcnQoKEkgPT0gZW5kKCkgfHwgSS0+Z2V0UGFyZW50KCkgPT0gdGhpcykgJiYKKyAgICAgICAgICAgIml0ZXJhdG9yIHBvaW50cyBvdXRzaWRlIG9mIGJhc2ljIGJsb2NrIik7CisgICAgSW5zdHMuaW5zZXJ0KEkuZ2V0SW5zdHJJdGVyYXRvcigpLCBTLCBFKTsKKyAgfQorCisgIC8vLyBJbnNlcnQgTUkgaW50byB0aGUgaW5zdHJ1Y3Rpb24gbGlzdCBiZWZvcmUgSS4KKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIEksIE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgICBhc3NlcnQoKEkgPT0gZW5kKCkgfHwgSS0+Z2V0UGFyZW50KCkgPT0gdGhpcykgJiYKKyAgICAgICAgICAgIml0ZXJhdG9yIHBvaW50cyBvdXRzaWRlIG9mIGJhc2ljIGJsb2NrIik7CisgICAgYXNzZXJ0KCFNSS0+aXNCdW5kbGVkV2l0aFByZWQoKSAmJiAhTUktPmlzQnVuZGxlZFdpdGhTdWNjKCkgJiYKKyAgICAgICAgICAgIkNhbm5vdCBpbnNlcnQgaW5zdHJ1Y3Rpb24gd2l0aCBidW5kbGUgZmxhZ3MiKTsKKyAgICByZXR1cm4gSW5zdHMuaW5zZXJ0KEkuZ2V0SW5zdHJJdGVyYXRvcigpLCBNSSk7CisgIH0KKworICAvLy8gSW5zZXJ0IE1JIGludG8gdGhlIGluc3RydWN0aW9uIGxpc3QgYWZ0ZXIgSS4KKyAgaXRlcmF0b3IgaW5zZXJ0QWZ0ZXIoaXRlcmF0b3IgSSwgTWFjaGluZUluc3RyICpNSSkgeworICAgIGFzc2VydCgoSSA9PSBlbmQoKSB8fCBJLT5nZXRQYXJlbnQoKSA9PSB0aGlzKSAmJgorICAgICAgICAgICAiaXRlcmF0b3IgcG9pbnRzIG91dHNpZGUgb2YgYmFzaWMgYmxvY2siKTsKKyAgICBhc3NlcnQoIU1JLT5pc0J1bmRsZWRXaXRoUHJlZCgpICYmICFNSS0+aXNCdW5kbGVkV2l0aFN1Y2MoKSAmJgorICAgICAgICAgICAiQ2Fubm90IGluc2VydCBpbnN0cnVjdGlvbiB3aXRoIGJ1bmRsZSBmbGFncyIpOworICAgIHJldHVybiBJbnN0cy5pbnNlcnRBZnRlcihJLmdldEluc3RySXRlcmF0b3IoKSwgTUkpOworICB9CisKKyAgLy8vIFJlbW92ZSBhbiBpbnN0cnVjdGlvbiBmcm9tIHRoZSBpbnN0cnVjdGlvbiBsaXN0IGFuZCBkZWxldGUgaXQuCisgIC8vLworICAvLy8gSWYgdGhlIGluc3RydWN0aW9uIGlzIHBhcnQgb2YgYSBidW5kbGUsIHRoZSBvdGhlciBpbnN0cnVjdGlvbnMgaW4gdGhlCisgIC8vLyBidW5kbGUgd2lsbCBzdGlsbCBiZSBidW5kbGVkIGFmdGVyIHJlbW92aW5nIHRoZSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCisgIGluc3RyX2l0ZXJhdG9yIGVyYXNlKGluc3RyX2l0ZXJhdG9yIEkpOworCisgIC8vLyBSZW1vdmUgYW4gaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gbGlzdCBhbmQgZGVsZXRlIGl0LgorICAvLy8KKyAgLy8vIElmIHRoZSBpbnN0cnVjdGlvbiBpcyBwYXJ0IG9mIGEgYnVuZGxlLCB0aGUgb3RoZXIgaW5zdHJ1Y3Rpb25zIGluIHRoZQorICAvLy8gYnVuZGxlIHdpbGwgc3RpbGwgYmUgYnVuZGxlZCBhZnRlciByZW1vdmluZyB0aGUgc2luZ2xlIGluc3RydWN0aW9uLgorICBpbnN0cl9pdGVyYXRvciBlcmFzZV9pbnN0cihNYWNoaW5lSW5zdHIgKkkpIHsKKyAgICByZXR1cm4gZXJhc2UoaW5zdHJfaXRlcmF0b3IoSSkpOworICB9CisKKyAgLy8vIFJlbW92ZSBhIHJhbmdlIG9mIGluc3RydWN0aW9ucyBmcm9tIHRoZSBpbnN0cnVjdGlvbiBsaXN0IGFuZCBkZWxldGUgdGhlbS4KKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgSSwgaXRlcmF0b3IgRSkgeworICAgIHJldHVybiBJbnN0cy5lcmFzZShJLmdldEluc3RySXRlcmF0b3IoKSwgRS5nZXRJbnN0ckl0ZXJhdG9yKCkpOworICB9CisKKyAgLy8vIFJlbW92ZSBhbiBpbnN0cnVjdGlvbiBvciBidW5kbGUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gbGlzdCBhbmQgZGVsZXRlIGl0LgorICAvLy8KKyAgLy8vIElmIEkgcG9pbnRzIHRvIGEgYnVuZGxlIG9mIGluc3RydWN0aW9ucywgdGhleSBhcmUgYWxsIGVyYXNlZC4KKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgSSkgeworICAgIHJldHVybiBlcmFzZShJLCBzdGQ6Om5leHQoSSkpOworICB9CisKKyAgLy8vIFJlbW92ZSBhbiBpbnN0cnVjdGlvbiBmcm9tIHRoZSBpbnN0cnVjdGlvbiBsaXN0IGFuZCBkZWxldGUgaXQuCisgIC8vLworICAvLy8gSWYgSSBpcyB0aGUgaGVhZCBvZiBhIGJ1bmRsZSBvZiBpbnN0cnVjdGlvbnMsIHRoZSB3aG9sZSBidW5kbGUgd2lsbCBiZQorICAvLy8gZXJhc2VkLgorICBpdGVyYXRvciBlcmFzZShNYWNoaW5lSW5zdHIgKkkpIHsKKyAgICByZXR1cm4gZXJhc2UoaXRlcmF0b3IoSSkpOworICB9CisKKyAgLy8vIFJlbW92ZSB0aGUgdW5idW5kbGVkIGluc3RydWN0aW9uIGZyb20gdGhlIGluc3RydWN0aW9uIGxpc3Qgd2l0aG91dAorICAvLy8gZGVsZXRpbmcgaXQuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBjYW4gbm90IGJlIHVzZWQgdG8gcmVtb3ZlIGJ1bmRsZWQgaW5zdHJ1Y3Rpb25zLCB1c2UKKyAgLy8vIHJlbW92ZV9pbnN0ciB0byByZW1vdmUgaW5kaXZpZHVhbCBpbnN0cnVjdGlvbnMgZnJvbSBhIGJ1bmRsZS4KKyAgTWFjaGluZUluc3RyICpyZW1vdmUoTWFjaGluZUluc3RyICpJKSB7CisgICAgYXNzZXJ0KCFJLT5pc0J1bmRsZWQoKSAmJiAiQ2Fubm90IHJlbW92ZSBidW5kbGVkIGluc3RydWN0aW9ucyIpOworICAgIHJldHVybiBJbnN0cy5yZW1vdmUoaW5zdHJfaXRlcmF0b3IoSSkpOworICB9CisKKyAgLy8vIFJlbW92ZSB0aGUgcG9zc2libHkgYnVuZGxlZCBpbnN0cnVjdGlvbiBmcm9tIHRoZSBpbnN0cnVjdGlvbiBsaXN0CisgIC8vLyB3aXRob3V0IGRlbGV0aW5nIGl0LgorICAvLy8KKyAgLy8vIElmIHRoZSBpbnN0cnVjdGlvbiBpcyBwYXJ0IG9mIGEgYnVuZGxlLCB0aGUgb3RoZXIgaW5zdHJ1Y3Rpb25zIGluIHRoZQorICAvLy8gYnVuZGxlIHdpbGwgc3RpbGwgYmUgYnVuZGxlZCBhZnRlciByZW1vdmluZyB0aGUgc2luZ2xlIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHIgKnJlbW92ZV9pbnN0cihNYWNoaW5lSW5zdHIgKkkpOworCisgIHZvaWQgY2xlYXIoKSB7CisgICAgSW5zdHMuY2xlYXIoKTsKKyAgfQorCisgIC8vLyBUYWtlIGFuIGluc3RydWN0aW9uIGZyb20gTUJCICdPdGhlcicgYXQgdGhlIHBvc2l0aW9uIEZyb20sIGFuZCBpbnNlcnQgaXQKKyAgLy8vIGludG8gdGhpcyBNQkIgcmlnaHQgYmVmb3JlICdXaGVyZScuCisgIC8vLworICAvLy8gSWYgRnJvbSBwb2ludHMgdG8gYSBidW5kbGUgb2YgaW5zdHJ1Y3Rpb25zLCB0aGUgd2hvbGUgYnVuZGxlIGlzIG1vdmVkLgorICB2b2lkIHNwbGljZShpdGVyYXRvciBXaGVyZSwgTWFjaGluZUJhc2ljQmxvY2sgKk90aGVyLCBpdGVyYXRvciBGcm9tKSB7CisgICAgLy8gVGhlIHJhbmdlIHNwbGljZSgpIGRvZXNuJ3QgYWxsb3cgbm9vcCBtb3ZlcywgYnV0IHRoaXMgb25lIGRvZXMuCisgICAgaWYgKFdoZXJlICE9IEZyb20pCisgICAgICBzcGxpY2UoV2hlcmUsIE90aGVyLCBGcm9tLCBzdGQ6Om5leHQoRnJvbSkpOworICB9CisKKyAgLy8vIFRha2UgYSBibG9jayBvZiBpbnN0cnVjdGlvbnMgZnJvbSBNQkIgJ090aGVyJyBpbiB0aGUgcmFuZ2UgW0Zyb20sIFRvKSwKKyAgLy8vIGFuZCBpbnNlcnQgdGhlbSBpbnRvIHRoaXMgTUJCIHJpZ2h0IGJlZm9yZSAnV2hlcmUnLgorICAvLy8KKyAgLy8vIFRoZSBpbnN0cnVjdGlvbiBhdCAnV2hlcmUnIG11c3Qgbm90IGJlIGluY2x1ZGVkIGluIHRoZSByYW5nZSBvZgorICAvLy8gaW5zdHJ1Y3Rpb25zIHRvIG1vdmUuCisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIFdoZXJlLCBNYWNoaW5lQmFzaWNCbG9jayAqT3RoZXIsCisgICAgICAgICAgICAgIGl0ZXJhdG9yIEZyb20sIGl0ZXJhdG9yIFRvKSB7CisgICAgSW5zdHMuc3BsaWNlKFdoZXJlLmdldEluc3RySXRlcmF0b3IoKSwgT3RoZXItPkluc3RzLAorICAgICAgICAgICAgICAgICBGcm9tLmdldEluc3RySXRlcmF0b3IoKSwgVG8uZ2V0SW5zdHJJdGVyYXRvcigpKTsKKyAgfQorCisgIC8vLyBUaGlzIG1ldGhvZCB1bmxpbmtzICd0aGlzJyBmcm9tIHRoZSBjb250YWluaW5nIGZ1bmN0aW9uLCBhbmQgcmV0dXJucyBpdCwKKyAgLy8vIGJ1dCBkb2VzIG5vdCBkZWxldGUgaXQuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpyZW1vdmVGcm9tUGFyZW50KCk7CisKKyAgLy8vIFRoaXMgbWV0aG9kIHVubGlua3MgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgZnVuY3Rpb24gYW5kIGRlbGV0ZXMgaXQuCisgIHZvaWQgZXJhc2VGcm9tUGFyZW50KCk7CisKKyAgLy8vIEdpdmVuIGEgbWFjaGluZSBiYXNpYyBibG9jayB0aGF0IGJyYW5jaGVkIHRvICdPbGQnLCBjaGFuZ2UgdGhlIGNvZGUgYW5kCisgIC8vLyBDRkcgc28gdGhhdCBpdCBicmFuY2hlcyB0byAnTmV3JyBpbnN0ZWFkLgorICB2b2lkIFJlcGxhY2VVc2VzT2ZCbG9ja1dpdGgoTWFjaGluZUJhc2ljQmxvY2sgKk9sZCwgTWFjaGluZUJhc2ljQmxvY2sgKk5ldyk7CisKKyAgLy8vIFZhcmlvdXMgcGllY2VzIG9mIGNvZGUgY2FuIGNhdXNlIGV4Y2VzcyBlZGdlcyBpbiB0aGUgQ0ZHIHRvIGJlIGluc2VydGVkLgorICAvLy8gSWYgd2UgaGF2ZSBwcm92ZW4gdGhhdCBNQkIgY2FuIG9ubHkgYnJhbmNoIHRvIERlc3RBIGFuZCBEZXN0QiwgcmVtb3ZlIGFueQorICAvLy8gb3RoZXIgTUJCIHN1Y2Nlc3NvcnMgZnJvbSB0aGUgQ0ZHLiBEZXN0QSBhbmQgRGVzdEIgY2FuIGJlIG51bGwuIEJlc2lkZXMKKyAgLy8vIERlc3RBIGFuZCBEZXN0QiwgcmV0YWluIG90aGVyIGVkZ2VzIGxlYWRpbmcgdG8gTGFuZGluZ1BhZHMgKGN1cnJlbnRseQorICAvLy8gdGhlcmUgY2FuIGJlIG9ubHkgb25lOyB3ZSBkb24ndCBjaGVjayBvciByZXF1aXJlIHRoYXQgaGVyZSkuIE5vdGUgaXQgaXMKKyAgLy8vIHBvc3NpYmxlIHRoYXQgRGVzdEEgYW5kL29yIERlc3RCIGFyZSBMYW5kaW5nUGFkcy4KKyAgYm9vbCBDb3JyZWN0RXh0cmFDRkdFZGdlcyhNYWNoaW5lQmFzaWNCbG9jayAqRGVzdEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkRlc3RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNDb25kKTsKKworICAvLy8gRmluZCB0aGUgbmV4dCB2YWxpZCBEZWJ1Z0xvYyBzdGFydGluZyBhdCBNQkJJLCBza2lwcGluZyBhbnkgREJHX1ZBTFVFCisgIC8vLyBpbnN0cnVjdGlvbnMuICBSZXR1cm4gVW5rbm93bkxvYyBpZiB0aGVyZSBpcyBub25lLgorICBEZWJ1Z0xvYyBmaW5kRGVidWdMb2MoaW5zdHJfaXRlcmF0b3IgTUJCSSk7CisgIERlYnVnTG9jIGZpbmREZWJ1Z0xvYyhpdGVyYXRvciBNQkJJKSB7CisgICAgcmV0dXJuIGZpbmREZWJ1Z0xvYyhNQkJJLmdldEluc3RySXRlcmF0b3IoKSk7CisgIH0KKworICAvLy8gRmluZCB0aGUgcHJldmlvdXMgdmFsaWQgRGVidWdMb2MgcHJlY2VkaW5nIE1CQkksIHNraXBwaW5nIGFuZCBEQkdfVkFMVUUKKyAgLy8vIGluc3RydWN0aW9ucy4gIFJldHVybiBVbmtub3duTG9jIGlmIHRoZXJlIGlzIG5vbmUuCisgIERlYnVnTG9jIGZpbmRQcmV2RGVidWdMb2MoaW5zdHJfaXRlcmF0b3IgTUJCSSk7CisgIERlYnVnTG9jIGZpbmRQcmV2RGVidWdMb2MoaXRlcmF0b3IgTUJCSSkgeworICAgIHJldHVybiBmaW5kUHJldkRlYnVnTG9jKE1CQkkuZ2V0SW5zdHJJdGVyYXRvcigpKTsKKyAgfQorCisgIC8vLyBGaW5kIGFuZCByZXR1cm4gdGhlIG1lcmdlZCBEZWJ1Z0xvYyBvZiB0aGUgYnJhbmNoIGluc3RydWN0aW9ucyBvZiB0aGUKKyAgLy8vIGJsb2NrLiBSZXR1cm4gVW5rbm93bkxvYyBpZiB0aGVyZSBpcyBub25lLgorICBEZWJ1Z0xvYyBmaW5kQnJhbmNoRGVidWdMb2MoKTsKKworICAvLy8gUG9zc2libGUgb3V0Y29tZSBvZiBhIHJlZ2lzdGVyIGxpdmVuZXNzIHF1ZXJ5IHRvIGNvbXB1dGVSZWdpc3RlckxpdmVuZXNzKCkKKyAgZW51bSBMaXZlbmVzc1F1ZXJ5UmVzdWx0IHsKKyAgICBMUVJfTGl2ZSwgICAvLy88IFJlZ2lzdGVyIGlzIGtub3duIHRvIGJlIChhdCBsZWFzdCBwYXJ0aWFsbHkpIGxpdmUuCisgICAgTFFSX0RlYWQsICAgLy8vPCBSZWdpc3RlciBpcyBrbm93biB0byBiZSBmdWxseSBkZWFkLgorICAgIExRUl9Vbmtub3duIC8vLzwgUmVnaXN0ZXIgbGl2ZW5lc3Mgbm90IGRlY2lkYWJsZSBmcm9tIGxvY2FsIG5laWdoYm9yaG9vZC4KKyAgfTsKKworICAvLy8gUmV0dXJuIHdoZXRoZXIgKHBoeXNpY2FsKSByZWdpc3RlciBccCBSZWcgaGFzIGJlZW4gZGVmaW5lZCBhbmQgbm90CisgIC8vLyBraWxsZWQgYXMgb2YganVzdCBiZWZvcmUgXHAgQmVmb3JlLgorICAvLy8KKyAgLy8vIFNlYXJjaCBpcyBsb2NhbGlzZWQgdG8gYSBuZWlnaGJvcmhvb2Qgb2YgXHAgTmVpZ2hib3Job29kIGluc3RydWN0aW9ucworICAvLy8gYmVmb3JlIChzZWFyY2hpbmcgZm9yIGRlZnMgb3Iga2lsbHMpIGFuZCBccCBOZWlnaGJvcmhvb2QgaW5zdHJ1Y3Rpb25zCisgIC8vLyBhZnRlciAoc2VhcmNoaW5nIGp1c3QgZm9yIGRlZnMpIFxwIEJlZm9yZS4KKyAgLy8vCisgIC8vLyBccCBSZWcgbXVzdCBiZSBhIHBoeXNpY2FsIHJlZ2lzdGVyLgorICBMaXZlbmVzc1F1ZXJ5UmVzdWx0IGNvbXB1dGVSZWdpc3RlckxpdmVuZXNzKGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBCZWZvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTmVpZ2hib3Job29kID0gMTApIGNvbnN0OworCisgIC8vIERlYnVnZ2luZyBtZXRob2RzLgorICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFNsb3RJbmRleGVzICogPSBudWxscHRyLAorICAgICAgICAgICAgIGJvb2wgSXNTdGFuZGFsb25lID0gdHJ1ZSkgY29uc3Q7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBNb2R1bGVTbG90VHJhY2tlciAmTVNULAorICAgICAgICAgICAgIGNvbnN0IFNsb3RJbmRleGVzICogPSBudWxscHRyLCBib29sIElzU3RhbmRhbG9uZSA9IHRydWUpIGNvbnN0OworCisgIC8vIFByaW50aW5nIG1ldGhvZCB1c2VkIGJ5IExvb3BJbmZvLgorICB2b2lkIHByaW50QXNPcGVyYW5kKHJhd19vc3RyZWFtICZPUywgYm9vbCBQcmludFR5cGUgPSB0cnVlKSBjb25zdDsKKworICAvLy8gTWFjaGluZUJhc2ljQmxvY2tzIGFyZSB1bmlxdWVseSBudW1iZXJlZCBhdCB0aGUgZnVuY3Rpb24gbGV2ZWwsIHVubGVzcworICAvLy8gdGhleSdyZSBub3QgaW4gYSBNYWNoaW5lRnVuY3Rpb24geWV0LCBpbiB3aGljaCBjYXNlIHRoaXMgd2lsbCByZXR1cm4gLTEuCisgIGludCBnZXROdW1iZXIoKSBjb25zdCB7IHJldHVybiBOdW1iZXI7IH0KKyAgdm9pZCBzZXROdW1iZXIoaW50IE4pIHsgTnVtYmVyID0gTjsgfQorCisgIC8vLyBSZXR1cm4gdGhlIE1DU3ltYm9sIGZvciB0aGlzIGJhc2ljIGJsb2NrLgorICBNQ1N5bWJvbCAqZ2V0U3ltYm9sKCkgY29uc3Q7CisKKyAgT3B0aW9uYWw8dWludDY0X3Q+IGdldElyckxvb3BIZWFkZXJXZWlnaHQoKSBjb25zdCB7CisgICAgcmV0dXJuIElyckxvb3BIZWFkZXJXZWlnaHQ7CisgIH0KKworICB2b2lkIHNldElyckxvb3BIZWFkZXJXZWlnaHQodWludDY0X3QgV2VpZ2h0KSB7CisgICAgSXJyTG9vcEhlYWRlcldlaWdodCA9IFdlaWdodDsKKyAgfQorCitwcml2YXRlOgorICAvLy8gUmV0dXJuIHByb2JhYmlsaXR5IGl0ZXJhdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEkgc3VjY2Vzc29yIGl0ZXJhdG9yLgorICBwcm9iYWJpbGl0eV9pdGVyYXRvciBnZXRQcm9iYWJpbGl0eUl0ZXJhdG9yKHN1Y2NfaXRlcmF0b3IgSSk7CisgIGNvbnN0X3Byb2JhYmlsaXR5X2l0ZXJhdG9yCisgIGdldFByb2JhYmlsaXR5SXRlcmF0b3IoY29uc3Rfc3VjY19pdGVyYXRvciBJKSBjb25zdDsKKworICBmcmllbmQgY2xhc3MgTWFjaGluZUJyYW5jaFByb2JhYmlsaXR5SW5mbzsKKyAgZnJpZW5kIGNsYXNzIE1JUHJpbnRlcjsKKworICAvLy8gUmV0dXJuIHByb2JhYmlsaXR5IG9mIHRoZSBlZGdlIGZyb20gdGhpcyBibG9jayB0byBNQkIuIFRoaXMgbWV0aG9kIHNob3VsZAorICAvLy8gTk9UIGJlIGNhbGxlZCBkaXJlY3RseSwgYnV0IGJ5IHVzaW5nIGdldEVkZ2VQcm9iYWJpbGl0eSBtZXRob2QgZnJvbQorICAvLy8gTWFjaGluZUJyYW5jaFByb2JhYmlsaXR5SW5mbyBjbGFzcy4KKyAgQnJhbmNoUHJvYmFiaWxpdHkgZ2V0U3VjY1Byb2JhYmlsaXR5KGNvbnN0X3N1Y2NfaXRlcmF0b3IgU3VjYykgY29uc3Q7CisKKyAgLy8gTWV0aG9kcyB1c2VkIHRvIG1haW50YWluIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBibG9ja3MuLi4KKyAgZnJpZW5kIHN0cnVjdCBpbGlzdF9jYWxsYmFja190cmFpdHM8TWFjaGluZUJhc2ljQmxvY2s+OworCisgIC8vIE1hY2hpbmUtQ0ZHIG11dGF0b3JzCisKKyAgLy8vIEFkZCBQcmVkIGFzIGEgcHJlZGVjZXNzb3Igb2YgdGhpcyBNYWNoaW5lQmFzaWNCbG9jay4gRG9uJ3QgZG8gdGhpcworICAvLy8gdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLCBiZWNhdXNlIGl0IGRvZXNuJ3QgdXBkYXRlIFByZWQncworICAvLy8gc3VjY2Vzc29ycyBsaXN0LiBVc2UgUHJlZC0+YWRkU3VjY2Vzc29yIGluc3RlYWQuCisgIHZvaWQgYWRkUHJlZGVjZXNzb3IoTWFjaGluZUJhc2ljQmxvY2sgKlByZWQpOworCisgIC8vLyBSZW1vdmUgUHJlZCBhcyBhIHByZWRlY2Vzc29yIG9mIHRoaXMgTWFjaGluZUJhc2ljQmxvY2suIERvbid0IGRvIHRoaXMKKyAgLy8vIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZywgYmVjYXVzZSBpdCBkb2Vzbid0IHVwZGF0ZSBQcmVkJ3MKKyAgLy8vIHN1Y2Nlc3NvcnMgbGlzdC4gVXNlIFByZWQtPnJlbW92ZVN1Y2Nlc3NvciBpbnN0ZWFkLgorICB2b2lkIHJlbW92ZVByZWRlY2Vzc29yKE1hY2hpbmVCYXNpY0Jsb2NrICpQcmVkKTsKK307CisKK3Jhd19vc3RyZWFtJiBvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKy8vLyBQcmludHMgYSBtYWNoaW5lIGJhc2ljIGJsb2NrIHJlZmVyZW5jZS4KKy8vLworLy8vIFRoZSBmb3JtYXQgaXM6CisvLy8gICAlYmIuNSAgICAgICAgICAgLSBhIG1hY2hpbmUgYmFzaWMgYmxvY2sgd2l0aCBNQkIuZ2V0TnVtYmVyKCkgPT0gNS4KKy8vLworLy8vIFVzYWdlOiBPUyA8PCBwcmludE1CQlJlZmVyZW5jZShNQkIpIDw8ICdcbic7CitQcmludGFibGUgcHJpbnRNQkJSZWZlcmVuY2UoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKy8vIFRoaXMgaXMgdXNlZnVsIHdoZW4gYnVpbGRpbmcgSW5kZXhlZE1hcHMga2V5ZWQgb24gYmFzaWMgYmxvY2sgcG9pbnRlcnMuCitzdHJ1Y3QgTUJCMk51bWJlckZ1bmN0b3IgeworICB1c2luZyBhcmd1bWVudF90eXBlID0gY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKjsKKyAgdW5zaWduZWQgb3BlcmF0b3IoKShjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdCB7CisgICAgcmV0dXJuIE1CQi0+Z2V0TnVtYmVyKCk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gR3JhcGhUcmFpdHMgc3BlY2lhbGl6YXRpb25zIGZvciBtYWNoaW5lIGJhc2ljIGJsb2NrIGdyYXBocyAobWFjaGluZS1DRkdzKQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFByb3ZpZGUgc3BlY2lhbGl6YXRpb25zIG9mIEdyYXBoVHJhaXRzIHRvIGJlIGFibGUgdG8gdHJlYXQgYQorLy8gTWFjaGluZUZ1bmN0aW9uIGFzIGEgZ3JhcGggb2YgTWFjaGluZUJhc2ljQmxvY2tzLgorLy8KKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPE1hY2hpbmVCYXNpY0Jsb2NrICo+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IE1hY2hpbmVCYXNpY0Jsb2NrICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gTWFjaGluZUJhc2ljQmxvY2s6OnN1Y2NfaXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgeyByZXR1cm4gQkI7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+c3VjY19iZWdpbigpOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBOLT5zdWNjX2VuZCgpOyB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8Y29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKj4geworICB1c2luZyBOb2RlUmVmID0gY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3Rfc3VjY19pdGVyYXRvcjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKkJCKSB7IHJldHVybiBCQjsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7IHJldHVybiBOLT5zdWNjX2JlZ2luKCk7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPnN1Y2NfZW5kKCk7IH0KK307CisKKy8vIFByb3ZpZGUgc3BlY2lhbGl6YXRpb25zIG9mIEdyYXBoVHJhaXRzIHRvIGJlIGFibGUgdG8gdHJlYXQgYQorLy8gTWFjaGluZUZ1bmN0aW9uIGFzIGEgZ3JhcGggb2YgTWFjaGluZUJhc2ljQmxvY2tzIGFuZCB0byB3YWxrIGl0CisvLyBpbiBpbnZlcnNlIG9yZGVyLiAgSW52ZXJzZSBvcmRlciBmb3IgYSBmdW5jdGlvbiBpcyBjb25zaWRlcmVkCisvLyB0byBiZSB3aGVuIHRyYXZlcnNpbmcgdGhlIHByZWRlY2Vzc29yIGVkZ2VzIG9mIGEgTUJCCisvLyBpbnN0ZWFkIG9mIHRoZSBzdWNjZXNzb3IgZWRnZXMuCisvLwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEludmVyc2U8TWFjaGluZUJhc2ljQmxvY2sqPj4geworICB1c2luZyBOb2RlUmVmID0gTWFjaGluZUJhc2ljQmxvY2sgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBNYWNoaW5lQmFzaWNCbG9jazo6cHJlZF9pdGVyYXRvcjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoSW52ZXJzZTxNYWNoaW5lQmFzaWNCbG9jayAqPiBHKSB7CisgICAgcmV0dXJuIEcuR3JhcGg7CisgIH0KKworICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7IHJldHVybiBOLT5wcmVkX2JlZ2luKCk7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPnByZWRfZW5kKCk7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxJbnZlcnNlPGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrKj4+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X3ByZWRfaXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKEludmVyc2U8Y29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKj4gRykgeworICAgIHJldHVybiBHLkdyYXBoOworICB9CisKKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+cHJlZF9iZWdpbigpOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBOLT5wcmVkX2VuZCgpOyB9Cit9OworCisvLy8gTWFjaGluZUluc3RyU3BhbiBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gZ2V0IGFuIGl0ZXJhdGlvbiByYW5nZQorLy8vIGNvbnRhaW5pbmcgdGhlIGluc3RydWN0aW9uIGl0IHdhcyBpbml0aWFsaXplZCB3aXRoLCBhbG9uZyB3aXRoIGFsbAorLy8vIHRob3NlIGluc3RydWN0aW9ucyBpbnNlcnRlZCBwcmlvciB0byBvciBmb2xsb3dpbmcgdGhhdCBpbnN0cnVjdGlvbgorLy8vIGF0IHNvbWUgcG9pbnQgYWZ0ZXIgdGhlIE1hY2hpbmVJbnN0clNwYW4gaXMgY29uc3RydWN0ZWQuCitjbGFzcyBNYWNoaW5lSW5zdHJTcGFuIHsKKyAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQjsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIEIsIEU7CisKK3B1YmxpYzoKKyAgTWFjaGluZUluc3RyU3BhbihNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSkKKyAgICA6IE1CQigqSS0+Z2V0UGFyZW50KCkpLAorICAgICAgSShJKSwKKyAgICAgIEIoSSA9PSBNQkIuYmVnaW4oKSA/IE1CQi5lbmQoKSA6IHN0ZDo6cHJldihJKSksCisgICAgICBFKHN0ZDo6bmV4dChJKSkge30KKworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgYmVnaW4oKSB7CisgICAgcmV0dXJuIEIgPT0gTUJCLmVuZCgpID8gTUJCLmJlZ2luKCkgOiBzdGQ6Om5leHQoQik7CisgIH0KKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIEU7IH0KKyAgYm9vbCBlbXB0eSgpIHsgcmV0dXJuIGJlZ2luKCkgPT0gZW5kKCk7IH0KKworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgZ2V0SW5pdGlhbCgpIHsgcmV0dXJuIEk7IH0KK307CisKKy8vLyBJbmNyZW1lbnQgXHAgSXQgdW50aWwgaXQgcG9pbnRzIHRvIGEgbm9uLWRlYnVnIGluc3RydWN0aW9uIG9yIHRvIFxwIEVuZAorLy8vIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBpdGVyYXRvci4gVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkCisvLy8gTWFjaGluZUJhc2ljQmxvY2s6OntpdGVyYXRvciwgY29uc3RfaXRlcmF0b3IsIGluc3RyX2l0ZXJhdG9yLAorLy8vIGNvbnN0X2luc3RyX2l0ZXJhdG9yfSBhbmQgdGhlIHJlc3BlY3RpdmUgcmV2ZXJzZSBpdGVyYXRvcnMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBJdGVyVD4KK2lubGluZSBJdGVyVCBza2lwRGVidWdJbnN0cnVjdGlvbnNGb3J3YXJkKEl0ZXJUIEl0LCBJdGVyVCBFbmQpIHsKKyAgd2hpbGUgKEl0ICE9IEVuZCAmJiBJdC0+aXNEZWJ1Z1ZhbHVlKCkpCisgICAgSXQrKzsKKyAgcmV0dXJuIEl0OworfQorCisvLy8gRGVjcmVtZW50IFxwIEl0IHVudGlsIGl0IHBvaW50cyB0byBhIG5vbi1kZWJ1ZyBpbnN0cnVjdGlvbiBvciB0byBccCBCZWdpbgorLy8vIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBpdGVyYXRvci4gVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkCisvLy8gTWFjaGluZUJhc2ljQmxvY2s6OntpdGVyYXRvciwgY29uc3RfaXRlcmF0b3IsIGluc3RyX2l0ZXJhdG9yLAorLy8vIGNvbnN0X2luc3RyX2l0ZXJhdG9yfSBhbmQgdGhlIHJlc3BlY3RpdmUgcmV2ZXJzZSBpdGVyYXRvcnMuCit0ZW1wbGF0ZTxjbGFzcyBJdGVyVD4KK2lubGluZSBJdGVyVCBza2lwRGVidWdJbnN0cnVjdGlvbnNCYWNrd2FyZChJdGVyVCBJdCwgSXRlclQgQmVnaW4pIHsKKyAgd2hpbGUgKEl0ICE9IEJlZ2luICYmIEl0LT5pc0RlYnVnVmFsdWUoKSkKKyAgICBJdC0tOworICByZXR1cm4gSXQ7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUFDSElORUJBU0lDQkxPQ0tfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0Yjk5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvLmgKQEAgLTAsMCArMSw4NSBAQAorLy89PT0tIE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8uaCAtIE1CQiBGcmVxdWVuY3kgQW5hbHlzaXMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb29wcyBzaG91bGQgYmUgc2ltcGxpZmllZCBiZWZvcmUgdGhpcyBhbmFseXNpcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FQkxPQ0tGUkVRVUVOQ1lJTkZPX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVCTE9DS0ZSRVFVRU5DWUlORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CbG9ja0ZyZXF1ZW5jeS5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1Q+IGNsYXNzIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGw7CitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIE1hY2hpbmVCcmFuY2hQcm9iYWJpbGl0eUluZm87CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lTG9vcEluZm87CitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8gcGFzcyB1c2VzIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGwgaW1wbGVtZW50YXRpb24KKy8vLyB0byBlc3RpbWF0ZSBtYWNoaW5lIGJhc2ljIGJsb2NrIGZyZXF1ZW5jaWVzLgorY2xhc3MgTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mbyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgdXNpbmcgSW1wbFR5cGUgPSBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsPE1hY2hpbmVCYXNpY0Jsb2NrPjsKKyAgc3RkOjp1bmlxdWVfcHRyPEltcGxUeXBlPiBNQkZJOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8oKTsKKyAgfk1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8oKSBvdmVycmlkZTsKKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGKSBvdmVycmlkZTsKKworICAvLy8gY2FsY3VsYXRlIC0gY29tcHV0ZSBibG9jayBmcmVxdWVuY3kgaW5mbyBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uLgorICB2b2lkIGNhbGN1bGF0ZShjb25zdCBNYWNoaW5lRnVuY3Rpb24gJkYsCisgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCcmFuY2hQcm9iYWJpbGl0eUluZm8gJk1CUEksCisgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVMb29wSW5mbyAmTUxJKTsKKworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKworICAvLy8gZ2V0YmxvY2tGcmVxIC0gUmV0dXJuIGJsb2NrIGZyZXF1ZW5jeS4gUmV0dXJuIDAgaWYgd2UgZG9uJ3QgaGF2ZSB0aGUKKyAgLy8vIGluZm9ybWF0aW9uLiBQbGVhc2Ugbm90ZSB0aGF0IGluaXRpYWwgZnJlcXVlbmN5IGlzIGVxdWFsIHRvIDEwMjQuIEl0IG1lYW5zCisgIC8vLyB0aGF0IHdlIHNob3VsZCBub3QgcmVseSBvbiB0aGUgdmFsdWUgaXRzZWxmLCBidXQgb25seSBvbiB0aGUgY29tcGFyaXNvbiB0bworICAvLy8gdGhlIG90aGVyIGJsb2NrIGZyZXF1ZW5jaWVzLiBXZSBkbyB0aGlzIHRvIGF2b2lkIHVzaW5nIG9mIGZsb2F0aW5nIHBvaW50cy4KKyAgLy8vCisgIEJsb2NrRnJlcXVlbmN5IGdldEJsb2NrRnJlcShjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKKworICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0QmxvY2tQcm9maWxlQ291bnQoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3Q7CisgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRQcm9maWxlQ291bnRGcm9tRnJlcSh1aW50NjRfdCBGcmVxKSBjb25zdDsKKworICBib29sIGlzSXJyTG9vcEhlYWRlcihjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKTsKKworICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gKmdldEZ1bmN0aW9uKCkgY29uc3Q7CisgIGNvbnN0IE1hY2hpbmVCcmFuY2hQcm9iYWJpbGl0eUluZm8gKmdldE1CUEkoKSBjb25zdDsKKyAgdm9pZCB2aWV3KGNvbnN0IFR3aW5lICZOYW1lLCBib29sIGlzU2ltcGxlID0gdHJ1ZSkgY29uc3Q7CisKKyAgLy8gUHJpbnQgdGhlIGJsb2NrIGZyZXF1ZW5jeSBGcmVxIHRvIE9TIHVzaW5nIHRoZSBjdXJyZW50IGZ1bmN0aW9ucyBlbnRyeQorICAvLyBmcmVxdWVuY3kgdG8gY29udmVydCBmcmVxIGludG8gYSByZWxhdGl2ZSBkZWNpbWFsIGZvcm0uCisgIHJhd19vc3RyZWFtICZwcmludEJsb2NrRnJlcShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEJsb2NrRnJlcXVlbmN5IEZyZXEpIGNvbnN0OworCisgIC8vIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGF0dGVtcHRzIHRvIGxvb2sgdXAgdGhlIGZyZXF1ZW5jeSBhc3NvY2lhdGVkIHdpdGgKKyAgLy8gQkIgYW5kIHByaW50IGl0IHRvIE9TLgorICByYXdfb3N0cmVhbSAmcHJpbnRCbG9ja0ZyZXEocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3Q7CisKKyAgdWludDY0X3QgZ2V0RW50cnlGcmVxKCkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX01BQ0hJTkVCTE9DS0ZSRVFVRU5DWUlORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVCcmFuY2hQcm9iYWJpbGl0eUluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lQnJhbmNoUHJvYmFiaWxpdHlJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFiMDUyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lQnJhbmNoUHJvYmFiaWxpdHlJbmZvLmgKQEAgLTAsMCArMSw3NyBAQAorLy89LSBNYWNoaW5lQnJhbmNoUHJvYmFiaWxpdHlJbmZvLmggLSBCcmFuY2ggUHJvYmFiaWxpdHkgQW5hbHlzaXMgLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgaXMgdXNlZCB0byBldmFsdWF0ZSBicmFuY2ggcHJvYmFiaWx0aWVzIG9uIG1hY2hpbmUgYmFzaWMgYmxvY2tzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVCUkFOQ0hQUk9CQUJJTElUWUlORk9fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORUJSQU5DSFBST0JBQklMSVRZSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQnJhbmNoUHJvYmFiaWxpdHkuaCIKKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPG51bWVyaWM+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZUJyYW5jaFByb2JhYmlsaXR5SW5mbyA6IHB1YmxpYyBJbW11dGFibGVQYXNzIHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCisgIC8vIERlZmF1bHQgd2VpZ2h0IHZhbHVlLiBVc2VkIHdoZW4gd2UgZG9uJ3QgaGF2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZWRnZS4KKyAgLy8gVE9ETzogREVGQVVMVF9XRUlHSFQgbWFrZXMgc2Vuc2UgZHVyaW5nIHN0YXRpYyBwcmVkaWNhdGlvbiwgd2hlbiBub25lIG9mCisgIC8vIHRoZSBzdWNjZXNzb3JzIGhhdmUgYSB3ZWlnaHQgeWV0LiBCdXQgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHdoZW4gcHJvdmlkaW5nCisgIC8vIHdlaWdodCB0byBhbiBlZGdlIHRoYXQgbWF5IGhhdmUgc2libGluZ3Mgd2l0aCBub24temVybyB3ZWlnaHRzLiBUaGlzIGNhbgorICAvLyBiZSBoYW5kbGVkIHZhcmlvdXMgd2F5cywgYnV0IGl0J3MgcHJvYmFibHkgZmluZSBmb3IgYW4gZWRnZSB3aXRoIHVua25vd24KKyAgLy8gd2VpZ2h0IHRvIGp1c3QgImluaGVyaXQiIHRoZSBub24temVybyB3ZWlnaHQgb2YgYW4gYWRqYWNlbnQgc3VjY2Vzc29yLgorICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9XRUlHSFQgPSAxNjsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBNYWNoaW5lQnJhbmNoUHJvYmFiaWxpdHlJbmZvKCkgOiBJbW11dGFibGVQYXNzKElEKSB7CisgICAgUGFzc1JlZ2lzdHJ5ICZSZWdpc3RyeSA9ICpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpOworICAgIGluaXRpYWxpemVNYWNoaW5lQnJhbmNoUHJvYmFiaWxpdHlJbmZvUGFzcyhSZWdpc3RyeSk7CisgIH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgfQorCisgIC8vIFJldHVybiBlZGdlIHByb2JhYmlsaXR5LgorICBCcmFuY2hQcm9iYWJpbGl0eSBnZXRFZGdlUHJvYmFiaWxpdHkoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpEc3QpIGNvbnN0OworCisgIC8vIFNhbWUgYXMgYWJvdmUsIGJ1dCB1c2luZyBhIGNvbnN0X3N1Y2NfaXRlcmF0b3IgZnJvbSBTcmMuIFRoaXMgaXMgZmFzdGVyCisgIC8vIHdoZW4gdGhlIGl0ZXJhdG9yIGlzIGFscmVhZHkgYXZhaWxhYmxlLgorICBCcmFuY2hQcm9iYWJpbGl0eQorICBnZXRFZGdlUHJvYmFiaWxpdHkoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKlNyYywKKyAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9zdWNjX2l0ZXJhdG9yIERzdCkgY29uc3Q7CisKKyAgLy8gQSAnSG90JyBlZGdlIGlzIGFuIGVkZ2Ugd2hpY2ggcHJvYmFiaWxpdHkgaXMgPj0gODAlLgorICBib29sIGlzRWRnZUhvdChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqU3JjLAorICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqRHN0KSBjb25zdDsKKworICAvLyBSZXR1cm4gYSBob3Qgc3VjY2Vzc29yIGZvciB0aGUgYmxvY2sgQkIgb3IgbnVsbCBpZiB0aGVyZSBpc24ndCBvbmUuCisgIC8vIE5COiBUaGlzIHJvdXRpbmUncyBjb21wbGV4aXR5IGlzIGxpbmVhciBvbiB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NvcnMuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpnZXRIb3RTdWNjKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0OworCisgIC8vIFByaW50IHZhbHVlIGJldHdlZW4gMCAoMCUgcHJvYmFiaWxpdHkpIGFuZCAxICgxMDAlIHByb2JhYmlsaXR5KSwKKyAgLy8gaG93ZXZlciB0aGUgdmFsdWUgaXMgbmV2ZXIgZXF1YWwgdG8gMCwgYW5kIGNhbiBiZSAxIG9ubHkgaWZmIFNSQyBibG9jaworICAvLyBoYXMgb25seSBvbmUgc3VjY2Vzc29yLgorICByYXdfb3N0cmVhbSAmcHJpbnRFZGdlUHJvYmFiaWxpdHkocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpEc3QpIGNvbnN0OworfTsKKworfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVDb21iaW5lclBhdHRlcm4uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lQ29tYmluZXJQYXR0ZXJuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2NTM1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lQ29tYmluZXJQYXR0ZXJuLmgKQEAgLTAsMCArMSw4NyBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vTWFjaGluZUNvbWJpbmVyUGF0dGVybi5oIC0gSW5zdHJ1Y3Rpb24gcGF0dGVybiBzdXBwb3J0ZWQgYnkKKy8vIGNvbWJpbmVyICAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBpbnN0cnVjdGlvbiBwYXR0ZXJuIHN1cHBvcnRlZCBieSBjb21iaW5lcgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVDT01CSU5FUlBBVFRFUk5fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORUNPTUJJTkVSUEFUVEVSTl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFRoZXNlIGFyZSBpbnN0cnVjdGlvbiBwYXR0ZXJucyBtYXRjaGVkIGJ5IHRoZSBtYWNoaW5lIGNvbWJpbmVyIHBhc3MuCitlbnVtIGNsYXNzIE1hY2hpbmVDb21iaW5lclBhdHRlcm4geworICAvLyBUaGVzZSBhcmUgY29tbXV0YXRpdmUgdmFyaWFudHMgZm9yIHJlYXNzb2NpYXRpbmcgYSBjb21wdXRhdGlvbiBjaGFpbi4gU2VlCisgIC8vIHRoZSBjb21tZW50cyBiZWZvcmUgZ2V0TWFjaGluZUNvbWJpbmVyUGF0dGVybnMoKSBpbiBUYXJnZXRJbnN0ckluZm8uY3BwLgorICBSRUFTU09DX0FYX0JZLAorICBSRUFTU09DX0FYX1lCLAorICBSRUFTU09DX1hBX0JZLAorICBSRUFTU09DX1hBX1lCLAorCisgIC8vIFRoZXNlIGFyZSBtdWx0aXBseS1hZGQgcGF0dGVybnMgbWF0Y2hlZCBieSB0aGUgQUFyY2g2NCBtYWNoaW5lIGNvbWJpbmVyLgorICBNVUxBRERXX09QMSwKKyAgTVVMQUREV19PUDIsCisgIE1VTFNVQldfT1AxLAorICBNVUxTVUJXX09QMiwKKyAgTVVMQUREV0lfT1AxLAorICBNVUxTVUJXSV9PUDEsCisgIE1VTEFERFhfT1AxLAorICBNVUxBRERYX09QMiwKKyAgTVVMU1VCWF9PUDEsCisgIE1VTFNVQlhfT1AyLAorICBNVUxBRERYSV9PUDEsCisgIE1VTFNVQlhJX09QMSwKKyAgLy8gRmxvYXRpbmcgUG9pbnQKKyAgRk1VTEFERFNfT1AxLAorICBGTVVMQUREU19PUDIsCisgIEZNVUxTVUJTX09QMSwKKyAgRk1VTFNVQlNfT1AyLAorICBGTVVMQURERF9PUDEsCisgIEZNVUxBREREX09QMiwKKyAgRk1VTFNVQkRfT1AxLAorICBGTVVMU1VCRF9PUDIsCisgIEZOTVVMU1VCU19PUDEsCisgIEZOTVVMU1VCRF9PUDEsCisgIEZNTEF2MWkzMl9pbmRleGVkX09QMSwKKyAgRk1MQXYxaTMyX2luZGV4ZWRfT1AyLAorICBGTUxBdjFpNjRfaW5kZXhlZF9PUDEsCisgIEZNTEF2MWk2NF9pbmRleGVkX09QMiwKKyAgRk1MQXYyZjMyX09QMiwKKyAgRk1MQXYyZjMyX09QMSwKKyAgRk1MQXYyZjY0X09QMSwKKyAgRk1MQXYyZjY0X09QMiwKKyAgRk1MQXYyaTMyX2luZGV4ZWRfT1AxLAorICBGTUxBdjJpMzJfaW5kZXhlZF9PUDIsCisgIEZNTEF2Mmk2NF9pbmRleGVkX09QMSwKKyAgRk1MQXYyaTY0X2luZGV4ZWRfT1AyLAorICBGTUxBdjRmMzJfT1AxLAorICBGTUxBdjRmMzJfT1AyLAorICBGTUxBdjRpMzJfaW5kZXhlZF9PUDEsCisgIEZNTEF2NGkzMl9pbmRleGVkX09QMiwKKyAgRk1MU3YxaTMyX2luZGV4ZWRfT1AyLAorICBGTUxTdjFpNjRfaW5kZXhlZF9PUDIsCisgIEZNTFN2MmYzMl9PUDEsCisgIEZNTFN2MmYzMl9PUDIsCisgIEZNTFN2MmY2NF9PUDEsCisgIEZNTFN2MmY2NF9PUDIsCisgIEZNTFN2MmkzMl9pbmRleGVkX09QMSwKKyAgRk1MU3YyaTMyX2luZGV4ZWRfT1AyLAorICBGTUxTdjJpNjRfaW5kZXhlZF9PUDEsCisgIEZNTFN2Mmk2NF9pbmRleGVkX09QMiwKKyAgRk1MU3Y0ZjMyX09QMSwKKyAgRk1MU3Y0ZjMyX09QMiwKKyAgRk1MU3Y0aTMyX2luZGV4ZWRfT1AxLAorICBGTUxTdjRpMzJfaW5kZXhlZF9PUDIKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVDb25zdGFudFBvb2wuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lQ29uc3RhbnRQb29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwNWEwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lQ29uc3RhbnRQb29sLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8vPT09LSBDb2RlR2VuL01hY2hpbmVDb25zdGFudFBvb2wuaCAtIEFic3RyYWN0IENvbnN0YW50IFBvb2wgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIEBmaWxlCisvLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBNYWNoaW5lQ29uc3RhbnRQb29sIGNsYXNzIHdoaWNoIGlzIGFuIGFic3RyYWN0CisvLy8gY29uc3RhbnQgcG9vbCB0byBrZWVwIHRyYWNrIG9mIGNvbnN0YW50cyByZWZlcmVuY2VkIGJ5IGEgZnVuY3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORUNPTlNUQU5UUE9PTF9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FQ09OU1RBTlRQT09MX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9TZWN0aW9uS2luZC5oIgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIENvbnN0YW50OworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIEZvbGRpbmdTZXROb2RlSUQ7CitjbGFzcyBNYWNoaW5lQ29uc3RhbnRQb29sOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBUeXBlOworCisvLy8gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIG1hY2hpbmUgc3BlY2lmaWMgY29uc3RhbnRwb29sIHZhbHVlIHN1YmNsYXNzZXMuCisvLy8KK2NsYXNzIE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworICBUeXBlICpUeTsKKworcHVibGljOgorICBleHBsaWNpdCBNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWUoVHlwZSAqdHkpIDogVHkodHkpIHt9CisgIHZpcnR1YWwgfk1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSgpID0gZGVmYXVsdDsKKworICAvLy8gZ2V0VHlwZSAtIGdldCB0eXBlIG9mIHRoaXMgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlLgorICAvLy8KKyAgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5OyB9CisKKyAgdmlydHVhbCBpbnQgZ2V0RXhpc3RpbmdNYWNoaW5lQ1BWYWx1ZShNYWNoaW5lQ29uc3RhbnRQb29sICpDUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgYWRkU2VsZWN0aW9uREFHQ1NFSWQoRm9sZGluZ1NldE5vZGVJRCAmSUQpID0gMDsKKworICAvLy8gcHJpbnQgLSBJbXBsZW1lbnQgb3BlcmF0b3I8PAorICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8pIGNvbnN0ID0gMDsKK307CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlICZWKSB7CisgIFYucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKKy8vLyBUaGlzIGNsYXNzIGlzIGEgZGF0YSBjb250YWluZXIgZm9yIG9uZSBlbnRyeSBpbiBhIE1hY2hpbmVDb25zdGFudFBvb2wuCisvLy8gSXQgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBhbmQgYW4gb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mCisvLy8gdGhlIGNvbnN0YW50IHBvb2wuCisvLy8gQGJyaWVmIEFuIGVudHJ5IGluIGEgTWFjaGluZUNvbnN0YW50UG9vbAorY2xhc3MgTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5IHsKK3B1YmxpYzoKKyAgLy8vIFRoZSBjb25zdGFudCBpdHNlbGYuCisgIHVuaW9uIHsKKyAgICBjb25zdCBDb25zdGFudCAqQ29uc3RWYWw7CisgICAgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlICpNYWNoaW5lQ1BWYWw7CisgIH0gVmFsOworCisgIC8vLyBUaGUgcmVxdWlyZWQgYWxpZ25tZW50IGZvciB0aGlzIGVudHJ5LiBUaGUgdG9wIGJpdCBpcyBzZXQgd2hlbiBWYWwgaXMKKyAgLy8vIGEgdGFyZ2V0IHNwZWNpZmljIE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZS4KKyAgdW5zaWduZWQgQWxpZ25tZW50OworCisgIE1hY2hpbmVDb25zdGFudFBvb2xFbnRyeShjb25zdCBDb25zdGFudCAqViwgdW5zaWduZWQgQSkKKyAgICA6IEFsaWdubWVudChBKSB7CisgICAgVmFsLkNvbnN0VmFsID0gVjsKKyAgfQorCisgIE1hY2hpbmVDb25zdGFudFBvb2xFbnRyeShNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWUgKlYsIHVuc2lnbmVkIEEpCisgICAgICA6IEFsaWdubWVudChBKSB7CisgICAgVmFsLk1hY2hpbmVDUFZhbCA9IFY7CisgICAgQWxpZ25tZW50IHw9IDFVIDw8IChzaXplb2YodW5zaWduZWQpICogQ0hBUl9CSVQgLSAxKTsKKyAgfQorCisgIC8vLyBpc01hY2hpbmVDb25zdGFudFBvb2xFbnRyeSAtIFJldHVybiB0cnVlIGlmIHRoZSBNYWNoaW5lQ29uc3RhbnRQb29sRW50cnkKKyAgLy8vIGlzIGluZGVlZCBhIHRhcmdldCBzcGVjaWZpYyBjb25zdGFudHBvb2wgZW50cnksIG5vdCBhIHdyYXBwZXIgb3ZlciBhCisgIC8vLyBDb25zdGFudC4KKyAgYm9vbCBpc01hY2hpbmVDb25zdGFudFBvb2xFbnRyeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGludClBbGlnbm1lbnQgPCAwOworICB9CisKKyAgaW50IGdldEFsaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQWxpZ25tZW50ICYgfigxIDw8IChzaXplb2YodW5zaWduZWQpICogQ0hBUl9CSVQgLSAxKSk7CisgIH0KKworICBUeXBlICpnZXRUeXBlKCkgY29uc3Q7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGNsYXNzaWZpZXMgdGhlIGVudHJ5IGFjY29yZGluZyB0byB3aGV0aGVyIG9yIG5vdCBpdCBtYXkKKyAgLy8vIGdlbmVyYXRlIGEgcmVsb2NhdGlvbiBlbnRyeS4gIFRoaXMgbXVzdCBiZSBjb25zZXJ2YXRpdmUsIHNvIGlmIGl0IG1pZ2h0CisgIC8vLyBjb2RlZ2VuIHRvIGEgcmVsb2NhdGFibGUgZW50cnksIGl0IHNob3VsZCBzYXkgc28uCisgIGJvb2wgbmVlZHNSZWxvY2F0aW9uKCkgY29uc3Q7CisKKyAgU2VjdGlvbktpbmQgZ2V0U2VjdGlvbktpbmQoY29uc3QgRGF0YUxheW91dCAqREwpIGNvbnN0OworfTsKKworLy8vIFRoZSBNYWNoaW5lQ29uc3RhbnRQb29sIGNsYXNzIGtlZXBzIHRyYWNrIG9mIGNvbnN0YW50cyByZWZlcmVuY2VkIGJ5IGEKKy8vLyBmdW5jdGlvbiB3aGljaCBtdXN0IGJlIHNwaWxsZWQgdG8gbWVtb3J5LiAgVGhpcyBpcyB1c2VkIGZvciBjb25zdGFudHMgd2hpY2gKKy8vLyBhcmUgdW5hYmxlIHRvIGJlIHVzZWQgZGlyZWN0bHkgYXMgb3BlcmFuZHMgdG8gaW5zdHJ1Y3Rpb25zLCB3aGljaCB0eXBpY2FsbHkKKy8vLyBpbmNsdWRlIGZsb2F0aW5nIHBvaW50IGFuZCBsYXJnZSBpbnRlZ2VyIGNvbnN0YW50cy4KKy8vLworLy8vIEluc3RydWN0aW9ucyByZWZlcmVuY2UgdGhlIGFkZHJlc3Mgb2YgdGhlc2UgY29uc3RhbnQgcG9vbCBjb25zdGFudHMgdGhyb3VnaAorLy8vIHRoZSB1c2Ugb2YgTU9fQ29uc3RhbnRQb29sSW5kZXggdmFsdWVzLiAgV2hlbiBlbWl0dGluZyBhc3NlbWJseSBvciBtYWNoaW5lCisvLy8gY29kZSwgdGhlc2UgdmlydHVhbCBhZGRyZXNzIHJlZmVyZW5jZXMgYXJlIGNvbnZlcnRlZCB0byByZWZlciB0byB0aGUKKy8vLyBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiBjb25zdGFudCBwb29sIHZhbHVlcy4KKy8vLyBAYnJpZWYgVGhlIG1hY2hpbmUgY29uc3RhbnQgcG9vbC4KK2NsYXNzIE1hY2hpbmVDb25zdGFudFBvb2wgeworICB1bnNpZ25lZCBQb29sQWxpZ25tZW50OyAgICAgICAvLy88IFRoZSBhbGlnbm1lbnQgZm9yIHRoZSBwb29sLgorICBzdGQ6OnZlY3RvcjxNYWNoaW5lQ29uc3RhbnRQb29sRW50cnk+IENvbnN0YW50czsgLy8vPCBUaGUgcG9vbCBvZiBjb25zdGFudHMuCisgIC8vLyBNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWVzIHRoYXQgdXNlIGFuIGV4aXN0aW5nIE1hY2hpbmVDb25zdGFudFBvb2xFbnRyeS4KKyAgRGVuc2VTZXQ8TWFjaGluZUNvbnN0YW50UG9vbFZhbHVlKj4gTWFjaGluZUNQVnNTaGFyaW5nRW50cmllczsKKyAgY29uc3QgRGF0YUxheW91dCAmREw7CisKKyAgY29uc3QgRGF0YUxheW91dCAmZ2V0RGF0YUxheW91dCgpIGNvbnN0IHsgcmV0dXJuIERMOyB9CisKK3B1YmxpYzoKKyAgLy8vIEBicmllZiBUaGUgb25seSBjb25zdHJ1Y3Rvci4KKyAgZXhwbGljaXQgTWFjaGluZUNvbnN0YW50UG9vbChjb25zdCBEYXRhTGF5b3V0ICZETCkKKyAgICAgIDogUG9vbEFsaWdubWVudCgxKSwgREwoREwpIHt9CisgIH5NYWNoaW5lQ29uc3RhbnRQb29sKCk7CisKKyAgLy8vIGdldENvbnN0YW50UG9vbEFsaWdubWVudCAtIFJldHVybiB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGJ5CisgIC8vLyB0aGUgd2hvbGUgY29uc3RhbnQgcG9vbCwgb2Ygd2hpY2ggdGhlIGZpcnN0IGVsZW1lbnQgbXVzdCBiZSBhbGlnbmVkLgorICB1bnNpZ25lZCBnZXRDb25zdGFudFBvb2xBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBQb29sQWxpZ25tZW50OyB9CisKKyAgLy8vIGdldENvbnN0YW50UG9vbEluZGV4IC0gQ3JlYXRlIGEgbmV3IGVudHJ5IGluIHRoZSBjb25zdGFudCBwb29sIG9yIHJldHVybgorICAvLy8gYW4gZXhpc3Rpbmcgb25lLiAgVXNlciBtdXN0IHNwZWNpZnkgdGhlIG1pbmltdW0gcmVxdWlyZWQgYWxpZ25tZW50IGZvcgorICAvLy8gdGhlIG9iamVjdC4KKyAgdW5zaWduZWQgZ2V0Q29uc3RhbnRQb29sSW5kZXgoY29uc3QgQ29uc3RhbnQgKkMsIHVuc2lnbmVkIEFsaWdubWVudCk7CisgIHVuc2lnbmVkIGdldENvbnN0YW50UG9vbEluZGV4KE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSAqViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50KTsKKworICAvLy8gaXNFbXB0eSAtIFJldHVybiB0cnVlIGlmIHRoaXMgY29uc3RhbnQgcG9vbCBjb250YWlucyBubyBjb25zdGFudHMuCisgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIENvbnN0YW50cy5lbXB0eSgpOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8TWFjaGluZUNvbnN0YW50UG9vbEVudHJ5PiAmZ2V0Q29uc3RhbnRzKCkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudHM7CisgIH0KKworICAvLy8gcHJpbnQgLSBVc2VkIGJ5IHRoZSBNYWNoaW5lRnVuY3Rpb24gcHJpbnRlciB0byBwcmludCBpbmZvcm1hdGlvbiBhYm91dAorICAvLy8gY29uc3RhbnQgcG9vbCBvYmplY3RzLiAgSW1wbGVtZW50ZWQgaW4gTWFjaGluZUZ1bmN0aW9uLmNwcAorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8vIGR1bXAgLSBDYWxsIHByaW50KGNlcnIpIHRvIGJlIGNhbGxlZCBmcm9tIHRoZSBkZWJ1Z2dlci4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX01BQ0hJTkVDT05TVEFOVFBPT0xfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVEb21pbmFuY2VGcm9udGllci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVEb21pbmFuY2VGcm9udGllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYmNjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYW5jZUZyb250aWVyLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYW5jZUZyb250aWVyLmggLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVET01JTkFOQ0VGUk9OVElFUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FRE9NSU5BTkNFRlJPTlRJRVJfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Eb21pbmFuY2VGcm9udGllci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRG9taW5hbmNlRnJvbnRpZXJJbXBsLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvR2VuZXJpY0RvbVRyZWUuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZURvbWluYW5jZUZyb250aWVyIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICBGb3J3YXJkRG9taW5hbmNlRnJvbnRpZXJCYXNlPE1hY2hpbmVCYXNpY0Jsb2NrPiBCYXNlOworCitwdWJsaWM6CisgdXNpbmcgRG9tVHJlZVQgPSBEb21UcmVlQmFzZTxNYWNoaW5lQmFzaWNCbG9jaz47CisgdXNpbmcgRG9tVHJlZU5vZGVUID0gRG9tVHJlZU5vZGVCYXNlPE1hY2hpbmVCYXNpY0Jsb2NrPjsKKyB1c2luZyBEb21TZXRUeXBlID0gRG9taW5hbmNlRnJvbnRpZXJCYXNlPE1hY2hpbmVCYXNpY0Jsb2NrLCBmYWxzZT46OkRvbVNldFR5cGU7CisgdXNpbmcgaXRlcmF0b3IgPSBEb21pbmFuY2VGcm9udGllckJhc2U8TWFjaGluZUJhc2ljQmxvY2ssIGZhbHNlPjo6aXRlcmF0b3I7CisgdXNpbmcgY29uc3RfaXRlcmF0b3IgPQorICAgICBEb21pbmFuY2VGcm9udGllckJhc2U8TWFjaGluZUJhc2ljQmxvY2ssIGZhbHNlPjo6Y29uc3RfaXRlcmF0b3I7CisKKyBNYWNoaW5lRG9taW5hbmNlRnJvbnRpZXIoY29uc3QgTWFjaGluZURvbWluYW5jZUZyb250aWVyICYpID0gZGVsZXRlOworIE1hY2hpbmVEb21pbmFuY2VGcm9udGllciAmb3BlcmF0b3I9KGNvbnN0IE1hY2hpbmVEb21pbmFuY2VGcm9udGllciAmKSA9IGRlbGV0ZTsKKworIHN0YXRpYyBjaGFyIElEOworCisgTWFjaGluZURvbWluYW5jZUZyb250aWVyKCk7CisKKyBEb21pbmFuY2VGcm9udGllckJhc2U8TWFjaGluZUJhc2ljQmxvY2ssIGZhbHNlPiAmZ2V0QmFzZSgpIHsgcmV0dXJuIEJhc2U7IH0KKworICBjb25zdCBTbWFsbFZlY3RvckltcGw8TWFjaGluZUJhc2ljQmxvY2sgKj4gJmdldFJvb3RzKCkgY29uc3QgeworICAgcmV0dXJuIEJhc2UuZ2V0Um9vdHMoKTsKKyAgfQorCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpnZXRSb290KCkgY29uc3QgeworICAgIHJldHVybiBCYXNlLmdldFJvb3QoKTsKKyAgfQorCisgIGJvb2wgaXNQb3N0RG9taW5hdG9yKCkgY29uc3QgeworICAgIHJldHVybiBCYXNlLmlzUG9zdERvbWluYXRvcigpOworICB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7CisgICAgcmV0dXJuIEJhc2UuYmVnaW4oKTsKKyAgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBCYXNlLmJlZ2luKCk7CisgIH0KKworICBpdGVyYXRvciBlbmQoKSB7CisgICAgcmV0dXJuIEJhc2UuZW5kKCk7CisgIH0KKworICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIEJhc2UuZW5kKCk7CisgIH0KKworICBpdGVyYXRvciBmaW5kKE1hY2hpbmVCYXNpY0Jsb2NrICpCKSB7CisgICAgcmV0dXJuIEJhc2UuZmluZChCKTsKKyAgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoTWFjaGluZUJhc2ljQmxvY2sgKkIpIGNvbnN0IHsKKyAgICByZXR1cm4gQmFzZS5maW5kKEIpOworICB9CisKKyAgaXRlcmF0b3IgYWRkQmFzaWNCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqQkIsIGNvbnN0IERvbVNldFR5cGUgJmZyb250aWVyKSB7CisgICAgcmV0dXJuIEJhc2UuYWRkQmFzaWNCbG9jayhCQiwgZnJvbnRpZXIpOworICB9CisKKyAgdm9pZCByZW1vdmVCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqQkIpIHsKKyAgICByZXR1cm4gQmFzZS5yZW1vdmVCbG9jayhCQik7CisgIH0KKworICB2b2lkIGFkZFRvRnJvbnRpZXIoaXRlcmF0b3IgSSwgTWFjaGluZUJhc2ljQmxvY2sgKk5vZGUpIHsKKyAgICByZXR1cm4gQmFzZS5hZGRUb0Zyb250aWVyKEksIE5vZGUpOworICB9CisKKyAgdm9pZCByZW1vdmVGcm9tRnJvbnRpZXIoaXRlcmF0b3IgSSwgTWFjaGluZUJhc2ljQmxvY2sgKk5vZGUpIHsKKyAgICByZXR1cm4gQmFzZS5yZW1vdmVGcm9tRnJvbnRpZXIoSSwgTm9kZSk7CisgIH0KKworICBib29sIGNvbXBhcmVEb21TZXQoRG9tU2V0VHlwZSAmRFMxLCBjb25zdCBEb21TZXRUeXBlICZEUzIpIGNvbnN0IHsKKyAgICByZXR1cm4gQmFzZS5jb21wYXJlRG9tU2V0KERTMSwgRFMyKTsKKyAgfQorCisgIGJvb2wgY29tcGFyZShEb21pbmFuY2VGcm9udGllckJhc2U8TWFjaGluZUJhc2ljQmxvY2ssIGZhbHNlPiAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gQmFzZS5jb21wYXJlKE90aGVyKTsKKyAgfQorCisgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZGKSBvdmVycmlkZTsKKworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9NQUNISU5FRE9NSU5BTkNFRlJPTlRJRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVEb21pbmF0b3JzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYXRvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjY0MmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVEb21pbmF0b3JzLmgKQEAgLTAsMCArMSwyOTEgQEAKKy8vPT0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lRG9taW5hdG9ycy5oIC0gTWFjaGluZSBEb20gQ2FsY3VsYXRpb24gLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgY2xhc3NlcyBtaXJyb3JpbmcgdGhvc2UgaW4gbGx2bS9BbmFseXNpcy9Eb21pbmF0b3JzLmgsCisvLyBidXQgZm9yIHRhcmdldC1zcGVjaWZpYyBjb2RlIHJhdGhlciB0aGFuIHRhcmdldC1pbmRlcGVuZGVudCBJUi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FRE9NSU5BVE9SU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FRE9NSU5BVE9SU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dlbmVyaWNEb21UcmVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dlbmVyaWNEb21UcmVlQ29uc3RydWN0aW9uLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBEb21pbmF0b3JUcmVlQmFzZTxNYWNoaW5lQmFzaWNCbG9jaywgZmFsc2U+OjphZGRSb290KAorICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsKKyAgdGhpcy0+Um9vdHMucHVzaF9iYWNrKE1CQik7Cit9CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBEb21UcmVlTm9kZUJhc2U8TWFjaGluZUJhc2ljQmxvY2s+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIERvbWluYXRvclRyZWVCYXNlPE1hY2hpbmVCYXNpY0Jsb2NrLCBmYWxzZT47IC8vIERvbVRyZWUKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBEb21pbmF0b3JUcmVlQmFzZTxNYWNoaW5lQmFzaWNCbG9jaywgdHJ1ZT47IC8vIFBvc3REb21UcmVlCisKK3VzaW5nIE1hY2hpbmVEb21UcmVlTm9kZSA9IERvbVRyZWVOb2RlQmFzZTxNYWNoaW5lQmFzaWNCbG9jaz47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vIERvbWluYXRvclRyZWUgQ2xhc3MgLSBDb25jcmV0ZSBzdWJjbGFzcyBvZiBEb21pbmF0b3JUcmVlQmFzZSB0aGF0IGlzIHVzZWQgdG8KKy8vLyBjb21wdXRlIGEgbm9ybWFsIGRvbWluYXRvciB0cmVlLgorLy8vCitjbGFzcyBNYWNoaW5lRG9taW5hdG9yVHJlZSA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgLy8vIFxicmllZiBIZWxwZXIgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBhbGwgdGhlIGJhc2ljIGJsb2NrcworICAvLy8gaW52b2x2ZWQgaW4gdGhlIHNwbGl0IG9mIGEgY3JpdGljYWwgZWRnZS4KKyAgc3RydWN0IENyaXRpY2FsRWRnZSB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKkZyb21CQjsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqVG9CQjsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqTmV3QkI7CisgIH07CisKKyAgLy8vIFxicmllZiBQaWxlIHVwIGFsbCB0aGUgY3JpdGljYWwgZWRnZXMgdG8gYmUgc3BsaXQuCisgIC8vLyBUaGUgc3BsaXR0aW5nIG9mIGEgY3JpdGljYWwgZWRnZSBpcyBsb2NhbCBhbmQgdGh1cywgaXQgaXMgcG9zc2libGUKKyAgLy8vIHRvIGFwcGx5IHNldmVyYWwgb2YgdGhvc2UgY2hhbmdlcyBhdCB0aGUgc2FtZSB0aW1lLgorICBtdXRhYmxlIFNtYWxsVmVjdG9yPENyaXRpY2FsRWRnZSwgMzI+IENyaXRpY2FsRWRnZXNUb1NwbGl0OworCisgIC8vLyBcYnJpZWYgUmVtZW1iZXIgYWxsIHRoZSBiYXNpYyBibG9ja3MgdGhhdCBhcmUgaW5zZXJ0ZWQgZHVyaW5nCisgIC8vLyBlZGdlIHNwbGl0dGluZy4KKyAgLy8vIEludmFyaWFudDogTmV3QkJzID09IGFsbCB0aGUgYmFzaWMgYmxvY2tzIGNvbnRhaW5lZCBpbiB0aGUgTmV3QkIKKyAgLy8vIGZpZWxkIG9mIGFsbCB0aGUgZWxlbWVudHMgb2YgQ3JpdGljYWxFZGdlc1RvU3BsaXQuCisgIC8vLyBJLmUuLCBmb3JhbGwgZWx0IGluIENyaXRpY2FsRWRnZXNUb1NwbGl0LCBpdCBleGlzdHMgQkIgaW4gTmV3QkJzCisgIC8vLyBzdWNoIGFzIEJCID09IGVsdC5OZXdCQi4KKyAgbXV0YWJsZSBTbWFsbFNldDxNYWNoaW5lQmFzaWNCbG9jayAqLCAzMj4gTmV3QkJzOworCisgIC8vLyBUaGUgRG9taW5hdG9yVHJlZUJhc2UgdGhhdCBpcyB1c2VkIHRvIGNvbXB1dGUgYSBub3JtYWwgZG9taW5hdG9yIHRyZWUKKyAgc3RkOjp1bmlxdWVfcHRyPERvbVRyZWVCYXNlPE1hY2hpbmVCYXNpY0Jsb2NrPj4gRFQ7CisKKyAgLy8vIFxicmllZiBBcHBseSBhbGwgdGhlIHJlY29yZGVkIGNyaXRpY2FsIGVkZ2VzIHRvIHRoZSBEVC4KKyAgLy8vIFRoaXMgdXBkYXRlcyB0aGUgdW5kZXJseWluZyBEVCBpbmZvcm1hdGlvbiBpbiBhIHdheSB0aGF0IHVzZXMKKyAgLy8vIHRoZSBmYXN0IHF1ZXJ5IHBhdGggb2YgRFQgYXMgbXVjaCBhcyBwb3NzaWJsZS4KKyAgLy8vCisgIC8vLyBccG9zdCBDcml0aWNhbEVkZ2VzVG9TcGxpdC5lbXB0eSgpLgorICB2b2lkIGFwcGx5U3BsaXRDcml0aWNhbEVkZ2VzKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgSUQsIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKworICBNYWNoaW5lRG9taW5hdG9yVHJlZSgpOworCisgIERvbVRyZWVCYXNlPE1hY2hpbmVCYXNpY0Jsb2NrPiAmZ2V0QmFzZSgpIHsKKyAgICBpZiAoIURUKSBEVC5yZXNldChuZXcgRG9tVHJlZUJhc2U8TWFjaGluZUJhc2ljQmxvY2s+KCkpOworICAgIGFwcGx5U3BsaXRDcml0aWNhbEVkZ2VzKCk7CisgICAgcmV0dXJuICpEVDsKKyAgfQorCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIGdldFJvb3RzIC0gIFJldHVybiB0aGUgcm9vdCBibG9ja3Mgb2YgdGhlIGN1cnJlbnQgQ0ZHLiAgVGhpcyBtYXkgaW5jbHVkZQorICAvLy8gbXVsdGlwbGUgYmxvY2tzIGlmIHdlIGFyZSBjb21wdXRpbmcgcG9zdCBkb21pbmF0b3JzLiAgRm9yIGZvcndhcmQKKyAgLy8vIGRvbWluYXRvcnMsIHRoaXMgd2lsbCBhbHdheXMgYmUgYSBzaW5nbGUgYmxvY2sgKHRoZSBlbnRyeSBub2RlKS4KKyAgLy8vCisgIGlubGluZSBjb25zdCBTbWFsbFZlY3RvckltcGw8TWFjaGluZUJhc2ljQmxvY2sqPiAmZ2V0Um9vdHMoKSBjb25zdCB7CisgICAgYXBwbHlTcGxpdENyaXRpY2FsRWRnZXMoKTsKKyAgICByZXR1cm4gRFQtPmdldFJvb3RzKCk7CisgIH0KKworICBpbmxpbmUgTWFjaGluZUJhc2ljQmxvY2sgKmdldFJvb3QoKSBjb25zdCB7CisgICAgYXBwbHlTcGxpdENyaXRpY2FsRWRnZXMoKTsKKyAgICByZXR1cm4gRFQtPmdldFJvb3QoKTsKKyAgfQorCisgIGlubGluZSBNYWNoaW5lRG9tVHJlZU5vZGUgKmdldFJvb3ROb2RlKCkgY29uc3QgeworICAgIGFwcGx5U3BsaXRDcml0aWNhbEVkZ2VzKCk7CisgICAgcmV0dXJuIERULT5nZXRSb290Tm9kZSgpOworICB9CisKKyAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworCisgIGlubGluZSBib29sIGRvbWluYXRlcyhjb25zdCBNYWNoaW5lRG9tVHJlZU5vZGUqIEEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRG9tVHJlZU5vZGUqIEIpIGNvbnN0IHsKKyAgICBhcHBseVNwbGl0Q3JpdGljYWxFZGdlcygpOworICAgIHJldHVybiBEVC0+ZG9taW5hdGVzKEEsIEIpOworICB9CisKKyAgaW5saW5lIGJvb2wgZG9taW5hdGVzKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrKiBBLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sqIEIpIGNvbnN0IHsKKyAgICBhcHBseVNwbGl0Q3JpdGljYWxFZGdlcygpOworICAgIHJldHVybiBEVC0+ZG9taW5hdGVzKEEsIEIpOworICB9CisKKyAgLy8gZG9taW5hdGVzIC0gUmV0dXJuIHRydWUgaWYgQSBkb21pbmF0ZXMgQi4gVGhpcyBwZXJmb3JtcyB0aGUKKyAgLy8gc3BlY2lhbCBjaGVja3MgbmVjZXNzYXJ5IGlmIEEgYW5kIEIgYXJlIGluIHRoZSBzYW1lIGJhc2ljIGJsb2NrLgorICBib29sIGRvbWluYXRlcyhjb25zdCBNYWNoaW5lSW5zdHIgKkEsIGNvbnN0IE1hY2hpbmVJbnN0ciAqQikgY29uc3QgeworICAgIGFwcGx5U3BsaXRDcml0aWNhbEVkZ2VzKCk7CisgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKkJCQSA9IEEtPmdldFBhcmVudCgpLCAqQkJCID0gQi0+Z2V0UGFyZW50KCk7CisgICAgaWYgKEJCQSAhPSBCQkIpIHJldHVybiBEVC0+ZG9taW5hdGVzKEJCQSwgQkJCKTsKKworICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgYmFzaWMgYmxvY2sgdW50aWwgd2UgZmluZCBBIG9yIEIuCisgICAgTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEkgPSBCQkEtPmJlZ2luKCk7CisgICAgZm9yICg7ICYqSSAhPSBBICYmICYqSSAhPSBCOyArK0kpCisgICAgICAvKmVtcHR5Ki8gOworCisgICAgLy9pZighRFQuSXNQb3N0RG9taW5hdG9ycykgeworICAgICAgLy8gQSBkb21pbmF0ZXMgQiBpZiBpdCBpcyBmb3VuZCBmaXJzdCBpbiB0aGUgYmFzaWMgYmxvY2suCisgICAgICByZXR1cm4gJipJID09IEE7CisgICAgLy99IGVsc2UgeworICAgIC8vICAvLyBBIHBvc3QtZG9taW5hdGVzIEIgaWYgQiBpcyBmb3VuZCBmaXJzdCBpbiB0aGUgYmFzaWMgYmxvY2suCisgICAgLy8gIHJldHVybiAmKkkgPT0gQjsKKyAgICAvL30KKyAgfQorCisgIGlubGluZSBib29sIHByb3Blcmx5RG9taW5hdGVzKGNvbnN0IE1hY2hpbmVEb21UcmVlTm9kZSogQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZURvbVRyZWVOb2RlKiBCKSBjb25zdCB7CisgICAgYXBwbHlTcGxpdENyaXRpY2FsRWRnZXMoKTsKKyAgICByZXR1cm4gRFQtPnByb3Blcmx5RG9taW5hdGVzKEEsIEIpOworICB9CisKKyAgaW5saW5lIGJvb2wgcHJvcGVybHlEb21pbmF0ZXMoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sqIEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrKiBCKSBjb25zdCB7CisgICAgYXBwbHlTcGxpdENyaXRpY2FsRWRnZXMoKTsKKyAgICByZXR1cm4gRFQtPnByb3Blcmx5RG9taW5hdGVzKEEsIEIpOworICB9CisKKyAgLy8vIGZpbmROZWFyZXN0Q29tbW9uRG9taW5hdG9yIC0gRmluZCBuZWFyZXN0IGNvbW1vbiBkb21pbmF0b3IgYmFzaWMgYmxvY2sKKyAgLy8vIGZvciBiYXNpYyBibG9jayBBIGFuZCBCLiBJZiB0aGVyZSBpcyBubyBzdWNoIGJsb2NrIHRoZW4gcmV0dXJuIE5VTEwuCisgIGlubGluZSBNYWNoaW5lQmFzaWNCbG9jayAqZmluZE5lYXJlc3RDb21tb25Eb21pbmF0b3IoTWFjaGluZUJhc2ljQmxvY2sgKkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkIpIHsKKyAgICBhcHBseVNwbGl0Q3JpdGljYWxFZGdlcygpOworICAgIHJldHVybiBEVC0+ZmluZE5lYXJlc3RDb21tb25Eb21pbmF0b3IoQSwgQik7CisgIH0KKworICBpbmxpbmUgTWFjaGluZURvbVRyZWVOb2RlICpvcGVyYXRvcltdKE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIGFwcGx5U3BsaXRDcml0aWNhbEVkZ2VzKCk7CisgICAgcmV0dXJuIERULT5nZXROb2RlKEJCKTsKKyAgfQorCisgIC8vLyBnZXROb2RlIC0gcmV0dXJuIHRoZSAoUG9zdClEb21pbmF0b3JUcmVlIG5vZGUgZm9yIHRoZSBzcGVjaWZpZWQgYmFzaWMKKyAgLy8vIGJsb2NrLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB1c2luZyBvcGVyYXRvcltdIG9uIHRoaXMgY2xhc3MuCisgIC8vLworICBpbmxpbmUgTWFjaGluZURvbVRyZWVOb2RlICpnZXROb2RlKE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIGFwcGx5U3BsaXRDcml0aWNhbEVkZ2VzKCk7CisgICAgcmV0dXJuIERULT5nZXROb2RlKEJCKTsKKyAgfQorCisgIC8vLyBhZGROZXdCbG9jayAtIEFkZCBhIG5ldyBub2RlIHRvIHRoZSBkb21pbmF0b3IgdHJlZSBpbmZvcm1hdGlvbi4gIFRoaXMKKyAgLy8vIGNyZWF0ZXMgYSBuZXcgbm9kZSBhcyBhIGNoaWxkIG9mIERvbUJCIGRvbWluYXRvciBub2RlLGxpbmtpbmcgaXQgaW50bworICAvLy8gdGhlIGNoaWxkcmVuIGxpc3Qgb2YgdGhlIGltbWVkaWF0ZSBkb21pbmF0b3IuCisgIGlubGluZSBNYWNoaW5lRG9tVHJlZU5vZGUgKmFkZE5ld0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkRvbUJCKSB7CisgICAgYXBwbHlTcGxpdENyaXRpY2FsRWRnZXMoKTsKKyAgICByZXR1cm4gRFQtPmFkZE5ld0Jsb2NrKEJCLCBEb21CQik7CisgIH0KKworICAvLy8gY2hhbmdlSW1tZWRpYXRlRG9taW5hdG9yIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGRvbWluYXRvcgorICAvLy8gdHJlZSBpbmZvcm1hdGlvbiB3aGVuIGEgbm9kZSdzIGltbWVkaWF0ZSBkb21pbmF0b3IgY2hhbmdlcy4KKyAgLy8vCisgIGlubGluZSB2b2lkIGNoYW5nZUltbWVkaWF0ZURvbWluYXRvcihNYWNoaW5lQmFzaWNCbG9jayAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBOZXdJRG9tKSB7CisgICAgYXBwbHlTcGxpdENyaXRpY2FsRWRnZXMoKTsKKyAgICBEVC0+Y2hhbmdlSW1tZWRpYXRlRG9taW5hdG9yKE4sIE5ld0lEb20pOworICB9CisKKyAgaW5saW5lIHZvaWQgY2hhbmdlSW1tZWRpYXRlRG9taW5hdG9yKE1hY2hpbmVEb21UcmVlTm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVEb21UcmVlTm9kZSogTmV3SURvbSkgeworICAgIGFwcGx5U3BsaXRDcml0aWNhbEVkZ2VzKCk7CisgICAgRFQtPmNoYW5nZUltbWVkaWF0ZURvbWluYXRvcihOLCBOZXdJRG9tKTsKKyAgfQorCisgIC8vLyBlcmFzZU5vZGUgLSBSZW1vdmVzIGEgbm9kZSBmcm9tICB0aGUgZG9taW5hdG9yIHRyZWUuIEJsb2NrIG11c3Qgbm90CisgIC8vLyBkb21pbmF0ZSBhbnkgb3RoZXIgYmxvY2tzLiBSZW1vdmVzIG5vZGUgZnJvbSBpdHMgaW1tZWRpYXRlIGRvbWluYXRvcidzCisgIC8vLyBjaGlsZHJlbiBsaXN0LiBEZWxldGVzIGRvbWluYXRvciBub2RlIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBibG9jayBCQi4KKyAgaW5saW5lIHZvaWQgZXJhc2VOb2RlKE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgeworICAgIGFwcGx5U3BsaXRDcml0aWNhbEVkZ2VzKCk7CisgICAgRFQtPmVyYXNlTm9kZShCQik7CisgIH0KKworICAvLy8gc3BsaXRCbG9jayAtIEJCIGlzIHNwbGl0IGFuZCBub3cgaXQgaGFzIG9uZSBzdWNjZXNzb3IuIFVwZGF0ZSBkb21pbmF0b3IKKyAgLy8vIHRyZWUgdG8gcmVmbGVjdCB0aGlzIGNoYW5nZS4KKyAgaW5saW5lIHZvaWQgc3BsaXRCbG9jayhNYWNoaW5lQmFzaWNCbG9jayogTmV3QkIpIHsKKyAgICBhcHBseVNwbGl0Q3JpdGljYWxFZGdlcygpOworICAgIERULT5zcGxpdEJsb2NrKE5ld0JCKTsKKyAgfQorCisgIC8vLyBpc1JlYWNoYWJsZUZyb21FbnRyeSAtIFJldHVybiB0cnVlIGlmIEEgaXMgZG9taW5hdGVkIGJ5IHRoZSBlbnRyeQorICAvLy8gYmxvY2sgb2YgdGhlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgaXQuCisgIGJvb2wgaXNSZWFjaGFibGVGcm9tRW50cnkoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKkEpIHsKKyAgICBhcHBseVNwbGl0Q3JpdGljYWxFZGdlcygpOworICAgIHJldHVybiBEVC0+aXNSZWFjaGFibGVGcm9tRW50cnkoQSk7CisgIH0KKworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKworICB2b2lkIHZlcmlmeUFuYWx5c2lzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSopIGNvbnN0IG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmVjb3JkIHRoYXQgdGhlIGNyaXRpY2FsIGVkZ2UgKEZyb21CQiwgVG9CQikgaGFzIGJlZW4KKyAgLy8vIHNwbGl0IHdpdGggTmV3QkIuCisgIC8vLyBUaGlzIGlzIGJlc3QgdG8gdXNlIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgZGlyZWN0bHkgdXBkYXRlIHRoZQorICAvLy8gdW5kZXJseWluZyBpbmZvcm1hdGlvbiwgYmVjYXVzZSB0aGlzIGhlbHBzIG1pdGlnYXRpbmcgdGhlCisgIC8vLyBudW1iZXIgb2YgdGltZSB0aGUgRFQgaW5mb3JtYXRpb24gaXMgaW52YWxpZGF0ZWQuCisgIC8vLworICAvLy8gXG5vdGUgRG8gbm90IHVzZSB0aGlzIG1ldGhvZCB3aXRoIHJlZ3VsYXIgZWRnZXMuCisgIC8vLworICAvLy8gXG5vdGUgVG8gYmVuZWZpdCBmcm9tIHRoZSBjb21waWxlIHRpbWUgaW1wcm92ZW1lbnQgaW5jdXJyZWQgYnkgdGhpcworICAvLy8gbWV0aG9kLCB0aGUgdXNlcnMgb2YgdGhpcyBtZXRob2QgaGF2ZSB0byBsaW1pdCB0aGUgcXVlcmllcyB0byB0aGUgRFQKKyAgLy8vIGludGVyZmFjZSBiZXR3ZWVuIHR3byBlZGdlcyBzcGxpdHRpbmcuIEluIG90aGVyIHdvcmRzLCB0aGV5IGhhdmUgdG8KKyAgLy8vIHBhY2sgdGhlIHNwbGl0dGluZyBvZiBjcml0aWNhbCBlZGdlcyBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICB2b2lkIHJlY29yZFNwbGl0Q3JpdGljYWxFZGdlKE1hY2hpbmVCYXNpY0Jsb2NrICpGcm9tQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqVG9CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpOZXdCQikgeworICAgIGJvb2wgSW5zZXJ0ZWQgPSBOZXdCQnMuaW5zZXJ0KE5ld0JCKS5zZWNvbmQ7CisgICAgKHZvaWQpSW5zZXJ0ZWQ7CisgICAgYXNzZXJ0KEluc2VydGVkICYmCisgICAgICAgICAgICJBIGJhc2ljIGJsb2NrIGluc2VydGVkIHZpYSBlZGdlIHNwbGl0dGluZyBjYW5ub3QgYXBwZWFyIHR3aWNlIik7CisgICAgQ3JpdGljYWxFZGdlc1RvU3BsaXQucHVzaF9iYWNrKHtGcm9tQkIsIFRvQkIsIE5ld0JCfSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vIERvbWluYXRvclRyZWUgR3JhcGhUcmFpdHMgc3BlY2lhbGl6YXRpb24gc28gdGhlIERvbWluYXRvclRyZWUgY2FuIGJlCisvLy8gaXRlcmFibGUgYnkgZ2VuZXJpYyBncmFwaCBpdGVyYXRvcnMuCisvLy8KKwordGVtcGxhdGUgPGNsYXNzIE5vZGUsIGNsYXNzIENoaWxkSXRlcmF0b3I+CitzdHJ1Y3QgTWFjaGluZURvbVRyZWVHcmFwaFRyYWl0c0Jhc2UgeworICB1c2luZyBOb2RlUmVmID0gTm9kZSAqOworICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9IENoaWxkSXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKE5vZGVSZWYgTikgeyByZXR1cm4gTjsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7IHJldHVybiBOLT5iZWdpbigpOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBOLT5lbmQoKTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBHcmFwaFRyYWl0czsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBHcmFwaFRyYWl0czxNYWNoaW5lRG9tVHJlZU5vZGUgKj4KKyAgICA6IHB1YmxpYyBNYWNoaW5lRG9tVHJlZUdyYXBoVHJhaXRzQmFzZTxNYWNoaW5lRG9tVHJlZU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZURvbVRyZWVOb2RlOjppdGVyYXRvcj4ge307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgR3JhcGhUcmFpdHM8Y29uc3QgTWFjaGluZURvbVRyZWVOb2RlICo+CisgICAgOiBwdWJsaWMgTWFjaGluZURvbVRyZWVHcmFwaFRyYWl0c0Jhc2U8Y29uc3QgTWFjaGluZURvbVRyZWVOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVEb21UcmVlTm9kZTo6Y29uc3RfaXRlcmF0b3I+IHsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxNYWNoaW5lRG9taW5hdG9yVHJlZSo+CisgIDogcHVibGljIEdyYXBoVHJhaXRzPE1hY2hpbmVEb21UcmVlTm9kZSAqPiB7CisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShNYWNoaW5lRG9taW5hdG9yVHJlZSAqRFQpIHsKKyAgICByZXR1cm4gRFQtPmdldFJvb3ROb2RlKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUFDSElORURPTUlOQVRPUlNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4NzUxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmgKQEAgLTAsMCArMSw3MjQgQEAKKy8vPT09LS0gQ29kZUdlbi9NYWNoaW5lRnJhbWVJbmZvLmggLSBBYnN0cmFjdCBTdGFjayBGcmFtZSBSZXAuIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlIGZpbGUgZGVmaW5lcyB0aGUgTWFjaGluZUZyYW1lSW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FRlJBTUVJTkZPX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVGUkFNRUlORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBCaXRWZWN0b3I7CitjbGFzcyBBbGxvY2FJbnN0OworCisvLy8gVGhlIENhbGxlZVNhdmVkSW5mbyBjbGFzcyB0cmFja3MgdGhlIGluZm9ybWF0aW9uIG5lZWQgdG8gbG9jYXRlIHdoZXJlIGEKKy8vLyBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXIgaXMgaW4gdGhlIGN1cnJlbnQgZnJhbWUuCitjbGFzcyBDYWxsZWVTYXZlZEluZm8geworICB1bnNpZ25lZCBSZWc7CisgIGludCBGcmFtZUlkeDsKKyAgLy8vIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByZWdpc3RlciBpcyBhY3R1YWxseSByZXN0b3JlZCBpbiB0aGUgZXBpbG9nLgorICAvLy8gSW4gbW9zdCBjYXNlcywgaWYgYSByZWdpc3RlciBpcyBzYXZlZCwgaXQgaXMgYWxzbyByZXN0b3JlZC4gVGhlcmUgYXJlCisgIC8vLyBzb21lIHNpdHVhdGlvbnMsIHRob3VnaCwgd2hlbiB0aGlzIGlzIG5vdCB0aGUgY2FzZS4gRm9yIGV4YW1wbGUsIHRoZQorICAvLy8gTFIgcmVnaXN0ZXIgb24gQVJNIGlzIHVzdWFsbHkgc2F2ZWQsIGJ1dCBvbiBleGl0IGZyb20gdGhlIGZ1bmN0aW9uIGl0cworICAvLy8gc2F2ZWQgdmFsdWUgbWF5IGJlIGxvYWRlZCBkaXJlY3RseSBpbnRvIFBDLiBTaW5jZSBsaXZlbmVzcyB0cmFja2luZyBvZgorICAvLy8gcGh5c2ljYWwgcmVnaXN0ZXJzIHRyZWF0cyBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzIGFyZSBsaXZlIG91dHNpZGUgb2YKKyAgLy8vIHRoZSBmdW5jdGlvbiwgTFIgd291bGQgYmUgdHJlYXRlZCBhcyBsaXZlLW9uLWV4aXQsIGV2ZW4gdGhvdWdoIGluIHRoZXNlCisgIC8vLyBzY2VuYXJpb3MgaXQgaXMgbm90LiBUaGlzIGZsYWcgaXMgYWRkZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgc2F2ZWQKKyAgLy8vIHJlZ2lzdGVyIGRlc2NyaWJlZCBieSB0aGlzIG9iamVjdCBpcyBub3QgcmVzdG9yZWQgaW4gdGhlIGVwaWxvZy4KKyAgLy8vIFRoZSBsb25nLXRlcm0gc29sdXRpb24gaXMgdG8gbW9kZWwgdGhlIGxpdmVuZXNzIG9mIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMKKyAgLy8vIGJ5IGltcGxpY2l0IHVzZXMgb24gdGhlIHJldHVybiBpbnN0cnVjdGlvbnMsIGhvd2V2ZXIsIHRoZSByZXF1aXJlZAorICAvLy8gY2hhbmdlcyBpbiB0aGUgQVJNIGJhY2tlbmQgd291bGQgYmUgcXVpdGUgZXh0ZW5zaXZlLgorICBib29sIFJlc3RvcmVkOworCitwdWJsaWM6CisgIGV4cGxpY2l0IENhbGxlZVNhdmVkSW5mbyh1bnNpZ25lZCBSLCBpbnQgRkkgPSAwKQorICA6IFJlZyhSKSwgRnJhbWVJZHgoRkkpLCBSZXN0b3JlZCh0cnVlKSB7fQorCisgIC8vIEFjY2Vzc29ycy4KKyAgdW5zaWduZWQgZ2V0UmVnKCkgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHJldHVybiBSZWc7IH0KKyAgaW50IGdldEZyYW1lSWR4KCkgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHJldHVybiBGcmFtZUlkeDsgfQorICB2b2lkIHNldEZyYW1lSWR4KGludCBGSSkgICAgICAgICAgICAgICAgICAgICAgIHsgRnJhbWVJZHggPSBGSTsgfQorICBib29sIGlzUmVzdG9yZWQoKSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmV0dXJuIFJlc3RvcmVkOyB9CisgIHZvaWQgc2V0UmVzdG9yZWQoYm9vbCBSKSAgICAgICAgICAgICAgICAgICAgICAgeyBSZXN0b3JlZCA9IFI7IH0KK307CisKKy8vLyBUaGUgTWFjaGluZUZyYW1lSW5mbyBjbGFzcyByZXByZXNlbnRzIGFuIGFic3RyYWN0IHN0YWNrIGZyYW1lIHVudGlsCisvLy8gcHJvbG9nL2VwaWxvZyBjb2RlIGlzIGluc2VydGVkLiAgVGhpcyBjbGFzcyBpcyBrZXkgdG8gYWxsb3dpbmcgc3RhY2sgZnJhbWUKKy8vLyByZXByZXNlbnRhdGlvbiBvcHRpbWl6YXRpb25zLCBzdWNoIGFzIGZyYW1lIHBvaW50ZXIgZWxpbWluYXRpb24uICBJdCBhbHNvCisvLy8gYWxsb3dzIG1vcmUgbXVuZGFuZSAoYnV0IHN0aWxsIGltcG9ydGFudCkgb3B0aW1pemF0aW9ucywgc3VjaCBhcyByZW9yZGVyaW5nCisvLy8gb2YgYWJzdHJhY3Qgb2JqZWN0cyBvbiB0aGUgc3RhY2sgZnJhbWUuCisvLy8KKy8vLyBUbyBzdXBwb3J0IHRoaXMsIHRoZSBjbGFzcyBhc3NpZ25zIHVuaXF1ZSBpbnRlZ2VyIGlkZW50aWZpZXJzIHRvIHN0YWNrCisvLy8gb2JqZWN0cyByZXF1ZXN0ZWQgY2xpZW50cy4gIFRoZXNlIGlkZW50aWZpZXJzIGFyZSBuZWdhdGl2ZSBpbnRlZ2VycyBmb3IKKy8vLyBmaXhlZCBzdGFjayBvYmplY3RzIChzdWNoIGFzIGFyZ3VtZW50cyBwYXNzZWQgb24gdGhlIHN0YWNrKSBvciBub25uZWdhdGl2ZQorLy8vIGZvciBvYmplY3RzIHRoYXQgbWF5IGJlIHJlb3JkZXJlZC4gIEluc3RydWN0aW9ucyB3aGljaCByZWZlciB0byBzdGFjaworLy8vIG9iamVjdHMgdXNlIGEgc3BlY2lhbCBNT19GcmFtZUluZGV4IG9wZXJhbmQgdG8gcmVwcmVzZW50IHRoZXNlIGZyYW1lCisvLy8gaW5kZXhlcy4KKy8vLworLy8vIEJlY2F1c2UgdGhpcyBjbGFzcyBrZWVwcyB0cmFjayBvZiBhbGwgcmVmZXJlbmNlcyB0byB0aGUgc3RhY2sgZnJhbWUsIGl0CisvLy8ga25vd3Mgd2hlbiBhIHZhcmlhYmxlIHNpemVkIG9iamVjdCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLiAgVGhpcyBpcyB0aGUKKy8vLyBzb2xlIGNvbmRpdGlvbiB3aGljaCBwcmV2ZW50cyBmcmFtZSBwb2ludGVyIGVsaW1pbmF0aW9uLCB3aGljaCBpcyBhbgorLy8vIGltcG9ydGFudCBvcHRpbWl6YXRpb24gb24gcmVnaXN0ZXItcG9vciBhcmNoaXRlY3R1cmVzLiAgQmVjYXVzZSBvcmlnaW5hbAorLy8vIHZhcmlhYmxlIHNpemVkIGFsbG9jYSdzIGluIHRoZSBzb3VyY2UgcHJvZ3JhbSBhcmUgdGhlIG9ubHkgc291cmNlIG9mCisvLy8gdmFyaWFibGUgc2l6ZWQgc3RhY2sgb2JqZWN0cywgaXQgaXMgc2FmZSB0byBkZWNpZGUgd2hldGhlciB0aGVyZSB3aWxsIGJlCisvLy8gYW55IHZhcmlhYmxlIHNpemVkIG9iamVjdHMgYmVmb3JlIGFsbCBzdGFjayBvYmplY3RzIGFyZSBrbm93biAoZm9yCisvLy8gZXhhbXBsZSwgcmVnaXN0ZXIgYWxsb2NhdG9yIHNwaWxsIGNvZGUgbmV2ZXIgbmVlZHMgdmFyaWFibGUgc2l6ZWQKKy8vLyBvYmplY3RzKS4KKy8vLworLy8vIFdoZW4gcHJvbG9nL2VwaWxvZyBjb2RlIGVtaXNzaW9uIGlzIHBlcmZvcm1lZCwgdGhlIGZpbmFsIHN0YWNrIGZyYW1lIGlzCisvLy8gYnVpbHQgYW5kIHRoZSBtYWNoaW5lIGluc3RydWN0aW9ucyBhcmUgbW9kaWZpZWQgdG8gcmVmZXIgdG8gdGhlIGFjdHVhbAorLy8vIHN0YWNrIG9mZnNldHMgb2YgdGhlIG9iamVjdCwgZWxpbWluYXRpbmcgYWxsIE1PX0ZyYW1lSW5kZXggb3BlcmFuZHMgZnJvbQorLy8vIHRoZSBwcm9ncmFtLgorLy8vCisvLy8gQGJyaWVmIEFic3RyYWN0IFN0YWNrIEZyYW1lIEluZm9ybWF0aW9uCitjbGFzcyBNYWNoaW5lRnJhbWVJbmZvIHsKKworICAvLyBSZXByZXNlbnQgYSBzaW5nbGUgb2JqZWN0IGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suCisgIHN0cnVjdCBTdGFja09iamVjdCB7CisgICAgLy8gVGhlIG9mZnNldCBvZiB0aGlzIG9iamVjdCBmcm9tIHRoZSBzdGFjayBwb2ludGVyIG9uIGVudHJ5IHRvCisgICAgLy8gdGhlIGZ1bmN0aW9uLiAgVGhpcyBmaWVsZCBoYXMgbm8gbWVhbmluZyBmb3IgYSB2YXJpYWJsZSBzaXplZCBlbGVtZW50LgorICAgIGludDY0X3QgU1BPZmZzZXQ7CisKKyAgICAvLyBUaGUgc2l6ZSBvZiB0aGlzIG9iamVjdCBvbiB0aGUgc3RhY2suIDAgbWVhbnMgYSB2YXJpYWJsZSBzaXplZCBvYmplY3QsCisgICAgLy8gfjBVTEwgbWVhbnMgYSBkZWFkIG9iamVjdC4KKyAgICB1aW50NjRfdCBTaXplOworCisgICAgLy8gVGhlIHJlcXVpcmVkIGFsaWdubWVudCBvZiB0aGlzIHN0YWNrIHNsb3QuCisgICAgdW5zaWduZWQgQWxpZ25tZW50OworCisgICAgLy8gSWYgdHJ1ZSwgdGhlIHZhbHVlIG9mIHRoZSBzdGFjayBvYmplY3QgaXMgc2V0IGJlZm9yZQorICAgIC8vIGVudGVyaW5nIHRoZSBmdW5jdGlvbiBhbmQgaXMgbm90IG1vZGlmaWVkIGluc2lkZSB0aGUgZnVuY3Rpb24uIEJ5CisgICAgLy8gZGVmYXVsdCwgZml4ZWQgb2JqZWN0cyBhcmUgaW1tdXRhYmxlIHVubGVzcyBtYXJrZWQgb3RoZXJ3aXNlLgorICAgIGJvb2wgaXNJbW11dGFibGU7CisKKyAgICAvLyBJZiB0cnVlIHRoZSBzdGFjayBvYmplY3QgaXMgdXNlZCBhcyBzcGlsbCBzbG90LiBJdAorICAgIC8vIGNhbm5vdCBhbGlhcyBhbnkgb3RoZXIgbWVtb3J5IG9iamVjdHMuCisgICAgYm9vbCBpc1NwaWxsU2xvdDsKKworICAgIC8vLyBJZiB0cnVlLCB0aGlzIHN0YWNrIHNsb3QgaXMgdXNlZCB0byBzcGlsbCBhIHZhbHVlIChjb3VsZCBiZSBkZW9wdAorICAgIC8vLyBhbmQvb3IgR0MgcmVsYXRlZCkgb3ZlciBhIHN0YXRlcG9pbnQuIFdlIGtub3cgdGhhdCB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgICAvLy8gc2xvdCBjYW4ndCBhbGlhcyBhbnkgTExWTSBJUiB2YWx1ZS4gIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIGEgU3BpbGwKKyAgICAvLy8gU2xvdCwgYnV0IGlzIGNyZWF0ZWQgYnkgc3RhdGVwb2ludCBsb3dlcmluZyBpcyBTZWxlY3Rpb25EQUcsIG5vdCB0aGUKKyAgICAvLy8gcmVnaXN0ZXIgYWxsb2NhdG9yLgorICAgIGJvb2wgaXNTdGF0ZXBvaW50U3BpbGxTbG90ID0gZmFsc2U7CisKKyAgICAvLy8gSWRlbnRpZmllciBmb3Igc3RhY2sgbWVtb3J5IHR5cGUgYW5hbGFnb3VzIHRvIGFkZHJlc3Mgc3BhY2UuIElmIHRoaXMgaXMKKyAgICAvLy8gbm9uLTAsIHRoZSBtZWFuaW5nIGlzIHRhcmdldCBkZWZpbmVkLiBPZmZzZXRzIGNhbm5vdCBiZSBkaXJlY3RseQorICAgIC8vLyBjb21wYXJlZCBiZXR3ZWVuIG9iamVjdHMgd2l0aCBkaWZmZXJlbnQgc3RhY2sgSURzLiBUaGUgb2JqZWN0IG1heSBub3QKKyAgICAvLy8gbmVjZXNzYXJpbHkgcmVzaWRlIGluIHRoZSBzYW1lIGNvbnRpZ3VvdXMgbWVtb3J5IGJsb2NrIGFzIG90aGVyIHN0YWNrCisgICAgLy8vIG9iamVjdHMuIE9iamVjdHMgd2l0aCBkaWZmZXJpbmcgc3RhY2sgSURzIHNob3VsZCBub3QgYmUgbWVyZ2VkIG9yCisgICAgLy8vIHJlcGxhY2VkIHN1YnN0aXR1dGVkIGZvciBlYWNoIG90aGVyLgorICAgIHVpbnQ4X3QgU3RhY2tJRDsKKworICAgIC8vLyBJZiB0aGlzIHN0YWNrIG9iamVjdCBpcyBvcmlnaW5hdGVkIGZyb20gYW4gQWxsb2NhIGluc3RydWN0aW9uCisgICAgLy8vIHRoaXMgdmFsdWUgc2F2ZXMgdGhlIG9yaWdpbmFsIElSIGFsbG9jYXRpb24uIENhbiBiZSBOVUxMLgorICAgIGNvbnN0IEFsbG9jYUluc3QgKkFsbG9jYTsKKworICAgIC8vIElmIHRydWUsIHRoZSBvYmplY3Qgd2FzIG1hcHBlZCBpbnRvIHRoZSBsb2NhbCBmcmFtZQorICAgIC8vIGJsb2NrIGFuZCBkb2Vzbid0IG5lZWQgYWRkaXRpb25hbCBoYW5kbGluZyBmb3IgYWxsb2NhdGlvbiBiZXlvbmQgdGhhdC4KKyAgICBib29sIFByZUFsbG9jYXRlZCA9IGZhbHNlOworCisgICAgLy8gSWYgdHJ1ZSwgYW4gTExWTSBJUiB2YWx1ZSBtaWdodCBwb2ludCB0byB0aGlzIG9iamVjdC4KKyAgICAvLyBOb3JtYWxseSwgc3BpbGwgc2xvdHMgYW5kIGZpeGVkLW9mZnNldCBvYmplY3RzIGRvbid0IGFsaWFzIElSLWFjY2Vzc2libGUKKyAgICAvLyBvYmplY3RzLCBidXQgdGhlcmUgYXJlIGV4Y2VwdGlvbnMgKG9uIFBvd2VyUEMsIGZvciBleGFtcGxlLCBzb21lIGJ5dmFsCisgICAgLy8gYXJndW1lbnRzIGhhdmUgQUJJLXByZXNjcmliZWQgb2Zmc2V0cykuCisgICAgYm9vbCBpc0FsaWFzZWQ7CisKKyAgICAvLy8gSWYgdHJ1ZSwgdGhlIG9iamVjdCBoYXMgYmVlbiB6ZXJvLWV4dGVuZGVkLgorICAgIGJvb2wgaXNaRXh0ID0gZmFsc2U7CisKKyAgICAvLy8gSWYgdHJ1ZSwgdGhlIG9iamVjdCBoYXMgYmVlbiB6ZXJvLWV4dGVuZGVkLgorICAgIGJvb2wgaXNTRXh0ID0gZmFsc2U7CisKKyAgICBTdGFja09iamVjdCh1aW50NjRfdCBTaXplLCB1bnNpZ25lZCBBbGlnbm1lbnQsIGludDY0X3QgU1BPZmZzZXQsCisgICAgICAgICAgICAgICAgYm9vbCBJc0ltbXV0YWJsZSwgYm9vbCBJc1NwaWxsU2xvdCwgY29uc3QgQWxsb2NhSW5zdCAqQWxsb2NhLAorICAgICAgICAgICAgICAgIGJvb2wgSXNBbGlhc2VkLCB1aW50OF90IFN0YWNrSUQgPSAwKQorICAgICAgOiBTUE9mZnNldChTUE9mZnNldCksIFNpemUoU2l6ZSksIEFsaWdubWVudChBbGlnbm1lbnQpLAorICAgICAgICBpc0ltbXV0YWJsZShJc0ltbXV0YWJsZSksIGlzU3BpbGxTbG90KElzU3BpbGxTbG90KSwKKyAgICAgICAgU3RhY2tJRChTdGFja0lEKSwgQWxsb2NhKEFsbG9jYSksIGlzQWxpYXNlZChJc0FsaWFzZWQpIHt9CisgIH07CisKKyAgLy8vIFRoZSBhbGlnbm1lbnQgb2YgdGhlIHN0YWNrLgorICB1bnNpZ25lZCBTdGFja0FsaWdubWVudDsKKworICAvLy8gQ2FuIHRoZSBzdGFjayBiZSByZWFsaWduZWQuIFRoaXMgY2FuIGJlIGZhbHNlIGlmIHRoZSB0YXJnZXQgZG9lcyBub3QKKyAgLy8vIHN1cHBvcnQgc3RhY2sgcmVhbGlnbm1lbnQsIG9yIGlmIHRoZSB1c2VyIGFza3MgdXMgbm90IHRvIHJlYWxpZ24gdGhlCisgIC8vLyBzdGFjay4gSW4gdGhpcyBzaXR1YXRpb24sIG92ZXJhbGlnbmVkIGFsbG9jYXMgYXJlIGFsbCB0cmVhdGVkIGFzIGR5bmFtaWMKKyAgLy8vIGFsbG9jYXRpb25zIGFuZCB0aGUgdGFyZ2V0IG11c3QgaGFuZGxlIHRoZW0gYXMgcGFydCBvZiBEWU5BTUlDX1NUQUNLQUxMT0MKKyAgLy8vIGxvd2VyaW5nLiBBbGwgbm9uLWFsbG9jYSBzdGFjayBvYmplY3RzIGhhdmUgdGhlaXIgYWxpZ25tZW50IGNsYW1wZWQgdG8gdGhlCisgIC8vLyBiYXNlIEFCSSBzdGFjayBhbGlnbm1lbnQuCisgIC8vLyBGSVhNRTogVGhlcmUgaXMgcm9vbSBmb3IgaW1wcm92ZW1lbnQgaW4gdGhpcyBjYXNlLCBpbiB0ZXJtcyBvZgorICAvLy8gZ3JvdXBpbmcgb3ZlcmFsaWduZWQgYWxsb2NhcyBpbnRvIGEgInNlY29uZGFyeSBzdGFjayBmcmFtZSIgYW5kCisgIC8vLyB0aGVuIG9ubHkgdXNlIGEgc2luZ2xlIGFsbG9jYSB0byBhbGxvY2F0ZSB0aGlzIGZyYW1lIGFuZCBvbmx5IGEKKyAgLy8vIHNpbmdsZSB2aXJ0dWFsIHJlZ2lzdGVyIHRvIGFjY2VzcyBpdC4gQ3VycmVudGx5LCB3aXRob3V0IHN1Y2ggYW4KKyAgLy8vIG9wdGltaXphdGlvbiwgZWFjaCBzdWNoIGFsbG9jYSBnZXRzIGl0cyBvd24gZHluYW1pYyByZWFsaWdubWVudC4KKyAgYm9vbCBTdGFja1JlYWxpZ25hYmxlOworCisgIC8vLyBXaGV0aGVyIHRoZSBmdW5jdGlvbiBoYXMgdGhlIFxjIGFsaWduc3RhY2sgYXR0cmlidXRlLgorICBib29sIEZvcmNlZFJlYWxpZ247CisKKyAgLy8vIFRoZSBsaXN0IG9mIHN0YWNrIG9iamVjdHMgYWxsb2NhdGVkLgorICBzdGQ6OnZlY3RvcjxTdGFja09iamVjdD4gT2JqZWN0czsKKworICAvLy8gVGhpcyBjb250YWlucyB0aGUgbnVtYmVyIG9mIGZpeGVkIG9iamVjdHMgY29udGFpbmVkIG9uCisgIC8vLyB0aGUgc3RhY2suICBCZWNhdXNlIGZpeGVkIG9iamVjdHMgYXJlIHN0b3JlZCBhdCBhIG5lZ2F0aXZlIGluZGV4IGluIHRoZQorICAvLy8gT2JqZWN0cyBsaXN0LCB0aGlzIGlzIGFsc28gdGhlIGluZGV4IHRvIHRoZSAwdGggb2JqZWN0IGluIHRoZSBsaXN0LgorICB1bnNpZ25lZCBOdW1GaXhlZE9iamVjdHMgPSAwOworCisgIC8vLyBUaGlzIGJvb2xlYW4ga2VlcHMgdHJhY2sgb2Ygd2hldGhlciBhbnkgdmFyaWFibGUKKyAgLy8vIHNpemVkIG9iamVjdHMgaGF2ZSBiZWVuIGFsbG9jYXRlZCB5ZXQuCisgIGJvb2wgSGFzVmFyU2l6ZWRPYmplY3RzID0gZmFsc2U7CisKKyAgLy8vIFRoaXMgYm9vbGVhbiBrZWVwcyB0cmFjayBvZiB3aGV0aGVyIHRoZXJlIGlzIGEgY2FsbAorICAvLy8gdG8gYnVpbHRpbiBcQGxsdm0uZnJhbWVhZGRyZXNzLgorICBib29sIEZyYW1lQWRkcmVzc1Rha2VuID0gZmFsc2U7CisKKyAgLy8vIFRoaXMgYm9vbGVhbiBrZWVwcyB0cmFjayBvZiB3aGV0aGVyIHRoZXJlIGlzIGEgY2FsbAorICAvLy8gdG8gYnVpbHRpbiBcQGxsdm0ucmV0dXJuYWRkcmVzcy4KKyAgYm9vbCBSZXR1cm5BZGRyZXNzVGFrZW4gPSBmYWxzZTsKKworICAvLy8gVGhpcyBib29sZWFuIGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgdGhlcmUgaXMgYSBjYWxsCisgIC8vLyB0byBidWlsdGluIFxAbGx2bS5leHBlcmltZW50YWwuc3RhY2ttYXAuCisgIGJvb2wgSGFzU3RhY2tNYXAgPSBmYWxzZTsKKworICAvLy8gVGhpcyBib29sZWFuIGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgdGhlcmUgaXMgYSBjYWxsCisgIC8vLyB0byBidWlsdGluIFxAbGx2bS5leHBlcmltZW50YWwucGF0Y2hwb2ludC4KKyAgYm9vbCBIYXNQYXRjaFBvaW50ID0gZmFsc2U7CisKKyAgLy8vIFRoZSBwcm9sb2cvZXBpbG9nIGNvZGUgaW5zZXJ0ZXIgY2FsY3VsYXRlcyB0aGUgZmluYWwgc3RhY2sKKyAgLy8vIG9mZnNldHMgZm9yIGFsbCBvZiB0aGUgZml4ZWQgc2l6ZSBvYmplY3RzLCB1cGRhdGluZyB0aGUgT2JqZWN0cyBsaXN0CisgIC8vLyBhYm92ZS4gIEl0IHRoZW4gdXBkYXRlcyBTdGFja1NpemUgdG8gY29udGFpbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbmVlZAorICAvLy8gdG8gYmUgYWxsb2NhdGVkIG9uIGVudHJ5IHRvIHRoZSBmdW5jdGlvbi4KKyAgdWludDY0X3QgU3RhY2tTaXplID0gMDsKKworICAvLy8gVGhlIGFtb3VudCB0aGF0IGEgZnJhbWUgb2Zmc2V0IG5lZWRzIHRvIGJlIGFkanVzdGVkIHRvCisgIC8vLyBoYXZlIHRoZSBhY3R1YWwgb2Zmc2V0IGZyb20gdGhlIHN0YWNrL2ZyYW1lIHBvaW50ZXIuICBUaGUgZXhhY3QgdXNhZ2Ugb2YKKyAgLy8vIHRoaXMgaXMgdGFyZ2V0LWRlcGVuZGVudCwgYnV0IGl0IGlzIHR5cGljYWxseSB1c2VkIHRvIGFkanVzdCBiZXR3ZWVuCisgIC8vLyBTUC1yZWxhdGl2ZSBhbmQgRlAtcmVsYXRpdmUgb2Zmc2V0cy4gIEUuRy4sIGlmIG9iamVjdHMgYXJlIGFjY2Vzc2VkIHZpYQorICAvLy8gU1AgdGhlbiBPZmZzZXRBZGp1c3RtZW50IGlzIHplcm87IGlmIEZQIGlzIHVzZWQsIE9mZnNldEFkanVzdG1lbnQgaXMgc2V0CisgIC8vLyB0byB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgaW5pdGlhbCBTUCBhbmQgdGhlIHZhbHVlIGluIEZQLiAgRm9yIG1hbnkKKyAgLy8vIHRhcmdldHMsIHRoaXMgdmFsdWUgaXMgb25seSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBkZWJ1ZyBpbmZvICh2aWEKKyAgLy8vIFRhcmdldFJlZ2lzdGVySW5mbzo6Z2V0RnJhbWVJbmRleFJlZmVyZW5jZSk7IHdoZW4gZ2VuZXJhdGluZyBjb2RlLCB0aGUKKyAgLy8vIGNvcnJlc3BvbmRpbmcgYWRqdXN0bWVudHMgYXJlIHBlcmZvcm1lZCBkaXJlY3RseS4KKyAgaW50IE9mZnNldEFkanVzdG1lbnQgPSAwOworCisgIC8vLyBUaGUgcHJvbG9nL2VwaWxvZyBjb2RlIGluc2VydGVyIG1heSBwcm9jZXNzIG9iamVjdHMgdGhhdCByZXF1aXJlIGdyZWF0ZXIKKyAgLy8vIGFsaWdubWVudCB0aGFuIHRoZSBkZWZhdWx0IGFsaWdubWVudCB0aGUgdGFyZ2V0IHByb3ZpZGVzLgorICAvLy8gVG8gaGFuZGxlIHRoaXMsIE1heEFsaWdubWVudCBpcyBzZXQgdG8gdGhlIG1heGltdW0gYWxpZ25tZW50CisgIC8vLyBuZWVkZWQgYnkgdGhlIG9iamVjdHMgb24gdGhlIGN1cnJlbnQgZnJhbWUuICBJZiB0aGlzIGlzIGdyZWF0ZXIgdGhhbiB0aGUKKyAgLy8vIG5hdGl2ZSBhbGlnbm1lbnQgbWFpbnRhaW5lZCBieSB0aGUgY29tcGlsZXIsIGR5bmFtaWMgYWxpZ25tZW50IGNvZGUgd2lsbAorICAvLy8gYmUgbmVlZGVkLgorICAvLy8KKyAgdW5zaWduZWQgTWF4QWxpZ25tZW50ID0gMDsKKworICAvLy8gU2V0IHRvIHRydWUgaWYgdGhpcyBmdW5jdGlvbiBhZGp1c3RzIHRoZSBzdGFjayAtLSBlLmcuLAorICAvLy8gd2hlbiBjYWxsaW5nIGFub3RoZXIgZnVuY3Rpb24uIFRoaXMgaXMgb25seSB2YWxpZCBkdXJpbmcgYW5kIGFmdGVyCisgIC8vLyBwcm9sb2cvZXBpbG9nIGNvZGUgaW5zZXJ0aW9uLgorICBib29sIEFkanVzdHNTdGFjayA9IGZhbHNlOworCisgIC8vLyBTZXQgdG8gdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGhhcyBhbnkgZnVuY3Rpb24gY2FsbHMuCisgIGJvb2wgSGFzQ2FsbHMgPSBmYWxzZTsKKworICAvLy8gVGhlIGZyYW1lIGluZGV4IGZvciB0aGUgc3RhY2sgcHJvdGVjdG9yLgorICBpbnQgU3RhY2tQcm90ZWN0b3JJZHggPSAtMTsKKworICAvLy8gVGhlIGZyYW1lIGluZGV4IGZvciB0aGUgZnVuY3Rpb24gY29udGV4dC4gVXNlZCBmb3IgU2pMaiBleGNlcHRpb25zLgorICBpbnQgRnVuY3Rpb25Db250ZXh0SWR4ID0gLTE7CisKKyAgLy8vIFRoaXMgY29udGFpbnMgdGhlIHNpemUgb2YgdGhlIGxhcmdlc3QgY2FsbCBmcmFtZSBpZiB0aGUgdGFyZ2V0IHVzZXMgZnJhbWUKKyAgLy8vIHNldHVwL2Rlc3Ryb3kgcHNldWRvIGluc3RydWN0aW9ucyAoYXMgZGVmaW5lZCBpbiB0aGUgVGFyZ2V0RnJhbWVJbmZvCisgIC8vLyBjbGFzcykuICBUaGlzIGluZm9ybWF0aW9uIGlzIGltcG9ydGFudCBmb3IgZnJhbWUgcG9pbnRlciBlbGltaW5hdGlvbi4KKyAgLy8vIEl0IGlzIG9ubHkgdmFsaWQgZHVyaW5nIGFuZCBhZnRlciBwcm9sb2cvZXBpbG9nIGNvZGUgaW5zZXJ0aW9uLgorICB1bnNpZ25lZCBNYXhDYWxsRnJhbWVTaXplID0gfjB1OworCisgIC8vLyBUaGUgcHJvbG9nL2VwaWxvZyBjb2RlIGluc2VydGVyIGZpbGxzIGluIHRoaXMgdmVjdG9yIHdpdGggZWFjaAorICAvLy8gY2FsbGVlIHNhdmVkIHJlZ2lzdGVyIHNhdmVkIGluIHRoZSBmcmFtZS4gIEJleW9uZCBpdHMgdXNlIGJ5IHRoZSBwcm9sb2cvCisgIC8vLyBlcGlsb2cgY29kZSBpbnNlcnRlciwgdGhpcyBkYXRhIHVzZWQgZm9yIGRlYnVnIGluZm8gYW5kIGV4Y2VwdGlvbgorICAvLy8gaGFuZGxpbmcuCisgIHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gQ1NJbmZvOworCisgIC8vLyBIYXMgQ1NJbmZvIGJlZW4gc2V0IHlldD8KKyAgYm9vbCBDU0lWYWxpZCA9IGZhbHNlOworCisgIC8vLyBSZWZlcmVuY2VzIHRvIGZyYW1lIGluZGljZXMgd2hpY2ggYXJlIG1hcHBlZAorICAvLy8gaW50byB0aGUgbG9jYWwgZnJhbWUgYWxsb2NhdGlvbiBibG9jay4gPEZyYW1lSWR4LCBMb2NhbE9mZnNldD4KKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPGludCwgaW50NjRfdD4sIDMyPiBMb2NhbEZyYW1lT2JqZWN0czsKKworICAvLy8gU2l6ZSBvZiB0aGUgcHJlLWFsbG9jYXRlZCBsb2NhbCBmcmFtZSBibG9jay4KKyAgaW50NjRfdCBMb2NhbEZyYW1lU2l6ZSA9IDA7CisKKyAgLy8vIFJlcXVpcmVkIGFsaWdubWVudCBvZiB0aGUgbG9jYWwgb2JqZWN0IGJsb2IsIHdoaWNoIGlzIHRoZSBzdHJpY3Rlc3QKKyAgLy8vIGFsaWdubWVudCBvZiBhbnkgb2JqZWN0IGluIGl0LgorICB1bnNpZ25lZCBMb2NhbEZyYW1lTWF4QWxpZ24gPSAwOworCisgIC8vLyBXaGV0aGVyIHRoZSBsb2NhbCBvYmplY3QgYmxvYiBuZWVkcyB0byBiZSBhbGxvY2F0ZWQgdG9nZXRoZXIuIElmIG5vdCwKKyAgLy8vIFBFSSBzaG91bGQgaWdub3JlIHRoZSBpc1ByZUFsbG9jYXRlZCBmbGFncyBvbiB0aGUgc3RhY2sgb2JqZWN0cyBhbmQKKyAgLy8vIGp1c3QgYWxsb2NhdGUgdGhlbSBub3JtYWxseS4KKyAgYm9vbCBVc2VMb2NhbFN0YWNrQWxsb2NhdGlvbkJsb2NrID0gZmFsc2U7CisKKyAgLy8vIFRydWUgaWYgdGhlIGZ1bmN0aW9uIGR5bmFtaWNhbGx5IGFkanVzdHMgdGhlIHN0YWNrIHBvaW50ZXIgdGhyb3VnaCBzb21lCisgIC8vLyBvcGFxdWUgbWVjaGFuaXNtIGxpa2UgaW5saW5lIGFzc2VtYmx5IG9yIFdpbjMyIEVILgorICBib29sIEhhc09wYXF1ZVNQQWRqdXN0bWVudCA9IGZhbHNlOworCisgIC8vLyBUcnVlIGlmIHRoZSBmdW5jdGlvbiBjb250YWlucyBvcGVyYXRpb25zIHdoaWNoIHdpbGwgbG93ZXIgZG93biB0bworICAvLy8gaW5zdHJ1Y3Rpb25zIHdoaWNoIG1hbmlwdWxhdGUgdGhlIHN0YWNrIHBvaW50ZXIuCisgIGJvb2wgSGFzQ29weUltcGx5aW5nU3RhY2tBZGp1c3RtZW50ID0gZmFsc2U7CisKKyAgLy8vIFRydWUgaWYgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIGEgY2FsbCB0byB0aGUgbGx2bS52YXN0YXJ0IGludHJpbnNpYy4KKyAgYm9vbCBIYXNWQVN0YXJ0ID0gZmFsc2U7CisKKyAgLy8vIFRydWUgaWYgdGhpcyBpcyBhIHZhcmFyZ3MgZnVuY3Rpb24gdGhhdCBjb250YWlucyBhIG11c3R0YWlsIGNhbGwuCisgIGJvb2wgSGFzTXVzdFRhaWxJblZhckFyZ0Z1bmMgPSBmYWxzZTsKKworICAvLy8gVHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGNvbnRhaW5zIGEgdGFpbCBjYWxsLiBJZiBzbyBpbW11dGFibGUgb2JqZWN0cyBsaWtlCisgIC8vLyBmdW5jdGlvbiBhcmd1bWVudHMgYXJlIG5vIGxvbmdlciBzby4gQSB0YWlsIGNhbGwgKmNhbiogb3ZlcnJpZGUgZml4ZWQKKyAgLy8vIHN0YWNrIG9iamVjdHMgbGlrZSBhcmd1bWVudHMgc28gd2UgY2FuJ3QgdHJlYXQgdGhlbSBhcyBpbW11dGFibGUuCisgIGJvb2wgSGFzVGFpbENhbGwgPSBmYWxzZTsKKworICAvLy8gTm90IG51bGwsIGlmIHNocmluay13cmFwcGluZyBmb3VuZCBhIGJldHRlciBwbGFjZSBmb3IgdGhlIHByb2xvZ3VlLgorICBNYWNoaW5lQmFzaWNCbG9jayAqU2F2ZSA9IG51bGxwdHI7CisgIC8vLyBOb3QgbnVsbCwgaWYgc2hyaW5rLXdyYXBwaW5nIGZvdW5kIGEgYmV0dGVyIHBsYWNlIGZvciB0aGUgZXBpbG9ndWUuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpSZXN0b3JlID0gbnVsbHB0cjsKKworcHVibGljOgorICBleHBsaWNpdCBNYWNoaW5lRnJhbWVJbmZvKHVuc2lnbmVkIFN0YWNrQWxpZ25tZW50LCBib29sIFN0YWNrUmVhbGlnbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBGb3JjZWRSZWFsaWduKQorICAgICAgOiBTdGFja0FsaWdubWVudChTdGFja0FsaWdubWVudCksIFN0YWNrUmVhbGlnbmFibGUoU3RhY2tSZWFsaWduYWJsZSksCisgICAgICAgIEZvcmNlZFJlYWxpZ24oRm9yY2VkUmVhbGlnbikge30KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGFueSBzdGFjayBvYmplY3RzIGluIHRoaXMgZnVuY3Rpb24uCisgIGJvb2wgaGFzU3RhY2tPYmplY3RzKCkgY29uc3QgeyByZXR1cm4gIU9iamVjdHMuZW1wdHkoKTsgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGFueSB0aW1lIGFmdGVyIGluc3RydWN0aW9uCisgIC8vLyBzZWxlY3Rpb24gaXMgY29tcGxldGUgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzdGFjayBmcmFtZSBmb3IgdGhpcyBmdW5jdGlvbgorICAvLy8gY29udGFpbnMgYW55IHZhcmlhYmxlIHNpemVkIG9iamVjdHMuCisgIGJvb2wgaGFzVmFyU2l6ZWRPYmplY3RzKCkgY29uc3QgeyByZXR1cm4gSGFzVmFyU2l6ZWRPYmplY3RzOyB9CisKKyAgLy8vIFJldHVybiB0aGUgaW5kZXggZm9yIHRoZSBzdGFjayBwcm90ZWN0b3Igb2JqZWN0LgorICBpbnQgZ2V0U3RhY2tQcm90ZWN0b3JJbmRleCgpIGNvbnN0IHsgcmV0dXJuIFN0YWNrUHJvdGVjdG9ySWR4OyB9CisgIHZvaWQgc2V0U3RhY2tQcm90ZWN0b3JJbmRleChpbnQgSSkgeyBTdGFja1Byb3RlY3RvcklkeCA9IEk7IH0KKyAgYm9vbCBoYXNTdGFja1Byb3RlY3RvckluZGV4KCkgY29uc3QgeyByZXR1cm4gU3RhY2tQcm90ZWN0b3JJZHggIT0gLTE7IH0KKworICAvLy8gUmV0dXJuIHRoZSBpbmRleCBmb3IgdGhlIGZ1bmN0aW9uIGNvbnRleHQgb2JqZWN0LgorICAvLy8gVGhpcyBvYmplY3QgaXMgdXNlZCBmb3IgU2pMaiBleGNlcHRpb25zLgorICBpbnQgZ2V0RnVuY3Rpb25Db250ZXh0SW5kZXgoKSBjb25zdCB7IHJldHVybiBGdW5jdGlvbkNvbnRleHRJZHg7IH0KKyAgdm9pZCBzZXRGdW5jdGlvbkNvbnRleHRJbmRleChpbnQgSSkgeyBGdW5jdGlvbkNvbnRleHRJZHggPSBJOyB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYW55IHRpbWUgYWZ0ZXIgaW5zdHJ1Y3Rpb24KKyAgLy8vIHNlbGVjdGlvbiBpcyBjb21wbGV0ZSB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBjYWxsIHRvCisgIC8vLyBcQGxsdm0uZnJhbWVhZGRyZXNzIGluIHRoaXMgZnVuY3Rpb24uCisgIGJvb2wgaXNGcmFtZUFkZHJlc3NUYWtlbigpIGNvbnN0IHsgcmV0dXJuIEZyYW1lQWRkcmVzc1Rha2VuOyB9CisgIHZvaWQgc2V0RnJhbWVBZGRyZXNzSXNUYWtlbihib29sIFQpIHsgRnJhbWVBZGRyZXNzVGFrZW4gPSBUOyB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYW55IHRpbWUgYWZ0ZXIKKyAgLy8vIGluc3RydWN0aW9uIHNlbGVjdGlvbiBpcyBjb21wbGV0ZSB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBjYWxsIHRvCisgIC8vLyBcQGxsdm0ucmV0dXJuYWRkcmVzcyBpbiB0aGlzIGZ1bmN0aW9uLgorICBib29sIGlzUmV0dXJuQWRkcmVzc1Rha2VuKCkgY29uc3QgeyByZXR1cm4gUmV0dXJuQWRkcmVzc1Rha2VuOyB9CisgIHZvaWQgc2V0UmV0dXJuQWRkcmVzc0lzVGFrZW4oYm9vbCBzKSB7IFJldHVybkFkZHJlc3NUYWtlbiA9IHM7IH0KKworICAvLy8gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBhbnkgdGltZSBhZnRlciBpbnN0cnVjdGlvbgorICAvLy8gc2VsZWN0aW9uIGlzIGNvbXBsZXRlIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIGNhbGwgdG8gYnVpbHRpbgorICAvLy8gXEBsbHZtLmV4cGVyaW1lbnRhbC5zdGFja21hcC4KKyAgYm9vbCBoYXNTdGFja01hcCgpIGNvbnN0IHsgcmV0dXJuIEhhc1N0YWNrTWFwOyB9CisgIHZvaWQgc2V0SGFzU3RhY2tNYXAoYm9vbCBzID0gdHJ1ZSkgeyBIYXNTdGFja01hcCA9IHM7IH0KKworICAvLy8gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBhbnkgdGltZSBhZnRlciBpbnN0cnVjdGlvbgorICAvLy8gc2VsZWN0aW9uIGlzIGNvbXBsZXRlIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIGNhbGwgdG8gYnVpbHRpbgorICAvLy8gXEBsbHZtLmV4cGVyaW1lbnRhbC5wYXRjaHBvaW50LgorICBib29sIGhhc1BhdGNoUG9pbnQoKSBjb25zdCB7IHJldHVybiBIYXNQYXRjaFBvaW50OyB9CisgIHZvaWQgc2V0SGFzUGF0Y2hQb2ludChib29sIHMgPSB0cnVlKSB7IEhhc1BhdGNoUG9pbnQgPSBzOyB9CisKKyAgLy8vIFJldHVybiB0aGUgbWluaW11bSBmcmFtZSBvYmplY3QgaW5kZXguCisgIGludCBnZXRPYmplY3RJbmRleEJlZ2luKCkgY29uc3QgeyByZXR1cm4gLU51bUZpeGVkT2JqZWN0czsgfQorCisgIC8vLyBSZXR1cm4gb25lIHBhc3QgdGhlIG1heGltdW0gZnJhbWUgb2JqZWN0IGluZGV4LgorICBpbnQgZ2V0T2JqZWN0SW5kZXhFbmQoKSBjb25zdCB7IHJldHVybiAoaW50KU9iamVjdHMuc2l6ZSgpLU51bUZpeGVkT2JqZWN0czsgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBmaXhlZCBvYmplY3RzLgorICB1bnNpZ25lZCBnZXROdW1GaXhlZE9iamVjdHMoKSBjb25zdCB7IHJldHVybiBOdW1GaXhlZE9iamVjdHM7IH0KKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2JqZWN0cy4KKyAgdW5zaWduZWQgZ2V0TnVtT2JqZWN0cygpIGNvbnN0IHsgcmV0dXJuIE9iamVjdHMuc2l6ZSgpOyB9CisKKyAgLy8vIE1hcCBhIGZyYW1lIGluZGV4IGludG8gdGhlIGxvY2FsIG9iamVjdCBibG9jaworICB2b2lkIG1hcExvY2FsRnJhbWVPYmplY3QoaW50IE9iamVjdEluZGV4LCBpbnQ2NF90IE9mZnNldCkgeworICAgIExvY2FsRnJhbWVPYmplY3RzLnB1c2hfYmFjayhzdGQ6OnBhaXI8aW50LCBpbnQ2NF90PihPYmplY3RJbmRleCwgT2Zmc2V0KSk7CisgICAgT2JqZWN0c1tPYmplY3RJbmRleCArIE51bUZpeGVkT2JqZWN0c10uUHJlQWxsb2NhdGVkID0gdHJ1ZTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGxvY2FsIG9mZnNldCBtYXBwaW5nIGZvciBhIGZvciBhbiBvYmplY3QuCisgIHN0ZDo6cGFpcjxpbnQsIGludDY0X3Q+IGdldExvY2FsRnJhbWVPYmplY3RNYXAoaW50IGkpIGNvbnN0IHsKKyAgICBhc3NlcnQgKGkgPj0gMCAmJiAodW5zaWduZWQpaSA8IExvY2FsRnJhbWVPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAgIkludmFsaWQgbG9jYWwgb2JqZWN0IHJlZmVyZW5jZSEiKTsKKyAgICByZXR1cm4gTG9jYWxGcmFtZU9iamVjdHNbaV07CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBhbGxvY2F0ZWQgaW50byB0aGUgbG9jYWwgb2JqZWN0IGJsb2NrLgorICBpbnQ2NF90IGdldExvY2FsRnJhbWVPYmplY3RDb3VudCgpIGNvbnN0IHsgcmV0dXJuIExvY2FsRnJhbWVPYmplY3RzLnNpemUoKTsgfQorCisgIC8vLyBTZXQgdGhlIHNpemUgb2YgdGhlIGxvY2FsIG9iamVjdCBibG9iLgorICB2b2lkIHNldExvY2FsRnJhbWVTaXplKGludDY0X3Qgc3opIHsgTG9jYWxGcmFtZVNpemUgPSBzejsgfQorCisgIC8vLyBHZXQgdGhlIHNpemUgb2YgdGhlIGxvY2FsIG9iamVjdCBibG9iLgorICBpbnQ2NF90IGdldExvY2FsRnJhbWVTaXplKCkgY29uc3QgeyByZXR1cm4gTG9jYWxGcmFtZVNpemU7IH0KKworICAvLy8gUmVxdWlyZWQgYWxpZ25tZW50IG9mIHRoZSBsb2NhbCBvYmplY3QgYmxvYiwKKyAgLy8vIHdoaWNoIGlzIHRoZSBzdHJpY3Rlc3QgYWxpZ25tZW50IG9mIGFueSBvYmplY3QgaW4gaXQuCisgIHZvaWQgc2V0TG9jYWxGcmFtZU1heEFsaWduKHVuc2lnbmVkIEFsaWduKSB7IExvY2FsRnJhbWVNYXhBbGlnbiA9IEFsaWduOyB9CisKKyAgLy8vIFJldHVybiB0aGUgcmVxdWlyZWQgYWxpZ25tZW50IG9mIHRoZSBsb2NhbCBvYmplY3QgYmxvYi4KKyAgdW5zaWduZWQgZ2V0TG9jYWxGcmFtZU1heEFsaWduKCkgY29uc3QgeyByZXR1cm4gTG9jYWxGcmFtZU1heEFsaWduOyB9CisKKyAgLy8vIEdldCB3aGV0aGVyIHRoZSBsb2NhbCBhbGxvY2F0aW9uIGJsb2Igc2hvdWxkIGJlIGFsbG9jYXRlZCB0b2dldGhlciBvcgorICAvLy8gbGV0IFBFSSBhbGxvY2F0ZSB0aGUgbG9jYWxzIGluIGl0IGRpcmVjdGx5LgorICBib29sIGdldFVzZUxvY2FsU3RhY2tBbGxvY2F0aW9uQmxvY2soKSBjb25zdCB7CisgICAgcmV0dXJuIFVzZUxvY2FsU3RhY2tBbGxvY2F0aW9uQmxvY2s7CisgIH0KKworICAvLy8gc2V0VXNlTG9jYWxTdGFja0FsbG9jYXRpb25CbG9jayAtIFNldCB3aGV0aGVyIHRoZSBsb2NhbCBhbGxvY2F0aW9uIGJsb2IKKyAgLy8vIHNob3VsZCBiZSBhbGxvY2F0ZWQgdG9nZXRoZXIgb3IgbGV0IFBFSSBhbGxvY2F0ZSB0aGUgbG9jYWxzIGluIGl0CisgIC8vLyBkaXJlY3RseS4KKyAgdm9pZCBzZXRVc2VMb2NhbFN0YWNrQWxsb2NhdGlvbkJsb2NrKGJvb2wgdikgeworICAgIFVzZUxvY2FsU3RhY2tBbGxvY2F0aW9uQmxvY2sgPSB2OworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3Qgd2FzIHByZS1hbGxvY2F0ZWQgaW50byB0aGUgbG9jYWwgYmxvY2suCisgIGJvb2wgaXNPYmplY3RQcmVBbGxvY2F0ZWQoaW50IE9iamVjdElkeCkgY29uc3QgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgcmV0dXJuIE9iamVjdHNbT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0c10uUHJlQWxsb2NhdGVkOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAgaW50NjRfdCBnZXRPYmplY3RTaXplKGludCBPYmplY3RJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIHJldHVybiBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLlNpemU7CisgIH0KKworICAvLy8gQ2hhbmdlIHRoZSBzaXplIG9mIHRoZSBzcGVjaWZpZWQgc3RhY2sgb2JqZWN0LgorICB2b2lkIHNldE9iamVjdFNpemUoaW50IE9iamVjdElkeCwgaW50NjRfdCBTaXplKSB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKE9iamVjdElkeCtOdW1GaXhlZE9iamVjdHMpIDwgT2JqZWN0cy5zaXplKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgT2JqZWN0IElkeCEiKTsKKyAgICBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLlNpemUgPSBTaXplOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgYWxpZ25tZW50IG9mIHRoZSBzcGVjaWZpZWQgc3RhY2sgb2JqZWN0LgorICB1bnNpZ25lZCBnZXRPYmplY3RBbGlnbm1lbnQoaW50IE9iamVjdElkeCkgY29uc3QgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgcmV0dXJuIE9iamVjdHNbT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0c10uQWxpZ25tZW50OworICB9CisKKyAgLy8vIHNldE9iamVjdEFsaWdubWVudCAtIENoYW5nZSB0aGUgYWxpZ25tZW50IG9mIHRoZSBzcGVjaWZpZWQgc3RhY2sgb2JqZWN0LgorICB2b2lkIHNldE9iamVjdEFsaWdubWVudChpbnQgT2JqZWN0SWR4LCB1bnNpZ25lZCBBbGlnbikgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5BbGlnbm1lbnQgPSBBbGlnbjsKKyAgICBlbnN1cmVNYXhBbGlnbm1lbnQoQWxpZ24pOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgdW5kZXJseWluZyBBbGxvY2Egb2YgdGhlIHNwZWNpZmllZAorICAvLy8gc3RhY2sgb2JqZWN0IGlmIGl0IGV4aXN0cy4gUmV0dXJucyAwIGlmIG5vbmUgZXhpc3RzLgorICBjb25zdCBBbGxvY2FJbnN0KiBnZXRPYmplY3RBbGxvY2F0aW9uKGludCBPYmplY3RJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIHJldHVybiBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLkFsbG9jYTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGFzc2lnbmVkIHN0YWNrIG9mZnNldCBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdAorICAvLy8gZnJvbSB0aGUgaW5jb21pbmcgc3RhY2sgcG9pbnRlci4KKyAgaW50NjRfdCBnZXRPYmplY3RPZmZzZXQoaW50IE9iamVjdElkeCkgY29uc3QgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgYXNzZXJ0KCFpc0RlYWRPYmplY3RJbmRleChPYmplY3RJZHgpICYmCisgICAgICAgICAgICJHZXR0aW5nIGZyYW1lIG9mZnNldCBmb3IgYSBkZWFkIG9iamVjdD8iKTsKKyAgICByZXR1cm4gT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5TUE9mZnNldDsKKyAgfQorCisgIGJvb2wgaXNPYmplY3RaRXh0KGludCBPYmplY3RJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIHJldHVybiBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLmlzWkV4dDsKKyAgfQorCisgIHZvaWQgc2V0T2JqZWN0WkV4dChpbnQgT2JqZWN0SWR4LCBib29sIElzWkV4dCkgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5pc1pFeHQgPSBJc1pFeHQ7CisgIH0KKworICBib29sIGlzT2JqZWN0U0V4dChpbnQgT2JqZWN0SWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKE9iamVjdElkeCtOdW1GaXhlZE9iamVjdHMpIDwgT2JqZWN0cy5zaXplKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgT2JqZWN0IElkeCEiKTsKKyAgICByZXR1cm4gT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5pc1NFeHQ7CisgIH0KKworICB2b2lkIHNldE9iamVjdFNFeHQoaW50IE9iamVjdElkeCwgYm9vbCBJc1NFeHQpIHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIE9iamVjdHNbT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0c10uaXNTRXh0ID0gSXNTRXh0OworICB9CisKKyAgLy8vIFNldCB0aGUgc3RhY2sgZnJhbWUgb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LiBUaGUKKyAgLy8vIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgc3RhY2sgcG9pbnRlciBvbiBlbnRyeSB0byB0aGUgZnVuY3Rpb24uCisgIHZvaWQgc2V0T2JqZWN0T2Zmc2V0KGludCBPYmplY3RJZHgsIGludDY0X3QgU1BPZmZzZXQpIHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIGFzc2VydCghaXNEZWFkT2JqZWN0SW5kZXgoT2JqZWN0SWR4KSAmJgorICAgICAgICAgICAiU2V0dGluZyBmcmFtZSBvZmZzZXQgZm9yIGEgZGVhZCBvYmplY3Q/Iik7CisgICAgT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5TUE9mZnNldCA9IFNQT2Zmc2V0OworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbXVzdCBiZSBhbGxvY2F0ZWQgdG8gaG9sZAorICAvLy8gYWxsIG9mIHRoZSBmaXhlZCBzaXplIGZyYW1lIG9iamVjdHMuICBUaGlzIGlzIG9ubHkgdmFsaWQgYWZ0ZXIKKyAgLy8vIFByb2xvZy9FcGlsb2cgY29kZSBpbnNlcnRpb24gaGFzIGZpbmFsaXplZCB0aGUgc3RhY2sgZnJhbWUgbGF5b3V0LgorICB1aW50NjRfdCBnZXRTdGFja1NpemUoKSBjb25zdCB7IHJldHVybiBTdGFja1NpemU7IH0KKworICAvLy8gU2V0IHRoZSBzaXplIG9mIHRoZSBzdGFjay4KKyAgdm9pZCBzZXRTdGFja1NpemUodWludDY0X3QgU2l6ZSkgeyBTdGFja1NpemUgPSBTaXplOyB9CisKKyAgLy8vIEVzdGltYXRlIGFuZCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHN0YWNrIGZyYW1lLgorICB1bnNpZ25lZCBlc3RpbWF0ZVN0YWNrU2l6ZShjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBjb3JyZWN0aW9uIGZvciBmcmFtZSBvZmZzZXRzLgorICBpbnQgZ2V0T2Zmc2V0QWRqdXN0bWVudCgpIGNvbnN0IHsgcmV0dXJuIE9mZnNldEFkanVzdG1lbnQ7IH0KKworICAvLy8gU2V0IHRoZSBjb3JyZWN0aW9uIGZvciBmcmFtZSBvZmZzZXRzLgorICB2b2lkIHNldE9mZnNldEFkanVzdG1lbnQoaW50IEFkaikgeyBPZmZzZXRBZGp1c3RtZW50ID0gQWRqOyB9CisKKyAgLy8vIFJldHVybiB0aGUgYWxpZ25tZW50IGluIGJ5dGVzIHRoYXQgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGFsaWduZWQgdG8sCisgIC8vLyB3aGljaCBpcyBncmVhdGVyIHRoYW4gdGhlIGRlZmF1bHQgc3RhY2sgYWxpZ25tZW50IHByb3ZpZGVkIGJ5IHRoZSB0YXJnZXQuCisgIHVuc2lnbmVkIGdldE1heEFsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIE1heEFsaWdubWVudDsgfQorCisgIC8vLyBNYWtlIHN1cmUgdGhlIGZ1bmN0aW9uIGlzIGF0IGxlYXN0IEFsaWduIGJ5dGVzIGFsaWduZWQuCisgIHZvaWQgZW5zdXJlTWF4QWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBmdW5jdGlvbiBhZGp1c3RzIHRoZSBzdGFjayAtLSBlLmcuLAorICAvLy8gd2hlbiBjYWxsaW5nIGFub3RoZXIgZnVuY3Rpb24uIFRoaXMgaXMgb25seSB2YWxpZCBkdXJpbmcgYW5kIGFmdGVyCisgIC8vLyBwcm9sb2cvZXBpbG9nIGNvZGUgaW5zZXJ0aW9uLgorICBib29sIGFkanVzdHNTdGFjaygpIGNvbnN0IHsgcmV0dXJuIEFkanVzdHNTdGFjazsgfQorICB2b2lkIHNldEFkanVzdHNTdGFjayhib29sIFYpIHsgQWRqdXN0c1N0YWNrID0gVjsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY3VycmVudCBmdW5jdGlvbiBoYXMgYW55IGZ1bmN0aW9uIGNhbGxzLgorICBib29sIGhhc0NhbGxzKCkgY29uc3QgeyByZXR1cm4gSGFzQ2FsbHM7IH0KKyAgdm9pZCBzZXRIYXNDYWxscyhib29sIFYpIHsgSGFzQ2FsbHMgPSBWOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gY29udGFpbnMgb3BhcXVlIGR5bmFtaWMgc3RhY2sgYWRqdXN0bWVudHMuCisgIGJvb2wgaGFzT3BhcXVlU1BBZGp1c3RtZW50KCkgY29uc3QgeyByZXR1cm4gSGFzT3BhcXVlU1BBZGp1c3RtZW50OyB9CisgIHZvaWQgc2V0SGFzT3BhcXVlU1BBZGp1c3RtZW50KGJvb2wgQikgeyBIYXNPcGFxdWVTUEFkanVzdG1lbnQgPSBCOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gY29udGFpbnMgb3BlcmF0aW9ucyB3aGljaCB3aWxsIGxvd2VyIGRvd24gdG8KKyAgLy8vIGluc3RydWN0aW9ucyB3aGljaCBtYW5pcHVsYXRlIHRoZSBzdGFjayBwb2ludGVyLgorICBib29sIGhhc0NvcHlJbXBseWluZ1N0YWNrQWRqdXN0bWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSGFzQ29weUltcGx5aW5nU3RhY2tBZGp1c3RtZW50OworICB9CisgIHZvaWQgc2V0SGFzQ29weUltcGx5aW5nU3RhY2tBZGp1c3RtZW50KGJvb2wgQikgeworICAgIEhhc0NvcHlJbXBseWluZ1N0YWNrQWRqdXN0bWVudCA9IEI7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmdW5jdGlvbiBjYWxscyB0aGUgbGx2bS52YV9zdGFydCBpbnRyaW5zaWMuCisgIGJvb2wgaGFzVkFTdGFydCgpIGNvbnN0IHsgcmV0dXJuIEhhc1ZBU3RhcnQ7IH0KKyAgdm9pZCBzZXRIYXNWQVN0YXJ0KGJvb2wgQikgeyBIYXNWQVN0YXJ0ID0gQjsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGlzIHZhcmlhZGljIGFuZCBjb250YWlucyBhIG11c3R0YWlsIGNhbGwuCisgIGJvb2wgaGFzTXVzdFRhaWxJblZhckFyZ0Z1bmMoKSBjb25zdCB7IHJldHVybiBIYXNNdXN0VGFpbEluVmFyQXJnRnVuYzsgfQorICB2b2lkIHNldEhhc011c3RUYWlsSW5WYXJBcmdGdW5jKGJvb2wgQikgeyBIYXNNdXN0VGFpbEluVmFyQXJnRnVuYyA9IEI7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmdW5jdGlvbiBjb250YWlucyBhIHRhaWwgY2FsbC4KKyAgYm9vbCBoYXNUYWlsQ2FsbCgpIGNvbnN0IHsgcmV0dXJuIEhhc1RhaWxDYWxsOyB9CisgIHZvaWQgc2V0SGFzVGFpbENhbGwoKSB7IEhhc1RhaWxDYWxsID0gdHJ1ZTsgfQorCisgIC8vLyBDb21wdXRlcyB0aGUgbWF4aW11bSBzaXplIG9mIGEgY2FsbGZyYW1lIGFuZCB0aGUgQWRqdXN0c1N0YWNrIHByb3BlcnR5LgorICAvLy8gVGhpcyBvbmx5IHdvcmtzIGZvciB0YXJnZXRzIGRlZmluaW5nCisgIC8vLyBUYXJnZXRJbnN0ckluZm86OmdldENhbGxGcmFtZVNldHVwT3Bjb2RlKCksIGdldENhbGxGcmFtZURlc3Ryb3lPcGNvZGUoKSwKKyAgLy8vIGFuZCBnZXRGcmFtZVNpemUoKS4KKyAgLy8vIFRoaXMgaXMgdXN1YWxseSBjb21wdXRlZCBieSB0aGUgcHJvbG9ndWUgZXBpbG9ndWUgaW5zZXJ0ZXIgYnV0IHNvbWUKKyAgLy8vIHRhcmdldHMgbWF5IGNhbGwgdGhpcyB0byBjb21wdXRlIGl0IGVhcmxpZXIuCisgIHZvaWQgY29tcHV0ZU1heENhbGxGcmFtZVNpemUoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKyAgLy8vIFJldHVybiB0aGUgbWF4aW11bSBzaXplIG9mIGEgY2FsbCBmcmFtZSB0aGF0IG11c3QgYmUKKyAgLy8vIGFsbG9jYXRlZCBmb3IgYW4gb3V0Z29pbmcgZnVuY3Rpb24gY2FsbC4gIFRoaXMgaXMgb25seSBhdmFpbGFibGUgaWYKKyAgLy8vIENhbGxGcmFtZVNldHVwL0Rlc3Ryb3kgcHNldWRvIGluc3RydWN0aW9ucyBhcmUgdXNlZCBieSB0aGUgdGFyZ2V0LCBhbmQKKyAgLy8vIHRoZW4gb25seSBkdXJpbmcgb3IgYWZ0ZXIgcHJvbG9nL2VwaWxvZyBjb2RlIGluc2VydGlvbi4KKyAgLy8vCisgIHVuc2lnbmVkIGdldE1heENhbGxGcmFtZVNpemUoKSBjb25zdCB7CisgICAgLy8gVE9ETzogRW5hYmxlIHRoaXMgYXNzZXJ0IHdoZW4gdGFyZ2V0cyBhcmUgZml4ZWQuCisgICAgLy9hc3NlcnQoaXNNYXhDYWxsRnJhbWVTaXplQ29tcHV0ZWQoKSAmJiAiTWF4Q2FsbEZyYW1lU2l6ZSBub3QgY29tcHV0ZWQgeWV0Iik7CisgICAgaWYgKCFpc01heENhbGxGcmFtZVNpemVDb21wdXRlZCgpKQorICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIE1heENhbGxGcmFtZVNpemU7CisgIH0KKyAgYm9vbCBpc01heENhbGxGcmFtZVNpemVDb21wdXRlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTWF4Q2FsbEZyYW1lU2l6ZSAhPSB+MHU7CisgIH0KKyAgdm9pZCBzZXRNYXhDYWxsRnJhbWVTaXplKHVuc2lnbmVkIFMpIHsgTWF4Q2FsbEZyYW1lU2l6ZSA9IFM7IH0KKworICAvLy8gQ3JlYXRlIGEgbmV3IG9iamVjdCBhdCBhIGZpeGVkIGxvY2F0aW9uIG9uIHRoZSBzdGFjay4KKyAgLy8vIEFsbCBmaXhlZCBvYmplY3RzIHNob3VsZCBiZSBjcmVhdGVkIGJlZm9yZSBvdGhlciBvYmplY3RzIGFyZSBjcmVhdGVkIGZvcgorICAvLy8gZWZmaWNpZW5jeS4gQnkgZGVmYXVsdCwgZml4ZWQgb2JqZWN0cyBhcmUgbm90IHBvaW50ZWQgdG8gYnkgTExWTSBJUgorICAvLy8gdmFsdWVzLiBUaGlzIHJldHVybnMgYW4gaW5kZXggd2l0aCBhIG5lZ2F0aXZlIHZhbHVlLgorICBpbnQgQ3JlYXRlRml4ZWRPYmplY3QodWludDY0X3QgU2l6ZSwgaW50NjRfdCBTUE9mZnNldCwgYm9vbCBJc0ltbXV0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNBbGlhc2VkID0gZmFsc2UpOworCisgIC8vLyBDcmVhdGUgYSBzcGlsbCBzbG90IGF0IGEgZml4ZWQgbG9jYXRpb24gb24gdGhlIHN0YWNrLgorICAvLy8gUmV0dXJucyBhbiBpbmRleCB3aXRoIGEgbmVnYXRpdmUgdmFsdWUuCisgIGludCBDcmVhdGVGaXhlZFNwaWxsU3RhY2tPYmplY3QodWludDY0X3QgU2l6ZSwgaW50NjRfdCBTUE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzSW1tdXRhYmxlID0gZmFsc2UpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbmRleCBjb3JyZXNwb25kcyB0byBhIGZpeGVkIHN0YWNrIG9iamVjdC4KKyAgYm9vbCBpc0ZpeGVkT2JqZWN0SW5kZXgoaW50IE9iamVjdElkeCkgY29uc3QgeworICAgIHJldHVybiBPYmplY3RJZHggPCAwICYmIChPYmplY3RJZHggPj0gLShpbnQpTnVtRml4ZWRPYmplY3RzKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbmRleCBjb3JyZXNwb25kcworICAvLy8gdG8gYW4gb2JqZWN0IHRoYXQgbWlnaHQgYmUgcG9pbnRlZCB0byBieSBhbiBMTFZNIElSIHZhbHVlLgorICBib29sIGlzQWxpYXNlZE9iamVjdEluZGV4KGludCBPYmplY3RJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIHJldHVybiBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLmlzQWxpYXNlZDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbmRleCBjb3JyZXNwb25kcyB0byBhbiBpbW11dGFibGUgb2JqZWN0LgorICBib29sIGlzSW1tdXRhYmxlT2JqZWN0SW5kZXgoaW50IE9iamVjdElkeCkgY29uc3QgeworICAgIC8vIFRhaWwgY2FsbGluZyBmdW5jdGlvbnMgY2FuIGNsb2JiZXIgdGhlaXIgZnVuY3Rpb24gYXJndW1lbnRzLgorICAgIGlmIChIYXNUYWlsQ2FsbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIHJldHVybiBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLmlzSW1tdXRhYmxlOworICB9CisKKyAgLy8vIE1hcmtzIHRoZSBpbW11dGFiaWxpdHkgb2YgYW4gb2JqZWN0LgorICB2b2lkIHNldElzSW1tdXRhYmxlT2JqZWN0SW5kZXgoaW50IE9iamVjdElkeCwgYm9vbCBJc0ltbXV0YWJsZSkgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5pc0ltbXV0YWJsZSA9IElzSW1tdXRhYmxlOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGNvcnJlc3BvbmRzIHRvIGEgc3BpbGwgc2xvdC4KKyAgYm9vbCBpc1NwaWxsU2xvdE9iamVjdEluZGV4KGludCBPYmplY3RJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIHJldHVybiBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLmlzU3BpbGxTbG90OworICB9CisKKyAgYm9vbCBpc1N0YXRlcG9pbnRTcGlsbFNsb3RPYmplY3RJbmRleChpbnQgT2JqZWN0SWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKE9iamVjdElkeCtOdW1GaXhlZE9iamVjdHMpIDwgT2JqZWN0cy5zaXplKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgT2JqZWN0IElkeCEiKTsKKyAgICByZXR1cm4gT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5pc1N0YXRlcG9pbnRTcGlsbFNsb3Q7CisgIH0KKworICAvLy8gXHNlZSBTdGFja0lECisgIHVpbnQ4X3QgZ2V0U3RhY2tJRChpbnQgT2JqZWN0SWR4KSBjb25zdCB7CisgICAgcmV0dXJuIE9iamVjdHNbT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0c10uU3RhY2tJRDsKKyAgfQorCisgIC8vLyBcc2VlIFN0YWNrSUQKKyAgdm9pZCBzZXRTdGFja0lEKGludCBPYmplY3RJZHgsIHVpbnQ4X3QgSUQpIHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIE9iamVjdHNbT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0c10uU3RhY2tJRCA9IElEOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGNvcnJlc3BvbmRzIHRvIGEgZGVhZCBvYmplY3QuCisgIGJvb2wgaXNEZWFkT2JqZWN0SW5kZXgoaW50IE9iamVjdElkeCkgY29uc3QgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgcmV0dXJuIE9iamVjdHNbT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0c10uU2l6ZSA9PSB+MFVMTDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbmRleCBjb3JyZXNwb25kcyB0byBhIHZhcmlhYmxlIHNpemVkCisgIC8vLyBvYmplY3QuCisgIGJvb2wgaXNWYXJpYWJsZVNpemVkT2JqZWN0SW5kZXgoaW50IE9iamVjdElkeCkgY29uc3QgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHggKyBOdW1GaXhlZE9iamVjdHMpIDwgT2JqZWN0cy5zaXplKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgT2JqZWN0IElkeCEiKTsKKyAgICByZXR1cm4gT2JqZWN0c1tPYmplY3RJZHggKyBOdW1GaXhlZE9iamVjdHNdLlNpemUgPT0gMDsKKyAgfQorCisgIHZvaWQgbWFya0FzU3RhdGVwb2ludFNwaWxsU2xvdE9iamVjdEluZGV4KGludCBPYmplY3RJZHgpIHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIE9iamVjdHNbT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0c10uaXNTdGF0ZXBvaW50U3BpbGxTbG90ID0gdHJ1ZTsKKyAgICBhc3NlcnQoaXNTdGF0ZXBvaW50U3BpbGxTbG90T2JqZWN0SW5kZXgoT2JqZWN0SWR4KSAmJiAiaW5jb25zaXN0ZW50Iik7CisgIH0KKworICAvLy8gQ3JlYXRlIGEgbmV3IHN0YXRpY2FsbHkgc2l6ZWQgc3RhY2sgb2JqZWN0LCByZXR1cm5pbmcKKyAgLy8vIGEgbm9ubmVnYXRpdmUgaWRlbnRpZmllciB0byByZXByZXNlbnQgaXQuCisgIGludCBDcmVhdGVTdGFja09iamVjdCh1aW50NjRfdCBTaXplLCB1bnNpZ25lZCBBbGlnbm1lbnQsIGJvb2wgaXNTcGlsbFNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbGxvY2FJbnN0ICpBbGxvY2EgPSBudWxscHRyLCB1aW50OF90IElEID0gMCk7CisKKyAgLy8vIENyZWF0ZSBhIG5ldyBzdGF0aWNhbGx5IHNpemVkIHN0YWNrIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSBzcGlsbCBzbG90LAorICAvLy8gcmV0dXJuaW5nIGEgbm9ubmVnYXRpdmUgaWRlbnRpZmllciB0byByZXByZXNlbnQgaXQuCisgIGludCBDcmVhdGVTcGlsbFN0YWNrT2JqZWN0KHVpbnQ2NF90IFNpemUsIHVuc2lnbmVkIEFsaWdubWVudCk7CisKKyAgLy8vIFJlbW92ZSBvciBtYXJrIGRlYWQgYSBzdGF0aWNhbGx5IHNpemVkIHN0YWNrIG9iamVjdC4KKyAgdm9pZCBSZW1vdmVTdGFja09iamVjdChpbnQgT2JqZWN0SWR4KSB7CisgICAgLy8gTWFyayBpdCBkZWFkLgorICAgIE9iamVjdHNbT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0c10uU2l6ZSA9IH4wVUxMOworICB9CisKKyAgLy8vIE5vdGlmeSB0aGUgTWFjaGluZUZyYW1lSW5mbyBvYmplY3QgdGhhdCBhIHZhcmlhYmxlIHNpemVkIG9iamVjdCBoYXMgYmVlbgorICAvLy8gY3JlYXRlZC4gIFRoaXMgbXVzdCBiZSBjcmVhdGVkIHdoZW5ldmVyIGEgdmFyaWFibGUgc2l6ZWQgb2JqZWN0IGlzCisgIC8vLyBjcmVhdGVkLCB3aGV0aGVyIG9yIG5vdCB0aGUgaW5kZXggcmV0dXJuZWQgaXMgYWN0dWFsbHkgdXNlZC4KKyAgaW50IENyZWF0ZVZhcmlhYmxlU2l6ZWRPYmplY3QodW5zaWduZWQgQWxpZ25tZW50LCBjb25zdCBBbGxvY2FJbnN0ICpBbGxvY2EpOworCisgIC8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGNhbGwgc2F2ZWQgaW5mbyB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICBjb25zdCBzdGQ6OnZlY3RvcjxDYWxsZWVTYXZlZEluZm8+ICZnZXRDYWxsZWVTYXZlZEluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIENTSW5mbzsKKyAgfQorICAvLy8gXGNvcHlkb2MgZ2V0Q2FsbGVlU2F2ZWRJbmZvKCkKKyAgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmZ2V0Q2FsbGVlU2F2ZWRJbmZvKCkgeyByZXR1cm4gQ1NJbmZvOyB9CisKKyAgLy8vIFVzZWQgYnkgcHJvbG9nL2VwaWxvZyBpbnNlcnRlciB0byBzZXQgdGhlIGZ1bmN0aW9uJ3MgY2FsbGVlIHNhdmVkCisgIC8vLyBpbmZvcm1hdGlvbi4KKyAgdm9pZCBzZXRDYWxsZWVTYXZlZEluZm8oY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJKSB7CisgICAgQ1NJbmZvID0gQ1NJOworICB9CisKKyAgLy8vIEhhcyB0aGUgY2FsbGVlIHNhdmVkIGluZm8gYmVlbiBjYWxjdWxhdGVkIHlldD8KKyAgYm9vbCBpc0NhbGxlZVNhdmVkSW5mb1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gQ1NJVmFsaWQ7IH0KKworICB2b2lkIHNldENhbGxlZVNhdmVkSW5mb1ZhbGlkKGJvb2wgdikgeyBDU0lWYWxpZCA9IHY7IH0KKworICBNYWNoaW5lQmFzaWNCbG9jayAqZ2V0U2F2ZVBvaW50KCkgY29uc3QgeyByZXR1cm4gU2F2ZTsgfQorICB2b2lkIHNldFNhdmVQb2ludChNYWNoaW5lQmFzaWNCbG9jayAqTmV3U2F2ZSkgeyBTYXZlID0gTmV3U2F2ZTsgfQorICBNYWNoaW5lQmFzaWNCbG9jayAqZ2V0UmVzdG9yZVBvaW50KCkgY29uc3QgeyByZXR1cm4gUmVzdG9yZTsgfQorICB2b2lkIHNldFJlc3RvcmVQb2ludChNYWNoaW5lQmFzaWNCbG9jayAqTmV3UmVzdG9yZSkgeyBSZXN0b3JlID0gTmV3UmVzdG9yZTsgfQorCisgIC8vLyBSZXR1cm4gYSBzZXQgb2YgcGh5c2ljYWwgcmVnaXN0ZXJzIHRoYXQgYXJlIHByaXN0aW5lLgorICAvLy8KKyAgLy8vIFByaXN0aW5lIHJlZ2lzdGVycyBob2xkIGEgdmFsdWUgdGhhdCBpcyB1c2VsZXNzIHRvIHRoZSBjdXJyZW50IGZ1bmN0aW9uLAorICAvLy8gYnV0IHRoYXQgbXVzdCBiZSBwcmVzZXJ2ZWQgLSB0aGV5IGFyZSBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdAorICAvLy8gc2F2ZWQuCisgIC8vLworICAvLy8gQmVmb3JlIHRoZSBQcm9sb2d1ZUVwaWxvZ3VlSW5zZXJ0ZXIgaGFzIHBsYWNlZCB0aGUgQ1NSIHNwaWxsIGNvZGUsIHRoaXMKKyAgLy8vIG1ldGhvZCBhbHdheXMgcmV0dXJucyBhbiBlbXB0eSBzZXQuCisgIEJpdFZlY3RvciBnZXRQcmlzdGluZVJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgLy8vIFVzZWQgYnkgdGhlIE1hY2hpbmVGdW5jdGlvbiBwcmludGVyIHRvIHByaW50IGluZm9ybWF0aW9uIGFib3V0CisgIC8vLyBzdGFjayBvYmplY3RzLiBJbXBsZW1lbnRlZCBpbiBNYWNoaW5lRnVuY3Rpb24uY3BwLgorICB2b2lkIHByaW50KGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsIHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8vIGR1bXAgLSBQcmludCB0aGUgZnVuY3Rpb24gdG8gc3RkZXJyLgorICB2b2lkIGR1bXAoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDhiN2ViCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oCkBAIC0wLDAgKzEsOTQ4IEBACisvLz09PS0gbGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENvbGxlY3QgbmF0aXZlIG1hY2hpbmUgY29kZSBmb3IgYSBmdW5jdGlvbi4gIFRoaXMgY2xhc3MgY29udGFpbnMgYSBsaXN0IG9mCisvLyBNYWNoaW5lQmFzaWNCbG9jayBpbnN0YW5jZXMgdGhhdCBtYWtlIHVwIHRoZSBjdXJyZW50IGNvbXBpbGVkIGZ1bmN0aW9uLgorLy8KKy8vIFRoaXMgY2xhc3MgYWxzbyBjb250YWlucyBwb2ludGVycyB0byB2YXJpb3VzIGNsYXNzZXMgd2hpY2ggaG9sZAorLy8gdGFyZ2V0LXNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBnZW5lcmF0ZWQgY29kZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FRlVOQ1RJT05fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORUZVTkNUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9FSFBlcnNvbmFsaXRpZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVNZW1PcGVyYW5kLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZWJ1Z0xvYy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9NZXRhZGF0YS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNEd2FyZi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FycmF5UmVjeWNsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQXRvbWljT3JkZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9SZWN5Y2xlci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEJsb2NrQWRkcmVzczsKK2NsYXNzIERhdGFMYXlvdXQ7CitjbGFzcyBESUV4cHJlc3Npb247CitjbGFzcyBESUxvY2FsVmFyaWFibGU7CitjbGFzcyBESUxvY2F0aW9uOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIE1hY2hpbmVDb25zdGFudFBvb2w7CitjbGFzcyBNYWNoaW5lRnJhbWVJbmZvOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZUp1bXBUYWJsZUluZm87CitjbGFzcyBNYWNoaW5lTW9kdWxlSW5mbzsKK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBNQ0luc3RyRGVzYzsKK2NsYXNzIFBhc3M7CitjbGFzcyBQc2V1ZG9Tb3VyY2VWYWx1ZU1hbmFnZXI7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFNsb3RJbmRleGVzOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKK2NsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7CitjbGFzcyBUYXJnZXRTdWJ0YXJnZXRJbmZvOworc3RydWN0IFdpbkVIRnVuY0luZm87CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpbGlzdF9hbGxvY190cmFpdHM8TWFjaGluZUJhc2ljQmxvY2s+IHsKKyAgdm9pZCBkZWxldGVOb2RlKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlsaXN0X2NhbGxiYWNrX3RyYWl0czxNYWNoaW5lQmFzaWNCbG9jaz4geworICB2b2lkIGFkZE5vZGVUb0xpc3QoTWFjaGluZUJhc2ljQmxvY2sqIE1CQik7CisgIHZvaWQgcmVtb3ZlTm9kZUZyb21MaXN0KE1hY2hpbmVCYXNpY0Jsb2NrKiBNQkIpOworCisgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4KKyAgdm9pZCB0cmFuc2Zlck5vZGVzRnJvbUxpc3QoaWxpc3RfY2FsbGJhY2tfdHJhaXRzICZPbGRMaXN0LCBJdGVyYXRvciwgSXRlcmF0b3IpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJOZXZlciB0cmFuc2ZlciBiZXR3ZWVuIGxpc3RzIik7CisgIH0KK307CisKKy8vLyBNYWNoaW5lRnVuY3Rpb25JbmZvIC0gVGhpcyBjbGFzcyBjYW4gYmUgZGVyaXZlZCBmcm9tIGFuZCB1c2VkIGJ5IHRhcmdldHMgdG8KKy8vLyBob2xkIHByaXZhdGUgdGFyZ2V0LXNwZWNpZmljIGluZm9ybWF0aW9uIGZvciBlYWNoIE1hY2hpbmVGdW5jdGlvbi4gIE9iamVjdHMKKy8vLyBvZiB0eXBlIGFyZSBhY2Nlc3NlZC9jcmVhdGVkIHdpdGggTUY6OmdldEluZm8gYW5kIGRlc3Ryb3llZCB3aGVuIHRoZQorLy8vIE1hY2hpbmVGdW5jdGlvbiBpcyBkZXN0cm95ZWQuCitzdHJ1Y3QgTWFjaGluZUZ1bmN0aW9uSW5mbyB7CisgIHZpcnR1YWwgfk1hY2hpbmVGdW5jdGlvbkluZm8oKTsKKworICAvLy8gXGJyaWVmIEZhY3RvcnkgZnVuY3Rpb246IGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY2FsbCBuZXcgdXNpbmcgdGhlCisgIC8vLyBzdXBwbGllZCBhbGxvY2F0b3IuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhIGRlcml2ZSBjbGFzcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHk+CisgIHN0YXRpYyBUeSAqY3JlYXRlKEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvciwgTWFjaGluZUZ1bmN0aW9uICZNRikgeworICAgIHJldHVybiBuZXcgKEFsbG9jYXRvci5BbGxvY2F0ZTxUeT4oKSkgVHkoTUYpOworICB9Cit9OworCisvLy8gUHJvcGVydGllcyB3aGljaCBhIE1hY2hpbmVGdW5jdGlvbiBtYXkgaGF2ZSBhdCBhIGdpdmVuIHBvaW50IGluIHRpbWUuCisvLy8gRWFjaCBvZiB0aGVzZSBoYXMgY2hlY2tpbmcgY29kZSBpbiB0aGUgTWFjaGluZVZlcmlmaWVyLCBhbmQgcGFzc2VzIGNhbgorLy8vIHJlcXVpcmUgdGhhdCBhIHByb3BlcnR5IGJlIHNldC4KK2NsYXNzIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgeworICAvLyBQb3NzaWJsZSBUT0RPOiBBbGxvdyB0YXJnZXRzIHRvIGV4dGVuZCB0aGlzIChwZXJoYXBzIGJ5IGFsbG93aW5nIHRoZQorICAvLyBjb25zdHJ1Y3RvciB0byBzcGVjaWZ5IHRoZSBzaXplIG9mIHRoZSBiaXQgdmVjdG9yKQorICAvLyBQb3NzaWJsZSBUT0RPOiBBbGxvdyByZXF1aXJpbmcgdGhlIG5lZ2F0aXZlIChlLmcuIFZSZWdzQWxsb2NhdGVkIGNvdWxkIGJlCisgIC8vIHN0YXRlZCBhcyB0aGUgbmVnYXRpdmUgb2YgImhhcyB2cmVncyIKKworcHVibGljOgorICAvLyBUaGUgcHJvcGVydGllcyBhcmUgc3RhdGVkIGluICJwb3NpdGl2ZSIgZm9ybTsgaS5lLiBhIHBhc3MgY291bGQgcmVxdWlyZQorICAvLyB0aGF0IHRoZSBwcm9wZXJ0eSBob2xkLCBidXQgbm90IHRoYXQgaXQgZG9lcyBub3QgaG9sZC4KKworICAvLyBQcm9wZXJ0eSBkZXNjcmlwdGlvbnM6CisgIC8vIElzU1NBOiBUcnVlIHdoZW4gdGhlIG1hY2hpbmUgZnVuY3Rpb24gaXMgaW4gU1NBIGZvcm0gYW5kIHZpcnR1YWwgcmVnaXN0ZXJzCisgIC8vICBoYXZlIGEgc2luZ2xlIGRlZi4KKyAgLy8gTm9QSElzOiBUaGUgbWFjaGluZSBmdW5jdGlvbiBkb2VzIG5vdCBjb250YWluIGFueSBQSEkgaW5zdHJ1Y3Rpb24uCisgIC8vIFRyYWNrc0xpdmVuZXNzOiBUcnVlIHdoZW4gdHJhY2tpbmcgcmVnaXN0ZXIgbGl2ZW5lc3MgYWNjdXJhdGVseS4KKyAgLy8gIFdoaWxlIHRoaXMgcHJvcGVydHkgaXMgc2V0LCByZWdpc3RlciBsaXZlbmVzcyBpbmZvcm1hdGlvbiBpbiBiYXNpYyBibG9jaworICAvLyAgbGl2ZS1pbiBsaXN0cyBhbmQgbWFjaGluZSBpbnN0cnVjdGlvbiBvcGVyYW5kcyAoZS5nLiBraWxsIGZsYWdzLCBpbXBsaWNpdAorICAvLyAgZGVmcykgaXMgYWNjdXJhdGUuIFRoaXMgbWVhbnMgaXQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBjb2RlIGluIHdheXMKKyAgLy8gIHRoYXQgYWZmZWN0IHRoZSB2YWx1ZXMgaW4gcmVnaXN0ZXJzLCBmb3IgZXhhbXBsZSBieSB0aGUgcmVnaXN0ZXIKKyAgLy8gIHNjYXZlbmdlci4KKyAgLy8gIFdoZW4gdGhpcyBwcm9wZXJ0eSBpcyBjbGVhciwgbGl2ZW5lc3MgaXMgbm8gbG9uZ2VyIHJlbGlhYmxlLgorICAvLyBOb1ZSZWdzOiBUaGUgbWFjaGluZSBmdW5jdGlvbiBkb2VzIG5vdCB1c2UgYW55IHZpcnR1YWwgcmVnaXN0ZXJzLgorICAvLyBMZWdhbGl6ZWQ6IEluIEdsb2JhbElTZWw6IHRoZSBNYWNoaW5lTGVnYWxpemVyIHJhbiBhbmQgYWxsIHByZS1pc2VsIGdlbmVyaWMKKyAgLy8gIGluc3RydWN0aW9ucyBoYXZlIGJlZW4gbGVnYWxpemVkOyBpLmUuLCBhbGwgaW5zdHJ1Y3Rpb25zIGFyZSBub3cgb25lIG9mOgorICAvLyAgIC0gZ2VuZXJpYyBhbmQgYWx3YXlzIGxlZ2FsIChlLmcuLCBDT1BZKQorICAvLyAgIC0gdGFyZ2V0LXNwZWNpZmljCisgIC8vICAgLSBsZWdhbCBwcmUtaXNlbCBnZW5lcmljIGluc3RydWN0aW9ucy4KKyAgLy8gUmVnQmFua1NlbGVjdGVkOiBJbiBHbG9iYWxJU2VsOiB0aGUgUmVnQmFua1NlbGVjdCBwYXNzIHJhbiBhbmQgYWxsIGdlbmVyaWMKKyAgLy8gIHZpcnR1YWwgcmVnaXN0ZXJzIGhhdmUgYmVlbiBhc3NpZ25lZCB0byBhIHJlZ2lzdGVyIGJhbmsuCisgIC8vIFNlbGVjdGVkOiBJbiBHbG9iYWxJU2VsOiB0aGUgSW5zdHJ1Y3Rpb25TZWxlY3QgcGFzcyByYW4gYW5kIGFsbCBwcmUtaXNlbAorICAvLyAgZ2VuZXJpYyBpbnN0cnVjdGlvbnMgaGF2ZSBiZWVuIGVsaW1pbmF0ZWQ7IGkuZS4sIGFsbCBpbnN0cnVjdGlvbnMgYXJlIG5vdworICAvLyAgdGFyZ2V0LXNwZWNpZmljIG9yIG5vbi1wcmUtaXNlbCBnZW5lcmljIGluc3RydWN0aW9ucyAoZS5nLiwgQ09QWSkuCisgIC8vICBTaW5jZSBvbmx5IHByZS1pc2VsIGdlbmVyaWMgaW5zdHJ1Y3Rpb25zIGNhbiBoYXZlIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlcgorICAvLyAgb3BlcmFuZHMsIHRoaXMgYWxzbyBtZWFucyB0aGF0IGFsbCBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXJzIGhhdmUgYmVlbgorICAvLyAgY29uc3RyYWluZWQgdG8gdmlydHVhbCByZWdpc3RlcnMgKGFzc2lnbmVkIHRvIHJlZ2lzdGVyIGNsYXNzZXMpIGFuZCB0aGF0CisgIC8vICBhbGwgc2l6ZXMgYXR0YWNoZWQgdG8gdGhlbSBoYXZlIGJlZW4gZWxpbWluYXRlZC4KKyAgZW51bSBjbGFzcyBQcm9wZXJ0eSA6IHVuc2lnbmVkIHsKKyAgICBJc1NTQSwKKyAgICBOb1BISXMsCisgICAgVHJhY2tzTGl2ZW5lc3MsCisgICAgTm9WUmVncywKKyAgICBGYWlsZWRJU2VsLAorICAgIExlZ2FsaXplZCwKKyAgICBSZWdCYW5rU2VsZWN0ZWQsCisgICAgU2VsZWN0ZWQsCisgICAgTGFzdFByb3BlcnR5ID0gU2VsZWN0ZWQsCisgIH07CisKKyAgYm9vbCBoYXNQcm9wZXJ0eShQcm9wZXJ0eSBQKSBjb25zdCB7CisgICAgcmV0dXJuIFByb3BlcnRpZXNbc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KFApXTsKKyAgfQorCisgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgJnNldChQcm9wZXJ0eSBQKSB7CisgICAgUHJvcGVydGllcy5zZXQoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KFApKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzICZyZXNldChQcm9wZXJ0eSBQKSB7CisgICAgUHJvcGVydGllcy5yZXNldChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oUCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBSZXNldCBhbGwgdGhlIHByb3BlcnRpZXMuCisgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgJnJlc2V0KCkgeworICAgIFByb3BlcnRpZXMucmVzZXQoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzICZzZXQoY29uc3QgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyAmTUZQKSB7CisgICAgUHJvcGVydGllcyB8PSBNRlAuUHJvcGVydGllczsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzICZyZXNldChjb25zdCBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzICZNRlApIHsKKyAgICBQcm9wZXJ0aWVzLnJlc2V0KE1GUC5Qcm9wZXJ0aWVzKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgYWxsIHByb3BlcnRpZXMgc2V0IGluIFYgKGkuZS4gcmVxdWlyZWQgYnkgYSBwYXNzKSBhcmUgc2V0CisgIC8vIGluIHRoaXMuCisgIGJvb2wgdmVyaWZ5UmVxdWlyZWRQcm9wZXJ0aWVzKGNvbnN0IE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgJlYpIGNvbnN0IHsKKyAgICByZXR1cm4gIVYuUHJvcGVydGllcy50ZXN0KFByb3BlcnRpZXMpOworICB9CisKKyAgLy8vIFByaW50IHRoZSBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0uCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworcHJpdmF0ZToKKyAgQml0VmVjdG9yIFByb3BlcnRpZXMgPQorICAgICAgQml0VmVjdG9yKHN0YXRpY19jYXN0PHVuc2lnbmVkPihQcm9wZXJ0eTo6TGFzdFByb3BlcnR5KSsxKTsKK307CisKK3N0cnVjdCBTRUhIYW5kbGVyIHsKKyAgLy8vIEZpbHRlciBvciBmaW5hbGx5IGZ1bmN0aW9uLiBOdWxsIGluZGljYXRlcyBhIGNhdGNoLWFsbC4KKyAgY29uc3QgRnVuY3Rpb24gKkZpbHRlck9yRmluYWxseTsKKworICAvLy8gQWRkcmVzcyBvZiBibG9jayB0byByZWNvdmVyIGF0LiBOdWxsIGZvciBhIGZpbmFsbHkgaGFuZGxlci4KKyAgY29uc3QgQmxvY2tBZGRyZXNzICpSZWNvdmVyQkE7Cit9OworCisvLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXRhaW4gbGFuZGluZyBwYWQgaW5mbyBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCitzdHJ1Y3QgTGFuZGluZ1BhZEluZm8geworICBNYWNoaW5lQmFzaWNCbG9jayAqTGFuZGluZ1BhZEJsb2NrOyAgICAgIC8vIExhbmRpbmcgcGFkIGJsb2NrLgorICBTbWFsbFZlY3RvcjxNQ1N5bWJvbCAqLCAxPiBCZWdpbkxhYmVsczsgIC8vIExhYmVscyBwcmlvciB0byBpbnZva2UuCisgIFNtYWxsVmVjdG9yPE1DU3ltYm9sICosIDE+IEVuZExhYmVsczsgICAgLy8gTGFiZWxzIGFmdGVyIGludm9rZS4KKyAgU21hbGxWZWN0b3I8U0VISGFuZGxlciwgMT4gU0VISGFuZGxlcnM7ICAvLyBTRUggaGFuZGxlcnMgYWN0aXZlIGF0IHRoaXMgbHBhZC4KKyAgTUNTeW1ib2wgKkxhbmRpbmdQYWRMYWJlbCA9IG51bGxwdHI7ICAgICAvLyBMYWJlbCBhdCBiZWdpbm5pbmcgb2YgbGFuZGluZyBwYWQuCisgIHN0ZDo6dmVjdG9yPGludD4gVHlwZUlkczsgICAgICAgICAgICAgICAgLy8gTGlzdCBvZiB0eXBlIGlkcyAoZmlsdGVycyBuZWdhdGl2ZSkuCisKKyAgZXhwbGljaXQgTGFuZGluZ1BhZEluZm8oTWFjaGluZUJhc2ljQmxvY2sgKk1CQikKKyAgICAgIDogTGFuZGluZ1BhZEJsb2NrKE1CQikge30KK307CisKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbiB7CisgIGNvbnN0IEZ1bmN0aW9uICZGOworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUYXJnZXQ7CisgIGNvbnN0IFRhcmdldFN1YnRhcmdldEluZm8gKlNUSTsKKyAgTUNDb250ZXh0ICZDdHg7CisgIE1hY2hpbmVNb2R1bGVJbmZvICZNTUk7CisKKyAgLy8gUmVnSW5mbyAtIEluZm9ybWF0aW9uIGFib3V0IGVhY2ggcmVnaXN0ZXIgaW4gdXNlIGluIHRoZSBmdW5jdGlvbi4KKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAqUmVnSW5mbzsKKworICAvLyBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGFyZ2V0LXNwZWNpZmljIHBlci1tYWNoaW5lIGZ1bmN0aW9uIGluZm9ybWF0aW9uIGZvcgorICAvLyB0aGUgdGFyZ2V0IGltcGxlbWVudGF0aW9uLgorICBNYWNoaW5lRnVuY3Rpb25JbmZvICpNRkluZm87CisKKyAgLy8gS2VlcCB0cmFjayBvZiBvYmplY3RzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suCisgIE1hY2hpbmVGcmFtZUluZm8gKkZyYW1lSW5mbzsKKworICAvLyBLZWVwIHRyYWNrIG9mIGNvbnN0YW50cyB3aGljaCBhcmUgc3BpbGxlZCB0byBtZW1vcnkKKyAgTWFjaGluZUNvbnN0YW50UG9vbCAqQ29uc3RhbnRQb29sOworCisgIC8vIEtlZXAgdHJhY2sgb2YganVtcCB0YWJsZXMgZm9yIHN3aXRjaCBpbnN0cnVjdGlvbnMKKyAgTWFjaGluZUp1bXBUYWJsZUluZm8gKkp1bXBUYWJsZUluZm87CisKKyAgLy8gS2VlcHMgdHJhY2sgb2YgV2luZG93cyBleGNlcHRpb24gaGFuZGxpbmcgcmVsYXRlZCBkYXRhLiBUaGlzIHdpbGwgYmUgbnVsbAorICAvLyBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlbid0IHVzaW5nIGEgZnVuY2xldC1iYXNlZCBFSCBwZXJzb25hbGl0eS4KKyAgV2luRUhGdW5jSW5mbyAqV2luRUhJbmZvID0gbnVsbHB0cjsKKworICAvLyBGdW5jdGlvbi1sZXZlbCB1bmlxdWUgbnVtYmVyaW5nIGZvciBNYWNoaW5lQmFzaWNCbG9ja3MuICBXaGVuIGEKKyAgLy8gTWFjaGluZUJhc2ljQmxvY2sgaXMgaW5zZXJ0ZWQgaW50byBhIE1hY2hpbmVGdW5jdGlvbiBpcyBpdCBhdXRvbWF0aWNhbGx5CisgIC8vIG51bWJlcmVkIGFuZCB0aGlzIHZlY3RvciBrZWVwcyB0cmFjayBvZiB0aGUgbWFwcGluZyBmcm9tIElEJ3MgdG8gTUJCJ3MuCisgIHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKj4gTUJCTnVtYmVyaW5nOworCisgIC8vIFBvb2wtYWxsb2NhdGUgTWFjaGluZUZ1bmN0aW9uLWxpZmV0aW1lIGFuZCBJUiBvYmplY3RzLgorICBCdW1wUHRyQWxsb2NhdG9yIEFsbG9jYXRvcjsKKworICAvLyBBbGxvY2F0aW9uIG1hbmFnZW1lbnQgZm9yIGluc3RydWN0aW9ucyBpbiBmdW5jdGlvbi4KKyAgUmVjeWNsZXI8TWFjaGluZUluc3RyPiBJbnN0cnVjdGlvblJlY3ljbGVyOworCisgIC8vIEFsbG9jYXRpb24gbWFuYWdlbWVudCBmb3Igb3BlcmFuZCBhcnJheXMgb24gaW5zdHJ1Y3Rpb25zLgorICBBcnJheVJlY3ljbGVyPE1hY2hpbmVPcGVyYW5kPiBPcGVyYW5kUmVjeWNsZXI7CisKKyAgLy8gQWxsb2NhdGlvbiBtYW5hZ2VtZW50IGZvciBiYXNpYyBibG9ja3MgaW4gZnVuY3Rpb24uCisgIFJlY3ljbGVyPE1hY2hpbmVCYXNpY0Jsb2NrPiBCYXNpY0Jsb2NrUmVjeWNsZXI7CisKKyAgLy8gTGlzdCBvZiBtYWNoaW5lIGJhc2ljIGJsb2NrcyBpbiBmdW5jdGlvbgorICB1c2luZyBCYXNpY0Jsb2NrTGlzdFR5cGUgPSBpbGlzdDxNYWNoaW5lQmFzaWNCbG9jaz47CisgIEJhc2ljQmxvY2tMaXN0VHlwZSBCYXNpY0Jsb2NrczsKKworICAvLy8gRnVuY3Rpb25OdW1iZXIgLSBUaGlzIHByb3ZpZGVzIGEgdW5pcXVlIElEIGZvciBlYWNoIGZ1bmN0aW9uIGVtaXR0ZWQgaW4KKyAgLy8vIHRoaXMgdHJhbnNsYXRpb24gdW5pdC4KKyAgLy8vCisgIHVuc2lnbmVkIEZ1bmN0aW9uTnVtYmVyOworCisgIC8vLyBBbGlnbm1lbnQgLSBUaGUgYWxpZ25tZW50IG9mIHRoZSBmdW5jdGlvbi4KKyAgdW5zaWduZWQgQWxpZ25tZW50OworCisgIC8vLyBFeHBvc2VzUmV0dXJuc1R3aWNlIC0gVHJ1ZSBpZiB0aGUgZnVuY3Rpb24gY2FsbHMgc2V0am1wIG9yIHJlbGF0ZWQKKyAgLy8vIGZ1bmN0aW9ucyB3aXRoIGF0dHJpYnV0ZSAicmV0dXJucyB0d2ljZSIsIGJ1dCBkb2Vzbid0IGhhdmUKKyAgLy8vIHRoZSBhdHRyaWJ1dGUgaXRzZWxmLgorICAvLy8gVGhpcyBpcyB1c2VkIHRvIGxpbWl0IG9wdGltaXphdGlvbnMgd2hpY2ggY2Fubm90IHJlYXNvbgorICAvLy8gYWJvdXQgdGhlIGNvbnRyb2wgZmxvdyBvZiBzdWNoIGZ1bmN0aW9ucy4KKyAgYm9vbCBFeHBvc2VzUmV0dXJuc1R3aWNlID0gZmFsc2U7CisKKyAgLy8vIFRydWUgaWYgdGhlIGZ1bmN0aW9uIGluY2x1ZGVzIGFueSBpbmxpbmUgYXNzZW1ibHkuCisgIGJvb2wgSGFzSW5saW5lQXNtID0gZmFsc2U7CisKKyAgLy8vIFRydWUgaWYgYW55IFdpbkNGSSBpbnN0cnVjdGlvbiBoYXZlIGJlZW4gZW1pdHRlZCBpbiB0aGlzIGZ1bmN0aW9uLgorICBPcHRpb25hbDxib29sPiBIYXNXaW5DRkk7CisKKyAgLy8vIEN1cnJlbnQgaGlnaC1sZXZlbCBwcm9wZXJ0aWVzIG9mIHRoZSBJUiBvZiB0aGUgZnVuY3Rpb24gKGUuZy4gaXMgaW4gU1NBCisgIC8vLyBmb3JtIG9yIHdoZXRoZXIgcmVnaXN0ZXJzIGhhdmUgYmVlbiBhbGxvY2F0ZWQpCisgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgUHJvcGVydGllczsKKworICAvLyBBbGxvY2F0aW9uIG1hbmFnZW1lbnQgZm9yIHBzZXVkbyBzb3VyY2UgdmFsdWVzLgorICBzdGQ6OnVuaXF1ZV9wdHI8UHNldWRvU291cmNlVmFsdWVNYW5hZ2VyPiBQU1ZNYW5hZ2VyOworCisgIC8vLyBMaXN0IG9mIG1vdmVzIGRvbmUgYnkgYSBmdW5jdGlvbidzIHByb2xvZy4gIFVzZWQgdG8gY29uc3RydWN0IGZyYW1lIG1hcHMKKyAgLy8vIGJ5IGRlYnVnIGFuZCBleGNlcHRpb24gaGFuZGxpbmcgY29uc3VtZXJzLgorICBzdGQ6OnZlY3RvcjxNQ0NGSUluc3RydWN0aW9uPiBGcmFtZUluc3RydWN0aW9uczsKKworICAvLy8gXG5hbWUgRXhjZXB0aW9uIEhhbmRsaW5nCisgIC8vLyBceworCisgIC8vLyBMaXN0IG9mIExhbmRpbmdQYWRJbmZvIGRlc2NyaWJpbmcgdGhlIGxhbmRpbmcgcGFkIGluZm9ybWF0aW9uLgorICBzdGQ6OnZlY3RvcjxMYW5kaW5nUGFkSW5mbz4gTGFuZGluZ1BhZHM7CisKKyAgLy8vIE1hcCBhIGxhbmRpbmcgcGFkJ3MgRUggc3ltYm9sIHRvIHRoZSBjYWxsIHNpdGUgaW5kZXhlcy4KKyAgRGVuc2VNYXA8TUNTeW1ib2wqLCBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4+IExQYWRUb0NhbGxTaXRlTWFwOworCisgIC8vLyBNYXAgb2YgaW52b2tlIGNhbGwgc2l0ZSBpbmRleCB2YWx1ZXMgdG8gYXNzb2NpYXRlZCBiZWdpbiBFSF9MQUJFTC4KKyAgRGVuc2VNYXA8TUNTeW1ib2wqLCB1bnNpZ25lZD4gQ2FsbFNpdGVNYXA7CisKKyAgLy8vIENvZGVWaWV3IGxhYmVsIGFubm90YXRpb25zLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8TUNTeW1ib2wgKiwgTUROb2RlICo+PiBDb2RlVmlld0Fubm90YXRpb25zOworCisgIGJvb2wgQ2FsbHNFSFJldHVybiA9IGZhbHNlOworICBib29sIENhbGxzVW53aW5kSW5pdCA9IGZhbHNlOworICBib29sIEhhc0VIRnVuY2xldHMgPSBmYWxzZTsKKworICAvLy8gTGlzdCBvZiBDKysgVHlwZUluZm8gdXNlZC4KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgR2xvYmFsVmFsdWUgKj4gVHlwZUluZm9zOworCisgIC8vLyBMaXN0IG9mIHR5cGVpZHMgZW5jb2RpbmcgZmlsdGVycyB1c2VkLgorICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gRmlsdGVySWRzOworCisgIC8vLyBMaXN0IG9mIHRoZSBpbmRpY2VzIGluIEZpbHRlcklkcyBjb3JyZXNwb25kaW5nIHRvIGZpbHRlciB0ZXJtaW5hdG9ycy4KKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IEZpbHRlckVuZHM7CisKKyAgRUhQZXJzb25hbGl0eSBQZXJzb25hbGl0eVR5cGVDYWNoZSA9IEVIUGVyc29uYWxpdHk6OlVua25vd247CisKKyAgLy8vIFx9CisKKyAgLy8vIENsZWFyIGFsbCB0aGUgbWVtYmVycyBvZiB0aGlzIE1hY2hpbmVGdW5jdGlvbiwgYnV0IHRoZSBvbmVzIHVzZWQKKyAgLy8vIHRvIGluaXRpYWxpemUgYWdhaW4gdGhlIE1hY2hpbmVGdW5jdGlvbi4KKyAgLy8vIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGlzIGRlYWxsb2NhdGVzIGFsbCB0aGUgZHluYW1pY2FsbHkgYWxsb2NhdGVkCisgIC8vLyBvYmplY3RzIGFuZCBnZXQgcmlkIG9mIGFsbCB0aGUgWFhYSW5mbyBkYXRhIHN0cnVjdHVyZSwgYnV0IGtlZXAKKyAgLy8vIHVuY2hhbmdlZCB0aGUgcmVmZXJlbmNlcyB0byBGbiwgVGFyZ2V0LCBNTUksIGFuZCBGdW5jdGlvbk51bWJlci4KKyAgdm9pZCBjbGVhcigpOworICAvLy8gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGRpZmZlcmVudCBtZW1iZXJzLgorICAvLy8gSW4gcGFydGljdWxhciwgdGhlIFhYWEluZm8gZGF0YSBzdHJ1Y3R1cmUuCisgIC8vLyBccHJlIEZuLCBUYXJnZXQsIE1NSSwgYW5kIEZ1bmN0aW9uTnVtYmVyIGFyZSBwcm9wZXJseSBzZXQuCisgIHZvaWQgaW5pdCgpOworCitwdWJsaWM6CisgIHN0cnVjdCBWYXJpYWJsZURiZ0luZm8geworICAgIGNvbnN0IERJTG9jYWxWYXJpYWJsZSAqVmFyOworICAgIGNvbnN0IERJRXhwcmVzc2lvbiAqRXhwcjsKKyAgICB1bnNpZ25lZCBTbG90OworICAgIGNvbnN0IERJTG9jYXRpb24gKkxvYzsKKworICAgIFZhcmlhYmxlRGJnSW5mbyhjb25zdCBESUxvY2FsVmFyaWFibGUgKlZhciwgY29uc3QgRElFeHByZXNzaW9uICpFeHByLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTbG90LCBjb25zdCBESUxvY2F0aW9uICpMb2MpCisgICAgICAgIDogVmFyKFZhciksIEV4cHIoRXhwciksIFNsb3QoU2xvdCksIExvYyhMb2MpIHt9CisgIH07CisgIHVzaW5nIFZhcmlhYmxlRGJnSW5mb01hcFR5ID0gU21hbGxWZWN0b3I8VmFyaWFibGVEYmdJbmZvLCA0PjsKKyAgVmFyaWFibGVEYmdJbmZvTWFwVHkgVmFyaWFibGVEYmdJbmZvczsKKworICBNYWNoaW5lRnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gJkYsIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0U3VidGFyZ2V0SW5mbyAmU1RJLCB1bnNpZ25lZCBGdW5jdGlvbk51bSwKKyAgICAgICAgICAgICAgICAgIE1hY2hpbmVNb2R1bGVJbmZvICZNTUkpOworICBNYWNoaW5lRnVuY3Rpb24oY29uc3QgTWFjaGluZUZ1bmN0aW9uICYpID0gZGVsZXRlOworICBNYWNoaW5lRnVuY3Rpb24gJm9wZXJhdG9yPShjb25zdCBNYWNoaW5lRnVuY3Rpb24gJikgPSBkZWxldGU7CisgIH5NYWNoaW5lRnVuY3Rpb24oKTsKKworICAvLy8gUmVzZXQgdGhlIGluc3RhbmNlIGFzIGlmIGl0IHdhcyBqdXN0IGNyZWF0ZWQuCisgIHZvaWQgcmVzZXQoKSB7CisgICAgY2xlYXIoKTsKKyAgICBpbml0KCk7CisgIH0KKworICBNYWNoaW5lTW9kdWxlSW5mbyAmZ2V0TU1JKCkgY29uc3QgeyByZXR1cm4gTU1JOyB9CisgIE1DQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIEN0eDsgfQorCisgIFBzZXVkb1NvdXJjZVZhbHVlTWFuYWdlciAmZ2V0UFNWTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuICpQU1ZNYW5hZ2VyOyB9CisKKyAgLy8vIFJldHVybiB0aGUgRGF0YUxheW91dCBhdHRhY2hlZCB0byB0aGUgTW9kdWxlIGFzc29jaWF0ZWQgdG8gdGhpcyBNRi4KKyAgY29uc3QgRGF0YUxheW91dCAmZ2V0RGF0YUxheW91dCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIExMVk0gZnVuY3Rpb24gdGhhdCB0aGlzIG1hY2hpbmUgY29kZSByZXByZXNlbnRzCisgIGNvbnN0IEZ1bmN0aW9uICZnZXRGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIEY7IH0KKworICAvLy8gZ2V0TmFtZSAtIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBMTFZNIGZ1bmN0aW9uLgorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0OworCisgIC8vLyBnZXRGdW5jdGlvbk51bWJlciAtIFJldHVybiBhIHVuaXF1ZSBJRCBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIHVuc2lnbmVkIGdldEZ1bmN0aW9uTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gRnVuY3Rpb25OdW1iZXI7IH0KKworICAvLy8gZ2V0VGFyZ2V0IC0gUmV0dXJuIHRoZSB0YXJnZXQgbWFjaGluZSB0aGlzIG1hY2hpbmUgY29kZSBpcyBjb21waWxlZCB3aXRoCisgIGNvbnN0IFRhcmdldE1hY2hpbmUgJmdldFRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIFRhcmdldDsgfQorCisgIC8vLyBnZXRTdWJ0YXJnZXQgLSBSZXR1cm4gdGhlIHN1YnRhcmdldCBmb3Igd2hpY2ggdGhpcyBtYWNoaW5lIGNvZGUgaXMgYmVpbmcKKyAgLy8vIGNvbXBpbGVkLgorICBjb25zdCBUYXJnZXRTdWJ0YXJnZXRJbmZvICZnZXRTdWJ0YXJnZXQoKSBjb25zdCB7IHJldHVybiAqU1RJOyB9CisgIHZvaWQgc2V0U3VidGFyZ2V0KGNvbnN0IFRhcmdldFN1YnRhcmdldEluZm8gKlNUKSB7IFNUSSA9IFNUOyB9CisKKyAgLy8vIGdldFN1YnRhcmdldCAtIFRoaXMgbWV0aG9kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzcGVjaWZpZWQgdHlwZSBvZgorICAvLy8gVGFyZ2V0U3VidGFyZ2V0SW5mby4gIEluIGRlYnVnIGJ1aWxkcywgaXQgdmVyaWZpZXMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nCisgIC8vLyByZXR1cm5lZCBpcyBvZiB0aGUgY29ycmVjdCB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTVEM+IGNvbnN0IFNUQyAmZ2V0U3VidGFyZ2V0KCkgY29uc3QgeworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgU1RDICo+KFNUSSk7CisgIH0KKworICAvLy8gZ2V0UmVnSW5mbyAtIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVnaXN0ZXJzIGN1cnJlbnRseSBpbiB1c2UuCisgIE1hY2hpbmVSZWdpc3RlckluZm8gJmdldFJlZ0luZm8oKSB7IHJldHVybiAqUmVnSW5mbzsgfQorICBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZnZXRSZWdJbmZvKCkgY29uc3QgeyByZXR1cm4gKlJlZ0luZm87IH0KKworICAvLy8gZ2V0RnJhbWVJbmZvIC0gUmV0dXJuIHRoZSBmcmFtZSBpbmZvIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIC8vLyBUaGlzIG9iamVjdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBvYmplY3RzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sKKyAgLy8vIGZyYW1lIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGluIGFuIGFic3RyYWN0IHdheS4KKyAgTWFjaGluZUZyYW1lSW5mbyAmZ2V0RnJhbWVJbmZvKCkgeyByZXR1cm4gKkZyYW1lSW5mbzsgfQorICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICZnZXRGcmFtZUluZm8oKSBjb25zdCB7IHJldHVybiAqRnJhbWVJbmZvOyB9CisKKyAgLy8vIGdldEp1bXBUYWJsZUluZm8gLSBSZXR1cm4gdGhlIGp1bXAgdGFibGUgaW5mbyBvYmplY3QgZm9yIHRoZSBjdXJyZW50CisgIC8vLyBmdW5jdGlvbi4gIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGp1bXAgdGFibGVzIGluIHRoZQorICAvLy8gY3VycmVudCBmdW5jdGlvbi4gIElmIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGhhcyBubyBqdW1wIHRhYmxlcywgdGhpcyB3aWxsCisgIC8vLyByZXR1cm4gbnVsbC4KKyAgY29uc3QgTWFjaGluZUp1bXBUYWJsZUluZm8gKmdldEp1bXBUYWJsZUluZm8oKSBjb25zdCB7IHJldHVybiBKdW1wVGFibGVJbmZvOyB9CisgIE1hY2hpbmVKdW1wVGFibGVJbmZvICpnZXRKdW1wVGFibGVJbmZvKCkgeyByZXR1cm4gSnVtcFRhYmxlSW5mbzsgfQorCisgIC8vLyBnZXRPckNyZWF0ZUp1bXBUYWJsZUluZm8gLSBHZXQgdGhlIEp1bXBUYWJsZUluZm8gZm9yIHRoaXMgZnVuY3Rpb24sIGlmIGl0CisgIC8vLyBkb2VzIGFscmVhZHkgZXhpc3QsIGFsbG9jYXRlIG9uZS4KKyAgTWFjaGluZUp1bXBUYWJsZUluZm8gKmdldE9yQ3JlYXRlSnVtcFRhYmxlSW5mbyh1bnNpZ25lZCBKVEVudHJ5S2luZCk7CisKKyAgLy8vIGdldENvbnN0YW50UG9vbCAtIFJldHVybiB0aGUgY29uc3RhbnQgcG9vbCBvYmplY3QgZm9yIHRoZSBjdXJyZW50CisgIC8vLyBmdW5jdGlvbi4KKyAgTWFjaGluZUNvbnN0YW50UG9vbCAqZ2V0Q29uc3RhbnRQb29sKCkgeyByZXR1cm4gQ29uc3RhbnRQb29sOyB9CisgIGNvbnN0IE1hY2hpbmVDb25zdGFudFBvb2wgKmdldENvbnN0YW50UG9vbCgpIGNvbnN0IHsgcmV0dXJuIENvbnN0YW50UG9vbDsgfQorCisgIC8vLyBnZXRXaW5FSEZ1bmNJbmZvIC0gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgY3VycmVudCBmdW5jdGlvbiB1c2VzCisgIC8vLyBXaW5kb3dzIGV4Y2VwdGlvbiBoYW5kbGluZy4gUmV0dXJucyBudWxsIGZvciBmdW5jdGlvbnMgdGhhdCBkb24ndCB1c2UKKyAgLy8vIGZ1bmNsZXRzIGZvciBleGNlcHRpb24gaGFuZGxpbmcuCisgIGNvbnN0IFdpbkVIRnVuY0luZm8gKmdldFdpbkVIRnVuY0luZm8oKSBjb25zdCB7IHJldHVybiBXaW5FSEluZm87IH0KKyAgV2luRUhGdW5jSW5mbyAqZ2V0V2luRUhGdW5jSW5mbygpIHsgcmV0dXJuIFdpbkVISW5mbzsgfQorCisgIC8vLyBnZXRBbGlnbm1lbnQgLSBSZXR1cm4gdGhlIGFsaWdubWVudCAobG9nMiwgbm90IGJ5dGVzKSBvZiB0aGUgZnVuY3Rpb24uCisgIHVuc2lnbmVkIGdldEFsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIEFsaWdubWVudDsgfQorCisgIC8vLyBzZXRBbGlnbm1lbnQgLSBTZXQgdGhlIGFsaWdubWVudCAobG9nMiwgbm90IGJ5dGVzKSBvZiB0aGUgZnVuY3Rpb24uCisgIHZvaWQgc2V0QWxpZ25tZW50KHVuc2lnbmVkIEEpIHsgQWxpZ25tZW50ID0gQTsgfQorCisgIC8vLyBlbnN1cmVBbGlnbm1lbnQgLSBNYWtlIHN1cmUgdGhlIGZ1bmN0aW9uIGlzIGF0IGxlYXN0IDEgPDwgQSBieXRlcyBhbGlnbmVkLgorICB2b2lkIGVuc3VyZUFsaWdubWVudCh1bnNpZ25lZCBBKSB7CisgICAgaWYgKEFsaWdubWVudCA8IEEpIEFsaWdubWVudCA9IEE7CisgIH0KKworICAvLy8gZXhwb3Nlc1JldHVybnNUd2ljZSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gY2FsbHMgc2V0am1wIG9yCisgIC8vLyBhbnkgb3RoZXIgc2ltaWxhciBmdW5jdGlvbnMgd2l0aCBhdHRyaWJ1dGUgInJldHVybnMgdHdpY2UiIHdpdGhvdXQKKyAgLy8vIGhhdmluZyB0aGUgYXR0cmlidXRlIGl0c2VsZi4KKyAgYm9vbCBleHBvc2VzUmV0dXJuc1R3aWNlKCkgY29uc3QgeworICAgIHJldHVybiBFeHBvc2VzUmV0dXJuc1R3aWNlOworICB9CisKKyAgLy8vIHNldENhbGxzU2V0Sm1wIC0gU2V0IGEgZmxhZyB0aGF0IGluZGljYXRlcyBpZiB0aGVyZSdzIGEgY2FsbCB0bworICAvLy8gYSAicmV0dXJucyB0d2ljZSIgZnVuY3Rpb24uCisgIHZvaWQgc2V0RXhwb3Nlc1JldHVybnNUd2ljZShib29sIEIpIHsKKyAgICBFeHBvc2VzUmV0dXJuc1R3aWNlID0gQjsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIGFueSBpbmxpbmUgYXNzZW1ibHkuCisgIGJvb2wgaGFzSW5saW5lQXNtKCkgY29uc3QgeworICAgIHJldHVybiBIYXNJbmxpbmVBc207CisgIH0KKworICAvLy8gU2V0IGEgZmxhZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBmdW5jdGlvbiBjb250YWlucyBpbmxpbmUgYXNzZW1ibHkuCisgIHZvaWQgc2V0SGFzSW5saW5lQXNtKGJvb2wgQikgeworICAgIEhhc0lubGluZUFzbSA9IEI7CisgIH0KKworICBib29sIGhhc1dpbkNGSSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSGFzV2luQ0ZJLmhhc1ZhbHVlKCkgJiYgIkhhc1dpbkNGSSBub3Qgc2V0IHlldCEiKTsKKyAgICByZXR1cm4gKkhhc1dpbkNGSTsKKyAgfQorICB2b2lkIHNldEhhc1dpbkNGSShib29sIHYpIHsgSGFzV2luQ0ZJID0gdjsgfQorCisgIC8vLyBHZXQgdGhlIGZ1bmN0aW9uIHByb3BlcnRpZXMKKyAgY29uc3QgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyAmZ2V0UHJvcGVydGllcygpIGNvbnN0IHsgcmV0dXJuIFByb3BlcnRpZXM7IH0KKyAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyAmZ2V0UHJvcGVydGllcygpIHsgcmV0dXJuIFByb3BlcnRpZXM7IH0KKworICAvLy8gZ2V0SW5mbyAtIEtlZXAgdHJhY2sgb2YgdmFyaW91cyBwZXItZnVuY3Rpb24gcGllY2VzIG9mIGluZm9ybWF0aW9uIGZvcgorICAvLy8gYmFja2VuZHMgdGhhdCB3b3VsZCBsaWtlIHRvIGRvIHNvLgorICAvLy8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHk+CisgIFR5ICpnZXRJbmZvKCkgeworICAgIGlmICghTUZJbmZvKQorICAgICAgTUZJbmZvID0gVHk6OnRlbXBsYXRlIGNyZWF0ZTxUeT4oQWxsb2NhdG9yLCAqdGhpcyk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFR5Kj4oTUZJbmZvKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5PgorICBjb25zdCBUeSAqZ2V0SW5mbygpIGNvbnN0IHsKKyAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TWFjaGluZUZ1bmN0aW9uKj4odGhpcyktPmdldEluZm88VHk+KCk7CisgIH0KKworICAvLy8gZ2V0QmxvY2tOdW1iZXJlZCAtIE1hY2hpbmVCYXNpY0Jsb2NrcyBhcmUgYXV0b21hdGljYWxseSBudW1iZXJlZCB3aGVuIHRoZXkKKyAgLy8vIGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBtYWNoaW5lIGZ1bmN0aW9uLiAgVGhlIGJsb2NrIG51bWJlciBmb3IgYSBtYWNoaW5lCisgIC8vLyBiYXNpYyBibG9jayBjYW4gYmUgZm91bmQgYnkgdXNpbmcgdGhlIE1CQjo6Z2V0TnVtYmVyIG1ldGhvZCwgdGhpcyBtZXRob2QKKyAgLy8vIHByb3ZpZGVzIHRoZSBpbnZlcnNlIG1hcHBpbmcuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpnZXRCbG9ja051bWJlcmVkKHVuc2lnbmVkIE4pIGNvbnN0IHsKKyAgICBhc3NlcnQoTiA8IE1CQk51bWJlcmluZy5zaXplKCkgJiYgIklsbGVnYWwgYmxvY2sgbnVtYmVyIik7CisgICAgYXNzZXJ0KE1CQk51bWJlcmluZ1tOXSAmJiAiQmxvY2sgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbWFjaGluZSBmdW5jdGlvbiEiKTsKKyAgICByZXR1cm4gTUJCTnVtYmVyaW5nW05dOworICB9CisKKyAgLy8vIFNob3VsZCB3ZSBiZSBlbWl0dGluZyBzZWdtZW50ZWQgc3RhY2sgc3R1ZmYgZm9yIHRoZSBmdW5jdGlvbgorICBib29sIHNob3VsZFNwbGl0U3RhY2soKSBjb25zdDsKKworICAvLy8gZ2V0TnVtQmxvY2tJRHMgLSBSZXR1cm4gdGhlIG51bWJlciBvZiBNQkIgSUQncyBhbGxvY2F0ZWQuCisgIHVuc2lnbmVkIGdldE51bUJsb2NrSURzKCkgY29uc3QgeyByZXR1cm4gKHVuc2lnbmVkKU1CQk51bWJlcmluZy5zaXplKCk7IH0KKworICAvLy8gUmVudW1iZXJCbG9ja3MgLSBUaGlzIGRpc2NhcmRzIGFsbCBvZiB0aGUgTWFjaGluZUJhc2ljQmxvY2sgbnVtYmVycyBhbmQKKyAgLy8vIHJlY29tcHV0ZXMgdGhlbS4gIFRoaXMgZ3VhcmFudGVlcyB0aGF0IHRoZSBNQkIgbnVtYmVycyBhcmUgc2VxdWVudGlhbCwKKyAgLy8vIGRlbnNlLCBhbmQgbWF0Y2ggdGhlIG9yZGVyaW5nIG9mIHRoZSBibG9ja3Mgd2l0aGluIHRoZSBmdW5jdGlvbi4gIElmIGEKKyAgLy8vIHNwZWNpZmljIE1hY2hpbmVCYXNpY0Jsb2NrIGlzIHNwZWNpZmllZCwgb25seSB0aGF0IGJsb2NrIGFuZCB0aG9zZSBhZnRlcgorICAvLy8gaXQgYXJlIHJlbnVtYmVyZWQuCisgIHZvaWQgUmVudW1iZXJCbG9ja3MoTWFjaGluZUJhc2ljQmxvY2sgKk1CQkZyb20gPSBudWxscHRyKTsKKworICAvLy8gcHJpbnQgLSBQcmludCBvdXQgdGhlIE1hY2hpbmVGdW5jdGlvbiBpbiBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgZGVidWdnaW5nCisgIC8vLyB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFNsb3RJbmRleGVzKiA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyB2aWV3Q0ZHIC0gVGhpcyBmdW5jdGlvbiBpcyBtZWFudCBmb3IgdXNlIGZyb20gdGhlIGRlYnVnZ2VyLiAgWW91IGNhbiBqdXN0CisgIC8vLyBzYXkgJ2NhbGwgRi0+dmlld0NGRygpJyBhbmQgYSBnaG9zdHZpZXcgd2luZG93IHNob3VsZCBwb3AgdXAgZnJvbSB0aGUKKyAgLy8vIHByb2dyYW0sIGRpc3BsYXlpbmcgdGhlIENGRyBvZiB0aGUgY3VycmVudCBmdW5jdGlvbiB3aXRoIHRoZSBjb2RlIGZvciBlYWNoCisgIC8vLyBiYXNpYyBibG9jayBpbnNpZGUuICBUaGlzIGRlcGVuZHMgb24gdGhlcmUgYmVpbmcgYSAnZG90JyBhbmQgJ2d2JyBwcm9ncmFtCisgIC8vLyBpbiB5b3VyIHBhdGguCisgIHZvaWQgdmlld0NGRygpIGNvbnN0OworCisgIC8vLyB2aWV3Q0ZHT25seSAtIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgZm9yIHVzZSBmcm9tIHRoZSBkZWJ1Z2dlci4gIEl0IHdvcmtzCisgIC8vLyBqdXN0IGxpa2Ugdmlld0NGRywgYnV0IGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIGNvbnRlbnRzIG9mIGJhc2ljIGJsb2NrcworICAvLy8gaW50byB0aGUgbm9kZXMsIGp1c3QgdGhlIGxhYmVsLiAgSWYgeW91IGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIENGRworICAvLy8gdGhpcyBjYW4gbWFrZSB0aGUgZ3JhcGggc21hbGxlci4KKyAgLy8vCisgIHZvaWQgdmlld0NGR09ubHkoKSBjb25zdDsKKworICAvLy8gZHVtcCAtIFByaW50IHRoZSBjdXJyZW50IE1hY2hpbmVGdW5jdGlvbiB0byBjZXJyLCB1c2VmdWwgZm9yIGRlYnVnZ2VyIHVzZS4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIFJ1biB0aGUgY3VycmVudCBNYWNoaW5lRnVuY3Rpb24gdGhyb3VnaCB0aGUgbWFjaGluZSBjb2RlIHZlcmlmaWVyLCB1c2VmdWwKKyAgLy8vIGZvciBkZWJ1Z2dlciB1c2UuCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIG5vIHByb2JsZW1zIHdlcmUgZm91bmQuCisgIGJvb2wgdmVyaWZ5KFBhc3MgKnAgPSBudWxscHRyLCBjb25zdCBjaGFyICpCYW5uZXIgPSBudWxscHRyLAorICAgICAgICAgICAgICBib29sIEFib3J0T25FcnJvciA9IHRydWUpIGNvbnN0OworCisgIC8vIFByb3ZpZGUgYWNjZXNzb3JzIGZvciB0aGUgTWFjaGluZUJhc2ljQmxvY2sgbGlzdC4uLgorICB1c2luZyBpdGVyYXRvciA9IEJhc2ljQmxvY2tMaXN0VHlwZTo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gQmFzaWNCbG9ja0xpc3RUeXBlOjpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciA9IEJhc2ljQmxvY2tMaXN0VHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdXNpbmcgcmV2ZXJzZV9pdGVyYXRvciA9IEJhc2ljQmxvY2tMaXN0VHlwZTo6cmV2ZXJzZV9pdGVyYXRvcjsKKworICAvLy8gU3VwcG9ydCBmb3IgTWFjaGluZUJhc2ljQmxvY2s6OmdldE5leHROb2RlKCkuCisgIHN0YXRpYyBCYXNpY0Jsb2NrTGlzdFR5cGUgTWFjaGluZUZ1bmN0aW9uOjoqCisgIGdldFN1Ymxpc3RBY2Nlc3MoTWFjaGluZUJhc2ljQmxvY2sgKikgeworICAgIHJldHVybiAmTWFjaGluZUZ1bmN0aW9uOjpCYXNpY0Jsb2NrczsKKyAgfQorCisgIC8vLyBhZGRMaXZlSW4gLSBBZGQgdGhlIHNwZWNpZmllZCBwaHlzaWNhbCByZWdpc3RlciBhcyBhIGxpdmUtaW4gdmFsdWUgYW5kCisgIC8vLyBjcmVhdGUgYSBjb3JyZXNwb25kaW5nIHZpcnR1YWwgcmVnaXN0ZXIgZm9yIGl0LgorICB1bnNpZ25lZCBhZGRMaXZlSW4odW5zaWduZWQgUFJlZywgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBCYXNpY0Jsb2NrIGFjY2Vzc29yIGZ1bmN0aW9ucy4KKyAgLy8KKyAgaXRlcmF0b3IgICAgICAgICAgICAgICAgIGJlZ2luKCkgICAgICAgeyByZXR1cm4gQmFzaWNCbG9ja3MuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciAgICAgICAgICAgYmVnaW4oKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrcy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yICAgICAgICAgICAgICAgICBlbmQgICgpICAgICAgIHsgcmV0dXJuIEJhc2ljQmxvY2tzLmVuZCgpOyAgIH0KKyAgY29uc3RfaXRlcmF0b3IgICAgICAgICAgIGVuZCAgKCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MuZW5kKCk7ICAgfQorCisgIHJldmVyc2VfaXRlcmF0b3IgICAgICAgIHJiZWdpbigpICAgICAgIHsgcmV0dXJuIEJhc2ljQmxvY2tzLnJiZWdpbigpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLnJiZWdpbigpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgICAgICAgIHJlbmQgICgpICAgICAgIHsgcmV0dXJuIEJhc2ljQmxvY2tzLnJlbmQoKTsgICB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgIHJlbmQgICgpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLnJlbmQoKTsgICB9CisKKyAgdW5zaWduZWQgICAgICAgICAgICAgICAgICBzaXplKCkgY29uc3QgeyByZXR1cm4gKHVuc2lnbmVkKUJhc2ljQmxvY2tzLnNpemUoKTt9CisgIGJvb2wgICAgICAgICAgICAgICAgICAgICBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLmVtcHR5KCk7IH0KKyAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJmZyb250KCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MuZnJvbnQoKTsgfQorICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmZnJvbnQoKSAgICAgICB7IHJldHVybiBCYXNpY0Jsb2Nrcy5mcm9udCgpOyB9CisgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICYgYmFjaygpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLmJhY2soKTsgfQorICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmIGJhY2soKSAgICAgICB7IHJldHVybiBCYXNpY0Jsb2Nrcy5iYWNrKCk7IH0KKworICB2b2lkIHB1c2hfYmFjayAoTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeyBCYXNpY0Jsb2Nrcy5wdXNoX2JhY2sgKE1CQik7IH0KKyAgdm9pZCBwdXNoX2Zyb250KE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsgQmFzaWNCbG9ja3MucHVzaF9mcm9udChNQkIpOyB9CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIE1CQkksIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsKKyAgICBCYXNpY0Jsb2Nrcy5pbnNlcnQoTUJCSSwgTUJCKTsKKyAgfQorICB2b2lkIHNwbGljZShpdGVyYXRvciBJbnNlcnRQdCwgaXRlcmF0b3IgTUJCSSkgeworICAgIEJhc2ljQmxvY2tzLnNwbGljZShJbnNlcnRQdCwgQmFzaWNCbG9ja3MsIE1CQkkpOworICB9CisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIEluc2VydFB0LCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgICAgQmFzaWNCbG9ja3Muc3BsaWNlKEluc2VydFB0LCBCYXNpY0Jsb2NrcywgTUJCKTsKKyAgfQorICB2b2lkIHNwbGljZShpdGVyYXRvciBJbnNlcnRQdCwgaXRlcmF0b3IgTUJCSSwgaXRlcmF0b3IgTUJCRSkgeworICAgIEJhc2ljQmxvY2tzLnNwbGljZShJbnNlcnRQdCwgQmFzaWNCbG9ja3MsIE1CQkksIE1CQkUpOworICB9CisKKyAgdm9pZCByZW1vdmUoaXRlcmF0b3IgTUJCSSkgeyBCYXNpY0Jsb2Nrcy5yZW1vdmUoTUJCSSk7IH0KKyAgdm9pZCByZW1vdmUoTWFjaGluZUJhc2ljQmxvY2sgKk1CQkkpIHsgQmFzaWNCbG9ja3MucmVtb3ZlKE1CQkkpOyB9CisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgTUJCSSkgeyBCYXNpY0Jsb2Nrcy5lcmFzZShNQkJJKTsgfQorICB2b2lkIGVyYXNlKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkJJKSB7IEJhc2ljQmxvY2tzLmVyYXNlKE1CQkkpOyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbXA+CisgIHZvaWQgc29ydChDb21wIGNvbXApIHsKKyAgICBCYXNpY0Jsb2Nrcy5zb3J0KGNvbXApOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEludGVybmFsIGZ1bmN0aW9ucyB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgbnVtYmVyIE1hY2hpbmVCYXNpY0Jsb2NrcworCisgIC8vLyBcYnJpZWYgQWRkcyB0aGUgTUJCIHRvIHRoZSBpbnRlcm5hbCBudW1iZXJpbmcuIFJldHVybnMgdGhlIHVuaXF1ZSBudW1iZXIKKyAgLy8vIGFzc2lnbmVkIHRvIHRoZSBNQkIuCisgIHVuc2lnbmVkIGFkZFRvTUJCTnVtYmVyaW5nKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsKKyAgICBNQkJOdW1iZXJpbmcucHVzaF9iYWNrKE1CQik7CisgICAgcmV0dXJuICh1bnNpZ25lZClNQkJOdW1iZXJpbmcuc2l6ZSgpLTE7CisgIH0KKworICAvLy8gcmVtb3ZlRnJvbU1CQk51bWJlcmluZyAtIFJlbW92ZSB0aGUgc3BlY2lmaWMgbWFjaGluZSBiYXNpYyBibG9jayBmcm9tIG91cgorICAvLy8gdHJhY2tlciwgdGhpcyBpcyBvbmx5IHJlYWxseSB0byBiZSB1c2VkIGJ5IHRoZSBNYWNoaW5lQmFzaWNCbG9jaworICAvLy8gaW1wbGVtZW50YXRpb24uCisgIHZvaWQgcmVtb3ZlRnJvbU1CQk51bWJlcmluZyh1bnNpZ25lZCBOKSB7CisgICAgYXNzZXJ0KE4gPCBNQkJOdW1iZXJpbmcuc2l6ZSgpICYmICJJbGxlZ2FsIGJhc2ljIGJsb2NrICMiKTsKKyAgICBNQkJOdW1iZXJpbmdbTl0gPSBudWxscHRyOworICB9CisKKyAgLy8vIENyZWF0ZU1hY2hpbmVJbnN0ciAtIEFsbG9jYXRlIGEgbmV3IE1hY2hpbmVJbnN0ci4gVXNlIHRoaXMgaW5zdGVhZAorICAvLy8gb2YgYG5ldyBNYWNoaW5lSW5zdHInLgorICBNYWNoaW5lSW5zdHIgKkNyZWF0ZU1hY2hpbmVJbnN0cihjb25zdCBNQ0luc3RyRGVzYyAmTUNJRCwgY29uc3QgRGVidWdMb2MgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE5vSW1wID0gZmFsc2UpOworCisgIC8vLyBDcmVhdGUgYSBuZXcgTWFjaGluZUluc3RyIHdoaWNoIGlzIGEgY29weSBvZiBccCBPcmlnLCBpZGVudGljYWwgaW4gYWxsCisgIC8vLyB3YXlzIGV4Y2VwdCB0aGUgaW5zdHJ1Y3Rpb24gaGFzIG5vIHBhcmVudCwgcHJldiwgb3IgbmV4dC4gQnVuZGxpbmcgZmxhZ3MKKyAgLy8vIGFyZSByZXNldC4KKyAgLy8vCisgIC8vLyBOb3RlOiBDbG9uZXMgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24sIG5vdCB3aG9sZSBpbnN0cnVjdGlvbiBidW5kbGVzLgorICAvLy8gRG9lcyBub3QgcGVyZm9ybSB0YXJnZXQgc3BlY2lmaWMgYWRqdXN0bWVudHM7IGNvbnNpZGVyIHVzaW5nCisgIC8vLyBUYXJnZXRJbnN0ckluZm86OmR1cGxpY2F0ZSgpIGluc3RlYWQuCisgIE1hY2hpbmVJbnN0ciAqQ2xvbmVNYWNoaW5lSW5zdHIoY29uc3QgTWFjaGluZUluc3RyICpPcmlnKTsKKworICAvLy8gQ2xvbmVzIGluc3RydWN0aW9uIG9yIHRoZSB3aG9sZSBpbnN0cnVjdGlvbiBidW5kbGUgXHAgT3JpZyBhbmQgaW5zZXJ0CisgIC8vLyBpbnRvIFxwIE1CQiBiZWZvcmUgXHAgSW5zZXJ0QmVmb3JlLgorICAvLy8KKyAgLy8vIE5vdGU6IERvZXMgbm90IHBlcmZvcm0gdGFyZ2V0IHNwZWNpZmljIGFkanVzdG1lbnRzOyBjb25zaWRlciB1c2luZworICAvLy8gVGFyZ2V0SW5zdHJJbmZvOjpkdXBsaWNhdGUoKSBpbnRlYWQuCisgIE1hY2hpbmVJbnN0ciAmQ2xvbmVNYWNoaW5lSW5zdHJCdW5kbGUoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRCZWZvcmUsIGNvbnN0IE1hY2hpbmVJbnN0ciAmT3JpZyk7CisKKyAgLy8vIERlbGV0ZU1hY2hpbmVJbnN0ciAtIERlbGV0ZSB0aGUgZ2l2ZW4gTWFjaGluZUluc3RyLgorICB2b2lkIERlbGV0ZU1hY2hpbmVJbnN0cihNYWNoaW5lSW5zdHIgKk1JKTsKKworICAvLy8gQ3JlYXRlTWFjaGluZUJhc2ljQmxvY2sgLSBBbGxvY2F0ZSBhIG5ldyBNYWNoaW5lQmFzaWNCbG9jay4gVXNlIHRoaXMKKyAgLy8vIGluc3RlYWQgb2YgYG5ldyBNYWNoaW5lQmFzaWNCbG9jaycuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpDcmVhdGVNYWNoaW5lQmFzaWNCbG9jayhjb25zdCBCYXNpY0Jsb2NrICpiYiA9IG51bGxwdHIpOworCisgIC8vLyBEZWxldGVNYWNoaW5lQmFzaWNCbG9jayAtIERlbGV0ZSB0aGUgZ2l2ZW4gTWFjaGluZUJhc2ljQmxvY2suCisgIHZvaWQgRGVsZXRlTWFjaGluZUJhc2ljQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKk1CQik7CisKKyAgLy8vIGdldE1hY2hpbmVNZW1PcGVyYW5kIC0gQWxsb2NhdGUgYSBuZXcgTWFjaGluZU1lbU9wZXJhbmQuCisgIC8vLyBNYWNoaW5lTWVtT3BlcmFuZHMgYXJlIG93bmVkIGJ5IHRoZSBNYWNoaW5lRnVuY3Rpb24gYW5kIG5lZWQgbm90IGJlCisgIC8vLyBleHBsaWNpdGx5IGRlYWxsb2NhdGVkLgorICBNYWNoaW5lTWVtT3BlcmFuZCAqZ2V0TWFjaGluZU1lbU9wZXJhbmQoCisgICAgICBNYWNoaW5lUG9pbnRlckluZm8gUHRySW5mbywgTWFjaGluZU1lbU9wZXJhbmQ6OkZsYWdzIGYsIHVpbnQ2NF90IHMsCisgICAgICB1bnNpZ25lZCBiYXNlX2FsaWdubWVudCwgY29uc3QgQUFNRE5vZGVzICZBQUluZm8gPSBBQU1ETm9kZXMoKSwKKyAgICAgIGNvbnN0IE1ETm9kZSAqUmFuZ2VzID0gbnVsbHB0ciwKKyAgICAgIFN5bmNTY29wZTo6SUQgU1NJRCA9IFN5bmNTY29wZTo6U3lzdGVtLAorICAgICAgQXRvbWljT3JkZXJpbmcgT3JkZXJpbmcgPSBBdG9taWNPcmRlcmluZzo6Tm90QXRvbWljLAorICAgICAgQXRvbWljT3JkZXJpbmcgRmFpbHVyZU9yZGVyaW5nID0gQXRvbWljT3JkZXJpbmc6Ok5vdEF0b21pYyk7CisKKyAgLy8vIGdldE1hY2hpbmVNZW1PcGVyYW5kIC0gQWxsb2NhdGUgYSBuZXcgTWFjaGluZU1lbU9wZXJhbmQgYnkgY29weWluZworICAvLy8gYW4gZXhpc3Rpbmcgb25lLCBhZGp1c3RpbmcgYnkgYW4gb2Zmc2V0IGFuZCB1c2luZyB0aGUgZ2l2ZW4gc2l6ZS4KKyAgLy8vIE1hY2hpbmVNZW1PcGVyYW5kcyBhcmUgb3duZWQgYnkgdGhlIE1hY2hpbmVGdW5jdGlvbiBhbmQgbmVlZCBub3QgYmUKKyAgLy8vIGV4cGxpY2l0bHkgZGVhbGxvY2F0ZWQuCisgIE1hY2hpbmVNZW1PcGVyYW5kICpnZXRNYWNoaW5lTWVtT3BlcmFuZChjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBPZmZzZXQsIHVpbnQ2NF90IFNpemUpOworCisgIC8vLyBBbGxvY2F0ZSBhIG5ldyBNYWNoaW5lTWVtT3BlcmFuZCBieSBjb3B5aW5nIGFuIGV4aXN0aW5nIG9uZSwKKyAgLy8vIHJlcGxhY2luZyBvbmx5IEFsaWFzQW5hbHlzaXMgaW5mb3JtYXRpb24uIE1hY2hpbmVNZW1PcGVyYW5kcyBhcmUgb3duZWQKKyAgLy8vIGJ5IHRoZSBNYWNoaW5lRnVuY3Rpb24gYW5kIG5lZWQgbm90IGJlIGV4cGxpY2l0bHkgZGVhbGxvY2F0ZWQuCisgIE1hY2hpbmVNZW1PcGVyYW5kICpnZXRNYWNoaW5lTWVtT3BlcmFuZChjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFNRE5vZGVzICZBQUluZm8pOworCisgIHVzaW5nIE9wZXJhbmRDYXBhY2l0eSA9IEFycmF5UmVjeWNsZXI8TWFjaGluZU9wZXJhbmQ+OjpDYXBhY2l0eTsKKworICAvLy8gQWxsb2NhdGUgYW4gYXJyYXkgb2YgTWFjaGluZU9wZXJhbmRzLiBUaGlzIGlzIG9ubHkgaW50ZW5kZWQgZm9yIHVzZSBieQorICAvLy8gaW50ZXJuYWwgTWFjaGluZUluc3RyIGZ1bmN0aW9ucy4KKyAgTWFjaGluZU9wZXJhbmQgKmFsbG9jYXRlT3BlcmFuZEFycmF5KE9wZXJhbmRDYXBhY2l0eSBDYXApIHsKKyAgICByZXR1cm4gT3BlcmFuZFJlY3ljbGVyLmFsbG9jYXRlKENhcCwgQWxsb2NhdG9yKTsKKyAgfQorCisgIC8vLyBEZWxsb2NhdGUgYW4gYXJyYXkgb2YgTWFjaGluZU9wZXJhbmRzIGFuZCByZWN5Y2xlIHRoZSBtZW1vcnkuIFRoaXMgaXMKKyAgLy8vIG9ubHkgaW50ZW5kZWQgZm9yIHVzZSBieSBpbnRlcm5hbCBNYWNoaW5lSW5zdHIgZnVuY3Rpb25zLgorICAvLy8gQ2FwIG11c3QgYmUgdGhlIHNhbWUgY2FwYWNpdHkgdGhhdCB3YXMgdXNlZCB0byBhbGxvY2F0ZSB0aGUgYXJyYXkuCisgIHZvaWQgZGVhbGxvY2F0ZU9wZXJhbmRBcnJheShPcGVyYW5kQ2FwYWNpdHkgQ2FwLCBNYWNoaW5lT3BlcmFuZCAqQXJyYXkpIHsKKyAgICBPcGVyYW5kUmVjeWNsZXIuZGVhbGxvY2F0ZShDYXAsIEFycmF5KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSByZWdpc3RlciBtYXNrIHdpdGggQHAgTnVtUmVnaXN0ZXIgYml0cy4KKyAgdWludDMyX3QgKmFsbG9jYXRlUmVnaXN0ZXJNYXNrKHVuc2lnbmVkIE51bVJlZ2lzdGVyKSB7CisgICAgdW5zaWduZWQgU2l6ZSA9IChOdW1SZWdpc3RlciArIDMxKSAvIDMyOworICAgIHVpbnQzMl90ICpNYXNrID0gQWxsb2NhdG9yLkFsbG9jYXRlPHVpbnQzMl90PihTaXplKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFNpemU7ICsraSkKKyAgICAgIE1hc2tbaV0gPSAwOworICAgIHJldHVybiBNYXNrOworICB9CisKKyAgLy8vIGFsbG9jYXRlTWVtUmVmc0FycmF5IC0gQWxsb2NhdGUgYW4gYXJyYXkgdG8gaG9sZCBNYWNoaW5lTWVtT3BlcmFuZAorICAvLy8gcG9pbnRlcnMuICBUaGlzIGFycmF5IGlzIG93bmVkIGJ5IHRoZSBNYWNoaW5lRnVuY3Rpb24uCisgIE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yIGFsbG9jYXRlTWVtUmVmc0FycmF5KHVuc2lnbmVkIGxvbmcgTnVtKTsKKworICAvLy8gZXh0cmFjdExvYWRNZW1SZWZzIC0gQWxsb2NhdGUgYW4gYXJyYXkgYW5kIHBvcHVsYXRlIGl0IHdpdGgganVzdCB0aGUKKyAgLy8vIGxvYWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgZ2l2ZW4gTWFjaGluZU1lbU9wZXJhbmQgc2VxdWVuY2UuCisgIHN0ZDo6cGFpcjxNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciwKKyAgICAgICAgICAgIE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yPgorICAgIGV4dHJhY3RMb2FkTWVtUmVmcyhNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciBCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyOjptbW9faXRlcmF0b3IgRW5kKTsKKworICAvLy8gZXh0cmFjdFN0b3JlTWVtUmVmcyAtIEFsbG9jYXRlIGFuIGFycmF5IGFuZCBwb3B1bGF0ZSBpdCB3aXRoIGp1c3QgdGhlCisgIC8vLyBzdG9yZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBnaXZlbiBNYWNoaW5lTWVtT3BlcmFuZCBzZXF1ZW5jZS4KKyAgc3RkOjpwYWlyPE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yLAorICAgICAgICAgICAgTWFjaGluZUluc3RyOjptbW9faXRlcmF0b3I+CisgICAgZXh0cmFjdFN0b3JlTWVtUmVmcyhNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciBCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yIEVuZCk7CisKKyAgLy8vIEFsbG9jYXRlIGEgc3RyaW5nIGFuZCBwb3B1bGF0ZSBpdCB3aXRoIHRoZSBnaXZlbiBleHRlcm5hbCBzeW1ib2wgbmFtZS4KKyAgY29uc3QgY2hhciAqY3JlYXRlRXh0ZXJuYWxTeW1ib2xOYW1lKFN0cmluZ1JlZiBOYW1lKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTGFiZWwgTWFuaXB1bGF0aW9uLgorCisgIC8vLyBnZXRKVElTeW1ib2wgLSBSZXR1cm4gdGhlIE1DU3ltYm9sIGZvciB0aGUgc3BlY2lmaWVkIG5vbi1lbXB0eSBqdW1wIHRhYmxlLgorICAvLy8gSWYgaXNMaW5rZXJQcml2YXRlIGlzIHNwZWNpZmllZCwgYW4gJ2wnIGxhYmVsIGlzIHJldHVybmVkLCBvdGhlcndpc2UgYQorICAvLy8gbm9ybWFsICdMJyBsYWJlbCBpcyByZXR1cm5lZC4KKyAgTUNTeW1ib2wgKmdldEpUSVN5bWJvbCh1bnNpZ25lZCBKVEksIE1DQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNMaW5rZXJQcml2YXRlID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyBnZXRQSUNCYXNlU3ltYm9sIC0gUmV0dXJuIGEgZnVuY3Rpb24tbG9jYWwgc3ltYm9sIHRvIHJlcHJlc2VudCB0aGUgUElDCisgIC8vLyBiYXNlLgorICBNQ1N5bWJvbCAqZ2V0UElDQmFzZVN5bWJvbCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgbGlzdCBvZiBjZmkgaW5zdHJ1Y3Rpb25zIGluIHRoZSBmdW5jdGlvbidzCisgIC8vLyBwcm9sb2d1ZS4gIFVzZWQgdG8gY29uc3RydWN0IGZyYW1lIG1hcHMgZm9yIGRlYnVnIGFuZCBleGNlcHRpb24gaGFuZGxpbmcKKyAgLy8vIGNvbXN1bWVycy4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8TUNDRklJbnN0cnVjdGlvbj4gJmdldEZyYW1lSW5zdHJ1Y3Rpb25zKCkgY29uc3QgeworICAgIHJldHVybiBGcmFtZUluc3RydWN0aW9uczsKKyAgfQorCisgIExMVk1fTk9ESVNDQVJEIHVuc2lnbmVkIGFkZEZyYW1lSW5zdChjb25zdCBNQ0NGSUluc3RydWN0aW9uICZJbnN0KSB7CisgICAgRnJhbWVJbnN0cnVjdGlvbnMucHVzaF9iYWNrKEluc3QpOworICAgIHJldHVybiBGcmFtZUluc3RydWN0aW9ucy5zaXplKCkgLSAxOworICB9CisKKyAgLy8vIFxuYW1lIEV4Y2VwdGlvbiBIYW5kbGluZworICAvLy8gXHsKKworICBib29sIGNhbGxzRUhSZXR1cm4oKSBjb25zdCB7IHJldHVybiBDYWxsc0VIUmV0dXJuOyB9CisgIHZvaWQgc2V0Q2FsbHNFSFJldHVybihib29sIGIpIHsgQ2FsbHNFSFJldHVybiA9IGI7IH0KKworICBib29sIGNhbGxzVW53aW5kSW5pdCgpIGNvbnN0IHsgcmV0dXJuIENhbGxzVW53aW5kSW5pdDsgfQorICB2b2lkIHNldENhbGxzVW53aW5kSW5pdChib29sIGIpIHsgQ2FsbHNVbndpbmRJbml0ID0gYjsgfQorCisgIGJvb2wgaGFzRUhGdW5jbGV0cygpIGNvbnN0IHsgcmV0dXJuIEhhc0VIRnVuY2xldHM7IH0KKyAgdm9pZCBzZXRIYXNFSEZ1bmNsZXRzKGJvb2wgVikgeyBIYXNFSEZ1bmNsZXRzID0gVjsgfQorCisgIC8vLyBGaW5kIG9yIGNyZWF0ZSBhbiBMYW5kaW5nUGFkSW5mbyBmb3IgdGhlIHNwZWNpZmllZCBNYWNoaW5lQmFzaWNCbG9jay4KKyAgTGFuZGluZ1BhZEluZm8gJmdldE9yQ3JlYXRlTGFuZGluZ1BhZEluZm8oTWFjaGluZUJhc2ljQmxvY2sgKkxhbmRpbmdQYWQpOworCisgIC8vLyBSZW1hcCBsYW5kaW5nIHBhZCBsYWJlbHMgYW5kIHJlbW92ZSBhbnkgZGVsZXRlZCBsYW5kaW5nIHBhZHMuCisgIHZvaWQgdGlkeUxhbmRpbmdQYWRzKERlbnNlTWFwPE1DU3ltYm9sKiwgdWludHB0cl90PiAqTFBNYXAgPSBudWxscHRyKTsKKworICAvLy8gUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBsYW5kaW5nIHBhZCBpbmZvIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8TGFuZGluZ1BhZEluZm8+ICZnZXRMYW5kaW5nUGFkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gTGFuZGluZ1BhZHM7CisgIH0KKworICAvLy8gUHJvdmlkZSB0aGUgYmVnaW4gYW5kIGVuZCBsYWJlbHMgb2YgYW4gaW52b2tlIHN0eWxlIGNhbGwgYW5kIGFzc29jaWF0ZSBpdAorICAvLy8gd2l0aCBhIHRyeSBsYW5kaW5nIHBhZCBibG9jay4KKyAgdm9pZCBhZGRJbnZva2UoTWFjaGluZUJhc2ljQmxvY2sgKkxhbmRpbmdQYWQsCisgICAgICAgICAgICAgICAgIE1DU3ltYm9sICpCZWdpbkxhYmVsLCBNQ1N5bWJvbCAqRW5kTGFiZWwpOworCisgIC8vLyBBZGQgYSBuZXcgcGFuZGluZyBwYWQuICBSZXR1cm5zIHRoZSBsYWJlbCBJRCBmb3IgdGhlIGxhbmRpbmcgcGFkIGVudHJ5LgorICBNQ1N5bWJvbCAqYWRkTGFuZGluZ1BhZChNYWNoaW5lQmFzaWNCbG9jayAqTGFuZGluZ1BhZCk7CisKKyAgLy8vIFByb3ZpZGUgdGhlIGNhdGNoIHR5cGVpbmZvIGZvciBhIGxhbmRpbmcgcGFkLgorICB2b2lkIGFkZENhdGNoVHlwZUluZm8oTWFjaGluZUJhc2ljQmxvY2sgKkxhbmRpbmdQYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBHbG9iYWxWYWx1ZSAqPiBUeUluZm8pOworCisgIC8vLyBQcm92aWRlIHRoZSBmaWx0ZXIgdHlwZWluZm8gZm9yIGEgbGFuZGluZyBwYWQuCisgIHZvaWQgYWRkRmlsdGVyVHlwZUluZm8oTWFjaGluZUJhc2ljQmxvY2sgKkxhbmRpbmdQYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgR2xvYmFsVmFsdWUgKj4gVHlJbmZvKTsKKworICAvLy8gQWRkIGEgY2xlYW51cCBhY3Rpb24gZm9yIGEgbGFuZGluZyBwYWQuCisgIHZvaWQgYWRkQ2xlYW51cChNYWNoaW5lQmFzaWNCbG9jayAqTGFuZGluZ1BhZCk7CisKKyAgdm9pZCBhZGRTRUhDYXRjaEhhbmRsZXIoTWFjaGluZUJhc2ljQmxvY2sgKkxhbmRpbmdQYWQsIGNvbnN0IEZ1bmN0aW9uICpGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJsb2NrQWRkcmVzcyAqUmVjb3ZlckxhYmVsKTsKKworICB2b2lkIGFkZFNFSENsZWFudXBIYW5kbGVyKE1hY2hpbmVCYXNpY0Jsb2NrICpMYW5kaW5nUGFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uICpDbGVhbnVwKTsKKworICAvLy8gUmV0dXJuIHRoZSB0eXBlIGlkIGZvciB0aGUgc3BlY2lmaWVkIHR5cGVpbmZvLiAgVGhpcyBpcyBmdW5jdGlvbiB3aWRlLgorICB1bnNpZ25lZCBnZXRUeXBlSURGb3IoY29uc3QgR2xvYmFsVmFsdWUgKlRJKTsKKworICAvLy8gUmV0dXJuIHRoZSBpZCBvZiB0aGUgZmlsdGVyIGVuY29kZWQgYnkgVHlJZHMuICBUaGlzIGlzIGZ1bmN0aW9uIHdpZGUuCisgIGludCBnZXRGaWx0ZXJJREZvcihzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJlR5SWRzKTsKKworICAvLy8gTWFwIHRoZSBsYW5kaW5nIHBhZCdzIEVIIHN5bWJvbCB0byB0aGUgY2FsbCBzaXRlIGluZGV4ZXMuCisgIHZvaWQgc2V0Q2FsbFNpdGVMYW5kaW5nUGFkKE1DU3ltYm9sICpTeW0sIEFycmF5UmVmPHVuc2lnbmVkPiBTaXRlcyk7CisKKyAgLy8vIEdldCB0aGUgY2FsbCBzaXRlIGluZGV4ZXMgZm9yIGEgbGFuZGluZyBwYWQgRUggc3ltYm9sLgorICBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZnZXRDYWxsU2l0ZUxhbmRpbmdQYWQoTUNTeW1ib2wgKlN5bSkgeworICAgIGFzc2VydChoYXNDYWxsU2l0ZUxhbmRpbmdQYWQoU3ltKSAmJgorICAgICAgICAgICAibWlzc2luZyBjYWxsIHNpdGUgbnVtYmVyIGZvciBsYW5kaW5nIHBhZCEiKTsKKyAgICByZXR1cm4gTFBhZFRvQ2FsbFNpdGVNYXBbU3ltXTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGFuZGluZyBwYWQgRWggc3ltYm9sIGhhcyBhbiBhc3NvY2lhdGVkIGNhbGwgc2l0ZS4KKyAgYm9vbCBoYXNDYWxsU2l0ZUxhbmRpbmdQYWQoTUNTeW1ib2wgKlN5bSkgeworICAgIHJldHVybiAhTFBhZFRvQ2FsbFNpdGVNYXBbU3ltXS5lbXB0eSgpOworICB9CisKKyAgLy8vIE1hcCB0aGUgYmVnaW4gbGFiZWwgZm9yIGEgY2FsbCBzaXRlLgorICB2b2lkIHNldENhbGxTaXRlQmVnaW5MYWJlbChNQ1N5bWJvbCAqQmVnaW5MYWJlbCwgdW5zaWduZWQgU2l0ZSkgeworICAgIENhbGxTaXRlTWFwW0JlZ2luTGFiZWxdID0gU2l0ZTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGNhbGwgc2l0ZSBudW1iZXIgZm9yIGEgYmVnaW4gbGFiZWwuCisgIHVuc2lnbmVkIGdldENhbGxTaXRlQmVnaW5MYWJlbChNQ1N5bWJvbCAqQmVnaW5MYWJlbCkgY29uc3QgeworICAgIGFzc2VydChoYXNDYWxsU2l0ZUJlZ2luTGFiZWwoQmVnaW5MYWJlbCkgJiYKKyAgICAgICAgICAgIk1pc3NpbmcgY2FsbCBzaXRlIG51bWJlciBmb3IgRUhfTEFCRUwhIik7CisgICAgcmV0dXJuIENhbGxTaXRlTWFwLmxvb2t1cChCZWdpbkxhYmVsKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYmVnaW4gbGFiZWwgaGFzIGEgY2FsbCBzaXRlIG51bWJlciBhc3NvY2lhdGVkIHdpdGggaXQuCisgIGJvb2wgaGFzQ2FsbFNpdGVCZWdpbkxhYmVsKE1DU3ltYm9sICpCZWdpbkxhYmVsKSBjb25zdCB7CisgICAgcmV0dXJuIENhbGxTaXRlTWFwLmNvdW50KEJlZ2luTGFiZWwpOworICB9CisKKyAgLy8vIFJlY29yZCBhbm5vdGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGxhYmVsLgorICB2b2lkIGFkZENvZGVWaWV3QW5ub3RhdGlvbihNQ1N5bWJvbCAqTGFiZWwsIE1ETm9kZSAqTUQpIHsKKyAgICBDb2RlVmlld0Fubm90YXRpb25zLnB1c2hfYmFjayh7TGFiZWwsIE1EfSk7CisgIH0KKworICBBcnJheVJlZjxzdGQ6OnBhaXI8TUNTeW1ib2wgKiwgTUROb2RlICo+PiBnZXRDb2RlVmlld0Fubm90YXRpb25zKCkgY29uc3QgeworICAgIHJldHVybiBDb2RlVmlld0Fubm90YXRpb25zOworICB9CisKKyAgLy8vIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgQysrIHR5cGVpbmZvIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgR2xvYmFsVmFsdWUgKj4gJmdldFR5cGVJbmZvcygpIGNvbnN0IHsKKyAgICByZXR1cm4gVHlwZUluZm9zOworICB9CisKKyAgLy8vIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgdHlwZWlkcyBlbmNvZGluZyBmaWx0ZXJzIHVzZWQgaW4gdGhlIGN1cnJlbnQKKyAgLy8vIGZ1bmN0aW9uLgorICBjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJmdldEZpbHRlcklkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gRmlsdGVySWRzOworICB9CisKKyAgLy8vIFx9CisKKyAgLy8vIENvbGxlY3QgaW5mb3JtYXRpb24gdXNlZCB0byBlbWl0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBvZiBhIHZhcmlhYmxlLgorICB2b2lkIHNldFZhcmlhYmxlRGJnSW5mbyhjb25zdCBESUxvY2FsVmFyaWFibGUgKlZhciwgY29uc3QgRElFeHByZXNzaW9uICpFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTbG90LCBjb25zdCBESUxvY2F0aW9uICpMb2MpIHsKKyAgICBWYXJpYWJsZURiZ0luZm9zLmVtcGxhY2VfYmFjayhWYXIsIEV4cHIsIFNsb3QsIExvYyk7CisgIH0KKworICBWYXJpYWJsZURiZ0luZm9NYXBUeSAmZ2V0VmFyaWFibGVEYmdJbmZvKCkgeyByZXR1cm4gVmFyaWFibGVEYmdJbmZvczsgfQorICBjb25zdCBWYXJpYWJsZURiZ0luZm9NYXBUeSAmZ2V0VmFyaWFibGVEYmdJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBWYXJpYWJsZURiZ0luZm9zOworICB9Cit9OworCisvLy8gXG5hbWUgRXhjZXB0aW9uIEhhbmRsaW5nCisvLy8gXHsKKworLy8vIEV4dHJhY3QgdGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBsYW5kaW5ncGFkIGluc3RydWN0aW9uCisvLy8gYW5kIGFkZCB0aGVtIHRvIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBtb2R1bGUgaW5mby4KK3ZvaWQgYWRkTGFuZGluZ1BhZEluZm8oY29uc3QgTGFuZGluZ1BhZEluc3QgJkksIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworCisvLy8gXH0KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBHcmFwaFRyYWl0cyBzcGVjaWFsaXphdGlvbnMgZm9yIGZ1bmN0aW9uIGJhc2ljIGJsb2NrIGdyYXBocyAoQ0ZHcykKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBQcm92aWRlIHNwZWNpYWxpemF0aW9ucyBvZiBHcmFwaFRyYWl0cyB0byBiZSBhYmxlIHRvIHRyZWF0IGEKKy8vIG1hY2hpbmUgZnVuY3Rpb24gYXMgYSBncmFwaCBvZiBtYWNoaW5lIGJhc2ljIGJsb2Nrcy4uLiB0aGVzZSBhcmUKKy8vIHRoZSBzYW1lIGFzIHRoZSBtYWNoaW5lIGJhc2ljIGJsb2NrIGl0ZXJhdG9ycywgZXhjZXB0IHRoYXQgdGhlIHJvb3QKKy8vIG5vZGUgaXMgaW1wbGljaXRseSB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgZnVuY3Rpb24uCisvLwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPE1hY2hpbmVGdW5jdGlvbio+IDoKKyAgcHVibGljIEdyYXBoVHJhaXRzPE1hY2hpbmVCYXNpY0Jsb2NrKj4geworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoTWFjaGluZUZ1bmN0aW9uICpGKSB7IHJldHVybiAmRi0+ZnJvbnQoKTsgfQorCisgIC8vIG5vZGVzX2l0ZXJhdG9yL2JlZ2luL2VuZCAtIEFsbG93IGl0ZXJhdGlvbiBvdmVyIGFsbCBub2RlcyBpbiB0aGUgZ3JhcGgKKyAgdXNpbmcgbm9kZXNfaXRlcmF0b3IgPSBwb2ludGVyX2l0ZXJhdG9yPE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3I+OworCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihNYWNoaW5lRnVuY3Rpb24gKkYpIHsKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3IoRi0+YmVnaW4oKSk7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKE1hY2hpbmVGdW5jdGlvbiAqRikgeworICAgIHJldHVybiBub2Rlc19pdGVyYXRvcihGLT5lbmQoKSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgICAgICAgc2l6ZSAgICAgICAoTWFjaGluZUZ1bmN0aW9uICpGKSB7IHJldHVybiBGLT5zaXplKCk7IH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8Y29uc3QgTWFjaGluZUZ1bmN0aW9uKj4gOgorICBwdWJsaWMgR3JhcGhUcmFpdHM8Y29uc3QgTWFjaGluZUJhc2ljQmxvY2sqPiB7CisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShjb25zdCBNYWNoaW5lRnVuY3Rpb24gKkYpIHsgcmV0dXJuICZGLT5mcm9udCgpOyB9CisKKyAgLy8gbm9kZXNfaXRlcmF0b3IvYmVnaW4vZW5kIC0gQWxsb3cgaXRlcmF0aW9uIG92ZXIgYWxsIG5vZGVzIGluIHRoZSBncmFwaAorICB1c2luZyBub2Rlc19pdGVyYXRvciA9IHBvaW50ZXJfaXRlcmF0b3I8TWFjaGluZUZ1bmN0aW9uOjpjb25zdF9pdGVyYXRvcj47CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqRikgeworICAgIHJldHVybiBub2Rlc19pdGVyYXRvcihGLT5iZWdpbigpKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQgIChjb25zdCBNYWNoaW5lRnVuY3Rpb24gKkYpIHsKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3IoRi0+ZW5kKCkpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkICAgICAgIHNpemUgICAgICAgKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqRikgIHsKKyAgICByZXR1cm4gRi0+c2l6ZSgpOworICB9Cit9OworCisvLyBQcm92aWRlIHNwZWNpYWxpemF0aW9ucyBvZiBHcmFwaFRyYWl0cyB0byBiZSBhYmxlIHRvIHRyZWF0IGEgZnVuY3Rpb24gYXMgYQorLy8gZ3JhcGggb2YgYmFzaWMgYmxvY2tzLi4uIGFuZCB0byB3YWxrIGl0IGluIGludmVyc2Ugb3JkZXIuICBJbnZlcnNlIG9yZGVyIGZvcgorLy8gYSBmdW5jdGlvbiBpcyBjb25zaWRlcmVkIHRvIGJlIHdoZW4gdHJhdmVyc2luZyB0aGUgcHJlZGVjZXNzb3IgZWRnZXMgb2YgYSBCQgorLy8gaW5zdGVhZCBvZiB0aGUgc3VjY2Vzc29yIGVkZ2VzLgorLy8KK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxJbnZlcnNlPE1hY2hpbmVGdW5jdGlvbio+PiA6CisgIHB1YmxpYyBHcmFwaFRyYWl0czxJbnZlcnNlPE1hY2hpbmVCYXNpY0Jsb2NrKj4+IHsKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKEludmVyc2U8TWFjaGluZUZ1bmN0aW9uICo+IEcpIHsKKyAgICByZXR1cm4gJkcuR3JhcGgtPmZyb250KCk7CisgIH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8SW52ZXJzZTxjb25zdCBNYWNoaW5lRnVuY3Rpb24qPj4gOgorICBwdWJsaWMgR3JhcGhUcmFpdHM8SW52ZXJzZTxjb25zdCBNYWNoaW5lQmFzaWNCbG9jayo+PiB7CisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShJbnZlcnNlPGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqPiBHKSB7CisgICAgcmV0dXJuICZHLkdyYXBoLT5mcm9udCgpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX01BQ0hJTkVGVU5DVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk3OGRhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaApAQCAtMCwwICsxLDgxIEBACisvLz09PS0tIE1hY2hpbmVGdW5jdGlvblBhc3MuaCAtIFBhc3MgZm9yIE1hY2hpbmVGdW5jdGlvbnMgLS0tLS0tLS0qLUMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNYWNoaW5lRnVuY3Rpb25QYXNzIGNsYXNzLiAgTWFjaGluZUZ1bmN0aW9uUGFzcydzIGFyZQorLy8ganVzdCBGdW5jdGlvblBhc3MncywgZXhjZXB0IHRoZXkgb3BlcmF0ZSBvbiBtYWNoaW5lIGNvZGUgYXMgcGFydCBvZiBhIGNvZGUKKy8vIGdlbmVyYXRvci4gIEJlY2F1c2UgdGhleSBvcGVyYXRlIG9uIG1hY2hpbmUgY29kZSwgbm90IHRoZSBMTFZNCisvLyByZXByZXNlbnRhdGlvbiwgTWFjaGluZUZ1bmN0aW9uUGFzcydzIGFyZSBub3QgYWxsb3dlZCB0byBtb2RpZnkgdGhlIExMVk0KKy8vIHJlcHJlc2VudGF0aW9uLiAgRHVlIHRvIHRoaXMgbGltaXRhdGlvbiwgdGhlIE1hY2hpbmVGdW5jdGlvblBhc3MgY2xhc3MgdGFrZXMKKy8vIGNhcmUgb2YgZGVjbGFyaW5nIHRoYXQgbm8gTExWTSBwYXNzZXMgYXJlIGludmFsaWRhdGVkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVGVU5DVElPTlBBU1NfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORUZVTkNUSU9OUEFTU19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIE1hY2hpbmVGdW5jdGlvblBhc3MgLSBUaGlzIGNsYXNzIGFkYXB0cyB0aGUgRnVuY3Rpb25QYXNzIGludGVyZmFjZSB0bworLy8vIGFsbG93IGNvbnZlbmllbnQgY3JlYXRpb24gb2YgcGFzc2VzIHRoYXQgb3BlcmF0ZSBvbiB0aGUgTWFjaGluZUZ1bmN0aW9uCisvLy8gcmVwcmVzZW50YXRpb24uIEluc3RlYWQgb2Ygb3ZlcnJpZGluZyBydW5PbkZ1bmN0aW9uLCBzdWJjbGFzc2VzCisvLy8gb3ZlcnJpZGUgcnVuT25NYWNoaW5lRnVuY3Rpb24uCitjbGFzcyBNYWNoaW5lRnVuY3Rpb25QYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CitwdWJsaWM6CisgIGJvb2wgZG9Jbml0aWFsaXphdGlvbihNb2R1bGUmKSBvdmVycmlkZSB7CisgICAgLy8gQ2FjaGUgdGhlIHByb3BlcnRpZXMgaW5mbyBhdCBtb2R1bGUtaW5pdCB0aW1lIHNvIHdlIGRvbid0IGhhdmUgdG8KKyAgICAvLyBjb25zdHJ1Y3QgdGhlbSBmb3IgZXZlcnkgZnVuY3Rpb24uCisgICAgUmVxdWlyZWRQcm9wZXJ0aWVzID0gZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKCk7CisgICAgU2V0UHJvcGVydGllcyA9IGdldFNldFByb3BlcnRpZXMoKTsKKyAgICBDbGVhcmVkUHJvcGVydGllcyA9IGdldENsZWFyZWRQcm9wZXJ0aWVzKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Citwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IE1hY2hpbmVGdW5jdGlvblBhc3MoY2hhciAmSUQpIDogRnVuY3Rpb25QYXNzKElEKSB7fQorCisgIC8vLyBydW5Pbk1hY2hpbmVGdW5jdGlvbiAtIFRoaXMgbWV0aG9kIG11c3QgYmUgb3ZlcmxvYWRlZCB0byBwZXJmb3JtIHRoZQorICAvLy8gZGVzaXJlZCBtYWNoaW5lIGNvZGUgdHJhbnNmb3JtYXRpb24gb3IgYW5hbHlzaXMuCisgIC8vLworICB2aXJ0dWFsIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRikgPSAwOworCisgIC8vLyBnZXRBbmFseXNpc1VzYWdlIC0gU3ViY2xhc3NlcyB0aGF0IG92ZXJyaWRlIGdldEFuYWx5c2lzVXNhZ2UKKyAgLy8vIG11c3QgY2FsbCB0aGlzLgorICAvLy8KKyAgLy8vIEZvciBNYWNoaW5lRnVuY3Rpb25QYXNzZXMsIGNhbGxpbmcgQVUucHJlc2VydmVzQ0ZHKCkgaW5kaWNhdGVzIHRoYXQKKyAgLy8vIHRoZSBwYXNzIGRvZXMgbm90IG1vZGlmeSB0aGUgTWFjaGluZUJhc2ljQmxvY2sgQ0ZHLgorICAvLy8KKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICB2aXJ0dWFsIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKCkgY29uc3QgeworICAgIHJldHVybiBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzKCk7CisgIH0KKyAgdmlydHVhbCBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzIGdldFNldFByb3BlcnRpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMoKTsKKyAgfQorICB2aXJ0dWFsIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgZ2V0Q2xlYXJlZFByb3BlcnRpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMoKTsKKyAgfQorCitwcml2YXRlOgorICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzIFJlcXVpcmVkUHJvcGVydGllczsKKyAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyBTZXRQcm9wZXJ0aWVzOworICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzIENsZWFyZWRQcm9wZXJ0aWVzOworCisgIC8vLyBjcmVhdGVQcmludGVyUGFzcyAtIEdldCBhIG1hY2hpbmUgZnVuY3Rpb24gcHJpbnRlciBwYXNzLgorICBQYXNzICpjcmVhdGVQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZTsKK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOTRiZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgKQEAgLTAsMCArMSwxNDA3IEBACisvLz09PS0gbGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIC0gTWFjaGluZUluc3RyIGNsYXNzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIE1hY2hpbmVJbnN0ciBjbGFzcywgd2hpY2ggaXMgdGhlCisvLyBiYXNpYyByZXByZXNlbnRhdGlvbiBmb3IgYWxsIHRhcmdldCBkZXBlbmRlbnQgbWFjaGluZSBpbnN0cnVjdGlvbnMgdXNlZCBieQorLy8gdGhlIGJhY2sgZW5kLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVJTlNUUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FSU5TVFJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9ub2RlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU9wZXJhbmQuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0T3Bjb2Rlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVidWdMb2MuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0lubGluZUFzbS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0ckRlc2MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQXJyYXlSZWN5Y2xlci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CitjbGFzcyBESUV4cHJlc3Npb247CitjbGFzcyBESUxvY2FsVmFyaWFibGU7CitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVNZW1PcGVyYW5kOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIE1vZHVsZVNsb3RUcmFja2VyOworY2xhc3MgcmF3X29zdHJlYW07Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgU21hbGxWZWN0b3JJbXBsOworY2xhc3MgU21hbGxCaXRWZWN0b3I7CitjbGFzcyBTdHJpbmdSZWY7CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CitjbGFzcyBUYXJnZXRSZWdpc3RlckNsYXNzOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFJlcHJlc2VudGF0aW9uIG9mIGVhY2ggbWFjaGluZSBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFRoaXMgY2xhc3MgaXNuJ3QgYSBQT0QgdHlwZSwgYnV0IGl0IG11c3QgaGF2ZSBhIHRyaXZpYWwgZGVzdHJ1Y3Rvci4gV2hlbiBhCisvLy8gTWFjaGluZUZ1bmN0aW9uIGlzIGRlbGV0ZWQsIGFsbCB0aGUgY29udGFpbmVkIE1hY2hpbmVJbnN0cnMgYXJlIGRlYWxsb2NhdGVkCisvLy8gd2l0aG91dCBoYXZpbmcgdGhlaXIgZGVzdHJ1Y3RvciBjYWxsZWQuCisvLy8KK2NsYXNzIE1hY2hpbmVJbnN0cgorICAgIDogcHVibGljIGlsaXN0X25vZGVfd2l0aF9wYXJlbnQ8TWFjaGluZUluc3RyLCBNYWNoaW5lQmFzaWNCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlsaXN0X3NlbnRpbmVsX3RyYWNraW5nPHRydWU+PiB7CitwdWJsaWM6CisgIHVzaW5nIG1tb19pdGVyYXRvciA9IE1hY2hpbmVNZW1PcGVyYW5kICoqOworCisgIC8vLyBGbGFncyB0byBzcGVjaWZ5IGRpZmZlcmVudCBraW5kcyBvZiBjb21tZW50cyB0byBvdXRwdXQgaW4KKyAgLy8vIGFzc2VtYmx5IGNvZGUuICBUaGVzZSBmbGFncyBjYXJyeSBzZW1hbnRpYyBpbmZvcm1hdGlvbiBub3QKKyAgLy8vIG90aGVyd2lzZSBlYXNpbHkgZGVyaXZhYmxlIGZyb20gdGhlIElSIHRleHQuCisgIC8vLworICBlbnVtIENvbW1lbnRGbGFnIHsKKyAgICBSZWxvYWRSZXVzZSA9IDB4MSwgICAgLy8gaGlnaGVyIGJpdHMgYXJlIHJlc2VydmVkIGZvciB0YXJnZXQgZGVwIGNvbW1lbnRzLgorICAgIE5vU2NoZWRDb21tZW50ID0gMHgyLAorICAgIFRBc21Db21tZW50cyA9IDB4NCAgICAvLyBUYXJnZXQgQXNtIGNvbW1lbnRzIHNob3VsZCBzdGFydCBmcm9tIHRoaXMgdmFsdWUuCisgIH07CisKKyAgZW51bSBNSUZsYWcgeworICAgIE5vRmxhZ3MgICAgICA9IDAsCisgICAgRnJhbWVTZXR1cCAgID0gMSA8PCAwLCAgICAgICAgICAgICAgLy8gSW5zdHJ1Y3Rpb24gaXMgdXNlZCBhcyBhIHBhcnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBmcmFtZSBzZXR1cCBjb2RlLgorICAgIEZyYW1lRGVzdHJveSA9IDEgPDwgMSwgICAgICAgICAgICAgIC8vIEluc3RydWN0aW9uIGlzIHVzZWQgYXMgYSBwYXJ0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gZnJhbWUgZGVzdHJ1Y3Rpb24gY29kZS4KKyAgICBCdW5kbGVkUHJlZCAgPSAxIDw8IDIsICAgICAgICAgICAgICAvLyBJbnN0cnVjdGlvbiBoYXMgYnVuZGxlZCBwcmVkZWNlc3NvcnMuCisgICAgQnVuZGxlZFN1Y2MgID0gMSA8PCAzICAgICAgICAgICAgICAgLy8gSW5zdHJ1Y3Rpb24gaGFzIGJ1bmRsZWQgc3VjY2Vzc29ycy4KKyAgfTsKKworcHJpdmF0ZToKKyAgY29uc3QgTUNJbnN0ckRlc2MgKk1DSUQ7ICAgICAgICAgICAgICAvLyBJbnN0cnVjdGlvbiBkZXNjcmlwdG9yLgorICBNYWNoaW5lQmFzaWNCbG9jayAqUGFyZW50ID0gbnVsbHB0cjsgIC8vIFBvaW50ZXIgdG8gdGhlIG93bmluZyBiYXNpYyBibG9jay4KKworICAvLyBPcGVyYW5kcyBhcmUgYWxsb2NhdGVkIGJ5IGFuIEFycmF5UmVjeWNsZXIuCisgIE1hY2hpbmVPcGVyYW5kICpPcGVyYW5kcyA9IG51bGxwdHI7ICAgLy8gUG9pbnRlciB0byB0aGUgZmlyc3Qgb3BlcmFuZC4KKyAgdW5zaWduZWQgTnVtT3BlcmFuZHMgPSAwOyAgICAgICAgICAgICAvLyBOdW1iZXIgb2Ygb3BlcmFuZHMgb24gaW5zdHJ1Y3Rpb24uCisgIHVzaW5nIE9wZXJhbmRDYXBhY2l0eSA9IEFycmF5UmVjeWNsZXI8TWFjaGluZU9wZXJhbmQ+OjpDYXBhY2l0eTsKKyAgT3BlcmFuZENhcGFjaXR5IENhcE9wZXJhbmRzOyAgICAgICAgICAvLyBDYXBhY2l0eSBvZiB0aGUgT3BlcmFuZHMgYXJyYXkuCisKKyAgdWludDhfdCBGbGFncyA9IDA7ICAgICAgICAgICAgICAgICAgICAvLyBWYXJpb3VzIGJpdHMgb2YgYWRkaXRpb25hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIGFib3V0IG1hY2hpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnN0cnVjdGlvbi4KKworICB1aW50OF90IEFzbVByaW50ZXJGbGFncyA9IDA7ICAgICAgICAgIC8vIFZhcmlvdXMgYml0cyBvZiBpbmZvcm1hdGlvbiB1c2VkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIEFzbVByaW50ZXIgdG8gZW1pdCBoZWxwZnVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWVudHMuICBUaGlzIGlzICpub3QqIHNlbWFudGljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24uICBEbyBub3QgdXNlIHRoaXMgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55dGhpbmcgb3RoZXIgdGhhbiB0byBjb252ZXkgY29tbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIHRvIEFzbVByaW50ZXIuCisKKyAgdWludDhfdCBOdW1NZW1SZWZzID0gMDsgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBvbiBtZW1vcnkgcmVmZXJlbmNlcy4KKyAgLy8gTm90ZSB0aGF0IE1lbVJlZnMgPT0gbnVsbHB0ciwgIG1lYW5zICdkb24ndCBrbm93Jywgbm90ICdubyBtZW1vcnkgYWNjZXNzJy4KKyAgLy8gQ2FsbGluZyBjb2RlIG11c3QgdHJlYXQgbWlzc2luZyBpbmZvcm1hdGlvbiBjb25zZXJ2YXRpdmVseS4gIElmIHRoZSBudW1iZXIKKyAgLy8gb2YgbWVtb3J5IG9wZXJhbmRzIHJlcXVpcmVkIHRvIGJlIHByZWNpc2UgZXhjZWVkcyB0aGUgbWF4aW11bSB2YWx1ZSBvZgorICAvLyBOdW1NZW1SZWZzIC0gY3VycmVudGx5IDI1NiAtIHdlIHJlbW92ZSB0aGUgb3BlcmFuZHMgZW50aXJlbHkuIE5vdGUgYWxzbworICAvLyB0aGF0IHRoaXMgaXMgYSBub24tb3duaW5nIHJlZmVyZW5jZSB0byBhIHNoYXJlZCBjb3B5IG9uIHdyaXRlIGJ1ZmZlciBvd25lZAorICAvLyBieSB0aGUgTWFjaGluZUZ1bmN0aW9uIGFuZCBjcmVhdGVkIHZpYSBNRi5hbGxvY2F0ZU1lbVJlZnNBcnJheS4KKyAgbW1vX2l0ZXJhdG9yIE1lbVJlZnMgPSBudWxscHRyOworCisgIERlYnVnTG9jIGRlYnVnTG9jOyAgICAgICAgICAgICAgICAgICAgLy8gU291cmNlIGxpbmUgaW5mb3JtYXRpb24uCisKKyAgLy8gSW50cnVzaXZlIGxpc3Qgc3VwcG9ydAorICBmcmllbmQgc3RydWN0IGlsaXN0X3RyYWl0czxNYWNoaW5lSW5zdHI+OworICBmcmllbmQgc3RydWN0IGlsaXN0X2NhbGxiYWNrX3RyYWl0czxNYWNoaW5lQmFzaWNCbG9jaz47CisgIHZvaWQgc2V0UGFyZW50KE1hY2hpbmVCYXNpY0Jsb2NrICpQKSB7IFBhcmVudCA9IFA7IH0KKworICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgY29weSBvZiB0aGUgZ2l2ZW4KKyAgLy8vIE1hY2hpbmVJbnN0ciBpbiB0aGUgZ2l2ZW4gTWFjaGluZUZ1bmN0aW9uLgorICBNYWNoaW5lSW5zdHIoTWFjaGluZUZ1bmN0aW9uICYsIGNvbnN0IE1hY2hpbmVJbnN0ciAmKTsKKworICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGUgYSBNYWNoaW5lSW5zdHIgYW5kIGFkZCB0aGUgaW1wbGljaXQgb3BlcmFuZHMuCisgIC8vLyBJdCByZXNlcnZlcyBzcGFjZSBmb3IgbnVtYmVyIG9mIG9wZXJhbmRzIHNwZWNpZmllZCBieQorICAvLy8gTUNJbnN0ckRlc2MuICBBbiBleHBsaWNpdCBEZWJ1Z0xvYyBpcyBzdXBwbGllZC4KKyAgTWFjaGluZUluc3RyKE1hY2hpbmVGdW5jdGlvbiAmLCBjb25zdCBNQ0luc3RyRGVzYyAmTUNJRCwgRGVidWdMb2MgZGwsCisgICAgICAgICAgICAgICBib29sIE5vSW1wID0gZmFsc2UpOworCisgIC8vIE1hY2hpbmVJbnN0cnMgYXJlIHBvb2wtYWxsb2NhdGVkIGFuZCBvd25lZCBieSBNYWNoaW5lRnVuY3Rpb24uCisgIGZyaWVuZCBjbGFzcyBNYWNoaW5lRnVuY3Rpb247CisKK3B1YmxpYzoKKyAgTWFjaGluZUluc3RyKGNvbnN0IE1hY2hpbmVJbnN0ciAmKSA9IGRlbGV0ZTsKKyAgTWFjaGluZUluc3RyICZvcGVyYXRvcj0oY29uc3QgTWFjaGluZUluc3RyICYpID0gZGVsZXRlOworICAvLyBVc2UgTWFjaGluZUZ1bmN0aW9uOjpEZWxldGVNYWNoaW5lSW5zdHIoKSBpbnN0ZWFkLgorICB+TWFjaGluZUluc3RyKCkgPSBkZWxldGU7CisKKyAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sqIGdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIFBhcmVudDsgfQorICBNYWNoaW5lQmFzaWNCbG9jayogZ2V0UGFyZW50KCkgeyByZXR1cm4gUGFyZW50OyB9CisKKyAgLy8vIFJldHVybiB0aGUgZnVuY3Rpb24gdGhhdCBjb250YWlucyB0aGUgYmFzaWMgYmxvY2sgdGhhdCB0aGlzIGluc3RydWN0aW9uCisgIC8vLyBiZWxvbmdzIHRvLgorICAvLy8KKyAgLy8vIE5vdGU6IHRoaXMgaXMgdW5kZWZpbmVkIGJlaGF2aW91ciBpZiB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgaGF2ZSBhCisgIC8vLyBwYXJlbnQuCisgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqZ2V0TUYoKSBjb25zdDsKKyAgTWFjaGluZUZ1bmN0aW9uICpnZXRNRigpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxNYWNoaW5lRnVuY3Rpb24gKj4oCisgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IE1hY2hpbmVJbnN0ciAqPih0aGlzKS0+Z2V0TUYoKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBhc20gcHJpbnRlciBmbGFncyBiaXR2ZWN0b3IuCisgIHVpbnQ4X3QgZ2V0QXNtUHJpbnRlckZsYWdzKCkgY29uc3QgeyByZXR1cm4gQXNtUHJpbnRlckZsYWdzOyB9CisKKyAgLy8vIENsZWFyIHRoZSBBc21QcmludGVyIGJpdHZlY3Rvci4KKyAgdm9pZCBjbGVhckFzbVByaW50ZXJGbGFncygpIHsgQXNtUHJpbnRlckZsYWdzID0gMDsgfQorCisgIC8vLyBSZXR1cm4gd2hldGhlciBhbiBBc21QcmludGVyIGZsYWcgaXMgc2V0LgorICBib29sIGdldEFzbVByaW50ZXJGbGFnKENvbW1lbnRGbGFnIEZsYWcpIGNvbnN0IHsKKyAgICByZXR1cm4gQXNtUHJpbnRlckZsYWdzICYgRmxhZzsKKyAgfQorCisgIC8vLyBTZXQgYSBmbGFnIGZvciB0aGUgQXNtUHJpbnRlci4KKyAgdm9pZCBzZXRBc21QcmludGVyRmxhZyh1aW50OF90IEZsYWcpIHsKKyAgICBBc21QcmludGVyRmxhZ3MgfD0gRmxhZzsKKyAgfQorCisgIC8vLyBDbGVhciBzcGVjaWZpYyBBc21QcmludGVyIGZsYWdzLgorICB2b2lkIGNsZWFyQXNtUHJpbnRlckZsYWcoQ29tbWVudEZsYWcgRmxhZykgeworICAgIEFzbVByaW50ZXJGbGFncyAmPSB+RmxhZzsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIE1JIGZsYWdzIGJpdHZlY3Rvci4KKyAgdWludDhfdCBnZXRGbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3M7CisgIH0KKworICAvLy8gUmV0dXJuIHdoZXRoZXIgYW4gTUkgZmxhZyBpcyBzZXQuCisgIGJvb2wgZ2V0RmxhZyhNSUZsYWcgRmxhZykgY29uc3QgeworICAgIHJldHVybiBGbGFncyAmIEZsYWc7CisgIH0KKworICAvLy8gU2V0IGEgTUkgZmxhZy4KKyAgdm9pZCBzZXRGbGFnKE1JRmxhZyBGbGFnKSB7CisgICAgRmxhZ3MgfD0gKHVpbnQ4X3QpRmxhZzsKKyAgfQorCisgIHZvaWQgc2V0RmxhZ3ModW5zaWduZWQgZmxhZ3MpIHsKKyAgICAvLyBGaWx0ZXIgb3V0IHRoZSBhdXRvbWF0aWNhbGx5IG1haW50YWluZWQgZmxhZ3MuCisgICAgdW5zaWduZWQgTWFzayA9IEJ1bmRsZWRQcmVkIHwgQnVuZGxlZFN1Y2M7CisgICAgRmxhZ3MgPSAoRmxhZ3MgJiBNYXNrKSB8IChmbGFncyAmIH5NYXNrKTsKKyAgfQorCisgIC8vLyBjbGVhckZsYWcgLSBDbGVhciBhIE1JIGZsYWcuCisgIHZvaWQgY2xlYXJGbGFnKE1JRmxhZyBGbGFnKSB7CisgICAgRmxhZ3MgJj0gfigodWludDhfdClGbGFnKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBNSSBpcyBpbiBhIGJ1bmRsZSAoYnV0IG5vdCB0aGUgZmlyc3QgTUkgaW4gYSBidW5kbGUpLgorICAvLy8KKyAgLy8vIEEgYnVuZGxlIGxvb2tzIGxpa2UgdGhpcyBiZWZvcmUgaXQncyBmaW5hbGl6ZWQ6CisgIC8vLyAgIC0tLS0tLS0tLS0tLS0tLS0KKyAgLy8vICAgfCAgICAgIE1JICAgICAgfAorICAvLy8gICAtLS0tLS0tLS0tLS0tLS0tCisgIC8vLyAgICAgICAgICB8CisgIC8vLyAgIC0tLS0tLS0tLS0tLS0tLS0KKyAgLy8vICAgfCAgICAgIE1JICAgICogfAorICAvLy8gICAtLS0tLS0tLS0tLS0tLS0tCisgIC8vLyAgICAgICAgICB8CisgIC8vLyAgIC0tLS0tLS0tLS0tLS0tLS0KKyAgLy8vICAgfCAgICAgIE1JICAgICogfAorICAvLy8gICAtLS0tLS0tLS0tLS0tLS0tCisgIC8vLyBJbiB0aGlzIGNhc2UsIHRoZSBmaXJzdCBNSSBzdGFydHMgYSBidW5kbGUgYnV0IGlzIG5vdCBpbnNpZGUgYSBidW5kbGUsIHRoZQorICAvLy8gbmV4dCAyIE1JcyBhcmUgY29uc2lkZXJlZCAiaW5zaWRlIiB0aGUgYnVuZGxlLgorICAvLy8KKyAgLy8vIEFmdGVyIGEgYnVuZGxlIGlzIGZpbmFsaXplZCwgaXQgbG9va3MgbGlrZSB0aGlzOgorICAvLy8gICAtLS0tLS0tLS0tLS0tLS0tCisgIC8vLyAgIHwgICAgQnVuZGxlICAgIHwKKyAgLy8vICAgLS0tLS0tLS0tLS0tLS0tLQorICAvLy8gICAgICAgICAgfAorICAvLy8gICAtLS0tLS0tLS0tLS0tLS0tCisgIC8vLyAgIHwgICAgICBNSSAgICAqIHwKKyAgLy8vICAgLS0tLS0tLS0tLS0tLS0tLQorICAvLy8gICAgICAgICAgfAorICAvLy8gICAtLS0tLS0tLS0tLS0tLS0tCisgIC8vLyAgIHwgICAgICBNSSAgICAqIHwKKyAgLy8vICAgLS0tLS0tLS0tLS0tLS0tLQorICAvLy8gICAgICAgICAgfAorICAvLy8gICAtLS0tLS0tLS0tLS0tLS0tCisgIC8vLyAgIHwgICAgICBNSSAgICAqIHwKKyAgLy8vICAgLS0tLS0tLS0tLS0tLS0tLQorICAvLy8gVGhlIGZpcnN0IGluc3RydWN0aW9uIGhhcyB0aGUgc3BlY2lhbCBvcGNvZGUgIkJVTkRMRSIuIEl0J3Mgbm90ICJpbnNpZGUiCisgIC8vLyBhIGJ1bmRsZSwgYnV0IHRoZSBuZXh0IHRocmVlIE1JcyBhcmUuCisgIGJvb2wgaXNJbnNpZGVCdW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEZsYWcoQnVuZGxlZFByZWQpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gcGFydCBvZiBhIGJ1bmRsZS4gVGhpcyBpcyB0cnVlCisgIC8vLyBpZiBlaXRoZXIgaXRzZWxmIG9yIGl0cyBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24gaXMgbWFya2VkICJJbnNpZGVCdW5kbGUiLgorICBib29sIGlzQnVuZGxlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNCdW5kbGVkV2l0aFByZWQoKSB8fCBpc0J1bmRsZWRXaXRoU3VjYygpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgcGFydCBvZiBhIGJ1bmRsZSwgYW5kIGl0IGlzIG5vdCB0aGUKKyAgLy8vIGZpcnN0IGluc3RydWN0aW9uIGluIHRoZSBidW5kbGUuCisgIGJvb2wgaXNCdW5kbGVkV2l0aFByZWQoKSBjb25zdCB7IHJldHVybiBnZXRGbGFnKEJ1bmRsZWRQcmVkKTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGlzIHBhcnQgb2YgYSBidW5kbGUsIGFuZCBpdCBpcyBub3QgdGhlCisgIC8vLyBsYXN0IGluc3RydWN0aW9uIGluIHRoZSBidW5kbGUuCisgIGJvb2wgaXNCdW5kbGVkV2l0aFN1Y2MoKSBjb25zdCB7IHJldHVybiBnZXRGbGFnKEJ1bmRsZWRTdWNjKTsgfQorCisgIC8vLyBCdW5kbGUgdGhpcyBpbnN0cnVjdGlvbiB3aXRoIGl0cyBwcmVkZWNlc3Nvci4gVGhpcyBjYW4gYmUgYW4gdW5idW5kbGVkCisgIC8vLyBpbnN0cnVjdGlvbiwgb3IgaXQgY2FuIGJlIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpbiBhIGJ1bmRsZS4KKyAgdm9pZCBidW5kbGVXaXRoUHJlZCgpOworCisgIC8vLyBCdW5kbGUgdGhpcyBpbnN0cnVjdGlvbiB3aXRoIGl0cyBzdWNjZXNzb3IuIFRoaXMgY2FuIGJlIGFuIHVuYnVuZGxlZAorICAvLy8gaW5zdHJ1Y3Rpb24sIG9yIGl0IGNhbiBiZSB0aGUgbGFzdCBpbnN0cnVjdGlvbiBpbiBhIGJ1bmRsZS4KKyAgdm9pZCBidW5kbGVXaXRoU3VjYygpOworCisgIC8vLyBCcmVhayBidW5kbGUgYWJvdmUgdGhpcyBpbnN0cnVjdGlvbi4KKyAgdm9pZCB1bmJ1bmRsZUZyb21QcmVkKCk7CisKKyAgLy8vIEJyZWFrIGJ1bmRsZSBiZWxvdyB0aGlzIGluc3RydWN0aW9uLgorICB2b2lkIHVuYnVuZGxlRnJvbVN1Y2MoKTsKKworICAvLy8gUmV0dXJucyB0aGUgZGVidWcgbG9jYXRpb24gaWQgb2YgdGhpcyBNYWNoaW5lSW5zdHIuCisgIGNvbnN0IERlYnVnTG9jICZnZXREZWJ1Z0xvYygpIGNvbnN0IHsgcmV0dXJuIGRlYnVnTG9jOyB9CisKKyAgLy8vIFJldHVybiB0aGUgZGVidWcgdmFyaWFibGUgcmVmZXJlbmNlZCBieQorICAvLy8gdGhpcyBEQkdfVkFMVUUgaW5zdHJ1Y3Rpb24uCisgIGNvbnN0IERJTG9jYWxWYXJpYWJsZSAqZ2V0RGVidWdWYXJpYWJsZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIGNvbXBsZXggYWRkcmVzcyBleHByZXNzaW9uIHJlZmVyZW5jZWQgYnkKKyAgLy8vIHRoaXMgREJHX1ZBTFVFIGluc3RydWN0aW9uLgorICBjb25zdCBESUV4cHJlc3Npb24gKmdldERlYnVnRXhwcmVzc2lvbigpIGNvbnN0OworCisgIC8vLyBFbWl0IGFuIGVycm9yIHJlZmVycmluZyB0byB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIC8vLyBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGlubGluZSBhc3NlbWJseSB0aGF0IGlzIHNvbWVob3cKKyAgLy8vIGltcG9zc2libGUgdG8gY29tcGlsZS4gT3RoZXIgZXJyb3JzIHNob3VsZCBoYXZlIGJlZW4gaGFuZGxlZCBtdWNoCisgIC8vLyBlYXJsaWVyLgorICAvLy8KKyAgLy8vIElmIHRoaXMgbWV0aG9kIHJldHVybnMsIHRoZSBjYWxsZXIgc2hvdWxkIHRyeSB0byByZWNvdmVyIGZyb20gdGhlIGVycm9yLgorICB2b2lkIGVtaXRFcnJvcihTdHJpbmdSZWYgTXNnKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgdGFyZ2V0IGluc3RydWN0aW9uIGRlc2NyaXB0b3Igb2YgdGhpcyBNYWNoaW5lSW5zdHIuCisgIGNvbnN0IE1DSW5zdHJEZXNjICZnZXREZXNjKCkgY29uc3QgeyByZXR1cm4gKk1DSUQ7IH0KKworICAvLy8gUmV0dXJucyB0aGUgb3Bjb2RlIG9mIHRoaXMgTWFjaGluZUluc3RyLgorICB1bnNpZ25lZCBnZXRPcGNvZGUoKSBjb25zdCB7IHJldHVybiBNQ0lELT5PcGNvZGU7IH0KKworICAvLy8gQWNjZXNzIHRvIGV4cGxpY2l0IG9wZXJhbmRzIG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdCB7IHJldHVybiBOdW1PcGVyYW5kczsgfQorCisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kJiBnZXRPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IGdldE51bU9wZXJhbmRzKCkgJiYgImdldE9wZXJhbmQoKSBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIE9wZXJhbmRzW2ldOworICB9CisgIE1hY2hpbmVPcGVyYW5kJiBnZXRPcGVyYW5kKHVuc2lnbmVkIGkpIHsKKyAgICBhc3NlcnQoaSA8IGdldE51bU9wZXJhbmRzKCkgJiYgImdldE9wZXJhbmQoKSBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIE9wZXJhbmRzW2ldOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIG9wZXJhbmQgXHAgT3BJZHggaXMgYSBzdWJyZWdpc3RlciBpbmRleC4KKyAgYm9vbCBpc09wZXJhbmRTdWJyZWdJZHgodW5zaWduZWQgT3BJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0T3BlcmFuZChPcElkeCkuZ2V0VHlwZSgpID09IE1hY2hpbmVPcGVyYW5kOjpNT19JbW1lZGlhdGUgJiYKKyAgICAgICAgICAgIkV4cGVjdGVkIE1PX0ltbWVkaWF0ZSBvcGVyYW5kIHR5cGUuIik7CisgICAgaWYgKGlzRXh0cmFjdFN1YnJlZygpICYmIE9wSWR4ID09IDIpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoaXNJbnNlcnRTdWJyZWcoKSAmJiBPcElkeCA9PSAzKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKGlzUmVnU2VxdWVuY2UoKSAmJiBPcElkeCA+IDEgJiYgKE9wSWR4ICUgMikgPT0gMCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChpc1N1YnJlZ1RvUmVnKCkgJiYgT3BJZHggPT0gMykKKyAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uLWltcGxpY2l0IG9wZXJhbmRzLgorICB1bnNpZ25lZCBnZXROdW1FeHBsaWNpdE9wZXJhbmRzKCkgY29uc3Q7CisKKyAgLy8vIGl0ZXJhdG9yL2JlZ2luL2VuZCAtIEl0ZXJhdGUgb3ZlciBhbGwgb3BlcmFuZHMgb2YgYSBtYWNoaW5lIGluc3RydWN0aW9uLgorICB1c2luZyBtb3BfaXRlcmF0b3IgPSBNYWNoaW5lT3BlcmFuZCAqOworICB1c2luZyBjb25zdF9tb3BfaXRlcmF0b3IgPSBjb25zdCBNYWNoaW5lT3BlcmFuZCAqOworCisgIG1vcF9pdGVyYXRvciBvcGVyYW5kc19iZWdpbigpIHsgcmV0dXJuIE9wZXJhbmRzOyB9CisgIG1vcF9pdGVyYXRvciBvcGVyYW5kc19lbmQoKSB7IHJldHVybiBPcGVyYW5kcyArIE51bU9wZXJhbmRzOyB9CisKKyAgY29uc3RfbW9wX2l0ZXJhdG9yIG9wZXJhbmRzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gT3BlcmFuZHM7IH0KKyAgY29uc3RfbW9wX2l0ZXJhdG9yIG9wZXJhbmRzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIE9wZXJhbmRzICsgTnVtT3BlcmFuZHM7IH0KKworICBpdGVyYXRvcl9yYW5nZTxtb3BfaXRlcmF0b3I+IG9wZXJhbmRzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKG9wZXJhbmRzX2JlZ2luKCksIG9wZXJhbmRzX2VuZCgpKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxjb25zdF9tb3BfaXRlcmF0b3I+IG9wZXJhbmRzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKG9wZXJhbmRzX2JlZ2luKCksIG9wZXJhbmRzX2VuZCgpKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxtb3BfaXRlcmF0b3I+IGV4cGxpY2l0X29wZXJhbmRzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKG9wZXJhbmRzX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgb3BlcmFuZHNfYmVnaW4oKSArIGdldE51bUV4cGxpY2l0T3BlcmFuZHMoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfbW9wX2l0ZXJhdG9yPiBleHBsaWNpdF9vcGVyYW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShvcGVyYW5kc19iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgIG9wZXJhbmRzX2JlZ2luKCkgKyBnZXROdW1FeHBsaWNpdE9wZXJhbmRzKCkpOworICB9CisgIGl0ZXJhdG9yX3JhbmdlPG1vcF9pdGVyYXRvcj4gaW1wbGljaXRfb3BlcmFuZHMoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoZXhwbGljaXRfb3BlcmFuZHMoKS5lbmQoKSwgb3BlcmFuZHNfZW5kKCkpOworICB9CisgIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X21vcF9pdGVyYXRvcj4gaW1wbGljaXRfb3BlcmFuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoZXhwbGljaXRfb3BlcmFuZHMoKS5lbmQoKSwgb3BlcmFuZHNfZW5kKCkpOworICB9CisgIC8vLyBSZXR1cm5zIGEgcmFuZ2Ugb3ZlciBhbGwgZXhwbGljaXQgb3BlcmFuZHMgdGhhdCBhcmUgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgIC8vLyBJbXBsaWNpdCBkZWZpbml0aW9uIGFyZSBub3QgaW5jbHVkZWQhCisgIGl0ZXJhdG9yX3JhbmdlPG1vcF9pdGVyYXRvcj4gZGVmcygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShvcGVyYW5kc19iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgIG9wZXJhbmRzX2JlZ2luKCkgKyBnZXREZXNjKCkuZ2V0TnVtRGVmcygpKTsKKyAgfQorICAvLy8gXGNvcHlkb2MgZGVmcygpCisgIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X21vcF9pdGVyYXRvcj4gZGVmcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShvcGVyYW5kc19iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgIG9wZXJhbmRzX2JlZ2luKCkgKyBnZXREZXNjKCkuZ2V0TnVtRGVmcygpKTsKKyAgfQorICAvLy8gUmV0dXJucyBhIHJhbmdlIHRoYXQgaW5jbHVkZXMgYWxsIG9wZXJhbmRzIHRoYXQgYXJlIHJlZ2lzdGVyIHVzZXMuCisgIC8vLyBUaGlzIG1heSBpbmNsdWRlIHVucmVsYXRlZCBvcGVyYW5kcyB3aGljaCBhcmUgbm90IHJlZ2lzdGVyIHVzZXMuCisgIGl0ZXJhdG9yX3JhbmdlPG1vcF9pdGVyYXRvcj4gdXNlcygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShvcGVyYW5kc19iZWdpbigpICsgZ2V0RGVzYygpLmdldE51bURlZnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICBvcGVyYW5kc19lbmQoKSk7CisgIH0KKyAgLy8vIFxjb3B5ZG9jIHVzZXMoKQorICBpdGVyYXRvcl9yYW5nZTxjb25zdF9tb3BfaXRlcmF0b3I+IHVzZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2Uob3BlcmFuZHNfYmVnaW4oKSArIGdldERlc2MoKS5nZXROdW1EZWZzKCksCisgICAgICAgICAgICAgICAgICAgICAgb3BlcmFuZHNfZW5kKCkpOworICB9CisgIGl0ZXJhdG9yX3JhbmdlPG1vcF9pdGVyYXRvcj4gZXhwbGljaXRfdXNlcygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShvcGVyYW5kc19iZWdpbigpICsgZ2V0RGVzYygpLmdldE51bURlZnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICBvcGVyYW5kc19iZWdpbigpICsgZ2V0TnVtRXhwbGljaXRPcGVyYW5kcygpICk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfbW9wX2l0ZXJhdG9yPiBleHBsaWNpdF91c2VzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKG9wZXJhbmRzX2JlZ2luKCkgKyBnZXREZXNjKCkuZ2V0TnVtRGVmcygpLAorICAgICAgICAgICAgICAgICAgICAgIG9wZXJhbmRzX2JlZ2luKCkgKyBnZXROdW1FeHBsaWNpdE9wZXJhbmRzKCkgKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIG9wZXJhbmQgaXRlcmF0b3IgXHAgSSBwb2ludHMgdG8uCisgIHVuc2lnbmVkIGdldE9wZXJhbmRObyhjb25zdF9tb3BfaXRlcmF0b3IgSSkgY29uc3QgeworICAgIHJldHVybiBJIC0gb3BlcmFuZHNfYmVnaW4oKTsKKyAgfQorCisgIC8vLyBBY2Nlc3MgdG8gbWVtb3J5IG9wZXJhbmRzIG9mIHRoZSBpbnN0cnVjdGlvbgorICBtbW9faXRlcmF0b3IgbWVtb3BlcmFuZHNfYmVnaW4oKSBjb25zdCB7IHJldHVybiBNZW1SZWZzOyB9CisgIG1tb19pdGVyYXRvciBtZW1vcGVyYW5kc19lbmQoKSBjb25zdCB7IHJldHVybiBNZW1SZWZzICsgTnVtTWVtUmVmczsgfQorICAvLy8gUmV0dXJuIHRydWUgaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbWVtb3J5IG9wZXJhbmRzIHdoaWNoIGRlc2NyaWJlZCB0aGUKKyAgLy8vIG1lbW9yeSBhY2Nlc3MgZG9uZSBieSB0aGlzIGluc3RydWN0aW9uLiAgSWYgdGhpcyBpcyB0cnVlLCBjYWxsaW5nIGNvZGUKKyAgLy8vIG11c3QgYmUgY29uc2VydmF0aXZlLgorICBib29sIG1lbW9wZXJhbmRzX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gTnVtTWVtUmVmcyA9PSAwOyB9CisKKyAgaXRlcmF0b3JfcmFuZ2U8bW1vX2l0ZXJhdG9yPiAgbWVtb3BlcmFuZHMoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UobWVtb3BlcmFuZHNfYmVnaW4oKSwgbWVtb3BlcmFuZHNfZW5kKCkpOworICB9CisgIGl0ZXJhdG9yX3JhbmdlPG1tb19pdGVyYXRvcj4gbWVtb3BlcmFuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UobWVtb3BlcmFuZHNfYmVnaW4oKSwgbWVtb3BlcmFuZHNfZW5kKCkpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIGV4YWN0bHkgb25lIE1hY2hpbmVNZW1PcGVyYW5kLgorICBib29sIGhhc09uZU1lbU9wZXJhbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIE51bU1lbVJlZnMgPT0gMTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBtZW1vcnkgb3BlcmFuZHMuCisgIHVuc2lnbmVkIGdldE51bU1lbU9wZXJhbmRzKCkgY29uc3QgeyByZXR1cm4gTnVtTWVtUmVmczsgfQorCisgIC8vLyBBUEkgZm9yIHF1ZXJ5aW5nIE1hY2hpbmVJbnN0ciBwcm9wZXJ0aWVzLiBUaGV5IGFyZSB0aGUgc2FtZSBhcyBNQ0luc3RyRGVzYworICAvLy8gcXVlcmllcyBidXQgdGhleSBhcmUgYnVuZGxlIGF3YXJlLgorCisgIGVudW0gUXVlcnlUeXBlIHsKKyAgICBJZ25vcmVCdW5kbGUsICAgIC8vIElnbm9yZSBidW5kbGVzCisgICAgQW55SW5CdW5kbGUsICAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhbnkgaW5zdHJ1Y3Rpb24gaW4gYnVuZGxlIGhhcyBwcm9wZXJ0eQorICAgIEFsbEluQnVuZGxlICAgICAgLy8gUmV0dXJuIHRydWUgaWYgYWxsIGluc3RydWN0aW9ucyBpbiBidW5kbGUgaGF2ZSBwcm9wZXJ0eQorICB9OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gKG9yIGluIHRoZSBjYXNlIG9mIGEgYnVuZGxlLAorICAvLy8gdGhlIGluc3RydWN0aW9ucyBpbnNpZGUgdGhlIGJ1bmRsZSkgaGFzIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCisgIC8vLyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIHByb3BlcnR5IGJlaW5nIHF1ZXJpZWQuCisgIC8vLyBUaGUgc2Vjb25kIGFyZ3VtZW50IGluZGljYXRlcyB3aGV0aGVyIHRoZSBxdWVyeSBzaG91bGQgbG9vayBpbnNpZGUKKyAgLy8vIGluc3RydWN0aW9uIGJ1bmRsZXMuCisgIGJvb2wgaGFzUHJvcGVydHkodW5zaWduZWQgTUNGbGFnLCBRdWVyeVR5cGUgVHlwZSA9IEFueUluQnVuZGxlKSBjb25zdCB7CisgICAgLy8gSW5saW5lIHRoZSBmYXN0IHBhdGggZm9yIHVuYnVuZGxlZCBvciBidW5kbGUtaW50ZXJuYWwgaW5zdHJ1Y3Rpb25zLgorICAgIGlmIChUeXBlID09IElnbm9yZUJ1bmRsZSB8fCAhaXNCdW5kbGVkKCkgfHwgaXNCdW5kbGVkV2l0aFByZWQoKSkKKyAgICAgIHJldHVybiBnZXREZXNjKCkuZ2V0RmxhZ3MoKSAmICgxVUxMIDw8IE1DRmxhZyk7CisKKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpbiBhIGJ1bmRsZSwgdGFrZSB0aGUgc2xvdyBwYXRoLgorICAgIHJldHVybiBoYXNQcm9wZXJ0eUluQnVuZGxlKDFVTEwgPDwgTUNGbGFnLCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGNhbiBoYXZlIGEgdmFyaWFibGUgbnVtYmVyIG9mIG9wZXJhbmRzLgorICAvLy8gSW4gdGhpcyBjYXNlLCB0aGUgdmFyaWFibGUgb3BlcmFuZHMgd2lsbCBiZSBhZnRlciB0aGUgbm9ybWFsCisgIC8vLyBvcGVyYW5kcyBidXQgYmVmb3JlIHRoZSBpbXBsaWNpdCBkZWZpbml0aW9ucyBhbmQgdXNlcyAoaWYgYW55IGFyZQorICAvLy8gcHJlc2VudCkuCisgIGJvb2wgaXNWYXJpYWRpYyhRdWVyeVR5cGUgVHlwZSA9IElnbm9yZUJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpWYXJpYWRpYywgVHlwZSk7CisgIH0KKworICAvLy8gU2V0IGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIGFuIG9wdGlvbmFsIGRlZmluaXRpb24sIGUuZy4KKyAgLy8vIEFSTSBpbnN0cnVjdGlvbnMgd2hpY2ggY2FuIHNldCBjb25kaXRpb24gY29kZSBpZiAncycgYml0IGlzIHNldC4KKyAgYm9vbCBoYXNPcHRpb25hbERlZihRdWVyeVR5cGUgVHlwZSA9IElnbm9yZUJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpIYXNPcHRpb25hbERlZiwgVHlwZSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHBzZXVkbyBpbnN0cnVjdGlvbiB0aGF0IGRvZXNuJ3QKKyAgLy8vIGNvcnJlc3BvbmQgdG8gYSByZWFsIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uCisgIGJvb2wgaXNQc2V1ZG8oUXVlcnlUeXBlIFR5cGUgPSBJZ25vcmVCdW5kbGUpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzUHJvcGVydHkoTUNJRDo6UHNldWRvLCBUeXBlKTsKKyAgfQorCisgIGJvb2wgaXNSZXR1cm4oUXVlcnlUeXBlIFR5cGUgPSBBbnlJbkJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpSZXR1cm4sIFR5cGUpOworICB9CisKKyAgYm9vbCBpc0NhbGwoUXVlcnlUeXBlIFR5cGUgPSBBbnlJbkJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpDYWxsLCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBzdG9wcyBjb250cm9sIGZsb3cKKyAgLy8vIGZyb20gZXhlY3V0aW5nIHRoZSBpbnN0cnVjdGlvbiBpbW1lZGlhdGVseSBmb2xsb3dpbmcgaXQuICBFeGFtcGxlcyBpbmNsdWRlCisgIC8vLyB1bmNvbmRpdGlvbmFsIGJyYW5jaGVzIGFuZCByZXR1cm4gaW5zdHJ1Y3Rpb25zLgorICBib29sIGlzQmFycmllcihRdWVyeVR5cGUgVHlwZSA9IEFueUluQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6OkJhcnJpZXIsIFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIHBhcnQgb2YgdGhlIHRlcm1pbmF0b3IgZm9yIGEgYmFzaWMgYmxvY2suCisgIC8vLyBUeXBpY2FsbHkgdGhpcyBpcyB0aGluZ3MgbGlrZSByZXR1cm4gYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMuCisgIC8vLworICAvLy8gVmFyaW91cyBwYXNzZXMgdXNlIHRoaXMgdG8gaW5zZXJ0IGNvZGUgaW50byB0aGUgYm90dG9tIG9mIGEgYmFzaWMgYmxvY2ssCisgIC8vLyBidXQgYmVmb3JlIGNvbnRyb2wgZmxvdyBvY2N1cnMuCisgIGJvb2wgaXNUZXJtaW5hdG9yKFF1ZXJ5VHlwZSBUeXBlID0gQW55SW5CdW5kbGUpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzUHJvcGVydHkoTUNJRDo6VGVybWluYXRvciwgVHlwZSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBjb25kaXRpb25hbCwgdW5jb25kaXRpb25hbCwgb3IgaW5kaXJlY3QgYnJhbmNoLgorICAvLy8gUHJlZGljYXRlcyBiZWxvdyBjYW4gYmUgdXNlZCB0byBkaXNjcmltaW5hdGUgYmV0d2VlbgorICAvLy8gdGhlc2UgY2FzZXMsIGFuZCB0aGUgVGFyZ2V0SW5zdHJJbmZvOjpBbmFseXplQnJhbmNoIG1ldGhvZCBjYW4gYmUgdXNlZCB0bworICAvLy8gZ2V0IG1vcmUgaW5mb3JtYXRpb24uCisgIGJvb2wgaXNCcmFuY2goUXVlcnlUeXBlIFR5cGUgPSBBbnlJbkJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpCcmFuY2gsIFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gaW5kaXJlY3QgYnJhbmNoLCBzdWNoIGFzIGEKKyAgLy8vIGJyYW5jaCB0aHJvdWdoIGEgcmVnaXN0ZXIuCisgIGJvb2wgaXNJbmRpcmVjdEJyYW5jaChRdWVyeVR5cGUgVHlwZSA9IEFueUluQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6OkluZGlyZWN0QnJhbmNoLCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgYnJhbmNoIHdoaWNoIG1heSBmYWxsCisgIC8vLyB0aHJvdWdoIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uIG9yIG1heSB0cmFuc2ZlciBjb250cm9sIGZsb3cgdG8gc29tZSBvdGhlcgorICAvLy8gYmxvY2suICBUaGUgVGFyZ2V0SW5zdHJJbmZvOjpBbmFseXplQnJhbmNoIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBnZXQgbW9yZQorICAvLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBicmFuY2guCisgIGJvb2wgaXNDb25kaXRpb25hbEJyYW5jaChRdWVyeVR5cGUgVHlwZSA9IEFueUluQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQnJhbmNoKFR5cGUpICYgIWlzQmFycmllcihUeXBlKSAmICFpc0luZGlyZWN0QnJhbmNoKFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBicmFuY2ggd2hpY2ggYWx3YXlzCisgIC8vLyB0cmFuc2ZlcnMgY29udHJvbCBmbG93IHRvIHNvbWUgb3RoZXIgYmxvY2suICBUaGUKKyAgLy8vIFRhcmdldEluc3RySW5mbzo6QW5hbHl6ZUJyYW5jaCBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24KKyAgLy8vIGFib3V0IHRoaXMgYnJhbmNoLgorICBib29sIGlzVW5jb25kaXRpb25hbEJyYW5jaChRdWVyeVR5cGUgVHlwZSA9IEFueUluQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQnJhbmNoKFR5cGUpICYgaXNCYXJyaWVyKFR5cGUpICYgIWlzSW5kaXJlY3RCcmFuY2goVHlwZSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBoYXMgYSBwcmVkaWNhdGUgb3BlcmFuZCB0aGF0CisgIC8vLyBjb250cm9scyBleGVjdXRpb24uICBJdCBtYXkgYmUgc2V0IHRvICdhbHdheXMnLCBvciBtYXkgYmUgc2V0IHRvIG90aGVyCisgIC8vLyB2YWx1ZXMuICAgVGhlcmUgYXJlIHZhcmlvdXMgbWV0aG9kcyBpbiBUYXJnZXRJbnN0ckluZm8gdGhhdCBjYW4gYmUgdXNlZCB0bworICAvLy8gY29udHJvbCBhbmQgbW9kaWZ5IHRoZSBwcmVkaWNhdGUgaW4gdGhpcyBpbnN0cnVjdGlvbi4KKyAgYm9vbCBpc1ByZWRpY2FibGUoUXVlcnlUeXBlIFR5cGUgPSBBbGxJbkJ1bmRsZSkgY29uc3QgeworICAgIC8vIElmIGl0J3MgYSBidW5kbGUgdGhhbiBhbGwgYnVuZGxlZCBpbnN0cnVjdGlvbnMgbXVzdCBiZSBwcmVkaWNhYmxlIGZvciB0aGlzCisgICAgLy8gdG8gcmV0dXJuIHRydWUuCisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6OlByZWRpY2FibGUsIFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgYSBjb21wYXJpc29uLgorICBib29sIGlzQ29tcGFyZShRdWVyeVR5cGUgVHlwZSA9IElnbm9yZUJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpDb21wYXJlLCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGlzIGEgbW92ZSBpbW1lZGlhdGUKKyAgLy8vIChpbmNsdWRpbmcgY29uZGl0aW9uYWwgbW92ZXMpIGluc3RydWN0aW9uLgorICBib29sIGlzTW92ZUltbWVkaWF0ZShRdWVyeVR5cGUgVHlwZSA9IElnbm9yZUJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpNb3ZlSW1tLCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGlzIGEgYml0Y2FzdCBpbnN0cnVjdGlvbi4KKyAgYm9vbCBpc0JpdGNhc3QoUXVlcnlUeXBlIFR5cGUgPSBJZ25vcmVCdW5kbGUpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzUHJvcGVydHkoTUNJRDo6Qml0Y2FzdCwgVHlwZSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBhIHNlbGVjdCBpbnN0cnVjdGlvbi4KKyAgYm9vbCBpc1NlbGVjdChRdWVyeVR5cGUgVHlwZSA9IElnbm9yZUJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpTZWxlY3QsIFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gY2Fubm90IGJlIHNhZmVseSBkdXBsaWNhdGVkLgorICAvLy8gRm9yIGV4YW1wbGUsIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMgYSB1bmlxdWUgbGFiZWxzIGF0dGFjaGVkCisgIC8vLyB0byBpdCwgZHVwbGljYXRpbmcgaXQgd291bGQgY2F1c2UgbXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvcnMuCisgIGJvb2wgaXNOb3REdXBsaWNhYmxlKFF1ZXJ5VHlwZSBUeXBlID0gQW55SW5CdW5kbGUpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzUHJvcGVydHkoTUNJRDo6Tm90RHVwbGljYWJsZSwgVHlwZSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBjb252ZXJnZW50LgorICAvLy8gQ29udmVyZ2VudCBpbnN0cnVjdGlvbnMgY2FuIG5vdCBiZSBtYWRlIGNvbnRyb2wtZGVwZW5kZW50IG9uIGFueQorICAvLy8gYWRkaXRpb25hbCB2YWx1ZXMuCisgIGJvb2wgaXNDb252ZXJnZW50KFF1ZXJ5VHlwZSBUeXBlID0gQW55SW5CdW5kbGUpIGNvbnN0IHsKKyAgICBpZiAoaXNJbmxpbmVBc20oKSkgeworICAgICAgdW5zaWduZWQgRXh0cmFJbmZvID0gZ2V0T3BlcmFuZChJbmxpbmVBc206Ok1JT3BfRXh0cmFJbmZvKS5nZXRJbW0oKTsKKyAgICAgIGlmIChFeHRyYUluZm8gJiBJbmxpbmVBc206OkV4dHJhX0lzQ29udmVyZ2VudCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpDb252ZXJnZW50LCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBoYXMgYSBkZWxheSBzbG90CisgIC8vLyB3aGljaCBtdXN0IGJlIGZpbGxlZCBieSB0aGUgY29kZSBnZW5lcmF0b3IuCisgIGJvb2wgaGFzRGVsYXlTbG90KFF1ZXJ5VHlwZSBUeXBlID0gQW55SW5CdW5kbGUpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzUHJvcGVydHkoTUNJRDo6RGVsYXlTbG90LCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIGJlIGZvbGRlZCBhcworICAvLy8gbWVtb3J5IG9wZXJhbmRzIGluIG90aGVyIGluc3RydWN0aW9ucy4gVGhlIG1vc3QgY29tbW9uIHVzZSBmb3IgdGhpcworICAvLy8gaXMgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIHNpbXBsZSBsb2FkcyBmcm9tIG1lbW9yeSB0aGF0IGRvbid0IG1vZGlmeQorICAvLy8gdGhlIGxvYWRlZCB2YWx1ZSBpbiBhbnkgd2F5LCBidXQgaXQgY2FuIGFsc28gYmUgdXNlZCBmb3IgaW5zdHJ1Y3Rpb25zCisgIC8vLyB0aGF0IGNhbiBiZSBleHByZXNzZWQgYXMgY29uc3RhbnQtcG9vbCBsb2Fkcywgc3VjaCBhcyBWX1NFVEFMTE9ORVMKKyAgLy8vIG9uIHg4NiwgdG8gYWxsb3cgdGhlbSB0byBiZSBmb2xkZWQgd2hlbiBpdCBpcyBiZW5lZmljaWFsLgorICAvLy8gVGhpcyBzaG91bGQgb25seSBiZSBzZXQgb24gaW5zdHJ1Y3Rpb25zIHRoYXQgcmV0dXJuIGEgdmFsdWUgaW4gdGhlaXIKKyAgLy8vIG9ubHkgdmlydHVhbCByZWdpc3RlciBkZWZpbml0aW9uLgorICBib29sIGNhbkZvbGRBc0xvYWQoUXVlcnlUeXBlIFR5cGUgPSBJZ25vcmVCdW5kbGUpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzUHJvcGVydHkoTUNJRDo6Rm9sZGFibGVBc0xvYWQsIFR5cGUpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGJlaGF2ZXMKKyAgLy8vIHRoZSBzYW1lIHdheSBhcyB0aGUgZ2VuZXJpYyBSRUdfU0VRVUVOQ0UgaW5zdHJ1Y3Rpb25zLgorICAvLy8gRS5nLiwgb24gQVJNLAorICAvLy8gZFggVk1PVkRSUiByWSwgcloKKyAgLy8vIGlzIGVxdWl2YWxlbnQgdG8KKyAgLy8vIGRYID0gUkVHX1NFUVVFTkNFIHJZLCBzc3ViXzAsIHJaLCBzc3ViXzEuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IGZvciB0aGUgb3B0aW1pemVycyB0byBiZSBhYmxlIHRvIHRha2UgYWR2YW50YWdlIG9mCisgIC8vLyB0aGlzIHByb3BlcnR5LCBUYXJnZXRJbnN0ckluZm86OmdldFJlZ1NlcXVlbmNlTGlrZUlucHV0cyBoYXMgdG8gYmUKKyAgLy8vIG92ZXJyaWRlIGFjY29yZGluZ2x5LgorICBib29sIGlzUmVnU2VxdWVuY2VMaWtlKFF1ZXJ5VHlwZSBUeXBlID0gSWdub3JlQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6OlJlZ1NlcXVlbmNlLCBUeXBlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBiZWhhdmVzCisgIC8vLyB0aGUgc2FtZSB3YXkgYXMgdGhlIGdlbmVyaWMgRVhUUkFDVF9TVUJSRUcgaW5zdHJ1Y3Rpb25zLgorICAvLy8gRS5nLiwgb24gQVJNLAorICAvLy8gclgsIHJZIFZNT1ZSUkQgZFoKKyAgLy8vIGlzIGVxdWl2YWxlbnQgdG8gdHdvIEVYVFJBQ1RfU1VCUkVHOgorICAvLy8gclggPSBFWFRSQUNUX1NVQlJFRyBkWiwgc3N1Yl8wCisgIC8vLyByWSA9IEVYVFJBQ1RfU1VCUkVHIGRaLCBzc3ViXzEKKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgZm9yIHRoZSBvcHRpbWl6ZXJzIHRvIGJlIGFibGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YKKyAgLy8vIHRoaXMgcHJvcGVydHksIFRhcmdldEluc3RySW5mbzo6Z2V0RXh0cmFjdFN1YnJlZ0xpa2VJbnB1dHMgaGFzIHRvIGJlCisgIC8vLyBvdmVycmlkZSBhY2NvcmRpbmdseS4KKyAgYm9vbCBpc0V4dHJhY3RTdWJyZWdMaWtlKFF1ZXJ5VHlwZSBUeXBlID0gSWdub3JlQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6OkV4dHJhY3RTdWJyZWcsIFR5cGUpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGJlaGF2ZXMKKyAgLy8vIHRoZSBzYW1lIHdheSBhcyB0aGUgZ2VuZXJpYyBJTlNFUlRfU1VCUkVHIGluc3RydWN0aW9ucy4KKyAgLy8vIEUuZy4sIG9uIEFSTSwKKyAgLy8vIGRYID0gVlNFVExOaTMyIGRZLCByWiwgSW1tCisgIC8vLyBpcyBlcXVpdmFsZW50IHRvIGEgSU5TRVJUX1NVQlJFRzoKKyAgLy8vIGRYID0gSU5TRVJUX1NVQlJFRyBkWSwgclosIHRyYW5zbGF0ZUltbVRvU3ViSWR4KEltbSkKKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgZm9yIHRoZSBvcHRpbWl6ZXJzIHRvIGJlIGFibGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YKKyAgLy8vIHRoaXMgcHJvcGVydHksIFRhcmdldEluc3RySW5mbzo6Z2V0SW5zZXJ0U3VicmVnTGlrZUlucHV0cyBoYXMgdG8gYmUKKyAgLy8vIG92ZXJyaWRlIGFjY29yZGluZ2x5LgorICBib29sIGlzSW5zZXJ0U3VicmVnTGlrZShRdWVyeVR5cGUgVHlwZSA9IElnbm9yZUJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpJbnNlcnRTdWJyZWcsIFR5cGUpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFNpZGUgRWZmZWN0IEFuYWx5c2lzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGNvdWxkIHBvc3NpYmx5IHJlYWQgbWVtb3J5LgorICAvLy8gSW5zdHJ1Y3Rpb25zIHdpdGggdGhpcyBmbGFnIHNldCBhcmUgbm90IG5lY2Vzc2FyaWx5IHNpbXBsZSBsb2FkCisgIC8vLyBpbnN0cnVjdGlvbnMsIHRoZXkgbWF5IGxvYWQgYSB2YWx1ZSBhbmQgbW9kaWZ5IGl0LCBmb3IgZXhhbXBsZS4KKyAgYm9vbCBtYXlMb2FkKFF1ZXJ5VHlwZSBUeXBlID0gQW55SW5CdW5kbGUpIGNvbnN0IHsKKyAgICBpZiAoaXNJbmxpbmVBc20oKSkgeworICAgICAgdW5zaWduZWQgRXh0cmFJbmZvID0gZ2V0T3BlcmFuZChJbmxpbmVBc206Ok1JT3BfRXh0cmFJbmZvKS5nZXRJbW0oKTsKKyAgICAgIGlmIChFeHRyYUluZm8gJiBJbmxpbmVBc206OkV4dHJhX01heUxvYWQpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gaGFzUHJvcGVydHkoTUNJRDo6TWF5TG9hZCwgVHlwZSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBjb3VsZCBwb3NzaWJseSBtb2RpZnkgbWVtb3J5LgorICAvLy8gSW5zdHJ1Y3Rpb25zIHdpdGggdGhpcyBmbGFnIHNldCBhcmUgbm90IG5lY2Vzc2FyaWx5IHNpbXBsZSBzdG9yZQorICAvLy8gaW5zdHJ1Y3Rpb25zLCB0aGV5IG1heSBzdG9yZSBhIG1vZGlmaWVkIHZhbHVlIGJhc2VkIG9uIHRoZWlyIG9wZXJhbmRzLCBvcgorICAvLy8gbWF5IG5vdCBhY3R1YWxseSBtb2RpZnkgYW55dGhpbmcsIGZvciBleGFtcGxlLgorICBib29sIG1heVN0b3JlKFF1ZXJ5VHlwZSBUeXBlID0gQW55SW5CdW5kbGUpIGNvbnN0IHsKKyAgICBpZiAoaXNJbmxpbmVBc20oKSkgeworICAgICAgdW5zaWduZWQgRXh0cmFJbmZvID0gZ2V0T3BlcmFuZChJbmxpbmVBc206Ok1JT3BfRXh0cmFJbmZvKS5nZXRJbW0oKTsKKyAgICAgIGlmIChFeHRyYUluZm8gJiBJbmxpbmVBc206OkV4dHJhX01heVN0b3JlKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6Ok1heVN0b3JlLCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGNvdWxkIHBvc3NpYmx5IHJlYWQgb3IgbW9kaWZ5IG1lbW9yeS4KKyAgYm9vbCBtYXlMb2FkT3JTdG9yZShRdWVyeVR5cGUgVHlwZSA9IEFueUluQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIG1heUxvYWQoVHlwZSkgfHwgbWF5U3RvcmUoVHlwZSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gRmxhZ3MgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIGFuIGluc3RydWN0aW9uIGNhbiBiZSBtb2RpZmllZCBieSBhIG1ldGhvZC4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgbWF5IGJlIGEgMi0gb3IgMy1hZGRyZXNzCisgIC8vLyBpbnN0cnVjdGlvbiAob2YgdGhlIGZvcm0gIlggPSBvcCBZLCBaLCAuLi4iKSwgd2hpY2ggcHJvZHVjZXMgdGhlIHNhbWUKKyAgLy8vIHJlc3VsdCBpZiBZIGFuZCBaIGFyZSBleGNoYW5nZWQuICBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIHRoZQorICAvLy8gVGFyZ2V0SW5zdHJJbmZvOjpjb21tdXRlSW5zdHJ1Y3Rpb24gbWV0aG9kIG1heSBiZSB1c2VkIHRvIGhhY2sgb24gdGhlCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBmbGFnIG1heSBiZSBzZXQgb24gaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIG9ubHkgY29tbXV0YWJsZQorICAvLy8gc29tZXRpbWVzLiAgSW4gdGhlc2UgY2FzZXMsIHRoZSBjYWxsIHRvIGNvbW11dGVJbnN0cnVjdGlvbiB3aWxsIGZhaWwuCisgIC8vLyBBbHNvIG5vdGUgdGhhdCBzb21lIGluc3RydWN0aW9ucyByZXF1aXJlIG5vbi10cml2aWFsIG1vZGlmaWNhdGlvbiB0bworICAvLy8gY29tbXV0ZSB0aGVtLgorICBib29sIGlzQ29tbXV0YWJsZShRdWVyeVR5cGUgVHlwZSA9IElnbm9yZUJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpDb21tdXRhYmxlLCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgMi1hZGRyZXNzIGluc3RydWN0aW9uCisgIC8vLyB3aGljaCBjYW4gYmUgY2hhbmdlZCBpbnRvIGEgMy1hZGRyZXNzIGluc3RydWN0aW9uIGlmIG5lZWRlZC4gIERvaW5nIHRoaXMKKyAgLy8vIHRyYW5zZm9ybWF0aW9uIGNhbiBiZSBwcm9maXRhYmxlIGluIHRoZSByZWdpc3RlciBhbGxvY2F0b3IsIGJlY2F1c2UgaXQKKyAgLy8vIG1lYW5zIHRoYXQgdGhlIGluc3RydWN0aW9uIGNhbiB1c2UgYSAyLWFkZHJlc3MgZm9ybSBpZiBwb3NzaWJsZSwgYnV0CisgIC8vLyBkZWdyYWRlIGludG8gYSBsZXNzIGVmZmljaWVudCBmb3JtIGlmIHRoZSBzb3VyY2UgYW5kIGRlc3QgcmVnaXN0ZXIgY2Fubm90CisgIC8vLyBiZSBhc3NpZ25lZCB0byB0aGUgc2FtZSByZWdpc3Rlci4gIEZvciBleGFtcGxlLCB0aGlzIGFsbG93cyB0aGUgeDg2CisgIC8vLyBiYWNrZW5kIHRvIHR1cm4gYSAic2hsIHJlZywgMyIgaW5zdHJ1Y3Rpb24gaW50byBhbiBMRUEgaW5zdHJ1Y3Rpb24sIHdoaWNoCisgIC8vLyBpcyB0aGUgc2FtZSBzcGVlZCBhcyB0aGUgc2hpZnQgYnV0IGhhcyBiaWdnZXIgY29kZSBzaXplLgorICAvLy8KKyAgLy8vIElmIHRoaXMgcmV0dXJucyB0cnVlLCB0aGVuIHRoZSB0YXJnZXQgbXVzdCBpbXBsZW1lbnQgdGhlCisgIC8vLyBUYXJnZXRJbnN0ckluZm86OmNvbnZlcnRUb1RocmVlQWRkcmVzcyBtZXRob2QgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24sIHdoaWNoCisgIC8vLyBpcyBhbGxvd2VkIHRvIGZhaWwgaWYgdGhlIHRyYW5zZm9ybWF0aW9uIGlzbid0IHZhbGlkIGZvciB0aGlzIHNwZWNpZmljCisgIC8vLyBpbnN0cnVjdGlvbiAoZS5nLiBzaGwgcmVnLCA0IG9uIHg4NikuCisgIC8vLworICBib29sIGlzQ29udmVydGlibGVUbzNBZGRyKFF1ZXJ5VHlwZSBUeXBlID0gSWdub3JlQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6OkNvbnZlcnRpYmxlVG8zQWRkciwgVHlwZSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiByZXF1aXJlcworICAvLy8gY3VzdG9tIGluc2VydGlvbiBzdXBwb3J0IHdoZW4gdGhlIERBRyBzY2hlZHVsZXIgaXMgaW5zZXJ0aW5nIGl0IGludG8gYQorICAvLy8gbWFjaGluZSBiYXNpYyBibG9jay4gIElmIHRoaXMgaXMgdHJ1ZSBmb3IgdGhlIGluc3RydWN0aW9uLCBpdCBiYXNpY2FsbHkKKyAgLy8vIG1lYW5zIHRoYXQgaXQgaXMgYSBwc2V1ZG8gaW5zdHJ1Y3Rpb24gdXNlZCBhdCBTZWxlY3Rpb25EQUcgdGltZSB0aGF0IGlzCisgIC8vLyBleHBhbmRlZCBvdXQgaW50byBtYWdpYyBjb2RlIGJ5IHRoZSB0YXJnZXQgd2hlbiBNYWNoaW5lSW5zdHJzIGFyZSBmb3JtZWQuCisgIC8vLworICAvLy8gSWYgdGhpcyBpcyB0cnVlLCB0aGUgVGFyZ2V0TG93ZXJpbmdJbmZvOjpJbnNlcnRBdEVuZE9mQmFzaWNCbG9jayBtZXRob2QKKyAgLy8vIGlzIHVzZWQgdG8gaW5zZXJ0IHRoaXMgaW50byB0aGUgTWFjaGluZUJhc2ljQmxvY2suCisgIGJvb2wgdXNlc0N1c3RvbUluc2VydGlvbkhvb2soUXVlcnlUeXBlIFR5cGUgPSBJZ25vcmVCdW5kbGUpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzUHJvcGVydHkoTUNJRDo6VXNlc0N1c3RvbUluc2VydGVyLCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIHJlcXVpcmVzICphZGp1c3RtZW50KgorICAvLy8gYWZ0ZXIgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIGJ5IGNhbGxpbmcgYSB0YXJnZXQgaG9vay4gRm9yIGV4YW1wbGUsIHRoaXMKKyAgLy8vIGNhbiBiZSB1c2VkIHRvIGZpbGwgaW4gQVJNICdzJyBvcHRpb25hbCBvcGVyYW5kIGRlcGVuZGluZyBvbiB3aGV0aGVyCisgIC8vLyB0aGUgY29uZGl0aW9uYWwgZmxhZyByZWdpc3RlciBpcyB1c2VkLgorICBib29sIGhhc1Bvc3RJU2VsSG9vayhRdWVyeVR5cGUgVHlwZSA9IElnbm9yZUJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpIYXNQb3N0SVNlbEhvb2ssIFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGlzIGEgY2FuZGlkYXRlIGZvciByZW1hdC4KKyAgLy8vIFRoaXMgZmxhZyBpcyBkZXByZWNhdGVkLCBwbGVhc2UgZG9uJ3QgdXNlIGl0IGFueW1vcmUuICBJZiB0aGlzCisgIC8vLyBmbGFnIGlzIHNldCwgdGhlIGlzUmVhbGx5VHJpdmlhbGx5UmVNYXRlcmlhbGl6YWJsZSgpIG1ldGhvZCBpcyBjYWxsZWQgdG8KKyAgLy8vIHZlcmlmeSB0aGUgaW5zdHJ1Y3Rpb24gaXMgcmVhbGx5IHJlbWF0YWJsZS4KKyAgYm9vbCBpc1JlbWF0ZXJpYWxpemFibGUoUXVlcnlUeXBlIFR5cGUgPSBBbGxJbkJ1bmRsZSkgY29uc3QgeworICAgIC8vIEl0J3Mgb25seSBwb3NzaWJsZSB0byByZS1tYXQgYSBidW5kbGUgaWYgYWxsIGJ1bmRsZWQgaW5zdHJ1Y3Rpb25zIGFyZQorICAgIC8vIHJlLW1hdGVyaWFsaXphYmxlLgorICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpSZW1hdGVyaWFsaXphYmxlLCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBoYXMgdGhlIHNhbWUgY29zdCAob3IgbGVzcykgdGhhbiBhIG1vdmUKKyAgLy8vIGluc3RydWN0aW9uLiBUaGlzIGlzIHVzZWZ1bCBkdXJpbmcgY2VydGFpbiB0eXBlcyBvZiBvcHRpbWl6YXRpb25zCisgIC8vLyAoZS5nLiwgcmVtYXQgZHVyaW5nIHR3by1hZGRyZXNzIGNvbnZlcnNpb24gb3IgbWFjaGluZSBsaWNtKQorICAvLy8gd2hlcmUgd2Ugd291bGQgbGlrZSB0byByZW1hdCBvciBob2lzdCB0aGUgaW5zdHJ1Y3Rpb24sIGJ1dCBub3QgaWYgaXQgY29zdHMKKyAgLy8vIG1vcmUgdGhhbiBtb3ZpbmcgdGhlIGluc3RydWN0aW9uIGludG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyLiBOb3RlLCB3ZQorICAvLy8gYXJlIG5vdCBtYXJraW5nIGNvcGllcyBmcm9tIGFuZCB0byB0aGUgc2FtZSByZWdpc3RlciBjbGFzcyB3aXRoIHRoaXMgZmxhZy4KKyAgYm9vbCBpc0FzQ2hlYXBBc0FNb3ZlKFF1ZXJ5VHlwZSBUeXBlID0gQWxsSW5CdW5kbGUpIGNvbnN0IHsKKyAgICAvLyBPbmx5IHJldHVybnMgdHJ1ZSBmb3IgYSBidW5kbGUgaWYgYWxsIGJ1bmRsZWQgaW5zdHJ1Y3Rpb25zIGFyZSBjaGVhcC4KKyAgICByZXR1cm4gaGFzUHJvcGVydHkoTUNJRDo6Q2hlYXBBc0FNb3ZlLCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBzb3VyY2Ugb3BlcmFuZHMKKyAgLy8vIGhhdmUgc3BlY2lhbCByZWdpc3RlciBhbGxvY2F0aW9uIHJlcXVpcmVtZW50cyB0aGF0IGFyZSBub3QgY2FwdHVyZWQgYnkgdGhlCisgIC8vLyBvcGVyYW5kIHJlZ2lzdGVyIGNsYXNzZXMuIGUuZy4gQVJNOjpTVFJEJ3MgdHdvIHNvdXJjZSByZWdpc3RlcnMgbXVzdCBiZSBhbgorICAvLy8gZXZlbiAvIG9kZCBwYWlyLCBBUk06OlNUTSByZWdpc3RlcnMgaGF2ZSB0byBiZSBpbiBhc2NlbmRpbmcgb3JkZXIuCisgIC8vLyBQb3N0LXJlZ2lzdGVyIGFsbG9jYXRpb24gcGFzc2VzIHNob3VsZCBub3QgYXR0ZW1wdCB0byBjaGFuZ2UgYWxsb2NhdGlvbnMKKyAgLy8vIGZvciBzb3VyY2VzIG9mIGluc3RydWN0aW9ucyB3aXRoIHRoaXMgZmxhZy4KKyAgYm9vbCBoYXNFeHRyYVNyY1JlZ0FsbG9jUmVxKFF1ZXJ5VHlwZSBUeXBlID0gQW55SW5CdW5kbGUpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzUHJvcGVydHkoTUNJRDo6RXh0cmFTcmNSZWdBbGxvY1JlcSwgVHlwZSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gZGVmIG9wZXJhbmRzCisgIC8vLyBoYXZlIHNwZWNpYWwgcmVnaXN0ZXIgYWxsb2NhdGlvbiByZXF1aXJlbWVudHMgdGhhdCBhcmUgbm90IGNhcHR1cmVkIGJ5IHRoZQorICAvLy8gb3BlcmFuZCByZWdpc3RlciBjbGFzc2VzLiBlLmcuIEFSTTo6TERSRCdzIHR3byBkZWYgcmVnaXN0ZXJzIG11c3QgYmUgYW4KKyAgLy8vIGV2ZW4gLyBvZGQgcGFpciwgQVJNOjpMRE0gcmVnaXN0ZXJzIGhhdmUgdG8gYmUgaW4gYXNjZW5kaW5nIG9yZGVyLgorICAvLy8gUG9zdC1yZWdpc3RlciBhbGxvY2F0aW9uIHBhc3NlcyBzaG91bGQgbm90IGF0dGVtcHQgdG8gY2hhbmdlIGFsbG9jYXRpb25zCisgIC8vLyBmb3IgZGVmaW5pdGlvbnMgb2YgaW5zdHJ1Y3Rpb25zIHdpdGggdGhpcyBmbGFnLgorICBib29sIGhhc0V4dHJhRGVmUmVnQWxsb2NSZXEoUXVlcnlUeXBlIFR5cGUgPSBBbnlJbkJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpFeHRyYURlZlJlZ0FsbG9jUmVxLCBUeXBlKTsKKyAgfQorCisgIGVudW0gTUlDaGVja1R5cGUgeworICAgIENoZWNrRGVmcywgICAgICAvLyBDaGVjayBhbGwgb3BlcmFuZHMgZm9yIGVxdWFsaXR5CisgICAgQ2hlY2tLaWxsRGVhZCwgIC8vIENoZWNrIGFsbCBvcGVyYW5kcyBpbmNsdWRpbmcga2lsbCAvIGRlYWQgbWFya2VycworICAgIElnbm9yZURlZnMsICAgICAvLyBJZ25vcmUgYWxsIGRlZmluaXRpb25zCisgICAgSWdub3JlVlJlZ0RlZnMgIC8vIElnbm9yZSB2aXJ0dWFsIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgIH07CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgaWRlbnRpY2FsIHRvIFxwIE90aGVyLgorICAvLy8gVHdvIGluc3RydWN0aW9ucyBhcmUgaWRlbnRpY2FsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBvcGNvZGUgYW5kIGFsbCB0aGVpcgorICAvLy8gb3BlcmFuZHMgYXJlIGlkZW50aWNhbCAod2l0aCByZXNwZWN0IHRvIE1hY2hpbmVPcGVyYW5kOjppc0lkZW50aWNhbFRvKCkpLgorICAvLy8gTm90ZSB0aGF0IHRoaXMgbWVhbnMgbGl2ZW5lc3MgcmVsYXRlZCBmbGFncyAoZGVhZCwgdW5kZWYsIGtpbGwpIGRvIG5vdAorICAvLy8gYWZmZWN0IHRoZSBub3Rpb24gb2YgaWRlbnRpY2FsLgorICBib29sIGlzSWRlbnRpY2FsVG8oY29uc3QgTWFjaGluZUluc3RyICZPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgIE1JQ2hlY2tUeXBlIENoZWNrID0gQ2hlY2tEZWZzKSBjb25zdDsKKworICAvLy8gVW5saW5rICd0aGlzJyBmcm9tIHRoZSBjb250YWluaW5nIGJhc2ljIGJsb2NrLCBhbmQgcmV0dXJuIGl0IHdpdGhvdXQKKyAgLy8vIGRlbGV0aW5nIGl0LgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gY2FuIG5vdCBiZSB1c2VkIG9uIGJ1bmRsZWQgaW5zdHJ1Y3Rpb25zLCB1c2UKKyAgLy8vIHJlbW92ZUZyb21CdW5kbGUoKSB0byByZW1vdmUgaW5kaXZpZHVhbCBpbnN0cnVjdGlvbnMgZnJvbSBhIGJ1bmRsZS4KKyAgTWFjaGluZUluc3RyICpyZW1vdmVGcm9tUGFyZW50KCk7CisKKyAgLy8vIFVubGluayB0aGlzIGluc3RydWN0aW9uIGZyb20gaXRzIGJhc2ljIGJsb2NrIGFuZCByZXR1cm4gaXQgd2l0aG91dAorICAvLy8gZGVsZXRpbmcgaXQuCisgIC8vLworICAvLy8gSWYgdGhlIGluc3RydWN0aW9uIGlzIHBhcnQgb2YgYSBidW5kbGUsIHRoZSBvdGhlciBpbnN0cnVjdGlvbnMgaW4gdGhlCisgIC8vLyBidW5kbGUgcmVtYWluIGJ1bmRsZWQuCisgIE1hY2hpbmVJbnN0ciAqcmVtb3ZlRnJvbUJ1bmRsZSgpOworCisgIC8vLyBVbmxpbmsgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgYmFzaWMgYmxvY2sgYW5kIGRlbGV0ZSBpdC4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIGluc3RydWN0aW9uIGlzIHRoZSBoZWFkZXIgb2YgYSBidW5kbGUsIHRoZSB3aG9sZSBidW5kbGUgaXMgZXJhc2VkLgorICAvLy8gVGhpcyBmdW5jdGlvbiBjYW4gbm90IGJlIHVzZWQgZm9yIGluc3RydWN0aW9ucyBpbnNpZGUgYSBidW5kbGUsIHVzZQorICAvLy8gZXJhc2VGcm9tQnVuZGxlKCkgdG8gZXJhc2UgaW5kaXZpZHVhbCBidW5kbGVkIGluc3RydWN0aW9ucy4KKyAgdm9pZCBlcmFzZUZyb21QYXJlbnQoKTsKKworICAvLy8gVW5saW5rICd0aGlzJyBmcm9tIHRoZSBjb250YWluaW5nIGJhc2ljIGJsb2NrIGFuZCBkZWxldGUgaXQuCisgIC8vLworICAvLy8gRm9yIGFsbCBkZWZpbml0aW9ucyBtYXJrIHRoZWlyIHVzZXMgaW4gREJHX1ZBTFVFIG5vZGVzCisgIC8vLyBhcyB1bmRlZmluZWQuIE90aGVyd2lzZSBsaWtlIGVyYXNlRnJvbVBhcmVudCgpLgorICB2b2lkIGVyYXNlRnJvbVBhcmVudEFuZE1hcmtEQkdWYWx1ZXNGb3JSZW1vdmFsKCk7CisKKyAgLy8vIFVubGluayAndGhpcycgZm9ybSBpdHMgYmFzaWMgYmxvY2sgYW5kIGRlbGV0ZSBpdC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgcGFydCBvZiBhIGJ1bmRsZSwgdGhlIG90aGVyIGluc3RydWN0aW9ucyBpbiB0aGUKKyAgLy8vIGJ1bmRsZSByZW1haW4gYnVuZGxlZC4KKyAgdm9pZCBlcmFzZUZyb21CdW5kbGUoKTsKKworICBib29sIGlzRUhMYWJlbCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6RUhfTEFCRUw7IH0KKyAgYm9vbCBpc0dDTGFiZWwoKSBjb25zdCB7IHJldHVybiBnZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OkdDX0xBQkVMOyB9CisgIGJvb2wgaXNBbm5vdGF0aW9uTGFiZWwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6QU5OT1RBVElPTl9MQUJFTDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIE1hY2hpbmVJbnN0ciByZXByZXNlbnRzIGEgbGFiZWwuCisgIGJvb2wgaXNMYWJlbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNFSExhYmVsKCkgfHwgaXNHQ0xhYmVsKCkgfHwgaXNBbm5vdGF0aW9uTGFiZWwoKTsKKyAgfQorCisgIGJvb2wgaXNDRklJbnN0cnVjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpDRklfSU5TVFJVQ1RJT047CisgIH0KKworICAvLyBUcnVlIGlmIHRoZSBpbnN0cnVjdGlvbiByZXByZXNlbnRzIGEgcG9zaXRpb24gaW4gdGhlIGZ1bmN0aW9uLgorICBib29sIGlzUG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBpc0xhYmVsKCkgfHwgaXNDRklJbnN0cnVjdGlvbigpOyB9CisKKyAgYm9vbCBpc0RlYnVnVmFsdWUoKSBjb25zdCB7IHJldHVybiBnZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OkRCR19WQUxVRTsgfQorCisgIC8vLyBBIERCR19WQUxVRSBpcyBpbmRpcmVjdCBpZmYgdGhlIGZpcnN0IG9wZXJhbmQgaXMgYSByZWdpc3RlciBhbmQKKyAgLy8vIHRoZSBzZWNvbmQgb3BlcmFuZCBpcyBhbiBpbW1lZGlhdGUuCisgIGJvb2wgaXNJbmRpcmVjdERlYnVnVmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRGVidWdWYWx1ZSgpCisgICAgICAmJiBnZXRPcGVyYW5kKDApLmlzUmVnKCkKKyAgICAgICYmIGdldE9wZXJhbmQoMSkuaXNJbW0oKTsKKyAgfQorCisgIGJvb2wgaXNQSEkoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6UEhJIHx8CisgICAgICAgICAgIGdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6R19QSEk7CisgIH0KKyAgYm9vbCBpc0tpbGwoKSBjb25zdCB7IHJldHVybiBnZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OktJTEw7IH0KKyAgYm9vbCBpc0ltcGxpY2l0RGVmKCkgY29uc3QgeyByZXR1cm4gZ2V0T3Bjb2RlKCk9PVRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGOyB9CisgIGJvb2wgaXNJbmxpbmVBc20oKSBjb25zdCB7IHJldHVybiBnZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OklOTElORUFTTTsgfQorCisgIGJvb2wgaXNNU0lubGluZUFzbSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpJTkxJTkVBU00gJiYgZ2V0SW5saW5lQXNtRGlhbGVjdCgpOworICB9CisKKyAgYm9vbCBpc1N0YWNrQWxpZ25pbmdJbmxpbmVBc20oKSBjb25zdDsKKyAgSW5saW5lQXNtOjpBc21EaWFsZWN0IGdldElubGluZUFzbURpYWxlY3QoKSBjb25zdDsKKworICBib29sIGlzSW5zZXJ0U3VicmVnKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OklOU0VSVF9TVUJSRUc7CisgIH0KKworICBib29sIGlzU3VicmVnVG9SZWcoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6U1VCUkVHX1RPX1JFRzsKKyAgfQorCisgIGJvb2wgaXNSZWdTZXF1ZW5jZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpSRUdfU0VRVUVOQ0U7CisgIH0KKworICBib29sIGlzQnVuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OkJVTkRMRTsKKyAgfQorCisgIGJvb2wgaXNDb3B5KCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OkNPUFk7CisgIH0KKworICBib29sIGlzRnVsbENvcHkoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQ29weSgpICYmICFnZXRPcGVyYW5kKDApLmdldFN1YlJlZygpICYmICFnZXRPcGVyYW5kKDEpLmdldFN1YlJlZygpOworICB9CisKKyAgYm9vbCBpc0V4dHJhY3RTdWJyZWcoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6RVhUUkFDVF9TVUJSRUc7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGJlaGF2ZXMgbGlrZSBhIGNvcHkuCisgIC8vLyBUaGlzIGRvZXMgbm90IGluY2x1ZGUgbmF0aXZlIGNvcHkgaW5zdHJ1Y3Rpb25zLgorICBib29sIGlzQ29weUxpa2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQ29weSgpIHx8IGlzU3VicmVnVG9SZWcoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpcyB0aGUgaW5zdHJ1Y3Rpb24gaXMgYW4gaWRlbnRpdHkgY29weS4KKyAgYm9vbCBpc0lkZW50aXR5Q29weSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNDb3B5KCkgJiYgZ2V0T3BlcmFuZCgwKS5nZXRSZWcoKSA9PSBnZXRPcGVyYW5kKDEpLmdldFJlZygpICYmCisgICAgICBnZXRPcGVyYW5kKDApLmdldFN1YlJlZygpID09IGdldE9wZXJhbmQoMSkuZ2V0U3ViUmVnKCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBkb2Vzbid0IHByb2R1Y2UgYW55IG91dHB1dCBpbiB0aGUgZm9ybSBvZgorICAvLy8gZXhlY3V0YWJsZSBpbnN0cnVjdGlvbnMuCisgIGJvb2wgaXNNZXRhSW5zdHJ1Y3Rpb24oKSBjb25zdCB7CisgICAgc3dpdGNoIChnZXRPcGNvZGUoKSkgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBUYXJnZXRPcGNvZGU6OklNUExJQ0lUX0RFRjoKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6S0lMTDoKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6Q0ZJX0lOU1RSVUNUSU9OOgorICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpFSF9MQUJFTDoKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6R0NfTEFCRUw6CisgICAgY2FzZSBUYXJnZXRPcGNvZGU6OkRCR19WQUxVRToKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6TElGRVRJTUVfU1RBUlQ6CisgICAgY2FzZSBUYXJnZXRPcGNvZGU6OkxJRkVUSU1FX0VORDoKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgdHJhbnNpZW50IGluc3RydWN0aW9uIHRoYXQgaXMgZWl0aGVyIHZlcnkgbGlrZWx5CisgIC8vLyB0byBiZSBlbGltaW5hdGVkIGR1cmluZyByZWdpc3RlciBhbGxvY2F0aW9uIChzdWNoIGFzIGNvcHktbGlrZQorICAvLy8gaW5zdHJ1Y3Rpb25zKSwgb3IgaWYgdGhpcyBpbnN0cnVjdGlvbiBkb2Vzbid0IGhhdmUgYW4gZXhlY3V0aW9uLXRpbWUgY29zdC4KKyAgYm9vbCBpc1RyYW5zaWVudCgpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKGdldE9wY29kZSgpKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBpc01ldGFJbnN0cnVjdGlvbigpOworICAgIC8vIENvcHktbGlrZSBpbnN0cnVjdGlvbnMgYXJlIHVzdWFsbHkgZWxpbWluYXRlZCBkdXJpbmcgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKyAgICBjYXNlIFRhcmdldE9wY29kZTo6UEhJOgorICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpHX1BISToKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6Q09QWToKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6SU5TRVJUX1NVQlJFRzoKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6U1VCUkVHX1RPX1JFRzoKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6UkVHX1NFUVVFTkNFOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbnNpZGUgdGhlIE1JIGJ1bmRsZSwgZXhjbHVkaW5nIHRoZQorICAvLy8gYnVuZGxlIGhlYWRlci4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yCisgIC8vLyBza2lwcywgMCBmb3IgdW5idW5kbGVkIGluc3RydWN0aW9ucy4KKyAgdW5zaWduZWQgZ2V0QnVuZGxlU2l6ZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgTWFjaGluZUluc3RyIHJlYWRzIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIuCisgIC8vLyBJZiBUYXJnZXRSZWdpc3RlckluZm8gaXMgcGFzc2VkLCB0aGVuIGl0IGFsc28gY2hlY2tzIGlmIHRoZXJlCisgIC8vLyBpcyBhIHJlYWQgb2YgYSBzdXBlci1yZWdpc3Rlci4KKyAgLy8vIFRoaXMgZG9lcyBub3QgY291bnQgcGFydGlhbCByZWRlZmluZXMgb2YgdmlydHVhbCByZWdpc3RlcnMgYXMgcmVhZHM6CisgIC8vLyAgICVyZWcxMDI0OjYgPSBPUC4KKyAgYm9vbCByZWFkc1JlZ2lzdGVyKHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gbnVsbHB0cikgY29uc3QgeworICAgIHJldHVybiBmaW5kUmVnaXN0ZXJVc2VPcGVyYW5kSWR4KFJlZywgZmFsc2UsIFRSSSkgIT0gLTE7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIE1hY2hpbmVJbnN0ciByZWFkcyB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIuCisgIC8vLyBUYWtlIGludG8gYWNjb3VudCB0aGF0IGEgcGFydGlhbCBkZWZpbmUgaXMgYQorICAvLy8gcmVhZC1tb2RpZnktd3JpdGUgb3BlcmF0aW9uLgorICBib29sIHJlYWRzVmlydHVhbFJlZ2lzdGVyKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiByZWFkc1dyaXRlc1ZpcnR1YWxSZWdpc3RlcihSZWcpLmZpcnN0OworICB9CisKKyAgLy8vIFJldHVybiBhIHBhaXIgb2YgYm9vbHMgKHJlYWRzLCB3cml0ZXMpIGluZGljYXRpbmcgaWYgdGhpcyBpbnN0cnVjdGlvbgorICAvLy8gcmVhZHMgb3Igd3JpdGVzIFJlZy4gVGhpcyBhbHNvIGNvbnNpZGVycyBwYXJ0aWFsIGRlZmluZXMuCisgIC8vLyBJZiBPcHMgaXMgbm90IG51bGwsIGFsbCBvcGVyYW5kIGluZGljZXMgZm9yIFJlZyBhcmUgYWRkZWQuCisgIHN0ZDo6cGFpcjxib29sLGJvb2w+IHJlYWRzV3JpdGVzVmlydHVhbFJlZ2lzdGVyKHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAqT3BzID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBNYWNoaW5lSW5zdHIga2lsbHMgdGhlIHNwZWNpZmllZCByZWdpc3Rlci4KKyAgLy8vIElmIFRhcmdldFJlZ2lzdGVySW5mbyBpcyBwYXNzZWQsIHRoZW4gaXQgYWxzbyBjaGVja3MgaWYgdGhlcmUgaXMKKyAgLy8vIGEga2lsbCBvZiBhIHN1cGVyLXJlZ2lzdGVyLgorICBib29sIGtpbGxzUmVnaXN0ZXIodW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyKSBjb25zdCB7CisgICAgcmV0dXJuIGZpbmRSZWdpc3RlclVzZU9wZXJhbmRJZHgoUmVnLCB0cnVlLCBUUkkpICE9IC0xOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBNYWNoaW5lSW5zdHIgZnVsbHkgZGVmaW5lcyB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLgorICAvLy8gSWYgVGFyZ2V0UmVnaXN0ZXJJbmZvIGlzIHBhc3NlZCwgdGhlbiBpdCBhbHNvIGNoZWNrcworICAvLy8gaWYgdGhlcmUgaXMgYSBkZWYgb2YgYSBzdXBlci1yZWdpc3Rlci4KKyAgLy8vIE5PVEU6IEl0J3MgaWdub3Jpbmcgc3VicmVnIGluZGljZXMgb24gdmlydHVhbCByZWdpc3RlcnMuCisgIGJvb2wgZGVmaW5lc1JlZ2lzdGVyKHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyKSBjb25zdCB7CisgICAgcmV0dXJuIGZpbmRSZWdpc3RlckRlZk9wZXJhbmRJZHgoUmVnLCBmYWxzZSwgZmFsc2UsIFRSSSkgIT0gLTE7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIE1hY2hpbmVJbnN0ciBtb2RpZmllcyAoZnVsbHkgZGVmaW5lIG9yIHBhcnRpYWxseQorICAvLy8gZGVmaW5lKSB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLgorICAvLy8gTk9URTogSXQncyBpZ25vcmluZyBzdWJyZWcgaW5kaWNlcyBvbiB2aXJ0dWFsIHJlZ2lzdGVycy4KKyAgYm9vbCBtb2RpZmllc1JlZ2lzdGVyKHVuc2lnbmVkIFJlZywgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmluZFJlZ2lzdGVyRGVmT3BlcmFuZElkeChSZWcsIGZhbHNlLCB0cnVlLCBUUkkpICE9IC0xOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVnaXN0ZXIgaXMgZGVhZCBpbiB0aGlzIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uCisgIC8vLyBJZiBUYXJnZXRSZWdpc3RlckluZm8gaXMgcGFzc2VkLCB0aGVuIGl0IGFsc28gY2hlY2tzCisgIC8vLyBpZiB0aGVyZSBpcyBhIGRlYWQgZGVmIG9mIGEgc3VwZXItcmVnaXN0ZXIuCisgIGJvb2wgcmVnaXN0ZXJEZWZJc0RlYWQodW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gbnVsbHB0cikgY29uc3QgeworICAgIHJldHVybiBmaW5kUmVnaXN0ZXJEZWZPcGVyYW5kSWR4KFJlZywgdHJ1ZSwgZmFsc2UsIFRSSSkgIT0gLTE7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBNYWNoaW5lSW5zdHIgaGFzIGFuIGltcGxpY2l0LXVzZSBvcGVyYW5kIG9mIGV4YWN0bHkKKyAgLy8vIHRoZSBnaXZlbiByZWdpc3RlciAobm90IGNvbnNpZGVyaW5nIHN1Yi9zdXBlci1yZWdpc3RlcnMpLgorICBib29sIGhhc1JlZ2lzdGVySW1wbGljaXRVc2VPcGVyYW5kKHVuc2lnbmVkIFJlZykgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIG9wZXJhbmQgaW5kZXggdGhhdCBpcyBhIHVzZSBvZiB0aGUgc3BlY2lmaWMgcmVnaXN0ZXIgb3IgLTEKKyAgLy8vIGlmIGl0IGlzIG5vdCBmb3VuZC4gSXQgZnVydGhlciB0aWdodGVucyB0aGUgc2VhcmNoIGNyaXRlcmlhIHRvIGEgdXNlCisgIC8vLyB0aGF0IGtpbGxzIHRoZSByZWdpc3RlciBpZiBpc0tpbGwgaXMgdHJ1ZS4KKyAgaW50IGZpbmRSZWdpc3RlclVzZU9wZXJhbmRJZHgodW5zaWduZWQgUmVnLCBib29sIGlzS2lsbCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBXcmFwcGVyIGZvciBmaW5kUmVnaXN0ZXJVc2VPcGVyYW5kSWR4LCBpdCByZXR1cm5zCisgIC8vLyBhIHBvaW50ZXIgdG8gdGhlIE1hY2hpbmVPcGVyYW5kIHJhdGhlciB0aGFuIGFuIGluZGV4LgorICBNYWNoaW5lT3BlcmFuZCAqZmluZFJlZ2lzdGVyVXNlT3BlcmFuZCh1bnNpZ25lZCBSZWcsIGJvb2wgaXNLaWxsID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gbnVsbHB0cikgeworICAgIGludCBJZHggPSBmaW5kUmVnaXN0ZXJVc2VPcGVyYW5kSWR4KFJlZywgaXNLaWxsLCBUUkkpOworICAgIHJldHVybiAoSWR4ID09IC0xKSA/IG51bGxwdHIgOiAmZ2V0T3BlcmFuZChJZHgpOworICB9CisKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgKmZpbmRSZWdpc3RlclVzZU9wZXJhbmQoCisgICAgdW5zaWduZWQgUmVnLCBib29sIGlzS2lsbCA9IGZhbHNlLAorICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gbnVsbHB0cikgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PE1hY2hpbmVJbnN0ciAqPih0aGlzKS0+CisgICAgICBmaW5kUmVnaXN0ZXJVc2VPcGVyYW5kKFJlZywgaXNLaWxsLCBUUkkpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG9wZXJhbmQgaW5kZXggdGhhdCBpcyBhIGRlZiBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIG9yCisgIC8vLyAtMSBpZiBpdCBpcyBub3QgZm91bmQuIElmIGlzRGVhZCBpcyB0cnVlLCBkZWZzIHRoYXQgYXJlIG5vdCBkZWFkIGFyZQorICAvLy8gc2tpcHBlZC4gSWYgT3ZlcmxhcCBpcyB0cnVlLCB0aGVuIGl0IGFsc28gbG9va3MgZm9yIGRlZnMgdGhhdCBtZXJlbHkKKyAgLy8vIG92ZXJsYXAgdGhlIHNwZWNpZmllZCByZWdpc3Rlci4gSWYgVGFyZ2V0UmVnaXN0ZXJJbmZvIGlzIG5vbi1udWxsLAorICAvLy8gdGhlbiBpdCBhbHNvIGNoZWNrcyBpZiB0aGVyZSBpcyBhIGRlZiBvZiBhIHN1cGVyLXJlZ2lzdGVyLgorICAvLy8gVGhpcyBtYXkgYWxzbyByZXR1cm4gYSByZWdpc3RlciBtYXNrIG9wZXJhbmQgd2hlbiBPdmVybGFwIGlzIHRydWUuCisgIGludCBmaW5kUmVnaXN0ZXJEZWZPcGVyYW5kSWR4KHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RlYWQgPSBmYWxzZSwgYm9vbCBPdmVybGFwID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFdyYXBwZXIgZm9yIGZpbmRSZWdpc3RlckRlZk9wZXJhbmRJZHgsIGl0IHJldHVybnMKKyAgLy8vIGEgcG9pbnRlciB0byB0aGUgTWFjaGluZU9wZXJhbmQgcmF0aGVyIHRoYW4gYW4gaW5kZXguCisgIE1hY2hpbmVPcGVyYW5kICpmaW5kUmVnaXN0ZXJEZWZPcGVyYW5kKHVuc2lnbmVkIFJlZywgYm9vbCBpc0RlYWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyKSB7CisgICAgaW50IElkeCA9IGZpbmRSZWdpc3RlckRlZk9wZXJhbmRJZHgoUmVnLCBpc0RlYWQsIGZhbHNlLCBUUkkpOworICAgIHJldHVybiAoSWR4ID09IC0xKSA/IG51bGxwdHIgOiAmZ2V0T3BlcmFuZChJZHgpOworICB9CisKKyAgLy8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvcGVyYW5kIGluIHRoZQorICAvLy8gb3BlcmFuZCBsaXN0IHRoYXQgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHByZWRpY2F0ZS4gSXQgcmV0dXJucyAtMSBpZgorICAvLy8gbm9uZSBpcyBmb3VuZC4KKyAgaW50IGZpbmRGaXJzdFByZWRPcGVyYW5kSWR4KCkgY29uc3Q7CisKKyAgLy8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBmbGFnIHdvcmQgb3BlcmFuZCB0aGF0CisgIC8vLyBjb3JyZXNwb25kcyB0byBvcGVyYW5kIE9wSWR4IG9uIGFuIGlubGluZSBhc20gaW5zdHJ1Y3Rpb24uICBSZXR1cm5zIC0xIGlmCisgIC8vLyBnZXRPcGVyYW5kKE9wSWR4KSBkb2VzIG5vdCBiZWxvbmcgdG8gYW4gaW5saW5lIGFzbSBvcGVyYW5kIGdyb3VwLgorICAvLy8KKyAgLy8vIElmIEdyb3VwTm8gaXMgbm90IE5VTEwsIGl0IHdpbGwgcmVjZWl2ZSB0aGUgbnVtYmVyIG9mIHRoZSBvcGVyYW5kIGdyb3VwCisgIC8vLyBjb250YWluaW5nIE9wSWR4LgorICAvLy8KKyAgLy8vIFRoZSBmbGFnIG9wZXJhbmQgaXMgYW4gaW1tZWRpYXRlIHRoYXQgY2FuIGJlIGRlY29kZWQgd2l0aCBtZXRob2RzIGxpa2UKKyAgLy8vIElubGluZUFzbTo6aGFzUmVnQ2xhc3NDb25zdHJhaW50KCkuCisgIGludCBmaW5kSW5saW5lQXNtRmxhZ0lkeCh1bnNpZ25lZCBPcElkeCwgdW5zaWduZWQgKkdyb3VwTm8gPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gQ29tcHV0ZSB0aGUgc3RhdGljIHJlZ2lzdGVyIGNsYXNzIGNvbnN0cmFpbnQgZm9yIG9wZXJhbmQgT3BJZHguCisgIC8vLyBGb3Igbm9ybWFsIGluc3RydWN0aW9ucywgdGhpcyBpcyBkZXJpdmVkIGZyb20gdGhlIE1DSW5zdHJEZXNjLgorICAvLy8gRm9yIGlubGluZSBhc3NlbWJseSBpdCBpcyBkZXJpdmVkIGZyb20gdGhlIGZsYWcgd29yZHMuCisgIC8vLworICAvLy8gUmV0dXJucyBOVUxMIGlmIHRoZSBzdGF0aWMgcmVnaXN0ZXIgY2xhc3MgY29uc3RyYWludCBjYW5ub3QgYmUKKyAgLy8vIGRldGVybWluZWQuCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqCisgIGdldFJlZ0NsYXNzQ29uc3RyYWludCh1bnNpZ25lZCBPcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQXBwbGllcyB0aGUgY29uc3RyYWludHMgKGRlZi91c2UpIGltcGxpZWQgYnkgdGhpcyBNSSBvbiBccCBSZWcgdG8KKyAgLy8vIHRoZSBnaXZlbiBccCBDdXJSQy4KKyAgLy8vIElmIFxwIEV4cGxvcmVCdW5kbGUgaXMgc2V0IGFuZCBNSSBpcyBwYXJ0IG9mIGEgYnVuZGxlLCBhbGwgdGhlCisgIC8vLyBpbnN0cnVjdGlvbnMgaW5zaWRlIHRoZSBidW5kbGUgd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQuIEluIG90aGVyIHdvcmRzLAorICAvLy8gdGhpcyBtZXRob2QgYWNjdW11bGF0ZXMgYWxsIHRoZSBjb25zdHJhaW50cyBvZiB0aGUgb3BlcmFuZCBvZiB0aGlzIE1JIGFuZAorICAvLy8gdGhlIHJlbGF0ZWQgYnVuZGxlIGlmIE1JIGlzIGEgYnVuZGxlIG9yIGluc2lkZSBhIGJ1bmRsZS4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIHRoZSByZWdpc3RlciBjbGFzcyB0aGF0IHNhdGlzZmllcyBib3RoIFxwIEN1clJDIGFuZCB0aGUKKyAgLy8vIGNvbnN0cmFpbnRzIHNldCBieSBNSS4gUmV0dXJucyBOVUxMIGlmIHN1Y2ggYSByZWdpc3RlciBjbGFzcyBkb2VzIG5vdAorICAvLy8gZXhpc3QuCisgIC8vLworICAvLy8gXHByZSBDdXJSQyBtdXN0IG5vdCBiZSBOVUxMLgorICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpnZXRSZWdDbGFzc0NvbnN0cmFpbnRFZmZlY3RGb3JWUmVnKAorICAgICAgdW5zaWduZWQgUmVnLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpDdXJSQywKKyAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJLCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSwKKyAgICAgIGJvb2wgRXhwbG9yZUJ1bmRsZSA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEFwcGxpZXMgdGhlIGNvbnN0cmFpbnRzIChkZWYvdXNlKSBpbXBsaWVkIGJ5IHRoZSBccCBPcElkeCBvcGVyYW5kCisgIC8vLyB0byB0aGUgZ2l2ZW4gXHAgQ3VyUkMuCisgIC8vLworICAvLy8gUmV0dXJucyB0aGUgcmVnaXN0ZXIgY2xhc3MgdGhhdCBzYXRpc2ZpZXMgYm90aCBccCBDdXJSQyBhbmQgdGhlCisgIC8vLyBjb25zdHJhaW50cyBzZXQgYnkgXHAgT3BJZHggTUkuIFJldHVybnMgTlVMTCBpZiBzdWNoIGEgcmVnaXN0ZXIgY2xhc3MKKyAgLy8vIGRvZXMgbm90IGV4aXN0LgorICAvLy8KKyAgLy8vIFxwcmUgQ3VyUkMgbXVzdCBub3QgYmUgTlVMTC4KKyAgLy8vIFxwcmUgVGhlIG9wZXJhbmQgYXQgXHAgT3BJZHggbXVzdCBiZSBhIHJlZ2lzdGVyLgorICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICoKKyAgZ2V0UmVnQ2xhc3NDb25zdHJhaW50RWZmZWN0KHVuc2lnbmVkIE9wSWR4LCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpDdXJSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworCisgIC8vLyBBZGQgYSB0aWUgYmV0d2VlbiB0aGUgcmVnaXN0ZXIgb3BlcmFuZHMgYXQgRGVmSWR4IGFuZCBVc2VJZHguCisgIC8vLyBUaGUgdGllIHdpbGwgY2F1c2UgdGhlIHJlZ2lzdGVyIGFsbG9jYXRvciB0byBlbnN1cmUgdGhhdCB0aGUgdHdvCisgIC8vLyBvcGVyYW5kcyBhcmUgYXNzaWduZWQgdGhlIHNhbWUgcGh5c2ljYWwgcmVnaXN0ZXIuCisgIC8vLworICAvLy8gVGllZCBvcGVyYW5kcyBhcmUgbWFuYWdlZCBhdXRvbWF0aWNhbGx5IGZvciBleHBsaWNpdCBvcGVyYW5kcyBpbiB0aGUKKyAgLy8vIE1DSW5zdHJEZXNjLiBUaGlzIG1ldGhvZCBpcyBmb3IgZXhjZXB0aW9uYWwgY2FzZXMgbGlrZSBpbmxpbmUgYXNtLgorICB2b2lkIHRpZU9wZXJhbmRzKHVuc2lnbmVkIERlZklkeCwgdW5zaWduZWQgVXNlSWR4KTsKKworICAvLy8gR2l2ZW4gdGhlIGluZGV4IG9mIGEgdGllZCByZWdpc3RlciBvcGVyYW5kLCBmaW5kIHRoZQorICAvLy8gb3BlcmFuZCBpdCBpcyB0aWVkIHRvLiBEZWZzIGFyZSB0aWVkIHRvIHVzZXMgYW5kIHZpY2UgdmVyc2EuIFJldHVybnMgdGhlCisgIC8vLyBpbmRleCBvZiB0aGUgdGllZCBvcGVyYW5kIHdoaWNoIG11c3QgZXhpc3QuCisgIHVuc2lnbmVkIGZpbmRUaWVkT3BlcmFuZElkeCh1bnNpZ25lZCBPcElkeCkgY29uc3Q7CisKKyAgLy8vIEdpdmVuIHRoZSBpbmRleCBvZiBhIHJlZ2lzdGVyIGRlZiBvcGVyYW5kLAorICAvLy8gY2hlY2sgaWYgdGhlIHJlZ2lzdGVyIGRlZiBpcyB0aWVkIHRvIGEgc291cmNlIG9wZXJhbmQsIGR1ZSB0byBlaXRoZXIKKyAgLy8vIHR3by1hZGRyZXNzIGVsaW1pbmF0aW9uIG9yIGlubGluZSBhc3NlbWJseSBjb25zdHJhaW50cy4gUmV0dXJucyB0aGUKKyAgLy8vIGZpcnN0IHRpZWQgdXNlIG9wZXJhbmQgaW5kZXggYnkgcmVmZXJlbmNlIGlmIFVzZU9wSWR4IGlzIG5vdCBudWxsLgorICBib29sIGlzUmVnVGllZFRvVXNlT3BlcmFuZCh1bnNpZ25lZCBEZWZPcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKlVzZU9wSWR4ID0gbnVsbHB0cikgY29uc3QgeworICAgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA9IGdldE9wZXJhbmQoRGVmT3BJZHgpOworICAgIGlmICghTU8uaXNSZWcoKSB8fCAhTU8uaXNEZWYoKSB8fCAhTU8uaXNUaWVkKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKFVzZU9wSWR4KQorICAgICAgKlVzZU9wSWR4ID0gZmluZFRpZWRPcGVyYW5kSWR4KERlZk9wSWR4KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdXNlIG9wZXJhbmQgb2YgdGhlIHNwZWNpZmllZCBpbmRleCBpcyB0aWVkIHRvIGEgZGVmCisgIC8vLyBvcGVyYW5kLiBJdCBhbHNvIHJldHVybnMgdGhlIGRlZiBvcGVyYW5kIGluZGV4IGJ5IHJlZmVyZW5jZSBpZiBEZWZPcElkeAorICAvLy8gaXMgbm90IG51bGwuCisgIGJvb2wgaXNSZWdUaWVkVG9EZWZPcGVyYW5kKHVuc2lnbmVkIFVzZU9wSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqRGVmT3BJZHggPSBudWxscHRyKSBjb25zdCB7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gZ2V0T3BlcmFuZChVc2VPcElkeCk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8ICFNTy5pc1VzZSgpIHx8ICFNTy5pc1RpZWQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoRGVmT3BJZHgpCisgICAgICAqRGVmT3BJZHggPSBmaW5kVGllZE9wZXJhbmRJZHgoVXNlT3BJZHgpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIENsZWFycyBraWxsIGZsYWdzIG9uIGFsbCBvcGVyYW5kcy4KKyAgdm9pZCBjbGVhcktpbGxJbmZvKCk7CisKKyAgLy8vIFJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIEZyb21SZWcgd2l0aCBUb1JlZzpTdWJJZHgsCisgIC8vLyBwcm9wZXJseSBjb21wb3Npbmcgc3VicmVnIGluZGljZXMgd2hlcmUgbmVjZXNzYXJ5LgorICB2b2lkIHN1YnN0aXR1dGVSZWdpc3Rlcih1bnNpZ25lZCBGcm9tUmVnLCB1bnNpZ25lZCBUb1JlZywgdW5zaWduZWQgU3ViSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlJlZ0luZm8pOworCisgIC8vLyBXZSBoYXZlIGRldGVybWluZWQgTUkga2lsbHMgYSByZWdpc3Rlci4gTG9vayBmb3IgdGhlCisgIC8vLyBvcGVyYW5kIHRoYXQgdXNlcyBpdCBhbmQgbWFyayBpdCBhcyBJc0tpbGwuIElmIEFkZElmTm90Rm91bmQgaXMgdHJ1ZSwKKyAgLy8vIGFkZCBhIGltcGxpY2l0IG9wZXJhbmQgaWYgaXQncyBub3QgZm91bmQuIFJldHVybnMgdHJ1ZSBpZiB0aGUgb3BlcmFuZAorICAvLy8gZXhpc3RzIC8gaXMgYWRkZWQuCisgIGJvb2wgYWRkUmVnaXN0ZXJLaWxsZWQodW5zaWduZWQgSW5jb21pbmdSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSZWdJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWRkSWZOb3RGb3VuZCA9IGZhbHNlKTsKKworICAvLy8gQ2xlYXIgYWxsIGtpbGwgZmxhZ3MgYWZmZWN0aW5nIFJlZy4gIElmIFJlZ0luZm8gaXMgcHJvdmlkZWQsIHRoaXMgaW5jbHVkZXMKKyAgLy8vIGFsbCBhbGlhc2luZyByZWdpc3RlcnMuCisgIHZvaWQgY2xlYXJSZWdpc3RlcktpbGxzKHVuc2lnbmVkIFJlZywgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSZWdJbmZvKTsKKworICAvLy8gV2UgaGF2ZSBkZXRlcm1pbmVkIE1JIGRlZmluZWQgYSByZWdpc3RlciB3aXRob3V0IGEgdXNlLgorICAvLy8gTG9vayBmb3IgdGhlIG9wZXJhbmQgdGhhdCBkZWZpbmVzIGl0IGFuZCBtYXJrIGl0IGFzIElzRGVhZC4gSWYKKyAgLy8vIEFkZElmTm90Rm91bmQgaXMgdHJ1ZSwgYWRkIGEgaW1wbGljaXQgb3BlcmFuZCBpZiBpdCdzIG5vdCBmb3VuZC4gUmV0dXJucworICAvLy8gdHJ1ZSBpZiB0aGUgb3BlcmFuZCBleGlzdHMgLyBpcyBhZGRlZC4KKyAgYm9vbCBhZGRSZWdpc3RlckRlYWQodW5zaWduZWQgUmVnLCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlJlZ0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWRkSWZOb3RGb3VuZCA9IGZhbHNlKTsKKworICAvLy8gQ2xlYXIgYWxsIGRlYWQgZmxhZ3Mgb24gb3BlcmFuZHMgZGVmaW5pbmcgcmVnaXN0ZXIgQHAgUmVnLgorICB2b2lkIGNsZWFyUmVnaXN0ZXJEZWFkcyh1bnNpZ25lZCBSZWcpOworCisgIC8vLyBNYXJrIGFsbCBzdWJyZWdpc3RlciBkZWZzIG9mIHJlZ2lzdGVyIEBwIFJlZyB3aXRoIHRoZSB1bmRlZiBmbGFnLgorICAvLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gd2UgZGV0ZXJtaW5lZCB0byBoYXZlIGEgc3VicmVnaXN0ZXIgZGVmIGluIGFuCisgIC8vLyBvdGhlcndpc2UgdW5kZWZpbmVkIHN1cGVyIHJlZ2lzdGVyLgorICB2b2lkIHNldFJlZ2lzdGVyRGVmUmVhZFVuZGVmKHVuc2lnbmVkIFJlZywgYm9vbCBJc1VuZGVmID0gdHJ1ZSk7CisKKyAgLy8vIFdlIGhhdmUgZGV0ZXJtaW5lZCBNSSBkZWZpbmVzIGEgcmVnaXN0ZXIuIE1ha2Ugc3VyZSB0aGVyZSBpcyBhbiBvcGVyYW5kCisgIC8vLyBkZWZpbmluZyBSZWcuCisgIHZvaWQgYWRkUmVnaXN0ZXJEZWZpbmVkKHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpSZWdJbmZvID0gbnVsbHB0cik7CisKKyAgLy8vIE1hcmsgZXZlcnkgcGh5c3JlZyB1c2VkIGJ5IHRoaXMgaW5zdHJ1Y3Rpb24gYXMKKyAgLy8vIGRlYWQgZXhjZXB0IHRob3NlIGluIHRoZSBVc2VkUmVncyBsaXN0LgorICAvLy8KKyAgLy8vIE9uIGluc3RydWN0aW9ucyB3aXRoIHJlZ2lzdGVyIG1hc2sgb3BlcmFuZHMsIGFsc28gYWRkIGltcGxpY2l0LWRlZgorICAvLy8gb3BlcmFuZHMgZm9yIGFsbCByZWdpc3RlcnMgaW4gVXNlZFJlZ3MuCisgIHZvaWQgc2V0UGh5c1JlZ3NEZWFkRXhjZXB0KEFycmF5UmVmPHVuc2lnbmVkPiBVc2VkUmVncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkkpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBzYWZlIHRvIG1vdmUgdGhpcyBpbnN0cnVjdGlvbi4gSWYKKyAgLy8vIFNhd1N0b3JlIGlzIHNldCB0byB0cnVlLCBpdCBtZWFucyB0aGF0IHRoZXJlIGlzIGEgc3RvcmUgKG9yIGNhbGwpIGJldHdlZW4KKyAgLy8vIHRoZSBpbnN0cnVjdGlvbidzIGxvY2F0aW9uIGFuZCBpdHMgaW50ZW5kZWQgZGVzdGluYXRpb24uCisgIGJvb2wgaXNTYWZlVG9Nb3ZlKEFsaWFzQW5hbHlzaXMgKkFBLCBib29sICZTYXdTdG9yZSkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uJ3MgbWVtb3J5IGFjY2VzcyBhbGlhc2VzIHRoZSBtZW1vcnkKKyAgLy8vIGFjY2VzcyBvZiBPdGhlci4KKyAgLy8KKyAgLy8vIEFzc3VtZXMgYW55IHBoeXNpY2FsIHJlZ2lzdGVycyB1c2VkIHRvIGNvbXB1dGUgYWRkcmVzc2VzCisgIC8vLyBoYXZlIHRoZSBzYW1lIHZhbHVlIGZvciBib3RoIGluc3RydWN0aW9ucy4gIFJldHVybnMgZmFsc2UgaWYgbmVpdGhlcgorICAvLy8gaW5zdHJ1Y3Rpb24gd3JpdGVzIHRvIG1lbW9yeS4KKyAgLy8vCisgIC8vLyBAcGFyYW0gQUEgT3B0aW9uYWwgYWxpYXMgYW5hbHlzaXMsIHVzZWQgdG8gY29tcGFyZSBtZW1vcnkgb3BlcmFuZHMuCisgIC8vLyBAcGFyYW0gT3RoZXIgTWFjaGluZUluc3RyIHRvIGNoZWNrIGFsaWFzaW5nIGFnYWluc3QuCisgIC8vLyBAcGFyYW0gVXNlVEJBQSBXaGV0aGVyIHRvIHBhc3MgVEJBQSBpbmZvcm1hdGlvbiB0byBhbGlhcyBhbmFseXNpcy4KKyAgYm9vbCBtYXlBbGlhcyhBbGlhc0FuYWx5c2lzICpBQSwgTWFjaGluZUluc3RyICZPdGhlciwgYm9vbCBVc2VUQkFBKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBtYXkgaGF2ZSBhbiBvcmRlcmVkCisgIC8vLyBvciB2b2xhdGlsZSBtZW1vcnkgcmVmZXJlbmNlLCBvciBpZiB0aGUgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgbWVtb3J5CisgIC8vLyByZWZlcmVuY2UgaXMgbm90IGF2YWlsYWJsZS4gUmV0dXJuIGZhbHNlIGlmIGl0IGlzIGtub3duIHRvIGhhdmUgbm8KKyAgLy8vIG9yZGVyZWQgb3Igdm9sYXRpbGUgbWVtb3J5IHJlZmVyZW5jZXMuCisgIGJvb2wgaGFzT3JkZXJlZE1lbW9yeVJlZigpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGxvYWQgaW5zdHJ1Y3Rpb24gbmV2ZXIgdHJhcHMgYW5kIHBvaW50cyB0byBhIG1lbW9yeQorICAvLy8gbG9jYXRpb24gd2hvc2UgdmFsdWUgZG9lc24ndCBjaGFuZ2UgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBFeGFtcGxlcyBpbmNsdWRlIGxvYWRpbmcgYSB2YWx1ZSBmcm9tIHRoZSBjb25zdGFudCBwb29sIG9yIGZyb20gdGhlCisgIC8vLyBhcmd1bWVudCBhcmVhIG9mIGEgZnVuY3Rpb24gKGlmIGl0IGRvZXMgbm90IGNoYW5nZSkuICBJZiB0aGUgaW5zdHJ1Y3Rpb24KKyAgLy8vIGRvZXMgbXVsdGlwbGUgbG9hZHMsIHRoaXMgcmV0dXJucyB0cnVlIG9ubHkgaWYgYWxsIG9mIHRoZSBsb2FkcyBhcmUKKyAgLy8vIGRlcmVmZXJlbmNlYWJsZSBhbmQgaW52YXJpYW50LgorICBib29sIGlzRGVyZWZlcmVuY2VhYmxlSW52YXJpYW50TG9hZChBbGlhc0FuYWx5c2lzICpBQSkgY29uc3Q7CisKKyAgLy8vIElmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gaXMgYSBQSEkgdGhhdCBhbHdheXMgbWVyZ2VzIHRvZ2V0aGVyIHRoZQorICAvLy8gc2FtZSB2aXJ0dWFsIHJlZ2lzdGVyLCByZXR1cm4gdGhlIHJlZ2lzdGVyLCBvdGhlcndpc2UgcmV0dXJuIDAuCisgIHVuc2lnbmVkIGlzQ29uc3RhbnRWYWx1ZVBISSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGhhcyBzaWRlIGVmZmVjdHMgdGhhdCBhcmUgbm90IG1vZGVsZWQKKyAgLy8vIGJ5IG1heUxvYWQgLyBtYXlTdG9yZSwgZXRjLgorICAvLy8gRm9yIGFsbCBpbnN0cnVjdGlvbnMsIHRoZSBwcm9wZXJ0eSBpcyBlbmNvZGVkIGluIE1DSW5zdHJEZXNjOjpGbGFncworICAvLy8gKHNlZSBNQ0luc3RyRGVzYzo6aGFzVW5tb2RlbGVkU2lkZUVmZmVjdHMoKS4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzCisgIC8vLyBJTkxJTkVBU00gaW5zdHJ1Y3Rpb24sIGluIHdoaWNoIGNhc2UgdGhlIHNpZGUgZWZmZWN0IHByb3BlcnR5IGlzIGVuY29kZWQKKyAgLy8vIGluIG9uZSBvZiBpdHMgb3BlcmFuZHMgKHNlZSBJbmxpbmVBc206OkV4dHJhX0hhc1NpZGVFZmZlY3QpLgorICAvLy8KKyAgYm9vbCBoYXNVbm1vZGVsZWRTaWRlRWZmZWN0cygpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgaXQgaXMgaWxsZWdhbCB0byBmb2xkIGEgbG9hZCBhY3Jvc3MgdGhpcyBpbnN0cnVjdGlvbi4KKyAgYm9vbCBpc0xvYWRGb2xkQmFycmllcigpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbGwgdGhlIGRlZnMgb2YgdGhpcyBpbnN0cnVjdGlvbiBhcmUgZGVhZC4KKyAgYm9vbCBhbGxEZWZzQXJlRGVhZCgpIGNvbnN0OworCisgIC8vLyBDb3B5IGltcGxpY2l0IHJlZ2lzdGVyIG9wZXJhbmRzIGZyb20gc3BlY2lmaWVkCisgIC8vLyBpbnN0cnVjdGlvbiB0byB0aGlzIGluc3RydWN0aW9uLgorICB2b2lkIGNvcHlJbXBsaWNpdE9wcyhNYWNoaW5lRnVuY3Rpb24gJk1GLCBjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKworICAvLy8gRGVidWdnaW5nIHN1cHBvcnQKKyAgLy8vIEB7CisgIC8vLyBEZXRlcm1pbmUgdGhlIGdlbmVyaWMgdHlwZSB0byBiZSBwcmludGVkIChpZiBuZWVkZWQpIG9uIHVzZXMgYW5kIGRlZnMuCisgIExMVCBnZXRUeXBlVG9QcmludCh1bnNpZ25lZCBPcElkeCwgU21hbGxCaXRWZWN0b3IgJlByaW50ZWRUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIHdoZW4gYW4gaW5zdHJ1Y3Rpb24gaGFzIHRpZWQgcmVnaXN0ZXIgdGhhdCBjYW4ndCBiZSBkZXRlcm1pbmVkCisgIC8vLyBieSB0aGUgaW5zdHJ1Y3Rpb24ncyBkZXNjcmlwdG9yLiBUaGlzIGlzIHVzZWZ1bCBmb3IgTUlSIHByaW50aW5nLCB0bworICAvLy8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgbmVlZCB0byBwcmludCB0aGUgdGllcyBvciBub3QuCisgIGJvb2wgaGFzQ29tcGxleFJlZ2lzdGVyVGllcygpIGNvbnN0OworCisgIC8vLyBQcmludCB0aGlzIE1JIHRvIFxwIE9TLgorICAvLy8gRG9uJ3QgcHJpbnQgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSBvdGhlciBpbnN0cnVjdGlvbnMgaWYKKyAgLy8vIFxwIElzU3RhbmRhbG9uZSBpcyBmYWxzZS4gSXQgaXMgdXN1YWxseSB0cnVlIHdoZW4gb25seSBhIGZyYWdtZW50IG9mIHRoZQorICAvLy8gZnVuY3Rpb24gaXMgcHJpbnRlZC4KKyAgLy8vIE9ubHkgcHJpbnQgdGhlIGRlZnMgYW5kIHRoZSBvcGNvZGUgaWYgXHAgU2tpcE9wZXJzIGlzIHRydWUuCisgIC8vLyBPdGhlcndpc2UsIGFsc28gcHJpbnQgb3BlcmFuZHMgaWYgXHAgU2tpcERlYnVnTG9jIGlzIHRydWUuCisgIC8vLyBPdGhlcndpc2UsIGFsc28gcHJpbnQgdGhlIGRlYnVnIGxvYywgd2l0aCBhIHRlcm1pbmF0aW5nIG5ld2xpbmUuCisgIC8vLyBccCBUSUkgaXMgdXNlZCB0byBwcmludCB0aGUgb3Bjb2RlIG5hbWUuICBJZiBpdCdzIG5vdCBwcmVzZW50LCBidXQgdGhlCisgIC8vLyBNSSBpcyBpbiBhIGZ1bmN0aW9uLCB0aGUgb3Bjb2RlIHdpbGwgYmUgcHJpbnRlZCB1c2luZyB0aGUgZnVuY3Rpb24ncyBUSUkuCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBib29sIElzU3RhbmRhbG9uZSA9IHRydWUsIGJvb2wgU2tpcE9wZXJzID0gZmFsc2UsCisgICAgICAgICAgICAgYm9vbCBTa2lwRGVidWdMb2MgPSBmYWxzZSwKKyAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgTW9kdWxlU2xvdFRyYWNrZXIgJk1TVCwgYm9vbCBJc1N0YW5kYWxvbmUgPSB0cnVlLAorICAgICAgICAgICAgIGJvb2wgU2tpcE9wZXJzID0gZmFsc2UsIGJvb2wgU2tpcERlYnVnTG9jID0gZmFsc2UsCisgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUkgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisgIC8vLyBAfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBY2Nlc3NvcnMgdXNlZCB0byBidWlsZCB1cCBtYWNoaW5lIGluc3RydWN0aW9ucy4KKworICAvLy8gQWRkIHRoZSBzcGVjaWZpZWQgb3BlcmFuZCB0byB0aGUgaW5zdHJ1Y3Rpb24uICBJZiBpdCBpcyBhbiBpbXBsaWNpdAorICAvLy8gb3BlcmFuZCwgaXQgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgb3BlcmFuZCBsaXN0LiAgSWYgaXQgaXMgYW4KKyAgLy8vIGV4cGxpY2l0IG9wZXJhbmQgaXQgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgZXhwbGljaXQgb3BlcmFuZCBsaXN0CisgIC8vLyAoYmVmb3JlIHRoZSBmaXJzdCBpbXBsaWNpdCBvcGVyYW5kKS4KKyAgLy8vCisgIC8vLyBNRiBtdXN0IGJlIHRoZSBtYWNoaW5lIGZ1bmN0aW9uIHRoYXQgd2FzIHVzZWQgdG8gYWxsb2NhdGUgdGhpcworICAvLy8gaW5zdHJ1Y3Rpb24uCisgIC8vLworICAvLy8gTWFjaGluZUluc3RyQnVpbGRlciBwcm92aWRlcyBhIG1vcmUgY29udmVuaWVudCBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nCisgIC8vLyBpbnN0cnVjdGlvbnMgYW5kIGFkZGluZyBvcGVyYW5kcy4KKyAgdm9pZCBhZGRPcGVyYW5kKE1hY2hpbmVGdW5jdGlvbiAmTUYsIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZPcCk7CisKKyAgLy8vIEFkZCBhbiBvcGVyYW5kIHdpdGhvdXQgcHJvdmlkaW5nIGFuIE1GIHJlZmVyZW5jZS4gVGhpcyBvbmx5IHdvcmtzIGZvcgorICAvLy8gaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIGluc2VydGVkIGluIGEgYmFzaWMgYmxvY2suCisgIC8vLworICAvLy8gTWFjaGluZUluc3RyQnVpbGRlciBhbmQgdGhlIHR3by1hcmd1bWVudCBhZGRPcGVyYW5kKE1GLCBNTykgc2hvdWxkIGJlCisgIC8vLyBwcmVmZXJyZWQuCisgIHZvaWQgYWRkT3BlcmFuZChjb25zdCBNYWNoaW5lT3BlcmFuZCAmT3ApOworCisgIC8vLyBSZXBsYWNlIHRoZSBpbnN0cnVjdGlvbiBkZXNjcmlwdG9yICh0aHVzIG9wY29kZSkgb2YKKyAgLy8vIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHdpdGggYSBuZXcgb25lLgorICB2b2lkIHNldERlc2MoY29uc3QgTUNJbnN0ckRlc2MgJnRpZCkgeyBNQ0lEID0gJnRpZDsgfQorCisgIC8vLyBSZXBsYWNlIGN1cnJlbnQgc291cmNlIGluZm9ybWF0aW9uIHdpdGggbmV3IHN1Y2guCisgIC8vLyBBdm9pZCB1c2luZyB0aGlzLCB0aGUgY29uc3RydWN0b3IgYXJndW1lbnQgaXMgcHJlZmVyYWJsZS4KKyAgdm9pZCBzZXREZWJ1Z0xvYyhEZWJ1Z0xvYyBkbCkgeworICAgIGRlYnVnTG9jID0gc3RkOjptb3ZlKGRsKTsKKyAgICBhc3NlcnQoZGVidWdMb2MuaGFzVHJpdmlhbERlc3RydWN0b3IoKSAmJiAiRXhwZWN0ZWQgdHJpdmlhbCBkZXN0cnVjdG9yIik7CisgIH0KKworICAvLy8gRXJhc2UgYW4gb3BlcmFuZCBmcm9tIGFuIGluc3RydWN0aW9uLCBsZWF2aW5nIGl0IHdpdGggb25lCisgIC8vLyBmZXdlciBvcGVyYW5kIHRoYW4gaXQgc3RhcnRlZCB3aXRoLgorICB2b2lkIFJlbW92ZU9wZXJhbmQodW5zaWduZWQgaSk7CisKKyAgLy8vIEFkZCBhIE1hY2hpbmVNZW1PcGVyYW5kIHRvIHRoZSBtYWNoaW5lIGluc3RydWN0aW9uLgorICAvLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCBvbmx5IG9jY2FzaW9uYWxseS4gVGhlIHNldE1lbVJlZnMgZnVuY3Rpb24KKyAgLy8vIGlzIHRoZSBwcmltYXJ5IG1ldGhvZCBmb3Igc2V0dGluZyB1cCBhIE1hY2hpbmVJbnN0cidzIE1lbVJlZnMgbGlzdC4KKyAgdm9pZCBhZGRNZW1PcGVyYW5kKE1hY2hpbmVGdW5jdGlvbiAmTUYsIE1hY2hpbmVNZW1PcGVyYW5kICpNTyk7CisKKyAgLy8vIEFzc2lnbiB0aGlzIE1hY2hpbmVJbnN0cidzIG1lbW9yeSByZWZlcmVuY2UgZGVzY3JpcHRvciBsaXN0LgorICAvLy8gVGhpcyBkb2VzIG5vdCB0cmFuc2ZlciBvd25lcnNoaXAuCisgIHZvaWQgc2V0TWVtUmVmcyhtbW9faXRlcmF0b3IgTmV3TWVtUmVmcywgbW1vX2l0ZXJhdG9yIE5ld01lbVJlZnNFbmQpIHsKKyAgICBzZXRNZW1SZWZzKHN0ZDo6bWFrZV9wYWlyKE5ld01lbVJlZnMsIE5ld01lbVJlZnNFbmQtTmV3TWVtUmVmcykpOworICB9CisKKyAgLy8vIEFzc2lnbiB0aGlzIE1hY2hpbmVJbnN0cidzIG1lbW9yeSByZWZlcmVuY2UgZGVzY3JpcHRvciBsaXN0LiAgRmlyc3QKKyAgLy8vIGVsZW1lbnQgaW4gdGhlIHBhaXIgaXMgdGhlIGJlZ2luIGl0ZXJhdG9yL3BvaW50ZXIgdG8gdGhlIGFycmF5OyB0aGUKKyAgLy8vIHNlY29uZCBpcyB0aGUgbnVtYmVyIG9mIE1lbW9yeU9wZXJhbmRzLiAgVGhpcyBkb2VzIG5vdCB0cmFuc2ZlciBvd25lcnNoaXAKKyAgLy8vIG9mIHRoZSB1bmRlcmx5aW5nIG1lbW9yeS4KKyAgdm9pZCBzZXRNZW1SZWZzKHN0ZDo6cGFpcjxtbW9faXRlcmF0b3IsIHVuc2lnbmVkPiBOZXdNZW1SZWZzKSB7CisgICAgTWVtUmVmcyA9IE5ld01lbVJlZnMuZmlyc3Q7CisgICAgTnVtTWVtUmVmcyA9IHVpbnQ4X3QoTmV3TWVtUmVmcy5zZWNvbmQpOworICAgIGFzc2VydChOdW1NZW1SZWZzID09IE5ld01lbVJlZnMuc2Vjb25kICYmCisgICAgICAgICAgICJUb28gbWFueSBtZW1yZWZzIC0gbXVzdCBkcm9wIG1lbW9yeSBvcGVyYW5kcyIpOworICB9CisKKyAgLy8vIFJldHVybiBhIHNldCBvZiBtZW1yZWZzIChiZWdpbiBpdGVyYXRvciwgc2l6ZSkgd2hpY2ggY29uc2VydmF0aXZlbHkKKyAgLy8vIGRlc2NyaWJlIHRoZSBtZW1vcnkgYmVoYXZpb3Igb2YgYm90aCBNYWNoaW5lSW5zdHJzLiAgVGhpcyBpcyBhcHByb3ByaWF0ZQorICAvLy8gZm9yIHVzZSB3aGVuIG1lcmdpbmcgdHdvIE1hY2hpbmVJbnN0cnMgaW50byBvbmUuIFRoaXMgcm91dGluZSBkb2VzIG5vdAorICAvLy8gbW9kaWZ5IHRoZSBtZW1yZWZzIG9mIHRoZSB0aGlzIE1hY2hpbmVJbnN0ci4KKyAgc3RkOjpwYWlyPG1tb19pdGVyYXRvciwgdW5zaWduZWQ+IG1lcmdlTWVtUmVmc1dpdGgoY29uc3QgTWFjaGluZUluc3RyJiBPdGhlcik7CisKKyAgLy8vIFJldHVybiB0aGUgTUlGbGFncyB3aGljaCByZXByZXNlbnQgYm90aCBNYWNoaW5lSW5zdHJzLiBUaGlzCisgIC8vLyBzaG91bGQgYmUgdXNlZCB3aGVuIG1lcmdpbmcgdHdvIE1hY2hpbmVJbnN0cnMgaW50byBvbmUuIFRoaXMgcm91dGluZSBkb2VzCisgIC8vLyBub3QgbW9kaWZ5IHRoZSBNSUZsYWdzIG9mIHRoaXMgTWFjaGluZUluc3RyLgorICB1aW50OF90IG1lcmdlRmxhZ3NXaXRoKGNvbnN0IE1hY2hpbmVJbnN0ciYgT3RoZXIpIGNvbnN0OworCisgIC8vLyBDbGVhciB0aGlzIE1hY2hpbmVJbnN0cidzIG1lbW9yeSByZWZlcmVuY2UgZGVzY3JpcHRvciBsaXN0LiAgVGhpcyByZXNldHMKKyAgLy8vIHRoZSBtZW1yZWZzIHRvIHRoZWlyIG1vc3QgY29uc2VydmF0aXZlIHN0YXRlLiAgVGhpcyBzaG91bGQgYmUgdXNlZCBvbmx5CisgIC8vLyBhcyBhIGxhc3QgcmVzb3J0IHNpbmNlIGl0IGdyZWF0bHkgcGVzc2ltaXplcyBvdXIga25vd2xlZGdlIG9mIHRoZSBtZW1vcnkKKyAgLy8vIGFjY2VzcyBwZXJmb3JtZWQgYnkgdGhlIGluc3RydWN0aW9uLgorICB2b2lkIGRyb3BNZW1SZWZzKCkgeworICAgIE1lbVJlZnMgPSBudWxscHRyOworICAgIE51bU1lbVJlZnMgPSAwOworICB9CisKKyAgLy8vIEJyZWFrIGFueSB0aWUgaW52b2x2aW5nIE9wSWR4LgorICB2b2lkIHVudGllUmVnT3BlcmFuZCh1bnNpZ25lZCBPcElkeCkgeworICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IGdldE9wZXJhbmQoT3BJZHgpOworICAgIGlmIChNTy5pc1JlZygpICYmIE1PLmlzVGllZCgpKSB7CisgICAgICBnZXRPcGVyYW5kKGZpbmRUaWVkT3BlcmFuZElkeChPcElkeCkpLlRpZWRUbyA9IDA7CisgICAgICBNTy5UaWVkVG8gPSAwOworICAgIH0KKyAgfQorCisgIC8vLyBBZGQgYWxsIGltcGxpY2l0IGRlZiBhbmQgdXNlIG9wZXJhbmRzIHRvIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgYWRkSW1wbGljaXREZWZVc2VPcGVyYW5kcyhNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworcHJpdmF0ZToKKyAgLy8vIElmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgZW1iZWRkZWQgaW50byBhIE1hY2hpbmVGdW5jdGlvbiwgcmV0dXJuIHRoZQorICAvLy8gTWFjaGluZVJlZ2lzdGVySW5mbyBvYmplY3QgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLCBvdGhlcndpc2UKKyAgLy8vIHJldHVybiBudWxsLgorICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpnZXRSZWdJbmZvKCk7CisKKyAgLy8vIFVubGluayBhbGwgb2YgdGhlIHJlZ2lzdGVyIG9wZXJhbmRzIGluIHRoaXMgaW5zdHJ1Y3Rpb24gZnJvbSB0aGVpcgorICAvLy8gcmVzcGVjdGl2ZSB1c2UgbGlzdHMuICBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIG9wZXJhbmRzIGFscmVhZHkgYmUgb24gdGhlaXIKKyAgLy8vIHVzZSBsaXN0cy4KKyAgdm9pZCBSZW1vdmVSZWdPcGVyYW5kc0Zyb21Vc2VMaXN0cyhNYWNoaW5lUmVnaXN0ZXJJbmZvJik7CisKKyAgLy8vIEFkZCBhbGwgb2YgdGhlIHJlZ2lzdGVyIG9wZXJhbmRzIGluIHRoaXMgaW5zdHJ1Y3Rpb24gZnJvbSB0aGVpcgorICAvLy8gcmVzcGVjdGl2ZSB1c2UgbGlzdHMuICBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIG9wZXJhbmRzIG5vdCBiZSBvbiB0aGVpcgorICAvLy8gdXNlIGxpc3RzIHlldC4KKyAgdm9pZCBBZGRSZWdPcGVyYW5kc1RvVXNlTGlzdHMoTWFjaGluZVJlZ2lzdGVySW5mbyYpOworCisgIC8vLyBTbG93IHBhdGggZm9yIGhhc1Byb3BlcnR5IHdoZW4gd2UncmUgZGVhbGluZyB3aXRoIGEgYnVuZGxlLgorICBib29sIGhhc1Byb3BlcnR5SW5CdW5kbGUodW5zaWduZWQgTWFzaywgUXVlcnlUeXBlIFR5cGUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgSW1wbGVtZW50cyB0aGUgbG9naWMgb2YgZ2V0UmVnQ2xhc3NDb25zdHJhaW50RWZmZWN0Rm9yVlJlZyBmb3IgdGhlCisgIC8vLyB0aGlzIE1JIGFuZCB0aGUgZ2l2ZW4gb3BlcmFuZCBpbmRleCBccCBPcElkeC4KKyAgLy8vIElmIHRoZSByZWxhdGVkIG9wZXJhbmQgZG9lcyBub3QgY29uc3RyYWluZWQgUmVnLCB0aGlzIHJldHVybnMgQ3VyUkMuCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKmdldFJlZ0NsYXNzQ29uc3RyYWludEVmZmVjdEZvclZSZWdJbXBsKAorICAgICAgdW5zaWduZWQgT3BJZHgsIHVuc2lnbmVkIFJlZywgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqQ3VyUkMsCisgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworfTsKKworLy8vIFNwZWNpYWwgRGVuc2VNYXBJbmZvIHRyYWl0cyB0byBjb21wYXJlIE1hY2hpbmVJbnN0ciogYnkgKnZhbHVlKiBvZiB0aGUKKy8vLyBpbnN0cnVjdGlvbiByYXRoZXIgdGhhbiBieSBwb2ludGVyIHZhbHVlLgorLy8vIFRoZSBoYXNoaW5nIGFuZCBlcXVhbGl0eSB0ZXN0aW5nIGZ1bmN0aW9ucyBpZ25vcmUgZGVmaW5pdGlvbnMgc28gdGhpcyBpcworLy8vIHVzZWZ1bCBmb3IgQ1NFLCBldGMuCitzdHJ1Y3QgTWFjaGluZUluc3RyRXhwcmVzc2lvblRyYWl0IDogRGVuc2VNYXBJbmZvPE1hY2hpbmVJbnN0cio+IHsKKyAgc3RhdGljIGlubGluZSBNYWNoaW5lSW5zdHIgKmdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgc3RhdGljIGlubGluZSBNYWNoaW5lSW5zdHIgKmdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxNYWNoaW5lSW5zdHIqPigtMSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IE1hY2hpbmVJbnN0ciogY29uc3QgJk1JKTsKKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IE1hY2hpbmVJbnN0ciogY29uc3QgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIqIGNvbnN0ICZSSFMpIHsKKyAgICBpZiAoUkhTID09IGdldEVtcHR5S2V5KCkgfHwgUkhTID09IGdldFRvbWJzdG9uZUtleSgpIHx8CisgICAgICAgIExIUyA9PSBnZXRFbXB0eUtleSgpIHx8IExIUyA9PSBnZXRUb21ic3RvbmVLZXkoKSkKKyAgICAgIHJldHVybiBMSFMgPT0gUkhTOworICAgIHJldHVybiBMSFMtPmlzSWRlbnRpY2FsVG8oKlJIUywgTWFjaGluZUluc3RyOjpJZ25vcmVWUmVnRGVmcyk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBEZWJ1Z2dpbmcgU3VwcG9ydAorCitpbmxpbmUgcmF3X29zdHJlYW0mIG9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSB7CisgIE1JLnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX01BQ0hJTkVJTlNUUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGY4OWIxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1aWxkZXIuaApAQCAtMCwwICsxLDU2MCBAQAorLy89PT0tIENvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIC0gU2ltcGxpZnkgY3JlYXRpb24gb2YgTUlzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGV4cG9zZXMgYSBmdW5jdGlvbiBuYW1lZCBCdWlsZE1JLCB3aGljaCBpcyB1c2VmdWwgZm9yIGRyYW1hdGljYWxseQorLy8gc2ltcGxpZnlpbmcgaG93IE1hY2hpbmVJbnN0cidzIGFyZSBjcmVhdGVkLiAgSXQgYWxsb3dzIHVzZSBvZiBjb2RlIGxpa2UgdGhpczoKKy8vCisvLyAgIE0gPSBCdWlsZE1JKE1CQiwgTUksIERMLCBUSUkuZ2V0KFg4Njo6QUREOHJyKSwgRHN0KQorLy8gICAgICAgICAgIC5hZGRSZWcoYXJnVmFsMSkKKy8vICAgICAgICAgICAuYWRkUmVnKGFyZ1ZhbDIpOworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVJTlNUUkJVSUxERVJfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORUlOU1RSQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1V0aWxzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVPcGVyYW5kLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNJbnN0ckRlc2M7CitjbGFzcyBNRE5vZGU7CisKK25hbWVzcGFjZSBSZWdTdGF0ZSB7CisKKyAgZW51bSB7CisgICAgRGVmaW5lICAgICAgICAgPSAweDIsCisgICAgSW1wbGljaXQgICAgICAgPSAweDQsCisgICAgS2lsbCAgICAgICAgICAgPSAweDgsCisgICAgRGVhZCAgICAgICAgICAgPSAweDEwLAorICAgIFVuZGVmICAgICAgICAgID0gMHgyMCwKKyAgICBFYXJseUNsb2JiZXIgICA9IDB4NDAsCisgICAgRGVidWcgICAgICAgICAgPSAweDgwLAorICAgIEludGVybmFsUmVhZCAgID0gMHgxMDAsCisgICAgUmVuYW1hYmxlICAgICAgPSAweDIwMCwKKyAgICBEZWZpbmVOb1JlYWQgICA9IERlZmluZSB8IFVuZGVmLAorICAgIEltcGxpY2l0RGVmaW5lID0gSW1wbGljaXQgfCBEZWZpbmUsCisgICAgSW1wbGljaXRLaWxsICAgPSBJbXBsaWNpdCB8IEtpbGwKKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIFJlZ1N0YXRlCisKK2NsYXNzIE1hY2hpbmVJbnN0ckJ1aWxkZXIgeworICBNYWNoaW5lRnVuY3Rpb24gKk1GID0gbnVsbHB0cjsKKyAgTWFjaGluZUluc3RyICpNSSA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgTWFjaGluZUluc3RyQnVpbGRlcigpID0gZGVmYXVsdDsKKworICAvLy8gQ3JlYXRlIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgbWFuaXB1bGF0aW5nIGFuIGV4aXN0aW5nIGluc3RydWN0aW9uLgorICAvLy8gRiBtdXN0IGJlIHRoZSBtYWNoaW5lIGZ1bmN0aW9uIHRoYXQgd2FzIHVzZWQgdG8gYWxsb2NhdGUgSS4KKyAgTWFjaGluZUluc3RyQnVpbGRlcihNYWNoaW5lRnVuY3Rpb24gJkYsIE1hY2hpbmVJbnN0ciAqSSkgOiBNRigmRiksIE1JKEkpIHt9CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIoTWFjaGluZUZ1bmN0aW9uICZGLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSkKKyAgICAgIDogTUYoJkYpLCBNSSgmKkkpIHt9CisKKyAgLy8vIEFsbG93IGF1dG9tYXRpYyBjb252ZXJzaW9uIHRvIHRoZSBtYWNoaW5lIGluc3RydWN0aW9uIHdlIGFyZSB3b3JraW5nIG9uLgorICBvcGVyYXRvciBNYWNoaW5lSW5zdHIqKCkgY29uc3QgeyByZXR1cm4gTUk7IH0KKyAgTWFjaGluZUluc3RyICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gTUk7IH0KKyAgb3BlcmF0b3IgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gTUk7IH0KKworICAvLy8gSWYgY29udmVyc2lvbiBvcGVyYXRvcnMgZmFpbCwgdXNlIHRoaXMgbWV0aG9kIHRvIGdldCB0aGUgTWFjaGluZUluc3RyCisgIC8vLyBleHBsaWNpdGx5LgorICBNYWNoaW5lSW5zdHIgKmdldEluc3RyKCkgY29uc3QgeyByZXR1cm4gTUk7IH0KKworICAvLy8gQWRkIGEgbmV3IHZpcnR1YWwgcmVnaXN0ZXIgb3BlcmFuZC4KKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkUmVnKHVuc2lnbmVkIFJlZ05vLCB1bnNpZ25lZCBmbGFncyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdWJSZWcgPSAwKSBjb25zdCB7CisgICAgYXNzZXJ0KChmbGFncyAmIDB4MSkgPT0gMCAmJgorICAgICAgICAgICAiUGFzc2luZyBpbiAndHJ1ZScgdG8gYWRkUmVnIGlzIGZvcmJpZGRlbiEgVXNlIGVudW1zIGluc3RlYWQuIik7CisgICAgTUktPmFkZE9wZXJhbmQoKk1GLCBNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlUmVnKFJlZ05vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIFJlZ1N0YXRlOjpEZWZpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgUmVnU3RhdGU6OkltcGxpY2l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIFJlZ1N0YXRlOjpLaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIFJlZ1N0YXRlOjpEZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIFJlZ1N0YXRlOjpVbmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBSZWdTdGF0ZTo6RWFybHlDbG9iYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgUmVnU3RhdGU6OkRlYnVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIFJlZ1N0YXRlOjpJbnRlcm5hbFJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgUmVnU3RhdGU6OlJlbmFtYWJsZSkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBBZGQgYSB2aXJ0dWFsIHJlZ2lzdGVyIGRlZmluaXRpb24gb3BlcmFuZC4KKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkRGVmKHVuc2lnbmVkIFJlZ05vLCB1bnNpZ25lZCBGbGFncyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdWJSZWcgPSAwKSBjb25zdCB7CisgICAgcmV0dXJuIGFkZFJlZyhSZWdObywgRmxhZ3MgfCBSZWdTdGF0ZTo6RGVmaW5lLCBTdWJSZWcpOworICB9CisKKyAgLy8vIEFkZCBhIHZpcnR1YWwgcmVnaXN0ZXIgdXNlIG9wZXJhbmQuIEl0IGlzIGFuIGVycm9yIGZvciBGbGFncyB0byBjb250YWluCisgIC8vLyBgUmVnU3RhdGU6OkRlZmluZWAgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZFVzZSh1bnNpZ25lZCBSZWdObywgdW5zaWduZWQgRmxhZ3MgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3ViUmVnID0gMCkgY29uc3QgeworICAgIGFzc2VydCghKEZsYWdzICYgUmVnU3RhdGU6OkRlZmluZSkgJiYKKyAgICAgICAgICAgIk1pc2xlYWRpbmcgYWRkVXNlIGRlZmluZXMgcmVnaXN0ZXIsIHVzZSBhZGRSZWcgaW5zdGVhZC4iKTsKKyAgICByZXR1cm4gYWRkUmVnKFJlZ05vLCBGbGFncywgU3ViUmVnKTsKKyAgfQorCisgIC8vLyBBZGQgYSBuZXcgaW1tZWRpYXRlIG9wZXJhbmQuCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZEltbShpbnQ2NF90IFZhbCkgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKCpNRiwgTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUltbShWYWwpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGRDSW1tKGNvbnN0IENvbnN0YW50SW50ICpWYWwpIGNvbnN0IHsKKyAgICBNSS0+YWRkT3BlcmFuZCgqTUYsIE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVDSW1tKFZhbCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZEZQSW1tKGNvbnN0IENvbnN0YW50RlAgKlZhbCkgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKCpNRiwgTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUZQSW1tKFZhbCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZE1CQihNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApIGNvbnN0IHsKKyAgICBNSS0+YWRkT3BlcmFuZCgqTUYsIE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVNQkIoTUJCLCBUYXJnZXRGbGFncykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZEZyYW1lSW5kZXgoaW50IElkeCkgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKCpNRiwgTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUZJKElkeCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZENvbnN0YW50UG9vbEluZGV4KHVuc2lnbmVkIElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE9mZnNldCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKCpNRiwgTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUNQSShJZHgsIE9mZnNldCwgVGFyZ2V0RmxhZ3MpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGRUYXJnZXRJbmRleCh1bnNpZ25lZCBJZHgsIGludDY0X3QgT2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKSBjb25zdCB7CisgICAgTUktPmFkZE9wZXJhbmQoKk1GLCBNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlVGFyZ2V0SW5kZXgoSWR4LCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0RmxhZ3MpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGRKdW1wVGFibGVJbmRleCh1bnNpZ25lZCBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKCpNRiwgTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUpUSShJZHgsIFRhcmdldEZsYWdzKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkR2xvYmFsQWRkcmVzcyhjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBPZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApIGNvbnN0IHsKKyAgICBNSS0+YWRkT3BlcmFuZCgqTUYsIE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVHQShHViwgT2Zmc2V0LCBUYXJnZXRGbGFncykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZEV4dGVybmFsU3ltYm9sKGNvbnN0IGNoYXIgKkZuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKSBjb25zdCB7CisgICAgTUktPmFkZE9wZXJhbmQoKk1GLCBNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlRVMoRm5OYW1lLCBUYXJnZXRGbGFncykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZEJsb2NrQWRkcmVzcyhjb25zdCBCbG9ja0FkZHJlc3MgKkJBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBPZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApIGNvbnN0IHsKKyAgICBNSS0+YWRkT3BlcmFuZCgqTUYsIE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVCQShCQSwgT2Zmc2V0LCBUYXJnZXRGbGFncykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZFJlZ01hc2soY29uc3QgdWludDMyX3QgKk1hc2spIGNvbnN0IHsKKyAgICBNSS0+YWRkT3BlcmFuZCgqTUYsIE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVSZWdNYXNrKE1hc2spKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGRNZW1PcGVyYW5kKE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pIGNvbnN0IHsKKyAgICBNSS0+YWRkTWVtT3BlcmFuZCgqTUYsIE1NTyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmc2V0TWVtUmVmcyhNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yIGUpIGNvbnN0IHsKKyAgICBNSS0+c2V0TWVtUmVmcyhiLCBlKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZzZXRNZW1SZWZzKHN0ZDo6cGFpcjxNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZD4gTWVtT3BlcmFuZHNSZWYpIGNvbnN0IHsKKyAgICBNSS0+c2V0TWVtUmVmcyhNZW1PcGVyYW5kc1JlZik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTykgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKCpNRiwgTU8pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZChBcnJheVJlZjxNYWNoaW5lT3BlcmFuZD4gTU9zKSBjb25zdCB7CisgICAgZm9yIChjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gOiBNT3MpIHsKKyAgICAgIE1JLT5hZGRPcGVyYW5kKCpNRiwgTU8pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGRNZXRhZGF0YShjb25zdCBNRE5vZGUgKk1EKSBjb25zdCB7CisgICAgTUktPmFkZE9wZXJhbmQoKk1GLCBNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlTWV0YWRhdGEoTUQpKTsKKyAgICBhc3NlcnQoKE1JLT5pc0RlYnVnVmFsdWUoKSA/IHN0YXRpY19jYXN0PGJvb2w+KE1JLT5nZXREZWJ1Z1ZhcmlhYmxlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0cnVlKSAmJgorICAgICAgICAgICAiZmlyc3QgTUROb2RlIGFyZ3VtZW50IG9mIGEgREJHX1ZBTFVFIG5vdCBhIHZhcmlhYmxlIik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkQ0ZJSW5kZXgodW5zaWduZWQgQ0ZJSW5kZXgpIGNvbnN0IHsKKyAgICBNSS0+YWRkT3BlcmFuZCgqTUYsIE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVDRklJbmRleChDRklJbmRleCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZEludHJpbnNpY0lEKEludHJpbnNpYzo6SUQgSUQpIGNvbnN0IHsKKyAgICBNSS0+YWRkT3BlcmFuZCgqTUYsIE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVJbnRyaW5zaWNJRChJRCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZFByZWRpY2F0ZShDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCkgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKCpNRiwgTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVByZWRpY2F0ZShQcmVkKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkU3ltKE1DU3ltYm9sICpTeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKCpNRiwgTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZU1DU3ltYm9sKFN5bSwgVGFyZ2V0RmxhZ3MpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZzZXRNSUZsYWdzKHVuc2lnbmVkIEZsYWdzKSBjb25zdCB7CisgICAgTUktPnNldEZsYWdzKEZsYWdzKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZzZXRNSUZsYWcoTWFjaGluZUluc3RyOjpNSUZsYWcgRmxhZykgY29uc3QgeworICAgIE1JLT5zZXRGbGFnKEZsYWcpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEFkZCBhIGRpc3BsYWNlbWVudCBmcm9tIGFuIGV4aXN0aW5nIE1hY2hpbmVPcGVyYW5kIHdpdGggYW4gYWRkZWQgb2Zmc2V0LgorICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGREaXNwKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZEaXNwLCBpbnQ2NF90IG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgY29uc3QgeworICAgIC8vIElmIGNhbGxlciBzcGVjaWZpZXMgbmV3IFRhcmdldEZsYWdzIHRoZW4gdXNlIGl0LCBvdGhlcndpc2UgdGhlCisgICAgLy8gZGVmYXVsdCBiZWhhdmlvciBpcyB0byBjb3B5IHRoZSB0YXJnZXQgZmxhZ3MgZnJvbSB0aGUgZXhpc3RpbmcKKyAgICAvLyBNYWNoaW5lT3BlcmFuZC4gVGhpcyBtZWFucyBpZiB0aGUgY2FsbGVyIHdhbnRzIHRvIGNsZWFyIHRoZQorICAgIC8vIHRhcmdldCBmbGFncyBpdCBuZWVkcyB0byBkbyBzbyBleHBsaWNpdGx5LgorICAgIGlmICgwID09IFRhcmdldEZsYWdzKQorICAgICAgVGFyZ2V0RmxhZ3MgPSBEaXNwLmdldFRhcmdldEZsYWdzKCk7CisKKyAgICBzd2l0Y2ggKERpc3AuZ2V0VHlwZSgpKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgb3BlcmFuZCB0eXBlIGluIGFkZERpc3AoKSIpOworICAgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fSW1tZWRpYXRlOgorICAgICAgICByZXR1cm4gYWRkSW1tKERpc3AuZ2V0SW1tKCkgKyBvZmYpOworICAgICAgY2FzZSBNYWNoaW5lT3BlcmFuZDo6TU9fQ29uc3RhbnRQb29sSW5kZXg6CisgICAgICAgIHJldHVybiBhZGRDb25zdGFudFBvb2xJbmRleChEaXNwLmdldEluZGV4KCksIERpc3AuZ2V0T2Zmc2V0KCkgKyBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRGbGFncyk7CisgICAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19HbG9iYWxBZGRyZXNzOgorICAgICAgICByZXR1cm4gYWRkR2xvYmFsQWRkcmVzcyhEaXNwLmdldEdsb2JhbCgpLCBEaXNwLmdldE9mZnNldCgpICsgb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRGbGFncyk7CisgICAgfQorICB9CisKKyAgLy8vIENvcHkgYWxsIHRoZSBpbXBsaWNpdCBvcGVyYW5kcyBmcm9tIE90aGVyTUkgb250byB0aGlzIG9uZS4KKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmCisgIGNvcHlJbXBsaWNpdE9wcyhjb25zdCBNYWNoaW5lSW5zdHIgJk90aGVyTUkpIGNvbnN0IHsKKyAgICBNSS0+Y29weUltcGxpY2l0T3BzKCpNRiwgT3RoZXJNSSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgYm9vbCBjb25zdHJhaW5BbGxVc2VzKGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWdpc3RlckJhbmtJbmZvICZSQkkpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RyYWluU2VsZWN0ZWRJbnN0UmVnT3BlcmFuZHMoKk1JLCBUSUksIFRSSSwgUkJJKTsKKyAgfQorfTsKKworLy8vIEJ1aWxkZXIgaW50ZXJmYWNlLiBTcGVjaWZ5IGhvdyB0byBjcmVhdGUgdGhlIGluaXRpYWwgaW5zdHJ1Y3Rpb24gaXRzZWxmLgoraW5saW5lIE1hY2hpbmVJbnN0ckJ1aWxkZXIgQnVpbGRNSShNYWNoaW5lRnVuY3Rpb24gJk1GLCBjb25zdCBEZWJ1Z0xvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DSW5zdHJEZXNjICZNQ0lEKSB7CisgIHJldHVybiBNYWNoaW5lSW5zdHJCdWlsZGVyKE1GLCBNRi5DcmVhdGVNYWNoaW5lSW5zdHIoTUNJRCwgREwpKTsKK30KKworLy8vIFRoaXMgdmVyc2lvbiBvZiB0aGUgYnVpbGRlciBzZXRzIHVwIHRoZSBmaXJzdCBvcGVyYW5kIGFzIGEKKy8vLyBkZXN0aW5hdGlvbiB2aXJ0dWFsIHJlZ2lzdGVyLgoraW5saW5lIE1hY2hpbmVJbnN0ckJ1aWxkZXIgQnVpbGRNSShNYWNoaW5lRnVuY3Rpb24gJk1GLCBjb25zdCBEZWJ1Z0xvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DSW5zdHJEZXNjICZNQ0lELCB1bnNpZ25lZCBEZXN0UmVnKSB7CisgIHJldHVybiBNYWNoaW5lSW5zdHJCdWlsZGVyKE1GLCBNRi5DcmVhdGVNYWNoaW5lSW5zdHIoTUNJRCwgREwpKQorICAgICAgICAgICAuYWRkUmVnKERlc3RSZWcsIFJlZ1N0YXRlOjpEZWZpbmUpOworfQorCisvLy8gVGhpcyB2ZXJzaW9uIG9mIHRoZSBidWlsZGVyIGluc2VydHMgdGhlIG5ld2x5LWJ1aWx0IGluc3RydWN0aW9uIGJlZm9yZQorLy8vIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgZ2l2ZW4gTWFjaGluZUJhc2ljQmxvY2ssIGFuZCBzZXRzIHVwIHRoZSBmaXJzdAorLy8vIG9wZXJhbmQgYXMgYSBkZXN0aW5hdGlvbiB2aXJ0dWFsIHJlZ2lzdGVyLgoraW5saW5lIE1hY2hpbmVJbnN0ckJ1aWxkZXIgQnVpbGRNSShNYWNoaW5lQmFzaWNCbG9jayAmQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z0xvYyAmREwsIGNvbnN0IE1DSW5zdHJEZXNjICZNQ0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnKSB7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqQkIuZ2V0UGFyZW50KCk7CisgIE1hY2hpbmVJbnN0ciAqTUkgPSBNRi5DcmVhdGVNYWNoaW5lSW5zdHIoTUNJRCwgREwpOworICBCQi5pbnNlcnQoSSwgTUkpOworICByZXR1cm4gTWFjaGluZUluc3RyQnVpbGRlcihNRiwgTUkpLmFkZFJlZyhEZXN0UmVnLCBSZWdTdGF0ZTo6RGVmaW5lKTsKK30KKworLy8vIFRoaXMgdmVyc2lvbiBvZiB0aGUgYnVpbGRlciBpbnNlcnRzIHRoZSBuZXdseS1idWlsdCBpbnN0cnVjdGlvbiBiZWZvcmUKKy8vLyB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGdpdmVuIE1hY2hpbmVCYXNpY0Jsb2NrLCBhbmQgc2V0cyB1cCB0aGUgZmlyc3QKKy8vLyBvcGVyYW5kIGFzIGEgZGVzdGluYXRpb24gdmlydHVhbCByZWdpc3Rlci4KKy8vLworLy8vIElmIFxjIEkgaXMgaW5zaWRlIGEgYnVuZGxlLCB0aGVuIHRoZSBuZXdseSBpbnNlcnRlZCBcYSBNYWNoaW5lSW5zdHIgaXMKKy8vLyBhZGRlZCB0byB0aGUgc2FtZSBidW5kbGUuCitpbmxpbmUgTWFjaGluZUluc3RyQnVpbGRlciBCdWlsZE1JKE1hY2hpbmVCYXNpY0Jsb2NrICZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Omluc3RyX2l0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnTG9jICZETCwgY29uc3QgTUNJbnN0ckRlc2MgJk1DSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcpIHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpCQi5nZXRQYXJlbnQoKTsKKyAgTWFjaGluZUluc3RyICpNSSA9IE1GLkNyZWF0ZU1hY2hpbmVJbnN0cihNQ0lELCBETCk7CisgIEJCLmluc2VydChJLCBNSSk7CisgIHJldHVybiBNYWNoaW5lSW5zdHJCdWlsZGVyKE1GLCBNSSkuYWRkUmVnKERlc3RSZWcsIFJlZ1N0YXRlOjpEZWZpbmUpOworfQorCitpbmxpbmUgTWFjaGluZUluc3RyQnVpbGRlciBCdWlsZE1JKE1hY2hpbmVCYXNpY0Jsb2NrICZCQiwgTWFjaGluZUluc3RyICZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z0xvYyAmREwsIGNvbnN0IE1DSW5zdHJEZXNjICZNQ0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnKSB7CisgIC8vIENhbGxpbmcgdGhlIG92ZXJsb2FkIGZvciBpbnN0cl9pdGVyYXRvciBpcyBhbHdheXMgY29ycmVjdC4gIEhvd2V2ZXIsIHRoZQorICAvLyBkZWZpbml0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4gaGVhZGVycywgc28gaW5saW5lIHRoZSBjaGVjay4KKyAgaWYgKEkuaXNJbnNpZGVCdW5kbGUoKSkKKyAgICByZXR1cm4gQnVpbGRNSShCQiwgTWFjaGluZUJhc2ljQmxvY2s6Omluc3RyX2l0ZXJhdG9yKEkpLCBETCwgTUNJRCwgRGVzdFJlZyk7CisgIHJldHVybiBCdWlsZE1JKEJCLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IoSSksIERMLCBNQ0lELCBEZXN0UmVnKTsKK30KKworaW5saW5lIE1hY2hpbmVJbnN0ckJ1aWxkZXIgQnVpbGRNSShNYWNoaW5lQmFzaWNCbG9jayAmQkIsIE1hY2hpbmVJbnN0ciAqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdMb2MgJkRMLCBjb25zdCBNQ0luc3RyRGVzYyAmTUNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZykgeworICByZXR1cm4gQnVpbGRNSShCQiwgKkksIERMLCBNQ0lELCBEZXN0UmVnKTsKK30KKworLy8vIFRoaXMgdmVyc2lvbiBvZiB0aGUgYnVpbGRlciBpbnNlcnRzIHRoZSBuZXdseS1idWlsdCBpbnN0cnVjdGlvbiBiZWZvcmUgdGhlCisvLy8gZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGdpdmVuIE1hY2hpbmVCYXNpY0Jsb2NrLCBhbmQgZG9lcyBOT1QgdGFrZSBhCisvLy8gZGVzdGluYXRpb24gcmVnaXN0ZXIuCitpbmxpbmUgTWFjaGluZUluc3RyQnVpbGRlciBCdWlsZE1JKE1hY2hpbmVCYXNpY0Jsb2NrICZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnTG9jICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNJbnN0ckRlc2MgJk1DSUQpIHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpCQi5nZXRQYXJlbnQoKTsKKyAgTWFjaGluZUluc3RyICpNSSA9IE1GLkNyZWF0ZU1hY2hpbmVJbnN0cihNQ0lELCBETCk7CisgIEJCLmluc2VydChJLCBNSSk7CisgIHJldHVybiBNYWNoaW5lSW5zdHJCdWlsZGVyKE1GLCBNSSk7Cit9CisKK2lubGluZSBNYWNoaW5lSW5zdHJCdWlsZGVyIEJ1aWxkTUkoTWFjaGluZUJhc2ljQmxvY2sgJkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aW5zdHJfaXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdMb2MgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0luc3RyRGVzYyAmTUNJRCkgeworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKkJCLmdldFBhcmVudCgpOworICBNYWNoaW5lSW5zdHIgKk1JID0gTUYuQ3JlYXRlTWFjaGluZUluc3RyKE1DSUQsIERMKTsKKyAgQkIuaW5zZXJ0KEksIE1JKTsKKyAgcmV0dXJuIE1hY2hpbmVJbnN0ckJ1aWxkZXIoTUYsIE1JKTsKK30KKworaW5saW5lIE1hY2hpbmVJbnN0ckJ1aWxkZXIgQnVpbGRNSShNYWNoaW5lQmFzaWNCbG9jayAmQkIsIE1hY2hpbmVJbnN0ciAmSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdMb2MgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0luc3RyRGVzYyAmTUNJRCkgeworICAvLyBDYWxsaW5nIHRoZSBvdmVybG9hZCBmb3IgaW5zdHJfaXRlcmF0b3IgaXMgYWx3YXlzIGNvcnJlY3QuICBIb3dldmVyLCB0aGUKKyAgLy8gZGVmaW5pdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluIGhlYWRlcnMsIHNvIGlubGluZSB0aGUgY2hlY2suCisgIGlmIChJLmlzSW5zaWRlQnVuZGxlKCkpCisgICAgcmV0dXJuIEJ1aWxkTUkoQkIsIE1hY2hpbmVCYXNpY0Jsb2NrOjppbnN0cl9pdGVyYXRvcihJKSwgREwsIE1DSUQpOworICByZXR1cm4gQnVpbGRNSShCQiwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yKEkpLCBETCwgTUNJRCk7Cit9CisKK2lubGluZSBNYWNoaW5lSW5zdHJCdWlsZGVyIEJ1aWxkTUkoTWFjaGluZUJhc2ljQmxvY2sgJkJCLCBNYWNoaW5lSW5zdHIgKkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnTG9jICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNJbnN0ckRlc2MgJk1DSUQpIHsKKyAgcmV0dXJuIEJ1aWxkTUkoQkIsICpJLCBETCwgTUNJRCk7Cit9CisKKy8vLyBUaGlzIHZlcnNpb24gb2YgdGhlIGJ1aWxkZXIgaW5zZXJ0cyB0aGUgbmV3bHktYnVpbHQgaW5zdHJ1Y3Rpb24gYXQgdGhlIGVuZAorLy8vIG9mIHRoZSBnaXZlbiBNYWNoaW5lQmFzaWNCbG9jaywgYW5kIGRvZXMgTk9UIHRha2UgYSBkZXN0aW5hdGlvbiByZWdpc3Rlci4KK2lubGluZSBNYWNoaW5lSW5zdHJCdWlsZGVyIEJ1aWxkTUkoTWFjaGluZUJhc2ljQmxvY2sgKkJCLCBjb25zdCBEZWJ1Z0xvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DSW5zdHJEZXNjICZNQ0lEKSB7CisgIHJldHVybiBCdWlsZE1JKCpCQiwgQkItPmVuZCgpLCBETCwgTUNJRCk7Cit9CisKKy8vLyBUaGlzIHZlcnNpb24gb2YgdGhlIGJ1aWxkZXIgaW5zZXJ0cyB0aGUgbmV3bHktYnVpbHQgaW5zdHJ1Y3Rpb24gYXQgdGhlCisvLy8gZW5kIG9mIHRoZSBnaXZlbiBNYWNoaW5lQmFzaWNCbG9jaywgYW5kIHNldHMgdXAgdGhlIGZpcnN0IG9wZXJhbmQgYXMgYQorLy8vIGRlc3RpbmF0aW9uIHZpcnR1YWwgcmVnaXN0ZXIuCitpbmxpbmUgTWFjaGluZUluc3RyQnVpbGRlciBCdWlsZE1JKE1hY2hpbmVCYXNpY0Jsb2NrICpCQiwgY29uc3QgRGVidWdMb2MgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0luc3RyRGVzYyAmTUNJRCwgdW5zaWduZWQgRGVzdFJlZykgeworICByZXR1cm4gQnVpbGRNSSgqQkIsIEJCLT5lbmQoKSwgREwsIE1DSUQsIERlc3RSZWcpOworfQorCisvLy8gVGhpcyB2ZXJzaW9uIG9mIHRoZSBidWlsZGVyIGJ1aWxkcyBhIERCR19WQUxVRSBpbnRyaW5zaWMKKy8vLyBmb3IgZWl0aGVyIGEgdmFsdWUgaW4gYSByZWdpc3RlciBvciBhIHJlZ2lzdGVyLWluZGlyZWN0CisvLy8gYWRkcmVzcy4gIFRoZSBjb252ZW50aW9uIGlzIHRoYXQgYSBEQkdfVkFMVUUgaXMgaW5kaXJlY3QgaWZmIHRoZQorLy8vIHNlY29uZCBvcGVyYW5kIGlzIGFuIGltbWVkaWF0ZS4KK01hY2hpbmVJbnN0ckJ1aWxkZXIgQnVpbGRNSShNYWNoaW5lRnVuY3Rpb24gJk1GLCBjb25zdCBEZWJ1Z0xvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNJbnN0ckRlc2MgJk1DSUQsIGJvb2wgSXNJbmRpcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWcsIGNvbnN0IE1ETm9kZSAqVmFyaWFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUROb2RlICpFeHByKTsKKworLy8vIFRoaXMgdmVyc2lvbiBvZiB0aGUgYnVpbGRlciBidWlsZHMgYSBEQkdfVkFMVUUgaW50cmluc2ljCisvLy8gZm9yIGVpdGhlciBhIHZhbHVlIGluIGEgcmVnaXN0ZXIgb3IgYSByZWdpc3Rlci1pbmRpcmVjdAorLy8vIGFkZHJlc3MgYW5kIGluc2VydHMgaXQgYXQgcG9zaXRpb24gSS4KK01hY2hpbmVJbnN0ckJ1aWxkZXIgQnVpbGRNSShNYWNoaW5lQmFzaWNCbG9jayAmQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIGNvbnN0IERlYnVnTG9jICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0luc3RyRGVzYyAmTUNJRCwgYm9vbCBJc0luZGlyZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZywgY29uc3QgTUROb2RlICpWYXJpYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKkV4cHIpOworCisvLy8gQ2xvbmUgYSBEQkdfVkFMVUUgd2hvc2UgdmFsdWUgaGFzIGJlZW4gc3BpbGxlZCB0byBGcmFtZUluZGV4LgorTWFjaGluZUluc3RyICpidWlsZERiZ1ZhbHVlRm9yU3BpbGwoTWFjaGluZUJhc2ljQmxvY2sgJkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgJk9yaWcsIGludCBGcmFtZUluZGV4KTsKKworLy8vIFVwZGF0ZSBhIERCR19WQUxVRSB3aG9zZSB2YWx1ZSBoYXMgYmVlbiBzcGlsbGVkIHRvIEZyYW1lSW5kZXguIFVzZWZ1bCB3aGVuCisvLy8gbW9kaWZ5aW5nIGFuIGluc3RydWN0aW9uIGluIHBsYWNlIHdoaWxlIGl0ZXJhdGluZyBvdmVyIGEgYmFzaWMgYmxvY2suCit2b2lkIHVwZGF0ZURiZ1ZhbHVlRm9yU3BpbGwoTWFjaGluZUluc3RyICZPcmlnLCBpbnQgRnJhbWVJbmRleCk7CisKK2lubGluZSB1bnNpZ25lZCBnZXREZWZSZWdTdGF0ZShib29sIEIpIHsKKyAgcmV0dXJuIEIgPyBSZWdTdGF0ZTo6RGVmaW5lIDogMDsKK30KK2lubGluZSB1bnNpZ25lZCBnZXRJbXBsUmVnU3RhdGUoYm9vbCBCKSB7CisgIHJldHVybiBCID8gUmVnU3RhdGU6OkltcGxpY2l0IDogMDsKK30KK2lubGluZSB1bnNpZ25lZCBnZXRLaWxsUmVnU3RhdGUoYm9vbCBCKSB7CisgIHJldHVybiBCID8gUmVnU3RhdGU6OktpbGwgOiAwOworfQoraW5saW5lIHVuc2lnbmVkIGdldERlYWRSZWdTdGF0ZShib29sIEIpIHsKKyAgcmV0dXJuIEIgPyBSZWdTdGF0ZTo6RGVhZCA6IDA7Cit9CitpbmxpbmUgdW5zaWduZWQgZ2V0VW5kZWZSZWdTdGF0ZShib29sIEIpIHsKKyAgcmV0dXJuIEIgPyBSZWdTdGF0ZTo6VW5kZWYgOiAwOworfQoraW5saW5lIHVuc2lnbmVkIGdldEludGVybmFsUmVhZFJlZ1N0YXRlKGJvb2wgQikgeworICByZXR1cm4gQiA/IFJlZ1N0YXRlOjpJbnRlcm5hbFJlYWQgOiAwOworfQoraW5saW5lIHVuc2lnbmVkIGdldERlYnVnUmVnU3RhdGUoYm9vbCBCKSB7CisgIHJldHVybiBCID8gUmVnU3RhdGU6OkRlYnVnIDogMDsKK30KK2lubGluZSB1bnNpZ25lZCBnZXRSZW5hbWFibGVSZWdTdGF0ZShib29sIEIpIHsKKyAgcmV0dXJuIEIgPyBSZWdTdGF0ZTo6UmVuYW1hYmxlIDogMDsKK30KKworLy8vIEdldCBhbGwgcmVnaXN0ZXIgc3RhdGUgZmxhZ3MgZnJvbSBtYWNoaW5lIG9wZXJhbmQgXHAgUmVnT3AuCitpbmxpbmUgdW5zaWduZWQgZ2V0UmVnU3RhdGUoY29uc3QgTWFjaGluZU9wZXJhbmQgJlJlZ09wKSB7CisgIGFzc2VydChSZWdPcC5pc1JlZygpICYmICJOb3QgYSByZWdpc3RlciBvcGVyYW5kIik7CisgIHJldHVybiBnZXREZWZSZWdTdGF0ZShSZWdPcC5pc0RlZigpKSAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgZ2V0SW1wbFJlZ1N0YXRlKFJlZ09wLmlzSW1wbGljaXQoKSkgICAgICAgICAgICAgIHwKKyAgICAgICAgIGdldEtpbGxSZWdTdGF0ZShSZWdPcC5pc0tpbGwoKSkgICAgICAgICAgICAgICAgICB8CisgICAgICAgICBnZXREZWFkUmVnU3RhdGUoUmVnT3AuaXNEZWFkKCkpICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgZ2V0VW5kZWZSZWdTdGF0ZShSZWdPcC5pc1VuZGVmKCkpICAgICAgICAgICAgICAgIHwKKyAgICAgICAgIGdldEludGVybmFsUmVhZFJlZ1N0YXRlKFJlZ09wLmlzSW50ZXJuYWxSZWFkKCkpICB8CisgICAgICAgICBnZXREZWJ1Z1JlZ1N0YXRlKFJlZ09wLmlzRGVidWcoKSkgICAgICAgICAgICAgICAgfAorICAgICAgICAgZ2V0UmVuYW1hYmxlUmVnU3RhdGUoCisgICAgICAgICAgICAgVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUmVnT3AuZ2V0UmVnKCkpICYmCisgICAgICAgICAgICAgUmVnT3AuaXNSZW5hbWFibGUoKSk7Cit9CisKKy8vLyBIZWxwZXIgY2xhc3MgZm9yIGNvbnN0cnVjdGluZyBidW5kbGVzIG9mIE1hY2hpbmVJbnN0cnMuCisvLy8KKy8vLyBNSUJ1bmRsZUJ1aWxkZXIgY2FuIGNyZWF0ZSBhIGJ1bmRsZSBmcm9tIHNjcmF0Y2ggYnkgaW5zZXJ0aW5nIG5ldworLy8vIE1hY2hpbmVJbnN0cnMgb25lIGF0IGEgdGltZSwgb3IgaXQgY2FuIGNyZWF0ZSBhIGJ1bmRsZSBmcm9tIGEgc2VxdWVuY2Ugb2YKKy8vLyBleGlzdGluZyBNYWNoaW5lSW5zdHJzIGluIGEgYmFzaWMgYmxvY2suCitjbGFzcyBNSUJ1bmRsZUJ1aWxkZXIgeworICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCOworICBNYWNoaW5lQmFzaWNCbG9jazo6aW5zdHJfaXRlcmF0b3IgQmVnaW47CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppbnN0cl9pdGVyYXRvciBFbmQ7CisKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZSBhbiBNSUJ1bmRsZUJ1aWxkZXIgdGhhdCBpbnNlcnRzIGluc3RydWN0aW9ucyBpbnRvIGEgbmV3IGJ1bmRsZSBpbgorICAvLy8gQkIgYWJvdmUgdGhlIGJ1bmRsZSBvciBpbnN0cnVjdGlvbiBhdCBQb3MuCisgIE1JQnVuZGxlQnVpbGRlcihNYWNoaW5lQmFzaWNCbG9jayAmQkIsIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBQb3MpCisgICAgICA6IE1CQihCQiksIEJlZ2luKFBvcy5nZXRJbnN0ckl0ZXJhdG9yKCkpLCBFbmQoQmVnaW4pIHt9CisKKyAgLy8vIENyZWF0ZSBhIGJ1bmRsZSBmcm9tIHRoZSBzZXF1ZW5jZSBvZiBpbnN0cnVjdGlvbnMgYmV0d2VlbiBCIGFuZCBFLgorICBNSUJ1bmRsZUJ1aWxkZXIoTWFjaGluZUJhc2ljQmxvY2sgJkJCLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgQiwKKyAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBFKQorICAgICAgOiBNQkIoQkIpLCBCZWdpbihCLmdldEluc3RySXRlcmF0b3IoKSksIEVuZChFLmdldEluc3RySXRlcmF0b3IoKSkgeworICAgIGFzc2VydChCICE9IEUgJiYgIk5vIGluc3RydWN0aW9ucyB0byBidW5kbGUiKTsKKyAgICArK0I7CisgICAgd2hpbGUgKEIgIT0gRSkgeworICAgICAgTWFjaGluZUluc3RyICZNSSA9ICpCOworICAgICAgKytCOworICAgICAgTUkuYnVuZGxlV2l0aFByZWQoKTsKKyAgICB9CisgIH0KKworICAvLy8gQ3JlYXRlIGFuIE1JQnVuZGxlQnVpbGRlciByZXByZXNlbnRpbmcgYW4gZXhpc3RpbmcgaW5zdHJ1Y3Rpb24gb3IgYnVuZGxlCisgIC8vLyB0aGF0IGhhcyBNSSBhcyBpdHMgaGVhZC4KKyAgZXhwbGljaXQgTUlCdW5kbGVCdWlsZGVyKE1hY2hpbmVJbnN0ciAqTUkpCisgICAgICA6IE1CQigqTUktPmdldFBhcmVudCgpKSwgQmVnaW4oTUkpLAorICAgICAgICBFbmQoZ2V0QnVuZGxlRW5kKE1JLT5nZXRJdGVyYXRvcigpKSkge30KKworICAvLy8gUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBiYXNpYyBibG9jayBjb250YWluaW5nIHRoaXMgYnVuZGxlLgorICBNYWNoaW5lQmFzaWNCbG9jayAmZ2V0TUJCKCkgY29uc3QgeyByZXR1cm4gTUJCOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIG5vIGluc3RydWN0aW9ucyBoYXZlIGJlZW4gaW5zZXJ0ZWQgaW4gdGhpcyBidW5kbGUgeWV0LgorICAvLy8gRW1wdHkgYnVuZGxlcyBhcmVuJ3QgcmVwcmVzZW50YWJsZSBpbiBhIE1hY2hpbmVCYXNpY0Jsb2NrLgorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gQmVnaW4gPT0gRW5kOyB9CisKKyAgLy8vIFJldHVybiBhbiBpdGVyYXRvciB0byB0aGUgZmlyc3QgYnVuZGxlZCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUJhc2ljQmxvY2s6Omluc3RyX2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gQmVnaW47IH0KKworICAvLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIGJleW9uZCB0aGUgbGFzdCBidW5kbGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lQmFzaWNCbG9jazo6aW5zdHJfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gRW5kOyB9CisKKyAgLy8vIEluc2VydCBNSSBpbnRvIHRoaXMgYnVuZGxlIGJlZm9yZSBJIHdoaWNoIG11c3QgcG9pbnQgdG8gYW4gaW5zdHJ1Y3Rpb24gaW4KKyAgLy8vIHRoZSBidW5kbGUsIG9yIGVuZCgpLgorICBNSUJ1bmRsZUJ1aWxkZXIgJmluc2VydChNYWNoaW5lQmFzaWNCbG9jazo6aW5zdHJfaXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpNSSkgeworICAgIE1CQi5pbnNlcnQoSSwgTUkpOworICAgIGlmIChJID09IEJlZ2luKSB7CisgICAgICBpZiAoIWVtcHR5KCkpCisgICAgICAgIE1JLT5idW5kbGVXaXRoU3VjYygpOworICAgICAgQmVnaW4gPSBNSS0+Z2V0SXRlcmF0b3IoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgaWYgKEkgPT0gRW5kKSB7CisgICAgICBNSS0+YnVuZGxlV2l0aFByZWQoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgLy8gTUkgd2FzIGluc2VydGVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIGJ1bmRsZSwgc28gaXRzIG5laWdoYm9ycycgZmxhZ3MgYXJlCisgICAgLy8gYWxyZWFkeSBmaW5lLiBVcGRhdGUgTUkncyBidW5kbGUgZmxhZ3MgbWFudWFsbHkuCisgICAgTUktPnNldEZsYWcoTWFjaGluZUluc3RyOjpCdW5kbGVkUHJlZCk7CisgICAgTUktPnNldEZsYWcoTWFjaGluZUluc3RyOjpCdW5kbGVkU3VjYyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIEluc2VydCBNSSBpbnRvIE1CQiBieSBwcmVwZW5kaW5nIGl0IHRvIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIGJ1bmRsZS4KKyAgLy8vIE1JIHdpbGwgYmVjb21lIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpbiB0aGUgYnVuZGxlLgorICBNSUJ1bmRsZUJ1aWxkZXIgJnByZXBlbmQoTWFjaGluZUluc3RyICpNSSkgeworICAgIHJldHVybiBpbnNlcnQoYmVnaW4oKSwgTUkpOworICB9CisKKyAgLy8vIEluc2VydCBNSSBpbnRvIE1CQiBieSBhcHBlbmRpbmcgaXQgdG8gdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgYnVuZGxlLgorICAvLy8gTUkgd2lsbCBiZWNvbWUgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlIGJ1bmRsZS4KKyAgTUlCdW5kbGVCdWlsZGVyICZhcHBlbmQoTWFjaGluZUluc3RyICpNSSkgeworICAgIHJldHVybiBpbnNlcnQoZW5kKCksIE1JKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9NQUNISU5FSU5TVFJCVUlMREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdW5kbGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdW5kbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTM0MWZkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1bmRsZS5oCkBAIC0wLDAgKzEsMjYxIEBACisvLz09PS0tIENvZGVHZW4vTWFjaGluZUluc3RCdW5kbGUuaCAtIE1JIGJ1bmRsZSB1dGlsaXRpZXMgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlIHV0aWxpdHkgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgbWFjaGluZSBpbnN0cnVjdGlvbgorLy8gYnVuZGxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FSU5TVFJCVU5ETEVfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORUlOU1RSQlVORExFX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBmaW5hbGl6ZUJ1bmRsZSAtIEZpbmFsaXplIGEgbWFjaGluZSBpbnN0cnVjdGlvbiBidW5kbGUgd2hpY2ggaW5jbHVkZXMKKy8vLyBhIHNlcXVlbmNlIG9mIGluc3RydWN0aW9ucyBzdGFydGluZyBmcm9tIEZpcnN0TUkgdG8gTGFzdE1JIChleGNsdXNpdmUpLgorLy8vIFRoaXMgcm91dGluZSBhZGRzIGEgQlVORExFIGluc3RydWN0aW9uIHRvIHJlcHJlc2VudCB0aGUgYnVuZGxlLCBpdCBhZGRzCisvLy8gSXNJbnRlcm5hbFJlYWQgbWFya2VycyB0byBNYWNoaW5lT3BlcmFuZHMgd2hpY2ggYXJlIGRlZmluZWQgaW5zaWRlIHRoZQorLy8vIGJ1bmRsZSwgYW5kIGl0IGNvcGllcyBleHRlcm5hbGx5IHZpc2libGUgZGVmcyBhbmQgdXNlcyB0byB0aGUgQlVORExFCisvLy8gaW5zdHJ1Y3Rpb24uCit2b2lkIGZpbmFsaXplQnVuZGxlKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppbnN0cl9pdGVyYXRvciBGaXJzdE1JLAorICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aW5zdHJfaXRlcmF0b3IgTGFzdE1JKTsKKworLy8vIGZpbmFsaXplQnVuZGxlIC0gU2FtZSBmdW5jdGlvbmFsaXR5IGFzIHRoZSBwcmV2aW91cyBmaW5hbGl6ZUJ1bmRsZSBleGNlcHQKKy8vLyB0aGUgbGFzdCBpbnN0cnVjdGlvbiBpbiB0aGUgYnVuZGxlIGlzIG5vdCBwcm92aWRlZCBhcyBhbiBpbnB1dC4gVGhpcyBpcworLy8vIHVzZWQgaW4gY2FzZXMgd2hlcmUgYnVuZGxlcyBhcmUgcHJlLWRldGVybWluZWQgYnkgbWFya2luZyBpbnN0cnVjdGlvbnMKKy8vLyB3aXRoICdJbnNpZGVCdW5kbGUnIG1hcmtlci4gSXQgcmV0dXJucyB0aGUgTUJCIGluc3RydWN0aW9uIGl0ZXJhdG9yIHRoYXQKKy8vLyBwb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgYnVuZGxlLgorTWFjaGluZUJhc2ljQmxvY2s6Omluc3RyX2l0ZXJhdG9yIGZpbmFsaXplQnVuZGxlKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppbnN0cl9pdGVyYXRvciBGaXJzdE1JKTsKKworLy8vIGZpbmFsaXplQnVuZGxlcyAtIEZpbmFsaXplIGluc3RydWN0aW9uIGJ1bmRsZXMgaW4gdGhlIHNwZWNpZmllZAorLy8vIE1hY2hpbmVGdW5jdGlvbi4gUmV0dXJuIHRydWUgaWYgYW55IGJ1bmRsZXMgYXJlIGZpbmFsaXplZC4KK2Jvb2wgZmluYWxpemVCdW5kbGVzKE1hY2hpbmVGdW5jdGlvbiAmTUYpOworCisvLy8gUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlIGJ1bmRsZSBjb250YWluaW5nIFxwIEkuCitpbmxpbmUgTWFjaGluZUJhc2ljQmxvY2s6Omluc3RyX2l0ZXJhdG9yIGdldEJ1bmRsZVN0YXJ0KAorICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppbnN0cl9pdGVyYXRvciBJKSB7CisgIHdoaWxlIChJLT5pc0J1bmRsZWRXaXRoUHJlZCgpKQorICAgIC0tSTsKKyAgcmV0dXJuIEk7Cit9CisKKy8vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpbiB0aGUgYnVuZGxlIGNvbnRhaW5pbmcgXHAgSS4KK2lubGluZSBNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaW5zdHJfaXRlcmF0b3IgZ2V0QnVuZGxlU3RhcnQoCisgICAgTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2luc3RyX2l0ZXJhdG9yIEkpIHsKKyAgd2hpbGUgKEktPmlzQnVuZGxlZFdpdGhQcmVkKCkpCisgICAgLS1JOworICByZXR1cm4gSTsKK30KKworLy8vIFJldHVybnMgYW4gaXRlcmF0b3IgcG9pbnRpbmcgYmV5b25kIHRoZSBidW5kbGUgY29udGFpbmluZyBccCBJLgoraW5saW5lIE1hY2hpbmVCYXNpY0Jsb2NrOjppbnN0cl9pdGVyYXRvciBnZXRCdW5kbGVFbmQoCisgICAgTWFjaGluZUJhc2ljQmxvY2s6Omluc3RyX2l0ZXJhdG9yIEkpIHsKKyAgd2hpbGUgKEktPmlzQnVuZGxlZFdpdGhTdWNjKCkpCisgICAgKytJOworICByZXR1cm4gKytJOworfQorCisvLy8gUmV0dXJucyBhbiBpdGVyYXRvciBwb2ludGluZyBiZXlvbmQgdGhlIGJ1bmRsZSBjb250YWluaW5nIFxwIEkuCitpbmxpbmUgTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2luc3RyX2l0ZXJhdG9yIGdldEJ1bmRsZUVuZCgKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaW5zdHJfaXRlcmF0b3IgSSkgeworICB3aGlsZSAoSS0+aXNCdW5kbGVkV2l0aFN1Y2MoKSkKKyAgICArK0k7CisgIHJldHVybiArK0k7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYWNoaW5lT3BlcmFuZCBpdGVyYXRvcgorLy8KKworLy8vIE1hY2hpbmVPcGVyYW5kSXRlcmF0b3JCYXNlIC0gSXRlcmF0b3IgdGhhdCBjYW4gdmlzaXQgYWxsIG9wZXJhbmRzIG9uIGEKKy8vLyBNYWNoaW5lSW5zdHIsIG9yIGFsbCBvcGVyYW5kcyBvbiBhIGJ1bmRsZSBvZiBNYWNoaW5lSW5zdHJzLiAgVGhpcyBjbGFzcyBpcworLy8vIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5LCB1c2Ugb25lIG9mIHRoZSBzdWItY2xhc3NlcyBpbnN0ZWFkLgorLy8vCisvLy8gSW50ZW5kZWQgdXNlOgorLy8vCisvLy8gICBmb3IgKE1JQnVuZGxlT3BlcmFuZHMgTUlPKE1JKTsgTUlPLmlzVmFsaWQoKTsgKytNSU8pIHsKKy8vLyAgICAgaWYgKCFNSU8tPmlzUmVnKCkpCisvLy8gICAgICAgY29udGludWU7CisvLy8gICAgIC4uLgorLy8vICAgfQorLy8vCitjbGFzcyBNYWNoaW5lT3BlcmFuZEl0ZXJhdG9yQmFzZSB7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppbnN0cl9pdGVyYXRvciBJbnN0ckksIEluc3RyRTsKKyAgTWFjaGluZUluc3RyOjptb3BfaXRlcmF0b3IgT3BJLCBPcEU7CisKKyAgLy8gSWYgdGhlIG9wZXJhbmRzIG9uIEluc3RySSBhcmUgZXhoYXVzdGVkLCBhZHZhbmNlIEluc3RySSB0byB0aGUgbmV4dAorICAvLyBidW5kbGVkIGluc3RydWN0aW9uIHdpdGggb3BlcmFuZHMuCisgIHZvaWQgYWR2YW5jZSgpIHsKKyAgICB3aGlsZSAoT3BJID09IE9wRSkgeworICAgICAgLy8gRG9uJ3QgYWR2YW5jZSBvZmYgdGhlIGJhc2ljIGJsb2NrLCBvciBpbnRvIGEgbmV3IGJ1bmRsZS4KKyAgICAgIGlmICgrK0luc3RySSA9PSBJbnN0ckUgfHwgIUluc3RySS0+aXNJbnNpZGVCdW5kbGUoKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBPcEkgPSBJbnN0ckktPm9wZXJhbmRzX2JlZ2luKCk7CisgICAgICBPcEUgPSBJbnN0ckktPm9wZXJhbmRzX2VuZCgpOworICAgIH0KKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8vLyBNYWNoaW5lT3BlcmFuZEl0ZXJhdG9yQmFzZSAtIENyZWF0ZSBhbiBpdGVyYXRvciB0aGF0IHZpc2l0cyBhbGwgb3BlcmFuZHMKKyAgLy8vIG9uIE1JLCBvciBhbGwgb3BlcmFuZHMgb24gZXZlcnkgaW5zdHJ1Y3Rpb24gaW4gdGhlIGJ1bmRsZSBjb250YWluaW5nIE1JLgorICAvLy8KKyAgLy8vIEBwYXJhbSBNSSBUaGUgaW5zdHJ1Y3Rpb24gdG8gZXhhbWluZS4KKyAgLy8vIEBwYXJhbSBXaG9sZUJ1bmRsZSBXaGVuIHRydWUsIHZpc2l0IGFsbCBvcGVyYW5kcyBvbiB0aGUgZW50aXJlIGJ1bmRsZS4KKyAgLy8vCisgIGV4cGxpY2l0IE1hY2hpbmVPcGVyYW5kSXRlcmF0b3JCYXNlKE1hY2hpbmVJbnN0ciAmTUksIGJvb2wgV2hvbGVCdW5kbGUpIHsKKyAgICBpZiAoV2hvbGVCdW5kbGUpIHsKKyAgICAgIEluc3RySSA9IGdldEJ1bmRsZVN0YXJ0KE1JLmdldEl0ZXJhdG9yKCkpOworICAgICAgSW5zdHJFID0gTUkuZ2V0UGFyZW50KCktPmluc3RyX2VuZCgpOworICAgIH0gZWxzZSB7CisgICAgICBJbnN0ckkgPSBJbnN0ckUgPSBNSS5nZXRJdGVyYXRvcigpOworICAgICAgKytJbnN0ckU7CisgICAgfQorICAgIE9wSSA9IEluc3RySS0+b3BlcmFuZHNfYmVnaW4oKTsKKyAgICBPcEUgPSBJbnN0ckktPm9wZXJhbmRzX2VuZCgpOworICAgIGlmIChXaG9sZUJ1bmRsZSkKKyAgICAgIGFkdmFuY2UoKTsKKyAgfQorCisgIE1hY2hpbmVPcGVyYW5kICZkZXJlZigpIGNvbnN0IHsgcmV0dXJuICpPcEk7IH0KKworcHVibGljOgorICAvLy8gaXNWYWxpZCAtIFJldHVybnMgdHJ1ZSB1bnRpbCBhbGwgdGhlIG9wZXJhbmRzIGhhdmUgYmVlbiB2aXNpdGVkLgorICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBPcEkgIT0gT3BFOyB9CisKKyAgLy8vIFByZWluY3JlbWVudC4gIE1vdmUgdG8gdGhlIG5leHQgb3BlcmFuZC4KKyAgdm9pZCBvcGVyYXRvcisrKCkgeworICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIkNhbm5vdCBhZHZhbmNlIE1JT3BlcmFuZHMgYmV5b25kIHRoZSBsYXN0IG9wZXJhbmQiKTsKKyAgICArK09wSTsKKyAgICBhZHZhbmNlKCk7CisgIH0KKworICAvLy8gZ2V0T3BlcmFuZE5vIC0gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IG9wZXJhbmQgcmVsYXRpdmUgdG8gaXRzCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIHVuc2lnbmVkIGdldE9wZXJhbmRObygpIGNvbnN0IHsKKyAgICByZXR1cm4gT3BJIC0gSW5zdHJJLT5vcGVyYW5kc19iZWdpbigpOworICB9CisKKyAgLy8vIFZpcnRSZWdJbmZvIC0gSW5mb3JtYXRpb24gYWJvdXQgYSB2aXJ0dWFsIHJlZ2lzdGVyIHVzZWQgYnkgYSBzZXQgb2Ygb3BlcmFuZHMuCisgIC8vLworICBzdHJ1Y3QgVmlydFJlZ0luZm8geworICAgIC8vLyBSZWFkcyAtIE9uZSBvZiB0aGUgb3BlcmFuZHMgcmVhZCB0aGUgdmlydHVhbCByZWdpc3Rlci4gIFRoaXMgZG9lcyBub3QKKyAgICAvLy8gaW5jbHVkZSB1bmRlZiBvciBpbnRlcm5hbCB1c2Ugb3BlcmFuZHMsIHNlZSBNTzo6cmVhZHNSZWcoKS4KKyAgICBib29sIFJlYWRzOworCisgICAgLy8vIFdyaXRlcyAtIE9uZSBvZiB0aGUgb3BlcmFuZHMgd3JpdGVzIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyLgorICAgIGJvb2wgV3JpdGVzOworCisgICAgLy8vIFRpZWQgLSBVc2VzIGFuZCBkZWZzIG11c3QgdXNlIHRoZSBzYW1lIHJlZ2lzdGVyLiBUaGlzIGNhbiBiZSBiZWNhdXNlIG9mCisgICAgLy8vIGEgdHdvLWFkZHJlc3MgY29uc3RyYWludCwgb3IgdGhlcmUgbWF5IGJlIGEgcGFydGlhbCByZWRlZmluaXRpb24gb2YgYQorICAgIC8vLyBzdWItcmVnaXN0ZXIuCisgICAgYm9vbCBUaWVkOworICB9OworCisgIC8vLyBJbmZvcm1hdGlvbiBhYm91dCBob3cgYSBwaHlzaWNhbCByZWdpc3RlciBSZWcgaXMgdXNlZCBieSBhIHNldCBvZgorICAvLy8gb3BlcmFuZHMuCisgIHN0cnVjdCBQaHlzUmVnSW5mbyB7CisgICAgLy8vIFRoZXJlIGlzIGEgcmVnbWFzayBvcGVyYW5kIGluZGljYXRpbmcgUmVnIGlzIGNsb2JiZXJlZC4KKyAgICAvLy8gXHNlZSBNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlUmVnTWFzaygpLgorICAgIGJvb2wgQ2xvYmJlcmVkOworCisgICAgLy8vIFJlZyBvciBvbmUgb2YgaXRzIGFsaWFzZXMgaXMgZGVmaW5lZC4gVGhlIGRlZmluaXRpb24gbWF5IG9ubHkgY292ZXIKKyAgICAvLy8gcGFydHMgb2YgdGhlIHJlZ2lzdGVyLgorICAgIGJvb2wgRGVmaW5lZDsKKyAgICAvLy8gUmVnIG9yIGEgc3VwZXItcmVnaXN0ZXIgaXMgZGVmaW5lZC4gVGhlIGRlZmluaXRpb24gY292ZXJzIHRoZSBmdWxsCisgICAgLy8vIHJlZ2lzdGVyLgorICAgIGJvb2wgRnVsbHlEZWZpbmVkOworCisgICAgLy8vIFJlZyBvciBvbmUgb2YgaXRzIGFsaWFzZXMgaXMgcmVhZC4gVGhlIHJlZ2lzdGVyIG1heSBvbmx5IGJlIHJlYWQKKyAgICAvLy8gcGFydGlhbGx5LgorICAgIGJvb2wgUmVhZDsKKyAgICAvLy8gUmVnIG9yIGEgc3VwZXItcmVnaXN0ZXIgaXMgcmVhZC4gVGhlIGZ1bGwgcmVnaXN0ZXIgaXMgcmVhZC4KKyAgICBib29sIEZ1bGx5UmVhZDsKKworICAgIC8vLyBFaXRoZXI6CisgICAgLy8vIC0gUmVnIGlzIEZ1bGx5RGVmaW5lZCBhbmQgYWxsIGRlZnMgb2YgcmVnIG9yIGFuIG92ZXJsYXBwaW5nCisgICAgLy8vICAgcmVnaXN0ZXIgYXJlIGRlYWQsIG9yCisgICAgLy8vIC0gUmVnIGlzIGNvbXBsZXRlbHkgZGVhZCBiZWNhdXNlICJkZWZpbmVkIiBieSBhIGNsb2JiZXIuCisgICAgYm9vbCBEZWFkRGVmOworCisgICAgLy8vIFJlZyBpcyBEZWZpbmVkIGFuZCBhbGwgZGVmcyBvZiByZWcgb3IgYW4gb3ZlcmxhcHBpbmcgcmVnaXN0ZXIgYXJlCisgICAgLy8vIGRlYWQuCisgICAgYm9vbCBQYXJ0aWFsRGVhZERlZjsKKworICAgIC8vLyBUaGVyZSBpcyBhIHVzZSBvcGVyYW5kIG9mIHJlZyBvciBhIHN1cGVyLXJlZ2lzdGVyIHdpdGgga2lsbCBmbGFnIHNldC4KKyAgICBib29sIEtpbGxlZDsKKyAgfTsKKworICAvLy8gYW5hbHl6ZVZpcnRSZWcgLSBBbmFseXplIGhvdyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBvciBidW5kbGUgdXNlcyBhCisgIC8vLyB2aXJ0dWFsIHJlZ2lzdGVyLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciBvcGVyYXRvcisrKCksCisgIC8vLyBpdCBleHBlY3RzIGEgZnJlc2ggaXRlcmF0b3IuCisgIC8vLworICAvLy8gQHBhcmFtIFJlZyBUaGUgdmlydHVhbCByZWdpc3RlciB0byBhbmFseXplLgorICAvLy8gQHBhcmFtIE9wcyBXaGVuIHNldCwgdGhpcyB2ZWN0b3Igd2lsbCByZWNlaXZlIGFuIChNSSwgT3BOdW0pIGVudHJ5IGZvcgorICAvLy8gICAgICAgICAgICBlYWNoIG9wZXJhbmQgcmVmZXJyaW5nIHRvIFJlZy4KKyAgLy8vIEByZXR1cm5zIEEgZmlsbGVkLWluIFJlZ0luZm8gc3RydWN0LgorICBWaXJ0UmVnSW5mbyBhbmFseXplVmlydFJlZyh1bnNpZ25lZCBSZWcsCisgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8TWFjaGluZUluc3RyKiwgdW5zaWduZWQ+ID4gKk9wcyA9IG51bGxwdHIpOworCisgIC8vLyBhbmFseXplUGh5c1JlZyAtIEFuYWx5emUgaG93IHRoZSBjdXJyZW50IGluc3RydWN0aW9uIG9yIGJ1bmRsZSB1c2VzIGEKKyAgLy8vIHBoeXNpY2FsIHJlZ2lzdGVyLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciBvcGVyYXRvcisrKCksCisgIC8vLyBpdCBleHBlY3RzIGEgZnJlc2ggaXRlcmF0b3IuCisgIC8vLworICAvLy8gQHBhcmFtIFJlZyBUaGUgcGh5c2ljYWwgcmVnaXN0ZXIgdG8gYW5hbHl6ZS4KKyAgLy8vIEByZXR1cm5zIEEgZmlsbGVkLWluIFBoeXNSZWdJbmZvIHN0cnVjdC4KKyAgUGh5c1JlZ0luZm8gYW5hbHl6ZVBoeXNSZWcodW5zaWduZWQgUmVnLCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSk7Cit9OworCisvLy8gTUlPcGVyYW5kcyAtIEl0ZXJhdGUgb3ZlciBvcGVyYW5kcyBvZiBhIHNpbmdsZSBpbnN0cnVjdGlvbi4KKy8vLworY2xhc3MgTUlPcGVyYW5kcyA6IHB1YmxpYyBNYWNoaW5lT3BlcmFuZEl0ZXJhdG9yQmFzZSB7CitwdWJsaWM6CisgIE1JT3BlcmFuZHMoTWFjaGluZUluc3RyICZNSSkgOiBNYWNoaW5lT3BlcmFuZEl0ZXJhdG9yQmFzZShNSSwgZmFsc2UpIHt9CisgIE1hY2hpbmVPcGVyYW5kICZvcGVyYXRvciogKCkgY29uc3QgeyByZXR1cm4gZGVyZWYoKTsgfQorICBNYWNoaW5lT3BlcmFuZCAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZkZXJlZigpOyB9Cit9OworCisvLy8gQ29uc3RNSU9wZXJhbmRzIC0gSXRlcmF0ZSBvdmVyIG9wZXJhbmRzIG9mIGEgc2luZ2xlIGNvbnN0IGluc3RydWN0aW9uLgorLy8vCitjbGFzcyBDb25zdE1JT3BlcmFuZHMgOiBwdWJsaWMgTWFjaGluZU9wZXJhbmRJdGVyYXRvckJhc2UgeworcHVibGljOgorICBDb25zdE1JT3BlcmFuZHMoY29uc3QgTWFjaGluZUluc3RyICZNSSkKKyAgICAgIDogTWFjaGluZU9wZXJhbmRJdGVyYXRvckJhc2UoY29uc3RfY2FzdDxNYWNoaW5lSW5zdHIgJj4oTUkpLCBmYWxzZSkge30KKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJm9wZXJhdG9yKiAoKSBjb25zdCB7IHJldHVybiBkZXJlZigpOyB9CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJmRlcmVmKCk7IH0KK307CisKKy8vLyBNSUJ1bmRsZU9wZXJhbmRzIC0gSXRlcmF0ZSBvdmVyIGFsbCBvcGVyYW5kcyBpbiBhIGJ1bmRsZSBvZiBtYWNoaW5lCisvLy8gaW5zdHJ1Y3Rpb25zLgorLy8vCitjbGFzcyBNSUJ1bmRsZU9wZXJhbmRzIDogcHVibGljIE1hY2hpbmVPcGVyYW5kSXRlcmF0b3JCYXNlIHsKK3B1YmxpYzoKKyAgTUlCdW5kbGVPcGVyYW5kcyhNYWNoaW5lSW5zdHIgJk1JKSA6IE1hY2hpbmVPcGVyYW5kSXRlcmF0b3JCYXNlKE1JLCB0cnVlKSB7fQorICBNYWNoaW5lT3BlcmFuZCAmb3BlcmF0b3IqICgpIGNvbnN0IHsgcmV0dXJuIGRlcmVmKCk7IH0KKyAgTWFjaGluZU9wZXJhbmQgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmZGVyZWYoKTsgfQorfTsKKworLy8vIENvbnN0TUlCdW5kbGVPcGVyYW5kcyAtIEl0ZXJhdGUgb3ZlciBhbGwgb3BlcmFuZHMgaW4gYSBjb25zdCBidW5kbGUgb2YKKy8vLyBtYWNoaW5lIGluc3RydWN0aW9ucy4KKy8vLworY2xhc3MgQ29uc3RNSUJ1bmRsZU9wZXJhbmRzIDogcHVibGljIE1hY2hpbmVPcGVyYW5kSXRlcmF0b3JCYXNlIHsKK3B1YmxpYzoKKyAgQ29uc3RNSUJ1bmRsZU9wZXJhbmRzKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpCisgICAgICA6IE1hY2hpbmVPcGVyYW5kSXRlcmF0b3JCYXNlKGNvbnN0X2Nhc3Q8TWFjaGluZUluc3RyICY+KE1JKSwgdHJ1ZSkge30KKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJm9wZXJhdG9yKiAoKSBjb25zdCB7IHJldHVybiBkZXJlZigpOyB9CisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJmRlcmVmKCk7IH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmU0OTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yLmgKQEAgLTAsMCArMSwyODkgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IuaCAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVmaW5lcyBhbiBpdGVyYXRvciBjbGFzcyB0aGF0IGJ1bmRsZXMgTWFjaGluZUluc3RyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVJTlNUUkJVTkRMRUlURVJBVE9SX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVJTlNUUkJVTkRMRUlURVJBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvc2ltcGxlX2lsaXN0LmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgYm9vbCBJc1JldmVyc2U+IHN0cnVjdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvclRyYWl0czsKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3JUcmFpdHM8VCwgZmFsc2U+IHsKKyAgdXNpbmcgbGlzdF90eXBlID0gc2ltcGxlX2lsaXN0PFQsIGlsaXN0X3NlbnRpbmVsX3RyYWNraW5nPHRydWU+PjsKKyAgdXNpbmcgaW5zdHJfaXRlcmF0b3IgPSB0eXBlbmFtZSBsaXN0X3R5cGU6Oml0ZXJhdG9yOworICB1c2luZyBub25jb25zdF9pbnN0cl9pdGVyYXRvciA9IHR5cGVuYW1lIGxpc3RfdHlwZTo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2luc3RyX2l0ZXJhdG9yID0gdHlwZW5hbWUgbGlzdF90eXBlOjpjb25zdF9pdGVyYXRvcjsKK307Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yVHJhaXRzPFQsIHRydWU+IHsKKyAgdXNpbmcgbGlzdF90eXBlID0gc2ltcGxlX2lsaXN0PFQsIGlsaXN0X3NlbnRpbmVsX3RyYWNraW5nPHRydWU+PjsKKyAgdXNpbmcgaW5zdHJfaXRlcmF0b3IgPSB0eXBlbmFtZSBsaXN0X3R5cGU6OnJldmVyc2VfaXRlcmF0b3I7CisgIHVzaW5nIG5vbmNvbnN0X2luc3RyX2l0ZXJhdG9yID0gdHlwZW5hbWUgbGlzdF90eXBlOjpyZXZlcnNlX2l0ZXJhdG9yOworICB1c2luZyBjb25zdF9pbnN0cl9pdGVyYXRvciA9IHR5cGVuYW1lIGxpc3RfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKK307Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yVHJhaXRzPGNvbnN0IFQsIGZhbHNlPiB7CisgIHVzaW5nIGxpc3RfdHlwZSA9IHNpbXBsZV9pbGlzdDxULCBpbGlzdF9zZW50aW5lbF90cmFja2luZzx0cnVlPj47CisgIHVzaW5nIGluc3RyX2l0ZXJhdG9yID0gdHlwZW5hbWUgbGlzdF90eXBlOjpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgbm9uY29uc3RfaW5zdHJfaXRlcmF0b3IgPSB0eXBlbmFtZSBsaXN0X3R5cGU6Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pbnN0cl9pdGVyYXRvciA9IHR5cGVuYW1lIGxpc3RfdHlwZTo6Y29uc3RfaXRlcmF0b3I7Cit9OwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvclRyYWl0czxjb25zdCBULCB0cnVlPiB7CisgIHVzaW5nIGxpc3RfdHlwZSA9IHNpbXBsZV9pbGlzdDxULCBpbGlzdF9zZW50aW5lbF90cmFja2luZzx0cnVlPj47CisgIHVzaW5nIGluc3RyX2l0ZXJhdG9yID0gdHlwZW5hbWUgbGlzdF90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICB1c2luZyBub25jb25zdF9pbnN0cl9pdGVyYXRvciA9IHR5cGVuYW1lIGxpc3RfdHlwZTo6cmV2ZXJzZV9pdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaW5zdHJfaXRlcmF0b3IgPSB0eXBlbmFtZSBsaXN0X3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3I7Cit9OworCit0ZW1wbGF0ZSA8Ym9vbCBJc1JldmVyc2U+IHN0cnVjdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvckhlbHBlcjsKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvckhlbHBlcjxmYWxzZT4geworICAvLy8gR2V0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgYnVuZGxlLgorICB0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3I+IHN0YXRpYyBJdGVyYXRvciBnZXRCdW5kbGVCZWdpbihJdGVyYXRvciBJKSB7CisgICAgaWYgKCFJLmlzRW5kKCkpCisgICAgICB3aGlsZSAoSS0+aXNCdW5kbGVkV2l0aFByZWQoKSkKKyAgICAgICAgLS1JOworICAgIHJldHVybiBJOworICB9CisKKyAgLy8vIEdldCB0aGUgZmluYWwgbm9kZSBvZiB0aGUgY3VycmVudCBidW5kbGUuCisgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4gc3RhdGljIEl0ZXJhdG9yIGdldEJ1bmRsZUZpbmFsKEl0ZXJhdG9yIEkpIHsKKyAgICBpZiAoIUkuaXNFbmQoKSkKKyAgICAgIHdoaWxlIChJLT5pc0J1bmRsZWRXaXRoU3VjYygpKQorICAgICAgICArK0k7CisgICAgcmV0dXJuIEk7CisgIH0KKworICAvLy8gSW5jcmVtZW50IGZvcndhcmQgaWxpc3QgaXRlcmF0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4gc3RhdGljIHZvaWQgaW5jcmVtZW50KEl0ZXJhdG9yICZJKSB7CisgICAgSSA9IHN0ZDo6bmV4dChnZXRCdW5kbGVGaW5hbChJKSk7CisgIH0KKworICAvLy8gRGVjcmVtZW50IGZvcndhcmQgaWxpc3QgaXRlcmF0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4gc3RhdGljIHZvaWQgZGVjcmVtZW50KEl0ZXJhdG9yICZJKSB7CisgICAgSSA9IGdldEJ1bmRsZUJlZ2luKHN0ZDo6cHJldihJKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvckhlbHBlcjx0cnVlPiB7CisgIC8vLyBHZXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBidW5kbGUuCisgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4gc3RhdGljIEl0ZXJhdG9yIGdldEJ1bmRsZUJlZ2luKEl0ZXJhdG9yIEkpIHsKKyAgICByZXR1cm4gTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3JIZWxwZXI8ZmFsc2U+OjpnZXRCdW5kbGVCZWdpbigKKyAgICAgICAgICAgICAgIEkuZ2V0UmV2ZXJzZSgpKQorICAgICAgICAuZ2V0UmV2ZXJzZSgpOworICB9CisKKyAgLy8vIEdldCB0aGUgZmluYWwgbm9kZSBvZiB0aGUgY3VycmVudCBidW5kbGUuCisgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4gc3RhdGljIEl0ZXJhdG9yIGdldEJ1bmRsZUZpbmFsKEl0ZXJhdG9yIEkpIHsKKyAgICByZXR1cm4gTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3JIZWxwZXI8ZmFsc2U+OjpnZXRCdW5kbGVGaW5hbCgKKyAgICAgICAgICAgICAgIEkuZ2V0UmV2ZXJzZSgpKQorICAgICAgICAuZ2V0UmV2ZXJzZSgpOworICB9CisKKyAgLy8vIEluY3JlbWVudCByZXZlcnNlIGlsaXN0IGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3I+IHN0YXRpYyB2b2lkIGluY3JlbWVudChJdGVyYXRvciAmSSkgeworICAgIEkgPSBnZXRCdW5kbGVCZWdpbihzdGQ6Om5leHQoSSkpOworICB9CisKKyAgLy8vIERlY3JlbWVudCByZXZlcnNlIGlsaXN0IGl0ZXJhdG9yLgorICB0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3I+IHN0YXRpYyB2b2lkIGRlY3JlbWVudChJdGVyYXRvciAmSSkgeworICAgIEkgPSBzdGQ6OnByZXYoZ2V0QnVuZGxlRmluYWwoSSkpOworICB9Cit9OworCisvLy8gTWFjaGluZUJhc2ljQmxvY2sgaXRlcmF0b3IgdGhhdCBhdXRvbWF0aWNhbGx5IHNraXBzIG92ZXIgTUlzIHRoYXQgYXJlCisvLy8gaW5zaWRlIGJ1bmRsZXMgKGkuZS4gd2FsayB0b3AgbGV2ZWwgTUlzIG9ubHkpLgordGVtcGxhdGUgPHR5cGVuYW1lIFR5LCBib29sIElzUmV2ZXJzZSA9IGZhbHNlPgorY2xhc3MgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IgOiBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvckhlbHBlcjxJc1JldmVyc2U+IHsKKyAgdXNpbmcgVHJhaXRzID0gTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3JUcmFpdHM8VHksIElzUmV2ZXJzZT47CisgIHVzaW5nIGluc3RyX2l0ZXJhdG9yID0gdHlwZW5hbWUgVHJhaXRzOjppbnN0cl9pdGVyYXRvcjsKKworICBpbnN0cl9pdGVyYXRvciBNSUk7CisKK3B1YmxpYzoKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIGluc3RyX2l0ZXJhdG9yOjp2YWx1ZV90eXBlOworICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSB0eXBlbmFtZSBpbnN0cl9pdGVyYXRvcjo6ZGlmZmVyZW5jZV90eXBlOworICB1c2luZyBwb2ludGVyID0gdHlwZW5hbWUgaW5zdHJfaXRlcmF0b3I6OnBvaW50ZXI7CisgIHVzaW5nIHJlZmVyZW5jZSA9IHR5cGVuYW1lIGluc3RyX2l0ZXJhdG9yOjpyZWZlcmVuY2U7CisgIHVzaW5nIGNvbnN0X3BvaW50ZXIgPSB0eXBlbmFtZSBpbnN0cl9pdGVyYXRvcjo6Y29uc3RfcG9pbnRlcjsKKyAgdXNpbmcgY29uc3RfcmVmZXJlbmNlID0gdHlwZW5hbWUgaW5zdHJfaXRlcmF0b3I6OmNvbnN0X3JlZmVyZW5jZTsKKyAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnOworCitwcml2YXRlOgorICB1c2luZyBub25jb25zdF9pbnN0cl9pdGVyYXRvciA9IHR5cGVuYW1lIFRyYWl0czo6bm9uY29uc3RfaW5zdHJfaXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2luc3RyX2l0ZXJhdG9yID0gdHlwZW5hbWUgVHJhaXRzOjpjb25zdF9pbnN0cl9pdGVyYXRvcjsKKyAgdXNpbmcgbm9uY29uc3RfaXRlcmF0b3IgPQorICAgICAgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3I8dHlwZW5hbWUgbm9uY29uc3RfaW5zdHJfaXRlcmF0b3I6OnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc1JldmVyc2U+OworICB1c2luZyByZXZlcnNlX2l0ZXJhdG9yID0gTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3I8VHksICFJc1JldmVyc2U+OworCitwdWJsaWM6CisgIE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yKGluc3RyX2l0ZXJhdG9yIE1JKSA6IE1JSShNSSkgeworICAgIGFzc2VydCgoIU1JLmdldE5vZGVQdHIoKSB8fCBNSS5pc0VuZCgpIHx8ICFNSS0+aXNCdW5kbGVkV2l0aFByZWQoKSkgJiYKKyAgICAgICAgICAgIkl0J3Mgbm90IGxlZ2FsIHRvIGluaXRpYWxpemUgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3Igd2l0aCBhICIKKyAgICAgICAgICAgImJ1bmRsZWQgTUkiKTsKKyAgfQorCisgIE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yKHJlZmVyZW5jZSBNSSkgOiBNSUkoTUkpIHsKKyAgICBhc3NlcnQoIU1JLmlzQnVuZGxlZFdpdGhQcmVkKCkgJiYgIkl0J3Mgbm90IGxlZ2FsIHRvIGluaXRpYWxpemUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3Igd2l0aCBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1bmRsZWQgTUkiKTsKKyAgfQorCisgIE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yKHBvaW50ZXIgTUkpIDogTUlJKE1JKSB7CisgICAgLy8gRklYTUU6IFRoaXMgY29udmVyc2lvbiBzaG91bGQgYmUgZXhwbGljaXQuCisgICAgYXNzZXJ0KCghTUkgfHwgIU1JLT5pc0J1bmRsZWRXaXRoUHJlZCgpKSAmJiAiSXQncyBub3QgbGVnYWwgdG8gaW5pdGlhbGl6ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggYSBidW5kbGVkIE1JIik7CisgIH0KKworICAvLyBUZW1wbGF0ZSBhbGxvd3MgY29udmVyc2lvbiBmcm9tIGNvbnN0IHRvIG5vbmNvbnN0LgorICB0ZW1wbGF0ZSA8Y2xhc3MgT3RoZXJUeT4KKyAgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IoCisgICAgICBjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvcjxPdGhlclR5LCBJc1JldmVyc2U+ICZJLAorICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxPdGhlclR5ICosIFR5ICo+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKj46OnR5cGUgPSBudWxscHRyKQorICAgICAgOiBNSUkoSS5nZXRJbnN0ckl0ZXJhdG9yKCkpIHt9CisKKyAgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IoKSA6IE1JSShudWxscHRyKSB7fQorCisgIC8vLyBFeHBsaWNpdCBjb252ZXJzaW9uIGJldHdlZW4gZm9yd2FyZC9yZXZlcnNlIGl0ZXJhdG9ycy4KKyAgLy8vCisgIC8vLyBUcmFuc2xhdGUgYmV0d2VlbiBmb3J3YXJkIGFuZCByZXZlcnNlIGl0ZXJhdG9ycyB3aXRob3V0IGNoYW5naW5nIHJhbmdlCisgIC8vLyBib3VuZGFyaWVzLiAgVGhlIHJlc3VsdGluZyBpdGVyYXRvciB3aWxsIGRlcmVmZXJlbmNlIChhbmQgaGF2ZSBhIGhhbmRsZSkKKyAgLy8vIHRvIHRoZSBwcmV2aW91cyBub2RlLCB3aGljaCBpcyBzb21ld2hhdCB1bmV4cGVjdGVkOyBidXQgY29udmVydGluZyB0aGUKKyAgLy8vIHR3byBlbmRwb2ludHMgaW4gYSByYW5nZSB3aWxsIGdpdmUgdGhlIHNhbWUgcmFuZ2UgaW4gcmV2ZXJzZS4KKyAgLy8vCisgIC8vLyBUaGlzIG1hdGNoZXMgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yIGNvbnZlcnNpb25zLgorICBleHBsaWNpdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvcigKKyAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yPFR5LCAhSXNSZXZlcnNlPiAmSSkKKyAgICAgIDogTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IoKytJLmdldFJldmVyc2UoKSkge30KKworICAvLy8gR2V0IHRoZSBidW5kbGUgaXRlcmF0b3IgZm9yIHRoZSBnaXZlbiBpbnN0cnVjdGlvbidzIGJ1bmRsZS4KKyAgc3RhdGljIE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yIGdldEF0QnVuZGxlQmVnaW4oaW5zdHJfaXRlcmF0b3IgTUkpIHsKKyAgICByZXR1cm4gTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3JIZWxwZXI8SXNSZXZlcnNlPjo6Z2V0QnVuZGxlQmVnaW4oTUkpOworICB9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpNSUk7IH0KKyAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJm9wZXJhdG9yKigpOyB9CisKKyAgLy8vIENoZWNrIGZvciBudWxsLgorICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBNSUkuZ2V0Tm9kZVB0cigpOyB9CisKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmUikgeworICAgIHJldHVybiBMLk1JSSA9PSBSLk1JSTsKKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0X2luc3RyX2l0ZXJhdG9yICZSKSB7CisgICAgcmV0dXJuIEwuTUlJID09IFI7IC8vIEF2b2lkIGFzc2VydGlvbiBhYm91dCB2YWxpZGl0eSBvZiBSLgorICB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgY29uc3RfaW5zdHJfaXRlcmF0b3IgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IgJlIpIHsKKyAgICByZXR1cm4gTCA9PSBSLk1JSTsgLy8gQXZvaWQgYXNzZXJ0aW9uIGFib3V0IHZhbGlkaXR5IG9mIEwuCisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub25jb25zdF9pbnN0cl9pdGVyYXRvciAmUikgeworICAgIHJldHVybiBMLk1JSSA9PSBSOyAvLyBBdm9pZCBhc3NlcnRpb24gYWJvdXQgdmFsaWRpdHkgb2YgUi4KKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IG5vbmNvbnN0X2luc3RyX2l0ZXJhdG9yICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yICZSKSB7CisgICAgcmV0dXJuIEwgPT0gUi5NSUk7IC8vIEF2b2lkIGFzc2VydGlvbiBhYm91dCB2YWxpZGl0eSBvZiBMLgorICB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IgJkwsIGNvbnN0X3BvaW50ZXIgUikgeworICAgIHJldHVybiBMID09IGNvbnN0X2luc3RyX2l0ZXJhdG9yKFIpOyAvLyBBdm9pZCBhc3NlcnRpb24gYWJvdXQgdmFsaWRpdHkgb2YgUi4KKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0X3BvaW50ZXIgTCwgY29uc3QgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IgJlIpIHsKKyAgICByZXR1cm4gY29uc3RfaW5zdHJfaXRlcmF0b3IoTCkgPT0gUjsgLy8gQXZvaWQgYXNzZXJ0aW9uIGFib3V0IHZhbGlkaXR5IG9mIEwuCisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2UgUikgeworICAgIHJldHVybiBMID09ICZSOyAvLyBBdm9pZCBhc3NlcnRpb24gYWJvdXQgdmFsaWRpdHkgb2YgUi4KKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0X3JlZmVyZW5jZSBMLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yICZSKSB7CisgICAgcmV0dXJuICZMID09IFI7IC8vIEF2b2lkIGFzc2VydGlvbiBhYm91dCB2YWxpZGl0eSBvZiBMLgorICB9CisKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmUikgeworICAgIHJldHVybiAhKEwgPT0gUik7CisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25zdF9pbnN0cl9pdGVyYXRvciAmUikgeworICAgIHJldHVybiAhKEwgPT0gUik7CisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBjb25zdF9pbnN0cl9pdGVyYXRvciAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmUikgeworICAgIHJldHVybiAhKEwgPT0gUik7CisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub25jb25zdF9pbnN0cl9pdGVyYXRvciAmUikgeworICAgIHJldHVybiAhKEwgPT0gUik7CisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBub25jb25zdF9pbnN0cl9pdGVyYXRvciAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmUikgeworICAgIHJldHVybiAhKEwgPT0gUik7CisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmTCwgY29uc3RfcG9pbnRlciBSKSB7CisgICAgcmV0dXJuICEoTCA9PSBSKTsKKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0X3BvaW50ZXIgTCwgY29uc3QgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IgJlIpIHsKKyAgICByZXR1cm4gIShMID09IFIpOworICB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlIFIpIHsKKyAgICByZXR1cm4gIShMID09IFIpOworICB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3RfcmVmZXJlbmNlIEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IgJlIpIHsKKyAgICByZXR1cm4gIShMID09IFIpOworICB9CisKKyAgLy8gSW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgb3BlcmF0b3JzLi4uCisgIE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yICZvcGVyYXRvci0tKCkgeworICAgIHRoaXMtPmRlY3JlbWVudChNSUkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICB0aGlzLT5pbmNyZW1lbnQoTUlJKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3Igb3BlcmF0b3ItLShpbnQpIHsKKyAgICBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciBUZW1wID0gKnRoaXM7CisgICAgLS0qdGhpczsKKyAgICByZXR1cm4gVGVtcDsKKyAgfQorICBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgIE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yIFRlbXAgPSAqdGhpczsKKyAgICArKyp0aGlzOworICAgIHJldHVybiBUZW1wOworICB9CisKKyAgaW5zdHJfaXRlcmF0b3IgZ2V0SW5zdHJJdGVyYXRvcigpIGNvbnN0IHsgcmV0dXJuIE1JSTsgfQorCisgIG5vbmNvbnN0X2l0ZXJhdG9yIGdldE5vbkNvbnN0SXRlcmF0b3IoKSBjb25zdCB7IHJldHVybiBNSUkuZ2V0Tm9uQ29uc3QoKTsgfQorCisgIC8vLyBHZXQgYSByZXZlcnNlIGl0ZXJhdG9yIHRvIHRoZSBzYW1lIG5vZGUuCisgIC8vLworICAvLy8gR2l2ZXMgYSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgd2lsbCBkZXJlZmVyZW5jZSAoYW5kIGhhdmUgYSBoYW5kbGUpIHRvIHRoZQorICAvLy8gc2FtZSBub2RlLiAgQ29udmVydGluZyB0aGUgZW5kcG9pbnQgaXRlcmF0b3JzIGluIGEgcmFuZ2Ugd2lsbCBnaXZlIGEKKyAgLy8vIGRpZmZlcmVudCByYW5nZTsgZm9yIHJhbmdlIG9wZXJhdGlvbnMsIHVzZSB0aGUgZXhwbGljaXQgY29udmVyc2lvbnMuCisgIHJldmVyc2VfaXRlcmF0b3IgZ2V0UmV2ZXJzZSgpIGNvbnN0IHsgcmV0dXJuIE1JSS5nZXRSZXZlcnNlKCk7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUFDSElORUlOU1RSQlVORExFSVRFUkFUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVKdW1wVGFibGVJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUp1bXBUYWJsZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWEzZTZiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVKdW1wVGFibGVJbmZvLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8vPT09LS0gQ29kZUdlbi9NYWNoaW5lSnVtcFRhYmxlSW5mby5oIC0gQWJzdHJhY3QgSnVtcCBUYWJsZXMgIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlIE1hY2hpbmVKdW1wVGFibGVJbmZvIGNsYXNzIGtlZXBzIHRyYWNrIG9mIGp1bXAgdGFibGVzIHJlZmVyZW5jZWQgYnkKKy8vIGxvd2VyZWQgc3dpdGNoIGluc3RydWN0aW9ucyBpbiB0aGUgTWFjaGluZUZ1bmN0aW9uLgorLy8KKy8vIEluc3RydWN0aW9ucyByZWZlcmVuY2UgdGhlIGFkZHJlc3Mgb2YgdGhlc2UganVtcCB0YWJsZXMgdGhyb3VnaCB0aGUgdXNlIG9mCisvLyBNT19KdW1wVGFibGVJbmRleCB2YWx1ZXMuICBXaGVuIGVtaXR0aW5nIGFzc2VtYmx5IG9yIG1hY2hpbmUgY29kZSwgdGhlc2UKKy8vIHZpcnR1YWwgYWRkcmVzcyByZWZlcmVuY2VzIGFyZSBjb252ZXJ0ZWQgdG8gcmVmZXIgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlCisvLyBmdW5jdGlvbiBqdW1wIHRhYmxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FSlVNUFRBQkxFSU5GT19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FSlVNUFRBQkxFSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUHJpbnRhYmxlLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBEYXRhTGF5b3V0OworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vLyBNYWNoaW5lSnVtcFRhYmxlRW50cnkgLSBPbmUganVtcCB0YWJsZSBpbiB0aGUganVtcCB0YWJsZSBpbmZvLgorLy8vCitzdHJ1Y3QgTWFjaGluZUp1bXBUYWJsZUVudHJ5IHsKKyAgLy8vIE1CQnMgLSBUaGUgdmVjdG9yIG9mIGJhc2ljIGJsb2NrcyBmcm9tIHdoaWNoIHRvIGNyZWF0ZSB0aGUganVtcCB0YWJsZS4KKyAgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqPiBNQkJzOworCisgIGV4cGxpY2l0IE1hY2hpbmVKdW1wVGFibGVFbnRyeShjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayo+ICZNKQorICA6IE1CQnMoTSkge30KK307CisKK2NsYXNzIE1hY2hpbmVKdW1wVGFibGVJbmZvIHsKK3B1YmxpYzoKKyAgLy8vIEpURW50cnlLaW5kIC0gVGhpcyBlbnVtIGluZGljYXRlcyBob3cgZWFjaCBlbnRyeSBvZiB0aGUganVtcCB0YWJsZSBpcworICAvLy8gcmVwcmVzZW50ZWQgYW5kIGVtaXR0ZWQuCisgIGVudW0gSlRFbnRyeUtpbmQgeworICAgIC8vLyBFS19CbG9ja0FkZHJlc3MgLSBFYWNoIGVudHJ5IGlzIGEgcGxhaW4gYWRkcmVzcyBvZiBibG9jaywgZS5nLjoKKyAgICAvLy8gICAgIC53b3JkIExCQjEyMworICAgIEVLX0Jsb2NrQWRkcmVzcywKKworICAgIC8vLyBFS19HUFJlbDY0QmxvY2tBZGRyZXNzIC0gRWFjaCBlbnRyeSBpcyBhbiBhZGRyZXNzIG9mIGJsb2NrLCBlbmNvZGVkCisgICAgLy8vIHdpdGggYSByZWxvY2F0aW9uIGFzIGdwLXJlbGF0aXZlLCBlLmcuOgorICAgIC8vLyAgICAgLmdwZHdvcmQgTEJCMTIzCisgICAgRUtfR1BSZWw2NEJsb2NrQWRkcmVzcywKKworICAgIC8vLyBFS19HUFJlbDMyQmxvY2tBZGRyZXNzIC0gRWFjaCBlbnRyeSBpcyBhbiBhZGRyZXNzIG9mIGJsb2NrLCBlbmNvZGVkCisgICAgLy8vIHdpdGggYSByZWxvY2F0aW9uIGFzIGdwLXJlbGF0aXZlLCBlLmcuOgorICAgIC8vLyAgICAgLmdwcmVsMzIgTEJCMTIzCisgICAgRUtfR1BSZWwzMkJsb2NrQWRkcmVzcywKKworICAgIC8vLyBFS19MYWJlbERpZmZlcmVuY2UzMiAtIEVhY2ggZW50cnkgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGJsb2NrIG1pbnVzCisgICAgLy8vIHRoZSBhZGRyZXNzIG9mIHRoZSBqdW1wIHRhYmxlLiAgVGhpcyBpcyB1c2VkIGZvciBQSUMganVtcCB0YWJsZXMgd2hlcmUKKyAgICAvLy8gZ3ByZWwzMiBpcyBub3Qgc3VwcG9ydGVkLiAgZS5nLjoKKyAgICAvLy8gICAgICAud29yZCBMQkIxMjMgLSBMSlRJMV8yCisgICAgLy8vIElmIHRoZSAuc2V0IGRpcmVjdGl2ZSBpcyBzdXBwb3J0ZWQsIHRoaXMgaXMgZW1pdHRlZCBhczoKKyAgICAvLy8gICAgICAuc2V0IEw0XzVfc2V0XzEyMywgTEJCMTIzIC0gTEpUSTFfMgorICAgIC8vLyAgICAgIC53b3JkIEw0XzVfc2V0XzEyMworICAgIEVLX0xhYmVsRGlmZmVyZW5jZTMyLAorCisgICAgLy8vIEVLX0lubGluZSAtIEp1bXAgdGFibGUgZW50cmllcyBhcmUgZW1pdHRlZCBpbmxpbmUgYXQgdGhlaXIgcG9pbnQgb2YKKyAgICAvLy8gdXNlLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHRhcmdldCB0byBlbWl0IHRoZSBlbnRyaWVzLgorICAgIEVLX0lubGluZSwKKworICAgIC8vLyBFS19DdXN0b20zMiAtIEVhY2ggZW50cnkgaXMgYSAzMi1iaXQgdmFsdWUgdGhhdCBpcyBjdXN0b20gbG93ZXJlZCBieSB0aGUKKyAgICAvLy8gVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ3VzdG9tSnVtcFRhYmxlRW50cnkgaG9vay4KKyAgICBFS19DdXN0b20zMgorICB9OworcHJpdmF0ZToKKyAgSlRFbnRyeUtpbmQgRW50cnlLaW5kOworICBzdGQ6OnZlY3RvcjxNYWNoaW5lSnVtcFRhYmxlRW50cnk+IEp1bXBUYWJsZXM7CitwdWJsaWM6CisgIGV4cGxpY2l0IE1hY2hpbmVKdW1wVGFibGVJbmZvKEpURW50cnlLaW5kIEtpbmQpOiBFbnRyeUtpbmQoS2luZCkge30KKworICBKVEVudHJ5S2luZCBnZXRFbnRyeUtpbmQoKSBjb25zdCB7IHJldHVybiBFbnRyeUtpbmQ7IH0KKworICAvLy8gZ2V0RW50cnlTaXplIC0gUmV0dXJuIHRoZSBzaXplIG9mIGVhY2ggZW50cnkgaW4gdGhlIGp1bXAgdGFibGUuCisgIHVuc2lnbmVkIGdldEVudHJ5U2l6ZShjb25zdCBEYXRhTGF5b3V0ICZURCkgY29uc3Q7CisgIC8vLyBnZXRFbnRyeUFsaWdubWVudCAtIFJldHVybiB0aGUgYWxpZ25tZW50IG9mIGVhY2ggZW50cnkgaW4gdGhlIGp1bXAgdGFibGUuCisgIHVuc2lnbmVkIGdldEVudHJ5QWxpZ25tZW50KGNvbnN0IERhdGFMYXlvdXQgJlREKSBjb25zdDsKKworICAvLy8gY3JlYXRlSnVtcFRhYmxlSW5kZXggLSBDcmVhdGUgYSBuZXcganVtcCB0YWJsZS4KKyAgLy8vCisgIHVuc2lnbmVkIGNyZWF0ZUp1bXBUYWJsZUluZGV4KGNvbnN0IHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKj4gJkRlc3RCQnMpOworCisgIC8vLyBpc0VtcHR5IC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG5vIGp1bXAgdGFibGVzLgorICAvLy8KKyAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gSnVtcFRhYmxlcy5lbXB0eSgpOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8TWFjaGluZUp1bXBUYWJsZUVudHJ5PiAmZ2V0SnVtcFRhYmxlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gSnVtcFRhYmxlczsKKyAgfQorCisgIC8vLyBSZW1vdmVKdW1wVGFibGUgLSBNYXJrIHRoZSBzcGVjaWZpYyBpbmRleCBhcyBiZWluZyBkZWFkLiAgVGhpcyB3aWxsCisgIC8vLyBwcmV2ZW50IGl0IGZyb20gYmVpbmcgZW1pdHRlZC4KKyAgdm9pZCBSZW1vdmVKdW1wVGFibGUodW5zaWduZWQgSWR4KSB7CisgICAgSnVtcFRhYmxlc1tJZHhdLk1CQnMuY2xlYXIoKTsKKyAgfQorCisgIC8vLyBSZXBsYWNlTUJCSW5KdW1wVGFibGVzIC0gSWYgT2xkIGlzIHRoZSB0YXJnZXQgb2YgYW55IGp1bXAgdGFibGVzLCB1cGRhdGUKKyAgLy8vIHRoZSBqdW1wIHRhYmxlcyB0byBicmFuY2ggdG8gTmV3IGluc3RlYWQuCisgIGJvb2wgUmVwbGFjZU1CQkluSnVtcFRhYmxlcyhNYWNoaW5lQmFzaWNCbG9jayAqT2xkLCBNYWNoaW5lQmFzaWNCbG9jayAqTmV3KTsKKworICAvLy8gUmVwbGFjZU1CQkluSnVtcFRhYmxlIC0gSWYgT2xkIGlzIGEgdGFyZ2V0IG9mIHRoZSBqdW1wIHRhYmxlcywgdXBkYXRlCisgIC8vLyB0aGUganVtcCB0YWJsZSB0byBicmFuY2ggdG8gTmV3IGluc3RlYWQuCisgIGJvb2wgUmVwbGFjZU1CQkluSnVtcFRhYmxlKHVuc2lnbmVkIElkeCwgTWFjaGluZUJhc2ljQmxvY2sgKk9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk5ldyk7CisKKyAgLy8vIHByaW50IC0gVXNlZCBieSB0aGUgTWFjaGluZUZ1bmN0aW9uIHByaW50ZXIgdG8gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQKKyAgLy8vIGp1bXAgdGFibGVzLiAgSW1wbGVtZW50ZWQgaW4gTWFjaGluZUZ1bmN0aW9uLmNwcAorICAvLy8KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIC8vLyBkdW1wIC0gQ2FsbCB0byBzdGRlcnIuCisgIC8vLworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKKworLy8vIFByaW50cyBhIGp1bXAgdGFibGUgZW50cnkgcmVmZXJlbmNlLgorLy8vCisvLy8gVGhlIGZvcm1hdCBpczoKKy8vLyAgICVqdW1wLXRhYmxlLjUgICAgICAgLSBhIGp1bXAgdGFibGUgZW50cnkgd2l0aCBpbmRleCA9PSA1LgorLy8vCisvLy8gVXNhZ2U6IE9TIDw8IHByaW50SnVtcFRhYmxlRW50cnlSZWZlcmVuY2UoSWR4KSA8PCAnXG4nOworUHJpbnRhYmxlIHByaW50SnVtcFRhYmxlRW50cnlSZWZlcmVuY2UodW5zaWduZWQgSWR4KTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUxvb3BJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUxvb3BJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0NjU1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaApAQCAtMCwwICsxLDE5MyBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaCAtIE5hdHVyYWwgTG9vcCBDYWxjdWxhdG9yIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgTWFjaGluZUxvb3BJbmZvIGNsYXNzIHRoYXQgaXMgdXNlZCB0byBpZGVudGlmeSBuYXR1cmFsCisvLyBsb29wcyBhbmQgZGV0ZXJtaW5lIHRoZSBsb29wIGRlcHRoIG9mIHZhcmlvdXMgbm9kZXMgb2YgdGhlIENGRy4gIE5vdGUgdGhhdAorLy8gbmF0dXJhbCBsb29wcyBtYXkgYWN0dWFsbHkgYmUgc2V2ZXJhbCBsb29wcyB0aGF0IHNoYXJlIHRoZSBzYW1lIGhlYWRlciBub2RlLgorLy8KKy8vIFRoaXMgYW5hbHlzaXMgY2FsY3VsYXRlcyB0aGUgbmVzdGluZyBzdHJ1Y3R1cmUgb2YgbG9vcHMgaW4gYSBmdW5jdGlvbi4gIEZvcgorLy8gZWFjaCBuYXR1cmFsIGxvb3AgaWRlbnRpZmllZCwgdGhpcyBhbmFseXNpcyBpZGVudGlmaWVzIG5hdHVyYWwgbG9vcHMKKy8vIGNvbnRhaW5lZCBlbnRpcmVseSB3aXRoaW4gdGhlIGxvb3AgYW5kIHRoZSBiYXNpYyBibG9ja3MgdGhlIG1ha2UgdXAgdGhlIGxvb3AuCisvLworLy8gSXQgY2FuIGNhbGN1bGF0ZSBvbiB0aGUgZmx5IHZhcmlvdXMgYml0cyBvZiBpbmZvcm1hdGlvbiwgZm9yIGV4YW1wbGU6CisvLworLy8gICogd2hldGhlciB0aGVyZSBpcyBhIHByZWhlYWRlciBmb3IgdGhlIGxvb3AKKy8vICAqIHRoZSBudW1iZXIgb2YgYmFjayBlZGdlcyB0byB0aGUgaGVhZGVyCisvLyAgKiB3aGV0aGVyIG9yIG5vdCBhIHBhcnRpY3VsYXIgYmxvY2sgYnJhbmNoZXMgb3V0IG9mIHRoZSBsb29wCisvLyAgKiB0aGUgc3VjY2Vzc29yIGJsb2NrcyBvZiB0aGUgbG9vcAorLy8gICogdGhlIGxvb3AgZGVwdGgKKy8vICAqIHRoZSB0cmlwIGNvdW50CisvLyAgKiBldGMuLi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FTE9PUElORk9fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORUxPT1BJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVidWdMb2MuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLyBJbXBsZW1lbnRhdGlvbiBpbiBMb29wSW5mb0ltcGwuaAorY2xhc3MgTWFjaGluZUxvb3A7CitleHRlcm4gdGVtcGxhdGUgY2xhc3MgTG9vcEJhc2U8TWFjaGluZUJhc2ljQmxvY2ssIE1hY2hpbmVMb29wPjsKKworY2xhc3MgTWFjaGluZUxvb3AgOiBwdWJsaWMgTG9vcEJhc2U8TWFjaGluZUJhc2ljQmxvY2ssIE1hY2hpbmVMb29wPiB7CitwdWJsaWM6CisgIC8vLyBSZXR1cm4gdGhlICJ0b3AiIGJsb2NrIGluIHRoZSBsb29wLCB3aGljaCBpcyB0aGUgZmlyc3QgYmxvY2sgaW4gdGhlIGxpbmVhcgorICAvLy8gbGF5b3V0LCBpZ25vcmluZyBhbnkgcGFydHMgb2YgdGhlIGxvb3Agbm90IGNvbnRpZ3VvdXMgd2l0aCB0aGUgcGFydCB0aGF0CisgIC8vLyBjb250YWlucyB0aGUgaGVhZGVyLgorICBNYWNoaW5lQmFzaWNCbG9jayAqZ2V0VG9wQmxvY2soKTsKKworICAvLy8gUmV0dXJuIHRoZSAiYm90dG9tIiBibG9jayBpbiB0aGUgbG9vcCwgd2hpY2ggaXMgdGhlIGxhc3QgYmxvY2sgaW4gdGhlCisgIC8vLyBsaW5lYXIgbGF5b3V0LCBpZ25vcmluZyBhbnkgcGFydHMgb2YgdGhlIGxvb3Agbm90IGNvbnRpZ3VvdXMgd2l0aCB0aGUgcGFydAorICAvLy8gdGhhdCBjb250YWlucyB0aGUgaGVhZGVyLgorICBNYWNoaW5lQmFzaWNCbG9jayAqZ2V0Qm90dG9tQmxvY2soKTsKKworICAvLy8gXGJyaWVmIEZpbmQgdGhlIGJsb2NrIHRoYXQgY29udGFpbnMgdGhlIGxvb3AgY29udHJvbCB2YXJpYWJsZSBhbmQgdGhlCisgIC8vLyBsb29wIHRlc3QuIFRoaXMgd2lsbCByZXR1cm4gdGhlIGxhdGNoIGJsb2NrIGlmIGl0J3Mgb25lIG9mIHRoZSBleGl0aW5nCisgIC8vLyBibG9ja3MuIE90aGVyd2lzZSwgcmV0dXJuIHRoZSBleGl0aW5nIGJsb2NrLiBSZXR1cm4gJ251bGwnIHdoZW4KKyAgLy8vIG11bHRpcGxlIGV4aXRpbmcgYmxvY2tzIGFyZSBwcmVzZW50LgorICBNYWNoaW5lQmFzaWNCbG9jayAqZmluZExvb3BDb250cm9sQmxvY2soKTsKKworICAvLy8gUmV0dXJuIHRoZSBkZWJ1ZyBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhpcyBsb29wLgorICAvLy8gVGhpcyBsb29rcyBmb3IgYSBCQiB0ZXJtaW5hdGluZyBpbnN0cnVjdGlvbiB3aXRoIGEga25vd24gZGVidWcKKyAgLy8vIGxvY2F0aW9uIGJ5IGxvb2tpbmcgYXQgdGhlIHByZWhlYWRlciBhbmQgaGVhZGVyIGJsb2Nrcy4gSWYgaXQKKyAgLy8vIGNhbm5vdCBmaW5kIGEgdGVybWluYXRpbmcgaW5zdHJ1Y3Rpb24gd2l0aCBsb2NhdGlvbiBpbmZvcm1hdGlvbiwKKyAgLy8vIGl0IHJldHVybnMgYW4gdW5rbm93biBsb2NhdGlvbi4KKyAgRGVidWdMb2MgZ2V0U3RhcnRMb2MoKSBjb25zdDsKKworICB2b2lkIGR1bXAoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIExvb3BJbmZvQmFzZTxNYWNoaW5lQmFzaWNCbG9jaywgTWFjaGluZUxvb3A+OworCisgIGV4cGxpY2l0IE1hY2hpbmVMb29wKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpCisgICAgOiBMb29wQmFzZTxNYWNoaW5lQmFzaWNCbG9jaywgTWFjaGluZUxvb3A+KE1CQikge30KKworICBNYWNoaW5lTG9vcCgpID0gZGVmYXVsdDsKK307CisKKy8vIEltcGxlbWVudGF0aW9uIGluIExvb3BJbmZvSW1wbC5oCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgTG9vcEluZm9CYXNlPE1hY2hpbmVCYXNpY0Jsb2NrLCBNYWNoaW5lTG9vcD47CisKK2NsYXNzIE1hY2hpbmVMb29wSW5mbyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgZnJpZW5kIGNsYXNzIExvb3BCYXNlPE1hY2hpbmVCYXNpY0Jsb2NrLCBNYWNoaW5lTG9vcD47CisKKyAgTG9vcEluZm9CYXNlPE1hY2hpbmVCYXNpY0Jsb2NrLCBNYWNoaW5lTG9vcD4gTEk7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKworICBNYWNoaW5lTG9vcEluZm8oKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHsKKyAgICBpbml0aWFsaXplTWFjaGluZUxvb3BJbmZvUGFzcygqUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKSk7CisgIH0KKyAgTWFjaGluZUxvb3BJbmZvKGNvbnN0IE1hY2hpbmVMb29wSW5mbyAmKSA9IGRlbGV0ZTsKKyAgTWFjaGluZUxvb3BJbmZvICZvcGVyYXRvcj0oY29uc3QgTWFjaGluZUxvb3BJbmZvICYpID0gZGVsZXRlOworCisgIExvb3BJbmZvQmFzZTxNYWNoaW5lQmFzaWNCbG9jaywgTWFjaGluZUxvb3A+JiBnZXRCYXNlKCkgeyByZXR1cm4gTEk7IH0KKworICAvLy8gXGJyaWVmIEZpbmQgdGhlIGJsb2NrIHRoYXQgZWl0aGVyIGlzIHRoZSBsb29wIHByZWhlYWRlciwgb3IgY291bGQKKyAgLy8vIHNwZWN1bGF0aXZlbHkgYmUgdXNlZCBhcyB0aGUgcHJlaGVhZGVyLiBUaGlzIGlzIGUuZy4gdXNlZnVsIHRvIHBsYWNlCisgIC8vLyBsb29wIHNldHVwIGNvZGUuIENvZGUgdGhhdCBjYW5ub3QgYmUgc3BlY3VsYXRlZCBzaG91bGQgbm90IGJlIHBsYWNlZAorICAvLy8gaGVyZS4gU3BlY3VsYXRpdmVQcmVoZWFkZXIgaXMgY29udHJvbGxpbmcgd2hldGhlciBpdCBhbHNvIHRyaWVzIHRvCisgIC8vLyBmaW5kIHRoZSBzcGVjdWxhdGl2ZSBwcmVoZWFkZXIgaWYgdGhlIHJlZ3VsYXIgcHJlaGVhZGVyIGlzIG5vdCBwcmVzZW50LgorICBNYWNoaW5lQmFzaWNCbG9jayAqZmluZExvb3BQcmVoZWFkZXIoTWFjaGluZUxvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNwZWN1bGF0aXZlUHJlaGVhZGVyID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyBUaGUgaXRlcmF0b3IgaW50ZXJmYWNlIHRvIHRoZSB0b3AtbGV2ZWwgbG9vcHMgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIHVzaW5nIGl0ZXJhdG9yID0gTG9vcEluZm9CYXNlPE1hY2hpbmVCYXNpY0Jsb2NrLCBNYWNoaW5lTG9vcD46Oml0ZXJhdG9yOworICBpbmxpbmUgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBMSS5iZWdpbigpOyB9CisgIGlubGluZSBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBMSS5lbmQoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gTEkuZW1wdHkoKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIGlubmVybW9zdCBsb29wIHRoYXQgQkIgbGl2ZXMgaW4uIElmIGEgYmFzaWMgYmxvY2sgaXMgaW4gbm8gbG9vcAorICAvLy8gKGZvciBleGFtcGxlIHRoZSBlbnRyeSBub2RlKSwgbnVsbCBpcyByZXR1cm5lZC4KKyAgaW5saW5lIE1hY2hpbmVMb29wICpnZXRMb29wRm9yKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIHJldHVybiBMSS5nZXRMb29wRm9yKEJCKTsKKyAgfQorCisgIC8vLyBTYW1lIGFzIGdldExvb3BGb3IuCisgIGlubGluZSBjb25zdCBNYWNoaW5lTG9vcCAqb3BlcmF0b3JbXShjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gTEkuZ2V0TG9vcEZvcihCQik7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBsb29wIG5lc3RpbmcgbGV2ZWwgb2YgdGhlIHNwZWNpZmllZCBibG9jay4KKyAgaW5saW5lIHVuc2lnbmVkIGdldExvb3BEZXB0aChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gTEkuZ2V0TG9vcERlcHRoKEJCKTsKKyAgfQorCisgIC8vLyBUcnVlIGlmIHRoZSBibG9jayBpcyBhIGxvb3AgaGVhZGVyIG5vZGUuCisgIGlubGluZSBib29sIGlzTG9vcEhlYWRlcihjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gTEkuaXNMb29wSGVhZGVyKEJCKTsKKyAgfQorCisgIC8vLyBDYWxjdWxhdGUgdGhlIG5hdHVyYWwgbG9vcCBpbmZvcm1hdGlvbi4KKyAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlIHsgTEkucmVsZWFzZU1lbW9yeSgpOyB9CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gVGhpcyByZW1vdmVzIHRoZSBzcGVjaWZpZWQgdG9wLWxldmVsIGxvb3AgZnJvbSB0aGlzIGxvb3AgaW5mbyBvYmplY3QuIFRoZQorICAvLy8gbG9vcCBpcyBub3QgZGVsZXRlZCwgYXMgaXQgd2lsbCBwcmVzdW1hYmx5IGJlIGluc2VydGVkIGludG8gYW5vdGhlciBsb29wLgorICBpbmxpbmUgTWFjaGluZUxvb3AgKnJlbW92ZUxvb3AoaXRlcmF0b3IgSSkgeyByZXR1cm4gTEkucmVtb3ZlTG9vcChJKTsgfQorCisgIC8vLyBDaGFuZ2UgdGhlIHRvcC1sZXZlbCBsb29wIHRoYXQgY29udGFpbnMgQkIgdG8gdGhlIHNwZWNpZmllZCBsb29wLiBUaGlzCisgIC8vLyBzaG91bGQgYmUgdXNlZCBieSB0cmFuc2Zvcm1hdGlvbnMgdGhhdCByZXN0cnVjdHVyZSB0aGUgbG9vcCBoaWVyYXJjaHkKKyAgLy8vIHRyZWUuCisgIGlubGluZSB2b2lkIGNoYW5nZUxvb3BGb3IoTWFjaGluZUJhc2ljQmxvY2sgKkJCLCBNYWNoaW5lTG9vcCAqTCkgeworICAgIExJLmNoYW5nZUxvb3BGb3IoQkIsIEwpOworICB9CisKKyAgLy8vIFJlcGxhY2UgdGhlIHNwZWNpZmllZCBsb29wIGluIHRoZSB0b3AtbGV2ZWwgbG9vcHMgbGlzdCB3aXRoIHRoZSBpbmRpY2F0ZWQKKyAgLy8vIGxvb3AuCisgIGlubGluZSB2b2lkIGNoYW5nZVRvcExldmVsTG9vcChNYWNoaW5lTG9vcCAqT2xkTG9vcCwgTWFjaGluZUxvb3AgKk5ld0xvb3ApIHsKKyAgICBMSS5jaGFuZ2VUb3BMZXZlbExvb3AoT2xkTG9vcCwgTmV3TG9vcCk7CisgIH0KKworICAvLy8gVGhpcyBhZGRzIHRoZSBzcGVjaWZpZWQgbG9vcCB0byB0aGUgY29sbGVjdGlvbiBvZiB0b3AtbGV2ZWwgbG9vcHMuCisgIGlubGluZSB2b2lkIGFkZFRvcExldmVsTG9vcChNYWNoaW5lTG9vcCAqTmV3KSB7CisgICAgTEkuYWRkVG9wTGV2ZWxMb29wKE5ldyk7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgY29tcGxldGVseSByZW1vdmVzIEJCIGZyb20gYWxsIGRhdGEgc3RydWN0dXJlcywgaW5jbHVkaW5nIGFsbAorICAvLy8gb2YgdGhlIExvb3Agb2JqZWN0cyBpdCBpcyBuZXN0ZWQgaW4gYW5kIG91ciBtYXBwaW5nIGZyb20KKyAgLy8vIE1hY2hpbmVCYXNpY0Jsb2NrcyB0byBsb29wcy4KKyAgdm9pZCByZW1vdmVCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqQkIpIHsKKyAgICBMSS5yZW1vdmVCbG9jayhCQik7CisgIH0KK307CisKKy8vIEFsbG93IGNsaWVudHMgdG8gd2FsayB0aGUgbGlzdCBvZiBuZXN0ZWQgbG9vcHMuLi4KK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxjb25zdCBNYWNoaW5lTG9vcCo+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IGNvbnN0IE1hY2hpbmVMb29wICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gTWFjaGluZUxvb3BJbmZvOjppdGVyYXRvcjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoY29uc3QgTWFjaGluZUxvb3AgKkwpIHsgcmV0dXJuIEw7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+YmVnaW4oKTsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+ZW5kKCk7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxNYWNoaW5lTG9vcCo+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IE1hY2hpbmVMb29wICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gTWFjaGluZUxvb3BJbmZvOjppdGVyYXRvcjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoTWFjaGluZUxvb3AgKkwpIHsgcmV0dXJuIEw7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+YmVnaW4oKTsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+ZW5kKCk7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUFDSElORUxPT1BJTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lTWVtT3BlcmFuZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVNZW1PcGVyYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhMGQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lTWVtT3BlcmFuZC5oCkBAIC0wLDAgKzEsMzI5IEBACisvLz09LSBsbHZtL0NvZGVHZW4vTWFjaGluZU1lbU9wZXJhbmQuaCAtIE1hY2hpbmVNZW1PcGVyYW5kIGNsYXNzIC0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIE1hY2hpbmVNZW1PcGVyYW5kIGNsYXNzLCB3aGljaCBpcyBhCisvLyBkZXNjcmlwdGlvbiBvZiBhIG1lbW9yeSByZWZlcmVuY2UuIEl0IGlzIHVzZWQgdG8gaGVscCB0cmFjayBkZXBlbmRlbmNpZXMKKy8vIGluIHRoZSBiYWNrZW5kLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVNRU1PUEVSQU5EX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVNRU1PUEVSQU5EX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0JpdG1hc2tFbnVtLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlclVuaW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1BzZXVkb1NvdXJjZVZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01ldGFkYXRhLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIiAvLyBQb2ludGVyTGlrZVR5cGVUcmFpdHM8VmFsdWUqPgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BdG9taWNPcmRlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGb2xkaW5nU2V0Tm9kZUlEOworY2xhc3MgTUROb2RlOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNb2R1bGVTbG90VHJhY2tlcjsKKworLy8vIFRoaXMgY2xhc3MgY29udGFpbnMgYSBkaXNjcmltaW5hdGVkIHVuaW9uIG9mIGluZm9ybWF0aW9uIGFib3V0IHBvaW50ZXJzIGluCisvLy8gbWVtb3J5IG9wZXJhbmRzLCByZWxhdGluZyB0aGVtIGJhY2sgdG8gTExWTSBJUiBvciB0byB2aXJ0dWFsIGxvY2F0aW9ucyAoc3VjaAorLy8vIGFzIGZyYW1lIGluZGljZXMpIHRoYXQgYXJlIGV4cG9zZWQgZHVyaW5nIGNvZGVnZW4uCitzdHJ1Y3QgTWFjaGluZVBvaW50ZXJJbmZvIHsKKyAgLy8vIFRoaXMgaXMgdGhlIElSIHBvaW50ZXIgdmFsdWUgZm9yIHRoZSBhY2Nlc3MsIG9yIGl0IGlzIG51bGwgaWYgdW5rbm93bi4KKyAgLy8vIElmIHRoaXMgaXMgbnVsbCwgdGhlbiB0aGUgYWNjZXNzIGlzIHRvIGEgcG9pbnRlciBpbiB0aGUgZGVmYXVsdCBhZGRyZXNzCisgIC8vLyBzcGFjZS4KKyAgUG9pbnRlclVuaW9uPGNvbnN0IFZhbHVlICosIGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlICo+IFY7CisKKyAgLy8vIE9mZnNldCAtIFRoaXMgaXMgYW4gb2Zmc2V0IGZyb20gdGhlIGJhc2UgVmFsdWUqLgorICBpbnQ2NF90IE9mZnNldDsKKworICB1aW50OF90IFN0YWNrSUQ7CisKKyAgdW5zaWduZWQgQWRkclNwYWNlID0gMDsKKworICBleHBsaWNpdCBNYWNoaW5lUG9pbnRlckluZm8oY29uc3QgVmFsdWUgKnYsIGludDY0X3Qgb2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgSUQgPSAwKQorICAgICAgOiBWKHYpLCBPZmZzZXQob2Zmc2V0KSwgU3RhY2tJRChJRCkgeworICAgIEFkZHJTcGFjZSA9IHYgPyB2LT5nZXRUeXBlKCktPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKSA6IDA7CisgIH0KKworICBleHBsaWNpdCBNYWNoaW5lUG9pbnRlckluZm8oY29uc3QgUHNldWRvU291cmNlVmFsdWUgKnYsIGludDY0X3Qgb2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgSUQgPSAwKQorICAgICAgOiBWKHYpLCBPZmZzZXQob2Zmc2V0KSwgU3RhY2tJRChJRCkgeworICAgIEFkZHJTcGFjZSA9IHYgPyB2LT5nZXRBZGRyZXNzU3BhY2UoKSA6IDA7CisgIH0KKworICBleHBsaWNpdCBNYWNoaW5lUG9pbnRlckluZm8odW5zaWduZWQgQWRkcmVzc1NwYWNlID0gMCkKKyAgICAgIDogVigoY29uc3QgVmFsdWUgKiludWxscHRyKSwgT2Zmc2V0KDApLCBTdGFja0lEKDApLAorICAgICAgICBBZGRyU3BhY2UoQWRkcmVzc1NwYWNlKSB7fQorCisgIGV4cGxpY2l0IE1hY2hpbmVQb2ludGVySW5mbygKKyAgICBQb2ludGVyVW5pb248Y29uc3QgVmFsdWUgKiwgY29uc3QgUHNldWRvU291cmNlVmFsdWUgKj4gdiwKKyAgICBpbnQ2NF90IG9mZnNldCA9IDAsCisgICAgdWludDhfdCBJRCA9IDApCisgICAgOiBWKHYpLCBPZmZzZXQob2Zmc2V0KSwgU3RhY2tJRChJRCkgeworICAgIGlmIChWKSB7CisgICAgICBpZiAoY29uc3QgYXV0byAqVmFsUHRyID0gVi5keW5fY2FzdDxjb25zdCBWYWx1ZSo+KCkpCisgICAgICAgIEFkZHJTcGFjZSA9IFZhbFB0ci0+Z2V0VHlwZSgpLT5nZXRQb2ludGVyQWRkcmVzc1NwYWNlKCk7CisgICAgICBlbHNlCisgICAgICAgIEFkZHJTcGFjZSA9IFYuZ2V0PGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlKj4oKS0+Z2V0QWRkcmVzc1NwYWNlKCk7CisgICAgfQorICB9CisKKyAgTWFjaGluZVBvaW50ZXJJbmZvIGdldFdpdGhPZmZzZXQoaW50NjRfdCBPKSBjb25zdCB7CisgICAgaWYgKFYuaXNOdWxsKCkpCisgICAgICByZXR1cm4gTWFjaGluZVBvaW50ZXJJbmZvKEFkZHJTcGFjZSk7CisgICAgaWYgKFYuaXM8Y29uc3QgVmFsdWUqPigpKQorICAgICAgcmV0dXJuIE1hY2hpbmVQb2ludGVySW5mbyhWLmdldDxjb25zdCBWYWx1ZSo+KCksIE9mZnNldCtPLCBTdGFja0lEKTsKKyAgICByZXR1cm4gTWFjaGluZVBvaW50ZXJJbmZvKFYuZ2V0PGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlKj4oKSwgT2Zmc2V0K08sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFja0lEKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBtZW1vcnkgcmVnaW9uIFtWLCBWK09mZnNldCtTaXplKSBpcyBrbm93biB0byBiZQorICAvLy8gZGVyZWZlcmVuY2VhYmxlLgorICBib29sIGlzRGVyZWZlcmVuY2VhYmxlKHVuc2lnbmVkIFNpemUsIExMVk1Db250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBMTFZNIElSIGFkZHJlc3Mgc3BhY2UgbnVtYmVyIHRoYXQgdGhpcyBwb2ludGVyIHBvaW50cyBpbnRvLgorICB1bnNpZ25lZCBnZXRBZGRyU3BhY2UoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgTWFjaGluZVBvaW50ZXJJbmZvIHJlY29yZCB0aGF0IHJlZmVycyB0byB0aGUgY29uc3RhbnQgcG9vbC4KKyAgc3RhdGljIE1hY2hpbmVQb2ludGVySW5mbyBnZXRDb25zdGFudFBvb2woTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKyAgLy8vIFJldHVybiBhIE1hY2hpbmVQb2ludGVySW5mbyByZWNvcmQgdGhhdCByZWZlcnMgdG8gdGhlIHNwZWNpZmllZAorICAvLy8gRnJhbWVJbmRleC4KKyAgc3RhdGljIE1hY2hpbmVQb2ludGVySW5mbyBnZXRGaXhlZFN0YWNrKE1hY2hpbmVGdW5jdGlvbiAmTUYsIGludCBGSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgT2Zmc2V0ID0gMCk7CisKKyAgLy8vIFJldHVybiBhIE1hY2hpbmVQb2ludGVySW5mbyByZWNvcmQgdGhhdCByZWZlcnMgdG8gYSBqdW1wIHRhYmxlIGVudHJ5LgorICBzdGF0aWMgTWFjaGluZVBvaW50ZXJJbmZvIGdldEp1bXBUYWJsZShNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworICAvLy8gUmV0dXJuIGEgTWFjaGluZVBvaW50ZXJJbmZvIHJlY29yZCB0aGF0IHJlZmVycyB0byBhIEdPVCBlbnRyeS4KKyAgc3RhdGljIE1hY2hpbmVQb2ludGVySW5mbyBnZXRHT1QoTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKyAgLy8vIFN0YWNrIHBvaW50ZXIgcmVsYXRpdmUgYWNjZXNzLgorICBzdGF0aWMgTWFjaGluZVBvaW50ZXJJbmZvIGdldFN0YWNrKE1hY2hpbmVGdW5jdGlvbiAmTUYsIGludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgSUQgPSAwKTsKKworICAvLy8gU3RhY2sgbWVtb3J5IHdpdGhvdXQgb3RoZXIgaW5mb3JtYXRpb24uCisgIHN0YXRpYyBNYWNoaW5lUG9pbnRlckluZm8gZ2V0VW5rbm93blN0YWNrKE1hY2hpbmVGdW5jdGlvbiAmTUYpOworfTsKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEEgZGVzY3JpcHRpb24gb2YgYSBtZW1vcnkgcmVmZXJlbmNlIHVzZWQgaW4gdGhlIGJhY2tlbmQuCisvLy8gSW5zdGVhZCBvZiBob2xkaW5nIGEgU3RvcmVJbnN0IG9yIExvYWRJbnN0LCB0aGlzIGNsYXNzIGhvbGRzIHRoZSBhZGRyZXNzCisvLy8gVmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBhbG9uZyB3aXRoIGEgYnl0ZSBzaXplIGFuZCBvZmZzZXQuIFRoaXMgYWxsb3dzIGl0CisvLy8gdG8gZGVzY3JpYmUgbG93ZXJlZCBsb2FkcyBhbmQgc3RvcmVzLiBBbHNvLCB0aGUgc3BlY2lhbCBQc2V1ZG9Tb3VyY2VWYWx1ZQorLy8vIG9iamVjdHMgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGxvYWRzIGFuZCBzdG9yZXMgdG8gbWVtb3J5IGxvY2F0aW9ucworLy8vIHRoYXQgYXJlbid0IGV4cGxpY2l0IGluIHRoZSByZWd1bGFyIExMVk0gSVIuCisvLy8KK2NsYXNzIE1hY2hpbmVNZW1PcGVyYW5kIHsKK3B1YmxpYzoKKyAgLy8vIEZsYWdzIHZhbHVlcy4gVGhlc2UgbWF5IGJlIG9yJ2QgdG9nZXRoZXIuCisgIGVudW0gRmxhZ3MgOiB1aW50MTZfdCB7CisgICAgLy8gTm8gZmxhZ3Mgc2V0LgorICAgIE1PTm9uZSA9IDAsCisgICAgLy8vIFRoZSBtZW1vcnkgYWNjZXNzIHJlYWRzIGRhdGEuCisgICAgTU9Mb2FkID0gMXUgPDwgMCwKKyAgICAvLy8gVGhlIG1lbW9yeSBhY2Nlc3Mgd3JpdGVzIGRhdGEuCisgICAgTU9TdG9yZSA9IDF1IDw8IDEsCisgICAgLy8vIFRoZSBtZW1vcnkgYWNjZXNzIGlzIHZvbGF0aWxlLgorICAgIE1PVm9sYXRpbGUgPSAxdSA8PCAyLAorICAgIC8vLyBUaGUgbWVtb3J5IGFjY2VzcyBpcyBub24tdGVtcG9yYWwuCisgICAgTU9Ob25UZW1wb3JhbCA9IDF1IDw8IDMsCisgICAgLy8vIFRoZSBtZW1vcnkgYWNjZXNzIGlzIGRlcmVmZXJlbmNlYWJsZSAoaS5lLiwgZG9lc24ndCB0cmFwKS4KKyAgICBNT0RlcmVmZXJlbmNlYWJsZSA9IDF1IDw8IDQsCisgICAgLy8vIFRoZSBtZW1vcnkgYWNjZXNzIGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIHZhbHVlIChvciB0cmFwcykuCisgICAgTU9JbnZhcmlhbnQgPSAxdSA8PCA1LAorCisgICAgLy8gUmVzZXJ2ZWQgZm9yIHVzZSBieSB0YXJnZXQtc3BlY2lmaWMgcGFzc2VzLgorICAgIC8vIFRhcmdldHMgbWF5IG92ZXJyaWRlIGdldFNlcmlhbGl6YWJsZU1hY2hpbmVNZW1PcGVyYW5kVGFyZ2V0RmxhZ3MoKSB0bworICAgIC8vIGVuYWJsZSBNSVIgc2VyaWFsaXphdGlvbi9wYXJzaW5nIG9mIHRoZXNlIGZsYWdzLiAgSWYgbW9yZSBvZiB0aGVzZSBmbGFncworICAgIC8vIGFyZSBhZGRlZCwgdGhlIE1JUiBwcmludGluZy9wYXJzaW5nIGNvZGUgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQgYXMgd2VsbC4KKyAgICBNT1RhcmdldEZsYWcxID0gMXUgPDwgNiwKKyAgICBNT1RhcmdldEZsYWcyID0gMXUgPDwgNywKKyAgICBNT1RhcmdldEZsYWczID0gMXUgPDwgOCwKKworICAgIExMVk1fTUFSS19BU19CSVRNQVNLX0VOVU0oLyogTGFyZ2VzdEZsYWcgPSAqLyBNT1RhcmdldEZsYWczKQorICB9OworCitwcml2YXRlOgorICAvLy8gQXRvbWljIGluZm9ybWF0aW9uIGZvciB0aGlzIG1lbW9yeSBvcGVyYXRpb24uCisgIHN0cnVjdCBNYWNoaW5lQXRvbWljSW5mbyB7CisgICAgLy8vIFN5bmNocm9uaXphdGlvbiBzY29wZSBJRCBmb3IgdGhpcyBtZW1vcnkgb3BlcmF0aW9uLgorICAgIHVuc2lnbmVkIFNTSUQgOiA4OyAgICAgICAgICAgIC8vIFN5bmNTY29wZTo6SUQKKyAgICAvLy8gQXRvbWljIG9yZGVyaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhpcyBtZW1vcnkgb3BlcmF0aW9uLiBGb3IgY21weGNoZworICAgIC8vLyBhdG9taWMgb3BlcmF0aW9ucywgYXRvbWljIG9yZGVyaW5nIHJlcXVpcmVtZW50cyB3aGVuIHN0b3JlIG9jY3Vycy4KKyAgICB1bnNpZ25lZCBPcmRlcmluZyA6IDQ7ICAgICAgICAvLyBlbnVtIEF0b21pY09yZGVyaW5nCisgICAgLy8vIEZvciBjbXB4Y2hnIGF0b21pYyBvcGVyYXRpb25zLCBhdG9taWMgb3JkZXJpbmcgcmVxdWlyZW1lbnRzIHdoZW4gc3RvcmUKKyAgICAvLy8gZG9lcyBub3Qgb2NjdXIuCisgICAgdW5zaWduZWQgRmFpbHVyZU9yZGVyaW5nIDogNDsgLy8gZW51bSBBdG9taWNPcmRlcmluZworICB9OworCisgIE1hY2hpbmVQb2ludGVySW5mbyBQdHJJbmZvOworICB1aW50NjRfdCBTaXplOworICBGbGFncyBGbGFnVmFsczsKKyAgdWludDE2X3QgQmFzZUFsaWduTG9nMjsgLy8gbG9nXzIoYmFzZV9hbGlnbm1lbnQpICsgMQorICBNYWNoaW5lQXRvbWljSW5mbyBBdG9taWNJbmZvOworICBBQU1ETm9kZXMgQUFJbmZvOworICBjb25zdCBNRE5vZGUgKlJhbmdlczsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0IGEgTWFjaGluZU1lbU9wZXJhbmQgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBQdHJJbmZvLCBmbGFncywKKyAgLy8vIHNpemUsIGFuZCBiYXNlIGFsaWdubWVudC4gRm9yIGF0b21pYyBvcGVyYXRpb25zIHRoZSBzeW5jaHJvbml6YXRpb24gc2NvcGUKKyAgLy8vIGFuZCBhdG9taWMgb3JkZXJpbmcgcmVxdWlyZW1lbnRzIG11c3QgYWxzbyBiZSBzcGVjaWZpZWQuIEZvciBjbXB4Y2hnCisgIC8vLyBhdG9taWMgb3BlcmF0aW9ucyB0aGUgYXRvbWljIG9yZGVyaW5nIHJlcXVpcmVtZW50cyB3aGVuIHN0b3JlIGRvZXMgbm90CisgIC8vLyBvY2N1ciBtdXN0IGFsc28gYmUgc3BlY2lmaWVkLgorICBNYWNoaW5lTWVtT3BlcmFuZChNYWNoaW5lUG9pbnRlckluZm8gUHRySW5mbywgRmxhZ3MgZmxhZ3MsIHVpbnQ2NF90IHMsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGJhc2VfYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBBQU1ETm9kZXMgJkFBSW5mbyA9IEFBTUROb2RlcygpLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKlJhbmdlcyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIFN5bmNTY29wZTo6SUQgU1NJRCA9IFN5bmNTY29wZTo6U3lzdGVtLAorICAgICAgICAgICAgICAgICAgICBBdG9taWNPcmRlcmluZyBPcmRlcmluZyA9IEF0b21pY09yZGVyaW5nOjpOb3RBdG9taWMsCisgICAgICAgICAgICAgICAgICAgIEF0b21pY09yZGVyaW5nIEZhaWx1cmVPcmRlcmluZyA9IEF0b21pY09yZGVyaW5nOjpOb3RBdG9taWMpOworCisgIGNvbnN0IE1hY2hpbmVQb2ludGVySW5mbyAmZ2V0UG9pbnRlckluZm8oKSBjb25zdCB7IHJldHVybiBQdHJJbmZvOyB9CisKKyAgLy8vIFJldHVybiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgYWNjZXNzLiBUaGlzIG1heSBlaXRoZXIgYmUgYSBub3JtYWwKKyAgLy8vIExMVk0gSVIgVmFsdWUsIG9yIG9uZSBvZiB0aGUgc3BlY2lhbCB2YWx1ZXMgdXNlZCBpbiBDb2RlR2VuLgorICAvLy8gU3BlY2lhbCB2YWx1ZXMgYXJlIHRob3NlIG9idGFpbmVkIHZpYQorICAvLy8gUHNldWRvU291cmNlVmFsdWU6OmdldEZpeGVkU3RhY2soaW50KSwgUHNldWRvU291cmNlVmFsdWU6OmdldFN0YWNrLCBhbmQKKyAgLy8vIG90aGVyIFBzZXVkb1NvdXJjZVZhbHVlIG1lbWJlciBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIG9iamVjdHMgd2hpY2ggc3RhbmQKKyAgLy8vIGZvciBmcmFtZS9zdGFjayBwb2ludGVyIHJlbGF0aXZlIHJlZmVyZW5jZXMgYW5kIG90aGVyIHNwZWNpYWwgcmVmZXJlbmNlcworICAvLy8gd2hpY2ggYXJlIG5vdCByZXByZXNlbnRhYmxlIGluIHRoZSBoaWdoLWxldmVsIElSLgorICBjb25zdCBWYWx1ZSAqZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBQdHJJbmZvLlYuZHluX2Nhc3Q8Y29uc3QgVmFsdWUqPigpOyB9CisKKyAgY29uc3QgUHNldWRvU291cmNlVmFsdWUgKmdldFBzZXVkb1ZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBQdHJJbmZvLlYuZHluX2Nhc3Q8Y29uc3QgUHNldWRvU291cmNlVmFsdWUqPigpOworICB9CisKKyAgY29uc3Qgdm9pZCAqZ2V0T3BhcXVlVmFsdWUoKSBjb25zdCB7IHJldHVybiBQdHJJbmZvLlYuZ2V0T3BhcXVlVmFsdWUoKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIHJhdyBmbGFncyBvZiB0aGUgc291cmNlIHZhbHVlLCBcc2VlIEZsYWdzLgorICBGbGFncyBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIEZsYWdWYWxzOyB9CisKKyAgLy8vIEJpdHdpc2UgT1IgdGhlIGN1cnJlbnQgZmxhZ3Mgd2l0aCB0aGUgZ2l2ZW4gZmxhZ3MuCisgIHZvaWQgc2V0RmxhZ3MoRmxhZ3MgZikgeyBGbGFnVmFscyB8PSBmOyB9CisKKyAgLy8vIEZvciBub3JtYWwgdmFsdWVzLCB0aGlzIGlzIGEgYnl0ZSBvZmZzZXQgYWRkZWQgdG8gdGhlIGJhc2UgYWRkcmVzcy4KKyAgLy8vIEZvciBQc2V1ZG9Tb3VyY2VWYWx1ZTo6RlBSZWwgdmFsdWVzLCB0aGlzIGlzIHRoZSBGcmFtZUluZGV4IG51bWJlci4KKyAgaW50NjRfdCBnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBQdHJJbmZvLk9mZnNldDsgfQorCisgIHVuc2lnbmVkIGdldEFkZHJTcGFjZSgpIGNvbnN0IHsgcmV0dXJuIFB0ckluZm8uZ2V0QWRkclNwYWNlKCk7IH0KKworICAvLy8gUmV0dXJuIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkgcmVmZXJlbmNlLgorICB1aW50NjRfdCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIG1pbmltdW0ga25vd24gYWxpZ25tZW50IGluIGJ5dGVzIG9mIHRoZSBhY3R1YWwgbWVtb3J5CisgIC8vLyByZWZlcmVuY2UuCisgIHVpbnQ2NF90IGdldEFsaWdubWVudCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIG1pbmltdW0ga25vd24gYWxpZ25tZW50IGluIGJ5dGVzIG9mIHRoZSBiYXNlIGFkZHJlc3MsIHdpdGhvdXQKKyAgLy8vIHRoZSBvZmZzZXQuCisgIHVpbnQ2NF90IGdldEJhc2VBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiAoMXUgPDwgQmFzZUFsaWduTG9nMikgPj4gMTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIEFBIHRhZ3MgZm9yIHRoZSBtZW1vcnkgcmVmZXJlbmNlLgorICBBQU1ETm9kZXMgZ2V0QUFJbmZvKCkgY29uc3QgeyByZXR1cm4gQUFJbmZvOyB9CisKKyAgLy8vIFJldHVybiB0aGUgcmFuZ2UgdGFnIGZvciB0aGUgbWVtb3J5IHJlZmVyZW5jZS4KKyAgY29uc3QgTUROb2RlICpnZXRSYW5nZXMoKSBjb25zdCB7IHJldHVybiBSYW5nZXM7IH0KKworICAvLy8gUmV0dXJucyB0aGUgc3luY2hyb25pemF0aW9uIHNjb3BlIElEIGZvciB0aGlzIG1lbW9yeSBvcGVyYXRpb24uCisgIFN5bmNTY29wZTo6SUQgZ2V0U3luY1Njb3BlSUQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN5bmNTY29wZTo6SUQ+KEF0b21pY0luZm8uU1NJRCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBhdG9taWMgb3JkZXJpbmcgcmVxdWlyZW1lbnRzIGZvciB0aGlzIG1lbW9yeSBvcGVyYXRpb24uIEZvcgorICAvLy8gY21weGNoZyBhdG9taWMgb3BlcmF0aW9ucywgcmV0dXJuIHRoZSBhdG9taWMgb3JkZXJpbmcgcmVxdWlyZW1lbnRzIHdoZW4KKyAgLy8vIHN0b3JlIG9jY3Vycy4KKyAgQXRvbWljT3JkZXJpbmcgZ2V0T3JkZXJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEF0b21pY09yZGVyaW5nPihBdG9taWNJbmZvLk9yZGVyaW5nKTsKKyAgfQorCisgIC8vLyBGb3IgY21weGNoZyBhdG9taWMgb3BlcmF0aW9ucywgcmV0dXJuIHRoZSBhdG9taWMgb3JkZXJpbmcgcmVxdWlyZW1lbnRzCisgIC8vLyB3aGVuIHN0b3JlIGRvZXMgbm90IG9jY3VyLgorICBBdG9taWNPcmRlcmluZyBnZXRGYWlsdXJlT3JkZXJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEF0b21pY09yZGVyaW5nPihBdG9taWNJbmZvLkZhaWx1cmVPcmRlcmluZyk7CisgIH0KKworICBib29sIGlzTG9hZCgpIGNvbnN0IHsgcmV0dXJuIEZsYWdWYWxzICYgTU9Mb2FkOyB9CisgIGJvb2wgaXNTdG9yZSgpIGNvbnN0IHsgcmV0dXJuIEZsYWdWYWxzICYgTU9TdG9yZTsgfQorICBib29sIGlzVm9sYXRpbGUoKSBjb25zdCB7IHJldHVybiBGbGFnVmFscyAmIE1PVm9sYXRpbGU7IH0KKyAgYm9vbCBpc05vblRlbXBvcmFsKCkgY29uc3QgeyByZXR1cm4gRmxhZ1ZhbHMgJiBNT05vblRlbXBvcmFsOyB9CisgIGJvb2wgaXNEZXJlZmVyZW5jZWFibGUoKSBjb25zdCB7IHJldHVybiBGbGFnVmFscyAmIE1PRGVyZWZlcmVuY2VhYmxlOyB9CisgIGJvb2wgaXNJbnZhcmlhbnQoKSBjb25zdCB7IHJldHVybiBGbGFnVmFscyAmIE1PSW52YXJpYW50OyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG9wZXJhdGlvbiBoYXMgYW4gYXRvbWljIG9yZGVyaW5nIHJlcXVpcmVtZW50IG9mCisgIC8vLyB1bm9yZGVyZWQgb3IgaGlnaGVyLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgaXNBdG9taWMoKSBjb25zdCB7IHJldHVybiBnZXRPcmRlcmluZygpICE9IEF0b21pY09yZGVyaW5nOjpOb3RBdG9taWM7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgbWVtb3J5IG9wZXJhdGlvbiBkb2Vzbid0IGhhdmUgYW55IG9yZGVyaW5nCisgIC8vLyBjb25zdHJhaW50cyBvdGhlciB0aGFuIG5vcm1hbCBhbGlhc2luZy4gVm9sYXRpbGUgYW5kIGF0b21pYyBtZW1vcnkKKyAgLy8vIG9wZXJhdGlvbnMgY2FuJ3QgYmUgcmVvcmRlcmVkLgorICAvLy8KKyAgLy8vIEN1cnJlbnRseSwgd2UgZG9uJ3QgbW9kZWwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB2b2xhdGlsZSBhbmQgYXRvbWljCisgIC8vLyBvcGVyYXRpb25zLiBUaGV5IHNob3VsZCByZXRhaW4gdGhlaXIgb3JkZXJpbmcgcmVsYXRpdmUgdG8gYWxsIG1lbW9yeQorICAvLy8gb3BlcmF0aW9ucy4KKyAgYm9vbCBpc1Vub3JkZXJlZCgpIGNvbnN0IHsgcmV0dXJuICFpc1ZvbGF0aWxlKCk7IH0KKworICAvLy8gVXBkYXRlIHRoaXMgTWFjaGluZU1lbU9wZXJhbmQgdG8gcmVmbGVjdCB0aGUgYWxpZ25tZW50IG9mIE1NTywgaWYgaXQgaGFzIGEKKyAgLy8vIGdyZWF0ZXIgYWxpZ25tZW50LiBUaGlzIG11c3Qgb25seSBiZSB1c2VkIHdoZW4gdGhlIG5ldyBhbGlnbm1lbnQgYXBwbGllcworICAvLy8gdG8gYWxsIHVzZXJzIG9mIHRoaXMgTWFjaGluZU1lbU9wZXJhbmQuCisgIHZvaWQgcmVmaW5lQWxpZ25tZW50KGNvbnN0IE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pOworCisgIC8vLyBDaGFuZ2UgdGhlIFNvdXJjZVZhbHVlIGZvciB0aGlzIE1hY2hpbmVNZW1PcGVyYW5kLiBUaGlzIHNob3VsZCBvbmx5IGJlCisgIC8vLyB1c2VkIHdoZW4gYW4gb2JqZWN0IGlzIGJlaW5nIHJlbG9jYXRlZCBhbmQgYWxsIHJlZmVyZW5jZXMgdG8gaXQgYXJlIGJlaW5nCisgIC8vLyB1cGRhdGVkLgorICB2b2lkIHNldFZhbHVlKGNvbnN0IFZhbHVlICpOZXdTVikgeyBQdHJJbmZvLlYgPSBOZXdTVjsgfQorICB2b2lkIHNldFZhbHVlKGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlICpOZXdTVikgeyBQdHJJbmZvLlYgPSBOZXdTVjsgfQorICB2b2lkIHNldE9mZnNldChpbnQ2NF90IE5ld09mZnNldCkgeyBQdHJJbmZvLk9mZnNldCA9IE5ld09mZnNldDsgfQorCisgIC8vLyBQcm9maWxlIC0gR2F0aGVyIHVuaXF1ZSBkYXRhIGZvciB0aGUgb2JqZWN0LgorICAvLy8KKyAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdDsKKworICAvLy8gU3VwcG9ydCBmb3Igb3BlcmF0b3I8PC4KKyAgLy8vIEB7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIE1vZHVsZVNsb3RUcmFja2VyICZNU1QpIGNvbnN0OworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgTW9kdWxlU2xvdFRyYWNrZXIgJk1TVCwKKyAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmU1NOcywgY29uc3QgTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqTUZJLCBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSkgY29uc3Q7CisgIC8vLyBAfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFjaGluZU1lbU9wZXJhbmQgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAmUkhTKSB7CisgICAgcmV0dXJuIExIUy5nZXRWYWx1ZSgpID09IFJIUy5nZXRWYWx1ZSgpICYmCisgICAgICAgICAgIExIUy5nZXRQc2V1ZG9WYWx1ZSgpID09IFJIUy5nZXRQc2V1ZG9WYWx1ZSgpICYmCisgICAgICAgICAgIExIUy5nZXRTaXplKCkgPT0gUkhTLmdldFNpemUoKSAmJgorICAgICAgICAgICBMSFMuZ2V0T2Zmc2V0KCkgPT0gUkhTLmdldE9mZnNldCgpICYmCisgICAgICAgICAgIExIUy5nZXRGbGFncygpID09IFJIUy5nZXRGbGFncygpICYmCisgICAgICAgICAgIExIUy5nZXRBQUluZm8oKSA9PSBSSFMuZ2V0QUFJbmZvKCkgJiYKKyAgICAgICAgICAgTEhTLmdldFJhbmdlcygpID09IFJIUy5nZXRSYW5nZXMoKSAmJgorICAgICAgICAgICBMSFMuZ2V0QWxpZ25tZW50KCkgPT0gUkhTLmdldEFsaWdubWVudCgpICYmCisgICAgICAgICAgIExIUy5nZXRBZGRyU3BhY2UoKSA9PSBSSFMuZ2V0QWRkclNwYWNlKCk7CisgIH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1hY2hpbmVNZW1PcGVyYW5kICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZU1lbU9wZXJhbmQgJlJIUykgeworICAgIHJldHVybiAhKExIUyA9PSBSSFMpOworICB9Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAmTVJPKSB7CisgIE1STy5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZTMwNGYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaApAQCAtMCwwICsxLDI3MSBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm8uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDb2xsZWN0IG1ldGEgaW5mb3JtYXRpb24gZm9yIGEgbW9kdWxlLiAgVGhpcyBpbmZvcm1hdGlvbiBzaG91bGQgYmUgaW4gYQorLy8gbmV1dHJhbCBmb3JtIHRoYXQgY2FuIGJlIHVzZWQgYnkgZGlmZmVyZW50IGRlYnVnZ2luZyBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nCisvLyBzY2hlbWVzLgorLy8KKy8vIFRoZSBvcmdhbml6YXRpb24gb2YgaW5mb3JtYXRpb24gaXMgcHJpbWFyaWx5IGNsdXN0ZXJlZCBhcm91bmQgdGhlIHNvdXJjZQorLy8gY29tcGlsZSB1bml0cy4gIFRoZSBtYWluIGV4Y2VwdGlvbiBpcyBzb3VyY2UgbGluZSBjb3JyZXNwb25kZW5jZSB3aGVyZQorLy8gaW5saW5pbmcgbWF5IGludGVybGVhdmUgY29kZSBmcm9tIHZhcmlvdXMgY29tcGlsZSB1bml0cy4KKy8vCisvLyBUaGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgTWFjaGluZU1vZHVsZUluZm8uCisvLworLy8gIC0tIFNvdXJjZSBkaXJlY3RvcmllcyAtIERpcmVjdG9yaWVzIGFyZSB1bmlxdWVkIGJhc2VkIG9uIHRoZWlyIGNhbm9uaWNhbAorLy8gICAgIHN0cmluZyBhbmQgYXNzaWduZWQgYSBzZXF1ZW50aWFsIG51bWVyaWMgSUQgKGJhc2UgMS4pCisvLyAgLS0gU291cmNlIGZpbGVzIC0gRmlsZXMgYXJlIGFsc28gdW5pcXVlZCBiYXNlZCBvbiB0aGVpciBuYW1lIGFuZCBkaXJlY3RvcnkKKy8vICAgICBJRC4gIEEgZmlsZSBJRCBpcyBzZXF1ZW50aWFsIG51bWJlciAoYmFzZSAxLikKKy8vICAtLSBTb3VyY2UgbGluZSBjb3JyZXNwb25kZW5jZSAtIEEgdmVjdG9yIG9mIGZpbGUgSUQsIGxpbmUjLCBjb2x1bW4jIHRyaXBsZXMuCisvLyAgICAgQSBERUJVR19MT0NBVElPTiBpbnN0cnVjdGlvbiBpcyBnZW5lcmF0ZWQgIGJ5IHRoZSBEQUcgTGVnYWxpemVyCisvLyAgICAgY29ycmVzcG9uZGluZyB0byBlYWNoIGVudHJ5IGluIHRoZSBzb3VyY2UgbGluZSBsaXN0LiAgVGhpcyBhbGxvd3MgYSBkZWJ1ZworLy8gICAgIGVtaXR0ZXIgdG8gZ2VuZXJhdGUgbGFiZWxzIHJlZmVyZW5jZWQgYnkgZGVidWcgaW5mb3JtYXRpb24gdGFibGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVNT0RVTEVJTkZPX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVNT0RVTEVJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgQ2FsbEluc3Q7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1NSUFkZHJMYWJlbE1hcDsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gVGhpcyBjbGFzcyBjYW4gYmUgZGVyaXZlZCBmcm9tIGFuZCB1c2VkIGJ5IHRhcmdldHMgdG8gaG9sZCBwcml2YXRlCisvLy8gdGFyZ2V0LXNwZWNpZmljIGluZm9ybWF0aW9uIGZvciBlYWNoIE1vZHVsZS4gIE9iamVjdHMgb2YgdHlwZSBhcmUKKy8vLyBhY2Nlc3NlZC9jcmVhdGVkIHdpdGggTU1JOjpnZXRJbmZvIGFuZCBkZXN0cm95ZWQgd2hlbiB0aGUgTWFjaGluZU1vZHVsZUluZm8KKy8vLyBpcyBkZXN0cm95ZWQuCisvLy8KK2NsYXNzIE1hY2hpbmVNb2R1bGVJbmZvSW1wbCB7CitwdWJsaWM6CisgIHVzaW5nIFN0dWJWYWx1ZVR5ID0gUG9pbnRlckludFBhaXI8TUNTeW1ib2wgKiwgMSwgYm9vbD47CisgIHVzaW5nIFN5bWJvbExpc3RUeSA9IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxNQ1N5bWJvbCAqLCBTdHViVmFsdWVUeT4+OworCisgIHZpcnR1YWwgfk1hY2hpbmVNb2R1bGVJbmZvSW1wbCgpOworCitwcm90ZWN0ZWQ6CisgIC8vLyBSZXR1cm4gdGhlIGVudHJpZXMgZnJvbSBhIERlbnNlTWFwIGluIGEgZGV0ZXJtaW5pc3RpYyBzb3J0ZWQgb3Jlci4KKyAgLy8vIENsZWFycyB0aGUgbWFwLgorICBzdGF0aWMgU3ltYm9sTGlzdFR5IGdldFNvcnRlZFN0dWJzKERlbnNlTWFwPE1DU3ltYm9sKiwgU3R1YlZhbHVlVHk+Jik7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFRoaXMgY2xhc3MgY29udGFpbnMgbWV0YSBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIG1vZHVsZS4gIFF1ZXJpZXMgY2FuIGJlCisvLy8gbWFkZSBieSBkaWZmZXJlbnQgZGVidWdnaW5nIGFuZCBleGNlcHRpb24gaGFuZGxpbmcgc2NoZW1lcyBhbmQgcmVmb3JtYXRlZAorLy8vIGZvciBzcGVjaWZpYyB1c2UuCisvLy8KK2NsYXNzIE1hY2hpbmVNb2R1bGVJbmZvIDogcHVibGljIEltbXV0YWJsZVBhc3MgeworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTTsKKworICAvLy8gVGhpcyBpcyB0aGUgTUNDb250ZXh0IHVzZWQgZm9yIHRoZSBlbnRpcmUgY29kZSBnZW5lcmF0b3IuCisgIE1DQ29udGV4dCBDb250ZXh0OworCisgIC8vLyBUaGlzIGlzIHRoZSBMTFZNIE1vZHVsZSBiZWluZyB3b3JrZWQgb24uCisgIGNvbnN0IE1vZHVsZSAqVGhlTW9kdWxlOworCisgIC8vLyBUaGlzIGlzIHRoZSBvYmplY3QtZmlsZS1mb3JtYXQtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YKKyAgLy8vIE1hY2hpbmVNb2R1bGVJbmZvSW1wbCwgd2hpY2ggbGV0cyB0YXJnZXRzIGFjY3VtdWxhdGUgd2hhdGV2ZXIgaW5mbyB0aGV5CisgIC8vLyB3YW50LgorICBNYWNoaW5lTW9kdWxlSW5mb0ltcGwgKk9iakZpbGVNTUk7CisKKyAgLy8vIFxuYW1lIEV4Y2VwdGlvbiBIYW5kbGluZworICAvLy8gXHsKKworICAvLy8gVmVjdG9yIG9mIGFsbCBwZXJzb25hbGl0eSBmdW5jdGlvbnMgZXZlciBzZWVuLiBVc2VkIHRvIGVtaXQgY29tbW9uIEVICisgIC8vLyBmcmFtZXMuCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZ1bmN0aW9uICo+IFBlcnNvbmFsaXRpZXM7CisKKyAgLy8vIFRoZSBjdXJyZW50IGNhbGwgc2l0ZSBpbmRleCBiZWluZyBwcm9jZXNzZWQsIGlmIGFueS4gMCBpZiBub25lLgorICB1bnNpZ25lZCBDdXJDYWxsU2l0ZTsKKworICAvLy8gXH0KKworICAvLy8gVGhpcyBtYXAga2VlcHMgdHJhY2sgb2Ygd2hpY2ggc3ltYm9sIGlzIGJlaW5nIHVzZWQgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIGJhc2ljIGJsb2NrJ3MgYWRkcmVzcyBvZiBsYWJlbC4KKyAgTU1JQWRkckxhYmVsTWFwICpBZGRyTGFiZWxTeW1ib2xzOworCisgIC8vIFRPRE86IElkZWFsbHksIHdoYXQgd2UnZCBsaWtlIGlzIHRvIGhhdmUgYSBzd2l0Y2ggdGhhdCBhbGxvd3MgZW1pdHRpbmcgCisgIC8vIHN5bmNocm9ub3VzIChwcmVjaXNlIGF0IGNhbGwtc2l0ZXMgb25seSkgQ0ZBIGludG8gLmVoX2ZyYW1lLiBIb3dldmVyLAorICAvLyBldmVuIHVuZGVyIHRoaXMgc3dpdGNoLCB3ZSdkIGxpa2UgLmRlYnVnX2ZyYW1lIHRvIGJlIHByZWNpc2Ugd2hlbiB1c2luZworICAvLyAtZy4gQXQgdGhpcyBtb21lbnQsIHRoZXJlJ3Mgbm8gd2F5IHRvIHNwZWNpZnkgdGhhdCBzb21lIENGSSBkaXJlY3RpdmVzCisgIC8vIGdvIGludG8gLmVoX2ZyYW1lIG9ubHksIHdoaWxlIG90aGVycyBnbyBpbnRvIC5kZWJ1Z19mcmFtZSBvbmx5LgorCisgIC8vLyBUcnVlIGlmIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhpcyBtb2R1bGUuCisgIGJvb2wgRGJnSW5mb0F2YWlsYWJsZTsKKworICAvLy8gVHJ1ZSBpZiB0aGlzIG1vZHVsZSBjYWxscyBWYXJBcmcgZnVuY3Rpb24gd2l0aCBmbG9hdGluZy1wb2ludCBhcmd1bWVudHMuCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gZW1pdCBhbiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIF9mbHR1c2VkIG9uIFdpbmRvd3MKKyAgLy8vIHRhcmdldHMuCisgIGJvb2wgVXNlc1ZBRmxvYXRBcmd1bWVudDsKKworICAvLy8gVHJ1ZSBpZiB0aGUgbW9kdWxlIGNhbGxzIHRoZSBfX21vcmVzdGFjayBmdW5jdGlvbiBpbmRpcmVjdGx5LCBhcyBpcworICAvLy8gcmVxdWlyZWQgdW5kZXIgdGhlIGxhcmdlIGNvZGUgbW9kZWwgb24geDg2LiBUaGlzIGlzIHVzZWQgdG8gZW1pdAorICAvLy8gYSBkZWZpbml0aW9uIG9mIGEgc3ltYm9sLCBfX21vcmVzdGFja19hZGRyLCBjb250YWluaW5nIHRoZSBhZGRyZXNzLiBTZWUKKyAgLy8vIGNvbW1lbnRzIGluIGxpYi9UYXJnZXQvWDg2L1g4NkZyYW1lTG93ZXJpbmcuY3BwIGZvciBtb3JlIGRldGFpbHMuCisgIGJvb2wgVXNlc01vcmVzdGFja0FkZHI7CisKKyAgLy8vIFRydWUgaWYgdGhlIG1vZHVsZSBjb250YWlucyBzcGxpdC1zdGFjayBmdW5jdGlvbnMuIFRoaXMgaXMgdXNlZCB0bworICAvLy8gZW1pdCAubm90ZS5HTlUtc3BsaXQtc3RhY2sgc2VjdGlvbiBhcyByZXF1aXJlZCBieSB0aGUgbGlua2VyIGZvcgorICAvLy8gc3BlY2lhbCBoYW5kbGluZyBzcGxpdC1zdGFjayBmdW5jdGlvbiBjYWxsaW5nIG5vLXNwbGl0LXN0YWNrIGZ1bmN0aW9uLgorICBib29sIEhhc1NwbGl0U3RhY2s7CisKKyAgLy8vIFRydWUgaWYgdGhlIG1vZHVsZSBjb250YWlucyBuby1zcGxpdC1zdGFjayBmdW5jdGlvbnMuIFRoaXMgaXMgdXNlZCB0bworICAvLy8gZW1pdCAubm90ZS5HTlUtbm8tc3BsaXQtc3RhY2sgc2VjdGlvbiB3aGVuIGl0IGFsc28gY29udGFpbnMgc3BsaXQtc3RhY2sKKyAgLy8vIGZ1bmN0aW9ucy4KKyAgYm9vbCBIYXNOb3NwbGl0U3RhY2s7CisKKyAgLy8vIE1hcHMgSVIgRnVuY3Rpb25zIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgTWFjaGluZUZ1bmN0aW9ucy4KKyAgRGVuc2VNYXA8Y29uc3QgRnVuY3Rpb24qLCBzdGQ6OnVuaXF1ZV9wdHI8TWFjaGluZUZ1bmN0aW9uPj4gTWFjaGluZUZ1bmN0aW9uczsKKyAgLy8vIE5leHQgdW5pcXVlIG51bWJlciBhdmFpbGFibGUgZm9yIGEgTWFjaGluZUZ1bmN0aW9uLgorICB1bnNpZ25lZCBOZXh0Rm5OdW0gPSAwOworICBjb25zdCBGdW5jdGlvbiAqTGFzdFJlcXVlc3QgPSBudWxscHRyOyAvLy88IFVzZWQgZm9yIHNob3J0Y3V0L2NhY2hlLgorICBNYWNoaW5lRnVuY3Rpb24gKkxhc3RSZXN1bHQgPSBudWxscHRyOyAvLy88IFVzZWQgZm9yIHNob3J0Y3V0L2NhY2hlLgorCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisKKyAgZXhwbGljaXQgTWFjaGluZU1vZHVsZUluZm8oY29uc3QgVGFyZ2V0TWFjaGluZSAqVE0gPSBudWxscHRyKTsKKyAgfk1hY2hpbmVNb2R1bGVJbmZvKCkgb3ZlcnJpZGU7CisKKyAgLy8gSW5pdGlhbGl6YXRpb24gYW5kIEZpbmFsaXphdGlvbgorICBib29sIGRvSW5pdGlhbGl6YXRpb24oTW9kdWxlICYpIG92ZXJyaWRlOworICBib29sIGRvRmluYWxpemF0aW9uKE1vZHVsZSAmKSBvdmVycmlkZTsKKworICBjb25zdCBNQ0NvbnRleHQgJmdldENvbnRleHQoKSBjb25zdCB7IHJldHVybiBDb250ZXh0OyB9CisgIE1DQ29udGV4dCAmZ2V0Q29udGV4dCgpIHsgcmV0dXJuIENvbnRleHQ7IH0KKworICBjb25zdCBNb2R1bGUgKmdldE1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIFRoZU1vZHVsZTsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBNYWNoaW5lRnVuY3Rpb24gY29uc3RydWN0ZWQgZm9yIHRoZSBJUiBmdW5jdGlvbiBccCBGLgorICAvLy8gQ3JlYXRlcyBhIG5ldyBNYWNoaW5lRnVuY3Rpb24gaWYgbm9uZSBleGlzdHMgeWV0LgorICBNYWNoaW5lRnVuY3Rpb24gJmdldE9yQ3JlYXRlTWFjaGluZUZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICZGKTsKKworICAvLy8gXGJyaWVkIFJldHVybnMgdGhlIE1hY2hpbmVGdW5jdGlvbiBhc3NvY2lhdGVkIHRvIElSIGZ1bmN0aW9uIFxwIEYgaWYgdGhlcmUKKyAgLy8vIGlzIG9uZSwgb3RoZXJ3aXNlIG51bGxwdHIuCisgIE1hY2hpbmVGdW5jdGlvbiAqZ2V0TWFjaGluZUZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICZGKSBjb25zdDsKKworICAvLy8gRGVsZXRlIHRoZSBNYWNoaW5lRnVuY3Rpb24gXHAgTUYgYW5kIHJlc2V0IHRoZSBsaW5rIGluIHRoZSBJUiBGdW5jdGlvbiB0bworICAvLy8gTWFjaGluZSBGdW5jdGlvbiBtYXAuCisgIHZvaWQgZGVsZXRlTWFjaGluZUZ1bmN0aW9uRm9yKEZ1bmN0aW9uICZGKTsKKworICAvLy8gS2VlcCB0cmFjayBvZiB2YXJpb3VzIHBlci1mdW5jdGlvbiBwaWVjZXMgb2YgaW5mb3JtYXRpb24gZm9yIGJhY2tlbmRzCisgIC8vLyB0aGF0IHdvdWxkIGxpa2UgdG8gZG8gc28uCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5PgorICBUeSAmZ2V0T2JqRmlsZUluZm8oKSB7CisgICAgaWYgKE9iakZpbGVNTUkgPT0gbnVsbHB0cikKKyAgICAgIE9iakZpbGVNTUkgPSBuZXcgVHkoKnRoaXMpOworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8VHkqPihPYmpGaWxlTU1JKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5PgorICBjb25zdCBUeSAmZ2V0T2JqRmlsZUluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TWFjaGluZU1vZHVsZUluZm8qPih0aGlzKS0+Z2V0T2JqRmlsZUluZm88VHk+KCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHZhbGlkIGRlYnVnIGluZm8gaXMgcHJlc2VudC4KKyAgYm9vbCBoYXNEZWJ1Z0luZm8oKSBjb25zdCB7IHJldHVybiBEYmdJbmZvQXZhaWxhYmxlOyB9CisgIHZvaWQgc2V0RGVidWdJbmZvQXZhaWxhYmlsaXR5KGJvb2wgYXZhaWwpIHsgRGJnSW5mb0F2YWlsYWJsZSA9IGF2YWlsOyB9CisKKyAgYm9vbCB1c2VzVkFGbG9hdEFyZ3VtZW50KCkgY29uc3QgeworICAgIHJldHVybiBVc2VzVkFGbG9hdEFyZ3VtZW50OworICB9CisKKyAgdm9pZCBzZXRVc2VzVkFGbG9hdEFyZ3VtZW50KGJvb2wgYikgeworICAgIFVzZXNWQUZsb2F0QXJndW1lbnQgPSBiOworICB9CisKKyAgYm9vbCB1c2VzTW9yZXN0YWNrQWRkcigpIGNvbnN0IHsKKyAgICByZXR1cm4gVXNlc01vcmVzdGFja0FkZHI7CisgIH0KKworICB2b2lkIHNldFVzZXNNb3Jlc3RhY2tBZGRyKGJvb2wgYikgeworICAgIFVzZXNNb3Jlc3RhY2tBZGRyID0gYjsKKyAgfQorCisgIGJvb2wgaGFzU3BsaXRTdGFjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gSGFzU3BsaXRTdGFjazsKKyAgfQorCisgIHZvaWQgc2V0SGFzU3BsaXRTdGFjayhib29sIGIpIHsKKyAgICBIYXNTcGxpdFN0YWNrID0gYjsKKyAgfQorCisgIGJvb2wgaGFzTm9zcGxpdFN0YWNrKCkgY29uc3QgeworICAgIHJldHVybiBIYXNOb3NwbGl0U3RhY2s7CisgIH0KKworICB2b2lkIHNldEhhc05vc3BsaXRTdGFjayhib29sIGIpIHsKKyAgICBIYXNOb3NwbGl0U3RhY2sgPSBiOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgc3ltYm9sIHRvIGJlIHVzZWQgZm9yIHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2sgd2hlbiBpdHMKKyAgLy8vIGFkZHJlc3MgaXMgdGFrZW4uICBUaGlzIGNhbm5vdCBiZSBpdHMgbm9ybWFsIExCQiBsYWJlbCBiZWNhdXNlIHRoZSBibG9jaworICAvLy8gbWF5IGJlIGFjY2Vzc2VkIG91dHNpZGUgaXRzIGNvbnRhaW5pbmcgZnVuY3Rpb24uCisgIE1DU3ltYm9sICpnZXRBZGRyTGFiZWxTeW1ib2woY29uc3QgQmFzaWNCbG9jayAqQkIpIHsKKyAgICByZXR1cm4gZ2V0QWRkckxhYmVsU3ltYm9sVG9FbWl0KEJCKS5mcm9udCgpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgc3ltYm9sIHRvIGJlIHVzZWQgZm9yIHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2sgd2hlbiBpdHMKKyAgLy8vIGFkZHJlc3MgaXMgdGFrZW4uICBJZiBvdGhlciBibG9ja3Mgd2VyZSBSQVVXJ2QgdG8gdGhpcyBvbmUsIHdlIG1heSBoYXZlCisgIC8vLyB0byBlbWl0IHRoZW0gYXMgd2VsbCwgcmV0dXJuIHRoZSB3aG9sZSBzZXQuCisgIEFycmF5UmVmPE1DU3ltYm9sICo+IGdldEFkZHJMYWJlbFN5bWJvbFRvRW1pdChjb25zdCBCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIElmIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gaGFzIGhhZCBhbnkgcmVmZXJlbmNlcyB0byBhZGRyZXNzLXRha2VuIGJsb2NrcworICAvLy8gZ2VuZXJhdGVkLCBidXQgdGhlIGJsb2NrIGdvdCBkZWxldGVkLCByZXR1cm4gdGhlIHN5bWJvbCBub3cgc28gd2UgY2FuCisgIC8vLyBlbWl0IGl0LiAgVGhpcyBwcmV2ZW50cyBlbWl0dGluZyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCB0aGF0IGhhcyBubworICAvLy8gZGVmaW5pdGlvbi4KKyAgdm9pZCB0YWtlRGVsZXRlZFN5bWJvbHNGb3JGdW5jdGlvbihjb25zdCBGdW5jdGlvbiAqRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNQ1N5bWJvbCo+ICZSZXN1bHQpOworCisgIC8vLyBcbmFtZSBFeGNlcHRpb24gSGFuZGxpbmcKKyAgLy8vIFx7CisKKyAgLy8vIFNldCB0aGUgY2FsbCBzaXRlIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuCisgIHZvaWQgc2V0Q3VycmVudENhbGxTaXRlKHVuc2lnbmVkIFNpdGUpIHsgQ3VyQ2FsbFNpdGUgPSBTaXRlOyB9CisKKyAgLy8vIEdldCB0aGUgY2FsbCBzaXRlIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQsIGlmIGFueS4gIHJldHVybiB6ZXJvIGlmCisgIC8vLyBub25lLgorICB1bnNpZ25lZCBnZXRDdXJyZW50Q2FsbFNpdGUoKSB7IHJldHVybiBDdXJDYWxsU2l0ZTsgfQorCisgIC8vLyBQcm92aWRlIHRoZSBwZXJzb25hbGl0eSBmdW5jdGlvbiBmb3IgdGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbi4KKyAgdm9pZCBhZGRQZXJzb25hbGl0eShjb25zdCBGdW5jdGlvbiAqUGVyc29uYWxpdHkpOworCisgIC8vLyBSZXR1cm4gYXJyYXkgb2YgcGVyc29uYWxpdHkgZnVuY3Rpb25zIGV2ZXIgc2Vlbi4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRnVuY3Rpb24gKj4mIGdldFBlcnNvbmFsaXRpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIFBlcnNvbmFsaXRpZXM7CisgIH0KKyAgLy8vIFx9Cit9OyAvLyBFbmQgY2xhc3MgTWFjaGluZU1vZHVsZUluZm8KKworLy89PT0tIE1NSSBidWlsZGluZyBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIERldGVybWluZSBpZiBhbnkgZmxvYXRpbmctcG9pbnQgdmFsdWVzIGFyZSBiZWluZyBwYXNzZWQgdG8gdGhpcyB2YXJpYWRpYworLy8vIGZ1bmN0aW9uLCBhbmQgc2V0IHRoZSBNYWNoaW5lTW9kdWxlSW5mbydzIHVzZXNWQUZsb2F0QXJndW1lbnQgZmxhZyBpZiBzby4KKy8vLyBUaGlzIGZsYWcgaXMgdXNlZCB0byBlbWl0IGFuIHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gX2ZsdHVzZWQgb24gV2luZG93cywKKy8vLyB3aGljaCB3aWxsIGxpbmsgaW4gTVNWQ1JUJ3MgZmxvYXRpbmctcG9pbnQgc3VwcG9ydC4KK3ZvaWQgY29tcHV0ZVVzZXNWQUZsb2F0QXJndW1lbnQoY29uc3QgQ2FsbEluc3QgJkksIE1hY2hpbmVNb2R1bGVJbmZvICZNTUkpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX01BQ0hJTkVNT0RVTEVJTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mb0ltcGxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm9JbXBscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhODdmYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm9JbXBscy5oCkBAIC0wLDAgKzEsODUgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vTWFjaGluZU1vZHVsZUluZm9JbXBscy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgb2JqZWN0LWZpbGUgZm9ybWF0IHNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBvZgorLy8gTWFjaGluZU1vZHVsZUluZm9JbXBsLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVNT0RVTEVJTkZPSU1QTFNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORU1PRFVMRUlORk9JTVBMU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mby5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNTeW1ib2w7CisKKy8vLyBNYWNoaW5lTW9kdWxlSW5mb01hY2hPIC0gVGhpcyBpcyBhIE1hY2hpbmVNb2R1bGVJbmZvSW1wbCBpbXBsZW1lbnRhdGlvbgorLy8vIGZvciBNYWNoTyB0YXJnZXRzLgorY2xhc3MgTWFjaGluZU1vZHVsZUluZm9NYWNoTyA6IHB1YmxpYyBNYWNoaW5lTW9kdWxlSW5mb0ltcGwgeworICAvLy8gR1ZTdHVicyAtIERhcndpbiAnJG5vbl9sYXp5X3B0cicgc3R1YnMuICBUaGUga2V5IGlzIHNvbWV0aGluZyBsaWtlCisgIC8vLyAiTGZvbyRub25fbGF6eV9wdHIiLCB0aGUgdmFsdWUgaXMgc29tZXRoaW5nIGxpa2UgIl9mb28iLiBUaGUgZXh0cmEgYml0CisgIC8vLyBpcyB0cnVlIGlmIHRoaXMgR1YgaXMgZXh0ZXJuYWwuCisgIERlbnNlTWFwPE1DU3ltYm9sICosIFN0dWJWYWx1ZVR5PiBHVlN0dWJzOworCisgIC8vLyBUaHJlYWRMb2NhbEdWU3R1YnMgLSBEYXJ3aW4gJyRub25fbGF6eV9wdHInIHN0dWJzLiAgVGhlIGtleSBpcyBzb21ldGhpbmcKKyAgLy8vIGxpa2UgIkxmb28kbm9uX2xhenlfcHRyIiwgdGhlIHZhbHVlIGlzIHNvbWV0aGluZyBsaWtlICJfZm9vIi4gVGhlIGV4dHJhCisgIC8vLyBiaXQgaXMgdHJ1ZSBpZiB0aGlzIEdWIGlzIGV4dGVybmFsLgorICBEZW5zZU1hcDxNQ1N5bWJvbCAqLCBTdHViVmFsdWVUeT4gVGhyZWFkTG9jYWxHVlN0dWJzOworCisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsgLy8gT3V0IG9mIGxpbmUgdmlydHVhbCBtZXRob2QuCisKK3B1YmxpYzoKKyAgTWFjaGluZU1vZHVsZUluZm9NYWNoTyhjb25zdCBNYWNoaW5lTW9kdWxlSW5mbyAmKSB7fQorCisgIFN0dWJWYWx1ZVR5ICZnZXRHVlN0dWJFbnRyeShNQ1N5bWJvbCAqU3ltKSB7CisgICAgYXNzZXJ0KFN5bSAmJiAiS2V5IGNhbm5vdCBiZSBudWxsIik7CisgICAgcmV0dXJuIEdWU3R1YnNbU3ltXTsKKyAgfQorCisgIFN0dWJWYWx1ZVR5ICZnZXRUaHJlYWRMb2NhbEdWU3R1YkVudHJ5KE1DU3ltYm9sICpTeW0pIHsKKyAgICBhc3NlcnQoU3ltICYmICJLZXkgY2Fubm90IGJlIG51bGwiKTsKKyAgICByZXR1cm4gVGhyZWFkTG9jYWxHVlN0dWJzW1N5bV07CisgIH0KKworICAvLy8gQWNjZXNzb3IgbWV0aG9kcyB0byByZXR1cm4gdGhlIHNldCBvZiBzdHVicyBpbiBzb3J0ZWQgb3JkZXIuCisgIFN5bWJvbExpc3RUeSBHZXRHVlN0dWJMaXN0KCkgeyByZXR1cm4gZ2V0U29ydGVkU3R1YnMoR1ZTdHVicyk7IH0KKyAgU3ltYm9sTGlzdFR5IEdldFRocmVhZExvY2FsR1ZTdHViTGlzdCgpIHsKKyAgICByZXR1cm4gZ2V0U29ydGVkU3R1YnMoVGhyZWFkTG9jYWxHVlN0dWJzKTsKKyAgfQorfTsKKworLy8vIE1hY2hpbmVNb2R1bGVJbmZvRUxGIC0gVGhpcyBpcyBhIE1hY2hpbmVNb2R1bGVJbmZvSW1wbCBpbXBsZW1lbnRhdGlvbgorLy8vIGZvciBFTEYgdGFyZ2V0cy4KK2NsYXNzIE1hY2hpbmVNb2R1bGVJbmZvRUxGIDogcHVibGljIE1hY2hpbmVNb2R1bGVJbmZvSW1wbCB7CisgIC8vLyBHVlN0dWJzIC0gVGhlc2Ugc3R1YnMgYXJlIHVzZWQgdG8gbWF0ZXJpYWxpemUgZ2xvYmFsIGFkZHJlc3NlcyBpbiBQSUMKKyAgLy8vIG1vZGUuCisgIERlbnNlTWFwPE1DU3ltYm9sICosIFN0dWJWYWx1ZVR5PiBHVlN0dWJzOworCisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsgLy8gT3V0IG9mIGxpbmUgdmlydHVhbCBtZXRob2QuCisKK3B1YmxpYzoKKyAgTWFjaGluZU1vZHVsZUluZm9FTEYoY29uc3QgTWFjaGluZU1vZHVsZUluZm8gJikge30KKworICBTdHViVmFsdWVUeSAmZ2V0R1ZTdHViRW50cnkoTUNTeW1ib2wgKlN5bSkgeworICAgIGFzc2VydChTeW0gJiYgIktleSBjYW5ub3QgYmUgbnVsbCIpOworICAgIHJldHVybiBHVlN0dWJzW1N5bV07CisgIH0KKworICAvLy8gQWNjZXNzb3IgbWV0aG9kcyB0byByZXR1cm4gdGhlIHNldCBvZiBzdHVicyBpbiBzb3J0ZWQgb3JkZXIuCisKKyAgU3ltYm9sTGlzdFR5IEdldEdWU3R1Ykxpc3QoKSB7IHJldHVybiBnZXRTb3J0ZWRTdHVicyhHVlN0dWJzKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9NQUNISU5FTU9EVUxFSU5GT0lNUExTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lT3BlcmFuZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVPcGVyYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwZGIxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lT3BlcmFuZC5oCkBAIC0wLDAgKzEsOTQxIEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lT3BlcmFuZC5oIC0gTWFjaGluZU9wZXJhbmQgY2xhc3MgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIE1hY2hpbmVPcGVyYW5kIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVPUEVSQU5EX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVPUEVSQU5EX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Mb3dMZXZlbFR5cGVJbXBsLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCbG9ja0FkZHJlc3M7CitjbGFzcyBDb25zdGFudEZQOworY2xhc3MgQ29uc3RhbnRJbnQ7CitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIE1DQ0ZJSW5zdHJ1Y3Rpb247CitjbGFzcyBNRE5vZGU7CitjbGFzcyBNb2R1bGVTbG90VHJhY2tlcjsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CitjbGFzcyBUYXJnZXRJbnRyaW5zaWNJbmZvOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworY2xhc3MgaGFzaF9jb2RlOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBNQ1N5bWJvbDsKKworLy8vIE1hY2hpbmVPcGVyYW5kIGNsYXNzIC0gUmVwcmVzZW50YXRpb24gb2YgZWFjaCBtYWNoaW5lIGluc3RydWN0aW9uIG9wZXJhbmQuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGlzbid0IGEgUE9EIHR5cGUgYmVjYXVzZSBpdCBoYXMgYSBwcml2YXRlIGNvbnN0cnVjdG9yLCBidXQgaXRzCisvLy8gZGVzdHJ1Y3RvciBtdXN0IGJlIHRyaXZpYWwuIEZ1bmN0aW9ucyBsaWtlIE1hY2hpbmVJbnN0cjo6YWRkT3BlcmFuZCgpLAorLy8vIE1hY2hpbmVSZWdpc3RlckluZm86Om1vdmVPcGVyYW5kcygpLCBhbmQgTUY6OkRlbGV0ZU1hY2hpbmVJbnN0cigpIGRlcGVuZCBvbgorLy8vIG5vdCBoYXZpbmcgdG8gY2FsbCB0aGUgTWFjaGluZU9wZXJhbmQgZGVzdHJ1Y3Rvci4KKy8vLworY2xhc3MgTWFjaGluZU9wZXJhbmQgeworcHVibGljOgorICBlbnVtIE1hY2hpbmVPcGVyYW5kVHlwZSA6IHVuc2lnbmVkIGNoYXIgeworICAgIE1PX1JlZ2lzdGVyLCAgICAgICAgICAvLy88IFJlZ2lzdGVyIG9wZXJhbmQuCisgICAgTU9fSW1tZWRpYXRlLCAgICAgICAgIC8vLzwgSW1tZWRpYXRlIG9wZXJhbmQKKyAgICBNT19DSW1tZWRpYXRlLCAgICAgICAgLy8vPCBJbW1lZGlhdGUgPjY0Yml0IG9wZXJhbmQKKyAgICBNT19GUEltbWVkaWF0ZSwgICAgICAgLy8vPCBGbG9hdGluZy1wb2ludCBpbW1lZGlhdGUgb3BlcmFuZAorICAgIE1PX01hY2hpbmVCYXNpY0Jsb2NrLCAvLy88IE1hY2hpbmVCYXNpY0Jsb2NrIHJlZmVyZW5jZQorICAgIE1PX0ZyYW1lSW5kZXgsICAgICAgICAvLy88IEFic3RyYWN0IFN0YWNrIEZyYW1lIEluZGV4CisgICAgTU9fQ29uc3RhbnRQb29sSW5kZXgsIC8vLzwgQWRkcmVzcyBvZiBpbmRleGVkIENvbnN0YW50IGluIENvbnN0YW50IFBvb2wKKyAgICBNT19UYXJnZXRJbmRleCwgICAgICAgLy8vPCBUYXJnZXQtZGVwZW5kZW50IGluZGV4K29mZnNldCBvcGVyYW5kLgorICAgIE1PX0p1bXBUYWJsZUluZGV4LCAgICAvLy88IEFkZHJlc3Mgb2YgaW5kZXhlZCBKdW1wIFRhYmxlIGZvciBzd2l0Y2gKKyAgICBNT19FeHRlcm5hbFN5bWJvbCwgICAgLy8vPCBOYW1lIG9mIGV4dGVybmFsIGdsb2JhbCBzeW1ib2wKKyAgICBNT19HbG9iYWxBZGRyZXNzLCAgICAgLy8vPCBBZGRyZXNzIG9mIGEgZ2xvYmFsIHZhbHVlCisgICAgTU9fQmxvY2tBZGRyZXNzLCAgICAgIC8vLzwgQWRkcmVzcyBvZiBhIGJhc2ljIGJsb2NrCisgICAgTU9fUmVnaXN0ZXJNYXNrLCAgICAgIC8vLzwgTWFzayBvZiBwcmVzZXJ2ZWQgcmVnaXN0ZXJzLgorICAgIE1PX1JlZ2lzdGVyTGl2ZU91dCwgICAvLy88IE1hc2sgb2YgbGl2ZS1vdXQgcmVnaXN0ZXJzLgorICAgIE1PX01ldGFkYXRhLCAgICAgICAgICAvLy88IE1ldGFkYXRhIHJlZmVyZW5jZSAoZm9yIGRlYnVnIGluZm8pCisgICAgTU9fTUNTeW1ib2wsICAgICAgICAgIC8vLzwgTUNTeW1ib2wgcmVmZXJlbmNlIChmb3IgZGVidWcvZWggaW5mbykKKyAgICBNT19DRklJbmRleCwgICAgICAgICAgLy8vPCBNQ0NGSUluc3RydWN0aW9uIGluZGV4LgorICAgIE1PX0ludHJpbnNpY0lELCAgICAgICAvLy88IEludHJpbnNpYyBJRCBmb3IgSVNlbAorICAgIE1PX1ByZWRpY2F0ZSwgICAgICAgICAvLy88IEdlbmVyaWMgcHJlZGljYXRlIGZvciBJU2VsCisgICAgTU9fTGFzdCA9IE1PX1ByZWRpY2F0ZSwKKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIE9wS2luZCAtIFNwZWNpZnkgd2hhdCBraW5kIG9mIG9wZXJhbmQgdGhpcyBpcy4gIFRoaXMgZGlzY3JpbWluYXRlcyB0aGUKKyAgLy8vIHVuaW9uLgorICB1bnNpZ25lZCBPcEtpbmQgOiA4OworCisgIC8vLyBTdWJyZWdpc3RlciBudW1iZXIgZm9yIE1PX1JlZ2lzdGVyLiAgQSB2YWx1ZSBvZiAwIGluZGljYXRlcyB0aGUKKyAgLy8vIE1PX1JlZ2lzdGVyIGhhcyBubyBzdWJSZWcuCisgIC8vLworICAvLy8gRm9yIGFsbCBvdGhlciBraW5kcyBvZiBvcGVyYW5kcywgdGhpcyBmaWVsZCBob2xkcyB0YXJnZXQtc3BlY2lmaWMgZmxhZ3MuCisgIHVuc2lnbmVkIFN1YlJlZ19UYXJnZXRGbGFncyA6IDEyOworCisgIC8vLyBUaWVkVG8gLSBOb24temVybyB3aGVuIHRoaXMgcmVnaXN0ZXIgb3BlcmFuZCBpcyB0aWVkIHRvIGFub3RoZXIgcmVnaXN0ZXIKKyAgLy8vIG9wZXJhbmQuIFRoZSBlbmNvZGluZyBvZiB0aGlzIGZpZWxkIGlzIGRlc2NyaWJlZCBpbiB0aGUgYmxvY2sgY29tbWVudAorICAvLy8gYmVmb3JlIE1hY2hpbmVJbnN0cjo6dGllT3BlcmFuZHMoKS4KKyAgdW5zaWduZWQgVGllZFRvIDogNDsKKworICAvLy8gSXNEZWYgLSBUcnVlIGlmIHRoaXMgaXMgYSBkZWYsIGZhbHNlIGlmIHRoaXMgaXMgYSB1c2Ugb2YgdGhlIHJlZ2lzdGVyLgorICAvLy8gVGhpcyBpcyBvbmx5IHZhbGlkIG9uIHJlZ2lzdGVyIG9wZXJhbmRzLgorICAvLy8KKyAgdW5zaWduZWQgSXNEZWYgOiAxOworCisgIC8vLyBJc0ltcCAtIFRydWUgaWYgdGhpcyBpcyBhbiBpbXBsaWNpdCBkZWYgb3IgdXNlLCBmYWxzZSBpZiBpdCBpcyBleHBsaWNpdC4KKyAgLy8vIFRoaXMgaXMgb25seSB2YWxpZCBvbiByZWdpc3RlciBvcGRlcmFuZHMuCisgIC8vLworICB1bnNpZ25lZCBJc0ltcCA6IDE7CisKKyAgLy8vIElzRGVhZE9yS2lsbAorICAvLy8gRm9yIHVzZXM6IElzS2lsbCAtIFRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBpcyB0aGUgbGFzdCB1c2Ugb2YgdGhlCisgIC8vLyByZWdpc3RlciBvbiB0aGlzIHBhdGggdGhyb3VnaCB0aGUgZnVuY3Rpb24uCisgIC8vLyBGb3IgZGVmczogSXNEZWFkIC0gVHJ1ZSBpZiB0aGlzIHJlZ2lzdGVyIGlzIG5ldmVyIHVzZWQgYnkgYSBzdWJzZXF1ZW50CisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgLy8vIFRoaXMgaXMgb25seSB2YWxpZCBvbiByZWdpc3RlciBvcGVyYW5kcy4KKyAgdW5zaWduZWQgSXNEZWFkT3JLaWxsIDogMTsKKworICAvLy8gU2VlIGlzUmVuYW1hYmxlKCkuCisgIHVuc2lnbmVkIElzUmVuYW1hYmxlIDogMTsKKworICAvLy8gSXNVbmRlZiAtIFRydWUgaWYgdGhpcyByZWdpc3RlciBvcGVyYW5kIHJlYWRzIGFuICJ1bmRlZiIgdmFsdWUsIGkuZS4gdGhlCisgIC8vLyByZWFkIHZhbHVlIGRvZXNuJ3QgbWF0dGVyLiAgVGhpcyBmbGFnIGNhbiBiZSBzZXQgb24gYm90aCB1c2UgYW5kIGRlZgorICAvLy8gb3BlcmFuZHMuICBPbiBhIHN1Yi1yZWdpc3RlciBkZWYgb3BlcmFuZCwgaXQgcmVmZXJzIHRvIHRoZSBwYXJ0IG9mIHRoZQorICAvLy8gcmVnaXN0ZXIgdGhhdCBpc24ndCB3cml0dGVuLiAgT24gYSBmdWxsLXJlZ2lzdGVyIGRlZiBvcGVyYW5kLCBpdCBpcyBhCisgIC8vLyBub29wLiAgU2VlIHJlYWRzUmVnKCkuCisgIC8vLworICAvLy8gVGhpcyBpcyBvbmx5IHZhbGlkIG9uIHJlZ2lzdGVycy4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgYW4gaW5zdHJ1Y3Rpb24gbWF5IGhhdmUgbXVsdGlwbGUgPHVuZGVmPiBvcGVyYW5kcyByZWZlcnJpbmcgdG8KKyAgLy8vIHRoZSBzYW1lIHJlZ2lzdGVyLiAgSW4gdGhhdCBjYXNlLCB0aGUgaW5zdHJ1Y3Rpb24gbWF5IGRlcGVuZCBvbiB0aG9zZQorICAvLy8gb3BlcmFuZHMgcmVhZGluZyB0aGUgc2FtZSBkb250LWNhcmUgdmFsdWUuICBGb3IgZXhhbXBsZToKKyAgLy8vCisgIC8vLyAgICUxID0gWE9SIHVuZGVmICUyLCB1bmRlZiAlMgorICAvLy8KKyAgLy8vIEFueSByZWdpc3RlciBjYW4gYmUgdXNlZCBmb3IgJTIsIGFuZCBpdHMgdmFsdWUgZG9lc24ndCBtYXR0ZXIsIGJ1dAorICAvLy8gdGhlIHR3byBvcGVyYW5kcyBtdXN0IGJlIHRoZSBzYW1lIHJlZ2lzdGVyLgorICAvLy8KKyAgdW5zaWduZWQgSXNVbmRlZiA6IDE7CisKKyAgLy8vIElzSW50ZXJuYWxSZWFkIC0gVHJ1ZSBpZiB0aGlzIG9wZXJhbmQgcmVhZHMgYSB2YWx1ZSB0aGF0IHdhcyBkZWZpbmVkCisgIC8vLyBpbnNpZGUgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gb3IgYnVuZGxlLiAgVGhpcyBmbGFnIGNhbiBiZSBzZXQgb24gYm90aCB1c2UKKyAgLy8vIGFuZCBkZWYgb3BlcmFuZHMuICBPbiBhIHN1Yi1yZWdpc3RlciBkZWYgb3BlcmFuZCwgaXQgcmVmZXJzIHRvIHRoZSBwYXJ0CisgIC8vLyBvZiB0aGUgcmVnaXN0ZXIgdGhhdCBpc24ndCB3cml0dGVuLiAgT24gYSBmdWxsLXJlZ2lzdGVyIGRlZiBvcGVyYW5kLCBpdAorICAvLy8gaXMgYSBub29wLgorICAvLy8KKyAgLy8vIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgdGhlIGluc3RydWN0aW9uIGJ1bmRsZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lCisgIC8vLyBvdGhlciBkZWYgb2YgdGhlIHJlZ2lzdGVyLiAgSWYgbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBidW5kbGUgZGVmaW5lCisgIC8vLyB0aGUgcmVnaXN0ZXIsIHRoZSBtZWFuaW5nIGlzIHRhcmdldC1kZWZpbmVkLgorICB1bnNpZ25lZCBJc0ludGVybmFsUmVhZCA6IDE7CisKKyAgLy8vIElzRWFybHlDbG9iYmVyIC0gVHJ1ZSBpZiB0aGlzIE1PX1JlZ2lzdGVyICdkZWYnIG9wZXJhbmQgaXMgd3JpdHRlbiB0bworICAvLy8gYnkgdGhlIE1hY2hpbmVJbnN0ciBiZWZvcmUgYWxsIGlucHV0IHJlZ2lzdGVycyBhcmUgcmVhZC4gIFRoaXMgaXMgdXNlZCB0bworICAvLy8gbW9kZWwgdGhlIEdDQyBpbmxpbmUgYXNtICcmJyBjb25zdHJhaW50IG1vZGlmaWVyLgorICB1bnNpZ25lZCBJc0Vhcmx5Q2xvYmJlciA6IDE7CisKKyAgLy8vIElzRGVidWcgLSBUcnVlIGlmIHRoaXMgTU9fUmVnaXN0ZXIgJ3VzZScgb3BlcmFuZCBpcyBpbiBhIGRlYnVnIHBzZXVkbywKKyAgLy8vIG5vdCBhIHJlYWwgaW5zdHJ1Y3Rpb24uICBTdWNoIHVzZXMgc2hvdWxkIGJlIGlnbm9yZWQgZHVyaW5nIGNvZGVnZW4uCisgIHVuc2lnbmVkIElzRGVidWcgOiAxOworCisgIC8vLyBTbWFsbENvbnRlbnRzIC0gVGhpcyByZWFsbHkgc2hvdWxkIGJlIHBhcnQgb2YgdGhlIENvbnRlbnRzIHVuaW9uLCBidXQKKyAgLy8vIGxpdmVzIG91dCBoZXJlIHNvIHdlIGNhbiBnZXQgYSBiZXR0ZXIgcGFja2VkIHN0cnVjdC4KKyAgLy8vIE1PX1JlZ2lzdGVyOiBSZWdpc3RlciBudW1iZXIuCisgIC8vLyBPZmZzZXRlZEluZm86IExvdyBiaXRzIG9mIG9mZnNldC4KKyAgdW5pb24geworICAgIHVuc2lnbmVkIFJlZ05vOyAgICAgICAgICAgLy8gRm9yIE1PX1JlZ2lzdGVyLgorICAgIHVuc2lnbmVkIE9mZnNldExvOyAgICAgICAgLy8gTWF0Y2hlcyBDb250ZW50cy5PZmZzZXRlZEluZm8uT2Zmc2V0SGkuCisgIH0gU21hbGxDb250ZW50czsKKworICAvLy8gUGFyZW50TUkgLSBUaGlzIGlzIHRoZSBpbnN0cnVjdGlvbiB0aGF0IHRoaXMgb3BlcmFuZCBpcyBlbWJlZGRlZCBpbnRvLgorICAvLy8gVGhpcyBpcyB2YWxpZCBmb3IgYWxsIG9wZXJhbmQgdHlwZXMsIHdoZW4gdGhlIG9wZXJhbmQgaXMgaW4gYW4gaW5zdHIuCisgIE1hY2hpbmVJbnN0ciAqUGFyZW50TUk7CisKKyAgLy8vIENvbnRlbnRzIHVuaW9uIC0gVGhpcyBjb250YWlucyB0aGUgcGF5bG9hZCBmb3IgdGhlIHZhcmlvdXMgb3BlcmFuZCB0eXBlcy4KKyAgdW5pb24geworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkI7ICAvLyBGb3IgTU9fTWFjaGluZUJhc2ljQmxvY2suCisgICAgY29uc3QgQ29uc3RhbnRGUCAqQ0ZQOyAgIC8vIEZvciBNT19GUEltbWVkaWF0ZS4KKyAgICBjb25zdCBDb25zdGFudEludCAqQ0k7ICAgLy8gRm9yIE1PX0NJbW1lZGlhdGUuIEludGVnZXJzID4gNjRiaXQuCisgICAgaW50NjRfdCBJbW1WYWw7ICAgICAgICAgIC8vIEZvciBNT19JbW1lZGlhdGUuCisgICAgY29uc3QgdWludDMyX3QgKlJlZ01hc2s7IC8vIEZvciBNT19SZWdpc3Rlck1hc2sgYW5kIE1PX1JlZ2lzdGVyTGl2ZU91dC4KKyAgICBjb25zdCBNRE5vZGUgKk1EOyAgICAgICAgLy8gRm9yIE1PX01ldGFkYXRhLgorICAgIE1DU3ltYm9sICpTeW07ICAgICAgICAgICAvLyBGb3IgTU9fTUNTeW1ib2wuCisgICAgdW5zaWduZWQgQ0ZJSW5kZXg7ICAgICAgIC8vIEZvciBNT19DRkkuCisgICAgSW50cmluc2ljOjpJRCBJbnRyaW5zaWNJRDsgLy8gRm9yIE1PX0ludHJpbnNpY0lELgorICAgIHVuc2lnbmVkIFByZWQ7ICAgICAgICAgICAvLyBGb3IgTU9fUHJlZGljYXRlCisKKyAgICBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgIC8vIEZvciBNT19SZWdpc3Rlci4KKyAgICAgIC8vIFJlZ2lzdGVyIG51bWJlciBpcyBpbiBTbWFsbENvbnRlbnRzLlJlZ05vLgorICAgICAgTWFjaGluZU9wZXJhbmQgKlByZXY7ICAgLy8gQWNjZXNzIGxpc3QgZm9yIHJlZ2lzdGVyLiBTZWUgTVJJLgorICAgICAgTWFjaGluZU9wZXJhbmQgKk5leHQ7CisgICAgfSBSZWc7CisKKyAgICAvLy8gT2Zmc2V0ZWRJbmZvIC0gVGhpcyBzdHJ1Y3QgY29udGFpbnMgdGhlIG9mZnNldCBhbmQgYW4gb2JqZWN0IGlkZW50aWZpZXIuCisgICAgLy8vIHRoaXMgcmVwcmVzZW50IHRoZSBvYmplY3QgYXMgd2l0aCBhbiBvcHRpb25hbCBvZmZzZXQgZnJvbSBpdC4KKyAgICBzdHJ1Y3QgeworICAgICAgdW5pb24geworICAgICAgICBpbnQgSW5kZXg7ICAgICAgICAgICAgICAgIC8vIEZvciBNT18qSW5kZXggLSBUaGUgaW5kZXggaXRzZWxmLgorICAgICAgICBjb25zdCBjaGFyICpTeW1ib2xOYW1lOyAgIC8vIEZvciBNT19FeHRlcm5hbFN5bWJvbC4KKyAgICAgICAgY29uc3QgR2xvYmFsVmFsdWUgKkdWOyAgICAvLyBGb3IgTU9fR2xvYmFsQWRkcmVzcy4KKyAgICAgICAgY29uc3QgQmxvY2tBZGRyZXNzICpCQTsgICAvLyBGb3IgTU9fQmxvY2tBZGRyZXNzLgorICAgICAgfSBWYWw7CisgICAgICAvLyBMb3cgYml0cyBvZiBvZmZzZXQgYXJlIGluIFNtYWxsQ29udGVudHMuT2Zmc2V0TG8uCisgICAgICBpbnQgT2Zmc2V0SGk7ICAgICAgICAgICAgICAgLy8gQW4gb2Zmc2V0IGZyb20gdGhlIG9iamVjdCwgaGlnaCAzMiBiaXRzLgorICAgIH0gT2Zmc2V0ZWRJbmZvOworICB9IENvbnRlbnRzOworCisgIGV4cGxpY2l0IE1hY2hpbmVPcGVyYW5kKE1hY2hpbmVPcGVyYW5kVHlwZSBLKQorICAgIDogT3BLaW5kKEspLCBTdWJSZWdfVGFyZ2V0RmxhZ3MoMCksIFBhcmVudE1JKG51bGxwdHIpIHsKKyAgICAvLyBBc3NlcnQgdGhhdCB0aGUgbGF5b3V0IGlzIHdoYXQgd2UgZXhwZWN0LiBJdCdzIGVhc3kgdG8gZ3JvdyB0aGlzIG9iamVjdC4KKyAgICBzdGF0aWNfYXNzZXJ0KGFsaWdub2YoTWFjaGluZU9wZXJhbmQpIDw9IGFsaWdub2YoaW50NjRfdCksCisgICAgICAgICAgICAgICAgICAiTWFjaGluZU9wZXJhbmQgc2hvdWxkbid0IGJlIG1vcmUgdGhhbiA4IGJ5dGUgYWxpZ25lZCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKENvbnRlbnRzKSA8PSAyICogc2l6ZW9mKHZvaWQgKiksCisgICAgICAgICAgICAgICAgICAiQ29udGVudHMgc2hvdWxkIGJlIGF0IG1vc3QgdHdvIHBvaW50ZXJzIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoTWFjaGluZU9wZXJhbmQpIDw9CisgICAgICAgICAgICAgICAgICAgICAgYWxpZ25UbzxhbGlnbm9mKGludDY0X3QpPigyICogc2l6ZW9mKHVuc2lnbmVkKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICogc2l6ZW9mKHZvaWQgKikpLAorICAgICAgICAgICAgICAgICAgIk1hY2hpbmVPcGVyYW5kIHRvbyBiaWcuIFNob3VsZCBiZSBLaW5kLCBTbWFsbENvbnRlbnRzLCAiCisgICAgICAgICAgICAgICAgICAiUGFyZW50TUksIGFuZCBDb250ZW50cyIpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIGdldFR5cGUgLSBSZXR1cm5zIHRoZSBNYWNoaW5lT3BlcmFuZFR5cGUgZm9yIHRoaXMgb3BlcmFuZC4KKyAgLy8vCisgIE1hY2hpbmVPcGVyYW5kVHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gKE1hY2hpbmVPcGVyYW5kVHlwZSlPcEtpbmQ7IH0KKworICB1bnNpZ25lZCBnZXRUYXJnZXRGbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNSZWcoKSA/IDAgOiBTdWJSZWdfVGFyZ2V0RmxhZ3M7CisgIH0KKyAgdm9pZCBzZXRUYXJnZXRGbGFncyh1bnNpZ25lZCBGKSB7CisgICAgYXNzZXJ0KCFpc1JlZygpICYmICJSZWdpc3RlciBvcGVyYW5kcyBjYW4ndCBoYXZlIHRhcmdldCBmbGFncyIpOworICAgIFN1YlJlZ19UYXJnZXRGbGFncyA9IEY7CisgICAgYXNzZXJ0KFN1YlJlZ19UYXJnZXRGbGFncyA9PSBGICYmICJUYXJnZXQgZmxhZ3Mgb3V0IG9mIHJhbmdlIik7CisgIH0KKyAgdm9pZCBhZGRUYXJnZXRGbGFnKHVuc2lnbmVkIEYpIHsKKyAgICBhc3NlcnQoIWlzUmVnKCkgJiYgIlJlZ2lzdGVyIG9wZXJhbmRzIGNhbid0IGhhdmUgdGFyZ2V0IGZsYWdzIik7CisgICAgU3ViUmVnX1RhcmdldEZsYWdzIHw9IEY7CisgICAgYXNzZXJ0KChTdWJSZWdfVGFyZ2V0RmxhZ3MgJiBGKSAmJiAiVGFyZ2V0IGZsYWdzIG91dCBvZiByYW5nZSIpOworICB9CisKKworICAvLy8gZ2V0UGFyZW50IC0gUmV0dXJuIHRoZSBpbnN0cnVjdGlvbiB0aGF0IHRoaXMgb3BlcmFuZCBiZWxvbmdzIHRvLgorICAvLy8KKyAgTWFjaGluZUluc3RyICpnZXRQYXJlbnQoKSB7IHJldHVybiBQYXJlbnRNSTsgfQorICBjb25zdCBNYWNoaW5lSW5zdHIgKmdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIFBhcmVudE1JOyB9CisKKyAgLy8vIGNsZWFyUGFyZW50IC0gUmVzZXQgdGhlIHBhcmVudCBwb2ludGVyLgorICAvLy8KKyAgLy8vIFRoZSBNYWNoaW5lT3BlcmFuZCBjb3B5IGNvbnN0cnVjdG9yIGFsc28gY29waWVzIFBhcmVudE1JLCBleHBlY3RpbmcgdGhlCisgIC8vLyBvcmlnaW5hbCB0byBiZSBkZWxldGVkLiBJZiBhIE1hY2hpbmVPcGVyYW5kIGlzIGV2ZXIgc3RvcmVkIG91dHNpZGUgYQorICAvLy8gTWFjaGluZUluc3RyLCB0aGUgcGFyZW50IHBvaW50ZXIgbXVzdCBiZSBjbGVhcmVkLgorICAvLy8KKyAgLy8vIE5ldmVyIGNhbGwgY2xlYXJQYXJlbnQoKSBvbiBhbiBvcGVyYW5kIGluIGEgTWFjaGluZUluc3RyLgorICAvLy8KKyAgdm9pZCBjbGVhclBhcmVudCgpIHsgUGFyZW50TUkgPSBudWxscHRyOyB9CisKKyAgLy8vIFByaW50IGEgc3VicmVnIGluZGV4IG9wZXJhbmQuCisgIC8vLyBNT19JbW1lZGlhdGUgb3BlcmFuZHMgY2FuIGFsc28gYmUgc3VicmVnIGlkaWNlcy4gSWYgaXQncyB0aGUgY2FzZSwgdGhlCisgIC8vLyBzdWJyZWcgaW5kZXggbmFtZSB3aWxsIGJlIHByaW50ZWQuIE1hY2hpbmVJbnN0cjo6aXNPcGVyYW5kU3VicmVnSWR4IGNhbiBiZQorICAvLy8gY2FsbGVkIHRvIGNoZWNrIHRoaXMuCisgIHN0YXRpYyB2b2lkIHByaW50U3ViUmVnSWR4KHJhd19vc3RyZWFtICZPUywgdWludDY0X3QgSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKTsKKworICAvLy8gUHJpbnQgb3BlcmFuZCB0YXJnZXQgZmxhZ3MuCisgIHN0YXRpYyB2b2lkIHByaW50VGFyZ2V0RmxhZ3MocmF3X29zdHJlYW0mIE9TLCBjb25zdCBNYWNoaW5lT3BlcmFuZCAmT3ApOworCisgIC8vLyBQcmludCBhIE1DU3ltYm9sIGFzIGFuIG9wZXJhbmQuCisgIHN0YXRpYyB2b2lkIHByaW50U3ltYm9sKHJhd19vc3RyZWFtICZPUywgTUNTeW1ib2wgJlN5bSk7CisKKyAgLy8vIFByaW50IGEgc3RhY2sgb2JqZWN0IHJlZmVyZW5jZS4KKyAgc3RhdGljIHZvaWQgcHJpbnRTdGFja09iamVjdFJlZmVyZW5jZShyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0ZpeGVkLCBTdHJpbmdSZWYgTmFtZSk7CisKKyAgLy8vIFByaW50IHRoZSBvZmZzZXQgd2l0aCBleHBsaWNpdCArLy0gc2lnbnMuCisgIHN0YXRpYyB2b2lkIHByaW50T3BlcmFuZE9mZnNldChyYXdfb3N0cmVhbSAmT1MsIGludDY0X3QgT2Zmc2V0KTsKKworICAvLy8gUHJpbnQgYW4gSVJTbG90TnVtYmVyLgorICBzdGF0aWMgdm9pZCBwcmludElSU2xvdE51bWJlcihyYXdfb3N0cmVhbSAmT1MsIGludCBTbG90KTsKKworICAvLy8gUHJpbnQgdGhlIE1hY2hpbmVPcGVyYW5kIHRvIFxwIG9zLgorICAvLy8gUHJvdmlkaW5nIGEgdmFsaWQgXHAgVFJJIGFuZCBccCBJbnRyaW5zaWNJbmZvIHJlc3VsdHMgaW4gYSBtb3JlCisgIC8vLyB0YXJnZXQtc3BlY2lmaWMgcHJpbnRpbmcuIElmIFxwIFRSSSBhbmQgXHAgSW50cmluc2ljSW5mbyBhcmUgbnVsbCwgdGhlCisgIC8vLyBmdW5jdGlvbiB3aWxsIHRyeSB0byBwaWNrIGl0IHVwIGZyb20gdGhlIHBhcmVudC4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmb3MsIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnRyaW5zaWNJbmZvICpJbnRyaW5zaWNJbmZvID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIE1vcmUgY29tcGxleCB3YXkgb2YgcHJpbnRpbmcgYSBNYWNoaW5lT3BlcmFuZC4KKyAgLy8vIFxwYXJhbSBUeXBlVG9QcmludCBzcGVjaWZpZXMgdGhlIGdlbmVyaWMgdHlwZSB0byBiZSBwcmludGVkIG9uIHVzZXMgYW5kCisgIC8vLyBkZWZzLiBJdCBjYW4gYmUgZGV0ZXJtaW5lZCB1c2luZyBNYWNoaW5lSW5zdHI6OmdldFR5cGVUb1ByaW50LgorICAvLy8gXHBhcmFtIFByaW50RGVmIC0gd2hldGhlciB3ZSB3YW50IHRvIHByaW50IGBkZWZgIG9uIGFuIG9wZXJhbmQgd2hpY2gKKyAgLy8vIGlzRGVmLiBTb21ldGltZXMsIGlmIHRoZSBvcGVyYW5kIGlzIHByaW50ZWQgYmVmb3JlICc9Jywgd2UgZG9uJ3QgcHJpbnQKKyAgLy8vIGBkZWZgLgorICAvLy8gXHBhcmFtIElzU3RhbmRhbG9uZSAtIHdoZXRoZXIgd2Ugd2FudCBhIHZlcmJvc2Ugb3V0cHV0IG9mIHRoZSBNTy4gVGhpcworICAvLy8gcHJpbnRzIGV4dHJhIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGVhc2lseSBpbmZlcnJlZCB3aGVuIHByaW50aW5nIHRoZQorICAvLy8gd2hvbGUgZnVuY3Rpb24sIGJ1dCBub3Qgd2hlbiBwcmludGluZyBvbmx5IGEgZnJhZ21lbnQgb2YgaXQuCisgIC8vLyBccGFyYW0gU2hvdWxkUHJpbnRSZWdpc3RlclRpZXMgLSB3aGV0aGVyIHdlIHdhbnQgdG8gcHJpbnQgcmVnaXN0ZXIgdGllcy4KKyAgLy8vIFNvbWV0aW1lcyB0aGV5IGFyZSBlYXNpbHkgZGV0ZXJtaW5lZCBieSB0aGUgaW5zdHJ1Y3Rpb24ncyBkZXNjcmlwdG9yCisgIC8vLyAoTWFjaGluZUluc3RyOjpoYXNDb21wbGV4UmVnaXRlclRpZXMgY2FuIGRldGVybWluZSBpZiBpdCdzIG5lZWRlZCkuCisgIC8vLyBccGFyYW0gVGllZE9wZXJhbmRJZHggLSBpZiB3ZSBuZWVkIHRvIHByaW50IHJlZ2lzdGVyIHRpZXMgdGhpcyBuZWVkcyB0bworICAvLy8gcHJvdmlkZSB0aGUgaW5kZXggb2YgdGhlIHRpZWQgcmVnaXN0ZXIuIElmIG5vdCwgaXQgd2lsbCBiZSBpZ25vcmVkLgorICAvLy8gXHBhcmFtIFRSSSAtIHByb3ZpZGUgbW9yZSB0YXJnZXQtc3BlY2lmaWMgaW5mb3JtYXRpb24gdG8gdGhlIHByaW50ZXIuCisgIC8vLyBVbmxpa2UgdGhlIHByZXZpb3VzIGZ1bmN0aW9uLCB0aGlzIG9uZSB3aWxsIG5vdCB0cnkgYW5kIGdldCB0aGUKKyAgLy8vIGluZm9ybWF0aW9uIGZyb20gaXQncyBwYXJlbnQuCisgIC8vLyBccGFyYW0gSW50cmluc2ljSW5mbyAtIHNhbWUgYXMgXHAgVFJJLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZvcywgTW9kdWxlU2xvdFRyYWNrZXIgJk1TVCwgTExUIFR5cGVUb1ByaW50LAorICAgICAgICAgICAgIGJvb2wgUHJpbnREZWYsIGJvb2wgSXNTdGFuZGFsb25lLCBib29sIFNob3VsZFByaW50UmVnaXN0ZXJUaWVzLAorICAgICAgICAgICAgIHVuc2lnbmVkIFRpZWRPcGVyYW5kSWR4LCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSwKKyAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnRyaW5zaWNJbmZvICpJbnRyaW5zaWNJbmZvKSBjb25zdDsKKworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQWNjZXNzb3JzIHRoYXQgdGVsbCB5b3Ugd2hhdCBraW5kIG9mIE1hY2hpbmVPcGVyYW5kIHlvdSdyZSBsb29raW5nIGF0LgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gaXNSZWcgLSBUZXN0cyBpZiB0aGlzIGlzIGEgTU9fUmVnaXN0ZXIgb3BlcmFuZC4KKyAgYm9vbCBpc1JlZygpIGNvbnN0IHsgcmV0dXJuIE9wS2luZCA9PSBNT19SZWdpc3RlcjsgfQorICAvLy8gaXNJbW0gLSBUZXN0cyBpZiB0aGlzIGlzIGEgTU9fSW1tZWRpYXRlIG9wZXJhbmQuCisgIGJvb2wgaXNJbW0oKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fSW1tZWRpYXRlOyB9CisgIC8vLyBpc0NJbW0gLSBUZXN0IGlmIHRoaXMgaXMgYSBNT19DSW1tZWRpYXRlIG9wZXJhbmQuCisgIGJvb2wgaXNDSW1tKCkgY29uc3QgeyByZXR1cm4gT3BLaW5kID09IE1PX0NJbW1lZGlhdGU7IH0KKyAgLy8vIGlzRlBJbW0gLSBUZXN0cyBpZiB0aGlzIGlzIGEgTU9fRlBJbW1lZGlhdGUgb3BlcmFuZC4KKyAgYm9vbCBpc0ZQSW1tKCkgY29uc3QgeyByZXR1cm4gT3BLaW5kID09IE1PX0ZQSW1tZWRpYXRlOyB9CisgIC8vLyBpc01CQiAtIFRlc3RzIGlmIHRoaXMgaXMgYSBNT19NYWNoaW5lQmFzaWNCbG9jayBvcGVyYW5kLgorICBib29sIGlzTUJCKCkgY29uc3QgeyByZXR1cm4gT3BLaW5kID09IE1PX01hY2hpbmVCYXNpY0Jsb2NrOyB9CisgIC8vLyBpc0ZJIC0gVGVzdHMgaWYgdGhpcyBpcyBhIE1PX0ZyYW1lSW5kZXggb3BlcmFuZC4KKyAgYm9vbCBpc0ZJKCkgY29uc3QgeyByZXR1cm4gT3BLaW5kID09IE1PX0ZyYW1lSW5kZXg7IH0KKyAgLy8vIGlzQ1BJIC0gVGVzdHMgaWYgdGhpcyBpcyBhIE1PX0NvbnN0YW50UG9vbEluZGV4IG9wZXJhbmQuCisgIGJvb2wgaXNDUEkoKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fQ29uc3RhbnRQb29sSW5kZXg7IH0KKyAgLy8vIGlzVGFyZ2V0SW5kZXggLSBUZXN0cyBpZiB0aGlzIGlzIGEgTU9fVGFyZ2V0SW5kZXggb3BlcmFuZC4KKyAgYm9vbCBpc1RhcmdldEluZGV4KCkgY29uc3QgeyByZXR1cm4gT3BLaW5kID09IE1PX1RhcmdldEluZGV4OyB9CisgIC8vLyBpc0pUSSAtIFRlc3RzIGlmIHRoaXMgaXMgYSBNT19KdW1wVGFibGVJbmRleCBvcGVyYW5kLgorICBib29sIGlzSlRJKCkgY29uc3QgeyByZXR1cm4gT3BLaW5kID09IE1PX0p1bXBUYWJsZUluZGV4OyB9CisgIC8vLyBpc0dsb2JhbCAtIFRlc3RzIGlmIHRoaXMgaXMgYSBNT19HbG9iYWxBZGRyZXNzIG9wZXJhbmQuCisgIGJvb2wgaXNHbG9iYWwoKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fR2xvYmFsQWRkcmVzczsgfQorICAvLy8gaXNTeW1ib2wgLSBUZXN0cyBpZiB0aGlzIGlzIGEgTU9fRXh0ZXJuYWxTeW1ib2wgb3BlcmFuZC4KKyAgYm9vbCBpc1N5bWJvbCgpIGNvbnN0IHsgcmV0dXJuIE9wS2luZCA9PSBNT19FeHRlcm5hbFN5bWJvbDsgfQorICAvLy8gaXNCbG9ja0FkZHJlc3MgLSBUZXN0cyBpZiB0aGlzIGlzIGEgTU9fQmxvY2tBZGRyZXNzIG9wZXJhbmQuCisgIGJvb2wgaXNCbG9ja0FkZHJlc3MoKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fQmxvY2tBZGRyZXNzOyB9CisgIC8vLyBpc1JlZ01hc2sgLSBUZXN0cyBpZiB0aGlzIGlzIGEgTU9fUmVnaXN0ZXJNYXNrIG9wZXJhbmQuCisgIGJvb2wgaXNSZWdNYXNrKCkgY29uc3QgeyByZXR1cm4gT3BLaW5kID09IE1PX1JlZ2lzdGVyTWFzazsgfQorICAvLy8gaXNSZWdMaXZlT3V0IC0gVGVzdHMgaWYgdGhpcyBpcyBhIE1PX1JlZ2lzdGVyTGl2ZU91dCBvcGVyYW5kLgorICBib29sIGlzUmVnTGl2ZU91dCgpIGNvbnN0IHsgcmV0dXJuIE9wS2luZCA9PSBNT19SZWdpc3RlckxpdmVPdXQ7IH0KKyAgLy8vIGlzTWV0YWRhdGEgLSBUZXN0cyBpZiB0aGlzIGlzIGEgTU9fTWV0YWRhdGEgb3BlcmFuZC4KKyAgYm9vbCBpc01ldGFkYXRhKCkgY29uc3QgeyByZXR1cm4gT3BLaW5kID09IE1PX01ldGFkYXRhOyB9CisgIGJvb2wgaXNNQ1N5bWJvbCgpIGNvbnN0IHsgcmV0dXJuIE9wS2luZCA9PSBNT19NQ1N5bWJvbDsgfQorICBib29sIGlzQ0ZJSW5kZXgoKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fQ0ZJSW5kZXg7IH0KKyAgYm9vbCBpc0ludHJpbnNpY0lEKCkgY29uc3QgeyByZXR1cm4gT3BLaW5kID09IE1PX0ludHJpbnNpY0lEOyB9CisgIGJvb2wgaXNQcmVkaWNhdGUoKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fUHJlZGljYXRlOyB9CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBY2Nlc3NvcnMgZm9yIFJlZ2lzdGVyIE9wZXJhbmRzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBnZXRSZWcgLSBSZXR1cm5zIHRoZSByZWdpc3RlciBudW1iZXIuCisgIHVuc2lnbmVkIGdldFJlZygpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiVGhpcyBpcyBub3QgYSByZWdpc3RlciBvcGVyYW5kISIpOworICAgIHJldHVybiBTbWFsbENvbnRlbnRzLlJlZ05vOworICB9CisKKyAgdW5zaWduZWQgZ2V0U3ViUmVnKCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBTdWJSZWdfVGFyZ2V0RmxhZ3M7CisgIH0KKworICBib29sIGlzVXNlKCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiAhSXNEZWY7CisgIH0KKworICBib29sIGlzRGVmKCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBJc0RlZjsKKyAgfQorCisgIGJvb2wgaXNJbXBsaWNpdCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gSXNJbXA7CisgIH0KKworICBib29sIGlzRGVhZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gSXNEZWFkT3JLaWxsICYgSXNEZWY7CisgIH0KKworICBib29sIGlzS2lsbCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gSXNEZWFkT3JLaWxsICYgIUlzRGVmOworICB9CisKKyAgYm9vbCBpc1VuZGVmKCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBJc1VuZGVmOworICB9CisKKyAgLy8vIGlzUmVuYW1hYmxlIC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgcmVnaXN0ZXIgbWF5IGJlIHJlbmFtZWQsIGkuZS4gaXQgZG9lcworICAvLy8gbm90IGdlbmVyYXRlIGEgdmFsdWUgdGhhdCBpcyBzb21laG93IHJlYWQgaW4gYSB3YXkgdGhhdCBpcyBub3QgcmVwcmVzZW50ZWQKKyAgLy8vIGJ5IHRoZSBNYWNoaW5lIElSIChlLmcuIHRvIG1lZXQgYW4gQUJJIG9yIElTQSByZXF1aXJlbWVudCkuICBUaGlzIGlzIG9ubHkKKyAgLy8vIHZhbGlkIG9uIHBoeXNpY2FsIHJlZ2lzdGVyIG9wZXJhbmRzLiAgVmlydHVhbCByZWdpc3RlcnMgYXJlIGFzc3VtZWQgdG8KKyAgLy8vIGFsd2F5cyBiZSByZW5hbWFibGUgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC4KKyAgLy8vCisgIC8vLyBPcGVyYW5kcyB0aGF0IGFyZSByZW5hbWFibGUgY2FuIGZyZWVseSBiZSBjaGFuZ2VkIHRvIGFueSBvdGhlciByZWdpc3RlcgorICAvLy8gdGhhdCBpcyBhIG1lbWJlciBvZiB0aGUgcmVnaXN0ZXIgY2xhc3MgcmV0dXJuZWQgYnkKKyAgLy8vIE1JLT5nZXRSZWdDbGFzc0NvbnN0cmFpbnQoKS4KKyAgLy8vCisgIC8vLyBpc1JlbmFtYWJsZSBjYW4gcmV0dXJuIGZhbHNlIGZvciBzZXZlcmFsIGRpZmZlcmVudCByZWFzb25zOgorICAvLy8KKyAgLy8vIC0gQUJJIGNvbnN0cmFpbnRzIChzaW5jZSBsaXZlbmVzcyBpcyBub3QgYWx3YXlzIHByZWNpc2VseSBtb2RlbGVkKS4gIFdlCisgIC8vLyAgIGNvbnNlcnZhdGl2ZWx5IGhhbmRsZSB0aGVzZSBjYXNlcyBieSBzZXR0aW5nIGFsbCBwaHlzaWNhbCByZWdpc3RlcgorICAvLy8gICBvcGVyYW5kcyB0aGF0IGRpZG7igJl0IHN0YXJ0IG91dCBhcyB2aXJ0dWFsIHJlZ3MgdG8gbm90IGJlIHJlbmFtYWJsZS4KKyAgLy8vICAgQWxzbyBhbnkgcGh5c2ljYWwgcmVnaXN0ZXIgb3BlcmFuZHMgY3JlYXRlZCBhZnRlciByZWdpc3RlciBhbGxvY2F0aW9uIG9yCisgIC8vLyAgIHdob3NlIHJlZ2lzdGVyIGlzIGNoYW5nZWQgYWZ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbiB3aWxsIG5vdCBiZQorICAvLy8gICByZW5hbWFibGUuICBUaGlzIHN0YXRlIGlzIHRyYWNrZWQgaW4gdGhlIE1hY2hpbmVPcGVyYW5kOjpJc1JlbmFtYWJsZQorICAvLy8gICBiaXQuCisgIC8vLworICAvLy8gLSBPcGNvZGUvdGFyZ2V0IGNvbnN0cmFpbnRzOiBmb3Igb3Bjb2RlcyB0aGF0IGhhdmUgY29tcGxleCByZWdpc3RlciBjbGFzcworICAvLy8gICByZXF1aXJlbWVudHMgKGUuZy4gdGhhdCBkZXBlbmQgb24gb3RoZXIgb3BlcmFuZHMvaW5zdHJ1Y3Rpb25zKSwgd2Ugc2V0CisgIC8vLyAgIGhhc0V4dHJhU3JjUmVnQWxsb2NSZXEvaGFzRXh0cmFEc3RSZWdBbGxvY1JlcSBpbiB0aGUgbWFjaGluZSBvcGNvZGUKKyAgLy8vICAgZGVzY3JpcHRpb24uICBPcGVyYW5kcyBiZWxvbmdpbmcgdG8gaW5zdHJ1Y3Rpb25zIHdpdGggb3Bjb2RlcyB0aGF0IGFyZQorICAvLy8gICBtYXJrZWQgaGFzRXh0cmFTcmNSZWdBbGxvY1JlcS9oYXNFeHRyYURzdFJlZ0FsbG9jUmVxIHJldHVybiBmYWxzZSBmcm9tCisgIC8vLyAgIGlzUmVuYW1hYmxlKCkuICBBZGRpdGlvbmFsbHksIHRoZSBBbGxvd1JlZ2lzdGVyUmVuYW1pbmcgdGFyZ2V0IHByb3BlcnR5CisgIC8vLyAgIHByZXZlbnRzIGFueSBvcGVyYW5kcyBmcm9tIGJlaW5nIG1hcmtlZCByZW5hbWFibGUgZm9yIHRhcmdldHMgdGhhdCBkb24ndAorICAvLy8gICBoYXZlIGRldGFpbGVkIG9wY29kZSBoYXNFeHRyYVNyY1JlZ0FsbG9jUmVxL2hhc0V4dHJhRHN0UmVnQWxsb2NSZXEKKyAgLy8vICAgdmFsdWVzLgorICBib29sIGlzUmVuYW1hYmxlKCkgY29uc3Q7CisKKyAgYm9vbCBpc0ludGVybmFsUmVhZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gSXNJbnRlcm5hbFJlYWQ7CisgIH0KKworICBib29sIGlzRWFybHlDbG9iYmVyKCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBJc0Vhcmx5Q2xvYmJlcjsKKyAgfQorCisgIGJvb2wgaXNUaWVkKCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBUaWVkVG87CisgIH0KKworICBib29sIGlzRGVidWcoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzUmVnKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIElzRGVidWc7CisgIH0KKworICAvLy8gcmVhZHNSZWcgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBvcGVyYW5kIHJlYWRzIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiBpdHMKKyAgLy8vIHJlZ2lzdGVyLiAgQSB1c2Ugb3BlcmFuZCB3aXRoIHRoZSA8dW5kZWY+IGZsYWcgc2V0IGRvZXNuJ3QgcmVhZCBpdHMKKyAgLy8vIHJlZ2lzdGVyLiAgQSBzdWItcmVnaXN0ZXIgZGVmIGltcGxpY2l0bHkgcmVhZHMgdGhlIG90aGVyIHBhcnRzIG9mIHRoZQorICAvLy8gcmVnaXN0ZXIgYmVpbmcgcmVkZWZpbmVkIHVubGVzcyB0aGUgPHVuZGVmPiBmbGFnIGlzIHNldC4KKyAgLy8vCisgIC8vLyBUaGlzIHJlZmVycyB0byByZWFkaW5nIHRoZSByZWdpc3RlciB2YWx1ZSBmcm9tIGJlZm9yZSB0aGUgY3VycmVudAorICAvLy8gaW5zdHJ1Y3Rpb24gb3IgYnVuZGxlLiBJbnRlcm5hbCBidW5kbGUgcmVhZHMgYXJlIG5vdCBpbmNsdWRlZC4KKyAgYm9vbCByZWFkc1JlZygpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gIWlzVW5kZWYoKSAmJiAhaXNJbnRlcm5hbFJlYWQoKSAmJiAoaXNVc2UoKSB8fCBnZXRTdWJSZWcoKSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTXV0YXRvcnMgZm9yIFJlZ2lzdGVyIE9wZXJhbmRzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBDaGFuZ2UgdGhlIHJlZ2lzdGVyIHRoaXMgb3BlcmFuZCBjb3JyZXNwb25kcyB0by4KKyAgLy8vCisgIHZvaWQgc2V0UmVnKHVuc2lnbmVkIFJlZyk7CisKKyAgdm9pZCBzZXRTdWJSZWcodW5zaWduZWQgc3ViUmVnKSB7CisgICAgYXNzZXJ0KGlzUmVnKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIG11dGF0b3IiKTsKKyAgICBTdWJSZWdfVGFyZ2V0RmxhZ3MgPSBzdWJSZWc7CisgICAgYXNzZXJ0KFN1YlJlZ19UYXJnZXRGbGFncyA9PSBzdWJSZWcgJiYgIlN1YlJlZyBvdXQgb2YgcmFuZ2UiKTsKKyAgfQorCisgIC8vLyBzdWJzdFZpcnRSZWcgLSBTdWJzdGl0dXRlIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHdpdGggdGhlIHZpcnR1YWwKKyAgLy8vIHN1YnJlZ2lzdGVyIFJlZzpTdWJSZWcuIFRha2UgYW55IGV4aXN0aW5nIFN1YlJlZyBpbmRleCBpbnRvIGFjY291bnQsCisgIC8vLyB1c2luZyBUYXJnZXRSZWdpc3RlckluZm8gdG8gY29tcG9zZSB0aGUgc3VicmVnIGluZGljZXMgaWYgbmVjZXNzYXJ5LgorICAvLy8gUmVnIG11c3QgYmUgYSB2aXJ0dWFsIHJlZ2lzdGVyLCBTdWJJZHggY2FuIGJlIDAuCisgIC8vLworICB2b2lkIHN1YnN0VmlydFJlZyh1bnNpZ25lZCBSZWcsIHVuc2lnbmVkIFN1YklkeCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvJik7CisKKyAgLy8vIHN1YnN0UGh5c1JlZyAtIFN1YnN0aXR1dGUgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgd2l0aCB0aGUgcGh5c2ljYWwgcmVnaXN0ZXIKKyAgLy8vIFJlZywgdGFraW5nIGFueSBleGlzdGluZyBTdWJSZWcgaW50byBhY2NvdW50LiBGb3IgaW5zdGFuY2UsCisgIC8vLyBzdWJzdFBoeXNSZWcoJWVheCkgd2lsbCBjaGFuZ2UgJXJlZzEwMjQ6c3ViXzhiaXQgdG8gJWFsLgorICAvLy8KKyAgdm9pZCBzdWJzdFBoeXNSZWcodW5zaWduZWQgUmVnLCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8mKTsKKworICB2b2lkIHNldElzVXNlKGJvb2wgVmFsID0gdHJ1ZSkgeyBzZXRJc0RlZighVmFsKTsgfQorCisgIC8vLyBDaGFuZ2UgYSBkZWYgdG8gYSB1c2UsIG9yIGEgdXNlIHRvIGEgZGVmLgorICB2b2lkIHNldElzRGVmKGJvb2wgVmFsID0gdHJ1ZSk7CisKKyAgdm9pZCBzZXRJbXBsaWNpdChib29sIFZhbCA9IHRydWUpIHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgbXV0YXRvciIpOworICAgIElzSW1wID0gVmFsOworICB9CisKKyAgdm9pZCBzZXRJc0tpbGwoYm9vbCBWYWwgPSB0cnVlKSB7CisgICAgYXNzZXJ0KGlzUmVnKCkgJiYgIUlzRGVmICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBtdXRhdG9yIik7CisgICAgYXNzZXJ0KCghVmFsIHx8ICFpc0RlYnVnKCkpICYmICJNYXJraW5nIGEgZGVidWcgb3BlcmF0aW9uIGFzIGtpbGwiKTsKKyAgICBJc0RlYWRPcktpbGwgPSBWYWw7CisgIH0KKworICB2b2lkIHNldElzRGVhZChib29sIFZhbCA9IHRydWUpIHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiBJc0RlZiAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgbXV0YXRvciIpOworICAgIElzRGVhZE9yS2lsbCA9IFZhbDsKKyAgfQorCisgIHZvaWQgc2V0SXNVbmRlZihib29sIFZhbCA9IHRydWUpIHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgbXV0YXRvciIpOworICAgIElzVW5kZWYgPSBWYWw7CisgIH0KKworICB2b2lkIHNldElzUmVuYW1hYmxlKGJvb2wgVmFsID0gdHJ1ZSk7CisKKyAgdm9pZCBzZXRJc0ludGVybmFsUmVhZChib29sIFZhbCA9IHRydWUpIHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgbXV0YXRvciIpOworICAgIElzSW50ZXJuYWxSZWFkID0gVmFsOworICB9CisKKyAgdm9pZCBzZXRJc0Vhcmx5Q2xvYmJlcihib29sIFZhbCA9IHRydWUpIHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiBJc0RlZiAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgbXV0YXRvciIpOworICAgIElzRWFybHlDbG9iYmVyID0gVmFsOworICB9CisKKyAgdm9pZCBzZXRJc0RlYnVnKGJvb2wgVmFsID0gdHJ1ZSkgeworICAgIGFzc2VydChpc1JlZygpICYmICFJc0RlZiAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgbXV0YXRvciIpOworICAgIElzRGVidWcgPSBWYWw7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQWNjZXNzb3JzIGZvciB2YXJpb3VzIG9wZXJhbmQgdHlwZXMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIGludDY0X3QgZ2V0SW1tKCkgY29uc3QgeworICAgIGFzc2VydChpc0ltbSgpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBDb250ZW50cy5JbW1WYWw7CisgIH0KKworICBjb25zdCBDb25zdGFudEludCAqZ2V0Q0ltbSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNDSW1tKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIENvbnRlbnRzLkNJOworICB9CisKKyAgY29uc3QgQ29uc3RhbnRGUCAqZ2V0RlBJbW0oKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzRlBJbW0oKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gQ29udGVudHMuQ0ZQOworICB9CisKKyAgTWFjaGluZUJhc2ljQmxvY2sgKmdldE1CQigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNNQkIoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gQ29udGVudHMuTUJCOworICB9CisKKyAgaW50IGdldEluZGV4KCkgY29uc3QgeworICAgIGFzc2VydCgoaXNGSSgpIHx8IGlzQ1BJKCkgfHwgaXNUYXJnZXRJbmRleCgpIHx8IGlzSlRJKCkpICYmCisgICAgICAgICAgICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBDb250ZW50cy5PZmZzZXRlZEluZm8uVmFsLkluZGV4OworICB9CisKKyAgY29uc3QgR2xvYmFsVmFsdWUgKmdldEdsb2JhbCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNHbG9iYWwoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gQ29udGVudHMuT2Zmc2V0ZWRJbmZvLlZhbC5HVjsKKyAgfQorCisgIGNvbnN0IEJsb2NrQWRkcmVzcyAqZ2V0QmxvY2tBZGRyZXNzKCkgY29uc3QgeworICAgIGFzc2VydChpc0Jsb2NrQWRkcmVzcygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBDb250ZW50cy5PZmZzZXRlZEluZm8uVmFsLkJBOworICB9CisKKyAgTUNTeW1ib2wgKmdldE1DU3ltYm9sKCkgY29uc3QgeworICAgIGFzc2VydChpc01DU3ltYm9sKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIENvbnRlbnRzLlN5bTsKKyAgfQorCisgIHVuc2lnbmVkIGdldENGSUluZGV4KCkgY29uc3QgeworICAgIGFzc2VydChpc0NGSUluZGV4KCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIENvbnRlbnRzLkNGSUluZGV4OworICB9CisKKyAgSW50cmluc2ljOjpJRCBnZXRJbnRyaW5zaWNJRCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNJbnRyaW5zaWNJRCgpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBDb250ZW50cy5JbnRyaW5zaWNJRDsKKyAgfQorCisgIHVuc2lnbmVkIGdldFByZWRpY2F0ZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNQcmVkaWNhdGUoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gQ29udGVudHMuUHJlZDsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIG9mZnNldCBmcm9tIHRoZSBzeW1ib2wgaW4gdGhpcyBvcGVyYW5kLiBUaGlzIGFsd2F5cyByZXR1cm5zIDAKKyAgLy8vIGZvciBFeHRlcm5hbFN5bWJvbCBvcGVyYW5kcy4KKyAgaW50NjRfdCBnZXRPZmZzZXQoKSBjb25zdCB7CisgICAgYXNzZXJ0KChpc0dsb2JhbCgpIHx8IGlzU3ltYm9sKCkgfHwgaXNNQ1N5bWJvbCgpIHx8IGlzQ1BJKCkgfHwKKyAgICAgICAgICAgIGlzVGFyZ2V0SW5kZXgoKSB8fCBpc0Jsb2NrQWRkcmVzcygpKSAmJgorICAgICAgICAgICAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gaW50NjRfdCh1aW50NjRfdChDb250ZW50cy5PZmZzZXRlZEluZm8uT2Zmc2V0SGkpIDw8IDMyKSB8CisgICAgICAgICAgIFNtYWxsQ29udGVudHMuT2Zmc2V0TG87CisgIH0KKworICBjb25zdCBjaGFyICpnZXRTeW1ib2xOYW1lKCkgY29uc3QgeworICAgIGFzc2VydChpc1N5bWJvbCgpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBDb250ZW50cy5PZmZzZXRlZEluZm8uVmFsLlN5bWJvbE5hbWU7CisgIH0KKworICAvLy8gY2xvYmJlcnNQaHlzUmVnIC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgUmVnTWFzayBjbG9iYmVycyBQaHlzUmVnLgorICAvLy8gSXQgaXMgc29tZXRpbWVzIG5lY2Vzc2FyeSB0byBkZXRhY2ggdGhlIHJlZ2lzdGVyIG1hc2sgcG9pbnRlciBmcm9tIGl0cworICAvLy8gbWFjaGluZSBvcGVyYW5kLiBUaGlzIHN0YXRpYyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIHN1Y2ggZGV0YWNoZWQgYml0CisgIC8vLyBtYXNrIHBvaW50ZXJzLgorICBzdGF0aWMgYm9vbCBjbG9iYmVyc1BoeXNSZWcoY29uc3QgdWludDMyX3QgKlJlZ01hc2ssIHVuc2lnbmVkIFBoeXNSZWcpIHsKKyAgICAvLyBTZWUgVGFyZ2V0UmVnaXN0ZXJJbmZvLmguCisgICAgYXNzZXJ0KFBoeXNSZWcgPCAoMXUgPDwgMzApICYmICJOb3QgYSBwaHlzaWNhbCByZWdpc3RlciIpOworICAgIHJldHVybiAhKFJlZ01hc2tbUGh5c1JlZyAvIDMyXSAmICgxdSA8PCBQaHlzUmVnICUgMzIpKTsKKyAgfQorCisgIC8vLyBjbG9iYmVyc1BoeXNSZWcgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBSZWdNYXNrIG9wZXJhbmQgY2xvYmJlcnMgUGh5c1JlZy4KKyAgYm9vbCBjbG9iYmVyc1BoeXNSZWcodW5zaWduZWQgUGh5c1JlZykgY29uc3QgeworICAgICByZXR1cm4gY2xvYmJlcnNQaHlzUmVnKGdldFJlZ01hc2soKSwgUGh5c1JlZyk7CisgIH0KKworICAvLy8gZ2V0UmVnTWFzayAtIFJldHVybnMgYSBiaXQgbWFzayBvZiByZWdpc3RlcnMgcHJlc2VydmVkIGJ5IHRoaXMgUmVnTWFzaworICAvLy8gb3BlcmFuZC4KKyAgY29uc3QgdWludDMyX3QgKmdldFJlZ01hc2soKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzUmVnTWFzaygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBDb250ZW50cy5SZWdNYXNrOworICB9CisKKyAgLy8vIGdldFJlZ0xpdmVPdXQgLSBSZXR1cm5zIGEgYml0IG1hc2sgb2YgbGl2ZS1vdXQgcmVnaXN0ZXJzLgorICBjb25zdCB1aW50MzJfdCAqZ2V0UmVnTGl2ZU91dCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNSZWdMaXZlT3V0KCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIENvbnRlbnRzLlJlZ01hc2s7CisgIH0KKworICBjb25zdCBNRE5vZGUgKmdldE1ldGFkYXRhKCkgY29uc3QgeworICAgIGFzc2VydChpc01ldGFkYXRhKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIENvbnRlbnRzLk1EOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE11dGF0b3JzIGZvciB2YXJpb3VzIG9wZXJhbmQgdHlwZXMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIHZvaWQgc2V0SW1tKGludDY0X3QgaW1tVmFsKSB7CisgICAgYXNzZXJ0KGlzSW1tKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIG11dGF0b3IiKTsKKyAgICBDb250ZW50cy5JbW1WYWwgPSBpbW1WYWw7CisgIH0KKworICB2b2lkIHNldEZQSW1tKGNvbnN0IENvbnN0YW50RlAgKkNGUCkgeworICAgIGFzc2VydChpc0ZQSW1tKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIG11dGF0b3IiKTsKKyAgICBDb250ZW50cy5DRlAgPSBDRlA7CisgIH0KKworICB2b2lkIHNldE9mZnNldChpbnQ2NF90IE9mZnNldCkgeworICAgIGFzc2VydCgoaXNHbG9iYWwoKSB8fCBpc1N5bWJvbCgpIHx8IGlzTUNTeW1ib2woKSB8fCBpc0NQSSgpIHx8CisgICAgICAgICAgICBpc1RhcmdldEluZGV4KCkgfHwgaXNCbG9ja0FkZHJlc3MoKSkgJiYKKyAgICAgICAgICAgIldyb25nIE1hY2hpbmVPcGVyYW5kIG11dGF0b3IiKTsKKyAgICBTbWFsbENvbnRlbnRzLk9mZnNldExvID0gdW5zaWduZWQoT2Zmc2V0KTsKKyAgICBDb250ZW50cy5PZmZzZXRlZEluZm8uT2Zmc2V0SGkgPSBpbnQoT2Zmc2V0ID4+IDMyKTsKKyAgfQorCisgIHZvaWQgc2V0SW5kZXgoaW50IElkeCkgeworICAgIGFzc2VydCgoaXNGSSgpIHx8IGlzQ1BJKCkgfHwgaXNUYXJnZXRJbmRleCgpIHx8IGlzSlRJKCkpICYmCisgICAgICAgICAgICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBtdXRhdG9yIik7CisgICAgQ29udGVudHMuT2Zmc2V0ZWRJbmZvLlZhbC5JbmRleCA9IElkeDsKKyAgfQorCisgIHZvaWQgc2V0TWV0YWRhdGEoY29uc3QgTUROb2RlICpNRCkgeworICAgIGFzc2VydChpc01ldGFkYXRhKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIG11dGF0b3IiKTsKKyAgICBDb250ZW50cy5NRCA9IE1EOworICB9CisKKyAgdm9pZCBzZXRNQkIoTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeworICAgIGFzc2VydChpc01CQigpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBtdXRhdG9yIik7CisgICAgQ29udGVudHMuTUJCID0gTUJCOworICB9CisKKyAgLy8vIFNldHMgdmFsdWUgb2YgcmVnaXN0ZXIgbWFzayBvcGVyYW5kIHJlZmVyZW5jaW5nIE1hc2suICBUaGUKKyAgLy8vIG9wZXJhbmQgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIG1lbW9yeSByZWZlcmVuY2VkIGJ5IE1hc2ssIGl0IG11c3QKKyAgLy8vIHJlbWFpbiB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBvcGVyYW5kLiBTZWUgQ3JlYXRlUmVnTWFzaygpLgorICAvLy8gQW55IHBoeXNyZWcgd2l0aCBhIDAgYml0IGluIHRoZSBtYXNrIGlzIGNsb2JiZXJlZCBieSB0aGUgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgc2V0UmVnTWFzayhjb25zdCB1aW50MzJfdCAqUmVnTWFza1B0cikgeworICAgIGFzc2VydChpc1JlZ01hc2soKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgbXV0YXRvciIpOworICAgIENvbnRlbnRzLlJlZ01hc2sgPSBSZWdNYXNrUHRyOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE90aGVyIG1ldGhvZHMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBvcGVyYW5kIGlzIGlkZW50aWNhbCB0byB0aGUgc3BlY2lmaWVkIG9wZXJhbmQgZXhjZXB0CisgIC8vLyBmb3IgbGl2ZW5lc3MgcmVsYXRlZCBmbGFncyAoaXNLaWxsLCBpc1VuZGVmIGFuZCBpc0RlYWQpLiBOb3RlIHRoYXQgdGhpcworICAvLy8gc2hvdWxkIHN0YXkgaW4gc3luYyB3aXRoIHRoZSBoYXNoX3ZhbHVlIG92ZXJsb2FkIGJlbG93LgorICBib29sIGlzSWRlbnRpY2FsVG8oY29uc3QgTWFjaGluZU9wZXJhbmQgJk90aGVyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIE1hY2hpbmVPcGVyYW5kIGhhc2hfdmFsdWUgb3ZlcmxvYWQuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgaW5jbHVkZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gaW4gdGhlIGhhc2ggdGhhdAorICAvLy8gaXNJZGVudGljYWxUbyB1c2VzIGZvciBjb21wYXJpc29uLiBJdCBpcyB0aHVzIHN1aXRlZCBmb3IgdXNlIGluIGhhc2gKKyAgLy8vIHRhYmxlcyB3aGljaCB1c2UgdGhhdCBmdW5jdGlvbiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMgb25seS4gVGhpcyBtdXN0CisgIC8vLyBzdGF5IGV4YWN0bHkgaW4gc3luYyB3aXRoIGlzSWRlbnRpY2FsVG8gYWJvdmUuCisgIGZyaWVuZCBoYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8pOworCisgIC8vLyBDaGFuZ2VUb0ltbWVkaWF0ZSAtIFJlcGxhY2UgdGhpcyBvcGVyYW5kIHdpdGggYSBuZXcgaW1tZWRpYXRlIG9wZXJhbmQgb2YKKyAgLy8vIHRoZSBzcGVjaWZpZWQgdmFsdWUuICBJZiBhbiBvcGVyYW5kIGlzIGtub3duIHRvIGJlIGFuIGltbWVkaWF0ZSBhbHJlYWR5LAorICAvLy8gdGhlIHNldEltbSBtZXRob2Qgc2hvdWxkIGJlIHVzZWQuCisgIHZvaWQgQ2hhbmdlVG9JbW1lZGlhdGUoaW50NjRfdCBJbW1WYWwpOworCisgIC8vLyBDaGFuZ2VUb0ZQSW1tZWRpYXRlIC0gUmVwbGFjZSB0aGlzIG9wZXJhbmQgd2l0aCBhIG5ldyBGUCBpbW1lZGlhdGUgb3BlcmFuZAorICAvLy8gb2YgdGhlIHNwZWNpZmllZCB2YWx1ZS4gIElmIGFuIG9wZXJhbmQgaXMga25vd24gdG8gYmUgYW4gRlAgaW1tZWRpYXRlCisgIC8vLyBhbHJlYWR5LCB0aGUgc2V0RlBJbW0gbWV0aG9kIHNob3VsZCBiZSB1c2VkLgorICB2b2lkIENoYW5nZVRvRlBJbW1lZGlhdGUoY29uc3QgQ29uc3RhbnRGUCAqRlBJbW0pOworCisgIC8vLyBDaGFuZ2VUb0VTIC0gUmVwbGFjZSB0aGlzIG9wZXJhbmQgd2l0aCBhIG5ldyBleHRlcm5hbCBzeW1ib2wgb3BlcmFuZC4KKyAgdm9pZCBDaGFuZ2VUb0VTKGNvbnN0IGNoYXIgKlN5bU5hbWUsIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKTsKKworICAvLy8gQ2hhbmdlVG9NQ1N5bWJvbCAtIFJlcGxhY2UgdGhpcyBvcGVyYW5kIHdpdGggYSBuZXcgTUMgc3ltYm9sIG9wZXJhbmQuCisgIHZvaWQgQ2hhbmdlVG9NQ1N5bWJvbChNQ1N5bWJvbCAqU3ltKTsKKworICAvLy8gUmVwbGFjZSB0aGlzIG9wZXJhbmQgd2l0aCBhIGZyYW1lIGluZGV4LgorICB2b2lkIENoYW5nZVRvRnJhbWVJbmRleChpbnQgSWR4KTsKKworICAvLy8gUmVwbGFjZSB0aGlzIG9wZXJhbmQgd2l0aCBhIHRhcmdldCBpbmRleC4KKyAgdm9pZCBDaGFuZ2VUb1RhcmdldEluZGV4KHVuc2lnbmVkIElkeCwgaW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCk7CisKKyAgLy8vIENoYW5nZVRvUmVnaXN0ZXIgLSBSZXBsYWNlIHRoaXMgb3BlcmFuZCB3aXRoIGEgbmV3IHJlZ2lzdGVyIG9wZXJhbmQgb2YKKyAgLy8vIHRoZSBzcGVjaWZpZWQgdmFsdWUuICBJZiBhbiBvcGVyYW5kIGlzIGtub3duIHRvIGJlIGFuIHJlZ2lzdGVyIGFscmVhZHksCisgIC8vLyB0aGUgc2V0UmVnIG1ldGhvZCBzaG91bGQgYmUgdXNlZC4KKyAgdm9pZCBDaGFuZ2VUb1JlZ2lzdGVyKHVuc2lnbmVkIFJlZywgYm9vbCBpc0RlZiwgYm9vbCBpc0ltcCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0tpbGwgPSBmYWxzZSwgYm9vbCBpc0RlYWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNVbmRlZiA9IGZhbHNlLCBib29sIGlzRGVidWcgPSBmYWxzZSk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIENvbnN0cnVjdGlvbiBtZXRob2RzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBzdGF0aWMgTWFjaGluZU9wZXJhbmQgQ3JlYXRlSW1tKGludDY0X3QgVmFsKSB7CisgICAgTWFjaGluZU9wZXJhbmQgT3AoTWFjaGluZU9wZXJhbmQ6Ok1PX0ltbWVkaWF0ZSk7CisgICAgT3Auc2V0SW1tKFZhbCk7CisgICAgcmV0dXJuIE9wOworICB9CisKKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIENyZWF0ZUNJbW0oY29uc3QgQ29uc3RhbnRJbnQgKkNJKSB7CisgICAgTWFjaGluZU9wZXJhbmQgT3AoTWFjaGluZU9wZXJhbmQ6Ok1PX0NJbW1lZGlhdGUpOworICAgIE9wLkNvbnRlbnRzLkNJID0gQ0k7CisgICAgcmV0dXJuIE9wOworICB9CisKKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIENyZWF0ZUZQSW1tKGNvbnN0IENvbnN0YW50RlAgKkNGUCkgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19GUEltbWVkaWF0ZSk7CisgICAgT3AuQ29udGVudHMuQ0ZQID0gQ0ZQOworICAgIHJldHVybiBPcDsKKyAgfQorCisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVSZWcodW5zaWduZWQgUmVnLCBib29sIGlzRGVmLCBib29sIGlzSW1wID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0tpbGwgPSBmYWxzZSwgYm9vbCBpc0RlYWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVW5kZWYgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRWFybHlDbG9iYmVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3ViUmVnID0gMCwgYm9vbCBpc0RlYnVnID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0ludGVybmFsUmVhZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNSZW5hbWFibGUgPSBmYWxzZSkgeworICAgIGFzc2VydCghKGlzRGVhZCAmJiAhaXNEZWYpICYmICJEZWFkIGZsYWcgb24gbm9uLWRlZiIpOworICAgIGFzc2VydCghKGlzS2lsbCAmJiBpc0RlZikgJiYgIktpbGwgZmxhZyBvbiBkZWYiKTsKKyAgICBNYWNoaW5lT3BlcmFuZCBPcChNYWNoaW5lT3BlcmFuZDo6TU9fUmVnaXN0ZXIpOworICAgIE9wLklzRGVmID0gaXNEZWY7CisgICAgT3AuSXNJbXAgPSBpc0ltcDsKKyAgICBPcC5Jc0RlYWRPcktpbGwgPSBpc0tpbGwgfCBpc0RlYWQ7CisgICAgT3AuSXNSZW5hbWFibGUgPSBpc1JlbmFtYWJsZTsKKyAgICBPcC5Jc1VuZGVmID0gaXNVbmRlZjsKKyAgICBPcC5Jc0ludGVybmFsUmVhZCA9IGlzSW50ZXJuYWxSZWFkOworICAgIE9wLklzRWFybHlDbG9iYmVyID0gaXNFYXJseUNsb2JiZXI7CisgICAgT3AuVGllZFRvID0gMDsKKyAgICBPcC5Jc0RlYnVnID0gaXNEZWJ1ZzsKKyAgICBPcC5TbWFsbENvbnRlbnRzLlJlZ05vID0gUmVnOworICAgIE9wLkNvbnRlbnRzLlJlZy5QcmV2ID0gbnVsbHB0cjsKKyAgICBPcC5Db250ZW50cy5SZWcuTmV4dCA9IG51bGxwdHI7CisgICAgT3Auc2V0U3ViUmVnKFN1YlJlZyk7CisgICAgcmV0dXJuIE9wOworICB9CisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVNQkIoTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19NYWNoaW5lQmFzaWNCbG9jayk7CisgICAgT3Auc2V0TUJCKE1CQik7CisgICAgT3Auc2V0VGFyZ2V0RmxhZ3MoVGFyZ2V0RmxhZ3MpOworICAgIHJldHVybiBPcDsKKyAgfQorICBzdGF0aWMgTWFjaGluZU9wZXJhbmQgQ3JlYXRlRkkoaW50IElkeCkgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19GcmFtZUluZGV4KTsKKyAgICBPcC5zZXRJbmRleChJZHgpOworICAgIHJldHVybiBPcDsKKyAgfQorICBzdGF0aWMgTWFjaGluZU9wZXJhbmQgQ3JlYXRlQ1BJKHVuc2lnbmVkIElkeCwgaW50IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19Db25zdGFudFBvb2xJbmRleCk7CisgICAgT3Auc2V0SW5kZXgoSWR4KTsKKyAgICBPcC5zZXRPZmZzZXQoT2Zmc2V0KTsKKyAgICBPcC5zZXRUYXJnZXRGbGFncyhUYXJnZXRGbGFncyk7CisgICAgcmV0dXJuIE9wOworICB9CisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVUYXJnZXRJbmRleCh1bnNpZ25lZCBJZHgsIGludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApIHsKKyAgICBNYWNoaW5lT3BlcmFuZCBPcChNYWNoaW5lT3BlcmFuZDo6TU9fVGFyZ2V0SW5kZXgpOworICAgIE9wLnNldEluZGV4KElkeCk7CisgICAgT3Auc2V0T2Zmc2V0KE9mZnNldCk7CisgICAgT3Auc2V0VGFyZ2V0RmxhZ3MoVGFyZ2V0RmxhZ3MpOworICAgIHJldHVybiBPcDsKKyAgfQorICBzdGF0aWMgTWFjaGluZU9wZXJhbmQgQ3JlYXRlSlRJKHVuc2lnbmVkIElkeCwgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApIHsKKyAgICBNYWNoaW5lT3BlcmFuZCBPcChNYWNoaW5lT3BlcmFuZDo6TU9fSnVtcFRhYmxlSW5kZXgpOworICAgIE9wLnNldEluZGV4KElkeCk7CisgICAgT3Auc2V0VGFyZ2V0RmxhZ3MoVGFyZ2V0RmxhZ3MpOworICAgIHJldHVybiBPcDsKKyAgfQorICBzdGF0aWMgTWFjaGluZU9wZXJhbmQgQ3JlYXRlR0EoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCBpbnQ2NF90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKSB7CisgICAgTWFjaGluZU9wZXJhbmQgT3AoTWFjaGluZU9wZXJhbmQ6Ok1PX0dsb2JhbEFkZHJlc3MpOworICAgIE9wLkNvbnRlbnRzLk9mZnNldGVkSW5mby5WYWwuR1YgPSBHVjsKKyAgICBPcC5zZXRPZmZzZXQoT2Zmc2V0KTsKKyAgICBPcC5zZXRUYXJnZXRGbGFncyhUYXJnZXRGbGFncyk7CisgICAgcmV0dXJuIE9wOworICB9CisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVFUyhjb25zdCBjaGFyICpTeW1OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApIHsKKyAgICBNYWNoaW5lT3BlcmFuZCBPcChNYWNoaW5lT3BlcmFuZDo6TU9fRXh0ZXJuYWxTeW1ib2wpOworICAgIE9wLkNvbnRlbnRzLk9mZnNldGVkSW5mby5WYWwuU3ltYm9sTmFtZSA9IFN5bU5hbWU7CisgICAgT3Auc2V0T2Zmc2V0KDApOyAvLyBPZmZzZXQgaXMgYWx3YXlzIDAuCisgICAgT3Auc2V0VGFyZ2V0RmxhZ3MoVGFyZ2V0RmxhZ3MpOworICAgIHJldHVybiBPcDsKKyAgfQorICBzdGF0aWMgTWFjaGluZU9wZXJhbmQgQ3JlYXRlQkEoY29uc3QgQmxvY2tBZGRyZXNzICpCQSwgaW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19CbG9ja0FkZHJlc3MpOworICAgIE9wLkNvbnRlbnRzLk9mZnNldGVkSW5mby5WYWwuQkEgPSBCQTsKKyAgICBPcC5zZXRPZmZzZXQoT2Zmc2V0KTsKKyAgICBPcC5zZXRUYXJnZXRGbGFncyhUYXJnZXRGbGFncyk7CisgICAgcmV0dXJuIE9wOworICB9CisgIC8vLyBDcmVhdGVSZWdNYXNrIC0gQ3JlYXRlcyBhIHJlZ2lzdGVyIG1hc2sgb3BlcmFuZCByZWZlcmVuY2luZyBNYXNrLiAgVGhlCisgIC8vLyBvcGVyYW5kIGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZSBtZW1vcnkgcmVmZXJlbmNlZCBieSBNYXNrLCBpdAorICAvLy8gbXVzdCByZW1haW4gdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgb3BlcmFuZC4KKyAgLy8vCisgIC8vLyBBIFJlZ01hc2sgb3BlcmFuZCByZXByZXNlbnRzIGEgc2V0IG9mIG5vbi1jbG9iYmVyZWQgcGh5c2ljYWwgcmVnaXN0ZXJzCisgIC8vLyBvbiBhbiBpbnN0cnVjdGlvbiB0aGF0IGNsb2JiZXJzIG1hbnkgcmVnaXN0ZXJzLCB0eXBpY2FsbHkgYSBjYWxsLiAgVGhlCisgIC8vLyBiaXQgbWFzayBoYXMgYSBiaXQgc2V0IGZvciBlYWNoIHBoeXNyZWcgdGhhdCBpcyBwcmVzZXJ2ZWQgYnkgdGhpcworICAvLy8gaW5zdHJ1Y3Rpb24sIGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKKyAgLy8vIFRhcmdldFJlZ2lzdGVySW5mbzo6Z2V0Q2FsbFByZXNlcnZlZE1hc2soKS4KKyAgLy8vCisgIC8vLyBBbnkgcGh5c3JlZyB3aXRoIGEgMCBiaXQgaW4gdGhlIG1hc2sgaXMgY2xvYmJlcmVkIGJ5IHRoZSBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVSZWdNYXNrKGNvbnN0IHVpbnQzMl90ICpNYXNrKSB7CisgICAgYXNzZXJ0KE1hc2sgJiYgIk1pc3NpbmcgcmVnaXN0ZXIgbWFzayIpOworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19SZWdpc3Rlck1hc2spOworICAgIE9wLkNvbnRlbnRzLlJlZ01hc2sgPSBNYXNrOworICAgIHJldHVybiBPcDsKKyAgfQorICBzdGF0aWMgTWFjaGluZU9wZXJhbmQgQ3JlYXRlUmVnTGl2ZU91dChjb25zdCB1aW50MzJfdCAqTWFzaykgeworICAgIGFzc2VydChNYXNrICYmICJNaXNzaW5nIGxpdmUtb3V0IHJlZ2lzdGVyIG1hc2siKTsKKyAgICBNYWNoaW5lT3BlcmFuZCBPcChNYWNoaW5lT3BlcmFuZDo6TU9fUmVnaXN0ZXJMaXZlT3V0KTsKKyAgICBPcC5Db250ZW50cy5SZWdNYXNrID0gTWFzazsKKyAgICByZXR1cm4gT3A7CisgIH0KKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIENyZWF0ZU1ldGFkYXRhKGNvbnN0IE1ETm9kZSAqTWV0YSkgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19NZXRhZGF0YSk7CisgICAgT3AuQ29udGVudHMuTUQgPSBNZXRhOworICAgIHJldHVybiBPcDsKKyAgfQorCisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVNQ1N5bWJvbChNQ1N5bWJvbCAqU3ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApIHsKKyAgICBNYWNoaW5lT3BlcmFuZCBPcChNYWNoaW5lT3BlcmFuZDo6TU9fTUNTeW1ib2wpOworICAgIE9wLkNvbnRlbnRzLlN5bSA9IFN5bTsKKyAgICBPcC5zZXRPZmZzZXQoMCk7CisgICAgT3Auc2V0VGFyZ2V0RmxhZ3MoVGFyZ2V0RmxhZ3MpOworICAgIHJldHVybiBPcDsKKyAgfQorCisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVDRklJbmRleCh1bnNpZ25lZCBDRklJbmRleCkgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19DRklJbmRleCk7CisgICAgT3AuQ29udGVudHMuQ0ZJSW5kZXggPSBDRklJbmRleDsKKyAgICByZXR1cm4gT3A7CisgIH0KKworICBzdGF0aWMgTWFjaGluZU9wZXJhbmQgQ3JlYXRlSW50cmluc2ljSUQoSW50cmluc2ljOjpJRCBJRCkgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19JbnRyaW5zaWNJRCk7CisgICAgT3AuQ29udGVudHMuSW50cmluc2ljSUQgPSBJRDsKKyAgICByZXR1cm4gT3A7CisgIH0KKworICBzdGF0aWMgTWFjaGluZU9wZXJhbmQgQ3JlYXRlUHJlZGljYXRlKHVuc2lnbmVkIFByZWQpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCBPcChNYWNoaW5lT3BlcmFuZDo6TU9fUHJlZGljYXRlKTsKKyAgICBPcC5Db250ZW50cy5QcmVkID0gUHJlZDsKKyAgICByZXR1cm4gT3A7CisgIH0KKworICBmcmllbmQgY2xhc3MgTWFjaGluZUluc3RyOworICBmcmllbmQgY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKKworcHJpdmF0ZToKKyAgLy8gSWYgdGhpcyBvcGVyYW5kIGlzIGN1cnJlbnRseSBhIHJlZ2lzdGVyIG9wZXJhbmQsIGFuZCBpZiB0aGlzIGlzIGluIGEKKyAgLy8gZnVuY3Rpb24sIGRlcmVnaXN0ZXIgdGhlIG9wZXJhbmQgZnJvbSB0aGUgcmVnaXN0ZXIncyB1c2UvZGVmIGxpc3QuCisgIHZvaWQgcmVtb3ZlUmVnRnJvbVVzZXMoKTsKKworICAvLy8gQXJ0aWZpY2lhbCBraW5kcyBmb3IgRGVuc2VNYXAgdXNhZ2UuCisgIGVudW0gOiB1bnNpZ25lZCBjaGFyIHsKKyAgICBNT19FbXB0eSA9IE1PX0xhc3QgKyAxLAorICAgIE1PX1RvbWJzdG9uZSwKKyAgfTsKKworICBmcmllbmQgc3RydWN0IERlbnNlTWFwSW5mbzxNYWNoaW5lT3BlcmFuZD47CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE1ldGhvZHMgZm9yIGhhbmRsaW5nIHJlZ2lzdGVyIHVzZS9kZWYgbGlzdHMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBpc09uUmVnVXNlTGlzdCAtIFJldHVybiB0cnVlIGlmIHRoaXMgb3BlcmFuZCBpcyBvbiBhIHJlZ2lzdGVyIHVzZS9kZWYKKyAgLy8vIGxpc3Qgb3IgZmFsc2UgaWYgbm90LiAgVGhpcyBjYW4gb25seSBiZSBjYWxsZWQgZm9yIHJlZ2lzdGVyIG9wZXJhbmRzCisgIC8vLyB0aGF0IGFyZSBwYXJ0IG9mIGEgbWFjaGluZSBpbnN0cnVjdGlvbi4KKyAgYm9vbCBpc09uUmVnVXNlTGlzdCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiQ2FuIG9ubHkgYWRkIHJlZyBvcGVyYW5kIHRvIHVzZSBsaXN0cyIpOworICAgIHJldHVybiBDb250ZW50cy5SZWcuUHJldiAhPSBudWxscHRyOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPE1hY2hpbmVPcGVyYW5kPiB7CisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gTWFjaGluZU9wZXJhbmQoc3RhdGljX2Nhc3Q8TWFjaGluZU9wZXJhbmQ6Ok1hY2hpbmVPcGVyYW5kVHlwZT4oCisgICAgICAgIE1hY2hpbmVPcGVyYW5kOjpNT19FbXB0eSkpOworICB9CisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgcmV0dXJuIE1hY2hpbmVPcGVyYW5kKHN0YXRpY19jYXN0PE1hY2hpbmVPcGVyYW5kOjpNYWNoaW5lT3BlcmFuZFR5cGU+KAorICAgICAgICBNYWNoaW5lT3BlcmFuZDo6TU9fVG9tYnN0b25lKSk7CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8pIHsKKyAgICByZXR1cm4gaGFzaF92YWx1ZShNTyk7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBNYWNoaW5lT3BlcmFuZCAmTEhTLCBjb25zdCBNYWNoaW5lT3BlcmFuZCAmUkhTKSB7CisgICAgaWYgKExIUy5nZXRUeXBlKCkgPT0gc3RhdGljX2Nhc3Q8TWFjaGluZU9wZXJhbmQ6Ok1hY2hpbmVPcGVyYW5kVHlwZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVPcGVyYW5kOjpNT19FbXB0eSkgfHwKKyAgICAgICAgTEhTLmdldFR5cGUoKSA9PSBzdGF0aWNfY2FzdDxNYWNoaW5lT3BlcmFuZDo6TWFjaGluZU9wZXJhbmRUeXBlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU9wZXJhbmQ6Ok1PX1RvbWJzdG9uZSkpCisgICAgICByZXR1cm4gTEhTLmdldFR5cGUoKSA9PSBSSFMuZ2V0VHlwZSgpOworICAgIHJldHVybiBMSFMuaXNJZGVudGljYWxUbyhSSFMpOworICB9Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8pIHsKKyAgTU8ucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKKy8vIFNlZSBmcmllbmQgZGVjbGFyYXRpb24gYWJvdmUuIFRoaXMgYWRkaXRpb25hbCBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBpbgorLy8gb3JkZXIgdG8gY29tcGlsZSBMTFZNIHdpdGggSUJNIHhsQyBjb21waWxlci4KK2hhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyk7Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZU9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmRlZmJlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyLmgKQEAgLTAsMCArMSwyMjQgQEAKKy8vLz09PS0gTWFjaGluZU9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIuaCAtIE9wdCBEaWFnbm9zdGljcyAtKi0gQysrIC0qLS0tLT09PS8vCisvLy8KKy8vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLy8KKy8vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLy8KKy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBPcHRpbWl6YXRpb24gZGlhZ25vc3RpYyBpbnRlcmZhY2VzIGZvciBtYWNoaW5lIHBhc3Nlcy4gIEl0J3MgcGFja2FnZWQgYXMgYW4KKy8vLyBhbmFseXNpcyBwYXNzIHNvIHRoYXQgYnkgdXNpbmcgdGhpcyBzZXJ2aWNlIHBhc3NlcyBiZWNvbWUgZGVwZW5kZW50IG9uIE1CRkkKKy8vLyBhcyB3ZWxsLiAgTUJGSSBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlICJob3RuZXNzIiBvZiB0aGUgZGlhZ25vc3RpYyBtZXNzYWdlLgorLy8vCisvLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FT1BUSU1JWkFUSU9OUkVNQVJLRU1JVFRFUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FT1BUSU1JWkFUSU9OUkVNQVJLRU1JVFRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL09wdGltaXphdGlvblJlbWFya0VtaXR0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm87CitjbGFzcyBNYWNoaW5lSW5zdHI7CisKKy8vLyBcYnJpZWYgQ29tbW9uIGZlYXR1cmVzIGZvciBkaWFnbm9zdGljcyBkZWFsaW5nIHdpdGggb3B0aW1pemF0aW9uIHJlbWFya3MKKy8vLyB0aGF0IGFyZSB1c2VkIGJ5IG1hY2hpbmUgcGFzc2VzLgorY2xhc3MgRGlhZ25vc3RpY0luZm9NSVJPcHRpbWl6YXRpb24gOiBwdWJsaWMgRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlIHsKK3B1YmxpYzoKKyAgRGlhZ25vc3RpY0luZm9NSVJPcHRpbWl6YXRpb24oZW51bSBEaWFnbm9zdGljS2luZCBLaW5kLCBjb25zdCBjaGFyICpQYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlbWFya05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNMb2NhdGlvbiAmTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKQorICAgICAgOiBEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2UoS2luZCwgRFNfUmVtYXJrLCBQYXNzTmFtZSwgUmVtYXJrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CQi0+Z2V0UGFyZW50KCktPmdldEZ1bmN0aW9uKCksIExvYyksCisgICAgICAgIE1CQihNQkIpIHt9CisKKyAgLy8vIE1JLXNwZWNpZmljIGtpbmRzIG9mIGRpYWdub3N0aWMgQXJndW1lbnRzLgorICBzdHJ1Y3QgTWFjaGluZUFyZ3VtZW50IDogcHVibGljIERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZTo6QXJndW1lbnQgeworICAgIC8vLyBQcmludCBhbiBlbnRpcmUgTWFjaGluZUluc3RyLgorICAgIE1hY2hpbmVBcmd1bWVudChTdHJpbmdSZWYgS2V5LCBjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKyAgfTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERpYWdub3N0aWNJbmZvICpESSkgeworICAgIHJldHVybiBESS0+Z2V0S2luZCgpID49IERLX0ZpcnN0TWFjaGluZVJlbWFyayAmJgorICAgICAgICAgICBESS0+Z2V0S2luZCgpIDw9IERLX0xhc3RNYWNoaW5lUmVtYXJrOworICB9CisKKyAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKmdldEJsb2NrKCkgY29uc3QgeyByZXR1cm4gTUJCOyB9CisKK3ByaXZhdGU6CisgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkI7Cit9OworCisvLy8gRGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmb3IgYXBwbGllZCBvcHRpbWl6YXRpb24gcmVtYXJrcy4KK2NsYXNzIE1hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmsgOiBwdWJsaWMgRGlhZ25vc3RpY0luZm9NSVJPcHRpbWl6YXRpb24geworcHVibGljOgorICAvLy8gXHAgUGFzc05hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhc3MgZW1pdHRpbmcgdGhpcyBkaWFnbm9zdGljLiBJZiB0aGlzIG5hbWUKKyAgLy8vIG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiAtUnBhc3M9LCB0aGVuIHRoZSBkaWFnbm9zdGljIHdpbGwKKyAgLy8vIGJlIGVtaXR0ZWQuICBccCBSZW1hcmtOYW1lIGlzIGEgdGV4dHVhbCBpZGVudGlmaWVyIGZvciB0aGUgcmVtYXJrLiAgXHAKKyAgLy8vIExvYyBpcyB0aGUgZGVidWcgbG9jYXRpb24gYW5kIFxwIE1CQiBpcyB0aGUgYmxvY2sgdGhhdCB0aGUgb3B0aW1pemF0aW9uCisgIC8vLyBvcGVyYXRlcyBpbi4KKyAgTWFjaGluZU9wdGltaXphdGlvblJlbWFyayhjb25zdCBjaGFyICpQYXNzTmFtZSwgU3RyaW5nUmVmIFJlbWFya05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY0xvY2F0aW9uICZMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikKKyAgICAgIDogRGlhZ25vc3RpY0luZm9NSVJPcHRpbWl6YXRpb24oREtfTWFjaGluZU9wdGltaXphdGlvblJlbWFyaywgUGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbWFya05hbWUsIExvYywgTUJCKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGlhZ25vc3RpY0luZm8gKkRJKSB7CisgICAgcmV0dXJuIERJLT5nZXRLaW5kKCkgPT0gREtfTWFjaGluZU9wdGltaXphdGlvblJlbWFyazsKKyAgfQorCisgIC8vLyBcc2VlIERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZTo6aXNFbmFibGVkLgorICBib29sIGlzRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBjb25zdCBGdW5jdGlvbiAmRm4gPSBnZXRGdW5jdGlvbigpOworICAgIExMVk1Db250ZXh0ICZDdHggPSBGbi5nZXRDb250ZXh0KCk7CisgICAgcmV0dXJuIEN0eC5nZXREaWFnSGFuZGxlclB0cigpLT5pc1Bhc3NlZE9wdFJlbWFya0VuYWJsZWQoZ2V0UGFzc05hbWUoKSk7CisgIH0KK307CisKKy8vLyBEaWFnbm9zdGljIGluZm9ybWF0aW9uIGZvciBtaXNzZWQtb3B0aW1pemF0aW9uIHJlbWFya3MuCitjbGFzcyBNYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrTWlzc2VkIDogcHVibGljIERpYWdub3N0aWNJbmZvTUlST3B0aW1pemF0aW9uIHsKK3B1YmxpYzoKKyAgLy8vIFxwIFBhc3NOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXNzIGVtaXR0aW5nIHRoaXMgZGlhZ25vc3RpYy4gSWYgdGhpcyBuYW1lCisgIC8vLyBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gaW4gLVJwYXNzLW1pc3NlZD0sIHRoZW4gdGhlCisgIC8vLyBkaWFnbm9zdGljIHdpbGwgYmUgZW1pdHRlZC4gIFxwIFJlbWFya05hbWUgaXMgYSB0ZXh0dWFsIGlkZW50aWZpZXIgZm9yIHRoZQorICAvLy8gcmVtYXJrLiAgXHAgTG9jIGlzIHRoZSBkZWJ1ZyBsb2NhdGlvbiBhbmQgXHAgTUJCIGlzIHRoZSBibG9jayB0aGF0IHRoZQorICAvLy8gb3B0aW1pemF0aW9uIG9wZXJhdGVzIGluLgorICBNYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrTWlzc2VkKGNvbnN0IGNoYXIgKlBhc3NOYW1lLCBTdHJpbmdSZWYgUmVtYXJrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljTG9jYXRpb24gJkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKQorICAgICAgOiBEaWFnbm9zdGljSW5mb01JUk9wdGltaXphdGlvbihES19NYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrTWlzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzTmFtZSwgUmVtYXJrTmFtZSwgTG9jLCBNQkIpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEaWFnbm9zdGljSW5mbyAqREkpIHsKKyAgICByZXR1cm4gREktPmdldEtpbmQoKSA9PSBES19NYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrTWlzc2VkOworICB9CisKKyAgLy8vIFxzZWUgRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlOjppc0VuYWJsZWQuCisgIGJvb2wgaXNFbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGNvbnN0IEZ1bmN0aW9uICZGbiA9IGdldEZ1bmN0aW9uKCk7CisgICAgTExWTUNvbnRleHQgJkN0eCA9IEZuLmdldENvbnRleHQoKTsKKyAgICByZXR1cm4gQ3R4LmdldERpYWdIYW5kbGVyUHRyKCktPmlzTWlzc2VkT3B0UmVtYXJrRW5hYmxlZChnZXRQYXNzTmFtZSgpKTsKKyAgfQorfTsKKworLy8vIERpYWdub3N0aWMgaW5mb3JtYXRpb24gZm9yIG9wdGltaXphdGlvbiBhbmFseXNpcyByZW1hcmtzLgorY2xhc3MgTWFjaGluZU9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzIDogcHVibGljIERpYWdub3N0aWNJbmZvTUlST3B0aW1pemF0aW9uIHsKK3B1YmxpYzoKKyAgLy8vIFxwIFBhc3NOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXNzIGVtaXR0aW5nIHRoaXMgZGlhZ25vc3RpYy4gSWYgdGhpcyBuYW1lCisgIC8vLyBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gaW4gLVJwYXNzLWFuYWx5c2lzPSwgdGhlbiB0aGUKKyAgLy8vIGRpYWdub3N0aWMgd2lsbCBiZSBlbWl0dGVkLiAgXHAgUmVtYXJrTmFtZSBpcyBhIHRleHR1YWwgaWRlbnRpZmllciBmb3IgdGhlCisgIC8vLyByZW1hcmsuICBccCBMb2MgaXMgdGhlIGRlYnVnIGxvY2F0aW9uIGFuZCBccCBNQkIgaXMgdGhlIGJsb2NrIHRoYXQgdGhlCisgIC8vLyBvcHRpbWl6YXRpb24gb3BlcmF0ZXMgaW4uCisgIE1hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcyhjb25zdCBjaGFyICpQYXNzTmFtZSwgU3RyaW5nUmVmIFJlbWFya05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljTG9jYXRpb24gJkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpCisgICAgICA6IERpYWdub3N0aWNJbmZvTUlST3B0aW1pemF0aW9uKERLX01hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc05hbWUsIFJlbWFya05hbWUsIExvYywgTUJCKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGlhZ25vc3RpY0luZm8gKkRJKSB7CisgICAgcmV0dXJuIERJLT5nZXRLaW5kKCkgPT0gREtfTWFjaGluZU9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzOworICB9CisKKyAgLy8vIFxzZWUgRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlOjppc0VuYWJsZWQuCisgIGJvb2wgaXNFbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGNvbnN0IEZ1bmN0aW9uICZGbiA9IGdldEZ1bmN0aW9uKCk7CisgICAgTExWTUNvbnRleHQgJkN0eCA9IEZuLmdldENvbnRleHQoKTsKKyAgICByZXR1cm4gQ3R4LmdldERpYWdIYW5kbGVyUHRyKCktPmlzQW5hbHlzaXNSZW1hcmtFbmFibGVkKGdldFBhc3NOYW1lKCkpOworICB9Cit9OworCisvLy8gRXh0ZW5kIGxsdm06Om9yZTo6IHdpdGggTUktc3BlY2lmaWMgaGVscGVyIG5hbWVzLgorbmFtZXNwYWNlIG9yZSB7Cit1c2luZyBNTlYgPSBEaWFnbm9zdGljSW5mb01JUk9wdGltaXphdGlvbjo6TWFjaGluZUFyZ3VtZW50OworfQorCisvLy8gVGhlIG9wdGltaXphdGlvbiBkaWFnbm9zdGljIGludGVyZmFjZS4KKy8vLworLy8vIEl0IGFsbG93cyByZXBvcnRpbmcgd2hlbiBvcHRpbWl6YXRpb25zIGFyZSBwZXJmb3JtZWQgYW5kIHdoZW4gdGhleSBhcmUgbm90CisvLy8gYWxvbmcgd2l0aCB0aGUgcmVhc29ucyBmb3IgaXQuICBIb3RuZXNzIGluZm9ybWF0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nCisvLy8gY29kZSByZWdpb24gY2FuIGJlIGluY2x1ZGVkIGluIHRoZSByZW1hcmsgaWYgRGlhZ25vc3RpY3NIb3RuZXNzUmVxdWVzdGVkIGlzCisvLy8gZW5hYmxlZCBpbiB0aGUgTExWTSBjb250ZXh0LgorY2xhc3MgTWFjaGluZU9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgeworcHVibGljOgorICBNYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlcihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvICpNQkZJKQorICAgICAgOiBNRihNRiksIE1CRkkoTUJGSSkge30KKworICAvLy8gRW1pdCBhbiBvcHRpbWl6YXRpb24gcmVtYXJrLgorICB2b2lkIGVtaXQoRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlICZPcHREaWFnKTsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgd2UgYWxsb3cgZm9yIGV4dHJhIGNvbXBpbGUtdGltZSBidWRnZXQgdG8gcGVyZm9ybSBtb3JlCisgIC8vLyBhbmFseXNpcyB0byBiZSBtb3JlIGluZm9ybWF0aXZlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZnVsIHRvIGVuYWJsZSBhZGRpdGlvbmFsIG1pc3NlZCBvcHRpbWl6YXRpb25zIHRvIGJlIHJlcG9ydGVkCisgIC8vLyB0aGF0IGFyZSBub3JtYWxseSB0b28gbm9pc3kuICBJbiB0aGlzIG1vZGUsIHdlIGNhbiB1c2UgdGhlIGV4dHJhIGFuYWx5c2lzCisgIC8vLyAoMSkgdG8gZmlsdGVyIHRyaXZpYWwgZmFsc2UgcG9zaXRpdmVzIG9yICgyKSB0byBwcm92aWRlIG1vcmUgY29udGV4dCBzbworICAvLy8gdGhhdCBub24tdHJpdmlhbCBmYWxzZSBwb3NpdGl2ZXMgY2FuIGJlIHF1aWNrbHkgZGV0ZWN0ZWQgYnkgdGhlIHVzZXIuCisgIGJvb2wgYWxsb3dFeHRyYUFuYWx5c2lzKFN0cmluZ1JlZiBQYXNzTmFtZSkgY29uc3QgeworICAgIHJldHVybiAoTUYuZ2V0RnVuY3Rpb24oKS5nZXRDb250ZXh0KCkuZ2V0RGlhZ25vc3RpY3NPdXRwdXRGaWxlKCkgfHwKKyAgICAgICAgICAgIE1GLmdldEZ1bmN0aW9uKCkuZ2V0Q29udGV4dCgpCisgICAgICAgICAgICAuZ2V0RGlhZ0hhbmRsZXJQdHIoKS0+aXNBbnlSZW1hcmtFbmFibGVkKFBhc3NOYW1lKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFRha2UgYSBsYW1iZGEgdGhhdCByZXR1cm5zIGEgcmVtYXJrIHdoaWNoIHdpbGwgYmUgZW1pdHRlZC4gIFNlY29uZAorICAvLy8gYXJndW1lbnQgaXMgb25seSB1c2VkIHRvIHJlc3RyaWN0IHRoaXMgdG8gZnVuY3Rpb25zLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCBlbWl0KFQgUmVtYXJrQnVpbGRlciwgZGVjbHR5cGUoUmVtYXJrQnVpbGRlcigpKSAqID0gbnVsbHB0cikgeworICAgIC8vIEF2b2lkIGJ1aWxkaW5nIHRoZSByZW1hcmsgdW5sZXNzIHdlIGtub3cgdGhlcmUgYXJlIGF0IGxlYXN0ICpzb21lKgorICAgIC8vIHJlbWFya3MgZW5hYmxlZC4gV2UgY2FuJ3QgY3VycmVudGx5IGNoZWNrIHdoZXRoZXIgcmVtYXJrcyBhcmUgcmVxdWVzdGVkCisgICAgLy8gZm9yIHRoZSBjYWxsaW5nIHBhc3Mgc2luY2UgdGhhdCByZXF1aXJlcyBhY3R1YWxseSBidWlsZGluZyB0aGUgcmVtYXJrLgorCisgICAgaWYgKE1GLmdldEZ1bmN0aW9uKCkuZ2V0Q29udGV4dCgpLmdldERpYWdub3N0aWNzT3V0cHV0RmlsZSgpIHx8CisgICAgICAgIE1GLmdldEZ1bmN0aW9uKCkuZ2V0Q29udGV4dCgpLmdldERpYWdIYW5kbGVyUHRyKCktPmlzQW55UmVtYXJrRW5hYmxlZCgpKSB7CisgICAgICBhdXRvIFIgPSBSZW1hcmtCdWlsZGVyKCk7CisgICAgICBlbWl0KChEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2UgJilSKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgTWFjaGluZUZ1bmN0aW9uICZNRjsKKworICAvLy8gTUJGSSBpcyBvbmx5IHNldCBpZiBob3RuZXNzIGlzIHJlcXVlc3RlZC4KKyAgTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mbyAqTUJGSTsKKworICAvLy8gQ29tcHV0ZSBob3RuZXNzIGZyb20gSVIgdmFsdWUgKGN1cnJlbnRseSBhc3N1bWVkIHRvIGJlIGEgYmxvY2spIGlmIFBHTyBpcworICAvLy8gYXZhaWxhYmxlLgorICBPcHRpb25hbDx1aW50NjRfdD4gY29tcHV0ZUhvdG5lc3MoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKyAgLy8vIFNpbWlsYXIgYnV0IHVzZSB2YWx1ZSBmcm9tIFxwIE9wdERpYWcgYW5kIHVwZGF0ZSBob3RuZXNzIHRoZXJlLgorICB2b2lkIGNvbXB1dGVIb3RuZXNzKERpYWdub3N0aWNJbmZvTUlST3B0aW1pemF0aW9uICZSZW1hcmspOworCisgIC8vLyBcYnJpZWYgT25seSBhbGxvdyB2ZXJib3NlIG1lc3NhZ2VzIGlmIHdlIGtub3cgd2UncmUgZmlsdGVyaW5nIGJ5IGhvdG5lc3MKKyAgLy8vIChCRkkgaXMgb25seSBzZXQgaW4gdGhpcyBjYXNlKS4KKyAgYm9vbCBzaG91bGRFbWl0VmVyYm9zZSgpIHsgcmV0dXJuIE1CRkkgIT0gbnVsbHB0cjsgfQorfTsKKworLy8vIFRoZSBhbmFseXNpcyBwYXNzCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhpcyBwYXNzIHNob3VsZG4ndCBnZW5lcmFsbHkgYmUgbWFya2VkIGFzIHByZXNlcnZlZCBieSBvdGhlcgorLy8vIHBhc3Nlcy4gIEl0J3MgaG9sZGluZyBvbnRvIEJGSSwgc28gaWYgdGhlIHBhc3MgZG9lcyBub3QgcHJlc2VydmUgQkZJLCBCRkkKKy8vLyBjb3VsZCBiZSBmcmVlZC4KK2NsYXNzIE1hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyUGFzcyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgc3RkOjp1bmlxdWVfcHRyPE1hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyPiBPUkU7CisKK3B1YmxpYzoKKyAgTWFjaGluZU9wdGltaXphdGlvblJlbWFya0VtaXR0ZXJQYXNzKCk7CisKKyAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSBvdmVycmlkZTsKKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIE1hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICZnZXRPUkUoKSB7CisgICAgYXNzZXJ0KE9SRSAmJiAicGFzcyBub3QgcnVuIHlldCIpOworICAgIHJldHVybiAqT1JFOworICB9CisKKyAgc3RhdGljIGNoYXIgSUQ7Cit9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lUGFzc1JlZ2lzdHJ5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZVBhc3NSZWdpc3RyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYmEwYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZVBhc3NSZWdpc3RyeS5oCkBAIC0wLDAgKzEsMTQyIEBACisvLz09PS0gbGx2bS9Db2RlR2VuL01hY2hpbmVQYXNzUmVnaXN0cnkuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWVjaGFuaWNzIGZvciBtYWNoaW5lIGZ1bmN0aW9uIHBhc3MgcmVnaXN0cmllcy4gIEEKKy8vIGZ1bmN0aW9uIHBhc3MgcmVnaXN0cnkgKE1hY2hpbmVQYXNzUmVnaXN0cnkpIGlzIGF1dG8gZmlsbGVkIGJ5IHRoZSBzdGF0aWMKKy8vIGNvbnN0cnVjdG9ycyBvZiBNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZS4gIEZ1cnRoZXIgdGhlcmUgaXMgYSBjb21tYW5kIGxpbmUKKy8vIHBhcnNlciAoUmVnaXN0ZXJQYXNzUGFyc2VyKSB3aGljaCBsaXN0ZW5zIHRvIGVhY2ggcmVnaXN0cnkgZm9yIGFkZGl0aW9ucworLy8gYW5kIGRlbGV0aW9ucywgc28gdGhhdCB0aGUgYXBwcm9wcmlhdGUgY29tbWFuZCBvcHRpb24gaXMgdXBkYXRlZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FUEFTU1JFR0lTVFJZX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVQQVNTUkVHSVNUUllfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK3VzaW5nIE1hY2hpbmVQYXNzQ3RvciA9IHZvaWQgKigqKSgpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gTWFjaGluZVBhc3NSZWdpc3RyeUxpc3RlbmVyIC0gTGlzdGVuZXIgdG8gYWRkcyBhbmQgcmVtb3ZhbHMgb2Ygbm9kZXMgaW4KKy8vLyByZWdpc3RyYXRpb24gbGlzdC4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2NsYXNzIE1hY2hpbmVQYXNzUmVnaXN0cnlMaXN0ZW5lciB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHVibGljOgorICBNYWNoaW5lUGFzc1JlZ2lzdHJ5TGlzdGVuZXIoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgfk1hY2hpbmVQYXNzUmVnaXN0cnlMaXN0ZW5lcigpID0gZGVmYXVsdDsKKworICB2aXJ0dWFsIHZvaWQgTm90aWZ5QWRkKFN0cmluZ1JlZiBOLCBNYWNoaW5lUGFzc0N0b3IgQywgU3RyaW5nUmVmIEQpID0gMDsKKyAgdmlydHVhbCB2b2lkIE5vdGlmeVJlbW92ZShTdHJpbmdSZWYgTikgPSAwOworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIE1hY2hpbmVQYXNzUmVnaXN0cnlOb2RlIC0gTWFjaGluZSBwYXNzIG5vZGUgc3RvcmVkIGluIHJlZ2lzdHJhdGlvbiBsaXN0LgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworY2xhc3MgTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUgeworcHJpdmF0ZToKKyAgTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUgKk5leHQgPSBudWxscHRyOyAvLyBOZXh0IGZ1bmN0aW9uIHBhc3MgaW4gbGlzdC4KKyAgU3RyaW5nUmVmIE5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAvLyBOYW1lIG9mIGZ1bmN0aW9uIHBhc3MuCisgIFN0cmluZ1JlZiBEZXNjcmlwdGlvbjsgICAgICAgICAgICAgICAgLy8gRGVzY3JpcHRpb24gc3RyaW5nLgorICBNYWNoaW5lUGFzc0N0b3IgQ3RvcjsgICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIHBhc3MgY3JlYXRvci4KKworcHVibGljOgorICBNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZShjb25zdCBjaGFyICpOLCBjb25zdCBjaGFyICpELCBNYWNoaW5lUGFzc0N0b3IgQykKKyAgICAgIDogTmFtZShOKSwgRGVzY3JpcHRpb24oRCksIEN0b3IoQykge30KKworICAvLyBBY2Nlc3NvcnMKKyAgTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUgKmdldE5leHQoKSAgICAgIGNvbnN0IHsgcmV0dXJuIE5leHQ7IH0KKyAgTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUgKipnZXROZXh0QWRkcmVzcygpICAgIHsgcmV0dXJuICZOZXh0OyB9CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgICAgICAgICAgICAgICAgICAgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorICBTdHJpbmdSZWYgZ2V0RGVzY3JpcHRpb24oKSAgICAgICAgICAgIGNvbnN0IHsgcmV0dXJuIERlc2NyaXB0aW9uOyB9CisgIE1hY2hpbmVQYXNzQ3RvciBnZXRDdG9yKCkgICAgICAgICAgICAgICBjb25zdCB7IHJldHVybiBDdG9yOyB9CisgIHZvaWQgc2V0TmV4dChNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZSAqTikgICAgICB7IE5leHQgPSBOOyB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gTWFjaGluZVBhc3NSZWdpc3RyeSAtIFRyYWNrIHRoZSByZWdpc3RyYXRpb24gb2YgbWFjaGluZSBwYXNzZXMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitjbGFzcyBNYWNoaW5lUGFzc1JlZ2lzdHJ5IHsKK3ByaXZhdGU6CisgIE1hY2hpbmVQYXNzUmVnaXN0cnlOb2RlICpMaXN0OyAgICAgICAgLy8gTGlzdCBvZiByZWdpc3RyeSBub2Rlcy4KKyAgTWFjaGluZVBhc3NDdG9yIERlZmF1bHQ7ICAgICAgICAgICAgICAvLyBEZWZhdWx0IGZ1bmN0aW9uIHBhc3MgY3JlYXRvci4KKyAgTWFjaGluZVBhc3NSZWdpc3RyeUxpc3RlbmVyICpMaXN0ZW5lcjsgLy8gTGlzdGVuZXIgZm9yIGxpc3QgYWRkcyBhcmUgcmVtb3Zlcy4KKworcHVibGljOgorICAvLyBOTyBDT05TVFJVQ1RPUiAtIHdlIGRvbid0IHdhbnQgc3RhdGljIGNvbnN0cnVjdG9yIG9yZGVyaW5nIHRvIG1lc3MKKyAgLy8gd2l0aCB0aGUgcmVnaXN0cnkuCisKKyAgLy8gQWNjZXNzb3JzLgorICAvLworICBNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZSAqZ2V0TGlzdCgpICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBMaXN0OyB9CisgIE1hY2hpbmVQYXNzQ3RvciBnZXREZWZhdWx0KCkgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIERlZmF1bHQ7IH0KKyAgdm9pZCBzZXREZWZhdWx0KE1hY2hpbmVQYXNzQ3RvciBDKSAgICAgICAgICAgICAgICAgICAgeyBEZWZhdWx0ID0gQzsgfQorICB2b2lkIHNldERlZmF1bHQoU3RyaW5nUmVmIE5hbWUpOworICB2b2lkIHNldExpc3RlbmVyKE1hY2hpbmVQYXNzUmVnaXN0cnlMaXN0ZW5lciAqTCkgICAgICB7IExpc3RlbmVyID0gTDsgfQorCisgIC8vLyBBZGQgLSBBZGRzIGEgZnVuY3Rpb24gcGFzcyB0byB0aGUgcmVnaXN0cmF0aW9uIGxpc3QuCisgIC8vLworICB2b2lkIEFkZChNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZSAqTm9kZSk7CisKKyAgLy8vIFJlbW92ZSAtIFJlbW92ZXMgYSBmdW5jdGlvbiBwYXNzIGZyb20gdGhlIHJlZ2lzdHJhdGlvbiBsaXN0LgorICAvLy8KKyAgdm9pZCBSZW1vdmUoTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUgKk5vZGUpOworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFJlZ2lzdGVyUGFzc1BhcnNlciBjbGFzcyAtIEhhbmRsZSB0aGUgYWRkaXRpb24gb2YgbmV3IG1hY2hpbmUgcGFzc2VzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwordGVtcGxhdGU8Y2xhc3MgUmVnaXN0cnlDbGFzcz4KK2NsYXNzIFJlZ2lzdGVyUGFzc1BhcnNlciA6IHB1YmxpYyBNYWNoaW5lUGFzc1JlZ2lzdHJ5TGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgcHVibGljIGNsOjpwYXJzZXI8dHlwZW5hbWUgUmVnaXN0cnlDbGFzczo6RnVuY3Rpb25QYXNzQ3Rvcj4geworcHVibGljOgorICBSZWdpc3RlclBhc3NQYXJzZXIoY2w6Ok9wdGlvbiAmTykKKyAgICAgIDogY2w6OnBhcnNlcjx0eXBlbmFtZSBSZWdpc3RyeUNsYXNzOjpGdW5jdGlvblBhc3NDdG9yPihPKSB7fQorICB+UmVnaXN0ZXJQYXNzUGFyc2VyKCkgb3ZlcnJpZGUgeyBSZWdpc3RyeUNsYXNzOjpzZXRMaXN0ZW5lcihudWxscHRyKTsgfQorCisgIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICBjbDo6cGFyc2VyPHR5cGVuYW1lIFJlZ2lzdHJ5Q2xhc3M6OkZ1bmN0aW9uUGFzc0N0b3I+Ojppbml0aWFsaXplKCk7CisKKyAgICAvLyBBZGQgZXhpc3RpbmcgcGFzc2VzIHRvIG9wdGlvbi4KKyAgICBmb3IgKFJlZ2lzdHJ5Q2xhc3MgKk5vZGUgPSBSZWdpc3RyeUNsYXNzOjpnZXRMaXN0KCk7CisgICAgICAgICBOb2RlOyBOb2RlID0gTm9kZS0+Z2V0TmV4dCgpKSB7CisgICAgICB0aGlzLT5hZGRMaXRlcmFsT3B0aW9uKE5vZGUtPmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAodHlwZW5hbWUgUmVnaXN0cnlDbGFzczo6RnVuY3Rpb25QYXNzQ3RvcilOb2RlLT5nZXRDdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUtPmdldERlc2NyaXB0aW9uKCkpOworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBsaXN0ZW4gZm9yIGxpc3QgY2hhbmdlcy4KKyAgICBSZWdpc3RyeUNsYXNzOjpzZXRMaXN0ZW5lcih0aGlzKTsKKyAgfQorCisgIC8vIEltcGxlbWVudCB0aGUgTWFjaGluZVBhc3NSZWdpc3RyeUxpc3RlbmVyIGNhbGxiYWNrcy4KKyAgdm9pZCBOb3RpZnlBZGQoU3RyaW5nUmVmIE4sIE1hY2hpbmVQYXNzQ3RvciBDLCBTdHJpbmdSZWYgRCkgb3ZlcnJpZGUgeworICAgIHRoaXMtPmFkZExpdGVyYWxPcHRpb24oTiwgKHR5cGVuYW1lIFJlZ2lzdHJ5Q2xhc3M6OkZ1bmN0aW9uUGFzc0N0b3IpQywgRCk7CisgIH0KKyAgdm9pZCBOb3RpZnlSZW1vdmUoU3RyaW5nUmVmIE4pIG92ZXJyaWRlIHsKKyAgICB0aGlzLT5yZW1vdmVMaXRlcmFsT3B0aW9uKE4pOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX01BQ0hJTkVQQVNTUkVHSVNUUllfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVQb3N0RG9taW5hdG9ycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVQb3N0RG9taW5hdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YTQxNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZVBvc3REb21pbmF0b3JzLmgKQEAgLTAsMCArMSw4NiBAQAorLy89LSBsbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYXRvcnMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZXhwb3NlcyBpbnRlcmZhY2VzIHRvIHBvc3QgZG9taW5hbmNlIGluZm9ybWF0aW9uIGZvcgorLy8gdGFyZ2V0LXNwZWNpZmljIGNvZGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORVBPU1RET01JTkFUT1JTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVQT1NURE9NSU5BVE9SU19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLworLy8vIFBvc3REb21pbmF0b3JUcmVlIENsYXNzIC0gQ29uY3JldGUgc3ViY2xhc3Mgb2YgRG9taW5hdG9yVHJlZSB0aGF0IGlzIHVzZWQKKy8vLyB0byBjb21wdXRlIHRoZSBwb3N0LWRvbWluYXRvciB0cmVlLgorLy8vCitzdHJ1Y3QgTWFjaGluZVBvc3REb21pbmF0b3JUcmVlIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworcHJpdmF0ZToKKyBQb3N0RG9tVHJlZUJhc2U8TWFjaGluZUJhc2ljQmxvY2s+ICpEVDsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBNYWNoaW5lUG9zdERvbWluYXRvclRyZWUoKTsKKworICB+TWFjaGluZVBvc3REb21pbmF0b3JUcmVlKCkgb3ZlcnJpZGU7CisKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVNYWNoaW5lUG9zdERvbWluYXRvclRyZWVQYXNzKCk7CisKKyAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVCYXNpY0Jsb2NrICo+ICZnZXRSb290cygpIGNvbnN0IHsKKyAgICByZXR1cm4gRFQtPmdldFJvb3RzKCk7CisgIH0KKworICBNYWNoaW5lRG9tVHJlZU5vZGUgKmdldFJvb3ROb2RlKCkgY29uc3QgeworICAgIHJldHVybiBEVC0+Z2V0Um9vdE5vZGUoKTsKKyAgfQorCisgIE1hY2hpbmVEb21UcmVlTm9kZSAqb3BlcmF0b3JbXShNYWNoaW5lQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gRFQtPmdldE5vZGUoQkIpOworICB9CisKKyAgTWFjaGluZURvbVRyZWVOb2RlICpnZXROb2RlKE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIHJldHVybiBEVC0+Z2V0Tm9kZShCQik7CisgIH0KKworICBib29sIGRvbWluYXRlcyhjb25zdCBNYWNoaW5lRG9tVHJlZU5vZGUgKkEsCisgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVEb21UcmVlTm9kZSAqQikgY29uc3QgeworICAgIHJldHVybiBEVC0+ZG9taW5hdGVzKEEsIEIpOworICB9CisKKyAgYm9vbCBkb21pbmF0ZXMoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKkEsIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpCKSBjb25zdCB7CisgICAgcmV0dXJuIERULT5kb21pbmF0ZXMoQSwgQik7CisgIH0KKworICBib29sIHByb3Blcmx5RG9taW5hdGVzKGNvbnN0IE1hY2hpbmVEb21UcmVlTm9kZSAqQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRG9tVHJlZU5vZGUgKkIpIGNvbnN0IHsKKyAgICByZXR1cm4gRFQtPnByb3Blcmx5RG9taW5hdGVzKEEsIEIpOworICB9CisKKyAgYm9vbCBwcm9wZXJseURvbWluYXRlcyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqQikgY29uc3QgeworICAgIHJldHVybiBEVC0+cHJvcGVybHlEb21pbmF0ZXMoQSwgQik7CisgIH0KKworICBNYWNoaW5lQmFzaWNCbG9jayAqZmluZE5lYXJlc3RDb21tb25Eb21pbmF0b3IoTWFjaGluZUJhc2ljQmxvY2sgKkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqQikgeworICAgIHJldHVybiBEVC0+ZmluZE5lYXJlc3RDb21tb25Eb21pbmF0b3IoQSwgQik7CisgIH0KKworICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIG92ZXJyaWRlOworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIHByaW50KGxsdm06OnJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICpNID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7Cit9OworfSAvL2VuZCBvZiBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaW9uSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpb25JbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5NGI1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaW9uSW5mby5oCkBAIC0wLDAgKzEsMTgyIEBACisvLz09PS0gbGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpb25JbmZvLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FUkVHSU9OSU5GT19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FUkVHSU9OSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZXB0aEZpcnN0SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1JlZ2lvbkluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1JlZ2lvbkl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVEb21pbmFuY2VGcm9udGllci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisKK3N0cnVjdCBNYWNoaW5lUG9zdERvbWluYXRvclRyZWU7CitjbGFzcyBNYWNoaW5lUmVnaW9uOworY2xhc3MgTWFjaGluZVJlZ2lvbk5vZGU7CitjbGFzcyBNYWNoaW5lUmVnaW9uSW5mbzsKKwordGVtcGxhdGUgPD4gc3RydWN0IFJlZ2lvblRyYWl0czxNYWNoaW5lRnVuY3Rpb24+IHsKKyAgdXNpbmcgRnVuY1QgPSBNYWNoaW5lRnVuY3Rpb247CisgIHVzaW5nIEJsb2NrVCA9IE1hY2hpbmVCYXNpY0Jsb2NrOworICB1c2luZyBSZWdpb25UID0gTWFjaGluZVJlZ2lvbjsKKyAgdXNpbmcgUmVnaW9uTm9kZVQgPSBNYWNoaW5lUmVnaW9uTm9kZTsKKyAgdXNpbmcgUmVnaW9uSW5mb1QgPSBNYWNoaW5lUmVnaW9uSW5mbzsKKyAgdXNpbmcgRG9tVHJlZVQgPSBNYWNoaW5lRG9taW5hdG9yVHJlZTsKKyAgdXNpbmcgRG9tVHJlZU5vZGVUID0gTWFjaGluZURvbVRyZWVOb2RlOworICB1c2luZyBQb3N0RG9tVHJlZVQgPSBNYWNoaW5lUG9zdERvbWluYXRvclRyZWU7CisgIHVzaW5nIERvbUZyb250aWVyVCA9IE1hY2hpbmVEb21pbmFuY2VGcm9udGllcjsKKyAgdXNpbmcgSW5zdFQgPSBNYWNoaW5lSW5zdHI7CisgIHVzaW5nIExvb3BUID0gTWFjaGluZUxvb3A7CisgIHVzaW5nIExvb3BJbmZvVCA9IE1hY2hpbmVMb29wSW5mbzsKKworICBzdGF0aWMgdW5zaWduZWQgZ2V0TnVtU3VjY2Vzc29ycyhNYWNoaW5lQmFzaWNCbG9jayAqQkIpIHsKKyAgICByZXR1cm4gQkItPnN1Y2Nfc2l6ZSgpOworICB9Cit9OworCitjbGFzcyBNYWNoaW5lUmVnaW9uTm9kZSA6IHB1YmxpYyBSZWdpb25Ob2RlQmFzZTxSZWdpb25UcmFpdHM8TWFjaGluZUZ1bmN0aW9uPj4geworcHVibGljOgorICBpbmxpbmUgTWFjaGluZVJlZ2lvbk5vZGUoTWFjaGluZVJlZ2lvbiAqUGFyZW50LCBNYWNoaW5lQmFzaWNCbG9jayAqRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3ViUmVnaW9uID0gZmFsc2UpCisgICAgICA6IFJlZ2lvbk5vZGVCYXNlPFJlZ2lvblRyYWl0czxNYWNoaW5lRnVuY3Rpb24+PihQYXJlbnQsIEVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTdWJSZWdpb24pIHt9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hY2hpbmVSZWdpb24gJlJOKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMgPT0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNYWNoaW5lUmVnaW9uTm9kZSAqPigmUk4pOworICB9Cit9OworCitjbGFzcyBNYWNoaW5lUmVnaW9uIDogcHVibGljIFJlZ2lvbkJhc2U8UmVnaW9uVHJhaXRzPE1hY2hpbmVGdW5jdGlvbj4+IHsKK3B1YmxpYzoKKyAgTWFjaGluZVJlZ2lvbihNYWNoaW5lQmFzaWNCbG9jayAqRW50cnksIE1hY2hpbmVCYXNpY0Jsb2NrICpFeGl0LAorICAgICAgICAgICAgICAgIE1hY2hpbmVSZWdpb25JbmZvICpSSSwgTWFjaGluZURvbWluYXRvclRyZWUgKkRULAorICAgICAgICAgICAgICAgIE1hY2hpbmVSZWdpb24gKlBhcmVudCA9IG51bGxwdHIpOworICB+TWFjaGluZVJlZ2lvbigpOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYWNoaW5lUmVnaW9uTm9kZSAmUk4pIGNvbnN0IHsKKyAgICByZXR1cm4gJlJOID09IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWFjaGluZVJlZ2lvbk5vZGUgKj4odGhpcyk7CisgIH0KK307CisKK2NsYXNzIE1hY2hpbmVSZWdpb25JbmZvIDogcHVibGljIFJlZ2lvbkluZm9CYXNlPFJlZ2lvblRyYWl0czxNYWNoaW5lRnVuY3Rpb24+PiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IE1hY2hpbmVSZWdpb25JbmZvKCk7CisgIH5NYWNoaW5lUmVnaW9uSW5mbygpIG92ZXJyaWRlOworCisgIC8vIHVwZGF0ZVN0YXRpc3RpY3MgLSBVcGRhdGUgc3RhdGlzdGljIGFib3V0IGNyZWF0ZWQgcmVnaW9ucy4KKyAgdm9pZCB1cGRhdGVTdGF0aXN0aWNzKE1hY2hpbmVSZWdpb24gKlIpIGZpbmFsOworCisgIHZvaWQgcmVjYWxjdWxhdGUoTWFjaGluZUZ1bmN0aW9uICZGLCBNYWNoaW5lRG9taW5hdG9yVHJlZSAqRFQsCisgICAgICAgICAgICAgICAgICAgTWFjaGluZVBvc3REb21pbmF0b3JUcmVlICpQRFQsIE1hY2hpbmVEb21pbmFuY2VGcm9udGllciAqREYpOworfTsKKworY2xhc3MgTWFjaGluZVJlZ2lvbkluZm9QYXNzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICBNYWNoaW5lUmVnaW9uSW5mbyBSSTsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBleHBsaWNpdCBNYWNoaW5lUmVnaW9uSW5mb1Bhc3MoKTsKKyAgfk1hY2hpbmVSZWdpb25JbmZvUGFzcygpIG92ZXJyaWRlOworCisgIE1hY2hpbmVSZWdpb25JbmZvICZnZXRSZWdpb25JbmZvKCkgeyByZXR1cm4gUkk7IH0KKworICBjb25zdCBNYWNoaW5lUmVnaW9uSW5mbyAmZ2V0UmVnaW9uSW5mbygpIGNvbnN0IHsgcmV0dXJuIFJJOyB9CisKKyAgLy8vIEBuYW1lIE1hY2hpbmVGdW5jdGlvblBhc3MgaW50ZXJmYWNlCisgIC8vQHsKKyAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKyAgdm9pZCB2ZXJpZnlBbmFseXNpcygpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICopIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgLy9AfQorfTsKKwordGVtcGxhdGUgPD4KK3RlbXBsYXRlIDw+CitpbmxpbmUgTWFjaGluZUJhc2ljQmxvY2sgKgorUmVnaW9uTm9kZUJhc2U8UmVnaW9uVHJhaXRzPE1hY2hpbmVGdW5jdGlvbj4+OjpnZXROb2RlQXM8TWFjaGluZUJhc2ljQmxvY2s+KCkKKyAgICBjb25zdCB7CisgIGFzc2VydCghaXNTdWJSZWdpb24oKSAmJiAiVGhpcyBpcyBub3QgYSBNYWNoaW5lQmFzaWNCbG9jayBSZWdpb25Ob2RlISIpOworICByZXR1cm4gZ2V0RW50cnkoKTsKK30KKwordGVtcGxhdGUgPD4KK3RlbXBsYXRlIDw+CitpbmxpbmUgTWFjaGluZVJlZ2lvbiAqCitSZWdpb25Ob2RlQmFzZTxSZWdpb25UcmFpdHM8TWFjaGluZUZ1bmN0aW9uPj46OmdldE5vZGVBczxNYWNoaW5lUmVnaW9uPigpCisgICAgY29uc3QgeworICBhc3NlcnQoaXNTdWJSZWdpb24oKSAmJiAiVGhpcyBpcyBub3QgYSBzdWJyZWdpb24gUmVnaW9uTm9kZSEiKTsKKyAgYXV0byBVbmNvbnN0ID0KKyAgICAgIGNvbnN0X2Nhc3Q8UmVnaW9uTm9kZUJhc2U8UmVnaW9uVHJhaXRzPE1hY2hpbmVGdW5jdGlvbj4+ICo+KHRoaXMpOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxNYWNoaW5lUmVnaW9uICo+KFVuY29uc3QpOworfQorCitSZWdpb25Ob2RlR3JhcGhUcmFpdHMoTWFjaGluZVJlZ2lvbk5vZGUsIE1hY2hpbmVCYXNpY0Jsb2NrLCBNYWNoaW5lUmVnaW9uKTsKK1JlZ2lvbk5vZGVHcmFwaFRyYWl0cyhjb25zdCBNYWNoaW5lUmVnaW9uTm9kZSwgTWFjaGluZUJhc2ljQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZVJlZ2lvbik7CisKK1JlZ2lvbkdyYXBoVHJhaXRzKE1hY2hpbmVSZWdpb24sIE1hY2hpbmVSZWdpb25Ob2RlKTsKK1JlZ2lvbkdyYXBoVHJhaXRzKGNvbnN0IE1hY2hpbmVSZWdpb24sIGNvbnN0IE1hY2hpbmVSZWdpb25Ob2RlKTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBHcmFwaFRyYWl0czxNYWNoaW5lUmVnaW9uSW5mbyAqPgorICAgIDogcHVibGljIEdyYXBoVHJhaXRzPEZsYXRJdDxNYWNoaW5lUmVnaW9uTm9kZSAqPj4geworICB1c2luZyBub2Rlc19pdGVyYXRvciA9IGRmX2l0ZXJhdG9yPE5vZGVSZWYsIGRmX2l0ZXJhdG9yX2RlZmF1bHRfc2V0PE5vZGVSZWY+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBHcmFwaFRyYWl0czxGbGF0SXQ8Tm9kZVJlZj4+PjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoTWFjaGluZVJlZ2lvbkluZm8gKlJJKSB7CisgICAgcmV0dXJuIEdyYXBoVHJhaXRzPEZsYXRJdDxNYWNoaW5lUmVnaW9uICo+Pjo6Z2V0RW50cnlOb2RlKAorICAgICAgICBSSS0+Z2V0VG9wTGV2ZWxSZWdpb24oKSk7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oTWFjaGluZVJlZ2lvbkluZm8gKlJJKSB7CisgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yOjpiZWdpbihnZXRFbnRyeU5vZGUoUkkpKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoTWFjaGluZVJlZ2lvbkluZm8gKlJJKSB7CisgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yOjplbmQoZ2V0RW50cnlOb2RlKFJJKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgR3JhcGhUcmFpdHM8TWFjaGluZVJlZ2lvbkluZm9QYXNzICo+CisgICAgOiBwdWJsaWMgR3JhcGhUcmFpdHM8TWFjaGluZVJlZ2lvbkluZm8gKj4geworICB1c2luZyBub2Rlc19pdGVyYXRvciA9IGRmX2l0ZXJhdG9yPE5vZGVSZWYsIGRmX2l0ZXJhdG9yX2RlZmF1bHRfc2V0PE5vZGVSZWY+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBHcmFwaFRyYWl0czxGbGF0SXQ8Tm9kZVJlZj4+PjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoTWFjaGluZVJlZ2lvbkluZm9QYXNzICpSSSkgeworICAgIHJldHVybiBHcmFwaFRyYWl0czxNYWNoaW5lUmVnaW9uSW5mbyAqPjo6Z2V0RW50cnlOb2RlKCZSSS0+Z2V0UmVnaW9uSW5mbygpKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihNYWNoaW5lUmVnaW9uSW5mb1Bhc3MgKlJJKSB7CisgICAgcmV0dXJuIEdyYXBoVHJhaXRzPE1hY2hpbmVSZWdpb25JbmZvICo+Ojpub2Rlc19iZWdpbigmUkktPmdldFJlZ2lvbkluZm8oKSk7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKE1hY2hpbmVSZWdpb25JbmZvUGFzcyAqUkkpIHsKKyAgICByZXR1cm4gR3JhcGhUcmFpdHM8TWFjaGluZVJlZ2lvbkluZm8gKj46Om5vZGVzX2VuZCgmUkktPmdldFJlZ2lvbkluZm8oKSk7CisgIH0KK307CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBSZWdpb25CYXNlPFJlZ2lvblRyYWl0czxNYWNoaW5lRnVuY3Rpb24+PjsKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBSZWdpb25Ob2RlQmFzZTxSZWdpb25UcmFpdHM8TWFjaGluZUZ1bmN0aW9uPj47CitleHRlcm4gdGVtcGxhdGUgY2xhc3MgUmVnaW9uSW5mb0Jhc2U8UmVnaW9uVHJhaXRzPE1hY2hpbmVGdW5jdGlvbj4+OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX01BQ0hJTkVSRUdJT05JTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZGZkMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oCkBAIC0wLDAgKzEsMTE5NyBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgTWFjaGluZVJlZ2lzdGVySW5mbyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FUkVHSVNURVJJTkZPX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVSRUdJU1RFUklORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0luZGV4ZWRNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvUmVnaXN0ZXJCYW5rLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xvd0xldmVsVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVPcGVyYW5kLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRTdWJ0YXJnZXRJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9MYW5lQml0bWFzay5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBQU2V0SXRlcmF0b3I7CisKKy8vLyBDb252ZW5pZW50IHR5cGUgdG8gcmVwcmVzZW50IGVpdGhlciBhIHJlZ2lzdGVyIGNsYXNzIG9yIGEgcmVnaXN0ZXIgYmFuay4KK3VzaW5nIFJlZ0NsYXNzT3JSZWdCYW5rID0KKyAgICBQb2ludGVyVW5pb248Y29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqLCBjb25zdCBSZWdpc3RlckJhbmsgKj47CisKKy8vLyBNYWNoaW5lUmVnaXN0ZXJJbmZvIC0gS2VlcCB0cmFjayBvZiBpbmZvcm1hdGlvbiBmb3IgdmlydHVhbCBhbmQgcGh5c2ljYWwKKy8vLyByZWdpc3RlcnMsIGluY2x1ZGluZyB2cmVnIHJlZ2lzdGVyIGNsYXNzZXMsIHVzZS9kZWYgY2hhaW5zIGZvciByZWdpc3RlcnMsCisvLy8gZXRjLgorY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbyB7CitwdWJsaWM6CisgIGNsYXNzIERlbGVnYXRlIHsKKyAgICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKKyAgcHVibGljOgorICAgIHZpcnR1YWwgfkRlbGVnYXRlKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB2b2lkIE1SSV9Ob3RlTmV3VmlydHVhbFJlZ2lzdGVyKHVuc2lnbmVkIFJlZykgPSAwOworICB9OworCitwcml2YXRlOgorICBNYWNoaW5lRnVuY3Rpb24gKk1GOworICBEZWxlZ2F0ZSAqVGhlRGVsZWdhdGUgPSBudWxscHRyOworCisgIC8vLyBUcnVlIGlmIHN1YnJlZ2lzdGVyIGxpdmVuZXNzIGlzIHRyYWNrZWQuCisgIGNvbnN0IGJvb2wgVHJhY2tzU3ViUmVnTGl2ZW5lc3M7CisKKyAgLy8vIFZSZWdJbmZvIC0gSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgZWFjaCB2aXJ0dWFsIHJlZ2lzdGVyLgorICAvLy8KKyAgLy8vIEVhY2ggZWxlbWVudCBpbiB0aGlzIGxpc3QgY29udGFpbnMgdGhlIHJlZ2lzdGVyIGNsYXNzIG9mIHRoZSB2cmVnIGFuZCB0aGUKKyAgLy8vIHN0YXJ0IG9mIHRoZSB1c2UvZGVmIGxpc3QgZm9yIHRoZSByZWdpc3Rlci4KKyAgSW5kZXhlZE1hcDxzdGQ6OnBhaXI8UmVnQ2xhc3NPclJlZ0JhbmssIE1hY2hpbmVPcGVyYW5kICo+LAorICAgICAgICAgICAgIFZpcnRSZWcySW5kZXhGdW5jdG9yPgorICAgICAgVlJlZ0luZm87CisKKyAgLy8vIE1hcCBmb3IgcmVjb3ZlcmluZyB2cmVnIG5hbWUgZnJvbSB2cmVnIG51bWJlci4KKyAgLy8vIFRoaXMgbWFwIGlzIHVzZWQgYnkgdGhlIE1JUiBQcmludGVyLgorICBJbmRleGVkTWFwPHN0ZDo6c3RyaW5nLCBWaXJ0UmVnMkluZGV4RnVuY3Rvcj4gVlJlZzJOYW1lOworCisgIC8vLyBTdHJpbmdTZXQgdGhhdCBpcyB1c2VkIHRvIHVuaXF1ZSB2cmVnIG5hbWVzLgorICBTdHJpbmdTZXQ8PiBWUmVnTmFtZXM7CisKKyAgLy8vIFRoZSBmbGFnIGlzIHRydWUgdXBvbiBccCBVcGRhdGVkQ1NScyBpbml0aWFsaXphdGlvbgorICAvLy8gYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBJc1VwZGF0ZWRDU1JzSW5pdGlhbGl6ZWQ7CisKKyAgLy8vIENvbnRhaW5zIHRoZSB1cGRhdGVkIGNhbGxlZSBzYXZlZCByZWdpc3RlciBsaXN0LgorICAvLy8gQXMgb3Bwb3NlZCB0byB0aGUgc3RhdGljIGxpc3QgZGVmaW5lZCBpbiByZWdpc3RlciBpbmZvLAorICAvLy8gYWxsIHJlZ2lzdGVycyB0aGF0IHdlcmUgZGlzYWJsZWQgYXJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KKyAgU21hbGxWZWN0b3I8TUNQaHlzUmVnLCAxNj4gVXBkYXRlZENTUnM7CisKKyAgLy8vIFJlZ0FsbG9jSGludHMgLSBUaGlzIHZlY3RvciByZWNvcmRzIHJlZ2lzdGVyIGFsbG9jYXRpb24gaGludHMgZm9yCisgIC8vLyB2aXJ0dWFsIHJlZ2lzdGVycy4gRm9yIGVhY2ggdmlydHVhbCByZWdpc3RlciwgaXQga2VlcHMgYSBwYWlyIG9mIGhpbnQKKyAgLy8vIHR5cGUgYW5kIGhpbnRzIHZlY3RvciBtYWtpbmcgdXAgdGhlIGFsbG9jYXRpb24gaGludHMuIE9ubHkgdGhlIGZpcnN0CisgIC8vLyBoaW50IG1heSBiZSB0YXJnZXQgc3BlY2lmaWMsIGFuZCBpbiB0aGF0IGNhc2UgdGhpcyBpcyByZWZsZWN0ZWQgYnkgdGhlCisgIC8vLyBmaXJzdCBtZW1iZXIgb2YgdGhlIHBhaXIgYmVpbmcgbm9uLXplcm8uIElmIHRoZSBoaW50ZWQgcmVnaXN0ZXIgaXMKKyAgLy8vIHZpcnR1YWwsIGl0IG1lYW5zIHRoZSBhbGxvY2F0b3Igc2hvdWxkIHByZWZlciB0aGUgcGh5c2ljYWwgcmVnaXN0ZXIKKyAgLy8vIGFsbG9jYXRlZCB0byBpdCBpZiBhbnkuCisgIEluZGV4ZWRNYXA8c3RkOjpwYWlyPHVuc2lnbmVkLCBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4+LAorICAgICAgICAgICAgIFZpcnRSZWcySW5kZXhGdW5jdG9yPiBSZWdBbGxvY0hpbnRzOworCisgIC8vLyBQaHlzUmVnVXNlRGVmTGlzdHMgLSBUaGlzIGlzIGFuIGFycmF5IG9mIHRoZSBoZWFkIG9mIHRoZSB1c2UvZGVmIGxpc3QgZm9yCisgIC8vLyBwaHlzaWNhbCByZWdpc3RlcnMuCisgIHN0ZDo6dW5pcXVlX3B0cjxNYWNoaW5lT3BlcmFuZCAqW10+IFBoeXNSZWdVc2VEZWZMaXN0czsKKworICAvLy8gZ2V0UmVnVXNlRGVmTGlzdEhlYWQgLSBSZXR1cm4gdGhlIGhlYWQgcG9pbnRlciBmb3IgdGhlIHJlZ2lzdGVyIHVzZS9kZWYKKyAgLy8vIGxpc3QgZm9yIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBvciBwaHlzaWNhbCByZWdpc3Rlci4KKyAgTWFjaGluZU9wZXJhbmQgKiZnZXRSZWdVc2VEZWZMaXN0SGVhZCh1bnNpZ25lZCBSZWdObykgeworICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFJlZ05vKSkKKyAgICAgIHJldHVybiBWUmVnSW5mb1tSZWdOb10uc2Vjb25kOworICAgIHJldHVybiBQaHlzUmVnVXNlRGVmTGlzdHNbUmVnTm9dOworICB9CisKKyAgTWFjaGluZU9wZXJhbmQgKmdldFJlZ1VzZURlZkxpc3RIZWFkKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoUmVnTm8pKQorICAgICAgcmV0dXJuIFZSZWdJbmZvW1JlZ05vXS5zZWNvbmQ7CisgICAgcmV0dXJuIFBoeXNSZWdVc2VEZWZMaXN0c1tSZWdOb107CisgIH0KKworICAvLy8gR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIHVzZS1kZWYgY2hhaW4uCisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCAqZ2V0TmV4dE9wZXJhbmRGb3JSZWcoY29uc3QgTWFjaGluZU9wZXJhbmQgKk1PKSB7CisgICAgYXNzZXJ0KE1PICYmIE1PLT5pc1JlZygpICYmICJUaGlzIGlzIG5vdCBhIHJlZ2lzdGVyIG9wZXJhbmQhIik7CisgICAgcmV0dXJuIE1PLT5Db250ZW50cy5SZWcuTmV4dDsKKyAgfQorCisgIC8vLyBVc2VkUGh5c1JlZ01hc2sgLSBBZGRpdGlvbmFsIHVzZWQgcGh5c3JlZ3MgaW5jbHVkaW5nIGFsaWFzZXMuCisgIC8vLyBUaGlzIGJpdCB2ZWN0b3IgcmVwcmVzZW50cyBhbGwgdGhlIHJlZ2lzdGVycyBjbG9iYmVyZWQgYnkgZnVuY3Rpb24gY2FsbHMuCisgIEJpdFZlY3RvciBVc2VkUGh5c1JlZ01hc2s7CisKKyAgLy8vIFJlc2VydmVkUmVncyAtIFRoaXMgaXMgYSBiaXQgdmVjdG9yIG9mIHJlc2VydmVkIHJlZ2lzdGVycy4gIFRoZSB0YXJnZXQKKyAgLy8vIG1heSBjaGFuZ2UgaXRzIG1pbmQgYWJvdXQgd2hpY2ggcmVnaXN0ZXJzIHNob3VsZCBiZSByZXNlcnZlZC4gIFRoaXMKKyAgLy8vIHZlY3RvciBpcyB0aGUgZnJvemVuIHNldCBvZiByZXNlcnZlZCByZWdpc3RlcnMgd2hlbiByZWdpc3RlciBhbGxvY2F0aW9uCisgIC8vLyBzdGFydGVkLgorICBCaXRWZWN0b3IgUmVzZXJ2ZWRSZWdzOworCisgIHVzaW5nIFZSZWdUb1R5cGVNYXAgPSBEZW5zZU1hcDx1bnNpZ25lZCwgTExUPjsKKyAgLy8vIE1hcCBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGFjdHVhbCBzaXplLgorICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxWUmVnVG9UeXBlTWFwPiBWUmVnVG9UeXBlOworCisgIC8vLyBLZWVwIHRyYWNrIG9mIHRoZSBwaHlzaWNhbCByZWdpc3RlcnMgdGhhdCBhcmUgbGl2ZSBpbiB0byB0aGUgZnVuY3Rpb24uCisgIC8vLyBMaXZlIGluIHZhbHVlcyBhcmUgdHlwaWNhbGx5IGFyZ3VtZW50cyBpbiByZWdpc3RlcnMuICBMaXZlSW4gdmFsdWVzIGFyZQorICAvLy8gYWxsb3dlZCB0byBoYXZlIHZpcnR1YWwgcmVnaXN0ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLCBzdG9yZWQgaW4gdGhlCisgIC8vLyBzZWNvbmQgZWxlbWVudC4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4+IExpdmVJbnM7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgTWFjaGluZVJlZ2lzdGVySW5mbyhNYWNoaW5lRnVuY3Rpb24gKk1GKTsKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyhjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICYpID0gZGVsZXRlOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZvcGVyYXRvcj0oY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmKSA9IGRlbGV0ZTsKKworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKmdldFRhcmdldFJlZ2lzdGVySW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gTUYtPmdldFN1YnRhcmdldCgpLmdldFJlZ2lzdGVySW5mbygpOworICB9CisKKyAgdm9pZCByZXNldERlbGVnYXRlKERlbGVnYXRlICpkZWxlZ2F0ZSkgeworICAgIC8vIEVuc3VyZSBhbm90aGVyIGRlbGVnYXRlIGRvZXMgbm90IHRha2Ugb3ZlciB1bmxlc3MgdGhlIGN1cnJlbnQKKyAgICAvLyBkZWxlZ2F0ZSBmaXJzdCB1bmF0dGFjaGVzIGl0c2VsZi4gSWYgd2UgZXZlciBuZWVkIHRvIG11bHRpY2FzdAorICAgIC8vIG5vdGlmaWNhdGlvbnMsIHdlIHdpbGwgbmVlZCB0byBjaGFuZ2UgdG8gdXNpbmcgYSBsaXN0LgorICAgIGFzc2VydChUaGVEZWxlZ2F0ZSA9PSBkZWxlZ2F0ZSAmJgorICAgICAgICAgICAiT25seSB0aGUgY3VycmVudCBkZWxlZ2F0ZSBjYW4gcGVyZm9ybSByZXNldCEiKTsKKyAgICBUaGVEZWxlZ2F0ZSA9IG51bGxwdHI7CisgIH0KKworICB2b2lkIHNldERlbGVnYXRlKERlbGVnYXRlICpkZWxlZ2F0ZSkgeworICAgIGFzc2VydChkZWxlZ2F0ZSAmJiAhVGhlRGVsZWdhdGUgJiYKKyAgICAgICAgICAgIkF0dGVtcHRlZCB0byBzZXQgZGVsZWdhdGUgdG8gbnVsbCwgb3IgdG8gY2hhbmdlIGl0IHdpdGhvdXQgIgorICAgICAgICAgICAiZmlyc3QgcmVzZXR0aW5nIGl0ISIpOworCisgICAgVGhlRGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBGdW5jdGlvbiBTdGF0ZQorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLyBpc1NTQSAtIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBtYWNoaW5lIGZ1bmN0aW9uIGlzIGluIFNTQSBmb3JtLiBFYXJseQorICAvLyBwYXNzZXMgcmVxdWlyZSB0aGUgbWFjaGluZSBmdW5jdGlvbiB0byBiZSBpbiBTU0EgZm9ybSB3aGVyZSBldmVyeSB2aXJ0dWFsCisgIC8vIHJlZ2lzdGVyIGhhcyBhIHNpbmdsZSBkZWZpbmluZyBpbnN0cnVjdGlvbi4KKyAgLy8KKyAgLy8gVGhlIFR3b0FkZHJlc3NJbnN0cnVjdGlvblBhc3MgYW5kIFBISUVsaW1pbmF0aW9uIHBhc3NlcyB0YWtlIHRoZSBtYWNoaW5lCisgIC8vIGZ1bmN0aW9uIG91dCBvZiBTU0EgZm9ybSB3aGVuIHRoZXkgaW50cm9kdWNlIG11bHRpcGxlIGRlZnMgcGVyIHZpcnR1YWwKKyAgLy8gcmVnaXN0ZXIuCisgIGJvb2wgaXNTU0EoKSBjb25zdCB7CisgICAgcmV0dXJuIE1GLT5nZXRQcm9wZXJ0aWVzKCkuaGFzUHJvcGVydHkoCisgICAgICAgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXM6OlByb3BlcnR5OjpJc1NTQSk7CisgIH0KKworICAvLyBsZWF2ZVNTQSAtIEluZGljYXRlcyB0aGF0IHRoZSBtYWNoaW5lIGZ1bmN0aW9uIGlzIG5vIGxvbmdlciBpbiBTU0EgZm9ybS4KKyAgdm9pZCBsZWF2ZVNTQSgpIHsKKyAgICBNRi0+Z2V0UHJvcGVydGllcygpLnJlc2V0KE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXM6OlByb3BlcnR5OjpJc1NTQSk7CisgIH0KKworICAvLy8gdHJhY2tzTGl2ZW5lc3MgLSBSZXR1cm5zIHRydWUgd2hlbiB0cmFja2luZyByZWdpc3RlciBsaXZlbmVzcyBhY2N1cmF0ZWx5LgorICAvLy8gKHNlZSBNYWNoaW5lRlVuY3Rpb25Qcm9wZXJ0aWVzOjpQcm9wZXJ0eSBkZXNjcmlwdGlvbiBmb3IgZGV0YWlscykKKyAgYm9vbCB0cmFja3NMaXZlbmVzcygpIGNvbnN0IHsKKyAgICByZXR1cm4gTUYtPmdldFByb3BlcnRpZXMoKS5oYXNQcm9wZXJ0eSgKKyAgICAgICAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllczo6UHJvcGVydHk6OlRyYWNrc0xpdmVuZXNzKTsKKyAgfQorCisgIC8vLyBpbnZhbGlkYXRlTGl2ZW5lc3MgLSBJbmRpY2F0ZXMgdGhhdCByZWdpc3RlciBsaXZlbmVzcyBpcyBubyBsb25nZXIgYmVpbmcKKyAgLy8vIHRyYWNrZWQgYWNjdXJhdGVseS4KKyAgLy8vCisgIC8vLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgbGF0ZSBwYXNzZXMgdGhhdCBpbnZhbGlkYXRlIHRoZSBsaXZlbmVzcworICAvLy8gaW5mb3JtYXRpb24uCisgIHZvaWQgaW52YWxpZGF0ZUxpdmVuZXNzKCkgeworICAgIE1GLT5nZXRQcm9wZXJ0aWVzKCkucmVzZXQoCisgICAgICAgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXM6OlByb3BlcnR5OjpUcmFja3NMaXZlbmVzcyk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIGxpdmVuZXNzIGZvciByZWdpc3RlciBjbGFzcyBAcCBSQyBzaG91bGQgYmUgdHJhY2tlZCBhdAorICAvLy8gdGhlIHN1YnJlZ2lzdGVyIGxldmVsLgorICBib29sIHNob3VsZFRyYWNrU3ViUmVnTGl2ZW5lc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAmUkMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3ViUmVnTGl2ZW5lc3NFbmFibGVkKCkgJiYgUkMuSGFzRGlzanVuY3RTdWJSZWdzOworICB9CisgIGJvb2wgc2hvdWxkVHJhY2tTdWJSZWdMaXZlbmVzcyh1bnNpZ25lZCBWUmVnKSBjb25zdCB7CisgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoVlJlZykgJiYgIk11c3QgcGFzcyBhIFZSZWciKTsKKyAgICByZXR1cm4gc2hvdWxkVHJhY2tTdWJSZWdMaXZlbmVzcygqZ2V0UmVnQ2xhc3MoVlJlZykpOworICB9CisgIGJvb2wgc3ViUmVnTGl2ZW5lc3NFbmFibGVkKCkgY29uc3QgeworICAgIHJldHVybiBUcmFja3NTdWJSZWdMaXZlbmVzczsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBSZWdpc3RlciBJbmZvCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHVwZGF0ZWQgQ1NSIGxpc3Qgd2FzIGluaXRpYWxpemVkIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgaXNVcGRhdGVkQ1NSc0luaXRpYWxpemVkKCkgY29uc3QgeyByZXR1cm4gSXNVcGRhdGVkQ1NSc0luaXRpYWxpemVkOyB9CisKKyAgLy8vIERpc2FibGVzIHRoZSByZWdpc3RlciBmcm9tIHRoZSBsaXN0IG9mIENTUnMuCisgIC8vLyBJLmUuIHRoZSByZWdpc3RlciB3aWxsIG5vdCBhcHBlYXIgYXMgcGFydCBvZiB0aGUgQ1NSIG1hc2suCisgIC8vLyBcc2VlIFVwZGF0ZWRDYWxsZWVTYXZlZFJlZ3MuCisgIHZvaWQgZGlzYWJsZUNhbGxlZVNhdmVkUmVnaXN0ZXIodW5zaWduZWQgUmVnKTsKKworICAvLy8gUmV0dXJucyBsaXN0IG9mIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMuCisgIC8vLyBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgdXBkYXRlZCBDU1IgbGlzdCAoYWZ0ZXIgdGFraW5nIGludG8gYWNjb3VudAorICAvLy8gcmVnaXN0ZXJzIHRoYXQgYXJlIGRpc2FibGVkIGZyb20gdGhlIENTUiBsaXN0KS4KKyAgY29uc3QgTUNQaHlzUmVnICpnZXRDYWxsZWVTYXZlZFJlZ3MoKSBjb25zdDsKKworICAvLy8gU2V0cyB0aGUgdXBkYXRlZCBDYWxsZWUgU2F2ZWQgUmVnaXN0ZXJzIGxpc3QuCisgIC8vLyBOb3RpY2UgdGhhdCBpdCB3aWxsIG92ZXJyaWRlIGFudCBwcmV2aW91c2x5IGRpc2FibGVkL3NhdmVkIENTUnMuCisgIHZvaWQgc2V0Q2FsbGVlU2F2ZWRSZWdzKEFycmF5UmVmPE1DUGh5c1JlZz4gQ1NScyk7CisKKyAgLy8gU3RyaWN0bHkgZm9yIHVzZSBieSBNYWNoaW5lSW5zdHIuY3BwLgorICB2b2lkIGFkZFJlZ09wZXJhbmRUb1VzZUxpc3QoTWFjaGluZU9wZXJhbmQgKk1PKTsKKworICAvLyBTdHJpY3RseSBmb3IgdXNlIGJ5IE1hY2hpbmVJbnN0ci5jcHAuCisgIHZvaWQgcmVtb3ZlUmVnT3BlcmFuZEZyb21Vc2VMaXN0KE1hY2hpbmVPcGVyYW5kICpNTyk7CisKKyAgLy8gU3RyaWN0bHkgZm9yIHVzZSBieSBNYWNoaW5lSW5zdHIuY3BwLgorICB2b2lkIG1vdmVPcGVyYW5kcyhNYWNoaW5lT3BlcmFuZCAqRHN0LCBNYWNoaW5lT3BlcmFuZCAqU3JjLCB1bnNpZ25lZCBOdW1PcHMpOworCisgIC8vLyBWZXJpZnkgdGhlIHNhbml0eSBvZiB0aGUgdXNlIGxpc3QgZm9yIFJlZy4KKyAgdm9pZCB2ZXJpZnlVc2VMaXN0KHVuc2lnbmVkIFJlZykgY29uc3Q7CisKKyAgLy8vIFZlcmlmeSB0aGUgdXNlIGxpc3Qgb2YgYWxsIHJlZ2lzdGVycy4KKyAgdm9pZCB2ZXJpZnlVc2VMaXN0cygpIGNvbnN0OworCisgIC8vLyByZWdfYmVnaW4vcmVnX2VuZCAtIFByb3ZpZGUgaXRlcmF0aW9uIHN1cHBvcnQgdG8gd2FsayBvdmVyIGFsbCBkZWZpbml0aW9ucworICAvLy8gYW5kIHVzZXMgb2YgYSByZWdpc3RlciB3aXRoaW4gdGhlIE1hY2hpbmVGdW5jdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMKKyAgLy8vIE1hY2hpbmVSZWdpc3RlckluZm8gb2JqZWN0LgorICB0ZW1wbGF0ZTxib29sIFVzZXMsIGJvb2wgRGVmcywgYm9vbCBTa2lwRGVidWcsCisgICAgICAgICAgIGJvb2wgQnlPcGVyYW5kLCBib29sIEJ5SW5zdHIsIGJvb2wgQnlCdW5kbGU+CisgIGNsYXNzIGRlZnVzZWNoYWluX2l0ZXJhdG9yOworICB0ZW1wbGF0ZTxib29sIFVzZXMsIGJvb2wgRGVmcywgYm9vbCBTa2lwRGVidWcsCisgICAgICAgICAgIGJvb2wgQnlPcGVyYW5kLCBib29sIEJ5SW5zdHIsIGJvb2wgQnlCdW5kbGU+CisgIGNsYXNzIGRlZnVzZWNoYWluX2luc3RyX2l0ZXJhdG9yOworCisgIC8vIE1ha2UgaXQgYSBmcmllbmQgc28gaXQgY2FuIGFjY2VzcyBnZXROZXh0T3BlcmFuZEZvclJlZygpLgorICB0ZW1wbGF0ZTxib29sLCBib29sLCBib29sLCBib29sLCBib29sLCBib29sPgorICAgIGZyaWVuZCBjbGFzcyBkZWZ1c2VjaGFpbl9pdGVyYXRvcjsKKyAgdGVtcGxhdGU8Ym9vbCwgYm9vbCwgYm9vbCwgYm9vbCwgYm9vbCwgYm9vbD4KKyAgICBmcmllbmQgY2xhc3MgZGVmdXNlY2hhaW5faW5zdHJfaXRlcmF0b3I7CisKKyAgLy8vIHJlZ19pdGVyYXRvci9yZWdfYmVnaW4vcmVnX2VuZCAtIFdhbGsgYWxsIGRlZnMgYW5kIHVzZXMgb2YgdGhlIHNwZWNpZmllZAorICAvLy8gcmVnaXN0ZXIuCisgIHVzaW5nIHJlZ19pdGVyYXRvciA9CisgICAgICBkZWZ1c2VjaGFpbl9pdGVyYXRvcjx0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlPjsKKyAgcmVnX2l0ZXJhdG9yIHJlZ19iZWdpbih1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiByZWdfaXRlcmF0b3IoZ2V0UmVnVXNlRGVmTGlzdEhlYWQoUmVnTm8pKTsKKyAgfQorICBzdGF0aWMgcmVnX2l0ZXJhdG9yIHJlZ19lbmQoKSB7IHJldHVybiByZWdfaXRlcmF0b3IobnVsbHB0cik7IH0KKworICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8cmVnX2l0ZXJhdG9yPiAgcmVnX29wZXJhbmRzKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHJlZ19iZWdpbihSZWcpLCByZWdfZW5kKCkpOworICB9CisKKyAgLy8vIHJlZ19pbnN0cl9pdGVyYXRvci9yZWdfaW5zdHJfYmVnaW4vcmVnX2luc3RyX2VuZCAtIFdhbGsgYWxsIGRlZnMgYW5kIHVzZXMKKyAgLy8vIG9mIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIsIHN0ZXBwaW5nIGJ5IE1hY2hpbmVJbnN0ci4KKyAgdXNpbmcgcmVnX2luc3RyX2l0ZXJhdG9yID0KKyAgICAgIGRlZnVzZWNoYWluX2luc3RyX2l0ZXJhdG9yPHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2U+OworICByZWdfaW5zdHJfaXRlcmF0b3IgcmVnX2luc3RyX2JlZ2luKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIHJlZ19pbnN0cl9pdGVyYXRvcihnZXRSZWdVc2VEZWZMaXN0SGVhZChSZWdObykpOworICB9CisgIHN0YXRpYyByZWdfaW5zdHJfaXRlcmF0b3IgcmVnX2luc3RyX2VuZCgpIHsKKyAgICByZXR1cm4gcmVnX2luc3RyX2l0ZXJhdG9yKG51bGxwdHIpOworICB9CisKKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPHJlZ19pbnN0cl9pdGVyYXRvcj4KKyAgcmVnX2luc3RydWN0aW9ucyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShyZWdfaW5zdHJfYmVnaW4oUmVnKSwgcmVnX2luc3RyX2VuZCgpKTsKKyAgfQorCisgIC8vLyByZWdfYnVuZGxlX2l0ZXJhdG9yL3JlZ19idW5kbGVfYmVnaW4vcmVnX2J1bmRsZV9lbmQgLSBXYWxrIGFsbCBkZWZzIGFuZCB1c2VzCisgIC8vLyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLCBzdGVwcGluZyBieSBidW5kbGUuCisgIHVzaW5nIHJlZ19idW5kbGVfaXRlcmF0b3IgPQorICAgICAgZGVmdXNlY2hhaW5faW5zdHJfaXRlcmF0b3I8dHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZT47CisgIHJlZ19idW5kbGVfaXRlcmF0b3IgcmVnX2J1bmRsZV9iZWdpbih1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiByZWdfYnVuZGxlX2l0ZXJhdG9yKGdldFJlZ1VzZURlZkxpc3RIZWFkKFJlZ05vKSk7CisgIH0KKyAgc3RhdGljIHJlZ19idW5kbGVfaXRlcmF0b3IgcmVnX2J1bmRsZV9lbmQoKSB7CisgICAgcmV0dXJuIHJlZ19idW5kbGVfaXRlcmF0b3IobnVsbHB0cik7CisgIH0KKworICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8cmVnX2J1bmRsZV9pdGVyYXRvcj4gcmVnX2J1bmRsZXModW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UocmVnX2J1bmRsZV9iZWdpbihSZWcpLCByZWdfYnVuZGxlX2VuZCgpKTsKKyAgfQorCisgIC8vLyByZWdfZW1wdHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gaW5zdHJ1Y3Rpb25zIHVzaW5nIG9yIGRlZmluaW5nIHRoZQorICAvLy8gc3BlY2lmaWVkIHJlZ2lzdGVyIChpdCBtYXkgYmUgbGl2ZS1pbikuCisgIGJvb2wgcmVnX2VtcHR5KHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7IHJldHVybiByZWdfYmVnaW4oUmVnTm8pID09IHJlZ19lbmQoKTsgfQorCisgIC8vLyByZWdfbm9kYmdfaXRlcmF0b3IvcmVnX25vZGJnX2JlZ2luL3JlZ19ub2RiZ19lbmQgLSBXYWxrIGFsbCBkZWZzIGFuZCB1c2VzCisgIC8vLyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLCBza2lwcGluZyB0aG9zZSBtYXJrZWQgYXMgRGVidWcuCisgIHVzaW5nIHJlZ19ub2RiZ19pdGVyYXRvciA9CisgICAgICBkZWZ1c2VjaGFpbl9pdGVyYXRvcjx0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2U+OworICByZWdfbm9kYmdfaXRlcmF0b3IgcmVnX25vZGJnX2JlZ2luKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIHJlZ19ub2RiZ19pdGVyYXRvcihnZXRSZWdVc2VEZWZMaXN0SGVhZChSZWdObykpOworICB9CisgIHN0YXRpYyByZWdfbm9kYmdfaXRlcmF0b3IgcmVnX25vZGJnX2VuZCgpIHsKKyAgICByZXR1cm4gcmVnX25vZGJnX2l0ZXJhdG9yKG51bGxwdHIpOworICB9CisKKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPHJlZ19ub2RiZ19pdGVyYXRvcj4KKyAgcmVnX25vZGJnX29wZXJhbmRzKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHJlZ19ub2RiZ19iZWdpbihSZWcpLCByZWdfbm9kYmdfZW5kKCkpOworICB9CisKKyAgLy8vIHJlZ19pbnN0cl9ub2RiZ19pdGVyYXRvci9yZWdfaW5zdHJfbm9kYmdfYmVnaW4vcmVnX2luc3RyX25vZGJnX2VuZCAtIFdhbGsKKyAgLy8vIGFsbCBkZWZzIGFuZCB1c2VzIG9mIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIsIHN0ZXBwaW5nIGJ5IE1hY2hpbmVJbnN0ciwKKyAgLy8vIHNraXBwaW5nIHRob3NlIG1hcmtlZCBhcyBEZWJ1Zy4KKyAgdXNpbmcgcmVnX2luc3RyX25vZGJnX2l0ZXJhdG9yID0KKyAgICAgIGRlZnVzZWNoYWluX2luc3RyX2l0ZXJhdG9yPHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZT47CisgIHJlZ19pbnN0cl9ub2RiZ19pdGVyYXRvciByZWdfaW5zdHJfbm9kYmdfYmVnaW4odW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gcmVnX2luc3RyX25vZGJnX2l0ZXJhdG9yKGdldFJlZ1VzZURlZkxpc3RIZWFkKFJlZ05vKSk7CisgIH0KKyAgc3RhdGljIHJlZ19pbnN0cl9ub2RiZ19pdGVyYXRvciByZWdfaW5zdHJfbm9kYmdfZW5kKCkgeworICAgIHJldHVybiByZWdfaW5zdHJfbm9kYmdfaXRlcmF0b3IobnVsbHB0cik7CisgIH0KKworICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8cmVnX2luc3RyX25vZGJnX2l0ZXJhdG9yPgorICByZWdfbm9kYmdfaW5zdHJ1Y3Rpb25zKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHJlZ19pbnN0cl9ub2RiZ19iZWdpbihSZWcpLCByZWdfaW5zdHJfbm9kYmdfZW5kKCkpOworICB9CisKKyAgLy8vIHJlZ19idW5kbGVfbm9kYmdfaXRlcmF0b3IvcmVnX2J1bmRsZV9ub2RiZ19iZWdpbi9yZWdfYnVuZGxlX25vZGJnX2VuZCAtIFdhbGsKKyAgLy8vIGFsbCBkZWZzIGFuZCB1c2VzIG9mIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIsIHN0ZXBwaW5nIGJ5IGJ1bmRsZSwKKyAgLy8vIHNraXBwaW5nIHRob3NlIG1hcmtlZCBhcyBEZWJ1Zy4KKyAgdXNpbmcgcmVnX2J1bmRsZV9ub2RiZ19pdGVyYXRvciA9CisgICAgICBkZWZ1c2VjaGFpbl9pbnN0cl9pdGVyYXRvcjx0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWU+OworICByZWdfYnVuZGxlX25vZGJnX2l0ZXJhdG9yIHJlZ19idW5kbGVfbm9kYmdfYmVnaW4odW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gcmVnX2J1bmRsZV9ub2RiZ19pdGVyYXRvcihnZXRSZWdVc2VEZWZMaXN0SGVhZChSZWdObykpOworICB9CisgIHN0YXRpYyByZWdfYnVuZGxlX25vZGJnX2l0ZXJhdG9yIHJlZ19idW5kbGVfbm9kYmdfZW5kKCkgeworICAgIHJldHVybiByZWdfYnVuZGxlX25vZGJnX2l0ZXJhdG9yKG51bGxwdHIpOworICB9CisKKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPHJlZ19idW5kbGVfbm9kYmdfaXRlcmF0b3I+CisgIHJlZ19ub2RiZ19idW5kbGVzKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHJlZ19idW5kbGVfbm9kYmdfYmVnaW4oUmVnKSwgcmVnX2J1bmRsZV9ub2RiZ19lbmQoKSk7CisgIH0KKworICAvLy8gcmVnX25vZGJnX2VtcHR5IC0gUmV0dXJuIHRydWUgaWYgdGhlIG9ubHkgaW5zdHJ1Y3Rpb25zIHVzaW5nIG9yIGRlZmluaW5nCisgIC8vLyBSZWcgYXJlIERlYnVnIGluc3RydWN0aW9ucy4KKyAgYm9vbCByZWdfbm9kYmdfZW1wdHkodW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gcmVnX25vZGJnX2JlZ2luKFJlZ05vKSA9PSByZWdfbm9kYmdfZW5kKCk7CisgIH0KKworICAvLy8gZGVmX2l0ZXJhdG9yL2RlZl9iZWdpbi9kZWZfZW5kIC0gV2FsayBhbGwgZGVmcyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLgorICB1c2luZyBkZWZfaXRlcmF0b3IgPQorICAgICAgZGVmdXNlY2hhaW5faXRlcmF0b3I8ZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2U+OworICBkZWZfaXRlcmF0b3IgZGVmX2JlZ2luKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIGRlZl9pdGVyYXRvcihnZXRSZWdVc2VEZWZMaXN0SGVhZChSZWdObykpOworICB9CisgIHN0YXRpYyBkZWZfaXRlcmF0b3IgZGVmX2VuZCgpIHsgcmV0dXJuIGRlZl9pdGVyYXRvcihudWxscHRyKTsgfQorCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTxkZWZfaXRlcmF0b3I+IGRlZl9vcGVyYW5kcyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShkZWZfYmVnaW4oUmVnKSwgZGVmX2VuZCgpKTsKKyAgfQorCisgIC8vLyBkZWZfaW5zdHJfaXRlcmF0b3IvZGVmX2luc3RyX2JlZ2luL2RlZl9pbnN0cl9lbmQgLSBXYWxrIGFsbCBkZWZzIG9mIHRoZQorICAvLy8gc3BlY2lmaWVkIHJlZ2lzdGVyLCBzdGVwcGluZyBieSBNYWNoaW5lSW5zdC4KKyAgdXNpbmcgZGVmX2luc3RyX2l0ZXJhdG9yID0KKyAgICAgIGRlZnVzZWNoYWluX2luc3RyX2l0ZXJhdG9yPGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlPjsKKyAgZGVmX2luc3RyX2l0ZXJhdG9yIGRlZl9pbnN0cl9iZWdpbih1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiBkZWZfaW5zdHJfaXRlcmF0b3IoZ2V0UmVnVXNlRGVmTGlzdEhlYWQoUmVnTm8pKTsKKyAgfQorICBzdGF0aWMgZGVmX2luc3RyX2l0ZXJhdG9yIGRlZl9pbnN0cl9lbmQoKSB7CisgICAgcmV0dXJuIGRlZl9pbnN0cl9pdGVyYXRvcihudWxscHRyKTsKKyAgfQorCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTxkZWZfaW5zdHJfaXRlcmF0b3I+CisgIGRlZl9pbnN0cnVjdGlvbnModW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoZGVmX2luc3RyX2JlZ2luKFJlZyksIGRlZl9pbnN0cl9lbmQoKSk7CisgIH0KKworICAvLy8gZGVmX2J1bmRsZV9pdGVyYXRvci9kZWZfYnVuZGxlX2JlZ2luL2RlZl9idW5kbGVfZW5kIC0gV2FsayBhbGwgZGVmcyBvZiB0aGUKKyAgLy8vIHNwZWNpZmllZCByZWdpc3Rlciwgc3RlcHBpbmcgYnkgYnVuZGxlLgorICB1c2luZyBkZWZfYnVuZGxlX2l0ZXJhdG9yID0KKyAgICAgIGRlZnVzZWNoYWluX2luc3RyX2l0ZXJhdG9yPGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlPjsKKyAgZGVmX2J1bmRsZV9pdGVyYXRvciBkZWZfYnVuZGxlX2JlZ2luKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIGRlZl9idW5kbGVfaXRlcmF0b3IoZ2V0UmVnVXNlRGVmTGlzdEhlYWQoUmVnTm8pKTsKKyAgfQorICBzdGF0aWMgZGVmX2J1bmRsZV9pdGVyYXRvciBkZWZfYnVuZGxlX2VuZCgpIHsKKyAgICByZXR1cm4gZGVmX2J1bmRsZV9pdGVyYXRvcihudWxscHRyKTsKKyAgfQorCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTxkZWZfYnVuZGxlX2l0ZXJhdG9yPiBkZWZfYnVuZGxlcyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShkZWZfYnVuZGxlX2JlZ2luKFJlZyksIGRlZl9idW5kbGVfZW5kKCkpOworICB9CisKKyAgLy8vIGRlZl9lbXB0eSAtIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBubyBpbnN0cnVjdGlvbnMgZGVmaW5pbmcgdGhlCisgIC8vLyBzcGVjaWZpZWQgcmVnaXN0ZXIgKGl0IG1heSBiZSBsaXZlLWluKS4KKyAgYm9vbCBkZWZfZW1wdHkodW5zaWduZWQgUmVnTm8pIGNvbnN0IHsgcmV0dXJuIGRlZl9iZWdpbihSZWdObykgPT0gZGVmX2VuZCgpOyB9CisKKyAgU3RyaW5nUmVmIGdldFZSZWdOYW1lKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBWUmVnMk5hbWUuaW5Cb3VuZHMoUmVnKSA/IFN0cmluZ1JlZihWUmVnMk5hbWVbUmVnXSkgOiAiIjsKKyAgfQorCisgIHZvaWQgaW5zZXJ0VlJlZ0J5TmFtZShTdHJpbmdSZWYgTmFtZSwgdW5zaWduZWQgUmVnKSB7CisgICAgYXNzZXJ0KChOYW1lLmVtcHR5KCkgfHwgVlJlZ05hbWVzLmZpbmQoTmFtZSkgPT0gVlJlZ05hbWVzLmVuZCgpKSAmJgorICAgICAgICAgICAiTmFtZWQgVlJlZ3MgTXVzdCBiZSBVbmlxdWUuIik7CisgICAgaWYgKCFOYW1lLmVtcHR5KCkpIHsKKyAgICAgIFZSZWdOYW1lcy5pbnNlcnQoTmFtZSk7CisgICAgICBWUmVnMk5hbWUuZ3JvdyhSZWcpOworICAgICAgVlJlZzJOYW1lW1JlZ10gPSBOYW1lLnN0cigpOworICAgIH0KKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBleGFjdGx5IG9uZSBvcGVyYW5kIGRlZmluaW5nIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHJlZ2lzdGVyLgorICBib29sIGhhc09uZURlZih1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIGRlZl9pdGVyYXRvciBESSA9IGRlZl9iZWdpbihSZWdObyk7CisgICAgaWYgKERJID09IGRlZl9lbmQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gKytESSA9PSBkZWZfZW5kKCk7CisgIH0KKworICAvLy8gdXNlX2l0ZXJhdG9yL3VzZV9iZWdpbi91c2VfZW5kIC0gV2FsayBhbGwgdXNlcyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLgorICB1c2luZyB1c2VfaXRlcmF0b3IgPQorICAgICAgZGVmdXNlY2hhaW5faXRlcmF0b3I8dHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2U+OworICB1c2VfaXRlcmF0b3IgdXNlX2JlZ2luKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIHVzZV9pdGVyYXRvcihnZXRSZWdVc2VEZWZMaXN0SGVhZChSZWdObykpOworICB9CisgIHN0YXRpYyB1c2VfaXRlcmF0b3IgdXNlX2VuZCgpIHsgcmV0dXJuIHVzZV9pdGVyYXRvcihudWxscHRyKTsgfQorCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTx1c2VfaXRlcmF0b3I+IHVzZV9vcGVyYW5kcyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZSh1c2VfYmVnaW4oUmVnKSwgdXNlX2VuZCgpKTsKKyAgfQorCisgIC8vLyB1c2VfaW5zdHJfaXRlcmF0b3IvdXNlX2luc3RyX2JlZ2luL3VzZV9pbnN0cl9lbmQgLSBXYWxrIGFsbCB1c2VzIG9mIHRoZQorICAvLy8gc3BlY2lmaWVkIHJlZ2lzdGVyLCBzdGVwcGluZyBieSBNYWNoaW5lSW5zdHIuCisgIHVzaW5nIHVzZV9pbnN0cl9pdGVyYXRvciA9CisgICAgICBkZWZ1c2VjaGFpbl9pbnN0cl9pdGVyYXRvcjx0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZT47CisgIHVzZV9pbnN0cl9pdGVyYXRvciB1c2VfaW5zdHJfYmVnaW4odW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gdXNlX2luc3RyX2l0ZXJhdG9yKGdldFJlZ1VzZURlZkxpc3RIZWFkKFJlZ05vKSk7CisgIH0KKyAgc3RhdGljIHVzZV9pbnN0cl9pdGVyYXRvciB1c2VfaW5zdHJfZW5kKCkgeworICAgIHJldHVybiB1c2VfaW5zdHJfaXRlcmF0b3IobnVsbHB0cik7CisgIH0KKworICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8dXNlX2luc3RyX2l0ZXJhdG9yPgorICB1c2VfaW5zdHJ1Y3Rpb25zKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHVzZV9pbnN0cl9iZWdpbihSZWcpLCB1c2VfaW5zdHJfZW5kKCkpOworICB9CisKKyAgLy8vIHVzZV9idW5kbGVfaXRlcmF0b3IvdXNlX2J1bmRsZV9iZWdpbi91c2VfYnVuZGxlX2VuZCAtIFdhbGsgYWxsIHVzZXMgb2YgdGhlCisgIC8vLyBzcGVjaWZpZWQgcmVnaXN0ZXIsIHN0ZXBwaW5nIGJ5IGJ1bmRsZS4KKyAgdXNpbmcgdXNlX2J1bmRsZV9pdGVyYXRvciA9CisgICAgICBkZWZ1c2VjaGFpbl9pbnN0cl9pdGVyYXRvcjx0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZT47CisgIHVzZV9idW5kbGVfaXRlcmF0b3IgdXNlX2J1bmRsZV9iZWdpbih1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiB1c2VfYnVuZGxlX2l0ZXJhdG9yKGdldFJlZ1VzZURlZkxpc3RIZWFkKFJlZ05vKSk7CisgIH0KKyAgc3RhdGljIHVzZV9idW5kbGVfaXRlcmF0b3IgdXNlX2J1bmRsZV9lbmQoKSB7CisgICAgcmV0dXJuIHVzZV9idW5kbGVfaXRlcmF0b3IobnVsbHB0cik7CisgIH0KKworICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8dXNlX2J1bmRsZV9pdGVyYXRvcj4gdXNlX2J1bmRsZXModW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UodXNlX2J1bmRsZV9iZWdpbihSZWcpLCB1c2VfYnVuZGxlX2VuZCgpKTsKKyAgfQorCisgIC8vLyB1c2VfZW1wdHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gaW5zdHJ1Y3Rpb25zIHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHJlZ2lzdGVyLgorICBib29sIHVzZV9lbXB0eSh1bnNpZ25lZCBSZWdObykgY29uc3QgeyByZXR1cm4gdXNlX2JlZ2luKFJlZ05vKSA9PSB1c2VfZW5kKCk7IH0KKworICAvLy8gaGFzT25lVXNlIC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgZXhhY3RseSBvbmUgaW5zdHJ1Y3Rpb24gdXNpbmcgdGhlCisgIC8vLyBzcGVjaWZpZWQgcmVnaXN0ZXIuCisgIGJvb2wgaGFzT25lVXNlKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgdXNlX2l0ZXJhdG9yIFVJID0gdXNlX2JlZ2luKFJlZ05vKTsKKyAgICBpZiAoVUkgPT0gdXNlX2VuZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiArK1VJID09IHVzZV9lbmQoKTsKKyAgfQorCisgIC8vLyB1c2Vfbm9kYmdfaXRlcmF0b3IvdXNlX25vZGJnX2JlZ2luL3VzZV9ub2RiZ19lbmQgLSBXYWxrIGFsbCB1c2VzIG9mIHRoZQorICAvLy8gc3BlY2lmaWVkIHJlZ2lzdGVyLCBza2lwcGluZyB0aG9zZSBtYXJrZWQgYXMgRGVidWcuCisgIHVzaW5nIHVzZV9ub2RiZ19pdGVyYXRvciA9CisgICAgICBkZWZ1c2VjaGFpbl9pdGVyYXRvcjx0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlPjsKKyAgdXNlX25vZGJnX2l0ZXJhdG9yIHVzZV9ub2RiZ19iZWdpbih1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiB1c2Vfbm9kYmdfaXRlcmF0b3IoZ2V0UmVnVXNlRGVmTGlzdEhlYWQoUmVnTm8pKTsKKyAgfQorICBzdGF0aWMgdXNlX25vZGJnX2l0ZXJhdG9yIHVzZV9ub2RiZ19lbmQoKSB7CisgICAgcmV0dXJuIHVzZV9ub2RiZ19pdGVyYXRvcihudWxscHRyKTsKKyAgfQorCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTx1c2Vfbm9kYmdfaXRlcmF0b3I+CisgIHVzZV9ub2RiZ19vcGVyYW5kcyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZSh1c2Vfbm9kYmdfYmVnaW4oUmVnKSwgdXNlX25vZGJnX2VuZCgpKTsKKyAgfQorCisgIC8vLyB1c2VfaW5zdHJfbm9kYmdfaXRlcmF0b3IvdXNlX2luc3RyX25vZGJnX2JlZ2luL3VzZV9pbnN0cl9ub2RiZ19lbmQgLSBXYWxrCisgIC8vLyBhbGwgdXNlcyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLCBzdGVwcGluZyBieSBNYWNoaW5lSW5zdHIsIHNraXBwaW5nCisgIC8vLyB0aG9zZSBtYXJrZWQgYXMgRGVidWcuCisgIHVzaW5nIHVzZV9pbnN0cl9ub2RiZ19pdGVyYXRvciA9CisgICAgICBkZWZ1c2VjaGFpbl9pbnN0cl9pdGVyYXRvcjx0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlPjsKKyAgdXNlX2luc3RyX25vZGJnX2l0ZXJhdG9yIHVzZV9pbnN0cl9ub2RiZ19iZWdpbih1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiB1c2VfaW5zdHJfbm9kYmdfaXRlcmF0b3IoZ2V0UmVnVXNlRGVmTGlzdEhlYWQoUmVnTm8pKTsKKyAgfQorICBzdGF0aWMgdXNlX2luc3RyX25vZGJnX2l0ZXJhdG9yIHVzZV9pbnN0cl9ub2RiZ19lbmQoKSB7CisgICAgcmV0dXJuIHVzZV9pbnN0cl9ub2RiZ19pdGVyYXRvcihudWxscHRyKTsKKyAgfQorCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTx1c2VfaW5zdHJfbm9kYmdfaXRlcmF0b3I+CisgIHVzZV9ub2RiZ19pbnN0cnVjdGlvbnModW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UodXNlX2luc3RyX25vZGJnX2JlZ2luKFJlZyksIHVzZV9pbnN0cl9ub2RiZ19lbmQoKSk7CisgIH0KKworICAvLy8gdXNlX2J1bmRsZV9ub2RiZ19pdGVyYXRvci91c2VfYnVuZGxlX25vZGJnX2JlZ2luL3VzZV9idW5kbGVfbm9kYmdfZW5kIC0gV2FsaworICAvLy8gYWxsIHVzZXMgb2YgdGhlIHNwZWNpZmllZCByZWdpc3Rlciwgc3RlcHBpbmcgYnkgYnVuZGxlLCBza2lwcGluZworICAvLy8gdGhvc2UgbWFya2VkIGFzIERlYnVnLgorICB1c2luZyB1c2VfYnVuZGxlX25vZGJnX2l0ZXJhdG9yID0KKyAgICAgIGRlZnVzZWNoYWluX2luc3RyX2l0ZXJhdG9yPHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWU+OworICB1c2VfYnVuZGxlX25vZGJnX2l0ZXJhdG9yIHVzZV9idW5kbGVfbm9kYmdfYmVnaW4odW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gdXNlX2J1bmRsZV9ub2RiZ19pdGVyYXRvcihnZXRSZWdVc2VEZWZMaXN0SGVhZChSZWdObykpOworICB9CisgIHN0YXRpYyB1c2VfYnVuZGxlX25vZGJnX2l0ZXJhdG9yIHVzZV9idW5kbGVfbm9kYmdfZW5kKCkgeworICAgIHJldHVybiB1c2VfYnVuZGxlX25vZGJnX2l0ZXJhdG9yKG51bGxwdHIpOworICB9CisKKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPHVzZV9idW5kbGVfbm9kYmdfaXRlcmF0b3I+CisgIHVzZV9ub2RiZ19idW5kbGVzKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHVzZV9idW5kbGVfbm9kYmdfYmVnaW4oUmVnKSwgdXNlX2J1bmRsZV9ub2RiZ19lbmQoKSk7CisgIH0KKworICAvLy8gdXNlX25vZGJnX2VtcHR5IC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG5vIG5vbi1EZWJ1ZyBpbnN0cnVjdGlvbnMKKyAgLy8vIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIuCisgIGJvb2wgdXNlX25vZGJnX2VtcHR5KHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIHVzZV9ub2RiZ19iZWdpbihSZWdObykgPT0gdXNlX25vZGJnX2VuZCgpOworICB9CisKKyAgLy8vIGhhc09uZU5vbkRCR1VzZSAtIFJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGV4YWN0bHkgb25lIG5vbi1EZWJ1ZworICAvLy8gaW5zdHJ1Y3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCByZWdpc3Rlci4KKyAgYm9vbCBoYXNPbmVOb25EQkdVc2UodW5zaWduZWQgUmVnTm8pIGNvbnN0OworCisgIC8vLyByZXBsYWNlUmVnV2l0aCAtIFJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiBGcm9tUmVnIHdpdGggVG9SZWcgaW4gdGhlCisgIC8vLyBtYWNoaW5lIGZ1bmN0aW9uLiAgVGhpcyBpcyBsaWtlIGxsdm0tbGV2ZWwgWC0+cmVwbGFjZUFsbFVzZXNXaXRoKFkpLAorICAvLy8gZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGFuZ2VzIGFueSBkZWZpbml0aW9ucyBvZiB0aGUgcmVnaXN0ZXIgYXMgd2VsbC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgaXQgaXMgdXN1YWxseSBuZWNlc3NhcnkgdG8gZmlyc3QgY29uc3RyYWluIFRvUmVnJ3MgcmVnaXN0ZXIKKyAgLy8vIGNsYXNzIGFuZCByZWdpc3RlciBiYW5rIHRvIG1hdGNoIHRoZSBGcm9tUmVnIGNvbnN0cmFpbnRzIHVzaW5nIG9uZSBvZiB0aGUKKyAgLy8vIG1ldGhvZHM6CisgIC8vLworICAvLy8gICBjb25zdHJhaW5SZWdDbGFzcyhUb1JlZywgZ2V0UmVnQ2xhc3MoRnJvbVJlZykpCisgIC8vLyAgIGNvbnN0cmFpblJlZ0F0dHJzKFRvUmVnLCBGcm9tUmVnKQorICAvLy8gICBSZWdpc3RlckJhbmtJbmZvOjpjb25zdHJhaW5HZW5lcmljUmVnaXN0ZXIoVG9SZWcsCisgIC8vLyAgICAgICAqTVJJLmdldFJlZ0NsYXNzKEZyb21SZWcpLCBNUkkpCisgIC8vLworICAvLy8gVGhlc2UgZnVuY3Rpb25zIHdpbGwgcmV0dXJuIGEgZmFsc3kgcmVzdWx0IGlmIHRoZSB2aXJ0dWFsIHJlZ2lzdGVycyBoYXZlCisgIC8vLyBpbmNvbXBhdGlibGUgY29uc3RyYWludHMuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IGlmIFRvUmVnIGlzIGEgcGh5c2ljYWwgcmVnaXN0ZXIgdGhlIGZ1bmN0aW9uIHdpbGwgcmVwbGFjZSBhbmQKKyAgLy8vIGFwcGx5IHN1YiByZWdpc3RlcnMgdG8gVG9SZWcgaW4gb3JkZXIgdG8gb2J0YWluIGEgZmluYWwvcHJvcGVyIHBoeXNpY2FsCisgIC8vLyByZWdpc3Rlci4KKyAgdm9pZCByZXBsYWNlUmVnV2l0aCh1bnNpZ25lZCBGcm9tUmVnLCB1bnNpZ25lZCBUb1JlZyk7CisKKyAgLy8vIGdldFZSZWdEZWYgLSBSZXR1cm4gdGhlIG1hY2hpbmUgaW5zdHIgdGhhdCBkZWZpbmVzIHRoZSBzcGVjaWZpZWQgdmlydHVhbAorICAvLy8gcmVnaXN0ZXIgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kLiAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGNvZGUgaXMgaW4gU1NBCisgIC8vLyBmb3JtLCBzbyB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgZGVmaW5pdGlvbi4KKyAgTWFjaGluZUluc3RyICpnZXRWUmVnRGVmKHVuc2lnbmVkIFJlZykgY29uc3Q7CisKKyAgLy8vIGdldFVuaXF1ZVZSZWdEZWYgLSBSZXR1cm4gdGhlIHVuaXF1ZSBtYWNoaW5lIGluc3RyIHRoYXQgZGVmaW5lcyB0aGUKKyAgLy8vIHNwZWNpZmllZCB2aXJ0dWFsIHJlZ2lzdGVyIG9yIG51bGwgaWYgbm9uZSBpcyBmb3VuZC4gIElmIHRoZXJlIGFyZQorICAvLy8gbXVsdGlwbGUgZGVmaW5pdGlvbnMgb3Igbm8gZGVmaW5pdGlvbiwgcmV0dXJuIG51bGwuCisgIE1hY2hpbmVJbnN0ciAqZ2V0VW5pcXVlVlJlZ0RlZih1bnNpZ25lZCBSZWcpIGNvbnN0OworCisgIC8vLyBjbGVhcktpbGxGbGFncyAtIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHVzZXMgb2YgdGhlIGdpdmVuIHJlZ2lzdGVyIGFuZAorICAvLy8gY2xlYXIgdGhlIGtpbGwgZmxhZyBmcm9tIHRoZSBNYWNoaW5lT3BlcmFuZC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5CisgIC8vLyBvcHRpbWl6YXRpb24gcGFzc2VzIHdoaWNoIGV4dGVuZCByZWdpc3RlciBsaWZldGltZXMgYW5kIG5lZWQgb25seQorICAvLy8gcHJlc2VydmUgY29uc2VydmF0aXZlIGtpbGwgZmxhZyBpbmZvcm1hdGlvbi4KKyAgdm9pZCBjbGVhcktpbGxGbGFncyh1bnNpZ25lZCBSZWcpIGNvbnN0OworCisgIHZvaWQgZHVtcFVzZXModW5zaWduZWQgUmVnTm8pIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgUGh5c1JlZyBpcyB1bmFsbG9jYXRhYmxlIGFuZCBjb25zdGFudCB0aHJvdWdob3V0IHRoZQorICAvLy8gZnVuY3Rpb24uIFdyaXRpbmcgdG8gYSBjb25zdGFudCByZWdpc3RlciBoYXMgbm8gZWZmZWN0LgorICBib29sIGlzQ29uc3RhbnRQaHlzUmVnKHVuc2lnbmVkIFBoeXNSZWcpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgZWl0aGVyIGlzQ29uc3RhbnRQaHlzUmVnIG9yIFRSSS0+aXNDYWxsZXJQcmVzZXJ2ZWRQaHlzUmVnCisgIC8vLyByZXR1cm5zIHRydWUuIFRoaXMgaXMgYSB1dGlsaXR5IG1lbWJlciBmdW5jdGlvbi4KKyAgYm9vbCBpc0NhbGxlclByZXNlcnZlZE9yQ29uc3RQaHlzUmVnKHVuc2lnbmVkIFBoeXNSZWcpIGNvbnN0OworCisgIC8vLyBHZXQgYW4gaXRlcmF0b3Igb3ZlciB0aGUgcHJlc3N1cmUgc2V0cyBhZmZlY3RlZCBieSB0aGUgZ2l2ZW4gcGh5c2ljYWwgb3IKKyAgLy8vIHZpcnR1YWwgcmVnaXN0ZXIuIElmIFJlZ1VuaXQgaXMgcGh5c2ljYWwsIGl0IG11c3QgYmUgYSByZWdpc3RlciB1bml0IChmcm9tCisgIC8vLyBNQ1JlZ1VuaXRJdGVyYXRvcikuCisgIFBTZXRJdGVyYXRvciBnZXRQcmVzc3VyZVNldHModW5zaWduZWQgUmVnVW5pdCkgY29uc3Q7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFZpcnR1YWwgUmVnaXN0ZXIgSW5mbworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gUmV0dXJuIHRoZSByZWdpc3RlciBjbGFzcyBvZiB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIuCisgIC8vLyBUaGlzIHNob3VsZG4ndCBiZSB1c2VkIGRpcmVjdGx5IHVubGVzcyBccCBSZWcgaGFzIGEgcmVnaXN0ZXIgY2xhc3MuCisgIC8vLyBcc2VlIGdldFJlZ0NsYXNzT3JOdWxsIHdoZW4gdGhpcyBtaWdodCBoYXBwZW4uCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKmdldFJlZ0NsYXNzKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIGFzc2VydChWUmVnSW5mb1tSZWddLmZpcnN0LmlzPGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKj4oKSAmJgorICAgICAgICAgICAiUmVnaXN0ZXIgY2xhc3Mgbm90IHNldCwgd3JvbmcgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gVlJlZ0luZm9bUmVnXS5maXJzdC5nZXQ8Y29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqPigpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgcmVnaXN0ZXIgY2xhc3Mgb2YgXHAgUmVnLCBvciBudWxsIGlmIFJlZyBoYXMgbm90IGJlZW4gYXNzaWduZWQKKyAgLy8vIGEgcmVnaXN0ZXIgY2xhc3MgeWV0LgorICAvLy8KKyAgLy8vIFxub3RlIEEgbnVsbCByZWdpc3RlciBjbGFzcyBjYW4gb25seSBoYXBwZW4gd2hlbiB0aGVzZSB0d28KKyAgLy8vIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgLy8vIDEuIEdlbmVyaWMgdmlydHVhbCByZWdpc3RlcnMgYXJlIGNyZWF0ZWQuCisgIC8vLyAyLiBUaGUgbWFjaGluZSBmdW5jdGlvbiBoYXMgbm90IGNvbXBsZXRlbHkgYmVlbiB0aHJvdWdoIHRoZQorICAvLy8gICAgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHByb2Nlc3MuCisgIC8vLyBOb25lIG9mIHRoaXMgY29uZGl0aW9uIGlzIHBvc3NpYmxlIHdpdGhvdXQgR2xvYmFsSVNlbCBmb3Igbm93LgorICAvLy8gSW4gb3RoZXIgd29yZHMsIGlmIEdsb2JhbElTZWwgaXMgbm90IHVzZWQgb3IgaWYgdGhlIHF1ZXJ5IGhhcHBlbnMgYWZ0ZXIKKyAgLy8vIHRoZSBzZWxlY3QgcGFzcywgdXNpbmcgZ2V0UmVnQ2xhc3MgaXMgc2FmZS4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqZ2V0UmVnQ2xhc3NPck51bGwodW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgY29uc3QgUmVnQ2xhc3NPclJlZ0JhbmsgJlZhbCA9IFZSZWdJbmZvW1JlZ10uZmlyc3Q7CisgICAgcmV0dXJuIFZhbC5keW5fY2FzdDxjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICo+KCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSByZWdpc3RlciBiYW5rIG9mIFxwIFJlZywgb3IgbnVsbCBpZiBSZWcgaGFzIG5vdCBiZWVuIGFzc2lnbmVkCisgIC8vLyBhIHJlZ2lzdGVyIGJhbmsgb3IgaGFzIGJlZW4gYXNzaWduZWQgYSByZWdpc3RlciBjbGFzcy4KKyAgLy8vIFxub3RlIEl0IGlzIHBvc3NpYmxlIHRvIGdldCB0aGUgcmVnaXN0ZXIgYmFuayBmcm9tIHRoZSByZWdpc3RlciBjbGFzcyB2aWEKKyAgLy8vIFJlZ2lzdGVyQmFua0luZm86OmdldFJlZ0JhbmtGcm9tUmVnQ2xhc3MuCisgIGNvbnN0IFJlZ2lzdGVyQmFuayAqZ2V0UmVnQmFua09yTnVsbCh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICBjb25zdCBSZWdDbGFzc09yUmVnQmFuayAmVmFsID0gVlJlZ0luZm9bUmVnXS5maXJzdDsKKyAgICByZXR1cm4gVmFsLmR5bl9jYXN0PGNvbnN0IFJlZ2lzdGVyQmFuayAqPigpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgcmVnaXN0ZXIgYmFuayBvciByZWdpc3RlciBjbGFzcyBvZiBccCBSZWcuCisgIC8vLyBcbm90ZSBCZWZvcmUgdGhlIHJlZ2lzdGVyIGJhbmsgZ2V0cyBhc3NpZ25lZCAoaS5lLiwgYmVmb3JlIHRoZQorICAvLy8gUmVnQmFua1NlbGVjdCBwYXNzKSBccCBSZWcgbWF5IG5vdCBoYXZlIGVpdGhlci4KKyAgY29uc3QgUmVnQ2xhc3NPclJlZ0JhbmsgJmdldFJlZ0NsYXNzT3JSZWdCYW5rKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBWUmVnSW5mb1tSZWddLmZpcnN0OworICB9CisKKyAgLy8vIHNldFJlZ0NsYXNzIC0gU2V0IHRoZSByZWdpc3RlciBjbGFzcyBvZiB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIuCisgIHZvaWQgc2V0UmVnQ2xhc3ModW5zaWduZWQgUmVnLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyk7CisKKyAgLy8vIFNldCB0aGUgcmVnaXN0ZXIgYmFuayB0byBccCBSZWdCYW5rIGZvciBccCBSZWcuCisgIHZvaWQgc2V0UmVnQmFuayh1bnNpZ25lZCBSZWcsIGNvbnN0IFJlZ2lzdGVyQmFuayAmUmVnQmFuayk7CisKKyAgdm9pZCBzZXRSZWdDbGFzc09yUmVnQmFuayh1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnQ2xhc3NPclJlZ0JhbmsgJlJDT3JSQil7CisgICAgVlJlZ0luZm9bUmVnXS5maXJzdCA9IFJDT3JSQjsKKyAgfQorCisgIC8vLyBjb25zdHJhaW5SZWdDbGFzcyAtIENvbnN0cmFpbiB0aGUgcmVnaXN0ZXIgY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCB2aXJ0dWFsCisgIC8vLyByZWdpc3RlciB0byBiZSBhIGNvbW1vbiBzdWJjbGFzcyBvZiBSQyBhbmQgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgY2xhc3MsCisgIC8vLyBidXQgb25seSBpZiB0aGUgbmV3IGNsYXNzIGhhcyBhdCBsZWFzdCBNaW5OdW1SZWdzIHJlZ2lzdGVycy4gIFJldHVybiB0aGUKKyAgLy8vIG5ldyByZWdpc3RlciBjbGFzcywgb3IgTlVMTCBpZiBubyBzdWNoIGNsYXNzIGV4aXN0cy4KKyAgLy8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBjb25zdHJhaW50IGlzIGtub3duIHRvIGJlIHRyaXZpYWwsIGxpa2UKKyAgLy8vIEdSMzIgLT4gR1IzMl9OT1NQLiBCZXdhcmUgb2YgaW5jcmVhc2luZyByZWdpc3RlciBwcmVzc3VyZS4KKyAgLy8vCisgIC8vLyBcbm90ZSBBc3N1bWVzIHRoYXQgdGhlIHJlZ2lzdGVyIGhhcyBhIHJlZ2lzdGVyIGNsYXNzIGFzc2lnbmVkLgorICAvLy8gVXNlIFJlZ2lzdGVyQmFua0luZm86OmNvbnN0cmFpbkdlbmVyaWNSZWdpc3RlciBpbiBHbG9iYWxJU2VsJ3MKKyAgLy8vIEluc3RydWN0aW9uU2VsZWN0IHBhc3MgYW5kIGNvbnN0cmFpblJlZ0F0dHJzIGluIGV2ZXJ5IG90aGVyIHBhc3MsCisgIC8vLyBpbmNsdWRpbmcgbm9uLXNlbGVjdCBwYXNzZXMgb2YgR2xvYmFsSVNlbCwgaW5zdGVhZC4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqY29uc3RyYWluUmVnQ2xhc3ModW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWluTnVtUmVncyA9IDApOworCisgIC8vLyBDb25zdHJhaW4gdGhlIHJlZ2lzdGVyIGNsYXNzIG9yIHRoZSByZWdpc3RlciBiYW5rIG9mIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyCisgIC8vLyBccCBSZWcgdG8gYmUgYSBjb21tb24gc3ViY2xhc3MgYW5kIGEgY29tbW9uIGJhbmsgb2YgYm90aCByZWdpc3RlcnMKKyAgLy8vIHByb3ZpZGVkIHJlc3BlY3RpdmVseS4gRG8gbm90aGluZyBpZiBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMgKGNsYXNzZXMsCisgIC8vLyBiYW5rcywgb3IgbG93LWxldmVsIHR5cGVzKSBvZiB0aGUgcmVnaXN0ZXJzIGFyZSBkZWVtZWQgaW5jb21wYXRpYmxlLCBvciBpZgorICAvLy8gdGhlIHJlc3VsdGluZyByZWdpc3RlciB3aWxsIGhhdmUgYSBjbGFzcyBzbWFsbGVyIHRoYW4gYmVmb3JlIGFuZCBvZiBzaXplCisgIC8vLyBsZXNzIHRoYW4gXHAgTWluTnVtUmVncy4gUmV0dXJuIHRydWUgaWYgc3VjaCByZWdpc3RlciBhdHRyaWJ1dGVzIGV4aXN0LAorICAvLy8gZmFsc2Ugb3RoZXJ3aXNlLgorICAvLy8KKyAgLy8vIFxub3RlIEFzc3VtZXMgdGhhdCBlYWNoIHJlZ2lzdGVyIGhhcyBlaXRoZXIgYSBsb3ctbGV2ZWwgdHlwZSBvciBhIGNsYXNzCisgIC8vLyBhc3NpZ25lZCwgYnV0IG5vdCBib3RoLiBVc2UgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiBjb25zdHJhaW5SZWdDbGFzcyBhbmQKKyAgLy8vIFJlZ2lzdGVyQmFua0luZm86OmNvbnN0cmFpbkdlbmVyaWNSZWdpc3RlciBldmVyeXdoZXJlIGJ1dCBTZWxlY3Rpb25EQUcKKyAgLy8vIElTZWwgLyBGYXN0SVNlbCBhbmQgR2xvYmFsSVNlbCdzIEluc3RydWN0aW9uU2VsZWN0IHBhc3MgcmVzcGVjdGl2ZWx5LgorICBib29sIGNvbnN0cmFpblJlZ0F0dHJzKHVuc2lnbmVkIFJlZywgdW5zaWduZWQgQ29uc3RyYWluaW5nUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1pbk51bVJlZ3MgPSAwKTsKKworICAvLy8gcmVjb21wdXRlUmVnQ2xhc3MgLSBUcnkgdG8gZmluZCBhIGxlZ2FsIHN1cGVyLWNsYXNzIG9mIFJlZydzIHJlZ2lzdGVyCisgIC8vLyBjbGFzcyB0aGF0IHN0aWxsIHNhdGlzZmllcyB0aGUgY29uc3RyYWludHMgZnJvbSB0aGUgaW5zdHJ1Y3Rpb25zIHVzaW5nCisgIC8vLyBSZWcuICBSZXR1cm5zIHRydWUgaWYgUmVnIHdhcyB1cGdyYWRlZC4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBhZnRlciBjb25zdHJhaW50cyBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIGEKKyAgLy8vIHZpcnR1YWwgcmVnaXN0ZXIsIGZvciBleGFtcGxlIGFmdGVyIHJlbW92aW5nIGluc3RydWN0aW9ucyBvciBzcGxpdHRpbmcKKyAgLy8vIHRoZSBsaXZlIHJhbmdlLgorICBib29sIHJlY29tcHV0ZVJlZ0NsYXNzKHVuc2lnbmVkIFJlZyk7CisKKyAgLy8vIGNyZWF0ZVZpcnR1YWxSZWdpc3RlciAtIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IHZpcnR1YWwgcmVnaXN0ZXIgaW4gdGhlCisgIC8vLyBmdW5jdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgY2xhc3MuCisgIHVuc2lnbmVkIGNyZWF0ZVZpcnR1YWxSZWdpc3Rlcihjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSZWdDbGFzcyk7CisKKyAgLy8vIEFjY2Vzc29yIGZvciBWUmVnVG9UeXBlLiBUaGlzIGFjY2Vzc29yIHNob3VsZCBvbmx5IGJlIHVzZWQKKyAgLy8vIGJ5IGdsb2JhbC1pc2VsIHJlbGF0ZWQgd29yay4KKyAgVlJlZ1RvVHlwZU1hcCAmZ2V0VlJlZ1RvVHlwZSgpIGNvbnN0IHsKKyAgICBpZiAoIVZSZWdUb1R5cGUpCisgICAgICBWUmVnVG9UeXBlLnJlc2V0KG5ldyBWUmVnVG9UeXBlTWFwKTsKKyAgICByZXR1cm4gKlZSZWdUb1R5cGUuZ2V0KCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBsb3ctbGV2ZWwgdHlwZSBvZiBccCBWUmVnIG9yIExMVHt9IGlmIFZSZWcgaXMgbm90IGEgZ2VuZXJpYworICAvLy8gKHRhcmdldCBpbmRlcGVuZGVudCkgdmlydHVhbCByZWdpc3Rlci4KKyAgTExUIGdldFR5cGUodW5zaWduZWQgVlJlZykgY29uc3Q7CisKKyAgLy8vIFNldCB0aGUgbG93LWxldmVsIHR5cGUgb2YgXHAgVlJlZyB0byBccCBUeS4KKyAgdm9pZCBzZXRUeXBlKHVuc2lnbmVkIFZSZWcsIExMVCBUeSk7CisKKyAgLy8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIGxvdy1sZXZlbAorICAvLy8gdHlwZSBccCBUeS4KKyAgdW5zaWduZWQgY3JlYXRlR2VuZXJpY1ZpcnR1YWxSZWdpc3RlcihMTFQgVHkpOworCisgIC8vLyBSZW1vdmUgYWxsIHR5cGVzIGFzc29jaWF0ZWQgdG8gdmlydHVhbCByZWdpc3RlcnMgKGFmdGVyIGluc3RydWN0aW9uCisgIC8vLyBzZWxlY3Rpb24gYW5kIGNvbnN0cmFpbmluZyBvZiBhbGwgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVycykuCisgIHZvaWQgY2xlYXJWaXJ0UmVnVHlwZXMoKTsKKworICAvLy8gQ3JlYXRlcyBhIG5ldyB2aXJ0dWFsIHJlZ2lzdGVyIHRoYXQgaGFzIG5vIHJlZ2lzdGVyIGNsYXNzLCByZWdpc3RlciBiYW5rCisgIC8vLyBvciBzaXplIGFzc2lnbmVkIHlldC4gVGhpcyBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgdXNlZAorICAvLy8gdGVtcG9yYXJpbHkgd2hpbGUgY29uc3RydWN0aW5nIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLiBNb3N0IG9wZXJhdGlvbnMgYXJlCisgIC8vLyB1bmRlZmluZWQgb24gYW4gaW5jb21wbGV0ZSByZWdpc3RlciB1bnRpbCBvbmUgb2Ygc2V0UmVnQ2xhc3MoKSwKKyAgLy8vIHNldFJlZ0JhbmsoKSBvciBzZXRTaXplKCkgaGFzIGJlZW4gY2FsbGVkIG9uIGl0LgorICB1bnNpZ25lZCBjcmVhdGVJbmNvbXBsZXRlVmlydHVhbFJlZ2lzdGVyKFN0cmluZ1JlZiBOYW1lID0gIiIpOworCisgIC8vLyBnZXROdW1WaXJ0UmVncyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIHZpcnR1YWwgcmVnaXN0ZXJzIGNyZWF0ZWQuCisgIHVuc2lnbmVkIGdldE51bVZpcnRSZWdzKCkgY29uc3QgeyByZXR1cm4gVlJlZ0luZm8uc2l6ZSgpOyB9CisKKyAgLy8vIGNsZWFyVmlydFJlZ3MgLSBSZW1vdmUgYWxsIHZpcnR1YWwgcmVnaXN0ZXJzIChhZnRlciBwaHlzcmVnIGFzc2lnbm1lbnQpLgorICB2b2lkIGNsZWFyVmlydFJlZ3MoKTsKKworICAvLy8gc2V0UmVnQWxsb2NhdGlvbkhpbnQgLSBTcGVjaWZ5IGEgcmVnaXN0ZXIgYWxsb2NhdGlvbiBoaW50IGZvciB0aGUKKyAgLy8vIHNwZWNpZmllZCB2aXJ0dWFsIHJlZ2lzdGVyLiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGJ5IHRhcmdldCwgYW5kIGluIGNhc2UKKyAgLy8vIG9mIGFuIGVhcmxpZXIgaGludCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuLgorICB2b2lkIHNldFJlZ0FsbG9jYXRpb25IaW50KHVuc2lnbmVkIFZSZWcsIHVuc2lnbmVkIFR5cGUsIHVuc2lnbmVkIFByZWZSZWcpIHsKKyAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihWUmVnKSk7CisgICAgUmVnQWxsb2NIaW50c1tWUmVnXS5maXJzdCAgPSBUeXBlOworICAgIFJlZ0FsbG9jSGludHNbVlJlZ10uc2Vjb25kLmNsZWFyKCk7CisgICAgUmVnQWxsb2NIaW50c1tWUmVnXS5zZWNvbmQucHVzaF9iYWNrKFByZWZSZWcpOworICB9CisKKyAgLy8vIGFkZFJlZ0FsbG9jYXRpb25IaW50IC0gQWRkIGEgcmVnaXN0ZXIgYWxsb2NhdGlvbiBoaW50IHRvIHRoZSBoaW50cworICAvLy8gdmVjdG9yIGZvciBWUmVnLgorICB2b2lkIGFkZFJlZ0FsbG9jYXRpb25IaW50KHVuc2lnbmVkIFZSZWcsIHVuc2lnbmVkIFByZWZSZWcpIHsKKyAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihWUmVnKSk7CisgICAgUmVnQWxsb2NIaW50c1tWUmVnXS5zZWNvbmQucHVzaF9iYWNrKFByZWZSZWcpOworICB9CisKKyAgLy8vIFNwZWNpZnkgdGhlIHByZWZlcnJlZCAodGFyZ2V0IGluZGVwZW5kZW50KSByZWdpc3RlciBhbGxvY2F0aW9uIGhpbnQgZm9yCisgIC8vLyB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIuCisgIHZvaWQgc2V0U2ltcGxlSGludCh1bnNpZ25lZCBWUmVnLCB1bnNpZ25lZCBQcmVmUmVnKSB7CisgICAgc2V0UmVnQWxsb2NhdGlvbkhpbnQoVlJlZywgLypUeXBlPSovMCwgUHJlZlJlZyk7CisgIH0KKworICB2b2lkIGNsZWFyU2ltcGxlSGludCh1bnNpZ25lZCBWUmVnKSB7CisgICAgYXNzZXJ0IChSZWdBbGxvY0hpbnRzW1ZSZWddLmZpcnN0ID09IDAgJiYKKyAgICAgICAgICAgICJFeHBlY3RlZCB0byBjbGVhciBhIG5vbi10YXJnZXQgaGludCEiKTsKKyAgICBSZWdBbGxvY0hpbnRzW1ZSZWddLnNlY29uZC5jbGVhcigpOworICB9CisKKyAgLy8vIGdldFJlZ0FsbG9jYXRpb25IaW50IC0gUmV0dXJuIHRoZSByZWdpc3RlciBhbGxvY2F0aW9uIGhpbnQgZm9yIHRoZQorICAvLy8gc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIuIElmIHRoZXJlIGFyZSBtYW55IGhpbnRzLCB0aGlzIHJldHVybnMgdGhlCisgIC8vLyBvbmUgd2l0aCB0aGUgZ3JlYXRlc3Qgd2VpZ2h0LgorICBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPgorICBnZXRSZWdBbGxvY2F0aW9uSGludCh1bnNpZ25lZCBWUmVnKSBjb25zdCB7CisgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoVlJlZykpOworICAgIHVuc2lnbmVkIEJlc3RIaW50ID0gKFJlZ0FsbG9jSGludHNbVlJlZ10uc2Vjb25kLnNpemUoKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgUmVnQWxsb2NIaW50c1tWUmVnXS5zZWNvbmRbMF0gOiAwKTsKKyAgICByZXR1cm4gc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4oUmVnQWxsb2NIaW50c1tWUmVnXS5maXJzdCwgQmVzdEhpbnQpOworICB9CisKKyAgLy8vIGdldFNpbXBsZUhpbnQgLSBzYW1lIGFzIGdldFJlZ0FsbG9jYXRpb25IaW50IGV4Y2VwdCBpdCB3aWxsIG9ubHkgcmV0dXJuCisgIC8vLyBhIHRhcmdldCBpbmRlcGVuZGVudCBoaW50LgorICB1bnNpZ25lZCBnZXRTaW1wbGVIaW50KHVuc2lnbmVkIFZSZWcpIGNvbnN0IHsKKyAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihWUmVnKSk7CisgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gSGludCA9IGdldFJlZ0FsbG9jYXRpb25IaW50KFZSZWcpOworICAgIHJldHVybiBIaW50LmZpcnN0ID8gMCA6IEhpbnQuc2Vjb25kOworICB9CisKKyAgLy8vIGdldFJlZ0FsbG9jYXRpb25IaW50cyAtIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgdmVjdG9yIG9mIGFsbAorICAvLy8gcmVnaXN0ZXIgYWxsb2NhdGlvbiBoaW50cyBmb3IgVlJlZy4KKyAgY29uc3Qgc3RkOjpwYWlyPHVuc2lnbmVkLCBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4+CisgICZnZXRSZWdBbGxvY2F0aW9uSGludHModW5zaWduZWQgVlJlZykgY29uc3QgeworICAgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFZSZWcpKTsKKyAgICByZXR1cm4gUmVnQWxsb2NIaW50c1tWUmVnXTsKKyAgfQorCisgIC8vLyBtYXJrVXNlc0luRGVidWdWYWx1ZUFzVW5kZWYgLSBNYXJrIGV2ZXJ5IERCR19WQUxVRSByZWZlcmVuY2luZyB0aGUKKyAgLy8vIHNwZWNpZmllZCByZWdpc3RlciBhcyB1bmRlZmluZWQgd2hpY2ggY2F1c2VzIHRoZSBEQkdfVkFMVUUgdG8gYmUKKyAgLy8vIGRlbGV0ZWQgZHVyaW5nIExpdmVEZWJ1Z1ZhcmlhYmxlcyBhbmFseXNpcy4KKyAgdm9pZCBtYXJrVXNlc0luRGVidWdWYWx1ZUFzVW5kZWYodW5zaWduZWQgUmVnKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCByZWdpc3RlciBpcyBtb2RpZmllZCBpbiB0aGlzIGZ1bmN0aW9uLgorICAvLy8gVGhpcyBjaGVja3MgdGhhdCBubyBkZWZpbmluZyBtYWNoaW5lIG9wZXJhbmRzIGV4aXN0IGZvciB0aGUgcmVnaXN0ZXIgb3IKKyAgLy8vIGFueSBvZiBpdHMgYWxpYXNlcy4gRGVmaW5pdGlvbnMgZm91bmQgb24gZnVuY3Rpb25zIG1hcmtlZCBub3JldHVybiBhcmUKKyAgLy8vIGlnbm9yZWQsIHRvIGNvbnNpZGVyIHRoZW0gcGFzcyAndHJ1ZScgZm9yIG9wdGlvbmFsIHBhcmFtZXRlcgorICAvLy8gU2tpcE5vUmV0dXJuRGVmLiBUaGUgcmVnaXN0ZXIgaXMgYWxzbyBjb25zaWRlcmVkIG1vZGlmaWVkIHdoZW4gaXQgaXMgc2V0CisgIC8vLyBpbiB0aGUgVXNlZFBoeXNSZWdNYXNrLgorICBib29sIGlzUGh5c1JlZ01vZGlmaWVkKHVuc2lnbmVkIFBoeXNSZWcsIGJvb2wgU2tpcE5vUmV0dXJuRGVmID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGlzIG1vZGlmaWVkIG9yIHJlYWQgaW4gdGhpcworICAvLy8gZnVuY3Rpb24uIFRoaXMgY2hlY2tzIHRoYXQgbm8gbWFjaGluZSBvcGVyYW5kcyBleGlzdCBmb3IgdGhlIHJlZ2lzdGVyIG9yCisgIC8vLyBhbnkgb2YgaXRzIGFsaWFzZXMuIFRoZSByZWdpc3RlciBpcyBhbHNvIGNvbnNpZGVyZWQgdXNlZCB3aGVuIGl0IGlzIHNldAorICAvLy8gaW4gdGhlIFVzZWRQaHlzUmVnTWFzay4KKyAgYm9vbCBpc1BoeXNSZWdVc2VkKHVuc2lnbmVkIFBoeXNSZWcpIGNvbnN0OworCisgIC8vLyBhZGRQaHlzUmVnc1VzZWRGcm9tUmVnTWFzayAtIE1hcmsgYW55IHJlZ2lzdGVycyBub3QgaW4gUmVnTWFzayBhcyB1c2VkLgorICAvLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYml0IG1hc2sgYXR0YWNoZWQgdG8gcmVnaXN0ZXIgbWFzayBvcGVyYW5kcy4KKyAgdm9pZCBhZGRQaHlzUmVnc1VzZWRGcm9tUmVnTWFzayhjb25zdCB1aW50MzJfdCAqUmVnTWFzaykgeworICAgIFVzZWRQaHlzUmVnTWFzay5zZXRCaXRzTm90SW5NYXNrKFJlZ01hc2spOworICB9CisKKyAgY29uc3QgQml0VmVjdG9yICZnZXRVc2VkUGh5c1JlZ3NNYXNrKCkgY29uc3QgeyByZXR1cm4gVXNlZFBoeXNSZWdNYXNrOyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFJlc2VydmVkIFJlZ2lzdGVyIEluZm8KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIFRoZSBzZXQgb2YgcmVzZXJ2ZWQgcmVnaXN0ZXJzIG11c3QgYmUgaW52YXJpYW50IGR1cmluZyByZWdpc3RlcgorICAvLyBhbGxvY2F0aW9uLiAgRm9yIGV4YW1wbGUsIHRoZSB0YXJnZXQgY2Fubm90IHN1ZGRlbmx5IGRlY2lkZSBpdCBuZWVkcyBhCisgIC8vIGZyYW1lIHBvaW50ZXIgd2hlbiB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yIGhhcyBhbHJlYWR5IHVzZWQgdGhlIGZyYW1lCisgIC8vIHBvaW50ZXIgcmVnaXN0ZXIgZm9yIHNvbWV0aGluZyBlbHNlLgorICAvLworICAvLyBUaGVzZSBtZXRob2RzIGNhbiBiZSB1c2VkIGJ5IHRhcmdldCBob29rcyBsaWtlIGhhc0ZQKCkgdG8gYXZvaWQgY2hhbmdpbmcKKyAgLy8gdGhlIHJlc2VydmVkIHJlZ2lzdGVyIHNldCBkdXJpbmcgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKworICAvLy8gZnJlZXplUmVzZXJ2ZWRSZWdzIC0gQ2FsbGVkIGJ5IHRoZSByZWdpc3RlciBhbGxvY2F0b3IgdG8gZnJlZXplIHRoZSBzZXQKKyAgLy8vIG9mIHJlc2VydmVkIHJlZ2lzdGVycyBiZWZvcmUgYWxsb2NhdGlvbiBiZWdpbnMuCisgIHZvaWQgZnJlZXplUmVzZXJ2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiYpOworCisgIC8vLyByZXNlcnZlZFJlZ3NGcm96ZW4gLSBSZXR1cm5zIHRydWUgYWZ0ZXIgZnJlZXplUmVzZXJ2ZWRSZWdzKCkgd2FzIGNhbGxlZAorICAvLy8gdG8gZW5zdXJlIHRoZSBzZXQgb2YgcmVzZXJ2ZWQgcmVnaXN0ZXJzIHN0YXlzIGNvbnN0YW50LgorICBib29sIHJlc2VydmVkUmVnc0Zyb3plbigpIGNvbnN0IHsKKyAgICByZXR1cm4gIVJlc2VydmVkUmVncy5lbXB0eSgpOworICB9CisKKyAgLy8vIGNhblJlc2VydmVSZWcgLSBSZXR1cm5zIHRydWUgaWYgUGh5c1JlZyBjYW4gYmUgdXNlZCBhcyBhIHJlc2VydmVkCisgIC8vLyByZWdpc3Rlci4gIEFueSByZWdpc3RlciBjYW4gYmUgcmVzZXJ2ZWQgYmVmb3JlIGZyZWV6ZVJlc2VydmVkUmVncygpIGlzCisgIC8vLyBjYWxsZWQuCisgIGJvb2wgY2FuUmVzZXJ2ZVJlZyh1bnNpZ25lZCBQaHlzUmVnKSBjb25zdCB7CisgICAgcmV0dXJuICFyZXNlcnZlZFJlZ3NGcm96ZW4oKSB8fCBSZXNlcnZlZFJlZ3MudGVzdChQaHlzUmVnKTsKKyAgfQorCisgIC8vLyBnZXRSZXNlcnZlZFJlZ3MgLSBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBmcm96ZW4gc2V0IG9mIHJlc2VydmVkCisgIC8vLyByZWdpc3RlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBhbHdheXMgYmUgcHJlZmVycmVkIHRvIGNhbGxpbmcKKyAgLy8vIFRSSTo6Z2V0UmVzZXJ2ZWRSZWdzKCkgd2hlbiBwb3NzaWJsZS4KKyAgY29uc3QgQml0VmVjdG9yICZnZXRSZXNlcnZlZFJlZ3MoKSBjb25zdCB7CisgICAgYXNzZXJ0KHJlc2VydmVkUmVnc0Zyb3plbigpICYmCisgICAgICAgICAgICJSZXNlcnZlZCByZWdpc3RlcnMgaGF2ZW4ndCBiZWVuIGZyb3plbiB5ZXQuICIKKyAgICAgICAgICAgIlVzZSBUUkk6OmdldFJlc2VydmVkUmVncygpLiIpOworICAgIHJldHVybiBSZXNlcnZlZFJlZ3M7CisgIH0KKworICAvLy8gaXNSZXNlcnZlZCAtIFJldHVybnMgdHJ1ZSB3aGVuIFBoeXNSZWcgaXMgYSByZXNlcnZlZCByZWdpc3Rlci4KKyAgLy8vCisgIC8vLyBSZXNlcnZlZCByZWdpc3RlcnMgbWF5IGJlbG9uZyB0byBhbiBhbGxvY2F0YWJsZSByZWdpc3RlciBjbGFzcywgYnV0IHRoZQorICAvLy8gdGFyZ2V0IGhhcyBleHBsaWNpdGx5IHJlcXVlc3RlZCB0aGF0IHRoZXkgYXJlIG5vdCB1c2VkLgorICBib29sIGlzUmVzZXJ2ZWQodW5zaWduZWQgUGh5c1JlZykgY29uc3QgeworICAgIHJldHVybiBnZXRSZXNlcnZlZFJlZ3MoKS50ZXN0KFBoeXNSZWcpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBnaXZlbiByZWdpc3RlciB1bml0IGlzIGNvbnNpZGVyZWQgcmVzZXJ2ZWQuCisgIC8vLworICAvLy8gUmVnaXN0ZXIgdW5pdHMgYXJlIGNvbnNpZGVyZWQgcmVzZXJ2ZWQgd2hlbiBmb3IgYXQgbGVhc3Qgb25lIG9mIHRoZWlyCisgIC8vLyByb290IHJlZ2lzdGVycywgdGhlIHJvb3QgcmVnaXN0ZXIgYW5kIGFsbCBzdXBlciByZWdpc3RlcnMgYXJlIHJlc2VydmVkLgorICAvLy8gVGhpcyBjdXJyZW50bHkgaXRlcmF0ZXMgdGhlIHJlZ2lzdGVyIGhpZXJhcmNoeSBhbmQgbWF5IGJlIHNsb3dlciB0aGFuCisgIC8vLyBleHBlY3RlZC4KKyAgYm9vbCBpc1Jlc2VydmVkUmVnVW5pdCh1bnNpZ25lZCBVbml0KSBjb25zdDsKKworICAvLy8gaXNBbGxvY2F0YWJsZSAtIFJldHVybnMgdHJ1ZSB3aGVuIFBoeXNSZWcgYmVsb25ncyB0byBhbiBhbGxvY2F0YWJsZQorICAvLy8gcmVnaXN0ZXIgY2xhc3MgYW5kIGl0IGhhc24ndCBiZWVuIHJlc2VydmVkLgorICAvLy8KKyAgLy8vIEFsbG9jYXRhYmxlIHJlZ2lzdGVycyBtYXkgc2hvdyB1cCBpbiB0aGUgYWxsb2NhdGlvbiBvcmRlciBvZiBzb21lIHZpcnR1YWwKKyAgLy8vIHJlZ2lzdGVyLCBzbyBhIHJlZ2lzdGVyIGFsbG9jYXRvciBuZWVkcyB0byB0cmFjayBpdHMgbGl2ZW5lc3MgYW5kCisgIC8vLyBhdmFpbGFiaWxpdHkuCisgIGJvb2wgaXNBbGxvY2F0YWJsZSh1bnNpZ25lZCBQaHlzUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRhcmdldFJlZ2lzdGVySW5mbygpLT5pc0luQWxsb2NhdGFibGVDbGFzcyhQaHlzUmVnKSAmJgorICAgICAgIWlzUmVzZXJ2ZWQoUGh5c1JlZyk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTGl2ZUluIE1hbmFnZW1lbnQKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIGFkZExpdmVJbiAtIEFkZCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGFzIGEgbGl2ZS1pbi4gIE5vdGUgdGhhdCBpdAorICAvLy8gaXMgYW4gZXJyb3IgdG8gYWRkIHRoZSBzYW1lIHJlZ2lzdGVyIHRvIHRoZSBzYW1lIHNldCBtb3JlIHRoYW4gb25jZS4KKyAgdm9pZCBhZGRMaXZlSW4odW5zaWduZWQgUmVnLCB1bnNpZ25lZCB2cmVnID0gMCkgeworICAgIExpdmVJbnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFJlZywgdnJlZykpOworICB9CisKKyAgLy8gSXRlcmF0aW9uIHN1cHBvcnQgZm9yIHRoZSBsaXZlLWlucyBzZXQuICBJdCdzIGtlcHQgaW4gc29ydGVkIG9yZGVyCisgIC8vIGJ5IHJlZ2lzdGVyIG51bWJlci4KKyAgdXNpbmcgbGl2ZWluX2l0ZXJhdG9yID0KKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCx1bnNpZ25lZD4+Ojpjb25zdF9pdGVyYXRvcjsKKyAgbGl2ZWluX2l0ZXJhdG9yIGxpdmVpbl9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIExpdmVJbnMuYmVnaW4oKTsgfQorICBsaXZlaW5faXRlcmF0b3IgbGl2ZWluX2VuZCgpICAgY29uc3QgeyByZXR1cm4gTGl2ZUlucy5lbmQoKTsgfQorICBib29sICAgICAgICAgICAgbGl2ZWluX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gTGl2ZUlucy5lbXB0eSgpOyB9CisKKyAgQXJyYXlSZWY8c3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4+IGxpdmVpbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIExpdmVJbnM7CisgIH0KKworICBib29sIGlzTGl2ZUluKHVuc2lnbmVkIFJlZykgY29uc3Q7CisKKyAgLy8vIGdldExpdmVJblBoeXNSZWcgLSBJZiBWUmVnIGlzIGEgbGl2ZS1pbiB2aXJ0dWFsIHJlZ2lzdGVyLCByZXR1cm4gdGhlCisgIC8vLyBjb3JyZXNwb25kaW5nIGxpdmUtaW4gcGh5c2ljYWwgcmVnaXN0ZXIuCisgIHVuc2lnbmVkIGdldExpdmVJblBoeXNSZWcodW5zaWduZWQgVlJlZykgY29uc3Q7CisKKyAgLy8vIGdldExpdmVJblZpcnRSZWcgLSBJZiBQUmVnIGlzIGEgbGl2ZS1pbiBwaHlzaWNhbCByZWdpc3RlciwgcmV0dXJuIHRoZQorICAvLy8gY29ycmVzcG9uZGluZyBsaXZlLWluIHBoeXNpY2FsIHJlZ2lzdGVyLgorICB1bnNpZ25lZCBnZXRMaXZlSW5WaXJ0UmVnKHVuc2lnbmVkIFBSZWcpIGNvbnN0OworCisgIC8vLyBFbWl0TGl2ZUluQ29waWVzIC0gRW1pdCBjb3BpZXMgdG8gaW5pdGlhbGl6ZSBsaXZlaW4gdmlydHVhbCByZWdpc3RlcnMKKyAgLy8vIGludG8gdGhlIGdpdmVuIGVudHJ5IGJsb2NrLgorICB2b2lkIEVtaXRMaXZlSW5Db3BpZXMoTWFjaGluZUJhc2ljQmxvY2sgKkVudHJ5TUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSSk7CisKKyAgLy8vIFJldHVybnMgYSBtYXNrIGNvdmVyaW5nIGFsbCBiaXRzIHRoYXQgY2FuIGFwcGVhciBpbiBsYW5lIG1hc2tzIG9mCisgIC8vLyBzdWJyZWdpc3RlcnMgb2YgdGhlIHZpcnR1YWwgcmVnaXN0ZXIgQHAgUmVnLgorICBMYW5lQml0bWFzayBnZXRNYXhMYW5lTWFza0ZvclZSZWcodW5zaWduZWQgUmVnKSBjb25zdDsKKworICAvLy8gZGVmdXNlY2hhaW5faXRlcmF0b3IgLSBUaGlzIGNsYXNzIHByb3ZpZGVzIGl0ZXJhdG9yIHN1cHBvcnQgZm9yIG1hY2hpbmUKKyAgLy8vIG9wZXJhbmRzIGluIHRoZSBmdW5jdGlvbiB0aGF0IHVzZSBvciBkZWZpbmUgYSBzcGVjaWZpYyByZWdpc3Rlci4gIElmCisgIC8vLyBSZXR1cm5Vc2VzIGlzIHRydWUgaXQgcmV0dXJucyB1c2VzIG9mIHJlZ2lzdGVycywgaWYgUmV0dXJuRGVmcyBpcyB0cnVlIGl0CisgIC8vLyByZXR1cm5zIGRlZnMuICBJZiBuZWl0aGVyIGFyZSB0cnVlIHRoZW4geW91IGFyZSBzaWxseSBhbmQgaXQgYWx3YXlzCisgIC8vLyByZXR1cm5zIGVuZCgpLiAgSWYgU2tpcERlYnVnIGlzIHRydWUgaXQgc2tpcHMgdXNlcyBtYXJrZWQgRGVidWcKKyAgLy8vIHdoZW4gaW5jcmVtZW50aW5nLgorICB0ZW1wbGF0ZTxib29sIFJldHVyblVzZXMsIGJvb2wgUmV0dXJuRGVmcywgYm9vbCBTa2lwRGVidWcsCisgICAgICAgICAgIGJvb2wgQnlPcGVyYW5kLCBib29sIEJ5SW5zdHIsIGJvb2wgQnlCdW5kbGU+CisgIGNsYXNzIGRlZnVzZWNoYWluX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBNYWNoaW5lSW5zdHIsIHB0cmRpZmZfdD4geworICAgIGZyaWVuZCBjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworCisgICAgTWFjaGluZU9wZXJhbmQgKk9wID0gbnVsbHB0cjsKKworICAgIGV4cGxpY2l0IGRlZnVzZWNoYWluX2l0ZXJhdG9yKE1hY2hpbmVPcGVyYW5kICpvcCkgOiBPcChvcCkgeworICAgICAgLy8gSWYgdGhlIGZpcnN0IG5vZGUgaXNuJ3Qgb25lIHdlJ3JlIGludGVyZXN0ZWQgaW4sIGFkdmFuY2UgdG8gb25lIHRoYXQKKyAgICAgIC8vIHdlIGFyZSBpbnRlcmVzdGVkIGluLgorICAgICAgaWYgKG9wKSB7CisgICAgICAgIGlmICgoIVJldHVyblVzZXMgJiYgb3AtPmlzVXNlKCkpIHx8CisgICAgICAgICAgICAoIVJldHVybkRlZnMgJiYgb3AtPmlzRGVmKCkpIHx8CisgICAgICAgICAgICAoU2tpcERlYnVnICYmIG9wLT5pc0RlYnVnKCkpKQorICAgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoT3AgJiYgIkNhbm5vdCBpbmNyZW1lbnQgZW5kIGl0ZXJhdG9yISIpOworICAgICAgT3AgPSBnZXROZXh0T3BlcmFuZEZvclJlZyhPcCk7CisKKyAgICAgIC8vIEFsbCBkZWZzIGNvbWUgYmVmb3JlIHRoZSB1c2VzLCBzbyBzdG9wIGRlZl9pdGVyYXRvciBlYXJseS4KKyAgICAgIGlmICghUmV0dXJuVXNlcykgeworICAgICAgICBpZiAoT3ApIHsKKyAgICAgICAgICBpZiAoT3AtPmlzVXNlKCkpCisgICAgICAgICAgICBPcCA9IG51bGxwdHI7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYXNzZXJ0KCFPcC0+aXNEZWJ1ZygpICYmICJDYW4ndCBoYXZlIGRlYnVnIGRlZnMiKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBvcGVyYW5kIHdlIGRvbid0IGNhcmUgYWJvdXQsIHNraXAgaXQuCisgICAgICAgIHdoaWxlIChPcCAmJiAoKCFSZXR1cm5EZWZzICYmIE9wLT5pc0RlZigpKSB8fAorICAgICAgICAgICAgICAgICAgICAgIChTa2lwRGVidWcgJiYgT3AtPmlzRGVidWcoKSkpKQorICAgICAgICAgIE9wID0gZ2V0TmV4dE9wZXJhbmRGb3JSZWcoT3ApOworICAgICAgfQorICAgIH0KKworICBwdWJsaWM6CisgICAgdXNpbmcgcmVmZXJlbmNlID0gc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyLCBwdHJkaWZmX3Q+OjpyZWZlcmVuY2U7CisgICAgdXNpbmcgcG9pbnRlciA9IHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIsIHB0cmRpZmZfdD46OnBvaW50ZXI7CisKKyAgICBkZWZ1c2VjaGFpbl9pdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBkZWZ1c2VjaGFpbl9pdGVyYXRvciAmeCkgY29uc3QgeworICAgICAgcmV0dXJuIE9wID09IHguT3A7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBkZWZ1c2VjaGFpbl9pdGVyYXRvciAmeCkgY29uc3QgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KHgpOworICAgIH0KKworICAgIC8vLyBhdEVuZCAtIHJldHVybiB0cnVlIGlmIHRoaXMgaXRlcmF0b3IgaXMgZXF1YWwgdG8gcmVnX2VuZCgpIG9uIHRoZSB2YWx1ZS4KKyAgICBib29sIGF0RW5kKCkgY29uc3QgeyByZXR1cm4gT3AgPT0gbnVsbHB0cjsgfQorCisgICAgLy8gSXRlcmF0b3IgdHJhdmVyc2FsOiBmb3J3YXJkIGl0ZXJhdGlvbiBvbmx5CisgICAgZGVmdXNlY2hhaW5faXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7ICAgICAgICAgIC8vIFByZWluY3JlbWVudAorICAgICAgYXNzZXJ0KE9wICYmICJDYW5ub3QgaW5jcmVtZW50IGVuZCBpdGVyYXRvciEiKTsKKyAgICAgIGlmIChCeU9wZXJhbmQpCisgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgIGVsc2UgaWYgKEJ5SW5zdHIpIHsKKyAgICAgICAgTWFjaGluZUluc3RyICpQID0gT3AtPmdldFBhcmVudCgpOworICAgICAgICBkbyB7CisgICAgICAgICAgYWR2YW5jZSgpOworICAgICAgICB9IHdoaWxlIChPcCAmJiBPcC0+Z2V0UGFyZW50KCkgPT0gUCk7CisgICAgICB9IGVsc2UgaWYgKEJ5QnVuZGxlKSB7CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppbnN0cl9pdGVyYXRvciBQID0KKyAgICAgICAgICAgIGdldEJ1bmRsZVN0YXJ0KE9wLT5nZXRQYXJlbnQoKS0+Z2V0SXRlcmF0b3IoKSk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgIH0gd2hpbGUgKE9wICYmIGdldEJ1bmRsZVN0YXJ0KE9wLT5nZXRQYXJlbnQoKS0+Z2V0SXRlcmF0b3IoKSkgPT0gUCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgZGVmdXNlY2hhaW5faXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgICAgICAgIC8vIFBvc3RpbmNyZW1lbnQKKyAgICAgIGRlZnVzZWNoYWluX2l0ZXJhdG9yIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICAgIH0KKworICAgIC8vLyBnZXRPcGVyYW5kTm8gLSBSZXR1cm4gdGhlIG9wZXJhbmQgIyBvZiB0aGlzIE1hY2hpbmVPcGVyYW5kIGluIGl0cworICAgIC8vLyBNYWNoaW5lSW5zdHIuCisgICAgdW5zaWduZWQgZ2V0T3BlcmFuZE5vKCkgY29uc3QgeworICAgICAgYXNzZXJ0KE9wICYmICJDYW5ub3QgZGVyZWZlcmVuY2UgZW5kIGl0ZXJhdG9yISIpOworICAgICAgcmV0dXJuIE9wIC0gJk9wLT5nZXRQYXJlbnQoKS0+Z2V0T3BlcmFuZCgwKTsKKyAgICB9CisKKyAgICAvLyBSZXRyaWV2ZSBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBvcGVyYW5kLgorICAgIE1hY2hpbmVPcGVyYW5kICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgICBhc3NlcnQoT3AgJiYgIkNhbm5vdCBkZXJlZmVyZW5jZSBlbmQgaXRlcmF0b3IhIik7CisgICAgICByZXR1cm4gKk9wOworICAgIH0KKworICAgIE1hY2hpbmVPcGVyYW5kICpvcGVyYXRvci0+KCkgY29uc3QgeworICAgICAgYXNzZXJ0KE9wICYmICJDYW5ub3QgZGVyZWZlcmVuY2UgZW5kIGl0ZXJhdG9yISIpOworICAgICAgcmV0dXJuIE9wOworICAgIH0KKyAgfTsKKworICAvLy8gZGVmdXNlY2hhaW5faXRlcmF0b3IgLSBUaGlzIGNsYXNzIHByb3ZpZGVzIGl0ZXJhdG9yIHN1cHBvcnQgZm9yIG1hY2hpbmUKKyAgLy8vIG9wZXJhbmRzIGluIHRoZSBmdW5jdGlvbiB0aGF0IHVzZSBvciBkZWZpbmUgYSBzcGVjaWZpYyByZWdpc3Rlci4gIElmCisgIC8vLyBSZXR1cm5Vc2VzIGlzIHRydWUgaXQgcmV0dXJucyB1c2VzIG9mIHJlZ2lzdGVycywgaWYgUmV0dXJuRGVmcyBpcyB0cnVlIGl0CisgIC8vLyByZXR1cm5zIGRlZnMuICBJZiBuZWl0aGVyIGFyZSB0cnVlIHRoZW4geW91IGFyZSBzaWxseSBhbmQgaXQgYWx3YXlzCisgIC8vLyByZXR1cm5zIGVuZCgpLiAgSWYgU2tpcERlYnVnIGlzIHRydWUgaXQgc2tpcHMgdXNlcyBtYXJrZWQgRGVidWcKKyAgLy8vIHdoZW4gaW5jcmVtZW50aW5nLgorICB0ZW1wbGF0ZTxib29sIFJldHVyblVzZXMsIGJvb2wgUmV0dXJuRGVmcywgYm9vbCBTa2lwRGVidWcsCisgICAgICAgICAgIGJvb2wgQnlPcGVyYW5kLCBib29sIEJ5SW5zdHIsIGJvb2wgQnlCdW5kbGU+CisgIGNsYXNzIGRlZnVzZWNoYWluX2luc3RyX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBNYWNoaW5lSW5zdHIsIHB0cmRpZmZfdD4geworICAgIGZyaWVuZCBjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworCisgICAgTWFjaGluZU9wZXJhbmQgKk9wID0gbnVsbHB0cjsKKworICAgIGV4cGxpY2l0IGRlZnVzZWNoYWluX2luc3RyX2l0ZXJhdG9yKE1hY2hpbmVPcGVyYW5kICpvcCkgOiBPcChvcCkgeworICAgICAgLy8gSWYgdGhlIGZpcnN0IG5vZGUgaXNuJ3Qgb25lIHdlJ3JlIGludGVyZXN0ZWQgaW4sIGFkdmFuY2UgdG8gb25lIHRoYXQKKyAgICAgIC8vIHdlIGFyZSBpbnRlcmVzdGVkIGluLgorICAgICAgaWYgKG9wKSB7CisgICAgICAgIGlmICgoIVJldHVyblVzZXMgJiYgb3AtPmlzVXNlKCkpIHx8CisgICAgICAgICAgICAoIVJldHVybkRlZnMgJiYgb3AtPmlzRGVmKCkpIHx8CisgICAgICAgICAgICAoU2tpcERlYnVnICYmIG9wLT5pc0RlYnVnKCkpKQorICAgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoT3AgJiYgIkNhbm5vdCBpbmNyZW1lbnQgZW5kIGl0ZXJhdG9yISIpOworICAgICAgT3AgPSBnZXROZXh0T3BlcmFuZEZvclJlZyhPcCk7CisKKyAgICAgIC8vIEFsbCBkZWZzIGNvbWUgYmVmb3JlIHRoZSB1c2VzLCBzbyBzdG9wIGRlZl9pdGVyYXRvciBlYXJseS4KKyAgICAgIGlmICghUmV0dXJuVXNlcykgeworICAgICAgICBpZiAoT3ApIHsKKyAgICAgICAgICBpZiAoT3AtPmlzVXNlKCkpCisgICAgICAgICAgICBPcCA9IG51bGxwdHI7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYXNzZXJ0KCFPcC0+aXNEZWJ1ZygpICYmICJDYW4ndCBoYXZlIGRlYnVnIGRlZnMiKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBvcGVyYW5kIHdlIGRvbid0IGNhcmUgYWJvdXQsIHNraXAgaXQuCisgICAgICAgIHdoaWxlIChPcCAmJiAoKCFSZXR1cm5EZWZzICYmIE9wLT5pc0RlZigpKSB8fAorICAgICAgICAgICAgICAgICAgICAgIChTa2lwRGVidWcgJiYgT3AtPmlzRGVidWcoKSkpKQorICAgICAgICAgIE9wID0gZ2V0TmV4dE9wZXJhbmRGb3JSZWcoT3ApOworICAgICAgfQorICAgIH0KKworICBwdWJsaWM6CisgICAgdXNpbmcgcmVmZXJlbmNlID0gc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyLCBwdHJkaWZmX3Q+OjpyZWZlcmVuY2U7CisgICAgdXNpbmcgcG9pbnRlciA9IHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIsIHB0cmRpZmZfdD46OnBvaW50ZXI7CisKKyAgICBkZWZ1c2VjaGFpbl9pbnN0cl9pdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBkZWZ1c2VjaGFpbl9pbnN0cl9pdGVyYXRvciAmeCkgY29uc3QgeworICAgICAgcmV0dXJuIE9wID09IHguT3A7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBkZWZ1c2VjaGFpbl9pbnN0cl9pdGVyYXRvciAmeCkgY29uc3QgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KHgpOworICAgIH0KKworICAgIC8vLyBhdEVuZCAtIHJldHVybiB0cnVlIGlmIHRoaXMgaXRlcmF0b3IgaXMgZXF1YWwgdG8gcmVnX2VuZCgpIG9uIHRoZSB2YWx1ZS4KKyAgICBib29sIGF0RW5kKCkgY29uc3QgeyByZXR1cm4gT3AgPT0gbnVsbHB0cjsgfQorCisgICAgLy8gSXRlcmF0b3IgdHJhdmVyc2FsOiBmb3J3YXJkIGl0ZXJhdGlvbiBvbmx5CisgICAgZGVmdXNlY2hhaW5faW5zdHJfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7ICAgICAgICAgIC8vIFByZWluY3JlbWVudAorICAgICAgYXNzZXJ0KE9wICYmICJDYW5ub3QgaW5jcmVtZW50IGVuZCBpdGVyYXRvciEiKTsKKyAgICAgIGlmIChCeU9wZXJhbmQpCisgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgIGVsc2UgaWYgKEJ5SW5zdHIpIHsKKyAgICAgICAgTWFjaGluZUluc3RyICpQID0gT3AtPmdldFBhcmVudCgpOworICAgICAgICBkbyB7CisgICAgICAgICAgYWR2YW5jZSgpOworICAgICAgICB9IHdoaWxlIChPcCAmJiBPcC0+Z2V0UGFyZW50KCkgPT0gUCk7CisgICAgICB9IGVsc2UgaWYgKEJ5QnVuZGxlKSB7CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppbnN0cl9pdGVyYXRvciBQID0KKyAgICAgICAgICAgIGdldEJ1bmRsZVN0YXJ0KE9wLT5nZXRQYXJlbnQoKS0+Z2V0SXRlcmF0b3IoKSk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgIH0gd2hpbGUgKE9wICYmIGdldEJ1bmRsZVN0YXJ0KE9wLT5nZXRQYXJlbnQoKS0+Z2V0SXRlcmF0b3IoKSkgPT0gUCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgZGVmdXNlY2hhaW5faW5zdHJfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgICAgICAgIC8vIFBvc3RpbmNyZW1lbnQKKyAgICAgIGRlZnVzZWNoYWluX2luc3RyX2l0ZXJhdG9yIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICAgIH0KKworICAgIC8vIFJldHJpZXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG9wZXJhbmQuCisgICAgTWFjaGluZUluc3RyICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgICBhc3NlcnQoT3AgJiYgIkNhbm5vdCBkZXJlZmVyZW5jZSBlbmQgaXRlcmF0b3IhIik7CisgICAgICBpZiAoQnlCdW5kbGUpCisgICAgICAgIHJldHVybiAqZ2V0QnVuZGxlU3RhcnQoT3AtPmdldFBhcmVudCgpLT5nZXRJdGVyYXRvcigpKTsKKyAgICAgIHJldHVybiAqT3AtPmdldFBhcmVudCgpOworICAgIH0KKworICAgIE1hY2hpbmVJbnN0ciAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZvcGVyYXRvciooKTsgfQorICB9OworfTsKKworLy8vIEl0ZXJhdGUgb3ZlciB0aGUgcHJlc3N1cmUgc2V0cyBhZmZlY3RlZCBieSB0aGUgZ2l2ZW4gcGh5c2ljYWwgb3IgdmlydHVhbAorLy8vIHJlZ2lzdGVyLiBJZiBSZWcgaXMgcGh5c2ljYWwsIGl0IG11c3QgYmUgYSByZWdpc3RlciB1bml0IChmcm9tCisvLy8gTUNSZWdVbml0SXRlcmF0b3IpLgorY2xhc3MgUFNldEl0ZXJhdG9yIHsKKyAgY29uc3QgaW50ICpQU2V0ID0gbnVsbHB0cjsKKyAgdW5zaWduZWQgV2VpZ2h0ID0gMDsKKworcHVibGljOgorICBQU2V0SXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgUFNldEl0ZXJhdG9yKHVuc2lnbmVkIFJlZ1VuaXQsIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSkgeworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gTVJJLT5nZXRUYXJnZXRSZWdpc3RlckluZm8oKTsKKyAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihSZWdVbml0KSkgeworICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBNUkktPmdldFJlZ0NsYXNzKFJlZ1VuaXQpOworICAgICAgUFNldCA9IFRSSS0+Z2V0UmVnQ2xhc3NQcmVzc3VyZVNldHMoUkMpOworICAgICAgV2VpZ2h0ID0gVFJJLT5nZXRSZWdDbGFzc1dlaWdodChSQykuUmVnV2VpZ2h0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIFBTZXQgPSBUUkktPmdldFJlZ1VuaXRQcmVzc3VyZVNldHMoUmVnVW5pdCk7CisgICAgICBXZWlnaHQgPSBUUkktPmdldFJlZ1VuaXRXZWlnaHQoUmVnVW5pdCk7CisgICAgfQorICAgIGlmICgqUFNldCA9PSAtMSkKKyAgICAgIFBTZXQgPSBudWxscHRyOworICB9CisKKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gUFNldDsgfQorCisgIHVuc2lnbmVkIGdldFdlaWdodCgpIGNvbnN0IHsgcmV0dXJuIFdlaWdodDsgfQorCisgIHVuc2lnbmVkIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpQU2V0OyB9CisKKyAgdm9pZCBvcGVyYXRvcisrKCkgeworICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIkludmFsaWQgUFNldEl0ZXJhdG9yLiIpOworICAgICsrUFNldDsKKyAgICBpZiAoKlBTZXQgPT0gLTEpCisgICAgICBQU2V0ID0gbnVsbHB0cjsKKyAgfQorfTsKKworaW5saW5lIFBTZXRJdGVyYXRvciBNYWNoaW5lUmVnaXN0ZXJJbmZvOjoKK2dldFByZXNzdXJlU2V0cyh1bnNpZ25lZCBSZWdVbml0KSBjb25zdCB7CisgIHJldHVybiBQU2V0SXRlcmF0b3IoUmVnVW5pdCwgdGhpcyk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUFDSElORVJFR0lTVEVSSU5GT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZVNTQVVwZGF0ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lU1NBVXBkYXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZWEyMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZVNTQVVwZGF0ZXIuaApAQCAtMCwwICsxLDExMyBAQAorLy89PT0tIE1hY2hpbmVTU0FVcGRhdGVyLmggLSBVbnN0cnVjdHVyZWQgU1NBIFVwZGF0ZSBUb29sIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1hY2hpbmVTU0FVcGRhdGVyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVTU0FVUERBVEVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVTU0FVUERBVEVSX0gKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIE1hY2hpbmVPcGVyYW5kOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIFRhcmdldEluc3RySW5mbzsKK2NsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBTbWFsbFZlY3RvckltcGw7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBTU0FVcGRhdGVyVHJhaXRzOworCisvLy8gTWFjaGluZVNTQVVwZGF0ZXIgLSBUaGlzIGNsYXNzIHVwZGF0ZXMgU1NBIGZvcm0gZm9yIGEgc2V0IG9mIHZpcnR1YWwKKy8vLyByZWdpc3RlcnMgZGVmaW5lZCBpbiBtdWx0aXBsZSBibG9ja3MuICBUaGlzIGlzIHVzZWQgd2hlbiBjb2RlIGR1cGxpY2F0aW9uCisvLy8gb3IgYW5vdGhlciB1bnN0cnVjdHVyZWQgdHJhbnNmb3JtYXRpb24gd2FudHMgdG8gcmV3cml0ZSBhIHNldCBvZiB1c2VzIG9mIG9uZQorLy8vIHZyZWcgd2l0aCB1c2VzIG9mIGEgc2V0IG9mIHZyZWdzLgorY2xhc3MgTWFjaGluZVNTQVVwZGF0ZXIgeworICBmcmllbmQgY2xhc3MgU1NBVXBkYXRlclRyYWl0czxNYWNoaW5lU1NBVXBkYXRlcj47CisKK3ByaXZhdGU6CisgIC8vLyBBdmFpbGFibGVWYWxzIC0gVGhpcyBrZWVwcyB0cmFjayBvZiB3aGljaCB2YWx1ZSB0byB1c2Ugb24gYSBwZXItYmxvY2sKKyAgLy8vIGJhc2lzLiAgV2hlbiB3ZSBpbnNlcnQgUEhJIG5vZGVzLCB3ZSBrZWVwIHRyYWNrIG9mIHRoZW0gaGVyZS4KKyAgLy90eXBlZGVmIERlbnNlTWFwPE1hY2hpbmVCYXNpY0Jsb2NrKiwgdW5zaWduZWQgPiBBdmFpbGFibGVWYWxzVHk7CisgIHZvaWQgKkFWID0gbnVsbHB0cjsKKworICAvLy8gVlIgLSBDdXJyZW50IHZpcnR1YWwgcmVnaXN0ZXIgd2hvc2UgdXNlcyBhcmUgYmVpbmcgdXBkYXRlZC4KKyAgdW5zaWduZWQgVlI7CisKKyAgLy8vIFZSQyAtIFJlZ2lzdGVyIGNsYXNzIG9mIHRoZSBjdXJyZW50IHZpcnR1YWwgcmVnaXN0ZXIuCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlZSQzsKKworICAvLy8gSW5zZXJ0ZWRQSElzIC0gSWYgdGhpcyBpcyBub24tbnVsbCwgdGhlIE1hY2hpbmVTU0FVcGRhdGVyIGFkZHMgYWxsIFBISQorICAvLy8gbm9kZXMgdGhhdCBpdCBjcmVhdGVzIHRvIHRoZSB2ZWN0b3IuCisgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIqPiAqSW5zZXJ0ZWRQSElzOworCisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkk7CisKK3B1YmxpYzoKKyAgLy8vIE1hY2hpbmVTU0FVcGRhdGVyIGNvbnN0cnVjdG9yLiAgSWYgSW5zZXJ0ZWRQSElzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBiZQorICAvLy8gZmlsbGVkIGluIHdpdGggYWxsIFBISSBOb2RlcyBjcmVhdGVkIGJ5IHJld3JpdGluZy4KKyAgZXhwbGljaXQgTWFjaGluZVNTQVVwZGF0ZXIoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIqPiAqSW5zZXJ0ZWRQSElzID0gbnVsbHB0cik7CisgIE1hY2hpbmVTU0FVcGRhdGVyKGNvbnN0IE1hY2hpbmVTU0FVcGRhdGVyICYpID0gZGVsZXRlOworICBNYWNoaW5lU1NBVXBkYXRlciAmb3BlcmF0b3I9KGNvbnN0IE1hY2hpbmVTU0FVcGRhdGVyICYpID0gZGVsZXRlOworICB+TWFjaGluZVNTQVVwZGF0ZXIoKTsKKworICAvLy8gSW5pdGlhbGl6ZSAtIFJlc2V0IHRoaXMgb2JqZWN0IHRvIGdldCByZWFkeSBmb3IgYSBuZXcgc2V0IG9mIFNTQQorICAvLy8gdXBkYXRlcy4KKyAgdm9pZCBJbml0aWFsaXplKHVuc2lnbmVkIFYpOworCisgIC8vLyBBZGRBdmFpbGFibGVWYWx1ZSAtIEluZGljYXRlIHRoYXQgYSByZXdyaXR0ZW4gdmFsdWUgaXMgYXZhaWxhYmxlIGF0IHRoZQorICAvLy8gZW5kIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2sgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICB2b2lkIEFkZEF2YWlsYWJsZVZhbHVlKE1hY2hpbmVCYXNpY0Jsb2NrICpCQiwgdW5zaWduZWQgVik7CisKKyAgLy8vIEhhc1ZhbHVlRm9yQmxvY2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgTWFjaGluZVNTQVVwZGF0ZXIgYWxyZWFkeSBoYXMgYQorICAvLy8gdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgYmxvY2suCisgIGJvb2wgSGFzVmFsdWVGb3JCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqQkIpIGNvbnN0OworCisgIC8vLyBHZXRWYWx1ZUF0RW5kT2ZCbG9jayAtIENvbnN0cnVjdCBTU0EgZm9ybSwgbWF0ZXJpYWxpemluZyBhIHZhbHVlIHRoYXQgaXMKKyAgLy8vIGxpdmUgYXQgdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIGJsb2NrLgorICB1bnNpZ25lZCBHZXRWYWx1ZUF0RW5kT2ZCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqQkIpOworCisgIC8vLyBHZXRWYWx1ZUluTWlkZGxlT2ZCbG9jayAtIENvbnN0cnVjdCBTU0EgZm9ybSwgbWF0ZXJpYWxpemluZyBhIHZhbHVlIHRoYXQKKyAgLy8vIGlzIGxpdmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3BlY2lmaWVkIGJsb2NrLgorICAvLy8KKyAgLy8vIEdldFZhbHVlSW5NaWRkbGVPZkJsb2NrIGlzIHRoZSBzYW1lIGFzIEdldFZhbHVlQXRFbmRPZkJsb2NrIGV4Y2VwdCBpbiBvbmUKKyAgLy8vIGltcG9ydGFudCBjYXNlOiBpZiB0aGVyZSBpcyBhIGRlZmluaXRpb24gb2YgdGhlIHJld3JpdHRlbiB2YWx1ZSBhZnRlciB0aGUKKyAgLy8vICd1c2UnIGluIEJCLiAgQ29uc2lkZXIgY29kZSBsaWtlIHRoaXM6CisgIC8vLworICAvLy8gICAgICBYMSA9IC4uLgorICAvLy8gICBTb21lQkI6CisgIC8vLyAgICAgIHVzZShYKQorICAvLy8gICAgICBYMiA9IC4uLgorICAvLy8gICAgICBiciBDb25kLCBTb21lQkIsIE91dEJCCisgIC8vLworICAvLy8gSW4gdGhpcyBjYXNlLCB0aGVyZSBhcmUgdHdvIHZhbHVlcyAoWDEgYW5kIFgyKSBhZGRlZCB0byB0aGUgQXZhaWxhYmxlVmFscworICAvLy8gc2V0IGJ5IHRoZSBjbGllbnQgb2YgdGhlIHJld3JpdGVyLCBhbmQgdGhvc2UgdmFsdWVzIGFyZSBib3RoIGxpdmUgb3V0IG9mCisgIC8vLyB0aGVpciByZXNwZWN0aXZlIGJsb2Nrcy4gIEhvd2V2ZXIsIHRoZSB1c2Ugb2YgWCBoYXBwZW5zIGluIHRoZSAqbWlkZGxlKiBvZgorICAvLy8gYSBibG9jay4gIEJlY2F1c2Ugb2YgdGhpcywgd2UgbmVlZCB0byBpbnNlcnQgYSBuZXcgUEhJIG5vZGUgaW4gU29tZUJCIHRvCisgIC8vLyBtZXJnZSB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzLCBhbmQgdGhpcyB2YWx1ZSBpc24ndCBsaXZlIG91dCBvZiB0aGUgYmxvY2suCisgIHVuc2lnbmVkIEdldFZhbHVlSW5NaWRkbGVPZkJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIFJld3JpdGVVc2UgLSBSZXdyaXRlIGEgdXNlIG9mIHRoZSBzeW1ib2xpYyB2YWx1ZS4gIFRoaXMgaGFuZGxlcyBQSEkgbm9kZXMsCisgIC8vLyB3aGljaCB1c2UgdGhlaXIgdmFsdWUgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGVjZXNzb3IuICBOb3RlIHRoYXQgdGhpcworICAvLy8gd2lsbCBub3Qgd29yayBpZiB0aGUgdXNlIGlzIHN1cHBvc2VkIHRvIGJlIHJld3JpdHRlbiB0byBhIHZhbHVlIGRlZmluZWQgaW4KKyAgLy8vIHRoZSBzYW1lIGJsb2NrIGFzIHRoZSB1c2UsIGJ1dCBhYm92ZSBpdC4gIEFueSAnQWRkQXZhaWxhYmxlVmFsdWUncyBhZGRlZAorICAvLy8gZm9yIHRoZSB1c2UncyBibG9jayB3aWxsIGJlIGNvbnNpZGVyZWQgdG8gYmUgYmVsb3cgaXQuCisgIHZvaWQgUmV3cml0ZVVzZShNYWNoaW5lT3BlcmFuZCAmVSk7CisKK3ByaXZhdGU6CisgIHVuc2lnbmVkIEdldFZhbHVlQXRFbmRPZkJsb2NrSW50ZXJuYWwoTWFjaGluZUJhc2ljQmxvY2sgKkJCKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUFDSElORVNTQVVQREFURVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVTY2hlZHVsZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lU2NoZWR1bGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyNzg4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lU2NoZWR1bGVyLmgKQEAgLTAsMCArMSwxMDU2IEBACisvLz09PS0gTWFjaGluZVNjaGVkdWxlci5oIC0gTWFjaGluZUluc3RyIFNjaGVkdWxpbmcgUGFzcyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGN1c3RvbWl6aW5nIHRoZSBzdGFuZGFyZCBNYWNoaW5lU2NoZWR1bGVyCisvLyBwYXNzLiBOb3RlIHRoYXQgdGhlIGVudGlyZSBwYXNzIG1heSBiZSByZXBsYWNlZCBhcyBmb2xsb3dzOgorLy8KKy8vIDxUYXJnZXQ+VGFyZ2V0TWFjaGluZTo6Y3JlYXRlUGFzc0NvbmZpZyhQYXNzTWFuYWdlckJhc2UgJlBNKSB7CisvLyAgIFBNLnN1YnN0aXR1dGVQYXNzKCZNYWNoaW5lU2NoZWR1bGVySUQsICZDdXN0b21TY2hlZHVsZXJQYXNzSUQpOworLy8gICAuLi59CisvLworLy8gVGhlIE1hY2hpbmVTY2hlZHVsZXIgcGFzcyBpcyBvbmx5IHJlc3BvbnNpYmxlIGZvciBjaG9vc2luZyB0aGUgcmVnaW9ucyB0byBiZQorLy8gc2NoZWR1bGVkLiBUYXJnZXRzIGNhbiBvdmVycmlkZSB0aGUgREFHIGJ1aWxkZXIgYW5kIHNjaGVkdWxlciB3aXRob3V0CisvLyByZXBsYWNpbmcgdGhlIHBhc3MgYXMgZm9sbG93czoKKy8vCisvLyBTY2hlZHVsZURBR0luc3RycyAqPFRhcmdldD5QYXNzQ29uZmlnOjoKKy8vIGNyZWF0ZU1hY2hpbmVTY2hlZHVsZXIoTWFjaGluZVNjaGVkQ29udGV4dCAqQykgeworLy8gICByZXR1cm4gbmV3IEN1c3RvbU1hY2hpbmVTY2hlZHVsZXIoQyk7CisvLyB9CisvLworLy8gVGhlIGRlZmF1bHQgc2NoZWR1bGVyLCBTY2hlZHVsZURBR01JTGl2ZSwgYnVpbGRzIHRoZSBEQUcgYW5kIGRyaXZlcyBsaXN0CisvLyBzY2hlZHVsaW5nIHdoaWxlIHVwZGF0aW5nIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0sIHJlZ2lzdGVyIHByZXNzdXJlLCBhbmQgbGl2ZQorLy8gaW50ZXJ2YWxzLiBNb3N0IHRhcmdldHMgZG9uJ3QgbmVlZCB0byBvdmVycmlkZSB0aGUgREFHIGJ1aWxkZXIgYW5kIGxpc3QKKy8vIHNjaGVkdWxlciwgYnV0IHN1YnRhcmdldHMgdGhhdCByZXF1aXJlIGN1c3RvbSBzY2hlZHVsaW5nIGhldXJpc3RpY3MgbWF5CisvLyBwbHVnaW4gYW4gYWx0ZXJuYXRlIE1hY2hpbmVTY2hlZFN0cmF0ZWd5LiBUaGUgc3RyYXRlZ3kgaXMgcmVzcG9uc2libGUgZm9yCisvLyBzZWxlY3RpbmcgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgbm9kZSBmcm9tIHRoZSBsaXN0OgorLy8KKy8vIFNjaGVkdWxlREFHSW5zdHJzICo8VGFyZ2V0PlBhc3NDb25maWc6OgorLy8gY3JlYXRlTWFjaGluZVNjaGVkdWxlcihNYWNoaW5lU2NoZWRDb250ZXh0ICpDKSB7CisvLyAgIHJldHVybiBuZXcgU2NoZWR1bGVEQUdNSUxpdmUoQywgQ3VzdG9tU3RyYXRlZ3koQykpOworLy8gfQorLy8KKy8vIFRoZSBEQUcgYnVpbGRlciBjYW4gYWxzbyBiZSBjdXN0b21pemVkIGluIGEgc2Vuc2UgYnkgYWRkaW5nIERBRyBtdXRhdGlvbnMKKy8vIHRoYXQgd2lsbCBydW4gYWZ0ZXIgREFHIGJ1aWxkaW5nIGFuZCBiZWZvcmUgbGlzdCBzY2hlZHVsaW5nLiBEQUcgbXV0YXRpb25zCisvLyBjYW4gYWRqdXN0IGRlcGVuZGVuY2llcyBiYXNlZCBvbiB0YXJnZXQtc3BlY2lmaWMga25vd2xlZGdlIG9yIGFkZCB3ZWFrIGVkZ2VzCisvLyB0byBhaWQgaGV1cmlzdGljczoKKy8vCisvLyBTY2hlZHVsZURBR0luc3RycyAqPFRhcmdldD5QYXNzQ29uZmlnOjoKKy8vIGNyZWF0ZU1hY2hpbmVTY2hlZHVsZXIoTWFjaGluZVNjaGVkQ29udGV4dCAqQykgeworLy8gICBTY2hlZHVsZURBR01JICpEQUcgPSBjcmVhdGVHZW5lcmljU2NoZWRMaXZlKEMpOworLy8gICBEQUctPmFkZE11dGF0aW9uKG5ldyBDdXN0b21EQUdNdXRhdGlvbiguLi4pKTsKKy8vICAgcmV0dXJuIERBRzsKKy8vIH0KKy8vCisvLyBBIHRhcmdldCB0aGF0IHN1cHBvcnRzIGFsdGVybmF0aXZlIHNjaGVkdWxlcnMgY2FuIHVzZSB0aGUKKy8vIE1hY2hpbmVTY2hlZFJlZ2lzdHJ5IHRvIGFsbG93IGNvbW1hbmQgbGluZSBzZWxlY3Rpb24uIFRoaXMgY2FuIGJlIGRvbmUgYnkKKy8vIGltcGxlbWVudGluZyB0aGUgZm9sbG93aW5nIGJvaWxlcnBsYXRlOgorLy8KKy8vIHN0YXRpYyBTY2hlZHVsZURBR0luc3RycyAqY3JlYXRlQ3VzdG9tTWFjaGluZVNjaGVkKE1hY2hpbmVTY2hlZENvbnRleHQgKkMpIHsKKy8vICByZXR1cm4gbmV3IEN1c3RvbU1hY2hpbmVTY2hlZHVsZXIoQyk7CisvLyB9CisvLyBzdGF0aWMgTWFjaGluZVNjaGVkUmVnaXN0cnkKKy8vIFNjaGVkQ3VzdG9tUmVnaXN0cnkoImN1c3RvbSIsICJSdW4gbXkgdGFyZ2V0J3MgY3VzdG9tIHNjaGVkdWxlciIsCisvLyAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUN1c3RvbU1hY2hpbmVTY2hlZCk7CisvLworLy8KKy8vIEZpbmFsbHksIHN1YnRhcmdldHMgdGhhdCBkb24ndCBuZWVkIHRvIGltcGxlbWVudCBjdXN0b20gaGV1cmlzdGljcyBidXQgd291bGQKKy8vIGxpa2UgdG8gY29uZmlndXJlIHRoZSBHZW5lcmljU2NoZWR1bGVyJ3MgcG9saWN5IGZvciBhIGdpdmVuIHNjaGVkdWxlciByZWdpb24sCisvLyBpbmNsdWRpbmcgc2NoZWR1bGluZyBkaXJlY3Rpb24gYW5kIHJlZ2lzdGVyIHByZXNzdXJlIHRyYWNraW5nIHBvbGljeSwgY2FuIGRvCisvLyB0aGlzOgorLy8KKy8vIHZvaWQgPFN1YlRhcmdldD5TdWJ0YXJnZXQ6OgorLy8gb3ZlcnJpZGVTY2hlZFBvbGljeShNYWNoaW5lU2NoZWRQb2xpY3kgJlBvbGljeSwKKy8vICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUmVnaW9uSW5zdHJzKSBjb25zdCB7CisvLyAgIFBvbGljeS48RmxhZz4gPSB0cnVlOworLy8gfQorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVTQ0hFRFVMRVJfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORVNDSEVEVUxFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVBhc3NSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9SZWdpc3RlclByZXNzdXJlLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHSW5zdHJzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHTXV0YXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0U2NoZWR1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2V4dGVybiBjbDo6b3B0PGJvb2w+IEZvcmNlVG9wRG93bjsKK2V4dGVybiBjbDo6b3B0PGJvb2w+IEZvcmNlQm90dG9tVXA7CisKK2NsYXNzIExpdmVJbnRlcnZhbHM7CitjbGFzcyBNYWNoaW5lRG9taW5hdG9yVHJlZTsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIE1hY2hpbmVMb29wSW5mbzsKK2NsYXNzIFJlZ2lzdGVyQ2xhc3NJbmZvOworY2xhc3MgU2NoZWRERlNSZXN1bHQ7CitjbGFzcyBTY2hlZHVsZUhhemFyZFJlY29nbml6ZXI7CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CitjbGFzcyBUYXJnZXRQYXNzQ29uZmlnOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworCisvLy8gTWFjaGluZVNjaGVkQ29udGV4dCBwcm92aWRlcyBlbm91Z2ggY29udGV4dCBmcm9tIHRoZSBNYWNoaW5lU2NoZWR1bGVyIHBhc3MKKy8vLyBmb3IgdGhlIHRhcmdldCB0byBpbnN0YW50aWF0ZSBhIHNjaGVkdWxlci4KK3N0cnVjdCBNYWNoaW5lU2NoZWRDb250ZXh0IHsKKyAgTWFjaGluZUZ1bmN0aW9uICpNRiA9IG51bGxwdHI7CisgIGNvbnN0IE1hY2hpbmVMb29wSW5mbyAqTUxJID0gbnVsbHB0cjsKKyAgY29uc3QgTWFjaGluZURvbWluYXRvclRyZWUgKk1EVCA9IG51bGxwdHI7CisgIGNvbnN0IFRhcmdldFBhc3NDb25maWcgKlBhc3NDb25maWcgPSBudWxscHRyOworICBBbGlhc0FuYWx5c2lzICpBQSA9IG51bGxwdHI7CisgIExpdmVJbnRlcnZhbHMgKkxJUyA9IG51bGxwdHI7CisKKyAgUmVnaXN0ZXJDbGFzc0luZm8gKlJlZ0NsYXNzSW5mbzsKKworICBNYWNoaW5lU2NoZWRDb250ZXh0KCk7CisgIHZpcnR1YWwgfk1hY2hpbmVTY2hlZENvbnRleHQoKTsKK307CisKKy8vLyBNYWNoaW5lU2NoZWRSZWdpc3RyeSBwcm92aWRlcyBhIHNlbGVjdGlvbiBvZiBhdmFpbGFibGUgbWFjaGluZSBpbnN0cnVjdGlvbgorLy8vIHNjaGVkdWxlcnMuCitjbGFzcyBNYWNoaW5lU2NoZWRSZWdpc3RyeSA6IHB1YmxpYyBNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZSB7CitwdWJsaWM6CisgIHVzaW5nIFNjaGVkdWxlREFHQ3RvciA9IFNjaGVkdWxlREFHSW5zdHJzICooKikoTWFjaGluZVNjaGVkQ29udGV4dCAqKTsKKworICAvLyBSZWdpc3RlclBhc3NQYXJzZXIgcmVxdWlyZXMgYSAobWlzbmFtZWQpIEZ1bmN0aW9uUGFzc0N0b3IgdHlwZS4KKyAgdXNpbmcgRnVuY3Rpb25QYXNzQ3RvciA9IFNjaGVkdWxlREFHQ3RvcjsKKworICBzdGF0aWMgTWFjaGluZVBhc3NSZWdpc3RyeSBSZWdpc3RyeTsKKworICBNYWNoaW5lU2NoZWRSZWdpc3RyeShjb25zdCBjaGFyICpOLCBjb25zdCBjaGFyICpELCBTY2hlZHVsZURBR0N0b3IgQykKKyAgICA6IE1hY2hpbmVQYXNzUmVnaXN0cnlOb2RlKE4sIEQsIChNYWNoaW5lUGFzc0N0b3IpQykgeworICAgIFJlZ2lzdHJ5LkFkZCh0aGlzKTsKKyAgfQorCisgIH5NYWNoaW5lU2NoZWRSZWdpc3RyeSgpIHsgUmVnaXN0cnkuUmVtb3ZlKHRoaXMpOyB9CisKKyAgLy8gQWNjZXNzb3JzLgorICAvLworICBNYWNoaW5lU2NoZWRSZWdpc3RyeSAqZ2V0TmV4dCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKE1hY2hpbmVTY2hlZFJlZ2lzdHJ5ICopTWFjaGluZVBhc3NSZWdpc3RyeU5vZGU6OmdldE5leHQoKTsKKyAgfQorCisgIHN0YXRpYyBNYWNoaW5lU2NoZWRSZWdpc3RyeSAqZ2V0TGlzdCgpIHsKKyAgICByZXR1cm4gKE1hY2hpbmVTY2hlZFJlZ2lzdHJ5ICopUmVnaXN0cnkuZ2V0TGlzdCgpOworICB9CisKKyAgc3RhdGljIHZvaWQgc2V0TGlzdGVuZXIoTWFjaGluZVBhc3NSZWdpc3RyeUxpc3RlbmVyICpMKSB7CisgICAgUmVnaXN0cnkuc2V0TGlzdGVuZXIoTCk7CisgIH0KK307CisKK2NsYXNzIFNjaGVkdWxlREFHTUk7CisKKy8vLyBEZWZpbmUgYSBnZW5lcmljIHNjaGVkdWxpbmcgcG9saWN5IGZvciB0YXJnZXRzIHRoYXQgZG9uJ3QgcHJvdmlkZSB0aGVpciBvd24KKy8vLyBNYWNoaW5lU2NoZWRTdHJhdGVneS4gVGhpcyBjYW4gYmUgb3ZlcnJpZGVuIGZvciBlYWNoIHNjaGVkdWxpbmcgcmVnaW9uCisvLy8gYmVmb3JlIGJ1aWxkaW5nIHRoZSBEQUcuCitzdHJ1Y3QgTWFjaGluZVNjaGVkUG9saWN5IHsKKyAgLy8gQWxsb3cgdGhlIHNjaGVkdWxlciB0byBkaXNhYmxlIHJlZ2lzdGVyIHByZXNzdXJlIHRyYWNraW5nLgorICBib29sIFNob3VsZFRyYWNrUHJlc3N1cmUgPSBmYWxzZTsKKyAgLy8vIFRyYWNrIExhbmVNYXNrcyB0byBhbGxvdyByZW9yZGVyaW5nIG9mIGluZGVwZW5kZW50IHN1YnJlZ2lzdGVyIHdyaXRlcworICAvLy8gb2YgdGhlIHNhbWUgdnJlZy4gXHNhIE1hY2hpbmVTY2hlZFN0cmF0ZWd5OjpzaG91bGRUcmFja0xhbmVNYXNrcygpCisgIGJvb2wgU2hvdWxkVHJhY2tMYW5lTWFza3MgPSBmYWxzZTsKKworICAvLyBBbGxvdyB0aGUgc2NoZWR1bGVyIHRvIGZvcmNlIHRvcC1kb3duIG9yIGJvdHRvbS11cCBzY2hlZHVsaW5nLiBJZiBuZWl0aGVyCisgIC8vIGlzIHRydWUsIHRoZSBzY2hlZHVsZXIgcnVucyBpbiBib3RoIGRpcmVjdGlvbnMgYW5kIGNvbnZlcmdlcy4KKyAgYm9vbCBPbmx5VG9wRG93biA9IGZhbHNlOworICBib29sIE9ubHlCb3R0b21VcCA9IGZhbHNlOworCisgIC8vIERpc2FibGUgaGV1cmlzdGljIHRoYXQgdHJpZXMgdG8gZmV0Y2ggbm9kZXMgZnJvbSBsb25nIGRlcGVuZGVuY3kgY2hhaW5zCisgIC8vIGZpcnN0LgorICBib29sIERpc2FibGVMYXRlbmN5SGV1cmlzdGljID0gZmFsc2U7CisKKyAgTWFjaGluZVNjaGVkUG9saWN5KCkgPSBkZWZhdWx0OworfTsKKworLy8vIE1hY2hpbmVTY2hlZFN0cmF0ZWd5IC0gSW50ZXJmYWNlIHRvIHRoZSBzY2hlZHVsaW5nIGFsZ29yaXRobSB1c2VkIGJ5CisvLy8gU2NoZWR1bGVEQUdNSS4KKy8vLworLy8vIEluaXRpYWxpemF0aW9uIHNlcXVlbmNlOgorLy8vICAgaW5pdFBvbGljeSAtPiBzaG91bGRUcmFja1ByZXNzdXJlIC0+IGluaXRpYWxpemUoREFHKSAtPiByZWdpc3RlclJvb3RzCitjbGFzcyBNYWNoaW5lU2NoZWRTdHJhdGVneSB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHVibGljOgorICB2aXJ0dWFsIH5NYWNoaW5lU2NoZWRTdHJhdGVneSgpID0gZGVmYXVsdDsKKworICAvLy8gT3B0aW9uYWxseSBvdmVycmlkZSB0aGUgcGVyLXJlZ2lvbiBzY2hlZHVsaW5nIHBvbGljeS4KKyAgdmlydHVhbCB2b2lkIGluaXRQb2xpY3koTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1SZWdpb25JbnN0cnMpIHt9CisKKyAgdmlydHVhbCB2b2lkIGR1bXBQb2xpY3koKSBjb25zdCB7fQorCisgIC8vLyBDaGVjayBpZiBwcmVzc3VyZSB0cmFja2luZyBpcyBuZWVkZWQgYmVmb3JlIGJ1aWxkaW5nIHRoZSBEQUcgYW5kCisgIC8vLyBpbml0aWFsaXppbmcgdGhpcyBzdHJhdGVneS4gQ2FsbGVkIGFmdGVyIGluaXRQb2xpY3kuCisgIHZpcnR1YWwgYm9vbCBzaG91bGRUcmFja1ByZXNzdXJlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgbGFuZW1hc2tzIHNob3VsZCBiZSB0cmFja2VkLiBMYW5lTWFzayB0cmFja2luZyBpcworICAvLy8gbmVjZXNzYXJ5IHRvIHJlb3JkZXIgaW5kZXBlbmRlbnQgc3VicmVnaXN0ZXIgZGVmcyBmb3IgdGhlIHNhbWUgdnJlZy4KKyAgLy8vIFRoaXMgaGFzIHRvIGJlIGVuYWJsZWQgaW4gY29tYmluYXRpb24gd2l0aCBzaG91bGRUcmFja1ByZXNzdXJlKCkuCisgIHZpcnR1YWwgYm9vbCBzaG91bGRUcmFja0xhbmVNYXNrcygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8gSWYgdGhpcyBtZXRob2QgcmV0dXJucyB0cnVlLCBoYW5kbGluZyBvZiB0aGUgc2NoZWR1bGluZyByZWdpb25zCisgIC8vIHRoZW1zZWx2ZXMgKGluIGNhc2Ugb2YgYSBzY2hlZHVsaW5nIGJvdW5kYXJ5IGluIE1CQikgd2lsbCBiZSBkb25lCisgIC8vIGJlZ2lubmluZyB3aXRoIHRoZSB0b3Btb3N0IHJlZ2lvbiBvZiBNQkIuCisgIHZpcnR1YWwgYm9vbCBkb01CQlNjaGVkUmVnaW9uc1RvcERvd24oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBJbml0aWFsaXplIHRoZSBzdHJhdGVneSBhZnRlciBidWlsZGluZyB0aGUgREFHIGZvciBhIG5ldyByZWdpb24uCisgIHZpcnR1YWwgdm9pZCBpbml0aWFsaXplKFNjaGVkdWxlREFHTUkgKkRBRykgPSAwOworCisgIC8vLyBUZWxsIHRoZSBzdHJhdGVneSB0aGF0IE1CQiBpcyBhYm91dCB0byBiZSBwcm9jZXNzZWQuCisgIHZpcnR1YWwgdm9pZCBlbnRlck1CQihNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7fTsKKworICAvLy8gVGVsbCB0aGUgc3RyYXRlZ3kgdGhhdCBjdXJyZW50IE1CQiBpcyBkb25lLgorICB2aXJ0dWFsIHZvaWQgbGVhdmVNQkIoKSB7fTsKKworICAvLy8gTm90aWZ5IHRoaXMgc3RyYXRlZ3kgdGhhdCBhbGwgcm9vdHMgaGF2ZSBiZWVuIHJlbGVhc2VkIChpbmNsdWRpbmcgdGhvc2UKKyAgLy8vIHRoYXQgZGVwZW5kIG9uIEVudHJ5U1Ugb3IgRXhpdFNVKS4KKyAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyUm9vdHMoKSB7fQorCisgIC8vLyBQaWNrIHRoZSBuZXh0IG5vZGUgdG8gc2NoZWR1bGUsIG9yIHJldHVybiBOVUxMLiBTZXQgSXNUb3BOb2RlIHRvIHRydWUgdG8KKyAgLy8vIHNjaGVkdWxlIHRoZSBub2RlIGF0IHRoZSB0b3Agb2YgdGhlIHVuc2NoZWR1bGVkIHJlZ2lvbi4gT3RoZXJ3aXNlIGl0IHdpbGwKKyAgLy8vIGJlIHNjaGVkdWxlZCBhdCB0aGUgYm90dG9tLgorICB2aXJ0dWFsIFNVbml0ICpwaWNrTm9kZShib29sICZJc1RvcE5vZGUpID0gMDsKKworICAvLy8gXGJyaWVmIFNjaGVkdWxlciBjYWxsYmFjayB0byBub3RpZnkgdGhhdCBhIG5ldyBzdWJ0cmVlIGlzIHNjaGVkdWxlZC4KKyAgdmlydHVhbCB2b2lkIHNjaGVkdWxlVHJlZSh1bnNpZ25lZCBTdWJ0cmVlSUQpIHt9CisKKyAgLy8vIE5vdGlmeSBNYWNoaW5lU2NoZWRTdHJhdGVneSB0aGF0IFNjaGVkdWxlREFHTUkgaGFzIHNjaGVkdWxlZCBhbgorICAvLy8gaW5zdHJ1Y3Rpb24gYW5kIHVwZGF0ZWQgc2NoZWR1bGVkL3JlbWFpbmluZyBmbGFncyBpbiB0aGUgREFHIG5vZGVzLgorICB2aXJ0dWFsIHZvaWQgc2NoZWROb2RlKFNVbml0ICpTVSwgYm9vbCBJc1RvcE5vZGUpID0gMDsKKworICAvLy8gV2hlbiBhbGwgcHJlZGVjZXNzb3IgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiByZXNvbHZlZCwgZnJlZSB0aGlzIG5vZGUgZm9yCisgIC8vLyB0b3AtZG93biBzY2hlZHVsaW5nLgorICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVRvcE5vZGUoU1VuaXQgKlNVKSA9IDA7CisKKyAgLy8vIFdoZW4gYWxsIHN1Y2Nlc3NvciBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIHJlc29sdmVkLCBmcmVlIHRoaXMgbm9kZSBmb3IKKyAgLy8vIGJvdHRvbS11cCBzY2hlZHVsaW5nLgorICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJvdHRvbU5vZGUoU1VuaXQgKlNVKSA9IDA7Cit9OworCisvLy8gU2NoZWR1bGVEQUdNSSBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBTY2hlZHVsZURBR0luc3RycyB0aGF0IHNpbXBseQorLy8vIHNjaGVkdWxlcyBtYWNoaW5lIGluc3RydWN0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIE1hY2hpbmVTY2hlZFN0cmF0ZWd5CisvLy8gd2l0aG91dCBtdWNoIGV4dHJhIGJvb2sta2VlcGluZy4gVGhpcyBpcyB0aGUgY29tbW9uIGZ1bmN0aW9uYWxpdHkgYmV0d2VlbgorLy8vIFByZVJBIGFuZCBQb3N0UkEgTWFjaGluZVNjaGVkdWxlci4KK2NsYXNzIFNjaGVkdWxlREFHTUkgOiBwdWJsaWMgU2NoZWR1bGVEQUdJbnN0cnMgeworcHJvdGVjdGVkOgorICBBbGlhc0FuYWx5c2lzICpBQTsKKyAgTGl2ZUludGVydmFscyAqTElTOworICBzdGQ6OnVuaXF1ZV9wdHI8TWFjaGluZVNjaGVkU3RyYXRlZ3k+IFNjaGVkSW1wbDsKKworICAvLy8gVG9wbyAtIEEgdG9wb2xvZ2ljYWwgb3JkZXJpbmcgZm9yIFNVbml0cyB3aGljaCBwZXJtaXRzIGZhc3QgSXNSZWFjaGFibGUKKyAgLy8vIGFuZCBzaW1pbGFyIHF1ZXJpZXMuCisgIFNjaGVkdWxlREFHVG9wb2xvZ2ljYWxTb3J0IFRvcG87CisKKyAgLy8vIE9yZGVyZWQgbGlzdCBvZiBEQUcgcG9zdHByb2Nlc3Npbmcgc3RlcHMuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxTY2hlZHVsZURBR011dGF0aW9uPj4gTXV0YXRpb25zOworCisgIC8vLyBUaGUgdG9wIG9mIHRoZSB1bnNjaGVkdWxlZCB6b25lLgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgQ3VycmVudFRvcDsKKworICAvLy8gVGhlIGJvdHRvbSBvZiB0aGUgdW5zY2hlZHVsZWQgem9uZS4KKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEN1cnJlbnRCb3R0b207CisKKyAgLy8vIFJlY29yZCB0aGUgbmV4dCBub2RlIGluIGEgc2NoZWR1bGVkIGNsdXN0ZXIuCisgIGNvbnN0IFNVbml0ICpOZXh0Q2x1c3RlclByZWQgPSBudWxscHRyOworICBjb25zdCBTVW5pdCAqTmV4dENsdXN0ZXJTdWNjID0gbnVsbHB0cjsKKworI2lmbmRlZiBOREVCVUcKKyAgLy8vIFRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHNjaGVkdWxlZCBzbyBmYXIuIFVzZWQgdG8gY3V0IG9mZiB0aGUKKyAgLy8vIHNjaGVkdWxlciBhdCB0aGUgcG9pbnQgZGV0ZXJtaW5lZCBieSBtaXNjaGVkLWN1dG9mZi4KKyAgdW5zaWduZWQgTnVtSW5zdHJzU2NoZWR1bGVkID0gMDsKKyNlbmRpZgorCitwdWJsaWM6CisgIFNjaGVkdWxlREFHTUkoTWFjaGluZVNjaGVkQ29udGV4dCAqQywgc3RkOjp1bmlxdWVfcHRyPE1hY2hpbmVTY2hlZFN0cmF0ZWd5PiBTLAorICAgICAgICAgICAgICAgIGJvb2wgUmVtb3ZlS2lsbEZsYWdzKQorICAgICAgOiBTY2hlZHVsZURBR0luc3RycygqQy0+TUYsIEMtPk1MSSwgUmVtb3ZlS2lsbEZsYWdzKSwgQUEoQy0+QUEpLAorICAgICAgICBMSVMoQy0+TElTKSwgU2NoZWRJbXBsKHN0ZDo6bW92ZShTKSksIFRvcG8oU1VuaXRzLCAmRXhpdFNVKSB7fQorCisgIC8vIFByb3ZpZGUgYSB2dGFibGUgYW5jaG9yCisgIH5TY2hlZHVsZURBR01JKCkgb3ZlcnJpZGU7CisKKyAgLy8vIElmIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSwgaGFuZGxpbmcgb2YgdGhlIHNjaGVkdWxpbmcgcmVnaW9ucworICAvLy8gdGhlbXNlbHZlcyAoaW4gY2FzZSBvZiBhIHNjaGVkdWxpbmcgYm91bmRhcnkgaW4gTUJCKSB3aWxsIGJlIGRvbmUKKyAgLy8vIGJlZ2lubmluZyB3aXRoIHRoZSB0b3Btb3N0IHJlZ2lvbiBvZiBNQkIuCisgIGJvb2wgZG9NQkJTY2hlZFJlZ2lvbnNUb3BEb3duKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBTY2hlZEltcGwtPmRvTUJCU2NoZWRSZWdpb25zVG9wRG93bigpOworICB9CisKKyAgLy8gUmV0dXJucyBMaXZlSW50ZXJ2YWxzIGluc3RhbmNlIGZvciB1c2UgaW4gREFHIG11dGF0b3JzIGFuZCBzdWNoLgorICBMaXZlSW50ZXJ2YWxzICpnZXRMSVMoKSBjb25zdCB7IHJldHVybiBMSVM7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBEQUcgc3VwcG9ydHMgVlJlZyBsaXZlbmVzcyBhbmQgUmVnUHJlc3N1cmUuCisgIHZpcnR1YWwgYm9vbCBoYXNWUmVnTGl2ZW5lc3MoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBBZGQgYSBwb3N0cHJvY2Vzc2luZyBzdGVwIHRvIHRoZSBEQUcgYnVpbGRlci4KKyAgLy8vIE11dGF0aW9ucyBhcmUgYXBwbGllZCBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSBhZGRlZCBhZnRlciBub3JtYWwgREFHCisgIC8vLyBidWlsZGluZyBhbmQgYmVmb3JlIE1hY2hpbmVTY2hlZFN0cmF0ZWd5IGluaXRpYWxpemF0aW9uLgorICAvLy8KKyAgLy8vIFNjaGVkdWxlREFHTUkgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBNdXRhdGlvbiBvYmplY3QuCisgIHZvaWQgYWRkTXV0YXRpb24oc3RkOjp1bmlxdWVfcHRyPFNjaGVkdWxlREFHTXV0YXRpb24+IE11dGF0aW9uKSB7CisgICAgaWYgKE11dGF0aW9uKQorICAgICAgTXV0YXRpb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoTXV0YXRpb24pKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiBhbiBlZGdlIGNhbiBiZSBhZGRlZCBmcm9tIFByZWRTVSB0byBTdWNjU1Ugd2l0aG91dCBjcmVhdGluZworICAvLy8gYSBjeWNsZS4KKyAgYm9vbCBjYW5BZGRFZGdlKFNVbml0ICpTdWNjU1UsIFNVbml0ICpQcmVkU1UpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgREFHIGVkZ2UgdG8gdGhlIGdpdmVuIFNVIHdpdGggdGhlIGdpdmVuIHByZWRlY2Vzc29yCisgIC8vLyBkZXBlbmRlbmNlIGRhdGEuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGUgZWRnZSBtYXkgYmUgYWRkZWQgd2l0aG91dCBjcmVhdGluZyBhIGN5Y2xlIE9SIGlmIGFuCisgIC8vLyBlcXVpdmFsZW50IGVkZ2UgYWxyZWFkeSBleGlzdGVkIChmYWxzZSBpbmRpY2F0ZXMgZmFpbHVyZSkuCisgIGJvb2wgYWRkRWRnZShTVW5pdCAqU3VjY1NVLCBjb25zdCBTRGVwICZQcmVkRGVwKTsKKworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgdG9wKCkgY29uc3QgeyByZXR1cm4gQ3VycmVudFRvcDsgfQorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgYm90dG9tKCkgY29uc3QgeyByZXR1cm4gQ3VycmVudEJvdHRvbTsgfQorCisgIC8vLyBJbXBsZW1lbnQgdGhlIFNjaGVkdWxlREFHSW5zdHJzIGludGVyZmFjZSBmb3IgaGFuZGxpbmcgdGhlIG5leHQgc2NoZWR1bGluZworICAvLy8gcmVnaW9uLiBUaGlzIGNvdmVycyBhbGwgaW5zdHJ1Y3Rpb25zIGluIGEgYmxvY2ssIHdoaWxlIHNjaGVkdWxlKCkgbWF5IG9ubHkKKyAgLy8vIGNvdmVyIGEgc3Vic2V0LgorICB2b2lkIGVudGVyUmVnaW9uKE1hY2hpbmVCYXNpY0Jsb2NrICpiYiwKKyAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgYmVnaW4sCisgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIGVuZCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByZWdpb25pbnN0cnMpIG92ZXJyaWRlOworCisgIC8vLyBJbXBsZW1lbnQgU2NoZWR1bGVEQUdJbnN0cnMgaW50ZXJmYWNlIGZvciBzY2hlZHVsaW5nIGEgc2VxdWVuY2Ugb2YKKyAgLy8vIHJlb3JkZXJhYmxlIGluc3RydWN0aW9ucy4KKyAgdm9pZCBzY2hlZHVsZSgpIG92ZXJyaWRlOworCisgIHZvaWQgc3RhcnRCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqYmIpIG92ZXJyaWRlOworICB2b2lkIGZpbmlzaEJsb2NrKCkgb3ZlcnJpZGU7CisKKyAgLy8vIENoYW5nZSB0aGUgcG9zaXRpb24gb2YgYW4gaW5zdHJ1Y3Rpb24gd2l0aGluIHRoZSBiYXNpYyBibG9jayBhbmQgdXBkYXRlCisgIC8vLyBsaXZlIHJhbmdlcyBhbmQgcmVnaW9uIGJvdW5kYXJ5IGl0ZXJhdG9ycy4KKyAgdm9pZCBtb3ZlSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICpNSSwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEluc2VydFBvcyk7CisKKyAgY29uc3QgU1VuaXQgKmdldE5leHRDbHVzdGVyUHJlZCgpIGNvbnN0IHsgcmV0dXJuIE5leHRDbHVzdGVyUHJlZDsgfQorCisgIGNvbnN0IFNVbml0ICpnZXROZXh0Q2x1c3RlclN1Y2MoKSBjb25zdCB7IHJldHVybiBOZXh0Q2x1c3RlclN1Y2M7IH0KKworICB2b2lkIHZpZXdHcmFwaChjb25zdCBUd2luZSAmTmFtZSwgY29uc3QgVHdpbmUgJlRpdGxlKSBvdmVycmlkZTsKKyAgdm9pZCB2aWV3R3JhcGgoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAvLyBUb3AtTGV2ZWwgZW50cnkgcG9pbnRzIGZvciB0aGUgc2NoZWR1bGUoKSBkcml2ZXIuLi4KKworICAvLy8gQXBwbHkgZWFjaCBTY2hlZHVsZURBR011dGF0aW9uIHN0ZXAgaW4gb3JkZXIuIFRoaXMgYWxsb3dzIGRpZmZlcmVudAorICAvLy8gaW5zdGFuY2VzIG9mIFNjaGVkdWxlREFHTUkgdG8gcGVyZm9ybSBjdXN0b20gREFHIHBvc3Rwcm9jZXNzaW5nLgorICB2b2lkIHBvc3Rwcm9jZXNzREFHKCk7CisKKyAgLy8vIFJlbGVhc2UgRXhpdFNVIHByZWRlY2Vzc29ycyBhbmQgc2V0dXAgc2NoZWR1bGVyIHF1ZXVlcy4KKyAgdm9pZCBpbml0UXVldWVzKEFycmF5UmVmPFNVbml0Kj4gVG9wUm9vdHMsIEFycmF5UmVmPFNVbml0Kj4gQm90Um9vdHMpOworCisgIC8vLyBVcGRhdGUgc2NoZWR1bGVyIERBRyBhbmQgcXVldWVzIGFmdGVyIHNjaGVkdWxpbmcgYW4gaW5zdHJ1Y3Rpb24uCisgIHZvaWQgdXBkYXRlUXVldWVzKFNVbml0ICpTVSwgYm9vbCBJc1RvcE5vZGUpOworCisgIC8vLyBSZWluc2VydCBkZWJ1Z192YWx1ZXMgcmVjb3JkZWQgaW4gU2NoZWR1bGVEQUdJbnN0cnM6OkRiZ1ZhbHVlcy4KKyAgdm9pZCBwbGFjZURlYnVnVmFsdWVzKCk7CisKKyAgLy8vIFxicmllZiBkdW1wIHRoZSBzY2hlZHVsZWQgU2VxdWVuY2UuCisgIHZvaWQgZHVtcFNjaGVkdWxlKCkgY29uc3Q7CisKKyAgLy8gTGVzc2VyIGhlbHBlcnMuLi4KKyAgYm9vbCBjaGVja1NjaGVkTGltaXQoKTsKKworICB2b2lkIGZpbmRSb290c0FuZEJpYXNFZGdlcyhTbWFsbFZlY3RvckltcGw8U1VuaXQqPiAmVG9wUm9vdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTVW5pdCo+ICZCb3RSb290cyk7CisKKyAgdm9pZCByZWxlYXNlU3VjYyhTVW5pdCAqU1UsIFNEZXAgKlN1Y2NFZGdlKTsKKyAgdm9pZCByZWxlYXNlU3VjY2Vzc29ycyhTVW5pdCAqU1UpOworICB2b2lkIHJlbGVhc2VQcmVkKFNVbml0ICpTVSwgU0RlcCAqUHJlZEVkZ2UpOworICB2b2lkIHJlbGVhc2VQcmVkZWNlc3NvcnMoU1VuaXQgKlNVKTsKK307CisKKy8vLyBTY2hlZHVsZURBR01JTGl2ZSBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBTY2hlZHVsZURBR0luc3RycyB0aGF0IHNjaGVkdWxlcworLy8vIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIHdoaWxlIHVwZGF0aW5nIExpdmVJbnRlcnZhbHMgYW5kIHRyYWNraW5nIHJlZ3ByZXNzdXJlLgorY2xhc3MgU2NoZWR1bGVEQUdNSUxpdmUgOiBwdWJsaWMgU2NoZWR1bGVEQUdNSSB7Citwcm90ZWN0ZWQ6CisgIFJlZ2lzdGVyQ2xhc3NJbmZvICpSZWdDbGFzc0luZm87CisKKyAgLy8vIEluZm9ybWF0aW9uIGFib3V0IERBRyBzdWJ0cmVlcy4gSWYgREZTUmVzdWx0IGlzIE5VTEwsIHRoZW4gU2NoZWR1bGVyVHJlZXMKKyAgLy8vIHdpbGwgYmUgZW1wdHkuCisgIFNjaGVkREZTUmVzdWx0ICpERlNSZXN1bHQgPSBudWxscHRyOworICBCaXRWZWN0b3IgU2NoZWR1bGVkVHJlZXM7CisKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIExpdmVSZWdpb25FbmQ7CisKKyAgLy8vIE1hcHMgdnJlZ3MgdG8gdGhlIFNVbml0cyBvZiB0aGVpciB1c2VzIGluIHRoZSBjdXJyZW50IHNjaGVkdWxpbmcgcmVnaW9uLgorICBWUmVnMlNVbml0TXVsdGlNYXAgVlJlZ1VzZXM7CisKKyAgLy8gTWFwIGVhY2ggU1UgdG8gaXRzIHN1bW1hcnkgb2YgcHJlc3N1cmUgY2hhbmdlcy4gVGhpcyBhcnJheSBpcyB1cGRhdGVkIGZvcgorICAvLyBsaXZlbmVzcyBkdXJpbmcgYm90dG9tLXVwIHNjaGVkdWxpbmcuIFRvcC1kb3duIHNjaGVkdWxpbmcgbWF5IHByb2NlZWQgYnV0CisgIC8vIGhhcyBubyBhZmZlY3Qgb24gdGhlIHByZXNzdXJlIGRpZmZzLgorICBQcmVzc3VyZURpZmZzIFNVUHJlc3N1cmVEaWZmczsKKworICAvLy8gUmVnaXN0ZXIgcHJlc3N1cmUgaW4gdGhpcyByZWdpb24gY29tcHV0ZWQgYnkgaW5pdFJlZ1ByZXNzdXJlLgorICBib29sIFNob3VsZFRyYWNrUHJlc3N1cmUgPSBmYWxzZTsKKyAgYm9vbCBTaG91bGRUcmFja0xhbmVNYXNrcyA9IGZhbHNlOworICBJbnRlcnZhbFByZXNzdXJlIFJlZ1ByZXNzdXJlOworICBSZWdQcmVzc3VyZVRyYWNrZXIgUlBUcmFja2VyOworCisgIC8vLyBMaXN0IG9mIHByZXNzdXJlIHNldHMgdGhhdCBleGNlZWQgdGhlIHRhcmdldCdzIHByZXNzdXJlIGxpbWl0IGJlZm9yZQorICAvLy8gc2NoZWR1bGluZywgbGlzdGVkIGluIGluY3JlYXNpbmcgc2V0IElEIG9yZGVyLiBFYWNoIHByZXNzdXJlIHNldCBpcyBwYWlyZWQKKyAgLy8vIHdpdGggaXRzIG1heCBwcmVzc3VyZSBpbiB0aGUgY3VycmVudGx5IHNjaGVkdWxlZCByZWdpb25zLgorICBzdGQ6OnZlY3RvcjxQcmVzc3VyZUNoYW5nZT4gUmVnaW9uQ3JpdGljYWxQU2V0czsKKworICAvLy8gVGhlIHRvcCBvZiB0aGUgdW5zY2hlZHVsZWQgem9uZS4KKyAgSW50ZXJ2YWxQcmVzc3VyZSBUb3BQcmVzc3VyZTsKKyAgUmVnUHJlc3N1cmVUcmFja2VyIFRvcFJQVHJhY2tlcjsKKworICAvLy8gVGhlIGJvdHRvbSBvZiB0aGUgdW5zY2hlZHVsZWQgem9uZS4KKyAgSW50ZXJ2YWxQcmVzc3VyZSBCb3RQcmVzc3VyZTsKKyAgUmVnUHJlc3N1cmVUcmFja2VyIEJvdFJQVHJhY2tlcjsKKworICAvLy8gVHJ1ZSBpZiBkaXNjb25uZWN0ZWQgc3VicmVnaXN0ZXIgY29tcG9uZW50cyBhcmUgYWxyZWFkeSByZW5hbWVkLgorICAvLy8gVGhlIHJlbmFtaW5nIGlzIG9ubHkgZG9uZSBvbiBkZW1hbmQgaWYgbGFuZSBtYXNrcyBhcmUgdHJhY2tlZC4KKyAgYm9vbCBEaXNjb25uZWN0ZWRDb21wb25lbnRzUmVuYW1lZCA9IGZhbHNlOworCitwdWJsaWM6CisgIFNjaGVkdWxlREFHTUlMaXZlKE1hY2hpbmVTY2hlZENvbnRleHQgKkMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNYWNoaW5lU2NoZWRTdHJhdGVneT4gUykKKyAgICAgIDogU2NoZWR1bGVEQUdNSShDLCBzdGQ6Om1vdmUoUyksIC8qUmVtb3ZlS2lsbEZsYWdzPSovZmFsc2UpLAorICAgICAgICBSZWdDbGFzc0luZm8oQy0+UmVnQ2xhc3NJbmZvKSwgUlBUcmFja2VyKFJlZ1ByZXNzdXJlKSwKKyAgICAgICAgVG9wUlBUcmFja2VyKFRvcFByZXNzdXJlKSwgQm90UlBUcmFja2VyKEJvdFByZXNzdXJlKSB7fQorCisgIH5TY2hlZHVsZURBR01JTGl2ZSgpIG92ZXJyaWRlOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIERBRyBzdXBwb3J0cyBWUmVnIGxpdmVuZXNzIGFuZCBSZWdQcmVzc3VyZS4KKyAgYm9vbCBoYXNWUmVnTGl2ZW5lc3MoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiByZWdpc3RlciBwcmVzc3VyZSB0cmFja2luZyBpcyBlbmFibGVkLgorICBib29sIGlzVHJhY2tpbmdQcmVzc3VyZSgpIGNvbnN0IHsgcmV0dXJuIFNob3VsZFRyYWNrUHJlc3N1cmU7IH0KKworICAvLy8gR2V0IGN1cnJlbnQgcmVnaXN0ZXIgcHJlc3N1cmUgZm9yIHRoZSB0b3Agc2NoZWR1bGVkIGluc3RydWN0aW9ucy4KKyAgY29uc3QgSW50ZXJ2YWxQcmVzc3VyZSAmZ2V0VG9wUHJlc3N1cmUoKSBjb25zdCB7IHJldHVybiBUb3BQcmVzc3VyZTsgfQorICBjb25zdCBSZWdQcmVzc3VyZVRyYWNrZXIgJmdldFRvcFJQVHJhY2tlcigpIGNvbnN0IHsgcmV0dXJuIFRvcFJQVHJhY2tlcjsgfQorCisgIC8vLyBHZXQgY3VycmVudCByZWdpc3RlciBwcmVzc3VyZSBmb3IgdGhlIGJvdHRvbSBzY2hlZHVsZWQgaW5zdHJ1Y3Rpb25zLgorICBjb25zdCBJbnRlcnZhbFByZXNzdXJlICZnZXRCb3RQcmVzc3VyZSgpIGNvbnN0IHsgcmV0dXJuIEJvdFByZXNzdXJlOyB9CisgIGNvbnN0IFJlZ1ByZXNzdXJlVHJhY2tlciAmZ2V0Qm90UlBUcmFja2VyKCkgY29uc3QgeyByZXR1cm4gQm90UlBUcmFja2VyOyB9CisKKyAgLy8vIEdldCByZWdpc3RlciBwcmVzc3VyZSBmb3IgdGhlIGVudGlyZSBzY2hlZHVsaW5nIHJlZ2lvbiBiZWZvcmUgc2NoZWR1bGluZy4KKyAgY29uc3QgSW50ZXJ2YWxQcmVzc3VyZSAmZ2V0UmVnUHJlc3N1cmUoKSBjb25zdCB7IHJldHVybiBSZWdQcmVzc3VyZTsgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPFByZXNzdXJlQ2hhbmdlPiAmZ2V0UmVnaW9uQ3JpdGljYWxQU2V0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVnaW9uQ3JpdGljYWxQU2V0czsKKyAgfQorCisgIFByZXNzdXJlRGlmZiAmZ2V0UHJlc3N1cmVEaWZmKGNvbnN0IFNVbml0ICpTVSkgeworICAgIHJldHVybiBTVVByZXNzdXJlRGlmZnNbU1UtPk5vZGVOdW1dOworICB9CisKKyAgLy8vIENvbXB1dGUgYSBERlNSZXN1bHQgYWZ0ZXIgREFHIGJ1aWxkaW5nIGlzIGNvbXBsZXRlLCBhbmQgYmVmb3JlIGFueQorICAvLy8gcXVldWUgY29tcGFyaXNvbnMuCisgIHZvaWQgY29tcHV0ZURGU1Jlc3VsdCgpOworCisgIC8vLyBSZXR1cm4gYSBub24tbnVsbCBERlMgcmVzdWx0IGlmIHRoZSBzY2hlZHVsaW5nIHN0cmF0ZWd5IGluaXRpYWxpemVkIGl0LgorICBjb25zdCBTY2hlZERGU1Jlc3VsdCAqZ2V0REZTUmVzdWx0KCkgY29uc3QgeyByZXR1cm4gREZTUmVzdWx0OyB9CisKKyAgQml0VmVjdG9yICZnZXRTY2hlZHVsZWRUcmVlcygpIHsgcmV0dXJuIFNjaGVkdWxlZFRyZWVzOyB9CisKKyAgLy8vIEltcGxlbWVudCB0aGUgU2NoZWR1bGVEQUdJbnN0cnMgaW50ZXJmYWNlIGZvciBoYW5kbGluZyB0aGUgbmV4dCBzY2hlZHVsaW5nCisgIC8vLyByZWdpb24uIFRoaXMgY292ZXJzIGFsbCBpbnN0cnVjdGlvbnMgaW4gYSBibG9jaywgd2hpbGUgc2NoZWR1bGUoKSBtYXkgb25seQorICAvLy8gY292ZXIgYSBzdWJzZXQuCisgIHZvaWQgZW50ZXJSZWdpb24oTWFjaGluZUJhc2ljQmxvY2sgKmJiLAorICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgZW5kLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlZ2lvbmluc3Rycykgb3ZlcnJpZGU7CisKKyAgLy8vIEltcGxlbWVudCBTY2hlZHVsZURBR0luc3RycyBpbnRlcmZhY2UgZm9yIHNjaGVkdWxpbmcgYSBzZXF1ZW5jZSBvZgorICAvLy8gcmVvcmRlcmFibGUgaW5zdHJ1Y3Rpb25zLgorICB2b2lkIHNjaGVkdWxlKCkgb3ZlcnJpZGU7CisKKyAgLy8vIENvbXB1dGUgdGhlIGN5Y2xpYyBjcml0aWNhbCBwYXRoIHRocm91Z2ggdGhlIERBRy4KKyAgdW5zaWduZWQgY29tcHV0ZUN5Y2xpY0NyaXRpY2FsUGF0aCgpOworCitwcm90ZWN0ZWQ6CisgIC8vIFRvcC1MZXZlbCBlbnRyeSBwb2ludHMgZm9yIHRoZSBzY2hlZHVsZSgpIGRyaXZlci4uLgorCisgIC8vLyBDYWxsIFNjaGVkdWxlREFHSW5zdHJzOjpidWlsZFNjaGVkR3JhcGggd2l0aCByZWdpc3RlciBwcmVzc3VyZSB0cmFja2luZworICAvLy8gZW5hYmxlZC4gVGhpcyBzZXRzIHVwIHRocmVlIHRyYWNrZXJzLiBSUFRyYWNrZXIgd2lsbCBjb3ZlciB0aGUgZW50aXJlIERBRworICAvLy8gcmVnaW9uLCBUb3BUcmFja2VyIGFuZCBCb3R0b21UcmFja2VyIHdpbGwgYmUgaW5pdGlhbGl6ZWQgdG8gdGhlIHRvcCBhbmQKKyAgLy8vIGJvdHRvbSBvZiB0aGUgREFHIHJlZ2lvbiB3aXRob3V0IGNvdmVyZWluZyBhbnkgdW5zY2hlZHVsZWQgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgYnVpbGREQUdXaXRoUmVnUHJlc3N1cmUoKTsKKworICAvLy8gUmVsZWFzZSBFeGl0U1UgcHJlZGVjZXNzb3JzIGFuZCBzZXR1cCBzY2hlZHVsZXIgcXVldWVzLiBSZS1wb3NpdGlvbgorICAvLy8gdGhlIFRvcCBSUCB0cmFja2VyIGluIGNhc2UgdGhlIHJlZ2lvbiBiZWdpbm5pbmcgaGFzIGNoYW5nZWQuCisgIHZvaWQgaW5pdFF1ZXVlcyhBcnJheVJlZjxTVW5pdCo+IFRvcFJvb3RzLCBBcnJheVJlZjxTVW5pdCo+IEJvdFJvb3RzKTsKKworICAvLy8gTW92ZSBhbiBpbnN0cnVjdGlvbiBhbmQgdXBkYXRlIHJlZ2lzdGVyIHByZXNzdXJlLgorICB2b2lkIHNjaGVkdWxlTUkoU1VuaXQgKlNVLCBib29sIElzVG9wTm9kZSk7CisKKyAgLy8gTGVzc2VyIGhlbHBlcnMuLi4KKworICB2b2lkIGluaXRSZWdQcmVzc3VyZSgpOworCisgIHZvaWQgdXBkYXRlUHJlc3N1cmVEaWZmcyhBcnJheVJlZjxSZWdpc3Rlck1hc2tQYWlyPiBMaXZlVXNlcyk7CisKKyAgdm9pZCB1cGRhdGVTY2hlZHVsZWRQcmVzc3VyZShjb25zdCBTVW5pdCAqU1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZOZXdNYXhQcmVzc3VyZSk7CisKKyAgdm9pZCBjb2xsZWN0VlJlZ1VzZXMoU1VuaXQgJlNVKTsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBIZWxwZXJzIGZvciBpbXBsZW1lbnRpbmcgY3VzdG9tIE1hY2hpbmVTY2hlZFN0cmF0ZWd5IGNsYXNzZXMuIFRoZXNlIHRha2UKKy8vLyBjYXJlIG9mIHRoZSBib29rLWtlZXBpbmcgYXNzb2NpYXRlZCB3aXRoIGxpc3Qgc2NoZWR1bGluZyBoZXVyaXN0aWNzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gUmVhZHlRdWV1ZSBlbmNhcHN1bGF0ZXMgdmVjdG9yIG9mICJyZWFkeSIgU1VuaXRzIHdpdGggYmFzaWMgY29udmVuaWVuY2UKKy8vLyBtZXRob2RzIGZvciBwdXNoaW5nIGFuZCByZW1vdmluZyBub2Rlcy4gUmVhZHlRdWV1ZSdzIGFyZSB1bmlxdWVseSBpZGVudGlmaWVkCisvLy8gYnkgYW4gSUQuIFNVbml0OjpOb2RlUXVldWVJZCBpcyBhIG1hc2sgb2YgdGhlIFJlYWR5UXVldWVzIHRoZSBTVW5pdCBpcyBpbi4KKy8vLworLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBjbGFzcyB0aGF0IG1heSBiZSB1c2VkIGJ5IGltcGxlbWVudGF0aW9ucyBvZgorLy8vIE1hY2hpbmVTY2hlZFN0cmF0ZWd5LgorY2xhc3MgUmVhZHlRdWV1ZSB7CisgIHVuc2lnbmVkIElEOworICBzdGQ6OnN0cmluZyBOYW1lOworICBzdGQ6OnZlY3RvcjxTVW5pdCo+IFF1ZXVlOworCitwdWJsaWM6CisgIFJlYWR5UXVldWUodW5zaWduZWQgaWQsIGNvbnN0IFR3aW5lICZuYW1lKTogSUQoaWQpLCBOYW1lKG5hbWUuc3RyKCkpIHt9CisKKyAgdW5zaWduZWQgZ2V0SUQoKSBjb25zdCB7IHJldHVybiBJRDsgfQorCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorCisgIC8vIFNVIGlzIGluIHRoaXMgcXVldWUgaWYgaXQncyBOb2RlUXVldWVJRCBpcyBhIHN1cGVyc2V0IG9mIHRoaXMgSUQuCisgIGJvb2wgaXNJblF1ZXVlKFNVbml0ICpTVSkgY29uc3QgeyByZXR1cm4gKFNVLT5Ob2RlUXVldWVJZCAmIElEKTsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBRdWV1ZS5lbXB0eSgpOyB9CisKKyAgdm9pZCBjbGVhcigpIHsgUXVldWUuY2xlYXIoKTsgfQorCisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBRdWV1ZS5zaXplKCk7IH0KKworICB1c2luZyBpdGVyYXRvciA9IHN0ZDo6dmVjdG9yPFNVbml0Kj46Oml0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gUXVldWUuYmVnaW4oKTsgfQorCisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIFF1ZXVlLmVuZCgpOyB9CisKKyAgQXJyYXlSZWY8U1VuaXQqPiBlbGVtZW50cygpIHsgcmV0dXJuIFF1ZXVlOyB9CisKKyAgaXRlcmF0b3IgZmluZChTVW5pdCAqU1UpIHsgcmV0dXJuIGxsdm06OmZpbmQoUXVldWUsIFNVKTsgfQorCisgIHZvaWQgcHVzaChTVW5pdCAqU1UpIHsKKyAgICBRdWV1ZS5wdXNoX2JhY2soU1UpOworICAgIFNVLT5Ob2RlUXVldWVJZCB8PSBJRDsKKyAgfQorCisgIGl0ZXJhdG9yIHJlbW92ZShpdGVyYXRvciBJKSB7CisgICAgKCpJKS0+Tm9kZVF1ZXVlSWQgJj0gfklEOworICAgICpJID0gUXVldWUuYmFjaygpOworICAgIHVuc2lnbmVkIGlkeCA9IEkgLSBRdWV1ZS5iZWdpbigpOworICAgIFF1ZXVlLnBvcF9iYWNrKCk7CisgICAgcmV0dXJuIFF1ZXVlLmJlZ2luKCkgKyBpZHg7CisgIH0KKworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKKy8vLyBTdW1tYXJpemUgdGhlIHVuc2NoZWR1bGVkIHJlZ2lvbi4KK3N0cnVjdCBTY2hlZFJlbWFpbmRlciB7CisgIC8vIENyaXRpY2FsIHBhdGggdGhyb3VnaCB0aGUgREFHIGluIGV4cGVjdGVkIGxhdGVuY3kuCisgIHVuc2lnbmVkIENyaXRpY2FsUGF0aDsKKyAgdW5zaWduZWQgQ3ljbGljQ3JpdFBhdGg7CisKKyAgLy8gU2NhbGVkIGNvdW50IG9mIG1pY3JvLW9wcyBsZWZ0IHRvIHNjaGVkdWxlLgorICB1bnNpZ25lZCBSZW1Jc3N1ZUNvdW50OworCisgIGJvb2wgSXNBY3ljbGljTGF0ZW5jeUxpbWl0ZWQ7CisKKyAgLy8gVW5zY2hlZHVsZWQgcmVzb3VyY2VzCisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAxNj4gUmVtYWluaW5nQ291bnRzOworCisgIFNjaGVkUmVtYWluZGVyKCkgeyByZXNldCgpOyB9CisKKyAgdm9pZCByZXNldCgpIHsKKyAgICBDcml0aWNhbFBhdGggPSAwOworICAgIEN5Y2xpY0NyaXRQYXRoID0gMDsKKyAgICBSZW1Jc3N1ZUNvdW50ID0gMDsKKyAgICBJc0FjeWNsaWNMYXRlbmN5TGltaXRlZCA9IGZhbHNlOworICAgIFJlbWFpbmluZ0NvdW50cy5jbGVhcigpOworICB9CisKKyAgdm9pZCBpbml0KFNjaGVkdWxlREFHTUkgKkRBRywgY29uc3QgVGFyZ2V0U2NoZWRNb2RlbCAqU2NoZWRNb2RlbCk7Cit9OworCisvLy8gRWFjaCBTY2hlZHVsaW5nIGJvdW5kYXJ5IGlzIGFzc29jaWF0ZWQgd2l0aCByZWFkeSBxdWV1ZXMuIEl0IHRyYWNrcyB0aGUKKy8vLyBjdXJyZW50IGN5Y2xlIGluIHRoZSBkaXJlY3Rpb24gb2YgbW92ZW1lbnQsIGFuZCBtYWludGFpbnMgdGhlIHN0YXRlCisvLy8gb2YgImhhemFyZHMiIGFuZCBvdGhlciBpbnRlcmxvY2tzIGF0IHRoZSBjdXJyZW50IGN5Y2xlLgorY2xhc3MgU2NoZWRCb3VuZGFyeSB7CitwdWJsaWM6CisgIC8vLyBTVW5pdDo6Tm9kZVF1ZXVlSWQ6IDAgKG5vbmUpLCAxICh0b3ApLCAyIChib3QpLCAzIChib3RoKQorICBlbnVtIHsKKyAgICBUb3BRSUQgPSAxLAorICAgIEJvdFFJRCA9IDIsCisgICAgTG9nTWF4UUlEID0gMgorICB9OworCisgIFNjaGVkdWxlREFHTUkgKkRBRyA9IG51bGxwdHI7CisgIGNvbnN0IFRhcmdldFNjaGVkTW9kZWwgKlNjaGVkTW9kZWwgPSBudWxscHRyOworICBTY2hlZFJlbWFpbmRlciAqUmVtID0gbnVsbHB0cjsKKworICBSZWFkeVF1ZXVlIEF2YWlsYWJsZTsKKyAgUmVhZHlRdWV1ZSBQZW5kaW5nOworCisgIFNjaGVkdWxlSGF6YXJkUmVjb2duaXplciAqSGF6YXJkUmVjID0gbnVsbHB0cjsKKworcHJpdmF0ZToKKyAgLy8vIFRydWUgaWYgdGhlIHBlbmRpbmcgUSBzaG91bGQgYmUgY2hlY2tlZC91cGRhdGVkIGJlZm9yZSBzY2hlZHVsaW5nIGFub3RoZXIKKyAgLy8vIGluc3RydWN0aW9uLgorICBib29sIENoZWNrUGVuZGluZzsKKworICAvLy8gTnVtYmVyIG9mIGN5Y2xlcyBpdCB0YWtlcyB0byBpc3N1ZSB0aGUgaW5zdHJ1Y3Rpb25zIHNjaGVkdWxlZCBpbiB0aGlzCisgIC8vLyB6b25lLiBJdCBpcyBkZWZpbmVkIGFzOiBzY2hlZHVsZWQtbWljcm8tb3BzIC8gaXNzdWUtd2lkdGggKyBzdGFsbHMuCisgIC8vLyBTZWUgZ2V0U3RhbGxzKCkuCisgIHVuc2lnbmVkIEN1cnJDeWNsZTsKKworICAvLy8gTWljcm8tb3BzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBjeWNsZQorICB1bnNpZ25lZCBDdXJyTU9wczsKKworICAvLy8gTWluUmVhZHlDeWNsZSAtIEN5Y2xlIG9mIHRoZSBzb29uZXN0IGF2YWlsYWJsZSBpbnN0cnVjdGlvbi4KKyAgdW5zaWduZWQgTWluUmVhZHlDeWNsZTsKKworICAvLyBUaGUgZXhwZWN0ZWQgbGF0ZW5jeSBvZiB0aGUgY3JpdGljYWwgcGF0aCBpbiB0aGlzIHNjaGVkdWxlZCB6b25lLgorICB1bnNpZ25lZCBFeHBlY3RlZExhdGVuY3k7CisKKyAgLy8gVGhlIGxhdGVuY3kgb2YgZGVwZW5kZW5jZSBjaGFpbnMgbGVhZGluZyBpbnRvIHRoaXMgem9uZS4KKyAgLy8gRm9yIGVhY2ggbm9kZSBzY2hlZHVsZWQgYm90dG9tLXVwOiBETGF0ID0gbWF4IERMYXQsIE4uRGVwdGguCisgIC8vIEZvciBlYWNoIGN5Y2xlIHNjaGVkdWxlZDogRExhdCAtPSAxLgorICB1bnNpZ25lZCBEZXBlbmRlbnRMYXRlbmN5OworCisgIC8vLyBDb3VudCB0aGUgc2NoZWR1bGVkIChpc3N1ZWQpIG1pY3JvLW9wcyB0aGF0IGNhbiBiZSByZXRpcmVkIGJ5CisgIC8vLyB0aW1lPUN1cnJDeWNsZSBhc3N1bWluZyB0aGUgZmlyc3Qgc2NoZWR1bGVkIGluc3RyIGlzIHJldGlyZWQgYXQgdGltZT0wLgorICB1bnNpZ25lZCBSZXRpcmVkTU9wczsKKworICAvLyBDb3VudCBzY2hlZHVsZWQgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGV4ZWN1dGVkLiBSZXNvdXJjZXMgYXJlCisgIC8vIGNvbnNpZGVyZWQgZXhlY3V0ZWQgaWYgdGhleSBiZWNvbWUgcmVhZHkgaW4gdGhlIHRpbWUgdGhhdCBpdCB0YWtlcyB0bworICAvLyBzYXR1cmF0ZSBhbnkgcmVzb3VyY2UgaW5jbHVkaW5nIHRoZSBvbmUgaW4gcXVlc3Rpb24uIENvdW50cyBhcmUgc2NhbGVkCisgIC8vIGZvciBkaXJlY3QgY29tcGFyaXNvbiB3aXRoIG90aGVyIHJlc291cmNlcy4gQ291bnRzIGNhbiBiZSBjb21wYXJlZCB3aXRoCisgIC8vIE1PcHMgKiBnZXRNaWNyb09wRmFjdG9yIGFuZCBMYXRlbmN5ICogZ2V0TGF0ZW5jeUZhY3Rvci4KKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDE2PiBFeGVjdXRlZFJlc0NvdW50czsKKworICAvLy8gQ2FjaGUgdGhlIG1heCBjb3VudCBmb3IgYSBzaW5nbGUgcmVzb3VyY2UuCisgIHVuc2lnbmVkIE1heEV4ZWN1dGVkUmVzQ291bnQ7CisKKyAgLy8gQ2FjaGUgdGhlIGNyaXRpY2FsIHJlc291cmNlcyBJRCBpbiB0aGlzIHNjaGVkdWxlZCB6b25lLgorICB1bnNpZ25lZCBab25lQ3JpdFJlc0lkeDsKKworICAvLyBJcyB0aGUgc2NoZWR1bGVkIHJlZ2lvbiByZXNvdXJjZSBsaW1pdGVkIHZzLiBsYXRlbmN5IGxpbWl0ZWQuCisgIGJvb2wgSXNSZXNvdXJjZUxpbWl0ZWQ7CisKKyAgLy8gUmVjb3JkIHRoZSBoaWdoZXN0IGN5Y2xlIGF0IHdoaWNoIGVhY2ggcmVzb3VyY2UgaGFzIGJlZW4gcmVzZXJ2ZWQgYnkgYQorICAvLyBzY2hlZHVsZWQgaW5zdHJ1Y3Rpb24uCisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAxNj4gUmVzZXJ2ZWRDeWNsZXM7CisKKyNpZm5kZWYgTkRFQlVHCisgIC8vIFJlbWVtYmVyIHRoZSBncmVhdGVzdCBwb3NzaWJsZSBzdGFsbCBhcyBhbiB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mCisgIC8vIHRpbWVzIHdlIHNob3VsZCByZXRyeSB0aGUgcGVuZGluZyBxdWV1ZSBiZWNhdXNlIG9mIGEgaGF6YXJkLgorICB1bnNpZ25lZCBNYXhPYnNlcnZlZFN0YWxsOworI2VuZGlmCisKK3B1YmxpYzoKKyAgLy8vIFBlbmRpbmcgcXVldWVzIGV4dGVuZCB0aGUgcmVhZHkgcXVldWVzIHdpdGggdGhlIHNhbWUgSUQgYW5kIHRoZQorICAvLy8gUGVuZGluZ0ZsYWcgc2V0LgorICBTY2hlZEJvdW5kYXJ5KHVuc2lnbmVkIElELCBjb25zdCBUd2luZSAmTmFtZSk6CisgICAgQXZhaWxhYmxlKElELCBOYW1lKyIuQSIpLCBQZW5kaW5nKElEIDw8IExvZ01heFFJRCwgTmFtZSsiLlAiKSB7CisgICAgcmVzZXQoKTsKKyAgfQorCisgIH5TY2hlZEJvdW5kYXJ5KCk7CisKKyAgdm9pZCByZXNldCgpOworCisgIHZvaWQgaW5pdChTY2hlZHVsZURBR01JICpkYWcsIGNvbnN0IFRhcmdldFNjaGVkTW9kZWwgKnNtb2RlbCwKKyAgICAgICAgICAgIFNjaGVkUmVtYWluZGVyICpyZW0pOworCisgIGJvb2wgaXNUb3AoKSBjb25zdCB7CisgICAgcmV0dXJuIEF2YWlsYWJsZS5nZXRJRCgpID09IFRvcFFJRDsKKyAgfQorCisgIC8vLyBOdW1iZXIgb2YgY3ljbGVzIHRvIGlzc3VlIHRoZSBpbnN0cnVjdGlvbnMgc2NoZWR1bGVkIGluIHRoaXMgem9uZS4KKyAgdW5zaWduZWQgZ2V0Q3VyckN5Y2xlKCkgY29uc3QgeyByZXR1cm4gQ3VyckN5Y2xlOyB9CisKKyAgLy8vIE1pY3JvLW9wcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgY3ljbGUKKyAgdW5zaWduZWQgZ2V0Q3Vyck1PcHMoKSBjb25zdCB7IHJldHVybiBDdXJyTU9wczsgfQorCisgIC8vIFRoZSBsYXRlbmN5IG9mIGRlcGVuZGVuY2UgY2hhaW5zIGxlYWRpbmcgaW50byB0aGlzIHpvbmUuCisgIHVuc2lnbmVkIGdldERlcGVuZGVudExhdGVuY3koKSBjb25zdCB7IHJldHVybiBEZXBlbmRlbnRMYXRlbmN5OyB9CisKKyAgLy8vIEdldCB0aGUgbnVtYmVyIG9mIGxhdGVuY3kgY3ljbGVzICJjb3ZlcmVkIiBieSB0aGUgc2NoZWR1bGVkCisgIC8vLyBpbnN0cnVjdGlvbnMuIFRoaXMgaXMgdGhlIGxhcmdlciBvZiB0aGUgY3JpdGljYWwgcGF0aCB3aXRoaW4gdGhlIHpvbmUKKyAgLy8vIGFuZCB0aGUgbnVtYmVyIG9mIGN5Y2xlcyByZXF1aXJlZCB0byBpc3N1ZSB0aGUgaW5zdHJ1Y3Rpb25zLgorICB1bnNpZ25lZCBnZXRTY2hlZHVsZWRMYXRlbmN5KCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6Om1heChFeHBlY3RlZExhdGVuY3ksIEN1cnJDeWNsZSk7CisgIH0KKworICB1bnNpZ25lZCBnZXRVbnNjaGVkdWxlZExhdGVuY3koU1VuaXQgKlNVKSBjb25zdCB7CisgICAgcmV0dXJuIGlzVG9wKCkgPyBTVS0+Z2V0SGVpZ2h0KCkgOiBTVS0+Z2V0RGVwdGgoKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFJlc291cmNlQ291bnQodW5zaWduZWQgUmVzSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIEV4ZWN1dGVkUmVzQ291bnRzW1Jlc0lkeF07CisgIH0KKworICAvLy8gR2V0IHRoZSBzY2FsZWQgY291bnQgb2Ygc2NoZWR1bGVkIG1pY3JvLW9wcyBhbmQgcmVzb3VyY2VzLCBpbmNsdWRpbmcKKyAgLy8vIGV4ZWN1dGVkIHJlc291cmNlcy4KKyAgdW5zaWduZWQgZ2V0Q3JpdGljYWxDb3VudCgpIGNvbnN0IHsKKyAgICBpZiAoIVpvbmVDcml0UmVzSWR4KQorICAgICAgcmV0dXJuIFJldGlyZWRNT3BzICogU2NoZWRNb2RlbC0+Z2V0TWljcm9PcEZhY3RvcigpOworICAgIHJldHVybiBnZXRSZXNvdXJjZUNvdW50KFpvbmVDcml0UmVzSWR4KTsKKyAgfQorCisgIC8vLyBHZXQgYSBzY2FsZWQgY291bnQgZm9yIHRoZSBtaW5pbXVtIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZSBzY2hlZHVsZWQKKyAgLy8vIG1pY3JvLW9wcyB0aGF0IGFyZSByZWFkeSB0byBleGVjdXRlIGJ5IGdldEV4ZWN1dGVkQ291bnQuIE5vdGljZSB0aGUKKyAgLy8vIGZlZWRiYWNrIGxvb3AuCisgIHVuc2lnbmVkIGdldEV4ZWN1dGVkQ291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6bWF4KEN1cnJDeWNsZSAqIFNjaGVkTW9kZWwtPmdldExhdGVuY3lGYWN0b3IoKSwKKyAgICAgICAgICAgICAgICAgICAgTWF4RXhlY3V0ZWRSZXNDb3VudCk7CisgIH0KKworICB1bnNpZ25lZCBnZXRab25lQ3JpdFJlc0lkeCgpIGNvbnN0IHsgcmV0dXJuIFpvbmVDcml0UmVzSWR4OyB9CisKKyAgLy8gSXMgdGhlIHNjaGVkdWxlZCByZWdpb24gcmVzb3VyY2UgbGltaXRlZCB2cy4gbGF0ZW5jeSBsaW1pdGVkLgorICBib29sIGlzUmVzb3VyY2VMaW1pdGVkKCkgY29uc3QgeyByZXR1cm4gSXNSZXNvdXJjZUxpbWl0ZWQ7IH0KKworICAvLy8gR2V0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGdpdmVuIFNVbml0J3MgcmVhZHkgdGltZSBhbmQgdGhlIGN1cnJlbnQKKyAgLy8vIGN5Y2xlLgorICB1bnNpZ25lZCBnZXRMYXRlbmN5U3RhbGxDeWNsZXMoU1VuaXQgKlNVKTsKKworICB1bnNpZ25lZCBnZXROZXh0UmVzb3VyY2VDeWNsZSh1bnNpZ25lZCBQSWR4LCB1bnNpZ25lZCBDeWNsZXMpOworCisgIGJvb2wgY2hlY2tIYXphcmQoU1VuaXQgKlNVKTsKKworICB1bnNpZ25lZCBmaW5kTWF4TGF0ZW5jeShBcnJheVJlZjxTVW5pdCo+IFJlYWR5U1VzKTsKKworICB1bnNpZ25lZCBnZXRPdGhlclJlc291cmNlQ291bnQodW5zaWduZWQgJk90aGVyQ3JpdElkeCk7CisKKyAgdm9pZCByZWxlYXNlTm9kZShTVW5pdCAqU1UsIHVuc2lnbmVkIFJlYWR5Q3ljbGUpOworCisgIHZvaWQgYnVtcEN5Y2xlKHVuc2lnbmVkIE5leHRDeWNsZSk7CisKKyAgdm9pZCBpbmNFeGVjdXRlZFJlc291cmNlcyh1bnNpZ25lZCBQSWR4LCB1bnNpZ25lZCBDb3VudCk7CisKKyAgdW5zaWduZWQgY291bnRSZXNvdXJjZSh1bnNpZ25lZCBQSWR4LCB1bnNpZ25lZCBDeWNsZXMsIHVuc2lnbmVkIFJlYWR5Q3ljbGUpOworCisgIHZvaWQgYnVtcE5vZGUoU1VuaXQgKlNVKTsKKworICB2b2lkIHJlbGVhc2VQZW5kaW5nKCk7CisKKyAgdm9pZCByZW1vdmVSZWFkeShTVW5pdCAqU1UpOworCisgIC8vLyBDYWxsIHRoaXMgYmVmb3JlIGFwcGx5aW5nIGFueSBvdGhlciBoZXVyaXN0aWNzIHRvIHRoZSBBdmFpbGFibGUgcXVldWUuCisgIC8vLyBVcGRhdGVzIHRoZSBBdmFpbGFibGUvUGVuZGluZyBRJ3MgaWYgbmVjZXNzYXJ5IGFuZCByZXR1cm5zIHRoZSBzaW5nbGUKKyAgLy8vIGF2YWlsYWJsZSBpbnN0cnVjdGlvbiwgb3IgTlVMTCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgY2FuZGlkYXRlcy4KKyAgU1VuaXQgKnBpY2tPbmx5Q2hvaWNlKCk7CisKKyAgdm9pZCBkdW1wU2NoZWR1bGVkU3RhdGUoKSBjb25zdDsKK307CisKKy8vLyBCYXNlIGNsYXNzIGZvciBHZW5lcmljU2NoZWR1bGVyLiBUaGlzIGNsYXNzIG1haW50YWlucyBpbmZvcm1hdGlvbiBhYm91dAorLy8vIHNjaGVkdWxpbmcgY2FuZGlkYXRlcyBiYXNlZCBvbiBUYXJnZXRTY2hlZE1vZGVsIG1ha2luZyBpdCBlYXN5IHRvIGltcGxlbWVudAorLy8vIGhldXJpc3RpY3MgZm9yIGVpdGhlciBwcmVSQSBvciBwb3N0UkEgc2NoZWR1bGluZy4KK2NsYXNzIEdlbmVyaWNTY2hlZHVsZXJCYXNlIDogcHVibGljIE1hY2hpbmVTY2hlZFN0cmF0ZWd5IHsKK3B1YmxpYzoKKyAgLy8vIFJlcHJlc2VudCB0aGUgdHlwZSBvZiBTY2hlZENhbmRpZGF0ZSBmb3VuZCB3aXRoaW4gYSBzaW5nbGUgcXVldWUuCisgIC8vLyBwaWNrTm9kZUJpZGlyZWN0aW9uYWwgZGVwZW5kcyBvbiB0aGVzZSBsaXN0ZWQgYnkgZGVjcmVhc2luZyBwcmlvcml0eS4KKyAgZW51bSBDYW5kUmVhc29uIDogdWludDhfdCB7CisgICAgTm9DYW5kLCBPbmx5MSwgUGh5c1JlZ0NvcHksIFJlZ0V4Y2VzcywgUmVnQ3JpdGljYWwsIFN0YWxsLCBDbHVzdGVyLCBXZWFrLAorICAgIFJlZ01heCwgUmVzb3VyY2VSZWR1Y2UsIFJlc291cmNlRGVtYW5kLCBCb3RIZWlnaHRSZWR1Y2UsIEJvdFBhdGhSZWR1Y2UsCisgICAgVG9wRGVwdGhSZWR1Y2UsIFRvcFBhdGhSZWR1Y2UsIE5leHREZWZVc2UsIE5vZGVPcmRlcn07CisKKyNpZm5kZWYgTkRFQlVHCisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRSZWFzb25TdHIoR2VuZXJpY1NjaGVkdWxlckJhc2U6OkNhbmRSZWFzb24gUmVhc29uKTsKKyNlbmRpZgorCisgIC8vLyBQb2xpY3kgZm9yIHNjaGVkdWxpbmcgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaW4gdGhlIGNhbmRpZGF0ZSdzIHpvbmUuCisgIHN0cnVjdCBDYW5kUG9saWN5IHsKKyAgICBib29sIFJlZHVjZUxhdGVuY3kgPSBmYWxzZTsKKyAgICB1bnNpZ25lZCBSZWR1Y2VSZXNJZHggPSAwOworICAgIHVuc2lnbmVkIERlbWFuZFJlc0lkeCA9IDA7CisKKyAgICBDYW5kUG9saWN5KCkgPSBkZWZhdWx0OworCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENhbmRQb2xpY3kgJlJIUykgY29uc3QgeworICAgICAgcmV0dXJuIFJlZHVjZUxhdGVuY3kgPT0gUkhTLlJlZHVjZUxhdGVuY3kgJiYKKyAgICAgICAgICAgICBSZWR1Y2VSZXNJZHggPT0gUkhTLlJlZHVjZVJlc0lkeCAmJgorICAgICAgICAgICAgIERlbWFuZFJlc0lkeCA9PSBSSFMuRGVtYW5kUmVzSWR4OworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ2FuZFBvbGljeSAmUkhTKSBjb25zdCB7CisgICAgICByZXR1cm4gISgqdGhpcyA9PSBSSFMpOworICAgIH0KKyAgfTsKKworICAvLy8gU3RhdHVzIG9mIGFuIGluc3RydWN0aW9uJ3MgY3JpdGljYWwgcmVzb3VyY2UgY29uc3VtcHRpb24uCisgIHN0cnVjdCBTY2hlZFJlc291cmNlRGVsdGEgeworICAgIC8vIENvdW50IGNyaXRpY2FsIHJlc291cmNlcyBpbiB0aGUgc2NoZWR1bGVkIHJlZ2lvbiByZXF1aXJlZCBieSBTVS4KKyAgICB1bnNpZ25lZCBDcml0UmVzb3VyY2VzID0gMDsKKworICAgIC8vIENvdW50IGNyaXRpY2FsIHJlc291cmNlcyBmcm9tIGFub3RoZXIgcmVnaW9uIGNvbnN1bWVkIGJ5IFNVLgorICAgIHVuc2lnbmVkIERlbWFuZGVkUmVzb3VyY2VzID0gMDsKKworICAgIFNjaGVkUmVzb3VyY2VEZWx0YSgpID0gZGVmYXVsdDsKKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTY2hlZFJlc291cmNlRGVsdGEgJlJIUykgY29uc3QgeworICAgICAgcmV0dXJuIENyaXRSZXNvdXJjZXMgPT0gUkhTLkNyaXRSZXNvdXJjZXMKKyAgICAgICAgJiYgRGVtYW5kZWRSZXNvdXJjZXMgPT0gUkhTLkRlbWFuZGVkUmVzb3VyY2VzOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgU2NoZWRSZXNvdXJjZURlbHRhICZSSFMpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PShSSFMpOworICAgIH0KKyAgfTsKKworICAvLy8gU3RvcmUgdGhlIHN0YXRlIHVzZWQgYnkgR2VuZXJpY1NjaGVkdWxlciBoZXVyaXN0aWNzLCByZXF1aXJlZCBmb3IgdGhlCisgIC8vLyBsaWZldGltZSBvZiBvbmUgaW52b2NhdGlvbiBvZiBwaWNrTm9kZSgpLgorICBzdHJ1Y3QgU2NoZWRDYW5kaWRhdGUgeworICAgIENhbmRQb2xpY3kgUG9saWN5OworCisgICAgLy8gVGhlIGJlc3QgU1VuaXQgY2FuZGlkYXRlLgorICAgIFNVbml0ICpTVTsKKworICAgIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgY2FuZGlkYXRlLgorICAgIENhbmRSZWFzb24gUmVhc29uOworCisgICAgLy8gV2hldGhlciB0aGlzIGNhbmRpZGF0ZSBzaG91bGQgYmUgc2NoZWR1bGVkIGF0IHRvcC9ib3R0b20uCisgICAgYm9vbCBBdFRvcDsKKworICAgIC8vIFJlZ2lzdGVyIHByZXNzdXJlIHZhbHVlcyBmb3IgdGhlIGJlc3QgY2FuZGlkYXRlLgorICAgIFJlZ1ByZXNzdXJlRGVsdGEgUlBEZWx0YTsKKworICAgIC8vIENyaXRpY2FsIHJlc291cmNlIGNvbnN1bXB0aW9uIG9mIHRoZSBiZXN0IGNhbmRpZGF0ZS4KKyAgICBTY2hlZFJlc291cmNlRGVsdGEgUmVzRGVsdGE7CisKKyAgICBTY2hlZENhbmRpZGF0ZSgpIHsgcmVzZXQoQ2FuZFBvbGljeSgpKTsgfQorICAgIFNjaGVkQ2FuZGlkYXRlKGNvbnN0IENhbmRQb2xpY3kgJlBvbGljeSkgeyByZXNldChQb2xpY3kpOyB9CisKKyAgICB2b2lkIHJlc2V0KGNvbnN0IENhbmRQb2xpY3kgJk5ld1BvbGljeSkgeworICAgICAgUG9saWN5ID0gTmV3UG9saWN5OworICAgICAgU1UgPSBudWxscHRyOworICAgICAgUmVhc29uID0gTm9DYW5kOworICAgICAgQXRUb3AgPSBmYWxzZTsKKyAgICAgIFJQRGVsdGEgPSBSZWdQcmVzc3VyZURlbHRhKCk7CisgICAgICBSZXNEZWx0YSA9IFNjaGVkUmVzb3VyY2VEZWx0YSgpOworICAgIH0KKworICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIFNVOyB9CisKKyAgICAvLyBDb3B5IHRoZSBzdGF0dXMgb2YgYW5vdGhlciBjYW5kaWRhdGUgd2l0aG91dCBjaGFuZ2luZyBwb2xpY3kuCisgICAgdm9pZCBzZXRCZXN0KFNjaGVkQ2FuZGlkYXRlICZCZXN0KSB7CisgICAgICBhc3NlcnQoQmVzdC5SZWFzb24gIT0gTm9DYW5kICYmICJ1bmluaXRpYWxpemVkIFNjaGVkIGNhbmRpZGF0ZSIpOworICAgICAgU1UgPSBCZXN0LlNVOworICAgICAgUmVhc29uID0gQmVzdC5SZWFzb247CisgICAgICBBdFRvcCA9IEJlc3QuQXRUb3A7CisgICAgICBSUERlbHRhID0gQmVzdC5SUERlbHRhOworICAgICAgUmVzRGVsdGEgPSBCZXN0LlJlc0RlbHRhOworICAgIH0KKworICAgIHZvaWQgaW5pdFJlc291cmNlRGVsdGEoY29uc3QgU2NoZWR1bGVEQUdNSSAqREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0U2NoZWRNb2RlbCAqU2NoZWRNb2RlbCk7CisgIH07CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgTWFjaGluZVNjaGVkQ29udGV4dCAqQ29udGV4dDsKKyAgY29uc3QgVGFyZ2V0U2NoZWRNb2RlbCAqU2NoZWRNb2RlbCA9IG51bGxwdHI7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gbnVsbHB0cjsKKworICBTY2hlZFJlbWFpbmRlciBSZW07CisKKyAgR2VuZXJpY1NjaGVkdWxlckJhc2UoY29uc3QgTWFjaGluZVNjaGVkQ29udGV4dCAqQykgOiBDb250ZXh0KEMpIHt9CisKKyAgdm9pZCBzZXRQb2xpY3koQ2FuZFBvbGljeSAmUG9saWN5LCBib29sIElzUG9zdFJBLCBTY2hlZEJvdW5kYXJ5ICZDdXJyWm9uZSwKKyAgICAgICAgICAgICAgICAgU2NoZWRCb3VuZGFyeSAqT3RoZXJab25lKTsKKworI2lmbmRlZiBOREVCVUcKKyAgdm9pZCB0cmFjZUNhbmRpZGF0ZShjb25zdCBTY2hlZENhbmRpZGF0ZSAmQ2FuZCk7CisjZW5kaWYKK307CisKKy8vLyBHZW5lcmljU2NoZWR1bGVyIHNocmlua3MgdGhlIHVuc2NoZWR1bGVkIHpvbmUgdXNpbmcgaGV1cmlzdGljcyB0byBiYWxhbmNlCisvLy8gdGhlIHNjaGVkdWxlLgorY2xhc3MgR2VuZXJpY1NjaGVkdWxlciA6IHB1YmxpYyBHZW5lcmljU2NoZWR1bGVyQmFzZSB7CitwdWJsaWM6CisgIEdlbmVyaWNTY2hlZHVsZXIoY29uc3QgTWFjaGluZVNjaGVkQ29udGV4dCAqQyk6CisgICAgR2VuZXJpY1NjaGVkdWxlckJhc2UoQyksIFRvcChTY2hlZEJvdW5kYXJ5OjpUb3BRSUQsICJUb3BRIiksCisgICAgQm90KFNjaGVkQm91bmRhcnk6OkJvdFFJRCwgIkJvdFEiKSB7fQorCisgIHZvaWQgaW5pdFBvbGljeShNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgQmVnaW4sCisgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgRW5kLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUmVnaW9uSW5zdHJzKSBvdmVycmlkZTsKKworICB2b2lkIGR1bXBQb2xpY3koKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIHNob3VsZFRyYWNrUHJlc3N1cmUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFJlZ2lvblBvbGljeS5TaG91bGRUcmFja1ByZXNzdXJlOworICB9CisKKyAgYm9vbCBzaG91bGRUcmFja0xhbmVNYXNrcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUmVnaW9uUG9saWN5LlNob3VsZFRyYWNrTGFuZU1hc2tzOworICB9CisKKyAgdm9pZCBpbml0aWFsaXplKFNjaGVkdWxlREFHTUkgKmRhZykgb3ZlcnJpZGU7CisKKyAgU1VuaXQgKnBpY2tOb2RlKGJvb2wgJklzVG9wTm9kZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBzY2hlZE5vZGUoU1VuaXQgKlNVLCBib29sIElzVG9wTm9kZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCByZWxlYXNlVG9wTm9kZShTVW5pdCAqU1UpIG92ZXJyaWRlIHsKKyAgICBpZiAoU1UtPmlzU2NoZWR1bGVkKQorICAgICAgcmV0dXJuOworCisgICAgVG9wLnJlbGVhc2VOb2RlKFNVLCBTVS0+VG9wUmVhZHlDeWNsZSk7CisgICAgVG9wQ2FuZC5TVSA9IG51bGxwdHI7CisgIH0KKworICB2b2lkIHJlbGVhc2VCb3R0b21Ob2RlKFNVbml0ICpTVSkgb3ZlcnJpZGUgeworICAgIGlmIChTVS0+aXNTY2hlZHVsZWQpCisgICAgICByZXR1cm47CisKKyAgICBCb3QucmVsZWFzZU5vZGUoU1UsIFNVLT5Cb3RSZWFkeUN5Y2xlKTsKKyAgICBCb3RDYW5kLlNVID0gbnVsbHB0cjsKKyAgfQorCisgIHZvaWQgcmVnaXN0ZXJSb290cygpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgIFNjaGVkdWxlREFHTUlMaXZlICpEQUcgPSBudWxscHRyOworCisgIE1hY2hpbmVTY2hlZFBvbGljeSBSZWdpb25Qb2xpY3k7CisKKyAgLy8gU3RhdGUgb2YgdGhlIHRvcCBhbmQgYm90dG9tIHNjaGVkdWxlZCBpbnN0cnVjdGlvbiBib3VuZGFyaWVzLgorICBTY2hlZEJvdW5kYXJ5IFRvcDsKKyAgU2NoZWRCb3VuZGFyeSBCb3Q7CisKKyAgLy8vIENhbmRpZGF0ZSBsYXN0IHBpY2tlZCBmcm9tIFRvcCBib3VuZGFyeS4KKyAgU2NoZWRDYW5kaWRhdGUgVG9wQ2FuZDsKKyAgLy8vIENhbmRpZGF0ZSBsYXN0IHBpY2tlZCBmcm9tIEJvdCBib3VuZGFyeS4KKyAgU2NoZWRDYW5kaWRhdGUgQm90Q2FuZDsKKworICB2b2lkIGNoZWNrQWN5Y2xpY0xhdGVuY3koKTsKKworICB2b2lkIGluaXRDYW5kaWRhdGUoU2NoZWRDYW5kaWRhdGUgJkNhbmQsIFNVbml0ICpTVSwgYm9vbCBBdFRvcCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ1ByZXNzdXJlVHJhY2tlciAmUlBUcmFja2VyLAorICAgICAgICAgICAgICAgICAgICAgUmVnUHJlc3N1cmVUcmFja2VyICZUZW1wVHJhY2tlcik7CisKKyAgdm9pZCB0cnlDYW5kaWRhdGUoU2NoZWRDYW5kaWRhdGUgJkNhbmQsCisgICAgICAgICAgICAgICAgICAgIFNjaGVkQ2FuZGlkYXRlICZUcnlDYW5kLAorICAgICAgICAgICAgICAgICAgICBTY2hlZEJvdW5kYXJ5ICpab25lKTsKKworICBTVW5pdCAqcGlja05vZGVCaWRpcmVjdGlvbmFsKGJvb2wgJklzVG9wTm9kZSk7CisKKyAgdm9pZCBwaWNrTm9kZUZyb21RdWV1ZShTY2hlZEJvdW5kYXJ5ICZab25lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbmRQb2xpY3kgJlpvbmVQb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnUHJlc3N1cmVUcmFja2VyICZSUFRyYWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZWRDYW5kaWRhdGUgJkNhbmRpZGF0ZSk7CisKKyAgdm9pZCByZXNjaGVkdWxlUGh5c1JlZ0NvcGllcyhTVW5pdCAqU1UsIGJvb2wgaXNUb3ApOworfTsKKworLy8vIFBvc3RHZW5lcmljU2NoZWR1bGVyIC0gSW50ZXJmYWNlIHRvIHRoZSBzY2hlZHVsaW5nIGFsZ29yaXRobSB1c2VkIGJ5CisvLy8gU2NoZWR1bGVEQUdNSS4KKy8vLworLy8vIENhbGxiYWNrcyBmcm9tIFNjaGVkdWxlREFHTUk6CisvLy8gICBpbml0UG9saWN5IC0+IGluaXRpYWxpemUoREFHKSAtPiByZWdpc3RlclJvb3RzIC0+IHBpY2tOb2RlIC4uLgorY2xhc3MgUG9zdEdlbmVyaWNTY2hlZHVsZXIgOiBwdWJsaWMgR2VuZXJpY1NjaGVkdWxlckJhc2UgeworICBTY2hlZHVsZURBR01JICpEQUc7CisgIFNjaGVkQm91bmRhcnkgVG9wOworICBTbWFsbFZlY3RvcjxTVW5pdCosIDg+IEJvdFJvb3RzOworCitwdWJsaWM6CisgIFBvc3RHZW5lcmljU2NoZWR1bGVyKGNvbnN0IE1hY2hpbmVTY2hlZENvbnRleHQgKkMpOgorICAgIEdlbmVyaWNTY2hlZHVsZXJCYXNlKEMpLCBUb3AoU2NoZWRCb3VuZGFyeTo6VG9wUUlELCAiVG9wUSIpIHt9CisKKyAgflBvc3RHZW5lcmljU2NoZWR1bGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIHZvaWQgaW5pdFBvbGljeShNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgQmVnaW4sCisgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgRW5kLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUmVnaW9uSW5zdHJzKSBvdmVycmlkZSB7CisgICAgLyogbm8gY29uZmlndXJhYmxlIHBvbGljeSAqLworICB9CisKKyAgLy8vIFBvc3RSQSBzY2hlZHVsaW5nIGRvZXMgbm90IHRyYWNrIHByZXNzdXJlLgorICBib29sIHNob3VsZFRyYWNrUHJlc3N1cmUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorCisgIHZvaWQgaW5pdGlhbGl6ZShTY2hlZHVsZURBR01JICpEYWcpIG92ZXJyaWRlOworCisgIHZvaWQgcmVnaXN0ZXJSb290cygpIG92ZXJyaWRlOworCisgIFNVbml0ICpwaWNrTm9kZShib29sICZJc1RvcE5vZGUpIG92ZXJyaWRlOworCisgIHZvaWQgc2NoZWR1bGVUcmVlKHVuc2lnbmVkIFN1YnRyZWVJRCkgb3ZlcnJpZGUgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlBvc3RSQSBzY2hlZHVsZXIgZG9lcyBub3Qgc3VwcG9ydCBzdWJ0cmVlIGFuYWx5c2lzLiIpOworICB9CisKKyAgdm9pZCBzY2hlZE5vZGUoU1VuaXQgKlNVLCBib29sIElzVG9wTm9kZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCByZWxlYXNlVG9wTm9kZShTVW5pdCAqU1UpIG92ZXJyaWRlIHsKKyAgICBpZiAoU1UtPmlzU2NoZWR1bGVkKQorICAgICAgcmV0dXJuOworICAgIFRvcC5yZWxlYXNlTm9kZShTVSwgU1UtPlRvcFJlYWR5Q3ljbGUpOworICB9CisKKyAgLy8gT25seSBjYWxsZWQgZm9yIHJvb3RzLgorICB2b2lkIHJlbGVhc2VCb3R0b21Ob2RlKFNVbml0ICpTVSkgb3ZlcnJpZGUgeworICAgIEJvdFJvb3RzLnB1c2hfYmFjayhTVSk7CisgIH0KKworcHJvdGVjdGVkOgorICB2b2lkIHRyeUNhbmRpZGF0ZShTY2hlZENhbmRpZGF0ZSAmQ2FuZCwgU2NoZWRDYW5kaWRhdGUgJlRyeUNhbmQpOworCisgIHZvaWQgcGlja05vZGVGcm9tUXVldWUoU2NoZWRDYW5kaWRhdGUgJkNhbmQpOworfTsKKworLy8vIENyZWF0ZSB0aGUgc3RhbmRhcmQgY29udmVyZ2luZyBtYWNoaW5lIHNjaGVkdWxlci4gVGhpcyB3aWxsIGJlIHVzZWQgYXMgdGhlCisvLy8gZGVmYXVsdCBzY2hlZHVsZXIgaWYgdGhlIHRhcmdldCBkb2VzIG5vdCBzZXQgYSBkZWZhdWx0LgorLy8vIEFkZHMgZGVmYXVsdCBEQUcgbXV0YXRpb25zLgorU2NoZWR1bGVEQUdNSUxpdmUgKmNyZWF0ZUdlbmVyaWNTY2hlZExpdmUoTWFjaGluZVNjaGVkQ29udGV4dCAqQyk7CisKKy8vLyBDcmVhdGUgYSBnZW5lcmljIHNjaGVkdWxlciB3aXRoIG5vIHZyZWcgbGl2ZW5lc3Mgb3IgREFHIG11dGF0aW9uIHBhc3Nlcy4KK1NjaGVkdWxlREFHTUkgKmNyZWF0ZUdlbmVyaWNTY2hlZFBvc3RSQShNYWNoaW5lU2NoZWRDb250ZXh0ICpDKTsKKworc3RkOjp1bmlxdWVfcHRyPFNjaGVkdWxlREFHTXV0YXRpb24+CitjcmVhdGVMb2FkQ2x1c3RlckRBR011dGF0aW9uKGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSk7CisKK3N0ZDo6dW5pcXVlX3B0cjxTY2hlZHVsZURBR011dGF0aW9uPgorY3JlYXRlU3RvcmVDbHVzdGVyREFHTXV0YXRpb24oY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSk7CisKK3N0ZDo6dW5pcXVlX3B0cjxTY2hlZHVsZURBR011dGF0aW9uPgorY3JlYXRlQ29weUNvbnN0cmFpbkRBR011dGF0aW9uKGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9NQUNISU5FU0NIRURVTEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lVHJhY2VNZXRyaWNzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZVRyYWNlTWV0cmljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOGRiMzkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZVRyYWNlTWV0cmljcy5oCkBAIC0wLDAgKzEsNDM2IEBACisvLz09PS0gbGliL0NvZGVHZW4vTWFjaGluZVRyYWNlTWV0cmljcy5oIC0gU3VwZXItc2NhbGFyIG1ldHJpY3MgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBNYWNoaW5lVHJhY2VNZXRyaWNzIGFuYWx5c2lzIHBhc3MKKy8vIHRoYXQgZXN0aW1hdGVzIENQVSByZXNvdXJjZSB1c2FnZSBhbmQgY3JpdGljYWwgZGF0YSBkZXBlbmRlbmN5IHBhdGhzIHRocm91Z2gKKy8vIHByZWZlcnJlZCB0cmFjZXMuIFRoaXMgaXMgdXNlZnVsIGZvciBzdXBlci1zY2FsYXIgQ1BVcyB3aGVyZSBleGVjdXRpb24gc3BlZWQKKy8vIGNhbiBiZSBsaW1pdGVkIGJvdGggYnkgZGF0YSBkZXBlbmRlbmNpZXMgYW5kIGJ5IGxpbWl0ZWQgZXhlY3V0aW9uIHJlc291cmNlcy4KKy8vCisvLyBPdXQtb2Ytb3JkZXIgQ1BVcyB3aWxsIG9mdGVuIGJlIGV4ZWN1dGluZyBpbnN0cnVjdGlvbnMgZnJvbSBtdWx0aXBsZSBiYXNpYworLy8gYmxvY2tzIGF0IHRoZSBzYW1lIHRpbWUuIFRoaXMgbWFrZXMgaXQgZGlmZmljdWx0IHRvIGVzdGltYXRlIHRoZSByZXNvdXJjZQorLy8gdXNhZ2UgYWNjdXJhdGVseSBpbiBhIHNpbmdsZSBiYXNpYyBibG9jay4gUmVzb3VyY2VzIGNhbiBiZSBlc3RpbWF0ZWQgYmV0dGVyCisvLyBieSBsb29raW5nIGF0IGEgdHJhY2UgdGhyb3VnaCB0aGUgY3VycmVudCBiYXNpYyBibG9jay4KKy8vCisvLyBGb3IgZXZlcnkgYmxvY2ssIHRoZSBNYWNoaW5lVHJhY2VNZXRyaWNzIHBhc3Mgd2lsbCBwaWNrIGEgcHJlZmVycmVkIHRyYWNlCisvLyB0aGF0IHBhc3NlcyB0aHJvdWdoIHRoZSBibG9jay4gVGhlIHRyYWNlIGlzIGNob3NlbiBiYXNlZCBvbiBsb29wIHN0cnVjdHVyZSwKKy8vIGJyYW5jaCBwcm9iYWJpbGl0aWVzLCBhbmQgcmVzb3VyY2UgdXNhZ2UuIFRoZSBpbnRlbnRpb24gaXMgdG8gcGljayBsaWtlbHkKKy8vIHRyYWNlcyB0aGF0IHdvdWxkIGJlIHRoZSBtb3N0IGFmZmVjdGVkIGJ5IGNvZGUgdHJhbnNmb3JtYXRpb25zLgorLy8KKy8vIEl0IGlzIGV4cGVuc2l2ZSB0byBjb21wdXRlIGEgZnVsbCBhcmJpdHJhcnkgdHJhY2UgZm9yIGV2ZXJ5IGJsb2NrLCBzbyB0bworLy8gc2F2ZSBzb21lIGNvbXB1dGF0aW9ucywgdHJhY2VzIGFyZSBjaG9zZW4gdG8gYmUgY29udmVyZ2VudC4gVGhpcyBtZWFucyB0aGF0CisvLyBpZiB0aGUgdHJhY2VzIHRocm91Z2ggYmFzaWMgYmxvY2tzIEEgYW5kIEIgZXZlciBjcm9zcyB3aGVuIG1vdmluZyBhd2F5IGZyb20KKy8vIEEgYW5kIEIsIHRoZXkgbmV2ZXIgZGl2ZXJnZSBhZ2Fpbi4gVGhpcyBhcHBsaWVzIGluIGJvdGggZGlyZWN0aW9ucyAtIElmIHRoZQorLy8gdHJhY2VzIG1lZXQgYWJvdmUgQSBhbmQgQiwgdGhleSB3b24ndCBkaXZlcmdlIHdoZW4gZ29pbmcgZnVydGhlciBiYWNrLgorLy8KKy8vIFRyYWNlcyB0ZW5kIHRvIGFsaWduIHdpdGggbG9vcHMuIFRoZSB0cmFjZSB0aHJvdWdoIGEgYmxvY2sgaW4gYW4gaW5uZXIgbG9vcAorLy8gd2lsbCBiZWdpbiBhdCB0aGUgbG9vcCBlbnRyeSBibG9jayBhbmQgZW5kIGF0IGEgYmFjayBlZGdlLiBJZiB0aGVyZSBhcmUKKy8vIG5lc3RlZCBsb29wcywgdGhlIHRyYWNlIG1heSBiZWdpbiBhbmQgZW5kIGF0IHRob3NlIGluc3RlYWQuCisvLworLy8gRm9yIGVhY2ggdHJhY2UsIHdlIGNvbXB1dGUgdGhlIGNyaXRpY2FsIHBhdGggbGVuZ3RoLCB3aGljaCBpcyB0aGUgbnVtYmVyIG9mCisvLyBjeWNsZXMgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGUgdHJhY2Ugd2hlbiBleGVjdXRpb24gaXMgbGltaXRlZCBieSBkYXRhCisvLyBkZXBlbmRlbmNpZXMgb25seS4gV2UgYWxzbyBjb21wdXRlIHRoZSByZXNvdXJjZSBoZWlnaHQsIHdoaWNoIGlzIHRoZSBudW1iZXIKKy8vIG9mIGN5Y2xlcyByZXF1aXJlZCB0byBleGVjdXRlIGFsbCBpbnN0cnVjdGlvbnMgaW4gdGhlIHRyYWNlIHdoZW4gaWdub3JpbmcKKy8vIGRhdGEgZGVwZW5kZW5jaWVzLgorLy8KKy8vIEV2ZXJ5IGluc3RydWN0aW9uIGluIHRoZSBjdXJyZW50IGJsb2NrIGhhcyBhIHNsYWNrIC0gdGhlIG51bWJlciBvZiBjeWNsZXMKKy8vIGV4ZWN1dGlvbiBvZiB0aGUgaW5zdHJ1Y3Rpb24gY2FuIGJlIGRlbGF5ZWQgd2l0aG91dCBleHRlbmRpbmcgdGhlIGNyaXRpY2FsCisvLyBwYXRoLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVUUkFDRU1FVFJJQ1NfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORVRSQUNFTUVUUklDU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TcGFyc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0U2NoZWR1bGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBbmFseXNpc1VzYWdlOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTWFjaGluZUxvb3A7CitjbGFzcyBNYWNoaW5lTG9vcEluZm87CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworc3RydWN0IE1DU2NoZWRDbGFzc0Rlc2M7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFRhcmdldEluc3RySW5mbzsKK2NsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKKworLy8gS2VlcCB0cmFjayBvZiBwaHlzcmVnIGRhdGEgZGVwZW5kZW5jaWVzIGJ5IHJlY29yZGluZyBlYWNoIGxpdmUgcmVnaXN0ZXIgdW5pdC4KKy8vIEFzc29jaWF0ZSBlYWNoIHJlZ3VuaXQgd2l0aCBhbiBpbnN0cnVjdGlvbiBvcGVyYW5kLiBEZXBlbmRpbmcgb24gdGhlCisvLyBkaXJlY3Rpb24gaW5zdHJ1Y3Rpb25zIGFyZSBzY2FubmVkLCBpdCBjb3VsZCBiZSB0aGUgb3BlcmFuZCB0aGF0IGRlZmluZWQgdGhlCisvLyByZWd1bml0LCBvciB0aGUgaGlnaGVzdCBvcGVyYW5kIHRvIHJlYWQgdGhlIHJlZ3VuaXQuCitzdHJ1Y3QgTGl2ZVJlZ1VuaXQgeworICB1bnNpZ25lZCBSZWdVbml0OworICB1bnNpZ25lZCBDeWNsZSA9IDA7CisgIGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkgPSBudWxscHRyOworICB1bnNpZ25lZCBPcCA9IDA7CisKKyAgdW5zaWduZWQgZ2V0U3BhcnNlU2V0SW5kZXgoKSBjb25zdCB7IHJldHVybiBSZWdVbml0OyB9CisKKyAgTGl2ZVJlZ1VuaXQodW5zaWduZWQgUlUpIDogUmVnVW5pdChSVSkge30KK307CisKKworY2xhc3MgTWFjaGluZVRyYWNlTWV0cmljcyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRiA9IG51bGxwdHI7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gbnVsbHB0cjsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyOworICBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkkgPSBudWxscHRyOworICBjb25zdCBNYWNoaW5lTG9vcEluZm8gKkxvb3BzID0gbnVsbHB0cjsKKyAgVGFyZ2V0U2NoZWRNb2RlbCBTY2hlZE1vZGVsOworCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBFbnNlbWJsZTsKKyAgZnJpZW5kIGNsYXNzIFRyYWNlOworCisgIGNsYXNzIEVuc2VtYmxlOworCisgIHN0YXRpYyBjaGFyIElEOworCisgIE1hY2hpbmVUcmFjZU1ldHJpY3MoKTsKKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSYpIGNvbnN0IG92ZXJyaWRlOworICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiYpIG92ZXJyaWRlOworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKyAgdm9pZCB2ZXJpZnlBbmFseXNpcygpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vLyBQZXItYmFzaWMgYmxvY2sgaW5mb3JtYXRpb24gdGhhdCBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgdHJhY2UgdGhyb3VnaCB0aGUKKyAgLy8vIGJsb2NrLgorICBzdHJ1Y3QgRml4ZWRCbG9ja0luZm8geworICAgIC8vLyBUaGUgbnVtYmVyIG9mIG5vbi10cml2aWFsIGluc3RydWN0aW9ucyBpbiB0aGUgYmxvY2suCisgICAgLy8vIERvZXNuJ3QgY291bnQgUEhJIGFuZCBDT1BZIGluc3RydWN0aW9ucyB0aGF0IGFyZSBsaWtlbHkgdG8gYmUgcmVtb3ZlZC4KKyAgICB1bnNpZ25lZCBJbnN0ckNvdW50ID0gfjB1OworCisgICAgLy8vIFRydWUgd2hlbiB0aGUgYmxvY2sgY29udGFpbnMgY2FsbHMuCisgICAgYm9vbCBIYXNDYWxscyA9IGZhbHNlOworCisgICAgRml4ZWRCbG9ja0luZm8oKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIHdoZW4gcmVzb3VyY2UgaW5mb3JtYXRpb24gZm9yIHRoaXMgYmxvY2sgaGFzIGJlZW4gY29tcHV0ZWQuCisgICAgYm9vbCBoYXNSZXNvdXJjZXMoKSBjb25zdCB7IHJldHVybiBJbnN0ckNvdW50ICE9IH4wdTsgfQorCisgICAgLy8vIEludmFsaWRhdGUgcmVzb3VyY2UgaW5mb3JtYXRpb24uCisgICAgdm9pZCBpbnZhbGlkYXRlKCkgeyBJbnN0ckNvdW50ID0gfjB1OyB9CisgIH07CisKKyAgLy8vIEdldCB0aGUgZml4ZWQgcmVzb3VyY2UgaW5mb3JtYXRpb24gYWJvdXQgTUJCLiBDb21wdXRlIGl0IG9uIGRlbWFuZC4KKyAgY29uc3QgRml4ZWRCbG9ja0luZm8gKmdldFJlc291cmNlcyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayopOworCisgIC8vLyBHZXQgdGhlIHNjYWxlZCBudW1iZXIgb2YgY3ljbGVzIHVzZWQgcGVyIHByb2Nlc3NvciByZXNvdXJjZSBpbiBNQkIuCisgIC8vLyBUaGlzIGlzIGFuIGFycmF5IHdpdGggU2NoZWRNb2RlbC5nZXROdW1Qcm9jUmVzb3VyY2VLaW5kcygpIGVudHJpZXMuCisgIC8vLyBUaGUgZ2V0UmVzb3VyY2VzKCkgZnVuY3Rpb24gYWJvdmUgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGZpcnN0LgorICAvLy8KKyAgLy8vIFRoZXNlIG51bWJlcnMgaGF2ZSBhbHJlYWR5IGJlZW4gc2NhbGVkIGJ5IFNjaGVkTW9kZWwuZ2V0UmVzb3VyY2VGYWN0b3IoKS4KKyAgQXJyYXlSZWY8dW5zaWduZWQ+IGdldFByb2NSZXNvdXJjZUN5Y2xlcyh1bnNpZ25lZCBNQkJOdW0pIGNvbnN0OworCisgIC8vLyBBIHZpcnR1YWwgcmVnaXN0ZXIgb3IgcmVndW5pdCByZXF1aXJlZCBieSBhIGJhc2ljIGJsb2NrIG9yIGl0cyB0cmFjZQorICAvLy8gc3VjY2Vzc29ycy4KKyAgc3RydWN0IExpdmVJblJlZyB7CisgICAgLy8vIFRoZSB2aXJ0dWFsIHJlZ2lzdGVyIHJlcXVpcmVkLCBvciBhIHJlZ2lzdGVyIHVuaXQuCisgICAgdW5zaWduZWQgUmVnOworCisgICAgLy8vIEZvciB2aXJ0dWFsIHJlZ2lzdGVyczogTWluaW11bSBoZWlnaHQgb2YgdGhlIGRlZmluaW5nIGluc3RydWN0aW9uLgorICAgIC8vLyBGb3IgcmVndW5pdHM6IEhlaWdodCBvZiB0aGUgaGlnaGVzdCB1c2VyIGluIHRoZSB0cmFjZS4KKyAgICB1bnNpZ25lZCBIZWlnaHQ7CisKKyAgICBMaXZlSW5SZWcodW5zaWduZWQgUmVnLCB1bnNpZ25lZCBIZWlnaHQgPSAwKSA6IFJlZyhSZWcpLCBIZWlnaHQoSGVpZ2h0KSB7fQorICB9OworCisgIC8vLyBQZXItYmFzaWMgYmxvY2sgaW5mb3JtYXRpb24gdGhhdCByZWxhdGVzIHRvIGEgc3BlY2lmaWMgdHJhY2UgdGhyb3VnaCB0aGUKKyAgLy8vIGJsb2NrLiBDb252ZXJnZW50IHRyYWNlcyBtZWFucyB0aGF0IG9ubHkgb25lIG9mIHRoZXNlIGlzIHJlcXVpcmVkIHBlcgorICAvLy8gYmxvY2sgaW4gYSB0cmFjZSBlbnNlbWJsZS4KKyAgc3RydWN0IFRyYWNlQmxvY2tJbmZvIHsKKyAgICAvLy8gVHJhY2UgcHJlZGVjZXNzb3IsIG9yIE5VTEwgZm9yIHRoZSBmaXJzdCBibG9jayBpbiB0aGUgdHJhY2UuCisgICAgLy8vIFZhbGlkIHdoZW4gaGFzVmFsaWREZXB0aCgpLgorICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpQcmVkID0gbnVsbHB0cjsKKworICAgIC8vLyBUcmFjZSBzdWNjZXNzb3IsIG9yIE5VTEwgZm9yIHRoZSBsYXN0IGJsb2NrIGluIHRoZSB0cmFjZS4KKyAgICAvLy8gVmFsaWQgd2hlbiBoYXNWYWxpZEhlaWdodCgpLgorICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpTdWNjID0gbnVsbHB0cjsKKworICAgIC8vLyBUaGUgYmxvY2sgbnVtYmVyIG9mIHRoZSBoZWFkIG9mIHRoZSB0cmFjZS4gKFdoZW4gaGFzVmFsaWREZXB0aCgpKS4KKyAgICB1bnNpZ25lZCBIZWFkOworCisgICAgLy8vIFRoZSBibG9jayBudW1iZXIgb2YgdGhlIHRhaWwgb2YgdGhlIHRyYWNlLiAoV2hlbiBoYXNWYWxpZEhlaWdodCgpKS4KKyAgICB1bnNpZ25lZCBUYWlsOworCisgICAgLy8vIEFjY3VtdWxhdGVkIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgaW4gdGhlIHRyYWNlIGFib3ZlIHRoaXMgYmxvY2suCisgICAgLy8vIERvZXMgbm90IGluY2x1ZGUgaW5zdHJ1Y3Rpb25zIGluIHRoaXMgYmxvY2suCisgICAgdW5zaWduZWQgSW5zdHJEZXB0aCA9IH4wdTsKKworICAgIC8vLyBBY2N1bXVsYXRlZCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGluIHRoZSB0cmFjZSBiZWxvdyB0aGlzIGJsb2NrLgorICAgIC8vLyBJbmNsdWRlcyBpbnN0cnVjdGlvbnMgaW4gdGhpcyBibG9jay4KKyAgICB1bnNpZ25lZCBJbnN0ckhlaWdodCA9IH4wdTsKKworICAgIFRyYWNlQmxvY2tJbmZvKCkgPSBkZWZhdWx0OworCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVwdGggcmVzb3VyY2VzIGhhdmUgYmVlbiBjb21wdXRlZCBmcm9tIHRoZSB0cmFjZQorICAgIC8vLyBhYm92ZSB0aGlzIGJsb2NrLgorICAgIGJvb2wgaGFzVmFsaWREZXB0aCgpIGNvbnN0IHsgcmV0dXJuIEluc3RyRGVwdGggIT0gfjB1OyB9CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBoZWlnaHQgcmVzb3VyY2VzIGhhdmUgYmVlbiBjb21wdXRlZCBmcm9tIHRoZSB0cmFjZQorICAgIC8vLyBiZWxvdyB0aGlzIGJsb2NrLgorICAgIGJvb2wgaGFzVmFsaWRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBJbnN0ckhlaWdodCAhPSB+MHU7IH0KKworICAgIC8vLyBJbnZhbGlkYXRlIGRlcHRoIHJlc291cmNlcyB3aGVuIHNvbWUgYmxvY2sgYWJvdmUgdGhpcyBvbmUgaGFzIGNoYW5nZWQuCisgICAgdm9pZCBpbnZhbGlkYXRlRGVwdGgoKSB7IEluc3RyRGVwdGggPSB+MHU7IEhhc1ZhbGlkSW5zdHJEZXB0aHMgPSBmYWxzZTsgfQorCisgICAgLy8vIEludmFsaWRhdGUgaGVpZ2h0IHJlc291cmNlcyB3aGVuIGEgYmxvY2sgYmVsb3cgdGhpcyBvbmUgaGFzIGNoYW5nZWQuCisgICAgdm9pZCBpbnZhbGlkYXRlSGVpZ2h0KCkgeyBJbnN0ckhlaWdodCA9IH4wdTsgSGFzVmFsaWRJbnN0ckhlaWdodHMgPSBmYWxzZTsgfQorCisgICAgLy8vIEFzc3VtaW5nIHRoYXQgdGhpcyBpcyBhIGRvbWluYXRvciBvZiBUQkksIGRldGVybWluZSBpZiBpdCBjb250YWlucworICAgIC8vLyB1c2VmdWwgaW5zdHJ1Y3Rpb24gZGVwdGhzLiBBIGRvbWluYXRpbmcgYmxvY2sgY2FuIGJlIGFib3ZlIHRoZSBjdXJyZW50CisgICAgLy8vIHRyYWNlIGhlYWQsIGFuZCBhbnkgZGVwZW5kZW5jaWVzIGZyb20gc3VjaCBhIGZhciBhd2F5IGRvbWluYXRvciBhcmUgbm90CisgICAgLy8vIGV4cGVjdGVkIHRvIGFmZmVjdCB0aGUgY3JpdGljYWwgcGF0aC4KKyAgICAvLy8KKyAgICAvLy8gQWxzbyByZXR1cm5zIHRydWUgd2hlbiBUQkkgPT0gdGhpcy4KKyAgICBib29sIGlzVXNlZnVsRG9taW5hdG9yKGNvbnN0IFRyYWNlQmxvY2tJbmZvICZUQkkpIGNvbnN0IHsKKyAgICAgIC8vIFRoZSB0cmFjZSBmb3IgVEJJIG1heSBub3QgZXZlbiBiZSBjYWxjdWxhdGVkIHlldC4KKyAgICAgIGlmICghaGFzVmFsaWREZXB0aCgpIHx8ICFUQkkuaGFzVmFsaWREZXB0aCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAvLyBJbnN0cnVjdGlvbiBkZXB0aHMgYXJlIG9ubHkgY29tcGFyYWJsZSBpZiB0aGUgdHJhY2VzIHNoYXJlIGEgaGVhZC4KKyAgICAgIGlmIChIZWFkICE9IFRCSS5IZWFkKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAvLyBJdCBpcyBhbG1vc3QgYWx3YXlzIHRoZSBjYXNlIHRoYXQgVEJJIGJlbG9uZ3MgdG8gdGhlIHNhbWUgdHJhY2UgYXMKKyAgICAgIC8vIHRoaXMgYmxvY2ssIGJ1dCByYXJlIGNvbnZvbHV0ZWQgY2FzZXMgaW52b2x2aW5nIGlycmVkdWNpYmxlIGNvbnRyb2wKKyAgICAgIC8vIGZsb3csIGEgZG9taW5hdG9yIG1heSBzaGFyZSBhIHRyYWNlIGhlYWQgd2l0aG91dCBhY3R1YWxseSBiZWluZyBvbiB0aGUKKyAgICAgIC8vIHNhbWUgdHJhY2UgYXMgVEJJLiBUaGlzIGlzIG5vdCBhIGJpZyBwcm9ibGVtIGFzIGxvbmcgYXMgaXQgZG9lc24ndAorICAgICAgLy8gaW5jcmVhc2UgdGhlIGluc3RydWN0aW9uIGRlcHRoLgorICAgICAgcmV0dXJuIEhhc1ZhbGlkSW5zdHJEZXB0aHMgJiYgSW5zdHJEZXB0aCA8PSBUQkkuSW5zdHJEZXB0aDsKKyAgICB9CisKKyAgICAvLyBEYXRhLWRlcGVuZGVuY3ktcmVsYXRlZCBpbmZvcm1hdGlvbi4gUGVyLWluc3RydWN0aW9uIGRlcHRoIGFuZCBoZWlnaHQKKyAgICAvLyBhcmUgY29tcHV0ZWQgZnJvbSBkYXRhIGRlcGVuZGVuY2llcyBpbiB0aGUgY3VycmVudCB0cmFjZSwgdXNpbmcKKyAgICAvLyBpdGluZXJhcnkgZGF0YS4KKworICAgIC8vLyBJbnN0cnVjdGlvbiBkZXB0aHMgaGF2ZSBiZWVuIGNvbXB1dGVkLiBUaGlzIGltcGxpZXMgaGFzVmFsaWREZXB0aCgpLgorICAgIGJvb2wgSGFzVmFsaWRJbnN0ckRlcHRocyA9IGZhbHNlOworCisgICAgLy8vIEluc3RydWN0aW9uIGhlaWdodHMgaGF2ZSBiZWVuIGNvbXB1dGVkLiBUaGlzIGltcGxpZXMgaGFzVmFsaWRIZWlnaHQoKS4KKyAgICBib29sIEhhc1ZhbGlkSW5zdHJIZWlnaHRzID0gZmFsc2U7CisKKyAgICAvLy8gQ3JpdGljYWwgcGF0aCBsZW5ndGguIFRoaXMgaXMgdGhlIG51bWJlciBvZiBjeWNsZXMgaW4gdGhlIGxvbmdlc3QgZGF0YQorICAgIC8vLyBkZXBlbmRlbmN5IGNoYWluIHRocm91Z2ggdGhlIHRyYWNlLiBUaGlzIGlzIG9ubHkgdmFsaWQgd2hlbiBib3RoCisgICAgLy8vIEhhc1ZhbGlkSW5zdHJEZXB0aHMgYW5kIEhhc1ZhbGlkSW5zdHJIZWlnaHRzIGFyZSBzZXQuCisgICAgdW5zaWduZWQgQ3JpdGljYWxQYXRoOworCisgICAgLy8vIExpdmUtaW4gcmVnaXN0ZXJzLiBUaGVzZSByZWdpc3RlcnMgYXJlIGRlZmluZWQgYWJvdmUgdGhlIGN1cnJlbnQgYmxvY2sKKyAgICAvLy8gYW5kIHVzZWQgYnkgdGhpcyBibG9jayBvciBhIGJsb2NrIGJlbG93IGl0LgorICAgIC8vLyBUaGlzIGRvZXMgbm90IGluY2x1ZGUgUEhJIHVzZXMgaW4gdGhlIGN1cnJlbnQgYmxvY2ssIGJ1dCBpdCBkb2VzCisgICAgLy8vIGluY2x1ZGUgUEhJIHVzZXMgaW4gZGVlcGVyIGJsb2Nrcy4KKyAgICBTbWFsbFZlY3RvcjxMaXZlSW5SZWcsIDQ+IExpdmVJbnM7CisKKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtJikgY29uc3Q7CisgIH07CisKKyAgLy8vIEluc3RyQ3ljbGVzIHJlcHJlc2VudHMgdGhlIGN5Y2xlIGhlaWdodCBhbmQgZGVwdGggb2YgYW4gaW5zdHJ1Y3Rpb24gaW4gYQorICAvLy8gdHJhY2UuCisgIHN0cnVjdCBJbnN0ckN5Y2xlcyB7CisgICAgLy8vIEVhcmxpZXN0IGlzc3VlIGN5Y2xlIGFzIGRldGVybWluZWQgYnkgZGF0YSBkZXBlbmRlbmNpZXMgYW5kIGluc3RydWN0aW9uCisgICAgLy8vIGxhdGVuY2llcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRyYWNlLiBEYXRhIGRlcGVuZGVuY2llcyBmcm9tCisgICAgLy8vIGJlZm9yZSB0aGUgdHJhY2UgYXJlIG5vdCBpbmNsdWRlZC4KKyAgICB1bnNpZ25lZCBEZXB0aDsKKworICAgIC8vLyBNaW5pbXVtIG51bWJlciBvZiBjeWNsZXMgZnJvbSB0aGlzIGluc3RydWN0aW9uIGlzIGlzc3VlZCB0byB0aGUgb2YgdGhlCisgICAgLy8vIHRyYWNlLCBhcyBkZXRlcm1pbmVkIGJ5IGRhdGEgZGVwZW5kZW5jaWVzIGFuZCBpbnN0cnVjdGlvbiBsYXRlbmNpZXMuCisgICAgdW5zaWduZWQgSGVpZ2h0OworICB9OworCisgIC8vLyBBIHRyYWNlIHJlcHJlc2VudHMgYSBwbGF1c2libGUgc2VxdWVuY2Ugb2YgZXhlY3V0ZWQgYmFzaWMgYmxvY2tzIHRoYXQKKyAgLy8vIHBhc3NlcyB0aHJvdWdoIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrIG9uZS4gVGhlIFRyYWNlIGNsYXNzIHNlcnZlcyBhcyBhCisgIC8vLyBoYW5kbGUgdG8gaW50ZXJuYWwgY2FjaGVkIGRhdGEgc3RydWN0dXJlcy4KKyAgY2xhc3MgVHJhY2UgeworICAgIEVuc2VtYmxlICZURTsKKyAgICBUcmFjZUJsb2NrSW5mbyAmVEJJOworCisgICAgdW5zaWduZWQgZ2V0QmxvY2tOdW0oKSBjb25zdCB7IHJldHVybiAmVEJJIC0gJlRFLkJsb2NrSW5mb1swXTsgfQorCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBUcmFjZShFbnNlbWJsZSAmdGUsIFRyYWNlQmxvY2tJbmZvICZ0YmkpIDogVEUodGUpLCBUQkkodGJpKSB7fQorCisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSYpIGNvbnN0OworCisgICAgLy8vIENvbXB1dGUgdGhlIHRvdGFsIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgaW4gdGhlIHRyYWNlLgorICAgIHVuc2lnbmVkIGdldEluc3RyQ291bnQoKSBjb25zdCB7CisgICAgICByZXR1cm4gVEJJLkluc3RyRGVwdGggKyBUQkkuSW5zdHJIZWlnaHQ7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgcmVzb3VyY2UgZGVwdGggb2YgdGhlIHRvcC9ib3R0b20gb2YgdGhlIHRyYWNlIGNlbnRlciBibG9jay4KKyAgICAvLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGN5Y2xlcyByZXF1aXJlZCB0byBleGVjdXRlIGFsbCBpbnN0cnVjdGlvbnMgZnJvbQorICAgIC8vLyB0aGUgdHJhY2UgaGVhZCB0byB0aGUgdHJhY2UgY2VudGVyIGJsb2NrLiBUaGUgcmVzb3VyY2UgZGVwdGggb25seQorICAgIC8vLyBjb25zaWRlcnMgZXhlY3V0aW9uIHJlc291cmNlcywgaXQgaWdub3JlcyBkYXRhIGRlcGVuZGVuY2llcy4KKyAgICAvLy8gV2hlbiBCb3R0b20gaXMgc2V0LCBpbnN0cnVjdGlvbnMgaW4gdGhlIHRyYWNlIGNlbnRlciBibG9jayBhcmUgaW5jbHVkZWQuCisgICAgdW5zaWduZWQgZ2V0UmVzb3VyY2VEZXB0aChib29sIEJvdHRvbSkgY29uc3Q7CisKKyAgICAvLy8gUmV0dXJuIHRoZSByZXNvdXJjZSBsZW5ndGggb2YgdGhlIHRyYWNlLiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgY3ljbGVzCisgICAgLy8vIHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgdHJhY2UgaWYgdGhleSB3ZXJlIGFsbAorICAgIC8vLyBpbmRlcGVuZGVudCwgZXhwb3NpbmcgdGhlIG1heGltdW0gaW5zdHJ1Y3Rpb24tbGV2ZWwgcGFyYWxsZWxpc20uCisgICAgLy8vCisgICAgLy8vIEFueSBibG9ja3MgaW4gRXh0cmFibG9ja3MgYXJlIGluY2x1ZGVkIGFzIGlmIHRoZXkgd2VyZSBwYXJ0IG9mIHRoZQorICAgIC8vLyB0cmFjZS4gTGlrZXdpc2UsIGV4dHJhIHJlc291cmNlcyByZXF1aXJlZCBieSB0aGUgc3BlY2lmaWVkIHNjaGVkdWxpbmcKKyAgICAvLy8gY2xhc3NlcyBhcmUgaW5jbHVkZWQuIEZvciB0aGUgY2FsbGVyIHRvIGFjY291bnQgZm9yIGV4dHJhIG1hY2hpbmUKKyAgICAvLy8gaW5zdHJ1Y3Rpb25zLCBpdCBtdXN0IGZpcnN0IHJlc29sdmUgZWFjaCBpbnN0cnVjdGlvbidzIHNjaGVkdWxpbmcgY2xhc3MuCisgICAgdW5zaWduZWQgZ2V0UmVzb3VyY2VMZW5ndGgoCisgICAgICAgIEFycmF5UmVmPGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICo+IEV4dHJhYmxvY2tzID0gTm9uZSwKKyAgICAgICAgQXJyYXlSZWY8Y29uc3QgTUNTY2hlZENsYXNzRGVzYyAqPiBFeHRyYUluc3RycyA9IE5vbmUsCisgICAgICAgIEFycmF5UmVmPGNvbnN0IE1DU2NoZWRDbGFzc0Rlc2MgKj4gUmVtb3ZlSW5zdHJzID0gTm9uZSkgY29uc3Q7CisKKyAgICAvLy8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIChkYXRhIGRlcGVuZGVuY3kpIGNyaXRpY2FsIHBhdGggdGhyb3VnaCB0aGUKKyAgICAvLy8gdHJhY2UuCisgICAgdW5zaWduZWQgZ2V0Q3JpdGljYWxQYXRoKCkgY29uc3QgeyByZXR1cm4gVEJJLkNyaXRpY2FsUGF0aDsgfQorCisgICAgLy8vIFJldHVybiB0aGUgZGVwdGggYW5kIGhlaWdodCBvZiBNSS4gVGhlIGRlcHRoIGlzIG9ubHkgdmFsaWQgZm9yCisgICAgLy8vIGluc3RydWN0aW9ucyBpbiBvciBhYm92ZSB0aGUgdHJhY2UgY2VudGVyIGJsb2NrLiBUaGUgaGVpZ2h0IGlzIG9ubHkKKyAgICAvLy8gdmFsaWQgZm9yIGluc3RydWN0aW9ucyBpbiBvciBiZWxvdyB0aGUgdHJhY2UgY2VudGVyIGJsb2NrLgorICAgIEluc3RyQ3ljbGVzIGdldEluc3RyQ3ljbGVzKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0IHsKKyAgICAgIHJldHVybiBURS5DeWNsZXMubG9va3VwKCZNSSk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgc2xhY2sgb2YgTUkuIFRoaXMgaXMgdGhlIG51bWJlciBvZiBjeWNsZXMgTUkgY2FuIGJlIGRlbGF5ZWQKKyAgICAvLy8gYmVmb3JlIHRoZSBjcml0aWNhbCBwYXRoIGJlY29tZXMgbG9uZ2VyLgorICAgIC8vLyBNSSBtdXN0IGJlIGFuIGluc3RydWN0aW9uIGluIHRoZSB0cmFjZSBjZW50ZXIgYmxvY2suCisgICAgdW5zaWduZWQgZ2V0SW5zdHJTbGFjayhjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdDsKKworICAgIC8vLyBSZXR1cm4gdGhlIERlcHRoIG9mIGEgUEhJIGluc3RydWN0aW9uIGluIGEgdHJhY2UgY2VudGVyIGJsb2NrIHN1Y2Nlc3Nvci4KKyAgICAvLy8gVGhlIFBISSBkb2VzIG5vdCBoYXZlIHRvIGJlIHBhcnQgb2YgdGhlIHRyYWNlLgorICAgIHVuc2lnbmVkIGdldFBISURlcHRoKGNvbnN0IE1hY2hpbmVJbnN0ciAmUEhJKSBjb25zdDsKKworICAgIC8vLyBBIGRlcGVuZGVuY2UgaXMgdXNlZnVsIGlmIHRoZSBiYXNpYyBibG9jayBvZiB0aGUgZGVmaW5pbmcgaW5zdHJ1Y3Rpb24KKyAgICAvLy8gaXMgcGFydCBvZiB0aGUgdHJhY2Ugb2YgdGhlIHVzZXIgaW5zdHJ1Y3Rpb24uIEl0IGlzIGFzc3VtZWQgdGhhdCBEZWZNSQorICAgIC8vLyBkb21pbmF0ZXMgVXNlTUkgKHNlZSBhbHNvIGlzVXNlZnVsRG9taW5hdG9yKS4KKyAgICBib29sIGlzRGVwSW5UcmFjZShjb25zdCBNYWNoaW5lSW5zdHIgJkRlZk1JLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAmVXNlTUkpIGNvbnN0OworICB9OworCisgIC8vLyBBIHRyYWNlIGVuc2VtYmxlIGlzIGEgY29sbGVjdGlvbiBvZiB0cmFjZXMgc2VsZWN0ZWQgdXNpbmcgdGhlIHNhbWUKKyAgLy8vIHN0cmF0ZWd5LCBmb3IgZXhhbXBsZSAnbWluaW11bSByZXNvdXJjZSBoZWlnaHQnLiBUaGVyZSBpcyBvbmUgdHJhY2UgZm9yCisgIC8vLyBldmVyeSBibG9jayBpbiB0aGUgZnVuY3Rpb24uCisgIGNsYXNzIEVuc2VtYmxlIHsKKyAgICBmcmllbmQgY2xhc3MgVHJhY2U7CisKKyAgICBTbWFsbFZlY3RvcjxUcmFjZUJsb2NrSW5mbywgND4gQmxvY2tJbmZvOworICAgIERlbnNlTWFwPGNvbnN0IE1hY2hpbmVJbnN0ciosIEluc3RyQ3ljbGVzPiBDeWNsZXM7CisgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDA+IFByb2NSZXNvdXJjZURlcHRoczsKKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMD4gUHJvY1Jlc291cmNlSGVpZ2h0czsKKworICAgIHZvaWQgY29tcHV0ZVRyYWNlKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrKik7CisgICAgdm9pZCBjb21wdXRlRGVwdGhSZXNvdXJjZXMoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sqKTsKKyAgICB2b2lkIGNvbXB1dGVIZWlnaHRSZXNvdXJjZXMoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sqKTsKKyAgICB1bnNpZ25lZCBjb21wdXRlQ3Jvc3NCbG9ja0NyaXRpY2FsUGF0aChjb25zdCBUcmFjZUJsb2NrSW5mbyYpOworICAgIHZvaWQgY29tcHV0ZUluc3RyRGVwdGhzKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrKik7CisgICAgdm9pZCBjb21wdXRlSW5zdHJIZWlnaHRzKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrKik7CisgICAgdm9pZCBhZGRMaXZlSW5zKGNvbnN0IE1hY2hpbmVJbnN0ciAqRGVmTUksIHVuc2lnbmVkIERlZk9wLAorICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBNYWNoaW5lQmFzaWNCbG9jayo+IFRyYWNlKTsKKworICBwcm90ZWN0ZWQ6CisgICAgTWFjaGluZVRyYWNlTWV0cmljcyAmTVRNOworCisgICAgZXhwbGljaXQgRW5zZW1ibGUoTWFjaGluZVRyYWNlTWV0cmljcyopOworCisgICAgdmlydHVhbCBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqcGlja1RyYWNlUHJlZChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayopID0wOworICAgIHZpcnR1YWwgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKnBpY2tUcmFjZVN1Y2MoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sqKSA9MDsKKyAgICBjb25zdCBNYWNoaW5lTG9vcCAqZ2V0TG9vcEZvcihjb25zdCBNYWNoaW5lQmFzaWNCbG9jayopIGNvbnN0OworICAgIGNvbnN0IFRyYWNlQmxvY2tJbmZvICpnZXREZXB0aFJlc291cmNlcyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayopIGNvbnN0OworICAgIGNvbnN0IFRyYWNlQmxvY2tJbmZvICpnZXRIZWlnaHRSZXNvdXJjZXMoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sqKSBjb25zdDsKKyAgICBBcnJheVJlZjx1bnNpZ25lZD4gZ2V0UHJvY1Jlc291cmNlRGVwdGhzKHVuc2lnbmVkIE1CQk51bSkgY29uc3Q7CisgICAgQXJyYXlSZWY8dW5zaWduZWQ+IGdldFByb2NSZXNvdXJjZUhlaWdodHModW5zaWduZWQgTUJCTnVtKSBjb25zdDsKKworICBwdWJsaWM6CisgICAgdmlydHVhbCB+RW5zZW1ibGUoKTsKKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0TmFtZSgpIGNvbnN0ID0gMDsKKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtJikgY29uc3Q7CisgICAgdm9pZCBpbnZhbGlkYXRlKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpOworICAgIHZvaWQgdmVyaWZ5KCkgY29uc3Q7CisKKyAgICAvLy8gR2V0IHRoZSB0cmFjZSB0aGF0IHBhc3NlcyB0aHJvdWdoIE1CQi4KKyAgICAvLy8gVGhlIHRyYWNlIGlzIGNvbXB1dGVkIG9uIGRlbWFuZC4KKyAgICBUcmFjZSBnZXRUcmFjZShjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKTsKKworICAgIC8vLyBVcGRhdGVzIHRoZSBkZXB0aCBvZiBhbiBtYWNoaW5lIGluc3RydWN0aW9uLCBnaXZlbiBSZWdVbml0cy4KKyAgICB2b2lkIHVwZGF0ZURlcHRoKFRyYWNlQmxvY2tJbmZvICZUQkksIGNvbnN0IE1hY2hpbmVJbnN0ciYsCisgICAgICAgICAgICAgICAgICAgICBTcGFyc2VTZXQ8TGl2ZVJlZ1VuaXQ+ICZSZWdVbml0cyk7CisgICAgdm9pZCB1cGRhdGVEZXB0aChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqLCBjb25zdCBNYWNoaW5lSW5zdHImLAorICAgICAgICAgICAgICAgICAgICAgU3BhcnNlU2V0PExpdmVSZWdVbml0PiAmUmVnVW5pdHMpOworCisgICAgLy8vIFVwZGF0ZXMgdGhlIGRlcHRoIG9mIHRoZSBpbnN0cnVjdGlvbnMgZnJvbSBTdGFydCB0byBFbmQuCisgICAgdm9pZCB1cGRhdGVEZXB0aHMoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBFbmQsCisgICAgICAgICAgICAgICAgICAgICAgU3BhcnNlU2V0PExpdmVSZWdVbml0PiAmUmVnVW5pdHMpOworCisgIH07CisKKyAgLy8vIFN0cmF0ZWdpZXMgZm9yIHNlbGVjdGluZyB0cmFjZXMuCisgIGVudW0gU3RyYXRlZ3kgeworICAgIC8vLyBTZWxlY3QgdGhlIHRyYWNlIHRocm91Z2ggYSBibG9jayB0aGF0IGhhcyB0aGUgZmV3ZXN0IGluc3RydWN0aW9ucy4KKyAgICBUU19NaW5JbnN0ckNvdW50LAorCisgICAgVFNfTnVtU3RyYXRlZ2llcworICB9OworCisgIC8vLyBHZXQgdGhlIHRyYWNlIGVuc2VtYmxlIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gdHJhY2Ugc2VsZWN0aW9uIHN0cmF0ZWd5LgorICAvLy8gVGhlIHJldHVybmVkIEVuc2VtYmxlIG9iamVjdCBpcyBvd25lZCBieSB0aGUgTWFjaGluZVRyYWNlTWV0cmljcyBhbmFseXNpcywKKyAgLy8vIGFuZCB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBhbmFseXNpcyBwYXNzLgorICBFbnNlbWJsZSAqZ2V0RW5zZW1ibGUoU3RyYXRlZ3kpOworCisgIC8vLyBJbnZhbGlkYXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBhYm91dCBNQkIuIFRoaXMgbXVzdCBiZSBjYWxsZWQgKmJlZm9yZSogTUJCCisgIC8vLyBpcyBlcmFzZWQsIG9yIHRoZSBDRkcgaXMgb3RoZXJ3aXNlIGNoYW5nZWQuCisgIC8vLworICAvLy8gVGhpcyBpbnZhbGlkYXRlcyBwZXItYmxvY2sgaW5mb3JtYXRpb24gYWJvdXQgcmVzb3VyY2UgdXNhZ2UgZm9yIE1CQiBvbmx5LAorICAvLy8gYW5kIGl0IGludmFsaWRhdGVzIHBlci10cmFjZSBpbmZvcm1hdGlvbiBmb3IgYW55IHRyYWNlIHRoYXQgcGFzc2VzCisgIC8vLyB0aHJvdWdoIE1CQi4KKyAgLy8vCisgIC8vLyBDYWxsIEVuc2VtYmxlOjpnZXRUcmFjZSgpIGFnYWluIHRvIHVwZGF0ZSBhbnkgdHJhY2UgaGFuZGxlcy4KKyAgdm9pZCBpbnZhbGlkYXRlKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpOworCitwcml2YXRlOgorICAvLyBPbmUgZW50cnkgcGVyIGJhc2ljIGJsb2NrLCBpbmRleGVkIGJ5IGJsb2NrIG51bWJlci4KKyAgU21hbGxWZWN0b3I8Rml4ZWRCbG9ja0luZm8sIDQ+IEJsb2NrSW5mbzsKKworICAvLyBDeWNsZXMgY29uc3VtZWQgb24gZWFjaCBwcm9jZXNzb3IgcmVzb3VyY2UgcGVyIGJsb2NrLgorICAvLyBUaGUgbnVtYmVyIG9mIHByb2Nlc3NvciByZXNvdXJjZSBraW5kcyBpcyBjb25zdGFudCBmb3IgYSBnaXZlbiBzdWJ0YXJnZXQsCisgIC8vIGJ1dCBpdCBpcyBub3Qga25vd24gYXQgY29tcGlsZSB0aW1lLiBUaGUgbnVtYmVyIG9mIGN5Y2xlcyBjb25zdW1lZCBieQorICAvLyBibG9jayBCIG9uIHByb2Nlc3NvciByZXNvdXJjZSBSIGlzIGF0IFByb2NSZXNvdXJjZUN5Y2xlc1tCKktpbmRzICsgUl0KKyAgLy8gd2hlcmUgS2luZHMgPSBTY2hlZE1vZGVsLmdldE51bVByb2NSZXNvdXJjZUtpbmRzKCkuCisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAwPiBQcm9jUmVzb3VyY2VDeWNsZXM7CisKKyAgLy8gT25lIGVuc2VtYmxlIHBlciBzdHJhdGVneS4KKyAgRW5zZW1ibGUqIEVuc2VtYmxlc1tUU19OdW1TdHJhdGVnaWVzXTsKKworICAvLyBDb252ZXJ0IHNjYWxlZCByZXNvdXJjZSB1c2FnZSB0byBhIGN5Y2xlIGNvdW50IHRoYXQgY2FuIGJlIGNvbXBhcmVkIHdpdGgKKyAgLy8gbGF0ZW5jaWVzLgorICB1bnNpZ25lZCBnZXRDeWNsZXModW5zaWduZWQgU2NhbGVkKSB7CisgICAgdW5zaWduZWQgRmFjdG9yID0gU2NoZWRNb2RlbC5nZXRMYXRlbmN5RmFjdG9yKCk7CisgICAgcmV0dXJuIChTY2FsZWQgKyBGYWN0b3IgLSAxKSAvIEZhY3RvcjsKKyAgfQorfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lVHJhY2VNZXRyaWNzOjpUcmFjZSAmVHIpIHsKKyAgVHIucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVRyYWNlTWV0cmljczo6RW5zZW1ibGUgJkVuKSB7CisgIEVuLnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX01BQ0hJTkVUUkFDRU1FVFJJQ1NfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY3JvRnVzaW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjcm9GdXNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzEwNWZkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY3JvRnVzaW9uLmgKQEAgLTAsMCArMSw1MCBAQAorLy89PT0tIE1hY3JvRnVzaW9uLmggLSBNYWNybyBGdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBEQUcgc2NoZWR1bGluZyBtdXRhdGlvbiB0bworLy8vIHBhaXIgaW5zdHJ1Y3Rpb25zIGJhY2sgdG8gYmFjay4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNST0ZVU0lPTl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNST0ZVU0lPTl9ICisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBTY2hlZHVsZURBR011dGF0aW9uOworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworY2xhc3MgVGFyZ2V0U3VidGFyZ2V0SW5mbzsKKworLy8vIFxicmllZiBDaGVjayBpZiB0aGUgaW5zdHIgcGFpciwgRmlyc3RNSSBhbmQgU2Vjb25kTUksIHNob3VsZCBiZSBmdXNlZAorLy8vIHRvZ2V0aGVyLiBHaXZlbiBTZWNvbmRNSSwgd2hlbiBGaXJzdE1JIGlzIHVuc3BlY2lmaWVkLCB0aGVuIGNoZWNrIGlmCisvLy8gU2Vjb25kTUkgbWF5IGJlIHBhcnQgb2YgYSBmdXNlZCBwYWlyIGF0IGFsbC4KK3VzaW5nIFNob3VsZFNjaGVkdWxlUHJlZFR5ID0gc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0U3VidGFyZ2V0SW5mbyAmVFNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICpGaXJzdE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICZTZWNvbmRNSSk+OworCisvLy8gXGJyaWVmIENyZWF0ZSBhIERBRyBzY2hlZHVsaW5nIG11dGF0aW9uIHRvIHBhaXIgaW5zdHJ1Y3Rpb25zIGJhY2sgdG8gYmFjaworLy8vIGZvciBpbnN0cnVjdGlvbnMgdGhhdCBiZW5lZml0IGFjY29yZGluZyB0byB0aGUgdGFyZ2V0LXNwZWNpZmljCisvLy8gc2hvdWxkU2NoZWR1bGVBZGphY2VudCBwcmVkaWNhdGUgZnVuY3Rpb24uCitzdGQ6OnVuaXF1ZV9wdHI8U2NoZWR1bGVEQUdNdXRhdGlvbj4KK2NyZWF0ZU1hY3JvRnVzaW9uREFHTXV0YXRpb24oU2hvdWxkU2NoZWR1bGVQcmVkVHkgc2hvdWxkU2NoZWR1bGVBZGphY2VudCk7CisKKy8vLyBcYnJpZWYgQ3JlYXRlIGEgREFHIHNjaGVkdWxpbmcgbXV0YXRpb24gdG8gcGFpciBicmFuY2ggaW5zdHJ1Y3Rpb25zIHdpdGggb25lCisvLy8gb2YgdGhlaXIgcHJlZGVjZXNzb3JzIGJhY2sgdG8gYmFjayBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgYmVuZWZpdCBhY2NvcmRpbmcKKy8vLyB0byB0aGUgdGFyZ2V0LXNwZWNpZmljIHNob3VsZFNjaGVkdWxlQWRqYWNlbnQgcHJlZGljYXRlIGZ1bmN0aW9uLgorc3RkOjp1bmlxdWVfcHRyPFNjaGVkdWxlREFHTXV0YXRpb24+CitjcmVhdGVCcmFuY2hNYWNyb0Z1c2lvbkRBR011dGF0aW9uKFNob3VsZFNjaGVkdWxlUHJlZFR5IHNob3VsZFNjaGVkdWxlQWRqYWNlbnQpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX01BQ1JPRlVTSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QQlFQL0Nvc3RBbGxvY2F0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QQlFQL0Nvc3RBbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGU0NTFhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1BCUVAvQ29zdEFsbG9jYXRvci5oCkBAIC0wLDAgKzEsMTM1IEBACisvLz09PS0gQ29zdEFsbG9jYXRvci5oIC0gUEJRUCBDb3N0IEFsbG9jYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIERlZmluZXMgY2xhc3NlcyBjb25mb3JtaW5nIHRvIHRoZSBQQlFQIGNvc3QgdmFsdWUgbWFuYWdlciBjb25jZXB0LgorLy8KKy8vIENvc3QgdmFsdWUgbWFuYWdlcnMgYXJlIG1lbW9yeSBtYW5hZ2VycyBmb3IgUEJRUCBjb3N0IHZhbHVlcyAodmVjdG9ycyBhbmQKKy8vIG1hdHJpY2VzKS4gU2luY2UgUEJRUCBncmFwaHMgY2FuIGdyb3cgdmVyeSBsYXJnZSAoRS5nLiBodW5kcmVkcyBvZiB0aG91c2FuZHMKKy8vIG9mIGVkZ2VzIG9uIHRoZSBsYXJnZXN0IGZ1bmN0aW9uIGluIFNQRUMyMDA2KS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9QQlFQX0NPU1RBTExPQ0FUT1JfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUEJRUF9DT1NUQUxMT0NBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgUEJRUCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVQ+IGNsYXNzIFZhbHVlUG9vbCB7CitwdWJsaWM6CisgIHVzaW5nIFBvb2xSZWYgPSBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVmFsdWVUPjsKKworcHJpdmF0ZToKKyAgY2xhc3MgUG9vbEVudHJ5IDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8UG9vbEVudHJ5PiB7CisgIHB1YmxpYzoKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVLZXlUPgorICAgIFBvb2xFbnRyeShWYWx1ZVBvb2wgJlBvb2wsIFZhbHVlS2V5VCBWYWx1ZSkKKyAgICAgICAgOiBQb29sKFBvb2wpLCBWYWx1ZShzdGQ6Om1vdmUoVmFsdWUpKSB7fQorCisgICAgflBvb2xFbnRyeSgpIHsgUG9vbC5yZW1vdmVFbnRyeSh0aGlzKTsgfQorCisgICAgY29uc3QgVmFsdWVUICZnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgcHJpdmF0ZToKKyAgICBWYWx1ZVBvb2wgJlBvb2w7CisgICAgVmFsdWVUIFZhbHVlOworICB9OworCisgIGNsYXNzIFBvb2xFbnRyeURTSW5mbyB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgaW5saW5lIFBvb2xFbnRyeSAqZ2V0RW1wdHlLZXkoKSB7IHJldHVybiBudWxscHRyOyB9CisKKyAgICBzdGF0aWMgaW5saW5lIFBvb2xFbnRyeSAqZ2V0VG9tYnN0b25lS2V5KCkgeworICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UG9vbEVudHJ5ICo+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oMSkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZUtleVQ+CisgICAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBWYWx1ZUtleVQgJkMpIHsKKyAgICAgIHJldHVybiBoYXNoX3ZhbHVlKEMpOworICAgIH0KKworICAgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoUG9vbEVudHJ5ICpQKSB7CisgICAgICByZXR1cm4gZ2V0SGFzaFZhbHVlKFAtPmdldFZhbHVlKCkpOworICAgIH0KKworICAgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgUG9vbEVudHJ5ICpQKSB7CisgICAgICByZXR1cm4gZ2V0SGFzaFZhbHVlKFAtPmdldFZhbHVlKCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZUtleVQxLCB0eXBlbmFtZSBWYWx1ZUtleVQyPgorICAgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgVmFsdWVLZXlUMSAmQzEsIGNvbnN0IFZhbHVlS2V5VDIgJkMyKSB7CisgICAgICByZXR1cm4gQzEgPT0gQzI7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlS2V5VD4KKyAgICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IFZhbHVlS2V5VCAmQywgUG9vbEVudHJ5ICpQKSB7CisgICAgICBpZiAoUCA9PSBnZXRFbXB0eUtleSgpIHx8IFAgPT0gZ2V0VG9tYnN0b25lS2V5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiBpc0VxdWFsKEMsIFAtPmdldFZhbHVlKCkpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzRXF1YWwoUG9vbEVudHJ5ICpQMSwgUG9vbEVudHJ5ICpQMikgeworICAgICAgaWYgKFAxID09IGdldEVtcHR5S2V5KCkgfHwgUDEgPT0gZ2V0VG9tYnN0b25lS2V5KCkpCisgICAgICAgIHJldHVybiBQMSA9PSBQMjsKKyAgICAgIHJldHVybiBpc0VxdWFsKFAxLT5nZXRWYWx1ZSgpLCBQMik7CisgICAgfQorICB9OworCisgIHVzaW5nIEVudHJ5U2V0VCA9IERlbnNlU2V0PFBvb2xFbnRyeSAqLCBQb29sRW50cnlEU0luZm8+OworCisgIEVudHJ5U2V0VCBFbnRyeVNldDsKKworICB2b2lkIHJlbW92ZUVudHJ5KFBvb2xFbnRyeSAqUCkgeyBFbnRyeVNldC5lcmFzZShQKTsgfQorCitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZUtleVQ+IFBvb2xSZWYgZ2V0VmFsdWUoVmFsdWVLZXlUIFZhbHVlS2V5KSB7CisgICAgdHlwZW5hbWUgRW50cnlTZXRUOjppdGVyYXRvciBJID0gRW50cnlTZXQuZmluZF9hcyhWYWx1ZUtleSk7CisKKyAgICBpZiAoSSAhPSBFbnRyeVNldC5lbmQoKSkKKyAgICAgIHJldHVybiBQb29sUmVmKCgqSSktPnNoYXJlZF9mcm9tX3RoaXMoKSwgJigqSSktPmdldFZhbHVlKCkpOworCisgICAgYXV0byBQID0gc3RkOjptYWtlX3NoYXJlZDxQb29sRW50cnk+KCp0aGlzLCBzdGQ6Om1vdmUoVmFsdWVLZXkpKTsKKyAgICBFbnRyeVNldC5pbnNlcnQoUC5nZXQoKSk7CisgICAgcmV0dXJuIFBvb2xSZWYoc3RkOjptb3ZlKFApLCAmUC0+Z2V0VmFsdWUoKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWZWN0b3JULCB0eXBlbmFtZSBNYXRyaXhUPiBjbGFzcyBQb29sQ29zdEFsbG9jYXRvciB7Citwcml2YXRlOgorICB1c2luZyBWZWN0b3JDb3N0UG9vbCA9IFZhbHVlUG9vbDxWZWN0b3JUPjsKKyAgdXNpbmcgTWF0cml4Q29zdFBvb2wgPSBWYWx1ZVBvb2w8TWF0cml4VD47CisKK3B1YmxpYzoKKyAgdXNpbmcgVmVjdG9yID0gVmVjdG9yVDsKKyAgdXNpbmcgTWF0cml4ID0gTWF0cml4VDsKKyAgdXNpbmcgVmVjdG9yUHRyID0gdHlwZW5hbWUgVmVjdG9yQ29zdFBvb2w6OlBvb2xSZWY7CisgIHVzaW5nIE1hdHJpeFB0ciA9IHR5cGVuYW1lIE1hdHJpeENvc3RQb29sOjpQb29sUmVmOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBWZWN0b3JLZXlUPiBWZWN0b3JQdHIgZ2V0VmVjdG9yKFZlY3RvcktleVQgdikgeworICAgIHJldHVybiBWZWN0b3JQb29sLmdldFZhbHVlKHN0ZDo6bW92ZSh2KSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4S2V5VD4gTWF0cml4UHRyIGdldE1hdHJpeChNYXRyaXhLZXlUIG0pIHsKKyAgICByZXR1cm4gTWF0cml4UG9vbC5nZXRWYWx1ZShzdGQ6Om1vdmUobSkpOworICB9CisKK3ByaXZhdGU6CisgIFZlY3RvckNvc3RQb29sIFZlY3RvclBvb2w7CisgIE1hdHJpeENvc3RQb29sIE1hdHJpeFBvb2w7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgUEJRUAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9QQlFQX0NPU1RBTExPQ0FUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1BCUVAvR3JhcGguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QQlFQL0dyYXBoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0ODc4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QQlFQL0dyYXBoLmgKQEAgLTAsMCArMSw2NzUgQEAKKy8vPT09LSBHcmFwaC5oIC0gUEJRUCBHcmFwaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gUEJRUCBHcmFwaCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9QQlFQX0dSQVBIX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1BCUVBfR1JBUEhfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIFBCUVAgeworCisgIGNsYXNzIEdyYXBoQmFzZSB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBOb2RlSWQgPSB1bnNpZ25lZDsKKyAgICB1c2luZyBFZGdlSWQgPSB1bnNpZ25lZDsKKworICAgIC8vLyBAYnJpZWYgUmV0dXJucyBhIHZhbHVlIHJlcHJlc2VudGluZyBhbiBpbnZhbGlkIChub24tZXhpc3RlbnQpIG5vZGUuCisgICAgc3RhdGljIE5vZGVJZCBpbnZhbGlkTm9kZUlkKCkgeworICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8Tm9kZUlkPjo6bWF4KCk7CisgICAgfQorCisgICAgLy8vIEBicmllZiBSZXR1cm5zIGEgdmFsdWUgcmVwcmVzZW50aW5nIGFuIGludmFsaWQgKG5vbi1leGlzdGVudCkgZWRnZS4KKyAgICBzdGF0aWMgRWRnZUlkIGludmFsaWRFZGdlSWQoKSB7CisgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxFZGdlSWQ+OjptYXgoKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFBCUVAgR3JhcGggY2xhc3MuCisgIC8vLyBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBkZXNjcmliZSBQQlFQIHByb2JsZW1zLgorICAvLy8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvbHZlclQ+CisgIGNsYXNzIEdyYXBoIDogcHVibGljIEdyYXBoQmFzZSB7CisgIHByaXZhdGU6CisgICAgdXNpbmcgQ29zdEFsbG9jYXRvciA9IHR5cGVuYW1lIFNvbHZlclQ6OkNvc3RBbGxvY2F0b3I7CisKKyAgcHVibGljOgorICAgIHVzaW5nIFJhd1ZlY3RvciA9IHR5cGVuYW1lIFNvbHZlclQ6OlJhd1ZlY3RvcjsKKyAgICB1c2luZyBSYXdNYXRyaXggPSB0eXBlbmFtZSBTb2x2ZXJUOjpSYXdNYXRyaXg7CisgICAgdXNpbmcgVmVjdG9yID0gdHlwZW5hbWUgU29sdmVyVDo6VmVjdG9yOworICAgIHVzaW5nIE1hdHJpeCA9IHR5cGVuYW1lIFNvbHZlclQ6Ok1hdHJpeDsKKyAgICB1c2luZyBWZWN0b3JQdHIgPSB0eXBlbmFtZSBDb3N0QWxsb2NhdG9yOjpWZWN0b3JQdHI7CisgICAgdXNpbmcgTWF0cml4UHRyID0gdHlwZW5hbWUgQ29zdEFsbG9jYXRvcjo6TWF0cml4UHRyOworICAgIHVzaW5nIE5vZGVNZXRhZGF0YSA9IHR5cGVuYW1lIFNvbHZlclQ6Ok5vZGVNZXRhZGF0YTsKKyAgICB1c2luZyBFZGdlTWV0YWRhdGEgPSB0eXBlbmFtZSBTb2x2ZXJUOjpFZGdlTWV0YWRhdGE7CisgICAgdXNpbmcgR3JhcGhNZXRhZGF0YSA9IHR5cGVuYW1lIFNvbHZlclQ6OkdyYXBoTWV0YWRhdGE7CisKKyAgcHJpdmF0ZToKKyAgICBjbGFzcyBOb2RlRW50cnkgeworICAgIHB1YmxpYzoKKyAgICAgIHVzaW5nIEFkakVkZ2VMaXN0ID0gc3RkOjp2ZWN0b3I8RWRnZUlkPjsKKyAgICAgIHVzaW5nIEFkakVkZ2VJZHggPSBBZGpFZGdlTGlzdDo6c2l6ZV90eXBlOworICAgICAgdXNpbmcgQWRqRWRnZUl0ciA9IEFkakVkZ2VMaXN0Ojpjb25zdF9pdGVyYXRvcjsKKworICAgICAgTm9kZUVudHJ5KFZlY3RvclB0ciBDb3N0cykgOiBDb3N0cyhzdGQ6Om1vdmUoQ29zdHMpKSB7fQorCisgICAgICBzdGF0aWMgQWRqRWRnZUlkeCBnZXRJbnZhbGlkQWRqRWRnZUlkeCgpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8QWRqRWRnZUlkeD46Om1heCgpOworICAgICAgfQorCisgICAgICBBZGpFZGdlSWR4IGFkZEFkakVkZ2VJZChFZGdlSWQgRUlkKSB7CisgICAgICAgIEFkakVkZ2VJZHggSWR4ID0gQWRqRWRnZUlkcy5zaXplKCk7CisgICAgICAgIEFkakVkZ2VJZHMucHVzaF9iYWNrKEVJZCk7CisgICAgICAgIHJldHVybiBJZHg7CisgICAgICB9CisKKyAgICAgIHZvaWQgcmVtb3ZlQWRqRWRnZUlkKEdyYXBoICZHLCBOb2RlSWQgVGhpc05JZCwgQWRqRWRnZUlkeCBJZHgpIHsKKyAgICAgICAgLy8gU3dhcC1hbmQtcG9wIGZvciBmYXN0IHJlbW92YWwuCisgICAgICAgIC8vICAgMSkgVXBkYXRlIHRoZSBhZGogaW5kZXggb2YgdGhlIGVkZ2UgY3VycmVudGx5IGF0IGJhY2soKS4KKyAgICAgICAgLy8gICAyKSBNb3ZlIGxhc3QgRWRnZSBkb3duIHRvIElkeC4KKyAgICAgICAgLy8gICAzKSBwb3BfYmFjaygpCisgICAgICAgIC8vIElmIElkeCA9PSBzaXplKCkgLSAxIHRoZW4gdGhlIHNldEFkakVkZ2VJZHggYW5kIHN3YXAgYXJlCisgICAgICAgIC8vIHJlZHVuZGFudCwgYnV0IGJvdGggb3BlcmF0aW9ucyBhcmUgY2hlYXAuCisgICAgICAgIEcuZ2V0RWRnZShBZGpFZGdlSWRzLmJhY2soKSkuc2V0QWRqRWRnZUlkeChUaGlzTklkLCBJZHgpOworICAgICAgICBBZGpFZGdlSWRzW0lkeF0gPSBBZGpFZGdlSWRzLmJhY2soKTsKKyAgICAgICAgQWRqRWRnZUlkcy5wb3BfYmFjaygpOworICAgICAgfQorCisgICAgICBjb25zdCBBZGpFZGdlTGlzdCYgZ2V0QWRqRWRnZUlkcygpIGNvbnN0IHsgcmV0dXJuIEFkakVkZ2VJZHM7IH0KKworICAgICAgVmVjdG9yUHRyIENvc3RzOworICAgICAgTm9kZU1ldGFkYXRhIE1ldGFkYXRhOworCisgICAgcHJpdmF0ZToKKyAgICAgIEFkakVkZ2VMaXN0IEFkakVkZ2VJZHM7CisgICAgfTsKKworICAgIGNsYXNzIEVkZ2VFbnRyeSB7CisgICAgcHVibGljOgorICAgICAgRWRnZUVudHJ5KE5vZGVJZCBOMUlkLCBOb2RlSWQgTjJJZCwgTWF0cml4UHRyIENvc3RzKQorICAgICAgICAgIDogQ29zdHMoc3RkOjptb3ZlKENvc3RzKSkgeworICAgICAgICBOSWRzWzBdID0gTjFJZDsKKyAgICAgICAgTklkc1sxXSA9IE4ySWQ7CisgICAgICAgIFRoaXNFZGdlQWRqSWR4c1swXSA9IE5vZGVFbnRyeTo6Z2V0SW52YWxpZEFkakVkZ2VJZHgoKTsKKyAgICAgICAgVGhpc0VkZ2VBZGpJZHhzWzFdID0gTm9kZUVudHJ5OjpnZXRJbnZhbGlkQWRqRWRnZUlkeCgpOworICAgICAgfQorCisgICAgICB2b2lkIGNvbm5lY3RUb04oR3JhcGggJkcsIEVkZ2VJZCBUaGlzRWRnZUlkLCB1bnNpZ25lZCBOSWR4KSB7CisgICAgICAgIGFzc2VydChUaGlzRWRnZUFkaklkeHNbTklkeF0gPT0gTm9kZUVudHJ5OjpnZXRJbnZhbGlkQWRqRWRnZUlkeCgpICYmCisgICAgICAgICAgICAgICAiRWRnZSBhbHJlYWR5IGNvbm5lY3RlZCB0byBOSWRzW05JZHhdLiIpOworICAgICAgICBOb2RlRW50cnkgJk4gPSBHLmdldE5vZGUoTklkc1tOSWR4XSk7CisgICAgICAgIFRoaXNFZGdlQWRqSWR4c1tOSWR4XSA9IE4uYWRkQWRqRWRnZUlkKFRoaXNFZGdlSWQpOworICAgICAgfQorCisgICAgICB2b2lkIGNvbm5lY3QoR3JhcGggJkcsIEVkZ2VJZCBUaGlzRWRnZUlkKSB7CisgICAgICAgIGNvbm5lY3RUb04oRywgVGhpc0VkZ2VJZCwgMCk7CisgICAgICAgIGNvbm5lY3RUb04oRywgVGhpc0VkZ2VJZCwgMSk7CisgICAgICB9CisKKyAgICAgIHZvaWQgc2V0QWRqRWRnZUlkeChOb2RlSWQgTklkLCB0eXBlbmFtZSBOb2RlRW50cnk6OkFkakVkZ2VJZHggTmV3SWR4KSB7CisgICAgICAgIGlmIChOSWQgPT0gTklkc1swXSkKKyAgICAgICAgICBUaGlzRWRnZUFkaklkeHNbMF0gPSBOZXdJZHg7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGFzc2VydChOSWQgPT0gTklkc1sxXSAmJiAiRWRnZSBub3QgY29ubmVjdGVkIHRvIE5JZCIpOworICAgICAgICAgIFRoaXNFZGdlQWRqSWR4c1sxXSA9IE5ld0lkeDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB2b2lkIGRpc2Nvbm5lY3RGcm9tTihHcmFwaCAmRywgdW5zaWduZWQgTklkeCkgeworICAgICAgICBhc3NlcnQoVGhpc0VkZ2VBZGpJZHhzW05JZHhdICE9IE5vZGVFbnRyeTo6Z2V0SW52YWxpZEFkakVkZ2VJZHgoKSAmJgorICAgICAgICAgICAgICAgIkVkZ2Ugbm90IGNvbm5lY3RlZCB0byBOSWRzW05JZHhdLiIpOworICAgICAgICBOb2RlRW50cnkgJk4gPSBHLmdldE5vZGUoTklkc1tOSWR4XSk7CisgICAgICAgIE4ucmVtb3ZlQWRqRWRnZUlkKEcsIE5JZHNbTklkeF0sIFRoaXNFZGdlQWRqSWR4c1tOSWR4XSk7CisgICAgICAgIFRoaXNFZGdlQWRqSWR4c1tOSWR4XSA9IE5vZGVFbnRyeTo6Z2V0SW52YWxpZEFkakVkZ2VJZHgoKTsKKyAgICAgIH0KKworICAgICAgdm9pZCBkaXNjb25uZWN0RnJvbShHcmFwaCAmRywgTm9kZUlkIE5JZCkgeworICAgICAgICBpZiAoTklkID09IE5JZHNbMF0pCisgICAgICAgICAgZGlzY29ubmVjdEZyb21OKEcsIDApOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBhc3NlcnQoTklkID09IE5JZHNbMV0gJiYgIkVkZ2UgZG9lcyBub3QgY29ubmVjdCBOSWQiKTsKKyAgICAgICAgICBkaXNjb25uZWN0RnJvbU4oRywgMSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgTm9kZUlkIGdldE4xSWQoKSBjb25zdCB7IHJldHVybiBOSWRzWzBdOyB9CisgICAgICBOb2RlSWQgZ2V0TjJJZCgpIGNvbnN0IHsgcmV0dXJuIE5JZHNbMV07IH0KKworICAgICAgTWF0cml4UHRyIENvc3RzOworICAgICAgRWRnZU1ldGFkYXRhIE1ldGFkYXRhOworCisgICAgcHJpdmF0ZToKKyAgICAgIE5vZGVJZCBOSWRzWzJdOworICAgICAgdHlwZW5hbWUgTm9kZUVudHJ5OjpBZGpFZGdlSWR4IFRoaXNFZGdlQWRqSWR4c1syXTsKKyAgICB9OworCisgICAgLy8gLS0tLS0gTUVNQkVSUyAtLS0tLQorCisgICAgR3JhcGhNZXRhZGF0YSBNZXRhZGF0YTsKKyAgICBDb3N0QWxsb2NhdG9yIENvc3RBbGxvYzsKKyAgICBTb2x2ZXJUICpTb2x2ZXIgPSBudWxscHRyOworCisgICAgdXNpbmcgTm9kZVZlY3RvciA9IHN0ZDo6dmVjdG9yPE5vZGVFbnRyeT47CisgICAgdXNpbmcgRnJlZU5vZGVWZWN0b3IgPSBzdGQ6OnZlY3RvcjxOb2RlSWQ+OworICAgIE5vZGVWZWN0b3IgTm9kZXM7CisgICAgRnJlZU5vZGVWZWN0b3IgRnJlZU5vZGVJZHM7CisKKyAgICB1c2luZyBFZGdlVmVjdG9yID0gc3RkOjp2ZWN0b3I8RWRnZUVudHJ5PjsKKyAgICB1c2luZyBGcmVlRWRnZVZlY3RvciA9IHN0ZDo6dmVjdG9yPEVkZ2VJZD47CisgICAgRWRnZVZlY3RvciBFZGdlczsKKyAgICBGcmVlRWRnZVZlY3RvciBGcmVlRWRnZUlkczsKKworICAgIEdyYXBoKGNvbnN0IEdyYXBoICZPdGhlcikge30KKworICAgIC8vIC0tLS0tIElOVEVSTkFMIE1FVEhPRFMgLS0tLS0KKworICAgIE5vZGVFbnRyeSAmZ2V0Tm9kZShOb2RlSWQgTklkKSB7CisgICAgICBhc3NlcnQoTklkIDwgTm9kZXMuc2l6ZSgpICYmICJPdXQgb2YgYm91bmQgTm9kZUlkIik7CisgICAgICByZXR1cm4gTm9kZXNbTklkXTsKKyAgICB9CisgICAgY29uc3QgTm9kZUVudHJ5ICZnZXROb2RlKE5vZGVJZCBOSWQpIGNvbnN0IHsKKyAgICAgIGFzc2VydChOSWQgPCBOb2Rlcy5zaXplKCkgJiYgIk91dCBvZiBib3VuZCBOb2RlSWQiKTsKKyAgICAgIHJldHVybiBOb2Rlc1tOSWRdOworICAgIH0KKworICAgIEVkZ2VFbnRyeSYgZ2V0RWRnZShFZGdlSWQgRUlkKSB7IHJldHVybiBFZGdlc1tFSWRdOyB9CisgICAgY29uc3QgRWRnZUVudHJ5JiBnZXRFZGdlKEVkZ2VJZCBFSWQpIGNvbnN0IHsgcmV0dXJuIEVkZ2VzW0VJZF07IH0KKworICAgIE5vZGVJZCBhZGRDb25zdHJ1Y3RlZE5vZGUoTm9kZUVudHJ5IE4pIHsKKyAgICAgIE5vZGVJZCBOSWQgPSAwOworICAgICAgaWYgKCFGcmVlTm9kZUlkcy5lbXB0eSgpKSB7CisgICAgICAgIE5JZCA9IEZyZWVOb2RlSWRzLmJhY2soKTsKKyAgICAgICAgRnJlZU5vZGVJZHMucG9wX2JhY2soKTsKKyAgICAgICAgTm9kZXNbTklkXSA9IHN0ZDo6bW92ZShOKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIE5JZCA9IE5vZGVzLnNpemUoKTsKKyAgICAgICAgTm9kZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShOKSk7CisgICAgICB9CisgICAgICByZXR1cm4gTklkOworICAgIH0KKworICAgIEVkZ2VJZCBhZGRDb25zdHJ1Y3RlZEVkZ2UoRWRnZUVudHJ5IEUpIHsKKyAgICAgIGFzc2VydChmaW5kRWRnZShFLmdldE4xSWQoKSwgRS5nZXROMklkKCkpID09IGludmFsaWRFZGdlSWQoKSAmJgorICAgICAgICAgICAgICJBdHRlbXB0IHRvIGFkZCBkdXBsaWNhdGUgZWRnZS4iKTsKKyAgICAgIEVkZ2VJZCBFSWQgPSAwOworICAgICAgaWYgKCFGcmVlRWRnZUlkcy5lbXB0eSgpKSB7CisgICAgICAgIEVJZCA9IEZyZWVFZGdlSWRzLmJhY2soKTsKKyAgICAgICAgRnJlZUVkZ2VJZHMucG9wX2JhY2soKTsKKyAgICAgICAgRWRnZXNbRUlkXSA9IHN0ZDo6bW92ZShFKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEVJZCA9IEVkZ2VzLnNpemUoKTsKKyAgICAgICAgRWRnZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShFKSk7CisgICAgICB9CisKKyAgICAgIEVkZ2VFbnRyeSAmTkUgPSBnZXRFZGdlKEVJZCk7CisKKyAgICAgIC8vIEFkZCB0aGUgZWRnZSB0byB0aGUgYWRqYWNlbmN5IHNldHMgb2YgaXRzIG5vZGVzLgorICAgICAgTkUuY29ubmVjdCgqdGhpcywgRUlkKTsKKyAgICAgIHJldHVybiBFSWQ7CisgICAgfQorCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgR3JhcGggJk90aGVyKSB7fQorCisgIHB1YmxpYzoKKyAgICB1c2luZyBBZGpFZGdlSXRyID0gdHlwZW5hbWUgTm9kZUVudHJ5OjpBZGpFZGdlSXRyOworCisgICAgY2xhc3MgTm9kZUl0ciB7CisgICAgcHVibGljOgorICAgICAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworICAgICAgdXNpbmcgdmFsdWVfdHlwZSA9IE5vZGVJZDsKKyAgICAgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IGludDsKKyAgICAgIHVzaW5nIHBvaW50ZXIgPSBOb2RlSWQgKjsKKyAgICAgIHVzaW5nIHJlZmVyZW5jZSA9IE5vZGVJZCAmOworCisgICAgICBOb2RlSXRyKE5vZGVJZCBDdXJOSWQsIGNvbnN0IEdyYXBoICZHKQorICAgICAgICA6IEN1ck5JZChDdXJOSWQpLCBFbmROSWQoRy5Ob2Rlcy5zaXplKCkpLCBGcmVlTm9kZUlkcyhHLkZyZWVOb2RlSWRzKSB7CisgICAgICAgIHRoaXMtPkN1ck5JZCA9IGZpbmROZXh0SW5Vc2UoQ3VyTklkKTsgLy8gTW92ZSB0byBmaXJzdCBpbi11c2Ugbm9kZSBpZAorICAgICAgfQorCisgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTm9kZUl0ciAmTykgY29uc3QgeyByZXR1cm4gQ3VyTklkID09IE8uQ3VyTklkOyB9CisgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgTm9kZUl0ciAmTykgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBPKTsgfQorICAgICAgTm9kZUl0ciYgb3BlcmF0b3IrKygpIHsgQ3VyTklkID0gZmluZE5leHRJblVzZSgrK0N1ck5JZCk7IHJldHVybiAqdGhpczsgfQorICAgICAgTm9kZUlkIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIEN1ck5JZDsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIE5vZGVJZCBmaW5kTmV4dEluVXNlKE5vZGVJZCBOSWQpIGNvbnN0IHsKKyAgICAgICAgd2hpbGUgKE5JZCA8IEVuZE5JZCAmJiBpc19jb250YWluZWQoRnJlZU5vZGVJZHMsIE5JZCkpIHsKKyAgICAgICAgICArK05JZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTklkOworICAgICAgfQorCisgICAgICBOb2RlSWQgQ3VyTklkLCBFbmROSWQ7CisgICAgICBjb25zdCBGcmVlTm9kZVZlY3RvciAmRnJlZU5vZGVJZHM7CisgICAgfTsKKworICAgIGNsYXNzIEVkZ2VJdHIgeworICAgIHB1YmxpYzoKKyAgICAgIEVkZ2VJdHIoRWRnZUlkIEN1ckVJZCwgY29uc3QgR3JhcGggJkcpCisgICAgICAgIDogQ3VyRUlkKEN1ckVJZCksIEVuZEVJZChHLkVkZ2VzLnNpemUoKSksIEZyZWVFZGdlSWRzKEcuRnJlZUVkZ2VJZHMpIHsKKyAgICAgICAgdGhpcy0+Q3VyRUlkID0gZmluZE5leHRJblVzZShDdXJFSWQpOyAvLyBNb3ZlIHRvIGZpcnN0IGluLXVzZSBlZGdlIGlkCisgICAgICB9CisKKyAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFZGdlSXRyICZPKSBjb25zdCB7IHJldHVybiBDdXJFSWQgPT0gTy5DdXJFSWQ7IH0KKyAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBFZGdlSXRyICZPKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IE8pOyB9CisgICAgICBFZGdlSXRyJiBvcGVyYXRvcisrKCkgeyBDdXJFSWQgPSBmaW5kTmV4dEluVXNlKCsrQ3VyRUlkKTsgcmV0dXJuICp0aGlzOyB9CisgICAgICBFZGdlSWQgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQ3VyRUlkOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgRWRnZUlkIGZpbmROZXh0SW5Vc2UoRWRnZUlkIEVJZCkgY29uc3QgeworICAgICAgICB3aGlsZSAoRUlkIDwgRW5kRUlkICYmIGlzX2NvbnRhaW5lZChGcmVlRWRnZUlkcywgRUlkKSkgeworICAgICAgICAgICsrRUlkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBFSWQ7CisgICAgICB9CisKKyAgICAgIEVkZ2VJZCBDdXJFSWQsIEVuZEVJZDsKKyAgICAgIGNvbnN0IEZyZWVFZGdlVmVjdG9yICZGcmVlRWRnZUlkczsKKyAgICB9OworCisgICAgY2xhc3MgTm9kZUlkU2V0IHsKKyAgICBwdWJsaWM6CisgICAgICBOb2RlSWRTZXQoY29uc3QgR3JhcGggJkcpIDogRyhHKSB7fQorCisgICAgICBOb2RlSXRyIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gTm9kZUl0cigwLCBHKTsgfQorICAgICAgTm9kZUl0ciBlbmQoKSBjb25zdCB7IHJldHVybiBOb2RlSXRyKEcuTm9kZXMuc2l6ZSgpLCBHKTsgfQorCisgICAgICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gRy5Ob2Rlcy5lbXB0eSgpOyB9CisKKyAgICAgIHR5cGVuYW1lIE5vZGVWZWN0b3I6OnNpemVfdHlwZSBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gRy5Ob2Rlcy5zaXplKCkgLSBHLkZyZWVOb2RlSWRzLnNpemUoKTsKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICBjb25zdCBHcmFwaCYgRzsKKyAgICB9OworCisgICAgY2xhc3MgRWRnZUlkU2V0IHsKKyAgICBwdWJsaWM6CisgICAgICBFZGdlSWRTZXQoY29uc3QgR3JhcGggJkcpIDogRyhHKSB7fQorCisgICAgICBFZGdlSXRyIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gRWRnZUl0cigwLCBHKTsgfQorICAgICAgRWRnZUl0ciBlbmQoKSBjb25zdCB7IHJldHVybiBFZGdlSXRyKEcuRWRnZXMuc2l6ZSgpLCBHKTsgfQorCisgICAgICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gRy5FZGdlcy5lbXB0eSgpOyB9CisKKyAgICAgIHR5cGVuYW1lIE5vZGVWZWN0b3I6OnNpemVfdHlwZSBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gRy5FZGdlcy5zaXplKCkgLSBHLkZyZWVFZGdlSWRzLnNpemUoKTsKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICBjb25zdCBHcmFwaCYgRzsKKyAgICB9OworCisgICAgY2xhc3MgQWRqRWRnZUlkU2V0IHsKKyAgICBwdWJsaWM6CisgICAgICBBZGpFZGdlSWRTZXQoY29uc3QgTm9kZUVudHJ5ICZORSkgOiBORShORSkge30KKworICAgICAgdHlwZW5hbWUgTm9kZUVudHJ5OjpBZGpFZGdlSXRyIGJlZ2luKCkgY29uc3QgeworICAgICAgICByZXR1cm4gTkUuZ2V0QWRqRWRnZUlkcygpLmJlZ2luKCk7CisgICAgICB9CisKKyAgICAgIHR5cGVuYW1lIE5vZGVFbnRyeTo6QWRqRWRnZUl0ciBlbmQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBORS5nZXRBZGpFZGdlSWRzKCkuZW5kKCk7CisgICAgICB9CisKKyAgICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBORS5nZXRBZGpFZGdlSWRzKCkuZW1wdHkoKTsgfQorCisgICAgICB0eXBlbmFtZSBOb2RlRW50cnk6OkFkakVkZ2VMaXN0OjpzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIE5FLmdldEFkakVkZ2VJZHMoKS5zaXplKCk7CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgY29uc3QgTm9kZUVudHJ5ICZORTsKKyAgICB9OworCisgICAgLy8vIEBicmllZiBDb25zdHJ1Y3QgYW4gZW1wdHkgUEJRUCBncmFwaC4KKyAgICBHcmFwaCgpID0gZGVmYXVsdDsKKworICAgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGFuIGVtcHR5IFBCUVAgZ3JhcGggd2l0aCB0aGUgZ2l2ZW4gZ3JhcGggbWV0YWRhdGEuCisgICAgR3JhcGgoR3JhcGhNZXRhZGF0YSBNZXRhZGF0YSkgOiBNZXRhZGF0YShzdGQ6Om1vdmUoTWV0YWRhdGEpKSB7fQorCisgICAgLy8vIEBicmllZiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGdyYXBoIG1ldGFkYXRhLgorICAgIEdyYXBoTWV0YWRhdGEmIGdldE1ldGFkYXRhKCkgeyByZXR1cm4gTWV0YWRhdGE7IH0KKworICAgIC8vLyBAYnJpZWYgR2V0IGEgY29uc3QtcmVmZXJlbmNlIHRvIHRoZSBncmFwaCBtZXRhZGF0YS4KKyAgICBjb25zdCBHcmFwaE1ldGFkYXRhJiBnZXRNZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuIE1ldGFkYXRhOyB9CisKKyAgICAvLy8gQGJyaWVmIExvY2sgdGhpcyBncmFwaCB0byB0aGUgZ2l2ZW4gc29sdmVyIGluc3RhbmNlIGluIHByZXBhcmF0aW9uCisgICAgLy8vIGZvciBydW5uaW5nIHRoZSBzb2x2ZXIuIFRoaXMgbWV0aG9kIHdpbGwgY2FsbCBzb2x2ZXIuaGFuZGxlQWRkTm9kZSBmb3IKKyAgICAvLy8gZWFjaCBub2RlIGluIHRoZSBncmFwaCwgYW5kIGhhbmRsZUFkZEVkZ2UgZm9yIGVhY2ggZWRnZSwgdG8gZ2l2ZSB0aGUKKyAgICAvLy8gc29sdmVyIGFuIG9wcG9ydHVuaXR5IHRvIHNldCB1cCBhbnkgcmVxdXJpZWQgbWV0YWRhdGEuCisgICAgdm9pZCBzZXRTb2x2ZXIoU29sdmVyVCAmUykgeworICAgICAgYXNzZXJ0KCFTb2x2ZXIgJiYgIlNvbHZlciBhbHJlYWR5IHNldC4gQ2FsbCB1bnNldFNvbHZlcigpLiIpOworICAgICAgU29sdmVyID0gJlM7CisgICAgICBmb3IgKGF1dG8gTklkIDogbm9kZUlkcygpKQorICAgICAgICBTb2x2ZXItPmhhbmRsZUFkZE5vZGUoTklkKTsKKyAgICAgIGZvciAoYXV0byBFSWQgOiBlZGdlSWRzKCkpCisgICAgICAgIFNvbHZlci0+aGFuZGxlQWRkRWRnZShFSWQpOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgUmVsZWFzZSBmcm9tIHNvbHZlciBpbnN0YW5jZS4KKyAgICB2b2lkIHVuc2V0U29sdmVyKCkgeworICAgICAgYXNzZXJ0KFNvbHZlciAmJiAiU29sdmVyIG5vdCBzZXQuIik7CisgICAgICBTb2x2ZXIgPSBudWxscHRyOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgQWRkIGEgbm9kZSB3aXRoIHRoZSBnaXZlbiBjb3N0cy4KKyAgICAvLy8gQHBhcmFtIENvc3RzIENvc3QgdmVjdG9yIGZvciB0aGUgbmV3IG5vZGUuCisgICAgLy8vIEByZXR1cm4gTm9kZSBpdGVyYXRvciBmb3IgdGhlIGFkZGVkIG5vZGUuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIE90aGVyVmVjdG9yVD4KKyAgICBOb2RlSWQgYWRkTm9kZShPdGhlclZlY3RvclQgQ29zdHMpIHsKKyAgICAgIC8vIEdldCBjb3N0IHZlY3RvciBmcm9tIHRoZSBwcm9ibGVtIGRvbWFpbgorICAgICAgVmVjdG9yUHRyIEFsbG9jYXRlZENvc3RzID0gQ29zdEFsbG9jLmdldFZlY3RvcihzdGQ6Om1vdmUoQ29zdHMpKTsKKyAgICAgIE5vZGVJZCBOSWQgPSBhZGRDb25zdHJ1Y3RlZE5vZGUoTm9kZUVudHJ5KEFsbG9jYXRlZENvc3RzKSk7CisgICAgICBpZiAoU29sdmVyKQorICAgICAgICBTb2x2ZXItPmhhbmRsZUFkZE5vZGUoTklkKTsKKyAgICAgIHJldHVybiBOSWQ7CisgICAgfQorCisgICAgLy8vIEBicmllZiBBZGQgYSBub2RlIGJ5cGFzc2luZyB0aGUgY29zdCBhbGxvY2F0b3IuCisgICAgLy8vIEBwYXJhbSBDb3N0cyBDb3N0IHZlY3RvciBwdHIgZm9yIHRoZSBuZXcgbm9kZSAobXVzdCBiZSBjb252ZXJ0aWJsZSB0bworICAgIC8vLyAgICAgICAgVmVjdG9yUHRyKS4KKyAgICAvLy8gQHJldHVybiBOb2RlIGl0ZXJhdG9yIGZvciB0aGUgYWRkZWQgbm9kZS4KKyAgICAvLy8KKyAgICAvLy8gICBUaGlzIG1ldGhvZCBhbGxvd3MgZm9yIGZhc3QgYWRkaXRpb24gb2YgYSBub2RlIHdob3NlIGNvc3RzIGRvbid0IG5lZWQKKyAgICAvLy8gdG8gYmUgcGFzc2VkIHRocm91Z2ggdGhlIGNvc3QgYWxsb2NhdG9yLiBUaGUgbW9zdCBjb21tb24gdXNlIGNhc2UgZm9yCisgICAgLy8vIHRoaXMgaXMgd2hlbiBkdXBsaWNhdGluZyBjb3N0cyBmcm9tIGFuIGV4aXN0aW5nIG5vZGUgKHdoZW4gdXNpbmcgYQorICAgIC8vLyBwb29saW5nIGFsbG9jYXRvcikuIFRoZXNlIGhhdmUgYWxyZWFkeSBiZWVuIHVuaXF1ZWQsIHNvIHdlIGNhbiBhdm9pZAorICAgIC8vLyByZS1jb25zdHJ1Y3RpbmcgYW5kIHJlLXVuaXF1aW5nIHRoZW0gYnkgYXR0YWNoaW5nIHRoZW0gZGlyZWN0bHkgdG8gdGhlCisgICAgLy8vIG5ldyBub2RlLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdGhlclZlY3RvclB0clQ+CisgICAgTm9kZUlkIGFkZE5vZGVCeXBhc3NpbmdDb3N0QWxsb2NhdG9yKE90aGVyVmVjdG9yUHRyVCBDb3N0cykgeworICAgICAgTm9kZUlkIE5JZCA9IGFkZENvbnN0cnVjdGVkTm9kZShOb2RlRW50cnkoQ29zdHMpKTsKKyAgICAgIGlmIChTb2x2ZXIpCisgICAgICAgIFNvbHZlci0+aGFuZGxlQWRkTm9kZShOSWQpOworICAgICAgcmV0dXJuIE5JZDsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIEFkZCBhbiBlZGdlIGJldHdlZW4gdGhlIGdpdmVuIG5vZGVzIHdpdGggdGhlIGdpdmVuIGNvc3RzLgorICAgIC8vLyBAcGFyYW0gTjFJZCBGaXJzdCBub2RlLgorICAgIC8vLyBAcGFyYW0gTjJJZCBTZWNvbmQgbm9kZS4KKyAgICAvLy8gQHBhcmFtIENvc3RzIENvc3QgbWF0cml4IGZvciBuZXcgZWRnZS4KKyAgICAvLy8gQHJldHVybiBFZGdlIGl0ZXJhdG9yIGZvciB0aGUgYWRkZWQgZWRnZS4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJWZWN0b3JUPgorICAgIEVkZ2VJZCBhZGRFZGdlKE5vZGVJZCBOMUlkLCBOb2RlSWQgTjJJZCwgT3RoZXJWZWN0b3JUIENvc3RzKSB7CisgICAgICBhc3NlcnQoZ2V0Tm9kZUNvc3RzKE4xSWQpLmdldExlbmd0aCgpID09IENvc3RzLmdldFJvd3MoKSAmJgorICAgICAgICAgICAgIGdldE5vZGVDb3N0cyhOMklkKS5nZXRMZW5ndGgoKSA9PSBDb3N0cy5nZXRDb2xzKCkgJiYKKyAgICAgICAgICAgICAiTWF0cml4IGRpbWVuc2lvbnMgbWlzbWF0Y2guIik7CisgICAgICAvLyBHZXQgY29zdCBtYXRyaXggZnJvbSB0aGUgcHJvYmxlbSBkb21haW4uCisgICAgICBNYXRyaXhQdHIgQWxsb2NhdGVkQ29zdHMgPSBDb3N0QWxsb2MuZ2V0TWF0cml4KHN0ZDo6bW92ZShDb3N0cykpOworICAgICAgRWRnZUlkIEVJZCA9IGFkZENvbnN0cnVjdGVkRWRnZShFZGdlRW50cnkoTjFJZCwgTjJJZCwgQWxsb2NhdGVkQ29zdHMpKTsKKyAgICAgIGlmIChTb2x2ZXIpCisgICAgICAgIFNvbHZlci0+aGFuZGxlQWRkRWRnZShFSWQpOworICAgICAgcmV0dXJuIEVJZDsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIEFkZCBhbiBlZGdlIGJ5cGFzc2luZyB0aGUgY29zdCBhbGxvY2F0b3IuCisgICAgLy8vIEBwYXJhbSBOMUlkIEZpcnN0IG5vZGUuCisgICAgLy8vIEBwYXJhbSBOMklkIFNlY29uZCBub2RlLgorICAgIC8vLyBAcGFyYW0gQ29zdHMgQ29zdCBtYXRyaXggZm9yIG5ldyBlZGdlLgorICAgIC8vLyBAcmV0dXJuIEVkZ2UgaXRlcmF0b3IgZm9yIHRoZSBhZGRlZCBlZGdlLgorICAgIC8vLworICAgIC8vLyAgIFRoaXMgbWV0aG9kIGFsbG93cyBmb3IgZmFzdCBhZGRpdGlvbiBvZiBhbiBlZGdlIHdob3NlIGNvc3RzIGRvbid0IG5lZWQKKyAgICAvLy8gdG8gYmUgcGFzc2VkIHRocm91Z2ggdGhlIGNvc3QgYWxsb2NhdG9yLiBUaGUgbW9zdCBjb21tb24gdXNlIGNhc2UgZm9yCisgICAgLy8vIHRoaXMgaXMgd2hlbiBkdXBsaWNhdGluZyBjb3N0cyBmcm9tIGFuIGV4aXN0aW5nIGVkZ2UgKHdoZW4gdXNpbmcgYQorICAgIC8vLyBwb29saW5nIGFsbG9jYXRvcikuIFRoZXNlIGhhdmUgYWxyZWFkeSBiZWVuIHVuaXF1ZWQsIHNvIHdlIGNhbiBhdm9pZAorICAgIC8vLyByZS1jb25zdHJ1Y3RpbmcgYW5kIHJlLXVuaXF1aW5nIHRoZW0gYnkgYXR0YWNoaW5nIHRoZW0gZGlyZWN0bHkgdG8gdGhlCisgICAgLy8vIG5ldyBlZGdlLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdGhlck1hdHJpeFB0clQ+CisgICAgTm9kZUlkIGFkZEVkZ2VCeXBhc3NpbmdDb3N0QWxsb2NhdG9yKE5vZGVJZCBOMUlkLCBOb2RlSWQgTjJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJNYXRyaXhQdHJUIENvc3RzKSB7CisgICAgICBhc3NlcnQoZ2V0Tm9kZUNvc3RzKE4xSWQpLmdldExlbmd0aCgpID09IENvc3RzLT5nZXRSb3dzKCkgJiYKKyAgICAgICAgICAgICBnZXROb2RlQ29zdHMoTjJJZCkuZ2V0TGVuZ3RoKCkgPT0gQ29zdHMtPmdldENvbHMoKSAmJgorICAgICAgICAgICAgICJNYXRyaXggZGltZW5zaW9ucyBtaXNtYXRjaC4iKTsKKyAgICAgIC8vIEdldCBjb3N0IG1hdHJpeCBmcm9tIHRoZSBwcm9ibGVtIGRvbWFpbi4KKyAgICAgIEVkZ2VJZCBFSWQgPSBhZGRDb25zdHJ1Y3RlZEVkZ2UoRWRnZUVudHJ5KE4xSWQsIE4ySWQsIENvc3RzKSk7CisgICAgICBpZiAoU29sdmVyKQorICAgICAgICBTb2x2ZXItPmhhbmRsZUFkZEVkZ2UoRUlkKTsKKyAgICAgIHJldHVybiBFSWQ7CisgICAgfQorCisgICAgLy8vIEBicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIGdyYXBoIGlzIGVtcHR5LgorICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBOb2RlSWRTZXQoKnRoaXMpLmVtcHR5KCk7IH0KKworICAgIE5vZGVJZFNldCBub2RlSWRzKCkgY29uc3QgeyByZXR1cm4gTm9kZUlkU2V0KCp0aGlzKTsgfQorICAgIEVkZ2VJZFNldCBlZGdlSWRzKCkgY29uc3QgeyByZXR1cm4gRWRnZUlkU2V0KCp0aGlzKTsgfQorCisgICAgQWRqRWRnZUlkU2V0IGFkakVkZ2VJZHMoTm9kZUlkIE5JZCkgeyByZXR1cm4gQWRqRWRnZUlkU2V0KGdldE5vZGUoTklkKSk7IH0KKworICAgIC8vLyBAYnJpZWYgR2V0IHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGdyYXBoLgorICAgIC8vLyBAcmV0dXJuIE51bWJlciBvZiBub2RlcyBpbiB0aGUgZ3JhcGguCisgICAgdW5zaWduZWQgZ2V0TnVtTm9kZXMoKSBjb25zdCB7IHJldHVybiBOb2RlSWRTZXQoKnRoaXMpLnNpemUoKTsgfQorCisgICAgLy8vIEBicmllZiBHZXQgdGhlIG51bWJlciBvZiBlZGdlcyBpbiB0aGUgZ3JhcGguCisgICAgLy8vIEByZXR1cm4gTnVtYmVyIG9mIGVkZ2VzIGluIHRoZSBncmFwaC4KKyAgICB1bnNpZ25lZCBnZXROdW1FZGdlcygpIGNvbnN0IHsgcmV0dXJuIEVkZ2VJZFNldCgqdGhpcykuc2l6ZSgpOyB9CisKKyAgICAvLy8gQGJyaWVmIFNldCBhIG5vZGUncyBjb3N0IHZlY3Rvci4KKyAgICAvLy8gQHBhcmFtIE5JZCBOb2RlIHRvIHVwZGF0ZS4KKyAgICAvLy8gQHBhcmFtIENvc3RzIE5ldyBjb3N0cyB0byBzZXQuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIE90aGVyVmVjdG9yVD4KKyAgICB2b2lkIHNldE5vZGVDb3N0cyhOb2RlSWQgTklkLCBPdGhlclZlY3RvclQgQ29zdHMpIHsKKyAgICAgIFZlY3RvclB0ciBBbGxvY2F0ZWRDb3N0cyA9IENvc3RBbGxvYy5nZXRWZWN0b3Ioc3RkOjptb3ZlKENvc3RzKSk7CisgICAgICBpZiAoU29sdmVyKQorICAgICAgICBTb2x2ZXItPmhhbmRsZVNldE5vZGVDb3N0cyhOSWQsICpBbGxvY2F0ZWRDb3N0cyk7CisgICAgICBnZXROb2RlKE5JZCkuQ29zdHMgPSBBbGxvY2F0ZWRDb3N0czsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIEdldCBhIFZlY3RvclB0ciB0byBhIG5vZGUncyBjb3N0IHZlY3Rvci4gUmFyZWx5IHVzZWZ1bCAtIHVzZQorICAgIC8vLyAgICAgICAgZ2V0Tm9kZUNvc3RzIHdoZXJlIHBvc3NpYmxlLgorICAgIC8vLyBAcGFyYW0gTklkIE5vZGUgaWQuCisgICAgLy8vIEByZXR1cm4gVmVjdG9yUHRyIHRvIG5vZGUgY29zdCB2ZWN0b3IuCisgICAgLy8vCisgICAgLy8vICAgVGhpcyBtZXRob2QgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgZHVwbGljYXRpbmcgY29zdHMgcXVpY2tseSBieQorICAgIC8vLyBieXBhc3NpbmcgdGhlIGNvc3QgYWxsb2NhdG9yLiBTZWUgYWRkTm9kZUJ5cGFzc2luZ0Nvc3RBbGxvY2F0b3IuIFByZWZlcgorICAgIC8vLyBnZXROb2RlQ29zdHMgd2hlbiBkZWFsaW5nIHdpdGggbm9kZSBjb3N0IHZhbHVlcy4KKyAgICBjb25zdCBWZWN0b3JQdHImIGdldE5vZGVDb3N0c1B0cihOb2RlSWQgTklkKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0Tm9kZShOSWQpLkNvc3RzOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgR2V0IGEgbm9kZSdzIGNvc3QgdmVjdG9yLgorICAgIC8vLyBAcGFyYW0gTklkIE5vZGUgaWQuCisgICAgLy8vIEByZXR1cm4gTm9kZSBjb3N0IHZlY3Rvci4KKyAgICBjb25zdCBWZWN0b3ImIGdldE5vZGVDb3N0cyhOb2RlSWQgTklkKSBjb25zdCB7CisgICAgICByZXR1cm4gKmdldE5vZGVDb3N0c1B0cihOSWQpOworICAgIH0KKworICAgIE5vZGVNZXRhZGF0YSYgZ2V0Tm9kZU1ldGFkYXRhKE5vZGVJZCBOSWQpIHsKKyAgICAgIHJldHVybiBnZXROb2RlKE5JZCkuTWV0YWRhdGE7CisgICAgfQorCisgICAgY29uc3QgTm9kZU1ldGFkYXRhJiBnZXROb2RlTWV0YWRhdGEoTm9kZUlkIE5JZCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldE5vZGUoTklkKS5NZXRhZGF0YTsKKyAgICB9CisKKyAgICB0eXBlbmFtZSBOb2RlRW50cnk6OkFkakVkZ2VMaXN0OjpzaXplX3R5cGUgZ2V0Tm9kZURlZ3JlZShOb2RlSWQgTklkKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0Tm9kZShOSWQpLmdldEFkakVkZ2VJZHMoKS5zaXplKCk7CisgICAgfQorCisgICAgLy8vIEBicmllZiBVcGRhdGUgYW4gZWRnZSdzIGNvc3QgbWF0cml4LgorICAgIC8vLyBAcGFyYW0gRUlkIEVkZ2UgaWQuCisgICAgLy8vIEBwYXJhbSBDb3N0cyBOZXcgY29zdCBtYXRyaXguCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIE90aGVyTWF0cml4VD4KKyAgICB2b2lkIHVwZGF0ZUVkZ2VDb3N0cyhFZGdlSWQgRUlkLCBPdGhlck1hdHJpeFQgQ29zdHMpIHsKKyAgICAgIE1hdHJpeFB0ciBBbGxvY2F0ZWRDb3N0cyA9IENvc3RBbGxvYy5nZXRNYXRyaXgoc3RkOjptb3ZlKENvc3RzKSk7CisgICAgICBpZiAoU29sdmVyKQorICAgICAgICBTb2x2ZXItPmhhbmRsZVVwZGF0ZUNvc3RzKEVJZCwgKkFsbG9jYXRlZENvc3RzKTsKKyAgICAgIGdldEVkZ2UoRUlkKS5Db3N0cyA9IEFsbG9jYXRlZENvc3RzOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgR2V0IGEgTWF0cml4UHRyIHRvIGEgbm9kZSdzIGNvc3QgbWF0cml4LiBSYXJlbHkgdXNlZnVsIC0gdXNlCisgICAgLy8vICAgICAgICBnZXRFZGdlQ29zdHMgd2hlcmUgcG9zc2libGUuCisgICAgLy8vIEBwYXJhbSBFSWQgRWRnZSBpZC4KKyAgICAvLy8gQHJldHVybiBNYXRyaXhQdHIgdG8gZWRnZSBjb3N0IG1hdHJpeC4KKyAgICAvLy8KKyAgICAvLy8gICBUaGlzIG1ldGhvZCBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciBkdXBsaWNhdGluZyBjb3N0cyBxdWlja2x5IGJ5CisgICAgLy8vIGJ5cGFzc2luZyB0aGUgY29zdCBhbGxvY2F0b3IuIFNlZSBhZGROb2RlQnlwYXNzaW5nQ29zdEFsbG9jYXRvci4gUHJlZmVyCisgICAgLy8vIGdldEVkZ2VDb3N0cyB3aGVuIGRlYWxpbmcgd2l0aCBlZGdlIGNvc3QgdmFsdWVzLgorICAgIGNvbnN0IE1hdHJpeFB0ciYgZ2V0RWRnZUNvc3RzUHRyKEVkZ2VJZCBFSWQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRFZGdlKEVJZCkuQ29zdHM7CisgICAgfQorCisgICAgLy8vIEBicmllZiBHZXQgYW4gZWRnZSdzIGNvc3QgbWF0cml4LgorICAgIC8vLyBAcGFyYW0gRUlkIEVkZ2UgaWQuCisgICAgLy8vIEByZXR1cm4gRWRnZSBjb3N0IG1hdHJpeC4KKyAgICBjb25zdCBNYXRyaXgmIGdldEVkZ2VDb3N0cyhFZGdlSWQgRUlkKSBjb25zdCB7CisgICAgICByZXR1cm4gKmdldEVkZ2UoRUlkKS5Db3N0czsKKyAgICB9CisKKyAgICBFZGdlTWV0YWRhdGEmIGdldEVkZ2VNZXRhZGF0YShFZGdlSWQgRUlkKSB7CisgICAgICByZXR1cm4gZ2V0RWRnZShFSWQpLk1ldGFkYXRhOworICAgIH0KKworICAgIGNvbnN0IEVkZ2VNZXRhZGF0YSYgZ2V0RWRnZU1ldGFkYXRhKEVkZ2VJZCBFSWQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRFZGdlKEVJZCkuTWV0YWRhdGE7CisgICAgfQorCisgICAgLy8vIEBicmllZiBHZXQgdGhlIGZpcnN0IG5vZGUgY29ubmVjdGVkIHRvIHRoaXMgZWRnZS4KKyAgICAvLy8gQHBhcmFtIEVJZCBFZGdlIGlkLgorICAgIC8vLyBAcmV0dXJuIFRoZSBmaXJzdCBub2RlIGNvbm5lY3RlZCB0byB0aGUgZ2l2ZW4gZWRnZS4KKyAgICBOb2RlSWQgZ2V0RWRnZU5vZGUxSWQoRWRnZUlkIEVJZCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldEVkZ2UoRUlkKS5nZXROMUlkKCk7CisgICAgfQorCisgICAgLy8vIEBicmllZiBHZXQgdGhlIHNlY29uZCBub2RlIGNvbm5lY3RlZCB0byB0aGlzIGVkZ2UuCisgICAgLy8vIEBwYXJhbSBFSWQgRWRnZSBpZC4KKyAgICAvLy8gQHJldHVybiBUaGUgc2Vjb25kIG5vZGUgY29ubmVjdGVkIHRvIHRoZSBnaXZlbiBlZGdlLgorICAgIE5vZGVJZCBnZXRFZGdlTm9kZTJJZChFZGdlSWQgRUlkKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0RWRnZShFSWQpLmdldE4ySWQoKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIEdldCB0aGUgIm90aGVyIiBub2RlIGNvbm5lY3RlZCB0byB0aGlzIGVkZ2UuCisgICAgLy8vIEBwYXJhbSBFSWQgRWRnZSBpZC4KKyAgICAvLy8gQHBhcmFtIE5JZCBOb2RlIGlkIGZvciB0aGUgImdpdmVuIiBub2RlLgorICAgIC8vLyBAcmV0dXJuIFRoZSBpdGVyYXRvciBmb3IgdGhlICJvdGhlciIgbm9kZSBjb25uZWN0ZWQgdG8gdGhpcyBlZGdlLgorICAgIE5vZGVJZCBnZXRFZGdlT3RoZXJOb2RlSWQoRWRnZUlkIEVJZCwgTm9kZUlkIE5JZCkgeworICAgICAgRWRnZUVudHJ5ICZFID0gZ2V0RWRnZShFSWQpOworICAgICAgaWYgKEUuZ2V0TjFJZCgpID09IE5JZCkgeworICAgICAgICByZXR1cm4gRS5nZXROMklkKCk7CisgICAgICB9IC8vIGVsc2UKKyAgICAgIHJldHVybiBFLmdldE4xSWQoKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIEdldCB0aGUgZWRnZSBjb25uZWN0aW5nIHR3byBub2Rlcy4KKyAgICAvLy8gQHBhcmFtIE4xSWQgRmlyc3Qgbm9kZSBpZC4KKyAgICAvLy8gQHBhcmFtIE4ySWQgU2Vjb25kIG5vZGUgaWQuCisgICAgLy8vIEByZXR1cm4gQW4gaWQgZm9yIGVkZ2UgKE4xSWQsIE4ySWQpIGlmIHN1Y2ggYW4gZWRnZSBleGlzdHMsCisgICAgLy8vICAgICAgICAgb3RoZXJ3aXNlIHJldHVybnMgYW4gaW52YWxpZCBlZGdlIGlkLgorICAgIEVkZ2VJZCBmaW5kRWRnZShOb2RlSWQgTjFJZCwgTm9kZUlkIE4ySWQpIHsKKyAgICAgIGZvciAoYXV0byBBRUlkIDogYWRqRWRnZUlkcyhOMUlkKSkgeworICAgICAgICBpZiAoKGdldEVkZ2VOb2RlMUlkKEFFSWQpID09IE4ySWQpIHx8CisgICAgICAgICAgICAoZ2V0RWRnZU5vZGUySWQoQUVJZCkgPT0gTjJJZCkpIHsKKyAgICAgICAgICByZXR1cm4gQUVJZDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGludmFsaWRFZGdlSWQoKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIFJlbW92ZSBhIG5vZGUgZnJvbSB0aGUgZ3JhcGguCisgICAgLy8vIEBwYXJhbSBOSWQgTm9kZSBpZC4KKyAgICB2b2lkIHJlbW92ZU5vZGUoTm9kZUlkIE5JZCkgeworICAgICAgaWYgKFNvbHZlcikKKyAgICAgICAgU29sdmVyLT5oYW5kbGVSZW1vdmVOb2RlKE5JZCk7CisgICAgICBOb2RlRW50cnkgJk4gPSBnZXROb2RlKE5JZCk7CisgICAgICAvLyBUT0RPOiBDYW4gdGhpcyBiZSBmb3ItZWFjaCdkPworICAgICAgZm9yIChBZGpFZGdlSXRyIEFFSXRyID0gTi5hZGpFZGdlc0JlZ2luKCksCisgICAgICAgICAgICAgQUVFbmQgPSBOLmFkakVkZ2VzRW5kKCk7CisgICAgICAgICAgIEFFSXRyICE9IEFFRW5kOykgeworICAgICAgICBFZGdlSWQgRUlkID0gKkFFSXRyOworICAgICAgICArK0FFSXRyOworICAgICAgICByZW1vdmVFZGdlKEVJZCk7CisgICAgICB9CisgICAgICBGcmVlTm9kZUlkcy5wdXNoX2JhY2soTklkKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIERpc2Nvbm5lY3QgYW4gZWRnZSBmcm9tIHRoZSBnaXZlbiBub2RlLgorICAgIC8vLworICAgIC8vLyBSZW1vdmVzIHRoZSBnaXZlbiBlZGdlIGZyb20gdGhlIGFkamFjZW5jeSBsaXN0IG9mIHRoZSBnaXZlbiBub2RlLgorICAgIC8vLyBUaGlzIG9wZXJhdGlvbiBsZWF2ZXMgdGhlIGVkZ2UgaW4gYW4gJ2FzeW1tZXRyaWMnIHN0YXRlOiBJdCB3aWxsIG5vCisgICAgLy8vIGxvbmdlciBhcHBlYXIgaW4gYW4gaXRlcmF0aW9uIG92ZXIgdGhlIGdpdmVuIG5vZGUncyAoTklkJ3MpIGVkZ2VzLCBidXQKKyAgICAvLy8gd2lsbCBhcHBlYXIgaW4gYW4gaXRlcmF0aW9uIG92ZXIgdGhlICdvdGhlcicsIHVubmFtZWQgbm9kZSdzIGVkZ2VzLgorICAgIC8vLworICAgIC8vLyBUaGlzIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW55IG5vcm1hbCBncmFwaCBvcGVyYXRpb24sIGJ1dCBleGlzdHMgdG8KKyAgICAvLy8gc3VwcG9ydCBlZmZpY2llbnQgUEJRUCBncmFwaC1yZWR1Y3Rpb24gYmFzZWQgc29sdmVycy4gSXQgaXMgdXNlZCB0bworICAgIC8vLyAnZWZmZWN0aXZlbHknIHJlbW92ZSB0aGUgdW5uYW1lZCBub2RlIGZyb20gdGhlIGdyYXBoIHdoaWxlIHRoZSBzb2x2ZXIKKyAgICAvLy8gaXMgcGVyZm9ybWluZyB0aGUgcmVkdWN0aW9uLiBUaGUgc29sdmVyIHdpbGwgbGF0ZXIgY2FsbCByZWNvbm5lY3ROb2RlCisgICAgLy8vIHRvIHJlc3RvcmUgdGhlIGVkZ2UgaW4gdGhlIG5hbWVkIG5vZGUncyBhZGphY2VuY3kgbGlzdC4KKyAgICAvLy8KKyAgICAvLy8gU2luY2UgdGhlIGRlZ3JlZSBvZiBhIG5vZGUgaXMgdGhlIG51bWJlciBvZiBjb25uZWN0ZWQgZWRnZXMsCisgICAgLy8vIGRpc2Nvbm5lY3RpbmcgYW4gZWRnZSBmcm9tIGEgbm9kZSAndScgd2lsbCBjYXVzZSB0aGUgZGVncmVlIG9mICd1JyB0bworICAgIC8vLyBkcm9wIGJ5IDEuCisgICAgLy8vCisgICAgLy8vIEEgZGlzY29ubmVjdGVkIGVkZ2UgV0lMTCBzdGlsbCBhcHBlYXIgaW4gYW4gaXRlcmF0aW9uIG92ZXIgdGhlIGdyYXBoCisgICAgLy8vIGVkZ2VzLgorICAgIC8vLworICAgIC8vLyBBIGRpc2Nvbm5lY3RlZCBlZGdlIHNob3VsZCBub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBncmFwaCwgaXQgc2hvdWxkIGJlCisgICAgLy8vIHJlY29ubmVjdGVkIGZpcnN0LgorICAgIC8vLworICAgIC8vLyBBIGRpc2Nvbm5lY3RlZCBlZGdlIGNhbiBiZSByZWNvbm5lY3RlZCBieSBjYWxsaW5nIHRoZSByZWNvbm5lY3RFZGdlCisgICAgLy8vIG1ldGhvZC4KKyAgICB2b2lkIGRpc2Nvbm5lY3RFZGdlKEVkZ2VJZCBFSWQsIE5vZGVJZCBOSWQpIHsKKyAgICAgIGlmIChTb2x2ZXIpCisgICAgICAgIFNvbHZlci0+aGFuZGxlRGlzY29ubmVjdEVkZ2UoRUlkLCBOSWQpOworCisgICAgICBFZGdlRW50cnkgJkUgPSBnZXRFZGdlKEVJZCk7CisgICAgICBFLmRpc2Nvbm5lY3RGcm9tKCp0aGlzLCBOSWQpOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgQ29udmVuaWVuY2UgbWV0aG9kIHRvIGRpc2Nvbm5lY3QgYWxsIG5laWdoYm91cnMgZnJvbSB0aGUgZ2l2ZW4KKyAgICAvLy8gICAgICAgIG5vZGUuCisgICAgdm9pZCBkaXNjb25uZWN0QWxsTmVpZ2hib3JzRnJvbU5vZGUoTm9kZUlkIE5JZCkgeworICAgICAgZm9yIChhdXRvIEFFSWQgOiBhZGpFZGdlSWRzKE5JZCkpCisgICAgICAgIGRpc2Nvbm5lY3RFZGdlKEFFSWQsIGdldEVkZ2VPdGhlck5vZGVJZChBRUlkLCBOSWQpKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIFJlLWF0dGFjaCBhbiBlZGdlIHRvIGl0cyBub2Rlcy4KKyAgICAvLy8KKyAgICAvLy8gQWRkcyBhbiBlZGdlIHRoYXQgaGFkIGJlZW4gcHJldmlvdXNseSBkaXNjb25uZWN0ZWQgYmFjayBpbnRvIHRoZQorICAgIC8vLyBhZGphY2VuY3kgc2V0IG9mIHRoZSBub2RlcyB0aGF0IHRoZSBlZGdlIGNvbm5lY3RzLgorICAgIHZvaWQgcmVjb25uZWN0RWRnZShFZGdlSWQgRUlkLCBOb2RlSWQgTklkKSB7CisgICAgICBFZGdlRW50cnkgJkUgPSBnZXRFZGdlKEVJZCk7CisgICAgICBFLmNvbm5lY3RUbygqdGhpcywgRUlkLCBOSWQpOworICAgICAgaWYgKFNvbHZlcikKKyAgICAgICAgU29sdmVyLT5oYW5kbGVSZWNvbm5lY3RFZGdlKEVJZCwgTklkKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIFJlbW92ZSBhbiBlZGdlIGZyb20gdGhlIGdyYXBoLgorICAgIC8vLyBAcGFyYW0gRUlkIEVkZ2UgaWQuCisgICAgdm9pZCByZW1vdmVFZGdlKEVkZ2VJZCBFSWQpIHsKKyAgICAgIGlmIChTb2x2ZXIpCisgICAgICAgIFNvbHZlci0+aGFuZGxlUmVtb3ZlRWRnZShFSWQpOworICAgICAgRWRnZUVudHJ5ICZFID0gZ2V0RWRnZShFSWQpOworICAgICAgRS5kaXNjb25uZWN0KCk7CisgICAgICBGcmVlRWRnZUlkcy5wdXNoX2JhY2soRUlkKTsKKyAgICAgIEVkZ2VzW0VJZF0uaW52YWxpZGF0ZSgpOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgUmVtb3ZlIGFsbCBub2RlcyBhbmQgZWRnZXMgZnJvbSB0aGUgZ3JhcGguCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgIE5vZGVzLmNsZWFyKCk7CisgICAgICBGcmVlTm9kZUlkcy5jbGVhcigpOworICAgICAgRWRnZXMuY2xlYXIoKTsKKyAgICAgIEZyZWVFZGdlSWRzLmNsZWFyKCk7CisgICAgfQorICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgUEJRUAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9QQlFQX0dSQVBIX0hQUApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1BCUVAvTWF0aC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1BCUVAvTWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNDA1ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUEJRUC9NYXRoLmgKQEAgLTAsMCArMSwyOTIgQEAKKy8vPT09LSBNYXRoLmggLSBQQlFQIFZlY3RvciBhbmQgTWF0cml4IGNsYXNzZXMgLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1BCUVBfTUFUSF9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9QQlFQX01BVEhfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvSGFzaGluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgUEJRUCB7CisKK3VzaW5nIFBCUVBOdW0gPSBmbG9hdDsKKworLy8vIFxicmllZiBQQlFQIFZlY3RvciBjbGFzcy4KK2NsYXNzIFZlY3RvciB7CisgIGZyaWVuZCBoYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBWZWN0b3IgJik7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBQQlFQIHZlY3RvciBvZiB0aGUgZ2l2ZW4gc2l6ZS4KKyAgZXhwbGljaXQgVmVjdG9yKHVuc2lnbmVkIExlbmd0aCkKKyAgICA6IExlbmd0aChMZW5ndGgpLCBEYXRhKGxsdm06Om1ha2VfdW5pcXVlPFBCUVBOdW0gW10+KExlbmd0aCkpIHt9CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBQQlFQIHZlY3RvciB3aXRoIGluaXRpYWxpemVyLgorICBWZWN0b3IodW5zaWduZWQgTGVuZ3RoLCBQQlFQTnVtIEluaXRWYWwpCisgICAgOiBMZW5ndGgoTGVuZ3RoKSwgRGF0YShsbHZtOjptYWtlX3VuaXF1ZTxQQlFQTnVtIFtdPihMZW5ndGgpKSB7CisgICAgc3RkOjpmaWxsKERhdGEuZ2V0KCksIERhdGEuZ2V0KCkgKyBMZW5ndGgsIEluaXRWYWwpOworICB9CisKKyAgLy8vIFxicmllZiBDb3B5IGNvbnN0cnVjdCBhIFBCUVAgdmVjdG9yLgorICBWZWN0b3IoY29uc3QgVmVjdG9yICZWKQorICAgIDogTGVuZ3RoKFYuTGVuZ3RoKSwgRGF0YShsbHZtOjptYWtlX3VuaXF1ZTxQQlFQTnVtIFtdPihMZW5ndGgpKSB7CisgICAgc3RkOjpjb3B5KFYuRGF0YS5nZXQoKSwgVi5EYXRhLmdldCgpICsgTGVuZ3RoLCBEYXRhLmdldCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTW92ZSBjb25zdHJ1Y3QgYSBQQlFQIHZlY3Rvci4KKyAgVmVjdG9yKFZlY3RvciAmJlYpCisgICAgOiBMZW5ndGgoVi5MZW5ndGgpLCBEYXRhKHN0ZDo6bW92ZShWLkRhdGEpKSB7CisgICAgVi5MZW5ndGggPSAwOworICB9CisKKyAgLy8vIFxicmllZiBDb21wYXJpc29uIG9wZXJhdG9yLgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgVmVjdG9yICZWKSBjb25zdCB7CisgICAgYXNzZXJ0KExlbmd0aCAhPSAwICYmIERhdGEgJiYgIkludmFsaWQgdmVjdG9yIik7CisgICAgaWYgKExlbmd0aCAhPSBWLkxlbmd0aCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gc3RkOjplcXVhbChEYXRhLmdldCgpLCBEYXRhLmdldCgpICsgTGVuZ3RoLCBWLkRhdGEuZ2V0KCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgdmVjdG9yCisgIHVuc2lnbmVkIGdldExlbmd0aCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoTGVuZ3RoICE9IDAgJiYgRGF0YSAmJiAiSW52YWxpZCB2ZWN0b3IiKTsKKyAgICByZXR1cm4gTGVuZ3RoOworICB9CisKKyAgLy8vIFxicmllZiBFbGVtZW50IGFjY2Vzcy4KKyAgUEJRUE51bSYgb3BlcmF0b3JbXSh1bnNpZ25lZCBJbmRleCkgeworICAgIGFzc2VydChMZW5ndGggIT0gMCAmJiBEYXRhICYmICJJbnZhbGlkIHZlY3RvciIpOworICAgIGFzc2VydChJbmRleCA8IExlbmd0aCAmJiAiVmVjdG9yIGVsZW1lbnQgYWNjZXNzIG91dCBvZiBib3VuZHMuIik7CisgICAgcmV0dXJuIERhdGFbSW5kZXhdOworICB9CisKKyAgLy8vIFxicmllZiBDb25zdCBlbGVtZW50IGFjY2Vzcy4KKyAgY29uc3QgUEJRUE51bSYgb3BlcmF0b3JbXSh1bnNpZ25lZCBJbmRleCkgY29uc3QgeworICAgIGFzc2VydChMZW5ndGggIT0gMCAmJiBEYXRhICYmICJJbnZhbGlkIHZlY3RvciIpOworICAgIGFzc2VydChJbmRleCA8IExlbmd0aCAmJiAiVmVjdG9yIGVsZW1lbnQgYWNjZXNzIG91dCBvZiBib3VuZHMuIik7CisgICAgcmV0dXJuIERhdGFbSW5kZXhdOworICB9CisKKyAgLy8vIFxicmllZiBBZGQgYW5vdGhlciB2ZWN0b3IgdG8gdGhpcyBvbmUuCisgIFZlY3RvciYgb3BlcmF0b3IrPShjb25zdCBWZWN0b3IgJlYpIHsKKyAgICBhc3NlcnQoTGVuZ3RoICE9IDAgJiYgRGF0YSAmJiAiSW52YWxpZCB2ZWN0b3IiKTsKKyAgICBhc3NlcnQoTGVuZ3RoID09IFYuTGVuZ3RoICYmICJWZWN0b3IgbGVuZ3RoIG1pc21hdGNoLiIpOworICAgIHN0ZDo6dHJhbnNmb3JtKERhdGEuZ2V0KCksIERhdGEuZ2V0KCkgKyBMZW5ndGgsIFYuRGF0YS5nZXQoKSwgRGF0YS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnBsdXM8UEJRUE51bT4oKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWluaW11bSB2YWx1ZSBpbiB0aGlzIHZlY3RvcgorICB1bnNpZ25lZCBtaW5JbmRleCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoTGVuZ3RoICE9IDAgJiYgRGF0YSAmJiAiSW52YWxpZCB2ZWN0b3IiKTsKKyAgICByZXR1cm4gc3RkOjptaW5fZWxlbWVudChEYXRhLmdldCgpLCBEYXRhLmdldCgpICsgTGVuZ3RoKSAtIERhdGEuZ2V0KCk7CisgIH0KKworcHJpdmF0ZToKKyAgdW5zaWduZWQgTGVuZ3RoOworICBzdGQ6OnVuaXF1ZV9wdHI8UEJRUE51bSBbXT4gRGF0YTsKK307CisKKy8vLyBcYnJpZWYgUmV0dXJuIGEgaGFzaF92YWx1ZSBmb3IgdGhlIGdpdmVuIHZlY3Rvci4KK2lubGluZSBoYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBWZWN0b3IgJlYpIHsKKyAgdW5zaWduZWQgKlZCZWdpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQqPihWLkRhdGEuZ2V0KCkpOworICB1bnNpZ25lZCAqVkVuZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQqPihWLkRhdGEuZ2V0KCkgKyBWLkxlbmd0aCk7CisgIHJldHVybiBoYXNoX2NvbWJpbmUoVi5MZW5ndGgsIGhhc2hfY29tYmluZV9yYW5nZShWQmVnaW4sIFZFbmQpKTsKK30KKworLy8vIFxicmllZiBPdXRwdXQgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB2ZWN0b3Igb24gdGhlIGdpdmVuCisvLy8gICAgICAgIG91dHB1dCBzdHJlYW0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT1N0cmVhbT4KK09TdHJlYW0mIG9wZXJhdG9yPDwoT1N0cmVhbSAmT1MsIGNvbnN0IFZlY3RvciAmVikgeworICBhc3NlcnQoKFYuZ2V0TGVuZ3RoKCkgIT0gMCkgJiYgIlplcm8tbGVuZ3RoIHZlY3RvciBiYWRuZXNzLiIpOworCisgIE9TIDw8ICJbICIgPDwgVlswXTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IFYuZ2V0TGVuZ3RoKCk7ICsraSkKKyAgICBPUyA8PCAiLCAiIDw8IFZbaV07CisgIE9TIDw8ICIgXSI7CisKKyAgcmV0dXJuIE9TOworfQorCisvLy8gXGJyaWVmIFBCUVAgTWF0cml4IGNsYXNzCitjbGFzcyBNYXRyaXggeworcHJpdmF0ZToKKyAgZnJpZW5kIGhhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IE1hdHJpeCAmKTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIFBCUVAgTWF0cml4IHdpdGggdGhlIGdpdmVuIGRpbWVuc2lvbnMuCisgIE1hdHJpeCh1bnNpZ25lZCBSb3dzLCB1bnNpZ25lZCBDb2xzKSA6CisgICAgUm93cyhSb3dzKSwgQ29scyhDb2xzKSwgRGF0YShsbHZtOjptYWtlX3VuaXF1ZTxQQlFQTnVtIFtdPihSb3dzICogQ29scykpIHsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgUEJRUCBNYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZGltZW5zaW9ucyBhbmQgaW5pdGlhbAorICAvLy8gdmFsdWUuCisgIE1hdHJpeCh1bnNpZ25lZCBSb3dzLCB1bnNpZ25lZCBDb2xzLCBQQlFQTnVtIEluaXRWYWwpCisgICAgOiBSb3dzKFJvd3MpLCBDb2xzKENvbHMpLAorICAgICAgRGF0YShsbHZtOjptYWtlX3VuaXF1ZTxQQlFQTnVtIFtdPihSb3dzICogQ29scykpIHsKKyAgICBzdGQ6OmZpbGwoRGF0YS5nZXQoKSwgRGF0YS5nZXQoKSArIChSb3dzICogQ29scyksIEluaXRWYWwpOworICB9CisKKyAgLy8vIFxicmllZiBDb3B5IGNvbnN0cnVjdCBhIFBCUVAgbWF0cml4LgorICBNYXRyaXgoY29uc3QgTWF0cml4ICZNKQorICAgIDogUm93cyhNLlJvd3MpLCBDb2xzKE0uQ29scyksCisgICAgICBEYXRhKGxsdm06Om1ha2VfdW5pcXVlPFBCUVBOdW0gW10+KFJvd3MgKiBDb2xzKSkgeworICAgIHN0ZDo6Y29weShNLkRhdGEuZ2V0KCksIE0uRGF0YS5nZXQoKSArIChSb3dzICogQ29scyksIERhdGEuZ2V0KCkpOworICB9CisKKyAgLy8vIFxicmllZiBNb3ZlIGNvbnN0cnVjdCBhIFBCUVAgbWF0cml4LgorICBNYXRyaXgoTWF0cml4ICYmTSkKKyAgICA6IFJvd3MoTS5Sb3dzKSwgQ29scyhNLkNvbHMpLCBEYXRhKHN0ZDo6bW92ZShNLkRhdGEpKSB7CisgICAgTS5Sb3dzID0gTS5Db2xzID0gMDsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29tcGFyaXNvbiBvcGVyYXRvci4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hdHJpeCAmTSkgY29uc3QgeworICAgIGFzc2VydChSb3dzICE9IDAgJiYgQ29scyAhPSAwICYmIERhdGEgJiYgIkludmFsaWQgbWF0cml4Iik7CisgICAgaWYgKFJvd3MgIT0gTS5Sb3dzIHx8IENvbHMgIT0gTS5Db2xzKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBzdGQ6OmVxdWFsKERhdGEuZ2V0KCksIERhdGEuZ2V0KCkgKyAoUm93cyAqIENvbHMpLCBNLkRhdGEuZ2V0KCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiByb3dzIGluIHRoaXMgbWF0cml4LgorICB1bnNpZ25lZCBnZXRSb3dzKCkgY29uc3QgeworICAgIGFzc2VydChSb3dzICE9IDAgJiYgQ29scyAhPSAwICYmIERhdGEgJiYgIkludmFsaWQgbWF0cml4Iik7CisgICAgcmV0dXJuIFJvd3M7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGNvbHMgaW4gdGhpcyBtYXRyaXguCisgIHVuc2lnbmVkIGdldENvbHMoKSBjb25zdCB7CisgICAgYXNzZXJ0KFJvd3MgIT0gMCAmJiBDb2xzICE9IDAgJiYgRGF0YSAmJiAiSW52YWxpZCBtYXRyaXgiKTsKKyAgICByZXR1cm4gQ29sczsKKyAgfQorCisgIC8vLyBcYnJpZWYgTWF0cml4IGVsZW1lbnQgYWNjZXNzLgorICBQQlFQTnVtKiBvcGVyYXRvcltdKHVuc2lnbmVkIFIpIHsKKyAgICBhc3NlcnQoUm93cyAhPSAwICYmIENvbHMgIT0gMCAmJiBEYXRhICYmICJJbnZhbGlkIG1hdHJpeCIpOworICAgIGFzc2VydChSIDwgUm93cyAmJiAiUm93IG91dCBvZiBib3VuZHMuIik7CisgICAgcmV0dXJuIERhdGEuZ2V0KCkgKyAoUiAqIENvbHMpOworICB9CisKKyAgLy8vIFxicmllZiBNYXRyaXggZWxlbWVudCBhY2Nlc3MuCisgIGNvbnN0IFBCUVBOdW0qIG9wZXJhdG9yW10odW5zaWduZWQgUikgY29uc3QgeworICAgIGFzc2VydChSb3dzICE9IDAgJiYgQ29scyAhPSAwICYmIERhdGEgJiYgIkludmFsaWQgbWF0cml4Iik7CisgICAgYXNzZXJ0KFIgPCBSb3dzICYmICJSb3cgb3V0IG9mIGJvdW5kcy4iKTsKKyAgICByZXR1cm4gRGF0YS5nZXQoKSArIChSICogQ29scyk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGdpdmVuIHJvdyBhcyBhIHZlY3Rvci4KKyAgVmVjdG9yIGdldFJvd0FzVmVjdG9yKHVuc2lnbmVkIFIpIGNvbnN0IHsKKyAgICBhc3NlcnQoUm93cyAhPSAwICYmIENvbHMgIT0gMCAmJiBEYXRhICYmICJJbnZhbGlkIG1hdHJpeCIpOworICAgIFZlY3RvciBWKENvbHMpOworICAgIGZvciAodW5zaWduZWQgQyA9IDA7IEMgPCBDb2xzOyArK0MpCisgICAgICBWW0NdID0gKCp0aGlzKVtSXVtDXTsKKyAgICByZXR1cm4gVjsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZ2l2ZW4gY29sdW1uIGFzIGEgdmVjdG9yLgorICBWZWN0b3IgZ2V0Q29sQXNWZWN0b3IodW5zaWduZWQgQykgY29uc3QgeworICAgIGFzc2VydChSb3dzICE9IDAgJiYgQ29scyAhPSAwICYmIERhdGEgJiYgIkludmFsaWQgbWF0cml4Iik7CisgICAgVmVjdG9yIFYoUm93cyk7CisgICAgZm9yICh1bnNpZ25lZCBSID0gMDsgUiA8IFJvd3M7ICsrUikKKyAgICAgIFZbUl0gPSAoKnRoaXMpW1JdW0NdOworICAgIHJldHVybiBWOworICB9CisKKyAgLy8vIFxicmllZiBNYXRyaXggdHJhbnNwb3NlLgorICBNYXRyaXggdHJhbnNwb3NlKCkgY29uc3QgeworICAgIGFzc2VydChSb3dzICE9IDAgJiYgQ29scyAhPSAwICYmIERhdGEgJiYgIkludmFsaWQgbWF0cml4Iik7CisgICAgTWF0cml4IE0oQ29scywgUm93cyk7CisgICAgZm9yICh1bnNpZ25lZCByID0gMDsgciA8IFJvd3M7ICsrcikKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBDb2xzOyArK2MpCisgICAgICAgIE1bY11bcl0gPSAoKnRoaXMpW3JdW2NdOworICAgIHJldHVybiBNOworICB9CisKKyAgLy8vIFxicmllZiBBZGQgdGhlIGdpdmVuIG1hdHJpeCB0byB0aGlzIG9uZS4KKyAgTWF0cml4JiBvcGVyYXRvcis9KGNvbnN0IE1hdHJpeCAmTSkgeworICAgIGFzc2VydChSb3dzICE9IDAgJiYgQ29scyAhPSAwICYmIERhdGEgJiYgIkludmFsaWQgbWF0cml4Iik7CisgICAgYXNzZXJ0KFJvd3MgPT0gTS5Sb3dzICYmIENvbHMgPT0gTS5Db2xzICYmCisgICAgICAgICAgICJNYXRyaXggZGltZW5zaW9ucyBtaXNtYXRjaC4iKTsKKyAgICBzdGQ6OnRyYW5zZm9ybShEYXRhLmdldCgpLCBEYXRhLmdldCgpICsgKFJvd3MgKiBDb2xzKSwgTS5EYXRhLmdldCgpLAorICAgICAgICAgICAgICAgICAgIERhdGEuZ2V0KCksIHN0ZDo6cGx1czxQQlFQTnVtPigpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBNYXRyaXggb3BlcmF0b3IrKGNvbnN0IE1hdHJpeCAmTSkgeworICAgIGFzc2VydChSb3dzICE9IDAgJiYgQ29scyAhPSAwICYmIERhdGEgJiYgIkludmFsaWQgbWF0cml4Iik7CisgICAgTWF0cml4IFRtcCgqdGhpcyk7CisgICAgVG1wICs9IE07CisgICAgcmV0dXJuIFRtcDsKKyAgfQorCitwcml2YXRlOgorICB1bnNpZ25lZCBSb3dzLCBDb2xzOworICBzdGQ6OnVuaXF1ZV9wdHI8UEJRUE51bSBbXT4gRGF0YTsKK307CisKKy8vLyBcYnJpZWYgUmV0dXJuIGEgaGFzaF9jb2RlIGZvciB0aGUgZ2l2ZW4gbWF0cml4LgoraW5saW5lIGhhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IE1hdHJpeCAmTSkgeworICB1bnNpZ25lZCAqTUJlZ2luID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCo+KE0uRGF0YS5nZXQoKSk7CisgIHVuc2lnbmVkICpNRW5kID0KKyAgICByZWludGVycHJldF9jYXN0PHVuc2lnbmVkKj4oTS5EYXRhLmdldCgpICsgKE0uUm93cyAqIE0uQ29scykpOworICByZXR1cm4gaGFzaF9jb21iaW5lKE0uUm93cywgTS5Db2xzLCBoYXNoX2NvbWJpbmVfcmFuZ2UoTUJlZ2luLCBNRW5kKSk7Cit9CisKKy8vLyBcYnJpZWYgT3V0cHV0IGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gbWF0cml4IG9uIHRoZSBnaXZlbgorLy8vICAgICAgICBvdXRwdXQgc3RyZWFtLgordGVtcGxhdGUgPHR5cGVuYW1lIE9TdHJlYW0+CitPU3RyZWFtJiBvcGVyYXRvcjw8KE9TdHJlYW0gJk9TLCBjb25zdCBNYXRyaXggJk0pIHsKKyAgYXNzZXJ0KChNLmdldFJvd3MoKSAhPSAwKSAmJiAiWmVyby1yb3cgbWF0cml4IGJhZG5lc3MuIik7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBNLmdldFJvd3MoKTsgKytpKQorICAgIE9TIDw8IE0uZ2V0Um93QXNWZWN0b3IoaSkgPDwgIlxuIjsKKyAgcmV0dXJuIE9TOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWV0YWRhdGE+CitjbGFzcyBNRFZlY3RvciA6IHB1YmxpYyBWZWN0b3IgeworcHVibGljOgorICBNRFZlY3Rvcihjb25zdCBWZWN0b3IgJnYpIDogVmVjdG9yKHYpLCBtZCgqdGhpcykge30KKyAgTURWZWN0b3IoVmVjdG9yICYmdikgOiBWZWN0b3Ioc3RkOjptb3ZlKHYpKSwgbWQoKnRoaXMpIHsgfQorCisgIGNvbnN0IE1ldGFkYXRhJiBnZXRNZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1kOyB9CisKK3ByaXZhdGU6CisgIE1ldGFkYXRhIG1kOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIE1ldGFkYXRhPgoraW5saW5lIGhhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IE1EVmVjdG9yPE1ldGFkYXRhPiAmVikgeworICByZXR1cm4gaGFzaF92YWx1ZShzdGF0aWNfY2FzdDxjb25zdCBWZWN0b3ImPihWKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNZXRhZGF0YT4KK2NsYXNzIE1ETWF0cml4IDogcHVibGljIE1hdHJpeCB7CitwdWJsaWM6CisgIE1ETWF0cml4KGNvbnN0IE1hdHJpeCAmbSkgOiBNYXRyaXgobSksIG1kKCp0aGlzKSB7fQorICBNRE1hdHJpeChNYXRyaXggJiZtKSA6IE1hdHJpeChzdGQ6Om1vdmUobSkpLCBtZCgqdGhpcykgeyB9CisKKyAgY29uc3QgTWV0YWRhdGEmIGdldE1ldGFkYXRhKCkgY29uc3QgeyByZXR1cm4gbWQ7IH0KKworcHJpdmF0ZToKKyAgTWV0YWRhdGEgbWQ7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWV0YWRhdGE+CitpbmxpbmUgaGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3QgTURNYXRyaXg8TWV0YWRhdGE+ICZNKSB7CisgIHJldHVybiBoYXNoX3ZhbHVlKHN0YXRpY19jYXN0PGNvbnN0IE1hdHJpeCY+KE0pKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIFBCUVAKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fUEJRUF9NQVRIX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QQlFQL1JlZHVjdGlvblJ1bGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUEJRUC9SZWR1Y3Rpb25SdWxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZWI1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUEJRUC9SZWR1Y3Rpb25SdWxlcy5oCkBAIC0wLDAgKzEsMjIzIEBACisvLz09PS0gUmVkdWN0aW9uUnVsZXMuaCAtIFJlZHVjdGlvbiBSdWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFJlZHVjdGlvbiBSdWxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9QQlFQX1JFRFVDVElPTlJVTEVTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1BCUVBfUkVEVUNUSU9OUlVMRVNfSAorCisjaW5jbHVkZSAiR3JhcGguaCIKKyNpbmNsdWRlICJNYXRoLmgiCisjaW5jbHVkZSAiU29sdXRpb24uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIFBCUVAgeworCisgIC8vLyBcYnJpZWYgUmVkdWNlIGEgbm9kZSBvZiBkZWdyZWUgb25lLgorICAvLy8KKyAgLy8vIFByb3BhZ2F0ZSBjb3N0cyBmcm9tIHRoZSBnaXZlbiBub2RlLCB3aGljaCBtdXN0IGJlIG9mIGRlZ3JlZSBvbmUsIHRvIGl0cworICAvLy8gbmVpZ2hib3IuIE5vdGlmeSB0aGUgcHJvYmxlbSBkb21haW4uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBHcmFwaFQ+CisgIHZvaWQgYXBwbHlSMShHcmFwaFQgJkcsIHR5cGVuYW1lIEdyYXBoVDo6Tm9kZUlkIE5JZCkgeworICAgIHVzaW5nIE5vZGVJZCA9IHR5cGVuYW1lIEdyYXBoVDo6Tm9kZUlkOworICAgIHVzaW5nIEVkZ2VJZCA9IHR5cGVuYW1lIEdyYXBoVDo6RWRnZUlkOworICAgIHVzaW5nIFZlY3RvciA9IHR5cGVuYW1lIEdyYXBoVDo6VmVjdG9yOworICAgIHVzaW5nIE1hdHJpeCA9IHR5cGVuYW1lIEdyYXBoVDo6TWF0cml4OworICAgIHVzaW5nIFJhd1ZlY3RvciA9IHR5cGVuYW1lIEdyYXBoVDo6UmF3VmVjdG9yOworCisgICAgYXNzZXJ0KEcuZ2V0Tm9kZURlZ3JlZShOSWQpID09IDEgJiYKKyAgICAgICAgICAgIlIxIGFwcGxpZWQgdG8gbm9kZSB3aXRoIGRlZ3JlZSAhPSAxLiIpOworCisgICAgRWRnZUlkIEVJZCA9ICpHLmFkakVkZ2VJZHMoTklkKS5iZWdpbigpOworICAgIE5vZGVJZCBNSWQgPSBHLmdldEVkZ2VPdGhlck5vZGVJZChFSWQsIE5JZCk7CisKKyAgICBjb25zdCBNYXRyaXggJkVDb3N0cyA9IEcuZ2V0RWRnZUNvc3RzKEVJZCk7CisgICAgY29uc3QgVmVjdG9yICZYQ29zdHMgPSBHLmdldE5vZGVDb3N0cyhOSWQpOworICAgIFJhd1ZlY3RvciBZQ29zdHMgPSBHLmdldE5vZGVDb3N0cyhNSWQpOworCisgICAgLy8gRHVwbGljYXRlIGEgbGl0dGxlIHRvIGF2b2lkIHRyYW5zcG9zaW5nIG1hdHJpY2VzLgorICAgIGlmIChOSWQgPT0gRy5nZXRFZGdlTm9kZTFJZChFSWQpKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgWUNvc3RzLmdldExlbmd0aCgpOyArK2opIHsKKyAgICAgICAgUEJRUE51bSBNaW4gPSBFQ29zdHNbMF1bal0gKyBYQ29zdHNbMF07CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPCBYQ29zdHMuZ2V0TGVuZ3RoKCk7ICsraSkgeworICAgICAgICAgIFBCUVBOdW0gQyA9IEVDb3N0c1tpXVtqXSArIFhDb3N0c1tpXTsKKyAgICAgICAgICBpZiAoQyA8IE1pbikKKyAgICAgICAgICAgIE1pbiA9IEM7CisgICAgICAgIH0KKyAgICAgICAgWUNvc3RzW2pdICs9IE1pbjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFlDb3N0cy5nZXRMZW5ndGgoKTsgKytpKSB7CisgICAgICAgIFBCUVBOdW0gTWluID0gRUNvc3RzW2ldWzBdICsgWENvc3RzWzBdOworICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAxOyBqIDwgWENvc3RzLmdldExlbmd0aCgpOyArK2opIHsKKyAgICAgICAgICBQQlFQTnVtIEMgPSBFQ29zdHNbaV1bal0gKyBYQ29zdHNbal07CisgICAgICAgICAgaWYgKEMgPCBNaW4pCisgICAgICAgICAgICBNaW4gPSBDOworICAgICAgICB9CisgICAgICAgIFlDb3N0c1tpXSArPSBNaW47CisgICAgICB9CisgICAgfQorICAgIEcuc2V0Tm9kZUNvc3RzKE1JZCwgWUNvc3RzKTsKKyAgICBHLmRpc2Nvbm5lY3RFZGdlKEVJZCwgTUlkKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBHcmFwaFQ+CisgIHZvaWQgYXBwbHlSMihHcmFwaFQgJkcsIHR5cGVuYW1lIEdyYXBoVDo6Tm9kZUlkIE5JZCkgeworICAgIHVzaW5nIE5vZGVJZCA9IHR5cGVuYW1lIEdyYXBoVDo6Tm9kZUlkOworICAgIHVzaW5nIEVkZ2VJZCA9IHR5cGVuYW1lIEdyYXBoVDo6RWRnZUlkOworICAgIHVzaW5nIFZlY3RvciA9IHR5cGVuYW1lIEdyYXBoVDo6VmVjdG9yOworICAgIHVzaW5nIE1hdHJpeCA9IHR5cGVuYW1lIEdyYXBoVDo6TWF0cml4OworICAgIHVzaW5nIFJhd01hdHJpeCA9IHR5cGVuYW1lIEdyYXBoVDo6UmF3TWF0cml4OworCisgICAgYXNzZXJ0KEcuZ2V0Tm9kZURlZ3JlZShOSWQpID09IDIgJiYKKyAgICAgICAgICAgIlIyIGFwcGxpZWQgdG8gbm9kZSB3aXRoIGRlZ3JlZSAhPSAyLiIpOworCisgICAgY29uc3QgVmVjdG9yICZYQ29zdHMgPSBHLmdldE5vZGVDb3N0cyhOSWQpOworCisgICAgdHlwZW5hbWUgR3JhcGhUOjpBZGpFZGdlSXRyIEFFSXRyID0gRy5hZGpFZGdlSWRzKE5JZCkuYmVnaW4oKTsKKyAgICBFZGdlSWQgWVhFSWQgPSAqQUVJdHIsCisgICAgICAgICAgIFpYRUlkID0gKigrK0FFSXRyKTsKKworICAgIE5vZGVJZCBZTklkID0gRy5nZXRFZGdlT3RoZXJOb2RlSWQoWVhFSWQsIE5JZCksCisgICAgICAgICAgIFpOSWQgPSBHLmdldEVkZ2VPdGhlck5vZGVJZChaWEVJZCwgTklkKTsKKworICAgIGJvb2wgRmxpcEVkZ2UxID0gKEcuZ2V0RWRnZU5vZGUxSWQoWVhFSWQpID09IE5JZCksCisgICAgICAgICBGbGlwRWRnZTIgPSAoRy5nZXRFZGdlTm9kZTFJZChaWEVJZCkgPT0gTklkKTsKKworICAgIGNvbnN0IE1hdHJpeCAqWVhFQ29zdHMgPSBGbGlwRWRnZTEgPworICAgICAgbmV3IE1hdHJpeChHLmdldEVkZ2VDb3N0cyhZWEVJZCkudHJhbnNwb3NlKCkpIDoKKyAgICAgICZHLmdldEVkZ2VDb3N0cyhZWEVJZCk7CisKKyAgICBjb25zdCBNYXRyaXggKlpYRUNvc3RzID0gRmxpcEVkZ2UyID8KKyAgICAgIG5ldyBNYXRyaXgoRy5nZXRFZGdlQ29zdHMoWlhFSWQpLnRyYW5zcG9zZSgpKSA6CisgICAgICAmRy5nZXRFZGdlQ29zdHMoWlhFSWQpOworCisgICAgdW5zaWduZWQgWExlbiA9IFhDb3N0cy5nZXRMZW5ndGgoKSwKKyAgICAgIFlMZW4gPSBZWEVDb3N0cy0+Z2V0Um93cygpLAorICAgICAgWkxlbiA9IFpYRUNvc3RzLT5nZXRSb3dzKCk7CisKKyAgICBSYXdNYXRyaXggRGVsdGEoWUxlbiwgWkxlbik7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgWUxlbjsgKytpKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgWkxlbjsgKytqKSB7CisgICAgICAgIFBCUVBOdW0gTWluID0gKCpZWEVDb3N0cylbaV1bMF0gKyAoKlpYRUNvc3RzKVtqXVswXSArIFhDb3N0c1swXTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBrID0gMTsgayA8IFhMZW47ICsraykgeworICAgICAgICAgIFBCUVBOdW0gQyA9ICgqWVhFQ29zdHMpW2ldW2tdICsgKCpaWEVDb3N0cylbal1ba10gKyBYQ29zdHNba107CisgICAgICAgICAgaWYgKEMgPCBNaW4pIHsKKyAgICAgICAgICAgIE1pbiA9IEM7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIERlbHRhW2ldW2pdID0gTWluOworICAgICAgfQorICAgIH0KKworICAgIGlmIChGbGlwRWRnZTEpCisgICAgICBkZWxldGUgWVhFQ29zdHM7CisKKyAgICBpZiAoRmxpcEVkZ2UyKQorICAgICAgZGVsZXRlIFpYRUNvc3RzOworCisgICAgRWRnZUlkIFlaRUlkID0gRy5maW5kRWRnZShZTklkLCBaTklkKTsKKworICAgIGlmIChZWkVJZCA9PSBHLmludmFsaWRFZGdlSWQoKSkgeworICAgICAgWVpFSWQgPSBHLmFkZEVkZ2UoWU5JZCwgWk5JZCwgRGVsdGEpOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBNYXRyaXggJllaRUNvc3RzID0gRy5nZXRFZGdlQ29zdHMoWVpFSWQpOworICAgICAgaWYgKFlOSWQgPT0gRy5nZXRFZGdlTm9kZTFJZChZWkVJZCkpIHsKKyAgICAgICAgRy51cGRhdGVFZGdlQ29zdHMoWVpFSWQsIERlbHRhICsgWVpFQ29zdHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRy51cGRhdGVFZGdlQ29zdHMoWVpFSWQsIERlbHRhLnRyYW5zcG9zZSgpICsgWVpFQ29zdHMpOworICAgICAgfQorICAgIH0KKworICAgIEcuZGlzY29ubmVjdEVkZ2UoWVhFSWQsIFlOSWQpOworICAgIEcuZGlzY29ubmVjdEVkZ2UoWlhFSWQsIFpOSWQpOworCisgICAgLy8gVE9ETzogVHJ5IHRvIG5vcm1hbGl6ZSBuZXdseSBhZGRlZC9tb2RpZmllZCBlZGdlLgorICB9CisKKyNpZm5kZWYgTkRFQlVHCisgIC8vIERvZXMgdGhpcyBDb3N0IHZlY3RvciBoYXZlIGFueSByZWdpc3RlciBvcHRpb25zID8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFZlY3RvclQ+CisgIGJvb2wgaGFzUmVnaXN0ZXJPcHRpb25zKGNvbnN0IFZlY3RvclQgJlYpIHsKKyAgICB1bnNpZ25lZCBWTCA9IFYuZ2V0TGVuZ3RoKCk7CisKKyAgICAvLyBBbiBlbXB0eSBvciBzcGlsbCBvbmx5IGNvc3QgdmVjdG9yIGRvZXMgbm90IHByb3ZpZGUgYW55IHJlZ2lzdGVyIG9wdGlvbi4KKyAgICBpZiAoVkwgPD0gMSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIElmIHRoZXJlIGFyZSByZWdpc3RlcnMgaW4gdGhlIGNvc3QgdmVjdG9yLCBidXQgYWxsIG9mIHRoZW0gaGF2ZSBpbmZpbml0ZQorICAgIC8vIGNvc3RzLCB0aGVuIC4uLiB0aGVyZSBpcyBubyBhdmFpbGFibGUgcmVnaXN0ZXIuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IFZMOyArK2kpCisgICAgICBpZiAoVltpXSAhPSBzdGQ6Om51bWVyaWNfbGltaXRzPFBCUVA6OlBCUVBOdW0+OjppbmZpbml0eSgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorI2VuZGlmCisKKyAgLy8gXGJyaWVmIEZpbmQgYSBzb2x1dGlvbiB0byBhIGZ1bGx5IHJlZHVjZWQgZ3JhcGggYnkgYmFja3Byb3BhZ2F0aW9uLgorICAvLworICAvLyBHaXZlbiBhIGdyYXBoIGFuZCBhIHJlZHVjdGlvbiBvcmRlciwgcG9wIGVhY2ggbm9kZSBmcm9tIHRoZSByZWR1Y3Rpb24KKyAgLy8gb3JkZXIgYW5kIGdyZWVkaWx5IGNvbXB1dGUgYSBtaW5pbXVtIHNvbHV0aW9uIGJhc2VkIG9uIHRoZSBub2RlIGNvc3RzLCBhbmQKKyAgLy8gdGhlIGRlcGVuZGVudCBjb3N0cyBkdWUgdG8gcHJldmlvdXNseSBzb2x2ZWQgbm9kZXMuCisgIC8vCisgIC8vIE5vdGUgLSBUaGlzIGRvZXMgbm90IHJldHVybiB0aGUgZ3JhcGggdG8gaXRzIG9yaWdpbmFsIChwcmUtcmVkdWN0aW9uKQorICAvLyAgICAgICAgc3RhdGU6IHRoZSBleGlzdGluZyBzb2x2ZXJzIGRlc3RydWN0aXZlbHkgYWx0ZXIgdGhlIG5vZGUgYW5kIGVkZ2UKKyAgLy8gICAgICAgIGNvc3RzLiBHaXZlbiB0aGF0LCB0aGUgYmFja3Byb3BhZ2F0ZSBmdW5jdGlvbiBkb2Vzbid0IGF0dGVtcHQgdG8KKyAgLy8gICAgICAgIHJlcGxhY2UgdGhlIGVkZ2VzIGVpdGhlciwgYnV0IGxlYXZlcyB0aGUgZ3JhcGggaW4gaXRzIHJlZHVjZWQKKyAgLy8gICAgICAgIHN0YXRlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgR3JhcGhULCB0eXBlbmFtZSBTdGFja1Q+CisgIFNvbHV0aW9uIGJhY2twcm9wYWdhdGUoR3JhcGhUJiBHLCBTdGFja1Qgc3RhY2spIHsKKyAgICB1c2luZyBOb2RlSWQgPSBHcmFwaEJhc2U6Ok5vZGVJZDsKKyAgICB1c2luZyBNYXRyaXggPSB0eXBlbmFtZSBHcmFwaFQ6Ok1hdHJpeDsKKyAgICB1c2luZyBSYXdWZWN0b3IgPSB0eXBlbmFtZSBHcmFwaFQ6OlJhd1ZlY3RvcjsKKworICAgIFNvbHV0aW9uIHM7CisKKyAgICB3aGlsZSAoIXN0YWNrLmVtcHR5KCkpIHsKKyAgICAgIE5vZGVJZCBOSWQgPSBzdGFjay5iYWNrKCk7CisgICAgICBzdGFjay5wb3BfYmFjaygpOworCisgICAgICBSYXdWZWN0b3IgdiA9IEcuZ2V0Tm9kZUNvc3RzKE5JZCk7CisKKyNpZm5kZWYgTkRFQlVHCisgICAgICAvLyBBbHRob3VnaCBhIGNvbnNlcnZhdGl2ZWx5IGFsbG9jYXRhYmxlIG5vZGUgY2FuIGJlIGFsbG9jYXRlZCB0byBhIHJlZ2lzdGVyLAorICAgICAgLy8gc3BpbGxpbmcgaXQgbWF5IHByb3ZpZGUgYSBsb3dlciBjb3N0IHNvbHV0aW9uLiBBc3NlcnQgaGVyZSB0aGF0IHNwaWxsaW5nCisgICAgICAvLyBpcyBkb25lIGJ5IGNob2ljZSwgbm90IGJlY2F1c2UgdGhlcmUgd2VyZSBubyByZWdpc3RlciBhdmFpbGFibGUuCisgICAgICBpZiAoRy5nZXROb2RlTWV0YWRhdGEoTklkKS53YXNDb25zZXJ2YXRpdmVseUFsbG9jYXRhYmxlKCkpCisgICAgICAgIGFzc2VydChoYXNSZWdpc3Rlck9wdGlvbnModikgJiYgIkEgY29uc2VydmF0aXZlbHkgYWxsb2NhdGFibGUgbm9kZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgaGF2ZSBhdmFpbGFibGUgcmVnaXN0ZXIgb3B0aW9ucyIpOworI2VuZGlmCisKKyAgICAgIGZvciAoYXV0byBFSWQgOiBHLmFkakVkZ2VJZHMoTklkKSkgeworICAgICAgICBjb25zdCBNYXRyaXgmIGVkZ2VDb3N0cyA9IEcuZ2V0RWRnZUNvc3RzKEVJZCk7CisgICAgICAgIGlmIChOSWQgPT0gRy5nZXRFZGdlTm9kZTFJZChFSWQpKSB7CisgICAgICAgICAgTm9kZUlkIG1JZCA9IEcuZ2V0RWRnZU5vZGUySWQoRUlkKTsKKyAgICAgICAgICB2ICs9IGVkZ2VDb3N0cy5nZXRDb2xBc1ZlY3RvcihzLmdldFNlbGVjdGlvbihtSWQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBOb2RlSWQgbUlkID0gRy5nZXRFZGdlTm9kZTFJZChFSWQpOworICAgICAgICAgIHYgKz0gZWRnZUNvc3RzLmdldFJvd0FzVmVjdG9yKHMuZ2V0U2VsZWN0aW9uKG1JZCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHMuc2V0U2VsZWN0aW9uKE5JZCwgdi5taW5JbmRleCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gczsKKyAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgUEJRUAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9QQlFQX1JFRFVDVElPTlJVTEVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QQlFQL1NvbHV0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUEJRUC9Tb2x1dGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMjQ3MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUEJRUC9Tb2x1dGlvbi5oCkBAIC0wLDAgKzEsNTYgQEAKKy8vPT09LSBTb2x1dGlvbi5oIC0gUEJRUCBTb2x1dGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gUEJRUCBTb2x1dGlvbiBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9QQlFQX1NPTFVUSU9OX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1BCUVBfU09MVVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1BCUVAvR3JhcGguaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIFBCUVAgeworCisgIC8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIHNvbHV0aW9uIHRvIGEgUEJRUCBwcm9ibGVtLgorICAvLy8KKyAgLy8vIFRvIGdldCB0aGUgc2VsZWN0aW9uIGZvciBlYWNoIG5vZGUgaW4gdGhlIHByb2JsZW0gdXNlIHRoZSBnZXRTZWxlY3Rpb24gbWV0aG9kLgorICBjbGFzcyBTb2x1dGlvbiB7CisgIHByaXZhdGU6CisgICAgdXNpbmcgU2VsZWN0aW9uc01hcCA9IHN0ZDo6bWFwPEdyYXBoQmFzZTo6Tm9kZUlkLCB1bnNpZ25lZD47CisgICAgU2VsZWN0aW9uc01hcCBzZWxlY3Rpb25zOworCisgIHB1YmxpYzoKKyAgICAvLy8gXGJyaWVmIEluaXRpYWxpc2UgYW4gZW1wdHkgc29sdXRpb24uCisgICAgU29sdXRpb24oKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gXGJyaWVmIFNldCB0aGUgc2VsZWN0aW9uIGZvciBhIGdpdmVuIG5vZGUuCisgICAgLy8vIEBwYXJhbSBub2RlSWQgTm9kZSBpZC4KKyAgICAvLy8gQHBhcmFtIHNlbGVjdGlvbiBTZWxlY3Rpb24gZm9yIG5vZGVJZC4KKyAgICB2b2lkIHNldFNlbGVjdGlvbihHcmFwaEJhc2U6Ok5vZGVJZCBub2RlSWQsIHVuc2lnbmVkIHNlbGVjdGlvbikgeworICAgICAgc2VsZWN0aW9uc1tub2RlSWRdID0gc2VsZWN0aW9uOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgR2V0IGEgbm9kZSdzIHNlbGVjdGlvbi4KKyAgICAvLy8gQHBhcmFtIG5vZGVJZCBOb2RlIGlkLgorICAgIC8vLyBAcmV0dXJuIFRoZSBzZWxlY3Rpb24gZm9yIG5vZGVJZDsKKyAgICB1bnNpZ25lZCBnZXRTZWxlY3Rpb24oR3JhcGhCYXNlOjpOb2RlSWQgbm9kZUlkKSBjb25zdCB7CisgICAgICBTZWxlY3Rpb25zTWFwOjpjb25zdF9pdGVyYXRvciBzSXRyID0gc2VsZWN0aW9ucy5maW5kKG5vZGVJZCk7CisgICAgICBhc3NlcnQoc0l0ciAhPSBzZWxlY3Rpb25zLmVuZCgpICYmICJObyBzZWxlY3Rpb24gZm9yIG5vZGUuIik7CisgICAgICByZXR1cm4gc0l0ci0+c2Vjb25kOworICAgIH0KKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIFBCUVAKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fUEJRUF9TT0xVVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUEJRUFJBQ29uc3RyYWludC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1BCUVBSQUNvbnN0cmFpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjliN2E3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1BCUVBSQUNvbnN0cmFpbnQuaApAQCAtMCwwICsxLDcxIEBACisvLz09PS0gUmVnQWxsb2NQQlFQLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBQQlFQQnVpbGRlciBpbnRlcmZhY2UsIGZvciBjbGFzc2VzIHdoaWNoIGJ1aWxkIFBCUVAKKy8vIGluc3RhbmNlcyB0byByZXByZXNlbnQgcmVnaXN0ZXIgYWxsb2NhdGlvbiBwcm9ibGVtcywgYW5kIHRoZSBSZWdBbGxvY1BCUVAKKy8vIGludGVyZmFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9QQlFQUkFDT05TVFJBSU5UX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1BCUVBSQUNPTlNUUkFJTlRfSAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIFBCUVAgeworbmFtZXNwYWNlIFJlZ0FsbG9jIHsKKworLy8gRm9yd2FyZCBkZWNsYXJlIFBCUVAgZ3JhcGggY2xhc3MuCitjbGFzcyBQQlFQUkFHcmFwaDsKKworfSAvLyBlbmQgbmFtZXNwYWNlIFJlZ0FsbG9jCit9IC8vIGVuZCBuYW1lc3BhY2UgUEJRUAorCit1c2luZyBQQlFQUkFHcmFwaCA9IFBCUVA6OlJlZ0FsbG9jOjpQQlFQUkFHcmFwaDsKKworLy8vIEBicmllZiBBYnN0cmFjdCBiYXNlIGZvciBjbGFzc2VzIGltcGxlbWVudGluZyBQQlFQIHJlZ2lzdGVyIGFsbG9jYXRpb24KKy8vLyAgICAgICAgY29uc3RyYWludHMgKGUuZy4gU3BpbGwtY29zdHMsIGludGVyZmVyZW5jZSwgY29hbGVzY2luZykuCitjbGFzcyBQQlFQUkFDb25zdHJhaW50IHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+UEJRUFJBQ29uc3RyYWludCgpID0gMDsKKyAgdmlydHVhbCB2b2lkIGFwcGx5KFBCUVBSQUdyYXBoICZHKSA9IDA7CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKK307CisKKy8vLyBAYnJpZWYgUEJRUCByZWdpc3RlciBhbGxvY2F0aW9uIGNvbnN0cmFpbnQgY29tcG9zZXIuCisvLy8KKy8vLyAgIENvbnN0cmFpbnRzIGFkZGVkIHRvIHRoaXMgbGlzdCB3aWxsIGJlIGFwcGxpZWQsIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlCisvLy8gYWRkZWQsIHRvIHRoZSBQQlFQIGdyYXBoLgorY2xhc3MgUEJRUFJBQ29uc3RyYWludExpc3QgOiBwdWJsaWMgUEJRUFJBQ29uc3RyYWludCB7CitwdWJsaWM6CisgIHZvaWQgYXBwbHkoUEJRUFJBR3JhcGggJkcpIG92ZXJyaWRlIHsKKyAgICBmb3IgKGF1dG8gJkMgOiBDb25zdHJhaW50cykKKyAgICAgIEMtPmFwcGx5KEcpOworICB9CisKKyAgdm9pZCBhZGRDb25zdHJhaW50KHN0ZDo6dW5pcXVlX3B0cjxQQlFQUkFDb25zdHJhaW50PiBDKSB7CisgICAgaWYgKEMpCisgICAgICBDb25zdHJhaW50cy5wdXNoX2JhY2soc3RkOjptb3ZlKEMpKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8UEJRUFJBQ29uc3RyYWludD4+IENvbnN0cmFpbnRzOworCisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1BCUVBSQUNPTlNUUkFJTlRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1BhcmFsbGVsQ0cuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QYXJhbGxlbENHLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlZjBlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QYXJhbGxlbENHLmgKQEAgLTAsMCArMSw0OCBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vUGFyYWxsZWxDRy5oIC0gUGFyYWxsZWwgY29kZSBnZW5lcmF0aW9uIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBkZWNsYXJlcyBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgcGFyYWxsZWwgY29kZSBnZW5lcmF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1BBUkFMTEVMQ0dfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUEFSQUxMRUxDR19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29kZUdlbi5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEFycmF5UmVmOworY2xhc3MgTW9kdWxlOworY2xhc3MgVGFyZ2V0T3B0aW9uczsKK2NsYXNzIHJhd19wd3JpdGVfc3RyZWFtOworCisvLy8gU3BsaXQgTSBpbnRvIE9Tcy5zaXplKCkgcGFydGl0aW9ucywgYW5kIGdlbmVyYXRlIGNvZGUgZm9yIGVhY2guIFRha2VzIGEKKy8vLyBmYWN0b3J5IGZ1bmN0aW9uIGZvciB0aGUgVGFyZ2V0TWFjaGluZSBUTUZhY3RvcnkuIFdyaXRlcyBPU3Muc2l6ZSgpIG91dHB1dAorLy8vIGZpbGVzIHRvIHRoZSBvdXRwdXQgc3RyZWFtcyBpbiBPU3MuIFRoZSByZXN1bHRpbmcgb3V0cHV0IGZpbGVzIGlmIGxpbmtlZAorLy8vIHRvZ2V0aGVyIGFyZSBpbnRlbmRlZCB0byBiZSBlcXVpdmFsZW50IHRvIHRoZSBzaW5nbGUgb3V0cHV0IGZpbGUgdGhhdCB3b3VsZAorLy8vIGhhdmUgYmVlbiBjb2RlIGdlbmVyYXRlZCBmcm9tIE0uCisvLy8KKy8vLyBXcml0ZXMgYml0Y29kZSBmb3IgaW5kaXZpZHVhbCBwYXJ0aXRpb25zIGludG8gb3V0cHV0IHN0cmVhbXMgaW4gQkNPU3MsIGlmCisvLy8gQkNPU3MgaXMgbm90IGVtcHR5LgorLy8vCisvLy8gXHJldHVybnMgTSBpZiBPU3Muc2l6ZSgpID09IDEsIG90aGVyd2lzZSByZXR1cm5zIHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+KCkuCitzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPgorc3BsaXRDb2RlR2VuKHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IE0sIEFycmF5UmVmPHJhd19wd3JpdGVfc3RyZWFtICo+IE9TcywKKyAgICAgICAgICAgICBBcnJheVJlZjxsbHZtOjpyYXdfcHdyaXRlX3N0cmVhbSAqPiBCQ09TcywKKyAgICAgICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHN0ZDo6dW5pcXVlX3B0cjxUYXJnZXRNYWNoaW5lPigpPiAmVE1GYWN0b3J5LAorICAgICAgICAgICAgIFRhcmdldE1hY2hpbmU6OkNvZGVHZW5GaWxlVHlwZSBGVCA9IFRhcmdldE1hY2hpbmU6OkNHRlRfT2JqZWN0RmlsZSwKKyAgICAgICAgICAgICBib29sIFByZXNlcnZlTG9jYWxzID0gZmFsc2UpOworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1Bhc3Nlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZmQwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUGFzc2VzLmgKQEAgLTAsMCArMSw0MzkgQEAKKy8vPT09LS0gUGFzc2VzLmggLSBUYXJnZXQgaW5kZXBlbmRlbnQgY29kZSBnZW5lcmF0aW9uIHBhc3NlcyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgaW50ZXJmYWNlcyB0byBhY2Nlc3MgdGhlIHRhcmdldCBpbmRlcGVuZGVudCBjb2RlIGdlbmVyYXRpb24KKy8vIHBhc3NlcyBwcm92aWRlZCBieSB0aGUgTExWTSBiYWNrZW5kLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1BBU1NFU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9QQVNTRVNfSAorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb25QYXNzOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uUGFzczsKK2NsYXNzIE1vZHVsZVBhc3M7CitjbGFzcyBQYXNzOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKK2NsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7CitjbGFzcyByYXdfb3N0cmVhbTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworLy8vIExpc3Qgb2YgdGFyZ2V0IGluZGVwZW5kZW50IENvZGVHZW4gcGFzcyBJRHMuCituYW1lc3BhY2UgbGx2bSB7CisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlQXRvbWljRXhwYW5kUGFzcygpOworCisgIC8vLyBjcmVhdGVVbnJlYWNoYWJsZUJsb2NrRWxpbWluYXRpb25QYXNzIC0gVGhlIExMVk0gY29kZSBnZW5lcmF0b3IgZG9lcyBub3QKKyAgLy8vIHdvcmsgd2VsbCB3aXRoIHVucmVhY2hhYmxlIGJhc2ljIGJsb2NrcyAod2hhdCBsaXZlIHJhbmdlcyBtYWtlIHNlbnNlIGZvciBhCisgIC8vLyBibG9jayB0aGF0IGNhbm5vdCBiZSByZWFjaGVkPykuICBBcyBzdWNoLCBhIGNvZGUgZ2VuZXJhdG9yIHNob3VsZCBlaXRoZXIKKyAgLy8vIG5vdCBpbnN0cnVjdGlvbiBzZWxlY3QgdW5yZWFjaGFibGUgYmxvY2tzLCBvciBydW4gdGhpcyBwYXNzIGFzIGl0cworICAvLy8gbGFzdCBMTFZNIG1vZGlmeWluZyBwYXNzIHRvIGNsZWFuIHVwIGJsb2NrcyB0aGF0IGFyZSBub3QgcmVhY2hhYmxlIGZyb20KKyAgLy8vIHRoZSBlbnRyeSBibG9jay4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVVbnJlYWNoYWJsZUJsb2NrRWxpbWluYXRpb25QYXNzKCk7CisKKyAgLy8vIE1hY2hpbmVGdW5jdGlvblByaW50ZXIgcGFzcyAtIFRoaXMgcGFzcyBwcmludHMgb3V0IHRoZSBtYWNoaW5lIGZ1bmN0aW9uIHRvCisgIC8vLyB0aGUgZ2l2ZW4gc3RyZWFtIGFzIGEgZGVidWdnaW5nIHRvb2wuCisgIE1hY2hpbmVGdW5jdGlvblBhc3MgKgorICBjcmVhdGVNYWNoaW5lRnVuY3Rpb25QcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIgPSIiKTsKKworICAvLy8gTUlSUHJpbnRpbmcgcGFzcyAtIHRoaXMgcGFzcyBwcmludHMgb3V0IHRoZSBMTFZNIElSIGludG8gdGhlIGdpdmVuIHN0cmVhbQorICAvLy8gdXNpbmcgdGhlIE1JUiBzZXJpYWxpemF0aW9uIGZvcm1hdC4KKyAgTWFjaGluZUZ1bmN0aW9uUGFzcyAqY3JlYXRlUHJpbnRNSVJQYXNzKHJhd19vc3RyZWFtICZPUyk7CisKKyAgLy8vIFRoaXMgcGFzcyByZXNldHMgYSBNYWNoaW5lRnVuY3Rpb24gd2hlbiBpdCBoYXMgdGhlIEZhaWxlZElTZWwgcHJvcGVydHkKKyAgLy8vIGFzIGlmIGl0IHdhcyBqdXN0IGNyZWF0ZWQuCisgIC8vLyBJZiBFbWl0RmFsbGJhY2tEaWFnIGlzIHRydWUsIHRoZSBwYXNzIHdpbGwgZW1pdCBhCisgIC8vLyBEaWFnbm9zdGljSW5mb0lTZWxGYWxsYmFjayBmb3IgZXZlcnkgTWFjaGluZUZ1bmN0aW9uIGl0IHJlc2V0cy4KKyAgLy8vIElmIEFib3J0T25GYWlsZWRJU2VsIGlzIHRydWUsIGFib3J0IGNvbXBpbGF0aW9uIGluc3RlYWQgb2YgcmVzZXR0aW5nLgorICBNYWNoaW5lRnVuY3Rpb25QYXNzICpjcmVhdGVSZXNldE1hY2hpbmVGdW5jdGlvblBhc3MoYm9vbCBFbWl0RmFsbGJhY2tEaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBYm9ydE9uRmFpbGVkSVNlbCk7CisKKyAgLy8vIGNyZWF0ZUNvZGVHZW5QcmVwYXJlUGFzcyAtIFRyYW5zZm9ybSB0aGUgY29kZSB0byBleHBvc2UgbW9yZSBwYXR0ZXJuCisgIC8vLyBtYXRjaGluZyBkdXJpbmcgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZUNvZGVHZW5QcmVwYXJlUGFzcygpOworCisgIC8vLyBjcmVhdGVTY2FsYXJpemVNYXNrZWRNZW1JbnRyaW5QYXNzIC0gUmVwbGFjZSBtYXNrZWQgbG9hZCwgc3RvcmUsIGdhdGhlcgorICAvLy8gYW5kIHNjYXR0ZXIgaW50cmluc2ljcyB3aXRoIHNjYWxhciBjb2RlIHdoZW4gdGFyZ2V0IGRvZXNuJ3Qgc3VwcG9ydCB0aGVtLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZVNjYWxhcml6ZU1hc2tlZE1lbUludHJpblBhc3MoKTsKKworICAvLy8gQXRvbWljRXhwYW5kSUQgLS0gTG93ZXJzIGF0b21pYyBvcGVyYXRpb25zIGluIHRlcm1zIG9mIGVpdGhlciBjbXB4Y2hnCisgIC8vLyBsb2FkLWxpbmtlZC9zdG9yZS1jb25kaXRpb25hbCBsb29wcy4KKyAgZXh0ZXJuIGNoYXIgJkF0b21pY0V4cGFuZElEOworCisgIC8vLyBNYWNoaW5lTG9vcEluZm8gLSBUaGlzIHBhc3MgaXMgYSBsb29wIGFuYWx5c2lzIHBhc3MuCisgIGV4dGVybiBjaGFyICZNYWNoaW5lTG9vcEluZm9JRDsKKworICAvLy8gTWFjaGluZURvbWluYXRvcnMgLSBUaGlzIHBhc3MgaXMgYSBtYWNoaW5lIGRvbWluYXRvcnMgYW5hbHlzaXMgcGFzcy4KKyAgZXh0ZXJuIGNoYXIgJk1hY2hpbmVEb21pbmF0b3JzSUQ7CisKKy8vLyBNYWNoaW5lRG9taW5hbmFjZUZyb250aWVyIC0gVGhpcyBwYXNzIGlzIGEgbWFjaGluZSBkb21pbmF0b3JzIGFuYWx5c2lzIHBhc3MuCisgIGV4dGVybiBjaGFyICZNYWNoaW5lRG9taW5hbmNlRnJvbnRpZXJJRDsKKworICAvLy8gTWFjaGluZVJlZ2lvbkluZm8gLSBUaGlzIHBhc3MgY29tcHV0ZXMgU0VTRSByZWdpb25zIGZvciBtYWNoaW5lIGZ1bmN0aW9ucy4KKyAgZXh0ZXJuIGNoYXIgJk1hY2hpbmVSZWdpb25JbmZvUGFzc0lEOworCisgIC8vLyBFZGdlQnVuZGxlcyBhbmFseXNpcyAtIEJ1bmRsZSBtYWNoaW5lIENGRyBlZGdlcy4KKyAgZXh0ZXJuIGNoYXIgJkVkZ2VCdW5kbGVzSUQ7CisKKyAgLy8vIExpdmVWYXJpYWJsZXMgcGFzcyAtIFRoaXMgcGFzcyBjb21wdXRlcyB0aGUgc2V0IG9mIGJsb2NrcyBpbiB3aGljaCBlYWNoCisgIC8vLyB2YXJpYWJsZSBpcyBsaWZlIGFuZCBzZXRzIG1hY2hpbmUgb3BlcmFuZCBraWxsIGZsYWdzLgorICBleHRlcm4gY2hhciAmTGl2ZVZhcmlhYmxlc0lEOworCisgIC8vLyBQSElFbGltaW5hdGlvbiAtIFRoaXMgcGFzcyBlbGltaW5hdGVzIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gUEhJIG5vZGVzCisgIC8vLyBieSBpbnNlcnRpbmcgY29weSBpbnN0cnVjdGlvbnMuICBUaGlzIGRlc3Ryb3lzIFNTQSBpbmZvcm1hdGlvbiwgYnV0IGlzIHRoZQorICAvLy8gZGVzaXJlZCBpbnB1dCBmb3Igc29tZSByZWdpc3RlciBhbGxvY2F0b3JzLiAgVGhpcyBwYXNzIGlzICJyZXF1aXJlZCIgYnkKKyAgLy8vIHRoZXNlIHJlZ2lzdGVyIGFsbG9jYXRvciBsaWtlIHRoaXM6IEFVLmFkZFJlcXVpcmVkSUQoUEhJRWxpbWluYXRpb25JRCk7CisgIGV4dGVybiBjaGFyICZQSElFbGltaW5hdGlvbklEOworCisgIC8vLyBMaXZlSW50ZXJ2YWxzIC0gVGhpcyBhbmFseXNpcyBrZWVwcyB0cmFjayBvZiB0aGUgbGl2ZSByYW5nZXMgb2YgdmlydHVhbAorICAvLy8gYW5kIHBoeXNpY2FsIHJlZ2lzdGVycy4KKyAgZXh0ZXJuIGNoYXIgJkxpdmVJbnRlcnZhbHNJRDsKKworICAvLy8gTGl2ZVN0YWNrcyBwYXNzLiBBbiBhbmFseXNpcyBrZWVwaW5nIHRyYWNrIG9mIHRoZSBsaXZlbmVzcyBvZiBzdGFjayBzbG90cy4KKyAgZXh0ZXJuIGNoYXIgJkxpdmVTdGFja3NJRDsKKworICAvLy8gVHdvQWRkcmVzc0luc3RydWN0aW9uIC0gVGhpcyBwYXNzIHJlZHVjZXMgdHdvLWFkZHJlc3MgaW5zdHJ1Y3Rpb25zIHRvCisgIC8vLyB1c2UgdHdvIG9wZXJhbmRzLiBUaGlzIGRlc3Ryb3lzIFNTQSBpbmZvcm1hdGlvbiBidXQgaXQgaXMgZGVzaXJlZCBieQorICAvLy8gcmVnaXN0ZXIgYWxsb2NhdG9ycy4KKyAgZXh0ZXJuIGNoYXIgJlR3b0FkZHJlc3NJbnN0cnVjdGlvblBhc3NJRDsKKworICAvLy8gUHJvY2Vzc0ltcGljaXREZWZzIHBhc3MgLSBUaGlzIHBhc3MgcmVtb3ZlcyBJTVBMSUNJVF9ERUZzLgorICBleHRlcm4gY2hhciAmUHJvY2Vzc0ltcGxpY2l0RGVmc0lEOworCisgIC8vLyBSZWdpc3RlckNvYWxlc2NlciAtIFRoaXMgcGFzcyBtZXJnZXMgbGl2ZSByYW5nZXMgdG8gZWxpbWluYXRlIGNvcGllcy4KKyAgZXh0ZXJuIGNoYXIgJlJlZ2lzdGVyQ29hbGVzY2VySUQ7CisKKyAgLy8vIE1hY2hpbmVTY2hlZHVsZXIgLSBUaGlzIHBhc3Mgc2NoZWR1bGVzIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLgorICBleHRlcm4gY2hhciAmTWFjaGluZVNjaGVkdWxlcklEOworCisgIC8vLyBQb3N0TWFjaGluZVNjaGVkdWxlciAtIFRoaXMgcGFzcyBzY2hlZHVsZXMgbWFjaGluZSBpbnN0cnVjdGlvbnMgcG9zdFJBLgorICBleHRlcm4gY2hhciAmUG9zdE1hY2hpbmVTY2hlZHVsZXJJRDsKKworICAvLy8gU3BpbGxQbGFjZW1lbnQgYW5hbHlzaXMuIFN1Z2dlc3Qgb3B0aW1hbCBwbGFjZW1lbnQgb2Ygc3BpbGwgY29kZSBiZXR3ZWVuCisgIC8vLyBiYXNpYyBibG9ja3MuCisgIGV4dGVybiBjaGFyICZTcGlsbFBsYWNlbWVudElEOworCisgIC8vLyBTaHJpbmtXcmFwIHBhc3MuIExvb2sgZm9yIHRoZSBiZXN0IHBsYWNlIHRvIGluc2VydCBzYXZlIGFuZCByZXN0b3JlCisgIC8vIGluc3RydWN0aW9uIGFuZCB1cGRhdGUgdGhlIE1hY2hpbmVGdW5jdGlvbkluZm8gd2l0aCB0aGF0IGluZm9ybWF0aW9uLgorICBleHRlcm4gY2hhciAmU2hyaW5rV3JhcElEOworCisgIC8vLyBMaXZlUmFuZ2VTaHJpbmsgcGFzcy4gTW92ZSBpbnN0cnVjdGlvbiBjbG9zZSB0byBpdHMgZGVmaW5pdGlvbiB0byBzaHJpbmsKKyAgLy8vIHRoZSBkZWZpbml0aW9uJ3MgbGl2ZSByYW5nZS4KKyAgZXh0ZXJuIGNoYXIgJkxpdmVSYW5nZVNocmlua0lEOworCisgIC8vLyBHcmVlZHkgcmVnaXN0ZXIgYWxsb2NhdG9yLgorICBleHRlcm4gY2hhciAmUkFHcmVlZHlJRDsKKworICAvLy8gQmFzaWMgcmVnaXN0ZXIgYWxsb2NhdG9yLgorICBleHRlcm4gY2hhciAmUkFCYXNpY0lEOworCisgIC8vLyBWaXJ0UmVnUmV3cml0ZXIgcGFzcy4gUmV3cml0ZSB2aXJ0dWFsIHJlZ2lzdGVycyB0byBwaHlzaWNhbCByZWdpc3RlcnMgYXMKKyAgLy8vIGFzc2lnbmVkIGluIFZpcnRSZWdNYXAuCisgIGV4dGVybiBjaGFyICZWaXJ0UmVnUmV3cml0ZXJJRDsKKworICAvLy8gVW5yZWFjaGFibGVNYWNoaW5lQmxvY2tFbGltaW5hdGlvbiAtIFRoaXMgcGFzcyByZW1vdmVzIHVucmVhY2hhYmxlCisgIC8vLyBtYWNoaW5lIGJhc2ljIGJsb2Nrcy4KKyAgZXh0ZXJuIGNoYXIgJlVucmVhY2hhYmxlTWFjaGluZUJsb2NrRWxpbUlEOworCisgIC8vLyBEZWFkTWFjaGluZUluc3RydWN0aW9uRWxpbSAtIFRoaXMgcGFzcyByZW1vdmVzIGRlYWQgbWFjaGluZSBpbnN0cnVjdGlvbnMuCisgIGV4dGVybiBjaGFyICZEZWFkTWFjaGluZUluc3RydWN0aW9uRWxpbUlEOworCisgIC8vLyBUaGlzIHBhc3MgYWRkcyBkZWFkL3VuZGVmIGZsYWdzIGFmdGVyIGFuYWx5emluZyBzdWJyZWdpc3RlciBsYW5lcy4KKyAgZXh0ZXJuIGNoYXIgJkRldGVjdERlYWRMYW5lc0lEOworCisgIC8vLyBUaGlzIHBhc3MgcGVyZm9ybSBwb3N0LXJhIG1hY2hpbmUgc2luayBmb3IgQ09QWSBpbnN0cnVjdGlvbnMuCisgIGV4dGVybiBjaGFyICZQb3N0UkFNYWNoaW5lU2lua2luZ0lEOworCisgIC8vLyBGYXN0UmVnaXN0ZXJBbGxvY2F0aW9uIFBhc3MgLSBUaGlzIHBhc3MgcmVnaXN0ZXIgYWxsb2NhdGVzIGFzIGZhc3QgYXMKKyAgLy8vIHBvc3NpYmxlLiBJdCBpcyBiZXN0IHN1aXRlZCBmb3IgZGVidWcgY29kZSB3aGVyZSBsaXZlIHJhbmdlcyBhcmUgc2hvcnQuCisgIC8vLworICBGdW5jdGlvblBhc3MgKmNyZWF0ZUZhc3RSZWdpc3RlckFsbG9jYXRvcigpOworCisgIC8vLyBCYXNpY1JlZ2lzdGVyQWxsb2NhdGlvbiBQYXNzIC0gVGhpcyBwYXNzIGltcGxlbWVudHMgYSBkZWdlbmVyYXRlIGdsb2JhbAorICAvLy8gcmVnaXN0ZXIgYWxsb2NhdG9yIHVzaW5nIHRoZSBiYXNpYyByZWdhbGxvYyBmcmFtZXdvcmsuCisgIC8vLworICBGdW5jdGlvblBhc3MgKmNyZWF0ZUJhc2ljUmVnaXN0ZXJBbGxvY2F0b3IoKTsKKworICAvLy8gR3JlZWR5IHJlZ2lzdGVyIGFsbG9jYXRpb24gcGFzcyAtIFRoaXMgcGFzcyBpbXBsZW1lbnRzIGEgZ2xvYmFsIHJlZ2lzdGVyCisgIC8vLyBhbGxvY2F0b3IgZm9yIG9wdGltaXplZCBidWlsZHMuCisgIC8vLworICBGdW5jdGlvblBhc3MgKmNyZWF0ZUdyZWVkeVJlZ2lzdGVyQWxsb2NhdG9yKCk7CisKKyAgLy8vIFBCUVBSZWdpc3RlckFsbG9jYXRpb24gUGFzcyAtIFRoaXMgcGFzcyBpbXBsZW1lbnRzIHRoZSBQYXJ0aXRpb25lZCBCb29sZWFuCisgIC8vLyBRdWFkcmF0aWMgUHJvZ3JhYW1pbmcgKFBCUVApIGJhc2VkIHJlZ2lzdGVyIGFsbG9jYXRvci4KKyAgLy8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlRGVmYXVsdFBCUVBSZWdpc3RlckFsbG9jYXRvcigpOworCisgIC8vLyBQcm9sb2dFcGlsb2dDb2RlSW5zZXJ0ZXIgLSBUaGlzIHBhc3MgaW5zZXJ0cyBwcm9sb2cgYW5kIGVwaWxvZyBjb2RlLAorICAvLy8gYW5kIGVsaW1pbmF0ZXMgYWJzdHJhY3QgZnJhbWUgcmVmZXJlbmNlcy4KKyAgZXh0ZXJuIGNoYXIgJlByb2xvZ0VwaWxvZ0NvZGVJbnNlcnRlcklEOworICBNYWNoaW5lRnVuY3Rpb25QYXNzICpjcmVhdGVQcm9sb2dFcGlsb2dJbnNlcnRlclBhc3MoKTsKKworICAvLy8gRXhwYW5kUG9zdFJBUHNldWRvcyAtIFRoaXMgcGFzcyBleHBhbmRzIHBzZXVkbyBpbnN0cnVjdGlvbnMgYWZ0ZXIKKyAgLy8vIHJlZ2lzdGVyIGFsbG9jYXRpb24uCisgIGV4dGVybiBjaGFyICZFeHBhbmRQb3N0UkFQc2V1ZG9zSUQ7CisKKyAgLy8vIGNyZWF0ZVBvc3RSQUhhemFyZFJlY29nbml6ZXIgLSBUaGlzIHBhc3MgcnVucyB0aGUgcG9zdC1yYSBoYXphcmQKKyAgLy8vIHJlY29nbml6ZXIuCisgIGV4dGVybiBjaGFyICZQb3N0UkFIYXphcmRSZWNvZ25pemVySUQ7CisKKyAgLy8vIGNyZWF0ZVBvc3RSQVNjaGVkdWxlciAtIFRoaXMgcGFzcyBwZXJmb3JtcyBwb3N0IHJlZ2lzdGVyIGFsbG9jYXRpb24KKyAgLy8vIHNjaGVkdWxpbmcuCisgIGV4dGVybiBjaGFyICZQb3N0UkFTY2hlZHVsZXJJRDsKKworICAvLy8gQnJhbmNoRm9sZGluZyAtIFRoaXMgcGFzcyBwZXJmb3JtcyBtYWNoaW5lIGNvZGUgQ0ZHIGJhc2VkCisgIC8vLyBvcHRpbWl6YXRpb25zIHRvIGRlbGV0ZSBicmFuY2hlcyB0byBicmFuY2hlcywgZWxpbWluYXRlIGJyYW5jaGVzIHRvCisgIC8vLyBzdWNjZXNzb3IgYmxvY2tzIChjcmVhdGluZyBmYWxsIHRocm91Z2hzKSwgYW5kIGVsaW1pbmF0aW5nIGJyYW5jaGVzIG92ZXIKKyAgLy8vIGJyYW5jaGVzLgorICBleHRlcm4gY2hhciAmQnJhbmNoRm9sZGVyUGFzc0lEOworCisgIC8vLyBCcmFuY2hSZWxheGF0aW9uIC0gVGhpcyBwYXNzIHJlcGxhY2VzIGJyYW5jaGVzIHRoYXQgbmVlZCB0byBqdW1wIGZ1cnRoZXIKKyAgLy8vIHRoYW4gaXMgc3VwcG9ydGVkIGJ5IGEgYnJhbmNoIGluc3RydWN0aW9uLgorICBleHRlcm4gY2hhciAmQnJhbmNoUmVsYXhhdGlvblBhc3NJRDsKKworICAvLy8gTWFjaGluZUZ1bmN0aW9uUHJpbnRlclBhc3MgLSBUaGlzIHBhc3MgcHJpbnRzIG91dCBNYWNoaW5lSW5zdHIncy4KKyAgZXh0ZXJuIGNoYXIgJk1hY2hpbmVGdW5jdGlvblByaW50ZXJQYXNzSUQ7CisKKyAgLy8vIE1JUlByaW50aW5nUGFzcyAtIHRoaXMgcGFzcyBwcmludHMgb3V0IHRoZSBMTFZNIElSIHVzaW5nIHRoZSBNSVIKKyAgLy8vIHNlcmlhbGl6YXRpb24gZm9ybWF0LgorICBleHRlcm4gY2hhciAmTUlSUHJpbnRpbmdQYXNzSUQ7CisKKyAgLy8vIFRhaWxEdXBsaWNhdGUgLSBEdXBsaWNhdGUgYmxvY2tzIHdpdGggdW5jb25kaXRpb25hbCBicmFuY2hlcworICAvLy8gaW50byB0YWlscyBvZiB0aGVpciBwcmVkZWNlc3NvcnMuCisgIGV4dGVybiBjaGFyICZUYWlsRHVwbGljYXRlSUQ7CisKKyAgLy8vIER1cGxpY2F0ZSBibG9ja3Mgd2l0aCB1bmNvbmRpdGlvbmFsIGJyYW5jaGVzIGludG8gdGFpbHMgb2YgdGhlaXIKKyAgLy8vIHByZWRlY2Vzc29ycy4gVmFyaWFudCB0aGF0IHdvcmtzIGJlZm9yZSByZWdpc3RlciBhbGxvY2F0aW9uLgorICBleHRlcm4gY2hhciAmRWFybHlUYWlsRHVwbGljYXRlSUQ7CisKKyAgLy8vIE1hY2hpbmVUcmFjZU1ldHJpY3MgLSBUaGlzIHBhc3MgY29tcHV0ZXMgY3JpdGljYWwgcGF0aCBhbmQgQ1BVIHJlc291cmNlCisgIC8vLyB1c2FnZSBpbiBhbiBlbnNlbWJsZSBvZiB0cmFjZXMuCisgIGV4dGVybiBjaGFyICZNYWNoaW5lVHJhY2VNZXRyaWNzSUQ7CisKKyAgLy8vIEVhcmx5SWZDb252ZXJ0ZXIgLSBUaGlzIHBhc3MgcGVyZm9ybXMgaWYtY29udmVyc2lvbiBvbiBTU0EgZm9ybSBieQorICAvLy8gaW5zZXJ0aW5nIGNtb3YgaW5zdHJ1Y3Rpb25zLgorICBleHRlcm4gY2hhciAmRWFybHlJZkNvbnZlcnRlcklEOworCisgIC8vLyBUaGlzIHBhc3MgcGVyZm9ybXMgaW5zdHJ1Y3Rpb24gY29tYmluaW5nIHVzaW5nIHRyYWNlIG1ldHJpY3MgdG8gZXN0aW1hdGUKKyAgLy8vIGNyaXRpY2FsLXBhdGggYW5kIHJlc291cmNlIGRlcHRoLgorICBleHRlcm4gY2hhciAmTWFjaGluZUNvbWJpbmVySUQ7CisKKyAgLy8vIFN0YWNrU2xvdENvbG9yaW5nIC0gVGhpcyBwYXNzIHBlcmZvcm1zIHN0YWNrIGNvbG9yaW5nIGFuZCBtZXJnaW5nLgorICAvLy8gSXQgbWVyZ2VzIGRpc2pvaW50IGFsbG9jYXMgdG8gcmVkdWNlIHRoZSBzdGFjayBzaXplLgorICBleHRlcm4gY2hhciAmU3RhY2tDb2xvcmluZ0lEOworCisgIC8vLyBJZkNvbnZlcnRlciAtIFRoaXMgcGFzcyBwZXJmb3JtcyBtYWNoaW5lIGNvZGUgaWYgY29udmVyc2lvbi4KKyAgZXh0ZXJuIGNoYXIgJklmQ29udmVydGVySUQ7CisKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVJZkNvbnZlcnRlcigKKyAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJik+IEZ0b3IpOworCisgIC8vLyBNYWNoaW5lQmxvY2tQbGFjZW1lbnQgLSBUaGlzIHBhc3MgcGxhY2VzIGJhc2ljIGJsb2NrcyBiYXNlZCBvbiBicmFuY2gKKyAgLy8vIHByb2JhYmlsaXRpZXMuCisgIGV4dGVybiBjaGFyICZNYWNoaW5lQmxvY2tQbGFjZW1lbnRJRDsKKworICAvLy8gTWFjaGluZUJsb2NrUGxhY2VtZW50U3RhdHMgLSBUaGlzIHBhc3MgY29sbGVjdHMgc3RhdGlzdGljcyBhYm91dCB0aGUKKyAgLy8vIGJhc2ljIGJsb2NrIHBsYWNlbWVudCB1c2luZyBicmFuY2ggcHJvYmFiaWxpdGllcyBhbmQgYmxvY2sgZnJlcXVlbmN5CisgIC8vLyBpbmZvcm1hdGlvbi4KKyAgZXh0ZXJuIGNoYXIgJk1hY2hpbmVCbG9ja1BsYWNlbWVudFN0YXRzSUQ7CisKKyAgLy8vIEdDTG93ZXJpbmcgUGFzcyAtIFVzZWQgYnkgZ2Mucm9vdCB0byBwZXJmb3JtIGl0cyBkZWZhdWx0IGxvd2VyaW5nCisgIC8vLyBvcGVyYXRpb25zLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZUdDTG93ZXJpbmdQYXNzKCk7CisKKyAgLy8vIFNoYWRvd1N0YWNrR0NMb3dlcmluZyAtIEltcGxlbWVudHMgdGhlIGN1c3RvbSBsb3dlcmluZyBtZWNoYW5pc20KKyAgLy8vIHVzZWQgYnkgdGhlIHNoYWRvdyBzdGFjayBHQy4gIE9ubHkgcnVucyBvbiBmdW5jdGlvbnMgd2hpY2ggb3B0IGluIHRvCisgIC8vLyB0aGUgc2hhZG93IHN0YWNrIGNvbGxlY3Rvci4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVTaGFkb3dTdGFja0dDTG93ZXJpbmdQYXNzKCk7CisKKyAgLy8vIEdDTWFjaGluZUNvZGVBbmFseXNpcyAtIFRhcmdldC1pbmRlcGVuZGVudCBwYXNzIHRvIG1hcmsgc2FmZSBwb2ludHMKKyAgLy8vIGluIG1hY2hpbmUgY29kZS4gTXVzdCBiZSBhZGRlZCB2ZXJ5IGxhdGUgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiwganVzdAorICAvLy8gcHJpb3IgdG8gb3V0cHV0LCBhbmQgaW1wb3J0YW50bHkgYWZ0ZXIgYWxsIENGRyB0cmFuc2Zvcm1hdGlvbnMgKHN1Y2ggYXMKKyAgLy8vIGJyYW5jaCBmb2xkaW5nKS4KKyAgZXh0ZXJuIGNoYXIgJkdDTWFjaGluZUNvZGVBbmFseXNpc0lEOworCisgIC8vLyBDcmVhdGVzIGEgcGFzcyB0byBwcmludCBHQyBtZXRhZGF0YS4KKyAgLy8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlR0NJbmZvUHJpbnRlcihyYXdfb3N0cmVhbSAmT1MpOworCisgIC8vLyBNYWNoaW5lQ1NFIC0gVGhpcyBwYXNzIHBlcmZvcm1zIGdsb2JhbCBDU0Ugb24gbWFjaGluZSBpbnN0cnVjdGlvbnMuCisgIGV4dGVybiBjaGFyICZNYWNoaW5lQ1NFSUQ7CisKKyAgLy8vIEltcGxpY2l0TnVsbENoZWNrcyAtIFRoaXMgcGFzcyBmb2xkcyBudWxsIHBvaW50ZXIgY2hlY2tzIGludG8gbmVhcmJ5CisgIC8vLyBtZW1vcnkgb3BlcmF0aW9ucy4KKyAgZXh0ZXJuIGNoYXIgJkltcGxpY2l0TnVsbENoZWNrc0lEOworCisgIC8vLyBUaGlzIHBhc3MgcGVyZm9ybXMgbG9vcCBpbnZhcmlhbnQgY29kZSBtb3Rpb24gb24gbWFjaGluZSBpbnN0cnVjdGlvbnMuCisgIGV4dGVybiBjaGFyICZNYWNoaW5lTElDTUlEOworCisgIC8vLyBUaGlzIHBhc3MgcGVyZm9ybXMgbG9vcCBpbnZhcmlhbnQgY29kZSBtb3Rpb24gb24gbWFjaGluZSBpbnN0cnVjdGlvbnMuCisgIC8vLyBUaGlzIHZhcmlhbnQgd29ya3MgYmVmb3JlIHJlZ2lzdGVyIGFsbG9jYXRpb24uIFxzZWUgTWFjaGluZUxJQ01JRC4KKyAgZXh0ZXJuIGNoYXIgJkVhcmx5TWFjaGluZUxJQ01JRDsKKworICAvLy8gTWFjaGluZVNpbmtpbmcgLSBUaGlzIHBhc3MgcGVyZm9ybXMgc2lua2luZyBvbiBtYWNoaW5lIGluc3RydWN0aW9ucy4KKyAgZXh0ZXJuIGNoYXIgJk1hY2hpbmVTaW5raW5nSUQ7CisKKyAgLy8vIE1hY2hpbmVDb3B5UHJvcGFnYXRpb24gLSBUaGlzIHBhc3MgcGVyZm9ybXMgY29weSBwcm9wYWdhdGlvbiBvbgorICAvLy8gbWFjaGluZSBpbnN0cnVjdGlvbnMuCisgIGV4dGVybiBjaGFyICZNYWNoaW5lQ29weVByb3BhZ2F0aW9uSUQ7CisKKyAgLy8vIFBlZXBob2xlT3B0aW1pemVyIC0gVGhpcyBwYXNzIHBlcmZvcm1zIHBlZXBob2xlIG9wdGltaXphdGlvbnMgLQorICAvLy8gbGlrZSBleHRlbnNpb24gYW5kIGNvbXBhcmlzb24gZWxpbWluYXRpb25zLgorICBleHRlcm4gY2hhciAmUGVlcGhvbGVPcHRpbWl6ZXJJRDsKKworICAvLy8gT3B0aW1pemVQSElzIC0gVGhpcyBwYXNzIG9wdGltaXplcyBtYWNoaW5lIGluc3RydWN0aW9uIFBISXMKKyAgLy8vIHRvIHRha2UgYWR2YW50YWdlIG9mIG9wcG9ydHVuaXRpZXMgY3JlYXRlZCBkdXJpbmcgREFHIGxlZ2FsaXphdGlvbi4KKyAgZXh0ZXJuIGNoYXIgJk9wdGltaXplUEhJc0lEOworCisgIC8vLyBTdGFja1Nsb3RDb2xvcmluZyAtIFRoaXMgcGFzcyBwZXJmb3JtcyBzdGFjayBzbG90IGNvbG9yaW5nLgorICBleHRlcm4gY2hhciAmU3RhY2tTbG90Q29sb3JpbmdJRDsKKworICAvLy8gXGJyaWVmIFRoaXMgcGFzcyBsYXlzIG91dCBmdW5jbGV0cyBjb250aWd1b3VzbHkuCisgIGV4dGVybiBjaGFyICZGdW5jbGV0TGF5b3V0SUQ7CisKKyAgLy8vIFRoaXMgcGFzcyBpbnNlcnRzIHRoZSBYUmF5IGluc3RydW1lbnRhdGlvbiBzbGVkcyBpZiB0aGV5IGFyZSBzdXBwb3J0ZWQgYnkKKyAgLy8vIHRoZSB0YXJnZXQgcGxhdGZvcm0uCisgIGV4dGVybiBjaGFyICZYUmF5SW5zdHJ1bWVudGF0aW9uSUQ7CisKKyAgLy8vIFRoaXMgcGFzcyBpbnNlcnRzIEZFbnRyeSBjYWxscworICBleHRlcm4gY2hhciAmRkVudHJ5SW5zZXJ0ZXJJRDsKKworICAvLy8gXGJyaWVmIFRoaXMgcGFzcyBpbXBsZW1lbnRzIHRoZSAicGF0Y2hhYmxlLWZ1bmN0aW9uIiBhdHRyaWJ1dGUuCisgIGV4dGVybiBjaGFyICZQYXRjaGFibGVGdW5jdGlvbklEOworCisgIC8vLyBjcmVhdGVTdGFja1Byb3RlY3RvclBhc3MgLSBUaGlzIHBhc3MgYWRkcyBzdGFjayBwcm90ZWN0b3JzIHRvIGZ1bmN0aW9ucy4KKyAgLy8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlU3RhY2tQcm90ZWN0b3JQYXNzKCk7CisKKyAgLy8vIGNyZWF0ZU1hY2hpbmVWZXJpZmllclBhc3MgLSBUaGlzIHBhc3MgdmVyaWZpZXMgY2VuZXJhdGVkIG1hY2hpbmUgY29kZQorICAvLy8gaW5zdHJ1Y3Rpb25zIGZvciBjb3JyZWN0bmVzcy4KKyAgLy8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlTWFjaGluZVZlcmlmaWVyUGFzcyhjb25zdCBzdGQ6OnN0cmluZyYgQmFubmVyKTsKKworICAvLy8gY3JlYXRlRHdhcmZFSFBhc3MgLSBUaGlzIHBhc3MgbXVsY2hlcyBleGNlcHRpb24gaGFuZGxpbmcgY29kZSBpbnRvIGEgZm9ybQorICAvLy8gYWRhcHRlZCB0byBjb2RlIGdlbmVyYXRpb24uICBSZXF1aXJlZCBpZiB1c2luZyBkd2FyZiBleGNlcHRpb24gaGFuZGxpbmcuCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlRHdhcmZFSFBhc3MoKTsKKworICAvLy8gY3JlYXRlV2luRUhQYXNzIC0gUHJlcGFyZXMgcGVyc29uYWxpdHkgZnVuY3Rpb25zIHVzZWQgYnkgTVNWQyBvbiBXaW5kb3dzLAorICAvLy8gaW4gYWRkaXRpb24gdG8gdGhlIEl0YW5pdW0gTFNEQSBiYXNlZCBwZXJzb25hbGl0aWVzLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZVdpbkVIUGFzcygpOworCisgIC8vLyBjcmVhdGVTakxqRUhQcmVwYXJlUGFzcyAtIFRoaXMgcGFzcyBhZGFwdHMgZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgdG8gdXNlCisgIC8vLyB0aGUgR0NDLXN0eWxlIGJ1aWx0aW4gc2V0am1wL2xvbmdqbXAgKHNqbGopIHRvIGhhbmRsaW5nIEVIIGNvbnRyb2wgZmxvdy4KKyAgLy8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlU2pMakVIUHJlcGFyZVBhc3MoKTsKKworICAvLy8gTG9jYWxTdGFja1Nsb3RBbGxvY2F0aW9uIC0gVGhpcyBwYXNzIGFzc2lnbnMgbG9jYWwgZnJhbWUgaW5kaWNlcyB0byBzdGFjaworICAvLy8gc2xvdHMgcmVsYXRpdmUgdG8gb25lIGFub3RoZXIgYW5kIGFsbG9jYXRlcyBiYXNlIHJlZ2lzdGVycyB0byBhY2Nlc3MgdGhlbQorICAvLy8gd2hlbiBpdCBpcyBlc3RpbWF0ZWQgYnkgdGhlIHRhcmdldCB0byBiZSBvdXQgb2YgcmFuZ2Ugb2Ygbm9ybWFsIGZyYW1lCisgIC8vLyBwb2ludGVyIG9yIHN0YWNrIHBvaW50ZXIgaW5kZXggYWRkcmVzc2luZy4KKyAgZXh0ZXJuIGNoYXIgJkxvY2FsU3RhY2tTbG90QWxsb2NhdGlvbklEOworCisgIC8vLyBFeHBhbmRJU2VsUHNldWRvcyAtIFRoaXMgcGFzcyBleHBhbmRzIHBzZXVkby1pbnN0cnVjdGlvbnMuCisgIGV4dGVybiBjaGFyICZFeHBhbmRJU2VsUHNldWRvc0lEOworCisgIC8vLyBVbnBhY2tNYWNoaW5lQnVuZGxlcyAtIFRoaXMgcGFzcyB1bnBhY2sgbWFjaGluZSBpbnN0cnVjdGlvbiBidW5kbGVzLgorICBleHRlcm4gY2hhciAmVW5wYWNrTWFjaGluZUJ1bmRsZXNJRDsKKworICBGdW5jdGlvblBhc3MgKgorICBjcmVhdGVVbnBhY2tNYWNoaW5lQnVuZGxlcyhzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgTWFjaGluZUZ1bmN0aW9uICYpPiBGdG9yKTsKKworICAvLy8gRmluYWxpemVNYWNoaW5lQnVuZGxlcyAtIFRoaXMgcGFzcyBmaW5hbGl6ZSBtYWNoaW5lIGluc3RydWN0aW9uCisgIC8vLyBidW5kbGVzIChjcmVhdGVkIGVhcmxpZXIsIGUuZy4gZHVyaW5nIHByZS1SQSBzY2hlZHVsaW5nKS4KKyAgZXh0ZXJuIGNoYXIgJkZpbmFsaXplTWFjaGluZUJ1bmRsZXNJRDsKKworICAvLy8gU3RhY2tNYXBMaXZlbmVzcyAtIFRoaXMgcGFzcyBhbmFseXNlcyB0aGUgcmVnaXN0ZXIgbGl2ZS1vdXQgc2V0IG9mCisgIC8vLyBzdGFja21hcC9wYXRjaHBvaW50IGludHJpbnNpY3MgYW5kIGF0dGFjaGVzIHRoZSBjYWxjdWxhdGVkIGluZm9ybWF0aW9uIHRvCisgIC8vLyB0aGUgaW50cmluc2ljIGZvciBsYXRlciBlbWlzc2lvbiB0byB0aGUgU3RhY2tNYXAuCisgIGV4dGVybiBjaGFyICZTdGFja01hcExpdmVuZXNzSUQ7CisKKyAgLy8vIExpdmVEZWJ1Z1ZhbHVlcyBwYXNzCisgIGV4dGVybiBjaGFyICZMaXZlRGVidWdWYWx1ZXNJRDsKKworICAvLy8gY3JlYXRlSnVtcEluc3RyVGFibGVzIC0gVGhpcyBwYXNzIGNyZWF0ZXMganVtcC1pbnN0cnVjdGlvbiB0YWJsZXMuCisgIE1vZHVsZVBhc3MgKmNyZWF0ZUp1bXBJbnN0clRhYmxlc1Bhc3MoKTsKKworICAvLy8gY3JlYXRlRm9yd2FyZENvbnRyb2xGbG93SW50ZWdyaXR5UGFzcyAtIFRoaXMgcGFzcyBhZGRzIGNvbnRyb2wtZmxvdworICAvLy8gaW50ZWdyaXR5LgorICBNb2R1bGVQYXNzICpjcmVhdGVGb3J3YXJkQ29udHJvbEZsb3dJbnRlZ3JpdHlQYXNzKCk7CisKKyAgLy8vIEludGVybGVhdmVkQWNjZXNzIFBhc3MgLSBUaGlzIHBhc3MgaWRlbnRpZmllcyBhbmQgbWF0Y2hlcyBpbnRlcmxlYXZlZAorICAvLy8gbWVtb3J5IGFjY2Vzc2VzIHRvIHRhcmdldCBzcGVjaWZpYyBpbnRyaW5zaWNzLgorICAvLy8KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVJbnRlcmxlYXZlZEFjY2Vzc1Bhc3MoKTsKKworICAvLy8gTG93ZXJFbXVUTFMgLSBUaGlzIHBhc3MgZ2VuZXJhdGVzIF9fZW11dGxzX1t2dF0ueHl6IHZhcmlhYmxlcyBmb3IgYWxsCisgIC8vLyBUTFMgdmFyaWFibGVzIGZvciB0aGUgZW11bGF0ZWQgVExTIG1vZGVsLgorICAvLy8KKyAgTW9kdWxlUGFzcyAqY3JlYXRlTG93ZXJFbXVUTFNQYXNzKCk7CisKKyAgLy8vIFRoaXMgcGFzcyBsb3dlcnMgdGhlIEBsbHZtLmxvYWQucmVsYXRpdmUgaW50cmluc2ljIHRvIGluc3RydWN0aW9ucy4KKyAgLy8vIFRoaXMgaXMgdW5zYWZlIHRvIGRvIGVhcmxpZXIgYmVjYXVzZSBhIHBhc3MgbWF5IGNvbWJpbmUgdGhlIGNvbnN0YW50CisgIC8vLyBpbml0aWFsaXplciBpbnRvIHRoZSBsb2FkLCB3aGljaCBtYXkgcmVzdWx0IGluIGFuIG92ZXJmbG93aW5nIGV2YWx1YXRpb24uCisgIE1vZHVsZVBhc3MgKmNyZWF0ZVByZUlTZWxJbnRyaW5zaWNMb3dlcmluZ1Bhc3MoKTsKKworICAvLy8gR2xvYmFsTWVyZ2UgLSBUaGlzIHBhc3MgbWVyZ2VzIGludGVybmFsIChieSBkZWZhdWx0KSBnbG9iYWxzIGludG8gc3RydWN0cworICAvLy8gdG8gZW5hYmxlIHJldXNlIG9mIGEgYmFzZSBwb2ludGVyIGJ5IGluZGV4ZWQgYWRkcmVzc2luZyBtb2Rlcy4KKyAgLy8vIEl0IGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgdG8gZm9jdXMgb24gc2l6ZSBvcHRpbWl6YXRpb25zIG9ubHkuCisgIC8vLworICBQYXNzICpjcmVhdGVHbG9iYWxNZXJnZVBhc3MoY29uc3QgVGFyZ2V0TWFjaGluZSAqVE0sIHVuc2lnbmVkIE1heGltYWxPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9ubHlPcHRpbWl6ZUZvclNpemUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTWVyZ2VFeHRlcm5hbEJ5RGVmYXVsdCA9IGZhbHNlKTsKKworICAvLy8gVGhpcyBwYXNzIHNwbGl0cyB0aGUgc3RhY2sgaW50byBhIHNhZmUgc3RhY2sgYW5kIGFuIHVuc2FmZSBzdGFjayB0bworICAvLy8gcHJvdGVjdCBhZ2FpbnN0IHN0YWNrLWJhc2VkIG92ZXJmbG93IHZ1bG5lcmFiaWxpdGllcy4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVTYWZlU3RhY2tQYXNzKCk7CisKKyAgLy8vIFRoaXMgcGFzcyBkZXRlY3RzIHN1YnJlZ2lzdGVyIGxhbmVzIGluIGEgdmlydHVhbCByZWdpc3RlciB0aGF0IGFyZSB1c2VkCisgIC8vLyBpbmRlcGVuZGVudGx5IG9mIG90aGVyIGxhbmVzIGFuZCBzcGxpdHMgdGhlbSBpbnRvIHNlcGFyYXRlIHZpcnR1YWwKKyAgLy8vIHJlZ2lzdGVycy4KKyAgZXh0ZXJuIGNoYXIgJlJlbmFtZUluZGVwZW5kZW50U3VicmVnc0lEOworCisgIC8vLyBUaGlzIHBhc3MgaXMgZXhlY3V0ZWQgUE9TVC1SQSB0byBjb2xsZWN0IHdoaWNoIHBoeXNpY2FsIHJlZ2lzdGVycyBhcmUKKyAgLy8vIHByZXNlcnZlZCBieSBnaXZlbiBtYWNoaW5lIGZ1bmN0aW9uLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZVJlZ1VzYWdlSW5mb0NvbGxlY3RvcigpOworCisgIC8vLyBSZXR1cm4gYSBNYWNoaW5lRnVuY3Rpb24gcGFzcyB0aGF0IGlkZW50aWZpZXMgY2FsbCBzaXRlcworICAvLy8gYW5kIHByb3BhZ2F0ZXMgcmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24gb2YgY2FsbGVlIHRvIGNhbGxlcgorICAvLy8gaWYgYXZhaWxhYmxlIHdpdGggUHlzaWNhbFJlZ2lzdGVyVXNhZ2VJbmZvIHBhc3MuCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlUmVnVXNhZ2VJbmZvUHJvcFBhc3MoKTsKKworICAvLy8gVGhpcyBwYXNzIHBlcmZvcm1zIHNvZnR3YXJlIHBpcGVsaW5pbmcgb24gbWFjaGluZSBpbnN0cnVjdGlvbnMuCisgIGV4dGVybiBjaGFyICZNYWNoaW5lUGlwZWxpbmVySUQ7CisKKyAgLy8vIFRoaXMgcGFzcyBmcmVlcyB0aGUgbWVtb3J5IG9jY3VwaWVkIGJ5IHRoZSBNYWNoaW5lRnVuY3Rpb24uCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlRnJlZU1hY2hpbmVGdW5jdGlvblBhc3MoKTsKKworICAvLy8gVGhpcyBwYXNzIHBlcmZvcm1zIG91dGxpbmluZyBvbiBtYWNoaW5lIGluc3RydWN0aW9ucyBkaXJlY3RseSBiZWZvcmUKKyAgLy8vIHByaW50aW5nIGFzc2VtYmx5LgorICBNb2R1bGVQYXNzICpjcmVhdGVNYWNoaW5lT3V0bGluZXJQYXNzKGJvb2wgT3V0bGluZUZyb21MaW5rT25jZU9EUnMgPSBmYWxzZSk7CisKKyAgLy8vIFRoaXMgcGFzcyBleHBhbmRzIHRoZSBleHBlcmltZW50YWwgcmVkdWN0aW9uIGludHJpbnNpY3MgaW50byBzZXF1ZW5jZXMgb2YKKyAgLy8vIHNodWZmbGVzLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZUV4cGFuZFJlZHVjdGlvbnNQYXNzKCk7CisKKyAgLy8gVGhpcyBwYXNzIGV4cGFuZHMgbWVtY21wKCkgdG8gbG9hZC9zdG9yZXMuCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlRXhwYW5kTWVtQ21wUGFzcygpOworCisgIC8vLyBDcmVhdGVzIEJyZWFrIEZhbHNlIERlcGVuZGVuY2llcyBwYXNzLiBcc2VlIEJyZWFrRmFsc2VEZXBzLmNwcAorICBGdW5jdGlvblBhc3MgKmNyZWF0ZUJyZWFrRmFsc2VEZXBzKCk7CisKKyAgLy8gVGhpcyBwYXNzIGV4cGFuZHMgaW5kaXJlY3RiciBpbnN0cnVjdGlvbnMuCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlSW5kaXJlY3RCckV4cGFuZFBhc3MoKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUHJlSVNlbEludHJpbnNpY0xvd2VyaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUHJlSVNlbEludHJpbnNpY0xvd2VyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EwMDdlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QcmVJU2VsSW50cmluc2ljTG93ZXJpbmcuaApAQCAtMCwwICsxLDI5IEBACisvLz09PS0gUHJlSVNlbEludHJpbnNpY0xvd2VyaW5nLmggLSBQcmUtSVNlbCBpbnRyaW5zaWMgbG93ZXJpbmcgcGFzcyAtLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBpbXBsZW1lbnRzIElSIGxvd2VyaW5nIGZvciB0aGUgbGx2bS5sb2FkLnJlbGF0aXZlIGludHJpbnNpYy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX0NPREVHRU5fUFJFSVNFTElOVFJJTlNJQ0xPV0VSSU5HX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1BSRUlTRUxJTlRSSU5TSUNMT1dFUklOR19ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTW9kdWxlOworCitzdHJ1Y3QgUHJlSVNlbEludHJpbnNpY0xvd2VyaW5nUGFzcworICAgIDogUGFzc0luZm9NaXhpbjxQcmVJU2VsSW50cmluc2ljTG93ZXJpbmdQYXNzPiB7CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9QUkVJU0VMSU5UUklOU0lDTE9XRVJJTkdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1BzZXVkb1NvdXJjZVZhbHVlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGYwYmI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1BzZXVkb1NvdXJjZVZhbHVlLmgKQEAgLTAsMCArMSwxOTggQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL1BzZXVkb1NvdXJjZVZhbHVlLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgUHNldWRvU291cmNlVmFsdWUgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fUFNFVURPU09VUkNFVkFMVUVfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUFNFVURPU09VUkNFVkFMVUVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9JUi9HbG9iYWxWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlTWFwLmgiCisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVGcmFtZUluZm87CitjbGFzcyBNYWNoaW5lTWVtT3BlcmFuZDsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworCityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1hY2hpbmVNZW1PcGVyYW5kICZNTU8pOworY2xhc3MgUHNldWRvU291cmNlVmFsdWU7CityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlKiBQU1YpOworCisvLy8gU3BlY2lhbCB2YWx1ZSBzdXBwbGllZCBmb3IgbWFjaGluZSBsZXZlbCBhbGlhcyBhbmFseXNpcy4gSXQgaW5kaWNhdGVzIHRoYXQKKy8vLyBhIG1lbW9yeSBhY2Nlc3MgcmVmZXJlbmNlcyB0aGUgZnVuY3Rpb25zIHN0YWNrIGZyYW1lIChlLmcuLCBhIHNwaWxsIHNsb3QpLAorLy8vIGJlbG93IHRoZSBzdGFjayBmcmFtZSAoZS5nLiwgYXJndW1lbnQgc3BhY2UpLCBvciBjb25zdGFudCBwb29sLgorY2xhc3MgUHNldWRvU291cmNlVmFsdWUgeworcHVibGljOgorICBlbnVtIFBTVktpbmQgeworICAgIFN0YWNrLAorICAgIEdPVCwKKyAgICBKdW1wVGFibGUsCisgICAgQ29uc3RhbnRQb29sLAorICAgIEZpeGVkU3RhY2ssCisgICAgR2xvYmFsVmFsdWVDYWxsRW50cnksCisgICAgRXh0ZXJuYWxTeW1ib2xDYWxsRW50cnksCisgICAgVGFyZ2V0Q3VzdG9tCisgIH07CisKK3ByaXZhdGU6CisgIFBTVktpbmQgS2luZDsKKyAgdW5zaWduZWQgQWRkcmVzc1NwYWNlOworICBmcmllbmQgcmF3X29zdHJlYW0gJmxsdm06Om9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHNldWRvU291cmNlVmFsdWUqIFBTVik7CisKKyAgZnJpZW5kIGNsYXNzIE1hY2hpbmVNZW1PcGVyYW5kOyAvLyBGb3IgcHJpbnRDdXN0b20oKS4KKworICAvLy8gSW1wbGVtZW50IHByaW50aW5nIGZvciBQc2V1ZG9Tb3VyY2VWYWx1ZS4gVGhpcyBpcyBjYWxsZWQgZnJvbQorICAvLy8gVmFsdWU6OnByaW50IG9yIFZhbHVlJ3Mgb3BlcmF0b3I8PC4KKyAgdmlydHVhbCB2b2lkIHByaW50Q3VzdG9tKHJhd19vc3RyZWFtICZPKSBjb25zdDsKKworcHVibGljOgorICBleHBsaWNpdCBQc2V1ZG9Tb3VyY2VWYWx1ZShQU1ZLaW5kIEtpbmQsIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJKTsKKworICB2aXJ0dWFsIH5Qc2V1ZG9Tb3VyY2VWYWx1ZSgpOworCisgIFBTVktpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICBib29sIGlzU3RhY2soKSBjb25zdCB7IHJldHVybiBLaW5kID09IFN0YWNrOyB9CisgIGJvb2wgaXNHT1QoKSBjb25zdCB7IHJldHVybiBLaW5kID09IEdPVDsgfQorICBib29sIGlzQ29uc3RhbnRQb29sKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBDb25zdGFudFBvb2w7IH0KKyAgYm9vbCBpc0p1bXBUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gSnVtcFRhYmxlOyB9CisKKyAgdW5zaWduZWQgZ2V0QWRkcmVzc1NwYWNlKCkgY29uc3QgeyByZXR1cm4gQWRkcmVzc1NwYWNlOyB9CisKKyAgdW5zaWduZWQgZ2V0VGFyZ2V0Q3VzdG9tKCkgY29uc3QgeworICAgIHJldHVybiAoS2luZCA+PSBUYXJnZXRDdXN0b20pID8gKChLaW5kKzEpIC0gVGFyZ2V0Q3VzdG9tKSA6IDA7CisgIH0KKworICAvLy8gVGVzdCB3aGV0aGVyIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSB0aGlzIFBzZXVkb1NvdXJjZVZhbHVlIGhhcyBhCisgIC8vLyBjb25zdGFudCB2YWx1ZS4KKyAgdmlydHVhbCBib29sIGlzQ29uc3RhbnQoY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqKSBjb25zdDsKKworICAvLy8gVGVzdCB3aGV0aGVyIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSB0aGlzIFBzZXVkb1NvdXJjZVZhbHVlIG1heSBhbHNvIGJlCisgIC8vLyBwb2ludGVkIHRvIGJ5IGFuIExMVk0gSVIgVmFsdWUuCisgIHZpcnR1YWwgYm9vbCBpc0FsaWFzZWQoY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IHRoaXMgUHNldWRvU291cmNlVmFsdWUgY2FuIGV2ZXIKKyAgLy8vIGFsaWFzIGFuIExMVk0gSVIgVmFsdWUuCisgIHZpcnR1YWwgYm9vbCBtYXlBbGlhcyhjb25zdCBNYWNoaW5lRnJhbWVJbmZvICopIGNvbnN0OworfTsKKworLy8vIEEgc3BlY2lhbGl6ZWQgUHNldWRvU291cmNlVmFsdWUgZm9yIGhvbGRpbmcgRml4ZWRTdGFjayB2YWx1ZXMsIHdoaWNoIG11c3QKKy8vLyBpbmNsdWRlIGEgZnJhbWUgaW5kZXguCitjbGFzcyBGaXhlZFN0YWNrUHNldWRvU291cmNlVmFsdWUgOiBwdWJsaWMgUHNldWRvU291cmNlVmFsdWUgeworICBjb25zdCBpbnQgRkk7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgRml4ZWRTdGFja1BzZXVkb1NvdXJjZVZhbHVlKGludCBGSSwgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUkpCisgICAgICA6IFBzZXVkb1NvdXJjZVZhbHVlKEZpeGVkU3RhY2ssIFRJSSksIEZJKEZJKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgUHNldWRvU291cmNlVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+a2luZCgpID09IEZpeGVkU3RhY2s7CisgIH0KKworICBib29sIGlzQ29uc3RhbnQoY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqTUZJKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIGlzQWxpYXNlZChjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgbWF5QWxpYXMoY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIHByaW50Q3VzdG9tKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgaW50IGdldEZyYW1lSW5kZXgoKSBjb25zdCB7IHJldHVybiBGSTsgfQorfTsKKworY2xhc3MgQ2FsbEVudHJ5UHNldWRvU291cmNlVmFsdWUgOiBwdWJsaWMgUHNldWRvU291cmNlVmFsdWUgeworcHJvdGVjdGVkOgorICBDYWxsRW50cnlQc2V1ZG9Tb3VyY2VWYWx1ZShQU1ZLaW5kIEtpbmQsIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJKTsKKworcHVibGljOgorICBib29sIGlzQ29uc3RhbnQoY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0FsaWFzZWQoY29uc3QgTWFjaGluZUZyYW1lSW5mbyAqKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBtYXlBbGlhcyhjb25zdCBNYWNoaW5lRnJhbWVJbmZvICopIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vIEEgc3BlY2lhbGl6ZWQgcHNldWRvIHNvcnVjZSB2YWx1ZSBmb3IgaG9sZGluZyBHbG9iYWxWYWx1ZSB2YWx1ZXMuCitjbGFzcyBHbG9iYWxWYWx1ZVBzZXVkb1NvdXJjZVZhbHVlIDogcHVibGljIENhbGxFbnRyeVBzZXVkb1NvdXJjZVZhbHVlIHsKKyAgY29uc3QgR2xvYmFsVmFsdWUgKkdWOworCitwdWJsaWM6CisgIEdsb2JhbFZhbHVlUHNldWRvU291cmNlVmFsdWUoY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmtpbmQoKSA9PSBHbG9iYWxWYWx1ZUNhbGxFbnRyeTsKKyAgfQorCisgIGNvbnN0IEdsb2JhbFZhbHVlICpnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIEdWOyB9Cit9OworCisvLy8gQSBzcGVjaWFsaXplZCBwc2V1ZG8gc291cmNlIHZhbHVlIGZvciBob2xkaW5nIGV4dGVybmFsIHN5bWJvbCB2YWx1ZXMuCitjbGFzcyBFeHRlcm5hbFN5bWJvbFBzZXVkb1NvdXJjZVZhbHVlIDogcHVibGljIENhbGxFbnRyeVBzZXVkb1NvdXJjZVZhbHVlIHsKKyAgY29uc3QgY2hhciAqRVM7CisKK3B1YmxpYzoKKyAgRXh0ZXJuYWxTeW1ib2xQc2V1ZG9Tb3VyY2VWYWx1ZShjb25zdCBjaGFyICpFUywgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUkpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgUHNldWRvU291cmNlVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+a2luZCgpID09IEV4dGVybmFsU3ltYm9sQ2FsbEVudHJ5OworICB9CisKKyAgY29uc3QgY2hhciAqZ2V0U3ltYm9sKCkgY29uc3QgeyByZXR1cm4gRVM7IH0KK307CisKKy8vLyBNYW5hZ2VzIGNyZWF0aW9uIG9mIHBzZXVkbyBzb3VyY2UgdmFsdWVzLgorY2xhc3MgUHNldWRvU291cmNlVmFsdWVNYW5hZ2VyIHsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUk7CisgIGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlIFN0YWNrUFNWLCBHT1RQU1YsIEp1bXBUYWJsZVBTViwgQ29uc3RhbnRQb29sUFNWOworICBzdGQ6Om1hcDxpbnQsIHN0ZDo6dW5pcXVlX3B0cjxGaXhlZFN0YWNrUHNldWRvU291cmNlVmFsdWU+PiBGU1ZhbHVlczsKKyAgU3RyaW5nTWFwPHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBFeHRlcm5hbFN5bWJvbFBzZXVkb1NvdXJjZVZhbHVlPj4KKyAgICAgIEV4dGVybmFsQ2FsbEVudHJpZXM7CisgIFZhbHVlTWFwPGNvbnN0IEdsb2JhbFZhbHVlICosCisgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBHbG9iYWxWYWx1ZVBzZXVkb1NvdXJjZVZhbHVlPj4KKyAgICAgIEdsb2JhbENhbGxFbnRyaWVzOworCitwdWJsaWM6CisgIFBzZXVkb1NvdXJjZVZhbHVlTWFuYWdlcihjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSSk7CisKKyAgLy8vIFJldHVybiBhIHBzZXVkbyBzb3VyY2UgdmFsdWUgcmVmZXJlbmNpbmcgdGhlIGFyZWEgYmVsb3cgdGhlIHN0YWNrIGZyYW1lIG9mCisgIC8vLyBhIGZ1bmN0aW9uLCBlLmcuLCB0aGUgYXJndW1lbnQgc3BhY2UuCisgIGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlICpnZXRTdGFjaygpOworCisgIC8vLyBSZXR1cm4gYSBwc2V1ZG8gc291cmNlIHZhbHVlIHJlZmVyZW5jaW5nIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlCisgIC8vLyAob3Igc29tZXRoaW5nIHRoZSBsaWtlKS4KKyAgY29uc3QgUHNldWRvU291cmNlVmFsdWUgKmdldEdPVCgpOworCisgIC8vLyBSZXR1cm4gYSBwc2V1ZG8gc291cmNlIHZhbHVlIHJlZmVyZW5jaW5nIHRoZSBjb25zdGFudCBwb29sLiBTaW5jZSBjb25zdGFudAorICAvLy8gcG9vbHMgYXJlIGNvbnN0YW50LCB0aGlzIGRvZXNuJ3QgbmVlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIGNvbnN0YW50CisgIC8vLyBwb29sIGVudHJ5LgorICBjb25zdCBQc2V1ZG9Tb3VyY2VWYWx1ZSAqZ2V0Q29uc3RhbnRQb29sKCk7CisKKyAgLy8vIFJldHVybiBhIHBzZXVkbyBzb3VyY2UgdmFsdWUgcmVmZXJlbmNpbmcgYSBqdW1wIHRhYmxlLiBTaW5jZSBqdW1wIHRhYmxlcworICAvLy8gYXJlIGNvbnN0YW50LCB0aGlzIGRvZXNuJ3QgbmVlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIGp1bXAgdGFibGUuCisgIGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlICpnZXRKdW1wVGFibGUoKTsKKworICAvLy8gUmV0dXJuIGEgcHNldWRvIHNvdXJjZSB2YWx1ZSByZWZlcmVuY2luZyBhIGZpeGVkIHN0YWNrIGZyYW1lIGVudHJ5LAorICAvLy8gZS5nLiwgYSBzcGlsbCBzbG90LgorICBjb25zdCBQc2V1ZG9Tb3VyY2VWYWx1ZSAqZ2V0Rml4ZWRTdGFjayhpbnQgRkkpOworCisgIGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlICpnZXRHbG9iYWxWYWx1ZUNhbGxFbnRyeShjb25zdCBHbG9iYWxWYWx1ZSAqR1YpOworCisgIGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlICpnZXRFeHRlcm5hbFN5bWJvbENhbGxFbnRyeShjb25zdCBjaGFyICpFUyk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWFjaGluZ0RlZkFuYWx5c2lzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVhY2hpbmdEZWZBbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMWI3NDUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVhY2hpbmdEZWZBbmFseXNpcy5oCkBAIC0wLDAgKzEsMTE4IEBACisvLz09LS0tIGxsdm0vQ29kZUdlbi9SZWFjaGluZ0RlZkFuYWx5c2lzLmggLSBSZWFjaGluZyBEZWYgQW5hbHlzaXMgLSotIEMrKyAtKi0tLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUgUmVhY2hpbmcgRGVmcyBBbmFseXNpcyBwYXNzLgorLy8vCisvLy8gVGhpcyBwYXNzIHRyYWNrcyBmb3IgZWFjaCBpbnN0cnVjdGlvbiB3aGF0IGlzIHRoZSCTY2xvc2VzdJQgcmVhY2hpbmcgZGVmIG9mCisvLy8gYSBnaXZlbiByZWdpc3Rlci4gSXQgaXMgdXNlZCBieSBCcmVha0ZhbHNlRGVwcyAoZm9yIGNsZWFyYW5jZSBjYWxjdWxhdGlvbikKKy8vLyBhbmQgRXhlY3V0aW9uRG9tYWluRml4IChmb3IgYXJiaXRyYXRpbmcgY29uZmxpY3RpbmcgZG9tYWlucykuCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgdXN1YWwgZGVmaW5pdGlvbiBub3Rpb24gb2YgbGl2ZW5lc3MuCisvLy8gVGhlIENQVSBkb2Vzbid0IGNhcmUgd2hldGhlciBvciBub3Qgd2UgY29uc2lkZXIgYSByZWdpc3RlciBraWxsZWQuCisvLy8KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9SRUFDSElOR0RFRlNBTkFMWVNJU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9SRUFDSElOR0RFRlNBTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xvb3BUcmF2ZXJzYWwuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUluc3RyOworCisvLy8gVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgcmVhY2hpbmcgZGVmIGFuYWx5c2lzLgorY2xhc3MgUmVhY2hpbmdEZWZBbmFseXNpcyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKK3ByaXZhdGU6CisgIE1hY2hpbmVGdW5jdGlvbiAqTUY7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJOworICB1bnNpZ25lZCBOdW1SZWdVbml0czsKKyAgLy8vIEluc3RydWN0aW9uIHRoYXQgZGVmaW5lZCBlYWNoIHJlZ2lzdGVyLCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAvLy8gY3VycmVudCBiYXNpYyBibG9jay4gIFdoZW4gYSBMaXZlUmVnc0RlZkluZm8gaXMgdXNlZCB0byByZXByZXNlbnQgYQorICAvLy8gbGl2ZS1vdXQgcmVnaXN0ZXIsIHRoaXMgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgYmFzaWMgYmxvY2ssCisgIC8vLyBzbyBpdCB3aWxsIGJlIGEgbmVnYXRpdmUgbnVtYmVyLgorICB1c2luZyBMaXZlUmVnc0RlZkluZm8gPSBzdGQ6OnZlY3RvcjxpbnQ+OworICBMaXZlUmVnc0RlZkluZm8gTGl2ZVJlZ3M7CisKKyAgLy8vIEtlZXBzIGNsZWFyYW5jZSBpbmZvcm1hdGlvbiBmb3IgYWxsIHJlZ2lzdGVycy4gTm90ZSB0aGF0IHRoaXMKKyAgLy8vIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB1c3VhbCBkZWZpbml0aW9uIG5vdGlvbiBvZiBsaXZlbmVzcy4gVGhlIENQVQorICAvLy8gZG9lc24ndCBjYXJlIHdoZXRoZXIgb3Igbm90IHdlIGNvbnNpZGVyIGEgcmVnaXN0ZXIga2lsbGVkLgorICB1c2luZyBPdXRSZWdzSW5mb01hcCA9IFNtYWxsVmVjdG9yPExpdmVSZWdzRGVmSW5mbywgND47CisgIE91dFJlZ3NJbmZvTWFwIE1CQk91dFJlZ3NJbmZvczsKKworICAvLy8gQ3VycmVudCBpbnN0cnVjdGlvbiBudW1iZXIuCisgIC8vLyBUaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gZWFjaCBiYXNpYyBibG9jayBpcyAwLgorICBpbnQgQ3VySW5zdHI7CisKKyAgLy8vIE1hcHMgaW5zdHJ1Y3Rpb25zIHRvIHRoZWlyIGluc3RydWN0aW9uIElkcywgcmVsYXRpdmUgdG8gdGhlIGJlZ2luaW5nIG9mCisgIC8vLyB0aGVpciBiYXNpYyBibG9ja3MuCisgIERlbnNlTWFwPE1hY2hpbmVJbnN0ciAqLCBpbnQ+IEluc3RJZHM7CisKKyAgLy8vIEFsbCByZWFjaGluZyBkZWZzIG9mIGEgZ2l2ZW4gUmVnVW5pdCBmb3IgYSBnaXZlbiBNQkIuCisgIHVzaW5nIE1CQlJlZ1VuaXREZWZzID0gU21hbGxWZWN0b3I8aW50LCAxPjsKKyAgLy8vIEFsbCByZWFjaGluZyBkZWZzIG9mIGFsbCByZWcgdW5pdHMgZm9yIGEgZ2l2ZW4gTUJCCisgIHVzaW5nIE1CQkRlZnNJbmZvID0gc3RkOjp2ZWN0b3I8TUJCUmVnVW5pdERlZnM+OworICAvLy8gQWxsIHJlYWNoaW5nIGRlZnMgb2YgYWxsIHJlZyB1bml0cyBmb3IgYSBhbGwgTUJCcworICB1c2luZyBNQkJSZWFjaGluZ0RlZnNJbmZvID0gU21hbGxWZWN0b3I8TUJCRGVmc0luZm8sIDQ+OworICBNQkJSZWFjaGluZ0RlZnNJbmZvIE1CQlJlYWNoaW5nRGVmczsKKworICAvLy8gRGVmYXVsdCB2YWx1ZXMgYXJlICdub3RoaW5nIGhhcHBlbmVkIGEgbG9uZyB0aW1lIGFnbycuCisgIGNvbnN0IGludCBSZWFjaGluZ0RlZkRlZmF1bHRWYWwgPSAtKDEgPDwgMjApOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisKKyAgUmVhY2hpbmdEZWZBbmFseXNpcygpIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCkgeworICAgIGluaXRpYWxpemVSZWFjaGluZ0RlZkFuYWx5c2lzUGFzcygqUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKSk7CisgIH0KKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZSB7CisgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgICAgTWFjaGluZUZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7CisgIH0KKworICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIG92ZXJyaWRlOworCisgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzKCkuc2V0KAorICAgICAgICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzOjpQcm9wZXJ0eTo6Tm9WUmVncyk7CisgIH0KKworICAvLy8gUHJvdmlkZXMgdGhlIGluc3RydWN0aW9uIGlkIG9mIHRoZSBjbG9zZXN0IHJlYWNoaW5nIGRlZiBpbnN0cnVjdGlvbiBvZgorICAvLy8gUGh5c1JlZyB0aGF0IHJlYWNoZXMgTUksIHJlbGF0aXZlIHRvIHRoZSBiZWdpbmluZyBvZiBNSSdzIGJhc2ljIGJsb2NrLgorICBpbnQgZ2V0UmVhY2hpbmdEZWYoTWFjaGluZUluc3RyICpNSSwgaW50IFBoeXNSZWcpOworCisgIC8vLyBQcm92aWRlcyB0aGUgY2xlYXJhbmNlIC0gdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgc2luY2UgdGhlIGNsb3Nlc3QKKyAgLy8vIHJlYWNoaW5nIGRlZiBpbnN0dWN0aW9uIG9mIFBoeXNSZWcgdGhhdCByZWFjaGVzIE1JLgorICBpbnQgZ2V0Q2xlYXJhbmNlKE1hY2hpbmVJbnN0ciAqTUksIE1DUGh5c1JlZyBQaHlzUmVnKTsKKworcHJpdmF0ZToKKyAgLy8vIFNldCB1cCBMaXZlUmVncyBieSBtZXJnaW5nIHByZWRlY2Vzc29yIGxpdmUtb3V0IHZhbHVlcy4KKyAgdm9pZCBlbnRlckJhc2ljQmxvY2soY29uc3QgTG9vcFRyYXZlcnNhbDo6VHJhdmVyc2VkTUJCSW5mbyAmVHJhdmVyc2VkTUJCKTsKKworICAvLy8gVXBkYXRlIGxpdmUtb3V0IHZhbHVlcy4KKyAgdm9pZCBsZWF2ZUJhc2ljQmxvY2soY29uc3QgTG9vcFRyYXZlcnNhbDo6VHJhdmVyc2VkTUJCSW5mbyAmVHJhdmVyc2VkTUJCKTsKKworICAvLy8gUHJvY2VzcyBoZSBnaXZlbiBiYXNpYyBibG9jay4KKyAgdm9pZCBwcm9jZXNzQmFzaWNCbG9jayhjb25zdCBMb29wVHJhdmVyc2FsOjpUcmF2ZXJzZWRNQkJJbmZvICZUcmF2ZXJzZWRNQkIpOworCisgIC8vLyBVcGRhdGUgZGVmLWFnZXMgZm9yIHJlZ2lzdGVycyBkZWZpbmVkIGJ5IE1JLgorICAvLy8gQWxzbyBicmVhayBkZXBlbmRlbmNpZXMgb24gcGFydGlhbCBkZWZzIGFuZCB1bmRlZiB1c2VzLgorICB2b2lkIHByb2Nlc3NEZWZzKE1hY2hpbmVJbnN0ciAqKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9SRUFDSElOR0RFRlNBTkFMWVNJU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVnQWxsb2NQQlFQLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVnQWxsb2NQQlFQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzNDI4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdBbGxvY1BCUVAuaApAQCAtMCwwICsxLDUzNiBAQAorLy89PT0tIFJlZ0FsbG9jUEJRUC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUEJRUEJ1aWxkZXIgaW50ZXJmYWNlLCBmb3IgY2xhc3NlcyB3aGljaCBidWlsZCBQQlFQCisvLyBpbnN0YW5jZXMgdG8gcmVwcmVzZW50IHJlZ2lzdGVyIGFsbG9jYXRpb24gcHJvYmxlbXMsIGFuZCB0aGUgUmVnQWxsb2NQQlFQCisvLyBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fUkVHQUxMT0NQQlFQX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1JFR0FMTE9DUEJRUF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0hhc2hpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUEJRUC9Db3N0QWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1BCUVAvR3JhcGguaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUEJRUC9NYXRoLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1BCUVAvUmVkdWN0aW9uUnVsZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUEJRUC9Tb2x1dGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb25QYXNzOworY2xhc3MgTGl2ZUludGVydmFsczsKK2NsYXNzIE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm87CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIFBCUVAgeworbmFtZXNwYWNlIFJlZ0FsbG9jIHsKKworLy8vIEBicmllZiBTcGlsbCBvcHRpb24gaW5kZXguCitpbmxpbmUgdW5zaWduZWQgZ2V0U3BpbGxPcHRpb25JZHgoKSB7IHJldHVybiAwOyB9CisKKy8vLyBcYnJpZWYgTWV0YWRhdGEgdG8gc3BlZWQgYWxsb2NhdGFiaWxpdHkgdGVzdC4KKy8vLworLy8vIEtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgaW5maW5pdGllcyBpbiBlYWNoIHJvdyBhbmQgY29sdW1uLgorY2xhc3MgTWF0cml4TWV0YWRhdGEgeworcHVibGljOgorICBNYXRyaXhNZXRhZGF0YShjb25zdCBNYXRyaXgmIE0pCisgICAgOiBVbnNhZmVSb3dzKG5ldyBib29sW00uZ2V0Um93cygpIC0gMV0oKSksCisgICAgICBVbnNhZmVDb2xzKG5ldyBib29sW00uZ2V0Q29scygpIC0gMV0oKSkgeworICAgIHVuc2lnbmVkKiBDb2xDb3VudHMgPSBuZXcgdW5zaWduZWRbTS5nZXRDb2xzKCkgLSAxXSgpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IE0uZ2V0Um93cygpOyArK2kpIHsKKyAgICAgIHVuc2lnbmVkIFJvd0NvdW50ID0gMDsKKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDE7IGogPCBNLmdldENvbHMoKTsgKytqKSB7CisgICAgICAgIGlmIChNW2ldW2pdID09IHN0ZDo6bnVtZXJpY19saW1pdHM8UEJRUE51bT46OmluZmluaXR5KCkpIHsKKyAgICAgICAgICArK1Jvd0NvdW50OworICAgICAgICAgICsrQ29sQ291bnRzW2ogLSAxXTsKKyAgICAgICAgICBVbnNhZmVSb3dzW2kgLSAxXSA9IHRydWU7CisgICAgICAgICAgVW5zYWZlQ29sc1tqIC0gMV0gPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBXb3JzdFJvdyA9IHN0ZDo6bWF4KFdvcnN0Um93LCBSb3dDb3VudCk7CisgICAgfQorICAgIHVuc2lnbmVkIFdvcnN0Q29sQ291bnRGb3JDdXJSb3cgPQorICAgICAgKnN0ZDo6bWF4X2VsZW1lbnQoQ29sQ291bnRzLCBDb2xDb3VudHMgKyBNLmdldENvbHMoKSAtIDEpOworICAgIFdvcnN0Q29sID0gc3RkOjptYXgoV29yc3RDb2wsIFdvcnN0Q29sQ291bnRGb3JDdXJSb3cpOworICAgIGRlbGV0ZVtdIENvbENvdW50czsKKyAgfQorCisgIE1hdHJpeE1ldGFkYXRhKGNvbnN0IE1hdHJpeE1ldGFkYXRhICYpID0gZGVsZXRlOworICBNYXRyaXhNZXRhZGF0YSAmb3BlcmF0b3I9KGNvbnN0IE1hdHJpeE1ldGFkYXRhICYpID0gZGVsZXRlOworCisgIHVuc2lnbmVkIGdldFdvcnN0Um93KCkgY29uc3QgeyByZXR1cm4gV29yc3RSb3c7IH0KKyAgdW5zaWduZWQgZ2V0V29yc3RDb2woKSBjb25zdCB7IHJldHVybiBXb3JzdENvbDsgfQorICBjb25zdCBib29sKiBnZXRVbnNhZmVSb3dzKCkgY29uc3QgeyByZXR1cm4gVW5zYWZlUm93cy5nZXQoKTsgfQorICBjb25zdCBib29sKiBnZXRVbnNhZmVDb2xzKCkgY29uc3QgeyByZXR1cm4gVW5zYWZlQ29scy5nZXQoKTsgfQorCitwcml2YXRlOgorICB1bnNpZ25lZCBXb3JzdFJvdyA9IDA7CisgIHVuc2lnbmVkIFdvcnN0Q29sID0gMDsKKyAgc3RkOjp1bmlxdWVfcHRyPGJvb2xbXT4gVW5zYWZlUm93czsKKyAgc3RkOjp1bmlxdWVfcHRyPGJvb2xbXT4gVW5zYWZlQ29sczsKK307CisKKy8vLyBcYnJpZWYgSG9sZHMgYSB2ZWN0b3Igb2YgdGhlIGFsbG93ZWQgcGh5c2ljYWwgcmVncyBmb3IgYSB2cmVnLgorY2xhc3MgQWxsb3dlZFJlZ1ZlY3RvciB7CisgIGZyaWVuZCBoYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBBbGxvd2VkUmVnVmVjdG9yICYpOworCitwdWJsaWM6CisgIEFsbG93ZWRSZWdWZWN0b3IoKSA9IGRlZmF1bHQ7CisgIEFsbG93ZWRSZWdWZWN0b3IoQWxsb3dlZFJlZ1ZlY3RvciAmJikgPSBkZWZhdWx0OworCisgIEFsbG93ZWRSZWdWZWN0b3IoY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZPcHRWZWMpCisgICAgOiBOdW1PcHRzKE9wdFZlYy5zaXplKCkpLCBPcHRzKG5ldyB1bnNpZ25lZFtOdW1PcHRzXSkgeworICAgIHN0ZDo6Y29weShPcHRWZWMuYmVnaW4oKSwgT3B0VmVjLmVuZCgpLCBPcHRzLmdldCgpKTsKKyAgfQorCisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBOdW1PcHRzOyB9CisgIHVuc2lnbmVkIG9wZXJhdG9yW10oc2l6ZV90IEkpIGNvbnN0IHsgcmV0dXJuIE9wdHNbSV07IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQWxsb3dlZFJlZ1ZlY3RvciAmT3RoZXIpIGNvbnN0IHsKKyAgICBpZiAoTnVtT3B0cyAhPSBPdGhlci5OdW1PcHRzKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBzdGQ6OmVxdWFsKE9wdHMuZ2V0KCksIE9wdHMuZ2V0KCkgKyBOdW1PcHRzLCBPdGhlci5PcHRzLmdldCgpKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBbGxvd2VkUmVnVmVjdG9yICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IE90aGVyKTsKKyAgfQorCitwcml2YXRlOgorICB1bnNpZ25lZCBOdW1PcHRzID0gMDsKKyAgc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkW10+IE9wdHM7Cit9OworCitpbmxpbmUgaGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3QgQWxsb3dlZFJlZ1ZlY3RvciAmT3B0UmVncykgeworICB1bnNpZ25lZCAqT1N0YXJ0ID0gT3B0UmVncy5PcHRzLmdldCgpOworICB1bnNpZ25lZCAqT0VuZCA9IE9wdFJlZ3MuT3B0cy5nZXQoKSArIE9wdFJlZ3MuTnVtT3B0czsKKyAgcmV0dXJuIGhhc2hfY29tYmluZShPcHRSZWdzLk51bU9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgaGFzaF9jb21iaW5lX3JhbmdlKE9TdGFydCwgT0VuZCkpOworfQorCisvLy8gXGJyaWVmIEhvbGRzIGdyYXBoLWxldmVsIG1ldGFkYXRhIHJlbGV2YW50IHRvIFBCUVAgUkEgcHJvYmxlbXMuCitjbGFzcyBHcmFwaE1ldGFkYXRhIHsKK3ByaXZhdGU6CisgIHVzaW5nIEFsbG93ZWRSZWdWZWNQb29sID0gVmFsdWVQb29sPEFsbG93ZWRSZWdWZWN0b3I+OworCitwdWJsaWM6CisgIHVzaW5nIEFsbG93ZWRSZWdWZWNSZWYgPSBBbGxvd2VkUmVnVmVjUG9vbDo6UG9vbFJlZjsKKworICBHcmFwaE1ldGFkYXRhKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgTGl2ZUludGVydmFscyAmTElTLAorICAgICAgICAgICAgICAgIE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8gJk1CRkkpCisgICAgOiBNRihNRiksIExJUyhMSVMpLCBNQkZJKE1CRkkpIHt9CisKKyAgTWFjaGluZUZ1bmN0aW9uICZNRjsKKyAgTGl2ZUludGVydmFscyAmTElTOworICBNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvICZNQkZJOworCisgIHZvaWQgc2V0Tm9kZUlkRm9yVlJlZyh1bnNpZ25lZCBWUmVnLCBHcmFwaEJhc2U6Ok5vZGVJZCBOSWQpIHsKKyAgICBWUmVnVG9Ob2RlSWRbVlJlZ10gPSBOSWQ7CisgIH0KKworICBHcmFwaEJhc2U6Ok5vZGVJZCBnZXROb2RlSWRGb3JWUmVnKHVuc2lnbmVkIFZSZWcpIGNvbnN0IHsKKyAgICBhdXRvIFZSZWdJdHIgPSBWUmVnVG9Ob2RlSWQuZmluZChWUmVnKTsKKyAgICBpZiAoVlJlZ0l0ciA9PSBWUmVnVG9Ob2RlSWQuZW5kKCkpCisgICAgICByZXR1cm4gR3JhcGhCYXNlOjppbnZhbGlkTm9kZUlkKCk7CisgICAgcmV0dXJuIFZSZWdJdHItPnNlY29uZDsKKyAgfQorCisgIEFsbG93ZWRSZWdWZWNSZWYgZ2V0QWxsb3dlZFJlZ3MoQWxsb3dlZFJlZ1ZlY3RvciBBbGxvd2VkKSB7CisgICAgcmV0dXJuIEFsbG93ZWRSZWdWZWNzLmdldFZhbHVlKHN0ZDo6bW92ZShBbGxvd2VkKSk7CisgIH0KKworcHJpdmF0ZToKKyAgRGVuc2VNYXA8dW5zaWduZWQsIEdyYXBoQmFzZTo6Tm9kZUlkPiBWUmVnVG9Ob2RlSWQ7CisgIEFsbG93ZWRSZWdWZWNQb29sIEFsbG93ZWRSZWdWZWNzOworfTsKKworLy8vIFxicmllZiBIb2xkcyBzb2x2ZXIgc3RhdGUgYW5kIG90aGVyIG1ldGFkYXRhIHJlbGV2YW50IHRvIGVhY2ggUEJRUCBSQSBub2RlLgorY2xhc3MgTm9kZU1ldGFkYXRhIHsKK3B1YmxpYzoKKyAgdXNpbmcgQWxsb3dlZFJlZ1ZlY3RvciA9IFJlZ0FsbG9jOjpBbGxvd2VkUmVnVmVjdG9yOworCisgIC8vIFRoZSBub2RlJ3MgcmVkdWN0aW9uIHN0YXRlLiBUaGUgb3JkZXIgaW4gdGhpcyBlbnVtIGlzIGltcG9ydGFudCwKKyAgLy8gYXMgaXQgaXMgYXNzdW1lZCBub2RlcyBjYW4gb25seSBwcm9ncmVzcyB1cCAoaS5lLiB0b3dhcmRzIGJlaW5nCisgIC8vIG9wdGltYWxseSByZWR1Y2libGUpIHdoZW4gcmVkdWNpbmcgdGhlIGdyYXBoLgorICB1c2luZyBSZWR1Y3Rpb25TdGF0ZSA9IGVudW0geworICAgIFVucHJvY2Vzc2VkLAorICAgIE5vdFByb3ZhYmx5QWxsb2NhdGFibGUsCisgICAgQ29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZSwKKyAgICBPcHRpbWFsbHlSZWR1Y2libGUKKyAgfTsKKworICBOb2RlTWV0YWRhdGEoKSA9IGRlZmF1bHQ7CisKKyAgTm9kZU1ldGFkYXRhKGNvbnN0IE5vZGVNZXRhZGF0YSAmT3RoZXIpCisgICAgOiBSUyhPdGhlci5SUyksIE51bU9wdHMoT3RoZXIuTnVtT3B0cyksIERlbmllZE9wdHMoT3RoZXIuRGVuaWVkT3B0cyksCisgICAgICBPcHRVbnNhZmVFZGdlcyhuZXcgdW5zaWduZWRbTnVtT3B0c10pLCBWUmVnKE90aGVyLlZSZWcpLAorICAgICAgQWxsb3dlZFJlZ3MoT3RoZXIuQWxsb3dlZFJlZ3MpCisjaWZuZGVmIE5ERUJVRworICAgICAgLCBldmVyQ29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZShPdGhlci5ldmVyQ29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZSkKKyNlbmRpZgorICB7CisgICAgaWYgKE51bU9wdHMgPiAwKSB7CisgICAgICBzdGQ6OmNvcHkoJk90aGVyLk9wdFVuc2FmZUVkZ2VzWzBdLCAmT3RoZXIuT3B0VW5zYWZlRWRnZXNbTnVtT3B0c10sCisgICAgICAgICAgICAgICAgJk9wdFVuc2FmZUVkZ2VzWzBdKTsKKyAgICB9CisgIH0KKworICBOb2RlTWV0YWRhdGEoTm9kZU1ldGFkYXRhICYmKSA9IGRlZmF1bHQ7CisgIE5vZGVNZXRhZGF0YSYgb3BlcmF0b3I9KE5vZGVNZXRhZGF0YSAmJikgPSBkZWZhdWx0OworCisgIHZvaWQgc2V0VlJlZyh1bnNpZ25lZCBWUmVnKSB7IHRoaXMtPlZSZWcgPSBWUmVnOyB9CisgIHVuc2lnbmVkIGdldFZSZWcoKSBjb25zdCB7IHJldHVybiBWUmVnOyB9CisKKyAgdm9pZCBzZXRBbGxvd2VkUmVncyhHcmFwaE1ldGFkYXRhOjpBbGxvd2VkUmVnVmVjUmVmIEFsbG93ZWRSZWdzKSB7CisgICAgdGhpcy0+QWxsb3dlZFJlZ3MgPSBzdGQ6Om1vdmUoQWxsb3dlZFJlZ3MpOworICB9CisgIGNvbnN0IEFsbG93ZWRSZWdWZWN0b3ImIGdldEFsbG93ZWRSZWdzKCkgY29uc3QgeyByZXR1cm4gKkFsbG93ZWRSZWdzOyB9CisKKyAgdm9pZCBzZXR1cChjb25zdCBWZWN0b3ImIENvc3RzKSB7CisgICAgTnVtT3B0cyA9IENvc3RzLmdldExlbmd0aCgpIC0gMTsKKyAgICBPcHRVbnNhZmVFZGdlcyA9IHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZFtdPihuZXcgdW5zaWduZWRbTnVtT3B0c10oKSk7CisgIH0KKworICBSZWR1Y3Rpb25TdGF0ZSBnZXRSZWR1Y3Rpb25TdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIFJTOyB9CisgIHZvaWQgc2V0UmVkdWN0aW9uU3RhdGUoUmVkdWN0aW9uU3RhdGUgUlMpIHsKKyAgICBhc3NlcnQoUlMgPj0gdGhpcy0+UlMgJiYgIkEgbm9kZSdzIHJlZHVjdGlvbiBzdGF0ZSBjYW4gbm90IGJlIGRvd25ncmFkZWQiKTsKKyAgICB0aGlzLT5SUyA9IFJTOworCisjaWZuZGVmIE5ERUJVRworICAgIC8vIFJlbWVtYmVyIHRoaXMgc3RhdGUgdG8gYXNzZXJ0IGxhdGVyIHRoYXQgYSBub24taW5maW5pdGUgcmVnaXN0ZXIKKyAgICAvLyBvcHRpb24gd2FzIGF2YWlsYWJsZS4KKyAgICBpZiAoUlMgPT0gQ29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZSkKKyAgICAgIGV2ZXJDb25zZXJ2YXRpdmVseUFsbG9jYXRhYmxlID0gdHJ1ZTsKKyNlbmRpZgorICB9CisKKyAgdm9pZCBoYW5kbGVBZGRFZGdlKGNvbnN0IE1hdHJpeE1ldGFkYXRhJiBNRCwgYm9vbCBUcmFuc3Bvc2UpIHsKKyAgICBEZW5pZWRPcHRzICs9IFRyYW5zcG9zZSA/IE1ELmdldFdvcnN0Um93KCkgOiBNRC5nZXRXb3JzdENvbCgpOworICAgIGNvbnN0IGJvb2wqIFVuc2FmZU9wdHMgPQorICAgICAgVHJhbnNwb3NlID8gTUQuZ2V0VW5zYWZlQ29scygpIDogTUQuZ2V0VW5zYWZlUm93cygpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1PcHRzOyArK2kpCisgICAgICBPcHRVbnNhZmVFZGdlc1tpXSArPSBVbnNhZmVPcHRzW2ldOworICB9CisKKyAgdm9pZCBoYW5kbGVSZW1vdmVFZGdlKGNvbnN0IE1hdHJpeE1ldGFkYXRhJiBNRCwgYm9vbCBUcmFuc3Bvc2UpIHsKKyAgICBEZW5pZWRPcHRzIC09IFRyYW5zcG9zZSA/IE1ELmdldFdvcnN0Um93KCkgOiBNRC5nZXRXb3JzdENvbCgpOworICAgIGNvbnN0IGJvb2wqIFVuc2FmZU9wdHMgPQorICAgICAgVHJhbnNwb3NlID8gTUQuZ2V0VW5zYWZlQ29scygpIDogTUQuZ2V0VW5zYWZlUm93cygpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1PcHRzOyArK2kpCisgICAgICBPcHRVbnNhZmVFZGdlc1tpXSAtPSBVbnNhZmVPcHRzW2ldOworICB9CisKKyAgYm9vbCBpc0NvbnNlcnZhdGl2ZWx5QWxsb2NhdGFibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIChEZW5pZWRPcHRzIDwgTnVtT3B0cykgfHwKKyAgICAgIChzdGQ6OmZpbmQoJk9wdFVuc2FmZUVkZ2VzWzBdLCAmT3B0VW5zYWZlRWRnZXNbTnVtT3B0c10sIDApICE9CisgICAgICAgJk9wdFVuc2FmZUVkZ2VzW051bU9wdHNdKTsKKyAgfQorCisjaWZuZGVmIE5ERUJVRworICBib29sIHdhc0NvbnNlcnZhdGl2ZWx5QWxsb2NhdGFibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGV2ZXJDb25zZXJ2YXRpdmVseUFsbG9jYXRhYmxlOworICB9CisjZW5kaWYKKworcHJpdmF0ZToKKyAgUmVkdWN0aW9uU3RhdGUgUlMgPSBVbnByb2Nlc3NlZDsKKyAgdW5zaWduZWQgTnVtT3B0cyA9IDA7CisgIHVuc2lnbmVkIERlbmllZE9wdHMgPSAwOworICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWRbXT4gT3B0VW5zYWZlRWRnZXM7CisgIHVuc2lnbmVkIFZSZWcgPSAwOworICBHcmFwaE1ldGFkYXRhOjpBbGxvd2VkUmVnVmVjUmVmIEFsbG93ZWRSZWdzOworCisjaWZuZGVmIE5ERUJVRworICBib29sIGV2ZXJDb25zZXJ2YXRpdmVseUFsbG9jYXRhYmxlID0gZmFsc2U7CisjZW5kaWYKK307CisKK2NsYXNzIFJlZ0FsbG9jU29sdmVySW1wbCB7Citwcml2YXRlOgorICB1c2luZyBSQU1hdHJpeCA9IE1ETWF0cml4PE1hdHJpeE1ldGFkYXRhPjsKKworcHVibGljOgorICB1c2luZyBSYXdWZWN0b3IgPSBQQlFQOjpWZWN0b3I7CisgIHVzaW5nIFJhd01hdHJpeCA9IFBCUVA6Ok1hdHJpeDsKKyAgdXNpbmcgVmVjdG9yID0gUEJRUDo6VmVjdG9yOworICB1c2luZyBNYXRyaXggPSBSQU1hdHJpeDsKKyAgdXNpbmcgQ29zdEFsbG9jYXRvciA9IFBCUVA6OlBvb2xDb3N0QWxsb2NhdG9yPFZlY3RvciwgTWF0cml4PjsKKworICB1c2luZyBOb2RlSWQgPSBHcmFwaEJhc2U6Ok5vZGVJZDsKKyAgdXNpbmcgRWRnZUlkID0gR3JhcGhCYXNlOjpFZGdlSWQ7CisKKyAgdXNpbmcgTm9kZU1ldGFkYXRhID0gUmVnQWxsb2M6Ok5vZGVNZXRhZGF0YTsKKyAgc3RydWN0IEVkZ2VNZXRhZGF0YSB7fTsKKyAgdXNpbmcgR3JhcGhNZXRhZGF0YSA9IFJlZ0FsbG9jOjpHcmFwaE1ldGFkYXRhOworCisgIHVzaW5nIEdyYXBoID0gUEJRUDo6R3JhcGg8UmVnQWxsb2NTb2x2ZXJJbXBsPjsKKworICBSZWdBbGxvY1NvbHZlckltcGwoR3JhcGggJkcpIDogRyhHKSB7fQorCisgIFNvbHV0aW9uIHNvbHZlKCkgeworICAgIEcuc2V0U29sdmVyKCp0aGlzKTsKKyAgICBTb2x1dGlvbiBTOworICAgIHNldHVwKCk7CisgICAgUyA9IGJhY2twcm9wYWdhdGUoRywgcmVkdWNlKCkpOworICAgIEcudW5zZXRTb2x2ZXIoKTsKKyAgICByZXR1cm4gUzsKKyAgfQorCisgIHZvaWQgaGFuZGxlQWRkTm9kZShOb2RlSWQgTklkKSB7CisgICAgYXNzZXJ0KEcuZ2V0Tm9kZUNvc3RzKE5JZCkuZ2V0TGVuZ3RoKCkgPiAxICYmCisgICAgICAgICAgICJQQlFQIEdyYXBoIHNob3VsZCBub3QgY29udGFpbiBzaW5nbGUgb3IgemVyby1vcHRpb24gbm9kZXMiKTsKKyAgICBHLmdldE5vZGVNZXRhZGF0YShOSWQpLnNldHVwKEcuZ2V0Tm9kZUNvc3RzKE5JZCkpOworICB9CisKKyAgdm9pZCBoYW5kbGVSZW1vdmVOb2RlKE5vZGVJZCBOSWQpIHt9CisgIHZvaWQgaGFuZGxlU2V0Tm9kZUNvc3RzKE5vZGVJZCBOSWQsIGNvbnN0IFZlY3RvciYgbmV3Q29zdHMpIHt9CisKKyAgdm9pZCBoYW5kbGVBZGRFZGdlKEVkZ2VJZCBFSWQpIHsKKyAgICBoYW5kbGVSZWNvbm5lY3RFZGdlKEVJZCwgRy5nZXRFZGdlTm9kZTFJZChFSWQpKTsKKyAgICBoYW5kbGVSZWNvbm5lY3RFZGdlKEVJZCwgRy5nZXRFZGdlTm9kZTJJZChFSWQpKTsKKyAgfQorCisgIHZvaWQgaGFuZGxlRGlzY29ubmVjdEVkZ2UoRWRnZUlkIEVJZCwgTm9kZUlkIE5JZCkgeworICAgIE5vZGVNZXRhZGF0YSYgTk1kID0gRy5nZXROb2RlTWV0YWRhdGEoTklkKTsKKyAgICBjb25zdCBNYXRyaXhNZXRhZGF0YSYgTU1kID0gRy5nZXRFZGdlQ29zdHMoRUlkKS5nZXRNZXRhZGF0YSgpOworICAgIE5NZC5oYW5kbGVSZW1vdmVFZGdlKE1NZCwgTklkID09IEcuZ2V0RWRnZU5vZGUySWQoRUlkKSk7CisgICAgcHJvbW90ZShOSWQsIE5NZCk7CisgIH0KKworICB2b2lkIGhhbmRsZVJlY29ubmVjdEVkZ2UoRWRnZUlkIEVJZCwgTm9kZUlkIE5JZCkgeworICAgIE5vZGVNZXRhZGF0YSYgTk1kID0gRy5nZXROb2RlTWV0YWRhdGEoTklkKTsKKyAgICBjb25zdCBNYXRyaXhNZXRhZGF0YSYgTU1kID0gRy5nZXRFZGdlQ29zdHMoRUlkKS5nZXRNZXRhZGF0YSgpOworICAgIE5NZC5oYW5kbGVBZGRFZGdlKE1NZCwgTklkID09IEcuZ2V0RWRnZU5vZGUySWQoRUlkKSk7CisgIH0KKworICB2b2lkIGhhbmRsZVVwZGF0ZUNvc3RzKEVkZ2VJZCBFSWQsIGNvbnN0IE1hdHJpeCYgTmV3Q29zdHMpIHsKKyAgICBOb2RlSWQgTjFJZCA9IEcuZ2V0RWRnZU5vZGUxSWQoRUlkKTsKKyAgICBOb2RlSWQgTjJJZCA9IEcuZ2V0RWRnZU5vZGUySWQoRUlkKTsKKyAgICBOb2RlTWV0YWRhdGEmIE4xTWQgPSBHLmdldE5vZGVNZXRhZGF0YShOMUlkKTsKKyAgICBOb2RlTWV0YWRhdGEmIE4yTWQgPSBHLmdldE5vZGVNZXRhZGF0YShOMklkKTsKKyAgICBib29sIFRyYW5zcG9zZSA9IE4xSWQgIT0gRy5nZXRFZGdlTm9kZTFJZChFSWQpOworCisgICAgLy8gTWV0YWRhdGEgYXJlIGNvbXB1dGVkIGluY3JlbWVudGFsbHkuIEZpcnN0LCB1cGRhdGUgdGhlbQorICAgIC8vIGJ5IHJlbW92aW5nIHRoZSBvbGQgY29zdC4KKyAgICBjb25zdCBNYXRyaXhNZXRhZGF0YSYgT2xkTU1kID0gRy5nZXRFZGdlQ29zdHMoRUlkKS5nZXRNZXRhZGF0YSgpOworICAgIE4xTWQuaGFuZGxlUmVtb3ZlRWRnZShPbGRNTWQsIFRyYW5zcG9zZSk7CisgICAgTjJNZC5oYW5kbGVSZW1vdmVFZGdlKE9sZE1NZCwgIVRyYW5zcG9zZSk7CisKKyAgICAvLyBBbmQgdXBkYXRlIG5vdyB0aGUgbWV0YWRhdGEgd2l0aCB0aGUgbmV3IGNvc3QuCisgICAgY29uc3QgTWF0cml4TWV0YWRhdGEmIE1NZCA9IE5ld0Nvc3RzLmdldE1ldGFkYXRhKCk7CisgICAgTjFNZC5oYW5kbGVBZGRFZGdlKE1NZCwgVHJhbnNwb3NlKTsKKyAgICBOMk1kLmhhbmRsZUFkZEVkZ2UoTU1kLCAhVHJhbnNwb3NlKTsKKworICAgIC8vIEFzIHRoZSBtZXRhZGF0YSBtYXkgaGF2ZSBjaGFuZ2VkIHdpdGggdGhlIHVwZGF0ZSwgdGhlIG5vZGVzIG1heSBoYXZlCisgICAgLy8gYmVjb21lIENvbnNlcnZhdGl2ZWx5QWxsb2NhdGFibGUgb3IgT3B0aW1hbGx5UmVkdWNpYmxlLgorICAgIHByb21vdGUoTjFJZCwgTjFNZCk7CisgICAgcHJvbW90ZShOMklkLCBOMk1kKTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIHByb21vdGUoTm9kZUlkIE5JZCwgTm9kZU1ldGFkYXRhJiBOTWQpIHsKKyAgICBpZiAoRy5nZXROb2RlRGVncmVlKE5JZCkgPT0gMykgeworICAgICAgLy8gVGhpcyBub2RlIGlzIGJlY29taW5nIG9wdGltYWxseSByZWR1Y2libGUuCisgICAgICBtb3ZlVG9PcHRpbWFsbHlSZWR1Y2libGVOb2RlcyhOSWQpOworICAgIH0gZWxzZSBpZiAoTk1kLmdldFJlZHVjdGlvblN0YXRlKCkgPT0KKyAgICAgICAgICAgICAgIE5vZGVNZXRhZGF0YTo6Tm90UHJvdmFibHlBbGxvY2F0YWJsZSAmJgorICAgICAgICAgICAgICAgTk1kLmlzQ29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZSgpKSB7CisgICAgICAvLyBUaGlzIG5vZGUganVzdCBiZWNhbWUgY29uc2VydmF0aXZlbHkgYWxsb2NhdGFibGUuCisgICAgICBtb3ZlVG9Db25zZXJ2YXRpdmVseUFsbG9jYXRhYmxlTm9kZXMoTklkKTsKKyAgICB9CisgIH0KKworICB2b2lkIHJlbW92ZUZyb21DdXJyZW50U2V0KE5vZGVJZCBOSWQpIHsKKyAgICBzd2l0Y2ggKEcuZ2V0Tm9kZU1ldGFkYXRhKE5JZCkuZ2V0UmVkdWN0aW9uU3RhdGUoKSkgeworICAgIGNhc2UgTm9kZU1ldGFkYXRhOjpVbnByb2Nlc3NlZDogYnJlYWs7CisgICAgY2FzZSBOb2RlTWV0YWRhdGE6Ok9wdGltYWxseVJlZHVjaWJsZToKKyAgICAgIGFzc2VydChPcHRpbWFsbHlSZWR1Y2libGVOb2Rlcy5maW5kKE5JZCkgIT0KKyAgICAgICAgICAgICBPcHRpbWFsbHlSZWR1Y2libGVOb2Rlcy5lbmQoKSAmJgorICAgICAgICAgICAgICJOb2RlIG5vdCBpbiBvcHRpbWFsbHkgcmVkdWNpYmxlIHNldC4iKTsKKyAgICAgIE9wdGltYWxseVJlZHVjaWJsZU5vZGVzLmVyYXNlKE5JZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5vZGVNZXRhZGF0YTo6Q29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZToKKyAgICAgIGFzc2VydChDb25zZXJ2YXRpdmVseUFsbG9jYXRhYmxlTm9kZXMuZmluZChOSWQpICE9CisgICAgICAgICAgICAgQ29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZU5vZGVzLmVuZCgpICYmCisgICAgICAgICAgICAgIk5vZGUgbm90IGluIGNvbnNlcnZhdGl2ZWx5IGFsbG9jYXRhYmxlIHNldC4iKTsKKyAgICAgIENvbnNlcnZhdGl2ZWx5QWxsb2NhdGFibGVOb2Rlcy5lcmFzZShOSWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBOb2RlTWV0YWRhdGE6Ok5vdFByb3ZhYmx5QWxsb2NhdGFibGU6CisgICAgICBhc3NlcnQoTm90UHJvdmFibHlBbGxvY2F0YWJsZU5vZGVzLmZpbmQoTklkKSAhPQorICAgICAgICAgICAgIE5vdFByb3ZhYmx5QWxsb2NhdGFibGVOb2Rlcy5lbmQoKSAmJgorICAgICAgICAgICAgICJOb2RlIG5vdCBpbiBub3QtcHJvdmFibHktYWxsb2NhdGFibGUgc2V0LiIpOworICAgICAgTm90UHJvdmFibHlBbGxvY2F0YWJsZU5vZGVzLmVyYXNlKE5JZCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICB2b2lkIG1vdmVUb09wdGltYWxseVJlZHVjaWJsZU5vZGVzKE5vZGVJZCBOSWQpIHsKKyAgICByZW1vdmVGcm9tQ3VycmVudFNldChOSWQpOworICAgIE9wdGltYWxseVJlZHVjaWJsZU5vZGVzLmluc2VydChOSWQpOworICAgIEcuZ2V0Tm9kZU1ldGFkYXRhKE5JZCkuc2V0UmVkdWN0aW9uU3RhdGUoCisgICAgICBOb2RlTWV0YWRhdGE6Ok9wdGltYWxseVJlZHVjaWJsZSk7CisgIH0KKworICB2b2lkIG1vdmVUb0NvbnNlcnZhdGl2ZWx5QWxsb2NhdGFibGVOb2RlcyhOb2RlSWQgTklkKSB7CisgICAgcmVtb3ZlRnJvbUN1cnJlbnRTZXQoTklkKTsKKyAgICBDb25zZXJ2YXRpdmVseUFsbG9jYXRhYmxlTm9kZXMuaW5zZXJ0KE5JZCk7CisgICAgRy5nZXROb2RlTWV0YWRhdGEoTklkKS5zZXRSZWR1Y3Rpb25TdGF0ZSgKKyAgICAgIE5vZGVNZXRhZGF0YTo6Q29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZSk7CisgIH0KKworICB2b2lkIG1vdmVUb05vdFByb3ZhYmx5QWxsb2NhdGFibGVOb2RlcyhOb2RlSWQgTklkKSB7CisgICAgcmVtb3ZlRnJvbUN1cnJlbnRTZXQoTklkKTsKKyAgICBOb3RQcm92YWJseUFsbG9jYXRhYmxlTm9kZXMuaW5zZXJ0KE5JZCk7CisgICAgRy5nZXROb2RlTWV0YWRhdGEoTklkKS5zZXRSZWR1Y3Rpb25TdGF0ZSgKKyAgICAgIE5vZGVNZXRhZGF0YTo6Tm90UHJvdmFibHlBbGxvY2F0YWJsZSk7CisgIH0KKworICB2b2lkIHNldHVwKCkgeworICAgIC8vIFNldCB1cCB3b3JrbGlzdHMuCisgICAgZm9yIChhdXRvIE5JZCA6IEcubm9kZUlkcygpKSB7CisgICAgICBpZiAoRy5nZXROb2RlRGVncmVlKE5JZCkgPCAzKQorICAgICAgICBtb3ZlVG9PcHRpbWFsbHlSZWR1Y2libGVOb2RlcyhOSWQpOworICAgICAgZWxzZSBpZiAoRy5nZXROb2RlTWV0YWRhdGEoTklkKS5pc0NvbnNlcnZhdGl2ZWx5QWxsb2NhdGFibGUoKSkKKyAgICAgICAgbW92ZVRvQ29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZU5vZGVzKE5JZCk7CisgICAgICBlbHNlCisgICAgICAgIG1vdmVUb05vdFByb3ZhYmx5QWxsb2NhdGFibGVOb2RlcyhOSWQpOworICAgIH0KKyAgfQorCisgIC8vIENvbXB1dGUgYSByZWR1Y3Rpb24gb3JkZXIgZm9yIHRoZSBncmFwaCBieSBpdGVyYXRpdmVseSBhcHBseWluZyBQQlFQCisgIC8vIHJlZHVjdGlvbiBydWxlcy4gTG9jYWxseSBvcHRpbWFsIHJ1bGVzIGFyZSBhcHBsaWVkIHdoZW5ldmVyIHBvc3NpYmxlIChSMCwKKyAgLy8gUjEsIFIyKS4gSWYgbm8gbG9jYWxseS1vcHRpbWFsIHJ1bGVzIGFwcGx5IHRoZW4gYW55IGNvbnNlcnZhdGl2ZWx5CisgIC8vIGFsbG9jYXRhYmxlIG5vZGUgaXMgcmVkdWNlZC4gRmluYWxseSwgaWYgbm8gY29uc2VydmF0aXZlbHkgYWxsb2NhdGFibGUKKyAgLy8gbm9kZSBleGlzdHMgdGhlbiB0aGUgbm9kZSB3aXRoIHRoZSBsb3dlc3Qgc3BpbGwtY29zdDpkZWdyZWUgcmF0aW8gaXMKKyAgLy8gc2VsZWN0ZWQuCisgIHN0ZDo6dmVjdG9yPEdyYXBoQmFzZTo6Tm9kZUlkPiByZWR1Y2UoKSB7CisgICAgYXNzZXJ0KCFHLmVtcHR5KCkgJiYgIkNhbm5vdCByZWR1Y2UgZW1wdHkgZ3JhcGguIik7CisKKyAgICB1c2luZyBOb2RlSWQgPSBHcmFwaEJhc2U6Ok5vZGVJZDsKKyAgICBzdGQ6OnZlY3RvcjxOb2RlSWQ+IE5vZGVTdGFjazsKKworICAgIC8vIENvbnN1bWUgd29ya2xpc3RzLgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoIU9wdGltYWxseVJlZHVjaWJsZU5vZGVzLmVtcHR5KCkpIHsKKyAgICAgICAgTm9kZVNldDo6aXRlcmF0b3IgTkl0ciA9IE9wdGltYWxseVJlZHVjaWJsZU5vZGVzLmJlZ2luKCk7CisgICAgICAgIE5vZGVJZCBOSWQgPSAqTkl0cjsKKyAgICAgICAgT3B0aW1hbGx5UmVkdWNpYmxlTm9kZXMuZXJhc2UoTkl0cik7CisgICAgICAgIE5vZGVTdGFjay5wdXNoX2JhY2soTklkKTsKKyAgICAgICAgc3dpdGNoIChHLmdldE5vZGVEZWdyZWUoTklkKSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBhcHBseVIxKEcsIE5JZCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBhcHBseVIyKEcsIE5JZCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIk5vdCBhbiBvcHRpbWFsbHkgcmVkdWNpYmxlIG5vZGUuIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoIUNvbnNlcnZhdGl2ZWx5QWxsb2NhdGFibGVOb2Rlcy5lbXB0eSgpKSB7CisgICAgICAgIC8vIENvbnNlcnZhdGl2ZWx5IGFsbG9jYXRhYmxlIG5vZGVzIHdpbGwgbmV2ZXIgc3BpbGwuIEZvciBub3cganVzdAorICAgICAgICAvLyB0YWtlIHRoZSBmaXJzdCBub2RlIGluIHRoZSBzZXQgYW5kIHB1c2ggaXQgb24gdGhlIHN0YWNrLiBXaGVuIHdlCisgICAgICAgIC8vIHN0YXJ0IG9wdGltaXppbmcgbW9yZSBoZWF2aWx5IGZvciByZWdpc3RlciBwcmVmZXJlbmNpbmcsIGl0IG1heQorICAgICAgICAvLyB3b3VsZCBiZSBiZXR0ZXIgdG8gcHVzaCBub2RlcyB3aXRoIGxvd2VyICdleHBlY3RlZCcgb3Igd29yc3QtY2FzZQorICAgICAgICAvLyByZWdpc3RlciBjb3N0cyBmaXJzdCAoc2luY2UgZWFybHkgbm9kZXMgYXJlIHRoZSBtb3N0CisgICAgICAgIC8vIGNvbnN0cmFpbmVkKS4KKyAgICAgICAgTm9kZVNldDo6aXRlcmF0b3IgTkl0ciA9IENvbnNlcnZhdGl2ZWx5QWxsb2NhdGFibGVOb2Rlcy5iZWdpbigpOworICAgICAgICBOb2RlSWQgTklkID0gKk5JdHI7CisgICAgICAgIENvbnNlcnZhdGl2ZWx5QWxsb2NhdGFibGVOb2Rlcy5lcmFzZShOSXRyKTsKKyAgICAgICAgTm9kZVN0YWNrLnB1c2hfYmFjayhOSWQpOworICAgICAgICBHLmRpc2Nvbm5lY3RBbGxOZWlnaGJvcnNGcm9tTm9kZShOSWQpOworICAgICAgfSBlbHNlIGlmICghTm90UHJvdmFibHlBbGxvY2F0YWJsZU5vZGVzLmVtcHR5KCkpIHsKKyAgICAgICAgTm9kZVNldDo6aXRlcmF0b3IgTkl0ciA9CisgICAgICAgICAgc3RkOjptaW5fZWxlbWVudChOb3RQcm92YWJseUFsbG9jYXRhYmxlTm9kZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdFByb3ZhYmx5QWxsb2NhdGFibGVOb2Rlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwaWxsQ29zdENvbXBhcmF0b3IoRykpOworICAgICAgICBOb2RlSWQgTklkID0gKk5JdHI7CisgICAgICAgIE5vdFByb3ZhYmx5QWxsb2NhdGFibGVOb2Rlcy5lcmFzZShOSXRyKTsKKyAgICAgICAgTm9kZVN0YWNrLnB1c2hfYmFjayhOSWQpOworICAgICAgICBHLmRpc2Nvbm5lY3RBbGxOZWlnaGJvcnNGcm9tTm9kZShOSWQpOworICAgICAgfSBlbHNlCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBOb2RlU3RhY2s7CisgIH0KKworICBjbGFzcyBTcGlsbENvc3RDb21wYXJhdG9yIHsKKyAgcHVibGljOgorICAgIFNwaWxsQ29zdENvbXBhcmF0b3IoY29uc3QgR3JhcGgmIEcpIDogRyhHKSB7fQorCisgICAgYm9vbCBvcGVyYXRvcigpKE5vZGVJZCBOMUlkLCBOb2RlSWQgTjJJZCkgeworICAgICAgUEJRUE51bSBOMVNDID0gRy5nZXROb2RlQ29zdHMoTjFJZClbMF07CisgICAgICBQQlFQTnVtIE4yU0MgPSBHLmdldE5vZGVDb3N0cyhOMklkKVswXTsKKyAgICAgIGlmIChOMVNDID09IE4yU0MpCisgICAgICAgIHJldHVybiBHLmdldE5vZGVEZWdyZWUoTjFJZCkgPCBHLmdldE5vZGVEZWdyZWUoTjJJZCk7CisgICAgICByZXR1cm4gTjFTQyA8IE4yU0M7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgY29uc3QgR3JhcGgmIEc7CisgIH07CisKKyAgR3JhcGgmIEc7CisgIHVzaW5nIE5vZGVTZXQgPSBzdGQ6OnNldDxOb2RlSWQ+OworICBOb2RlU2V0IE9wdGltYWxseVJlZHVjaWJsZU5vZGVzOworICBOb2RlU2V0IENvbnNlcnZhdGl2ZWx5QWxsb2NhdGFibGVOb2RlczsKKyAgTm9kZVNldCBOb3RQcm92YWJseUFsbG9jYXRhYmxlTm9kZXM7Cit9OworCitjbGFzcyBQQlFQUkFHcmFwaCA6IHB1YmxpYyBQQlFQOjpHcmFwaDxSZWdBbGxvY1NvbHZlckltcGw+IHsKK3ByaXZhdGU6CisgIHVzaW5nIEJhc2VUID0gUEJRUDo6R3JhcGg8UmVnQWxsb2NTb2x2ZXJJbXBsPjsKKworcHVibGljOgorICBQQlFQUkFHcmFwaChHcmFwaE1ldGFkYXRhIE1ldGFkYXRhKSA6IEJhc2VUKHN0ZDo6bW92ZShNZXRhZGF0YSkpIHt9CisKKyAgLy8vIEBicmllZiBEdW1wIHRoaXMgZ3JhcGggdG8gZGJncygpLgorICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLy8gQGJyaWVmIER1bXAgdGhpcyBncmFwaCB0byBhbiBvdXRwdXQgc3RyZWFtLgorICAvLy8gQHBhcmFtIE9TIE91dHB1dCBzdHJlYW0gdG8gcHJpbnQgb24uCisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgUHJpbnQgYSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGdyYXBoIGluIERPVCBmb3JtYXQuCisgIC8vLyBAcGFyYW0gT1MgT3V0cHV0IHN0cmVhbSB0byBwcmludCBvbi4KKyAgdm9pZCBwcmludERvdChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworfTsKKworaW5saW5lIFNvbHV0aW9uIHNvbHZlKFBCUVBSQUdyYXBoJiBHKSB7CisgIGlmIChHLmVtcHR5KCkpCisgICAgcmV0dXJuIFNvbHV0aW9uKCk7CisgIFJlZ0FsbG9jU29sdmVySW1wbCBSZWdBbGxvY1NvbHZlcihHKTsKKyAgcmV0dXJuIFJlZ0FsbG9jU29sdmVyLnNvbHZlKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBSZWdBbGxvYworfSAvLyBlbmQgbmFtZXNwYWNlIFBCUVAKKworLy8vIEBicmllZiBDcmVhdGUgYSBQQlFQIHJlZ2lzdGVyIGFsbG9jYXRvciBpbnN0YW5jZS4KK0Z1bmN0aW9uUGFzcyAqCitjcmVhdGVQQlFQUmVnaXN0ZXJBbGxvY2F0b3IoY2hhciAqY3VzdG9tUGFzc0lEID0gbnVsbHB0cik7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fUkVHQUxMT0NQQlFQX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdBbGxvY1JlZ2lzdHJ5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVnQWxsb2NSZWdpc3RyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MTc0N2QKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVnQWxsb2NSZWdpc3RyeS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vUmVnQWxsb2NSZWdpc3RyeS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgcmVnaXN0ZXIgYWxsb2NhdG9yIGZ1bmN0aW9uCisvLyBwYXNzIHJlZ2lzdHJ5IChSZWdpc3RlclJlZ0FsbG9jKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9SRUdBTExPQ1JFR0lTVFJZX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1JFR0FMTE9DUkVHSVNUUllfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVQYXNzUmVnaXN0cnkuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvblBhc3M7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBSZWdpc3RlclJlZ0FsbG9jIGNsYXNzIC0gVHJhY2sgdGhlIHJlZ2lzdHJhdGlvbiBvZiByZWdpc3RlciBhbGxvY2F0b3JzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworY2xhc3MgUmVnaXN0ZXJSZWdBbGxvYyA6IHB1YmxpYyBNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZSB7CitwdWJsaWM6CisgIHVzaW5nIEZ1bmN0aW9uUGFzc0N0b3IgPSBGdW5jdGlvblBhc3MgKigqKSgpOworCisgIHN0YXRpYyBNYWNoaW5lUGFzc1JlZ2lzdHJ5IFJlZ2lzdHJ5OworCisgIFJlZ2lzdGVyUmVnQWxsb2MoY29uc3QgY2hhciAqTiwgY29uc3QgY2hhciAqRCwgRnVuY3Rpb25QYXNzQ3RvciBDKQorICAgICAgOiBNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZShOLCBELCAoTWFjaGluZVBhc3NDdG9yKUMpIHsKKyAgICBSZWdpc3RyeS5BZGQodGhpcyk7CisgIH0KKworICB+UmVnaXN0ZXJSZWdBbGxvYygpIHsgUmVnaXN0cnkuUmVtb3ZlKHRoaXMpOyB9CisKKyAgLy8gQWNjZXNzb3JzLgorICBSZWdpc3RlclJlZ0FsbG9jICpnZXROZXh0KCkgY29uc3QgeworICAgIHJldHVybiAoUmVnaXN0ZXJSZWdBbGxvYyAqKU1hY2hpbmVQYXNzUmVnaXN0cnlOb2RlOjpnZXROZXh0KCk7CisgIH0KKworICBzdGF0aWMgUmVnaXN0ZXJSZWdBbGxvYyAqZ2V0TGlzdCgpIHsKKyAgICByZXR1cm4gKFJlZ2lzdGVyUmVnQWxsb2MgKilSZWdpc3RyeS5nZXRMaXN0KCk7CisgIH0KKworICBzdGF0aWMgRnVuY3Rpb25QYXNzQ3RvciBnZXREZWZhdWx0KCkgeworICAgIHJldHVybiAoRnVuY3Rpb25QYXNzQ3RvcilSZWdpc3RyeS5nZXREZWZhdWx0KCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBzZXREZWZhdWx0KEZ1bmN0aW9uUGFzc0N0b3IgQykgeworICAgIFJlZ2lzdHJ5LnNldERlZmF1bHQoKE1hY2hpbmVQYXNzQ3RvcilDKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIHNldExpc3RlbmVyKE1hY2hpbmVQYXNzUmVnaXN0cnlMaXN0ZW5lciAqTCkgeworICAgIFJlZ2lzdHJ5LnNldExpc3RlbmVyKEwpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1JFR0FMTE9DUkVHSVNUUllfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1JlZ2lzdGVyQ2xhc3NJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVnaXN0ZXJDbGFzc0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzExM2M1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1JlZ2lzdGVyQ2xhc3NJbmZvLmgKQEAgLTAsMCArMSwxNTAgQEAKKy8vPT09LSBSZWdpc3RlckNsYXNzSW5mby5oIC0gRHluYW1pYyBSZWdpc3RlciBDbGFzcyBJbmZvIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFJlZ2lzdGVyQ2xhc3NJbmZvIGNsYXNzIHdoaWNoIHByb3ZpZGVzIGR5bmFtaWMKKy8vIGluZm9ybWF0aW9uIGFib3V0IHRhcmdldCByZWdpc3RlciBjbGFzc2VzLiBDYWxsZWUgc2F2ZWQgYW5kIHJlc2VydmVkCisvLyByZWdpc3RlcnMgZGVwZW5kcyBvbiBjYWxsaW5nIGNvbnZlbnRpb25zIGFuZCBvdGhlciBkeW5hbWljIGluZm9ybWF0aW9uLCBzbworLy8gc29tZSB0aGluZ3MgY2Fubm90IGJlIGRldGVybWluZWQgc3RhdGljYWxseS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9SRUdJU1RFUkNMQVNTSU5GT19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9SRUdJU1RFUkNMQVNTSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFJlZ2lzdGVyQ2xhc3NJbmZvIHsKKyAgc3RydWN0IFJDSW5mbyB7CisgICAgdW5zaWduZWQgVGFnID0gMDsKKyAgICB1bnNpZ25lZCBOdW1SZWdzID0gMDsKKyAgICBib29sIFByb3BlclN1YkNsYXNzID0gZmFsc2U7CisgICAgdWludDhfdCBNaW5Db3N0ID0gMDsKKyAgICB1aW50MTZfdCBMYXN0Q29zdENoYW5nZSA9IDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1DUGh5c1JlZ1tdPiBPcmRlcjsKKworICAgIFJDSW5mbygpID0gZGVmYXVsdDsKKworICAgIG9wZXJhdG9yIEFycmF5UmVmPE1DUGh5c1JlZz4oKSBjb25zdCB7CisgICAgICByZXR1cm4gbWFrZUFycmF5UmVmKE9yZGVyLmdldCgpLCBOdW1SZWdzKTsKKyAgICB9CisgIH07CisKKyAgLy8gQnJpZWYgY2FjaGVkIGluZm9ybWF0aW9uIGZvciBlYWNoIHJlZ2lzdGVyIGNsYXNzLgorICBzdGQ6OnVuaXF1ZV9wdHI8UkNJbmZvW10+IFJlZ0NsYXNzOworCisgIC8vIFRhZyBjaGFuZ2VzIHdoZW5ldmVyIGNhY2hlZCBpbmZvcm1hdGlvbiBuZWVkcyB0byBiZSByZWNvbXB1dGVkLiBBbiBSQ0luZm8KKyAgLy8gZW50cnkgaXMgdmFsaWQgd2hlbiBpdHMgdGFnIG1hdGNoZXMuCisgIHVuc2lnbmVkIFRhZyA9IDA7CisKKyAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRiA9IG51bGxwdHI7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gbnVsbHB0cjsKKworICAvLyBDYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzIG9mIGxhc3QgTUYuIEFzc3VtZWQgdG8gYmUgdmFsaWQgdW50aWwgdGhlIG5leHQKKyAgLy8gcnVuT25GdW5jdGlvbigpIGNhbGwuCisgIC8vIFVzZWQgb25seSB0byBkZXRlcm1pbmUgaWYgYW4gdXBkYXRlIHdhcyBtYWRlIHRvIENhbGxlZVNhdmVkQWxpYXNlcy4KKyAgY29uc3QgTUNQaHlzUmVnICpDYWxsZWVTYXZlZFJlZ3MgPSBudWxscHRyOworCisgIC8vIE1hcCByZWdpc3RlciBhbGlhcyB0byB0aGUgY2FsbGVlIHNhdmVkIFJlZ2lzdGVyLgorICBTbWFsbFZlY3RvcjxNQ1BoeXNSZWcsIDQ+IENhbGxlZVNhdmVkQWxpYXNlczsKKworICAvLyBSZXNlcnZlZCByZWdpc3RlcnMgaW4gdGhlIGN1cnJlbnQgTUYuCisgIEJpdFZlY3RvciBSZXNlcnZlZDsKKworICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWRbXT4gUFNldExpbWl0czsKKworICAvLyBDb21wdXRlIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBSQy4KKyAgdm9pZCBjb21wdXRlKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdDsKKworICAvLyBSZXR1cm4gYW4gdXAtdG8tZGF0ZSBSQ0luZm8gZm9yIFJDLgorICBjb25zdCBSQ0luZm8gJmdldChjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgY29uc3QgeworICAgIGNvbnN0IFJDSW5mbyAmUkNJID0gUmVnQ2xhc3NbUkMtPmdldElEKCldOworICAgIGlmIChUYWcgIT0gUkNJLlRhZykKKyAgICAgIGNvbXB1dGUoUkMpOworICAgIHJldHVybiBSQ0k7CisgIH0KKworcHVibGljOgorICBSZWdpc3RlckNsYXNzSW5mbygpOworCisgIC8vLyBydW5PbkZ1bmN0aW9uIC0gUHJlcGFyZSB0byBhbnN3ZXIgcXVlc3Rpb25zIGFib3V0IE1GLiBUaGlzIG11c3QgYmUgY2FsbGVkCisgIC8vLyBiZWZvcmUgYW55IG90aGVyIG1ldGhvZHMgYXJlIHVzZWQuCisgIHZvaWQgcnVuT25NYWNoaW5lRnVuY3Rpb24oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKyAgLy8vIGdldE51bUFsbG9jYXRhYmxlUmVncyAtIFJldHVybnMgdGhlIG51bWJlciBvZiBhY3R1YWxseSBhbGxvY2F0YWJsZQorICAvLy8gcmVnaXN0ZXJzIGluIFJDIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICB1bnNpZ25lZCBnZXROdW1BbGxvY2F0YWJsZVJlZ3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0KFJDKS5OdW1SZWdzOworICB9CisKKyAgLy8vIGdldE9yZGVyIC0gUmV0dXJucyB0aGUgcHJlZmVycmVkIGFsbG9jYXRpb24gb3JkZXIgZm9yIFJDLiBUaGUgb3JkZXIKKyAgLy8vIGNvbnRhaW5zIG5vIHJlc2VydmVkIHJlZ2lzdGVycywgYW5kIHJlZ2lzdGVycyB0aGF0IGFsaWFzIGNhbGxlZSBzYXZlZAorICAvLy8gcmVnaXN0ZXJzIGNvbWUgbGFzdC4KKyAgQXJyYXlSZWY8TUNQaHlzUmVnPiBnZXRPcmRlcihjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgY29uc3QgeworICAgIHJldHVybiBnZXQoUkMpOworICB9CisKKyAgLy8vIGlzUHJvcGVyU3ViQ2xhc3MgLSBSZXR1cm5zIHRydWUgaWYgUkMgaGFzIGEgbGVnYWwgc3VwZXItY2xhc3Mgd2l0aCBtb3JlCisgIC8vLyBhbGxvY2F0YWJsZSByZWdpc3RlcnMuCisgIC8vLworICAvLy8gUmVnaXN0ZXIgY2xhc3NlcyBsaWtlIEdSMzJfTk9TUCBhcmUgbm90IHByb3BlciBzdWItY2xhc3NlcyBiZWNhdXNlICVlc3AKKyAgLy8vIGlzIG5vdCBhbGxvY2F0YWJsZS4gIFNpbWlsYXJseSwgdEdQUiBpcyBub3QgYSBwcm9wZXIgc3ViLWNsYXNzIGluIFRodW1iCisgIC8vLyBtb2RlIGJlY2F1c2UgdGhlIEdQUiBzdXBlci1jbGFzcyBpcyBub3QgbGVnYWwuCisgIGJvb2wgaXNQcm9wZXJTdWJDbGFzcyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgY29uc3QgeworICAgIHJldHVybiBnZXQoUkMpLlByb3BlclN1YkNsYXNzOworICB9CisKKyAgLy8vIGdldExhc3RDYWxsZWVTYXZlZEFsaWFzIC0gUmV0dXJucyB0aGUgbGFzdCBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXIgdGhhdAorICAvLy8gb3ZlcmxhcHMgUGh5c1JlZywgb3IgMCBpZiBSZWcgZG9lc24ndCBvdmVybGFwIGEgQ2FsbGVlU2F2ZWRBbGlhc2VzLgorICB1bnNpZ25lZCBnZXRMYXN0Q2FsbGVlU2F2ZWRBbGlhcyh1bnNpZ25lZCBQaHlzUmVnKSBjb25zdCB7CisgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNQaHlzaWNhbFJlZ2lzdGVyKFBoeXNSZWcpKTsKKyAgICBpZiAoUGh5c1JlZyA8IENhbGxlZVNhdmVkQWxpYXNlcy5zaXplKCkpCisgICAgICByZXR1cm4gQ2FsbGVlU2F2ZWRBbGlhc2VzW1BoeXNSZWddOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIEdldCB0aGUgbWluaW11bSByZWdpc3RlciBjb3N0IGluIFJDJ3MgYWxsb2NhdGlvbiBvcmRlci4KKyAgLy8vIFRoaXMgaXMgdGhlIHNtYWxsZXN0IHZhbHVlIHJldHVybmVkIGJ5IFRSSS0+Z2V0Q29zdFBlclVzZShSZWcpIGZvciBhbGwKKyAgLy8vIHRoZSByZWdpc3RlcnMgaW4gZ2V0T3JkZXIoUkMpLgorICB1bnNpZ25lZCBnZXRNaW5Db3N0KGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSB7CisgICAgcmV0dXJuIGdldChSQykuTWluQ29zdDsKKyAgfQorCisgIC8vLyBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IGNvc3QgY2hhbmdlIGluIGdldE9yZGVyKFJDKS4KKyAgLy8vCisgIC8vLyBBbGwgcmVnaXN0ZXJzIGluIGdldE9yZGVyKFJDKS5zbGljZShnZXRMYXN0Q29zdENoYW5nZShSQykpIHdpbGwgaGF2ZSB0aGUKKyAgLy8vIHNhbWUgY29zdCBhY2NvcmRpbmcgdG8gVFJJLT5nZXRDb3N0UGVyVXNlKCkuCisgIHVuc2lnbmVkIGdldExhc3RDb3N0Q2hhbmdlKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSB7CisgICAgcmV0dXJuIGdldChSQykuTGFzdENvc3RDaGFuZ2U7CisgIH0KKworICAvLy8gR2V0IHRoZSByZWdpc3RlciB1bml0IGxpbWl0IGZvciB0aGUgZ2l2ZW4gcHJlc3N1cmUgc2V0IGluZGV4LgorICAvLy8KKyAgLy8vIFJlZ2lzdGVyQ2xhc3NJbmZvIGFkanVzdHMgdGhpcyBsaW1pdCBmb3IgcmVzZXJ2ZWQgcmVnaXN0ZXJzLgorICB1bnNpZ25lZCBnZXRSZWdQcmVzc3VyZVNldExpbWl0KHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGlmICghUFNldExpbWl0c1tJZHhdKQorICAgICAgUFNldExpbWl0c1tJZHhdID0gY29tcHV0ZVBTZXRMaW1pdChJZHgpOworICAgIHJldHVybiBQU2V0TGltaXRzW0lkeF07CisgIH0KKworcHJvdGVjdGVkOgorICB1bnNpZ25lZCBjb21wdXRlUFNldExpbWl0KHVuc2lnbmVkIElkeCkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1JFR0lTVEVSQ0xBU1NJTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdpc3RlclByZXNzdXJlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVnaXN0ZXJQcmVzc3VyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMTRiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVnaXN0ZXJQcmVzc3VyZS5oCkBAIC0wLDAgKzEsNTc2IEBACisvLz09PS0gUmVnaXN0ZXJQcmVzc3VyZS5oIC0gRHluYW1pYyBSZWdpc3RlciBQcmVzc3VyZSAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBSZWdpc3RlclByZXNzdXJlIGNsYXNzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHRyYWNrCisvLyBNYWNoaW5lSW5zdHIgbGV2ZWwgcmVnaXN0ZXIgcHJlc3N1cmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fUkVHSVNURVJQUkVTU1VSRV9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9SRUdJU1RFUlBSRVNTVVJFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TcGFyc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2xvdEluZGV4ZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9MYW5lQml0bWFzay5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMaXZlSW50ZXJ2YWxzOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIFJlZ2lzdGVyQ2xhc3NJbmZvOworCitzdHJ1Y3QgUmVnaXN0ZXJNYXNrUGFpciB7CisgIHVuc2lnbmVkIFJlZ1VuaXQ7IC8vLzwgVmlydHVhbCByZWdpc3RlciBvciByZWdpc3RlciB1bml0LgorICBMYW5lQml0bWFzayBMYW5lTWFzazsKKworICBSZWdpc3Rlck1hc2tQYWlyKHVuc2lnbmVkIFJlZ1VuaXQsIExhbmVCaXRtYXNrIExhbmVNYXNrKQorICAgICAgOiBSZWdVbml0KFJlZ1VuaXQpLCBMYW5lTWFzayhMYW5lTWFzaykge30KK307CisKKy8vLyBCYXNlIGNsYXNzIGZvciByZWdpc3RlciBwcmVzc3VyZSByZXN1bHRzLgorc3RydWN0IFJlZ2lzdGVyUHJlc3N1cmUgeworICAvLy8gTWFwIG9mIG1heCByZWcgcHJlc3N1cmUgaW5kZXhlZCBieSBwcmVzc3VyZSBzZXQgSUQsIG5vdCBjbGFzcyBJRC4KKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IE1heFNldFByZXNzdXJlOworCisgIC8vLyBMaXN0IG9mIGxpdmUgaW4gdmlydHVhbCByZWdpc3RlcnMgb3IgcGh5c2ljYWwgcmVnaXN0ZXIgdW5pdHMuCisgIFNtYWxsVmVjdG9yPFJlZ2lzdGVyTWFza1BhaXIsOD4gTGl2ZUluUmVnczsKKyAgU21hbGxWZWN0b3I8UmVnaXN0ZXJNYXNrUGFpciw4PiBMaXZlT3V0UmVnczsKKworICB2b2lkIGR1bXAoY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworfTsKKworLy8vIFJlZ2lzdGVyUHJlc3N1cmUgY29tcHV0ZWQgd2l0aGluIGEgcmVnaW9uIG9mIGluc3RydWN0aW9ucyBkZWxpbWl0ZWQgYnkKKy8vLyBUb3BJZHggYW5kIEJvdHRvbUlkeC4gIER1cmluZyBwcmVzc3VyZSBjb21wdXRhdGlvbiwgdGhlIG1heGltdW0gcHJlc3N1cmUgcGVyCisvLy8gcmVnaXN0ZXIgcHJlc3N1cmUgc2V0IGlzIGluY3JlYXNlZC4gT25jZSBwcmVzc3VyZSB3aXRoaW4gYSByZWdpb24gaXMgZnVsbHkKKy8vLyBjb21wdXRlZCwgdGhlIGxpdmUtaW4gYW5kIGxpdmUtb3V0IHNldHMgYXJlIHJlY29yZGVkLgorLy8vCisvLy8gVGhpcyBpcyBwcmVmZXJhYmxlIHRvIFJlZ2lvblByZXNzdXJlIHdoZW4gTGl2ZUludGVydmFscyBhcmUgYXZhaWxhYmxlLAorLy8vIGJlY2F1c2UgZGVsaW1pdGluZyByZWdpb25zIGJ5IFNsb3RJbmRleCBpcyBtb3JlIHJvYnVzdCBhbmQgY29udmVuaWVudCB0aGFuCisvLy8gaG9sZGluZyBibG9jayBpdGVyYXRvcnMuIFRoZSBibG9jayBjb250ZW50cyBjYW4gY2hhbmdlIHdpdGhvdXQgaW52YWxpZGF0aW5nCisvLy8gdGhlIHByZXNzdXJlIHJlc3VsdC4KK3N0cnVjdCBJbnRlcnZhbFByZXNzdXJlIDogUmVnaXN0ZXJQcmVzc3VyZSB7CisgIC8vLyBSZWNvcmQgdGhlIGJvdW5kYXJ5IG9mIHRoZSByZWdpb24gYmVpbmcgdHJhY2tlZC4KKyAgU2xvdEluZGV4IFRvcElkeDsKKyAgU2xvdEluZGV4IEJvdHRvbUlkeDsKKworICB2b2lkIHJlc2V0KCk7CisKKyAgdm9pZCBvcGVuVG9wKFNsb3RJbmRleCBOZXh0VG9wKTsKKworICB2b2lkIG9wZW5Cb3R0b20oU2xvdEluZGV4IFByZXZCb3R0b20pOworfTsKKworLy8vIFJlZ2lzdGVyUHJlc3N1cmUgY29tcHV0ZWQgd2l0aGluIGEgcmVnaW9uIG9mIGluc3RydWN0aW9ucyBkZWxpbWl0ZWQgYnkKKy8vLyBUb3BQb3MgYW5kIEJvdHRvbVBvcy4gVGhpcyBpcyBhIGxlc3MgcHJlY2lzZSB2ZXJzaW9uIG9mIEludGVydmFsUHJlc3N1cmUgZm9yCisvLy8gdXNlIHdoZW4gTGl2ZUludGVydmFscyBhcmUgdW5hdmFpbGFibGUuCitzdHJ1Y3QgUmVnaW9uUHJlc3N1cmUgOiBSZWdpc3RlclByZXNzdXJlIHsKKyAgLy8vIFJlY29yZCB0aGUgYm91bmRhcnkgb2YgdGhlIHJlZ2lvbiBiZWluZyB0cmFja2VkLgorICBNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgVG9wUG9zOworICBNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgQm90dG9tUG9zOworCisgIHZvaWQgcmVzZXQoKTsKKworICB2b2lkIG9wZW5Ub3AoTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIFByZXZUb3ApOworCisgIHZvaWQgb3BlbkJvdHRvbShNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgUHJldkJvdHRvbSk7Cit9OworCisvLy8gQ2FwdHVyZSBhIGNoYW5nZSBpbiBwcmVzc3VyZSBmb3IgYSBzaW5nbGUgcHJlc3N1cmUgc2V0LiBVbml0SW5jIG1heSBiZQorLy8vIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiB1cHdhcmQgb3IgZG93bndhcmQgcHJlc3N1cmUgZGVwZW5kaW5nIG9uIHRoZSBjbGllbnQKKy8vLyBhbmQgd2lsbCBiZSBkeW5hbWljYWxseSBhZGp1c3RlZCBmb3IgY3VycmVudCBsaXZlbmVzcy4KKy8vLworLy8vIFByZXNzdXJlIGluY3JlbWVudHMgYXJlIHRpbnksIHR5cGljYWxseSAxLTIgdW5pdHMsIGFuZCB0aGlzIGlzIG9ubHkgZm9yCisvLy8gaGV1cmlzdGljcywgc28gd2UgZG9uJ3QgY2hlY2sgVW5pdEluYyBvdmVyZmxvdy4gSW5zdGVhZCwgd2UgbWF5IGhhdmUgYQorLy8vIGhpZ2hlciBsZXZlbCBhc3NlcnQgdGhhdCBwcmVzc3VyZSBpcyBjb25zaXN0ZW50IHdpdGhpbiBhIHJlZ2lvbi4gV2UgYWxzbworLy8vIGVmZmVjdGl2ZWx5IGlnbm9yZSBkZWFkIGRlZnMgd2hpY2ggZG9uJ3QgYWZmZWN0IGhldXJpc3RpY3MgbXVjaC4KK2NsYXNzIFByZXNzdXJlQ2hhbmdlIHsKKyAgdWludDE2X3QgUFNldElEID0gMDsgLy8gSUQrMS4gMD1JbnZhbGlkLgorICBpbnQxNl90IFVuaXRJbmMgPSAwOworCitwdWJsaWM6CisgIFByZXNzdXJlQ2hhbmdlKCkgPSBkZWZhdWx0OworICBQcmVzc3VyZUNoYW5nZSh1bnNpZ25lZCBpZCk6IFBTZXRJRChpZCArIDEpIHsKKyAgICBhc3NlcnQoaWQgPCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KCkgJiYgIlBTZXRJRCBvdmVyZmxvdy4iKTsKKyAgfQorCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIFBTZXRJRCA+IDA7IH0KKworICB1bnNpZ25lZCBnZXRQU2V0KCkgY29uc3QgeworICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgImludmFsaWQgUHJlc3N1cmVDaGFuZ2UiKTsKKyAgICByZXR1cm4gUFNldElEIC0gMTsKKyAgfQorCisgIC8vIElmIFBTZXRJRCBpcyBpbnZhbGlkLCByZXR1cm4gVUlOVDE2X01BWCB0byBnaXZlIGl0IGxvd2VzdCBwcmlvcml0eS4KKyAgdW5zaWduZWQgZ2V0UFNldE9yTWF4KCkgY29uc3QgeworICAgIHJldHVybiAoUFNldElEIC0gMSkgJiBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KCk7CisgIH0KKworICBpbnQgZ2V0VW5pdEluYygpIGNvbnN0IHsgcmV0dXJuIFVuaXRJbmM7IH0KKworICB2b2lkIHNldFVuaXRJbmMoaW50IEluYykgeyBVbml0SW5jID0gSW5jOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFByZXNzdXJlQ2hhbmdlICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gUFNldElEID09IFJIUy5QU2V0SUQgJiYgVW5pdEluYyA9PSBSSFMuVW5pdEluYzsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzUG9kTGlrZTxQcmVzc3VyZUNoYW5nZT4geworICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKworLy8vIExpc3Qgb2YgUHJlc3N1cmVDaGFuZ2VzIGluIG9yZGVyIG9mIGluY3JlYXNpbmcsIHVuaXF1ZSBQU2V0SUQuCisvLy8KKy8vLyBVc2UgYSBzbWFsbCBmaXhlZCBudW1iZXIsIGJlY2F1c2Ugd2UgY2FuIGZpdCBtb3JlIFByZXNzdXJlQ2hhbmdlcyBpbiBhbgorLy8vIGVtcHR5IFNtYWxsVmVjdG9yIHRoYW4gZXZlciBuZWVkIHRvIGJlIHRyYWNrZWQgcGVyIHJlZ2lzdGVyIGNsYXNzLiBJZiBtb3JlCisvLy8gUFNldHMgYXJlIGFmZmVjdGVkLCB0aGVuIHdlIG9ubHkgdHJhY2sgdGhlIG1vc3QgY29uc3RyYWluZWQuCitjbGFzcyBQcmVzc3VyZURpZmYgeworICAvLyBUaGUgaW5pdGlhbCBkZXNpZ24gd2FzIGZvciBNYXhQU2V0cz00LCBidXQgdGhhdCByZXF1aXJlcyBQU2V0IHBhcnRpdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBub3QgeWV0IGltcGxlbWVudGVkLiAoUFNldCBwYXJ0aXRpb25zIGFyZSBlcXVpdmFsZW50IFBTZXRzIGdpdmVuCisgIC8vIHRoZSByZWdpc3RlciBjbGFzc2VzIGFjdHVhbGx5IGluIHVzZSB3aXRoaW4gdGhlIHNjaGVkdWxpbmcgcmVnaW9uLikKKyAgZW51bSB7IE1heFBTZXRzID0gMTYgfTsKKworICBQcmVzc3VyZUNoYW5nZSBQcmVzc3VyZUNoYW5nZXNbTWF4UFNldHNdOworCisgIHVzaW5nIGl0ZXJhdG9yID0gUHJlc3N1cmVDaGFuZ2UgKjsKKworICBpdGVyYXRvciBub25jb25zdF9iZWdpbigpIHsgcmV0dXJuICZQcmVzc3VyZUNoYW5nZXNbMF07IH0KKyAgaXRlcmF0b3Igbm9uY29uc3RfZW5kKCkgeyByZXR1cm4gJlByZXNzdXJlQ2hhbmdlc1tNYXhQU2V0c107IH0KKworcHVibGljOgorICB1c2luZyBjb25zdF9pdGVyYXRvciA9IGNvbnN0IFByZXNzdXJlQ2hhbmdlICo7CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiAmUHJlc3N1cmVDaGFuZ2VzWzBdOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuICZQcmVzc3VyZUNoYW5nZXNbTWF4UFNldHNdOyB9CisKKyAgdm9pZCBhZGRQcmVzc3VyZUNoYW5nZSh1bnNpZ25lZCBSZWdVbml0LCBib29sIElzRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSk7CisKKyAgdm9pZCBkdW1wKGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKSBjb25zdDsKK307CisKKy8vLyBMaXN0IG9mIHJlZ2lzdGVycyBkZWZpbmVkIGFuZCB1c2VkIGJ5IGEgbWFjaGluZSBpbnN0cnVjdGlvbi4KK2NsYXNzIFJlZ2lzdGVyT3BlcmFuZHMgeworcHVibGljOgorICAvLy8gTGlzdCBvZiB2aXJ0dWFsIHJlZ2lzdGVycyBhbmQgcmVnaXN0ZXIgdW5pdHMgcmVhZCBieSB0aGUgaW5zdHJ1Y3Rpb24uCisgIFNtYWxsVmVjdG9yPFJlZ2lzdGVyTWFza1BhaXIsIDg+IFVzZXM7CisgIC8vLyBcYnJpZWYgTGlzdCBvZiB2aXJ0dWFsIHJlZ2lzdGVycyBhbmQgcmVnaXN0ZXIgdW5pdHMgZGVmaW5lZCBieSB0aGUKKyAgLy8vIGluc3RydWN0aW9uIHdoaWNoIGFyZSBub3QgZGVhZC4KKyAgU21hbGxWZWN0b3I8UmVnaXN0ZXJNYXNrUGFpciwgOD4gRGVmczsKKyAgLy8vIFxicmllZiBMaXN0IG9mIHZpcnR1YWwgcmVnaXN0ZXJzIGFuZCByZWdpc3RlciB1bml0cyBkZWZpbmVkIGJ5IHRoZQorICAvLy8gaW5zdHJ1Y3Rpb24gYnV0IGRlYWQuCisgIFNtYWxsVmVjdG9yPFJlZ2lzdGVyTWFza1BhaXIsIDg+IERlYWREZWZzOworCisgIC8vLyBBbmFseXplIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBccCBNSSBhbmQgZmlsbCBpbiB0aGUgVXNlcywgRGVmcyBhbmQKKyAgLy8vIERlYWREZWZzIGxpc3QgYmFzZWQgb24gdGhlIE1hY2hpbmVPcGVyYW5kIGZsYWdzLgorICB2b2lkIGNvbGxlY3QoY29uc3QgTWFjaGluZUluc3RyICZNSSwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkksCisgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIGJvb2wgVHJhY2tMYW5lTWFza3MsCisgICAgICAgICAgICAgICBib29sIElnbm9yZURlYWQpOworCisgIC8vLyBVc2UgbGl2ZW5lc3MgaW5mb3JtYXRpb24gdG8gZmluZCBkZWFkIGRlZnMgbm90IG1hcmtlZCB3aXRoIGEgZGVhZCBmbGFnCisgIC8vLyBhbmQgbW92ZSB0aGVtIHRvIHRoZSBEZWFkRGVmcyB2ZWN0b3IuCisgIHZvaWQgZGV0ZWN0RGVhZERlZnMoY29uc3QgTWFjaGluZUluc3RyICZNSSwgY29uc3QgTGl2ZUludGVydmFscyAmTElTKTsKKworICAvLy8gVXNlIGxpdmVuZXNzIGluZm9ybWF0aW9uIHRvIGZpbmQgb3V0IHdoaWNoIHVzZXMvZGVmcyBhcmUgcGFydGlhbGx5CisgIC8vLyB1bmRlZmluZWQvZGVhZCBhbmQgYWRqdXN0IHRoZSBSZWdpc3Rlck1hc2tQYWlycyBhY2NvcmRpbmdseS4KKyAgLy8vIElmIFxwIEFkZEZsYWdzTUkgaXMgZ2l2ZW4gdGhlbiBtaXNzaW5nIHJlYWQtdW5kZWYgYW5kIGRlYWQgZmxhZ3Mgd2lsbCBiZQorICAvLy8gYWRkZWQgdG8gdGhlIGluc3RydWN0aW9uLgorICB2b2lkIGFkanVzdExhbmVMaXZlbmVzcyhjb25zdCBMaXZlSW50ZXJ2YWxzICZMSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwgU2xvdEluZGV4IFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICpBZGRGbGFnc01JID0gbnVsbHB0cik7Cit9OworCisvLy8gQXJyYXkgb2YgUHJlc3N1cmVEaWZmcy4KK2NsYXNzIFByZXNzdXJlRGlmZnMgeworICBQcmVzc3VyZURpZmYgKlBEaWZmQXJyYXkgPSBudWxscHRyOworICB1bnNpZ25lZCBTaXplID0gMDsKKyAgdW5zaWduZWQgTWF4ID0gMDsKKworcHVibGljOgorICBQcmVzc3VyZURpZmZzKCkgPSBkZWZhdWx0OworICB+UHJlc3N1cmVEaWZmcygpIHsgZnJlZShQRGlmZkFycmF5KTsgfQorCisgIHZvaWQgY2xlYXIoKSB7IFNpemUgPSAwOyB9CisKKyAgdm9pZCBpbml0KHVuc2lnbmVkIE4pOworCisgIFByZXNzdXJlRGlmZiAmb3BlcmF0b3JbXSh1bnNpZ25lZCBJZHgpIHsKKyAgICBhc3NlcnQoSWR4IDwgU2l6ZSAmJiAiUHJlc3N1cmVEaWZmIGluZGV4IG91dCBvZiBib3VuZHMiKTsKKyAgICByZXR1cm4gUERpZmZBcnJheVtJZHhdOworICB9CisgIGNvbnN0IFByZXNzdXJlRGlmZiAmb3BlcmF0b3JbXSh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxQcmVzc3VyZURpZmZzKj4odGhpcyktPm9wZXJhdG9yW10oSWR4KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVjb3JkIHByZXNzdXJlIGRpZmZlcmVuY2UgaW5kdWNlZCBieSB0aGUgZ2l2ZW4gb3BlcmFuZCBsaXN0IHRvCisgIC8vLyBub2RlIHdpdGggaW5kZXggXHAgSWR4LgorICB2b2lkIGFkZEluc3RydWN0aW9uKHVuc2lnbmVkIElkeCwgY29uc3QgUmVnaXN0ZXJPcGVyYW5kcyAmUmVnT3BlcnMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJKTsKK307CisKKy8vLyBTdG9yZSB0aGUgZWZmZWN0cyBvZiBhIGNoYW5nZSBpbiBwcmVzc3VyZSBvbiB0aGluZ3MgdGhhdCBNSSBzY2hlZHVsZXIgY2FyZXMKKy8vLyBhYm91dC4KKy8vLworLy8vIEV4Y2VzcyByZWNvcmRzIHRoZSB2YWx1ZSBvZiB0aGUgbGFyZ2VzdCBkaWZmZXJlbmNlIGluIHJlZ2lzdGVyIHVuaXRzIGJleW9uZAorLy8vIHRoZSB0YXJnZXQncyBwcmVzc3VyZSBsaW1pdHMgYWNyb3NzIHRoZSBhZmZlY3RlZCBwcmVzc3VyZSBzZXRzLCB3aGVyZQorLy8vIGxhcmdlc3QgaXMgZGVmaW5lZCBhcyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGRpZmZlcmVuY2UuIE5lZ2F0aXZlCisvLy8gRXhjZXNzVW5pdHMgaW5kaWNhdGVzIGEgcmVkdWN0aW9uIGluIHByZXNzdXJlIHRoYXQgaGFkIGFscmVhZHkgZXhjZWVkZWQgdGhlCisvLy8gdGFyZ2V0J3MgbGltaXRzLgorLy8vCisvLy8gQ3JpdGljYWxNYXggcmVjb3JkcyB0aGUgbGFyZ2VzdCBpbmNyZWFzZSBpbiB0aGUgdHJhY2tlcidzIG1heCBwcmVzc3VyZSB0aGF0CisvLy8gZXhjZWVkcyB0aGUgY3JpdGljYWwgbGltaXQgZm9yIHNvbWUgcHJlc3N1cmUgc2V0IGRldGVybWluZWQgYnkgdGhlIGNsaWVudC4KKy8vLworLy8vIEN1cnJlbnRNYXggcmVjb3JkcyB0aGUgbGFyZ2VzdCBpbmNyZWFzZSBpbiB0aGUgdHJhY2tlcidzIG1heCBwcmVzc3VyZSB0aGF0CisvLy8gZXhjZWVkcyB0aGUgY3VycmVudCBsaW1pdCBmb3Igc29tZSBwcmVzc3VyZSBzZXQgZGV0ZXJtaW5lZCBieSB0aGUgY2xpZW50Lgorc3RydWN0IFJlZ1ByZXNzdXJlRGVsdGEgeworICBQcmVzc3VyZUNoYW5nZSBFeGNlc3M7CisgIFByZXNzdXJlQ2hhbmdlIENyaXRpY2FsTWF4OworICBQcmVzc3VyZUNoYW5nZSBDdXJyZW50TWF4OworCisgIFJlZ1ByZXNzdXJlRGVsdGEoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJlZ1ByZXNzdXJlRGVsdGEgJlJIUykgY29uc3QgeworICAgIHJldHVybiBFeGNlc3MgPT0gUkhTLkV4Y2VzcyAmJiBDcml0aWNhbE1heCA9PSBSSFMuQ3JpdGljYWxNYXgKKyAgICAgICYmIEN1cnJlbnRNYXggPT0gUkhTLkN1cnJlbnRNYXg7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJlZ1ByZXNzdXJlRGVsdGEgJlJIUykgY29uc3QgeworICAgIHJldHVybiAhb3BlcmF0b3I9PShSSFMpOworICB9Cit9OworCisvLy8gQSBzZXQgb2YgbGl2ZSB2aXJ0dWFsIHJlZ2lzdGVycyBhbmQgcGh5c2ljYWwgcmVnaXN0ZXIgdW5pdHMuCisvLy8KKy8vLyBUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgYSBTcGFyc2VTZXQgd2hpY2ggZGVhbHMgd2l0aCBtYXBwaW5nIHJlZ2lzdGVyIHVuaXQKKy8vLyBhbmQgdmlydHVhbCByZWdpc3RlciBpbmRleGVzIHRvIGFuIGluZGV4IHVzYWJsZSBieSB0aGUgc3BhcnNlIHNldC4KK2NsYXNzIExpdmVSZWdTZXQgeworcHJpdmF0ZToKKyAgc3RydWN0IEluZGV4TWFza1BhaXIgeworICAgIHVuc2lnbmVkIEluZGV4OworICAgIExhbmVCaXRtYXNrIExhbmVNYXNrOworCisgICAgSW5kZXhNYXNrUGFpcih1bnNpZ25lZCBJbmRleCwgTGFuZUJpdG1hc2sgTGFuZU1hc2spCisgICAgICAgIDogSW5kZXgoSW5kZXgpLCBMYW5lTWFzayhMYW5lTWFzaykge30KKworICAgIHVuc2lnbmVkIGdldFNwYXJzZVNldEluZGV4KCkgY29uc3QgeworICAgICAgcmV0dXJuIEluZGV4OworICAgIH0KKyAgfTsKKworICB1c2luZyBSZWdTZXQgPSBTcGFyc2VTZXQ8SW5kZXhNYXNrUGFpcj47CisgIFJlZ1NldCBSZWdzOworICB1bnNpZ25lZCBOdW1SZWdVbml0czsKKworICB1bnNpZ25lZCBnZXRTcGFyc2VJbmRleEZyb21SZWcodW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoUmVnKSkKKyAgICAgIHJldHVybiBUYXJnZXRSZWdpc3RlckluZm86OnZpcnRSZWcySW5kZXgoUmVnKSArIE51bVJlZ1VuaXRzOworICAgIGFzc2VydChSZWcgPCBOdW1SZWdVbml0cyk7CisgICAgcmV0dXJuIFJlZzsKKyAgfQorCisgIHVuc2lnbmVkIGdldFJlZ0Zyb21TcGFyc2VJbmRleCh1bnNpZ25lZCBTcGFyc2VJbmRleCkgY29uc3QgeworICAgIGlmIChTcGFyc2VJbmRleCA+PSBOdW1SZWdVbml0cykKKyAgICAgIHJldHVybiBUYXJnZXRSZWdpc3RlckluZm86OmluZGV4MlZpcnRSZWcoU3BhcnNlSW5kZXgtTnVtUmVnVW5pdHMpOworICAgIHJldHVybiBTcGFyc2VJbmRleDsKKyAgfQorCitwdWJsaWM6CisgIHZvaWQgY2xlYXIoKTsKKyAgdm9pZCBpbml0KGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSk7CisKKyAgTGFuZUJpdG1hc2sgY29udGFpbnModW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgdW5zaWduZWQgU3BhcnNlSW5kZXggPSBnZXRTcGFyc2VJbmRleEZyb21SZWcoUmVnKTsKKyAgICBSZWdTZXQ6OmNvbnN0X2l0ZXJhdG9yIEkgPSBSZWdzLmZpbmQoU3BhcnNlSW5kZXgpOworICAgIGlmIChJID09IFJlZ3MuZW5kKCkpCisgICAgICByZXR1cm4gTGFuZUJpdG1hc2s6OmdldE5vbmUoKTsKKyAgICByZXR1cm4gSS0+TGFuZU1hc2s7CisgIH0KKworICAvLy8gTWFyayB0aGUgXHAgUGFpci5MYW5lTWFzayBsYW5lcyBvZiBccCBQYWlyLlJlZyBhcyBsaXZlLgorICAvLy8gUmV0dXJucyB0aGUgcHJldmlvdXNseSBsaXZlIGxhbmVzIG9mIFxwIFBhaXIuUmVnLgorICBMYW5lQml0bWFzayBpbnNlcnQoUmVnaXN0ZXJNYXNrUGFpciBQYWlyKSB7CisgICAgdW5zaWduZWQgU3BhcnNlSW5kZXggPSBnZXRTcGFyc2VJbmRleEZyb21SZWcoUGFpci5SZWdVbml0KTsKKyAgICBhdXRvIEluc2VydFJlcyA9IFJlZ3MuaW5zZXJ0KEluZGV4TWFza1BhaXIoU3BhcnNlSW5kZXgsIFBhaXIuTGFuZU1hc2spKTsKKyAgICBpZiAoIUluc2VydFJlcy5zZWNvbmQpIHsKKyAgICAgIExhbmVCaXRtYXNrIFByZXZNYXNrID0gSW5zZXJ0UmVzLmZpcnN0LT5MYW5lTWFzazsKKyAgICAgIEluc2VydFJlcy5maXJzdC0+TGFuZU1hc2sgfD0gUGFpci5MYW5lTWFzazsKKyAgICAgIHJldHVybiBQcmV2TWFzazsKKyAgICB9CisgICAgcmV0dXJuIExhbmVCaXRtYXNrOjpnZXROb25lKCk7CisgIH0KKworICAvLy8gQ2xlYXJzIHRoZSBccCBQYWlyLkxhbmVNYXNrIGxhbmVzIG9mIFxwIFBhaXIuUmVnIChtYXJrIHRoZW0gYXMgZGVhZCkuCisgIC8vLyBSZXR1cm5zIHRoZSBwcmV2aW91c2x5IGxpdmUgbGFuZXMgb2YgXHAgUGFpci5SZWcuCisgIExhbmVCaXRtYXNrIGVyYXNlKFJlZ2lzdGVyTWFza1BhaXIgUGFpcikgeworICAgIHVuc2lnbmVkIFNwYXJzZUluZGV4ID0gZ2V0U3BhcnNlSW5kZXhGcm9tUmVnKFBhaXIuUmVnVW5pdCk7CisgICAgUmVnU2V0OjppdGVyYXRvciBJID0gUmVncy5maW5kKFNwYXJzZUluZGV4KTsKKyAgICBpZiAoSSA9PSBSZWdzLmVuZCgpKQorICAgICAgcmV0dXJuIExhbmVCaXRtYXNrOjpnZXROb25lKCk7CisgICAgTGFuZUJpdG1hc2sgUHJldk1hc2sgPSBJLT5MYW5lTWFzazsKKyAgICBJLT5MYW5lTWFzayAmPSB+UGFpci5MYW5lTWFzazsKKyAgICByZXR1cm4gUHJldk1hc2s7CisgIH0KKworICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVncy5zaXplKCk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb250YWluZXJUPgorICB2b2lkIGFwcGVuZFRvKENvbnRhaW5lclQgJlRvKSBjb25zdCB7CisgICAgZm9yIChjb25zdCBJbmRleE1hc2tQYWlyICZQIDogUmVncykgeworICAgICAgdW5zaWduZWQgUmVnID0gZ2V0UmVnRnJvbVNwYXJzZUluZGV4KFAuSW5kZXgpOworICAgICAgaWYgKFAuTGFuZU1hc2suYW55KCkpCisgICAgICAgIFRvLnB1c2hfYmFjayhSZWdpc3Rlck1hc2tQYWlyKFJlZywgUC5MYW5lTWFzaykpOworICAgIH0KKyAgfQorfTsKKworLy8vIFRyYWNrIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHByZXNzdXJlIGF0IHNvbWUgcG9zaXRpb24gaW4gdGhlIGluc3RydWN0aW9uCisvLy8gc3RyZWFtLCBhbmQgcmVtZW1iZXIgdGhlIGhpZ2ggd2F0ZXIgbWFyayB3aXRoaW4gdGhlIHJlZ2lvbiB0cmF2ZXJzZWQuIFRoaXMKKy8vLyBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGNvbnNpZGVyIGxpdmUtdGhyb3VnaCByYW5nZXMuIFRoZSBjbGllbnQgbWF5CisvLy8gaW5kZXBlbmRlbnRseSBhZGp1c3QgZm9yIGdsb2JhbCBsaXZlbmVzcy4KKy8vLworLy8vIEVhY2ggUmVnUHJlc3N1cmVUcmFja2VyIG9ubHkgd29ya3Mgd2l0aGluIGEgTWFjaGluZUJhc2ljQmxvY2suIFByZXNzdXJlIGNhbgorLy8vIGJlIHRyYWNrZWQgYWNyb3NzIGEgbGFyZ2VyIHJlZ2lvbiBieSBzdG9yaW5nIGEgUmVnaXN0ZXJQcmVzc3VyZSByZXN1bHQgYXQKKy8vLyBlYWNoIGJsb2NrIGJvdW5kYXJ5IGFuZCBleHBsaWNpdGx5IGFkanVzdGluZyBwcmVzc3VyZSB0byBhY2NvdW50IGZvciBibG9jaworLy8vIGxpdmUtaW4gYW5kIGxpdmUtb3V0IHJlZ2lzdGVyIHNldHMuCisvLy8KKy8vLyBSZWdQcmVzc3VyZVRyYWNrZXIgaG9sZHMgYSByZWZlcmVuY2UgdG8gYSBSZWdpc3RlclByZXNzdXJlIHJlc3VsdCB0aGF0IGl0CisvLy8gY29tcHV0ZXMgaW5jcmVtZW50YWxseS4gRHVyaW5nIGRvd253YXJkIHRyYWNraW5nLCBQLkJvdHRvbUlkeCBvciBQLkJvdHRvbVBvcworLy8vIGlzIGludmFsaWQgdW50aWwgaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBibG9jayBvciBjbG9zZVJlZ2lvbigpIGlzCisvLy8gZXhwbGljaXRseSBjYWxsZWQuIFNpbWlsYXJseSwgUC5Ub3BJZHggaXMgaW52YWxpZCBkdXJpbmcgdXB3YXJkCisvLy8gdHJhY2tpbmcuIENoYW5naW5nIGRpcmVjdGlvbiBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNsb3NpbmcgcmVnaW9uLCBhbmQKKy8vLyB0cmF2ZXJzaW5nIHBhc3QgVG9wSWR4IG9yIEJvdHRvbUlkeCByZW9wZW5zIGl0LgorY2xhc3MgUmVnUHJlc3N1cmVUcmFja2VyIHsKKyAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRiA9IG51bGxwdHI7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gbnVsbHB0cjsKKyAgY29uc3QgUmVnaXN0ZXJDbGFzc0luZm8gKlJDSSA9IG51bGxwdHI7CisgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSTsKKyAgY29uc3QgTGl2ZUludGVydmFscyAqTElTID0gbnVsbHB0cjsKKworICAvLy8gV2UgY3VycmVudGx5IG9ubHkgYWxsb3cgcHJlc3N1cmUgdHJhY2tpbmcgd2l0aGluIGEgYmxvY2suCisgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBudWxscHRyOworCisgIC8vLyBUcmFjayB0aGUgbWF4IHByZXNzdXJlIHdpdGhpbiB0aGUgcmVnaW9uIHRyYXZlcnNlZCBzbyBmYXIuCisgIFJlZ2lzdGVyUHJlc3N1cmUgJlA7CisKKyAgLy8vIFJ1biBpbiB0d28gbW9kZXMgZGVwZW5kZW5kaW5nIG9uIHdoZXRoZXIgY29uc3RydWN0ZWQgd2l0aCBJbnRlcnZhbFByZXNzdXJlCisgIC8vLyBvciBSZWdpc3RlclByZXNzdXJlLiBJZiByZXF1aXJlSW50ZXJ2YWxzIGlzIGZhbHNlLCBMSVMgYXJlIGlnbm9yZWQuCisgIGJvb2wgUmVxdWlyZUludGVydmFsczsKKworICAvLy8gVHJ1ZSBpZiBVbnRpZWREZWZzIHdpbGwgYmUgcG9wdWxhdGVkLgorICBib29sIFRyYWNrVW50aWVkRGVmcyA9IGZhbHNlOworCisgIC8vLyBUcnVlIGlmIGxhbmVtYXNrcyBzaG91bGQgYmUgdHJhY2tlZC4KKyAgYm9vbCBUcmFja0xhbmVNYXNrcyA9IGZhbHNlOworCisgIC8vLyBSZWdpc3RlciBwcmVzc3VyZSBjb3JyZXNwb25kcyB0byBsaXZlbmVzcyBiZWZvcmUgdGhpcyBpbnN0cnVjdGlvbgorICAvLy8gaXRlcmF0b3IuIEl0IG1heSBwb2ludCB0byB0aGUgZW5kIG9mIHRoZSBibG9jayBvciBhIERlYnVnVmFsdWUgcmF0aGVyIHRoYW4KKyAgLy8vIGFuIGluc3RydWN0aW9uLgorICBNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgQ3VyclBvczsKKworICAvLy8gUHJlc3N1cmUgbWFwIGluZGV4ZWQgYnkgcHJlc3N1cmUgc2V0IElELCBub3QgY2xhc3MgSUQuCisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBDdXJyU2V0UHJlc3N1cmU7CisKKyAgLy8vIFNldCBvZiBsaXZlIHJlZ2lzdGVycy4KKyAgTGl2ZVJlZ1NldCBMaXZlUmVnczsKKworICAvLy8gU2V0IG9mIHZyZWcgZGVmcyB0aGF0IHN0YXJ0IGEgbGl2ZSByYW5nZS4KKyAgU3BhcnNlU2V0PHVuc2lnbmVkLCBWaXJ0UmVnMkluZGV4RnVuY3Rvcj4gVW50aWVkRGVmczsKKyAgLy8vIExpdmUtdGhyb3VnaCBwcmVzc3VyZS4KKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IExpdmVUaHJ1UHJlc3N1cmU7CisKK3B1YmxpYzoKKyAgUmVnUHJlc3N1cmVUcmFja2VyKEludGVydmFsUHJlc3N1cmUgJnJwKSA6IFAocnApLCBSZXF1aXJlSW50ZXJ2YWxzKHRydWUpIHt9CisgIFJlZ1ByZXNzdXJlVHJhY2tlcihSZWdpb25QcmVzc3VyZSAmcnApIDogUChycCksIFJlcXVpcmVJbnRlcnZhbHMoZmFsc2UpIHt9CisKKyAgdm9pZCByZXNldCgpOworCisgIHZvaWQgaW5pdChjb25zdCBNYWNoaW5lRnVuY3Rpb24gKm1mLCBjb25zdCBSZWdpc3RlckNsYXNzSW5mbyAqcmNpLAorICAgICAgICAgICAgY29uc3QgTGl2ZUludGVydmFscyAqbGlzLCBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqbWJiLAorICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIHBvcywKKyAgICAgICAgICAgIGJvb2wgVHJhY2tMYW5lTWFza3MsIGJvb2wgVHJhY2tVbnRpZWREZWZzKTsKKworICAvLy8gRm9yY2UgbGl2ZW5lc3Mgb2YgdmlydHVhbCByZWdpc3RlcnMgb3IgcGh5c2ljYWwgcmVnaXN0ZXIKKyAgLy8vIHVuaXRzLiBQYXJ0aWN1bGFybHkgdXNlZnVsIHRvIGluaXRpYWxpemUgdGhlIGxpdmVpbi9vdXQgc3RhdGUgb2YgdGhlCisgIC8vLyB0cmFja2VyIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCB0byBhZHZhbmNlL3JlY2VkZS4KKyAgdm9pZCBhZGRMaXZlUmVncyhBcnJheVJlZjxSZWdpc3Rlck1hc2tQYWlyPiBSZWdzKTsKKworICAvLy8gR2V0IHRoZSBNSSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcmVnaXN0ZXIgcHJlc3N1cmUuCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBnZXRQb3MoKSBjb25zdCB7IHJldHVybiBDdXJyUG9zOyB9CisKKyAgLy8gUmVzZXQgdGhlIE1JIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZ2lzdGVyIHByZXNzdXJlLiBUaGlzIGFsbG93cworICAvLyBzY2hlZHVsZXJzIHRvIG1vdmUgaW5zdHJ1Y3Rpb25zIGFib3ZlIHRoZSBSZWdQcmVzc3VyZVRyYWNrZXIncworICAvLyBDdXJyUG9zLiBTaW5jZSB0aGUgcHJlc3N1cmUgaXMgY29tcHV0ZWQgYmVmb3JlIEN1cnJQb3MsIHRoZSBpdGVyYXRvcgorICAvLyBwb3NpdGlvbiBjaGFuZ2VzIHdoaWxlIHByZXNzdXJlIGRvZXMgbm90LgorICB2b2lkIHNldFBvcyhNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgUG9zKSB7IEN1cnJQb3MgPSBQb3M7IH0KKworICAvLy8gUmVjZWRlIGFjcm9zcyB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgcmVjZWRlKFNtYWxsVmVjdG9ySW1wbDxSZWdpc3Rlck1hc2tQYWlyPiAqTGl2ZVVzZXMgPSBudWxscHRyKTsKKworICAvLy8gUmVjZWRlIGFjcm9zcyB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24uCisgIC8vLyBUaGlzICJsb3ctbGV2ZWwiIHZhcmlhbnQgYXNzdW1lcyB0aGF0IHJlY2VkZVNraXBEZWJ1Z1ZhbHVlcygpIHdhcworICAvLy8gY2FsbGVkIHByZXZpb3VzbHkgYW5kIHRha2VzIHByZWNvbXB1dGVkIFJlZ2lzdGVyT3BlcmFuZHMgZm9yIHRoZQorICAvLy8gaW5zdHJ1Y3Rpb24uCisgIHZvaWQgcmVjZWRlKGNvbnN0IFJlZ2lzdGVyT3BlcmFuZHMgJlJlZ09wZXJzLAorICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8UmVnaXN0ZXJNYXNrUGFpcj4gKkxpdmVVc2VzID0gbnVsbHB0cik7CisKKyAgLy8vIFJlY2VkZSB1bnRpbCB3ZSBmaW5kIGFuIGluc3RydWN0aW9uIHdoaWNoIGlzIG5vdCBhIERlYnVnVmFsdWUuCisgIHZvaWQgcmVjZWRlU2tpcERlYnVnVmFsdWVzKCk7CisKKyAgLy8vIEFkdmFuY2UgYWNyb3NzIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLgorICB2b2lkIGFkdmFuY2UoKTsKKworICAvLy8gQWR2YW5jZSBhY3Jvc3MgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uCisgIC8vLyBUaGlzIGlzIGEgImxvdy1sZXZlbCIgdmFyaWFudCBvZiBhZHZhbmNlKCkgd2hpY2ggdGFrZXMgcHJlY29tcHV0ZWQKKyAgLy8vIFJlZ2lzdGVyT3BlcmFuZHMgb2YgdGhlIGluc3RydWN0aW9uLgorICB2b2lkIGFkdmFuY2UoY29uc3QgUmVnaXN0ZXJPcGVyYW5kcyAmUmVnT3BlcnMpOworCisgIC8vLyBGaW5hbGl6ZSB0aGUgcmVnaW9uIGJvdW5kYXJpZXMgYW5kIHJlY29yZWQgbGl2ZSBpbnMgYW5kIGxpdmUgb3V0cy4KKyAgdm9pZCBjbG9zZVJlZ2lvbigpOworCisgIC8vLyBJbml0aWFsaXplIHRoZSBMaXZlVGhydSBwcmVzc3VyZSBzZXQgYmFzZWQgb24gdGhlIHVudGllZCBkZWZzIGZvdW5kIGluCisgIC8vLyBSUFRyYWNrZXIuCisgIHZvaWQgaW5pdExpdmVUaHJ1KGNvbnN0IFJlZ1ByZXNzdXJlVHJhY2tlciAmUlBUcmFja2VyKTsKKworICAvLy8gQ29weSBhbiBleGlzdGluZyBsaXZlIHRocnUgcHJlc3N1cmUgcmVzdWx0LgorICB2b2lkIGluaXRMaXZlVGhydShBcnJheVJlZjx1bnNpZ25lZD4gUHJlc3N1cmVTZXQpIHsKKyAgICBMaXZlVGhydVByZXNzdXJlLmFzc2lnbihQcmVzc3VyZVNldC5iZWdpbigpLCBQcmVzc3VyZVNldC5lbmQoKSk7CisgIH0KKworICBBcnJheVJlZjx1bnNpZ25lZD4gZ2V0TGl2ZVRocnUoKSBjb25zdCB7IHJldHVybiBMaXZlVGhydVByZXNzdXJlOyB9CisKKyAgLy8vIEdldCB0aGUgcmVzdWx0aW5nIHJlZ2lzdGVyIHByZXNzdXJlIG92ZXIgdGhlIHRyYXZlcnNlZCByZWdpb24uCisgIC8vLyBUaGlzIHJlc3VsdCBpcyBjb21wbGV0ZSBpZiBjbG9zZVJlZ2lvbigpIHdhcyBleHBsaWNpdGx5IGludm9rZWQuCisgIFJlZ2lzdGVyUHJlc3N1cmUgJmdldFByZXNzdXJlKCkgeyByZXR1cm4gUDsgfQorICBjb25zdCBSZWdpc3RlclByZXNzdXJlICZnZXRQcmVzc3VyZSgpIGNvbnN0IHsgcmV0dXJuIFA7IH0KKworICAvLy8gR2V0IHRoZSByZWdpc3RlciBzZXQgcHJlc3N1cmUgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24sIHdoaWNoIG1heSBiZSBsZXNzCisgIC8vLyB0aGFuIHRoZSBwcmVzc3VyZSBhY3Jvc3MgdGhlIHRyYXZlcnNlZCByZWdpb24uCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmZ2V0UmVnU2V0UHJlc3N1cmVBdFBvcygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3VyclNldFByZXNzdXJlOworICB9CisKKyAgYm9vbCBpc1RvcENsb3NlZCgpIGNvbnN0OworICBib29sIGlzQm90dG9tQ2xvc2VkKCkgY29uc3Q7CisKKyAgdm9pZCBjbG9zZVRvcCgpOworICB2b2lkIGNsb3NlQm90dG9tKCk7CisKKyAgLy8vIENvbnNpZGVyIHRoZSBwcmVzc3VyZSBpbmNyZWFzZSBjYXVzZWQgYnkgdHJhdmVyc2luZyB0aGlzIGluc3RydWN0aW9uCisgIC8vLyBib3R0b20tdXAuIEZpbmQgdGhlIHByZXNzdXJlIHNldCB3aXRoIHRoZSBtb3N0IGNoYW5nZSBiZXlvbmQgaXRzIHByZXNzdXJlCisgIC8vLyBsaW1pdCBiYXNlZCBvbiB0aGUgdHJhY2tlcidzIGN1cnJlbnQgcHJlc3N1cmUsIGFuZCByZWNvcmQgdGhlIG51bWJlciBvZgorICAvLy8gZXhjZXNzIHJlZ2lzdGVyIHVuaXRzIG9mIHRoYXQgcHJlc3N1cmUgc2V0IGludHJvZHVjZWQgYnkgdGhpcyBpbnN0cnVjdGlvbi4KKyAgdm9pZCBnZXRNYXhVcHdhcmRQcmVzc3VyZURlbHRhKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVzc3VyZURpZmYgKlBEaWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnUHJlc3N1cmVEZWx0YSAmRGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQcmVzc3VyZUNoYW5nZT4gQ3JpdGljYWxQU2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBNYXhQcmVzc3VyZUxpbWl0KTsKKworICB2b2lkIGdldFVwd2FyZFByZXNzdXJlRGVsdGEoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29uc3QqLyBQcmVzc3VyZURpZmYgJlBEaWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnUHJlc3N1cmVEZWx0YSAmRGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQcmVzc3VyZUNoYW5nZT4gQ3JpdGljYWxQU2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBNYXhQcmVzc3VyZUxpbWl0KSBjb25zdDsKKworICAvLy8gQ29uc2lkZXIgdGhlIHByZXNzdXJlIGluY3JlYXNlIGNhdXNlZCBieSB0cmF2ZXJzaW5nIHRoaXMgaW5zdHJ1Y3Rpb24KKyAgLy8vIHRvcC1kb3duLiBGaW5kIHRoZSBwcmVzc3VyZSBzZXQgd2l0aCB0aGUgbW9zdCBjaGFuZ2UgYmV5b25kIGl0cyBwcmVzc3VyZQorICAvLy8gbGltaXQgYmFzZWQgb24gdGhlIHRyYWNrZXIncyBjdXJyZW50IHByZXNzdXJlLCBhbmQgcmVjb3JkIHRoZSBudW1iZXIgb2YKKyAgLy8vIGV4Y2VzcyByZWdpc3RlciB1bml0cyBvZiB0aGF0IHByZXNzdXJlIHNldCBpbnRyb2R1Y2VkIGJ5IHRoaXMgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgZ2V0TWF4RG93bndhcmRQcmVzc3VyZURlbHRhKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1ByZXNzdXJlRGVsdGEgJkRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQcmVzc3VyZUNoYW5nZT4gQ3JpdGljYWxQU2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IE1heFByZXNzdXJlTGltaXQpOworCisgIC8vLyBGaW5kIHRoZSBwcmVzc3VyZSBzZXQgd2l0aCB0aGUgbW9zdCBjaGFuZ2UgYmV5b25kIGl0cyBwcmVzc3VyZSBsaW1pdCBhZnRlcgorICAvLy8gdHJhdmVyc2luZyB0aGlzIGluc3RydWN0aW9uIGVpdGhlciB1cHdhcmQgb3IgZG93bndhcmQgZGVwZW5kaW5nIG9uIHRoZQorICAvLy8gY2xvc2VkIGVuZCBvZiB0aGUgY3VycmVudCByZWdpb24uCisgIHZvaWQgZ2V0TWF4UHJlc3N1cmVEZWx0YShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnUHJlc3N1cmVEZWx0YSAmRGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQcmVzc3VyZUNoYW5nZT4gQ3JpdGljYWxQU2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBNYXhQcmVzc3VyZUxpbWl0KSB7CisgICAgaWYgKGlzVG9wQ2xvc2VkKCkpCisgICAgICByZXR1cm4gZ2V0TWF4RG93bndhcmRQcmVzc3VyZURlbHRhKE1JLCBEZWx0YSwgQ3JpdGljYWxQU2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4UHJlc3N1cmVMaW1pdCk7CisKKyAgICBhc3NlcnQoaXNCb3R0b21DbG9zZWQoKSAmJiAiVW5pbml0aWFsaXplZCBwcmVzc3VyZSB0cmFja2VyIik7CisgICAgcmV0dXJuIGdldE1heFVwd2FyZFByZXNzdXJlRGVsdGEoTUksIG51bGxwdHIsIERlbHRhLCBDcml0aWNhbFBTZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heFByZXNzdXJlTGltaXQpOworICB9CisKKyAgLy8vIEdldCB0aGUgcHJlc3N1cmUgb2YgZWFjaCBQU2V0IGFmdGVyIHRyYXZlcnNpbmcgdGhpcyBpbnN0cnVjdGlvbiBib3R0b20tdXAuCisgIHZvaWQgZ2V0VXB3YXJkUHJlc3N1cmUoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJlByZXNzdXJlUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmTWF4UHJlc3N1cmVSZXN1bHQpOworCisgIC8vLyBHZXQgdGhlIHByZXNzdXJlIG9mIGVhY2ggUFNldCBhZnRlciB0cmF2ZXJzaW5nIHRoaXMgaW5zdHJ1Y3Rpb24gdG9wLWRvd24uCisgIHZvaWQgZ2V0RG93bndhcmRQcmVzc3VyZShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZQcmVzc3VyZVJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmTWF4UHJlc3N1cmVSZXN1bHQpOworCisgIHZvaWQgZ2V0UHJlc3N1cmVBZnRlckluc3QoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJlByZXNzdXJlUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmTWF4UHJlc3N1cmVSZXN1bHQpIHsKKyAgICBpZiAoaXNUb3BDbG9zZWQoKSkKKyAgICAgIHJldHVybiBnZXRVcHdhcmRQcmVzc3VyZShNSSwgUHJlc3N1cmVSZXN1bHQsIE1heFByZXNzdXJlUmVzdWx0KTsKKworICAgIGFzc2VydChpc0JvdHRvbUNsb3NlZCgpICYmICJVbmluaXRpYWxpemVkIHByZXNzdXJlIHRyYWNrZXIiKTsKKyAgICByZXR1cm4gZ2V0RG93bndhcmRQcmVzc3VyZShNSSwgUHJlc3N1cmVSZXN1bHQsIE1heFByZXNzdXJlUmVzdWx0KTsKKyAgfQorCisgIGJvb2wgaGFzVW50aWVkRGVmKHVuc2lnbmVkIFZpcnRSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gVW50aWVkRGVmcy5jb3VudChWaXJ0UmVnKTsKKyAgfQorCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIC8vLyBBZGQgUmVnIHRvIHRoZSBsaXZlIG91dCBzZXQgYW5kIGluY3JlYXNlIG1heCBwcmVzc3VyZS4KKyAgdm9pZCBkaXNjb3ZlckxpdmVPdXQoUmVnaXN0ZXJNYXNrUGFpciBQYWlyKTsKKyAgLy8vIEFkZCBSZWcgdG8gdGhlIGxpdmUgaW4gc2V0IGFuZCBpbmNyZWFzZSBtYXggcHJlc3N1cmUuCisgIHZvaWQgZGlzY292ZXJMaXZlSW4oUmVnaXN0ZXJNYXNrUGFpciBQYWlyKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgU2xvdEluZGV4IGZvciB0aGUgZmlyc3Qgbm9uZGVidWcgaW5zdHJ1Y3Rpb24gaW5jbHVkaW5nIG9yCisgIC8vLyBhZnRlciB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgU2xvdEluZGV4IGdldEN1cnJTbG90KCkgY29uc3Q7CisKKyAgdm9pZCBpbmNyZWFzZVJlZ1ByZXNzdXJlKHVuc2lnbmVkIFJlZ1VuaXQsIExhbmVCaXRtYXNrIFByZXZpb3VzTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExhbmVCaXRtYXNrIE5ld01hc2spOworICB2b2lkIGRlY3JlYXNlUmVnUHJlc3N1cmUodW5zaWduZWQgUmVnVW5pdCwgTGFuZUJpdG1hc2sgUHJldmlvdXNNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFuZUJpdG1hc2sgTmV3TWFzayk7CisKKyAgdm9pZCBidW1wRGVhZERlZnMoQXJyYXlSZWY8UmVnaXN0ZXJNYXNrUGFpcj4gRGVhZERlZnMpOworCisgIHZvaWQgYnVtcFVwd2FyZFByZXNzdXJlKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpOworICB2b2lkIGJ1bXBEb3dud2FyZFByZXNzdXJlKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpOworCisgIHZvaWQgZGlzY292ZXJMaXZlSW5Pck91dChSZWdpc3Rlck1hc2tQYWlyIFBhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8UmVnaXN0ZXJNYXNrUGFpcj4gJkxpdmVJbk9yT3V0KTsKKworICBMYW5lQml0bWFzayBnZXRMYXN0VXNlZExhbmVzKHVuc2lnbmVkIFJlZ1VuaXQsIFNsb3RJbmRleCBQb3MpIGNvbnN0OworICBMYW5lQml0bWFzayBnZXRMaXZlTGFuZXNBdCh1bnNpZ25lZCBSZWdVbml0LCBTbG90SW5kZXggUG9zKSBjb25zdDsKKyAgTGFuZUJpdG1hc2sgZ2V0TGl2ZVRocm91Z2hBdCh1bnNpZ25lZCBSZWdVbml0LCBTbG90SW5kZXggUG9zKSBjb25zdDsKK307CisKK3ZvaWQgZHVtcFJlZ1NldFByZXNzdXJlKEFycmF5UmVmPHVuc2lnbmVkPiBTZXRQcmVzc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9SRUdJU1RFUlBSRVNTVVJFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdpc3RlclNjYXZlbmdpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdpc3RlclNjYXZlbmdpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODljNzJiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1JlZ2lzdGVyU2NhdmVuZ2luZy5oCkBAIC0wLDAgKzEsMjMxIEBACisvLz09PS0gUmVnaXN0ZXJTY2F2ZW5naW5nLmggLSBNYWNoaW5lIHJlZ2lzdGVyIHNjYXZlbmdpbmcgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgbWFjaGluZSByZWdpc3RlciBzY2F2ZW5nZXIgY2xhc3MuIEl0IGNhbiBwcm92aWRlCisvLy8gaW5mb3JtYXRpb24gc3VjaCBhcyB1bnVzZWQgcmVnaXN0ZXIgYXQgYW55IHBvaW50IGluIGEgbWFjaGluZSBiYXNpYyBibG9jay4KKy8vLyBJdCBhbHNvIHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIG1ha2UgcmVnaXN0ZXJzIGF2YWlsYWJsZSBieSBldmljdGluZyB0aGVtCisvLy8gdG8gc3BpbGwgc2xvdHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fUkVHSVNURVJTQ0FWRU5HSU5HX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1JFR0lTVEVSU0NBVkVOR0lOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaXZlUmVnVW5pdHMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTGFuZUJpdG1hc2suaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CitjbGFzcyBUYXJnZXRSZWdpc3RlckNsYXNzOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworCitjbGFzcyBSZWdTY2F2ZW5nZXIgeworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisgIE1hY2hpbmVSZWdpc3RlckluZm8qIE1SSTsKKyAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IG51bGxwdHI7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNQkJJOworICB1bnNpZ25lZCBOdW1SZWdVbml0cyA9IDA7CisKKyAgLy8vIFRydWUgaWYgUmVnU2NhdmVuZ2VyIGlzIGN1cnJlbnRseSB0cmFja2luZyB0aGUgbGl2ZW5lc3Mgb2YgcmVnaXN0ZXJzLgorICBib29sIFRyYWNraW5nID0gZmFsc2U7CisKKyAgLy8vIEluZm9ybWF0aW9uIG9uIHNjYXZlbmdlZCByZWdpc3RlcnMgKGhlbGQgaW4gYSBzcGlsbCBzbG90KS4KKyAgc3RydWN0IFNjYXZlbmdlZEluZm8geworICAgIFNjYXZlbmdlZEluZm8oaW50IEZJID0gLTEpIDogRnJhbWVJbmRleChGSSkge30KKworICAgIC8vLyBBIHNwaWxsIHNsb3QgdXNlZCBmb3Igc2NhdmVuZ2luZyBhIHJlZ2lzdGVyIHBvc3QgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKyAgICBpbnQgRnJhbWVJbmRleDsKKworICAgIC8vLyBJZiBub24temVybywgdGhlIHNwZWNpZmljIHJlZ2lzdGVyIGlzIGN1cnJlbnRseSBiZWluZworICAgIC8vLyBzY2F2ZW5nZWQuIFRoYXQgaXMsIGl0IGlzIHNwaWxsZWQgdG8gdGhpcyBzY2F2ZW5naW5nIHN0YWNrIHNsb3QuCisgICAgdW5zaWduZWQgUmVnID0gMDsKKworICAgIC8vLyBUaGUgaW5zdHJ1Y3Rpb24gdGhhdCByZXN0b3JlcyB0aGUgc2NhdmVuZ2VkIHJlZ2lzdGVyIGZyb20gc3RhY2suCisgICAgY29uc3QgTWFjaGluZUluc3RyICpSZXN0b3JlID0gbnVsbHB0cjsKKyAgfTsKKworICAvLy8gQSB2ZWN0b3Igb2YgaW5mb3JtYXRpb24gb24gc2NhdmVuZ2VkIHJlZ2lzdGVycy4KKyAgU21hbGxWZWN0b3I8U2NhdmVuZ2VkSW5mbywgMj4gU2NhdmVuZ2VkOworCisgIExpdmVSZWdVbml0cyBMaXZlVW5pdHM7CisKKyAgLy8gVGhlc2UgQml0VmVjdG9ycyBhcmUgb25seSB1c2VkIGludGVybmFsbHkgdG8gZm9yd2FyZCgpLiBUaGV5IGFyZSBtZW1iZXJzCisgIC8vIHRvIGF2b2lkIGZyZXF1ZW50IHJlYWxsb2NhdGlvbnMuCisgIEJpdFZlY3RvciBLaWxsUmVnVW5pdHMsIERlZlJlZ1VuaXRzOworICBCaXRWZWN0b3IgVG1wUmVnVW5pdHM7CisKK3B1YmxpYzoKKyAgUmVnU2NhdmVuZ2VyKCkgPSBkZWZhdWx0OworCisgIC8vLyBTdGFydCB0cmFja2luZyBsaXZlbmVzcyBmcm9tIHRoZSBiZWdpbiBvZiBiYXNpYyBibG9jayBccCBNQkIuCisgIHZvaWQgZW50ZXJCYXNpY0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworCisgIC8vLyBTdGFydCB0cmFja2luZyBsaXZlbmVzcyBmcm9tIHRoZSBlbmQgb2YgYmFzaWMgYmxvY2sgXHAgTUJCLgorICAvLy8gVXNlIGJhY2t3YXJkKCkgdG8gbW92ZSB0b3dhcmRzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJsb2NrLiBUaGlzIGlzCisgIC8vLyBwcmVmZXJyZWQgdG8gZW50ZXJCYXNpY0Jsb2NrKCkgYW5kIGZvcndhcmQoKSBiZWNhdXNlIGl0IGRvZXMgbm90IGRlcGVuZAorICAvLy8gb24gdGhlIHByZXNlbmNlIG9mIGtpbGwgZmxhZ3MuCisgIHZvaWQgZW50ZXJCYXNpY0Jsb2NrRW5kKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworCisgIC8vLyBNb3ZlIHRoZSBpbnRlcm5hbCBNQkIgaXRlcmF0b3IgYW5kIHVwZGF0ZSByZWdpc3RlciBzdGF0ZXMuCisgIHZvaWQgZm9yd2FyZCgpOworCisgIC8vLyBNb3ZlIHRoZSBpbnRlcm5hbCBNQkIgaXRlcmF0b3IgYW5kIHVwZGF0ZSByZWdpc3RlciBzdGF0ZXMgdW50aWwKKyAgLy8vIGl0IGhhcyBwcm9jZXNzZWQgdGhlIHNwZWNpZmljIGl0ZXJhdG9yLgorICB2b2lkIGZvcndhcmQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIHsKKyAgICBpZiAoIVRyYWNraW5nICYmIE1CQi0+YmVnaW4oKSAhPSBJKSBmb3J3YXJkKCk7CisgICAgd2hpbGUgKE1CQkkgIT0gSSkgZm9yd2FyZCgpOworICB9CisKKyAgLy8vIEludmVydCB0aGUgYmVoYXZpb3Igb2YgZm9yd2FyZCgpIG9uIHRoZSBjdXJyZW50IGluc3RydWN0aW9uICh1bmRvIHRoZQorICAvLy8gY2hhbmdlcyB0byB0aGUgYXZhaWxhYmxlIHJlZ2lzdGVycyBtYWRlIGJ5IGZvcndhcmQoKSkuCisgIHZvaWQgdW5wcm9jZXNzKCk7CisKKyAgLy8vIFVucHJvY2VzcyBpbnN0cnVjdGlvbnMgdW50aWwgeW91IHJlYWNoIHRoZSBwcm92aWRlZCBpdGVyYXRvci4KKyAgdm9pZCB1bnByb2Nlc3MoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIHsKKyAgICB3aGlsZSAoTUJCSSAhPSBJKSB1bnByb2Nlc3MoKTsKKyAgfQorCisgIC8vLyBVcGRhdGUgaW50ZXJuYWwgcmVnaXN0ZXIgc3RhdGUgYW5kIG1vdmUgTUJCIGl0ZXJhdG9yIGJhY2t3YXJkcy4KKyAgLy8vIENvbnRyYXJ5IHRvIHVucHJvY2VzcygpIHRoaXMgbWV0aG9kIGdpdmVzIHByZWNpc2UgcmVzdWx0cyBldmVuIGluIHRoZQorICAvLy8gYWJzZW5jZSBvZiBraWxsIGZsYWdzLgorICB2b2lkIGJhY2t3YXJkKCk7CisKKyAgLy8vIENhbGwgYmFja3dhcmQoKSBhcyBsb25nIGFzIHRoZSBpbnRlcm5hbCBpdGVyYXRvciBkb2VzIG5vdCBwb2ludCB0byBccCBJLgorICB2b2lkIGJhY2t3YXJkKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJKSB7CisgICAgd2hpbGUgKE1CQkkgIT0gSSkKKyAgICAgIGJhY2t3YXJkKCk7CisgIH0KKworICAvLy8gTW92ZSB0aGUgaW50ZXJuYWwgTUJCIGl0ZXJhdG9yIGJ1dCBkbyBub3QgdXBkYXRlIHJlZ2lzdGVyIHN0YXRlcy4KKyAgdm9pZCBza2lwVG8oTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIHsKKyAgICBpZiAoSSA9PSBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IobnVsbHB0cikpCisgICAgICBUcmFja2luZyA9IGZhbHNlOworICAgIE1CQkkgPSBJOworICB9CisKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIGdldEN1cnJlbnRQb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIE1CQkk7IH0KKworICAvLy8gUmV0dXJuIGlmIGEgc3BlY2lmaWMgcmVnaXN0ZXIgaXMgY3VycmVudGx5IHVzZWQuCisgIGJvb2wgaXNSZWdVc2VkKHVuc2lnbmVkIFJlZywgYm9vbCBpbmNsdWRlUmVzZXJ2ZWQgPSB0cnVlKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGFsbCBhdmFpbGFibGUgcmVnaXN0ZXJzIGluIHRoZSByZWdpc3RlciBjbGFzcyBpbiBNYXNrLgorICBCaXRWZWN0b3IgZ2V0UmVnc0F2YWlsYWJsZShjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyk7CisKKyAgLy8vIEZpbmQgYW4gdW51c2VkIHJlZ2lzdGVyIG9mIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgY2xhc3MuCisgIC8vLyBSZXR1cm4gMCBpZiBub25lIGlzIGZvdW5kLgorICB1bnNpZ25lZCBGaW5kVW51c2VkUmVnKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJlZ0NsYXNzKSBjb25zdDsKKworICAvLy8gQWRkIGEgc2NhdmVuZ2luZyBmcmFtZSBpbmRleC4KKyAgdm9pZCBhZGRTY2F2ZW5naW5nRnJhbWVJbmRleChpbnQgRkkpIHsKKyAgICBTY2F2ZW5nZWQucHVzaF9iYWNrKFNjYXZlbmdlZEluZm8oRkkpKTsKKyAgfQorCisgIC8vLyBRdWVyeSB3aGV0aGVyIGEgZnJhbWUgaW5kZXggaXMgYSBzY2F2ZW5naW5nIGZyYW1lIGluZGV4LgorICBib29sIGlzU2NhdmVuZ2luZ0ZyYW1lSW5kZXgoaW50IEZJKSBjb25zdCB7CisgICAgZm9yIChTbWFsbFZlY3RvckltcGw8U2NhdmVuZ2VkSW5mbz46OmNvbnN0X2l0ZXJhdG9yIEkgPSBTY2F2ZW5nZWQuYmVnaW4oKSwKKyAgICAgICAgIElFID0gU2NhdmVuZ2VkLmVuZCgpOyBJICE9IElFOyArK0kpCisgICAgICBpZiAoSS0+RnJhbWVJbmRleCA9PSBGSSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gR2V0IGFuIGFycmF5IG9mIHNjYXZlbmdpbmcgZnJhbWUgaW5kaWNlcy4KKyAgdm9pZCBnZXRTY2F2ZW5naW5nRnJhbWVJbmRpY2VzKFNtYWxsVmVjdG9ySW1wbDxpbnQ+ICZBKSBjb25zdCB7CisgICAgZm9yIChTbWFsbFZlY3RvckltcGw8U2NhdmVuZ2VkSW5mbz46OmNvbnN0X2l0ZXJhdG9yIEkgPSBTY2F2ZW5nZWQuYmVnaW4oKSwKKyAgICAgICAgIElFID0gU2NhdmVuZ2VkLmVuZCgpOyBJICE9IElFOyArK0kpCisgICAgICBpZiAoSS0+RnJhbWVJbmRleCA+PSAwKQorICAgICAgICBBLnB1c2hfYmFjayhJLT5GcmFtZUluZGV4KTsKKyAgfQorCisgIC8vLyBNYWtlIGEgcmVnaXN0ZXIgb2YgdGhlIHNwZWNpZmljIHJlZ2lzdGVyIGNsYXNzCisgIC8vLyBhdmFpbGFibGUgYW5kIGRvIHRoZSBhcHByb3ByaWF0ZSBib29ra2VlcGluZy4gU1BBZGogaXMgdGhlIHN0YWNrCisgIC8vLyBhZGp1c3RtZW50IGR1ZSB0byBjYWxsIGZyYW1lLCBpdCdzIHBhc3NlZCBhbG9uZyB0byBlbGltaW5hdGVGcmFtZUluZGV4KCkuCisgIC8vLyBSZXR1cm5zIHRoZSBzY2F2ZW5nZWQgcmVnaXN0ZXIuCisgIC8vLyBUaGlzIGlzIGRlcHJlY2F0ZWQgYXMgaXQgZGVwZW5kcyBvbiB0aGUgcXVhbGl0eSBvZiB0aGUga2lsbCBmbGFncyBiZWluZworICAvLy8gcHJlc2VudDsgVXNlIHNjYXZlbmdlUmVnaXN0ZXJCYWNrd2FyZHMoKSBpbnN0ZWFkIQorICB1bnNpZ25lZCBzY2F2ZW5nZVJlZ2lzdGVyKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJlZ0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLCBpbnQgU1BBZGopOworICB1bnNpZ25lZCBzY2F2ZW5nZVJlZ2lzdGVyKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJlZ0NsYXNzLCBpbnQgU1BBZGopIHsKKyAgICByZXR1cm4gc2NhdmVuZ2VSZWdpc3RlcihSZWdDbGFzcywgTUJCSSwgU1BBZGopOworICB9CisKKyAgLy8vIE1ha2UgYSByZWdpc3RlciBvZiB0aGUgc3BlY2lmaWMgcmVnaXN0ZXIgY2xhc3MgYXZhaWxhYmxlIGZyb20gdGhlIGN1cnJlbnQKKyAgLy8vIHBvc2l0aW9uIGJhY2t3YXJkcyB0byB0aGUgcGxhY2UgYmVmb3JlIFxwIFRvLiBJZiBccCBSZXN0b3JlQWZ0ZXIgaXMgdHJ1ZQorICAvLy8gdGhpcyBpbmNsdWRlcyB0aGUgaW5zdHJ1Y3Rpb24gZm9sbG93aW5nIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAvLy8gU1BBZGogaXMgdGhlIHN0YWNrIGFkanVzdG1lbnQgZHVlIHRvIGNhbGwgZnJhbWUsIGl0J3MgcGFzc2VkIGFsb25nIHRvCisgIC8vLyBlbGltaW5hdGVGcmFtZUluZGV4KCkuCisgIC8vLyBSZXR1cm5zIHRoZSBzY2F2ZW5nZWQgcmVnaXN0ZXIuCisgIHVuc2lnbmVkIHNjYXZlbmdlUmVnaXN0ZXJCYWNrd2FyZHMoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAmUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVzdG9yZUFmdGVyLCBpbnQgU1BBZGopOworCisgIC8vLyBUZWxsIHRoZSBzY2F2ZW5nZXIgYSByZWdpc3RlciBpcyB1c2VkLgorICB2b2lkIHNldFJlZ1VzZWQodW5zaWduZWQgUmVnLCBMYW5lQml0bWFzayBMYW5lTWFzayA9IExhbmVCaXRtYXNrOjpnZXRBbGwoKSk7CisKK3ByaXZhdGU6CisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYSByZWdpc3RlciBpcyByZXNlcnZlZC4gSXQgaXMgbmV2ZXIgInVudXNlZCIuCisgIGJvb2wgaXNSZXNlcnZlZCh1bnNpZ25lZCBSZWcpIGNvbnN0IHsgcmV0dXJuIE1SSS0+aXNSZXNlcnZlZChSZWcpOyB9CisKKyAgLy8vIHNldFVzZWQgLyBzZXRVbnVzZWQgLSBNYXJrIHRoZSBzdGF0ZSBvZiBvbmUgb3IgYSBudW1iZXIgb2YgcmVnaXN0ZXIgdW5pdHMuCisgIC8vLworICB2b2lkIHNldFVzZWQoY29uc3QgQml0VmVjdG9yICZSZWdVbml0cykgeworICAgIExpdmVVbml0cy5hZGRVbml0cyhSZWdVbml0cyk7CisgIH0KKyAgdm9pZCBzZXRVbnVzZWQoY29uc3QgQml0VmVjdG9yICZSZWdVbml0cykgeworICAgIExpdmVVbml0cy5yZW1vdmVVbml0cyhSZWdVbml0cyk7CisgIH0KKworICAvLy8gUHJvY2Vzc2VzIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIGFuZCBmaWxsIHRoZSBLaWxsUmVnVW5pdHMgYW5kCisgIC8vLyBEZWZSZWdVbml0cyBiaXQgdmVjdG9ycy4KKyAgdm9pZCBkZXRlcm1pbmVLaWxsc0FuZERlZnMoKTsKKworICAvLy8gQWRkIGFsbCBSZWcgVW5pdHMgdGhhdCBSZWcgY29udGFpbnMgdG8gQlYuCisgIHZvaWQgYWRkUmVnVW5pdHMoQml0VmVjdG9yICZCViwgdW5zaWduZWQgUmVnKTsKKworICAvLy8gUmVtb3ZlIGFsbCBSZWcgVW5pdHMgdGhhdCBccCBSZWcgY29udGFpbnMgZnJvbSBccCBCVi4KKyAgdm9pZCByZW1vdmVSZWdVbml0cyhCaXRWZWN0b3IgJkJWLCB1bnNpZ25lZCBSZWcpOworCisgIC8vLyBSZXR1cm4gdGhlIGNhbmRpZGF0ZSByZWdpc3RlciB0aGF0IGlzIHVudXNlZCBmb3IgdGhlIGxvbmdlc3QgYWZ0ZXIKKyAgLy8vIFN0YXJ0TUkuIFVzZU1JIGlzIHNldCB0byB0aGUgaW5zdHJ1Y3Rpb24gd2hlcmUgdGhlIHNlYXJjaCBzdG9wcGVkLgorICAvLy8KKyAgLy8vIE5vIG1vcmUgdGhhbiBJbnN0ckxpbWl0IGluc3RydWN0aW9ucyBhcmUgaW5zcGVjdGVkLgorICB1bnNpZ25lZCBmaW5kU3Vydml2b3JSZWcoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFN0YXJ0TUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRWZWN0b3IgJkNhbmRpZGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbnN0ckxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZVc2VNSSk7CisKKyAgLy8vIEluaXRpYWxpemUgUmVnaXN0ZXJTY2F2ZW5nZXIuCisgIHZvaWQgaW5pdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKworICAvLy8gTWFyayBsaXZlLWluIHJlZ2lzdGVycyBvZiBiYXNpYyBibG9jayBhcyB1c2VkLgorICB2b2lkIHNldExpdmVJbnNVc2VkKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworCisgIC8vLyBTcGlsbCBhIHJlZ2lzdGVyIGFmdGVyIHBvc2l0aW9uIFxwIEFmdGVyIGFuZCByZWxvYWQgaXQgYmVmb3JlIHBvc2l0aW9uCisgIC8vLyBccCBVc2VNSS4KKyAgU2NhdmVuZ2VkSW5mbyAmc3BpbGwodW5zaWduZWQgUmVnLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICZSQywgaW50IFNQQWRqLAorICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgQWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmVXNlTUkpOworfTsKKworLy8vIFJlcGxhY2VzIGFsbCBmcmFtZSBpbmRleCB2aXJ0dWFsIHJlZ2lzdGVycyB3aXRoIHBoeXNpY2FsIHJlZ2lzdGVycy4gVXNlcyB0aGUKKy8vLyByZWdpc3RlciBzY2F2ZW5nZXIgdG8gZmluZCBhbiBhcHByb3ByaWF0ZSByZWdpc3RlciB0byB1c2UuCit2b2lkIHNjYXZlbmdlRnJhbWVWaXJ0dWFsUmVncyhNYWNoaW5lRnVuY3Rpb24gJk1GLCBSZWdTY2F2ZW5nZXIgJlJTKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9SRUdJU1RFUlNDQVZFTkdJTkdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1JlZ2lzdGVyVXNhZ2VJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVnaXN0ZXJVc2FnZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJhZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1JlZ2lzdGVyVXNhZ2VJbmZvLmgKQEAgLTAsMCArMSw3NyBAQAorLy89PS0gUmVnaXN0ZXJVc2FnZUluZm8uaCAtIFJlZ2lzdGVyIFVzYWdlIEluZm9ybWFydGlvbiBTdG9yYWdlIC0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFRoaXMgcGFzcyBpcyByZXF1aXJlZCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgaW50ZXJwcm9jZWR1cmFsIHJlZ2lzdGVyCisvLy8gYWxsb2NhdGlvbiBpbmZyYXN0cnVjdHVyZS4KKy8vLworLy8vIFRoaXMgcGFzcyBpcyBzaW1wbGUgaW1tdXRhYmxlIHBhc3Mgd2hpY2gga2VlcHMgUmVnTWFza3MgKGNhbGN1bGF0ZWQgYmFzZWQgb24KKy8vLyBhY3R1YWwgcmVnaXN0ZXIgYWxsb2NhdGlvbikgZm9yIGZ1bmN0aW9ucyBpbiBhIG1vZHVsZSBhbmQgcHJvdmlkZXMgc2ltcGxlCisvLy8gQVBJIHRvIHF1ZXJ5IHRoaXMgaW5mb3JtYXRpb24uCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1BIWVNJQ0FMUkVHSVNURVJVU0FHRUlORk9fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUEhZU0lDQUxSRUdJU1RFUlVTQUdFSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBUYXJnZXRNYWNoaW5lOworCitjbGFzcyBQaHlzaWNhbFJlZ2lzdGVyVXNhZ2VJbmZvIDogcHVibGljIEltbXV0YWJsZVBhc3MgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgUGh5c2ljYWxSZWdpc3RlclVzYWdlSW5mbygpIDogSW1tdXRhYmxlUGFzcyhJRCkgeworICAgIFBhc3NSZWdpc3RyeSAmUmVnaXN0cnkgPSAqUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKTsKKyAgICBpbml0aWFsaXplUGh5c2ljYWxSZWdpc3RlclVzYWdlSW5mb1Bhc3MoUmVnaXN0cnkpOworICB9CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZSB7CisgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7CisgIH0KKworICAvLy8gVG8gc2V0IFRhcmdldE1hY2hpbmUgKiwgd2hpY2ggaXMgdXNlZCB0byBwcmludAorICAvLy8gYW5hbHlzaXMgd2hlbiBjb21tYW5kIGxpbmUgb3B0aW9uIC1wcmludC1yZWd1c2FnZSBpcyB1c2VkLgorICB2b2lkIHNldFRhcmdldE1hY2hpbmUoY29uc3QgVGFyZ2V0TWFjaGluZSAqVE1fKSB7IFRNID0gVE1fOyB9CisKKyAgYm9vbCBkb0luaXRpYWxpemF0aW9uKE1vZHVsZSAmTSkgb3ZlcnJpZGU7CisKKyAgYm9vbCBkb0ZpbmFsaXphdGlvbihNb2R1bGUgJk0pIG92ZXJyaWRlOworCisgIC8vLyBUbyBzdG9yZSBSZWdNYXNrIGZvciBnaXZlbiBGdW5jdGlvbiAqLgorICB2b2lkIHN0b3JlVXBkYXRlUmVnVXNhZ2VJbmZvKGNvbnN0IEZ1bmN0aW9uICpGUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gUmVnTWFzayk7CisKKyAgLy8vIFRvIHF1ZXJ5IHN0b3JlZCBSZWdNYXNrIGZvciBnaXZlbiBGdW5jdGlvbiAqLCBpdCB3aWxsIHJldHVybiBudWxscHRyIGlmCisgIC8vLyBmdW5jdGlvbiBpcyBub3Qga25vd24uCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiAqZ2V0UmVnVXNhZ2VJbmZvKGNvbnN0IEZ1bmN0aW9uICpGUCk7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSAqTSA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAvLy8gQSBEZW5zZSBtYXAgZnJvbSBGdW5jdGlvbiAqIHRvIFJlZ01hc2suCisgIC8vLyBJbiBSZWdNYXNrIDAgbWVhbnMgcmVnaXN0ZXIgdXNlZCAoY2xvYmJlcmVkKSBieSBmdW5jdGlvbi4KKyAgLy8vIGFuZCAxIG1lYW5zIGNvbnRlbnQgb2YgcmVnaXN0ZXIgd2lsbCBiZSBwcmVzZXJ2ZWQgYXJvdW5kIGZ1bmN0aW9uIGNhbGwuCisgIERlbnNlTWFwPGNvbnN0IEZ1bmN0aW9uICosIHN0ZDo6dmVjdG9yPHVpbnQzMl90Pj4gUmVnTWFza3M7CisKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAqVE07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1BIWVNJQ0FMUkVHSVNURVJVU0FHRUlORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1Jlc291cmNlUHJpb3JpdHlRdWV1ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1Jlc291cmNlUHJpb3JpdHlRdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMTY2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVzb3VyY2VQcmlvcml0eVF1ZXVlLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8vPT09LS0tLS0gUmVzb3VyY2VQcmlvcml0eVF1ZXVlLmggLSBBIERGQS1vcmllbnRlZCBwcmlvcml0eSBxdWV1ZSAtLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgUmVzb3VyY2VQcmlvcml0eVF1ZXVlIGNsYXNzLCB3aGljaCBpcyBhCisvLyBTY2hlZHVsaW5nUHJpb3JpdHlRdWV1ZSB0aGF0IHNjaGVkdWxlcyB1c2luZyBERkEgc3RhdGUgdG8KKy8vIHJlZHVjZSB0aGUgbGVuZ3RoIG9mIHRoZSBjcml0aWNhbCBwYXRoIHRocm91Z2ggdGhlIGJhc2ljIGJsb2NrCisvLyBvbiBWTElXIHBsYXRmb3Jtcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9SRVNPVVJDRVBSSU9SSVRZUVVFVUVfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUkVTT1VSQ0VQUklPUklUWVFVRVVFX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9ERkFQYWNrZXRpemVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR0lTZWwuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0ckl0aW5lcmFyaWVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgUmVzb3VyY2VQcmlvcml0eVF1ZXVlOworCisgIC8vLyBTb3J0aW5nIGZ1bmN0aW9ucyBmb3IgdGhlIEF2YWlsYWJsZSBxdWV1ZS4KKyAgc3RydWN0IHJlc291cmNlX3NvcnQgeworICAgIFJlc291cmNlUHJpb3JpdHlRdWV1ZSAqUFE7CisgICAgZXhwbGljaXQgcmVzb3VyY2Vfc29ydChSZXNvdXJjZVByaW9yaXR5UXVldWUgKnBxKSA6IFBRKHBxKSB7fQorCisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFNVbml0KiBsZWZ0LCBjb25zdCBTVW5pdCogcmlnaHQpIGNvbnN0OworICB9OworCisgIGNsYXNzIFJlc291cmNlUHJpb3JpdHlRdWV1ZSA6IHB1YmxpYyBTY2hlZHVsaW5nUHJpb3JpdHlRdWV1ZSB7CisgICAgLy8vIFNVbml0cyAtIFRoZSBTVW5pdHMgZm9yIHRoZSBjdXJyZW50IGdyYXBoLgorICAgIHN0ZDo6dmVjdG9yPFNVbml0PiAqU1VuaXRzOworCisgICAgLy8vIE51bU5vZGVzU29sZWx5QmxvY2tpbmcgLSBUaGlzIHZlY3RvciBjb250YWlucywgZm9yIGV2ZXJ5IG5vZGUgaW4gdGhlCisgICAgLy8vIFF1ZXVlLCB0aGUgbnVtYmVyIG9mIG5vZGVzIHRoYXQgdGhlIG5vZGUgaXMgdGhlIHNvbGUgdW5zY2hlZHVsZWQKKyAgICAvLy8gcHJlZGVjZXNzb3IgZm9yLiAgVGhpcyBpcyB1c2VkIGFzIGEgdGllLWJyZWFrZXIgaGV1cmlzdGljIGZvciBiZXR0ZXIKKyAgICAvLy8gbW9iaWxpdHkuCisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IE51bU5vZGVzU29sZWx5QmxvY2tpbmc7CisKKyAgICAvLy8gUXVldWUgLSBUaGUgcXVldWUuCisgICAgc3RkOjp2ZWN0b3I8U1VuaXQqPiBRdWV1ZTsKKworICAgIC8vLyBSZWdQcmVzc3VyZSAtIFRyYWNraW5nIGN1cnJlbnQgcmVnIHByZXNzdXJlIHBlciByZWdpc3RlciBjbGFzcy4KKyAgICAvLy8KKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gUmVnUHJlc3N1cmU7CisKKyAgICAvLy8gUmVnTGltaXQgLSBUcmFja2luZyB0aGUgbnVtYmVyIG9mIGFsbG9jYXRhYmxlIHJlZ2lzdGVycyBwZXIgcmVnaXN0ZXIKKyAgICAvLy8gY2xhc3MuCisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IFJlZ0xpbWl0OworCisgICAgcmVzb3VyY2Vfc29ydCBQaWNrZXI7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkk7CisgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgKlRMSTsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSTsKKyAgICBjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEqIEluc3RySXRpbnM7CisgICAgLy8vIFJlc291cmNlc01vZGVsIC0gUmVwcmVzZW50cyBWTElXIHN0YXRlLgorICAgIC8vLyBOb3QgbGltaXRlZCB0byBWTElXIHRhcmdldHMgcGVyIHNheSwgYnV0IGFzc3VtZXMKKyAgICAvLy8gZGVmaW5pdGlvbiBvZiBERkEgYnkgYSB0YXJnZXQuCisgICAgc3RkOjp1bmlxdWVfcHRyPERGQVBhY2tldGl6ZXI+IFJlc291cmNlc01vZGVsOworCisgICAgLy8vIFJlc291cmNlIG1vZGVsIC0gcGFja2V0L2J1bmRsZSBtb2RlbC4gUHVyZWx5CisgICAgLy8vIGludGVybmFsIGF0IHRoZSB0aW1lLgorICAgIHN0ZDo6dmVjdG9yPFNVbml0Kj4gUGFja2V0OworCisgICAgLy8vIEhldXJpc3RpY3MgZm9yIGVzdGltYXRpbmcgcmVnaXN0ZXIgcHJlc3N1cmUuCisgICAgdW5zaWduZWQgUGFyYWxsZWxMaXZlUmFuZ2VzOworICAgIGludCBIb3Jpem9udGFsVmVydGljYWxCYWxhbmNlOworCisgIHB1YmxpYzoKKyAgICBSZXNvdXJjZVByaW9yaXR5UXVldWUoU2VsZWN0aW9uREFHSVNlbCAqSVMpOworCisgICAgYm9vbCBpc0JvdHRvbVVwKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIHZvaWQgaW5pdE5vZGVzKHN0ZDo6dmVjdG9yPFNVbml0PiAmc3VuaXRzKSBvdmVycmlkZTsKKworICAgIHZvaWQgYWRkTm9kZShjb25zdCBTVW5pdCAqU1UpIG92ZXJyaWRlIHsKKyAgICAgIE51bU5vZGVzU29sZWx5QmxvY2tpbmcucmVzaXplKFNVbml0cy0+c2l6ZSgpLCAwKTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZU5vZGUoY29uc3QgU1VuaXQgKlNVKSBvdmVycmlkZSB7fQorCisgICAgdm9pZCByZWxlYXNlU3RhdGUoKSBvdmVycmlkZSB7CisgICAgICBTVW5pdHMgPSBudWxscHRyOworICAgIH0KKworICAgIHVuc2lnbmVkIGdldExhdGVuY3kodW5zaWduZWQgTm9kZU51bSkgY29uc3QgeworICAgICAgYXNzZXJ0KE5vZGVOdW0gPCAoKlNVbml0cykuc2l6ZSgpKTsKKyAgICAgIHJldHVybiAoKlNVbml0cylbTm9kZU51bV0uZ2V0SGVpZ2h0KCk7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0TnVtU29sZWx5QmxvY2tOb2Rlcyh1bnNpZ25lZCBOb2RlTnVtKSBjb25zdCB7CisgICAgICBhc3NlcnQoTm9kZU51bSA8IE51bU5vZGVzU29sZWx5QmxvY2tpbmcuc2l6ZSgpKTsKKyAgICAgIHJldHVybiBOdW1Ob2Rlc1NvbGVseUJsb2NraW5nW05vZGVOdW1dOworICAgIH0KKworICAgIC8vLyBTaW5nbGUgY29zdCBmdW5jdGlvbiByZWZsZWN0aW5nIGJlbmVmaXQgb2Ygc2NoZWR1bGluZyBTVQorICAgIC8vLyBpbiB0aGUgY3VycmVudCBjeWNsZS4KKyAgICBpbnQgU1VTY2hlZHVsaW5nQ29zdCAoU1VuaXQgKlNVKTsKKworICAgIC8vLyBJbml0TnVtUmVnRGVmc0xlZnQgLSBEZXRlcm1pbmUgdGhlICMgb2YgcmVncyBkZWZpbmVkIGJ5IHRoaXMgbm9kZS4KKyAgICAvLy8KKyAgICB2b2lkIGluaXROdW1SZWdEZWZzTGVmdChTVW5pdCAqU1UpOworICAgIHZvaWQgdXBkYXRlTnVtUmVnRGVmc0xlZnQoU1VuaXQgKlNVKTsKKyAgICBpbnQgcmVnUHJlc3N1cmVEZWx0YShTVW5pdCAqU1UsIGJvb2wgUmF3UHJlc3N1cmUgPSBmYWxzZSk7CisgICAgaW50IHJhd1JlZ1ByZXNzdXJlRGVsdGEgKFNVbml0ICpTVSwgdW5zaWduZWQgUkNJZCk7CisKKyAgICBib29sIGVtcHR5KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gUXVldWUuZW1wdHkoKTsgfQorCisgICAgdm9pZCBwdXNoKFNVbml0ICpVKSBvdmVycmlkZTsKKworICAgIFNVbml0ICpwb3AoKSBvdmVycmlkZTsKKworICAgIHZvaWQgcmVtb3ZlKFNVbml0ICpTVSkgb3ZlcnJpZGU7CisKKyAgICAvLy8gc2NoZWR1bGVkTm9kZSAtIE1haW4gcmVzb3VyY2UgdHJhY2tpbmcgcG9pbnQuCisgICAgdm9pZCBzY2hlZHVsZWROb2RlKFNVbml0ICpOb2RlKSBvdmVycmlkZTsKKyAgICBib29sIGlzUmVzb3VyY2VBdmFpbGFibGUoU1VuaXQgKlNVKTsKKyAgICB2b2lkIHJlc2VydmVSZXNvdXJjZXMoU1VuaXQgKlNVKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIGFkanVzdFByaW9yaXR5T2ZVbnNjaGVkdWxlZFByZWRzKFNVbml0ICpTVSk7CisgICAgU1VuaXQgKmdldFNpbmdsZVVuc2NoZWR1bGVkUHJlZChTVW5pdCAqU1UpOworICAgIHVuc2lnbmVkIG51bWJlclJDVmFsUHJlZEluU1UgKFNVbml0ICpTVSwgdW5zaWduZWQgUkNJZCk7CisgICAgdW5zaWduZWQgbnVtYmVyUkNWYWxTdWNjSW5TVSAoU1VuaXQgKlNVLCB1bnNpZ25lZCBSQ0lkKTsKKyAgfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUnVudGltZUxpYmNhbGxzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SdW50aW1lTGliY2FsbHMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZDkwZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUnVudGltZUxpYmNhbGxzLmRlZgpAQCAtMCwwICsxLDUyNyBAQAorLy89PT0tLSBsbHZtL1J1bnRpbWVMaWJjYWxscy5kZWYgLSBGaWxlIHRoYXQgZGVzY3JpYmVzIGxpYmNhbGxzIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgb2YgdGhlIHJ1bnRpbWUgbGlicmFyeSBjYWxscyB0aGUgYmFja2VuZCBjYW4gZW1pdC4KKy8vIFRoZSB2YXJpb3VzIGxvbmcgZG91YmxlIHR5cGVzIGNhbm5vdCBiZSBtZXJnZWQsIGJlY2F1c2UgODAtYml0IGxpYnJhcnkKKy8vIGZ1bmN0aW9ucyB1c2UgInhmIiBhbmQgMTI4LWJpdCB1c2UgInRmIi4KKy8vCisvLyBXaGVuIGFkZGluZyBQUENGMTI4IGZ1bmN0aW9ucyBoZXJlLCBub3RlIHRoYXQgdGhlaXIgbmFtZXMgZ2VuZXJhbGx5IG5lZWQKKy8vIHRvIGJlIG92ZXJyaWRkZW4gZm9yIERhcndpbiB3aXRoIHRoZSB4eHgkTERCTDEyOCBmb3JtLiAgU2VlCisvLyBQUENJU2VsTG93ZXJpbmcuY3BwLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIE5PVEU6IE5PIElOQ0xVREUgR1VBUkQgREVTSVJFRCEKKworLy8gUHJvdmlkZSBkZWZpbml0aW9ucyBvZiBtYWNyb3Mgc28gdGhhdCB1c2VycyBvZiB0aGlzIGZpbGUgZG8gbm90IGhhdmUgdG8KKy8vIGRlZmluZSBldmVyeXRoaW5nIHRvIHVzZSBpdC4uLgorCisvLyBEZWNsYXJlIHRoZSBlbnVtZXJhdG9yIGZvciBlYWNoIGxpYmNhbGwsIGFsb25nIHdpdGggaXRzIGRlZmF1bHQgbmFtZS4gU29tZQorLy8gbGliY2FsbHMgaGF2ZSBkaWZmZXJlbnQgbmFtZXMgb24gcGFydGljdWxhciBPU2VzIG9yIGFyY2hpdGVjdHVyZXMuIFRoZXNlCisvLyBhcmUgc2V0IGluIEluaXRMaWJjYWxsTmFtZXMoKSBpbiBUYXJnZXRMb3dlcmluZ0Jhc2UuY3BwIGFuZC9vciBieSB0YXJnZXRzCisvLyB1c2luZyBUYXJnZXRMb3dlcmluZ0Jhc2U6OnNldExpYmNhbGxOYW1lKCkKKyNpZm5kZWYgSEFORExFX0xJQkNBTEwKKyNlcnJvciAiSEFORExFX0xJQkNBTEwgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKKy8vIEludGVnZXIKK0hBTkRMRV9MSUJDQUxMKFNITF9JMTYsICJfX2FzaGxoaTMiKQorSEFORExFX0xJQkNBTEwoU0hMX0kzMiwgIl9fYXNobHNpMyIpCitIQU5ETEVfTElCQ0FMTChTSExfSTY0LCAiX19hc2hsZGkzIikKK0hBTkRMRV9MSUJDQUxMKFNITF9JMTI4LCAiX19hc2hsdGkzIikKK0hBTkRMRV9MSUJDQUxMKFNSTF9JMTYsICJfX2xzaHJoaTMiKQorSEFORExFX0xJQkNBTEwoU1JMX0kzMiwgIl9fbHNocnNpMyIpCitIQU5ETEVfTElCQ0FMTChTUkxfSTY0LCAiX19sc2hyZGkzIikKK0hBTkRMRV9MSUJDQUxMKFNSTF9JMTI4LCAiX19sc2hydGkzIikKK0hBTkRMRV9MSUJDQUxMKFNSQV9JMTYsICJfX2FzaHJoaTMiKQorSEFORExFX0xJQkNBTEwoU1JBX0kzMiwgIl9fYXNocnNpMyIpCitIQU5ETEVfTElCQ0FMTChTUkFfSTY0LCAiX19hc2hyZGkzIikKK0hBTkRMRV9MSUJDQUxMKFNSQV9JMTI4LCAiX19hc2hydGkzIikKK0hBTkRMRV9MSUJDQUxMKE1VTF9JOCwgIl9fbXVscWkzIikKK0hBTkRMRV9MSUJDQUxMKE1VTF9JMTYsICJfX211bGhpMyIpCitIQU5ETEVfTElCQ0FMTChNVUxfSTMyLCAiX19tdWxzaTMiKQorSEFORExFX0xJQkNBTEwoTVVMX0k2NCwgIl9fbXVsZGkzIikKK0hBTkRMRV9MSUJDQUxMKE1VTF9JMTI4LCAiX19tdWx0aTMiKQorSEFORExFX0xJQkNBTEwoTVVMT19JMzIsICJfX211bG9zaTQiKQorSEFORExFX0xJQkNBTEwoTVVMT19JNjQsICJfX211bG9kaTQiKQorSEFORExFX0xJQkNBTEwoTVVMT19JMTI4LCAiX19tdWxvdGk0IikKK0hBTkRMRV9MSUJDQUxMKFNESVZfSTgsICJfX2RpdnFpMyIpCitIQU5ETEVfTElCQ0FMTChTRElWX0kxNiwgIl9fZGl2aGkzIikKK0hBTkRMRV9MSUJDQUxMKFNESVZfSTMyLCAiX19kaXZzaTMiKQorSEFORExFX0xJQkNBTEwoU0RJVl9JNjQsICJfX2RpdmRpMyIpCitIQU5ETEVfTElCQ0FMTChTRElWX0kxMjgsICJfX2RpdnRpMyIpCitIQU5ETEVfTElCQ0FMTChVRElWX0k4LCAiX191ZGl2cWkzIikKK0hBTkRMRV9MSUJDQUxMKFVESVZfSTE2LCAiX191ZGl2aGkzIikKK0hBTkRMRV9MSUJDQUxMKFVESVZfSTMyLCAiX191ZGl2c2kzIikKK0hBTkRMRV9MSUJDQUxMKFVESVZfSTY0LCAiX191ZGl2ZGkzIikKK0hBTkRMRV9MSUJDQUxMKFVESVZfSTEyOCwgIl9fdWRpdnRpMyIpCitIQU5ETEVfTElCQ0FMTChTUkVNX0k4LCAiX19tb2RxaTMiKQorSEFORExFX0xJQkNBTEwoU1JFTV9JMTYsICJfX21vZGhpMyIpCitIQU5ETEVfTElCQ0FMTChTUkVNX0kzMiwgIl9fbW9kc2kzIikKK0hBTkRMRV9MSUJDQUxMKFNSRU1fSTY0LCAiX19tb2RkaTMiKQorSEFORExFX0xJQkNBTEwoU1JFTV9JMTI4LCAiX19tb2R0aTMiKQorSEFORExFX0xJQkNBTEwoVVJFTV9JOCwgIl9fdW1vZHFpMyIpCitIQU5ETEVfTElCQ0FMTChVUkVNX0kxNiwgIl9fdW1vZGhpMyIpCitIQU5ETEVfTElCQ0FMTChVUkVNX0kzMiwgIl9fdW1vZHNpMyIpCitIQU5ETEVfTElCQ0FMTChVUkVNX0k2NCwgIl9fdW1vZGRpMyIpCitIQU5ETEVfTElCQ0FMTChVUkVNX0kxMjgsICJfX3Vtb2R0aTMiKQorSEFORExFX0xJQkNBTEwoU0RJVlJFTV9JOCwgbnVsbHB0cikKK0hBTkRMRV9MSUJDQUxMKFNESVZSRU1fSTE2LCBudWxscHRyKQorSEFORExFX0xJQkNBTEwoU0RJVlJFTV9JMzIsIG51bGxwdHIpCitIQU5ETEVfTElCQ0FMTChTRElWUkVNX0k2NCwgbnVsbHB0cikKK0hBTkRMRV9MSUJDQUxMKFNESVZSRU1fSTEyOCwgbnVsbHB0cikKK0hBTkRMRV9MSUJDQUxMKFVESVZSRU1fSTgsIG51bGxwdHIpCitIQU5ETEVfTElCQ0FMTChVRElWUkVNX0kxNiwgbnVsbHB0cikKK0hBTkRMRV9MSUJDQUxMKFVESVZSRU1fSTMyLCBudWxscHRyKQorSEFORExFX0xJQkNBTEwoVURJVlJFTV9JNjQsIG51bGxwdHIpCitIQU5ETEVfTElCQ0FMTChVRElWUkVNX0kxMjgsIG51bGxwdHIpCitIQU5ETEVfTElCQ0FMTChORUdfSTMyLCAiX19uZWdzaTIiKQorSEFORExFX0xJQkNBTEwoTkVHX0k2NCwgIl9fbmVnZGkyIikKKworLy8gRmxvYXRpbmctcG9pbnQKK0hBTkRMRV9MSUJDQUxMKEFERF9GMzIsICJfX2FkZHNmMyIpCitIQU5ETEVfTElCQ0FMTChBRERfRjY0LCAiX19hZGRkZjMiKQorSEFORExFX0xJQkNBTEwoQUREX0Y4MCwgIl9fYWRkeGYzIikKK0hBTkRMRV9MSUJDQUxMKEFERF9GMTI4LCAiX19hZGR0ZjMiKQorSEFORExFX0xJQkNBTEwoQUREX1BQQ0YxMjgsICJfX2djY19xYWRkIikKK0hBTkRMRV9MSUJDQUxMKFNVQl9GMzIsICJfX3N1YnNmMyIpCitIQU5ETEVfTElCQ0FMTChTVUJfRjY0LCAiX19zdWJkZjMiKQorSEFORExFX0xJQkNBTEwoU1VCX0Y4MCwgIl9fc3VieGYzIikKK0hBTkRMRV9MSUJDQUxMKFNVQl9GMTI4LCAiX19zdWJ0ZjMiKQorSEFORExFX0xJQkNBTEwoU1VCX1BQQ0YxMjgsICJfX2djY19xc3ViIikKK0hBTkRMRV9MSUJDQUxMKE1VTF9GMzIsICJfX211bHNmMyIpCitIQU5ETEVfTElCQ0FMTChNVUxfRjY0LCAiX19tdWxkZjMiKQorSEFORExFX0xJQkNBTEwoTVVMX0Y4MCwgIl9fbXVseGYzIikKK0hBTkRMRV9MSUJDQUxMKE1VTF9GMTI4LCAiX19tdWx0ZjMiKQorSEFORExFX0xJQkNBTEwoTVVMX1BQQ0YxMjgsICJfX2djY19xbXVsIikKK0hBTkRMRV9MSUJDQUxMKERJVl9GMzIsICJfX2RpdnNmMyIpCitIQU5ETEVfTElCQ0FMTChESVZfRjY0LCAiX19kaXZkZjMiKQorSEFORExFX0xJQkNBTEwoRElWX0Y4MCwgIl9fZGl2eGYzIikKK0hBTkRMRV9MSUJDQUxMKERJVl9GMTI4LCAiX19kaXZ0ZjMiKQorSEFORExFX0xJQkNBTEwoRElWX1BQQ0YxMjgsICJfX2djY19xZGl2IikKK0hBTkRMRV9MSUJDQUxMKFJFTV9GMzIsICJmbW9kZiIpCitIQU5ETEVfTElCQ0FMTChSRU1fRjY0LCAiZm1vZCIpCitIQU5ETEVfTElCQ0FMTChSRU1fRjgwLCAiZm1vZGwiKQorSEFORExFX0xJQkNBTEwoUkVNX0YxMjgsICJmbW9kbCIpCitIQU5ETEVfTElCQ0FMTChSRU1fUFBDRjEyOCwgImZtb2RsIikKK0hBTkRMRV9MSUJDQUxMKEZNQV9GMzIsICJmbWFmIikKK0hBTkRMRV9MSUJDQUxMKEZNQV9GNjQsICJmbWEiKQorSEFORExFX0xJQkNBTEwoRk1BX0Y4MCwgImZtYWwiKQorSEFORExFX0xJQkNBTEwoRk1BX0YxMjgsICJmbWFsIikKK0hBTkRMRV9MSUJDQUxMKEZNQV9QUENGMTI4LCAiZm1hbCIpCitIQU5ETEVfTElCQ0FMTChQT1dJX0YzMiwgIl9fcG93aXNmMiIpCitIQU5ETEVfTElCQ0FMTChQT1dJX0Y2NCwgIl9fcG93aWRmMiIpCitIQU5ETEVfTElCQ0FMTChQT1dJX0Y4MCwgIl9fcG93aXhmMiIpCitIQU5ETEVfTElCQ0FMTChQT1dJX0YxMjgsICJfX3Bvd2l0ZjIiKQorSEFORExFX0xJQkNBTEwoUE9XSV9QUENGMTI4LCAiX19wb3dpdGYyIikKK0hBTkRMRV9MSUJDQUxMKFNRUlRfRjMyLCAic3FydGYiKQorSEFORExFX0xJQkNBTEwoU1FSVF9GNjQsICJzcXJ0IikKK0hBTkRMRV9MSUJDQUxMKFNRUlRfRjgwLCAic3FydGwiKQorSEFORExFX0xJQkNBTEwoU1FSVF9GMTI4LCAic3FydGwiKQorSEFORExFX0xJQkNBTEwoU1FSVF9QUENGMTI4LCAic3FydGwiKQorSEFORExFX0xJQkNBTEwoTE9HX0YzMiwgImxvZ2YiKQorSEFORExFX0xJQkNBTEwoTE9HX0Y2NCwgImxvZyIpCitIQU5ETEVfTElCQ0FMTChMT0dfRjgwLCAibG9nbCIpCitIQU5ETEVfTElCQ0FMTChMT0dfRjEyOCwgImxvZ2wiKQorSEFORExFX0xJQkNBTEwoTE9HX1BQQ0YxMjgsICJsb2dsIikKK0hBTkRMRV9MSUJDQUxMKExPR19GSU5JVEVfRjMyLCAiX19sb2dmX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChMT0dfRklOSVRFX0Y2NCwgIl9fbG9nX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChMT0dfRklOSVRFX0Y4MCwgIl9fbG9nbF9maW5pdGUiKQorSEFORExFX0xJQkNBTEwoTE9HX0ZJTklURV9GMTI4LCAiX19sb2dsX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChMT0dfRklOSVRFX1BQQ0YxMjgsICJfX2xvZ2xfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKExPRzJfRjMyLCAibG9nMmYiKQorSEFORExFX0xJQkNBTEwoTE9HMl9GNjQsICJsb2cyIikKK0hBTkRMRV9MSUJDQUxMKExPRzJfRjgwLCAibG9nMmwiKQorSEFORExFX0xJQkNBTEwoTE9HMl9GMTI4LCAibG9nMmwiKQorSEFORExFX0xJQkNBTEwoTE9HMl9QUENGMTI4LCAibG9nMmwiKQorSEFORExFX0xJQkNBTEwoTE9HMl9GSU5JVEVfRjMyLCAiX19sb2cyZl9maW5pdGUiKQorSEFORExFX0xJQkNBTEwoTE9HMl9GSU5JVEVfRjY0LCAiX19sb2cyX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChMT0cyX0ZJTklURV9GODAsICJfX2xvZzJsX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChMT0cyX0ZJTklURV9GMTI4LCAiX19sb2cybF9maW5pdGUiKQorSEFORExFX0xJQkNBTEwoTE9HMl9GSU5JVEVfUFBDRjEyOCwgIl9fbG9nMmxfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKExPRzEwX0YzMiwgImxvZzEwZiIpCitIQU5ETEVfTElCQ0FMTChMT0cxMF9GNjQsICJsb2cxMCIpCitIQU5ETEVfTElCQ0FMTChMT0cxMF9GODAsICJsb2cxMGwiKQorSEFORExFX0xJQkNBTEwoTE9HMTBfRjEyOCwgImxvZzEwbCIpCitIQU5ETEVfTElCQ0FMTChMT0cxMF9QUENGMTI4LCAibG9nMTBsIikKK0hBTkRMRV9MSUJDQUxMKExPRzEwX0ZJTklURV9GMzIsICJfX2xvZzEwZl9maW5pdGUiKQorSEFORExFX0xJQkNBTEwoTE9HMTBfRklOSVRFX0Y2NCwgIl9fbG9nMTBfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKExPRzEwX0ZJTklURV9GODAsICJfX2xvZzEwbF9maW5pdGUiKQorSEFORExFX0xJQkNBTEwoTE9HMTBfRklOSVRFX0YxMjgsICJfX2xvZzEwbF9maW5pdGUiKQorSEFORExFX0xJQkNBTEwoTE9HMTBfRklOSVRFX1BQQ0YxMjgsICJfX2xvZzEwbF9maW5pdGUiKQorSEFORExFX0xJQkNBTEwoRVhQX0YzMiwgImV4cGYiKQorSEFORExFX0xJQkNBTEwoRVhQX0Y2NCwgImV4cCIpCitIQU5ETEVfTElCQ0FMTChFWFBfRjgwLCAiZXhwbCIpCitIQU5ETEVfTElCQ0FMTChFWFBfRjEyOCwgImV4cGwiKQorSEFORExFX0xJQkNBTEwoRVhQX1BQQ0YxMjgsICJleHBsIikKK0hBTkRMRV9MSUJDQUxMKEVYUF9GSU5JVEVfRjMyLCAiX19leHBmX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChFWFBfRklOSVRFX0Y2NCwgIl9fZXhwX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChFWFBfRklOSVRFX0Y4MCwgIl9fZXhwbF9maW5pdGUiKQorSEFORExFX0xJQkNBTEwoRVhQX0ZJTklURV9GMTI4LCAiX19leHBsX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChFWFBfRklOSVRFX1BQQ0YxMjgsICJfX2V4cGxfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKEVYUDJfRjMyLCAiZXhwMmYiKQorSEFORExFX0xJQkNBTEwoRVhQMl9GNjQsICJleHAyIikKK0hBTkRMRV9MSUJDQUxMKEVYUDJfRjgwLCAiZXhwMmwiKQorSEFORExFX0xJQkNBTEwoRVhQMl9GMTI4LCAiZXhwMmwiKQorSEFORExFX0xJQkNBTEwoRVhQMl9QUENGMTI4LCAiZXhwMmwiKQorSEFORExFX0xJQkNBTEwoRVhQMl9GSU5JVEVfRjMyLCAiX19leHAyZl9maW5pdGUiKQorSEFORExFX0xJQkNBTEwoRVhQMl9GSU5JVEVfRjY0LCAiX19leHAyX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChFWFAyX0ZJTklURV9GODAsICJfX2V4cDJsX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChFWFAyX0ZJTklURV9GMTI4LCAiX19leHAybF9maW5pdGUiKQorSEFORExFX0xJQkNBTEwoRVhQMl9GSU5JVEVfUFBDRjEyOCwgIl9fZXhwMmxfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKFNJTl9GMzIsICJzaW5mIikKK0hBTkRMRV9MSUJDQUxMKFNJTl9GNjQsICJzaW4iKQorSEFORExFX0xJQkNBTEwoU0lOX0Y4MCwgInNpbmwiKQorSEFORExFX0xJQkNBTEwoU0lOX0YxMjgsICJzaW5sIikKK0hBTkRMRV9MSUJDQUxMKFNJTl9QUENGMTI4LCAic2lubCIpCitIQU5ETEVfTElCQ0FMTChDT1NfRjMyLCAiY29zZiIpCitIQU5ETEVfTElCQ0FMTChDT1NfRjY0LCAiY29zIikKK0hBTkRMRV9MSUJDQUxMKENPU19GODAsICJjb3NsIikKK0hBTkRMRV9MSUJDQUxMKENPU19GMTI4LCAiY29zbCIpCitIQU5ETEVfTElCQ0FMTChDT1NfUFBDRjEyOCwgImNvc2wiKQorSEFORExFX0xJQkNBTEwoU0lOQ09TX0YzMiwgbnVsbHB0cikKK0hBTkRMRV9MSUJDQUxMKFNJTkNPU19GNjQsIG51bGxwdHIpCitIQU5ETEVfTElCQ0FMTChTSU5DT1NfRjgwLCBudWxscHRyKQorSEFORExFX0xJQkNBTEwoU0lOQ09TX0YxMjgsIG51bGxwdHIpCitIQU5ETEVfTElCQ0FMTChTSU5DT1NfUFBDRjEyOCwgbnVsbHB0cikKK0hBTkRMRV9MSUJDQUxMKFNJTkNPU19TVFJFVF9GMzIsIG51bGxwdHIpCitIQU5ETEVfTElCQ0FMTChTSU5DT1NfU1RSRVRfRjY0LCBudWxscHRyKQorSEFORExFX0xJQkNBTEwoUE9XX0YzMiwgInBvd2YiKQorSEFORExFX0xJQkNBTEwoUE9XX0Y2NCwgInBvdyIpCitIQU5ETEVfTElCQ0FMTChQT1dfRjgwLCAicG93bCIpCitIQU5ETEVfTElCQ0FMTChQT1dfRjEyOCwgInBvd2wiKQorSEFORExFX0xJQkNBTEwoUE9XX1BQQ0YxMjgsICJwb3dsIikKK0hBTkRMRV9MSUJDQUxMKFBPV19GSU5JVEVfRjMyLCAiX19wb3dmX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChQT1dfRklOSVRFX0Y2NCwgIl9fcG93X2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChQT1dfRklOSVRFX0Y4MCwgIl9fcG93bF9maW5pdGUiKQorSEFORExFX0xJQkNBTEwoUE9XX0ZJTklURV9GMTI4LCAiX19wb3dsX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChQT1dfRklOSVRFX1BQQ0YxMjgsICJfX3Bvd2xfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKENFSUxfRjMyLCAiY2VpbGYiKQorSEFORExFX0xJQkNBTEwoQ0VJTF9GNjQsICJjZWlsIikKK0hBTkRMRV9MSUJDQUxMKENFSUxfRjgwLCAiY2VpbGwiKQorSEFORExFX0xJQkNBTEwoQ0VJTF9GMTI4LCAiY2VpbGwiKQorSEFORExFX0xJQkNBTEwoQ0VJTF9QUENGMTI4LCAiY2VpbGwiKQorSEFORExFX0xJQkNBTEwoVFJVTkNfRjMyLCAidHJ1bmNmIikKK0hBTkRMRV9MSUJDQUxMKFRSVU5DX0Y2NCwgInRydW5jIikKK0hBTkRMRV9MSUJDQUxMKFRSVU5DX0Y4MCwgInRydW5jbCIpCitIQU5ETEVfTElCQ0FMTChUUlVOQ19GMTI4LCAidHJ1bmNsIikKK0hBTkRMRV9MSUJDQUxMKFRSVU5DX1BQQ0YxMjgsICJ0cnVuY2wiKQorSEFORExFX0xJQkNBTEwoUklOVF9GMzIsICJyaW50ZiIpCitIQU5ETEVfTElCQ0FMTChSSU5UX0Y2NCwgInJpbnQiKQorSEFORExFX0xJQkNBTEwoUklOVF9GODAsICJyaW50bCIpCitIQU5ETEVfTElCQ0FMTChSSU5UX0YxMjgsICJyaW50bCIpCitIQU5ETEVfTElCQ0FMTChSSU5UX1BQQ0YxMjgsICJyaW50bCIpCitIQU5ETEVfTElCQ0FMTChORUFSQllJTlRfRjMyLCAibmVhcmJ5aW50ZiIpCitIQU5ETEVfTElCQ0FMTChORUFSQllJTlRfRjY0LCAibmVhcmJ5aW50IikKK0hBTkRMRV9MSUJDQUxMKE5FQVJCWUlOVF9GODAsICJuZWFyYnlpbnRsIikKK0hBTkRMRV9MSUJDQUxMKE5FQVJCWUlOVF9GMTI4LCAibmVhcmJ5aW50bCIpCitIQU5ETEVfTElCQ0FMTChORUFSQllJTlRfUFBDRjEyOCwgIm5lYXJieWludGwiKQorSEFORExFX0xJQkNBTEwoUk9VTkRfRjMyLCAicm91bmRmIikKK0hBTkRMRV9MSUJDQUxMKFJPVU5EX0Y2NCwgInJvdW5kIikKK0hBTkRMRV9MSUJDQUxMKFJPVU5EX0Y4MCwgInJvdW5kbCIpCitIQU5ETEVfTElCQ0FMTChST1VORF9GMTI4LCAicm91bmRsIikKK0hBTkRMRV9MSUJDQUxMKFJPVU5EX1BQQ0YxMjgsICJyb3VuZGwiKQorSEFORExFX0xJQkNBTEwoRkxPT1JfRjMyLCAiZmxvb3JmIikKK0hBTkRMRV9MSUJDQUxMKEZMT09SX0Y2NCwgImZsb29yIikKK0hBTkRMRV9MSUJDQUxMKEZMT09SX0Y4MCwgImZsb29ybCIpCitIQU5ETEVfTElCQ0FMTChGTE9PUl9GMTI4LCAiZmxvb3JsIikKK0hBTkRMRV9MSUJDQUxMKEZMT09SX1BQQ0YxMjgsICJmbG9vcmwiKQorSEFORExFX0xJQkNBTEwoQ09QWVNJR05fRjMyLCAiY29weXNpZ25mIikKK0hBTkRMRV9MSUJDQUxMKENPUFlTSUdOX0Y2NCwgImNvcHlzaWduIikKK0hBTkRMRV9MSUJDQUxMKENPUFlTSUdOX0Y4MCwgImNvcHlzaWdubCIpCitIQU5ETEVfTElCQ0FMTChDT1BZU0lHTl9GMTI4LCAiY29weXNpZ25sIikKK0hBTkRMRV9MSUJDQUxMKENPUFlTSUdOX1BQQ0YxMjgsICJjb3B5c2lnbmwiKQorSEFORExFX0xJQkNBTEwoRk1JTl9GMzIsICJmbWluZiIpCitIQU5ETEVfTElCQ0FMTChGTUlOX0Y2NCwgImZtaW4iKQorSEFORExFX0xJQkNBTEwoRk1JTl9GODAsICJmbWlubCIpCitIQU5ETEVfTElCQ0FMTChGTUlOX0YxMjgsICJmbWlubCIpCitIQU5ETEVfTElCQ0FMTChGTUlOX1BQQ0YxMjgsICJmbWlubCIpCitIQU5ETEVfTElCQ0FMTChGTUFYX0YzMiwgImZtYXhmIikKK0hBTkRMRV9MSUJDQUxMKEZNQVhfRjY0LCAiZm1heCIpCitIQU5ETEVfTElCQ0FMTChGTUFYX0Y4MCwgImZtYXhsIikKK0hBTkRMRV9MSUJDQUxMKEZNQVhfRjEyOCwgImZtYXhsIikKK0hBTkRMRV9MSUJDQUxMKEZNQVhfUFBDRjEyOCwgImZtYXhsIikKKworLy8gQ29udmVyc2lvbgorSEFORExFX0xJQkNBTEwoRlBFWFRfRjMyX1BQQ0YxMjgsICJfX2djY19zdG9xIikKK0hBTkRMRV9MSUJDQUxMKEZQRVhUX0Y2NF9QUENGMTI4LCAiX19nY2NfZHRvcSIpCitIQU5ETEVfTElCQ0FMTChGUEVYVF9GODBfRjEyOCwgIl9fZXh0ZW5keGZ0ZjIiKQorSEFORExFX0xJQkNBTEwoRlBFWFRfRjY0X0YxMjgsICJfX2V4dGVuZGRmdGYyIikKK0hBTkRMRV9MSUJDQUxMKEZQRVhUX0YzMl9GMTI4LCAiX19leHRlbmRzZnRmMiIpCitIQU5ETEVfTElCQ0FMTChGUEVYVF9GMzJfRjY0LCAiX19leHRlbmRzZmRmMiIpCitIQU5ETEVfTElCQ0FMTChGUEVYVF9GMTZfRjMyLCAiX19nbnVfaDJmX2llZWUiKQorSEFORExFX0xJQkNBTEwoRlBST1VORF9GMzJfRjE2LCAiX19nbnVfZjJoX2llZWUiKQorSEFORExFX0xJQkNBTEwoRlBST1VORF9GNjRfRjE2LCAiX190cnVuY2RmaGYyIikKK0hBTkRMRV9MSUJDQUxMKEZQUk9VTkRfRjgwX0YxNiwgIl9fdHJ1bmN4ZmhmMiIpCitIQU5ETEVfTElCQ0FMTChGUFJPVU5EX0YxMjhfRjE2LCAiX190cnVuY3RmaGYyIikKK0hBTkRMRV9MSUJDQUxMKEZQUk9VTkRfUFBDRjEyOF9GMTYsICJfX3RydW5jdGZoZjIiKQorSEFORExFX0xJQkNBTEwoRlBST1VORF9GNjRfRjMyLCAiX190cnVuY2Rmc2YyIikKK0hBTkRMRV9MSUJDQUxMKEZQUk9VTkRfRjgwX0YzMiwgIl9fdHJ1bmN4ZnNmMiIpCitIQU5ETEVfTElCQ0FMTChGUFJPVU5EX0YxMjhfRjMyLCAiX190cnVuY3Rmc2YyIikKK0hBTkRMRV9MSUJDQUxMKEZQUk9VTkRfUFBDRjEyOF9GMzIsICJfX2djY19xdG9zIikKK0hBTkRMRV9MSUJDQUxMKEZQUk9VTkRfRjgwX0Y2NCwgIl9fdHJ1bmN4ZmRmMiIpCitIQU5ETEVfTElCQ0FMTChGUFJPVU5EX0YxMjhfRjY0LCAiX190cnVuY3RmZGYyIikKK0hBTkRMRV9MSUJDQUxMKEZQUk9VTkRfUFBDRjEyOF9GNjQsICJfX2djY19xdG9kIikKK0hBTkRMRV9MSUJDQUxMKEZQUk9VTkRfRjEyOF9GODAsICJfX3RydW5jdGZ4ZjIiKQorSEFORExFX0xJQkNBTEwoRlBUT1NJTlRfRjMyX0kzMiwgIl9fZml4c2ZzaSIpCitIQU5ETEVfTElCQ0FMTChGUFRPU0lOVF9GMzJfSTY0LCAiX19maXhzZmRpIikKK0hBTkRMRV9MSUJDQUxMKEZQVE9TSU5UX0YzMl9JMTI4LCAiX19maXhzZnRpIikKK0hBTkRMRV9MSUJDQUxMKEZQVE9TSU5UX0Y2NF9JMzIsICJfX2ZpeGRmc2kiKQorSEFORExFX0xJQkNBTEwoRlBUT1NJTlRfRjY0X0k2NCwgIl9fZml4ZGZkaSIpCitIQU5ETEVfTElCQ0FMTChGUFRPU0lOVF9GNjRfSTEyOCwgIl9fZml4ZGZ0aSIpCitIQU5ETEVfTElCQ0FMTChGUFRPU0lOVF9GODBfSTMyLCAiX19maXh4ZnNpIikKK0hBTkRMRV9MSUJDQUxMKEZQVE9TSU5UX0Y4MF9JNjQsICJfX2ZpeHhmZGkiKQorSEFORExFX0xJQkNBTEwoRlBUT1NJTlRfRjgwX0kxMjgsICJfX2ZpeHhmdGkiKQorSEFORExFX0xJQkNBTEwoRlBUT1NJTlRfRjEyOF9JMzIsICJfX2ZpeHRmc2kiKQorSEFORExFX0xJQkNBTEwoRlBUT1NJTlRfRjEyOF9JNjQsICJfX2ZpeHRmZGkiKQorSEFORExFX0xJQkNBTEwoRlBUT1NJTlRfRjEyOF9JMTI4LCAiX19maXh0ZnRpIikKK0hBTkRMRV9MSUJDQUxMKEZQVE9TSU5UX1BQQ0YxMjhfSTMyLCAiX19nY2NfcXRvdSIpCitIQU5ETEVfTElCQ0FMTChGUFRPU0lOVF9QUENGMTI4X0k2NCwgIl9fZml4dGZkaSIpCitIQU5ETEVfTElCQ0FMTChGUFRPU0lOVF9QUENGMTI4X0kxMjgsICJfX2ZpeHRmdGkiKQorSEFORExFX0xJQkNBTEwoRlBUT1VJTlRfRjMyX0kzMiwgIl9fZml4dW5zc2ZzaSIpCitIQU5ETEVfTElCQ0FMTChGUFRPVUlOVF9GMzJfSTY0LCAiX19maXh1bnNzZmRpIikKK0hBTkRMRV9MSUJDQUxMKEZQVE9VSU5UX0YzMl9JMTI4LCAiX19maXh1bnNzZnRpIikKK0hBTkRMRV9MSUJDQUxMKEZQVE9VSU5UX0Y2NF9JMzIsICJfX2ZpeHVuc2Rmc2kiKQorSEFORExFX0xJQkNBTEwoRlBUT1VJTlRfRjY0X0k2NCwgIl9fZml4dW5zZGZkaSIpCitIQU5ETEVfTElCQ0FMTChGUFRPVUlOVF9GNjRfSTEyOCwgIl9fZml4dW5zZGZ0aSIpCitIQU5ETEVfTElCQ0FMTChGUFRPVUlOVF9GODBfSTMyLCAiX19maXh1bnN4ZnNpIikKK0hBTkRMRV9MSUJDQUxMKEZQVE9VSU5UX0Y4MF9JNjQsICJfX2ZpeHVuc3hmZGkiKQorSEFORExFX0xJQkNBTEwoRlBUT1VJTlRfRjgwX0kxMjgsICJfX2ZpeHVuc3hmdGkiKQorSEFORExFX0xJQkNBTEwoRlBUT1VJTlRfRjEyOF9JMzIsICJfX2ZpeHVuc3Rmc2kiKQorSEFORExFX0xJQkNBTEwoRlBUT1VJTlRfRjEyOF9JNjQsICJfX2ZpeHVuc3RmZGkiKQorSEFORExFX0xJQkNBTEwoRlBUT1VJTlRfRjEyOF9JMTI4LCAiX19maXh1bnN0ZnRpIikKK0hBTkRMRV9MSUJDQUxMKEZQVE9VSU5UX1BQQ0YxMjhfSTMyLCAiX19maXh1bnN0ZnNpIikKK0hBTkRMRV9MSUJDQUxMKEZQVE9VSU5UX1BQQ0YxMjhfSTY0LCAiX19maXh1bnN0ZmRpIikKK0hBTkRMRV9MSUJDQUxMKEZQVE9VSU5UX1BQQ0YxMjhfSTEyOCwgIl9fZml4dW5zdGZ0aSIpCitIQU5ETEVfTElCQ0FMTChTSU5UVE9GUF9JMzJfRjMyLCAiX19mbG9hdHNpc2YiKQorSEFORExFX0xJQkNBTEwoU0lOVFRPRlBfSTMyX0Y2NCwgIl9fZmxvYXRzaWRmIikKK0hBTkRMRV9MSUJDQUxMKFNJTlRUT0ZQX0kzMl9GODAsICJfX2Zsb2F0c2l4ZiIpCitIQU5ETEVfTElCQ0FMTChTSU5UVE9GUF9JMzJfRjEyOCwgIl9fZmxvYXRzaXRmIikKK0hBTkRMRV9MSUJDQUxMKFNJTlRUT0ZQX0kzMl9QUENGMTI4LCAiX19nY2NfaXRvcSIpCitIQU5ETEVfTElCQ0FMTChTSU5UVE9GUF9JNjRfRjMyLCAiX19mbG9hdGRpc2YiKQorSEFORExFX0xJQkNBTEwoU0lOVFRPRlBfSTY0X0Y2NCwgIl9fZmxvYXRkaWRmIikKK0hBTkRMRV9MSUJDQUxMKFNJTlRUT0ZQX0k2NF9GODAsICJfX2Zsb2F0ZGl4ZiIpCitIQU5ETEVfTElCQ0FMTChTSU5UVE9GUF9JNjRfRjEyOCwgIl9fZmxvYXRkaXRmIikKK0hBTkRMRV9MSUJDQUxMKFNJTlRUT0ZQX0k2NF9QUENGMTI4LCAiX19mbG9hdGRpdGYiKQorSEFORExFX0xJQkNBTEwoU0lOVFRPRlBfSTEyOF9GMzIsICJfX2Zsb2F0dGlzZiIpCitIQU5ETEVfTElCQ0FMTChTSU5UVE9GUF9JMTI4X0Y2NCwgIl9fZmxvYXR0aWRmIikKK0hBTkRMRV9MSUJDQUxMKFNJTlRUT0ZQX0kxMjhfRjgwLCAiX19mbG9hdHRpeGYiKQorSEFORExFX0xJQkNBTEwoU0lOVFRPRlBfSTEyOF9GMTI4LCAiX19mbG9hdHRpdGYiKQorSEFORExFX0xJQkNBTEwoU0lOVFRPRlBfSTEyOF9QUENGMTI4LCAiX19mbG9hdHRpdGYiKQorSEFORExFX0xJQkNBTEwoVUlOVFRPRlBfSTMyX0YzMiwgIl9fZmxvYXR1bnNpc2YiKQorSEFORExFX0xJQkNBTEwoVUlOVFRPRlBfSTMyX0Y2NCwgIl9fZmxvYXR1bnNpZGYiKQorSEFORExFX0xJQkNBTEwoVUlOVFRPRlBfSTMyX0Y4MCwgIl9fZmxvYXR1bnNpeGYiKQorSEFORExFX0xJQkNBTEwoVUlOVFRPRlBfSTMyX0YxMjgsICJfX2Zsb2F0dW5zaXRmIikKK0hBTkRMRV9MSUJDQUxMKFVJTlRUT0ZQX0kzMl9QUENGMTI4LCAiX19nY2NfdXRvcSIpCitIQU5ETEVfTElCQ0FMTChVSU5UVE9GUF9JNjRfRjMyLCAiX19mbG9hdHVuZGlzZiIpCitIQU5ETEVfTElCQ0FMTChVSU5UVE9GUF9JNjRfRjY0LCAiX19mbG9hdHVuZGlkZiIpCitIQU5ETEVfTElCQ0FMTChVSU5UVE9GUF9JNjRfRjgwLCAiX19mbG9hdHVuZGl4ZiIpCitIQU5ETEVfTElCQ0FMTChVSU5UVE9GUF9JNjRfRjEyOCwgIl9fZmxvYXR1bmRpdGYiKQorSEFORExFX0xJQkNBTEwoVUlOVFRPRlBfSTY0X1BQQ0YxMjgsICJfX2Zsb2F0dW5kaXRmIikKK0hBTkRMRV9MSUJDQUxMKFVJTlRUT0ZQX0kxMjhfRjMyLCAiX19mbG9hdHVudGlzZiIpCitIQU5ETEVfTElCQ0FMTChVSU5UVE9GUF9JMTI4X0Y2NCwgIl9fZmxvYXR1bnRpZGYiKQorSEFORExFX0xJQkNBTEwoVUlOVFRPRlBfSTEyOF9GODAsICJfX2Zsb2F0dW50aXhmIikKK0hBTkRMRV9MSUJDQUxMKFVJTlRUT0ZQX0kxMjhfRjEyOCwgIl9fZmxvYXR1bnRpdGYiKQorSEFORExFX0xJQkNBTEwoVUlOVFRPRlBfSTEyOF9QUENGMTI4LCAiX19mbG9hdHVudGl0ZiIpCisKKy8vIENvbXBhcmlzb24KK0hBTkRMRV9MSUJDQUxMKE9FUV9GMzIsICJfX2Vxc2YyIikKK0hBTkRMRV9MSUJDQUxMKE9FUV9GNjQsICJfX2VxZGYyIikKK0hBTkRMRV9MSUJDQUxMKE9FUV9GMTI4LCAiX19lcXRmMiIpCitIQU5ETEVfTElCQ0FMTChPRVFfUFBDRjEyOCwgIl9fZ2NjX3FlcSIpCitIQU5ETEVfTElCQ0FMTChVTkVfRjMyLCAiX19uZXNmMiIpCitIQU5ETEVfTElCQ0FMTChVTkVfRjY0LCAiX19uZWRmMiIpCitIQU5ETEVfTElCQ0FMTChVTkVfRjEyOCwgIl9fbmV0ZjIiKQorSEFORExFX0xJQkNBTEwoVU5FX1BQQ0YxMjgsICJfX2djY19xbmUiKQorSEFORExFX0xJQkNBTEwoT0dFX0YzMiwgIl9fZ2VzZjIiKQorSEFORExFX0xJQkNBTEwoT0dFX0Y2NCwgIl9fZ2VkZjIiKQorSEFORExFX0xJQkNBTEwoT0dFX0YxMjgsICJfX2dldGYyIikKK0hBTkRMRV9MSUJDQUxMKE9HRV9QUENGMTI4LCAiX19nY2NfcWdlIikKK0hBTkRMRV9MSUJDQUxMKE9MVF9GMzIsICJfX2x0c2YyIikKK0hBTkRMRV9MSUJDQUxMKE9MVF9GNjQsICJfX2x0ZGYyIikKK0hBTkRMRV9MSUJDQUxMKE9MVF9GMTI4LCAiX19sdHRmMiIpCitIQU5ETEVfTElCQ0FMTChPTFRfUFBDRjEyOCwgIl9fZ2NjX3FsdCIpCitIQU5ETEVfTElCQ0FMTChPTEVfRjMyLCAiX19sZXNmMiIpCitIQU5ETEVfTElCQ0FMTChPTEVfRjY0LCAiX19sZWRmMiIpCitIQU5ETEVfTElCQ0FMTChPTEVfRjEyOCwgIl9fbGV0ZjIiKQorSEFORExFX0xJQkNBTEwoT0xFX1BQQ0YxMjgsICJfX2djY19xbGUiKQorSEFORExFX0xJQkNBTEwoT0dUX0YzMiwgIl9fZ3RzZjIiKQorSEFORExFX0xJQkNBTEwoT0dUX0Y2NCwgIl9fZ3RkZjIiKQorSEFORExFX0xJQkNBTEwoT0dUX0YxMjgsICJfX2d0dGYyIikKK0hBTkRMRV9MSUJDQUxMKE9HVF9QUENGMTI4LCAiX19nY2NfcWd0IikKK0hBTkRMRV9MSUJDQUxMKFVPX0YzMiwgIl9fdW5vcmRzZjIiKQorSEFORExFX0xJQkNBTEwoVU9fRjY0LCAiX191bm9yZGRmMiIpCitIQU5ETEVfTElCQ0FMTChVT19GMTI4LCAiX191bm9yZHRmMiIpCitIQU5ETEVfTElCQ0FMTChVT19QUENGMTI4LCAiX19nY2NfcXVub3JkIikKK0hBTkRMRV9MSUJDQUxMKE9fRjMyLCAiX191bm9yZHNmMiIpCitIQU5ETEVfTElCQ0FMTChPX0Y2NCwgIl9fdW5vcmRkZjIiKQorSEFORExFX0xJQkNBTEwoT19GMTI4LCAiX191bm9yZHRmMiIpCitIQU5ETEVfTElCQ0FMTChPX1BQQ0YxMjgsICJfX2djY19xdW5vcmQiKQorCisvLyBNZW1vcnkKK0hBTkRMRV9MSUJDQUxMKE1FTUNQWSwgIm1lbWNweSIpCitIQU5ETEVfTElCQ0FMTChNRU1NT1ZFLCAibWVtbW92ZSIpCitIQU5ETEVfTElCQ0FMTChNRU1TRVQsICJtZW1zZXQiKQorSEFORExFX0xJQkNBTEwoQlpFUk8sIG51bGxwdHIpCisKKy8vIEVsZW1lbnQtd2lzZSB1bm9yZGVyZWQtYXRvbWljIG1lbW9yeSBvZiBkaWZmZXJlbnQgc2l6ZXMKK0hBTkRMRV9MSUJDQUxMKE1FTUNQWV9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUNfMSwgIl9fbGx2bV9tZW1jcHlfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljXzEiKQorSEFORExFX0xJQkNBTEwoTUVNQ1BZX0VMRU1FTlRfVU5PUkRFUkVEX0FUT01JQ18yLCAiX19sbHZtX21lbWNweV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWNfMiIpCitIQU5ETEVfTElCQ0FMTChNRU1DUFlfRUxFTUVOVF9VTk9SREVSRURfQVRPTUlDXzQsICJfX2xsdm1fbWVtY3B5X2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pY180IikKK0hBTkRMRV9MSUJDQUxMKE1FTUNQWV9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUNfOCwgIl9fbGx2bV9tZW1jcHlfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljXzgiKQorSEFORExFX0xJQkNBTEwoTUVNQ1BZX0VMRU1FTlRfVU5PUkRFUkVEX0FUT01JQ18xNiwgIl9fbGx2bV9tZW1jcHlfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljXzE2IikKK0hBTkRMRV9MSUJDQUxMKE1FTU1PVkVfRUxFTUVOVF9VTk9SREVSRURfQVRPTUlDXzEsICJfX2xsdm1fbWVtbW92ZV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWNfMSIpCitIQU5ETEVfTElCQ0FMTChNRU1NT1ZFX0VMRU1FTlRfVU5PUkRFUkVEX0FUT01JQ18yLCAiX19sbHZtX21lbW1vdmVfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljXzIiKQorSEFORExFX0xJQkNBTEwoTUVNTU9WRV9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUNfNCwgIl9fbGx2bV9tZW1tb3ZlX2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pY180IikKK0hBTkRMRV9MSUJDQUxMKE1FTU1PVkVfRUxFTUVOVF9VTk9SREVSRURfQVRPTUlDXzgsICJfX2xsdm1fbWVtbW92ZV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWNfOCIpCitIQU5ETEVfTElCQ0FMTChNRU1NT1ZFX0VMRU1FTlRfVU5PUkRFUkVEX0FUT01JQ18xNiwgIl9fbGx2bV9tZW1tb3ZlX2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pY18xNiIpCitIQU5ETEVfTElCQ0FMTChNRU1TRVRfRUxFTUVOVF9VTk9SREVSRURfQVRPTUlDXzEsICJfX2xsdm1fbWVtc2V0X2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pY18xIikKK0hBTkRMRV9MSUJDQUxMKE1FTVNFVF9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUNfMiwgIl9fbGx2bV9tZW1zZXRfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljXzIiKQorSEFORExFX0xJQkNBTEwoTUVNU0VUX0VMRU1FTlRfVU5PUkRFUkVEX0FUT01JQ180LCAiX19sbHZtX21lbXNldF9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWNfNCIpCitIQU5ETEVfTElCQ0FMTChNRU1TRVRfRUxFTUVOVF9VTk9SREVSRURfQVRPTUlDXzgsICJfX2xsdm1fbWVtc2V0X2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pY184IikKK0hBTkRMRV9MSUJDQUxMKE1FTVNFVF9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUNfMTYsICJfX2xsdm1fbWVtc2V0X2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pY18xNiIpCisKKy8vIEV4Y2VwdGlvbiBoYW5kbGluZworSEFORExFX0xJQkNBTEwoVU5XSU5EX1JFU1VNRSwgIl9VbndpbmRfUmVzdW1lIikKKworLy8gTm90ZTogdGhlcmUgYXJlIHR3byBzZXRzIG9mIGF0b21pY3MgbGliY2FsbHM7IHNlZQorLy8gPGh0dHBzOi8vbGx2bS5vcmcvZG9jcy9BdG9taWNzLmh0bWw+IGZvciBtb3JlIGluZm8gb24gdGhlCisvLyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbS4KKworLy8gQXRvbWljICdfX3N5bmNfKicgbGliY2FsbHMuCitIQU5ETEVfTElCQ0FMTChTWU5DX1ZBTF9DT01QQVJFX0FORF9TV0FQXzEsICJfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXBfMSIpCitIQU5ETEVfTElCQ0FMTChTWU5DX1ZBTF9DT01QQVJFX0FORF9TV0FQXzIsICJfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXBfMiIpCitIQU5ETEVfTElCQ0FMTChTWU5DX1ZBTF9DT01QQVJFX0FORF9TV0FQXzQsICJfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXBfNCIpCitIQU5ETEVfTElCQ0FMTChTWU5DX1ZBTF9DT01QQVJFX0FORF9TV0FQXzgsICJfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXBfOCIpCitIQU5ETEVfTElCQ0FMTChTWU5DX1ZBTF9DT01QQVJFX0FORF9TV0FQXzE2LCAiX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwXzE2IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfTE9DS19URVNUX0FORF9TRVRfMSwgIl9fc3luY19sb2NrX3Rlc3RfYW5kX3NldF8xIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfTE9DS19URVNUX0FORF9TRVRfMiwgIl9fc3luY19sb2NrX3Rlc3RfYW5kX3NldF8yIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfTE9DS19URVNUX0FORF9TRVRfNCwgIl9fc3luY19sb2NrX3Rlc3RfYW5kX3NldF80IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfTE9DS19URVNUX0FORF9TRVRfOCwgIl9fc3luY19sb2NrX3Rlc3RfYW5kX3NldF84IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfTE9DS19URVNUX0FORF9TRVRfMTYsICJfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXRfMTYiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfQUREXzEsICJfX3N5bmNfZmV0Y2hfYW5kX2FkZF8xIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX0FERF8yLCAiX19zeW5jX2ZldGNoX2FuZF9hZGRfMiIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9BRERfNCwgIl9fc3luY19mZXRjaF9hbmRfYWRkXzQiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfQUREXzgsICJfX3N5bmNfZmV0Y2hfYW5kX2FkZF84IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX0FERF8xNiwgIl9fc3luY19mZXRjaF9hbmRfYWRkXzE2IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX1NVQl8xLCAiX19zeW5jX2ZldGNoX2FuZF9zdWJfMSIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9TVUJfMiwgIl9fc3luY19mZXRjaF9hbmRfc3ViXzIiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfU1VCXzQsICJfX3N5bmNfZmV0Y2hfYW5kX3N1Yl80IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX1NVQl84LCAiX19zeW5jX2ZldGNoX2FuZF9zdWJfOCIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9TVUJfMTYsICJfX3N5bmNfZmV0Y2hfYW5kX3N1Yl8xNiIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9BTkRfMSwgIl9fc3luY19mZXRjaF9hbmRfYW5kXzEiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfQU5EXzIsICJfX3N5bmNfZmV0Y2hfYW5kX2FuZF8yIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX0FORF80LCAiX19zeW5jX2ZldGNoX2FuZF9hbmRfNCIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9BTkRfOCwgIl9fc3luY19mZXRjaF9hbmRfYW5kXzgiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfQU5EXzE2LCAiX19zeW5jX2ZldGNoX2FuZF9hbmRfMTYiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfT1JfMSwgIl9fc3luY19mZXRjaF9hbmRfb3JfMSIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9PUl8yLCAiX19zeW5jX2ZldGNoX2FuZF9vcl8yIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX09SXzQsICJfX3N5bmNfZmV0Y2hfYW5kX29yXzQiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfT1JfOCwgIl9fc3luY19mZXRjaF9hbmRfb3JfOCIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9PUl8xNiwgIl9fc3luY19mZXRjaF9hbmRfb3JfMTYiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfWE9SXzEsICJfX3N5bmNfZmV0Y2hfYW5kX3hvcl8xIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX1hPUl8yLCAiX19zeW5jX2ZldGNoX2FuZF94b3JfMiIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9YT1JfNCwgIl9fc3luY19mZXRjaF9hbmRfeG9yXzQiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfWE9SXzgsICJfX3N5bmNfZmV0Y2hfYW5kX3hvcl84IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX1hPUl8xNiwgIl9fc3luY19mZXRjaF9hbmRfeG9yXzE2IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX05BTkRfMSwgIl9fc3luY19mZXRjaF9hbmRfbmFuZF8xIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX05BTkRfMiwgIl9fc3luY19mZXRjaF9hbmRfbmFuZF8yIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX05BTkRfNCwgIl9fc3luY19mZXRjaF9hbmRfbmFuZF80IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX05BTkRfOCwgIl9fc3luY19mZXRjaF9hbmRfbmFuZF84IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX05BTkRfMTYsICJfX3N5bmNfZmV0Y2hfYW5kX25hbmRfMTYiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfTUFYXzEsICJfX3N5bmNfZmV0Y2hfYW5kX21heF8xIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX01BWF8yLCAiX19zeW5jX2ZldGNoX2FuZF9tYXhfMiIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9NQVhfNCwgIl9fc3luY19mZXRjaF9hbmRfbWF4XzQiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfTUFYXzgsICJfX3N5bmNfZmV0Y2hfYW5kX21heF84IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX01BWF8xNiwgIl9fc3luY19mZXRjaF9hbmRfbWF4XzE2IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX1VNQVhfMSwgIl9fc3luY19mZXRjaF9hbmRfdW1heF8xIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX1VNQVhfMiwgIl9fc3luY19mZXRjaF9hbmRfdW1heF8yIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX1VNQVhfNCwgIl9fc3luY19mZXRjaF9hbmRfdW1heF80IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX1VNQVhfOCwgIl9fc3luY19mZXRjaF9hbmRfdW1heF84IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX1VNQVhfMTYsICJfX3N5bmNfZmV0Y2hfYW5kX3VtYXhfMTYiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfTUlOXzEsICJfX3N5bmNfZmV0Y2hfYW5kX21pbl8xIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX01JTl8yLCAiX19zeW5jX2ZldGNoX2FuZF9taW5fMiIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9NSU5fNCwgIl9fc3luY19mZXRjaF9hbmRfbWluXzQiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfTUlOXzgsICJfX3N5bmNfZmV0Y2hfYW5kX21pbl84IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX01JTl8xNiwgIl9fc3luY19mZXRjaF9hbmRfbWluXzE2IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX1VNSU5fMSwgIl9fc3luY19mZXRjaF9hbmRfdW1pbl8xIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX1VNSU5fMiwgIl9fc3luY19mZXRjaF9hbmRfdW1pbl8yIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX1VNSU5fNCwgIl9fc3luY19mZXRjaF9hbmRfdW1pbl80IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX1VNSU5fOCwgIl9fc3luY19mZXRjaF9hbmRfdW1pbl84IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX1VNSU5fMTYsICJfX3N5bmNfZmV0Y2hfYW5kX3VtaW5fMTYiKQorCisvLyBBdG9taWMgYF9fYXRvbWljXyonIGxpYmNhbGxzLgorSEFORExFX0xJQkNBTEwoQVRPTUlDX0xPQUQsICJfX2F0b21pY19sb2FkIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19MT0FEXzEsICJfX2F0b21pY19sb2FkXzEiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0xPQURfMiwgIl9fYXRvbWljX2xvYWRfMiIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfTE9BRF80LCAiX19hdG9taWNfbG9hZF80IikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19MT0FEXzgsICJfX2F0b21pY19sb2FkXzgiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0xPQURfMTYsICJfX2F0b21pY19sb2FkXzE2IikKKworSEFORExFX0xJQkNBTEwoQVRPTUlDX1NUT1JFLCAiX19hdG9taWNfc3RvcmUiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX1NUT1JFXzEsICJfX2F0b21pY19zdG9yZV8xIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19TVE9SRV8yLCAiX19hdG9taWNfc3RvcmVfMiIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfU1RPUkVfNCwgIl9fYXRvbWljX3N0b3JlXzQiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX1NUT1JFXzgsICJfX2F0b21pY19zdG9yZV84IikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19TVE9SRV8xNiwgIl9fYXRvbWljX3N0b3JlXzE2IikKKworSEFORExFX0xJQkNBTEwoQVRPTUlDX0VYQ0hBTkdFLCAiX19hdG9taWNfZXhjaGFuZ2UiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0VYQ0hBTkdFXzEsICJfX2F0b21pY19leGNoYW5nZV8xIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19FWENIQU5HRV8yLCAiX19hdG9taWNfZXhjaGFuZ2VfMiIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRVhDSEFOR0VfNCwgIl9fYXRvbWljX2V4Y2hhbmdlXzQiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0VYQ0hBTkdFXzgsICJfX2F0b21pY19leGNoYW5nZV84IikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19FWENIQU5HRV8xNiwgIl9fYXRvbWljX2V4Y2hhbmdlXzE2IikKKworSEFORExFX0xJQkNBTEwoQVRPTUlDX0NPTVBBUkVfRVhDSEFOR0UsICJfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19DT01QQVJFX0VYQ0hBTkdFXzEsICJfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlXzEiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0NPTVBBUkVfRVhDSEFOR0VfMiwgIl9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfMiIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfQ09NUEFSRV9FWENIQU5HRV80LCAiX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV80IikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19DT01QQVJFX0VYQ0hBTkdFXzgsICJfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlXzgiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0NPTVBBUkVfRVhDSEFOR0VfMTYsICJfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlXzE2IikKKworSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX0FERF8xLCAiX19hdG9taWNfZmV0Y2hfYWRkXzEiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX0FERF8yLCAiX19hdG9taWNfZmV0Y2hfYWRkXzIiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX0FERF80LCAiX19hdG9taWNfZmV0Y2hfYWRkXzQiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX0FERF84LCAiX19hdG9taWNfZmV0Y2hfYWRkXzgiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX0FERF8xNiwgIl9fYXRvbWljX2ZldGNoX2FkZF8xNiIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRkVUQ0hfU1VCXzEsICJfX2F0b21pY19mZXRjaF9zdWJfMSIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRkVUQ0hfU1VCXzIsICJfX2F0b21pY19mZXRjaF9zdWJfMiIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRkVUQ0hfU1VCXzQsICJfX2F0b21pY19mZXRjaF9zdWJfNCIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRkVUQ0hfU1VCXzgsICJfX2F0b21pY19mZXRjaF9zdWJfOCIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRkVUQ0hfU1VCXzE2LCAiX19hdG9taWNfZmV0Y2hfc3ViXzE2IikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9BTkRfMSwgIl9fYXRvbWljX2ZldGNoX2FuZF8xIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9BTkRfMiwgIl9fYXRvbWljX2ZldGNoX2FuZF8yIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9BTkRfNCwgIl9fYXRvbWljX2ZldGNoX2FuZF80IikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9BTkRfOCwgIl9fYXRvbWljX2ZldGNoX2FuZF84IikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9BTkRfMTYsICJfX2F0b21pY19mZXRjaF9hbmRfMTYiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX09SXzEsICJfX2F0b21pY19mZXRjaF9vcl8xIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9PUl8yLCAiX19hdG9taWNfZmV0Y2hfb3JfMiIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRkVUQ0hfT1JfNCwgIl9fYXRvbWljX2ZldGNoX29yXzQiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX09SXzgsICJfX2F0b21pY19mZXRjaF9vcl84IikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9PUl8xNiwgIl9fYXRvbWljX2ZldGNoX29yXzE2IikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9YT1JfMSwgIl9fYXRvbWljX2ZldGNoX3hvcl8xIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9YT1JfMiwgIl9fYXRvbWljX2ZldGNoX3hvcl8yIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9YT1JfNCwgIl9fYXRvbWljX2ZldGNoX3hvcl80IikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9YT1JfOCwgIl9fYXRvbWljX2ZldGNoX3hvcl84IikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9YT1JfMTYsICJfX2F0b21pY19mZXRjaF94b3JfMTYiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX05BTkRfMSwgIl9fYXRvbWljX2ZldGNoX25hbmRfMSIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRkVUQ0hfTkFORF8yLCAiX19hdG9taWNfZmV0Y2hfbmFuZF8yIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9OQU5EXzQsICJfX2F0b21pY19mZXRjaF9uYW5kXzQiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX05BTkRfOCwgIl9fYXRvbWljX2ZldGNoX25hbmRfOCIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRkVUQ0hfTkFORF8xNiwgIl9fYXRvbWljX2ZldGNoX25hbmRfMTYiKQorCisvLyBTdGFjayBQcm90ZWN0b3IgRmFpbAorSEFORExFX0xJQkNBTEwoU1RBQ0tQUk9URUNUT1JfQ0hFQ0tfRkFJTCwgIl9fc3RhY2tfY2hrX2ZhaWwiKQorCisvLyBEZW9wdGltaXphdGlvbgorSEFORExFX0xJQkNBTEwoREVPUFRJTUlaRSwgIl9fbGx2bV9kZW9wdGltaXplIikKKworSEFORExFX0xJQkNBTEwoVU5LTk9XTl9MSUJDQUxMLCBudWxscHRyKQorCisjdW5kZWYgSEFORExFX0xJQkNBTEwKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SdW50aW1lTGliY2FsbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SdW50aW1lTGliY2FsbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTZiZWYxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1J1bnRpbWVMaWJjYWxscy5oCkBAIC0wLDAgKzEsODIgQEAKKy8vPT09LS0gQ29kZUdlbi9SdW50aW1lTGliY2FsbHMuaCAtIFJ1bnRpbWUgTGlicmFyeSBDYWxscyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGVudW0gcmVwcmVzZW50aW5nIHRoZSBsaXN0IG9mIHJ1bnRpbWUgbGlicmFyeSBjYWxscworLy8gdGhlIGJhY2tlbmQgbWF5IGVtaXQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiwgYW5kIGFsc28gc29tZSBoZWxwZXIgZnVuY3Rpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1JVTlRJTUVMSUJDQUxMU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9SVU5USU1FTElCQ0FMTFNfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIFJUTElCIHsKKyAgLy8vIFJUTElCOjpMaWJjYWxsIGVudW0gLSBUaGlzIGVudW0gZGVmaW5lcyBhbGwgb2YgdGhlIHJ1bnRpbWUgbGlicmFyeSBjYWxscworICAvLy8gdGhlIGJhY2tlbmQgY2FuIGVtaXQuICBUaGUgdmFyaW91cyBsb25nIGRvdWJsZSB0eXBlcyBjYW5ub3QgYmUgbWVyZ2VkLAorICAvLy8gYmVjYXVzZSA4MC1iaXQgbGlicmFyeSBmdW5jdGlvbnMgdXNlICJ4ZiIgYW5kIDEyOC1iaXQgdXNlICJ0ZiIuCisgIC8vLworICAvLy8gV2hlbiBhZGRpbmcgUFBDRjEyOCBmdW5jdGlvbnMgaGVyZSwgbm90ZSB0aGF0IHRoZWlyIG5hbWVzIGdlbmVyYWxseSBuZWVkCisgIC8vLyB0byBiZSBvdmVycmlkZGVuIGZvciBEYXJ3aW4gd2l0aCB0aGUgeHh4JExEQkwxMjggZm9ybS4gIFNlZQorICAvLy8gUFBDSVNlbExvd2VyaW5nLmNwcC4KKyAgLy8vCisgIGVudW0gTGliY2FsbCB7CisjZGVmaW5lIEhBTkRMRV9MSUJDQUxMKGNvZGUsIG5hbWUpIGNvZGUsCisgICAgI2luY2x1ZGUgIlJ1bnRpbWVMaWJjYWxscy5kZWYiCisjdW5kZWYgSEFORExFX0xJQkNBTEwKKyAgfTsKKworICAvLy8gZ2V0RlBFWFQgLSBSZXR1cm4gdGhlIEZQRVhUXypfKiB2YWx1ZSBmb3IgdGhlIGdpdmVuIHR5cGVzLCBvcgorICAvLy8gVU5LTk9XTl9MSUJDQUxMIGlmIHRoZXJlIGlzIG5vbmUuCisgIExpYmNhbGwgZ2V0RlBFWFQoRVZUIE9wVlQsIEVWVCBSZXRWVCk7CisKKyAgLy8vIGdldEZQUk9VTkQgLSBSZXR1cm4gdGhlIEZQUk9VTkRfKl8qIHZhbHVlIGZvciB0aGUgZ2l2ZW4gdHlwZXMsIG9yCisgIC8vLyBVTktOT1dOX0xJQkNBTEwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgTGliY2FsbCBnZXRGUFJPVU5EKEVWVCBPcFZULCBFVlQgUmV0VlQpOworCisgIC8vLyBnZXRGUFRPU0lOVCAtIFJldHVybiB0aGUgRlBUT1NJTlRfKl8qIHZhbHVlIGZvciB0aGUgZ2l2ZW4gdHlwZXMsIG9yCisgIC8vLyBVTktOT1dOX0xJQkNBTEwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgTGliY2FsbCBnZXRGUFRPU0lOVChFVlQgT3BWVCwgRVZUIFJldFZUKTsKKworICAvLy8gZ2V0RlBUT1VJTlQgLSBSZXR1cm4gdGhlIEZQVE9VSU5UXypfKiB2YWx1ZSBmb3IgdGhlIGdpdmVuIHR5cGVzLCBvcgorICAvLy8gVU5LTk9XTl9MSUJDQUxMIGlmIHRoZXJlIGlzIG5vbmUuCisgIExpYmNhbGwgZ2V0RlBUT1VJTlQoRVZUIE9wVlQsIEVWVCBSZXRWVCk7CisKKyAgLy8vIGdldFNJTlRUT0ZQIC0gUmV0dXJuIHRoZSBTSU5UVE9GUF8qXyogdmFsdWUgZm9yIHRoZSBnaXZlbiB0eXBlcywgb3IKKyAgLy8vIFVOS05PV05fTElCQ0FMTCBpZiB0aGVyZSBpcyBub25lLgorICBMaWJjYWxsIGdldFNJTlRUT0ZQKEVWVCBPcFZULCBFVlQgUmV0VlQpOworCisgIC8vLyBnZXRVSU5UVE9GUCAtIFJldHVybiB0aGUgVUlOVFRPRlBfKl8qIHZhbHVlIGZvciB0aGUgZ2l2ZW4gdHlwZXMsIG9yCisgIC8vLyBVTktOT1dOX0xJQkNBTEwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgTGliY2FsbCBnZXRVSU5UVE9GUChFVlQgT3BWVCwgRVZUIFJldFZUKTsKKworICAvLy8gUmV0dXJuIHRoZSBTWU5DX0ZFVENIX0FORF8qIHZhbHVlIGZvciB0aGUgZ2l2ZW4gb3Bjb2RlIGFuZCB0eXBlLCBvcgorICAvLy8gVU5LTk9XTl9MSUJDQUxMIGlmIHRoZXJlIGlzIG5vbmUuCisgIExpYmNhbGwgZ2V0U1lOQyh1bnNpZ25lZCBPcGMsIE1WVCBWVCk7CisKKyAgLy8vIGdldE1FTUNQWV9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUMgLSBSZXR1cm4KKyAgLy8vIE1FTUNQWV9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUNfKiB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgc2l6ZSBvcgorICAvLy8gVU5LTk9XX0xJQkNBTEwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgTGliY2FsbCBnZXRNRU1DUFlfRUxFTUVOVF9VTk9SREVSRURfQVRPTUlDKHVpbnQ2NF90IEVsZW1lbnRTaXplKTsKKworICAvLy8gZ2V0TUVNTU9WRV9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUMgLSBSZXR1cm4KKyAgLy8vIE1FTU1PVkVfRUxFTUVOVF9VTk9SREVSRURfQVRPTUlDXyogdmFsdWUgZm9yIHRoZSBnaXZlbiBlbGVtZW50IHNpemUgb3IKKyAgLy8vIFVOS05PV19MSUJDQUxMIGlmIHRoZXJlIGlzIG5vbmUuCisgIExpYmNhbGwgZ2V0TUVNTU9WRV9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUModWludDY0X3QgRWxlbWVudFNpemUpOworCisgIC8vLyBnZXRNRU1TRVRfRUxFTUVOVF9VTk9SREVSRURfQVRPTUlDIC0gUmV0dXJuCisgIC8vLyBNRU1TRVRfRUxFTUVOVF9VTk9SREVSRURfQVRPTUlDXyogdmFsdWUgZm9yIHRoZSBnaXZlbiBlbGVtZW50IHNpemUgb3IKKyAgLy8vIFVOS05PV19MSUJDQUxMIGlmIHRoZXJlIGlzIG5vbmUuCisgIExpYmNhbGwgZ2V0TUVNU0VUX0VMRU1FTlRfVU5PUkRFUkVEX0FUT01JQyh1aW50NjRfdCBFbGVtZW50U2l6ZSk7CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU0ROb2RlUHJvcGVydGllcy50ZCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TRE5vZGVQcm9wZXJ0aWVzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYmJhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU0ROb2RlUHJvcGVydGllcy50ZApAQCAtMCwwICsxLDM0IEBACisvLz09PS0gU0ROb2RlUHJvcGVydGllcy50ZCAtIENvbW1vbiBjb2RlIGZvciBEQUcgaXNlbHMgLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgU0ROb2RlUHJvcGVydHk7CisKKy8vIFNlbGVjdGlvbiBEQUcgUGF0dGVybiBPcGVyYXRpb25zCitjbGFzcyBTRFBhdHRlcm5PcGVyYXRvciB7CisgIGxpc3Q8U0ROb2RlUHJvcGVydHk+IFByb3BlcnRpZXMgPSBbXTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNlbGVjdGlvbiBEQUcgTm9kZSBQcm9wZXJ0aWVzLgorLy8KKy8vIE5vdGU6IFRoZXNlIGFyZSBoYXJkIGNvZGVkIGludG8gdGJsZ2VuLgorLy8KK2RlZiBTRE5QQ29tbXV0YXRpdmUgOiBTRE5vZGVQcm9wZXJ0eTsgICAvLyBYIG9wIFkgPT0gWSBvcCBYCitkZWYgU0ROUEFzc29jaWF0aXZlIDogU0ROb2RlUHJvcGVydHk7ICAgLy8gKFggb3AgWSkgb3AgWiA9PSBYIG9wIChZIG9wIFopCitkZWYgU0ROUEhhc0NoYWluICAgIDogU0ROb2RlUHJvcGVydHk7ICAgLy8gUi9XIGNoYWluIG9wZXJhbmQgYW5kIHJlc3VsdAorZGVmIFNETlBPdXRHbHVlICAgICA6IFNETm9kZVByb3BlcnR5OyAgIC8vIFdyaXRlIGEgZmxhZyByZXN1bHQKK2RlZiBTRE5QSW5HbHVlICAgICAgOiBTRE5vZGVQcm9wZXJ0eTsgICAvLyBSZWFkIGEgZmxhZyBvcGVyYW5kCitkZWYgU0ROUE9wdEluR2x1ZSAgIDogU0ROb2RlUHJvcGVydHk7ICAgLy8gT3B0aW9uYWxseSByZWFkIGEgZmxhZyBvcGVyYW5kCitkZWYgU0ROUE1heVN0b3JlICAgIDogU0ROb2RlUHJvcGVydHk7ICAgLy8gTWF5IHdyaXRlIHRvIG1lbW9yeSwgc2V0cyAnbWF5U3RvcmUnLgorZGVmIFNETlBNYXlMb2FkICAgICA6IFNETm9kZVByb3BlcnR5OyAgIC8vIE1heSByZWFkIG1lbW9yeSwgc2V0cyAnbWF5TG9hZCcuCitkZWYgU0ROUFNpZGVFZmZlY3QgIDogU0ROb2RlUHJvcGVydHk7ICAgLy8gU2V0cyAnSGFzVW5tb2RlbGxlZFNpZGVFZmZlY3RzJy4KK2RlZiBTRE5QTWVtT3BlcmFuZCAgOiBTRE5vZGVQcm9wZXJ0eTsgICAvLyBUb3VjaGVzIG1lbW9yeSwgaGFzIGFzc29jIE1lbU9wZXJhbmQKK2RlZiBTRE5QVmFyaWFkaWMgICAgOiBTRE5vZGVQcm9wZXJ0eTsgICAvLyBOb2RlIGhhcyB2YXJpYWJsZSBhcmd1bWVudHMuCitkZWYgU0ROUFdhbnRSb290ICAgIDogU0ROb2RlUHJvcGVydHk7ICAgLy8gQ29tcGxleFBhdHRlcm4gZ2V0cyB0aGUgcm9vdCBvZiBtYXRjaAorZGVmIFNETlBXYW50UGFyZW50ICA6IFNETm9kZVByb3BlcnR5OyAgIC8vIENvbXBsZXhQYXR0ZXJuIGdldHMgdGhlIHBhcmVudApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2YyZjA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHLmgKQEAgLTAsMCArMSw3NjQgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUcuaCAtIENvbW1vbiBCYXNlIENsYXNzIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlIEltcGxlbWVudHMgdGhlIFNjaGVkdWxlREFHIGNsYXNzLCB3aGljaCBpcyB1c2VkIGFzIHRoZSBjb21tb24gYmFzZQorLy8vIGNsYXNzIGZvciBpbnN0cnVjdGlvbiBzY2hlZHVsZXJzLiBUaGlzIGVuY2Fwc3VsYXRlcyB0aGUgc2NoZWR1bGluZyBEQUcsCisvLy8gd2hpY2ggaXMgc2hhcmVkIGJldHdlZW4gU2VsZWN0aW9uREFHIGFuZCBNYWNoaW5lSW5zdHIgc2NoZWR1bGluZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TQ0hFRFVMRURBR19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9TQ0hFRFVMRURBR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0TG93ZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlPGNsYXNzIEdyYXBoPiBjbGFzcyBHcmFwaFdyaXRlcjsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CitjbGFzcyBNQ0luc3RyRGVzYzsKK3N0cnVjdCBNQ1NjaGVkQ2xhc3NEZXNjOworY2xhc3MgU2NoZWR1bGVEQUc7CitjbGFzcyBTRE5vZGU7CitjbGFzcyBTVW5pdDsKK2NsYXNzIFRhcmdldEluc3RySW5mbzsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CitjbGFzcyBUYXJnZXRSZWdpc3RlckNsYXNzOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworCisgIC8vLyBTY2hlZHVsaW5nIGRlcGVuZGVuY3kuIFRoaXMgcmVwcmVzZW50cyBvbmUgZGlyZWN0aW9uIG9mIGFuIGVkZ2UgaW4gdGhlCisgIC8vLyBzY2hlZHVsaW5nIERBRy4KKyAgY2xhc3MgU0RlcCB7CisgIHB1YmxpYzoKKyAgICAvLy8gVGhlc2UgYXJlIHRoZSBkaWZmZXJlbnQga2luZHMgb2Ygc2NoZWR1bGluZyBkZXBlbmRlbmNpZXMuCisgICAgZW51bSBLaW5kIHsKKyAgICAgIERhdGEsICAgICAgICAvLy88IFJlZ3VsYXIgZGF0YSBkZXBlbmRlbmNlIChha2EgdHJ1ZS1kZXBlbmRlbmNlKS4KKyAgICAgIEFudGksICAgICAgICAvLy88IEEgcmVnaXN0ZXIgYW50aS1kZXBlbmRlbmNlIChha2EgV0FSKS4KKyAgICAgIE91dHB1dCwgICAgICAvLy88IEEgcmVnaXN0ZXIgb3V0cHV0LWRlcGVuZGVuY2UgKGFrYSBXQVcpLgorICAgICAgT3JkZXIgICAgICAgIC8vLzwgQW55IG90aGVyIG9yZGVyaW5nIGRlcGVuZGVuY3kuCisgICAgfTsKKworICAgIC8vIFN0cm9uZyBkZXBlbmRlbmNpZXMgbXVzdCBiZSByZXNwZWN0ZWQgYnkgdGhlIHNjaGVkdWxlci4gQXJ0aWZpY2lhbAorICAgIC8vIGRlcGVuZGVuY2llcyBtYXkgYmUgcmVtb3ZlZCBvbmx5IGlmIHRoZXkgYXJlIHJlZHVuZGFudCB3aXRoIGFub3RoZXIKKyAgICAvLyBzdHJvbmcgZGVwZW5kZW5jZS4KKyAgICAvLworICAgIC8vIFdlYWsgZGVwZW5kZW5jaWVzIG1heSBiZSB2aW9sYXRlZCBieSB0aGUgc2NoZWR1bGluZyBzdHJhdGVneSwgYnV0IG9ubHkgaWYKKyAgICAvLyB0aGUgc3RyYXRlZ3kgY2FuIHByb3ZlIGl0IGlzIGNvcnJlY3QgdG8gZG8gc28uCisgICAgLy8KKyAgICAvLyBTdHJvbmcgT3JkZXJLaW5kcyBtdXN0IG9jY3VyIGJlZm9yZSAiV2VhayIuCisgICAgLy8gV2VhayBPcmRlcktpbmRzIG11c3Qgb2NjdXIgYWZ0ZXIgIldlYWsiLgorICAgIGVudW0gT3JkZXJLaW5kIHsKKyAgICAgIEJhcnJpZXIsICAgICAgLy8vPCBBbiB1bmtub3duIHNjaGVkdWxpbmcgYmFycmllci4KKyAgICAgIE1heUFsaWFzTWVtLCAgLy8vPCBOb252b2xhdGlsZSBsb2FkL1N0b3JlIGluc3RydWN0aW9ucyB0aGF0IG1heSBhbGlhcy4KKyAgICAgIE11c3RBbGlhc01lbSwgLy8vPCBOb252b2xhdGlsZSBsb2FkL1N0b3JlIGluc3RydWN0aW9ucyB0aGF0IG11c3QgYWxpYXMuCisgICAgICBBcnRpZmljaWFsLCAgIC8vLzwgQXJiaXRyYXJ5IHN0cm9uZyBEQUcgZWRnZSAobm8gcmVhbCBkZXBlbmRlbmNlKS4KKyAgICAgIFdlYWssICAgICAgICAgLy8vPCBBcmJpdHJhcnkgd2VhayBEQUcgZWRnZS4KKyAgICAgIENsdXN0ZXIgICAgICAgLy8vPCBXZWFrIERBRyBlZGdlIGxpbmtpbmcgYSBjaGFpbiBvZiBjbHVzdGVyZWQgaW5zdHJzLgorICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gXGJyaWVmIEEgcG9pbnRlciB0byB0aGUgZGVwZW5kaW5nL2RlcGVuZGVkLW9uIFNVbml0LCBhbmQgYW4gZW51bQorICAgIC8vLyBpbmRpY2F0aW5nIHRoZSBraW5kIG9mIHRoZSBkZXBlbmRlbmN5LgorICAgIFBvaW50ZXJJbnRQYWlyPFNVbml0ICosIDIsIEtpbmQ+IERlcDsKKworICAgIC8vLyBBIHVuaW9uIGRpc2NyaW1pbmF0ZWQgYnkgdGhlIGRlcGVuZGVuY2Uga2luZC4KKyAgICB1bmlvbiB7CisgICAgICAvLy8gRm9yIERhdGEsIEFudGksIGFuZCBPdXRwdXQgZGVwZW5kZW5jaWVzLCB0aGUgYXNzb2NpYXRlZCByZWdpc3Rlci4gRm9yCisgICAgICAvLy8gRGF0YSBkZXBlbmRlbmNpZXMgdGhhdCBkb24ndCBjdXJyZW50bHkgaGF2ZSBhIHJlZ2lzdGVyLyBhc3NpZ25lZCwgdGhpcworICAgICAgLy8vIGlzIHNldCB0byB6ZXJvLgorICAgICAgdW5zaWduZWQgUmVnOworCisgICAgICAvLy8gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBPcmRlciBkZXBlbmRlbmNpZXMuCisgICAgICB1bnNpZ25lZCBPcmRLaW5kOyAvLyBlbnVtIE9yZGVyS2luZAorICAgIH0gQ29udGVudHM7CisKKyAgICAvLy8gVGhlIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWRnZS4gT2Z0ZW4gdGhpcyBpcyBqdXN0IHRoZSB2YWx1ZSBvZiB0aGUKKyAgICAvLy8gTGF0ZW5jeSBmaWVsZCBvZiB0aGUgcHJlZGVjZXNzb3IsIGhvd2V2ZXIgYWR2YW5jZWQgbW9kZWxzIG1heSBwcm92aWRlCisgICAgLy8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgc3BlY2lmaWMgZWRnZXMuCisgICAgdW5zaWduZWQgTGF0ZW5jeTsKKworICBwdWJsaWM6CisgICAgLy8vIENvbnN0cnVjdHMgYSBudWxsIFNEZXAuIFRoaXMgaXMgb25seSBmb3IgdXNlIGJ5IGNvbnRhaW5lciBjbGFzc2VzIHdoaWNoCisgICAgLy8vIHJlcXVpcmUgZGVmYXVsdCBjb25zdHJ1Y3RvcnMuIFNVbml0cyBtYXkgbm90LyBoYXZlIG51bGwgU0RlcCBlZGdlcy4KKyAgICBTRGVwKCkgOiBEZXAobnVsbHB0ciwgRGF0YSkge30KKworICAgIC8vLyBDb25zdHJ1Y3RzIGFuIFNEZXAgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcy4KKyAgICBTRGVwKFNVbml0ICpTLCBLaW5kIGtpbmQsIHVuc2lnbmVkIFJlZykKKyAgICAgIDogRGVwKFMsIGtpbmQpLCBDb250ZW50cygpIHsKKyAgICAgIHN3aXRjaCAoa2luZCkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiUmVnIGdpdmVuIGZvciBub24tcmVnaXN0ZXIgZGVwZW5kZW5jZSEiKTsKKyAgICAgIGNhc2UgQW50aToKKyAgICAgIGNhc2UgT3V0cHV0OgorICAgICAgICBhc3NlcnQoUmVnICE9IDAgJiYKKyAgICAgICAgICAgICAgICJTRGVwOjpBbnRpIGFuZCBTRGVwOjpPdXRwdXQgbXVzdCB1c2UgYSBub24temVybyBSZWchIik7CisgICAgICAgIENvbnRlbnRzLlJlZyA9IFJlZzsKKyAgICAgICAgTGF0ZW5jeSA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEYXRhOgorICAgICAgICBDb250ZW50cy5SZWcgPSBSZWc7CisgICAgICAgIExhdGVuY3kgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBTRGVwKFNVbml0ICpTLCBPcmRlcktpbmQga2luZCkKKyAgICAgIDogRGVwKFMsIE9yZGVyKSwgQ29udGVudHMoKSwgTGF0ZW5jeSgwKSB7CisgICAgICBDb250ZW50cy5PcmRLaW5kID0ga2luZDsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgU0RlcCBpcyBlcXVpdmFsZW50IGV4Y2VwdCBmb3IgbGF0ZW5jeS4KKyAgICBib29sIG92ZXJsYXBzKGNvbnN0IFNEZXAgJk90aGVyKSBjb25zdDsKKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTRGVwICZPdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIG92ZXJsYXBzKE90aGVyKSAmJiBMYXRlbmN5ID09IE90aGVyLkxhdGVuY3k7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNEZXAgJk90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oT3RoZXIpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbGF0ZW5jeSB2YWx1ZSBmb3IgdGhpcyBlZGdlLCB3aGljaCByb3VnaGx5IG1lYW5zIHRoZQorICAgIC8vLyBtaW5pbXVtIG51bWJlciBvZiBjeWNsZXMgdGhhdCBtdXN0IGVsYXBzZSBiZXR3ZWVuIHRoZSBwcmVkZWNlc3NvciBhbmQKKyAgICAvLy8gdGhlIHN1Y2Nlc3NvciwgZ2l2ZW4gdGhhdCB0aGV5IGhhdmUgdGhpcyBlZGdlIGJldHdlZW4gdGhlbS4KKyAgICB1bnNpZ25lZCBnZXRMYXRlbmN5KCkgY29uc3QgeworICAgICAgcmV0dXJuIExhdGVuY3k7CisgICAgfQorCisgICAgLy8vIFNldHMgdGhlIGxhdGVuY3kgZm9yIHRoaXMgZWRnZS4KKyAgICB2b2lkIHNldExhdGVuY3kodW5zaWduZWQgTGF0KSB7CisgICAgICBMYXRlbmN5ID0gTGF0OworICAgIH0KKworICAgIC8vLy8gUmV0dXJucyB0aGUgU1VuaXQgdG8gd2hpY2ggdGhpcyBlZGdlIHBvaW50cy4KKyAgICBTVW5pdCAqZ2V0U1VuaXQoKSBjb25zdDsKKworICAgIC8vLy8gQXNzaWducyB0aGUgU1VuaXQgdG8gd2hpY2ggdGhpcyBlZGdlIHBvaW50cy4KKyAgICB2b2lkIHNldFNVbml0KFNVbml0ICpTVSk7CisKKyAgICAvLy8gUmV0dXJucyBhbiBlbnVtIHZhbHVlIHJlcHJlc2VudGluZyB0aGUga2luZCBvZiB0aGUgZGVwZW5kZW5jZS4KKyAgICBLaW5kIGdldEtpbmQoKSBjb25zdDsKKworICAgIC8vLyBTaG9ydGhhbmQgZm9yIGdldEtpbmQoKSAhPSBTRGVwOjpEYXRhLgorICAgIGJvb2wgaXNDdHJsKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldEtpbmQoKSAhPSBEYXRhOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgVGVzdHMgaWYgdGhpcyBpcyBhbiBPcmRlciBkZXBlbmRlbmNlIGJldHdlZW4gdHdvIG1lbW9yeSBhY2Nlc3NlcworICAgIC8vLyB3aGVyZSBib3RoIHNpZGVzIG9mIHRoZSBkZXBlbmRlbmNlIGFjY2VzcyBtZW1vcnkgaW4gbm9uLXZvbGF0aWxlIGFuZAorICAgIC8vLyBmdWxseSBtb2RlbGVkIHdheXMuCisgICAgYm9vbCBpc05vcm1hbE1lbW9yeSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRLaW5kKCkgPT0gT3JkZXIgJiYgKENvbnRlbnRzLk9yZEtpbmQgPT0gTWF5QWxpYXNNZW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IENvbnRlbnRzLk9yZEtpbmQgPT0gTXVzdEFsaWFzTWVtKTsKKyAgICB9CisKKyAgICAvLy8gVGVzdHMgaWYgdGhpcyBpcyBhbiBPcmRlciBkZXBlbmRlbmNlIHRoYXQgaXMgbWFya2VkIGFzIGEgYmFycmllci4KKyAgICBib29sIGlzQmFycmllcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRLaW5kKCkgPT0gT3JkZXIgJiYgQ29udGVudHMuT3JkS2luZCA9PSBCYXJyaWVyOworICAgIH0KKworICAgIC8vLyBUZXN0cyBpZiB0aGlzIGlzIGNvdWxkIGJlIGFueSBraW5kIG9mIG1lbW9yeSBkZXBlbmRlbmNlLgorICAgIGJvb2wgaXNOb3JtYWxNZW1vcnlPckJhcnJpZXIoKSBjb25zdCB7CisgICAgICByZXR1cm4gKGlzTm9ybWFsTWVtb3J5KCkgfHwgaXNCYXJyaWVyKCkpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgVGVzdHMgaWYgdGhpcyBpcyBhbiBPcmRlciBkZXBlbmRlbmNlIHRoYXQgaXMgbWFya2VkIGFzCisgICAgLy8vICJtdXN0IGFsaWFzIiwgbWVhbmluZyB0aGF0IHRoZSBTVW5pdHMgYXQgZWl0aGVyIGVuZCBvZiB0aGUgZWRnZSBoYXZlIGEKKyAgICAvLy8gbWVtb3J5IGRlcGVuZGVuY2Ugb24gYSBrbm93biBtZW1vcnkgbG9jYXRpb24uCisgICAgYm9vbCBpc011c3RBbGlhcygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRLaW5kKCkgPT0gT3JkZXIgJiYgQ29udGVudHMuT3JkS2luZCA9PSBNdXN0QWxpYXNNZW07CisgICAgfQorCisgICAgLy8vIFRlc3RzIGlmIHRoaXMgYSB3ZWFrIGRlcGVuZGVuY2UuIFdlYWsgZGVwZW5kZW5jaWVzIGFyZSBjb25zaWRlcmVkIERBRworICAgIC8vLyBlZGdlcyBmb3IgaGVpZ2h0IGNvbXB1dGF0aW9uIGFuZCBvdGhlciBoZXVyaXN0aWNzLCBidXQgZG8gbm90IGZvcmNlCisgICAgLy8vIG9yZGVyaW5nLiBCcmVha2luZyBhIHdlYWsgZWRnZSBtYXkgcmVxdWlyZSB0aGUgc2NoZWR1bGVyIHRvIGNvbXBlbnNhdGUsCisgICAgLy8vIGZvciBleGFtcGxlIGJ5IGluc2VydGluZyBhIGNvcHkuCisgICAgYm9vbCBpc1dlYWsoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0S2luZCgpID09IE9yZGVyICYmIENvbnRlbnRzLk9yZEtpbmQgPj0gV2VhazsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFRlc3RzIGlmIHRoaXMgaXMgYW4gT3JkZXIgZGVwZW5kZW5jZSB0aGF0IGlzIG1hcmtlZCBhcworICAgIC8vLyAiYXJ0aWZpY2lhbCIsIG1lYW5pbmcgaXQgaXNuJ3QgbmVjZXNzYXJ5IGZvciBjb3JyZWN0bmVzcy4KKyAgICBib29sIGlzQXJ0aWZpY2lhbCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRLaW5kKCkgPT0gT3JkZXIgJiYgQ29udGVudHMuT3JkS2luZCA9PSBBcnRpZmljaWFsOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgVGVzdHMgaWYgdGhpcyBpcyBhbiBPcmRlciBkZXBlbmRlbmNlIHRoYXQgaXMgbWFya2VkIGFzICJjbHVzdGVyIiwKKyAgICAvLy8gbWVhbmluZyBpdCBpcyBhcnRpZmljaWFsIGFuZCB3YW50cyB0byBiZSBhZGphY2VudC4KKyAgICBib29sIGlzQ2x1c3RlcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRLaW5kKCkgPT0gT3JkZXIgJiYgQ29udGVudHMuT3JkS2luZCA9PSBDbHVzdGVyOworICAgIH0KKworICAgIC8vLyBUZXN0cyBpZiB0aGlzIGlzIGEgRGF0YSBkZXBlbmRlbmNlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcmVnaXN0ZXIuCisgICAgYm9vbCBpc0Fzc2lnbmVkUmVnRGVwKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldEtpbmQoKSA9PSBEYXRhICYmIENvbnRlbnRzLlJlZyAhPSAwOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSByZWdpc3RlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBlZGdlLiBUaGlzIGlzIG9ubHkgdmFsaWQgb24KKyAgICAvLy8gRGF0YSwgQW50aSwgYW5kIE91dHB1dCBlZGdlcy4gT24gRGF0YSBlZGdlcywgdGhpcyB2YWx1ZSBtYXkgYmUgemVybywKKyAgICAvLy8gbWVhbmluZyB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIHJlZ2lzdGVyLgorICAgIHVuc2lnbmVkIGdldFJlZygpIGNvbnN0IHsKKyAgICAgIGFzc2VydCgoZ2V0S2luZCgpID09IERhdGEgfHwgZ2V0S2luZCgpID09IEFudGkgfHwgZ2V0S2luZCgpID09IE91dHB1dCkgJiYKKyAgICAgICAgICAgICAiZ2V0UmVnIGNhbGxlZCBvbiBub24tcmVnaXN0ZXIgZGVwZW5kZW5jZSBlZGdlISIpOworICAgICAgcmV0dXJuIENvbnRlbnRzLlJlZzsKKyAgICB9CisKKyAgICAvLy8gQXNzaWducyB0aGUgYXNzb2NpYXRlZCByZWdpc3RlciBmb3IgdGhpcyBlZGdlLiBUaGlzIGlzIG9ubHkgdmFsaWQgb24KKyAgICAvLy8gRGF0YSwgQW50aSwgYW5kIE91dHB1dCBlZGdlcy4gT24gQW50aSBhbmQgT3V0cHV0IGVkZ2VzLCB0aGlzIHZhbHVlIG11c3QKKyAgICAvLy8gbm90IGJlIHplcm8uIE9uIERhdGEgZWRnZXMsIHRoZSB2YWx1ZSBtYXkgYmUgemVybywgd2hpY2ggd291bGQgbWVhbiB0aGF0CisgICAgLy8vIG5vIHNwZWNpZmljIHJlZ2lzdGVyIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVkZ2UuCisgICAgdm9pZCBzZXRSZWcodW5zaWduZWQgUmVnKSB7CisgICAgICBhc3NlcnQoKGdldEtpbmQoKSA9PSBEYXRhIHx8IGdldEtpbmQoKSA9PSBBbnRpIHx8IGdldEtpbmQoKSA9PSBPdXRwdXQpICYmCisgICAgICAgICAgICAgInNldFJlZyBjYWxsZWQgb24gbm9uLXJlZ2lzdGVyIGRlcGVuZGVuY2UgZWRnZSEiKTsKKyAgICAgIGFzc2VydCgoZ2V0S2luZCgpICE9IEFudGkgfHwgUmVnICE9IDApICYmCisgICAgICAgICAgICAgIlNEZXA6OkFudGkgZWRnZSBjYW5ub3QgdXNlIHRoZSB6ZXJvIHJlZ2lzdGVyISIpOworICAgICAgYXNzZXJ0KChnZXRLaW5kKCkgIT0gT3V0cHV0IHx8IFJlZyAhPSAwKSAmJgorICAgICAgICAgICAgICJTRGVwOjpPdXRwdXQgZWRnZSBjYW5ub3QgdXNlIHRoZSB6ZXJvIHJlZ2lzdGVyISIpOworICAgICAgQ29udGVudHMuUmVnID0gUmVnOworICAgIH0KKworICAgIHJhd19vc3RyZWFtICZwcmludChyYXdfb3N0cmVhbSAmTywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyKSBjb25zdDsKKyAgfTsKKworICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgaXNQb2RMaWtlPFNEZXA+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisgIC8vLyBTY2hlZHVsaW5nIHVuaXQuIFRoaXMgaXMgYSBub2RlIGluIHRoZSBzY2hlZHVsaW5nIERBRy4KKyAgY2xhc3MgU1VuaXQgeworICBwcml2YXRlOgorICAgIGVudW0gOiB1bnNpZ25lZCB7IEJvdW5kYXJ5SUQgPSB+MHUgfTsKKworICAgIFNETm9kZSAqTm9kZSA9IG51bGxwdHI7ICAgICAgICAvLy88IFJlcHJlc2VudGF0aXZlIG5vZGUuCisgICAgTWFjaGluZUluc3RyICpJbnN0ciA9IG51bGxwdHI7IC8vLzwgQWx0ZXJuYXRpdmVseSwgYSBNYWNoaW5lSW5zdHIuCisKKyAgcHVibGljOgorICAgIFNVbml0ICpPcmlnTm9kZSA9IG51bGxwdHI7IC8vLzwgSWYgbm90IHRoaXMsIHRoZSBub2RlIGZyb20gd2hpY2ggdGhpcyBub2RlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyB3YXMgY2xvbmVkLiAoU0Qgc2NoZWR1bGluZyBvbmx5KQorCisgICAgY29uc3QgTUNTY2hlZENsYXNzRGVzYyAqU2NoZWRDbGFzcyA9CisgICAgICAgIG51bGxwdHI7IC8vLzwgbnVsbHB0ciBvciByZXNvbHZlZCBTY2hlZENsYXNzLgorCisgICAgU21hbGxWZWN0b3I8U0RlcCwgND4gUHJlZHM7ICAvLy88IEFsbCBzdW5pdCBwcmVkZWNlc3NvcnMuCisgICAgU21hbGxWZWN0b3I8U0RlcCwgND4gU3VjY3M7ICAvLy88IEFsbCBzdW5pdCBzdWNjZXNzb3JzLgorCisgICAgdHlwZWRlZiBTbWFsbFZlY3RvckltcGw8U0RlcD46Oml0ZXJhdG9yIHByZWRfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBTbWFsbFZlY3RvckltcGw8U0RlcD46Oml0ZXJhdG9yIHN1Y2NfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBTbWFsbFZlY3RvckltcGw8U0RlcD46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X3ByZWRfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBTbWFsbFZlY3RvckltcGw8U0RlcD46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X3N1Y2NfaXRlcmF0b3I7CisKKyAgICB1bnNpZ25lZCBOb2RlTnVtID0gQm91bmRhcnlJRDsgICAgIC8vLzwgRW50cnkgIyBvZiBub2RlIGluIHRoZSBub2RlIHZlY3Rvci4KKyAgICB1bnNpZ25lZCBOb2RlUXVldWVJZCA9IDA7ICAgICAgICAgIC8vLzwgUXVldWUgaWQgb2Ygbm9kZS4KKyAgICB1bnNpZ25lZCBOdW1QcmVkcyA9IDA7ICAgICAgICAgICAgIC8vLzwgIyBvZiBTRGVwOjpEYXRhIHByZWRzLgorICAgIHVuc2lnbmVkIE51bVN1Y2NzID0gMDsgICAgICAgICAgICAgLy8vPCAjIG9mIFNEZXA6OkRhdGEgc3Vjc3MuCisgICAgdW5zaWduZWQgTnVtUHJlZHNMZWZ0ID0gMDsgICAgICAgICAvLy88ICMgb2YgcHJlZHMgbm90IHNjaGVkdWxlZC4KKyAgICB1bnNpZ25lZCBOdW1TdWNjc0xlZnQgPSAwOyAgICAgICAgIC8vLzwgIyBvZiBzdWNjcyBub3Qgc2NoZWR1bGVkLgorICAgIHVuc2lnbmVkIFdlYWtQcmVkc0xlZnQgPSAwOyAgICAgICAgLy8vPCAjIG9mIHdlYWsgcHJlZHMgbm90IHNjaGVkdWxlZC4KKyAgICB1bnNpZ25lZCBXZWFrU3VjY3NMZWZ0ID0gMDsgICAgICAgIC8vLzwgIyBvZiB3ZWFrIHN1Y2NzIG5vdCBzY2hlZHVsZWQuCisgICAgdW5zaWduZWQgc2hvcnQgTnVtUmVnRGVmc0xlZnQgPSAwOyAvLy88ICMgb2YgcmVnIGRlZnMgd2l0aCBubyBzY2hlZHVsZWQgdXNlLgorICAgIHVuc2lnbmVkIHNob3J0IExhdGVuY3kgPSAwOyAgICAgICAgLy8vPCBOb2RlIGxhdGVuY3kuCisgICAgYm9vbCBpc1ZSZWdDeWNsZSAgICAgIDogMTsgICAgICAgICAvLy88IE1heSB1c2UgYW5kIGRlZiB0aGUgc2FtZSB2cmVnLgorICAgIGJvb2wgaXNDYWxsICAgICAgICAgICA6IDE7ICAgICAgICAgLy8vPCBJcyBhIGZ1bmN0aW9uIGNhbGwuCisgICAgYm9vbCBpc0NhbGxPcCAgICAgICAgIDogMTsgICAgICAgICAvLy88IElzIGEgZnVuY3Rpb24gY2FsbCBvcGVyYW5kLgorICAgIGJvb2wgaXNUd29BZGRyZXNzICAgICA6IDE7ICAgICAgICAgLy8vPCBJcyBhIHR3by1hZGRyZXNzIGluc3RydWN0aW9uLgorICAgIGJvb2wgaXNDb21tdXRhYmxlICAgICA6IDE7ICAgICAgICAgLy8vPCBJcyBhIGNvbW11dGFibGUgaW5zdHJ1Y3Rpb24uCisgICAgYm9vbCBoYXNQaHlzUmVnVXNlcyAgIDogMTsgICAgICAgICAvLy88IEhhcyBwaHlzcmVnIHVzZXMuCisgICAgYm9vbCBoYXNQaHlzUmVnRGVmcyAgIDogMTsgICAgICAgICAvLy88IEhhcyBwaHlzcmVnIGRlZnMgdGhhdCBhcmUgYmVpbmcgdXNlZC4KKyAgICBib29sIGhhc1BoeXNSZWdDbG9iYmVycyA6IDE7ICAgICAgIC8vLzwgSGFzIGFueSBwaHlzcmVnIGRlZnMsIHVzZWQgb3Igbm90LgorICAgIGJvb2wgaXNQZW5kaW5nICAgICAgICA6IDE7ICAgICAgICAgLy8vPCBUcnVlIG9uY2UgcGVuZGluZy4KKyAgICBib29sIGlzQXZhaWxhYmxlICAgICAgOiAxOyAgICAgICAgIC8vLzwgVHJ1ZSBvbmNlIGF2YWlsYWJsZS4KKyAgICBib29sIGlzU2NoZWR1bGVkICAgICAgOiAxOyAgICAgICAgIC8vLzwgVHJ1ZSBvbmNlIHNjaGVkdWxlZC4KKyAgICBib29sIGlzU2NoZWR1bGVIaWdoICAgOiAxOyAgICAgICAgIC8vLzwgVHJ1ZSBpZiBwcmVmZXJhYmxlIHRvIHNjaGVkdWxlIGhpZ2guCisgICAgYm9vbCBpc1NjaGVkdWxlTG93ICAgIDogMTsgICAgICAgICAvLy88IFRydWUgaWYgcHJlZmVyYWJsZSB0byBzY2hlZHVsZSBsb3cuCisgICAgYm9vbCBpc0Nsb25lZCAgICAgICAgIDogMTsgICAgICAgICAvLy88IFRydWUgaWYgdGhpcyBub2RlIGhhcyBiZWVuIGNsb25lZC4KKyAgICBib29sIGlzVW5idWZmZXJlZCAgICAgOiAxOyAgICAgICAgIC8vLzwgVXNlcyBhbiB1bmJ1ZmZlcmVkIHJlc291cmNlLgorICAgIGJvb2wgaGFzUmVzZXJ2ZWRSZXNvdXJjZSA6IDE7ICAgICAgLy8vPCBVc2VzIGEgcmVzZXJ2ZWQgcmVzb3VyY2UuCisgICAgU2NoZWQ6OlByZWZlcmVuY2UgU2NoZWR1bGluZ1ByZWYgPSBTY2hlZDo6Tm9uZTsgLy8vPCBTY2hlZHVsaW5nIHByZWZlcmVuY2UuCisKKyAgcHJpdmF0ZToKKyAgICBib29sIGlzRGVwdGhDdXJyZW50ICAgOiAxOyAgICAgICAgIC8vLzwgVHJ1ZSBpZiBEZXB0aCBpcyBjdXJyZW50LgorICAgIGJvb2wgaXNIZWlnaHRDdXJyZW50ICA6IDE7ICAgICAgICAgLy8vPCBUcnVlIGlmIEhlaWdodCBpcyBjdXJyZW50LgorICAgIHVuc2lnbmVkIERlcHRoID0gMDsgICAgICAgICAgICAgICAgLy8vPCBOb2RlIGRlcHRoLgorICAgIHVuc2lnbmVkIEhlaWdodCA9IDA7ICAgICAgICAgICAgICAgLy8vPCBOb2RlIGhlaWdodC4KKworICBwdWJsaWM6CisgICAgdW5zaWduZWQgVG9wUmVhZHlDeWNsZSA9IDA7IC8vLzwgQ3ljbGUgcmVsYXRpdmUgdG8gc3RhcnQgd2hlbiBub2RlIGlzIHJlYWR5LgorICAgIHVuc2lnbmVkIEJvdFJlYWR5Q3ljbGUgPSAwOyAvLy88IEN5Y2xlIHJlbGF0aXZlIHRvIGVuZCB3aGVuIG5vZGUgaXMgcmVhZHkuCisKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpDb3B5RHN0UkMgPQorICAgICAgICBudWxscHRyOyAvLy88IElzIGEgc3BlY2lhbCBjb3B5IG5vZGUgaWYgIT0gbnVsbHB0ci4KKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpDb3B5U3JjUkMgPSBudWxscHRyOworCisgICAgLy8vIFxicmllZiBDb25zdHJ1Y3RzIGFuIFNVbml0IGZvciBwcmUtcmVnYWxsb2Mgc2NoZWR1bGluZyB0byByZXByZXNlbnQgYW4KKyAgICAvLy8gU0ROb2RlIGFuZCBhbnkgbm9kZXMgZmxhZ2dlZCB0byBpdC4KKyAgICBTVW5pdChTRE5vZGUgKm5vZGUsIHVuc2lnbmVkIG5vZGVudW0pCisgICAgICA6IE5vZGUobm9kZSksIE5vZGVOdW0obm9kZW51bSksIGlzVlJlZ0N5Y2xlKGZhbHNlKSwgaXNDYWxsKGZhbHNlKSwKKyAgICAgICAgaXNDYWxsT3AoZmFsc2UpLCBpc1R3b0FkZHJlc3MoZmFsc2UpLCBpc0NvbW11dGFibGUoZmFsc2UpLAorICAgICAgICBoYXNQaHlzUmVnVXNlcyhmYWxzZSksIGhhc1BoeXNSZWdEZWZzKGZhbHNlKSwgaGFzUGh5c1JlZ0Nsb2JiZXJzKGZhbHNlKSwKKyAgICAgICAgaXNQZW5kaW5nKGZhbHNlKSwgaXNBdmFpbGFibGUoZmFsc2UpLCBpc1NjaGVkdWxlZChmYWxzZSksCisgICAgICAgIGlzU2NoZWR1bGVIaWdoKGZhbHNlKSwgaXNTY2hlZHVsZUxvdyhmYWxzZSksIGlzQ2xvbmVkKGZhbHNlKSwKKyAgICAgICAgaXNVbmJ1ZmZlcmVkKGZhbHNlKSwgaGFzUmVzZXJ2ZWRSZXNvdXJjZShmYWxzZSksIGlzRGVwdGhDdXJyZW50KGZhbHNlKSwKKyAgICAgICAgaXNIZWlnaHRDdXJyZW50KGZhbHNlKSB7fQorCisgICAgLy8vIFxicmllZiBDb25zdHJ1Y3RzIGFuIFNVbml0IGZvciBwb3N0LXJlZ2FsbG9jIHNjaGVkdWxpbmcgdG8gcmVwcmVzZW50IGEKKyAgICAvLy8gTWFjaGluZUluc3RyLgorICAgIFNVbml0KE1hY2hpbmVJbnN0ciAqaW5zdHIsIHVuc2lnbmVkIG5vZGVudW0pCisgICAgICA6IEluc3RyKGluc3RyKSwgTm9kZU51bShub2RlbnVtKSwgaXNWUmVnQ3ljbGUoZmFsc2UpLCBpc0NhbGwoZmFsc2UpLAorICAgICAgICBpc0NhbGxPcChmYWxzZSksIGlzVHdvQWRkcmVzcyhmYWxzZSksIGlzQ29tbXV0YWJsZShmYWxzZSksCisgICAgICAgIGhhc1BoeXNSZWdVc2VzKGZhbHNlKSwgaGFzUGh5c1JlZ0RlZnMoZmFsc2UpLCBoYXNQaHlzUmVnQ2xvYmJlcnMoZmFsc2UpLAorICAgICAgICBpc1BlbmRpbmcoZmFsc2UpLCBpc0F2YWlsYWJsZShmYWxzZSksIGlzU2NoZWR1bGVkKGZhbHNlKSwKKyAgICAgICAgaXNTY2hlZHVsZUhpZ2goZmFsc2UpLCBpc1NjaGVkdWxlTG93KGZhbHNlKSwgaXNDbG9uZWQoZmFsc2UpLAorICAgICAgICBpc1VuYnVmZmVyZWQoZmFsc2UpLCBoYXNSZXNlcnZlZFJlc291cmNlKGZhbHNlKSwgaXNEZXB0aEN1cnJlbnQoZmFsc2UpLAorICAgICAgICBpc0hlaWdodEN1cnJlbnQoZmFsc2UpIHt9CisKKyAgICAvLy8gXGJyaWVmIENvbnN0cnVjdHMgYSBwbGFjZWhvbGRlciBTVW5pdC4KKyAgICBTVW5pdCgpCisgICAgICA6IGlzVlJlZ0N5Y2xlKGZhbHNlKSwgaXNDYWxsKGZhbHNlKSwgaXNDYWxsT3AoZmFsc2UpLCBpc1R3b0FkZHJlc3MoZmFsc2UpLAorICAgICAgICBpc0NvbW11dGFibGUoZmFsc2UpLCBoYXNQaHlzUmVnVXNlcyhmYWxzZSksIGhhc1BoeXNSZWdEZWZzKGZhbHNlKSwKKyAgICAgICAgaGFzUGh5c1JlZ0Nsb2JiZXJzKGZhbHNlKSwgaXNQZW5kaW5nKGZhbHNlKSwgaXNBdmFpbGFibGUoZmFsc2UpLAorICAgICAgICBpc1NjaGVkdWxlZChmYWxzZSksIGlzU2NoZWR1bGVIaWdoKGZhbHNlKSwgaXNTY2hlZHVsZUxvdyhmYWxzZSksCisgICAgICAgIGlzQ2xvbmVkKGZhbHNlKSwgaXNVbmJ1ZmZlcmVkKGZhbHNlKSwgaGFzUmVzZXJ2ZWRSZXNvdXJjZShmYWxzZSksCisgICAgICAgIGlzRGVwdGhDdXJyZW50KGZhbHNlKSwgaXNIZWlnaHRDdXJyZW50KGZhbHNlKSB7fQorCisgICAgLy8vIFxicmllZiBCb3VuZGFyeSBub2RlcyBhcmUgcGxhY2Vob2xkZXJzIGZvciB0aGUgYm91bmRhcnkgb2YgdGhlCisgICAgLy8vIHNjaGVkdWxpbmcgcmVnaW9uLgorICAgIC8vLworICAgIC8vLyBCb3VuZGFyeU5vZGVzIGNhbiBoYXZlIERBRyBlZGdlcywgaW5jbHVkaW5nIERhdGEgZWRnZXMsIGJ1dCB0aGV5IGRvIG5vdAorICAgIC8vLyBjb3JyZXNwb25kIHRvIHNjaGVkdWxhYmxlIGVudGl0aWVzIChlLmcuIGluc3RydWN0aW9ucykgYW5kIGRvIG5vdCBoYXZlIGEKKyAgICAvLy8gdmFsaWQgSUQuIENvbnNlcXVlbnRseSwgYWx3YXlzIGNoZWNrIGZvciBib3VuZGFyeSBub2RlcyBiZWZvcmUgYWNjZXNzaW5nCisgICAgLy8vIGFuIGFzc29jaWF0aXZlIGRhdGEgc3RydWN0dXJlIGtleWVkIG9uIG5vZGUgSUQuCisgICAgYm9vbCBpc0JvdW5kYXJ5Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIE5vZGVOdW0gPT0gQm91bmRhcnlJRDsgfQorCisgICAgLy8vIEFzc2lnbnMgdGhlIHJlcHJlc2VudGF0aXZlIFNETm9kZSBmb3IgdGhpcyBTVW5pdC4gVGhpcyBtYXkgYmUgdXNlZAorICAgIC8vLyBkdXJpbmcgcHJlLXJlZ2FsbG9jIHNjaGVkdWxpbmcuCisgICAgdm9pZCBzZXROb2RlKFNETm9kZSAqTikgeworICAgICAgYXNzZXJ0KCFJbnN0ciAmJiAiU2V0dGluZyBTRE5vZGUgb2YgU1VuaXQgd2l0aCBNYWNoaW5lSW5zdHIhIik7CisgICAgICBOb2RlID0gTjsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgcmVwcmVzZW50YXRpdmUgU0ROb2RlIGZvciB0aGlzIFNVbml0LiBUaGlzIG1heSBiZSB1c2VkCisgICAgLy8vIGR1cmluZyBwcmUtcmVnYWxsb2Mgc2NoZWR1bGluZy4KKyAgICBTRE5vZGUgKmdldE5vZGUoKSBjb25zdCB7CisgICAgICBhc3NlcnQoIUluc3RyICYmICJSZWFkaW5nIFNETm9kZSBvZiBTVW5pdCB3aXRoIE1hY2hpbmVJbnN0ciEiKTsKKyAgICAgIHJldHVybiBOb2RlOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoaXMgU1VuaXQgcmVmZXJzIHRvIGEgbWFjaGluZSBpbnN0cnVjdGlvbiBhcworICAgIC8vLyBvcHBvc2VkIHRvIGFuIFNETm9kZS4KKyAgICBib29sIGlzSW5zdHIoKSBjb25zdCB7IHJldHVybiBJbnN0cjsgfQorCisgICAgLy8vIEFzc2lnbnMgdGhlIGluc3RydWN0aW9uIGZvciB0aGUgU1VuaXQuIFRoaXMgbWF5IGJlIHVzZWQgZHVyaW5nCisgICAgLy8vIHBvc3QtcmVnYWxsb2Mgc2NoZWR1bGluZy4KKyAgICB2b2lkIHNldEluc3RyKE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgICAgIGFzc2VydCghTm9kZSAmJiAiU2V0dGluZyBNYWNoaW5lSW5zdHIgb2YgU1VuaXQgd2l0aCBTRE5vZGUhIik7CisgICAgICBJbnN0ciA9IE1JOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSByZXByZXNlbnRhdGl2ZSBNYWNoaW5lSW5zdHIgZm9yIHRoaXMgU1VuaXQuIFRoaXMgbWF5IGJlIHVzZWQKKyAgICAvLy8gZHVyaW5nIHBvc3QtcmVnYWxsb2Mgc2NoZWR1bGluZy4KKyAgICBNYWNoaW5lSW5zdHIgKmdldEluc3RyKCkgY29uc3QgeworICAgICAgYXNzZXJ0KCFOb2RlICYmICJSZWFkaW5nIE1hY2hpbmVJbnN0ciBvZiBTVW5pdCB3aXRoIFNETm9kZSEiKTsKKyAgICAgIHJldHVybiBJbnN0cjsKKyAgICB9CisKKyAgICAvLy8gQWRkcyB0aGUgc3BlY2lmaWVkIGVkZ2UgYXMgYSBwcmVkIG9mIHRoZSBjdXJyZW50IG5vZGUgaWYgbm90IGFscmVhZHkuCisgICAgLy8vIEl0IGFsc28gYWRkcyB0aGUgY3VycmVudCBub2RlIGFzIGEgc3VjY2Vzc29yIG9mIHRoZSBzcGVjaWZpZWQgbm9kZS4KKyAgICBib29sIGFkZFByZWQoY29uc3QgU0RlcCAmRCwgYm9vbCBSZXF1aXJlZCA9IHRydWUpOworCisgICAgLy8vIFxicmllZiBBZGRzIGEgYmFycmllciBlZGdlIHRvIFNVIGJ5IGNhbGxpbmcgYWRkUHJlZCgpLCB3aXRoIGxhdGVuY3kgMAorICAgIC8vLyBnZW5lcmFsbHkgb3IgbGF0ZW5jeSAxIGZvciBhIHN0b3JlIGZvbGxvd2VkIGJ5IGEgbG9hZC4KKyAgICBib29sIGFkZFByZWRCYXJyaWVyKFNVbml0ICpTVSkgeworICAgICAgU0RlcCBEZXAoU1UsIFNEZXA6OkJhcnJpZXIpOworICAgICAgdW5zaWduZWQgVHJ1ZU1lbU9yZGVyTGF0ZW5jeSA9CisgICAgICAgICgoU1UtPmdldEluc3RyKCktPm1heVN0b3JlKCkgJiYgdGhpcy0+Z2V0SW5zdHIoKS0+bWF5TG9hZCgpKSA/IDEgOiAwKTsKKyAgICAgIERlcC5zZXRMYXRlbmN5KFRydWVNZW1PcmRlckxhdGVuY3kpOworICAgICAgcmV0dXJuIGFkZFByZWQoRGVwKTsKKyAgICB9CisKKyAgICAvLy8gUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGVkZ2UgYXMgYSBwcmVkIG9mIHRoZSBjdXJyZW50IG5vZGUgaWYgaXQgZXhpc3RzLgorICAgIC8vLyBJdCBhbHNvIHJlbW92ZXMgdGhlIGN1cnJlbnQgbm9kZSBhcyBhIHN1Y2Nlc3NvciBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCisgICAgdm9pZCByZW1vdmVQcmVkKGNvbnN0IFNEZXAgJkQpOworCisgICAgLy8vIFJldHVybnMgdGhlIGRlcHRoIG9mIHRoaXMgbm9kZSwgd2hpY2ggaXMgdGhlIGxlbmd0aCBvZiB0aGUgbWF4aW11bSBwYXRoCisgICAgLy8vIHVwIHRvIGFueSBub2RlIHdoaWNoIGhhcyBubyBwcmVkZWNlc3NvcnMuCisgICAgdW5zaWduZWQgZ2V0RGVwdGgoKSBjb25zdCB7CisgICAgICBpZiAoIWlzRGVwdGhDdXJyZW50KQorICAgICAgICBjb25zdF9jYXN0PFNVbml0ICo+KHRoaXMpLT5Db21wdXRlRGVwdGgoKTsKKyAgICAgIHJldHVybiBEZXB0aDsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGhlaWdodCBvZiB0aGlzIG5vZGUsIHdoaWNoIGlzIHRoZSBsZW5ndGggb2YgdGhlCisgICAgLy8vIG1heGltdW0gcGF0aCBkb3duIHRvIGFueSBub2RlIHdoaWNoIGhhcyBubyBzdWNjZXNzb3JzLgorICAgIHVuc2lnbmVkIGdldEhlaWdodCgpIGNvbnN0IHsKKyAgICAgIGlmICghaXNIZWlnaHRDdXJyZW50KQorICAgICAgICBjb25zdF9jYXN0PFNVbml0ICo+KHRoaXMpLT5Db21wdXRlSGVpZ2h0KCk7CisgICAgICByZXR1cm4gSGVpZ2h0OworICAgIH0KKworICAgIC8vLyBcYnJpZWYgSWYgTmV3RGVwdGggaXMgZ3JlYXRlciB0aGFuIHRoaXMgbm9kZSdzIGRlcHRoIHZhbHVlLCBzZXRzIGl0IHRvCisgICAgLy8vIGJlIHRoZSBuZXcgZGVwdGggdmFsdWUuIFRoaXMgYWxzbyByZWN1cnNpdmVseSBtYXJrcyBzdWNjZXNzb3Igbm9kZXMKKyAgICAvLy8gZGlydHkuCisgICAgdm9pZCBzZXREZXB0aFRvQXRMZWFzdCh1bnNpZ25lZCBOZXdEZXB0aCk7CisKKyAgICAvLy8gXGJyaWVmIElmIE5ld0RlcHRoIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIG5vZGUncyBkZXB0aCB2YWx1ZSwgc2V0IGl0IHRvIGJlCisgICAgLy8vIHRoZSBuZXcgaGVpZ2h0IHZhbHVlLiBUaGlzIGFsc28gcmVjdXJzaXZlbHkgbWFya3MgcHJlZGVjZXNzb3Igbm9kZXMKKyAgICAvLy8gZGlydHkuCisgICAgdm9pZCBzZXRIZWlnaHRUb0F0TGVhc3QodW5zaWduZWQgTmV3SGVpZ2h0KTsKKworICAgIC8vLyBcYnJpZWYgU2V0cyBhIGZsYWcgaW4gdGhpcyBub2RlIHRvIGluZGljYXRlIHRoYXQgaXRzIHN0b3JlZCBEZXB0aCB2YWx1ZQorICAgIC8vLyB3aWxsIHJlcXVpcmUgcmVjb21wdXRhdGlvbiB0aGUgbmV4dCB0aW1lIGdldERlcHRoKCkgaXMgY2FsbGVkLgorICAgIHZvaWQgc2V0RGVwdGhEaXJ0eSgpOworCisgICAgLy8vIFxicmllZiBTZXRzIGEgZmxhZyBpbiB0aGlzIG5vZGUgdG8gaW5kaWNhdGUgdGhhdCBpdHMgc3RvcmVkIEhlaWdodCB2YWx1ZQorICAgIC8vLyB3aWxsIHJlcXVpcmUgcmVjb21wdXRhdGlvbiB0aGUgbmV4dCB0aW1lIGdldEhlaWdodCgpIGlzIGNhbGxlZC4KKyAgICB2b2lkIHNldEhlaWdodERpcnR5KCk7CisKKyAgICAvLy8gVGVzdHMgaWYgbm9kZSBOIGlzIGEgcHJlZGVjZXNzb3Igb2YgdGhpcyBub2RlLgorICAgIGJvb2wgaXNQcmVkKGNvbnN0IFNVbml0ICpOKSBjb25zdCB7CisgICAgICBmb3IgKGNvbnN0IFNEZXAgJlByZWQgOiBQcmVkcykKKyAgICAgICAgaWYgKFByZWQuZ2V0U1VuaXQoKSA9PSBOKQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vLyBUZXN0cyBpZiBub2RlIE4gaXMgYSBzdWNjZXNzb3Igb2YgdGhpcyBub2RlLgorICAgIGJvb2wgaXNTdWNjKGNvbnN0IFNVbml0ICpOKSBjb25zdCB7CisgICAgICBmb3IgKGNvbnN0IFNEZXAgJlN1Y2MgOiBTdWNjcykKKyAgICAgICAgaWYgKFN1Y2MuZ2V0U1VuaXQoKSA9PSBOKQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgaXNUb3BSZWFkeSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBOdW1QcmVkc0xlZnQgPT0gMDsKKyAgICB9CisgICAgYm9vbCBpc0JvdHRvbVJlYWR5KCkgY29uc3QgeworICAgICAgcmV0dXJuIE51bVN1Y2NzTGVmdCA9PSAwOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgT3JkZXJzIHRoaXMgbm9kZSdzIHByZWRlY2Vzc29yIGVkZ2VzIHN1Y2ggdGhhdCB0aGUgY3JpdGljYWwgcGF0aAorICAgIC8vLyBlZGdlIG9jY3VycyBmaXJzdC4KKyAgICB2b2lkIGJpYXNDcml0aWNhbFBhdGgoKTsKKworICAgIHZvaWQgZHVtcChjb25zdCBTY2hlZHVsZURBRyAqRykgY29uc3Q7CisgICAgdm9pZCBkdW1wQWxsKGNvbnN0IFNjaGVkdWxlREFHICpHKSBjb25zdDsKKyAgICByYXdfb3N0cmVhbSAmcHJpbnQocmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNVbml0ICpOID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1VuaXQgKlggPSBudWxscHRyKSBjb25zdDsKKyAgICByYXdfb3N0cmVhbSAmcHJpbnQocmF3X29zdHJlYW0gJk8sIGNvbnN0IFNjaGVkdWxlREFHICpHKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIHZvaWQgQ29tcHV0ZURlcHRoKCk7CisgICAgdm9pZCBDb21wdXRlSGVpZ2h0KCk7CisgIH07CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFNEZXAgaXMgZXF1aXZhbGVudCBleGNlcHQgZm9yIGxhdGVuY3kuCisgIGlubGluZSBib29sIFNEZXA6Om92ZXJsYXBzKGNvbnN0IFNEZXAgJk90aGVyKSBjb25zdCB7CisgICAgaWYgKERlcCAhPSBPdGhlci5EZXApCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgc3dpdGNoIChEZXAuZ2V0SW50KCkpIHsKKyAgICBjYXNlIERhdGE6CisgICAgY2FzZSBBbnRpOgorICAgIGNhc2UgT3V0cHV0OgorICAgICAgcmV0dXJuIENvbnRlbnRzLlJlZyA9PSBPdGhlci5Db250ZW50cy5SZWc7CisgICAgY2FzZSBPcmRlcjoKKyAgICAgIHJldHVybiBDb250ZW50cy5PcmRLaW5kID09IE90aGVyLkNvbnRlbnRzLk9yZEtpbmQ7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgZGVwZW5kZW5jeSBraW5kISIpOworICB9CisKKyAgLy8vLyBSZXR1cm5zIHRoZSBTVW5pdCB0byB3aGljaCB0aGlzIGVkZ2UgcG9pbnRzLgorICBpbmxpbmUgU1VuaXQgKlNEZXA6OmdldFNVbml0KCkgY29uc3QgeyByZXR1cm4gRGVwLmdldFBvaW50ZXIoKTsgfQorCisgIC8vLy8gQXNzaWducyB0aGUgU1VuaXQgdG8gd2hpY2ggdGhpcyBlZGdlIHBvaW50cy4KKyAgaW5saW5lIHZvaWQgU0RlcDo6c2V0U1VuaXQoU1VuaXQgKlNVKSB7IERlcC5zZXRQb2ludGVyKFNVKTsgfQorCisgIC8vLyBSZXR1cm5zIGFuIGVudW0gdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBraW5kIG9mIHRoZSBkZXBlbmRlbmNlLgorICBpbmxpbmUgU0RlcDo6S2luZCBTRGVwOjpnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gRGVwLmdldEludCgpOyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFxicmllZiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIHBsdWcgZGlmZmVyZW50IHByaW9yaXRpZXMgY29tcHV0YXRpb24KKyAgLy8vIGFsZ29yaXRobXMgaW50byB0aGUgbGlzdCBzY2hlZHVsZXIuIEl0IGltcGxlbWVudHMgdGhlIGludGVyZmFjZSBvZiBhCisgIC8vLyBzdGFuZGFyZCBwcmlvcml0eSBxdWV1ZSwgd2hlcmUgbm9kZXMgYXJlIGluc2VydGVkIGluIGFyYml0cmFyeSBvcmRlciBhbmQKKyAgLy8vIHJldHVybmVkIGluIHByaW9yaXR5IG9yZGVyLiAgVGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBwcmlvcml0eSBhbmQgdGhlCisgIC8vLyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcXVldWUgYXJlIHRvdGFsbHkgdXAgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRvCisgIC8vLyBkZWNpZGUuCisgIGNsYXNzIFNjaGVkdWxpbmdQcmlvcml0eVF1ZXVlIHsKKyAgICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKKyAgICB1bnNpZ25lZCBDdXJDeWNsZSA9IDA7CisgICAgYm9vbCBIYXNSZWFkeUZpbHRlcjsKKworICBwdWJsaWM6CisgICAgU2NoZWR1bGluZ1ByaW9yaXR5UXVldWUoYm9vbCByZiA9IGZhbHNlKSA6ICBIYXNSZWFkeUZpbHRlcihyZikge30KKworICAgIHZpcnR1YWwgflNjaGVkdWxpbmdQcmlvcml0eVF1ZXVlKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBib29sIGlzQm90dG9tVXAoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdE5vZGVzKHN0ZDo6dmVjdG9yPFNVbml0PiAmU1VuaXRzKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGFkZE5vZGUoY29uc3QgU1VuaXQgKlNVKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZU5vZGUoY29uc3QgU1VuaXQgKlNVKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VTdGF0ZSgpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBlbXB0eSgpIGNvbnN0ID0gMDsKKworICAgIGJvb2wgaGFzUmVhZHlGaWx0ZXIoKSBjb25zdCB7IHJldHVybiBIYXNSZWFkeUZpbHRlcjsgfQorCisgICAgdmlydHVhbCBib29sIHRyYWNrc1JlZ1ByZXNzdXJlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIHZpcnR1YWwgYm9vbCBpc1JlYWR5KFNVbml0ICopIGNvbnN0IHsKKyAgICAgIGFzc2VydCghSGFzUmVhZHlGaWx0ZXIgJiYgIlRoZSByZWFkeSBmaWx0ZXIgbXVzdCBvdmVycmlkZSBpc1JlYWR5KCkiKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBwdXNoKFNVbml0ICpVKSA9IDA7CisKKyAgICB2b2lkIHB1c2hfYWxsKGNvbnN0IHN0ZDo6dmVjdG9yPFNVbml0ICo+ICZOb2RlcykgeworICAgICAgZm9yIChzdGQ6OnZlY3RvcjxTVW5pdCAqPjo6Y29uc3RfaXRlcmF0b3IgSSA9IE5vZGVzLmJlZ2luKCksCisgICAgICAgICAgIEUgPSBOb2Rlcy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICAgIHB1c2goKkkpOworICAgIH0KKworICAgIHZpcnR1YWwgU1VuaXQgKnBvcCgpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmUoU1VuaXQgKlNVKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChTY2hlZHVsZURBRyAqKSBjb25zdCB7fQorCisgICAgLy8vIEFzIGVhY2ggbm9kZSBpcyBzY2hlZHVsZWQsIHRoaXMgbWV0aG9kIGlzIGludm9rZWQuICBUaGlzIGFsbG93cyB0aGUKKyAgICAvLy8gcHJpb3JpdHkgZnVuY3Rpb24gdG8gYWRqdXN0IHRoZSBwcmlvcml0eSBvZiByZWxhdGVkIHVuc2NoZWR1bGVkIG5vZGVzLAorICAgIC8vLyBmb3IgZXhhbXBsZS4KKyAgICB2aXJ0dWFsIHZvaWQgc2NoZWR1bGVkTm9kZShTVW5pdCAqKSB7fQorCisgICAgdmlydHVhbCB2b2lkIHVuc2NoZWR1bGVkTm9kZShTVW5pdCAqKSB7fQorCisgICAgdm9pZCBzZXRDdXJDeWNsZSh1bnNpZ25lZCBDeWNsZSkgeworICAgICAgQ3VyQ3ljbGUgPSBDeWNsZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXRDdXJDeWNsZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBDdXJDeWNsZTsKKyAgICB9CisgIH07CisKKyAgY2xhc3MgU2NoZWR1bGVEQUcgeworICBwdWJsaWM6CisgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE07ICAgICAgICAgICAgLy8vPCBUYXJnZXQgcHJvY2Vzc29yCisgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7ICAgICAgICAgLy8vPCBUYXJnZXQgaW5zdHJ1Y3Rpb24gaW5mb3JtYXRpb24KKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSTsgICAgICAvLy88IFRhcmdldCBwcm9jZXNzb3IgcmVnaXN0ZXIgaW5mbworICAgIE1hY2hpbmVGdW5jdGlvbiAmTUY7ICAgICAgICAgICAgICAgIC8vLzwgTWFjaGluZSBmdW5jdGlvbgorICAgIE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSTsgICAgICAgICAgIC8vLzwgVmlydHVhbC9yZWFsIHJlZ2lzdGVyIG1hcAorICAgIHN0ZDo6dmVjdG9yPFNVbml0PiBTVW5pdHM7ICAgICAgICAgIC8vLzwgVGhlIHNjaGVkdWxpbmcgdW5pdHMuCisgICAgU1VuaXQgRW50cnlTVTsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBTcGVjaWFsIG5vZGUgZm9yIHRoZSByZWdpb24gZW50cnkuCisgICAgU1VuaXQgRXhpdFNVOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBTcGVjaWFsIG5vZGUgZm9yIHRoZSByZWdpb24gZXhpdC4KKworI2lmZGVmIE5ERUJVRworICAgIHN0YXRpYyBjb25zdCBib29sIFN0cmVzc1NjaGVkID0gZmFsc2U7CisjZWxzZQorICAgIGJvb2wgU3RyZXNzU2NoZWQ7CisjZW5kaWYKKworICAgIGV4cGxpY2l0IFNjaGVkdWxlREFHKE1hY2hpbmVGdW5jdGlvbiAmbWYpOworCisgICAgdmlydHVhbCB+U2NoZWR1bGVEQUcoKTsKKworICAgIC8vLyBDbGVhcnMgdGhlIERBRyBzdGF0ZSAoYmV0d2VlbiByZWdpb25zKS4KKyAgICB2b2lkIGNsZWFyREFHKCk7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgTUNJbnN0ckRlc2Mgb2YgdGhpcyBTVW5pdC4KKyAgICAvLy8gUmV0dXJucyBOVUxMIGZvciBTRE5vZGVzIHdpdGhvdXQgYSBtYWNoaW5lIG9wY29kZS4KKyAgICBjb25zdCBNQ0luc3RyRGVzYyAqZ2V0SW5zdHJEZXNjKGNvbnN0IFNVbml0ICpTVSkgY29uc3QgeworICAgICAgaWYgKFNVLT5pc0luc3RyKCkpIHJldHVybiAmU1UtPmdldEluc3RyKCktPmdldERlc2MoKTsKKyAgICAgIHJldHVybiBnZXROb2RlRGVzYyhTVS0+Z2V0Tm9kZSgpKTsKKyAgICB9CisKKyAgICAvLy8gUG9wcyB1cCBhIEdyYXBoVml6L2d2IHdpbmRvdyB3aXRoIHRoZSBTY2hlZHVsZURBRyByZW5kZXJlZCB1c2luZyAnZG90Jy4KKyAgICB2aXJ0dWFsIHZvaWQgdmlld0dyYXBoKGNvbnN0IFR3aW5lICZOYW1lLCBjb25zdCBUd2luZSAmVGl0bGUpOworICAgIHZpcnR1YWwgdm9pZCB2aWV3R3JhcGgoKTsKKworICAgIHZpcnR1YWwgdm9pZCBkdW1wTm9kZShjb25zdCBTVW5pdCAqU1UpIGNvbnN0ID0gMDsKKworICAgIC8vLyBSZXR1cm5zIGEgbGFiZWwgZm9yIGFuIFNVbml0IG5vZGUgaW4gYSB2aXN1YWxpemF0aW9uIG9mIHRoZSBTY2hlZHVsZURBRy4KKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEdyYXBoTm9kZUxhYmVsKGNvbnN0IFNVbml0ICpTVSkgY29uc3QgPSAwOworCisgICAgLy8vIFJldHVybnMgYSBsYWJlbCBmb3IgdGhlIHJlZ2lvbiBvZiBjb2RlIGNvdmVyZWQgYnkgdGhlIERBRy4KKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldERBR05hbWUoKSBjb25zdCA9IDA7CisKKyAgICAvLy8gQWRkcyBjdXN0b20gZmVhdHVyZXMgZm9yIGEgdmlzdWFsaXphdGlvbiBvZiB0aGUgU2NoZWR1bGVEQUcuCisgICAgdmlydHVhbCB2b2lkIGFkZEN1c3RvbUdyYXBoRmVhdHVyZXMoR3JhcGhXcml0ZXI8U2NoZWR1bGVEQUcqPiAmKSBjb25zdCB7fQorCisjaWZuZGVmIE5ERUJVRworICAgIC8vLyBcYnJpZWYgVmVyaWZpZXMgdGhhdCBhbGwgU1VuaXRzIHdlcmUgc2NoZWR1bGVkIGFuZCB0aGF0IHRoZWlyIHN0YXRlIGlzCisgICAgLy8vIGNvbnNpc3RlbnQuIFJldHVybnMgdGhlIG51bWJlciBvZiBzY2hlZHVsZWQgU1VuaXRzLgorICAgIHVuc2lnbmVkIFZlcmlmeVNjaGVkdWxlZERBRyhib29sIGlzQm90dG9tVXApOworI2VuZGlmCisKKyAgcHJpdmF0ZToKKyAgICAvLy8gUmV0dXJucyB0aGUgTUNJbnN0ckRlc2Mgb2YgdGhpcyBTRE5vZGUgb3IgTlVMTC4KKyAgICBjb25zdCBNQ0luc3RyRGVzYyAqZ2V0Tm9kZURlc2MoY29uc3QgU0ROb2RlICpOb2RlKSBjb25zdDsKKyAgfTsKKworICBjbGFzcyBTVW5pdEl0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVbml0LCBwdHJkaWZmX3Q+IHsKKyAgICBTVW5pdCAqTm9kZTsKKyAgICB1bnNpZ25lZCBPcGVyYW5kOworCisgICAgU1VuaXRJdGVyYXRvcihTVW5pdCAqTiwgdW5zaWduZWQgT3ApIDogTm9kZShOKSwgT3BlcmFuZChPcCkge30KKworICBwdWJsaWM6CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNVbml0SXRlcmF0b3ImIHgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBPcGVyYW5kID09IHguT3BlcmFuZDsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNVbml0SXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KHgpOyB9CisKKyAgICBwb2ludGVyIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBOb2RlLT5QcmVkc1tPcGVyYW5kXS5nZXRTVW5pdCgpOworICAgIH0KKyAgICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBvcGVyYXRvciooKTsgfQorCisgICAgU1VuaXRJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgICAgICAgICAgICAgICAgLy8gUHJlaW5jcmVtZW50CisgICAgICArK09wZXJhbmQ7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIFNVbml0SXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgLy8gUG9zdGluY3JlbWVudAorICAgICAgU1VuaXRJdGVyYXRvciB0bXAgPSAqdGhpczsgKysqdGhpczsgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICBzdGF0aWMgU1VuaXRJdGVyYXRvciBiZWdpbihTVW5pdCAqTikgeyByZXR1cm4gU1VuaXRJdGVyYXRvcihOLCAwKTsgfQorICAgIHN0YXRpYyBTVW5pdEl0ZXJhdG9yIGVuZCAgKFNVbml0ICpOKSB7CisgICAgICByZXR1cm4gU1VuaXRJdGVyYXRvcihOLCAodW5zaWduZWQpTi0+UHJlZHMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXRPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gT3BlcmFuZDsgfQorICAgIGNvbnN0IFNVbml0ICpnZXROb2RlKCkgY29uc3QgeyByZXR1cm4gTm9kZTsgfQorCisgICAgLy8vIFRlc3RzIGlmIHRoaXMgaXMgbm90IGFuIFNEZXA6OkRhdGEgZGVwZW5kZW5jZS4KKyAgICBib29sIGlzQ3RybERlcCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRTRGVwKCkuaXNDdHJsKCk7CisgICAgfQorICAgIGJvb2wgaXNBcnRpZmljaWFsRGVwKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFNEZXAoKS5pc0FydGlmaWNpYWwoKTsKKyAgICB9CisgICAgY29uc3QgU0RlcCAmZ2V0U0RlcCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBOb2RlLT5QcmVkc1tPcGVyYW5kXTsKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPFNVbml0Kj4geworICAgIHR5cGVkZWYgU1VuaXQgKk5vZGVSZWY7CisgICAgdHlwZWRlZiBTVW5pdEl0ZXJhdG9yIENoaWxkSXRlcmF0b3JUeXBlOworICAgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShTVW5pdCAqTikgeyByZXR1cm4gTjsgfQorICAgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsKKyAgICAgIHJldHVybiBTVW5pdEl0ZXJhdG9yOjpiZWdpbihOKTsKKyAgICB9CisgICAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsKKyAgICAgIHJldHVybiBTVW5pdEl0ZXJhdG9yOjplbmQoTik7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxTY2hlZHVsZURBRyo+IDogcHVibGljIEdyYXBoVHJhaXRzPFNVbml0Kj4geworICAgIHR5cGVkZWYgcG9pbnRlcl9pdGVyYXRvcjxzdGQ6OnZlY3RvcjxTVW5pdD46Oml0ZXJhdG9yPiBub2Rlc19pdGVyYXRvcjsKKyAgICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oU2NoZWR1bGVEQUcgKkcpIHsKKyAgICAgIHJldHVybiBub2Rlc19pdGVyYXRvcihHLT5TVW5pdHMuYmVnaW4oKSk7CisgICAgfQorICAgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoU2NoZWR1bGVEQUcgKkcpIHsKKyAgICAgIHJldHVybiBub2Rlc19pdGVyYXRvcihHLT5TVW5pdHMuZW5kKCkpOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBjbGFzcyBjYW4gY29tcHV0ZSBhIHRvcG9sb2dpY2FsIG9yZGVyaW5nIGZvciBTVW5pdHMgYW5kIHByb3ZpZGVzCisgIC8vLyBtZXRob2RzIGZvciBkeW5hbWljYWxseSB1cGRhdGluZyB0aGUgb3JkZXJpbmcgYXMgbmV3IGVkZ2VzIGFyZSBhZGRlZC4KKyAgLy8vCisgIC8vLyBUaGlzIGFsbG93cyBhIHZlcnkgZmFzdCBpbXBsZW1lbnRhdGlvbiBvZiBJc1JlYWNoYWJsZSwgZm9yIGV4YW1wbGUuCisgIGNsYXNzIFNjaGVkdWxlREFHVG9wb2xvZ2ljYWxTb3J0IHsKKyAgICAvLy8gQSByZWZlcmVuY2UgdG8gdGhlIFNjaGVkdWxlREFHJ3MgU1VuaXRzLgorICAgIHN0ZDo6dmVjdG9yPFNVbml0PiAmU1VuaXRzOworICAgIFNVbml0ICpFeGl0U1U7CisKKyAgICAvLy8gTWFwcyB0b3BvbG9naWNhbCBpbmRleCB0byB0aGUgbm9kZSBudW1iZXIuCisgICAgc3RkOjp2ZWN0b3I8aW50PiBJbmRleDJOb2RlOworICAgIC8vLyBNYXBzIHRoZSBub2RlIG51bWJlciB0byBpdHMgdG9wb2xvZ2ljYWwgaW5kZXguCisgICAgc3RkOjp2ZWN0b3I8aW50PiBOb2RlMkluZGV4OworICAgIC8vLyBhIHNldCBvZiBub2RlcyB2aXNpdGVkIGR1cmluZyBhIERGUyB0cmF2ZXJzYWwuCisgICAgQml0VmVjdG9yIFZpc2l0ZWQ7CisKKyAgICAvLy8gTWFrZXMgYSBERlMgdHJhdmVyc2FsIGFuZCBtYXJrIGFsbCBub2RlcyBhZmZlY3RlZCBieSB0aGUgZWRnZSBpbnNlcnRpb24uCisgICAgLy8vIFRoZXNlIG5vZGVzIHdpbGwgbGF0ZXIgZ2V0IG5ldyB0b3BvbG9naWNhbCBpbmRleGVzIGJ5IG1lYW5zIG9mIHRoZSBTaGlmdAorICAgIC8vLyBtZXRob2QuCisgICAgdm9pZCBERlMoY29uc3QgU1VuaXQgKlNVLCBpbnQgVXBwZXJCb3VuZCwgYm9vbCYgSGFzTG9vcCk7CisKKyAgICAvLy8gXGJyaWVmIFJlYXNzaWducyB0b3BvbG9naWNhbCBpbmRleGVzIGZvciB0aGUgbm9kZXMgaW4gdGhlIERBRyB0bworICAgIC8vLyBwcmVzZXJ2ZSB0aGUgdG9wb2xvZ2ljYWwgb3JkZXJpbmcuCisgICAgdm9pZCBTaGlmdChCaXRWZWN0b3ImIFZpc2l0ZWQsIGludCBMb3dlckJvdW5kLCBpbnQgVXBwZXJCb3VuZCk7CisKKyAgICAvLy8gQXNzaWducyB0aGUgdG9wb2xvZ2ljYWwgaW5kZXggdG8gdGhlIG5vZGUgbi4KKyAgICB2b2lkIEFsbG9jYXRlKGludCBuLCBpbnQgaW5kZXgpOworCisgIHB1YmxpYzoKKyAgICBTY2hlZHVsZURBR1RvcG9sb2dpY2FsU29ydChzdGQ6OnZlY3RvcjxTVW5pdD4gJlNVbml0cywgU1VuaXQgKkV4aXRTVSk7CisKKyAgICAvLy8gQ3JlYXRlcyB0aGUgaW5pdGlhbCB0b3BvbG9naWNhbCBvcmRlcmluZyBmcm9tIHRoZSBEQUcgdG8gYmUgc2NoZWR1bGVkLgorICAgIHZvaWQgSW5pdERBR1RvcG9sb2dpY2FsU29ydGluZygpOworCisgICAgLy8vIFJldHVybnMgYW4gYXJyYXkgb2YgU1VzIHRoYXQgYXJlIGJvdGggaW4gdGhlIHN1Y2Nlc3NvcgorICAgIC8vLyBzdWJ0cmVlIG9mIFN0YXJ0U1UgYW5kIGluIHRoZSBwcmVkZWNlc3NvciBzdWJ0cmVlIG9mIFRhcmdldFNVLgorICAgIC8vLyBTdGFydFNVIGFuZCBUYXJnZXRTVSBhcmUgbm90IGluIHRoZSBhcnJheS4KKyAgICAvLy8gU3VjY2VzcyBpcyBmYWxzZSBpZiBUYXJnZXRTVSBpcyBub3QgaW4gdGhlIHN1Y2Nlc3NvciBzdWJ0cmVlIG9mCisgICAgLy8vIFN0YXJ0U1UsIGVsc2UgaXQgaXMgdHJ1ZS4KKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IEdldFN1YkdyYXBoKGNvbnN0IFNVbml0ICZTdGFydFNVLCBjb25zdCBTVW5pdCAmVGFyZ2V0U1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZTdWNjZXNzKTsKKworICAgIC8vLyBDaGVja3MgaWYgXHAgU1UgaXMgcmVhY2hhYmxlIGZyb20gXHAgVGFyZ2V0U1UuCisgICAgYm9vbCBJc1JlYWNoYWJsZShjb25zdCBTVW5pdCAqU1UsIGNvbnN0IFNVbml0ICpUYXJnZXRTVSk7CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGFkZFByZWQoVGFyZ2V0U1UsIFNVKSBjcmVhdGVzIGEgY3ljbGUuCisgICAgYm9vbCBXaWxsQ3JlYXRlQ3ljbGUoU1VuaXQgKlRhcmdldFNVLCBTVW5pdCAqU1UpOworCisgICAgLy8vIFxicmllZiBVcGRhdGVzIHRoZSB0b3BvbG9naWNhbCBvcmRlcmluZyB0byBhY2NvbW1vZGF0ZSBhbiBlZGdlIHRvIGJlCisgICAgLy8vIGFkZGVkIGZyb20gU1VuaXQgXHAgWCB0byBTVW5pdCBccCBZLgorICAgIHZvaWQgQWRkUHJlZChTVW5pdCAqWSwgU1VuaXQgKlgpOworCisgICAgLy8vIFxicmllZiBVcGRhdGVzIHRoZSB0b3BvbG9naWNhbCBvcmRlcmluZyB0byBhY2NvbW1vZGF0ZSBhbiBhbiBlZGdlIHRvIGJlCisgICAgLy8vIHJlbW92ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIG5vZGUgXHAgTiBmcm9tIHRoZSBwcmVkZWNlc3NvcnMgb2YgdGhlCisgICAgLy8vIGN1cnJlbnQgbm9kZSBccCBNLgorICAgIHZvaWQgUmVtb3ZlUHJlZChTVW5pdCAqTSwgU1VuaXQgKk4pOworCisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxpbnQ+OjppdGVyYXRvciBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGludD46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICAgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gSW5kZXgyTm9kZS5iZWdpbigpOyB9CisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBJbmRleDJOb2RlLmJlZ2luKCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBJbmRleDJOb2RlLmVuZCgpOyB9CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gSW5kZXgyTm9kZS5lbmQoKTsgfQorCisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxpbnQ+OjpyZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxpbnQ+Ojpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgICAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiBJbmRleDJOb2RlLnJiZWdpbigpOyB9CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiBJbmRleDJOb2RlLnJiZWdpbigpOyB9CisgICAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gSW5kZXgyTm9kZS5yZW5kKCk7IH0KKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiBJbmRleDJOb2RlLnJlbmQoKTsgfQorICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1NDSEVEVUxFREFHX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TY2hlZHVsZURBR0luc3Rycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHSW5zdHJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ4ODIyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TY2hlZHVsZURBR0luc3Rycy5oCkBAIC0wLDAgKzEsMzg0IEBACisvLz09PS0gU2NoZWR1bGVEQUdJbnN0cnMuaCAtIE1hY2hpbmVJbnN0ciBTY2hlZHVsaW5nIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZSBJbXBsZW1lbnRzIHRoZSBTY2hlZHVsZURBR0luc3RycyBjbGFzcywgd2hpY2ggaW1wbGVtZW50cyBzY2hlZHVsaW5nCisvLy8gZm9yIGEgTWFjaGluZUluc3RyLWJhc2VkIGRlcGVuZGVuY3kgZ3JhcGguCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fU0NIRURVTEVEQUdJTlNUUlNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fU0NIRURVTEVEQUdJTlNUUlNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3BhcnNlTXVsdGlTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TcGFyc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZVBoeXNSZWdzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRTY2hlZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTGFuZUJpdG1hc2suaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisgIGNsYXNzIExpdmVJbnRlcnZhbHM7CisgIGNsYXNzIE1hY2hpbmVGcmFtZUluZm87CisgIGNsYXNzIE1hY2hpbmVGdW5jdGlvbjsKKyAgY2xhc3MgTWFjaGluZUluc3RyOworICBjbGFzcyBNYWNoaW5lTG9vcEluZm87CisgIGNsYXNzIE1hY2hpbmVPcGVyYW5kOworICBzdHJ1Y3QgTUNTY2hlZENsYXNzRGVzYzsKKyAgY2xhc3MgUHJlc3N1cmVEaWZmczsKKyAgY2xhc3MgUHNldWRvU291cmNlVmFsdWU7CisgIGNsYXNzIFJlZ1ByZXNzdXJlVHJhY2tlcjsKKyAgY2xhc3MgVW5kZWZWYWx1ZTsKKyAgY2xhc3MgVmFsdWU7CisKKyAgLy8vIEFuIGluZGl2aWR1YWwgbWFwcGluZyBmcm9tIHZpcnR1YWwgcmVnaXN0ZXIgbnVtYmVyIHRvIFNVbml0LgorICBzdHJ1Y3QgVlJlZzJTVW5pdCB7CisgICAgdW5zaWduZWQgVmlydFJlZzsKKyAgICBMYW5lQml0bWFzayBMYW5lTWFzazsKKyAgICBTVW5pdCAqU1U7CisKKyAgICBWUmVnMlNVbml0KHVuc2lnbmVkIFZSZWcsIExhbmVCaXRtYXNrIExhbmVNYXNrLCBTVW5pdCAqU1UpCisgICAgICA6IFZpcnRSZWcoVlJlZyksIExhbmVNYXNrKExhbmVNYXNrKSwgU1UoU1UpIHt9CisKKyAgICB1bnNpZ25lZCBnZXRTcGFyc2VTZXRJbmRleCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBUYXJnZXRSZWdpc3RlckluZm86OnZpcnRSZWcySW5kZXgoVmlydFJlZyk7CisgICAgfQorICB9OworCisgIC8vLyBNYXBwaW5nIGZyb20gdmlydHVhbCByZWdpc3RlciB0byBTVW5pdCBpbmNsdWRpbmcgYW4gb3BlcmFuZCBpbmRleC4KKyAgc3RydWN0IFZSZWcyU1VuaXRPcGVySWR4IDogcHVibGljIFZSZWcyU1VuaXQgeworICAgIHVuc2lnbmVkIE9wZXJhbmRJbmRleDsKKworICAgIFZSZWcyU1VuaXRPcGVySWR4KHVuc2lnbmVkIFZSZWcsIExhbmVCaXRtYXNrIExhbmVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wZXJhbmRJbmRleCwgU1VuaXQgKlNVKQorICAgICAgOiBWUmVnMlNVbml0KFZSZWcsIExhbmVNYXNrLCBTVSksIE9wZXJhbmRJbmRleChPcGVyYW5kSW5kZXgpIHt9CisgIH07CisKKyAgLy8vIFJlY29yZCBhIHBoeXNpY2FsIHJlZ2lzdGVyIGFjY2Vzcy4KKyAgLy8vIEZvciBub24tZGF0YS1kZXBlbmRlbnQgdXNlcywgT3BJZHggPT0gLTEuCisgIHN0cnVjdCBQaHlzUmVnU1VPcGVyIHsKKyAgICBTVW5pdCAqU1U7CisgICAgaW50IE9wSWR4OworICAgIHVuc2lnbmVkIFJlZzsKKworICAgIFBoeXNSZWdTVU9wZXIoU1VuaXQgKnN1LCBpbnQgb3AsIHVuc2lnbmVkIFIpOiBTVShzdSksIE9wSWR4KG9wKSwgUmVnKFIpIHt9CisKKyAgICB1bnNpZ25lZCBnZXRTcGFyc2VTZXRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIFJlZzsgfQorICB9OworCisgIC8vLyBVc2UgYSBTcGFyc2VNdWx0aVNldCB0byB0cmFjayBwaHlzaWNhbCByZWdpc3RlcnMuIFN0b3JhZ2UgaXMgb25seQorICAvLy8gYWxsb2NhdGVkIG9uY2UgZm9yIHRoZSBwYXNzLiBJdCBjYW4gYmUgY2xlYXJlZCBpbiBjb25zdGFudCB0aW1lIGFuZCByZXVzZWQKKyAgLy8vIHdpdGhvdXQgYW55IGZyZWVzLgorICB1c2luZyBSZWcyU1VuaXRzTWFwID0KKyAgICAgIFNwYXJzZU11bHRpU2V0PFBoeXNSZWdTVU9wZXIsIGlkZW50aXR5PHVuc2lnbmVkPiwgdWludDE2X3Q+OworCisgIC8vLyBVc2UgU3BhcnNlU2V0IGFzIGEgU3BhcnNlTWFwIGJ5IHJlbHlpbmcgb24gdGhlIGZhY3QgdGhhdCBpdCBuZXZlcgorICAvLy8gY29tcGFyZXMgVmFsdWVUJ3MsIG9ubHkgdW5zaWduZWQga2V5cy4gVGhpcyBhbGxvd3MgdGhlIHNldCB0byBiZSBjbGVhcmVkCisgIC8vLyBiZXR3ZWVuIHNjaGVkdWxpbmcgcmVnaW9ucyBpbiBjb25zdGFudCB0aW1lIGFzIGxvbmcgYXMgVmFsdWVUIGRvZXMgbm90CisgIC8vLyByZXF1aXJlIGEgZGVzdHJ1Y3Rvci4KKyAgdXNpbmcgVlJlZzJTVW5pdE1hcCA9IFNwYXJzZVNldDxWUmVnMlNVbml0LCBWaXJ0UmVnMkluZGV4RnVuY3Rvcj47CisKKyAgLy8vIFRyYWNrIGxvY2FsIHVzZXMgb2YgdmlydHVhbCByZWdpc3RlcnMuIFRoZXNlIHVzZXMgYXJlIGdhdGhlcmVkIGJ5IHRoZSBEQUcKKyAgLy8vIGJ1aWxkZXIgYW5kIG1heSBiZSBjb25zdWx0ZWQgYnkgdGhlIHNjaGVkdWxlciB0byBhdm9pZCBpdGVyYXRpbmcgYW4gZW50aXJlCisgIC8vLyB2cmVnIHVzZSBsaXN0LgorICB1c2luZyBWUmVnMlNVbml0TXVsdGlNYXAgPSBTcGFyc2VNdWx0aVNldDxWUmVnMlNVbml0LCBWaXJ0UmVnMkluZGV4RnVuY3Rvcj47CisKKyAgdXNpbmcgVlJlZzJTVW5pdE9wZXJJZHhNdWx0aU1hcCA9CisgICAgICBTcGFyc2VNdWx0aVNldDxWUmVnMlNVbml0T3BlcklkeCwgVmlydFJlZzJJbmRleEZ1bmN0b3I+OworCisgIHVzaW5nIFZhbHVlVHlwZSA9IFBvaW50ZXJVbmlvbjxjb25zdCBWYWx1ZSAqLCBjb25zdCBQc2V1ZG9Tb3VyY2VWYWx1ZSAqPjsKKworICBzdHJ1Y3QgVW5kZXJseWluZ09iamVjdCA6IFBvaW50ZXJJbnRQYWlyPFZhbHVlVHlwZSwgMSwgYm9vbD4geworICAgIFVuZGVybHlpbmdPYmplY3QoVmFsdWVUeXBlIFYsIGJvb2wgTWF5QWxpYXMpCisgICAgICAgIDogUG9pbnRlckludFBhaXI8VmFsdWVUeXBlLCAxLCBib29sPihWLCBNYXlBbGlhcykge30KKworICAgIFZhbHVlVHlwZSBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGdldFBvaW50ZXIoKTsgfQorICAgIGJvb2wgbWF5QWxpYXMoKSBjb25zdCB7IHJldHVybiBnZXRJbnQoKTsgfQorICB9OworCisgIHVzaW5nIFVuZGVybHlpbmdPYmplY3RzVmVjdG9yID0gU21hbGxWZWN0b3I8VW5kZXJseWluZ09iamVjdCwgND47CisKKyAgLy8vIEEgU2NoZWR1bGVEQUcgZm9yIHNjaGVkdWxpbmcgbGlzdHMgb2YgTWFjaGluZUluc3RyLgorICBjbGFzcyBTY2hlZHVsZURBR0luc3RycyA6IHB1YmxpYyBTY2hlZHVsZURBRyB7CisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBNYWNoaW5lTG9vcEluZm8gKk1MSTsKKyAgICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICZNRkk7CisKKyAgICAvLy8gVGFyZ2V0U2NoZWRNb2RlbCBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIG1hY2hpbmUgbW9kZWwuCisgICAgVGFyZ2V0U2NoZWRNb2RlbCBTY2hlZE1vZGVsOworCisgICAgLy8vIFRydWUgaWYgdGhlIERBRyBidWlsZGVyIHNob3VsZCByZW1vdmUga2lsbCBmbGFncyAoaW4gcHJlcGFyYXRpb24gZm9yCisgICAgLy8vIHJlc2NoZWR1bGluZykuCisgICAgYm9vbCBSZW1vdmVLaWxsRmxhZ3M7CisKKyAgICAvLy8gVGhlIHN0YW5kYXJkIERBRyBidWlsZGVyIGRvZXMgbm90IG5vcm1hbGx5IGluY2x1ZGUgdGVybWluYXRvcnMgYXMgREFHCisgICAgLy8vIG5vZGVzIGJlY2F1c2UgaXQgZG9lcyBub3QgY3JlYXRlIHRoZSBuZWNlc3NhcnkgZGVwZW5kZW5jaWVzIHRvIHByZXZlbnQKKyAgICAvLy8gcmVvcmRlcmluZy4gQSBzcGVjaWFsaXplZCBzY2hlZHVsZXIgY2FuIG92ZXJyaWRlCisgICAgLy8vIFRhcmdldEluc3RySW5mbzo6aXNTY2hlZHVsaW5nQm91bmRhcnkgdGhlbiBlbmFibGUgdGhpcyBmbGFnIHRvIGluZGljYXRlCisgICAgLy8vIGl0IGhhcyB0YWtlbiByZXNwb25zaWJpbGl0eSBmb3Igc2NoZWR1bGluZyB0aGUgdGVybWluYXRvciBjb3JyZWN0bHkuCisgICAgYm9vbCBDYW5IYW5kbGVUZXJtaW5hdG9ycyA9IGZhbHNlOworCisgICAgLy8vIFdoZXRoZXIgbGFuZSBtYXNrcyBzaG91bGQgZ2V0IHRyYWNrZWQuCisgICAgYm9vbCBUcmFja0xhbmVNYXNrcyA9IGZhbHNlOworCisgICAgLy8gU3RhdGUgc3BlY2lmaWMgdG8gdGhlIGN1cnJlbnQgc2NoZWR1bGluZyByZWdpb24uCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLy8gVGhlIGJsb2NrIGluIHdoaWNoIHRvIGluc2VydCBpbnN0cnVjdGlvbnMKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkI7CisKKyAgICAvLy8gVGhlIGJlZ2lubmluZyBvZiB0aGUgcmFuZ2UgdG8gYmUgc2NoZWR1bGVkLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBSZWdpb25CZWdpbjsKKworICAgIC8vLyBUaGUgZW5kIG9mIHRoZSByYW5nZSB0byBiZSBzY2hlZHVsZWQuCisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFJlZ2lvbkVuZDsKKworICAgIC8vLyBJbnN0cnVjdGlvbnMgaW4gdGhpcyByZWdpb24gKGRpc3RhbmNlKFJlZ2lvbkJlZ2luLCBSZWdpb25FbmQpKS4KKyAgICB1bnNpZ25lZCBOdW1SZWdpb25JbnN0cnM7CisKKyAgICAvLy8gQWZ0ZXIgY2FsbGluZyBCdWlsZFNjaGVkR3JhcGgsIGVhY2ggbWFjaGluZSBpbnN0cnVjdGlvbiBpbiB0aGUgY3VycmVudAorICAgIC8vLyBzY2hlZHVsaW5nIHJlZ2lvbiBpcyBtYXBwZWQgdG8gYW4gU1VuaXQuCisgICAgRGVuc2VNYXA8TWFjaGluZUluc3RyKiwgU1VuaXQqPiBNSVNVbml0TWFwOworCisgICAgLy8gU3RhdGUgaW50ZXJuYWwgdG8gREFHIGJ1aWxkaW5nLgorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vLyBEZWZzLCBVc2VzIC0gUmVtZW1iZXIgd2hlcmUgZGVmcyBhbmQgdXNlcyBvZiBlYWNoIHJlZ2lzdGVyIGFyZSBhcyB3ZQorICAgIC8vLyBpdGVyYXRlIHVwd2FyZCB0aHJvdWdoIHRoZSBpbnN0cnVjdGlvbnMuIFRoaXMgaXMgYWxsb2NhdGVkIGhlcmUgaW5zdGVhZAorICAgIC8vLyBvZiBpbnNpZGUgQnVpbGRTY2hlZEdyYXBoIHRvIGF2b2lkIHRoZSBuZWVkIGZvciBpdCB0byBiZSBpbml0aWFsaXplZCBhbmQKKyAgICAvLy8gZGVzdHJ1Y3RlZCBmb3IgZWFjaCBibG9jay4KKyAgICBSZWcyU1VuaXRzTWFwIERlZnM7CisgICAgUmVnMlNVbml0c01hcCBVc2VzOworCisgICAgLy8vIFRyYWNrcyB0aGUgbGFzdCBpbnN0cnVjdGlvbihzKSBpbiB0aGlzIHJlZ2lvbiBkZWZpbmluZyBlYWNoIHZpcnR1YWwKKyAgICAvLy8gcmVnaXN0ZXIuIFRoZXJlIG1heSBiZSBtdWx0aXBsZSBjdXJyZW50IGRlZmluaXRpb25zIGZvciBhIHJlZ2lzdGVyIHdpdGgKKyAgICAvLy8gZGlzanVuY3QgbGFuZW1hc2tzLgorICAgIFZSZWcyU1VuaXRNdWx0aU1hcCBDdXJyZW50VlJlZ0RlZnM7CisgICAgLy8vIFRyYWNrcyB0aGUgbGFzdCBpbnN0cnVjdGlvbnMgaW4gdGhpcyByZWdpb24gdXNpbmcgZWFjaCB2aXJ0dWFsIHJlZ2lzdGVyLgorICAgIFZSZWcyU1VuaXRPcGVySWR4TXVsdGlNYXAgQ3VycmVudFZSZWdVc2VzOworCisgICAgQWxpYXNBbmFseXNpcyAqQUFGb3JEZXAgPSBudWxscHRyOworCisgICAgLy8vIFJlbWVtYmVyIGEgZ2VuZXJpYyBzaWRlLWVmZmVjdGluZyBpbnN0cnVjdGlvbiBhcyB3ZSBwcm9jZWVkLgorICAgIC8vLyBObyBvdGhlciBTVSBldmVyIGdldHMgc2NoZWR1bGVkIGFyb3VuZCBpdCAoZXhjZXB0IGluIHRoZSBzcGVjaWFsCisgICAgLy8vIGNhc2Ugb2YgYSBodWdlIHJlZ2lvbiB0aGF0IGdldHMgcmVkdWNlZCkuCisgICAgU1VuaXQgKkJhcnJpZXJDaGFpbiA9IG51bGxwdHI7CisKKyAgcHVibGljOgorICAgIC8vLyBBIGxpc3Qgb2YgU1VuaXRzLCB1c2VkIGluIFZhbHVlMlNVc01hcCwgZHVyaW5nIERBRyBjb25zdHJ1Y3Rpb24uCisgICAgLy8vIE5vdGU6IHRvIGdhaW4gc3BlZWQgaXQgbWlnaHQgYmUgd29ydGggaW52ZXN0aWdhdGluZyBhbiBvcHRpbWl6ZWQKKyAgICAvLy8gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBkYXRhIHN0cnVjdHVyZSwgc3VjaCBhcyBhIHNpbmdseSBsaW5rZWQgbGlzdAorICAgIC8vLyB3aXRoIGEgbWVtb3J5IHBvb2wgKFNtYWxsVmVjdG9yIHdhcyB0cmllZCBidXQgc2xvdyBhbmQgU3BhcnNlU2V0IGlzIG5vdAorICAgIC8vLyBhcHBsaWNhYmxlKS4KKyAgICB1c2luZyBTVUxpc3QgPSBzdGQ6Omxpc3Q8U1VuaXQgKj47CisKKyAgcHJvdGVjdGVkOgorICAgIC8vLyBcYnJpZWYgQSBtYXAgZnJvbSBWYWx1ZVR5cGUgdG8gU1VMaXN0LCB1c2VkIGR1cmluZyBEQUcgY29uc3RydWN0aW9uLCBhcworICAgIC8vLyBhIG1lYW5zIG9mIHJlbWVtYmVyaW5nIHdoaWNoIFNVcyBkZXBlbmQgb24gd2hpY2ggbWVtb3J5IGxvY2F0aW9ucy4KKyAgICBjbGFzcyBWYWx1ZTJTVXNNYXA7CisKKyAgICAvLy8gUmVkdWNlcyBtYXBzIGluIEZJRk8gb3JkZXIsIGJ5IE4gU1VzLiBUaGlzIGlzIGJldHRlciB0aGFuIHR1cm5pbmcKKyAgICAvLy8gZXZlcnkgTnRoIG1lbW9yeSBTVSBpbnRvIEJhcnJpZXJDaGFpbiBpbiBidWlsZFNjaGVkR3JhcGgoKSwgc2luY2UKKyAgICAvLy8gaXQgYXZvaWRzIHVubmVjZXNzYXJ5IGVkZ2VzIGJldHdlZW4gc2VlbiBTVXMgYWJvdmUgdGhlIG5ldyBCYXJyaWVyQ2hhaW4sCisgICAgLy8vIGFuZCB0aG9zZSBiZWxvdyBpdC4KKyAgICB2b2lkIHJlZHVjZUh1Z2VNZW1Ob2RlTWFwcyhWYWx1ZTJTVXNNYXAgJnN0b3JlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZTJTVXNNYXAgJmxvYWRzLCB1bnNpZ25lZCBOKTsKKworICAgIC8vLyBcYnJpZWYgQWRkcyBhIGNoYWluIGVkZ2UgYmV0d2VlbiBTVWEgYW5kIFNVYiwgYnV0IG9ubHkgaWYgYm90aAorICAgIC8vLyBBbGlhc0FuYWx5c2lzIGFuZCBUYXJnZXQgZmFpbCB0byBkZW55IHRoZSBkZXBlbmRlbmN5LgorICAgIHZvaWQgYWRkQ2hhaW5EZXBlbmRlbmN5KFNVbml0ICpTVWEsIFNVbml0ICpTVWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGF0ZW5jeSA9IDApOworCisgICAgLy8vIEFkZHMgZGVwZW5kZW5jaWVzIGFzIG5lZWRlZCBmcm9tIGFsbCBTVXMgaW4gbGlzdCB0byBTVS4KKyAgICB2b2lkIGFkZENoYWluRGVwZW5kZW5jaWVzKFNVbml0ICpTVSwgU1VMaXN0ICZTVXMsIHVuc2lnbmVkIExhdGVuY3kpIHsKKyAgICAgIGZvciAoU1VuaXQgKkVudHJ5IDogU1VzKQorICAgICAgICBhZGRDaGFpbkRlcGVuZGVuY3koU1UsIEVudHJ5LCBMYXRlbmN5KTsKKyAgICB9CisKKyAgICAvLy8gQWRkcyBkZXBlbmRlbmNpZXMgYXMgbmVlZGVkIGZyb20gYWxsIFNVcyBpbiBtYXAsIHRvIFNVLgorICAgIHZvaWQgYWRkQ2hhaW5EZXBlbmRlbmNpZXMoU1VuaXQgKlNVLCBWYWx1ZTJTVXNNYXAgJlZhbDJTVXNNYXApOworCisgICAgLy8vIEFkZHMgZGVwZW5kZW5jaWVzIGFzIG5lZWRlZCB0byBTVSwgZnJvbSBhbGwgU1VzIG1hcHBlZCB0byBWLgorICAgIHZvaWQgYWRkQ2hhaW5EZXBlbmRlbmNpZXMoU1VuaXQgKlNVLCBWYWx1ZTJTVXNNYXAgJlZhbDJTVXNNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVR5cGUgVik7CisKKyAgICAvLy8gQWRkcyBiYXJyaWVyIGNoYWluIGVkZ2VzIGZyb20gYWxsIFNVcyBpbiBtYXAsIGFuZCB0aGVuIGNsZWFyIHRoZSBtYXAuCisgICAgLy8vIFRoaXMgaXMgZXF1aXZhbGVudCB0byBpbnNlcnRCYXJyaWVyQ2hhaW4oKSwgYnV0IG9wdGltaXplZCBmb3IgdGhlIGNvbW1vbgorICAgIC8vLyBjYXNlIHdoZXJlIHRoZSBuZXcgQmFycmllckNoYWluIChhIGdsb2JhbCBtZW1vcnkgb2JqZWN0KSBoYXMgYSBoaWdoZXIKKyAgICAvLy8gTm9kZU51bSB0aGFuIGFsbCBTVXMgaW4gbWFwLiBJdCBpcyBhc3N1bWVkIEJhcnJpZXJDaGFpbiBoYXMgYmVlbiBzZXQKKyAgICAvLy8gYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAgICB2b2lkIGFkZEJhcnJpZXJDaGFpbihWYWx1ZTJTVXNNYXAgJm1hcCk7CisKKyAgICAvLy8gSW5zZXJ0cyBhIGJhcnJpZXIgY2hhaW4gaW4gYSBodWdlIHJlZ2lvbiwgZmFyIGJlbG93IGN1cnJlbnQgU1UuCisgICAgLy8vIEFkZHMgYmFycmllciBjaGFpbiBlZGdlcyBmcm9tIGFsbCBTVXMgaW4gbWFwIHdpdGggaGlnaGVyIE5vZGVOdW1zIHRoYW4KKyAgICAvLy8gdGhpcyBuZXcgQmFycmllckNoYWluLCBhbmQgcmVtb3ZlIHRoZW0gZnJvbSBtYXAuIEl0IGlzIGFzc3VtZWQKKyAgICAvLy8gQmFycmllckNoYWluIGhhcyBiZWVuIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzLgorICAgIHZvaWQgaW5zZXJ0QmFycmllckNoYWluKFZhbHVlMlNVc01hcCAmbWFwKTsKKworICAgIC8vLyBGb3IgYW4gdW5hbmFseXphYmxlIG1lbW9yeSBhY2Nlc3MsIHRoaXMgVmFsdWUgaXMgdXNlZCBpbiBtYXBzLgorICAgIFVuZGVmVmFsdWUgKlVua25vd25WYWx1ZTsKKworICAgIHVzaW5nIERiZ1ZhbHVlVmVjdG9yID0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPE1hY2hpbmVJbnN0ciAqLCBNYWNoaW5lSW5zdHIgKj4+OworICAgIC8vLyBSZW1lbWJlciBpbnN0cnVjdGlvbiB0aGF0IHByZWNlZGVzIERCR19WQUxVRS4KKyAgICAvLy8gVGhlc2UgYXJlIGdlbmVyYXRlZCBieSBidWlsZFNjaGVkR3JhcGggYnV0IHBlcnNpc3Qgc28gdGhleSBjYW4gYmUKKyAgICAvLy8gcmVmZXJlbmNlZCB3aGVuIGVtaXR0aW5nIHRoZSBmaW5hbCBzY2hlZHVsZS4KKyAgICBEYmdWYWx1ZVZlY3RvciBEYmdWYWx1ZXM7CisgICAgTWFjaGluZUluc3RyICpGaXJzdERiZ1ZhbHVlID0gbnVsbHB0cjsKKworICAgIC8vLyBTZXQgb2YgbGl2ZSBwaHlzaWNhbCByZWdpc3RlcnMgZm9yIHVwZGF0aW5nIGtpbGwgZmxhZ3MuCisgICAgTGl2ZVBoeXNSZWdzIExpdmVSZWdzOworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBTY2hlZHVsZURBR0luc3RycyhNYWNoaW5lRnVuY3Rpb24gJm1mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVMb29wSW5mbyAqbWxpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVtb3ZlS2lsbEZsYWdzID0gZmFsc2UpOworCisgICAgflNjaGVkdWxlREFHSW5zdHJzKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8vIEdldHMgdGhlIG1hY2hpbmUgbW9kZWwgZm9yIGluc3RydWN0aW9uIHNjaGVkdWxpbmcuCisgICAgY29uc3QgVGFyZ2V0U2NoZWRNb2RlbCAqZ2V0U2NoZWRNb2RlbCgpIGNvbnN0IHsgcmV0dXJuICZTY2hlZE1vZGVsOyB9CisKKyAgICAvLy8gUmVzb2x2ZXMgYW5kIGNhY2hlIGEgcmVzb2x2ZWQgc2NoZWR1bGluZyBjbGFzcyBmb3IgYW4gU1VuaXQuCisgICAgY29uc3QgTUNTY2hlZENsYXNzRGVzYyAqZ2V0U2NoZWRDbGFzcyhTVW5pdCAqU1UpIGNvbnN0IHsKKyAgICAgIGlmICghU1UtPlNjaGVkQ2xhc3MgJiYgU2NoZWRNb2RlbC5oYXNJbnN0clNjaGVkTW9kZWwoKSkKKyAgICAgICAgU1UtPlNjaGVkQ2xhc3MgPSBTY2hlZE1vZGVsLnJlc29sdmVTY2hlZENsYXNzKFNVLT5nZXRJbnN0cigpKTsKKyAgICAgIHJldHVybiBTVS0+U2NoZWRDbGFzczsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgdG9wIG9mIHRoZSBjdXJyZW50IHNjaGVkdWxpbmcgcmVnaW9uLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFJlZ2lvbkJlZ2luOyB9CisKKyAgICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYm90dG9tIG9mIHRoZSBjdXJyZW50IHNjaGVkdWxpbmcgcmVnaW9uLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBSZWdpb25FbmQ7IH0KKworICAgIC8vLyBDcmVhdGVzIGEgbmV3IFNVbml0IGFuZCByZXR1cm4gYSBwdHIgdG8gaXQuCisgICAgU1VuaXQgKm5ld1NVbml0KE1hY2hpbmVJbnN0ciAqTUkpOworCisgICAgLy8vIFJldHVybnMgYW4gZXhpc3RpbmcgU1VuaXQgZm9yIHRoaXMgTUksIG9yIG51bGxwdHIuCisgICAgU1VuaXQgKmdldFNVbml0KE1hY2hpbmVJbnN0ciAqTUkpIGNvbnN0OworCisgICAgLy8vIElmIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSwgaGFuZGxpbmcgb2YgdGhlIHNjaGVkdWxpbmcgcmVnaW9ucworICAgIC8vLyB0aGVtc2VsdmVzIChpbiBjYXNlIG9mIGEgc2NoZWR1bGluZyBib3VuZGFyeSBpbiBNQkIpIHdpbGwgYmUgZG9uZQorICAgIC8vLyBiZWdpbm5pbmcgd2l0aCB0aGUgdG9wbW9zdCByZWdpb24gb2YgTUJCLgorICAgIHZpcnR1YWwgYm9vbCBkb01CQlNjaGVkUmVnaW9uc1RvcERvd24oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgLy8vIFByZXBhcmVzIHRvIHBlcmZvcm0gc2NoZWR1bGluZyBpbiB0aGUgZ2l2ZW4gYmxvY2suCisgICAgdmlydHVhbCB2b2lkIHN0YXJ0QmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKkJCKTsKKworICAgIC8vLyBDbGVhbnMgdXAgYWZ0ZXIgc2NoZWR1bGluZyBpbiB0aGUgZ2l2ZW4gYmxvY2suCisgICAgdmlydHVhbCB2b2lkIGZpbmlzaEJsb2NrKCk7CisKKyAgICAvLy8gXGJyaWVmIEluaXRpYWxpemUgdGhlIERBRyBhbmQgY29tbW9uIHNjaGVkdWxlciBzdGF0ZSBmb3IgYSBuZXcKKyAgICAvLy8gc2NoZWR1bGluZyByZWdpb24uIFRoaXMgZG9lcyBub3QgYWN0dWFsbHkgY3JlYXRlIHRoZSBEQUcsIG9ubHkgY2xlYXJzCisgICAgLy8vIGl0LiBUaGUgc2NoZWR1bGluZyBkcml2ZXIgbWF5IGNhbGwgQnVpbGRTY2hlZEdyYXBoIG11bHRpcGxlIHRpbWVzIHBlcgorICAgIC8vLyBzY2hlZHVsaW5nIHJlZ2lvbi4KKyAgICB2aXJ0dWFsIHZvaWQgZW50ZXJSZWdpb24oTWFjaGluZUJhc2ljQmxvY2sgKmJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlZ2lvbmluc3Rycyk7CisKKyAgICAvLy8gQ2FsbGVkIHdoZW4gdGhlIHNjaGVkdWxlciBoYXMgZmluaXNoZWQgc2NoZWR1bGluZyB0aGUgY3VycmVudCByZWdpb24uCisgICAgdmlydHVhbCB2b2lkIGV4aXRSZWdpb24oKTsKKworICAgIC8vLyBCdWlsZHMgU1VuaXRzIGZvciB0aGUgY3VycmVudCByZWdpb24uCisgICAgLy8vIElmIFxwIFJQVHJhY2tlciBpcyBub24tbnVsbCwgY29tcHV0ZSByZWdpc3RlciBwcmVzc3VyZSBhcyBhIHNpZGUgZWZmZWN0LgorICAgIC8vLyBUaGUgREFHIGJ1aWxkZXIgaXMgYW4gZWZmaWNpZW50IHBsYWNlIHRvIGRvIGl0IGJlY2F1c2UgaXQgYWxyZWFkeSB2aXNpdHMKKyAgICAvLy8gb3BlcmFuZHMuCisgICAgdm9pZCBidWlsZFNjaGVkR3JhcGgoQWxpYXNBbmFseXNpcyAqQUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVnUHJlc3N1cmVUcmFja2VyICpSUFRyYWNrZXIgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFByZXNzdXJlRGlmZnMgKlBEaWZmcyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZUludGVydmFscyAqTElTID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFRyYWNrTGFuZU1hc2tzID0gZmFsc2UpOworCisgICAgLy8vIFxicmllZiBBZGRzIGRlcGVuZGVuY2llcyBmcm9tIGluc3RydWN0aW9ucyBpbiB0aGUgY3VycmVudCBsaXN0IG9mCisgICAgLy8vIGluc3RydWN0aW9ucyBiZWluZyBzY2hlZHVsZWQgdG8gc2NoZWR1bGluZyBiYXJyaWVyLiBXZSB3YW50IHRvIG1ha2Ugc3VyZQorICAgIC8vLyBpbnN0cnVjdGlvbnMgd2hpY2ggZGVmaW5lIHJlZ2lzdGVycyB0aGF0IGFyZSBlaXRoZXIgdXNlZCBieSB0aGUKKyAgICAvLy8gdGVybWluYXRvciBvciBhcmUgbGl2ZS1vdXQgYXJlIHByb3Blcmx5IHNjaGVkdWxlZC4gVGhpcyBpcyBlc3BlY2lhbGx5CisgICAgLy8vIGltcG9ydGFudCB3aGVuIHRoZSBkZWZpbml0aW9uIGxhdGVuY3kgb2YgdGhlIHJldHVybiB2YWx1ZShzKSBhcmUgdG9vCisgICAgLy8vIGhpZ2ggdG8gYmUgaGlkZGVuIGJ5IHRoZSBicmFuY2ggb3Igd2hlbiB0aGUgbGl2ZW91dCByZWdpc3RlcnMgdXNlZCBieQorICAgIC8vLyBpbnN0cnVjdGlvbnMgaW4gdGhlIGZhbGx0aHJvdWdoIGJsb2NrLgorICAgIHZvaWQgYWRkU2NoZWRCYXJyaWVyRGVwcygpOworCisgICAgLy8vIE9yZGVycyBub2RlcyBhY2NvcmRpbmcgdG8gc2VsZWN0ZWQgc3R5bGUuCisgICAgLy8vCisgICAgLy8vIFR5cGljYWxseSwgYSBzY2hlZHVsaW5nIGFsZ29yaXRobSB3aWxsIGltcGxlbWVudCBzY2hlZHVsZSgpIHdpdGhvdXQKKyAgICAvLy8gb3ZlcnJpZGluZyBlbnRlclJlZ2lvbigpIG9yIGV4aXRSZWdpb24oKS4KKyAgICB2aXJ0dWFsIHZvaWQgc2NoZWR1bGUoKSA9IDA7CisKKyAgICAvLy8gQWxsb3cgdGFyZ2V0cyB0byBwZXJmb3JtIGZpbmFsIHNjaGVkdWxpbmcgYWN0aW9ucyBhdCB0aGUgbGV2ZWwgb2YgdGhlCisgICAgLy8vIHdob2xlIE1hY2hpbmVGdW5jdGlvbi4gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmcuCisgICAgdmlydHVhbCB2b2lkIGZpbmFsaXplU2NoZWR1bGUoKSB7fQorCisgICAgdm9pZCBkdW1wTm9kZShjb25zdCBTVW5pdCAqU1UpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8vIFJldHVybnMgYSBsYWJlbCBmb3IgYSBEQUcgbm9kZSB0aGF0IHBvaW50cyB0byBhbiBpbnN0cnVjdGlvbi4KKyAgICBzdGQ6OnN0cmluZyBnZXRHcmFwaE5vZGVMYWJlbChjb25zdCBTVW5pdCAqU1UpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8vIFJldHVybnMgYSBsYWJlbCBmb3IgdGhlIHJlZ2lvbiBvZiBjb2RlIGNvdmVyZWQgYnkgdGhlIERBRy4KKyAgICBzdGQ6OnN0cmluZyBnZXREQUdOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLy8gRml4ZXMgcmVnaXN0ZXIga2lsbCBmbGFncyB0aGF0IHNjaGVkdWxpbmcgaGFzIG1hZGUgaW52YWxpZC4KKyAgICB2b2lkIGZpeHVwS2lsbHMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgaW5pdFNVbml0cygpOworICAgIHZvaWQgYWRkUGh5c1JlZ0RhdGFEZXBzKFNVbml0ICpTVSwgdW5zaWduZWQgT3BlcklkeCk7CisgICAgdm9pZCBhZGRQaHlzUmVnRGVwcyhTVW5pdCAqU1UsIHVuc2lnbmVkIE9wZXJJZHgpOworICAgIHZvaWQgYWRkVlJlZ0RlZkRlcHMoU1VuaXQgKlNVLCB1bnNpZ25lZCBPcGVySWR4KTsKKyAgICB2b2lkIGFkZFZSZWdVc2VEZXBzKFNVbml0ICpTVSwgdW5zaWduZWQgT3BlcklkeCk7CisKKyAgICAvLy8gSW5pdGlhbGl6ZXMgcmVnaXN0ZXIgbGl2ZS1yYW5nZSBzdGF0ZSBmb3IgdXBkYXRpbmcga2lsbHMuCisgICAgLy8vIFBvc3RSQSBoZWxwZXIgZm9yIHJld3JpdGluZyBraWxsIGZsYWdzLgorICAgIHZvaWQgc3RhcnRCbG9ja0ZvcktpbGxzKE1hY2hpbmVCYXNpY0Jsb2NrICpCQik7CisKKyAgICAvLy8gVG9nZ2xlcyBhIHJlZ2lzdGVyIG9wZXJhbmQga2lsbCBmbGFnLgorICAgIC8vLworICAgIC8vLyBPdGhlciBhZGp1c3RtZW50cyBtYXkgYmUgbWFkZSB0byB0aGUgaW5zdHJ1Y3Rpb24gaWYgbmVjZXNzYXJ5LiBSZXR1cm4KKyAgICAvLy8gdHJ1ZSBpZiB0aGUgb3BlcmFuZCBoYXMgYmVlbiBkZWxldGVkLCBmYWxzZSBpZiBub3QuCisgICAgdm9pZCB0b2dnbGVLaWxsRmxhZyhNYWNoaW5lSW5zdHIgJk1JLCBNYWNoaW5lT3BlcmFuZCAmTU8pOworCisgICAgLy8vIFJldHVybnMgYSBtYXNrIGZvciB3aGljaCBsYW5lcyBnZXQgcmVhZC93cml0dGVuIGJ5IHRoZSBnaXZlbiAocmVnaXN0ZXIpCisgICAgLy8vIG1hY2hpbmUgb3BlcmFuZC4KKyAgICBMYW5lQml0bWFzayBnZXRMYW5lTWFza0Zvck1PKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTykgY29uc3Q7CisgIH07CisKKyAgLy8vIENyZWF0ZXMgYSBuZXcgU1VuaXQgYW5kIHJldHVybiBhIHB0ciB0byBpdC4KKyAgaW5saW5lIFNVbml0ICpTY2hlZHVsZURBR0luc3Ryczo6bmV3U1VuaXQoTWFjaGluZUluc3RyICpNSSkgeworI2lmbmRlZiBOREVCVUcKKyAgICBjb25zdCBTVW5pdCAqQWRkciA9IFNVbml0cy5lbXB0eSgpID8gbnVsbHB0ciA6ICZTVW5pdHNbMF07CisjZW5kaWYKKyAgICBTVW5pdHMuZW1wbGFjZV9iYWNrKE1JLCAodW5zaWduZWQpU1VuaXRzLnNpemUoKSk7CisgICAgYXNzZXJ0KChBZGRyID09IG51bGxwdHIgfHwgQWRkciA9PSAmU1VuaXRzWzBdKSAmJgorICAgICAgICAgICAiU1VuaXRzIHN0ZDo6dmVjdG9yIHJlYWxsb2NhdGVkIG9uIHRoZSBmbHkhIik7CisgICAgcmV0dXJuICZTVW5pdHMuYmFjaygpOworICB9CisKKyAgLy8vIFJldHVybnMgYW4gZXhpc3RpbmcgU1VuaXQgZm9yIHRoaXMgTUksIG9yIG51bGxwdHIuCisgIGlubGluZSBTVW5pdCAqU2NoZWR1bGVEQUdJbnN0cnM6OmdldFNVbml0KE1hY2hpbmVJbnN0ciAqTUkpIGNvbnN0IHsKKyAgICBEZW5zZU1hcDxNYWNoaW5lSW5zdHIqLCBTVW5pdCo+Ojpjb25zdF9pdGVyYXRvciBJID0gTUlTVW5pdE1hcC5maW5kKE1JKTsKKyAgICBpZiAoSSA9PSBNSVNVbml0TWFwLmVuZCgpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIEktPnNlY29uZDsKKyAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1NDSEVEVUxFREFHSU5TVFJTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TY2hlZHVsZURBR011dGF0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUdNdXRhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMjM2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUdNdXRhdGlvbi5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vPT09LSBTY2hlZHVsZURBR011dGF0aW9uLmggLSBNYWNoaW5lSW5zdHIgU2NoZWR1bGluZyAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFNjaGVkdWxlREFHTXV0YXRpb24gY2xhc3MsIHdoaWNoIHJlcHJlc2VudHMKKy8vIGEgdGFyZ2V0LXNwZWNpZmljIG11dGF0aW9uIG9mIHRoZSBkZXBlbmRlbmN5IGdyYXBoIGZvciBzY2hlZHVsaW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1NDSEVEVUxFREFHTVVUQVRJT05fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fU0NIRURVTEVEQUdNVVRBVElPTl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgU2NoZWR1bGVEQUdJbnN0cnM7CisKKy8vLyBNdXRhdGUgdGhlIERBRyBhcyBhIHBvc3RwYXNzIGFmdGVyIG5vcm1hbCBEQUcgYnVpbGRpbmcuCitjbGFzcyBTY2hlZHVsZURBR011dGF0aW9uIHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIHZpcnR1YWwgflNjaGVkdWxlREFHTXV0YXRpb24oKSA9IGRlZmF1bHQ7CisKKyAgdmlydHVhbCB2b2lkIGFwcGx5KFNjaGVkdWxlREFHSW5zdHJzICpEQUcpID0gMDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fU0NIRURVTEVEQUdNVVRBVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NoZWR1bGVERlMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TY2hlZHVsZURGUy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YThjNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NoZWR1bGVERlMuaApAQCAtMCwwICsxLDE5NCBAQAorLy89PT0tIFNjaGVkdWxlREFHSUxQLmggLSBJTFAgbWV0cmljIGZvciBTY2hlZHVsZURBR0luc3RycyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZWZpbml0aW9uIG9mIGFuIElMUCBtZXRyaWMgZm9yIG1hY2hpbmUgbGV2ZWwgaW5zdHJ1Y3Rpb24gc2NoZWR1bGluZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TQ0hFRFVMRURGU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9TQ0hFRFVMRURGU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIFxicmllZiBSZXByZXNlbnQgdGhlIElMUCBvZiB0aGUgc3ViREFHIHJvb3RlZCBhdCBhIERBRyBub2RlLgorLy8vCisvLy8gSUxQVmFsdWVzIHN1bW1hcml6ZSB0aGUgREFHIHN1YnRyZWUgcm9vdGVkIGF0IGVhY2ggbm9kZS4gSUxQVmFsdWVzIGFyZQorLy8vIHZhbGlkIGZvciBhbGwgbm9kZXMgcmVnYXJkbGVzcyBvZiB0aGVpciBzdWJ0cmVlIG1lbWJlcnNoaXAuCisvLy8KKy8vLyBXaGVuIGNvbXB1dGVkIHVzaW5nIGJvdHRvbS11cCBERlMsIHRoaXMgbWV0cmljIGFzc3VtZXMgdGhhdCB0aGUgREFHIGlzIGEKKy8vLyBmb3Jlc3Qgb2YgdHJlZXMgd2l0aCByb290cyBhdCB0aGUgYm90dG9tIG9mIHRoZSBzY2hlZHVsZSBicmFuY2hpbmcgdXB3YXJkLgorc3RydWN0IElMUFZhbHVlIHsKKyAgdW5zaWduZWQgSW5zdHJDb3VudDsKKyAgLy8vIExlbmd0aCBtYXkgZWl0aGVyIGNvcnJlc3BvbmQgdG8gZGVwdGggb3IgaGVpZ2h0LCBkZXBlbmRpbmcgb24gZGlyZWN0aW9uLAorICAvLy8gYW5kIGN5Y2xlcyBvciBub2RlcyBkZXBlbmRpbmcgb24gY29udGV4dC4KKyAgdW5zaWduZWQgTGVuZ3RoOworCisgIElMUFZhbHVlKHVuc2lnbmVkIGNvdW50LCB1bnNpZ25lZCBsZW5ndGgpOgorICAgIEluc3RyQ291bnQoY291bnQpLCBMZW5ndGgobGVuZ3RoKSB7fQorCisgIC8vIE9yZGVyIGJ5IHRoZSBJTFAgbWV0cmljJ3MgdmFsdWUuCisgIGJvb2wgb3BlcmF0b3I8KElMUFZhbHVlIFJIUykgY29uc3QgeworICAgIHJldHVybiAodWludDY0X3QpSW5zdHJDb3VudCAqIFJIUy5MZW5ndGgKKyAgICAgIDwgKHVpbnQ2NF90KUxlbmd0aCAqIFJIUy5JbnN0ckNvdW50OworICB9CisgIGJvb2wgb3BlcmF0b3I+KElMUFZhbHVlIFJIUykgY29uc3QgeworICAgIHJldHVybiBSSFMgPCAqdGhpczsKKyAgfQorICBib29sIG9wZXJhdG9yPD0oSUxQVmFsdWUgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuICh1aW50NjRfdClJbnN0ckNvdW50ICogUkhTLkxlbmd0aAorICAgICAgPD0gKHVpbnQ2NF90KUxlbmd0aCAqIFJIUy5JbnN0ckNvdW50OworICB9CisgIGJvb2wgb3BlcmF0b3I+PShJTFBWYWx1ZSBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gUkhTIDw9ICp0aGlzOworICB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworLy8vIFxicmllZiBDb21wdXRlIHRoZSB2YWx1ZXMgb2YgZWFjaCBEQUcgbm9kZSBmb3IgdmFyaW91cyBtZXRyaWNzIGR1cmluZyBERlMuCitjbGFzcyBTY2hlZERGU1Jlc3VsdCB7CisgIGZyaWVuZCBjbGFzcyBTY2hlZERGU0ltcGw7CisKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEludmFsaWRTdWJ0cmVlSUQgPSB+MHU7CisKKyAgLy8vIFxicmllZiBQZXItU1VuaXQgZGF0YSBjb21wdXRlZCBkdXJpbmcgREZTIGZvciB2YXJpb3VzIG1ldHJpY3MuCisgIC8vLworICAvLy8gQSBub2RlJ3MgU3VidHJlZUlEIGlzIHNldCB0byBpdHNlbGYgd2hlbiBpdCBpcyB2aXNpdGVkIHRvIGluZGljYXRlIHRoYXQgaXQKKyAgLy8vIGlzIHRoZSByb290IG9mIGEgc3VidHJlZS4gTGF0ZXIgaXQgaXMgc2V0IHRvIGl0cyBwYXJlbnQgdG8gaW5kaWNhdGUgYW4KKyAgLy8vIGludGVyaW9yIG5vZGUuIEZpbmFsbHksIGl0IGlzIHNldCB0byBhIHJlcHJlc2VudGF0aXZlIHN1YnRyZWUgSUQgZHVyaW5nCisgIC8vLyBmaW5hbGl6YXRpb24uCisgIHN0cnVjdCBOb2RlRGF0YSB7CisgICAgdW5zaWduZWQgSW5zdHJDb3VudCA9IDA7CisgICAgdW5zaWduZWQgU3VidHJlZUlEID0gSW52YWxpZFN1YnRyZWVJRDsKKworICAgIE5vZGVEYXRhKCkgPSBkZWZhdWx0OworICB9OworCisgIC8vLyBcYnJpZWYgUGVyLVN1YnRyZWUgZGF0YSBjb21wdXRlZCBkdXJpbmcgREZTLgorICBzdHJ1Y3QgVHJlZURhdGEgeworICAgIHVuc2lnbmVkIFBhcmVudFRyZWVJRCA9IEludmFsaWRTdWJ0cmVlSUQ7CisgICAgdW5zaWduZWQgU3ViSW5zdHJDb3VudCA9IDA7CisKKyAgICBUcmVlRGF0YSgpID0gZGVmYXVsdDsKKyAgfTsKKworICAvLy8gXGJyaWVmIFJlY29yZCBhIGNvbm5lY3Rpb24gYmV0d2VlbiBzdWJ0cmVlcyBhbmQgdGhlIGNvbm5lY3Rpb24gbGV2ZWwuCisgIHN0cnVjdCBDb25uZWN0aW9uIHsKKyAgICB1bnNpZ25lZCBUcmVlSUQ7CisgICAgdW5zaWduZWQgTGV2ZWw7CisKKyAgICBDb25uZWN0aW9uKHVuc2lnbmVkIHRyZWUsIHVuc2lnbmVkIGxldmVsKTogVHJlZUlEKHRyZWUpLCBMZXZlbChsZXZlbCkge30KKyAgfTsKKworICBib29sIElzQm90dG9tVXA7CisgIHVuc2lnbmVkIFN1YnRyZWVMaW1pdDsKKyAgLy8vIERGUyByZXN1bHRzIGZvciBlYWNoIFNVbml0IGluIHRoaXMgREFHLgorICBzdGQ6OnZlY3RvcjxOb2RlRGF0YT4gREZTTm9kZURhdGE7CisKKyAgLy8gU3RvcmUgcGVyLXRyZWUgZGF0YSBpbmRleGVkIG9uIHRyZWUgSUQsCisgIFNtYWxsVmVjdG9yPFRyZWVEYXRhLCAxNj4gREZTVHJlZURhdGE7CisKKyAgLy8gRm9yIGVhY2ggc3VidHJlZSBkaXNjb3ZlcmVkIGR1cmluZyBERlMsIHJlY29yZCBpdHMgY29ubmVjdGlvbnMgdG8gb3RoZXIKKyAgLy8gc3VidHJlZXMuCisgIHN0ZDo6dmVjdG9yPFNtYWxsVmVjdG9yPENvbm5lY3Rpb24sIDQ+PiBTdWJ0cmVlQ29ubmVjdGlvbnM7CisKKyAgLy8vIENhY2hlIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gbGV2ZWwgb2YgZWFjaCBzdWJ0cmVlLgorICAvLy8gVGhpcyBtdXRhYmxlIGFycmF5IGlzIHVwZGF0ZWQgZHVyaW5nIHNjaGVkdWxpbmcuCisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBTdWJ0cmVlQ29ubmVjdExldmVsczsKKworcHVibGljOgorICBTY2hlZERGU1Jlc3VsdChib29sIElzQlUsIHVuc2lnbmVkIGxpbSkKKyAgICA6IElzQm90dG9tVXAoSXNCVSksIFN1YnRyZWVMaW1pdChsaW0pIHt9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG5vZGUgY3V0b2ZmIGJlZm9yZSBzdWJ0cmVlcyBhcmUgY29uc2lkZXJlZCBzaWduaWZpY2FudC4KKyAgdW5zaWduZWQgZ2V0U3VidHJlZUxpbWl0KCkgY29uc3QgeyByZXR1cm4gU3VidHJlZUxpbWl0OyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIERGU1Jlc3VsdCBpcyB1bmluaXRpYWxpemVkLgorICAvLy8KKyAgLy8vIHJlc2l6ZSgpIGluaXRpYWxpemVzIERGU1Jlc3VsdCwgd2hpbGUgY29tcHV0ZSgpIHBvcHVsYXRlcyBpdC4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIERGU05vZGVEYXRhLmVtcHR5KCk7IH0KKworICAvLy8gXGJyaWVmIENsZWFyIHRoZSByZXN1bHRzLgorICB2b2lkIGNsZWFyKCkgeworICAgIERGU05vZGVEYXRhLmNsZWFyKCk7CisgICAgREZTVHJlZURhdGEuY2xlYXIoKTsKKyAgICBTdWJ0cmVlQ29ubmVjdGlvbnMuY2xlYXIoKTsKKyAgICBTdWJ0cmVlQ29ubmVjdExldmVscy5jbGVhcigpOworICB9CisKKyAgLy8vIFxicmllZiBJbml0aWFsaXplIHRoZSByZXN1bHQgZGF0YSB3aXRoIHRoZSBzaXplIG9mIHRoZSBEQUcuCisgIHZvaWQgcmVzaXplKHVuc2lnbmVkIE51bVNVbml0cykgeworICAgIERGU05vZGVEYXRhLnJlc2l6ZShOdW1TVW5pdHMpOworICB9CisKKyAgLy8vIFxicmllZiBDb21wdXRlIHZhcmlvdXMgbWV0cmljcyBmb3IgdGhlIERBRyB3aXRoIGdpdmVuIHJvb3RzLgorICB2b2lkIGNvbXB1dGUoQXJyYXlSZWY8U1VuaXQ+IFNVbml0cyk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgaW4gdGhlIGdpdmVuIHN1YnRyZWUgYW5kIGl0cworICAvLy8gY2hpbGRyZW4uCisgIHVuc2lnbmVkIGdldE51bUluc3Rycyhjb25zdCBTVW5pdCAqU1UpIGNvbnN0IHsKKyAgICByZXR1cm4gREZTTm9kZURhdGFbU1UtPk5vZGVOdW1dLkluc3RyQ291bnQ7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiB0aGUgZ2l2ZW4gc3VidHJlZSBub3QgaW5jbHVkaW5nCisgIC8vLyBjaGlsZHJlbi4KKyAgdW5zaWduZWQgZ2V0TnVtU3ViSW5zdHJzKHVuc2lnbmVkIFN1YnRyZWVJRCkgY29uc3QgeworICAgIHJldHVybiBERlNUcmVlRGF0YVtTdWJ0cmVlSURdLlN1Ykluc3RyQ291bnQ7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgSUxQIHZhbHVlIGZvciBhIERBRyBub2RlLgorICAvLy8KKyAgLy8vIEEgbGVhZiBub2RlIGhhcyBhbiBJTFAgb2YgMS8xLgorICBJTFBWYWx1ZSBnZXRJTFAoY29uc3QgU1VuaXQgKlNVKSBjb25zdCB7CisgICAgcmV0dXJuIElMUFZhbHVlKERGU05vZGVEYXRhW1NVLT5Ob2RlTnVtXS5JbnN0ckNvdW50LCAxICsgU1UtPmdldERlcHRoKCkpOworICB9CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIHN1YnRyZWVzIGRldGVjdGVkIGluIHRoaXMgREFHLgorICB1bnNpZ25lZCBnZXROdW1TdWJ0cmVlcygpIGNvbnN0IHsgcmV0dXJuIFN1YnRyZWVDb25uZWN0TGV2ZWxzLnNpemUoKTsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBJRCBvZiB0aGUgc3VidHJlZSB0aGUgZ2l2ZW4gREFHIG5vZGUgYmVsb25ncyB0by4KKyAgLy8vCisgIC8vLyBGb3IgY29udmVuaWVuY2UsIGlmIERGU1Jlc3VsdHMgaGF2ZSBub3QgYmVlbiBjb21wdXRlZCB5ZXQsIGdpdmUgZXZlcnl0aGluZworICAvLy8gdHJlZSBJRCAwLgorICB1bnNpZ25lZCBnZXRTdWJ0cmVlSUQoY29uc3QgU1VuaXQgKlNVKSBjb25zdCB7CisgICAgaWYgKGVtcHR5KCkpCisgICAgICByZXR1cm4gMDsKKyAgICBhc3NlcnQoU1UtPk5vZGVOdW0gPCBERlNOb2RlRGF0YS5zaXplKCkgJiYgICJOZXcgTm9kZSIpOworICAgIHJldHVybiBERlNOb2RlRGF0YVtTVS0+Tm9kZU51bV0uU3VidHJlZUlEOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGNvbm5lY3Rpb24gbGV2ZWwgb2YgYSBzdWJ0cmVlLgorICAvLy8KKyAgLy8vIEZvciBib3R0b20tdXAgdHJlZXMsIHRoZSBjb25uZWN0aW9uIGxldmVsIGlzIHRoZSBsYXRlbmN5IGRlcHRoIChpbiBjeWNsZXMpCisgIC8vLyBvZiB0aGUgZGVlcGVzdCBjb25uZWN0aW9uIHRvIGFub3RoZXIgc3VidHJlZS4KKyAgdW5zaWduZWQgZ2V0U3VidHJlZUxldmVsKHVuc2lnbmVkIFN1YnRyZWVJRCkgY29uc3QgeworICAgIHJldHVybiBTdWJ0cmVlQ29ubmVjdExldmVsc1tTdWJ0cmVlSURdOworICB9CisKKyAgLy8vIFxicmllZiBTY2hlZHVsZXIgY2FsbGJhY2sgdG8gdXBkYXRlIFN1YnRyZWVDb25uZWN0TGV2ZWxzIHdoZW4gYSB0cmVlIGlzCisgIC8vLyBpbml0aWFsbHkgc2NoZWR1bGVkLgorICB2b2lkIHNjaGVkdWxlVHJlZSh1bnNpZ25lZCBTdWJ0cmVlSUQpOworfTsKKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBJTFBWYWx1ZSAmVmFsKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9TQ0hFRFVMRURGU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNlNGEyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TY2hlZHVsZUhhemFyZFJlY29nbml6ZXIuaApAQCAtMCwwICsxLDEyMiBAQAorLy89LSBsbHZtL0NvZGVHZW4vU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyLmggLSBTY2hlZHVsaW5nIFN1cHBvcnQgLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyIGNsYXNzLCB3aGljaCBpbXBsZW1lbnRzCisvLyBoYXphcmQtYXZvaWRhbmNlIGhldXJpc3RpY3MgZm9yIHNjaGVkdWxpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fU0NIRURVTEVIQVpBUkRSRUNPR05JWkVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NDSEVEVUxFSEFaQVJEUkVDT0dOSVpFUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgU1VuaXQ7CisKKy8vLyBIYXphcmRSZWNvZ25pemVyIC0gVGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGluc3RydWN0aW9uIGNhbiBiZQorLy8vIGlzc3VlZCB0aGlzIGN5Y2xlLCBhbmQgd2hldGhlciBvciBub3QgYSBub29wIG5lZWRzIHRvIGJlIGluc2VydGVkIHRvIGhhbmRsZQorLy8vIHRoZSBoYXphcmQuCitjbGFzcyBTY2hlZHVsZUhhemFyZFJlY29nbml6ZXIgeworcHJvdGVjdGVkOgorICAvLy8gTWF4TG9va0FoZWFkIC0gSW5kaWNhdGUgdGhlIG51bWJlciBvZiBjeWNsZXMgaW4gdGhlIHNjb3JlYm9hcmQKKyAgLy8vIHN0YXRlLiBJbXBvcnRhbnQgdG8gcmVzdG9yZSB0aGUgc3RhdGUgYWZ0ZXIgYmFja3RyYWNraW5nLiBBZGRpdGlvbmFsbHksCisgIC8vLyBNYXhMb29rQWhlYWQ9MCBpZGVudGlmaWVzIGEgZmFrZSByZWNvZ25pemVyLCBhbGxvd2luZyB0aGUgY2xpZW50IHRvCisgIC8vLyBieXBhc3MgdmlydHVhbCBjYWxscy4gQ3VycmVudGx5IHRoZSBQb3N0UkEgc2NoZWR1bGVyIGlnbm9yZXMgaXQuCisgIHVuc2lnbmVkIE1heExvb2tBaGVhZCA9IDA7CisKK3B1YmxpYzoKKyAgU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyKCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIH5TY2hlZHVsZUhhemFyZFJlY29nbml6ZXIoKTsKKworICBlbnVtIEhhemFyZFR5cGUgeworICAgIE5vSGF6YXJkLCAgICAgIC8vIFRoaXMgaW5zdHJ1Y3Rpb24gY2FuIGJlIGVtaXR0ZWQgYXQgdGhpcyBjeWNsZS4KKyAgICBIYXphcmQsICAgICAgICAvLyBUaGlzIGluc3RydWN0aW9uIGNhbid0IGJlIGVtaXR0ZWQgYXQgdGhpcyBjeWNsZS4KKyAgICBOb29wSGF6YXJkICAgICAvLyBUaGlzIGluc3RydWN0aW9uIGNhbid0IGJlIGVtaXR0ZWQsIGFuZCBuZWVkcyBub29wcy4KKyAgfTsKKworICB1bnNpZ25lZCBnZXRNYXhMb29rQWhlYWQoKSBjb25zdCB7IHJldHVybiBNYXhMb29rQWhlYWQ7IH0KKworICBib29sIGlzRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIE1heExvb2tBaGVhZCAhPSAwOyB9CisKKyAgLy8vIGF0SXNzdWVMaW1pdCAtIFJldHVybiB0cnVlIGlmIG5vIG1vcmUgaW5zdHJ1Y3Rpb25zIG1heSBiZSBpc3N1ZWQgaW4gdGhpcworICAvLy8gY3ljbGUuCisgIC8vLworICAvLy8gRklYTUU6IHJlbW92ZSB0aGlzIG9uY2UgTWFjaGluZVNjaGVkdWxlciBpcyB0aGUgb25seSBjbGllbnQuCisgIHZpcnR1YWwgYm9vbCBhdElzc3VlTGltaXQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBnZXRIYXphcmRUeXBlIC0gUmV0dXJuIHRoZSBoYXphcmQgdHlwZSBvZiBlbWl0dGluZyB0aGlzIG5vZGUuICBUaGVyZSBhcmUKKyAgLy8vIHRocmVlIHBvc3NpYmxlIHJlc3VsdHMuICBFaXRoZXI6CisgIC8vLyAgKiBOb0hhemFyZDogaXQgaXMgbGVnYWwgdG8gaXNzdWUgdGhpcyBpbnN0cnVjdGlvbiBvbiB0aGlzIGN5Y2xlLgorICAvLy8gICogSGF6YXJkOiBpc3N1aW5nIHRoaXMgaW5zdHJ1Y3Rpb24gd291bGQgc3RhbGwgdGhlIG1hY2hpbmUuICBJZiBzb21lCisgIC8vLyAgICAgb3RoZXIgaW5zdHJ1Y3Rpb24gaXMgYXZhaWxhYmxlLCBpc3N1ZSBpdCBmaXJzdC4KKyAgLy8vICAqIE5vb3BIYXphcmQ6IGlzc3VpbmcgdGhpcyBpbnN0cnVjdGlvbiB3b3VsZCBicmVhayB0aGUgcHJvZ3JhbS4gIElmCisgIC8vLyAgICAgc29tZSBvdGhlciBpbnN0cnVjdGlvbiBjYW4gYmUgaXNzdWVkLCBkbyBzbywgb3RoZXJ3aXNlIGlzc3VlIGEgbm9vcC4KKyAgdmlydHVhbCBIYXphcmRUeXBlIGdldEhhemFyZFR5cGUoU1VuaXQgKm0sIGludCBTdGFsbHMgPSAwKSB7CisgICAgcmV0dXJuIE5vSGF6YXJkOworICB9CisKKyAgLy8vIFJlc2V0IC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSBuZXcgYmxvY2sgb2YKKyAgLy8vIGluc3RydWN0aW9ucyBpcyBhYm91dCB0byBiZSBzY2hlZHVsZS4gVGhlIGhhemFyZCBzdGF0ZSBzaG91bGQgYmUKKyAgLy8vIHNldCB0byBhbiBpbml0aWFsaXplZCBzdGF0ZS4KKyAgdmlydHVhbCB2b2lkIFJlc2V0KCkge30KKworICAvLy8gRW1pdEluc3RydWN0aW9uIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYW4gaW5zdHJ1Y3Rpb24gaXMKKyAgLy8vIGVtaXR0ZWQsIHRvIGFkdmFuY2UgdGhlIGhhemFyZCBzdGF0ZS4KKyAgdmlydHVhbCB2b2lkIEVtaXRJbnN0cnVjdGlvbihTVW5pdCAqKSB7fQorCisgIC8vLyBUaGlzIG92ZXJsb2FkIHdpbGwgYmUgdXNlZCB3aGVuIHRoZSBoYXphcmQgcmVjb2duaXplciBpcyBiZWluZyB1c2VkCisgIC8vLyBieSBhIG5vbi1zY2hlZHVsaW5nIHBhc3MsIHdoaWNoIGRvZXMgbm90IHVzZSBTVW5pdHMuCisgIHZpcnR1YWwgdm9pZCBFbWl0SW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICopIHt9CisKKyAgLy8vIFByZUVtaXROb29wcyAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBwcmlvciB0byBlbWl0dGluZyBhbiBpbnN0cnVjdGlvbi4KKyAgLy8vIEl0IHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBub29wcyB0byBlbWl0IHByaW9yIHRvIHRoZSBwcm92aWRlZAorICAvLy8gaW5zdHJ1Y3Rpb24uCisgIC8vLyBOb3RlOiBUaGlzIGlzIG9ubHkgdXNlZCBkdXJpbmcgUG9zdFJBIHNjaGVkdWxpbmcuIEVtaXROb29wIGlzIG5vdCBjYWxsZWQKKyAgLy8vIGZvciB0aGVzZSBub29wcy4KKyAgdmlydHVhbCB1bnNpZ25lZCBQcmVFbWl0Tm9vcHMoU1VuaXQgKikgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIFRoaXMgb3ZlcmxvYWQgd2lsbCBiZSB1c2VkIHdoZW4gdGhlIGhhemFyZCByZWNvZ25pemVyIGlzIGJlaW5nIHVzZWQKKyAgLy8vIGJ5IGEgbm9uLXNjaGVkdWxpbmcgcGFzcywgd2hpY2ggZG9lcyBub3QgdXNlIFNVbml0cy4KKyAgdmlydHVhbCB1bnNpZ25lZCBQcmVFbWl0Tm9vcHMoTWFjaGluZUluc3RyICopIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBTaG91bGRQcmVmZXJBbm90aGVyIC0gVGhpcyBjYWxsYmFjayBtYXkgYmUgaW52b2tlZCBpZiBnZXRIYXphcmRUeXBlCisgIC8vLyByZXR1cm5zIE5vSGF6YXJkLiBJZiwgZXZlbiB0aG91Z2ggdGhlcmUgaXMgbm8gaGF6YXJkLCBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8KKyAgLy8vIHNjaGVkdWxlIGFub3RoZXIgYXZhaWxhYmxlIGluc3RydWN0aW9uLCB0aGlzIGNhbGxiYWNrIHNob3VsZCByZXR1cm4gdHJ1ZS4KKyAgdmlydHVhbCBib29sIFNob3VsZFByZWZlckFub3RoZXIoU1VuaXQgKikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBBZHZhbmNlQ3ljbGUgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbmV2ZXIgdGhlIG5leHQgdG9wLWRvd24KKyAgLy8vIGluc3RydWN0aW9uIHRvIGJlIHNjaGVkdWxlZCBjYW5ub3QgaXNzdWUgaW4gdGhlIGN1cnJlbnQgY3ljbGUsIGVpdGhlcgorICAvLy8gYmVjYXVzZSBvZiBsYXRlbmN5IG9yIHJlc291cmNlIGNvbmZsaWN0cy4gIFRoaXMgc2hvdWxkIGluY3JlbWVudCB0aGUKKyAgLy8vIGludGVybmFsIHN0YXRlIG9mIHRoZSBoYXphcmQgcmVjb2duaXplciBzbyB0aGF0IHByZXZpb3VzbHkgIkhhemFyZCIKKyAgLy8vIGluc3RydWN0aW9ucyB3aWxsIG5vdyBub3QgYmUgaGF6YXJkcy4KKyAgdmlydHVhbCB2b2lkIEFkdmFuY2VDeWNsZSgpIHt9CisKKyAgLy8vIFJlY2VkZUN5Y2xlIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW5ldmVyIHRoZSBuZXh0IGJvdHRvbS11cAorICAvLy8gaW5zdHJ1Y3Rpb24gdG8gYmUgc2NoZWR1bGVkIGNhbm5vdCBpc3N1ZSBpbiB0aGUgY3VycmVudCBjeWNsZSwgZWl0aGVyCisgIC8vLyBiZWNhdXNlIG9mIGxhdGVuY3kgb3IgcmVzb3VyY2UgY29uZmxpY3RzLgorICB2aXJ0dWFsIHZvaWQgUmVjZWRlQ3ljbGUoKSB7fQorCisgIC8vLyBFbWl0Tm9vcCAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGEgbm9vcCB3YXMgYWRkZWQgdG8gdGhlCisgIC8vLyBpbnN0cnVjdGlvbiBzdHJlYW0uCisgIHZpcnR1YWwgdm9pZCBFbWl0Tm9vcCgpIHsKKyAgICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uOiBjb3VudCBpdCBhcyBhIGN5Y2xlLgorICAgIEFkdmFuY2VDeWNsZSgpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1NDSEVEVUxFSEFaQVJEUkVDT0dOSVpFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NoZWR1bGVyUmVnaXN0cnkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TY2hlZHVsZXJSZWdpc3RyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZGY5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NoZWR1bGVyUmVnaXN0cnkuaApAQCAtMCwwICsxLDEwNSBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9TY2hlZHVsZXJSZWdpc3RyeS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbiBzY2hlZHVsZXIgZnVuY3Rpb24KKy8vIHBhc3MgcmVnaXN0cnkgKFJlZ2lzdGVyU2NoZWR1bGVyKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TQ0hFRFVMRVJSRUdJU1RSWV9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9TQ0hFRFVMRVJSRUdJU1RSWV9ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVBhc3NSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db2RlR2VuLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFJlZ2lzdGVyU2NoZWR1bGVyIGNsYXNzIC0gVHJhY2sgdGhlIHJlZ2lzdHJhdGlvbiBvZiBpbnN0cnVjdGlvbiBzY2hlZHVsZXJzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBTY2hlZHVsZURBR1NETm9kZXM7CitjbGFzcyBTZWxlY3Rpb25EQUdJU2VsOworCitjbGFzcyBSZWdpc3RlclNjaGVkdWxlciA6IHB1YmxpYyBNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZSB7CitwdWJsaWM6CisgIHVzaW5nIEZ1bmN0aW9uUGFzc0N0b3IgPSBTY2hlZHVsZURBR1NETm9kZXMgKigqKShTZWxlY3Rpb25EQUdJU2VsKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsKTsKKworICBzdGF0aWMgTWFjaGluZVBhc3NSZWdpc3RyeSBSZWdpc3RyeTsKKworICBSZWdpc3RlclNjaGVkdWxlcihjb25zdCBjaGFyICpOLCBjb25zdCBjaGFyICpELCBGdW5jdGlvblBhc3NDdG9yIEMpCisgIDogTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUoTiwgRCwgKE1hY2hpbmVQYXNzQ3RvcilDKQorICB7IFJlZ2lzdHJ5LkFkZCh0aGlzKTsgfQorICB+UmVnaXN0ZXJTY2hlZHVsZXIoKSB7IFJlZ2lzdHJ5LlJlbW92ZSh0aGlzKTsgfQorCisKKyAgLy8gQWNjZXNzb3JzLgorICBSZWdpc3RlclNjaGVkdWxlciAqZ2V0TmV4dCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKFJlZ2lzdGVyU2NoZWR1bGVyICopTWFjaGluZVBhc3NSZWdpc3RyeU5vZGU6OmdldE5leHQoKTsKKyAgfQorCisgIHN0YXRpYyBSZWdpc3RlclNjaGVkdWxlciAqZ2V0TGlzdCgpIHsKKyAgICByZXR1cm4gKFJlZ2lzdGVyU2NoZWR1bGVyICopUmVnaXN0cnkuZ2V0TGlzdCgpOworICB9CisKKyAgc3RhdGljIHZvaWQgc2V0TGlzdGVuZXIoTWFjaGluZVBhc3NSZWdpc3RyeUxpc3RlbmVyICpMKSB7CisgICAgUmVnaXN0cnkuc2V0TGlzdGVuZXIoTCk7CisgIH0KK307CisKKy8vLyBjcmVhdGVCVVJSTGlzdERBR1NjaGVkdWxlciAtIFRoaXMgY3JlYXRlcyBhIGJvdHRvbSB1cCByZWdpc3RlciB1c2FnZQorLy8vIHJlZHVjdGlvbiBsaXN0IHNjaGVkdWxlci4KK1NjaGVkdWxlREFHU0ROb2RlcyAqY3JlYXRlQlVSUkxpc3REQUdTY2hlZHVsZXIoU2VsZWN0aW9uREFHSVNlbCAqSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKKworLy8vIGNyZWF0ZUJVUlJMaXN0REFHU2NoZWR1bGVyIC0gVGhpcyBjcmVhdGVzIGEgYm90dG9tIHVwIGxpc3Qgc2NoZWR1bGVyIHRoYXQKKy8vLyBzY2hlZHVsZXMgbm9kZXMgaW4gc291cmNlIGNvZGUgb3JkZXIgd2hlbiBwb3NzaWJsZS4KK1NjaGVkdWxlREFHU0ROb2RlcyAqY3JlYXRlU291cmNlTGlzdERBR1NjaGVkdWxlcihTZWxlY3Rpb25EQUdJU2VsICpJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisKKy8vLyBjcmVhdGVIeWJyaWRMaXN0REFHU2NoZWR1bGVyIC0gVGhpcyBjcmVhdGVzIGEgYm90dG9tIHVwIHJlZ2lzdGVyIHByZXNzdXJlCisvLy8gYXdhcmUgbGlzdCBzY2hlZHVsZXIgdGhhdCBtYWtlIHVzZSBvZiBsYXRlbmN5IGluZm9ybWF0aW9uIHRvIGF2b2lkIHN0YWxscworLy8vIGZvciBsb25nIGxhdGVuY3kgaW5zdHJ1Y3Rpb25zIGluIGxvdyByZWdpc3RlciBwcmVzc3VyZSBtb2RlLiBJbiBoaWdoCisvLy8gcmVnaXN0ZXIgcHJlc3N1cmUgbW9kZSBpdCBzY2hlZHVsZXMgdG8gcmVkdWNlIHJlZ2lzdGVyIHByZXNzdXJlLgorU2NoZWR1bGVEQUdTRE5vZGVzICpjcmVhdGVIeWJyaWRMaXN0REFHU2NoZWR1bGVyKFNlbGVjdGlvbkRBR0lTZWwgKklTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsKTsKKworLy8vIGNyZWF0ZUlMUExpc3REQUdTY2hlZHVsZXIgLSBUaGlzIGNyZWF0ZXMgYSBib3R0b20gdXAgcmVnaXN0ZXIgcHJlc3N1cmUKKy8vLyBhd2FyZSBsaXN0IHNjaGVkdWxlciB0aGF0IHRyaWVzIHRvIGluY3JlYXNlIGluc3RydWN0aW9uIGxldmVsIHBhcmFsbGVsaXNtCisvLy8gaW4gbG93IHJlZ2lzdGVyIHByZXNzdXJlIG1vZGUuIEluIGhpZ2ggcmVnaXN0ZXIgcHJlc3N1cmUgbW9kZSBpdCBzY2hlZHVsZXMKKy8vLyB0byByZWR1Y2UgcmVnaXN0ZXIgcHJlc3N1cmUuCitTY2hlZHVsZURBR1NETm9kZXMgKmNyZWF0ZUlMUExpc3REQUdTY2hlZHVsZXIoU2VsZWN0aW9uREFHSVNlbCAqSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwpOworCisvLy8gY3JlYXRlRmFzdERBR1NjaGVkdWxlciAtIFRoaXMgY3JlYXRlcyBhICJmYXN0IiBzY2hlZHVsZXIuCisvLy8KK1NjaGVkdWxlREFHU0ROb2RlcyAqY3JlYXRlRmFzdERBR1NjaGVkdWxlcihTZWxlY3Rpb25EQUdJU2VsICpJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisKKy8vLyBjcmVhdGVWTElXREFHU2NoZWR1bGVyIC0gU2NoZWR1bGVyIGZvciBWTElXIHRhcmdldHMuIFRoaXMgY3JlYXRlcyB0b3AgZG93bgorLy8vIERGQSBkcml2ZW4gbGlzdCBzY2hlZHVsZXIgd2l0aCBjbHVzdGVyaW5nIGhldXJpc3RpYyB0byBjb250cm9sCisvLy8gcmVnaXN0ZXIgcHJlc3N1cmUuCitTY2hlZHVsZURBR1NETm9kZXMgKmNyZWF0ZVZMSVdEQUdTY2hlZHVsZXIoU2VsZWN0aW9uREFHSVNlbCAqSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpOworLy8vIGNyZWF0ZURlZmF1bHRTY2hlZHVsZXIgLSBUaGlzIGNyZWF0ZXMgYW4gaW5zdHJ1Y3Rpb24gc2NoZWR1bGVyIGFwcHJvcHJpYXRlCisvLy8gZm9yIHRoZSB0YXJnZXQuCitTY2hlZHVsZURBR1NETm9kZXMgKmNyZWF0ZURlZmF1bHRTY2hlZHVsZXIoU2VsZWN0aW9uREFHSVNlbCAqSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpOworCisvLy8gY3JlYXRlREFHTGluZWFyaXplciAtIFRoaXMgY3JlYXRlcyBhICJuby1zY2hlZHVsaW5nIiBzY2hlZHVsZXIgd2hpY2gKKy8vLyBsaW5lYXJpemUgdGhlIERBRyB1c2luZyB0b3BvbG9naWNhbCBvcmRlci4KK1NjaGVkdWxlREFHU0ROb2RlcyAqY3JlYXRlREFHTGluZWFyaXplcihTZWxlY3Rpb25EQUdJU2VsICpJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fU0NIRURVTEVSUkVHSVNUUllfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1Njb3JlYm9hcmRIYXphcmRSZWNvZ25pemVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NvcmVib2FyZEhhemFyZFJlY29nbml6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjZhYjUzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1Njb3JlYm9hcmRIYXphcmRSZWNvZ25pemVyLmgKQEAgLTAsMCArMSwxMjggQEAKKy8vPS0gbGx2bS9Db2RlR2VuL1Njb3JlYm9hcmRIYXphcmRSZWNvZ25pemVyLmggLSBTY2hlZHVsZSBTdXBwb3J0IC0qLSBDKysgLSotPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFNjb3JlYm9hcmRIYXphcmRSZWNvZ25pemVyIGNsYXNzLCB3aGljaAorLy8gZW5jYXBzdWxhdGVzIGhhemFyZC1hdm9pZGFuY2UgaGV1cmlzdGljcyBmb3Igc2NoZWR1bGluZywgYmFzZWQgb24gdGhlCisvLyBzY2hlZHVsaW5nIGl0aW5lcmFyaWVzIHNwZWNpZmllZCBmb3IgdGhlIHRhcmdldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TQ09SRUJPQVJESEFaQVJEUkVDT0dOSVpFUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9TQ09SRUJPQVJESEFaQVJEUkVDT0dOSVpFUl9ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgSW5zdHJJdGluZXJhcnlEYXRhOworY2xhc3MgU2NoZWR1bGVEQUc7CitjbGFzcyBTVW5pdDsKKworY2xhc3MgU2NvcmVib2FyZEhhemFyZFJlY29nbml6ZXIgOiBwdWJsaWMgU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyIHsKKyAgLy8gU2NvcmVib2FyZCB0byB0cmFjayBmdW5jdGlvbiB1bml0IHVzYWdlLiBTY29yZWJvYXJkWzBdIGlzIGEKKyAgLy8gbWFzayBvZiB0aGUgRlVzIGluIHVzZSBpbiB0aGUgY3ljbGUgY3VycmVudGx5IGJlaW5nCisgIC8vIHNjaGVkdWxlLiBTY29yZWJvYXJkWzFdIGlzIGEgbWFzayBmb3IgdGhlIG5leHQgY3ljbGUuIFRoZQorICAvLyBTY29yZWJvYXJkIGlzIHVzZWQgYXMgYSBjaXJjdWxhciBidWZmZXIgd2l0aCB0aGUgY3VycmVudCBjeWNsZQorICAvLyBpbmRpY2F0ZWQgYnkgSGVhZC4KKyAgLy8KKyAgLy8gU2NvcmVib2FyZCBhbHdheXMgY291bnRzIGN5Y2xlcyBpbiBmb3J3YXJkIGV4ZWN1dGlvbiBvcmRlci4gSWYgdXNlZCBieSBhCisgIC8vIGJvdHRvbS11cCBzY2hlZHVsZXIsIHRoZW4gdGhlIHNjb3JlYm9hcmQgY3ljbGVzIGFyZSB0aGUgaW52ZXJzZSBvZiB0aGUKKyAgLy8gc2NoZWR1bGVyJ3MgY3ljbGVzLgorICBjbGFzcyBTY29yZWJvYXJkIHsKKyAgICB1bnNpZ25lZCAqRGF0YSA9IG51bGxwdHI7CisKKyAgICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgY3ljbGVzIG1vbml0b3JlZCBieSB0aGUgU2NvcmVib2FyZC4gVGhpcworICAgIC8vIHZhbHVlIGlzIGRldGVybWluZWQgYmFzZWQgb24gdGhlIHRhcmdldCBpdGluZXJhcmllcyB0byBlbnN1cmUKKyAgICAvLyB0aGF0IGFsbCBoYXphcmRzIGNhbiBiZSB0cmFja2VkLgorICAgIHNpemVfdCBEZXB0aCA9IDA7CisKKyAgICAvLyBJbmRpY2VzIGludG8gdGhlIFNjb3JlYm9hcmQgdGhhdCByZXByZXNlbnQgdGhlIGN1cnJlbnQgY3ljbGUuCisgICAgc2l6ZV90IEhlYWQgPSAwOworCisgIHB1YmxpYzoKKyAgICBTY29yZWJvYXJkKCkgPSBkZWZhdWx0OworCisgICAgflNjb3JlYm9hcmQoKSB7CisgICAgICBkZWxldGVbXSBEYXRhOworICAgIH0KKworICAgIHNpemVfdCBnZXREZXB0aCgpIGNvbnN0IHsgcmV0dXJuIERlcHRoOyB9CisKKyAgICB1bnNpZ25lZCYgb3BlcmF0b3JbXShzaXplX3QgaWR4KSBjb25zdCB7CisgICAgICAvLyBEZXB0aCBpcyBleHBlY3RlZCB0byBiZSBhIHBvd2VyLW9mLTIuCisgICAgICBhc3NlcnQoRGVwdGggJiYgIShEZXB0aCAmIChEZXB0aCAtIDEpKSAmJgorICAgICAgICAgICAgICJTY29yZWJvYXJkIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkhIik7CisKKyAgICAgIHJldHVybiBEYXRhWyhIZWFkICsgaWR4KSAmIChEZXB0aC0xKV07CisgICAgfQorCisgICAgdm9pZCByZXNldChzaXplX3QgZCA9IDEpIHsKKyAgICAgIGlmICghRGF0YSkgeworICAgICAgICBEZXB0aCA9IGQ7CisgICAgICAgIERhdGEgPSBuZXcgdW5zaWduZWRbRGVwdGhdOworICAgICAgfQorCisgICAgICBtZW1zZXQoRGF0YSwgMCwgRGVwdGggKiBzaXplb2YoRGF0YVswXSkpOworICAgICAgSGVhZCA9IDA7CisgICAgfQorCisgICAgdm9pZCBhZHZhbmNlKCkgeworICAgICAgSGVhZCA9IChIZWFkICsgMSkgJiAoRGVwdGgtMSk7CisgICAgfQorCisgICAgdm9pZCByZWNlZGUoKSB7CisgICAgICBIZWFkID0gKEhlYWQgLSAxKSAmIChEZXB0aC0xKTsKKyAgICB9CisKKyAgICAvLyBQcmludCB0aGUgc2NvcmVib2FyZC4KKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgfTsKKworICAvLyBTdXBwb3J0IGZvciB0cmFjaW5nIFNjb3JlYm9hcmRIYXphcmRSZWNvZ25pemVyIGFzIGEgY29tcG9uZW50IHdpdGhpbgorICAvLyBhbm90aGVyIG1vZHVsZS4KKyAgY29uc3QgY2hhciAqRGVidWdUeXBlOworCisgIC8vIEl0aW5lcmFyeSBkYXRhIGZvciB0aGUgdGFyZ2V0LgorICBjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgKkl0aW5EYXRhOworCisgIGNvbnN0IFNjaGVkdWxlREFHICpEQUc7CisKKyAgLy8vIElzc3VlV2lkdGggLSBNYXggaXNzdWUgcGVyIGN5Y2xlLiAwPVVua25vd24uCisgIHVuc2lnbmVkIElzc3VlV2lkdGggPSAwOworCisgIC8vLyBJc3N1ZUNvdW50IC0gQ291bnQgaW5zdHJ1Y3Rpb25zIGlzc3VlZCBpbiB0aGlzIGN5Y2xlLgorICB1bnNpZ25lZCBJc3N1ZUNvdW50ID0gMDsKKworICBTY29yZWJvYXJkIFJlc2VydmVkU2NvcmVib2FyZDsKKyAgU2NvcmVib2FyZCBSZXF1aXJlZFNjb3JlYm9hcmQ7CisKK3B1YmxpYzoKKyAgU2NvcmVib2FyZEhhemFyZFJlY29nbml6ZXIoY29uc3QgSW5zdHJJdGluZXJhcnlEYXRhICpJdGluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NoZWR1bGVEQUcgKkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqUGFyZW50RGVidWdUeXBlID0gIiIpOworCisgIC8vLyBhdElzc3VlTGltaXQgLSBSZXR1cm4gdHJ1ZSBpZiBubyBtb3JlIGluc3RydWN0aW9ucyBtYXkgYmUgaXNzdWVkIGluIHRoaXMKKyAgLy8vIGN5Y2xlLgorICBib29sIGF0SXNzdWVMaW1pdCgpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vIFN0YWxscyBwcm92aWRlcyBhbiBjeWNsZSBvZmZzZXQgYXQgd2hpY2ggU1Ugd2lsbCBiZSBzY2hlZHVsZWQuIEl0IHdpbGwgYmUKKyAgLy8gbmVnYXRpdmUgZm9yIGJvdHRvbS11cCBzY2hlZHVsaW5nLgorICBIYXphcmRUeXBlIGdldEhhemFyZFR5cGUoU1VuaXQgKlNVLCBpbnQgU3RhbGxzKSBvdmVycmlkZTsKKyAgdm9pZCBSZXNldCgpIG92ZXJyaWRlOworICB2b2lkIEVtaXRJbnN0cnVjdGlvbihTVW5pdCAqU1UpIG92ZXJyaWRlOworICB2b2lkIEFkdmFuY2VDeWNsZSgpIG92ZXJyaWRlOworICB2b2lkIFJlY2VkZUN5Y2xlKCkgb3ZlcnJpZGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1NDT1JFQk9BUkRIQVpBUkRSRUNPR05JWkVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjQzYzliCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oCkBAIC0wLDAgKzEsMTYxMSBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUcuaCAtIEluc3RTZWxlY3Rpb24gREFHIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFNlbGVjdGlvbkRBRyBjbGFzcywgYW5kIHRyYW5zaXRpdmVseSBkZWZpbmVzIHRoZQorLy8gU0ROb2RlIGNsYXNzIGFuZCBzdWJjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1NFTEVDVElPTkRBR19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9TRUxFQ1RJT05EQUdfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBGbG9hdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FQSW50LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9EaXZlcmdlbmNlQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vREFHQ29tYmluZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9GdW5jdGlvbkxvd2VyaW5nSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9JU0RPcGNvZGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTWVtT3BlcmFuZC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdOb2Rlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9WYWx1ZVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZWJ1Z0xvYy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9NZXRhZGF0YS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQXJyYXlSZWN5Y2xlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BdG9taWNPcmRlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvZGVHZW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYWNoaW5lVmFsdWVUeXBlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1JlY3ljbGluZ0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJsb2NrQWRkcmVzczsKK2NsYXNzIENvbnN0YW50OworY2xhc3MgQ29uc3RhbnRGUDsKK2NsYXNzIENvbnN0YW50SW50OworY2xhc3MgRGF0YUxheW91dDsKK3N0cnVjdCBmbHRTZW1hbnRpY3M7CitjbGFzcyBHbG9iYWxWYWx1ZTsKK3N0cnVjdCBLbm93bkJpdHM7CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlOworY2xhc3MgTUNTeW1ib2w7CitjbGFzcyBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyOworY2xhc3MgU0REYmdWYWx1ZTsKK2NsYXNzIFNlbGVjdGlvbkRBRzsKK2NsYXNzIFNlbGVjdGlvbkRBR1RhcmdldEluZm87CitjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbzsKK2NsYXNzIFRhcmdldExvd2VyaW5nOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKK2NsYXNzIFRhcmdldFN1YnRhcmdldEluZm87CitjbGFzcyBWYWx1ZTsKKworY2xhc3MgU0RWVExpc3ROb2RlIDogcHVibGljIEZvbGRpbmdTZXROb2RlIHsKKyAgZnJpZW5kIHN0cnVjdCBGb2xkaW5nU2V0VHJhaXQ8U0RWVExpc3ROb2RlPjsKKworICAvLy8gQSByZWZlcmVuY2UgdG8gYW4gSW50ZXJuZWQgRm9sZGluZ1NldE5vZGVJRCBmb3IgdGhpcyBub2RlLgorICAvLy8gVGhlIEFsbG9jYXRvciBpbiBTZWxlY3Rpb25EQUcgaG9sZHMgdGhlIGRhdGEuCisgIC8vLyBTRFZUTGlzdCBjb250YWlucyBhbGwgdHlwZXMgd2hpY2ggYXJlIGZyZXF1ZW50bHkgYWNjZXNzZWQgaW4gU2VsZWN0aW9uREFHLgorICAvLy8gVGhlIHNpemUgb2YgdGhpcyBsaXN0IGlzIG5vdCBleHBlY3RlZCB0byBiZSBiaWcgc28gaXQgd29uJ3QgaW50cm9kdWNlCisgIC8vLyBhIG1lbW9yeSBwZW5hbHR5LgorICBGb2xkaW5nU2V0Tm9kZUlEUmVmIEZhc3RJRDsKKyAgY29uc3QgRVZUICpWVHM7CisgIHVuc2lnbmVkIGludCBOdW1WVHM7CisgIC8vLyBUaGUgaGFzaCB2YWx1ZSBmb3IgU0RWVExpc3QgaXMgZml4ZWQsIHNvIGNhY2hlIGl0IHRvIGF2b2lkCisgIC8vLyBoYXNoIGNhbGN1bGF0aW9uLgorICB1bnNpZ25lZCBIYXNoVmFsdWU7CisKK3B1YmxpYzoKKyAgU0RWVExpc3ROb2RlKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsIGNvbnN0IEVWVCAqVlQsIHVuc2lnbmVkIGludCBOdW0pIDoKKyAgICAgIEZhc3RJRChJRCksIFZUcyhWVCksIE51bVZUcyhOdW0pIHsKKyAgICBIYXNoVmFsdWUgPSBJRC5Db21wdXRlSGFzaCgpOworICB9CisKKyAgU0RWVExpc3QgZ2V0U0RWVExpc3QoKSB7CisgICAgU0RWVExpc3QgcmVzdWx0ID0ge1ZUcywgTnVtVlRzfTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9OworCisvLy8gU3BlY2lhbGl6ZSBGb2xkaW5nU2V0VHJhaXQgZm9yIFNEVlRMaXN0Tm9kZQorLy8vIHRvIGF2b2lkIGNvbXB1dGluZyB0ZW1wIEZvbGRpbmdTZXROb2RlSUQgYW5kIGhhc2ggdmFsdWUuCit0ZW1wbGF0ZTw+IHN0cnVjdCBGb2xkaW5nU2V0VHJhaXQ8U0RWVExpc3ROb2RlPiA6IERlZmF1bHRGb2xkaW5nU2V0VHJhaXQ8U0RWVExpc3ROb2RlPiB7CisgIHN0YXRpYyB2b2lkIFByb2ZpbGUoY29uc3QgU0RWVExpc3ROb2RlICZYLCBGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgeworICAgIElEID0gWC5GYXN0SUQ7CisgIH0KKworICBzdGF0aWMgYm9vbCBFcXVhbHMoY29uc3QgU0RWVExpc3ROb2RlICZYLCBjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElESGFzaCwgRm9sZGluZ1NldE5vZGVJRCAmVGVtcElEKSB7CisgICAgaWYgKFguSGFzaFZhbHVlICE9IElESGFzaCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gSUQgPT0gWC5GYXN0SUQ7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgQ29tcHV0ZUhhc2goY29uc3QgU0RWVExpc3ROb2RlICZYLCBGb2xkaW5nU2V0Tm9kZUlEICZUZW1wSUQpIHsKKyAgICByZXR1cm4gWC5IYXNoVmFsdWU7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpbGlzdF9hbGxvY190cmFpdHM8U0ROb2RlPiB7CisgIHN0YXRpYyB2b2lkIGRlbGV0ZU5vZGUoU0ROb2RlICopIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJpbGlzdF90cmFpdHM8U0ROb2RlPiBzaG91bGRuJ3Qgc2VlIGEgZGVsZXRlTm9kZSBjYWxsISIpOworICB9Cit9OworCisvLy8gS2VlcHMgdHJhY2sgb2YgZGJnX3ZhbHVlIGluZm9ybWF0aW9uIHRocm91Z2ggU0RJU2VsLiAgV2UgZG8KKy8vLyBub3QgYnVpbGQgU0ROb2RlcyBmb3IgdGhlc2Ugc28gYXMgbm90IHRvIHBlcnR1cmIgdGhlIGdlbmVyYXRlZCBjb2RlOworLy8vIGluc3RlYWQgdGhlIGluZm8gaXMga2VwdCBvZmYgdG8gdGhlIHNpZGUgaW4gdGhpcyBzdHJ1Y3R1cmUuIEVhY2ggU0ROb2RlIG1heQorLy8vIGhhdmUgb25lIG9yIG1vcmUgYXNzb2NpYXRlZCBkYmdfdmFsdWUgZW50cmllcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBrZXB0IGluCisvLy8gRGJnVmFsTWFwLgorLy8vIEJ5dmFsIHBhcmFtZXRlcnMgYXJlIGhhbmRsZWQgc2VwYXJhdGVseSBiZWNhdXNlIHRoZXkgZG9uJ3QgdXNlIGFsbG9jYSdzLAorLy8vIHdoaWNoIGJ1c3RzIHRoZSBub3JtYWwgbWVjaGFuaXNtLiAgVGhlcmUgaXMgZ29vZCByZWFzb24gZm9yIGhhbmRsaW5nIGFsbAorLy8vIHBhcmFtZXRlcnMgc2VwYXJhdGVseTogIHRoZXkgbWF5IG5vdCBoYXZlIGNvZGUgZ2VuZXJhdGVkIGZvciB0aGVtLCB0aGV5CisvLy8gc2hvdWxkIGFsd2F5cyBnbyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmdW5jdGlvbiByZWdhcmRsZXNzIG9mIG90aGVyIGNvZGUKKy8vLyBtb3Rpb24sIGFuZCBkZWJ1ZyBpbmZvIGZvciB0aGVtIGlzIHBvdGVudGlhbGx5IHVzZWZ1bCBldmVuIGlmIHRoZSBwYXJhbWV0ZXIKKy8vLyBpcyB1bnVzZWQuICBSaWdodCBub3cgb25seSBieXZhbCBwYXJhbWV0ZXJzIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkuCitjbGFzcyBTRERiZ0luZm8geworICBCdW1wUHRyQWxsb2NhdG9yIEFsbG9jOworICBTbWFsbFZlY3RvcjxTRERiZ1ZhbHVlKiwgMzI+IERiZ1ZhbHVlczsKKyAgU21hbGxWZWN0b3I8U0REYmdWYWx1ZSosIDMyPiBCeXZhbFBhcm1EYmdWYWx1ZXM7CisgIHVzaW5nIERiZ1ZhbE1hcFR5cGUgPSBEZW5zZU1hcDxjb25zdCBTRE5vZGUgKiwgU21hbGxWZWN0b3I8U0REYmdWYWx1ZSAqLCAyPj47CisgIERiZ1ZhbE1hcFR5cGUgRGJnVmFsTWFwOworCitwdWJsaWM6CisgIFNERGJnSW5mbygpID0gZGVmYXVsdDsKKyAgU0REYmdJbmZvKGNvbnN0IFNERGJnSW5mbyAmKSA9IGRlbGV0ZTsKKyAgU0REYmdJbmZvICZvcGVyYXRvcj0oY29uc3QgU0REYmdJbmZvICYpID0gZGVsZXRlOworCisgIHZvaWQgYWRkKFNERGJnVmFsdWUgKlYsIGNvbnN0IFNETm9kZSAqTm9kZSwgYm9vbCBpc1BhcmFtZXRlcikgeworICAgIGlmIChpc1BhcmFtZXRlcikgeworICAgICAgQnl2YWxQYXJtRGJnVmFsdWVzLnB1c2hfYmFjayhWKTsKKyAgICB9IGVsc2UgICAgIERiZ1ZhbHVlcy5wdXNoX2JhY2soVik7CisgICAgaWYgKE5vZGUpCisgICAgICBEYmdWYWxNYXBbTm9kZV0ucHVzaF9iYWNrKFYpOworICB9CisKKyAgLy8vIFxicmllZiBJbnZhbGlkYXRlIGFsbCBEYmdWYWx1ZXMgYXR0YWNoZWQgdG8gdGhlIG5vZGUgYW5kIHJlbW92ZQorICAvLy8gaXQgZnJvbSB0aGUgTm9kZS10by1EYmdWYWx1ZXMgbWFwLgorICB2b2lkIGVyYXNlKGNvbnN0IFNETm9kZSAqTm9kZSk7CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBEYmdWYWxNYXAuY2xlYXIoKTsKKyAgICBEYmdWYWx1ZXMuY2xlYXIoKTsKKyAgICBCeXZhbFBhcm1EYmdWYWx1ZXMuY2xlYXIoKTsKKyAgICBBbGxvYy5SZXNldCgpOworICB9CisKKyAgQnVtcFB0ckFsbG9jYXRvciAmZ2V0QWxsb2MoKSB7IHJldHVybiBBbGxvYzsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIERiZ1ZhbHVlcy5lbXB0eSgpICYmIEJ5dmFsUGFybURiZ1ZhbHVlcy5lbXB0eSgpOworICB9CisKKyAgQXJyYXlSZWY8U0REYmdWYWx1ZSo+IGdldFNERGJnVmFsdWVzKGNvbnN0IFNETm9kZSAqTm9kZSkgeworICAgIERiZ1ZhbE1hcFR5cGU6Oml0ZXJhdG9yIEkgPSBEYmdWYWxNYXAuZmluZChOb2RlKTsKKyAgICBpZiAoSSAhPSBEYmdWYWxNYXAuZW5kKCkpCisgICAgICByZXR1cm4gSS0+c2Vjb25kOworICAgIHJldHVybiBBcnJheVJlZjxTRERiZ1ZhbHVlKj4oKTsKKyAgfQorCisgIHVzaW5nIERiZ0l0ZXJhdG9yID0gU21hbGxWZWN0b3JJbXBsPFNERGJnVmFsdWUqPjo6aXRlcmF0b3I7CisKKyAgRGJnSXRlcmF0b3IgRGJnQmVnaW4oKSB7IHJldHVybiBEYmdWYWx1ZXMuYmVnaW4oKTsgfQorICBEYmdJdGVyYXRvciBEYmdFbmQoKSAgIHsgcmV0dXJuIERiZ1ZhbHVlcy5lbmQoKTsgfQorICBEYmdJdGVyYXRvciBCeXZhbFBhcm1EYmdCZWdpbigpIHsgcmV0dXJuIEJ5dmFsUGFybURiZ1ZhbHVlcy5iZWdpbigpOyB9CisgIERiZ0l0ZXJhdG9yIEJ5dmFsUGFybURiZ0VuZCgpICAgeyByZXR1cm4gQnl2YWxQYXJtRGJnVmFsdWVzLmVuZCgpOyB9Cit9OworCit2b2lkIGNoZWNrRm9yQ3ljbGVzKGNvbnN0IFNlbGVjdGlvbkRBRyAqREFHLCBib29sIGZvcmNlID0gZmFsc2UpOworCisvLy8gVGhpcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHBvcnRpb24gb2YgYW4gTExWTSBmdW5jdGlvbiBpbiBhIGxvdy1sZXZlbAorLy8vIERhdGEgRGVwZW5kZW5jZSBEQUcgcmVwcmVzZW50YXRpb24gc3VpdGFibGUgZm9yIGluc3RydWN0aW9uIHNlbGVjdGlvbi4KKy8vLyBUaGlzIERBRyBpcyBjb25zdHJ1Y3RlZCBhcyB0aGUgZmlyc3Qgc3RlcCBvZiBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gaW4gb3JkZXIKKy8vLyB0byBhbGxvdyBpbXBsZW1lbnRhdGlvbiBvZiBtYWNoaW5lIHNwZWNpZmljIG9wdGltaXphdGlvbnMKKy8vLyBhbmQgY29kZSBzaW1wbGlmaWNhdGlvbnMuCisvLy8KKy8vLyBUaGUgcmVwcmVzZW50YXRpb24gdXNlZCBieSB0aGUgU2VsZWN0aW9uREFHIGlzIGEgdGFyZ2V0LWluZGVwZW5kZW50CisvLy8gcmVwcmVzZW50YXRpb24sIHdoaWNoIGhhcyBzb21lIHNpbWlsYXJpdGllcyB0byB0aGUgR0NDIFJUTCByZXByZXNlbnRhdGlvbiwKKy8vLyBidXQgaXMgc2lnbmlmaWNhbnRseSBtb3JlIHNpbXBsZSwgcG93ZXJmdWwsIGFuZCBpcyBhIGdyYXBoIGZvcm0gaW5zdGVhZCBvZiBhCisvLy8gbGluZWFyIGZvcm0uCisvLy8KK2NsYXNzIFNlbGVjdGlvbkRBRyB7CisgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNOworICBjb25zdCBTZWxlY3Rpb25EQUdUYXJnZXRJbmZvICpUU0kgPSBudWxscHRyOworICBjb25zdCBUYXJnZXRMb3dlcmluZyAqVExJID0gbnVsbHB0cjsKKyAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKkxpYkluZm8gPSBudWxscHRyOworICBNYWNoaW5lRnVuY3Rpb24gKk1GOworICBQYXNzICpTREFHSVNlbFBhc3MgPSBudWxscHRyOworICBMTFZNQ29udGV4dCAqQ29udGV4dDsKKyAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWw7CisKKyAgRGl2ZXJnZW5jZUFuYWx5c2lzICogREEgPSBudWxscHRyOworICBGdW5jdGlvbkxvd2VyaW5nSW5mbyAqIEZMSSA9IG51bGxwdHI7CisKKyAgLy8vIFRoZSBmdW5jdGlvbi1sZXZlbCBvcHRpbWl6YXRpb24gcmVtYXJrIGVtaXR0ZXIuICBVc2VkIHRvIGVtaXQgcmVtYXJrcworICAvLy8gd2hlbmV2ZXIgbWFuaXB1bGF0aW5nIHRoZSBEQUcuCisgIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgKk9SRTsKKworICAvLy8gVGhlIHN0YXJ0aW5nIHRva2VuLgorICBTRE5vZGUgRW50cnlOb2RlOworCisgIC8vLyBUaGUgcm9vdCBvZiB0aGUgZW50aXJlIERBRy4KKyAgU0RWYWx1ZSBSb290OworCisgIC8vLyBBIGxpbmtlZCBsaXN0IG9mIG5vZGVzIGluIHRoZSBjdXJyZW50IERBRy4KKyAgaWxpc3Q8U0ROb2RlPiBBbGxOb2RlczsKKworICAvLy8gVGhlIEFsbG9jYXRvclR5cGUgZm9yIGFsbG9jYXRpbmcgU0ROb2Rlcy4gV2UgdXNlCisgIC8vLyBwb29sIGFsbG9jYXRpb24gd2l0aCByZWN5Y2xpbmcuCisgIHVzaW5nIE5vZGVBbGxvY2F0b3JUeXBlID0gUmVjeWNsaW5nQWxsb2NhdG9yPEJ1bXBQdHJBbGxvY2F0b3IsIFNETm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExhcmdlc3RTRE5vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm9mKE1vc3RBbGlnbmVkU0ROb2RlKT47CisKKyAgLy8vIFBvb2wgYWxsb2NhdGlvbiBmb3Igbm9kZXMuCisgIE5vZGVBbGxvY2F0b3JUeXBlIE5vZGVBbGxvY2F0b3I7CisKKyAgLy8vIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gbWVtb2l6ZSBub2RlcywgYXV0b21hdGljYWxseSBwZXJmb3JtaW5nCisgIC8vLyBDU0Ugd2l0aCBleGlzdGluZyBub2RlcyB3aGVuIGEgZHVwbGljYXRlIGlzIHJlcXVlc3RlZC4KKyAgRm9sZGluZ1NldDxTRE5vZGU+IENTRU1hcDsKKworICAvLy8gUG9vbCBhbGxvY2F0aW9uIGZvciBtYWNoaW5lLW9wY29kZSBTRE5vZGUgb3BlcmFuZHMuCisgIEJ1bXBQdHJBbGxvY2F0b3IgT3BlcmFuZEFsbG9jYXRvcjsKKyAgQXJyYXlSZWN5Y2xlcjxTRFVzZT4gT3BlcmFuZFJlY3ljbGVyOworCisgIC8vLyBQb29sIGFsbG9jYXRpb24gZm9yIG1pc2MuIG9iamVjdHMgdGhhdCBhcmUgY3JlYXRlZCBvbmNlIHBlciBTZWxlY3Rpb25EQUcuCisgIEJ1bXBQdHJBbGxvY2F0b3IgQWxsb2NhdG9yOworCisgIC8vLyBUcmFja3MgZGJnX3ZhbHVlIGluZm9ybWF0aW9uIHRocm91Z2ggU0RJU2VsLgorICBTRERiZ0luZm8gKkRiZ0luZm87CisKKyAgdWludDE2X3QgTmV4dFBlcnNpc3RlbnRJZCA9IDA7CisKK3B1YmxpYzoKKyAgLy8vIENsaWVudHMgb2YgdmFyaW91cyBBUElzIHRoYXQgY2F1c2UgZ2xvYmFsIGVmZmVjdHMgb24KKyAgLy8vIHRoZSBEQUcgY2FuIG9wdGlvbmFsbHkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiAgVGhpcyBhbGxvd3MgdGhlIGNsaWVudHMKKyAgLy8vIHRvIGhhbmRsZSB0aGUgdmFyaW91cyBzb3J0cyBvZiB1cGRhdGVzIHRoYXQgaGFwcGVuLgorICAvLy8KKyAgLy8vIEEgREFHVXBkYXRlTGlzdGVuZXIgYXV0b21hdGljYWxseSByZWdpc3RlcnMgaXRzZWxmIHdpdGggREFHIHdoZW4gaXQgaXMKKyAgLy8vIGNvbnN0cnVjdGVkLCBhbmQgcmVtb3ZlcyBpdHNlbGYgd2hlbiBkZXN0cm95ZWQgaW4gUkFJSSBmYXNoaW9uLgorICBzdHJ1Y3QgREFHVXBkYXRlTGlzdGVuZXIgeworICAgIERBR1VwZGF0ZUxpc3RlbmVyICpjb25zdCBOZXh0OworICAgIFNlbGVjdGlvbkRBRyAmREFHOworCisgICAgZXhwbGljaXQgREFHVXBkYXRlTGlzdGVuZXIoU2VsZWN0aW9uREFHICZEKQorICAgICAgOiBOZXh0KEQuVXBkYXRlTGlzdGVuZXJzKSwgREFHKEQpIHsKKyAgICAgIERBRy5VcGRhdGVMaXN0ZW5lcnMgPSB0aGlzOworICAgIH0KKworICAgIHZpcnR1YWwgfkRBR1VwZGF0ZUxpc3RlbmVyKCkgeworICAgICAgYXNzZXJ0KERBRy5VcGRhdGVMaXN0ZW5lcnMgPT0gdGhpcyAmJgorICAgICAgICAgICAgICJEQUdVcGRhdGVMaXN0ZW5lcnMgbXVzdCBiZSBkZXN0cm95ZWQgaW4gTElGTyBvcmRlciIpOworICAgICAgREFHLlVwZGF0ZUxpc3RlbmVycyA9IE5leHQ7CisgICAgfQorCisgICAgLy8vIFRoZSBub2RlIE4gdGhhdCB3YXMgZGVsZXRlZCBhbmQsIGlmIEUgaXMgbm90IG51bGwsIGFuCisgICAgLy8vIGVxdWl2YWxlbnQgbm9kZSBFIHRoYXQgcmVwbGFjZWQgaXQuCisgICAgdmlydHVhbCB2b2lkIE5vZGVEZWxldGVkKFNETm9kZSAqTiwgU0ROb2RlICpFKTsKKworICAgIC8vLyBUaGUgbm9kZSBOIHRoYXQgd2FzIHVwZGF0ZWQuCisgICAgdmlydHVhbCB2b2lkIE5vZGVVcGRhdGVkKFNETm9kZSAqTik7CisgIH07CisKKyAgc3RydWN0IERBR05vZGVEZWxldGVkTGlzdGVuZXIgOiBwdWJsaWMgREFHVXBkYXRlTGlzdGVuZXIgeworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChTRE5vZGUgKiwgU0ROb2RlICopPiBDYWxsYmFjazsKKworICAgIERBR05vZGVEZWxldGVkTGlzdGVuZXIoU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoU0ROb2RlICosIFNETm9kZSAqKT4gQ2FsbGJhY2spCisgICAgICAgIDogREFHVXBkYXRlTGlzdGVuZXIoREFHKSwgQ2FsbGJhY2soc3RkOjptb3ZlKENhbGxiYWNrKSkge30KKworICAgIHZvaWQgTm9kZURlbGV0ZWQoU0ROb2RlICpOLCBTRE5vZGUgKkUpIG92ZXJyaWRlIHsgQ2FsbGJhY2soTiwgRSk7IH0KKyAgfTsKKworICAvLy8gV2hlbiB0cnVlLCBhZGRpdGlvbmFsIHN0ZXBzIGFyZSB0YWtlbiB0bworICAvLy8gZW5zdXJlIHRoYXQgZ2V0Q29uc3RhbnQoKSBhbmQgc2ltaWxhciBmdW5jdGlvbnMgcmV0dXJuIERBRyBub2RlcyB0aGF0CisgIC8vLyBoYXZlIGxlZ2FsIHR5cGVzLiBUaGlzIGlzIGltcG9ydGFudCBhZnRlciB0eXBlIGxlZ2FsaXphdGlvbiBzaW5jZQorICAvLy8gYW55IGlsbGVnYWxseSB0eXBlZCBub2RlcyBnZW5lcmF0ZWQgYWZ0ZXIgdGhpcyBwb2ludCB3aWxsIG5vdCBleHBlcmllbmNlCisgIC8vLyB0eXBlIGxlZ2FsaXphdGlvbi4KKyAgYm9vbCBOZXdOb2Rlc011c3RIYXZlTGVnYWxUeXBlcyA9IGZhbHNlOworCitwcml2YXRlOgorICAvLy8gREFHVXBkYXRlTGlzdGVuZXIgaXMgYSBmcmllbmQgc28gaXQgY2FuIG1hbmlwdWxhdGUgdGhlIGxpc3RlbmVyIHN0YWNrLgorICBmcmllbmQgc3RydWN0IERBR1VwZGF0ZUxpc3RlbmVyOworCisgIC8vLyBMaW5rZWQgbGlzdCBvZiByZWdpc3RlcmVkIERBR1VwZGF0ZUxpc3RlbmVyIGluc3RhbmNlcy4KKyAgLy8vIFRoaXMgc3RhY2sgaXMgbWFpbnRhaW5lZCBieSBEQUdVcGRhdGVMaXN0ZW5lciBSQUlJLgorICBEQUdVcGRhdGVMaXN0ZW5lciAqVXBkYXRlTGlzdGVuZXJzID0gbnVsbHB0cjsKKworICAvLy8gSW1wbGVtZW50YXRpb24gb2Ygc2V0U3ViZ3JhcGhDb2xvci4KKyAgLy8vIFJldHVybiB3aGV0aGVyIHdlIGhhZCB0byB0cnVuY2F0ZSB0aGUgc2VhcmNoLgorICBib29sIHNldFN1YmdyYXBoQ29sb3JIZWxwZXIoU0ROb2RlICpOLCBjb25zdCBjaGFyICpDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlU2V0PFNETm9kZSAqPiAmdmlzaXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwgYm9vbCAmcHJpbnRlZCk7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFNETm9kZVQsIHR5cGVuYW1lLi4uIEFyZ1R5cGVzPgorICBTRE5vZGVUICpuZXdTRE5vZGUoQXJnVHlwZXMgJiYuLi4gQXJncykgeworICAgIHJldHVybiBuZXcgKE5vZGVBbGxvY2F0b3IudGVtcGxhdGUgQWxsb2NhdGU8U0ROb2RlVD4oKSkKKyAgICAgICAgU0ROb2RlVChzdGQ6OmZvcndhcmQ8QXJnVHlwZXM+KEFyZ3MpLi4uKTsKKyAgfQorCisgIC8vLyBCdWlsZCBhIHN5bnRoZXRpYyBTRE5vZGVUIHdpdGggdGhlIGdpdmVuIGFyZ3MgYW5kIGV4dHJhY3QgaXRzIHN1YmNsYXNzCisgIC8vLyBkYXRhIGFzIGFuIGludGVnZXIgKGUuZy4gZm9yIHVzZSBpbiBhIGZvbGRpbmcgc2V0KS4KKyAgLy8vCisgIC8vLyBUaGUgYXJncyB0byB0aGlzIGZ1bmN0aW9uIGFyZSB0aGUgc2FtZSBhcyB0aGUgYXJncyB0byBTRE5vZGVUJ3MKKyAgLy8vIGNvbnN0cnVjdG9yLCBleGNlcHQgdGhlIHNlY29uZCBhcmcgKGFzc3VtZWQgdG8gYmUgYSBjb25zdCBEZWJ1Z0xvYyYpIGlzCisgIC8vLyBvbWl0dGVkLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU0ROb2RlVCwgdHlwZW5hbWUuLi4gQXJnVHlwZXM+CisgIHN0YXRpYyB1aW50MTZfdCBnZXRTeW50aGV0aWNOb2RlU3ViY2xhc3NEYXRhKHVuc2lnbmVkIElST3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1R5cGVzICYmLi4uIEFyZ3MpIHsKKyAgICAvLyBUaGUgY29tcGlsZXIgY2FuIHJlZHVjZSB0aGlzIGV4cHJlc3Npb24gdG8gYSBjb25zdGFudCBpZmYgd2UgcGFzcyBhbgorICAgIC8vIGVtcHR5IERlYnVnTG9jLiAgVGhhbmtmdWxseSwgdGhlIGRlYnVnIGxvY2F0aW9uIGRvZXNuJ3QgaGF2ZSBhbnkgYmVhcmluZworICAgIC8vIG9uIHRoZSBzdWJjbGFzcyBkYXRhLgorICAgIHJldHVybiBTRE5vZGVUKElST3JkZXIsIERlYnVnTG9jKCksIHN0ZDo6Zm9yd2FyZDxBcmdUeXBlcz4oQXJncykuLi4pCisgICAgICAgIC5nZXRSYXdTdWJjbGFzc0RhdGEoKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTRE5vZGVUeT4KKyAgc3RhdGljIHVpbnQxNl90IGdldFN5bnRoZXRpY05vZGVTdWJjbGFzc0RhdGEodW5zaWduZWQgT3BjLCB1bnNpZ25lZCBPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVlRMaXN0IFZUcywgRVZUIE1lbW9yeVZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTykgeworICAgIHJldHVybiBTRE5vZGVUeShPcGMsIE9yZGVyLCBEZWJ1Z0xvYygpLCBWVHMsIE1lbW9yeVZULCBNTU8pCisgICAgICAgICAuZ2V0UmF3U3ViY2xhc3NEYXRhKCk7CisgIH0KKworICB2b2lkIGNyZWF0ZU9wZXJhbmRzKFNETm9kZSAqTm9kZSwgQXJyYXlSZWY8U0RWYWx1ZT4gVmFscyk7CisKKyAgdm9pZCByZW1vdmVPcGVyYW5kcyhTRE5vZGUgKk5vZGUpIHsKKyAgICBpZiAoIU5vZGUtPk9wZXJhbmRMaXN0KQorICAgICAgcmV0dXJuOworICAgIE9wZXJhbmRSZWN5Y2xlci5kZWFsbG9jYXRlKAorICAgICAgICBBcnJheVJlY3ljbGVyPFNEVXNlPjo6Q2FwYWNpdHk6OmdldChOb2RlLT5OdW1PcGVyYW5kcyksCisgICAgICAgIE5vZGUtPk9wZXJhbmRMaXN0KTsKKyAgICBOb2RlLT5OdW1PcGVyYW5kcyA9IDA7CisgICAgTm9kZS0+T3BlcmFuZExpc3QgPSBudWxscHRyOworICB9CisgIHZvaWQgQ3JlYXRlVG9wb2xvZ2ljYWxPcmRlcihzdGQ6OnZlY3RvcjxTRE5vZGUqPiYgT3JkZXIpOworcHVibGljOgorICBleHBsaWNpdCBTZWxlY3Rpb25EQUcoY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0sIENvZGVHZW5PcHQ6OkxldmVsKTsKKyAgU2VsZWN0aW9uREFHKGNvbnN0IFNlbGVjdGlvbkRBRyAmKSA9IGRlbGV0ZTsKKyAgU2VsZWN0aW9uREFHICZvcGVyYXRvcj0oY29uc3QgU2VsZWN0aW9uREFHICYpID0gZGVsZXRlOworICB+U2VsZWN0aW9uREFHKCk7CisKKyAgLy8vIFByZXBhcmUgdGhpcyBTZWxlY3Rpb25EQUcgdG8gcHJvY2VzcyBjb2RlIGluIHRoZSBnaXZlbiBNYWNoaW5lRnVuY3Rpb24uCisgIHZvaWQgaW5pdChNYWNoaW5lRnVuY3Rpb24gJk5ld01GLCBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICZOZXdPUkUsCisgICAgICAgICAgICBQYXNzICpQYXNzUHRyLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqTGlicmFyeUluZm8sCisgICAgICAgICAgICBEaXZlcmdlbmNlQW5hbHlzaXMgKiBEQSk7CisKKyAgdm9pZCBzZXRGdW5jdGlvbkxvd2VyaW5nSW5mbyhGdW5jdGlvbkxvd2VyaW5nSW5mbyAqIEZ1bmNJbmZvKSB7CisgICAgRkxJID0gRnVuY0luZm87CisgIH0KKworICAvLy8gQ2xlYXIgc3RhdGUgYW5kIGZyZWUgbWVtb3J5IG5lY2Vzc2FyeSB0byBtYWtlIHRoaXMKKyAgLy8vIFNlbGVjdGlvbkRBRyByZWFkeSB0byBwcm9jZXNzIGEgbmV3IGJsb2NrLgorICB2b2lkIGNsZWFyKCk7CisKKyAgTWFjaGluZUZ1bmN0aW9uICZnZXRNYWNoaW5lRnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiAqTUY7IH0KKyAgY29uc3QgUGFzcyAqZ2V0UGFzcygpIGNvbnN0IHsgcmV0dXJuIFNEQUdJU2VsUGFzczsgfQorCisgIGNvbnN0IERhdGFMYXlvdXQgJmdldERhdGFMYXlvdXQoKSBjb25zdCB7IHJldHVybiBNRi0+Z2V0RGF0YUxheW91dCgpOyB9CisgIGNvbnN0IFRhcmdldE1hY2hpbmUgJmdldFRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIFRNOyB9CisgIGNvbnN0IFRhcmdldFN1YnRhcmdldEluZm8gJmdldFN1YnRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIE1GLT5nZXRTdWJ0YXJnZXQoKTsgfQorICBjb25zdCBUYXJnZXRMb3dlcmluZyAmZ2V0VGFyZ2V0TG93ZXJpbmdJbmZvKCkgY29uc3QgeyByZXR1cm4gKlRMSTsgfQorICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAmZ2V0TGliSW5mbygpIGNvbnN0IHsgcmV0dXJuICpMaWJJbmZvOyB9CisgIGNvbnN0IFNlbGVjdGlvbkRBR1RhcmdldEluZm8gJmdldFNlbGVjdGlvbkRBR0luZm8oKSBjb25zdCB7IHJldHVybiAqVFNJOyB9CisgIExMVk1Db250ZXh0ICpnZXRDb250ZXh0KCkgY29uc3Qge3JldHVybiBDb250ZXh0OyB9CisgIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgJmdldE9SRSgpIGNvbnN0IHsgcmV0dXJuICpPUkU7IH0KKworICAvLy8gUG9wIHVwIGEgR3JhcGhWaXovZ3Ygd2luZG93IHdpdGggdGhlIERBRyByZW5kZXJlZCB1c2luZyAnZG90Jy4KKyAgdm9pZCB2aWV3R3JhcGgoY29uc3Qgc3RkOjpzdHJpbmcgJlRpdGxlKTsKKyAgdm9pZCB2aWV3R3JhcGgoKTsKKworI2lmbmRlZiBOREVCVUcKKyAgc3RkOjptYXA8Y29uc3QgU0ROb2RlICosIHN0ZDo6c3RyaW5nPiBOb2RlR3JhcGhBdHRyczsKKyNlbmRpZgorCisgIC8vLyBDbGVhciBhbGwgcHJldmlvdXNseSBkZWZpbmVkIG5vZGUgZ3JhcGggYXR0cmlidXRlcy4KKyAgLy8vIEludGVuZGVkIHRvIGJlIHVzZWQgZnJvbSBhIGRlYnVnZ2luZyB0b29sIChlZy4gZ2RiKS4KKyAgdm9pZCBjbGVhckdyYXBoQXR0cnMoKTsKKworICAvLy8gU2V0IGdyYXBoIGF0dHJpYnV0ZXMgZm9yIGEgbm9kZS4gKGVnLiAiY29sb3I9cmVkIi4pCisgIHZvaWQgc2V0R3JhcGhBdHRycyhjb25zdCBTRE5vZGUgKk4sIGNvbnN0IGNoYXIgKkF0dHJzKTsKKworICAvLy8gR2V0IGdyYXBoIGF0dHJpYnV0ZXMgZm9yIGEgbm9kZS4gKGVnLiAiY29sb3I9cmVkIi4pCisgIC8vLyBVc2VkIGZyb20gZ2V0Tm9kZUF0dHJpYnV0ZXMuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGdldEdyYXBoQXR0cnMoY29uc3QgU0ROb2RlICpOKSBjb25zdDsKKworICAvLy8gQ29udmVuaWVuY2UgZm9yIHNldHRpbmcgbm9kZSBjb2xvciBhdHRyaWJ1dGUuCisgIHZvaWQgc2V0R3JhcGhDb2xvcihjb25zdCBTRE5vZGUgKk4sIGNvbnN0IGNoYXIgKkNvbG9yKTsKKworICAvLy8gQ29udmVuaWVuY2UgZm9yIHNldHRpbmcgc3ViZ3JhcGggY29sb3IgYXR0cmlidXRlLgorICB2b2lkIHNldFN1YmdyYXBoQ29sb3IoU0ROb2RlICpOLCBjb25zdCBjaGFyICpDb2xvcik7CisKKyAgdXNpbmcgYWxsbm9kZXNfY29uc3RfaXRlcmF0b3IgPSBpbGlzdDxTRE5vZGU+Ojpjb25zdF9pdGVyYXRvcjsKKworICBhbGxub2Rlc19jb25zdF9pdGVyYXRvciBhbGxub2Rlc19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIEFsbE5vZGVzLmJlZ2luKCk7IH0KKyAgYWxsbm9kZXNfY29uc3RfaXRlcmF0b3IgYWxsbm9kZXNfZW5kKCkgY29uc3QgeyByZXR1cm4gQWxsTm9kZXMuZW5kKCk7IH0KKworICB1c2luZyBhbGxub2Rlc19pdGVyYXRvciA9IGlsaXN0PFNETm9kZT46Oml0ZXJhdG9yOworCisgIGFsbG5vZGVzX2l0ZXJhdG9yIGFsbG5vZGVzX2JlZ2luKCkgeyByZXR1cm4gQWxsTm9kZXMuYmVnaW4oKTsgfQorICBhbGxub2Rlc19pdGVyYXRvciBhbGxub2Rlc19lbmQoKSB7IHJldHVybiBBbGxOb2Rlcy5lbmQoKTsgfQorCisgIGlsaXN0PFNETm9kZT46OnNpemVfdHlwZSBhbGxub2Rlc19zaXplKCkgY29uc3QgeworICAgIHJldHVybiBBbGxOb2Rlcy5zaXplKCk7CisgIH0KKworICBpdGVyYXRvcl9yYW5nZTxhbGxub2Rlc19pdGVyYXRvcj4gYWxsbm9kZXMoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoYWxsbm9kZXNfYmVnaW4oKSwgYWxsbm9kZXNfZW5kKCkpOworICB9CisgIGl0ZXJhdG9yX3JhbmdlPGFsbG5vZGVzX2NvbnN0X2l0ZXJhdG9yPiBhbGxub2RlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShhbGxub2Rlc19iZWdpbigpLCBhbGxub2Rlc19lbmQoKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSByb290IHRhZyBvZiB0aGUgU2VsZWN0aW9uREFHLgorICBjb25zdCBTRFZhbHVlICZnZXRSb290KCkgY29uc3QgeyByZXR1cm4gUm9vdDsgfQorCisgIC8vLyBSZXR1cm4gdGhlIHRva2VuIGNoYWluIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVudHJ5IG9mIHRoZSBmdW5jdGlvbi4KKyAgU0RWYWx1ZSBnZXRFbnRyeU5vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIFNEVmFsdWUoY29uc3RfY2FzdDxTRE5vZGUgKj4oJkVudHJ5Tm9kZSksIDApOworICB9CisKKyAgLy8vIFNldCB0aGUgY3VycmVudCByb290IHRhZyBvZiB0aGUgU2VsZWN0aW9uREFHLgorICAvLy8KKyAgY29uc3QgU0RWYWx1ZSAmc2V0Um9vdChTRFZhbHVlIE4pIHsKKyAgICBhc3NlcnQoKCFOLmdldE5vZGUoKSB8fCBOLmdldFZhbHVlVHlwZSgpID09IE1WVDo6T3RoZXIpICYmCisgICAgICAgICAgICJEQUcgcm9vdCB2YWx1ZSBpcyBub3QgYSBjaGFpbiEiKTsKKyAgICBpZiAoTi5nZXROb2RlKCkpCisgICAgICBjaGVja0ZvckN5Y2xlcyhOLmdldE5vZGUoKSwgdGhpcyk7CisgICAgUm9vdCA9IE47CisgICAgaWYgKE4uZ2V0Tm9kZSgpKQorICAgICAgY2hlY2tGb3JDeWNsZXModGhpcyk7CisgICAgcmV0dXJuIFJvb3Q7CisgIH0KKworICB2b2lkIFZlcmlmeURBR0RpdmVyZW5jZSgpOworCisgIC8vLyBUaGlzIGl0ZXJhdGVzIG92ZXIgdGhlIG5vZGVzIGluIHRoZSBTZWxlY3Rpb25EQUcsIGZvbGRpbmcKKyAgLy8vIGNlcnRhaW4gdHlwZXMgb2Ygbm9kZXMgdG9nZXRoZXIsIG9yIGVsaW1pbmF0aW5nIHN1cGVyZmx1b3VzIG5vZGVzLiAgVGhlCisgIC8vLyBMZXZlbCBhcmd1bWVudCBjb250cm9scyB3aGV0aGVyIENvbWJpbmUgaXMgYWxsb3dlZCB0byBwcm9kdWNlIG5vZGVzIGFuZAorICAvLy8gdHlwZXMgdGhhdCBhcmUgaWxsZWdhbCBvbiB0aGUgdGFyZ2V0LgorICB2b2lkIENvbWJpbmUoQ29tYmluZUxldmVsIExldmVsLCBBbGlhc0FuYWx5c2lzICpBQSwKKyAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKKworICAvLy8gVGhpcyB0cmFuc2Zvcm1zIHRoZSBTZWxlY3Rpb25EQUcgaW50byBhIFNlbGVjdGlvbkRBRyB0aGF0CisgIC8vLyBvbmx5IHVzZXMgdHlwZXMgbmF0aXZlbHkgc3VwcG9ydGVkIGJ5IHRoZSB0YXJnZXQuCisgIC8vLyBSZXR1cm5zICJ0cnVlIiBpZiBpdCBtYWRlIGFueSBjaGFuZ2VzLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGlzIGFuIGludm9sdmVkIHByb2Nlc3MgdGhhdCBtYXkgaW52YWxpZGF0ZSBwb2ludGVycyBpbnRvCisgIC8vLyB0aGUgZ3JhcGguCisgIGJvb2wgTGVnYWxpemVUeXBlcygpOworCisgIC8vLyBUaGlzIHRyYW5zZm9ybXMgdGhlIFNlbGVjdGlvbkRBRyBpbnRvIGEgU2VsZWN0aW9uREFHIHRoYXQgaXMKKyAgLy8vIGNvbXBhdGlibGUgd2l0aCB0aGUgdGFyZ2V0IGluc3RydWN0aW9uIHNlbGVjdG9yLCBhcyBpbmRpY2F0ZWQgYnkgdGhlCisgIC8vLyBUYXJnZXRMb3dlcmluZyBvYmplY3QuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgaXMgYW4gaW52b2x2ZWQgcHJvY2VzcyB0aGF0IG1heSBpbnZhbGlkYXRlIHBvaW50ZXJzIGludG8KKyAgLy8vIHRoZSBncmFwaC4KKyAgdm9pZCBMZWdhbGl6ZSgpOworCisgIC8vLyBcYnJpZWYgVHJhbnNmb3JtcyBhIFNlbGVjdGlvbkRBRyBub2RlIGFuZCBhbnkgb3BlcmFuZHMgdG8gaXQgaW50byBhIG5vZGUKKyAgLy8vIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IsIGFzIGluZGljYXRlZCBieQorICAvLy8gdGhlIFRhcmdldExvd2VyaW5nIG9iamVjdC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIFxjIE4gaXMgYSB2YWxpZCwgbGVnYWwgbm9kZSBhZnRlciBjYWxsaW5nIHRoaXMuCisgIC8vLworICAvLy8gVGhpcyBlc3NlbnRpYWxseSBydW5zIGEgc2luZ2xlIHJlY3Vyc2l2ZSB3YWxrIG9mIHRoZSBcYyBMZWdhbGl6ZSBwcm9jZXNzCisgIC8vLyBvdmVyIHRoZSBnaXZlbiBub2RlIChhbmQgaXRzIG9wZXJhbmRzKS4gVGhpcyBjYW4gYmUgdXNlZCB0byBpbmNyZW1lbnRhbGx5CisgIC8vLyBsZWdhbGl6ZSB0aGUgREFHLiBBbGwgb2YgdGhlIG5vZGVzIHdoaWNoIGFyZSBkaXJlY3RseSByZXBsYWNlZCwKKyAgLy8vIHBvdGVudGlhbGx5IGluY2x1ZGluZyBOLCBhcmUgYWRkZWQgdG8gdGhlIG91dHB1dCBwYXJhbWV0ZXIgXGMKKyAgLy8vIFVwZGF0ZWROb2RlcyBzbyB0aGF0IHRoZSBkZWx0YSB0byB0aGUgREFHIGNhbiBiZSB1bmRlcnN0b29kIGJ5IHRoZQorICAvLy8gY2FsbGVyLgorICAvLy8KKyAgLy8vIFdoZW4gdGhpcyByZXR1cm5zIGZhbHNlLCBOIGhhcyBiZWVuIGxlZ2FsaXplZCBpbiBhIHdheSB0aGF0IG1ha2UgdGhlCisgIC8vLyBwb2ludGVyIHBhc3NlZCBpbiBubyBsb25nZXIgdmFsaWQuIEl0IG1heSBoYXZlIGV2ZW4gYmVlbiBkZWxldGVkIGZyb20gdGhlCisgIC8vLyBEQUcsIGFuZCBzbyBpdCBzaG91bGRuJ3QgYmUgdXNlZCBmdXJ0aGVyLiBXaGVuIHRoaXMgcmV0dXJucyB0cnVlLCB0aGUKKyAgLy8vIE4gcGFzc2VkIGluIGlzIGEgbGVnYWwgbm9kZSwgYW5kIGNhbiBiZSBpbW1lZGlhdGVseSBwcm9jZXNzZWQgYXMgc3VjaC4KKyAgLy8vIFRoaXMgbWF5IHN0aWxsIGhhdmUgZG9uZSBzb21lIHdvcmsgb24gdGhlIERBRywgYW5kIHdpbGwgc3RpbGwgcG9wdWxhdGUKKyAgLy8vIFVwZGF0ZWROb2RlcyB3aXRoIGFueSBuZXcgbm9kZXMgcmVwbGFjaW5nIHRob3NlIG9yaWdpbmFsbHkgaW4gdGhlIERBRy4KKyAgYm9vbCBMZWdhbGl6ZU9wKFNETm9kZSAqTiwgU21hbGxTZXRWZWN0b3I8U0ROb2RlICosIDE2PiAmVXBkYXRlZE5vZGVzKTsKKworICAvLy8gVGhpcyB0cmFuc2Zvcm1zIHRoZSBTZWxlY3Rpb25EQUcgaW50byBhIFNlbGVjdGlvbkRBRworICAvLy8gdGhhdCBvbmx5IHVzZXMgdmVjdG9yIG1hdGggb3BlcmF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIHRhcmdldC4gIFRoaXMgaXMKKyAgLy8vIG5lY2Vzc2FyeSBhcyBhIHNlcGFyYXRlIHN0ZXAgZnJvbSBMZWdhbGl6ZSBiZWNhdXNlIHVucm9sbGluZyBhIHZlY3RvcgorICAvLy8gb3BlcmF0aW9uIGNhbiBpbnRyb2R1Y2UgaWxsZWdhbCB0eXBlcywgd2hpY2ggcmVxdWlyZXMgcnVubmluZworICAvLy8gTGVnYWxpemVUeXBlcyBhZ2Fpbi4KKyAgLy8vCisgIC8vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiBpdCBtYWRlIGFueSBjaGFuZ2VzOyBpbiB0aGF0IGNhc2UsIExlZ2FsaXplVHlwZXMKKyAgLy8vIGlzIGNhbGxlZCBhZ2FpbiBiZWZvcmUgTGVnYWxpemUuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgaXMgYW4gaW52b2x2ZWQgcHJvY2VzcyB0aGF0IG1heSBpbnZhbGlkYXRlIHBvaW50ZXJzIGludG8KKyAgLy8vIHRoZSBncmFwaC4KKyAgYm9vbCBMZWdhbGl6ZVZlY3RvcnMoKTsKKworICAvLy8gVGhpcyBtZXRob2QgZGVsZXRlcyBhbGwgdW5yZWFjaGFibGUgbm9kZXMgaW4gdGhlIFNlbGVjdGlvbkRBRy4KKyAgdm9pZCBSZW1vdmVEZWFkTm9kZXMoKTsKKworICAvLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbm9kZSBmcm9tIHRoZSBzeXN0ZW0uICBUaGlzIG5vZGUgbXVzdAorICAvLy8gaGF2ZSBubyByZWZlcnJlcnMuCisgIHZvaWQgRGVsZXRlTm9kZShTRE5vZGUgKk4pOworCisgIC8vLyBSZXR1cm4gYW4gU0RWVExpc3QgdGhhdCByZXByZXNlbnRzIHRoZSBsaXN0IG9mIHZhbHVlcyBzcGVjaWZpZWQuCisgIFNEVlRMaXN0IGdldFZUTGlzdChFVlQgVlQpOworICBTRFZUTGlzdCBnZXRWVExpc3QoRVZUIFZUMSwgRVZUIFZUMik7CisgIFNEVlRMaXN0IGdldFZUTGlzdChFVlQgVlQxLCBFVlQgVlQyLCBFVlQgVlQzKTsKKyAgU0RWVExpc3QgZ2V0VlRMaXN0KEVWVCBWVDEsIEVWVCBWVDIsIEVWVCBWVDMsIEVWVCBWVDQpOworICBTRFZUTGlzdCBnZXRWVExpc3QoQXJyYXlSZWY8RVZUPiBWVHMpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBOb2RlIGNyZWF0aW9uIG1ldGhvZHMuCisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBDb25zdGFudFNETm9kZSB3cmFwcGluZyBhIGNvbnN0YW50IHZhbHVlLgorICAvLy8gSWYgVlQgaXMgYSB2ZWN0b3IgdHlwZSwgdGhlIGNvbnN0YW50IGlzIHNwbGF0dGVkIGludG8gYSBCVUlMRF9WRUNUT1IuCisgIC8vLworICAvLy8gSWYgb25seSBsZWdhbCB0eXBlcyBjYW4gYmUgcHJvZHVjZWQsIHRoaXMgZG9lcyB0aGUgbmVjZXNzYXJ5CisgIC8vLyB0cmFuc2Zvcm1hdGlvbnMgKGUuZy4sIGlmIHRoZSB2ZWN0b3IgZWxlbWVudCB0eXBlIGlzIGlsbGVnYWwpLgorICAvLy8gQHsKKyAgU0RWYWx1ZSBnZXRDb25zdGFudCh1aW50NjRfdCBWYWwsIGNvbnN0IFNETG9jICZETCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNUYXJnZXQgPSBmYWxzZSwgYm9vbCBpc09wYXF1ZSA9IGZhbHNlKTsKKyAgU0RWYWx1ZSBnZXRDb25zdGFudChjb25zdCBBUEludCAmVmFsLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVGFyZ2V0ID0gZmFsc2UsIGJvb2wgaXNPcGFxdWUgPSBmYWxzZSk7CisKKyAgU0RWYWx1ZSBnZXRBbGxPbmVzQ29uc3RhbnQoY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsIGJvb2wgSXNUYXJnZXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc09wYXF1ZSA9IGZhbHNlKSB7CisgICAgcmV0dXJuIGdldENvbnN0YW50KEFQSW50OjpnZXRBbGxPbmVzVmFsdWUoVlQuZ2V0U2NhbGFyU2l6ZUluQml0cygpKSwgREwsCisgICAgICAgICAgICAgICAgICAgICAgIFZULCBJc1RhcmdldCwgSXNPcGFxdWUpOworICB9CisKKyAgU0RWYWx1ZSBnZXRDb25zdGFudChjb25zdCBDb25zdGFudEludCAmVmFsLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVGFyZ2V0ID0gZmFsc2UsIGJvb2wgaXNPcGFxdWUgPSBmYWxzZSk7CisgIFNEVmFsdWUgZ2V0SW50UHRyQ29uc3RhbnQodWludDY0X3QgVmFsLCBjb25zdCBTRExvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1RhcmdldCA9IGZhbHNlKTsKKyAgU0RWYWx1ZSBnZXRUYXJnZXRDb25zdGFudCh1aW50NjRfdCBWYWwsIGNvbnN0IFNETG9jICZETCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPcGFxdWUgPSBmYWxzZSkgeworICAgIHJldHVybiBnZXRDb25zdGFudChWYWwsIERMLCBWVCwgdHJ1ZSwgaXNPcGFxdWUpOworICB9CisgIFNEVmFsdWUgZ2V0VGFyZ2V0Q29uc3RhbnQoY29uc3QgQVBJbnQgJlZhbCwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc09wYXF1ZSA9IGZhbHNlKSB7CisgICAgcmV0dXJuIGdldENvbnN0YW50KFZhbCwgREwsIFZULCB0cnVlLCBpc09wYXF1ZSk7CisgIH0KKyAgU0RWYWx1ZSBnZXRUYXJnZXRDb25zdGFudChjb25zdCBDb25zdGFudEludCAmVmFsLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3BhcXVlID0gZmFsc2UpIHsKKyAgICByZXR1cm4gZ2V0Q29uc3RhbnQoVmFsLCBETCwgVlQsIHRydWUsIGlzT3BhcXVlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgdHJ1ZSBvciBmYWxzZSBjb25zdGFudCBvZiB0eXBlIFxwIFZUIHVzaW5nIHRoZSB0YXJnZXQncworICAvLy8gQm9vbGVhbkNvbnRlbnQgZm9yIHR5cGUgXHAgT3BWVC4KKyAgU0RWYWx1ZSBnZXRCb29sQ29uc3RhbnQoYm9vbCBWLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwgRVZUIE9wVlQpOworICAvLy8gQH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIENvbnN0YW50RlBTRE5vZGUgd3JhcHBpbmcgYSBjb25zdGFudCB2YWx1ZS4KKyAgLy8vIElmIFZUIGlzIGEgdmVjdG9yIHR5cGUsIHRoZSBjb25zdGFudCBpcyBzcGxhdHRlZCBpbnRvIGEgQlVJTERfVkVDVE9SLgorICAvLy8KKyAgLy8vIElmIG9ubHkgbGVnYWwgdHlwZXMgY2FuIGJlIHByb2R1Y2VkLCB0aGlzIGRvZXMgdGhlIG5lY2Vzc2FyeQorICAvLy8gdHJhbnNmb3JtYXRpb25zIChlLmcuLCBpZiB0aGUgdmVjdG9yIGVsZW1lbnQgdHlwZSBpcyBpbGxlZ2FsKS4KKyAgLy8vIFRoZSBmb3JtcyB0aGF0IHRha2UgYSBkb3VibGUgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3Igc2ltcGxlIGNvbnN0YW50cworICAvLy8gdGhhdCBjYW4gYmUgZXhhY3RseSByZXByZXNlbnRlZCBpbiBWVC4gIE5vIGNoZWNrcyBhcmUgbWFkZS4KKyAgLy8vIEB7CisgIFNEVmFsdWUgZ2V0Q29uc3RhbnRGUChkb3VibGUgVmFsLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNUYXJnZXQgPSBmYWxzZSk7CisgIFNEVmFsdWUgZ2V0Q29uc3RhbnRGUChjb25zdCBBUEZsb2F0ICZWYWwsIGNvbnN0IFNETG9jICZETCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1RhcmdldCA9IGZhbHNlKTsKKyAgU0RWYWx1ZSBnZXRDb25zdGFudEZQKGNvbnN0IENvbnN0YW50RlAgJkNGLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNUYXJnZXQgPSBmYWxzZSk7CisgIFNEVmFsdWUgZ2V0VGFyZ2V0Q29uc3RhbnRGUChkb3VibGUgVmFsLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCkgeworICAgIHJldHVybiBnZXRDb25zdGFudEZQKFZhbCwgREwsIFZULCB0cnVlKTsKKyAgfQorICBTRFZhbHVlIGdldFRhcmdldENvbnN0YW50RlAoY29uc3QgQVBGbG9hdCAmVmFsLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCkgeworICAgIHJldHVybiBnZXRDb25zdGFudEZQKFZhbCwgREwsIFZULCB0cnVlKTsKKyAgfQorICBTRFZhbHVlIGdldFRhcmdldENvbnN0YW50RlAoY29uc3QgQ29uc3RhbnRGUCAmVmFsLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCkgeworICAgIHJldHVybiBnZXRDb25zdGFudEZQKFZhbCwgREwsIFZULCB0cnVlKTsKKyAgfQorICAvLy8gQH0KKworICBTRFZhbHVlIGdldEdsb2JhbEFkZHJlc3MoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0ID0gMCwgYm9vbCBpc1RhcmdldEdBID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCk7CisgIFNEVmFsdWUgZ2V0VGFyZ2V0R2xvYmFsQWRkcmVzcyhjb25zdCBHbG9iYWxWYWx1ZSAqR1YsIGNvbnN0IFNETG9jICZETCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApIHsKKyAgICByZXR1cm4gZ2V0R2xvYmFsQWRkcmVzcyhHViwgREwsIFZULCBvZmZzZXQsIHRydWUsIFRhcmdldEZsYWdzKTsKKyAgfQorICBTRFZhbHVlIGdldEZyYW1lSW5kZXgoaW50IEZJLCBFVlQgVlQsIGJvb2wgaXNUYXJnZXQgPSBmYWxzZSk7CisgIFNEVmFsdWUgZ2V0VGFyZ2V0RnJhbWVJbmRleChpbnQgRkksIEVWVCBWVCkgeworICAgIHJldHVybiBnZXRGcmFtZUluZGV4KEZJLCBWVCwgdHJ1ZSk7CisgIH0KKyAgU0RWYWx1ZSBnZXRKdW1wVGFibGUoaW50IEpUSSwgRVZUIFZULCBib29sIGlzVGFyZ2V0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKTsKKyAgU0RWYWx1ZSBnZXRUYXJnZXRKdW1wVGFibGUoaW50IEpUSSwgRVZUIFZULCB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgeworICAgIHJldHVybiBnZXRKdW1wVGFibGUoSlRJLCBWVCwgdHJ1ZSwgVGFyZ2V0RmxhZ3MpOworICB9CisgIFNEVmFsdWUgZ2V0Q29uc3RhbnRQb29sKGNvbnN0IENvbnN0YW50ICpDLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduID0gMCwgaW50IE9mZnMgPSAwLCBib29sIGlzVD1mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApOworICBTRFZhbHVlIGdldFRhcmdldENvbnN0YW50UG9vbChjb25zdCBDb25zdGFudCAqQywgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiA9IDAsIGludCBPZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgeworICAgIHJldHVybiBnZXRDb25zdGFudFBvb2woQywgVlQsIEFsaWduLCBPZmZzZXQsIHRydWUsIFRhcmdldEZsYWdzKTsKKyAgfQorICBTRFZhbHVlIGdldENvbnN0YW50UG9vbChNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWUgKkMsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ24gPSAwLCBpbnQgT2ZmcyA9IDAsIGJvb2wgaXNUPWZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCk7CisgIFNEVmFsdWUgZ2V0VGFyZ2V0Q29uc3RhbnRQb29sKE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQsIHVuc2lnbmVkIEFsaWduID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgT2Zmc2V0ID0gMCwgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncz0wKSB7CisgICAgcmV0dXJuIGdldENvbnN0YW50UG9vbChDLCBWVCwgQWxpZ24sIE9mZnNldCwgdHJ1ZSwgVGFyZ2V0RmxhZ3MpOworICB9CisgIFNEVmFsdWUgZ2V0VGFyZ2V0SW5kZXgoaW50IEluZGV4LCBFVlQgVlQsIGludDY0X3QgT2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCk7CisgIC8vIFdoZW4gZ2VuZXJhdGluZyBhIGJyYW5jaCB0byBhIEJCLCB3ZSBkb24ndCBpbiBnZW5lcmFsIGtub3cgZW5vdWdoCisgIC8vIHRvIHByb3ZpZGUgZGVidWcgaW5mbyBmb3IgdGhlIEJCIGF0IHRoYXQgdGltZSwgc28ga2VlcCB0aGlzIG9uZSBhcm91bmQuCisgIFNEVmFsdWUgZ2V0QmFzaWNCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqTUJCKTsKKyAgU0RWYWx1ZSBnZXRCYXNpY0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsIFNETG9jIGRsKTsKKyAgU0RWYWx1ZSBnZXRFeHRlcm5hbFN5bWJvbChjb25zdCBjaGFyICpTeW0sIEVWVCBWVCk7CisgIFNEVmFsdWUgZ2V0RXh0ZXJuYWxTeW1ib2woY29uc3QgY2hhciAqU3ltLCBjb25zdCBTRExvYyAmZGwsIEVWVCBWVCk7CisgIFNEVmFsdWUgZ2V0VGFyZ2V0RXh0ZXJuYWxTeW1ib2woY29uc3QgY2hhciAqU3ltLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApOworICBTRFZhbHVlIGdldE1DU3ltYm9sKE1DU3ltYm9sICpTeW0sIEVWVCBWVCk7CisKKyAgU0RWYWx1ZSBnZXRWYWx1ZVR5cGUoRVZUKTsKKyAgU0RWYWx1ZSBnZXRSZWdpc3Rlcih1bnNpZ25lZCBSZWcsIEVWVCBWVCk7CisgIFNEVmFsdWUgZ2V0UmVnaXN0ZXJNYXNrKGNvbnN0IHVpbnQzMl90ICpSZWdNYXNrKTsKKyAgU0RWYWx1ZSBnZXRFSExhYmVsKGNvbnN0IFNETG9jICZkbCwgU0RWYWx1ZSBSb290LCBNQ1N5bWJvbCAqTGFiZWwpOworICBTRFZhbHVlIGdldExhYmVsTm9kZSh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZkbCwgU0RWYWx1ZSBSb290LAorICAgICAgICAgICAgICAgICAgICAgICBNQ1N5bWJvbCAqTGFiZWwpOworICBTRFZhbHVlIGdldEJsb2NrQWRkcmVzcyhjb25zdCBCbG9ja0FkZHJlc3MgKkJBLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgT2Zmc2V0ID0gMCwgYm9vbCBpc1RhcmdldCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCk7CisgIFNEVmFsdWUgZ2V0VGFyZ2V0QmxvY2tBZGRyZXNzKGNvbnN0IEJsb2NrQWRkcmVzcyAqQkEsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBPZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgeworICAgIHJldHVybiBnZXRCbG9ja0FkZHJlc3MoQkEsIFZULCBPZmZzZXQsIHRydWUsIFRhcmdldEZsYWdzKTsKKyAgfQorCisgIFNEVmFsdWUgZ2V0Q29weVRvUmVnKFNEVmFsdWUgQ2hhaW4sIGNvbnN0IFNETG9jICZkbCwgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE4pIHsKKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OkNvcHlUb1JlZywgZGwsIE1WVDo6T3RoZXIsIENoYWluLAorICAgICAgICAgICAgICAgICAgIGdldFJlZ2lzdGVyKFJlZywgTi5nZXRWYWx1ZVR5cGUoKSksIE4pOworICB9CisKKyAgLy8gVGhpcyB2ZXJzaW9uIG9mIHRoZSBnZXRDb3B5VG9SZWcgbWV0aG9kIHRha2VzIGFuIGV4dHJhIG9wZXJhbmQsIHdoaWNoCisgIC8vIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIHBvdGVudGlhbGx5IGFuIGluY29taW5nIGdsdWUgdmFsdWUgKGlmIEdsdWUgaXMgbm90CisgIC8vIG51bGwpIGFuZCB0aGF0IHRoZXJlIHNob3VsZCBiZSBhIGdsdWUgcmVzdWx0LgorICBTRFZhbHVlIGdldENvcHlUb1JlZyhTRFZhbHVlIENoYWluLCBjb25zdCBTRExvYyAmZGwsIHVuc2lnbmVkIFJlZywgU0RWYWx1ZSBOLAorICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIEdsdWUpIHsKKyAgICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoTVZUOjpPdGhlciwgTVZUOjpHbHVlKTsKKyAgICBTRFZhbHVlIE9wc1tdID0geyBDaGFpbiwgZ2V0UmVnaXN0ZXIoUmVnLCBOLmdldFZhbHVlVHlwZSgpKSwgTiwgR2x1ZSB9OworICAgIHJldHVybiBnZXROb2RlKElTRDo6Q29weVRvUmVnLCBkbCwgVlRzLAorICAgICAgICAgICAgICAgICAgIG1ha2VBcnJheVJlZihPcHMsIEdsdWUuZ2V0Tm9kZSgpID8gNCA6IDMpKTsKKyAgfQorCisgIC8vIFNpbWlsYXIgdG8gbGFzdCBnZXRDb3B5VG9SZWcoKSBleGNlcHQgcGFyYW1ldGVyIFJlZyBpcyBhIFNEVmFsdWUKKyAgU0RWYWx1ZSBnZXRDb3B5VG9SZWcoU0RWYWx1ZSBDaGFpbiwgY29uc3QgU0RMb2MgJmRsLCBTRFZhbHVlIFJlZywgU0RWYWx1ZSBOLAorICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIEdsdWUpIHsKKyAgICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoTVZUOjpPdGhlciwgTVZUOjpHbHVlKTsKKyAgICBTRFZhbHVlIE9wc1tdID0geyBDaGFpbiwgUmVnLCBOLCBHbHVlIH07CisgICAgcmV0dXJuIGdldE5vZGUoSVNEOjpDb3B5VG9SZWcsIGRsLCBWVHMsCisgICAgICAgICAgICAgICAgICAgbWFrZUFycmF5UmVmKE9wcywgR2x1ZS5nZXROb2RlKCkgPyA0IDogMykpOworICB9CisKKyAgU0RWYWx1ZSBnZXRDb3B5RnJvbVJlZyhTRFZhbHVlIENoYWluLCBjb25zdCBTRExvYyAmZGwsIHVuc2lnbmVkIFJlZywgRVZUIFZUKSB7CisgICAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KFZULCBNVlQ6Ok90aGVyKTsKKyAgICBTRFZhbHVlIE9wc1tdID0geyBDaGFpbiwgZ2V0UmVnaXN0ZXIoUmVnLCBWVCkgfTsKKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OkNvcHlGcm9tUmVnLCBkbCwgVlRzLCBPcHMpOworICB9CisKKyAgLy8gVGhpcyB2ZXJzaW9uIG9mIHRoZSBnZXRDb3B5RnJvbVJlZyBtZXRob2QgdGFrZXMgYW4gZXh0cmEgb3BlcmFuZCwgd2hpY2gKKyAgLy8gaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgcG90ZW50aWFsbHkgYW4gaW5jb21pbmcgZ2x1ZSB2YWx1ZSAoaWYgR2x1ZSBpcyBub3QKKyAgLy8gbnVsbCkgYW5kIHRoYXQgdGhlcmUgc2hvdWxkIGJlIGEgZ2x1ZSByZXN1bHQuCisgIFNEVmFsdWUgZ2V0Q29weUZyb21SZWcoU0RWYWx1ZSBDaGFpbiwgY29uc3QgU0RMb2MgJmRsLCB1bnNpZ25lZCBSZWcsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIEdsdWUpIHsKKyAgICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoVlQsIE1WVDo6T3RoZXIsIE1WVDo6R2x1ZSk7CisgICAgU0RWYWx1ZSBPcHNbXSA9IHsgQ2hhaW4sIGdldFJlZ2lzdGVyKFJlZywgVlQpLCBHbHVlIH07CisgICAgcmV0dXJuIGdldE5vZGUoSVNEOjpDb3B5RnJvbVJlZywgZGwsIFZUcywKKyAgICAgICAgICAgICAgICAgICBtYWtlQXJyYXlSZWYoT3BzLCBHbHVlLmdldE5vZGUoKSA/IDMgOiAyKSk7CisgIH0KKworICBTRFZhbHVlIGdldENvbmRDb2RlKElTRDo6Q29uZENvZGUgQ29uZCk7CisKKyAgLy8vIFJldHVybiBhbiBJU0Q6OlZFQ1RPUl9TSFVGRkxFIG5vZGUuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gVlQsCisgIC8vLyB3aGljaCBtdXN0IGJlIGEgdmVjdG9yIHR5cGUsIG11c3QgbWF0Y2ggdGhlIG51bWJlciBvZiBtYXNrIGVsZW1lbnRzCisgIC8vLyBOdW1FbHRzLiBBbiBpbnRlZ2VyIG1hc2sgZWxlbWVudCBlcXVhbCB0byAtMSBpcyB0cmVhdGVkIGFzIHVuZGVmaW5lZC4KKyAgU0RWYWx1ZSBnZXRWZWN0b3JTaHVmZmxlKEVWVCBWVCwgY29uc3QgU0RMb2MgJmRsLCBTRFZhbHVlIE4xLCBTRFZhbHVlIE4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8aW50PiBNYXNrKTsKKworICAvLy8gUmV0dXJuIGFuIElTRDo6QlVJTERfVkVDVE9SIG5vZGUuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gVlQsCisgIC8vLyB3aGljaCBtdXN0IGJlIGEgdmVjdG9yIHR5cGUsIG11c3QgbWF0Y2ggdGhlIG51bWJlciBvZiBvcGVyYW5kcyBpbiBPcHMuCisgIC8vLyBUaGUgb3BlcmFuZHMgbXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgKG9yLCBmb3IgaW50ZWdlcnMsIGEgdHlwZSB3aWRlcgorICAvLy8gdGhhbikgVlQncyBlbGVtZW50IHR5cGUuCisgIFNEVmFsdWUgZ2V0QnVpbGRWZWN0b3IoRVZUIFZULCBjb25zdCBTRExvYyAmREwsIEFycmF5UmVmPFNEVmFsdWU+IE9wcykgeworICAgIC8vIFZlcmlmeVNETm9kZSAodmlhIEluc2VydE5vZGUpIGNoZWNrcyBCVUlMRF9WRUNUT1IgbGF0ZXIuCisgICAgcmV0dXJuIGdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIERMLCBWVCwgT3BzKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYW4gSVNEOjpCVUlMRF9WRUNUT1Igbm9kZS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBWVCwKKyAgLy8vIHdoaWNoIG11c3QgYmUgYSB2ZWN0b3IgdHlwZSwgbXVzdCBtYXRjaCB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIGluIE9wcy4KKyAgLy8vIFRoZSBvcGVyYW5kcyBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSBhcyAob3IsIGZvciBpbnRlZ2VycywgYSB0eXBlIHdpZGVyCisgIC8vLyB0aGFuKSBWVCdzIGVsZW1lbnQgdHlwZS4KKyAgU0RWYWx1ZSBnZXRCdWlsZFZlY3RvcihFVlQgVlQsIGNvbnN0IFNETG9jICZETCwgQXJyYXlSZWY8U0RVc2U+IE9wcykgeworICAgIC8vIFZlcmlmeVNETm9kZSAodmlhIEluc2VydE5vZGUpIGNoZWNrcyBCVUlMRF9WRUNUT1IgbGF0ZXIuCisgICAgcmV0dXJuIGdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIERMLCBWVCwgT3BzKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSBzcGxhdCBJU0Q6OkJVSUxEX1ZFQ1RPUiBub2RlLCBjb25zaXN0aW5nIG9mIE9wIHNwbGF0dGVkIHRvIGFsbAorICAvLy8gZWxlbWVudHMuIFZUIG11c3QgYmUgYSB2ZWN0b3IgdHlwZS4gT3AncyB0eXBlIG11c3QgYmUgdGhlIHNhbWUgYXMgKG9yLAorICAvLy8gZm9yIGludGVnZXJzLCBhIHR5cGUgd2lkZXIgdGhhbikgVlQncyBlbGVtZW50IHR5cGUuCisgIFNEVmFsdWUgZ2V0U3BsYXRCdWlsZFZlY3RvcihFVlQgVlQsIGNvbnN0IFNETG9jICZETCwgU0RWYWx1ZSBPcCkgeworICAgIC8vIFZlcmlmeVNETm9kZSAodmlhIEluc2VydE5vZGUpIGNoZWNrcyBCVUlMRF9WRUNUT1IgbGF0ZXIuCisgICAgaWYgKE9wLmdldE9wY29kZSgpID09IElTRDo6VU5ERUYpIHsKKyAgICAgIGFzc2VydCgoVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSA9PSBPcC5nZXRWYWx1ZVR5cGUoKSB8fAorICAgICAgICAgICAgICAoVlQuaXNJbnRlZ2VyKCkgJiYKKyAgICAgICAgICAgICAgIFZULmdldFZlY3RvckVsZW1lbnRUeXBlKCkuYml0c0xFKE9wLmdldFZhbHVlVHlwZSgpKSkpICYmCisgICAgICAgICAgICAgIkEgc3BsYXR0ZWQgdmFsdWUgbXVzdCBoYXZlIGEgd2lkdGggZXF1YWwgb3IgKGZvciBpbnRlZ2VycykgIgorICAgICAgICAgICAgICJncmVhdGVyIHRoYW4gdGhlIHZlY3RvciBlbGVtZW50IHR5cGUhIik7CisgICAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OlVOREVGLCBTRExvYygpLCBWVCk7CisgICAgfQorCisgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgMTY+IE9wcyhWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpLCBPcCk7CisgICAgcmV0dXJuIGdldE5vZGUoSVNEOjpCVUlMRF9WRUNUT1IsIERMLCBWVCwgT3BzKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhbiBJU0Q6OlZFQ1RPUl9TSFVGRkxFIG5vZGUgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8KKyAgLy8vIHRoZSBzaHVmZmxlIG5vZGUgaW4gaW5wdXQgYnV0IHdpdGggc3dhcHBlZCBvcGVyYW5kcy4KKyAgLy8vCisgIC8vLyBFeGFtcGxlOiBzaHVmZmxlIEEsIEIsIDwwLDUsMiw3PiAtPiBzaHVmZmxlIEIsIEEsIDw0LDEsNiwzPgorICBTRFZhbHVlIGdldENvbW11dGVkVmVjdG9yU2h1ZmZsZShjb25zdCBTaHVmZmxlVmVjdG9yU0ROb2RlICZTVik7CisKKyAgLy8vIENvbnZlcnQgT3AsIHdoaWNoIG11c3QgYmUgb2YgZmxvYXQgdHlwZSwgdG8gdGhlCisgIC8vLyBmbG9hdCB0eXBlIFZULCBieSBlaXRoZXIgZXh0ZW5kaW5nIG9yIHJvdW5kaW5nIChieSB0cnVuY2F0aW9uKS4KKyAgU0RWYWx1ZSBnZXRGUEV4dGVuZE9yUm91bmQoU0RWYWx1ZSBPcCwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQpOworCisgIC8vLyBDb252ZXJ0IE9wLCB3aGljaCBtdXN0IGJlIG9mIGludGVnZXIgdHlwZSwgdG8gdGhlCisgIC8vLyBpbnRlZ2VyIHR5cGUgVlQsIGJ5IGVpdGhlciBhbnktZXh0ZW5kaW5nIG9yIHRydW5jYXRpbmcgaXQuCisgIFNEVmFsdWUgZ2V0QW55RXh0T3JUcnVuYyhTRFZhbHVlIE9wLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCk7CisKKyAgLy8vIENvbnZlcnQgT3AsIHdoaWNoIG11c3QgYmUgb2YgaW50ZWdlciB0eXBlLCB0byB0aGUKKyAgLy8vIGludGVnZXIgdHlwZSBWVCwgYnkgZWl0aGVyIHNpZ24tZXh0ZW5kaW5nIG9yIHRydW5jYXRpbmcgaXQuCisgIFNEVmFsdWUgZ2V0U0V4dE9yVHJ1bmMoU0RWYWx1ZSBPcCwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQpOworCisgIC8vLyBDb252ZXJ0IE9wLCB3aGljaCBtdXN0IGJlIG9mIGludGVnZXIgdHlwZSwgdG8gdGhlCisgIC8vLyBpbnRlZ2VyIHR5cGUgVlQsIGJ5IGVpdGhlciB6ZXJvLWV4dGVuZGluZyBvciB0cnVuY2F0aW5nIGl0LgorICBTRFZhbHVlIGdldFpFeHRPclRydW5jKFNEVmFsdWUgT3AsIGNvbnN0IFNETG9jICZETCwgRVZUIFZUKTsKKworICAvLy8gUmV0dXJuIHRoZSBleHByZXNzaW9uIHJlcXVpcmVkIHRvIHplcm8gZXh0ZW5kIHRoZSBPcAorICAvLy8gdmFsdWUgYXNzdW1pbmcgaXQgd2FzIHRoZSBzbWFsbGVyIFNyY1R5IHZhbHVlLgorICBTRFZhbHVlIGdldFplcm9FeHRlbmRJblJlZyhTRFZhbHVlIE9wLCBjb25zdCBTRExvYyAmREwsIEVWVCBTcmNUeSk7CisKKyAgLy8vIFJldHVybiBhbiBvcGVyYXRpb24gd2hpY2ggd2lsbCBhbnktZXh0ZW5kIHRoZSBsb3cgbGFuZXMgb2YgdGhlIG9wZXJhbmQKKyAgLy8vIGludG8gdGhlIHNwZWNpZmllZCB2ZWN0b3IgdHlwZS4gRm9yIGV4YW1wbGUsCisgIC8vLyB0aGlzIGNhbiBjb252ZXJ0IGEgdjE2aTggaW50byBhIHY0aTMyIGJ5IGFueS1leHRlbmRpbmcgdGhlIGxvdyBmb3VyCisgIC8vLyBsYW5lcyBvZiB0aGUgb3BlcmFuZCBmcm9tIGk4IHRvIGkzMi4KKyAgU0RWYWx1ZSBnZXRBbnlFeHRlbmRWZWN0b3JJblJlZyhTRFZhbHVlIE9wLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCk7CisKKyAgLy8vIFJldHVybiBhbiBvcGVyYXRpb24gd2hpY2ggd2lsbCBzaWduIGV4dGVuZCB0aGUgbG93IGxhbmVzIG9mIHRoZSBvcGVyYW5kCisgIC8vLyBpbnRvIHRoZSBzcGVjaWZpZWQgdmVjdG9yIHR5cGUuIEZvciBleGFtcGxlLAorICAvLy8gdGhpcyBjYW4gY29udmVydCBhIHYxNmk4IGludG8gYSB2NGkzMiBieSBzaWduIGV4dGVuZGluZyB0aGUgbG93IGZvdXIKKyAgLy8vIGxhbmVzIG9mIHRoZSBvcGVyYW5kIGZyb20gaTggdG8gaTMyLgorICBTRFZhbHVlIGdldFNpZ25FeHRlbmRWZWN0b3JJblJlZyhTRFZhbHVlIE9wLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCk7CisKKyAgLy8vIFJldHVybiBhbiBvcGVyYXRpb24gd2hpY2ggd2lsbCB6ZXJvIGV4dGVuZCB0aGUgbG93IGxhbmVzIG9mIHRoZSBvcGVyYW5kCisgIC8vLyBpbnRvIHRoZSBzcGVjaWZpZWQgdmVjdG9yIHR5cGUuIEZvciBleGFtcGxlLAorICAvLy8gdGhpcyBjYW4gY29udmVydCBhIHYxNmk4IGludG8gYSB2NGkzMiBieSB6ZXJvIGV4dGVuZGluZyB0aGUgbG93IGZvdXIKKyAgLy8vIGxhbmVzIG9mIHRoZSBvcGVyYW5kIGZyb20gaTggdG8gaTMyLgorICBTRFZhbHVlIGdldFplcm9FeHRlbmRWZWN0b3JJblJlZyhTRFZhbHVlIE9wLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCk7CisKKyAgLy8vIENvbnZlcnQgT3AsIHdoaWNoIG11c3QgYmUgb2YgaW50ZWdlciB0eXBlLCB0byB0aGUgaW50ZWdlciB0eXBlIFZULAorICAvLy8gYnkgdXNpbmcgYW4gZXh0ZW5zaW9uIGFwcHJvcHJpYXRlIGZvciB0aGUgdGFyZ2V0J3MKKyAgLy8vIEJvb2xlYW5Db250ZW50IGZvciB0eXBlIE9wVlQgb3IgdHJ1bmNhdGluZyBpdC4KKyAgU0RWYWx1ZSBnZXRCb29sRXh0T3JUcnVuYyhTRFZhbHVlIE9wLCBjb25zdCBTRExvYyAmU0wsIEVWVCBWVCwgRVZUIE9wVlQpOworCisgIC8vLyBDcmVhdGUgYSBiaXR3aXNlIE5PVCBvcGVyYXRpb24gYXMgKFhPUiBWYWwsIC0xKS4KKyAgU0RWYWx1ZSBnZXROT1QoY29uc3QgU0RMb2MgJkRMLCBTRFZhbHVlIFZhbCwgRVZUIFZUKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIGxvZ2ljYWwgTk9UIG9wZXJhdGlvbiBhcyAoWE9SIFZhbCwgQm9vbGVhbk9uZSkuCisgIFNEVmFsdWUgZ2V0TG9naWNhbE5PVChjb25zdCBTRExvYyAmREwsIFNEVmFsdWUgVmFsLCBFVlQgVlQpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIGFkZCBpbnN0cnVjdGlvbiB3aXRoIGFwcHJvcHJpYXRlIGZsYWdzIHdoZW4gdXNlZCBmb3IKKyAgLy8vIGFkZHJlc3Npbmcgc29tZSBvZmZzZXQgb2YgYW4gb2JqZWN0LiBpLmUuIGlmIGEgbG9hZCBpcyBzcGxpdCBpbnRvIG11bHRpcGxlCisgIC8vLyBjb21wb25lbnRzLCBjcmVhdGUgYW4gYWRkIG51dyBmcm9tIHRoZSBiYXNlIHBvaW50ZXIgdG8gdGhlIG9mZnNldC4KKyAgU0RWYWx1ZSBnZXRPYmplY3RQdHJPZmZzZXQoY29uc3QgU0RMb2MgJlNMLCBTRFZhbHVlIE9wLCBpbnQ2NF90IE9mZnNldCkgeworICAgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworICAgIHJldHVybiBnZXRPYmplY3RQdHJPZmZzZXQoU0wsIE9wLCBnZXRDb25zdGFudChPZmZzZXQsIFNMLCBWVCkpOworICB9CisKKyAgU0RWYWx1ZSBnZXRPYmplY3RQdHJPZmZzZXQoY29uc3QgU0RMb2MgJlNMLCBTRFZhbHVlIE9wLCBTRFZhbHVlIE9mZnNldCkgeworICAgIEVWVCBWVCA9IE9wLmdldFZhbHVlVHlwZSgpOworCisgICAgLy8gVGhlIG9iamVjdCBpdHNlbGYgY2FuJ3Qgd3JhcCBhcm91bmQgdGhlIGFkZHJlc3Mgc3BhY2UsIHNvIGl0IHNob3VsZG4ndCBiZQorICAgIC8vIHBvc3NpYmxlIGZvciB0aGUgYWRkcyBvZiB0aGUgb2Zmc2V0cyB0byB0aGUgc3BsaXQgcGFydHMgdG8gb3ZlcmZsb3cuCisgICAgU0ROb2RlRmxhZ3MgRmxhZ3M7CisgICAgRmxhZ3Muc2V0Tm9VbnNpZ25lZFdyYXAodHJ1ZSk7CisgICAgcmV0dXJuIGdldE5vZGUoSVNEOjpBREQsIFNMLCBWVCwgT3AsIE9mZnNldCwgRmxhZ3MpOworICB9CisKKyAgLy8vIFJldHVybiBhIG5ldyBDQUxMU0VRX1NUQVJUIG5vZGUsIHRoYXQgc3RhcnRzIG5ldyBjYWxsIGZyYW1lLCBpbiB3aGljaAorICAvLy8gSW5TaXplIGJ5dGVzIGFyZSBzZXQgdXAgaW5zaWRlIENBTExTRVFfU1RBUlQuLkNBTExTRVFfRU5EIHNlcXVlbmNlIGFuZAorICAvLy8gT3V0U2l6ZSBzcGVjaWZpZXMgcGFydCBvZiB0aGUgZnJhbWUgc2V0IHVwIHByaW9yIHRvIHRoZSBzZXF1ZW5jZS4KKyAgU0RWYWx1ZSBnZXRDQUxMU0VRX1NUQVJUKFNEVmFsdWUgQ2hhaW4sIHVpbnQ2NF90IEluU2l6ZSwgdWludDY0X3QgT3V0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNETG9jICZETCkgeworICAgIFNEVlRMaXN0IFZUcyA9IGdldFZUTGlzdChNVlQ6Ok90aGVyLCBNVlQ6OkdsdWUpOworICAgIFNEVmFsdWUgT3BzW10gPSB7IENoYWluLAorICAgICAgICAgICAgICAgICAgICAgIGdldEludFB0ckNvbnN0YW50KEluU2l6ZSwgREwsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGdldEludFB0ckNvbnN0YW50KE91dFNpemUsIERMLCB0cnVlKSB9OworICAgIHJldHVybiBnZXROb2RlKElTRDo6Q0FMTFNFUV9TVEFSVCwgREwsIFZUcywgT3BzKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSBuZXcgQ0FMTFNFUV9FTkQgbm9kZSwgd2hpY2ggYWx3YXlzIG11c3QgaGF2ZSBhCisgIC8vLyBnbHVlIHJlc3VsdCAodG8gZW5zdXJlIGl0J3Mgbm90IENTRSdkKS4KKyAgLy8vIENBTExTRVFfRU5EIGRvZXMgbm90IGhhdmUgYSB1c2VmdWwgU0RMb2MuCisgIFNEVmFsdWUgZ2V0Q0FMTFNFUV9FTkQoU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgSW5HbHVlLCBjb25zdCBTRExvYyAmREwpIHsKKyAgICBTRFZUTGlzdCBOb2RlVHlzID0gZ2V0VlRMaXN0KE1WVDo6T3RoZXIsIE1WVDo6R2x1ZSk7CisgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgND4gT3BzOworICAgIE9wcy5wdXNoX2JhY2soQ2hhaW4pOworICAgIE9wcy5wdXNoX2JhY2soT3AxKTsKKyAgICBPcHMucHVzaF9iYWNrKE9wMik7CisgICAgaWYgKEluR2x1ZS5nZXROb2RlKCkpCisgICAgICBPcHMucHVzaF9iYWNrKEluR2x1ZSk7CisgICAgcmV0dXJuIGdldE5vZGUoSVNEOjpDQUxMU0VRX0VORCwgREwsIE5vZGVUeXMsIE9wcyk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbiBpcyBhbHdheXMgdW5kZWZpbmVkLgorICBib29sIGlzVW5kZWYodW5zaWduZWQgT3Bjb2RlLCBBcnJheVJlZjxTRFZhbHVlPiBPcHMpOworCisgIC8vLyBSZXR1cm4gYW4gVU5ERUYgbm9kZS4gVU5ERUYgZG9lcyBub3QgaGF2ZSBhIHVzZWZ1bCBTRExvYy4KKyAgU0RWYWx1ZSBnZXRVTkRFRihFVlQgVlQpIHsKKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OlVOREVGLCBTRExvYygpLCBWVCk7CisgIH0KKworICAvLy8gUmV0dXJuIGEgR0xPQkFMX09GRlNFVF9UQUJMRSBub2RlLiBUaGlzIGRvZXMgbm90IGhhdmUgYSB1c2VmdWwgU0RMb2MuCisgIFNEVmFsdWUgZ2V0R0xPQkFMX09GRlNFVF9UQUJMRShFVlQgVlQpIHsKKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OkdMT0JBTF9PRkZTRVRfVEFCTEUsIFNETG9jKCksIFZUKTsKKyAgfQorCisgIC8vLyBHZXRzIG9yIGNyZWF0ZXMgdGhlIHNwZWNpZmllZCBub2RlLgorICAvLy8KKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTRFVzZT4gT3BzKTsKKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTRFZhbHVlPiBPcHMsIGNvbnN0IFNETm9kZUZsYWdzIEZsYWdzID0gU0ROb2RlRmxhZ3MoKSk7CisgIFNEVmFsdWUgZ2V0Tm9kZSh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZETCwgQXJyYXlSZWY8RVZUPiBSZXN1bHRUeXMsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTRFZhbHVlPiBPcHMpOworICBTRFZhbHVlIGdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmREwsIFNEVlRMaXN0IFZUcywKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNEVmFsdWU+IE9wcyk7CisKKyAgLy8gU3BlY2lhbGl6ZSBiYXNlZCBvbiBudW1iZXIgb2Ygb3BlcmFuZHMuCisgIFNEVmFsdWUgZ2V0Tm9kZSh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZETCwgRVZUIFZUKTsKKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsIFNEVmFsdWUgTiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNETm9kZUZsYWdzIEZsYWdzID0gU0ROb2RlRmxhZ3MoKSk7CisgIFNEVmFsdWUgZ2V0Tm9kZSh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZETCwgRVZUIFZULCBTRFZhbHVlIE4xLAorICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBOMiwgY29uc3QgU0ROb2RlRmxhZ3MgRmxhZ3MgPSBTRE5vZGVGbGFncygpKTsKKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsIFNEVmFsdWUgTjEsCisgICAgICAgICAgICAgICAgICBTRFZhbHVlIE4yLCBTRFZhbHVlIE4zKTsKKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsIFNEVmFsdWUgTjEsCisgICAgICAgICAgICAgICAgICBTRFZhbHVlIE4yLCBTRFZhbHVlIE4zLCBTRFZhbHVlIE40KTsKKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsIFNEVmFsdWUgTjEsCisgICAgICAgICAgICAgICAgICBTRFZhbHVlIE4yLCBTRFZhbHVlIE4zLCBTRFZhbHVlIE40LCBTRFZhbHVlIE41KTsKKworICAvLyBTcGVjaWFsaXplIGFnYWluIGJhc2VkIG9uIG51bWJlciBvZiBvcGVyYW5kcyBmb3Igbm9kZXMgd2l0aCBhIFZUTGlzdAorICAvLyByYXRoZXIgdGhhbiBhIHNpbmdsZSBWVC4KKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJkRMLCBTRFZUTGlzdCBWVHMpOworICBTRFZhbHVlIGdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmREwsIFNEVlRMaXN0IFZUcywgU0RWYWx1ZSBOKTsKKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJkRMLCBTRFZUTGlzdCBWVHMsIFNEVmFsdWUgTjEsCisgICAgICAgICAgICAgICAgICBTRFZhbHVlIE4yKTsKKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJkRMLCBTRFZUTGlzdCBWVHMsIFNEVmFsdWUgTjEsCisgICAgICAgICAgICAgICAgICBTRFZhbHVlIE4yLCBTRFZhbHVlIE4zKTsKKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJkRMLCBTRFZUTGlzdCBWVHMsIFNEVmFsdWUgTjEsCisgICAgICAgICAgICAgICAgICBTRFZhbHVlIE4yLCBTRFZhbHVlIE4zLCBTRFZhbHVlIE40KTsKKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJkRMLCBTRFZUTGlzdCBWVHMsIFNEVmFsdWUgTjEsCisgICAgICAgICAgICAgICAgICBTRFZhbHVlIE4yLCBTRFZhbHVlIE4zLCBTRFZhbHVlIE40LCBTRFZhbHVlIE41KTsKKworICAvLy8gQ29tcHV0ZSBhIFRva2VuRmFjdG9yIHRvIGZvcmNlIGFsbCB0aGUgaW5jb21pbmcgc3RhY2sgYXJndW1lbnRzIHRvIGJlCisgIC8vLyBsb2FkZWQgZnJvbSB0aGUgc3RhY2suIFRoaXMgaXMgdXNlZCBpbiB0YWlsIGNhbGwgbG93ZXJpbmcgdG8gcHJvdGVjdAorICAvLy8gc3RhY2sgYXJndW1lbnRzIGZyb20gYmVpbmcgY2xvYmJlcmVkLgorICBTRFZhbHVlIGdldFN0YWNrQXJndW1lbnRUb2tlbkZhY3RvcihTRFZhbHVlIENoYWluKTsKKworICBTRFZhbHVlIGdldE1lbWNweShTRFZhbHVlIENoYWluLCBjb25zdCBTRExvYyAmZGwsIFNEVmFsdWUgRHN0LCBTRFZhbHVlIFNyYywKKyAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBTaXplLCB1bnNpZ25lZCBBbGlnbiwgYm9vbCBpc1ZvbCwgYm9vbCBBbHdheXNJbmxpbmUsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNUYWlsQ2FsbCwgTWFjaGluZVBvaW50ZXJJbmZvIERzdFB0ckluZm8sCisgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVQb2ludGVySW5mbyBTcmNQdHJJbmZvKTsKKworICBTRFZhbHVlIGdldE1lbW1vdmUoU0RWYWx1ZSBDaGFpbiwgY29uc3QgU0RMb2MgJmRsLCBTRFZhbHVlIERzdCwgU0RWYWx1ZSBTcmMsCisgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFNpemUsIHVuc2lnbmVkIEFsaWduLCBib29sIGlzVm9sLCBib29sIGlzVGFpbENhbGwsCisgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUG9pbnRlckluZm8gRHN0UHRySW5mbywKKyAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVQb2ludGVySW5mbyBTcmNQdHJJbmZvKTsKKworICBTRFZhbHVlIGdldE1lbXNldChTRFZhbHVlIENoYWluLCBjb25zdCBTRExvYyAmZGwsIFNEVmFsdWUgRHN0LCBTRFZhbHVlIFNyYywKKyAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBTaXplLCB1bnNpZ25lZCBBbGlnbiwgYm9vbCBpc1ZvbCwgYm9vbCBpc1RhaWxDYWxsLAorICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUG9pbnRlckluZm8gRHN0UHRySW5mbyk7CisKKyAgLy8vIEhlbHBlciBmdW5jdGlvbiB0byBtYWtlIGl0IGVhc2llciB0byBidWlsZCBTZXRDQydzIGlmIHlvdSBqdXN0CisgIC8vLyBoYXZlIGFuIElTRDo6Q29uZENvZGUgaW5zdGVhZCBvZiBhbiBTRFZhbHVlLgorICAvLy8KKyAgU0RWYWx1ZSBnZXRTZXRDQyhjb25zdCBTRExvYyAmREwsIEVWVCBWVCwgU0RWYWx1ZSBMSFMsIFNEVmFsdWUgUkhTLAorICAgICAgICAgICAgICAgICAgIElTRDo6Q29uZENvZGUgQ29uZCkgeworICAgIGFzc2VydChMSFMuZ2V0VmFsdWVUeXBlKCkuaXNWZWN0b3IoKSA9PSBSSFMuZ2V0VmFsdWVUeXBlKCkuaXNWZWN0b3IoKSAmJgorICAgICAgIkNhbm5vdCBjb21wYXJlIHNjYWxhcnMgdG8gdmVjdG9ycyIpOworICAgIGFzc2VydChMSFMuZ2V0VmFsdWVUeXBlKCkuaXNWZWN0b3IoKSA9PSBWVC5pc1ZlY3RvcigpICYmCisgICAgICAiQ2Fubm90IGNvbXBhcmUgc2NhbGFycyB0byB2ZWN0b3JzIik7CisgICAgYXNzZXJ0KENvbmQgIT0gSVNEOjpTRVRDQ19JTlZBTElEICYmCisgICAgICAgICJDYW5ub3QgY3JlYXRlIGEgc2V0Q0Mgb2YgYW4gaW52YWxpZCBub2RlLiIpOworICAgIHJldHVybiBnZXROb2RlKElTRDo6U0VUQ0MsIERMLCBWVCwgTEhTLCBSSFMsIGdldENvbmRDb2RlKENvbmQpKTsKKyAgfQorCisgIC8vLyBIZWxwZXIgZnVuY3Rpb24gdG8gbWFrZSBpdCBlYXNpZXIgdG8gYnVpbGQgU2VsZWN0J3MgaWYgeW91IGp1c3QKKyAgLy8vIGhhdmUgb3BlcmFuZHMgYW5kIGRvbid0IHdhbnQgdG8gY2hlY2sgZm9yIHZlY3Rvci4KKyAgU0RWYWx1ZSBnZXRTZWxlY3QoY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsIFNEVmFsdWUgQ29uZCwgU0RWYWx1ZSBMSFMsCisgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgUkhTKSB7CisgICAgYXNzZXJ0KExIUy5nZXRWYWx1ZVR5cGUoKSA9PSBSSFMuZ2V0VmFsdWVUeXBlKCkgJiYKKyAgICAgICAgICAgIkNhbm5vdCB1c2Ugc2VsZWN0IG9uIGRpZmZlcmluZyB0eXBlcyIpOworICAgIGFzc2VydChWVC5pc1ZlY3RvcigpID09IExIUy5nZXRWYWx1ZVR5cGUoKS5pc1ZlY3RvcigpICYmCisgICAgICAgICAgICJDYW5ub3QgbWl4IHZlY3RvcnMgYW5kIHNjYWxhcnMiKTsKKyAgICByZXR1cm4gZ2V0Tm9kZShDb25kLmdldFZhbHVlVHlwZSgpLmlzVmVjdG9yKCkgPyBJU0Q6OlZTRUxFQ1QgOiBJU0Q6OlNFTEVDVCwgREwsIFZULAorICAgICAgICAgICAgICAgICAgIENvbmQsIExIUywgUkhTKTsKKyAgfQorCisgIC8vLyBIZWxwZXIgZnVuY3Rpb24gdG8gbWFrZSBpdCBlYXNpZXIgdG8gYnVpbGQgU2VsZWN0Q0MncyBpZiB5b3UKKyAgLy8vIGp1c3QgaGF2ZSBhbiBJU0Q6OkNvbmRDb2RlIGluc3RlYWQgb2YgYW4gU0RWYWx1ZS4KKyAgLy8vCisgIFNEVmFsdWUgZ2V0U2VsZWN0Q0MoY29uc3QgU0RMb2MgJkRMLCBTRFZhbHVlIExIUywgU0RWYWx1ZSBSSFMsIFNEVmFsdWUgVHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIEZhbHNlLCBJU0Q6OkNvbmRDb2RlIENvbmQpIHsKKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OlNFTEVDVF9DQywgREwsIFRydWUuZ2V0VmFsdWVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgTEhTLCBSSFMsIFRydWUsIEZhbHNlLCBnZXRDb25kQ29kZShDb25kKSk7CisgIH0KKworICAvLy8gVkFBcmcgcHJvZHVjZXMgYSByZXN1bHQgYW5kIHRva2VuIGNoYWluLCBhbmQgdGFrZXMgYSBwb2ludGVyCisgIC8vLyBhbmQgYSBzb3VyY2UgdmFsdWUgYXMgaW5wdXQuCisgIFNEVmFsdWUgZ2V0VkFBcmcoRVZUIFZULCBjb25zdCBTRExvYyAmZGwsIFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgUHRyLAorICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgU1YsIHVuc2lnbmVkIEFsaWduKTsKKworICAvLy8gR2V0cyBhIG5vZGUgZm9yIGFuIGF0b21pYyBjbXB4Y2hnIG9wLiBUaGVyZSBhcmUgdHdvCisgIC8vLyB2YWxpZCBPcGNvZGVzLiBJU0Q6OkFUT01JQ19DTU9fU1dBUCBwcm9kdWNlcyB0aGUgdmFsdWUgbG9hZGVkIGFuZCBhCisgIC8vLyBjaGFpbiByZXN1bHQuIElTRDo6QVRPTUlDX0NNUF9TV0FQX1dJVEhfU1VDQ0VTUyBwcm9kdWNlcyB0aGUgdmFsdWUgbG9hZGVkLAorICAvLy8gYSBzdWNjZXNzIGZsYWcgKGluaXRpYWxseSBpMSksIGFuZCBhIGNoYWluLgorICBTRFZhbHVlIGdldEF0b21pY0NtcFN3YXAodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmZGwsIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVlRMaXN0IFZUcywgU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIENtcCwgU0RWYWx1ZSBTd3AsIE1hY2hpbmVQb2ludGVySW5mbyBQdHJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50LCBBdG9taWNPcmRlcmluZyBTdWNjZXNzT3JkZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNPcmRlcmluZyBGYWlsdXJlT3JkZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5jU2NvcGU6OklEIFNTSUQpOworICBTRFZhbHVlIGdldEF0b21pY0NtcFN3YXAodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmZGwsIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVlRMaXN0IFZUcywgU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIENtcCwgU0RWYWx1ZSBTd3AsIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pOworCisgIC8vLyBHZXRzIGEgbm9kZSBmb3IgYW4gYXRvbWljIG9wLCBwcm9kdWNlcyByZXN1bHQgKGlmIHJlbGV2YW50KQorICAvLy8gYW5kIGNoYWluIGFuZCB0YWtlcyAyIG9wZXJhbmRzLgorICBTRFZhbHVlIGdldEF0b21pYyh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZkbCwgRVZUIE1lbVZULCBTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFB0ciwgU0RWYWx1ZSBWYWwsIGNvbnN0IFZhbHVlICpQdHJWYWwsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCwgQXRvbWljT3JkZXJpbmcgT3JkZXJpbmcsCisgICAgICAgICAgICAgICAgICAgIFN5bmNTY29wZTo6SUQgU1NJRCk7CisgIFNEVmFsdWUgZ2V0QXRvbWljKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJmRsLCBFVlQgTWVtVlQsIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgUHRyLCBTRFZhbHVlIFZhbCwgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisKKyAgLy8vIEdldHMgYSBub2RlIGZvciBhbiBhdG9taWMgb3AsIHByb2R1Y2VzIHJlc3VsdCBhbmQgY2hhaW4gYW5kCisgIC8vLyB0YWtlcyAxIG9wZXJhbmQuCisgIFNEVmFsdWUgZ2V0QXRvbWljKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJmRsLCBFVlQgTWVtVlQsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBQdHIsIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pOworCisgIC8vLyBHZXRzIGEgbm9kZSBmb3IgYW4gYXRvbWljIG9wLCBwcm9kdWNlcyByZXN1bHQgYW5kIGNoYWluIGFuZCB0YWtlcyBOCisgIC8vLyBvcGVyYW5kcy4KKyAgU0RWYWx1ZSBnZXRBdG9taWModW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmZGwsIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgU0RWVExpc3QgVlRMaXN0LCBBcnJheVJlZjxTRFZhbHVlPiBPcHMsCisgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pOworCisgIC8vLyBDcmVhdGVzIGEgTWVtSW50cmluc2ljTm9kZSB0aGF0IG1heSBwcm9kdWNlIGEKKyAgLy8vIHJlc3VsdCBhbmQgdGFrZXMgYSBsaXN0IG9mIG9wZXJhbmRzLiBPcGNvZGUgbWF5IGJlIElOVFJJTlNJQ19WT0lELAorICAvLy8gSU5UUklOU0lDX1dfQ0hBSU4sIG9yIGEgdGFyZ2V0LXNwZWNpZmljIG9wY29kZSB3aXRoIGEgdmFsdWUgbm90CisgIC8vLyBsZXNzIHRoYW4gRklSU1RfVEFSR0VUX01FTU9SWV9PUENPREUuCisgIFNEVmFsdWUgZ2V0TWVtSW50cmluc2ljTm9kZSgKKyAgICB1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZkbCwgU0RWVExpc3QgVlRMaXN0LAorICAgIEFycmF5UmVmPFNEVmFsdWU+IE9wcywgRVZUIE1lbVZULAorICAgIE1hY2hpbmVQb2ludGVySW5mbyBQdHJJbmZvLAorICAgIHVuc2lnbmVkIEFsaWduID0gMCwKKyAgICBNYWNoaW5lTWVtT3BlcmFuZDo6RmxhZ3MgRmxhZ3MKKyAgICA9IE1hY2hpbmVNZW1PcGVyYW5kOjpNT0xvYWQgfCBNYWNoaW5lTWVtT3BlcmFuZDo6TU9TdG9yZSwKKyAgICB1bnNpZ25lZCBTaXplID0gMCk7CisKKyAgU0RWYWx1ZSBnZXRNZW1JbnRyaW5zaWNOb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJmRsLCBTRFZUTGlzdCBWVExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTRFZhbHVlPiBPcHMsIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pOworCisgIC8vLyBDcmVhdGUgYSBNRVJHRV9WQUxVRVMgbm9kZSBmcm9tIHRoZSBnaXZlbiBvcGVyYW5kcy4KKyAgU0RWYWx1ZSBnZXRNZXJnZVZhbHVlcyhBcnJheVJlZjxTRFZhbHVlPiBPcHMsIGNvbnN0IFNETG9jICZkbCk7CisKKyAgLy8vIExvYWRzIGFyZSBub3Qgbm9ybWFsIGJpbmFyeSBvcGVyYXRvcnM6IHRoZWlyIHJlc3VsdCB0eXBlIGlzIG5vdAorICAvLy8gZGV0ZXJtaW5lZCBieSB0aGVpciBvcGVyYW5kcywgYW5kIHRoZXkgcHJvZHVjZSBhIHZhbHVlIEFORCBhIHRva2VuIGNoYWluLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgdGhlIE1PTG9hZCBmbGFnIG9uIE1NT0ZsYWdzLCBidXQgeW91IGNhbiBzZXQgaXQgaWYKKyAgLy8vIHlvdSB3YW50LiAgVGhlIE1PU3RvcmUgZmxhZyBtdXN0IG5vdCBiZSBzZXQuCisgIFNEVmFsdWUgZ2V0TG9hZChFVlQgVlQsIGNvbnN0IFNETG9jICZkbCwgU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBQdHIsCisgICAgICAgICAgICAgICAgICBNYWNoaW5lUG9pbnRlckluZm8gUHRySW5mbywgdW5zaWduZWQgQWxpZ25tZW50ID0gMCwKKyAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kOjpGbGFncyBNTU9GbGFncyA9IE1hY2hpbmVNZW1PcGVyYW5kOjpNT05vbmUsCisgICAgICAgICAgICAgICAgICBjb25zdCBBQU1ETm9kZXMgJkFBSW5mbyA9IEFBTUROb2RlcygpLAorICAgICAgICAgICAgICAgICAgY29uc3QgTUROb2RlICpSYW5nZXMgPSBudWxscHRyKTsKKyAgU0RWYWx1ZSBnZXRMb2FkKEVWVCBWVCwgY29uc3QgU0RMb2MgJmRsLCBTRFZhbHVlIENoYWluLCBTRFZhbHVlIFB0ciwKKyAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pOworICBTRFZhbHVlCisgIGdldEV4dExvYWQoSVNEOjpMb2FkRXh0VHlwZSBFeHRUeXBlLCBjb25zdCBTRExvYyAmZGwsIEVWVCBWVCwgU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICBTRFZhbHVlIFB0ciwgTWFjaGluZVBvaW50ZXJJbmZvIFB0ckluZm8sIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQgPSAwLAorICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kOjpGbGFncyBNTU9GbGFncyA9IE1hY2hpbmVNZW1PcGVyYW5kOjpNT05vbmUsCisgICAgICAgICAgICAgY29uc3QgQUFNRE5vZGVzICZBQUluZm8gPSBBQU1ETm9kZXMoKSk7CisgIFNEVmFsdWUgZ2V0RXh0TG9hZChJU0Q6OkxvYWRFeHRUeXBlIEV4dFR5cGUsIGNvbnN0IFNETG9jICZkbCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBQdHIsIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pOworICBTRFZhbHVlIGdldEluZGV4ZWRMb2FkKFNEVmFsdWUgT3JpZ0xvYWQsIGNvbnN0IFNETG9jICZkbCwgU0RWYWx1ZSBCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT2Zmc2V0LCBJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNKTsKKyAgU0RWYWx1ZSBnZXRMb2FkKElTRDo6TWVtSW5kZXhlZE1vZGUgQU0sIElTRDo6TG9hZEV4dFR5cGUgRXh0VHlwZSwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgY29uc3QgU0RMb2MgJmRsLCBTRFZhbHVlIENoYWluLCBTRFZhbHVlIFB0ciwgU0RWYWx1ZSBPZmZzZXQsCisgICAgICAgICAgICAgICAgICBNYWNoaW5lUG9pbnRlckluZm8gUHRySW5mbywgRVZUIE1lbVZULCB1bnNpZ25lZCBBbGlnbm1lbnQgPSAwLAorICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQ6OkZsYWdzIE1NT0ZsYWdzID0gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PTm9uZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEFBTUROb2RlcyAmQUFJbmZvID0gQUFNRE5vZGVzKCksCisgICAgICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKlJhbmdlcyA9IG51bGxwdHIpOworICBTRFZhbHVlIGdldExvYWQoSVNEOjpNZW1JbmRleGVkTW9kZSBBTSwgSVNEOjpMb2FkRXh0VHlwZSBFeHRUeXBlLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICBjb25zdCBTRExvYyAmZGwsIFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgUHRyLCBTRFZhbHVlIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgIEVWVCBNZW1WVCwgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisKKyAgLy8vIEhlbHBlciBmdW5jdGlvbiB0byBidWlsZCBJU0Q6OlNUT1JFIG5vZGVzLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgdGhlIE1PU3RvcmUgZmxhZyBvbiBNTU9GbGFncywgYnV0IHlvdSBjYW4gc2V0IGl0IGlmCisgIC8vLyB5b3Ugd2FudC4gIFRoZSBNT0xvYWQgYW5kIE1PSW52YXJpYW50IGZsYWdzIG11c3Qgbm90IGJlIHNldC4KKyAgU0RWYWx1ZQorICBnZXRTdG9yZShTRFZhbHVlIENoYWluLCBjb25zdCBTRExvYyAmZGwsIFNEVmFsdWUgVmFsLCBTRFZhbHVlIFB0ciwKKyAgICAgICAgICAgTWFjaGluZVBvaW50ZXJJbmZvIFB0ckluZm8sIHVuc2lnbmVkIEFsaWdubWVudCA9IDAsCisgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kOjpGbGFncyBNTU9GbGFncyA9IE1hY2hpbmVNZW1PcGVyYW5kOjpNT05vbmUsCisgICAgICAgICAgIGNvbnN0IEFBTUROb2RlcyAmQUFJbmZvID0gQUFNRE5vZGVzKCkpOworICBTRFZhbHVlIGdldFN0b3JlKFNEVmFsdWUgQ2hhaW4sIGNvbnN0IFNETG9jICZkbCwgU0RWYWx1ZSBWYWwsIFNEVmFsdWUgUHRyLAorICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pOworICBTRFZhbHVlCisgIGdldFRydW5jU3RvcmUoU0RWYWx1ZSBDaGFpbiwgY29uc3QgU0RMb2MgJmRsLCBTRFZhbHVlIFZhbCwgU0RWYWx1ZSBQdHIsCisgICAgICAgICAgICAgICAgTWFjaGluZVBvaW50ZXJJbmZvIFB0ckluZm8sIEVWVCBUVlQsIHVuc2lnbmVkIEFsaWdubWVudCA9IDAsCisgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQ6OkZsYWdzIE1NT0ZsYWdzID0gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PTm9uZSwKKyAgICAgICAgICAgICAgICBjb25zdCBBQU1ETm9kZXMgJkFBSW5mbyA9IEFBTUROb2RlcygpKTsKKyAgU0RWYWx1ZSBnZXRUcnVuY1N0b3JlKFNEVmFsdWUgQ2hhaW4sIGNvbnN0IFNETG9jICZkbCwgU0RWYWx1ZSBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFB0ciwgRVZUIFRWVCwgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisgIFNEVmFsdWUgZ2V0SW5kZXhlZFN0b3JlKFNEVmFsdWUgT3JpZ1N0b2UsIGNvbnN0IFNETG9jICZkbCwgU0RWYWx1ZSBCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9mZnNldCwgSVNEOjpNZW1JbmRleGVkTW9kZSBBTSk7CisKKyAgLy8vIFJldHVybnMgc3VtIG9mIHRoZSBiYXNlIHBvaW50ZXIgYW5kIG9mZnNldC4KKyAgU0RWYWx1ZSBnZXRNZW1CYXNlUGx1c09mZnNldChTRFZhbHVlIEJhc2UsIHVuc2lnbmVkIE9mZnNldCwgY29uc3QgU0RMb2MgJkRMKTsKKworICBTRFZhbHVlIGdldE1hc2tlZExvYWQoRVZUIFZULCBjb25zdCBTRExvYyAmZGwsIFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBNYXNrLCBTRFZhbHVlIFNyYzAsIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8sIElTRDo6TG9hZEV4dFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRXhwYW5kaW5nID0gZmFsc2UpOworICBTRFZhbHVlIGdldE1hc2tlZFN0b3JlKFNEVmFsdWUgQ2hhaW4sIGNvbnN0IFNETG9jICZkbCwgU0RWYWx1ZSBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBQdHIsIFNEVmFsdWUgTWFzaywgRVZUIE1lbVZULAorICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8sIGJvb2wgSXNUcnVuY2F0aW5nID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0NvbXByZXNzaW5nID0gZmFsc2UpOworICBTRFZhbHVlIGdldE1hc2tlZEdhdGhlcihTRFZUTGlzdCBWVHMsIEVWVCBWVCwgY29uc3QgU0RMb2MgJmRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTRFZhbHVlPiBPcHMsIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pOworICBTRFZhbHVlIGdldE1hc2tlZFNjYXR0ZXIoU0RWVExpc3QgVlRzLCBFVlQgVlQsIGNvbnN0IFNETG9jICZkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNEVmFsdWU+IE9wcywgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisKKyAgLy8vIFJldHVybiAoY3JlYXRlIGEgbmV3IG9yIGZpbmQgZXhpc3RpbmcpIGEgdGFyZ2V0LXNwZWNpZmljIG5vZGUuCisgIC8vLyBUYXJnZXRNZW1TRE5vZGUgc2hvdWxkIGJlIGRlcml2ZWQgY2xhc3MgZnJvbSBNZW1TRE5vZGUuCisgIHRlbXBsYXRlIDxjbGFzcyBUYXJnZXRNZW1TRE5vZGU+CisgIFNEVmFsdWUgZ2V0VGFyZ2V0TWVtU0ROb2RlKFNEVlRMaXN0IFZUcywgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRExvYyAmZGwsIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisKKyAgLy8vIENvbnN0cnVjdCBhIG5vZGUgdG8gdHJhY2sgYSBWYWx1ZSogdGhyb3VnaCB0aGUgYmFja2VuZC4KKyAgU0RWYWx1ZSBnZXRTcmNWYWx1ZShjb25zdCBWYWx1ZSAqdik7CisKKyAgLy8vIFJldHVybiBhbiBNRE5vZGVTRE5vZGUgd2hpY2ggaG9sZHMgYW4gTUROb2RlLgorICBTRFZhbHVlIGdldE1ETm9kZShjb25zdCBNRE5vZGUgKk1EKTsKKworICAvLy8gUmV0dXJuIGEgYml0Y2FzdCB1c2luZyB0aGUgU0RMb2Mgb2YgdGhlIHZhbHVlIG9wZXJhbmQsIGFuZCBjYXN0aW5nIHRvIHRoZQorICAvLy8gcHJvdmlkZWQgdHlwZS4gVXNlIGdldE5vZGUgdG8gc2V0IGEgY3VzdG9tIFNETG9jLgorICBTRFZhbHVlIGdldEJpdGNhc3QoRVZUIFZULCBTRFZhbHVlIFYpOworCisgIC8vLyBSZXR1cm4gYW4gQWRkclNwYWNlQ2FzdFNETm9kZS4KKyAgU0RWYWx1ZSBnZXRBZGRyU3BhY2VDYXN0KGNvbnN0IFNETG9jICZkbCwgRVZUIFZULCBTRFZhbHVlIFB0ciwgdW5zaWduZWQgU3JjQVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0QVMpOworCisgIC8vLyBSZXR1cm4gdGhlIHNwZWNpZmllZCB2YWx1ZSBjYXN0ZWQgdG8KKyAgLy8vIHRoZSB0YXJnZXQncyBkZXNpcmVkIHNoaWZ0IGFtb3VudCB0eXBlLgorICBTRFZhbHVlIGdldFNoaWZ0QW1vdW50T3BlcmFuZChFVlQgTEhTVHksIFNEVmFsdWUgT3ApOworCisgIC8vLyBFeHBhbmQgdGhlIHNwZWNpZmllZCBcYyBJU0Q6OlZBQVJHIG5vZGUgYXMgdGhlIExlZ2FsaXplIHBhc3Mgd291bGQuCisgIFNEVmFsdWUgZXhwYW5kVkFBcmcoU0ROb2RlICpOb2RlKTsKKworICAvLy8gRXhwYW5kIHRoZSBzcGVjaWZpZWQgXGMgSVNEOjpWQUNPUFkgbm9kZSBhcyB0aGUgTGVnYWxpemUgcGFzcyB3b3VsZC4KKyAgU0RWYWx1ZSBleHBhbmRWQUNvcHkoU0ROb2RlICpOb2RlKTsKKworICAvLy8gKk11dGF0ZSogdGhlIHNwZWNpZmllZCBub2RlIGluLXBsYWNlIHRvIGhhdmUgdGhlCisgIC8vLyBzcGVjaWZpZWQgb3BlcmFuZHMuICBJZiB0aGUgcmVzdWx0YW50IG5vZGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIERBRywKKyAgLy8vIHRoaXMgZG9lcyBub3QgbW9kaWZ5IHRoZSBzcGVjaWZpZWQgbm9kZSwgaW5zdGVhZCBpdCByZXR1cm5zIHRoZSBub2RlIHRoYXQKKyAgLy8vIGFscmVhZHkgZXhpc3RzLiAgSWYgdGhlIHJlc3VsdGFudCBub2RlIGRvZXMgbm90IGV4aXN0IGluIHRoZSBEQUcsIHRoZQorICAvLy8gaW5wdXQgbm9kZSBpcyByZXR1cm5lZC4gIEFzIGEgZGVnZW5lcmF0ZSBjYXNlLCBpZiB5b3Ugc3BlY2lmeSB0aGUgc2FtZQorICAvLy8gaW5wdXQgb3BlcmFuZHMgYXMgdGhlIG5vZGUgYWxyZWFkeSBoYXMsIHRoZSBpbnB1dCBub2RlIGlzIHJldHVybmVkLgorICBTRE5vZGUgKlVwZGF0ZU5vZGVPcGVyYW5kcyhTRE5vZGUgKk4sIFNEVmFsdWUgT3ApOworICBTRE5vZGUgKlVwZGF0ZU5vZGVPcGVyYW5kcyhTRE5vZGUgKk4sIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMik7CisgIFNETm9kZSAqVXBkYXRlTm9kZU9wZXJhbmRzKFNETm9kZSAqTiwgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AzKTsKKyAgU0ROb2RlICpVcGRhdGVOb2RlT3BlcmFuZHMoU0ROb2RlICpOLCBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDMsIFNEVmFsdWUgT3A0KTsKKyAgU0ROb2RlICpVcGRhdGVOb2RlT3BlcmFuZHMoU0ROb2RlICpOLCBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDMsIFNEVmFsdWUgT3A0LCBTRFZhbHVlIE9wNSk7CisgIFNETm9kZSAqVXBkYXRlTm9kZU9wZXJhbmRzKFNETm9kZSAqTiwgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzKTsKKworICAvLyBQcm9wYWdhdGVzIHRoZSBjaGFuZ2UgaW4gZGl2ZXJnZW5jZSB0byB1c2VycworICB2b2lkIHVwZGF0ZURpdmVyZ2VuY2UoU0ROb2RlICogTik7CisKKyAgLy8vIFRoZXNlIGFyZSB1c2VkIGZvciB0YXJnZXQgc2VsZWN0b3JzIHRvICptdXRhdGUqIHRoZQorICAvLy8gc3BlY2lmaWVkIG5vZGUgdG8gaGF2ZSB0aGUgc3BlY2lmaWVkIHJldHVybiB0eXBlLCBUYXJnZXQgb3Bjb2RlLCBhbmQKKyAgLy8vIG9wZXJhbmRzLiAgTm90ZSB0aGF0IHRhcmdldCBvcGNvZGVzIGFyZSBzdG9yZWQgYXMKKyAgLy8vIH5UYXJnZXRPcGNvZGUgaW4gdGhlIG5vZGUgb3Bjb2RlIGZpZWxkLiAgVGhlIHJlc3VsdGFudCBub2RlIGlzIHJldHVybmVkLgorICBTRE5vZGUgKlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIFRhcmdldE9wYywgRVZUIFZUKTsKKyAgU0ROb2RlICpTZWxlY3ROb2RlVG8oU0ROb2RlICpOLCB1bnNpZ25lZCBUYXJnZXRPcGMsIEVWVCBWVCwgU0RWYWx1ZSBPcDEpOworICBTRE5vZGUgKlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIFRhcmdldE9wYywgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIpOworICBTRE5vZGUgKlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIFRhcmdldE9wYywgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIsIFNEVmFsdWUgT3AzKTsKKyAgU0ROb2RlICpTZWxlY3ROb2RlVG8oU0ROb2RlICpOLCB1bnNpZ25lZCBUYXJnZXRPcGMsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzKTsKKyAgU0ROb2RlICpTZWxlY3ROb2RlVG8oU0ROb2RlICpOLCB1bnNpZ25lZCBUYXJnZXRPcGMsIEVWVCBWVDEsIEVWVCBWVDIpOworICBTRE5vZGUgKlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIFRhcmdldE9wYywgRVZUIFZUMSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUMiwgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzKTsKKyAgU0ROb2RlICpTZWxlY3ROb2RlVG8oU0ROb2RlICpOLCB1bnNpZ25lZCBUYXJnZXRPcGMsIEVWVCBWVDEsCisgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDIsIEVWVCBWVDMsIEFycmF5UmVmPFNEVmFsdWU+IE9wcyk7CisgIFNETm9kZSAqU2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgVGFyZ2V0T3BjLCBFVlQgVlQxLAorICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQyLCBTRFZhbHVlIE9wMSk7CisgIFNETm9kZSAqU2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgVGFyZ2V0T3BjLCBFVlQgVlQxLAorICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQyLCBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIpOworICBTRE5vZGUgKlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIFRhcmdldE9wYywgU0RWVExpc3QgVlRzLAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTRFZhbHVlPiBPcHMpOworCisgIC8vLyBUaGlzICptdXRhdGVzKiB0aGUgc3BlY2lmaWVkIG5vZGUgdG8gaGF2ZSB0aGUgc3BlY2lmaWVkCisgIC8vLyByZXR1cm4gdHlwZSwgb3Bjb2RlLCBhbmQgb3BlcmFuZHMuCisgIFNETm9kZSAqTW9ycGhOb2RlVG8oU0ROb2RlICpOLCB1bnNpZ25lZCBPcGMsIFNEVlRMaXN0IFZUcywKKyAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTRFZhbHVlPiBPcHMpOworCisgIC8vLyBNdXRhdGUgdGhlIHNwZWNpZmllZCBzdHJpY3QgRlAgbm9kZSB0byBpdHMgbm9uLXN0cmljdCBlcXVpdmFsZW50LAorICAvLy8gdW5saW5raW5nIHRoZSBub2RlIGZyb20gaXRzIGNoYWluIGFuZCBkcm9wcGluZyB0aGUgbWV0YWRhdGEgYXJndW1lbnRzLgorICAvLy8gVGhlIG5vZGUgbXVzdCBiZSBhIHN0cmljdCBGUCBub2RlLgorICBTRE5vZGUgKm11dGF0ZVN0cmljdEZQVG9GUChTRE5vZGUgKk5vZGUpOworCisgIC8vLyBUaGVzZSBhcmUgdXNlZCBmb3IgdGFyZ2V0IHNlbGVjdG9ycyB0byBjcmVhdGUgYSBuZXcgbm9kZQorICAvLy8gd2l0aCBzcGVjaWZpZWQgcmV0dXJuIHR5cGUocyksIE1hY2hpbmVJbnN0ciBvcGNvZGUsIGFuZCBvcGVyYW5kcy4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgZ2V0TWFjaGluZU5vZGUgcmV0dXJucyB0aGUgcmVzdWx0YW50IG5vZGUuICBJZiB0aGVyZSBpcyBhbHJlYWR5CisgIC8vLyBhIG5vZGUgb2YgdGhlIHNwZWNpZmllZCBvcGNvZGUgYW5kIG9wZXJhbmRzLCBpdCByZXR1cm5zIHRoYXQgbm9kZSBpbnN0ZWFkCisgIC8vLyBvZiB0aGUgY3VycmVudCBvbmUuCisgIE1hY2hpbmVTRE5vZGUgKmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJmRsLCBFVlQgVlQpOworICBNYWNoaW5lU0ROb2RlICpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZkbCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMSk7CisgIE1hY2hpbmVTRE5vZGUgKmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJmRsLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMik7CisgIE1hY2hpbmVTRE5vZGUgKmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJmRsLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMiwgU0RWYWx1ZSBPcDMpOworICBNYWNoaW5lU0ROb2RlICpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZkbCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTRFZhbHVlPiBPcHMpOworICBNYWNoaW5lU0ROb2RlICpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZkbCwgRVZUIFZUMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUMiwgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyKTsKKyAgTWFjaGluZVNETm9kZSAqZ2V0TWFjaGluZU5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmZGwsIEVWVCBWVDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDIsIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMiwgU0RWYWx1ZSBPcDMpOworICBNYWNoaW5lU0ROb2RlICpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZkbCwgRVZUIFZUMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUMiwgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzKTsKKyAgTWFjaGluZVNETm9kZSAqZ2V0TWFjaGluZU5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmZGwsIEVWVCBWVDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDIsIEVWVCBWVDMsIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMik7CisgIE1hY2hpbmVTRE5vZGUgKmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJmRsLCBFVlQgVlQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQyLCBFVlQgVlQzLCBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AzKTsKKyAgTWFjaGluZVNETm9kZSAqZ2V0TWFjaGluZU5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmZGwsIEVWVCBWVDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDIsIEVWVCBWVDMsIEFycmF5UmVmPFNEVmFsdWU+IE9wcyk7CisgIE1hY2hpbmVTRE5vZGUgKmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJmRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFVlQ+IFJlc3VsdFR5cywgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzKTsKKyAgTWFjaGluZVNETm9kZSAqZ2V0TWFjaGluZU5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmZGwsIFNEVlRMaXN0IFZUcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzKTsKKworICAvLy8gQSBjb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgVGFyZ2V0SW5zdHJJbmZvOjpFWFRSQUNUX1NVQlJFRyBub2Rlcy4KKyAgU0RWYWx1ZSBnZXRUYXJnZXRFeHRyYWN0U3VicmVnKGludCBTUklkeCwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wZXJhbmQpOworCisgIC8vLyBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBUYXJnZXRJbnN0ckluZm86OklOU0VSVF9TVUJSRUcgbm9kZXMuCisgIFNEVmFsdWUgZ2V0VGFyZ2V0SW5zZXJ0U3VicmVnKGludCBTUklkeCwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3BlcmFuZCwgU0RWYWx1ZSBTdWJyZWcpOworCisgIC8vLyBHZXQgdGhlIHNwZWNpZmllZCBub2RlIGlmIGl0J3MgYWxyZWFkeSBhdmFpbGFibGUsIG9yIGVsc2UgcmV0dXJuIE5VTEwuCisgIFNETm9kZSAqZ2V0Tm9kZUlmRXhpc3RzKHVuc2lnbmVkIE9wY29kZSwgU0RWVExpc3QgVlRzLCBBcnJheVJlZjxTRFZhbHVlPiBPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNETm9kZUZsYWdzIEZsYWdzID0gU0ROb2RlRmxhZ3MoKSk7CisKKyAgLy8vIENyZWF0ZXMgYSBTRERiZ1ZhbHVlIG5vZGUuCisgIFNERGJnVmFsdWUgKmdldERiZ1ZhbHVlKERJVmFyaWFibGUgKlZhciwgRElFeHByZXNzaW9uICpFeHByLCBTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFIsIGJvb2wgSXNJbmRpcmVjdCwgY29uc3QgRGVidWdMb2MgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPKTsKKworICAvLy8gQ3JlYXRlcyBhIGNvbnN0YW50IFNERGJnVmFsdWUgbm9kZS4KKyAgU0REYmdWYWx1ZSAqZ2V0Q29uc3RhbnREYmdWYWx1ZShESVZhcmlhYmxlICpWYXIsIERJRXhwcmVzc2lvbiAqRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqQywgY29uc3QgRGVidWdMb2MgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE8pOworCisgIC8vLyBDcmVhdGVzIGEgRnJhbWVJbmRleCBTRERiZ1ZhbHVlIG5vZGUuCisgIFNERGJnVmFsdWUgKmdldEZyYW1lSW5kZXhEYmdWYWx1ZShESVZhcmlhYmxlICpWYXIsIERJRXhwcmVzc2lvbiAqRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZJLCBjb25zdCBEZWJ1Z0xvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPKTsKKworICAvLy8gVHJhbnNmZXIgZGVidWcgdmFsdWVzIGZyb20gb25lIG5vZGUgdG8gYW5vdGhlciwgd2hpbGUgb3B0aW9uYWxseQorICAvLy8gZ2VuZXJhdGluZyBmcmFnbWVudCBleHByZXNzaW9ucyBmb3Igc3BsaXQtdXAgdmFsdWVzLiBJZiBccCBJbnZhbGlkYXRlRGJnCisgIC8vLyBpcyBzZXQsIGRlYnVnIHZhbHVlcyBhcmUgaW52YWxpZGF0ZWQgYWZ0ZXIgdGhleSBhcmUgdHJhbnNmZXJyZWQuCisgIHZvaWQgdHJhbnNmZXJEYmdWYWx1ZXMoU0RWYWx1ZSBGcm9tLCBTRFZhbHVlIFRvLCB1bnNpZ25lZCBPZmZzZXRJbkJpdHMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNpemVJbkJpdHMgPSAwLCBib29sIEludmFsaWRhdGVEYmcgPSB0cnVlKTsKKworICAvLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbm9kZSBmcm9tIHRoZSBzeXN0ZW0uIElmIGFueSBvZiBpdHMKKyAgLy8vIG9wZXJhbmRzIHRoZW4gYmVjb21lcyBkZWFkLCByZW1vdmUgdGhlbSBhcyB3ZWxsLiBJbmZvcm0gVXBkYXRlTGlzdGVuZXIKKyAgLy8vIGZvciBlYWNoIG5vZGUgZGVsZXRlZC4KKyAgdm9pZCBSZW1vdmVEZWFkTm9kZShTRE5vZGUgKk4pOworCisgIC8vLyBUaGlzIG1ldGhvZCBkZWxldGVzIHRoZSB1bnJlYWNoYWJsZSBub2RlcyBpbiB0aGUKKyAgLy8vIGdpdmVuIGxpc3QsIGFuZCBhbnkgbm9kZXMgdGhhdCBiZWNvbWUgdW5yZWFjaGFibGUgYXMgYSByZXN1bHQuCisgIHZvaWQgUmVtb3ZlRGVhZE5vZGVzKFNtYWxsVmVjdG9ySW1wbDxTRE5vZGUgKj4gJkRlYWROb2Rlcyk7CisKKyAgLy8vIE1vZGlmeSBhbnl0aGluZyB1c2luZyAnRnJvbScgdG8gdXNlICdUbycgaW5zdGVhZC4KKyAgLy8vIFRoaXMgY2FuIGNhdXNlIHJlY3Vyc2l2ZSBtZXJnaW5nIG9mIG5vZGVzIGluIHRoZSBEQUcuICBVc2UgdGhlIGZpcnN0CisgIC8vLyB2ZXJzaW9uIGlmICdGcm9tJyBpcyBrbm93biB0byBoYXZlIGEgc2luZ2xlIHJlc3VsdCwgdXNlIHRoZSBzZWNvbmQKKyAgLy8vIGlmIHlvdSBoYXZlIHR3byBub2RlcyB3aXRoIGlkZW50aWNhbCByZXN1bHRzIChvciBpZiAnVG8nIGhhcyBhIHN1cGVyc2V0CisgIC8vLyBvZiB0aGUgcmVzdWx0cyBvZiAnRnJvbScpLCB1c2UgdGhlIHRoaXJkIG90aGVyd2lzZS4KKyAgLy8vCisgIC8vLyBUaGVzZSBtZXRob2RzIGFsbCB0YWtlIGFuIG9wdGlvbmFsIFVwZGF0ZUxpc3RlbmVyLCB3aGljaCAoaWYgbm90IG51bGwpIGlzCisgIC8vLyBpbmZvcm1lZCBhYm91dCBub2RlcyB0aGF0IGFyZSBkZWxldGVkIGFuZCBtb2RpZmllZCBkdWUgdG8gcmVjdXJzaXZlCisgIC8vLyBjaGFuZ2VzIGluIHRoZSBkYWcuCisgIC8vLworICAvLy8gVGhlc2UgZnVuY3Rpb25zIG9ubHkgcmVwbGFjZSBhbGwgZXhpc3RpbmcgdXNlcy4gSXQncyBwb3NzaWJsZSB0aGF0IGFzCisgIC8vLyB0aGVzZSByZXBsYWNlbWVudHMgYXJlIGJlaW5nIHBlcmZvcm1lZCwgQ1NFIG1heSBjYXVzZSB0aGUgRnJvbSBub2RlCisgIC8vLyB0byBiZSBnaXZlbiBuZXcgdXNlcy4gVGhlc2UgbmV3IHVzZXMgb2YgRnJvbSBhcmUgbGVmdCBpbiBwbGFjZSwgYW5kCisgIC8vLyBub3QgYXV0b21hdGljYWxseSB0cmFuc2ZlcnJlZCB0byBUby4KKyAgLy8vCisgIHZvaWQgUmVwbGFjZUFsbFVzZXNXaXRoKFNEVmFsdWUgRnJvbSwgU0RWYWx1ZSBPcCk7CisgIHZvaWQgUmVwbGFjZUFsbFVzZXNXaXRoKFNETm9kZSAqRnJvbSwgU0ROb2RlICpUbyk7CisgIHZvaWQgUmVwbGFjZUFsbFVzZXNXaXRoKFNETm9kZSAqRnJvbSwgY29uc3QgU0RWYWx1ZSAqVG8pOworCisgIC8vLyBSZXBsYWNlIGFueSB1c2VzIG9mIEZyb20gd2l0aCBUbywgbGVhdmluZworICAvLy8gdXNlcyBvZiBvdGhlciB2YWx1ZXMgcHJvZHVjZWQgYnkgRnJvbS5nZXROb2RlKCkgYWxvbmUuCisgIHZvaWQgUmVwbGFjZUFsbFVzZXNPZlZhbHVlV2l0aChTRFZhbHVlIEZyb20sIFNEVmFsdWUgVG8pOworCisgIC8vLyBMaWtlIFJlcGxhY2VBbGxVc2VzT2ZWYWx1ZVdpdGgsIGJ1dCBmb3IgbXVsdGlwbGUgdmFsdWVzIGF0IG9uY2UuCisgIC8vLyBUaGlzIGNvcnJlY3RseSBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlCisgIC8vLyB0aGVyZSBpcyBhbiBvdmVybGFwIGJldHdlZW4gdGhlIEZyb20gdmFsdWVzIGFuZCB0aGUgVG8gdmFsdWVzLgorICB2b2lkIFJlcGxhY2VBbGxVc2VzT2ZWYWx1ZXNXaXRoKGNvbnN0IFNEVmFsdWUgKkZyb20sIGNvbnN0IFNEVmFsdWUgKlRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bSk7CisKKyAgLy8vIElmIGFuIGV4aXN0aW5nIGxvYWQgaGFzIHVzZXMgb2YgaXRzIGNoYWluLCBjcmVhdGUgYSB0b2tlbiBmYWN0b3Igbm9kZSB3aXRoCisgIC8vLyB0aGF0IGNoYWluIGFuZCB0aGUgbmV3IG1lbW9yeSBub2RlJ3MgY2hhaW4gYW5kIHVwZGF0ZSB1c2VycyBvZiB0aGUgb2xkCisgIC8vLyBjaGFpbiB0byB0aGUgdG9rZW4gZmFjdG9yLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbmV3IG1lbW9yeSBub2RlIHdpbGwgaGF2ZQorICAvLy8gdGhlIHNhbWUgcmVsYXRpdmUgbWVtb3J5IGRlcGVuZGVuY3kgcG9zaXRpb24gYXMgdGhlIG9sZCBsb2FkLiBSZXR1cm5zIHRoZQorICAvLy8gbmV3IG1lcmdlZCBsb2FkIGNoYWluLgorICBTRFZhbHVlIG1ha2VFcXVpdmFsZW50TWVtb3J5T3JkZXJpbmcoTG9hZFNETm9kZSAqT2xkLCBTRFZhbHVlIE5ldyk7CisKKyAgLy8vIFRvcG9sb2dpY2FsLXNvcnQgdGhlIEFsbE5vZGVzIGxpc3QgYW5kIGEKKyAgLy8vIGFzc2lnbiBhIHVuaXF1ZSBub2RlIGlkIGZvciBlYWNoIG5vZGUgaW4gdGhlIERBRyBiYXNlZCBvbiB0aGVpcgorICAvLy8gdG9wb2xvZ2ljYWwgb3JkZXIuIFJldHVybnMgdGhlIG51bWJlciBvZiBub2Rlcy4KKyAgdW5zaWduZWQgQXNzaWduVG9wb2xvZ2ljYWxPcmRlcigpOworCisgIC8vLyBNb3ZlIG5vZGUgTiBpbiB0aGUgQWxsTm9kZXMgbGlzdCB0byBiZSBpbW1lZGlhdGVseQorICAvLy8gYmVmb3JlIHRoZSBnaXZlbiBpdGVyYXRvciBQb3NpdGlvbi4gVGhpcyBtYXkgYmUgdXNlZCB0byB1cGRhdGUgdGhlCisgIC8vLyB0b3BvbG9naWNhbCBvcmRlcmluZyB3aGVuIHRoZSBsaXN0IG9mIG5vZGVzIGlzIG1vZGlmaWVkLgorICB2b2lkIFJlcG9zaXRpb25Ob2RlKGFsbG5vZGVzX2l0ZXJhdG9yIFBvc2l0aW9uLCBTRE5vZGUgKk4pIHsKKyAgICBBbGxOb2Rlcy5pbnNlcnQoUG9zaXRpb24sIEFsbE5vZGVzLnJlbW92ZShOKSk7CisgIH0KKworICAvLy8gUmV0dXJucyBhbiBBUEZsb2F0IHNlbWFudGljcyB0YWcgYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiB0eXBlLiBJZiBWVCBpcworICAvLy8gYSB2ZWN0b3IgdHlwZSwgdGhlIGVsZW1lbnQgc2VtYW50aWNzIGFyZSByZXR1cm5lZC4KKyAgc3RhdGljIGNvbnN0IGZsdFNlbWFudGljcyAmRVZUVG9BUEZsb2F0U2VtYW50aWNzKEVWVCBWVCkgeworICAgIHN3aXRjaCAoVlQuZ2V0U2NhbGFyVHlwZSgpLmdldFNpbXBsZVZUKCkuU2ltcGxlVHkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIEZQIGZvcm1hdCIpOworICAgIGNhc2UgTVZUOjpmMTY6ICAgICByZXR1cm4gQVBGbG9hdDo6SUVFRWhhbGYoKTsKKyAgICBjYXNlIE1WVDo6ZjMyOiAgICAgcmV0dXJuIEFQRmxvYXQ6OklFRUVzaW5nbGUoKTsKKyAgICBjYXNlIE1WVDo6ZjY0OiAgICAgcmV0dXJuIEFQRmxvYXQ6OklFRUVkb3VibGUoKTsKKyAgICBjYXNlIE1WVDo6ZjgwOiAgICAgcmV0dXJuIEFQRmxvYXQ6Ong4N0RvdWJsZUV4dGVuZGVkKCk7CisgICAgY2FzZSBNVlQ6OmYxMjg6ICAgIHJldHVybiBBUEZsb2F0OjpJRUVFcXVhZCgpOworICAgIGNhc2UgTVZUOjpwcGNmMTI4OiByZXR1cm4gQVBGbG9hdDo6UFBDRG91YmxlRG91YmxlKCk7CisgICAgfQorICB9CisKKyAgLy8vIEFkZCBhIGRiZ192YWx1ZSBTRE5vZGUuIElmIFNEIGlzIG5vbi1udWxsIHRoYXQgbWVhbnMgdGhlCisgIC8vLyB2YWx1ZSBpcyBwcm9kdWNlZCBieSBTRC4KKyAgdm9pZCBBZGREYmdWYWx1ZShTRERiZ1ZhbHVlICpEQiwgU0ROb2RlICpTRCwgYm9vbCBpc1BhcmFtZXRlcik7CisKKyAgLy8vIEdldCB0aGUgZGVidWcgdmFsdWVzIHdoaWNoIHJlZmVyZW5jZSB0aGUgZ2l2ZW4gU0ROb2RlLgorICBBcnJheVJlZjxTRERiZ1ZhbHVlKj4gR2V0RGJnVmFsdWVzKGNvbnN0IFNETm9kZSogU0QpIHsKKyAgICByZXR1cm4gRGJnSW5mby0+Z2V0U0REYmdWYWx1ZXMoU0QpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgU0REYmdWYWx1ZSBub2RlcyBhc3NvY2lhdGVkCisgIC8vLyB3aXRoIHRoaXMgU2VsZWN0aW9uREFHLgorICBib29sIGhhc0RlYnVnVmFsdWVzKCkgY29uc3QgeyByZXR1cm4gIURiZ0luZm8tPmVtcHR5KCk7IH0KKworICBTRERiZ0luZm86OkRiZ0l0ZXJhdG9yIERiZ0JlZ2luKCkgeyByZXR1cm4gRGJnSW5mby0+RGJnQmVnaW4oKTsgfQorICBTRERiZ0luZm86OkRiZ0l0ZXJhdG9yIERiZ0VuZCgpICAgeyByZXR1cm4gRGJnSW5mby0+RGJnRW5kKCk7IH0KKworICBTRERiZ0luZm86OkRiZ0l0ZXJhdG9yIEJ5dmFsUGFybURiZ0JlZ2luKCkgeworICAgIHJldHVybiBEYmdJbmZvLT5CeXZhbFBhcm1EYmdCZWdpbigpOworICB9CisKKyAgU0REYmdJbmZvOjpEYmdJdGVyYXRvciBCeXZhbFBhcm1EYmdFbmQoKSAgIHsKKyAgICByZXR1cm4gRGJnSW5mby0+Qnl2YWxQYXJtRGJnRW5kKCk7CisgIH0KKworICAvLy8gVG8gYmUgaW52b2tlZCBvbiBhbiBTRE5vZGUgdGhhdCBpcyBzbGF0ZWQgdG8gYmUgZXJhc2VkLiBUaGlzCisgIC8vLyBmdW5jdGlvbiBtaXJyb3JzIFxjIGxsdm06OnNhbHZhZ2VEZWJ1Z0luZm8uCisgIHZvaWQgc2FsdmFnZURlYnVnSW5mbyhTRE5vZGUgJk4pOworCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBDcmVhdGUgYSBzdGFjayB0ZW1wb3JhcnksIHN1aXRhYmxlIGZvciBob2xkaW5nIHRoZSBzcGVjaWZpZWQgdmFsdWUgdHlwZS4KKyAgLy8vIElmIG1pbkFsaWduIGlzIHNwZWNpZmllZCwgdGhlIHNsb3Qgc2l6ZSB3aWxsIGhhdmUgYXQgbGVhc3QgdGhhdCBhbGlnbm1lbnQuCisgIFNEVmFsdWUgQ3JlYXRlU3RhY2tUZW1wb3JhcnkoRVZUIFZULCB1bnNpZ25lZCBtaW5BbGlnbiA9IDEpOworCisgIC8vLyBDcmVhdGUgYSBzdGFjayB0ZW1wb3Jhcnkgc3VpdGFibGUgZm9yIGhvbGRpbmcgZWl0aGVyIG9mIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHZhbHVlIHR5cGVzLgorICBTRFZhbHVlIENyZWF0ZVN0YWNrVGVtcG9yYXJ5KEVWVCBWVDEsIEVWVCBWVDIpOworCisgIFNEVmFsdWUgRm9sZFN5bWJvbE9mZnNldCh1bnNpZ25lZCBPcGNvZGUsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0ROb2RlICpOMik7CisKKyAgU0RWYWx1ZSBGb2xkQ29uc3RhbnRBcml0aG1ldGljKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRE5vZGUgKkNzdDEsIFNETm9kZSAqQ3N0Mik7CisKKyAgU0RWYWx1ZSBGb2xkQ29uc3RhbnRBcml0aG1ldGljKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25zdGFudFNETm9kZSAqQ3N0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN0YW50U0ROb2RlICpDc3QyKTsKKworICBTRFZhbHVlIEZvbGRDb25zdGFudFZlY3RvckFyaXRobWV0aWModW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNEVmFsdWU+IE9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNETm9kZUZsYWdzIEZsYWdzID0gU0ROb2RlRmxhZ3MoKSk7CisKKyAgLy8vIENvbnN0YW50IGZvbGQgYSBzZXRjYyB0byB0cnVlIG9yIGZhbHNlLgorICBTRFZhbHVlIEZvbGRTZXRDQyhFVlQgVlQsIFNEVmFsdWUgTjEsIFNEVmFsdWUgTjIsIElTRDo6Q29uZENvZGUgQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RMb2MgJmRsKTsKKworICAvLy8gU2VlIGlmIHRoZSBzcGVjaWZpZWQgb3BlcmFuZCBjYW4gYmUgc2ltcGxpZmllZCB3aXRoIHRoZSBrbm93bGVkZ2UgdGhhdCBvbmx5CisgIC8vLyB0aGUgYml0cyBzcGVjaWZpZWQgYnkgTWFzayBhcmUgdXNlZC4gIElmIHNvLCByZXR1cm4gdGhlIHNpbXBsZXIgb3BlcmFuZCwKKyAgLy8vIG90aGVyd2lzZSByZXR1cm4gYSBudWxsIFNEVmFsdWUuCisgIC8vLworICAvLy8gKFRoaXMgZXhpc3RzIGFsb25nc2lkZSBTaW1wbGlmeURlbWFuZGVkQml0cyBiZWNhdXNlIEdldERlbWFuZGVkQml0cyBjYW4KKyAgLy8vIHNpbXBsaWZ5IG5vZGVzIHdpdGggbXVsdGlwbGUgdXNlcyBtb3JlIGFnZ3Jlc3NpdmVseS4pCisgIFNEVmFsdWUgR2V0RGVtYW5kZWRCaXRzKFNEVmFsdWUgViwgY29uc3QgQVBJbnQgJk1hc2spOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc2lnbiBiaXQgb2YgT3AgaXMga25vd24gdG8gYmUgemVyby4KKyAgLy8vIFdlIHVzZSB0aGlzIHByZWRpY2F0ZSB0byBzaW1wbGlmeSBvcGVyYXRpb25zIGRvd25zdHJlYW0uCisgIGJvb2wgU2lnbkJpdElzWmVybyhTRFZhbHVlIE9wLCB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiAnT3AgJiBNYXNrJyBpcyBrbm93biB0byBiZSB6ZXJvLiAgV2UKKyAgLy8vIHVzZSB0aGlzIHByZWRpY2F0ZSB0byBzaW1wbGlmeSBvcGVyYXRpb25zIGRvd25zdHJlYW0uICBPcCBhbmQgTWFzayBhcmUKKyAgLy8vIGtub3duIHRvIGJlIHRoZSBzYW1lIHR5cGUuCisgIGJvb2wgTWFza2VkVmFsdWVJc1plcm8oU0RWYWx1ZSBPcCwgY29uc3QgQVBJbnQgJk1hc2ssIHVuc2lnbmVkIERlcHRoID0gMCkKKyAgICBjb25zdDsKKworICAvLy8gRGV0ZXJtaW5lIHdoaWNoIGJpdHMgb2YgT3AgYXJlIGtub3duIHRvIGJlIGVpdGhlciB6ZXJvIG9yIG9uZSBhbmQgcmV0dXJuCisgIC8vLyB0aGVtIGluIEtub3duLiBGb3IgdmVjdG9ycywgdGhlIGtub3duIGJpdHMgYXJlIHRob3NlIHRoYXQgYXJlIHNoYXJlZCBieQorICAvLy8gZXZlcnkgdmVjdG9yIGVsZW1lbnQuCisgIC8vLyBUYXJnZXRzIGNhbiBpbXBsZW1lbnQgdGhlIGNvbXB1dGVLbm93bkJpdHNGb3JUYXJnZXROb2RlIG1ldGhvZCBpbiB0aGUKKyAgLy8vIFRhcmdldExvd2VyaW5nIGNsYXNzIHRvIGFsbG93IHRhcmdldCBub2RlcyB0byBiZSB1bmRlcnN0b29kLgorICB2b2lkIGNvbXB1dGVLbm93bkJpdHMoU0RWYWx1ZSBPcCwgS25vd25CaXRzICZLbm93biwgdW5zaWduZWQgRGVwdGggPSAwKSBjb25zdDsKKworICAvLy8gRGV0ZXJtaW5lIHdoaWNoIGJpdHMgb2YgT3AgYXJlIGtub3duIHRvIGJlIGVpdGhlciB6ZXJvIG9yIG9uZSBhbmQgcmV0dXJuCisgIC8vLyB0aGVtIGluIEtub3duLiBUaGUgRGVtYW5kZWRFbHRzIGFyZ3VtZW50IGFsbG93cyB1cyB0byBvbmx5IGNvbGxlY3QgdGhlCisgIC8vLyBrbm93biBiaXRzIHRoYXQgYXJlIHNoYXJlZCBieSB0aGUgcmVxdWVzdGVkIHZlY3RvciBlbGVtZW50cy4KKyAgLy8vIFRhcmdldHMgY2FuIGltcGxlbWVudCB0aGUgY29tcHV0ZUtub3duQml0c0ZvclRhcmdldE5vZGUgbWV0aG9kIGluIHRoZQorICAvLy8gVGFyZ2V0TG93ZXJpbmcgY2xhc3MgdG8gYWxsb3cgdGFyZ2V0IG5vZGVzIHRvIGJlIHVuZGVyc3Rvb2QuCisgIHZvaWQgY29tcHV0ZUtub3duQml0cyhTRFZhbHVlIE9wLCBLbm93bkJpdHMgJktub3duLCBjb25zdCBBUEludCAmRGVtYW5kZWRFbHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwKSBjb25zdDsKKworICAvLy8gVXNlZCB0byByZXByZXNlbnQgdGhlIHBvc3NpYmxlIG92ZXJmbG93IGJlaGF2aW9yIG9mIGFuIG9wZXJhdGlvbi4KKyAgLy8vIE5ldmVyOiB0aGUgb3BlcmF0aW9uIGNhbm5vdCBvdmVyZmxvdy4KKyAgLy8vIEFsd2F5czogdGhlIG9wZXJhdGlvbiB3aWxsIGFsd2F5cyBvdmVyZmxvdy4KKyAgLy8vIFNvbWV0aW1lOiB0aGUgb3BlcmF0aW9uIG1heSBvciBtYXkgbm90IG92ZXJmbG93LgorICBlbnVtIE92ZXJmbG93S2luZCB7CisgICAgT0ZLX05ldmVyLAorICAgIE9GS19Tb21ldGltZSwKKyAgICBPRktfQWx3YXlzLAorICB9OworCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIHJlc3VsdCBvZiB0aGUgYWRkaXRpb24gb2YgMiBub2RlIGNhbiBvdmVyZmxvdy4KKyAgT3ZlcmZsb3dLaW5kIGNvbXB1dGVPdmVyZmxvd0tpbmQoU0RWYWx1ZSBOMCwgU0RWYWx1ZSBOMSkgY29uc3Q7CisKKyAgLy8vIFRlc3QgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGtub3duIHRvIGhhdmUgZXhhY3RseSBvbmUgYml0IHNldC4gVGhpcyBkaWZmZXJzCisgIC8vLyBmcm9tIGNvbXB1dGVLbm93bkJpdHMgaW4gdGhhdCBpdCBkb2Vzbid0IG5lY2Vzc2FyaWx5IGRldGVybWluZSB3aGljaCBiaXQKKyAgLy8vIGlzIHNldC4KKyAgYm9vbCBpc0tub3duVG9CZUFQb3dlck9mVHdvKFNEVmFsdWUgVmFsKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHNpZ24gYml0IG9mIHRoZSByZWdpc3RlciBpcyByZXBsaWNhdGVkIGludG8KKyAgLy8vIHRoZSBvdGhlciBiaXRzLiBXZSBrbm93IHRoYXQgYXQgbGVhc3QgMSBiaXQgaXMgYWx3YXlzIGVxdWFsIHRvIHRoZSBzaWduCisgIC8vLyBiaXQgKGl0c2VsZiksIGJ1dCBvdGhlciBjYXNlcyBjYW4gZ2l2ZSB1cyBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsCisgIC8vLyBpbW1lZGlhdGVseSBhZnRlciBhbiAiU1JBIFgsIDIiLCB3ZSBrbm93IHRoYXQgdGhlIHRvcCAzIGJpdHMgYXJlIGFsbCBlcXVhbAorICAvLy8gdG8gZWFjaCBvdGhlciwgc28gd2UgcmV0dXJuIDMuIFRhcmdldHMgY2FuIGltcGxlbWVudCB0aGUKKyAgLy8vIENvbXB1dGVOdW1TaWduQml0c0ZvclRhcmdldCBtZXRob2QgaW4gdGhlIFRhcmdldExvd2VyaW5nIGNsYXNzIHRvIGFsbG93CisgIC8vLyB0YXJnZXQgbm9kZXMgdG8gYmUgdW5kZXJzdG9vZC4KKyAgdW5zaWduZWQgQ29tcHV0ZU51bVNpZ25CaXRzKFNEVmFsdWUgT3AsIHVuc2lnbmVkIERlcHRoID0gMCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBzaWduIGJpdCBvZiB0aGUgcmVnaXN0ZXIgaXMgcmVwbGljYXRlZCBpbnRvCisgIC8vLyB0aGUgb3RoZXIgYml0cy4gV2Uga25vdyB0aGF0IGF0IGxlYXN0IDEgYml0IGlzIGFsd2F5cyBlcXVhbCB0byB0aGUgc2lnbgorICAvLy8gYml0IChpdHNlbGYpLCBidXQgb3RoZXIgY2FzZXMgY2FuIGdpdmUgdXMgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLAorICAvLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgYW4gIlNSQSBYLCAyIiwgd2Uga25vdyB0aGF0IHRoZSB0b3AgMyBiaXRzIGFyZSBhbGwgZXF1YWwKKyAgLy8vIHRvIGVhY2ggb3RoZXIsIHNvIHdlIHJldHVybiAzLiBUaGUgRGVtYW5kZWRFbHRzIGFyZ3VtZW50IGFsbG93cworICAvLy8gdXMgdG8gb25seSBjb2xsZWN0IHRoZSBtaW5pbXVtIHNpZ24gYml0cyBvZiB0aGUgcmVxdWVzdGVkIHZlY3RvciBlbGVtZW50cy4KKyAgLy8vIFRhcmdldHMgY2FuIGltcGxlbWVudCB0aGUgQ29tcHV0ZU51bVNpZ25CaXRzRm9yVGFyZ2V0IG1ldGhvZCBpbiB0aGUKKyAgLy8vIFRhcmdldExvd2VyaW5nIGNsYXNzIHRvIGFsbG93IHRhcmdldCBub2RlcyB0byBiZSB1bmRlcnN0b29kLgorICB1bnNpZ25lZCBDb21wdXRlTnVtU2lnbkJpdHMoU0RWYWx1ZSBPcCwgY29uc3QgQVBJbnQgJkRlbWFuZGVkRWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb3BlcmFuZCBpcyBhbiBJU0Q6OkFERCB3aXRoIGEgQ29uc3RhbnRTRE5vZGUKKyAgLy8vIG9uIHRoZSByaWdodC1oYW5kIHNpZGUsIG9yIGlmIGl0IGlzIGFuIElTRDo6T1Igd2l0aCBhIENvbnN0YW50U0ROb2RlIHRoYXQKKyAgLy8vIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgYW4gQURELiBUaGlzIGhhbmRsZXMgdGhlCisgIC8vLyBlcXVpdmFsZW5jZToKKyAgLy8vICAgICBYfENzdCA9PSBYK0NzdCBpZmYgWCZDc3QgPSAwLgorICBib29sIGlzQmFzZVdpdGhDb25zdGFudE9mZnNldChTRFZhbHVlIE9wKSBjb25zdDsKKworICAvLy8gVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBTRFZhbHVlIGlzIGtub3duIHRvIG5ldmVyIGJlIE5hTi4KKyAgYm9vbCBpc0tub3duTmV2ZXJOYU4oU0RWYWx1ZSBPcCkgY29uc3Q7CisKKyAgLy8vIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gU0RWYWx1ZSBpcyBrbm93biB0byBuZXZlciBiZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZQorICAvLy8gemVyby4KKyAgYm9vbCBpc0tub3duTmV2ZXJaZXJvKFNEVmFsdWUgT3ApIGNvbnN0OworCisgIC8vLyBUZXN0IHdoZXRoZXIgdHdvIFNEVmFsdWVzIGFyZSBrbm93biB0byBjb21wYXJlIGVxdWFsLiBUaGlzCisgIC8vLyBpcyB0cnVlIGlmIHRoZXkgYXJlIHRoZSBzYW1lIHZhbHVlLCBvciBpZiBvbmUgaXMgbmVnYXRpdmUgemVybyBhbmQgdGhlCisgIC8vLyBvdGhlciBwb3NpdGl2ZSB6ZXJvLgorICBib29sIGlzRXF1YWxUbyhTRFZhbHVlIEEsIFNEVmFsdWUgQikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIEEgYW5kIEIgaGF2ZSBubyBjb21tb24gYml0cyBzZXQuIEFzIGFuIGV4YW1wbGUsIHRoaXMgY2FuCisgIC8vLyBhbGxvdyBhbiAnYWRkJyB0byBiZSB0cmFuc2Zvcm1lZCBpbnRvIGFuICdvcicuCisgIGJvb2wgaGF2ZU5vQ29tbW9uQml0c1NldChTRFZhbHVlIEEsIFNEVmFsdWUgQikgY29uc3Q7CisKKyAgLy8vIFV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSBsZWdhbGl6ZSBhbmQgbG93ZXJpbmcgdG8KKyAgLy8vICJ1bnJvbGwiIGEgdmVjdG9yIG9wZXJhdGlvbiBieSBzcGxpdHRpbmcgb3V0IHRoZSBzY2FsYXJzIGFuZCBvcGVyYXRpbmcKKyAgLy8vIG9uIGVhY2ggZWxlbWVudCBpbmRpdmlkdWFsbHkuICBJZiB0aGUgUmVzTkUgaXMgMCwgZnVsbHkgdW5yb2xsIHRoZSB2ZWN0b3IKKyAgLy8vIG9wLiBJZiBSZXNORSBpcyBsZXNzIHRoYW4gdGhlIHdpZHRoIG9mIHRoZSB2ZWN0b3Igb3AsIHVucm9sbCB1cCB0byBSZXNORS4KKyAgLy8vIElmIHRoZSAgUmVzTkUgaXMgZ3JlYXRlciB0aGFuIHRoZSB3aWR0aCBvZiB0aGUgdmVjdG9yIG9wLCB1bnJvbGwgdGhlCisgIC8vLyB2ZWN0b3Igb3AgYW5kIGZpbGwgdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHZlY3RvciB3aXRoIFVOREVGUy4KKyAgU0RWYWx1ZSBVbnJvbGxWZWN0b3JPcChTRE5vZGUgKk4sIHVuc2lnbmVkIFJlc05FID0gMCk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGxvYWRzIGFyZSBuZXh0IHRvIGVhY2ggb3RoZXIgYW5kIGNhbiBiZQorICAvLy8gbWVyZ2VkLiBDaGVjayB0aGF0IGJvdGggYXJlIG5vbnZvbGF0aWxlIGFuZCBpZiBMRCBpcyBsb2FkaW5nCisgIC8vLyAnQnl0ZXMnIGJ5dGVzIGZyb20gYSBsb2NhdGlvbiB0aGF0IGlzICdEaXN0JyB1bml0cyBhd2F5IGZyb20gdGhlCisgIC8vLyBsb2NhdGlvbiB0aGF0IHRoZSAnQmFzZScgbG9hZCBpcyBsb2FkaW5nIGZyb20uCisgIGJvb2wgYXJlTm9uVm9sYXRpbGVDb25zZWN1dGl2ZUxvYWRzKExvYWRTRE5vZGUgKkxELCBMb2FkU0ROb2RlICpCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlcywgaW50IERpc3QpIGNvbnN0OworCisgIC8vLyBJbmZlciBhbGlnbm1lbnQgb2YgYSBsb2FkIC8gc3RvcmUgYWRkcmVzcy4gUmV0dXJuIDAgaWYKKyAgLy8vIGl0IGNhbm5vdCBiZSBpbmZlcnJlZC4KKyAgdW5zaWduZWQgSW5mZXJQdHJBbGlnbm1lbnQoU0RWYWx1ZSBQdHIpIGNvbnN0OworCisgIC8vLyBDb21wdXRlIHRoZSBWVHMgbmVlZGVkIGZvciB0aGUgbG93L2hpIHBhcnRzIG9mIGEgdHlwZQorICAvLy8gd2hpY2ggaXMgc3BsaXQgKG9yIGV4cGFuZGVkKSBpbnRvIHR3byBub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsIHBpZWNlcy4KKyAgc3RkOjpwYWlyPEVWVCwgRVZUPiBHZXRTcGxpdERlc3RWVHMoY29uc3QgRVZUICZWVCkgY29uc3Q7CisKKyAgLy8vIFNwbGl0IHRoZSB2ZWN0b3Igd2l0aCBFWFRSQUNUX1NVQlZFQ1RPUiB1c2luZyB0aGUgcHJvdmlkZXMKKyAgLy8vIFZUcyBhbmQgcmV0dXJuIHRoZSBsb3cvaGlnaCBwYXJ0LgorICBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4gU3BsaXRWZWN0b3IoY29uc3QgU0RWYWx1ZSAmTiwgY29uc3QgU0RMb2MgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVZUICZMb1ZULCBjb25zdCBFVlQgJkhpVlQpOworCisgIC8vLyBTcGxpdCB0aGUgdmVjdG9yIHdpdGggRVhUUkFDVF9TVUJWRUNUT1IgYW5kIHJldHVybiB0aGUgbG93L2hpZ2ggcGFydC4KKyAgc3RkOjpwYWlyPFNEVmFsdWUsIFNEVmFsdWU+IFNwbGl0VmVjdG9yKGNvbnN0IFNEVmFsdWUgJk4sIGNvbnN0IFNETG9jICZETCkgeworICAgIEVWVCBMb1ZULCBIaVZUOworICAgIHN0ZDo6dGllKExvVlQsIEhpVlQpID0gR2V0U3BsaXREZXN0VlRzKE4uZ2V0VmFsdWVUeXBlKCkpOworICAgIHJldHVybiBTcGxpdFZlY3RvcihOLCBETCwgTG9WVCwgSGlWVCk7CisgIH0KKworICAvLy8gU3BsaXQgdGhlIG5vZGUncyBvcGVyYW5kIHdpdGggRVhUUkFDVF9TVUJWRUNUT1IgYW5kCisgIC8vLyByZXR1cm4gdGhlIGxvdy9oaWdoIHBhcnQuCisgIHN0ZDo6cGFpcjxTRFZhbHVlLCBTRFZhbHVlPiBTcGxpdFZlY3Rvck9wZXJhbmQoY29uc3QgU0ROb2RlICpOLCB1bnNpZ25lZCBPcE5vKQorICB7CisgICAgcmV0dXJuIFNwbGl0VmVjdG9yKE4tPmdldE9wZXJhbmQoT3BObyksIFNETG9jKE4pKTsKKyAgfQorCisgIC8vLyBBcHBlbmQgdGhlIGV4dHJhY3RlZCBlbGVtZW50cyBmcm9tIFN0YXJ0IHRvIENvdW50IG91dCBvZiB0aGUgdmVjdG9yIE9wCisgIC8vLyBpbiBBcmdzLiBJZiBDb3VudCBpcyAwLCBhbGwgb2YgdGhlIGVsZW1lbnRzIHdpbGwgYmUgZXh0cmFjdGVkLgorICB2b2lkIEV4dHJhY3RWZWN0b3JFbGVtZW50cyhTRFZhbHVlIE9wLCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFN0YXJ0ID0gMCwgdW5zaWduZWQgQ291bnQgPSAwKTsKKworICAvLy8gQ29tcHV0ZSB0aGUgZGVmYXVsdCBhbGlnbm1lbnQgdmFsdWUgZm9yIHRoZSBnaXZlbiB0eXBlLgorICB1bnNpZ25lZCBnZXRFVlRBbGlnbm1lbnQoRVZUIE1lbW9yeVZUKSBjb25zdDsKKworICAvLy8gVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIGNvbnN0YW50IGludCBvciBzaW1pbGFyIG5vZGUuCisgIFNETm9kZSAqaXNDb25zdGFudEludEJ1aWxkVmVjdG9yT3JDb25zdGFudEludChTRFZhbHVlIE4pOworCisgIC8vLyBUZXN0IHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgY29uc3RhbnQgRlAgb3Igc2ltaWxhciBub2RlLgorICBTRE5vZGUgKmlzQ29uc3RhbnRGUEJ1aWxkVmVjdG9yT3JDb25zdGFudEZQKFNEVmFsdWUgTik7CisKKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgXHAgTiBpcyBhbnkga2luZCBvZiBjb25zdGFudCBvciBidWlsZF92ZWN0b3Igb2YKKyAgLy8vIGNvbnN0YW50cywgaW50IG9yIGZsb2F0LiBJZiBhIHZlY3RvciwgaXQgbWF5IG5vdCBuZWNlc3NhcmlseSBiZSBhIHNwbGF0LgorICBpbmxpbmUgYm9vbCBpc0NvbnN0YW50VmFsdWVPZkFueVR5cGUoU0RWYWx1ZSBOKSB7CisgICAgcmV0dXJuIGlzQ29uc3RhbnRJbnRCdWlsZFZlY3Rvck9yQ29uc3RhbnRJbnQoTikgfHwKKyAgICAgICAgICAgaXNDb25zdGFudEZQQnVpbGRWZWN0b3JPckNvbnN0YW50RlAoTik7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBJbnNlcnROb2RlKFNETm9kZSAqTik7CisgIGJvb2wgUmVtb3ZlTm9kZUZyb21DU0VNYXBzKFNETm9kZSAqTik7CisgIHZvaWQgQWRkTW9kaWZpZWROb2RlVG9DU0VNYXBzKFNETm9kZSAqTik7CisgIFNETm9kZSAqRmluZE1vZGlmaWVkTm9kZVNsb3QoU0ROb2RlICpOLCBTRFZhbHVlIE9wLCB2b2lkIComSW5zZXJ0UG9zKTsKKyAgU0ROb2RlICpGaW5kTW9kaWZpZWROb2RlU2xvdChTRE5vZGUgKk4sIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIComSW5zZXJ0UG9zKTsKKyAgU0ROb2RlICpGaW5kTW9kaWZpZWROb2RlU2xvdChTRE5vZGUgKk4sIEFycmF5UmVmPFNEVmFsdWU+IE9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIComSW5zZXJ0UG9zKTsKKyAgU0ROb2RlICpVcGRhdGVTRExvY09uTWVyZ2VTRE5vZGUoU0ROb2RlICpOLCBjb25zdCBTRExvYyAmbG9jKTsKKworICB2b2lkIERlbGV0ZU5vZGVOb3RJbkNTRU1hcHMoU0ROb2RlICpOKTsKKyAgdm9pZCBEZWFsbG9jYXRlTm9kZShTRE5vZGUgKk4pOworCisgIHZvaWQgYWxsbm9kZXNfY2xlYXIoKTsKKworICAvLy8gTG9vayB1cCB0aGUgbm9kZSBzcGVjaWZpZWQgYnkgSUQgaW4gQ1NFTWFwLiAgSWYgaXQgZXhpc3RzLCByZXR1cm4gaXQuICBJZgorICAvLy8gbm90LCByZXR1cm4gdGhlIGluc2VydGlvbiB0b2tlbiB0aGF0IHdpbGwgbWFrZSBpbnNlcnRpb24gZmFzdGVyLiAgVGhpcworICAvLy8gb3ZlcmxvYWQgaXMgZm9yIG5vZGVzIG90aGVyIHRoYW4gQ29uc3RhbnQgb3IgQ29uc3RhbnRGUCwgdXNlIHRoZSBvdGhlciBvbmUKKyAgLy8vIGZvciB0aG9zZS4KKyAgU0ROb2RlICpGaW5kTm9kZU9ySW5zZXJ0UG9zKGNvbnN0IEZvbGRpbmdTZXROb2RlSUQgJklELCB2b2lkIComSW5zZXJ0UG9zKTsKKworICAvLy8gTG9vayB1cCB0aGUgbm9kZSBzcGVjaWZpZWQgYnkgSUQgaW4gQ1NFTWFwLiAgSWYgaXQgZXhpc3RzLCByZXR1cm4gaXQuICBJZgorICAvLy8gbm90LCByZXR1cm4gdGhlIGluc2VydGlvbiB0b2tlbiB0aGF0IHdpbGwgbWFrZSBpbnNlcnRpb24gZmFzdGVyLiAgUGVyZm9ybXMKKyAgLy8vIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBmb3IgY29uc3RhbnQgbm9kZXMuCisgIFNETm9kZSAqRmluZE5vZGVPckluc2VydFBvcyhjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCwgY29uc3QgU0RMb2MgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqJkluc2VydFBvcyk7CisKKyAgLy8vIExpc3Qgb2Ygbm9uLXNpbmdsZSB2YWx1ZSB0eXBlcy4KKyAgRm9sZGluZ1NldDxTRFZUTGlzdE5vZGU+IFZUTGlzdE1hcDsKKworICAvLy8gTWFwcyB0byBhdXRvLUNTRSBvcGVyYXRpb25zLgorICBzdGQ6OnZlY3RvcjxDb25kQ29kZVNETm9kZSo+IENvbmRDb2RlTm9kZXM7CisKKyAgc3RkOjp2ZWN0b3I8U0ROb2RlKj4gVmFsdWVUeXBlTm9kZXM7CisgIHN0ZDo6bWFwPEVWVCwgU0ROb2RlKiwgRVZUOjpjb21wYXJlUmF3Qml0cz4gRXh0ZW5kZWRWYWx1ZVR5cGVOb2RlczsKKyAgU3RyaW5nTWFwPFNETm9kZSo+IEV4dGVybmFsU3ltYm9sczsKKworICBzdGQ6Om1hcDxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHVuc2lnbmVkIGNoYXI+LFNETm9kZSo+IFRhcmdldEV4dGVybmFsU3ltYm9sczsKKyAgRGVuc2VNYXA8TUNTeW1ib2wgKiwgU0ROb2RlICo+IE1DU3ltYm9sczsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxTZWxlY3Rpb25EQUcqPiA6IHB1YmxpYyBHcmFwaFRyYWl0czxTRE5vZGUqPiB7CisgIHVzaW5nIG5vZGVzX2l0ZXJhdG9yID0gcG9pbnRlcl9pdGVyYXRvcjxTZWxlY3Rpb25EQUc6OmFsbG5vZGVzX2l0ZXJhdG9yPjsKKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oU2VsZWN0aW9uREFHICpHKSB7CisgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yKEctPmFsbG5vZGVzX2JlZ2luKCkpOworICB9CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2VuZChTZWxlY3Rpb25EQUcgKkcpIHsKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3IoRy0+YWxsbm9kZXNfZW5kKCkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVGFyZ2V0TWVtU0ROb2RlPgorU0RWYWx1ZSBTZWxlY3Rpb25EQUc6OmdldFRhcmdldE1lbVNETm9kZShTRFZUTGlzdCBWVHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNEVmFsdWU+IE9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RMb2MgJmRsLCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pIHsKKyAgLy8vIENvbXBvc2Ugbm9kZSBJRCBhbmQgdHJ5IHRvIGZpbmQgYW4gZXhpc3Rpbmcgbm9kZS4KKyAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgdW5zaWduZWQgT3Bjb2RlID0KKyAgICBUYXJnZXRNZW1TRE5vZGUoZGwuZ2V0SVJPcmRlcigpLCBEZWJ1Z0xvYygpLCBWVHMsIE1lbVZULCBNTU8pLmdldE9wY29kZSgpOworICBJRC5BZGRJbnRlZ2VyKE9wY29kZSk7CisgIElELkFkZFBvaW50ZXIoVlRzLlZUcyk7CisgIGZvciAoYXV0byYgT3AgOiBPcHMpIHsKKyAgICBJRC5BZGRQb2ludGVyKE9wLmdldE5vZGUoKSk7CisgICAgSUQuQWRkSW50ZWdlcihPcC5nZXRSZXNObygpKTsKKyAgfQorICBJRC5BZGRJbnRlZ2VyKE1lbVZULmdldFJhd0JpdHMoKSk7CisgIElELkFkZEludGVnZXIoTU1PLT5nZXRQb2ludGVySW5mbygpLmdldEFkZHJTcGFjZSgpKTsKKyAgSUQuQWRkSW50ZWdlcihnZXRTeW50aGV0aWNOb2RlU3ViY2xhc3NEYXRhPFRhcmdldE1lbVNETm9kZT4oCisgICAgZGwuZ2V0SVJPcmRlcigpLCBWVHMsIE1lbVZULCBNTU8pKTsKKworICB2b2lkICpJUCA9IG51bGxwdHI7CisgIGlmIChTRE5vZGUgKkUgPSBGaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBkbCwgSVApKSB7CisgICAgY2FzdDxUYXJnZXRNZW1TRE5vZGU+KEUpLT5yZWZpbmVBbGlnbm1lbnQoTU1PKTsKKyAgICByZXR1cm4gU0RWYWx1ZShFLCAwKTsKKyAgfQorCisgIC8vLyBFeGlzdGluZyBub2RlIHdhcyBub3QgZm91bmQuIENyZWF0ZSBhIG5ldyBvbmUuCisgIGF1dG8gKk4gPSBuZXdTRE5vZGU8VGFyZ2V0TWVtU0ROb2RlPihkbC5nZXRJUk9yZGVyKCksIGRsLmdldERlYnVnTG9jKCksIFZUcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVZULCBNTU8pOworICBjcmVhdGVPcGVyYW5kcyhOLCBPcHMpOworICBDU0VNYXAuSW5zZXJ0Tm9kZShOLCBJUCk7CisgIEluc2VydE5vZGUoTik7CisgIHJldHVybiBTRFZhbHVlKE4sIDApOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1NFTEVDVElPTkRBR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHQWRkcmVzc0FuYWx5c2lzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHQWRkcmVzc0FuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgwNjA2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdBZGRyZXNzQW5hbHlzaXMuaApAQCAtMCwwICsxLDY0IEBACisvLz09PS0gU2VsZWN0aW9uREFHQWRkcmVzc0FuYWx5c2lzLmggLSBEQUcgQWRkcmVzcyBBbmFseXNpcyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TRUxFQ1RJT05EQUdBRERSRVNTQU5BTFlTSVNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fU0VMRUNUSU9OREFHQUREUkVTU0FOQUxZU0lTX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdOb2Rlcy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgU2VsZWN0aW9uREFHOworCisvLy8gSGVscGVyIHN0cnVjdCB0byBwYXJzZSBhbmQgc3RvcmUgYSBtZW1vcnkgYWRkcmVzcyBhcyBiYXNlICsgaW5kZXggKyBvZmZzZXQuCisvLy8gV2UgaWdub3JlIHNpZ24gZXh0ZW5zaW9ucyB3aGVuIGl0IGlzIHNhZmUgdG8gZG8gc28uCisvLy8gVGhlIGZvbGxvd2luZyB0d28gZXhwcmVzc2lvbnMgYXJlIG5vdCBlcXVpdmFsZW50LiBUbyBkaWZmZXJlbnRpYXRlIHdlIG5lZWQKKy8vLyB0byBzdG9yZSB3aGV0aGVyIHRoZXJlIHdhcyBhIHNpZ24gZXh0ZW5zaW9uIGludm9sdmVkIGluIHRoZSBpbmRleAorLy8vIGNvbXB1dGF0aW9uLgorLy8vICAobG9hZCAoaTY0IGFkZCAoaTY0IGNvcHlmcm9tcmVnICVjKQorLy8vICAgICAgICAgICAgICAgICAoaTY0IHNpZ25leHRlbmQgKGFkZCAoaTggbG9hZCAlaW5kZXgpCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpOCAxKSkpKQorLy8vIHZzCisvLy8KKy8vLyAobG9hZCAoaTY0IGFkZCAoaTY0IGNvcHlmcm9tcmVnICVjKQorLy8vICAgICAgICAgICAgICAgIChpNjQgc2lnbmV4dGVuZCAoaTMyIGFkZCAoaTMyIHNpZ25leHRlbmQgKGk4IGxvYWQgJWluZGV4KSkKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMiAxKSkpKSkKK2NsYXNzIEJhc2VJbmRleE9mZnNldCB7Citwcml2YXRlOgorICBTRFZhbHVlIEJhc2U7CisgIFNEVmFsdWUgSW5kZXg7CisgIGludDY0X3QgT2Zmc2V0ID0gMDsKKyAgYm9vbCBJc0luZGV4U2lnbkV4dCA9IGZhbHNlOworCitwdWJsaWM6CisgIEJhc2VJbmRleE9mZnNldCgpID0gZGVmYXVsdDsKKyAgQmFzZUluZGV4T2Zmc2V0KFNEVmFsdWUgQmFzZSwgU0RWYWx1ZSBJbmRleCwgaW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICBib29sIElzSW5kZXhTaWduRXh0KQorICAgICAgOiBCYXNlKEJhc2UpLCBJbmRleChJbmRleCksIE9mZnNldChPZmZzZXQpLAorICAgICAgICBJc0luZGV4U2lnbkV4dChJc0luZGV4U2lnbkV4dCkge30KKworICBTRFZhbHVlIGdldEJhc2UoKSB7IHJldHVybiBCYXNlOyB9CisgIFNEVmFsdWUgZ2V0SW5kZXgoKSB7IHJldHVybiBJbmRleDsgfQorCisgIGJvb2wgZXF1YWxCYXNlSW5kZXgoQmFzZUluZGV4T2Zmc2V0ICZPdGhlciwgY29uc3QgU2VsZWN0aW9uREFHICZEQUcpIHsKKyAgICBpbnQ2NF90IE9mZjsKKyAgICByZXR1cm4gZXF1YWxCYXNlSW5kZXgoT3RoZXIsIERBRywgT2ZmKTsKKyAgfQorCisgIGJvb2wgZXF1YWxCYXNlSW5kZXgoQmFzZUluZGV4T2Zmc2V0ICZPdGhlciwgY29uc3QgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAmT2ZmKTsKKworICAvLy8gUGFyc2VzIHRyZWUgaW4gUHRyIGZvciBiYXNlLCBpbmRleCwgb2Zmc2V0IGFkZHJlc3Nlcy4KKyAgc3RhdGljIEJhc2VJbmRleE9mZnNldCBtYXRjaChMU0Jhc2VTRE5vZGUgKk4sIGNvbnN0IFNlbGVjdGlvbkRBRyAmREFHKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fU0VMRUNUSU9OREFHQUREUkVTU0FOQUxZU0lTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdJU2VsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHSVNlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NmVhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHSVNlbC5oCkBAIC0wLDAgKzEsMzQ4IEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdJU2VsLmggLSBDb21tb24gQmFzZSBDbGFzcy0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBTZWxlY3Rpb25EQUdJU2VsIGNsYXNzLCB3aGljaCBpcyB1c2VkIGFzIHRoZSBjb21tb24KKy8vIGJhc2UgY2xhc3MgZm9yIFNlbGVjdGlvbkRBRy1iYXNlZCBpbnN0cnVjdGlvbiBzZWxlY3RvcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fU0VMRUNUSU9OREFHSVNFTF9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9TRUxFQ1RJT05EQUdJU0VMX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRTdWJ0YXJnZXRJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEZhc3RJU2VsOworICBjbGFzcyBTZWxlY3Rpb25EQUdCdWlsZGVyOworICBjbGFzcyBTRFZhbHVlOworICBjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworICBjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKKyAgY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworICBjbGFzcyBNYWNoaW5lSW5zdHI7CisgIGNsYXNzIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXI7CisgIGNsYXNzIFRhcmdldExvd2VyaW5nOworICBjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbzsKKyAgY2xhc3MgRnVuY3Rpb25Mb3dlcmluZ0luZm87CisgIGNsYXNzIFNjaGVkdWxlSGF6YXJkUmVjb2duaXplcjsKKyAgY2xhc3MgR0NGdW5jdGlvbkluZm87CisgIGNsYXNzIFNjaGVkdWxlREFHU0ROb2RlczsKKyAgY2xhc3MgTG9hZEluc3Q7CisKKy8vLyBTZWxlY3Rpb25EQUdJU2VsIC0gVGhpcyBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3MgdXNlZCBmb3IgU2VsZWN0aW9uREFHLWJhc2VkCisvLy8gcGF0dGVybi1tYXRjaGluZyBpbnN0cnVjdGlvbiBzZWxlY3RvcnMuCitjbGFzcyBTZWxlY3Rpb25EQUdJU2VsIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworcHVibGljOgorICBUYXJnZXRNYWNoaW5lICZUTTsKKyAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKkxpYkluZm87CisgIEZ1bmN0aW9uTG93ZXJpbmdJbmZvICpGdW5jSW5mbzsKKyAgTWFjaGluZUZ1bmN0aW9uICpNRjsKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAqUmVnSW5mbzsKKyAgU2VsZWN0aW9uREFHICpDdXJEQUc7CisgIFNlbGVjdGlvbkRBR0J1aWxkZXIgKlNEQjsKKyAgQWxpYXNBbmFseXNpcyAqQUE7CisgIEdDRnVuY3Rpb25JbmZvICpHRkk7CisgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsOworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSTsKKyAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgKlRMSTsKKyAgYm9vbCBGYXN0SVNlbEZhaWxlZDsKKyAgU21hbGxQdHJTZXQ8Y29uc3QgSW5zdHJ1Y3Rpb24gKiwgND4gRWxpZGVkQXJnQ29weUluc3RyczsKKworICAvLy8gQ3VycmVudCBvcHRpbWl6YXRpb24gcmVtYXJrIGVtaXR0ZXIuCisgIC8vLyBVc2VkIHRvIHJlcG9ydCB0aGluZ3MgbGlrZSBjb21iaW5lcyBhbmQgRmFzdElTZWwgZmFpbHVyZXMuCisgIHN0ZDo6dW5pcXVlX3B0cjxPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyPiBPUkU7CisKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgZXhwbGljaXQgU2VsZWN0aW9uREFHSVNlbChUYXJnZXRNYWNoaW5lICZ0bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPTCA9IENvZGVHZW5PcHQ6OkRlZmF1bHQpOworICB+U2VsZWN0aW9uREFHSVNlbCgpIG92ZXJyaWRlOworCisgIGNvbnN0IFRhcmdldExvd2VyaW5nICpnZXRUYXJnZXRMb3dlcmluZygpIGNvbnN0IHsgcmV0dXJuIFRMSTsgfQorCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSBvdmVycmlkZTsKKworICB2aXJ0dWFsIHZvaWQgRW1pdEZ1bmN0aW9uRW50cnlDb2RlKCkge30KKworICAvLy8gUHJlcHJvY2Vzc0lTZWxEQUcgLSBUaGlzIGhvb2sgYWxsb3dzIHRhcmdldHMgdG8gaGFjayBvbiB0aGUgZ3JhcGggYmVmb3JlCisgIC8vLyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgUHJlcHJvY2Vzc0lTZWxEQUcoKSB7fQorCisgIC8vLyBQb3N0cHJvY2Vzc0lTZWxEQUcoKSAtIFRoaXMgaG9vayBhbGxvd3MgdGhlIHRhcmdldCB0byBoYWNrIG9uIHRoZSBncmFwaAorICAvLy8gcmlnaHQgYWZ0ZXIgc2VsZWN0aW9uLgorICB2aXJ0dWFsIHZvaWQgUG9zdHByb2Nlc3NJU2VsREFHKCkge30KKworICAvLy8gTWFpbiBob29rIGZvciB0YXJnZXRzIHRvIHRyYW5zZm9ybSBub2RlcyBpbnRvIG1hY2hpbmUgbm9kZXMuCisgIHZpcnR1YWwgdm9pZCBTZWxlY3QoU0ROb2RlICpOKSA9IDA7CisKKyAgLy8vIFNlbGVjdElubGluZUFzbU1lbW9yeU9wZXJhbmQgLSBTZWxlY3QgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGFzIGEgdGFyZ2V0CisgIC8vLyBhZGRyZXNzaW5nIG1vZGUsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGNvbnN0cmFpbnQuICBJZiB0aGlzIGRvZXMKKyAgLy8vIG5vdCBtYXRjaCBvciBpcyBub3QgaW1wbGVtZW50ZWQsIHJldHVybiB0cnVlLiAgVGhlIHJlc3VsdGFudCBvcGVyYW5kcworICAvLy8gKHdoaWNoIHdpbGwgYXBwZWFyIGluIHRoZSBtYWNoaW5lIGluc3RydWN0aW9uKSBzaG91bGQgYmUgYWRkZWQgdG8gdGhlCisgIC8vLyBPdXRPcHMgdmVjdG9yLgorICB2aXJ0dWFsIGJvb2wgU2VsZWN0SW5saW5lQXNtTWVtb3J5T3BlcmFuZChjb25zdCBTRFZhbHVlICZPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29uc3RyYWludElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTRFZhbHVlPiAmT3V0T3BzKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gSXNQcm9maXRhYmxlVG9Gb2xkIC0gUmV0dXJucyB0cnVlIGlmIGl0J3MgcHJvZml0YWJsZSB0byBmb2xkIHRoZSBzcGVjaWZpYworICAvLy8gb3BlcmFuZCBub2RlIE4gb2YgVSBkdXJpbmcgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHRoYXQgc3RhcnRzIGF0IFJvb3QuCisgIHZpcnR1YWwgYm9vbCBJc1Byb2ZpdGFibGVUb0ZvbGQoU0RWYWx1ZSBOLCBTRE5vZGUgKlUsIFNETm9kZSAqUm9vdCkgY29uc3Q7CisKKyAgLy8vIElzTGVnYWxUb0ZvbGQgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmljIG9wZXJhbmQgbm9kZSBOIG9mCisgIC8vLyBVIGNhbiBiZSBmb2xkZWQgZHVyaW5nIGluc3RydWN0aW9uIHNlbGVjdGlvbiB0aGF0IHN0YXJ0cyBhdCBSb290LgorICAvLy8gRklYTUU6IFRoaXMgaXMgYSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIE1TUDQzMC9YODYKKyAgLy8vIHRhcmdldHMsIHdoaWNoIHVzZXMgaXQgZHVyaW5nIGlzZWwuICBUaGlzIGNvdWxkIGJlY29tZSBhIHByb3BlciBtZW1iZXIuCisgIHN0YXRpYyBib29sIElzTGVnYWxUb0ZvbGQoU0RWYWx1ZSBOLCBTRE5vZGUgKlUsIFNETm9kZSAqUm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElnbm9yZUNoYWlucyA9IGZhbHNlKTsKKworICBzdGF0aWMgdm9pZCBJbnZhbGlkYXRlTm9kZUlkKFNETm9kZSAqTik7CisgIHN0YXRpYyBpbnQgZ2V0VW5pbnZhbGlkYXRlZE5vZGVJZChTRE5vZGUgKk4pOworCisgIHN0YXRpYyB2b2lkIEVuZm9yY2VOb2RlSWRJbnZhcmlhbnQoU0ROb2RlICpOKTsKKworICAvLyBPcGNvZGVzIHVzZWQgYnkgdGhlIERBRyBzdGF0ZSBtYWNoaW5lOgorICBlbnVtIEJ1aWx0aW5PcGNvZGVzIHsKKyAgICBPUENfU2NvcGUsCisgICAgT1BDX1JlY29yZE5vZGUsCisgICAgT1BDX1JlY29yZENoaWxkMCwgT1BDX1JlY29yZENoaWxkMSwgT1BDX1JlY29yZENoaWxkMiwgT1BDX1JlY29yZENoaWxkMywKKyAgICBPUENfUmVjb3JkQ2hpbGQ0LCBPUENfUmVjb3JkQ2hpbGQ1LCBPUENfUmVjb3JkQ2hpbGQ2LCBPUENfUmVjb3JkQ2hpbGQ3LAorICAgIE9QQ19SZWNvcmRNZW1SZWYsCisgICAgT1BDX0NhcHR1cmVHbHVlSW5wdXQsCisgICAgT1BDX01vdmVDaGlsZCwKKyAgICBPUENfTW92ZUNoaWxkMCwgT1BDX01vdmVDaGlsZDEsIE9QQ19Nb3ZlQ2hpbGQyLCBPUENfTW92ZUNoaWxkMywKKyAgICBPUENfTW92ZUNoaWxkNCwgT1BDX01vdmVDaGlsZDUsIE9QQ19Nb3ZlQ2hpbGQ2LCBPUENfTW92ZUNoaWxkNywKKyAgICBPUENfTW92ZVBhcmVudCwKKyAgICBPUENfQ2hlY2tTYW1lLAorICAgIE9QQ19DaGVja0NoaWxkMFNhbWUsIE9QQ19DaGVja0NoaWxkMVNhbWUsCisgICAgT1BDX0NoZWNrQ2hpbGQyU2FtZSwgT1BDX0NoZWNrQ2hpbGQzU2FtZSwKKyAgICBPUENfQ2hlY2tQYXR0ZXJuUHJlZGljYXRlLAorICAgIE9QQ19DaGVja1ByZWRpY2F0ZSwKKyAgICBPUENfQ2hlY2tPcGNvZGUsCisgICAgT1BDX1N3aXRjaE9wY29kZSwKKyAgICBPUENfQ2hlY2tUeXBlLAorICAgIE9QQ19DaGVja1R5cGVSZXMsCisgICAgT1BDX1N3aXRjaFR5cGUsCisgICAgT1BDX0NoZWNrQ2hpbGQwVHlwZSwgT1BDX0NoZWNrQ2hpbGQxVHlwZSwgT1BDX0NoZWNrQ2hpbGQyVHlwZSwKKyAgICBPUENfQ2hlY2tDaGlsZDNUeXBlLCBPUENfQ2hlY2tDaGlsZDRUeXBlLCBPUENfQ2hlY2tDaGlsZDVUeXBlLAorICAgIE9QQ19DaGVja0NoaWxkNlR5cGUsIE9QQ19DaGVja0NoaWxkN1R5cGUsCisgICAgT1BDX0NoZWNrSW50ZWdlciwKKyAgICBPUENfQ2hlY2tDaGlsZDBJbnRlZ2VyLCBPUENfQ2hlY2tDaGlsZDFJbnRlZ2VyLCBPUENfQ2hlY2tDaGlsZDJJbnRlZ2VyLAorICAgIE9QQ19DaGVja0NoaWxkM0ludGVnZXIsIE9QQ19DaGVja0NoaWxkNEludGVnZXIsCisgICAgT1BDX0NoZWNrQ29uZENvZGUsCisgICAgT1BDX0NoZWNrVmFsdWVUeXBlLAorICAgIE9QQ19DaGVja0NvbXBsZXhQYXQsCisgICAgT1BDX0NoZWNrQW5kSW1tLCBPUENfQ2hlY2tPckltbSwKKyAgICBPUENfQ2hlY2tGb2xkYWJsZUNoYWluTm9kZSwKKworICAgIE9QQ19FbWl0SW50ZWdlciwKKyAgICBPUENfRW1pdFJlZ2lzdGVyLAorICAgIE9QQ19FbWl0UmVnaXN0ZXIyLAorICAgIE9QQ19FbWl0Q29udmVydFRvVGFyZ2V0LAorICAgIE9QQ19FbWl0TWVyZ2VJbnB1dENoYWlucywKKyAgICBPUENfRW1pdE1lcmdlSW5wdXRDaGFpbnMxXzAsCisgICAgT1BDX0VtaXRNZXJnZUlucHV0Q2hhaW5zMV8xLAorICAgIE9QQ19FbWl0TWVyZ2VJbnB1dENoYWluczFfMiwKKyAgICBPUENfRW1pdENvcHlUb1JlZywKKyAgICBPUENfRW1pdE5vZGVYRm9ybSwKKyAgICBPUENfRW1pdE5vZGUsCisgICAgLy8gU3BhY2Utb3B0aW1pemVkIGZvcm1zIHRoYXQgaW1wbGljaXRseSBlbmNvZGUgbnVtYmVyIG9mIHJlc3VsdCBWVHMuCisgICAgT1BDX0VtaXROb2RlMCwgT1BDX0VtaXROb2RlMSwgT1BDX0VtaXROb2RlMiwKKyAgICBPUENfTW9ycGhOb2RlVG8sCisgICAgLy8gU3BhY2Utb3B0aW1pemVkIGZvcm1zIHRoYXQgaW1wbGljaXRseSBlbmNvZGUgbnVtYmVyIG9mIHJlc3VsdCBWVHMuCisgICAgT1BDX01vcnBoTm9kZVRvMCwgT1BDX01vcnBoTm9kZVRvMSwgT1BDX01vcnBoTm9kZVRvMiwKKyAgICBPUENfQ29tcGxldGVNYXRjaCwKKyAgICAvLyBDb250YWlucyBvZmZzZXQgaW4gdGFibGUgZm9yIHBhdHRlcm4gYmVpbmcgc2VsZWN0ZWQKKyAgICBPUENfQ292ZXJhZ2UKKyAgfTsKKworICBlbnVtIHsKKyAgICBPUEZMX05vbmUgICAgICAgPSAwLCAgLy8gTm9kZSBoYXMgbm8gY2hhaW4gb3IgZ2x1ZSBpbnB1dCBhbmQgaXNuJ3QgdmFyaWFkaWMuCisgICAgT1BGTF9DaGFpbiAgICAgID0gMSwgICAgIC8vIE5vZGUgaGFzIGEgY2hhaW4gaW5wdXQuCisgICAgT1BGTF9HbHVlSW5wdXQgID0gMiwgICAgIC8vIE5vZGUgaGFzIGEgZ2x1ZSBpbnB1dC4KKyAgICBPUEZMX0dsdWVPdXRwdXQgPSA0LCAgICAgLy8gTm9kZSBoYXMgYSBnbHVlIG91dHB1dC4KKyAgICBPUEZMX01lbVJlZnMgICAgPSA4LCAgICAgLy8gTm9kZSBnZXRzIGFjY3VtdWxhdGVkIE1lbVJlZnMuCisgICAgT1BGTF9WYXJpYWRpYzAgID0gMTw8NCwgIC8vIE5vZGUgaXMgdmFyaWFkaWMsIHJvb3QgaGFzIDAgZml4ZWQgaW5wdXRzLgorICAgIE9QRkxfVmFyaWFkaWMxICA9IDI8PDQsICAvLyBOb2RlIGlzIHZhcmlhZGljLCByb290IGhhcyAxIGZpeGVkIGlucHV0cy4KKyAgICBPUEZMX1ZhcmlhZGljMiAgPSAzPDw0LCAgLy8gTm9kZSBpcyB2YXJpYWRpYywgcm9vdCBoYXMgMiBmaXhlZCBpbnB1dHMuCisgICAgT1BGTF9WYXJpYWRpYzMgID0gNDw8NCwgIC8vIE5vZGUgaXMgdmFyaWFkaWMsIHJvb3QgaGFzIDMgZml4ZWQgaW5wdXRzLgorICAgIE9QRkxfVmFyaWFkaWM0ICA9IDU8PDQsICAvLyBOb2RlIGlzIHZhcmlhZGljLCByb290IGhhcyA0IGZpeGVkIGlucHV0cy4KKyAgICBPUEZMX1ZhcmlhZGljNSAgPSA2PDw0LCAgLy8gTm9kZSBpcyB2YXJpYWRpYywgcm9vdCBoYXMgNSBmaXhlZCBpbnB1dHMuCisgICAgT1BGTF9WYXJpYWRpYzYgID0gNzw8NCwgIC8vIE5vZGUgaXMgdmFyaWFkaWMsIHJvb3QgaGFzIDYgZml4ZWQgaW5wdXRzLgorCisgICAgT1BGTF9WYXJpYWRpY0luZm8gPSBPUEZMX1ZhcmlhZGljNgorICB9OworCisgIC8vLyBnZXROdW1GaXhlZEZyb21WYXJpYWRpY0luZm8gLSBUcmFuc2Zvcm0gYW4gRW1pdE5vZGUgZmxhZ3Mgd29yZCBpbnRvIHRoZQorICAvLy8gbnVtYmVyIG9mIGZpeGVkIGFyaXR5IHZhbHVlcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIHdoZW4gY29weWluZyBmcm9tIHRoZQorICAvLy8gcm9vdC4KKyAgc3RhdGljIGlubGluZSBpbnQgZ2V0TnVtRml4ZWRGcm9tVmFyaWFkaWNJbmZvKHVuc2lnbmVkIEZsYWdzKSB7CisgICAgcmV0dXJuICgoRmxhZ3MmT1BGTF9WYXJpYWRpY0luZm8pID4+IDQpLTE7CisgIH0KKworCitwcm90ZWN0ZWQ6CisgIC8vLyBEQUdTaXplIC0gU2l6ZSBvZiBEQUcgYmVpbmcgaW5zdHJ1Y3Rpb24gc2VsZWN0ZWQuCisgIC8vLworICB1bnNpZ25lZCBEQUdTaXplOworCisgIC8vLyBSZXBsYWNlVXNlcyAtIHJlcGxhY2UgYWxsIHVzZXMgb2YgdGhlIG9sZCBub2RlIEYgd2l0aCB0aGUgdXNlCisgIC8vLyBvZiB0aGUgbmV3IG5vZGUgVC4KKyAgdm9pZCBSZXBsYWNlVXNlcyhTRFZhbHVlIEYsIFNEVmFsdWUgVCkgeworICAgIEN1ckRBRy0+UmVwbGFjZUFsbFVzZXNPZlZhbHVlV2l0aChGLCBUKTsKKyAgICBFbmZvcmNlTm9kZUlkSW52YXJpYW50KFQuZ2V0Tm9kZSgpKTsKKyAgfQorCisgIC8vLyBSZXBsYWNlVXNlcyAtIHJlcGxhY2UgYWxsIHVzZXMgb2YgdGhlIG9sZCBub2RlcyBGIHdpdGggdGhlIHVzZQorICAvLy8gb2YgdGhlIG5ldyBub2RlcyBULgorICB2b2lkIFJlcGxhY2VVc2VzKGNvbnN0IFNEVmFsdWUgKkYsIGNvbnN0IFNEVmFsdWUgKlQsIHVuc2lnbmVkIE51bSkgeworICAgIEN1ckRBRy0+UmVwbGFjZUFsbFVzZXNPZlZhbHVlc1dpdGgoRiwgVCwgTnVtKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtOyArK2kpCisgICAgICBFbmZvcmNlTm9kZUlkSW52YXJpYW50KFRbaV0uZ2V0Tm9kZSgpKTsKKyAgfQorCisgIC8vLyBSZXBsYWNlVXNlcyAtIHJlcGxhY2UgYWxsIHVzZXMgb2YgdGhlIG9sZCBub2RlIEYgd2l0aCB0aGUgdXNlCisgIC8vLyBvZiB0aGUgbmV3IG5vZGUgVC4KKyAgdm9pZCBSZXBsYWNlVXNlcyhTRE5vZGUgKkYsIFNETm9kZSAqVCkgeworICAgIEN1ckRBRy0+UmVwbGFjZUFsbFVzZXNXaXRoKEYsIFQpOworICAgIEVuZm9yY2VOb2RlSWRJbnZhcmlhbnQoVCk7CisgIH0KKworICAvLy8gUmVwbGFjZSBhbGwgdXNlcyBvZiBcYyBGIHdpdGggXGMgVCwgdGhlbiByZW1vdmUgXGMgRiBmcm9tIHRoZSBEQUcuCisgIHZvaWQgUmVwbGFjZU5vZGUoU0ROb2RlICpGLCBTRE5vZGUgKlQpIHsKKyAgICBDdXJEQUctPlJlcGxhY2VBbGxVc2VzV2l0aChGLCBUKTsKKyAgICBFbmZvcmNlTm9kZUlkSW52YXJpYW50KFQpOworICAgIEN1ckRBRy0+UmVtb3ZlRGVhZE5vZGUoRik7CisgIH0KKworICAvLy8gU2VsZWN0SW5saW5lQXNtTWVtb3J5T3BlcmFuZHMgLSBDYWxscyB0byB0aGlzIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorICAvLy8gYnkgdGJsZ2VuLiAgT3RoZXJzIHNob3VsZCBub3QgY2FsbCBpdC4KKyAgdm9pZCBTZWxlY3RJbmxpbmVBc21NZW1vcnlPcGVyYW5kcyhzdGQ6OnZlY3RvcjxTRFZhbHVlPiAmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNETG9jICZETCk7CisKKyAgLy8vIGdldFBhdHRlcm5Gb3JJbmRleCAtIFBhdHRlcm5zIHNlbGVjdGVkIGJ5IHRhYmxlZ2VuIGR1cmluZyBJU0VMCisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldFBhdHRlcm5Gb3JJbmRleCh1bnNpZ25lZCBpbmRleCkgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlRibGdlbiBzaG91bGQgZ2VuZXJhdGUgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMhIik7CisgIH0KKworICAvLy8gZ2V0SW5jbHVkZVBhdGhGb3JJbmRleCAtIGdldCB0aGUgdGQgc291cmNlIGxvY2F0aW9uIG9mIHBhdHRlcm4gaW5zdGFudGlhdGlvbgorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRJbmNsdWRlUGF0aEZvckluZGV4KHVuc2lnbmVkIGluZGV4KSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVGJsZ2VuIHNob3VsZCBnZW5lcmF0ZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyEiKTsKKyAgfQorcHVibGljOgorICAvLyBDYWxscyB0byB0aGVzZSBwcmVkaWNhdGVzIGFyZSBnZW5lcmF0ZWQgYnkgdGJsZ2VuLgorICBib29sIENoZWNrQW5kTWFzayhTRFZhbHVlIExIUywgQ29uc3RhbnRTRE5vZGUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBEZXNpcmVkTWFza1MpIGNvbnN0OworICBib29sIENoZWNrT3JNYXNrKFNEVmFsdWUgTEhTLCBDb25zdGFudFNETm9kZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IERlc2lyZWRNYXNrUykgY29uc3Q7CisKKworICAvLy8gQ2hlY2tQYXR0ZXJuUHJlZGljYXRlIC0gVGhpcyBmdW5jdGlvbiBpcyBnZW5lcmF0ZWQgYnkgdGJsZ2VuIGluIHRoZQorICAvLy8gdGFyZ2V0LiAgSXQgcnVucyB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gcHJlZGljYXRlIGFuZCByZXR1cm5zIHRydWUgaWYgaXQKKyAgLy8vIHN1Y2NlZWRzIG9yIGZhbHNlIGlmIGl0IGZhaWxzLiAgVGhlIG51bWJlciBpcyBhIHByaXZhdGUgaW1wbGVtZW50YXRpb24KKyAgLy8vIGRldGFpbCB0byB0aGUgY29kZSB0YmxnZW4gcHJvZHVjZXMuCisgIHZpcnR1YWwgYm9vbCBDaGVja1BhdHRlcm5QcmVkaWNhdGUodW5zaWduZWQgUHJlZE5vKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVGJsZ2VuIHNob3VsZCBnZW5lcmF0ZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyEiKTsKKyAgfQorCisgIC8vLyBDaGVja05vZGVQcmVkaWNhdGUgLSBUaGlzIGZ1bmN0aW9uIGlzIGdlbmVyYXRlZCBieSB0YmxnZW4gaW4gdGhlIHRhcmdldC4KKyAgLy8vIEl0IHJ1bnMgbm9kZSBwcmVkaWNhdGUgbnVtYmVyIFByZWRObyBhbmQgcmV0dXJucyB0cnVlIGlmIGl0IHN1Y2NlZWRzIG9yCisgIC8vLyBmYWxzZSBpZiBpdCBmYWlscy4gIFRoZSBudW1iZXIgaXMgYSBwcml2YXRlIGltcGxlbWVudGF0aW9uCisgIC8vLyBkZXRhaWwgdG8gdGhlIGNvZGUgdGJsZ2VuIHByb2R1Y2VzLgorICB2aXJ0dWFsIGJvb2wgQ2hlY2tOb2RlUHJlZGljYXRlKFNETm9kZSAqTiwgdW5zaWduZWQgUHJlZE5vKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVGJsZ2VuIHNob3VsZCBnZW5lcmF0ZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyEiKTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBDaGVja0NvbXBsZXhQYXR0ZXJuKFNETm9kZSAqUm9vdCwgU0ROb2RlICpQYXJlbnQsIFNEVmFsdWUgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUGF0dGVybk5vLAorICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxTRFZhbHVlLCBTRE5vZGUqPiA+ICZSZXN1bHQpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUYmxnZW4gc2hvdWxkIGdlbmVyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzISIpOworICB9CisKKyAgdmlydHVhbCBTRFZhbHVlIFJ1blNETm9kZVhGb3JtKFNEVmFsdWUgViwgdW5zaWduZWQgWEZvcm1ObykgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlRibGdlbiBzaG91bGQgZ2VuZXJhdGUgdGhpcyEiKTsKKyAgfQorCisgIHZvaWQgU2VsZWN0Q29kZUNvbW1vbihTRE5vZGUgKk5vZGVUb01hdGNoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpNYXRjaGVyVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUYWJsZVNpemUpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgY29tcGxleCBwYXR0ZXJucyBmb3IgdGhpcyB0YXJnZXQgY2FuIG11dGF0ZSB0aGUKKyAgLy8vIERBRy4KKyAgdmlydHVhbCBib29sIENvbXBsZXhQYXR0ZXJuRnVuY011dGF0ZXNEQUcoKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBpc09yRXF1aXZhbGVudFRvQWRkKGNvbnN0IFNETm9kZSAqTikgY29uc3Q7CisKK3ByaXZhdGU6CisKKyAgLy8gQ2FsbHMgdG8gdGhlc2UgZnVuY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGJsZ2VuLgorICB2b2lkIFNlbGVjdF9JTkxJTkVBU00oU0ROb2RlICpOKTsKKyAgdm9pZCBTZWxlY3RfUkVBRF9SRUdJU1RFUihTRE5vZGUgKk4pOworICB2b2lkIFNlbGVjdF9XUklURV9SRUdJU1RFUihTRE5vZGUgKk4pOworICB2b2lkIFNlbGVjdF9VTkRFRihTRE5vZGUgKk4pOworICB2b2lkIENhbm5vdFlldFNlbGVjdChTRE5vZGUgKk4pOworCitwcml2YXRlOgorICB2b2lkIERvSW5zdHJ1Y3Rpb25TZWxlY3Rpb24oKTsKKyAgU0ROb2RlICpNb3JwaE5vZGUoU0ROb2RlICpOb2RlLCB1bnNpZ25lZCBUYXJnZXRPcGMsIFNEVlRMaXN0IFZUcywKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzLCB1bnNpZ25lZCBFbWl0Tm9kZUluZm8pOworCisgIFNETm9kZSAqTXV0YXRlU3RyaWN0RlBUb0ZQKFNETm9kZSAqTm9kZSwgdW5zaWduZWQgTmV3T3BjKTsKKworICAvLy8gUHJlcGFyZXMgdGhlIGxhbmRpbmcgcGFkIHRvIHRha2UgaW5jb21pbmcgdmFsdWVzIG9yIGRvIG90aGVyIEVICisgIC8vLyBwZXJzb25hbGl0eSBzcGVjaWZpYyB0YXNrcy4gUmV0dXJucyB0cnVlIGlmIHRoZSBibG9jayBzaG91bGQgYmUKKyAgLy8vIGluc3RydWN0aW9uIHNlbGVjdGVkLCBmYWxzZSBpZiBubyBjb2RlIHNob3VsZCBiZSBlbWl0dGVkIGZvciBpdC4KKyAgYm9vbCBQcmVwYXJlRUhMYW5kaW5nUGFkKCk7CisKKyAgLy8vIFxicmllZiBQZXJmb3JtIGluc3RydWN0aW9uIHNlbGVjdGlvbiBvbiBhbGwgYmFzaWMgYmxvY2tzIGluIHRoZSBmdW5jdGlvbi4KKyAgdm9pZCBTZWxlY3RBbGxCYXNpY0Jsb2Nrcyhjb25zdCBGdW5jdGlvbiAmRm4pOworCisgIC8vLyBcYnJpZWYgUGVyZm9ybSBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gb24gYSBzaW5nbGUgYmFzaWMgYmxvY2ssIGZvcgorICAvLy8gaW5zdHJ1Y3Rpb25zIGJldHdlZW4gXHAgQmVnaW4gYW5kIFxwIEVuZC4gIFxwIEhhZFRhaWxDYWxsIHdpbGwgYmUgc2V0CisgIC8vLyB0byB0cnVlIGlmIGEgY2FsbCBpbiB0aGUgYmxvY2sgd2FzIHRyYW5zbGF0ZWQgYXMgYSB0YWlsIGNhbGwuCisgIHZvaWQgU2VsZWN0QmFzaWNCbG9jayhCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkhhZFRhaWxDYWxsKTsKKyAgdm9pZCBGaW5pc2hCYXNpY0Jsb2NrKCk7CisKKyAgdm9pZCBDb2RlR2VuQW5kRW1pdERBRygpOworCisgIC8vLyBcYnJpZWYgR2VuZXJhdGUgaW5zdHJ1Y3Rpb25zIGZvciBsb3dlcmluZyB0aGUgaW5jb21pbmcgYXJndW1lbnRzIG9mIHRoZQorICAvLy8gZ2l2ZW4gZnVuY3Rpb24uCisgIHZvaWQgTG93ZXJBcmd1bWVudHMoY29uc3QgRnVuY3Rpb24gJkYpOworCisgIHZvaWQgQ29tcHV0ZUxpdmVPdXRWUmVnSW5mbygpOworCisgIC8vLyBDcmVhdGUgdGhlIHNjaGVkdWxlci4gSWYgYSBzcGVjaWZpYyBzY2hlZHVsZXIgd2FzIHNwZWNpZmllZAorICAvLy8gdmlhIHRoZSBTY2hlZHVsZXJSZWdpc3RyeSwgdXNlIGl0LCBvdGhlcndpc2Ugc2VsZWN0IHRoZQorICAvLy8gb25lIHByZWZlcnJlZCBieSB0aGUgdGFyZ2V0LgorICAvLy8KKyAgU2NoZWR1bGVEQUdTRE5vZGVzICpDcmVhdGVTY2hlZHVsZXIoKTsKKworICAvLy8gT3Bjb2RlT2Zmc2V0IC0gVGhpcyBpcyBhIGNhY2hlIHVzZWQgdG8gZGlzcGF0Y2ggZWZmaWNpZW50bHkgaW50byBpc2VsCisgIC8vLyBzdGF0ZSBtYWNoaW5lcyB0aGF0IHN0YXJ0IHdpdGggYSBPUENfU3dpdGNoT3Bjb2RlIG5vZGUuCisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBPcGNvZGVPZmZzZXQ7CisKKyAgdm9pZCBVcGRhdGVDaGFpbnMoU0ROb2RlICpOb2RlVG9NYXRjaCwgU0RWYWx1ZSBJbnB1dENoYWluLAorICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0ROb2RlICo+ICZDaGFpbk5vZGVzTWF0Y2hlZCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc01vcnBoTm9kZVRvKTsKK307CisKK30KKworI2VuZGlmIC8qIExMVk1fQ09ERUdFTl9TRUxFQ1RJT05EQUdJU0VMX0ggKi8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdOb2Rlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR05vZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiNWMwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdOb2Rlcy5oCkBAIC0wLDAgKzEsMjM5OSBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdOb2Rlcy5oIC0gU2VsZWN0aW9uREFHIE5vZGVzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFNETm9kZSBjbGFzcyBhbmQgZGVyaXZlZCBjbGFzc2VzLCB3aGljaCBhcmUgdXNlZCB0bworLy8gcmVwcmVzZW50IHRoZSBub2RlcyBhbmQgb3BlcmF0aW9ucyBwcmVzZW50IGluIGEgU2VsZWN0aW9uREFHLiAgVGhlc2Ugbm9kZXMKKy8vIGFuZCBvcGVyYXRpb25zIGFyZSBtYWNoaW5lIGNvZGUgbGV2ZWwgb3BlcmF0aW9ucywgd2l0aCBzb21lIHNpbWlsYXJpdGllcyB0bworLy8gdGhlIEdDQyBSVEwgcmVwcmVzZW50YXRpb24uCisvLworLy8gQ2xpZW50cyBzaG91bGQgaW5jbHVkZSB0aGUgU2VsZWN0aW9uREFHLmggZmlsZSBpbnN0ZWFkIG9mIHRoaXMgZmlsZSBkaXJlY3RseS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TRUxFQ1RJT05EQUdOT0RFU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9TRUxFQ1RJT05EQUdOT0RFU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEZsb2F0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vSVNET3Bjb2Rlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTWVtT3BlcmFuZC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9WYWx1ZVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RlYnVnTG9jLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9NZXRhZGF0YS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGlnbk9mLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0F0b21pY09yZGVyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYWNoaW5lVmFsdWVUeXBlLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQVBJbnQ7CitjbGFzcyBDb25zdGFudDsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgRGVuc2VNYXBJbmZvOworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZTsKK2NsYXNzIE1DU3ltYm9sOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBTRE5vZGU7CitjbGFzcyBTZWxlY3Rpb25EQUc7CitjbGFzcyBUeXBlOworY2xhc3MgVmFsdWU7CisKK3ZvaWQgY2hlY2tGb3JDeWNsZXMoY29uc3QgU0ROb2RlICpOLCBjb25zdCBTZWxlY3Rpb25EQUcgKkRBRyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSk7CisKKy8vLyBUaGlzIHJlcHJlc2VudHMgYSBsaXN0IG9mIFZhbHVlVHlwZSdzIHRoYXQgaGFzIGJlZW4gaW50ZXJuJ2QgYnkKKy8vLyBhIFNlbGVjdGlvbkRBRy4gIEluc3RhbmNlcyBvZiB0aGlzIHNpbXBsZSB2YWx1ZSBjbGFzcyBhcmUgcmV0dXJuZWQgYnkKKy8vLyBTZWxlY3Rpb25EQUc6OmdldFZUTGlzdCguLi4pLgorLy8vCitzdHJ1Y3QgU0RWVExpc3QgeworICBjb25zdCBFVlQgKlZUczsKKyAgdW5zaWduZWQgaW50IE51bVZUczsKK307CisKK25hbWVzcGFjZSBJU0QgeworCisgIC8vLyBOb2RlIHByZWRpY2F0ZXMKKworICAvLy8gSWYgTiBpcyBhIEJVSUxEX1ZFQ1RPUiBub2RlIHdob3NlIGVsZW1lbnRzIGFyZSBhbGwgdGhlIHNhbWUgY29uc3RhbnQgb3IKKyAgLy8vIHVuZGVmaW5lZCwgcmV0dXJuIHRydWUgYW5kIHJldHVybiB0aGUgY29uc3RhbnQgdmFsdWUgaW4gXHAgU3BsYXRWYWx1ZS4KKyAgYm9vbCBpc0NvbnN0YW50U3BsYXRWZWN0b3IoY29uc3QgU0ROb2RlICpOLCBBUEludCAmU3BsYXRWYWx1ZSk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBhIEJVSUxEX1ZFQ1RPUiB3aGVyZSBhbGwgb2YgdGhlCisgIC8vLyBlbGVtZW50cyBhcmUgfjAgb3IgdW5kZWYuCisgIGJvb2wgaXNCdWlsZFZlY3RvckFsbE9uZXMoY29uc3QgU0ROb2RlICpOKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIGEgQlVJTERfVkVDVE9SIHdoZXJlIGFsbCBvZiB0aGUKKyAgLy8vIGVsZW1lbnRzIGFyZSAwIG9yIHVuZGVmLgorICBib29sIGlzQnVpbGRWZWN0b3JBbGxaZXJvcyhjb25zdCBTRE5vZGUgKk4pOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgYSBCVUlMRF9WRUNUT1Igbm9kZSBvZiBhbGwKKyAgLy8vIENvbnN0YW50U0ROb2RlIG9yIHVuZGVmLgorICBib29sIGlzQnVpbGRWZWN0b3JPZkNvbnN0YW50U0ROb2Rlcyhjb25zdCBTRE5vZGUgKk4pOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgYSBCVUlMRF9WRUNUT1Igbm9kZSBvZiBhbGwKKyAgLy8vIENvbnN0YW50RlBTRE5vZGUgb3IgdW5kZWYuCisgIGJvb2wgaXNCdWlsZFZlY3Rvck9mQ29uc3RhbnRGUFNETm9kZXMoY29uc3QgU0ROb2RlICpOKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaGFzIGF0IGxlYXN0IG9uZSBvcGVyYW5kIGFuZCBhbGwgb3BlcmFuZHMgb2YgdGhlCisgIC8vLyBzcGVjaWZpZWQgbm9kZSBhcmUgSVNEOjpVTkRFRi4KKyAgYm9vbCBhbGxPcGVyYW5kc1VuZGVmKGNvbnN0IFNETm9kZSAqTik7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBJU0QKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBVbmxpa2UgTExWTSB2YWx1ZXMsIFNlbGVjdGlvbiBEQUcgbm9kZXMgbWF5IHJldHVybiBtdWx0aXBsZQorLy8vIHZhbHVlcyBhcyB0aGUgcmVzdWx0IG9mIGEgY29tcHV0YXRpb24uICBNYW55IG5vZGVzIHJldHVybiBtdWx0aXBsZSB2YWx1ZXMsCisvLy8gZnJvbSBsb2FkcyAod2hpY2ggZGVmaW5lIGEgdG9rZW4gYW5kIGEgcmV0dXJuIHZhbHVlKSB0byBBRERDICh3aGljaCByZXR1cm5zCisvLy8gYSByZXN1bHQgYW5kIGEgY2FycnkgdmFsdWUpLCB0byBjYWxscyAod2hpY2ggbWF5IHJldHVybiBhbiBhcmJpdHJhcnkgbnVtYmVyCisvLy8gb2YgdmFsdWVzKS4KKy8vLworLy8vIEFzIHN1Y2gsIGVhY2ggdXNlIG9mIGEgU2VsZWN0aW9uREFHIGNvbXB1dGF0aW9uIG11c3QgaW5kaWNhdGUgdGhlIG5vZGUgdGhhdAorLy8vIGNvbXB1dGVzIGl0IGFzIHdlbGwgYXMgd2hpY2ggcmV0dXJuIHZhbHVlIHRvIHVzZSBmcm9tIHRoYXQgbm9kZS4gIFRoaXMgcGFpcgorLy8vIG9mIGluZm9ybWF0aW9uIGlzIHJlcHJlc2VudGVkIHdpdGggdGhlIFNEVmFsdWUgdmFsdWUgdHlwZS4KKy8vLworY2xhc3MgU0RWYWx1ZSB7CisgIGZyaWVuZCBzdHJ1Y3QgRGVuc2VNYXBJbmZvPFNEVmFsdWU+OworCisgIFNETm9kZSAqTm9kZSA9IG51bGxwdHI7IC8vIFRoZSBub2RlIGRlZmluaW5nIHRoZSB2YWx1ZSB3ZSBhcmUgdXNpbmcuCisgIHVuc2lnbmVkIFJlc05vID0gMDsgICAgIC8vIFdoaWNoIHJldHVybiB2YWx1ZSBvZiB0aGUgbm9kZSB3ZSBhcmUgdXNpbmcuCisKK3B1YmxpYzoKKyAgU0RWYWx1ZSgpID0gZGVmYXVsdDsKKyAgU0RWYWx1ZShTRE5vZGUgKm5vZGUsIHVuc2lnbmVkIHJlc25vKTsKKworICAvLy8gZ2V0IHRoZSBpbmRleCB3aGljaCBzZWxlY3RzIGEgc3BlY2lmaWMgcmVzdWx0IGluIHRoZSBTRE5vZGUKKyAgdW5zaWduZWQgZ2V0UmVzTm8oKSBjb25zdCB7IHJldHVybiBSZXNObzsgfQorCisgIC8vLyBnZXQgdGhlIFNETm9kZSB3aGljaCBob2xkcyB0aGUgZGVzaXJlZCByZXN1bHQKKyAgU0ROb2RlICpnZXROb2RlKCkgY29uc3QgeyByZXR1cm4gTm9kZTsgfQorCisgIC8vLyBzZXQgdGhlIFNETm9kZQorICB2b2lkIHNldE5vZGUoU0ROb2RlICpOKSB7IE5vZGUgPSBOOyB9CisKKyAgaW5saW5lIFNETm9kZSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIE5vZGU7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgU0RWYWx1ZSAmTykgY29uc3QgeworICAgIHJldHVybiBOb2RlID09IE8uTm9kZSAmJiBSZXNObyA9PSBPLlJlc05vOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTRFZhbHVlICZPKSBjb25zdCB7CisgICAgcmV0dXJuICFvcGVyYXRvcj09KE8pOworICB9CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFNEVmFsdWUgJk8pIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoTm9kZSwgUmVzTm8pIDwgc3RkOjp0aWUoTy5Ob2RlLCBPLlJlc05vKTsKKyAgfQorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgIHJldHVybiBOb2RlICE9IG51bGxwdHI7CisgIH0KKworICBTRFZhbHVlIGdldFZhbHVlKHVuc2lnbmVkIFIpIGNvbnN0IHsKKyAgICByZXR1cm4gU0RWYWx1ZShOb2RlLCBSKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG5vZGUgaXMgYW4gb3BlcmFuZCBvZiBOLgorICBib29sIGlzT3BlcmFuZE9mKGNvbnN0IFNETm9kZSAqTikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgVmFsdWVUeXBlIG9mIHRoZSByZWZlcmVuY2VkIHJldHVybiB2YWx1ZS4KKyAgaW5saW5lIEVWVCBnZXRWYWx1ZVR5cGUoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBzaW1wbGUgVmFsdWVUeXBlIG9mIHRoZSByZWZlcmVuY2VkIHJldHVybiB2YWx1ZS4KKyAgTVZUIGdldFNpbXBsZVZhbHVlVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsdWVUeXBlKCkuZ2V0U2ltcGxlVlQoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSB2YWx1ZSBpbiBiaXRzLgorICB1bnNpZ25lZCBnZXRWYWx1ZVNpemVJbkJpdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFZhbHVlVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFNjYWxhclZhbHVlU2l6ZUluQml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsdWVUeXBlKCkuZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgfQorCisgIC8vIEZvcndhcmRpbmcgbWV0aG9kcyAtIFRoZXNlIGZvcndhcmQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kcyBpbiBTRE5vZGUuCisgIGlubGluZSB1bnNpZ25lZCBnZXRPcGNvZGUoKSBjb25zdDsKKyAgaW5saW5lIHVuc2lnbmVkIGdldE51bU9wZXJhbmRzKCkgY29uc3Q7CisgIGlubGluZSBjb25zdCBTRFZhbHVlICZnZXRPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0OworICBpbmxpbmUgdWludDY0X3QgZ2V0Q29uc3RhbnRPcGVyYW5kVmFsKHVuc2lnbmVkIGkpIGNvbnN0OworICBpbmxpbmUgYm9vbCBpc1RhcmdldE1lbW9yeU9wY29kZSgpIGNvbnN0OworICBpbmxpbmUgYm9vbCBpc1RhcmdldE9wY29kZSgpIGNvbnN0OworICBpbmxpbmUgYm9vbCBpc01hY2hpbmVPcGNvZGUoKSBjb25zdDsKKyAgaW5saW5lIGJvb2wgaXNVbmRlZigpIGNvbnN0OworICBpbmxpbmUgdW5zaWduZWQgZ2V0TWFjaGluZU9wY29kZSgpIGNvbnN0OworICBpbmxpbmUgY29uc3QgRGVidWdMb2MgJmdldERlYnVnTG9jKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGR1bXAoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgZHVtcChjb25zdCBTZWxlY3Rpb25EQUcgKkcpIGNvbnN0OworICBpbmxpbmUgdm9pZCBkdW1wcigpIGNvbnN0OworICBpbmxpbmUgdm9pZCBkdW1wcihjb25zdCBTZWxlY3Rpb25EQUcgKkcpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG9wZXJhbmQgKHdoaWNoIG11c3QgYmUgYSBjaGFpbikgcmVhY2hlcyB0aGUKKyAgLy8vIHNwZWNpZmllZCBvcGVyYW5kIHdpdGhvdXQgY3Jvc3NpbmcgYW55IHNpZGUtZWZmZWN0aW5nIGluc3RydWN0aW9ucy4KKyAgLy8vIEluIHByYWN0aWNlLCB0aGlzIGxvb2tzIHRocm91Z2ggdG9rZW4gZmFjdG9ycyBhbmQgbm9uLXZvbGF0aWxlIGxvYWRzLgorICAvLy8gSW4gb3JkZXIgdG8gcmVtYWluIGVmZmljaWVudCwgdGhpcyBvbmx5CisgIC8vLyBsb29rcyBhIGNvdXBsZSBvZiBub2RlcyBpbiwgaXQgZG9lcyBub3QgZG8gYW4gZXhoYXVzdGl2ZSBzZWFyY2guCisgIGJvb2wgcmVhY2hlc0NoYWluV2l0aG91dFNpZGVFZmZlY3RzKFNEVmFsdWUgRGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG5vIG5vZGVzIHVzaW5nIHZhbHVlIFJlc05vIG9mIE5vZGUuCisgIGlubGluZSBib29sIHVzZV9lbXB0eSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBleGFjdGx5IG9uZSBub2RlIHVzaW5nIHZhbHVlIFJlc05vIG9mIE5vZGUuCisgIGlubGluZSBib29sIGhhc09uZVVzZSgpIGNvbnN0OworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPFNEVmFsdWU+IHsKKyAgc3RhdGljIGlubGluZSBTRFZhbHVlIGdldEVtcHR5S2V5KCkgeworICAgIFNEVmFsdWUgVjsKKyAgICBWLlJlc05vID0gLTFVOworICAgIHJldHVybiBWOworICB9CisKKyAgc3RhdGljIGlubGluZSBTRFZhbHVlIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICBTRFZhbHVlIFY7CisgICAgVi5SZXNObyA9IC0yVTsKKyAgICByZXR1cm4gVjsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgU0RWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuICgodW5zaWduZWQpKCh1aW50cHRyX3QpVmFsLmdldE5vZGUoKSA+PiA0KSBeCisgICAgICAgICAgICAodW5zaWduZWQpKCh1aW50cHRyX3QpVmFsLmdldE5vZGUoKSA+PiA5KSkgKyBWYWwuZ2V0UmVzTm8oKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgU0RWYWx1ZSAmTEhTLCBjb25zdCBTRFZhbHVlICZSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc1BvZExpa2U8U0RWYWx1ZT4geyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKKy8vLyBBbGxvdyBjYXN0aW5nIG9wZXJhdG9ycyB0byB3b3JrIGRpcmVjdGx5IG9uCisvLy8gU0RWYWx1ZXMgYXMgaWYgdGhleSB3ZXJlIFNETm9kZSoncy4KK3RlbXBsYXRlPD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8U0RWYWx1ZT4geworICB1c2luZyBTaW1wbGVUeXBlID0gU0ROb2RlICo7CisKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKFNEVmFsdWUgJlZhbCkgeworICAgIHJldHVybiBWYWwuZ2V0Tm9kZSgpOworICB9Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxjb25zdCBTRFZhbHVlPiB7CisgIHVzaW5nIFNpbXBsZVR5cGUgPSAvKmNvbnN0Ki8gU0ROb2RlICo7CisKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKGNvbnN0IFNEVmFsdWUgJlZhbCkgeworICAgIHJldHVybiBWYWwuZ2V0Tm9kZSgpOworICB9Cit9OworCisvLy8gUmVwcmVzZW50cyBhIHVzZSBvZiBhIFNETm9kZS4gVGhpcyBjbGFzcyBob2xkcyBhbiBTRFZhbHVlLAorLy8vIHdoaWNoIHJlY29yZHMgdGhlIFNETm9kZSBiZWluZyB1c2VkIGFuZCB0aGUgcmVzdWx0IG51bWJlciwgYQorLy8vIHBvaW50ZXIgdG8gdGhlIFNETm9kZSB1c2luZyB0aGUgdmFsdWUsIGFuZCBOZXh0IGFuZCBQcmV2IHBvaW50ZXJzLAorLy8vIHdoaWNoIGxpbmsgdG9nZXRoZXIgYWxsIHRoZSB1c2VzIG9mIGFuIFNETm9kZS4KKy8vLworY2xhc3MgU0RVc2UgeworICAvLy8gVmFsIC0gVGhlIHZhbHVlIGJlaW5nIHVzZWQuCisgIFNEVmFsdWUgVmFsOworICAvLy8gVXNlciAtIFRoZSB1c2VyIG9mIHRoaXMgdmFsdWUuCisgIFNETm9kZSAqVXNlciA9IG51bGxwdHI7CisgIC8vLyBQcmV2LCBOZXh0IC0gUG9pbnRlcnMgdG8gdGhlIHVzZXMgbGlzdCBvZiB0aGUgU0ROb2RlIHJlZmVycmVkIGJ5CisgIC8vLyB0aGlzIG9wZXJhbmQuCisgIFNEVXNlICoqUHJldiA9IG51bGxwdHI7CisgIFNEVXNlICpOZXh0ID0gbnVsbHB0cjsKKworcHVibGljOgorICBTRFVzZSgpID0gZGVmYXVsdDsKKyAgU0RVc2UoY29uc3QgU0RVc2UgJlUpID0gZGVsZXRlOworICBTRFVzZSAmb3BlcmF0b3I9KGNvbnN0IFNEVXNlICYpID0gZGVsZXRlOworCisgIC8vLyBOb3JtYWxseSBTRFVzZSB3aWxsIGp1c3QgaW1wbGljaXRseSBjb252ZXJ0IHRvIGFuIFNEVmFsdWUgdGhhdCBpdCBob2xkcy4KKyAgb3BlcmF0b3IgY29uc3QgU0RWYWx1ZSYoKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKworICAvLy8gSWYgaW1wbGljaXQgY29udmVyc2lvbiB0byBTRFZhbHVlIGRvZXNuJ3Qgd29yaywgdGhlIGdldCgpIG1ldGhvZCByZXR1cm5zCisgIC8vLyB0aGUgU0RWYWx1ZS4KKyAgY29uc3QgU0RWYWx1ZSAmZ2V0KCkgY29uc3QgeyByZXR1cm4gVmFsOyB9CisKKyAgLy8vIFRoaXMgcmV0dXJucyB0aGUgU0ROb2RlIHRoYXQgY29udGFpbnMgdGhpcyBVc2UuCisgIFNETm9kZSAqZ2V0VXNlcigpIHsgcmV0dXJuIFVzZXI7IH0KKworICAvLy8gR2V0IHRoZSBuZXh0IFNEVXNlIGluIHRoZSB1c2UgbGlzdC4KKyAgU0RVc2UgKmdldE5leHQoKSBjb25zdCB7IHJldHVybiBOZXh0OyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBnZXQoKS5nZXROb2RlKCkuCisgIFNETm9kZSAqZ2V0Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIFZhbC5nZXROb2RlKCk7IH0KKyAgLy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBnZXQoKS5nZXRSZXNObygpLgorICB1bnNpZ25lZCBnZXRSZXNObygpIGNvbnN0IHsgcmV0dXJuIFZhbC5nZXRSZXNObygpOyB9CisgIC8vLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgZ2V0KCkuZ2V0VmFsdWVUeXBlKCkuCisgIEVWVCBnZXRWYWx1ZVR5cGUoKSBjb25zdCB7IHJldHVybiBWYWwuZ2V0VmFsdWVUeXBlKCk7IH0KKworICAvLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGdldCgpLm9wZXJhdG9yPT0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNEVmFsdWUgJlYpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsID09IFY7CisgIH0KKworICAvLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGdldCgpLm9wZXJhdG9yIT0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNEVmFsdWUgJlYpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsICE9IFY7CisgIH0KKworICAvLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGdldCgpLm9wZXJhdG9yPAorICBib29sIG9wZXJhdG9yPChjb25zdCBTRFZhbHVlICZWKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbCA8IFY7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKyAgZnJpZW5kIGNsYXNzIFNETm9kZTsKKyAgLy8gVE9ETzogdW5mcmllbmQgSGFuZGxlU0ROb2RlIG9uY2Ugd2UgZml4IGl0cyBvcGVyYW5kIGhhbmRsaW5nLgorICBmcmllbmQgY2xhc3MgSGFuZGxlU0ROb2RlOworCisgIHZvaWQgc2V0VXNlcihTRE5vZGUgKnApIHsgVXNlciA9IHA7IH0KKworICAvLy8gUmVtb3ZlIHRoaXMgdXNlIGZyb20gaXRzIGV4aXN0aW5nIHVzZSBsaXN0LCBhc3NpZ24gaXQgdGhlCisgIC8vLyBnaXZlbiB2YWx1ZSwgYW5kIGFkZCBpdCB0byB0aGUgbmV3IHZhbHVlJ3Mgbm9kZSdzIHVzZSBsaXN0LgorICBpbmxpbmUgdm9pZCBzZXQoY29uc3QgU0RWYWx1ZSAmVik7CisgIC8vLyBMaWtlIHNldCwgYnV0IG9ubHkgc3VwcG9ydHMgaW5pdGlhbGl6aW5nIGEgbmV3bHktYWxsb2NhdGVkCisgIC8vLyBTRFVzZSB3aXRoIGEgbm9uLW51bGwgdmFsdWUuCisgIGlubGluZSB2b2lkIHNldEluaXRpYWwoY29uc3QgU0RWYWx1ZSAmVik7CisgIC8vLyBMaWtlIHNldCwgYnV0IG9ubHkgc2V0cyB0aGUgTm9kZSBwb3J0aW9uIG9mIHRoZSB2YWx1ZSwKKyAgLy8vIGxlYXZpbmcgdGhlIFJlc05vIHBvcnRpb24gdW5tb2RpZmllZC4KKyAgaW5saW5lIHZvaWQgc2V0Tm9kZShTRE5vZGUgKk4pOworCisgIHZvaWQgYWRkVG9MaXN0KFNEVXNlICoqTGlzdCkgeworICAgIE5leHQgPSAqTGlzdDsKKyAgICBpZiAoTmV4dCkgTmV4dC0+UHJldiA9ICZOZXh0OworICAgIFByZXYgPSBMaXN0OworICAgICpMaXN0ID0gdGhpczsKKyAgfQorCisgIHZvaWQgcmVtb3ZlRnJvbUxpc3QoKSB7CisgICAgKlByZXYgPSBOZXh0OworICAgIGlmIChOZXh0KSBOZXh0LT5QcmV2ID0gUHJldjsKKyAgfQorfTsKKworLy8vIHNpbXBsaWZ5X3R5cGUgc3BlY2lhbGl6YXRpb25zIC0gQWxsb3cgY2FzdGluZyBvcGVyYXRvcnMgdG8gd29yayBkaXJlY3RseSBvbgorLy8vIFNEVmFsdWVzIGFzIGlmIHRoZXkgd2VyZSBTRE5vZGUqJ3MuCit0ZW1wbGF0ZTw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPFNEVXNlPiB7CisgIHVzaW5nIFNpbXBsZVR5cGUgPSBTRE5vZGUgKjsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoU0RVc2UgJlZhbCkgeworICAgIHJldHVybiBWYWwuZ2V0Tm9kZSgpOworICB9Cit9OworCisvLy8gVGhlc2UgYXJlIElSLWxldmVsIG9wdGltaXphdGlvbiBmbGFncyB0aGF0IG1heSBiZSBwcm9wYWdhdGVkIHRvIFNETm9kZXMuCisvLy8gVE9ETzogVGhpcyBkYXRhIHN0cnVjdHVyZSBzaG91bGQgYmUgc2hhcmVkIGJ5IHRoZSBJUiBvcHRpbWl6ZXIgYW5kIHRoZQorLy8vIHRoZSBiYWNrZW5kLgorc3RydWN0IFNETm9kZUZsYWdzIHsKK3ByaXZhdGU6CisgIC8vIFRoaXMgYml0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmbGFncyBhcmUgaW4gYSBkZWZpbmVkIHN0YXRlLgorICAvLyBGbGFnIGJpdHMgY2FuIG9ubHkgYmUgbWFza2VkIG91dCBkdXJpbmcgaW50ZXJzZWN0aW9uIGlmIHRoZSBtYXNraW5nIGZsYWdzCisgIC8vIGFyZSBkZWZpbmVkLgorICBib29sIEFueURlZmluZWQgOiAxOworCisgIGJvb2wgTm9VbnNpZ25lZFdyYXAgOiAxOworICBib29sIE5vU2lnbmVkV3JhcCA6IDE7CisgIGJvb2wgRXhhY3QgOiAxOworICBib29sIFVuc2FmZUFsZ2VicmEgOiAxOworICBib29sIE5vTmFOcyA6IDE7CisgIGJvb2wgTm9JbmZzIDogMTsKKyAgYm9vbCBOb1NpZ25lZFplcm9zIDogMTsKKyAgYm9vbCBBbGxvd1JlY2lwcm9jYWwgOiAxOworICBib29sIFZlY3RvclJlZHVjdGlvbiA6IDE7CisgIGJvb2wgQWxsb3dDb250cmFjdCA6IDE7CisKK3B1YmxpYzoKKyAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IgdHVybnMgb2ZmIGFsbCBvcHRpbWl6YXRpb24gZmxhZ3MuCisgIFNETm9kZUZsYWdzKCkKKyAgICAgIDogQW55RGVmaW5lZChmYWxzZSksIE5vVW5zaWduZWRXcmFwKGZhbHNlKSwgTm9TaWduZWRXcmFwKGZhbHNlKSwKKyAgICAgICAgRXhhY3QoZmFsc2UpLCBVbnNhZmVBbGdlYnJhKGZhbHNlKSwgTm9OYU5zKGZhbHNlKSwgTm9JbmZzKGZhbHNlKSwKKyAgICAgICAgTm9TaWduZWRaZXJvcyhmYWxzZSksIEFsbG93UmVjaXByb2NhbChmYWxzZSksIFZlY3RvclJlZHVjdGlvbihmYWxzZSksCisgICAgICAgIEFsbG93Q29udHJhY3QoZmFsc2UpIHt9CisKKyAgLy8vIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBmbGFncyB0byB0aGUgZGVmaW5lZCBzdGF0ZS4KKyAgdm9pZCBzZXREZWZpbmVkKCkgeyBBbnlEZWZpbmVkID0gdHJ1ZTsgfQorICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmbGFncyBhcmUgaW4gYSBkZWZpbmVkIHN0YXRlLgorICBib29sIGlzRGVmaW5lZCgpIGNvbnN0IHsgcmV0dXJuIEFueURlZmluZWQ7IH0KKworICAvLyBUaGVzZSBhcmUgbXV0YXRvcnMgZm9yIGVhY2ggZmxhZy4KKyAgdm9pZCBzZXROb1Vuc2lnbmVkV3JhcChib29sIGIpIHsKKyAgICBzZXREZWZpbmVkKCk7CisgICAgTm9VbnNpZ25lZFdyYXAgPSBiOworICB9CisgIHZvaWQgc2V0Tm9TaWduZWRXcmFwKGJvb2wgYikgeworICAgIHNldERlZmluZWQoKTsKKyAgICBOb1NpZ25lZFdyYXAgPSBiOworICB9CisgIHZvaWQgc2V0RXhhY3QoYm9vbCBiKSB7CisgICAgc2V0RGVmaW5lZCgpOworICAgIEV4YWN0ID0gYjsKKyAgfQorICB2b2lkIHNldFVuc2FmZUFsZ2VicmEoYm9vbCBiKSB7CisgICAgc2V0RGVmaW5lZCgpOworICAgIFVuc2FmZUFsZ2VicmEgPSBiOworICB9CisgIHZvaWQgc2V0Tm9OYU5zKGJvb2wgYikgeworICAgIHNldERlZmluZWQoKTsKKyAgICBOb05hTnMgPSBiOworICB9CisgIHZvaWQgc2V0Tm9JbmZzKGJvb2wgYikgeworICAgIHNldERlZmluZWQoKTsKKyAgICBOb0luZnMgPSBiOworICB9CisgIHZvaWQgc2V0Tm9TaWduZWRaZXJvcyhib29sIGIpIHsKKyAgICBzZXREZWZpbmVkKCk7CisgICAgTm9TaWduZWRaZXJvcyA9IGI7CisgIH0KKyAgdm9pZCBzZXRBbGxvd1JlY2lwcm9jYWwoYm9vbCBiKSB7CisgICAgc2V0RGVmaW5lZCgpOworICAgIEFsbG93UmVjaXByb2NhbCA9IGI7CisgIH0KKyAgdm9pZCBzZXRWZWN0b3JSZWR1Y3Rpb24oYm9vbCBiKSB7CisgICAgc2V0RGVmaW5lZCgpOworICAgIFZlY3RvclJlZHVjdGlvbiA9IGI7CisgIH0KKyAgdm9pZCBzZXRBbGxvd0NvbnRyYWN0KGJvb2wgYikgeworICAgIHNldERlZmluZWQoKTsKKyAgICBBbGxvd0NvbnRyYWN0ID0gYjsKKyAgfQorCisgIC8vIFRoZXNlIGFyZSBhY2Nlc3NvcnMgZm9yIGVhY2ggZmxhZy4KKyAgYm9vbCBoYXNOb1Vuc2lnbmVkV3JhcCgpIGNvbnN0IHsgcmV0dXJuIE5vVW5zaWduZWRXcmFwOyB9CisgIGJvb2wgaGFzTm9TaWduZWRXcmFwKCkgY29uc3QgeyByZXR1cm4gTm9TaWduZWRXcmFwOyB9CisgIGJvb2wgaGFzRXhhY3QoKSBjb25zdCB7IHJldHVybiBFeGFjdDsgfQorICBib29sIGhhc1Vuc2FmZUFsZ2VicmEoKSBjb25zdCB7IHJldHVybiBVbnNhZmVBbGdlYnJhOyB9CisgIGJvb2wgaGFzTm9OYU5zKCkgY29uc3QgeyByZXR1cm4gTm9OYU5zOyB9CisgIGJvb2wgaGFzTm9JbmZzKCkgY29uc3QgeyByZXR1cm4gTm9JbmZzOyB9CisgIGJvb2wgaGFzTm9TaWduZWRaZXJvcygpIGNvbnN0IHsgcmV0dXJuIE5vU2lnbmVkWmVyb3M7IH0KKyAgYm9vbCBoYXNBbGxvd1JlY2lwcm9jYWwoKSBjb25zdCB7IHJldHVybiBBbGxvd1JlY2lwcm9jYWw7IH0KKyAgYm9vbCBoYXNWZWN0b3JSZWR1Y3Rpb24oKSBjb25zdCB7IHJldHVybiBWZWN0b3JSZWR1Y3Rpb247IH0KKyAgYm9vbCBoYXNBbGxvd0NvbnRyYWN0KCkgY29uc3QgeyByZXR1cm4gQWxsb3dDb250cmFjdDsgfQorCisgIC8vLyBDbGVhciBhbnkgZmxhZ3MgaW4gdGhpcyBmbGFnIHNldCB0aGF0IGFyZW4ndCBhbHNvIHNldCBpbiBGbGFncy4KKyAgLy8vIElmIHRoZSBnaXZlbiBGbGFncyBhcmUgdW5kZWZpbmVkIHRoZW4gZG9uJ3QgZG8gYW55dGhpbmcuCisgIHZvaWQgaW50ZXJzZWN0V2l0aChjb25zdCBTRE5vZGVGbGFncyBGbGFncykgeworICAgIGlmICghRmxhZ3MuaXNEZWZpbmVkKCkpCisgICAgICByZXR1cm47CisgICAgTm9VbnNpZ25lZFdyYXAgJj0gRmxhZ3MuTm9VbnNpZ25lZFdyYXA7CisgICAgTm9TaWduZWRXcmFwICY9IEZsYWdzLk5vU2lnbmVkV3JhcDsKKyAgICBFeGFjdCAmPSBGbGFncy5FeGFjdDsKKyAgICBVbnNhZmVBbGdlYnJhICY9IEZsYWdzLlVuc2FmZUFsZ2VicmE7CisgICAgTm9OYU5zICY9IEZsYWdzLk5vTmFOczsKKyAgICBOb0luZnMgJj0gRmxhZ3MuTm9JbmZzOworICAgIE5vU2lnbmVkWmVyb3MgJj0gRmxhZ3MuTm9TaWduZWRaZXJvczsKKyAgICBBbGxvd1JlY2lwcm9jYWwgJj0gRmxhZ3MuQWxsb3dSZWNpcHJvY2FsOworICAgIFZlY3RvclJlZHVjdGlvbiAmPSBGbGFncy5WZWN0b3JSZWR1Y3Rpb247CisgICAgQWxsb3dDb250cmFjdCAmPSBGbGFncy5BbGxvd0NvbnRyYWN0OworICB9Cit9OworCisvLy8gUmVwcmVzZW50cyBvbmUgbm9kZSBpbiB0aGUgU2VsZWN0aW9uREFHLgorLy8vCitjbGFzcyBTRE5vZGUgOiBwdWJsaWMgRm9sZGluZ1NldE5vZGUsIHB1YmxpYyBpbGlzdF9ub2RlPFNETm9kZT4geworcHJpdmF0ZToKKyAgLy8vIFRoZSBvcGVyYXRpb24gdGhhdCB0aGlzIG5vZGUgcGVyZm9ybXMuCisgIGludDE2X3QgTm9kZVR5cGU7CisKK3Byb3RlY3RlZDoKKyAgLy8gV2UgZGVmaW5lIGEgc2V0IG9mIG1pbmktaGVscGVyIGNsYXNzZXMgdG8gaGVscCB1cyBpbnRlcnByZXQgdGhlIGJpdHMgaW4gb3VyCisgIC8vIFN1YmNsYXNzRGF0YS4gIFRoZXNlIGFyZSBkZXNpZ25lZCB0byBmaXQgd2l0aGluIGEgdWludDE2X3Qgc28gdGhleSBwYWNrCisgIC8vIHdpdGggTm9kZVR5cGUuCisKKyAgY2xhc3MgU0ROb2RlQml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgU0ROb2RlOworICAgIGZyaWVuZCBjbGFzcyBNZW1JbnRyaW5zaWNTRE5vZGU7CisgICAgZnJpZW5kIGNsYXNzIE1lbVNETm9kZTsKKyAgICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgICAgdWludDE2X3QgSGFzRGVidWdWYWx1ZSA6IDE7CisgICAgdWludDE2X3QgSXNNZW1JbnRyaW5zaWMgOiAxOworICAgIHVpbnQxNl90IElzRGl2ZXJnZW50IDogMTsKKyAgfTsKKyAgZW51bSB7IE51bVNETm9kZUJpdHMgPSAzIH07CisKKyAgY2xhc3MgQ29uc3RhbnRTRE5vZGVCaXRmaWVsZHMgeworICAgIGZyaWVuZCBjbGFzcyBDb25zdGFudFNETm9kZTsKKworICAgIHVpbnQxNl90IDogTnVtU0ROb2RlQml0czsKKworICAgIHVpbnQxNl90IElzT3BhcXVlIDogMTsKKyAgfTsKKworICBjbGFzcyBNZW1TRE5vZGVCaXRmaWVsZHMgeworICAgIGZyaWVuZCBjbGFzcyBNZW1TRE5vZGU7CisgICAgZnJpZW5kIGNsYXNzIE1lbUludHJpbnNpY1NETm9kZTsKKyAgICBmcmllbmQgY2xhc3MgQXRvbWljU0ROb2RlOworCisgICAgdWludDE2X3QgOiBOdW1TRE5vZGVCaXRzOworCisgICAgdWludDE2X3QgSXNWb2xhdGlsZSA6IDE7CisgICAgdWludDE2X3QgSXNOb25UZW1wb3JhbCA6IDE7CisgICAgdWludDE2X3QgSXNEZXJlZmVyZW5jZWFibGUgOiAxOworICAgIHVpbnQxNl90IElzSW52YXJpYW50IDogMTsKKyAgfTsKKyAgZW51bSB7IE51bU1lbVNETm9kZUJpdHMgPSBOdW1TRE5vZGVCaXRzICsgNCB9OworCisgIGNsYXNzIExTQmFzZVNETm9kZUJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIExTQmFzZVNETm9kZTsKKworICAgIHVpbnQxNl90IDogTnVtTWVtU0ROb2RlQml0czsKKworICAgIHVpbnQxNl90IEFkZHJlc3NpbmdNb2RlIDogMzsgLy8gZW51bSBJU0Q6Ok1lbUluZGV4ZWRNb2RlCisgIH07CisgIGVudW0geyBOdW1MU0Jhc2VTRE5vZGVCaXRzID0gTnVtTWVtU0ROb2RlQml0cyArIDMgfTsKKworICBjbGFzcyBMb2FkU0ROb2RlQml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgTG9hZFNETm9kZTsKKyAgICBmcmllbmQgY2xhc3MgTWFza2VkTG9hZFNETm9kZTsKKworICAgIHVpbnQxNl90IDogTnVtTFNCYXNlU0ROb2RlQml0czsKKworICAgIHVpbnQxNl90IEV4dFR5IDogMjsgLy8gZW51bSBJU0Q6OkxvYWRFeHRUeXBlCisgICAgdWludDE2X3QgSXNFeHBhbmRpbmcgOiAxOworICB9OworCisgIGNsYXNzIFN0b3JlU0ROb2RlQml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgU3RvcmVTRE5vZGU7CisgICAgZnJpZW5kIGNsYXNzIE1hc2tlZFN0b3JlU0ROb2RlOworCisgICAgdWludDE2X3QgOiBOdW1MU0Jhc2VTRE5vZGVCaXRzOworCisgICAgdWludDE2X3QgSXNUcnVuY2F0aW5nIDogMTsKKyAgICB1aW50MTZfdCBJc0NvbXByZXNzaW5nIDogMTsKKyAgfTsKKworICB1bmlvbiB7CisgICAgY2hhciBSYXdTRE5vZGVCaXRzW3NpemVvZih1aW50MTZfdCldOworICAgIFNETm9kZUJpdGZpZWxkcyBTRE5vZGVCaXRzOworICAgIENvbnN0YW50U0ROb2RlQml0ZmllbGRzIENvbnN0YW50U0ROb2RlQml0czsKKyAgICBNZW1TRE5vZGVCaXRmaWVsZHMgTWVtU0ROb2RlQml0czsKKyAgICBMU0Jhc2VTRE5vZGVCaXRmaWVsZHMgTFNCYXNlU0ROb2RlQml0czsKKyAgICBMb2FkU0ROb2RlQml0ZmllbGRzIExvYWRTRE5vZGVCaXRzOworICAgIFN0b3JlU0ROb2RlQml0ZmllbGRzIFN0b3JlU0ROb2RlQml0czsKKyAgfTsKKworICAvLyBSYXdTRE5vZGVCaXRzIG11c3QgY292ZXIgdGhlIGVudGlyZXR5IG9mIHRoZSB1bmlvbi4gIFRoaXMgbWVhbnMgdGhhdCBhbGwgb2YKKyAgLy8gdGhlIHVuaW9uJ3MgbWVtYmVycyBtdXN0IGhhdmUgc2l6ZSA8PSBSYXdTRE5vZGVCaXRzLiAgV2Ugd3JpdGUgdGhlIFJIUyBhcworICAvLyAiMiIgaW5zdGVhZCBvZiBzaXplb2YoUmF3U0ROb2RlQml0cykgYmVjYXVzZSBNU1ZDIGNhbid0IGhhbmRsZSB0aGUgbGF0dGVyLgorICBzdGF0aWNfYXNzZXJ0KHNpemVvZihTRE5vZGVCaXRmaWVsZHMpIDw9IDIsICJmaWVsZCB0b28gd2lkZSIpOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDb25zdGFudFNETm9kZUJpdGZpZWxkcykgPD0gMiwgImZpZWxkIHRvbyB3aWRlIik7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKE1lbVNETm9kZUJpdGZpZWxkcykgPD0gMiwgImZpZWxkIHRvbyB3aWRlIik7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKExTQmFzZVNETm9kZUJpdGZpZWxkcykgPD0gMiwgImZpZWxkIHRvbyB3aWRlIik7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKExvYWRTRE5vZGVCaXRmaWVsZHMpIDw9IDQsICJmaWVsZCB0b28gd2lkZSIpOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihTdG9yZVNETm9kZUJpdGZpZWxkcykgPD0gMiwgImZpZWxkIHRvbyB3aWRlIik7CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisgIC8vIFRPRE86IHVuZnJpZW5kIEhhbmRsZVNETm9kZSBvbmNlIHdlIGZpeCBpdHMgb3BlcmFuZCBoYW5kbGluZy4KKyAgZnJpZW5kIGNsYXNzIEhhbmRsZVNETm9kZTsKKworICAvLy8gVW5pcXVlIGlkIHBlciBTRE5vZGUgaW4gdGhlIERBRy4KKyAgaW50IE5vZGVJZCA9IC0xOworCisgIC8vLyBUaGUgdmFsdWVzIHRoYXQgYXJlIHVzZWQgYnkgdGhpcyBvcGVyYXRpb24uCisgIFNEVXNlICpPcGVyYW5kTGlzdCA9IG51bGxwdHI7CisKKyAgLy8vIFRoZSB0eXBlcyBvZiB0aGUgdmFsdWVzIHRoaXMgbm9kZSBkZWZpbmVzLiAgU0ROb2RlJ3MgbWF5CisgIC8vLyBkZWZpbmUgbXVsdGlwbGUgdmFsdWVzIHNpbXVsdGFuZW91c2x5LgorICBjb25zdCBFVlQgKlZhbHVlTGlzdDsKKworICAvLy8gTGlzdCBvZiB1c2VzIGZvciB0aGlzIFNETm9kZS4KKyAgU0RVc2UgKlVzZUxpc3QgPSBudWxscHRyOworCisgIC8vLyBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIE9wZXJhbmQvVmFsdWUgbGlzdC4KKyAgdW5zaWduZWQgc2hvcnQgTnVtT3BlcmFuZHMgPSAwOworICB1bnNpZ25lZCBzaG9ydCBOdW1WYWx1ZXM7CisKKyAgLy8gVGhlIG9yZGVyaW5nIG9mIHRoZSBTRE5vZGVzLiBJdCByb3VnaGx5IGNvcnJlc3BvbmRzIHRvIHRoZSBvcmRlcmluZyBvZiB0aGUKKyAgLy8gb3JpZ2luYWwgTExWTSBpbnN0cnVjdGlvbnMuCisgIC8vIFRoaXMgaXMgdXNlZCBmb3IgdHVybmluZyBvZmYgc2NoZWR1bGluZywgYmVjYXVzZSB3ZSdsbCBmb3JnbworICAvLyB0aGUgbm9ybWFsIHNjaGVkdWxpbmcgYWxnb3JpdGhtcyBhbmQgb3V0cHV0IHRoZSBpbnN0cnVjdGlvbnMgYWNjb3JkaW5nIHRvCisgIC8vIHRoaXMgb3JkZXJpbmcuCisgIHVuc2lnbmVkIElST3JkZXI7CisKKyAgLy8vIFNvdXJjZSBsaW5lIGluZm9ybWF0aW9uLgorICBEZWJ1Z0xvYyBkZWJ1Z0xvYzsKKworICAvLy8gUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIHR5cGUuCisgIHN0YXRpYyBjb25zdCBFVlQgKmdldFZhbHVlVHlwZUxpc3QoRVZUIFZUKTsKKworICBTRE5vZGVGbGFncyBGbGFnczsKKworcHVibGljOgorICAvLy8gVW5pcXVlIGFuZCBwZXJzaXN0ZW50IGlkIHBlciBTRE5vZGUgaW4gdGhlIERBRy4KKyAgLy8vIFVzZWQgZm9yIGRlYnVnIHByaW50aW5nLgorICB1aW50MTZfdCBQZXJzaXN0ZW50SWQ7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vICBBY2Nlc3NvcnMKKyAgLy8KKworICAvLy8gUmV0dXJuIHRoZSBTZWxlY3Rpb25EQUcgb3Bjb2RlIHZhbHVlIGZvciB0aGlzIG5vZGUuIEZvcgorICAvLy8gcHJlLWlzZWwgbm9kZXMgKHRob3NlIGZvciB3aGljaCBpc01hY2hpbmVPcGNvZGUgcmV0dXJucyBmYWxzZSksIHRoZXNlCisgIC8vLyBhcmUgdGhlIG9wY29kZSB2YWx1ZXMgaW4gdGhlIElTRCBhbmQgPHRhcmdldD5JU0QgbmFtZXNwYWNlcy4gRm9yCisgIC8vLyBwb3N0LWlzZWwgb3Bjb2Rlcywgc2VlIGdldE1hY2hpbmVPcGNvZGUuCisgIHVuc2lnbmVkIGdldE9wY29kZSgpICBjb25zdCB7IHJldHVybiAodW5zaWduZWQgc2hvcnQpTm9kZVR5cGU7IH0KKworICAvLy8gVGVzdCBpZiB0aGlzIG5vZGUgaGFzIGEgdGFyZ2V0LXNwZWNpZmljIG9wY29kZSAoaW4gdGhlCisgIC8vLyBcPHRhcmdldFw+SVNEIG5hbWVzcGFjZSkuCisgIGJvb2wgaXNUYXJnZXRPcGNvZGUoKSBjb25zdCB7IHJldHVybiBOb2RlVHlwZSA+PSBJU0Q6OkJVSUxUSU5fT1BfRU5EOyB9CisKKyAgLy8vIFRlc3QgaWYgdGhpcyBub2RlIGhhcyBhIHRhcmdldC1zcGVjaWZpYworICAvLy8gbWVtb3J5LXJlZmVyZW5jaW5nIG9wY29kZSAoaW4gdGhlIFw8dGFyZ2V0XD5JU0QgbmFtZXNwYWNlIGFuZAorICAvLy8gZ3JlYXRlciB0aGFuIEZJUlNUX1RBUkdFVF9NRU1PUllfT1BDT0RFKS4KKyAgYm9vbCBpc1RhcmdldE1lbW9yeU9wY29kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9kZVR5cGUgPj0gSVNEOjpGSVJTVF9UQVJHRVRfTUVNT1JZX09QQ09ERTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBvZiB0aGUgbm9kZSB0eXBlIHVuZGVmaW5lZC4KKyAgYm9vbCBpc1VuZGVmKCkgY29uc3QgeyByZXR1cm4gTm9kZVR5cGUgPT0gSVNEOjpVTkRFRjsgfQorCisgIC8vLyBUZXN0IGlmIHRoaXMgbm9kZSBpcyBhIG1lbW9yeSBpbnRyaW5zaWMgKHdpdGggdmFsaWQgcG9pbnRlciBpbmZvcm1hdGlvbikuCisgIC8vLyBJTlRSSU5TSUNfV19DSEFJTiBhbmQgSU5UUklOU0lDX1ZPSUQgbm9kZXMgYXJlIHNvbWV0aW1lcyBjcmVhdGVkIGZvcgorICAvLy8gbm9uLW1lbW9yeSBpbnRyaW5zaWNzICh3aXRoIGNoYWlucykgdGhhdCBhcmUgbm90IHJlYWxseSBpbnN0YW5jZXMgb2YKKyAgLy8vIE1lbVNETm9kZS4gRm9yIHN1Y2ggbm9kZXMsIHdlIG5lZWQgc29tZSBleHRyYSBzdGF0ZSB0byBkZXRlcm1pbmUgdGhlCisgIC8vLyBwcm9wZXIgY2xhc3NvZiByZWxhdGlvbnNoaXAuCisgIGJvb2wgaXNNZW1JbnRyaW5zaWMoKSBjb25zdCB7CisgICAgcmV0dXJuIChOb2RlVHlwZSA9PSBJU0Q6OklOVFJJTlNJQ19XX0NIQUlOIHx8CisgICAgICAgICAgICBOb2RlVHlwZSA9PSBJU0Q6OklOVFJJTlNJQ19WT0lEKSAmJgorICAgICAgICAgICBTRE5vZGVCaXRzLklzTWVtSW50cmluc2ljOworICB9CisKKyAgLy8vIFRlc3QgaWYgdGhpcyBub2RlIGlzIGEgc3RyaWN0IGZsb2F0aW5nIHBvaW50IHBzZXVkby1vcC4KKyAgYm9vbCBpc1N0cmljdEZQT3Bjb2RlKCkgeworICAgIHN3aXRjaCAoTm9kZVR5cGUpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGNhc2UgSVNEOjpTVFJJQ1RfRkFERDoKKyAgICAgIGNhc2UgSVNEOjpTVFJJQ1RfRlNVQjoKKyAgICAgIGNhc2UgSVNEOjpTVFJJQ1RfRk1VTDoKKyAgICAgIGNhc2UgSVNEOjpTVFJJQ1RfRkRJVjoKKyAgICAgIGNhc2UgSVNEOjpTVFJJQ1RfRlJFTToKKyAgICAgIGNhc2UgSVNEOjpTVFJJQ1RfRk1BOgorICAgICAgY2FzZSBJU0Q6OlNUUklDVF9GU1FSVDoKKyAgICAgIGNhc2UgSVNEOjpTVFJJQ1RfRlBPVzoKKyAgICAgIGNhc2UgSVNEOjpTVFJJQ1RfRlBPV0k6CisgICAgICBjYXNlIElTRDo6U1RSSUNUX0ZTSU46CisgICAgICBjYXNlIElTRDo6U1RSSUNUX0ZDT1M6CisgICAgICBjYXNlIElTRDo6U1RSSUNUX0ZFWFA6CisgICAgICBjYXNlIElTRDo6U1RSSUNUX0ZFWFAyOgorICAgICAgY2FzZSBJU0Q6OlNUUklDVF9GTE9HOgorICAgICAgY2FzZSBJU0Q6OlNUUklDVF9GTE9HMTA6CisgICAgICBjYXNlIElTRDo6U1RSSUNUX0ZMT0cyOgorICAgICAgY2FzZSBJU0Q6OlNUUklDVF9GUklOVDoKKyAgICAgIGNhc2UgSVNEOjpTVFJJQ1RfRk5FQVJCWUlOVDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgLy8vIFRlc3QgaWYgdGhpcyBub2RlIGhhcyBhIHBvc3QtaXNlbCBvcGNvZGUsIGRpcmVjdGx5CisgIC8vLyBjb3JyZXNwb25kaW5nIHRvIGEgTWFjaGluZUluc3RyIG9wY29kZS4KKyAgYm9vbCBpc01hY2hpbmVPcGNvZGUoKSBjb25zdCB7IHJldHVybiBOb2RlVHlwZSA8IDA7IH0KKworICAvLy8gVGhpcyBtYXkgb25seSBiZSBjYWxsZWQgaWYgaXNNYWNoaW5lT3Bjb2RlIHJldHVybnMKKyAgLy8vIHRydWUuIEl0IHJldHVybnMgdGhlIE1hY2hpbmVJbnN0ciBvcGNvZGUgdmFsdWUgdGhhdCB0aGUgbm9kZSdzIG9wY29kZQorICAvLy8gY29ycmVzcG9uZHMgdG8uCisgIHVuc2lnbmVkIGdldE1hY2hpbmVPcGNvZGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzTWFjaGluZU9wY29kZSgpICYmICJOb3QgYSBNYWNoaW5lSW5zdHIgb3Bjb2RlISIpOworICAgIHJldHVybiB+Tm9kZVR5cGU7CisgIH0KKworICBib29sIGdldEhhc0RlYnVnVmFsdWUoKSBjb25zdCB7IHJldHVybiBTRE5vZGVCaXRzLkhhc0RlYnVnVmFsdWU7IH0KKyAgdm9pZCBzZXRIYXNEZWJ1Z1ZhbHVlKGJvb2wgYikgeyBTRE5vZGVCaXRzLkhhc0RlYnVnVmFsdWUgPSBiOyB9CisKKyAgYm9vbCBpc0RpdmVyZ2VudCgpIGNvbnN0IHsgcmV0dXJuIFNETm9kZUJpdHMuSXNEaXZlcmdlbnQ7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG5vIHVzZXMgb2YgdGhpcyBub2RlLgorICBib29sIHVzZV9lbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFVzZUxpc3QgPT0gbnVsbHB0cjsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBleGFjdGx5IG9uZSB1c2Ugb2YgdGhpcyBub2RlLgorICBib29sIGhhc09uZVVzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIXVzZV9lbXB0eSgpICYmIHN0ZDo6bmV4dCh1c2VfYmVnaW4oKSkgPT0gdXNlX2VuZCgpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHVzZXMgb2YgdGhpcyBub2RlLiBUaGlzIG1ldGhvZCB0YWtlcworICAvLy8gdGltZSBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlciBvZiB1c2VzLgorICBzaXplX3QgdXNlX3NpemUoKSBjb25zdCB7IHJldHVybiBzdGQ6OmRpc3RhbmNlKHVzZV9iZWdpbigpLCB1c2VfZW5kKCkpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgdW5pcXVlIG5vZGUgaWQuCisgIGludCBnZXROb2RlSWQoKSBjb25zdCB7IHJldHVybiBOb2RlSWQ7IH0KKworICAvLy8gU2V0IHVuaXF1ZSBub2RlIGlkLgorICB2b2lkIHNldE5vZGVJZChpbnQgSWQpIHsgTm9kZUlkID0gSWQ7IH0KKworICAvLy8gUmV0dXJuIHRoZSBub2RlIG9yZGVyaW5nLgorICB1bnNpZ25lZCBnZXRJUk9yZGVyKCkgY29uc3QgeyByZXR1cm4gSVJPcmRlcjsgfQorCisgIC8vLyBTZXQgdGhlIG5vZGUgb3JkZXJpbmcuCisgIHZvaWQgc2V0SVJPcmRlcih1bnNpZ25lZCBPcmRlcikgeyBJUk9yZGVyID0gT3JkZXI7IH0KKworICAvLy8gUmV0dXJuIHRoZSBzb3VyY2UgbG9jYXRpb24gaW5mby4KKyAgY29uc3QgRGVidWdMb2MgJmdldERlYnVnTG9jKCkgY29uc3QgeyByZXR1cm4gZGVidWdMb2M7IH0KKworICAvLy8gU2V0IHNvdXJjZSBsb2NhdGlvbiBpbmZvLiAgVHJ5IHRvIGF2b2lkIHRoaXMsIHB1dHRpbmcKKyAgLy8vIGl0IGluIHRoZSBjb25zdHJ1Y3RvciBpcyBwcmVmZXJhYmxlLgorICB2b2lkIHNldERlYnVnTG9jKERlYnVnTG9jIGRsKSB7IGRlYnVnTG9jID0gc3RkOjptb3ZlKGRsKTsgfQorCisgIC8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGl0ZXJhdG9yIHN1cHBvcnQgZm9yIFNEVXNlCisgIC8vLyBvcGVyYW5kcyB0aGF0IHVzZSBhIHNwZWNpZmljIFNETm9kZS4KKyAgY2xhc3MgdXNlX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBTRFVzZSwgcHRyZGlmZl90PiB7CisgICAgZnJpZW5kIGNsYXNzIFNETm9kZTsKKworICAgIFNEVXNlICpPcCA9IG51bGxwdHI7CisKKyAgICBleHBsaWNpdCB1c2VfaXRlcmF0b3IoU0RVc2UgKm9wKSA6IE9wKG9wKSB7fQorCisgIHB1YmxpYzoKKyAgICB1c2luZyByZWZlcmVuY2UgPSBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFVzZSwgcHRyZGlmZl90Pjo6cmVmZXJlbmNlOworICAgIHVzaW5nIHBvaW50ZXIgPSBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RVc2UsIHB0cmRpZmZfdD46OnBvaW50ZXI7CisKKyAgICB1c2VfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgICAgdXNlX2l0ZXJhdG9yKGNvbnN0IHVzZV9pdGVyYXRvciAmSSkgOiBPcChJLk9wKSB7fQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHVzZV9pdGVyYXRvciAmeCkgY29uc3QgeworICAgICAgcmV0dXJuIE9wID09IHguT3A7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCB1c2VfaXRlcmF0b3IgJngpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PSh4KTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHVzZXMgbGlzdC4KKyAgICBib29sIGF0RW5kKCkgY29uc3QgeyByZXR1cm4gT3AgPT0gbnVsbHB0cjsgfQorCisgICAgLy8gSXRlcmF0b3IgdHJhdmVyc2FsOiBmb3J3YXJkIGl0ZXJhdGlvbiBvbmx5LgorICAgIHVzZV9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsgICAgICAgICAgLy8gUHJlaW5jcmVtZW50CisgICAgICBhc3NlcnQoT3AgJiYgIkNhbm5vdCBpbmNyZW1lbnQgZW5kIGl0ZXJhdG9yISIpOworICAgICAgT3AgPSBPcC0+Z2V0TmV4dCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHVzZV9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAgICAgICAgLy8gUG9zdGluY3JlbWVudAorICAgICAgdXNlX2l0ZXJhdG9yIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICAgIH0KKworICAgIC8vLyBSZXRyaWV2ZSBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgdXNlciBub2RlLgorICAgIFNETm9kZSAqb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgYXNzZXJ0KE9wICYmICJDYW5ub3QgZGVyZWZlcmVuY2UgZW5kIGl0ZXJhdG9yISIpOworICAgICAgcmV0dXJuIE9wLT5nZXRVc2VyKCk7CisgICAgfQorCisgICAgU0ROb2RlICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gb3BlcmF0b3IqKCk7IH0KKworICAgIFNEVXNlICZnZXRVc2UoKSBjb25zdCB7IHJldHVybiAqT3A7IH0KKworICAgIC8vLyBSZXRyaWV2ZSB0aGUgb3BlcmFuZCAjIG9mIHRoaXMgdXNlIGluIGl0cyB1c2VyLgorICAgIHVuc2lnbmVkIGdldE9wZXJhbmRObygpIGNvbnN0IHsKKyAgICAgIGFzc2VydChPcCAmJiAiQ2Fubm90IGRlcmVmZXJlbmNlIGVuZCBpdGVyYXRvciEiKTsKKyAgICAgIHJldHVybiAodW5zaWduZWQpKE9wIC0gT3AtPmdldFVzZXIoKS0+T3BlcmFuZExpc3QpOworICAgIH0KKyAgfTsKKworICAvLy8gUHJvdmlkZSBpdGVyYXRpb24gc3VwcG9ydCB0byB3YWxrIG92ZXIgYWxsIHVzZXMgb2YgYW4gU0ROb2RlLgorICB1c2VfaXRlcmF0b3IgdXNlX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiB1c2VfaXRlcmF0b3IoVXNlTGlzdCk7CisgIH0KKworICBzdGF0aWMgdXNlX2l0ZXJhdG9yIHVzZV9lbmQoKSB7IHJldHVybiB1c2VfaXRlcmF0b3IobnVsbHB0cik7IH0KKworICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8dXNlX2l0ZXJhdG9yPiB1c2VzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHVzZV9iZWdpbigpLCB1c2VfZW5kKCkpOworICB9CisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTx1c2VfaXRlcmF0b3I+IHVzZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UodXNlX2JlZ2luKCksIHVzZV9lbmQoKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGV4YWN0bHkgTlVTRVMgdXNlcyBvZiB0aGUgaW5kaWNhdGVkIHZhbHVlLgorICAvLy8gVGhpcyBtZXRob2QgaWdub3JlcyB1c2VzIG9mIG90aGVyIHZhbHVlcyBkZWZpbmVkIGJ5IHRoaXMgb3BlcmF0aW9uLgorICBib29sIGhhc05Vc2VzT2ZWYWx1ZSh1bnNpZ25lZCBOVXNlcywgdW5zaWduZWQgVmFsdWUpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IHVzZSBvZiB0aGUgaW5kaWNhdGVkIHZhbHVlLgorICAvLy8gVGhpcyBtZXRob2QgaWdub3JlcyB1c2VzIG9mIG90aGVyIHZhbHVlcyBkZWZpbmVkIGJ5IHRoaXMgb3BlcmF0aW9uLgorICBib29sIGhhc0FueVVzZU9mVmFsdWUodW5zaWduZWQgVmFsdWUpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG5vZGUgaXMgdGhlIG9ubHkgdXNlIG9mIE4uCisgIGJvb2wgaXNPbmx5VXNlck9mKGNvbnN0IFNETm9kZSAqTikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgbm9kZSBpcyBhbiBvcGVyYW5kIG9mIE4uCisgIGJvb2wgaXNPcGVyYW5kT2YoY29uc3QgU0ROb2RlICpOKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBub2RlIGlzIGEgcHJlZGVjZXNzb3Igb2YgTi4KKyAgLy8vIE5PVEU6IEltcGxlbWVudGVkIG9uIHRvcCBvZiBoYXNQcmVkZWNlc3NvciBhbmQgZXZlcnkgYml0IGFzCisgIC8vLyBleHBlbnNpdmUuIFVzZSBjYXJlZnVsbHkuCisgIGJvb2wgaXNQcmVkZWNlc3Nvck9mKGNvbnN0IFNETm9kZSAqTikgY29uc3QgeworICAgIHJldHVybiBOLT5oYXNQcmVkZWNlc3Nvcih0aGlzKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBOIGlzIGEgcHJlZGVjZXNzb3Igb2YgdGhpcyBub2RlLgorICAvLy8gTiBpcyBlaXRoZXIgYW4gb3BlcmFuZCBvZiB0aGlzIG5vZGUsIG9yIGNhbiBiZSByZWFjaGVkIGJ5IHJlY3Vyc2l2ZWx5CisgIC8vLyB0cmF2ZXJzaW5nIHVwIHRoZSBvcGVyYW5kcy4KKyAgLy8vIE5PVEU6IFRoaXMgaXMgYW4gZXhwZW5zaXZlIG1ldGhvZC4gVXNlIGl0IGNhcmVmdWxseS4KKyAgYm9vbCBoYXNQcmVkZWNlc3Nvcihjb25zdCBTRE5vZGUgKk4pIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgTiBpcyBhIHByZWRlY2Vzc29yIG9mIGFueSBub2RlIGluIFdvcmtsaXN0LiBUaGlzCisgIC8vLyBoZWxwZXIga2VlcHMgVmlzaXRlZCBhbmQgV29ya2xpc3Qgc2V0cyBleHRlcm5hbGx5IHRvIGFsbG93IHVuaW9ucworICAvLy8gc2VhcmNoZXMgdG8gYmUgcGVyZm9ybWVkIGluIHBhcmFsbGVsLCBjYWNoaW5nIG9mIHJlc3VsdHMgYWNyb3NzCisgIC8vLyBxdWVyaWVzIGFuZCBpbmNyZW1lbnRhbCBhZGRpdGlvbiB0byBXb3JrbGlzdC4gU3RvcHMgZWFybHkgaWYgTiBpcworICAvLy8gZm91bmQgYnV0IHdpbGwgcmVzdW1lLiBSZW1lbWJlciB0byBjbGVhciBWaXNpdGVkIGFuZCBXb3JrbGlzdHMKKyAgLy8vIGlmIERBRyBjaGFuZ2VzLiBNYXhTdGVwcyBnaXZlcyBhIG1heGltdW0gbnVtYmVyIG9mIG5vZGVzIHRvIHZpc2l0IGJlZm9yZQorICAvLy8gZ2l2aW5nIHVwLiBUaGUgVG9wb2xvZ2ljYWxQcnVuZSBmbGFnIHNpZ25hbHMgdGhhdCBwb3NpdGl2ZSBOb2RlSWRzIGFyZQorICAvLy8gdG9wb2xvZ2ljYWxseSBvcmRlcmVkIChPcGVyYW5kcyBoYXZlIHN0cmljdGx5IHNtYWxsZXIgbm9kZSBpZCkgYW5kIHNlYXJjaAorICAvLy8gY2FuIGJlIHBydW5lZCBsZXZlcmFnaW5nIHRoaXMuCisgIHN0YXRpYyBib29sIGhhc1ByZWRlY2Vzc29ySGVscGVyKGNvbnN0IFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXRJbXBsPGNvbnN0IFNETm9kZSAqPiAmVmlzaXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNETm9kZSAqPiAmV29ya2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBNYXhTdGVwcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVG9wb2xvZ2ljYWxQcnVuZSA9IGZhbHNlKSB7CisgICAgU21hbGxWZWN0b3I8Y29uc3QgU0ROb2RlICosIDg+IERlZmVycmVkTm9kZXM7CisgICAgaWYgKFZpc2l0ZWQuY291bnQoTikpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIE5vZGUgSWQncyBhcmUgYXNzaWduZWQgaW4gdGhyZWUgcGxhY2VzOiBBcyBhIHRvcG9sb2dpY2FsCisgICAgLy8gb3JkZXJpbmcgKD4gMCksIGR1cmluZyBsZWdhbGl6YXRpb24gKHJlc3VsdHMgaW4gdmFsdWVzIHNldCB0bworICAgIC8vIDApLCBuZXcgbm9kZXMgKHNldCB0byAtMSkuIElmIE4gaGFzIGEgdG9wb2xnaWNhbCBpZCB0aGVuIHdlCisgICAgLy8ga25vdyB0aGF0IGFsbCBub2RlcyB3aXRoIGlkcyBzbWFsbGVyIHRoYW4gaXQgY2Fubm90IGJlCisgICAgLy8gc3VjY2Vzc29ycyBhbmQgd2UgbmVlZCBub3QgY2hlY2sgdGhlbS4gRmlsdGVyIG91dCBhbGwgbm9kZQorICAgIC8vIHRoYXQgY2FuJ3QgYmUgbWF0Y2hlcy4gV2UgYWRkIHRoZW0gdG8gdGhlIHdvcmtsaXN0IGJlZm9yZSBleGl0CisgICAgLy8gaW4gY2FzZSBvZiBtdWx0aXBsZSBjYWxscy4gTm90ZSB0aGF0IGR1cmluZyBzZWxlY3Rpb24gdGhlIHRvcG9sb2dpY2FsIGlkCisgICAgLy8gbWF5IGJlIHZpb2xhdGVkIGlmIGEgbm9kZSdzIHByZWRlY2Vzc29yIGlzIHNlbGVjdGVkIGJlZm9yZSBpdC4gV2UgbWFyaworICAgIC8vIHRoaXMgYXQgc2VsZWN0aW9uIG5lZ2F0aW5nIHRoZSBpZCBvZiB1bnNlbGVjdGVkIHN1Y2Nlc3NvcnMgYW5kCisgICAgLy8gcmVzdHJpY3RpbmcgdG9wb2xvZ2ljYWwgcHJ1bmluZyB0byBwb3NpdGl2ZSBpZHMuCisKKyAgICBpbnQgTklkID0gTi0+Z2V0Tm9kZUlkKCk7CisgICAgLy8gSWYgd2UgSW52YWxpZGF0ZWQgdGhlIElkLCByZWNvbnN0cnVjdCBvcmlnaW5hbCBOSWQuCisgICAgaWYgKE5JZCA8IC0xKQorICAgICAgTklkID0gLShOSWQgKyAxKTsKKworICAgIGJvb2wgRm91bmQgPSBmYWxzZTsKKyAgICB3aGlsZSAoIVdvcmtsaXN0LmVtcHR5KCkpIHsKKyAgICAgIGNvbnN0IFNETm9kZSAqTSA9IFdvcmtsaXN0LnBvcF9iYWNrX3ZhbCgpOworICAgICAgaW50IE1JZCA9IE0tPmdldE5vZGVJZCgpOworICAgICAgaWYgKFRvcG9sb2dpY2FsUHJ1bmUgJiYgTS0+Z2V0T3Bjb2RlKCkgIT0gSVNEOjpUb2tlbkZhY3RvciAmJiAoTklkID4gMCkgJiYKKyAgICAgICAgICAoTUlkID4gMCkgJiYgKE1JZCA8IE5JZCkpIHsKKyAgICAgICAgRGVmZXJyZWROb2Rlcy5wdXNoX2JhY2soTSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZm9yIChjb25zdCBTRFZhbHVlICZPcFYgOiBNLT5vcF92YWx1ZXMoKSkgeworICAgICAgICBTRE5vZGUgKk9wID0gT3BWLmdldE5vZGUoKTsKKyAgICAgICAgaWYgKFZpc2l0ZWQuaW5zZXJ0KE9wKS5zZWNvbmQpCisgICAgICAgICAgV29ya2xpc3QucHVzaF9iYWNrKE9wKTsKKyAgICAgICAgaWYgKE9wID09IE4pCisgICAgICAgICAgRm91bmQgPSB0cnVlOworICAgICAgfQorICAgICAgaWYgKEZvdW5kKQorICAgICAgICBicmVhazsKKyAgICAgIGlmIChNYXhTdGVwcyAhPSAwICYmIFZpc2l0ZWQuc2l6ZSgpID49IE1heFN0ZXBzKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gUHVzaCBkZWZlcnJlZCBub2RlcyBiYWNrIG9uIHdvcmtsaXN0LgorICAgIFdvcmtsaXN0LmFwcGVuZChEZWZlcnJlZE5vZGVzLmJlZ2luKCksIERlZmVycmVkTm9kZXMuZW5kKCkpOworICAgIC8vIElmIHdlIGJhaWxlZCBlYXJseSwgY29uc2VydmF0aXZlbHkgcmV0dXJuIGZvdW5kLgorICAgIGlmIChNYXhTdGVwcyAhPSAwICYmIFZpc2l0ZWQuc2l6ZSgpID49IE1heFN0ZXBzKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIEZvdW5kOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGFsbCB0aGUgdXNlcnMgb2YgTiBhcmUgY29udGFpbmVkIGluIE5vZGVzLgorICAvLy8gTk9URTogUmVxdWlyZXMgYXQgbGVhc3Qgb25lIG1hdGNoLCBidXQgZG9lc24ndCByZXF1aXJlIHRoZW0gYWxsLgorICBzdGF0aWMgYm9vbCBhcmVPbmx5VXNlcnNPZihBcnJheVJlZjxjb25zdCBTRE5vZGUgKj4gTm9kZXMsIGNvbnN0IFNETm9kZSAqTik7CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHZhbHVlcyB1c2VkIGJ5IHRoaXMgb3BlcmF0aW9uLgorICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgcmV0dXJuIE51bU9wZXJhbmRzOyB9CisKKyAgLy8vIEhlbHBlciBtZXRob2QgcmV0dXJucyB0aGUgaW50ZWdlciB2YWx1ZSBvZiBhIENvbnN0YW50U0ROb2RlIG9wZXJhbmQuCisgIGlubGluZSB1aW50NjRfdCBnZXRDb25zdGFudE9wZXJhbmRWYWwodW5zaWduZWQgTnVtKSBjb25zdDsKKworICBjb25zdCBTRFZhbHVlICZnZXRPcGVyYW5kKHVuc2lnbmVkIE51bSkgY29uc3QgeworICAgIGFzc2VydChOdW0gPCBOdW1PcGVyYW5kcyAmJiAiSW52YWxpZCBjaGlsZCAjIG9mIFNETm9kZSEiKTsKKyAgICByZXR1cm4gT3BlcmFuZExpc3RbTnVtXTsKKyAgfQorCisgIHVzaW5nIG9wX2l0ZXJhdG9yID0gU0RVc2UgKjsKKworICBvcF9pdGVyYXRvciBvcF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIE9wZXJhbmRMaXN0OyB9CisgIG9wX2l0ZXJhdG9yIG9wX2VuZCgpIGNvbnN0IHsgcmV0dXJuIE9wZXJhbmRMaXN0K051bU9wZXJhbmRzOyB9CisgIEFycmF5UmVmPFNEVXNlPiBvcHMoKSBjb25zdCB7IHJldHVybiBtYWtlQXJyYXlSZWYob3BfYmVnaW4oKSwgb3BfZW5kKCkpOyB9CisKKyAgLy8vIEl0ZXJhdG9yIGZvciBkaXJlY3RseSBpdGVyYXRpbmcgb3ZlciB0aGUgb3BlcmFuZCBTRFZhbHVlJ3MuCisgIHN0cnVjdCB2YWx1ZV9vcF9pdGVyYXRvcgorICAgICAgOiBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8dmFsdWVfb3BfaXRlcmF0b3IsIG9wX2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgU0RWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCwgdmFsdWVfb3BfaXRlcmF0b3IgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX29wX2l0ZXJhdG9yICo+IHsKKyAgICBleHBsaWNpdCB2YWx1ZV9vcF9pdGVyYXRvcihTRFVzZSAqVSA9IG51bGxwdHIpCisgICAgICA6IGl0ZXJhdG9yX2FkYXB0b3JfYmFzZShVKSB7fQorCisgICAgY29uc3QgU0RWYWx1ZSAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gSS0+Z2V0KCk7IH0KKyAgfTsKKworICBpdGVyYXRvcl9yYW5nZTx2YWx1ZV9vcF9pdGVyYXRvcj4gb3BfdmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHZhbHVlX29wX2l0ZXJhdG9yKG9wX2JlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX29wX2l0ZXJhdG9yKG9wX2VuZCgpKSk7CisgIH0KKworICBTRFZUTGlzdCBnZXRWVExpc3QoKSBjb25zdCB7CisgICAgU0RWVExpc3QgWCA9IHsgVmFsdWVMaXN0LCBOdW1WYWx1ZXMgfTsKKyAgICByZXR1cm4gWDsKKyAgfQorCisgIC8vLyBJZiB0aGlzIG5vZGUgaGFzIGEgZ2x1ZSBvcGVyYW5kLCByZXR1cm4gdGhlIG5vZGUKKyAgLy8vIHRvIHdoaWNoIHRoZSBnbHVlIG9wZXJhbmQgcG9pbnRzLiBPdGhlcndpc2UgcmV0dXJuIE5VTEwuCisgIFNETm9kZSAqZ2V0R2x1ZWROb2RlKCkgY29uc3QgeworICAgIGlmIChnZXROdW1PcGVyYW5kcygpICE9IDAgJiYKKyAgICAgICAgZ2V0T3BlcmFuZChnZXROdW1PcGVyYW5kcygpLTEpLmdldFZhbHVlVHlwZSgpID09IE1WVDo6R2x1ZSkKKyAgICAgIHJldHVybiBnZXRPcGVyYW5kKGdldE51bU9wZXJhbmRzKCktMSkuZ2V0Tm9kZSgpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIElmIHRoaXMgbm9kZSBoYXMgYSBnbHVlIHZhbHVlIHdpdGggYSB1c2VyLCByZXR1cm4KKyAgLy8vIHRoZSB1c2VyICh0aGVyZSBpcyBhdCBtb3N0IG9uZSkuIE90aGVyd2lzZSByZXR1cm4gTlVMTC4KKyAgU0ROb2RlICpnZXRHbHVlZFVzZXIoKSBjb25zdCB7CisgICAgZm9yICh1c2VfaXRlcmF0b3IgVUkgPSB1c2VfYmVnaW4oKSwgVUUgPSB1c2VfZW5kKCk7IFVJICE9IFVFOyArK1VJKQorICAgICAgaWYgKFVJLmdldFVzZSgpLmdldCgpLmdldFZhbHVlVHlwZSgpID09IE1WVDo6R2x1ZSkKKyAgICAgICAgcmV0dXJuICpVSTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGNvbnN0IFNETm9kZUZsYWdzIGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gRmxhZ3M7IH0KKyAgdm9pZCBzZXRGbGFncyhTRE5vZGVGbGFncyBOZXdGbGFncykgeyBGbGFncyA9IE5ld0ZsYWdzOyB9CisKKyAgLy8vIENsZWFyIGFueSBmbGFncyBpbiB0aGlzIG5vZGUgdGhhdCBhcmVuJ3QgYWxzbyBzZXQgaW4gRmxhZ3MuCisgIC8vLyBJZiBGbGFncyBpcyBub3QgaW4gYSBkZWZpbmVkIHN0YXRlIHRoZW4gdGhpcyBoYXMgbm8gZWZmZWN0LgorICB2b2lkIGludGVyc2VjdEZsYWdzV2l0aChjb25zdCBTRE5vZGVGbGFncyBGbGFncyk7CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHZhbHVlcyBkZWZpbmVkL3JldHVybmVkIGJ5IHRoaXMgb3BlcmF0b3IuCisgIHVuc2lnbmVkIGdldE51bVZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIE51bVZhbHVlczsgfQorCisgIC8vLyBSZXR1cm4gdGhlIHR5cGUgb2YgYSBzcGVjaWZpZWQgcmVzdWx0LgorICBFVlQgZ2V0VmFsdWVUeXBlKHVuc2lnbmVkIFJlc05vKSBjb25zdCB7CisgICAgYXNzZXJ0KFJlc05vIDwgTnVtVmFsdWVzICYmICJJbGxlZ2FsIHJlc3VsdCBudW1iZXIhIik7CisgICAgcmV0dXJuIFZhbHVlTGlzdFtSZXNOb107CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSB0eXBlIG9mIGEgc3BlY2lmaWVkIHJlc3VsdCBhcyBhIHNpbXBsZSB0eXBlLgorICBNVlQgZ2V0U2ltcGxlVmFsdWVUeXBlKHVuc2lnbmVkIFJlc05vKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFZhbHVlVHlwZShSZXNObykuZ2V0U2ltcGxlVlQoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIE1WVDo6Z2V0U2l6ZUluQml0cyhnZXRWYWx1ZVR5cGUoUmVzTm8pKS4KKyAgdW5zaWduZWQgZ2V0VmFsdWVTaXplSW5CaXRzKHVuc2lnbmVkIFJlc05vKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFZhbHVlVHlwZShSZXNObykuZ2V0U2l6ZUluQml0cygpOworICB9CisKKyAgdXNpbmcgdmFsdWVfaXRlcmF0b3IgPSBjb25zdCBFVlQgKjsKKworICB2YWx1ZV9pdGVyYXRvciB2YWx1ZV9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIFZhbHVlTGlzdDsgfQorICB2YWx1ZV9pdGVyYXRvciB2YWx1ZV9lbmQoKSBjb25zdCB7IHJldHVybiBWYWx1ZUxpc3QrTnVtVmFsdWVzOyB9CisKKyAgLy8vIFJldHVybiB0aGUgb3Bjb2RlIG9mIHRoaXMgb3BlcmF0aW9uIGZvciBwcmludGluZy4KKyAgc3RkOjpzdHJpbmcgZ2V0T3BlcmF0aW9uTmFtZShjb25zdCBTZWxlY3Rpb25EQUcgKkcgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGdldEluZGV4ZWRNb2RlTmFtZShJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNKTsKKyAgdm9pZCBwcmludF90eXBlcyhyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFNlbGVjdGlvbkRBRyAqRykgY29uc3Q7CisgIHZvaWQgcHJpbnRfZGV0YWlscyhyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFNlbGVjdGlvbkRBRyAqRykgY29uc3Q7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBTZWxlY3Rpb25EQUcgKkcgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBwcmludHIocmF3X29zdHJlYW0gJk9TLCBjb25zdCBTZWxlY3Rpb25EQUcgKkcgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gUHJpbnQgYSBTZWxlY3Rpb25EQUcgbm9kZSBhbmQgYWxsIGNoaWxkcmVuIGRvd24gdG8KKyAgLy8vIHRoZSBsZWF2ZXMuICBUaGUgZ2l2ZW4gU2VsZWN0aW9uREFHIGFsbG93cyB0YXJnZXQtc3BlY2lmaWMgbm9kZXMKKyAgLy8vIHRvIGJlIHByaW50ZWQgaW4gaHVtYW4tcmVhZGFibGUgZm9ybS4gIFVubGlrZSBwcmludHIsIHRoaXMgd2lsbAorICAvLy8gcHJpbnQgdGhlIHdob2xlIERBRywgaW5jbHVkaW5nIGNoaWxkcmVuIHRoYXQgYXBwZWFyIG11bHRpcGxlCisgIC8vLyB0aW1lcy4KKyAgLy8vCisgIHZvaWQgcHJpbnRyRnVsbChyYXdfb3N0cmVhbSAmTywgY29uc3QgU2VsZWN0aW9uREFHICpHID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFByaW50IGEgU2VsZWN0aW9uREFHIG5vZGUgYW5kIGNoaWxkcmVuIHVwIHRvCisgIC8vLyBkZXB0aCAiZGVwdGguIiAgVGhlIGdpdmVuIFNlbGVjdGlvbkRBRyBhbGxvd3MgdGFyZ2V0LXNwZWNpZmljCisgIC8vLyBub2RlcyB0byBiZSBwcmludGVkIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0uICBVbmxpa2UgcHJpbnRyLCB0aGlzCisgIC8vLyB3aWxsIHByaW50IGNoaWxkcmVuIHRoYXQgYXBwZWFyIG11bHRpcGxlIHRpbWVzIHdoZXJldmVyIHRoZXkgYXJlCisgIC8vLyB1c2VkLgorICAvLy8KKyAgdm9pZCBwcmludHJXaXRoRGVwdGgocmF3X29zdHJlYW0gJk8sIGNvbnN0IFNlbGVjdGlvbkRBRyAqRyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGRlcHRoID0gMTAwKSBjb25zdDsKKworICAvLy8gRHVtcCB0aGlzIG5vZGUsIGZvciBkZWJ1Z2dpbmcuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBEdW1wIChyZWN1cnNpdmVseSkgdGhpcyBub2RlIGFuZCBpdHMgdXNlLWRlZiBzdWJncmFwaC4KKyAgdm9pZCBkdW1wcigpIGNvbnN0OworCisgIC8vLyBEdW1wIHRoaXMgbm9kZSwgZm9yIGRlYnVnZ2luZy4KKyAgLy8vIFRoZSBnaXZlbiBTZWxlY3Rpb25EQUcgYWxsb3dzIHRhcmdldC1zcGVjaWZpYyBub2RlcyB0byBiZSBwcmludGVkCisgIC8vLyBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLgorICB2b2lkIGR1bXAoY29uc3QgU2VsZWN0aW9uREFHICpHKSBjb25zdDsKKworICAvLy8gRHVtcCAocmVjdXJzaXZlbHkpIHRoaXMgbm9kZSBhbmQgaXRzIHVzZS1kZWYgc3ViZ3JhcGguCisgIC8vLyBUaGUgZ2l2ZW4gU2VsZWN0aW9uREFHIGFsbG93cyB0YXJnZXQtc3BlY2lmaWMgbm9kZXMgdG8gYmUgcHJpbnRlZAorICAvLy8gaW4gaHVtYW4tcmVhZGFibGUgZm9ybS4KKyAgdm9pZCBkdW1wcihjb25zdCBTZWxlY3Rpb25EQUcgKkcpIGNvbnN0OworCisgIC8vLyBwcmludHJGdWxsIHRvIGRiZ3MoKS4gIFRoZSBnaXZlbiBTZWxlY3Rpb25EQUcgYWxsb3dzCisgIC8vLyB0YXJnZXQtc3BlY2lmaWMgbm9kZXMgdG8gYmUgcHJpbnRlZCBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLgorICAvLy8gVW5saWtlIGR1bXByLCB0aGlzIHdpbGwgcHJpbnQgdGhlIHdob2xlIERBRywgaW5jbHVkaW5nIGNoaWxkcmVuCisgIC8vLyB0aGF0IGFwcGVhciBtdWx0aXBsZSB0aW1lcy4KKyAgdm9pZCBkdW1wckZ1bGwoY29uc3QgU2VsZWN0aW9uREFHICpHID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIHByaW50cldpdGhEZXB0aCB0byBkYmdzKCkuICBUaGUgZ2l2ZW4KKyAgLy8vIFNlbGVjdGlvbkRBRyBhbGxvd3MgdGFyZ2V0LXNwZWNpZmljIG5vZGVzIHRvIGJlIHByaW50ZWQgaW4KKyAgLy8vIGh1bWFuLXJlYWRhYmxlIGZvcm0uICBVbmxpa2UgZHVtcHIsIHRoaXMgd2lsbCBwcmludCBjaGlsZHJlbgorICAvLy8gdGhhdCBhcHBlYXIgbXVsdGlwbGUgdGltZXMgd2hlcmV2ZXIgdGhleSBhcmUgdXNlZC4KKyAgLy8vCisgIHZvaWQgZHVtcHJXaXRoRGVwdGgoY29uc3QgU2VsZWN0aW9uREFHICpHID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBkZXB0aCA9IDEwMCkgY29uc3Q7CisKKyAgLy8vIEdhdGhlciB1bmlxdWUgZGF0YSBmb3IgdGhlIG5vZGUuCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Q7CisKKyAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIFNEVXNlIGNsYXNzLgorICB2b2lkIGFkZFVzZShTRFVzZSAmVSkgeyBVLmFkZFRvTGlzdCgmVXNlTGlzdCk7IH0KKworcHJvdGVjdGVkOgorICBzdGF0aWMgU0RWVExpc3QgZ2V0U0RWVExpc3QoRVZUIFZUKSB7CisgICAgU0RWVExpc3QgUmV0ID0geyBnZXRWYWx1ZVR5cGVMaXN0KFZUKSwgMSB9OworICAgIHJldHVybiBSZXQ7CisgIH0KKworICAvLy8gQ3JlYXRlIGFuIFNETm9kZS4KKyAgLy8vCisgIC8vLyBTRE5vZGVzIGFyZSBjcmVhdGVkIHdpdGhvdXQgYW55IG9wZXJhbmRzLCBhbmQgbmV2ZXIgb3duIHRoZSBvcGVyYW5kCisgIC8vLyBzdG9yYWdlLiBUbyBhZGQgb3BlcmFuZHMsIHNlZSBTZWxlY3Rpb25EQUc6OmNyZWF0ZU9wZXJhbmRzLgorICBTRE5vZGUodW5zaWduZWQgT3BjLCB1bnNpZ25lZCBPcmRlciwgRGVidWdMb2MgZGwsIFNEVlRMaXN0IFZUcykKKyAgICAgIDogTm9kZVR5cGUoT3BjKSwgVmFsdWVMaXN0KFZUcy5WVHMpLCBOdW1WYWx1ZXMoVlRzLk51bVZUcyksCisgICAgICAgIElST3JkZXIoT3JkZXIpLCBkZWJ1Z0xvYyhzdGQ6Om1vdmUoZGwpKSB7CisgICAgbWVtc2V0KCZSYXdTRE5vZGVCaXRzLCAwLCBzaXplb2YoUmF3U0ROb2RlQml0cykpOworICAgIGFzc2VydChkZWJ1Z0xvYy5oYXNUcml2aWFsRGVzdHJ1Y3RvcigpICYmICJFeHBlY3RlZCB0cml2aWFsIGRlc3RydWN0b3IiKTsKKyAgICBhc3NlcnQoTnVtVmFsdWVzID09IFZUcy5OdW1WVHMgJiYKKyAgICAgICAgICAgIk51bVZhbHVlcyB3YXNuJ3Qgd2lkZSBlbm91Z2ggZm9yIGl0cyBvcGVyYW5kcyEiKTsKKyAgfQorCisgIC8vLyBSZWxlYXNlIHRoZSBvcGVyYW5kcyBhbmQgc2V0IHRoaXMgbm9kZSB0byBoYXZlIHplcm8gb3BlcmFuZHMuCisgIHZvaWQgRHJvcE9wZXJhbmRzKCk7Cit9OworCisvLy8gV3JhcHBlciBjbGFzcyBmb3IgSVIgbG9jYXRpb24gaW5mbyAoSVIgb3JkZXJpbmcgYW5kIERlYnVnTG9jKSB0byBiZSBwYXNzZWQKKy8vLyBpbnRvIFNETm9kZSBjcmVhdGlvbiBmdW5jdGlvbnMuCisvLy8gV2hlbiBhbiBTRE5vZGUgaXMgY3JlYXRlZCBmcm9tIHRoZSBEQUdCdWlsZGVyLCB0aGUgRGVidWdMb2MgaXMgZXh0cmFjdGVkCisvLy8gZnJvbSB0aGUgb3JpZ2luYWwgSW5zdHJ1Y3Rpb24sIGFuZCBJUk9yZGVyIGlzIHRoZSBvcmRpbmFsIHBvc2l0aW9uIG9mCisvLy8gdGhlIGluc3RydWN0aW9uLgorLy8vIFdoZW4gYW4gU0ROb2RlIGlzIGNyZWF0ZWQgYWZ0ZXIgdGhlIERBRyBpcyBiZWluZyBidWlsdCwgYm90aCBEZWJ1Z0xvYyBhbmQKKy8vLyB0aGUgSVJPcmRlciBhcmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBvcmlnaW5hbCBTRE5vZGUuCisvLy8gU28gU0RMb2MgY2xhc3MgcHJvdmlkZXMgdHdvIGNvbnN0cnVjdG9ycyBiZXNpZGVzIHRoZSBkZWZhdWx0IG9uZSwgb25lIHRvCisvLy8gYmUgdXNlZCBieSB0aGUgREFHQnVpbGRlciwgdGhlIG90aGVyIHRvIGJlIHVzZWQgYnkgb3RoZXJzLgorY2xhc3MgU0RMb2MgeworcHJpdmF0ZToKKyAgRGVidWdMb2MgREw7CisgIGludCBJUk9yZGVyID0gMDsKKworcHVibGljOgorICBTRExvYygpID0gZGVmYXVsdDsKKyAgU0RMb2MoY29uc3QgU0ROb2RlICpOKSA6IERMKE4tPmdldERlYnVnTG9jKCkpLCBJUk9yZGVyKE4tPmdldElST3JkZXIoKSkge30KKyAgU0RMb2MoY29uc3QgU0RWYWx1ZSBWKSA6IFNETG9jKFYuZ2V0Tm9kZSgpKSB7fQorICBTRExvYyhjb25zdCBJbnN0cnVjdGlvbiAqSSwgaW50IE9yZGVyKSA6IElST3JkZXIoT3JkZXIpIHsKKyAgICBhc3NlcnQoT3JkZXIgPj0gMCAmJiAiYmFkIElST3JkZXIiKTsKKyAgICBpZiAoSSkKKyAgICAgIERMID0gSS0+Z2V0RGVidWdMb2MoKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldElST3JkZXIoKSBjb25zdCB7IHJldHVybiBJUk9yZGVyOyB9CisgIGNvbnN0IERlYnVnTG9jICZnZXREZWJ1Z0xvYygpIGNvbnN0IHsgcmV0dXJuIERMOyB9Cit9OworCisvLyBEZWZpbmUgaW5saW5lIGZ1bmN0aW9ucyBmcm9tIHRoZSBTRFZhbHVlIGNsYXNzLgorCitpbmxpbmUgU0RWYWx1ZTo6U0RWYWx1ZShTRE5vZGUgKm5vZGUsIHVuc2lnbmVkIHJlc25vKQorICAgIDogTm9kZShub2RlKSwgUmVzTm8ocmVzbm8pIHsKKyAgLy8gRXhwbGljaXRseSBjaGVjayBmb3IgIVJlc05vIHRvIGF2b2lkIHVzZS1hZnRlci1mcmVlLCBiZWNhdXNlIHRoZXJlIGFyZQorICAvLyBjYWxsZXJzIHRoYXQgdXNlIFNEVmFsdWUoTiwgMCkgd2l0aCBhIGRlbGV0ZWQgTiB0byBpbmRpY2F0ZSBzdWNjZXNzZnVsCisgIC8vIGNvbWJpbmVzLgorICBhc3NlcnQoKCFOb2RlIHx8ICFSZXNObyB8fCBSZXNObyA8IE5vZGUtPmdldE51bVZhbHVlcygpKSAmJgorICAgICAgICAgIkludmFsaWQgcmVzdWx0IG51bWJlciBmb3IgdGhlIGdpdmVuIG5vZGUhIik7CisgIGFzc2VydChSZXNObyA8IC0yVSAmJiAiQ2Fubm90IHVzZSByZXN1bHQgbnVtYmVycyByZXNlcnZlZCBmb3IgRGVuc2VNYXBzLiIpOworfQorCitpbmxpbmUgdW5zaWduZWQgU0RWYWx1ZTo6Z2V0T3Bjb2RlKCkgY29uc3QgeworICByZXR1cm4gTm9kZS0+Z2V0T3Bjb2RlKCk7Cit9CisKK2lubGluZSBFVlQgU0RWYWx1ZTo6Z2V0VmFsdWVUeXBlKCkgY29uc3QgeworICByZXR1cm4gTm9kZS0+Z2V0VmFsdWVUeXBlKFJlc05vKTsKK30KKworaW5saW5lIHVuc2lnbmVkIFNEVmFsdWU6OmdldE51bU9wZXJhbmRzKCkgY29uc3QgeworICByZXR1cm4gTm9kZS0+Z2V0TnVtT3BlcmFuZHMoKTsKK30KKworaW5saW5lIGNvbnN0IFNEVmFsdWUgJlNEVmFsdWU6OmdldE9wZXJhbmQodW5zaWduZWQgaSkgY29uc3QgeworICByZXR1cm4gTm9kZS0+Z2V0T3BlcmFuZChpKTsKK30KKworaW5saW5lIHVpbnQ2NF90IFNEVmFsdWU6OmdldENvbnN0YW50T3BlcmFuZFZhbCh1bnNpZ25lZCBpKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5nZXRDb25zdGFudE9wZXJhbmRWYWwoaSk7Cit9CisKK2lubGluZSBib29sIFNEVmFsdWU6OmlzVGFyZ2V0T3Bjb2RlKCkgY29uc3QgeworICByZXR1cm4gTm9kZS0+aXNUYXJnZXRPcGNvZGUoKTsKK30KKworaW5saW5lIGJvb2wgU0RWYWx1ZTo6aXNUYXJnZXRNZW1vcnlPcGNvZGUoKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5pc1RhcmdldE1lbW9yeU9wY29kZSgpOworfQorCitpbmxpbmUgYm9vbCBTRFZhbHVlOjppc01hY2hpbmVPcGNvZGUoKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5pc01hY2hpbmVPcGNvZGUoKTsKK30KKworaW5saW5lIHVuc2lnbmVkIFNEVmFsdWU6OmdldE1hY2hpbmVPcGNvZGUoKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5nZXRNYWNoaW5lT3Bjb2RlKCk7Cit9CisKK2lubGluZSBib29sIFNEVmFsdWU6OmlzVW5kZWYoKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5pc1VuZGVmKCk7Cit9CisKK2lubGluZSBib29sIFNEVmFsdWU6OnVzZV9lbXB0eSgpIGNvbnN0IHsKKyAgcmV0dXJuICFOb2RlLT5oYXNBbnlVc2VPZlZhbHVlKFJlc05vKTsKK30KKworaW5saW5lIGJvb2wgU0RWYWx1ZTo6aGFzT25lVXNlKCkgY29uc3QgeworICByZXR1cm4gTm9kZS0+aGFzTlVzZXNPZlZhbHVlKDEsIFJlc05vKTsKK30KKworaW5saW5lIGNvbnN0IERlYnVnTG9jICZTRFZhbHVlOjpnZXREZWJ1Z0xvYygpIGNvbnN0IHsKKyAgcmV0dXJuIE5vZGUtPmdldERlYnVnTG9jKCk7Cit9CisKK2lubGluZSB2b2lkIFNEVmFsdWU6OmR1bXAoKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5kdW1wKCk7Cit9CisKK2lubGluZSB2b2lkIFNEVmFsdWU6OmR1bXAoY29uc3QgU2VsZWN0aW9uREFHICpHKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5kdW1wKEcpOworfQorCitpbmxpbmUgdm9pZCBTRFZhbHVlOjpkdW1wcigpIGNvbnN0IHsKKyAgcmV0dXJuIE5vZGUtPmR1bXByKCk7Cit9CisKK2lubGluZSB2b2lkIFNEVmFsdWU6OmR1bXByKGNvbnN0IFNlbGVjdGlvbkRBRyAqRykgY29uc3QgeworICByZXR1cm4gTm9kZS0+ZHVtcHIoRyk7Cit9CisKKy8vIERlZmluZSBpbmxpbmUgZnVuY3Rpb25zIGZyb20gdGhlIFNEVXNlIGNsYXNzLgorCitpbmxpbmUgdm9pZCBTRFVzZTo6c2V0KGNvbnN0IFNEVmFsdWUgJlYpIHsKKyAgaWYgKFZhbC5nZXROb2RlKCkpIHJlbW92ZUZyb21MaXN0KCk7CisgIFZhbCA9IFY7CisgIGlmIChWLmdldE5vZGUoKSkgVi5nZXROb2RlKCktPmFkZFVzZSgqdGhpcyk7Cit9CisKK2lubGluZSB2b2lkIFNEVXNlOjpzZXRJbml0aWFsKGNvbnN0IFNEVmFsdWUgJlYpIHsKKyAgVmFsID0gVjsKKyAgVi5nZXROb2RlKCktPmFkZFVzZSgqdGhpcyk7Cit9CisKK2lubGluZSB2b2lkIFNEVXNlOjpzZXROb2RlKFNETm9kZSAqTikgeworICBpZiAoVmFsLmdldE5vZGUoKSkgcmVtb3ZlRnJvbUxpc3QoKTsKKyAgVmFsLnNldE5vZGUoTik7CisgIGlmIChOKSBOLT5hZGRVc2UoKnRoaXMpOworfQorCisvLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGZvcm0gYSBoYW5kbGUgYXJvdW5kIGFub3RoZXIgbm9kZSB0aGF0CisvLy8gaXMgcGVyc2lzdGVudCBhbmQgaXMgdXBkYXRlZCBhY3Jvc3MgaW52b2NhdGlvbnMgb2YgcmVwbGFjZUFsbFVzZXNXaXRoIG9uIGl0cworLy8vIG9wZXJhbmQuICBUaGlzIG5vZGUgc2hvdWxkIGJlIGRpcmVjdGx5IGNyZWF0ZWQgYnkgZW5kLXVzZXJzIGFuZCBub3QgYWRkZWQgdG8KKy8vLyB0aGUgQWxsTm9kZXMgbGlzdC4KK2NsYXNzIEhhbmRsZVNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBTRFVzZSBPcDsKKworcHVibGljOgorICBleHBsaWNpdCBIYW5kbGVTRE5vZGUoU0RWYWx1ZSBYKQorICAgIDogU0ROb2RlKElTRDo6SEFORExFTk9ERSwgMCwgRGVidWdMb2MoKSwgZ2V0U0RWVExpc3QoTVZUOjpPdGhlcikpIHsKKyAgICAvLyBIYW5kbGVTRE5vZGVzIGFyZSBuZXZlciBpbnNlcnRlZCBpbnRvIHRoZSBEQUcsIHNvIHRoZXkgd29uJ3QgYmUKKyAgICAvLyBhdXRvLW51bWJlcmVkLiBVc2UgSUQgNjU1MzUgYXMgYSBzZW50aW5lbC4KKyAgICBQZXJzaXN0ZW50SWQgPSAweGZmZmY7CisKKyAgICAvLyBNYW51YWxseSBzZXQgdXAgdGhlIG9wZXJhbmQgbGlzdC4gVGhpcyBub2RlIHR5cGUgaXMgc3BlY2lhbCBpbiB0aGF0IGl0J3MKKyAgICAvLyBhbHdheXMgc3RhY2sgYWxsb2NhdGVkIGFuZCBTZWxlY3Rpb25EQUcgZG9lcyBub3QgbWFuYWdlIGl0cyBvcGVyYW5kcy4KKyAgICAvLyBUT0RPOiBUaGlzIHNob3VsZCBlaXRoZXIgKGEpIG5vdCBiZSBpbiB0aGUgU0ROb2RlIGhpZXJhcmNoeSwgb3IgKGIpIG5vdAorICAgIC8vIGJlIHNvIHNwZWNpYWwuCisgICAgT3Auc2V0VXNlcih0aGlzKTsKKyAgICBPcC5zZXRJbml0aWFsKFgpOworICAgIE51bU9wZXJhbmRzID0gMTsKKyAgICBPcGVyYW5kTGlzdCA9ICZPcDsKKyAgfQorICB+SGFuZGxlU0ROb2RlKCk7CisKKyAgY29uc3QgU0RWYWx1ZSAmZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBPcDsgfQorfTsKKworY2xhc3MgQWRkclNwYWNlQ2FzdFNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworcHJpdmF0ZToKKyAgdW5zaWduZWQgU3JjQWRkclNwYWNlOworICB1bnNpZ25lZCBEZXN0QWRkclNwYWNlOworCitwdWJsaWM6CisgIEFkZHJTcGFjZUNhc3RTRE5vZGUodW5zaWduZWQgT3JkZXIsIGNvbnN0IERlYnVnTG9jICZkbCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY0FTLCB1bnNpZ25lZCBEZXN0QVMpOworCisgIHVuc2lnbmVkIGdldFNyY0FkZHJlc3NTcGFjZSgpIGNvbnN0IHsgcmV0dXJuIFNyY0FkZHJTcGFjZTsgfQorICB1bnNpZ25lZCBnZXREZXN0QWRkcmVzc1NwYWNlKCkgY29uc3QgeyByZXR1cm4gRGVzdEFkZHJTcGFjZTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6QUREUlNQQUNFQ0FTVDsKKyAgfQorfTsKKworLy8vIFRoaXMgaXMgYW4gYWJzdHJhY3QgdmlydHVhbCBjbGFzcyBmb3IgbWVtb3J5IG9wZXJhdGlvbnMuCitjbGFzcyBNZW1TRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKK3ByaXZhdGU6CisgIC8vIFZUIG9mIGluLW1lbW9yeSB2YWx1ZS4KKyAgRVZUIE1lbW9yeVZUOworCitwcm90ZWN0ZWQ6CisgIC8vLyBNZW1vcnkgcmVmZXJlbmNlIGluZm9ybWF0aW9uLgorICBNYWNoaW5lTWVtT3BlcmFuZCAqTU1POworCitwdWJsaWM6CisgIE1lbVNETm9kZSh1bnNpZ25lZCBPcGMsIHVuc2lnbmVkIE9yZGVyLCBjb25zdCBEZWJ1Z0xvYyAmZGwsIFNEVlRMaXN0IFZUcywKKyAgICAgICAgICAgIEVWVCBNZW1vcnlWVCwgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisKKyAgYm9vbCByZWFkTWVtKCkgY29uc3QgeyByZXR1cm4gTU1PLT5pc0xvYWQoKTsgfQorICBib29sIHdyaXRlTWVtKCkgY29uc3QgeyByZXR1cm4gTU1PLT5pc1N0b3JlKCk7IH0KKworICAvLy8gUmV0dXJucyBhbGlnbm1lbnQgYW5kIHZvbGF0aWxpdHkgb2YgdGhlIG1lbW9yeSBhY2Nlc3MKKyAgdW5zaWduZWQgZ2V0T3JpZ2luYWxBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIE1NTy0+Z2V0QmFzZUFsaWdubWVudCgpOworICB9CisgIHVuc2lnbmVkIGdldEFsaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTU1PLT5nZXRBbGlnbm1lbnQoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIFN1YmNsYXNzRGF0YSB2YWx1ZSwgd2l0aG91dCBIYXNEZWJ1Z1ZhbHVlLiBUaGlzIGNvbnRhaW5zIGFuCisgIC8vLyBlbmNvZGluZyBvZiB0aGUgdm9sYXRpbGUgZmxhZywgYXMgd2VsbCBhcyBiaXRzIHVzZWQgYnkgc3ViY2xhc3Nlcy4gVGhpcworICAvLy8gZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBjb21wdXRlIGEgRm9sZGluZ1NldE5vZGVJRCB2YWx1ZS4KKyAgLy8vIFRoZSBIYXNEZWJ1Z1ZhbHVlIGJpdCBpcyBtYXNrZWQgb3V0IGJlY2F1c2UgQ1NFIG1hcCBuZWVkcyB0byBtYXRjaAorICAvLy8gbm9kZXMgd2l0aCBkZWJ1ZyBpbmZvIHdpdGggbm9kZXMgd2l0aG91dCBkZWJ1ZyBpbmZvLiBTYW1lIGlzIGFib3V0CisgIC8vLyBpc0RpdmVyZ2VudCBiaXQuCisgIHVuc2lnbmVkIGdldFJhd1N1YmNsYXNzRGF0YSgpIGNvbnN0IHsKKyAgICB1aW50MTZfdCBEYXRhOworICAgIHVuaW9uIHsKKyAgICAgIGNoYXIgUmF3U0ROb2RlQml0c1tzaXplb2YodWludDE2X3QpXTsKKyAgICAgIFNETm9kZUJpdGZpZWxkcyBTRE5vZGVCaXRzOworICAgIH07CisgICAgbWVtY3B5KCZSYXdTRE5vZGVCaXRzLCAmdGhpcy0+UmF3U0ROb2RlQml0cywgc2l6ZW9mKHRoaXMtPlJhd1NETm9kZUJpdHMpKTsKKyAgICBTRE5vZGVCaXRzLkhhc0RlYnVnVmFsdWUgPSAwOworICAgIFNETm9kZUJpdHMuSXNEaXZlcmdlbnQgPSBmYWxzZTsKKyAgICBtZW1jcHkoJkRhdGEsICZSYXdTRE5vZGVCaXRzLCBzaXplb2YoUmF3U0ROb2RlQml0cykpOworICAgIHJldHVybiBEYXRhOworICB9CisKKyAgYm9vbCBpc1ZvbGF0aWxlKCkgY29uc3QgeyByZXR1cm4gTWVtU0ROb2RlQml0cy5Jc1ZvbGF0aWxlOyB9CisgIGJvb2wgaXNOb25UZW1wb3JhbCgpIGNvbnN0IHsgcmV0dXJuIE1lbVNETm9kZUJpdHMuSXNOb25UZW1wb3JhbDsgfQorICBib29sIGlzRGVyZWZlcmVuY2VhYmxlKCkgY29uc3QgeyByZXR1cm4gTWVtU0ROb2RlQml0cy5Jc0RlcmVmZXJlbmNlYWJsZTsgfQorICBib29sIGlzSW52YXJpYW50KCkgY29uc3QgeyByZXR1cm4gTWVtU0ROb2RlQml0cy5Jc0ludmFyaWFudDsgfQorCisgIC8vIFJldHVybnMgdGhlIG9mZnNldCBmcm9tIHRoZSBsb2NhdGlvbiBvZiB0aGUgYWNjZXNzLgorICBpbnQ2NF90IGdldFNyY1ZhbHVlT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gTU1PLT5nZXRPZmZzZXQoKTsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBBQSBpbmZvIHRoYXQgZGVzY3JpYmVzIHRoZSBkZXJlZmVyZW5jZS4KKyAgQUFNRE5vZGVzIGdldEFBSW5mbygpIGNvbnN0IHsgcmV0dXJuIE1NTy0+Z2V0QUFJbmZvKCk7IH0KKworICAvLy8gUmV0dXJucyB0aGUgUmFuZ2VzIHRoYXQgZGVzY3JpYmVzIHRoZSBkZXJlZmVyZW5jZS4KKyAgY29uc3QgTUROb2RlICpnZXRSYW5nZXMoKSBjb25zdCB7IHJldHVybiBNTU8tPmdldFJhbmdlcygpOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRCBmb3IgdGhpcyBtZW1vcnkgb3BlcmF0aW9uLgorICBTeW5jU2NvcGU6OklEIGdldFN5bmNTY29wZUlEKCkgY29uc3QgeyByZXR1cm4gTU1PLT5nZXRTeW5jU2NvcGVJRCgpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgYXRvbWljIG9yZGVyaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhpcyBtZW1vcnkgb3BlcmF0aW9uLiBGb3IKKyAgLy8vIGNtcHhjaGcgYXRvbWljIG9wZXJhdGlvbnMsIHJldHVybiB0aGUgYXRvbWljIG9yZGVyaW5nIHJlcXVpcmVtZW50cyB3aGVuCisgIC8vLyBzdG9yZSBvY2N1cnMuCisgIEF0b21pY09yZGVyaW5nIGdldE9yZGVyaW5nKCkgY29uc3QgeyByZXR1cm4gTU1PLT5nZXRPcmRlcmluZygpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgaW4tbWVtb3J5IHZhbHVlLgorICBFVlQgZ2V0TWVtb3J5VlQoKSBjb25zdCB7IHJldHVybiBNZW1vcnlWVDsgfQorCisgIC8vLyBSZXR1cm4gYSBNYWNoaW5lTWVtT3BlcmFuZCBvYmplY3QgZGVzY3JpYmluZyB0aGUgbWVtb3J5CisgIC8vLyByZWZlcmVuY2UgcGVyZm9ybWVkIGJ5IG9wZXJhdGlvbi4KKyAgTWFjaGluZU1lbU9wZXJhbmQgKmdldE1lbU9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBNTU87IH0KKworICBjb25zdCBNYWNoaW5lUG9pbnRlckluZm8gJmdldFBvaW50ZXJJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBNTU8tPmdldFBvaW50ZXJJbmZvKCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBhZGRyZXNzIHNwYWNlIGZvciB0aGUgYXNzb2NpYXRlZCBwb2ludGVyCisgIHVuc2lnbmVkIGdldEFkZHJlc3NTcGFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UG9pbnRlckluZm8oKS5nZXRBZGRyU3BhY2UoKTsKKyAgfQorCisgIC8vLyBVcGRhdGUgdGhpcyBNZW1TRE5vZGUncyBNYWNoaW5lTWVtT3BlcmFuZCBpbmZvcm1hdGlvbgorICAvLy8gdG8gcmVmbGVjdCB0aGUgYWxpZ25tZW50IG9mIE5ld01NTywgaWYgaXQgaGFzIGEgZ3JlYXRlciBhbGlnbm1lbnQuCisgIC8vLyBUaGlzIG11c3Qgb25seSBiZSB1c2VkIHdoZW4gdGhlIG5ldyBhbGlnbm1lbnQgYXBwbGllcyB0byBhbGwgdXNlcnMgb2YKKyAgLy8vIHRoaXMgTWFjaGluZU1lbU9wZXJhbmQuCisgIHZvaWQgcmVmaW5lQWxpZ25tZW50KGNvbnN0IE1hY2hpbmVNZW1PcGVyYW5kICpOZXdNTU8pIHsKKyAgICBNTU8tPnJlZmluZUFsaWdubWVudChOZXdNTU8pOworICB9CisKKyAgY29uc3QgU0RWYWx1ZSAmZ2V0Q2hhaW4oKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisgIGNvbnN0IFNEVmFsdWUgJmdldEJhc2VQdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoZ2V0T3Bjb2RlKCkgPT0gSVNEOjpTVE9SRSA/IDIgOiAxKTsKKyAgfQorCisgIC8vIE1ldGhvZHMgdG8gc3VwcG9ydCBpc2EgYW5kIGR5bl9jYXN0CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgLy8gRm9yIHNvbWUgdGFyZ2V0cywgd2UgbG93ZXIgc29tZSB0YXJnZXQgaW50cmluc2ljcyB0byBhIE1lbUludHJpbnNpY05vZGUKKyAgICAvLyB3aXRoIGVpdGhlciBhbiBpbnRyaW5zaWMgb3IgYSB0YXJnZXQgb3Bjb2RlLgorICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkxPQUQgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTVE9SRSAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6UFJFRkVUQ0ggICAgICAgICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19DTVBfU1dBUCAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfQ01QX1NXQVBfV0lUSF9TVUNDRVNTIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX1NXQVAgICAgICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX0FERCAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9TVUIgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfQU5EICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX0NMUiAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9PUiAgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfWE9SICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX05BTkQgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9NSU4gICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfTUFYICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX1VNSU4gICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9VTUFYICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQUQgICAgICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19TVE9SRSAgICAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpNTE9BRCAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6TVNUT1JFICAgICAgICAgICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok1HQVRIRVIgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpNU0NBVFRFUiAgICAgICAgICAgIHx8CisgICAgICAgICAgIE4tPmlzTWVtSW50cmluc2ljKCkgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICBOLT5pc1RhcmdldE1lbW9yeU9wY29kZSgpOworICB9Cit9OworCisvLy8gVGhpcyBpcyBhbiBTRE5vZGUgcmVwcmVzZW50aW5nIGF0b21pYyBvcGVyYXRpb25zLgorY2xhc3MgQXRvbWljU0ROb2RlIDogcHVibGljIE1lbVNETm9kZSB7CitwdWJsaWM6CisgIEF0b21pY1NETm9kZSh1bnNpZ25lZCBPcGMsIHVuc2lnbmVkIE9yZGVyLCBjb25zdCBEZWJ1Z0xvYyAmZGwsIFNEVlRMaXN0IFZUTCwKKyAgICAgICAgICAgICAgIEVWVCBNZW1WVCwgTWFjaGluZU1lbU9wZXJhbmQgKk1NTykKKyAgICAgIDogTWVtU0ROb2RlKE9wYywgT3JkZXIsIGRsLCBWVEwsIE1lbVZULCBNTU8pIHt9CisKKyAgY29uc3QgU0RWYWx1ZSAmZ2V0QmFzZVB0cigpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMSk7IH0KKyAgY29uc3QgU0RWYWx1ZSAmZ2V0VmFsKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgyKTsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBTRE5vZGUgcmVwcmVzZW50cyBjbXB4Y2hnIGF0b21pYyBvcGVyYXRpb24sIGZhbHNlCisgIC8vLyBvdGhlcndpc2UuCisgIGJvb2wgaXNDb21wYXJlQW5kU3dhcCgpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBPcCA9IGdldE9wY29kZSgpOworICAgIHJldHVybiBPcCA9PSBJU0Q6OkFUT01JQ19DTVBfU1dBUCB8fAorICAgICAgICAgICBPcCA9PSBJU0Q6OkFUT01JQ19DTVBfU1dBUF9XSVRIX1NVQ0NFU1M7CisgIH0KKworICAvLy8gRm9yIGNtcHhjaGcgYXRvbWljIG9wZXJhdGlvbnMsIHJldHVybiB0aGUgYXRvbWljIG9yZGVyaW5nIHJlcXVpcmVtZW50cworICAvLy8gd2hlbiBzdG9yZSBkb2VzIG5vdCBvY2N1ci4KKyAgQXRvbWljT3JkZXJpbmcgZ2V0RmFpbHVyZU9yZGVyaW5nKCkgY29uc3QgeworICAgIGFzc2VydChpc0NvbXBhcmVBbmRTd2FwKCkgJiYgIk11c3QgYmUgY21weGNoZyBvcGVyYXRpb24iKTsKKyAgICByZXR1cm4gTU1PLT5nZXRGYWlsdXJlT3JkZXJpbmcoKTsKKyAgfQorCisgIC8vIE1ldGhvZHMgdG8gc3VwcG9ydCBpc2EgYW5kIGR5bl9jYXN0CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0NNUF9TV0FQICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19DTVBfU1dBUF9XSVRIX1NVQ0NFU1MgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfU1dBUCAgICAgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfQUREICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX1NVQiAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9BTkQgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfQ0xSICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX09SICAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9YT1IgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfTkFORCAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX01JTiAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9NQVggICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfVU1JTiAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX1VNQVggICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRCAgICAgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX1NUT1JFOworICB9Cit9OworCisvLy8gVGhpcyBTRE5vZGUgaXMgdXNlZCBmb3IgdGFyZ2V0IGludHJpbnNpY3MgdGhhdCB0b3VjaAorLy8vIG1lbW9yeSBhbmQgbmVlZCBhbiBhc3NvY2lhdGVkIE1hY2hpbmVNZW1PcGVyYW5kLiBJdHMgb3Bjb2RlIG1heSBiZQorLy8vIElOVFJJTlNJQ19WT0lELCBJTlRSSU5TSUNfV19DSEFJTiwgUFJFRkVUQ0gsIG9yIGEgdGFyZ2V0LXNwZWNpZmljIG9wY29kZQorLy8vIHdpdGggYSB2YWx1ZSBub3QgbGVzcyB0aGFuIEZJUlNUX1RBUkdFVF9NRU1PUllfT1BDT0RFLgorY2xhc3MgTWVtSW50cmluc2ljU0ROb2RlIDogcHVibGljIE1lbVNETm9kZSB7CitwdWJsaWM6CisgIE1lbUludHJpbnNpY1NETm9kZSh1bnNpZ25lZCBPcGMsIHVuc2lnbmVkIE9yZGVyLCBjb25zdCBEZWJ1Z0xvYyAmZGwsCisgICAgICAgICAgICAgICAgICAgICBTRFZUTGlzdCBWVHMsIEVWVCBNZW1vcnlWVCwgTWFjaGluZU1lbU9wZXJhbmQgKk1NTykKKyAgICAgIDogTWVtU0ROb2RlKE9wYywgT3JkZXIsIGRsLCBWVHMsIE1lbW9yeVZULCBNTU8pIHsKKyAgICBTRE5vZGVCaXRzLklzTWVtSW50cmluc2ljID0gdHJ1ZTsKKyAgfQorCisgIC8vIE1ldGhvZHMgdG8gc3VwcG9ydCBpc2EgYW5kIGR5bl9jYXN0CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgLy8gV2UgbG93ZXIgc29tZSB0YXJnZXQgaW50cmluc2ljcyB0byB0aGVpciB0YXJnZXQgb3Bjb2RlCisgICAgLy8gZWFybHkgYSBub2RlIHdpdGggYSB0YXJnZXQgb3Bjb2RlIGNhbiBiZSBvZiB0aGlzIGNsYXNzCisgICAgcmV0dXJuIE4tPmlzTWVtSW50cmluc2ljKCkgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpQUkVGRVRDSCB8fAorICAgICAgICAgICBOLT5pc1RhcmdldE1lbW9yeU9wY29kZSgpOworICB9Cit9OworCisvLy8gVGhpcyBTRE5vZGUgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGNvZGUgZ2VuZXJhdG9yCisvLy8gc3VwcG9ydCBmb3IgdGhlIGxsdm0gSVIgc2h1ZmZsZXZlY3RvciBpbnN0cnVjdGlvbi4gIEl0IGNvbWJpbmVzIGVsZW1lbnRzCisvLy8gZnJvbSB0d28gaW5wdXQgdmVjdG9ycyBpbnRvIGEgbmV3IGlucHV0IHZlY3Rvciwgd2l0aCB0aGUgc2VsZWN0aW9uIGFuZAorLy8vIG9yZGVyaW5nIG9mIGVsZW1lbnRzIGRldGVybWluZWQgYnkgYW4gYXJyYXkgb2YgaW50ZWdlcnMsIHJlZmVycmVkIHRvIGFzCisvLy8gdGhlIHNodWZmbGUgbWFzay4gIEZvciBpbnB1dCB2ZWN0b3JzIG9mIHdpZHRoIE4sIG1hc2sgaW5kaWNlcyBvZiAwLi5OLTEKKy8vLyByZWZlciB0byBlbGVtZW50cyBmcm9tIHRoZSBMSFMgaW5wdXQsIGFuZCBpbmRpY2VzIGZyb20gTiB0byAyTi0xIHRoZSBSSFMuCisvLy8gQW4gaW5kZXggb2YgLTEgaXMgdHJlYXRlZCBhcyB1bmRlZiwgc3VjaCB0aGF0IHRoZSBjb2RlIGdlbmVyYXRvciBtYXkgcHV0CisvLy8gYW55IHZhbHVlIGluIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhlIHJlc3VsdC4KK2NsYXNzIFNodWZmbGVWZWN0b3JTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgLy8gVGhlIG1lbW9yeSBmb3IgTWFzayBpcyBvd25lZCBieSB0aGUgU2VsZWN0aW9uREFHJ3MgT3BlcmFuZEFsbG9jYXRvciwgYW5kCisgIC8vIGlzIGZyZWVkIHdoZW4gdGhlIFNlbGVjdGlvbkRBRyBvYmplY3QgaXMgZGVzdHJveWVkLgorICBjb25zdCBpbnQgKk1hc2s7CisKK3Byb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICBTaHVmZmxlVmVjdG9yU0ROb2RlKEVWVCBWVCwgdW5zaWduZWQgT3JkZXIsIGNvbnN0IERlYnVnTG9jICZkbCwgY29uc3QgaW50ICpNKQorICAgICAgOiBTRE5vZGUoSVNEOjpWRUNUT1JfU0hVRkZMRSwgT3JkZXIsIGRsLCBnZXRTRFZUTGlzdChWVCkpLCBNYXNrKE0pIHt9CisKK3B1YmxpYzoKKyAgQXJyYXlSZWY8aW50PiBnZXRNYXNrKCkgY29uc3QgeworICAgIEVWVCBWVCA9IGdldFZhbHVlVHlwZSgwKTsKKyAgICByZXR1cm4gbWFrZUFycmF5UmVmKE1hc2ssIFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCkpOworICB9CisKKyAgaW50IGdldE1hc2tFbHQodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KElkeCA8IGdldFZhbHVlVHlwZSgwKS5nZXRWZWN0b3JOdW1FbGVtZW50cygpICYmICJJZHggb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBNYXNrW0lkeF07CisgIH0KKworICBib29sIGlzU3BsYXQoKSBjb25zdCB7IHJldHVybiBpc1NwbGF0TWFzayhNYXNrLCBnZXRWYWx1ZVR5cGUoMCkpOyB9CisKKyAgaW50ICBnZXRTcGxhdEluZGV4KCkgY29uc3QgeworICAgIGFzc2VydChpc1NwbGF0KCkgJiYgIkNhbm5vdCBnZXQgc3BsYXQgaW5kZXggZm9yIG5vbi1zcGxhdCEiKTsKKyAgICBFVlQgVlQgPSBnZXRWYWx1ZVR5cGUoMCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpZiAoTWFza1tpXSA+PSAwKQorICAgICAgICByZXR1cm4gTWFza1tpXTsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiU3BsYXQgd2l0aCBhbGwgdW5kZWYgaW5kaWNlcz8iKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzU3BsYXRNYXNrKGNvbnN0IGludCAqTWFzaywgRVZUIFZUKTsKKworICAvLy8gQ2hhbmdlIHZhbHVlcyBpbiBhIHNodWZmbGUgcGVybXV0ZSBtYXNrIGFzc3VtaW5nCisgIC8vLyB0aGUgdHdvIHZlY3RvciBvcGVyYW5kcyBoYXZlIHN3YXBwZWQgcG9zaXRpb24uCisgIHN0YXRpYyB2b2lkIGNvbW11dGVNYXNrKE11dGFibGVBcnJheVJlZjxpbnQ+IE1hc2spIHsKKyAgICB1bnNpZ25lZCBOdW1FbGVtcyA9IE1hc2suc2l6ZSgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtRWxlbXM7ICsraSkgeworICAgICAgaW50IGlkeCA9IE1hc2tbaV07CisgICAgICBpZiAoaWR4IDwgMCkKKyAgICAgICAgY29udGludWU7CisgICAgICBlbHNlIGlmIChpZHggPCAoaW50KU51bUVsZW1zKQorICAgICAgICBNYXNrW2ldID0gaWR4ICsgTnVtRWxlbXM7CisgICAgICBlbHNlCisgICAgICAgIE1hc2tbaV0gPSBpZHggLSBOdW1FbGVtczsKKyAgICB9CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlZFQ1RPUl9TSFVGRkxFOworICB9Cit9OworCitjbGFzcyBDb25zdGFudFNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIGNvbnN0IENvbnN0YW50SW50ICpWYWx1ZTsKKworICBDb25zdGFudFNETm9kZShib29sIGlzVGFyZ2V0LCBib29sIGlzT3BhcXVlLCBjb25zdCBDb25zdGFudEludCAqdmFsLAorICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z0xvYyAmREwsIEVWVCBWVCkKKyAgICAgIDogU0ROb2RlKGlzVGFyZ2V0ID8gSVNEOjpUYXJnZXRDb25zdGFudCA6IElTRDo6Q29uc3RhbnQsIDAsIERMLAorICAgICAgICAgICAgICAgZ2V0U0RWVExpc3QoVlQpKSwKKyAgICAgICAgVmFsdWUodmFsKSB7CisgICAgQ29uc3RhbnRTRE5vZGVCaXRzLklzT3BhcXVlID0gaXNPcGFxdWU7CisgIH0KKworcHVibGljOgorICBjb25zdCBDb25zdGFudEludCAqZ2V0Q29uc3RhbnRJbnRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisgIGNvbnN0IEFQSW50ICZnZXRBUEludFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWUtPmdldFZhbHVlKCk7IH0KKyAgdWludDY0X3QgZ2V0WkV4dFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWUtPmdldFpFeHRWYWx1ZSgpOyB9CisgIGludDY0X3QgZ2V0U0V4dFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWUtPmdldFNFeHRWYWx1ZSgpOyB9CisgIHVpbnQ2NF90IGdldExpbWl0ZWRWYWx1ZSh1aW50NjRfdCBMaW1pdCA9IFVJTlQ2NF9NQVgpIHsKKyAgICByZXR1cm4gVmFsdWUtPmdldExpbWl0ZWRWYWx1ZShMaW1pdCk7CisgIH0KKworICBib29sIGlzT25lKCkgY29uc3QgeyByZXR1cm4gVmFsdWUtPmlzT25lKCk7IH0KKyAgYm9vbCBpc051bGxWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlLT5pc1plcm8oKTsgfQorICBib29sIGlzQWxsT25lc1ZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWUtPmlzTWludXNPbmUoKTsgfQorCisgIGJvb2wgaXNPcGFxdWUoKSBjb25zdCB7IHJldHVybiBDb25zdGFudFNETm9kZUJpdHMuSXNPcGFxdWU7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50IHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0Q29uc3RhbnQ7CisgIH0KK307CisKK3VpbnQ2NF90IFNETm9kZTo6Z2V0Q29uc3RhbnRPcGVyYW5kVmFsKHVuc2lnbmVkIE51bSkgY29uc3QgeworICByZXR1cm4gY2FzdDxDb25zdGFudFNETm9kZT4oZ2V0T3BlcmFuZChOdW0pKS0+Z2V0WkV4dFZhbHVlKCk7Cit9CisKK2NsYXNzIENvbnN0YW50RlBTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICBjb25zdCBDb25zdGFudEZQICpWYWx1ZTsKKworICBDb25zdGFudEZQU0ROb2RlKGJvb2wgaXNUYXJnZXQsIGNvbnN0IENvbnN0YW50RlAgKnZhbCwgY29uc3QgRGVidWdMb2MgJkRMLAorICAgICAgICAgICAgICAgICAgIEVWVCBWVCkKKyAgICAgIDogU0ROb2RlKGlzVGFyZ2V0ID8gSVNEOjpUYXJnZXRDb25zdGFudEZQIDogSVNEOjpDb25zdGFudEZQLCAwLCBETCwKKyAgICAgICAgICAgICAgIGdldFNEVlRMaXN0KFZUKSksCisgICAgICAgIFZhbHVlKHZhbCkge30KKworcHVibGljOgorICBjb25zdCBBUEZsb2F0JiBnZXRWYWx1ZUFQRigpIGNvbnN0IHsgcmV0dXJuIFZhbHVlLT5nZXRWYWx1ZUFQRigpOyB9CisgIGNvbnN0IENvbnN0YW50RlAgKmdldENvbnN0YW50RlBWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBwb3NpdGl2ZSBvciBuZWdhdGl2ZSB6ZXJvLgorICBib29sIGlzWmVybygpIGNvbnN0IHsgcmV0dXJuIFZhbHVlLT5pc1plcm8oKTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBOYU4uCisgIGJvb2wgaXNOYU4oKSBjb25zdCB7IHJldHVybiBWYWx1ZS0+aXNOYU4oKTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gaW5maW5pdHkKKyAgYm9vbCBpc0luZmluaXR5KCkgY29uc3QgeyByZXR1cm4gVmFsdWUtPmlzSW5maW5pdHkoKTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUuCisgIGJvb2wgaXNOZWdhdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlLT5pc05lZ2F0aXZlKCk7IH0KKworICAvLy8gV2UgZG9uJ3QgcmVseSBvbiBvcGVyYXRvcj09IHdvcmtpbmcgb24gZG91YmxlIHZhbHVlcywgYXMKKyAgLy8vIGl0IHJldHVybnMgdHJ1ZSBmb3IgdGhpbmdzIHRoYXQgYXJlIGNsZWFybHkgbm90IGVxdWFsLCBsaWtlIC0wLjAgYW5kIDAuMC4KKyAgLy8vIEFzIHN1Y2gsIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGRvIGFuIGV4YWN0IGJpdC1mb3ItYml0IGNvbXBhcmlzb24gb2YKKyAgLy8vIHR3byBmbG9hdGluZyBwb2ludCB2YWx1ZXMuCisKKyAgLy8vIFdlIGxlYXZlIHRoZSB2ZXJzaW9uIHdpdGggdGhlIGRvdWJsZSBhcmd1bWVudCBoZXJlIGJlY2F1c2UgaXQncyBqdXN0IHNvCisgIC8vLyBjb252ZW5pZW50IHRvIHdyaXRlICIyLjAiIGFuZCB0aGUgbGlrZS4gIFdpdGhvdXQgdGhpcyBmdW5jdGlvbiB3ZSdkCisgIC8vLyBoYXZlIHRvIGR1cGxpY2F0ZSBpdHMgbG9naWMgZXZlcnl3aGVyZSBpdCdzIGNhbGxlZC4KKyAgYm9vbCBpc0V4YWN0bHlWYWx1ZShkb3VibGUgVikgY29uc3QgeworICAgIHJldHVybiBWYWx1ZS0+Z2V0VmFsdWVBUEYoKS5pc0V4YWN0bHlWYWx1ZShWKTsKKyAgfQorICBib29sIGlzRXhhY3RseVZhbHVlKGNvbnN0IEFQRmxvYXQmIFYpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGlzVmFsdWVWYWxpZEZvclR5cGUoRVZUIFZULCBjb25zdCBBUEZsb2F0JiBWYWwpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnRGUCB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldENvbnN0YW50RlA7CisgIH0KK307CisKKy8vLyBSZXR1cm5zIHRydWUgaWYgXHAgViBpcyBhIGNvbnN0YW50IGludGVnZXIgemVyby4KK2Jvb2wgaXNOdWxsQ29uc3RhbnQoU0RWYWx1ZSBWKTsKKworLy8vIFJldHVybnMgdHJ1ZSBpZiBccCBWIGlzIGFuIEZQIGNvbnN0YW50IHdpdGggYSB2YWx1ZSBvZiBwb3NpdGl2ZSB6ZXJvLgorYm9vbCBpc051bGxGUENvbnN0YW50KFNEVmFsdWUgVik7CisKKy8vLyBSZXR1cm5zIHRydWUgaWYgXHAgViBpcyBhbiBpbnRlZ2VyIGNvbnN0YW50IHdpdGggYWxsIGJpdHMgc2V0LgorYm9vbCBpc0FsbE9uZXNDb25zdGFudChTRFZhbHVlIFYpOworCisvLy8gUmV0dXJucyB0cnVlIGlmIFxwIFYgaXMgYSBjb25zdGFudCBpbnRlZ2VyIG9uZS4KK2Jvb2wgaXNPbmVDb25zdGFudChTRFZhbHVlIFYpOworCisvLy8gUmV0dXJucyB0cnVlIGlmIFxwIFYgaXMgYSBiaXR3aXNlIG5vdCBvcGVyYXRpb24uIEFzc3VtZXMgdGhhdCBhbiBhbGwgb25lcworLy8vIGNvbnN0YW50IGlzIGNhbm9uaWNhbGl6ZWQgdG8gYmUgb3BlcmFuZCAxLgorYm9vbCBpc0JpdHdpc2VOb3QoU0RWYWx1ZSBWKTsKKworLy8vIFJldHVybnMgdGhlIFNETm9kZSBpZiBpdCBpcyBhIGNvbnN0YW50IHNwbGF0IEJ1aWxkVmVjdG9yIG9yIGNvbnN0YW50IGludC4KK0NvbnN0YW50U0ROb2RlICppc0NvbnN0T3JDb25zdFNwbGF0KFNEVmFsdWUgVik7CisKKy8vLyBSZXR1cm5zIHRoZSBTRE5vZGUgaWYgaXQgaXMgYSBjb25zdGFudCBzcGxhdCBCdWlsZFZlY3RvciBvciBjb25zdGFudCBmbG9hdC4KK0NvbnN0YW50RlBTRE5vZGUgKmlzQ29uc3RPckNvbnN0U3BsYXRGUChTRFZhbHVlIFYpOworCitjbGFzcyBHbG9iYWxBZGRyZXNzU0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgY29uc3QgR2xvYmFsVmFsdWUgKlRoZUdsb2JhbDsKKyAgaW50NjRfdCBPZmZzZXQ7CisgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3M7CisKKyAgR2xvYmFsQWRkcmVzc1NETm9kZSh1bnNpZ25lZCBPcGMsIHVuc2lnbmVkIE9yZGVyLCBjb25zdCBEZWJ1Z0xvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR2xvYmFsVmFsdWUgKkdBLCBFVlQgVlQsIGludDY0X3QgbywKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzKTsKKworcHVibGljOgorICBjb25zdCBHbG9iYWxWYWx1ZSAqZ2V0R2xvYmFsKCkgY29uc3QgeyByZXR1cm4gVGhlR2xvYmFsOyB9CisgIGludDY0X3QgZ2V0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gT2Zmc2V0OyB9CisgIHVuc2lnbmVkIGNoYXIgZ2V0VGFyZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBUYXJnZXRGbGFnczsgfQorICAvLyBSZXR1cm4gdGhlIGFkZHJlc3Mgc3BhY2UgdGhpcyBHbG9iYWxBZGRyZXNzIGJlbG9uZ3MgdG8uCisgIHVuc2lnbmVkIGdldEFkZHJlc3NTcGFjZSgpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6R2xvYmFsQWRkcmVzcyB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEdsb2JhbEFkZHJlc3MgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpHbG9iYWxUTFNBZGRyZXNzIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0R2xvYmFsVExTQWRkcmVzczsKKyAgfQorfTsKKworY2xhc3MgRnJhbWVJbmRleFNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIGludCBGSTsKKworICBGcmFtZUluZGV4U0ROb2RlKGludCBmaSwgRVZUIFZULCBib29sIGlzVGFyZykKKyAgICA6IFNETm9kZShpc1RhcmcgPyBJU0Q6OlRhcmdldEZyYW1lSW5kZXggOiBJU0Q6OkZyYW1lSW5kZXgsCisgICAgICAwLCBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChWVCkpLCBGSShmaSkgeworICB9CisKK3B1YmxpYzoKKyAgaW50IGdldEluZGV4KCkgY29uc3QgeyByZXR1cm4gRkk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkZyYW1lSW5kZXggfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRGcmFtZUluZGV4OworICB9Cit9OworCitjbGFzcyBKdW1wVGFibGVTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICBpbnQgSlRJOworICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzOworCisgIEp1bXBUYWJsZVNETm9kZShpbnQganRpLCBFVlQgVlQsIGJvb2wgaXNUYXJnLCB1bnNpZ25lZCBjaGFyIFRGKQorICAgIDogU0ROb2RlKGlzVGFyZyA/IElTRDo6VGFyZ2V0SnVtcFRhYmxlIDogSVNEOjpKdW1wVGFibGUsCisgICAgICAwLCBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChWVCkpLCBKVEkoanRpKSwgVGFyZ2V0RmxhZ3MoVEYpIHsKKyAgfQorCitwdWJsaWM6CisgIGludCBnZXRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIEpUSTsgfQorICB1bnNpZ25lZCBjaGFyIGdldFRhcmdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gVGFyZ2V0RmxhZ3M7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6Okp1bXBUYWJsZSB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEp1bXBUYWJsZTsKKyAgfQorfTsKKworY2xhc3MgQ29uc3RhbnRQb29sU0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgdW5pb24geworICAgIGNvbnN0IENvbnN0YW50ICpDb25zdFZhbDsKKyAgICBNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWUgKk1hY2hpbmVDUFZhbDsKKyAgfSBWYWw7CisgIGludCBPZmZzZXQ7ICAvLyBJdCdzIGEgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlIGlmIHRvcCBiaXQgaXMgc2V0LgorICB1bnNpZ25lZCBBbGlnbm1lbnQ7ICAvLyBNaW5pbXVtIGFsaWdubWVudCByZXF1aXJlbWVudCBvZiBDUCAobm90IGxvZzIgdmFsdWUpLgorICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzOworCisgIENvbnN0YW50UG9vbFNETm9kZShib29sIGlzVGFyZ2V0LCBjb25zdCBDb25zdGFudCAqYywgRVZUIFZULCBpbnQgbywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduLCB1bnNpZ25lZCBjaGFyIFRGKQorICAgIDogU0ROb2RlKGlzVGFyZ2V0ID8gSVNEOjpUYXJnZXRDb25zdGFudFBvb2wgOiBJU0Q6OkNvbnN0YW50UG9vbCwgMCwKKyAgICAgICAgICAgICBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChWVCkpLCBPZmZzZXQobyksIEFsaWdubWVudChBbGlnbiksCisgICAgICAgICAgICAgVGFyZ2V0RmxhZ3MoVEYpIHsKKyAgICBhc3NlcnQoT2Zmc2V0ID49IDAgJiYgIk9mZnNldCBpcyB0b28gbGFyZ2UiKTsKKyAgICBWYWwuQ29uc3RWYWwgPSBjOworICB9CisKKyAgQ29uc3RhbnRQb29sU0ROb2RlKGJvb2wgaXNUYXJnZXQsIE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSAqdiwKKyAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCwgaW50IG8sIHVuc2lnbmVkIEFsaWduLCB1bnNpZ25lZCBjaGFyIFRGKQorICAgIDogU0ROb2RlKGlzVGFyZ2V0ID8gSVNEOjpUYXJnZXRDb25zdGFudFBvb2wgOiBJU0Q6OkNvbnN0YW50UG9vbCwgMCwKKyAgICAgICAgICAgICBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChWVCkpLCBPZmZzZXQobyksIEFsaWdubWVudChBbGlnbiksCisgICAgICAgICAgICAgVGFyZ2V0RmxhZ3MoVEYpIHsKKyAgICBhc3NlcnQoT2Zmc2V0ID49IDAgJiYgIk9mZnNldCBpcyB0b28gbGFyZ2UiKTsKKyAgICBWYWwuTWFjaGluZUNQVmFsID0gdjsKKyAgICBPZmZzZXQgfD0gMSA8PCAoc2l6ZW9mKHVuc2lnbmVkKSpDSEFSX0JJVC0xKTsKKyAgfQorCitwdWJsaWM6CisgIGJvb2wgaXNNYWNoaW5lQ29uc3RhbnRQb29sRW50cnkoKSBjb25zdCB7CisgICAgcmV0dXJuIE9mZnNldCA8IDA7CisgIH0KKworICBjb25zdCBDb25zdGFudCAqZ2V0Q29uc3RWYWwoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpc01hY2hpbmVDb25zdGFudFBvb2xFbnRyeSgpICYmICJXcm9uZyBjb25zdGFudHBvb2wgdHlwZSIpOworICAgIHJldHVybiBWYWwuQ29uc3RWYWw7CisgIH0KKworICBNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWUgKmdldE1hY2hpbmVDUFZhbCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNNYWNoaW5lQ29uc3RhbnRQb29sRW50cnkoKSAmJiAiV3JvbmcgY29uc3RhbnRwb29sIHR5cGUiKTsKKyAgICByZXR1cm4gVmFsLk1hY2hpbmVDUFZhbDsKKyAgfQorCisgIGludCBnZXRPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIE9mZnNldCAmIH4oMSA8PCAoc2l6ZW9mKHVuc2lnbmVkKSpDSEFSX0JJVC0xKSk7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIGFsaWdubWVudCBvZiB0aGlzIGNvbnN0YW50IHBvb2wgb2JqZWN0LCB3aGljaCBpcyBlaXRoZXIgMCAoZm9yCisgIC8vIGRlZmF1bHQgYWxpZ25tZW50KSBvciB0aGUgZGVzaXJlZCB2YWx1ZS4KKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gQWxpZ25tZW50OyB9CisgIHVuc2lnbmVkIGNoYXIgZ2V0VGFyZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBUYXJnZXRGbGFnczsgfQorCisgIFR5cGUgKmdldFR5cGUoKSBjb25zdDsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkNvbnN0YW50UG9vbCB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldENvbnN0YW50UG9vbDsKKyAgfQorfTsKKworLy8vIENvbXBsZXRlbHkgdGFyZ2V0LWRlcGVuZGVudCBvYmplY3QgcmVmZXJlbmNlLgorY2xhc3MgVGFyZ2V0SW5kZXhTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzOworICBpbnQgSW5kZXg7CisgIGludDY0X3QgT2Zmc2V0OworCitwdWJsaWM6CisgIFRhcmdldEluZGV4U0ROb2RlKGludCBJZHgsIEVWVCBWVCwgaW50NjRfdCBPZnMsIHVuc2lnbmVkIGNoYXIgVEYpCisgICAgOiBTRE5vZGUoSVNEOjpUYXJnZXRJbmRleCwgMCwgRGVidWdMb2MoKSwgZ2V0U0RWVExpc3QoVlQpKSwKKyAgICAgIFRhcmdldEZsYWdzKFRGKSwgSW5kZXgoSWR4KSwgT2Zmc2V0KE9mcykge30KKworICB1bnNpZ25lZCBjaGFyIGdldFRhcmdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gVGFyZ2V0RmxhZ3M7IH0KKyAgaW50IGdldEluZGV4KCkgY29uc3QgeyByZXR1cm4gSW5kZXg7IH0KKyAgaW50NjRfdCBnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBPZmZzZXQ7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEluZGV4OworICB9Cit9OworCitjbGFzcyBCYXNpY0Jsb2NrU0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQjsKKworICAvLy8gRGVidWcgaW5mbyBpcyBtZWFuaW5nZnVsIGFuZCBwb3RlbnRpYWxseSB1c2VmdWwgaGVyZSwgYnV0IHdlIGNyZWF0ZQorICAvLy8gYmxvY2tzIG91dCBvZiBvcmRlciB3aGVuIHRoZXkncmUganVtcGVkIHRvLCB3aGljaCBtYWtlcyBpdCBhIGJpdAorICAvLy8gaGFyZGVyLiAgTGV0J3Mgc2VlIGlmIHdlIG5lZWQgaXQgZmlyc3QuCisgIGV4cGxpY2l0IEJhc2ljQmxvY2tTRE5vZGUoTWFjaGluZUJhc2ljQmxvY2sgKm1iYikKKyAgICA6IFNETm9kZShJU0Q6OkJhc2ljQmxvY2ssIDAsIERlYnVnTG9jKCksIGdldFNEVlRMaXN0KE1WVDo6T3RoZXIpKSwgTUJCKG1iYikKKyAge30KKworcHVibGljOgorICBNYWNoaW5lQmFzaWNCbG9jayAqZ2V0QmFzaWNCbG9jaygpIGNvbnN0IHsgcmV0dXJuIE1CQjsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6QmFzaWNCbG9jazsKKyAgfQorfTsKKworLy8vIEEgInBzZXVkby1jbGFzcyIgd2l0aCBtZXRob2RzIGZvciBvcGVyYXRpbmcgb24gQlVJTERfVkVDVE9Scy4KK2NsYXNzIEJ1aWxkVmVjdG9yU0ROb2RlIDogcHVibGljIFNETm9kZSB7CitwdWJsaWM6CisgIC8vIFRoZXNlIGFyZSBjb25zdHJ1Y3RlZCBhcyBTRE5vZGVzIGFuZCB0aGVuIGNhc3QgdG8gQnVpbGRWZWN0b3JTRE5vZGVzLgorICBleHBsaWNpdCBCdWlsZFZlY3RvclNETm9kZSgpID0gZGVsZXRlOworCisgIC8vLyBDaGVjayBpZiB0aGlzIGlzIGEgY29uc3RhbnQgc3BsYXQsIGFuZCBpZiBzbywgZmluZCB0aGUKKyAgLy8vIHNtYWxsZXN0IGVsZW1lbnQgc2l6ZSB0aGF0IHNwbGF0cyB0aGUgdmVjdG9yLiAgSWYgTWluU3BsYXRCaXRzIGlzCisgIC8vLyBub256ZXJvLCB0aGUgZWxlbWVudCBzaXplIG11c3QgYmUgYXQgbGVhc3QgdGhhdCBsYXJnZS4gIE5vdGUgdGhhdCB0aGUKKyAgLy8vIHNwbGF0IGVsZW1lbnQgbWF5IGJlIHRoZSBlbnRpcmUgdmVjdG9yIChpLmUuLCBhIG9uZSBlbGVtZW50IHZlY3RvcikuCisgIC8vLyBSZXR1cm5zIHRoZSBzcGxhdCBlbGVtZW50IHZhbHVlIGluIFNwbGF0VmFsdWUuICBBbnkgdW5kZWZpbmVkIGJpdHMgaW4KKyAgLy8vIHRoYXQgdmFsdWUgYXJlIHplcm8sIGFuZCB0aGUgY29ycmVzcG9uZGluZyBiaXRzIGluIHRoZSBTcGxhdFVuZGVmIG1hc2sKKyAgLy8vIGFyZSBzZXQuICBUaGUgU3BsYXRCaXRTaXplIHZhbHVlIGlzIHNldCB0byB0aGUgc3BsYXQgZWxlbWVudCBzaXplIGluCisgIC8vLyBiaXRzLiAgSGFzQW55VW5kZWZzIGlzIHNldCB0byB0cnVlIGlmIGFueSBiaXRzIGluIHRoZSB2ZWN0b3IgYXJlCisgIC8vLyB1bmRlZmluZWQuICBpc0JpZ0VuZGlhbiBkZXNjcmliZXMgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHRhcmdldC4KKyAgYm9vbCBpc0NvbnN0YW50U3BsYXQoQVBJbnQgJlNwbGF0VmFsdWUsIEFQSW50ICZTcGxhdFVuZGVmLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmU3BsYXRCaXRTaXplLCBib29sICZIYXNBbnlVbmRlZnMsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1pblNwbGF0Qml0cyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNCaWdFbmRpYW4gPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBzcGxhdHRlZCB2YWx1ZSBvciBhIG51bGwgdmFsdWUgaWYgdGhpcyBpcyBub3QgYSBzcGxhdC4KKyAgLy8vCisgIC8vLyBJZiBwYXNzZWQgYSBub24tbnVsbCBVbmRlZkVsZW1lbnRzIGJpdHZlY3RvciwgaXQgd2lsbCByZXNpemUgaXQgdG8gbWF0Y2gKKyAgLy8vIHRoZSB2ZWN0b3Igd2lkdGggYW5kIHNldCB0aGUgYml0cyB3aGVyZSBlbGVtZW50cyBhcmUgdW5kZWYuCisgIFNEVmFsdWUgZ2V0U3BsYXRWYWx1ZShCaXRWZWN0b3IgKlVuZGVmRWxlbWVudHMgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHNwbGF0dGVkIGNvbnN0YW50IG9yIG51bGwgaWYgdGhpcyBpcyBub3QgYSBjb25zdGFudAorICAvLy8gc3BsYXQuCisgIC8vLworICAvLy8gSWYgcGFzc2VkIGEgbm9uLW51bGwgVW5kZWZFbGVtZW50cyBiaXR2ZWN0b3IsIGl0IHdpbGwgcmVzaXplIGl0IHRvIG1hdGNoCisgIC8vLyB0aGUgdmVjdG9yIHdpZHRoIGFuZCBzZXQgdGhlIGJpdHMgd2hlcmUgZWxlbWVudHMgYXJlIHVuZGVmLgorICBDb25zdGFudFNETm9kZSAqCisgIGdldENvbnN0YW50U3BsYXROb2RlKEJpdFZlY3RvciAqVW5kZWZFbGVtZW50cyA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgc3BsYXR0ZWQgY29uc3RhbnQgRlAgb3IgbnVsbCBpZiB0aGlzIGlzIG5vdCBhIGNvbnN0YW50CisgIC8vLyBGUCBzcGxhdC4KKyAgLy8vCisgIC8vLyBJZiBwYXNzZWQgYSBub24tbnVsbCBVbmRlZkVsZW1lbnRzIGJpdHZlY3RvciwgaXQgd2lsbCByZXNpemUgaXQgdG8gbWF0Y2gKKyAgLy8vIHRoZSB2ZWN0b3Igd2lkdGggYW5kIHNldCB0aGUgYml0cyB3aGVyZSBlbGVtZW50cyBhcmUgdW5kZWYuCisgIENvbnN0YW50RlBTRE5vZGUgKgorICBnZXRDb25zdGFudEZQU3BsYXROb2RlKEJpdFZlY3RvciAqVW5kZWZFbGVtZW50cyA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgSWYgdGhpcyBpcyBhIGNvbnN0YW50IEZQIHNwbGF0IGFuZCB0aGUgc3BsYXR0ZWQgY29uc3RhbnQgRlAgaXMgYW4KKyAgLy8vIGV4YWN0IHBvd2VyIG9yIDIsIHJldHVybiB0aGUgbG9nIGJhc2UgMiBpbnRlZ2VyIHZhbHVlLiAgT3RoZXJ3aXNlLAorICAvLy8gcmV0dXJuIC0xLgorICAvLy8KKyAgLy8vIFRoZSBCaXRXaWR0aCBzcGVjaWZpZXMgdGhlIG5lY2Vzc2FyeSBiaXQgcHJlY2lzaW9uLgorICBpbnQzMl90IGdldENvbnN0YW50RlBTcGxhdFBvdzJUb0xvZzJJbnQoQml0VmVjdG9yICpVbmRlZkVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQml0V2lkdGgpIGNvbnN0OworCisgIGJvb2wgaXNDb25zdGFudCgpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6QlVJTERfVkVDVE9SOworICB9Cit9OworCisvLy8gQW4gU0ROb2RlIHRoYXQgaG9sZHMgYW4gYXJiaXRyYXJ5IExMVk0gSVIgVmFsdWUuIFRoaXMgaXMKKy8vLyB1c2VkIHdoZW4gdGhlIFNlbGVjdGlvbkRBRyBuZWVkcyB0byBtYWtlIGEgc2ltcGxlIHJlZmVyZW5jZSB0byBzb21ldGhpbmcKKy8vLyBpbiB0aGUgTExWTSBJUiByZXByZXNlbnRhdGlvbi4KKy8vLworY2xhc3MgU3JjVmFsdWVTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICBjb25zdCBWYWx1ZSAqVjsKKworICAvLy8gQ3JlYXRlIGEgU3JjVmFsdWUgZm9yIGEgZ2VuZXJhbCB2YWx1ZS4KKyAgZXhwbGljaXQgU3JjVmFsdWVTRE5vZGUoY29uc3QgVmFsdWUgKnYpCisgICAgOiBTRE5vZGUoSVNEOjpTUkNWQUxVRSwgMCwgRGVidWdMb2MoKSwgZ2V0U0RWVExpc3QoTVZUOjpPdGhlcikpLCBWKHYpIHt9CisKK3B1YmxpYzoKKyAgLy8vIFJldHVybiB0aGUgY29udGFpbmVkIFZhbHVlLgorICBjb25zdCBWYWx1ZSAqZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTUkNWQUxVRTsKKyAgfQorfTsKKworY2xhc3MgTUROb2RlU0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgY29uc3QgTUROb2RlICpNRDsKKworICBleHBsaWNpdCBNRE5vZGVTRE5vZGUoY29uc3QgTUROb2RlICptZCkKKyAgOiBTRE5vZGUoSVNEOjpNRE5PREVfU0ROT0RFLCAwLCBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChNVlQ6Ok90aGVyKSksIE1EKG1kKQorICB7fQorCitwdWJsaWM6CisgIGNvbnN0IE1ETm9kZSAqZ2V0TUQoKSBjb25zdCB7IHJldHVybiBNRDsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6TUROT0RFX1NETk9ERTsKKyAgfQorfTsKKworY2xhc3MgUmVnaXN0ZXJTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICB1bnNpZ25lZCBSZWc7CisKKyAgUmVnaXN0ZXJTRE5vZGUodW5zaWduZWQgcmVnLCBFVlQgVlQpCisgICAgOiBTRE5vZGUoSVNEOjpSZWdpc3RlciwgMCwgRGVidWdMb2MoKSwgZ2V0U0RWVExpc3QoVlQpKSwgUmVnKHJlZykge30KKworcHVibGljOgorICB1bnNpZ25lZCBnZXRSZWcoKSBjb25zdCB7IHJldHVybiBSZWc7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlJlZ2lzdGVyOworICB9Cit9OworCitjbGFzcyBSZWdpc3Rlck1hc2tTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICAvLyBUaGUgbWVtb3J5IGZvciBSZWdNYXNrIGlzIG5vdCBvd25lZCBieSB0aGUgbm9kZS4KKyAgY29uc3QgdWludDMyX3QgKlJlZ01hc2s7CisKKyAgUmVnaXN0ZXJNYXNrU0ROb2RlKGNvbnN0IHVpbnQzMl90ICptYXNrKQorICAgIDogU0ROb2RlKElTRDo6UmVnaXN0ZXJNYXNrLCAwLCBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChNVlQ6OlVudHlwZWQpKSwKKyAgICAgIFJlZ01hc2sobWFzaykge30KKworcHVibGljOgorICBjb25zdCB1aW50MzJfdCAqZ2V0UmVnTWFzaygpIGNvbnN0IHsgcmV0dXJuIFJlZ01hc2s7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlJlZ2lzdGVyTWFzazsKKyAgfQorfTsKKworY2xhc3MgQmxvY2tBZGRyZXNzU0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgY29uc3QgQmxvY2tBZGRyZXNzICpCQTsKKyAgaW50NjRfdCBPZmZzZXQ7CisgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3M7CisKKyAgQmxvY2tBZGRyZXNzU0ROb2RlKHVuc2lnbmVkIE5vZGVUeSwgRVZUIFZULCBjb25zdCBCbG9ja0FkZHJlc3MgKmJhLAorICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvLCB1bnNpZ25lZCBjaGFyIEZsYWdzKQorICAgIDogU0ROb2RlKE5vZGVUeSwgMCwgRGVidWdMb2MoKSwgZ2V0U0RWVExpc3QoVlQpKSwKKyAgICAgICAgICAgICBCQShiYSksIE9mZnNldChvKSwgVGFyZ2V0RmxhZ3MoRmxhZ3MpIHt9CisKK3B1YmxpYzoKKyAgY29uc3QgQmxvY2tBZGRyZXNzICpnZXRCbG9ja0FkZHJlc3MoKSBjb25zdCB7IHJldHVybiBCQTsgfQorICBpbnQ2NF90IGdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIE9mZnNldDsgfQorICB1bnNpZ25lZCBjaGFyIGdldFRhcmdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gVGFyZ2V0RmxhZ3M7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkJsb2NrQWRkcmVzcyB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEJsb2NrQWRkcmVzczsKKyAgfQorfTsKKworY2xhc3MgTGFiZWxTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICBNQ1N5bWJvbCAqTGFiZWw7CisKKyAgTGFiZWxTRE5vZGUodW5zaWduZWQgT3JkZXIsIGNvbnN0IERlYnVnTG9jICZkbCwgTUNTeW1ib2wgKkwpCisgICAgICA6IFNETm9kZShJU0Q6OkVIX0xBQkVMLCBPcmRlciwgZGwsIGdldFNEVlRMaXN0KE1WVDo6T3RoZXIpKSwgTGFiZWwoTCkge30KKworcHVibGljOgorICBNQ1N5bWJvbCAqZ2V0TGFiZWwoKSBjb25zdCB7IHJldHVybiBMYWJlbDsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6RUhfTEFCRUwgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBTk5PVEFUSU9OX0xBQkVMOworICB9Cit9OworCitjbGFzcyBFeHRlcm5hbFN5bWJvbFNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIGNvbnN0IGNoYXIgKlN5bWJvbDsKKyAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFnczsKKworICBFeHRlcm5hbFN5bWJvbFNETm9kZShib29sIGlzVGFyZ2V0LCBjb25zdCBjaGFyICpTeW0sIHVuc2lnbmVkIGNoYXIgVEYsIEVWVCBWVCkKKyAgICA6IFNETm9kZShpc1RhcmdldCA/IElTRDo6VGFyZ2V0RXh0ZXJuYWxTeW1ib2wgOiBJU0Q6OkV4dGVybmFsU3ltYm9sLAorICAgICAgICAgICAgIDAsIERlYnVnTG9jKCksIGdldFNEVlRMaXN0KFZUKSksIFN5bWJvbChTeW0pLCBUYXJnZXRGbGFncyhURikge30KKworcHVibGljOgorICBjb25zdCBjaGFyICpnZXRTeW1ib2woKSBjb25zdCB7IHJldHVybiBTeW1ib2w7IH0KKyAgdW5zaWduZWQgY2hhciBnZXRUYXJnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIFRhcmdldEZsYWdzOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpFeHRlcm5hbFN5bWJvbCB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEV4dGVybmFsU3ltYm9sOworICB9Cit9OworCitjbGFzcyBNQ1N5bWJvbFNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIE1DU3ltYm9sICpTeW1ib2w7CisKKyAgTUNTeW1ib2xTRE5vZGUoTUNTeW1ib2wgKlN5bWJvbCwgRVZUIFZUKQorICAgICAgOiBTRE5vZGUoSVNEOjpNQ1N5bWJvbCwgMCwgRGVidWdMb2MoKSwgZ2V0U0RWVExpc3QoVlQpKSwgU3ltYm9sKFN5bWJvbCkge30KKworcHVibGljOgorICBNQ1N5bWJvbCAqZ2V0TUNTeW1ib2woKSBjb25zdCB7IHJldHVybiBTeW1ib2w7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok1DU3ltYm9sOworICB9Cit9OworCitjbGFzcyBDb25kQ29kZVNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIElTRDo6Q29uZENvZGUgQ29uZGl0aW9uOworCisgIGV4cGxpY2l0IENvbmRDb2RlU0ROb2RlKElTRDo6Q29uZENvZGUgQ29uZCkKKyAgICA6IFNETm9kZShJU0Q6OkNPTkRDT0RFLCAwLCBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChNVlQ6Ok90aGVyKSksCisgICAgICBDb25kaXRpb24oQ29uZCkge30KKworcHVibGljOgorICBJU0Q6OkNvbmRDb2RlIGdldCgpIGNvbnN0IHsgcmV0dXJuIENvbmRpdGlvbjsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6Q09ORENPREU7CisgIH0KK307CisKKy8vLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVwcmVzZW50IEVWVCdzLCB3aGljaCBhcmUgdXNlZAorLy8vIHRvIHBhcmFtZXRlcml6ZSBzb21lIG9wZXJhdGlvbnMuCitjbGFzcyBWVFNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIEVWVCBWYWx1ZVR5cGU7CisKKyAgZXhwbGljaXQgVlRTRE5vZGUoRVZUIFZUKQorICAgIDogU0ROb2RlKElTRDo6VkFMVUVUWVBFLCAwLCBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChNVlQ6Ok90aGVyKSksCisgICAgICBWYWx1ZVR5cGUoVlQpIHt9CisKK3B1YmxpYzoKKyAgRVZUIGdldFZUKCkgY29uc3QgeyByZXR1cm4gVmFsdWVUeXBlOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpWQUxVRVRZUEU7CisgIH0KK307CisKKy8vLyBCYXNlIGNsYXNzIGZvciBMb2FkU0ROb2RlIGFuZCBTdG9yZVNETm9kZQorY2xhc3MgTFNCYXNlU0ROb2RlIDogcHVibGljIE1lbVNETm9kZSB7CitwdWJsaWM6CisgIExTQmFzZVNETm9kZShJU0Q6Ok5vZGVUeXBlIE5vZGVUeSwgdW5zaWduZWQgT3JkZXIsIGNvbnN0IERlYnVnTG9jICZkbCwKKyAgICAgICAgICAgICAgIFNEVlRMaXN0IFZUcywgSVNEOjpNZW1JbmRleGVkTW9kZSBBTSwgRVZUIE1lbVZULAorICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTykKKyAgICAgIDogTWVtU0ROb2RlKE5vZGVUeSwgT3JkZXIsIGRsLCBWVHMsIE1lbVZULCBNTU8pIHsKKyAgICBMU0Jhc2VTRE5vZGVCaXRzLkFkZHJlc3NpbmdNb2RlID0gQU07CisgICAgYXNzZXJ0KGdldEFkZHJlc3NpbmdNb2RlKCkgPT0gQU0gJiYgIlZhbHVlIHRydW5jYXRlZCIpOworICB9CisKKyAgY29uc3QgU0RWYWx1ZSAmZ2V0T2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYW5kKGdldE9wY29kZSgpID09IElTRDo6TE9BRCA/IDIgOiAzKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGFkZHJlc3NpbmcgbW9kZSBmb3IgdGhpcyBsb2FkIG9yIHN0b3JlOgorICAvLy8gdW5pbmRleGVkLCBwcmUtaW5jLCBwcmUtZGVjLCBwb3N0LWluYywgb3IgcG9zdC1kZWMuCisgIElTRDo6TWVtSW5kZXhlZE1vZGUgZ2V0QWRkcmVzc2luZ01vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PElTRDo6TWVtSW5kZXhlZE1vZGU+KExTQmFzZVNETm9kZUJpdHMuQWRkcmVzc2luZ01vZGUpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBwcmUvcG9zdCBpbmMvZGVjIGxvYWQvc3RvcmUuCisgIGJvb2wgaXNJbmRleGVkKCkgY29uc3QgeyByZXR1cm4gZ2V0QWRkcmVzc2luZ01vZGUoKSAhPSBJU0Q6OlVOSU5ERVhFRDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIE5PVCBhIHByZS9wb3N0IGluYy9kZWMgbG9hZC9zdG9yZS4KKyAgYm9vbCBpc1VuaW5kZXhlZCgpIGNvbnN0IHsgcmV0dXJuIGdldEFkZHJlc3NpbmdNb2RlKCkgPT0gSVNEOjpVTklOREVYRUQ7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkxPQUQgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTVE9SRTsKKyAgfQorfTsKKworLy8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgSVNEOjpMT0FEIG5vZGVzLgorY2xhc3MgTG9hZFNETm9kZSA6IHB1YmxpYyBMU0Jhc2VTRE5vZGUgeworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIExvYWRTRE5vZGUodW5zaWduZWQgT3JkZXIsIGNvbnN0IERlYnVnTG9jICZkbCwgU0RWVExpc3QgVlRzLAorICAgICAgICAgICAgIElTRDo6TWVtSW5kZXhlZE1vZGUgQU0sIElTRDo6TG9hZEV4dFR5cGUgRVR5LCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTykKKyAgICAgIDogTFNCYXNlU0ROb2RlKElTRDo6TE9BRCwgT3JkZXIsIGRsLCBWVHMsIEFNLCBNZW1WVCwgTU1PKSB7CisgICAgTG9hZFNETm9kZUJpdHMuRXh0VHkgPSBFVHk7CisgICAgYXNzZXJ0KHJlYWRNZW0oKSAmJiAiTG9hZCBNYWNoaW5lTWVtT3BlcmFuZCBpcyBub3QgYSBsb2FkISIpOworICAgIGFzc2VydCghd3JpdGVNZW0oKSAmJiAiTG9hZCBNYWNoaW5lTWVtT3BlcmFuZCBpcyBhIHN0b3JlISIpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBwbGFpbiBub2RlLAorICAvLy8gb3Igb25lIG9mIHRoZSB2YXJpZXRpZXMgb2YgdmFsdWUtZXh0ZW5kaW5nIGxvYWRzLgorICBJU0Q6OkxvYWRFeHRUeXBlIGdldEV4dGVuc2lvblR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PElTRDo6TG9hZEV4dFR5cGU+KExvYWRTRE5vZGVCaXRzLkV4dFR5KTsKKyAgfQorCisgIGNvbnN0IFNEVmFsdWUgJmdldEJhc2VQdHIoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDEpOyB9CisgIGNvbnN0IFNEVmFsdWUgJmdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMik7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkxPQUQ7CisgIH0KK307CisKKy8vLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVwcmVzZW50IElTRDo6U1RPUkUgbm9kZXMuCitjbGFzcyBTdG9yZVNETm9kZSA6IHB1YmxpYyBMU0Jhc2VTRE5vZGUgeworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIFN0b3JlU0ROb2RlKHVuc2lnbmVkIE9yZGVyLCBjb25zdCBEZWJ1Z0xvYyAmZGwsIFNEVlRMaXN0IFZUcywKKyAgICAgICAgICAgICAgSVNEOjpNZW1JbmRleGVkTW9kZSBBTSwgYm9vbCBpc1RydW5jLCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pCisgICAgICA6IExTQmFzZVNETm9kZShJU0Q6OlNUT1JFLCBPcmRlciwgZGwsIFZUcywgQU0sIE1lbVZULCBNTU8pIHsKKyAgICBTdG9yZVNETm9kZUJpdHMuSXNUcnVuY2F0aW5nID0gaXNUcnVuYzsKKyAgICBhc3NlcnQoIXJlYWRNZW0oKSAmJiAiU3RvcmUgTWFjaGluZU1lbU9wZXJhbmQgaXMgYSBsb2FkISIpOworICAgIGFzc2VydCh3cml0ZU1lbSgpICYmICJTdG9yZSBNYWNoaW5lTWVtT3BlcmFuZCBpcyBub3QgYSBzdG9yZSEiKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgb3AgZG9lcyBhIHRydW5jYXRpb24gYmVmb3JlIHN0b3JlLgorICAvLy8gRm9yIGludGVnZXJzIHRoaXMgaXMgdGhlIHNhbWUgYXMgZG9pbmcgYSBUUlVOQ0FURSBhbmQgc3RvcmluZyB0aGUgcmVzdWx0LgorICAvLy8gRm9yIGZsb2F0cywgaXQgaXMgdGhlIHNhbWUgYXMgZG9pbmcgYW4gRlBfUk9VTkQgYW5kIHN0b3JpbmcgdGhlIHJlc3VsdC4KKyAgYm9vbCBpc1RydW5jYXRpbmdTdG9yZSgpIGNvbnN0IHsgcmV0dXJuIFN0b3JlU0ROb2RlQml0cy5Jc1RydW5jYXRpbmc7IH0KKyAgdm9pZCBzZXRUcnVuY2F0aW5nU3RvcmUoYm9vbCBUcnVuY2F0aW5nKSB7CisgICAgU3RvcmVTRE5vZGVCaXRzLklzVHJ1bmNhdGluZyA9IFRydW5jYXRpbmc7CisgIH0KKworICBjb25zdCBTRFZhbHVlICZnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMSk7IH0KKyAgY29uc3QgU0RWYWx1ZSAmZ2V0QmFzZVB0cigpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMik7IH0KKyAgY29uc3QgU0RWYWx1ZSAmZ2V0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgzKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6U1RPUkU7CisgIH0KK307CisKKy8vLyBUaGlzIGJhc2UgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgTUxPQUQgYW5kIE1TVE9SRSBub2RlcworY2xhc3MgTWFza2VkTG9hZFN0b3JlU0ROb2RlIDogcHVibGljIE1lbVNETm9kZSB7CitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgTWFza2VkTG9hZFN0b3JlU0ROb2RlKElTRDo6Tm9kZVR5cGUgTm9kZVR5LCB1bnNpZ25lZCBPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnTG9jICZkbCwgU0RWVExpc3QgVlRzLCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKQorICAgICAgOiBNZW1TRE5vZGUoTm9kZVR5LCBPcmRlciwgZGwsIFZUcywgTWVtVlQsIE1NTykge30KKworICAvLyBJbiB0aGUgYm90aCBub2RlcyBhZGRyZXNzIGlzIE9wMSwgbWFzayBpcyBPcDI6CisgIC8vIE1hc2tlZExvYWRTRE5vZGUgKENoYWluLCBwdHIsIG1hc2ssIHNyYzApLCBzcmMwIGlzIGEgcGFzc3RocnUgdmFsdWUKKyAgLy8gTWFza2VkU3RvcmVTRE5vZGUgKENoYWluLCBwdHIsIG1hc2ssIGRhdGEpCisgIC8vIE1hc2sgaXMgYSB2ZWN0b3Igb2YgaTEgZWxlbWVudHMKKyAgY29uc3QgU0RWYWx1ZSAmZ2V0QmFzZVB0cigpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMSk7IH0KKyAgY29uc3QgU0RWYWx1ZSAmZ2V0TWFzaygpIGNvbnN0ICAgIHsgcmV0dXJuIGdldE9wZXJhbmQoMik7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok1MT0FEIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6TVNUT1JFOworICB9Cit9OworCisvLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhbiBNTE9BRCBub2RlCitjbGFzcyBNYXNrZWRMb2FkU0ROb2RlIDogcHVibGljIE1hc2tlZExvYWRTdG9yZVNETm9kZSB7CitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgTWFza2VkTG9hZFNETm9kZSh1bnNpZ25lZCBPcmRlciwgY29uc3QgRGVidWdMb2MgJmRsLCBTRFZUTGlzdCBWVHMsCisgICAgICAgICAgICAgICAgICAgSVNEOjpMb2FkRXh0VHlwZSBFVHksIGJvb2wgSXNFeHBhbmRpbmcsIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKQorICAgICAgOiBNYXNrZWRMb2FkU3RvcmVTRE5vZGUoSVNEOjpNTE9BRCwgT3JkZXIsIGRsLCBWVHMsIE1lbVZULCBNTU8pIHsKKyAgICBMb2FkU0ROb2RlQml0cy5FeHRUeSA9IEVUeTsKKyAgICBMb2FkU0ROb2RlQml0cy5Jc0V4cGFuZGluZyA9IElzRXhwYW5kaW5nOworICB9CisKKyAgSVNEOjpMb2FkRXh0VHlwZSBnZXRFeHRlbnNpb25UeXBlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxJU0Q6OkxvYWRFeHRUeXBlPihMb2FkU0ROb2RlQml0cy5FeHRUeSk7CisgIH0KKworICBjb25zdCBTRFZhbHVlICZnZXRTcmMwKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgzKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok1MT0FEOworICB9CisKKyAgYm9vbCBpc0V4cGFuZGluZ0xvYWQoKSBjb25zdCB7IHJldHVybiBMb2FkU0ROb2RlQml0cy5Jc0V4cGFuZGluZzsgfQorfTsKKworLy8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgYW4gTVNUT1JFIG5vZGUKK2NsYXNzIE1hc2tlZFN0b3JlU0ROb2RlIDogcHVibGljIE1hc2tlZExvYWRTdG9yZVNETm9kZSB7CitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgTWFza2VkU3RvcmVTRE5vZGUodW5zaWduZWQgT3JkZXIsIGNvbnN0IERlYnVnTG9jICZkbCwgU0RWVExpc3QgVlRzLAorICAgICAgICAgICAgICAgICAgICBib29sIGlzVHJ1bmMsIGJvb2wgaXNDb21wcmVzc2luZywgRVZUIE1lbVZULAorICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKQorICAgICAgOiBNYXNrZWRMb2FkU3RvcmVTRE5vZGUoSVNEOjpNU1RPUkUsIE9yZGVyLCBkbCwgVlRzLCBNZW1WVCwgTU1PKSB7CisgICAgU3RvcmVTRE5vZGVCaXRzLklzVHJ1bmNhdGluZyA9IGlzVHJ1bmM7CisgICAgU3RvcmVTRE5vZGVCaXRzLklzQ29tcHJlc3NpbmcgPSBpc0NvbXByZXNzaW5nOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBvcCBkb2VzIGEgdHJ1bmNhdGlvbiBiZWZvcmUgc3RvcmUuCisgIC8vLyBGb3IgaW50ZWdlcnMgdGhpcyBpcyB0aGUgc2FtZSBhcyBkb2luZyBhIFRSVU5DQVRFIGFuZCBzdG9yaW5nIHRoZSByZXN1bHQuCisgIC8vLyBGb3IgZmxvYXRzLCBpdCBpcyB0aGUgc2FtZSBhcyBkb2luZyBhbiBGUF9ST1VORCBhbmQgc3RvcmluZyB0aGUgcmVzdWx0LgorICBib29sIGlzVHJ1bmNhdGluZ1N0b3JlKCkgY29uc3QgeyByZXR1cm4gU3RvcmVTRE5vZGVCaXRzLklzVHJ1bmNhdGluZzsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIG9wIGRvZXMgYSBjb21wcmVzc2lvbiB0byB0aGUgdmVjdG9yIGJlZm9yZSBzdG9yaW5nLgorICAvLy8gVGhlIG5vZGUgY29udGlndW91c2x5IHN0b3JlcyB0aGUgYWN0aXZlIGVsZW1lbnRzIChpbnRlZ2VycyBvciBmbG9hdHMpCisgIC8vLyBpbiBzcmMgKHRob3NlIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSBiaXQgc2V0IGluIHdyaXRlbWFzayBrKSB0byB1bmFsaWduZWQKKyAgLy8vIG1lbW9yeSBhdCBiYXNlX2FkZHIuCisgIGJvb2wgaXNDb21wcmVzc2luZ1N0b3JlKCkgY29uc3QgeyByZXR1cm4gU3RvcmVTRE5vZGVCaXRzLklzQ29tcHJlc3Npbmc7IH0KKworICBjb25zdCBTRFZhbHVlICZnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMyk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok1TVE9SRTsKKyAgfQorfTsKKworLy8vIFRoaXMgaXMgYSBiYXNlIGNsYXNzIHVzZWQgdG8gcmVwcmVzZW50CisvLy8gTUdBVEhFUiBhbmQgTVNDQVRURVIgbm9kZXMKKy8vLworY2xhc3MgTWFza2VkR2F0aGVyU2NhdHRlclNETm9kZSA6IHB1YmxpYyBNZW1TRE5vZGUgeworcHVibGljOgorICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIE1hc2tlZEdhdGhlclNjYXR0ZXJTRE5vZGUoSVNEOjpOb2RlVHlwZSBOb2RlVHksIHVuc2lnbmVkIE9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnTG9jICZkbCwgU0RWVExpc3QgVlRzLCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTykKKyAgICAgIDogTWVtU0ROb2RlKE5vZGVUeSwgT3JkZXIsIGRsLCBWVHMsIE1lbVZULCBNTU8pIHt9CisKKyAgLy8gSW4gdGhlIGJvdGggbm9kZXMgYWRkcmVzcyBpcyBPcDEsIG1hc2sgaXMgT3AyOgorICAvLyBNYXNrZWRHYXRoZXJTRE5vZGUgIChDaGFpbiwgcGFzc3RocnUsIG1hc2ssIGJhc2UsIGluZGV4LCBzY2FsZSkKKyAgLy8gTWFza2VkU2NhdHRlclNETm9kZSAoQ2hhaW4sIHZhbHVlLCBtYXNrLCBiYXNlLCBpbmRleCwgc2NhbGUpCisgIC8vIE1hc2sgaXMgYSB2ZWN0b3Igb2YgaTEgZWxlbWVudHMKKyAgY29uc3QgU0RWYWx1ZSAmZ2V0QmFzZVB0cigpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMyk7IH0KKyAgY29uc3QgU0RWYWx1ZSAmZ2V0SW5kZXgoKSAgIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoNCk7IH0KKyAgY29uc3QgU0RWYWx1ZSAmZ2V0TWFzaygpICAgIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMik7IH0KKyAgY29uc3QgU0RWYWx1ZSAmZ2V0VmFsdWUoKSAgIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMSk7IH0KKyAgY29uc3QgU0RWYWx1ZSAmZ2V0U2NhbGUoKSAgIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoNSk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok1HQVRIRVIgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpNU0NBVFRFUjsKKyAgfQorfTsKKworLy8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgYW4gTUdBVEhFUiBub2RlCisvLy8KK2NsYXNzIE1hc2tlZEdhdGhlclNETm9kZSA6IHB1YmxpYyBNYXNrZWRHYXRoZXJTY2F0dGVyU0ROb2RlIHsKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICBNYXNrZWRHYXRoZXJTRE5vZGUodW5zaWduZWQgT3JkZXIsIGNvbnN0IERlYnVnTG9jICZkbCwgU0RWVExpc3QgVlRzLAorICAgICAgICAgICAgICAgICAgICAgRVZUIE1lbVZULCBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKQorICAgICAgOiBNYXNrZWRHYXRoZXJTY2F0dGVyU0ROb2RlKElTRDo6TUdBVEhFUiwgT3JkZXIsIGRsLCBWVHMsIE1lbVZULCBNTU8pIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpNR0FUSEVSOworICB9Cit9OworCisvLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhbiBNU0NBVFRFUiBub2RlCisvLy8KK2NsYXNzIE1hc2tlZFNjYXR0ZXJTRE5vZGUgOiBwdWJsaWMgTWFza2VkR2F0aGVyU2NhdHRlclNETm9kZSB7CitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgTWFza2VkU2NhdHRlclNETm9kZSh1bnNpZ25lZCBPcmRlciwgY29uc3QgRGVidWdMb2MgJmRsLCBTRFZUTGlzdCBWVHMsCisgICAgICAgICAgICAgICAgICAgICAgRVZUIE1lbVZULCBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKQorICAgICAgOiBNYXNrZWRHYXRoZXJTY2F0dGVyU0ROb2RlKElTRDo6TVNDQVRURVIsIE9yZGVyLCBkbCwgVlRzLCBNZW1WVCwgTU1PKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6TVNDQVRURVI7CisgIH0KK307CisKKy8vLyBBbiBTRE5vZGUgdGhhdCByZXByZXNlbnRzIGV2ZXJ5dGhpbmcgdGhhdCB3aWxsIGJlIG5lZWRlZAorLy8vIHRvIGNvbnN0cnVjdCBhIE1hY2hpbmVJbnN0ci4gVGhlc2Ugbm9kZXMgYXJlIGNyZWF0ZWQgZHVyaW5nIHRoZQorLy8vIGluc3RydWN0aW9uIHNlbGVjdGlvbiBwcm9wZXIgcGhhc2UuCitjbGFzcyBNYWNoaW5lU0ROb2RlIDogcHVibGljIFNETm9kZSB7CitwdWJsaWM6CisgIHVzaW5nIG1tb19pdGVyYXRvciA9IE1hY2hpbmVNZW1PcGVyYW5kICoqOworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIE1hY2hpbmVTRE5vZGUodW5zaWduZWQgT3BjLCB1bnNpZ25lZCBPcmRlciwgY29uc3QgRGVidWdMb2MgJkRMLCBTRFZUTGlzdCBWVHMpCisgICAgICA6IFNETm9kZShPcGMsIE9yZGVyLCBETCwgVlRzKSB7fQorCisgIC8vLyBNZW1vcnkgcmVmZXJlbmNlIGRlc2NyaXB0aW9ucyBmb3IgdGhpcyBpbnN0cnVjdGlvbi4KKyAgbW1vX2l0ZXJhdG9yIE1lbVJlZnMgPSBudWxscHRyOworICBtbW9faXRlcmF0b3IgTWVtUmVmc0VuZCA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgbW1vX2l0ZXJhdG9yIG1lbW9wZXJhbmRzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gTWVtUmVmczsgfQorICBtbW9faXRlcmF0b3IgbWVtb3BlcmFuZHNfZW5kKCkgY29uc3QgeyByZXR1cm4gTWVtUmVmc0VuZDsgfQorICBib29sIG1lbW9wZXJhbmRzX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gTWVtUmVmc0VuZCA9PSBNZW1SZWZzOyB9CisKKyAgLy8vIEFzc2lnbiB0aGlzIE1hY2hpbmVTRE5vZGVzJ3MgbWVtb3J5IHJlZmVyZW5jZSBkZXNjcmlwdG9yCisgIC8vLyBsaXN0LiBUaGlzIGRvZXMgbm90IHRyYW5zZmVyIG93bmVyc2hpcC4KKyAgdm9pZCBzZXRNZW1SZWZzKG1tb19pdGVyYXRvciBOZXdNZW1SZWZzLCBtbW9faXRlcmF0b3IgTmV3TWVtUmVmc0VuZCkgeworICAgIGZvciAobW1vX2l0ZXJhdG9yIE1NSSA9IE5ld01lbVJlZnMsIE1NRSA9IE5ld01lbVJlZnNFbmQ7IE1NSSAhPSBNTUU7ICsrTU1JKQorICAgICAgYXNzZXJ0KCpNTUkgJiYgIk51bGwgbWVtIHJlZiBkZXRlY3RlZCEiKTsKKyAgICBNZW1SZWZzID0gTmV3TWVtUmVmczsKKyAgICBNZW1SZWZzRW5kID0gTmV3TWVtUmVmc0VuZDsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmlzTWFjaGluZU9wY29kZSgpOworICB9Cit9OworCitjbGFzcyBTRE5vZGVJdGVyYXRvciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETm9kZSwgcHRyZGlmZl90PiB7CisgIGNvbnN0IFNETm9kZSAqTm9kZTsKKyAgdW5zaWduZWQgT3BlcmFuZDsKKworICBTRE5vZGVJdGVyYXRvcihjb25zdCBTRE5vZGUgKk4sIHVuc2lnbmVkIE9wKSA6IE5vZGUoTiksIE9wZXJhbmQoT3ApIHt9CisKK3B1YmxpYzoKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNETm9kZUl0ZXJhdG9yJiB4KSBjb25zdCB7CisgICAgcmV0dXJuIE9wZXJhbmQgPT0geC5PcGVyYW5kOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTRE5vZGVJdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0oeCk7IH0KKworICBwb2ludGVyIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9kZS0+Z2V0T3BlcmFuZChPcGVyYW5kKS5nZXROb2RlKCk7CisgIH0KKyAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gb3BlcmF0b3IqKCk7IH0KKworICBTRE5vZGVJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgICAgICAgICAgICAgICAgLy8gUHJlaW5jcmVtZW50CisgICAgKytPcGVyYW5kOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBTRE5vZGVJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAvLyBQb3N0aW5jcmVtZW50CisgICAgU0ROb2RlSXRlcmF0b3IgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgIH0KKyAgc2l6ZV90IG9wZXJhdG9yLShTRE5vZGVJdGVyYXRvciBPdGhlcikgY29uc3QgeworICAgIGFzc2VydChOb2RlID09IE90aGVyLk5vZGUgJiYKKyAgICAgICAgICAgIkNhbm5vdCBjb21wYXJlIGl0ZXJhdG9ycyBvZiB0d28gZGlmZmVyZW50IG5vZGVzISIpOworICAgIHJldHVybiBPcGVyYW5kIC0gT3RoZXIuT3BlcmFuZDsKKyAgfQorCisgIHN0YXRpYyBTRE5vZGVJdGVyYXRvciBiZWdpbihjb25zdCBTRE5vZGUgKk4pIHsgcmV0dXJuIFNETm9kZUl0ZXJhdG9yKE4sIDApOyB9CisgIHN0YXRpYyBTRE5vZGVJdGVyYXRvciBlbmQgIChjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gU0ROb2RlSXRlcmF0b3IoTiwgTi0+Z2V0TnVtT3BlcmFuZHMoKSk7CisgIH0KKworICB1bnNpZ25lZCBnZXRPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gT3BlcmFuZDsgfQorICBjb25zdCBTRE5vZGUgKmdldE5vZGUoKSBjb25zdCB7IHJldHVybiBOb2RlOyB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8U0ROb2RlKj4geworICB1c2luZyBOb2RlUmVmID0gU0ROb2RlICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gU0ROb2RlSXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKFNETm9kZSAqTikgeyByZXR1cm4gTjsgfQorCisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsKKyAgICByZXR1cm4gU0ROb2RlSXRlcmF0b3I6OmJlZ2luKE4pOworICB9CisKKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsKKyAgICByZXR1cm4gU0ROb2RlSXRlcmF0b3I6OmVuZChOKTsKKyAgfQorfTsKKworLy8vIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxhcmdlc3QgU0ROb2RlLCBmb3IgdXNlIGluIHNpemVvZigpLgorLy8vCisvLy8gVGhpcyBuZWVkcyB0byBiZSBhIHVuaW9uIGJlY2F1c2UgdGhlIGxhcmdlc3Qgbm9kZSBkaWZmZXJzIG9uIDMyIGJpdCBzeXN0ZW1zCisvLy8gd2l0aCA0IGFuZCA4IGJ5dGUgcG9pbnRlciBhbGlnbm1lbnQsIHJlc3BlY3RpdmVseS4KK3VzaW5nIExhcmdlc3RTRE5vZGUgPSBBbGlnbmVkQ2hhckFycmF5VW5pb248QXRvbWljU0ROb2RlLCBUYXJnZXRJbmRleFNETm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tBZGRyZXNzU0ROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxBZGRyZXNzU0ROb2RlPjsKKworLy8vIFRoZSBTRE5vZGUgY2xhc3Mgd2l0aCB0aGUgZ3JlYXRlc3QgYWxpZ25tZW50IHJlcXVpcmVtZW50LgordXNpbmcgTW9zdEFsaWduZWRTRE5vZGUgPSBHbG9iYWxBZGRyZXNzU0ROb2RlOworCituYW1lc3BhY2UgSVNEIHsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBhIG5vbi1leHRlbmRpbmcgYW5kIHVuaW5kZXhlZCBsb2FkLgorICBpbmxpbmUgYm9vbCBpc05vcm1hbExvYWQoY29uc3QgU0ROb2RlICpOKSB7CisgICAgY29uc3QgTG9hZFNETm9kZSAqTGQgPSBkeW5fY2FzdDxMb2FkU0ROb2RlPihOKTsKKyAgICByZXR1cm4gTGQgJiYgTGQtPmdldEV4dGVuc2lvblR5cGUoKSA9PSBJU0Q6Ok5PTl9FWFRMT0FEICYmCisgICAgICBMZC0+Z2V0QWRkcmVzc2luZ01vZGUoKSA9PSBJU0Q6OlVOSU5ERVhFRDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIGEgbm9uLWV4dGVuZGluZyBsb2FkLgorICBpbmxpbmUgYm9vbCBpc05PTl9FWFRMb2FkKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBpc2E8TG9hZFNETm9kZT4oTikgJiYKKyAgICAgIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldEV4dGVuc2lvblR5cGUoKSA9PSBJU0Q6Ok5PTl9FWFRMT0FEOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgYSBFWFRMT0FELgorICBpbmxpbmUgYm9vbCBpc0VYVExvYWQoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIGlzYTxMb2FkU0ROb2RlPihOKSAmJgorICAgICAgY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0RXh0ZW5zaW9uVHlwZSgpID09IElTRDo6RVhUTE9BRDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIGEgU0VYVExPQUQuCisgIGlubGluZSBib29sIGlzU0VYVExvYWQoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIGlzYTxMb2FkU0ROb2RlPihOKSAmJgorICAgICAgY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0RXh0ZW5zaW9uVHlwZSgpID09IElTRDo6U0VYVExPQUQ7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBhIFpFWFRMT0FELgorICBpbmxpbmUgYm9vbCBpc1pFWFRMb2FkKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBpc2E8TG9hZFNETm9kZT4oTikgJiYKKyAgICAgIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldEV4dGVuc2lvblR5cGUoKSA9PSBJU0Q6OlpFWFRMT0FEOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgYW4gdW5pbmRleGVkIGxvYWQuCisgIGlubGluZSBib29sIGlzVU5JTkRFWEVETG9hZChjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gaXNhPExvYWRTRE5vZGU+KE4pICYmCisgICAgICBjYXN0PExvYWRTRE5vZGU+KE4pLT5nZXRBZGRyZXNzaW5nTW9kZSgpID09IElTRDo6VU5JTkRFWEVEOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgYSBub24tdHJ1bmNhdGluZworICAvLy8gYW5kIHVuaW5kZXhlZCBzdG9yZS4KKyAgaW5saW5lIGJvb2wgaXNOb3JtYWxTdG9yZShjb25zdCBTRE5vZGUgKk4pIHsKKyAgICBjb25zdCBTdG9yZVNETm9kZSAqU3QgPSBkeW5fY2FzdDxTdG9yZVNETm9kZT4oTik7CisgICAgcmV0dXJuIFN0ICYmICFTdC0+aXNUcnVuY2F0aW5nU3RvcmUoKSAmJgorICAgICAgU3QtPmdldEFkZHJlc3NpbmdNb2RlKCkgPT0gSVNEOjpVTklOREVYRUQ7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBhIG5vbi10cnVuY2F0aW5nIHN0b3JlLgorICBpbmxpbmUgYm9vbCBpc05PTl9UUlVOQ1N0b3JlKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBpc2E8U3RvcmVTRE5vZGU+KE4pICYmICFjYXN0PFN0b3JlU0ROb2RlPihOKS0+aXNUcnVuY2F0aW5nU3RvcmUoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIGEgdHJ1bmNhdGluZyBzdG9yZS4KKyAgaW5saW5lIGJvb2wgaXNUUlVOQ1N0b3JlKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBpc2E8U3RvcmVTRE5vZGU+KE4pICYmIGNhc3Q8U3RvcmVTRE5vZGU+KE4pLT5pc1RydW5jYXRpbmdTdG9yZSgpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgYW4gdW5pbmRleGVkIHN0b3JlLgorICBpbmxpbmUgYm9vbCBpc1VOSU5ERVhFRFN0b3JlKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBpc2E8U3RvcmVTRE5vZGU+KE4pICYmCisgICAgICBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0QWRkcmVzc2luZ01vZGUoKSA9PSBJU0Q6OlVOSU5ERVhFRDsKKyAgfQorCisgIC8vLyBBdHRlbXB0IHRvIG1hdGNoIGEgdW5hcnkgcHJlZGljYXRlIGFnYWluc3QgYSBzY2FsYXIvc3BsYXQgY29uc3RhbnQgb3IKKyAgLy8vIGV2ZXJ5IGVsZW1lbnQgb2YgYSBjb25zdGFudCBCVUlMRF9WRUNUT1IuCisgIGJvb2wgbWF0Y2hVbmFyeVByZWRpY2F0ZShTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxib29sKENvbnN0YW50U0ROb2RlICopPiBNYXRjaCk7CisKKyAgLy8vIEF0dGVtcHQgdG8gbWF0Y2ggYSBiaW5hcnkgcHJlZGljYXRlIGFnYWluc3QgYSBwYWlyIG9mIHNjYWxhci9zcGxhdAorICAvLy8gY29uc3RhbnRzIG9yIGV2ZXJ5IGVsZW1lbnQgb2YgYSBwYWlyIG9mIGNvbnN0YW50IEJVSUxEX1ZFQ1RPUnMuCisgIGJvb2wgbWF0Y2hCaW5hcnlQcmVkaWNhdGUoCisgICAgICBTRFZhbHVlIExIUywgU0RWYWx1ZSBSSFMsCisgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woQ29uc3RhbnRTRE5vZGUgKiwgQ29uc3RhbnRTRE5vZGUgKik+IE1hdGNoKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIElTRAorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1NFTEVDVElPTkRBR05PREVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdUYXJnZXRJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHVGFyZ2V0SW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YzFkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHVGFyZ2V0SW5mby5oCkBAIC0wLDAgKzEsMTYwIEBACisvLz09LSBsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHVGFyZ2V0SW5mby5oIC0gU2VsZWN0aW9uREFHIEluZm8gLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgU2VsZWN0aW9uREFHVGFyZ2V0SW5mbyBjbGFzcywgd2hpY2ggdGFyZ2V0cyBjYW4KKy8vIHN1YmNsYXNzIHRvIHBhcmFtZXRlcml6ZSB0aGUgU2VsZWN0aW9uREFHIGxvd2VyaW5nIGFuZCBpbnN0cnVjdGlvbgorLy8gc2VsZWN0aW9uIHByb2Nlc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fU0VMRUNUSU9OREFHVEFSR0VUSU5GT19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9TRUxFQ1RJT05EQUdUQVJHRVRJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lTWVtT3BlcmFuZC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdOb2Rlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db2RlR2VuLmgiCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBTZWxlY3Rpb25EQUc7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gVGFyZ2V0cyBjYW4gc3ViY2xhc3MgdGhpcyB0byBwYXJhbWV0ZXJpemUgdGhlCisvLy8gU2VsZWN0aW9uREFHIGxvd2VyaW5nIGFuZCBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gcHJvY2Vzcy4KKy8vLworY2xhc3MgU2VsZWN0aW9uREFHVGFyZ2V0SW5mbyB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFNlbGVjdGlvbkRBR1RhcmdldEluZm8oKSA9IGRlZmF1bHQ7CisgIFNlbGVjdGlvbkRBR1RhcmdldEluZm8oY29uc3QgU2VsZWN0aW9uREFHVGFyZ2V0SW5mbyAmKSA9IGRlbGV0ZTsKKyAgU2VsZWN0aW9uREFHVGFyZ2V0SW5mbyAmb3BlcmF0b3I9KGNvbnN0IFNlbGVjdGlvbkRBR1RhcmdldEluZm8gJikgPSBkZWxldGU7CisgIHZpcnR1YWwgflNlbGVjdGlvbkRBR1RhcmdldEluZm8oKTsKKworICAvLy8gRW1pdCB0YXJnZXQtc3BlY2lmaWMgY29kZSB0aGF0IHBlcmZvcm1zIGEgbWVtY3B5LgorICAvLy8gVGhpcyBjYW4gYmUgdXNlZCBieSB0YXJnZXRzIHRvIHByb3ZpZGUgY29kZSBzZXF1ZW5jZXMgZm9yIGNhc2VzCisgIC8vLyB0aGF0IGRvbid0IGZpdCB0aGUgdGFyZ2V0J3MgcGFyYW1ldGVycyBmb3Igc2ltcGxlIGxvYWRzL3N0b3JlcyBhbmQgY2FuIGJlCisgIC8vLyBtb3JlIGVmZmljaWVudCB0aGFuIHVzaW5nIGEgbGlicmFyeSBjYWxsLiBUaGlzIGZ1bmN0aW9uIGNhbiByZXR1cm4gYSBudWxsCisgIC8vLyBTRFZhbHVlIGlmIHRoZSB0YXJnZXQgZGVjbGluZXMgdG8gdXNlIGN1c3RvbSBjb2RlIGFuZCBhIGRpZmZlcmVudAorICAvLy8gbG93ZXJpbmcgc3RyYXRlZ3kgc2hvdWxkIGJlIHVzZWQuCisgIC8vLworICAvLy8gSWYgQWx3YXlzSW5saW5lIGlzIHRydWUsIHRoZSBzaXplIGlzIGNvbnN0YW50IGFuZCB0aGUgdGFyZ2V0IHNob3VsZCBub3QKKyAgLy8vIGVtaXQgYW55IGNhbGxzIGFuZCBpcyBzdHJvbmdseSBlbmNvdXJhZ2VkIHRvIGF0dGVtcHQgdG8gZW1pdCBpbmxpbmUgY29kZQorICAvLy8gZXZlbiBpZiBpdCBpcyBiZXlvbmQgdGhlIHVzdWFsIHRocmVzaG9sZCBiZWNhdXNlIHRoaXMgaW50cmluc2ljIGlzIGJlaW5nCisgIC8vLyBleHBhbmRlZCBpbiBhIHBsYWNlIHdoZXJlIGNhbGxzIGFyZSBub3QgZmVhc2libGUgKGUuZy4gd2l0aGluIHRoZSBwcm9sb2d1ZQorICAvLy8gZm9yIGFub3RoZXIgY2FsbCkuIElmIHRoZSB0YXJnZXQgY2hvb3NlcyB0byBkZWNsaW5lIGFuIEFsd2F5c0lubGluZQorICAvLy8gcmVxdWVzdCBoZXJlLCBsZWdhbGl6ZSB3aWxsIHJlc29ydCB0byB1c2luZyBzaW1wbGUgbG9hZHMgYW5kIHN0b3Jlcy4KKyAgdmlydHVhbCBTRFZhbHVlIEVtaXRUYXJnZXRDb2RlRm9yTWVtY3B5KFNlbGVjdGlvbkRBRyAmREFHLCBjb25zdCBTRExvYyAmZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIENoYWluLCBTRFZhbHVlIE9wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AyLCBTRFZhbHVlIE9wMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduLCBib29sIGlzVm9sYXRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsd2F5c0lubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVQb2ludGVySW5mbyBEc3RQdHJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZVBvaW50ZXJJbmZvIFNyY1B0ckluZm8pIGNvbnN0IHsKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworICB9CisKKyAgLy8vIEVtaXQgdGFyZ2V0LXNwZWNpZmljIGNvZGUgdGhhdCBwZXJmb3JtcyBhIG1lbW1vdmUuCisgIC8vLyBUaGlzIGNhbiBiZSB1c2VkIGJ5IHRhcmdldHMgdG8gcHJvdmlkZSBjb2RlIHNlcXVlbmNlcyBmb3IgY2FzZXMKKyAgLy8vIHRoYXQgZG9uJ3QgZml0IHRoZSB0YXJnZXQncyBwYXJhbWV0ZXJzIGZvciBzaW1wbGUgbG9hZHMvc3RvcmVzIGFuZCBjYW4gYmUKKyAgLy8vIG1vcmUgZWZmaWNpZW50IHRoYW4gdXNpbmcgYSBsaWJyYXJ5IGNhbGwuIFRoaXMgZnVuY3Rpb24gY2FuIHJldHVybiBhIG51bGwKKyAgLy8vIFNEVmFsdWUgaWYgdGhlIHRhcmdldCBkZWNsaW5lcyB0byB1c2UgY3VzdG9tIGNvZGUgYW5kIGEgZGlmZmVyZW50CisgIC8vLyBsb3dlcmluZyBzdHJhdGVneSBzaG91bGQgYmUgdXNlZC4KKyAgdmlydHVhbCBTRFZhbHVlIEVtaXRUYXJnZXRDb2RlRm9yTWVtbW92ZSgKKyAgICAgIFNlbGVjdGlvbkRBRyAmREFHLCBjb25zdCBTRExvYyAmZGwsIFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgT3AxLAorICAgICAgU0RWYWx1ZSBPcDIsIFNEVmFsdWUgT3AzLCB1bnNpZ25lZCBBbGlnbiwgYm9vbCBpc1ZvbGF0aWxlLAorICAgICAgTWFjaGluZVBvaW50ZXJJbmZvIERzdFB0ckluZm8sIE1hY2hpbmVQb2ludGVySW5mbyBTcmNQdHJJbmZvKSBjb25zdCB7CisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgfQorCisgIC8vLyBFbWl0IHRhcmdldC1zcGVjaWZpYyBjb2RlIHRoYXQgcGVyZm9ybXMgYSBtZW1zZXQuCisgIC8vLyBUaGlzIGNhbiBiZSB1c2VkIGJ5IHRhcmdldHMgdG8gcHJvdmlkZSBjb2RlIHNlcXVlbmNlcyBmb3IgY2FzZXMKKyAgLy8vIHRoYXQgZG9uJ3QgZml0IHRoZSB0YXJnZXQncyBwYXJhbWV0ZXJzIGZvciBzaW1wbGUgc3RvcmVzIGFuZCBjYW4gYmUgbW9yZQorICAvLy8gZWZmaWNpZW50IHRoYW4gdXNpbmcgYSBsaWJyYXJ5IGNhbGwuIFRoaXMgZnVuY3Rpb24gY2FuIHJldHVybiBhIG51bGwKKyAgLy8vIFNEVmFsdWUgaWYgdGhlIHRhcmdldCBkZWNsaW5lcyB0byB1c2UgY3VzdG9tIGNvZGUgYW5kIGEgZGlmZmVyZW50CisgIC8vLyBsb3dlcmluZyBzdHJhdGVneSBzaG91bGQgYmUgdXNlZC4KKyAgdmlydHVhbCBTRFZhbHVlIEVtaXRUYXJnZXRDb2RlRm9yTWVtc2V0KFNlbGVjdGlvbkRBRyAmREFHLCBjb25zdCBTRExvYyAmZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIENoYWluLCBTRFZhbHVlIE9wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AyLCBTRFZhbHVlIE9wMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduLCBib29sIGlzVm9sYXRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUG9pbnRlckluZm8gRHN0UHRySW5mbykgY29uc3QgeworICAgIHJldHVybiBTRFZhbHVlKCk7CisgIH0KKworICAvLy8gRW1pdCB0YXJnZXQtc3BlY2lmaWMgY29kZSB0aGF0IHBlcmZvcm1zIGEgbWVtY21wLCBpbiBjYXNlcyB3aGVyZSB0aGF0IGlzCisgIC8vLyBmYXN0ZXIgdGhhbiBhIGxpYmNhbGwuIFRoZSBmaXJzdCByZXR1cm5lZCBTRFZhbHVlIGlzIHRoZSByZXN1bHQgb2YgdGhlCisgIC8vLyBtZW1jbXAgYW5kIHRoZSBzZWNvbmQgaXMgdGhlIGNoYWluLiBCb3RoIFNEVmFsdWVzIGNhbiBiZSBudWxsIGlmIGEgbm9ybWFsCisgIC8vLyBsaWJjYWxsIHNob3VsZCBiZSB1c2VkLgorICB2aXJ0dWFsIHN0ZDo6cGFpcjxTRFZhbHVlLCBTRFZhbHVlPgorICBFbWl0VGFyZ2V0Q29kZUZvck1lbWNtcChTZWxlY3Rpb25EQUcgJkRBRywgY29uc3QgU0RMb2MgJmRsLCBTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIsIFNEVmFsdWUgT3AzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUG9pbnRlckluZm8gT3AxUHRySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZVBvaW50ZXJJbmZvIE9wMlB0ckluZm8pIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoU0RWYWx1ZSgpLCBTRFZhbHVlKCkpOworICB9CisKKyAgLy8vIEVtaXQgdGFyZ2V0LXNwZWNpZmljIGNvZGUgdGhhdCBwZXJmb3JtcyBhIG1lbWNociwgaW4gY2FzZXMgd2hlcmUgdGhhdCBpcworICAvLy8gZmFzdGVyIHRoYW4gYSBsaWJjYWxsLiBUaGUgZmlyc3QgcmV0dXJuZWQgU0RWYWx1ZSBpcyB0aGUgcmVzdWx0IG9mIHRoZQorICAvLy8gbWVtY2hyIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBjaGFpbi4gQm90aCBTRFZhbHVlcyBjYW4gYmUgbnVsbCBpZiBhIG5vcm1hbAorICAvLy8gbGliY2FsbCBzaG91bGQgYmUgdXNlZC4KKyAgdmlydHVhbCBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4KKyAgRW1pdFRhcmdldENvZGVGb3JNZW1jaHIoU2VsZWN0aW9uREFHICZEQUcsIGNvbnN0IFNETG9jICZkbCwgU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBTcmMsIFNEVmFsdWUgQ2hhciwgU0RWYWx1ZSBMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVQb2ludGVySW5mbyBTcmNQdHJJbmZvKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFNEVmFsdWUoKSwgU0RWYWx1ZSgpKTsKKyAgfQorCisgIC8vLyBFbWl0IHRhcmdldC1zcGVjaWZpYyBjb2RlIHRoYXQgcGVyZm9ybXMgYSBzdHJjcHkgb3Igc3RwY3B5LCBpbiBjYXNlcworICAvLy8gd2hlcmUgdGhhdCBpcyBmYXN0ZXIgdGhhbiBhIGxpYmNhbGwuCisgIC8vLyBUaGUgZmlyc3QgcmV0dXJuZWQgU0RWYWx1ZSBpcyB0aGUgcmVzdWx0IG9mIHRoZSBjb3B5ICh0aGUgc3RhcnQKKyAgLy8vIG9mIHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcgZm9yIHN0cmNweSwgYSBwb2ludGVyIHRvIHRoZSBudWxsIHRlcm1pbmF0b3IKKyAgLy8vIGZvciBzdHBjcHkpIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBjaGFpbi4gIEJvdGggU0RWYWx1ZXMgY2FuIGJlIG51bGwKKyAgLy8vIGlmIGEgbm9ybWFsIGxpYmNhbGwgc2hvdWxkIGJlIHVzZWQuCisgIHZpcnR1YWwgc3RkOjpwYWlyPFNEVmFsdWUsIFNEVmFsdWU+CisgIEVtaXRUYXJnZXRDb2RlRm9yU3RyY3B5KFNlbGVjdGlvbkRBRyAmREFHLCBjb25zdCBTRExvYyAmREwsIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgRGVzdCwgU0RWYWx1ZSBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVQb2ludGVySW5mbyBEZXN0UHRySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZVBvaW50ZXJJbmZvIFNyY1B0ckluZm8sIGJvb2wgaXNTdHBjcHkpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoU0RWYWx1ZSgpLCBTRFZhbHVlKCkpOworICB9CisKKyAgLy8vIEVtaXQgdGFyZ2V0LXNwZWNpZmljIGNvZGUgdGhhdCBwZXJmb3JtcyBhIHN0cmNtcCwgaW4gY2FzZXMgd2hlcmUgdGhhdCBpcworICAvLy8gZmFzdGVyIHRoYW4gYSBsaWJjYWxsLgorICAvLy8gVGhlIGZpcnN0IHJldHVybmVkIFNEVmFsdWUgaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3RyY21wIGFuZCB0aGUgc2Vjb25kIGlzCisgIC8vLyB0aGUgY2hhaW4uIEJvdGggU0RWYWx1ZXMgY2FuIGJlIG51bGwgaWYgYSBub3JtYWwgbGliY2FsbCBzaG91bGQgYmUgdXNlZC4KKyAgdmlydHVhbCBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4KKyAgRW1pdFRhcmdldENvZGVGb3JTdHJjbXAoU2VsZWN0aW9uREFHICZEQUcsIGNvbnN0IFNETG9jICZkbCwgU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUG9pbnRlckluZm8gT3AxUHRySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZVBvaW50ZXJJbmZvIE9wMlB0ckluZm8pIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoU0RWYWx1ZSgpLCBTRFZhbHVlKCkpOworICB9CisKKyAgdmlydHVhbCBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4KKyAgRW1pdFRhcmdldENvZGVGb3JTdHJsZW4oU2VsZWN0aW9uREFHICZEQUcsIGNvbnN0IFNETG9jICZETCwgU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBTcmMsIE1hY2hpbmVQb2ludGVySW5mbyBTcmNQdHJJbmZvKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFNEVmFsdWUoKSwgU0RWYWx1ZSgpKTsKKyAgfQorCisgIHZpcnR1YWwgc3RkOjpwYWlyPFNEVmFsdWUsIFNEVmFsdWU+CisgIEVtaXRUYXJnZXRDb2RlRm9yU3RybmxlbihTZWxlY3Rpb25EQUcgJkRBRywgY29uc3QgU0RMb2MgJkRMLCBTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBTcmMsIFNEVmFsdWUgTWF4TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZVBvaW50ZXJJbmZvIFNyY1B0ckluZm8pIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoU0RWYWx1ZSgpLCBTRFZhbHVlKCkpOworICB9CisKKyAgLy8gUmV0dXJuIHRydWUgd2hlbiB0aGUgZGVjaXNpb24gdG8gZ2VuZXJhdGUgRk1BJ3MgKG9yIEZNUywgRk1MQSBldGMpIHJhdGhlcgorICAvLyB0aGFuIEZNVUwgYW5kIEFERCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIG1hY2hpbmUgY29tYmluZXIuCisgIHZpcnR1YWwgYm9vbCBnZW5lcmF0ZUZNQXNJbk1hY2hpbmVDb21iaW5lcihDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9TRUxFQ1RJT05EQUdUQVJHRVRJTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TbG90SW5kZXhlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1Nsb3RJbmRleGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5MWUzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TbG90SW5kZXhlcy5oCkBAIC0wLDAgKzEsNzE0IEBACisvLz09PS0gbGx2bS9Db2RlR2VuL1Nsb3RJbmRleGVzLmggLSBTbG90IGluZGV4ZXMgcmVwcmVzZW50YXRpb24gLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIFNsb3RJbmRleCBhbmQgcmVsYXRlZCBjbGFzc2VzLiBUaGUgcHVycG9zZSBvZiBTbG90SW5kZXgKKy8vIGlzIHRvIGRlc2NyaWJlIGEgcG9zaXRpb24gYXQgd2hpY2ggYSByZWdpc3RlciBjYW4gYmVjb21lIGxpdmUsIG9yIGNlYXNlIHRvCisvLyBiZSBsaXZlLgorLy8KKy8vIFNsb3RJbmRleCBpcyBtb3N0bHkgYSBwcm94eSBmb3IgZW50cmllcyBvZiB0aGUgU2xvdEluZGV4TGlzdCwgYSBjbGFzcyB3aGljaAorLy8gaXMgaGVsZCBpcyBMaXZlSW50ZXJ2YWxzIGFuZCBwcm92aWRlcyB0aGUgcmVhbCBudW1iZXJpbmcuIFRoaXMgYWxsb3dzCisvLyBMaXZlSW50ZXJ2YWxzIHRvIHBlcmZvcm0gbGFyZ2VseSB0cmFuc3BhcmVudCByZW51bWJlcmluZy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1NMT1RJTkRFWEVTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NMT1RJTkRFWEVTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW50ZXJ2YWxNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1bmRsZS5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCisgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZW50cnkgaW4gdGhlIHNsb3QgaW5kZXggbGlzdCBoZWxkIGluIHRoZQorICAvLy8gU2xvdEluZGV4ZXMgcGFzcy4gSXQgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LiBTZWUgdGhlCisgIC8vLyBTbG90SW5kZXggJiBTbG90SW5kZXhlcyBjbGFzc2VzIGZvciB0aGUgcHVibGljIGludGVyZmFjZSB0byB0aGlzCisgIC8vLyBpbmZvcm1hdGlvbi4KKyAgY2xhc3MgSW5kZXhMaXN0RW50cnkgOiBwdWJsaWMgaWxpc3Rfbm9kZTxJbmRleExpc3RFbnRyeT4geworICAgIE1hY2hpbmVJbnN0ciAqbWk7CisgICAgdW5zaWduZWQgaW5kZXg7CisKKyAgcHVibGljOgorICAgIEluZGV4TGlzdEVudHJ5KE1hY2hpbmVJbnN0ciAqbWksIHVuc2lnbmVkIGluZGV4KSA6IG1pKG1pKSwgaW5kZXgoaW5kZXgpIHt9CisKKyAgICBNYWNoaW5lSW5zdHIqIGdldEluc3RyKCkgY29uc3QgeyByZXR1cm4gbWk7IH0KKyAgICB2b2lkIHNldEluc3RyKE1hY2hpbmVJbnN0ciAqbWkpIHsKKyAgICAgIHRoaXMtPm1pID0gbWk7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0SW5kZXgoKSBjb25zdCB7IHJldHVybiBpbmRleDsgfQorICAgIHZvaWQgc2V0SW5kZXgodW5zaWduZWQgaW5kZXgpIHsKKyAgICAgIHRoaXMtPmluZGV4ID0gaW5kZXg7CisgICAgfQorCisjaWZkZWYgRVhQRU5TSVZFX0NIRUNLUworICAgIC8vIFdoZW4gRVhQRU5TSVZFX0NIRUNLUyBpcyBkZWZpbmVkLCAiZXJhc2VkIiBpbmRleCBsaXN0IGVudHJpZXMgd2lsbAorICAgIC8vIGFjdHVhbGx5IGJlIG1vdmVkIHRvIGEgImdyYXZleWFyZCIgbGlzdCwgYW5kIGhhdmUgdGhlaXIgcG9pbnRlcnMKKyAgICAvLyBwb2lzb25lZCwgc28gdGhhdCBkYW5nbGluZyBTbG90SW5kZXggYWNjZXNzIGNhbiBiZSByZWxpYWJseSBkZXRlY3RlZC4KKyAgICB2b2lkIHNldFBvaXNvbigpIHsKKyAgICAgIGludHB0cl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KG1pKTsKKyAgICAgIGFzc2VydCgoKHRtcCAmIDB4MSkgPT0gMHgwKSAmJiAiUG9pbnRlciBhbHJlYWR5IHBvaXNvbmVkPyIpOworICAgICAgdG1wIHw9IDB4MTsKKyAgICAgIG1pID0gcmVpbnRlcnByZXRfY2FzdDxNYWNoaW5lSW5zdHIqPih0bXApOworICAgIH0KKworICAgIGJvb2wgaXNQb2lzb25lZCgpIGNvbnN0IHsgcmV0dXJuIChyZWludGVycHJldF9jYXN0PGludHB0cl90PihtaSkgJiAweDEpID09IDB4MTsgfQorI2VuZGlmIC8vIEVYUEVOU0lWRV9DSEVDS1MKKyAgfTsKKworICB0ZW1wbGF0ZSA8PgorICBzdHJ1Y3QgaWxpc3RfYWxsb2NfdHJhaXRzPEluZGV4TGlzdEVudHJ5PgorICAgICAgOiBwdWJsaWMgaWxpc3Rfbm9hbGxvY190cmFpdHM8SW5kZXhMaXN0RW50cnk+IHt9OworCisgIC8vLyBTbG90SW5kZXggLSBBbiBvcGFxdWUgd3JhcHBlciBhcm91bmQgbWFjaGluZSBpbmRleGVzLgorICBjbGFzcyBTbG90SW5kZXggeworICAgIGZyaWVuZCBjbGFzcyBTbG90SW5kZXhlczsKKworICAgIGVudW0gU2xvdCB7CisgICAgICAvLy8gQmFzaWMgYmxvY2sgYm91bmRhcnkuICBVc2VkIGZvciBsaXZlIHJhbmdlcyBlbnRlcmluZyBhbmQgbGVhdmluZyBhCisgICAgICAvLy8gYmxvY2sgd2l0aG91dCBiZWluZyBsaXZlIGluIHRoZSBsYXlvdXQgbmVpZ2hib3IuICBBbHNvIHVzZWQgYXMgdGhlCisgICAgICAvLy8gZGVmIHNsb3Qgb2YgUEhJLWRlZnMuCisgICAgICBTbG90X0Jsb2NrLAorCisgICAgICAvLy8gRWFybHktY2xvYmJlciByZWdpc3RlciB1c2UvZGVmIHNsb3QuICBBIGxpdmUgcmFuZ2UgZGVmaW5lZCBhdAorICAgICAgLy8vIFNsb3RfRWFybHlDbG9iYmVyIGludGVyZmVyZXMgd2l0aCBub3JtYWwgbGl2ZSByYW5nZXMga2lsbGVkIGF0CisgICAgICAvLy8gU2xvdF9SZWdpc3Rlci4gIEFsc28gdXNlZCBhcyB0aGUga2lsbCBzbG90IGZvciBsaXZlIHJhbmdlcyB0aWVkIHRvIGFuCisgICAgICAvLy8gZWFybHktY2xvYmJlciBkZWYuCisgICAgICBTbG90X0Vhcmx5Q2xvYmJlciwKKworICAgICAgLy8vIE5vcm1hbCByZWdpc3RlciB1c2UvZGVmIHNsb3QuICBOb3JtYWwgaW5zdHJ1Y3Rpb25zIGtpbGwgYW5kIGRlZmluZQorICAgICAgLy8vIHJlZ2lzdGVyIGxpdmUgcmFuZ2VzIGF0IHRoaXMgc2xvdC4KKyAgICAgIFNsb3RfUmVnaXN0ZXIsCisKKyAgICAgIC8vLyBEZWFkIGRlZiBraWxsIHBvaW50LiAgS2lsbCBzbG90IGZvciBhIGxpdmUgcmFuZ2UgdGhhdCBpcyBkZWZpbmVkIGJ5CisgICAgICAvLy8gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gKFNsb3RfUmVnaXN0ZXIgb3IgU2xvdF9FYXJseUNsb2JiZXIpLCBidXQgaXNuJ3QKKyAgICAgIC8vLyB1c2VkIGFueXdoZXJlLgorICAgICAgU2xvdF9EZWFkLAorCisgICAgICBTbG90X0NvdW50CisgICAgfTsKKworICAgIFBvaW50ZXJJbnRQYWlyPEluZGV4TGlzdEVudHJ5KiwgMiwgdW5zaWduZWQ+IGxpZTsKKworICAgIFNsb3RJbmRleChJbmRleExpc3RFbnRyeSAqZW50cnksIHVuc2lnbmVkIHNsb3QpCisgICAgICA6IGxpZShlbnRyeSwgc2xvdCkge30KKworICAgIEluZGV4TGlzdEVudHJ5KiBsaXN0RW50cnkoKSBjb25zdCB7CisgICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJBdHRlbXB0IHRvIGNvbXBhcmUgcmVzZXJ2ZWQgaW5kZXguIik7CisjaWZkZWYgRVhQRU5TSVZFX0NIRUNLUworICAgICAgYXNzZXJ0KCFsaWUuZ2V0UG9pbnRlcigpLT5pc1BvaXNvbmVkKCkgJiYKKyAgICAgICAgICAgICAiQXR0ZW1wdCB0byBhY2Nlc3MgZGVsZXRlZCBsaXN0LWVudHJ5LiIpOworI2VuZGlmIC8vIEVYUEVOU0lWRV9DSEVDS1MKKyAgICAgIHJldHVybiBsaWUuZ2V0UG9pbnRlcigpOworICAgIH0KKworICAgIHVuc2lnbmVkIGdldEluZGV4KCkgY29uc3QgeworICAgICAgcmV0dXJuIGxpc3RFbnRyeSgpLT5nZXRJbmRleCgpIHwgZ2V0U2xvdCgpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBzbG90IGZvciB0aGlzIFNsb3RJbmRleC4KKyAgICBTbG90IGdldFNsb3QoKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U2xvdD4obGllLmdldEludCgpKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGVudW0geworICAgICAgLy8vIFRoZSBkZWZhdWx0IGRpc3RhbmNlIGJldHdlZW4gaW5zdHJ1Y3Rpb25zIGFzIHJldHVybmVkIGJ5IGRpc3RhbmNlKCkuCisgICAgICAvLy8gVGhpcyBtYXkgdmFyeSBhcyBpbnN0cnVjdGlvbnMgYXJlIGluc2VydGVkIGFuZCByZW1vdmVkLgorICAgICAgSW5zdHJEaXN0ID0gNCAqIFNsb3RfQ291bnQKKyAgICB9OworCisgICAgLy8vIENvbnN0cnVjdCBhbiBpbnZhbGlkIGluZGV4LgorICAgIFNsb3RJbmRleCgpID0gZGVmYXVsdDsKKworICAgIC8vIENvbnN0cnVjdCBhIG5ldyBzbG90IGluZGV4IGZyb20gdGhlIGdpdmVuIG9uZSwgYW5kIHNldCB0aGUgc2xvdC4KKyAgICBTbG90SW5kZXgoY29uc3QgU2xvdEluZGV4ICZsaSwgU2xvdCBzKSA6IGxpZShsaS5saXN0RW50cnkoKSwgdW5zaWduZWQocykpIHsKKyAgICAgIGFzc2VydChsaWUuZ2V0UG9pbnRlcigpICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgICAiQXR0ZW1wdCB0byBjb25zdHJ1Y3QgaW5kZXggd2l0aCAwIHBvaW50ZXIuIik7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgdmFsaWQgaW5kZXguIEludmFsaWQgaW5kaWNlcyBkbworICAgIC8vLyBub3QgcG9pbnQgaW50byBhbiBpbmRleCB0YWJsZSwgYW5kIGNhbm5vdCBiZSBjb21wYXJlZC4KKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICByZXR1cm4gbGllLmdldFBvaW50ZXIoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgZm9yIGEgdmFsaWQgaW5kZXguCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGlzVmFsaWQoKTsgfQorCisgICAgLy8vIFByaW50IHRoaXMgaW5kZXggdG8gdGhlIGdpdmVuIHJhd19vc3RyZWFtLgorICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKworICAgIC8vLyBEdW1wIHRoaXMgaW5kZXggdG8gc3RkZXJyLgorICAgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgICAgLy8vIENvbXBhcmUgdHdvIFNsb3RJbmRleCBvYmplY3RzIGZvciBlcXVhbGl0eS4KKyAgICBib29sIG9wZXJhdG9yPT0oU2xvdEluZGV4IG90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gbGllID09IG90aGVyLmxpZTsKKyAgICB9CisgICAgLy8vIENvbXBhcmUgdHdvIFNsb3RJbmRleCBvYmplY3RzIGZvciBpbmVxdWFsaXR5LgorICAgIGJvb2wgb3BlcmF0b3IhPShTbG90SW5kZXggb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBsaWUgIT0gb3RoZXIubGllOworICAgIH0KKworICAgIC8vLyBDb21wYXJlIHR3byBTbG90SW5kZXggb2JqZWN0cy4gUmV0dXJuIHRydWUgaWYgdGhlIGZpcnN0IGluZGV4CisgICAgLy8vIGlzIHN0cmljdGx5IGxvd2VyIHRoYW4gdGhlIHNlY29uZC4KKyAgICBib29sIG9wZXJhdG9yPChTbG90SW5kZXggb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRJbmRleCgpIDwgb3RoZXIuZ2V0SW5kZXgoKTsKKyAgICB9CisgICAgLy8vIENvbXBhcmUgdHdvIFNsb3RJbmRleCBvYmplY3RzLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlyc3QgaW5kZXgKKyAgICAvLy8gaXMgbG93ZXIgdGhhbiwgb3IgZXF1YWwgdG8sIHRoZSBzZWNvbmQuCisgICAgYm9vbCBvcGVyYXRvcjw9KFNsb3RJbmRleCBvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIGdldEluZGV4KCkgPD0gb3RoZXIuZ2V0SW5kZXgoKTsKKyAgICB9CisKKyAgICAvLy8gQ29tcGFyZSB0d28gU2xvdEluZGV4IG9iamVjdHMuIFJldHVybiB0cnVlIGlmIHRoZSBmaXJzdCBpbmRleAorICAgIC8vLyBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZC4KKyAgICBib29sIG9wZXJhdG9yPihTbG90SW5kZXggb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRJbmRleCgpID4gb3RoZXIuZ2V0SW5kZXgoKTsKKyAgICB9CisKKyAgICAvLy8gQ29tcGFyZSB0d28gU2xvdEluZGV4IG9iamVjdHMuIFJldHVybiB0cnVlIGlmIHRoZSBmaXJzdCBpbmRleAorICAgIC8vLyBpcyBncmVhdGVyIHRoYW4sIG9yIGVxdWFsIHRvLCB0aGUgc2Vjb25kLgorICAgIGJvb2wgb3BlcmF0b3I+PShTbG90SW5kZXggb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRJbmRleCgpID49IG90aGVyLmdldEluZGV4KCk7CisgICAgfQorCisgICAgLy8vIGlzU2FtZUluc3RyIC0gUmV0dXJuIHRydWUgaWYgQSBhbmQgQiByZWZlciB0byB0aGUgc2FtZSBpbnN0cnVjdGlvbi4KKyAgICBzdGF0aWMgYm9vbCBpc1NhbWVJbnN0cihTbG90SW5kZXggQSwgU2xvdEluZGV4IEIpIHsKKyAgICAgIHJldHVybiBBLmxpZS5nZXRQb2ludGVyKCkgPT0gQi5saWUuZ2V0UG9pbnRlcigpOworICAgIH0KKworICAgIC8vLyBpc0VhcmxpZXJJbnN0ciAtIFJldHVybiB0cnVlIGlmIEEgcmVmZXJzIHRvIGFuIGluc3RydWN0aW9uIGVhcmxpZXIgdGhhbgorICAgIC8vLyBCLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gQSA8IEIgJiYgIWlzU2FtZUluc3RyKEEsIEIpLgorICAgIHN0YXRpYyBib29sIGlzRWFybGllckluc3RyKFNsb3RJbmRleCBBLCBTbG90SW5kZXggQikgeworICAgICAgcmV0dXJuIEEubGlzdEVudHJ5KCktPmdldEluZGV4KCkgPCBCLmxpc3RFbnRyeSgpLT5nZXRJbmRleCgpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBBIHJlZmVycyB0byB0aGUgc2FtZSBpbnN0cnVjdGlvbiBhcyBCIG9yIGFuIGVhcmxpZXIgb25lLgorICAgIC8vLyBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gIWlzRWFybGllckluc3RyKEIsIEEpLgorICAgIHN0YXRpYyBib29sIGlzRWFybGllckVxdWFsSW5zdHIoU2xvdEluZGV4IEEsIFNsb3RJbmRleCBCKSB7CisgICAgICByZXR1cm4gIWlzRWFybGllckluc3RyKEIsIEEpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIGRpc3RhbmNlIGZyb20gdGhpcyBpbmRleCB0byB0aGUgZ2l2ZW4gb25lLgorICAgIGludCBkaXN0YW5jZShTbG90SW5kZXggb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBvdGhlci5nZXRJbmRleCgpIC0gZ2V0SW5kZXgoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSBzY2FsZWQgZGlzdGFuY2UgZnJvbSB0aGlzIGluZGV4IHRvIHRoZSBnaXZlbiBvbmUsIHdoZXJlIGFsbAorICAgIC8vLyBzbG90cyBvbiB0aGUgc2FtZSBpbnN0cnVjdGlvbiBoYXZlIHplcm8gZGlzdGFuY2UuCisgICAgaW50IGdldEluc3RyRGlzdGFuY2UoU2xvdEluZGV4IG90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gKG90aGVyLmxpc3RFbnRyeSgpLT5nZXRJbmRleCgpIC0gbGlzdEVudHJ5KCktPmdldEluZGV4KCkpCisgICAgICAgIC8gU2xvdF9Db3VudDsKKyAgICB9CisKKyAgICAvLy8gaXNCbG9jayAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgYmxvY2sgYm91bmRhcnkgc2xvdC4KKyAgICBib29sIGlzQmxvY2soKSBjb25zdCB7IHJldHVybiBnZXRTbG90KCkgPT0gU2xvdF9CbG9jazsgfQorCisgICAgLy8vIGlzRWFybHlDbG9iYmVyIC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYW4gZWFybHktY2xvYmJlciBzbG90LgorICAgIGJvb2wgaXNFYXJseUNsb2JiZXIoKSBjb25zdCB7IHJldHVybiBnZXRTbG90KCkgPT0gU2xvdF9FYXJseUNsb2JiZXI7IH0KKworICAgIC8vLyBpc1JlZ2lzdGVyIC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBub3JtYWwgcmVnaXN0ZXIgdXNlL2RlZiBzbG90LgorICAgIC8vLyBOb3RlIHRoYXQgZWFybHktY2xvYmJlciBzbG90cyBtYXkgYWxzbyBiZSB1c2VkIGZvciB1c2VzIGFuZCBkZWZzLgorICAgIGJvb2wgaXNSZWdpc3RlcigpIGNvbnN0IHsgcmV0dXJuIGdldFNsb3QoKSA9PSBTbG90X1JlZ2lzdGVyOyB9CisKKyAgICAvLy8gaXNEZWFkIC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBkZWFkIGRlZiBraWxsIHNsb3QuCisgICAgYm9vbCBpc0RlYWQoKSBjb25zdCB7IHJldHVybiBnZXRTbG90KCkgPT0gU2xvdF9EZWFkOyB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgYmFzZSBpbmRleCBmb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5kZXguIFRoZSBiYXNlIGluZGV4CisgICAgLy8vIGlzIHRoZSBvbmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBTbG90X0Jsb2NrIHNsb3QgZm9yIHRoZSBpbnN0cnVjdGlvbgorICAgIC8vLyBwb2ludGVkIHRvIGJ5IHRoaXMgaW5kZXguCisgICAgU2xvdEluZGV4IGdldEJhc2VJbmRleCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTbG90SW5kZXgobGlzdEVudHJ5KCksIFNsb3RfQmxvY2spOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBib3VuZGFyeSBpbmRleCBmb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5kZXguIFRoZSBib3VuZGFyeQorICAgIC8vLyBpbmRleCBpcyB0aGUgb25lIGFzc29jaWF0ZWQgd2l0aCB0aGUgU2xvdF9CbG9jayBzbG90IGZvciB0aGUgaW5zdHJ1Y3Rpb24KKyAgICAvLy8gcG9pbnRlZCB0byBieSB0aGlzIGluZGV4LgorICAgIFNsb3RJbmRleCBnZXRCb3VuZGFyeUluZGV4KCkgY29uc3QgeworICAgICAgcmV0dXJuIFNsb3RJbmRleChsaXN0RW50cnkoKSwgU2xvdF9EZWFkKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgcmVnaXN0ZXIgdXNlL2RlZiBzbG90IGluIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIGZvciBhCisgICAgLy8vIG5vcm1hbCBvciBlYXJseS1jbG9iYmVyIGRlZi4KKyAgICBTbG90SW5kZXggZ2V0UmVnU2xvdChib29sIEVDID0gZmFsc2UpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTbG90SW5kZXgobGlzdEVudHJ5KCksIEVDID8gU2xvdF9FYXJseUNsb2JiZXIgOiBTbG90X1JlZ2lzdGVyKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgZGVhZCBkZWYga2lsbCBzbG90IGZvciB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4KKyAgICBTbG90SW5kZXggZ2V0RGVhZFNsb3QoKSBjb25zdCB7CisgICAgICByZXR1cm4gU2xvdEluZGV4KGxpc3RFbnRyeSgpLCBTbG90X0RlYWQpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBuZXh0IHNsb3QgaW4gdGhlIGluZGV4IGxpc3QuIFRoaXMgY291bGQgYmUgZWl0aGVyIHRoZQorICAgIC8vLyBuZXh0IHNsb3QgZm9yIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVkIHRvIGJ5IHRoaXMgaW5kZXggb3IsIGlmIHRoaXMKKyAgICAvLy8gaW5kZXggaXMgYSBTVE9SRSwgdGhlIGZpcnN0IHNsb3QgZm9yIHRoZSBuZXh0IGluc3RydWN0aW9uLgorICAgIC8vLyBXQVJOSU5HOiBUaGlzIG1ldGhvZCBpcyBjb25zaWRlcmFibHkgbW9yZSBleHBlbnNpdmUgdGhhbiB0aGUgbWV0aG9kcworICAgIC8vLyB0aGF0IHJldHVybiBzcGVjaWZpYyBzbG90cyAoZ2V0VXNlSW5kZXgoKSwgZXRjKS4gSWYgeW91IGNhbiAtIHBsZWFzZQorICAgIC8vLyB1c2Ugb25lIG9mIHRob3NlIG1ldGhvZHMuCisgICAgU2xvdEluZGV4IGdldE5leHRTbG90KCkgY29uc3QgeworICAgICAgU2xvdCBzID0gZ2V0U2xvdCgpOworICAgICAgaWYgKHMgPT0gU2xvdF9EZWFkKSB7CisgICAgICAgIHJldHVybiBTbG90SW5kZXgoJiorK2xpc3RFbnRyeSgpLT5nZXRJdGVyYXRvcigpLCBTbG90X0Jsb2NrKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBTbG90SW5kZXgobGlzdEVudHJ5KCksIHMgKyAxKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgbmV4dCBpbmRleC4gVGhpcyBpcyB0aGUgaW5kZXggY29ycmVzcG9uZGluZyB0byB0aGUgdGhpcworICAgIC8vLyBpbmRleCdzIHNsb3QsIGJ1dCBmb3IgdGhlIG5leHQgaW5zdHJ1Y3Rpb24uCisgICAgU2xvdEluZGV4IGdldE5leHRJbmRleCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTbG90SW5kZXgoJiorK2xpc3RFbnRyeSgpLT5nZXRJdGVyYXRvcigpLCBnZXRTbG90KCkpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBwcmV2aW91cyBzbG90IGluIHRoZSBpbmRleCBsaXN0LiBUaGlzIGNvdWxkIGJlIGVpdGhlciB0aGUKKyAgICAvLy8gcHJldmlvdXMgc2xvdCBmb3IgdGhlIGluc3RydWN0aW9uIHBvaW50ZWQgdG8gYnkgdGhpcyBpbmRleCBvciwgaWYgdGhpcworICAgIC8vLyBpbmRleCBpcyBhIFNsb3RfQmxvY2ssIHRoZSBsYXN0IHNsb3QgZm9yIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4KKyAgICAvLy8gV0FSTklORzogVGhpcyBtZXRob2QgaXMgY29uc2lkZXJhYmx5IG1vcmUgZXhwZW5zaXZlIHRoYW4gdGhlIG1ldGhvZHMKKyAgICAvLy8gdGhhdCByZXR1cm4gc3BlY2lmaWMgc2xvdHMgKGdldFVzZUluZGV4KCksIGV0YykuIElmIHlvdSBjYW4gLSBwbGVhc2UKKyAgICAvLy8gdXNlIG9uZSBvZiB0aG9zZSBtZXRob2RzLgorICAgIFNsb3RJbmRleCBnZXRQcmV2U2xvdCgpIGNvbnN0IHsKKyAgICAgIFNsb3QgcyA9IGdldFNsb3QoKTsKKyAgICAgIGlmIChzID09IFNsb3RfQmxvY2spIHsKKyAgICAgICAgcmV0dXJuIFNsb3RJbmRleCgmKi0tbGlzdEVudHJ5KCktPmdldEl0ZXJhdG9yKCksIFNsb3RfRGVhZCk7CisgICAgICB9CisgICAgICByZXR1cm4gU2xvdEluZGV4KGxpc3RFbnRyeSgpLCBzIC0gMSk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIHByZXZpb3VzIGluZGV4LiBUaGlzIGlzIHRoZSBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHRoaXMKKyAgICAvLy8gaW5kZXgncyBzbG90LCBidXQgZm9yIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4KKyAgICBTbG90SW5kZXggZ2V0UHJldkluZGV4KCkgY29uc3QgeworICAgICAgcmV0dXJuIFNsb3RJbmRleCgmKi0tbGlzdEVudHJ5KCktPmdldEl0ZXJhdG9yKCksIGdldFNsb3QoKSk7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1BvZExpa2U8U2xvdEluZGV4PiB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICBpbmxpbmUgcmF3X29zdHJlYW0mIG9wZXJhdG9yPDwocmF3X29zdHJlYW0gJm9zLCBTbG90SW5kZXggbGkpIHsKKyAgICBsaS5wcmludChvcyk7CisgICAgcmV0dXJuIG9zOworICB9CisKKyAgdXNpbmcgSWR4TUJCUGFpciA9IHN0ZDo6cGFpcjxTbG90SW5kZXgsIE1hY2hpbmVCYXNpY0Jsb2NrICo+OworCisgIGlubGluZSBib29sIG9wZXJhdG9yPChTbG90SW5kZXggViwgY29uc3QgSWR4TUJCUGFpciAmSU0pIHsKKyAgICByZXR1cm4gViA8IElNLmZpcnN0OworICB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IElkeE1CQlBhaXIgJklNLCBTbG90SW5kZXggVikgeworICAgIHJldHVybiBJTS5maXJzdCA8IFY7CisgIH0KKworICBzdHJ1Y3QgSWR4Mk1CQkNvbXBhcmUgeworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBJZHhNQkJQYWlyICZMSFMsIGNvbnN0IElkeE1CQlBhaXIgJlJIUykgY29uc3QgeworICAgICAgcmV0dXJuIExIUy5maXJzdCA8IFJIUy5maXJzdDsKKyAgICB9CisgIH07CisKKyAgLy8vIFNsb3RJbmRleGVzIHBhc3MuCisgIC8vLworICAvLy8gVGhpcyBwYXNzIGFzc2lnbnMgaW5kZXhlcyB0byBlYWNoIGluc3RydWN0aW9uLgorICBjbGFzcyBTbG90SW5kZXhlcyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgcHJpdmF0ZToKKyAgICAvLyBJbmRleExpc3RFbnRyeSBhbGxvY2F0b3IuCisgICAgQnVtcFB0ckFsbG9jYXRvciBpbGVBbGxvY2F0b3I7CisKKyAgICB1c2luZyBJbmRleExpc3QgPSBpbGlzdDxJbmRleExpc3RFbnRyeT47CisgICAgSW5kZXhMaXN0IGluZGV4TGlzdDsKKworI2lmZGVmIEVYUEVOU0lWRV9DSEVDS1MKKyAgICBJbmRleExpc3QgZ3JhdmV5YXJkTGlzdDsKKyNlbmRpZiAvLyBFWFBFTlNJVkVfQ0hFQ0tTCisKKyAgICBNYWNoaW5lRnVuY3Rpb24gKm1mOworCisgICAgdXNpbmcgTWkySW5kZXhNYXAgPSBEZW5zZU1hcDxjb25zdCBNYWNoaW5lSW5zdHIgKiwgU2xvdEluZGV4PjsKKyAgICBNaTJJbmRleE1hcCBtaTJpTWFwOworCisgICAgLy8vIE1CQlJhbmdlcyAtIE1hcCBNQkIgbnVtYmVyIHRvIChzdGFydCwgc3RvcCkgaW5kZXhlcy4KKyAgICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8U2xvdEluZGV4LCBTbG90SW5kZXg+LCA4PiBNQkJSYW5nZXM7CisKKyAgICAvLy8gSWR4Mk1CQk1hcCAtIFNvcnRlZCBsaXN0IG9mIHBhaXJzIG9mIGluZGV4IG9mIGZpcnN0IGluc3RydWN0aW9uCisgICAgLy8vIGFuZCBNQkIgaWQuCisgICAgU21hbGxWZWN0b3I8SWR4TUJCUGFpciwgOD4gaWR4Mk1CQk1hcDsKKworICAgIEluZGV4TGlzdEVudHJ5KiBjcmVhdGVFbnRyeShNYWNoaW5lSW5zdHIgKm1pLCB1bnNpZ25lZCBpbmRleCkgeworICAgICAgSW5kZXhMaXN0RW50cnkgKmVudHJ5ID0KKyAgICAgICAgICBzdGF0aWNfY2FzdDxJbmRleExpc3RFbnRyeSAqPihpbGVBbGxvY2F0b3IuQWxsb2NhdGUoCisgICAgICAgICAgICAgIHNpemVvZihJbmRleExpc3RFbnRyeSksIGFsaWdub2YoSW5kZXhMaXN0RW50cnkpKSk7CisKKyAgICAgIG5ldyAoZW50cnkpIEluZGV4TGlzdEVudHJ5KG1pLCBpbmRleCk7CisKKyAgICAgIHJldHVybiBlbnRyeTsKKyAgICB9CisKKyAgICAvLy8gUmVudW1iZXIgbG9jYWxseSBhZnRlciBpbnNlcnRpbmcgY3VySXRyLgorICAgIHZvaWQgcmVudW1iZXJJbmRleGVzKEluZGV4TGlzdDo6aXRlcmF0b3IgY3VySXRyKTsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7CisKKyAgICBTbG90SW5kZXhlcygpIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCkgeworICAgICAgaW5pdGlhbGl6ZVNsb3RJbmRleGVzUGFzcygqUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKSk7CisgICAgfQorCisgICAgflNsb3RJbmRleGVzKCkgb3ZlcnJpZGUgeworICAgICAgLy8gVGhlIGluZGV4TGlzdCdzIG5vZGVzIGFyZSBhbGwgYWxsb2NhdGVkIGluIHRoZSBCdW1wUHRyQWxsb2NhdG9yLgorICAgICAgaW5kZXhMaXN0LmNsZWFyQW5kTGVha05vZGVzVW5zYWZlbHkoKTsKKyAgICB9CisKKyAgICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmYXUpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlOworCisgICAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJmZuKSBvdmVycmlkZTsKKworICAgIC8vLyBEdW1wIHRoZSBpbmRleGVzLgorICAgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgICAgLy8vIFJlbnVtYmVyIHRoZSBpbmRleCBsaXN0LCBwcm92aWRpbmcgc3BhY2UgZm9yIG5ldyBpbnN0cnVjdGlvbnMuCisgICAgdm9pZCByZW51bWJlckluZGV4ZXMoKTsKKworICAgIC8vLyBSZXBhaXIgaW5kZXhlcyBhZnRlciBhZGRpbmcgYW5kIHJlbW92aW5nIGluc3RydWN0aW9ucy4KKyAgICB2b2lkIHJlcGFpckluZGV4ZXNJblJhbmdlKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgRW5kKTsKKworICAgIC8vLyBSZXR1cm5zIHRoZSB6ZXJvIGluZGV4IGZvciB0aGlzIGFuYWx5c2lzLgorICAgIFNsb3RJbmRleCBnZXRaZXJvSW5kZXgoKSB7CisgICAgICBhc3NlcnQoaW5kZXhMaXN0LmZyb250KCkuZ2V0SW5kZXgoKSA9PSAwICYmICJGaXJzdCBpbmRleCBpcyBub3QgMD8iKTsKKyAgICAgIHJldHVybiBTbG90SW5kZXgoJmluZGV4TGlzdC5mcm9udCgpLCAwKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgYmFzZSBpbmRleCBvZiB0aGUgbGFzdCBzbG90IGluIHRoaXMgYW5hbHlzaXMuCisgICAgU2xvdEluZGV4IGdldExhc3RJbmRleCgpIHsKKyAgICAgIHJldHVybiBTbG90SW5kZXgoJmluZGV4TGlzdC5iYWNrKCksIDApOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1hY2hpbmUgaW5zdHIgaXMgbWFwcGVkIHRvIGFuIGluZGV4LAorICAgIC8vLyBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KKyAgICBib29sIGhhc0luZGV4KGNvbnN0IE1hY2hpbmVJbnN0ciAmaW5zdHIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBtaTJpTWFwLmNvdW50KCZpbnN0cik7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIGJhc2UgaW5kZXggZm9yIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4KKyAgICBTbG90SW5kZXggZ2V0SW5zdHJ1Y3Rpb25JbmRleChjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdCB7CisgICAgICAvLyBJbnN0cnVjdGlvbnMgaW5zaWRlIGEgYnVuZGxlIGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFzIHRoZSBidW5kbGUgaXRzZWxmLgorICAgICAgY29uc3QgTWFjaGluZUluc3RyICZCdW5kbGVTdGFydCA9ICpnZXRCdW5kbGVTdGFydChNSS5nZXRJdGVyYXRvcigpKTsKKyAgICAgIE1pMkluZGV4TWFwOjpjb25zdF9pdGVyYXRvciBpdHIgPSBtaTJpTWFwLmZpbmQoJkJ1bmRsZVN0YXJ0KTsKKyAgICAgIGFzc2VydChpdHIgIT0gbWkyaU1hcC5lbmQoKSAmJiAiSW5zdHJ1Y3Rpb24gbm90IGZvdW5kIGluIG1hcHMuIik7CisgICAgICByZXR1cm4gaXRyLT5zZWNvbmQ7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZ2l2ZW4gaW5kZXgsIG9yIG51bGwgaWYgdGhlIGdpdmVuCisgICAgLy8vIGluZGV4IGhhcyBubyBpbnN0cnVjdGlvbiBhc3NvY2lhdGVkIHdpdGggaXQuCisgICAgTWFjaGluZUluc3RyKiBnZXRJbnN0cnVjdGlvbkZyb21JbmRleChTbG90SW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpbmRleC5pc1ZhbGlkKCkgPyBpbmRleC5saXN0RW50cnkoKS0+Z2V0SW5zdHIoKSA6IG51bGxwdHI7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIG5leHQgbm9uLW51bGwgaW5kZXgsIGlmIG9uZSBleGlzdHMuCisgICAgLy8vIE90aGVyd2lzZSByZXR1cm5zIGdldExhc3RJbmRleCgpLgorICAgIFNsb3RJbmRleCBnZXROZXh0Tm9uTnVsbEluZGV4KFNsb3RJbmRleCBJbmRleCkgeworICAgICAgSW5kZXhMaXN0OjppdGVyYXRvciBJID0gSW5kZXgubGlzdEVudHJ5KCktPmdldEl0ZXJhdG9yKCk7CisgICAgICBJbmRleExpc3Q6Oml0ZXJhdG9yIEUgPSBpbmRleExpc3QuZW5kKCk7CisgICAgICB3aGlsZSAoKytJICE9IEUpCisgICAgICAgIGlmIChJLT5nZXRJbnN0cigpKQorICAgICAgICAgIHJldHVybiBTbG90SW5kZXgoJipJLCBJbmRleC5nZXRTbG90KCkpOworICAgICAgLy8gV2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4KKyAgICAgIHJldHVybiBnZXRMYXN0SW5kZXgoKTsKKyAgICB9CisKKyAgICAvLy8gZ2V0SW5kZXhCZWZvcmUgLSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBpbmRleGVkIGluc3RydWN0aW9uCisgICAgLy8vIGJlZm9yZSBNSSwgb3IgdGhlIHN0YXJ0IGluZGV4IG9mIGl0cyBiYXNpYyBibG9jay4KKyAgICAvLy8gTUkgaXMgbm90IHJlcXVpcmVkIHRvIGhhdmUgYW4gaW5kZXguCisgICAgU2xvdEluZGV4IGdldEluZGV4QmVmb3JlKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0IHsKKyAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBNSS5nZXRQYXJlbnQoKTsKKyAgICAgIGFzc2VydChNQkIgJiYgIk1JIG11c3QgYmUgaW5zZXJ0ZWQgaW5uYSBiYXNpYyBibG9jayIpOworICAgICAgTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEkgPSBNSSwgQiA9IE1CQi0+YmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChJID09IEIpCisgICAgICAgICAgcmV0dXJuIGdldE1CQlN0YXJ0SWR4KE1CQik7CisgICAgICAgIC0tSTsKKyAgICAgICAgTWkySW5kZXhNYXA6OmNvbnN0X2l0ZXJhdG9yIE1hcEl0ciA9IG1pMmlNYXAuZmluZCgmKkkpOworICAgICAgICBpZiAoTWFwSXRyICE9IG1pMmlNYXAuZW5kKCkpCisgICAgICAgICAgcmV0dXJuIE1hcEl0ci0+c2Vjb25kOworICAgICAgfQorICAgIH0KKworICAgIC8vLyBnZXRJbmRleEFmdGVyIC0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGluZGV4ZWQgaW5zdHJ1Y3Rpb24KKyAgICAvLy8gYWZ0ZXIgTUksIG9yIHRoZSBlbmQgaW5kZXggb2YgaXRzIGJhc2ljIGJsb2NrLgorICAgIC8vLyBNSSBpcyBub3QgcmVxdWlyZWQgdG8gaGF2ZSBhbiBpbmRleC4KKyAgICBTbG90SW5kZXggZ2V0SW5kZXhBZnRlcihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdCB7CisgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gTUkuZ2V0UGFyZW50KCk7CisgICAgICBhc3NlcnQoTUJCICYmICJNSSBtdXN0IGJlIGluc2VydGVkIGlubmEgYmFzaWMgYmxvY2siKTsKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBJID0gTUksIEUgPSBNQkItPmVuZCgpOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgKytJOworICAgICAgICBpZiAoSSA9PSBFKQorICAgICAgICAgIHJldHVybiBnZXRNQkJFbmRJZHgoTUJCKTsKKyAgICAgICAgTWkySW5kZXhNYXA6OmNvbnN0X2l0ZXJhdG9yIE1hcEl0ciA9IG1pMmlNYXAuZmluZCgmKkkpOworICAgICAgICBpZiAoTWFwSXRyICE9IG1pMmlNYXAuZW5kKCkpCisgICAgICAgICAgcmV0dXJuIE1hcEl0ci0+c2Vjb25kOworICAgICAgfQorICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIChzdGFydCxlbmQpIHJhbmdlIG9mIHRoZSBnaXZlbiBiYXNpYyBibG9jayBudW1iZXIuCisgICAgY29uc3Qgc3RkOjpwYWlyPFNsb3RJbmRleCwgU2xvdEluZGV4PiAmCisgICAgZ2V0TUJCUmFuZ2UodW5zaWduZWQgTnVtKSBjb25zdCB7CisgICAgICByZXR1cm4gTUJCUmFuZ2VzW051bV07CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgKHN0YXJ0LGVuZCkgcmFuZ2Ugb2YgdGhlIGdpdmVuIGJhc2ljIGJsb2NrLgorICAgIGNvbnN0IHN0ZDo6cGFpcjxTbG90SW5kZXgsIFNsb3RJbmRleD4gJgorICAgIGdldE1CQlJhbmdlKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRNQkJSYW5nZShNQkItPmdldE51bWJlcigpKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgZmlyc3QgaW5kZXggaW4gdGhlIGdpdmVuIGJhc2ljIGJsb2NrIG51bWJlci4KKyAgICBTbG90SW5kZXggZ2V0TUJCU3RhcnRJZHgodW5zaWduZWQgTnVtKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0TUJCUmFuZ2UoTnVtKS5maXJzdDsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgZmlyc3QgaW5kZXggaW4gdGhlIGdpdmVuIGJhc2ljIGJsb2NrLgorICAgIFNsb3RJbmRleCBnZXRNQkJTdGFydElkeChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqbWJiKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0TUJCUmFuZ2UobWJiKS5maXJzdDsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgbGFzdCBpbmRleCBpbiB0aGUgZ2l2ZW4gYmFzaWMgYmxvY2sgbnVtYmVyLgorICAgIFNsb3RJbmRleCBnZXRNQkJFbmRJZHgodW5zaWduZWQgTnVtKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0TUJCUmFuZ2UoTnVtKS5zZWNvbmQ7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIGxhc3QgaW5kZXggaW4gdGhlIGdpdmVuIGJhc2ljIGJsb2NrLgorICAgIFNsb3RJbmRleCBnZXRNQkJFbmRJZHgoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKm1iYikgY29uc3QgeworICAgICAgcmV0dXJuIGdldE1CQlJhbmdlKG1iYikuc2Vjb25kOworICAgIH0KKworICAgIC8vLyBJdGVyYXRvciBvdmVyIHRoZSBpZHgyTUJCTWFwIChzb3J0ZWQgcGFpcnMgb2Ygc2xvdCBpbmRleCBvZiBiYXNpYyBibG9jaworICAgIC8vLyBiZWdpbiBhbmQgYmFzaWMgYmxvY2spCisgICAgdXNpbmcgTUJCSW5kZXhJdGVyYXRvciA9IFNtYWxsVmVjdG9ySW1wbDxJZHhNQkJQYWlyPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgICAvLy8gTW92ZSBpdGVyYXRvciB0byB0aGUgbmV4dCBJZHhNQkJQYWlyIHdoZXJlIHRoZSBTbG90SW5kZXggaXMgZ3JlYXRlciBvcgorICAgIC8vLyBlcXVhbCB0byBccCBUby4KKyAgICBNQkJJbmRleEl0ZXJhdG9yIGFkdmFuY2VNQkJJbmRleChNQkJJbmRleEl0ZXJhdG9yIEksIFNsb3RJbmRleCBUbykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6bG93ZXJfYm91bmQoSSwgaWR4Mk1CQk1hcC5lbmQoKSwgVG8pOworICAgIH0KKworICAgIC8vLyBHZXQgYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIElkeE1CQlBhaXIgd2l0aCB0aGUgYmlnZ2VzdCBTbG90SW5kZXgKKyAgICAvLy8gdGhhdCBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIFxwIElkeC4KKyAgICBNQkJJbmRleEl0ZXJhdG9yIGZpbmRNQkJJbmRleChTbG90SW5kZXggSWR4KSBjb25zdCB7CisgICAgICByZXR1cm4gYWR2YW5jZU1CQkluZGV4KGlkeDJNQkJNYXAuYmVnaW4oKSwgSWR4KTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgdGhlIGJlZ2luIG9mIHRoZSBpZHgyTUJCTWFwLgorICAgIE1CQkluZGV4SXRlcmF0b3IgTUJCSW5kZXhCZWdpbigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpZHgyTUJCTWFwLmJlZ2luKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiBhbiBpdGVyYXRvciBmb3IgdGhlIGVuZCBvZiB0aGUgaWR4Mk1CQk1hcC4KKyAgICBNQkJJbmRleEl0ZXJhdG9yIE1CQkluZGV4RW5kKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlkeDJNQkJNYXAuZW5kKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIGJhc2ljIGJsb2NrIHdoaWNoIHRoZSBnaXZlbiBpbmRleCBmYWxscyBpbi4KKyAgICBNYWNoaW5lQmFzaWNCbG9jayogZ2V0TUJCRnJvbUluZGV4KFNsb3RJbmRleCBpbmRleCkgY29uc3QgeworICAgICAgaWYgKE1hY2hpbmVJbnN0ciAqTUkgPSBnZXRJbnN0cnVjdGlvbkZyb21JbmRleChpbmRleCkpCisgICAgICAgIHJldHVybiBNSS0+Z2V0UGFyZW50KCk7CisKKyAgICAgIE1CQkluZGV4SXRlcmF0b3IgSSA9IGZpbmRNQkJJbmRleChpbmRleCk7CisgICAgICAvLyBUYWtlIHRoZSBwYWlyIGNvbnRhaW5pbmcgdGhlIGluZGV4CisgICAgICBNQkJJbmRleEl0ZXJhdG9yIEogPQorICAgICAgICAoKEkgIT0gTUJCSW5kZXhFbmQoKSAmJiBJLT5maXJzdCA+IGluZGV4KSB8fAorICAgICAgICAgKEkgPT0gTUJCSW5kZXhFbmQoKSAmJiAhaWR4Mk1CQk1hcC5lbXB0eSgpKSkgPyBzdGQ6OnByZXYoSSkgOiBJOworCisgICAgICBhc3NlcnQoSiAhPSBNQkJJbmRleEVuZCgpICYmIEotPmZpcnN0IDw9IGluZGV4ICYmCisgICAgICAgICAgICAgaW5kZXggPCBnZXRNQkJFbmRJZHgoSi0+c2Vjb25kKSAmJgorICAgICAgICAgICAgICJpbmRleCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFuIE1CQiIpOworICAgICAgcmV0dXJuIEotPnNlY29uZDsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgTUJCIGNvdmVyaW5nIHRoZSBnaXZlbiByYW5nZSwgb3IgbnVsbCBpZiB0aGUgcmFuZ2UgY292ZXJzCisgICAgLy8vIG1vcmUgdGhhbiBvbmUgYmFzaWMgYmxvY2suCisgICAgTWFjaGluZUJhc2ljQmxvY2sqIGdldE1CQkNvdmVyaW5nUmFuZ2UoU2xvdEluZGV4IHN0YXJ0LCBTbG90SW5kZXggZW5kKSBjb25zdCB7CisKKyAgICAgIGFzc2VydChzdGFydCA8IGVuZCAmJiAiQmFja3dhcmRzIHJhbmdlcyBub3QgYWxsb3dlZC4iKTsKKyAgICAgIE1CQkluZGV4SXRlcmF0b3IgaXRyID0gZmluZE1CQkluZGV4KHN0YXJ0KTsKKyAgICAgIGlmIChpdHIgPT0gTUJCSW5kZXhFbmQoKSkgeworICAgICAgICBpdHIgPSBzdGQ6OnByZXYoaXRyKTsKKyAgICAgICAgcmV0dXJuIGl0ci0+c2Vjb25kOworICAgICAgfQorCisgICAgICAvLyBDaGVjayB0aGF0IHdlIGRvbid0IGNyb3NzIHRoZSBib3VuZGFyeSBpbnRvIHRoaXMgYmxvY2suCisgICAgICBpZiAoaXRyLT5maXJzdCA8IGVuZCkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgIGl0ciA9IHN0ZDo6cHJldihpdHIpOworCisgICAgICBpZiAoaXRyLT5maXJzdCA8PSBzdGFydCkKKyAgICAgICAgcmV0dXJuIGl0ci0+c2Vjb25kOworCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLy8gSW5zZXJ0IHRoZSBnaXZlbiBtYWNoaW5lIGluc3RydWN0aW9uIGludG8gdGhlIG1hcHBpbmcuIFJldHVybnMgdGhlCisgICAgLy8vIGFzc2lnbmVkIGluZGV4LgorICAgIC8vLyBJZiBMYXRlIGlzIHNldCBhbmQgdGhlcmUgYXJlIG51bGwgaW5kZXhlcyBiZXR3ZWVuIG1pJ3MgbmVpZ2hib3JpbmcKKyAgICAvLy8gaW5zdHJ1Y3Rpb25zLCBjcmVhdGUgdGhlIG5ldyBpbmRleCBhZnRlciB0aGUgbnVsbCBpbmRleGVzIGluc3RlYWQgb2YKKyAgICAvLy8gYmVmb3JlIHRoZW0uCisgICAgU2xvdEluZGV4IGluc2VydE1hY2hpbmVJbnN0ckluTWFwcyhNYWNoaW5lSW5zdHIgJk1JLCBib29sIExhdGUgPSBmYWxzZSkgeworICAgICAgYXNzZXJ0KCFNSS5pc0luc2lkZUJ1bmRsZSgpICYmCisgICAgICAgICAgICAgIkluc3RydWN0aW9ucyBpbnNpZGUgYnVuZGxlcyBzaG91bGQgdXNlIGJ1bmRsZSBzdGFydCdzIHNsb3QuIik7CisgICAgICBhc3NlcnQobWkyaU1hcC5maW5kKCZNSSkgPT0gbWkyaU1hcC5lbmQoKSAmJiAiSW5zdHIgYWxyZWFkeSBpbmRleGVkLiIpOworICAgICAgLy8gTnVtYmVyaW5nIERCR19WQUxVRSBpbnN0cnVjdGlvbnMgY291bGQgY2F1c2UgY29kZSBnZW5lcmF0aW9uIHRvIGJlCisgICAgICAvLyBhZmZlY3RlZCBieSBkZWJ1ZyBpbmZvcm1hdGlvbi4KKyAgICAgIGFzc2VydCghTUkuaXNEZWJ1Z1ZhbHVlKCkgJiYgIkNhbm5vdCBudW1iZXIgREJHX1ZBTFVFIGluc3RydWN0aW9ucy4iKTsKKworICAgICAgYXNzZXJ0KE1JLmdldFBhcmVudCgpICE9IG51bGxwdHIgJiYgIkluc3RyIG11c3QgYmUgYWRkZWQgdG8gZnVuY3Rpb24uIik7CisKKyAgICAgIC8vIEdldCB0aGUgZW50cmllcyB3aGVyZSBNSSBzaG91bGQgYmUgaW5zZXJ0ZWQuCisgICAgICBJbmRleExpc3Q6Oml0ZXJhdG9yIHByZXZJdHIsIG5leHRJdHI7CisgICAgICBpZiAoTGF0ZSkgeworICAgICAgICAvLyBJbnNlcnQgTUkncyBpbmRleCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbi4KKyAgICAgICAgbmV4dEl0ciA9IGdldEluZGV4QWZ0ZXIoTUkpLmxpc3RFbnRyeSgpLT5nZXRJdGVyYXRvcigpOworICAgICAgICBwcmV2SXRyID0gc3RkOjpwcmV2KG5leHRJdHIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSW5zZXJ0IE1JJ3MgaW5kZXggaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHByZWNlZGluZyBpbnN0cnVjdGlvbi4KKyAgICAgICAgcHJldkl0ciA9IGdldEluZGV4QmVmb3JlKE1JKS5saXN0RW50cnkoKS0+Z2V0SXRlcmF0b3IoKTsKKyAgICAgICAgbmV4dEl0ciA9IHN0ZDo6bmV4dChwcmV2SXRyKTsKKyAgICAgIH0KKworICAgICAgLy8gR2V0IGEgbnVtYmVyIGZvciB0aGUgbmV3IGluc3RyLCBvciAwIGlmIHRoZXJlJ3Mgbm8gcm9vbSBjdXJyZW50bHkuCisgICAgICAvLyBJbiB0aGUgbGF0dGVyIGNhc2Ugd2UnbGwgZm9yY2UgYSByZW51bWJlciBsYXRlci4KKyAgICAgIHVuc2lnbmVkIGRpc3QgPSAoKG5leHRJdHItPmdldEluZGV4KCkgLSBwcmV2SXRyLT5nZXRJbmRleCgpKS8yKSAmIH4zdTsKKyAgICAgIHVuc2lnbmVkIG5ld051bWJlciA9IHByZXZJdHItPmdldEluZGV4KCkgKyBkaXN0OworCisgICAgICAvLyBJbnNlcnQgYSBuZXcgbGlzdCBlbnRyeSBmb3IgTUkuCisgICAgICBJbmRleExpc3Q6Oml0ZXJhdG9yIG5ld0l0ciA9CisgICAgICAgICAgaW5kZXhMaXN0Lmluc2VydChuZXh0SXRyLCBjcmVhdGVFbnRyeSgmTUksIG5ld051bWJlcikpOworCisgICAgICAvLyBSZW51bWJlciBsb2NhbGx5IGlmIHdlIG5lZWQgdG8uCisgICAgICBpZiAoZGlzdCA9PSAwKQorICAgICAgICByZW51bWJlckluZGV4ZXMobmV3SXRyKTsKKworICAgICAgU2xvdEluZGV4IG5ld0luZGV4KCYqbmV3SXRyLCBTbG90SW5kZXg6OlNsb3RfQmxvY2spOworICAgICAgbWkyaU1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoJk1JLCBuZXdJbmRleCkpOworICAgICAgcmV0dXJuIG5ld0luZGV4OworICAgIH0KKworICAgIC8vLyBSZW1vdmVzIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gKGJ1bmRsZSkgXHAgTUkgZnJvbSB0aGUgbWFwcGluZy4KKyAgICAvLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBNYWNoaW5lSW5zdHI6OmVyYXNlRnJvbVBhcmVudCgpIGlzIHVzZWQgdG8KKyAgICAvLy8gcmVtb3ZlIGEgd2hvbGUgYnVuZGxlIG9yIGFuIHVuYnVuZGxlZCBpbnN0cnVjdGlvbi4KKyAgICB2b2lkIHJlbW92ZU1hY2hpbmVJbnN0ckZyb21NYXBzKE1hY2hpbmVJbnN0ciAmTUkpOworCisgICAgLy8vIFJlbW92ZXMgYSBzaW5nbGUgbWFjaGluZSBpbnN0cnVjdGlvbiBccCBNSSBmcm9tIHRoZSBtYXBwaW5nLgorICAgIC8vLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIE1hY2hpbmVJbnN0cjo6ZXJhc2VGcm9tQnVuZGxlKCkgaXMgdXNlZCB0bworICAgIC8vLyByZW1vdmUgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gKG91dCBvZiBhIGJ1bmRsZSkuCisgICAgdm9pZCByZW1vdmVTaW5nbGVNYWNoaW5lSW5zdHJGcm9tTWFwcyhNYWNoaW5lSW5zdHIgJk1JKTsKKworICAgIC8vLyBSZXBsYWNlTWFjaGluZUluc3RySW5NYXBzIC0gUmVwbGFjaW5nIGEgbWFjaGluZSBpbnN0ciB3aXRoIGEgbmV3IG9uZSBpbgorICAgIC8vLyBtYXBzIHVzZWQgYnkgcmVnaXN0ZXIgYWxsb2NhdG9yLiBccmV0dXJucyB0aGUgaW5kZXggd2hlcmUgdGhlIG5ldworICAgIC8vLyBpbnN0cnVjdGlvbiB3YXMgaW5zZXJ0ZWQuCisgICAgU2xvdEluZGV4IHJlcGxhY2VNYWNoaW5lSW5zdHJJbk1hcHMoTWFjaGluZUluc3RyICZNSSwgTWFjaGluZUluc3RyICZOZXdNSSkgeworICAgICAgTWkySW5kZXhNYXA6Oml0ZXJhdG9yIG1pMmlJdHIgPSBtaTJpTWFwLmZpbmQoJk1JKTsKKyAgICAgIGlmIChtaTJpSXRyID09IG1pMmlNYXAuZW5kKCkpCisgICAgICAgIHJldHVybiBTbG90SW5kZXgoKTsKKyAgICAgIFNsb3RJbmRleCByZXBsYWNlQmFzZUluZGV4ID0gbWkyaUl0ci0+c2Vjb25kOworICAgICAgSW5kZXhMaXN0RW50cnkgKm1pRW50cnkocmVwbGFjZUJhc2VJbmRleC5saXN0RW50cnkoKSk7CisgICAgICBhc3NlcnQobWlFbnRyeS0+Z2V0SW5zdHIoKSA9PSAmTUkgJiYKKyAgICAgICAgICAgICAiTWlzbWF0Y2hlZCBpbnN0cnVjdGlvbiBpbiBpbmRleCB0YWJsZXMuIik7CisgICAgICBtaUVudHJ5LT5zZXRJbnN0cigmTmV3TUkpOworICAgICAgbWkyaU1hcC5lcmFzZShtaTJpSXRyKTsKKyAgICAgIG1pMmlNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCZOZXdNSSwgcmVwbGFjZUJhc2VJbmRleCkpOworICAgICAgcmV0dXJuIHJlcGxhY2VCYXNlSW5kZXg7CisgICAgfQorCisgICAgLy8vIEFkZCB0aGUgZ2l2ZW4gTWFjaGluZUJhc2ljQmxvY2sgaW50byB0aGUgbWFwcy4KKyAgICB2b2lkIGluc2VydE1CQkluTWFwcyhNYWNoaW5lQmFzaWNCbG9jayAqbWJiKSB7CisgICAgICBNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yIG5leHRNQkIgPQorICAgICAgICBzdGQ6Om5leHQoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvcihtYmIpKTsKKworICAgICAgSW5kZXhMaXN0RW50cnkgKnN0YXJ0RW50cnkgPSBudWxscHRyOworICAgICAgSW5kZXhMaXN0RW50cnkgKmVuZEVudHJ5ID0gbnVsbHB0cjsKKyAgICAgIEluZGV4TGlzdDo6aXRlcmF0b3IgbmV3SXRyOworICAgICAgaWYgKG5leHRNQkIgPT0gbWJiLT5nZXRQYXJlbnQoKS0+ZW5kKCkpIHsKKyAgICAgICAgc3RhcnRFbnRyeSA9ICZpbmRleExpc3QuYmFjaygpOworICAgICAgICBlbmRFbnRyeSA9IGNyZWF0ZUVudHJ5KG51bGxwdHIsIDApOworICAgICAgICBuZXdJdHIgPSBpbmRleExpc3QuaW5zZXJ0QWZ0ZXIoc3RhcnRFbnRyeS0+Z2V0SXRlcmF0b3IoKSwgZW5kRW50cnkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhcnRFbnRyeSA9IGNyZWF0ZUVudHJ5KG51bGxwdHIsIDApOworICAgICAgICBlbmRFbnRyeSA9IGdldE1CQlN0YXJ0SWR4KCYqbmV4dE1CQikubGlzdEVudHJ5KCk7CisgICAgICAgIG5ld0l0ciA9IGluZGV4TGlzdC5pbnNlcnQoZW5kRW50cnktPmdldEl0ZXJhdG9yKCksIHN0YXJ0RW50cnkpOworICAgICAgfQorCisgICAgICBTbG90SW5kZXggc3RhcnRJZHgoc3RhcnRFbnRyeSwgU2xvdEluZGV4OjpTbG90X0Jsb2NrKTsKKyAgICAgIFNsb3RJbmRleCBlbmRJZHgoZW5kRW50cnksIFNsb3RJbmRleDo6U2xvdF9CbG9jayk7CisKKyAgICAgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgcHJldk1CQihtYmIpOworICAgICAgYXNzZXJ0KHByZXZNQkIgIT0gbWJiLT5nZXRQYXJlbnQoKS0+ZW5kKCkgJiYKKyAgICAgICAgICAgICAiQ2FuJ3QgaW5zZXJ0IGEgbmV3IGJsb2NrIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBmdW5jdGlvbi4iKTsKKyAgICAgIC0tcHJldk1CQjsKKyAgICAgIE1CQlJhbmdlc1twcmV2TUJCLT5nZXROdW1iZXIoKV0uc2Vjb25kID0gc3RhcnRJZHg7CisKKyAgICAgIGFzc2VydCh1bnNpZ25lZChtYmItPmdldE51bWJlcigpKSA9PSBNQkJSYW5nZXMuc2l6ZSgpICYmCisgICAgICAgICAgICAgIkJsb2NrcyBtdXN0IGJlIGFkZGVkIGluIG9yZGVyIik7CisgICAgICBNQkJSYW5nZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKHN0YXJ0SWR4LCBlbmRJZHgpKTsKKyAgICAgIGlkeDJNQkJNYXAucHVzaF9iYWNrKElkeE1CQlBhaXIoc3RhcnRJZHgsIG1iYikpOworCisgICAgICByZW51bWJlckluZGV4ZXMobmV3SXRyKTsKKyAgICAgIHN0ZDo6c29ydChpZHgyTUJCTWFwLmJlZ2luKCksIGlkeDJNQkJNYXAuZW5kKCksIElkeDJNQkJDb21wYXJlKCkpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgRnJlZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2VyZSByZXF1aXJlZCB0byBtYWludGFpbiBhIFNsb3RJbmRleC4KKyAgICAvLy8KKyAgICAvLy8gT25jZSBhbiBpbmRleCBpcyBubyBsb25nZXIgbmVlZGVkIChmb3IgaW5zdGFuY2UgYmVjYXVzZSB0aGUgaW5zdHJ1Y3Rpb24KKyAgICAvLy8gYXQgdGhhdCBpbmRleCBoYXMgYmVlbiBtb3ZlZCksIHRoZSByZXNvdXJjZXMgcmVxdWlyZWQgdG8gbWFpbnRhaW4gdGhlCisgICAgLy8vIGluZGV4IGNhbiBiZSByZWxpbnF1aXNoZWQgdG8gcmVkdWNlIG1lbW9yeSB1c2UgYW5kIGltcHJvdmUgcmVudW1iZXJpbmcKKyAgICAvLy8gcGVyZm9ybWFuY2UuIEFueSByZW1haW5pbmcgU2xvdEluZGV4IG9iamVjdHMgdGhhdCBwb2ludCB0byB0aGUgc2FtZQorICAgIC8vLyBpbmRleCBhcmUgbGVmdCAnZGFuZ2xpbmcnIChtdWNoIHRoZSBzYW1lIGFzIGEgZGFuZ2xpbmcgcG9pbnRlciB0byBhCisgICAgLy8vIGZyZWVkIG9iamVjdCkgYW5kIHNob3VsZCBub3QgYmUgYWNjZXNzZWQsIGV4Y2VwdCB0byBkZXN0cnVjdCB0aGVtLgorICAgIC8vLworICAgIC8vLyBMaWtlIGRhbmdsaW5nIHBvaW50ZXJzLCBhY2Nlc3MgdG8gZGFuZ2xpbmcgU2xvdEluZGV4ZXMgY2FuIGNhdXNlCisgICAgLy8vIHBhaW5mdWwtdG8tdHJhY2stZG93biBidWdzLCBlc3BlY2lhbGx5IGlmIHRoZSBtZW1vcnkgZm9yIHRoZSBpbmRleAorICAgIC8vLyBwcmV2aW91c2x5IHBvaW50ZWQgdG8gaGFzIGJlZW4gcmUtdXNlZC4gVG8gZGV0ZWN0IGRhbmdsaW5nIFNsb3RJbmRleAorICAgIC8vLyBidWdzLCBidWlsZCB3aXRoIEVYUEVOU0lWRV9DSEVDS1M9MS4gVGhpcyB3aWxsIGNhdXNlICJlcmFzZWQiIGluZGV4ZXMgdG8KKyAgICAvLy8gYmUgcmV0YWluZWQgaW4gYSBncmF2ZXlhcmQgaW5zdGVhZCBvZiBiZWluZyBmcmVlZC4gT3BlcmF0aW9ucyBvbiBpbmRleGVzCisgICAgLy8vIGluIHRoZSBncmF2ZXlhcmQgd2lsbCB0cmlnZ2VyIGFuIGFzc2VydGlvbi4KKyAgICB2b2lkIGVyYXNlSW5kZXgoU2xvdEluZGV4IGluZGV4KSB7CisgICAgICBJbmRleExpc3RFbnRyeSAqZW50cnkgPSBpbmRleC5saXN0RW50cnkoKTsKKyNpZmRlZiBFWFBFTlNJVkVfQ0hFQ0tTCisgICAgICBpbmRleExpc3QucmVtb3ZlKGVudHJ5KTsKKyAgICAgIGdyYXZleWFyZExpc3QucHVzaF9iYWNrKGVudHJ5KTsKKyAgICAgIGVudHJ5LT5zZXRQb2lzb24oKTsKKyNlbHNlCisgICAgICBpbmRleExpc3QuZXJhc2UoZW50cnkpOworI2VuZGlmCisgICAgfQorICB9OworCisgIC8vIFNwZWNpYWxpemUgSW50ZXJ2YWxNYXBJbmZvIGZvciBoYWxmLW9wZW4gc2xvdCBpbmRleCBpbnRlcnZhbHMuCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBJbnRlcnZhbE1hcEluZm88U2xvdEluZGV4PiA6IEludGVydmFsTWFwSGFsZk9wZW5JbmZvPFNsb3RJbmRleD4geworICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1NMT1RJTkRFWEVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TdGFja01hcHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TdGFja01hcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDA3MTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1N0YWNrTWFwcy5oCkBAIC0wLDAgKzEsMzMyIEBACisvLz09PS0gU3RhY2tNYXBzLmggLSBTdGFja01hcHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TVEFDS01BUFNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fU1RBQ0tNQVBTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL01hcFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQXNtUHJpbnRlcjsKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIE1DU3RyZWFtZXI7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKKworLy8vIFxicmllZiBNSS1sZXZlbCBzdGFja21hcCBvcGVyYW5kcy4KKy8vLworLy8vIE1JIHN0YWNrbWFwIG9wZXJhdGlvbnMgdGFrZSB0aGUgZm9ybToKKy8vLyA8aWQ+LCA8bnVtQnl0ZXM+LCBsaXZlIGFyZ3MuLi4KK2NsYXNzIFN0YWNrTWFwT3BlcnMgeworcHVibGljOgorICAvLy8gRW51bWVyYXRlIHRoZSBtZXRhIG9wZXJhbmRzLgorICBlbnVtIHsgSURQb3MsIE5CeXRlc1BvcyB9OworCitwcml2YXRlOgorICBjb25zdCBNYWNoaW5lSW5zdHIqIE1JOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFN0YWNrTWFwT3BlcnMoY29uc3QgTWFjaGluZUluc3RyICpNSSk7CisKKyAgLy8vIFJldHVybiB0aGUgSUQgZm9yIHRoZSBnaXZlbiBzdGFja21hcAorICB1aW50NjRfdCBnZXRJRCgpIGNvbnN0IHsgcmV0dXJuIE1JLT5nZXRPcGVyYW5kKElEUG9zKS5nZXRJbW0oKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBwYXRjaGFibGUgYnl0ZXMgdGhlIGdpdmVuIHN0YWNrbWFwIHNob3VsZCBlbWl0LgorICB1aW50MzJfdCBnZXROdW1QYXRjaEJ5dGVzKCkgY29uc3QgeworICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZChOQnl0ZXNQb3MpLmdldEltbSgpOworICB9CisKKyAgLy8vIEdldCB0aGUgb3BlcmFuZCBpbmRleCBvZiB0aGUgdmFyaWFibGUgbGlzdCBvZiBub24tYXJndW1lbnQgb3BlcmFuZHMuCisgIC8vLyBUaGVzZSBob2xkIHRoZSAibGl2ZSBzdGF0ZSIuCisgIHVuc2lnbmVkIGdldFZhcklkeCgpIGNvbnN0IHsKKyAgICAvLyBTa2lwIElELCBuU2hhZG93Qnl0ZXMuCisgICAgcmV0dXJuIDI7CisgIH0KK307CisKKy8vLyBcYnJpZWYgTUktbGV2ZWwgcGF0Y2hwb2ludCBvcGVyYW5kcy4KKy8vLworLy8vIE1JIHBhdGNocG9pbnQgb3BlcmF0aW9ucyB0YWtlIHRoZSBmb3JtOgorLy8vIFs8ZGVmPl0sIDxpZD4sIDxudW1CeXRlcz4sIDx0YXJnZXQ+LCA8bnVtQXJncz4sIDxjYz4sIC4uLgorLy8vCisvLy8gSVIgcGF0Y2hwb2ludCBpbnRyaW5zaWNzIGRvIG5vdCBoYXZlIHRoZSA8Y2M+IG9wZXJhbmQgYmVjYXVzZSBjYWxsaW5nCisvLy8gY29udmVudGlvbiBpcyBwYXJ0IG9mIHRoZSBzdWJjbGFzcyBkYXRhLgorLy8vCisvLy8gU0QgcGF0Y2hwb2ludCBub2RlcyBkbyBub3QgaGF2ZSBhIGRlZiBvcGVyYW5kIGJlY2F1c2UgaXQgaXMgcGFydCBvZiB0aGUKKy8vLyBTRFZhbHVlLgorLy8vCisvLy8gUGF0Y2hwb2ludHMgZm9sbG93aW5nIHRoZSBhbnlyZWdjYyBjb252ZW50aW9uIGFyZSBoYW5kbGVkIHNwZWNpYWxseS4gRm9yCisvLy8gdGhlc2UsIHRoZSBzdGFjayBtYXAgYWxzbyByZWNvcmRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmV0dXJuIHZhbHVlIGFuZAorLy8vIGFyZ3VtZW50cy4KK2NsYXNzIFBhdGNoUG9pbnRPcGVycyB7CitwdWJsaWM6CisgIC8vLyBFbnVtZXJhdGUgdGhlIG1ldGEgb3BlcmFuZHMuCisgIGVudW0geyBJRFBvcywgTkJ5dGVzUG9zLCBUYXJnZXRQb3MsIE5BcmdQb3MsIENDUG9zLCBNZXRhRW5kIH07CisKK3ByaXZhdGU6CisgIGNvbnN0IE1hY2hpbmVJbnN0ciAqTUk7CisgIGJvb2wgSGFzRGVmOworCisgIHVuc2lnbmVkIGdldE1ldGFJZHgodW5zaWduZWQgUG9zID0gMCkgY29uc3QgeworICAgIGFzc2VydChQb3MgPCBNZXRhRW5kICYmICJNZXRhIG9wZXJhbmQgaW5kZXggb3V0IG9mIHJhbmdlLiIpOworICAgIHJldHVybiAoSGFzRGVmID8gMSA6IDApICsgUG9zOworICB9CisKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgJmdldE1ldGFPcGVyKHVuc2lnbmVkIFBvcykgY29uc3QgeworICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZChnZXRNZXRhSWR4KFBvcykpOworICB9CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgUGF0Y2hQb2ludE9wZXJzKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpOworCisgIGJvb2wgaXNBbnlSZWcoKSBjb25zdCB7IHJldHVybiAoZ2V0Q2FsbGluZ0NvbnYoKSA9PSBDYWxsaW5nQ29udjo6QW55UmVnKTsgfQorICBib29sIGhhc0RlZigpIGNvbnN0IHsgcmV0dXJuIEhhc0RlZjsgfQorCisgIC8vLyBSZXR1cm4gdGhlIElEIGZvciB0aGUgZ2l2ZW4gcGF0Y2hwb2ludC4KKyAgdWludDY0X3QgZ2V0SUQoKSBjb25zdCB7IHJldHVybiBnZXRNZXRhT3BlcihJRFBvcykuZ2V0SW1tKCk7IH0KKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgcGF0Y2hhYmxlIGJ5dGVzIHRoZSBnaXZlbiBwYXRjaHBvaW50IHNob3VsZCBlbWl0LgorICB1aW50MzJfdCBnZXROdW1QYXRjaEJ5dGVzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRNZXRhT3BlcihOQnl0ZXNQb3MpLmdldEltbSgpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHRhcmdldCBvZiB0aGUgdW5kZXJseWluZyBjYWxsLgorICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmZ2V0Q2FsbFRhcmdldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TWV0YU9wZXIoVGFyZ2V0UG9zKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24KKyAgQ2FsbGluZ0NvbnY6OklEIGdldENhbGxpbmdDb252KCkgY29uc3QgeworICAgIHJldHVybiBnZXRNZXRhT3BlcihDQ1BvcykuZ2V0SW1tKCk7CisgIH0KKworICB1bnNpZ25lZCBnZXRBcmdJZHgoKSBjb25zdCB7IHJldHVybiBnZXRNZXRhSWR4KCkgKyBNZXRhRW5kOyB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGNhbGwgYXJndW1lbnRzCisgIHVpbnQzMl90IGdldE51bUNhbGxBcmdzKCkgY29uc3QgeworICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZChnZXRNZXRhSWR4KE5BcmdQb3MpKS5nZXRJbW0oKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIG9wZXJhbmQgaW5kZXggb2YgdGhlIHZhcmlhYmxlIGxpc3Qgb2Ygbm9uLWFyZ3VtZW50IG9wZXJhbmRzLgorICAvLy8gVGhlc2UgaG9sZCB0aGUgImxpdmUgc3RhdGUiLgorICB1bnNpZ25lZCBnZXRWYXJJZHgoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE1ldGFJZHgoKSArIE1ldGFFbmQgKyBnZXROdW1DYWxsQXJncygpOworICB9CisKKyAgLy8vIEdldCB0aGUgaW5kZXggYXQgd2hpY2ggc3RhY2sgbWFwIGxvY2F0aW9ucyB3aWxsIGJlIHJlY29yZGVkLgorICAvLy8gQXJndW1lbnRzIGFyZSBub3QgcmVjb3JkZWQgdW5sZXNzIHRoZSBhbnlyZWdjYyBjb252ZW50aW9uIGlzIHVzZWQuCisgIHVuc2lnbmVkIGdldFN0YWNrTWFwU3RhcnRJZHgoKSBjb25zdCB7CisgICAgaWYgKGlzQW55UmVnKCkpCisgICAgICByZXR1cm4gZ2V0QXJnSWR4KCk7CisgICAgcmV0dXJuIGdldFZhcklkeCgpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG5leHQgc2NyYXRjaCByZWdpc3RlciBvcGVyYW5kIGluZGV4LgorICB1bnNpZ25lZCBnZXROZXh0U2NyYXRjaElkeCh1bnNpZ25lZCBTdGFydElkeCA9IDApIGNvbnN0OworfTsKKworLy8vIE1JLWxldmVsIFN0YXRlcG9pbnQgb3BlcmFuZHMKKy8vLworLy8vIFN0YXRlcG9pbnQgb3BlcmFuZHMgdGFrZSB0aGUgZm9ybToKKy8vLyAgIDxpZD4sIDxudW0gcGF0Y2ggYnl0ZXMgPiwgPG51bSBjYWxsIGFyZ3VtZW50cz4sIDxjYWxsIHRhcmdldD4sCisvLy8gICBbY2FsbCBhcmd1bWVudHMuLi5dLAorLy8vICAgPFN0YWNrTWFwczo6Q29uc3RhbnRPcD4sIDxjYWxsaW5nIGNvbnZlbnRpb24+LAorLy8vICAgPFN0YWNrTWFwczo6Q29uc3RhbnRPcD4sIDxzdGF0ZXBvaW50IGZsYWdzPiwKKy8vLyAgIDxTdGFja01hcHM6OkNvbnN0YW50T3A+LCA8bnVtIGRlb3B0IGFyZ3M+LCBbZGVvcHQgYXJncy4uLl0sCisvLy8gICA8Z2MgYmFzZS9kZXJpdmVkIHBhaXJzLi4uPiA8Z2MgYWxsb2Nhcy4uLj4KKy8vLyBOb3RlIHRoYXQgdGhlIGxhc3QgdHdvIHNldHMgb2YgYXJndW1lbnRzIGFyZSBub3QgY3VycmVudGx5IGxlbmd0aAorLy8vICAgcHJlZml4ZWQuCitjbGFzcyBTdGF0ZXBvaW50T3BlcnMgeworICAvLyBUT0RPOjogd2Ugc2hvdWxkIGNoYW5nZSB0aGUgU1RBVEVQT0lOVCByZXByZXNlbnRhdGlvbiBzbyB0aGF0IENDIGFuZAorICAvLyBGbGFncyBzaG91bGQgYmUgcGFydCBvZiBtZXRhIG9wZXJhbmRzLCB3aXRoIGFyZ3MgYW5kIGRlb3B0IG9wZXJhbmRzLCBhbmQKKyAgLy8gZ2Mgb3BlcmFuZHMgYWxsIHByZWZpeGVkIGJ5IHRoZWlyIGxlbmd0aCBhbmQgYSB0eXBlIGNvZGUuIFRoaXMgd291bGQgYmUKKyAgLy8gbXVjaCBtb3JlIGNvbnNpc3RlbnQuIAorcHVibGljOgorICAvLyBUaGVzZSB2YWx1ZXMgYXJlIGFib29sdXRlIG9mZnNldHMgaW50byB0aGUgb3BlcmFuZHMgb2YgdGhlIHN0YXRlcG9pbnQKKyAgLy8gaW5zdHJ1Y3Rpb24uCisgIGVudW0geyBJRFBvcywgTkJ5dGVzUG9zLCBOQ2FsbEFyZ3NQb3MsIENhbGxUYXJnZXRQb3MsIE1ldGFFbmQgfTsKKworICAvLyBUaGVzZSB2YWx1ZXMgYXJlIHJlbGF0aXZlIG9mZmVzdHMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHN0YXRlcG9pbnQgbWV0YQorICAvLyBhcmd1bWVudHMgKGkuZS4gdGhlIGVuZCBvZiB0aGUgY2FsbCBhcmd1bWVudHMpLgorICBlbnVtIHsgQ0NPZmZzZXQgPSAxLCBGbGFnc09mZnNldCA9IDMsIE51bURlb3B0T3BlcmFuZHNPZmZzZXQgPSA1IH07CisKKyAgZXhwbGljaXQgU3RhdGVwb2ludE9wZXJzKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIDogTUkoTUkpIHt9CisKKyAgLy8vIEdldCBzdGFydGluZyBpbmRleCBvZiBub24gY2FsbCByZWxhdGVkIGFyZ3VtZW50cworICAvLy8gKGNhbGxpbmcgY29udmVudGlvbiwgc3RhdGVwb2ludCBmbGFncywgdm0gc3RhdGUgYW5kIGdjIHN0YXRlKS4KKyAgdW5zaWduZWQgZ2V0VmFySWR4KCkgY29uc3QgeworICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZChOQ2FsbEFyZ3NQb3MpLmdldEltbSgpICsgTWV0YUVuZDsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIElEIGZvciB0aGUgZ2l2ZW4gc3RhdGVwb2ludC4KKyAgdWludDY0X3QgZ2V0SUQoKSBjb25zdCB7IHJldHVybiBNSS0+Z2V0T3BlcmFuZChJRFBvcykuZ2V0SW1tKCk7IH0KKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgcGF0Y2hhYmxlIGJ5dGVzIHRoZSBnaXZlbiBzdGF0ZXBvaW50IHNob3VsZCBlbWl0LgorICB1aW50MzJfdCBnZXROdW1QYXRjaEJ5dGVzKCkgY29uc3QgeworICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZChOQnl0ZXNQb3MpLmdldEltbSgpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHRhcmdldCBvZiB0aGUgdW5kZXJseWluZyBjYWxsLgorICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmZ2V0Q2FsbFRhcmdldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTUktPmdldE9wZXJhbmQoQ2FsbFRhcmdldFBvcyk7CisgIH0KKworcHJpdmF0ZToKKyAgY29uc3QgTWFjaGluZUluc3RyICpNSTsKK307CisKK2NsYXNzIFN0YWNrTWFwcyB7CitwdWJsaWM6CisgIHN0cnVjdCBMb2NhdGlvbiB7CisgICAgZW51bSBMb2NhdGlvblR5cGUgeworICAgICAgVW5wcm9jZXNzZWQsCisgICAgICBSZWdpc3RlciwKKyAgICAgIERpcmVjdCwKKyAgICAgIEluZGlyZWN0LAorICAgICAgQ29uc3RhbnQsCisgICAgICBDb25zdGFudEluZGV4CisgICAgfTsKKyAgICBMb2NhdGlvblR5cGUgVHlwZSA9IFVucHJvY2Vzc2VkOworICAgIHVuc2lnbmVkIFNpemUgPSAwOworICAgIHVuc2lnbmVkIFJlZyA9IDA7CisgICAgaW50NjRfdCBPZmZzZXQgPSAwOworCisgICAgTG9jYXRpb24oKSA9IGRlZmF1bHQ7CisgICAgTG9jYXRpb24oTG9jYXRpb25UeXBlIFR5cGUsIHVuc2lnbmVkIFNpemUsIHVuc2lnbmVkIFJlZywgaW50NjRfdCBPZmZzZXQpCisgICAgICAgIDogVHlwZShUeXBlKSwgU2l6ZShTaXplKSwgUmVnKFJlZyksIE9mZnNldChPZmZzZXQpIHt9CisgIH07CisKKyAgc3RydWN0IExpdmVPdXRSZWcgeworICAgIHVuc2lnbmVkIHNob3J0IFJlZyA9IDA7CisgICAgdW5zaWduZWQgc2hvcnQgRHdhcmZSZWdOdW0gPSAwOworICAgIHVuc2lnbmVkIHNob3J0IFNpemUgPSAwOworCisgICAgTGl2ZU91dFJlZygpID0gZGVmYXVsdDsKKyAgICBMaXZlT3V0UmVnKHVuc2lnbmVkIHNob3J0IFJlZywgdW5zaWduZWQgc2hvcnQgRHdhcmZSZWdOdW0sCisgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBTaXplKQorICAgICAgICA6IFJlZyhSZWcpLCBEd2FyZlJlZ051bShEd2FyZlJlZ051bSksIFNpemUoU2l6ZSkge30KKyAgfTsKKworICAvLyBPcFR5cGVzIGFyZSB1c2VkIHRvIGVuY29kZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZm9sbG93aW5nIGxvZ2ljYWwKKyAgLy8gb3BlcmFuZCAod2hpY2ggbWF5IGNvbnNpc3Qgb2Ygc2V2ZXJhbCBNYWNoaW5lT3BlcmFuZHMpIGZvciB0aGUKKyAgLy8gT3BQYXJzZXIuCisgIHVzaW5nIE9wVHlwZSA9IGVudW0geyBEaXJlY3RNZW1SZWZPcCwgSW5kaXJlY3RNZW1SZWZPcCwgQ29uc3RhbnRPcCB9OworCisgIFN0YWNrTWFwcyhBc21QcmludGVyICZBUCk7CisKKyAgdm9pZCByZXNldCgpIHsKKyAgICBDU0luZm9zLmNsZWFyKCk7CisgICAgQ29uc3RQb29sLmNsZWFyKCk7CisgICAgRm5JbmZvcy5jbGVhcigpOworICB9CisKKyAgLy8vIFxicmllZiBHZW5lcmF0ZSBhIHN0YWNrbWFwIHJlY29yZCBmb3IgYSBzdGFja21hcCBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBNSSBtdXN0IGJlIGEgcmF3IFNUQUNLTUFQLCBub3QgYSBQQVRDSFBPSU5ULgorICB2b2lkIHJlY29yZFN0YWNrTWFwKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpOworCisgIC8vLyBcYnJpZWYgR2VuZXJhdGUgYSBzdGFja21hcCByZWNvcmQgZm9yIGEgcGF0Y2hwb2ludCBpbnN0cnVjdGlvbi4KKyAgdm9pZCByZWNvcmRQYXRjaFBvaW50KGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpOworCisgIC8vLyBcYnJpZWYgR2VuZXJhdGUgYSBzdGFja21hcCByZWNvcmQgZm9yIGEgc3RhdGVwb2ludCBpbnN0cnVjdGlvbi4KKyAgdm9pZCByZWNvcmRTdGF0ZXBvaW50KGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpOworCisgIC8vLyBJZiB0aGVyZSBpcyBhbnkgc3RhY2sgbWFwIGRhdGEsIGNyZWF0ZSBhIHN0YWNrIG1hcCBzZWN0aW9uIGFuZCBzZXJpYWxpemUKKyAgLy8vIHRoZSBtYXAgaW5mbyBpbnRvIGl0LiBUaGlzIGNsZWFycyB0aGUgc3RhY2sgbWFwIGRhdGEgc3RydWN0dXJlcworICAvLy8gYWZ0ZXJ3YXJkcy4KKyAgdm9pZCBzZXJpYWxpemVUb1N0YWNrTWFwU2VjdGlvbigpOworCitwcml2YXRlOgorICBzdGF0aWMgY29uc3QgY2hhciAqV1NNUDsKKworICB1c2luZyBMb2NhdGlvblZlYyA9IFNtYWxsVmVjdG9yPExvY2F0aW9uLCA4PjsKKyAgdXNpbmcgTGl2ZU91dFZlYyA9IFNtYWxsVmVjdG9yPExpdmVPdXRSZWcsIDg+OworICB1c2luZyBDb25zdGFudFBvb2wgPSBNYXBWZWN0b3I8dWludDY0X3QsIHVpbnQ2NF90PjsKKworICBzdHJ1Y3QgRnVuY3Rpb25JbmZvIHsKKyAgICB1aW50NjRfdCBTdGFja1NpemUgPSAwOworICAgIHVpbnQ2NF90IFJlY29yZENvdW50ID0gMTsKKworICAgIEZ1bmN0aW9uSW5mbygpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCBGdW5jdGlvbkluZm8odWludDY0X3QgU3RhY2tTaXplKSA6IFN0YWNrU2l6ZShTdGFja1NpemUpIHt9CisgIH07CisKKyAgc3RydWN0IENhbGxzaXRlSW5mbyB7CisgICAgY29uc3QgTUNFeHByICpDU09mZnNldEV4cHIgPSBudWxscHRyOworICAgIHVpbnQ2NF90IElEID0gMDsKKyAgICBMb2NhdGlvblZlYyBMb2NhdGlvbnM7CisgICAgTGl2ZU91dFZlYyBMaXZlT3V0czsKKworICAgIENhbGxzaXRlSW5mbygpID0gZGVmYXVsdDsKKyAgICBDYWxsc2l0ZUluZm8oY29uc3QgTUNFeHByICpDU09mZnNldEV4cHIsIHVpbnQ2NF90IElELAorICAgICAgICAgICAgICAgICBMb2NhdGlvblZlYyAmJkxvY2F0aW9ucywgTGl2ZU91dFZlYyAmJkxpdmVPdXRzKQorICAgICAgICA6IENTT2Zmc2V0RXhwcihDU09mZnNldEV4cHIpLCBJRChJRCksIExvY2F0aW9ucyhzdGQ6Om1vdmUoTG9jYXRpb25zKSksCisgICAgICAgICAgTGl2ZU91dHMoc3RkOjptb3ZlKExpdmVPdXRzKSkge30KKyAgfTsKKworICB1c2luZyBGbkluZm9NYXAgPSBNYXBWZWN0b3I8Y29uc3QgTUNTeW1ib2wgKiwgRnVuY3Rpb25JbmZvPjsKKyAgdXNpbmcgQ2FsbHNpdGVJbmZvTGlzdCA9IHN0ZDo6dmVjdG9yPENhbGxzaXRlSW5mbz47CisKKyAgQXNtUHJpbnRlciAmQVA7CisgIENhbGxzaXRlSW5mb0xpc3QgQ1NJbmZvczsKKyAgQ29uc3RhbnRQb29sIENvbnN0UG9vbDsKKyAgRm5JbmZvTWFwIEZuSW5mb3M7CisKKyAgTWFjaGluZUluc3RyOjpjb25zdF9tb3BfaXRlcmF0b3IKKyAgcGFyc2VPcGVyYW5kKE1hY2hpbmVJbnN0cjo6Y29uc3RfbW9wX2l0ZXJhdG9yIE1PSSwKKyAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0cjo6Y29uc3RfbW9wX2l0ZXJhdG9yIE1PRSwgTG9jYXRpb25WZWMgJkxvY3MsCisgICAgICAgICAgICAgICBMaXZlT3V0VmVjICZMaXZlT3V0cykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBsaXZlLW91dCByZWdpc3RlciByZWNvcmQgZm9yIHRoZSBnaXZlbiByZWdpc3RlciBAcCBSZWcuCisgIExpdmVPdXRSZWcgY3JlYXRlTGl2ZU91dFJlZyh1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBQYXJzZSB0aGUgcmVnaXN0ZXIgbGl2ZS1vdXQgbWFzayBhbmQgcmV0dXJuIGEgdmVjdG9yIG9mIGxpdmUtb3V0CisgIC8vLyByZWdpc3RlcnMgdGhhdCBuZWVkIHRvIGJlIHJlY29yZGVkIGluIHRoZSBzdGFja21hcC4KKyAgTGl2ZU91dFZlYyBwYXJzZVJlZ2lzdGVyTGl2ZU91dE1hc2soY29uc3QgdWludDMyX3QgKk1hc2spIGNvbnN0OworCisgIC8vLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIE1DIGxvd2VyaW5nIGNvZGUgX2ltbWVkaWF0ZWx5XyBiZWZvcmUKKyAgLy8vIGxvd2VyaW5nIHRoZSBNSSB0byBhbiBNQ0luc3QuIEl0IHJlY29yZHMgd2hlcmUgdGhlIG9wZXJhbmRzIGZvciB0aGUKKyAgLy8vIGluc3RydWN0aW9uIGFyZSBzdG9yZWQsIGFuZCBvdXRwdXRzIGEgbGFiZWwgdG8gcmVjb3JkIHRoZSBvZmZzZXQgb2YKKyAgLy8vIHRoZSBjYWxsIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHNlY3Rpb24uIEluIHNwZWNpYWwgY2FzZXMgKGUuZy4gQW55UmVnCisgIC8vLyBjYWxsaW5nIGNvbnZlbnRpb24pIHRoZSByZXR1cm4gcmVnaXN0ZXIgaXMgYWxzbyByZWNvcmRlZCBpZiByZXF1ZXN0ZWQuCisgIHZvaWQgcmVjb3JkU3RhY2tNYXBPcGVycyhjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCB1aW50NjRfdCBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0cjo6Y29uc3RfbW9wX2l0ZXJhdG9yIE1PSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0cjo6Y29uc3RfbW9wX2l0ZXJhdG9yIE1PRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVjb3JkUmVzdWx0ID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgRW1pdCB0aGUgc3RhY2ttYXAgaGVhZGVyLgorICB2b2lkIGVtaXRTdGFja21hcEhlYWRlcihNQ1N0cmVhbWVyICZPUyk7CisKKyAgLy8vIFxicmllZiBFbWl0IHRoZSBmdW5jdGlvbiBmcmFtZSByZWNvcmQgZm9yIGVhY2ggZnVuY3Rpb24uCisgIHZvaWQgZW1pdEZ1bmN0aW9uRnJhbWVSZWNvcmRzKE1DU3RyZWFtZXIgJk9TKTsKKworICAvLy8gXGJyaWVmIEVtaXQgdGhlIGNvbnN0YW50IHBvb2wuCisgIHZvaWQgZW1pdENvbnN0YW50UG9vbEVudHJpZXMoTUNTdHJlYW1lciAmT1MpOworCisgIC8vLyBcYnJpZWYgRW1pdCB0aGUgY2FsbHNpdGUgaW5mbyBmb3IgZWFjaCBzdGFja21hcC9wYXRjaHBvaW50IGludHJpbnNpYyBjYWxsLgorICB2b2lkIGVtaXRDYWxsc2l0ZUVudHJpZXMoTUNTdHJlYW1lciAmT1MpOworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKTsKKyAgdm9pZCBkZWJ1ZygpIHsgcHJpbnQoZGJncygpKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9TVEFDS01BUFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1N0YWNrUHJvdGVjdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU3RhY2tQcm90ZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmRlMjEyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1N0YWNrUHJvdGVjdG9yLmgKQEAgLTAsMCArMSwxMzggQEAKKy8vPT09LSBTdGFja1Byb3RlY3Rvci5oIC0gU3RhY2sgUHJvdGVjdG9yIEluc2VydGlvbiAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGluc2VydHMgc3RhY2sgcHJvdGVjdG9ycyBpbnRvIGZ1bmN0aW9ucyB3aGljaCBuZWVkIHRoZW0uIEEgdmFyaWFibGUKKy8vIHdpdGggYSByYW5kb20gdmFsdWUgaW4gaXQgaXMgc3RvcmVkIG9udG8gdGhlIHN0YWNrIGJlZm9yZSB0aGUgbG9jYWwgdmFyaWFibGVzCisvLyBhcmUgYWxsb2NhdGVkLiBVcG9uIGV4aXRpbmcgdGhlIGJsb2NrLCB0aGUgc3RvcmVkIHZhbHVlIGlzIGNoZWNrZWQuIElmIGl0J3MKKy8vIGNoYW5nZWQsIHRoZW4gdGhlcmUgd2FzIHNvbWUgc29ydCBvZiB2aW9sYXRpb24gYW5kIHRoZSBwcm9ncmFtIGFib3J0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TVEFDS1BST1RFQ1RPUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9TVEFDS1BST1RFQ1RPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFRhcmdldExvd2VyaW5nQmFzZTsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CitjbGFzcyBUeXBlOworCitjbGFzcyBTdGFja1Byb3RlY3RvciA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworcHVibGljOgorICAvLy8gU1NQTGF5b3V0S2luZC4gIFN0YWNrIFNtYXNoaW5nIFByb3RlY3Rpb24gKFNTUCkgcnVsZXMgcmVxdWlyZSB0aGF0CisgIC8vLyB2dWxuZXJhYmxlIHN0YWNrIGFsbG9jYXRpb25zIGFyZSBsb2NhdGVkIGNsb3NlIHRoZSBzdGFjayBwcm90ZWN0b3IuCisgIGVudW0gU1NQTGF5b3V0S2luZCB7CisgICAgU1NQTEtfTm9uZSwgICAgICAgLy8vPCBEaWQgbm90IHRyaWdnZXIgYSBzdGFjayBwcm90ZWN0b3IuICBObyBlZmZlY3Qgb24gZGF0YQorICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbGF5b3V0LgorICAgIFNTUExLX0xhcmdlQXJyYXksIC8vLzwgQXJyYXkgb3IgbmVzdGVkIGFycmF5ID49IFNTUC1idWZmZXItc2l6ZS4gIENsb3Nlc3QKKyAgICAgICAgICAgICAgICAgICAgICAvLy88IHRvIHRoZSBzdGFjayBwcm90ZWN0b3IuCisgICAgU1NQTEtfU21hbGxBcnJheSwgLy8vPCBBcnJheSBvciBuZXN0ZWQgYXJyYXkgPCBTU1AtYnVmZmVyLXNpemUuIDJuZCBjbG9zZXN0CisgICAgICAgICAgICAgICAgICAgICAgLy8vPCB0byB0aGUgc3RhY2sgcHJvdGVjdG9yLgorICAgIFNTUExLX0FkZHJPZiAgICAgIC8vLzwgVGhlIGFkZHJlc3Mgb2YgdGhpcyBhbGxvY2F0aW9uIGlzIGV4cG9zZWQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgLy8vPCB0cmlnZ2VyZWQgcHJvdGVjdGlvbi4gIDNyZCBjbG9zZXN0IHRvIHRoZSBwcm90ZWN0b3IuCisgIH07CisKKyAgLy8vIEEgbWFwcGluZyBvZiBBbGxvY2FJbnN0cyB0byB0aGVpciByZXF1aXJlZCBTU1AgbGF5b3V0LgorICB1c2luZyBTU1BMYXlvdXRNYXAgPSBWYWx1ZU1hcDxjb25zdCBBbGxvY2FJbnN0ICosIFNTUExheW91dEtpbmQ+OworCitwcml2YXRlOgorICBjb25zdCBUYXJnZXRNYWNoaW5lICpUTSA9IG51bGxwdHI7CisKKyAgLy8vIFRMSSAtIEtlZXAgYSBwb2ludGVyIG9mIGEgVGFyZ2V0TG93ZXJpbmcgdG8gY29uc3VsdCBmb3IgZGV0ZXJtaW5pbmcKKyAgLy8vIHRhcmdldCB0eXBlIHNpemVzLgorICBjb25zdCBUYXJnZXRMb3dlcmluZ0Jhc2UgKlRMSSA9IG51bGxwdHI7CisgIFRyaXBsZSBUcmlwOworCisgIEZ1bmN0aW9uICpGOworICBNb2R1bGUgKk07CisKKyAgRG9taW5hdG9yVHJlZSAqRFQ7CisKKyAgLy8vIExheW91dCAtIE1hcHBpbmcgb2YgYWxsb2NhdGlvbnMgdG8gdGhlIHJlcXVpcmVkIFNTUExheW91dEtpbmQuCisgIC8vLyBTdGFja1Byb3RlY3RvciBhbmFseXNpcyB3aWxsIHVwZGF0ZSB0aGlzIG1hcCB3aGVuIGRldGVybWluaW5nIGlmIGFuCisgIC8vLyBBbGxvY2FJbnN0IHRyaWdnZXJzIGEgc3RhY2sgcHJvdGVjdG9yLgorICBTU1BMYXlvdXRNYXAgTGF5b3V0OworCisgIC8vLyBcYnJpZWYgVGhlIG1pbmltdW0gc2l6ZSBvZiBidWZmZXJzIHRoYXQgd2lsbCByZWNlaXZlIHN0YWNrIHNtYXNoaW5nCisgIC8vLyBwcm90ZWN0aW9uIHdoZW4gLWZzdGFjay1wcm90ZWN0aW9uIGlzIHVzZWQuCisgIHVuc2lnbmVkIFNTUEJ1ZmZlclNpemUgPSAwOworCisgIC8vLyBWaXNpdGVkUEhJcyAtIFRoZSBzZXQgb2YgUEhJIG5vZGVzIHZpc2l0ZWQgd2hlbiBkZXRlcm1pbmluZworICAvLy8gaWYgYSB2YXJpYWJsZSdzIHJlZmVyZW5jZSBoYXMgYmVlbiB0YWtlbi4gIFRoaXMgc2V0CisgIC8vLyBpcyBtYWludGFpbmVkIHRvIGVuc3VyZSB3ZSBkb24ndCB2aXNpdCB0aGUgc2FtZSBQSEkgbm9kZSBtdWx0aXBsZQorICAvLy8gdGltZXMuCisgIFNtYWxsUHRyU2V0PGNvbnN0IFBISU5vZGUgKiwgMTY+IFZpc2l0ZWRQSElzOworCisgIC8vIEEgcHJvbG9ndWUgaXMgZ2VuZXJhdGVkLgorICBib29sIEhhc1Byb2xvZ3VlID0gZmFsc2U7CisKKyAgLy8gSVIgY2hlY2tpbmcgY29kZSBpcyBnZW5lcmF0ZWQuCisgIGJvb2wgSGFzSVJDaGVjayA9IGZhbHNlOworCisgIC8vLyBJbnNlcnRTdGFja1Byb3RlY3RvcnMgLSBJbnNlcnQgY29kZSBpbnRvIHRoZSBwcm9sb2d1ZSBhbmQgZXBpbG9ndWUgb2YKKyAgLy8vIHRoZSBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyAgLSBUaGUgcHJvbG9ndWUgY29kZSBsb2FkcyBhbmQgc3RvcmVzIHRoZSBzdGFjayBndWFyZCBvbnRvIHRoZSBzdGFjay4KKyAgLy8vICAtIFRoZSBlcGlsb2d1ZSBjaGVja3MgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgcHJvbG9ndWUgYWdhaW5zdCB0aGUKKyAgLy8vICAgIG9yaWdpbmFsIHZhbHVlLiBJdCBjYWxscyBfX3N0YWNrX2Noa19mYWlsIGlmIHRoZXkgZGlmZmVyLgorICBib29sIEluc2VydFN0YWNrUHJvdGVjdG9ycygpOworCisgIC8vLyBDcmVhdGVGYWlsQkIgLSBDcmVhdGUgYSBiYXNpYyBibG9jayB0byBqdW1wIHRvIHdoZW4gdGhlIHN0YWNrIHByb3RlY3RvcgorICAvLy8gY2hlY2sgZmFpbHMuCisgIEJhc2ljQmxvY2sgKkNyZWF0ZUZhaWxCQigpOworCisgIC8vLyBDb250YWluc1Byb3RlY3RhYmxlQXJyYXkgLSBDaGVjayB3aGV0aGVyIHRoZSB0eXBlIGVpdGhlciBpcyBhbiBhcnJheSBvcgorICAvLy8gY29udGFpbnMgYW4gYXJyYXkgb2Ygc3VmZmljaWVudCBzaXplIHNvIHRoYXQgd2UgbmVlZCBzdGFjayBwcm90ZWN0b3JzCisgIC8vLyBmb3IgaXQuCisgIC8vLyBccGFyYW0gW291dF0gSXNMYXJnZSBpcyBzZXQgdG8gdHJ1ZSBpZiBhIHByb3RlY3RhYmxlIGFycmF5IGlzIGZvdW5kIGFuZAorICAvLy8gaXQgaXMgImxhcmdlIiAoID49IHNzcC1idWZmZXItc2l6ZSkuICBJbiB0aGUgY2FzZSBvZiBhIHN0cnVjdHVyZSB3aXRoCisgIC8vLyBtdWx0aXBsZSBhcnJheXMsIHRoaXMgZ2V0cyBzZXQgaWYgYW55IG9mIHRoZW0gaXMgbGFyZ2UuCisgIGJvb2wgQ29udGFpbnNQcm90ZWN0YWJsZUFycmF5KFR5cGUgKlR5LCBib29sICZJc0xhcmdlLCBib29sIFN0cm9uZyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluU3RydWN0ID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQ2hlY2sgd2hldGhlciBhIHN0YWNrIGFsbG9jYXRpb24gaGFzIGl0cyBhZGRyZXNzIHRha2VuLgorICBib29sIEhhc0FkZHJlc3NUYWtlbihjb25zdCBJbnN0cnVjdGlvbiAqQUkpOworCisgIC8vLyBSZXF1aXJlc1N0YWNrUHJvdGVjdG9yIC0gQ2hlY2sgd2hldGhlciBvciBub3QgdGhpcyBmdW5jdGlvbiBuZWVkcyBhCisgIC8vLyBzdGFjayBwcm90ZWN0b3IgYmFzZWQgdXBvbiB0aGUgc3RhY2sgcHJvdGVjdG9yIGxldmVsLgorICBib29sIFJlcXVpcmVzU3RhY2tQcm90ZWN0b3IoKTsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZC4KKworICBTdGFja1Byb3RlY3RvcigpIDogRnVuY3Rpb25QYXNzKElEKSwgU1NQQnVmZmVyU2l6ZSg4KSB7CisgICAgaW5pdGlhbGl6ZVN0YWNrUHJvdGVjdG9yUGFzcygqUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKSk7CisgIH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIFNTUExheW91dEtpbmQgZ2V0U1NQTGF5b3V0KGNvbnN0IEFsbG9jYUluc3QgKkFJKSBjb25zdDsKKworICAvLyBSZXR1cm4gdHJ1ZSBpZiBTdGFja1Byb3RlY3RvciBpcyBzdXBwb3NlZCB0byBiZSBoYW5kbGVkIGJ5IFNlbGVjdGlvbkRBRy4KKyAgYm9vbCBzaG91bGRFbWl0U0RDaGVjayhjb25zdCBCYXNpY0Jsb2NrICZCQikgY29uc3Q7CisKKyAgdm9pZCBhZGp1c3RGb3JDb2xvcmluZyhjb25zdCBBbGxvY2FJbnN0ICpGcm9tLCBjb25zdCBBbGxvY2FJbnN0ICpUbyk7CisKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGbikgb3ZlcnJpZGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1NUQUNLUFJPVEVDVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYWlsRHVwbGljYXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhaWxEdXBsaWNhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU2NTYyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYWlsRHVwbGljYXRvci5oCkBAIC0wLDAgKzEsMTI4IEBACisvLz09PS0gbGx2bS9Db2RlR2VuL1RhaWxEdXBsaWNhdG9yLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBUYWlsRHVwbGljYXRvciBjbGFzcy4gVXNlZCBieSB0aGUKKy8vIFRhaWxEdXBsaWNhdGlvbiBwYXNzLCBhbmQgTWFjaGluZUJsb2NrUGxhY2VtZW50LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1RBSUxEVVBMSUNBVE9SX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1RBSUxEVVBMSUNBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIE1hY2hpbmVCcmFuY2hQcm9iYWJpbGl0eUluZm87CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBNYWNoaW5lTW9kdWxlSW5mbzsKK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CisKKy8vLyBVdGlsaXR5IGNsYXNzIHRvIHBlcmZvcm0gdGFpbCBkdXBsaWNhdGlvbi4KK2NsYXNzIFRhaWxEdXBsaWNhdG9yIHsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJOworICBjb25zdCBNYWNoaW5lQnJhbmNoUHJvYmFiaWxpdHlJbmZvICpNQlBJOworICBjb25zdCBNYWNoaW5lTW9kdWxlSW5mbyAqTU1JOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkk7CisgIE1hY2hpbmVGdW5jdGlvbiAqTUY7CisgIGJvb2wgUHJlUmVnQWxsb2M7CisgIGJvb2wgTGF5b3V0TW9kZTsKKyAgdW5zaWduZWQgVGFpbER1cFNpemU7CisKKyAgLy8gQSBsaXN0IG9mIHZpcnR1YWwgcmVnaXN0ZXJzIGZvciB3aGljaCB0byB1cGRhdGUgU1NBIGZvcm0uCisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAxNj4gU1NBVXBkYXRlVlJzOworCisgIC8vIEZvciBlYWNoIHZpcnR1YWwgcmVnaXN0ZXIgaW4gU1NBVXBkYXRlVmFscyBrZWVwIGEgbGlzdCBvZiBzb3VyY2UgdmlydHVhbAorICAvLyByZWdpc3RlcnMuCisgIHVzaW5nIEF2YWlsYWJsZVZhbHNUeSA9IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxNYWNoaW5lQmFzaWNCbG9jayAqLCB1bnNpZ25lZD4+OworCisgIERlbnNlTWFwPHVuc2lnbmVkLCBBdmFpbGFibGVWYWxzVHk+IFNTQVVwZGF0ZVZhbHM7CisKK3B1YmxpYzoKKyAgLy8vIFByZXBhcmUgdG8gcnVuIG9uIGEgc3BlY2lmaWMgbWFjaGluZSBmdW5jdGlvbi4KKyAgLy8vIEBwYXJhbSBNRiAtIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBwcm9jZXNzZWQKKyAgLy8vIEBwYXJhbSBQcmVSZWdBbGxvYyAtIHRydWUgaWYgdXNlZCBiZWZvcmUgcmVnaXN0ZXIgYWxsb2NhdGlvbgorICAvLy8gQHBhcmFtIE1CUEkgLSBCcmFuY2ggUHJvYmFiaWxpdHkgSW5mby4gVXNlZCB0byBwcm9wYWdhdGUgY29ycmVjdAorICAvLy8gICAgIHByb2JhYmlsaXRpZXMgd2hlbiBtb2RpZnlpbmcgdGhlIENGRy4KKyAgLy8vIEBwYXJhbSBMYXlvdXRNb2RlIC0gV2hlbiB0cnVlLCBkb24ndCB1c2UgdGhlIGV4aXN0aW5nIGxheW91dCB0byBtYWtlCisgIC8vLyAgICAgZGVjaXNpb25zLgorICAvLy8gQHBhcmFtIFRhaWxEdXBTaXplIC0gTWF4bWltdW0gc2l6ZSBvZiBibG9ja3MgdG8gdGFpbC1kdXBsaWNhdGUuIFplcm8KKyAgLy8vICAgICBkZWZhdWx0IGltcGxpZXMgdXNpbmcgdGhlIGNvbW1hbmQgbGluZSB2YWx1ZSBUYWlsRHVwU2l6ZS4KKyAgdm9pZCBpbml0TUYoTWFjaGluZUZ1bmN0aW9uICZNRiwgYm9vbCBQcmVSZWdBbGxvYywKKyAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJyYW5jaFByb2JhYmlsaXR5SW5mbyAqTUJQSSwKKyAgICAgICAgICAgICAgYm9vbCBMYXlvdXRNb2RlLCB1bnNpZ25lZCBUYWlsRHVwU2l6ZSA9IDApOworCisgIGJvb2wgdGFpbER1cGxpY2F0ZUJsb2NrcygpOworICBzdGF0aWMgYm9vbCBpc1NpbXBsZUJCKE1hY2hpbmVCYXNpY0Jsb2NrICpUYWlsQkIpOworICBib29sIHNob3VsZFRhaWxEdXBsaWNhdGUoYm9vbCBJc1NpbXBsZSwgTWFjaGluZUJhc2ljQmxvY2sgJlRhaWxCQik7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBUYWlsQkIgY2FuIHN1Y2Nlc3NmdWxseSBiZSBkdXBsaWNhdGVkIGludG8gUHJlZEJCCisgIGJvb2wgY2FuVGFpbER1cGxpY2F0ZShNYWNoaW5lQmFzaWNCbG9jayAqVGFpbEJCLCBNYWNoaW5lQmFzaWNCbG9jayAqUHJlZEJCKTsKKworICAvLy8gVGFpbCBkdXBsaWNhdGUgYSBzaW5nbGUgYmFzaWMgYmxvY2sgaW50byBpdHMgcHJlZGVjZXNzb3JzLCBhbmQgdGhlbiBjbGVhbgorICAvLy8gdXAuCisgIC8vLyBJZiBccCBEdXBsaWNhdGVQcmVkcyBpcyBub3QgbnVsbCwgaXQgd2lsbCBiZSB1cGRhdGVkIHRvIGNvbnRhaW4gdGhlIGxpc3QKKyAgLy8vIG9mIHByZWRlY2Vzc29ycyB0aGF0IHJlY2VpdmVkIGEgY29weSBvZiBccCBNQkIuCisgIC8vLyBJZiBccCBSZW1vdmFsQ2FsbGJhY2sgaXMgbm9uLW51bGwuIEl0IHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBNQkIgaXMKKyAgLy8vIGRlbGV0ZWQuCisgIGJvb2wgdGFpbER1cGxpY2F0ZUFuZFVwZGF0ZSgKKyAgICAgIGJvb2wgSXNTaW1wbGUsIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRm9yY2VkTGF5b3V0UHJlZCwKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lQmFzaWNCbG9jayo+ICpEdXBsaWNhdGVkUHJlZHMgPSBudWxscHRyLAorICAgICAgZnVuY3Rpb25fcmVmPHZvaWQoTWFjaGluZUJhc2ljQmxvY2sgKik+ICpSZW1vdmFsQ2FsbGJhY2sgPSBudWxscHRyKTsKKworcHJpdmF0ZToKKyAgdXNpbmcgUmVnU3ViUmVnUGFpciA9IFRhcmdldEluc3RySW5mbzo6UmVnU3ViUmVnUGFpcjsKKworICB2b2lkIGFkZFNTQVVwZGF0ZUVudHJ5KHVuc2lnbmVkIE9yaWdSZWcsIHVuc2lnbmVkIE5ld1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkIpOworICB2b2lkIHByb2Nlc3NQSEkoTWFjaGluZUluc3RyICpNSSwgTWFjaGluZUJhc2ljQmxvY2sgKlRhaWxCQiwKKyAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpQcmVkQkIsCisgICAgICAgICAgICAgICAgICBEZW5zZU1hcDx1bnNpZ25lZCwgUmVnU3ViUmVnUGFpcj4gJkxvY2FsVlJNYXAsCisgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPHVuc2lnbmVkLCBSZWdTdWJSZWdQYWlyPj4gJkNvcGllcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IERlbnNlU2V0PHVuc2lnbmVkPiAmVXNlZEJ5UGhpLCBib29sIFJlbW92ZSk7CisgIHZvaWQgZHVwbGljYXRlSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICpNSSwgTWFjaGluZUJhc2ljQmxvY2sgKlRhaWxCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqUHJlZEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPHVuc2lnbmVkLCBSZWdTdWJSZWdQYWlyPiAmTG9jYWxWUk1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZW5zZVNldDx1bnNpZ25lZD4gJlVzZWRCeVBoaSk7CisgIHZvaWQgdXBkYXRlU3VjY2Vzc29yc1BISXMoTWFjaGluZUJhc2ljQmxvY2sgKkZyb21CQiwgYm9vbCBpc0RlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVCYXNpY0Jsb2NrICo+ICZUREJCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFNldFZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayAqLCA4PiAmU3VjY3MpOworICBib29sIGNhbkNvbXBsZXRlbHlEdXBsaWNhdGVCQihNYWNoaW5lQmFzaWNCbG9jayAmQkIpOworICBib29sIGR1cGxpY2F0ZVNpbXBsZUJCKE1hY2hpbmVCYXNpY0Jsb2NrICpUYWlsQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVCYXNpY0Jsb2NrICo+ICZUREJCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZW5zZVNldDx1bnNpZ25lZD4gJlJlZ3NVc2VkQnlQaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0ciAqPiAmQ29waWVzKTsKKyAgYm9vbCB0YWlsRHVwbGljYXRlKGJvb2wgSXNTaW1wbGUsCisgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqVGFpbEJCLAorICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkZvcmNlZExheW91dFByZWQsCisgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUJhc2ljQmxvY2sgKj4gJlREQkJzLAorICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0ciAqPiAmQ29waWVzKTsKKyAgdm9pZCBhcHBlbmRDb3BpZXMoTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjx1bnNpZ25lZCxSZWdTdWJSZWdQYWlyPj4gJkNvcHlJbmZvcywKKyAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0ciAqPiAmQ29waWVzKTsKKworICB2b2lkIHJlbW92ZURlYWRCbG9jaygKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICBmdW5jdGlvbl9yZWY8dm9pZChNYWNoaW5lQmFzaWNCbG9jayAqKT4gKlJlbW92YWxDYWxsYmFjayA9IG51bGxwdHIpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9UQUlMRFVQTElDQVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0Q2FsbGluZ0NvbnYuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRDYWxsaW5nQ29udi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMTM4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0Q2FsbGluZ0NvbnYuaApAQCAtMCwwICsxLDIwNCBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vVGFyZ2V0Q2FsbGluZ0NvbnYuaCAtIENhbGxpbmcgQ29udmVudGlvbiAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0eXBlcyBmb3Igd29ya2luZyB3aXRoIGNhbGxpbmctY29udmVudGlvbiBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9UQVJHRVRDQUxMSU5HQ09OVl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9UQVJHRVRDQUxMSU5HQ09OVl9ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYWNoaW5lVmFsdWVUeXBlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIElTRCB7CisKKyAgc3RydWN0IEFyZ0ZsYWdzVHkgeworICBwcml2YXRlOgorICAgIHVuc2lnbmVkIElzWkV4dCA6IDE7ICAgICAvLy88IFplcm8gZXh0ZW5kZWQKKyAgICB1bnNpZ25lZCBJc1NFeHQgOiAxOyAgICAgLy8vPCBTaWduIGV4dGVuZGVkCisgICAgdW5zaWduZWQgSXNJblJlZyA6IDE7ICAgIC8vLzwgUGFzc2VkIGluIHJlZ2lzdGVyCisgICAgdW5zaWduZWQgSXNTUmV0IDogMTsgICAgIC8vLzwgSGlkZGVuIHN0cnVjdC1yZXQgcHRyCisgICAgdW5zaWduZWQgSXNCeVZhbCA6IDE7ICAgIC8vLzwgU3RydWN0IHBhc3NlZCBieSB2YWx1ZQorICAgIHVuc2lnbmVkIElzTmVzdCA6IDE7ICAgICAvLy88IE5lc3RlZCBmbiBzdGF0aWMgY2hhaW4KKyAgICB1bnNpZ25lZCBJc1JldHVybmVkIDogMTsgLy8vPCBBbHdheXMgcmV0dXJuZWQKKyAgICB1bnNpZ25lZCBJc1NwbGl0IDogMTsKKyAgICB1bnNpZ25lZCBJc0luQWxsb2NhIDogMTsgICAvLy88IFBhc3NlZCB3aXRoIGluYWxsb2NhCisgICAgdW5zaWduZWQgSXNTcGxpdEVuZCA6IDE7ICAgLy8vPCBMYXN0IHBhcnQgb2YgYSBzcGxpdAorICAgIHVuc2lnbmVkIElzU3dpZnRTZWxmIDogMTsgIC8vLzwgU3dpZnQgc2VsZiBwYXJhbWV0ZXIKKyAgICB1bnNpZ25lZCBJc1N3aWZ0RXJyb3IgOiAxOyAvLy88IFN3aWZ0IGVycm9yIHBhcmFtZXRlcgorICAgIHVuc2lnbmVkIElzSHZhIDogMTsgICAgICAgIC8vLzwgSFZBIGZpZWxkIGZvcgorICAgIHVuc2lnbmVkIElzSHZhU3RhcnQgOiAxOyAgIC8vLzwgSFZBIHN0cnVjdHVyZSBzdGFydAorICAgIHVuc2lnbmVkIElzU2VjQXJnUGFzcyA6IDE7IC8vLzwgU2Vjb25kIGFyZ3VtZW50CisgICAgdW5zaWduZWQgQnlWYWxBbGlnbiA6IDQ7ICAgLy8vPCBMb2cgMiBvZiBieXZhbCBhbGlnbm1lbnQKKyAgICB1bnNpZ25lZCBPcmlnQWxpZ24gOiA1OyAgICAvLy88IExvZyAyIG9mIG9yaWdpbmFsIGFsaWdubWVudAorICAgIHVuc2lnbmVkIElzSW5Db25zZWN1dGl2ZVJlZ3NMYXN0IDogMTsKKyAgICB1bnNpZ25lZCBJc0luQ29uc2VjdXRpdmVSZWdzIDogMTsKKyAgICB1bnNpZ25lZCBJc0NvcHlFbGlzaW9uQ2FuZGlkYXRlIDogMTsgLy8vPCBBcmd1bWVudCBjb3B5IGVsaXNpb24gY2FuZGlkYXRlCisKKyAgICB1bnNpZ25lZCBCeVZhbFNpemU7IC8vLzwgQnl2YWwgc3RydWN0IHNpemUKKworICBwdWJsaWM6CisgICAgQXJnRmxhZ3NUeSgpCisgICAgICAgIDogSXNaRXh0KDApLCBJc1NFeHQoMCksIElzSW5SZWcoMCksIElzU1JldCgwKSwgSXNCeVZhbCgwKSwgSXNOZXN0KDApLAorICAgICAgICAgIElzUmV0dXJuZWQoMCksIElzU3BsaXQoMCksIElzSW5BbGxvY2EoMCksIElzU3BsaXRFbmQoMCksCisgICAgICAgICAgSXNTd2lmdFNlbGYoMCksIElzU3dpZnRFcnJvcigwKSwgSXNIdmEoMCksIElzSHZhU3RhcnQoMCksCisgICAgICAgICAgSXNTZWNBcmdQYXNzKDApLCBCeVZhbEFsaWduKDApLCBPcmlnQWxpZ24oMCksCisgICAgICAgICAgSXNJbkNvbnNlY3V0aXZlUmVnc0xhc3QoMCksIElzSW5Db25zZWN1dGl2ZVJlZ3MoMCksCisgICAgICAgICAgSXNDb3B5RWxpc2lvbkNhbmRpZGF0ZSgwKSwgQnlWYWxTaXplKDApIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKCp0aGlzKSA9PSAyICogc2l6ZW9mKHVuc2lnbmVkKSwgImZsYWdzIGFyZSB0b28gYmlnIik7CisgICAgfQorCisgICAgYm9vbCBpc1pFeHQoKSBjb25zdCB7IHJldHVybiBJc1pFeHQ7IH0KKyAgICB2b2lkIHNldFpFeHQoKSB7IElzWkV4dCA9IDE7IH0KKworICAgIGJvb2wgaXNTRXh0KCkgY29uc3QgeyByZXR1cm4gSXNTRXh0OyB9CisgICAgdm9pZCBzZXRTRXh0KCkgeyBJc1NFeHQgPSAxOyB9CisKKyAgICBib29sIGlzSW5SZWcoKSBjb25zdCB7IHJldHVybiBJc0luUmVnOyB9CisgICAgdm9pZCBzZXRJblJlZygpIHsgSXNJblJlZyA9IDE7IH0KKworICAgIGJvb2wgaXNTUmV0KCkgY29uc3QgeyByZXR1cm4gSXNTUmV0OyB9CisgICAgdm9pZCBzZXRTUmV0KCkgeyBJc1NSZXQgPSAxOyB9CisKKyAgICBib29sIGlzQnlWYWwoKSBjb25zdCB7IHJldHVybiBJc0J5VmFsOyB9CisgICAgdm9pZCBzZXRCeVZhbCgpIHsgSXNCeVZhbCA9IDE7IH0KKworICAgIGJvb2wgaXNJbkFsbG9jYSgpIGNvbnN0IHsgcmV0dXJuIElzSW5BbGxvY2E7IH0KKyAgICB2b2lkIHNldEluQWxsb2NhKCkgeyBJc0luQWxsb2NhID0gMTsgfQorCisgICAgYm9vbCBpc1N3aWZ0U2VsZigpIGNvbnN0IHsgcmV0dXJuIElzU3dpZnRTZWxmOyB9CisgICAgdm9pZCBzZXRTd2lmdFNlbGYoKSB7IElzU3dpZnRTZWxmID0gMTsgfQorCisgICAgYm9vbCBpc1N3aWZ0RXJyb3IoKSBjb25zdCB7IHJldHVybiBJc1N3aWZ0RXJyb3I7IH0KKyAgICB2b2lkIHNldFN3aWZ0RXJyb3IoKSB7IElzU3dpZnRFcnJvciA9IDE7IH0KKworICAgIGJvb2wgaXNIdmEoKSBjb25zdCB7IHJldHVybiBJc0h2YTsgfQorICAgIHZvaWQgc2V0SHZhKCkgeyBJc0h2YSA9IDE7IH0KKworICAgIGJvb2wgaXNIdmFTdGFydCgpIGNvbnN0IHsgcmV0dXJuIElzSHZhU3RhcnQ7IH0KKyAgICB2b2lkIHNldEh2YVN0YXJ0KCkgeyBJc0h2YVN0YXJ0ID0gMTsgfQorCisgICAgYm9vbCBpc1NlY0FyZ1Bhc3MoKSBjb25zdCB7IHJldHVybiBJc1NlY0FyZ1Bhc3M7IH0KKyAgICB2b2lkIHNldFNlY0FyZ1Bhc3MoKSB7IElzU2VjQXJnUGFzcyA9IDE7IH0KKworICAgIGJvb2wgaXNOZXN0KCkgY29uc3QgeyByZXR1cm4gSXNOZXN0OyB9CisgICAgdm9pZCBzZXROZXN0KCkgeyBJc05lc3QgPSAxOyB9CisKKyAgICBib29sIGlzUmV0dXJuZWQoKSBjb25zdCB7IHJldHVybiBJc1JldHVybmVkOyB9CisgICAgdm9pZCBzZXRSZXR1cm5lZCgpIHsgSXNSZXR1cm5lZCA9IDE7IH0KKworICAgIGJvb2wgaXNJbkNvbnNlY3V0aXZlUmVncygpICBjb25zdCB7IHJldHVybiBJc0luQ29uc2VjdXRpdmVSZWdzOyB9CisgICAgdm9pZCBzZXRJbkNvbnNlY3V0aXZlUmVncygpIHsgSXNJbkNvbnNlY3V0aXZlUmVncyA9IDE7IH0KKworICAgIGJvb2wgaXNJbkNvbnNlY3V0aXZlUmVnc0xhc3QoKSBjb25zdCB7IHJldHVybiBJc0luQ29uc2VjdXRpdmVSZWdzTGFzdDsgfQorICAgIHZvaWQgc2V0SW5Db25zZWN1dGl2ZVJlZ3NMYXN0KCkgeyBJc0luQ29uc2VjdXRpdmVSZWdzTGFzdCA9IDE7IH0KKworICAgIGJvb2wgaXNTcGxpdCgpICAgY29uc3QgeyByZXR1cm4gSXNTcGxpdDsgfQorICAgIHZvaWQgc2V0U3BsaXQoKSAgeyBJc1NwbGl0ID0gMTsgfQorCisgICAgYm9vbCBpc1NwbGl0RW5kKCkgICBjb25zdCB7IHJldHVybiBJc1NwbGl0RW5kOyB9CisgICAgdm9pZCBzZXRTcGxpdEVuZCgpICB7IElzU3BsaXRFbmQgPSAxOyB9CisKKyAgICBib29sIGlzQ29weUVsaXNpb25DYW5kaWRhdGUoKSAgY29uc3QgeyByZXR1cm4gSXNDb3B5RWxpc2lvbkNhbmRpZGF0ZTsgfQorICAgIHZvaWQgc2V0Q29weUVsaXNpb25DYW5kaWRhdGUoKSB7IElzQ29weUVsaXNpb25DYW5kaWRhdGUgPSAxOyB9CisKKyAgICB1bnNpZ25lZCBnZXRCeVZhbEFsaWduKCkgY29uc3QgeyByZXR1cm4gKDFVIDw8IEJ5VmFsQWxpZ24pIC8gMjsgfQorICAgIHZvaWQgc2V0QnlWYWxBbGlnbih1bnNpZ25lZCBBKSB7CisgICAgICBCeVZhbEFsaWduID0gTG9nMl8zMihBKSArIDE7CisgICAgICBhc3NlcnQoZ2V0QnlWYWxBbGlnbigpID09IEEgJiYgImJpdGZpZWxkIG92ZXJmbG93Iik7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0T3JpZ0FsaWduKCkgY29uc3QgeyByZXR1cm4gKDFVIDw8IE9yaWdBbGlnbikgLyAyOyB9CisgICAgdm9pZCBzZXRPcmlnQWxpZ24odW5zaWduZWQgQSkgeworICAgICAgT3JpZ0FsaWduID0gTG9nMl8zMihBKSArIDE7CisgICAgICBhc3NlcnQoZ2V0T3JpZ0FsaWduKCkgPT0gQSAmJiAiYml0ZmllbGQgb3ZlcmZsb3ciKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXRCeVZhbFNpemUoKSBjb25zdCB7IHJldHVybiBCeVZhbFNpemU7IH0KKyAgICB2b2lkIHNldEJ5VmFsU2l6ZSh1bnNpZ25lZCBTKSB7IEJ5VmFsU2l6ZSA9IFM7IH0KKyAgfTsKKworICAvLy8gSW5wdXRBcmcgLSBUaGlzIHN0cnVjdCBjYXJyaWVzIGZsYWdzIGFuZCB0eXBlIGluZm9ybWF0aW9uIGFib3V0IGEKKyAgLy8vIHNpbmdsZSBpbmNvbWluZyAoZm9ybWFsKSBhcmd1bWVudCBvciBpbmNvbWluZyAoZnJvbSB0aGUgcGVyc3BlY3RpdmUKKyAgLy8vIG9mIHRoZSBjYWxsZXIpIHJldHVybiB2YWx1ZSB2aXJ0dWFsIHJlZ2lzdGVyLgorICAvLy8KKyAgc3RydWN0IElucHV0QXJnIHsKKyAgICBBcmdGbGFnc1R5IEZsYWdzOworICAgIE1WVCBWVCA9IE1WVDo6T3RoZXI7CisgICAgRVZUIEFyZ1ZUOworICAgIGJvb2wgVXNlZCA9IGZhbHNlOworCisgICAgLy8vIEluZGV4IG9yaWdpbmFsIEZ1bmN0aW9uJ3MgYXJndW1lbnQuCisgICAgdW5zaWduZWQgT3JpZ0FyZ0luZGV4OworICAgIC8vLyBTZW50aW5lbCB2YWx1ZSBmb3IgaW1wbGljaXQgbWFjaGluZS1sZXZlbCBpbnB1dCBhcmd1bWVudHMuCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE5vQXJnSW5kZXggPSBVSU5UX01BWDsKKworICAgIC8vLyBPZmZzZXQgaW4gYnl0ZXMgb2YgY3VycmVudCBpbnB1dCB2YWx1ZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mCisgICAgLy8vIG9yaWdpbmFsIGFyZ3VtZW50LiBFLmcuIGlmIGFyZ3VtZW50IHdhcyBzcGxpdHRlZCBpbnRvIGZvdXIgMzIgYml0CisgICAgLy8vIHJlZ2lzdGVycywgd2UgZ290IDQgSW5wdXRBcmdzIHdpdGggUGFydE9mZnNldHMgMCwgNCwgOCBhbmQgMTIuCisgICAgdW5zaWduZWQgUGFydE9mZnNldDsKKworICAgIElucHV0QXJnKCkgPSBkZWZhdWx0OworICAgIElucHV0QXJnKEFyZ0ZsYWdzVHkgZmxhZ3MsIEVWVCB2dCwgRVZUIGFyZ3Z0LCBib29sIHVzZWQsCisgICAgICAgICAgICAgdW5zaWduZWQgb3JpZ0lkeCwgdW5zaWduZWQgcGFydE9mZnMpCisgICAgICA6IEZsYWdzKGZsYWdzKSwgVXNlZCh1c2VkKSwgT3JpZ0FyZ0luZGV4KG9yaWdJZHgpLCBQYXJ0T2Zmc2V0KHBhcnRPZmZzKSB7CisgICAgICBWVCA9IHZ0LmdldFNpbXBsZVZUKCk7CisgICAgICBBcmdWVCA9IGFyZ3Z0OworICAgIH0KKworICAgIGJvb2wgaXNPcmlnQXJnKCkgY29uc3QgeworICAgICAgcmV0dXJuIE9yaWdBcmdJbmRleCAhPSBOb0FyZ0luZGV4OworICAgIH0KKworICAgIHVuc2lnbmVkIGdldE9yaWdBcmdJbmRleCgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChPcmlnQXJnSW5kZXggIT0gTm9BcmdJbmRleCAmJiAiSW1wbGljaXQgbWFjaGluZS1sZXZlbCBhcmd1bWVudCIpOworICAgICAgcmV0dXJuIE9yaWdBcmdJbmRleDsKKyAgICB9CisgIH07CisKKyAgLy8vIE91dHB1dEFyZyAtIFRoaXMgc3RydWN0IGNhcnJpZXMgZmxhZ3MgYW5kIGEgdmFsdWUgZm9yIGEKKyAgLy8vIHNpbmdsZSBvdXRnb2luZyAoYWN0dWFsKSBhcmd1bWVudCBvciBvdXRnb2luZyAoZnJvbSB0aGUgcGVyc3BlY3RpdmUKKyAgLy8vIG9mIHRoZSBjYWxsZXIpIHJldHVybiB2YWx1ZSB2aXJ0dWFsIHJlZ2lzdGVyLgorICAvLy8KKyAgc3RydWN0IE91dHB1dEFyZyB7CisgICAgQXJnRmxhZ3NUeSBGbGFnczsKKyAgICBNVlQgVlQ7CisgICAgRVZUIEFyZ1ZUOworCisgICAgLy8vIElzRml4ZWQgLSBJcyB0aGlzIGEgImZpeGVkIiB2YWx1ZSwgaWUgbm90IHBhc3NlZCB0aHJvdWdoIGEgdmFyYXJnICIuLi4iLgorICAgIGJvb2wgSXNGaXhlZCA9IGZhbHNlOworCisgICAgLy8vIEluZGV4IG9yaWdpbmFsIEZ1bmN0aW9uJ3MgYXJndW1lbnQuCisgICAgdW5zaWduZWQgT3JpZ0FyZ0luZGV4OworCisgICAgLy8vIE9mZnNldCBpbiBieXRlcyBvZiBjdXJyZW50IG91dHB1dCB2YWx1ZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mCisgICAgLy8vIG9yaWdpbmFsIGFyZ3VtZW50LiBFLmcuIGlmIGFyZ3VtZW50IHdhcyBzcGxpdHRlZCBpbnRvIGZvdXIgMzIgYml0CisgICAgLy8vIHJlZ2lzdGVycywgd2UgZ290IDQgT3V0cHV0QXJncyB3aXRoIFBhcnRPZmZzZXRzIDAsIDQsIDggYW5kIDEyLgorICAgIHVuc2lnbmVkIFBhcnRPZmZzZXQ7CisKKyAgICBPdXRwdXRBcmcoKSA9IGRlZmF1bHQ7CisgICAgT3V0cHV0QXJnKEFyZ0ZsYWdzVHkgZmxhZ3MsIEVWVCB2dCwgRVZUIGFyZ3Z0LCBib29sIGlzZml4ZWQsCisgICAgICAgICAgICAgIHVuc2lnbmVkIG9yaWdJZHgsIHVuc2lnbmVkIHBhcnRPZmZzKQorICAgICAgOiBGbGFncyhmbGFncyksIElzRml4ZWQoaXNmaXhlZCksIE9yaWdBcmdJbmRleChvcmlnSWR4KSwKKyAgICAgICAgUGFydE9mZnNldChwYXJ0T2ZmcykgeworICAgICAgVlQgPSB2dC5nZXRTaW1wbGVWVCgpOworICAgICAgQXJnVlQgPSBhcmd2dDsKKyAgICB9CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBJU0QKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fVEFSR0VUQ0FMTElOR0NPTlZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldEZyYW1lTG93ZXJpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRGcmFtZUxvd2VyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmMWNmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRGcmFtZUxvd2VyaW5nLmgKQEAgLTAsMCArMSwzNDggQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL1RhcmdldEZyYW1lTG93ZXJpbmcuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gSW50ZXJmYWNlIHRvIGRlc2NyaWJlIHRoZSBsYXlvdXQgb2YgYSBzdGFjayBmcmFtZSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fVEFSR0VURlJBTUVMT1dFUklOR19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9UQVJHRVRGUkFNRUxPV0VSSU5HX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEJpdFZlY3RvcjsKKyAgY2xhc3MgQ2FsbGVlU2F2ZWRJbmZvOworICBjbGFzcyBNYWNoaW5lRnVuY3Rpb247CisgIGNsYXNzIFJlZ1NjYXZlbmdlcjsKKworLy8vIEluZm9ybWF0aW9uIGFib3V0IHN0YWNrIGZyYW1lIGxheW91dCBvbiB0aGUgdGFyZ2V0LiAgSXQgaG9sZHMgdGhlIGRpcmVjdGlvbgorLy8vIG9mIHN0YWNrIGdyb3d0aCwgdGhlIGtub3duIHN0YWNrIGFsaWdubWVudCBvbiBlbnRyeSB0byBlYWNoIGZ1bmN0aW9uLCBhbmQKKy8vLyB0aGUgb2Zmc2V0IHRvIHRoZSBsb2NhbHMgYXJlYS4KKy8vLworLy8vIFRoZSBvZmZzZXQgdG8gdGhlIGxvY2FsIGFyZWEgaXMgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFjayBwb2ludGVyIG9uCisvLy8gZnVuY3Rpb24gZW50cnkgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIHdoZXJlIGZ1bmN0aW9uIGRhdGEgKGxvY2FsIHZhcmlhYmxlcywKKy8vLyBzcGlsbCBsb2NhdGlvbnMpIGNhbiBiZSBzdG9yZWQuCitjbGFzcyBUYXJnZXRGcmFtZUxvd2VyaW5nIHsKK3B1YmxpYzoKKyAgZW51bSBTdGFja0RpcmVjdGlvbiB7CisgICAgU3RhY2tHcm93c1VwLCAgICAgICAgLy8gQWRkaW5nIHRvIHRoZSBzdGFjayBpbmNyZWFzZXMgdGhlIHN0YWNrIGFkZHJlc3MKKyAgICBTdGFja0dyb3dzRG93biAgICAgICAvLyBBZGRpbmcgdG8gdGhlIHN0YWNrIGRlY3JlYXNlcyB0aGUgc3RhY2sgYWRkcmVzcworICB9OworCisgIC8vIE1hcHMgYSBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXIgdG8gYSBzdGFjayBzbG90IHdpdGggYSBmaXhlZCBvZmZzZXQuCisgIHN0cnVjdCBTcGlsbFNsb3QgeworICAgIHVuc2lnbmVkIFJlZzsKKyAgICBpbnQgT2Zmc2V0OyAvLyBPZmZzZXQgcmVsYXRpdmUgdG8gc3RhY2sgcG9pbnRlciBvbiBmdW5jdGlvbiBlbnRyeS4KKyAgfTsKK3ByaXZhdGU6CisgIFN0YWNrRGlyZWN0aW9uIFN0YWNrRGlyOworICB1bnNpZ25lZCBTdGFja0FsaWdubWVudDsKKyAgdW5zaWduZWQgVHJhbnNpZW50U3RhY2tBbGlnbm1lbnQ7CisgIGludCBMb2NhbEFyZWFPZmZzZXQ7CisgIGJvb2wgU3RhY2tSZWFsaWduYWJsZTsKK3B1YmxpYzoKKyAgVGFyZ2V0RnJhbWVMb3dlcmluZyhTdGFja0RpcmVjdGlvbiBELCB1bnNpZ25lZCBTdGFja0FsLCBpbnQgTEFPLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFRyYW5zQWwgPSAxLCBib29sIFN0YWNrUmVhbCA9IHRydWUpCisgICAgOiBTdGFja0RpcihEKSwgU3RhY2tBbGlnbm1lbnQoU3RhY2tBbCksIFRyYW5zaWVudFN0YWNrQWxpZ25tZW50KFRyYW5zQWwpLAorICAgICAgTG9jYWxBcmVhT2Zmc2V0KExBTyksIFN0YWNrUmVhbGlnbmFibGUoU3RhY2tSZWFsKSB7fQorCisgIHZpcnR1YWwgflRhcmdldEZyYW1lTG93ZXJpbmcoKTsKKworICAvLyBUaGVzZSBtZXRob2RzIHJldHVybiBpbmZvcm1hdGlvbiB0aGF0IGRlc2NyaWJlcyB0aGUgYWJzdHJhY3Qgc3RhY2sgbGF5b3V0CisgIC8vIG9mIHRoZSB0YXJnZXQgbWFjaGluZS4KKworICAvLy8gZ2V0U3RhY2tHcm93dGhEaXJlY3Rpb24gLSBSZXR1cm4gdGhlIGRpcmVjdGlvbiB0aGUgc3RhY2sgZ3Jvd3MKKyAgLy8vCisgIFN0YWNrRGlyZWN0aW9uIGdldFN0YWNrR3Jvd3RoRGlyZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gU3RhY2tEaXI7IH0KKworICAvLy8gZ2V0U3RhY2tBbGlnbm1lbnQgLSBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd2hpY2ggdGhlCisgIC8vLyBzdGFjayBwb2ludGVyIG11c3QgYmUgYWxpZ25lZCBvbiBlbnRyeSB0byBhIGZ1bmN0aW9uLiAgVHlwaWNhbGx5LCB0aGlzCisgIC8vLyBpcyB0aGUgbGFyZ2VzdCBhbGlnbm1lbnQgZm9yIGFueSBkYXRhIG9iamVjdCBpbiB0aGUgdGFyZ2V0LgorICAvLy8KKyAgdW5zaWduZWQgZ2V0U3RhY2tBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBTdGFja0FsaWdubWVudDsgfQorCisgIC8vLyBhbGlnblNQQWRqdXN0IC0gVGhpcyBtZXRob2QgYWxpZ25zIHRoZSBzdGFjayBhZGp1c3RtZW50IHRvIHRoZSBjb3JyZWN0CisgIC8vLyBhbGlnbm1lbnQuCisgIC8vLworICBpbnQgYWxpZ25TUEFkanVzdChpbnQgU1BBZGopIGNvbnN0IHsKKyAgICBpZiAoU1BBZGogPCAwKSB7CisgICAgICBTUEFkaiA9IC1hbGlnblRvKC1TUEFkaiwgU3RhY2tBbGlnbm1lbnQpOworICAgIH0gZWxzZSB7CisgICAgICBTUEFkaiA9IGFsaWduVG8oU1BBZGosIFN0YWNrQWxpZ25tZW50KTsKKyAgICB9CisgICAgcmV0dXJuIFNQQWRqOworICB9CisKKyAgLy8vIGdldFRyYW5zaWVudFN0YWNrQWxpZ25tZW50IC0gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvCisgIC8vLyB3aGljaCB0aGUgc3RhY2sgcG9pbnRlciBtdXN0IGJlIGFsaWduZWQgYXQgYWxsIHRpbWVzLCBldmVuIGJldHdlZW4KKyAgLy8vIGNhbGxzLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0VHJhbnNpZW50U3RhY2tBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIFRyYW5zaWVudFN0YWNrQWxpZ25tZW50OworICB9CisKKyAgLy8vIGlzU3RhY2tSZWFsaWduYWJsZSAtIFRoaXMgbWV0aG9kIHJldHVybnMgd2hldGhlciB0aGUgc3RhY2sgY2FuIGJlCisgIC8vLyByZWFsaWduZWQuCisgIGJvb2wgaXNTdGFja1JlYWxpZ25hYmxlKCkgY29uc3QgeworICAgIHJldHVybiBTdGFja1JlYWxpZ25hYmxlOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgc2tldyB0aGF0IGhhcyB0byBiZSBhcHBsaWVkIHRvIHN0YWNrIGFsaWdubWVudCB1bmRlcgorICAvLy8gY2VydGFpbiBjb25kaXRpb25zIChlLmcuIHN0YWNrIHdhcyBhZGp1c3RlZCBiZWZvcmUgZnVuY3Rpb24gXHAgTUYKKyAgLy8vIHdhcyBjYWxsZWQpLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldFN0YWNrQWxpZ25tZW50U2tldyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAvLy8gZ2V0T2Zmc2V0T2ZMb2NhbEFyZWEgLSBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGxvY2FsIGFyZWEKKyAgLy8vIGZyb20gdGhlIHN0YWNrIHBvaW50ZXIgb24gZW50cmFuY2UgdG8gYSBmdW5jdGlvbi4KKyAgLy8vCisgIGludCBnZXRPZmZzZXRPZkxvY2FsQXJlYSgpIGNvbnN0IHsgcmV0dXJuIExvY2FsQXJlYU9mZnNldDsgfQorCisgIC8vLyBpc0ZQQ2xvc2VUb0luY29taW5nU1AgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhbWUgcG9pbnRlciBpcyBjbG9zZSB0bworICAvLy8gdGhlIGluY29taW5nIHN0YWNrIHBvaW50ZXIsIGZhbHNlIGlmIGl0IGlzIGNsb3NlIHRvIHRoZSBwb3N0LXByb2xvZ3VlCisgIC8vLyBzdGFjayBwb2ludGVyLgorICB2aXJ0dWFsIGJvb2wgaXNGUENsb3NlVG9JbmNvbWluZ1NQKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBhc3NpZ25DYWxsZWVTYXZlZFNwaWxsU2xvdHMgLSBBbGxvd3MgdGFyZ2V0IHRvIG92ZXJyaWRlIHNwaWxsIHNsb3QKKyAgLy8vIGFzc2lnbm1lbnQgbG9naWMuICBJZiBpbXBsZW1lbnRlZCwgYXNzaWduQ2FsbGVlU2F2ZWRTcGlsbFNsb3RzKCkgc2hvdWxkCisgIC8vLyBhc3NpZ24gZnJhbWUgc2xvdHMgdG8gYWxsIENTSSBlbnRyaWVzIGFuZCByZXR1cm4gdHJ1ZS4gIElmIHRoaXMgbWV0aG9kCisgIC8vLyByZXR1cm5zIGZhbHNlLCBzcGlsbCBzbG90cyB3aWxsIGJlIGFzc2lnbmVkIHVzaW5nIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uCisgIC8vLyBhc3NpZ25DYWxsZWVTYXZlZFNwaWxsU2xvdHMoKSBtYXkgYWRkLCBkZWxldGUgb3IgcmVhcnJhbmdlIGVsZW1lbnRzIG9mCisgIC8vLyBDU0kuCisgIHZpcnR1YWwgYm9vbAorICBhc3NpZ25DYWxsZWVTYXZlZFNwaWxsU2xvdHMoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIGdldENhbGxlZVNhdmVkU3BpbGxTbG90cyAtIFRoaXMgbWV0aG9kIHJldHVybnMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mCisgIC8vLyBwYWlycywgdGhhdCBjb250YWlucyBhbiBlbnRyeSBmb3IgZWFjaCBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXIgdGhhdCBtdXN0IGJlCisgIC8vLyBzcGlsbGVkIHRvIGEgcGFydGljdWxhciBzdGFjayBsb2NhdGlvbiBpZiBpdCBpcyBzcGlsbGVkLgorICAvLy8KKyAgLy8vIEVhY2ggZW50cnkgaW4gdGhpcyBhcnJheSBjb250YWlucyBhIDxyZWdpc3RlcixvZmZzZXQ+IHBhaXIsIGluZGljYXRpbmcgdGhlCisgIC8vLyBmaXhlZCBvZmZzZXQgZnJvbSB0aGUgaW5jb21pbmcgc3RhY2sgcG9pbnRlciB0aGF0IGVhY2ggcmVnaXN0ZXIgc2hvdWxkIGJlCisgIC8vLyBzcGlsbGVkIGF0LiBJZiBhIHJlZ2lzdGVyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgdGhlIGNvZGUgZ2VuZXJhdG9yIGlzCisgIC8vLyBhbGxvd2VkIHRvIHNwaWxsIGl0IGFueXdoZXJlIGl0IGNob29zZXMuCisgIC8vLworICB2aXJ0dWFsIGNvbnN0IFNwaWxsU2xvdCAqCisgIGdldENhbGxlZVNhdmVkU3BpbGxTbG90cyh1bnNpZ25lZCAmTnVtRW50cmllcykgY29uc3QgeworICAgIE51bUVudHJpZXMgPSAwOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIHRhcmdldEhhbmRsZXNTdGFja0ZyYW1lUm91bmRpbmcgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCBpcworICAvLy8gcmVzcG9uc2libGUgZm9yIHJvdW5kaW5nIHVwIHRoZSBzdGFjayBmcmFtZSAocHJvYmFibHkgYXQgZW1pdFByb2xvZ3VlCisgIC8vLyB0aW1lKS4KKyAgdmlydHVhbCBib29sIHRhcmdldEhhbmRsZXNTdGFja0ZyYW1lUm91bmRpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IHdpbGwgY29ycmVjdGx5IGhhbmRsZSBzaHJpbmsgd3JhcHBpbmcuCisgIHZpcnR1YWwgYm9vbCBlbmFibGVTaHJpbmtXcmFwcGluZyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RhY2sgc2xvdCBob2xlcyBpbiB0aGUgZml4ZWQgYW5kIGNhbGxlZS1zYXZlIHN0YWNrCisgIC8vLyBhcmVhIHNob3VsZCBiZSB1c2VkIHdoZW4gYWxsb2NhdGluZyBvdGhlciBzdGFjayBsb2NhdGlvbnMgdG8gcmVkdWNlIHN0YWNrCisgIC8vLyBzaXplLgorICB2aXJ0dWFsIGJvb2wgZW5hYmxlU3RhY2tTbG90U2NhdmVuZ2luZyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIGVtaXRQcm9sb2cvZW1pdEVwaWxvZyAtIFRoZXNlIG1ldGhvZHMgaW5zZXJ0IHByb2xvZyBhbmQgZXBpbG9nIGNvZGUgaW50bworICAvLy8gdGhlIGZ1bmN0aW9uLgorICB2aXJ0dWFsIHZvaWQgZW1pdFByb2xvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgZW1pdEVwaWxvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3QgPSAwOworCisgIC8vLyBSZXBsYWNlIGEgU3RhY2tQcm9iZSBzdHViIChpZiBhbnkpIHdpdGggdGhlIGFjdHVhbCBwcm9iZSBjb2RlIGlubGluZQorICB2aXJ0dWFsIHZvaWQgaW5saW5lU3RhY2tQcm9iZShNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmUHJvbG9ndWVNQkIpIGNvbnN0IHt9CisKKyAgLy8vIEFkanVzdCB0aGUgcHJvbG9ndWUgdG8gaGF2ZSB0aGUgZnVuY3Rpb24gdXNlIHNlZ21lbnRlZCBzdGFja3MuIFRoaXMgd29ya3MKKyAgLy8vIGJ5IGFkZGluZyBhIGNoZWNrIGV2ZW4gYmVmb3JlIHRoZSAibm9ybWFsIiBmdW5jdGlvbiBwcm9sb2d1ZS4KKyAgdmlydHVhbCB2b2lkIGFkanVzdEZvclNlZ21lbnRlZFN0YWNrcyhNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZQcm9sb2d1ZU1CQikgY29uc3Qge30KKworICAvLy8gQWRqdXN0IHRoZSBwcm9sb2d1ZSB0byBhZGQgRXJsYW5nIFJ1bi1UaW1lIFN5c3RlbSAoRVJUUykgc3BlY2lmaWMgY29kZSBpbgorICAvLy8gdGhlIGFzc2VtYmx5IHByb2xvZ3VlIHRvIGV4cGxpY2l0bHkgaGFuZGxlIHRoZSBzdGFjay4KKyAgdmlydHVhbCB2b2lkIGFkanVzdEZvckhpUEVQcm9sb2d1ZShNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZQcm9sb2d1ZU1CQikgY29uc3Qge30KKworICAvLy8gc3BpbGxDYWxsZWVTYXZlZFJlZ2lzdGVycyAtIElzc3VlcyBpbnN0cnVjdGlvbihzKSB0byBzcGlsbCBhbGwgY2FsbGVlCisgIC8vLyBzYXZlZCByZWdpc3RlcnMgYW5kIHJldHVybnMgdHJ1ZSBpZiBpdCBpc24ndCBwb3NzaWJsZSAvIHByb2ZpdGFibGUgdG8gZG8KKyAgLy8vIHNvIGJ5IGlzc3VpbmcgYSBzZXJpZXMgb2Ygc3RvcmUgaW5zdHJ1Y3Rpb25zIHZpYQorICAvLy8gc3RvcmVSZWdUb1N0YWNrU2xvdCgpLiBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KKyAgdmlydHVhbCBib29sIHNwaWxsQ2FsbGVlU2F2ZWRSZWdpc3RlcnMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gJkNTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gcmVzdG9yZUNhbGxlZVNhdmVkUmVnaXN0ZXJzIC0gSXNzdWVzIGluc3RydWN0aW9uKHMpIHRvIHJlc3RvcmUgYWxsIGNhbGxlZQorICAvLy8gc2F2ZWQgcmVnaXN0ZXJzIGFuZCByZXR1cm5zIHRydWUgaWYgaXQgaXNuJ3QgcG9zc2libGUgLyBwcm9maXRhYmxlIHRvIGRvCisgIC8vLyBzbyBieSBpc3N1aW5nIGEgc2VyaWVzIG9mIGxvYWQgaW5zdHJ1Y3Rpb25zIHZpYSBsb2FkUmVnVG9TdGFja1Nsb3QoKS4KKyAgLy8vIElmIGl0IHJldHVybnMgdHJ1ZSwgYW5kIGFueSBvZiB0aGUgcmVnaXN0ZXJzIGluIENTSSBpcyBub3QgcmVzdG9yZWQsCisgIC8vLyBpdCBzZXRzIHRoZSBjb3JyZXNwb25kaW5nIFJlc3RvcmVkIGZsYWcgaW4gQ1NJIHRvIGZhbHNlLgorICAvLy8gUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuCisgIHZpcnR1YWwgYm9vbCByZXN0b3JlQ2FsbGVlU2F2ZWRSZWdpc3RlcnMoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgbmVlZHMgdG8gZGlzYWJsZSBmcmFtZSBwb2ludGVyIGVsaW1pbmF0aW9uLgorICB2aXJ0dWFsIGJvb2wgbm9GcmFtZVBvaW50ZXJFbGltKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIC8vLyBoYXNGUCAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gc2hvdWxkIGhhdmUgYSBkZWRpY2F0ZWQKKyAgLy8vIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIuIEZvciBtb3N0IHRhcmdldHMgdGhpcyBpcyB0cnVlIG9ubHkgaWYgdGhlIGZ1bmN0aW9uCisgIC8vLyBoYXMgdmFyaWFibGUgc2l6ZWQgYWxsb2NhcyBvciBpZiBmcmFtZSBwb2ludGVyIGVsaW1pbmF0aW9uIGlzIGRpc2FibGVkLgorICB2aXJ0dWFsIGJvb2wgaGFzRlAoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgPSAwOworCisgIC8vLyBoYXNSZXNlcnZlZENhbGxGcmFtZSAtIFVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCB3aGVuIGEgZnJhbWUgcG9pbnRlciBpcworICAvLy8gbm90IHJlcXVpcmVkLCB3ZSByZXNlcnZlIGFyZ3VtZW50IHNwYWNlIGZvciBjYWxsIHNpdGVzIGluIHRoZSBmdW5jdGlvbgorICAvLy8gaW1tZWRpYXRlbHkgb24gZW50cnkgdG8gdGhlIGN1cnJlbnQgZnVuY3Rpb24uIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IKKyAgLy8vIGFkZC9zdWIgc3AgYnJhY2tldHMgYXJvdW5kIGNhbGwgc2l0ZXMuIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2FsbCBmcmFtZSBpcworICAvLy8gaW5jbHVkZWQgYXMgcGFydCBvZiB0aGUgc3RhY2sgZnJhbWUuCisgIHZpcnR1YWwgYm9vbCBoYXNSZXNlcnZlZENhbGxGcmFtZShjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgcmV0dXJuICFoYXNGUChNRik7CisgIH0KKworICAvLy8gY2FuU2ltcGxpZnlDYWxsRnJhbWVQc2V1ZG9zIC0gV2hlbiBwb3NzaWJsZSwgaXQncyBiZXN0IHRvIHNpbXBsaWZ5IHRoZQorICAvLy8gY2FsbCBmcmFtZSBwc2V1ZG8gb3BzIGJlZm9yZSBkb2luZyBmcmFtZSBpbmRleCBlbGltaW5hdGlvbi4gVGhpcyBpcworICAvLy8gcG9zc2libGUgb25seSB3aGVuIGZyYW1lIGluZGV4IHJlZmVyZW5jZXMgYmV0d2VlbiB0aGUgcHNldWRvcyB3b24ndAorICAvLy8gbmVlZCBhZGp1c3RpbmcgZm9yIHRoZSBjYWxsIGZyYW1lIGFkanVzdG1lbnRzLiBOb3JtYWxseSwgdGhhdCdzIHRydWUKKyAgLy8vIGlmIHRoZSBmdW5jdGlvbiBoYXMgYSByZXNlcnZlZCBjYWxsIGZyYW1lIG9yIGEgZnJhbWUgcG9pbnRlci4gU29tZQorICAvLy8gdGFyZ2V0cyAoVGh1bWIyLCBmb3IgZXhhbXBsZSkgbWF5IGhhdmUgbW9yZSBjb21wbGljYXRlZCBjcml0ZXJpYSwKKyAgLy8vIGhvd2V2ZXIsIGFuZCBjYW4gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvci4KKyAgdmlydHVhbCBib29sIGNhblNpbXBsaWZ5Q2FsbEZyYW1lUHNldWRvcyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Jlc2VydmVkQ2FsbEZyYW1lKE1GKSB8fCBoYXNGUChNRik7CisgIH0KKworICAvLyBuZWVkc0ZyYW1lSW5kZXhSZXNvbHV0aW9uIC0gRG8gd2UgbmVlZCB0byBwZXJmb3JtIEZJIHJlc29sdXRpb24gZm9yCisgIC8vIHRoaXMgZnVuY3Rpb24uIE5vcm1hbGx5LCB0aGlzIGlzIHJlcXVpcmVkIG9ubHkgd2hlbiB0aGUgZnVuY3Rpb24KKyAgLy8gaGFzIGFueSBzdGFjayBvYmplY3RzLiBIb3dldmVyLCB0YXJnZXRzIG1heSB3YW50IHRvIG92ZXJyaWRlIHRoaXMuCisgIHZpcnR1YWwgYm9vbCBuZWVkc0ZyYW1lSW5kZXhSZXNvbHV0aW9uKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIC8vLyBnZXRGcmFtZUluZGV4UmVmZXJlbmNlIC0gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgYmFzZSByZWdpc3RlcgorICAvLy8gYW5kIG9mZnNldCB1c2VkIHRvIHJlZmVyZW5jZSBhIGZyYW1lIGluZGV4IGxvY2F0aW9uLiBUaGUgb2Zmc2V0IGlzCisgIC8vLyByZXR1cm5lZCBkaXJlY3RseSwgYW5kIHRoZSBiYXNlIHJlZ2lzdGVyIGlzIHJldHVybmVkIHZpYSBGcmFtZVJlZy4KKyAgdmlydHVhbCBpbnQgZ2V0RnJhbWVJbmRleFJlZmVyZW5jZShjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLCBpbnQgRkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkZyYW1lUmVnKSBjb25zdDsKKworICAvLy8gU2FtZSBhcyBcYyBnZXRGcmFtZUluZGV4UmVmZXJlbmNlLCBleGNlcHQgdGhhdCB0aGUgc3RhY2sgcG9pbnRlciAoYXMKKyAgLy8vIG9wcG9zZWQgdG8gdGhlIGZyYW1lIHBvaW50ZXIpIHdpbGwgYmUgdGhlIHByZWZlcnJlZCB2YWx1ZSBmb3IgXHAKKyAgLy8vIEZyYW1lUmVnLiBUaGlzIGlzIGdlbmVyYWxseSB1c2VkIGZvciBlbWl0dGluZyBzdGF0ZXBvaW50IG9yIEVIIHRhYmxlcyB0aGF0CisgIC8vLyB1c2Ugb2Zmc2V0cyBmcm9tIFJTUC4gIElmIFxwIElnbm9yZVNQVXBkYXRlcyBpcyB0cnVlLCB0aGUgcmV0dXJuZWQKKyAgLy8vIG9mZnNldCBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQgd2l0aCByZXNwZWN0IHRvIHRoZSB2YWx1ZSBvZiBTUCBhdAorICAvLy8gdGhlIGVuZCBvZiB0aGUgcHJvbG9ndWUuCisgIHZpcnR1YWwgaW50IGdldEZyYW1lSW5kZXhSZWZlcmVuY2VQcmVmZXJTUChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLCBpbnQgRkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRnJhbWVSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElnbm9yZVNQVXBkYXRlcykgY29uc3QgeworICAgIC8vIEFsd2F5cyBzYWZlIHRvIGRpc3BhdGNoIHRvIGdldEZyYW1lSW5kZXhSZWZlcmVuY2UuCisgICAgcmV0dXJuIGdldEZyYW1lSW5kZXhSZWZlcmVuY2UoTUYsIEZJLCBGcmFtZVJlZyk7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyB3aGljaCBvZiB0aGUgcmVnaXN0ZXJzIHJlcG9ydGVkIGJ5CisgIC8vLyBUYXJnZXRSZWdpc3RlckluZm86OmdldENhbGxlZVNhdmVkUmVncygpIHNob3VsZCBhY3R1YWxseSBnZXQgc2F2ZWQuCisgIC8vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjaGVja3MgcG9wdWxhdGVzIHRoZSBccCBTYXZlZFJlZ3MgYml0c2V0IHdpdGgKKyAgLy8vIGFsbCByZWdpc3RlcnMgd2hpY2ggYXJlIG1vZGlmaWVkIGluIHRoZSBmdW5jdGlvbiwgdGFyZ2V0cyBtYXkgb3ZlcnJpZGUKKyAgLy8vIHRoaXMgZnVuY3Rpb24gdG8gc2F2ZSBhZGRpdGlvbmFsIHJlZ2lzdGVycy4KKyAgLy8vIFRoaXMgbWV0aG9kIGFsc28gc2V0cyB1cCB0aGUgcmVnaXN0ZXIgc2NhdmVuZ2VyIGVuc3VyaW5nIHRoZXJlIGlzIGEgZnJlZQorICAvLy8gcmVnaXN0ZXIgb3IgYSBmcmFtZWluZGV4IGF2YWlsYWJsZS4KKyAgdmlydHVhbCB2b2lkIGRldGVybWluZUNhbGxlZVNhdmVzKE1hY2hpbmVGdW5jdGlvbiAmTUYsIEJpdFZlY3RvciAmU2F2ZWRSZWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUyA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBwcm9jZXNzRnVuY3Rpb25CZWZvcmVGcmFtZUZpbmFsaXplZCAtIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbW1lZGlhdGVseQorICAvLy8gYmVmb3JlIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24ncyBmcmFtZSBsYXlvdXQgKE1GLmdldEZyYW1lSW5mbygpKSBpcworICAvLy8gZmluYWxpemVkLiAgT25jZSB0aGUgZnJhbWUgaXMgZmluYWxpemVkLCBNT19GcmFtZUluZGV4IG9wZXJhbmRzIGFyZQorICAvLy8gcmVwbGFjZWQgd2l0aCBkaXJlY3QgY29uc3RhbnRzLiAgVGhpcyBtZXRob2QgaXMgb3B0aW9uYWwuCisgIC8vLworICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0Z1bmN0aW9uQmVmb3JlRnJhbWVGaW5hbGl6ZWQoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NjYXZlbmdlciAqUlMgPSBudWxscHRyKSBjb25zdCB7CisgIH0KKworICB2aXJ0dWFsIHVuc2lnbmVkIGdldFdpbkVIUGFyZW50RnJhbWVPZmZzZXQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiV2luRUggbm90IGltcGxlbWVudGVkIGZvciB0aGlzIHRhcmdldCIpOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgcHJvbG9nL2VwaWxvZyBjb2RlIGluc2VydGlvbiB0byBlbGltaW5hdGUKKyAgLy8vIGNhbGwgZnJhbWUgc2V0dXAgYW5kIGRlc3Ryb3kgcHNldWRvIGluc3RydWN0aW9ucyAoYnV0IG9ubHkgaWYgdGhlIFRhcmdldAorICAvLy8gaXMgdXNpbmcgdGhlbSkuICBJdCBpcyByZXNwb25zaWJsZSBmb3IgZWxpbWluYXRpbmcgdGhlc2UgaW5zdHJ1Y3Rpb25zLAorICAvLy8gcmVwbGFjaW5nIHRoZW0gd2l0aCBjb25jcmV0ZSBpbnN0cnVjdGlvbnMuICBUaGlzIG1ldGhvZCBuZWVkIG9ubHkgYmUKKyAgLy8vIGltcGxlbWVudGVkIGlmIHVzaW5nIGNhbGwgZnJhbWUgc2V0dXAvZGVzdHJveSBwc2V1ZG8gaW5zdHJ1Y3Rpb25zLgorICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgaW5zdHJ1Y3Rpb24gYWZ0ZXIgdGhlIHJlcGxhY2VkIG9uZS4KKyAgdmlydHVhbCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IKKyAgZWxpbWluYXRlQ2FsbEZyYW1lUHNldWRvSW5zdHIoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiQ2FsbCBGcmFtZSBQc2V1ZG8gSW5zdHJ1Y3Rpb25zIGRvIG5vdCBleGlzdCBvbiB0aGlzICIKKyAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQhIik7CisgIH0KKworCisgIC8vLyBPcmRlciB0aGUgc3ltYm9scyBpbiB0aGUgbG9jYWwgc3RhY2sgZnJhbWUuCisgIC8vLyBUaGUgbGlzdCBvZiBvYmplY3RzIHRoYXQgd2Ugd2FudCB0byBvcmRlciBpcyBpbiBccCBvYmplY3RzVG9BbGxvY2F0ZSBhcworICAvLy8gaW5kaWNlcyBpbnRvIHRoZSBNYWNoaW5lRnJhbWVJbmZvLiBUaGUgYXJyYXkgY2FuIGJlIHJlb3JkZXJlZCBpbiBhbnkgd2F5CisgIC8vLyB1cG9uIHJldHVybi4gVGhlIGNvbnRlbnRzIG9mIHRoZSBhcnJheSwgaG93ZXZlciwgbWF5IG5vdCBiZSBtb2RpZmllZCAoaS5lLgorICAvLy8gb25seSB0aGVpciBvcmRlciBtYXkgYmUgY2hhbmdlZCkuCisgIC8vLyBCeSBkZWZhdWx0LCBqdXN0IG1haW50YWluIHRoZSBvcmlnaW5hbCBvcmRlci4KKyAgdmlydHVhbCB2b2lkCisgIG9yZGVyRnJhbWVPYmplY3RzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxpbnQ+ICZvYmplY3RzVG9BbGxvY2F0ZSkgY29uc3QgeworICB9CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBccCBNQkIgY2FuIGJlIHVzZWQgYXMgYSBwcm9sb2d1ZQorICAvLy8gZm9yIHRoZSB0YXJnZXQuCisgIC8vLyBUaGUgcHJvbG9ndWUgd2lsbCBiZSBpbnNlcnRlZCBmaXJzdCBpbiB0aGlzIGJhc2ljIGJsb2NrLgorICAvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBieSB0aGUgc2hyaW5rLXdyYXBwaW5nIHBhc3MgdG8gZGVjaWRlIGlmCisgIC8vLyBccCBNQkIgd2lsbCBiZSBjb3JyZWN0bHkgaGFuZGxlZCBieSB0aGUgdGFyZ2V0LgorICAvLy8gQXMgc29vbiBhcyB0aGUgdGFyZ2V0IGVuYWJsZSBzaHJpbmstd3JhcHBpbmcgd2l0aG91dCBvdmVycmlkaW5nCisgIC8vLyB0aGlzIG1ldGhvZCwgd2UgYXNzdW1lIHRoYXQgZWFjaCBiYXNpYyBibG9jayBpcyBhIHZhbGlkCisgIC8vLyBwcm9sb2d1ZS4KKyAgdmlydHVhbCBib29sIGNhblVzZUFzUHJvbG9ndWUoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBccCBNQkIgY2FuIGJlIHVzZWQgYXMgYSBlcGlsb2d1ZQorICAvLy8gZm9yIHRoZSB0YXJnZXQuCisgIC8vLyBUaGUgZXBpbG9ndWUgd2lsbCBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIGZpcnN0IHRlcm1pbmF0b3Igb2YgdGhhdCBibG9jay4KKyAgLy8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIHNocmluay13cmFwcGluZyBwYXNzIHRvIGRlY2lkZSBpZgorICAvLy8gXHAgTUJCIHdpbGwgYmUgY29ycmVjdGx5IGhhbmRsZWQgYnkgdGhlIHRhcmdldC4KKyAgLy8vIEFzIHNvb24gYXMgdGhlIHRhcmdldCBlbmFibGUgc2hyaW5rLXdyYXBwaW5nIHdpdGhvdXQgb3ZlcnJpZGluZworICAvLy8gdGhpcyBtZXRob2QsIHdlIGFzc3VtZSB0aGF0IGVhY2ggYmFzaWMgYmxvY2sgaXMgYSB2YWxpZAorICAvLy8gZXBpbG9ndWUuCisgIHZpcnR1YWwgYm9vbCBjYW5Vc2VBc0VwaWxvZ3VlKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBDaGVjayBpZiBnaXZlbiBmdW5jdGlvbiBpcyBzYWZlIGZvciBub3QgaGF2aW5nIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMuCisgIC8vLyBUaGlzIGlzIHVzZWQgd2hlbiBpbnRlcnByb2NlZHVyYWwgcmVnaXN0ZXIgYWxsb2NhdGlvbiBpcyBlbmFibGVkLgorICBzdGF0aWMgYm9vbCBpc1NhZmVGb3JOb0NTUk9wdChjb25zdCBGdW5jdGlvbiAmRikgeworICAgIGlmICghRi5oYXNMb2NhbExpbmthZ2UoKSB8fCBGLmhhc0FkZHJlc3NUYWtlbigpIHx8CisgICAgICAgICFGLmhhc0ZuQXR0cmlidXRlKEF0dHJpYnV0ZTo6Tm9SZWN1cnNlKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBGdW5jdGlvbiBzaG91bGQgbm90IGJlIG9wdGltaXplZCBhcyB0YWlsIGNhbGwuCisgICAgZm9yIChjb25zdCBVc2VyICpVIDogRi51c2VycygpKQorICAgICAgaWYgKGF1dG8gQ1MgPSBJbW11dGFibGVDYWxsU2l0ZShVKSkKKyAgICAgICAgaWYgKENTLmlzVGFpbENhbGwoKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldEluc3RySW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldEluc3RySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMmE1MzAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0SW5zdHJJbmZvLmgKQEAgLTAsMCArMSwxNzEwIEBACisvLz09PS0gbGx2bS9Db2RlR2VuL1RhcmdldEluc3RySW5mby5oIC0gSW5zdHJ1Y3Rpb24gSW5mbyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHRhcmdldCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCB0byB0aGUgY29kZSBnZW5lcmF0b3IuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9UQVJHRVRJTlNUUklORk9fSAorI2RlZmluZSBMTFZNX1RBUkdFVF9UQVJHRVRJTlNUUklORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUNvbWJpbmVyUGF0dGVybi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVMb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lT3BlcmFuZC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Qc2V1ZG9Tb3VyY2VWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQnJhbmNoUHJvYmFiaWxpdHkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIERGQVBhY2tldGl6ZXI7CitjbGFzcyBJbnN0ckl0aW5lcmFyeURhdGE7CitjbGFzcyBMaXZlSW50ZXJ2YWxzOworY2xhc3MgTGl2ZVZhcmlhYmxlczsKK2NsYXNzIE1hY2hpbmVNZW1PcGVyYW5kOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIE1DQXNtSW5mbzsKK2NsYXNzIE1DSW5zdDsKK3N0cnVjdCBNQ1NjaGVkTW9kZWw7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBTY2hlZHVsZURBRzsKK2NsYXNzIFNjaGVkdWxlSGF6YXJkUmVjb2duaXplcjsKK2NsYXNzIFNETm9kZTsKK2NsYXNzIFNlbGVjdGlvbkRBRzsKK2NsYXNzIFJlZ1NjYXZlbmdlcjsKK2NsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CitjbGFzcyBUYXJnZXRTY2hlZE1vZGVsOworY2xhc3MgVGFyZ2V0U3VidGFyZ2V0SW5mbzsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLworLy8vIFRhcmdldEluc3RySW5mbyAtIEludGVyZmFjZSB0byBkZXNjcmlwdGlvbiBvZiBtYWNoaW5lIGluc3RydWN0aW9uIHNldAorLy8vCitjbGFzcyBUYXJnZXRJbnN0ckluZm8gOiBwdWJsaWMgTUNJbnN0ckluZm8geworcHVibGljOgorICBUYXJnZXRJbnN0ckluZm8odW5zaWduZWQgQ0ZTZXR1cE9wY29kZSA9IH4wdSwgdW5zaWduZWQgQ0ZEZXN0cm95T3Bjb2RlID0gfjB1LAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2F0Y2hSZXRPcGNvZGUgPSB+MHUsIHVuc2lnbmVkIFJldHVybk9wY29kZSA9IH4wdSkKKyAgICAgIDogQ2FsbEZyYW1lU2V0dXBPcGNvZGUoQ0ZTZXR1cE9wY29kZSksCisgICAgICAgIENhbGxGcmFtZURlc3Ryb3lPcGNvZGUoQ0ZEZXN0cm95T3Bjb2RlKSwgQ2F0Y2hSZXRPcGNvZGUoQ2F0Y2hSZXRPcGNvZGUpLAorICAgICAgICBSZXR1cm5PcGNvZGUoUmV0dXJuT3Bjb2RlKSB7fQorICBUYXJnZXRJbnN0ckluZm8oY29uc3QgVGFyZ2V0SW5zdHJJbmZvICYpID0gZGVsZXRlOworICBUYXJnZXRJbnN0ckluZm8gJm9wZXJhdG9yPShjb25zdCBUYXJnZXRJbnN0ckluZm8gJikgPSBkZWxldGU7CisgIHZpcnR1YWwgflRhcmdldEluc3RySW5mbygpOworCisgIHN0YXRpYyBib29sIGlzR2VuZXJpY09wY29kZSh1bnNpZ25lZCBPcGMpIHsKKyAgICByZXR1cm4gT3BjIDw9IFRhcmdldE9wY29kZTo6R0VORVJJQ19PUF9FTkQ7CisgIH0KKworICAvLy8gR2l2ZW4gYSBtYWNoaW5lIGluc3RydWN0aW9uIGRlc2NyaXB0b3IsIHJldHVybnMgdGhlIHJlZ2lzdGVyCisgIC8vLyBjbGFzcyBjb25zdHJhaW50IGZvciBPcE51bSwgb3IgTlVMTC4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqZ2V0UmVnQ2xhc3MoY29uc3QgTUNJbnN0ckRlc2MgJlRJRCwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIHRyaXZpYWxseSByZW1hdGVyaWFsaXphYmxlLCBtZWFuaW5nIGl0CisgIC8vLyBoYXMgbm8gc2lkZSBlZmZlY3RzIGFuZCByZXF1aXJlcyBubyBvcGVyYW5kcyB0aGF0IGFyZW4ndCBhbHdheXMgYXZhaWxhYmxlLgorICAvLy8gVGhpcyBtZWFucyB0aGUgb25seSBhbGxvd2VkIHVzZXMgYXJlIGNvbnN0YW50cyBhbmQgdW5hbGxvY2F0YWJsZSBwaHlzaWNhbAorICAvLy8gcmVnaXN0ZXJzIHNvIHRoYXQgdGhlIGluc3RydWN0aW9ucyByZXN1bHQgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlCisgIC8vLyBpbiB0aGUgZnVuY3Rpb24uCisgIGJvb2wgaXNUcml2aWFsbHlSZU1hdGVyaWFsaXphYmxlKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgKkFBID0gbnVsbHB0cikgY29uc3QgeworICAgIHJldHVybiBNSS5nZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OklNUExJQ0lUX0RFRiB8fAorICAgICAgICAgICAoTUkuZ2V0RGVzYygpLmlzUmVtYXRlcmlhbGl6YWJsZSgpICYmCisgICAgICAgICAgICAoaXNSZWFsbHlUcml2aWFsbHlSZU1hdGVyaWFsaXphYmxlKE1JLCBBQSkgfHwKKyAgICAgICAgICAgICBpc1JlYWxseVRyaXZpYWxseVJlTWF0ZXJpYWxpemFibGVHZW5lcmljKE1JLCBBQSkpKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8vLyBGb3IgaW5zdHJ1Y3Rpb25zIHdpdGggb3Bjb2RlcyBmb3Igd2hpY2ggdGhlIE1fUkVNQVRFUklBTElaQUJMRSBmbGFnIGlzCisgIC8vLyBzZXQsIHRoaXMgaG9vayBsZXRzIHRoZSB0YXJnZXQgc3BlY2lmeSB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBpcyBhY3R1YWxseQorICAvLy8gdHJpdmlhbGx5IHJlbWF0ZXJpYWxpemFibGUsIHRha2luZyBpbnRvIGNvbnNpZGVyYXRpb24gaXRzIG9wZXJhbmRzLiBUaGlzCisgIC8vLyBwcmVkaWNhdGUgbXVzdCByZXR1cm4gZmFsc2UgaWYgdGhlIGluc3RydWN0aW9uIGhhcyBhbnkgc2lkZSBlZmZlY3RzIG90aGVyCisgIC8vLyB0aGFuIHByb2R1Y2luZyBhIHZhbHVlLCBvciBpZiBpdCByZXF1cmVzIGFueSBhZGRyZXNzIHJlZ2lzdGVycyB0aGF0IGFyZQorICAvLy8gbm90IGFsd2F5cyBhdmFpbGFibGUuCisgIC8vLyBSZXF1aXJlbWVudHMgbXVzdCBiZSBjaGVjayBhcyBzdGF0ZWQgaW4gaXNUcml2aWFsbHlSZU1hdGVyaWFsaXphYmxlKCkgLgorICB2aXJ0dWFsIGJvb2wgaXNSZWFsbHlUcml2aWFsbHlSZU1hdGVyaWFsaXphYmxlKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNBbmFseXNpcyAqQUEpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgY29tbXV0ZXMgdGhlIG9wZXJhbmRzIG9mIHRoZSBnaXZlbiBtYWNoaW5lIGluc3RydWN0aW9uIE1JLgorICAvLy8gVGhlIG9wZXJhbmRzIHRvIGJlIGNvbW11dGVkIGFyZSBzcGVjaWZpZWQgYnkgdGhlaXIgaW5kaWNlcyBPcElkeDEgYW5kCisgIC8vLyBPcElkeDIuCisgIC8vLworICAvLy8gSWYgYSB0YXJnZXQgaGFzIGFueSBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgY29tbXV0YWJsZSBidXQgcmVxdWlyZQorICAvLy8gY29udmVydGluZyB0byBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb25zIG9yIG1ha2luZyBub24tdHJpdmlhbCBjaGFuZ2VzCisgIC8vLyB0byBjb21tdXRlIHRoZW0sIHRoaXMgbWV0aG9kIGNhbiBiZSBvdmVybG9hZGVkIHRvIGRvIHRoYXQuCisgIC8vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgc3dhcHMgdGhlIGNvbW11dGFibGUgb3BlcmFuZHMuCisgIC8vLworICAvLy8gSWYgTmV3TUkgaXMgZmFsc2UsIE1JIGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZDsgb3RoZXJ3aXNlLCBhCisgIC8vLyBuZXcgbWFjaGluZSBpbnN0cnVjdGlvbiBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZC4KKyAgLy8vCisgIC8vLyBEbyBub3QgY2FsbCB0aGlzIG1ldGhvZCBmb3IgYSBub24tY29tbXV0YWJsZSBpbnN0cnVjdGlvbi4KKyAgLy8vIEV2ZW4gdGhvdWdoIHRoZSBpbnN0cnVjdGlvbiBpcyBjb21tdXRhYmxlLCB0aGUgbWV0aG9kIG1heSBzdGlsbAorICAvLy8gZmFpbCB0byBjb21tdXRlIHRoZSBvcGVyYW5kcywgbnVsbCBwb2ludGVyIGlzIHJldHVybmVkIGluIHN1Y2ggY2FzZXMuCisgIHZpcnR1YWwgTWFjaGluZUluc3RyICpjb21tdXRlSW5zdHJ1Y3Rpb25JbXBsKE1hY2hpbmVJbnN0ciAmTUksIGJvb2wgTmV3TUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wSWR4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BJZHgyKSBjb25zdDsKKworICAvLy8gQXNzaWducyB0aGUgKENvbW11dGFibGVPcElkeDEsIENvbW11dGFibGVPcElkeDIpIHBhaXIgb2YgY29tbXV0YWJsZQorICAvLy8gb3BlcmFuZCBpbmRpY2VzIHRvIChSZXN1bHRJZHgxLCBSZXN1bHRJZHgyKS4KKyAgLy8vIE9uZSBvciBib3RoIGlucHV0IHZhbHVlcyBvZiB0aGUgcGFpcjogKFJlc3VsdElkeDEsIFJlc3VsdElkeDIpIG1heSBiZQorICAvLy8gcHJlZGVmaW5lZCB0byBzb21lIGluZGljZXMgb3IgYmUgdW5kZWZpbmVkIChkZXNpZ25hdGVkIGJ5IHRoZSBzcGVjaWFsCisgIC8vLyB2YWx1ZSAnQ29tbXV0ZUFueU9wZXJhbmRJbmRleCcpLgorICAvLy8gVGhlIHByZWRlZmluZWQgcmVzdWx0IGluZGljZXMgY2Fubm90IGJlIHJlLWRlZmluZWQuCisgIC8vLyBUaGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmZiBhZnRlciB0aGUgcmVzdWx0IHBhaXIgcmVkZWZpbml0aW9uCisgIC8vLyB0aGUgZml4ZWQgcmVzdWx0IHBhaXIgaXMgZXF1YWwgdG8gb3IgZXF1aXZhbGVudCB0byB0aGUgc291cmNlIHBhaXIgb2YKKyAgLy8vIGluZGljZXM6IChDb21tdXRhYmxlT3BJZHgxLCBDb21tdXRhYmxlT3BJZHgyKS4gSXQgaXMgYXNzdW1lZCBoZXJlIHRoYXQKKyAgLy8vIHRoZSBwYWlycyAoeCx5KSBhbmQgKHkseCkgYXJlIGVxdWl2YWxlbnQuCisgIHN0YXRpYyBib29sIGZpeENvbW11dGVkT3BJbmRpY2VzKHVuc2lnbmVkICZSZXN1bHRJZHgxLCB1bnNpZ25lZCAmUmVzdWx0SWR4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29tbXV0YWJsZU9wSWR4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29tbXV0YWJsZU9wSWR4Mik7CisKK3ByaXZhdGU6CisgIC8vLyBGb3IgaW5zdHJ1Y3Rpb25zIHdpdGggb3Bjb2RlcyBmb3Igd2hpY2ggdGhlIE1fUkVNQVRFUklBTElaQUJMRSBmbGFnIGlzCisgIC8vLyBzZXQgYW5kIHRoZSB0YXJnZXQgaG9vayBpc1JlYWxseVRyaXZpYWxseVJlTWF0ZXJpYWxpemFibGUgcmV0dXJucyBmYWxzZSwKKyAgLy8vIHRoaXMgZnVuY3Rpb24gZG9lcyB0YXJnZXQtaW5kZXBlbmRlbnQgdGVzdHMgdG8gZGV0ZXJtaW5lIGlmIHRoZQorICAvLy8gaW5zdHJ1Y3Rpb24gaXMgcmVhbGx5IHRyaXZpYWxseSByZW1hdGVyaWFsaXphYmxlLgorICBib29sIGlzUmVhbGx5VHJpdmlhbGx5UmVNYXRlcmlhbGl6YWJsZUdlbmVyaWMoY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgKkFBKSBjb25zdDsKKworcHVibGljOgorICAvLy8gVGhlc2UgbWV0aG9kcyByZXR1cm4gdGhlIG9wY29kZSBvZiB0aGUgZnJhbWUgc2V0dXAvZGVzdHJveSBpbnN0cnVjdGlvbnMKKyAgLy8vIGlmIHRoZXkgZXhpc3QgKC0xIG90aGVyd2lzZSkuICBTb21lIHRhcmdldHMgdXNlIHBzZXVkbyBpbnN0cnVjdGlvbnMgaW4KKyAgLy8vIG9yZGVyIHRvIGFic3RyYWN0IGF3YXkgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBvcGVyYXRpbmcgd2l0aCBhIGZyYW1lCisgIC8vLyBwb2ludGVyIGFuZCBvcGVyYXRpbmcgd2l0aG91dCwgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZXNlIHR3byBpbnN0cnVjdGlvbnMuCisgIC8vLworICB1bnNpZ25lZCBnZXRDYWxsRnJhbWVTZXR1cE9wY29kZSgpIGNvbnN0IHsgcmV0dXJuIENhbGxGcmFtZVNldHVwT3Bjb2RlOyB9CisgIHVuc2lnbmVkIGdldENhbGxGcmFtZURlc3Ryb3lPcGNvZGUoKSBjb25zdCB7IHJldHVybiBDYWxsRnJhbWVEZXN0cm95T3Bjb2RlOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBmcmFtZSBwc2V1ZG8gaW5zdHJ1Y3Rpb24uCisgIGJvb2wgaXNGcmFtZUluc3RyKGNvbnN0IE1hY2hpbmVJbnN0ciAmSSkgY29uc3QgeworICAgIHJldHVybiBJLmdldE9wY29kZSgpID09IGdldENhbGxGcmFtZVNldHVwT3Bjb2RlKCkgfHwKKyAgICAgICAgICAgSS5nZXRPcGNvZGUoKSA9PSBnZXRDYWxsRnJhbWVEZXN0cm95T3Bjb2RlKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBhIGZyYW1lIHNldHVwIHBzZXVkbyBpbnN0cnVjdGlvbi4KKyAgYm9vbCBpc0ZyYW1lU2V0dXAoY29uc3QgTWFjaGluZUluc3RyICZJKSBjb25zdCB7CisgICAgcmV0dXJuIEkuZ2V0T3Bjb2RlKCkgPT0gZ2V0Q2FsbEZyYW1lU2V0dXBPcGNvZGUoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHNpemUgb2YgdGhlIGZyYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZnJhbWUgaW5zdHJ1Y3Rpb24uCisgIC8vLyBGb3IgZnJhbWUgc2V0dXAgaW5zdHJ1Y3Rpb24gdGhpcyBpcyBmcmFtZSB0aGF0IGlzIHNldCB1cCBzcGFjZSBzZXQgdXAKKyAgLy8vIGFmdGVyIHRoZSBpbnN0cnVjdGlvbi4gRm9yIGZyYW1lIGRlc3Ryb3kgaW5zdHJ1Y3Rpb24gdGhpcyBpcyB0aGUgZnJhbWUKKyAgLy8vIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCisgIC8vLyBOb3RlLCBpbiBzb21lIGNhc2VzIGEgY2FsbCBmcmFtZSAob3IgYSBwYXJ0IG9mIGl0KSBtYXkgYmUgcHJlcGFyZWQgcHJpb3IKKyAgLy8vIHRvIHRoZSBmcmFtZSBzZXR1cCBpbnN0cnVjdGlvbi4gSXQgb2NjdXJzIGluIHRoZSBjYWxscyB0aGF0IGludm9sdmUKKyAgLy8vIGluYWxsb2NhIGFyZ3VtZW50cy4gVGhpcyBmdW5jdGlvbiByZXBvcnRzIG9ubHkgdGhlIHNpemUgb2YgdGhlIGZyYW1lIHBhcnQKKyAgLy8vIHRoYXQgaXMgc2V0IHVwIGJldHdlZW4gdGhlIGZyYW1lIHNldHVwIGFuZCBkZXN0cm95IHBzZXVkbyBpbnN0cnVjdGlvbnMuCisgIGludDY0X3QgZ2V0RnJhbWVTaXplKGNvbnN0IE1hY2hpbmVJbnN0ciAmSSkgY29uc3QgeworICAgIGFzc2VydChpc0ZyYW1lSW5zdHIoSSkgJiYgIk5vdCBhIGZyYW1lIGluc3RydWN0aW9uIik7CisgICAgYXNzZXJ0KEkuZ2V0T3BlcmFuZCgwKS5nZXRJbW0oKSA+PSAwKTsKKyAgICByZXR1cm4gSS5nZXRPcGVyYW5kKDApLmdldEltbSgpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHRvdGFsIGZyYW1lIHNpemUsIHdoaWNoIGlzIG1hZGUgdXAgb2YgdGhlIHNwYWNlIHNldCB1cCBpbnNpZGUKKyAgLy8vIHRoZSBwYWlyIG9mIGZyYW1lIHN0YXJ0LXN0b3AgaW5zdHJ1Y3Rpb25zIGFuZCB0aGUgc3BhY2UgdGhhdCBpcyBzZXQgdXAKKyAgLy8vIHByaW9yIHRvIHRoZSBwYWlyLgorICBpbnQ2NF90IGdldEZyYW1lVG90YWxTaXplKGNvbnN0IE1hY2hpbmVJbnN0ciAmSSkgY29uc3QgeworICAgIGlmIChpc0ZyYW1lU2V0dXAoSSkpIHsKKyAgICAgIGFzc2VydChJLmdldE9wZXJhbmQoMSkuZ2V0SW1tKCkgPj0gMCAmJgorICAgICAgICAgICAgICJGcmFtZSBzaXplIG11c3Qgbm90IGJlIG5lZ2F0aXZlIik7CisgICAgICByZXR1cm4gZ2V0RnJhbWVTaXplKEkpICsgSS5nZXRPcGVyYW5kKDEpLmdldEltbSgpOworICAgIH0KKyAgICByZXR1cm4gZ2V0RnJhbWVTaXplKEkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0Q2F0Y2hSZXR1cm5PcGNvZGUoKSBjb25zdCB7IHJldHVybiBDYXRjaFJldE9wY29kZTsgfQorICB1bnNpZ25lZCBnZXRSZXR1cm5PcGNvZGUoKSBjb25zdCB7IHJldHVybiBSZXR1cm5PcGNvZGU7IH0KKworICAvLy8gUmV0dXJucyB0aGUgYWN0dWFsIHN0YWNrIHBvaW50ZXIgYWRqdXN0bWVudCBtYWRlIGJ5IGFuIGluc3RydWN0aW9uCisgIC8vLyBhcyBwYXJ0IG9mIGEgY2FsbCBzZXF1ZW5jZS4gQnkgZGVmYXVsdCwgb25seSBjYWxsIGZyYW1lIHNldHVwL2Rlc3Ryb3kKKyAgLy8vIGluc3RydWN0aW9ucyBhZGp1c3QgdGhlIHN0YWNrLCBidXQgdGFyZ2V0cyBtYXkgd2FudCB0byBvdmVycmlkZSB0aGlzCisgIC8vLyB0byBlbmFibGUgbW9yZSBmaW5lLWdyYWluZWQgYWRqdXN0bWVudCwgb3IgYWRqdXN0IGJ5IGEgZGlmZmVyZW50IHZhbHVlLgorICB2aXJ0dWFsIGludCBnZXRTUEFkanVzdChjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGEgImNvYWxlc2NhYmxlIiBleHRlbnNpb24gaW5zdHJ1Y3Rpb24uCisgIC8vLyBUaGF0IGlzLCBpdCdzIGxpa2UgYSBjb3B5IHdoZXJlIGl0J3MgbGVnYWwgZm9yIHRoZSBzb3VyY2UgdG8gb3ZlcmxhcCB0aGUKKyAgLy8vIGRlc3RpbmF0aW9uLiBlLmcuIFg4Njo6TU9WU1g2NHJyMzIuIElmIHRoaXMgcmV0dXJucyB0cnVlLCB0aGVuIGl0J3MKKyAgLy8vIGV4cGVjdGVkIHRoZSBwcmUtZXh0ZW5zaW9uIHZhbHVlIGlzIGF2YWlsYWJsZSBhcyBhIHN1YnJlZyBvZiB0aGUgcmVzdWx0CisgIC8vLyByZWdpc3Rlci4gVGhpcyBhbHNvIHJldHVybnMgdGhlIHN1Yi1yZWdpc3RlciBpbmRleCBpbiBTdWJJZHguCisgIHZpcnR1YWwgYm9vbCBpc0NvYWxlc2NhYmxlRXh0SW5zdHIoY29uc3QgTWFjaGluZUluc3RyICZNSSwgdW5zaWduZWQgJlNyY1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRHN0UmVnLCB1bnNpZ25lZCAmU3ViSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIElmIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0cnVjdGlvbiBpcyBhIGRpcmVjdAorICAvLy8gbG9hZCBmcm9tIGEgc3RhY2sgc2xvdCwgcmV0dXJuIHRoZSB2aXJ0dWFsIG9yIHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlciBvZgorICAvLy8gdGhlIGRlc3RpbmF0aW9uIGFsb25nIHdpdGggdGhlIEZyYW1lSW5kZXggb2YgdGhlIGxvYWRlZCBzdGFjayBzbG90LiAgSWYKKyAgLy8vIG5vdCwgcmV0dXJuIDAuICBUaGlzIHByZWRpY2F0ZSBtdXN0IHJldHVybiAwIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMKKyAgLy8vIGFueSBzaWRlIGVmZmVjdHMgb3RoZXIgdGhhbiBsb2FkaW5nIGZyb20gdGhlIHN0YWNrIHNsb3QuCisgIHZpcnR1YWwgdW5zaWduZWQgaXNMb2FkRnJvbVN0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gQ2hlY2sgZm9yIHBvc3QtZnJhbWUgcHRyIGVsaW1pbmF0aW9uIHN0YWNrIGxvY2F0aW9ucyBhcyB3ZWxsLgorICAvLy8gVGhpcyB1c2VzIGEgaGV1cmlzdGljIHNvIGl0IGlzbid0IHJlbGlhYmxlIGZvciBjb3JyZWN0bmVzcy4KKyAgdmlydHVhbCB1bnNpZ25lZCBpc0xvYWRGcm9tU3RhY2tTbG90UG9zdEZFKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBJZiB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaGFzIGEgbG9hZCBmcm9tIGEgc3RhY2sgc2xvdCwKKyAgLy8vIHJldHVybiB0cnVlIGFsb25nIHdpdGggdGhlIEZyYW1lSW5kZXggb2YgdGhlIGxvYWRlZCBzdGFjayBzbG90IGFuZCB0aGUKKyAgLy8vIG1hY2hpbmUgbWVtIG9wZXJhbmQgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlLgorICAvLy8gSWYgbm90LCByZXR1cm4gZmFsc2UuICBVbmxpa2UgaXNMb2FkRnJvbVN0YWNrU2xvdCwgdGhpcyByZXR1cm5zIHRydWUgZm9yCisgIC8vLyBhbnkgaW5zdHJ1Y3Rpb25zIHRoYXQgbG9hZHMgZnJvbSB0aGUgc3RhY2suICBUaGlzIGlzIGp1c3QgYSBoaW50LCBhcyBzb21lCisgIC8vLyBjYXNlcyBtYXkgYmUgbWlzc2VkLgorICB2aXJ0dWFsIGJvb2wgaGFzTG9hZEZyb21TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVNZW1PcGVyYW5kIComTU1PLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUluZGV4KSBjb25zdDsKKworICAvLy8gSWYgdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RydWN0aW9uIGlzIGEgZGlyZWN0CisgIC8vLyBzdG9yZSB0byBhIHN0YWNrIHNsb3QsIHJldHVybiB0aGUgdmlydHVhbCBvciBwaHlzaWNhbCByZWdpc3RlciBudW1iZXIgb2YKKyAgLy8vIHRoZSBzb3VyY2UgcmVnIGFsb25nIHdpdGggdGhlIEZyYW1lSW5kZXggb2YgdGhlIGxvYWRlZCBzdGFjayBzbG90LiAgSWYKKyAgLy8vIG5vdCwgcmV0dXJuIDAuICBUaGlzIHByZWRpY2F0ZSBtdXN0IHJldHVybiAwIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMKKyAgLy8vIGFueSBzaWRlIGVmZmVjdHMgb3RoZXIgdGhhbiBzdG9yaW5nIHRvIHRoZSBzdGFjayBzbG90LgorICB2aXJ0dWFsIHVuc2lnbmVkIGlzU3RvcmVUb1N0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBDaGVjayBmb3IgcG9zdC1mcmFtZSBwdHIgZWxpbWluYXRpb24gc3RhY2sgbG9jYXRpb25zIGFzIHdlbGwuCisgIC8vLyBUaGlzIHVzZXMgYSBoZXVyaXN0aWMsIHNvIGl0IGlzbid0IHJlbGlhYmxlIGZvciBjb3JyZWN0bmVzcy4KKyAgdmlydHVhbCB1bnNpZ25lZCBpc1N0b3JlVG9TdGFja1Nsb3RQb3N0RkUoY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gSWYgdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RydWN0aW9uIGhhcyBhIHN0b3JlIHRvIGEgc3RhY2sgc2xvdCwKKyAgLy8vIHJldHVybiB0cnVlIGFsb25nIHdpdGggdGhlIEZyYW1lSW5kZXggb2YgdGhlIGxvYWRlZCBzdGFjayBzbG90IGFuZCB0aGUKKyAgLy8vIG1hY2hpbmUgbWVtIG9wZXJhbmQgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlLgorICAvLy8gSWYgbm90LCByZXR1cm4gZmFsc2UuICBVbmxpa2UgaXNTdG9yZVRvU3RhY2tTbG90LAorICAvLy8gdGhpcyByZXR1cm5zIHRydWUgZm9yIGFueSBpbnN0cnVjdGlvbnMgdGhhdCBzdG9yZXMgdG8gdGhlCisgIC8vLyBzdGFjay4gIFRoaXMgaXMganVzdCBhIGhpbnQsIGFzIHNvbWUgY2FzZXMgbWF5IGJlIG1pc3NlZC4KKyAgdmlydHVhbCBib29sIGhhc1N0b3JlVG9TdGFja1Nsb3QoY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZU1lbU9wZXJhbmQgKiZNTU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0cnVjdGlvbgorICAvLy8gaXMgYSBjb3B5IG9mIG9uZSBzdGFjayBzbG90IHRvIGFub3RoZXIgYW5kIGhhcyBubyBvdGhlciBlZmZlY3QuCisgIC8vLyBQcm92aWRlIHRoZSBpZGVudGl0eSBvZiB0aGUgdHdvIGZyYW1lIGluZGljZXMuCisgIHZpcnR1YWwgYm9vbCBpc1N0YWNrU2xvdENvcHkoY29uc3QgTWFjaGluZUluc3RyICZNSSwgaW50ICZEZXN0RnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJlNyY0ZyYW1lSW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gQ29tcHV0ZSB0aGUgc2l6ZSBpbiBieXRlcyBhbmQgb2Zmc2V0IHdpdGhpbiBhIHN0YWNrIHNsb3Qgb2YgYSBzcGlsbGVkCisgIC8vLyByZWdpc3RlciBvciBzdWJyZWdpc3Rlci4KKyAgLy8vCisgIC8vLyBccGFyYW0gW291dF0gU2l6ZSBpbiBieXRlcyBvZiB0aGUgc3BpbGxlZCB2YWx1ZS4KKyAgLy8vIFxwYXJhbSBbb3V0XSBPZmZzZXQgaW4gYnl0ZXMgd2l0aGluIHRoZSBzdGFjayBzbG90LgorICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBib3RoIFNpemUgYW5kIE9mZnNldCBhcmUgc3VjY2Vzc2Z1bGx5IGNvbXB1dGVkLgorICAvLy8KKyAgLy8vIE5vdCBhbGwgc3VicmVnaXN0ZXJzIGhhdmUgY29tcHV0YWJsZSBzcGlsbCBzbG90cy4gRm9yIGV4YW1wbGUsCisgIC8vLyBzdWJyZWdpc3RlcnMgcmVnaXN0ZXJzIG1heSBub3QgYmUgYnl0ZS1zaXplZCwgYW5kIGEgcGFpciBvZiBkaXNjb250aWd1b3VzCisgIC8vLyBzdWJyZWdpc3RlcnMgaGFzIG5vIHNpbmdsZSBvZmZzZXQuCisgIC8vLworICAvLy8gVGFyZ2V0cyB3aXRoIG5vbnRyaXZpYWwgYmlnZW5kaWFuIGltcGxlbWVudGF0aW9ucyBtYXkgbmVlZCB0byBvdmVycmlkZQorICAvLy8gdGhpcywgcGFydGljdWxhcmx5IHRvIHN1cHBvcnQgc3BpbGxlZCB2ZWN0b3IgcmVnaXN0ZXJzLgorICB2aXJ0dWFsIGJvb2wgZ2V0U3RhY2tTbG90UmFuZ2UoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsIHVuc2lnbmVkIFN1YklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZTaXplLCB1bnNpZ25lZCAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHNwZWNpZmllZCBNYWNoaW5lSW5zdHIsIG9yIH4wVQorICAvLy8gd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBieSBhIHRhcmdldC4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRJbnN0U2l6ZUluQnl0ZXMoY29uc3QgTWFjaGluZUluc3RyICZNSSkgY29uc3QgeworICAgIHJldHVybiB+MFU7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGFzIGNoZWFwIGFzIGEgbW92ZSBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBUYXJnZXRzIGZvciBkaWZmZXJlbnQgYXJjaHMgbmVlZCB0byBvdmVycmlkZSB0aGlzLCBhbmQgZGlmZmVyZW50CisgIC8vLyBtaWNyby1hcmNoaXRlY3R1cmVzIGNhbiBhbHNvIGJlIGZpbmVseSB0dW5lZCBpbnNpZGUuCisgIHZpcnR1YWwgYm9vbCBpc0FzQ2hlYXBBc0FNb3ZlKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0IHsKKyAgICByZXR1cm4gTUkuaXNBc0NoZWFwQXNBTW92ZSgpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBzaG91bGQgYmUgc3VuayBieSBNYWNoaW5lU2luay4KKyAgLy8vCisgIC8vLyBNYWNoaW5lU2luayBkZXRlcm1pbmVzIG9uIGl0cyBvd24gd2hldGhlciB0aGUgaW5zdHJ1Y3Rpb24gaXMgc2FmZSB0byBzaW5rOworICAvLy8gdGhpcyBnaXZlcyB0aGUgdGFyZ2V0IGEgaG9vayB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvciB3aXRoIHJlZ2FyZHMKKyAgLy8vIHRvIHdoaWNoIGluc3RydWN0aW9ucyBzaG91bGQgYmUgc3Vuay4KKyAgdmlydHVhbCBib29sIHNob3VsZFNpbmsoY29uc3QgTWFjaGluZUluc3RyICZNSSkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBSZS1pc3N1ZSB0aGUgc3BlY2lmaWVkICdvcmlnaW5hbCcgaW5zdHJ1Y3Rpb24gYXQgdGhlCisgIC8vLyBzcGVjaWZpYyBsb2NhdGlvbiB0YXJnZXRpbmcgYSBuZXcgZGVzdGluYXRpb24gcmVnaXN0ZXIuCisgIC8vLyBUaGUgcmVnaXN0ZXIgaW4gT3JpZy0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSB3aWxsIGJlIHN1YnN0aXR1dGVkIGJ5CisgIC8vLyBEZXN0UmVnOlN1YklkeC4gQW55IGV4aXN0aW5nIHN1YnJlZyBpbmRleCBpcyBwcmVzZXJ2ZWQgb3IgY29tcG9zZWQgd2l0aAorICAvLy8gU3ViSWR4LgorICB2aXJ0dWFsIHZvaWQgcmVNYXRlcmlhbGl6ZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksIHVuc2lnbmVkIERlc3RSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFN1YklkeCwgY29uc3QgTWFjaGluZUluc3RyICZPcmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDbG9uZXMgaW5zdHJ1Y3Rpb24gb3IgdGhlIHdob2xlIGluc3RydWN0aW9uIGJ1bmRsZSBccCBPcmlnIGFuZAorICAvLy8gaW5zZXJ0IGludG8gXHAgTUJCIGJlZm9yZSBccCBJbnNlcnRCZWZvcmUuIFRoZSB0YXJnZXQgbWF5IHVwZGF0ZSBvcGVyYW5kcworICAvLy8gdGhhdCBhcmUgcmVxdWlyZWQgdG8gYmUgdW5pcXVlLgorICAvLy8KKyAgLy8vIFxwIE9yaWcgbXVzdCBub3QgcmV0dXJuIHRydWUgZm9yIE1hY2hpbmVJbnN0cjo6aXNOb3REdXBsaWNhYmxlKCkuCisgIHZpcnR1YWwgTWFjaGluZUluc3RyICZkdXBsaWNhdGUoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0QmVmb3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAmT3JpZykgY29uc3Q7CisKKyAgLy8vIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGFyZ2V0cyB0aGF0CisgIC8vLyBzZXQgdGhlIE1fQ09OVkVSVElCTEVfVE9fM19BRERSIGZsYWcuICBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSB0YXJnZXQKKyAgLy8vIG1heSBiZSBhYmxlIHRvIGNvbnZlcnQgYSB0d28tYWRkcmVzcyBpbnN0cnVjdGlvbiBpbnRvIG9uZSBvciBtb3JlIHRydWUKKyAgLy8vIHRocmVlLWFkZHJlc3MgaW5zdHJ1Y3Rpb25zIG9uIGRlbWFuZC4gIFRoaXMgYWxsb3dzIHRoZSBYODYgdGFyZ2V0IChmb3IKKyAgLy8vIGV4YW1wbGUpIHRvIGNvbnZlcnQgQUREIGFuZCBTSEwgaW5zdHJ1Y3Rpb25zIGludG8gTEVBIGluc3RydWN0aW9ucyBpZiB0aGV5CisgIC8vLyB3b3VsZCByZXF1aXJlIHJlZ2lzdGVyIGNvcGllcyBkdWUgdG8gdHdvLWFkZHJlc3NuZXNzLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgYSBudWxsIHBvaW50ZXIgaWYgdGhlIHRyYW5zZm9ybWF0aW9uIGNhbm5vdCBiZQorICAvLy8gcGVyZm9ybWVkLCBvdGhlcndpc2UgaXQgcmV0dXJucyB0aGUgbGFzdCBuZXcgaW5zdHJ1Y3Rpb24uCisgIC8vLworICB2aXJ0dWFsIE1hY2hpbmVJbnN0ciAqY29udmVydFRvVGhyZWVBZGRyZXNzKE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgJk1GSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpdmVWYXJpYWJsZXMgKkxWKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLyBUaGlzIGNvbnN0YW50IGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IHZhbHVlIG9mIG9wZXJhbmQgaW5kZXggcGFzc2VkIHRvCisgIC8vIHRoZSBtZXRob2QgZmluZENvbW11dGVkT3BJbmRpY2VzKCkgdG8gdGVsbCB0aGUgbWV0aG9kIHRoYXQgdGhlCisgIC8vIGNvcnJlc3BvbmRpbmcgb3BlcmFuZCBpbmRleCBpcyBub3QgcHJlLWRlZmluZWQgYW5kIHRoYXQgdGhlIG1ldGhvZAorICAvLyBjYW4gcGljayBhbnkgY29tbXV0YWJsZSBvcGVyYW5kLgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQ29tbXV0ZUFueU9wZXJhbmRJbmRleCA9IH4wVTsKKworICAvLy8gVGhpcyBtZXRob2QgY29tbXV0ZXMgdGhlIG9wZXJhbmRzIG9mIHRoZSBnaXZlbiBtYWNoaW5lIGluc3RydWN0aW9uIE1JLgorICAvLy8KKyAgLy8vIFRoZSBvcGVyYW5kcyB0byBiZSBjb21tdXRlZCBhcmUgc3BlY2lmaWVkIGJ5IHRoZWlyIGluZGljZXMgT3BJZHgxIGFuZAorICAvLy8gT3BJZHgyLiBPcElkeDEgYW5kIE9wSWR4MiBhcmd1bWVudHMgbWF5IGJlIHNldCB0byBhIHNwZWNpYWwgdmFsdWUKKyAgLy8vICdDb21tdXRlQW55T3BlcmFuZEluZGV4Jywgd2hpY2ggbWVhbnMgdGhhdCB0aGUgbWV0aG9kIGlzIGZyZWUgdG8gY2hvb3NlCisgIC8vLyBhbnkgYXJiaXRyYXJpbHkgY2hvc2VuIGNvbW11dGFibGUgb3BlcmFuZC4gSWYgYm90aCBhcmd1bWVudHMgYXJlIHNldCB0bworICAvLy8gJ0NvbW11dGVBbnlPcGVyYW5kSW5kZXgnIHRoZW4gdGhlIG1ldGhvZCBsb29rcyBmb3IgMiBkaWZmZXJlbnQgY29tbXV0YWJsZQorICAvLy8gb3BlcmFuZHM7IHRoZW4gY29tbXV0ZXMgdGhlbSBpZiBzdWNoIG9wZXJhbmRzIGNvdWxkIGJlIGZvdW5kLgorICAvLy8KKyAgLy8vIElmIE5ld01JIGlzIGZhbHNlLCBNSSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQ7IG90aGVyd2lzZSwgYQorICAvLy8gbmV3IG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaXMgY3JlYXRlZCBhbmQgcmV0dXJuZWQuCisgIC8vLworICAvLy8gRG8gbm90IGNhbGwgdGhpcyBtZXRob2QgZm9yIGEgbm9uLWNvbW11dGFibGUgaW5zdHJ1Y3Rpb24gb3IKKyAgLy8vIGZvciBub24tY29tbXVhYmxlIG9wZXJhbmRzLgorICAvLy8gRXZlbiB0aG91Z2ggdGhlIGluc3RydWN0aW9uIGlzIGNvbW11dGFibGUsIHRoZSBtZXRob2QgbWF5IHN0aWxsCisgIC8vLyBmYWlsIHRvIGNvbW11dGUgdGhlIG9wZXJhbmRzLCBudWxsIHBvaW50ZXIgaXMgcmV0dXJuZWQgaW4gc3VjaCBjYXNlcy4KKyAgTWFjaGluZUluc3RyICoKKyAgY29tbXV0ZUluc3RydWN0aW9uKE1hY2hpbmVJbnN0ciAmTUksIGJvb2wgTmV3TUkgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wSWR4MSA9IENvbW11dGVBbnlPcGVyYW5kSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcElkeDIgPSBDb21tdXRlQW55T3BlcmFuZEluZGV4KSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgcm91dGluZSBjb3VsZCBmaW5kIHR3byBjb21tdXRhYmxlIG9wZXJhbmRzIGluIHRoZQorICAvLy8gZ2l2ZW4gbWFjaGluZSBpbnN0cnVjdGlvbi4KKyAgLy8vIFRoZSAnU3JjT3BJZHgxJyBhbmQgJ1NyY09wSWR4MicgYXJlIElOUFVUIGFuZCBPVVRQVVQgYXJndW1lbnRzLgorICAvLy8gSWYgYW55IG9mIHRoZSBJTlBVVCB2YWx1ZXMgaXMgc2V0IHRvIHRoZSBzcGVjaWFsIHZhbHVlCisgIC8vLyAnQ29tbXV0ZUFueU9wZXJhbmRJbmRleCcgdGhlbiB0aGUgbWV0aG9kIGFyYml0cmFyaWx5IHBpY2tzIGEgY29tbXV0YWJsZQorICAvLy8gb3BlcmFuZCwgdGhlbiByZXR1cm5zIGl0cyBpbmRleCBpbiB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudC4KKyAgLy8vIElmIGJvdGggb2YgSU5QVVQgdmFsdWVzIGFyZSBzZXQgdG8gJ0NvbW11dGVBbnlPcGVyYW5kSW5kZXgnIHRoZW4gbWV0aG9kCisgIC8vLyBsb29rcyBmb3IgMiBjb21tdXRhYmxlIG9wZXJhbmRzLgorICAvLy8gSWYgSU5QVVQgdmFsdWVzIHJlZmVyIHRvIHNvbWUgb3BlcmFuZHMgb2YgTUksIHRoZW4gdGhlIG1ldGhvZCBzaW1wbHkKKyAgLy8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBvcGVyYW5kcyBhcmUgY29tbXV0YWJsZSBhbmQgcmV0dXJucworICAvLy8gZmFsc2Ugb3RoZXJ3aXNlLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlLCBjYWxsaW5nIHRoaXMgbWV0aG9kIHRoaXMgd2F5OgorICAvLy8gICAgIHVuc2lnbmVkIE9wMSA9IDEsIE9wMiA9IENvbW11dGVBbnlPcGVyYW5kSW5kZXg7CisgIC8vLyAgICAgZmluZENvbW11dGVkT3BJbmRpY2VzKE1JLCBPcDEsIE9wMik7CisgIC8vLyBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYSBxdWVyeSBhc2tpbmcgdG8gZmluZCBhbiBvcGVyYW5kIHRoYXQgd291bGQgYmUKKyAgLy8vIGNvbW11dGFibGUgd2l0aCB0aGUgb3BlcmFuZCMxLgorICB2aXJ0dWFsIGJvb2wgZmluZENvbW11dGVkT3BJbmRpY2VzKE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkICZTcmNPcElkeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlNyY09wSWR4MikgY29uc3Q7CisKKyAgLy8vIEEgcGFpciBjb21wb3NlZCBvZiBhIHJlZ2lzdGVyIGFuZCBhIHN1Yi1yZWdpc3RlciBpbmRleC4KKyAgLy8vIFVzZWQgdG8gZ2l2ZSBzb21lIHR5cGUgY2hlY2tpbmcgd2hlbiBtb2RlbGluZyBSZWc6U3ViUmVnLgorICBzdHJ1Y3QgUmVnU3ViUmVnUGFpciB7CisgICAgdW5zaWduZWQgUmVnOworICAgIHVuc2lnbmVkIFN1YlJlZzsKKworICAgIFJlZ1N1YlJlZ1BhaXIodW5zaWduZWQgUmVnID0gMCwgdW5zaWduZWQgU3ViUmVnID0gMCkKKyAgICAgICAgOiBSZWcoUmVnKSwgU3ViUmVnKFN1YlJlZykge30KKyAgfTsKKworICAvLy8gQSBwYWlyIGNvbXBvc2VkIG9mIGEgcGFpciBvZiBhIHJlZ2lzdGVyIGFuZCBhIHN1Yi1yZWdpc3RlciBpbmRleCwKKyAgLy8vIGFuZCBhbm90aGVyIHN1Yi1yZWdpc3RlciBpbmRleC4KKyAgLy8vIFVzZWQgdG8gZ2l2ZSBzb21lIHR5cGUgY2hlY2tpbmcgd2hlbiBtb2RlbGluZyBSZWc6U3ViUmVnMSwgU3ViUmVnMi4KKyAgc3RydWN0IFJlZ1N1YlJlZ1BhaXJBbmRJZHggOiBSZWdTdWJSZWdQYWlyIHsKKyAgICB1bnNpZ25lZCBTdWJJZHg7CisKKyAgICBSZWdTdWJSZWdQYWlyQW5kSWR4KHVuc2lnbmVkIFJlZyA9IDAsIHVuc2lnbmVkIFN1YlJlZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdWJJZHggPSAwKQorICAgICAgICA6IFJlZ1N1YlJlZ1BhaXIoUmVnLCBTdWJSZWcpLCBTdWJJZHgoU3ViSWR4KSB7fQorICB9OworCisgIC8vLyBCdWlsZCB0aGUgZXF1aXZhbGVudCBpbnB1dHMgb2YgYSBSRUdfU0VRVUVOQ0UgZm9yIHRoZSBnaXZlbiBccCBNSQorICAvLy8gYW5kIFxwIERlZklkeC4KKyAgLy8vIFxwIFtvdXRdIElucHV0UmVncyBvZiB0aGUgZXF1aXZhbGVudCBSRUdfU0VRVUVOQ0UuIEVhY2ggZWxlbWVudCBvZgorICAvLy8gdGhlIGxpc3QgaXMgbW9kZWxlZCBhcyA8UmVnOlN1YlJlZywgU3ViSWR4Pi4gT3BlcmFuZHMgd2l0aCB0aGUgdW5kZWYKKyAgLy8vIGZsYWcgYXJlIG5vdCBhZGRlZCB0byB0aGlzIGxpc3QuCisgIC8vLyBFLmcuLCBSRUdfU0VRVUVOQ0UgJTE6c3ViMSwgc3ViMCwgJTIsIHN1YjEgd291bGQgcHJvZHVjZQorICAvLy8gdHdvIGVsZW1lbnRzOgorICAvLy8gLSAlMTpzdWIxLCBzdWIwCisgIC8vLyAtICUyPDowPiwgc3ViMQorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgc3VjaCBhbiBpbnB1dCBzZXF1ZW5jZQorICAvLy8gd2l0aCB0aGUgcGFpciBccCBNSSwgXHAgRGVmSWR4LiBGYWxzZSBvdGhlcndpc2UuCisgIC8vLworICAvLy8gXHByZSBNSS5pc1JlZ1NlcXVlbmNlKCkgb3IgTUkuaXNSZWdTZXF1ZW5jZUxpa2UoKS4KKyAgLy8vCisgIC8vLyBcbm90ZSBUaGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBwcm92aWRlIGFueSBzdXBwb3J0IGZvcgorICAvLy8gTUkuaXNSZWdTZXF1ZW5jZUxpa2UoKS4gSW4gb3RoZXIgd29yZHMsIG9uZSBoYXMgdG8gb3ZlcnJpZGUKKyAgLy8vIGdldFJlZ1NlcXVlbmNlTGlrZUlucHV0cyBmb3IgdGFyZ2V0IHNwZWNpZmljIGluc3RydWN0aW9ucy4KKyAgYm9vbAorICBnZXRSZWdTZXF1ZW5jZUlucHV0cyhjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBEZWZJZHgsCisgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxSZWdTdWJSZWdQYWlyQW5kSWR4PiAmSW5wdXRSZWdzKSBjb25zdDsKKworICAvLy8gQnVpbGQgdGhlIGVxdWl2YWxlbnQgaW5wdXRzIG9mIGEgRVhUUkFDVF9TVUJSRUcgZm9yIHRoZSBnaXZlbiBccCBNSQorICAvLy8gYW5kIFxwIERlZklkeC4KKyAgLy8vIFxwIFtvdXRdIElucHV0UmVnIG9mIHRoZSBlcXVpdmFsZW50IEVYVFJBQ1RfU1VCUkVHLgorICAvLy8gRS5nLiwgRVhUUkFDVF9TVUJSRUcgJTE6c3ViMSwgc3ViMCwgc3ViMSB3b3VsZCBwcm9kdWNlOgorICAvLy8gLSAlMTpzdWIxLCBzdWIwCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBidWlsZCBzdWNoIGFuIGlucHV0IHNlcXVlbmNlCisgIC8vLyB3aXRoIHRoZSBwYWlyIFxwIE1JLCBccCBEZWZJZHggYW5kIHRoZSBvcGVyYW5kIGhhcyBubyB1bmRlZiBmbGFnIHNldC4KKyAgLy8vIEZhbHNlIG90aGVyd2lzZS4KKyAgLy8vCisgIC8vLyBccHJlIE1JLmlzRXh0cmFjdFN1YnJlZygpIG9yIE1JLmlzRXh0cmFjdFN1YnJlZ0xpa2UoKS4KKyAgLy8vCisgIC8vLyBcbm90ZSBUaGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBwcm92aWRlIGFueSBzdXBwb3J0IGZvcgorICAvLy8gTUkuaXNFeHRyYWN0U3VicmVnTGlrZSgpLiBJbiBvdGhlciB3b3Jkcywgb25lIGhhcyB0byBvdmVycmlkZQorICAvLy8gZ2V0RXh0cmFjdFN1YnJlZ0xpa2VJbnB1dHMgZm9yIHRhcmdldCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMuCisgIGJvb2wgZ2V0RXh0cmFjdFN1YnJlZ0lucHV0cyhjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBEZWZJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTdWJSZWdQYWlyQW5kSWR4ICZJbnB1dFJlZykgY29uc3Q7CisKKyAgLy8vIEJ1aWxkIHRoZSBlcXVpdmFsZW50IGlucHV0cyBvZiBhIElOU0VSVF9TVUJSRUcgZm9yIHRoZSBnaXZlbiBccCBNSQorICAvLy8gYW5kIFxwIERlZklkeC4KKyAgLy8vIFxwIFtvdXRdIEJhc2VSZWcgYW5kIFxwIFtvdXRdIEluc2VydGVkUmVnIGNvbnRhaW4KKyAgLy8vIHRoZSBlcXVpdmFsZW50IGlucHV0cyBvZiBJTlNFUlRfU1VCUkVHLgorICAvLy8gRS5nLiwgSU5TRVJUX1NVQlJFRyAlMDpzdWIwLCAlMTpzdWIxLCBzdWIzIHdvdWxkIHByb2R1Y2U6CisgIC8vLyAtIEJhc2VSZWc6ICUwOnN1YjAKKyAgLy8vIC0gSW5zZXJ0ZWRSZWc6ICUxOnN1YjEsIHN1YjMKKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkIHN1Y2ggYW4gaW5wdXQgc2VxdWVuY2UKKyAgLy8vIHdpdGggdGhlIHBhaXIgXHAgTUksIFxwIERlZklkeCBhbmQgdGhlIG9wZXJhbmQgaGFzIG5vIHVuZGVmIGZsYWcgc2V0LgorICAvLy8gRmFsc2Ugb3RoZXJ3aXNlLgorICAvLy8KKyAgLy8vIFxwcmUgTUkuaXNJbnNlcnRTdWJyZWcoKSBvciBNSS5pc0luc2VydFN1YnJlZ0xpa2UoKS4KKyAgLy8vCisgIC8vLyBcbm90ZSBUaGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBwcm92aWRlIGFueSBzdXBwb3J0IGZvcgorICAvLy8gTUkuaXNJbnNlcnRTdWJyZWdMaWtlKCkuIEluIG90aGVyIHdvcmRzLCBvbmUgaGFzIHRvIG92ZXJyaWRlCisgIC8vLyBnZXRJbnNlcnRTdWJyZWdMaWtlSW5wdXRzIGZvciB0YXJnZXQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zLgorICBib29sIGdldEluc2VydFN1YnJlZ0lucHV0cyhjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBEZWZJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1N1YlJlZ1BhaXIgJkJhc2VSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1N1YlJlZ1BhaXJBbmRJZHggJkluc2VydGVkUmVnKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdHdvIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIHdvdWxkIHByb2R1Y2UgaWRlbnRpY2FsIHZhbHVlcy4KKyAgLy8vIEJ5IGRlZmF1bHQsIHRoaXMgaXMgb25seSB0cnVlIHdoZW4gdGhlIHR3byBpbnN0cnVjdGlvbnMKKyAgLy8vIGFyZSBkZWVtZWQgaWRlbnRpY2FsIGV4Y2VwdCBmb3IgZGVmcy4gSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUKKyAgLy8vIElSIGlzIHN0aWxsIGluIFNTQSBmb3JtLCB0aGUgY2FsbGVyIGNhbiBwYXNzIHRoZSBNYWNoaW5lUmVnaXN0ZXJJbmZvIGZvcgorICAvLy8gYWdncmVzc2l2ZSBjaGVja3MuCisgIHZpcnR1YWwgYm9vbCBwcm9kdWNlU2FtZVZhbHVlKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgJk1JMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgYSBicmFuY2ggZnJvbSBhbiBpbnN0cnVjdGlvbiB3aXRoIG9wY29kZSBccCBCcmFuY2hPcGMKKyAgLy8vICBieXRlcyBpcyBjYXBhYmxlIG9mIGp1bXBpbmcgdG8gYSBwb3NpdGlvbiBccCBCck9mZnNldCBieXRlcyBhd2F5LgorICB2aXJ0dWFsIGJvb2wgaXNCcmFuY2hPZmZzZXRJblJhbmdlKHVuc2lnbmVkIEJyYW5jaE9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IEJyT2Zmc2V0KSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgidGFyZ2V0IGRpZCBub3QgaW1wbGVtZW50Iik7CisgIH0KKworICAvLy8gXHJldHVybnMgVGhlIGJsb2NrIHRoYXQgYnJhbmNoIGluc3RydWN0aW9uIFxwIE1JIGp1bXBzIHRvLgorICB2aXJ0dWFsIE1hY2hpbmVCYXNpY0Jsb2NrICpnZXRCcmFuY2hEZXN0QmxvY2soY29uc3QgTWFjaGluZUluc3RyICZNSSkgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoInRhcmdldCBkaWQgbm90IGltcGxlbWVudCIpOworICB9CisKKyAgLy8vIEluc2VydCBhbiB1bmNvbmRpdGlvbmFsIGluZGlyZWN0IGJyYW5jaCBhdCB0aGUgZW5kIG9mIFxwIE1CQiB0byBccAorICAvLy8gTmV3RGVzdEJCLiAgXHAgQnJPZmZzZXQgaW5kaWNhdGVzIHRoZSBvZmZzZXQgb2YgXHAgTmV3RGVzdEJCIHJlbGF0aXZlIHRvCisgIC8vLyB0aGUgb2Zmc2V0IG9mIHRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIG5ldyBicmFuY2guCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBhZGRlZCB0byB0aGUgYmxvY2suCisgIHZpcnR1YWwgdW5zaWduZWQgaW5zZXJ0SW5kaXJlY3RCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTmV3RGVzdEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnTG9jICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IEJyT2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTY2F2ZW5nZXIgKlJTID0gbnVsbHB0cikgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoInRhcmdldCBkaWQgbm90IGltcGxlbWVudCIpOworICB9CisKKyAgLy8vIEFuYWx5emUgdGhlIGJyYW5jaGluZyBjb2RlIGF0IHRoZSBlbmQgb2YgTUJCLCByZXR1cm5pbmcKKyAgLy8vIHRydWUgaWYgaXQgY2Fubm90IGJlIHVuZGVyc3Rvb2QgKGUuZy4gaXQncyBhIHN3aXRjaCBkaXNwYXRjaCBvciBpc24ndAorICAvLy8gaW1wbGVtZW50ZWQgZm9yIGEgdGFyZ2V0KS4gIFVwb24gc3VjY2VzcywgdGhpcyByZXR1cm5zIGZhbHNlIGFuZCByZXR1cm5zCisgIC8vLyB3aXRoIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaW4gdmFyaW91cyBjYXNlczoKKyAgLy8vCisgIC8vLyAxLiBJZiB0aGlzIGJsb2NrIGVuZHMgd2l0aCBubyBicmFuY2hlcyAoaXQganVzdCBmYWxscyB0aHJvdWdoIHRvIGl0cyBzdWNjKQorICAvLy8gICAganVzdCByZXR1cm4gZmFsc2UsIGxlYXZpbmcgVEJCL0ZCQiBudWxsLgorICAvLy8gMi4gSWYgdGhpcyBibG9jayBlbmRzIHdpdGggb25seSBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCwgaXQgc2V0cyBUQkIgdG8gYmUKKyAgLy8vICAgIHRoZSBkZXN0aW5hdGlvbiBibG9jay4KKyAgLy8vIDMuIElmIHRoaXMgYmxvY2sgZW5kcyB3aXRoIGEgY29uZGl0aW9uYWwgYnJhbmNoIGFuZCBpdCBmYWxscyB0aHJvdWdoIHRvIGEKKyAgLy8vICAgIHN1Y2Nlc3NvciBibG9jaywgaXQgc2V0cyBUQkIgdG8gYmUgdGhlIGJyYW5jaCBkZXN0aW5hdGlvbiBibG9jayBhbmQgYQorICAvLy8gICAgbGlzdCBvZiBvcGVyYW5kcyB0aGF0IGV2YWx1YXRlIHRoZSBjb25kaXRpb24uIFRoZXNlIG9wZXJhbmRzIGNhbiBiZQorICAvLy8gICAgcGFzc2VkIHRvIG90aGVyIFRhcmdldEluc3RySW5mbyBtZXRob2RzIHRvIGNyZWF0ZSBuZXcgYnJhbmNoZXMuCisgIC8vLyA0LiBJZiB0aGlzIGJsb2NrIGVuZHMgd2l0aCBhIGNvbmRpdGlvbmFsIGJyYW5jaCBmb2xsb3dlZCBieSBhbgorICAvLy8gICAgdW5jb25kaXRpb25hbCBicmFuY2gsIGl0IHJldHVybnMgdGhlICd0cnVlJyBkZXN0aW5hdGlvbiBpbiBUQkIsIHRoZQorICAvLy8gICAgJ2ZhbHNlJyBkZXN0aW5hdGlvbiBpbiBGQkIsIGFuZCBhIGxpc3Qgb2Ygb3BlcmFuZHMgdGhhdCBldmFsdWF0ZSB0aGUKKyAgLy8vICAgIGNvbmRpdGlvbi4gIFRoZXNlIG9wZXJhbmRzIGNhbiBiZSBwYXNzZWQgdG8gb3RoZXIgVGFyZ2V0SW5zdHJJbmZvCisgIC8vLyAgICBtZXRob2RzIHRvIGNyZWF0ZSBuZXcgYnJhbmNoZXMuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHJlbW92ZUJyYW5jaCBhbmQgaW5zZXJ0QnJhbmNoIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gc3VwcG9ydAorICAvLy8gY2FzZXMgd2hlcmUgdGhpcyBtZXRob2QgcmV0dXJucyBzdWNjZXNzLgorICAvLy8KKyAgLy8vIElmIEFsbG93TW9kaWZ5IGlzIHRydWUsIHRoZW4gdGhpcyByb3V0aW5lIGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBiYXNpYworICAvLy8gYmxvY2sgKGUuZy4gZGVsZXRlIGluc3RydWN0aW9ucyBhZnRlciB0aGUgdW5jb25kaXRpb25hbCBicmFuY2gpLgorICAvLy8KKyAgLy8vIFRoZSBDRkcgaW5mb3JtYXRpb24gaW4gTUJCLlByZWRlY2Vzc29ycyBhbmQgTUJCLlN1Y2Nlc3NvcnMgbXVzdCBiZSB2YWxpZAorICAvLy8gYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgdmlydHVhbCBib29sIGFuYWx5emVCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2sgKiZUQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrIComRkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93TW9kaWZ5ID0gZmFsc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBSZXByZXNlbnRzIGEgcHJlZGljYXRlIGF0IHRoZSBNYWNoaW5lRnVuY3Rpb24gbGV2ZWwuICBUaGUgY29udHJvbCBmbG93IGEKKyAgLy8vIE1hY2hpbmVCcmFuY2hQcmVkaWNhdGUgcmVwcmVzZW50cyBpczoKKyAgLy8vCisgIC8vLyAgUmVnID0gTEhTIGBQcmVkaWNhdGVgIFJIUyAgICAgICAgID09IENvbmRpdGlvbkRlZgorICAvLy8gIGlmIFJlZyB0aGVuIGdvdG8gVHJ1ZURlc3QgZWxzZSBnb3RvIEZhbHNlRGVzdAorICAvLy8KKyAgc3RydWN0IE1hY2hpbmVCcmFuY2hQcmVkaWNhdGUgeworICAgIGVudW0gQ29tcGFyZVByZWRpY2F0ZSB7CisgICAgICBQUkVEX0VRLCAgICAgLy8gVHJ1ZSBpZiB0d28gdmFsdWVzIGFyZSBlcXVhbAorICAgICAgUFJFRF9ORSwgICAgIC8vIFRydWUgaWYgdHdvIHZhbHVlcyBhcmUgbm90IGVxdWFsCisgICAgICBQUkVEX0lOVkFMSUQgLy8gU2VudGluZWwgdmFsdWUKKyAgICB9OworCisgICAgQ29tcGFyZVByZWRpY2F0ZSBQcmVkaWNhdGUgPSBQUkVEX0lOVkFMSUQ7CisgICAgTWFjaGluZU9wZXJhbmQgTEhTID0gTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUltbSgwKTsKKyAgICBNYWNoaW5lT3BlcmFuZCBSSFMgPSBNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlSW1tKDApOworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpUcnVlRGVzdCA9IG51bGxwdHI7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKkZhbHNlRGVzdCA9IG51bGxwdHI7CisgICAgTWFjaGluZUluc3RyICpDb25kaXRpb25EZWYgPSBudWxscHRyOworCisgICAgLy8vIFNpbmdsZVVzZUNvbmRpdGlvbiBpcyB0cnVlIGlmIENvbmRpdGlvbkRlZiBpcyBkZWFkIGV4Y2VwdCBmb3IgdGhlCisgICAgLy8vIGJyYW5jaChlcykgYXQgdGhlIGVuZCBvZiB0aGUgYmFzaWMgYmxvY2suCisgICAgLy8vCisgICAgYm9vbCBTaW5nbGVVc2VDb25kaXRpb24gPSBmYWxzZTsKKworICAgIGV4cGxpY2l0IE1hY2hpbmVCcmFuY2hQcmVkaWNhdGUoKSA9IGRlZmF1bHQ7CisgIH07CisKKyAgLy8vIEFuYWx5emUgdGhlIGJyYW5jaGluZyBjb2RlIGF0IHRoZSBlbmQgb2YgTUJCIGFuZCBwYXJzZSBpdCBpbnRvIHRoZQorICAvLy8gTWFjaGluZUJyYW5jaFByZWRpY2F0ZSBzdHJ1Y3R1cmUgaWYgcG9zc2libGUuICBSZXR1cm5zIGZhbHNlIG9uIHN1Y2Nlc3MKKyAgLy8vIGFuZCB0cnVlIG9uIGZhaWx1cmUuCisgIC8vLworICAvLy8gSWYgQWxsb3dNb2RpZnkgaXMgdHJ1ZSwgdGhlbiB0aGlzIHJvdXRpbmUgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGJhc2ljCisgIC8vLyBibG9jayAoZS5nLiBkZWxldGUgaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCkuCisgIC8vLworICB2aXJ0dWFsIGJvb2wgYW5hbHl6ZUJyYW5jaFByZWRpY2F0ZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQnJhbmNoUHJlZGljYXRlICZNQlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dNb2RpZnkgPSBmYWxzZSkgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFJlbW92ZSB0aGUgYnJhbmNoaW5nIGNvZGUgYXQgdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWMgTUJCLgorICAvLy8gVGhpcyBpcyBvbmx5IGludm9rZWQgaW4gY2FzZXMgd2hlcmUgQW5hbHl6ZUJyYW5jaCByZXR1cm5zIHN1Y2Nlc3MuIEl0CisgIC8vLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgd2VyZSByZW1vdmVkLgorICAvLy8gSWYgXHAgQnl0ZXNSZW1vdmVkIGlzIG5vbi1udWxsLCByZXBvcnQgdGhlIGNoYW5nZSBpbiBjb2RlIHNpemUgZnJvbSB0aGUKKyAgLy8vIHJlbW92ZWQgaW5zdHJ1Y3Rpb25zLgorICB2aXJ0dWFsIHVuc2lnbmVkIHJlbW92ZUJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKkJ5dGVzUmVtb3ZlZCA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUYXJnZXQgZGlkbid0IGltcGxlbWVudCBUYXJnZXRJbnN0ckluZm86OnJlbW92ZUJyYW5jaCEiKTsKKyAgfQorCisgIC8vLyBJbnNlcnQgYnJhbmNoIGNvZGUgaW50byB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgTWFjaGluZUJhc2ljQmxvY2suIFRoZQorICAvLy8gb3BlcmFuZHMgdG8gdGhpcyBtZXRob2QgYXJlIHRoZSBzYW1lIGFzIHRob3NlIHJldHVybmVkIGJ5IEFuYWx5emVCcmFuY2guCisgIC8vLyBUaGlzIGlzIG9ubHkgaW52b2tlZCBpbiBjYXNlcyB3aGVyZSBBbmFseXplQnJhbmNoIHJldHVybnMgc3VjY2Vzcy4gSXQKKyAgLy8vIHJldHVybnMgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgaW5zZXJ0ZWQuIElmIFxwIEJ5dGVzQWRkZWQgaXMgbm9uLW51bGwsCisgIC8vLyByZXBvcnQgdGhlIGNoYW5nZSBpbiBjb2RlIHNpemUgZnJvbSB0aGUgYWRkZWQgaW5zdHJ1Y3Rpb25zLgorICAvLy8KKyAgLy8vIEl0IGlzIGFsc28gaW52b2tlZCBieSB0YWlsIG1lcmdpbmcgdG8gYWRkIHVuY29uZGl0aW9uYWwgYnJhbmNoZXMgaW4KKyAgLy8vIGNhc2VzIHdoZXJlIEFuYWx5emVCcmFuY2ggZG9lc24ndCBhcHBseSBiZWNhdXNlIHRoZXJlIHdhcyBubyBvcmlnaW5hbAorICAvLy8gYnJhbmNoIHRvIGFuYWx5emUuICBBdCBsZWFzdCB0aGlzIG11Y2ggbXVzdCBiZSBpbXBsZW1lbnRlZCwgZWxzZSB0YWlsCisgIC8vLyBtZXJnaW5nIG5lZWRzIHRvIGJlIGRpc2FibGVkLgorICAvLy8KKyAgLy8vIFRoZSBDRkcgaW5mb3JtYXRpb24gaW4gTUJCLlByZWRlY2Vzc29ycyBhbmQgTUJCLlN1Y2Nlc3NvcnMgbXVzdCBiZSB2YWxpZAorICAvLy8gYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgdmlydHVhbCB1bnNpZ25lZCBpbnNlcnRCcmFuY2goTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2sgKlRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8TWFjaGluZU9wZXJhbmQ+IENvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnTG9jICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpCeXRlc0FkZGVkID0gbnVsbHB0cikgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlRhcmdldCBkaWRuJ3QgaW1wbGVtZW50IFRhcmdldEluc3RySW5mbzo6aW5zZXJ0QnJhbmNoISIpOworICB9CisKKyAgdW5zaWduZWQgaW5zZXJ0VW5jb25kaXRpb25hbEJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpEZXN0QkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdMb2MgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqQnl0ZXNBZGRlZCA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gaW5zZXJ0QnJhbmNoKE1CQiwgRGVzdEJCLCBudWxscHRyLCBBcnJheVJlZjxNYWNoaW5lT3BlcmFuZD4oKSwgREwsCisgICAgICAgICAgICAgICAgICAgICAgICBCeXRlc0FkZGVkKTsKKyAgfQorCisgIC8vLyBBbmFseXplIHRoZSBsb29wIGNvZGUsIHJldHVybiB0cnVlIGlmIGl0IGNhbm5vdCBiZSB1bmRlcnN0b28uIFVwb24KKyAgLy8vIHN1Y2Nlc3MsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBhbmQgcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgLy8vIGluZHVjdGlvbiB2YXJpYWJsZSBhbmQgY29tcGFyZSBpbnN0cnVjdGlvbiB1c2VkIGF0IHRoZSBlbmQuCisgIHZpcnR1YWwgYm9vbCBhbmFseXplTG9vcChNYWNoaW5lTG9vcCAmTCwgTWFjaGluZUluc3RyIComSW5kVmFySW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAqJkNtcEluc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBHZW5lcmF0ZSBjb2RlIHRvIHJlZHVjZSB0aGUgbG9vcCBpdGVyYXRpb24gYnkgb25lIGFuZCBjaGVjayBpZiB0aGUgbG9vcAorICAvLy8gaXMgZmluaXNoZWQuICBSZXR1cm4gdGhlIHZhbHVlL3JlZ2lzdGVyIG9mIHRoZSBuZXcgbG9vcCBjb3VudC4gIFdlIG5lZWQKKyAgLy8vIHRoaXMgZnVuY3Rpb24gd2hlbiBwZWVsaW5nIG9mZiBvbmUgb3IgbW9yZSBpdGVyYXRpb25zIG9mIGEgbG9vcC4gVGhpcworICAvLy8gZnVuY3Rpb24gYXNzdW1lcyB0aGUgbnRoIGl0ZXJhdGlvbiBpcyBwZWVsZWQgZmlyc3QuCisgIHZpcnR1YWwgdW5zaWduZWQgcmVkdWNlTG9vcENvdW50KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIE1hY2hpbmVJbnN0ciAqSW5kVmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgJkNtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0ciAqPiAmUHJldkluc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJdGVyLCB1bnNpZ25lZCBNYXhJdGVyKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVGFyZ2V0IGRpZG4ndCBpbXBsZW1lbnQgUmVkdWNlTG9vcENvdW50Iik7CisgIH0KKworICAvLy8gRGVsZXRlIHRoZSBpbnN0cnVjdGlvbiBPbGRJbnN0IGFuZCBldmVyeXRoaW5nIGFmdGVyIGl0LCByZXBsYWNpbmcgaXQgd2l0aAorICAvLy8gYW4gdW5jb25kaXRpb25hbCBicmFuY2ggdG8gTmV3RGVzdC4gVGhpcyBpcyB1c2VkIGJ5IHRoZSB0YWlsIG1lcmdpbmcgcGFzcy4KKyAgdmlydHVhbCB2b2lkIFJlcGxhY2VUYWlsV2l0aEJyYW5jaFRvKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBUYWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk5ld0Rlc3QpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBpdCdzIGxlZ2FsIHRvIHNwbGl0IHRoZSBnaXZlbiBiYXNpYworICAvLy8gYmxvY2sgYXQgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiAoaS5lLiBpbnN0cnVjdGlvbiB3b3VsZCBiZSB0aGUgc3RhcnQKKyAgLy8vIG9mIGEgbmV3IGJhc2ljIGJsb2NrKS4KKyAgdmlydHVhbCBib29sIGlzTGVnYWxUb1NwbGl0TUJCQXQoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkkpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBpdCdzIHByb2ZpdGFibGUgdG8gcHJlZGljYXRlCisgIC8vLyBpbnN0cnVjdGlvbnMgd2l0aCBhY2N1bXVsYXRlZCBpbnN0cnVjdGlvbiBsYXRlbmN5IG9mICJOdW1DeWNsZXMiCisgIC8vLyBvZiB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrLCB3aGVyZSB0aGUgcHJvYmFiaWxpdHkgb2YgdGhlIGluc3RydWN0aW9ucworICAvLy8gYmVpbmcgZXhlY3V0ZWQgaXMgZ2l2ZW4gYnkgUHJvYmFiaWxpdHksIGFuZCBDb25maWRlbmNlIGlzIGEgbWVhc3VyZQorICAvLy8gb2Ygb3VyIGNvbmZpZGVuY2UgdGhhdCBpdCB3aWxsIGJlIHByb3Blcmx5IHByZWRpY3RlZC4KKyAgdmlydHVhbCBib29sIGlzUHJvZml0YWJsZVRvSWZDdnQoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgdW5zaWduZWQgTnVtQ3ljbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFeHRyYVByZWRDeWNsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyYW5jaFByb2JhYmlsaXR5IFByb2JhYmlsaXR5KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFNlY29uZCB2YXJpYW50IG9mIGlzUHJvZml0YWJsZVRvSWZDdnQuIFRoaXMgb25lCisgIC8vLyBjaGVja3MgZm9yIHRoZSBjYXNlIHdoZXJlIHR3byBiYXNpYyBibG9ja3MgZnJvbSB0cnVlIGFuZCBmYWxzZSBwYXRoCisgIC8vLyBvZiBhIGlmLXRoZW4tZWxzZSAoZGlhbW9uZCkgYXJlIHByZWRpY2F0ZWQgb24gbXV0YWxseSBleGNsdXNpdmUKKyAgLy8vIHByZWRpY2F0ZXMsIHdoZXJlIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgdHJ1ZSBwYXRoIGJlaW5nIHRha2VuIGlzIGdpdmVuCisgIC8vLyBieSBQcm9iYWJpbGl0eSwgYW5kIENvbmZpZGVuY2UgaXMgYSBtZWFzdXJlIG9mIG91ciBjb25maWRlbmNlIHRoYXQgaXQKKyAgLy8vIHdpbGwgYmUgcHJvcGVybHkgcHJlZGljdGVkLgorICB2aXJ0dWFsIGJvb2wgaXNQcm9maXRhYmxlVG9JZkN2dChNYWNoaW5lQmFzaWNCbG9jayAmVE1CQiwgdW5zaWduZWQgTnVtVEN5Y2xlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRXh0cmFUQ3ljbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmRk1CQiwgdW5zaWduZWQgTnVtRkN5Y2xlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRXh0cmFGQ3ljbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcmFuY2hQcm9iYWJpbGl0eSBQcm9iYWJpbGl0eSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBpdCdzIHByb2ZpdGFibGUgZm9yIGlmLWNvbnZlcnRlciB0byBkdXBsaWNhdGUgaW5zdHJ1Y3Rpb25zCisgIC8vLyBvZiBzcGVjaWZpZWQgYWNjdW11bGF0ZWQgaW5zdHJ1Y3Rpb24gbGF0ZW5jaWVzIGluIHRoZSBzcGVjaWZpZWQgTUJCIHRvCisgIC8vLyBlbmFibGUgaWYtY29udmVyc2lvbi4KKyAgLy8vIFRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGJlaW5nIGV4ZWN1dGVkIGlzIGdpdmVuIGJ5CisgIC8vLyBQcm9iYWJpbGl0eSwgYW5kIENvbmZpZGVuY2UgaXMgYSBtZWFzdXJlIG9mIG91ciBjb25maWRlbmNlIHRoYXQgaXQKKyAgLy8vIHdpbGwgYmUgcHJvcGVybHkgcHJlZGljdGVkLgorICB2aXJ0dWFsIGJvb2wgaXNQcm9maXRhYmxlVG9EdXBGb3JJZkN2dChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DeWNsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyYW5jaFByb2JhYmlsaXR5IFByb2JhYmlsaXR5KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGl0J3MgcHJvZml0YWJsZSB0byB1bnByZWRpY2F0ZQorICAvLy8gb25lIHNpZGUgb2YgYSAnZGlhbW9uZCcsIGkuZS4gdHdvIHNpZGVzIG9mIGlmLWVsc2UgcHJlZGljYXRlZCBvbiBtdXR1YWxseQorICAvLy8gZXhjbHVzaXZlIHByZWRpY2F0ZXMuCisgIC8vLyBlLmcuCisgIC8vLyAgIHN1YmVxICByMCwgcjEsICMxCisgIC8vLyAgIGFkZG5lICByMCwgcjEsICMxCisgIC8vLyA9PgorICAvLy8gICBzdWIgICAgcjAsIHIxLCAjMQorICAvLy8gICBhZGRuZSAgcjAsIHIxLCAjMQorICAvLy8KKyAgLy8vIFRoaXMgbWF5IGJlIHByb2ZpdGFibGUgaXMgY29uZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zIGFyZSBhbHdheXMgZXhlY3V0ZWQuCisgIHZpcnR1YWwgYm9vbCBpc1Byb2ZpdGFibGVUb1VucHJlZGljYXRlKE1hY2hpbmVCYXNpY0Jsb2NrICZUTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmRk1CQikgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBpbnNlcnQgYSBzZWxlY3QKKyAgLy8vIGluc3RydWN0aW9uIHRoYXQgY2hvb3NlcyBiZXR3ZWVuIFRydWVSZWcgYW5kIEZhbHNlUmVnIGJhc2VkIG9uIHRoZQorICAvLy8gY29uZGl0aW9uIGNvZGUgaW4gQ29uZC4KKyAgLy8vCisgIC8vLyBXaGVuIHN1Y2Nlc3NmdWwsIGFsc28gcmV0dXJuIHRoZSBsYXRlbmN5IGluIGN5Y2xlcyBmcm9tIFRydWVSZWcsCisgIC8vLyBGYWxzZVJlZywgYW5kIENvbmQgdG8gdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLiBJbiBtb3N0IGNhc2VzLCBhIHNlbGVjdAorICAvLy8gaW5zdHJ1Y3Rpb24gd2lsbCBiZSAxIGN5Y2xlLCBzbyBDb25kQ3ljbGVzID0gVHJ1ZUN5Y2xlcyA9IEZhbHNlQ3ljbGVzID0gMQorICAvLy8KKyAgLy8vIFNvbWUgeDg2IGltcGxlbWVudGF0aW9ucyBoYXZlIDItY3ljbGUgY21vdiBpbnN0cnVjdGlvbnMuCisgIC8vLworICAvLy8gQHBhcmFtIE1CQiAgICAgICAgIEJsb2NrIHdoZXJlIHNlbGVjdCBpbnN0cnVjdGlvbiB3b3VsZCBiZSBpbnNlcnRlZC4KKyAgLy8vIEBwYXJhbSBDb25kICAgICAgICBDb25kaXRpb24gcmV0dXJuZWQgYnkgQW5hbHl6ZUJyYW5jaC4KKyAgLy8vIEBwYXJhbSBUcnVlUmVnICAgICBWaXJ0dWFsIHJlZ2lzdGVyIHRvIHNlbGVjdCB3aGVuIENvbmQgaXMgdHJ1ZS4KKyAgLy8vIEBwYXJhbSBGYWxzZVJlZyAgICBWaXJ0dWFsIHJlZ2lzdGVyIHRvIHNlbGVjdCB3aGVuIENvbmQgaXMgZmFsc2UuCisgIC8vLyBAcGFyYW0gQ29uZEN5Y2xlcyAgTGF0ZW5jeSBmcm9tIENvbmQrQnJhbmNoIHRvIHNlbGVjdCBvdXRwdXQuCisgIC8vLyBAcGFyYW0gVHJ1ZUN5Y2xlcyAgTGF0ZW5jeSBmcm9tIFRydWVSZWcgdG8gc2VsZWN0IG91dHB1dC4KKyAgLy8vIEBwYXJhbSBGYWxzZUN5Y2xlcyBMYXRlbmN5IGZyb20gRmFsc2VSZWcgdG8gc2VsZWN0IG91dHB1dC4KKyAgdmlydHVhbCBib29sIGNhbkluc2VydFNlbGVjdChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE1hY2hpbmVPcGVyYW5kPiBDb25kLCB1bnNpZ25lZCBUcnVlUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZhbHNlUmVnLCBpbnQgJkNvbmRDeWNsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZUcnVlQ3ljbGVzLCBpbnQgJkZhbHNlQ3ljbGVzKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIEluc2VydCBhIHNlbGVjdCBpbnN0cnVjdGlvbiBpbnRvIE1CQiBiZWZvcmUgSSB0aGF0IHdpbGwgY29weSBUcnVlUmVnIHRvCisgIC8vLyBEc3RSZWcgd2hlbiBDb25kIGlzIHRydWUsIGFuZCBGYWxzZVJlZyB0byBEc3RSZWcgd2hlbiBDb25kIGlzIGZhbHNlLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGNhbkluc2VydFNlbGVjdCgpIHJldHVybmVkIHRydWUuCisgIC8vLyBUaGUgY29uZGl0aW9uIGluIENvbmQgY29tZXMgZnJvbSBBbmFseXplQnJhbmNoLCBhbmQgaXQgY2FuIGJlIGFzc3VtZWQKKyAgLy8vIHRoYXQgdGhlIHNhbWUgZmxhZ3Mgb3IgcmVnaXN0ZXJzIHJlcXVpcmVkIGJ5IENvbmQgYXJlIGF2YWlsYWJsZSBhdCB0aGUKKyAgLy8vIGluc2VydGlvbiBwb2ludC4KKyAgLy8vCisgIC8vLyBAcGFyYW0gTUJCICAgICAgQmxvY2sgd2hlcmUgc2VsZWN0IGluc3RydWN0aW9uIHNob3VsZCBiZSBpbnNlcnRlZC4KKyAgLy8vIEBwYXJhbSBJICAgICAgICBJbnNlcnRpb24gcG9pbnQuCisgIC8vLyBAcGFyYW0gREwgICAgICAgU291cmNlIGxvY2F0aW9uIGZvciBkZWJ1Z2dpbmcuCisgIC8vLyBAcGFyYW0gRHN0UmVnICAgVmlydHVhbCByZWdpc3RlciB0byBiZSBkZWZpbmVkIGJ5IHNlbGVjdCBpbnN0cnVjdGlvbi4KKyAgLy8vIEBwYXJhbSBDb25kICAgICBDb25kaXRpb24gYXMgY29tcHV0ZWQgYnkgQW5hbHl6ZUJyYW5jaC4KKyAgLy8vIEBwYXJhbSBUcnVlUmVnICBWaXJ0dWFsIHJlZ2lzdGVyIHRvIGNvcHkgd2hlbiBDb25kIGlzIHRydWUuCisgIC8vLyBAcGFyYW0gRmFsc2VSZWcgVmlydHVhbCByZWdpc3RlciB0byBjb3B5IHdoZW4gQ29ucyBpcyBmYWxzZS4KKyAgdmlydHVhbCB2b2lkIGluc2VydFNlbGVjdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLCBjb25zdCBEZWJ1Z0xvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRHN0UmVnLCBBcnJheVJlZjxNYWNoaW5lT3BlcmFuZD4gQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUcnVlUmVnLCB1bnNpZ25lZCBGYWxzZVJlZykgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlRhcmdldCBkaWRuJ3QgaW1wbGVtZW50IFRhcmdldEluc3RySW5mbzo6aW5zZXJ0U2VsZWN0ISIpOworICB9CisKKyAgLy8vIEFuYWx5emUgdGhlIGdpdmVuIHNlbGVjdCBpbnN0cnVjdGlvbiwgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8vIGl0IGNhbm5vdCBiZSB1bmRlcnN0b29kLiBJdCBpcyBhc3N1bWVkIHRoYXQgTUktPmlzU2VsZWN0KCkgaXMgdHJ1ZS4KKyAgLy8vCisgIC8vLyBXaGVuIHN1Y2Nlc3NmdWwsIHJldHVybiB0aGUgY29udHJvbGxpbmcgY29uZGl0aW9uIGFuZCB0aGUgb3BlcmFuZHMgdGhhdAorICAvLy8gZGV0ZXJtaW5lIHRoZSB0cnVlIGFuZCBmYWxzZSByZXN1bHQgdmFsdWVzLgorICAvLy8KKyAgLy8vICAgUmVzdWx0ID0gU0VMRUNUIENvbmQsIFRydWVPcCwgRmFsc2VPcAorICAvLy8KKyAgLy8vIFNvbWUgdGFyZ2V0cyBjYW4gb3B0aW1pemUgc2VsZWN0IGluc3RydWN0aW9ucywgZm9yIGV4YW1wbGUgYnkgcHJlZGljYXRpbmcKKyAgLy8vIHRoZSBpbnN0cnVjdGlvbiBkZWZpbmluZyBvbmUgb2YgdGhlIG9wZXJhbmRzLiBTdWNoIHRhcmdldHMgc2hvdWxkIHNldAorICAvLy8gT3B0aW1pemFibGUuCisgIC8vLworICAvLy8gQHBhcmFtICAgICAgICAgTUkgU2VsZWN0IGluc3RydWN0aW9uIHRvIGFuYWx5emUuCisgIC8vLyBAcGFyYW0gQ29uZCAgICBDb25kaXRpb24gY29udHJvbGxpbmcgdGhlIHNlbGVjdC4KKyAgLy8vIEBwYXJhbSBUcnVlT3AgIE9wZXJhbmQgbnVtYmVyIG9mIHRoZSB2YWx1ZSBzZWxlY3RlZCB3aGVuIENvbmQgaXMgdHJ1ZS4KKyAgLy8vIEBwYXJhbSBGYWxzZU9wIE9wZXJhbmQgbnVtYmVyIG9mIHRoZSB2YWx1ZSBzZWxlY3RlZCB3aGVuIENvbmQgaXMgZmFsc2UuCisgIC8vLyBAcGFyYW0gT3B0aW1pemFibGUgUmV0dXJuZWQgYXMgdHJ1ZSBpZiBNSSBpcyBvcHRpbWl6YWJsZS4KKyAgLy8vIEByZXR1cm5zIEZhbHNlIG9uIHN1Y2Nlc3MuCisgIHZpcnR1YWwgYm9vbCBhbmFseXplU2VsZWN0KGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZUcnVlT3AsIHVuc2lnbmVkICZGYWxzZU9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZPcHRpbWl6YWJsZSkgY29uc3QgeworICAgIGFzc2VydChNSS5nZXREZXNjKCkuaXNTZWxlY3QoKSAmJiAiTUkgbXVzdCBiZSBhIHNlbGVjdCBpbnN0cnVjdGlvbiIpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIEdpdmVuIGEgc2VsZWN0IGluc3RydWN0aW9uIHRoYXQgd2FzIHVuZGVyc3Rvb2QgYnkKKyAgLy8vIGFuYWx5emVTZWxlY3QgYW5kIHJldHVybmVkIE9wdGltaXphYmxlID0gdHJ1ZSwgYXR0ZW1wdCB0byBvcHRpbWl6ZSBNSSBieQorICAvLy8gbWVyZ2luZyBpdCB3aXRoIG9uZSBvZiBpdHMgb3BlcmFuZHMuIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLgorICAvLy8KKyAgLy8vIFdoZW4gc3VjY2Vzc2Z1bCwgcmV0dXJucyB0aGUgbmV3IHNlbGVjdCBpbnN0cnVjdGlvbi4gVGhlIGNsaWVudCBpcworICAvLy8gcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIE1JLgorICAvLy8KKyAgLy8vIElmIGJvdGggc2lkZXMgb2YgdGhlIHNlbGVjdCBjYW4gYmUgb3B0aW1pemVkLCBQcmVmZXJGYWxzZSBpcyB1c2VkIHRvIHBpY2sKKyAgLy8vIGEgc2lkZS4KKyAgLy8vCisgIC8vLyBAcGFyYW0gTUkgICAgICAgICAgT3B0aW1pemFibGUgc2VsZWN0IGluc3RydWN0aW9uLgorICAvLy8gQHBhcmFtIE5ld01JcyAgICAgU2V0IHRoYXQgcmVjb3JkIGFsbCBNSXMgaW4gdGhlIGJhc2ljIGJsb2NrIHVwIHRvIFxwCisgIC8vLyBNSS4gSGFzIHRvIGJlIHVwZGF0ZWQgd2l0aCBhbnkgbmV3bHkgY3JlYXRlZCBNSSBvciBkZWxldGVkIG9uZXMuCisgIC8vLyBAcGFyYW0gUHJlZmVyRmFsc2UgVHJ5IHRvIG9wdGltaXplIEZhbHNlT3AgaW5zdGVhZCBvZiBUcnVlT3AuCisgIC8vLyBAcmV0dXJucyBPcHRpbWl6ZWQgaW5zdHJ1Y3Rpb24gb3IgTlVMTC4KKyAgdmlydHVhbCBNYWNoaW5lSW5zdHIgKm9wdGltaXplU2VsZWN0KE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldEltcGw8TWFjaGluZUluc3RyICo+ICZOZXdNSXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFByZWZlckZhbHNlID0gZmFsc2UpIGNvbnN0IHsKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgaW1wbGVtZW50ZWQgaWYgT3B0aW1pemFibGUgaXMgZXZlciBzZXQuCisgICAgbGx2bV91bnJlYWNoYWJsZSgiVGFyZ2V0IG11c3QgaW1wbGVtZW50IFRhcmdldEluc3RySW5mbzo6b3B0aW1pemVTZWxlY3QhIik7CisgIH0KKworICAvLy8gRW1pdCBpbnN0cnVjdGlvbnMgdG8gY29weSBhIHBhaXIgb2YgcGh5c2ljYWwgcmVnaXN0ZXJzLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHN1cHBvcnQgY29waWVzIHdpdGhpbiBhbnkgbGVnYWwgcmVnaXN0ZXIgY2xhc3MgYXMKKyAgLy8vIHdlbGwgYXMgYW55IGNyb3NzLWNsYXNzIGNvcGllcyBjcmVhdGVkIGR1cmluZyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24uCisgIC8vLworICAvLy8gVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcmVnaXN0ZXJzIG1heSBvdmVybGFwLCB3aGljaCBtYXkgcmVxdWlyZSBhCisgIC8vLyBjYXJlZnVsIGltcGxlbWVudGF0aW9uIHdoZW4gbXVsdGlwbGUgY29weSBpbnN0cnVjdGlvbnMgYXJlIHJlcXVpcmVkIGZvcgorICAvLy8gbGFyZ2UgcmVnaXN0ZXJzLiBTZWUgZm9yIGV4YW1wbGUgdGhlIEFSTSB0YXJnZXQuCisgIHZpcnR1YWwgdm9pZCBjb3B5UGh5c1JlZyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLCBjb25zdCBEZWJ1Z0xvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCB1bnNpZ25lZCBTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEtpbGxTcmMpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUYXJnZXQgZGlkbid0IGltcGxlbWVudCBUYXJnZXRJbnN0ckluZm86OmNvcHlQaHlzUmVnISIpOworICB9CisKKyAgLy8vIFN0b3JlIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgb2YgdGhlIGdpdmVuIHJlZ2lzdGVyIGNsYXNzIHRvIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHN0YWNrIGZyYW1lIGluZGV4LiBUaGUgc3RvcmUgaW5zdHJ1Y3Rpb24gaXMgdG8gYmUgYWRkZWQgdG8gdGhlIGdpdmVuCisgIC8vLyBtYWNoaW5lIGJhc2ljIGJsb2NrIGJlZm9yZSB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uIElmIGlzS2lsbAorICAvLy8gaXMgdHJ1ZSwgdGhlIHJlZ2lzdGVyIG9wZXJhbmQgaXMgdGhlIGxhc3QgdXNlIGFuZCBtdXN0IGJlIG1hcmtlZCBraWxsLgorICB2aXJ0dWFsIHZvaWQgc3RvcmVSZWdUb1N0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY1JlZywgYm9vbCBpc0tpbGwsIGludCBGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUYXJnZXQgZGlkbid0IGltcGxlbWVudCAiCisgICAgICAgICAgICAgICAgICAgICAiVGFyZ2V0SW5zdHJJbmZvOjpzdG9yZVJlZ1RvU3RhY2tTbG90ISIpOworICB9CisKKyAgLy8vIExvYWQgdGhlIHNwZWNpZmllZCByZWdpc3RlciBvZiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgY2xhc3MgZnJvbSB0aGUgc3BlY2lmaWVkCisgIC8vLyBzdGFjayBmcmFtZSBpbmRleC4gVGhlIGxvYWQgaW5zdHJ1Y3Rpb24gaXMgdG8gYmUgYWRkZWQgdG8gdGhlIGdpdmVuCisgIC8vLyBtYWNoaW5lIGJhc2ljIGJsb2NrIGJlZm9yZSB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uCisgIHZpcnR1YWwgdm9pZCBsb2FkUmVnRnJvbVN0YWNrU2xvdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZywgaW50IEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVGFyZ2V0IGRpZG4ndCBpbXBsZW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgIlRhcmdldEluc3RySW5mbzo6bG9hZFJlZ0Zyb21TdGFja1Nsb3QhIik7CisgIH0KKworICAvLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGFsbCBwc2V1ZG8gaW5zdHJ1Y3Rpb25zCisgIC8vLyB0aGF0IHJlbWFpbiBhZnRlciByZWdpc3RlciBhbGxvY2F0aW9uLiBNYW55IHBzZXVkbyBpbnN0cnVjdGlvbnMgYXJlCisgIC8vLyBjcmVhdGVkIHRvIGhlbHAgcmVnaXN0ZXIgYWxsb2NhdGlvbi4gVGhpcyBpcyB0aGUgcGxhY2UgdG8gY29udmVydCB0aGVtCisgIC8vLyBpbnRvIHJlYWwgaW5zdHJ1Y3Rpb25zLiBUaGUgdGFyZ2V0IGNhbiBlZGl0IE1JIGluIHBsYWNlLCBvciBpdCBjYW4gaW5zZXJ0CisgIC8vLyBuZXcgaW5zdHJ1Y3Rpb25zIGFuZCBlcmFzZSBNSS4gVGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdHJ1ZSBpZgorICAvLy8gYW55dGhpbmcgd2FzIGNoYW5nZWQuCisgIHZpcnR1YWwgYm9vbCBleHBhbmRQb3N0UkFQc2V1ZG8oTWFjaGluZUluc3RyICZNSSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gQ2hlY2sgd2hldGhlciB0aGUgdGFyZ2V0IGNhbiBmb2xkIGEgbG9hZCB0aGF0IGZlZWRzIGEgc3VicmVnIG9wZXJhbmQKKyAgLy8vIChvciBhIHN1YnJlZyBvcGVyYW5kIHRoYXQgZmVlZHMgYSBzdG9yZSkuCisgIC8vLyBGb3IgZXhhbXBsZSwgWDg2IG1heSB3YW50IHRvIHJldHVybiB0cnVlIGlmIGl0IGNhbiBmb2xkCisgIC8vLyBtb3ZsICglZXNwKSwgJWVheAorICAvLy8gc3ViYiwgJWFsLCAuLi4KKyAgLy8vIEludG86CisgIC8vLyBzdWJiICglZXNwKSwgLi4uCisgIC8vLworICAvLy8gSWRlYWxseSwgd2UnZCBsaWtlIHRoZSB0YXJnZXQgaW1wbGVtZW50YXRpb24gb2YgZm9sZE1lbW9yeU9wZXJhbmQoKSB0bworICAvLy8gcmVqZWN0IHN1YnJlZ3MgLSBidXQgc2luY2UgdGhpcyBiZWhhdmlvciB1c2VkIHRvIGJlIGVuZm9yY2VkIGluIHRoZQorICAvLy8gdGFyZ2V0LWluZGVwZW5kZW50IGNvZGUsIG1vdmluZyB0aGlzIHJlc3BvbnNpYmlsaXR5IHRvIHRoZSB0YXJnZXRzCisgIC8vLyBoYXMgdGhlIHBvdGVudGlhbCBvZiBjYXVzaW5nIG5hc3R5IHNpbGVudCBicmVha2FnZSBpbiBvdXQtb2YtdHJlZSB0YXJnZXRzLgorICB2aXJ0dWFsIGJvb2wgaXNTdWJyZWdGb2xkYWJsZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIEF0dGVtcHQgdG8gZm9sZCBhIGxvYWQgb3Igc3RvcmUgb2YgdGhlIHNwZWNpZmllZCBzdGFjaworICAvLy8gc2xvdCBpbnRvIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0cnVjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBvcGVyYW5kKHMpLgorICAvLy8gSWYgdGhpcyBpcyBwb3NzaWJsZSwgYSBuZXcgaW5zdHJ1Y3Rpb24gaXMgcmV0dXJuZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisgIC8vLyBvcGVyYW5kIGZvbGRlZCwgb3RoZXJ3aXNlIE5VTEwgaXMgcmV0dXJuZWQuCisgIC8vLyBUaGUgbmV3IGluc3RydWN0aW9uIGlzIGluc2VydGVkIGJlZm9yZSBNSSwgYW5kIHRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUKKyAgLy8vIGZvciByZW1vdmluZyB0aGUgb2xkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHIgKmZvbGRNZW1vcnlPcGVyYW5kKE1hY2hpbmVJbnN0ciAmTUksIEFycmF5UmVmPHVuc2lnbmVkPiBPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZUludGVydmFscyAqTElTID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFNhbWUgYXMgdGhlIHByZXZpb3VzIHZlcnNpb24gZXhjZXB0IGl0IGFsbG93cyBmb2xkaW5nIG9mIGFueSBsb2FkIGFuZAorICAvLy8gc3RvcmUgZnJvbSAvIHRvIGFueSBhZGRyZXNzLCBub3QganVzdCBmcm9tIGEgc3BlY2lmaWMgc3RhY2sgc2xvdC4KKyAgTWFjaGluZUluc3RyICpmb2xkTWVtb3J5T3BlcmFuZChNYWNoaW5lSW5zdHIgJk1JLCBBcnJheVJlZjx1bnNpZ25lZD4gT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAmTG9hZE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpdmVJbnRlcnZhbHMgKkxJUyA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSB3aGVuIHRoZXJlIGlzIHBvdGVudGlhbGx5IGEgZmFzdGVyIGNvZGUgc2VxdWVuY2UKKyAgLy8vIGZvciBhbiBpbnN0cnVjdGlvbiBjaGFpbiBlbmRpbmcgaW4gXHAgUm9vdC4gQWxsIHBvdGVudGlhbCBwYXR0ZXJucyBhcmUKKyAgLy8vIHJldHVybmVkIGluIHRoZSBccCBQYXR0ZXJuIHZlY3Rvci4gUGF0dGVybiBzaG91bGQgYmUgc29ydGVkIGluIHByaW9yaXR5CisgIC8vLyBvcmRlciBzaW5jZSB0aGUgcGF0dGVybiBldmFsdWF0b3Igc3RvcHMgY2hlY2tpbmcgYXMgc29vbiBhcyBpdCBmaW5kcyBhCisgIC8vLyBmYXN0ZXIgc2VxdWVuY2UuCisgIC8vLyBccGFyYW0gUm9vdCAtIEluc3RydWN0aW9uIHRoYXQgY291bGQgYmUgY29tYmluZWQgd2l0aCBvbmUgb2YgaXRzIG9wZXJhbmRzCisgIC8vLyBccGFyYW0gUGF0dGVybnMgLSBWZWN0b3Igb2YgcG9zc2libGUgY29tYmluYXRpb24gcGF0dGVybnMKKyAgdmlydHVhbCBib29sIGdldE1hY2hpbmVDb21iaW5lclBhdHRlcm5zKAorICAgICAgTWFjaGluZUluc3RyICZSb290LAorICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVDb21iaW5lclBhdHRlcm4+ICZQYXR0ZXJucykgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIHdoZW4gYSBjb2RlIHNlcXVlbmNlIGNhbiBpbXByb3ZlIHRocm91Z2hwdXQuIEl0CisgIC8vLyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgZm9yIGluc3RydWN0aW9ucyBpbiBsb29wcy4KKyAgLy8vIFxwYXJhbSBQYXR0ZXJuIC0gY29tYmluZXIgcGF0dGVybgorICB2aXJ0dWFsIGJvb2wgaXNUaHJvdWdocHV0UGF0dGVybihNYWNoaW5lQ29tYmluZXJQYXR0ZXJuIFBhdHRlcm4pIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5wdXQgXFAgSW5zdCBpcyBwYXJ0IG9mIGEgY2hhaW4gb2YgZGVwZW5kZW50IG9wcworICAvLy8gdGhhdCBhcmUgc3VpdGFibGUgZm9yIHJlYXNzb2NpYXRpb24sIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuCisgIC8vLyBJZiB0aGUgaW5zdHJ1Y3Rpb24ncyBvcGVyYW5kcyBtdXN0IGJlIGNvbW11dGVkIHRvIGhhdmUgYSBwcmV2aW91cworICAvLy8gaW5zdHJ1Y3Rpb24gb2YgdGhlIHNhbWUgdHlwZSBkZWZpbmUgdGhlIGZpcnN0IHNvdXJjZSBvcGVyYW5kLCBcUCBDb21tdXRlZAorICAvLy8gd2lsbCBiZSBzZXQgdG8gdHJ1ZS4KKyAgYm9vbCBpc1JlYXNzb2NpYXRpb25DYW5kaWRhdGUoY29uc3QgTWFjaGluZUluc3RyICZJbnN0LCBib29sICZDb21tdXRlZCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIHdoZW4gXFAgSW5zdCBpcyBib3RoIGFzc29jaWF0aXZlIGFuZCBjb21tdXRhdGl2ZS4KKyAgdmlydHVhbCBib29sIGlzQXNzb2NpYXRpdmVBbmRDb21tdXRhdGl2ZShjb25zdCBNYWNoaW5lSW5zdHIgJkluc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgd2hlbiBcUCBJbnN0IGhhcyByZWFzc29jaWFibGUgb3BlcmFuZHMgaW4gdGhlIHNhbWUgXFAgTUJCLgorICB2aXJ0dWFsIGJvb2wgaGFzUmVhc3NvY2lhYmxlT3BlcmFuZHMoY29uc3QgTWFjaGluZUluc3RyICZJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIHdoZW4gXFAgSW5zdCBoYXMgcmVhc3NvY2lhYmxlIHNpYmxpbmcuCisgIGJvb2wgaGFzUmVhc3NvY2lhYmxlU2libGluZyhjb25zdCBNYWNoaW5lSW5zdHIgJkluc3QsIGJvb2wgJkNvbW11dGVkKSBjb25zdDsKKworICAvLy8gV2hlbiBnZXRNYWNoaW5lQ29tYmluZXJQYXR0ZXJucygpIGZpbmRzIHBhdHRlcm5zLCB0aGlzIGZ1bmN0aW9uIGdlbmVyYXRlcworICAvLy8gdGhlIGluc3RydWN0aW9ucyB0aGF0IGNvdWxkIHJlcGxhY2UgdGhlIG9yaWdpbmFsIGNvZGUgc2VxdWVuY2UuIFRoZSBjbGllbnQKKyAgLy8vIGhhcyB0byBkZWNpZGUgd2hldGhlciB0aGUgYWN0dWFsIHJlcGxhY2VtZW50IGlzIGJlbmVmaWNpYWwgb3Igbm90LgorICAvLy8gXHBhcmFtIFJvb3QgLSBJbnN0cnVjdGlvbiB0aGF0IGNvdWxkIGJlIGNvbWJpbmVkIHdpdGggb25lIG9mIGl0cyBvcGVyYW5kcworICAvLy8gXHBhcmFtIFBhdHRlcm4gLSBDb21iaW5hdGlvbiBwYXR0ZXJuIGZvciBSb290CisgIC8vLyBccGFyYW0gSW5zSW5zdHJzIC0gVmVjdG9yIG9mIG5ldyBpbnN0cnVjdGlvbnMgdGhhdCBpbXBsZW1lbnQgUAorICAvLy8gXHBhcmFtIERlbEluc3RycyAtIE9sZCBpbnN0cnVjdGlvbnMsIGluY2x1ZGluZyBSb290LCB0aGF0IGNvdWxkIGJlCisgIC8vLyByZXBsYWNlZCBieSBJbnNJbnN0cgorICAvLy8gXHBhcmFtIEluc3RySWR4Rm9yVmlydFJlZyAtIG1hcCBvZiB2aXJ0dWFsIHJlZ2lzdGVyIHRvIGluc3RydWN0aW9uIGluCisgIC8vLyBJbnNJbnN0ciB0aGF0IGRlZmluZXMgaXQKKyAgdmlydHVhbCB2b2lkIGdlbkFsdGVybmF0aXZlQ29kZVNlcXVlbmNlKAorICAgICAgTWFjaGluZUluc3RyICZSb290LCBNYWNoaW5lQ29tYmluZXJQYXR0ZXJuIFBhdHRlcm4sCisgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyICo+ICZJbnNJbnN0cnMsCisgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyICo+ICZEZWxJbnN0cnMsCisgICAgICBEZW5zZU1hcDx1bnNpZ25lZCwgdW5zaWduZWQ+ICZJbnN0cklkeEZvclZpcnRSZWcpIGNvbnN0OworCisgIC8vLyBBdHRlbXB0IHRvIHJlYXNzb2NpYXRlIFxQIFJvb3QgYW5kIFxQIFByZXYgYWNjb3JkaW5nIHRvIFxQIFBhdHRlcm4gdG8KKyAgLy8vIHJlZHVjZSBjcml0aWNhbCBwYXRoIGxlbmd0aC4KKyAgdm9pZCByZWFzc29jaWF0ZU9wcyhNYWNoaW5lSW5zdHIgJlJvb3QsIE1hY2hpbmVJbnN0ciAmUHJldiwKKyAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQ29tYmluZXJQYXR0ZXJuIFBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0ciAqPiAmSW5zSW5zdHJzLAorICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIgKj4gJkRlbEluc3RycywKKyAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDx1bnNpZ25lZCwgdW5zaWduZWQ+ICZJbnN0cklkeEZvclZpcnRSZWcpIGNvbnN0OworCisgIC8vLyBUaGlzIGlzIGFuIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBoZWxwZXIgZnVuY3Rpb24gb2YgcmVhc3NvY2lhdGVPcHMuCisgIC8vLyBTZXQgc3BlY2lhbCBvcGVyYW5kIGF0dHJpYnV0ZXMgZm9yIG5ldyBpbnN0cnVjdGlvbnMgYWZ0ZXIgcmVhc3NvY2lhdGlvbi4KKyAgdmlydHVhbCB2b2lkIHNldFNwZWNpYWxPcGVyYW5kQXR0cihNYWNoaW5lSW5zdHIgJk9sZE1JMSwgTWFjaGluZUluc3RyICZPbGRNSTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICZOZXdNSTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICZOZXdNSTIpIGNvbnN0IHt9CisKKyAgLy8vIFJldHVybiB0cnVlIHdoZW4gYSB0YXJnZXQgc3VwcG9ydHMgTWFjaGluZUNvbWJpbmVyLgorICB2aXJ0dWFsIGJvb2wgdXNlTWFjaGluZUNvbWJpbmVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIFNETm9kZSBjYW4gYmUgY29waWVkIGR1cmluZyBzY2hlZHVsaW5nCisgIC8vLyBldmVuIGlmIGl0IGhhcyBnbHVlLgorICB2aXJ0dWFsIGJvb2wgY2FuQ29weUdsdWVkTm9kZUR1cmluZ1NjaGVkdWxlKFNETm9kZSAqTikgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gUmVtZW1iZXIgd2hhdCByZWdpc3RlcnMgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiB1c2VzIGFuZCBtb2RpZmllcy4KKyAgdmlydHVhbCB2b2lkIHRyYWNrUmVnRGVmc1VzZXMoY29uc3QgTWFjaGluZUluc3RyICZNSSwgQml0VmVjdG9yICZNb2RpZmllZFJlZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFZlY3RvciAmVXNlZFJlZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAvLy8gVGFyZ2V0LWRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBmb3IgZm9sZE1lbW9yeU9wZXJhbmQuCisgIC8vLyBUYXJnZXQtaW5kZXBlbmRlbnQgY29kZSBpbiBmb2xkTWVtb3J5T3BlcmFuZCB3aWxsCisgIC8vLyB0YWtlIGNhcmUgb2YgYWRkaW5nIGEgTWFjaGluZU1lbU9wZXJhbmQgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIC8vLyBUaGUgaW5zdHJ1Y3Rpb24gYW5kIGFueSBhdXhpbGlhcnkgaW5zdHJ1Y3Rpb25zIG5lY2Vzc2FyeSB3aWxsIGJlIGluc2VydGVkCisgIC8vLyBhdCBJbnNlcnRQdC4KKyAgdmlydHVhbCBNYWNoaW5lSW5zdHIgKgorICBmb2xkTWVtb3J5T3BlcmFuZEltcGwoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UHQsIGludCBGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZUludGVydmFscyAqTElTID0gbnVsbHB0cikgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFRhcmdldC1kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gZm9yIGZvbGRNZW1vcnlPcGVyYW5kLgorICAvLy8gVGFyZ2V0LWluZGVwZW5kZW50IGNvZGUgaW4gZm9sZE1lbW9yeU9wZXJhbmQgd2lsbAorICAvLy8gdGFrZSBjYXJlIG9mIGFkZGluZyBhIE1hY2hpbmVNZW1PcGVyYW5kIHRvIHRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICAvLy8gVGhlIGluc3RydWN0aW9uIGFuZCBhbnkgYXV4aWxpYXJ5IGluc3RydWN0aW9ucyBuZWNlc3Nhcnkgd2lsbCBiZSBpbnNlcnRlZAorICAvLy8gYXQgSW5zZXJ0UHQuCisgIHZpcnR1YWwgTWFjaGluZUluc3RyICpmb2xkTWVtb3J5T3BlcmFuZEltcGwoCisgICAgICBNYWNoaW5lRnVuY3Rpb24gJk1GLCBNYWNoaW5lSW5zdHIgJk1JLCBBcnJheVJlZjx1bnNpZ25lZD4gT3BzLAorICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEluc2VydFB0LCBNYWNoaW5lSW5zdHIgJkxvYWRNSSwKKyAgICAgIExpdmVJbnRlcnZhbHMgKkxJUyA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGFyZ2V0LWRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBvZiBnZXRSZWdTZXF1ZW5jZUlucHV0cy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkIHRoZSBlcXVpdmFsZW50CisgIC8vLyBSRUdfU0VRVUVOQ0UgaW5wdXRzIHdpdGggdGhlIHBhaXIgXHAgTUksIFxwIERlZklkeC4gRmFsc2Ugb3RoZXJ3aXNlLgorICAvLy8KKyAgLy8vIFxwcmUgTUkuaXNSZWdTZXF1ZW5jZUxpa2UoKS4KKyAgLy8vCisgIC8vLyBcc2VlIFRhcmdldEluc3RySW5mbzo6Z2V0UmVnU2VxdWVuY2VJbnB1dHMuCisgIHZpcnR1YWwgYm9vbCBnZXRSZWdTZXF1ZW5jZUxpa2VJbnB1dHMoCisgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBEZWZJZHgsCisgICAgICBTbWFsbFZlY3RvckltcGw8UmVnU3ViUmVnUGFpckFuZElkeD4gJklucHV0UmVncykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGFyZ2V0LWRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBvZiBnZXRFeHRyYWN0U3VicmVnSW5wdXRzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgdGhlIGVxdWl2YWxlbnQKKyAgLy8vIEVYVFJBQ1RfU1VCUkVHIGlucHV0cyB3aXRoIHRoZSBwYWlyIFxwIE1JLCBccCBEZWZJZHguIEZhbHNlIG90aGVyd2lzZS4KKyAgLy8vCisgIC8vLyBccHJlIE1JLmlzRXh0cmFjdFN1YnJlZ0xpa2UoKS4KKyAgLy8vCisgIC8vLyBcc2VlIFRhcmdldEluc3RySW5mbzo6Z2V0RXh0cmFjdFN1YnJlZ0lucHV0cy4KKyAgdmlydHVhbCBib29sIGdldEV4dHJhY3RTdWJyZWdMaWtlSW5wdXRzKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZWZJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTdWJSZWdQYWlyQW5kSWR4ICZJbnB1dFJlZykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGFyZ2V0LWRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBvZiBnZXRJbnNlcnRTdWJyZWdJbnB1dHMuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBidWlsZCB0aGUgZXF1aXZhbGVudAorICAvLy8gSU5TRVJUX1NVQlJFRyBpbnB1dHMgd2l0aCB0aGUgcGFpciBccCBNSSwgXHAgRGVmSWR4LiBGYWxzZSBvdGhlcndpc2UuCisgIC8vLworICAvLy8gXHByZSBNSS5pc0luc2VydFN1YnJlZ0xpa2UoKS4KKyAgLy8vCisgIC8vLyBcc2VlIFRhcmdldEluc3RySW5mbzo6Z2V0SW5zZXJ0U3VicmVnSW5wdXRzLgorICB2aXJ0dWFsIGJvb2wKKyAgZ2V0SW5zZXJ0U3VicmVnTGlrZUlucHV0cyhjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBEZWZJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU3ViUmVnUGFpciAmQmFzZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTdWJSZWdQYWlyQW5kSWR4ICZJbnNlcnRlZFJlZykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBnZXRBZGRyZXNzU3BhY2VGb3JQc2V1ZG9Tb3VyY2VLaW5kIC0gR2l2ZW4gdGhlIGtpbmQgb2YgbWVtb3J5CisgIC8vLyAoZS5nLiBzdGFjaykgdGhlIHRhcmdldCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGFkZHJlc3Mgc3BhY2UuCisgIHZpcnR1YWwgdW5zaWduZWQKKyAgZ2V0QWRkcmVzc1NwYWNlRm9yUHNldWRvU291cmNlS2luZChQc2V1ZG9Tb3VyY2VWYWx1ZTo6UFNWS2luZCBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gdW5mb2xkTWVtb3J5T3BlcmFuZCAtIFNlcGFyYXRlIGEgc2luZ2xlIGluc3RydWN0aW9uIHdoaWNoIGZvbGRlZCBhIGxvYWQgb3IKKyAgLy8vIGEgc3RvcmUgb3IgYSBsb2FkIGFuZCBhIHN0b3JlIGludG8gdHdvIG9yIG1vcmUgaW5zdHJ1Y3Rpb24uIElmIHRoaXMgaXMKKyAgLy8vIHBvc3NpYmxlLCByZXR1cm5zIHRydWUgYXMgd2VsbCBhcyB0aGUgbmV3IGluc3RydWN0aW9ucyBieSByZWZlcmVuY2UuCisgIHZpcnR1YWwgYm9vbAorICB1bmZvbGRNZW1vcnlPcGVyYW5kKE1hY2hpbmVGdW5jdGlvbiAmTUYsIE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIFVuZm9sZExvYWQsIGJvb2wgVW5mb2xkU3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0ciAqPiAmTmV3TUlzKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdmlydHVhbCBib29sIHVuZm9sZE1lbW9yeU9wZXJhbmQoU2VsZWN0aW9uREFHICZEQUcsIFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNETm9kZSAqPiAmTmV3Tm9kZXMpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgb3Bjb2RlIG9mIHRoZSB3b3VsZCBiZSBuZXcKKyAgLy8vIGluc3RydWN0aW9uIGFmdGVyIGxvYWQgLyBzdG9yZSBhcmUgdW5mb2xkZWQgZnJvbSBhbiBpbnN0cnVjdGlvbiBvZiB0aGUKKyAgLy8vIHNwZWNpZmllZCBvcGNvZGUuIEl0IHJldHVybnMgemVybyBpZiB0aGUgc3BlY2lmaWVkIHVuZm9sZGluZyBpcyBub3QKKyAgLy8vIHBvc3NpYmxlLiBJZiBMb2FkUmVnSW5kZXggaXMgbm9uLW51bGwsIGl0IGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBvcGVyYW5kCisgIC8vLyBpbmRleCBvZiB0aGUgb3BlcmFuZCB3aGljaCB3aWxsIGhvbGQgdGhlIHJlZ2lzdGVyIGhvbGRpbmcgdGhlIGxvYWRlZAorICAvLy8gdmFsdWUuCisgIHZpcnR1YWwgdW5zaWduZWQKKyAgZ2V0T3Bjb2RlQWZ0ZXJNZW1vcnlVbmZvbGQodW5zaWduZWQgT3BjLCBib29sIFVuZm9sZExvYWQsIGJvb2wgVW5mb2xkU3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpMb2FkUmVnSW5kZXggPSBudWxscHRyKSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBwcmUtcmVnYWxsb2Mgc2NoZWR1bGVyIHRvIGRldGVybWluZSBpZiB0d28gbG9hZHMgYXJlCisgIC8vLyBsb2FkaW5nIGZyb20gdGhlIHNhbWUgYmFzZSBhZGRyZXNzLiBJdCBzaG91bGQgb25seSByZXR1cm4gdHJ1ZSBpZiB0aGUgYmFzZQorICAvLy8gcG9pbnRlcnMgYXJlIHRoZSBzYW1lIGFuZCB0aGUgb25seSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gYWRkcmVzc2VzCisgIC8vLyBhcmUgdGhlIG9mZnNldC4gSXQgYWxzbyByZXR1cm5zIHRoZSBvZmZzZXRzIGJ5IHJlZmVyZW5jZS4KKyAgdmlydHVhbCBib29sIGFyZUxvYWRzRnJvbVNhbWVCYXNlUHRyKFNETm9kZSAqTG9hZDEsIFNETm9kZSAqTG9hZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICZPZmZzZXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAmT2Zmc2V0MikgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBUaGlzIGlzIGEgdXNlZCBieSB0aGUgcHJlLXJlZ2FsbG9jIHNjaGVkdWxlciB0byBkZXRlcm1pbmUgKGluIGNvbmp1bmN0aW9uCisgIC8vLyB3aXRoIGFyZUxvYWRzRnJvbVNhbWVCYXNlUHRyKSBpZiB0d28gbG9hZHMgc2hvdWxkIGJlIHNjaGVkdWxlZCB0b2dldGhlci4KKyAgLy8vIE9uIHNvbWUgdGFyZ2V0cyBpZiB0d28gbG9hZHMgYXJlIGxvYWRpbmcgZnJvbQorICAvLy8gYWRkcmVzc2VzIGluIHRoZSBzYW1lIGNhY2hlIGxpbmUsIGl0J3MgYmV0dGVyIGlmIHRoZXkgYXJlIHNjaGVkdWxlZAorICAvLy8gdG9nZXRoZXIuIFRoaXMgZnVuY3Rpb24gdGFrZXMgdHdvIGludGVnZXJzIHRoYXQgcmVwcmVzZW50IHRoZSBsb2FkIG9mZnNldHMKKyAgLy8vIGZyb20gdGhlIGNvbW1vbiBiYXNlIGFkZHJlc3MuIEl0IHJldHVybnMgdHJ1ZSBpZiBpdCBkZWNpZGVzIGl0J3MgZGVzaXJhYmxlCisgIC8vLyB0byBzY2hlZHVsZSB0aGUgdHdvIGxvYWRzIHRvZ2V0aGVyLiAiTnVtTG9hZHMiIGlzIHRoZSBudW1iZXIgb2YgbG9hZHMgdGhhdAorICAvLy8gaGF2ZSBhbHJlYWR5IGJlZW4gc2NoZWR1bGVkIGFmdGVyIExvYWQxLgorICB2aXJ0dWFsIGJvb2wgc2hvdWxkU2NoZWR1bGVMb2Fkc05lYXIoU0ROb2RlICpMb2FkMSwgU0ROb2RlICpMb2FkMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgT2Zmc2V0MSwgaW50NjRfdCBPZmZzZXQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtTG9hZHMpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gR2V0IHRoZSBiYXNlIHJlZ2lzdGVyIGFuZCBieXRlIG9mZnNldCBvZiBhbiBpbnN0cnVjdGlvbiB0aGF0IHJlYWRzL3dyaXRlcworICAvLy8gbWVtb3J5LgorICB2aXJ0dWFsIGJvb2wgZ2V0TWVtT3BCYXNlUmVnSW1tT2ZzKE1hY2hpbmVJbnN0ciAmTWVtT3AsIHVuc2lnbmVkICZCYXNlUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgJk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gY29udGFpbnMgYSBiYXNlIHJlZ2lzdGVyIGFuZCBvZmZzZXQuIElmCisgIC8vLyB0cnVlLCB0aGUgZnVuY3Rpb24gYWxzbyBzZXRzIHRoZSBvcGVyYW5kIHBvc2l0aW9uIGluIHRoZSBpbnN0cnVjdGlvbgorICAvLy8gZm9yIHRoZSBiYXNlIHJlZ2lzdGVyIGFuZCBvZmZzZXQuCisgIHZpcnR1YWwgYm9vbCBnZXRCYXNlQW5kT2Zmc2V0UG9zaXRpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmQmFzZVBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmT2Zmc2V0UG9zKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIElmIHRoZSBpbnN0cnVjdGlvbiBpcyBhbiBpbmNyZW1lbnQgb2YgYSBjb25zdGFudCB2YWx1ZSwgcmV0dXJuIHRoZSBhbW91bnQuCisgIHZpcnR1YWwgYm9vbCBnZXRJbmNyZW1lbnRWYWx1ZShjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCBpbnQgJlZhbHVlKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIGdpdmVuIG1lbW9yeSBvcGVyYXRpb25zIHNob3VsZCBiZSBzY2hlZHVsZWQKKyAgLy8vIGFkamFjZW50LiBOb3RlIHRoYXQgeW91IGhhdmUgdG8gYWRkOgorICAvLy8gICBEQUctPmFkZE11dGF0aW9uKGNyZWF0ZUxvYWRDbHVzdGVyREFHTXV0YXRpb24oREFHLT5USUksIERBRy0+VFJJKSk7CisgIC8vLyBvcgorICAvLy8gICBEQUctPmFkZE11dGF0aW9uKGNyZWF0ZVN0b3JlQ2x1c3RlckRBR011dGF0aW9uKERBRy0+VElJLCBEQUctPlRSSSkpOworICAvLy8gdG8gVGFyZ2V0UGFzc0NvbmZpZzo6Y3JlYXRlTWFjaGluZVNjaGVkdWxlcigpIHRvIGhhdmUgYW4gZWZmZWN0LgorICB2aXJ0dWFsIGJvb2wgc2hvdWxkQ2x1c3Rlck1lbU9wcyhNYWNoaW5lSW5zdHIgJkZpcnN0TGRTdCwgdW5zaWduZWQgQmFzZVJlZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAmU2Vjb25kTGRTdCwgdW5zaWduZWQgQmFzZVJlZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUxvYWRzKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgidGFyZ2V0IGRpZCBub3QgaW1wbGVtZW50IHNob3VsZENsdXN0ZXJNZW1PcHMoKSIpOworICB9CisKKyAgLy8vIFJldmVyc2VzIHRoZSBicmFuY2ggY29uZGl0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY29uZGl0aW9uIGxpc3QsCisgIC8vLyByZXR1cm5pbmcgZmFsc2Ugb24gc3VjY2VzcyBhbmQgdHJ1ZSBpZiBpdCBjYW5ub3QgYmUgcmV2ZXJzZWQuCisgIHZpcnR1YWwgYm9vbAorICByZXZlcnNlQnJhbmNoQ29uZGl0aW9uKFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBJbnNlcnQgYSBub29wIGludG8gdGhlIGluc3RydWN0aW9uIHN0cmVhbSBhdCB0aGUgc3BlY2lmaWVkIHBvaW50LgorICB2aXJ0dWFsIHZvaWQgaW5zZXJ0Tm9vcChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUkpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIG5vb3AgaW5zdHJ1Y3Rpb24gdG8gdXNlIGZvciBhIG5vb3AuCisgIHZpcnR1YWwgdm9pZCBnZXROb29wKE1DSW5zdCAmTm9wSW5zdCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGZvciBwb3N0LWluY3JlbWVudGVkIGluc3RydWN0aW9ucy4KKyAgdmlydHVhbCBib29sIGlzUG9zdEluY3JlbWVudChjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGFscmVhZHkgcHJlZGljYXRlZC4KKyAgdmlydHVhbCBib29sIGlzUHJlZGljYXRlZChjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGEKKyAgLy8vIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24gdGhhdCBoYXMgbm90IGJlZW4gcHJlZGljYXRlZC4KKyAgdmlydHVhbCBib29sIGlzVW5wcmVkaWNhdGVkVGVybWluYXRvcihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIE1JIGlzIGFuIHVuY29uZGl0aW9uYWwgdGFpbCBjYWxsLgorICB2aXJ0dWFsIGJvb2wgaXNVbmNvbmRpdGlvbmFsVGFpbENhbGwoY29uc3QgTWFjaGluZUluc3RyICZNSSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRhaWwgY2FsbCBjYW4gYmUgbWFkZSBjb25kaXRpb25hbCBvbiBCcmFuY2hDb25kLgorICB2aXJ0dWFsIGJvb2wgY2FuTWFrZVRhaWxDYWxsQ29uZGl0aW9uYWwoU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAmVGFpbENhbGwpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmVwbGFjZSB0aGUgY29uZGl0aW9uYWwgYnJhbmNoIGluIE1CQiB3aXRoIGEgY29uZGl0aW9uYWwgdGFpbCBjYWxsLgorICB2aXJ0dWFsIHZvaWQgcmVwbGFjZUJyYW5jaFdpdGhUYWlsQ2FsbChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgJlRhaWxDYWxsKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVGFyZ2V0IGRpZG4ndCBpbXBsZW1lbnQgcmVwbGFjZUJyYW5jaFdpdGhUYWlsQ2FsbCEiKTsKKyAgfQorCisgIC8vLyBDb252ZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvIGEgcHJlZGljYXRlZCBpbnN0cnVjdGlvbi4KKyAgLy8vIEl0IHJldHVybnMgdHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICB2aXJ0dWFsIGJvb2wgUHJlZGljYXRlSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE1hY2hpbmVPcGVyYW5kPiBQcmVkKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmaXJzdCBzcGVjaWZpZWQgcHJlZGljYXRlCisgIC8vLyBzdWJzdW1lcyB0aGUgc2Vjb25kLCBlLmcuIEdFIHN1YnN1bWVzIEdULgorICB2aXJ0dWFsIGJvb2wgU3Vic3VtZXNQcmVkaWNhdGUoQXJyYXlSZWY8TWFjaGluZU9wZXJhbmQ+IFByZWQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8TWFjaGluZU9wZXJhbmQ+IFByZWQyKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIElmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gZGVmaW5lcyBhbnkgcHJlZGljYXRlCisgIC8vLyBvciBjb25kaXRpb24gY29kZSByZWdpc3RlcihzKSB1c2VkIGZvciBwcmVkaWNhdGlvbiwgcmV0dXJucyB0cnVlIGFzIHdlbGwKKyAgLy8vIGFzIHRoZSBkZWZpbml0aW9uIHByZWRpY2F0ZShzKSBieSByZWZlcmVuY2UuCisgIHZpcnR1YWwgYm9vbCBEZWZpbmVzUHJlZGljYXRlKE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVPcGVyYW5kPiAmUHJlZCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIGNhbiBiZSBwcmVkaWNhdGVkLgorICAvLy8gQnkgZGVmYXVsdCwgdGhpcyByZXR1cm5zIHRydWUgZm9yIGV2ZXJ5IGluc3RydWN0aW9uIHdpdGggYQorICAvLy8gUHJlZGljYXRlT3BlcmFuZC4KKyAgdmlydHVhbCBib29sIGlzUHJlZGljYWJsZShjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdCB7CisgICAgcmV0dXJuIE1JLmdldERlc2MoKS5pc1ByZWRpY2FibGUoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBpdCdzIHNhZmUgdG8gbW92ZSBhIG1hY2hpbmUKKyAgLy8vIGluc3RydWN0aW9uIHRoYXQgZGVmaW5lcyB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGNsYXNzLgorICB2aXJ0dWFsIGJvb2wgaXNTYWZlVG9Nb3ZlUmVnQ2xhc3NEZWZzKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gVGVzdCBpZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBzY2hlZHVsaW5nIGJvdW5kYXJ5LgorICAvLy8gVGhpcyBwcmltYXJpbHkgaW5jbHVkZXMgbGFiZWxzIGFuZCB0ZXJtaW5hdG9ycy4KKyAgdmlydHVhbCBib29sIGlzU2NoZWR1bGluZ0JvdW5kYXJ5KGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgLy8vIE1lYXN1cmUgdGhlIHNwZWNpZmllZCBpbmxpbmUgYXNtIHRvIGRldGVybWluZSBhbiBhcHByb3hpbWF0aW9uIG9mIGl0cworICAvLy8gbGVuZ3RoLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldElubGluZUFzbUxlbmd0aChjb25zdCBjaGFyICpTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtSW5mbyAmTUFJKSBjb25zdDsKKworICAvLy8gQWxsb2NhdGUgYW5kIHJldHVybiBhIGhhemFyZCByZWNvZ25pemVyIHRvIHVzZSBmb3IgdGhpcyB0YXJnZXQgd2hlbgorICAvLy8gc2NoZWR1bGluZyB0aGUgbWFjaGluZSBpbnN0cnVjdGlvbnMgYmVmb3JlIHJlZ2lzdGVyIGFsbG9jYXRpb24uCisgIHZpcnR1YWwgU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyICoKKyAgQ3JlYXRlVGFyZ2V0SGF6YXJkUmVjb2duaXplcihjb25zdCBUYXJnZXRTdWJ0YXJnZXRJbmZvICpTVEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NoZWR1bGVEQUcgKkRBRykgY29uc3Q7CisKKyAgLy8vIEFsbG9jYXRlIGFuZCByZXR1cm4gYSBoYXphcmQgcmVjb2duaXplciB0byB1c2UgZm9yIHRoaXMgdGFyZ2V0IHdoZW4KKyAgLy8vIHNjaGVkdWxpbmcgdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGJlZm9yZSByZWdpc3RlciBhbGxvY2F0aW9uLgorICB2aXJ0dWFsIFNjaGVkdWxlSGF6YXJkUmVjb2duaXplciAqCisgIENyZWF0ZVRhcmdldE1JSGF6YXJkUmVjb2duaXplcihjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjaGVkdWxlREFHICpEQUcpIGNvbnN0OworCisgIC8vLyBBbGxvY2F0ZSBhbmQgcmV0dXJuIGEgaGF6YXJkIHJlY29nbml6ZXIgdG8gdXNlIGZvciB0aGlzIHRhcmdldCB3aGVuCisgIC8vLyBzY2hlZHVsaW5nIHRoZSBtYWNoaW5lIGluc3RydWN0aW9ucyBhZnRlciByZWdpc3RlciBhbGxvY2F0aW9uLgorICB2aXJ0dWFsIFNjaGVkdWxlSGF6YXJkUmVjb2duaXplciAqCisgIENyZWF0ZVRhcmdldFBvc3RSQUhhemFyZFJlY29nbml6ZXIoY29uc3QgSW5zdHJJdGluZXJhcnlEYXRhICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NoZWR1bGVEQUcgKkRBRykgY29uc3Q7CisKKyAgLy8vIEFsbG9jYXRlIGFuZCByZXR1cm4gYSBoYXphcmQgcmVjb2duaXplciB0byB1c2UgZm9yIGJ5IG5vbi1zY2hlZHVsaW5nCisgIC8vLyBwYXNzZXMuCisgIHZpcnR1YWwgU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyICoKKyAgQ3JlYXRlVGFyZ2V0UG9zdFJBSGF6YXJkUmVjb2duaXplcihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gUHJvdmlkZSBhIGdsb2JhbCBmbGFnIGZvciBkaXNhYmxpbmcgdGhlIFByZVJBIGhhemFyZCByZWNvZ25pemVyIHRoYXQKKyAgLy8vIHRhcmdldHMgbWF5IGNob29zZSB0byBob25vci4KKyAgYm9vbCB1c2VQcmVSQUhhemFyZFJlY29nbml6ZXIoKSBjb25zdDsKKworICAvLy8gRm9yIGEgY29tcGFyaXNvbiBpbnN0cnVjdGlvbiwgcmV0dXJuIHRoZSBzb3VyY2UgcmVnaXN0ZXJzCisgIC8vLyBpbiBTcmNSZWcgYW5kIFNyY1JlZzIgaWYgaGF2aW5nIHR3byByZWdpc3RlciBvcGVyYW5kcywgYW5kIHRoZSB2YWx1ZSBpdAorICAvLy8gY29tcGFyZXMgYWdhaW5zdCBpbiBDbXBWYWx1ZS4gUmV0dXJuIHRydWUgaWYgdGhlIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb24KKyAgLy8vIGNhbiBiZSBhbmFseXplZC4KKyAgdmlydHVhbCBib29sIGFuYWx5emVDb21wYXJlKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkICZTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmU3JjUmVnMiwgaW50ICZNYXNrLCBpbnQgJlZhbHVlKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFNlZSBpZiB0aGUgY29tcGFyaXNvbiBpbnN0cnVjdGlvbiBjYW4gYmUgY29udmVydGVkCisgIC8vLyBpbnRvIHNvbWV0aGluZyBtb3JlIGVmZmljaWVudC4gRS5nLiwgb24gQVJNIG1vc3QgaW5zdHJ1Y3Rpb25zIGNhbiBzZXQgdGhlCisgIC8vLyBmbGFncyByZWdpc3Rlciwgb2J2aWF0aW5nIHRoZSBuZWVkIGZvciBhIHNlcGFyYXRlIENNUC4KKyAgdmlydHVhbCBib29sIG9wdGltaXplQ29tcGFyZUluc3RyKE1hY2hpbmVJbnN0ciAmQ21wSW5zdHIsIHVuc2lnbmVkIFNyY1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY1JlZzIsIGludCBNYXNrLCBpbnQgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdmlydHVhbCBib29sIG9wdGltaXplQ29uZEJyYW5jaChNYWNoaW5lSW5zdHIgJk1JKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBUcnkgdG8gcmVtb3ZlIHRoZSBsb2FkIGJ5IGZvbGRpbmcgaXQgdG8gYSByZWdpc3RlciBvcGVyYW5kIGF0IHRoZSB1c2UuCisgIC8vLyBXZSBmb2xkIHRoZSBsb2FkIGluc3RydWN0aW9ucyBpZiBhbmQgb25seSBpZiB0aGUKKyAgLy8vIGRlZiBhbmQgdXNlIGFyZSBpbiB0aGUgc2FtZSBCQi4gV2Ugb25seSBsb29rIGF0IG9uZSBsb2FkIGFuZCBzZWUKKyAgLy8vIHdoZXRoZXIgaXQgY2FuIGJlIGZvbGRlZCBpbnRvIE1JLiBGb2xkQXNMb2FkRGVmUmVnIGlzIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyCisgIC8vLyBkZWZpbmVkIGJ5IHRoZSBsb2FkIHdlIGFyZSB0cnlpbmcgdG8gZm9sZC4gRGVmTUkgcmV0dXJucyB0aGUgbWFjaGluZQorICAvLy8gaW5zdHJ1Y3Rpb24gdGhhdCBkZWZpbmVzIEZvbGRBc0xvYWREZWZSZWcsIGFuZCB0aGUgZnVuY3Rpb24gcmV0dXJucworICAvLy8gdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gZ2VuZXJhdGVkIGR1ZSB0byBmb2xkaW5nLgorICB2aXJ0dWFsIE1hY2hpbmVJbnN0ciAqb3B0aW1pemVMb2FkSW5zdHIoTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZGb2xkQXNMb2FkRGVmUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyIComRGVmTUkpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyAnUmVnJyBpcyBrbm93biB0byBiZSBkZWZpbmVkIGJ5IGEgbW92ZSBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24sCisgIC8vLyB0cnkgdG8gZm9sZCB0aGUgaW1tZWRpYXRlIGludG8gdGhlIHVzZSBpbnN0cnVjdGlvbi4KKyAgLy8vIElmIE1SSS0+aGFzT25lTm9uREJHVXNlKFJlZykgaXMgdHJ1ZSwgYW5kIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlLAorICAvLy8gdGhlbiB0aGUgY2FsbGVyIG1heSBhc3N1bWUgdGhhdCBEZWZNSSBoYXMgYmVlbiBlcmFzZWQgZnJvbSBpdHMgcGFyZW50CisgIC8vLyBibG9jay4gVGhlIGNhbGxlciBtYXkgYXNzdW1lIHRoYXQgaXQgd2lsbCBub3QgYmUgZXJhc2VkIGJ5IHRoaXMKKyAgLy8vIGZ1bmN0aW9uIG90aGVyd2lzZS4KKyAgdmlydHVhbCBib29sIEZvbGRJbW1lZGlhdGUoTWFjaGluZUluc3RyICZVc2VNSSwgTWFjaGluZUluc3RyICZEZWZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnLCBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgdS1vcGVyYXRpb25zIHRoZSBnaXZlbiBtYWNoaW5lCisgIC8vLyBpbnN0cnVjdGlvbiB3aWxsIGJlIGRlY29kZWQgdG8gb24gdGhlIHRhcmdldCBjcHUuIFRoZSBpdGluZXJhcnkncworICAvLy8gSXNzdWVXaWR0aCBpcyB0aGUgbnVtYmVyIG9mIG1pY3Jvb3BzIHRoYXQgY2FuIGJlIGRpc3BhdGNoZWQgZWFjaAorICAvLy8gY3ljbGUuIEFuIGluc3RydWN0aW9uIHdpdGggemVybyBtaWNyb29wcyB0YWtlcyBubyBkaXNwYXRjaCByZXNvdXJjZXMuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TnVtTWljcm9PcHMoY29uc3QgSW5zdHJJdGluZXJhcnlEYXRhICpJdGluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgZm9yIHBzZXVkbyBpbnN0cnVjdGlvbnMgdGhhdCBkb24ndCBjb25zdW1lIGFueQorICAvLy8gbWFjaGluZSByZXNvdXJjZXMgaW4gdGhlaXIgY3VycmVudCBmb3JtLiBUaGVzZSBhcmUgY29tbW9uIGNhc2VzIHRoYXQgdGhlCisgIC8vLyBzY2hlZHVsZXIgc2hvdWxkIGNvbnNpZGVyIGZyZWUsIHJhdGhlciB0aGFuIGNvbnNlcnZhdGl2ZWx5IGhhbmRsaW5nIHRoZW0KKyAgLy8vIGFzIGluc3RydWN0aW9ucyB3aXRoIG5vIGl0aW5lcmFyeS4KKyAgYm9vbCBpc1plcm9Db3N0KHVuc2lnbmVkIE9wY29kZSkgY29uc3QgeworICAgIHJldHVybiBPcGNvZGUgPD0gVGFyZ2V0T3Bjb2RlOjpDT1BZOworICB9CisKKyAgdmlydHVhbCBpbnQgZ2V0T3BlcmFuZExhdGVuY3koY29uc3QgSW5zdHJJdGluZXJhcnlEYXRhICpJdGluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROb2RlICpEZWZOb2RlLCB1bnNpZ25lZCBEZWZJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETm9kZSAqVXNlTm9kZSwgdW5zaWduZWQgVXNlSWR4KSBjb25zdDsKKworICAvLy8gQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSB1c2Ugb3BlcmFuZCBsYXRlbmN5IG9mIGEgZ2l2ZW4gcGFpciBvZiBkZWYgYW5kIHVzZS4KKyAgLy8vIEluIG1vc3QgY2FzZXMsIHRoZSBzdGF0aWMgc2NoZWR1bGluZyBpdGluZXJhcnkgd2FzIGVub3VnaCB0byBkZXRlcm1pbmUgdGhlCisgIC8vLyBvcGVyYW5kIGxhdGVuY3kuIEJ1dCBpdCBtYXkgbm90IGJlIHBvc3NpYmxlIGZvciBpbnN0cnVjdGlvbnMgd2l0aCB2YXJpYWJsZQorICAvLy8gbnVtYmVyIG9mIGRlZnMgLyB1c2VzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYSByYXcgaW50ZXJmYWNlIHRvIHRoZSBpdGluZXJhcnkgdGhhdCBtYXkgYmUgZGlyZWN0bHkgb3ZlcnJpZGRlbgorICAvLy8gYnkgYSB0YXJnZXQuIFVzZSBjb21wdXRlT3BlcmFuZExhdGVuY3kgdG8gZ2V0IHRoZSBiZXN0IGVzdGltYXRlIG9mCisgIC8vLyBsYXRlbmN5LgorICB2aXJ0dWFsIGludCBnZXRPcGVyYW5kTGF0ZW5jeShjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgKkl0aW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgJkRlZk1JLCB1bnNpZ25lZCBEZWZJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAmVXNlTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFVzZUlkeCkgY29uc3Q7CisKKyAgLy8vIENvbXB1dGUgdGhlIGluc3RydWN0aW9uIGxhdGVuY3kgb2YgYSBnaXZlbiBpbnN0cnVjdGlvbi4KKyAgLy8vIElmIHRoZSBpbnN0cnVjdGlvbiBoYXMgaGlnaGVyIGNvc3Qgd2hlbiBwcmVkaWNhdGVkLCBpdCdzIHJldHVybmVkIHZpYQorICAvLy8gUHJlZENvc3QuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SW5zdHJMYXRlbmN5KGNvbnN0IEluc3RySXRpbmVyYXJ5RGF0YSAqSXRpbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpQcmVkQ29zdCA9IG51bGxwdHIpIGNvbnN0OworCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0UHJlZGljYXRpb25Db3N0KGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0OworCisgIHZpcnR1YWwgaW50IGdldEluc3RyTGF0ZW5jeShjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgKkl0aW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROb2RlICpOb2RlKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBkZWZhdWx0IGV4cGVjdGVkIGxhdGVuY3kgZm9yIGEgZGVmIGJhc2VkIG9uIGl0cyBvcGNvZGUuCisgIHVuc2lnbmVkIGRlZmF1bHREZWZMYXRlbmN5KGNvbnN0IE1DU2NoZWRNb2RlbCAmU2NoZWRNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICZEZWZNSSkgY29uc3Q7CisKKyAgaW50IGNvbXB1dGVEZWZPcGVyYW5kTGF0ZW5jeShjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgKkl0aW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAmRGVmTUkpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG9wY29kZSBoYXMgaGlnaCBsYXRlbmN5IHRvIGl0cyByZXN1bHQuCisgIHZpcnR1YWwgYm9vbCBpc0hpZ2hMYXRlbmN5RGVmKGludCBvcGMpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIENvbXB1dGUgb3BlcmFuZCBsYXRlbmN5IGJldHdlZW4gYSBkZWYgb2YgJ1JlZycKKyAgLy8vIGFuZCBhIHVzZSBpbiB0aGUgY3VycmVudCBsb29wLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGNvbnNpZGVyZWQKKyAgLy8vIGl0ICdoaWdoJy4gVGhpcyBpcyB1c2VkIGJ5IG9wdGltaXphdGlvbiBwYXNzZXMgc3VjaCBhcyBtYWNoaW5lIExJQ00gdG8KKyAgLy8vIGRldGVybWluZSB3aGV0aGVyIGl0IG1ha2VzIHNlbnNlIHRvIGhvaXN0IGFuIGluc3RydWN0aW9uIG91dCBldmVuIGluIGEKKyAgLy8vIGhpZ2ggcmVnaXN0ZXIgcHJlc3N1cmUgc2l0dWF0aW9uLgorICB2aXJ0dWFsIGJvb2wgaGFzSGlnaE9wZXJhbmRMYXRlbmN5KGNvbnN0IFRhcmdldFNjaGVkTW9kZWwgJlNjaGVkTW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAmRGVmTUksIHVuc2lnbmVkIERlZklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgJlVzZU1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFVzZUlkeCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBDb21wdXRlIG9wZXJhbmQgbGF0ZW5jeSBvZiBhIGRlZiBvZiAnUmVnJy4gUmV0dXJuIHRydWUKKyAgLy8vIGlmIHRoZSB0YXJnZXQgY29uc2lkZXJlZCBpdCAnbG93Jy4KKyAgdmlydHVhbCBib29sIGhhc0xvd0RlZkxhdGVuY3koY29uc3QgVGFyZ2V0U2NoZWRNb2RlbCAmU2NoZWRNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICZEZWZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVmSWR4KSBjb25zdDsKKworICAvLy8gUGVyZm9ybSB0YXJnZXQtc3BlY2lmaWMgaW5zdHJ1Y3Rpb24gdmVyaWZpY2F0aW9uLgorICB2aXJ0dWFsIGJvb2wgdmVyaWZ5SW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAmRXJySW5mbykgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgY3VycmVudCBleGVjdXRpb24gZG9tYWluIGFuZCBiaXQgbWFzayBvZgorICAvLy8gcG9zc2libGUgZG9tYWlucyBmb3IgaW5zdHJ1Y3Rpb24uCisgIC8vLworICAvLy8gU29tZSBtaWNyby1hcmNoaXRlY3R1cmVzIGhhdmUgbXVsdGlwbGUgZXhlY3V0aW9uIGRvbWFpbnMsIGFuZCBtdWx0aXBsZQorICAvLy8gb3Bjb2RlcyB0aGF0IHBlcmZvcm0gdGhlIHNhbWUgb3BlcmF0aW9uIGluIGRpZmZlcmVudCBkb21haW5zLiAgRm9yCisgIC8vLyBleGFtcGxlLCB0aGUgeDg2IGFyY2hpdGVjdHVyZSBwcm92aWRlcyB0aGUgcG9yLCBvcnBzLCBhbmQgb3JwZAorICAvLy8gaW5zdHJ1Y3Rpb25zIHRoYXQgYWxsIGRvIHRoZSBzYW1lIHRoaW5nLiAgVGhlcmUgaXMgYSBsYXRlbmN5IHBlbmFsdHkgaWYgYQorICAvLy8gcmVnaXN0ZXIgaXMgd3JpdHRlbiBpbiBvbmUgZG9tYWluIGFuZCByZWFkIGluIGFub3RoZXIuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcGFpciAoZG9tYWluLCBtYXNrKSBjb250YWluaW5nIHRoZSBleGVjdXRpb24KKyAgLy8vIGRvbWFpbiBvZiBNSSwgYW5kIGEgYml0IG1hc2sgb2YgcG9zc2libGUgZG9tYWlucy4gIFRoZSBzZXRFeGVjdXRpb25Eb21haW4KKyAgLy8vIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgb3Bjb2RlIHRvIG9uZSBvZiB0aGUgZG9tYWlucyBpbiB0aGUKKyAgLy8vIGJpdCBtYXNrLiAgSW5zdHJ1Y3Rpb25zIHdob3NlIGV4ZWN1dGlvbiBkb21haW4gY2FuJ3QgYmUgY2hhbmdlZCBzaG91bGQKKyAgLy8vIHJldHVybiBhIDAgbWFzay4KKyAgLy8vCisgIC8vLyBUaGUgZXhlY3V0aW9uIGRvbWFpbiBudW1iZXJzIGRvbid0IGhhdmUgYW55IHNwZWNpYWwgbWVhbmluZyBleGNlcHQgZG9tYWluCisgIC8vLyAwIGlzIHVzZWQgZm9yIGluc3RydWN0aW9ucyB0aGF0IGFyZSBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBpbnRlcmVzdGluZworICAvLy8gZXhlY3V0aW9uIGRvbWFpbi4KKyAgLy8vCisgIHZpcnR1YWwgc3RkOjpwYWlyPHVpbnQxNl90LCB1aW50MTZfdD4KKyAgZ2V0RXhlY3V0aW9uRG9tYWluKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMCwgMCk7CisgIH0KKworICAvLy8gQ2hhbmdlIHRoZSBvcGNvZGUgb2YgTUkgdG8gZXhlY3V0ZSBpbiBEb21haW4uCisgIC8vLworICAvLy8gVGhlIGJpdCAoMSA8PCBEb21haW4pIG11c3QgYmUgc2V0IGluIHRoZSBtYXNrIHJldHVybmVkIGZyb20KKyAgLy8vIGdldEV4ZWN1dGlvbkRvbWFpbihNSSkuCisgIHZpcnR1YWwgdm9pZCBzZXRFeGVjdXRpb25Eb21haW4oTWFjaGluZUluc3RyICZNSSwgdW5zaWduZWQgRG9tYWluKSBjb25zdCB7fQorCisgIC8vLyBSZXR1cm5zIHRoZSBwcmVmZXJyZWQgbWluaW11bSBjbGVhcmFuY2UKKyAgLy8vIGJlZm9yZSBhbiBpbnN0cnVjdGlvbiB3aXRoIGFuIHVud2FudGVkIHBhcnRpYWwgcmVnaXN0ZXIgdXBkYXRlLgorICAvLy8KKyAgLy8vIFNvbWUgaW5zdHJ1Y3Rpb25zIG9ubHkgd3JpdGUgcGFydCBvZiBhIHJlZ2lzdGVyLCBhbmQgaW1wbGljaXRseSBuZWVkIHRvCisgIC8vLyByZWFkIHRoZSBvdGhlciBwYXJ0cyBvZiB0aGUgcmVnaXN0ZXIuICBUaGlzIG1heSBjYXVzZSB1bndhbnRlZCBzdGFsbHMKKyAgLy8vIHByZXZlbnRpbmcgb3RoZXJ3aXNlIHVucmVsYXRlZCBpbnN0cnVjdGlvbnMgZnJvbSBleGVjdXRpbmcgaW4gcGFyYWxsZWwgaW4KKyAgLy8vIGFuIG91dC1vZi1vcmRlciBDUFUuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsIHRoZSB4ODYgaW5zdHJ1Y3Rpb24gY3Z0c2kyc3Mgd3JpdGVzIGl0cyByZXN1bHQgdG8gYml0cworICAvLy8gWzMxOjBdIG9mIHRoZSBkZXN0aW5hdGlvbiB4bW0gcmVnaXN0ZXIuIEJpdHMgWzEyNzozMl0gYXJlIHVuYWZmZWN0ZWQsIHNvCisgIC8vLyB0aGUgaW5zdHJ1Y3Rpb24gbmVlZHMgdG8gd2FpdCBmb3IgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgdG8gYmVjb21lCisgIC8vLyBhdmFpbGFibGU6CisgIC8vLworICAvLy8gICBhZGRwcyAleG1tMSwgJXhtbTAKKyAgLy8vICAgbW92YXBzICV4bW0wLCAoJXJheCkKKyAgLy8vICAgY3Z0c2kyc3MgJXJieCwgJXhtbTAKKyAgLy8vCisgIC8vLyBJbiB0aGUgY29kZSBhYm92ZSwgdGhlIGN2dHNpMnNzIGluc3RydWN0aW9uIG5lZWRzIHRvIHdhaXQgZm9yIHRoZSBhZGRwcworICAvLy8gaW5zdHJ1Y3Rpb24gYmVmb3JlIGl0IGNhbiBpc3N1ZSwgZXZlbiB0aG91Z2ggdGhlIGhpZ2ggYml0cyBvZiAleG1tMAorICAvLy8gcHJvYmFibHkgYXJlbid0IG5lZWRlZC4KKyAgLy8vCisgIC8vLyBUaGlzIGhvb2sgcmV0dXJucyB0aGUgcHJlZmVycmVkIGNsZWFyYW5jZSBiZWZvcmUgTUksIG1lYXN1cmVkIGluCisgIC8vLyBpbnN0cnVjdGlvbnMuICBPdGhlciBkZWZzIG9mIE1JJ3Mgb3BlcmFuZCBPcE51bSBhcmUgYXZvaWRlZCBpbiB0aGUgbGFzdCBOCisgIC8vLyBpbnN0cnVjdGlvbnMgYmVmb3JlIE1JLiAgSXQgc2hvdWxkIG9ubHkgcmV0dXJuIGEgcG9zaXRpdmUgdmFsdWUgZm9yCisgIC8vLyB1bndhbnRlZCBkZXBlbmRlbmNpZXMuICBJZiB0aGUgb2xkIGJpdHMgb2YgdGhlIGRlZmluZWQgcmVnaXN0ZXIgaGF2ZQorICAvLy8gdXNlZnVsIHZhbHVlcywgb3IgaWYgTUkgaXMgZGV0ZXJtaW5lZCB0byBvdGhlcndpc2UgcmVhZCB0aGUgZGVwZW5kZW5jeSwKKyAgLy8vIHRoZSBob29rIHNob3VsZCByZXR1cm4gMC4KKyAgLy8vCisgIC8vLyBUaGUgdW53YW50ZWQgZGVwZW5kZW5jeSBtYXkgYmUgaGFuZGxlZCBieToKKyAgLy8vCisgIC8vLyAxLiBBbGxvY2F0aW5nIHRoZSBzYW1lIHJlZ2lzdGVyIGZvciBhbiBNSSBkZWYgYW5kIHVzZS4gIFRoYXQgbWFrZXMgdGhlCisgIC8vLyAgICB1bndhbnRlZCBkZXBlbmRlbmN5IGlkZW50aWNhbCB0byBhIHJlcXVpcmVkIGRlcGVuZGVuY3kuCisgIC8vLworICAvLy8gMi4gQWxsb2NhdGluZyBhIHJlZ2lzdGVyIGZvciB0aGUgZGVmIHRoYXQgaGFzIG5vIGRlZnMgaW4gdGhlIHByZXZpb3VzIE4KKyAgLy8vICAgIGluc3RydWN0aW9ucy4KKyAgLy8vCisgIC8vLyAzLiBDYWxsaW5nIGJyZWFrUGFydGlhbFJlZ0RlcGVuZGVuY3koKSB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cy4gIFRoaXMKKyAgLy8vICAgIGFsbG93cyB0aGUgdGFyZ2V0IHRvIGluc2VydCBhIGRlcGVuZGVuY3kgYnJlYWtpbmcgaW5zdHJ1Y3Rpb24uCisgIC8vLworICB2aXJ0dWFsIHVuc2lnbmVkCisgIGdldFBhcnRpYWxSZWdVcGRhdGVDbGVhcmFuY2UoY29uc3QgTWFjaGluZUluc3RyICZNSSwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgICAvLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDAgZm9yIG5vIHBhcnRpYWwgcmVnaXN0ZXIgZGVwZW5kZW5jeS4KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBtaW5pbXVtIGNsZWFyYW5jZSBiZWZvcmUgYW4gaW5zdHJ1Y3Rpb24gdGhhdCByZWFkcyBhbgorICAvLy8gdW51c2VkIHJlZ2lzdGVyLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlLCBBVlggaW5zdHJ1Y3Rpb25zIG1heSBjb3B5IHBhcnQgb2YgYSByZWdpc3RlciBvcGVyYW5kIGludG8KKyAgLy8vIHRoZSB1bnVzZWQgaGlnaCBiaXRzIG9mIHRoZSBkZXN0aW5hdGlvbiByZWdpc3Rlci4KKyAgLy8vCisgIC8vLyB2Y3Z0c2kyc2RxICVyYXgsIHVuZGVmICV4bW0wLCAleG1tMTQKKyAgLy8vCisgIC8vLyBJbiB0aGUgY29kZSBhYm92ZSwgdmN2dHNpMnNkcSBjb3BpZXMgJXhtbTBbMTI3OjY0XSBpbnRvICV4bW0xNCBjcmVhdGluZyBhCisgIC8vLyBmYWxzZSBkZXBlbmRlbmNlIG9uIGFueSBwcmV2aW91cyB3cml0ZSB0byAleG1tMC4KKyAgLy8vCisgIC8vLyBUaGlzIGhvb2sgd29ya3Mgc2ltaWxhcmx5IHRvIGdldFBhcnRpYWxSZWdVcGRhdGVDbGVhcmFuY2UsIGV4Y2VwdCB0aGF0IGl0CisgIC8vLyBkb2VzIG5vdCB0YWtlIGFuIG9wZXJhbmQgaW5kZXguIEluc3RlYWQgc2V0cyBccCBPcE51bSB0byB0aGUgaW5kZXggb2YgdGhlCisgIC8vLyB1bnVzZWQgcmVnaXN0ZXIuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0VW5kZWZSZWdDbGVhcmFuY2UoY29uc3QgTWFjaGluZUluc3RyICZNSSwgdW5zaWduZWQgJk9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgICAgLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyAwIGZvciBubyB1bmRlZiByZWdpc3RlciBkZXBlbmRlbmN5LgorICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIEluc2VydCBhIGRlcGVuZGVuY3ktYnJlYWtpbmcgaW5zdHJ1Y3Rpb24KKyAgLy8vIGJlZm9yZSBNSSB0byBlbGltaW5hdGUgYW4gdW53YW50ZWQgZGVwZW5kZW5jeSBvbiBPcE51bS4KKyAgLy8vCisgIC8vLyBJZiBpdCB3YXNuJ3QgcG9zc2libGUgdG8gYXZvaWQgYSBkZWYgaW4gdGhlIGxhc3QgTiBpbnN0cnVjdGlvbnMgYmVmb3JlIE1JCisgIC8vLyAoc2VlIGdldFBhcnRpYWxSZWdVcGRhdGVDbGVhcmFuY2UpLCB0aGlzIGhvb2sgd2lsbCBiZSBjYWxsZWQgdG8gYnJlYWsgdGhlCisgIC8vLyB1bndhbnRlZCBkZXBlbmRlbmN5LgorICAvLy8KKyAgLy8vIE9uIHg4NiwgYW4geG9ycHMgaW5zdHJ1Y3Rpb24gY2FuIGJlIHVzZWQgYXMgYSBkZXBlbmRlbmN5IGJyZWFrZXI6CisgIC8vLworICAvLy8gICBhZGRwcyAleG1tMSwgJXhtbTAKKyAgLy8vICAgbW92YXBzICV4bW0wLCAoJXJheCkKKyAgLy8vICAgeG9ycHMgJXhtbTAsICV4bW0wCisgIC8vLyAgIGN2dHNpMnNzICVyYngsICV4bW0wCisgIC8vLworICAvLy8gQW4gPGltcC1raWxsPiBvcGVyYW5kIHNob3VsZCBiZSBhZGRlZCB0byBNSSBpZiBhbiBpbnN0cnVjdGlvbiB3YXMKKyAgLy8vIGluc2VydGVkLiAgVGhpcyB0aWVzIHRoZSBpbnN0cnVjdGlvbnMgdG9nZXRoZXIgaW4gdGhlIHBvc3QtcmEgc2NoZWR1bGVyLgorICAvLy8KKyAgdmlydHVhbCB2b2lkIGJyZWFrUGFydGlhbFJlZ0RlcGVuZGVuY3koTWFjaGluZUluc3RyICZNSSwgdW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7fQorCisgIC8vLyBDcmVhdGUgbWFjaGluZSBzcGVjaWZpYyBtb2RlbCBmb3Igc2NoZWR1bGluZy4KKyAgdmlydHVhbCBERkFQYWNrZXRpemVyICoKKyAgQ3JlYXRlVGFyZ2V0U2NoZWR1bGVTdGF0ZShjb25zdCBUYXJnZXRTdWJ0YXJnZXRJbmZvICYpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBTb21ldGltZXMsIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgdGFyZ2V0CisgIC8vLyB0byB0ZWxsLCBldmVuIHdpdGhvdXQgYWxpYXNpbmcgaW5mb3JtYXRpb24sIHRoYXQgdHdvIE1JcyBhY2Nlc3MgZGlmZmVyZW50CisgIC8vLyBtZW1vcnkgYWRkcmVzc2VzLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0d28gTUlzIGFjY2VzcyBkaWZmZXJlbnQKKyAgLy8vIG1lbW9yeSBhZGRyZXNzZXMgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgLy8vCisgIC8vLyBBc3N1bWVzIGFueSBwaHlzaWNhbCByZWdpc3RlcnMgdXNlZCB0byBjb21wdXRlIGFkZHJlc3NlcyBoYXZlIHRoZSBzYW1lCisgIC8vLyB2YWx1ZSBmb3IgYm90aCBpbnN0cnVjdGlvbnMuIChUaGlzIGlzIHRoZSBtb3N0IHVzZWZ1bCBhc3N1bXB0aW9uIGZvcgorICAvLy8gcG9zdC1SQSBzY2hlZHVsaW5nLikKKyAgLy8vCisgIC8vLyBTZWUgYWxzbyBNYWNoaW5lSW5zdHI6Om1heUFsaWFzLCB3aGljaCBpcyBpbXBsZW1lbnRlZCBvbiB0b3Agb2YgdGhpcworICAvLy8gZnVuY3Rpb24uCisgIHZpcnR1YWwgYm9vbAorICBhcmVNZW1BY2Nlc3Nlc1RyaXZpYWxseURpc2pvaW50KE1hY2hpbmVJbnN0ciAmTUlhLCBNYWNoaW5lSW5zdHIgJk1JYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlhc0FuYWx5c2lzICpBQSA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICBhc3NlcnQoKE1JYS5tYXlMb2FkKCkgfHwgTUlhLm1heVN0b3JlKCkpICYmCisgICAgICAgICAgICJNSWEgbXVzdCBsb2FkIGZyb20gb3IgbW9kaWZ5IGEgbWVtb3J5IGxvY2F0aW9uIik7CisgICAgYXNzZXJ0KChNSWIubWF5TG9hZCgpIHx8IE1JYi5tYXlTdG9yZSgpKSAmJgorICAgICAgICAgICAiTUliIG11c3QgbG9hZCBmcm9tIG9yIG1vZGlmeSBhIG1lbW9yeSBsb2NhdGlvbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSBNYWNoaW5lQ1NFJ3MgTG9va0FoZWFkTGltaXQsCisgIC8vLyB3aGljaCBpcyBhIGhldXJpc3RpYyB1c2VkIGZvciBDU0UnaW5nIHBoeXMgcmVnIGRlZnMuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TWFjaGluZUNTRUxvb2tBaGVhZExpbWl0KCkgY29uc3QgeworICAgIC8vIFRoZSBkZWZhdWx0IGxvb2thaGVhZCBpcyBzbWFsbCB0byBwcmV2ZW50IHVucHJvZml0YWJsZSBxdWFkcmF0aWMKKyAgICAvLyBiZWhhdmlvci4KKyAgICByZXR1cm4gNTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYW4gYXJyYXkgdGhhdCBjb250YWlucyB0aGUgaWRzIG9mIHRoZSB0YXJnZXQgaW5kaWNlcyAodXNlZCBmb3IgdGhlCisgIC8vLyBUYXJnZXRJbmRleCBtYWNoaW5lIG9wZXJhbmQpIGFuZCB0aGVpciBuYW1lcy4KKyAgLy8vCisgIC8vLyBNSVIgU2VyaWFsaXphdGlvbiBpcyBhYmxlIHRvIHNlcmlhbGl6ZSBvbmx5IHRoZSB0YXJnZXQgaW5kaWNlcyB0aGF0IGFyZQorICAvLy8gZGVmaW5lZCBieSB0aGlzIG1ldGhvZC4KKyAgdmlydHVhbCBBcnJheVJlZjxzdGQ6OnBhaXI8aW50LCBjb25zdCBjaGFyICo+PgorICBnZXRTZXJpYWxpemFibGVUYXJnZXRJbmRpY2VzKCkgY29uc3QgeworICAgIHJldHVybiBOb25lOworICB9CisKKyAgLy8vIERlY29tcG9zZSB0aGUgbWFjaGluZSBvcGVyYW5kJ3MgdGFyZ2V0IGZsYWdzIGludG8gdHdvIHZhbHVlcyAtIHRoZSBkaXJlY3QKKyAgLy8vIHRhcmdldCBmbGFnIHZhbHVlIGFuZCBhbnkgb2YgYml0IGZsYWdzIHRoYXQgYXJlIGFwcGxpZWQuCisgIHZpcnR1YWwgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4KKyAgZGVjb21wb3NlTWFjaGluZU9wZXJhbmRzVGFyZ2V0RmxhZ3ModW5zaWduZWQgLypURiovKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDB1LCAwdSk7CisgIH0KKworICAvLy8gUmV0dXJuIGFuIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGRpcmVjdCB0YXJnZXQgZmxhZyB2YWx1ZXMgYW5kIHRoZWlyCisgIC8vLyBuYW1lcy4KKyAgLy8vCisgIC8vLyBNSVIgU2VyaWFsaXphdGlvbiBpcyBhYmxlIHRvIHNlcmlhbGl6ZSBvbmx5IHRoZSB0YXJnZXQgZmxhZ3MgdGhhdCBhcmUKKyAgLy8vIGRlZmluZWQgYnkgdGhpcyBtZXRob2QuCisgIHZpcnR1YWwgQXJyYXlSZWY8c3RkOjpwYWlyPHVuc2lnbmVkLCBjb25zdCBjaGFyICo+PgorICBnZXRTZXJpYWxpemFibGVEaXJlY3RNYWNoaW5lT3BlcmFuZFRhcmdldEZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBOb25lOworICB9CisKKyAgLy8vIFJldHVybiBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBiaXRtYXNrIHRhcmdldCBmbGFnIHZhbHVlcyBhbmQgdGhlaXIKKyAgLy8vIG5hbWVzLgorICAvLy8KKyAgLy8vIE1JUiBTZXJpYWxpemF0aW9uIGlzIGFibGUgdG8gc2VyaWFsaXplIG9ubHkgdGhlIHRhcmdldCBmbGFncyB0aGF0IGFyZQorICAvLy8gZGVmaW5lZCBieSB0aGlzIG1ldGhvZC4KKyAgdmlydHVhbCBBcnJheVJlZjxzdGQ6OnBhaXI8dW5zaWduZWQsIGNvbnN0IGNoYXIgKj4+CisgIGdldFNlcmlhbGl6YWJsZUJpdG1hc2tNYWNoaW5lT3BlcmFuZFRhcmdldEZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBOb25lOworICB9CisKKyAgLy8vIFJldHVybiBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBNTU8gdGFyZ2V0IGZsYWcgdmFsdWVzIGFuZCB0aGVpcgorICAvLy8gbmFtZXMuCisgIC8vLworICAvLy8gTUlSIFNlcmlhbGl6YXRpb24gaXMgYWJsZSB0byBzZXJpYWxpemUgb25seSB0aGUgTU1PIHRhcmdldCBmbGFncyB0aGF0IGFyZQorICAvLy8gZGVmaW5lZCBieSB0aGlzIG1ldGhvZC4KKyAgdmlydHVhbCBBcnJheVJlZjxzdGQ6OnBhaXI8TWFjaGluZU1lbU9wZXJhbmQ6OkZsYWdzLCBjb25zdCBjaGFyICo+PgorICBnZXRTZXJpYWxpemFibGVNYWNoaW5lTWVtT3BlcmFuZFRhcmdldEZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBOb25lOworICB9CisKKyAgLy8vIERldGVybWluZXMgd2hldGhlciBccCBJbnN0IGlzIGEgdGFpbCBjYWxsIGluc3RydWN0aW9uLiBPdmVycmlkZSB0aGlzCisgIC8vLyBtZXRob2Qgb24gdGFyZ2V0cyB0aGF0IGRvIG5vdCBwcm9wZXJseSBzZXQgTUNJRDo6UmV0dXJuIGFuZCBNQ0lEOjpDYWxsIG9uCisgIC8vLyB0YWlsIGNhbGwgaW5zdHJ1Y3Rpb25zLiIKKyAgdmlydHVhbCBib29sIGlzVGFpbENhbGwoY29uc3QgTWFjaGluZUluc3RyICZJbnN0KSBjb25zdCB7CisgICAgcmV0dXJuIEluc3QuaXNSZXR1cm4oKSAmJiBJbnN0LmlzQ2FsbCgpOworICB9CisKKyAgLy8vIFRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGJvdW5kIHRvIHRoZSB0b3Agb2YgaXRzIGJhc2ljIGJsb2NrIGFuZCBubworICAvLy8gb3RoZXIgaW5zdHJ1Y3Rpb25zIHNoYWxsIGJlIGluc2VydGVkIGJlZm9yZSBpdC4gVGhpcyBjYW4gYmUgaW1wbGVtZW50ZWQKKyAgLy8vIHRvIHByZXZlbnQgcmVnaXN0ZXIgYWxsb2NhdG9yIHRvIGluc2VydCBzcGlsbHMgYmVmb3JlIHN1Y2ggaW5zdHJ1Y3Rpb25zLgorICB2aXJ0dWFsIGJvb2wgaXNCYXNpY0Jsb2NrUHJvbG9ndWUoY29uc3QgTWFjaGluZUluc3RyICZNSSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGVzY3JpYmVzIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgaXQgd2lsbCB0YWtlIHRvIGNhbGwgYW5kCisgIC8vLyBjb25zdHJ1Y3QgYSBmcmFtZSBmb3IgYSBnaXZlbiBvdXRsaW5pbmcgY2FuZGlkYXRlLgorICBzdHJ1Y3QgTWFjaGluZU91dGxpbmVySW5mbyB7CisgICAgLy8vIE51bWJlciBvZiBpbnN0cnVjdGlvbnMgdG8gY2FsbCBhbiBvdXRsaW5lZCBmdW5jdGlvbiBmb3IgdGhpcyBjYW5kaWRhdGUuCisgICAgdW5zaWduZWQgQ2FsbE92ZXJoZWFkOworCisgICAgLy8vIFxicmllZiBOdW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRvIGNvbnN0cnVjdCBhbiBvdXRsaW5lZCBmdW5jdGlvbiBmcmFtZQorICAgIC8vLyBmb3IgdGhpcyBjYW5kaWRhdGUuCisgICAgdW5zaWduZWQgRnJhbWVPdmVyaGVhZDsKKworICAgIC8vLyBcYnJpZWYgUmVwcmVzZW50cyB0aGUgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRoYXQgbXVzdCBiZSBlbWl0dGVkIHRvCisgICAgLy8vIGNvbnN0cnVjdCBhIGNhbGwgdG8gdGhpcyBjYW5kaWRhdGUuCisgICAgdW5zaWduZWQgQ2FsbENvbnN0cnVjdGlvbklEOworCisgICAgLy8vIFxicmllZiBSZXByZXNlbnRzIHRoZSBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdGhhdCBtdXN0IGJlIGVtaXR0ZWQgdG8KKyAgICAvLy8gY29uc3RydWN0IGEgZnJhbWUgZm9yIHRoaXMgY2FuZGlkYXRlJ3Mgb3V0bGluZWQgZnVuY3Rpb24uCisgICAgdW5zaWduZWQgRnJhbWVDb25zdHJ1Y3Rpb25JRDsKKworICAgIE1hY2hpbmVPdXRsaW5lckluZm8oKSB7fQorICAgIE1hY2hpbmVPdXRsaW5lckluZm8odW5zaWduZWQgQ2FsbE92ZXJoZWFkLCB1bnNpZ25lZCBGcmFtZU92ZXJoZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2FsbENvbnN0cnVjdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRnJhbWVDb25zdHJ1Y3Rpb25JRCkKKyAgICAgICAgOiBDYWxsT3ZlcmhlYWQoQ2FsbE92ZXJoZWFkKSwgRnJhbWVPdmVyaGVhZChGcmFtZU92ZXJoZWFkKSwKKyAgICAgICAgICBDYWxsQ29uc3RydWN0aW9uSUQoQ2FsbENvbnN0cnVjdGlvbklEKSwKKyAgICAgICAgICBGcmFtZUNvbnN0cnVjdGlvbklEKEZyYW1lQ29uc3RydWN0aW9uSUQpIHt9CisgIH07CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgXHAgTWFjaGluZU91dGxpbmVySW5mbyBzdHJ1Y3QgY29udGFpbmluZyB0YXJnZXQtc3BlY2lmaWMKKyAgLy8vIGluZm9ybWF0aW9uIGZvciBhIHNldCBvZiBvdXRsaW5pbmcgY2FuZGlkYXRlcy4KKyAgdmlydHVhbCBNYWNoaW5lT3V0bGluZXJJbmZvIGdldE91dGxpbmluaW5nQ2FuZGlkYXRlSW5mbygKKyAgICAgIHN0ZDo6dmVjdG9yPAorICAgICAgICAgIHN0ZDo6cGFpcjxNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IsIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcj4+CisgICAgICAgICAgJlJlcGVhdGVkU2VxdWVuY2VMb2NzKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgKKyAgICAgICAgIlRhcmdldCBkaWRuJ3QgaW1wbGVtZW50IFRhcmdldEluc3RySW5mbzo6Z2V0T3V0bGluaW5nT3ZlcmhlYWQhIik7CisgIH0KKworICAvLy8gUmVwcmVzZW50cyBob3cgYW4gaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIG1hcHBlZCBieSB0aGUgb3V0bGluZXIuCisgIC8vLyBccCBMZWdhbCBpbnN0cnVjdGlvbnMgYXJlIHRob3NlIHdoaWNoIGFyZSBzYWZlIHRvIG91dGxpbmUuCisgIC8vLyBccCBJbGxlZ2FsIGluc3RydWN0aW9ucyBhcmUgdGhvc2Ugd2hpY2ggY2Fubm90IGJlIG91dGxpbmVkLgorICAvLy8gXHAgSW52aXNpYmxlIGluc3RydWN0aW9ucyBhcmUgaW5zdHJ1Y3Rpb25zIHdoaWNoIGNhbiBiZSBvdXRsaW5lZCwgYnV0CisgIC8vLyBzaG91bGRuJ3QgYWN0dWFsbHkgaW1wYWN0IHRoZSBvdXRsaW5pbmcgcmVzdWx0LgorICBlbnVtIE1hY2hpbmVPdXRsaW5lckluc3RyVHlwZSB7IExlZ2FsLCBJbGxlZ2FsLCBJbnZpc2libGUgfTsKKworICAvLy8gUmV0dXJucyBob3cgb3IgaWYgXHAgTUkgc2hvdWxkIGJlIG91dGxpbmVkLgorICB2aXJ0dWFsIE1hY2hpbmVPdXRsaW5lckluc3RyVHlwZQorICBnZXRPdXRsaW5pbmdUeXBlKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmTUlULCB1bnNpZ25lZCBGbGFncykgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoCisgICAgICAgICJUYXJnZXQgZGlkbid0IGltcGxlbWVudCBUYXJnZXRJbnN0ckluZm86OmdldE91dGxpbmluZ1R5cGUhIik7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGFyZ2V0LWRlZmluZWQgZmxhZ3MgZGVmaW5pbmcgcHJvcGVydGllcyBvZiB0aGUgTUJCIGZvcgorICAvLy8gdGhlIG91dGxpbmVyLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldE1hY2hpbmVPdXRsaW5lck1CQkZsYWdzKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gMHgwOworICB9CisKKyAgLy8vIEluc2VydCBhIGN1c3RvbSBlcGlsb2d1ZSBmb3Igb3V0bGluZWQgZnVuY3Rpb25zLgorICAvLy8gVGhpcyBtYXkgYmUgZW1wdHksIGluIHdoaWNoIGNhc2Ugbm8gZXBpbG9ndWUgb3IgcmV0dXJuIHN0YXRlbWVudCB3aWxsIGJlCisgIC8vLyBlbWl0dGVkLgorICB2aXJ0dWFsIHZvaWQgaW5zZXJ0T3V0bGluZXJFcGlsb2d1ZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lT3V0bGluZXJJbmZvICZNSW5mbykgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoCisgICAgICAgICJUYXJnZXQgZGlkbid0IGltcGxlbWVudCBUYXJnZXRJbnN0ckluZm86Omluc2VydE91dGxpbmVyRXBpbG9ndWUhIik7CisgIH0KKworICAvLy8gSW5zZXJ0IGEgY2FsbCB0byBhbiBvdXRsaW5lZCBmdW5jdGlvbiBpbnRvIHRoZSBwcm9ncmFtLgorICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgc3BvdCB3aGVyZSB3ZSBpbnNlcnRlZCB0aGUgY2FsbC4gVGhpcyBtdXN0IGJlCisgIC8vLyBpbXBsZW1lbnRlZCBieSB0aGUgdGFyZ2V0LgorICB2aXJ0dWFsIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcgorICBpbnNlcnRPdXRsaW5lZENhbGwoTW9kdWxlICZNLCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZJdCwgTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVPdXRsaW5lckluZm8gJk1JbmZvKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgKKyAgICAgICAgIlRhcmdldCBkaWRuJ3QgaW1wbGVtZW50IFRhcmdldEluc3RySW5mbzo6aW5zZXJ0T3V0bGluZWRDYWxsISIpOworICB9CisKKyAgLy8vIEluc2VydCBhIGN1c3RvbSBwcm9sb2d1ZSBmb3Igb3V0bGluZWQgZnVuY3Rpb25zLgorICAvLy8gVGhpcyBtYXkgYmUgZW1wdHksIGluIHdoaWNoIGNhc2Ugbm8gcHJvbG9ndWUgd2lsbCBiZSBlbWl0dGVkLgorICB2aXJ0dWFsIHZvaWQgaW5zZXJ0T3V0bGluZXJQcm9sb2d1ZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lT3V0bGluZXJJbmZvICZNSW5mbykgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoCisgICAgICAgICJUYXJnZXQgZGlkbid0IGltcGxlbWVudCBUYXJnZXRJbnN0ckluZm86Omluc2VydE91dGxpbmVyUHJvbG9ndWUhIik7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGNhbiBzYWZlbHkgYmUgb3V0bGluZWQgZnJvbS4KKyAgLy8vIEEgZnVuY3Rpb24gXHAgTUYgaXMgY29uc2lkZXJlZCBzYWZlIGZvciBvdXRsaW5pbmcgaWYgYW4gb3V0bGluZWQgZnVuY3Rpb24KKyAgLy8vIHByb2R1Y2VkIGZyb20gaW5zdHJ1Y3Rpb25zIGluIEYgd2lsbCBwcm9kdWNlIGEgcHJvZ3JhbSB3aGljaCBwcm9kdWNlcyB0aGUKKyAgLy8vIHNhbWUgb3V0cHV0IGZvciBhbnkgc2V0IG9mIGdpdmVuIGlucHV0cy4KKyAgdmlydHVhbCBib29sIGlzRnVuY3Rpb25TYWZlVG9PdXRsaW5lRnJvbShNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT3V0bGluZUZyb21MaW5rT25jZU9EUnMpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUYXJnZXQgZGlkbid0IGltcGxlbWVudCAiCisgICAgICAgICAgICAgICAgICAgICAiVGFyZ2V0SW5zdHJJbmZvOjppc0Z1bmN0aW9uU2FmZVRvT3V0bGluZUZyb20hIik7CisgIH0KKworcHJpdmF0ZToKKyAgdW5zaWduZWQgQ2FsbEZyYW1lU2V0dXBPcGNvZGUsIENhbGxGcmFtZURlc3Ryb3lPcGNvZGU7CisgIHVuc2lnbmVkIENhdGNoUmV0T3Bjb2RlOworICB1bnNpZ25lZCBSZXR1cm5PcGNvZGU7Cit9OworCisvLy8gXGJyaWVmIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciBUYXJnZXRJbnN0ckluZm86OlJlZ1N1YlJlZ1BhaXIuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPFRhcmdldEluc3RySW5mbzo6UmVnU3ViUmVnUGFpcj4geworICB1c2luZyBSZWdJbmZvID0gRGVuc2VNYXBJbmZvPHVuc2lnbmVkPjsKKworICBzdGF0aWMgaW5saW5lIFRhcmdldEluc3RySW5mbzo6UmVnU3ViUmVnUGFpciBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gVGFyZ2V0SW5zdHJJbmZvOjpSZWdTdWJSZWdQYWlyKFJlZ0luZm86OmdldEVtcHR5S2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdJbmZvOjpnZXRFbXB0eUtleSgpKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgVGFyZ2V0SW5zdHJJbmZvOjpSZWdTdWJSZWdQYWlyIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gVGFyZ2V0SW5zdHJJbmZvOjpSZWdTdWJSZWdQYWlyKFJlZ0luZm86OmdldFRvbWJzdG9uZUtleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnSW5mbzo6Z2V0VG9tYnN0b25lS2V5KCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXVzZSBnZXRIYXNoVmFsdWUgaW1wbGVtZW50YXRpb24gZnJvbQorICAvLy8gc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4uCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgVGFyZ2V0SW5zdHJJbmZvOjpSZWdTdWJSZWdQYWlyICZWYWwpIHsKKyAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiBQYWlyVmFsID0gc3RkOjptYWtlX3BhaXIoVmFsLlJlZywgVmFsLlN1YlJlZyk7CisgICAgcmV0dXJuIERlbnNlTWFwSW5mbzxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPj46OmdldEhhc2hWYWx1ZShQYWlyVmFsKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgVGFyZ2V0SW5zdHJJbmZvOjpSZWdTdWJSZWdQYWlyICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvOjpSZWdTdWJSZWdQYWlyICZSSFMpIHsKKyAgICByZXR1cm4gUmVnSW5mbzo6aXNFcXVhbChMSFMuUmVnLCBSSFMuUmVnKSAmJgorICAgICAgICAgICBSZWdJbmZvOjppc0VxdWFsKExIUy5TdWJSZWcsIFJIUy5TdWJSZWcpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UQVJHRVRfVEFSR0VUSU5TVFJJTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRMb3dlcmluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldExvd2VyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzMjIzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRMb3dlcmluZy5oCkBAIC0wLDAgKzEsMzYxNSBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9UYXJnZXRMb3dlcmluZy5oIC0gVGFyZ2V0IExvd2VyaW5nIEluZm8gLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyBob3cgdG8gbG93ZXIgTExWTSBjb2RlIHRvIG1hY2hpbmUgY29kZS4gIFRoaXMgaGFzIHR3bworLy8vIG1haW4gY29tcG9uZW50czoKKy8vLworLy8vICAxLiBXaGljaCBWYWx1ZVR5cGVzIGFyZSBuYXRpdmVseSBzdXBwb3J0ZWQgYnkgdGhlIHRhcmdldC4KKy8vLyAgMi4gV2hpY2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkIGZvciBzdXBwb3J0ZWQgVmFsdWVUeXBlcy4KKy8vLyAgMy4gQ29zdCB0aHJlc2hvbGRzIGZvciBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMgb2YgY2VydGFpbiBvcGVyYXRpb25zLgorLy8vCisvLy8gSW4gYWRkaXRpb24gaXQgaGFzIGEgZmV3IG90aGVyIGNvbXBvbmVudHMsIGxpa2UgaW5mb3JtYXRpb24gYWJvdXQgRlAKKy8vLyBpbW1lZGlhdGVzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9UQVJHRVRMT1dFUklOR19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9UQVJHRVRMT1dFUklOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRGl2ZXJnZW5jZUFuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0RBR0NvbWJpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vSVNET3Bjb2Rlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9SdW50aW1lTGliY2FsbHMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR05vZGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldENhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGF0YUxheW91dC5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSVJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbmxpbmVBc20uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0F0b21pY09yZGVyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYWNoaW5lVmFsdWVUeXBlLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJyYW5jaFByb2JhYmlsaXR5OworY2xhc3MgQ0NTdGF0ZTsKK2NsYXNzIENDVmFsQXNzaWduOworY2xhc3MgQ29uc3RhbnQ7CitjbGFzcyBGYXN0SVNlbDsKK2NsYXNzIEZ1bmN0aW9uTG93ZXJpbmdJbmZvOworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBJbnRyaW5zaWNJbnN0Oworc3RydWN0IEtub3duQml0czsKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBNYWNoaW5lSnVtcFRhYmxlSW5mbzsKK2NsYXNzIE1hY2hpbmVMb29wOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7CitjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbzsKK2NsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKK2NsYXNzIFZhbHVlOworCituYW1lc3BhY2UgU2NoZWQgeworCisgIGVudW0gUHJlZmVyZW5jZSB7CisgICAgTm9uZSwgICAgICAgICAgICAgLy8gTm8gcHJlZmVyZW5jZQorICAgIFNvdXJjZSwgICAgICAgICAgIC8vIEZvbGxvdyBzb3VyY2Ugb3JkZXIuCisgICAgUmVnUHJlc3N1cmUsICAgICAgLy8gU2NoZWR1bGluZyBmb3IgbG93ZXN0IHJlZ2lzdGVyIHByZXNzdXJlLgorICAgIEh5YnJpZCwgICAgICAgICAgIC8vIFNjaGVkdWxpbmcgZm9yIGJvdGggbGF0ZW5jeSBhbmQgcmVnaXN0ZXIgcHJlc3N1cmUuCisgICAgSUxQLCAgICAgICAgICAgICAgLy8gU2NoZWR1bGluZyBmb3IgSUxQIGluIGxvdyByZWdpc3RlciBwcmVzc3VyZSBtb2RlLgorICAgIFZMSVcgICAgICAgICAgICAgIC8vIFNjaGVkdWxpbmcgZm9yIFZMSVcgdGFyZ2V0cy4KKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIFNjaGVkCisKKy8vLyBUaGlzIGJhc2UgY2xhc3MgZm9yIFRhcmdldExvd2VyaW5nIGNvbnRhaW5zIHRoZSBTZWxlY3Rpb25EQUctaW5kZXBlbmRlbnQKKy8vLyBwYXJ0cyB0aGF0IGNhbiBiZSB1c2VkIGZyb20gdGhlIHJlc3Qgb2YgQ29kZUdlbi4KK2NsYXNzIFRhcmdldExvd2VyaW5nQmFzZSB7CitwdWJsaWM6CisgIC8vLyBUaGlzIGVudW0gaW5kaWNhdGVzIHdoZXRoZXIgb3BlcmF0aW9ucyBhcmUgdmFsaWQgZm9yIGEgdGFyZ2V0LCBhbmQgaWYgbm90LAorICAvLy8gd2hhdCBhY3Rpb24gc2hvdWxkIGJlIHVzZWQgdG8gbWFrZSB0aGVtIHZhbGlkLgorICBlbnVtIExlZ2FsaXplQWN0aW9uIDogdWludDhfdCB7CisgICAgTGVnYWwsICAgICAgLy8gVGhlIHRhcmdldCBuYXRpdmVseSBzdXBwb3J0cyB0aGlzIG9wZXJhdGlvbi4KKyAgICBQcm9tb3RlLCAgICAvLyBUaGlzIG9wZXJhdGlvbiBzaG91bGQgYmUgZXhlY3V0ZWQgaW4gYSBsYXJnZXIgdHlwZS4KKyAgICBFeHBhbmQsICAgICAvLyBUcnkgdG8gZXhwYW5kIHRoaXMgdG8gb3RoZXIgb3BzLCBvdGhlcndpc2UgdXNlIGEgbGliY2FsbC4KKyAgICBMaWJDYWxsLCAgICAvLyBEb24ndCB0cnkgdG8gZXhwYW5kIHRoaXMgdG8gb3RoZXIgb3BzLCBhbHdheXMgdXNlIGEgbGliY2FsbC4KKyAgICBDdXN0b20gICAgICAvLyBVc2UgdGhlIExvd2VyT3BlcmF0aW9uIGhvb2sgdG8gaW1wbGVtZW50IGN1c3RvbSBsb3dlcmluZy4KKyAgfTsKKworICAvLy8gVGhpcyBlbnVtIGluZGljYXRlcyB3aGV0aGVyIGEgdHlwZXMgYXJlIGxlZ2FsIGZvciBhIHRhcmdldCwgYW5kIGlmIG5vdCwKKyAgLy8vIHdoYXQgYWN0aW9uIHNob3VsZCBiZSB1c2VkIHRvIG1ha2UgdGhlbSB2YWxpZC4KKyAgZW51bSBMZWdhbGl6ZVR5cGVBY3Rpb24gOiB1aW50OF90IHsKKyAgICBUeXBlTGVnYWwsICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IG5hdGl2ZWx5IHN1cHBvcnRzIHRoaXMgdHlwZS4KKyAgICBUeXBlUHJvbW90ZUludGVnZXIsICAvLyBSZXBsYWNlIHRoaXMgaW50ZWdlciB3aXRoIGEgbGFyZ2VyIG9uZS4KKyAgICBUeXBlRXhwYW5kSW50ZWdlciwgICAvLyBTcGxpdCB0aGlzIGludGVnZXIgaW50byB0d28gb2YgaGFsZiB0aGUgc2l6ZS4KKyAgICBUeXBlU29mdGVuRmxvYXQsICAgICAvLyBDb252ZXJ0IHRoaXMgZmxvYXQgdG8gYSBzYW1lIHNpemUgaW50ZWdlciB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGFuIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRhcmdldCBIVy4KKyAgICBUeXBlRXhwYW5kRmxvYXQsICAgICAvLyBTcGxpdCB0aGlzIGZsb2F0IGludG8gdHdvIG9mIGhhbGYgdGhlIHNpemUuCisgICAgVHlwZVNjYWxhcml6ZVZlY3RvciwgLy8gUmVwbGFjZSB0aGlzIG9uZS1lbGVtZW50IHZlY3RvciB3aXRoIGl0cyBlbGVtZW50LgorICAgIFR5cGVTcGxpdFZlY3RvciwgICAgIC8vIFNwbGl0IHRoaXMgdmVjdG9yIGludG8gdHdvIG9mIGhhbGYgdGhlIHNpemUuCisgICAgVHlwZVdpZGVuVmVjdG9yLCAgICAgLy8gVGhpcyB2ZWN0b3Igc2hvdWxkIGJlIHdpZGVuZWQgaW50byBhIGxhcmdlciB2ZWN0b3IuCisgICAgVHlwZVByb21vdGVGbG9hdCAgICAgLy8gUmVwbGFjZSB0aGlzIGZsb2F0IHdpdGggYSBsYXJnZXIgb25lLgorICB9OworCisgIC8vLyBMZWdhbGl6ZUtpbmQgaG9sZHMgdGhlIGxlZ2FsaXphdGlvbiBraW5kIHRoYXQgbmVlZHMgdG8gaGFwcGVuIHRvIEVWVAorICAvLy8gaW4gb3JkZXIgdG8gdHlwZS1sZWdhbGl6ZSBpdC4KKyAgdXNpbmcgTGVnYWxpemVLaW5kID0gc3RkOjpwYWlyPExlZ2FsaXplVHlwZUFjdGlvbiwgRVZUPjsKKworICAvLy8gRW51bSB0aGF0IGRlc2NyaWJlcyBob3cgdGhlIHRhcmdldCByZXByZXNlbnRzIHRydWUvZmFsc2UgdmFsdWVzLgorICBlbnVtIEJvb2xlYW5Db250ZW50IHsKKyAgICBVbmRlZmluZWRCb29sZWFuQ29udGVudCwgICAgLy8gT25seSBiaXQgMCBjb3VudHMsIHRoZSByZXN0IGNhbiBob2xkIGdhcmJhZ2UuCisgICAgWmVyb09yT25lQm9vbGVhbkNvbnRlbnQsICAgICAgICAvLyBBbGwgYml0cyB6ZXJvIGV4Y2VwdCBmb3IgYml0IDAuCisgICAgWmVyb09yTmVnYXRpdmVPbmVCb29sZWFuQ29udGVudCAvLyBBbGwgYml0cyBlcXVhbCB0byBiaXQgMC4KKyAgfTsKKworICAvLy8gRW51bSB0aGF0IGRlc2NyaWJlcyB3aGF0IHR5cGUgb2Ygc3VwcG9ydCBmb3Igc2VsZWN0cyB0aGUgdGFyZ2V0IGhhcy4KKyAgZW51bSBTZWxlY3RTdXBwb3J0S2luZCB7CisgICAgU2NhbGFyVmFsU2VsZWN0LCAgICAgIC8vIFRoZSB0YXJnZXQgc3VwcG9ydHMgc2NhbGFyIHNlbGVjdHMgKGV4OiBjbW92KS4KKyAgICBTY2FsYXJDb25kVmVjdG9yVmFsLCAgLy8gVGhlIHRhcmdldCBzdXBwb3J0cyBzZWxlY3RzIHdpdGggYSBzY2FsYXIgY29uZGl0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB2ZWN0b3IgdmFsdWVzIChleDogY21vdikuCisgICAgVmVjdG9yTWFza1NlbGVjdCAgICAgIC8vIFRoZSB0YXJnZXQgc3VwcG9ydHMgdmVjdG9yIHNlbGVjdHMgd2l0aCBhIHZlY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXNrIChleDogeDg2IGJsZW5kcykuCisgIH07CisKKyAgLy8vIEVudW0gdGhhdCBzcGVjaWZpZXMgd2hhdCBhbiBhdG9taWMgbG9hZC9BdG9taWNSTVdJbnN0IGlzIGV4cGFuZGVkCisgIC8vLyB0bywgaWYgYXQgYWxsLiBFeGlzdHMgYmVjYXVzZSBkaWZmZXJlbnQgdGFyZ2V0cyBoYXZlIGRpZmZlcmVudCBsZXZlbHMgb2YKKyAgLy8vIHN1cHBvcnQgZm9yIHRoZXNlIGF0b21pYyBpbnN0cnVjdGlvbnMsIGFuZCBhbHNvIGhhdmUgZGlmZmVyZW50IG9wdGlvbnMKKyAgLy8vIHcuci50LiB3aGF0IHRoZXkgc2hvdWxkIGV4cGFuZCB0by4KKyAgZW51bSBjbGFzcyBBdG9taWNFeHBhbnNpb25LaW5kIHsKKyAgICBOb25lLCAgICAvLyBEb24ndCBleHBhbmQgdGhlIGluc3RydWN0aW9uLgorICAgIExMU0MsICAgIC8vIEV4cGFuZCB0aGUgaW5zdHJ1Y3Rpb24gaW50byBsb2FkbGlua2VkL3N0b3JlY29uZGl0aW9uYWw7IHVzZWQKKyAgICAgICAgICAgICAvLyBieSBBUk0vQUFyY2g2NC4KKyAgICBMTE9ubHksICAvLyBFeHBhbmQgdGhlIChsb2FkKSBpbnN0cnVjdGlvbiBpbnRvIGp1c3QgYSBsb2FkLWxpbmtlZCwgd2hpY2ggaGFzCisgICAgICAgICAgICAgLy8gZ3JlYXRlciBhdG9taWMgZ3VhcmFudGVlcyB0aGFuIGEgbm9ybWFsIGxvYWQuCisgICAgQ21wWENoZywgLy8gRXhwYW5kIHRoZSBpbnN0cnVjdGlvbiBpbnRvIGNtcHhjaGc7IHVzZWQgYnkgYXQgbGVhc3QgWDg2LgorICB9OworCisgIC8vLyBFbnVtIHRoYXQgc3BlY2lmaWVzIHdoZW4gYSBtdWx0aXBsaWNhdGlvbiBzaG91bGQgYmUgZXhwYW5kZWQuCisgIGVudW0gY2xhc3MgTXVsRXhwYW5zaW9uS2luZCB7CisgICAgQWx3YXlzLCAgICAgICAgICAgIC8vIEFsd2F5cyBleHBhbmQgdGhlIGluc3RydWN0aW9uLgorICAgIE9ubHlMZWdhbE9yQ3VzdG9tLCAvLyBPbmx5IGV4cGFuZCB3aGVuIHRoZSByZXN1bHRpbmcgaW5zdHJ1Y3Rpb25zIGFyZSBsZWdhbAorICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBjdXN0b20uCisgIH07CisKKyAgY2xhc3MgQXJnTGlzdEVudHJ5IHsKKyAgcHVibGljOgorICAgIFZhbHVlICpWYWwgPSBudWxscHRyOworICAgIFNEVmFsdWUgTm9kZSA9IFNEVmFsdWUoKTsKKyAgICBUeXBlICpUeSA9IG51bGxwdHI7CisgICAgYm9vbCBJc1NFeHQgOiAxOworICAgIGJvb2wgSXNaRXh0IDogMTsKKyAgICBib29sIElzSW5SZWcgOiAxOworICAgIGJvb2wgSXNTUmV0IDogMTsKKyAgICBib29sIElzTmVzdCA6IDE7CisgICAgYm9vbCBJc0J5VmFsIDogMTsKKyAgICBib29sIElzSW5BbGxvY2EgOiAxOworICAgIGJvb2wgSXNSZXR1cm5lZCA6IDE7CisgICAgYm9vbCBJc1N3aWZ0U2VsZiA6IDE7CisgICAgYm9vbCBJc1N3aWZ0RXJyb3IgOiAxOworICAgIHVpbnQxNl90IEFsaWdubWVudCA9IDA7CisKKyAgICBBcmdMaXN0RW50cnkoKQorICAgICAgICA6IElzU0V4dChmYWxzZSksIElzWkV4dChmYWxzZSksIElzSW5SZWcoZmFsc2UpLCBJc1NSZXQoZmFsc2UpLAorICAgICAgICAgIElzTmVzdChmYWxzZSksIElzQnlWYWwoZmFsc2UpLCBJc0luQWxsb2NhKGZhbHNlKSwgSXNSZXR1cm5lZChmYWxzZSksCisgICAgICAgICAgSXNTd2lmdFNlbGYoZmFsc2UpLCBJc1N3aWZ0RXJyb3IoZmFsc2UpIHt9CisKKyAgICB2b2lkIHNldEF0dHJpYnV0ZXMoSW1tdXRhYmxlQ2FsbFNpdGUgKkNTLCB1bnNpZ25lZCBBcmdJZHgpOworICB9OworICB1c2luZyBBcmdMaXN0VHkgPSBzdGQ6OnZlY3RvcjxBcmdMaXN0RW50cnk+OworCisgIHZpcnR1YWwgdm9pZCBtYXJrTGliQ2FsbEF0dHJpYnV0ZXMoTWFjaGluZUZ1bmN0aW9uICpNRiwgdW5zaWduZWQgQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnTGlzdFR5ICZBcmdzKSBjb25zdCB7fTsKKworICBzdGF0aWMgSVNEOjpOb2RlVHlwZSBnZXRFeHRlbmRGb3JDb250ZW50KEJvb2xlYW5Db250ZW50IENvbnRlbnQpIHsKKyAgICBzd2l0Y2ggKENvbnRlbnQpIHsKKyAgICBjYXNlIFVuZGVmaW5lZEJvb2xlYW5Db250ZW50OgorICAgICAgLy8gRXh0ZW5kIGJ5IGFkZGluZyBydWJiaXNoIGJpdHMuCisgICAgICByZXR1cm4gSVNEOjpBTllfRVhURU5EOworICAgIGNhc2UgWmVyb09yT25lQm9vbGVhbkNvbnRlbnQ6CisgICAgICAvLyBFeHRlbmQgYnkgYWRkaW5nIHplcm8gYml0cy4KKyAgICAgIHJldHVybiBJU0Q6OlpFUk9fRVhURU5EOworICAgIGNhc2UgWmVyb09yTmVnYXRpdmVPbmVCb29sZWFuQ29udGVudDoKKyAgICAgIC8vIEV4dGVuZCBieSBjb3B5aW5nIHRoZSBzaWduIGJpdC4KKyAgICAgIHJldHVybiBJU0Q6OlNJR05fRVhURU5EOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIGNvbnRlbnQga2luZCIpOworICB9CisKKyAgLy8vIE5PVEU6IFRoZSBUYXJnZXRNYWNoaW5lIG93bnMgVExPRi4KKyAgZXhwbGljaXQgVGFyZ2V0TG93ZXJpbmdCYXNlKGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKTsKKyAgVGFyZ2V0TG93ZXJpbmdCYXNlKGNvbnN0IFRhcmdldExvd2VyaW5nQmFzZSAmKSA9IGRlbGV0ZTsKKyAgVGFyZ2V0TG93ZXJpbmdCYXNlICZvcGVyYXRvcj0oY29uc3QgVGFyZ2V0TG93ZXJpbmdCYXNlICYpID0gZGVsZXRlOworICB2aXJ0dWFsIH5UYXJnZXRMb3dlcmluZ0Jhc2UoKSA9IGRlZmF1bHQ7CisKK3Byb3RlY3RlZDoKKyAgLy8vIFxicmllZiBJbml0aWFsaXplIGFsbCBvZiB0aGUgYWN0aW9ucyB0byBkZWZhdWx0IHZhbHVlcy4KKyAgdm9pZCBpbml0QWN0aW9ucygpOworCitwdWJsaWM6CisgIGNvbnN0IFRhcmdldE1hY2hpbmUgJmdldFRhcmdldE1hY2hpbmUoKSBjb25zdCB7IHJldHVybiBUTTsgfQorCisgIHZpcnR1YWwgYm9vbCB1c2VTb2Z0RmxvYXQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIHBvaW50ZXIgdHlwZSBmb3IgdGhlIGdpdmVuIGFkZHJlc3Mgc3BhY2UsIGRlZmF1bHRzIHRvCisgIC8vLyB0aGUgcG9pbnRlciB0eXBlIGZyb20gdGhlIGRhdGEgbGF5b3V0LgorICAvLy8gRklYTUU6IFRoZSBkZWZhdWx0IG5lZWRzIHRvIGJlIHJlbW92ZWQgb25jZSBhbGwgdGhlIGNvZGUgaXMgdXBkYXRlZC4KKyAgTVZUIGdldFBvaW50ZXJUeShjb25zdCBEYXRhTGF5b3V0ICZETCwgdWludDMyX3QgQVMgPSAwKSBjb25zdCB7CisgICAgcmV0dXJuIE1WVDo6Z2V0SW50ZWdlclZUKERMLmdldFBvaW50ZXJTaXplSW5CaXRzKEFTKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSB0eXBlIGZvciBmcmFtZSBpbmRleCwgd2hpY2ggaXMgZGV0ZXJtaW5lZCBieQorICAvLy8gdGhlIGFsbG9jYSBhZGRyZXNzIHNwYWNlIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBkYXRhIGxheW91dC4KKyAgTVZUIGdldEZyYW1lSW5kZXhUeShjb25zdCBEYXRhTGF5b3V0ICZETCkgY29uc3QgeworICAgIHJldHVybiBnZXRQb2ludGVyVHkoREwsIERMLmdldEFsbG9jYUFkZHJTcGFjZSgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHR5cGUgZm9yIG9wZXJhbmRzIG9mIGZlbmNlLgorICAvLy8gVE9ETzogTGV0IGZlbmNlIG9wZXJhbmRzIGJlIG9mIGkzMiB0eXBlIGFuZCByZW1vdmUgdGhpcy4KKyAgdmlydHVhbCBNVlQgZ2V0RmVuY2VPcGVyYW5kVHkoY29uc3QgRGF0YUxheW91dCAmREwpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UG9pbnRlclR5KERMKTsKKyAgfQorCisgIC8vLyBFVlQgaXMgbm90IHVzZWQgaW4tdHJlZSwgYnV0IGlzIHVzZWQgYnkgb3V0LW9mLXRyZWUgdGFyZ2V0LgorICAvLy8gQSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGZ1bmN0aW9uIHdvdWxkIGJlIG5pY2UuLi4KKyAgdmlydHVhbCBNVlQgZ2V0U2NhbGFyU2hpZnRBbW91bnRUeShjb25zdCBEYXRhTGF5b3V0ICYsIEVWVCkgY29uc3Q7CisKKyAgRVZUIGdldFNoaWZ0QW1vdW50VHkoRVZUIExIU1R5LCBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBMZWdhbFR5cGVzID0gdHJ1ZSkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIHR5cGUgdG8gYmUgdXNlZCBmb3IgdGhlIGluZGV4IG9wZXJhbmQgb2Y6CisgIC8vLyBJU0Q6OklOU0VSVF9WRUNUT1JfRUxULCBJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCwKKyAgLy8vIElTRDo6SU5TRVJUX1NVQlZFQ1RPUiwgYW5kIElTRDo6RVhUUkFDVF9TVUJWRUNUT1IKKyAgdmlydHVhbCBNVlQgZ2V0VmVjdG9ySWR4VHkoY29uc3QgRGF0YUxheW91dCAmREwpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UG9pbnRlclR5KERMKTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBpc1NlbGVjdFN1cHBvcnRlZChTZWxlY3RTdXBwb3J0S2luZCAvKmtpbmQqLykgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIG11bHRpcGxlIGNvbmRpdGlvbiByZWdpc3RlcnMgYXJlIGF2YWlsYWJsZS4KKyAgYm9vbCBoYXNNdWx0aXBsZUNvbmRpdGlvblJlZ2lzdGVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gSGFzTXVsdGlwbGVDb25kaXRpb25SZWdpc3RlcnM7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBoYXMgQml0RXh0cmFjdCBpbnN0cnVjdGlvbnMuCisgIGJvb2wgaGFzRXh0cmFjdEJpdHNJbnNuKCkgY29uc3QgeyByZXR1cm4gSGFzRXh0cmFjdEJpdHNJbnNuOyB9CisKKyAgLy8vIFJldHVybiB0aGUgcHJlZmVycmVkIHZlY3RvciB0eXBlIGxlZ2FsaXphdGlvbiBhY3Rpb24uCisgIHZpcnR1YWwgVGFyZ2V0TG93ZXJpbmdCYXNlOjpMZWdhbGl6ZVR5cGVBY3Rpb24KKyAgZ2V0UHJlZmVycmVkVmVjdG9yQWN0aW9uKEVWVCBWVCkgY29uc3QgeworICAgIC8vIFRoZSBkZWZhdWx0IGFjdGlvbiBmb3Igb25lIGVsZW1lbnQgdmVjdG9ycyBpcyB0byBzY2FsYXJpemUKKyAgICBpZiAoVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSA9PSAxKQorICAgICAgcmV0dXJuIFR5cGVTY2FsYXJpemVWZWN0b3I7CisgICAgLy8gVGhlIGRlZmF1bHQgYWN0aW9uIGZvciBvdGhlciB2ZWN0b3JzIGlzIHRvIHByb21vdGUKKyAgICByZXR1cm4gVHlwZVByb21vdGVJbnRlZ2VyOworICB9CisKKyAgLy8gVGhlcmUgYXJlIHR3byBnZW5lcmFsIG1ldGhvZHMgZm9yIGV4cGFuZGluZyBhIEJVSUxEX1ZFQ1RPUiBub2RlOgorICAvLyAgMS4gVXNlIFNDQUxBUl9UT19WRUNUT1Igb24gdGhlIGRlZmluZWQgc2NhbGFyIHZhbHVlcyBhbmQgdGhlbiBzaHVmZmxlCisgIC8vICAgICB0aGVtIHRvZ2V0aGVyLgorICAvLyAgMi4gQnVpbGQgdGhlIHZlY3RvciBvbiB0aGUgc3RhY2sgYW5kIHRoZW4gbG9hZCBpdC4KKyAgLy8gSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUsIHRoZW4gbWV0aG9kICgxKSB3aWxsIGJlIHVzZWQsIHN1YmplY3QgdG8KKyAgLy8gdGhlIGNvbnN0cmFpbnQgdGhhdCBhbGwgb2YgdGhlIG5lY2Vzc2FyeSBzaHVmZmxlcyBhcmUgbGVnYWwgKGFzIGRldGVybWluZWQKKyAgLy8gYnkgaXNTaHVmZmxlTWFza0xlZ2FsKS4gSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGVuIG1ldGhvZCAoMikgaXMKKyAgLy8gYWx3YXlzIHVzZWQuIFRoZSB2ZWN0b3IgdHlwZSwgYW5kIHRoZSBudW1iZXIgb2YgZGVmaW5lZCB2YWx1ZXMsIGFyZQorICAvLyBwcm92aWRlZC4KKyAgdmlydHVhbCBib29sCisgIHNob3VsZEV4cGFuZEJ1aWxkVmVjdG9yV2l0aFNodWZmbGVzKEVWVCAvKiBWVCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVmaW5lZFZhbHVlcykgY29uc3QgeworICAgIHJldHVybiBEZWZpbmVkVmFsdWVzIDwgMzsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBpbnRlZ2VyIGRpdmlkZSBpcyB1c3VhbGx5IGNoZWFwZXIgdGhhbiBhIHNlcXVlbmNlIG9mCisgIC8vLyBzZXZlcmFsIHNoaWZ0cywgYWRkcywgYW5kIG11bHRpcGxpZXMgZm9yIHRoaXMgdGFyZ2V0LgorICAvLy8gVGhlIGRlZmluaXRpb24gb2YgImNoZWFwZXIiIG1heSBkZXBlbmQgb24gd2hldGhlciB3ZSdyZSBvcHRpbWl6aW5nCisgIC8vLyBmb3Igc3BlZWQgb3IgZm9yIHNpemUuCisgIHZpcnR1YWwgYm9vbCBpc0ludERpdkNoZWFwKEVWVCBWVCwgQXR0cmlidXRlTGlzdCBBdHRyKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGNhbiBoYW5kbGUgYSBzdGFuZGFsb25lIHJlbWFpbmRlciBvcGVyYXRpb24uCisgIHZpcnR1YWwgYm9vbCBoYXNTdGFuZGFsb25lUmVtKEVWVCBWVCkgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIFNRUlQoWCkgc2hvdWxkbid0IGJlIHJlcGxhY2VkIHdpdGggWCpSU1FSVChYKS4KKyAgdmlydHVhbCBib29sIGlzRnNxcnRDaGVhcChTRFZhbHVlIFgsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgICAgLy8gRGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXBsYWNlIFNRUlQoWCkgd2l0aCBYKlJTUVJUKFgpLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZWNpcHJvY2FsIGVzdGltYXRlIHN0YXR1cyB2YWx1ZXMgdXNlZCBieSB0aGUgZnVuY3Rpb25zIGJlbG93LgorICBlbnVtIFJlY2lwcm9jYWxFc3RpbWF0ZSA6IGludCB7CisgICAgVW5zcGVjaWZpZWQgPSAtMSwKKyAgICBEaXNhYmxlZCA9IDAsCisgICAgRW5hYmxlZCA9IDEKKyAgfTsKKworICAvLy8gUmV0dXJuIGEgUmVjaXByb2NhbEVzdGltYXRlIGVudW0gdmFsdWUgZm9yIGEgc3F1YXJlIHJvb3Qgb2YgdGhlIGdpdmVuIHR5cGUKKyAgLy8vIGJhc2VkIG9uIHRoZSBmdW5jdGlvbidzIGF0dHJpYnV0ZXMuIElmIHRoZSBvcGVyYXRpb24gaXMgbm90IG92ZXJyaWRkZW4gYnkKKyAgLy8vIHRoZSBmdW5jdGlvbidzIGF0dHJpYnV0ZXMsICJVbnNwZWNpZmllZCIgaXMgcmV0dXJuZWQgYW5kIHRhcmdldCBkZWZhdWx0cworICAvLy8gYXJlIGV4cGVjdGVkIHRvIGJlIHVzZWQgZm9yIGluc3RydWN0aW9uIHNlbGVjdGlvbi4KKyAgaW50IGdldFJlY2lwRXN0aW1hdGVTcXJ0RW5hYmxlZChFVlQgVlQsIE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBSZWNpcHJvY2FsRXN0aW1hdGUgZW51bSB2YWx1ZSBmb3IgYSBkaXZpc2lvbiBvZiB0aGUgZ2l2ZW4gdHlwZQorICAvLy8gYmFzZWQgb24gdGhlIGZ1bmN0aW9uJ3MgYXR0cmlidXRlcy4gSWYgdGhlIG9wZXJhdGlvbiBpcyBub3Qgb3ZlcnJpZGRlbiBieQorICAvLy8gdGhlIGZ1bmN0aW9uJ3MgYXR0cmlidXRlcywgIlVuc3BlY2lmaWVkIiBpcyByZXR1cm5lZCBhbmQgdGFyZ2V0IGRlZmF1bHRzCisgIC8vLyBhcmUgZXhwZWN0ZWQgdG8gYmUgdXNlZCBmb3IgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uLgorICBpbnQgZ2V0UmVjaXBFc3RpbWF0ZURpdkVuYWJsZWQoRVZUIFZULCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSByZWZpbmVtZW50IHN0ZXAgY291bnQgZm9yIGEgc3F1YXJlIHJvb3Qgb2YgdGhlIGdpdmVuIHR5cGUgYmFzZWQKKyAgLy8vIG9uIHRoZSBmdW5jdGlvbidzIGF0dHJpYnV0ZXMuIElmIHRoZSBvcGVyYXRpb24gaXMgbm90IG92ZXJyaWRkZW4gYnkKKyAgLy8vIHRoZSBmdW5jdGlvbidzIGF0dHJpYnV0ZXMsICJVbnNwZWNpZmllZCIgaXMgcmV0dXJuZWQgYW5kIHRhcmdldCBkZWZhdWx0cworICAvLy8gYXJlIGV4cGVjdGVkIHRvIGJlIHVzZWQgZm9yIGluc3RydWN0aW9uIHNlbGVjdGlvbi4KKyAgaW50IGdldFNxcnRSZWZpbmVtZW50U3RlcHMoRVZUIFZULCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSByZWZpbmVtZW50IHN0ZXAgY291bnQgZm9yIGEgZGl2aXNpb24gb2YgdGhlIGdpdmVuIHR5cGUgYmFzZWQKKyAgLy8vIG9uIHRoZSBmdW5jdGlvbidzIGF0dHJpYnV0ZXMuIElmIHRoZSBvcGVyYXRpb24gaXMgbm90IG92ZXJyaWRkZW4gYnkKKyAgLy8vIHRoZSBmdW5jdGlvbidzIGF0dHJpYnV0ZXMsICJVbnNwZWNpZmllZCIgaXMgcmV0dXJuZWQgYW5kIHRhcmdldCBkZWZhdWx0cworICAvLy8gYXJlIGV4cGVjdGVkIHRvIGJlIHVzZWQgZm9yIGluc3RydWN0aW9uIHNlbGVjdGlvbi4KKyAgaW50IGdldERpdlJlZmluZW1lbnRTdGVwcyhFVlQgVlQsIE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGFyZ2V0IGhhcyBpbmRpY2F0ZWQgYXQgbGVhc3Qgb25lIHR5cGUgc2hvdWxkIGJlIGJ5cGFzc2VkLgorICBib29sIGlzU2xvd0RpdkJ5cGFzc2VkKCkgY29uc3QgeyByZXR1cm4gIUJ5cGFzc1Nsb3dEaXZXaWR0aHMuZW1wdHkoKTsgfQorCisgIC8vLyBSZXR1cm5zIG1hcCBvZiBzbG93IHR5cGVzIGZvciBkaXZpc2lvbiBvciByZW1haW5kZXIgd2l0aCBjb3JyZXNwb25kaW5nCisgIC8vLyBmYXN0IHR5cGVzCisgIGNvbnN0IERlbnNlTWFwPHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50PiAmZ2V0QnlwYXNzU2xvd0RpdldpZHRocygpIGNvbnN0IHsKKyAgICByZXR1cm4gQnlwYXNzU2xvd0RpdldpZHRoczsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBGbG93IENvbnRyb2wgaXMgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbiB0aGF0IHNob3VsZCBiZQorICAvLy8gYXZvaWRlZC4KKyAgYm9vbCBpc0p1bXBFeHBlbnNpdmUoKSBjb25zdCB7IHJldHVybiBKdW1wSXNFeHBlbnNpdmU7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgc2VsZWN0cyBhcmUgb25seSBjaGVhcGVyIHRoYW4gYnJhbmNoZXMgaWYgdGhlIGJyYW5jaCBpcworICAvLy8gdW5saWtlbHkgdG8gYmUgcHJlZGljdGVkIHJpZ2h0LgorICBib29sIGlzUHJlZGljdGFibGVTZWxlY3RFeHBlbnNpdmUoKSBjb25zdCB7CisgICAgcmV0dXJuIFByZWRpY3RhYmxlU2VsZWN0SXNFeHBlbnNpdmU7CisgIH0KKworICAvLy8gSWYgYSBicmFuY2ggb3IgYSBzZWxlY3QgY29uZGl0aW9uIGlzIHNrZXdlZCBpbiBvbmUgZGlyZWN0aW9uIGJ5IG1vcmUgdGhhbgorICAvLy8gdGhpcyBmYWN0b3IsIGl0IGlzIHZlcnkgbGlrZWx5IHRvIGJlIHByZWRpY3RlZCBjb3JyZWN0bHkuCisgIHZpcnR1YWwgQnJhbmNoUHJvYmFiaWxpdHkgZ2V0UHJlZGljdGFibGVCcmFuY2hUaHJlc2hvbGQoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGZvbGxvd2luZyB0cmFuc2Zvcm0gaXMgYmVuZWZpY2lhbDoKKyAgLy8vIGZvbGQgKGNvbnYgKGxvYWQgeCkpIC0+IChsb2FkIChjb252Kil4KQorICAvLy8gT24gYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgc29tZSB2ZWN0b3IgbG9hZHMKKyAgLy8vIGVmZmljaWVudGx5LCBjYXN0aW5nIHRoZSBsb2FkIHRvIGEgc21hbGxlciB2ZWN0b3Igb2YgbGFyZ2VyIHR5cGVzIGFuZAorICAvLy8gbG9hZGluZyBpcyBtb3JlIGVmZmljaWVudCwgaG93ZXZlciwgdGhpcyBjYW4gYmUgdW5kb25lIGJ5IG9wdGltaXphdGlvbnMgaW4KKyAgLy8vIGRhZyBjb21iaW5lci4KKyAgdmlydHVhbCBib29sIGlzTG9hZEJpdENhc3RCZW5lZmljaWFsKEVWVCBMb2FkVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgQml0Y2FzdFZUKSBjb25zdCB7CisgICAgLy8gRG9uJ3QgZG8gaWYgd2UgY291bGQgZG8gYW4gaW5kZXhlZCBsb2FkIG9uIHRoZSBvcmlnaW5hbCB0eXBlLCBidXQgbm90IG9uCisgICAgLy8gdGhlIG5ldyBvbmUuCisgICAgaWYgKCFMb2FkVlQuaXNTaW1wbGUoKSB8fCAhQml0Y2FzdFZULmlzU2ltcGxlKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIE1WVCBMb2FkTVZUID0gTG9hZFZULmdldFNpbXBsZVZUKCk7CisKKyAgICAvLyBEb24ndCBib3RoZXIgZG9pbmcgdGhpcyBpZiBpdCdzIGp1c3QgZ29pbmcgdG8gYmUgcHJvbW90ZWQgYWdhaW4gbGF0ZXIsIGFzCisgICAgLy8gZG9pbmcgc28gbWlnaHQgaW50ZXJmZXJlIHdpdGggb3RoZXIgY29tYmluZXMuCisgICAgaWYgKGdldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkxPQUQsIExvYWRNVlQpID09IFByb21vdGUgJiYKKyAgICAgICAgZ2V0VHlwZVRvUHJvbW90ZVRvKElTRDo6TE9BRCwgTG9hZE1WVCkgPT0gQml0Y2FzdFZULmdldFNpbXBsZVZUKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZm9sbG93aW5nIHRyYW5zZm9ybSBpcyBiZW5lZmljaWFsOgorICAvLy8gKHN0b3JlICh5IChjb252IHgpKSwgeSopKSAtPiAoc3RvcmUgeCwgKHgqKSkKKyAgdmlydHVhbCBib29sIGlzU3RvcmVCaXRDYXN0QmVuZWZpY2lhbChFVlQgU3RvcmVWVCwgRVZUIEJpdGNhc3RWVCkgY29uc3QgeworICAgIC8vIERlZmF1bHQgdG8gdGhlIHNhbWUgbG9naWMgYXMgbG9hZHMuCisgICAgcmV0dXJuIGlzTG9hZEJpdENhc3RCZW5lZmljaWFsKFN0b3JlVlQsIEJpdGNhc3RWVCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgaXQgaXMgZXhwZWN0ZWQgdG8gYmUgY2hlYXBlciB0byBkbyBhIHN0b3JlIG9mIGEgbm9uLXplcm8KKyAgLy8vIHZlY3RvciBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiBzaXplIGFuZCB0eXBlIGZvciB0aGUgYWRkcmVzcyBzcGFjZSB0aGFuIHRvCisgIC8vLyBzdG9yZSB0aGUgaW5kaXZpZHVhbCBzY2FsYXIgZWxlbWVudCBjb25zdGFudHMuCisgIHZpcnR1YWwgYm9vbCBzdG9yZU9mVmVjdG9yQ29uc3RhbnRJc0NoZWFwKEVWVCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtRWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkclNwYWNlKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIEFsbG93IHN0b3JlIG1lcmdpbmcgYWZ0ZXIgbGVnYWxpemF0aW9uIGluIGFkZGl0aW9uIHRvIGJlZm9yZSBsZWdhbGl6YXRpb24uCisgIC8vLyBUaGlzIG1heSBjYXRjaCBzdG9yZXMgdGhhdCBkbyBub3QgZXhpc3QgZWFybGllciAoZWcsIHN0b3JlcyBjcmVhdGVkIGZyb20KKyAgLy8vIGludHJpbnNpY3MpLgorICB2aXJ0dWFsIGJvb2wgbWVyZ2VTdG9yZXNBZnRlckxlZ2FsaXphdGlvbigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAvLy8gUmV0dXJucyBpZiBpdCdzIHJlYXNvbmFibGUgdG8gbWVyZ2Ugc3RvcmVzIHRvIE1lbVZUIHNpemUuCisgIHZpcnR1YWwgYm9vbCBjYW5NZXJnZVN0b3Jlc1RvKHVuc2lnbmVkIEFTLCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIGl0IGlzIGNoZWFwIHRvIHNwZWN1bGF0ZSBhIGNhbGwgdG8gaW50cmluc2ljIGN0dHouCisgIHZpcnR1YWwgYm9vbCBpc0NoZWFwVG9TcGVjdWxhdGVDdHR6KCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgaXQgaXMgY2hlYXAgdG8gc3BlY3VsYXRlIGEgY2FsbCB0byBpbnRyaW5zaWMgY3Rsei4KKyAgdmlydHVhbCBib29sIGlzQ2hlYXBUb1NwZWN1bGF0ZUN0bHooKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBjdGx6IGluc3RydWN0aW9uIGlzIGZhc3QuCisgIHZpcnR1YWwgYm9vbCBpc0N0bHpGYXN0KCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBzYWZlIHRvIHRyYW5zZm9ybSBhbiBpbnRlZ2VyLWRvbWFpbiBiaXR3aXNlIG9wZXJhdGlvbgorICAvLy8gaW50byB0aGUgZXF1aXZhbGVudCBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24uIFRoaXMgc2hvdWxkIGJlIHNldCB0byB0cnVlCisgIC8vLyBpZiB0aGUgdGFyZ2V0IGhhcyBJRUVFLTc1NC1jb21wbGlhbnQgZmFicy9mbmVnIG9wZXJhdGlvbnMgZm9yIHRoZSBpbnB1dAorICAvLy8gdHlwZS4KKyAgdmlydHVhbCBib29sIGhhc0JpdFByZXNlcnZpbmdGUExvZ2ljKEVWVCBWVCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgaXQgaXMgY2hlYXBlciB0byBzcGxpdCB0aGUgc3RvcmUgb2YgYSBtZXJnZWQgaW50IHZhbAorICAvLy8gZnJvbSBhIHBhaXIgb2Ygc21hbGxlciB2YWx1ZXMgaW50byBtdWx0aXBsZSBzdG9yZXMuCisgIHZpcnR1YWwgYm9vbCBpc011bHRpU3RvcmVzQ2hlYXBlclRoYW5CaXRzTWVyZ2UoRVZUIExUeSwgRVZUIEhUeSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGlmIHRoZSB0YXJnZXQgc3VwcG9ydHMgY29tYmluaW5nIGEKKyAgLy8vIGNoYWluIGxpa2U6CisgIC8vLyBcY29kZQorICAvLy8gICAlYW5kUmVzdWx0ID0gYW5kICV2YWwxLCAjbWFzaworICAvLy8gICAlaWNtcFJlc3VsdCA9IGljbXAgJWFuZFJlc3VsdCwgMAorICAvLy8gXGVuZGNvZGUKKyAgLy8vIGludG8gYSBzaW5nbGUgbWFjaGluZSBpbnN0cnVjdGlvbiBvZiBhIGZvcm0gbGlrZToKKyAgLy8vIFxjb2RlCisgIC8vLyAgIGNjID0gdGVzdCAlcmVnaXN0ZXIsICNtYXNrCisgIC8vLyBcZW5kY29kZQorICB2aXJ0dWFsIGJvb2wgaXNNYXNrQW5kQ21wMEZvbGRpbmdCZW5lZmljaWFsKGNvbnN0IEluc3RydWN0aW9uICZBbmRJKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFVzZSBiaXR3aXNlIGxvZ2ljIHRvIG1ha2UgcGFpcnMgb2YgY29tcGFyZXMgbW9yZSBlZmZpY2llbnQuIEZvciBleGFtcGxlOgorICAvLy8gYW5kIChzZXRlcSBBLCBCKSwgKHNldGVxIEMsIEQpIC0tPiBzZXRlcSAob3IgKHhvciBBLCBCKSwgKHhvciBDLCBEKSksIDAKKyAgLy8vIFRoaXMgc2hvdWxkIGJlIHRydWUgd2hlbiBpdCB0YWtlcyBtb3JlIHRoYW4gb25lIGluc3RydWN0aW9uIHRvIGxvd2VyCisgIC8vLyBzZXRjYyAoY21wK3NldCBvbiB4ODYgc2NhbGFyKSwgd2hlbiBiaXR3aXNlIG9wcyBhcmUgZmFzdGVyIHRoYW4gbG9naWMgb24KKyAgLy8vIGNvbmRpdGlvbiBiaXRzIChjcmFuZCBvbiBQb3dlclBDKSwgYW5kL29yIHdoZW4gcmVkdWNpbmcgY21wK2JyIGlzIGEgd2luLgorICB2aXJ0dWFsIGJvb2wgY29udmVydFNldENDTG9naWNUb0JpdHdpc2VMb2dpYyhFVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBwcmVmZXJyZWQgb3BlcmFuZCB0eXBlIGlmIHRoZSB0YXJnZXQgaGFzIGEgcXVpY2sgd2F5IHRvIGNvbXBhcmUKKyAgLy8vIGludGVnZXIgdmFsdWVzIG9mIHRoZSBnaXZlbiBzaXplLiBBc3N1bWUgdGhhdCBhbnkgbGVnYWwgaW50ZWdlciB0eXBlIGNhbgorICAvLy8gYmUgY29tcGFyZWQgZWZmaWNpZW50bHkuIFRhcmdldHMgbWF5IG92ZXJyaWRlIHRoaXMgdG8gYWxsb3cgaWxsZWdhbCB3aWRlCisgIC8vLyB0eXBlcyB0byByZXR1cm4gYSB2ZWN0b3IgdHlwZSBpZiB0aGVyZSBpcyBzdXBwb3J0IHRvIGNvbXBhcmUgdGhhdCB0eXBlLgorICB2aXJ0dWFsIE1WVCBoYXNGYXN0RXF1YWxpdHlDb21wYXJlKHVuc2lnbmVkIE51bUJpdHMpIGNvbnN0IHsKKyAgICBNVlQgVlQgPSBNVlQ6OmdldEludGVnZXJWVChOdW1CaXRzKTsKKyAgICByZXR1cm4gaXNUeXBlTGVnYWwoVlQpID8gVlQgOiBNVlQ6OklOVkFMSURfU0lNUExFX1ZBTFVFX1RZUEU7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBzaG91bGQgdHJhbnNmb3JtOgorICAvLy8gKFggJiBZKSA9PSBZIC0tLT4gKH5YICYgWSkgPT0gMAorICAvLy8gKFggJiBZKSAhPSBZIC0tLT4gKH5YICYgWSkgIT0gMAorICAvLy8KKyAgLy8vIFRoaXMgbWF5IGJlIHByb2ZpdGFibGUgaWYgdGhlIHRhcmdldCBoYXMgYSBiaXR3aXNlIGFuZC1ub3Qgb3BlcmF0aW9uIHRoYXQKKyAgLy8vIHNldHMgY29tcGFyaXNvbiBmbGFncy4gQSB0YXJnZXQgbWF5IHdhbnQgdG8gbGltaXQgdGhlIHRyYW5zZm9ybWF0aW9uIGJhc2VkCisgIC8vLyBvbiB0aGUgdHlwZSBvZiBZIG9yIGlmIFkgaXMgYSBjb25zdGFudC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhlIHRyYW5zZm9ybSB3aWxsIG5vdCBvY2N1ciBpZiBZIGlzIGtub3duIHRvIGJlIGEgcG93ZXItb2YtMgorICAvLy8gYmVjYXVzZSBhIG1hc2sgYW5kIGNvbXBhcmUgb2YgYSBzaW5nbGUgYml0IGNhbiBiZSBoYW5kbGVkIGJ5IGludmVydGluZyB0aGUKKyAgLy8vIHByZWRpY2F0ZSwgZm9yIGV4YW1wbGU6CisgIC8vLyAoWCAmIDgpID09IDggLS0tPiAoWCAmIDgpICE9IDAKKyAgdmlydHVhbCBib29sIGhhc0FuZE5vdENvbXBhcmUoU0RWYWx1ZSBZKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgaGFzIGEgYml0d2lzZSBhbmQtbm90IG9wZXJhdGlvbjoKKyAgLy8vIFggPSB+QSAmIEIKKyAgLy8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2ltcGxpZnkgc2VsZWN0IG9yIG90aGVyIGluc3RydWN0aW9ucy4KKyAgdmlydHVhbCBib29sIGhhc0FuZE5vdChTRFZhbHVlIFgpIGNvbnN0IHsKKyAgICAvLyBJZiB0aGUgdGFyZ2V0IGhhcyB0aGUgbW9yZSBjb21wbGV4IHZlcnNpb24gb2YgdGhpcyBvcGVyYXRpb24sIGFzc3VtZSB0aGF0CisgICAgLy8gaXQgaGFzIHRoaXMgb3BlcmF0aW9uIHRvby4KKyAgICByZXR1cm4gaGFzQW5kTm90Q29tcGFyZShYKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCB3YW50cyB0byB1c2UgdGhlIG9wdGltaXphdGlvbiB0aGF0CisgIC8vLyB0dXJucyBleHQocHJvbW90YWJsZUluc3QxKC4uLihwcm9tb3RhYmxlSW5zdE4obG9hZCkpKSkgaW50bworICAvLy8gcHJvbW90ZWRJbnN0MSguLi4ocHJvbW90ZWRJbnN0TihleHQobG9hZCkpKSkuCisgIGJvb2wgZW5hYmxlRXh0TGRQcm9tb3Rpb24oKSBjb25zdCB7IHJldHVybiBFbmFibGVFeHRMZFByb21vdGlvbjsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGNhbiBjb21iaW5lIHN0b3JlKGV4dHJhY3RlbGVtZW50IFZlY3RvclR5LAorICAvLy8gSWR4KS4KKyAgLy8vIFxwIENvc3Rbb3V0XSBnaXZlcyB0aGUgY29zdCBvZiB0aGF0IHRyYW5zZm9ybWF0aW9uIHdoZW4gdGhpcyBpcyB0cnVlLgorICB2aXJ0dWFsIGJvb2wgY2FuQ29tYmluZVN0b3JlQW5kRXh0cmFjdChUeXBlICpWZWN0b3JUeSwgVmFsdWUgKklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkNvc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGFyZ2V0IHN1cHBvcnRzIGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbnMuCisgIGJvb2wgaGFzRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIEhhc0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRhcmdldCBhbHdheXMgYmVuZWZpY2lhdGVzIGZyb20gY29tYmluaW5nIGludG8gRk1BIGZvciBhCisgIC8vLyBnaXZlbiB2YWx1ZSB0eXBlLiBUaGlzIG11c3QgdHlwaWNhbGx5IHJldHVybiBmYWxzZSBvbiB0YXJnZXRzIHdoZXJlIEZNQQorICAvLy8gdGFrZXMgbW9yZSBjeWNsZXMgdG8gZXhlY3V0ZSB0aGFuIEZBREQuCisgIHZpcnR1YWwgYm9vbCBlbmFibGVBZ2dyZXNzaXZlRk1BRnVzaW9uKEVWVCBWVCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIFZhbHVlVHlwZSBvZiB0aGUgcmVzdWx0IG9mIFNFVENDIG9wZXJhdGlvbnMuCisgIHZpcnR1YWwgRVZUIGdldFNldENDUmVzdWx0VHlwZShjb25zdCBEYXRhTGF5b3V0ICZETCwgTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIFZhbHVlVHlwZSBmb3IgY29tcGFyaXNvbiBsaWJjYWxscy4gQ29tcGFyaW9ucyBsaWJjYWxscyBpbmNsdWRlCisgIC8vLyBmbG9hdGluZyBwb2ludCBjb21wYXJpb24gY2FsbHMsIGFuZCBPcmRlcmVkL1Vub3JkZXJlZCBjaGVjayBjYWxscyBvbgorICAvLy8gZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4KKyAgdmlydHVhbAorICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBnZXRDbXBMaWJjYWxsUmV0dXJuVHlwZSgpIGNvbnN0OworCisgIC8vLyBGb3IgdGFyZ2V0cyB3aXRob3V0IGkxIHJlZ2lzdGVycywgdGhpcyBnaXZlcyB0aGUgbmF0dXJlIG9mIHRoZSBoaWdoLWJpdHMKKyAgLy8vIG9mIGJvb2xlYW4gdmFsdWVzIGhlbGQgaW4gdHlwZXMgd2lkZXIgdGhhbiBpMS4KKyAgLy8vCisgIC8vLyAiQm9vbGVhbiB2YWx1ZXMiIGFyZSBzcGVjaWFsIHRydWUvZmFsc2UgdmFsdWVzIHByb2R1Y2VkIGJ5IG5vZGVzIGxpa2UKKyAgLy8vIFNFVENDIGFuZCBjb25zdW1lZCAoYXMgdGhlIGNvbmRpdGlvbikgYnkgbm9kZXMgbGlrZSBTRUxFQ1QgYW5kIEJSQ09ORC4KKyAgLy8vIE5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGdlbmVyYWwgdmFsdWVzIHByb21vdGVkIGZyb20gaTEuICBTb21lIGNwdXMKKyAgLy8vIGRpc3Rpbmd1aXNoIGJldHdlZW4gdmVjdG9ycyBvZiBib29sZWFuIGFuZCBzY2FsYXJzOyB0aGUgaXNWZWMgcGFyYW1ldGVyCisgIC8vLyBzZWxlY3RzIGJldHdlZW4gdGhlIHR3byBraW5kcy4gIEZvciBleGFtcGxlIG9uIFg4NiBhIHNjYWxhciBib29sZWFuIHNob3VsZAorICAvLy8gYmUgemVybyBleHRlbmRlZCBmcm9tIGkxLCB3aGlsZSB0aGUgZWxlbWVudHMgb2YgYSB2ZWN0b3Igb2YgYm9vbGVhbnMKKyAgLy8vIHNob3VsZCBiZSBzaWduIGV4dGVuZGVkIGZyb20gaTEuCisgIC8vLworICAvLy8gU29tZSBjcHVzIGFsc28gdHJlYXQgZmxvYXRpbmcgcG9pbnQgdHlwZXMgdGhlIHNhbWUgd2F5IGFzIHRoZXkgdHJlYXQKKyAgLy8vIHZlY3RvcnMgaW5zdGVhZCBvZiB0aGUgd2F5IHRoZXkgdHJlYXQgc2NhbGFycy4KKyAgQm9vbGVhbkNvbnRlbnQgZ2V0Qm9vbGVhbkNvbnRlbnRzKGJvb2wgaXNWZWMsIGJvb2wgaXNGbG9hdCkgY29uc3QgeworICAgIGlmIChpc1ZlYykKKyAgICAgIHJldHVybiBCb29sZWFuVmVjdG9yQ29udGVudHM7CisgICAgcmV0dXJuIGlzRmxvYXQgPyBCb29sZWFuRmxvYXRDb250ZW50cyA6IEJvb2xlYW5Db250ZW50czsKKyAgfQorCisgIEJvb2xlYW5Db250ZW50IGdldEJvb2xlYW5Db250ZW50cyhFVlQgVHlwZSkgY29uc3QgeworICAgIHJldHVybiBnZXRCb29sZWFuQ29udGVudHMoVHlwZS5pc1ZlY3RvcigpLCBUeXBlLmlzRmxvYXRpbmdQb2ludCgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGFyZ2V0IHNjaGVkdWxpbmcgcHJlZmVyZW5jZS4KKyAgU2NoZWQ6OlByZWZlcmVuY2UgZ2V0U2NoZWR1bGluZ1ByZWZlcmVuY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIFNjaGVkUHJlZmVyZW5jZUluZm87CisgIH0KKworICAvLy8gU29tZSBzY2hlZHVsZXIsIGUuZy4gaHlicmlkLCBjYW4gc3dpdGNoIHRvIGRpZmZlcmVudCBzY2hlZHVsaW5nIGhldXJpc3RpY3MKKyAgLy8vIGZvciBkaWZmZXJlbnQgbm9kZXMuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcHJlZmVyZW5jZSAob3Igbm9uZSkgZm9yCisgIC8vLyB0aGUgZ2l2ZW4gbm9kZS4KKyAgdmlydHVhbCBTY2hlZDo6UHJlZmVyZW5jZSBnZXRTY2hlZHVsaW5nUHJlZmVyZW5jZShTRE5vZGUgKikgY29uc3QgeworICAgIHJldHVybiBTY2hlZDo6Tm9uZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHJlZ2lzdGVyIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUKKyAgLy8vIHR5cGUuCisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqZ2V0UmVnQ2xhc3NGb3IoTVZUIFZUKSBjb25zdCB7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBSZWdDbGFzc0ZvclZUW1ZULlNpbXBsZVR5XTsKKyAgICBhc3NlcnQoUkMgJiYgIlRoaXMgdmFsdWUgdHlwZSBpcyBub3QgbmF0aXZlbHkgc3VwcG9ydGVkISIpOworICAgIHJldHVybiBSQzsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlICdyZXByZXNlbnRhdGl2ZScgcmVnaXN0ZXIgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUKKyAgLy8vIHR5cGUuCisgIC8vLworICAvLy8gVGhlICdyZXByZXNlbnRhdGl2ZScgcmVnaXN0ZXIgY2xhc3MgaXMgdGhlIGxhcmdlc3QgbGVnYWwgc3VwZXItcmVnCisgIC8vLyByZWdpc3RlciBjbGFzcyBmb3IgdGhlIHJlZ2lzdGVyIGNsYXNzIG9mIHRoZSB2YWx1ZSB0eXBlLiAgRm9yIGV4YW1wbGUsIG9uCisgIC8vLyBpMzg2IHRoZSByZXAgcmVnaXN0ZXIgY2xhc3MgZm9yIGk4LCBpMTYsIGFuZCBpMzIgYXJlIEdSMzI7IHdoaWxlIHRoZSByZXAKKyAgLy8vIHJlZ2lzdGVyIGNsYXNzIGlzIEdSNjQgb24geDg2XzY0LgorICB2aXJ0dWFsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKmdldFJlcFJlZ0NsYXNzRm9yKE1WVCBWVCkgY29uc3QgeworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gUmVwUmVnQ2xhc3NGb3JWVFtWVC5TaW1wbGVUeV07CisgICAgcmV0dXJuIFJDOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgY29zdCBvZiB0aGUgJ3JlcHJlc2VudGF0aXZlJyByZWdpc3RlciBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gdmFsdWUgdHlwZS4KKyAgdmlydHVhbCB1aW50OF90IGdldFJlcFJlZ0NsYXNzQ29zdEZvcihNVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVwUmVnQ2xhc3NDb3N0Rm9yVlRbVlQuU2ltcGxlVHldOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgaGFzIG5hdGl2ZSBzdXBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlIHR5cGUuCisgIC8vLyBUaGlzIG1lYW5zIHRoYXQgaXQgaGFzIGEgcmVnaXN0ZXIgdGhhdCBkaXJlY3RseSBob2xkcyBpdCB3aXRob3V0CisgIC8vLyBwcm9tb3Rpb25zIG9yIGV4cGFuc2lvbnMuCisgIGJvb2wgaXNUeXBlTGVnYWwoRVZUIFZUKSBjb25zdCB7CisgICAgYXNzZXJ0KCFWVC5pc1NpbXBsZSgpIHx8CisgICAgICAgICAgICh1bnNpZ25lZClWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5IDwgYXJyYXlfbGVuZ3Rob2YoUmVnQ2xhc3NGb3JWVCkpOworICAgIHJldHVybiBWVC5pc1NpbXBsZSgpICYmIFJlZ0NsYXNzRm9yVlRbVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeV0gIT0gbnVsbHB0cjsKKyAgfQorCisgIGNsYXNzIFZhbHVlVHlwZUFjdGlvbkltcGwgeworICAgIC8vLyBWYWx1ZVR5cGVBY3Rpb25zIC0gRm9yIGVhY2ggdmFsdWUgdHlwZSwga2VlcCBhIExlZ2FsaXplVHlwZUFjdGlvbiBlbnVtCisgICAgLy8vIHRoYXQgaW5kaWNhdGVzIGhvdyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gc2hvdWxkIGRlYWwgd2l0aCB0aGUgdHlwZS4KKyAgICBMZWdhbGl6ZVR5cGVBY3Rpb24gVmFsdWVUeXBlQWN0aW9uc1tNVlQ6OkxBU1RfVkFMVUVUWVBFXTsKKworICBwdWJsaWM6CisgICAgVmFsdWVUeXBlQWN0aW9uSW1wbCgpIHsKKyAgICAgIHN0ZDo6ZmlsbChzdGQ6OmJlZ2luKFZhbHVlVHlwZUFjdGlvbnMpLCBzdGQ6OmVuZChWYWx1ZVR5cGVBY3Rpb25zKSwKKyAgICAgICAgICAgICAgICBUeXBlTGVnYWwpOworICAgIH0KKworICAgIExlZ2FsaXplVHlwZUFjdGlvbiBnZXRUeXBlQWN0aW9uKE1WVCBWVCkgY29uc3QgeworICAgICAgcmV0dXJuIFZhbHVlVHlwZUFjdGlvbnNbVlQuU2ltcGxlVHldOworICAgIH0KKworICAgIHZvaWQgc2V0VHlwZUFjdGlvbihNVlQgVlQsIExlZ2FsaXplVHlwZUFjdGlvbiBBY3Rpb24pIHsKKyAgICAgIFZhbHVlVHlwZUFjdGlvbnNbVlQuU2ltcGxlVHldID0gQWN0aW9uOworICAgIH0KKyAgfTsKKworICBjb25zdCBWYWx1ZVR5cGVBY3Rpb25JbXBsICZnZXRWYWx1ZVR5cGVBY3Rpb25zKCkgY29uc3QgeworICAgIHJldHVybiBWYWx1ZVR5cGVBY3Rpb25zOworICB9CisKKyAgLy8vIFJldHVybiBob3cgd2Ugc2hvdWxkIGxlZ2FsaXplIHZhbHVlcyBvZiB0aGlzIHR5cGUsIGVpdGhlciBpdCBpcyBhbHJlYWR5CisgIC8vLyBsZWdhbCAocmV0dXJuICdMZWdhbCcpIG9yIHdlIG5lZWQgdG8gcHJvbW90ZSBpdCB0byBhIGxhcmdlciB0eXBlIChyZXR1cm4KKyAgLy8vICdQcm9tb3RlJyksIG9yIHdlIG5lZWQgdG8gZXhwYW5kIGl0IGludG8gbXVsdGlwbGUgcmVnaXN0ZXJzIG9mIHNtYWxsZXIKKyAgLy8vIGludGVnZXIgdHlwZSAocmV0dXJuICdFeHBhbmQnKS4gICdDdXN0b20nIGlzIG5vdCBhbiBvcHRpb24uCisgIExlZ2FsaXplVHlwZUFjdGlvbiBnZXRUeXBlQWN0aW9uKExMVk1Db250ZXh0ICZDb250ZXh0LCBFVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHlwZUNvbnZlcnNpb24oQ29udGV4dCwgVlQpLmZpcnN0OworICB9CisgIExlZ2FsaXplVHlwZUFjdGlvbiBnZXRUeXBlQWN0aW9uKE1WVCBWVCkgY29uc3QgeworICAgIHJldHVybiBWYWx1ZVR5cGVBY3Rpb25zLmdldFR5cGVBY3Rpb24oVlQpOworICB9CisKKyAgLy8vIEZvciB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhlIHRhcmdldCwgdGhpcyBpcyBhbiBpZGVudGl0eSBmdW5jdGlvbi4gIEZvcgorICAvLy8gdHlwZXMgdGhhdCBtdXN0IGJlIHByb21vdGVkIHRvIGxhcmdlciB0eXBlcywgdGhpcyByZXR1cm5zIHRoZSBsYXJnZXIgdHlwZQorICAvLy8gdG8gcHJvbW90ZSB0by4gIEZvciBpbnRlZ2VyIHR5cGVzIHRoYXQgYXJlIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IGludGVnZXIKKyAgLy8vIHJlZ2lzdGVyLCB0aGlzIGNvbnRhaW5zIG9uZSBzdGVwIGluIHRoZSBleHBhbnNpb24gdG8gZ2V0IHRvIHRoZSBzbWFsbGVyCisgIC8vLyByZWdpc3Rlci4gRm9yIGlsbGVnYWwgZmxvYXRpbmcgcG9pbnQgdHlwZXMsIHRoaXMgcmV0dXJucyB0aGUgaW50ZWdlciB0eXBlCisgIC8vLyB0byB0cmFuc2Zvcm0gdG8uCisgIEVWVCBnZXRUeXBlVG9UcmFuc2Zvcm1UbyhMTFZNQ29udGV4dCAmQ29udGV4dCwgRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGVDb252ZXJzaW9uKENvbnRleHQsIFZUKS5zZWNvbmQ7CisgIH0KKworICAvLy8gRm9yIHR5cGVzIHN1cHBvcnRlZCBieSB0aGUgdGFyZ2V0LCB0aGlzIGlzIGFuIGlkZW50aXR5IGZ1bmN0aW9uLiAgRm9yCisgIC8vLyB0eXBlcyB0aGF0IG11c3QgYmUgZXhwYW5kZWQgKGkuZS4gaW50ZWdlciB0eXBlcyB0aGF0IGFyZSBsYXJnZXIgdGhhbiB0aGUKKyAgLy8vIGxhcmdlc3QgaW50ZWdlciByZWdpc3RlciBvciBpbGxlZ2FsIGZsb2F0aW5nIHBvaW50IHR5cGVzKSwgdGhpcyByZXR1cm5zCisgIC8vLyB0aGUgbGFyZ2VzdCBsZWdhbCB0eXBlIGl0IHdpbGwgYmUgZXhwYW5kZWQgdG8uCisgIEVWVCBnZXRUeXBlVG9FeHBhbmRUbyhMTFZNQ29udGV4dCAmQ29udGV4dCwgRVZUIFZUKSBjb25zdCB7CisgICAgYXNzZXJ0KCFWVC5pc1ZlY3RvcigpKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoIChnZXRUeXBlQWN0aW9uKENvbnRleHQsIFZUKSkgeworICAgICAgY2FzZSBUeXBlTGVnYWw6CisgICAgICAgIHJldHVybiBWVDsKKyAgICAgIGNhc2UgVHlwZUV4cGFuZEludGVnZXI6CisgICAgICAgIFZUID0gZ2V0VHlwZVRvVHJhbnNmb3JtVG8oQ29udGV4dCwgVlQpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlR5cGUgaXMgbm90IGxlZ2FsIG5vciBpcyBpdCB0byBiZSBleHBhbmRlZCEiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLy8gVmVjdG9yIHR5cGVzIGFyZSBicm9rZW4gZG93biBpbnRvIHNvbWUgbnVtYmVyIG9mIGxlZ2FsIGZpcnN0IGNsYXNzIHR5cGVzLgorICAvLy8gRm9yIGV4YW1wbGUsIEVWVDo6djhmMzIgbWFwcyB0byAyIEVWVDo6djRmMzIgd2l0aCBBbHRpdmVjIG9yIFNTRTEsIG9yIDgKKyAgLy8vIHByb21vdGVkIEVWVDo6ZjY0IHZhbHVlcyB3aXRoIHRoZSBYODYgRlAgc3RhY2suICBTaW1pbGFybHksIEVWVDo6djJpNjQKKyAgLy8vIHR1cm5zIGludG8gNCBFVlQ6OmkzMiB2YWx1ZXMgd2l0aCBib3RoIFBQQyBhbmQgWDg2LgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiByZWdpc3RlcnMgbmVlZGVkLCBhbmQgdGhlIFZUIGZvciBlYWNoCisgIC8vLyByZWdpc3Rlci4gIEl0IGFsc28gcmV0dXJucyB0aGUgVlQgYW5kIHF1YW50aXR5IG9mIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCisgIC8vLyBiZWZvcmUgdGhleSBhcmUgcHJvbW90ZWQvZXhwYW5kZWQuCisgIHVuc2lnbmVkIGdldFZlY3RvclR5cGVCcmVha2Rvd24oTExWTUNvbnRleHQgJkNvbnRleHQsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgJkludGVybWVkaWF0ZVZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1JbnRlcm1lZGlhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WVCAmUmVnaXN0ZXJWVCkgY29uc3Q7CisKKyAgLy8vIENlcnRhaW4gdGFyZ2V0cyBzdWNoIGFzIE1JUFMgcmVxdWlyZSB0aGF0IHNvbWUgdHlwZXMgc3VjaCBhcyB2ZWN0b3JzIGFyZQorICAvLy8gYWx3YXlzIGJyb2tlbiBkb3duIGludG8gc2NhbGFycyBpbiBzb21lIGNvbnRleHRzLiBUaGlzIG9jY3VycyBldmVuIGlmIHRoZQorICAvLy8gdmVjdG9yIHR5cGUgaXMgbGVnYWwuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0VmVjdG9yVHlwZUJyZWFrZG93bkZvckNhbGxpbmdDb252KAorICAgICAgTExWTUNvbnRleHQgJkNvbnRleHQsIEVWVCBWVCwgRVZUICZJbnRlcm1lZGlhdGVWVCwKKyAgICAgIHVuc2lnbmVkICZOdW1JbnRlcm1lZGlhdGVzLCBNVlQgJlJlZ2lzdGVyVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmVjdG9yVHlwZUJyZWFrZG93bihDb250ZXh0LCBWVCwgSW50ZXJtZWRpYXRlVlQsIE51bUludGVybWVkaWF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJWVCk7CisgIH0KKworICBzdHJ1Y3QgSW50cmluc2ljSW5mbyB7CisgICAgdW5zaWduZWQgICAgIG9wYyA9IDA7ICAgICAgICAgIC8vIHRhcmdldCBvcGNvZGUKKyAgICBFVlQgICAgICAgICAgbWVtVlQ7ICAgICAgICAgICAgLy8gbWVtb3J5IFZUCisKKyAgICAvLyB2YWx1ZSByZXByZXNlbnRpbmcgbWVtb3J5IGxvY2F0aW9uCisgICAgUG9pbnRlclVuaW9uPGNvbnN0IFZhbHVlICosIGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlICo+IHB0clZhbDsKKworICAgIGludCAgICAgICAgICBvZmZzZXQgPSAwOyAgICAgICAvLyBvZmZzZXQgb2ZmIG9mIHB0clZhbAorICAgIHVuc2lnbmVkICAgICBzaXplID0gMDsgICAgICAgICAvLyB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0YWtlbiBmcm9tIG1lbVZUIGlmIHplcm8pCisgICAgdW5zaWduZWQgICAgIGFsaWduID0gMTsgICAgICAgIC8vIGFsaWdubWVudAorCisgICAgTWFjaGluZU1lbU9wZXJhbmQ6OkZsYWdzIGZsYWdzID0gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PTm9uZTsKKyAgICBJbnRyaW5zaWNJbmZvKCkgPSBkZWZhdWx0OworICB9OworCisgIC8vLyBHaXZlbiBhbiBpbnRyaW5zaWMsIGNoZWNrcyBpZiBvbiB0aGUgdGFyZ2V0IHRoZSBpbnRyaW5zaWMgd2lsbCBuZWVkIHRvIG1hcAorICAvLy8gdG8gYSBNZW1JbnRyaW5zaWNOb2RlICh0b3VjaGVzIG1lbW9yeSkuIElmIHRoaXMgaXMgdGhlIGNhc2UsIGl0IHJldHVybnMKKyAgLy8vIHRydWUgYW5kIHN0b3JlIHRoZSBpbnRyaW5zaWMgaW5mb3JtYXRpb24gaW50byB0aGUgSW50cmluc2ljSW5mbyB0aGF0IHdhcworICAvLy8gcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4KKyAgdmlydHVhbCBib29sIGdldFRndE1lbUludHJpbnNpYyhJbnRyaW5zaWNJbmZvICYsIGNvbnN0IENhbGxJbnN0ICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgLypJbnRyaW5zaWMqLykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCBjYW4gaW5zdHJ1Y3Rpb24gc2VsZWN0IHRoZSBzcGVjaWZpZWQgRlAKKyAgLy8vIGltbWVkaWF0ZSBuYXRpdmVseS4gSWYgZmFsc2UsIHRoZSBsZWdhbGl6ZXIgd2lsbCBtYXRlcmlhbGl6ZSB0aGUgRlAKKyAgLy8vIGltbWVkaWF0ZSBhcyBhIGxvYWQgZnJvbSBhIGNvbnN0YW50IHBvb2wuCisgIHZpcnR1YWwgYm9vbCBpc0ZQSW1tTGVnYWwoY29uc3QgQVBGbG9hdCAmLypJbW0qLywgRVZUIC8qVlQqLykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBUYXJnZXRzIGNhbiB1c2UgdGhpcyB0byBpbmRpY2F0ZSB0aGF0IHRoZXkgb25seSBzdXBwb3J0ICpzb21lKgorICAvLy8gVkVDVE9SX1NIVUZGTEUgb3BlcmF0aW9ucywgdGhvc2Ugd2l0aCBzcGVjaWZpYyBtYXNrcy4gIEJ5IGRlZmF1bHQsIGlmIGEKKyAgLy8vIHRhcmdldCBzdXBwb3J0cyB0aGUgVkVDVE9SX1NIVUZGTEUgbm9kZSwgYWxsIG1hc2sgdmFsdWVzIGFyZSBhc3N1bWVkIHRvIGJlCisgIC8vLyBsZWdhbC4KKyAgdmlydHVhbCBib29sIGlzU2h1ZmZsZU1hc2tMZWdhbChBcnJheVJlZjxpbnQ+IC8qTWFzayovLCBFVlQgLypWVCovKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBvcGVyYXRpb24gY2FuIHRyYXAgZm9yIHRoZSB2YWx1ZSB0eXBlLgorICAvLy8KKyAgLy8vIFZUIG11c3QgYmUgYSBsZWdhbCB0eXBlLiBCeSBkZWZhdWx0LCB3ZSBvcHRpbWlzdGljYWxseSBhc3N1bWUgbW9zdAorICAvLy8gb3BlcmF0aW9ucyBkb24ndCB0cmFwIGV4Y2VwdCBmb3IgaW50ZWdlciBkaXZpZGUgYW5kIHJlbWFpbmRlci4KKyAgdmlydHVhbCBib29sIGNhbk9wVHJhcCh1bnNpZ25lZCBPcCwgRVZUIFZUKSBjb25zdDsKKworICAvLy8gU2ltaWxhciB0byBpc1NodWZmbGVNYXNrTGVnYWwuIFRoaXMgaXMgdXNlZCBieSBUYXJnZXRzIGNhbiB1c2UgdGhpcyB0bworICAvLy8gaW5kaWNhdGUgaWYgdGhlcmUgaXMgYSBzdWl0YWJsZSBWRUNUT1JfU0hVRkZMRSB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcGxhY2UKKyAgLy8vIGEgVkFORCB3aXRoIGEgY29uc3RhbnQgcG9vbCBlbnRyeS4KKyAgdmlydHVhbCBib29sIGlzVmVjdG9yQ2xlYXJNYXNrTGVnYWwoY29uc3QgU21hbGxWZWN0b3JJbXBsPGludD4gJi8qTWFzayovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgLypWVCovKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiBob3cgdGhpcyBvcGVyYXRpb24gc2hvdWxkIGJlIHRyZWF0ZWQ6IGVpdGhlciBpdCBpcyBsZWdhbCwgbmVlZHMgdG8KKyAgLy8vIGJlIHByb21vdGVkIHRvIGEgbGFyZ2VyIHNpemUsIG5lZWRzIHRvIGJlIGV4cGFuZGVkIHRvIHNvbWUgb3RoZXIgY29kZQorICAvLy8gc2VxdWVuY2UsIG9yIHRoZSB0YXJnZXQgaGFzIGEgY3VzdG9tIGV4cGFuZGVyIGZvciBpdC4KKyAgTGVnYWxpemVBY3Rpb24gZ2V0T3BlcmF0aW9uQWN0aW9uKHVuc2lnbmVkIE9wLCBFVlQgVlQpIGNvbnN0IHsKKyAgICBpZiAoVlQuaXNFeHRlbmRlZCgpKSByZXR1cm4gRXhwYW5kOworICAgIC8vIElmIGEgdGFyZ2V0LXNwZWNpZmljIFNETm9kZSByZXF1aXJlcyBsZWdhbGl6YXRpb24sIHJlcXVpcmUgdGhlIHRhcmdldAorICAgIC8vIHRvIHByb3ZpZGUgY3VzdG9tIGxlZ2FsaXphdGlvbiBmb3IgaXQuCisgICAgaWYgKE9wID49IGFycmF5X2xlbmd0aG9mKE9wQWN0aW9uc1swXSkpIHJldHVybiBDdXN0b207CisgICAgcmV0dXJuIE9wQWN0aW9uc1sodW5zaWduZWQpVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeV1bT3BdOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIGlzIGxlZ2FsIG9uIHRoaXMgdGFyZ2V0IG9yIGNhbiBiZQorICAvLy8gbWFkZSBsZWdhbCB3aXRoIGN1c3RvbSBsb3dlcmluZy4gVGhpcyBpcyB1c2VkIHRvIGhlbHAgZ3VpZGUgaGlnaC1sZXZlbAorICAvLy8gbG93ZXJpbmcgZGVjaXNpb25zLgorICBib29sIGlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbSh1bnNpZ25lZCBPcCwgRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIChWVCA9PSBNVlQ6Ok90aGVyIHx8IGlzVHlwZUxlZ2FsKFZUKSkgJiYKKyAgICAgIChnZXRPcGVyYXRpb25BY3Rpb24oT3AsIFZUKSA9PSBMZWdhbCB8fAorICAgICAgIGdldE9wZXJhdGlvbkFjdGlvbihPcCwgVlQpID09IEN1c3RvbSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gaXMgbGVnYWwgb24gdGhpcyB0YXJnZXQgb3IgY2FuIGJlCisgIC8vLyBtYWRlIGxlZ2FsIHVzaW5nIHByb21vdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGhlbHAgZ3VpZGUgaGlnaC1sZXZlbCBsb3dlcmluZworICAvLy8gZGVjaXNpb25zLgorICBib29sIGlzT3BlcmF0aW9uTGVnYWxPclByb21vdGUodW5zaWduZWQgT3AsIEVWVCBWVCkgY29uc3QgeworICAgIHJldHVybiAoVlQgPT0gTVZUOjpPdGhlciB8fCBpc1R5cGVMZWdhbChWVCkpICYmCisgICAgICAoZ2V0T3BlcmF0aW9uQWN0aW9uKE9wLCBWVCkgPT0gTGVnYWwgfHwKKyAgICAgICBnZXRPcGVyYXRpb25BY3Rpb24oT3AsIFZUKSA9PSBQcm9tb3RlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiBpcyBsZWdhbCBvbiB0aGlzIHRhcmdldCBvciBjYW4gYmUKKyAgLy8vIG1hZGUgbGVnYWwgd2l0aCBjdXN0b20gbG93ZXJpbmcgb3IgdXNpbmcgcHJvbW90aW9uLiBUaGlzIGlzIHVzZWQgdG8gaGVscAorICAvLy8gZ3VpZGUgaGlnaC1sZXZlbCBsb3dlcmluZyBkZWNpc2lvbnMuCisgIGJvb2wgaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tT3JQcm9tb3RlKHVuc2lnbmVkIE9wLCBFVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gKFZUID09IE1WVDo6T3RoZXIgfHwgaXNUeXBlTGVnYWwoVlQpKSAmJgorICAgICAgKGdldE9wZXJhdGlvbkFjdGlvbihPcCwgVlQpID09IExlZ2FsIHx8CisgICAgICAgZ2V0T3BlcmF0aW9uQWN0aW9uKE9wLCBWVCkgPT0gQ3VzdG9tIHx8CisgICAgICAgZ2V0T3BlcmF0aW9uQWN0aW9uKE9wLCBWVCkgPT0gUHJvbW90ZSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhdGlvbiB1c2VzIGN1c3RvbSBsb3dlcmluZywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCisgIC8vLyB0aGUgdHlwZSBpcyBsZWdhbCBvciBub3QuCisgIGJvb2wgaXNPcGVyYXRpb25DdXN0b20odW5zaWduZWQgT3AsIEVWVCBWVCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYXRpb25BY3Rpb24oT3AsIFZUKSA9PSBDdXN0b207CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgbG93ZXJpbmcgdG8gYSBqdW1wIHRhYmxlIGlzIGFsbG93ZWQuCisgIHZpcnR1YWwgYm9vbCBhcmVKVHNBbGxvd2VkKGNvbnN0IEZ1bmN0aW9uICpGbikgY29uc3QgeworICAgIGlmIChGbi0+Z2V0Rm5BdHRyaWJ1dGUoIm5vLWp1bXAtdGFibGVzIikuZ2V0VmFsdWVBc1N0cmluZygpID09ICJ0cnVlIikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBpc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpCUl9KVCwgTVZUOjpPdGhlcikgfHwKKyAgICAgICAgICAgaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKElTRDo6QlJJTkQsIE1WVDo6T3RoZXIpOworICB9CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgdGhlIHJhbmdlIFtMb3csSGlnaF0gZml0cyBpbiBhIG1hY2hpbmUgd29yZC4KKyAgYm9vbCByYW5nZUZpdHNJbldvcmQoY29uc3QgQVBJbnQgJkxvdywgY29uc3QgQVBJbnQgJkhpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMKSBjb25zdCB7CisgICAgLy8gRklYTUU6IFVzaW5nIHRoZSBwb2ludGVyIHR5cGUgZG9lc24ndCBzZWVtIGlkZWFsLgorICAgIHVpbnQ2NF90IEJXID0gREwuZ2V0SW5kZXhTaXplSW5CaXRzKDB1KTsKKyAgICB1aW50NjRfdCBSYW5nZSA9IChIaWdoIC0gTG93KS5nZXRMaW1pdGVkVmFsdWUoVUlOVDY0X01BWCAtIDEpICsgMTsKKyAgICByZXR1cm4gUmFuZ2UgPD0gQlc7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgbG93ZXJpbmcgdG8gYSBqdW1wIHRhYmxlIGlzIHN1aXRhYmxlIGZvciBhIHNldCBvZiBjYXNlCisgIC8vLyBjbHVzdGVycyB3aGljaCBtYXkgY29udGFpbiBccCBOdW1DYXNlcyBjYXNlcywgXHAgUmFuZ2UgcmFuZ2Ugb2YgdmFsdWVzLgorICAvLy8gRklYTUU6IFRoaXMgZnVuY3Rpb24gY2hlY2sgdGhlIG1heGltdW0gdGFibGUgc2l6ZSBhbmQgZGVuc2l0eSwgYnV0IHRoZQorICAvLy8gbWluaW11bSBzaXplIGlzIG5vdCBjaGVja2VkLiBJdCB3b3VsZCBiZSBuaWNlIGlmIHRoZSBtaW5pbXVtIHNpemUgaXMKKyAgLy8vIGFsc28gY29tYmluZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24uIEN1cnJlbnRseSwgdGhlIG1pbmltdW0gc2l6ZSBjaGVjayBpcworICAvLy8gcGVyZm9ybWVkIGluIGZpbmRKdW1wVGFibGUoKSBpbiBTZWxlY3Rpb25EQUdCdWlsZXIgYW5kCisgIC8vLyBnZXRFc3RpbWF0ZWROdW1iZXJPZkNhc2VDbHVzdGVycygpIGluIEJhc2ljVFRJSW1wbC4KKyAgdmlydHVhbCBib29sIGlzU3VpdGFibGVGb3JKdW1wVGFibGUoY29uc3QgU3dpdGNoSW5zdCAqU0ksIHVpbnQ2NF90IE51bUNhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBSYW5nZSkgY29uc3QgeworICAgIGNvbnN0IGJvb2wgT3B0Rm9yU2l6ZSA9IFNJLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCktPm9wdEZvclNpemUoKTsKKyAgICBjb25zdCB1bnNpZ25lZCBNaW5EZW5zaXR5ID0gZ2V0TWluaW11bUp1bXBUYWJsZURlbnNpdHkoT3B0Rm9yU2l6ZSk7CisgICAgY29uc3QgdW5zaWduZWQgTWF4SnVtcFRhYmxlU2l6ZSA9CisgICAgICAgIE9wdEZvclNpemUgfHwgZ2V0TWF4aW11bUp1bXBUYWJsZVNpemUoKSA9PSAwCisgICAgICAgICAgICA/IFVJTlRfTUFYCisgICAgICAgICAgICA6IGdldE1heGltdW1KdW1wVGFibGVTaXplKCk7CisgICAgLy8gQ2hlY2sgd2hldGhlciBhIHJhbmdlIG9mIGNsdXN0ZXJzIGlzIGRlbnNlIGVub3VnaCBmb3IgYSBqdW1wIHRhYmxlLgorICAgIGlmIChSYW5nZSA8PSBNYXhKdW1wVGFibGVTaXplICYmCisgICAgICAgIChOdW1DYXNlcyAqIDEwMCA+PSBSYW5nZSAqIE1pbkRlbnNpdHkpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGxvd2VyaW5nIHRvIGEgYml0IHRlc3QgaXMgc3VpdGFibGUgZm9yIGEgc2V0IG9mIGNhc2UKKyAgLy8vIGNsdXN0ZXJzIHdoaWNoIGNvbnRhaW5zIFxwIE51bURlc3RzIHVuaXF1ZSBkZXN0aW5hdGlvbnMsIFxwIExvdyBhbmQKKyAgLy8vIFxwIEhpZ2ggYXMgaXRzIGxvd2VzdCBhbmQgaGlnaGVzdCBjYXNlIHZhbHVlcywgYW5kIGV4cGVjdHMgXHAgTnVtQ21wcworICAvLy8gY2FzZSB2YWx1ZSBjb21wYXJpc29ucy4gQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBkZXN0aW5hdGlvbnMsIGNvbXBhcmlzb24KKyAgLy8vIG1ldHJpYywgYW5kIHJhbmdlIGFyZSBhbGwgc3VpdGFibGUuCisgIGJvb2wgaXNTdWl0YWJsZUZvckJpdFRlc3RzKHVuc2lnbmVkIE51bURlc3RzLCB1bnNpZ25lZCBOdW1DbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEludCAmTG93LCBjb25zdCBBUEludCAmSGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpIGNvbnN0IHsKKyAgICAvLyBGSVhNRTogSSBkb24ndCB0aGluayBOdW1DbXBzIGlzIHRoZSBjb3JyZWN0IG1ldHJpYzogYSBzaW5nbGUgY2FzZSBhbmQgYQorICAgIC8vIHJhbmdlIG9mIGNhc2VzIGJvdGggcmVxdWlyZSBvbmx5IG9uZSBicmFuY2ggdG8gbG93ZXIuIEp1c3QgbG9va2luZyBhdCB0aGUKKyAgICAvLyBudW1iZXIgb2YgY2x1c3RlcnMgYW5kIGRlc3RpbmF0aW9ucyBzaG91bGQgYmUgZW5vdWdoIHRvIGRlY2lkZSB3aGV0aGVyIHRvCisgICAgLy8gYnVpbGQgYml0IHRlc3RzLgorCisgICAgLy8gVG8gbG93ZXIgYSByYW5nZSB3aXRoIGJpdCB0ZXN0cywgdGhlIHJhbmdlIG11c3QgZml0IHRoZSBiaXR3aWR0aCBvZiBhCisgICAgLy8gbWFjaGluZSB3b3JkLgorICAgIGlmICghcmFuZ2VGaXRzSW5Xb3JkKExvdywgSGlnaCwgREwpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRGVjaWRlIHdoZXRoZXIgaXQncyBwcm9maXRhYmxlIHRvIGxvd2VyIHRoaXMgcmFuZ2Ugd2l0aCBiaXQgdGVzdHMuIEVhY2gKKyAgICAvLyBkZXN0aW5hdGlvbiByZXF1aXJlcyBhIGJpdCB0ZXN0IGFuZCBicmFuY2gsIGFuZCB0aGVyZSBpcyBhbiBvdmVyYWxsIHJhbmdlCisgICAgLy8gY2hlY2sgYnJhbmNoLiBGb3IgYSBzbWFsbCBudW1iZXIgb2YgY2x1c3RlcnMsIHNlcGFyYXRlIGNvbXBhcmlzb25zIG1pZ2h0CisgICAgLy8gYmUgY2hlYXBlciwgYW5kIGZvciBtYW55IGRlc3RpbmF0aW9ucywgc3BsaXR0aW5nIHRoZSByYW5nZSBtaWdodCBiZQorICAgIC8vIGJldHRlci4KKyAgICByZXR1cm4gKE51bURlc3RzID09IDEgJiYgTnVtQ21wcyA+PSAzKSB8fCAoTnVtRGVzdHMgPT0gMiAmJiBOdW1DbXBzID49IDUpIHx8CisgICAgICAgICAgIChOdW1EZXN0cyA9PSAzICYmIE51bUNtcHMgPj0gNik7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gaXMgaWxsZWdhbCBvbiB0aGlzIHRhcmdldCBvcgorICAvLy8gdW5saWtlbHkgdG8gYmUgbWFkZSBsZWdhbCB3aXRoIGN1c3RvbSBsb3dlcmluZy4gVGhpcyBpcyB1c2VkIHRvIGhlbHAgZ3VpZGUKKyAgLy8vIGhpZ2gtbGV2ZWwgbG93ZXJpbmcgZGVjaXNpb25zLgorICBib29sIGlzT3BlcmF0aW9uRXhwYW5kKHVuc2lnbmVkIE9wLCBFVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gKCFpc1R5cGVMZWdhbChWVCkgfHwgZ2V0T3BlcmF0aW9uQWN0aW9uKE9wLCBWVCkgPT0gRXhwYW5kKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiBpcyBsZWdhbCBvbiB0aGlzIHRhcmdldC4KKyAgYm9vbCBpc09wZXJhdGlvbkxlZ2FsKHVuc2lnbmVkIE9wLCBFVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gKFZUID09IE1WVDo6T3RoZXIgfHwgaXNUeXBlTGVnYWwoVlQpKSAmJgorICAgICAgICAgICBnZXRPcGVyYXRpb25BY3Rpb24oT3AsIFZUKSA9PSBMZWdhbDsKKyAgfQorCisgIC8vLyBSZXR1cm4gaG93IHRoaXMgbG9hZCB3aXRoIGV4dGVuc2lvbiBzaG91bGQgYmUgdHJlYXRlZDogZWl0aGVyIGl0IGlzIGxlZ2FsLAorICAvLy8gbmVlZHMgdG8gYmUgcHJvbW90ZWQgdG8gYSBsYXJnZXIgc2l6ZSwgbmVlZHMgdG8gYmUgZXhwYW5kZWQgdG8gc29tZSBvdGhlcgorICAvLy8gY29kZSBzZXF1ZW5jZSwgb3IgdGhlIHRhcmdldCBoYXMgYSBjdXN0b20gZXhwYW5kZXIgZm9yIGl0LgorICBMZWdhbGl6ZUFjdGlvbiBnZXRMb2FkRXh0QWN0aW9uKHVuc2lnbmVkIEV4dFR5cGUsIEVWVCBWYWxWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTWVtVlQpIGNvbnN0IHsKKyAgICBpZiAoVmFsVlQuaXNFeHRlbmRlZCgpIHx8IE1lbVZULmlzRXh0ZW5kZWQoKSkgcmV0dXJuIEV4cGFuZDsKKyAgICB1bnNpZ25lZCBWYWxJID0gKHVuc2lnbmVkKSBWYWxWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5OworICAgIHVuc2lnbmVkIE1lbUkgPSAodW5zaWduZWQpIE1lbVZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHk7CisgICAgYXNzZXJ0KEV4dFR5cGUgPCBJU0Q6OkxBU1RfTE9BREVYVF9UWVBFICYmIFZhbEkgPCBNVlQ6OkxBU1RfVkFMVUVUWVBFICYmCisgICAgICAgICAgIE1lbUkgPCBNVlQ6OkxBU1RfVkFMVUVUWVBFICYmICJUYWJsZSBpc24ndCBiaWcgZW5vdWdoISIpOworICAgIHVuc2lnbmVkIFNoaWZ0ID0gNCAqIEV4dFR5cGU7CisgICAgcmV0dXJuIChMZWdhbGl6ZUFjdGlvbikoKExvYWRFeHRBY3Rpb25zW1ZhbEldW01lbUldID4+IFNoaWZ0KSAmIDB4Zik7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBsb2FkIHdpdGggZXh0ZW5zaW9uIGlzIGxlZ2FsIG9uIHRoaXMgdGFyZ2V0LgorICBib29sIGlzTG9hZEV4dExlZ2FsKHVuc2lnbmVkIEV4dFR5cGUsIEVWVCBWYWxWVCwgRVZUIE1lbVZUKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExvYWRFeHRBY3Rpb24oRXh0VHlwZSwgVmFsVlQsIE1lbVZUKSA9PSBMZWdhbDsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGxvYWQgd2l0aCBleHRlbnNpb24gaXMgbGVnYWwgb3IgY3VzdG9tCisgIC8vLyBvbiB0aGlzIHRhcmdldC4KKyAgYm9vbCBpc0xvYWRFeHRMZWdhbE9yQ3VzdG9tKHVuc2lnbmVkIEV4dFR5cGUsIEVWVCBWYWxWVCwgRVZUIE1lbVZUKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExvYWRFeHRBY3Rpb24oRXh0VHlwZSwgVmFsVlQsIE1lbVZUKSA9PSBMZWdhbCB8fAorICAgICAgICAgICBnZXRMb2FkRXh0QWN0aW9uKEV4dFR5cGUsIFZhbFZULCBNZW1WVCkgPT0gQ3VzdG9tOworICB9CisKKyAgLy8vIFJldHVybiBob3cgdGhpcyBzdG9yZSB3aXRoIHRydW5jYXRpb24gc2hvdWxkIGJlIHRyZWF0ZWQ6IGVpdGhlciBpdCBpcworICAvLy8gbGVnYWwsIG5lZWRzIHRvIGJlIHByb21vdGVkIHRvIGEgbGFyZ2VyIHNpemUsIG5lZWRzIHRvIGJlIGV4cGFuZGVkIHRvIHNvbWUKKyAgLy8vIG90aGVyIGNvZGUgc2VxdWVuY2UsIG9yIHRoZSB0YXJnZXQgaGFzIGEgY3VzdG9tIGV4cGFuZGVyIGZvciBpdC4KKyAgTGVnYWxpemVBY3Rpb24gZ2V0VHJ1bmNTdG9yZUFjdGlvbihFVlQgVmFsVlQsIEVWVCBNZW1WVCkgY29uc3QgeworICAgIGlmIChWYWxWVC5pc0V4dGVuZGVkKCkgfHwgTWVtVlQuaXNFeHRlbmRlZCgpKSByZXR1cm4gRXhwYW5kOworICAgIHVuc2lnbmVkIFZhbEkgPSAodW5zaWduZWQpIFZhbFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHk7CisgICAgdW5zaWduZWQgTWVtSSA9ICh1bnNpZ25lZCkgTWVtVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeTsKKyAgICBhc3NlcnQoVmFsSSA8IE1WVDo6TEFTVF9WQUxVRVRZUEUgJiYgTWVtSSA8IE1WVDo6TEFTVF9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgIlRhYmxlIGlzbid0IGJpZyBlbm91Z2ghIik7CisgICAgcmV0dXJuIFRydW5jU3RvcmVBY3Rpb25zW1ZhbEldW01lbUldOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgc3RvcmUgd2l0aCB0cnVuY2F0aW9uIGlzIGxlZ2FsIG9uIHRoaXMKKyAgLy8vIHRhcmdldC4KKyAgYm9vbCBpc1RydW5jU3RvcmVMZWdhbChFVlQgVmFsVlQsIEVWVCBNZW1WVCkgY29uc3QgeworICAgIHJldHVybiBpc1R5cGVMZWdhbChWYWxWVCkgJiYgZ2V0VHJ1bmNTdG9yZUFjdGlvbihWYWxWVCwgTWVtVlQpID09IExlZ2FsOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgc3RvcmUgd2l0aCB0cnVuY2F0aW9uIGhhcyBzb2x1dGlvbiBvbiB0aGlzCisgIC8vLyB0YXJnZXQuCisgIGJvb2wgaXNUcnVuY1N0b3JlTGVnYWxPckN1c3RvbShFVlQgVmFsVlQsIEVWVCBNZW1WVCkgY29uc3QgeworICAgIHJldHVybiBpc1R5cGVMZWdhbChWYWxWVCkgJiYKKyAgICAgIChnZXRUcnVuY1N0b3JlQWN0aW9uKFZhbFZULCBNZW1WVCkgPT0gTGVnYWwgfHwKKyAgICAgICBnZXRUcnVuY1N0b3JlQWN0aW9uKFZhbFZULCBNZW1WVCkgPT0gQ3VzdG9tKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gaG93IHRoZSBpbmRleGVkIGxvYWQgc2hvdWxkIGJlIHRyZWF0ZWQ6IGVpdGhlciBpdCBpcyBsZWdhbCwgbmVlZHMKKyAgLy8vIHRvIGJlIHByb21vdGVkIHRvIGEgbGFyZ2VyIHNpemUsIG5lZWRzIHRvIGJlIGV4cGFuZGVkIHRvIHNvbWUgb3RoZXIgY29kZQorICAvLy8gc2VxdWVuY2UsIG9yIHRoZSB0YXJnZXQgaGFzIGEgY3VzdG9tIGV4cGFuZGVyIGZvciBpdC4KKyAgTGVnYWxpemVBY3Rpb24KKyAgZ2V0SW5kZXhlZExvYWRBY3Rpb24odW5zaWduZWQgSWR4TW9kZSwgTVZUIFZUKSBjb25zdCB7CisgICAgYXNzZXJ0KElkeE1vZGUgPCBJU0Q6OkxBU1RfSU5ERVhFRF9NT0RFICYmIFZULmlzVmFsaWQoKSAmJgorICAgICAgICAgICAiVGFibGUgaXNuJ3QgYmlnIGVub3VnaCEiKTsKKyAgICB1bnNpZ25lZCBUeSA9ICh1bnNpZ25lZClWVC5TaW1wbGVUeTsKKyAgICByZXR1cm4gKExlZ2FsaXplQWN0aW9uKSgoSW5kZXhlZE1vZGVBY3Rpb25zW1R5XVtJZHhNb2RlXSAmIDB4ZjApID4+IDQpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXhlZCBsb2FkIGlzIGxlZ2FsIG9uIHRoaXMgdGFyZ2V0LgorICBib29sIGlzSW5kZXhlZExvYWRMZWdhbCh1bnNpZ25lZCBJZHhNb2RlLCBFVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gVlQuaXNTaW1wbGUoKSAmJgorICAgICAgKGdldEluZGV4ZWRMb2FkQWN0aW9uKElkeE1vZGUsIFZULmdldFNpbXBsZVZUKCkpID09IExlZ2FsIHx8CisgICAgICAgZ2V0SW5kZXhlZExvYWRBY3Rpb24oSWR4TW9kZSwgVlQuZ2V0U2ltcGxlVlQoKSkgPT0gQ3VzdG9tKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gaG93IHRoZSBpbmRleGVkIHN0b3JlIHNob3VsZCBiZSB0cmVhdGVkOiBlaXRoZXIgaXQgaXMgbGVnYWwsIG5lZWRzCisgIC8vLyB0byBiZSBwcm9tb3RlZCB0byBhIGxhcmdlciBzaXplLCBuZWVkcyB0byBiZSBleHBhbmRlZCB0byBzb21lIG90aGVyIGNvZGUKKyAgLy8vIHNlcXVlbmNlLCBvciB0aGUgdGFyZ2V0IGhhcyBhIGN1c3RvbSBleHBhbmRlciBmb3IgaXQuCisgIExlZ2FsaXplQWN0aW9uCisgIGdldEluZGV4ZWRTdG9yZUFjdGlvbih1bnNpZ25lZCBJZHhNb2RlLCBNVlQgVlQpIGNvbnN0IHsKKyAgICBhc3NlcnQoSWR4TW9kZSA8IElTRDo6TEFTVF9JTkRFWEVEX01PREUgJiYgVlQuaXNWYWxpZCgpICYmCisgICAgICAgICAgICJUYWJsZSBpc24ndCBiaWcgZW5vdWdoISIpOworICAgIHVuc2lnbmVkIFR5ID0gKHVuc2lnbmVkKVZULlNpbXBsZVR5OworICAgIHJldHVybiAoTGVnYWxpemVBY3Rpb24pKEluZGV4ZWRNb2RlQWN0aW9uc1tUeV1bSWR4TW9kZV0gJiAweDBmKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluZGV4ZWQgbG9hZCBpcyBsZWdhbCBvbiB0aGlzIHRhcmdldC4KKyAgYm9vbCBpc0luZGV4ZWRTdG9yZUxlZ2FsKHVuc2lnbmVkIElkeE1vZGUsIEVWVCBWVCkgY29uc3QgeworICAgIHJldHVybiBWVC5pc1NpbXBsZSgpICYmCisgICAgICAoZ2V0SW5kZXhlZFN0b3JlQWN0aW9uKElkeE1vZGUsIFZULmdldFNpbXBsZVZUKCkpID09IExlZ2FsIHx8CisgICAgICAgZ2V0SW5kZXhlZFN0b3JlQWN0aW9uKElkeE1vZGUsIFZULmdldFNpbXBsZVZUKCkpID09IEN1c3RvbSk7CisgIH0KKworICAvLy8gUmV0dXJuIGhvdyB0aGUgY29uZGl0aW9uIGNvZGUgc2hvdWxkIGJlIHRyZWF0ZWQ6IGVpdGhlciBpdCBpcyBsZWdhbCwgbmVlZHMKKyAgLy8vIHRvIGJlIGV4cGFuZGVkIHRvIHNvbWUgb3RoZXIgY29kZSBzZXF1ZW5jZSwgb3IgdGhlIHRhcmdldCBoYXMgYSBjdXN0b20KKyAgLy8vIGV4cGFuZGVyIGZvciBpdC4KKyAgTGVnYWxpemVBY3Rpb24KKyAgZ2V0Q29uZENvZGVBY3Rpb24oSVNEOjpDb25kQ29kZSBDQywgTVZUIFZUKSBjb25zdCB7CisgICAgYXNzZXJ0KCh1bnNpZ25lZClDQyA8IGFycmF5X2xlbmd0aG9mKENvbmRDb2RlQWN0aW9ucykgJiYKKyAgICAgICAgICAgKCh1bnNpZ25lZClWVC5TaW1wbGVUeSA+PiAzKSA8IGFycmF5X2xlbmd0aG9mKENvbmRDb2RlQWN0aW9uc1swXSkgJiYKKyAgICAgICAgICAgIlRhYmxlIGlzbid0IGJpZyBlbm91Z2ghIik7CisgICAgLy8gU2VlIHNldENvbmRDb2RlQWN0aW9uIGZvciBob3cgdGhpcyBpcyBlbmNvZGVkLgorICAgIHVpbnQzMl90IFNoaWZ0ID0gNCAqIChWVC5TaW1wbGVUeSAmIDB4Nyk7CisgICAgdWludDMyX3QgVmFsdWUgPSBDb25kQ29kZUFjdGlvbnNbQ0NdW1ZULlNpbXBsZVR5ID4+IDNdOworICAgIExlZ2FsaXplQWN0aW9uIEFjdGlvbiA9IChMZWdhbGl6ZUFjdGlvbikgKChWYWx1ZSA+PiBTaGlmdCkgJiAweEYpOworICAgIGFzc2VydChBY3Rpb24gIT0gUHJvbW90ZSAmJiAiQ2FuJ3QgcHJvbW90ZSBjb25kaXRpb24gY29kZSEiKTsKKyAgICByZXR1cm4gQWN0aW9uOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY29uZGl0aW9uIGNvZGUgaXMgbGVnYWwgb24gdGhpcyB0YXJnZXQuCisgIGJvb2wgaXNDb25kQ29kZUxlZ2FsKElTRDo6Q29uZENvZGUgQ0MsIE1WVCBWVCkgY29uc3QgeworICAgIHJldHVybiBnZXRDb25kQ29kZUFjdGlvbihDQywgVlQpID09IExlZ2FsOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY29uZGl0aW9uIGNvZGUgaXMgbGVnYWwgb3IgY3VzdG9tIG9uIHRoaXMKKyAgLy8vIHRhcmdldC4KKyAgYm9vbCBpc0NvbmRDb2RlTGVnYWxPckN1c3RvbShJU0Q6OkNvbmRDb2RlIENDLCBNVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Q29uZENvZGVBY3Rpb24oQ0MsIFZUKSA9PSBMZWdhbCB8fAorICAgICAgICAgICBnZXRDb25kQ29kZUFjdGlvbihDQywgVlQpID09IEN1c3RvbTsKKyAgfQorCisgIC8vLyBJZiB0aGUgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbiBpcyB0byBwcm9tb3RlLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZQorICAvLy8gVmFsdWVUeXBlIHRvIHByb21vdGUgdG8uCisgIE1WVCBnZXRUeXBlVG9Qcm9tb3RlVG8odW5zaWduZWQgT3AsIE1WVCBWVCkgY29uc3QgeworICAgIGFzc2VydChnZXRPcGVyYXRpb25BY3Rpb24oT3AsIFZUKSA9PSBQcm9tb3RlICYmCisgICAgICAgICAgICJUaGlzIG9wZXJhdGlvbiBpc24ndCBwcm9tb3RlZCEiKTsKKworICAgIC8vIFNlZSBpZiB0aGlzIGhhcyBhbiBleHBsaWNpdCB0eXBlIHNwZWNpZmllZC4KKyAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8dW5zaWduZWQsIE1WVDo6U2ltcGxlVmFsdWVUeXBlPiwKKyAgICAgICAgICAgICBNVlQ6OlNpbXBsZVZhbHVlVHlwZT46OmNvbnN0X2l0ZXJhdG9yIFBUVEkgPQorICAgICAgUHJvbW90ZVRvVHlwZS5maW5kKHN0ZDo6bWFrZV9wYWlyKE9wLCBWVC5TaW1wbGVUeSkpOworICAgIGlmIChQVFRJICE9IFByb21vdGVUb1R5cGUuZW5kKCkpIHJldHVybiBQVFRJLT5zZWNvbmQ7CisKKyAgICBhc3NlcnQoKFZULmlzSW50ZWdlcigpIHx8IFZULmlzRmxvYXRpbmdQb2ludCgpKSAmJgorICAgICAgICAgICAiQ2Fubm90IGF1dG9wcm9tb3RlIHRoaXMgdHlwZSwgYWRkIGl0IHdpdGggQWRkUHJvbW90ZWRUb1R5cGUuIik7CisKKyAgICBNVlQgTlZUID0gVlQ7CisgICAgZG8geworICAgICAgTlZUID0gKE1WVDo6U2ltcGxlVmFsdWVUeXBlKShOVlQuU2ltcGxlVHkrMSk7CisgICAgICBhc3NlcnQoTlZULmlzSW50ZWdlcigpID09IFZULmlzSW50ZWdlcigpICYmIE5WVCAhPSBNVlQ6OmlzVm9pZCAmJgorICAgICAgICAgICAgICJEaWRuJ3QgZmluZCB0eXBlIHRvIHByb21vdGUgdG8hIik7CisgICAgfSB3aGlsZSAoIWlzVHlwZUxlZ2FsKE5WVCkgfHwKKyAgICAgICAgICAgICAgZ2V0T3BlcmF0aW9uQWN0aW9uKE9wLCBOVlQpID09IFByb21vdGUpOworICAgIHJldHVybiBOVlQ7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBFVlQgY29ycmVzcG9uZGluZyB0byB0aGlzIExMVk0gdHlwZS4gIFRoaXMgaXMgZml4ZWQgYnkgdGhlIExMVk0KKyAgLy8vIG9wZXJhdGlvbnMgZXhjZXB0IGZvciB0aGUgcG9pbnRlciBzaXplLiAgSWYgQWxsb3dVbmtub3duIGlzIHRydWUsIHRoaXMKKyAgLy8vIHdpbGwgcmV0dXJuIE1WVDo6T3RoZXIgZm9yIHR5cGVzIHdpdGggbm8gRVZUIGNvdW50ZXJwYXJ0IChlLmcuIHN0cnVjdHMpLAorICAvLy8gb3RoZXJ3aXNlIGl0IHdpbGwgYXNzZXJ0LgorICBFVlQgZ2V0VmFsdWVUeXBlKGNvbnN0IERhdGFMYXlvdXQgJkRMLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICBib29sIEFsbG93VW5rbm93biA9IGZhbHNlKSBjb25zdCB7CisgICAgLy8gTG93ZXIgc2NhbGFyIHBvaW50ZXJzIHRvIG5hdGl2ZSBwb2ludGVyIHR5cGVzLgorICAgIGlmIChQb2ludGVyVHlwZSAqUFR5ID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KFR5KSkKKyAgICAgIHJldHVybiBnZXRQb2ludGVyVHkoREwsIFBUeS0+Z2V0QWRkcmVzc1NwYWNlKCkpOworCisgICAgaWYgKFR5LT5pc1ZlY3RvclR5KCkpIHsKKyAgICAgIFZlY3RvclR5cGUgKlZUeSA9IGNhc3Q8VmVjdG9yVHlwZT4oVHkpOworICAgICAgVHlwZSAqRWxtID0gVlR5LT5nZXRFbGVtZW50VHlwZSgpOworICAgICAgLy8gTG93ZXIgdmVjdG9ycyBvZiBwb2ludGVycyB0byBuYXRpdmUgcG9pbnRlciB0eXBlcy4KKyAgICAgIGlmIChQb2ludGVyVHlwZSAqUFQgPSBkeW5fY2FzdDxQb2ludGVyVHlwZT4oRWxtKSkgeworICAgICAgICBFVlQgUG9pbnRlclR5KGdldFBvaW50ZXJUeShETCwgUFQtPmdldEFkZHJlc3NTcGFjZSgpKSk7CisgICAgICAgIEVsbSA9IFBvaW50ZXJUeS5nZXRUeXBlRm9yRVZUKFR5LT5nZXRDb250ZXh0KCkpOworICAgICAgfQorCisgICAgICByZXR1cm4gRVZUOjpnZXRWZWN0b3JWVChUeS0+Z2V0Q29udGV4dCgpLCBFVlQ6OmdldEVWVChFbG0sIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgVlR5LT5nZXROdW1FbGVtZW50cygpKTsKKyAgICB9CisgICAgcmV0dXJuIEVWVDo6Z2V0RVZUKFR5LCBBbGxvd1Vua25vd24pOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgTVZUIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBMTFZNIHR5cGUuIFNlZSBnZXRWYWx1ZVR5cGUuCisgIE1WVCBnZXRTaW1wbGVWYWx1ZVR5cGUoY29uc3QgRGF0YUxheW91dCAmREwsIFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dVbmtub3duID0gZmFsc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsdWVUeXBlKERMLCBUeSwgQWxsb3dVbmtub3duKS5nZXRTaW1wbGVWVCgpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQgZm9yIEJ5VmFsIG9yIEluQWxsb2NhIGFnZ3JlZ2F0ZSBmdW5jdGlvbgorICAvLy8gYXJndW1lbnRzIGluIHRoZSBjYWxsZXIgcGFyYW1ldGVyIGFyZWEuICBUaGlzIGlzIHRoZSBhY3R1YWwgYWxpZ25tZW50LCBub3QKKyAgLy8vIGl0cyBsb2dhcml0aG0uCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0QnlWYWxUeXBlQWxpZ25tZW50KFR5cGUgKlR5LCBjb25zdCBEYXRhTGF5b3V0ICZETCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgdHlwZSBvZiByZWdpc3RlcnMgdGhhdCB0aGlzIFZhbHVlVHlwZSB3aWxsIGV2ZW50dWFsbHkgcmVxdWlyZS4KKyAgTVZUIGdldFJlZ2lzdGVyVHlwZShNVlQgVlQpIGNvbnN0IHsKKyAgICBhc3NlcnQoKHVuc2lnbmVkKVZULlNpbXBsZVR5IDwgYXJyYXlfbGVuZ3Rob2YoUmVnaXN0ZXJUeXBlRm9yVlQpKTsKKyAgICByZXR1cm4gUmVnaXN0ZXJUeXBlRm9yVlRbVlQuU2ltcGxlVHldOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgdHlwZSBvZiByZWdpc3RlcnMgdGhhdCB0aGlzIFZhbHVlVHlwZSB3aWxsIGV2ZW50dWFsbHkgcmVxdWlyZS4KKyAgTVZUIGdldFJlZ2lzdGVyVHlwZShMTFZNQ29udGV4dCAmQ29udGV4dCwgRVZUIFZUKSBjb25zdCB7CisgICAgaWYgKFZULmlzU2ltcGxlKCkpIHsKKyAgICAgIGFzc2VydCgodW5zaWduZWQpVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSA8CisgICAgICAgICAgICAgICAgYXJyYXlfbGVuZ3Rob2YoUmVnaXN0ZXJUeXBlRm9yVlQpKTsKKyAgICAgIHJldHVybiBSZWdpc3RlclR5cGVGb3JWVFtWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5XTsKKyAgICB9CisgICAgaWYgKFZULmlzVmVjdG9yKCkpIHsKKyAgICAgIEVWVCBWVDE7CisgICAgICBNVlQgUmVnaXN0ZXJWVDsKKyAgICAgIHVuc2lnbmVkIE51bUludGVybWVkaWF0ZXM7CisgICAgICAodm9pZClnZXRWZWN0b3JUeXBlQnJlYWtkb3duKENvbnRleHQsIFZULCBWVDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUludGVybWVkaWF0ZXMsIFJlZ2lzdGVyVlQpOworICAgICAgcmV0dXJuIFJlZ2lzdGVyVlQ7CisgICAgfQorICAgIGlmIChWVC5pc0ludGVnZXIoKSkgeworICAgICAgcmV0dXJuIGdldFJlZ2lzdGVyVHlwZShDb250ZXh0LCBnZXRUeXBlVG9UcmFuc2Zvcm1UbyhDb250ZXh0LCBWVCkpOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBleHRlbmRlZCB0eXBlISIpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVycyB0aGF0IHRoaXMgVmFsdWVUeXBlIHdpbGwgZXZlbnR1YWxseQorICAvLy8gcmVxdWlyZS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIG9uZSBmb3IgYW55IHR5cGVzIHByb21vdGVkIHRvIGxpdmUgaW4gbGFyZ2VyIHJlZ2lzdGVycywgYnV0IG1heSBiZQorICAvLy8gbW9yZSB0aGFuIG9uZSBmb3IgdHlwZXMgKGxpa2UgaTY0KSB0aGF0IGFyZSBzcGxpdCBpbnRvIHBpZWNlcy4gIEZvciB0eXBlcworICAvLy8gbGlrZSBpMTQwLCB3aGljaCBhcmUgZmlyc3QgcHJvbW90ZWQgdGhlbiBleHBhbmRlZCwgaXQgaXMgdGhlIG51bWJlciBvZgorICAvLy8gcmVnaXN0ZXJzIG5lZWRlZCB0byBob2xkIGFsbCB0aGUgYml0cyBvZiB0aGUgb3JpZ2luYWwgdHlwZS4gIEZvciBhbiBpMTQwCisgIC8vLyBvbiBhIDMyIGJpdCBtYWNoaW5lIHRoaXMgbWVhbnMgNSByZWdpc3RlcnMuCisgIHVuc2lnbmVkIGdldE51bVJlZ2lzdGVycyhMTFZNQ29udGV4dCAmQ29udGV4dCwgRVZUIFZUKSBjb25zdCB7CisgICAgaWYgKFZULmlzU2ltcGxlKCkpIHsKKyAgICAgIGFzc2VydCgodW5zaWduZWQpVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSA8CisgICAgICAgICAgICAgICAgYXJyYXlfbGVuZ3Rob2YoTnVtUmVnaXN0ZXJzRm9yVlQpKTsKKyAgICAgIHJldHVybiBOdW1SZWdpc3RlcnNGb3JWVFtWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5XTsKKyAgICB9CisgICAgaWYgKFZULmlzVmVjdG9yKCkpIHsKKyAgICAgIEVWVCBWVDE7CisgICAgICBNVlQgVlQyOworICAgICAgdW5zaWduZWQgTnVtSW50ZXJtZWRpYXRlczsKKyAgICAgIHJldHVybiBnZXRWZWN0b3JUeXBlQnJlYWtkb3duKENvbnRleHQsIFZULCBWVDEsIE51bUludGVybWVkaWF0ZXMsIFZUMik7CisgICAgfQorICAgIGlmIChWVC5pc0ludGVnZXIoKSkgeworICAgICAgdW5zaWduZWQgQml0V2lkdGggPSBWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgICB1bnNpZ25lZCBSZWdXaWR0aCA9IGdldFJlZ2lzdGVyVHlwZShDb250ZXh0LCBWVCkuZ2V0U2l6ZUluQml0cygpOworICAgICAgcmV0dXJuIChCaXRXaWR0aCArIFJlZ1dpZHRoIC0gMSkgLyBSZWdXaWR0aDsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5zdXBwb3J0ZWQgZXh0ZW5kZWQgdHlwZSEiKTsKKyAgfQorCisgIC8vLyBDZXJ0YWluIGNvbWJpbmF0aW9ucyBvZiBBQklzLCBUYXJnZXRzIGFuZCBmZWF0dXJlcyByZXF1aXJlIHRoYXQgdHlwZXMKKyAgLy8vIGFyZSBsZWdhbCBmb3Igc29tZSBvcGVyYXRpb25zIGFuZCBub3QgZm9yIG90aGVyIG9wZXJhdGlvbnMuCisgIC8vLyBGb3IgTUlQUyBhbGwgdmVjdG9yIHR5cGVzIG11c3QgYmUgcGFzc2VkIHRocm91Z2ggdGhlIGludGVnZXIgcmVnaXN0ZXIgc2V0LgorICB2aXJ0dWFsIE1WVCBnZXRSZWdpc3RlclR5cGVGb3JDYWxsaW5nQ29udihNVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UmVnaXN0ZXJUeXBlKFZUKTsKKyAgfQorCisgIHZpcnR1YWwgTVZUIGdldFJlZ2lzdGVyVHlwZUZvckNhbGxpbmdDb252KExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UmVnaXN0ZXJUeXBlKENvbnRleHQsIFZUKTsKKyAgfQorCisgIC8vLyBDZXJ0YWluIHRhcmdldHMgcmVxdWlyZSB1bnVzdWFsIGJyZWFrZG93bnMgb2YgY2VydGFpbiB0eXBlcy4gRm9yIE1JUFMsCisgIC8vLyB0aGlzIG9jY3VycyB3aGVuIGEgdmVjdG9yIHR5cGUgaXMgdXNlZCwgYXMgdmVjdG9yIGFyZSBwYXNzZWQgdGhyb3VnaCB0aGUKKyAgLy8vIGludGVnZXIgcmVnaXN0ZXIgc2V0LgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldE51bVJlZ2lzdGVyc0ZvckNhbGxpbmdDb252KExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCkgY29uc3QgeworICAgIHJldHVybiBnZXROdW1SZWdpc3RlcnMoQ29udGV4dCwgVlQpOworICB9CisKKyAgLy8vIENlcnRhaW4gdGFyZ2V0cyBoYXZlIGNvbnRleHQgc2Vuc3RpdmUgYWxpZ25tZW50IHJlcXVpcmVtZW50cywgd2hlcmUgb25lCisgIC8vLyB0eXBlIGhhcyB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IG9mIGFub3RoZXIgdHlwZS4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRBQklBbGlnbm1lbnRGb3JDYWxsaW5nQ29udihUeXBlICpBcmdUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhTGF5b3V0IERMKSBjb25zdCB7CisgICAgcmV0dXJuIERMLmdldEFCSVR5cGVBbGlnbm1lbnQoQXJnVHkpOworICB9CisKKyAgLy8vIElmIHRydWUsIHRoZW4gaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHNob3VsZCBzZWVrIHRvIHNocmluayB0aGUgRlAgY29uc3RhbnQKKyAgLy8vIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0byBhIHNtYWxsZXIgdHlwZSBpbiBvcmRlciB0byBzYXZlIHNwYWNlIGFuZCAvIG9yCisgIC8vLyByZWR1Y2UgcnVudGltZS4KKyAgdmlydHVhbCBib29sIFNob3VsZFNocmlua0ZQQ29uc3RhbnQoRVZUKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8gUmV0dXJuIHRydWUgaWYgaXQgaXMgcHJvZml0YWJsZSB0byByZWR1Y2UgdGhlIGdpdmVuIGxvYWQgbm9kZSB0byBhIHNtYWxsZXIKKyAgLy8gdHlwZS4KKyAgLy8KKyAgLy8gZS5nLiAoaTE2ICh0cnVuYyAoaTMyIChsb2FkIHgpKSkgLT4gaTE2IGxvYWQgeCBzaG91bGQgYmUgcGVyZm9ybWVkCisgIHZpcnR1YWwgYm9vbCBzaG91bGRSZWR1Y2VMb2FkV2lkdGgoU0ROb2RlICpMb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6TG9hZEV4dFR5cGUgRXh0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIE5ld1ZUKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gV2hlbiBzcGxpdHRpbmcgYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW50byBwYXJ0cywgZG9lcyB0aGUgTG8KKyAgLy8vIG9yIEhpIHBhcnQgY29tZSBmaXJzdD8gIFRoaXMgdXN1YWxseSBmb2xsb3dzIHRoZSBlbmRpYW5uZXNzLCBleGNlcHQKKyAgLy8vIGZvciBwcGNmMTI4LCB3aGVyZSB0aGUgSGkgcGFydCBhbHdheXMgY29tZXMgZmlyc3QuCisgIGJvb2wgaGFzQmlnRW5kaWFuUGFydE9yZGVyaW5nKEVWVCBWVCwgY29uc3QgRGF0YUxheW91dCAmREwpIGNvbnN0IHsKKyAgICByZXR1cm4gREwuaXNCaWdFbmRpYW4oKSB8fCBWVCA9PSBNVlQ6OnBwY2YxMjg7CisgIH0KKworICAvLy8gSWYgdHJ1ZSwgdGhlIHRhcmdldCBoYXMgY3VzdG9tIERBRyBjb21iaW5lIHRyYW5zZm9ybWF0aW9ucyB0aGF0IGl0IGNhbgorICAvLy8gcGVyZm9ybSBmb3IgdGhlIHNwZWNpZmllZCBub2RlLgorICBib29sIGhhc1RhcmdldERBR0NvbWJpbmUoSVNEOjpOb2RlVHlwZSBOVCkgY29uc3QgeworICAgIGFzc2VydCh1bnNpZ25lZChOVCA+PiAzKSA8IGFycmF5X2xlbmd0aG9mKFRhcmdldERBR0NvbWJpbmVBcnJheSkpOworICAgIHJldHVybiBUYXJnZXREQUdDb21iaW5lQXJyYXlbTlQgPj4gM10gJiAoMSA8PCAoTlQmNykpOworICB9CisKKyAgdW5zaWduZWQgZ2V0R2F0aGVyQWxsQWxpYXNlc01heERlcHRoKCkgY29uc3QgeworICAgIHJldHVybiBHYXRoZXJBbGxBbGlhc2VzTWF4RGVwdGg7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgcGxhdGZvcm0ncyB2YV9saXN0IG9iamVjdC4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRWYUxpc3RTaXplSW5CaXRzKGNvbnN0IERhdGFMYXlvdXQgJkRMKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFBvaW50ZXJUeShETCkuZ2V0U2l6ZUluQml0cygpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgbWF4aW11bSAjIG9mIHN0b3JlIG9wZXJhdGlvbnMgcGVybWl0dGVkIGZvciBsbHZtLm1lbXNldAorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RvcmUgb3BlcmF0aW9ucyBwZXJtaXR0ZWQKKyAgLy8vIHRvIHJlcGxhY2UgYSBjYWxsIHRvIGxsdm0ubWVtc2V0LiBUaGUgdmFsdWUgaXMgc2V0IGJ5IHRoZSB0YXJnZXQgYXQgdGhlCisgIC8vLyBwZXJmb3JtYW5jZSB0aHJlc2hvbGQgZm9yIHN1Y2ggYSByZXBsYWNlbWVudC4gSWYgT3B0U2l6ZSBpcyB0cnVlLAorICAvLy8gcmV0dXJuIHRoZSBsaW1pdCBmb3IgZnVuY3Rpb25zIHRoYXQgaGF2ZSBPcHRTaXplIGF0dHJpYnV0ZS4KKyAgdW5zaWduZWQgZ2V0TWF4U3RvcmVzUGVyTWVtc2V0KGJvb2wgT3B0U2l6ZSkgY29uc3QgeworICAgIHJldHVybiBPcHRTaXplID8gTWF4U3RvcmVzUGVyTWVtc2V0T3B0U2l6ZSA6IE1heFN0b3Jlc1Blck1lbXNldDsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IG1heGltdW0gIyBvZiBzdG9yZSBvcGVyYXRpb25zIHBlcm1pdHRlZCBmb3IgbGx2bS5tZW1jcHkKKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0b3JlIG9wZXJhdGlvbnMgcGVybWl0dGVkCisgIC8vLyB0byByZXBsYWNlIGEgY2FsbCB0byBsbHZtLm1lbWNweS4gVGhlIHZhbHVlIGlzIHNldCBieSB0aGUgdGFyZ2V0IGF0IHRoZQorICAvLy8gcGVyZm9ybWFuY2UgdGhyZXNob2xkIGZvciBzdWNoIGEgcmVwbGFjZW1lbnQuIElmIE9wdFNpemUgaXMgdHJ1ZSwKKyAgLy8vIHJldHVybiB0aGUgbGltaXQgZm9yIGZ1bmN0aW9ucyB0aGF0IGhhdmUgT3B0U2l6ZSBhdHRyaWJ1dGUuCisgIHVuc2lnbmVkIGdldE1heFN0b3Jlc1Blck1lbWNweShib29sIE9wdFNpemUpIGNvbnN0IHsKKyAgICByZXR1cm4gT3B0U2l6ZSA/IE1heFN0b3Jlc1Blck1lbWNweU9wdFNpemUgOiBNYXhTdG9yZXNQZXJNZW1jcHk7CisgIH0KKworICAvLy8gR2V0IG1heGltdW0gIyBvZiBsb2FkIG9wZXJhdGlvbnMgcGVybWl0dGVkIGZvciBtZW1jbXAKKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxvYWQgb3BlcmF0aW9ucyBwZXJtaXR0ZWQKKyAgLy8vIHRvIHJlcGxhY2UgYSBjYWxsIHRvIG1lbWNtcC4gVGhlIHZhbHVlIGlzIHNldCBieSB0aGUgdGFyZ2V0IGF0IHRoZQorICAvLy8gcGVyZm9ybWFuY2UgdGhyZXNob2xkIGZvciBzdWNoIGEgcmVwbGFjZW1lbnQuIElmIE9wdFNpemUgaXMgdHJ1ZSwKKyAgLy8vIHJldHVybiB0aGUgbGltaXQgZm9yIGZ1bmN0aW9ucyB0aGF0IGhhdmUgT3B0U2l6ZSBhdHRyaWJ1dGUuCisgIHVuc2lnbmVkIGdldE1heEV4cGFuZFNpemVNZW1jbXAoYm9vbCBPcHRTaXplKSBjb25zdCB7CisgICAgcmV0dXJuIE9wdFNpemUgPyBNYXhMb2Fkc1Blck1lbWNtcE9wdFNpemUgOiBNYXhMb2Fkc1Blck1lbWNtcDsKKyAgfQorCisgIC8vLyBGb3IgbWVtY21wIGV4cGFuc2lvbiB3aGVuIHRoZSBtZW1jbXAgcmVzdWx0IGlzIG9ubHkgY29tcGFyZWQgZXF1YWwgb3IKKyAgLy8vIG5vdC1lcXVhbCB0byAwLCBhbGxvdyB1cCB0byB0aGlzIG51bWJlciBvZiBsb2FkIHBhaXJzIHBlciBibG9jay4gQXMgYW4KKyAgLy8vIGV4YW1wbGUsIHRoaXMgbWF5IGFsbG93ICdtZW1jbXAoYSwgYiwgMykgPT0gMCcgaW4gYSBzaW5nbGUgYmxvY2s6CisgIC8vLyAgIGEwID0gbG9hZDJieXRlcyAmYVswXQorICAvLy8gICBiMCA9IGxvYWQyYnl0ZXMgJmJbMF0KKyAgLy8vICAgYTIgPSBsb2FkMWJ5dGUgICZhWzJdCisgIC8vLyAgIGIyID0gbG9hZDFieXRlICAmYlsyXQorICAvLy8gICByICA9IGNtcCBlcSAoYTAgXiBiMCB8IGEyIF4gYjIpLCAwCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TWVtY21wRXFaZXJvTG9hZHNQZXJCbG9jaygpIGNvbnN0IHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IG1heGltdW0gIyBvZiBzdG9yZSBvcGVyYXRpb25zIHBlcm1pdHRlZCBmb3IgbGx2bS5tZW1tb3ZlCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdG9yZSBvcGVyYXRpb25zIHBlcm1pdHRlZAorICAvLy8gdG8gcmVwbGFjZSBhIGNhbGwgdG8gbGx2bS5tZW1tb3ZlLiBUaGUgdmFsdWUgaXMgc2V0IGJ5IHRoZSB0YXJnZXQgYXQgdGhlCisgIC8vLyBwZXJmb3JtYW5jZSB0aHJlc2hvbGQgZm9yIHN1Y2ggYSByZXBsYWNlbWVudC4gSWYgT3B0U2l6ZSBpcyB0cnVlLAorICAvLy8gcmV0dXJuIHRoZSBsaW1pdCBmb3IgZnVuY3Rpb25zIHRoYXQgaGF2ZSBPcHRTaXplIGF0dHJpYnV0ZS4KKyAgdW5zaWduZWQgZ2V0TWF4U3RvcmVzUGVyTWVtbW92ZShib29sIE9wdFNpemUpIGNvbnN0IHsKKyAgICByZXR1cm4gT3B0U2l6ZSA/IE1heFN0b3Jlc1Blck1lbW1vdmVPcHRTaXplIDogTWF4U3RvcmVzUGVyTWVtbW92ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSB0YXJnZXQgc3VwcG9ydHMgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3Nlcy4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IGFsbG93cyB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzCisgIC8vLyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW4gdGhlIGdpdmVuIGFkZHJlc3Mgc3BhY2UuIElmIHRydWUsIGl0IGFsc28gcmV0dXJucworICAvLy8gd2hldGhlciB0aGUgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgaXMgImZhc3QiIGluIHRoZSBsYXN0IGFyZ3VtZW50IGJ5CisgIC8vLyByZWZlcmVuY2UuIFRoaXMgaXMgdXNlZCwgZm9yIGV4YW1wbGUsIGluIHNpdHVhdGlvbnMgd2hlcmUgYW4gYXJyYXkKKyAgLy8vIGNvcHkvbW92ZS9zZXQgaXMgY29udmVydGVkIHRvIGEgc2VxdWVuY2Ugb2Ygc3RvcmUgb3BlcmF0aW9ucy4gSXRzIHVzZQorICAvLy8gaGVscHMgdG8gZW5zdXJlIHRoYXQgc3VjaCByZXBsYWNlbWVudHMgZG9uJ3QgZ2VuZXJhdGUgY29kZSB0aGF0IGNhdXNlcyBhbgorICAvLy8gYWxpZ25tZW50IGVycm9yICh0cmFwKSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUuCisgIHZpcnR1YWwgYm9vbCBhbGxvd3NNaXNhbGlnbmVkTWVtb3J5QWNjZXNzZXMoRVZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ24gPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKiAvKkZhc3QqLyA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBzdXBwb3J0cyBhIG1lbW9yeSBhY2Nlc3Mgb2YgdGhpcyB0eXBlIGZvciB0aGUKKyAgLy8vIGdpdmVuIGFkZHJlc3Mgc3BhY2UgYW5kIGFsaWdubWVudC4gSWYgdGhlIGFjY2VzcyBpcyBhbGxvd2VkLCB0aGUgb3B0aW9uYWwKKyAgLy8vIGZpbmFsIHBhcmFtZXRlciByZXR1cm5zIGlmIHRoZSBhY2Nlc3MgaXMgYWxzbyBmYXN0IChhcyBkZWZpbmVkIGJ5IHRoZQorICAvLy8gdGFyZ2V0KS4KKyAgYm9vbCBhbGxvd3NNZW1vcnlBY2Nlc3MoTExWTUNvbnRleHQgJkNvbnRleHQsIGNvbnN0IERhdGFMYXlvdXQgJkRMLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSA9IDAsIHVuc2lnbmVkIEFsaWdubWVudCA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKkZhc3QgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgdGFyZ2V0IHNwZWNpZmljIG9wdGltYWwgdHlwZSBmb3IgbG9hZCBhbmQgc3RvcmUgb3BlcmF0aW9ucyBhcworICAvLy8gYSByZXN1bHQgb2YgbWVtc2V0LCBtZW1jcHksIGFuZCBtZW1tb3ZlIGxvd2VyaW5nLgorICAvLy8KKyAgLy8vIElmIERzdEFsaWduIGlzIHplcm8gdGhhdCBtZWFucyBpdCdzIHNhZmUgdG8gZGVzdGluYXRpb24gYWxpZ25tZW50IGNhbgorICAvLy8gc2F0aXNmeSBhbnkgY29uc3RyYWludC4gU2ltaWxhcmx5IGlmIFNyY0FsaWduIGlzIHplcm8gaXQgbWVhbnMgdGhlcmUgaXNuJ3QKKyAgLy8vIGEgbmVlZCB0byBjaGVjayBpdCBhZ2FpbnN0IGFsaWdubWVudCByZXF1aXJlbWVudCwgcHJvYmFibHkgYmVjYXVzZSB0aGUKKyAgLy8vIHNvdXJjZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGxvYWRlZC4gSWYgJ0lzTWVtc2V0JyBpcyB0cnVlLCB0aGF0IG1lYW5zIGl0J3MKKyAgLy8vIGV4cGFuZGluZyBhIG1lbXNldC4gSWYgJ1plcm9NZW1zZXQnIGlzIHRydWUsIHRoYXQgbWVhbnMgaXQncyBhIG1lbXNldCBvZgorICAvLy8gemVyby4gJ01lbWNweVN0clNyYycgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG1lbWNweSBzb3VyY2UgaXMgY29uc3RhbnQgc28gaXQKKyAgLy8vIGRvZXMgbm90IG5lZWQgdG8gYmUgbG9hZGVkLiAgSXQgcmV0dXJucyBFVlQ6Ok90aGVyIGlmIHRoZSB0eXBlIHNob3VsZCBiZQorICAvLy8gZGV0ZXJtaW5lZCB1c2luZyBnZW5lcmljIHRhcmdldC1pbmRlcGVuZGVudCBsb2dpYy4KKyAgdmlydHVhbCBFVlQgZ2V0T3B0aW1hbE1lbU9wVHlwZSh1aW50NjRfdCAvKlNpemUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAvKkRzdEFsaWduKi8sIHVuc2lnbmVkIC8qU3JjQWxpZ24qLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qSXNNZW1zZXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qWmVyb01lbXNldCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLypNZW1jcHlTdHJTcmMqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lRnVuY3Rpb24gJi8qTUYqLykgY29uc3QgeworICAgIHJldHVybiBNVlQ6Ok90aGVyOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCdzIHNhZmUgdG8gdXNlIGxvYWQgLyBzdG9yZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgdG8KKyAgLy8vIGV4cGFuZCBtZW1jcHkgLyBtZW1zZXQgaW5saW5lLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgbW9zdGx5IHRydWUgZm9yIGFsbCB0eXBlcyBleGNlcHQgZm9yIHNvbWUgc3BlY2lhbCBjYXNlcy4gRm9yCisgIC8vLyBleGFtcGxlLCBvbiBYODYgdGFyZ2V0cyB3aXRob3V0IFNTRTIgZjY0IGxvYWQgLyBzdG9yZSBhcmUgZG9uZSB3aXRoIGZsZGwgLworICAvLy8gZnN0cGwgd2hpY2ggYWxzbyBkb2VzIHR5cGUgY29udmVyc2lvbi4gTm90ZSB0aGUgc3BlY2lmaWVkIHR5cGUgZG9lc24ndAorICAvLy8gaGF2ZSB0byBiZSBsZWdhbCBhcyB0aGUgaG9vayBpcyB1c2VkIGJlZm9yZSB0eXBlIGxlZ2FsaXphdGlvbi4KKyAgdmlydHVhbCBib29sIGlzU2FmZU1lbU9wVHlwZShNVlQgLypWVCovKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIERldGVybWluZSBpZiB3ZSBzaG91bGQgdXNlIF9zZXRqbXAgb3Igc2V0am1wIHRvIGltcGxlbWVudCBsbHZtLnNldGptcC4KKyAgYm9vbCB1c2VzVW5kZXJzY29yZVNldEptcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVXNlVW5kZXJzY29yZVNldEptcDsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHVzZSBfbG9uZ2ptcCBvciBsb25nam1wIHRvIGltcGxlbWVudCBsbHZtLmxvbmdqbXAuCisgIGJvb2wgdXNlc1VuZGVyc2NvcmVMb25nSm1wKCkgY29uc3QgeworICAgIHJldHVybiBVc2VVbmRlcnNjb3JlTG9uZ0ptcDsKKyAgfQorCisgIC8vLyBSZXR1cm4gbG93ZXIgbGltaXQgZm9yIG51bWJlciBvZiBibG9ja3MgaW4gYSBqdW1wIHRhYmxlLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldE1pbmltdW1KdW1wVGFibGVFbnRyaWVzKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiBsb3dlciBsaW1pdCBvZiB0aGUgZGVuc2l0eSBpbiBhIGp1bXAgdGFibGUuCisgIHVuc2lnbmVkIGdldE1pbmltdW1KdW1wVGFibGVEZW5zaXR5KGJvb2wgT3B0Rm9yU2l6ZSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB1cHBlciBsaW1pdCBmb3IgbnVtYmVyIG9mIGVudHJpZXMgaW4gYSBqdW1wIHRhYmxlLgorICAvLy8gWmVybyBpZiBubyBsaW1pdC4KKyAgdW5zaWduZWQgZ2V0TWF4aW11bUp1bXBUYWJsZVNpemUoKSBjb25zdDsKKworICB2aXJ0dWFsIGJvb2wgaXNKdW1wVGFibGVSZWxhdGl2ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVE0uaXNQb3NpdGlvbkluZGVwZW5kZW50KCk7CisgIH0KKworICAvLy8gSWYgYSBwaHlzaWNhbCByZWdpc3RlciwgdGhpcyBzcGVjaWZpZXMgdGhlIHJlZ2lzdGVyIHRoYXQKKyAgLy8vIGxsdm0uc2F2ZXN0YWNrL2xsdm0ucmVzdG9yZXN0YWNrIHNob3VsZCBzYXZlIGFuZCByZXN0b3JlLgorICB1bnNpZ25lZCBnZXRTdGFja1BvaW50ZXJSZWdpc3RlclRvU2F2ZVJlc3RvcmUoKSBjb25zdCB7CisgICAgcmV0dXJuIFN0YWNrUG9pbnRlclJlZ2lzdGVyVG9TYXZlUmVzdG9yZTsKKyAgfQorCisgIC8vLyBJZiBhIHBoeXNpY2FsIHJlZ2lzdGVyLCB0aGlzIHJldHVybnMgdGhlIHJlZ2lzdGVyIHRoYXQgcmVjZWl2ZXMgdGhlCisgIC8vLyBleGNlcHRpb24gYWRkcmVzcyBvbiBlbnRyeSB0byBhbiBFSCBwYWQuCisgIHZpcnR1YWwgdW5zaWduZWQKKyAgZ2V0RXhjZXB0aW9uUG9pbnRlclJlZ2lzdGVyKGNvbnN0IENvbnN0YW50ICpQZXJzb25hbGl0eUZuKSBjb25zdCB7CisgICAgLy8gMCBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSBOb1JlZ2lzdGVyIHZhbHVlIG9uIGFsbCB0YXJnZXRzCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gSWYgYSBwaHlzaWNhbCByZWdpc3RlciwgdGhpcyByZXR1cm5zIHRoZSByZWdpc3RlciB0aGF0IHJlY2VpdmVzIHRoZQorICAvLy8gZXhjZXB0aW9uIHR5cGVpZCBvbiBlbnRyeSB0byBhIGxhbmRpbmcgcGFkLgorICB2aXJ0dWFsIHVuc2lnbmVkCisgIGdldEV4Y2VwdGlvblNlbGVjdG9yUmVnaXN0ZXIoY29uc3QgQ29uc3RhbnQgKlBlcnNvbmFsaXR5Rm4pIGNvbnN0IHsKKyAgICAvLyAwIGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIE5vUmVnaXN0ZXIgdmFsdWUgb24gYWxsIHRhcmdldHMKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBuZWVkc0ZpeGVkQ2F0Y2hPYmplY3RzKCkgY29uc3QgeworICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiRnVuY2xldCBFSCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgdGFyZ2V0Iik7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgdGFyZ2V0J3Mgam1wX2J1ZiBzaXplIGluIGJ5dGVzIChpZiBuZXZlciBzZXQsIHRoZSBkZWZhdWx0IGlzCisgIC8vLyAyMDApCisgIHVuc2lnbmVkIGdldEp1bXBCdWZTaXplKCkgY29uc3QgeworICAgIHJldHVybiBKdW1wQnVmU2l6ZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSB0YXJnZXQncyBqbXBfYnVmIGFsaWdubWVudCBpbiBieXRlcyAoaWYgbmV2ZXIgc2V0LCB0aGUgZGVmYXVsdAorICAvLy8gaXMgMCkKKyAgdW5zaWduZWQgZ2V0SnVtcEJ1ZkFsaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSnVtcEJ1ZkFsaWdubWVudDsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIG1pbmltdW0gc3RhY2sgYWxpZ25tZW50IG9mIGFuIGFyZ3VtZW50LgorICB1bnNpZ25lZCBnZXRNaW5TdGFja0FyZ3VtZW50QWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBNaW5TdGFja0FyZ3VtZW50QWxpZ25tZW50OworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbWluaW11bSBmdW5jdGlvbiBhbGlnbm1lbnQuCisgIHVuc2lnbmVkIGdldE1pbkZ1bmN0aW9uQWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBNaW5GdW5jdGlvbkFsaWdubWVudDsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHByZWZlcnJlZCBmdW5jdGlvbiBhbGlnbm1lbnQuCisgIHVuc2lnbmVkIGdldFByZWZGdW5jdGlvbkFsaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZkZ1bmN0aW9uQWxpZ25tZW50OworICB9CisKKyAgLy8vIFJldHVybiB0aGUgcHJlZmVycmVkIGxvb3AgYWxpZ25tZW50LgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldFByZWZMb29wQWxpZ25tZW50KE1hY2hpbmVMb29wICpNTCA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZkxvb3BBbGlnbm1lbnQ7CisgIH0KKworICAvLy8gSWYgdGhlIHRhcmdldCBoYXMgYSBzdGFuZGFyZCBsb2NhdGlvbiBmb3IgdGhlIHN0YWNrIHByb3RlY3RvciBndWFyZCwKKyAgLy8vIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhhdCBsb2NhdGlvbi4gT3RoZXJ3aXNlLCByZXR1cm5zIG51bGxwdHIuCisgIC8vLyBERVBSRUNBVEVEOiBwbGVhc2Ugb3ZlcnJpZGUgdXNlTG9hZFN0YWNrR3VhcmROb2RlIGFuZCBjdXN0b21pemUKKyAgLy8vICAgICAgICAgICAgIExPQURfU1RBQ0tfR1VBUkQsIG9yIGN1c3RvbWl6ZSBAbGx2bS5zdGFja2d1YXJkKCkuCisgIHZpcnR1YWwgVmFsdWUgKmdldElSU3RhY2tHdWFyZChJUkJ1aWxkZXI8PiAmSVJCKSBjb25zdDsKKworICAvLy8gSW5zZXJ0cyBuZWNlc3NhcnkgZGVjbGFyYXRpb25zIGZvciBTU1AgKHN0YWNrIHByb3RlY3Rpb24pIHB1cnBvc2UuCisgIC8vLyBTaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gZ2V0SVJTdGFja0d1YXJkIHJldHVybnMgbnVsbHB0ci4KKyAgdmlydHVhbCB2b2lkIGluc2VydFNTUERlY2xhcmF0aW9ucyhNb2R1bGUgJk0pIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHZhcmlhYmxlIHRoYXQncyBwcmV2aW91c2x5IGluc2VydGVkIGJ5IGluc2VydFNTUERlY2xhcmF0aW9ucywKKyAgLy8vIGlmIGFueSwgb3RoZXJ3aXNlIHJldHVybiBudWxscHRyLiBTaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4KKyAgLy8vIGdldElSU3RhY2tHdWFyZCByZXR1cm5zIG51bGxwdHIuCisgIHZpcnR1YWwgVmFsdWUgKmdldFNEYWdTdGFja0d1YXJkKGNvbnN0IE1vZHVsZSAmTSkgY29uc3Q7CisKKyAgLy8vIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCBzdGFjayBwcm90ZWN0aW9uIGNoZWNrcyBzaG91bGQgWE9SIHRoZQorICAvLy8gZnJhbWUgcG9pbnRlciAob3Igd2hpY2hldmVyIHBvaW50ZXIgaXMgdXNlZCB0byBhZGRyZXNzIGxvY2FscykgaW50byB0aGUKKyAgLy8vIHN0YWNrIGd1YXJkIHZhbHVlIGJlZm9yZSBjaGVja2luZyBpdC4gZ2V0SVJTdGFja0d1YXJkIG11c3QgcmV0dXJuIG51bGxwdHIKKyAgLy8vIGlmIHRoaXMgcmV0dXJucyB0cnVlLgorICB2aXJ0dWFsIGJvb2wgdXNlU3RhY2tHdWFyZFhvckZQKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gSWYgdGhlIHRhcmdldCBoYXMgYSBzdGFuZGFyZCBzdGFjayBwcm90ZWN0aW9uIGNoZWNrIGZ1bmN0aW9uIHRoYXQKKyAgLy8vIHBlcmZvcm1zIHZhbGlkYXRpb24gYW5kIGVycm9yIGhhbmRsaW5nLCByZXR1cm5zIHRoZSBmdW5jdGlvbi4gT3RoZXJ3aXNlLAorICAvLy8gcmV0dXJucyBudWxscHRyLiBNdXN0IGJlIHByZXZpb3VzbHkgaW5zZXJ0ZWQgYnkgaW5zZXJ0U1NQRGVjbGFyYXRpb25zLgorICAvLy8gU2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIGdldElSU3RhY2tHdWFyZCByZXR1cm5zIG51bGxwdHIuCisgIHZpcnR1YWwgVmFsdWUgKmdldFNTUFN0YWNrR3VhcmRDaGVjayhjb25zdCBNb2R1bGUgJk0pIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIFZhbHVlICpnZXREZWZhdWx0U2FmZVN0YWNrUG9pbnRlckxvY2F0aW9uKElSQnVpbGRlcjw+ICZJUkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVXNlVExTKSBjb25zdDsKKworcHVibGljOgorICAvLy8gUmV0dXJucyB0aGUgdGFyZ2V0LXNwZWNpZmljIGFkZHJlc3Mgb2YgdGhlIHVuc2FmZSBzdGFjayBwb2ludGVyLgorICB2aXJ0dWFsIFZhbHVlICpnZXRTYWZlU3RhY2tQb2ludGVyTG9jYXRpb24oSVJCdWlsZGVyPD4gJklSQikgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB1c2VkIHRvIGVtaXQgc3RhY2sgcHJvYmVzIG9yIHRoZSBlbXB0eQorICAvLy8gc3RyaW5nIGlmIG5vdCBhcHBsaWNhYmxlLgorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRTdGFja1Byb2JlU3ltYm9sTmFtZShNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhIGNhc3QgYmV0d2VlbiBTcmNBUyBhbmQgRGVzdEFTIGlzIGEgbm9vcC4KKyAgdmlydHVhbCBib29sIGlzTm9vcEFkZHJTcGFjZUNhc3QodW5zaWduZWQgU3JjQVMsIHVuc2lnbmVkIERlc3RBUykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYSBjYXN0IGZyb20gU3JjQVMgdG8gRGVzdEFTIGlzICJjaGVhcCIsIHN1Y2ggdGhhdCBlLmcuIHdlCisgIC8vLyBhcmUgaGFwcHkgdG8gc2luayBpdCBpbnRvIGJhc2ljIGJsb2Nrcy4KKyAgdmlydHVhbCBib29sIGlzQ2hlYXBBZGRyU3BhY2VDYXN0KHVuc2lnbmVkIFNyY0FTLCB1bnNpZ25lZCBEZXN0QVMpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNOb29wQWRkclNwYWNlQ2FzdChTcmNBUywgRGVzdEFTKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgcG9pbnRlciBhcmd1bWVudHMgdG8gQ0kgc2hvdWxkIGJlIGFsaWduZWQgYnkgYWxpZ25pbmcKKyAgLy8vIHRoZSBvYmplY3Qgd2hvc2UgYWRkcmVzcyBpcyBiZWluZyBwYXNzZWQuIElmIHNvIHRoZW4gTWluU2l6ZSBpcyBzZXQgdG8gdGhlCisgIC8vLyBtaW5pbXVtIHNpemUgdGhlIG9iamVjdCBtdXN0IGJlIHRvIGJlIGFsaWduZWQgYW5kIFByZWZBbGlnbiBpcyBzZXQgdG8gdGhlCisgIC8vLyBwcmVmZXJyZWQgYWxpZ25tZW50LgorICB2aXJ0dWFsIGJvb2wgc2hvdWxkQWxpZ25Qb2ludGVyQXJncyhDYWxsSW5zdCAqIC8qQ0kqLywgdW5zaWduZWQgJiAvKk1pblNpemUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJiAvKlByZWZBbGlnbiovKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBcbmFtZSBIZWxwZXJzIGZvciBUYXJnZXRUcmFuc2Zvcm1JbmZvIGltcGxlbWVudGF0aW9ucworICAvLy8gQHsKKworICAvLy8gR2V0IHRoZSBJU0Qgbm9kZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBJbnN0cnVjdGlvbiBjbGFzcyBvcGNvZGUuCisgIGludCBJbnN0cnVjdGlvbk9wY29kZVRvSVNEKHVuc2lnbmVkIE9wY29kZSkgY29uc3Q7CisKKyAgLy8vIEVzdGltYXRlIHRoZSBjb3N0IG9mIHR5cGUtbGVnYWxpemF0aW9uIGFuZCB0aGUgbGVnYWxpemVkIHR5cGUuCisgIHN0ZDo6cGFpcjxpbnQsIE1WVD4gZ2V0VHlwZUxlZ2FsaXphdGlvbkNvc3QoY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqVHkpIGNvbnN0OworCisgIC8vLyBAfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gXG5hbWUgSGVscGVycyBmb3IgYXRvbWljIGV4cGFuc2lvbi4KKyAgLy8vIEB7CisKKyAgLy8vIFJldHVybnMgdGhlIG1heGltdW0gYXRvbWljIG9wZXJhdGlvbiBzaXplIChpbiBiaXRzKSBzdXBwb3J0ZWQgYnkKKyAgLy8vIHRoZSBiYWNrZW5kLiBBdG9taWMgb3BlcmF0aW9ucyBncmVhdGVyIHRoYW4gdGhpcyBzaXplIChhcyB3ZWxsCisgIC8vLyBhcyBvbmVzIHRoYXQgYXJlIG5vdCBuYXR1cmFsbHkgYWxpZ25lZCksIHdpbGwgYmUgZXhwYW5kZWQgYnkKKyAgLy8vIEF0b21pY0V4cGFuZFBhc3MgaW50byBhbiBfX2F0b21pY18qIGxpYnJhcnkgY2FsbC4KKyAgdW5zaWduZWQgZ2V0TWF4QXRvbWljU2l6ZUluQml0c1N1cHBvcnRlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTWF4QXRvbWljU2l6ZUluQml0c1N1cHBvcnRlZDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBzbWFsbGVzdCBjbXB4Y2hnIG9yIGxsL3NjIGluc3RydWN0aW9uCisgIC8vLyB0aGUgYmFja2VuZCBzdXBwb3J0cy4gIEFueSBzbWFsbGVyIG9wZXJhdGlvbnMgYXJlIHdpZGVuZWQgaW4KKyAgLy8vIEF0b21pY0V4cGFuZFBhc3MuCisgIC8vLworICAvLy8gTm90ZSB0aGF0ICp1bmxpa2UqIG9wZXJhdGlvbnMgYWJvdmUgdGhlIG1heGltdW0gc2l6ZSwgYXRvbWljIG9wcworICAvLy8gYXJlIHN0aWxsIG5hdGl2ZWx5IHN1cHBvcnRlZCBiZWxvdyB0aGUgbWluaW11bTsgdGhleSBqdXN0CisgIC8vLyByZXF1aXJlIGEgbW9yZSBjb21wbGV4IGV4cGFuc2lvbi4KKyAgdW5zaWduZWQgZ2V0TWluQ21wWGNoZ1NpemVJbkJpdHMoKSBjb25zdCB7IHJldHVybiBNaW5DbXBYY2hnU2l6ZUluQml0czsgfQorCisgIC8vLyBXaGV0aGVyIHRoZSB0YXJnZXQgc3VwcG9ydHMgdW5hbGlnbmVkIGF0b21pYyBvcGVyYXRpb25zLgorICBib29sIHN1cHBvcnRzVW5hbGlnbmVkQXRvbWljcygpIGNvbnN0IHsgcmV0dXJuIFN1cHBvcnRzVW5hbGlnbmVkQXRvbWljczsgfQorCisgIC8vLyBXaGV0aGVyIEF0b21pY0V4cGFuZFBhc3Mgc2hvdWxkIGF1dG9tYXRpY2FsbHkgaW5zZXJ0IGZlbmNlcyBhbmQgcmVkdWNlCisgIC8vLyBvcmRlcmluZyBmb3IgdGhpcyBhdG9taWMuIFRoaXMgc2hvdWxkIGJlIHRydWUgZm9yIG1vc3QgYXJjaGl0ZWN0dXJlcyB3aXRoCisgIC8vLyB3ZWFrIG1lbW9yeSBvcmRlcmluZy4gRGVmYXVsdHMgdG8gZmFsc2UuCisgIHZpcnR1YWwgYm9vbCBzaG91bGRJbnNlcnRGZW5jZXNGb3JBdG9taWMoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUGVyZm9ybSBhIGxvYWQtbGlua2VkIG9wZXJhdGlvbiBvbiBBZGRyLCByZXR1cm5pbmcgYSAiVmFsdWUgKiIgd2l0aCB0aGUKKyAgLy8vIGNvcnJlc3BvbmRpbmcgcG9pbnRlZSB0eXBlLiBUaGlzIG1heSBlbnRhaWwgc29tZSBub24tdHJpdmlhbCBvcGVyYXRpb25zIHRvCisgIC8vLyB0cnVuY2F0ZSBvciByZWNvbnN0cnVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaWxsZWdhbCBpbiB0aGUgYmFja2VuZC4gU2VlCisgIC8vLyBBUk1JU2VsTG93ZXJpbmcgZm9yIGFuIGV4YW1wbGUgaW1wbGVtZW50YXRpb24uCisgIHZpcnR1YWwgVmFsdWUgKmVtaXRMb2FkTGlua2VkKElSQnVpbGRlcjw+ICZCdWlsZGVyLCBWYWx1ZSAqQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljT3JkZXJpbmcgT3JkKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiTG9hZCBsaW5rZWQgdW5pbXBsZW1lbnRlZCBvbiB0aGlzIHRhcmdldCIpOworICB9CisKKyAgLy8vIFBlcmZvcm0gYSBzdG9yZS1jb25kaXRpb25hbCBvcGVyYXRpb24gdG8gQWRkci4gUmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlCisgIC8vLyBzdG9yZS4gVGhpcyBzaG91bGQgYmUgMCBpZiB0aGUgc3RvcmUgc3VjY2VlZGVkLCBub24temVybyBvdGhlcndpc2UuCisgIHZpcnR1YWwgVmFsdWUgKmVtaXRTdG9yZUNvbmRpdGlvbmFsKElSQnVpbGRlcjw+ICZCdWlsZGVyLCBWYWx1ZSAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQWRkciwgQXRvbWljT3JkZXJpbmcgT3JkKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiU3RvcmUgY29uZGl0aW9uYWwgdW5pbXBsZW1lbnRlZCBvbiB0aGlzIHRhcmdldCIpOworICB9CisKKyAgLy8vIEluc2VydHMgaW4gdGhlIElSIGEgdGFyZ2V0LXNwZWNpZmljIGludHJpbnNpYyBzcGVjaWZ5aW5nIGEgZmVuY2UuCisgIC8vLyBJdCBpcyBjYWxsZWQgYnkgQXRvbWljRXhwYW5kUGFzcyBiZWZvcmUgZXhwYW5kaW5nIGFuCisgIC8vLyAgIEF0b21pY1JNVy9BdG9taWNDbXBYY2hnL0F0b21pY1N0b3JlL0F0b21pY0xvYWQKKyAgLy8vICAgaWYgc2hvdWxkSW5zZXJ0RmVuY2VzRm9yQXRvbWljIHJldHVybnMgdHJ1ZS4KKyAgLy8vCisgIC8vLyBJbnN0IGlzIHRoZSBvcmlnaW5hbCBhdG9taWMgaW5zdHJ1Y3Rpb24sIHByaW9yIHRvIG90aGVyIGV4cGFuc2lvbnMgdGhhdAorICAvLy8gbWF5IGJlIHBlcmZvcm1lZC4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBlaXRoZXIgcmV0dXJuIGEgbnVsbHB0ciwgb3IgYSBwb2ludGVyIHRvIGFuIElSLWxldmVsCisgIC8vLyAgIEluc3RydWN0aW9uKi4gRXZlbiBjb21wbGV4IGZlbmNlIHNlcXVlbmNlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgYQorICAvLy8gICBzaW5nbGUgSW5zdHJ1Y3Rpb24qIHRocm91Z2ggYW4gaW50cmluc2ljIHRvIGJlIGxvd2VyZWQgbGF0ZXIuCisgIC8vLyBCYWNrZW5kcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvZHVjZSB0YXJnZXQtc3BlY2lmaWMgaW50cmluc2ljCisgIC8vLyAgIGZvciB0aGVpciBmZW5jZXMuCisgIC8vLyBGSVhNRTogUGxlYXNlIG5vdGUgdGhhdCB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBoZXJlIGluIHRlcm1zIG9mCisgIC8vLyAgIElSLWxldmVsIGZlbmNlcyBleGlzdHMgZm9yIGhpc3RvcmljYWwvY29tcGF0aWJpbGl0eSByZWFzb25zIGFuZCBpcworICAvLy8gICAqdW5zb3VuZCogISBGZW5jZXMgY2Fubm90LCBpbiBnZW5lcmFsLCBiZSB1c2VkIHRvIHJlc3RvcmUgc2VxdWVudGlhbAorICAvLy8gICBjb25zaXN0ZW5jeS4gRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAgLy8vIGF0b21pYzxpbnQ+IHggPSB5ID0gMDsKKyAgLy8vIGludCByMSwgcjIsIHIzLCByNDsKKyAgLy8vIFRocmVhZCAwOgorICAvLy8gICB4LnN0b3JlKDEpOworICAvLy8gVGhyZWFkIDE6CisgIC8vLyAgIHkuc3RvcmUoMSk7CisgIC8vLyBUaHJlYWQgMjoKKyAgLy8vICAgcjEgPSB4LmxvYWQoKTsKKyAgLy8vICAgcjIgPSB5LmxvYWQoKTsKKyAgLy8vIFRocmVhZCAzOgorICAvLy8gICByMyA9IHkubG9hZCgpOworICAvLy8gICByNCA9IHgubG9hZCgpOworICAvLy8gIHIxID0gcjMgPSAxIGFuZCByMiA9IHI0ID0gMCBpcyBpbXBvc3NpYmxlIGFzIGxvbmcgYXMgdGhlIGFjY2Vzc2VzIGFyZSBhbGwKKyAgLy8vICBzZXFfY3N0LiBCdXQgaWYgdGhleSBhcmUgbG93ZXJlZCB0byBtb25vdG9uaWMgYWNjZXNzZXMsIG5vIGFtb3VudCBvZgorICAvLy8gIElSLWxldmVsIGZlbmNlcyBjYW4gcHJldmVudCBpdC4KKyAgLy8vIEB7CisgIHZpcnR1YWwgSW5zdHJ1Y3Rpb24gKmVtaXRMZWFkaW5nRmVuY2UoSVJCdWlsZGVyPD4gJkJ1aWxkZXIsIEluc3RydWN0aW9uICpJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY09yZGVyaW5nIE9yZCkgY29uc3QgeworICAgIGlmIChpc1JlbGVhc2VPclN0cm9uZ2VyKE9yZCkgJiYgSW5zdC0+aGFzQXRvbWljU3RvcmUoKSkKKyAgICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUZlbmNlKE9yZCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB2aXJ0dWFsIEluc3RydWN0aW9uICplbWl0VHJhaWxpbmdGZW5jZShJUkJ1aWxkZXI8PiAmQnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY09yZGVyaW5nIE9yZCkgY29uc3QgeworICAgIGlmIChpc0FjcXVpcmVPclN0cm9uZ2VyKE9yZCkpCisgICAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVGZW5jZShPcmQpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBudWxscHRyOworICB9CisgIC8vLyBAfQorCisgIC8vIEVtaXRzIGNvZGUgdGhhdCBleGVjdXRlcyB3aGVuIHRoZSBjb21wYXJpc29uIHJlc3VsdCBpbiB0aGUgbGwvc2MKKyAgLy8gZXhwYW5zaW9uIG9mIGEgY21weGNoZyBpbnN0cnVjdGlvbiBpcyBzdWNoIHRoYXQgdGhlIHN0b3JlLWNvbmRpdGlvbmFsIHdpbGwKKyAgLy8gbm90IGV4ZWN1dGUuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGJhbGFuY2Ugb3V0IHRoZSBsb2FkLWxpbmtlZCB3aXRoCisgIC8vIGEgZGVkaWNhdGVkIGluc3RydWN0aW9uLCBpZiBkZXNpcmVkLgorICAvLyBFLmcuLCBvbiBBUk0sIGlmIGxkcmV4IGlzbid0IGZvbGxvd2VkIGJ5IHN0cmV4LCB0aGUgZXhjbHVzaXZlIG1vbml0b3Igd291bGQKKyAgLy8gYmUgdW5uZWNlc3NhcmlseSBoZWxkLCBleGNlcHQgaWYgY2xyZXgsIGluc2VydGVkIGJ5IHRoaXMgaG9vaywgaXMgZXhlY3V0ZWQuCisgIHZpcnR1YWwgdm9pZCBlbWl0QXRvbWljQ21wWGNoZ05vU3RvcmVMTEJhbGFuY2UoSVJCdWlsZGVyPD4gJkJ1aWxkZXIpIGNvbnN0IHt9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gKGF0b21pYykgc3RvcmUgc2hvdWxkIGJlIGV4cGFuZGVkIGJ5IHRoZQorICAvLy8gSVItbGV2ZWwgQXRvbWljRXhwYW5kIHBhc3MgaW50byBhbiAiYXRvbWljIHhjaGciIHdoaWNoIGlnbm9yZXMgaXRzIGlucHV0LgorICB2aXJ0dWFsIGJvb2wgc2hvdWxkRXhwYW5kQXRvbWljU3RvcmVJbklSKFN0b3JlSW5zdCAqU0kpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIGFyZ3VtZW50cyBzaG91bGQgYmUgc2lnbi1leHRlbmRlZCBpbiBsaWIgY2FsbHMuCisgIHZpcnR1YWwgYm9vbCBzaG91bGRTaWduRXh0ZW5kVHlwZUluTGliQ2FsbChFVlQgVHlwZSwgYm9vbCBJc1NpZ25lZCkgY29uc3QgeworICAgIHJldHVybiBJc1NpZ25lZDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGhvdyB0aGUgZ2l2ZW4gKGF0b21pYykgbG9hZCBzaG91bGQgYmUgZXhwYW5kZWQgYnkgdGhlCisgIC8vLyBJUi1sZXZlbCBBdG9taWNFeHBhbmQgcGFzcy4KKyAgdmlydHVhbCBBdG9taWNFeHBhbnNpb25LaW5kIHNob3VsZEV4cGFuZEF0b21pY0xvYWRJbklSKExvYWRJbnN0ICpMSSkgY29uc3QgeworICAgIHJldHVybiBBdG9taWNFeHBhbnNpb25LaW5kOjpOb25lOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gYXRvbWljIGNtcHhjaGcgc2hvdWxkIGJlIGV4cGFuZGVkIGJ5IHRoZQorICAvLy8gSVItbGV2ZWwgQXRvbWljRXhwYW5kIHBhc3MgaW50byBhIGxvYWQtbGlua2VkL3N0b3JlLWNvbmRpdGlvbmFsIHNlcXVlbmNlCisgIC8vLyAodGhyb3VnaCBlbWl0TG9hZExpbmtlZCgpIGFuZCBlbWl0U3RvcmVDb25kaXRpb25hbCgpKS4KKyAgdmlydHVhbCBib29sIHNob3VsZEV4cGFuZEF0b21pY0NtcFhjaGdJbklSKEF0b21pY0NtcFhjaGdJbnN0ICpBSSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGhvdyB0aGUgSVItbGV2ZWwgQXRvbWljRXhwYW5kIHBhc3Mgc2hvdWxkIGV4cGFuZCB0aGUgZ2l2ZW4KKyAgLy8vIEF0b21pY1JNVywgaWYgYXQgYWxsLiBEZWZhdWx0IGlzIHRvIG5ldmVyIGV4cGFuZC4KKyAgdmlydHVhbCBBdG9taWNFeHBhbnNpb25LaW5kIHNob3VsZEV4cGFuZEF0b21pY1JNV0luSVIoQXRvbWljUk1XSW5zdCAqKSBjb25zdCB7CisgICAgcmV0dXJuIEF0b21pY0V4cGFuc2lvbktpbmQ6Ok5vbmU7CisgIH0KKworICAvLy8gT24gc29tZSBwbGF0Zm9ybXMsIGFuIEF0b21pY1JNVyB0aGF0IG5ldmVyIGFjdHVhbGx5IG1vZGlmaWVzIHRoZSB2YWx1ZQorICAvLy8gKHN1Y2ggYXMgZmV0Y2hfYWRkIG9mIDApIGNhbiBiZSB0dXJuZWQgaW50byBhIGZlbmNlIGZvbGxvd2VkIGJ5IGFuCisgIC8vLyBhdG9taWMgbG9hZC4gVGhpcyBtYXkgc291bmQgdXNlbGVzcywgYnV0IGl0IG1ha2VzIGl0IHBvc3NpYmxlIGZvciB0aGUKKyAgLy8vIHByb2Nlc3NvciB0byBrZWVwIHRoZSBjYWNoZWxpbmUgc2hhcmVkLCBkcmFtYXRpY2FsbHkgaW1wcm92aW5nCisgIC8vLyBwZXJmb3JtYW5jZS4gQW5kIHN1Y2ggaWRlbXBvdGVudCBSTVdzIGFyZSB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBzb21lCisgIC8vLyBraW5kcyBvZiBsb2Nrcywgc2VlIGZvciBleGFtcGxlIChqdXN0aWZpY2F0aW9uICsgYmVuY2htYXJrcyk6CisgIC8vLyBodHRwOi8vd3d3LmhwbC5ocC5jb20vdGVjaHJlcG9ydHMvMjAxMi9IUEwtMjAxMi02OC5wZGYKKyAgLy8vIFRoaXMgbWV0aG9kIHRyaWVzIGRvaW5nIHRoYXQgdHJhbnNmb3JtYXRpb24sIHJldHVybmluZyB0aGUgYXRvbWljIGxvYWQgaWYKKyAgLy8vIGl0IHN1Y2NlZWRzLCBhbmQgbnVsbHB0ciBvdGhlcndpc2UuCisgIC8vLyBJZiBzaG91bGRFeHBhbmRBdG9taWNMb2FkSW5JUiByZXR1cm5zIHRydWUgb24gdGhhdCBsb2FkLCBpdCB3aWxsIHVuZGVyZ28KKyAgLy8vIGFub3RoZXIgcm91bmQgb2YgZXhwYW5zaW9uLgorICB2aXJ0dWFsIExvYWRJbnN0ICoKKyAgbG93ZXJJZGVtcG90ZW50Uk1XSW50b0ZlbmNlZExvYWQoQXRvbWljUk1XSW5zdCAqUk1XSSkgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFJldHVybnMgaG93IHRoZSBwbGF0Zm9ybSdzIGF0b21pYyBvcGVyYXRpb25zIGFyZSBleHRlbmRlZCAoWkVST19FWFRFTkQsCisgIC8vLyBTSUdOX0VYVEVORCwgb3IgQU5ZX0VYVEVORCkuCisgIHZpcnR1YWwgSVNEOjpOb2RlVHlwZSBnZXRFeHRlbmRGb3JBdG9taWNPcHMoKSBjb25zdCB7CisgICAgcmV0dXJuIElTRDo6WkVST19FWFRFTkQ7CisgIH0KKworICAvLy8gQH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHdlIHNob3VsZCBub3JtYWxpemUKKyAgLy8vIHNlbGVjdChOMCZOMSwgWCwgWSkgPT4gc2VsZWN0KE4wLCBzZWxlY3QoTjEsIFgsIFkpLCBZKSBhbmQKKyAgLy8vIHNlbGVjdChOMHxOMSwgWCwgWSkgPT4gc2VsZWN0KE4wLCBzZWxlY3QoTjEsIFgsIFksIFkpKSBpZiBpdCBpcyBsaWtlbHkKKyAgLy8vIHRoYXQgaXQgc2F2ZXMgdXMgZnJvbSBtYXRlcmlhbGl6aW5nIE4wIGFuZCBOMSBpbiBhbiBpbnRlZ2VyIHJlZ2lzdGVyLgorICAvLy8gVGFyZ2V0cyB0aGF0IGFyZSBhYmxlIHRvIHBlcmZvcm0gYW5kL29yIG9uIGZsYWdzIHNob3VsZCByZXR1cm4gZmFsc2UgaGVyZS4KKyAgdmlydHVhbCBib29sIHNob3VsZE5vcm1hbGl6ZVRvU2VsZWN0U2VxdWVuY2UoTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCkgY29uc3QgeworICAgIC8vIElmIGEgdGFyZ2V0IGhhcyBtdWx0aXBsZSBjb25kaXRpb24gcmVnaXN0ZXJzLCB0aGVuIGl0IGxpa2VseSBoYXMgbG9naWNhbAorICAgIC8vIG9wZXJhdGlvbnMgb24gdGhvc2UgcmVnaXN0ZXJzLgorICAgIGlmIChoYXNNdWx0aXBsZUNvbmRpdGlvblJlZ2lzdGVycygpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIE9ubHkgZG8gdGhlIHRyYW5zZm9ybSBpZiB0aGUgdmFsdWUgd29uJ3QgYmUgc3BsaXQgaW50byBtdWx0aXBsZQorICAgIC8vIHJlZ2lzdGVycy4KKyAgICBMZWdhbGl6ZVR5cGVBY3Rpb24gQWN0aW9uID0gZ2V0VHlwZUFjdGlvbihDb250ZXh0LCBWVCk7CisgICAgcmV0dXJuIEFjdGlvbiAhPSBUeXBlRXhwYW5kSW50ZWdlciAmJiBBY3Rpb24gIT0gVHlwZUV4cGFuZEZsb2F0ICYmCisgICAgICBBY3Rpb24gIT0gVHlwZVNwbGl0VmVjdG9yOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGEgc2VsZWN0IG9mIGNvbnN0YW50cyAoc2VsZWN0IENvbmQsIEMxLCBDMikgc2hvdWxkIGJlCisgIC8vLyB0cmFuc2Zvcm1lZCBpbnRvIHNpbXBsZSBtYXRoIG9wcyB3aXRoIHRoZSBjb25kaXRpb24gdmFsdWUuIEZvciBleGFtcGxlOgorICAvLy8gc2VsZWN0IENvbmQsIEMxLCBDMS0xIC0tPiBhZGQgKHpleHQgQ29uZCksIEMxLTEKKyAgdmlydHVhbCBib29sIGNvbnZlcnRTZWxlY3RPZkNvbnN0YW50c1RvTWF0aChFVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVGFyZ2V0TG93ZXJpbmcgQ29uZmlndXJhdGlvbiBNZXRob2RzIC0gVGhlc2UgbWV0aG9kcyBzaG91bGQgYmUgaW52b2tlZCBieQorICAvLyB0aGUgZGVyaXZlZCBjbGFzcyBjb25zdHJ1Y3RvciB0byBjb25maWd1cmUgdGhpcyBvYmplY3QgZm9yIHRoZSB0YXJnZXQuCisgIC8vCitwcm90ZWN0ZWQ6CisgIC8vLyBTcGVjaWZ5IGhvdyB0aGUgdGFyZ2V0IGV4dGVuZHMgdGhlIHJlc3VsdCBvZiBpbnRlZ2VyIGFuZCBmbG9hdGluZyBwb2ludAorICAvLy8gYm9vbGVhbiB2YWx1ZXMgZnJvbSBpMSB0byBhIHdpZGVyIHR5cGUuICBTZWUgZ2V0Qm9vbGVhbkNvbnRlbnRzLgorICB2b2lkIHNldEJvb2xlYW5Db250ZW50cyhCb29sZWFuQ29udGVudCBUeSkgeworICAgIEJvb2xlYW5Db250ZW50cyA9IFR5OworICAgIEJvb2xlYW5GbG9hdENvbnRlbnRzID0gVHk7CisgIH0KKworICAvLy8gU3BlY2lmeSBob3cgdGhlIHRhcmdldCBleHRlbmRzIHRoZSByZXN1bHQgb2YgaW50ZWdlciBhbmQgZmxvYXRpbmcgcG9pbnQKKyAgLy8vIGJvb2xlYW4gdmFsdWVzIGZyb20gaTEgdG8gYSB3aWRlciB0eXBlLiAgU2VlIGdldEJvb2xlYW5Db250ZW50cy4KKyAgdm9pZCBzZXRCb29sZWFuQ29udGVudHMoQm9vbGVhbkNvbnRlbnQgSW50VHksIEJvb2xlYW5Db250ZW50IEZsb2F0VHkpIHsKKyAgICBCb29sZWFuQ29udGVudHMgPSBJbnRUeTsKKyAgICBCb29sZWFuRmxvYXRDb250ZW50cyA9IEZsb2F0VHk7CisgIH0KKworICAvLy8gU3BlY2lmeSBob3cgdGhlIHRhcmdldCBleHRlbmRzIHRoZSByZXN1bHQgb2YgYSB2ZWN0b3IgYm9vbGVhbiB2YWx1ZSBmcm9tIGEKKyAgLy8vIHZlY3RvciBvZiBpMSB0byBhIHdpZGVyIHR5cGUuICBTZWUgZ2V0Qm9vbGVhbkNvbnRlbnRzLgorICB2b2lkIHNldEJvb2xlYW5WZWN0b3JDb250ZW50cyhCb29sZWFuQ29udGVudCBUeSkgeworICAgIEJvb2xlYW5WZWN0b3JDb250ZW50cyA9IFR5OworICB9CisKKyAgLy8vIFNwZWNpZnkgdGhlIHRhcmdldCBzY2hlZHVsaW5nIHByZWZlcmVuY2UuCisgIHZvaWQgc2V0U2NoZWR1bGluZ1ByZWZlcmVuY2UoU2NoZWQ6OlByZWZlcmVuY2UgUHJlZikgeworICAgIFNjaGVkUHJlZmVyZW5jZUluZm8gPSBQcmVmOworICB9CisKKyAgLy8vIEluZGljYXRlIHdoZXRoZXIgdGhpcyB0YXJnZXQgcHJlZmVycyB0byB1c2UgX3NldGptcCB0byBpbXBsZW1lbnQKKyAgLy8vIGxsdm0uc2V0am1wIG9yIHRoZSB2ZXJzaW9uIHdpdGhvdXQgXy4gIERlZmF1bHRzIHRvIGZhbHNlLgorICB2b2lkIHNldFVzZVVuZGVyc2NvcmVTZXRKbXAoYm9vbCBWYWwpIHsKKyAgICBVc2VVbmRlcnNjb3JlU2V0Sm1wID0gVmFsOworICB9CisKKyAgLy8vIEluZGljYXRlIHdoZXRoZXIgdGhpcyB0YXJnZXQgcHJlZmVycyB0byB1c2UgX2xvbmdqbXAgdG8gaW1wbGVtZW50CisgIC8vLyBsbHZtLmxvbmdqbXAgb3IgdGhlIHZlcnNpb24gd2l0aG91dCBfLiAgRGVmYXVsdHMgdG8gZmFsc2UuCisgIHZvaWQgc2V0VXNlVW5kZXJzY29yZUxvbmdKbXAoYm9vbCBWYWwpIHsKKyAgICBVc2VVbmRlcnNjb3JlTG9uZ0ptcCA9IFZhbDsKKyAgfQorCisgIC8vLyBJbmRpY2F0ZSB0aGUgbWluaW11bSBudW1iZXIgb2YgYmxvY2tzIHRvIGdlbmVyYXRlIGp1bXAgdGFibGVzLgorICB2b2lkIHNldE1pbmltdW1KdW1wVGFibGVFbnRyaWVzKHVuc2lnbmVkIFZhbCk7CisKKyAgLy8vIEluZGljYXRlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIGluIGp1bXAgdGFibGVzLgorICAvLy8gU2V0IHRvIHplcm8gdG8gZ2VuZXJhdGUgdW5saW1pdGVkIGp1bXAgdGFibGVzLgorICB2b2lkIHNldE1heGltdW1KdW1wVGFibGVTaXplKHVuc2lnbmVkKTsKKworICAvLy8gSWYgc2V0IHRvIGEgcGh5c2ljYWwgcmVnaXN0ZXIsIHRoaXMgc3BlY2lmaWVzIHRoZSByZWdpc3RlciB0aGF0CisgIC8vLyBsbHZtLnNhdmVzdGFjay9sbHZtLnJlc3RvcmVzdGFjayBzaG91bGQgc2F2ZSBhbmQgcmVzdG9yZS4KKyAgdm9pZCBzZXRTdGFja1BvaW50ZXJSZWdpc3RlclRvU2F2ZVJlc3RvcmUodW5zaWduZWQgUikgeworICAgIFN0YWNrUG9pbnRlclJlZ2lzdGVyVG9TYXZlUmVzdG9yZSA9IFI7CisgIH0KKworICAvLy8gVGVsbHMgdGhlIGNvZGUgZ2VuZXJhdG9yIHRoYXQgdGhlIHRhcmdldCBoYXMgbXVsdGlwbGUgKGFsbG9jYXRhYmxlKQorICAvLy8gY29uZGl0aW9uIHJlZ2lzdGVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIHRoZSByZXN1bHRzIG9mIGNvbXBhcmlzb25zCisgIC8vLyBmb3IgdXNlIGJ5IHNlbGVjdHMgYW5kIGNvbmRpdGlvbmFsIGJyYW5jaGVzLiBXaXRoIG11bHRpcGxlIGNvbmRpdGlvbgorICAvLy8gcmVnaXN0ZXJzLCB0aGUgY29kZSBnZW5lcmF0b3Igd2lsbCBub3QgYWdncmVzc2l2ZWx5IHNpbmsgY29tcGFyaXNvbnMgaW50bworICAvLy8gdGhlIGJsb2NrcyBvZiB0aGVpciB1c2Vycy4KKyAgdm9pZCBzZXRIYXNNdWx0aXBsZUNvbmRpdGlvblJlZ2lzdGVycyhib29sIGhhc01hbnlSZWdzID0gdHJ1ZSkgeworICAgIEhhc011bHRpcGxlQ29uZGl0aW9uUmVnaXN0ZXJzID0gaGFzTWFueVJlZ3M7CisgIH0KKworICAvLy8gVGVsbHMgdGhlIGNvZGUgZ2VuZXJhdG9yIHRoYXQgdGhlIHRhcmdldCBoYXMgQml0RXh0cmFjdCBpbnN0cnVjdGlvbnMuCisgIC8vLyBUaGUgY29kZSBnZW5lcmF0b3Igd2lsbCBhZ2dyZXNzaXZlbHkgc2luayAic2hpZnQicyBpbnRvIHRoZSBibG9ja3Mgb2YKKyAgLy8vIHRoZWlyIHVzZXJzIGlmIHRoZSB1c2VycyB3aWxsIGdlbmVyYXRlICJhbmQiIGluc3RydWN0aW9ucyB3aGljaCBjYW4gYmUKKyAgLy8vIGNvbWJpbmVkIHdpdGggInNoaWZ0IiB0byBCaXRFeHRyYWN0IGluc3RydWN0aW9ucy4KKyAgdm9pZCBzZXRIYXNFeHRyYWN0Qml0c0luc24oYm9vbCBoYXNFeHRyYWN0SW5zbiA9IHRydWUpIHsKKyAgICBIYXNFeHRyYWN0Qml0c0luc24gPSBoYXNFeHRyYWN0SW5zbjsKKyAgfQorCisgIC8vLyBUZWxscyB0aGUgY29kZSBnZW5lcmF0b3Igbm90IHRvIGV4cGFuZCBsb2dpYyBvcGVyYXRpb25zIG9uIGNvbXBhcmlzb24KKyAgLy8vIHByZWRpY2F0ZXMgaW50byBzZXBhcmF0ZSBzZXF1ZW5jZXMgdGhhdCBpbmNyZWFzZSB0aGUgYW1vdW50IG9mIGZsb3cKKyAgLy8vIGNvbnRyb2wuCisgIHZvaWQgc2V0SnVtcElzRXhwZW5zaXZlKGJvb2wgaXNFeHBlbnNpdmUgPSB0cnVlKTsKKworICAvLy8gVGVsbHMgdGhlIGNvZGUgZ2VuZXJhdG9yIHRoYXQgdGhpcyB0YXJnZXQgc3VwcG9ydHMgZmxvYXRpbmcgcG9pbnQKKyAgLy8vIGV4Y2VwdGlvbnMgYW5kIGNhcmVzIGFib3V0IHByZXNlcnZpbmcgZmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uIGJlaGF2aW9yLgorICB2b2lkIHNldEhhc0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zKGJvb2wgRlBFeGNlcHRpb25zID0gdHJ1ZSkgeworICAgIEhhc0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zID0gRlBFeGNlcHRpb25zOworICB9CisKKyAgLy8vIFRlbGxzIHRoZSBjb2RlIGdlbmVyYXRvciB3aGljaCBiaXR3aWR0aHMgdG8gYnlwYXNzLgorICB2b2lkIGFkZEJ5cGFzc1Nsb3dEaXYodW5zaWduZWQgaW50IFNsb3dCaXRXaWR0aCwgdW5zaWduZWQgaW50IEZhc3RCaXRXaWR0aCkgeworICAgIEJ5cGFzc1Nsb3dEaXZXaWR0aHNbU2xvd0JpdFdpZHRoXSA9IEZhc3RCaXRXaWR0aDsKKyAgfQorCisgIC8vLyBBZGQgdGhlIHNwZWNpZmllZCByZWdpc3RlciBjbGFzcyBhcyBhbiBhdmFpbGFibGUgcmVnY2xhc3MgZm9yIHRoZQorICAvLy8gc3BlY2lmaWVkIHZhbHVlIHR5cGUuIFRoaXMgaW5kaWNhdGVzIHRoZSBzZWxlY3RvciBjYW4gaGFuZGxlIHZhbHVlcyBvZgorICAvLy8gdGhhdCBjbGFzcyBuYXRpdmVseS4KKyAgdm9pZCBhZGRSZWdpc3RlckNsYXNzKE1WVCBWVCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpIHsKKyAgICBhc3NlcnQoKHVuc2lnbmVkKVZULlNpbXBsZVR5IDwgYXJyYXlfbGVuZ3Rob2YoUmVnQ2xhc3NGb3JWVCkpOworICAgIFJlZ0NsYXNzRm9yVlRbVlQuU2ltcGxlVHldID0gUkM7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBsYXJnZXN0IGxlZ2FsIHN1cGVyLXJlZyByZWdpc3RlciBjbGFzcyBvZiB0aGUgcmVnaXN0ZXIgY2xhc3MKKyAgLy8vIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kIGl0cyBhc3NvY2lhdGVkICJjb3N0Ii4KKyAgdmlydHVhbCBzdGQ6OnBhaXI8Y29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqLCB1aW50OF90PgorICBmaW5kUmVwcmVzZW50YXRpdmVDbGFzcyhjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSwgTVZUIFZUKSBjb25zdDsKKworICAvLy8gT25jZSBhbGwgb2YgdGhlIHJlZ2lzdGVyIGNsYXNzZXMgYXJlIGFkZGVkLCB0aGlzIGFsbG93cyB1cyB0byBjb21wdXRlCisgIC8vLyBkZXJpdmVkIHByb3BlcnRpZXMgd2UgZXhwb3NlLgorICB2b2lkIGNvbXB1dGVSZWdpc3RlclByb3BlcnRpZXMoY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpOworCisgIC8vLyBJbmRpY2F0ZSB0aGF0IHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIGRvZXMgbm90IHdvcmsgd2l0aCB0aGUgc3BlY2lmaWVkCisgIC8vLyB0eXBlIGFuZCBpbmRpY2F0ZSB3aGF0IHRvIGRvIGFib3V0IGl0LiBOb3RlIHRoYXQgVlQgbWF5IHJlZmVyIHRvIGVpdGhlcgorICAvLy8gdGhlIHR5cGUgb2YgYSByZXN1bHQgb3IgdGhhdCBvZiBhbiBvcGVyYW5kIG9mIE9wLgorICB2b2lkIHNldE9wZXJhdGlvbkFjdGlvbih1bnNpZ25lZCBPcCwgTVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbGl6ZUFjdGlvbiBBY3Rpb24pIHsKKyAgICBhc3NlcnQoT3AgPCBhcnJheV9sZW5ndGhvZihPcEFjdGlvbnNbMF0pICYmICJUYWJsZSBpc24ndCBiaWcgZW5vdWdoISIpOworICAgIE9wQWN0aW9uc1sodW5zaWduZWQpVlQuU2ltcGxlVHldW09wXSA9IEFjdGlvbjsKKyAgfQorCisgIC8vLyBJbmRpY2F0ZSB0aGF0IHRoZSBzcGVjaWZpZWQgbG9hZCB3aXRoIGV4dGVuc2lvbiBkb2VzIG5vdCB3b3JrIHdpdGggdGhlCisgIC8vLyBzcGVjaWZpZWQgdHlwZSBhbmQgaW5kaWNhdGUgd2hhdCB0byBkbyBhYm91dCBpdC4KKyAgdm9pZCBzZXRMb2FkRXh0QWN0aW9uKHVuc2lnbmVkIEV4dFR5cGUsIE1WVCBWYWxWVCwgTVZUIE1lbVZULAorICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxpemVBY3Rpb24gQWN0aW9uKSB7CisgICAgYXNzZXJ0KEV4dFR5cGUgPCBJU0Q6OkxBU1RfTE9BREVYVF9UWVBFICYmIFZhbFZULmlzVmFsaWQoKSAmJgorICAgICAgICAgICBNZW1WVC5pc1ZhbGlkKCkgJiYgIlRhYmxlIGlzbid0IGJpZyBlbm91Z2ghIik7CisgICAgYXNzZXJ0KCh1bnNpZ25lZClBY3Rpb24gPCAweDEwICYmICJ0b28gbWFueSBiaXRzIGZvciBiaXRmaWVsZCBhcnJheSIpOworICAgIHVuc2lnbmVkIFNoaWZ0ID0gNCAqIEV4dFR5cGU7CisgICAgTG9hZEV4dEFjdGlvbnNbVmFsVlQuU2ltcGxlVHldW01lbVZULlNpbXBsZVR5XSAmPSB+KCh1aW50MTZfdCkweEYgPDwgU2hpZnQpOworICAgIExvYWRFeHRBY3Rpb25zW1ZhbFZULlNpbXBsZVR5XVtNZW1WVC5TaW1wbGVUeV0gfD0gKHVpbnQxNl90KUFjdGlvbiA8PCBTaGlmdDsKKyAgfQorCisgIC8vLyBJbmRpY2F0ZSB0aGF0IHRoZSBzcGVjaWZpZWQgdHJ1bmNhdGluZyBzdG9yZSBkb2VzIG5vdCB3b3JrIHdpdGggdGhlCisgIC8vLyBzcGVjaWZpZWQgdHlwZSBhbmQgaW5kaWNhdGUgd2hhdCB0byBkbyBhYm91dCBpdC4KKyAgdm9pZCBzZXRUcnVuY1N0b3JlQWN0aW9uKE1WVCBWYWxWVCwgTVZUIE1lbVZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxpemVBY3Rpb24gQWN0aW9uKSB7CisgICAgYXNzZXJ0KFZhbFZULmlzVmFsaWQoKSAmJiBNZW1WVC5pc1ZhbGlkKCkgJiYgIlRhYmxlIGlzbid0IGJpZyBlbm91Z2ghIik7CisgICAgVHJ1bmNTdG9yZUFjdGlvbnNbKHVuc2lnbmVkKVZhbFZULlNpbXBsZVR5XVtNZW1WVC5TaW1wbGVUeV0gPSBBY3Rpb247CisgIH0KKworICAvLy8gSW5kaWNhdGUgdGhhdCB0aGUgc3BlY2lmaWVkIGluZGV4ZWQgbG9hZCBkb2VzIG9yIGRvZXMgbm90IHdvcmsgd2l0aCB0aGUKKyAgLy8vIHNwZWNpZmllZCB0eXBlIGFuZCBpbmRpY2F0ZSB3aGF0IHRvIGRvIGFib3J0IGl0LgorICAvLy8KKyAgLy8vIE5PVEU6IEFsbCBpbmRleGVkIG1vZGUgbG9hZHMgYXJlIGluaXRpYWxpemVkIHRvIEV4cGFuZCBpbgorICAvLy8gVGFyZ2V0TG93ZXJpbmcuY3BwCisgIHZvaWQgc2V0SW5kZXhlZExvYWRBY3Rpb24odW5zaWduZWQgSWR4TW9kZSwgTVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2FsaXplQWN0aW9uIEFjdGlvbikgeworICAgIGFzc2VydChWVC5pc1ZhbGlkKCkgJiYgSWR4TW9kZSA8IElTRDo6TEFTVF9JTkRFWEVEX01PREUgJiYKKyAgICAgICAgICAgKHVuc2lnbmVkKUFjdGlvbiA8IDB4ZiAmJiAiVGFibGUgaXNuJ3QgYmlnIGVub3VnaCEiKTsKKyAgICAvLyBMb2FkIGFjdGlvbiBhcmUga2VwdCBpbiB0aGUgdXBwZXIgaGFsZi4KKyAgICBJbmRleGVkTW9kZUFjdGlvbnNbKHVuc2lnbmVkKVZULlNpbXBsZVR5XVtJZHhNb2RlXSAmPSB+MHhmMDsKKyAgICBJbmRleGVkTW9kZUFjdGlvbnNbKHVuc2lnbmVkKVZULlNpbXBsZVR5XVtJZHhNb2RlXSB8PSAoKHVpbnQ4X3QpQWN0aW9uKSA8PDQ7CisgIH0KKworICAvLy8gSW5kaWNhdGUgdGhhdCB0aGUgc3BlY2lmaWVkIGluZGV4ZWQgc3RvcmUgZG9lcyBvciBkb2VzIG5vdCB3b3JrIHdpdGggdGhlCisgIC8vLyBzcGVjaWZpZWQgdHlwZSBhbmQgaW5kaWNhdGUgd2hhdCB0byBkbyBhYm91dCBpdC4KKyAgLy8vCisgIC8vLyBOT1RFOiBBbGwgaW5kZXhlZCBtb2RlIHN0b3JlcyBhcmUgaW5pdGlhbGl6ZWQgdG8gRXhwYW5kIGluCisgIC8vLyBUYXJnZXRMb3dlcmluZy5jcHAKKyAgdm9pZCBzZXRJbmRleGVkU3RvcmVBY3Rpb24odW5zaWduZWQgSWR4TW9kZSwgTVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbGl6ZUFjdGlvbiBBY3Rpb24pIHsKKyAgICBhc3NlcnQoVlQuaXNWYWxpZCgpICYmIElkeE1vZGUgPCBJU0Q6OkxBU1RfSU5ERVhFRF9NT0RFICYmCisgICAgICAgICAgICh1bnNpZ25lZClBY3Rpb24gPCAweGYgJiYgIlRhYmxlIGlzbid0IGJpZyBlbm91Z2ghIik7CisgICAgLy8gU3RvcmUgYWN0aW9uIGFyZSBrZXB0IGluIHRoZSBsb3dlciBoYWxmLgorICAgIEluZGV4ZWRNb2RlQWN0aW9uc1sodW5zaWduZWQpVlQuU2ltcGxlVHldW0lkeE1vZGVdICY9IH4weDBmOworICAgIEluZGV4ZWRNb2RlQWN0aW9uc1sodW5zaWduZWQpVlQuU2ltcGxlVHldW0lkeE1vZGVdIHw9ICgodWludDhfdClBY3Rpb24pOworICB9CisKKyAgLy8vIEluZGljYXRlIHRoYXQgdGhlIHNwZWNpZmllZCBjb25kaXRpb24gY29kZSBpcyBvciBpc24ndCBzdXBwb3J0ZWQgb24gdGhlCisgIC8vLyB0YXJnZXQgYW5kIGluZGljYXRlIHdoYXQgdG8gZG8gYWJvdXQgaXQuCisgIHZvaWQgc2V0Q29uZENvZGVBY3Rpb24oSVNEOjpDb25kQ29kZSBDQywgTVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2FsaXplQWN0aW9uIEFjdGlvbikgeworICAgIGFzc2VydChWVC5pc1ZhbGlkKCkgJiYgKHVuc2lnbmVkKUNDIDwgYXJyYXlfbGVuZ3Rob2YoQ29uZENvZGVBY3Rpb25zKSAmJgorICAgICAgICAgICAiVGFibGUgaXNuJ3QgYmlnIGVub3VnaCEiKTsKKyAgICBhc3NlcnQoKHVuc2lnbmVkKUFjdGlvbiA8IDB4MTAgJiYgInRvbyBtYW55IGJpdHMgZm9yIGJpdGZpZWxkIGFycmF5Iik7CisgICAgLy8vIFRoZSBsb3dlciAzIGJpdHMgb2YgdGhlIFNpbXBsZVR5IGluZGV4IGludG8gTnRoIDRiaXQgc2V0IGZyb20gdGhlIDMyLWJpdAorICAgIC8vLyB2YWx1ZSBhbmQgdGhlIHVwcGVyIDI5IGJpdHMgaW5kZXggaW50byB0aGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkKKyAgICAvLy8gdG8gc2VsZWN0IHdoYXQgMzItYml0IHZhbHVlIHRvIHVzZS4KKyAgICB1aW50MzJfdCBTaGlmdCA9IDQgKiAoVlQuU2ltcGxlVHkgJiAweDcpOworICAgIENvbmRDb2RlQWN0aW9uc1tDQ11bVlQuU2ltcGxlVHkgPj4gM10gJj0gfigodWludDMyX3QpMHhGIDw8IFNoaWZ0KTsKKyAgICBDb25kQ29kZUFjdGlvbnNbQ0NdW1ZULlNpbXBsZVR5ID4+IDNdIHw9ICh1aW50MzJfdClBY3Rpb24gPDwgU2hpZnQ7CisgIH0KKworICAvLy8gSWYgT3BjL09yaWdWVCBpcyBzcGVjaWZpZWQgYXMgYmVpbmcgcHJvbW90ZWQsIHRoZSBwcm9tb3Rpb24gY29kZSBkZWZhdWx0cworICAvLy8gdG8gdHJ5aW5nIGEgbGFyZ2VyIGludGVnZXIvZnAgdW50aWwgaXQgY2FuIGZpbmQgb25lIHRoYXQgd29ya3MuIElmIHRoYXQKKyAgLy8vIGRlZmF1bHQgaXMgaW5zdWZmaWNpZW50LCB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBieSB0aGUgdGFyZ2V0IHRvIG92ZXJyaWRlCisgIC8vLyB0aGUgZGVmYXVsdC4KKyAgdm9pZCBBZGRQcm9tb3RlZFRvVHlwZSh1bnNpZ25lZCBPcGMsIE1WVCBPcmlnVlQsIE1WVCBEZXN0VlQpIHsKKyAgICBQcm9tb3RlVG9UeXBlW3N0ZDo6bWFrZV9wYWlyKE9wYywgT3JpZ1ZULlNpbXBsZVR5KV0gPSBEZXN0VlQuU2ltcGxlVHk7CisgIH0KKworICAvLy8gQ29udmVuaWVuY2UgbWV0aG9kIHRvIHNldCBhbiBvcGVyYXRpb24gdG8gUHJvbW90ZSBhbmQgc3BlY2lmeSB0aGUgdHlwZQorICAvLy8gaW4gYSBzaW5nbGUgY2FsbC4KKyAgdm9pZCBzZXRPcGVyYXRpb25Qcm9tb3RlZFRvVHlwZSh1bnNpZ25lZCBPcGMsIE1WVCBPcmlnVlQsIE1WVCBEZXN0VlQpIHsKKyAgICBzZXRPcGVyYXRpb25BY3Rpb24oT3BjLCBPcmlnVlQsIFByb21vdGUpOworICAgIEFkZFByb21vdGVkVG9UeXBlKE9wYywgT3JpZ1ZULCBEZXN0VlQpOworICB9CisKKyAgLy8vIFRhcmdldHMgc2hvdWxkIGludm9rZSB0aGlzIG1ldGhvZCBmb3IgZWFjaCB0YXJnZXQgaW5kZXBlbmRlbnQgbm9kZSB0aGF0CisgIC8vLyB0aGV5IHdhbnQgdG8gcHJvdmlkZSBhIGN1c3RvbSBEQUcgY29tYmluZXIgZm9yIGJ5IGltcGxlbWVudGluZyB0aGUKKyAgLy8vIFBlcmZvcm1EQUdDb21iaW5lIHZpcnR1YWwgbWV0aG9kLgorICB2b2lkIHNldFRhcmdldERBR0NvbWJpbmUoSVNEOjpOb2RlVHlwZSBOVCkgeworICAgIGFzc2VydCh1bnNpZ25lZChOVCA+PiAzKSA8IGFycmF5X2xlbmd0aG9mKFRhcmdldERBR0NvbWJpbmVBcnJheSkpOworICAgIFRhcmdldERBR0NvbWJpbmVBcnJheVtOVCA+PiAzXSB8PSAxIDw8IChOVCY3KTsKKyAgfQorCisgIC8vLyBTZXQgdGhlIHRhcmdldCdzIHJlcXVpcmVkIGptcF9idWYgYnVmZmVyIHNpemUgKGluIGJ5dGVzKTsgZGVmYXVsdCBpcyAyMDAKKyAgdm9pZCBzZXRKdW1wQnVmU2l6ZSh1bnNpZ25lZCBTaXplKSB7CisgICAgSnVtcEJ1ZlNpemUgPSBTaXplOworICB9CisKKyAgLy8vIFNldCB0aGUgdGFyZ2V0J3MgcmVxdWlyZWQgam1wX2J1ZiBidWZmZXIgYWxpZ25tZW50IChpbiBieXRlcyk7IGRlZmF1bHQgaXMKKyAgLy8vIDAKKyAgdm9pZCBzZXRKdW1wQnVmQWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKSB7CisgICAgSnVtcEJ1ZkFsaWdubWVudCA9IEFsaWduOworICB9CisKKyAgLy8vIFNldCB0aGUgdGFyZ2V0J3MgbWluaW11bSBmdW5jdGlvbiBhbGlnbm1lbnQgKGluIGxvZzIoYnl0ZXMpKQorICB2b2lkIHNldE1pbkZ1bmN0aW9uQWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKSB7CisgICAgTWluRnVuY3Rpb25BbGlnbm1lbnQgPSBBbGlnbjsKKyAgfQorCisgIC8vLyBTZXQgdGhlIHRhcmdldCdzIHByZWZlcnJlZCBmdW5jdGlvbiBhbGlnbm1lbnQuICBUaGlzIHNob3VsZCBiZSBzZXQgaWYKKyAgLy8vIHRoZXJlIGlzIGEgcGVyZm9ybWFuY2UgYmVuZWZpdCB0byBoaWdoZXItdGhhbi1taW5pbXVtIGFsaWdubWVudCAoaW4KKyAgLy8vIGxvZzIoYnl0ZXMpKQorICB2b2lkIHNldFByZWZGdW5jdGlvbkFsaWdubWVudCh1bnNpZ25lZCBBbGlnbikgeworICAgIFByZWZGdW5jdGlvbkFsaWdubWVudCA9IEFsaWduOworICB9CisKKyAgLy8vIFNldCB0aGUgdGFyZ2V0J3MgcHJlZmVycmVkIGxvb3AgYWxpZ25tZW50LiBEZWZhdWx0IGFsaWdubWVudCBpcyB6ZXJvLCBpdAorICAvLy8gbWVhbnMgdGhlIHRhcmdldCBkb2VzIG5vdCBjYXJlIGFib3V0IGxvb3AgYWxpZ25tZW50LiAgVGhlIGFsaWdubWVudCBpcworICAvLy8gc3BlY2lmaWVkIGluIGxvZzIoYnl0ZXMpLiBUaGUgdGFyZ2V0IG1heSBhbHNvIG92ZXJyaWRlCisgIC8vLyBnZXRQcmVmTG9vcEFsaWdubWVudCB0byBwcm92aWRlIHBlci1sb29wIHZhbHVlcy4KKyAgdm9pZCBzZXRQcmVmTG9vcEFsaWdubWVudCh1bnNpZ25lZCBBbGlnbikgeworICAgIFByZWZMb29wQWxpZ25tZW50ID0gQWxpZ247CisgIH0KKworICAvLy8gU2V0IHRoZSBtaW5pbXVtIHN0YWNrIGFsaWdubWVudCBvZiBhbiBhcmd1bWVudCAoaW4gbG9nMihieXRlcykpLgorICB2b2lkIHNldE1pblN0YWNrQXJndW1lbnRBbGlnbm1lbnQodW5zaWduZWQgQWxpZ24pIHsKKyAgICBNaW5TdGFja0FyZ3VtZW50QWxpZ25tZW50ID0gQWxpZ247CisgIH0KKworICAvLy8gU2V0IHRoZSBtYXhpbXVtIGF0b21pYyBvcGVyYXRpb24gc2l6ZSBzdXBwb3J0ZWQgYnkgdGhlCisgIC8vLyBiYWNrZW5kLiBBdG9taWMgb3BlcmF0aW9ucyBncmVhdGVyIHRoYW4gdGhpcyBzaXplIChhcyB3ZWxsIGFzCisgIC8vLyBvbmVzIHRoYXQgYXJlIG5vdCBuYXR1cmFsbHkgYWxpZ25lZCksIHdpbGwgYmUgZXhwYW5kZWQgYnkKKyAgLy8vIEF0b21pY0V4cGFuZFBhc3MgaW50byBhbiBfX2F0b21pY18qIGxpYnJhcnkgY2FsbC4KKyAgdm9pZCBzZXRNYXhBdG9taWNTaXplSW5CaXRzU3VwcG9ydGVkKHVuc2lnbmVkIFNpemVJbkJpdHMpIHsKKyAgICBNYXhBdG9taWNTaXplSW5CaXRzU3VwcG9ydGVkID0gU2l6ZUluQml0czsKKyAgfQorCisgIC8vLyBTZXRzIHRoZSBtaW5pbXVtIGNtcHhjaGcgb3IgbGwvc2Mgc2l6ZSBzdXBwb3J0ZWQgYnkgdGhlIGJhY2tlbmQuCisgIHZvaWQgc2V0TWluQ21wWGNoZ1NpemVJbkJpdHModW5zaWduZWQgU2l6ZUluQml0cykgeworICAgIE1pbkNtcFhjaGdTaXplSW5CaXRzID0gU2l6ZUluQml0czsKKyAgfQorCisgIC8vLyBTZXRzIHdoZXRoZXIgdW5hbGlnbmVkIGF0b21pYyBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCisgIHZvaWQgc2V0U3VwcG9ydHNVbmFsaWduZWRBdG9taWNzKGJvb2wgVW5hbGlnbmVkU3VwcG9ydGVkKSB7CisgICAgU3VwcG9ydHNVbmFsaWduZWRBdG9taWNzID0gVW5hbGlnbmVkU3VwcG9ydGVkOworICB9CisKK3B1YmxpYzoKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEFkZHJlc3NpbmcgbW9kZSBkZXNjcmlwdGlvbiBob29rcyAodXNlZCBieSBMU1IgZXRjKS4KKyAgLy8KKworICAvLy8gQ29kZUdlblByZXBhcmUgc2lua3MgYWRkcmVzcyBjYWxjdWxhdGlvbnMgaW50byB0aGUgc2FtZSBCQiBhcyBMb2FkL1N0b3JlCisgIC8vLyBpbnN0cnVjdGlvbnMgcmVhZGluZyB0aGUgYWRkcmVzcy4gVGhpcyBhbGxvd3MgYXMgbXVjaCBjb21wdXRhdGlvbiBhcworICAvLy8gcG9zc2libGUgdG8gYmUgZG9uZSBpbiB0aGUgYWRkcmVzcyBtb2RlIGZvciB0aGF0IG9wZXJhbmQuIFRoaXMgaG9vayBsZXRzCisgIC8vLyB0YXJnZXRzIGFsc28gcGFzcyBiYWNrIHdoZW4gdGhpcyBzaG91bGQgYmUgZG9uZSBvbiBpbnRyaW5zaWNzIHdoaWNoCisgIC8vLyBsb2FkL3N0b3JlLgorICB2aXJ0dWFsIGJvb2wgZ2V0QWRkck1vZGVBcmd1bWVudHMoSW50cmluc2ljSW5zdCAqIC8qSSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFZhbHVlKj4gJi8qT3BzKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIComLypBY2Nlc3NUeSovKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFRoaXMgcmVwcmVzZW50cyBhbiBhZGRyZXNzaW5nIG1vZGUgb2Y6CisgIC8vLyAgICBCYXNlR1YgKyBCYXNlT2ZmcyArIEJhc2VSZWcgKyBTY2FsZSpTY2FsZVJlZworICAvLy8gSWYgQmFzZUdWIGlzIG51bGwsICB0aGVyZSBpcyBubyBCYXNlR1YuCisgIC8vLyBJZiBCYXNlT2ZmcyBpcyB6ZXJvLCB0aGVyZSBpcyBubyBiYXNlIG9mZnNldC4KKyAgLy8vIElmIEhhc0Jhc2VSZWcgaXMgZmFsc2UsIHRoZXJlIGlzIG5vIGJhc2UgcmVnaXN0ZXIuCisgIC8vLyBJZiBTY2FsZSBpcyB6ZXJvLCB0aGVyZSBpcyBubyBTY2FsZVJlZy4gIFNjYWxlIG9mIDEgaW5kaWNhdGVzIGEgcmVnIHdpdGgKKyAgLy8vIG5vIHNjYWxlLgorICBzdHJ1Y3QgQWRkck1vZGUgeworICAgIEdsb2JhbFZhbHVlICpCYXNlR1YgPSBudWxscHRyOworICAgIGludDY0X3QgICAgICBCYXNlT2ZmcyA9IDA7CisgICAgYm9vbCAgICAgICAgIEhhc0Jhc2VSZWcgPSBmYWxzZTsKKyAgICBpbnQ2NF90ICAgICAgU2NhbGUgPSAwOworICAgIEFkZHJNb2RlKCkgPSBkZWZhdWx0OworICB9OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYWRkcmVzc2luZyBtb2RlIHJlcHJlc2VudGVkIGJ5IEFNIGlzIGxlZ2FsIGZvciB0aGlzCisgIC8vLyB0YXJnZXQsIGZvciBhIGxvYWQvc3RvcmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICAvLy8KKyAgLy8vIFRoZSB0eXBlIG1heSBiZSBWb2lkVHksIGluIHdoaWNoIGNhc2Ugb25seSByZXR1cm4gdHJ1ZSBpZiB0aGUgYWRkcmVzc2luZworICAvLy8gbW9kZSBpcyBsZWdhbCBmb3IgYSBsb2FkL3N0b3JlIG9mIGFueSBsZWdhbCB0eXBlLiAgVE9ETzogSGFuZGxlCisgIC8vLyBwcmUvcG9zdGluYyBhcyB3ZWxsLgorICAvLy8KKyAgLy8vIElmIHRoZSBhZGRyZXNzIHNwYWNlIGNhbm5vdCBiZSBkZXRlcm1pbmVkLCBpdCB3aWxsIGJlIC0xLgorICAvLy8KKyAgLy8vIFRPRE86IFJlbW92ZSBkZWZhdWx0IGFyZ3VtZW50CisgIHZpcnR1YWwgYm9vbCBpc0xlZ2FsQWRkcmVzc2luZ01vZGUoY29uc3QgRGF0YUxheW91dCAmREwsIGNvbnN0IEFkZHJNb2RlICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpUeSwgdW5zaWduZWQgQWRkclNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGNvc3Qgb2YgdGhlIHNjYWxpbmcgZmFjdG9yIHVzZWQgaW4gdGhlIGFkZHJlc3NpbmcgbW9kZQorICAvLy8gcmVwcmVzZW50ZWQgYnkgQU0gZm9yIHRoaXMgdGFyZ2V0LCBmb3IgYSBsb2FkL3N0b3JlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgLy8vCisgIC8vLyBJZiB0aGUgQU0gaXMgc3VwcG9ydGVkLCB0aGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgPj0gMC4KKyAgLy8vIElmIHRoZSBBTSBpcyBub3Qgc3VwcG9ydGVkLCBpdCByZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUuCisgIC8vLyBUT0RPOiBIYW5kbGUgcHJlL3Bvc3RpbmMgYXMgd2VsbC4KKyAgLy8vIFRPRE86IFJlbW92ZSBkZWZhdWx0IGFyZ3VtZW50CisgIHZpcnR1YWwgaW50IGdldFNjYWxpbmdGYWN0b3JDb3N0KGNvbnN0IERhdGFMYXlvdXQgJkRMLCBjb25zdCBBZGRyTW9kZSAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKlR5LCB1bnNpZ25lZCBBUyA9IDApIGNvbnN0IHsKKyAgICAvLyBEZWZhdWx0OiBhc3N1bWUgdGhhdCBhbnkgc2NhbGluZyBmYWN0b3IgdXNlZCBpbiBhIGxlZ2FsIEFNIGlzIGZyZWUuCisgICAgaWYgKGlzTGVnYWxBZGRyZXNzaW5nTW9kZShETCwgQU0sIFR5LCBBUykpCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbW1lZGlhdGUgaXMgbGVnYWwgaWNtcCBpbW1lZGlhdGUsIHRoYXQgaXMKKyAgLy8vIHRoZSB0YXJnZXQgaGFzIGljbXAgaW5zdHJ1Y3Rpb25zIHdoaWNoIGNhbiBjb21wYXJlIGEgcmVnaXN0ZXIgYWdhaW5zdCB0aGUKKyAgLy8vIGltbWVkaWF0ZSB3aXRob3V0IGhhdmluZyB0byBtYXRlcmlhbGl6ZSB0aGUgaW1tZWRpYXRlIGludG8gYSByZWdpc3Rlci4KKyAgdmlydHVhbCBib29sIGlzTGVnYWxJQ21wSW1tZWRpYXRlKGludDY0X3QpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGltbWVkaWF0ZSBpcyBsZWdhbCBhZGQgaW1tZWRpYXRlLCB0aGF0IGlzIHRoZQorICAvLy8gdGFyZ2V0IGhhcyBhZGQgaW5zdHJ1Y3Rpb25zIHdoaWNoIGNhbiBhZGQgYSByZWdpc3RlciB3aXRoIHRoZSBpbW1lZGlhdGUKKyAgLy8vIHdpdGhvdXQgaGF2aW5nIHRvIG1hdGVyaWFsaXplIHRoZSBpbW1lZGlhdGUgaW50byBhIHJlZ2lzdGVyLgorICB2aXJ0dWFsIGJvb2wgaXNMZWdhbEFkZEltbWVkaWF0ZShpbnQ2NF90KSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgaXQncyBzaWduaWZpY2FudGx5IGNoZWFwZXIgdG8gc2hpZnQgYSB2ZWN0b3IgYnkgYSB1bmlmb3JtCisgIC8vLyBzY2FsYXIgdGhhbiBieSBhbiBhbW91bnQgd2hpY2ggd2lsbCB2YXJ5IGFjcm9zcyBlYWNoIGxhbmUuIE9uIHg4NiwgZm9yCisgIC8vLyBleGFtcGxlLCB0aGVyZSBpcyBhICJwc2xsdyIgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBmb3JtZXIgY2FzZSwgYnV0IG5vIHNpbXBsZQorICAvLy8gaW5zdHJ1Y3Rpb24gZm9yIGEgZ2VuZXJhbCAiYSA8PCBiIiBvcGVyYXRpb24gb24gdmVjdG9ycy4KKyAgdmlydHVhbCBib29sIGlzVmVjdG9yU2hpZnRCeVNjYWxhckNoZWFwKFR5cGUgKlR5KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgb3Bjb2RlIGlzIGEgY29tbXV0YXRpdmUgYmluYXJ5IG9wZXJhdGlvbi4KKyAgdmlydHVhbCBib29sIGlzQ29tbXV0YXRpdmVCaW5PcCh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0IHsKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgZ2V0IGl0cyBpbmZvIGZyb20gdGhlIHRkIGZpbGUuCisgICAgc3dpdGNoIChPcGNvZGUpIHsKKyAgICBjYXNlIElTRDo6QUREOgorICAgIGNhc2UgSVNEOjpTTUlOOgorICAgIGNhc2UgSVNEOjpTTUFYOgorICAgIGNhc2UgSVNEOjpVTUlOOgorICAgIGNhc2UgSVNEOjpVTUFYOgorICAgIGNhc2UgSVNEOjpNVUw6CisgICAgY2FzZSBJU0Q6Ok1VTEhVOgorICAgIGNhc2UgSVNEOjpNVUxIUzoKKyAgICBjYXNlIElTRDo6U01VTF9MT0hJOgorICAgIGNhc2UgSVNEOjpVTVVMX0xPSEk6CisgICAgY2FzZSBJU0Q6OkZBREQ6CisgICAgY2FzZSBJU0Q6OkZNVUw6CisgICAgY2FzZSBJU0Q6OkFORDoKKyAgICBjYXNlIElTRDo6T1I6CisgICAgY2FzZSBJU0Q6OlhPUjoKKyAgICBjYXNlIElTRDo6U0FERE86CisgICAgY2FzZSBJU0Q6OlVBRERPOgorICAgIGNhc2UgSVNEOjpBRERDOgorICAgIGNhc2UgSVNEOjpBRERFOgorICAgIGNhc2UgSVNEOjpGTUlOTlVNOgorICAgIGNhc2UgSVNEOjpGTUFYTlVNOgorICAgIGNhc2UgSVNEOjpGTUlOTkFOOgorICAgIGNhc2UgSVNEOjpGTUFYTkFOOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBpdCdzIGZyZWUgdG8gdHJ1bmNhdGUgYSB2YWx1ZSBvZiB0eXBlIEZyb21UeSB0byB0eXBlCisgIC8vLyBUb1R5LiBlLmcuIE9uIHg4NiBpdCdzIGZyZWUgdG8gdHJ1bmNhdGUgYSBpMzIgdmFsdWUgaW4gcmVnaXN0ZXIgRUFYIHRvIGkxNgorICAvLy8gYnkgcmVmZXJlbmNpbmcgaXRzIHN1Yi1yZWdpc3RlciBBWC4KKyAgLy8vIFRhcmdldHMgbXVzdCByZXR1cm4gZmFsc2Ugd2hlbiBGcm9tVHkgPD0gVG9UeS4KKyAgdmlydHVhbCBib29sIGlzVHJ1bmNhdGVGcmVlKFR5cGUgKkZyb21UeSwgVHlwZSAqVG9UeSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhIHRydW5jYXRpb24gZnJvbSBGcm9tVHkgdG8gVG9UeSBpcyBwZXJtaXR0ZWQgd2hlbiBkZWNpZGluZworICAvLy8gd2hldGhlciBhIGNhbGwgaXMgaW4gdGFpbCBwb3NpdGlvbi4gVHlwaWNhbGx5IHRoaXMgbWVhbnMgdGhhdCBib3RoIHJlc3VsdHMKKyAgLy8vIHdvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBzYW1lIHJlZ2lzdGVyIG9yIHN0YWNrIHNsb3QsIGJ1dCBpdCBjb3VsZCBtZWFuCisgIC8vLyB0aGUgdGFyZ2V0IHBlcmZvcm1zIGFkZXF1YXRlIGNoZWNrcyBvZiBpdHMgb3duIGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggdGhlCisgIC8vLyB0YWlsIGNhbGwuICBUYXJnZXRzIG11c3QgcmV0dXJuIGZhbHNlIHdoZW4gRnJvbVR5IDw9IFRvVHkuCisgIHZpcnR1YWwgYm9vbCBhbGxvd1RydW5jYXRlRm9yVGFpbENhbGwoVHlwZSAqRnJvbVR5LCBUeXBlICpUb1R5KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdmlydHVhbCBib29sIGlzVHJ1bmNhdGVGcmVlKEVWVCBGcm9tVlQsIEVWVCBUb1ZUKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdmlydHVhbCBib29sIGlzUHJvZml0YWJsZVRvSG9pc3QoSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGV4dGVuc2lvbiByZXByZXNlbnRlZCBieSBccCBJIGlzIGZyZWUuCisgIC8vLyBVbmxpa2VseSB0aGUgaXNbWnxGUF1FeHRGcmVlIGZhbWlseSB3aGljaCBpcyBiYXNlZCBvbiB0eXBlcywKKyAgLy8vIHRoaXMgbWV0aG9kIGNhbiB1c2UgdGhlIGNvbnRleHQgcHJvdmlkZWQgYnkgXHAgSSB0byBkZWNpZGUKKyAgLy8vIHdoZXRoZXIgb3Igbm90IFxwIEkgaXMgZnJlZS4KKyAgLy8vIFRoaXMgbWV0aG9kIGV4dGVuZHMgdGhlIGJlaGF2aW9yIG9mIHRoZSBpc1tafEZQXUV4dEZyZWUgZmFtaWx5LgorICAvLy8gSW4gb3RoZXIgd29yZHMsIGlmIGlzW1p8RlBdRnJlZSByZXR1cm5zIHRydWUsIHRoZW4gdGhpcyBtZXRob2QKKyAgLy8vIHJldHVybnMgdHJ1ZSBhcyB3ZWxsLiBUaGUgY29udmVyc2UgaXMgbm90IHRydWUuCisgIC8vLyBUaGUgdGFyZ2V0IGNhbiBwZXJmb3JtIHRoZSBhZGVxdWF0ZSBjaGVja3MgYnkgb3ZlcnJpZGluZyBpc0V4dEZyZWVJbXBsLgorICAvLy8gXHByZSBccCBJIG11c3QgYmUgYSBzaWduLCB6ZXJvLCBvciBmcCBleHRlbnNpb24uCisgIGJvb2wgaXNFeHRGcmVlKGNvbnN0IEluc3RydWN0aW9uICpJKSBjb25zdCB7CisgICAgc3dpdGNoIChJLT5nZXRPcGNvZGUoKSkgeworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZQRXh0OgorICAgICAgaWYgKGlzRlBFeHRGcmVlKEVWVDo6Z2V0RVZUKEktPmdldFR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgRVZUOjpnZXRFVlQoSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6WkV4dDoKKyAgICAgIGlmIChpc1pFeHRGcmVlKEktPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSwgSS0+Z2V0VHlwZSgpKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTRXh0OgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkluc3RydWN0aW9uIGlzIG5vdCBhbiBleHRlbnNpb24iKTsKKyAgICB9CisgICAgcmV0dXJuIGlzRXh0RnJlZUltcGwoSSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgXHAgTG9hZCBhbmQgXHAgRXh0IGNhbiBmb3JtIGFuIEV4dExvYWQuCisgIC8vLyBGb3IgZXhhbXBsZSwgaW4gQUFyY2g2NAorICAvLy8gICAlTCA9IGxvYWQgaTgsIGk4KiAlcHRyCisgIC8vLyAgICVFID0gemV4dCBpOCAlTCB0byBpMzIKKyAgLy8vIGNhbiBiZSBsb3dlcmVkIGludG8gb25lIGxvYWQgaW5zdHJ1Y3Rpb24KKyAgLy8vICAgbGRyYiB3MCwgW3gwXQorICBib29sIGlzRXh0TG9hZChjb25zdCBMb2FkSW5zdCAqTG9hZCwgY29uc3QgSW5zdHJ1Y3Rpb24gKkV4dCwKKyAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpIGNvbnN0IHsKKyAgICBFVlQgVlQgPSBnZXRWYWx1ZVR5cGUoREwsIEV4dC0+Z2V0VHlwZSgpKTsKKyAgICBFVlQgTG9hZFZUID0gZ2V0VmFsdWVUeXBlKERMLCBMb2FkLT5nZXRUeXBlKCkpOworCisgICAgLy8gSWYgdGhlIGxvYWQgaGFzIG90aGVyIHVzZXJzIGFuZCB0aGUgdHJ1bmNhdGUgaXMgbm90IGZyZWUsIHRoZSBleHQKKyAgICAvLyBwcm9iYWJseSBpc24ndCBmcmVlLgorICAgIGlmICghTG9hZC0+aGFzT25lVXNlKCkgJiYgKGlzVHlwZUxlZ2FsKExvYWRWVCkgfHwgIWlzVHlwZUxlZ2FsKFZUKSkgJiYKKyAgICAgICAgIWlzVHJ1bmNhdGVGcmVlKEV4dC0+Z2V0VHlwZSgpLCBMb2FkLT5nZXRUeXBlKCkpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgdGFyZ2V0IHN1cHBvcnRzIGNhc3RzIGZvbGRlZCBpbnRvIGxvYWRzLgorICAgIHVuc2lnbmVkIExUeXBlOworICAgIGlmIChpc2E8WkV4dEluc3Q+KEV4dCkpCisgICAgICBMVHlwZSA9IElTRDo6WkVYVExPQUQ7CisgICAgZWxzZSB7CisgICAgICBhc3NlcnQoaXNhPFNFeHRJbnN0PihFeHQpICYmICJVbmV4cGVjdGVkIGV4dCB0eXBlISIpOworICAgICAgTFR5cGUgPSBJU0Q6OlNFWFRMT0FEOworICAgIH0KKworICAgIHJldHVybiBpc0xvYWRFeHRMZWdhbChMVHlwZSwgVlQsIExvYWRWVCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYW55IGFjdHVhbCBpbnN0cnVjdGlvbiB0aGF0IGRlZmluZXMgYSB2YWx1ZSBvZiB0eXBlIEZyb21UeQorICAvLy8gaW1wbGljaXRseSB6ZXJvLWV4dGVuZHMgdGhlIHZhbHVlIHRvIFRvVHkgaW4gdGhlIHJlc3VsdCByZWdpc3Rlci4KKyAgLy8vCisgIC8vLyBUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gaXQgaXMgbGlrZWx5IHRoYXQgdGhlIHRydW5jYXRlIGNhbgorICAvLy8gYmUgZnJlZWx5IGZvbGRlZCB3aXRoIGFuIGluc3RydWN0aW9uIGRlZmluaW5nIGEgdmFsdWUgb2YgRnJvbVR5LiBJZgorICAvLy8gdGhlIGRlZmluaW5nIGluc3RydWN0aW9uIGlzIHVua25vd24gKGJlY2F1c2UgeW91J3JlIGxvb2tpbmcgYXQgYQorICAvLy8gZnVuY3Rpb24gYXJndW1lbnQsIFBISSwgZXRjLikgdGhlbiB0aGUgdGFyZ2V0IG1heSByZXF1aXJlIGFuCisgIC8vLyBleHBsaWNpdCB0cnVuY2F0ZSwgd2hpY2ggaXMgbm90IG5lY2Vzc2FyaWx5IGZyZWUsIGJ1dCB0aGlzIGZ1bmN0aW9uCisgIC8vLyBkb2VzIG5vdCBkZWFsIHdpdGggdGhvc2UgY2FzZXMuCisgIC8vLyBUYXJnZXRzIG11c3QgcmV0dXJuIGZhbHNlIHdoZW4gRnJvbVR5ID49IFRvVHkuCisgIHZpcnR1YWwgYm9vbCBpc1pFeHRGcmVlKFR5cGUgKkZyb21UeSwgVHlwZSAqVG9UeSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBpc1pFeHRGcmVlKEVWVCBGcm9tVHksIEVWVCBUb1R5KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgc3VwcGxpZXMgYW5kIGNvbWJpbmVzIHRvIGEgcGFpcmVkIGxvYWQKKyAgLy8vIHR3byBsb2FkZWQgdmFsdWVzIG9mIHR5cGUgTG9hZGVkVHlwZSBuZXh0IHRvIGVhY2ggb3RoZXIgaW4gbWVtb3J5LgorICAvLy8gUmVxdWlyZWRBbGlnbm1lbnQgZ2l2ZXMgdGhlIG1pbmltYWwgYWxpZ25tZW50IGNvbnN0cmFpbnRzIHRoYXQgbXVzdCBiZSBtZXQKKyAgLy8vIHRvIGJlIGFibGUgdG8gc2VsZWN0IHRoaXMgcGFpcmVkIGxvYWQuCisgIC8vLworICAvLy8gVGhpcyBpbmZvcm1hdGlvbiBpcyAqbm90KiB1c2VkIHRvIGdlbmVyYXRlIGFjdHVhbCBwYWlyZWQgbG9hZHMsIGJ1dCBpdCBpcworICAvLy8gdXNlZCB0byBnZW5lcmF0ZSBhIHNlcXVlbmNlIG9mIGxvYWRzIHRoYXQgaXMgZWFzaWVyIHRvIGNvbWJpbmUgaW50byBhCisgIC8vLyBwYWlyZWQgbG9hZC4KKyAgLy8vIEZvciBpbnN0YW5jZSwgc29tZXRoaW5nIGxpa2UgdGhpczoKKyAgLy8vIGEgPSBsb2FkIGk2NCogYWRkcgorICAvLy8gYiA9IHRydW5jIGk2NCBhIHRvIGkzMgorICAvLy8gYyA9IGxzaHIgaTY0IGEsIDMyCisgIC8vLyBkID0gdHJ1bmMgaTY0IGMgdG8gaTMyCisgIC8vLyB3aWxsIGJlIG9wdGltaXplZCBpbnRvOgorICAvLy8gYiA9IGxvYWQgaTMyKiBhZGRyMQorICAvLy8gZCA9IGxvYWQgaTMyKiBhZGRyMgorICAvLy8gV2hlcmUgYWRkcjEgPSBhZGRyMiArLy0gc2l6ZW9mKGkzMikuCisgIC8vLworICAvLy8gSW4gb3RoZXIgd29yZHMsIHVubGVzcyB0aGUgdGFyZ2V0IHBlcmZvcm1zIGEgcG9zdC1pc2VsIGxvYWQgY29tYmluaW5nLAorICAvLy8gdGhpcyBpbmZvcm1hdGlvbiBzaG91bGQgbm90IGJlIHByb3ZpZGVkIGJlY2F1c2UgaXQgd2lsbCBnZW5lcmF0ZSBtb3JlCisgIC8vLyBsb2Fkcy4KKyAgdmlydHVhbCBib29sIGhhc1BhaXJlZExvYWQoRVZUIC8qTG9hZGVkVHlwZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmIC8qUmVxdWlyZWRBbGlnbm1lbnQqLykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGhhcyBhIHZlY3RvciBibGVuZCBpbnN0cnVjdGlvbi4KKyAgdmlydHVhbCBib29sIGhhc1ZlY3RvckJsZW5kKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbWF4aW11bSBzdXBwb3J0ZWQgZmFjdG9yIGZvciBpbnRlcmxlYXZlZCBtZW1vcnkgYWNjZXNzZXMuCisgIC8vLyBEZWZhdWx0IHRvIGJlIHRoZSBtaW5pbXVtIGludGVybGVhdmUgZmFjdG9yOiAyLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldE1heFN1cHBvcnRlZEludGVybGVhdmVGYWN0b3IoKSBjb25zdCB7IHJldHVybiAyOyB9CisKKyAgLy8vIFxicmllZiBMb3dlciBhbiBpbnRlcmxlYXZlZCBsb2FkIHRvIHRhcmdldCBzcGVjaWZpYyBpbnRyaW5zaWNzLiBSZXR1cm4KKyAgLy8vIHRydWUgb24gc3VjY2Vzcy4KKyAgLy8vCisgIC8vLyBccCBMSSBpcyB0aGUgdmVjdG9yIGxvYWQgaW5zdHJ1Y3Rpb24uCisgIC8vLyBccCBTaHVmZmxlcyBpcyB0aGUgc2h1ZmZsZXZlY3RvciBsaXN0IHRvIERFLWludGVybGVhdmUgdGhlIGxvYWRlZCB2ZWN0b3IuCisgIC8vLyBccCBJbmRpY2VzIGlzIHRoZSBjb3JyZXNwb25kaW5nIGluZGljZXMgZm9yIGVhY2ggc2h1ZmZsZXZlY3Rvci4KKyAgLy8vIFxwIEZhY3RvciBpcyB0aGUgaW50ZXJsZWF2ZSBmYWN0b3IuCisgIHZpcnR1YWwgYm9vbCBsb3dlckludGVybGVhdmVkTG9hZChMb2FkSW5zdCAqTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTaHVmZmxlVmVjdG9ySW5zdCAqPiBTaHVmZmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmFjdG9yKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBMb3dlciBhbiBpbnRlcmxlYXZlZCBzdG9yZSB0byB0YXJnZXQgc3BlY2lmaWMgaW50cmluc2ljcy4gUmV0dXJuCisgIC8vLyB0cnVlIG9uIHN1Y2Nlc3MuCisgIC8vLworICAvLy8gXHAgU0kgaXMgdGhlIHZlY3RvciBzdG9yZSBpbnN0cnVjdGlvbi4KKyAgLy8vIFxwIFNWSSBpcyB0aGUgc2h1ZmZsZXZlY3RvciB0byBSRS1pbnRlcmxlYXZlIHRoZSBzdG9yZWQgdmVjdG9yLgorICAvLy8gXHAgRmFjdG9yIGlzIHRoZSBpbnRlcmxlYXZlIGZhY3Rvci4KKyAgdmlydHVhbCBib29sIGxvd2VySW50ZXJsZWF2ZWRTdG9yZShTdG9yZUluc3QgKlNJLCBTaHVmZmxlVmVjdG9ySW5zdCAqU1ZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZhY3RvcikgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB6ZXJvLWV4dGVuZGluZyB0aGUgc3BlY2lmaWMgbm9kZSBWYWwgdG8gdHlwZSBWVDIgaXMgZnJlZQorICAvLy8gKGVpdGhlciBiZWNhdXNlIGl0J3MgaW1wbGljaXRseSB6ZXJvLWV4dGVuZGVkIHN1Y2ggYXMgQVJNIGxkcmIgLyBsZHJoIG9yCisgIC8vLyBiZWNhdXNlIGl0J3MgZm9sZGVkIHN1Y2ggYXMgWDg2IHplcm8tZXh0ZW5kaW5nIGxvYWRzKS4KKyAgdmlydHVhbCBib29sIGlzWkV4dEZyZWUoU0RWYWx1ZSBWYWwsIEVWVCBWVDIpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNaRXh0RnJlZShWYWwuZ2V0VmFsdWVUeXBlKCksIFZUMik7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYW4gZnBleHQgb3BlcmF0aW9uIGlzIGZyZWUgKGZvciBpbnN0YW5jZSwgYmVjYXVzZQorICAvLy8gc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXJzIGFyZSBpbXBsaWNpdGx5IGV4dGVuZGVkIHRvCisgIC8vLyBkb3VibGUtcHJlY2lzaW9uKS4KKyAgdmlydHVhbCBib29sIGlzRlBFeHRGcmVlKEVWVCBEZXN0VlQsIEVWVCBTcmNWVCkgY29uc3QgeworICAgIGFzc2VydChTcmNWVC5pc0Zsb2F0aW5nUG9pbnQoKSAmJiBEZXN0VlQuaXNGbG9hdGluZ1BvaW50KCkgJiYKKyAgICAgICAgICAgImludmFsaWQgZnBleHQgdHlwZXMiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYW4gZnBleHQgb3BlcmF0aW9uIGlucHV0IHRvIGFuIFxwIE9wY29kZSBvcGVyYXRpb24gaXMgZnJlZQorICAvLy8gKGZvciBpbnN0YW5jZSwgYmVjYXVzZSBoYWxmLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXJzIGFyZQorICAvLy8gaW1wbGljaXRseSBleHRlbmRlZCB0byBmbG9hdC1wcmVjaXNpb24pIGZvciBhbiBGTUEgaW5zdHJ1Y3Rpb24uCisgIHZpcnR1YWwgYm9vbCBpc0ZQRXh0Rm9sZGFibGUodW5zaWduZWQgT3Bjb2RlLCBFVlQgRGVzdFZULCBFVlQgU3JjVlQpIGNvbnN0IHsKKyAgICBhc3NlcnQoRGVzdFZULmlzRmxvYXRpbmdQb2ludCgpICYmIFNyY1ZULmlzRmxvYXRpbmdQb2ludCgpICYmCisgICAgICAgICAgICJpbnZhbGlkIGZwZXh0IHR5cGVzIik7CisgICAgcmV0dXJuIGlzRlBFeHRGcmVlKERlc3RWVCwgU3JjVlQpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGZvbGRpbmcgYSB2ZWN0b3IgbG9hZCBpbnRvIEV4dFZhbCAoYSBzaWduLCB6ZXJvLCBvciBhbnkKKyAgLy8vIGV4dGVuZCBub2RlKSBpcyBwcm9maXRhYmxlLgorICB2aXJ0dWFsIGJvb2wgaXNWZWN0b3JMb2FkRXh0RGVzaXJhYmxlKFNEVmFsdWUgRXh0VmFsKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbiBmbmVnIG9wZXJhdGlvbiBpcyBmcmVlIHRvIHRoZSBwb2ludCB3aGVyZSBpdCBpcyBuZXZlcgorICAvLy8gd29ydGh3aGlsZSB0byByZXBsYWNlIGl0IHdpdGggYSBiaXR3aXNlIG9wZXJhdGlvbi4KKyAgdmlydHVhbCBib29sIGlzRk5lZ0ZyZWUoRVZUIFZUKSBjb25zdCB7CisgICAgYXNzZXJ0KFZULmlzRmxvYXRpbmdQb2ludCgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYW4gZmFicyBvcGVyYXRpb24gaXMgZnJlZSB0byB0aGUgcG9pbnQgd2hlcmUgaXQgaXMgbmV2ZXIKKyAgLy8vIHdvcnRod2hpbGUgdG8gcmVwbGFjZSBpdCB3aXRoIGEgYml0d2lzZSBvcGVyYXRpb24uCisgIHZpcnR1YWwgYm9vbCBpc0ZBYnNGcmVlKEVWVCBWVCkgY29uc3QgeworICAgIGFzc2VydChWVC5pc0Zsb2F0aW5nUG9pbnQoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGFuIEZNQSBvcGVyYXRpb24gaXMgZmFzdGVyIHRoYW4gYSBwYWlyIG9mIGZtdWwgYW5kIGZhZGQKKyAgLy8vIGluc3RydWN0aW9ucy4gZm11bGFkZCBpbnRyaW5zaWNzIHdpbGwgYmUgZXhwYW5kZWQgdG8gRk1BcyB3aGVuIHRoaXMgbWV0aG9kCisgIC8vLyByZXR1cm5zIHRydWUsIG90aGVyd2lzZSBmbXVsYWRkIGlzIGV4cGFuZGVkIHRvIGZtdWwgKyBmYWRkLgorICAvLy8KKyAgLy8vIE5PVEU6IFRoaXMgbWF5IGJlIGNhbGxlZCBiZWZvcmUgbGVnYWxpemF0aW9uIG9uIHR5cGVzIGZvciB3aGljaCBGTUFzIGFyZQorICAvLy8gbm90IGxlZ2FsLCBidXQgc2hvdWxkIHJldHVybiB0cnVlIGlmIHRob3NlIHR5cGVzIHdpbGwgZXZlbnR1YWxseSBsZWdhbGl6ZQorICAvLy8gdG8gdHlwZXMgdGhhdCBzdXBwb3J0IEZNQXMuIEFmdGVyIGxlZ2FsaXphdGlvbiwgaXQgd2lsbCBvbmx5IGJlIGNhbGxlZCBvbgorICAvLy8gdHlwZXMgdGhhdCBzdXBwb3J0IEZNQXMgKHZpYSBMZWdhbCBvciBDdXN0b20gYWN0aW9ucykKKyAgdmlydHVhbCBib29sIGlzRk1BRmFzdGVyVGhhbkZNdWxBbmRGQWRkKEVWVCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBpdCdzIHByb2ZpdGFibGUgdG8gbmFycm93IG9wZXJhdGlvbnMgb2YgdHlwZSBWVDEgdG8KKyAgLy8vIFZUMi4gZS5nLiBvbiB4ODYsIGl0J3MgcHJvZml0YWJsZSB0byBuYXJyb3cgZnJvbSBpMzIgdG8gaTggYnV0IG5vdCBmcm9tCisgIC8vLyBpMzIgdG8gaTE2LgorICB2aXJ0dWFsIGJvb2wgaXNOYXJyb3dpbmdQcm9maXRhYmxlKEVWVCAvKlZUMSovLCBFVlQgLypWVDIqLykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgaXQgaXMgYmVuZWZpY2lhbCB0byBjb252ZXJ0IGEgbG9hZCBvZiBhIGNvbnN0YW50IHRvCisgIC8vLyBqdXN0IHRoZSBjb25zdGFudCBpdHNlbGYuCisgIC8vLyBPbiBzb21lIHRhcmdldHMgaXQgbWlnaHQgYmUgbW9yZSBlZmZpY2llbnQgdG8gdXNlIGEgY29tYmluYXRpb24gb2YKKyAgLy8vIGFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zIHRvIG1hdGVyaWFsaXplIHRoZSBjb25zdGFudCBpbnN0ZWFkIG9mIGxvYWRpbmcgaXQKKyAgLy8vIGZyb20gYSBjb25zdGFudCBwb29sLgorICB2aXJ0dWFsIGJvb2wgc2hvdWxkQ29udmVydENvbnN0YW50TG9hZFRvSW50SW1tKGNvbnN0IEFQSW50ICZJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqVHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgRVhUUkFDVF9TVUJWRUNUT1IgaXMgY2hlYXAgZm9yIGV4dHJhY3RpbmcgdGhpcyByZXN1bHQgdHlwZQorICAvLy8gZnJvbSB0aGlzIHNvdXJjZSB0eXBlIHdpdGggdGhpcyBpbmRleC4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZQorICAvLy8gRVhUUkFDVF9TVUJWRUNUT1IgdXN1YWxseSBoYXMgY3VzdG9tIGxvd2VyaW5nIHRoYXQgZGVwZW5kcyBvbiB0aGUgaW5kZXggb2YKKyAgLy8vIHRoZSBmaXJzdCBlbGVtZW50LCBhbmQgb25seSB0aGUgdGFyZ2V0IGtub3dzIHdoaWNoIGxvd2VyaW5nIGlzIGNoZWFwLgorICB2aXJ0dWFsIGJvb2wgaXNFeHRyYWN0U3VidmVjdG9yQ2hlYXAoRVZUIFJlc1ZULCBFVlQgU3JjVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRleCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFJldHVybiB0cnVlIGlmIGl0IGlzIHByb2ZpdGFibGUgdG8gdXNlIGEgc2NhbGFyIGlucHV0IHRvIGEgQlVJTERfVkVDVE9SCisgIC8vIGV2ZW4gaWYgdGhlIHZlY3RvciBpdHNlbGYgaGFzIG11bHRpcGxlIHVzZXMuCisgIHZpcnR1YWwgYm9vbCBhZ2dyZXNzaXZlbHlQcmVmZXJCdWlsZFZlY3RvclNvdXJjZXMoRVZUIFZlY1ZUKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFJ1bnRpbWUgTGlicmFyeSBob29rcworICAvLworCisgIC8vLyBSZW5hbWUgdGhlIGRlZmF1bHQgbGliY2FsbCByb3V0aW5lIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgbGliY2FsbC4KKyAgdm9pZCBzZXRMaWJjYWxsTmFtZShSVExJQjo6TGliY2FsbCBDYWxsLCBjb25zdCBjaGFyICpOYW1lKSB7CisgICAgTGliY2FsbFJvdXRpbmVOYW1lc1tDYWxsXSA9IE5hbWU7CisgIH0KKworICAvLy8gR2V0IHRoZSBsaWJjYWxsIHJvdXRpbmUgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBsaWJjYWxsLgorICBjb25zdCBjaGFyICpnZXRMaWJjYWxsTmFtZShSVExJQjo6TGliY2FsbCBDYWxsKSBjb25zdCB7CisgICAgcmV0dXJuIExpYmNhbGxSb3V0aW5lTmFtZXNbQ2FsbF07CisgIH0KKworICAvLy8gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgQ29uZENvZGUgdG8gYmUgdXNlZCB0byB0ZXN0IHRoZSByZXN1bHQgb2YgdGhlCisgIC8vLyBjb21wYXJpc29uIGxpYmNhbGwgYWdhaW5zdCB6ZXJvLgorICB2b2lkIHNldENtcExpYmNhbGxDQyhSVExJQjo6TGliY2FsbCBDYWxsLCBJU0Q6OkNvbmRDb2RlIENDKSB7CisgICAgQ21wTGliY2FsbENDc1tDYWxsXSA9IENDOworICB9CisKKyAgLy8vIEdldCB0aGUgQ29uZENvZGUgdGhhdCdzIHRvIGJlIHVzZWQgdG8gdGVzdCB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uCisgIC8vLyBsaWJjYWxsIGFnYWluc3QgemVyby4KKyAgSVNEOjpDb25kQ29kZSBnZXRDbXBMaWJjYWxsQ0MoUlRMSUI6OkxpYmNhbGwgQ2FsbCkgY29uc3QgeworICAgIHJldHVybiBDbXBMaWJjYWxsQ0NzW0NhbGxdOworICB9CisKKyAgLy8vIFNldCB0aGUgQ2FsbGluZ0NvbnYgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHNwZWNpZmllZCBsaWJjYWxsLgorICB2b2lkIHNldExpYmNhbGxDYWxsaW5nQ29udihSVExJQjo6TGliY2FsbCBDYWxsLCBDYWxsaW5nQ29udjo6SUQgQ0MpIHsKKyAgICBMaWJjYWxsQ2FsbGluZ0NvbnZzW0NhbGxdID0gQ0M7CisgIH0KKworICAvLy8gR2V0IHRoZSBDYWxsaW5nQ29udiB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgc3BlY2lmaWVkIGxpYmNhbGwuCisgIENhbGxpbmdDb252OjpJRCBnZXRMaWJjYWxsQ2FsbGluZ0NvbnYoUlRMSUI6OkxpYmNhbGwgQ2FsbCkgY29uc3QgeworICAgIHJldHVybiBMaWJjYWxsQ2FsbGluZ0NvbnZzW0NhbGxdOworICB9CisKKyAgLy8vIEV4ZWN1dGUgdGFyZ2V0IHNwZWNpZmljIGFjdGlvbnMgdG8gZmluYWxpemUgdGFyZ2V0IGxvd2VyaW5nLgorICAvLy8gVGhpcyBpcyB1c2VkIHRvIHNldCBleHRyYSBmbGFncyBpbiBNYWNoaW5lRnJhbWVJbmZvcm1hdGlvbiBhbmQgZnJlZXppbmcKKyAgLy8vIHRoZSBzZXQgb2YgcmVzZXJ2ZWQgcmVnaXN0ZXJzLgorICAvLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCBmcmVlemVzIHRoZSBzZXQgb2YgcmVzZXJ2ZWQgcmVnaXN0ZXJzLgorICB2aXJ0dWFsIHZvaWQgZmluYWxpemVMb3dlcmluZyhNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworcHJpdmF0ZToKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE07CisKKyAgLy8vIFRlbGxzIHRoZSBjb2RlIGdlbmVyYXRvciB0aGF0IHRoZSB0YXJnZXQgaGFzIG11bHRpcGxlIChhbGxvY2F0YWJsZSkKKyAgLy8vIGNvbmRpdGlvbiByZWdpc3RlcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSB0aGUgcmVzdWx0cyBvZiBjb21wYXJpc29ucworICAvLy8gZm9yIHVzZSBieSBzZWxlY3RzIGFuZCBjb25kaXRpb25hbCBicmFuY2hlcy4gV2l0aCBtdWx0aXBsZSBjb25kaXRpb24KKyAgLy8vIHJlZ2lzdGVycywgdGhlIGNvZGUgZ2VuZXJhdG9yIHdpbGwgbm90IGFnZ3Jlc3NpdmVseSBzaW5rIGNvbXBhcmlzb25zIGludG8KKyAgLy8vIHRoZSBibG9ja3Mgb2YgdGhlaXIgdXNlcnMuCisgIGJvb2wgSGFzTXVsdGlwbGVDb25kaXRpb25SZWdpc3RlcnM7CisKKyAgLy8vIFRlbGxzIHRoZSBjb2RlIGdlbmVyYXRvciB0aGF0IHRoZSB0YXJnZXQgaGFzIEJpdEV4dHJhY3QgaW5zdHJ1Y3Rpb25zLgorICAvLy8gVGhlIGNvZGUgZ2VuZXJhdG9yIHdpbGwgYWdncmVzc2l2ZWx5IHNpbmsgInNoaWZ0InMgaW50byB0aGUgYmxvY2tzIG9mCisgIC8vLyB0aGVpciB1c2VycyBpZiB0aGUgdXNlcnMgd2lsbCBnZW5lcmF0ZSAiYW5kIiBpbnN0cnVjdGlvbnMgd2hpY2ggY2FuIGJlCisgIC8vLyBjb21iaW5lZCB3aXRoICJzaGlmdCIgdG8gQml0RXh0cmFjdCBpbnN0cnVjdGlvbnMuCisgIGJvb2wgSGFzRXh0cmFjdEJpdHNJbnNuOworCisgIC8vLyBUZWxscyB0aGUgY29kZSBnZW5lcmF0b3IgdG8gYnlwYXNzIHNsb3cgZGl2aWRlIG9yIHJlbWFpbmRlcgorICAvLy8gaW5zdHJ1Y3Rpb25zLiBGb3IgZXhhbXBsZSwgQnlwYXNzU2xvd0RpdldpZHRoc1szMiw4XSB0ZWxscyB0aGUgY29kZQorICAvLy8gZ2VuZXJhdG9yIHRvIGJ5cGFzcyAzMi1iaXQgaW50ZWdlciBkaXYvcmVtIHdpdGggYW4gOC1iaXQgdW5zaWduZWQgaW50ZWdlcgorICAvLy8gZGl2L3JlbSB3aGVuIHRoZSBvcGVyYW5kcyBhcmUgcG9zaXRpdmUgYW5kIGxlc3MgdGhhbiAyNTYuCisgIERlbnNlTWFwIDx1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludD4gQnlwYXNzU2xvd0RpdldpZHRoczsKKworICAvLy8gVGVsbHMgdGhlIGNvZGUgZ2VuZXJhdG9yIHRoYXQgaXQgc2hvdWxkbid0IGdlbmVyYXRlIGV4dHJhIGZsb3cgY29udHJvbAorICAvLy8gaW5zdHJ1Y3Rpb25zIGFuZCBzaG91bGQgYXR0ZW1wdCB0byBjb21iaW5lIGZsb3cgY29udHJvbCBpbnN0cnVjdGlvbnMgdmlhCisgIC8vLyBwcmVkaWNhdGlvbi4KKyAgYm9vbCBKdW1wSXNFeHBlbnNpdmU7CisKKyAgLy8vIFdoZXRoZXIgdGhlIHRhcmdldCBzdXBwb3J0cyBvciBjYXJlcyBhYm91dCBwcmVzZXJ2aW5nIGZsb2F0aW5nIHBvaW50CisgIC8vLyBleGNlcHRpb24gYmVoYXZpb3IuCisgIGJvb2wgSGFzRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM7CisKKyAgLy8vIFRoaXMgdGFyZ2V0IHByZWZlcnMgdG8gdXNlIF9zZXRqbXAgdG8gaW1wbGVtZW50IGxsdm0uc2V0am1wLgorICAvLy8KKyAgLy8vIERlZmF1bHRzIHRvIGZhbHNlLgorICBib29sIFVzZVVuZGVyc2NvcmVTZXRKbXA7CisKKyAgLy8vIFRoaXMgdGFyZ2V0IHByZWZlcnMgdG8gdXNlIF9sb25nam1wIHRvIGltcGxlbWVudCBsbHZtLmxvbmdqbXAuCisgIC8vLworICAvLy8gRGVmYXVsdHMgdG8gZmFsc2UuCisgIGJvb2wgVXNlVW5kZXJzY29yZUxvbmdKbXA7CisKKyAgLy8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250ZW50cyBvZiB0aGUgaGlnaC1iaXRzIGluIGJvb2xlYW4gdmFsdWVzIGhlbGQgaW4KKyAgLy8vIGEgdHlwZSB3aWRlciB0aGFuIGkxLiBTZWUgZ2V0Qm9vbGVhbkNvbnRlbnRzLgorICBCb29sZWFuQ29udGVudCBCb29sZWFuQ29udGVudHM7CisKKyAgLy8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250ZW50cyBvZiB0aGUgaGlnaC1iaXRzIGluIGJvb2xlYW4gdmFsdWVzIGhlbGQgaW4KKyAgLy8vIGEgdHlwZSB3aWRlciB0aGFuIGkxLiBTZWUgZ2V0Qm9vbGVhbkNvbnRlbnRzLgorICBCb29sZWFuQ29udGVudCBCb29sZWFuRmxvYXRDb250ZW50czsKKworICAvLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBoaWdoLWJpdHMgaW4gYm9vbGVhbiB2ZWN0b3IgdmFsdWVzCisgIC8vLyB3aGVuIHRoZSBlbGVtZW50IHR5cGUgaXMgd2lkZXIgdGhhbiBpMS4gU2VlIGdldEJvb2xlYW5Db250ZW50cy4KKyAgQm9vbGVhbkNvbnRlbnQgQm9vbGVhblZlY3RvckNvbnRlbnRzOworCisgIC8vLyBUaGUgdGFyZ2V0IHNjaGVkdWxpbmcgcHJlZmVyZW5jZTogc2hvcnRlc3QgcG9zc2libGUgdG90YWwgY3ljbGVzIG9yIGxvd2VzdAorICAvLy8gcmVnaXN0ZXIgdXNhZ2UuCisgIFNjaGVkOjpQcmVmZXJlbmNlIFNjaGVkUHJlZmVyZW5jZUluZm87CisKKyAgLy8vIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHRhcmdldCdzIGptcF9idWYgYnVmZmVycworICB1bnNpZ25lZCBKdW1wQnVmU2l6ZTsKKworICAvLy8gVGhlIGFsaWdubWVudCwgaW4gYnl0ZXMsIG9mIHRoZSB0YXJnZXQncyBqbXBfYnVmIGJ1ZmZlcnMKKyAgdW5zaWduZWQgSnVtcEJ1ZkFsaWdubWVudDsKKworICAvLy8gVGhlIG1pbmltdW0gYWxpZ25tZW50IHRoYXQgYW55IGFyZ3VtZW50IG9uIHRoZSBzdGFjayBuZWVkcyB0byBoYXZlLgorICB1bnNpZ25lZCBNaW5TdGFja0FyZ3VtZW50QWxpZ25tZW50OworCisgIC8vLyBUaGUgbWluaW11bSBmdW5jdGlvbiBhbGlnbm1lbnQgKHVzZWQgd2hlbiBvcHRpbWl6aW5nIGZvciBzaXplLCBhbmQgdG8KKyAgLy8vIHByZXZlbnQgZXhwbGljaXRseSBwcm92aWRlZCBhbGlnbm1lbnQgZnJvbSBsZWFkaW5nIHRvIGluY29ycmVjdCBjb2RlKS4KKyAgdW5zaWduZWQgTWluRnVuY3Rpb25BbGlnbm1lbnQ7CisKKyAgLy8vIFRoZSBwcmVmZXJyZWQgZnVuY3Rpb24gYWxpZ25tZW50ICh1c2VkIHdoZW4gYWxpZ25tZW50IHVuc3BlY2lmaWVkIGFuZAorICAvLy8gb3B0aW1pemluZyBmb3Igc3BlZWQpLgorICB1bnNpZ25lZCBQcmVmRnVuY3Rpb25BbGlnbm1lbnQ7CisKKyAgLy8vIFRoZSBwcmVmZXJyZWQgbG9vcCBhbGlnbm1lbnQuCisgIHVuc2lnbmVkIFByZWZMb29wQWxpZ25tZW50OworCisgIC8vLyBTaXplIGluIGJpdHMgb2YgdGhlIG1heGltdW0gYXRvbWljcyBzaXplIHRoZSBiYWNrZW5kIHN1cHBvcnRzLgorICAvLy8gQWNjZXNzZXMgbGFyZ2VyIHRoYW4gdGhpcyB3aWxsIGJlIGV4cGFuZGVkIGJ5IEF0b21pY0V4cGFuZFBhc3MuCisgIHVuc2lnbmVkIE1heEF0b21pY1NpemVJbkJpdHNTdXBwb3J0ZWQ7CisKKyAgLy8vIFNpemUgaW4gYml0cyBvZiB0aGUgbWluaW11bSBjbXB4Y2hnIG9yIGxsL3NjIG9wZXJhdGlvbiB0aGUKKyAgLy8vIGJhY2tlbmQgc3VwcG9ydHMuCisgIHVuc2lnbmVkIE1pbkNtcFhjaGdTaXplSW5CaXRzOworCisgIC8vLyBUaGlzIGluZGljYXRlcyBpZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIHVuYWxpZ25lZCBhdG9taWMgb3BlcmF0aW9ucy4KKyAgYm9vbCBTdXBwb3J0c1VuYWxpZ25lZEF0b21pY3M7CisKKyAgLy8vIElmIHNldCB0byBhIHBoeXNpY2FsIHJlZ2lzdGVyLCB0aGlzIHNwZWNpZmllcyB0aGUgcmVnaXN0ZXIgdGhhdAorICAvLy8gbGx2bS5zYXZlc3RhY2svbGx2bS5yZXN0b3Jlc3RhY2sgc2hvdWxkIHNhdmUgYW5kIHJlc3RvcmUuCisgIHVuc2lnbmVkIFN0YWNrUG9pbnRlclJlZ2lzdGVyVG9TYXZlUmVzdG9yZTsKKworICAvLy8gVGhpcyBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQgcmVnaXN0ZXIgY2xhc3MgdG8gdXNlIGZvciBlYWNoIFZhbHVlVHlwZSB0aGUKKyAgLy8vIHRhcmdldCBzdXBwb3J0cyBuYXRpdmVseS4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUmVnQ2xhc3NGb3JWVFtNVlQ6OkxBU1RfVkFMVUVUWVBFXTsKKyAgdW5zaWduZWQgY2hhciBOdW1SZWdpc3RlcnNGb3JWVFtNVlQ6OkxBU1RfVkFMVUVUWVBFXTsKKyAgTVZUIFJlZ2lzdGVyVHlwZUZvclZUW01WVDo6TEFTVF9WQUxVRVRZUEVdOworCisgIC8vLyBUaGlzIGluZGljYXRlcyB0aGUgInJlcHJlc2VudGF0aXZlIiByZWdpc3RlciBjbGFzcyB0byB1c2UgZm9yIGVhY2gKKyAgLy8vIFZhbHVlVHlwZSB0aGUgdGFyZ2V0IHN1cHBvcnRzIG5hdGl2ZWx5LiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgYnkgdGhlCisgIC8vLyBzY2hlZHVsZXIgdG8gdHJhY2sgcmVnaXN0ZXIgcHJlc3N1cmUuIEJ5IGRlZmF1bHQsIHRoZSByZXByZXNlbnRhdGl2ZQorICAvLy8gcmVnaXN0ZXIgY2xhc3MgaXMgdGhlIGxhcmdlc3QgbGVnYWwgc3VwZXItcmVnIHJlZ2lzdGVyIGNsYXNzIG9mIHRoZQorICAvLy8gcmVnaXN0ZXIgY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCB0eXBlLiBlLmcuIE9uIHg4NiwgaTgsIGkxNiwgYW5kIGkzMidzCisgIC8vLyByZXByZXNlbnRhdGl2ZSBjbGFzcyB3b3VsZCBiZSBHUjMyLgorICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSZXBSZWdDbGFzc0ZvclZUW01WVDo6TEFTVF9WQUxVRVRZUEVdOworCisgIC8vLyBUaGlzIGluZGljYXRlcyB0aGUgImNvc3QiIG9mIHRoZSAicmVwcmVzZW50YXRpdmUiIHJlZ2lzdGVyIGNsYXNzIGZvciBlYWNoCisgIC8vLyBWYWx1ZVR5cGUuIFRoZSBjb3N0IGlzIHVzZWQgYnkgdGhlIHNjaGVkdWxlciB0byBhcHByb3hpbWF0ZSByZWdpc3RlcgorICAvLy8gcHJlc3N1cmUuCisgIHVpbnQ4X3QgUmVwUmVnQ2xhc3NDb3N0Rm9yVlRbTVZUOjpMQVNUX1ZBTFVFVFlQRV07CisKKyAgLy8vIEZvciBhbnkgdmFsdWUgdHlwZXMgd2UgYXJlIHByb21vdGluZyBvciBleHBhbmRpbmcsIHRoaXMgY29udGFpbnMgdGhlIHZhbHVlCisgIC8vLyB0eXBlIHRoYXQgd2UgYXJlIGNoYW5naW5nIHRvLiAgRm9yIEV4cGFuZGVkIHR5cGVzLCB0aGlzIGNvbnRhaW5zIG9uZSBzdGVwCisgIC8vLyBvZiB0aGUgZXhwYW5kIChlLmcuIGk2NCAtPiBpMzIpLCBldmVuIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBzdGVwcyByZXF1aXJlZAorICAvLy8gKGUuZy4gaTY0IC0+IGkxNikuICBGb3IgdHlwZXMgbmF0aXZlbHkgc3VwcG9ydGVkIGJ5IHRoZSBzeXN0ZW0sIHRoaXMgaG9sZHMKKyAgLy8vIHRoZSBzYW1lIHR5cGUgKGUuZy4gaTMyIC0+IGkzMikuCisgIE1WVCBUcmFuc2Zvcm1Ub1R5cGVbTVZUOjpMQVNUX1ZBTFVFVFlQRV07CisKKyAgLy8vIEZvciBlYWNoIG9wZXJhdGlvbiBhbmQgZWFjaCB2YWx1ZSB0eXBlLCBrZWVwIGEgTGVnYWxpemVBY3Rpb24gdGhhdAorICAvLy8gaW5kaWNhdGVzIGhvdyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gc2hvdWxkIGRlYWwgd2l0aCB0aGUgb3BlcmF0aW9uLiAgTW9zdAorICAvLy8gb3BlcmF0aW9ucyBhcmUgTGVnYWwgKGFrYSwgc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IHRoZSB0YXJnZXQpLCBidXQKKyAgLy8vIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHNob3VsZCBiZSBkZXNjcmliZWQuICBOb3RlIHRoYXQgb3BlcmF0aW9ucyBvbgorICAvLy8gbm9uLWxlZ2FsIHZhbHVlIHR5cGVzIGFyZSBub3QgZGVzY3JpYmVkIGhlcmUuCisgIExlZ2FsaXplQWN0aW9uIE9wQWN0aW9uc1tNVlQ6OkxBU1RfVkFMVUVUWVBFXVtJU0Q6OkJVSUxUSU5fT1BfRU5EXTsKKworICAvLy8gRm9yIGVhY2ggbG9hZCBleHRlbnNpb24gdHlwZSBhbmQgZWFjaCB2YWx1ZSB0eXBlLCBrZWVwIGEgTGVnYWxpemVBY3Rpb24KKyAgLy8vIHRoYXQgaW5kaWNhdGVzIGhvdyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gc2hvdWxkIGRlYWwgd2l0aCBhIGxvYWQgb2YgYQorICAvLy8gc3BlY2lmaWMgdmFsdWUgdHlwZSBhbmQgZXh0ZW5zaW9uIHR5cGUuIFVzZXMgNC1iaXRzIHRvIHN0b3JlIHRoZSBhY3Rpb24KKyAgLy8vIGZvciBlYWNoIG9mIHRoZSA0IGxvYWQgZXh0IHR5cGVzLgorICB1aW50MTZfdCBMb2FkRXh0QWN0aW9uc1tNVlQ6OkxBU1RfVkFMVUVUWVBFXVtNVlQ6OkxBU1RfVkFMVUVUWVBFXTsKKworICAvLy8gRm9yIGVhY2ggdmFsdWUgdHlwZSBwYWlyIGtlZXAgYSBMZWdhbGl6ZUFjdGlvbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGEKKyAgLy8vIHRydW5jYXRpbmcgc3RvcmUgb2YgYSBzcGVjaWZpYyB2YWx1ZSB0eXBlIGFuZCB0cnVuY2F0aW5nIHR5cGUgaXMgbGVnYWwuCisgIExlZ2FsaXplQWN0aW9uIFRydW5jU3RvcmVBY3Rpb25zW01WVDo6TEFTVF9WQUxVRVRZUEVdW01WVDo6TEFTVF9WQUxVRVRZUEVdOworCisgIC8vLyBGb3IgZWFjaCBpbmRleGVkIG1vZGUgYW5kIGVhY2ggdmFsdWUgdHlwZSwga2VlcCBhIHBhaXIgb2YgTGVnYWxpemVBY3Rpb24KKyAgLy8vIHRoYXQgaW5kaWNhdGVzIGhvdyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gc2hvdWxkIGRlYWwgd2l0aCB0aGUgbG9hZCAvCisgIC8vLyBzdG9yZS4KKyAgLy8vCisgIC8vLyBUaGUgZmlyc3QgZGltZW5zaW9uIGlzIHRoZSB2YWx1ZV90eXBlIGZvciB0aGUgcmVmZXJlbmNlLiBUaGUgc2Vjb25kCisgIC8vLyBkaW1lbnNpb24gcmVwcmVzZW50cyB0aGUgdmFyaW91cyBtb2RlcyBmb3IgbG9hZCBzdG9yZS4KKyAgdWludDhfdCBJbmRleGVkTW9kZUFjdGlvbnNbTVZUOjpMQVNUX1ZBTFVFVFlQRV1bSVNEOjpMQVNUX0lOREVYRURfTU9ERV07CisKKyAgLy8vIEZvciBlYWNoIGNvbmRpdGlvbiBjb2RlIChJU0Q6OkNvbmRDb2RlKSBrZWVwIGEgTGVnYWxpemVBY3Rpb24gdGhhdAorICAvLy8gaW5kaWNhdGVzIGhvdyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gc2hvdWxkIGRlYWwgd2l0aCB0aGUgY29uZGl0aW9uIGNvZGUuCisgIC8vLworICAvLy8gQmVjYXVzZSBlYWNoIENDIGFjdGlvbiB0YWtlcyB1cCA0IGJpdHMsIHdlIG5lZWQgdG8gaGF2ZSB0aGUgYXJyYXkgc2l6ZSBiZQorICAvLy8gbGFyZ2UgZW5vdWdoIHRvIGZpdCBhbGwgb2YgdGhlIHZhbHVlIHR5cGVzLiBUaGlzIGNhbiBiZSBkb25lIGJ5IHJvdW5kaW5nCisgIC8vLyB1cCB0aGUgTVZUOjpMQVNUX1ZBTFVFVFlQRSB2YWx1ZSB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiA4LgorICB1aW50MzJfdCBDb25kQ29kZUFjdGlvbnNbSVNEOjpTRVRDQ19JTlZBTElEXVsoTVZUOjpMQVNUX1ZBTFVFVFlQRSArIDcpIC8gOF07CisKK3Byb3RlY3RlZDoKKyAgVmFsdWVUeXBlQWN0aW9uSW1wbCBWYWx1ZVR5cGVBY3Rpb25zOworCitwcml2YXRlOgorICBMZWdhbGl6ZUtpbmQgZ2V0VHlwZUNvbnZlcnNpb24oTExWTUNvbnRleHQgJkNvbnRleHQsIEVWVCBWVCkgY29uc3Q7CisKKyAgLy8vIFRhcmdldHMgY2FuIHNwZWNpZnkgSVNEIG5vZGVzIHRoYXQgdGhleSB3b3VsZCBsaWtlIFBlcmZvcm1EQUdDb21iaW5lCisgIC8vLyBjYWxsYmFja3MgZm9yIGJ5IGNhbGxpbmcgc2V0VGFyZ2V0REFHQ29tYmluZSgpLCB3aGljaCBzZXRzIGEgYml0IGluIHRoaXMKKyAgLy8vIGFycmF5LgorICB1bnNpZ25lZCBjaGFyCisgIFRhcmdldERBR0NvbWJpbmVBcnJheVsoSVNEOjpCVUlMVElOX09QX0VORCtDSEFSX0JJVC0xKS9DSEFSX0JJVF07CisKKyAgLy8vIEZvciBvcGVyYXRpb25zIHRoYXQgbXVzdCBiZSBwcm9tb3RlZCB0byBhIHNwZWNpZmljIHR5cGUsIHRoaXMgaG9sZHMgdGhlCisgIC8vLyBkZXN0aW5hdGlvbiB0eXBlLiAgVGhpcyBtYXAgc2hvdWxkIGJlIHNwYXJzZSwgc28gZG9uJ3QgaG9sZCBpdCBhcyBhbgorICAvLy8gYXJyYXkuCisgIC8vLworICAvLy8gVGFyZ2V0cyBhZGQgZW50cmllcyB0byB0aGlzIG1hcCB3aXRoIEFkZFByb21vdGVkVG9UeXBlKC4uKSwgY2xpZW50cyBhY2Nlc3MKKyAgLy8vIHRoaXMgd2l0aCBnZXRUeXBlVG9Qcm9tb3RlVG8oLi4pLgorICBzdGQ6Om1hcDxzdGQ6OnBhaXI8dW5zaWduZWQsIE1WVDo6U2ltcGxlVmFsdWVUeXBlPiwgTVZUOjpTaW1wbGVWYWx1ZVR5cGU+CisgICAgUHJvbW90ZVRvVHlwZTsKKworICAvLy8gU3RvcmVzIHRoZSBuYW1lIGVhY2ggbGliY2FsbC4KKyAgY29uc3QgY2hhciAqTGliY2FsbFJvdXRpbmVOYW1lc1tSVExJQjo6VU5LTk9XTl9MSUJDQUxMICsgMV07CisKKyAgLy8vIFRoZSBJU0Q6OkNvbmRDb2RlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gdGVzdCB0aGUgcmVzdWx0IG9mIGVhY2ggb2YgdGhlCisgIC8vLyBjb21wYXJpc29uIGxpYmNhbGwgYWdhaW5zdCB6ZXJvLgorICBJU0Q6OkNvbmRDb2RlIENtcExpYmNhbGxDQ3NbUlRMSUI6OlVOS05PV05fTElCQ0FMTF07CisKKyAgLy8vIFN0b3JlcyB0aGUgQ2FsbGluZ0NvbnYgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgZWFjaCBsaWJjYWxsLgorICBDYWxsaW5nQ29udjo6SUQgTGliY2FsbENhbGxpbmdDb252c1tSVExJQjo6VU5LTk9XTl9MSUJDQUxMXTsKKworICAvLy8gU2V0IGRlZmF1bHQgbGliY2FsbCBuYW1lcyBhbmQgY2FsbGluZyBjb252ZW50aW9ucy4KKyAgdm9pZCBJbml0TGliY2FsbHMoY29uc3QgVHJpcGxlICZUVCk7CisKK3Byb3RlY3RlZDoKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBleHRlbnNpb24gcmVwcmVzZW50ZWQgYnkgXHAgSSBpcyBmcmVlLgorICAvLy8gXHByZSBccCBJIGlzIGEgc2lnbiwgemVybywgb3IgZnAgZXh0ZW5zaW9uIGFuZAorICAvLy8gICAgICBpc1tafEZQXUV4dEZyZWUgb2YgdGhlIHJlbGF0ZWQgdHlwZXMgaXMgbm90IHRydWUuCisgIHZpcnR1YWwgYm9vbCBpc0V4dEZyZWVJbXBsKGNvbnN0IEluc3RydWN0aW9uICpJKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBEZXB0aCB0aGF0IEdhdGhlckFsbEFsaWFzZXMgc2hvdWxkIHNob3VsZCBjb250aW51ZSBsb29raW5nIGZvciBjaGFpbgorICAvLy8gZGVwZW5kZW5jaWVzIHdoZW4gdHJ5aW5nIHRvIGZpbmQgYSBtb3JlIHByZWZlcmFibGUgY2hhaW4uIEFzIGFuCisgIC8vLyBhcHByb3hpbWF0aW9uLCB0aGlzIHNob3VsZCBiZSBtb3JlIHRoYW4gdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBzdG9yZXMKKyAgLy8vIGV4cGVjdGVkIHRvIGJlIG1lcmdlZC4KKyAgdW5zaWduZWQgR2F0aGVyQWxsQWxpYXNlc01heERlcHRoOworCisgIC8vLyBcYnJpZWYgU3BlY2lmeSBtYXhpbXVtIG51bWJlciBvZiBzdG9yZSBpbnN0cnVjdGlvbnMgcGVyIG1lbXNldCBjYWxsLgorICAvLy8KKyAgLy8vIFdoZW4gbG93ZXJpbmcgXEBsbHZtLm1lbXNldCB0aGlzIGZpZWxkIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKKyAgLy8vIHN0b3JlIG9wZXJhdGlvbnMgdGhhdCBtYXkgYmUgc3Vic3RpdHV0ZWQgZm9yIHRoZSBjYWxsIHRvIG1lbXNldC4gVGFyZ2V0cworICAvLy8gbXVzdCBzZXQgdGhpcyB2YWx1ZSBiYXNlZCBvbiB0aGUgY29zdCB0aHJlc2hvbGQgZm9yIHRoYXQgdGFyZ2V0LiBUYXJnZXRzCisgIC8vLyBzaG91bGQgYXNzdW1lIHRoYXQgdGhlIG1lbXNldCB3aWxsIGJlIGRvbmUgdXNpbmcgYXMgbWFueSBvZiB0aGUgbGFyZ2VzdAorICAvLy8gc3RvcmUgb3BlcmF0aW9ucyBmaXJzdCwgZm9sbG93ZWQgYnkgc21hbGxlciBvbmVzLCBpZiBuZWNlc3NhcnksIHBlcgorICAvLy8gYWxpZ25tZW50IHJlc3RyaWN0aW9ucy4gRm9yIGV4YW1wbGUsIHN0b3JpbmcgOSBieXRlcyBvbiBhIDMyLWJpdCBtYWNoaW5lCisgIC8vLyB3aXRoIDE2LWJpdCBhbGlnbm1lbnQgd291bGQgcmVzdWx0IGluIGZvdXIgMi1ieXRlIHN0b3JlcyBhbmQgb25lIDEtYnl0ZQorICAvLy8gc3RvcmUuICBUaGlzIG9ubHkgYXBwbGllcyB0byBzZXR0aW5nIGEgY29uc3RhbnQgYXJyYXkgb2YgYSBjb25zdGFudCBzaXplLgorICB1bnNpZ25lZCBNYXhTdG9yZXNQZXJNZW1zZXQ7CisKKyAgLy8vIE1heGltdW0gbnVtYmVyIG9mIHN0b3JlcyBvcGVyYXRpb25zIHRoYXQgbWF5IGJlIHN1YnN0aXR1dGVkIGZvciB0aGUgY2FsbAorICAvLy8gdG8gbWVtc2V0LCB1c2VkIGZvciBmdW5jdGlvbnMgd2l0aCBPcHRTaXplIGF0dHJpYnV0ZS4KKyAgdW5zaWduZWQgTWF4U3RvcmVzUGVyTWVtc2V0T3B0U2l6ZTsKKworICAvLy8gXGJyaWVmIFNwZWNpZnkgbWF4aW11bSBieXRlcyBvZiBzdG9yZSBpbnN0cnVjdGlvbnMgcGVyIG1lbWNweSBjYWxsLgorICAvLy8KKyAgLy8vIFdoZW4gbG93ZXJpbmcgXEBsbHZtLm1lbWNweSB0aGlzIGZpZWxkIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKKyAgLy8vIHN0b3JlIG9wZXJhdGlvbnMgdGhhdCBtYXkgYmUgc3Vic3RpdHV0ZWQgZm9yIGEgY2FsbCB0byBtZW1jcHkuIFRhcmdldHMKKyAgLy8vIG11c3Qgc2V0IHRoaXMgdmFsdWUgYmFzZWQgb24gdGhlIGNvc3QgdGhyZXNob2xkIGZvciB0aGF0IHRhcmdldC4gVGFyZ2V0cworICAvLy8gc2hvdWxkIGFzc3VtZSB0aGF0IHRoZSBtZW1jcHkgd2lsbCBiZSBkb25lIHVzaW5nIGFzIG1hbnkgb2YgdGhlIGxhcmdlc3QKKyAgLy8vIHN0b3JlIG9wZXJhdGlvbnMgZmlyc3QsIGZvbGxvd2VkIGJ5IHNtYWxsZXIgb25lcywgaWYgbmVjZXNzYXJ5LCBwZXIKKyAgLy8vIGFsaWdubWVudCByZXN0cmljdGlvbnMuIEZvciBleGFtcGxlLCBzdG9yaW5nIDcgYnl0ZXMgb24gYSAzMi1iaXQgbWFjaGluZQorICAvLy8gd2l0aCAzMi1iaXQgYWxpZ25tZW50IHdvdWxkIHJlc3VsdCBpbiBvbmUgNC1ieXRlIHN0b3JlLCBhIG9uZSAyLWJ5dGUgc3RvcmUKKyAgLy8vIGFuZCBvbmUgMS1ieXRlIHN0b3JlLiBUaGlzIG9ubHkgYXBwbGllcyB0byBjb3B5aW5nIGEgY29uc3RhbnQgYXJyYXkgb2YKKyAgLy8vIGNvbnN0YW50IHNpemUuCisgIHVuc2lnbmVkIE1heFN0b3Jlc1Blck1lbWNweTsKKworICAvLy8gTWF4aW11bSBudW1iZXIgb2Ygc3RvcmUgb3BlcmF0aW9ucyB0aGF0IG1heSBiZSBzdWJzdGl0dXRlZCBmb3IgYSBjYWxsIHRvCisgIC8vLyBtZW1jcHksIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aXRoIE9wdFNpemUgYXR0cmlidXRlLgorICB1bnNpZ25lZCBNYXhTdG9yZXNQZXJNZW1jcHlPcHRTaXplOworICB1bnNpZ25lZCBNYXhMb2Fkc1Blck1lbWNtcDsKKyAgdW5zaWduZWQgTWF4TG9hZHNQZXJNZW1jbXBPcHRTaXplOworCisgIC8vLyBcYnJpZWYgU3BlY2lmeSBtYXhpbXVtIGJ5dGVzIG9mIHN0b3JlIGluc3RydWN0aW9ucyBwZXIgbWVtbW92ZSBjYWxsLgorICAvLy8KKyAgLy8vIFdoZW4gbG93ZXJpbmcgXEBsbHZtLm1lbW1vdmUgdGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mCisgIC8vLyBzdG9yZSBpbnN0cnVjdGlvbnMgdGhhdCBtYXkgYmUgc3Vic3RpdHV0ZWQgZm9yIGEgY2FsbCB0byBtZW1tb3ZlLiBUYXJnZXRzCisgIC8vLyBtdXN0IHNldCB0aGlzIHZhbHVlIGJhc2VkIG9uIHRoZSBjb3N0IHRocmVzaG9sZCBmb3IgdGhhdCB0YXJnZXQuIFRhcmdldHMKKyAgLy8vIHNob3VsZCBhc3N1bWUgdGhhdCB0aGUgbWVtbW92ZSB3aWxsIGJlIGRvbmUgdXNpbmcgYXMgbWFueSBvZiB0aGUgbGFyZ2VzdAorICAvLy8gc3RvcmUgb3BlcmF0aW9ucyBmaXJzdCwgZm9sbG93ZWQgYnkgc21hbGxlciBvbmVzLCBpZiBuZWNlc3NhcnksIHBlcgorICAvLy8gYWxpZ25tZW50IHJlc3RyaWN0aW9ucy4gRm9yIGV4YW1wbGUsIG1vdmluZyA5IGJ5dGVzIG9uIGEgMzItYml0IG1hY2hpbmUKKyAgLy8vIHdpdGggOC1iaXQgYWxpZ25tZW50IHdvdWxkIHJlc3VsdCBpbiBuaW5lIDEtYnl0ZSBzdG9yZXMuICBUaGlzIG9ubHkKKyAgLy8vIGFwcGxpZXMgdG8gY29weWluZyBhIGNvbnN0YW50IGFycmF5IG9mIGNvbnN0YW50IHNpemUuCisgIHVuc2lnbmVkIE1heFN0b3Jlc1Blck1lbW1vdmU7CisKKyAgLy8vIE1heGltdW0gbnVtYmVyIG9mIHN0b3JlIGluc3RydWN0aW9ucyB0aGF0IG1heSBiZSBzdWJzdGl0dXRlZCBmb3IgYSBjYWxsIHRvCisgIC8vLyBtZW1tb3ZlLCB1c2VkIGZvciBmdW5jdGlvbnMgd2l0aCBPcHRTaXplIGF0dHJpYnV0ZS4KKyAgdW5zaWduZWQgTWF4U3RvcmVzUGVyTWVtbW92ZU9wdFNpemU7CisKKyAgLy8vIFRlbGxzIHRoZSBjb2RlIGdlbmVyYXRvciB0aGF0IHNlbGVjdCBpcyBtb3JlIGV4cGVuc2l2ZSB0aGFuIGEgYnJhbmNoIGlmCisgIC8vLyB0aGUgYnJhbmNoIGlzIHVzdWFsbHkgcHJlZGljdGVkIHJpZ2h0LgorICBib29sIFByZWRpY3RhYmxlU2VsZWN0SXNFeHBlbnNpdmU7CisKKyAgLy8vIFxzZWUgZW5hYmxlRXh0TGRQcm9tb3Rpb24uCisgIGJvb2wgRW5hYmxlRXh0TGRQcm9tb3Rpb247CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSB0eXBlcyB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBieSB0aGUgc3BlY2lmaWVkCisgIC8vLyByZWdpc3RlciBjbGFzcyBhcmUgYWxsIGxlZ2FsLgorICBib29sIGlzTGVnYWxSQyhjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSwKKyAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAmUkMpIGNvbnN0OworCisgIC8vLyBSZXBsYWNlL21vZGlmeSBhbnkgVGFyZ2V0RnJhbWVJbmRleCBvcGVyYW5kcyB3aXRoIGEgdGFyZ3RlLWRlcGVuZGVudAorICAvLy8gc2VxdWVuY2Ugb2YgbWVtb3J5IG9wZXJhbmRzIHRoYXQgaXMgcmVjb2duaXplZCBieSBQcm9sb2dFcGlsb2dJbnNlcnRlci4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKmVtaXRQYXRjaFBvaW50KE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKKworICAvLy8gUmVwbGFjZS9tb2RpZnkgdGhlIFhSYXkgY3VzdG9tIGV2ZW50IG9wZXJhbmRzIHdpdGggdGFyZ2V0LWRlcGVuZGVudAorICAvLy8gZGV0YWlscy4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKmVtaXRYUmF5Q3VzdG9tRXZlbnQoTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3Q7Cit9OworCisvLy8gVGhpcyBjbGFzcyBkZWZpbmVzIGluZm9ybWF0aW9uIHVzZWQgdG8gbG93ZXIgTExWTSBjb2RlIHRvIGxlZ2FsIFNlbGVjdGlvbkRBRworLy8vIG9wZXJhdG9ycyB0aGF0IHRoZSB0YXJnZXQgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IgY2FuIGFjY2VwdCBuYXRpdmVseS4KKy8vLworLy8vIFRoaXMgY2xhc3MgYWxzbyBkZWZpbmVzIGNhbGxiYWNrcyB0aGF0IHRhcmdldHMgbXVzdCBpbXBsZW1lbnQgdG8gbG93ZXIKKy8vLyB0YXJnZXQtc3BlY2lmaWMgY29uc3RydWN0cyB0byBTZWxlY3Rpb25EQUcgb3BlcmF0b3JzLgorY2xhc3MgVGFyZ2V0TG93ZXJpbmcgOiBwdWJsaWMgVGFyZ2V0TG93ZXJpbmdCYXNlIHsKK3B1YmxpYzoKKyAgc3RydWN0IERBR0NvbWJpbmVySW5mbzsKKworICBUYXJnZXRMb3dlcmluZyhjb25zdCBUYXJnZXRMb3dlcmluZyAmKSA9IGRlbGV0ZTsKKyAgVGFyZ2V0TG93ZXJpbmcgJm9wZXJhdG9yPShjb25zdCBUYXJnZXRMb3dlcmluZyAmKSA9IGRlbGV0ZTsKKworICAvLy8gTk9URTogVGhlIFRhcmdldE1hY2hpbmUgb3ducyBUTE9GLgorICBleHBsaWNpdCBUYXJnZXRMb3dlcmluZyhjb25zdCBUYXJnZXRNYWNoaW5lICZUTSk7CisKKyAgYm9vbCBpc1Bvc2l0aW9uSW5kZXBlbmRlbnQoKSBjb25zdDsKKworICB2aXJ0dWFsIGJvb2wgaXNTRE5vZGVTb3VyY2VPZkRpdmVyZ2VuY2UoY29uc3QgU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25Mb3dlcmluZ0luZm8gKkZMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpdmVyZ2VuY2VBbmFseXNpcyAqREEpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgaXNTRE5vZGVBbHdheXNVbmlmb3JtKGNvbnN0IFNETm9kZSAqIE4pIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGJ5IHZhbHVlLCBiYXNlIHBvaW50ZXIgYW5kIG9mZnNldCBwb2ludGVyIGFuZCBhZGRyZXNzaW5nIG1vZGUKKyAgLy8vIGJ5IHJlZmVyZW5jZSBpZiB0aGUgbm9kZSdzIGFkZHJlc3MgY2FuIGJlIGxlZ2FsbHkgcmVwcmVzZW50ZWQgYXMKKyAgLy8vIHByZS1pbmRleGVkIGxvYWQgLyBzdG9yZSBhZGRyZXNzLgorICB2aXJ0dWFsIGJvb2wgZ2V0UHJlSW5kZXhlZEFkZHJlc3NQYXJ0cyhTRE5vZGUgKiAvKk4qLywgU0RWYWx1ZSAmLypCYXNlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJi8qT2Zmc2V0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6TWVtSW5kZXhlZE1vZGUgJi8qQU0qLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICYvKkRBRyovKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBieSB2YWx1ZSwgYmFzZSBwb2ludGVyIGFuZCBvZmZzZXQgcG9pbnRlciBhbmQgYWRkcmVzc2luZyBtb2RlCisgIC8vLyBieSByZWZlcmVuY2UgaWYgdGhpcyBub2RlIGNhbiBiZSBjb21iaW5lZCB3aXRoIGEgbG9hZCAvIHN0b3JlIHRvIGZvcm0gYQorICAvLy8gcG9zdC1pbmRleGVkIGxvYWQgLyBzdG9yZS4KKyAgdmlydHVhbCBib29sIGdldFBvc3RJbmRleGVkQWRkcmVzc1BhcnRzKFNETm9kZSAqIC8qTiovLCBTRE5vZGUgKiAvKk9wKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICYvKkJhc2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJi8qT2Zmc2V0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6Ok1lbUluZGV4ZWRNb2RlICYvKkFNKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJi8qREFHKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBlbnRyeSBlbmNvZGluZyBmb3IgYSBqdW1wIHRhYmxlIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgVGhlCisgIC8vLyByZXR1cm5lZCB2YWx1ZSBpcyBhIG1lbWJlciBvZiB0aGUgTWFjaGluZUp1bXBUYWJsZUluZm86OkpURW50cnlLaW5kIGVudW0uCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SnVtcFRhYmxlRW5jb2RpbmcoKSBjb25zdDsKKworICB2aXJ0dWFsIGNvbnN0IE1DRXhwciAqCisgIExvd2VyQ3VzdG9tSnVtcFRhYmxlRW50cnkoY29uc3QgTWFjaGluZUp1bXBUYWJsZUluZm8gKiAvKk1KVEkqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqIC8qTUJCKi8sIHVuc2lnbmVkIC8qdWlkKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICYvKkN0eCovKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiTmVlZCB0byBpbXBsZW1lbnQgdGhpcyBob29rIGlmIHRhcmdldCBoYXMgY3VzdG9tIEpUSXMiKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHJlbG9jYXRpb24gYmFzZSBmb3IgdGhlIGdpdmVuIFBJQyBqdW1wdGFibGUuCisgIHZpcnR1YWwgU0RWYWx1ZSBnZXRQSUNKdW1wVGFibGVSZWxvY0Jhc2UoU0RWYWx1ZSBUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgLy8vIFRoaXMgcmV0dXJucyB0aGUgcmVsb2NhdGlvbiBiYXNlIGZvciB0aGUgZ2l2ZW4gUElDIGp1bXB0YWJsZSwgdGhlIHNhbWUgYXMKKyAgLy8vIGdldFBJQ0p1bXBUYWJsZVJlbG9jQmFzZSwgYnV0IGFzIGFuIE1DRXhwci4KKyAgdmlydHVhbCBjb25zdCBNQ0V4cHIgKgorICBnZXRQSUNKdW1wVGFibGVSZWxvY0Jhc2VFeHByKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSlRJLCBNQ0NvbnRleHQgJkN0eCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGZvbGRpbmcgYSBjb25zdGFudCBvZmZzZXQgd2l0aCB0aGUgZ2l2ZW4gR2xvYmFsQWRkcmVzcyBpcworICAvLy8gbGVnYWwuICBJdCBpcyBmcmVxdWVudGx5IG5vdCBsZWdhbCBpbiBQSUMgcmVsb2NhdGlvbiBtb2RlbHMuCisgIHZpcnR1YWwgYm9vbCBpc09mZnNldEZvbGRpbmdMZWdhbChjb25zdCBHbG9iYWxBZGRyZXNzU0ROb2RlICpHQSkgY29uc3Q7CisKKyAgYm9vbCBpc0luVGFpbENhbGxQb3NpdGlvbihTZWxlY3Rpb25EQUcgJkRBRywgU0ROb2RlICpOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJkNoYWluKSBjb25zdDsKKworICB2b2lkIHNvZnRlblNldENDT3BlcmFuZHMoU2VsZWN0aW9uREFHICZEQUcsIEVWVCBWVCwgU0RWYWx1ZSAmTmV3TEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmTmV3UkhTLCBJU0Q6OkNvbmRDb2RlICZDQ0NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRExvYyAmREwpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIGEgcGFpciBvZiAocmV0dXJuIHZhbHVlLCBjaGFpbikuCisgIC8vLyBJdCBpcyBhbiBlcnJvciB0byBwYXNzIFJUTElCOjpVTktOT1dOX0xJQkNBTEwgYXMgXHAgTEMuCisgIHN0ZDo6cGFpcjxTRFZhbHVlLCBTRFZhbHVlPiBtYWtlTGliQ2FsbChTZWxlY3Rpb25EQUcgJkRBRywgUlRMSUI6OkxpYmNhbGwgTEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgUmV0VlQsIEFycmF5UmVmPFNEVmFsdWU+IE9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTaWduZWQsIGNvbnN0IFNETG9jICZkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9lc05vdFJldHVybiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1JldHVyblZhbHVlVXNlZCA9IHRydWUpIGNvbnN0OworCisgIC8vLyBDaGVjayB3aGV0aGVyIHBhcmFtZXRlcnMgdG8gYSBjYWxsIHRoYXQgYXJlIHBhc3NlZCBpbiBjYWxsZWUgc2F2ZWQKKyAgLy8vIHJlZ2lzdGVycyBhcmUgdGhlIHNhbWUgYXMgZnJvbSB0aGUgY2FsbGluZyBmdW5jdGlvbi4gIFRoaXMgbmVlZHMgdG8gYmUKKyAgLy8vIGNoZWNrZWQgZm9yIHRhaWwgY2FsbCBlbGlnaWJpbGl0eS4KKyAgYm9vbCBwYXJhbWV0ZXJzSW5DU1JNYXRjaChjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksCisgICAgICBjb25zdCB1aW50MzJfdCAqQ2FsbGVyUHJlc2VydmVkTWFzaywKKyAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxDQ1ZhbEFzc2lnbj4gJkFyZ0xvY3MsCisgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJk91dFZhbHMpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBUYXJnZXRMb3dlcmluZyBPcHRpbWl6YXRpb24gTWV0aG9kcworICAvLworCisgIC8vLyBBIGNvbnZlbmllbmNlIHN0cnVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhIERBRywgYW5kIHR3byBTRFZhbHVlcyBmb3IKKyAgLy8vIHJldHVybmluZyBpbmZvcm1hdGlvbiBmcm9tIFRhcmdldExvd2VyaW5nIHRvIGl0cyBjbGllbnRzIHRoYXQgd2FudCB0bworICAvLy8gY29tYmluZS4KKyAgc3RydWN0IFRhcmdldExvd2VyaW5nT3B0IHsKKyAgICBTZWxlY3Rpb25EQUcgJkRBRzsKKyAgICBib29sIExlZ2FsVHlzOworICAgIGJvb2wgTGVnYWxPcHM7CisgICAgU0RWYWx1ZSBPbGQ7CisgICAgU0RWYWx1ZSBOZXc7CisKKyAgICBleHBsaWNpdCBUYXJnZXRMb3dlcmluZ09wdChTZWxlY3Rpb25EQUcgJkluREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTFQsIGJvb2wgTE8pIDoKKyAgICAgIERBRyhJbkRBRyksIExlZ2FsVHlzKExUKSwgTGVnYWxPcHMoTE8pIHt9CisKKyAgICBib29sIExlZ2FsVHlwZXMoKSBjb25zdCB7IHJldHVybiBMZWdhbFR5czsgfQorICAgIGJvb2wgTGVnYWxPcGVyYXRpb25zKCkgY29uc3QgeyByZXR1cm4gTGVnYWxPcHM7IH0KKworICAgIGJvb2wgQ29tYmluZVRvKFNEVmFsdWUgTywgU0RWYWx1ZSBOKSB7CisgICAgICBPbGQgPSBPOworICAgICAgTmV3ID0gTjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfTsKKworICAvLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBzcGVjaWZpZWQgb3BlcmFuZCBvZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIGlzIGEKKyAgLy8vIGNvbnN0YW50IGludGVnZXIuICBJZiBzbywgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgYml0cyBzZXQgaW4gdGhlCisgIC8vLyBjb25zdGFudCB0aGF0IGFyZSBub3QgZGVtYW5kZWQuICBJZiBzbywgc2hyaW5rIHRoZSBjb25zdGFudCBhbmQgcmV0dXJuCisgIC8vLyB0cnVlLgorICBib29sIFNocmlua0RlbWFuZGVkQ29uc3RhbnQoU0RWYWx1ZSBPcCwgY29uc3QgQVBJbnQgJkRlbWFuZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TG93ZXJpbmdPcHQgJlRMTykgY29uc3Q7CisKKyAgLy8gVGFyZ2V0IGhvb2sgdG8gZG8gdGFyZ2V0LXNwZWNpZmljIGNvbnN0IG9wdGltaXphdGlvbiwgd2hpY2ggaXMgY2FsbGVkIGJ5CisgIC8vIFNocmlua0RlbWFuZGVkQ29uc3RhbnQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQKKyAgLy8gZG9lc24ndCB3YW50IFNocmlua0RlbWFuZGVkQ29uc3RhbnQgdG8gZnVydGhlciBvcHRpbWl6ZSB0aGUgY29uc3RhbnQuCisgIHZpcnR1YWwgYm9vbCB0YXJnZXRTaHJpbmtEZW1hbmRlZENvbnN0YW50KFNEVmFsdWUgT3AsIGNvbnN0IEFQSW50ICZEZW1hbmRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TG93ZXJpbmdPcHQgJlRMTykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBDb252ZXJ0IHgreSB0byAoVlQpKChTbWFsbFZUKXgrKFNtYWxsVlQpeSkgaWYgdGhlIGNhc3RzIGFyZSBmcmVlLiAgVGhpcworICAvLy8gdXNlcyBpc1pFeHRGcmVlIGFuZCBaRVJPX0VYVEVORCBmb3IgdGhlIHdpZGVuaW5nIGNhc3QsIGJ1dCBpdCBjb3VsZCBiZQorICAvLy8gZ2VuZXJhbGl6ZWQgZm9yIHRhcmdldHMgd2l0aCBvdGhlciB0eXBlcyBvZiBpbXBsaWNpdCB3aWRlbmluZyBjYXN0cy4KKyAgYm9vbCBTaHJpbmtEZW1hbmRlZE9wKFNEVmFsdWUgT3AsIHVuc2lnbmVkIEJpdFdpZHRoLCBjb25zdCBBUEludCAmRGVtYW5kZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRMb3dlcmluZ09wdCAmVExPKSBjb25zdDsKKworICAvLy8gSGVscGVyIGZvciBTaW1wbGlmeURlbWFuZGVkQml0cyB0aGF0IGNhbiBzaW1wbGlmeSBhbiBvcGVyYXRpb24gd2l0aAorICAvLy8gbXVsdGlwbGUgdXNlcy4gIFRoaXMgZnVuY3Rpb24gc2ltcGxpZmllcyBvcGVyYW5kIFxwIE9wSWR4IG9mIFxwIFVzZXIgYW5kCisgIC8vLyB0aGVuIHVwZGF0ZXMgXHAgVXNlciB3aXRoIHRoZSBzaW1wbGlmaWVkIHZlcnNpb24uIE5vIG90aGVyIHVzZXMgb2YKKyAgLy8vIFxwIE9wSWR4IGFyZSB1cGRhdGVkLiBJZiBccCBVc2VyIGlzIHRoZSBvbmx5IHVzZXIgb2YgXHAgT3BJZHgsIHRoaXMKKyAgLy8vIGZ1bmN0aW9uIGJlaGF2ZXMgZXhhY3RseSBsaWtlIGZ1bmN0aW9uIFNpbXBsaWZ5RGVtYW5kZWRCaXRzIGRlY2xhcmVkCisgIC8vLyBiZWxvdyBleGNlcHQgdGhhdCBpdCBhbHNvIHVwZGF0ZXMgdGhlIERBRyBieSBjYWxsaW5nCisgIC8vLyBEQ0kuQ29tbWl0VGFyZ2V0TG93ZXJpbmdPcHQuCisgIGJvb2wgU2ltcGxpZnlEZW1hbmRlZEJpdHMoU0ROb2RlICpVc2VyLCB1bnNpZ25lZCBPcElkeCwgY29uc3QgQVBJbnQgJkRlbWFuZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBR0NvbWJpbmVySW5mbyAmRENJLCBUYXJnZXRMb3dlcmluZ09wdCAmVExPKSBjb25zdDsKKworICAvLy8gTG9vayBhdCBPcC4gIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cgdGhhdCBvbmx5IHRoZSBEZW1hbmRlZE1hc2sgYml0cyBvZiB0aGUKKyAgLy8vIHJlc3VsdCBvZiBPcCBhcmUgZXZlciB1c2VkIGRvd25zdHJlYW0uICBJZiB3ZSBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8KKyAgLy8vIHNpbXBsaWZ5IE9wLCBjcmVhdGUgYSBuZXcgc2ltcGxpZmllZCBEQUcgbm9kZSBhbmQgcmV0dXJuIHRydWUsIHJldHVybmluZworICAvLy8gdGhlIG9yaWdpbmFsIGFuZCBuZXcgbm9kZXMgaW4gT2xkIGFuZCBOZXcuICBPdGhlcndpc2UsIGFuYWx5emUgdGhlCisgIC8vLyBleHByZXNzaW9uIGFuZCByZXR1cm4gYSBtYXNrIG9mIEtub3duT25lIGFuZCBLbm93blplcm8gYml0cyBmb3IgdGhlCisgIC8vLyBleHByZXNzaW9uICh1c2VkIHRvIHNpbXBsaWZ5IHRoZSBjYWxsZXIpLiAgVGhlIEtub3duWmVyby9PbmUgYml0cyBtYXkgb25seQorICAvLy8gYmUgYWNjdXJhdGUgZm9yIHRob3NlIGJpdHMgaW4gdGhlIERlbWFuZGVkTWFzay4KKyAgLy8vIFxwIEFzc3VtZVNpbmdsZVVzZSBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIHRoaXMgZnVuY3Rpb24gd2lsbAorICAvLy8gICAgYXR0ZW1wdCB0byBzaW1wbGlmeSBccCBPcCBldmVuIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSB1c2VzLgorICAvLy8gICAgQ2FsbGVycyBhcmUgcmVzcG9uc2libGUgZm9yIGNvcnJlY3RseSB1cGRhdGluZyB0aGUgREFHIGJhc2VkIG9uIHRoZQorICAvLy8gICAgcmVzdWx0cyBvZiB0aGlzIGZ1bmN0aW9uLCBiZWNhdXNlIHNpbXBseSByZXBsYWNpbmcgcmVwbGFjaW5nIFRMTy5PbGQKKyAgLy8vICAgIHdpdGggVExPLk5ldyB3aWxsIGJlIGluY29ycmVjdCB3aGVuIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUgYW5kIFRMTy5PbGQKKyAgLy8vICAgIGhhcyBtdWx0aXBsZSB1c2VzLgorICBib29sIFNpbXBsaWZ5RGVtYW5kZWRCaXRzKFNEVmFsdWUgT3AsIGNvbnN0IEFQSW50ICZEZW1hbmRlZE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS25vd25CaXRzICZLbm93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRMb3dlcmluZ09wdCAmVExPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFzc3VtZVNpbmdsZVVzZSA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gSGVscGVyIHdyYXBwZXIgYXJvdW5kIFNpbXBsaWZ5RGVtYW5kZWRCaXRzCisgIGJvb2wgU2ltcGxpZnlEZW1hbmRlZEJpdHMoU0RWYWx1ZSBPcCwgY29uc3QgQVBJbnQgJkRlbWFuZGVkTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUdDb21iaW5lckluZm8gJkRDSSkgY29uc3Q7CisKKyAgLy8vIExvb2sgYXQgVmVjdG9yIE9wLiBBdCB0aGlzIHBvaW50LCB3ZSBrbm93IHRoYXQgb25seSB0aGUgRGVtYW5kZWRFbHRzCisgIC8vLyBlbGVtZW50cyBvZiB0aGUgcmVzdWx0IG9mIE9wIGFyZSBldmVyIHVzZWQgZG93bnN0cmVhbS4gIElmIHdlIGNhbiB1c2UKKyAgLy8vIHRoaXMgaW5mb3JtYXRpb24gdG8gc2ltcGxpZnkgT3AsIGNyZWF0ZSBhIG5ldyBzaW1wbGlmaWVkIERBRyBub2RlIGFuZAorICAvLy8gcmV0dXJuIHRydWUsIHN0b3JpbmcgdGhlIG9yaWdpbmFsIGFuZCBuZXcgbm9kZXMgaW4gVExPLgorICAvLy8gT3RoZXJ3aXNlLCBhbmFseXplIHRoZSBleHByZXNzaW9uIGFuZCByZXR1cm4gYSBtYXNrIG9mIEtub3duVW5kZWYgYW5kCisgIC8vLyBLbm93blplcm8gZWxlbWVudHMgZm9yIHRoZSBleHByZXNzaW9uICh1c2VkIHRvIHNpbXBsaWZ5IHRoZSBjYWxsZXIpLgorICAvLy8gVGhlIEtub3duVW5kZWYvWmVybyBlbGVtZW50cyBtYXkgb25seSBiZSBhY2N1cmF0ZSBmb3IgdGhvc2UgYml0cworICAvLy8gaW4gdGhlIERlbWFuZGVkTWFzay4KKyAgLy8vIFxwIEFzc3VtZVNpbmdsZVVzZSBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIHRoaXMgZnVuY3Rpb24gd2lsbAorICAvLy8gICAgYXR0ZW1wdCB0byBzaW1wbGlmeSBccCBPcCBldmVuIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSB1c2VzLgorICAvLy8gICAgQ2FsbGVycyBhcmUgcmVzcG9uc2libGUgZm9yIGNvcnJlY3RseSB1cGRhdGluZyB0aGUgREFHIGJhc2VkIG9uIHRoZQorICAvLy8gICAgcmVzdWx0cyBvZiB0aGlzIGZ1bmN0aW9uLCBiZWNhdXNlIHNpbXBseSByZXBsYWNpbmcgcmVwbGFjaW5nIFRMTy5PbGQKKyAgLy8vICAgIHdpdGggVExPLk5ldyB3aWxsIGJlIGluY29ycmVjdCB3aGVuIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUgYW5kIFRMTy5PbGQKKyAgLy8vICAgIGhhcyBtdWx0aXBsZSB1c2VzLgorICBib29sIFNpbXBsaWZ5RGVtYW5kZWRWZWN0b3JFbHRzKFNEVmFsdWUgT3AsIGNvbnN0IEFQSW50ICZEZW1hbmRlZEVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJktub3duVW5kZWYsIEFQSW50ICZLbm93blplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TG93ZXJpbmdPcHQgJlRMTywgdW5zaWduZWQgRGVwdGggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQXNzdW1lU2luZ2xlVXNlID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyBIZWxwZXIgd3JhcHBlciBhcm91bmQgU2ltcGxpZnlEZW1hbmRlZFZlY3RvckVsdHMKKyAgYm9vbCBTaW1wbGlmeURlbWFuZGVkVmVjdG9yRWx0cyhTRFZhbHVlIE9wLCBjb25zdCBBUEludCAmRGVtYW5kZWRFbHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZLbm93blVuZGVmLCBBUEludCAmS25vd25aZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBR0NvbWJpbmVySW5mbyAmRENJKSBjb25zdDsKKworICAvLy8gRGV0ZXJtaW5lIHdoaWNoIG9mIHRoZSBiaXRzIHNwZWNpZmllZCBpbiBNYXNrIGFyZSBrbm93biB0byBiZSBlaXRoZXIgemVybworICAvLy8gb3Igb25lIGFuZCByZXR1cm4gdGhlbSBpbiB0aGUgS25vd25aZXJvL0tub3duT25lIGJpdHNldHMuIFRoZSBEZW1hbmRlZEVsdHMKKyAgLy8vIGFyZ3VtZW50IGFsbG93cyB1cyB0byBvbmx5IGNvbGxlY3QgdGhlIGtub3duIGJpdHMgdGhhdCBhcmUgc2hhcmVkIGJ5IHRoZQorICAvLy8gcmVxdWVzdGVkIHZlY3RvciBlbGVtZW50cy4KKyAgdmlydHVhbCB2b2lkIGNvbXB1dGVLbm93bkJpdHNGb3JUYXJnZXROb2RlKGNvbnN0IFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbm93bkJpdHMgJktub3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBJbnQgJkRlbWFuZGVkRWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwKSBjb25zdDsKKworICAvLy8gRGV0ZXJtaW5lIHdoaWNoIG9mIHRoZSBiaXRzIG9mIEZyYW1lSW5kZXggXHAgRklPcCBhcmUga25vd24gdG8gYmUgMC4KKyAgLy8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gY29tcHV0ZXMgbG93IGJpdHMgYmFzZWQgb24gYWxpZ25tZW50CisgIC8vLyBpbmZvcm1hdGlvbi4gVGhpcyBzaG91bGQgcHJlc2VydmUga25vd24gYml0cyBwYXNzZWQgaW50byBpdC4KKyAgdmlydHVhbCB2b2lkIGNvbXB1dGVLbm93bkJpdHNGb3JGcmFtZUluZGV4KGNvbnN0IFNEVmFsdWUgRklPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duQml0cyAmS25vd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEludCAmRGVtYW5kZWRFbHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0OworCisgIC8vLyBUaGlzIG1ldGhvZCBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgdGFyZ2V0cyB0aGF0IHdhbnQgdG8gZXhwb3NlIGFkZGl0aW9uYWwKKyAgLy8vIGluZm9ybWF0aW9uIGFib3V0IHNpZ24gYml0cyB0byB0aGUgREFHIENvbWJpbmVyLiBUaGUgRGVtYW5kZWRFbHRzCisgIC8vLyBhcmd1bWVudCBhbGxvd3MgdXMgdG8gb25seSBjb2xsZWN0IHRoZSBtaW5pbXVtIHNpZ24gYml0cyB0aGF0IGFyZSBzaGFyZWQKKyAgLy8vIGJ5IHRoZSByZXF1ZXN0ZWQgdmVjdG9yIGVsZW1lbnRzLgorICB2aXJ0dWFsIHVuc2lnbmVkIENvbXB1dGVOdW1TaWduQml0c0ZvclRhcmdldE5vZGUoU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQSW50ICZEZW1hbmRlZEVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCkgY29uc3Q7CisKKyAgLy8vIEF0dGVtcHQgdG8gc2ltcGxpZnkgYW55IHRhcmdldCBub2RlcyBiYXNlZCBvbiB0aGUgZGVtYW5kZWQgdmVjdG9yCisgIC8vLyBlbGVtZW50cywgcmV0dXJuaW5nIHRydWUgb24gc3VjY2Vzcy4gT3RoZXJ3aXNlLCBhbmFseXplIHRoZSBleHByZXNzaW9uIGFuZAorICAvLy8gcmV0dXJuIGEgbWFzayBvZiBLbm93blVuZGVmIGFuZCBLbm93blplcm8gZWxlbWVudHMgZm9yIHRoZSBleHByZXNzaW9uCisgIC8vLyAodXNlZCB0byBzaW1wbGlmeSB0aGUgY2FsbGVyKS4gVGhlIEtub3duVW5kZWYvWmVybyBlbGVtZW50cyBtYXkgb25seSBiZQorICAvLy8gYWNjdXJhdGUgZm9yIHRob3NlIGJpdHMgaW4gdGhlIERlbWFuZGVkTWFzaworICB2aXJ0dWFsIGJvb2wgU2ltcGxpZnlEZW1hbmRlZFZlY3RvckVsdHNGb3JUYXJnZXROb2RlKAorICAgICAgU0RWYWx1ZSBPcCwgY29uc3QgQVBJbnQgJkRlbWFuZGVkRWx0cywgQVBJbnQgJktub3duVW5kZWYsCisgICAgICBBUEludCAmS25vd25aZXJvLCBUYXJnZXRMb3dlcmluZ09wdCAmVExPLCB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0OworCisgIHN0cnVjdCBEQUdDb21iaW5lckluZm8geworICAgIHZvaWQgKkRDOyAgLy8gVGhlIERBRyBDb21iaW5lciBvYmplY3QuCisgICAgQ29tYmluZUxldmVsIExldmVsOworICAgIGJvb2wgQ2FsbGVkQnlMZWdhbGl6ZXI7CisKKyAgcHVibGljOgorICAgIFNlbGVjdGlvbkRBRyAmREFHOworCisgICAgREFHQ29tYmluZXJJbmZvKFNlbGVjdGlvbkRBRyAmZGFnLCBDb21iaW5lTGV2ZWwgbGV2ZWwsICBib29sIGNsLCB2b2lkICpkYykKKyAgICAgIDogREMoZGMpLCBMZXZlbChsZXZlbCksIENhbGxlZEJ5TGVnYWxpemVyKGNsKSwgREFHKGRhZykge30KKworICAgIGJvb2wgaXNCZWZvcmVMZWdhbGl6ZSgpIGNvbnN0IHsgcmV0dXJuIExldmVsID09IEJlZm9yZUxlZ2FsaXplVHlwZXM7IH0KKyAgICBib29sIGlzQmVmb3JlTGVnYWxpemVPcHMoKSBjb25zdCB7IHJldHVybiBMZXZlbCA8IEFmdGVyTGVnYWxpemVWZWN0b3JPcHM7IH0KKyAgICBib29sIGlzQWZ0ZXJMZWdhbGl6ZURBRygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMZXZlbCA9PSBBZnRlckxlZ2FsaXplREFHOworICAgIH0KKyAgICBDb21iaW5lTGV2ZWwgZ2V0REFHQ29tYmluZUxldmVsKCkgeyByZXR1cm4gTGV2ZWw7IH0KKyAgICBib29sIGlzQ2FsbGVkQnlMZWdhbGl6ZXIoKSBjb25zdCB7IHJldHVybiBDYWxsZWRCeUxlZ2FsaXplcjsgfQorCisgICAgdm9pZCBBZGRUb1dvcmtsaXN0KFNETm9kZSAqTik7CisgICAgU0RWYWx1ZSBDb21iaW5lVG8oU0ROb2RlICpOLCBBcnJheVJlZjxTRFZhbHVlPiBUbywgYm9vbCBBZGRUbyA9IHRydWUpOworICAgIFNEVmFsdWUgQ29tYmluZVRvKFNETm9kZSAqTiwgU0RWYWx1ZSBSZXMsIGJvb2wgQWRkVG8gPSB0cnVlKTsKKyAgICBTRFZhbHVlIENvbWJpbmVUbyhTRE5vZGUgKk4sIFNEVmFsdWUgUmVzMCwgU0RWYWx1ZSBSZXMxLCBib29sIEFkZFRvID0gdHJ1ZSk7CisKKyAgICB2b2lkIENvbW1pdFRhcmdldExvd2VyaW5nT3B0KGNvbnN0IFRhcmdldExvd2VyaW5nT3B0ICZUTE8pOworICB9OworCisgIC8vLyBSZXR1cm4gaWYgdGhlIE4gaXMgYSBjb25zdGFudCBvciBjb25zdGFudCB2ZWN0b3IgZXF1YWwgdG8gdGhlIHRydWUgdmFsdWUKKyAgLy8vIGZyb20gZ2V0Qm9vbGVhbkNvbnRlbnRzKCkuCisgIGJvb2wgaXNDb25zdFRydWVWYWwoY29uc3QgU0ROb2RlICpOKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGlmIHRoZSBOIGlzIGEgY29uc3RhbnQgb3IgY29uc3RhbnQgdmVjdG9yIGVxdWFsIHRvIHRoZSBmYWxzZSB2YWx1ZQorICAvLy8gZnJvbSBnZXRCb29sZWFuQ29udGVudHMoKS4KKyAgYm9vbCBpc0NvbnN0RmFsc2VWYWwoY29uc3QgU0ROb2RlICpOKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGlmIFxwIE4gaXMgYSBUcnVlIHZhbHVlIHdoZW4gZXh0ZW5kZWQgdG8gXHAgVlQuCisgIGJvb2wgaXNFeHRlbmRlZFRydWVWYWwoY29uc3QgQ29uc3RhbnRTRE5vZGUgKk4sIEVWVCBWVCwgYm9vbCBTaWduZWQpIGNvbnN0OworCisgIC8vLyBUcnkgdG8gc2ltcGxpZnkgYSBzZXRjYyBidWlsdCB3aXRoIHRoZSBzcGVjaWZpZWQgb3BlcmFuZHMgYW5kIGNjLiBJZiBpdCBpcworICAvLy8gdW5hYmxlIHRvIHNpbXBsaWZ5IGl0LCByZXR1cm4gYSBudWxsIFNEVmFsdWUuCisgIFNEVmFsdWUgU2ltcGxpZnlTZXRDQyhFVlQgVlQsIFNEVmFsdWUgTjAsIFNEVmFsdWUgTjEsIElTRDo6Q29uZENvZGUgQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9sZEJvb2xlYW5zLCBEQUdDb21iaW5lckluZm8gJkRDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNETG9jICZkbCkgY29uc3Q7CisKKyAgLy8gRm9yIHRhcmdldHMgd2hpY2ggd3JhcCBhZGRyZXNzLCB1bndyYXAgZm9yIGFuYWx5c2lzLgorICB2aXJ0dWFsIFNEVmFsdWUgdW53cmFwQWRkcmVzcyhTRFZhbHVlIE4pIGNvbnN0IHsgcmV0dXJuIE47IH0KKworICAvLy8gUmV0dXJucyB0cnVlIChhbmQgdGhlIEdsb2JhbFZhbHVlIGFuZCB0aGUgb2Zmc2V0KSBpZiB0aGUgbm9kZSBpcyBhCisgIC8vLyBHbG9iYWxBZGRyZXNzICsgb2Zmc2V0LgorICB2aXJ0dWFsIGJvb2wKKyAgaXNHQVBsdXNPZmZzZXQoU0ROb2RlICpOLCBjb25zdCBHbG9iYWxWYWx1ZSogJkdBLCBpbnQ2NF90ICZPZmZzZXQpIGNvbnN0OworCisgIC8vLyBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgZm9yIGFsbCB0YXJnZXQgbm9kZXMgYW5kIGZvciBhbnkKKyAgLy8vIHRhcmdldC1pbmRlcGVuZGVudCBub2RlcyB0aGF0IHRoZSB0YXJnZXQgaGFzIHJlZ2lzdGVyZWQgd2l0aCBpbnZva2UgaXQKKyAgLy8vIGZvci4KKyAgLy8vCisgIC8vLyBUaGUgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzOgorICAvLy8gUmV0dXJuIFZhbHVlOgorICAvLy8gICBTRFZhbHVlLlZhbCA9PSAwICAgLSBObyBjaGFuZ2Ugd2FzIG1hZGUKKyAgLy8vICAgU0RWYWx1ZS5WYWwgPT0gTiAgIC0gTiB3YXMgcmVwbGFjZWQsIGlzIGRlYWQsIGFuZCBpcyBhbHJlYWR5IGhhbmRsZWQuCisgIC8vLyAgIG90aGVyd2lzZSAgICAgICAgICAtIE4gc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IHRoZSByZXR1cm5lZCBPcGVyYW5kLgorICAvLy8KKyAgLy8vIEluIGFkZGl0aW9uLCBtZXRob2RzIHByb3ZpZGVkIGJ5IERBR0NvbWJpbmVySW5mbyBtYXkgYmUgdXNlZCB0byBwZXJmb3JtCisgIC8vLyBtb3JlIGNvbXBsZXggdHJhbnNmb3JtYXRpb25zLgorICAvLy8KKyAgdmlydHVhbCBTRFZhbHVlIFBlcmZvcm1EQUdDb21iaW5lKFNETm9kZSAqTiwgREFHQ29tYmluZXJJbmZvICZEQ0kpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIG1vdmUgYSBmb2xsb3dpbmcgc2hpZnQgdGhyb3VnaCB0aGlzCisgIC8vICBub2RlLCBhZGp1c3RpbmcgYW55IGltbWVkaWF0ZSBvcGVyYW5kcyBhcyBuZWNlc3NhcnkgdG8gcHJlc2VydmUgc2VtYW50aWNzLgorICAvLyAgVGhpcyB0cmFuc2Zvcm1hdGlvbiBtYXkgbm90IGJlIGRlc2lyYWJsZSBpZiBpdCBkaXNydXB0cyBhIHBhcnRpY3VsYXJseQorICAvLyAgYXVzcGljaW91cyB0YXJnZXQtc3BlY2lmaWMgdHJlZSAoZS5nLiBiaXRmaWVsZCBleHRyYWN0aW9uIGluIEFBcmNoNjQpLgorICAvLyAgQnkgZGVmYXVsdCwgaXQgcmV0dXJucyB0cnVlLgorICB2aXJ0dWFsIGJvb2wgaXNEZXNpcmFibGVUb0NvbW11dGVXaXRoU2hpZnQoY29uc3QgU0ROb2RlICpOKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIGNvbWJpbmUgYSBCVUlMRF9WRUNUT1Igd2l0aCBhIHN0cmlkZS1wYXR0ZXJuCisgIC8vIHRvIGEgc2h1ZmZsZSBhbmQgYSB0cnVuY2F0ZS4KKyAgLy8gRXhhbXBsZSBvZiBzdWNoIGEgY29tYmluZToKKyAgLy8gdjRpMzIgYnVpbGRfdmVjdG9yKChleHRyYWN0X2VsdCBWLCAxKSwKKyAgLy8gICAgICAgICAgICAgICAgICAgIChleHRyYWN0X2VsdCBWLCAzKSwKKyAgLy8gICAgICAgICAgICAgICAgICAgIChleHRyYWN0X2VsdCBWLCA1KSwKKyAgLy8gICAgICAgICAgICAgICAgICAgIChleHRyYWN0X2VsdCBWLCA3KSkKKyAgLy8gIC0tPgorICAvLyB2NGkzMiB0cnVuY2F0ZSAoYml0Y2FzdCAoc2h1ZmZsZTwxLHUsMyx1LDUsdSw3LHU+IFYsIHUpIHRvIHY0aTY0KQorICB2aXJ0dWFsIGJvb2wgaXNEZXNpcmFibGVUb0NvbWJpbmVCdWlsZFZlY3RvclRvU2h1ZmZsZVRydW5jYXRlKAorICAgICAgQXJyYXlSZWY8aW50PiBTaHVmZmxlTWFzaywgRVZUIFNyY1ZULCBFVlQgVHJ1bmNWVCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGhhcyBuYXRpdmUgc3VwcG9ydCBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSB0eXBlCisgIC8vLyBhbmQgaXQgaXMgJ2Rlc2lyYWJsZScgdG8gdXNlIHRoZSB0eXBlIGZvciB0aGUgZ2l2ZW4gbm9kZSB0eXBlLiBlLmcuIE9uIHg4NgorICAvLy8gaTE2IGlzIGxlZ2FsLCBidXQgdW5kZXNpcmFibGUgc2luY2UgaTE2IGluc3RydWN0aW9uIGVuY29kaW5ncyBhcmUgbG9uZ2VyCisgIC8vLyBhbmQgc29tZSBpMTYgaW5zdHJ1Y3Rpb25zIGFyZSBzbG93LgorICB2aXJ0dWFsIGJvb2wgaXNUeXBlRGVzaXJhYmxlRm9yT3AodW5zaWduZWQgLypPcGMqLywgRVZUIFZUKSBjb25zdCB7CisgICAgLy8gQnkgZGVmYXVsdCwgYXNzdW1lIGFsbCBsZWdhbCB0eXBlcyBhcmUgZGVzaXJhYmxlLgorICAgIHJldHVybiBpc1R5cGVMZWdhbChWVCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgaXQgaXMgcHJvZml0YWJsZSBmb3IgZGFnIGNvbWJpbmVyIHRvIHRyYW5zZm9ybSBhIGZsb2F0aW5nCisgIC8vLyBwb2ludCBvcCBvZiBzcGVjaWZpZWQgb3Bjb2RlIHRvIGEgZXF1aXZhbGVudCBvcCBvZiBhbiBpbnRlZ2VyCisgIC8vLyB0eXBlLiBlLmcuIGYzMiBsb2FkIC0+IGkzMiBsb2FkIGNhbiBiZSBwcm9maXRhYmxlIG9uIEFSTS4KKyAgdmlydHVhbCBib29sIGlzRGVzaXJhYmxlVG9UcmFuc2Zvcm1Ub0ludGVnZXJPcCh1bnNpZ25lZCAvKk9wYyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCAvKlZUKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgcXVlcnkgdGhlIHRhcmdldCB3aGV0aGVyIGl0IGlzIGJlbmVmaWNpYWwgZm9yIGRhZyBjb21iaW5lciB0bworICAvLy8gcHJvbW90ZSB0aGUgc3BlY2lmaWVkIG5vZGUuIElmIHRydWUsIGl0IHNob3VsZCByZXR1cm4gdGhlIGRlc2lyZWQKKyAgLy8vIHByb21vdGlvbiB0eXBlIGJ5IHJlZmVyZW5jZS4KKyAgdmlydHVhbCBib29sIElzRGVzaXJhYmxlVG9Qcm9tb3RlT3AoU0RWYWx1ZSAvKk9wKi8sIEVWVCAmLypQVlQqLykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIHN3aWZ0ZXJyb3IgYXR0cmlidXRlLiBJdCBvcHRpbWl6ZXMKKyAgLy8vIGxvYWRzIGFuZCBzdG9yZXMgdG8gcmVhZGluZyBhbmQgd3JpdGluZyBhIHNwZWNpZmljIHJlZ2lzdGVyLgorICB2aXJ0dWFsIGJvb2wgc3VwcG9ydFN3aWZ0RXJyb3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgc3VwcG9ydHMgdGhhdCBhIHN1YnNldCBvZiBDU1JzIGZvciB0aGUgZ2l2ZW4KKyAgLy8vIG1hY2hpbmUgZnVuY3Rpb24gaXMgaGFuZGxlZCBleHBsaWNpdGx5IHZpYSBjb3BpZXMuCisgIHZpcnR1YWwgYm9vbCBzdXBwb3J0U3BsaXRDU1IoTWFjaGluZUZ1bmN0aW9uICpNRikgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBQZXJmb3JtIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbiB0byBoYW5kbGUgYSBzdWJzZXQgb2YgQ1NScyBleHBsaWNpdGx5CisgIC8vLyB2aWEgY29waWVzLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGluc3RydWN0aW9uCisgIC8vLyBzZWxlY3Rpb24uCisgIHZpcnR1YWwgdm9pZCBpbml0aWFsaXplU3BsaXRDU1IoTWFjaGluZUJhc2ljQmxvY2sgKkVudHJ5KSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiTm90IEltcGxlbWVudGVkIik7CisgIH0KKworICAvLy8gSW5zZXJ0IGV4cGxpY2l0IGNvcGllcyBpbiBlbnRyeSBhbmQgZXhpdCBibG9ja3MuIFdlIGNvcHkgYSBzdWJzZXQgb2YKKyAgLy8vIENTUnMgdG8gdmlydHVhbCByZWdpc3RlcnMgaW4gdGhlIGVudHJ5IGJsb2NrLCBhbmQgY29weSB0aGVtIGJhY2sgdG8KKyAgLy8vIHBoeXNpY2FsIHJlZ2lzdGVycyBpbiB0aGUgZXhpdCBibG9ja3MuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHRoZSBlbmQKKyAgLy8vIG9mIGluc3RydWN0aW9uIHNlbGVjdGlvbi4KKyAgdmlydHVhbCB2b2lkIGluc2VydENvcGllc1NwbGl0Q1NSKAorICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkVudHJ5LAorICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVCYXNpY0Jsb2NrICo+ICZFeGl0cykgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIk5vdCBJbXBsZW1lbnRlZCIpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIExvd2VyaW5nIG1ldGhvZHMgLSBUaGVzZSBtZXRob2RzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGFyZ2V0cyBzbyB0aGF0CisgIC8vIHRoZSBTZWxlY3Rpb25EQUdCdWlsZGVyIGNvZGUga25vd3MgaG93IHRvIGxvd2VyIHRoZXNlLgorICAvLworCisgIC8vLyBUaGlzIGhvb2sgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBsb3dlciB0aGUgaW5jb21pbmcgKGZvcm1hbCkgYXJndW1lbnRzLAorICAvLy8gZGVzY3JpYmVkIGJ5IHRoZSBJbnMgYXJyYXksIGludG8gdGhlIHNwZWNpZmllZCBEQUcuIFRoZSBpbXBsZW1lbnRhdGlvbgorICAvLy8gc2hvdWxkIGZpbGwgaW4gdGhlIEluVmFscyBhcnJheSB3aXRoIGxlZ2FsLXR5cGUgYXJndW1lbnQgdmFsdWVzLCBhbmQKKyAgLy8vIHJldHVybiB0aGUgcmVzdWx0aW5nIHRva2VuIGNoYWluIHZhbHVlLgorICB2aXJ0dWFsIFNEVmFsdWUgTG93ZXJGb3JtYWxBcmd1bWVudHMoCisgICAgICBTRFZhbHVlIC8qQ2hhaW4qLywgQ2FsbGluZ0NvbnY6OklEIC8qQ2FsbENvbnYqLywgYm9vbCAvKmlzVmFyQXJnKi8sCisgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJiAvKklucyovLCBjb25zdCBTRExvYyAmIC8qZGwqLywKKyAgICAgIFNlbGVjdGlvbkRBRyAmIC8qREFHKi8sIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmIC8qSW5WYWxzKi8pIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJOb3QgSW1wbGVtZW50ZWQiKTsKKyAgfQorCisgIC8vLyBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBhbGwgaW5mb3JtYXRpb24gdGhhdCBpcyBuZWNlc3NhcnkgZm9yIGxvd2VyaW5nCisgIC8vLyBjYWxscy4gSXQgaXMgcGFzc2VkIHRvIFRMSTo6TG93ZXJDYWxsVG8gd2hlbiB0aGUgU2VsZWN0aW9uREFHIGJ1aWxkZXIKKyAgLy8vIG5lZWRzIHRvIGxvd2VyIGEgY2FsbCwgYW5kIHRhcmdldHMgd2lsbCBzZWUgdGhpcyBzdHJ1Y3QgaW4gdGhlaXIgTG93ZXJDYWxsCisgIC8vLyBpbXBsZW1lbnRhdGlvbi4KKyAgc3RydWN0IENhbGxMb3dlcmluZ0luZm8geworICAgIFNEVmFsdWUgQ2hhaW47CisgICAgVHlwZSAqUmV0VHkgPSBudWxscHRyOworICAgIGJvb2wgUmV0U0V4dCAgICAgICAgICAgOiAxOworICAgIGJvb2wgUmV0WkV4dCAgICAgICAgICAgOiAxOworICAgIGJvb2wgSXNWYXJBcmcgICAgICAgICAgOiAxOworICAgIGJvb2wgSXNJblJlZyAgICAgICAgICAgOiAxOworICAgIGJvb2wgRG9lc05vdFJldHVybiAgICAgOiAxOworICAgIGJvb2wgSXNSZXR1cm5WYWx1ZVVzZWQgOiAxOworICAgIGJvb2wgSXNDb252ZXJnZW50ICAgICAgOiAxOworICAgIGJvb2wgSXNQYXRjaFBvaW50ICAgICAgOiAxOworCisgICAgLy8gSXNUYWlsQ2FsbCBzaG91bGQgYmUgbW9kaWZpZWQgYnkgaW1wbGVtZW50YXRpb25zIG9mCisgICAgLy8gVGFyZ2V0TG93ZXJpbmc6Okxvd2VyQ2FsbCB0aGF0IHBlcmZvcm0gdGFpbCBjYWxsIGNvbnZlcnNpb25zLgorICAgIGJvb2wgSXNUYWlsQ2FsbCA9IGZhbHNlOworCisgICAgLy8gSXMgQ2FsbCBsb3dlcmluZyBkb25lIHBvc3QgU2VsZWN0aW9uREFHIHR5cGUgbGVnYWxpemF0aW9uLgorICAgIGJvb2wgSXNQb3N0VHlwZUxlZ2FsaXphdGlvbiA9IGZhbHNlOworCisgICAgdW5zaWduZWQgTnVtRml4ZWRBcmdzID0gLTE7CisgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252ID0gQ2FsbGluZ0NvbnY6OkM7CisgICAgU0RWYWx1ZSBDYWxsZWU7CisgICAgQXJnTGlzdFR5IEFyZ3M7CisgICAgU2VsZWN0aW9uREFHICZEQUc7CisgICAgU0RMb2MgREw7CisgICAgSW1tdXRhYmxlQ2FsbFNpdGUgQ1M7CisgICAgU21hbGxWZWN0b3I8SVNEOjpPdXRwdXRBcmcsIDMyPiBPdXRzOworICAgIFNtYWxsVmVjdG9yPFNEVmFsdWUsIDMyPiBPdXRWYWxzOworICAgIFNtYWxsVmVjdG9yPElTRDo6SW5wdXRBcmcsIDMyPiBJbnM7CisgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgND4gSW5WYWxzOworCisgICAgQ2FsbExvd2VyaW5nSW5mbyhTZWxlY3Rpb25EQUcgJkRBRykKKyAgICAgICAgOiBSZXRTRXh0KGZhbHNlKSwgUmV0WkV4dChmYWxzZSksIElzVmFyQXJnKGZhbHNlKSwgSXNJblJlZyhmYWxzZSksCisgICAgICAgICAgRG9lc05vdFJldHVybihmYWxzZSksIElzUmV0dXJuVmFsdWVVc2VkKHRydWUpLCBJc0NvbnZlcmdlbnQoZmFsc2UpLAorICAgICAgICAgIElzUGF0Y2hQb2ludChmYWxzZSksIERBRyhEQUcpIHt9CisKKyAgICBDYWxsTG93ZXJpbmdJbmZvICZzZXREZWJ1Z0xvYyhjb25zdCBTRExvYyAmZGwpIHsKKyAgICAgIERMID0gZGw7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2FsbExvd2VyaW5nSW5mbyAmc2V0Q2hhaW4oU0RWYWx1ZSBJbkNoYWluKSB7CisgICAgICBDaGFpbiA9IEluQ2hhaW47CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8gc2V0Q2FsbGVlIHdpdGggdGFyZ2V0L21vZHVsZS1zcGVjaWZpYyBhdHRyaWJ1dGVzCisgICAgQ2FsbExvd2VyaW5nSW5mbyAmc2V0TGliQ2FsbGVlKENhbGxpbmdDb252OjpJRCBDQywgVHlwZSAqUmVzdWx0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBUYXJnZXQsIEFyZ0xpc3RUeSAmJkFyZ3NMaXN0KSB7CisgICAgICBSZXRUeSA9IFJlc3VsdFR5cGU7CisgICAgICBDYWxsZWUgPSBUYXJnZXQ7CisgICAgICBDYWxsQ29udiA9IENDOworICAgICAgTnVtRml4ZWRBcmdzID0gQXJnc0xpc3Quc2l6ZSgpOworICAgICAgQXJncyA9IHN0ZDo6bW92ZShBcmdzTGlzdCk7CisKKyAgICAgIERBRy5nZXRUYXJnZXRMb3dlcmluZ0luZm8oKS5tYXJrTGliQ2FsbEF0dHJpYnV0ZXMoCisgICAgICAgICAgJihEQUcuZ2V0TWFjaGluZUZ1bmN0aW9uKCkpLCBDQywgQXJncyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2FsbExvd2VyaW5nSW5mbyAmc2V0Q2FsbGVlKENhbGxpbmdDb252OjpJRCBDQywgVHlwZSAqUmVzdWx0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBUYXJnZXQsIEFyZ0xpc3RUeSAmJkFyZ3NMaXN0KSB7CisgICAgICBSZXRUeSA9IFJlc3VsdFR5cGU7CisgICAgICBDYWxsZWUgPSBUYXJnZXQ7CisgICAgICBDYWxsQ29udiA9IENDOworICAgICAgTnVtRml4ZWRBcmdzID0gQXJnc0xpc3Quc2l6ZSgpOworICAgICAgQXJncyA9IHN0ZDo6bW92ZShBcmdzTGlzdCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2FsbExvd2VyaW5nSW5mbyAmc2V0Q2FsbGVlKFR5cGUgKlJlc3VsdFR5cGUsIEZ1bmN0aW9uVHlwZSAqRlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFRhcmdldCwgQXJnTGlzdFR5ICYmQXJnc0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUNhbGxTaXRlIENhbGwpIHsKKyAgICAgIFJldFR5ID0gUmVzdWx0VHlwZTsKKworICAgICAgSXNJblJlZyA9IENhbGwuaGFzUmV0QXR0cihBdHRyaWJ1dGU6OkluUmVnKTsKKyAgICAgIERvZXNOb3RSZXR1cm4gPQorICAgICAgICAgIENhbGwuZG9lc05vdFJldHVybigpIHx8CisgICAgICAgICAgKCFDYWxsLmlzSW52b2tlKCkgJiYKKyAgICAgICAgICAgaXNhPFVucmVhY2hhYmxlSW5zdD4oQ2FsbC5nZXRJbnN0cnVjdGlvbigpLT5nZXROZXh0Tm9kZSgpKSk7CisgICAgICBJc1ZhckFyZyA9IEZUeS0+aXNWYXJBcmcoKTsKKyAgICAgIElzUmV0dXJuVmFsdWVVc2VkID0gIUNhbGwuZ2V0SW5zdHJ1Y3Rpb24oKS0+dXNlX2VtcHR5KCk7CisgICAgICBSZXRTRXh0ID0gQ2FsbC5oYXNSZXRBdHRyKEF0dHJpYnV0ZTo6U0V4dCk7CisgICAgICBSZXRaRXh0ID0gQ2FsbC5oYXNSZXRBdHRyKEF0dHJpYnV0ZTo6WkV4dCk7CisKKyAgICAgIENhbGxlZSA9IFRhcmdldDsKKworICAgICAgQ2FsbENvbnYgPSBDYWxsLmdldENhbGxpbmdDb252KCk7CisgICAgICBOdW1GaXhlZEFyZ3MgPSBGVHktPmdldE51bVBhcmFtcygpOworICAgICAgQXJncyA9IHN0ZDo6bW92ZShBcmdzTGlzdCk7CisKKyAgICAgIENTID0gQ2FsbDsKKworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENhbGxMb3dlcmluZ0luZm8gJnNldEluUmVnaXN0ZXIoYm9vbCBWYWx1ZSA9IHRydWUpIHsKKyAgICAgIElzSW5SZWcgPSBWYWx1ZTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDYWxsTG93ZXJpbmdJbmZvICZzZXROb1JldHVybihib29sIFZhbHVlID0gdHJ1ZSkgeworICAgICAgRG9lc05vdFJldHVybiA9IFZhbHVlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENhbGxMb3dlcmluZ0luZm8gJnNldFZhckFyZyhib29sIFZhbHVlID0gdHJ1ZSkgeworICAgICAgSXNWYXJBcmcgPSBWYWx1ZTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDYWxsTG93ZXJpbmdJbmZvICZzZXRUYWlsQ2FsbChib29sIFZhbHVlID0gdHJ1ZSkgeworICAgICAgSXNUYWlsQ2FsbCA9IFZhbHVlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENhbGxMb3dlcmluZ0luZm8gJnNldERpc2NhcmRSZXN1bHQoYm9vbCBWYWx1ZSA9IHRydWUpIHsKKyAgICAgIElzUmV0dXJuVmFsdWVVc2VkID0gIVZhbHVlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENhbGxMb3dlcmluZ0luZm8gJnNldENvbnZlcmdlbnQoYm9vbCBWYWx1ZSA9IHRydWUpIHsKKyAgICAgIElzQ29udmVyZ2VudCA9IFZhbHVlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENhbGxMb3dlcmluZ0luZm8gJnNldFNFeHRSZXN1bHQoYm9vbCBWYWx1ZSA9IHRydWUpIHsKKyAgICAgIFJldFNFeHQgPSBWYWx1ZTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDYWxsTG93ZXJpbmdJbmZvICZzZXRaRXh0UmVzdWx0KGJvb2wgVmFsdWUgPSB0cnVlKSB7CisgICAgICBSZXRaRXh0ID0gVmFsdWU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2FsbExvd2VyaW5nSW5mbyAmc2V0SXNQYXRjaFBvaW50KGJvb2wgVmFsdWUgPSB0cnVlKSB7CisgICAgICBJc1BhdGNoUG9pbnQgPSBWYWx1ZTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDYWxsTG93ZXJpbmdJbmZvICZzZXRJc1Bvc3RUeXBlTGVnYWxpemF0aW9uKGJvb2wgVmFsdWU9dHJ1ZSkgeworICAgICAgSXNQb3N0VHlwZUxlZ2FsaXphdGlvbiA9IFZhbHVlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEFyZ0xpc3RUeSAmZ2V0QXJncygpIHsKKyAgICAgIHJldHVybiBBcmdzOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBmdW5jdGlvbiBsb3dlcnMgYW4gYWJzdHJhY3QgY2FsbCB0byBhIGZ1bmN0aW9uIGludG8gYW4gYWN0dWFsIGNhbGwuCisgIC8vLyBUaGlzIHJldHVybnMgYSBwYWlyIG9mIG9wZXJhbmRzLiAgVGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIHJldHVybiB2YWx1ZQorICAvLy8gZm9yIHRoZSBmdW5jdGlvbiAoaWYgUmV0VHkgaXMgbm90IFZvaWRUeSkuICBUaGUgc2Vjb25kIGVsZW1lbnQgaXMgdGhlCisgIC8vLyBvdXRnb2luZyB0b2tlbiBjaGFpbi4gSXQgY2FsbHMgTG93ZXJDYWxsIHRvIGRvIHRoZSBhY3R1YWwgbG93ZXJpbmcuCisgIHN0ZDo6cGFpcjxTRFZhbHVlLCBTRFZhbHVlPiBMb3dlckNhbGxUbyhDYWxsTG93ZXJpbmdJbmZvICZDTEkpIGNvbnN0OworCisgIC8vLyBUaGlzIGhvb2sgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBsb3dlciBjYWxscyBpbnRvIHRoZSBzcGVjaWZpZWQKKyAgLy8vIERBRy4gVGhlIG91dGdvaW5nIGFyZ3VtZW50cyB0byB0aGUgY2FsbCBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBPdXRzIGFycmF5LAorICAvLy8gYW5kIHRoZSB2YWx1ZXMgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgYXJlIGRlc2NyaWJlZCBieSB0aGUgSW5zCisgIC8vLyBhcnJheS4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBmaWxsIGluIHRoZSBJblZhbHMgYXJyYXkgd2l0aCBsZWdhbC10eXBlCisgIC8vLyByZXR1cm4gdmFsdWVzIGZyb20gdGhlIGNhbGwsIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyB0b2tlbiBjaGFpbiB2YWx1ZS4KKyAgdmlydHVhbCBTRFZhbHVlCisgICAgTG93ZXJDYWxsKENhbGxMb3dlcmluZ0luZm8gJi8qQ0xJKi8sCisgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmLypJblZhbHMqLykgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIk5vdCBJbXBsZW1lbnRlZCIpOworICB9CisKKyAgLy8vIFRhcmdldC1zcGVjaWZpYyBjbGVhbnVwIGZvciBmb3JtYWwgQnlWYWwgcGFyYW1ldGVycy4KKyAgdmlydHVhbCB2b2lkIEhhbmRsZUJ5VmFsKENDU3RhdGUgKiwgdW5zaWduZWQgJiwgdW5zaWduZWQpIGNvbnN0IHt9CisKKyAgLy8vIFRoaXMgaG9vayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgcmV0dXJuIHZhbHVlcworICAvLy8gZGVzY3JpYmVkIGJ5IHRoZSBPdXRzIGFycmF5IGNhbiBmaXQgaW50byB0aGUgcmV0dXJuIHJlZ2lzdGVycy4gIElmIGZhbHNlCisgIC8vLyBpcyByZXR1cm5lZCwgYW4gc3JldC1kZW1vdGlvbiBpcyBwZXJmb3JtZWQuCisgIHZpcnR1YWwgYm9vbCBDYW5Mb3dlclJldHVybihDYWxsaW5nQ29udjo6SUQgLypDYWxsQ29udiovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uICYvKk1GKi8sIGJvb2wgLyppc1ZhckFyZyovLAorICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmLypPdXRzKi8sCisgICAgICAgICAgICAgICBMTFZNQ29udGV4dCAmLypDb250ZXh0Ki8pIGNvbnN0CisgIHsKKyAgICAvLyBSZXR1cm4gdHJ1ZSBieSBkZWZhdWx0IHRvIGdldCBwcmVleGlzdGluZyBiZWhhdmlvci4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBUaGlzIGhvb2sgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBsb3dlciBvdXRnb2luZyByZXR1cm4gdmFsdWVzLCBkZXNjcmliZWQKKyAgLy8vIGJ5IHRoZSBPdXRzIGFycmF5LCBpbnRvIHRoZSBzcGVjaWZpZWQgREFHLiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkCisgIC8vLyByZXR1cm4gdGhlIHJlc3VsdGluZyB0b2tlbiBjaGFpbiB2YWx1ZS4KKyAgdmlydHVhbCBTRFZhbHVlIExvd2VyUmV0dXJuKFNEVmFsdWUgLypDaGFpbiovLCBDYWxsaW5nQ29udjo6SUQgLypDYWxsQ29udiovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKmlzVmFyQXJnKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICYgLypPdXRzKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJiAvKk91dFZhbHMqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNETG9jICYgLypkbCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICYgLypEQUcqLykgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIk5vdCBJbXBsZW1lbnRlZCIpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHJlc3VsdCBvZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgdXNlZCBieSBhIHJldHVybiBub2RlCisgIC8vLyBvbmx5LiBJdCBhbHNvIGNvbXB1dGUgYW5kIHJldHVybiB0aGUgaW5wdXQgY2hhaW4gZm9yIHRoZSB0YWlsIGNhbGwuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGl0IGlzIHBvc3NpYmxlIHRvIGNvZGVnZW4gYSBsaWJjYWxsIGFzCisgIC8vLyB0YWlsIGNhbGwgYXQgbGVnYWxpemF0aW9uIHRpbWUuCisgIHZpcnR1YWwgYm9vbCBpc1VzZWRCeVJldHVybk9ubHkoU0ROb2RlICosIFNEVmFsdWUgJi8qQ2hhaW4qLykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IG1heSBiZSBhYmxlIGVtaXQgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gYXMgYSB0YWlsCisgIC8vLyBjYWxsLiBUaGlzIGlzIHVzZWQgYnkgb3B0aW1pemF0aW9uIHBhc3NlcyB0byBkZXRlcm1pbmUgaWYgaXQncyBwcm9maXRhYmxlCisgIC8vLyB0byBkdXBsaWNhdGUgcmV0dXJuIGluc3RydWN0aW9ucyB0byBlbmFibGUgdGFpbGNhbGwgb3B0aW1pemF0aW9uLgorICB2aXJ0dWFsIGJvb2wgbWF5QmVFbWl0dGVkQXNUYWlsQ2FsbChjb25zdCBDYWxsSW5zdCAqKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgYnVpbHRpbiBuYW1lIGZvciB0aGUgX19idWlsdGluX19fY2xlYXJfY2FjaGUgaW50cmluc2ljCisgIC8vLyBEZWZhdWx0IGlzIHRvIGludm9rZSB0aGUgY2xlYXIgY2FjaGUgbGlicmFyeSBjYWxsCisgIHZpcnR1YWwgY29uc3QgY2hhciAqIGdldENsZWFyQ2FjaGVCdWlsdGluTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIl9fY2xlYXJfY2FjaGUiOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgcmVnaXN0ZXIgSUQgb2YgdGhlIG5hbWUgcGFzc2VkIGluLiBVc2VkIGJ5IG5hbWVkIHJlZ2lzdGVyCisgIC8vLyBnbG9iYWwgdmFyaWFibGVzIGV4dGVuc2lvbi4gVGhlcmUgaXMgbm8gdGFyZ2V0LWluZGVwZW5kZW50IGJlaGF2aW91cgorICAvLy8gc28gdGhlIGRlZmF1bHQgYWN0aW9uIGlzIHRvIGJhaWwuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0UmVnaXN0ZXJCeU5hbWUoY29uc3QgY2hhciogUmVnTmFtZSwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJOYW1lZCByZWdpc3RlcnMgbm90IGltcGxlbWVudGVkIGZvciB0aGlzIHRhcmdldCIpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHplcm8gb3Igc2lnbiBleHRlbmQgYQorICAvLy8gemVyb2V4dC9zaWduZXh0IGludGVnZXIgcmV0dXJuIHZhbHVlLiAgRklYTUU6IFNvbWUgQyBjYWxsaW5nIGNvbnZlbnRpb25zCisgIC8vLyByZXF1aXJlIHRoZSByZXR1cm4gdHlwZSB0byBiZSBwcm9tb3RlZCwgYnV0IHRoaXMgaXMgbm90IHRydWUgYWxsIHRoZSB0aW1lLAorICAvLy8gZS5nLiBpMS9pOC9pMTYgb24geDg2L3g4Nl82NC4gSXQgaXMgYWxzbyBub3QgbmVjZXNzYXJ5IGZvciBub24tQyBjYWxsaW5nCisgIC8vLyBjb252ZW50aW9ucy4gVGhlIGZyb250ZW5kIHNob3VsZCBoYW5kbGUgdGhpcyBhbmQgaW5jbHVkZSBhbGwgb2YgdGhlCisgIC8vLyBuZWNlc3NhcnkgaW5mb3JtYXRpb24uCisgIHZpcnR1YWwgRVZUIGdldFR5cGVGb3JFeHRSZXR1cm4oTExWTUNvbnRleHQgJkNvbnRleHQsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6Tm9kZVR5cGUgLypFeHRlbmRLaW5kKi8pIGNvbnN0IHsKKyAgICBFVlQgTWluVlQgPSBnZXRSZWdpc3RlclR5cGUoQ29udGV4dCwgTVZUOjppMzIpOworICAgIHJldHVybiBWVC5iaXRzTFQoTWluVlQpID8gTWluVlQgOiBWVDsKKyAgfQorCisgIC8vLyBGb3Igc29tZSB0YXJnZXRzLCBhbiBMTFZNIHN0cnVjdCB0eXBlIG11c3QgYmUgYnJva2VuIGRvd24gaW50byBtdWx0aXBsZQorICAvLy8gc2ltcGxlIHR5cGVzLCBidXQgdGhlIGNhbGxpbmcgY29udmVudGlvbiBzcGVjaWZpZXMgdGhhdCB0aGUgZW50aXJlIHN0cnVjdAorICAvLy8gbXVzdCBiZSBwYXNzZWQgaW4gYSBibG9jayBvZiBjb25zZWN1dGl2ZSByZWdpc3RlcnMuCisgIHZpcnR1YWwgYm9vbAorICBmdW5jdGlvbkFyZ3VtZW50TmVlZHNDb25zZWN1dGl2ZVJlZ2lzdGVycyhUeXBlICpUeSwgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmFyQXJnKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgYSAwIHRlcm1pbmF0ZWQgYXJyYXkgb2YgcmVnaXN0ZXJzIHRoYXQgY2FuIGJlIHNhZmVseSB1c2VkIGFzCisgIC8vLyBzY3JhdGNoIHJlZ2lzdGVycy4KKyAgdmlydHVhbCBjb25zdCBNQ1BoeXNSZWcgKmdldFNjcmF0Y2hSZWdpc3RlcnMoQ2FsbGluZ0NvbnY6OklEIENDKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gVGhpcyBjYWxsYmFjayBpcyB1c2VkIHRvIHByZXBhcmUgZm9yIGEgdm9sYXRpbGUgb3IgYXRvbWljIGxvYWQuCisgIC8vLyBJdCB0YWtlcyBhIGNoYWluIG5vZGUgYXMgaW5wdXQgYW5kIHJldHVybnMgdGhlIGNoYWluIGZvciB0aGUgbG9hZCBpdHNlbGYuCisgIC8vLworICAvLy8gSGF2aW5nIGEgY2FsbGJhY2sgbGlrZSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGFyZ2V0cyBsaWtlIFN5c3RlbVosCisgIC8vLyB3aGljaCBhbGxvd3MgYSBDUFUgdG8gcmV1c2UgdGhlIHJlc3VsdCBvZiBhIHByZXZpb3VzIGxvYWQgaW5kZWZpbml0ZWx5LAorICAvLy8gZXZlbiBpZiBhIGNhY2hlLWNvaGVyZW50IHN0b3JlIGlzIHBlcmZvcm1lZCBieSBhbm90aGVyIENQVS4gIFRoZSBkZWZhdWx0CisgIC8vLyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCisgIHZpcnR1YWwgU0RWYWx1ZSBwcmVwYXJlVm9sYXRpbGVPckF0b21pY0xvYWQoU0RWYWx1ZSBDaGFpbiwgY29uc3QgU0RMb2MgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgICAgcmV0dXJuIENoYWluOworICB9CisKKyAgLy8vIFRoaXMgY2FsbGJhY2sgaXMgdXNlZCB0byBpbnNwZWN0IGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zIGFuZCBhZGQKKyAgLy8vIHRhcmdldC1zcGVjaWZpYyBNYWNoaW5lTWVtT3BlcmFuZCBmbGFncyB0byB0aGVtLiAgVGhlIGRlZmF1bHQKKyAgLy8vIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KKyAgdmlydHVhbCBNYWNoaW5lTWVtT3BlcmFuZDo6RmxhZ3MgZ2V0TU1PRmxhZ3MoY29uc3QgSW5zdHJ1Y3Rpb24gJkkpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PTm9uZTsKKyAgfQorCisgIC8vLyBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgdGhlIHR5cGUgbGVnYWxpemVyIHRvIGxlZ2FsaXplIG5vZGVzIHdpdGggYW4KKyAgLy8vIGlsbGVnYWwgb3BlcmFuZCB0eXBlIGJ1dCBsZWdhbCByZXN1bHQgdHlwZXMuICBJdCByZXBsYWNlcyB0aGUKKyAgLy8vIExvd2VyT3BlcmF0aW9uIGNhbGxiYWNrIGluIHRoZSB0eXBlIExlZ2FsaXplci4gIFRoZSByZWFzb24gd2UgY2FuIG5vdCBkbworICAvLy8gYXdheSB3aXRoIExvd2VyT3BlcmF0aW9uIGVudGlyZWx5IGlzIHRoYXQgTGVnYWxpemVEQUcgaXNuJ3QgeWV0IHJlYWR5IHRvCisgIC8vLyB1c2UgdGhpcyBjYWxsYmFjay4KKyAgLy8vCisgIC8vLyBUT0RPOiBDb25zaWRlciBtZXJnaW5nIHdpdGggUmVwbGFjZU5vZGVSZXN1bHRzLgorICAvLy8KKyAgLy8vIFRoZSB0YXJnZXQgcGxhY2VzIG5ldyByZXN1bHQgdmFsdWVzIGZvciB0aGUgbm9kZSBpbiBSZXN1bHRzICh0aGVpciBudW1iZXIKKyAgLy8vIGFuZCB0eXBlcyBtdXN0IGV4YWN0bHkgbWF0Y2ggdGhvc2Ugb2YgdGhlIG9yaWdpbmFsIHJldHVybiB2YWx1ZXMgb2YKKyAgLy8vIHRoZSBub2RlKSwgb3IgbGVhdmVzIFJlc3VsdHMgZW1wdHksIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBub2RlIGlzIG5vdAorICAvLy8gdG8gYmUgY3VzdG9tIGxvd2VyZWQgYWZ0ZXIgYWxsLgorICAvLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMgTG93ZXJPcGVyYXRpb24uCisgIHZpcnR1YWwgdm9pZCBMb3dlck9wZXJhdGlvbldyYXBwZXIoU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmUmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgLy8vIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBmb3Igb3BlcmF0aW9ucyB0aGF0IGFyZSB1bnN1cHBvcnRlZCBieSB0aGUKKyAgLy8vIHRhcmdldCwgd2hpY2ggYXJlIHJlZ2lzdGVyZWQgdG8gdXNlICdjdXN0b20nIGxvd2VyaW5nLCBhbmQgd2hvc2UgZGVmaW5lZAorICAvLy8gdmFsdWVzIGFyZSBhbGwgbGVnYWwuICBJZiB0aGUgdGFyZ2V0IGhhcyBubyBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBjdXN0b20KKyAgLy8vIGxvd2VyaW5nLCBpdCBuZWVkIG5vdCBpbXBsZW1lbnQgdGhpcy4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKKyAgLy8vIGFib3J0cy4KKyAgdmlydHVhbCBTRFZhbHVlIExvd2VyT3BlcmF0aW9uKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAvLy8gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSBub2RlIHJlc3VsdCB0eXBlIGlzIGlsbGVnYWwgZm9yIHRoZQorICAvLy8gdGFyZ2V0LCBhbmQgdGhlIG9wZXJhdGlvbiB3YXMgcmVnaXN0ZXJlZCB0byB1c2UgJ2N1c3RvbScgbG93ZXJpbmcgZm9yIHRoYXQKKyAgLy8vIHJlc3VsdCB0eXBlLiAgVGhlIHRhcmdldCBwbGFjZXMgbmV3IHJlc3VsdCB2YWx1ZXMgZm9yIHRoZSBub2RlIGluIFJlc3VsdHMKKyAgLy8vICh0aGVpciBudW1iZXIgYW5kIHR5cGVzIG11c3QgZXhhY3RseSBtYXRjaCB0aG9zZSBvZiB0aGUgb3JpZ2luYWwgcmV0dXJuCisgIC8vLyB2YWx1ZXMgb2YgdGhlIG5vZGUpLCBvciBsZWF2ZXMgUmVzdWx0cyBlbXB0eSwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlCisgIC8vLyBub2RlIGlzIG5vdCB0byBiZSBjdXN0b20gbG93ZXJlZCBhZnRlciBhbGwuCisgIC8vLworICAvLy8gSWYgdGhlIHRhcmdldCBoYXMgbm8gb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgY3VzdG9tIGxvd2VyaW5nLCBpdCBuZWVkIG5vdAorICAvLy8gaW1wbGVtZW50IHRoaXMuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhYm9ydHMuCisgIHZpcnR1YWwgdm9pZCBSZXBsYWNlTm9kZVJlc3VsdHMoU0ROb2RlICogLypOKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICYvKlJlc3VsdHMqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJi8qREFHKi8pIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJSZXBsYWNlTm9kZVJlc3VsdHMgbm90IGltcGxlbWVudGVkIGZvciB0aGlzIHRhcmdldCEiKTsKKyAgfQorCisgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIGEgdGFyZ2V0IHNwZWNpZmljIERBRyBub2RlLgorICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFRhcmdldE5vZGVOYW1lKHVuc2lnbmVkIE9wY29kZSkgY29uc3Q7CisKKyAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgYSB0YXJnZXQgc3BlY2lmaWMgRmFzdElTZWwgb2JqZWN0LCBvciBudWxsIGlmIHRoZQorICAvLy8gdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgImZhc3QiIElTZWwuCisgIHZpcnR1YWwgRmFzdElTZWwgKmNyZWF0ZUZhc3RJU2VsKEZ1bmN0aW9uTG93ZXJpbmdJbmZvICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICopIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGJvb2wgdmVyaWZ5UmV0dXJuQWRkcmVzc0FyZ3VtZW50SXNDb25zdGFudChTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbmxpbmUgQXNtIFN1cHBvcnQgaG9va3MKKyAgLy8KKworICAvLy8gVGhpcyBob29rIGFsbG93cyB0aGUgdGFyZ2V0IHRvIGV4cGFuZCBhbiBpbmxpbmUgYXNtIGNhbGwgdG8gYmUgZXhwbGljaXQKKyAgLy8vIGxsdm0gY29kZSBpZiBpdCB3YW50cyB0by4gIFRoaXMgaXMgdXNlZnVsIGZvciB0dXJuaW5nIHNpbXBsZSBpbmxpbmUgYXNtcworICAvLy8gaW50byBMTFZNIGludHJpbnNpY3MsIHdoaWNoIGdpdmVzIHRoZSBjb21waWxlciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAvLy8gYmVoYXZpb3Igb2YgdGhlIGNvZGUuCisgIHZpcnR1YWwgYm9vbCBFeHBhbmRJbmxpbmVBc20oQ2FsbEluc3QgKikgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGVudW0gQ29uc3RyYWludFR5cGUgeworICAgIENfUmVnaXN0ZXIsICAgICAgICAgICAgLy8gQ29uc3RyYWludCByZXByZXNlbnRzIHNwZWNpZmljIHJlZ2lzdGVyKHMpLgorICAgIENfUmVnaXN0ZXJDbGFzcywgICAgICAgLy8gQ29uc3RyYWludCByZXByZXNlbnRzIGFueSBvZiByZWdpc3RlcihzKSBpbiBjbGFzcy4KKyAgICBDX01lbW9yeSwgICAgICAgICAgICAgIC8vIE1lbW9yeSBjb25zdHJhaW50LgorICAgIENfT3RoZXIsICAgICAgICAgICAgICAgLy8gU29tZXRoaW5nIGVsc2UuCisgICAgQ19Vbmtub3duICAgICAgICAgICAgICAvLyBVbnN1cHBvcnRlZCBjb25zdHJhaW50LgorICB9OworCisgIGVudW0gQ29uc3RyYWludFdlaWdodCB7CisgICAgLy8gR2VuZXJpYyB3ZWlnaHRzLgorICAgIENXX0ludmFsaWQgID0gLTEsICAgICAvLyBObyBtYXRjaC4KKyAgICBDV19Pa2F5ICAgICA9IDAsICAgICAgLy8gQWNjZXB0YWJsZS4KKyAgICBDV19Hb29kICAgICA9IDEsICAgICAgLy8gR29vZCB3ZWlnaHQuCisgICAgQ1dfQmV0dGVyICAgPSAyLCAgICAgIC8vIEJldHRlciB3ZWlnaHQuCisgICAgQ1dfQmVzdCAgICAgPSAzLCAgICAgIC8vIEJlc3Qgd2VpZ2h0LgorCisgICAgLy8gV2VsbC1rbm93biB3ZWlnaHRzLgorICAgIENXX1NwZWNpZmljUmVnICA9IENXX09rYXksICAgIC8vIFNwZWNpZmljIHJlZ2lzdGVyIG9wZXJhbmRzLgorICAgIENXX1JlZ2lzdGVyICAgICA9IENXX0dvb2QsICAgIC8vIFJlZ2lzdGVyIG9wZXJhbmRzLgorICAgIENXX01lbW9yeSAgICAgICA9IENXX0JldHRlciwgIC8vIE1lbW9yeSBvcGVyYW5kcy4KKyAgICBDV19Db25zdGFudCAgICAgPSBDV19CZXN0LCAgICAvLyBDb25zdGFudCBvcGVyYW5kLgorICAgIENXX0RlZmF1bHQgICAgICA9IENXX09rYXkgICAgIC8vIERlZmF1bHQgb3IgZG9uJ3Qga25vdyB0eXBlLgorICB9OworCisgIC8vLyBUaGlzIGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBlYWNoIGNvbnN0cmFpbnQgdGhhdCB3ZSBhcmUgbG93ZXJpbmcuCisgIHN0cnVjdCBBc21PcGVyYW5kSW5mbyA6IHB1YmxpYyBJbmxpbmVBc206OkNvbnN0cmFpbnRJbmZvIHsKKyAgICAvLy8gVGhpcyBjb250YWlucyB0aGUgYWN0dWFsIHN0cmluZyBmb3IgdGhlIGNvZGUsIGxpa2UgIm0iLiAgVGFyZ2V0TG93ZXJpbmcKKyAgICAvLy8gcGlja3MgdGhlICdiZXN0JyBjb2RlIGZyb20gQ29uc3RyYWludEluZm86OkNvZGVzIHRoYXQgbW9zdCBjbG9zZWx5CisgICAgLy8vIG1hdGNoZXMgdGhlIG9wZXJhbmQuCisgICAgc3RkOjpzdHJpbmcgQ29uc3RyYWludENvZGU7CisKKyAgICAvLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnN0cmFpbnQgY29kZSwgZS5nLiBSZWdpc3RlciwgUmVnaXN0ZXJDbGFzcywKKyAgICAvLy8gTWVtb3J5LCBPdGhlciwgVW5rbm93bi4KKyAgICBUYXJnZXRMb3dlcmluZzo6Q29uc3RyYWludFR5cGUgQ29uc3RyYWludFR5cGUgPSBUYXJnZXRMb3dlcmluZzo6Q19Vbmtub3duOworCisgICAgLy8vIElmIHRoaXMgaXMgdGhlIHJlc3VsdCBvdXRwdXQgb3BlcmFuZCBvciBhIGNsb2JiZXIsIHRoaXMgaXMgbnVsbCwKKyAgICAvLy8gb3RoZXJ3aXNlIGl0IGlzIHRoZSBpbmNvbWluZyBvcGVyYW5kIHRvIHRoZSBDYWxsSW5zdC4gIFRoaXMgZ2V0cworICAgIC8vLyBtb2RpZmllZCBhcyB0aGUgYXNtIGlzIHByb2Nlc3NlZC4KKyAgICBWYWx1ZSAqQ2FsbE9wZXJhbmRWYWwgPSBudWxscHRyOworCisgICAgLy8vIFRoZSBWYWx1ZVR5cGUgZm9yIHRoZSBvcGVyYW5kIHZhbHVlLgorICAgIE1WVCBDb25zdHJhaW50VlQgPSBNVlQ6Ok90aGVyOworCisgICAgLy8vIENvcHkgY29uc3RydWN0b3IgZm9yIGNvcHlpbmcgZnJvbSBhIENvbnN0cmFpbnRJbmZvLgorICAgIEFzbU9wZXJhbmRJbmZvKElubGluZUFzbTo6Q29uc3RyYWludEluZm8gSW5mbykKKyAgICAgICAgOiBJbmxpbmVBc206OkNvbnN0cmFpbnRJbmZvKHN0ZDo6bW92ZShJbmZvKSkge30KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBvZiB0aGlzIGlzIGFuIGlucHV0IG9wZXJhbmQgdGhhdCBpcyBhIG1hdGNoaW5nIGNvbnN0cmFpbnQKKyAgICAvLy8gbGlrZSAiNCIuCisgICAgYm9vbCBpc01hdGNoaW5nSW5wdXRDb25zdHJhaW50KCkgY29uc3Q7CisKKyAgICAvLy8gSWYgdGhpcyBpcyBhbiBpbnB1dCBtYXRjaGluZyBjb25zdHJhaW50LCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBvdXRwdXQKKyAgICAvLy8gb3BlcmFuZCBpdCBtYXRjaGVzLgorICAgIHVuc2lnbmVkIGdldE1hdGNoZWRPcGVyYW5kKCkgY29uc3Q7CisgIH07CisKKyAgdXNpbmcgQXNtT3BlcmFuZEluZm9WZWN0b3IgPSBzdGQ6OnZlY3RvcjxBc21PcGVyYW5kSW5mbz47CisKKyAgLy8vIFNwbGl0IHVwIHRoZSBjb25zdHJhaW50IHN0cmluZyBmcm9tIHRoZSBpbmxpbmUgYXNzZW1ibHkgdmFsdWUgaW50byB0aGUKKyAgLy8vIHNwZWNpZmljIGNvbnN0cmFpbnRzIGFuZCB0aGVpciBwcmVmaXhlcywgYW5kIGFsc28gdGllIGluIHRoZSBhc3NvY2lhdGVkCisgIC8vLyBvcGVyYW5kIHZhbHVlcy4gIElmIHRoaXMgcmV0dXJucyBhbiBlbXB0eSB2ZWN0b3IsIGFuZCBpZiB0aGUgY29uc3RyYWludAorICAvLy8gc3RyaW5nIGl0c2VsZiBpc24ndCBlbXB0eSwgdGhlcmUgd2FzIGFuIGVycm9yIHBhcnNpbmcuCisgIHZpcnR1YWwgQXNtT3BlcmFuZEluZm9WZWN0b3IgUGFyc2VDb25zdHJhaW50cyhjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlQ2FsbFNpdGUgQ1MpIGNvbnN0OworCisgIC8vLyBFeGFtaW5lIGNvbnN0cmFpbnQgdHlwZSBhbmQgb3BlcmFuZCB0eXBlIGFuZCBkZXRlcm1pbmUgYSB3ZWlnaHQgdmFsdWUuCisgIC8vLyBUaGUgb3BlcmFuZCBvYmplY3QgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBzZXQgdXAgd2l0aCB0aGUgb3BlcmFuZCB0eXBlLgorICB2aXJ0dWFsIENvbnN0cmFpbnRXZWlnaHQgZ2V0TXVsdGlwbGVDb25zdHJhaW50TWF0Y2hXZWlnaHQoCisgICAgICBBc21PcGVyYW5kSW5mbyAmaW5mbywgaW50IG1hSW5kZXgpIGNvbnN0OworCisgIC8vLyBFeGFtaW5lIGNvbnN0cmFpbnQgc3RyaW5nIGFuZCBvcGVyYW5kIHR5cGUgYW5kIGRldGVybWluZSBhIHdlaWdodCB2YWx1ZS4KKyAgLy8vIFRoZSBvcGVyYW5kIG9iamVjdCBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuIHNldCB1cCB3aXRoIHRoZSBvcGVyYW5kIHR5cGUuCisgIHZpcnR1YWwgQ29uc3RyYWludFdlaWdodCBnZXRTaW5nbGVDb25zdHJhaW50TWF0Y2hXZWlnaHQoCisgICAgICBBc21PcGVyYW5kSW5mbyAmaW5mbywgY29uc3QgY2hhciAqY29uc3RyYWludCkgY29uc3Q7CisKKyAgLy8vIERldGVybWluZXMgdGhlIGNvbnN0cmFpbnQgY29kZSBhbmQgY29uc3RyYWludCB0eXBlIHRvIHVzZSBmb3IgdGhlIHNwZWNpZmljCisgIC8vLyBBc21PcGVyYW5kSW5mbywgc2V0dGluZyBPcEluZm8uQ29uc3RyYWludENvZGUgYW5kIE9wSW5mby5Db25zdHJhaW50VHlwZS4KKyAgLy8vIElmIHRoZSBhY3R1YWwgb3BlcmFuZCBiZWluZyBwYXNzZWQgaW4gaXMgYXZhaWxhYmxlLCBpdCBjYW4gYmUgcGFzc2VkIGluIGFzCisgIC8vLyBPcCwgb3RoZXJ3aXNlIGFuIGVtcHR5IFNEVmFsdWUgY2FuIGJlIHBhc3NlZC4KKyAgdmlydHVhbCB2b2lkIENvbXB1dGVDb25zdHJhaW50VG9Vc2UoQXNtT3BlcmFuZEluZm8gJk9wSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICpEQUcgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gR2l2ZW4gYSBjb25zdHJhaW50LCByZXR1cm4gdGhlIHR5cGUgb2YgY29uc3RyYWludCBpdCBpcyBmb3IgdGhpcyB0YXJnZXQuCisgIHZpcnR1YWwgQ29uc3RyYWludFR5cGUgZ2V0Q29uc3RyYWludFR5cGUoU3RyaW5nUmVmIENvbnN0cmFpbnQpIGNvbnN0OworCisgIC8vLyBHaXZlbiBhIHBoeXNpY2FsIHJlZ2lzdGVyIGNvbnN0cmFpbnQgKGUuZy4gIHtlZHh9KSwgcmV0dXJuIHRoZSByZWdpc3RlcgorICAvLy8gbnVtYmVyIGFuZCB0aGUgcmVnaXN0ZXIgY2xhc3MgZm9yIHRoZSByZWdpc3Rlci4KKyAgLy8vCisgIC8vLyBHaXZlbiBhIHJlZ2lzdGVyIGNsYXNzIGNvbnN0cmFpbnQsIGxpa2UgJ3InLCBpZiB0aGlzIGNvcnJlc3BvbmRzIGRpcmVjdGx5CisgIC8vLyB0byBhbiBMTFZNIHJlZ2lzdGVyIGNsYXNzLCByZXR1cm4gYSByZWdpc3RlciBvZiAwIGFuZCB0aGUgcmVnaXN0ZXIgY2xhc3MKKyAgLy8vIHBvaW50ZXIuCisgIC8vLworICAvLy8gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBDX1JlZ2lzdGVyIGNvbnN0cmFpbnRzLiAgT24gZXJyb3IsIHRoaXMKKyAgLy8vIHJldHVybnMgYSByZWdpc3RlciBudW1iZXIgb2YgMCBhbmQgYSBudWxsIHJlZ2lzdGVyIGNsYXNzIHBvaW50ZXIuCisgIHZpcnR1YWwgc3RkOjpwYWlyPHVuc2lnbmVkLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICo+CisgIGdldFJlZ0ZvcklubGluZUFzbUNvbnN0cmFpbnQoY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENvbnN0cmFpbnQsIE1WVCBWVCkgY29uc3Q7CisKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRJbmxpbmVBc21NZW1Db25zdHJhaW50KFN0cmluZ1JlZiBDb25zdHJhaW50Q29kZSkgY29uc3QgeworICAgIGlmIChDb25zdHJhaW50Q29kZSA9PSAiaSIpCisgICAgICByZXR1cm4gSW5saW5lQXNtOjpDb25zdHJhaW50X2k7CisgICAgZWxzZSBpZiAoQ29uc3RyYWludENvZGUgPT0gIm0iKQorICAgICAgcmV0dXJuIElubGluZUFzbTo6Q29uc3RyYWludF9tOworICAgIHJldHVybiBJbmxpbmVBc206OkNvbnN0cmFpbnRfVW5rbm93bjsKKyAgfQorCisgIC8vLyBUcnkgdG8gcmVwbGFjZSBhbiBYIGNvbnN0cmFpbnQsIHdoaWNoIG1hdGNoZXMgYW55dGhpbmcsIHdpdGggYW5vdGhlciB0aGF0CisgIC8vLyBoYXMgbW9yZSBzcGVjaWZpYyByZXF1aXJlbWVudHMgYmFzZWQgb24gdGhlIHR5cGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcKKyAgLy8vIG9wZXJhbmQuICBUaGlzIHJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyByZXBsYWNlbWVudCB0byBtYWtlLgorICB2aXJ0dWFsIGNvbnN0IGNoYXIgKkxvd2VyWENvbnN0cmFpbnQoRVZUIENvbnN0cmFpbnRWVCkgY29uc3Q7CisKKyAgLy8vIExvd2VyIHRoZSBzcGVjaWZpZWQgb3BlcmFuZCBpbnRvIHRoZSBPcHMgdmVjdG9yLiAgSWYgaXQgaXMgaW52YWxpZCwgZG9uJ3QKKyAgLy8vIGFkZCBhbnl0aGluZyB0byBPcHMuCisgIHZpcnR1YWwgdm9pZCBMb3dlckFzbU9wZXJhbmRGb3JDb25zdHJhaW50KFNEVmFsdWUgT3AsIHN0ZDo6c3RyaW5nICZDb25zdHJhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTRFZhbHVlPiAmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIERpdiB1dGlsaXR5IGZ1bmN0aW9ucworICAvLworICBTRFZhbHVlIEJ1aWxkU0RJVihTRE5vZGUgKk4sIGNvbnN0IEFQSW50ICZEaXZpc29yLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0FmdGVyTGVnYWxpemF0aW9uLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTRE5vZGUgKj4gKkNyZWF0ZWQpIGNvbnN0OworICBTRFZhbHVlIEJ1aWxkVURJVihTRE5vZGUgKk4sIGNvbnN0IEFQSW50ICZEaXZpc29yLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0FmdGVyTGVnYWxpemF0aW9uLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTRE5vZGUgKj4gKkNyZWF0ZWQpIGNvbnN0OworCisgIC8vLyBUYXJnZXRzIG1heSBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIHByb3ZpZGUgY3VzdG9tIFNESVYgbG93ZXJpbmcgZm9yCisgIC8vLyBwb3dlci1vZi0yIGRlbm9taW5hdG9ycy4gIElmIHRoZSB0YXJnZXQgcmV0dXJucyBhbiBlbXB0eSBTRFZhbHVlLCBMTFZNCisgIC8vLyBhc3N1bWVzIFNESVYgaXMgZXhwZW5zaXZlIGFuZCByZXBsYWNlcyBpdCB3aXRoIGEgc2VyaWVzIG9mIG90aGVyIGludGVnZXIKKyAgLy8vIG9wZXJhdGlvbnMuCisgIHZpcnR1YWwgU0RWYWx1ZSBCdWlsZFNESVZQb3cyKFNETm9kZSAqTiwgY29uc3QgQVBJbnQgJkRpdmlzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTRE5vZGUgKj4gKkNyZWF0ZWQpIGNvbnN0OworCisgIC8vLyBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgdGFyZ2V0IHByZWZlcnMgdG8gY29tYmluZSBGRElWcyB3aXRoIHRoZSBzYW1lCisgIC8vLyBkaXZpc29yLiBJZiB0aGUgdHJhbnNmb3JtIHNob3VsZCBuZXZlciBiZSBkb25lLCByZXR1cm4gemVyby4gSWYgdGhlCisgIC8vLyB0cmFuc2Zvcm0gc2hvdWxkIGJlIGRvbmUsIHJldHVybiB0aGUgbWluaW11bSBudW1iZXIgb2YgZGl2aXNvciB1c2VzCisgIC8vLyB0aGF0IG11c3QgZXhpc3QuCisgIHZpcnR1YWwgdW5zaWduZWQgY29tYmluZVJlcGVhdGVkRlBEaXZpc29ycygpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBIb29rcyBmb3IgYnVpbGRpbmcgZXN0aW1hdGVzIGluIHBsYWNlIG9mIHNsb3dlciBkaXZpc2lvbnMgYW5kIHNxdWFyZQorICAvLy8gcm9vdHMuCisKKyAgLy8vIFJldHVybiBlaXRoZXIgYSBzcXVhcmUgcm9vdCBvciBpdHMgcmVjaXByb2NhbCBlc3RpbWF0ZSB2YWx1ZSBmb3IgdGhlIGlucHV0CisgIC8vLyBvcGVyYW5kLgorICAvLy8gXHAgRW5hYmxlZCBpcyBhIFJlY2lwcm9jYWxFc3RpbWF0ZSBlbnVtIHdpdGggdmFsdWUgZWl0aGVyICdVbnNwZWNpZmllZCcgb3IKKyAgLy8vICdFbmFibGVkJyBhcyBzZXQgYnkgYSBwb3RlbnRpYWwgZGVmYXVsdCBvdmVycmlkZSBhdHRyaWJ1dGUuCisgIC8vLyBJZiBccCBSZWZpbmVtZW50U3RlcHMgaXMgJ1Vuc3BlY2lmaWVkJywgdGhlIG51bWJlciBvZiBOZXd0b24tUmFwaHNvbgorICAvLy8gcmVmaW5lbWVudCBpdGVyYXRpb25zIHJlcXVpcmVkIHRvIGdlbmVyYXRlIGEgc3VmZmljaWVudCAodGhvdWdoIG5vdAorICAvLy8gbmVjZXNzYXJpbHkgSUVFRS03NTQgY29tcGxpYW50KSBlc3RpbWF0ZSBpcyByZXR1cm5lZCBpbiB0aGF0IHBhcmFtZXRlci4KKyAgLy8vIFRoZSBib29sZWFuIFVzZU9uZUNvbnN0TlIgb3V0cHV0IGlzIHVzZWQgdG8gc2VsZWN0IGEgTmV3dG9uLVJhcGhzb24KKyAgLy8vIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgZWl0aGVyIG9uZSBvciB0d28gY29uc3RhbnRzLgorICAvLy8gVGhlIGJvb2xlYW4gUmVjaXByb2NhbCBpcyB1c2VkIHRvIHNlbGVjdCB3aGV0aGVyIHRoZSBlc3RpbWF0ZSBpcyBmb3IgdGhlCisgIC8vLyBzcXVhcmUgcm9vdCBvZiB0aGUgaW5wdXQgb3BlcmFuZCBvciB0aGUgcmVjaXByb2NhbCBvZiBpdHMgc3F1YXJlIHJvb3QuCisgIC8vLyBBIHRhcmdldCBtYXkgY2hvb3NlIHRvIGltcGxlbWVudCBpdHMgb3duIHJlZmluZW1lbnQgd2l0aGluIHRoaXMgZnVuY3Rpb24uCisgIC8vLyBJZiB0aGF0J3MgdHJ1ZSwgdGhlbiByZXR1cm4gJzAnIGFzIHRoZSBudW1iZXIgb2YgUmVmaW5lbWVudFN0ZXBzIHRvIGF2b2lkCisgIC8vLyBhbnkgZnVydGhlciByZWZpbmVtZW50IG9mIHRoZSBlc3RpbWF0ZS4KKyAgLy8vIEFuIGVtcHR5IFNEVmFsdWUgcmV0dXJuIG1lYW5zIG5vIGVzdGltYXRlIHNlcXVlbmNlIGNhbiBiZSBjcmVhdGVkLgorICB2aXJ0dWFsIFNEVmFsdWUgZ2V0U3FydEVzdGltYXRlKFNEVmFsdWUgT3BlcmFuZCwgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEVuYWJsZWQsIGludCAmUmVmaW5lbWVudFN0ZXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJlVzZU9uZUNvbnN0TlIsIGJvb2wgUmVjaXByb2NhbCkgY29uc3QgeworICAgIHJldHVybiBTRFZhbHVlKCk7CisgIH0KKworICAvLy8gUmV0dXJuIGEgcmVjaXByb2NhbCBlc3RpbWF0ZSB2YWx1ZSBmb3IgdGhlIGlucHV0IG9wZXJhbmQuCisgIC8vLyBccCBFbmFibGVkIGlzIGEgUmVjaXByb2NhbEVzdGltYXRlIGVudW0gd2l0aCB2YWx1ZSBlaXRoZXIgJ1Vuc3BlY2lmaWVkJyBvcgorICAvLy8gJ0VuYWJsZWQnIGFzIHNldCBieSBhIHBvdGVudGlhbCBkZWZhdWx0IG92ZXJyaWRlIGF0dHJpYnV0ZS4KKyAgLy8vIElmIFxwIFJlZmluZW1lbnRTdGVwcyBpcyAnVW5zcGVjaWZpZWQnLCB0aGUgbnVtYmVyIG9mIE5ld3Rvbi1SYXBoc29uCisgIC8vLyByZWZpbmVtZW50IGl0ZXJhdGlvbnMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgYSBzdWZmaWNpZW50ICh0aG91Z2ggbm90CisgIC8vLyBuZWNlc3NhcmlseSBJRUVFLTc1NCBjb21wbGlhbnQpIGVzdGltYXRlIGlzIHJldHVybmVkIGluIHRoYXQgcGFyYW1ldGVyLgorICAvLy8gQSB0YXJnZXQgbWF5IGNob29zZSB0byBpbXBsZW1lbnQgaXRzIG93biByZWZpbmVtZW50IHdpdGhpbiB0aGlzIGZ1bmN0aW9uLgorICAvLy8gSWYgdGhhdCdzIHRydWUsIHRoZW4gcmV0dXJuICcwJyBhcyB0aGUgbnVtYmVyIG9mIFJlZmluZW1lbnRTdGVwcyB0byBhdm9pZAorICAvLy8gYW55IGZ1cnRoZXIgcmVmaW5lbWVudCBvZiB0aGUgZXN0aW1hdGUuCisgIC8vLyBBbiBlbXB0eSBTRFZhbHVlIHJldHVybiBtZWFucyBubyBlc3RpbWF0ZSBzZXF1ZW5jZSBjYW4gYmUgY3JlYXRlZC4KKyAgdmlydHVhbCBTRFZhbHVlIGdldFJlY2lwRXN0aW1hdGUoU0RWYWx1ZSBPcGVyYW5kLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEVuYWJsZWQsIGludCAmUmVmaW5lbWVudFN0ZXBzKSBjb25zdCB7CisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBMZWdhbGl6YXRpb24gdXRpbGl0eSBmdW5jdGlvbnMKKyAgLy8KKworICAvLy8gRXhwYW5kIGEgTVVMIG9yIFtVU11NVUxfTE9ISSBvZiBuLWJpdCB2YWx1ZXMgaW50byB0d28gb3IgZm91ciBub2RlcywKKyAgLy8vIHJlc3BlY3RpdmVseSwgZWFjaCBjb21wdXRpbmcgYW4gbi8yLWJpdCBwYXJ0IG9mIHRoZSByZXN1bHQuCisgIC8vLyBccGFyYW0gUmVzdWx0IEEgdmVjdG9yIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgcGFydHMgb2YgdGhlIHJlc3VsdAorICAvLy8gICAgICAgIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuCisgIC8vLyBccGFyYW0gTEwgTG93IGJpdHMgb2YgdGhlIExIUyBvZiB0aGUgTVVMLiAgWW91IGNhbiB1c2UgdGhpcyBwYXJhbWV0ZXIKKyAgLy8vICAgICAgICBpZiB5b3Ugd2FudCB0byBjb250cm9sIGhvdyBsb3cgYml0cyBhcmUgZXh0cmFjdGVkIGZyb20gdGhlIExIUy4KKyAgLy8vIFxwYXJhbSBMSCBIaWdoIGJpdHMgb2YgdGhlIExIUyBvZiB0aGUgTVVMLiAgU2VlIExMIGZvciBtZWFuaW5nLgorICAvLy8gXHBhcmFtIFJMIExvdyBiaXRzIG9mIHRoZSBSSFMgb2YgdGhlIE1VTC4gIFNlZSBMTCBmb3IgbWVhbmluZworICAvLy8gXHBhcmFtIFJIIEhpZ2ggYml0cyBvZiB0aGUgUkhTIG9mIHRoZSBNVUwuICBTZWUgTEwgZm9yIG1lYW5pbmcuCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZSBub2RlIGhhcyBiZWVuIGV4cGFuZGVkLCBmYWxzZSBpZiBpdCBoYXMgbm90CisgIGJvb2wgZXhwYW5kTVVMX0xPSEkodW5zaWduZWQgT3Bjb2RlLCBFVlQgVlQsIFNETG9jIGRsLCBTRFZhbHVlIExIUywKKyAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFJIUywgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZSZXN1bHQsIEVWVCBIaUxvVlQsCisgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsIE11bEV4cGFuc2lvbktpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIExMID0gU0RWYWx1ZSgpLCBTRFZhbHVlIExIID0gU0RWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgUkwgPSBTRFZhbHVlKCksIFNEVmFsdWUgUkggPSBTRFZhbHVlKCkpIGNvbnN0OworCisgIC8vLyBFeHBhbmQgYSBNVUwgaW50byB0d28gbm9kZXMuICBPbmUgdGhhdCBjb21wdXRlcyB0aGUgaGlnaCBiaXRzIG9mCisgIC8vLyB0aGUgcmVzdWx0IGFuZCBvbmUgdGhhdCBjb21wdXRlcyB0aGUgbG93IGJpdHMuCisgIC8vLyBccGFyYW0gSGlMb1ZUIFRoZSB2YWx1ZSB0eXBlIHRvIHVzZSBmb3IgdGhlIExvIGFuZCBIaSBub2Rlcy4KKyAgLy8vIFxwYXJhbSBMTCBMb3cgYml0cyBvZiB0aGUgTEhTIG9mIHRoZSBNVUwuICBZb3UgY2FuIHVzZSB0aGlzIHBhcmFtZXRlcgorICAvLy8gICAgICAgIGlmIHlvdSB3YW50IHRvIGNvbnRyb2wgaG93IGxvdyBiaXRzIGFyZSBleHRyYWN0ZWQgZnJvbSB0aGUgTEhTLgorICAvLy8gXHBhcmFtIExIIEhpZ2ggYml0cyBvZiB0aGUgTEhTIG9mIHRoZSBNVUwuICBTZWUgTEwgZm9yIG1lYW5pbmcuCisgIC8vLyBccGFyYW0gUkwgTG93IGJpdHMgb2YgdGhlIFJIUyBvZiB0aGUgTVVMLiAgU2VlIExMIGZvciBtZWFuaW5nCisgIC8vLyBccGFyYW0gUkggSGlnaCBiaXRzIG9mIHRoZSBSSFMgb2YgdGhlIE1VTC4gIFNlZSBMTCBmb3IgbWVhbmluZy4KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUgaGFzIGJlZW4gZXhwYW5kZWQuIGZhbHNlIGlmIGl0IGhhcyBub3QKKyAgYm9vbCBleHBhbmRNVUwoU0ROb2RlICpOLCBTRFZhbHVlICZMbywgU0RWYWx1ZSAmSGksIEVWVCBIaUxvVlQsCisgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHLCBNdWxFeHBhbnNpb25LaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgIFNEVmFsdWUgTEwgPSBTRFZhbHVlKCksIFNEVmFsdWUgTEggPSBTRFZhbHVlKCksCisgICAgICAgICAgICAgICAgIFNEVmFsdWUgUkwgPSBTRFZhbHVlKCksIFNEVmFsdWUgUkggPSBTRFZhbHVlKCkpIGNvbnN0OworCisgIC8vLyBFeHBhbmQgZmxvYXQoZjMyKSB0byBTSU5UKGk2NCkgY29udmVyc2lvbgorICAvLy8gXHBhcmFtIE4gTm9kZSB0byBleHBhbmQKKyAgLy8vIFxwYXJhbSBSZXN1bHQgb3V0cHV0IGFmdGVyIGNvbnZlcnNpb24KKyAgLy8vIFxyZXR1cm5zIFRydWUsIGlmIHRoZSBleHBhbnNpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQorICBib29sIGV4cGFuZEZQX1RPX1NJTlQoU0ROb2RlICpOLCBTRFZhbHVlICZSZXN1bHQsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAvLy8gVHVybiBsb2FkIG9mIHZlY3RvciB0eXBlIGludG8gYSBsb2FkIG9mIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnRzLgorICAvLy8gXHBhcmFtIExEIGxvYWQgdG8gZXhwYW5kCisgIC8vLyBccmV0dXJucyBNRVJHRV9WQUxVRXMgb2YgdGhlIHNjYWxhciBsb2FkcyB3aXRoIHRoZWlyIGNoYWlucy4KKyAgU0RWYWx1ZSBzY2FsYXJpemVWZWN0b3JMb2FkKExvYWRTRE5vZGUgKkxELCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgLy8gVHVybiBhIHN0b3JlIG9mIGEgdmVjdG9yIHR5cGUgaW50byBzdG9yZXMgb2YgdGhlIGluZGl2aWR1YWwgZWxlbWVudHMuCisgIC8vLyBccGFyYW0gU1QgU3RvcmUgd2l0aCBhIHZlY3RvciB2YWx1ZSB0eXBlCisgIC8vLyBccmV0dXJucyBNRVJHRV9WQUxVcyBvZiB0aGUgaW5kaXZpZHVhbCBzdG9yZSBjaGFpbnMuCisgIFNEVmFsdWUgc2NhbGFyaXplVmVjdG9yU3RvcmUoU3RvcmVTRE5vZGUgKlNULCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgLy8vIEV4cGFuZHMgYW4gdW5hbGlnbmVkIGxvYWQgdG8gMiBoYWxmLXNpemUgbG9hZHMgZm9yIGFuIGludGVnZXIsIGFuZAorICAvLy8gcG9zc2libHkgbW9yZSBmb3IgdmVjdG9ycy4KKyAgc3RkOjpwYWlyPFNEVmFsdWUsIFNEVmFsdWU+IGV4cGFuZFVuYWxpZ25lZExvYWQoTG9hZFNETm9kZSAqTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAvLy8gRXhwYW5kcyBhbiB1bmFsaWduZWQgc3RvcmUgdG8gMiBoYWxmLXNpemUgc3RvcmVzIGZvciBpbnRlZ2VyIHZhbHVlcywgYW5kCisgIC8vLyBwb3NzaWJseSBtb3JlIGZvciB2ZWN0b3JzLgorICBTRFZhbHVlIGV4cGFuZFVuYWxpZ25lZFN0b3JlKFN0b3JlU0ROb2RlICpTVCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgIC8vLyBJbmNyZW1lbnRzIG1lbW9yeSBhZGRyZXNzIFxwIEFkZHIgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZQorICAvLy8gXHAgRGF0YVZUIHRoYXQgc2hvdWxkIGJlIHN0b3JlZC4gSWYgdGhlIGRhdGEgaXMgc3RvcmVkIGluIGNvbXByZXNzZWQKKyAgLy8vIGZvcm0sIHRoZSBtZW1vcnkgYWRkcmVzcyBzaG91bGQgYmUgaW5jcmVtZW50ZWQgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2YKKyAgLy8vIHRoZSBzdG9yZWQgZWxlbWVudHMuIFRoaXMgbnVtYmVyIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgJzEncyBiaXRzCisgIC8vLyBpbiB0aGUgXHAgTWFzay4KKyAgLy8vIFxwIERhdGFWVCBpcyBhIHZlY3RvciB0eXBlLiBccCBNYXNrIGlzIGEgdmVjdG9yIHZhbHVlLgorICAvLy8gXHAgRGF0YVZUIGFuZCBccCBNYXNrIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHZlY3RvciBlbGVtZW50cy4KKyAgU0RWYWx1ZSBJbmNyZW1lbnRNZW1vcnlBZGRyZXNzKFNEVmFsdWUgQWRkciwgU0RWYWx1ZSBNYXNrLCBjb25zdCBTRExvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgRGF0YVZULCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNDb21wcmVzc2VkTWVtb3J5KSBjb25zdDsKKworICAvLy8gR2V0IGEgcG9pbnRlciB0byB2ZWN0b3IgZWxlbWVudCBccCBJZHggbG9jYXRlZCBpbiBtZW1vcnkgZm9yIGEgdmVjdG9yIG9mCisgIC8vLyB0eXBlIFxwIFZlY1ZUIHN0YXJ0aW5nIGF0IGEgYmFzZSBhZGRyZXNzIG9mIFxwIFZlY1B0ci4gSWYgXHAgSWR4IGlzIG91dCBvZgorICAvLy8gYm91bmRzIHRoZSByZXR1cm5lZCBwb2ludGVyIGlzIHVuc3BlY2lmaWVkLCBidXQgd2lsbCBiZSB3aXRoaW4gdGhlIHZlY3RvcgorICAvLy8gYm91bmRzLgorICBTRFZhbHVlIGdldFZlY3RvckVsZW1lbnRQb2ludGVyKFNlbGVjdGlvbkRBRyAmREFHLCBTRFZhbHVlIFZlY1B0ciwgRVZUIFZlY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgSWR4KSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSW5zdHJ1Y3Rpb24gRW1pdHRpbmcgSG9va3MKKyAgLy8KKworICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHRhcmdldHMgdGhhdCBtYXJrIGluc3RydWN0aW9ucyB3aXRoCisgIC8vLyB0aGUgJ3VzZXNDdXN0b21JbnNlcnRlcicgZmxhZy4gIFRoZXNlIGluc3RydWN0aW9ucyBhcmUgc3BlY2lhbCBpbiB2YXJpb3VzCisgIC8vLyB3YXlzLCB3aGljaCByZXF1aXJlIHNwZWNpYWwgc3VwcG9ydCB0byBpbnNlcnQuICBUaGUgc3BlY2lmaWVkIE1hY2hpbmVJbnN0cgorICAvLy8gaXMgY3JlYXRlZCBidXQgbm90IGluc2VydGVkIGludG8gYW55IGJhc2ljIGJsb2NrcywgYW5kIHRoaXMgbWV0aG9kIGlzCisgIC8vLyBjYWxsZWQgdG8gZXhwYW5kIGl0IGludG8gYSBzZXF1ZW5jZSBvZiBpbnN0cnVjdGlvbnMsIHBvdGVudGlhbGx5IGFsc28KKyAgLy8vIGNyZWF0aW5nIG5ldyBiYXNpYyBibG9ja3MgYW5kIGNvbnRyb2wgZmxvdy4KKyAgLy8vIEFzIGxvbmcgYXMgdGhlIHJldHVybmVkIGJhc2ljIGJsb2NrIGlzIGRpZmZlcmVudCAoaS5lLiwgd2UgY3JlYXRlZCBhIG5ldworICAvLy8gb25lKSwgdGhlIGN1c3RvbSBpbnNlcnRlciBpcyBmcmVlIHRvIG1vZGlmeSB0aGUgcmVzdCBvZiBccCBNQkIuCisgIHZpcnR1YWwgTWFjaGluZUJhc2ljQmxvY2sgKgorICBFbWl0SW5zdHJXaXRoQ3VzdG9tSW5zZXJ0ZXIoTWFjaGluZUluc3RyICZNSSwgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3Q7CisKKyAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB0YXJnZXRzIHRoYXQgbWFyayBpbnN0cnVjdGlvbnMgd2l0aAorICAvLy8gdGhlICdoYXNQb3N0SVNlbEhvb2snIGZsYWcuIFRoZXNlIGluc3RydWN0aW9ucyBtdXN0IGJlIGFkanVzdGVkIGFmdGVyCisgIC8vLyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gYnkgdGFyZ2V0IGhvb2tzLiAgZS5nLiBUbyBmaWxsIGluIG9wdGlvbmFsIGRlZnMgZm9yCisgIC8vLyBBUk0gJ3MnIHNldHRpbmcgaW5zdHJ1Y3Rpb25zLgorICB2aXJ0dWFsIHZvaWQgQWRqdXN0SW5zdHJQb3N0SW5zdHJTZWxlY3Rpb24oTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETm9kZSAqTm9kZSkgY29uc3Q7CisKKyAgLy8vIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCBTZWxlY3Rpb25EQUdCdWlsZGVyIGVtaXRzIGEKKyAgLy8vIExPQURfU1RBQ0tfR1VBUkQgbm9kZSB3aGVuIGl0IGlzIGxvd2VyaW5nIEludHJpbnNpYzo6c3RhY2twcm90ZWN0b3IuCisgIHZpcnR1YWwgYm9vbCB1c2VMb2FkU3RhY2tHdWFyZE5vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdmlydHVhbCBTRFZhbHVlIGVtaXRTdGFja0d1YXJkWG9yRlAoU2VsZWN0aW9uREFHICZEQUcsIFNEVmFsdWUgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRExvYyAmREwpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgdGFyZ2V0Iik7CisgIH0KKworICAvLy8gTG93ZXIgVExTIGdsb2JhbCBhZGRyZXNzIFNETm9kZSBmb3IgdGFyZ2V0IGluZGVwZW5kZW50IGVtdWxhdGVkIFRMUyBtb2RlbC4KKyAgdmlydHVhbCBTRFZhbHVlIExvd2VyVG9UTFNFbXVsYXRlZE1vZGVsKGNvbnN0IEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgIC8vLyBFeHBhbmRzIHRhcmdldCBzcGVjaWZpYyBpbmRpcmVjdCBicmFuY2ggZm9yIHRoZSBjYXNlIG9mIEp1bXBUYWJsZQorICAvLy8gZXhwYW5hc2lvbi4KKyAgdmlydHVhbCBTRFZhbHVlIGV4cGFuZEluZGlyZWN0SlRCcmFuY2goY29uc3QgU0RMb2MmIGRsLCBTRFZhbHVlIFZhbHVlLCBTRFZhbHVlIEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdCB7CisgICAgcmV0dXJuIERBRy5nZXROb2RlKElTRDo6QlJJTkQsIGRsLCBNVlQ6Ok90aGVyLCBWYWx1ZSwgQWRkcik7CisgIH0KKworICAvLyBzZXRlcSh4LCAwKSAtPiB0cnVuY2F0ZShzcmwoY3Rseih6ZXh0KHgpKSwgbG9nMigjYml0cykpKQorICAvLyBJZiB3ZSdyZSBjb21wYXJpbmcgZm9yIGVxdWFsaXR5IHRvIHplcm8gYW5kIGlzQ3RsekZhc3QgaXMgdHJ1ZSwgZXhwb3NlIHRoZQorICAvLyBmYWN0IHRoYXQgdGhpcyBjYW4gYmUgaW1wbGVtZW50ZWQgYXMgYSBjdGx6L3NybCBwYWlyLCBzbyB0aGF0IHRoZSBkYWcKKyAgLy8gY29tYmluZXIgY2FuIGZvbGQgdGhlIG5ldyBub2Rlcy4KKyAgU0RWYWx1ZSBsb3dlckNtcEVxWmVyb1RvQ3RselNybChTRFZhbHVlIE9wLCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKK3ByaXZhdGU6CisgIFNEVmFsdWUgc2ltcGxpZnlTZXRDQ1dpdGhBbmQoRVZUIFZULCBTRFZhbHVlIE4wLCBTRFZhbHVlIE4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6Q29uZENvZGUgQ29uZCwgREFHQ29tYmluZXJJbmZvICZEQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RMb2MgJkRMKSBjb25zdDsKK307CisKKy8vLyBHaXZlbiBhbiBMTFZNIElSIHR5cGUgYW5kIHJldHVybiB0eXBlIGF0dHJpYnV0ZXMsIGNvbXB1dGUgdGhlIHJldHVybiB2YWx1ZQorLy8vIEVWVHMgYW5kIGZsYWdzLCBhbmQgb3B0aW9uYWxseSBhbHNvIHRoZSBvZmZzZXRzLCBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzCisvLy8gYmVpbmcgbG93ZXJlZCB0byBtZW1vcnkuCit2b2lkIEdldFJldHVybkluZm8oVHlwZSAqUmV0dXJuVHlwZSwgQXR0cmlidXRlTGlzdCBhdHRyLAorICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJk91dHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSwgY29uc3QgRGF0YUxheW91dCAmREwpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1RBUkdFVExPV0VSSU5HX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRMb3dlcmluZ09iamVjdEZpbGVJbXBsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlSW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZGE3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlSW1wbC5oCkBAIC0wLDAgKzEsMjAwIEBACisvLz09LSBsbHZtL0NvZGVHZW4vVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlSW1wbC5oIC0gT2JqZWN0IEluZm8gLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGNsYXNzZXMgdXNlZCB0byBoYW5kbGUgbG93ZXJpbmdzIHNwZWNpZmljIHRvIGNvbW1vbgorLy8gb2JqZWN0IGZpbGUgZm9ybWF0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9UQVJHRVRMT1dFUklOR09CSkVDVEZJTEVJTVBMX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1RBUkdFVExPV0VSSU5HT0JKRUNURklMRUlNUExfSAorCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRXhwci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEdsb2JhbFZhbHVlOworY2xhc3MgTWFjaGluZU1vZHVsZUluZm87CitjbGFzcyBNYW5nbGVyOworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNTZWN0aW9uOworY2xhc3MgTUNTeW1ib2w7CitjbGFzcyBUYXJnZXRNYWNoaW5lOworCitjbGFzcyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVFTEYgOiBwdWJsaWMgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlIHsKKyAgYm9vbCBVc2VJbml0QXJyYXkgPSBmYWxzZTsKKyAgbXV0YWJsZSB1bnNpZ25lZCBOZXh0VW5pcXVlSUQgPSAxOyAgLy8gSUQgMCBpcyByZXNlcnZlZCBmb3IgZXhlY3V0ZS1vbmx5IHNlY3Rpb25zCisKK3Byb3RlY3RlZDoKKyAgTUNTeW1ib2xSZWZFeHByOjpWYXJpYW50S2luZCBQTFRSZWxhdGl2ZVZhcmlhbnRLaW5kID0KKyAgICAgIE1DU3ltYm9sUmVmRXhwcjo6VktfTm9uZTsKKworcHVibGljOgorICBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVFTEYoKSA9IGRlZmF1bHQ7CisgIH5UYXJnZXRMb3dlcmluZ09iamVjdEZpbGVFTEYoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgLy8vIEVtaXQgT2JqLUMgZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCBsaW5rZXIgb3B0aW9ucy4KKyAgdm9pZCBlbWl0TW9kdWxlTWV0YWRhdGEoTUNTdHJlYW1lciAmU3RyZWFtZXIsIE1vZHVsZSAmTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgZW1pdFBlcnNvbmFsaXR5VmFsdWUoTUNTdHJlYW1lciAmU3RyZWFtZXIsIGNvbnN0IERhdGFMYXlvdXQgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICpTeW0pIGNvbnN0IG92ZXJyaWRlOworCisgIC8vLyBHaXZlbiBhIGNvbnN0YW50IHdpdGggdGhlIFNlY3Rpb25LaW5kLCByZXR1cm4gYSBzZWN0aW9uIHRoYXQgaXQgc2hvdWxkIGJlCisgIC8vLyBwbGFjZWQgaW4uCisgIE1DU2VjdGlvbiAqZ2V0U2VjdGlvbkZvckNvbnN0YW50KGNvbnN0IERhdGFMYXlvdXQgJkRMLCBTZWN0aW9uS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkFsaWduKSBjb25zdCBvdmVycmlkZTsKKworICBNQ1NlY3Rpb24gKmdldEV4cGxpY2l0U2VjdGlvbkdsb2JhbChjb25zdCBHbG9iYWxPYmplY3QgKkdPLCBTZWN0aW9uS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgTUNTZWN0aW9uICpTZWxlY3RTZWN0aW9uRm9yR2xvYmFsKGNvbnN0IEdsb2JhbE9iamVjdCAqR08sIFNlY3Rpb25LaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgTUNTZWN0aW9uICpnZXRTZWN0aW9uRm9ySnVtcFRhYmxlKGNvbnN0IEZ1bmN0aW9uICZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgc2hvdWxkUHV0SnVtcFRhYmxlSW5GdW5jdGlvblNlY3Rpb24oYm9vbCBVc2VzTGFiZWxEaWZmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uICZGKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gUmV0dXJuIGFuIE1DRXhwciB0byB1c2UgZm9yIGEgcmVmZXJlbmNlIHRvIHRoZSBzcGVjaWZpZWQgdHlwZSBpbmZvIGdsb2JhbAorICAvLy8gdmFyaWFibGUgZnJvbSBleGNlcHRpb24gaGFuZGxpbmcgaW5mb3JtYXRpb24uCisgIGNvbnN0IE1DRXhwciAqZ2V0VFR5cGVHbG9iYWxSZWZlcmVuY2UoY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNb2R1bGVJbmZvICpNTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTdHJlYW1lciAmU3RyZWFtZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vIFRoZSBzeW1ib2wgdGhhdCBnZXRzIHBhc3NlZCB0byAuY2ZpX3BlcnNvbmFsaXR5LgorICBNQ1N5bWJvbCAqZ2V0Q0ZJUGVyc29uYWxpdHlTeW1ib2woY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTW9kdWxlSW5mbyAqTU1JKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIEluaXRpYWxpemVFTEYoYm9vbCBVc2VJbml0QXJyYXlfKTsKKyAgTUNTZWN0aW9uICpnZXRTdGF0aWNDdG9yU2VjdGlvbih1bnNpZ25lZCBQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqS2V5U3ltKSBjb25zdCBvdmVycmlkZTsKKyAgTUNTZWN0aW9uICpnZXRTdGF0aWNEdG9yU2VjdGlvbih1bnNpZ25lZCBQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqS2V5U3ltKSBjb25zdCBvdmVycmlkZTsKKworICBjb25zdCBNQ0V4cHIgKmxvd2VyUmVsYXRpdmVSZWZlcmVuY2UoY29uc3QgR2xvYmFsVmFsdWUgKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdsb2JhbFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVNYWNoTyA6IHB1YmxpYyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGUgeworcHVibGljOgorICBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVNYWNoTygpOworICB+VGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlTWFjaE8oKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBJbml0aWFsaXplKE1DQ29udGV4dCAmQ3R4LCBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgb3ZlcnJpZGU7CisKKyAgLy8vIEVtaXQgdGhlIG1vZHVsZSBmbGFncyB0aGF0IHNwZWNpZnkgdGhlIGdhcmJhZ2UgY29sbGVjdGlvbiBpbmZvcm1hdGlvbi4KKyAgdm9pZCBlbWl0TW9kdWxlTWV0YWRhdGEoTUNTdHJlYW1lciAmU3RyZWFtZXIsIE1vZHVsZSAmTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IG92ZXJyaWRlOworCisgIE1DU2VjdGlvbiAqU2VsZWN0U2VjdGlvbkZvckdsb2JhbChjb25zdCBHbG9iYWxPYmplY3QgKkdPLCBTZWN0aW9uS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IG92ZXJyaWRlOworCisgIE1DU2VjdGlvbiAqZ2V0RXhwbGljaXRTZWN0aW9uR2xvYmFsKGNvbnN0IEdsb2JhbE9iamVjdCAqR08sIFNlY3Rpb25LaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdCBvdmVycmlkZTsKKworICBNQ1NlY3Rpb24gKmdldFNlY3Rpb25Gb3JDb25zdGFudChjb25zdCBEYXRhTGF5b3V0ICZETCwgU2VjdGlvbktpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZBbGlnbikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIFRoZSBtYWNoLW8gdmVyc2lvbiBvZiB0aGlzIG1ldGhvZCBkZWZhdWx0cyB0byByZXR1cm5pbmcgYSBzdHViIHJlZmVyZW5jZS4KKyAgY29uc3QgTUNFeHByICpnZXRUVHlwZUdsb2JhbFJlZmVyZW5jZShjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1vZHVsZUluZm8gKk1NSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1N0cmVhbWVyICZTdHJlYW1lcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8gVGhlIHN5bWJvbCB0aGF0IGdldHMgcGFzc2VkIHRvIC5jZmlfcGVyc29uYWxpdHkuCisgIE1DU3ltYm9sICpnZXRDRklQZXJzb25hbGl0eVN5bWJvbChjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNb2R1bGVJbmZvICpNTUkpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vLyBHZXQgTWFjaE8gUEMgcmVsYXRpdmUgR09UIGVudHJ5IHJlbG9jYXRpb24KKyAgY29uc3QgTUNFeHByICpnZXRJbmRpcmVjdFN5bVZpYUdPVFBDUmVsKGNvbnN0IE1DU3ltYm9sICpTeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1ZhbHVlICZNViwgaW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTW9kdWxlSW5mbyAqTU1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTdHJlYW1lciAmU3RyZWFtZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgZ2V0TmFtZVdpdGhQcmVmaXgoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZPdXROYW1lLCBjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IG92ZXJyaWRlOworfTsKKworY2xhc3MgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlQ09GRiA6IHB1YmxpYyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGUgeworICBtdXRhYmxlIHVuc2lnbmVkIE5leHRVbmlxdWVJRCA9IDA7CisKK3B1YmxpYzoKKyAgflRhcmdldExvd2VyaW5nT2JqZWN0RmlsZUNPRkYoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBJbml0aWFsaXplKE1DQ29udGV4dCAmQ3R4LCBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgb3ZlcnJpZGU7CisgIE1DU2VjdGlvbiAqZ2V0RXhwbGljaXRTZWN0aW9uR2xvYmFsKGNvbnN0IEdsb2JhbE9iamVjdCAqR08sIFNlY3Rpb25LaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdCBvdmVycmlkZTsKKworICBNQ1NlY3Rpb24gKlNlbGVjdFNlY3Rpb25Gb3JHbG9iYWwoY29uc3QgR2xvYmFsT2JqZWN0ICpHTywgU2VjdGlvbktpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGdldE5hbWVXaXRoUHJlZml4KFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmT3V0TmFtZSwgY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdCBvdmVycmlkZTsKKworICBNQ1NlY3Rpb24gKmdldFNlY3Rpb25Gb3JKdW1wVGFibGUoY29uc3QgRnVuY3Rpb24gJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIEVtaXQgT2JqLUMgZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCBsaW5rZXIgb3B0aW9ucy4KKyAgdm9pZCBlbWl0TW9kdWxlTWV0YWRhdGEoTUNTdHJlYW1lciAmU3RyZWFtZXIsIE1vZHVsZSAmTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IG92ZXJyaWRlOworCisgIE1DU2VjdGlvbiAqZ2V0U3RhdGljQ3RvclNlY3Rpb24odW5zaWduZWQgUHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKktleVN5bSkgY29uc3Qgb3ZlcnJpZGU7CisgIE1DU2VjdGlvbiAqZ2V0U3RhdGljRHRvclNlY3Rpb24odW5zaWduZWQgUHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKktleVN5bSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBlbWl0TGlua2VyRmxhZ3NGb3JHbG9iYWwocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgZW1pdExpbmtlckZsYWdzRm9yVXNlZChyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YpIGNvbnN0IG92ZXJyaWRlOworfTsKKworY2xhc3MgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlV2FzbSA6IHB1YmxpYyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGUgeworICBtdXRhYmxlIHVuc2lnbmVkIE5leHRVbmlxdWVJRCA9IDA7CisKK3B1YmxpYzoKKyAgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlV2FzbSgpID0gZGVmYXVsdDsKKyAgflRhcmdldExvd2VyaW5nT2JqZWN0RmlsZVdhc20oKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgTUNTZWN0aW9uICpnZXRFeHBsaWNpdFNlY3Rpb25HbG9iYWwoY29uc3QgR2xvYmFsT2JqZWN0ICpHTywgU2VjdGlvbktpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IG92ZXJyaWRlOworCisgIE1DU2VjdGlvbiAqU2VsZWN0U2VjdGlvbkZvckdsb2JhbChjb25zdCBHbG9iYWxPYmplY3QgKkdPLCBTZWN0aW9uS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgc2hvdWxkUHV0SnVtcFRhYmxlSW5GdW5jdGlvblNlY3Rpb24oYm9vbCBVc2VzTGFiZWxEaWZmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uICZGKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIEluaXRpYWxpemVXYXNtKCk7CisgIE1DU2VjdGlvbiAqZ2V0U3RhdGljQ3RvclNlY3Rpb24odW5zaWduZWQgUHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKktleVN5bSkgY29uc3Qgb3ZlcnJpZGU7CisgIE1DU2VjdGlvbiAqZ2V0U3RhdGljRHRvclNlY3Rpb24odW5zaWduZWQgUHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKktleVN5bSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgY29uc3QgTUNFeHByICpsb3dlclJlbGF0aXZlUmVmZXJlbmNlKGNvbnN0IEdsb2JhbFZhbHVlICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHbG9iYWxWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IG92ZXJyaWRlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9UQVJHRVRMT1dFUklOR09CSkVDVEZJTEVJTVBMX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRPcGNvZGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0T3Bjb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZDk1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0T3Bjb2Rlcy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL1RhcmdldE9wY29kZXMuaCAtIFRhcmdldCBJbmRlcCBPcGNvZGVzIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIHRhcmdldCBpbmRlcGVuZGVudCBpbnN0cnVjdGlvbiBvcGNvZGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1RBUkdFVE9QQ09ERVNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fVEFSR0VUT1BDT0RFU19ICisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEludmFyaWFudCBvcGNvZGVzOiBBbGwgaW5zdHJ1Y3Rpb24gc2V0cyBoYXZlIHRoZXNlIGFzIHRoZWlyIGxvdyBvcGNvZGVzLgorLy8vCituYW1lc3BhY2UgVGFyZ2V0T3Bjb2RlIHsKK2VudW0geworI2RlZmluZSBIQU5ETEVfVEFSR0VUX09QQ09ERShPUEMpIE9QQywKKyNkZWZpbmUgSEFORExFX1RBUkdFVF9PUENPREVfTUFSS0VSKElERU5ULCBPUEMpIElERU5UID0gT1BDLAorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9UYXJnZXRPcGNvZGVzLmRlZiIKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgVGFyZ2V0T3Bjb2RlCisKKy8vLyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBPcGNvZGUgaXMgYSBnZW5lcmljIG9wY29kZSB0aGF0IGlzIG5vdCBzdXBwb3NlZAorLy8vIHRvIGFwcGVhciBhZnRlciBJU2VsLgoraW5saW5lIGJvb2wgaXNQcmVJU2VsR2VuZXJpY09wY29kZSh1bnNpZ25lZCBPcGNvZGUpIHsKKyAgcmV0dXJuIE9wY29kZSA+PSBUYXJnZXRPcGNvZGU6OlBSRV9JU0VMX0dFTkVSSUNfT1BDT0RFX1NUQVJUICYmCisgICAgICAgICBPcGNvZGUgPD0gVGFyZ2V0T3Bjb2RlOjpQUkVfSVNFTF9HRU5FUklDX09QQ09ERV9FTkQ7Cit9CisKKy8vLyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBPcGNvZGUgaXMgYSB0YXJnZXQtc3BlY2lmaWMgb3Bjb2RlLgoraW5saW5lIGJvb2wgaXNUYXJnZXRTcGVjaWZpY09wY29kZSh1bnNpZ25lZCBPcGNvZGUpIHsKKyAgcmV0dXJuIE9wY29kZSA+IFRhcmdldE9wY29kZTo6UFJFX0lTRUxfR0VORVJJQ19PUENPREVfRU5EOworfQorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0UGFzc0NvbmZpZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldFBhc3NDb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTE4YzUyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldFBhc3NDb25maWcuaApAQCAtMCwwICsxLDQzMyBAQAorLy89PT0tIFRhcmdldFBhc3NDb25maWcuaCAtIENvZGUgR2VuZXJhdGlvbiBwYXNzIG9wdGlvbnMgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gVGFyZ2V0LUluZGVwZW5kZW50IENvZGUgR2VuZXJhdG9yIFBhc3MgQ29uZmlndXJhdGlvbiBPcHRpb25zIHBhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fVEFSR0VUUEFTU0NPTkZJR19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9UQVJHRVRQQVNTQ09ORklHX0gKKworI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db2RlR2VuLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4gCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExMVk1UYXJnZXRNYWNoaW5lOworc3RydWN0IE1hY2hpbmVTY2hlZENvbnRleHQ7CitjbGFzcyBQYXNzQ29uZmlnSW1wbDsKK2NsYXNzIFNjaGVkdWxlREFHSW5zdHJzOworCisvLyBUaGUgb2xkIHBhc3MgbWFuYWdlciBpbmZyYXN0cnVjdHVyZSBpcyBoaWRkZW4gaW4gYSBsZWdhY3kgbmFtZXNwYWNlIG5vdy4KK25hbWVzcGFjZSBsZWdhY3kgeworCitjbGFzcyBQYXNzTWFuYWdlckJhc2U7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsZWdhY3kKKwordXNpbmcgbGVnYWN5OjpQYXNzTWFuYWdlckJhc2U7CisKKy8vLyBEaXNjcmltaW5hdGVkIHVuaW9uIG9mIFBhc3MgSUQgdHlwZXMuCisvLy8KKy8vLyBUaGUgUGFzc0NvbmZpZyBBUEkgcHJlZmVycyBkZWFsaW5nIHdpdGggSURzIGJlY2F1c2UgdGhleSBhcmUgc2FmZXIgYW5kIG1vcmUKKy8vLyBlZmZpY2llbnQuIElEcyBkZWNvdXBsZSBjb25maWd1cmF0aW9uIGZyb20gaW5zdGFudGlhdGlvbi4gVGhpcyB3YXksIHdoZW4gYQorLy8vIHBhc3MgaXMgb3ZlcnJpZGVuLCBpdCBpc24ndCB1bm5lY2Vzc2FyaWx5IGluc3RhbnRpYXRlZC4gSXQgaXMgYWxzbyB1bnNhZmUgdG8KKy8vLyByZWZlciB0byBhIFBhc3MgcG9pbnRlciBhZnRlciBhZGRpbmcgaXQgdG8gYSBwYXNzIG1hbmFnZXIsIHdoaWNoIGRlbGV0ZXMKKy8vLyByZWR1bmRhbnQgcGFzcyBpbnN0YW5jZXMuCisvLy8KKy8vLyBIb3dldmVyLCBpdCBpcyBjb252aWVudCB0byBkaXJlY3RseSBpbnN0YW50aWF0ZSB0YXJnZXQgcGFzc2VzIHdpdGgKKy8vLyBub24tZGVmYXVsdCBjdG9ycy4gVGhlc2Ugb2Z0ZW4gZG9uJ3QgaGF2ZSBhIHJlZ2lzdGVyZWQgUGFzc0luZm8uIFJhdGhlciB0aGFuCisvLy8gZm9yY2UgYWxsIHRhcmdldCBwYXNzZXMgdG8gaW1wbGVtZW50IHRoZSBwYXNzIHJlZ2lzdHJ5IGJvaWxlcnBsYXRlLCBhbGxvdworLy8vIHRoZSBQYXNzQ29uZmlnIEFQSSB0byBoYW5kbGUgZWl0aGVyIHR5cGUuCisvLy8KKy8vLyBBbmFseXNpc0lEIGlzIHNhZGx5IGNoYXIqLCBzbyBQb2ludGVySW50UGFpciB3b24ndCB3b3JrLgorY2xhc3MgSWRlbnRpZnlpbmdQYXNzUHRyIHsKKyAgdW5pb24geworICAgIEFuYWx5c2lzSUQgSUQ7CisgICAgUGFzcyAqUDsKKyAgfTsKKyAgYm9vbCBJc0luc3RhbmNlID0gZmFsc2U7CisKK3B1YmxpYzoKKyAgSWRlbnRpZnlpbmdQYXNzUHRyKCkgOiBQKG51bGxwdHIpIHt9CisgIElkZW50aWZ5aW5nUGFzc1B0cihBbmFseXNpc0lEIElEUHRyKSA6IElEKElEUHRyKSB7fQorICBJZGVudGlmeWluZ1Bhc3NQdHIoUGFzcyAqSW5zdGFuY2VQdHIpIDogUChJbnN0YW5jZVB0ciksIElzSW5zdGFuY2UodHJ1ZSkge30KKworICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBQOyB9CisgIGJvb2wgaXNJbnN0YW5jZSgpIGNvbnN0IHsgcmV0dXJuIElzSW5zdGFuY2U7IH0KKworICBBbmFseXNpc0lEIGdldElEKCkgY29uc3QgeworICAgIGFzc2VydCghSXNJbnN0YW5jZSAmJiAiTm90IGEgUGFzcyBJRCIpOworICAgIHJldHVybiBJRDsKKyAgfQorCisgIFBhc3MgKmdldEluc3RhbmNlKCkgY29uc3QgeworICAgIGFzc2VydChJc0luc3RhbmNlICYmICJOb3QgYSBQYXNzIEluc3RhbmNlIik7CisgICAgcmV0dXJuIFA7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc1BvZExpa2U8SWRlbnRpZnlpbmdQYXNzUHRyPiB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKK307CisKKy8vLyBUYXJnZXQtSW5kZXBlbmRlbnQgQ29kZSBHZW5lcmF0b3IgUGFzcyBDb25maWd1cmF0aW9uIE9wdGlvbnMuCisvLy8KKy8vLyBUaGlzIGlzIGFuIEltbXV0YWJsZVBhc3Mgc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBleHBvc2luZyBDb2RlR2VuIG9wdGlvbnMKKy8vLyB0byB0aGUgaW50ZXJuYWxzIG9mIG90aGVyIENvZGVHZW4gcGFzc2VzLgorY2xhc3MgVGFyZ2V0UGFzc0NvbmZpZyA6IHB1YmxpYyBJbW11dGFibGVQYXNzIHsKK3ByaXZhdGU6CisgIFBhc3NNYW5hZ2VyQmFzZSAqUE0gPSBudWxscHRyOworICBBbmFseXNpc0lEIFN0YXJ0QmVmb3JlID0gbnVsbHB0cjsKKyAgQW5hbHlzaXNJRCBTdGFydEFmdGVyID0gbnVsbHB0cjsKKyAgQW5hbHlzaXNJRCBTdG9wQmVmb3JlID0gbnVsbHB0cjsKKyAgQW5hbHlzaXNJRCBTdG9wQWZ0ZXIgPSBudWxscHRyOworICBib29sIFN0YXJ0ZWQgPSB0cnVlOworICBib29sIFN0b3BwZWQgPSBmYWxzZTsKKyAgYm9vbCBBZGRpbmdNYWNoaW5lUGFzc2VzID0gZmFsc2U7CisKKyAgLy8vIFNldCB0aGUgU3RhcnRBZnRlciwgU3RhcnRCZWZvcmUgYW5kIFN0b3BBZnRlciBwYXNzZXMgdG8gYWxsb3cgcnVubmluZyBvbmx5CisgIC8vLyBhIHBvcnRpb24gb2YgdGhlIG5vcm1hbCBjb2RlLWdlbiBwYXNzIHNlcXVlbmNlLgorICAvLy8KKyAgLy8vIElmIHRoZSBTdGFydEFmdGVyIGFuZCBTdGFydEJlZm9yZSBwYXNzIElEIGlzIHplcm8sIHRoZW4gY29tcGlsYXRpb24gd2lsbAorICAvLy8gYmVnaW4gYXQgdGhlIG5vcm1hbCBwb2ludDsgb3RoZXJ3aXNlLCBjbGVhciB0aGUgU3RhcnRlZCBmbGFnIHRvIGluZGljYXRlCisgIC8vLyB0aGF0IHBhc3NlcyBzaG91bGQgbm90IGJlIGFkZGVkIHVudGlsIHRoZSBzdGFydGluZyBwYXNzIGlzIHNlZW4uICBJZiB0aGUKKyAgLy8vIFN0b3AgcGFzcyBJRCBpcyB6ZXJvLCB0aGVuIGNvbXBpbGF0aW9uIHdpbGwgY29udGludWUgdG8gdGhlIGVuZC4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGV4cGVjdHMgdGhhdCBhdCBsZWFzdCBvbmUgb2YgdGhlIFN0YXJ0QWZ0ZXIgb3IgdGhlCisgIC8vLyBTdGFydEJlZm9yZSBwYXNzIElEcyBpcyBudWxsLgorICB2b2lkIHNldFN0YXJ0U3RvcFBhc3NlcygpOworCitwcm90ZWN0ZWQ6CisgIExMVk1UYXJnZXRNYWNoaW5lICpUTTsKKyAgUGFzc0NvbmZpZ0ltcGwgKkltcGwgPSBudWxscHRyOyAvLyBJbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMKKyAgYm9vbCBJbml0aWFsaXplZCA9IGZhbHNlOyAvLyBGbGFnZ2VkIGFmdGVyIGFsbCBwYXNzZXMgYXJlIGNvbmZpZ3VyZWQuCisKKyAgLy8gVGFyZ2V0IFBhc3MgT3B0aW9ucworICAvLyBUYXJnZXRzIHByb3ZpZGUgYSBkZWZhdWx0IHNldHRpbmcsIHVzZXIgZmxhZ3Mgb3ZlcnJpZGUuCisgIGJvb2wgRGlzYWJsZVZlcmlmeSA9IGZhbHNlOworCisgIC8vLyBEZWZhdWx0IHNldHRpbmcgZm9yIC1lbmFibGUtdGFpbC1tZXJnZSBvbiB0aGlzIHRhcmdldC4KKyAgYm9vbCBFbmFibGVUYWlsTWVyZ2UgPSB0cnVlOworCisgIC8vLyBSZXF1aXJlIHByb2Nlc3Npbmcgb2YgZnVuY3Rpb25zIHN1Y2ggdGhhdCBjYWxsZWVzIGFyZSBnZW5lcmF0ZWQgYmVmb3JlCisgIC8vLyBjYWxsZXJzLgorICBib29sIFJlcXVpcmVDb2RlR2VuU0NDT3JkZXIgPSBmYWxzZTsKKworICAvLy8gQWRkIHRoZSBhY3R1YWwgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHBhc3Nlcy4gVGhpcyBkb2VzIG5vdCBpbmNsdWRlCisgIC8vLyBwcmVwYXJhdGlvbiBwYXNzZXMgb24gSVIuCisgIGJvb2wgYWRkQ29yZUlTZWxQYXNzZXMoKTsKKworcHVibGljOgorICBUYXJnZXRQYXNzQ29uZmlnKExMVk1UYXJnZXRNYWNoaW5lICZUTSwgUGFzc01hbmFnZXJCYXNlICZwbSk7CisgIC8vIER1bW15IGNvbnN0cnVjdG9yLgorICBUYXJnZXRQYXNzQ29uZmlnKCk7CisKKyAgflRhcmdldFBhc3NDb25maWcoKSBvdmVycmlkZTsKKworICBzdGF0aWMgY2hhciBJRDsKKworICAvLy8gR2V0IHRoZSByaWdodCB0eXBlIG9mIFRhcmdldE1hY2hpbmUgZm9yIHRoaXMgdGFyZ2V0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUTUM+IFRNQyAmZ2V0VE0oKSBjb25zdCB7CisgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxUTUMqPihUTSk7CisgIH0KKworICAvLworICB2b2lkIHNldEluaXRpYWxpemVkKCkgeyBJbml0aWFsaXplZCA9IHRydWU7IH0KKworICBDb2RlR2VuT3B0OjpMZXZlbCBnZXRPcHRMZXZlbCgpIGNvbnN0OworCisgIC8vLyBEZXNjcmliZSB0aGUgc3RhdHVzIG9mIHRoZSBjb2RlZ2VuCisgIC8vLyBwaXBlbGluZSBzZXQgYnkgdGhpcyB0YXJnZXQgcGFzcyBjb25maWcuCisgIC8vLyBIYXZpbmcgYSBsaW1pdGVkIGNvZGVnZW4gcGlwZWxpbmUgbWVhbnMgdGhhdCBvcHRpb25zCisgIC8vLyBoYXZlIGJlZW4gdXNlZCB0byByZXN0cmljdCB3aGF0IGNvZGVnZW4gaXMgZG9pbmcuCisgIC8vLyBJbiBwYXJ0aWN1bGFyLCB0aGF0IG1lYW5zIHRoYXQgY29kZWdlbiB3b24ndCBlbWl0CisgIC8vLyBhc3NlbWJseSBjb2RlLgorICBib29sIGhhc0xpbWl0ZWRDb2RlR2VuUGlwZWxpbmUoKSBjb25zdDsKKworICAvLy8gSWYgaGFzTGltaXRlZENvZGVHZW5QaXBlbGluZSBpcyB0cnVlLCB0aGlzIG1ldGhvZAorICAvLy8gcmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBuYW1lIG9mIHRoZSBvcHRpb25zLCBzZXBhcmF0ZWQKKyAgLy8vIGJ5IFxwIFNlcGFyYXRvciB0aGF0IGNhdXNlZCB0aGlzIHBpcGVsaW5lIHRvIGJlIGxpbWl0ZWQuCisgIHN0ZDo6c3RyaW5nCisgIGdldExpbWl0ZWRDb2RlR2VuUGlwZWxpbmVSZWFzb24oY29uc3QgY2hhciAqU2VwYXJhdG9yID0gIi8iKSBjb25zdDsKKworICAvLy8gQ2hlY2sgaWYgdGhlIGNvZGVnZW4gcGlwZWxpbmUgaXMgbGltaXRlZCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQKKyAgLy8vIHdvbid0IGJlIGNvbXBsZXRlLiBXaGVuIHRoZSBjb2RlZ2VuIHBpcGVsaW5lIGlzIG5vdCBjb21wbGV0ZSwKKyAgLy8vIHRoaXMgbWVhbnMgaXQgbWF5IG5vdCBiZSBwb3NzaWJsZSB0byBnZW5lcmF0ZSBhc3NlbWJseSBmcm9tIGl0LgorICBib29sIHdpbGxDb21wbGV0ZUNvZGVHZW5QaXBlbGluZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIWhhc0xpbWl0ZWRDb2RlR2VuUGlwZWxpbmUoKSB8fCAoIVN0b3BBZnRlciAmJiAhU3RvcEJlZm9yZSk7CisgIH0KKworICB2b2lkIHNldERpc2FibGVWZXJpZnkoYm9vbCBEaXNhYmxlKSB7IHNldE9wdChEaXNhYmxlVmVyaWZ5LCBEaXNhYmxlKTsgfQorCisgIGJvb2wgZ2V0RW5hYmxlVGFpbE1lcmdlKCkgY29uc3QgeyByZXR1cm4gRW5hYmxlVGFpbE1lcmdlOyB9CisgIHZvaWQgc2V0RW5hYmxlVGFpbE1lcmdlKGJvb2wgRW5hYmxlKSB7IHNldE9wdChFbmFibGVUYWlsTWVyZ2UsIEVuYWJsZSk7IH0KKworICBib29sIHJlcXVpcmVzQ29kZUdlblNDQ09yZGVyKCkgY29uc3QgeyByZXR1cm4gUmVxdWlyZUNvZGVHZW5TQ0NPcmRlcjsgfQorICB2b2lkIHNldFJlcXVpcmVzQ29kZUdlblNDQ09yZGVyKGJvb2wgRW5hYmxlID0gdHJ1ZSkgeworICAgIHNldE9wdChSZXF1aXJlQ29kZUdlblNDQ09yZGVyLCBFbmFibGUpOworICB9CisKKyAgLy8vIEFsbG93IHRoZSB0YXJnZXQgdG8gb3ZlcnJpZGUgYSBzcGVjaWZpYyBwYXNzIHdpdGhvdXQgb3ZlcnJpZGluZyB0aGUgcGFzcworICAvLy8gcGlwZWxpbmUuIFdoZW4gcGFzc2VzIGFyZSBhZGRlZCB0byB0aGUgc3RhbmRhcmQgcGlwZWxpbmUgYXQgdGhlCisgIC8vLyBwb2ludCB3aGVyZSBTdGFuZGFyZElEIGlzIGV4cGVjdGVkLCBhZGQgVGFyZ2V0SUQgaW4gaXRzIHBsYWNlLgorICB2b2lkIHN1YnN0aXR1dGVQYXNzKEFuYWx5c2lzSUQgU3RhbmRhcmRJRCwgSWRlbnRpZnlpbmdQYXNzUHRyIFRhcmdldElEKTsKKworICAvLy8gSW5zZXJ0IEluc2VydGVkUGFzc0lEIHBhc3MgYWZ0ZXIgVGFyZ2V0UGFzc0lEIHBhc3MuCisgIHZvaWQgaW5zZXJ0UGFzcyhBbmFseXNpc0lEIFRhcmdldFBhc3NJRCwgSWRlbnRpZnlpbmdQYXNzUHRyIEluc2VydGVkUGFzc0lELAorICAgICAgICAgICAgICAgICAgYm9vbCBWZXJpZnlBZnRlciA9IHRydWUsIGJvb2wgUHJpbnRBZnRlciA9IHRydWUpOworCisgIC8vLyBBbGxvdyB0aGUgdGFyZ2V0IHRvIGVuYWJsZSBhIHNwZWNpZmljIHN0YW5kYXJkIHBhc3MgYnkgZGVmYXVsdC4KKyAgdm9pZCBlbmFibGVQYXNzKEFuYWx5c2lzSUQgUGFzc0lEKSB7IHN1YnN0aXR1dGVQYXNzKFBhc3NJRCwgUGFzc0lEKTsgfQorCisgIC8vLyBBbGxvdyB0aGUgdGFyZ2V0IHRvIGRpc2FibGUgYSBzcGVjaWZpYyBzdGFuZGFyZCBwYXNzIGJ5IGRlZmF1bHQuCisgIHZvaWQgZGlzYWJsZVBhc3MoQW5hbHlzaXNJRCBQYXNzSUQpIHsKKyAgICBzdWJzdGl0dXRlUGFzcyhQYXNzSUQsIElkZW50aWZ5aW5nUGFzc1B0cigpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHBhc3Mgc3Vic3RpdHV0ZWQgZm9yIFN0YW5kYXJkSUQgYnkgdGhlIHRhcmdldC4KKyAgLy8vIElmIG5vIHN1YnN0aXR1dGlvbiBleGlzdHMsIHJldHVybiBTdGFuZGFyZElELgorICBJZGVudGlmeWluZ1Bhc3NQdHIgZ2V0UGFzc1N1YnN0aXR1dGlvbihBbmFseXNpc0lEIFN0YW5kYXJkSUQpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGFzcyBoYXMgYmVlbiBzdWJzdGl0dXRlZCBieSB0aGUgdGFyZ2V0IG9yCisgIC8vLyBvdmVycmlkZGVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgIGJvb2wgaXNQYXNzU3Vic3RpdHV0ZWRPck92ZXJyaWRkZW4oQW5hbHlzaXNJRCBJRCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBvcHRpbWl6ZWQgcmVnYWxsb2MgcGlwZWxpbmUgaXMgZW5hYmxlZC4KKyAgYm9vbCBnZXRPcHRpbWl6ZVJlZ0FsbG9jKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBkZWZhdWx0IGdsb2JhbCByZWdpc3RlciBhbGxvY2F0b3IgaXMgaW4gdXNlIGFuZAorICAvLy8gaGFzIG5vdCBiZSBvdmVycmlkZW4gb24gdGhlIGNvbW1hbmQgbGluZSB3aXRoICctcmVnYWxsb2M9Li4uJworICBib29sIHVzaW5nRGVmYXVsdFJlZ0FsbG9jKCkgY29uc3Q7CisKKyAgLy8vIEhpZ2ggbGV2ZWwgZnVuY3Rpb24gdGhhdCBhZGRzIGFsbCBwYXNzZXMgbmVjZXNzYXJ5IHRvIGdvIGZyb20gbGx2bSBJUgorICAvLy8gcmVwcmVzZW50YXRpb24gdG8gdGhlIE1JIHJlcHJlc2VudGF0aW9uLgorICAvLy8gQWRkcyBJUiBiYXNlZCBsb3dlcmluZyBhbmQgdGFyZ2V0IHNwZWNpZmljIG9wdGltaXphdGlvbiBwYXNzZXMgYW5kIGZpbmFsbHkKKyAgLy8vIHRoZSBjb3JlIGluc3RydWN0aW9uIHNlbGVjdGlvbiBwYXNzZXMuCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgYWRkSVNlbFBhc3NlcygpOworCisgIC8vLyBBZGQgY29tbW9uIHRhcmdldCBjb25maWd1cmFibGUgcGFzc2VzIHRoYXQgcGVyZm9ybSBMTFZNIElSIHRvIElSCisgIC8vLyB0cmFuc2Zvcm1zIGZvbGxvd2luZyBtYWNoaW5lIGluZGVwZW5kZW50IG9wdGltaXphdGlvbi4KKyAgdmlydHVhbCB2b2lkIGFkZElSUGFzc2VzKCk7CisKKyAgLy8vIEFkZCBwYXNzZXMgdG8gbG93ZXIgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciB0aGUgY29kZSBnZW5lcmF0b3IuCisgIHZvaWQgYWRkUGFzc2VzVG9IYW5kbGVFeGNlcHRpb25zKCk7CisKKyAgLy8vIEFkZCBwYXNzIHRvIHByZXBhcmUgdGhlIExMVk0gSVIgZm9yIGNvZGUgZ2VuZXJhdGlvbi4gVGhpcyBzaG91bGQgYmUgZG9uZQorICAvLy8gYmVmb3JlIGV4Y2VwdGlvbiBoYW5kbGluZyBwcmVwYXJhdGlvbiBwYXNzZXMuCisgIHZpcnR1YWwgdm9pZCBhZGRDb2RlR2VuUHJlcGFyZSgpOworCisgIC8vLyBBZGQgY29tbW9uIHBhc3NlcyB0aGF0IHBlcmZvcm0gTExWTSBJUiB0byBJUiB0cmFuc2Zvcm1zIGluIHByZXBhcmF0aW9uIGZvcgorICAvLy8gaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uLgorICB2aXJ0dWFsIHZvaWQgYWRkSVNlbFByZXBhcmUoKTsKKworICAvLy8gYWRkSW5zdFNlbGVjdG9yIC0gVGhpcyBtZXRob2Qgc2hvdWxkIGluc3RhbGwgYW4gaW5zdHJ1Y3Rpb24gc2VsZWN0b3IgcGFzcywKKyAgLy8vIHdoaWNoIGNvbnZlcnRzIGZyb20gTExWTSBjb2RlIHRvIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLgorICB2aXJ0dWFsIGJvb2wgYWRkSW5zdFNlbGVjdG9yKCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCBpbnN0YWxsIGFuIElSIHRyYW5zbGF0b3IgcGFzcywgd2hpY2ggY29udmVydHMgZnJvbQorICAvLy8gTExWTSBjb2RlIHRvIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIHdpdGggcG9zc2libHkgZ2VuZXJpYyBvcGNvZGVzLgorICB2aXJ0dWFsIGJvb2wgYWRkSVJUcmFuc2xhdG9yKCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgdGFyZ2V0cyB0aGF0IHdhbnQgdG8gcnVuIHBhc3NlcworICAvLy8gaW1tZWRpYXRlbHkgYmVmb3JlIGxlZ2FsaXphdGlvbi4KKyAgdmlydHVhbCB2b2lkIGFkZFByZUxlZ2FsaXplTWFjaGluZUlSKCkge30KKworICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGluc3RhbGwgYSBsZWdhbGl6ZSBwYXNzLCB3aGljaCBjb252ZXJ0cyB0aGUgaW5zdHJ1Y3Rpb24KKyAgLy8vIHNlcXVlbmNlIGludG8gb25lIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGJ5IHRoZSB0YXJnZXQuCisgIHZpcnR1YWwgYm9vbCBhZGRMZWdhbGl6ZU1hY2hpbmVJUigpIHsgcmV0dXJuIHRydWU7IH0KKworICAvLy8gVGhpcyBtZXRob2QgbWF5IGJlIGltcGxlbWVudGVkIGJ5IHRhcmdldHMgdGhhdCB3YW50IHRvIHJ1biBwYXNzZXMKKyAgLy8vIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgcmVnaXN0ZXIgYmFuayBzZWxlY3Rpb24uCisgIHZpcnR1YWwgdm9pZCBhZGRQcmVSZWdCYW5rU2VsZWN0KCkge30KKworICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGluc3RhbGwgYSByZWdpc3RlciBiYW5rIHNlbGVjdG9yIHBhc3MsIHdoaWNoCisgIC8vLyBhc3NpZ25zIHJlZ2lzdGVyIGJhbmtzIHRvIHZpcnR1YWwgcmVnaXN0ZXJzIHdpdGhvdXQgYSByZWdpc3RlcgorICAvLy8gY2xhc3Mgb3IgcmVnaXN0ZXIgYmFua3MuCisgIHZpcnR1YWwgYm9vbCBhZGRSZWdCYW5rU2VsZWN0KCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgdGFyZ2V0cyB0aGF0IHdhbnQgdG8gcnVuIHBhc3NlcworICAvLy8gaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSAoZ2xvYmFsKSBpbnN0cnVjdGlvbiBzZWxlY3Rpb24uCisgIHZpcnR1YWwgdm9pZCBhZGRQcmVHbG9iYWxJbnN0cnVjdGlvblNlbGVjdCgpIHt9CisKKyAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCBpbnN0YWxsIGEgKGdsb2JhbCkgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IgcGFzcywgd2hpY2gKKyAgLy8vIGNvbnZlcnRzIHBvc3NpYmx5IGdlbmVyaWMgaW5zdHJ1Y3Rpb25zIHRvIGZ1bGx5IHRhcmdldC1zcGVjaWZpYworICAvLy8gaW5zdHJ1Y3Rpb25zLCB0aGVyZWJ5IGNvbnN0cmFpbmluZyBhbGwgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVycyB0bworICAvLy8gcmVnaXN0ZXIgY2xhc3Nlcy4KKyAgdmlydHVhbCBib29sIGFkZEdsb2JhbEluc3RydWN0aW9uU2VsZWN0KCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBBZGQgdGhlIGNvbXBsZXRlLCBzdGFuZGFyZCBzZXQgb2YgTExWTSBDb2RlR2VuIHBhc3Nlcy4KKyAgLy8vIEZ1bGx5IGRldmVsb3BlZCB0YXJnZXRzIHdpbGwgbm90IGdlbmVyYWxseSBvdmVycmlkZSB0aGlzLgorICB2aXJ0dWFsIHZvaWQgYWRkTWFjaGluZVBhc3NlcygpOworCisgIC8vLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgU2NoZWR1bGVEQUdJbnN0cnMgdG8gYmUgcnVuIHdpdGhpbiB0aGUgc3RhbmRhcmQKKyAgLy8vIE1hY2hpbmVTY2hlZHVsZXIgcGFzcyBmb3IgdGhpcyBmdW5jdGlvbiBhbmQgdGFyZ2V0IGF0IHRoZSBjdXJyZW50CisgIC8vLyBvcHRpbWl6YXRpb24gbGV2ZWwuCisgIC8vLworICAvLy8gVGhpcyBjYW4gYWxzbyBiZSB1c2VkIHRvIHBsdWcgYSBuZXcgTWFjaGluZVNjaGVkU3RyYXRlZ3kgaW50byBhbiBpbnN0YW5jZQorICAvLy8gb2YgdGhlIHN0YW5kYXJkIFNjaGVkdWxlREFHTUk6CisgIC8vLyAgIHJldHVybiBuZXcgU2NoZWR1bGVEQUdNSShDLCBtYWtlX3VuaXF1ZTxNeVN0cmF0ZWd5PihDKSwgLypSZW1vdmVLaWxsRmxhZ3M9Ki9mYWxzZSkKKyAgLy8vCisgIC8vLyBSZXR1cm4gTlVMTCB0byBzZWxlY3QgdGhlIGRlZmF1bHQgKGdlbmVyaWMpIG1hY2hpbmUgc2NoZWR1bGVyLgorICB2aXJ0dWFsIFNjaGVkdWxlREFHSW5zdHJzICoKKyAgY3JlYXRlTWFjaGluZVNjaGVkdWxlcihNYWNoaW5lU2NoZWRDb250ZXh0ICpDKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gU2ltaWxhciB0byBjcmVhdGVNYWNoaW5lU2NoZWR1bGVyIGJ1dCB1c2VkIHdoZW4gcG9zdFJBIG1hY2hpbmUgc2NoZWR1bGluZworICAvLy8gaXMgZW5hYmxlZC4KKyAgdmlydHVhbCBTY2hlZHVsZURBR0luc3RycyAqCisgIGNyZWF0ZVBvc3RNYWNoaW5lU2NoZWR1bGVyKE1hY2hpbmVTY2hlZENvbnRleHQgKkMpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBwcmludEFuZFZlcmlmeSAtIEFkZCBhIHBhc3MgdG8gZHVtcCB0aGVuIHZlcmlmeSB0aGUgbWFjaGluZSBmdW5jdGlvbiwgaWYKKyAgLy8vIHRob3NlIHN0ZXBzIGFyZSBlbmFibGVkLgorICB2b2lkIHByaW50QW5kVmVyaWZ5KGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIpOworCisgIC8vLyBBZGQgYSBwYXNzIHRvIHByaW50IHRoZSBtYWNoaW5lIGZ1bmN0aW9uIGlmIHByaW50aW5nIGlzIGVuYWJsZWQuCisgIHZvaWQgYWRkUHJpbnRQYXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIpOworCisgIC8vLyBBZGQgYSBwYXNzIHRvIHBlcmZvcm0gYmFzaWMgdmVyaWZpY2F0aW9uIG9mIHRoZSBtYWNoaW5lIGZ1bmN0aW9uIGlmCisgIC8vLyB2ZXJpZmljYXRpb24gaXMgZW5hYmxlZC4KKyAgdm9pZCBhZGRWZXJpZnlQYXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIpOworCisgIC8vLyBDaGVjayB3aGV0aGVyIG9yIG5vdCBHbG9iYWxJU2VsIHNob3VsZCBhYm9ydCBvbiBlcnJvci4KKyAgLy8vIFdoZW4gdGhpcyBpcyBkaXNhYmxlZCwgR2xvYmFsSVNlbCB3aWxsIGZhbGwgYmFjayBvbiBTRElTZWwgaW5zdGVhZCBvZgorICAvLy8gZXJyb3Jpbmcgb3V0LgorICBib29sIGlzR2xvYmFsSVNlbEFib3J0RW5hYmxlZCgpIGNvbnN0OworCisgIC8vLyBDaGVjayB3aGV0aGVyIG9yIG5vdCBhIGRpYWdub3N0aWMgc2hvdWxkIGJlIGVtaXR0ZWQgd2hlbiBHbG9iYWxJU2VsCisgIC8vLyB1c2VzIHRoZSBmYWxsYmFjayBwYXRoLiBJbiBvdGhlciB3b3JkcywgaXQgd2lsbCBlbWl0IGEgZGlhZ25vc3RpYworICAvLy8gd2hlbiBHbG9iYWxJU2VsIGZhaWxlZCBhbmQgaXNHbG9iYWxJU2VsQWJvcnRFbmFibGVkIGlzIGZhbHNlLgorICB2aXJ0dWFsIGJvb2wgcmVwb3J0RGlhZ25vc3RpY1doZW5HbG9iYWxJU2VsRmFsbGJhY2soKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAvLyBIZWxwZXIgdG8gdmVyaWZ5IHRoZSBhbmFseXNpcyBpcyByZWFsbHkgaW1tdXRhYmxlLgorICB2b2lkIHNldE9wdChib29sICZPcHQsIGJvb2wgVmFsKTsKKworICAvLy8gTWV0aG9kcyB3aXRoIHRyaXZpYWwgaW5saW5lIHJldHVybnMgYXJlIGNvbnZlbmllbnQgcG9pbnRzIGluIHRoZSBjb21tb24KKyAgLy8vIGNvZGVnZW4gcGFzcyBwaXBlbGluZSB3aGVyZSB0YXJnZXRzIG1heSBpbnNlcnQgcGFzc2VzLiBNZXRob2RzIHdpdGgKKyAgLy8vIG91dC1vZi1saW5lIHN0YW5kYXJkIGltcGxlbWVudGF0aW9ucyBhcmUgbWFqb3IgQ29kZUdlbiBzdGFnZXMgY2FsbGVkIGJ5CisgIC8vLyBhZGRNYWNoaW5lUGFzc2VzLiBTb21lIHRhcmdldHMgbWF5IG92ZXJyaWRlIG1ham9yIHN0YWdlcyB3aGVuIGluc2VydGluZworICAvLy8gcGFzc2VzIGlzIGluc3VmZmljaWVudCwgYnV0IG1haW50YWluaW5nIG92ZXJyaWRlbiBzdGFnZXMgaXMgbW9yZSB3b3JrLgorICAvLy8KKworICAvLy8gYWRkUHJlSVNlbFBhc3NlcyAtIFRoaXMgbWV0aG9kIHNob3VsZCBhZGQgYW55ICJsYXN0IG1pbnV0ZSIgTExWTS0+TExWTQorICAvLy8gcGFzc2VzICh3aGljaCBhcmUgcnVuIGp1c3QgYmVmb3JlIGluc3RydWN0aW9uIHNlbGVjdG9yKS4KKyAgdmlydHVhbCBib29sIGFkZFByZUlTZWwoKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gYWRkTWFjaGluZVNTQU9wdGltaXphdGlvbiAtIEFkZCBzdGFuZGFyZCBwYXNzZXMgdGhhdCBvcHRpbWl6ZSBtYWNoaW5lCisgIC8vLyBpbnN0cnVjdGlvbnMgaW4gU1NBIGZvcm0uCisgIHZpcnR1YWwgdm9pZCBhZGRNYWNoaW5lU1NBT3B0aW1pemF0aW9uKCk7CisKKyAgLy8vIEFkZCBwYXNzZXMgdGhhdCBvcHRpbWl6ZSBpbnN0cnVjdGlvbiBsZXZlbCBwYXJhbGxlbGlzbSBmb3Igb3V0LW9mLW9yZGVyCisgIC8vLyB0YXJnZXRzLiBUaGVzZSBwYXNzZXMgYXJlIHJ1biB3aGlsZSB0aGUgbWFjaGluZSBjb2RlIGlzIHN0aWxsIGluIFNTQQorICAvLy8gZm9ybSwgc28gdGhleSBjYW4gdXNlIE1hY2hpbmVUcmFjZU1ldHJpY3MgdG8gY29udHJvbCB0aGVpciBoZXVyaXN0aWNzLgorICAvLy8KKyAgLy8vIEFsbCBwYXNzZXMgYWRkZWQgaGVyZSBzaG91bGQgcHJlc2VydmUgdGhlIE1hY2hpbmVEb21pbmF0b3JUcmVlLAorICAvLy8gTWFjaGluZUxvb3BJbmZvLCBhbmQgTWFjaGluZVRyYWNlTWV0cmljcyBhbmFseXNlcy4KKyAgdmlydHVhbCBib29sIGFkZElMUE9wdHMoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIG1heSBiZSBpbXBsZW1lbnRlZCBieSB0YXJnZXRzIHRoYXQgd2FudCB0byBydW4gcGFzc2VzCisgIC8vLyBpbW1lZGlhdGVseSBiZWZvcmUgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKyAgdmlydHVhbCB2b2lkIGFkZFByZVJlZ0FsbG9jKCkgeyB9CisKKyAgLy8vIGNyZWF0ZVRhcmdldFJlZ2lzdGVyQWxsb2NhdG9yIC0gQ3JlYXRlIHRoZSByZWdpc3RlciBhbGxvY2F0b3IgcGFzcyBmb3IKKyAgLy8vIHRoaXMgdGFyZ2V0IGF0IHRoZSBjdXJyZW50IG9wdGltaXphdGlvbiBsZXZlbC4KKyAgdmlydHVhbCBGdW5jdGlvblBhc3MgKmNyZWF0ZVRhcmdldFJlZ2lzdGVyQWxsb2NhdG9yKGJvb2wgT3B0aW1pemVkKTsKKworICAvLy8gYWRkRmFzdFJlZ0FsbG9jIC0gQWRkIHRoZSBtaW5pbXVtIHNldCBvZiB0YXJnZXQtaW5kZXBlbmRlbnQgcGFzc2VzIHRoYXQKKyAgLy8vIGFyZSByZXF1aXJlZCBmb3IgZmFzdCByZWdpc3RlciBhbGxvY2F0aW9uLgorICB2aXJ0dWFsIHZvaWQgYWRkRmFzdFJlZ0FsbG9jKEZ1bmN0aW9uUGFzcyAqUmVnQWxsb2NQYXNzKTsKKworICAvLy8gYWRkT3B0aW1pemVkUmVnQWxsb2MgLSBBZGQgcGFzc2VzIHJlbGF0ZWQgdG8gcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKyAgLy8vIExMVk1UYXJnZXRNYWNoaW5lIHByb3ZpZGVzIHN0YW5kYXJkIHJlZ2FsbG9jIHBhc3NlcyBmb3IgbW9zdCB0YXJnZXRzLgorICB2aXJ0dWFsIHZvaWQgYWRkT3B0aW1pemVkUmVnQWxsb2MoRnVuY3Rpb25QYXNzICpSZWdBbGxvY1Bhc3MpOworCisgIC8vLyBhZGRQcmVSZXdyaXRlIC0gQWRkIHBhc3NlcyB0byB0aGUgb3B0aW1pemVkIHJlZ2lzdGVyIGFsbG9jYXRpb24gcGlwZWxpbmUKKyAgLy8vIGFmdGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24gaXMgY29tcGxldGUsIGJ1dCBiZWZvcmUgdmlydHVhbCByZWdpc3RlcnMgYXJlCisgIC8vLyByZXdyaXR0ZW4gdG8gcGh5c2ljYWwgcmVnaXN0ZXJzLgorICAvLy8KKyAgLy8vIFRoZXNlIHBhc3NlcyBtdXN0IHByZXNlcnZlIFZpcnRSZWdNYXAgYW5kIExpdmVJbnRlcnZhbHMsIGFuZCB3aGVuIHJ1bm5pbmcKKyAgLy8vIGFmdGVyIFJBQmFzaWMgb3IgUkFHcmVlZHksIHRoZXkgc2hvdWxkIHRha2UgYWR2YW50YWdlIG9mIExpdmVSZWdNYXRyaXguCisgIC8vLyBXaGVuIHRoZXNlIHBhc3NlcyBydW4sIFZpcnRSZWdNYXAgY29udGFpbnMgbGVnYWwgcGh5c3JlZyBhc3NpZ25tZW50cyBmb3IKKyAgLy8vIGFsbCB2aXJ0dWFsIHJlZ2lzdGVycy4KKyAgdmlydHVhbCBib29sIGFkZFByZVJld3JpdGUoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIG1heSBiZSBpbXBsZW1lbnRlZCBieSB0YXJnZXRzIHRoYXQgd2FudCB0byBydW4gcGFzc2VzIGFmdGVyCisgIC8vLyByZWdpc3RlciBhbGxvY2F0aW9uIHBhc3MgcGlwZWxpbmUgYnV0IGJlZm9yZSBwcm9sb2ctZXBpbG9nIGluc2VydGlvbi4KKyAgdmlydHVhbCB2b2lkIGFkZFBvc3RSZWdBbGxvYygpIHsgfQorCisgIC8vLyBBZGQgcGFzc2VzIHRoYXQgb3B0aW1pemUgbWFjaGluZSBpbnN0cnVjdGlvbnMgYWZ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKyAgdmlydHVhbCB2b2lkIGFkZE1hY2hpbmVMYXRlT3B0aW1pemF0aW9uKCk7CisKKyAgLy8vIFRoaXMgbWV0aG9kIG1heSBiZSBpbXBsZW1lbnRlZCBieSB0YXJnZXRzIHRoYXQgd2FudCB0byBydW4gcGFzc2VzIGFmdGVyCisgIC8vLyBwcm9sb2ctZXBpbG9nIGluc2VydGlvbiBhbmQgYmVmb3JlIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gc2NoZWR1bGluZyBwYXNzLgorICB2aXJ0dWFsIHZvaWQgYWRkUHJlU2NoZWQyKCkgeyB9CisKKyAgLy8vIGFkZEdDUGFzc2VzIC0gQWRkIGxhdGUgY29kZWdlbiBwYXNzZXMgdGhhdCBhbmFseXplIGNvZGUgZm9yIGdhcmJhZ2UKKyAgLy8vIGNvbGxlY3Rpb24uIFRoaXMgc2hvdWxkIHJldHVybiB0cnVlIGlmIEdDIGluZm8gc2hvdWxkIGJlIHByaW50ZWQgYWZ0ZXIKKyAgLy8vIHRoZXNlIHBhc3Nlcy4KKyAgdmlydHVhbCBib29sIGFkZEdDUGFzc2VzKCk7CisKKyAgLy8vIEFkZCBzdGFuZGFyZCBiYXNpYyBibG9jayBwbGFjZW1lbnQgcGFzc2VzLgorICB2aXJ0dWFsIHZvaWQgYWRkQmxvY2tQbGFjZW1lbnQoKTsKKworICAvLy8gVGhpcyBwYXNzIG1heSBiZSBpbXBsZW1lbnRlZCBieSB0YXJnZXRzIHRoYXQgd2FudCB0byBydW4gcGFzc2VzCisgIC8vLyBpbW1lZGlhdGVseSBiZWZvcmUgbWFjaGluZSBjb2RlIGlzIGVtaXR0ZWQuCisgIHZpcnR1YWwgdm9pZCBhZGRQcmVFbWl0UGFzcygpIHsgfQorCisgIC8vLyBUYXJnZXRzIG1heSBhZGQgcGFzc2VzIGltbWVkaWF0ZWx5IGJlZm9yZSBtYWNoaW5lIGNvZGUgaXMgZW1pdHRlZCBpbiB0aGlzCisgIC8vLyBjYWxsYmFjay4gVGhpcyBpcyBjYWxsZWQgZXZlbiBsYXRlciB0aGFuIGBhZGRQcmVFbWl0UGFzc2AuCisgIC8vIEZJWE1FOiBSZW5hbWUgYGFkZFByZUVtaXRQYXNzYCB0byBzb21ldGhpbmcgbW9yZSBzZW5zaWJsZSBnaXZlbiBpdHMgYWN0dWFsCisgIC8vIHBvc2l0aW9uIGFuZCByZW1vdmUgdGhlIGAyYCBzdWZmaXggaGVyZSBhcyB0aGlzIGNhbGxiYWNrIGlzIHdoYXQKKyAgLy8gYGFkZFByZUVtaXRQYXNzYCAqc2hvdWxkKiBiZSBidXQgaW4gcmVhbGl0eSBpc24ndC4KKyAgdmlydHVhbCB2b2lkIGFkZFByZUVtaXRQYXNzMigpIHt9CisKKyAgLy8vIFV0aWxpdGllcyBmb3IgdGFyZ2V0cyB0byBhZGQgcGFzc2VzIHRvIHRoZSBwYXNzIG1hbmFnZXIuCisgIC8vLworCisgIC8vLyBBZGQgYSBDb2RlR2VuIHBhc3MgYXQgdGhpcyBwb2ludCBpbiB0aGUgcGlwZWxpbmUgYWZ0ZXIgY2hlY2tpbmcgb3ZlcnJpZGVzLgorICAvLy8gUmV0dXJuIHRoZSBwYXNzIHRoYXQgd2FzIGFkZGVkLCBvciB6ZXJvIGlmIG5vIHBhc3Mgd2FzIGFkZGVkLgorICAvLy8gQHAgcHJpbnRBZnRlciAgICBpZiB0cnVlIGFuZCBhZGRpbmcgYSBtYWNoaW5lIGZ1bmN0aW9uIHBhc3MgYWRkIGFuIGV4dHJhCisgIC8vLyAgICAgICAgICAgICAgICAgIG1hY2hpbmUgcHJpbnRlciBwYXNzIGFmdGVyd2FyZHMKKyAgLy8vIEBwIHZlcmlmeUFmdGVyICAgaWYgdHJ1ZSBhbmQgYWRkaW5nIGEgbWFjaGluZSBmdW5jdGlvbiBwYXNzIGFkZCBhbiBleHRyYQorICAvLy8gICAgICAgICAgICAgICAgICBtYWNoaW5lIHZlcmlmaWNhdGlvbiBwYXNzIGFmdGVyd2FyZHMuCisgIEFuYWx5c2lzSUQgYWRkUGFzcyhBbmFseXNpc0lEIFBhc3NJRCwgYm9vbCB2ZXJpZnlBZnRlciA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICBib29sIHByaW50QWZ0ZXIgPSB0cnVlKTsKKworICAvLy8gQWRkIGEgcGFzcyB0byB0aGUgUGFzc01hbmFnZXIgaWYgdGhhdCBwYXNzIGlzIHN1cHBvc2VkIHRvIGJlIHJ1biwgYXMKKyAgLy8vIGRldGVybWluZWQgYnkgdGhlIFN0YXJ0QWZ0ZXIgYW5kIFN0b3BBZnRlciBvcHRpb25zLiBUYWtlcyBvd25lcnNoaXAgb2YgdGhlCisgIC8vLyBwYXNzLgorICAvLy8gQHAgcHJpbnRBZnRlciAgICBpZiB0cnVlIGFuZCBhZGRpbmcgYSBtYWNoaW5lIGZ1bmN0aW9uIHBhc3MgYWRkIGFuIGV4dHJhCisgIC8vLyAgICAgICAgICAgICAgICAgIG1hY2hpbmUgcHJpbnRlciBwYXNzIGFmdGVyd2FyZHMKKyAgLy8vIEBwIHZlcmlmeUFmdGVyICAgaWYgdHJ1ZSBhbmQgYWRkaW5nIGEgbWFjaGluZSBmdW5jdGlvbiBwYXNzIGFkZCBhbiBleHRyYQorICAvLy8gICAgICAgICAgICAgICAgICBtYWNoaW5lIHZlcmlmaWNhdGlvbiBwYXNzIGFmdGVyd2FyZHMuCisgIHZvaWQgYWRkUGFzcyhQYXNzICpQLCBib29sIHZlcmlmeUFmdGVyID0gdHJ1ZSwgYm9vbCBwcmludEFmdGVyID0gdHJ1ZSk7CisKKyAgLy8vIGFkZE1hY2hpbmVQYXNzZXMgaGVscGVyIHRvIGNyZWF0ZSB0aGUgdGFyZ2V0LXNlbGVjdGVkIG9yIG92ZXJyaWRlbgorICAvLy8gcmVnYWxsb2MgcGFzcy4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVSZWdBbGxvY1Bhc3MoYm9vbCBPcHRpbWl6ZWQpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9UQVJHRVRQQVNTQ09ORklHX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRSZWdpc3RlckluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRSZWdpc3RlckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTQ3YTI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldFJlZ2lzdGVySW5mby5oCkBAIC0wLDAgKzEsMTE4OCBAQAorLy89PS0gQ29kZUdlbi9UYXJnZXRSZWdpc3RlckluZm8uaCAtIFRhcmdldCBSZWdpc3RlciBJbmZvcm1hdGlvbiAtKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIGFuIGFic3RyYWN0IGludGVyZmFjZSB1c2VkIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBhCisvLyB0YXJnZXQgbWFjaGluZXMgcmVnaXN0ZXIgZmlsZS4gIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBmb3IgYSB2YXJpZXR5IG9mCisvLyBwdXJwb3NlZCwgZXNwZWNpYWxseSByZWdpc3RlciBhbGxvY2F0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1RBUkdFVFJFR0lTVEVSSU5GT19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9UQVJHRVRSRUdJU1RFUklORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTGFuZUJpdG1hc2suaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWFjaGluZVZhbHVlVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1ByaW50YWJsZS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJpdFZlY3RvcjsKK2NsYXNzIExpdmVSZWdNYXRyaXg7CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBSZWdTY2F2ZW5nZXI7CitjbGFzcyBWaXJ0UmVnTWFwOworY2xhc3MgTGl2ZUludGVydmFsczsKKworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJDbGFzcyB7CitwdWJsaWM6CisgIHVzaW5nIGl0ZXJhdG9yID0gY29uc3QgTUNQaHlzUmVnICo7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gY29uc3QgTUNQaHlzUmVnICo7CisgIHVzaW5nIHNjX2l0ZXJhdG9yID0gY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyogY29uc3QgKjsKKworICAvLyBJbnN0YW5jZSB2YXJpYWJsZXMgZmlsbGVkIGJ5IHRhYmxlZ2VuLCBkbyBub3QgdXNlIQorICBjb25zdCBNQ1JlZ2lzdGVyQ2xhc3MgKk1DOworICBjb25zdCB1aW50MzJfdCAqU3ViQ2xhc3NNYXNrOworICBjb25zdCB1aW50MTZfdCAqU3VwZXJSZWdJbmRpY2VzOworICBjb25zdCBMYW5lQml0bWFzayBMYW5lTWFzazsKKyAgLy8vIENsYXNzZXMgd2l0aCBhIGhpZ2hlciBwcmlvcml0eSB2YWx1ZSBhcmUgYXNzaWduZWQgZmlyc3QgYnkgcmVnaXN0ZXIKKyAgLy8vIGFsbG9jYXRvcnMgdXNpbmcgYSBncmVlZHkgaGV1cmlzdGljLiBUaGUgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIFswLDYzXS4KKyAgY29uc3QgdWludDhfdCBBbGxvY2F0aW9uUHJpb3JpdHk7CisgIC8vLyBXaGV0aGVyIHRoZSBjbGFzcyBzdXBwb3J0cyB0d28gKG9yIG1vcmUpIGRpc2p1bmN0IHN1YnJlZ2lzdGVyIGluZGljZXMuCisgIGNvbnN0IGJvb2wgSGFzRGlzanVuY3RTdWJSZWdzOworICAvLy8gV2hldGhlciBhIGNvbWJpbmF0aW9uIG9mIHN1YnJlZ2lzdGVycyBjYW4gY292ZXIgZXZlcnkgcmVnaXN0ZXIgaW4gdGhlCisgIC8vLyBjbGFzcy4gU2VlIGFsc28gdGhlIENvdmVyZWRCeVN1YlJlZ3MgZGVzY3JpcHRpb24gaW4gVGFyZ2V0LnRkLgorICBjb25zdCBib29sIENvdmVyZWRCeVN1YlJlZ3M7CisgIGNvbnN0IHNjX2l0ZXJhdG9yIFN1cGVyQ2xhc3NlczsKKyAgQXJyYXlSZWY8TUNQaHlzUmVnPiAoKk9yZGVyRnVuYykoY29uc3QgTWFjaGluZUZ1bmN0aW9uJik7CisKKyAgLy8vIFJldHVybiB0aGUgcmVnaXN0ZXIgY2xhc3MgSUQgbnVtYmVyLgorICB1bnNpZ25lZCBnZXRJRCgpIGNvbnN0IHsgcmV0dXJuIE1DLT5nZXRJRCgpOyB9CisKKyAgLy8vIGJlZ2luL2VuZCAtIFJldHVybiBhbGwgb2YgdGhlIHJlZ2lzdGVycyBpbiB0aGlzIGNsYXNzLgorICAvLy8KKyAgaXRlcmF0b3IgICAgICAgYmVnaW4oKSBjb25zdCB7IHJldHVybiBNQy0+YmVnaW4oKTsgfQorICBpdGVyYXRvciAgICAgICAgIGVuZCgpIGNvbnN0IHsgcmV0dXJuIE1DLT5lbmQoKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiByZWdpc3RlcnMgaW4gdGhpcyBjbGFzcy4KKyAgdW5zaWduZWQgZ2V0TnVtUmVncygpIGNvbnN0IHsgcmV0dXJuIE1DLT5nZXROdW1SZWdzKCk7IH0KKworICBpdGVyYXRvcl9yYW5nZTxTbWFsbFZlY3RvckltcGw8TUNQaHlzUmVnPjo6Y29uc3RfaXRlcmF0b3I+CisgIGdldFJlZ2lzdGVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShNQy0+YmVnaW4oKSwgTUMtPmVuZCgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHNwZWNpZmllZCByZWdpc3RlciBpbiB0aGUgY2xhc3MuCisgIHVuc2lnbmVkIGdldFJlZ2lzdGVyKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICByZXR1cm4gTUMtPmdldFJlZ2lzdGVyKGkpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgaXMgaW5jbHVkZWQgaW4gdGhpcyByZWdpc3RlciBjbGFzcy4KKyAgLy8vIFRoaXMgZG9lcyBub3QgaW5jbHVkZSB2aXJ0dWFsIHJlZ2lzdGVycy4KKyAgYm9vbCBjb250YWlucyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gTUMtPmNvbnRhaW5zKFJlZyk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYm90aCByZWdpc3RlcnMgYXJlIGluIHRoaXMgY2xhc3MuCisgIGJvb2wgY29udGFpbnModW5zaWduZWQgUmVnMSwgdW5zaWduZWQgUmVnMikgY29uc3QgeworICAgIHJldHVybiBNQy0+Y29udGFpbnMoUmVnMSwgUmVnMik7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBjb3N0IG9mIGNvcHlpbmcgYSB2YWx1ZSBiZXR3ZWVuIHR3byByZWdpc3RlcnMgaW4gdGhpcyBjbGFzcy4KKyAgLy8vIEEgbmVnYXRpdmUgbnVtYmVyIG1lYW5zIHRoZSByZWdpc3RlciBjbGFzcyBpcyB2ZXJ5IGV4cGVuc2l2ZQorICAvLy8gdG8gY29weSBlLmcuIHN0YXR1cyBmbGFnIHJlZ2lzdGVyIGNsYXNzZXMuCisgIGludCBnZXRDb3B5Q29zdCgpIGNvbnN0IHsgcmV0dXJuIE1DLT5nZXRDb3B5Q29zdCgpOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgcmVnaXN0ZXIgY2xhc3MgbWF5IGJlIHVzZWQgdG8gY3JlYXRlIHZpcnR1YWwKKyAgLy8vIHJlZ2lzdGVycy4KKyAgYm9vbCBpc0FsbG9jYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gTUMtPmlzQWxsb2NhdGFibGUoKTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFRhcmdldFJlZ2lzdGVyQ2xhc3MKKyAgLy8vIGlzIGEgcHJvcGVyIHN1Yi1jbGFzcyBvZiB0aGlzIFRhcmdldFJlZ2lzdGVyQ2xhc3MuCisgIGJvb2wgaGFzU3ViQ2xhc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpIGNvbnN0IHsKKyAgICByZXR1cm4gUkMgIT0gdGhpcyAmJiBoYXNTdWJDbGFzc0VxKFJDKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgUkMgaXMgYSBzdWItY2xhc3Mgb2Ygb3IgZXF1YWwgdG8gdGhpcyBjbGFzcy4KKyAgYm9vbCBoYXNTdWJDbGFzc0VxKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdCB7CisgICAgdW5zaWduZWQgSUQgPSBSQy0+Z2V0SUQoKTsKKyAgICByZXR1cm4gKFN1YkNsYXNzTWFza1tJRCAvIDMyXSA+PiAoSUQgJSAzMikpICYgMTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFRhcmdldFJlZ2lzdGVyQ2xhc3MgaXMgYQorICAvLy8gcHJvcGVyIHN1cGVyLWNsYXNzIG9mIHRoaXMgVGFyZ2V0UmVnaXN0ZXJDbGFzcy4KKyAgYm9vbCBoYXNTdXBlckNsYXNzKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdCB7CisgICAgcmV0dXJuIFJDLT5oYXNTdWJDbGFzcyh0aGlzKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgUkMgaXMgYSBzdXBlci1jbGFzcyBvZiBvciBlcXVhbCB0byB0aGlzIGNsYXNzLgorICBib29sIGhhc1N1cGVyQ2xhc3NFcShjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgY29uc3QgeworICAgIHJldHVybiBSQy0+aGFzU3ViQ2xhc3NFcSh0aGlzKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGEgYml0IHZlY3RvciBvZiBzdWJjbGFzc2VzLCBpbmNsdWRpbmcgdGhpcyBvbmUuCisgIC8vLyBUaGUgdmVjdG9yIGlzIGluZGV4ZWQgYnkgY2xhc3MgSURzLgorICAvLy8KKyAgLy8vIFRvIHVzZSBpdCwgY29uc2lkZXIgdGhlIHJldHVybmVkIGFycmF5IGFzIGEgY2h1bmsgb2YgbWVtb3J5IHRoYXQKKyAgLy8vIGNvbnRhaW5zIGFuIGFycmF5IG9mIGJpdHMgb2Ygc2l6ZSBOdW1SZWdDbGFzc2VzLiBFYWNoIDMyLWJpdCBjaHVuaworICAvLy8gY29udGFpbnMgYSBiaXRzZXQgb2YgdGhlIElEIG9mIHRoZSBzdWJjbGFzc2VzIGluIGJpZy1lbmRpYW4gc3R5bGUuCisKKyAgLy8vIEkuZS4sIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVtb3J5IGZyb20gbGVmdCB0byByaWdodCBhdCB0aGUKKyAgLy8vIGJpdCBsZXZlbCBsb29rcyBsaWtlOgorICAvLy8gWzMxIDMwIC4uLiAxIDBdIFsgNjMgNjIgLi4uIDMzIDMyXSAuLi4KKyAgLy8vICAgICAgICAgICAgICAgICAgICAgWyBYWFggTnVtUmVnQ2xhc3NlcyBOdW1SZWdDbGFzc2VzIC0gMSAuLi4gXQorICAvLy8gV2hlcmUgdGhlIG51bWJlciByZXByZXNlbnRzIHRoZSBjbGFzcyBJRCBhbmQgWFhYIGJpdHMgdGhhdAorICAvLy8gc2hvdWxkIGJlIGlnbm9yZWQuCisgIC8vLworICAvLy8gU2VlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBoYXNTdWJDbGFzc0VxIGZvciBhbiBleGFtcGxlIG9mIGhvdyBpdAorICAvLy8gY2FuIGJlIHVzZWQuCisgIGNvbnN0IHVpbnQzMl90ICpnZXRTdWJDbGFzc01hc2soKSBjb25zdCB7CisgICAgcmV0dXJuIFN1YkNsYXNzTWFzazsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGEgMC10ZXJtaW5hdGVkIGxpc3Qgb2Ygc3ViLXJlZ2lzdGVyIGluZGljZXMgdGhhdCBwcm9qZWN0IHNvbWUKKyAgLy8vIHN1cGVyLXJlZ2lzdGVyIGNsYXNzIGludG8gdGhpcyByZWdpc3RlciBjbGFzcy4gVGhlIGxpc3QgaGFzIGFuIGVudHJ5IGZvcgorICAvLy8gZWFjaCBJZHggc3VjaCB0aGF0OgorICAvLy8KKyAgLy8vICAgVGhlcmUgZXhpc3RzIFN1cGVyUkMgd2hlcmU6CisgIC8vLyAgICAgRm9yIGFsbCBSZWcgaW4gU3VwZXJSQzoKKyAgLy8vICAgICAgIHRoaXMtPmNvbnRhaW5zKFJlZzpJZHgpCisgIGNvbnN0IHVpbnQxNl90ICpnZXRTdXBlclJlZ0luZGljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIFN1cGVyUmVnSW5kaWNlczsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGEgTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2Ygc3VwZXItY2xhc3Nlcy4gIFRoZQorICAvLy8gY2xhc3NlcyBhcmUgb3JkZXJlZCBieSBJRCB3aGljaCBpcyBhbHNvIGEgdG9wb2xvZ2ljYWwgb3JkZXJpbmcgZnJvbSBsYXJnZQorICAvLy8gdG8gc21hbGwgY2xhc3Nlcy4gIFRoZSBsaXN0IGRvZXMgTk9UIGluY2x1ZGUgdGhlIGN1cnJlbnQgY2xhc3MuCisgIHNjX2l0ZXJhdG9yIGdldFN1cGVyQ2xhc3NlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gU3VwZXJDbGFzc2VzOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgVGFyZ2V0UmVnaXN0ZXJDbGFzcyBpcyBhIHN1YnNldAorICAvLy8gY2xhc3Mgb2YgYXQgbGVhc3Qgb25lIG90aGVyIFRhcmdldFJlZ2lzdGVyQ2xhc3MuCisgIGJvb2wgaXNBU3ViQ2xhc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIFN1cGVyQ2xhc3Nlc1swXSAhPSBudWxscHRyOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHByZWZlcnJlZCBvcmRlciBmb3IgYWxsb2NhdGluZyByZWdpc3RlcnMgZnJvbSB0aGlzIHJlZ2lzdGVyCisgIC8vLyBjbGFzcyBpbiBNRi4gVGhlIHJhdyBvcmRlciBjb21lcyBkaXJlY3RseSBmcm9tIHRoZSAudGQgZmlsZSBhbmQgbWF5CisgIC8vLyBpbmNsdWRlIHJlc2VydmVkIHJlZ2lzdGVycyB0aGF0IGFyZSBub3QgYWxsb2NhdGFibGUuCisgIC8vLyBSZWdpc3RlciBhbGxvY2F0b3JzIHNob3VsZCBhbHNvIG1ha2Ugc3VyZSB0byBhbGxvY2F0ZQorICAvLy8gY2FsbGVlLXNhdmVkIHJlZ2lzdGVycyBvbmx5IGFmdGVyIGFsbCB0aGUgdm9sYXRpbGVzIGFyZSB1c2VkLiBUaGUKKyAgLy8vIFJlZ2lzdGVyQ2xhc3NJbmZvIGNsYXNzIHByb3ZpZGVzIGZpbHRlcmVkIGFsbG9jYXRpb24gb3JkZXJzIHdpdGgKKyAgLy8vIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMgbW92ZWQgdG8gdGhlIGVuZC4KKyAgLy8vCisgIC8vLyBUaGUgTWFjaGluZUZ1bmN0aW9uIGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIHR1bmUgdGhlIGFsbG9jYXRhYmxlCisgIC8vLyByZWdpc3RlcnMgYmFzZWQgb24gdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgZnVuY3Rpb24sIHN1YnRhcmdldCwgb3IKKyAgLy8vIG90aGVyIGNyaXRlcmlhLgorICAvLy8KKyAgLy8vIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIHJldHVybnMgYWxsIHJlZ2lzdGVycyBpbiB0aGUgY2xhc3MuCisgIEFycmF5UmVmPE1DUGh5c1JlZz4gZ2V0UmF3QWxsb2NhdGlvbk9yZGVyKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICByZXR1cm4gT3JkZXJGdW5jID8gT3JkZXJGdW5jKE1GKSA6IG1ha2VBcnJheVJlZihiZWdpbigpLCBnZXROdW1SZWdzKCkpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGNvbWJpbmF0aW9uIG9mIGFsbCBsYW5lIG1hc2tzIG9mIHJlZ2lzdGVyIGluIHRoaXMgY2xhc3MuCisgIC8vLyBUaGUgbGFuZSBtYXNrcyBvZiB0aGUgcmVnaXN0ZXJzIGFyZSB0aGUgY29tYmluYXRpb24gb2YgYWxsIGxhbmUgbWFza3MKKyAgLy8vIG9mIHRoZWlyIHN1YnJlZ2lzdGVycy4gUmV0dXJucyAxIGlmIHRoZXJlIGFyZSBubyBzdWJyZWdpc3RlcnMuCisgIExhbmVCaXRtYXNrIGdldExhbmVNYXNrKCkgY29uc3QgeworICAgIHJldHVybiBMYW5lTWFzazsKKyAgfQorfTsKKworLy8vIEV4dHJhIGluZm9ybWF0aW9uLCBub3QgaW4gTUNSZWdpc3RlckRlc2MsIGFib3V0IHJlZ2lzdGVycy4KKy8vLyBUaGVzZSBhcmUgdXNlZCBieSBjb2RlZ2VuLCBub3QgYnkgTUMuCitzdHJ1Y3QgVGFyZ2V0UmVnaXN0ZXJJbmZvRGVzYyB7CisgIHVuc2lnbmVkIENvc3RQZXJVc2U7ICAgICAgICAgIC8vIEV4dHJhIGNvc3Qgb2YgaW5zdHJ1Y3Rpb25zIHVzaW5nIHJlZ2lzdGVyLgorICBib29sIGluQWxsb2NhdGFibGVDbGFzczsgICAgICAvLyBSZWdpc3RlciBiZWxvbmdzIHRvIGFuIGFsbG9jYXRhYmxlIHJlZ2NsYXNzLgorfTsKKworLy8vIEVhY2ggVGFyZ2V0UmVnaXN0ZXJDbGFzcyBoYXMgYSBwZXIgcmVnaXN0ZXIgd2VpZ2h0LCBhbmQgd2VpZ2h0CisvLy8gbGltaXQgd2hpY2ggbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGxpbWl0cyBvZiBpdHMgcHJlc3N1cmUgc2V0cy4KK3N0cnVjdCBSZWdDbGFzc1dlaWdodCB7CisgIHVuc2lnbmVkIFJlZ1dlaWdodDsKKyAgdW5zaWduZWQgV2VpZ2h0TGltaXQ7Cit9OworCisvLy8gVGFyZ2V0UmVnaXN0ZXJJbmZvIGJhc2UgY2xhc3MgLSBXZSBhc3N1bWUgdGhhdCB0aGUgdGFyZ2V0IGRlZmluZXMgYSBzdGF0aWMKKy8vLyBhcnJheSBvZiBUYXJnZXRSZWdpc3RlckRlc2Mgb2JqZWN0cyB0aGF0IHJlcHJlc2VudCBhbGwgb2YgdGhlIG1hY2hpbmUKKy8vLyByZWdpc3RlcnMgdGhhdCB0aGUgdGFyZ2V0IGhhcy4gIEFzIHN1Y2gsIHdlIHNpbXBseSBoYXZlIHRvIHRyYWNrIGEgcG9pbnRlcgorLy8vIHRvIHRoaXMgYXJyYXkgc28gdGhhdCB3ZSBjYW4gdHVybiByZWdpc3RlciBudW1iZXIgaW50byBhIHJlZ2lzdGVyCisvLy8gZGVzY3JpcHRvci4KKy8vLworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvIDogcHVibGljIE1DUmVnaXN0ZXJJbmZvIHsKK3B1YmxpYzoKKyAgdXNpbmcgcmVnY2xhc3NfaXRlcmF0b3IgPSBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICogY29uc3QgKjsKKyAgdXNpbmcgdnRfaXRlcmF0b3IgPSBjb25zdCBNVlQ6OlNpbXBsZVZhbHVlVHlwZSAqOworICBzdHJ1Y3QgUmVnQ2xhc3NJbmZvIHsKKyAgICB1bnNpZ25lZCBSZWdTaXplLCBTcGlsbFNpemUsIFNwaWxsQWxpZ25tZW50OworICAgIHZ0X2l0ZXJhdG9yIFZUTGlzdDsKKyAgfTsKK3ByaXZhdGU6CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mb0Rlc2MgKkluZm9EZXNjOyAgICAgLy8gRXh0cmEgZGVzYyBhcnJheSBmb3IgY29kZWdlbgorICBjb25zdCBjaGFyICpjb25zdCAqU3ViUmVnSW5kZXhOYW1lczsgICAgICAgIC8vIE5hbWVzIG9mIHN1YnJlZyBpbmRleGVzLgorICAvLyBQb2ludGVyIHRvIGFycmF5IG9mIGxhbmUgbWFza3MsIG9uZSBwZXIgc3ViLXJlZyBpbmRleC4KKyAgY29uc3QgTGFuZUJpdG1hc2sgKlN1YlJlZ0luZGV4TGFuZU1hc2tzOworCisgIHJlZ2NsYXNzX2l0ZXJhdG9yIFJlZ0NsYXNzQmVnaW4sIFJlZ0NsYXNzRW5kOyAgIC8vIExpc3Qgb2YgcmVnY2xhc3NlcworICBMYW5lQml0bWFzayBDb3ZlcmluZ0xhbmVzOworICBjb25zdCBSZWdDbGFzc0luZm8gKmNvbnN0IFJDSW5mb3M7CisgIHVuc2lnbmVkIEh3TW9kZTsKKworcHJvdGVjdGVkOgorICBUYXJnZXRSZWdpc3RlckluZm8oY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvRGVzYyAqSUQsCisgICAgICAgICAgICAgICAgICAgICByZWdjbGFzc19pdGVyYXRvciBSZWdDbGFzc0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgcmVnY2xhc3NfaXRlcmF0b3IgUmVnQ2xhc3NFbmQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb25zdCAqU1JJTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5lQml0bWFzayAqU1JJTGFuZU1hc2tzLAorICAgICAgICAgICAgICAgICAgICAgTGFuZUJpdG1hc2sgQ292ZXJpbmdMYW5lcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ0NsYXNzSW5mbyAqY29uc3QgUlNJLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTW9kZSA9IDApOworICB2aXJ0dWFsIH5UYXJnZXRSZWdpc3RlckluZm8oKTsKKworcHVibGljOgorICAvLyBSZWdpc3RlciBudW1iZXJzIGNhbiByZXByZXNlbnQgcGh5c2ljYWwgcmVnaXN0ZXJzLCB2aXJ0dWFsIHJlZ2lzdGVycywgYW5kCisgIC8vIHNvbWV0aW1lcyBzdGFjayBzbG90cy4gVGhlIHVuc2lnbmVkIHZhbHVlcyBhcmUgZGl2aWRlZCBpbnRvIHRoZXNlIHJhbmdlczoKKyAgLy8KKyAgLy8gICAwICAgICAgICAgICBOb3QgYSByZWdpc3RlciwgY2FuIGJlIHVzZWQgYXMgYSBzZW50aW5lbC4KKyAgLy8gICBbMTsyXjMwKSAgICBQaHlzaWNhbCByZWdpc3RlcnMgYXNzaWduZWQgYnkgVGFibGVHZW4uCisgIC8vICAgWzJeMzA7Ml4zMSkgU3RhY2sgc2xvdHMuIChSYXJlbHkgdXNlZC4pCisgIC8vICAgWzJeMzE7Ml4zMikgVmlydHVhbCByZWdpc3RlcnMgYXNzaWduZWQgYnkgTWFjaGluZVJlZ2lzdGVySW5mby4KKyAgLy8KKyAgLy8gRnVydGhlciBzZW50aW5lbHMgY2FuIGJlIGFsbG9jYXRlZCBmcm9tIHRoZSBzbWFsbCBuZWdhdGl2ZSBpbnRlZ2Vycy4KKyAgLy8gRGVuc2VNYXBJbmZvPHVuc2lnbmVkPiB1c2VzIC0xdSBhbmQgLTJ1LgorCisgIC8vLyBpc1N0YWNrU2xvdCAtIFNvbWV0aW1lcyBpdCBpcyB1c2VmdWwgdGhlIGJlIGFibGUgdG8gc3RvcmUgYSBub24tbmVnYXRpdmUKKyAgLy8vIGZyYW1lIGluZGV4IGluIGEgdmFyaWFibGUgdGhhdCBub3JtYWxseSBob2xkcyBhIHJlZ2lzdGVyLiBpc1N0YWNrU2xvdCgpCisgIC8vLyByZXR1cm5zIHRydWUgaWYgUmVnIGlzIGluIHRoZSByYW5nZSB1c2VkIGZvciBzdGFjayBzbG90cy4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgaXNWaXJ0dWFsUmVnaXN0ZXIoKSBhbmQgaXNQaHlzaWNhbFJlZ2lzdGVyKCkgY2Fubm90IGhhbmRsZSBzdGFjaworICAvLy8gc2xvdHMsIHNvIGlmIGEgdmFyaWFibGUgbWF5IGNvbnRhaW5zIGEgc3RhY2sgc2xvdCwgYWx3YXlzIGNoZWNrCisgIC8vLyBpc1N0YWNrU2xvdCgpIGZpcnN0LgorICAvLy8KKyAgc3RhdGljIGJvb2wgaXNTdGFja1Nsb3QodW5zaWduZWQgUmVnKSB7CisgICAgcmV0dXJuIGludChSZWcpID49ICgxIDw8IDMwKTsKKyAgfQorCisgIC8vLyBDb21wdXRlIHRoZSBmcmFtZSBpbmRleCBmcm9tIGEgcmVnaXN0ZXIgdmFsdWUgcmVwcmVzZW50aW5nIGEgc3RhY2sgc2xvdC4KKyAgc3RhdGljIGludCBzdGFja1Nsb3QySW5kZXgodW5zaWduZWQgUmVnKSB7CisgICAgYXNzZXJ0KGlzU3RhY2tTbG90KFJlZykgJiYgIk5vdCBhIHN0YWNrIHNsb3QiKTsKKyAgICByZXR1cm4gaW50KFJlZyAtICgxdSA8PCAzMCkpOworICB9CisKKyAgLy8vIENvbnZlcnQgYSBub24tbmVnYXRpdmUgZnJhbWUgaW5kZXggdG8gYSBzdGFjayBzbG90IHJlZ2lzdGVyIHZhbHVlLgorICBzdGF0aWMgdW5zaWduZWQgaW5kZXgyU3RhY2tTbG90KGludCBGSSkgeworICAgIGFzc2VydChGSSA+PSAwICYmICJDYW5ub3QgaG9sZCBhIG5lZ2F0aXZlIGZyYW1lIGluZGV4LiIpOworICAgIHJldHVybiBGSSArICgxdSA8PCAzMCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCByZWdpc3RlciBudW1iZXIgaXMgaW4KKyAgLy8vIHRoZSBwaHlzaWNhbCByZWdpc3RlciBuYW1lc3BhY2UuCisgIHN0YXRpYyBib29sIGlzUGh5c2ljYWxSZWdpc3Rlcih1bnNpZ25lZCBSZWcpIHsKKyAgICBhc3NlcnQoIWlzU3RhY2tTbG90KFJlZykgJiYgIk5vdCBhIHJlZ2lzdGVyISBDaGVjayBpc1N0YWNrU2xvdCgpIGZpcnN0LiIpOworICAgIHJldHVybiBpbnQoUmVnKSA+IDA7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCByZWdpc3RlciBudW1iZXIgaXMgaW4KKyAgLy8vIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyIG5hbWVzcGFjZS4KKyAgc3RhdGljIGJvb2wgaXNWaXJ0dWFsUmVnaXN0ZXIodW5zaWduZWQgUmVnKSB7CisgICAgYXNzZXJ0KCFpc1N0YWNrU2xvdChSZWcpICYmICJOb3QgYSByZWdpc3RlciEgQ2hlY2sgaXNTdGFja1Nsb3QoKSBmaXJzdC4iKTsKKyAgICByZXR1cm4gaW50KFJlZykgPCAwOworICB9CisKKyAgLy8vIENvbnZlcnQgYSB2aXJ0dWFsIHJlZ2lzdGVyIG51bWJlciB0byBhIDAtYmFzZWQgaW5kZXguCisgIC8vLyBUaGUgZmlyc3QgdmlydHVhbCByZWdpc3RlciBpbiBhIGZ1bmN0aW9uIHdpbGwgZ2V0IHRoZSBpbmRleCAwLgorICBzdGF0aWMgdW5zaWduZWQgdmlydFJlZzJJbmRleCh1bnNpZ25lZCBSZWcpIHsKKyAgICBhc3NlcnQoaXNWaXJ0dWFsUmVnaXN0ZXIoUmVnKSAmJiAiTm90IGEgdmlydHVhbCByZWdpc3RlciIpOworICAgIHJldHVybiBSZWcgJiB+KDF1IDw8IDMxKTsKKyAgfQorCisgIC8vLyBDb252ZXJ0IGEgMC1iYXNlZCBpbmRleCB0byBhIHZpcnR1YWwgcmVnaXN0ZXIgbnVtYmVyLgorICAvLy8gVGhpcyBpcyB0aGUgaW52ZXJzZSBvcGVyYXRpb24gb2YgVmlydFJlZzJJbmRleEZ1bmN0b3IgYmVsb3cuCisgIHN0YXRpYyB1bnNpZ25lZCBpbmRleDJWaXJ0UmVnKHVuc2lnbmVkIEluZGV4KSB7CisgICAgcmV0dXJuIEluZGV4IHwgKDF1IDw8IDMxKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHNpemUgaW4gYml0cyBvZiBhIHJlZ2lzdGVyIGZyb20gY2xhc3MgUkMuCisgIHVuc2lnbmVkIGdldFJlZ1NpemVJbkJpdHMoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAmUkMpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UmVnQ2xhc3NJbmZvKFJDKS5SZWdTaXplOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3RhY2sgc2xvdCBhbGxvY2F0ZWQgdG8gaG9sZCBhIHNwaWxsZWQKKyAgLy8vIGNvcHkgb2YgYSByZWdpc3RlciBmcm9tIGNsYXNzIFJDLgorICB1bnNpZ25lZCBnZXRTcGlsbFNpemUoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAmUkMpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UmVnQ2xhc3NJbmZvKFJDKS5TcGlsbFNpemUgLyA4OworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbWluaW11bSByZXF1aXJlZCBhbGlnbm1lbnQgaW4gYnl0ZXMgZm9yIGEgc3BpbGwgc2xvdCBmb3IKKyAgLy8vIGEgcmVnaXN0ZXIgb2YgdGhpcyBjbGFzcy4KKyAgdW5zaWduZWQgZ2V0U3BpbGxBbGlnbm1lbnQoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAmUkMpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UmVnQ2xhc3NJbmZvKFJDKS5TcGlsbEFsaWdubWVudCAvIDg7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIFRhcmdldFJlZ2lzdGVyQ2xhc3MgaGFzIHRoZSBWYWx1ZVR5cGUgVC4KKyAgYm9vbCBpc1R5cGVMZWdhbEZvckNsYXNzKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgJlJDLCBNVlQgVCkgY29uc3QgeworICAgIGZvciAoYXV0byBJID0gbGVnYWxjbGFzc3R5cGVzX2JlZ2luKFJDKTsgKkkgIT0gTVZUOjpPdGhlcjsgKytJKQorICAgICAgaWYgKE1WVCgqSSkgPT0gVCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIExvb3Agb3ZlciBhbGwgb2YgdGhlIHZhbHVlIHR5cGVzIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IHZhbHVlcworICAvLy8gaW4gdGhlIGdpdmVuIHJlZ2lzdGVyIGNsYXNzLgorICB2dF9pdGVyYXRvciBsZWdhbGNsYXNzdHlwZXNfYmVnaW4oY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAmUkMpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UmVnQ2xhc3NJbmZvKFJDKS5WVExpc3Q7CisgIH0KKworICB2dF9pdGVyYXRvciBsZWdhbGNsYXNzdHlwZXNfZW5kKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgJlJDKSBjb25zdCB7CisgICAgdnRfaXRlcmF0b3IgSSA9IGxlZ2FsY2xhc3N0eXBlc19iZWdpbihSQyk7CisgICAgd2hpbGUgKCpJICE9IE1WVDo6T3RoZXIpCisgICAgICArK0k7CisgICAgcmV0dXJuIEk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgUmVnaXN0ZXIgQ2xhc3Mgb2YgYSBwaHlzaWNhbCByZWdpc3RlciBvZiB0aGUgZ2l2ZW4gdHlwZSwKKyAgLy8vIHBpY2tpbmcgdGhlIG1vc3Qgc3ViIHJlZ2lzdGVyIGNsYXNzIG9mIHRoZSByaWdodCB0eXBlIHRoYXQgY29udGFpbnMgdGhpcworICAvLy8gcGh5c3JlZy4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqCisgICAgZ2V0TWluaW1hbFBoeXNSZWdDbGFzcyh1bnNpZ25lZCBSZWcsIE1WVCBWVCA9IE1WVDo6T3RoZXIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIG1heGltYWwgc3ViY2xhc3Mgb2YgdGhlIGdpdmVuIHJlZ2lzdGVyIGNsYXNzIHRoYXQgaXMKKyAgLy8vIGFsbG9jYXRhYmxlIG9yIE5VTEwuCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKgorICAgIGdldEFsbG9jYXRhYmxlQ2xhc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIGEgYml0c2V0IGluZGV4ZWQgYnkgcmVnaXN0ZXIgbnVtYmVyIGluZGljYXRpbmcgaWYgYSByZWdpc3RlciBpcworICAvLy8gYWxsb2NhdGFibGUgb3Igbm90LiBJZiBhIHJlZ2lzdGVyIGNsYXNzIGlzIHNwZWNpZmllZCwgcmV0dXJucyB0aGUgc3Vic2V0CisgIC8vLyBmb3IgdGhlIGNsYXNzLgorICBCaXRWZWN0b3IgZ2V0QWxsb2NhdGFibGVTZXQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgYWRkaXRpb25hbCBjb3N0IG9mIHVzaW5nIHRoaXMgcmVnaXN0ZXIgaW5zdGVhZAorICAvLy8gb2Ygb3RoZXIgcmVnaXN0ZXJzIGluIGl0cyBjbGFzcy4KKyAgdW5zaWduZWQgZ2V0Q29zdFBlclVzZSh1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiBJbmZvRGVzY1tSZWdOb10uQ29zdFBlclVzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVnaXN0ZXIgaXMgaW4gdGhlIGFsbG9jYXRpb24gb2YgYW55IHJlZ2lzdGVyIGNsYXNzLgorICBib29sIGlzSW5BbGxvY2F0YWJsZUNsYXNzKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIEluZm9EZXNjW1JlZ05vXS5pbkFsbG9jYXRhYmxlQ2xhc3M7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBodW1hbi1yZWFkYWJsZSBzeW1ib2xpYyB0YXJnZXQtc3BlY2lmaWMKKyAgLy8vIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgU3ViUmVnSW5kZXguCisgIGNvbnN0IGNoYXIgKmdldFN1YlJlZ0luZGV4TmFtZSh1bnNpZ25lZCBTdWJJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoU3ViSWR4ICYmIFN1YklkeCA8IGdldE51bVN1YlJlZ0luZGljZXMoKSAmJgorICAgICAgICAgICAiVGhpcyBpcyBub3QgYSBzdWJyZWdpc3RlciBpbmRleCIpOworICAgIHJldHVybiBTdWJSZWdJbmRleE5hbWVzW1N1YklkeC0xXTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSBiaXRtYXNrIHJlcHJlc2VudGluZyB0aGUgcGFydHMgb2YgYSByZWdpc3RlciB0aGF0IGFyZSBjb3ZlcmVkIGJ5CisgIC8vLyBTdWJJZHggXHNlZSBMYW5lQml0bWFzay4KKyAgLy8vCisgIC8vLyBTdWJJZHggPT0gMCBpcyBhbGxvd2VkLCBpdCBoYXMgdGhlIGxhbmUgbWFzayB+MHUuCisgIExhbmVCaXRtYXNrIGdldFN1YlJlZ0luZGV4TGFuZU1hc2sodW5zaWduZWQgU3ViSWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KFN1YklkeCA8IGdldE51bVN1YlJlZ0luZGljZXMoKSAmJiAiVGhpcyBpcyBub3QgYSBzdWJyZWdpc3RlciBpbmRleCIpOworICAgIHJldHVybiBTdWJSZWdJbmRleExhbmVNYXNrc1tTdWJJZHhdOworICB9CisKKyAgLy8vIFRoZSBsYW5lIG1hc2tzIHJldHVybmVkIGJ5IGdldFN1YlJlZ0luZGV4TGFuZU1hc2soKSBhYm92ZSBjYW4gb25seSBiZQorICAvLy8gdXNlZCB0byBkZXRlcm1pbmUgaWYgc3ViLXJlZ2lzdGVycyBvdmVybGFwIC0gdGhleSBjYW4ndCBiZSB1c2VkIHRvCisgIC8vLyBkZXRlcm1pbmUgaWYgYSBzZXQgb2Ygc3ViLXJlZ2lzdGVycyBjb21wbGV0ZWx5IGNvdmVyIGFub3RoZXIKKyAgLy8vIHN1Yi1yZWdpc3Rlci4KKyAgLy8vCisgIC8vLyBUaGUgWDg2IGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgaGF2ZSB0d28gbGFuZXMgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgLy8vIHN1Yl84Yml0IGFuZCBzdWJfOGJpdF9oaSBzdWItcmVnaXN0ZXJzLiBCb3RoIHN1Yl8zMmJpdCBhbmQgc3ViXzE2Yml0IGhhdmUKKyAgLy8vIGxhbmUgbWFza3MgJzMnLCBidXQgdGhlIHN1Yl8xNmJpdCBzdWItcmVnaXN0ZXIgZG9lc24ndCBmdWxseSBjb3ZlciB0aGUKKyAgLy8vIHN1Yl8zMmJpdCBzdWItcmVnaXN0ZXIuCisgIC8vLworICAvLy8gT24gdGhlIG90aGVyIGhhbmQsIHRoZSBBUk0gTkVPTiBsYW5lcyBmdWxseSBjb3ZlciB0aGVpciByZWdpc3RlcnM6IFRoZQorICAvLy8gZHN1Yl8wIHN1Yi1yZWdpc3RlciBpcyBjb21wbGV0ZWx5IGNvdmVyZWQgYnkgdGhlIHNzdWJfMCBhbmQgc3N1Yl8xIGxhbmVzLgorICAvLy8gVGhpcyBpcyByZWxhdGVkIHRvIHRoZSBDb3ZlcmVkQnlTdWJSZWdzIHByb3BlcnR5IG9uIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGJpdCBtYXNrIG9mIGxhbmVzIHRoYXQgY29tcGxldGVseSBjb3ZlciB0aGVpcgorICAvLy8gc3ViLXJlZ2lzdGVycy4gTW9yZSBwcmVjaXNlbHksIGdpdmVuOgorICAvLy8KKyAgLy8vICAgQ292ZXJpbmcgPSBnZXRDb3ZlcmluZ0xhbmVzKCk7CisgIC8vLyAgIE1hc2tBID0gZ2V0U3ViUmVnSW5kZXhMYW5lTWFzayhTdWJBKTsKKyAgLy8vICAgTWFza0IgPSBnZXRTdWJSZWdJbmRleExhbmVNYXNrKFN1YkIpOworICAvLy8KKyAgLy8vIElmIChNYXNrQSAmIH4oTWFza0IgJiBDb3ZlcmluZykpID09IDAsIHRoZW4gU3ViQSBpcyBjb21wbGV0ZWx5IGNvdmVyZWQgYnkKKyAgLy8vIFN1YkIuCisgIExhbmVCaXRtYXNrIGdldENvdmVyaW5nTGFuZXMoKSBjb25zdCB7IHJldHVybiBDb3ZlcmluZ0xhbmVzOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIHJlZ2lzdGVycyBhcmUgZXF1YWwgb3IgYWxpYXMgZWFjaCBvdGhlci4KKyAgLy8vIFRoZSByZWdpc3RlcnMgbWF5IGJlIHZpcnR1YWwgcmVnaXN0ZXJzLgorICBib29sIHJlZ3NPdmVybGFwKHVuc2lnbmVkIHJlZ0EsIHVuc2lnbmVkIHJlZ0IpIGNvbnN0IHsKKyAgICBpZiAocmVnQSA9PSByZWdCKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoaXNWaXJ0dWFsUmVnaXN0ZXIocmVnQSkgfHwgaXNWaXJ0dWFsUmVnaXN0ZXIocmVnQikpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBSZWd1bml0cyBhcmUgbnVtZXJpY2FsbHkgb3JkZXJlZC4gRmluZCBhIGNvbW1vbiB1bml0LgorICAgIE1DUmVnVW5pdEl0ZXJhdG9yIFJVQShyZWdBLCB0aGlzKTsKKyAgICBNQ1JlZ1VuaXRJdGVyYXRvciBSVUIocmVnQiwgdGhpcyk7CisgICAgZG8geworICAgICAgaWYgKCpSVUEgPT0gKlJVQikgcmV0dXJuIHRydWU7CisgICAgICBpZiAoKlJVQSA8ICpSVUIpICsrUlVBOworICAgICAgZWxzZSAgICAgICAgICAgICArK1JVQjsKKyAgICB9IHdoaWxlIChSVUEuaXNWYWxpZCgpICYmIFJVQi5pc1ZhbGlkKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgUmVnIGNvbnRhaW5zIFJlZ1VuaXQuCisgIGJvb2wgaGFzUmVnVW5pdCh1bnNpZ25lZCBSZWcsIHVuc2lnbmVkIFJlZ1VuaXQpIGNvbnN0IHsKKyAgICBmb3IgKE1DUmVnVW5pdEl0ZXJhdG9yIFVuaXRzKFJlZywgdGhpcyk7IFVuaXRzLmlzVmFsaWQoKTsgKytVbml0cykKKyAgICAgIGlmICgqVW5pdHMgPT0gUmVnVW5pdCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG9yaWdpbmFsIFNyY1JlZyB1bmxlc3MgaXQgaXMgdGhlIHRhcmdldCBvZiBhIGNvcHktbGlrZQorICAvLy8gb3BlcmF0aW9uLCBpbiB3aGljaCBjYXNlIHdlIGNoYWluIGJhY2t3YXJkcyB0aHJvdWdoIGFsbCBzdWNoIG9wZXJhdGlvbnMKKyAgLy8vIHRvIHRoZSB1bHRpbWF0ZSBzb3VyY2UgcmVnaXN0ZXIuICBJZiBhIHBoeXNpY2FsIHJlZ2lzdGVyIGlzIGVuY291bnRlcmVkLAorICAvLy8gd2Ugc3RvcCB0aGUgc2VhcmNoLgorICB2aXJ0dWFsIHVuc2lnbmVkIGxvb2tUaHJ1Q29weUxpa2UodW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgbnVsbC10ZXJtaW5hdGVkIGxpc3Qgb2YgYWxsIG9mIHRoZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzIG9uCisgIC8vLyB0aGlzIHRhcmdldC4gVGhlIHJlZ2lzdGVyIHNob3VsZCBiZSBpbiB0aGUgb3JkZXIgb2YgZGVzaXJlZCBjYWxsZWUtc2F2ZQorICAvLy8gc3RhY2sgZnJhbWUgb2Zmc2V0LiBUaGUgZmlyc3QgcmVnaXN0ZXIgaXMgY2xvc2VzdCB0byB0aGUgaW5jb21pbmcgc3RhY2sKKyAgLy8vIHBvaW50ZXIgaWYgc3RhY2sgZ3Jvd3MgZG93biwgYW5kIHZpY2UgdmVyc2EuCisgIC8vLyBOb3RpY2U6IFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgZGlzYWJsZWQgQ1NScy4KKyAgLy8vICAgICAgICAgSW4gbW9zdCBjYXNlcyB5b3Ugd2lsbCB3YW50IHRvIHVzZSBpbnN0ZWFkIHRoZSBmdW5jdGlvbiAKKyAgLy8vICAgICAgICAgZ2V0Q2FsbGVlU2F2ZWRSZWdzIHRoYXQgaXMgaW1wbGVtZW50ZWQgaW4gTWFjaGluZVJlZ2lzdGVySW5mby4KKyAgdmlydHVhbCBjb25zdCBNQ1BoeXNSZWcqCisgIGdldENhbGxlZVNhdmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GKSBjb25zdCA9IDA7CisKKyAgLy8vIFJldHVybiBhIG1hc2sgb2YgY2FsbC1wcmVzZXJ2ZWQgcmVnaXN0ZXJzIGZvciB0aGUgZ2l2ZW4gY2FsbGluZyBjb252ZW50aW9uCisgIC8vLyBvbiB0aGUgY3VycmVudCBmdW5jdGlvbi4gVGhlIG1hc2sgc2hvdWxkIGluY2x1ZGUgYWxsIGNhbGwtcHJlc2VydmVkCisgIC8vLyBhbGlhc2VzLiBUaGlzIGlzIHVzZWQgYnkgdGhlIHJlZ2lzdGVyIGFsbG9jYXRvciB0byBkZXRlcm1pbmUgd2hpY2gKKyAgLy8vIHJlZ2lzdGVycyBjYW4gYmUgbGl2ZSBhY3Jvc3MgYSBjYWxsLgorICAvLy8KKyAgLy8vIFRoZSBtYXNrIGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgKFRSSTo6Z2V0TnVtUmVncygpKzMxKS8zMiBlbnRyaWVzLgorICAvLy8gQSBzZXQgYml0IGluZGljYXRlcyB0aGF0IGFsbCBiaXRzIG9mIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lzdGVyIGFyZQorICAvLy8gcHJlc2VydmVkIGFjcm9zcyB0aGUgZnVuY3Rpb24gY2FsbC4gIFRoZSBiaXQgbWFzayBpcyBleHBlY3RlZCB0byBiZQorICAvLy8gc3ViLXJlZ2lzdGVyIGNvbXBsZXRlLCBpLmUuIGlmIEEgaXMgcHJlc2VydmVkLCBzbyBhcmUgYWxsIGl0cworICAvLy8gc3ViLXJlZ2lzdGVycy4KKyAgLy8vCisgIC8vLyBCaXRzIGFyZSBudW1iZXJlZCBmcm9tIHRoZSBMU0IsIHNvIHRoZSBiaXQgZm9yIHBoeXNpY2FsIHJlZ2lzdGVyIFJlZyBjYW4KKyAgLy8vIGJlIGZvdW5kIGFzIChNYXNrW1JlZyAvIDMyXSA+PiBSZWcgJSAzMikgJiAxLgorICAvLy8KKyAgLy8vIEEgTlVMTCBwb2ludGVyIG1lYW5zIHRoYXQgbm8gcmVnaXN0ZXIgbWFzayB3aWxsIGJlIHVzZWQsIGFuZCBjYWxsCisgIC8vLyBpbnN0cnVjdGlvbnMgc2hvdWxkIHVzZSBpbXBsaWNpdC1kZWYgb3BlcmFuZHMgdG8gaW5kaWNhdGUgY2FsbCBjbG9iYmVyZWQKKyAgLy8vIHJlZ2lzdGVycy4KKyAgLy8vCisgIHZpcnR1YWwgY29uc3QgdWludDMyX3QgKmdldENhbGxQcmVzZXJ2ZWRNYXNrKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpJRCkgY29uc3QgeworICAgIC8vIFRoZSBkZWZhdWx0IG1hc2sgY2xvYmJlcnMgZXZlcnl0aGluZy4gIEFsbCB0YXJnZXRzIHNob3VsZCBvdmVycmlkZS4KKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSByZWdpc3RlciBtYXNrIHRoYXQgY2xvYmJlcnMgZXZlcnl0aGluZy4KKyAgdmlydHVhbCBjb25zdCB1aW50MzJfdCAqZ2V0Tm9QcmVzZXJ2ZWRNYXNrKCkgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoInRhcmdldCBkb2VzIG5vdCBwcm92aWRlIG5vIHByZXNlcnZlZCBtYXNrIik7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYWxsIGJpdHMgdGhhdCBhcmUgc2V0IGluIG1hc2sgXHAgbWFzazAgYXJlIGFsc28gc2V0IGluCisgIC8vLyBccCBtYXNrMS4KKyAgYm9vbCByZWdtYXNrU3Vic2V0RXF1YWwoY29uc3QgdWludDMyX3QgKm1hc2swLCBjb25zdCB1aW50MzJfdCAqbWFzazEpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYWxsIHRoZSBjYWxsLXByZXNlcnZlZCByZWdpc3RlciBtYXNrcyBkZWZpbmVkIGZvciB0aGlzIHRhcmdldC4KKyAgdmlydHVhbCBBcnJheVJlZjxjb25zdCB1aW50MzJfdCAqPiBnZXRSZWdNYXNrcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBBcnJheVJlZjxjb25zdCBjaGFyICo+IGdldFJlZ01hc2tOYW1lcygpIGNvbnN0ID0gMDsKKworICAvLy8gUmV0dXJucyBhIGJpdHNldCBpbmRleGVkIGJ5IHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlciBpbmRpY2F0aW5nIGlmIGEKKyAgLy8vIHJlZ2lzdGVyIGlzIGEgc3BlY2lhbCByZWdpc3RlciB0aGF0IGhhcyBwYXJ0aWN1bGFyIHVzZXMgYW5kIHNob3VsZCBiZQorICAvLy8gY29uc2lkZXJlZCB1bmF2YWlsYWJsZSBhdCBhbGwgdGltZXMsIGUuZy4gc3RhY2sgcG9pbnRlciwgcmV0dXJuIGFkZHJlc3MuCisgIC8vLyBBIHJlc2VydmVkIHJlZ2lzdGVyOgorICAvLy8gLSBpcyBub3QgYWxsb2NhdGFibGUKKyAgLy8vIC0gaXMgY29uc2lkZXJlZCBhbHdheXMgbGl2ZQorICAvLy8gLSBpcyBpZ25vcmVkIGJ5IGxpdmVuZXNzIHRyYWNraW5nCisgIC8vLyBJdCBpcyBvZnRlbiBuZWNlc3NhcnkgdG8gcmVzZXJ2ZSB0aGUgc3VwZXIgcmVnaXN0ZXJzIG9mIGEgcmVzZXJ2ZWQKKyAgLy8vIHJlZ2lzdGVyIGFzIHdlbGwsIHRvIGF2b2lkIHRoZW0gZ2V0dGluZyBhbGxvY2F0ZWQgaW5kaXJlY3RseS4gWW91IG1heSB1c2UKKyAgLy8vIG1hcmtTdXBlclJlZ3MoKSBhbmQgY2hlY2tBbGxTdXBlclJlZ3NNYXJrZWQoKSBpbiB0aGlzIGNhc2UuCisgIHZpcnR1YWwgQml0VmVjdG9yIGdldFJlc2VydmVkUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCA9IDA7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBQaHlzUmVnIGlzIHVuYWxsb2NhdGFibGUgYW5kIGNvbnN0YW50IHRocm91Z2hvdXQgdGhlCisgIC8vLyBmdW5jdGlvbi4gIFVzZWQgYnkgTWFjaGluZVJlZ2lzdGVySW5mbzo6aXNDb25zdGFudFBoeXNSZWcoKS4KKyAgdmlydHVhbCBib29sIGlzQ29uc3RhbnRQaHlzUmVnKHVuc2lnbmVkIFBoeXNSZWcpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFBoeXNpY2FsIHJlZ2lzdGVycyB0aGF0IG1heSBiZSBtb2RpZmllZCB3aXRoaW4gYSBmdW5jdGlvbiBidXQgYXJlCisgIC8vLyBndWFyYW50ZWVkIHRvIGJlIHJlc3RvcmVkIGJlZm9yZSBhbnkgdXNlcy4gVGhpcyBpcyB1c2VmdWwgZm9yIHRhcmdldHMgdGhhdAorICAvLy8gaGF2ZSBjYWxsIHNlcXVlbmNlcyB3aGVyZSBhIEdPVCByZWdpc3RlciBtYXkgYmUgdXBkYXRlZCBieSB0aGUgY2FsbGVyCisgIC8vLyBwcmlvciB0byBhIGNhbGwgYW5kIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmVzdG9yZWQgKGFsc28gYnkgdGhlIGNhbGxlcikKKyAgLy8vIGFmdGVyIHRoZSBjYWxsLiAKKyAgdmlydHVhbCBib29sIGlzQ2FsbGVyUHJlc2VydmVkUGh5c1JlZyh1bnNpZ25lZCBQaHlzUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUHJpb3IgdG8gYWRkaW5nIHRoZSBsaXZlLW91dCBtYXNrIHRvIGEgc3RhY2ttYXAgb3IgcGF0Y2hwb2ludAorICAvLy8gaW5zdHJ1Y3Rpb24sIHByb3ZpZGUgdGhlIHRhcmdldCB0aGUgb3Bwb3J0dW5pdHkgdG8gYWRqdXN0IGl0IChtYWlubHkgdG8KKyAgLy8vIHJlbW92ZSBwc2V1ZG8tcmVnaXN0ZXJzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQpLgorICB2aXJ0dWFsIHZvaWQgYWRqdXN0U3RhY2tNYXBMaXZlT3V0TWFzayh1aW50MzJfdCAqTWFzaykgY29uc3Qge30KKworICAvLy8gUmV0dXJuIGEgc3VwZXItcmVnaXN0ZXIgb2YgdGhlIHNwZWNpZmllZCByZWdpc3RlcgorICAvLy8gUmVnIHNvIGl0cyBzdWItcmVnaXN0ZXIgb2YgaW5kZXggU3ViSWR4IGlzIFJlZy4KKyAgdW5zaWduZWQgZ2V0TWF0Y2hpbmdTdXBlclJlZyh1bnNpZ25lZCBSZWcsIHVuc2lnbmVkIFN1YklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgY29uc3QgeworICAgIHJldHVybiBNQ1JlZ2lzdGVySW5mbzo6Z2V0TWF0Y2hpbmdTdXBlclJlZyhSZWcsIFN1YklkeCwgUkMtPk1DKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSBzdWJjbGFzcyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyCisgIC8vLyBjbGFzcyBBIHNvIHRoYXQgZWFjaCByZWdpc3RlciBpbiBpdCBoYXMgYSBzdWItcmVnaXN0ZXIgb2YgdGhlCisgIC8vLyBzcGVjaWZpZWQgc3ViLXJlZ2lzdGVyIGluZGV4IHdoaWNoIGlzIGluIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgY2xhc3MgQi4KKyAgLy8vCisgIC8vLyBUYWJsZUdlbiB3aWxsIHN5bnRoZXNpemUgbWlzc2luZyBBIHN1Yi1jbGFzc2VzLgorICB2aXJ0dWFsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKgorICBnZXRNYXRjaGluZ1N1cGVyUmVnQ2xhc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKkIsIHVuc2lnbmVkIElkeCkgY29uc3Q7CisKKyAgLy8gRm9yIGEgY29weS1saWtlIGluc3RydWN0aW9uIHRoYXQgZGVmaW5lcyBhIHJlZ2lzdGVyIG9mIGNsYXNzIERlZlJDIHdpdGgKKyAgLy8gc3VicmVnIGluZGV4IERlZlN1YlJlZywgcmVhZGluZyBmcm9tIGFub3RoZXIgc291cmNlIHdpdGggY2xhc3MgU3JjUkMgYW5kCisgIC8vIHN1YnJlZ2lzdGVyIFNyY1N1YlJlZyByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgcHJlZmVyYWJsZSBjb3B5CisgIC8vIGluc3RydWN0aW9uIG9yIGFuIGVhcmxpZXIgdXNlIHNob3VsZCBiZSB1c2VkLgorICB2aXJ0dWFsIGJvb2wgc2hvdWxkUmV3cml0ZUNvcHlTcmMoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqRGVmUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZWZTdWJSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpTcmNSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY1N1YlJlZykgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIGxhcmdlc3QgbGVnYWwgc3ViLWNsYXNzIG9mIFJDIHRoYXQKKyAgLy8vIHN1cHBvcnRzIHRoZSBzdWItcmVnaXN0ZXIgaW5kZXggSWR4LgorICAvLy8gSWYgbm8gc3VjaCBzdWItY2xhc3MgZXhpc3RzLCByZXR1cm4gTlVMTC4KKyAgLy8vIElmIGFsbCByZWdpc3RlcnMgaW4gUkMgYWxyZWFkeSBoYXZlIGFuIElkeCBzdWItcmVnaXN0ZXIsIHJldHVybiBSQy4KKyAgLy8vCisgIC8vLyBUYWJsZUdlbiBnZW5lcmF0ZXMgYSB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gdGhhdCBpcyBnb29kIGVub3VnaCBpbiBtb3N0CisgIC8vLyBjYXNlcy4gIFRhcmdldHMgY2FuIG92ZXJyaWRlIGlmIHRoZXkgaGF2ZSBjb25zdHJhaW50cyB0aGF0IFRhYmxlR2VuCisgIC8vLyBkb2Vzbid0IHVuZGVyc3RhbmQuICBGb3IgZXhhbXBsZSwgdGhlIHg4NiBzdWJfOGJpdCBzdWItcmVnaXN0ZXIgaW5kZXggaXMKKyAgLy8vIHN1cHBvcnRlZCBieSB0aGUgZnVsbCBHUjMyIHJlZ2lzdGVyIGNsYXNzIGluIDY0LWJpdCBtb2RlLCBidXQgb25seSBieSB0aGUKKyAgLy8vIEdSMzJfQUJDRCByZWdpaXN0ZXIgY2xhc3MgaW4gMzItYml0IG1vZGUuCisgIC8vLworICAvLy8gVGFibGVHZW4gd2lsbCBzeW50aGVzaXplIG1pc3NpbmcgUkMgc3ViLWNsYXNzZXMuCisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqCisgIGdldFN1YkNsYXNzV2l0aFN1YlJlZyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywgdW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KElkeCA9PSAwICYmICJUYXJnZXQgaGFzIG5vIHN1Yi1yZWdpc3RlcnMiKTsKKyAgICByZXR1cm4gUkM7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBzdWJyZWdpc3RlciBpbmRleCB5b3UgZ2V0IGZyb20gY29tcG9zaW5nCisgIC8vLyB0d28gc3VicmVnaXN0ZXIgaW5kaWNlcy4KKyAgLy8vCisgIC8vLyBUaGUgc3BlY2lhbCBudWxsIHN1Yi1yZWdpc3RlciBpbmRleCBjb21wb3NlcyBhcyB0aGUgaWRlbnRpdHkuCisgIC8vLworICAvLy8gSWYgUjphOmIgaXMgdGhlIHNhbWUgcmVnaXN0ZXIgYXMgUjpjLCB0aGVuIGNvbXBvc2VTdWJSZWdJbmRpY2VzKGEsIGIpCisgIC8vLyByZXR1cm5zIGMuIE5vdGUgdGhhdCBjb21wb3NlU3ViUmVnSW5kaWNlcyBkb2VzIG5vdCB0ZWxsIHlvdSBhYm91dCBpbGxlZ2FsCisgIC8vLyBjb21wb3NpdGlvbnMuIElmIFIgZG9lcyBub3QgaGF2ZSBhIHN1YnJlZyBhLCBvciBSOmEgZG9lcyBub3QgaGF2ZSBhIHN1YnJlZworICAvLy8gYiwgY29tcG9zZVN1YlJlZ0luZGljZXMgZG9lc24ndCB0ZWxsIHlvdS4KKyAgLy8vCisgIC8vLyBUaGUgQVJNIHJlZ2lzdGVyIFEwIGhhcyB0d28gRCBzdWJyZWdzIGRzdWJfMDpEMCBhbmQgZHN1Yl8xOkQxLiBJdCBhbHNvIGhhcworICAvLy8gc3N1Yl8wOlMwIC0gc3N1Yl8zOlMzIHN1YnJlZ3MuCisgIC8vLyBJZiB5b3UgY29tcG9zZSBzdWJyZWcgaW5kaWNlcyBkc3ViXzEsIHNzdWJfMCB5b3UgZ2V0IHNzdWJfMi4KKyAgdW5zaWduZWQgY29tcG9zZVN1YlJlZ0luZGljZXModW5zaWduZWQgYSwgdW5zaWduZWQgYikgY29uc3QgeworICAgIGlmICghYSkgcmV0dXJuIGI7CisgICAgaWYgKCFiKSByZXR1cm4gYTsKKyAgICByZXR1cm4gY29tcG9zZVN1YlJlZ0luZGljZXNJbXBsKGEsIGIpOworICB9CisKKyAgLy8vIFRyYW5zZm9ybXMgYSBMYW5lTWFzayBjb21wdXRlZCBmb3Igb25lIHN1YnJlZ2lzdGVyIHRvIHRoZSBsYW5lbWFzayB0aGF0CisgIC8vLyB3b3VsZCBoYXZlIGJlZW4gY29tcHV0ZWQgd2hlbiBjb21wb3NpbmcgdGhlIHN1YnN1YnJlZ2lzdGVycyB3aXRoIElkeEEKKyAgLy8vIGZpcnN0LiBAc2EgY29tcG9zZVN1YlJlZ0luZGljZXMoKQorICBMYW5lQml0bWFzayBjb21wb3NlU3ViUmVnSW5kZXhMYW5lTWFzayh1bnNpZ25lZCBJZHhBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYW5lQml0bWFzayBNYXNrKSBjb25zdCB7CisgICAgaWYgKCFJZHhBKQorICAgICAgcmV0dXJuIE1hc2s7CisgICAgcmV0dXJuIGNvbXBvc2VTdWJSZWdJbmRleExhbmVNYXNrSW1wbChJZHhBLCBNYXNrKTsKKyAgfQorCisgIC8vLyBUcmFuc2Zvcm0gYSBsYW5lbWFzayBnaXZlbiBmb3IgYSB2aXJ0dWFsIHJlZ2lzdGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nCisgIC8vLyBsYW5lbWFzayBiZWZvcmUgdXNpbmcgc3VicmVnaXN0ZXIgd2l0aCBpbmRleCBccCBJZHhBLgorICAvLy8gVGhpcyBpcyB0aGUgcmV2ZXJzZSBvZiBjb21wb3NlU3ViUmVnSW5kZXhMYW5lTWFzaygpLCBhc3N1bWluZyBNYXNrIGlzIGEKKyAgLy8vIHZhbGllIGxhbmUgbWFzayAobm8gaW52YWxpZCBiaXRzIHNldCkgdGhlIGZvbGxvd2luZyBob2xkczoKKyAgLy8vIFgwID0gY29tcG9zZVN1YlJlZ0luZGV4TGFuZU1hc2soSWR4LCBNYXNrKQorICAvLy8gWDEgPSByZXZlcnNlQ29tcG9zZVN1YlJlZ0luZGV4TGFuZU1hc2soSWR4LCBYMCkKKyAgLy8vID0+IFgxID09IE1hc2sKKyAgTGFuZUJpdG1hc2sgcmV2ZXJzZUNvbXBvc2VTdWJSZWdJbmRleExhbmVNYXNrKHVuc2lnbmVkIElkeEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYW5lQml0bWFzayBMYW5lTWFzaykgY29uc3QgeworICAgIGlmICghSWR4QSkKKyAgICAgIHJldHVybiBMYW5lTWFzazsKKyAgICByZXR1cm4gcmV2ZXJzZUNvbXBvc2VTdWJSZWdJbmRleExhbmVNYXNrSW1wbChJZHhBLCBMYW5lTWFzayk7CisgIH0KKworICAvLy8gRGVidWdnaW5nIGhlbHBlcjogZHVtcCByZWdpc3RlciBpbiBodW1hbiByZWFkYWJsZSBmb3JtIHRvIGRiZ3MoKSBzdHJlYW0uCisgIHN0YXRpYyB2b2lkIGR1bXBSZWcodW5zaWduZWQgUmVnLCB1bnNpZ25lZCBTdWJSZWdJbmRleCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvKiBUUkkgPSBudWxscHRyKTsKKworcHJvdGVjdGVkOgorICAvLy8gT3ZlcnJpZGRlbiBieSBUYWJsZUdlbiBpbiB0YXJnZXRzIHRoYXQgaGF2ZSBzdWItcmVnaXN0ZXJzLgorICB2aXJ0dWFsIHVuc2lnbmVkIGNvbXBvc2VTdWJSZWdJbmRpY2VzSW1wbCh1bnNpZ25lZCwgdW5zaWduZWQpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUYXJnZXQgaGFzIG5vIHN1Yi1yZWdpc3RlcnMiKTsKKyAgfQorCisgIC8vLyBPdmVycmlkZGVuIGJ5IFRhYmxlR2VuIGluIHRhcmdldHMgdGhhdCBoYXZlIHN1Yi1yZWdpc3RlcnMuCisgIHZpcnR1YWwgTGFuZUJpdG1hc2sKKyAgY29tcG9zZVN1YlJlZ0luZGV4TGFuZU1hc2tJbXBsKHVuc2lnbmVkLCBMYW5lQml0bWFzaykgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlRhcmdldCBoYXMgbm8gc3ViLXJlZ2lzdGVycyIpOworICB9CisKKyAgdmlydHVhbCBMYW5lQml0bWFzayByZXZlcnNlQ29tcG9zZVN1YlJlZ0luZGV4TGFuZU1hc2tJbXBsKHVuc2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFuZUJpdG1hc2spIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUYXJnZXQgaGFzIG5vIHN1Yi1yZWdpc3RlcnMiKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBGaW5kIGEgY29tbW9uIHN1cGVyLXJlZ2lzdGVyIGNsYXNzIGlmIGl0IGV4aXN0cy4KKyAgLy8vCisgIC8vLyBGaW5kIGEgcmVnaXN0ZXIgY2xhc3MsIFN1cGVyUkMgYW5kIHR3byBzdWItcmVnaXN0ZXIgaW5kaWNlcywgUHJlQSBhbmQKKyAgLy8vIFByZUIsIHN1Y2ggdGhhdDoKKyAgLy8vCisgIC8vLyAgIDEuIFByZUEgKyBTdWJBID09IFByZUIgKyBTdWJCICAodXNpbmcgY29tcG9zZVN1YlJlZ0luZGljZXMoKSksIGFuZAorICAvLy8KKyAgLy8vICAgMi4gRm9yIGFsbCBSZWcgaW4gU3VwZXJSQzogUmVnOlByZUEgaW4gUkNBIGFuZCBSZWc6UHJlQiBpbiBSQ0IsIGFuZAorICAvLy8KKyAgLy8vICAgMy4gU3VwZXJSQy0+Z2V0U2l6ZSgpID49IG1heChSQ0EtPmdldFNpemUoKSwgUkNCLT5nZXRTaXplKCkpLgorICAvLy8KKyAgLy8vIFN1cGVyUkMgd2lsbCBiZSBjaG9zZW4gc3VjaCB0aGF0IG5vIHN1cGVyLWNsYXNzIG9mIFN1cGVyUkMgc2F0aXNmaWVzIHRoZQorICAvLy8gcmVxdWlyZW1lbnRzLCBhbmQgdGhlcmUgaXMgbm8gcmVnaXN0ZXIgY2xhc3Mgd2l0aCBhIHNtYWxsZXIgc3BpbGwgc2l6ZQorICAvLy8gdGhhdCBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cy4KKyAgLy8vCisgIC8vLyBTdWJBIGFuZCBTdWJCIG11c3Qgbm90IGJlIDAuIFVzZSBnZXRNYXRjaGluZ1N1cGVyUmVnQ2xhc3MoKSBpbnN0ZWFkLgorICAvLy8KKyAgLy8vIEVpdGhlciBvZiB0aGUgUHJlQSBhbmQgUHJlQiBzdWItcmVnaXN0ZXIgaW5kaWNlcyBtYXkgYmUgcmV0dXJuZWQgYXMgMC4gSW4KKyAgLy8vIHRoYXQgY2FzZSwgdGhlIHJldHVybmVkIHJlZ2lzdGVyIGNsYXNzIHdpbGwgYmUgYSBzdWItY2xhc3Mgb2YgdGhlCisgIC8vLyBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IHJlZ2lzdGVyIGNsYXNzLgorICAvLy8KKyAgLy8vIFRoZSBmdW5jdGlvbiByZXR1cm5zIE5VTEwgaWYgbm8gcmVnaXN0ZXIgY2xhc3MgY2FuIGJlIGZvdW5kLgorICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKgorICBnZXRDb21tb25TdXBlclJlZ0NsYXNzKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDQSwgdW5zaWduZWQgU3ViQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQ0IsIHVuc2lnbmVkIFN1YkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlByZUEsIHVuc2lnbmVkICZQcmVCKSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUmVnaXN0ZXIgQ2xhc3MgSW5mb3JtYXRpb24KKyAgLy8KK3Byb3RlY3RlZDoKKyAgY29uc3QgUmVnQ2xhc3NJbmZvICZnZXRSZWdDbGFzc0luZm8oY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAmUkMpIGNvbnN0IHsKKyAgICByZXR1cm4gUkNJbmZvc1tnZXROdW1SZWdDbGFzc2VzKCkgKiBId01vZGUgKyBSQy5nZXRJRCgpXTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBSZWdpc3RlciBjbGFzcyBpdGVyYXRvcnMKKyAgcmVnY2xhc3NfaXRlcmF0b3IgcmVnY2xhc3NfYmVnaW4oKSBjb25zdCB7IHJldHVybiBSZWdDbGFzc0JlZ2luOyB9CisgIHJlZ2NsYXNzX2l0ZXJhdG9yIHJlZ2NsYXNzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIFJlZ0NsYXNzRW5kOyB9CisgIGl0ZXJhdG9yX3JhbmdlPHJlZ2NsYXNzX2l0ZXJhdG9yPiByZWdjbGFzc2VzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHJlZ2NsYXNzX2JlZ2luKCksIHJlZ2NsYXNzX2VuZCgpKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bVJlZ0NsYXNzZXMoKSBjb25zdCB7CisgICAgcmV0dXJuICh1bnNpZ25lZCkocmVnY2xhc3NfZW5kKCktcmVnY2xhc3NfYmVnaW4oKSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgcmVnaXN0ZXIgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnVtZXJhdGlvbiB2YWx1ZS4KKyAgLy8vIFNlZSBjbGFzcyBNQ09wZXJhbmRJbmZvLgorICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpnZXRSZWdDbGFzcyh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBnZXROdW1SZWdDbGFzc2VzKCkgJiYgIlJlZ2lzdGVyIENsYXNzIElEIG91dCBvZiByYW5nZSIpOworICAgIHJldHVybiBSZWdDbGFzc0JlZ2luW2ldOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHJlZ2lzdGVyIGNsYXNzLgorICBjb25zdCBjaGFyICpnZXRSZWdDbGFzc05hbWUoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqQ2xhc3MpIGNvbnN0IHsKKyAgICByZXR1cm4gTUNSZWdpc3RlckluZm86OmdldFJlZ0NsYXNzTmFtZShDbGFzcy0+TUMpOworICB9CisKKyAgLy8vIEZpbmQgdGhlIGxhcmdlc3QgY29tbW9uIHN1YmNsYXNzIG9mIEEgYW5kIEIuCisgIC8vLyBSZXR1cm4gTlVMTCBpZiB0aGVyZSBpcyBubyBjb21tb24gc3ViY2xhc3MuCisgIC8vLyBUaGUgY29tbW9uIHN1YmNsYXNzIHNob3VsZCBjb250YWluCisgIC8vLyBzaW1wbGUgdmFsdWUgdHlwZSBTVlQgaWYgaXQgaXMgbm90IHRoZSBBbnkgdHlwZS4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqCisgIGdldENvbW1vblN1YkNsYXNzKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKkEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKkIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1WVDo6U2ltcGxlVmFsdWVUeXBlIFNWVCA9CisgICAgICAgICAgICAgICAgICAgIE1WVDo6U2ltcGxlVmFsdWVUeXBlOjpBbnkpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIGEgVGFyZ2V0UmVnaXN0ZXJDbGFzcyB1c2VkIGZvciBwb2ludGVyIHZhbHVlcy4KKyAgLy8vIElmIGEgdGFyZ2V0IHN1cHBvcnRzIG11bHRpcGxlIGRpZmZlcmVudCBwb2ludGVyIHJlZ2lzdGVyIGNsYXNzZXMsCisgIC8vLyBraW5kIHNwZWNpZmllcyB3aGljaCBvbmUgaXMgaW5kaWNhdGVkLgorICB2aXJ0dWFsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKgorICBnZXRQb2ludGVyUmVnQ2xhc3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRiwgdW5zaWduZWQgS2luZD0wKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVGFyZ2V0IGRpZG4ndCBpbXBsZW1lbnQgZ2V0UG9pbnRlclJlZ0NsYXNzISIpOworICB9CisKKyAgLy8vIFJldHVybnMgYSBsZWdhbCByZWdpc3RlciBjbGFzcyB0byBjb3B5IGEgcmVnaXN0ZXIgaW4gdGhlIHNwZWNpZmllZCBjbGFzcworICAvLy8gdG8gb3IgZnJvbS4gSWYgaXQgaXMgcG9zc2libGUgdG8gY29weSB0aGUgcmVnaXN0ZXIgZGlyZWN0bHkgd2l0aG91dCB1c2luZworICAvLy8gYSBjcm9zcyByZWdpc3RlciBjbGFzcyBjb3B5LCByZXR1cm4gdGhlIHNwZWNpZmllZCBSQy4gUmV0dXJucyBOVUxMIGlmIGl0CisgIC8vLyBpcyBub3QgcG9zc2libGUgdG8gY29weSBiZXR3ZWVuIHR3byByZWdpc3RlcnMgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICoKKyAgZ2V0Q3Jvc3NDb3B5UmVnQ2xhc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpIGNvbnN0IHsKKyAgICByZXR1cm4gUkM7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbGFyZ2VzdCBzdXBlciBjbGFzcyBvZiBSQyB0aGF0IGlzIGxlZ2FsIHRvIHVzZSBpbiB0aGUgY3VycmVudAorICAvLy8gc3ViLXRhcmdldCBhbmQgaGFzIHRoZSBzYW1lIHNwaWxsIHNpemUuCisgIC8vLyBUaGUgcmV0dXJuZWQgcmVnaXN0ZXIgY2xhc3MgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHZpcnR1YWwgcmVnaXN0ZXJzIHdoaWNoCisgIC8vLyBtZWFucyB0aGF0IGFsbCBpdHMgcmVnaXN0ZXJzIGNhbiBiZSBjb3BpZWQgYW5kIHNwaWxsZWQuCisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqCisgIGdldExhcmdlc3RMZWdhbFN1cGVyQ2xhc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICYpIGNvbnN0IHsKKyAgICAvLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgdmVyeSBjb25zZXJ2YXRpdmUgYW5kIGRvZXNuJ3QgYWxsb3cgdGhlCisgICAgLy8vIHJlZ2lzdGVyIGFsbG9jYXRvciB0byBpbmZsYXRlIHJlZ2lzdGVyIGNsYXNzZXMuCisgICAgcmV0dXJuIFJDOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgcmVnaXN0ZXIgcHJlc3N1cmUgImhpZ2ggd2F0ZXIgbWFyayIgZm9yIHRoZSBzcGVjaWZpYyByZWdpc3RlcgorICAvLy8gY2xhc3MuIFRoZSBzY2hlZHVsZXIgaXMgaW4gaGlnaCByZWdpc3RlciBwcmVzc3VyZSBtb2RlIChmb3IgdGhlIHNwZWNpZmljCisgIC8vLyByZWdpc3RlciBjbGFzcykgaWYgaXQgZ29lcyBvdmVyIHRoZSBsaW1pdC4KKyAgLy8vCisgIC8vLyBOb3RlOiB0aGlzIGlzIHRoZSBvbGQgcmVnaXN0ZXIgcHJlc3N1cmUgbW9kZWwgdGhhdCByZWxpZXMgb24gYSBtYW51YWxseQorICAvLy8gc3BlY2lmaWVkIHJlcHJlc2VudGF0aXZlIHJlZ2lzdGVyIGNsYXNzIHBlciB2YWx1ZSB0eXBlLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldFJlZ1ByZXNzdXJlTGltaXQoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gUmV0dXJuIGEgaGV1cmlzdGljIGZvciB0aGUgbWFjaGluZSBzY2hlZHVsZXIgdG8gY29tcGFyZSB0aGUgcHJvZml0YWJpbGl0eQorICAvLy8gb2YgaW5jcmVhc2luZyBvbmUgcmVnaXN0ZXIgcHJlc3N1cmUgc2V0IHZlcnN1cyBhbm90aGVyLiAgVGhlIHNjaGVkdWxlcgorICAvLy8gd2lsbCBwcmVmZXIgaW5jcmVhc2luZyB0aGUgcmVnaXN0ZXIgcHJlc3N1cmUgb2YgdGhlIHNldCB3aGljaCByZXR1cm5zCisgIC8vLyB0aGUgbGFyZ2VzdCB2YWx1ZSBmb3IgdGhpcyBmdW5jdGlvbi4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRSZWdQcmVzc3VyZVNldFNjb3JlKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQU2V0SUQpIGNvbnN0IHsKKyAgICByZXR1cm4gUFNldElEOworICB9CisKKyAgLy8vIEdldCB0aGUgd2VpZ2h0IGluIHVuaXRzIG9mIHByZXNzdXJlIGZvciB0aGlzIHJlZ2lzdGVyIGNsYXNzLgorICB2aXJ0dWFsIGNvbnN0IFJlZ0NsYXNzV2VpZ2h0ICZnZXRSZWdDbGFzc1dlaWdodCgKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgY29uc3QgPSAwOworCisgIC8vLyBSZXR1cm5zIHNpemUgaW4gYml0cyBvZiBhIHBoeXMvdmlydHVhbC9nZW5lcmljIHJlZ2lzdGVyLgorICB1bnNpZ25lZCBnZXRSZWdTaXplSW5CaXRzKHVuc2lnbmVkIFJlZywgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSB3ZWlnaHQgaW4gdW5pdHMgb2YgcHJlc3N1cmUgZm9yIHRoaXMgcmVnaXN0ZXIgdW5pdC4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRSZWdVbml0V2VpZ2h0KHVuc2lnbmVkIFJlZ1VuaXQpIGNvbnN0ID0gMDsKKworICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBvZiByZWdpc3RlciBwcmVzc3VyZS4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXROdW1SZWdQcmVzc3VyZVNldHMoKSBjb25zdCA9IDA7CisKKyAgLy8vIEdldCB0aGUgbmFtZSBvZiB0aGlzIHJlZ2lzdGVyIHVuaXQgcHJlc3N1cmUgc2V0LgorICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFJlZ1ByZXNzdXJlU2V0TmFtZSh1bnNpZ25lZCBJZHgpIGNvbnN0ID0gMDsKKworICAvLy8gR2V0IHRoZSByZWdpc3RlciB1bml0IHByZXNzdXJlIGxpbWl0IGZvciB0aGlzIGRpbWVuc2lvbi4KKyAgLy8vIFRoaXMgbGltaXQgbXVzdCBiZSBhZGp1c3RlZCBkeW5hbWljYWxseSBmb3IgcmVzZXJ2ZWQgcmVnaXN0ZXJzLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldFJlZ1ByZXNzdXJlU2V0TGltaXQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElkeCkgY29uc3QgPSAwOworCisgIC8vLyBHZXQgdGhlIGRpbWVuc2lvbnMgb2YgcmVnaXN0ZXIgcHJlc3N1cmUgaW1wYWN0ZWQgYnkgdGhpcyByZWdpc3RlciBjbGFzcy4KKyAgLy8vIFJldHVybnMgYSAtMSB0ZXJtaW5hdGVkIGFycmF5IG9mIHByZXNzdXJlIHNldCBJRHMuCisgIHZpcnR1YWwgY29uc3QgaW50ICpnZXRSZWdDbGFzc1ByZXNzdXJlU2V0cygKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgY29uc3QgPSAwOworCisgIC8vLyBHZXQgdGhlIGRpbWVuc2lvbnMgb2YgcmVnaXN0ZXIgcHJlc3N1cmUgaW1wYWN0ZWQgYnkgdGhpcyByZWdpc3RlciB1bml0LgorICAvLy8gUmV0dXJucyBhIC0xIHRlcm1pbmF0ZWQgYXJyYXkgb2YgcHJlc3N1cmUgc2V0IElEcy4KKyAgdmlydHVhbCBjb25zdCBpbnQgKmdldFJlZ1VuaXRQcmVzc3VyZVNldHModW5zaWduZWQgUmVnVW5pdCkgY29uc3QgPSAwOworCisgIC8vLyBHZXQgYSBsaXN0IG9mICdoaW50JyByZWdpc3RlcnMgdGhhdCB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yIHNob3VsZCB0cnkKKyAgLy8vIGZpcnN0IHdoZW4gYWxsb2NhdGluZyBhIHBoeXNpY2FsIHJlZ2lzdGVyIGZvciB0aGUgdmlydHVhbCByZWdpc3RlcgorICAvLy8gVmlydFJlZy4gVGhlc2UgcmVnaXN0ZXJzIGFyZSBlZmZlY3RpdmVseSBtb3ZlZCB0byB0aGUgZnJvbnQgb2YgdGhlCisgIC8vLyBhbGxvY2F0aW9uIG9yZGVyLiBJZiB0cnVlIGlzIHJldHVybmVkLCByZWdhbGxvYyB3aWxsIHRyeSB0byBvbmx5IHVzZQorICAvLy8gaGludHMgdG8gdGhlIGdyZWF0ZXN0IGV4dGVudCBwb3NzaWJsZSBldmVuIGlmIGl0IG1lYW5zIHNwaWxsaW5nLgorICAvLy8KKyAgLy8vIFRoZSBPcmRlciBhcmd1bWVudCBpcyB0aGUgYWxsb2NhdGlvbiBvcmRlciBmb3IgVmlydFJlZydzIHJlZ2lzdGVyIGNsYXNzCisgIC8vLyBhcyByZXR1cm5lZCBmcm9tIFJlZ2lzdGVyQ2xhc3NJbmZvOjpnZXRPcmRlcigpLiBUaGUgaGludCByZWdpc3RlcnMgbXVzdAorICAvLy8gY29tZSBmcm9tIE9yZGVyLCBhbmQgdGhleSBtdXN0IG5vdCBiZSByZXNlcnZlZC4KKyAgLy8vCisgIC8vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIHdpbGwgb25seSBhZGQgdGFyZ2V0CisgIC8vLyBpbmRlcGVuZGVudCByZWdpc3RlciBhbGxvY2F0aW9uIGhpbnRzLiBUYXJnZXRzIHRoYXQgb3ZlcnJpZGUgdGhpcworICAvLy8gZnVuY3Rpb24gc2hvdWxkIHR5cGljYWxseSBjYWxsIHRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhcyB3ZWxsIGFuZAorICAvLy8gZXhwZWN0IHRvIHNlZSBnZW5lcmljIGNvcHkgaGludHMgYWRkZWQuCisgIHZpcnR1YWwgYm9vbCBnZXRSZWdBbGxvY2F0aW9uSGludHModW5zaWduZWQgVmlydFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxNQ1BoeXNSZWc+IE9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNQ1BoeXNSZWc+ICZIaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZpcnRSZWdNYXAgKlZSTSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGl2ZVJlZ01hdHJpeCAqTWF0cml4ID0gbnVsbHB0cikKKyAgICBjb25zdDsKKworICAvLy8gQSBjYWxsYmFjayB0byBhbGxvdyB0YXJnZXQgYSBjaGFuY2UgdG8gdXBkYXRlIHJlZ2lzdGVyIGFsbG9jYXRpb24gaGludHMKKyAgLy8vIHdoZW4gYSByZWdpc3RlciBpcyAiY2hhbmdlZCIgKGUuZy4gY29hbGVzY2VkKSB0byBhbm90aGVyIHJlZ2lzdGVyLgorICAvLy8gZS5nLiBPbiBBUk0sIHNvbWUgdmlydHVhbCByZWdpc3RlcnMgc2hvdWxkIHRhcmdldCByZWdpc3RlciBwYWlycywKKyAgLy8vIGlmIG9uZSBvZiBwYWlyIGlzIGNvYWxlc2NlZCB0byBhbm90aGVyIHJlZ2lzdGVyLCB0aGUgYWxsb2NhdGlvbiBoaW50IG9mCisgIC8vLyB0aGUgb3RoZXIgaGFsZiBvZiB0aGUgcGFpciBzaG91bGQgYmUgY2hhbmdlZCB0byBwb2ludCB0byB0aGUgbmV3IHJlZ2lzdGVyLgorICB2aXJ0dWFsIHZvaWQgdXBkYXRlUmVnQWxsb2NIaW50KHVuc2lnbmVkIFJlZywgdW5zaWduZWQgTmV3UmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICAvLyBEbyBub3RoaW5nLgorICB9CisKKyAgLy8vIFRoZSBjcmVhdGlvbiBvZiBtdWx0aXBsZSBjb3B5IGhpbnRzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBpbgorICAvLy8gd2VpZ2h0Q2FsY0hlbHBlcigpLCBidXQgc2luY2UgdGhpcyBhZmZlY3RzIHNvIG1hbnkgdGVzdHMgZm9yIG1hbnkKKyAgLy8vIHRhcmdldHMsIHRoaXMgaXMgdGVtcG9yYXJpbHkgZGlzYWJsZWQgcGVyIGRlZmF1bHQuIFRISVMgU0hPVUxEIEJFCisgIC8vLyAiR0VORVJBTCBHT09ETkVTUyIgYW5kIGhvcGVmdWxseSBhbGwgdGFyZ2V0cyB3aWxsIHVwZGF0ZSB0aGVpciB0ZXN0cworICAvLy8gYW5kIGVuYWJsZSB0aGlzIHNvb24uIFRoaXMgaG9vayBzaG91bGQgdGhlbiBiZSByZW1vdmVkLgorICB2aXJ0dWFsIGJvb2wgZW5hYmxlTXVsdGlwbGVDb3B5SGludHMoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBBbGxvdyB0aGUgdGFyZ2V0IHRvIHJldmVyc2UgYWxsb2NhdGlvbiBvcmRlciBvZiBsb2NhbCBsaXZlIHJhbmdlcy4gVGhpcworICAvLy8gd2lsbCBnZW5lcmFsbHkgYWxsb2NhdGUgc2hvcnRlciBsb2NhbCBsaXZlIHJhbmdlcyBmaXJzdC4gRm9yIHRhcmdldHMgd2l0aAorICAvLy8gbWFueSByZWdpc3RlcnMsIHRoaXMgY291bGQgcmVkdWNlIHJlZ2FsbG9jIGNvbXBpbGUgdGltZSBieSBhIGxhcmdlCisgIC8vLyBmYWN0b3IuIEl0IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgZm9yIHRocmVlIHJlYXNvbnM6CisgIC8vLyAoMSkgVG9wLWRvd24gYWxsb2NhdGlvbiBpcyBzaW1wbGVyIGFuZCBlYXNpZXIgdG8gZGVidWcgZm9yIHRhcmdldHMgdGhhdAorICAvLy8gZG9uJ3QgYmVuZWZpdCBmcm9tIHJldmVyc2luZyB0aGUgb3JkZXIuCisgIC8vLyAoMikgQm90dG9tLXVwIGFsbG9jYXRpb24gY291bGQgcmVzdWx0IGluIHBvb3IgZXZpY2l0aW9uIGRlY2lzaW9ucyBvbiBzb21lCisgIC8vLyB0YXJnZXRzIGFmZmVjdGluZyB0aGUgcGVyZm9ybWFuY2Ugb2YgY29tcGlsZWQgY29kZS4KKyAgLy8vICgzKSBCb3R0b20tdXAgYWxsb2NhdGlvbiBpcyBubyBsb25nZXIgZ3VhcmFudGVlZCB0byBvcHRpbWFsbHkgY29sb3IuCisgIHZpcnR1YWwgYm9vbCByZXZlcnNlTG9jYWxBc3NpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gQWxsb3cgdGhlIHRhcmdldCB0byBvdmVycmlkZSB0aGUgY29zdCBvZiB1c2luZyBhIGNhbGxlZS1zYXZlZCByZWdpc3RlciBmb3IKKyAgLy8vIHRoZSBmaXJzdCB0aW1lLiBEZWZhdWx0IHZhbHVlIG9mIDAgbWVhbnMgd2Ugd2lsbCB1c2UgYSBjYWxsZWUtc2F2ZWQKKyAgLy8vIHJlZ2lzdGVyIGlmIGl0IGlzIGF2YWlsYWJsZS4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRDU1JGaXJzdFVzZUNvc3QoKSBjb25zdCB7IHJldHVybiAwOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IHJlcXVpcmVzIChhbmQgY2FuIG1ha2UgdXNlIG9mKSB0aGUgcmVnaXN0ZXIKKyAgLy8vIHNjYXZlbmdlci4KKyAgdmlydHVhbCBib29sIHJlcXVpcmVzUmVnaXN0ZXJTY2F2ZW5naW5nKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgd2FudHMgdG8gdXNlIGZyYW1lIHBvaW50ZXIgYmFzZWQgYWNjZXNzZXMgdG8KKyAgLy8vIHNwaWxsIHRvIHRoZSBzY2F2ZW5nZXIgZW1lcmdlbmN5IHNwaWxsIHNsb3QuCisgIHZpcnR1YWwgYm9vbCB1c2VGUEZvclNjYXZlbmdpbmdJbmRleChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgcmVxdWlyZXMgcG9zdCBQRUkgc2NhdmVuZ2luZyBvZiByZWdpc3RlcnMgZm9yCisgIC8vLyBtYXRlcmlhbGl6aW5nIGZyYW1lIGluZGV4IGNvbnN0YW50cy4KKyAgdmlydHVhbCBib29sIHJlcXVpcmVzRnJhbWVJbmRleFNjYXZlbmdpbmcoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCByZXF1aXJlcyB1c2luZyB0aGUgUmVnU2NhdmVuZ2VyIGRpcmVjdGx5IGZvcgorICAvLy8gZnJhbWUgZWxpbWluYXRpb24gZGVzcGl0ZSB1c2luZyByZXF1aXJlc0ZyYW1lSW5kZXhTY2F2ZW5naW5nLgorICB2aXJ0dWFsIGJvb2wgcmVxdWlyZXNGcmFtZUluZGV4UmVwbGFjZW1lbnRTY2F2ZW5naW5nKAorICAgICAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCB3YW50cyB0aGUgTG9jYWxTdGFja0FsbG9jYXRpb24gcGFzcyB0byBiZSBydW4KKyAgLy8vIGFuZCB2aXJ0dWFsIGJhc2UgcmVnaXN0ZXJzIHVzZWQgZm9yIG1vcmUgZWZmaWNpZW50IHN0YWNrIGFjY2Vzcy4KKyAgdmlydHVhbCBib29sIHJlcXVpcmVzVmlydHVhbEJhc2VSZWdpc3RlcnMoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0YXJnZXQgaGFzIHJlc2VydmVkIGEgc3BpbGwgc2xvdCBpbiB0aGUgc3RhY2sgZnJhbWUgb2YKKyAgLy8vIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZWdpc3Rlci4gZS5nLiBPbiB4ODYsIGlmIHRoZSBmcmFtZQorICAvLy8gcmVnaXN0ZXIgaXMgcmVxdWlyZWQsIHRoZSBmaXJzdCBmaXhlZCBzdGFjayBvYmplY3QgaXMgcmVzZXJ2ZWQgYXMgaXRzCisgIC8vLyBzcGlsbCBzbG90LiBUaGlzIHRlbGxzIFBFSSBub3QgdG8gY3JlYXRlIGEgbmV3IHN0YWNrIGZyYW1lCisgIC8vLyBvYmplY3QgZm9yIHRoZSBnaXZlbiByZWdpc3Rlci4gSXQgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGFmdGVyCisgIC8vLyBkZXRlcm1pbmVDYWxsZWVTYXZlcygpLgorICB2aXJ0dWFsIGJvb2wgaGFzUmVzZXJ2ZWRTcGlsbFNsb3QoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRiwgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUlkeCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGxpdmUtaW5zIHNob3VsZCBiZSB0cmFja2VkIGFmdGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24uCisgIHZpcnR1YWwgYm9vbCB0cmFja0xpdmVuZXNzQWZ0ZXJSZWdBbGxvYyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFRydWUgaWYgdGhlIHN0YWNrIGNhbiBiZSByZWFsaWduZWQgZm9yIHRoZSB0YXJnZXQuCisgIHZpcnR1YWwgYm9vbCBjYW5SZWFsaWduU3RhY2soY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgLy8vIFRydWUgaWYgc3RvcmFnZSB3aXRoaW4gdGhlIGZ1bmN0aW9uIHJlcXVpcmVzIHRoZSBzdGFjayBwb2ludGVyIHRvIGJlCisgIC8vLyBhbGlnbmVkIG1vcmUgdGhhbiB0aGUgbm9ybWFsIGNhbGxpbmcgY29udmVudGlvbiBjYWxscyBmb3IuCisgIC8vLyBUaGlzIGNhbm5vdCBiZSBvdmVycmlkZW4gYnkgdGhlIHRhcmdldCwgYnV0IGNhblJlYWxpZ25TdGFjayBjYW4gYmUKKyAgLy8vIG92ZXJyaWRkZW4uCisgIGJvb2wgbmVlZHNTdGFja1JlYWxpZ25tZW50KGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIG9mZnNldCBmcm9tIHRoZSByZWZlcmVuY2VkIGZyYW1lIGluZGV4IGluIHRoZSBpbnN0cnVjdGlvbiwKKyAgLy8vIGlmIHRoZXJlIGlzIG9uZS4KKyAgdmlydHVhbCBpbnQ2NF90IGdldEZyYW1lSW5kZXhJbnN0ck9mZnNldChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGluc3RydWN0aW9uJ3MgZnJhbWUgaW5kZXggcmVmZXJlbmNlIHdvdWxkIGJlIGJldHRlcgorICAvLy8gc2VydmVkIGJ5IGEgYmFzZSByZWdpc3RlciBvdGhlciB0aGFuIEZQIG9yIFNQLgorICAvLy8gVXNlZCBieSBMb2NhbFN0YWNrRnJhbWVBbGxvY2F0aW9uIHRvIGRldGVybWluZSB3aGljaCBmcmFtZSBpbmRleAorICAvLy8gcmVmZXJlbmNlcyBpdCBzaG91bGQgY3JlYXRlIG5ldyBiYXNlIHJlZ2lzdGVycyBmb3IuCisgIHZpcnR1YWwgYm9vbCBuZWVkc0ZyYW1lQmFzZVJlZyhNYWNoaW5lSW5zdHIgKk1JLCBpbnQ2NF90IE9mZnNldCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBJbnNlcnQgZGVmaW5pbmcgaW5zdHJ1Y3Rpb24ocykgZm9yIEJhc2VSZWcgdG8gYmUgYSBwb2ludGVyIHRvIEZyYW1lSWR4CisgIC8vLyBiZWZvcmUgaW5zZXJ0aW9uIHBvaW50IEkuCisgIHZpcnR1YWwgdm9pZCBtYXRlcmlhbGl6ZUZyYW1lQmFzZVJlZ2lzdGVyKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJhc2VSZWcsIGludCBGcmFtZUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBPZmZzZXQpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJtYXRlcmlhbGl6ZUZyYW1lQmFzZVJlZ2lzdGVyIGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgIgorICAgICAgICAgICAgICAgICAgICAgInRhcmdldCIpOworICB9CisKKyAgLy8vIFJlc29sdmUgYSBmcmFtZSBpbmRleCBvcGVyYW5kIG9mIGFuIGluc3RydWN0aW9uCisgIC8vLyB0byByZWZlcmVuY2UgdGhlIGluZGljYXRlZCBiYXNlIHJlZ2lzdGVyIHBsdXMgb2Zmc2V0IGluc3RlYWQuCisgIHZpcnR1YWwgdm9pZCByZXNvbHZlRnJhbWVJbmRleChNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBCYXNlUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBPZmZzZXQpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJyZXNvbHZlRnJhbWVJbmRleCBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHRhcmdldCIpOworICB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4gYmFzZSByZWdpc3RlciBwbHVzIG9mZnNldCBpbW1lZGlhdGUgaXMKKyAgLy8vIGVuY29kYWJsZSB0byByZXNvbHZlIGEgZnJhbWUgaW5kZXguCisgIHZpcnR1YWwgYm9vbCBpc0ZyYW1lT2Zmc2V0TGVnYWwoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgQmFzZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IE9mZnNldCkgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoImlzRnJhbWVPZmZzZXRMZWdhbCBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHRhcmdldCIpOworICB9CisKKyAgLy8vIFNwaWxsIHRoZSByZWdpc3RlciBzbyBpdCBjYW4gYmUgdXNlZCBieSB0aGUgcmVnaXN0ZXIgc2NhdmVuZ2VyLgorICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHJlZ2lzdGVyIHdhcyBzcGlsbGVkLCBmYWxzZSBvdGhlcndpc2UuCisgIC8vLyBJZiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHNwaWxsIHRoZSByZWdpc3RlciwgdGhlIHNjYXZlbmdlcgorICAvLy8gd2lsbCBpbnN0ZWFkIHNwaWxsIGl0IHRvIHRoZSBlbWVyZ2VuY3kgc3BpbGwgc2xvdC4KKyAgdmlydHVhbCBib29sIHNhdmVTY2F2ZW5nZXJSZWdpc3RlcihNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciAmVXNlTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIG11c3QgYmUgb3ZlcnJpZGVuIHRvIGVsaW1pbmF0ZSBhYnN0cmFjdCBmcmFtZSBpbmRpY2VzIGZyb20KKyAgLy8vIGluc3RydWN0aW9ucyB3aGljaCBtYXkgdXNlIHRoZW0uIFRoZSBpbnN0cnVjdGlvbiByZWZlcmVuY2VkIGJ5IHRoZQorICAvLy8gaXRlcmF0b3IgY29udGFpbnMgYW4gTU9fRnJhbWVJbmRleCBvcGVyYW5kIHdoaWNoIG11c3QgYmUgZWxpbWluYXRlZCBieQorICAvLy8gdGhpcyBtZXRob2QuIFRoaXMgbWV0aG9kIG1heSBtb2RpZnkgb3IgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLAorICAvLy8gYXMgbG9uZyBhcyBpdCBrZWVwcyB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgYXQgdGhlIGZpbmlzaGVkIHByb2R1Y3QuCisgIC8vLyBTUEFkaiBpcyB0aGUgU1AgYWRqdXN0bWVudCBkdWUgdG8gY2FsbCBmcmFtZSBzZXR1cCBpbnN0cnVjdGlvbi4KKyAgLy8vIEZJT3BlcmFuZE51bSBpcyB0aGUgRkkgb3BlcmFuZCBudW1iZXIuCisgIHZpcnR1YWwgdm9pZCBlbGltaW5hdGVGcmFtZUluZGV4KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNQQWRqLCB1bnNpZ25lZCBGSU9wZXJhbmROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NjYXZlbmdlciAqUlMgPSBudWxscHRyKSBjb25zdCA9IDA7CisKKyAgLy8vIFJldHVybiB0aGUgYXNzZW1ibHkgbmFtZSBmb3IgXHAgUmVnLgorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRSZWdBc21OYW1lKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIC8vIEZJWE1FOiBXZSBhcmUgYXNzdW1pbmcgdGhhdCB0aGUgYXNzZW1ibHkgbmFtZSBpcyBlcXVhbCB0byB0aGUgVGFibGVHZW4KKyAgICAvLyBuYW1lIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlCisgICAgLy8KKyAgICAvLyBUaGUgVGFibGVHZW4gbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZGVmaW5pdGlvbiBmb3IgdGhpcyByZWdpc3RlciBpbiB0aGUKKyAgICAvLyB0YXJnZXQncyB0YWJsZWdlbiBmaWxlcy4gIEZvciBleGFtcGxlLCB0aGUgVGFibGVHZW4gbmFtZSBvZgorICAgIC8vIGRlZiBFQVggOiBSZWdpc3RlciA8Li4uPjsgaXMgIkVBWCIKKyAgICByZXR1cm4gU3RyaW5nUmVmKGdldE5hbWUoUmVnKSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFN1YnRhcmdldCBIb29rcworCisgIC8vLyBcYnJpZWYgU3JjUkMgYW5kIERzdFJDIHdpbGwgYmUgbW9ycGhlZCBpbnRvIE5ld1JDIGlmIHRoaXMgcmV0dXJucyB0cnVlLgorICB2aXJ0dWFsIGJvb2wgc2hvdWxkQ29hbGVzY2UoTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlNyY1JDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3ViUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqRHN0UkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEc3RTdWJSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpOZXdSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpdmVJbnRlcnZhbHMgJkxJUykgY29uc3QKKyAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gRGVidWcgaW5mb3JtYXRpb24gcXVlcmllcy4KKworICAvLy8gZ2V0RnJhbWVSZWdpc3RlciAtIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIHJlZ2lzdGVyIHVzZWQgYXMgYSBiYXNlCisgIC8vLyBmb3IgdmFsdWVzIGFsbG9jYXRlZCBpbiB0aGUgY3VycmVudCBzdGFjayBmcmFtZS4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRGcmFtZVJlZ2lzdGVyKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0ID0gMDsKKworICAvLy8gTWFyayBhIHJlZ2lzdGVyIGFuZCBhbGwgaXRzIGFsaWFzZXMgYXMgcmVzZXJ2ZWQgaW4gdGhlIGdpdmVuIHNldC4KKyAgdm9pZCBtYXJrU3VwZXJSZWdzKEJpdFZlY3RvciAmUmVnaXN0ZXJTZXQsIHVuc2lnbmVkIFJlZykgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBmb3IgZXZlcnkgcmVnaXN0ZXIgaW4gdGhlIHNldCBhbGwgc3VwZXIgcmVnaXN0ZXJzIGFyZSBwYXJ0CisgIC8vLyBvZiB0aGUgc2V0IGFzIHdlbGwuCisgIGJvb2wgY2hlY2tBbGxTdXBlclJlZ3NNYXJrZWQoY29uc3QgQml0VmVjdG9yICZSZWdpc3RlclNldCwKKyAgICAgIEFycmF5UmVmPE1DUGh5c1JlZz4gRXhjZXB0aW9ucyA9IEFycmF5UmVmPE1DUGh5c1JlZz4oKSkgY29uc3Q7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBlclJlZ0NsYXNzSXRlcmF0b3IKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gSXRlcmF0ZSBvdmVyIHRoZSBwb3NzaWJsZSBzdXBlci1yZWdpc3RlcnMgZm9yIGEgZ2l2ZW4gcmVnaXN0ZXIgY2xhc3MuIFRoZQorLy8gaXRlcmF0b3Igd2lsbCB2aXNpdCBhIGxpc3Qgb2YgcGFpcnMgKElkeCwgTWFzaykgY29ycmVzcG9uZGluZyB0byB0aGUKKy8vIHBvc3NpYmxlIGNsYXNzZXMgb2Ygc3VwZXItcmVnaXN0ZXJzLgorLy8KKy8vIEVhY2ggYml0IG1hc2sgd2lsbCBoYXZlIGF0IGxlYXN0IG9uZSBzZXQgYml0LCBhbmQgZWFjaCBzZXQgYml0IGluIE1hc2sKKy8vIGNvcnJlc3BvbmRzIHRvIGEgU3VwZXJSQyBzdWNoIHRoYXQ6CisvLworLy8gICBGb3IgYWxsIFJlZyBpbiBTdXBlclJDOiBSZWc6SWR4IGlzIGluIFJDLgorLy8KKy8vIFRoZSBpdGVyYXRvciBjYW4gaW5jbHVkZSAoTywgUkMtPmdldFN1YkNsYXNzTWFzaygpKSBhcyB0aGUgZmlyc3QgZW50cnkgd2hpY2gKKy8vIGFsc28gc2F0aXNmaWVzIHRoZSBhYm92ZSByZXF1aXJlbWVudCwgYXNzdW1pbmcgUmVnOjAgPT0gUmVnLgorLy8KK2NsYXNzIFN1cGVyUmVnQ2xhc3NJdGVyYXRvciB7CisgIGNvbnN0IHVuc2lnbmVkIFJDTWFza1dvcmRzOworICB1bnNpZ25lZCBTdWJSZWcgPSAwOworICBjb25zdCB1aW50MTZfdCAqSWR4OworICBjb25zdCB1aW50MzJfdCAqTWFzazsKKworcHVibGljOgorICAvLy8gQ3JlYXRlIGEgU3VwZXJSZWdDbGFzc0l0ZXJhdG9yIHRoYXQgdmlzaXRzIGFsbCB0aGUgc3VwZXItcmVnaXN0ZXIgY2xhc3NlcworICAvLy8gb2YgUkMuIFdoZW4gSW5jbHVkZVNlbGYgaXMgc2V0LCBhbHNvIGluY2x1ZGUgdGhlICgwLCBzdWItY2xhc3NlcykgZW50cnkuCisgIFN1cGVyUmVnQ2xhc3NJdGVyYXRvcihjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlU2VsZiA9IGZhbHNlKQorICAgIDogUkNNYXNrV29yZHMoKFRSSS0+Z2V0TnVtUmVnQ2xhc3NlcygpICsgMzEpIC8gMzIpLAorICAgICAgSWR4KFJDLT5nZXRTdXBlclJlZ0luZGljZXMoKSksIE1hc2soUkMtPmdldFN1YkNsYXNzTWFzaygpKSB7CisgICAgaWYgKCFJbmNsdWRlU2VsZikKKyAgICAgICsrKnRoaXM7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXRlcmF0b3IgaXMgc3RpbGwgcG9pbnRpbmcgYXQgYSB2YWxpZCBlbnRyeS4KKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gSWR4OyB9CisKKyAgLy8vIFJldHVybnMgdGhlIGN1cnJlbnQgc3ViLXJlZ2lzdGVyIGluZGV4LgorICB1bnNpZ25lZCBnZXRTdWJSZWcoKSBjb25zdCB7IHJldHVybiBTdWJSZWc7IH0KKworICAvLy8gUmV0dXJucyB0aGUgYml0IG1hc2sgb2YgcmVnaXN0ZXIgY2xhc3NlcyB0aGF0IGdldFN1YlJlZygpIHByb2plY3RzIGludG8KKyAgLy8vIFJDLgorICAvLy8gU2VlIFRhcmdldFJlZ2lzdGVyQ2xhc3M6OmdldFN1YkNsYXNzTWFzaygpIGZvciBob3cgdG8gdXNlIGl0LgorICBjb25zdCB1aW50MzJfdCAqZ2V0TWFzaygpIGNvbnN0IHsgcmV0dXJuIE1hc2s7IH0KKworICAvLy8gQWR2YW5jZSBpdGVyYXRvciB0byB0aGUgbmV4dCBlbnRyeS4KKyAgdm9pZCBvcGVyYXRvcisrKCkgeworICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIkNhbm5vdCBtb3ZlIGl0ZXJhdG9yIHBhc3QgZW5kLiIpOworICAgIE1hc2sgKz0gUkNNYXNrV29yZHM7CisgICAgU3ViUmVnID0gKklkeCsrOworICAgIGlmICghU3ViUmVnKQorICAgICAgSWR4ID0gbnVsbHB0cjsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0TWFza0NsYXNzSXRlcmF0b3IKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gVGhpcyBjbGFzcyBlbmNhcHVzbGF0ZXMgdGhlIGxvZ2ljIHRvIGl0ZXJhdGUgb3ZlciBiaXRtYXNrIHJldHVybmVkIGJ5CisvLy8gdGhlIHZhcmlvdXMgUmVnQ2xhc3MgcmVsYXRlZCBBUElzLgorLy8vIEUuZy4sIHRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSBzdWJjbGFzc2VzIHByb3ZpZGVkIGJ5CisvLy8gVGFyZ2V0UmVnaXN0ZXJDbGFzczo6Z2V0U3ViQ2xhc3NNYXNrIG9yIFN1cGVyUmVnQ2xhc3NJdGVyYXRvcjo6Z2V0TWFzay4KK2NsYXNzIEJpdE1hc2tDbGFzc0l0ZXJhdG9yIHsKKyAgLy8vIFRvdGFsIG51bWJlciBvZiByZWdpc3RlciBjbGFzc2VzLgorICBjb25zdCB1bnNpZ25lZCBOdW1SZWdDbGFzc2VzOworICAvLy8gQmFzZSBpbmRleCBvZiBDdXJyZW50Q2h1bmsuCisgIC8vLyBJbiBvdGhlciB3b3JkcywgdGhlIG51bWJlciBvZiBiaXQgd2UgcmVhZCB0byBnZXQgYXQgdGhlCisgIC8vLyBiZWdpbm5pbmcgb2YgdGhhdCBjaHVuY2suCisgIHVuc2lnbmVkIEJhc2UgPSAwOworICAvLy8gQWRqdXN0IGJhc2UgaW5kZXggb2YgQ3VycmVudENodW5rLgorICAvLy8gQmFzZSBpbmRleCArIGhvdyBtYW55IGJpdCB3ZSByZWFkIHdpdGhpbiBDdXJyZW50Q2h1bmsuCisgIHVuc2lnbmVkIElkeCA9IDA7CisgIC8vLyBDdXJyZW50IHJlZ2lzdGVyIGNsYXNzIElELgorICB1bnNpZ25lZCBJRCA9IDA7CisgIC8vLyBNYXNrIHdlIGFyZSBpdGVyYXRpbmcgb3Zlci4KKyAgY29uc3QgdWludDMyX3QgKk1hc2s7CisgIC8vLyBDdXJyZW50IGNodW5rIG9mIHRoZSBNYXNrIHdlIGFyZSB0cmF2ZXJzaW5nLgorICB1aW50MzJfdCBDdXJyZW50Q2h1bms7CisKKyAgLy8vIE1vdmUgSUQgdG8gdGhlIG5leHQgc2V0IGJpdC4KKyAgdm9pZCBtb3ZlVG9OZXh0SUQoKSB7CisgICAgLy8gSWYgdGhlIGN1cnJlbnQgY2h1bmsgb2YgbWVtb3J5IGlzIGVtcHR5LCBtb3ZlIHRvIHRoZSBuZXh0IG9uZSwKKyAgICAvLyB3aGlsZSBtYWtpbmcgc3VyZSB3ZSBkbyBub3QgZ28gcGFzcyB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyCisgICAgLy8gY2xhc3Nlcy4KKyAgICB3aGlsZSAoIUN1cnJlbnRDaHVuaykgeworICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBjaHVuay4KKyAgICAgIEJhc2UgKz0gMzI7CisgICAgICBpZiAoQmFzZSA+PSBOdW1SZWdDbGFzc2VzKSB7CisgICAgICAgIElEID0gTnVtUmVnQ2xhc3NlczsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgQ3VycmVudENodW5rID0gKisrTWFzazsKKyAgICAgIElkeCA9IEJhc2U7CisgICAgfQorICAgIC8vIE90aGVyd2lzZSBsb29rIGZvciB0aGUgZmlyc3QgYml0IHNldCBmcm9tIHRoZSByaWdodAorICAgIC8vIChyZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xhc3MgSUQgaXMgYmlnIGVuZGlhbikuCisgICAgLy8gU2VlIGdldFN1YkNsYXNzTWFzayBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSByZXByZXNlbnRhdGlvbi4KKyAgICB1bnNpZ25lZCBPZmZzZXQgPSBjb3VudFRyYWlsaW5nWmVyb3MoQ3VycmVudENodW5rKTsKKyAgICAvLyBBZGQgdGhlIE9mZnNldCB0byB0aGUgYWRqdXN0ZWQgYmFzZSBudW1iZXIgb2YgdGhpcyBjaHVuazogSWR4LgorICAgIC8vIFRoaXMgaXMgdGhlIElEIG9mIHRoZSByZWdpc3RlciBjbGFzcy4KKyAgICBJRCA9IElkeCArIE9mZnNldDsKKworICAgIC8vIENvbnN1bWUgdGhlIHplcm9zLCBpZiBhbnksIGFuZCB0aGUgYml0IHdlIGp1c3QgcmVhZAorICAgIC8vIHNvIHRoYXQgd2UgYXJlIGF0IHRoZSByaWdodCBzcG90IGZvciB0aGUgbmV4dCBjYWxsLgorICAgIC8vIERvIG5vdCBkbyBPZmZzZXQgKyAxIGJlY2F1c2UgT2Zmc2V0IG1heSBiZSAzMSBhbmQgMzIKKyAgICAvLyB3aWxsIGJlIFVCIGZvciB0aGUgc2hpZnQsIHRob3VnaCBpbiB0aGF0IGNhc2Ugd2UgY291bGQKKyAgICAvLyBoYXZlIG1ha2UgdGhlIGNodW5rIGJlaW5nIGVxdWFsIHRvIDAsIGJ1dCB0aGF0IHdvdWxkCisgICAgLy8gaGF2ZSBpbnRyb2R1Y2VkIGEgaWYgc3RhdGVtZW50LgorICAgIG1vdmVOQml0cyhPZmZzZXQpOworICAgIG1vdmVOQml0cygxKTsKKyAgfQorCisgIC8vLyBNb3ZlIFxwIE51bUJpdHMgQml0cyBmb3J3YXJkIGluIEN1cnJlbnRDaHVuay4KKyAgdm9pZCBtb3ZlTkJpdHModW5zaWduZWQgTnVtQml0cykgeworICAgIGFzc2VydChOdW1CaXRzIDwgMzIgJiYgIlVuZGVmaW5lZCBiZWhhdmlvciBzcG90dGVkISIpOworICAgIC8vIENvbnN1bWUgdGhlIGJpdCB3ZSByZWFkIGZvciB0aGUgbmV4dCBjYWxsLgorICAgIEN1cnJlbnRDaHVuayA+Pj0gTnVtQml0czsKKyAgICAvLyBBZGp1c3QgdGhlIGJhc2UgZm9yIHRoZSBjaHVuay4KKyAgICBJZHggKz0gTnVtQml0czsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBDcmVhdGUgYSBCaXRNYXNrQ2xhc3NJdGVyYXRvciB0aGF0IHZpc2l0cyBhbGwgdGhlIHJlZ2lzdGVyIGNsYXNzZXMKKyAgLy8vIHJlcHJlc2VudGVkIGJ5IFxwIE1hc2suCisgIC8vLworICAvLy8gXHByZSBccCBNYXNrICE9IG51bGxwdHIKKyAgQml0TWFza0NsYXNzSXRlcmF0b3IoY29uc3QgdWludDMyX3QgKk1hc2ssIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKQorICAgICAgOiBOdW1SZWdDbGFzc2VzKFRSSS5nZXROdW1SZWdDbGFzc2VzKCkpLCBNYXNrKE1hc2spLCBDdXJyZW50Q2h1bmsoKk1hc2spIHsKKyAgICAvLyBNb3ZlIHRvIHRoZSBmaXJzdCBJRC4KKyAgICBtb3ZlVG9OZXh0SUQoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpdGVyYXRvciBpcyBzdGlsbCBwb2ludGluZyBhdCBhIHZhbGlkIGVudHJ5LgorICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBnZXRJRCgpICE9IE51bVJlZ0NsYXNzZXM7IH0KKworICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCByZWdpc3RlciBjbGFzcyBJRC4KKyAgdW5zaWduZWQgZ2V0SUQoKSBjb25zdCB7IHJldHVybiBJRDsgfQorCisgIC8vLyBBZHZhbmNlIGl0ZXJhdG9yIHRvIHRoZSBuZXh0IGVudHJ5LgorICB2b2lkIG9wZXJhdG9yKysoKSB7CisgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiQ2Fubm90IG1vdmUgaXRlcmF0b3IgcGFzdCBlbmQuIik7CisgICAgbW92ZVRvTmV4dElEKCk7CisgIH0KK307CisKKy8vIFRoaXMgaXMgdXNlZnVsIHdoZW4gYnVpbGRpbmcgSW5kZXhlZE1hcHMga2V5ZWQgb24gdmlydHVhbCByZWdpc3RlcnMKK3N0cnVjdCBWaXJ0UmVnMkluZGV4RnVuY3RvciB7CisgIHVzaW5nIGFyZ3VtZW50X3R5cGUgPSB1bnNpZ25lZDsKKyAgdW5zaWduZWQgb3BlcmF0b3IoKSh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gVGFyZ2V0UmVnaXN0ZXJJbmZvOjp2aXJ0UmVnMkluZGV4KFJlZyk7CisgIH0KK307CisKKy8vLyBQcmludHMgdmlydHVhbCBhbmQgcGh5c2ljYWwgcmVnaXN0ZXJzIHdpdGggb3Igd2l0aG91dCBhIFRSSSBpbnN0YW5jZS4KKy8vLworLy8vIFRoZSBmb3JtYXQgaXM6CisvLy8gICAlbm9yZWcgICAgICAgICAgLSBOb1JlZ2lzdGVyCisvLy8gICAlNSAgICAgICAgICAgICAgLSBhIHZpcnR1YWwgcmVnaXN0ZXIuCisvLy8gICAlNTpzdWJfOGJpdCAgICAgLSBhIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzdWItcmVnaXN0ZXIgaW5kZXggKHdpdGggVFJJKS4KKy8vLyAgICVlYXggICAgICAgICAgICAtIGEgcGh5c2ljYWwgcmVnaXN0ZXIKKy8vLyAgICVwaHlzcmVnMTcgICAgICAtIGEgcGh5c2ljYWwgcmVnaXN0ZXIgd2hlbiBubyBUUkkgaW5zdGFuY2UgZ2l2ZW4uCisvLy8KKy8vLyBVc2FnZTogT1MgPDwgcHJpbnRSZWcoUmVnLCBUUkksIFN1YlJlZ0lkeCkgPDwgJ1xuJzsKK1ByaW50YWJsZSBwcmludFJlZyh1bnNpZ25lZCBSZWcsIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdWJSZWdJZHggPSAwLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSA9IG51bGxwdHIpOworCisvLy8gQ3JlYXRlIFByaW50YWJsZSBvYmplY3QgdG8gcHJpbnQgcmVnaXN0ZXIgdW5pdHMgb24gYSBccmVmIHJhd19vc3RyZWFtLgorLy8vCisvLy8gUmVnaXN0ZXIgdW5pdHMgYXJlIG5hbWVkIGFmdGVyIHRoZWlyIHJvb3QgcmVnaXN0ZXJzOgorLy8vCisvLy8gICBhbCAgICAgIC0gU2luZ2xlIHJvb3QuCisvLy8gICBmcDB+c3Q3IC0gRHVhbCByb290cy4KKy8vLworLy8vIFVzYWdlOiBPUyA8PCBwcmludFJlZ1VuaXQoVW5pdCwgVFJJKSA8PCAnXG4nOworUHJpbnRhYmxlIHByaW50UmVnVW5pdCh1bnNpZ25lZCBVbml0LCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSk7CisKKy8vLyBcYnJpZWYgQ3JlYXRlIFByaW50YWJsZSBvYmplY3QgdG8gcHJpbnQgdmlydHVhbCByZWdpc3RlcnMgYW5kIHBoeXNpY2FsCisvLy8gcmVnaXN0ZXJzIG9uIGEgXHJlZiByYXdfb3N0cmVhbS4KK1ByaW50YWJsZSBwcmludFZSZWdPclVuaXQodW5zaWduZWQgVlJlZ09yVW5pdCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpOworCisvLy8gXGJyaWVmIENyZWF0ZSBQcmludGFibGUgb2JqZWN0IHRvIHByaW50IHJlZ2lzdGVyIGNsYXNzZXMgb3IgcmVnaXN0ZXIgYmFua3MKKy8vLyBvbiBhIFxyZWYgcmF3X29zdHJlYW0uCitQcmludGFibGUgcHJpbnRSZWdDbGFzc09yQmFuayh1bnNpZ25lZCBSZWcsIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJlJlZ0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fVEFSR0VUUkVHSVNURVJJTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRTY2hlZHVsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldFNjaGVkdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0NGYwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRTY2hlZHVsZS5oCkBAIC0wLDAgKzEsMjA0IEBACisvLz09PS0gbGx2bS9Db2RlR2VuL1RhcmdldFNjaGVkdWxlLmggLSBTY2hlZCBNYWNoaW5lIE1vZGVsIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgd3JhcHBlciBhcm91bmQgTUNTY2hlZE1vZGVsIHRoYXQgYWxsb3dzIHRoZSBpbnRlcmZhY2UgdG8KKy8vIGJlbmVmaXQgZnJvbSBpbmZvcm1hdGlvbiBjdXJyZW50bHkgb25seSBhdmFpbGFibGUgaW4gVGFyZ2V0SW5zdHJJbmZvLgorLy8gSWRlYWxseSwgdGhlIHNjaGVkdWxpbmcgaW50ZXJmYWNlIHdvdWxkIGJlIGZ1bGx5IGRlZmluZWQgaW4gdGhlIE1DIGxheWVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1RBUkdFVFNDSEVEVUxFX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1RBUkdFVFNDSEVEVUxFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0U3VidGFyZ2V0SW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0ckl0aW5lcmFyaWVzLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NjaGVkdWxlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworCisvLy8gUHJvdmlkZSBhbiBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nIG1hY2hpbmUgbW9kZWwgdG8gQ29kZUdlbiBwYXNzZXMuCitjbGFzcyBUYXJnZXRTY2hlZE1vZGVsIHsKKyAgLy8gRm9yIGVmZmljaWVuY3ksIGhvbGQgYSBjb3B5IG9mIHRoZSBzdGF0aWNhbGx5IGRlZmluZWQgTUNTY2hlZE1vZGVsIGZvciB0aGlzCisgIC8vIHByb2Nlc3Nvci4KKyAgTUNTY2hlZE1vZGVsIFNjaGVkTW9kZWw7CisgIEluc3RySXRpbmVyYXJ5RGF0YSBJbnN0ckl0aW5zOworICBjb25zdCBUYXJnZXRTdWJ0YXJnZXRJbmZvICpTVEkgPSBudWxscHRyOworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSA9IG51bGxwdHI7CisKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDE2PiBSZXNvdXJjZUZhY3RvcnM7CisgIHVuc2lnbmVkIE1pY3JvT3BGYWN0b3I7IC8vIE11bHRpcGx5IHRvIG5vcm1hbGl6ZSBtaWNyb29wcyB0byByZXNvdXJjZSB1bml0cy4KKyAgdW5zaWduZWQgUmVzb3VyY2VMQ007ICAgLy8gUmVzb3VyY2UgdW5pdHMgcGVyIGN5Y2xlLiBMYXRlbmN5IG5vcm1hbGl6YXRpb24gZmFjdG9yLgorCisgIHVuc2lnbmVkIGNvbXB1dGVJbnN0ckxhdGVuY3koY29uc3QgTUNTY2hlZENsYXNzRGVzYyAmU0NEZXNjKSBjb25zdDsKKworcHVibGljOgorICBUYXJnZXRTY2hlZE1vZGVsKCkgOiBTY2hlZE1vZGVsKE1DU2NoZWRNb2RlbDo6R2V0RGVmYXVsdFNjaGVkTW9kZWwoKSkge30KKworICAvLy8gXGJyaWVmIEluaXRpYWxpemUgdGhlIG1hY2hpbmUgbW9kZWwgZm9yIGluc3RydWN0aW9uIHNjaGVkdWxpbmcuCisgIC8vLworICAvLy8gVGhlIG1hY2hpbmUgbW9kZWwgQVBJIGtlZXBzIGEgY29weSBvZiB0aGUgdG9wLWxldmVsIE1DU2NoZWRNb2RlbCB0YWJsZQorICAvLy8gaW5kaWNlcyBhbmQgbWF5IHF1ZXJ5IFRhcmdldFN1YnRhcmdldEluZm8gYW5kIFRhcmdldEluc3RySW5mbyB0byByZXNvbHZlCisgIC8vLyBkeW5hbWljIHByb3BlcnRpZXMuCisgIHZvaWQgaW5pdChjb25zdCBNQ1NjaGVkTW9kZWwgJnNtLCBjb25zdCBUYXJnZXRTdWJ0YXJnZXRJbmZvICpzdGksCisgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKnRpaSk7CisKKyAgLy8vIFJldHVybiB0aGUgTUNTY2hlZENsYXNzRGVzYyBmb3IgdGhpcyBpbnN0cnVjdGlvbi4KKyAgY29uc3QgTUNTY2hlZENsYXNzRGVzYyAqcmVzb2x2ZVNjaGVkQ2xhc3MoY29uc3QgTWFjaGluZUluc3RyICpNSSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUYXJnZXRTdWJ0YXJnZXRJbmZvIGdldHRlci4KKyAgY29uc3QgVGFyZ2V0U3VidGFyZ2V0SW5mbyAqZ2V0U3VidGFyZ2V0SW5mbygpIGNvbnN0IHsgcmV0dXJuIFNUSTsgfQorCisgIC8vLyBcYnJpZWYgVGFyZ2V0SW5zdHJJbmZvIGdldHRlci4KKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpnZXRJbnN0ckluZm8oKSBjb25zdCB7IHJldHVybiBUSUk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgbWFjaGluZSBtb2RlbCBpbmNsdWRlcyBhbiBpbnN0cnVjdGlvbi1sZXZlbAorICAvLy8gc2NoZWR1bGluZyBtb2RlbC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIG1vcmUgZGV0YWlsZWQgdGhhbiB0aGUgY291cnNlIGdyYWluIElzc3VlV2lkdGggYW5kIGRlZmF1bHQKKyAgLy8vIGxhdGVuY3kgcHJvcGVydGllcywgYnV0IHNlcGFyYXRlIGZyb20gdGhlIHBlci1jeWNsZSBpdGluZXJhcnkgZGF0YS4KKyAgYm9vbCBoYXNJbnN0clNjaGVkTW9kZWwoKSBjb25zdDsKKworICBjb25zdCBNQ1NjaGVkTW9kZWwgKmdldE1DU2NoZWRNb2RlbCgpIGNvbnN0IHsgcmV0dXJuICZTY2hlZE1vZGVsOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG1hY2hpbmUgbW9kZWwgaW5jbHVkZXMgY3ljbGUtdG8tY3ljbGUgaXRpbmVyYXJ5CisgIC8vLyBkYXRhLgorICAvLy8KKyAgLy8vIFRoaXMgbW9kZWxzIHNjaGVkdWxpbmcgYXQgZWFjaCBzdGFnZSBpbiB0aGUgcHJvY2Vzc29yIHBpcGVsaW5lLgorICBib29sIGhhc0luc3RySXRpbmVyYXJpZXMoKSBjb25zdDsKKworICBjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgKmdldEluc3RySXRpbmVyYXJpZXMoKSBjb25zdCB7CisgICAgaWYgKGhhc0luc3RySXRpbmVyYXJpZXMoKSkKKyAgICAgIHJldHVybiAmSW5zdHJJdGluczsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBtYWNoaW5lIG1vZGVsIGluY2x1ZGVzIGFuIGluc3RydWN0aW9uLWxldmVsCisgIC8vLyBzY2hlZHVsaW5nIG1vZGVsIG9yIGN5Y2xlLXRvLWN5Y2xlIGl0aW5lcmFyeSBkYXRhLgorICBib29sIGhhc0luc3RyU2NoZWRNb2RlbE9ySXRpbmVyYXJpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0luc3RyU2NoZWRNb2RlbCgpIHx8IGhhc0luc3RySXRpbmVyYXJpZXMoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSWRlbnRpZnkgdGhlIHByb2Nlc3NvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IHN1YnRhcmdldC4KKyAgdW5zaWduZWQgZ2V0UHJvY2Vzc29ySUQoKSBjb25zdCB7IHJldHVybiBTY2hlZE1vZGVsLmdldFByb2Nlc3NvcklEKCk7IH0KKworICAvLy8gXGJyaWVmIE1heGltdW0gbnVtYmVyIG9mIG1pY3JvLW9wcyB0aGF0IG1heSBiZSBzY2hlZHVsZWQgcGVyIGN5Y2xlLgorICB1bnNpZ25lZCBnZXRJc3N1ZVdpZHRoKCkgY29uc3QgeyByZXR1cm4gU2NoZWRNb2RlbC5Jc3N1ZVdpZHRoOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBuZXcgZ3JvdXAgbXVzdCBiZWdpbi4KKyAgYm9vbCBtdXN0QmVnaW5Hcm91cChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1NjaGVkQ2xhc3NEZXNjICpTQyA9IG51bGxwdHIpIGNvbnN0OworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIGN1cnJlbnQgZ3JvdXAgbXVzdCBlbmQuCisgIGJvb2wgbXVzdEVuZEdyb3VwKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU2NoZWRDbGFzc0Rlc2MgKlNDID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBpc3N1ZSBzbG90cyByZXF1aXJlZCBmb3IgdGhpcyBNSS4KKyAgdW5zaWduZWQgZ2V0TnVtTWljcm9PcHMoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTY2hlZENsYXNzRGVzYyAqU0MgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgbnVtYmVyIG9mIGtpbmRzIG9mIHJlc291cmNlcyBmb3IgdGhpcyB0YXJnZXQuCisgIHVuc2lnbmVkIGdldE51bVByb2NSZXNvdXJjZUtpbmRzKCkgY29uc3QgeworICAgIHJldHVybiBTY2hlZE1vZGVsLmdldE51bVByb2NSZXNvdXJjZUtpbmRzKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBhIHByb2Nlc3NvciByZXNvdXJjZSBieSBJRCBmb3IgY29udmVuaWVuY2UuCisgIGNvbnN0IE1DUHJvY1Jlc291cmNlRGVzYyAqZ2V0UHJvY1Jlc291cmNlKHVuc2lnbmVkIFBJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gU2NoZWRNb2RlbC5nZXRQcm9jUmVzb3VyY2UoUElkeCk7CisgIH0KKworI2lmICFkZWZpbmVkKE5ERUJVRykgfHwgZGVmaW5lZChMTFZNX0VOQUJMRV9EVU1QKQorICBjb25zdCBjaGFyICpnZXRSZXNvdXJjZU5hbWUodW5zaWduZWQgUElkeCkgY29uc3QgeworICAgIGlmICghUElkeCkKKyAgICAgIHJldHVybiAiTU9wcyI7CisgICAgcmV0dXJuIFNjaGVkTW9kZWwuZ2V0UHJvY1Jlc291cmNlKFBJZHgpLT5OYW1lOworICB9CisjZW5kaWYKKworICB1c2luZyBQcm9jUmVzSXRlciA9IGNvbnN0IE1DV3JpdGVQcm9jUmVzRW50cnkgKjsKKworICAvLyBcYnJpZWYgR2V0IGFuIGl0ZXJhdG9yIGludG8gdGhlIHByb2Nlc3NvciByZXNvdXJjZXMgY29uc3VtZWQgYnkgdGhpcworICAvLyBzY2hlZHVsaW5nIGNsYXNzLgorICBQcm9jUmVzSXRlciBnZXRXcml0ZVByb2NSZXNCZWdpbihjb25zdCBNQ1NjaGVkQ2xhc3NEZXNjICpTQykgY29uc3QgeworICAgIC8vIFRoZSBzdWJ0YXJnZXQgaG9sZHMgYSBzaW5nbGUgcmVzb3VyY2UgdGFibGUgZm9yIGFsbCBwcm9jZXNzb3JzLgorICAgIHJldHVybiBTVEktPmdldFdyaXRlUHJvY1Jlc0JlZ2luKFNDKTsKKyAgfQorICBQcm9jUmVzSXRlciBnZXRXcml0ZVByb2NSZXNFbmQoY29uc3QgTUNTY2hlZENsYXNzRGVzYyAqU0MpIGNvbnN0IHsKKyAgICByZXR1cm4gU1RJLT5nZXRXcml0ZVByb2NSZXNFbmQoU0MpOworICB9CisKKyAgLy8vIFxicmllZiBNdWx0aXBseSB0aGUgbnVtYmVyIG9mIHVuaXRzIGNvbnN1bWVkIGZvciBhIHJlc291cmNlIGJ5IHRoaXMgZmFjdG9yCisgIC8vLyB0byBub3JtYWxpemUgaXQgcmVsYXRpdmUgdG8gb3RoZXIgcmVzb3VyY2VzLgorICB1bnNpZ25lZCBnZXRSZXNvdXJjZUZhY3Rvcih1bnNpZ25lZCBSZXNJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVzb3VyY2VGYWN0b3JzW1Jlc0lkeF07CisgIH0KKworICAvLy8gXGJyaWVmIE11bHRpcGx5IG51bWJlciBvZiBtaWNyby1vcHMgYnkgdGhpcyBmYWN0b3IgdG8gbm9ybWFsaXplIGl0CisgIC8vLyByZWxhdGl2ZSB0byBvdGhlciByZXNvdXJjZXMuCisgIHVuc2lnbmVkIGdldE1pY3JvT3BGYWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIE1pY3JvT3BGYWN0b3I7CisgIH0KKworICAvLy8gXGJyaWVmIE11bHRpcGx5IGN5Y2xlIGNvdW50IGJ5IHRoaXMgZmFjdG9yIHRvIG5vcm1hbGl6ZSBpdCByZWxhdGl2ZSB0bworICAvLy8gb3RoZXIgcmVzb3VyY2VzLiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgcmVzb3VyY2UgdW5pdHMgcGVyIGN5Y2xlLgorICB1bnNpZ25lZCBnZXRMYXRlbmN5RmFjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBSZXNvdXJjZUxDTTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTnVtYmVyIG9mIG1pY3JvLW9wcyB0aGF0IG1heSBiZSBidWZmZXJlZCBmb3IgT09PIGV4ZWN1dGlvbi4KKyAgdW5zaWduZWQgZ2V0TWljcm9PcEJ1ZmZlclNpemUoKSBjb25zdCB7IHJldHVybiBTY2hlZE1vZGVsLk1pY3JvT3BCdWZmZXJTaXplOyB9CisKKyAgLy8vIFxicmllZiBOdW1iZXIgb2YgcmVzb3VyY2UgdW5pdHMgdGhhdCBtYXkgYmUgYnVmZmVyZWQgZm9yIE9PTyBleGVjdXRpb24uCisgIC8vLyBccmV0dXJuIFRoZSBidWZmZXIgc2l6ZSBpbiByZXNvdXJjZSB1bml0cyBvciAtMSBmb3IgdW5saW1pdGVkLgorICBpbnQgZ2V0UmVzb3VyY2VCdWZmZXJTaXplKHVuc2lnbmVkIFBJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gU2NoZWRNb2RlbC5nZXRQcm9jUmVzb3VyY2UoUElkeCktPkJ1ZmZlclNpemU7CisgIH0KKworICAvLy8gXGJyaWVmIENvbXB1dGUgb3BlcmFuZCBsYXRlbmN5IGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgbWFjaGluZSBtb2RlbC4KKyAgLy8vCisgIC8vLyBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGxhdGVuY3kgb2YgdGhlIGdpdmVuIGRhdGEgZGVwZW5kZW50IGRlZiBhbmQgdXNlCisgIC8vLyB3aGVuIHRoZSBvcGVyYW5kIGluZGljZXMgYXJlIGFscmVhZHkga25vd24uIFVzZU1JIG1heSBiZSBOVUxMIGZvciBhbgorICAvLy8gdW5rbm93biB1c2VyLgorICB1bnNpZ25lZCBjb21wdXRlT3BlcmFuZExhdGVuY3koY29uc3QgTWFjaGluZUluc3RyICpEZWZNSSwgdW5zaWduZWQgRGVmT3BlcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAqVXNlTUksIHVuc2lnbmVkIFVzZU9wZXJJZHgpCisgICAgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDb21wdXRlIHRoZSBpbnN0cnVjdGlvbiBsYXRlbmN5IGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgbWFjaGluZQorICAvLy8gbW9kZWwuCisgIC8vLworICAvLy8gQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBleHBlY3RlZCBsYXRlbmN5IG9mIHRoaXMgaW5zdHJ1Y3Rpb24gaW5kZXBlbmRlbnQgb2YKKyAgLy8vIGEgcGFydGljdWxhciB1c2UuIGNvbXB1dGVPcGVyYW5kTGF0ZW5jeSBpcyB0aGUgcHJlZmVycmVkIEFQSSwgYnV0IHRoaXMgaXMKKyAgLy8vIG9jY2FzaW9uYWxseSB1c2VmdWwgdG8gaGVscCBlc3RpbWF0ZSBpbnN0cnVjdGlvbiBjb3N0LgorICAvLy8KKyAgLy8vIElmIFVzZURlZmF1bHREZWZMYXRlbmN5IGlzIGZhbHNlIGFuZCBubyBuZXcgbWFjaGluZSBzY2hlZCBtb2RlbCBpcworICAvLy8gcHJlc2VudCB0aGlzIG1ldGhvZCBmYWxscyBiYWNrIHRvIFRJSS0+Z2V0SW5zdHJMYXRlbmN5IHdpdGggYW4gZW1wdHkKKyAgLy8vIGluc3RydWN0aW9uIGl0aW5lcmFyeSAodGhpcyBpcyBzbyB3ZSBwcmVzZXJ2ZSB0aGUgcHJldmlvdXMgYmVoYXZpb3Igb2YgdGhlCisgIC8vLyBpZiBjb252ZXJ0ZXIgYWZ0ZXIgbW92aW5nIGl0IHRvIFRhcmdldFNjaGVkTW9kZWwpLgorICB1bnNpZ25lZCBjb21wdXRlSW5zdHJMYXRlbmN5KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVc2VEZWZhdWx0RGVmTGF0ZW5jeSA9IHRydWUpIGNvbnN0OworICB1bnNpZ25lZCBjb21wdXRlSW5zdHJMYXRlbmN5KHVuc2lnbmVkIE9wY29kZSkgY29uc3Q7CisKKworICAvLy8gXGJyaWVmIE91dHB1dCBkZXBlbmRlbmN5IGxhdGVuY3kgb2YgYSBwYWlyIG9mIGRlZnMgb2YgdGhlIHNhbWUgcmVnaXN0ZXIuCisgIC8vLworICAvLy8gVGhpcyBpcyB0eXBpY2FsbHkgb25lIGN5Y2xlLgorICB1bnNpZ25lZCBjb21wdXRlT3V0cHV0TGF0ZW5jeShjb25zdCBNYWNoaW5lSW5zdHIgKkRlZk1JLCB1bnNpZ25lZCBEZWZJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAqRGVwTUkpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQ29tcHV0ZSB0aGUgcmVjaXByb2NhbCB0aHJvdWdocHV0IG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4KKyAgT3B0aW9uYWw8ZG91YmxlPiBjb21wdXRlSW5zdHJSVGhyb3VnaHB1dChjb25zdCBNYWNoaW5lSW5zdHIgKk1JKSBjb25zdDsKKyAgT3B0aW9uYWw8ZG91YmxlPiBjb21wdXRlSW5zdHJSVGhyb3VnaHB1dCh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9UQVJHRVRTQ0hFRFVMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0U3VidGFyZ2V0SW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldFN1YnRhcmdldEluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTVmYWFjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldFN1YnRhcmdldEluZm8uaApAQCAtMCwwICsxLDI2MSBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9UYXJnZXRTdWJ0YXJnZXRJbmZvLmggLSBUYXJnZXQgSW5mb3JtYXRpb24gLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzdWJ0YXJnZXQgb3B0aW9ucyBvZiBhIFRhcmdldCBtYWNoaW5lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1RBUkdFVFNVQlRBUkdFVElORk9fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fVEFSR0VUU1VCVEFSR0VUSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1BCUVBSQUNvbnN0cmFpbnQuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUdNdXRhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TY2hlZHVsZXJSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTdWJ0YXJnZXRJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvZGVHZW4uaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ2FsbExvd2VyaW5nOworY2xhc3MgSW5zdHJJdGluZXJhcnlEYXRhOworc3RydWN0IEluc3RyU3RhZ2U7CitjbGFzcyBJbnN0cnVjdGlvblNlbGVjdG9yOworY2xhc3MgTGVnYWxpemVySW5mbzsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK3N0cnVjdCBNYWNoaW5lU2NoZWRQb2xpY3k7CitzdHJ1Y3QgTUNSZWFkQWR2YW5jZUVudHJ5Oworc3RydWN0IE1DV3JpdGVMYXRlbmN5RW50cnk7CitzdHJ1Y3QgTUNXcml0ZVByb2NSZXNFbnRyeTsKK2NsYXNzIFJlZ2lzdGVyQmFua0luZm87CitjbGFzcyBTRGVwOworY2xhc3MgU2VsZWN0aW9uREFHVGFyZ2V0SW5mbzsKK3N0cnVjdCBTdWJ0YXJnZXRGZWF0dXJlS1Y7CitzdHJ1Y3QgU3VidGFyZ2V0SW5mb0tWOworY2xhc3MgU1VuaXQ7CitjbGFzcyBUYXJnZXRGcmFtZUxvd2VyaW5nOworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworY2xhc3MgVGFyZ2V0TG93ZXJpbmc7CitjbGFzcyBUYXJnZXRSZWdpc3RlckNsYXNzOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworY2xhc3MgVGFyZ2V0U2NoZWRNb2RlbDsKK2NsYXNzIFRyaXBsZTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFRhcmdldFN1YnRhcmdldEluZm8gLSBHZW5lcmljIGJhc2UgY2xhc3MgZm9yIGFsbCB0YXJnZXQgc3VidGFyZ2V0cy4gIEFsbAorLy8vIFRhcmdldC1zcGVjaWZpYyBvcHRpb25zIHRoYXQgY29udHJvbCBjb2RlIGdlbmVyYXRpb24gYW5kIHByaW50aW5nIHNob3VsZAorLy8vIGJlIGV4cG9zZWQgdGhyb3VnaCBhIFRhcmdldFN1YnRhcmdldEluZm8tZGVyaXZlZCBjbGFzcy4KKy8vLworY2xhc3MgVGFyZ2V0U3VidGFyZ2V0SW5mbyA6IHB1YmxpYyBNQ1N1YnRhcmdldEluZm8geworcHJvdGVjdGVkOiAvLyBDYW4gb25seSBjcmVhdGUgc3ViY2xhc3Nlcy4uLgorICBUYXJnZXRTdWJ0YXJnZXRJbmZvKGNvbnN0IFRyaXBsZSAmVFQsIFN0cmluZ1JlZiBDUFUsIFN0cmluZ1JlZiBGUywKKyAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTdWJ0YXJnZXRGZWF0dXJlS1Y+IFBGLAorICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFN1YnRhcmdldEZlYXR1cmVLVj4gUEQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3VidGFyZ2V0SW5mb0tWICpQcm9jU2NoZWQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNXcml0ZVByb2NSZXNFbnRyeSAqV1BSLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DV3JpdGVMYXRlbmN5RW50cnkgKldMLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DUmVhZEFkdmFuY2VFbnRyeSAqUkEsIGNvbnN0IEluc3RyU3RhZ2UgKklTLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkICpPQywgY29uc3QgdW5zaWduZWQgKkZQKTsKKworcHVibGljOgorICAvLyBBbnRpRGVwQnJlYWtNb2RlIC0gVHlwZSBvZiBhbnRpLWRlcGVuZGVuY2UgYnJlYWtpbmcgdGhhdCBzaG91bGQKKyAgLy8gYmUgcGVyZm9ybWVkIGJlZm9yZSBwb3N0LVJBIHNjaGVkdWxpbmcuCisgIHVzaW5nIEFudGlEZXBCcmVha01vZGUgPSBlbnVtIHsgQU5USURFUF9OT05FLCBBTlRJREVQX0NSSVRJQ0FMLCBBTlRJREVQX0FMTCB9OworICB1c2luZyBSZWdDbGFzc1ZlY3RvciA9IFNtYWxsVmVjdG9ySW1wbDxjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICo+OworCisgIFRhcmdldFN1YnRhcmdldEluZm8oKSA9IGRlbGV0ZTsKKyAgVGFyZ2V0U3VidGFyZ2V0SW5mbyhjb25zdCBUYXJnZXRTdWJ0YXJnZXRJbmZvICYpID0gZGVsZXRlOworICBUYXJnZXRTdWJ0YXJnZXRJbmZvICZvcGVyYXRvcj0oY29uc3QgVGFyZ2V0U3VidGFyZ2V0SW5mbyAmKSA9IGRlbGV0ZTsKKyAgflRhcmdldFN1YnRhcmdldEluZm8oKSBvdmVycmlkZTsKKworICB2aXJ0dWFsIGJvb2wgaXNYUmF5U3VwcG9ydGVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLyBJbnRlcmZhY2VzIHRvIHRoZSBtYWpvciBhc3BlY3RzIG9mIHRhcmdldCBtYWNoaW5lIGluZm9ybWF0aW9uOgorICAvLworICAvLyAtLSBJbnN0cnVjdGlvbiBvcGNvZGUgYW5kIG9wZXJhbmQgaW5mb3JtYXRpb24KKyAgLy8gLS0gUGlwZWxpbmVzIGFuZCBzY2hlZHVsaW5nIGluZm9ybWF0aW9uCisgIC8vIC0tIFN0YWNrIGZyYW1lIGluZm9ybWF0aW9uCisgIC8vIC0tIFNlbGVjdGlvbiBEQUcgbG93ZXJpbmcgaW5mb3JtYXRpb24KKyAgLy8gLS0gQ2FsbCBsb3dlcmluZyBpbmZvcm1hdGlvbgorICAvLworICAvLyBOLkIuIFRoZXNlIG9iamVjdHMgbWF5IGNoYW5nZSBkdXJpbmcgY29tcGlsYXRpb24uIEl0J3Mgbm90IHNhZmUgdG8gY2FjaGUKKyAgLy8gdGhlbSBiZXR3ZWVuIGZ1bmN0aW9ucy4KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRJbnN0ckluZm8gKmdldEluc3RySW5mbygpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRGcmFtZUxvd2VyaW5nICpnZXRGcmFtZUxvd2VyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0TG93ZXJpbmcgKmdldFRhcmdldExvd2VyaW5nKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQorICB2aXJ0dWFsIGNvbnN0IFNlbGVjdGlvbkRBR1RhcmdldEluZm8gKmdldFNlbGVjdGlvbkRBR0luZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgdmlydHVhbCBjb25zdCBDYWxsTG93ZXJpbmcgKmdldENhbGxMb3dlcmluZygpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KKworICAvLyBGSVhNRTogVGhpcyBsZXRzIHRhcmdldHMgc3BlY2lhbGl6ZSB0aGUgc2VsZWN0b3IgYnkgc3VidGFyZ2V0ICh3aGljaCBsZXRzCisgIC8vIHVzIGRvIHRoaW5ncyBsaWtlIGEgZGVkaWNhdGVkIGF2eDUxMiBzZWxlY3RvcikuICBIb3dldmVyLCB3ZSBtaWdodCB3YW50CisgIC8vIHRvIGFsc28gc3BlY2lhbGl6ZSBzZWxlY3RvcnMgYnkgTWFjaGluZUZ1bmN0aW9uLCB3aGljaCB3b3VsZCBsZXQgdXMgYmUKKyAgLy8gYXdhcmUgb2Ygb3B0c2l6ZS9vcHRub25lIGFuZCBzdWNoLgorICB2aXJ0dWFsIGNvbnN0IEluc3RydWN0aW9uU2VsZWN0b3IgKmdldEluc3RydWN0aW9uU2VsZWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB2aXJ0dWFsIHVuc2lnbmVkIGdldEh3TW9kZSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKworICAvLy8gVGFyZ2V0IGNhbiBzdWJjbGFzcyB0aGlzIGhvb2sgdG8gc2VsZWN0IGEgZGlmZmVyZW50IERBRyBzY2hlZHVsZXIuCisgIHZpcnR1YWwgUmVnaXN0ZXJTY2hlZHVsZXI6OkZ1bmN0aW9uUGFzc0N0b3IKKyAgICAgIGdldERBR1NjaGVkdWxlcihDb2RlR2VuT3B0OjpMZXZlbCkgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgdmlydHVhbCBjb25zdCBMZWdhbGl6ZXJJbmZvICpnZXRMZWdhbGl6ZXJJbmZvKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgIC8vLyBnZXRSZWdpc3RlckluZm8gLSBJZiByZWdpc3RlciBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUsIHJldHVybiBpdC4gIElmCisgIC8vLyBub3QsIHJldHVybiBudWxsLgorICB2aXJ0dWFsIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqZ2V0UmVnaXN0ZXJJbmZvKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgIC8vLyBJZiB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSByZWdpc3RlciBiYW5rcyBpcyBhdmFpbGFibGUsIHJldHVybiBpdC4KKyAgLy8vIE90aGVyd2lzZSByZXR1cm4gbnVsbHB0ci4KKyAgdmlydHVhbCBjb25zdCBSZWdpc3RlckJhbmtJbmZvICpnZXRSZWdCYW5rSW5mbygpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KKworICAvLy8gZ2V0SW5zdHJJdGluZXJhcnlEYXRhIC0gUmV0dXJucyBpbnN0cnVjdGlvbiBpdGluZXJhcnkgZGF0YSBmb3IgdGhlIHRhcmdldAorICAvLy8gb3Igc3BlY2lmaWMgc3VidGFyZ2V0LgorICB2aXJ0dWFsIGNvbnN0IEluc3RySXRpbmVyYXJ5RGF0YSAqZ2V0SW5zdHJJdGluZXJhcnlEYXRhKCkgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFJlc29sdmUgYSBTY2hlZENsYXNzIGF0IHJ1bnRpbWUsIHdoZXJlIFNjaGVkQ2xhc3MgaWRlbnRpZmllcyBhbgorICAvLy8gTUNTY2hlZENsYXNzRGVzYyB3aXRoIHRoZSBpc1ZhcmlhbnQgcHJvcGVydHkuIFRoaXMgbWF5IHJldHVybiB0aGUgSUQgb2YKKyAgLy8vIGFub3RoZXIgdmFyaWFudCBTY2hlZENsYXNzLCBidXQgcmVwZWF0ZWQgaW52b2NhdGlvbiBtdXN0IHF1aWNrbHkgdGVybWluYXRlCisgIC8vLyBpbiBhIG5vbnZhcmlhbnQgU2NoZWRDbGFzcy4KKyAgdmlydHVhbCB1bnNpZ25lZCByZXNvbHZlU2NoZWRDbGFzcyh1bnNpZ25lZCBTY2hlZENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0U2NoZWRNb2RlbCAqU2NoZWRNb2RlbCkgY29uc3QgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoZSBzdWJ0YXJnZXQgc2hvdWxkIHJ1biBNYWNoaW5lU2NoZWR1bGVyIGFmdGVyIGFnZ3Jlc3NpdmUKKyAgLy8vIGNvYWxlc2NpbmcuCisgIC8vLworICAvLy8gVGhpcyBjdXJyZW50bHkgcmVwbGFjZXMgdGhlIFNlbGVjdGlvbkRBRyBzY2hlZHVsZXIgd2l0aCB0aGUgInNvdXJjZSIgb3JkZXIKKyAgLy8vIHNjaGVkdWxlciAodGhvdWdoIHNlZSBiZWxvdyBmb3IgYW4gb3B0aW9uIHRvIHR1cm4gdGhpcyBvZmYgYW5kIHVzZSB0aGUKKyAgLy8vIFRhcmdldExvd2VyaW5nIHByZWZlcmVuY2UpLiBJdCBkb2VzIG5vdCB5ZXQgZGlzYWJsZSB0aGUgcG9zdFJBIHNjaGVkdWxlci4KKyAgdmlydHVhbCBib29sIGVuYWJsZU1hY2hpbmVTY2hlZHVsZXIoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFN1cHBvcnQgcHJpbnRpbmcgb2YgW2xhdGVuY3k6dGhyb3VnaHB1dF0gY29tbWVudCBpbiBvdXRwdXQgLlMgZmlsZS4KKyAgdmlydHVhbCBib29sIHN1cHBvcnRQcmludFNjaGVkSW5mbygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoZSBtYWNoaW5lIHNjaGVkdWxlciBzaG91bGQgZGlzYWJsZSB0aGUgVExJIHByZWZlcmVuY2UKKyAgLy8vIGZvciBwcmVSQSBzY2hlZHVsaW5nIHdpdGggdGhlIHNvdXJjZSBsZXZlbCBzY2hlZHVsZXIuCisgIHZpcnR1YWwgYm9vbCBlbmFibGVNYWNoaW5lU2NoZWREZWZhdWx0U2NoZWQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoZSBzdWJ0YXJnZXQgc2hvdWxkIGVuYWJsZSBqb2luaW5nIGdsb2JhbCBjb3BpZXMuCisgIC8vLworICAvLy8gQnkgZGVmYXVsdCB0aGlzIGlzIGVuYWJsZWQgaWYgdGhlIG1hY2hpbmUgc2NoZWR1bGVyIGlzIGVuYWJsZWQsIGJ1dAorICAvLy8gY2FuIGJlIG92ZXJyaWRkZW4uCisgIHZpcnR1YWwgYm9vbCBlbmFibGVKb2luR2xvYmFsQ29waWVzKCkgY29uc3Q7CisKKyAgLy8vIFRydWUgaWYgdGhlIHN1YnRhcmdldCBzaG91bGQgcnVuIGEgc2NoZWR1bGVyIGFmdGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24uCisgIC8vLworICAvLy8gQnkgZGVmYXVsdCB0aGlzIHF1ZXJpZXMgdGhlIFBvc3RSQVNjaGVkdWxpbmcgYml0IGluIHRoZSBzY2hlZHVsaW5nIG1vZGVsCisgIC8vLyB3aGljaCBpcyB0aGUgcHJlZmVycmVkIHdheSB0byBpbmZsdWVuY2UgdGhpcy4KKyAgdmlydHVhbCBib29sIGVuYWJsZVBvc3RSQVNjaGVkdWxlcigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGUgc3VidGFyZ2V0IHNob3VsZCBydW4gdGhlIGF0b21pYyBleHBhbnNpb24gcGFzcy4KKyAgdmlydHVhbCBib29sIGVuYWJsZUF0b21pY0V4cGFuZCgpIGNvbnN0OworCisgIC8vLyBUcnVlIGlmIHRoZSBzdWJ0YXJnZXQgc2hvdWxkIHJ1biB0aGUgaW5kaXJlY3RiciBleHBhbnNpb24gcGFzcy4KKyAgdmlydHVhbCBib29sIGVuYWJsZUluZGlyZWN0QnJFeHBhbmQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIE92ZXJyaWRlIGdlbmVyaWMgc2NoZWR1bGluZyBwb2xpY3kgd2l0aGluIGEgcmVnaW9uLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW50IHdheSBmb3IgdGFyZ2V0cyB0aGF0IGRvbid0IHByb3ZpZGUgYW55IGN1c3RvbQorICAvLy8gc2NoZWR1bGluZyBoZXVyaXN0aWNzIChubyBjdXN0b20gTWFjaGluZVNjaGVkU3RyYXRlZ3kpIHRvIG1ha2UKKyAgLy8vIGNoYW5nZXMgdG8gdGhlIGdlbmVyaWMgc2NoZWR1bGluZyBwb2xpY3kuCisgIHZpcnR1YWwgdm9pZCBvdmVycmlkZVNjaGVkUG9saWN5KE1hY2hpbmVTY2hlZFBvbGljeSAmUG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1SZWdpb25JbnN0cnMpIGNvbnN0IHt9CisKKyAgLy8gXGJyaWVmIFBlcmZvcm0gdGFyZ2V0IHNwZWNpZmljIGFkanVzdG1lbnRzIHRvIHRoZSBsYXRlbmN5IG9mIGEgc2NoZWR1bGUKKyAgLy8gZGVwZW5kZW5jeS4KKyAgdmlydHVhbCB2b2lkIGFkanVzdFNjaGVkRGVwZW5kZW5jeShTVW5pdCAqZGVmLCBTVW5pdCAqdXNlLCBTRGVwICZkZXApIGNvbnN0IHt9CisKKyAgLy8gRm9yIHVzZSB3aXRoIFBvc3RSQVNjaGVkdWxpbmc6IGdldCB0aGUgYW50aS1kZXBlbmRlbmNlIGJyZWFraW5nIHRoYXQgc2hvdWxkCisgIC8vIGJlIHBlcmZvcm1lZCBiZWZvcmUgcG9zdC1SQSBzY2hlZHVsaW5nLgorICB2aXJ0dWFsIEFudGlEZXBCcmVha01vZGUgZ2V0QW50aURlcEJyZWFrTW9kZSgpIGNvbnN0IHsgcmV0dXJuIEFOVElERVBfTk9ORTsgfQorCisgIC8vIEZvciB1c2Ugd2l0aCBQb3N0UkFTY2hlZHVsaW5nOiBpbiBDcml0aWNhbFBhdGhSQ3MsIHJldHVybiBhbnkgcmVnaXN0ZXIKKyAgLy8gY2xhc3NlcyB0aGF0IHNob3VsZCBvbmx5IGJlIGNvbnNpZGVyZWQgZm9yIGFudGktZGVwZW5kZW5jZSBicmVha2luZyBpZiB0aGV5CisgIC8vIGFyZSBvbiB0aGUgY3JpdGljYWwgcGF0aC4KKyAgdmlydHVhbCB2b2lkIGdldENyaXRpY2FsUGF0aFJDcyhSZWdDbGFzc1ZlY3RvciAmQ3JpdGljYWxQYXRoUkNzKSBjb25zdCB7CisgICAgcmV0dXJuIENyaXRpY2FsUGF0aFJDcy5jbGVhcigpOworICB9CisKKyAgLy8gXGJyaWVmIFByb3ZpZGUgYW4gb3JkZXJlZCBsaXN0IG9mIHNjaGVkdWxlIERBRyBtdXRhdGlvbnMgZm9yIHRoZSBwb3N0LVJBCisgIC8vIHNjaGVkdWxlci4KKyAgdmlydHVhbCB2b2lkIGdldFBvc3RSQU11dGF0aW9ucygKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxTY2hlZHVsZURBR011dGF0aW9uPj4gJk11dGF0aW9ucykgY29uc3QgeworICB9CisKKyAgLy8gXGJyaWVmIFByb3ZpZGUgYW4gb3JkZXJlZCBsaXN0IG9mIHNjaGVkdWxlIERBRyBtdXRhdGlvbnMgZm9yIHRoZSBtYWNoaW5lCisgIC8vIHBpcGVsaW5lci4KKyAgdmlydHVhbCB2b2lkIGdldFNNU011dGF0aW9ucygKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxTY2hlZHVsZURBR011dGF0aW9uPj4gJk11dGF0aW9ucykgY29uc3QgeworICB9CisKKyAgLy8gRm9yIHVzZSB3aXRoIFBvc3RSQVNjaGVkdWxpbmc6IGdldCB0aGUgbWluaW11bSBvcHRpbWl6YXRpb24gbGV2ZWwgbmVlZGVkCisgIC8vIHRvIGVuYWJsZSBwb3N0LVJBIHNjaGVkdWxpbmcuCisgIHZpcnR1YWwgQ29kZUdlbk9wdDo6TGV2ZWwgZ2V0T3B0TGV2ZWxUb0VuYWJsZVBvc3RSQVNjaGVkdWxlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29kZUdlbk9wdDo6RGVmYXVsdDsKKyAgfQorCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGUgc3VidGFyZ2V0IHNob3VsZCBydW4gdGhlIGxvY2FsIHJlYXNzaWdubWVudAorICAvLy8gaGV1cmlzdGljIG9mIHRoZSByZWdpc3RlciBhbGxvY2F0b3IuCisgIC8vLyBUaGlzIGhldXJpc3RpYyBtYXkgYmUgY29tcGlsZSB0aW1lIGludGVuc2l2ZSwgXHAgT3B0TGV2ZWwgcHJvdmlkZXMKKyAgLy8vIGEgZmluZXIgZ3JhaW4gdG8gdHVuZSB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yLgorICB2aXJ0dWFsIGJvb2wgZW5hYmxlUkFMb2NhbFJlYXNzaWdubWVudChDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoZSBzdWJ0YXJnZXQgc2hvdWxkIGNvbnNpZGVyIHRoZSBjb3N0IG9mIGxvY2FsIGludGVydmFscworICAvLy8gY3JlYXRlZCBieSBhIHNwbGl0IGNhbmRpZGF0ZSB3aGVuIGNob29zaW5nIHRoZSBiZXN0IHNwbGl0IGNhbmRpZGF0ZS4gVGhpcworICAvLy8gaGV1cmlzdGljIG1heSBiZSBjb21waWxlIHRpbWUgaW50ZW5zaXZlLgorICB2aXJ0dWFsIGJvb2wgZW5hYmxlQWR2YW5jZWRSQVNwbGl0Q29zdCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRW5hYmxlIHVzZSBvZiBhbGlhcyBhbmFseXNpcyBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIChkdXJpbmcgTUkKKyAgLy8vIHNjaGVkdWxpbmcsIERBR0NvbWJpbmUsIGV0Yy4pLgorICB2aXJ0dWFsIGJvb2wgdXNlQUEoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEVuYWJsZSB0aGUgdXNlIG9mIHRoZSBlYXJseSBpZiBjb252ZXJzaW9uIHBhc3MuCisgIHZpcnR1YWwgYm9vbCBlbmFibGVFYXJseUlmQ29udmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gUEJRUENvbnN0cmFpbnQocykgZm9yIHRoZSB0YXJnZXQuCisgIC8vLworICAvLy8gT3ZlcnJpZGUgdG8gcHJvdmlkZSBjdXN0b20gUEJRUCBjb25zdHJhaW50cy4KKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8UEJRUFJBQ29uc3RyYWludD4gZ2V0Q3VzdG9tUEJRUENvbnN0cmFpbnRzKCkgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIEVuYWJsZSB0cmFja2luZyBvZiBzdWJyZWdpc3RlciBsaXZlbmVzcyBpbiByZWdpc3RlciBhbGxvY2F0b3IuCisgIC8vLyBQbGVhc2UgdXNlIE1hY2hpbmVSZWdpc3RlckluZm86OnN1YlJlZ0xpdmVuZXNzRW5hYmxlZCgpIGluc3RlYWQgd2hlcmUKKyAgLy8vIHBvc3NpYmxlLgorICB2aXJ0dWFsIGJvb2wgZW5hYmxlU3ViUmVnTGl2ZW5lc3MoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBSZXR1cm5zIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBzY2hlZHVsZXIgY29tbWVudAorICBzdGQ6OnN0cmluZyBnZXRTY2hlZEluZm9TdHIoY29uc3QgTWFjaGluZUluc3RyICZNSSkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldFNjaGVkSW5mb1N0cihNQ0luc3QgY29uc3QgJk1DSSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGEgLm1pciBmaWxlIHdhcyBsb2FkZWQuCisgIHZpcnR1YWwgdm9pZCBtaXJGaWxlTG9hZGVkKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9UQVJHRVRTVUJUQVJHRVRJTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9VbnJlYWNoYWJsZUJsb2NrRWxpbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1VucmVhY2hhYmxlQmxvY2tFbGltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U3YWZkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9VbnJlYWNoYWJsZUJsb2NrRWxpbS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vPT09LS0gVW5yZWFjaGFibGVCbG9ja0VsaW0uaCAtIFJlbW92ZSB1bnJlYWNoYWJsZSBibG9ja3MgZm9yIGNvZGVnZW4gLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBpcyBhbiBleHRyZW1lbHkgc2ltcGxlIHZlcnNpb24gb2YgdGhlIFNpbXBsaWZ5Q0ZHIHBhc3MuICBJdHMgc29sZQorLy8gam9iIGlzIHRvIGRlbGV0ZSBMTFZNIGJhc2ljIGJsb2NrcyB0aGF0IGFyZSBub3QgcmVhY2hhYmxlIGZyb20gdGhlIGVudHJ5CisvLyBub2RlLiAgVG8gZG8gdGhpcywgaXQgcGVyZm9ybXMgYSBzaW1wbGUgZGVwdGggZmlyc3QgdHJhdmVyc2FsIG9mIHRoZSBDRkcsCisvLyB0aGVuIGRlbGV0ZXMgYW55IHVudmlzaXRlZCBub2Rlcy4KKy8vCisvLyBOb3RlIHRoYXQgdGhpcyBwYXNzIGlzIHJlYWxseSBhIGhhY2suICBJbiBwYXJ0aWN1bGFyLCB0aGUgaW5zdHJ1Y3Rpb24KKy8vIHNlbGVjdG9ycyBmb3IgdmFyaW91cyB0YXJnZXRzIHNob3VsZCBqdXN0IG5vdCBnZW5lcmF0ZSBjb2RlIGZvciB1bnJlYWNoYWJsZQorLy8gYmxvY2tzLiAgVW50aWwgTExWTSBoYXMgYSBtb3JlIHN5c3RlbWF0aWMgd2F5IG9mIGRlZmluaW5nIGluc3RydWN0aW9uCisvLyBzZWxlY3RvcnMsIGhvd2V2ZXIsIHdlIGNhbm5vdCByZWFsbHkgZXhwZWN0IHRoZW0gdG8gaGFuZGxlIGFkZGl0aW9uYWwKKy8vIGNvbXBsZXhpdHkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0xJQl9DT0RFR0VOX1VOUkVBQ0hBQkxFQkxPQ0tFTElNX0gKKyNkZWZpbmUgTExWTV9MSUJfQ09ERUdFTl9VTlJFQUNIQUJMRUJMT0NLRUxJTV9ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVW5yZWFjaGFibGVCbG9ja0VsaW1QYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxVbnJlYWNoYWJsZUJsb2NrRWxpbVBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0xJQl9DT0RFR0VOX1VOUkVBQ0hBQkxFQkxPQ0tFTElNX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9WYWx1ZVR5cGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZWY0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy5oCkBAIC0wLDAgKzEsNDM3IEBACisvLz09PS0gQ29kZUdlbi9WYWx1ZVR5cGVzLmggLSBMb3ctTGV2ZWwgVGFyZ2V0IGluZGVwZW5kLiB0eXBlcyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBzZXQgb2YgbG93LWxldmVsIHRhcmdldCBpbmRlcGVuZGVudCB0eXBlcyB3aGljaCB2YXJpb3VzCisvLyB2YWx1ZXMgaW4gdGhlIGNvZGUgZ2VuZXJhdG9yIGFyZS4gIFRoaXMgYWxsb3dzIHRoZSB0YXJnZXQgc3BlY2lmaWMgYmVoYXZpb3IKKy8vIG9mIGluc3RydWN0aW9ucyB0byBiZSBkZXNjcmliZWQgdG8gdGFyZ2V0IGluZGVwZW5kZW50IHBhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9WQUxVRVRZUEVTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1ZBTFVFVFlQRVNfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hY2hpbmVWYWx1ZVR5cGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBMTFZNQ29udGV4dDsKKyAgY2xhc3MgVHlwZTsKKworICAvLy8gRXh0ZW5kZWQgVmFsdWUgVHlwZS4gQ2FwYWJsZSBvZiBob2xkaW5nIHZhbHVlIHR5cGVzIHdoaWNoIGFyZSBub3QgbmF0aXZlCisgIC8vLyBmb3IgYW55IHByb2Nlc3NvciAoc3VjaCBhcyB0aGUgaTEyMzQ1IHR5cGUpLCBhcyB3ZWxsIGFzIHRoZSB0eXBlcyBhbiBNVlQKKyAgLy8vIGNhbiByZXByZXNlbnQuCisgIHN0cnVjdCBFVlQgeworICBwcml2YXRlOgorICAgIE1WVCBWID0gTVZUOjpJTlZBTElEX1NJTVBMRV9WQUxVRV9UWVBFOworICAgIFR5cGUgKkxMVk1UeSA9IG51bGxwdHI7CisKKyAgcHVibGljOgorICAgIGNvbnN0ZXhwciBFVlQoKSA9IGRlZmF1bHQ7CisgICAgY29uc3RleHByIEVWVChNVlQ6OlNpbXBsZVZhbHVlVHlwZSBTVlQpIDogVihTVlQpIHt9CisgICAgY29uc3RleHByIEVWVChNVlQgUykgOiBWKFMpIHt9CisKKyAgICBib29sIG9wZXJhdG9yPT0oRVZUIFZUKSBjb25zdCB7CisgICAgICByZXR1cm4gISgqdGhpcyAhPSBWVCk7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShFVlQgVlQpIGNvbnN0IHsKKyAgICAgIGlmIChWLlNpbXBsZVR5ICE9IFZULlYuU2ltcGxlVHkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKFYuU2ltcGxlVHkgPT0gTVZUOjpJTlZBTElEX1NJTVBMRV9WQUxVRV9UWVBFKQorICAgICAgICByZXR1cm4gTExWTVR5ICE9IFZULkxMVk1UeTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgRVZUIHRoYXQgcmVwcmVzZW50cyBhIGZsb2F0aW5nLXBvaW50IHR5cGUgd2l0aCB0aGUgZ2l2ZW4KKyAgICAvLy8gbnVtYmVyIG9mIGJpdHMuIFRoZXJlIGFyZSB0d28gZmxvYXRpbmctcG9pbnQgdHlwZXMgd2l0aCAxMjggYml0cyAtIHRoaXMKKyAgICAvLy8gcmV0dXJucyBmMTI4IHJhdGhlciB0aGFuIHBwY2YxMjguCisgICAgc3RhdGljIEVWVCBnZXRGbG9hdGluZ1BvaW50VlQodW5zaWduZWQgQml0V2lkdGgpIHsKKyAgICAgIHJldHVybiBNVlQ6OmdldEZsb2F0aW5nUG9pbnRWVChCaXRXaWR0aCk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIEVWVCB0aGF0IHJlcHJlc2VudHMgYW4gaW50ZWdlciB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2YKKyAgICAvLy8gYml0cy4KKyAgICBzdGF0aWMgRVZUIGdldEludGVnZXJWVChMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgQml0V2lkdGgpIHsKKyAgICAgIE1WVCBNID0gTVZUOjpnZXRJbnRlZ2VyVlQoQml0V2lkdGgpOworICAgICAgaWYgKE0uU2ltcGxlVHkgIT0gTVZUOjpJTlZBTElEX1NJTVBMRV9WQUxVRV9UWVBFKQorICAgICAgICByZXR1cm4gTTsKKyAgICAgIHJldHVybiBnZXRFeHRlbmRlZEludGVnZXJWVChDb250ZXh0LCBCaXRXaWR0aCk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIEVWVCB0aGF0IHJlcHJlc2VudHMgYSB2ZWN0b3IgTnVtRWxlbWVudHMgaW4gbGVuZ3RoLCB3aGVyZQorICAgIC8vLyBlYWNoIGVsZW1lbnQgaXMgb2YgdHlwZSBWVC4KKyAgICBzdGF0aWMgRVZUIGdldFZlY3RvclZUKExMVk1Db250ZXh0ICZDb250ZXh0LCBFVlQgVlQsIHVuc2lnbmVkIE51bUVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1NjYWxhYmxlID0gZmFsc2UpIHsKKyAgICAgIE1WVCBNID0gTVZUOjpnZXRWZWN0b3JWVChWVC5WLCBOdW1FbGVtZW50cywgSXNTY2FsYWJsZSk7CisgICAgICBpZiAoTS5TaW1wbGVUeSAhPSBNVlQ6OklOVkFMSURfU0lNUExFX1ZBTFVFX1RZUEUpCisgICAgICAgIHJldHVybiBNOworCisgICAgICBhc3NlcnQoIUlzU2NhbGFibGUgJiYgIldlIGRvbid0IHN1cHBvcnQgZXh0ZW5kZWQgc2NhbGFibGUgdHlwZXMgeWV0Iik7CisgICAgICByZXR1cm4gZ2V0RXh0ZW5kZWRWZWN0b3JWVChDb250ZXh0LCBWVCwgTnVtRWxlbWVudHMpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBFVlQgdGhhdCByZXByZXNlbnRzIGEgdmVjdG9yIEVDLk1pbiBlbGVtZW50cyBpbiBsZW5ndGgsCisgICAgLy8vIHdoZXJlIGVhY2ggZWxlbWVudCBpcyBvZiB0eXBlIFZULgorICAgIHN0YXRpYyBFVlQgZ2V0VmVjdG9yVlQoTExWTUNvbnRleHQgJkNvbnRleHQsIEVWVCBWVCwgTVZUOjpFbGVtZW50Q291bnQgRUMpIHsKKyAgICAgIE1WVCBNID0gTVZUOjpnZXRWZWN0b3JWVChWVC5WLCBFQyk7CisgICAgICBpZiAoTS5TaW1wbGVUeSAhPSBNVlQ6OklOVkFMSURfU0lNUExFX1ZBTFVFX1RZUEUpCisgICAgICAgIHJldHVybiBNOworICAgICAgYXNzZXJ0ICghRUMuU2NhbGFibGUgJiYgIldlIGRvbid0IHN1cHBvcnQgZXh0ZW5kZWQgc2NhbGFibGUgdHlwZXMgeWV0Iik7CisgICAgICByZXR1cm4gZ2V0RXh0ZW5kZWRWZWN0b3JWVChDb250ZXh0LCBWVCwgRUMuTWluKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIGEgdmVjdG9yIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzIGFzIHRoaXMgdmVjdG9yLCBidXQKKyAgICAvLy8gd2l0aCB0aGUgZWxlbWVudCB0eXBlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyIHR5cGUgd2l0aCB0aGUgc2FtZQorICAgIC8vLyBiaXR3aWR0aC4KKyAgICBFVlQgY2hhbmdlVmVjdG9yRWxlbWVudFR5cGVUb0ludGVnZXIoKSBjb25zdCB7CisgICAgICBpZiAoIWlzU2ltcGxlKCkpIHsKKyAgICAgICAgYXNzZXJ0ICghaXNTY2FsYWJsZVZlY3RvcigpICYmCisgICAgICAgICAgICAgICAgIldlIGRvbid0IHN1cHBvcnQgZXh0ZW5kZWQgc2NhbGFibGUgdHlwZXMgeWV0Iik7CisgICAgICAgIHJldHVybiBjaGFuZ2VFeHRlbmRlZFZlY3RvckVsZW1lbnRUeXBlVG9JbnRlZ2VyKCk7CisgICAgICB9CisgICAgICBNVlQgRWx0VHkgPSBnZXRTaW1wbGVWVCgpLmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgICAgICB1bnNpZ25lZCBCaXRXaWR0aCA9IEVsdFR5LmdldFNpemVJbkJpdHMoKTsKKyAgICAgIE1WVCBJbnRUeSA9IE1WVDo6Z2V0SW50ZWdlclZUKEJpdFdpZHRoKTsKKyAgICAgIE1WVCBWZWNUeSA9IE1WVDo6Z2V0VmVjdG9yVlQoSW50VHksIGdldFZlY3Rvck51bUVsZW1lbnRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2NhbGFibGVWZWN0b3IoKSk7CisgICAgICBhc3NlcnQoVmVjVHkuU2ltcGxlVHkgIT0gTVZUOjpJTlZBTElEX1NJTVBMRV9WQUxVRV9UWVBFICYmCisgICAgICAgICAgICAgIlNpbXBsZSB2ZWN0b3IgVlQgbm90IHJlcHJlc2VudGFibGUgYnkgc2ltcGxlIGludGVnZXIgdmVjdG9yIFZUISIpOworICAgICAgcmV0dXJuIFZlY1R5OworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIHR5cGUgY29udmVydGVkIHRvIGFuIGVxdWl2YWxlbnRseSBzaXplZCBpbnRlZ2VyIG9yIHZlY3RvcgorICAgIC8vLyB3aXRoIGludGVnZXIgZWxlbWVudCB0eXBlLiBTaW1pbGFyIHRvIGNoYW5nZVZlY3RvckVsZW1lbnRUeXBlVG9JbnRlZ2VyLAorICAgIC8vLyBidXQgYWxzbyBoYW5kbGVzIHNjYWxhcnMuCisgICAgRVZUIGNoYW5nZVR5cGVUb0ludGVnZXIoKSB7CisgICAgICBpZiAoaXNWZWN0b3IoKSkKKyAgICAgICAgcmV0dXJuIGNoYW5nZVZlY3RvckVsZW1lbnRUeXBlVG9JbnRlZ2VyKCk7CisKKyAgICAgIGlmIChpc1NpbXBsZSgpKQorICAgICAgICByZXR1cm4gTVZUOjpnZXRJbnRlZ2VyVlQoZ2V0U2l6ZUluQml0cygpKTsKKworICAgICAgcmV0dXJuIGNoYW5nZUV4dGVuZGVkVHlwZVRvSW50ZWdlcigpOworICAgIH0KKworICAgIC8vLyBUZXN0IGlmIHRoZSBnaXZlbiBFVlQgaXMgc2ltcGxlIChhcyBvcHBvc2VkIHRvIGJlaW5nIGV4dGVuZGVkKS4KKyAgICBib29sIGlzU2ltcGxlKCkgY29uc3QgeworICAgICAgcmV0dXJuIFYuU2ltcGxlVHkgIT0gTVZUOjpJTlZBTElEX1NJTVBMRV9WQUxVRV9UWVBFOworICAgIH0KKworICAgIC8vLyBUZXN0IGlmIHRoZSBnaXZlbiBFVlQgaXMgZXh0ZW5kZWQgKGFzIG9wcG9zZWQgdG8gYmVpbmcgc2ltcGxlKS4KKyAgICBib29sIGlzRXh0ZW5kZWQoKSBjb25zdCB7CisgICAgICByZXR1cm4gIWlzU2ltcGxlKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBGUCBvciBhIHZlY3RvciBGUCB0eXBlLgorICAgIGJvb2wgaXNGbG9hdGluZ1BvaW50KCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzU2ltcGxlKCkgPyBWLmlzRmxvYXRpbmdQb2ludCgpIDogaXNFeHRlbmRlZEZsb2F0aW5nUG9pbnQoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBpbnRlZ2VyIG9yIGEgdmVjdG9yIGludGVnZXIgdHlwZS4KKyAgICBib29sIGlzSW50ZWdlcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpc1NpbXBsZSgpID8gVi5pc0ludGVnZXIoKSA6IGlzRXh0ZW5kZWRJbnRlZ2VyKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gaW50ZWdlciwgYnV0IG5vdCBhIHZlY3Rvci4KKyAgICBib29sIGlzU2NhbGFySW50ZWdlcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpc1NpbXBsZSgpID8gVi5pc1NjYWxhckludGVnZXIoKSA6IGlzRXh0ZW5kZWRTY2FsYXJJbnRlZ2VyKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSB2ZWN0b3IgdmFsdWUgdHlwZS4KKyAgICBib29sIGlzVmVjdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzU2ltcGxlKCkgPyBWLmlzVmVjdG9yKCkgOiBpc0V4dGVuZGVkVmVjdG9yKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSB2ZWN0b3IgdHlwZSB3aGVyZSB0aGUgcnVudGltZQorICAgIC8vLyBsZW5ndGggaXMgbWFjaGluZSBkZXBlbmRlbnQKKyAgICBib29sIGlzU2NhbGFibGVWZWN0b3IoKSBjb25zdCB7CisgICAgICAvLyBGSVhNRTogV2UgZG9uJ3Qgc3VwcG9ydCBleHRlbmRlZCBzY2FsYWJsZSB0eXBlcyB5ZXQsIGJlY2F1c2UgdGhlCisgICAgICAvLyBtYXRjaGluZyBJUiB0eXBlIGRvZXNuJ3QgZXhpc3QuIE9uY2UgaXQgaGFzIGJlZW4gYWRkZWQsIHRoaXMgY2FuCisgICAgICAvLyBiZSBjaGFuZ2VkIHRvIGNhbGwgaXNFeHRlbmRlZFNjYWxhYmxlVmVjdG9yLgorICAgICAgaWYgKCFpc1NpbXBsZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gVi5pc1NjYWxhYmxlVmVjdG9yKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSAxNi1iaXQgdmVjdG9yIHR5cGUuCisgICAgYm9vbCBpczE2Qml0VmVjdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzU2ltcGxlKCkgPyBWLmlzMTZCaXRWZWN0b3IoKSA6IGlzRXh0ZW5kZWQxNkJpdFZlY3RvcigpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgMzItYml0IHZlY3RvciB0eXBlLgorICAgIGJvb2wgaXMzMkJpdFZlY3RvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpc1NpbXBsZSgpID8gVi5pczMyQml0VmVjdG9yKCkgOiBpc0V4dGVuZGVkMzJCaXRWZWN0b3IoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIDY0LWJpdCB2ZWN0b3IgdHlwZS4KKyAgICBib29sIGlzNjRCaXRWZWN0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gaXNTaW1wbGUoKSA/IFYuaXM2NEJpdFZlY3RvcigpIDogaXNFeHRlbmRlZDY0Qml0VmVjdG9yKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSAxMjgtYml0IHZlY3RvciB0eXBlLgorICAgIGJvb2wgaXMxMjhCaXRWZWN0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gaXNTaW1wbGUoKSA/IFYuaXMxMjhCaXRWZWN0b3IoKSA6IGlzRXh0ZW5kZWQxMjhCaXRWZWN0b3IoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIDI1Ni1iaXQgdmVjdG9yIHR5cGUuCisgICAgYm9vbCBpczI1NkJpdFZlY3RvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpc1NpbXBsZSgpID8gVi5pczI1NkJpdFZlY3RvcigpIDogaXNFeHRlbmRlZDI1NkJpdFZlY3RvcigpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgNTEyLWJpdCB2ZWN0b3IgdHlwZS4KKyAgICBib29sIGlzNTEyQml0VmVjdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzU2ltcGxlKCkgPyBWLmlzNTEyQml0VmVjdG9yKCkgOiBpc0V4dGVuZGVkNTEyQml0VmVjdG9yKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSAxMDI0LWJpdCB2ZWN0b3IgdHlwZS4KKyAgICBib29sIGlzMTAyNEJpdFZlY3RvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpc1NpbXBsZSgpID8gVi5pczEwMjRCaXRWZWN0b3IoKSA6IGlzRXh0ZW5kZWQxMDI0Qml0VmVjdG9yKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSAyMDQ4LWJpdCB2ZWN0b3IgdHlwZS4KKyAgICBib29sIGlzMjA0OEJpdFZlY3RvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpc1NpbXBsZSgpID8gVi5pczIwNDhCaXRWZWN0b3IoKSA6IGlzRXh0ZW5kZWQyMDQ4Qml0VmVjdG9yKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gb3ZlcmxvYWRlZCB0eXBlIGZvciBUYWJsZUdlbi4KKyAgICBib29sIGlzT3ZlcmxvYWRlZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoVj09TVZUOjppQW55IHx8IFY9PU1WVDo6ZkFueSB8fCBWPT1NVlQ6OnZBbnkgfHwgVj09TVZUOjppUFRSQW55KTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGJpdCBzaXplIGlzIGEgbXVsdGlwbGUgb2YgOC4KKyAgICBib29sIGlzQnl0ZVNpemVkKCkgY29uc3QgeworICAgICAgcmV0dXJuIChnZXRTaXplSW5CaXRzKCkgJiA3KSA9PSAwOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc2l6ZSBpcyBhIHBvd2VyLW9mLXR3byBudW1iZXIgb2YgYnl0ZXMuCisgICAgYm9vbCBpc1JvdW5kKCkgY29uc3QgeworICAgICAgdW5zaWduZWQgQml0U2l6ZSA9IGdldFNpemVJbkJpdHMoKTsKKyAgICAgIHJldHVybiBCaXRTaXplID49IDggJiYgIShCaXRTaXplICYgKEJpdFNpemUgLSAxKSk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaGFzIHRoZSBzYW1lIG51bWJlciBvZiBiaXRzIGFzIFZULgorICAgIGJvb2wgYml0c0VxKEVWVCBWVCkgY29uc3QgeworICAgICAgaWYgKEVWVDo6b3BlcmF0b3I9PShWVCkpIHJldHVybiB0cnVlOworICAgICAgcmV0dXJuIGdldFNpemVJbkJpdHMoKSA9PSBWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaGFzIG1vcmUgYml0cyB0aGFuIFZULgorICAgIGJvb2wgYml0c0dUKEVWVCBWVCkgY29uc3QgeworICAgICAgaWYgKEVWVDo6b3BlcmF0b3I9PShWVCkpIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiBnZXRTaXplSW5CaXRzKCkgPiBWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaGFzIG5vIGxlc3MgYml0cyB0aGFuIFZULgorICAgIGJvb2wgYml0c0dFKEVWVCBWVCkgY29uc3QgeworICAgICAgaWYgKEVWVDo6b3BlcmF0b3I9PShWVCkpIHJldHVybiB0cnVlOworICAgICAgcmV0dXJuIGdldFNpemVJbkJpdHMoKSA+PSBWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaGFzIGxlc3MgYml0cyB0aGFuIFZULgorICAgIGJvb2wgYml0c0xUKEVWVCBWVCkgY29uc3QgeworICAgICAgaWYgKEVWVDo6b3BlcmF0b3I9PShWVCkpIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiBnZXRTaXplSW5CaXRzKCkgPCBWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaGFzIG5vIG1vcmUgYml0cyB0aGFuIFZULgorICAgIGJvb2wgYml0c0xFKEVWVCBWVCkgY29uc3QgeworICAgICAgaWYgKEVWVDo6b3BlcmF0b3I9PShWVCkpIHJldHVybiB0cnVlOworICAgICAgcmV0dXJuIGdldFNpemVJbkJpdHMoKSA8PSBWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgU2ltcGxlVmFsdWVUeXBlIGhlbGQgaW4gdGhlIHNwZWNpZmllZCBzaW1wbGUgRVZULgorICAgIE1WVCBnZXRTaW1wbGVWVCgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpc1NpbXBsZSgpICYmICJFeHBlY3RlZCBhIFNpbXBsZVZhbHVlVHlwZSEiKTsKKyAgICAgIHJldHVybiBWOworICAgIH0KKworICAgIC8vLyBJZiB0aGlzIGlzIGEgdmVjdG9yIHR5cGUsIHJldHVybiB0aGUgZWxlbWVudCB0eXBlLCBvdGhlcndpc2UgcmV0dXJuCisgICAgLy8vIHRoaXMuCisgICAgRVZUIGdldFNjYWxhclR5cGUoKSBjb25zdCB7CisgICAgICByZXR1cm4gaXNWZWN0b3IoKSA/IGdldFZlY3RvckVsZW1lbnRUeXBlKCkgOiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gR2l2ZW4gYSB2ZWN0b3IgdHlwZSwgcmV0dXJuIHRoZSB0eXBlIG9mIGVhY2ggZWxlbWVudC4KKyAgICBFVlQgZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSBjb25zdCB7CisgICAgICBhc3NlcnQoaXNWZWN0b3IoKSAmJiAiSW52YWxpZCB2ZWN0b3IgdHlwZSEiKTsKKyAgICAgIGlmIChpc1NpbXBsZSgpKQorICAgICAgICByZXR1cm4gVi5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICAgICAgcmV0dXJuIGdldEV4dGVuZGVkVmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgICB9CisKKyAgICAvLy8gR2l2ZW4gYSB2ZWN0b3IgdHlwZSwgcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaXQgY29udGFpbnMuCisgICAgdW5zaWduZWQgZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSBjb25zdCB7CisgICAgICBhc3NlcnQoaXNWZWN0b3IoKSAmJiAiSW52YWxpZCB2ZWN0b3IgdHlwZSEiKTsKKyAgICAgIGlmIChpc1NpbXBsZSgpKQorICAgICAgICByZXR1cm4gVi5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgICAgcmV0dXJuIGdldEV4dGVuZGVkVmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICB9CisKKyAgICAvLyBHaXZlbiBhIChwb3NzaWJseSBzY2FsYWJsZSkgdmVjdG9yIHR5cGUsIHJldHVybiB0aGUgRWxlbWVudENvdW50CisgICAgTVZUOjpFbGVtZW50Q291bnQgZ2V0VmVjdG9yRWxlbWVudENvdW50KCkgY29uc3QgeworICAgICAgYXNzZXJ0KChpc1ZlY3RvcigpKSAmJiAiSW52YWxpZCB2ZWN0b3IgdHlwZSEiKTsKKyAgICAgIGlmIChpc1NpbXBsZSgpKQorICAgICAgICByZXR1cm4gVi5nZXRWZWN0b3JFbGVtZW50Q291bnQoKTsKKworICAgICAgYXNzZXJ0KCFpc1NjYWxhYmxlVmVjdG9yKCkgJiYKKyAgICAgICAgICAgICAiV2UgZG9uJ3Qgc3VwcG9ydCBleHRlbmRlZCBzY2FsYWJsZSB0eXBlcyB5ZXQiKTsKKyAgICAgIHJldHVybiB7Z2V0RXh0ZW5kZWRWZWN0b3JOdW1FbGVtZW50cygpLCBmYWxzZX07CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHR5cGUgaW4gYml0cy4KKyAgICB1bnNpZ25lZCBnZXRTaXplSW5CaXRzKCkgY29uc3QgeworICAgICAgaWYgKGlzU2ltcGxlKCkpCisgICAgICAgIHJldHVybiBWLmdldFNpemVJbkJpdHMoKTsKKyAgICAgIHJldHVybiBnZXRFeHRlbmRlZFNpemVJbkJpdHMoKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXRTY2FsYXJTaXplSW5CaXRzKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFNjYWxhclR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIG92ZXJ3cml0dGVuIGJ5IGEgc3RvcmUgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZQorICAgIC8vLyB0eXBlLgorICAgIHVuc2lnbmVkIGdldFN0b3JlU2l6ZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoZ2V0U2l6ZUluQml0cygpICsgNykgLyA4OworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIG92ZXJ3cml0dGVuIGJ5IGEgc3RvcmUgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZQorICAgIC8vLyB0eXBlLgorICAgIHVuc2lnbmVkIGdldFN0b3JlU2l6ZUluQml0cygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRTdG9yZVNpemUoKSAqIDg7CisgICAgfQorCisgICAgLy8vIFJvdW5kcyB0aGUgYml0LXdpZHRoIG9mIHRoZSBnaXZlbiBpbnRlZ2VyIEVWVCB1cCB0byB0aGUgbmVhcmVzdCBwb3dlciBvZgorICAgIC8vLyB0d28gKGFuZCBhdCBsZWFzdCB0byBlaWdodCksIGFuZCByZXR1cm5zIHRoZSBpbnRlZ2VyIEVWVCB3aXRoIHRoYXQKKyAgICAvLy8gbnVtYmVyIG9mIGJpdHMuCisgICAgRVZUIGdldFJvdW5kSW50ZWdlclR5cGUoTExWTUNvbnRleHQgJkNvbnRleHQpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpc0ludGVnZXIoKSAmJiAhaXNWZWN0b3IoKSAmJiAiSW52YWxpZCBpbnRlZ2VyIHR5cGUhIik7CisgICAgICB1bnNpZ25lZCBCaXRXaWR0aCA9IGdldFNpemVJbkJpdHMoKTsKKyAgICAgIGlmIChCaXRXaWR0aCA8PSA4KQorICAgICAgICByZXR1cm4gRVZUKE1WVDo6aTgpOworICAgICAgcmV0dXJuIGdldEludGVnZXJWVChDb250ZXh0LCAxIDw8IExvZzJfMzJfQ2VpbChCaXRXaWR0aCkpOworICAgIH0KKworICAgIC8vLyBGaW5kcyB0aGUgc21hbGxlc3Qgc2ltcGxlIHZhbHVlIHR5cGUgdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAvLy8gaGFsZiB0aGUgd2lkdGggb2YgdGhpcyBFVlQuIElmIG5vIHNpbXBsZSB2YWx1ZSB0eXBlIGNhbiBiZSBmb3VuZCwgYW4KKyAgICAvLy8gZXh0ZW5kZWQgaW50ZWdlciB2YWx1ZSB0eXBlIG9mIGhhbGYgdGhlIHNpemUgKHJvdW5kZWQgdXApIGlzIHJldHVybmVkLgorICAgIEVWVCBnZXRIYWxmU2l6ZWRJbnRlZ2VyVlQoTExWTUNvbnRleHQgJkNvbnRleHQpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpc0ludGVnZXIoKSAmJiAhaXNWZWN0b3IoKSAmJiAiSW52YWxpZCBpbnRlZ2VyIHR5cGUhIik7CisgICAgICB1bnNpZ25lZCBFVlRTaXplID0gZ2V0U2l6ZUluQml0cygpOworICAgICAgZm9yICh1bnNpZ25lZCBJbnRWVCA9IE1WVDo6RklSU1RfSU5URUdFUl9WQUxVRVRZUEU7CisgICAgICAgICAgSW50VlQgPD0gTVZUOjpMQVNUX0lOVEVHRVJfVkFMVUVUWVBFOyArK0ludFZUKSB7CisgICAgICAgIEVWVCBIYWxmVlQgPSBFVlQoKE1WVDo6U2ltcGxlVmFsdWVUeXBlKUludFZUKTsKKyAgICAgICAgaWYgKEhhbGZWVC5nZXRTaXplSW5CaXRzKCkgKiAyID49IEVWVFNpemUpCisgICAgICAgICAgcmV0dXJuIEhhbGZWVDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBnZXRJbnRlZ2VyVlQoQ29udGV4dCwgKEVWVFNpemUgKyAxKSAvIDIpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gYSBWVCBmb3IgYW4gaW50ZWdlciB2ZWN0b3IgdHlwZSB3aXRoIHRoZSBzaXplIG9mIHRoZQorICAgIC8vLyBlbGVtZW50cyBkb3VibGVkLiBUaGUgdHlwZWQgcmV0dXJuZWQgbWF5IGJlIGFuIGV4dGVuZGVkIHR5cGUuCisgICAgRVZUIHdpZGVuSW50ZWdlclZlY3RvckVsZW1lbnRUeXBlKExMVk1Db250ZXh0ICZDb250ZXh0KSBjb25zdCB7CisgICAgICBFVlQgRWx0VlQgPSBnZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICAgICAgRWx0VlQgPSBFVlQ6OmdldEludGVnZXJWVChDb250ZXh0LCAyICogRWx0VlQuZ2V0U2l6ZUluQml0cygpKTsKKyAgICAgIHJldHVybiBFVlQ6OmdldFZlY3RvclZUKENvbnRleHQsIEVsdFZULCBnZXRWZWN0b3JFbGVtZW50Q291bnQoKSk7CisgICAgfQorCisgICAgLy8gUmV0dXJuIGEgVlQgZm9yIGEgdmVjdG9yIHR5cGUgd2l0aCB0aGUgc2FtZSBlbGVtZW50IHR5cGUgYnV0CisgICAgLy8gaGFsZiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLiBUaGUgdHlwZSByZXR1cm5lZCBtYXkgYmUgYW4KKyAgICAvLyBleHRlbmRlZCB0eXBlLgorICAgIEVWVCBnZXRIYWxmTnVtVmVjdG9yRWxlbWVudHNWVChMTFZNQ29udGV4dCAmQ29udGV4dCkgY29uc3QgeworICAgICAgRVZUIEVsdFZUID0gZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgICAgIGF1dG8gRWx0Q250ID0gZ2V0VmVjdG9yRWxlbWVudENvdW50KCk7CisgICAgICBhc3NlcnQoIShFbHRDbnQuTWluICYgMSkgJiYgIlNwbGl0dGluZyB2ZWN0b3IsIGJ1dCBub3QgaW4gaGFsZiEiKTsKKyAgICAgIHJldHVybiBFVlQ6OmdldFZlY3RvclZUKENvbnRleHQsIEVsdFZULCBFbHRDbnQgLyAyKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB2ZWN0b3IgaXMgYSBwb3dlciBvZiAyLgorICAgIGJvb2wgaXNQb3cyVmVjdG9yVHlwZSgpIGNvbnN0IHsKKyAgICAgIHVuc2lnbmVkIE5FbHRzID0gZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICAgIHJldHVybiAhKE5FbHRzICYgKE5FbHRzIC0gMSkpOworICAgIH0KKworICAgIC8vLyBXaWRlbnMgdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gdmVjdG9yIEVWVCB1cCB0byB0aGUgbmVhcmVzdCBwb3dlciBvZiAyCisgICAgLy8vIGFuZCByZXR1cm5zIHRoYXQgdHlwZS4KKyAgICBFVlQgZ2V0UG93MlZlY3RvclR5cGUoTExWTUNvbnRleHQgJkNvbnRleHQpIGNvbnN0IHsKKyAgICAgIGlmICghaXNQb3cyVmVjdG9yVHlwZSgpKSB7CisgICAgICAgIHVuc2lnbmVkIE5FbHRzID0gZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICAgICAgdW5zaWduZWQgUG93Mk5FbHRzID0gMSA8PCAgTG9nMl8zMl9DZWlsKE5FbHRzKTsKKyAgICAgICAgcmV0dXJuIEVWVDo6Z2V0VmVjdG9yVlQoQ29udGV4dCwgZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSwgUG93Mk5FbHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NjYWxhYmxlVmVjdG9yKCkpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHZhbHVlIHR5cGUgYXMgYSBzdHJpbmcsIGUuZy4gImkzMiIuCisgICAgc3RkOjpzdHJpbmcgZ2V0RVZUU3RyaW5nKCkgY29uc3Q7CisKKyAgICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyBhbiBMTFZNIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEVWVC4KKyAgICAvLy8gRm9yIGludGVnZXIgdHlwZXMsIHRoaXMgcmV0dXJucyBhbiB1bnNpZ25lZCB0eXBlLiBOb3RlIHRoYXQgdGhpcyB3aWxsCisgICAgLy8vIGFib3J0IGZvciB0eXBlcyB0aGF0IGNhbm5vdCBiZSByZXByZXNlbnRlZC4KKyAgICBUeXBlICpnZXRUeXBlRm9yRVZUKExMVk1Db250ZXh0ICZDb250ZXh0KSBjb25zdDsKKworICAgIC8vLyBSZXR1cm4gdGhlIHZhbHVlIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgLy8vIFRoaXMgcmV0dXJucyBhbGwgcG9pbnRlcnMgYXMgaVBUUi4gIElmIEhhbmRsZVVua25vd24gaXMgdHJ1ZSwgdW5rbm93bgorICAgIC8vLyB0eXBlcyBhcmUgcmV0dXJuZWQgYXMgT3RoZXIsIG90aGVyd2lzZSB0aGV5IGFyZSBpbnZhbGlkLgorICAgIHN0YXRpYyBFVlQgZ2V0RVZUKFR5cGUgKlR5LCBib29sIEhhbmRsZVVua25vd24gPSBmYWxzZSk7CisKKyAgICBpbnRwdHJfdCBnZXRSYXdCaXRzKCkgY29uc3QgeworICAgICAgaWYgKGlzU2ltcGxlKCkpCisgICAgICAgIHJldHVybiBWLlNpbXBsZVR5OworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gKGludHB0cl90KShMTFZNVHkpOworICAgIH0KKworICAgIC8vLyBBIG1lYW5pbmdsZXNzIGJ1dCB3ZWxsLWJlaGF2ZWQgb3JkZXIsIHVzZWZ1bCBmb3IgY29uc3RydWN0aW5nCisgICAgLy8vIGNvbnRhaW5lcnMuCisgICAgc3RydWN0IGNvbXBhcmVSYXdCaXRzIHsKKyAgICAgIGJvb2wgb3BlcmF0b3IoKShFVlQgTCwgRVZUIFIpIGNvbnN0IHsKKyAgICAgICAgaWYgKEwuVi5TaW1wbGVUeSA9PSBSLlYuU2ltcGxlVHkpCisgICAgICAgICAgcmV0dXJuIEwuTExWTVR5IDwgUi5MTFZNVHk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gTC5WLlNpbXBsZVR5IDwgUi5WLlNpbXBsZVR5OworICAgICAgfQorICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICAvLyBNZXRob2RzIGZvciBoYW5kbGluZyB0aGUgRXh0ZW5kZWQtdHlwZSBjYXNlIGluIGZ1bmN0aW9ucyBhYm92ZS4KKyAgICAvLyBUaGVzZSBhcmUgYWxsIG91dC1vZi1saW5lIHRvIHByZXZlbnQgdXNlcnMgb2YgdGhpcyBoZWFkZXIgZmlsZQorICAgIC8vIGZyb20gaGF2aW5nIGEgZGVwZW5kZW5jeSBvbiBUeXBlLmguCisgICAgRVZUIGNoYW5nZUV4dGVuZGVkVHlwZVRvSW50ZWdlcigpIGNvbnN0OworICAgIEVWVCBjaGFuZ2VFeHRlbmRlZFZlY3RvckVsZW1lbnRUeXBlVG9JbnRlZ2VyKCkgY29uc3Q7CisgICAgc3RhdGljIEVWVCBnZXRFeHRlbmRlZEludGVnZXJWVChMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQml0V2lkdGgpOworICAgIHN0YXRpYyBFVlQgZ2V0RXh0ZW5kZWRWZWN0b3JWVChMTFZNQ29udGV4dCAmQywgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1FbGVtZW50cyk7CisgICAgYm9vbCBpc0V4dGVuZGVkRmxvYXRpbmdQb2ludCgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgICAgYm9vbCBpc0V4dGVuZGVkSW50ZWdlcigpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgICAgYm9vbCBpc0V4dGVuZGVkU2NhbGFySW50ZWdlcigpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgICAgYm9vbCBpc0V4dGVuZGVkVmVjdG9yKCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgICBib29sIGlzRXh0ZW5kZWQxNkJpdFZlY3RvcigpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgICAgYm9vbCBpc0V4dGVuZGVkMzJCaXRWZWN0b3IoKSBjb25zdCBMTFZNX1JFQURPTkxZOworICAgIGJvb2wgaXNFeHRlbmRlZDY0Qml0VmVjdG9yKCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgICBib29sIGlzRXh0ZW5kZWQxMjhCaXRWZWN0b3IoKSBjb25zdCBMTFZNX1JFQURPTkxZOworICAgIGJvb2wgaXNFeHRlbmRlZDI1NkJpdFZlY3RvcigpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgICAgYm9vbCBpc0V4dGVuZGVkNTEyQml0VmVjdG9yKCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgICBib29sIGlzRXh0ZW5kZWQxMDI0Qml0VmVjdG9yKCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgICBib29sIGlzRXh0ZW5kZWQyMDQ4Qml0VmVjdG9yKCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgICBFVlQgZ2V0RXh0ZW5kZWRWZWN0b3JFbGVtZW50VHlwZSgpIGNvbnN0OworICAgIHVuc2lnbmVkIGdldEV4dGVuZGVkVmVjdG9yTnVtRWxlbWVudHMoKSBjb25zdCBMTFZNX1JFQURPTkxZOworICAgIHVuc2lnbmVkIGdldEV4dGVuZGVkU2l6ZUluQml0cygpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fVkFMVUVUWVBFU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy50ZCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9WYWx1ZVR5cGVzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3M2VlYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy50ZApAQCAtMCwwICsxLDE2OSBAQAorLy89PT0tIFZhbHVlVHlwZXMudGQgLSBWYWx1ZVR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBWYWx1ZSB0eXBlcyAtIFRoZXNlIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSByZWdpc3RlciB0eXBlcyBkZWZpbmVkIGluIHRoZQorLy8gVmFsdWVUeXBlcy5oIGZpbGUuICBJZiB5b3UgdXBkYXRlIGFueXRoaW5nIGhlcmUsIHlvdSBtdXN0IHVwZGF0ZSBpdCB0aGVyZSBhcworLy8gd2VsbCEKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBWYWx1ZVR5cGU8aW50IHNpemUsIGludCB2YWx1ZT4geworICBzdHJpbmcgTmFtZXNwYWNlID0gIk1WVCI7CisgIGludCBTaXplID0gc2l6ZTsKKyAgaW50IFZhbHVlID0gdmFsdWU7Cit9CisKK2RlZiBPdGhlclZUOiBWYWx1ZVR5cGU8MCAgLCAgMT47ICAgLy8gIk90aGVyIiB2YWx1ZQorZGVmIGkxICAgICA6IFZhbHVlVHlwZTwxICAsICAyPjsgICAvLyBPbmUgYml0IGJvb2xlYW4gdmFsdWUKK2RlZiBpOCAgICAgOiBWYWx1ZVR5cGU8OCAgLCAgMz47ICAgLy8gOC1iaXQgaW50ZWdlciB2YWx1ZQorZGVmIGkxNiAgICA6IFZhbHVlVHlwZTwxNiAsICA0PjsgICAvLyAxNi1iaXQgaW50ZWdlciB2YWx1ZQorZGVmIGkzMiAgICA6IFZhbHVlVHlwZTwzMiAsICA1PjsgICAvLyAzMi1iaXQgaW50ZWdlciB2YWx1ZQorZGVmIGk2NCAgICA6IFZhbHVlVHlwZTw2NCAsICA2PjsgICAvLyA2NC1iaXQgaW50ZWdlciB2YWx1ZQorZGVmIGkxMjggICA6IFZhbHVlVHlwZTwxMjgsICA3PjsgICAvLyAxMjgtYml0IGludGVnZXIgdmFsdWUKK2RlZiBmMTYgICAgOiBWYWx1ZVR5cGU8MTYgLCAgOD47ICAgLy8gMTYtYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlCitkZWYgZjMyICAgIDogVmFsdWVUeXBlPDMyICwgIDk+OyAgIC8vIDMyLWJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZQorZGVmIGY2NCAgICA6IFZhbHVlVHlwZTw2NCAsIDEwPjsgICAvLyA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUKK2RlZiBmODAgICAgOiBWYWx1ZVR5cGU8ODAgLCAxMT47ICAgLy8gODAtYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlCitkZWYgZjEyOCAgIDogVmFsdWVUeXBlPDEyOCwgMTI+OyAgIC8vIDEyOC1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUKK2RlZiBwcGNmMTI4OiBWYWx1ZVR5cGU8MTI4LCAxMz47ICAgLy8gUFBDIDEyOC1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUKKworZGVmIHYxaTEgICA6IFZhbHVlVHlwZTwxICwgIDE0PjsgICAvLyAgIDEgeCBpMSB2ZWN0b3IgdmFsdWUKK2RlZiB2MmkxICAgOiBWYWx1ZVR5cGU8MiAsICAxNT47ICAgLy8gICAyIHggaTEgdmVjdG9yIHZhbHVlCitkZWYgdjRpMSAgIDogVmFsdWVUeXBlPDQgLCAgMTY+OyAgIC8vICAgNCB4IGkxIHZlY3RvciB2YWx1ZQorZGVmIHY4aTEgICA6IFZhbHVlVHlwZTw4ICwgIDE3PjsgICAvLyAgIDggeCBpMSB2ZWN0b3IgdmFsdWUKK2RlZiB2MTZpMSAgOiBWYWx1ZVR5cGU8MTYsICAxOD47ICAgLy8gIDE2IHggaTEgdmVjdG9yIHZhbHVlCitkZWYgdjMyaTEgIDogVmFsdWVUeXBlPDMyICwgMTk+OyAgIC8vICAzMiB4IGkxIHZlY3RvciB2YWx1ZQorZGVmIHY2NGkxICA6IFZhbHVlVHlwZTw2NCAsIDIwPjsgICAvLyAgNjQgeCBpMSB2ZWN0b3IgdmFsdWUKK2RlZiB2MTI4aTEgOiBWYWx1ZVR5cGU8MTI4LCAyMT47ICAgLy8gMTI4IHggaTEgdmVjdG9yIHZhbHVlCitkZWYgdjUxMmkxIDogVmFsdWVUeXBlPDUxMiwgMjI+OyAgIC8vIDUxMiB4IGkxIHZlY3RvciB2YWx1ZQorZGVmIHYxMDI0aTE6IFZhbHVlVHlwZTwxMDI0LDIzPjsgICAvLzEwMjQgeCBpMSB2ZWN0b3IgdmFsdWUKKworZGVmIHYxaTggICA6IFZhbHVlVHlwZTw4LCAgIDI0PjsgICAvLyAgMSB4IGk4ICB2ZWN0b3IgdmFsdWUKK2RlZiB2Mmk4ICAgOiBWYWx1ZVR5cGU8MTYgLCAyNT47ICAgLy8gIDIgeCBpOCAgdmVjdG9yIHZhbHVlCitkZWYgdjRpOCAgIDogVmFsdWVUeXBlPDMyICwgMjY+OyAgIC8vICA0IHggaTggIHZlY3RvciB2YWx1ZQorZGVmIHY4aTggICA6IFZhbHVlVHlwZTw2NCAsIDI3PjsgICAvLyAgOCB4IGk4ICB2ZWN0b3IgdmFsdWUKK2RlZiB2MTZpOCAgOiBWYWx1ZVR5cGU8MTI4LCAyOD47ICAgLy8gMTYgeCBpOCAgdmVjdG9yIHZhbHVlCitkZWYgdjMyaTggIDogVmFsdWVUeXBlPDI1NiwgMjk+OyAgIC8vIDMyIHggaTggIHZlY3RvciB2YWx1ZQorZGVmIHY2NGk4ICA6IFZhbHVlVHlwZTw1MTIsIDMwPjsgICAvLyA2NCB4IGk4ICB2ZWN0b3IgdmFsdWUKK2RlZiB2MTI4aTggOiBWYWx1ZVR5cGU8MTAyNCwzMT47ICAgLy8xMjggeCBpOCAgdmVjdG9yIHZhbHVlCitkZWYgdjI1Nmk4IDogVmFsdWVUeXBlPDIwNDgsMzI+OyAgIC8vMjU2IHggaTggIHZlY3RvciB2YWx1ZQorCitkZWYgdjFpMTYgIDogVmFsdWVUeXBlPDE2ICwgMzM+OyAgIC8vICAxIHggaTE2IHZlY3RvciB2YWx1ZQorZGVmIHYyaTE2ICA6IFZhbHVlVHlwZTwzMiAsIDM0PjsgICAvLyAgMiB4IGkxNiB2ZWN0b3IgdmFsdWUKK2RlZiB2NGkxNiAgOiBWYWx1ZVR5cGU8NjQgLCAzNT47ICAgLy8gIDQgeCBpMTYgdmVjdG9yIHZhbHVlCitkZWYgdjhpMTYgIDogVmFsdWVUeXBlPDEyOCwgMzY+OyAgIC8vICA4IHggaTE2IHZlY3RvciB2YWx1ZQorZGVmIHYxNmkxNiA6IFZhbHVlVHlwZTwyNTYsIDM3PjsgICAvLyAxNiB4IGkxNiB2ZWN0b3IgdmFsdWUKK2RlZiB2MzJpMTYgOiBWYWx1ZVR5cGU8NTEyLCAzOD47ICAgLy8gMzIgeCBpMTYgdmVjdG9yIHZhbHVlCitkZWYgdjY0aTE2IDogVmFsdWVUeXBlPDEwMjQsMzk+OyAgIC8vIDY0IHggaTE2IHZlY3RvciB2YWx1ZQorZGVmIHYxMjhpMTY6IFZhbHVlVHlwZTwyMDQ4LDQwPjsgICAvLzEyOCB4IGkxNiB2ZWN0b3IgdmFsdWUKKworZGVmIHYxaTMyICA6IFZhbHVlVHlwZTwzMiAsIDQxPjsgICAvLyAgMSB4IGkzMiB2ZWN0b3IgdmFsdWUKK2RlZiB2MmkzMiAgOiBWYWx1ZVR5cGU8NjQgLCA0Mj47ICAgLy8gIDIgeCBpMzIgdmVjdG9yIHZhbHVlCitkZWYgdjRpMzIgIDogVmFsdWVUeXBlPDEyOCwgNDM+OyAgIC8vICA0IHggaTMyIHZlY3RvciB2YWx1ZQorZGVmIHY4aTMyICA6IFZhbHVlVHlwZTwyNTYsIDQ0PjsgICAvLyAgOCB4IGkzMiB2ZWN0b3IgdmFsdWUKK2RlZiB2MTZpMzIgOiBWYWx1ZVR5cGU8NTEyLCA0NT47ICAgLy8gMTYgeCBpMzIgdmVjdG9yIHZhbHVlCitkZWYgdjMyaTMyIDogVmFsdWVUeXBlPDEwMjQsNDY+OyAgIC8vIDMyIHggaTMyIHZlY3RvciB2YWx1ZQorZGVmIHY2NGkzMiA6IFZhbHVlVHlwZTwyMDQ4LDQ3PjsgICAvLyA2NCB4IGkzMiB2ZWN0b3IgdmFsdWUKKworZGVmIHYxaTY0ICA6IFZhbHVlVHlwZTw2NCAsIDQ4PjsgICAvLyAgMSB4IGk2NCB2ZWN0b3IgdmFsdWUKK2RlZiB2Mmk2NCAgOiBWYWx1ZVR5cGU8MTI4LCA0OT47ICAgLy8gIDIgeCBpNjQgdmVjdG9yIHZhbHVlCitkZWYgdjRpNjQgIDogVmFsdWVUeXBlPDI1NiwgNTA+OyAgIC8vICA0IHggaTY0IHZlY3RvciB2YWx1ZQorZGVmIHY4aTY0ICA6IFZhbHVlVHlwZTw1MTIsIDUxPjsgICAvLyAgOCB4IGk2NCB2ZWN0b3IgdmFsdWUKK2RlZiB2MTZpNjQgOiBWYWx1ZVR5cGU8MTAyNCw1Mj47ICAgLy8gMTYgeCBpNjQgdmVjdG9yIHZhbHVlCitkZWYgdjMyaTY0IDogVmFsdWVUeXBlPDIwNDgsNTM+OyAgIC8vIDMyIHggaTY0IHZlY3RvciB2YWx1ZQorCitkZWYgdjFpMTI4IDogVmFsdWVUeXBlPDEyOCwgNTQ+OyAgIC8vICAxIHggaTEyOCB2ZWN0b3IgdmFsdWUKKworZGVmIG54djFpMSAgOiBWYWx1ZVR5cGU8MSwgICA1NT47ICAvLyBuIHggIDEgeCBpMSAgdmVjdG9yIHZhbHVlCitkZWYgbnh2MmkxICA6IFZhbHVlVHlwZTwyLCAgIDU2PjsgIC8vIG4geCAgMiB4IGkxICB2ZWN0b3IgdmFsdWUKK2RlZiBueHY0aTEgIDogVmFsdWVUeXBlPDQsICAgNTc+OyAgLy8gbiB4ICA0IHggaTEgIHZlY3RvciB2YWx1ZQorZGVmIG54djhpMSAgOiBWYWx1ZVR5cGU8OCwgICA1OD47ICAvLyBuIHggIDggeCBpMSAgdmVjdG9yIHZhbHVlCitkZWYgbnh2MTZpMSA6IFZhbHVlVHlwZTwxNiwgIDU5PjsgIC8vIG4geCAxNiB4IGkxICB2ZWN0b3IgdmFsdWUKK2RlZiBueHYzMmkxIDogVmFsdWVUeXBlPDMyLCAgNjA+OyAgLy8gbiB4IDMyIHggaTEgIHZlY3RvciB2YWx1ZQorCitkZWYgbnh2MWk4ICA6IFZhbHVlVHlwZTw4LCAgIDYxPjsgIC8vIG4geCAgMSB4IGk4ICB2ZWN0b3IgdmFsdWUKK2RlZiBueHYyaTggIDogVmFsdWVUeXBlPDE2LCAgNjI+OyAgLy8gbiB4ICAyIHggaTggIHZlY3RvciB2YWx1ZQorZGVmIG54djRpOCAgOiBWYWx1ZVR5cGU8MzIsICA2Mz47ICAvLyBuIHggIDQgeCBpOCAgdmVjdG9yIHZhbHVlCitkZWYgbnh2OGk4ICA6IFZhbHVlVHlwZTw2NCwgIDY0PjsgIC8vIG4geCAgOCB4IGk4ICB2ZWN0b3IgdmFsdWUKK2RlZiBueHYxNmk4IDogVmFsdWVUeXBlPDEyOCwgNjU+OyAgLy8gbiB4IDE2IHggaTggIHZlY3RvciB2YWx1ZQorZGVmIG54djMyaTggOiBWYWx1ZVR5cGU8MjU2LCA2Nj47ICAvLyBuIHggMzIgeCBpOCAgdmVjdG9yIHZhbHVlCisKK2RlZiBueHYxaTE2IDogVmFsdWVUeXBlPDE2LCAgNjc+OyAgLy8gbiB4ICAxIHggaTE2IHZlY3RvciB2YWx1ZQorZGVmIG54djJpMTYgOiBWYWx1ZVR5cGU8MzIsICA2OD47ICAvLyBuIHggIDIgeCBpMTYgdmVjdG9yIHZhbHVlCitkZWYgbnh2NGkxNiA6IFZhbHVlVHlwZTw2NCwgIDY5PjsgIC8vIG4geCAgNCB4IGkxNiB2ZWN0b3IgdmFsdWUKK2RlZiBueHY4aTE2IDogVmFsdWVUeXBlPDEyOCwgNzA+OyAgLy8gbiB4ICA4IHggaTE2IHZlY3RvciB2YWx1ZQorZGVmIG54djE2aTE2OiBWYWx1ZVR5cGU8MjU2LCA3MT47ICAvLyBuIHggMTYgeCBpMTYgdmVjdG9yIHZhbHVlCitkZWYgbnh2MzJpMTY6IFZhbHVlVHlwZTw1MTIsIDcyPjsgIC8vIG4geCAzMiB4IGkxNiB2ZWN0b3IgdmFsdWUKKworZGVmIG54djFpMzIgOiBWYWx1ZVR5cGU8MzIsICA3Mz47ICAvLyBuIHggIDEgeCBpMzIgdmVjdG9yIHZhbHVlCitkZWYgbnh2MmkzMiA6IFZhbHVlVHlwZTw2NCwgIDc0PjsgIC8vIG4geCAgMiB4IGkzMiB2ZWN0b3IgdmFsdWUKK2RlZiBueHY0aTMyIDogVmFsdWVUeXBlPDEyOCwgNzU+OyAgLy8gbiB4ICA0IHggaTMyIHZlY3RvciB2YWx1ZQorZGVmIG54djhpMzIgOiBWYWx1ZVR5cGU8MjU2LCA3Nj47ICAvLyBuIHggIDggeCBpMzIgdmVjdG9yIHZhbHVlCitkZWYgbnh2MTZpMzI6IFZhbHVlVHlwZTw1MTIsIDc3PjsgIC8vIG4geCAxNiB4IGkzMiB2ZWN0b3IgdmFsdWUKK2RlZiBueHYzMmkzMjogVmFsdWVUeXBlPDEwMjQsNzg+OyAgLy8gbiB4IDMyIHggaTMyIHZlY3RvciB2YWx1ZQorCitkZWYgbnh2MWk2NCA6IFZhbHVlVHlwZTw2NCwgIDc5PjsgIC8vIG4geCAgMSB4IGk2NCB2ZWN0b3IgdmFsdWUKK2RlZiBueHYyaTY0IDogVmFsdWVUeXBlPDEyOCwgODA+OyAgLy8gbiB4ICAyIHggaTY0IHZlY3RvciB2YWx1ZQorZGVmIG54djRpNjQgOiBWYWx1ZVR5cGU8MjU2LCA4MT47ICAvLyBuIHggIDQgeCBpNjQgdmVjdG9yIHZhbHVlCitkZWYgbnh2OGk2NCA6IFZhbHVlVHlwZTw1MTIsIDgyPjsgIC8vIG4geCAgOCB4IGk2NCB2ZWN0b3IgdmFsdWUKK2RlZiBueHYxNmk2NDogVmFsdWVUeXBlPDEwMjQsODM+OyAgLy8gbiB4IDE2IHggaTY0IHZlY3RvciB2YWx1ZQorZGVmIG54djMyaTY0OiBWYWx1ZVR5cGU8MjA0OCw4ND47ICAvLyBuIHggMzIgeCBpNjQgdmVjdG9yIHZhbHVlCisKK2RlZiB2MmYxNiAgOiBWYWx1ZVR5cGU8MzIgLCA4NT47ICAgLy8gIDIgeCBmMTYgdmVjdG9yIHZhbHVlCitkZWYgdjRmMTYgIDogVmFsdWVUeXBlPDY0ICwgODY+OyAgIC8vICA0IHggZjE2IHZlY3RvciB2YWx1ZQorZGVmIHY4ZjE2ICA6IFZhbHVlVHlwZTwxMjgsIDg3PjsgICAvLyAgOCB4IGYxNiB2ZWN0b3IgdmFsdWUKK2RlZiB2MWYzMiAgOiBWYWx1ZVR5cGU8MzIgLCA4OD47ICAgLy8gIDEgeCBmMzIgdmVjdG9yIHZhbHVlCitkZWYgdjJmMzIgIDogVmFsdWVUeXBlPDY0ICwgODk+OyAgIC8vICAyIHggZjMyIHZlY3RvciB2YWx1ZQorZGVmIHY0ZjMyICA6IFZhbHVlVHlwZTwxMjgsIDkwPjsgICAvLyAgNCB4IGYzMiB2ZWN0b3IgdmFsdWUKK2RlZiB2OGYzMiAgOiBWYWx1ZVR5cGU8MjU2LCA5MT47ICAgLy8gIDggeCBmMzIgdmVjdG9yIHZhbHVlCitkZWYgdjE2ZjMyIDogVmFsdWVUeXBlPDUxMiwgOTI+OyAgIC8vIDE2IHggZjMyIHZlY3RvciB2YWx1ZQorZGVmIHYxZjY0ICA6IFZhbHVlVHlwZTw2NCwgIDkzPjsgICAvLyAgMSB4IGY2NCB2ZWN0b3IgdmFsdWUKK2RlZiB2MmY2NCAgOiBWYWx1ZVR5cGU8MTI4LCA5ND47ICAgLy8gIDIgeCBmNjQgdmVjdG9yIHZhbHVlCitkZWYgdjRmNjQgIDogVmFsdWVUeXBlPDI1NiwgOTU+OyAgIC8vICA0IHggZjY0IHZlY3RvciB2YWx1ZQorZGVmIHY4ZjY0ICA6IFZhbHVlVHlwZTw1MTIsIDk2PjsgICAvLyAgOCB4IGY2NCB2ZWN0b3IgdmFsdWUKKworZGVmIG54djJmMTYgIDogVmFsdWVUeXBlPDMyICwgIDk3PjsgLy8gbiB4ICAyIHggZjE2IHZlY3RvciB2YWx1ZQorZGVmIG54djRmMTYgIDogVmFsdWVUeXBlPDY0ICwgIDk4PjsgLy8gbiB4ICA0IHggZjE2IHZlY3RvciB2YWx1ZQorZGVmIG54djhmMTYgIDogVmFsdWVUeXBlPDEyOCwgIDk5PjsgLy8gbiB4ICA4IHggZjE2IHZlY3RvciB2YWx1ZQorZGVmIG54djFmMzIgIDogVmFsdWVUeXBlPDMyICwgMTAwPjsgLy8gbiB4ICAxIHggZjMyIHZlY3RvciB2YWx1ZQorZGVmIG54djJmMzIgIDogVmFsdWVUeXBlPDY0ICwgMTAxPjsgLy8gbiB4ICAyIHggZjMyIHZlY3RvciB2YWx1ZQorZGVmIG54djRmMzIgIDogVmFsdWVUeXBlPDEyOCwgMTAyPjsgLy8gbiB4ICA0IHggZjMyIHZlY3RvciB2YWx1ZQorZGVmIG54djhmMzIgIDogVmFsdWVUeXBlPDI1NiwgMTAzPjsgLy8gbiB4ICA4IHggZjMyIHZlY3RvciB2YWx1ZQorZGVmIG54djE2ZjMyIDogVmFsdWVUeXBlPDUxMiwgMTA0PjsgLy8gbiB4IDE2IHggZjMyIHZlY3RvciB2YWx1ZQorZGVmIG54djFmNjQgIDogVmFsdWVUeXBlPDY0LCAgMTA1PjsgLy8gbiB4ICAxIHggZjY0IHZlY3RvciB2YWx1ZQorZGVmIG54djJmNjQgIDogVmFsdWVUeXBlPDEyOCwgMTA2PjsgLy8gbiB4ICAyIHggZjY0IHZlY3RvciB2YWx1ZQorZGVmIG54djRmNjQgIDogVmFsdWVUeXBlPDI1NiwgMTA3PjsgLy8gbiB4ICA0IHggZjY0IHZlY3RvciB2YWx1ZQorZGVmIG54djhmNjQgIDogVmFsdWVUeXBlPDUxMiwgMTA4PjsgLy8gbiB4ICA4IHggZjY0IHZlY3RvciB2YWx1ZQorCitkZWYgeDg2bW14IDogVmFsdWVUeXBlPDY0ICwgMTA5PjsgICAvLyBYODYgTU1YIHZhbHVlCitkZWYgRmxhZ1ZUIDogVmFsdWVUeXBlPDAgICwgMTEwPjsgICAvLyBQcmUtUkEgc2NoZWQgZ2x1ZQorZGVmIGlzVm9pZCA6IFZhbHVlVHlwZTwwICAsIDExMT47ICAgLy8gUHJvZHVjZXMgbm8gdmFsdWUKK2RlZiB1bnR5cGVkOiBWYWx1ZVR5cGU8OCAgLCAxMTI+OyAgIC8vIFByb2R1Y2VzIGFuIHVudHlwZWQgdmFsdWUKK2RlZiBFeGNlcHRSZWY6IFZhbHVlVHlwZTwwLCAxMTM+OyAgIC8vIFdlYkFzc2VtYmx5J3MgZXhjZXB0X3JlZiB0eXBlCitkZWYgdG9rZW4gIDogVmFsdWVUeXBlPDAgICwgMjQ4PjsgICAvLyBUb2tlblR5CitkZWYgTWV0YWRhdGFWVDogVmFsdWVUeXBlPDAsIDI0OT47ICAvLyBNZXRhZGF0YQorCisvLyBQc2V1ZG8gdmFsdWV0eXBlIG1hcHBlZCB0byB0aGUgY3VycmVudCBwb2ludGVyIHNpemUgdG8gYW55IGFkZHJlc3Mgc3BhY2UuCisvLyBTaG91bGQgb25seSBiZSB1c2VkIGluIFRhYmxlR2VuLgorZGVmIGlQVFJBbnkgICA6IFZhbHVlVHlwZTwwLCAyNTA+OworCisvLyBQc2V1ZG8gdmFsdWV0eXBlIHRvIHJlcHJlc2VudCAidmVjdG9yIG9mIGFueSBzaXplIgorZGVmIHZBbnkgICA6IFZhbHVlVHlwZTwwICAsIDI1MT47CisKKy8vIFBzZXVkbyB2YWx1ZXR5cGUgdG8gcmVwcmVzZW50ICJmbG9hdCBvZiBhbnkgZm9ybWF0IgorZGVmIGZBbnkgICA6IFZhbHVlVHlwZTwwICAsIDI1Mj47CisKKy8vIFBzZXVkbyB2YWx1ZXR5cGUgdG8gcmVwcmVzZW50ICJpbnRlZ2VyIG9mIGFueSBiaXQgd2lkdGgiCitkZWYgaUFueSAgIDogVmFsdWVUeXBlPDAgICwgMjUzPjsKKworLy8gUHNldWRvIHZhbHVldHlwZSBtYXBwZWQgdG8gdGhlIGN1cnJlbnQgcG9pbnRlciBzaXplLgorZGVmIGlQVFIgICA6IFZhbHVlVHlwZTwwICAsIDI1ND47CisKKy8vIFBzZXVkbyB2YWx1ZXR5cGUgdG8gcmVwcmVzZW50ICJhbnkgdHlwZSBvZiBhbnkgc2l6ZSIuCitkZWYgQW55ICAgIDogVmFsdWVUeXBlPDAgICwgMjU1PjsKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9WaXJ0UmVnTWFwLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVmlydFJlZ01hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMDZmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVmlydFJlZ01hcC5oCkBAIC0wLDAgKzEsMTg4IEBACisvLz09PS0gbGx2bS9Db2RlR2VuL1ZpcnRSZWdNYXAuaCAtIFZpcnR1YWwgUmVnaXN0ZXIgTWFwIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgdmlydHVhbCByZWdpc3RlciBtYXAuIFRoaXMgbWFwcyB2aXJ0dWFsIHJlZ2lzdGVycyB0bworLy8gcGh5c2ljYWwgcmVnaXN0ZXJzIGFuZCB2aXJ0dWFsIHJlZ2lzdGVycyB0byBzdGFjayBzbG90cy4gSXQgaXMgY3JlYXRlZCBhbmQKKy8vIHVwZGF0ZWQgYnkgYSByZWdpc3RlciBhbGxvY2F0b3IgYW5kIHRoZW4gdXNlZCBieSBhIG1hY2hpbmUgY29kZSByZXdyaXRlciB0aGF0CisvLyBhZGRzIHNwaWxsIGNvZGUgYW5kIHJld3JpdGVzIHZpcnR1YWwgaW50byBwaHlzaWNhbCByZWdpc3RlciByZWZlcmVuY2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1ZJUlRSRUdNQVBfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fVklSVFJFR01BUF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9JbmRleGVkTWFwLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1JlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworCisgIGNsYXNzIFZpcnRSZWdNYXAgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgIHB1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgIE5PX1BIWVNfUkVHID0gMCwKKyAgICAgIE5PX1NUQUNLX1NMT1QgPSAoMUwgPDwgMzApLTEsCisgICAgICBNQVhfU1RBQ0tfU0xPVCA9ICgxTCA8PCAxOCktMQorICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkk7CisgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkk7CisgICAgTWFjaGluZUZ1bmN0aW9uICpNRjsKKworICAgIC8vLyBWaXJ0MlBoeXNNYXAgLSBUaGlzIGlzIGEgdmlydHVhbCB0byBwaHlzaWNhbCByZWdpc3RlcgorICAgIC8vLyBtYXBwaW5nLiBFYWNoIHZpcnR1YWwgcmVnaXN0ZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhbiBlbnRyeSBpbgorICAgIC8vLyBpdDsgZXZlbiBzcGlsbGVkIHZpcnR1YWwgcmVnaXN0ZXJzICh0aGUgcmVnaXN0ZXIgbWFwcGVkIHRvIGEKKyAgICAvLy8gc3BpbGxlZCByZWdpc3RlciBpcyB0aGUgdGVtcG9yYXJ5IHVzZWQgdG8gbG9hZCBpdCBmcm9tIHRoZQorICAgIC8vLyBzdGFjaykuCisgICAgSW5kZXhlZE1hcDx1bnNpZ25lZCwgVmlydFJlZzJJbmRleEZ1bmN0b3I+IFZpcnQyUGh5c01hcDsKKworICAgIC8vLyBWaXJ0MlN0YWNrU2xvdE1hcCAtIFRoaXMgaXMgdmlydHVhbCByZWdpc3RlciB0byBzdGFjayBzbG90CisgICAgLy8vIG1hcHBpbmcuIEVhY2ggc3BpbGxlZCB2aXJ0dWFsIHJlZ2lzdGVyIGhhcyBhbiBlbnRyeSBpbiBpdAorICAgIC8vLyB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgc3RhY2sgc2xvdCB0aGlzIHJlZ2lzdGVyIGlzIHNwaWxsZWQKKyAgICAvLy8gYXQuCisgICAgSW5kZXhlZE1hcDxpbnQsIFZpcnRSZWcySW5kZXhGdW5jdG9yPiBWaXJ0MlN0YWNrU2xvdE1hcDsKKworICAgIC8vLyBWaXJ0MlNwbGl0TWFwIC0gVGhpcyBpcyB2aXJ0dWFsIHJlZ2lzdGVyIHRvIHNwbGl0dGVkIHZpcnR1YWwgcmVnaXN0ZXIKKyAgICAvLy8gbWFwcGluZy4KKyAgICBJbmRleGVkTWFwPHVuc2lnbmVkLCBWaXJ0UmVnMkluZGV4RnVuY3Rvcj4gVmlydDJTcGxpdE1hcDsKKworICAgIC8vLyBjcmVhdGVTcGlsbFNsb3QgLSBBbGxvY2F0ZSBhIHNwaWxsIHNsb3QgZm9yIFJDIGZyb20gTUZJLgorICAgIHVuc2lnbmVkIGNyZWF0ZVNwaWxsU2xvdChjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyk7CisKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOworCisgICAgVmlydFJlZ01hcCgpIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCksIFZpcnQyUGh5c01hcChOT19QSFlTX1JFRyksCisgICAgICAgICAgICAgICAgICAgVmlydDJTdGFja1Nsb3RNYXAoTk9fU1RBQ0tfU0xPVCksIFZpcnQyU3BsaXRNYXAoMCkge30KKyAgICBWaXJ0UmVnTWFwKGNvbnN0IFZpcnRSZWdNYXAgJikgPSBkZWxldGU7CisgICAgVmlydFJlZ01hcCAmb3BlcmF0b3I9KGNvbnN0IFZpcnRSZWdNYXAgJikgPSBkZWxldGU7CisKKyAgICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIG92ZXJyaWRlOworCisgICAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZSB7CisgICAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgICAgIE1hY2hpbmVGdW5jdGlvblBhc3M6OmdldEFuYWx5c2lzVXNhZ2UoQVUpOworICAgIH0KKworICAgIE1hY2hpbmVGdW5jdGlvbiAmZ2V0TWFjaGluZUZ1bmN0aW9uKCkgY29uc3QgeworICAgICAgYXNzZXJ0KE1GICYmICJnZXRNYWNoaW5lRnVuY3Rpb24gY2FsbGVkIGJlZm9yZSBydW5Pbk1hY2hpbmVGdW5jdGlvbiIpOworICAgICAgcmV0dXJuICpNRjsKKyAgICB9CisKKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZnZXRSZWdJbmZvKCkgY29uc3QgeyByZXR1cm4gKk1SSTsgfQorICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmZ2V0VGFyZ2V0UmVnSW5mbygpIGNvbnN0IHsgcmV0dXJuICpUUkk7IH0KKworICAgIHZvaWQgZ3JvdygpOworCisgICAgLy8vIEBicmllZiByZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIHJlZ2lzdGVyIGlzCisgICAgLy8vIG1hcHBlZCB0byBhIHBoeXNpY2FsIHJlZ2lzdGVyCisgICAgYm9vbCBoYXNQaHlzKHVuc2lnbmVkIHZpcnRSZWcpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRQaHlzKHZpcnRSZWcpICE9IE5PX1BIWVNfUkVHOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgcmV0dXJucyB0aGUgcGh5c2ljYWwgcmVnaXN0ZXIgbWFwcGVkIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gdmlydHVhbCByZWdpc3RlcgorICAgIHVuc2lnbmVkIGdldFBoeXModW5zaWduZWQgdmlydFJlZykgY29uc3QgeworICAgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIodmlydFJlZykpOworICAgICAgcmV0dXJuIFZpcnQyUGh5c01hcFt2aXJ0UmVnXTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIGNyZWF0ZXMgYSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIgdG8KKyAgICAvLy8gdGhlIHNwZWNpZmllZCBwaHlzaWNhbCByZWdpc3RlcgorICAgIHZvaWQgYXNzaWduVmlydDJQaHlzKHVuc2lnbmVkIHZpcnRSZWcsIE1DUGh5c1JlZyBwaHlzUmVnKTsKKworICAgIC8vLyBAYnJpZWYgY2xlYXJzIHRoZSBzcGVjaWZpZWQgdmlydHVhbCByZWdpc3RlcidzLCBwaHlzaWNhbAorICAgIC8vLyByZWdpc3RlciBtYXBwaW5nCisgICAgdm9pZCBjbGVhclZpcnQodW5zaWduZWQgdmlydFJlZykgeworICAgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIodmlydFJlZykpOworICAgICAgYXNzZXJ0KFZpcnQyUGh5c01hcFt2aXJ0UmVnXSAhPSBOT19QSFlTX1JFRyAmJgorICAgICAgICAgICAgICJhdHRlbXB0IHRvIGNsZWFyIGEgbm90IGFzc2lnbmVkIHZpcnR1YWwgcmVnaXN0ZXIiKTsKKyAgICAgIFZpcnQyUGh5c01hcFt2aXJ0UmVnXSA9IE5PX1BIWVNfUkVHOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgY2xlYXJzIGFsbCB2aXJ0dWFsIHRvIHBoeXNpY2FsIHJlZ2lzdGVyIG1hcHBpbmdzCisgICAgdm9pZCBjbGVhckFsbFZpcnQoKSB7CisgICAgICBWaXJ0MlBoeXNNYXAuY2xlYXIoKTsKKyAgICAgIGdyb3coKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIHJldHVybnMgdHJ1ZSBpZiBWaXJ0UmVnIGlzIGFzc2lnbmVkIHRvIGl0cyBwcmVmZXJyZWQgcGh5c3JlZy4KKyAgICBib29sIGhhc1ByZWZlcnJlZFBoeXModW5zaWduZWQgVmlydFJlZyk7CisKKyAgICAvLy8gQGJyaWVmIHJldHVybnMgdHJ1ZSBpZiBWaXJ0UmVnIGhhcyBhIGtub3duIHByZWZlcnJlZCByZWdpc3Rlci4KKyAgICAvLy8gVGhpcyByZXR1cm5zIGZhbHNlIGlmIFZpcnRSZWcgaGFzIGEgcHJlZmVyZW5jZSB0aGF0IGlzIGEgdmlydHVhbAorICAgIC8vLyByZWdpc3RlciB0aGF0IGhhc24ndCBiZWVuIGFzc2lnbmVkIHlldC4KKyAgICBib29sIGhhc0tub3duUHJlZmVyZW5jZSh1bnNpZ25lZCBWaXJ0UmVnKTsKKworICAgIC8vLyBAYnJpZWYgcmVjb3JkcyB2aXJ0UmVnIGlzIGEgc3BsaXQgbGl2ZSBpbnRlcnZhbCBmcm9tIFNSZWcuCisgICAgdm9pZCBzZXRJc1NwbGl0RnJvbVJlZyh1bnNpZ25lZCB2aXJ0UmVnLCB1bnNpZ25lZCBTUmVnKSB7CisgICAgICBWaXJ0MlNwbGl0TWFwW3ZpcnRSZWddID0gU1JlZzsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIHJldHVybnMgdGhlIGxpdmUgaW50ZXJ2YWwgdmlydFJlZyBpcyBzcGxpdCBmcm9tLgorICAgIHVuc2lnbmVkIGdldFByZVNwbGl0UmVnKHVuc2lnbmVkIHZpcnRSZWcpIGNvbnN0IHsKKyAgICAgIHJldHVybiBWaXJ0MlNwbGl0TWFwW3ZpcnRSZWddOworICAgIH0KKworICAgIC8vLyBnZXRPcmlnaW5hbCAtIFJldHVybiB0aGUgb3JpZ2luYWwgdmlydHVhbCByZWdpc3RlciB0aGF0IFZpcnRSZWcgZGVzY2VuZHMKKyAgICAvLy8gZnJvbSB0aHJvdWdoIHNwbGl0dGluZy4KKyAgICAvLy8gQSByZWdpc3RlciB0aGF0IHdhcyBub3QgY3JlYXRlZCBieSBzcGxpdHRpbmcgaXMgaXRzIG93biBvcmlnaW5hbC4KKyAgICAvLy8gVGhpcyBvcGVyYXRpb24gaXMgaWRlbXBvdGVudC4KKyAgICB1bnNpZ25lZCBnZXRPcmlnaW5hbCh1bnNpZ25lZCBWaXJ0UmVnKSBjb25zdCB7CisgICAgICB1bnNpZ25lZCBPcmlnID0gZ2V0UHJlU3BsaXRSZWcoVmlydFJlZyk7CisgICAgICByZXR1cm4gT3JpZyA/IE9yaWcgOiBWaXJ0UmVnOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgcmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmlydHVhbCByZWdpc3RlciBpcyBub3QKKyAgICAvLy8gbWFwcGVkIHRvIGEgc3RhY2sgc2xvdCBvciByZW1hdGVyaWFsaXplZC4KKyAgICBib29sIGlzQXNzaWduZWRSZWcodW5zaWduZWQgdmlydFJlZykgY29uc3QgeworICAgICAgaWYgKGdldFN0YWNrU2xvdCh2aXJ0UmVnKSA9PSBOT19TVEFDS19TTE9UKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIC8vIFNwbGl0IHJlZ2lzdGVyIGNhbiBiZSBhc3NpZ25lZCBhIHBoeXNpY2FsIHJlZ2lzdGVyIGFzIHdlbGwgYXMgYQorICAgICAgLy8gc3RhY2sgc2xvdCBvciByZW1hdCBpZC4KKyAgICAgIHJldHVybiAoVmlydDJTcGxpdE1hcFt2aXJ0UmVnXSAmJiBWaXJ0MlBoeXNNYXBbdmlydFJlZ10gIT0gTk9fUEhZU19SRUcpOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgcmV0dXJucyB0aGUgc3RhY2sgc2xvdCBtYXBwZWQgdG8gdGhlIHNwZWNpZmllZCB2aXJ0dWFsCisgICAgLy8vIHJlZ2lzdGVyCisgICAgaW50IGdldFN0YWNrU2xvdCh1bnNpZ25lZCB2aXJ0UmVnKSBjb25zdCB7CisgICAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3Rlcih2aXJ0UmVnKSk7CisgICAgICByZXR1cm4gVmlydDJTdGFja1Nsb3RNYXBbdmlydFJlZ107CisgICAgfQorCisgICAgLy8vIEBicmllZiBjcmVhdGUgYSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmZWQgdmlydHVhbCByZWdpc3RlciB0bworICAgIC8vLyB0aGUgbmV4dCBhdmFpbGFibGUgc3RhY2sgc2xvdAorICAgIGludCBhc3NpZ25WaXJ0MlN0YWNrU2xvdCh1bnNpZ25lZCB2aXJ0UmVnKTsKKworICAgIC8vLyBAYnJpZWYgY3JlYXRlIGEgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIHJlZ2lzdGVyIHRvCisgICAgLy8vIHRoZSBzcGVjaWZpZWQgc3RhY2sgc2xvdAorICAgIHZvaWQgYXNzaWduVmlydDJTdGFja1Nsb3QodW5zaWduZWQgdmlydFJlZywgaW50IGZyYW1lSW5kZXgpOworCisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSogTSA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgZHVtcCgpIGNvbnN0OworICB9OworCisgIGlubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFZpcnRSZWdNYXAgJlZSTSkgeworICAgIFZSTS5wcmludChPUyk7CisgICAgcmV0dXJuIE9TOworICB9CisKK30gLy8gZW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fVklSVFJFR01BUF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vV2luRUhGdW5jSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1dpbkVIRnVuY0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDQzMDI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1dpbkVIRnVuY0luZm8uaApAQCAtMCwwICsxLDEyOSBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9XaW5FSEZ1bmNJbmZvLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEYXRhIHN0cnVjdHVyZXMgYW5kIGFzc29jaWF0ZWQgc3RhdGUgZm9yIFdpbmRvd3MgZXhjZXB0aW9uIGhhbmRsaW5nIHNjaGVtZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fV0lORUhGVU5DSU5GT19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9XSU5FSEZVTkNJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlclVuaW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFsbG9jYUluc3Q7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgRnVuY2xldFBhZEluc3Q7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEdsb2JhbFZhcmlhYmxlOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBJbnZva2VJbnN0OworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBNQ1N5bWJvbDsKKworLy8gVGhlIGZvbGxvd2luZyBzdHJ1Y3RzIHJlc3ByZXNlbnQgdGhlIC54ZGF0YSB0YWJsZXMgZm9yIHZhcmlvdXMKKy8vIFdpbmRvd3MtcmVsYXRlZCBFSCBwZXJzb25hbGl0aWVzLgorCit1c2luZyBNQkJPckJhc2ljQmxvY2sgPSBQb2ludGVyVW5pb248Y29uc3QgQmFzaWNCbG9jayAqLCBNYWNoaW5lQmFzaWNCbG9jayAqPjsKKworc3RydWN0IEN4eFVud2luZE1hcEVudHJ5IHsKKyAgaW50IFRvU3RhdGU7CisgIE1CQk9yQmFzaWNCbG9jayBDbGVhbnVwOworfTsKKworLy8vIFNpbWlsYXIgdG8gQ3h4VW53aW5kTWFwRW50cnksIGJ1dCBzdXBwb3J0cyBTRUggZmlsdGVycy4KK3N0cnVjdCBTRUhVbndpbmRNYXBFbnRyeSB7CisgIC8vLyBJZiB1bndpbmRpbmcgY29udGludWVzIHRocm91Z2ggdGhpcyBoYW5kbGVyLCB0cmFuc2l0aW9uIHRvIHRoZSBoYW5kbGVyIGF0CisgIC8vLyB0aGlzIHN0YXRlLiBUaGlzIGluZGV4ZXMgaW50byBTRUhVbndpbmRNYXAuCisgIGludCBUb1N0YXRlID0gLTE7CisKKyAgYm9vbCBJc0ZpbmFsbHkgPSBmYWxzZTsKKworICAvLy8gSG9sZHMgdGhlIGZpbHRlciBleHByZXNzaW9uIGZ1bmN0aW9uLgorICBjb25zdCBGdW5jdGlvbiAqRmlsdGVyID0gbnVsbHB0cjsKKworICAvLy8gSG9sZHMgdGhlIF9fZXhjZXB0IG9yIF9fZmluYWxseSBiYXNpYyBibG9jay4KKyAgTUJCT3JCYXNpY0Jsb2NrIEhhbmRsZXI7Cit9OworCitzdHJ1Y3QgV2luRUhIYW5kbGVyVHlwZSB7CisgIGludCBBZGplY3RpdmVzOworICAvLy8gVGhlIENhdGNoT2JqIHN0YXJ0cyBvdXQgbGlmZSBhcyBhbiBMTFZNIGFsbG9jYSBhbmQgaXMgZXZlbnR1YWxseSB0dXJuZWQKKyAgLy8vIGZyYW1lIGluZGV4LgorICB1bmlvbiB7CisgICAgY29uc3QgQWxsb2NhSW5zdCAqQWxsb2NhOworICAgIGludCBGcmFtZUluZGV4OworICB9IENhdGNoT2JqID0ge307CisgIEdsb2JhbFZhcmlhYmxlICpUeXBlRGVzY3JpcHRvcjsKKyAgTUJCT3JCYXNpY0Jsb2NrIEhhbmRsZXI7Cit9OworCitzdHJ1Y3QgV2luRUhUcnlCbG9ja01hcEVudHJ5IHsKKyAgaW50IFRyeUxvdyA9IC0xOworICBpbnQgVHJ5SGlnaCA9IC0xOworICBpbnQgQ2F0Y2hIaWdoID0gLTE7CisgIFNtYWxsVmVjdG9yPFdpbkVISGFuZGxlclR5cGUsIDE+IEhhbmRsZXJBcnJheTsKK307CisKK2VudW0gY2xhc3MgQ2xySGFuZGxlclR5cGUgeyBDYXRjaCwgRmluYWxseSwgRmF1bHQsIEZpbHRlciB9OworCitzdHJ1Y3QgQ2xyRUhVbndpbmRNYXBFbnRyeSB7CisgIE1CQk9yQmFzaWNCbG9jayBIYW5kbGVyOworICB1aW50MzJfdCBUeXBlVG9rZW47CisgIGludCBIYW5kbGVyUGFyZW50U3RhdGU7IC8vLzwgT3V0ZXIgaGFuZGxlciBlbmNsb3NpbmcgdGhpcyBlbnRyeSdzIGhhbmRsZXIKKyAgaW50IFRyeVBhcmVudFN0YXRlOyAvLy88IE91dGVyIHRyeSByZWdpb24gZW5jbG9zaW5nIHRoaXMgZW50cnkncyB0cnkgcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgIC8vLzwgdHJlYXRpbmcgbGF0ZXIgY2F0Y2hlcyBvbiBzYW1lIHRyeSBhcyAib3V0ZXIiCisgIENsckhhbmRsZXJUeXBlIEhhbmRsZXJUeXBlOworfTsKKworc3RydWN0IFdpbkVIRnVuY0luZm8geworICBEZW5zZU1hcDxjb25zdCBJbnN0cnVjdGlvbiAqLCBpbnQ+IEVIUGFkU3RhdGVNYXA7CisgIERlbnNlTWFwPGNvbnN0IEZ1bmNsZXRQYWRJbnN0ICosIGludD4gRnVuY2xldEJhc2VTdGF0ZU1hcDsKKyAgRGVuc2VNYXA8Y29uc3QgSW52b2tlSW5zdCAqLCBpbnQ+IEludm9rZVN0YXRlTWFwOworICBEZW5zZU1hcDxNQ1N5bWJvbCAqLCBzdGQ6OnBhaXI8aW50LCBNQ1N5bWJvbCAqPj4gTGFiZWxUb1N0YXRlTWFwOworICBTbWFsbFZlY3RvcjxDeHhVbndpbmRNYXBFbnRyeSwgND4gQ3h4VW53aW5kTWFwOworICBTbWFsbFZlY3RvcjxXaW5FSFRyeUJsb2NrTWFwRW50cnksIDQ+IFRyeUJsb2NrTWFwOworICBTbWFsbFZlY3RvcjxTRUhVbndpbmRNYXBFbnRyeSwgND4gU0VIVW53aW5kTWFwOworICBTbWFsbFZlY3RvcjxDbHJFSFVud2luZE1hcEVudHJ5LCA0PiBDbHJFSFVud2luZE1hcDsKKyAgaW50IFVud2luZEhlbHBGcmFtZUlkeCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7CisgIGludCBQU1BTeW1GcmFtZUlkeCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7CisKKyAgaW50IGdldExhc3RTdGF0ZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIEN4eFVud2luZE1hcC5zaXplKCkgLSAxOyB9CisKKyAgdm9pZCBhZGRJUFRvU3RhdGVSYW5nZShjb25zdCBJbnZva2VJbnN0ICpJSSwgTUNTeW1ib2wgKkludm9rZUJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1DU3ltYm9sICpJbnZva2VFbmQpOworCisgIGludCBFSFJlZ05vZGVGcmFtZUluZGV4ID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKyAgaW50IEVIUmVnTm9kZUVuZE9mZnNldCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7CisgIGludCBFSEd1YXJkRnJhbWVJbmRleCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7CisgIGludCBTRUhTZXRGcmFtZU9mZnNldCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7CisKKyAgV2luRUhGdW5jSW5mbygpOworfTsKKworLy8vIEFuYWx5emUgdGhlIElSIGluIFBhcmVudEZuIGFuZCBpdCdzIGhhbmRsZXJzIHRvIGJ1aWxkIFdpbkVIRnVuY0luZm8sIHdoaWNoCisvLy8gZGVzY3JpYmVzIHRoZSBzdGF0ZSBudW1iZXJzIGFuZCB0YWJsZXMgdXNlZCBieSBfX0N4eEZyYW1lSGFuZGxlcjMuIFRoaXMKKy8vLyBhbmFseXNpcyBhc3N1bWVzIHRoYXQgV2luRUhQcmVwYXJlIGhhcyBhbHJlYWR5IGJlZW4gcnVuLgordm9pZCBjYWxjdWxhdGVXaW5DWFhFSFN0YXRlTnVtYmVycyhjb25zdCBGdW5jdGlvbiAqUGFyZW50Rm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbkVIRnVuY0luZm8gJkZ1bmNJbmZvKTsKKwordm9pZCBjYWxjdWxhdGVTRUhTdGF0ZU51bWJlcnMoY29uc3QgRnVuY3Rpb24gKlBhcmVudEZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2luRUhGdW5jSW5mbyAmRnVuY0luZm8pOworCit2b2lkIGNhbGN1bGF0ZUNsckVIU3RhdGVOdW1iZXJzKGNvbnN0IEZ1bmN0aW9uICpGbiwgV2luRUhGdW5jSW5mbyAmRnVuY0luZm8pOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1dJTkVIRlVOQ0lORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db25maWcvQXNtUGFyc2Vycy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvbmZpZy9Bc21QYXJzZXJzLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzE4ODNiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db25maWcvQXNtUGFyc2Vycy5kZWYKQEAgLTAsMCArMSwzMyBAQAorLyo9PT0tIGxsdm0vQ29uZmlnL0FzbVBhcnNlcnMuZGVmIC0gTExWTSBBc3NlbWJseSBQYXJzZXJzIC0tLS0tLS0qLSBDKysgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICp8Cit8KiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGVudW1lcmF0ZXMgYWxsIG9mIHRoZSBhc3NlbWJseS1sYW5ndWFnZSBwYXJzZXJzICAgICAgICAgICAgICAgICAgKnwKK3wqIHN1cHBvcnRlZCBieSB0aGlzIGJ1aWxkIG9mIExMVk0uIENsaWVudHMgb2YgdGhpcyBmaWxlIHNob3VsZCBkZWZpbmUgICAgICAgICp8Cit8KiB0aGUgTExWTV9BU01fUEFSU0VSIG1hY3JvIHRvIGJlIGEgZnVuY3Rpb24tbGlrZSBtYWNybyB3aXRoIGEgICAgICAgICAgICAgICAqfAorfCogc2luZ2xlIHBhcmFtZXRlciAodGhlIG5hbWUgb2YgdGhlIHRhcmdldCB3aG9zZSBhc3NlbWJseSBjYW4gYmUgICAgICAgICAgICAgKnwKK3wqIGdlbmVyYXRlZCk7IGluY2x1ZGluZyB0aGlzIGZpbGUgd2lsbCB0aGVuIGVudW1lcmF0ZSBhbGwgb2YgdGhlICAgICAgICAgICAgICp8Cit8KiB0YXJnZXRzIHdpdGggYXNzZW1ibHkgcGFyc2Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoZSBzZXQgb2YgdGFyZ2V0cyBzdXBwb3J0ZWQgYnkgTExWTSBpcyBnZW5lcmF0ZWQgYXQgY29uZmlndXJhdGlvbiAgICAgICAgICp8Cit8KiB0aW1lLCBhdCB3aGljaCBwb2ludCB0aGlzIGhlYWRlciBpcyBnZW5lcmF0ZWQuIERvIG5vdCBtb2RpZnkgdGhpcyAgICAgICAgICAqfAorfCogaGVhZGVyIGRpcmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIExMVk1fQVNNX1BBUlNFUgorIyAgZXJyb3IgUGxlYXNlIGRlZmluZSB0aGUgbWFjcm8gTExWTV9BU01fUEFSU0VSKFRhcmdldE5hbWUpCisjZW5kaWYKKworTExWTV9BU01fUEFSU0VSKEFBcmNoNjQpCitMTFZNX0FTTV9QQVJTRVIoQVJNKQorTExWTV9BU01fUEFSU0VSKEJQRikKK0xMVk1fQVNNX1BBUlNFUihYODYpCisKKworI3VuZGVmIExMVk1fQVNNX1BBUlNFUgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db25maWcvQXNtUHJpbnRlcnMuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db25maWcvQXNtUHJpbnRlcnMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMWZlMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvbmZpZy9Bc21QcmludGVycy5kZWYKQEAgLTAsMCArMSwzMyBAQAorLyo9PT0tIGxsdm0vQ29uZmlnL0FzbVByaW50ZXJzLmRlZiAtIExMVk0gQXNzZW1ibHkgUHJpbnRlcnMgLS0tLS0qLSBDKysgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICp8Cit8KiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGVudW1lcmF0ZXMgYWxsIG9mIHRoZSBhc3NlbWJseS1sYW5ndWFnZSBwcmludGVycyAgICAgICAgICAgICAgICAgKnwKK3wqIHN1cHBvcnRlZCBieSB0aGlzIGJ1aWxkIG9mIExMVk0uIENsaWVudHMgb2YgdGhpcyBmaWxlIHNob3VsZCBkZWZpbmUgICAgICAgICp8Cit8KiB0aGUgTExWTV9BU01fUFJJTlRFUiBtYWNybyB0byBiZSBhIGZ1bmN0aW9uLWxpa2UgbWFjcm8gd2l0aCBhICAgICAgICAgICAgICAqfAorfCogc2luZ2xlIHBhcmFtZXRlciAodGhlIG5hbWUgb2YgdGhlIHRhcmdldCB3aG9zZSBhc3NlbWJseSBjYW4gYmUgICAgICAgICAgICAgKnwKK3wqIGdlbmVyYXRlZCk7IGluY2x1ZGluZyB0aGlzIGZpbGUgd2lsbCB0aGVuIGVudW1lcmF0ZSBhbGwgb2YgdGhlICAgICAgICAgICAgICp8Cit8KiB0YXJnZXRzIHdpdGggYXNzZW1ibHkgcHJpbnRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoZSBzZXQgb2YgdGFyZ2V0cyBzdXBwb3J0ZWQgYnkgTExWTSBpcyBnZW5lcmF0ZWQgYXQgY29uZmlndXJhdGlvbiAgICAgICAgICp8Cit8KiB0aW1lLCBhdCB3aGljaCBwb2ludCB0aGlzIGhlYWRlciBpcyBnZW5lcmF0ZWQuIERvIG5vdCBtb2RpZnkgdGhpcyAgICAgICAgICAqfAorfCogaGVhZGVyIGRpcmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIExMVk1fQVNNX1BSSU5URVIKKyMgIGVycm9yIFBsZWFzZSBkZWZpbmUgdGhlIG1hY3JvIExMVk1fQVNNX1BSSU5URVIoVGFyZ2V0TmFtZSkKKyNlbmRpZgorCitMTFZNX0FTTV9QUklOVEVSKEFBcmNoNjQpCitMTFZNX0FTTV9QUklOVEVSKEFSTSkKK0xMVk1fQVNNX1BSSU5URVIoQlBGKQorTExWTV9BU01fUFJJTlRFUihYODYpCisKKworI3VuZGVmIExMVk1fQVNNX1BSSU5URVIKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29uZmlnL0Rpc2Fzc2VtYmxlcnMuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db25maWcvRGlzYXNzZW1ibGVycy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmNGIwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29uZmlnL0Rpc2Fzc2VtYmxlcnMuZGVmCkBAIC0wLDAgKzEsMzMgQEAKKy8qPT09LSBsbHZtL0NvbmZpZy9EaXNhc3NlbWJsZXJzLmRlZiAtIExMVk0gQXNzZW1ibHkgUGFyc2VycyAtLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqfAorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBlbnVtZXJhdGVzIGFsbCBvZiB0aGUgYXNzZW1ibHktbGFuZ3VhZ2UgcGFyc2VycyAgICAgICAgICAgICAgICAgICp8Cit8KiBzdXBwb3J0ZWQgYnkgdGhpcyBidWlsZCBvZiBMTFZNLiBDbGllbnRzIG9mIHRoaXMgZmlsZSBzaG91bGQgZGVmaW5lICAgICAgICAqfAorfCogdGhlIExMVk1fRElTQVNTRU1CTEVSIG1hY3JvIHRvIGJlIGEgZnVuY3Rpb24tbGlrZSBtYWNybyB3aXRoIGEgICAgICAgICAgICAgKnwKK3wqIHNpbmdsZSBwYXJhbWV0ZXIgKHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgd2hvc2UgYXNzZW1ibHkgY2FuIGJlICAgICAgICAgICAgICp8Cit8KiBnZW5lcmF0ZWQpOyBpbmNsdWRpbmcgdGhpcyBmaWxlIHdpbGwgdGhlbiBlbnVtZXJhdGUgYWxsIG9mIHRoZSAgICAgICAgICAgICAqfAorfCogdGFyZ2V0cyB3aXRoIGFzc2VtYmx5IHBhcnNlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGUgc2V0IG9mIHRhcmdldHMgc3VwcG9ydGVkIGJ5IExMVk0gaXMgZ2VuZXJhdGVkIGF0IGNvbmZpZ3VyYXRpb24gICAgICAgICAqfAorfCogdGltZSwgYXQgd2hpY2ggcG9pbnQgdGhpcyBoZWFkZXIgaXMgZ2VuZXJhdGVkLiBEbyBub3QgbW9kaWZ5IHRoaXMgICAgICAgICAgKnwKK3wqIGhlYWRlciBkaXJlY3RseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX0RJU0FTU0VNQkxFUgorIyAgZXJyb3IgUGxlYXNlIGRlZmluZSB0aGUgbWFjcm8gTExWTV9ESVNBU1NFTUJMRVIoVGFyZ2V0TmFtZSkKKyNlbmRpZgorCitMTFZNX0RJU0FTU0VNQkxFUihBQXJjaDY0KQorTExWTV9ESVNBU1NFTUJMRVIoQVJNKQorTExWTV9ESVNBU1NFTUJMRVIoQlBGKQorTExWTV9ESVNBU1NFTUJMRVIoWDg2KQorCisKKyN1bmRlZiBMTFZNX0RJU0FTU0VNQkxFUgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db25maWcvVGFyZ2V0cy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvbmZpZy9UYXJnZXRzLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjcyNWYzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db25maWcvVGFyZ2V0cy5kZWYKQEAgLTAsMCArMSwzMiBAQAorLyo9PT0tIGxsdm0vQ29uZmlnL1RhcmdldHMuZGVmIC0gTExWTSBUYXJnZXQgQXJjaGl0ZWN0dXJlcyAtLS0tLS0qLSBDKysgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICp8Cit8KiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGVudW1lcmF0ZXMgYWxsIG9mIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlcyBzdXBwb3J0ZWQgYnkgICAgICAgICAgKnwKK3wqIHRoaXMgYnVpbGQgb2YgTExWTS4gQ2xpZW50cyBvZiB0aGlzIGZpbGUgc2hvdWxkIGRlZmluZSB0aGUgICAgICAgICAgICAgICAgICp8Cit8KiBMTFZNX1RBUkdFVCBtYWNybyB0byBiZSBhIGZ1bmN0aW9uLWxpa2UgbWFjcm8gd2l0aCBhIHNpbmdsZSAgICAgICAgICAgICAgICAqfAorfCogcGFyYW1ldGVyICh0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0KTsgaW5jbHVkaW5nIHRoaXMgZmlsZSB3aWxsIHRoZW4gICAgICAgICAgKnwKK3wqIGVudW1lcmF0ZSBhbGwgb2YgdGhlIHRhcmdldHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhlIHNldCBvZiB0YXJnZXRzIHN1cHBvcnRlZCBieSBMTFZNIGlzIGdlbmVyYXRlZCBhdCBjb25maWd1cmF0aW9uICAgICAgICAgKnwKK3wqIHRpbWUsIGF0IHdoaWNoIHBvaW50IHRoaXMgaGVhZGVyIGlzIGdlbmVyYXRlZC4gRG8gbm90IG1vZGlmeSB0aGlzICAgICAgICAgICp8Cit8KiBoZWFkZXIgZGlyZWN0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9UQVJHRVQKKyMgIGVycm9yIFBsZWFzZSBkZWZpbmUgdGhlIG1hY3JvIExMVk1fVEFSR0VUKFRhcmdldE5hbWUpCisjZW5kaWYKKworTExWTV9UQVJHRVQoQUFyY2g2NCkKK0xMVk1fVEFSR0VUKEFSTSkKK0xMVk1fVEFSR0VUKEJQRikKK0xMVk1fVEFSR0VUKFg4NikKKworCisjdW5kZWYgTExWTV9UQVJHRVQKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29uZmlnL2FiaS1icmVha2luZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db25maWcvYWJpLWJyZWFraW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmODJlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29uZmlnL2FiaS1icmVha2luZy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qPT09LS0tLS0tLSBsbHZtL0NvbmZpZy9hYmktYnJlYWtpbmcuaCAtIGxsdm0gY29uZmlndXJhdGlvbiAtLS0tLS0tKi0gQyAtKi09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKi8KKy8qIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworLyogVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSBDKysgQUJJIGJyZWFrIGludHJvZHVjZWQgaW4gTExWTSBwdWJsaWMgaGVhZGVyLiAqLworCisjaWZuZGVmIExMVk1fQUJJX0JSRUFLSU5HX0NIRUNLU19ICisjZGVmaW5lIExMVk1fQUJJX0JSRUFLSU5HX0NIRUNLU19ICisKKy8qIERlZmluZSB0byBlbmFibGUgY2hlY2tzIHRoYXQgYWx0ZXIgdGhlIExMVk0gQysrIEFCSSAqLworI2RlZmluZSBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTIDAKKworLyogRGVmaW5lIHRvIGVuYWJsZSByZXZlcnNlIGl0ZXJhdGlvbiBvZiB1bm9yZGVyZWQgbGx2bSBjb250YWluZXJzICovCisjZGVmaW5lIExMVk1fRU5BQkxFX1JFVkVSU0VfSVRFUkFUSU9OIDAKKworLyogQWxsb3cgc2VsZWN0aXZlbHkgZGlzYWJsaW5nIGxpbmstdGltZSBtaXNtYXRjaCBjaGVja2luZyBzbyB0aGF0IGhlYWRlci1vbmx5CisgICBBRFQgY29udGVudCBmcm9tIExMVk0gY2FuIGJlIHVzZWQgd2l0aG91dCBsaW5raW5nIGxpYlN1cHBvcnQuICovCisjaWYgIUxMVk1fRElTQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTX0VORk9SQ0lORworCisvLyBBQklfQlJFQUtJTkdfQ0hFQ0tTIHByb3RlY3Rpb246IHByb3ZpZGVzIGxpbmstdGltZSBmYWlsdXJlIHdoZW4gY2xpZW50cyBidWlsZAorLy8gbWlzbWF0Y2ggd2l0aCBMTFZNCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKy8vIFVzZSBwcmFnbWEgd2l0aCBNU1ZDCisjZGVmaW5lIExMVk1fWFNUUihzKSBMTFZNX1NUUihzKQorI2RlZmluZSBMTFZNX1NUUihzKSAjcworI3ByYWdtYSBkZXRlY3RfbWlzbWF0Y2goIkxMVk1fRU5BQkxFX0FCSV9CUkVBS0lOR19DSEVDS1MiLCBMTFZNX1hTVFIoTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUykpCisjdW5kZWYgTExWTV9YU1RSCisjdW5kZWYgTExWTV9TVFIKKyNlbGlmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pIC8vIFdpbjMyIHcvbyAjcHJhZ21hIGRldGVjdF9taXNtYXRjaAorLy8gRklYTUU6IEltcGxlbWVudCBjaGVja3Mgd2l0aG91dCB3ZWFrLgorI2VsaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK25hbWVzcGFjZSBsbHZtIHsKKyNpZiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTCitleHRlcm4gaW50IEVuYWJsZUFCSUJyZWFraW5nQ2hlY2tzOworX19hdHRyaWJ1dGVfXygod2VhaywgdmlzaWJpbGl0eSAoImhpZGRlbiIpKSkgaW50ICpWZXJpZnlFbmFibGVBQklCcmVha2luZ0NoZWNrcyA9ICZFbmFibGVBQklCcmVha2luZ0NoZWNrczsKKyNlbHNlCitleHRlcm4gaW50IERpc2FibGVBQklCcmVha2luZ0NoZWNrczsKK19fYXR0cmlidXRlX18oKHdlYWssIHZpc2liaWxpdHkgKCJoaWRkZW4iKSkpIGludCAqVmVyaWZ5RGlzYWJsZUFCSUJyZWFraW5nQ2hlY2tzID0gJkRpc2FibGVBQklCcmVha2luZ0NoZWNrczsKKyNlbmRpZgorfQorI2VuZGlmIC8vIF9NU0NfVkVSCisKKyNlbmRpZiAvLyBMTFZNX0RJU0FCTEVfQUJJX0JSRUFLSU5HX0NIRUNLU19FTkZPUkNJTkcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvbmZpZy9sbHZtLWNvbmZpZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db25maWcvbGx2bS1jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2ZhMWM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db25maWcvbGx2bS1jb25maWcuaApAQCAtMCwwICsxLDg1IEBACisvKj09PS0tLS0tLS0gbGx2bS9Db25maWcvbGx2bS1jb25maWcuaCAtIGxsdm0gY29uZmlndXJhdGlvbiAtLS0tLS0tKi0gQyAtKi09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKi8KKy8qIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworLyogVGhpcyBmaWxlIGVudW1lcmF0ZXMgdmFyaWFibGVzIGZyb20gdGhlIExMVk0gY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZXkKKyAgIGNhbiBiZSBpbiBleHBvcnRlZCBoZWFkZXJzIGFuZCB3b24ndCBvdmVycmlkZSBwYWNrYWdlIHNwZWNpZmljIGRpcmVjdGl2ZXMuCisgICBUaGlzIGlzIGEgQyBoZWFkZXIgdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gdGhlIGxsdm0tYyBoZWFkZXJzLiAqLworCisjaWZuZGVmIExMVk1fQ09ORklHX0gKKyNkZWZpbmUgTExWTV9DT05GSUdfSAorCisvKiBEZWZpbmUgaWYgTExWTV9FTkFCTEVfRFVNUCBpcyBlbmFibGVkICovCisvKiAjdW5kZWYgTExWTV9FTkFCTEVfRFVNUCAqLworCisvKiBEZWZpbmUgaWYgd2UgbGluayBQb2xseSB0byB0aGUgdG9vbHMgKi8KKy8qICN1bmRlZiBMSU5LX1BPTExZX0lOVE9fVE9PTFMgKi8KKworLyogVGFyZ2V0IHRyaXBsZSBMTFZNIHdpbGwgZ2VuZXJhdGUgY29kZSBmb3IgYnkgZGVmYXVsdCAqLworI2RlZmluZSBMTFZNX0RFRkFVTFRfVEFSR0VUX1RSSVBMRSAieDg2XzY0LXVua25vd24tbGludXgtZ251IgorCisvKiBEZWZpbmUgaWYgdGhyZWFkcyBlbmFibGVkICovCisjZGVmaW5lIExMVk1fRU5BQkxFX1RIUkVBRFMgMQorCisvKiBIYXMgZ2NjL01TVkMgYXRvbWljIGludHJpbnNpY3MgKi8KKyNkZWZpbmUgTExWTV9IQVNfQVRPTUlDUyAxCisKKy8qIEhvc3QgdHJpcGxlIExMVk0gd2lsbCBiZSBleGVjdXRlZCBvbiAqLworI2RlZmluZSBMTFZNX0hPU1RfVFJJUExFICJ4ODZfNjQtdW5rbm93bi1saW51eC1nbnUiCisKKy8qIExMVk0gYXJjaGl0ZWN0dXJlIG5hbWUgZm9yIHRoZSBuYXRpdmUgYXJjaGl0ZWN0dXJlLCBpZiBhdmFpbGFibGUgKi8KKyNkZWZpbmUgTExWTV9OQVRJVkVfQVJDSCBYODYKKworLyogTExWTSBuYW1lIGZvciB0aGUgbmF0aXZlIEFzbVBhcnNlciBpbml0IGZ1bmN0aW9uLCBpZiBhdmFpbGFibGUgKi8KKyNkZWZpbmUgTExWTV9OQVRJVkVfQVNNUEFSU0VSIExMVk1Jbml0aWFsaXplWDg2QXNtUGFyc2VyCisKKy8qIExMVk0gbmFtZSBmb3IgdGhlIG5hdGl2ZSBBc21QcmludGVyIGluaXQgZnVuY3Rpb24sIGlmIGF2YWlsYWJsZSAqLworI2RlZmluZSBMTFZNX05BVElWRV9BU01QUklOVEVSIExMVk1Jbml0aWFsaXplWDg2QXNtUHJpbnRlcgorCisvKiBMTFZNIG5hbWUgZm9yIHRoZSBuYXRpdmUgRGlzYXNzZW1ibGVyIGluaXQgZnVuY3Rpb24sIGlmIGF2YWlsYWJsZSAqLworI2RlZmluZSBMTFZNX05BVElWRV9ESVNBU1NFTUJMRVIgTExWTUluaXRpYWxpemVYODZEaXNhc3NlbWJsZXIKKworLyogTExWTSBuYW1lIGZvciB0aGUgbmF0aXZlIFRhcmdldCBpbml0IGZ1bmN0aW9uLCBpZiBhdmFpbGFibGUgKi8KKyNkZWZpbmUgTExWTV9OQVRJVkVfVEFSR0VUIExMVk1Jbml0aWFsaXplWDg2VGFyZ2V0CisKKy8qIExMVk0gbmFtZSBmb3IgdGhlIG5hdGl2ZSBUYXJnZXRJbmZvIGluaXQgZnVuY3Rpb24sIGlmIGF2YWlsYWJsZSAqLworI2RlZmluZSBMTFZNX05BVElWRV9UQVJHRVRJTkZPIExMVk1Jbml0aWFsaXplWDg2VGFyZ2V0SW5mbworCisvKiBMTFZNIG5hbWUgZm9yIHRoZSBuYXRpdmUgdGFyZ2V0IE1DIGluaXQgZnVuY3Rpb24sIGlmIGF2YWlsYWJsZSAqLworI2RlZmluZSBMTFZNX05BVElWRV9UQVJHRVRNQyBMTFZNSW5pdGlhbGl6ZVg4NlRhcmdldE1DCisKKy8qIERlZmluZSBpZiB0aGlzIGlzIFVuaXhpc2ggcGxhdGZvcm0gKi8KKyNkZWZpbmUgTExWTV9PTl9VTklYIDEKKworLyogRGVmaW5lIGlmIHRoaXMgaXMgV2luMzJpc2ggcGxhdGZvcm0gKi8KKy8qICN1bmRlZiBMTFZNX09OX1dJTjMyICovCisKKy8qIERlZmluZSBpZiB3ZSBoYXZlIHRoZSBJbnRlbCBKSVQgQVBJIHJ1bnRpbWUgc3VwcG9ydCBsaWJyYXJ5ICovCisjZGVmaW5lIExMVk1fVVNFX0lOVEVMX0pJVEVWRU5UUyAwCisKKy8qIERlZmluZSBpZiB3ZSBoYXZlIHRoZSBvcHJvZmlsZSBKSVQtc3VwcG9ydCBsaWJyYXJ5ICovCisjZGVmaW5lIExMVk1fVVNFX09QUk9GSUxFIDAKKworLyogTWFqb3IgdmVyc2lvbiBvZiB0aGUgTExWTSBBUEkgKi8KKyNkZWZpbmUgTExWTV9WRVJTSU9OX01BSk9SIDcKKworLyogTWlub3IgdmVyc2lvbiBvZiB0aGUgTExWTSBBUEkgKi8KKyNkZWZpbmUgTExWTV9WRVJTSU9OX01JTk9SIDAKKworLyogUGF0Y2ggdmVyc2lvbiBvZiB0aGUgTExWTSBBUEkgKi8KKyNkZWZpbmUgTExWTV9WRVJTSU9OX1BBVENIIDIKKworLyogTExWTSB2ZXJzaW9uIHN0cmluZyAqLworI2RlZmluZSBMTFZNX1ZFUlNJT05fU1RSSU5HICI3LjAuMnN2biIKKworLyogV2hldGhlciBMTFZNIHJlY29yZHMgc3RhdGlzdGljcyBmb3IgdXNlIHdpdGggR2V0U3RhdGlzdGljcygpLAorICogUHJpbnRTdGF0aXN0aWNzKCkgb3IgUHJpbnRTdGF0aXN0aWNzSlNPTigpCisgKi8KKyNkZWZpbmUgTExWTV9GT1JDRV9FTkFCTEVfU1RBVFMgMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0FwcGVuZGluZ1R5cGVUYWJsZUJ1aWxkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0FwcGVuZGluZ1R5cGVUYWJsZUJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDE3NDM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQXBwZW5kaW5nVHlwZVRhYmxlQnVpbGRlci5oCkBAIC0wLDAgKzEsNzAgQEAKKy8vPT09LSBBcHBlbmRpbmdUeXBlVGFibGVCdWlsZGVyLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKy0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfQVBQRU5ESU5HVFlQRVRBQkxFQlVJTERFUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0FQUEVORElOR1RZUEVUQUJMRUJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU2ltcGxlVHlwZVNlcmlhbGl6ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlQ29sbGVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgQ29udGludWF0aW9uUmVjb3JkQnVpbGRlcjsKKworY2xhc3MgQXBwZW5kaW5nVHlwZVRhYmxlQnVpbGRlciA6IHB1YmxpYyBUeXBlQ29sbGVjdGlvbiB7CisKKyAgQnVtcFB0ckFsbG9jYXRvciAmUmVjb3JkU3RvcmFnZTsKKyAgU2ltcGxlVHlwZVNlcmlhbGl6ZXIgU2ltcGxlU2VyaWFsaXplcjsKKworICAvLy8gQ29udGFpbnMgYSBsaXN0IG9mIGFsbCByZWNvcmRzIGluZGV4ZWQgYnkgVHlwZUluZGV4LnRvQXJyYXlJbmRleCgpLgorICBTbWFsbFZlY3RvcjxBcnJheVJlZjx1aW50OF90PiwgMj4gU2VlblJlY29yZHM7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgQXBwZW5kaW5nVHlwZVRhYmxlQnVpbGRlcihCdW1wUHRyQWxsb2NhdG9yICZTdG9yYWdlKTsKKyAgfkFwcGVuZGluZ1R5cGVUYWJsZUJ1aWxkZXIoKTsKKworICAvLyBUeXBlVGFibGVDb2xsZWN0aW9uIG92ZXJyaWRlcworICBPcHRpb25hbDxUeXBlSW5kZXg+IGdldEZpcnN0KCkgb3ZlcnJpZGU7CisgIE9wdGlvbmFsPFR5cGVJbmRleD4gZ2V0TmV4dChUeXBlSW5kZXggUHJldikgb3ZlcnJpZGU7CisgIENWVHlwZSBnZXRUeXBlKFR5cGVJbmRleCBJbmRleCkgb3ZlcnJpZGU7CisgIFN0cmluZ1JlZiBnZXRUeXBlTmFtZShUeXBlSW5kZXggSW5kZXgpIG92ZXJyaWRlOworICBib29sIGNvbnRhaW5zKFR5cGVJbmRleCBJbmRleCkgb3ZlcnJpZGU7CisgIHVpbnQzMl90IHNpemUoKSBvdmVycmlkZTsKKyAgdWludDMyX3QgY2FwYWNpdHkoKSBvdmVycmlkZTsKKworICAvLyBwdWJsaWMgaW50ZXJmYWNlCisgIHZvaWQgcmVzZXQoKTsKKyAgVHlwZUluZGV4IG5leHRUeXBlSW5kZXgoKSBjb25zdDsKKworICBCdW1wUHRyQWxsb2NhdG9yICZnZXRBbGxvY2F0b3IoKSB7IHJldHVybiBSZWNvcmRTdG9yYWdlOyB9CisKKyAgQXJyYXlSZWY8QXJyYXlSZWY8dWludDhfdD4+IHJlY29yZHMoKSBjb25zdDsKKyAgVHlwZUluZGV4IGluc2VydFJlY29yZEJ5dGVzKEFycmF5UmVmPHVpbnQ4X3Q+ICZSZWNvcmQpOworICBUeXBlSW5kZXggaW5zZXJ0UmVjb3JkKENvbnRpbnVhdGlvblJlY29yZEJ1aWxkZXIgJkJ1aWxkZXIpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUeXBlSW5kZXggd3JpdGVMZWFmVHlwZShUICZSZWNvcmQpIHsKKyAgICBBcnJheVJlZjx1aW50OF90PiBEYXRhID0gU2ltcGxlU2VyaWFsaXplci5zZXJpYWxpemUoUmVjb3JkKTsKKyAgICByZXR1cm4gaW5zZXJ0UmVjb3JkQnl0ZXMoRGF0YSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVUQUJMRUJVSUxERVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ1ZSZWNvcmQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NWUmVjb3JkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiZWI0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NWUmVjb3JkLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8vPT09LSBSZWNvcmRJdGVyYXRvci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfUkVDT1JESVRFUkFUT1JfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19SRUNPUkRJVEVSQVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdFcnJvci5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1JlY29yZFNlcmlhbGl6YXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVhZGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLaW5kPiBjbGFzcyBDVlJlY29yZCB7CitwdWJsaWM6CisgIENWUmVjb3JkKCkgOiBUeXBlKHN0YXRpY19jYXN0PEtpbmQ+KDApKSB7fQorCisgIENWUmVjb3JkKEtpbmQgSywgQXJyYXlSZWY8dWludDhfdD4gRGF0YSkgOiBUeXBlKEspLCBSZWNvcmREYXRhKERhdGEpIHt9CisKKyAgYm9vbCB2YWxpZCgpIGNvbnN0IHsgcmV0dXJuIFR5cGUgIT0gc3RhdGljX2Nhc3Q8S2luZD4oMCk7IH0KKworICB1aW50MzJfdCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBSZWNvcmREYXRhLnNpemUoKTsgfQorICBLaW5kIGtpbmQoKSBjb25zdCB7IHJldHVybiBUeXBlOyB9CisgIEFycmF5UmVmPHVpbnQ4X3Q+IGRhdGEoKSBjb25zdCB7IHJldHVybiBSZWNvcmREYXRhOyB9CisgIFN0cmluZ1JlZiBzdHJfZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RyaW5nUmVmKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihSZWNvcmREYXRhLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICBSZWNvcmREYXRhLnNpemUoKSk7CisgIH0KKworICBBcnJheVJlZjx1aW50OF90PiBjb250ZW50KCkgY29uc3QgeworICAgIHJldHVybiBSZWNvcmREYXRhLmRyb3BfZnJvbnQoc2l6ZW9mKFJlY29yZFByZWZpeCkpOworICB9CisKKyAgT3B0aW9uYWw8dWludDMyX3Q+IGhhc2goKSBjb25zdCB7IHJldHVybiBIYXNoOyB9CisKKyAgdm9pZCBzZXRIYXNoKHVpbnQzMl90IFZhbHVlKSB7IEhhc2ggPSBWYWx1ZTsgfQorCisgIEtpbmQgVHlwZTsKKyAgQXJyYXlSZWY8dWludDhfdD4gUmVjb3JkRGF0YTsKKyAgT3B0aW9uYWw8dWludDMyX3Q+IEhhc2g7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2luZD4gc3RydWN0IFJlbWFwcGVkUmVjb3JkIHsKKyAgZXhwbGljaXQgUmVtYXBwZWRSZWNvcmQoY29uc3QgQ1ZSZWNvcmQ8S2luZD4gJlIpIDogT3JpZ2luYWxSZWNvcmQoUikge30KKworICBDVlJlY29yZDxLaW5kPiBPcmlnaW5hbFJlY29yZDsKKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPHVpbnQzMl90LCBUeXBlSW5kZXg+LCA4PiBNYXBwaW5nczsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSZWNvcmQsIHR5cGVuYW1lIEZ1bmM+CitFcnJvciBmb3JFYWNoQ29kZVZpZXdSZWNvcmQoQXJyYXlSZWY8dWludDhfdD4gU3RyZWFtQnVmZmVyLCBGdW5jIEYpIHsKKyAgd2hpbGUgKCFTdHJlYW1CdWZmZXIuZW1wdHkoKSkgeworICAgIGlmIChTdHJlYW1CdWZmZXIuc2l6ZSgpIDwgc2l6ZW9mKFJlY29yZFByZWZpeCkpCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxDb2RlVmlld0Vycm9yPihjdl9lcnJvcl9jb2RlOjpjb3JydXB0X3JlY29yZCk7CisKKyAgICBjb25zdCBSZWNvcmRQcmVmaXggKlByZWZpeCA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVjb3JkUHJlZml4ICo+KFN0cmVhbUJ1ZmZlci5kYXRhKCkpOworCisgICAgc2l6ZV90IFJlYWxMZW4gPSBQcmVmaXgtPlJlY29yZExlbiArIDI7CisgICAgaWYgKFN0cmVhbUJ1ZmZlci5zaXplKCkgPCBSZWFsTGVuKQorICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8Q29kZVZpZXdFcnJvcj4oY3ZfZXJyb3JfY29kZTo6Y29ycnVwdF9yZWNvcmQpOworCisgICAgQXJyYXlSZWY8dWludDhfdD4gRGF0YSA9IFN0cmVhbUJ1ZmZlci50YWtlX2Zyb250KFJlYWxMZW4pOworICAgIFN0cmVhbUJ1ZmZlciA9IFN0cmVhbUJ1ZmZlci5kcm9wX2Zyb250KFJlYWxMZW4pOworCisgICAgUmVjb3JkIFIoc3RhdGljX2Nhc3Q8ZGVjbHR5cGUoUmVjb3JkOjpUeXBlKT4oKHVpbnQxNl90KVByZWZpeC0+UmVjb3JkS2luZCksCisgICAgICAgICAgICAgRGF0YSk7CisgICAgaWYgKGF1dG8gRUMgPSBGKFIpKQorICAgICAgcmV0dXJuIEVDOworICB9CisgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworfQorCisvLy8gUmVhZCBhIGNvbXBsZXRlIHJlY29yZCBmcm9tIGEgc3RyZWFtIGF0IGEgcmFuZG9tIG9mZnNldC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLaW5kPgoraW5saW5lIEV4cGVjdGVkPENWUmVjb3JkPEtpbmQ+PiByZWFkQ1ZSZWNvcmRGcm9tU3RyZWFtKEJpbmFyeVN0cmVhbVJlZiBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT2Zmc2V0KSB7CisgIGNvbnN0IFJlY29yZFByZWZpeCAqUHJlZml4ID0gbnVsbHB0cjsKKyAgQmluYXJ5U3RyZWFtUmVhZGVyIFJlYWRlcihTdHJlYW0pOworICBSZWFkZXIuc2V0T2Zmc2V0KE9mZnNldCk7CisKKyAgaWYgKGF1dG8gRUMgPSBSZWFkZXIucmVhZE9iamVjdChQcmVmaXgpKQorICAgIHJldHVybiBzdGQ6Om1vdmUoRUMpOworICBpZiAoUHJlZml4LT5SZWNvcmRMZW4gPCAyKQorICAgIHJldHVybiBtYWtlX2Vycm9yPENvZGVWaWV3RXJyb3I+KGN2X2Vycm9yX2NvZGU6OmNvcnJ1cHRfcmVjb3JkKTsKKyAgS2luZCBLID0gc3RhdGljX2Nhc3Q8S2luZD4odWludDE2X3QoUHJlZml4LT5SZWNvcmRLaW5kKSk7CisKKyAgUmVhZGVyLnNldE9mZnNldChPZmZzZXQpOworICBBcnJheVJlZjx1aW50OF90PiBSYXdEYXRhOworICBpZiAoYXV0byBFQyA9IFJlYWRlci5yZWFkQnl0ZXMoUmF3RGF0YSwgUHJlZml4LT5SZWNvcmRMZW4gKyBzaXplb2YodWludDE2X3QpKSkKKyAgICByZXR1cm4gc3RkOjptb3ZlKEVDKTsKKyAgcmV0dXJuIGNvZGV2aWV3OjpDVlJlY29yZDxLaW5kPihLLCBSYXdEYXRhKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLaW5kPgorc3RydWN0IFZhclN0cmVhbUFycmF5RXh0cmFjdG9yPGNvZGV2aWV3OjpDVlJlY29yZDxLaW5kPj4geworICBFcnJvciBvcGVyYXRvcigpKEJpbmFyeVN0cmVhbVJlZiBTdHJlYW0sIHVpbnQzMl90ICZMZW4sCisgICAgICAgICAgICAgICAgICAgY29kZXZpZXc6OkNWUmVjb3JkPEtpbmQ+ICZJdGVtKSB7CisgICAgYXV0byBFeHBlY3RlZFJlYyA9IGNvZGV2aWV3OjpyZWFkQ1ZSZWNvcmRGcm9tU3RyZWFtPEtpbmQ+KFN0cmVhbSwgMCk7CisgICAgaWYgKCFFeHBlY3RlZFJlYykKKyAgICAgIHJldHVybiBFeHBlY3RlZFJlYy50YWtlRXJyb3IoKTsKKyAgICBJdGVtID0gKkV4cGVjdGVkUmVjOworICAgIExlbiA9IEV4cGVjdGVkUmVjLT5sZW5ndGgoKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1JFQ09SRElURVJBVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NWU3ltYm9sVmlzaXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ1ZTeW1ib2xWaXNpdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4Y2QxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NWU3ltYm9sVmlzaXRvci5oCkBAIC0wLDAgKzEsMzkgQEAKKy8vPT09LSBDVlN5bWJvbFZpc2l0b3IuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfQ1ZTWU1CT0xWSVNJVE9SX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfQ1ZTWU1CT0xWSVNJVE9SX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NWUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xWaXNpdG9yRGVsZWdhdGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JPci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworY2xhc3MgU3ltYm9sVmlzaXRvckNhbGxiYWNrczsKKworY2xhc3MgQ1ZTeW1ib2xWaXNpdG9yIHsKK3B1YmxpYzoKKyAgQ1ZTeW1ib2xWaXNpdG9yKFN5bWJvbFZpc2l0b3JDYWxsYmFja3MgJkNhbGxiYWNrcyk7CisKKyAgRXJyb3IgdmlzaXRTeW1ib2xSZWNvcmQoQ1ZTeW1ib2wgJlJlY29yZCk7CisgIEVycm9yIHZpc2l0U3ltYm9sUmVjb3JkKENWU3ltYm9sICZSZWNvcmQsIHVpbnQzMl90IE9mZnNldCk7CisgIEVycm9yIHZpc2l0U3ltYm9sU3RyZWFtKGNvbnN0IENWU3ltYm9sQXJyYXkgJlN5bWJvbHMpOworICBFcnJvciB2aXNpdFN5bWJvbFN0cmVhbShjb25zdCBDVlN5bWJvbEFycmF5ICZTeW1ib2xzLCB1aW50MzJfdCBJbml0aWFsT2Zmc2V0KTsKKworcHJpdmF0ZToKKyAgU3ltYm9sVmlzaXRvckNhbGxiYWNrcyAmQ2FsbGJhY2tzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfQ1ZTWU1CT0xWSVNJVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NWVHlwZVZpc2l0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NWVHlwZVZpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzY1YmExCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ1ZUeXBlVmlzaXRvci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8vPT09LSBDVlR5cGVWaXNpdG9yLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfQ1ZUWVBFVklTSVRPUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0NWVFlQRVZJU0lUT1JfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ1ZSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CitjbGFzcyBUeXBlQ29sbGVjdGlvbjsKK2NsYXNzIFR5cGVWaXNpdG9yQ2FsbGJhY2tzOworCitlbnVtIFZpc2l0b3JEYXRhU291cmNlIHsKKyAgVkRTX0J5dGVzUHJlc2VudCwgLy8gVGhlIHJlY29yZCBieXRlcyBhcmUgcGFzc2VkIGludG8gdGhlIHZpc2l0YXRpb24KKyAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24uICBUaGUgYWxnb3JpdGhtIHNob3VsZCBmaXJzdCBkZXNlcmlhbGl6ZSB0aGVtCisgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBwYXNzaW5nIHRoZW0gb24gdGhyb3VnaCB0aGUgcGlwZWxpbmUuCisgIFZEU19CeXRlc0V4dGVybmFsIC8vIFRoZSByZWNvcmQgYnl0ZXMgYXJlIG5vdCBwcmVzZW50LCBhbmQgaXQgaXMgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB2aXNpdG9yIGNhbGxiYWNrIGludGVyZmFjZSB0bworICAgICAgICAgICAgICAgICAgICAvLyBzdXBwbHkgdGhlIGJ5dGVzLgorfTsKKworRXJyb3IgdmlzaXRUeXBlUmVjb3JkKENWVHlwZSAmUmVjb3JkLCBUeXBlSW5kZXggSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgVHlwZVZpc2l0b3JDYWxsYmFja3MgJkNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICBWaXNpdG9yRGF0YVNvdXJjZSBTb3VyY2UgPSBWRFNfQnl0ZXNQcmVzZW50KTsKK0Vycm9yIHZpc2l0VHlwZVJlY29yZChDVlR5cGUgJlJlY29yZCwgVHlwZVZpc2l0b3JDYWxsYmFja3MgJkNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICBWaXNpdG9yRGF0YVNvdXJjZSBTb3VyY2UgPSBWRFNfQnl0ZXNQcmVzZW50KTsKKworRXJyb3IgdmlzaXRNZW1iZXJSZWNvcmQoQ1ZNZW1iZXJSZWNvcmQgUmVjb3JkLCBUeXBlVmlzaXRvckNhbGxiYWNrcyAmQ2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgVmlzaXRvckRhdGFTb3VyY2UgU291cmNlID0gVkRTX0J5dGVzUHJlc2VudCk7CitFcnJvciB2aXNpdE1lbWJlclJlY29yZChUeXBlTGVhZktpbmQgS2luZCwgQXJyYXlSZWY8dWludDhfdD4gUmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVZpc2l0b3JDYWxsYmFja3MgJkNhbGxiYWNrcyk7CisKK0Vycm9yIHZpc2l0TWVtYmVyUmVjb3JkU3RyZWFtKEFycmF5UmVmPHVpbnQ4X3Q+IEZpZWxkTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVWaXNpdG9yQ2FsbGJhY2tzICZDYWxsYmFja3MpOworCitFcnJvciB2aXNpdFR5cGVTdHJlYW0oY29uc3QgQ1ZUeXBlQXJyYXkgJlR5cGVzLCBUeXBlVmlzaXRvckNhbGxiYWNrcyAmQ2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgIFZpc2l0b3JEYXRhU291cmNlIFNvdXJjZSA9IFZEU19CeXRlc1ByZXNlbnQpOworRXJyb3IgdmlzaXRUeXBlU3RyZWFtKENWVHlwZVJhbmdlIFR5cGVzLCBUeXBlVmlzaXRvckNhbGxiYWNrcyAmQ2FsbGJhY2tzKTsKK0Vycm9yIHZpc2l0VHlwZVN0cmVhbShUeXBlQ29sbGVjdGlvbiAmVHlwZXMsIFR5cGVWaXNpdG9yQ2FsbGJhY2tzICZDYWxsYmFja3MpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19DVlRZUEVWSVNJVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMWU0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oCkBAIC0wLDAgKzEsNTgwIEBACisvLz09PS0gQ29kZVZpZXcuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIERlZmluZXMgY29uc3RhbnRzIGFuZCBiYXNpYyB0eXBlcyBkZXNjcmliaW5nIENvZGVWaWV3IGRlYnVnIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfQ09ERVZJRVdfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19DT0RFVklFV19ICisKKyNpbmNsdWRlIDxjaW50dHlwZXM+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CisKKy8vLyBEaXN0aW5ndWlzaGVzIGluZGl2aWR1YWwgcmVjb3JkcyBpbiAuZGVidWckVCBzZWN0aW9uIG9yIFBEQiB0eXBlIHN0cmVhbS4gVGhlCisvLy8gZG9jdW1lbnRhdGlvbiBhbmQgaGVhZGVycyB0YWxrIGFib3V0IHRoaXMgYXMgdGhlICJsZWFmIiB0eXBlLgorZW51bSBjbGFzcyBUeXBlUmVjb3JkS2luZCA6IHVpbnQxNl90IHsKKyNkZWZpbmUgVFlQRV9SRUNPUkQobGZfZW5hbWUsIHZhbHVlLCBuYW1lKSBuYW1lID0gdmFsdWUsCisjaW5jbHVkZSAiQ29kZVZpZXdUeXBlcy5kZWYiCit9OworCisvLy8gRHVwbGljYXRlIGNvcHkgb2YgdGhlIGFib3ZlIGVudW0sIGJ1dCB1c2luZyB0aGUgb2ZmaWNpYWwgQ1YgbmFtZXMuIFVzZWZ1bAorLy8vIGZvciByZWZlcmVuY2UgcHVycG9zZXMgYW5kIHdoZW4gZGVhbGluZyB3aXRoIHVua25vd24gcmVjb3JkIHR5cGVzLgorZW51bSBUeXBlTGVhZktpbmQgOiB1aW50MTZfdCB7CisjZGVmaW5lIENWX1RZUEUobmFtZSwgdmFsKSBuYW1lID0gdmFsLAorI2luY2x1ZGUgIkNvZGVWaWV3VHlwZXMuZGVmIgorfTsKKworLy8vIERpc3Rpbmd1aXNoZXMgaW5kaXZpZHVhbCByZWNvcmRzIGluIHRoZSBTeW1ib2xzIHN1YnNlY3Rpb24gb2YgYSAuZGVidWckUworLy8vIHNlY3Rpb24uIEVxdWl2YWxlbnQgdG8gU1lNX0VOVU1fZSBpbiBjdmluZm8uaC4KK2VudW0gY2xhc3MgU3ltYm9sUmVjb3JkS2luZCA6IHVpbnQxNl90IHsKKyNkZWZpbmUgU1lNQk9MX1JFQ09SRChsZl9lbmFtZSwgdmFsdWUsIG5hbWUpIG5hbWUgPSB2YWx1ZSwKKyNpbmNsdWRlICJDb2RlVmlld1N5bWJvbHMuZGVmIgorfTsKKworLy8vIER1cGxpY2F0ZSBjb3B5IG9mIHRoZSBhYm92ZSBlbnVtLCBidXQgdXNpbmcgdGhlIG9mZmljaWFsIENWIG5hbWVzLiBVc2VmdWwKKy8vLyBmb3IgcmVmZXJlbmNlIHB1cnBvc2VzIGFuZCB3aGVuIGRlYWxpbmcgd2l0aCB1bmtub3duIHJlY29yZCB0eXBlcy4KK2VudW0gU3ltYm9sS2luZCA6IHVpbnQxNl90IHsKKyNkZWZpbmUgQ1ZfU1lNQk9MKG5hbWUsIHZhbCkgbmFtZSA9IHZhbCwKKyNpbmNsdWRlICJDb2RlVmlld1N5bWJvbHMuZGVmIgorfTsKKworI2RlZmluZSBDVl9ERUZJTkVfRU5VTV9DTEFTU19GTEFHU19PUEVSQVRPUlMoQ2xhc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIENsYXNzIG9wZXJhdG9yfChDbGFzcyBhLCBDbGFzcyBiKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PENsYXNzPiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0aWNfY2FzdDxzdGQ6OnVuZGVybHlpbmdfdHlwZTxDbGFzcz46OnR5cGU+KGEpIHwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhdGljX2Nhc3Q8c3RkOjp1bmRlcmx5aW5nX3R5cGU8Q2xhc3M+Ojp0eXBlPihiKSk7ICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgQ2xhc3Mgb3BlcmF0b3ImKENsYXNzIGEsIENsYXNzIGIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2xhc3M+KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpY19jYXN0PHN0ZDo6dW5kZXJseWluZ190eXBlPENsYXNzPjo6dHlwZT4oYSkgJiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0aWNfY2FzdDxzdGQ6OnVuZGVybHlpbmdfdHlwZTxDbGFzcz46OnR5cGU+KGIpKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBDbGFzcyBvcGVyYXRvcn4oQ2xhc3MgYSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBzdGF0aWNfY2FzdDxDbGFzcz4oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfnN0YXRpY19jYXN0PHN0ZDo6dW5kZXJseWluZ190eXBlPENsYXNzPjo6dHlwZT4oYSkpOyAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgQ2xhc3MgJm9wZXJhdG9yfD0oQ2xhc3MgJmEsIENsYXNzIGIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhID0gYSB8IGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIENsYXNzICZvcGVyYXRvciY9KENsYXNzICZhLCBDbGFzcyBiKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYSA9IGEgJiBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLy8gVGhlc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIENWX0NQVV9UWVBFX2UgZW51bWVyYXRpb24sIGFuZCBhcmUgZG9jdW1lbnRlZAorLy8vIGhlcmU6IGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYjJmYzY0ZWsuYXNweAorZW51bSBjbGFzcyBDUFVUeXBlIDogdWludDE2X3QgeworICBJbnRlbDgwODAgPSAweDAsCisgIEludGVsODA4NiA9IDB4MSwKKyAgSW50ZWw4MDI4NiA9IDB4MiwKKyAgSW50ZWw4MDM4NiA9IDB4MywKKyAgSW50ZWw4MDQ4NiA9IDB4NCwKKyAgUGVudGl1bSA9IDB4NSwKKyAgUGVudGl1bVBybyA9IDB4NiwKKyAgUGVudGl1bTMgPSAweDcsCisgIE1JUFMgPSAweDEwLAorICBNSVBTMTYgPSAweDExLAorICBNSVBTMzIgPSAweDEyLAorICBNSVBTNjQgPSAweDEzLAorICBNSVBTSSA9IDB4MTQsCisgIE1JUFNJSSA9IDB4MTUsCisgIE1JUFNJSUkgPSAweDE2LAorICBNSVBTSVYgPSAweDE3LAorICBNSVBTViA9IDB4MTgsCisgIE02ODAwMCA9IDB4MjAsCisgIE02ODAxMCA9IDB4MjEsCisgIE02ODAyMCA9IDB4MjIsCisgIE02ODAzMCA9IDB4MjMsCisgIE02ODA0MCA9IDB4MjQsCisgIEFscGhhID0gMHgzMCwKKyAgQWxwaGEyMTE2NCA9IDB4MzEsCisgIEFscGhhMjExNjRBID0gMHgzMiwKKyAgQWxwaGEyMTI2NCA9IDB4MzMsCisgIEFscGhhMjEzNjQgPSAweDM0LAorICBQUEM2MDEgPSAweDQwLAorICBQUEM2MDMgPSAweDQxLAorICBQUEM2MDQgPSAweDQyLAorICBQUEM2MjAgPSAweDQzLAorICBQUENGUCA9IDB4NDQsCisgIFBQQ0JFID0gMHg0NSwKKyAgU0gzID0gMHg1MCwKKyAgU0gzRSA9IDB4NTEsCisgIFNIM0RTUCA9IDB4NTIsCisgIFNINCA9IDB4NTMsCisgIFNITWVkaWEgPSAweDU0LAorICBBUk0zID0gMHg2MCwKKyAgQVJNNCA9IDB4NjEsCisgIEFSTTRUID0gMHg2MiwKKyAgQVJNNSA9IDB4NjMsCisgIEFSTTVUID0gMHg2NCwKKyAgQVJNNiA9IDB4NjUsCisgIEFSTV9YTUFDID0gMHg2NiwKKyAgQVJNX1dNTVggPSAweDY3LAorICBBUk03ID0gMHg2OCwKKyAgQVJNNjQgPSAweDY5LAorICBPbW5pID0gMHg3MCwKKyAgSWE2NCA9IDB4ODAsCisgIElhNjRfMiA9IDB4ODEsCisgIENFRSA9IDB4OTAsCisgIEFNMzMgPSAweGEwLAorICBNMzJSID0gMHhiMCwKKyAgVHJpQ29yZSA9IDB4YzAsCisgIFg2NCA9IDB4ZDAsCisgIEVCQyA9IDB4ZTAsCisgIFRodW1iID0gMHhmMCwKKyAgQVJNTlQgPSAweGY0LAorICBEM0QxMV9TaGFkZXIgPSAweDEwMCwKK307CisKKy8vLyBUaGVzZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgQ1ZfQ0ZMX0xBTkcgZW51bWVyYXRpb24sIGFuZCBhcmUgZG9jdW1lbnRlZAorLy8vIGhlcmU6IGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYnczYWVrdzYuYXNweAorZW51bSBTb3VyY2VMYW5ndWFnZSA6IHVpbnQ4X3QgeworICBDID0gMHgwMCwKKyAgQ3BwID0gMHgwMSwKKyAgRm9ydHJhbiA9IDB4MDIsCisgIE1hc20gPSAweDAzLAorICBQYXNjYWwgPSAweDA0LAorICBCYXNpYyA9IDB4MDUsCisgIENvYm9sID0gMHgwNiwKKyAgTGluayA9IDB4MDcsCisgIEN2dHJlcyA9IDB4MDgsCisgIEN2dHBnZCA9IDB4MDksCisgIENTaGFycCA9IDB4MGEsCisgIFZCID0gMHgwYiwKKyAgSUxBc20gPSAweDBjLAorICBKYXZhID0gMHgwZCwKKyAgSlNjcmlwdCA9IDB4MGUsCisgIE1TSUwgPSAweDBmLAorICBITFNMID0gMHgxMCwKKworICAvLy8gVGhlIERNRCBjb21waWxlciBlbWl0cyAnRCcgZm9yIHRoZSBDViBzb3VyY2UgbGFuZ3VhZ2UuIE1pY3Jvc29mdCBkb2Vzbid0CisgIC8vLyBoYXZlIGFuIGVudW1lcmF0b3IgZm9yIGl0IHlldC4KKyAgRCA9ICdEJywKK307CisKKy8vLyBUaGVzZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgQ1ZfY2FsbF9lIGVudW1lcmF0aW9uLCBhbmQgYXJlIGRvY3VtZW50ZWQKKy8vLyBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKy8vLyAgIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYjJmYzY0ZWsuYXNweAorLy8vICAgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvbXM2ODAyMDcodj12cy44NSkuYXNweAorLy8vCitlbnVtIGNsYXNzIENhbGxpbmdDb252ZW50aW9uIDogdWludDhfdCB7CisgIE5lYXJDID0gMHgwMCwgICAgICAgLy8gbmVhciByaWdodCB0byBsZWZ0IHB1c2gsIGNhbGxlciBwb3BzIHN0YWNrCisgIEZhckMgPSAweDAxLCAgICAgICAgLy8gZmFyIHJpZ2h0IHRvIGxlZnQgcHVzaCwgY2FsbGVyIHBvcHMgc3RhY2sKKyAgTmVhclBhc2NhbCA9IDB4MDIsICAvLyBuZWFyIGxlZnQgdG8gcmlnaHQgcHVzaCwgY2FsbGVlIHBvcHMgc3RhY2sKKyAgRmFyUGFzY2FsID0gMHgwMywgICAvLyBmYXIgbGVmdCB0byByaWdodCBwdXNoLCBjYWxsZWUgcG9wcyBzdGFjaworICBOZWFyRmFzdCA9IDB4MDQsICAgIC8vIG5lYXIgbGVmdCB0byByaWdodCBwdXNoIHdpdGggcmVncywgY2FsbGVlIHBvcHMgc3RhY2sKKyAgRmFyRmFzdCA9IDB4MDUsICAgICAvLyBmYXIgbGVmdCB0byByaWdodCBwdXNoIHdpdGggcmVncywgY2FsbGVlIHBvcHMgc3RhY2sKKyAgTmVhclN0ZENhbGwgPSAweDA3LCAvLyBuZWFyIHN0YW5kYXJkIGNhbGwKKyAgRmFyU3RkQ2FsbCA9IDB4MDgsICAvLyBmYXIgc3RhbmRhcmQgY2FsbAorICBOZWFyU3lzQ2FsbCA9IDB4MDksIC8vIG5lYXIgc3lzIGNhbGwKKyAgRmFyU3lzQ2FsbCA9IDB4MGEsICAvLyBmYXIgc3lzIGNhbGwKKyAgVGhpc0NhbGwgPSAweDBiLCAgICAvLyB0aGlzIGNhbGwgKHRoaXMgcGFzc2VkIGluIHJlZ2lzdGVyKQorICBNaXBzQ2FsbCA9IDB4MGMsICAgIC8vIE1pcHMgY2FsbAorICBHZW5lcmljID0gMHgwZCwgICAgIC8vIEdlbmVyaWMgY2FsbCBzZXF1ZW5jZQorICBBbHBoYUNhbGwgPSAweDBlLCAgIC8vIEFscGhhIGNhbGwKKyAgUHBjQ2FsbCA9IDB4MGYsICAgICAvLyBQUEMgY2FsbAorICBTSENhbGwgPSAweDEwLCAgICAgIC8vIEhpdGFjaGkgU3VwZXJIIGNhbGwKKyAgQXJtQ2FsbCA9IDB4MTEsICAgICAvLyBBUk0gY2FsbAorICBBTTMzQ2FsbCA9IDB4MTIsICAgIC8vIEFNMzMgY2FsbAorICBUcmlDYWxsID0gMHgxMywgICAgIC8vIFRyaUNvcmUgQ2FsbAorICBTSDVDYWxsID0gMHgxNCwgICAgIC8vIEhpdGFjaGkgU3VwZXJILTUgY2FsbAorICBNMzJSQ2FsbCA9IDB4MTUsICAgIC8vIE0zMlIgQ2FsbAorICBDbHJDYWxsID0gMHgxNiwgICAgIC8vIGNsciBjYWxsCisgIElubGluZSA9CisgICAgICAweDE3LCAvLyBNYXJrZXIgZm9yIHJvdXRpbmVzIGFsd2F5cyBpbmxpbmVkIGFuZCB0aHVzIGxhY2tpbmcgYSBjb252ZW50aW9uCisgIE5lYXJWZWN0b3IgPSAweDE4IC8vIG5lYXIgbGVmdCB0byByaWdodCBwdXNoIHdpdGggcmVncywgY2FsbGVlIHBvcHMgc3RhY2sKK307CisKK2VudW0gY2xhc3MgQ2xhc3NPcHRpb25zIDogdWludDE2X3QgeworICBOb25lID0gMHgwMDAwLAorICBQYWNrZWQgPSAweDAwMDEsCisgIEhhc0NvbnN0cnVjdG9yT3JEZXN0cnVjdG9yID0gMHgwMDAyLAorICBIYXNPdmVybG9hZGVkT3BlcmF0b3IgPSAweDAwMDQsCisgIE5lc3RlZCA9IDB4MDAwOCwKKyAgQ29udGFpbnNOZXN0ZWRDbGFzcyA9IDB4MDAxMCwKKyAgSGFzT3ZlcmxvYWRlZEFzc2lnbm1lbnRPcGVyYXRvciA9IDB4MDAyMCwKKyAgSGFzQ29udmVyc2lvbk9wZXJhdG9yID0gMHgwMDQwLAorICBGb3J3YXJkUmVmZXJlbmNlID0gMHgwMDgwLAorICBTY29wZWQgPSAweDAxMDAsCisgIEhhc1VuaXF1ZU5hbWUgPSAweDAyMDAsCisgIFNlYWxlZCA9IDB4MDQwMCwKKyAgSW50cmluc2ljID0gMHgyMDAwCit9OworQ1ZfREVGSU5FX0VOVU1fQ0xBU1NfRkxBR1NfT1BFUkFUT1JTKENsYXNzT3B0aW9ucykKKworZW51bSBjbGFzcyBGcmFtZVByb2NlZHVyZU9wdGlvbnMgOiB1aW50MzJfdCB7CisgIE5vbmUgPSAweDAwMDAwMDAwLAorICBIYXNBbGxvY2EgPSAweDAwMDAwMDAxLAorICBIYXNTZXRKbXAgPSAweDAwMDAwMDAyLAorICBIYXNMb25nSm1wID0gMHgwMDAwMDAwNCwKKyAgSGFzSW5saW5lQXNzZW1ibHkgPSAweDAwMDAwMDA4LAorICBIYXNFeGNlcHRpb25IYW5kbGluZyA9IDB4MDAwMDAwMTAsCisgIE1hcmtlZElubGluZSA9IDB4MDAwMDAwMjAsCisgIEhhc1N0cnVjdHVyZWRFeGNlcHRpb25IYW5kbGluZyA9IDB4MDAwMDAwNDAsCisgIE5ha2VkID0gMHgwMDAwMDA4MCwKKyAgU2VjdXJpdHlDaGVja3MgPSAweDAwMDAwMTAwLAorICBBc3luY2hyb25vdXNFeGNlcHRpb25IYW5kbGluZyA9IDB4MDAwMDAyMDAsCisgIE5vU3RhY2tPcmRlcmluZ0ZvclNlY3VyaXR5Q2hlY2tzID0gMHgwMDAwMDQwMCwKKyAgSW5saW5lZCA9IDB4MDAwMDA4MDAsCisgIFN0cmljdFNlY3VyaXR5Q2hlY2tzID0gMHgwMDAwMTAwMCwKKyAgU2FmZUJ1ZmZlcnMgPSAweDAwMDAyMDAwLAorICBQcm9maWxlR3VpZGVkT3B0aW1pemF0aW9uID0gMHgwMDA0MDAwMCwKKyAgVmFsaWRQcm9maWxlQ291bnRzID0gMHgwMDA4MDAwMCwKKyAgT3B0aW1pemVkRm9yU3BlZWQgPSAweDAwMTAwMDAwLAorICBHdWFyZENmZyA9IDB4MDAyMDAwMDAsCisgIEd1YXJkQ2Z3ID0gMHgwMDQwMDAwMAorfTsKK0NWX0RFRklORV9FTlVNX0NMQVNTX0ZMQUdTX09QRVJBVE9SUyhGcmFtZVByb2NlZHVyZU9wdGlvbnMpCisKK2VudW0gY2xhc3MgRnVuY3Rpb25PcHRpb25zIDogdWludDhfdCB7CisgIE5vbmUgPSAweDAwLAorICBDeHhSZXR1cm5VZHQgPSAweDAxLAorICBDb25zdHJ1Y3RvciA9IDB4MDIsCisgIENvbnN0cnVjdG9yV2l0aFZpcnR1YWxCYXNlcyA9IDB4MDQKK307CitDVl9ERUZJTkVfRU5VTV9DTEFTU19GTEFHU19PUEVSQVRPUlMoRnVuY3Rpb25PcHRpb25zKQorCitlbnVtIGNsYXNzIEhmYUtpbmQgOiB1aW50OF90IHsKKyAgTm9uZSA9IDB4MDAsCisgIEZsb2F0ID0gMHgwMSwKKyAgRG91YmxlID0gMHgwMiwKKyAgT3RoZXIgPSAweDAzCit9OworCisvLy8gU291cmNlLWxldmVsIGFjY2VzcyBzcGVjaWZpZXIuIChDVl9hY2Nlc3NfZSkKK2VudW0gY2xhc3MgTWVtYmVyQWNjZXNzIDogdWludDhfdCB7CisgIE5vbmUgPSAwLAorICBQcml2YXRlID0gMSwKKyAgUHJvdGVjdGVkID0gMiwKKyAgUHVibGljID0gMworfTsKKworLy8vIFBhcnQgb2YgbWVtYmVyIGF0dHJpYnV0ZSBmbGFncy4gKENWX21ldGhvZHByb3BfZSkKK2VudW0gY2xhc3MgTWV0aG9kS2luZCA6IHVpbnQ4X3QgeworICBWYW5pbGxhID0gMHgwMCwKKyAgVmlydHVhbCA9IDB4MDEsCisgIFN0YXRpYyA9IDB4MDIsCisgIEZyaWVuZCA9IDB4MDMsCisgIEludHJvZHVjaW5nVmlydHVhbCA9IDB4MDQsCisgIFB1cmVWaXJ0dWFsID0gMHgwNSwKKyAgUHVyZUludHJvZHVjaW5nVmlydHVhbCA9IDB4MDYKK307CisKKy8vLyBFcXVpdmFsZW50IHRvIENWX2ZsZGF0dHJfdCBiaXRmaWVsZC4KK2VudW0gY2xhc3MgTWV0aG9kT3B0aW9ucyA6IHVpbnQxNl90IHsKKyAgTm9uZSA9IDB4MDAwMCwKKyAgQWNjZXNzTWFzayA9IDB4MDAwMywKKyAgTWV0aG9kS2luZE1hc2sgPSAweDAwMWMsCisgIFBzZXVkbyA9IDB4MDAyMCwKKyAgTm9Jbmhlcml0ID0gMHgwMDQwLAorICBOb0NvbnN0cnVjdCA9IDB4MDA4MCwKKyAgQ29tcGlsZXJHZW5lcmF0ZWQgPSAweDAxMDAsCisgIFNlYWxlZCA9IDB4MDIwMAorfTsKK0NWX0RFRklORV9FTlVNX0NMQVNTX0ZMQUdTX09QRVJBVE9SUyhNZXRob2RPcHRpb25zKQorCisvLy8gRXF1aXZhbGVudCB0byBDVl9MQUJFTF9UWVBFX2UuCitlbnVtIGNsYXNzIExhYmVsVHlwZSA6IHVpbnQxNl90IHsKKyAgTmVhciA9IDB4MCwKKyAgRmFyID0gMHg0LAorfTsKKworLy8vIEVxdWl2YWxlbnQgdG8gQ1ZfbW9kaWZpZXJfdC4KKy8vLyBUT0RPOiBBZGQgZmxhZyBmb3IgX0F0b21pYyBtb2RpZmllcgorZW51bSBjbGFzcyBNb2RpZmllck9wdGlvbnMgOiB1aW50MTZfdCB7CisgIE5vbmUgPSAweDAwMDAsCisgIENvbnN0ID0gMHgwMDAxLAorICBWb2xhdGlsZSA9IDB4MDAwMiwKKyAgVW5hbGlnbmVkID0gMHgwMDA0Cit9OworQ1ZfREVGSU5FX0VOVU1fQ0xBU1NfRkxBR1NfT1BFUkFUT1JTKE1vZGlmaWVyT3B0aW9ucykKKworZW51bSBjbGFzcyBEZWJ1Z1N1YnNlY3Rpb25LaW5kIDogdWludDMyX3QgeworICBOb25lID0gMCwKKyAgU3ltYm9scyA9IDB4ZjEsCisgIExpbmVzID0gMHhmMiwKKyAgU3RyaW5nVGFibGUgPSAweGYzLAorICBGaWxlQ2hlY2tzdW1zID0gMHhmNCwKKyAgRnJhbWVEYXRhID0gMHhmNSwKKyAgSW5saW5lZUxpbmVzID0gMHhmNiwKKyAgQ3Jvc3NTY29wZUltcG9ydHMgPSAweGY3LAorICBDcm9zc1Njb3BlRXhwb3J0cyA9IDB4ZjgsCisKKyAgLy8gVGhlc2UgYXBwZWFyIHRvIHJlbGF0ZSB0byAuTmV0IGFzc2VtYmx5IGluZm8uCisgIElMTGluZXMgPSAweGY5LAorICBGdW5jTURUb2tlbk1hcCA9IDB4ZmEsCisgIFR5cGVNRFRva2VuTWFwID0gMHhmYiwKKyAgTWVyZ2VkQXNzZW1ibHlJbnB1dCA9IDB4ZmMsCisKKyAgQ29mZlN5bWJvbFJWQSA9IDB4ZmQsCit9OworCisvLy8gRXF1aXZhbGVudCB0byBDVl9wdHJ0eXBlX2UuCitlbnVtIGNsYXNzIFBvaW50ZXJLaW5kIDogdWludDhfdCB7CisgIE5lYXIxNiA9IDB4MDAsICAgICAgICAgICAgICAgIC8vIDE2IGJpdCBwb2ludGVyCisgIEZhcjE2ID0gMHgwMSwgICAgICAgICAgICAgICAgIC8vIDE2OjE2IGZhciBwb2ludGVyCisgIEh1Z2UxNiA9IDB4MDIsICAgICAgICAgICAgICAgIC8vIDE2OjE2IGh1Z2UgcG9pbnRlcgorICBCYXNlZE9uU2VnbWVudCA9IDB4MDMsICAgICAgICAvLyBiYXNlZCBvbiBzZWdtZW50CisgIEJhc2VkT25WYWx1ZSA9IDB4MDQsICAgICAgICAgIC8vIGJhc2VkIG9uIHZhbHVlIG9mIGJhc2UKKyAgQmFzZWRPblNlZ21lbnRWYWx1ZSA9IDB4MDUsICAgLy8gYmFzZWQgb24gc2VnbWVudCB2YWx1ZSBvZiBiYXNlCisgIEJhc2VkT25BZGRyZXNzID0gMHgwNiwgICAgICAgIC8vIGJhc2VkIG9uIGFkZHJlc3Mgb2YgYmFzZQorICBCYXNlZE9uU2VnbWVudEFkZHJlc3MgPSAweDA3LCAvLyBiYXNlZCBvbiBzZWdtZW50IGFkZHJlc3Mgb2YgYmFzZQorICBCYXNlZE9uVHlwZSA9IDB4MDgsICAgICAgICAgICAvLyBiYXNlZCBvbiB0eXBlCisgIEJhc2VkT25TZWxmID0gMHgwOSwgICAgICAgICAgIC8vIGJhc2VkIG9uIHNlbGYKKyAgTmVhcjMyID0gMHgwYSwgICAgICAgICAgICAgICAgLy8gMzIgYml0IHBvaW50ZXIKKyAgRmFyMzIgPSAweDBiLCAgICAgICAgICAgICAgICAgLy8gMTY6MzIgcG9pbnRlcgorICBOZWFyNjQgPSAweDBjICAgICAgICAgICAgICAgICAvLyA2NCBiaXQgcG9pbnRlcgorfTsKKworLy8vIEVxdWl2YWxlbnQgdG8gQ1ZfcHRybW9kZV9lLgorZW51bSBjbGFzcyBQb2ludGVyTW9kZSA6IHVpbnQ4X3QgeworICBQb2ludGVyID0gMHgwMCwgICAgICAgICAgICAgICAgIC8vICJub3JtYWwiIHBvaW50ZXIKKyAgTFZhbHVlUmVmZXJlbmNlID0gMHgwMSwgICAgICAgICAvLyAib2xkIiByZWZlcmVuY2UKKyAgUG9pbnRlclRvRGF0YU1lbWJlciA9IDB4MDIsICAgICAvLyBwb2ludGVyIHRvIGRhdGEgbWVtYmVyCisgIFBvaW50ZXJUb01lbWJlckZ1bmN0aW9uID0gMHgwMywgLy8gcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24KKyAgUlZhbHVlUmVmZXJlbmNlID0gMHgwNCAgICAgICAgICAvLyByLXZhbHVlIHJlZmVyZW5jZQorfTsKKworLy8vIEVxdWl2YWxlbnQgdG8gbWlzYyBsZlBvaW50ZXJBdHRyIGJpdGZpZWxkcy4KK2VudW0gY2xhc3MgUG9pbnRlck9wdGlvbnMgOiB1aW50MzJfdCB7CisgIE5vbmUgPSAweDAwMDAwMDAwLAorICBGbGF0MzIgPSAweDAwMDAwMTAwLAorICBWb2xhdGlsZSA9IDB4MDAwMDAyMDAsCisgIENvbnN0ID0gMHgwMDAwMDQwMCwKKyAgVW5hbGlnbmVkID0gMHgwMDAwMDgwMCwKKyAgUmVzdHJpY3QgPSAweDAwMDAxMDAwLAorICBXaW5SVFNtYXJ0UG9pbnRlciA9IDB4MDAwODAwMDAKK307CitDVl9ERUZJTkVfRU5VTV9DTEFTU19GTEFHU19PUEVSQVRPUlMoUG9pbnRlck9wdGlvbnMpCisKKy8vLyBFcXVpdmFsZW50IHRvIENWX3BtdHlwZV9lLgorZW51bSBjbGFzcyBQb2ludGVyVG9NZW1iZXJSZXByZXNlbnRhdGlvbiA6IHVpbnQxNl90IHsKKyAgVW5rbm93biA9IDB4MDAsICAgICAgICAgICAgICAgICAgICAgLy8gbm90IHNwZWNpZmllZCAocHJlIFZDOCkKKyAgU2luZ2xlSW5oZXJpdGFuY2VEYXRhID0gMHgwMSwgICAgICAgLy8gbWVtYmVyIGRhdGEsIHNpbmdsZSBpbmhlcml0YW5jZQorICBNdWx0aXBsZUluaGVyaXRhbmNlRGF0YSA9IDB4MDIsICAgICAvLyBtZW1iZXIgZGF0YSwgbXVsdGlwbGUgaW5oZXJpdGFuY2UKKyAgVmlydHVhbEluaGVyaXRhbmNlRGF0YSA9IDB4MDMsICAgICAgLy8gbWVtYmVyIGRhdGEsIHZpcnR1YWwgaW5oZXJpdGFuY2UKKyAgR2VuZXJhbERhdGEgPSAweDA0LCAgICAgICAgICAgICAgICAgLy8gbWVtYmVyIGRhdGEsIG1vc3QgZ2VuZXJhbAorICBTaW5nbGVJbmhlcml0YW5jZUZ1bmN0aW9uID0gMHgwNSwgICAvLyBtZW1iZXIgZnVuY3Rpb24sIHNpbmdsZSBpbmhlcml0YW5jZQorICBNdWx0aXBsZUluaGVyaXRhbmNlRnVuY3Rpb24gPSAweDA2LCAvLyBtZW1iZXIgZnVuY3Rpb24sIG11bHRpcGxlIGluaGVyaXRhbmNlCisgIFZpcnR1YWxJbmhlcml0YW5jZUZ1bmN0aW9uID0gMHgwNywgIC8vIG1lbWJlciBmdW5jdGlvbiwgdmlydHVhbCBpbmhlcml0YW5jZQorICBHZW5lcmFsRnVuY3Rpb24gPSAweDA4ICAgICAgICAgICAgICAvLyBtZW1iZXIgZnVuY3Rpb24sIG1vc3QgZ2VuZXJhbAorfTsKKworZW51bSBjbGFzcyBWRlRhYmxlU2xvdEtpbmQgOiB1aW50OF90IHsKKyAgTmVhcjE2ID0gMHgwMCwKKyAgRmFyMTYgPSAweDAxLAorICBUaGlzID0gMHgwMiwKKyAgT3V0ZXIgPSAweDAzLAorICBNZXRhID0gMHgwNCwKKyAgTmVhciA9IDB4MDUsCisgIEZhciA9IDB4MDYKK307CisKK2VudW0gY2xhc3MgV2luZG93c1JUQ2xhc3NLaW5kIDogdWludDhfdCB7CisgIE5vbmUgPSAweDAwLAorICBSZWZDbGFzcyA9IDB4MDEsCisgIFZhbHVlQ2xhc3MgPSAweDAyLAorICBJbnRlcmZhY2UgPSAweDAzCit9OworCisvLy8gQ29ycmVzcG9uZHMgdG8gQ1ZfTFZBUkZMQUdTIGJpdGZpZWxkLgorZW51bSBjbGFzcyBMb2NhbFN5bUZsYWdzIDogdWludDE2X3QgeworICBOb25lID0gMCwKKyAgSXNQYXJhbWV0ZXIgPSAxIDw8IDAsCisgIElzQWRkcmVzc1Rha2VuID0gMSA8PCAxLAorICBJc0NvbXBpbGVyR2VuZXJhdGVkID0gMSA8PCAyLAorICBJc0FnZ3JlZ2F0ZSA9IDEgPDwgMywKKyAgSXNBZ2dyZWdhdGVkID0gMSA8PCA0LAorICBJc0FsaWFzZWQgPSAxIDw8IDUsCisgIElzQWxpYXMgPSAxIDw8IDYsCisgIElzUmV0dXJuVmFsdWUgPSAxIDw8IDcsCisgIElzT3B0aW1pemVkT3V0ID0gMSA8PCA4LAorICBJc0VucmVnaXN0ZXJlZEdsb2JhbCA9IDEgPDwgOSwKKyAgSXNFbnJlZ2lzdGVyZWRTdGF0aWMgPSAxIDw8IDEwLAorfTsKK0NWX0RFRklORV9FTlVNX0NMQVNTX0ZMQUdTX09QRVJBVE9SUyhMb2NhbFN5bUZsYWdzKQorCisvLy8gQ29ycmVzcG9uZHMgdG8gdGhlIENWX1BVQlNZTUZMQUdTIGJpdGZpZWxkLgorZW51bSBjbGFzcyBQdWJsaWNTeW1GbGFncyA6IHVpbnQzMl90IHsKKyAgTm9uZSA9IDAsCisgIENvZGUgPSAxIDw8IDAsCisgIEZ1bmN0aW9uID0gMSA8PCAxLAorICBNYW5hZ2VkID0gMSA8PCAyLAorICBNU0lMID0gMSA8PCAzLAorfTsKK0NWX0RFRklORV9FTlVNX0NMQVNTX0ZMQUdTX09QRVJBVE9SUyhQdWJsaWNTeW1GbGFncykKKworLy8vIENvcnJlc3BvbmRzIHRvIHRoZSBDVl9QUk9DRkxBR1MgYml0ZmllbGQuCitlbnVtIGNsYXNzIFByb2NTeW1GbGFncyA6IHVpbnQ4X3QgeworICBOb25lID0gMCwKKyAgSGFzRlAgPSAxIDw8IDAsCisgIEhhc0lSRVQgPSAxIDw8IDEsCisgIEhhc0ZSRVQgPSAxIDw8IDIsCisgIElzTm9SZXR1cm4gPSAxIDw8IDMsCisgIElzVW5yZWFjaGFibGUgPSAxIDw8IDQsCisgIEhhc0N1c3RvbUNhbGxpbmdDb252ID0gMSA8PCA1LAorICBJc05vSW5saW5lID0gMSA8PCA2LAorICBIYXNPcHRpbWl6ZWREZWJ1Z0luZm8gPSAxIDw8IDcsCit9OworQ1ZfREVGSU5FX0VOVU1fQ0xBU1NfRkxBR1NfT1BFUkFUT1JTKFByb2NTeW1GbGFncykKKworLy8vIENvcnJlc3BvbmRzIHRvIENPTVBJTEVTWU0yOjpGbGFncyBiaXRmaWVsZC4KK2VudW0gY2xhc3MgQ29tcGlsZVN5bTJGbGFncyA6IHVpbnQzMl90IHsKKyAgTm9uZSA9IDAsCisgIFNvdXJjZUxhbmd1YWdlTWFzayA9IDB4RkYsCisgIEVDID0gMSA8PCA4LAorICBOb0RiZ0luZm8gPSAxIDw8IDksCisgIExUQ0cgPSAxIDw8IDEwLAorICBOb0RhdGFBbGlnbiA9IDEgPDwgMTEsCisgIE1hbmFnZWRQcmVzZW50ID0gMSA8PCAxMiwKKyAgU2VjdXJpdHlDaGVja3MgPSAxIDw8IDEzLAorICBIb3RQYXRjaCA9IDEgPDwgMTQsCisgIENWVENJTCA9IDEgPDwgMTUsCisgIE1TSUxNb2R1bGUgPSAxIDw8IDE2LAorfTsKK0NWX0RFRklORV9FTlVNX0NMQVNTX0ZMQUdTX09QRVJBVE9SUyhDb21waWxlU3ltMkZsYWdzKQorCisvLy8gQ29ycmVzcG9uZHMgdG8gQ09NUElMRVNZTTM6OkZsYWdzIGJpdGZpZWxkLgorZW51bSBjbGFzcyBDb21waWxlU3ltM0ZsYWdzIDogdWludDMyX3QgeworICBOb25lID0gMCwKKyAgU291cmNlTGFuZ3VhZ2VNYXNrID0gMHhGRiwKKyAgRUMgPSAxIDw8IDgsCisgIE5vRGJnSW5mbyA9IDEgPDwgOSwKKyAgTFRDRyA9IDEgPDwgMTAsCisgIE5vRGF0YUFsaWduID0gMSA8PCAxMSwKKyAgTWFuYWdlZFByZXNlbnQgPSAxIDw8IDEyLAorICBTZWN1cml0eUNoZWNrcyA9IDEgPDwgMTMsCisgIEhvdFBhdGNoID0gMSA8PCAxNCwKKyAgQ1ZUQ0lMID0gMSA8PCAxNSwKKyAgTVNJTE1vZHVsZSA9IDEgPDwgMTYsCisgIFNkbCA9IDEgPDwgMTcsCisgIFBHTyA9IDEgPDwgMTgsCisgIEV4cCA9IDEgPDwgMTksCit9OworQ1ZfREVGSU5FX0VOVU1fQ0xBU1NfRkxBR1NfT1BFUkFUT1JTKENvbXBpbGVTeW0zRmxhZ3MpCisKK2VudW0gY2xhc3MgRXhwb3J0RmxhZ3MgOiB1aW50MTZfdCB7CisgIE5vbmUgPSAwLAorICBJc0NvbnN0YW50ID0gMSA8PCAwLAorICBJc0RhdGEgPSAxIDw8IDEsCisgIElzUHJpdmF0ZSA9IDEgPDwgMiwKKyAgSGFzTm9OYW1lID0gMSA8PCAzLAorICBIYXNFeHBsaWNpdE9yZGluYWwgPSAxIDw8IDQsCisgIElzRm9yd2FyZGVyID0gMSA8PCA1Cit9OworQ1ZfREVGSU5FX0VOVU1fQ0xBU1NfRkxBR1NfT1BFUkFUT1JTKEV4cG9ydEZsYWdzKQorCisvLyBDb3JyZXNwb25kcyB0byBCaW5hcnlBbm5vdGF0aW9uT3Bjb2RlIGVudW0uCitlbnVtIGNsYXNzIEJpbmFyeUFubm90YXRpb25zT3BDb2RlIDogdWludDMyX3QgeworICBJbnZhbGlkLAorICBDb2RlT2Zmc2V0LAorICBDaGFuZ2VDb2RlT2Zmc2V0QmFzZSwKKyAgQ2hhbmdlQ29kZU9mZnNldCwKKyAgQ2hhbmdlQ29kZUxlbmd0aCwKKyAgQ2hhbmdlRmlsZSwKKyAgQ2hhbmdlTGluZU9mZnNldCwKKyAgQ2hhbmdlTGluZUVuZERlbHRhLAorICBDaGFuZ2VSYW5nZUtpbmQsCisgIENoYW5nZUNvbHVtblN0YXJ0LAorICBDaGFuZ2VDb2x1bW5FbmREZWx0YSwKKyAgQ2hhbmdlQ29kZU9mZnNldEFuZExpbmVPZmZzZXQsCisgIENoYW5nZUNvZGVMZW5ndGhBbmRDb2RlT2Zmc2V0LAorICBDaGFuZ2VDb2x1bW5FbmQsCit9OworCisvLyBDb3JyZXNwb25kcyB0byBDVl9jb29raWV0eXBlX2UgZW51bS4KK2VudW0gY2xhc3MgRnJhbWVDb29raWVLaW5kIDogdWludDhfdCB7CisgIENvcHksCisgIFhvclN0YWNrUG9pbnRlciwKKyAgWG9yRnJhbWVQb2ludGVyLAorICBYb3JSMTMsCit9OworCisvLyBDb3JyZXNwb25kcyB0byBDVl9IUkVHX2UgZW51bS4KK2VudW0gY2xhc3MgUmVnaXN0ZXJJZCA6IHVpbnQxNl90IHsKKyNkZWZpbmUgQ1ZfUkVHSVNURVIobmFtZSwgdmFsdWUpIG5hbWUgPSB2YWx1ZSwKKyNpbmNsdWRlICJDb2RlVmlld1JlZ2lzdGVycy5kZWYiCisjdW5kZWYgQ1ZfUkVHSVNURVIKK307CisKKy8vLyBUaGVzZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgVEhVTktfT1JESU5BTCBlbnVtZXJhdGlvbi4KK2VudW0gY2xhc3MgVGh1bmtPcmRpbmFsIDogdWludDhfdCB7CisgIFN0YW5kYXJkLAorICBUaGlzQWRqdXN0b3IsCisgIFZjYWxsLAorICBQY29kZSwKKyAgVW5rbm93bkxvYWQsCisgIFRyYW1wSW5jcmVtZW50YWwsCisgIEJyYW5jaElzbGFuZAorfTsKKworZW51bSBjbGFzcyBUcmFtcG9saW5lVHlwZSA6IHVpbnQxNl90IHsgVHJhbXBJbmNyZW1lbnRhbCwgQnJhbmNoSXNsYW5kIH07CisKKy8vIFRoZXNlIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBDVl9Tb3VyY2VDaGtzdW1fdCBlbnVtZXJhdGlvbi4KK2VudW0gY2xhc3MgRmlsZUNoZWNrc3VtS2luZCA6IHVpbnQ4X3QgeyBOb25lLCBNRDUsIFNIQTEsIFNIQTI1NiB9OworCitlbnVtIExpbmVGbGFncyA6IHVpbnQxNl90IHsKKyAgTEZfTm9uZSA9IDAsCisgIExGX0hhdmVDb2x1bW5zID0gMSwgLy8gQ1ZfTElORVNfSEFWRV9DT0xVTU5TCit9OworCisvLy8gRGF0YSBpbiB0aGUgU1VCU0VDX0ZSQU1FREFUQSBzdWJlY3Rpb24uCitzdHJ1Y3QgRnJhbWVEYXRhIHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUnZhU3RhcnQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IENvZGVTaXplOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBMb2NhbFNpemU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFBhcmFtc1NpemU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE1heFN0YWNrU2l6ZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRnJhbWVGdW5jOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBQcm9sb2dTaXplOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBTYXZlZFJlZ3NTaXplOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBGbGFnczsKKyAgZW51bSA6IHVpbnQzMl90IHsKKyAgICBIYXNTRUggPSAxIDw8IDAsCisgICAgSGFzRUggPSAxIDw8IDEsCisgICAgSXNGdW5jdGlvblN0YXJ0ID0gMSA8PCAyLAorICB9OworfTsKKworLy8gQ29ycmVzcG9uZHMgdG8gTG9jYWxJZEFuZEdsb2JhbElkUGFpciBzdHJ1Y3R1cmUuCisvLyBUaGlzIHN0cnVjdHVyZSBpbmZvcm1hdGlvbiBhbGxvd3MgY3Jvc3MtcmVmZXJlbmNpbmcgYmV0d2VlbiBQREJzLiAgRm9yCisvLyBleGFtcGxlLCB3aGVuIGEgUERCIGlzIGJlaW5nIGJ1aWx0IGR1cmluZyBjb21waWxhdGlvbiBpdCBpcyBub3QgeWV0IGtub3duCisvLyB3aGF0IG90aGVyIG1vZHVsZXMgbWF5IGVuZCB1cCBpbiB0aGUgUERCIGF0IGxpbmsgdGltZS4gIFNvIGNlcnRhaW4gdHlwZXMgb2YKKy8vIElEcyBtYXkgY2xhc2ggYmV0d2VlbiB0aGUgdmFyaW91cyBjb21waWxlIHRpbWUgUERCcy4gIEZvciBlYWNoIGFmZmVjdGVkCisvLyBtb2R1bGUsIGEgc3Vic2VjdGlvbiB3b3VsZCBiZSBwdXQgaW50byB0aGUgUERCIGNvbnRhaW5pbmcgYSBtYXBwaW5nIGZyb20gaXRzCisvLyBsb2NhbCBJRHMgdG8gYSBzaW5nbGUgSUQgbmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgaW4gdGhlIFBEQiBmaWxlLgorc3RydWN0IENyb3NzTW9kdWxlRXhwb3J0IHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTG9jYWw7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEdsb2JhbDsKK307CisKK3N0cnVjdCBDcm9zc01vZHVsZUltcG9ydCB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE1vZHVsZU5hbWVPZmZzZXQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IENvdW50OyAvLyBOdW1iZXIgb2YgZWxlbWVudHMKKyAgLy8gc3VwcG9ydDo6dWxpdHRsZTMyX3QgaWRzW0NvdW50XTsgLy8gaWQgZnJvbSByZWZlcmVuY2VkIG1vZHVsZQorfTsKKworZW51bSBjbGFzcyBDb2RlVmlld0NvbnRhaW5lciB7IE9iamVjdEZpbGUsIFBkYiB9OworCitpbmxpbmUgdWludDMyX3QgYWxpZ25PZihDb2RlVmlld0NvbnRhaW5lciBDb250YWluZXIpIHsKKyAgaWYgKENvbnRhaW5lciA9PSBDb2RlVmlld0NvbnRhaW5lcjo6T2JqZWN0RmlsZSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDQ7Cit9Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdFcnJvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NmE3MjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld0Vycm9yLmgKQEAgLTAsMCArMSw0NiBAQAorLy89PT0tIENvZGVWaWV3RXJyb3IuaCAtIEVycm9yIGV4dGVuc2lvbnMgZm9yIENvZGVWaWV3IC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfQ09ERVZJRVdfQ09ERVZJRVdFUlJPUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9DT0RFVklFV19DT0RFVklFV0VSUk9SX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworZW51bSBjbGFzcyBjdl9lcnJvcl9jb2RlIHsKKyAgdW5zcGVjaWZpZWQgPSAxLAorICBpbnN1ZmZpY2llbnRfYnVmZmVyLAorICBvcGVyYXRpb25fdW5zdXBwb3J0ZWQsCisgIGNvcnJ1cHRfcmVjb3JkLAorICBub19yZWNvcmRzLAorICB1bmtub3duX21lbWJlcl9yZWNvcmQsCit9OworCisvLy8gQmFzZSBjbGFzcyBmb3IgZXJyb3JzIG9yaWdpbmF0aW5nIHdoZW4gcGFyc2luZyByYXcgUERCIGZpbGVzCitjbGFzcyBDb2RlVmlld0Vycm9yIDogcHVibGljIEVycm9ySW5mbzxDb2RlVmlld0Vycm9yPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworICBDb2RlVmlld0Vycm9yKGN2X2Vycm9yX2NvZGUgQyk7CisgIENvZGVWaWV3RXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnRleHQpOworICBDb2RlVmlld0Vycm9yKGN2X2Vycm9yX2NvZGUgQywgY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnRleHQpOworCisgIHZvaWQgbG9nKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRFcnJvck1lc3NhZ2UoKSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBFcnJNc2c7CisgIGN2X2Vycm9yX2NvZGUgQ29kZTsKK307Cit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3UmVjb3JkSU8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3UmVjb3JkSU8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGYxMDRmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdSZWNvcmRJTy5oCkBAIC0wLDAgKzEsMTcxIEBACisvLz09PS0gQ29kZVZpZXdSZWNvcmRJTy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0NPREVWSUVXUkVDT1JESU9fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19DT0RFVklFV1JFQ09SRElPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FQU0ludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdFcnJvci5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVhZGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVdyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgQ29kZVZpZXdSZWNvcmRJTyB7CisgIHVpbnQzMl90IGdldEN1cnJlbnRPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIChpc1dyaXRpbmcoKSkgPyBXcml0ZXItPmdldE9mZnNldCgpIDogUmVhZGVyLT5nZXRPZmZzZXQoKTsKKyAgfQorCitwdWJsaWM6CisgIGV4cGxpY2l0IENvZGVWaWV3UmVjb3JkSU8oQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIpIDogUmVhZGVyKCZSZWFkZXIpIHt9CisgIGV4cGxpY2l0IENvZGVWaWV3UmVjb3JkSU8oQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIpIDogV3JpdGVyKCZXcml0ZXIpIHt9CisKKyAgRXJyb3IgYmVnaW5SZWNvcmQoT3B0aW9uYWw8dWludDMyX3Q+IE1heExlbmd0aCk7CisgIEVycm9yIGVuZFJlY29yZCgpOworCisgIEVycm9yIG1hcEludGVnZXIoVHlwZUluZGV4ICZUeXBlSW5kKTsKKworICBib29sIGlzUmVhZGluZygpIGNvbnN0IHsgcmV0dXJuIFJlYWRlciAhPSBudWxscHRyOyB9CisgIGJvb2wgaXNXcml0aW5nKCkgY29uc3QgeyByZXR1cm4gIWlzUmVhZGluZygpOyB9CisKKyAgdWludDMyX3QgbWF4RmllbGRMZW5ndGgoKSBjb25zdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRXJyb3IgbWFwT2JqZWN0KFQgJlZhbHVlKSB7CisgICAgaWYgKGlzV3JpdGluZygpKQorICAgICAgcmV0dXJuIFdyaXRlci0+d3JpdGVPYmplY3QoVmFsdWUpOworCisgICAgY29uc3QgVCAqVmFsdWVQdHI7CisgICAgaWYgKGF1dG8gRUMgPSBSZWFkZXItPnJlYWRPYmplY3QoVmFsdWVQdHIpKQorICAgICAgcmV0dXJuIEVDOworICAgIFZhbHVlID0gKlZhbHVlUHRyOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEVycm9yIG1hcEludGVnZXIoVCAmVmFsdWUpIHsKKyAgICBpZiAoaXNXcml0aW5nKCkpCisgICAgICByZXR1cm4gV3JpdGVyLT53cml0ZUludGVnZXIoVmFsdWUpOworCisgICAgcmV0dXJuIFJlYWRlci0+cmVhZEludGVnZXIoVmFsdWUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEVycm9yIG1hcEVudW0oVCAmVmFsdWUpIHsKKyAgICBpZiAoc2l6ZW9mKFZhbHVlKSA+IG1heEZpZWxkTGVuZ3RoKCkpCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxDb2RlVmlld0Vycm9yPihjdl9lcnJvcl9jb2RlOjppbnN1ZmZpY2llbnRfYnVmZmVyKTsKKworICAgIHVzaW5nIFUgPSB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZTsKKyAgICBVIFg7CisgICAgaWYgKGlzV3JpdGluZygpKQorICAgICAgWCA9IHN0YXRpY19jYXN0PFU+KFZhbHVlKTsKKworICAgIGlmIChhdXRvIEVDID0gbWFwSW50ZWdlcihYKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICBpZiAoaXNSZWFkaW5nKCkpCisgICAgICBWYWx1ZSA9IHN0YXRpY19jYXN0PFQ+KFgpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgbWFwRW5jb2RlZEludGVnZXIoaW50NjRfdCAmVmFsdWUpOworICBFcnJvciBtYXBFbmNvZGVkSW50ZWdlcih1aW50NjRfdCAmVmFsdWUpOworICBFcnJvciBtYXBFbmNvZGVkSW50ZWdlcihBUFNJbnQgJlZhbHVlKTsKKyAgRXJyb3IgbWFwU3RyaW5nWihTdHJpbmdSZWYgJlZhbHVlKTsKKyAgRXJyb3IgbWFwR3VpZChHVUlEICZHdWlkKTsKKworICBFcnJvciBtYXBTdHJpbmdaVmVjdG9yWihzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+ICZWYWx1ZSk7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFNpemVUeXBlLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBFbGVtZW50TWFwcGVyPgorICBFcnJvciBtYXBWZWN0b3JOKFQgJkl0ZW1zLCBjb25zdCBFbGVtZW50TWFwcGVyICZNYXBwZXIpIHsKKyAgICBTaXplVHlwZSBTaXplOworICAgIGlmIChpc1dyaXRpbmcoKSkgeworICAgICAgU2l6ZSA9IHN0YXRpY19jYXN0PFNpemVUeXBlPihJdGVtcy5zaXplKCkpOworICAgICAgaWYgKGF1dG8gRUMgPSBXcml0ZXItPndyaXRlSW50ZWdlcihTaXplKSkKKyAgICAgICAgcmV0dXJuIEVDOworCisgICAgICBmb3IgKGF1dG8gJlggOiBJdGVtcykgeworICAgICAgICBpZiAoYXV0byBFQyA9IE1hcHBlcigqdGhpcywgWCkpCisgICAgICAgICAgcmV0dXJuIEVDOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoYXV0byBFQyA9IFJlYWRlci0+cmVhZEludGVnZXIoU2l6ZSkpCisgICAgICAgIHJldHVybiBFQzsKKyAgICAgIGZvciAoU2l6ZVR5cGUgSSA9IDA7IEkgPCBTaXplOyArK0kpIHsKKyAgICAgICAgdHlwZW5hbWUgVDo6dmFsdWVfdHlwZSBJdGVtOworICAgICAgICBpZiAoYXV0byBFQyA9IE1hcHBlcigqdGhpcywgSXRlbSkpCisgICAgICAgICAgcmV0dXJuIEVDOworICAgICAgICBJdGVtcy5wdXNoX2JhY2soSXRlbSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRWxlbWVudE1hcHBlcj4KKyAgRXJyb3IgbWFwVmVjdG9yVGFpbChUICZJdGVtcywgY29uc3QgRWxlbWVudE1hcHBlciAmTWFwcGVyKSB7CisgICAgaWYgKGlzV3JpdGluZygpKSB7CisgICAgICBmb3IgKGF1dG8gJkl0ZW0gOiBJdGVtcykgeworICAgICAgICBpZiAoYXV0byBFQyA9IE1hcHBlcigqdGhpcywgSXRlbSkpCisgICAgICAgICAgcmV0dXJuIEVDOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0eXBlbmFtZSBUOjp2YWx1ZV90eXBlIEZpZWxkOworICAgICAgLy8gU3RvcCB3aGVuIHdlIHJ1biBvdXQgb2YgYnl0ZXMgb3Igd2UgaGl0IHJlY29yZCBwYWRkaW5nIGJ5dGVzLgorICAgICAgd2hpbGUgKCFSZWFkZXItPmVtcHR5KCkgJiYgUmVhZGVyLT5wZWVrKCkgPCAweGYwIC8qIExGX1BBRDAgKi8pIHsKKyAgICAgICAgaWYgKGF1dG8gRUMgPSBNYXBwZXIoKnRoaXMsIEZpZWxkKSkKKyAgICAgICAgICByZXR1cm4gRUM7CisgICAgICAgIEl0ZW1zLnB1c2hfYmFjayhGaWVsZCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgbWFwQnl0ZVZlY3RvclRhaWwoQXJyYXlSZWY8dWludDhfdD4gJkJ5dGVzKTsKKyAgRXJyb3IgbWFwQnl0ZVZlY3RvclRhaWwoc3RkOjp2ZWN0b3I8dWludDhfdD4gJkJ5dGVzKTsKKworICBFcnJvciBwYWRUb0FsaWdubWVudCh1aW50MzJfdCBBbGlnbik7CisgIEVycm9yIHNraXBQYWRkaW5nKCk7CisKK3ByaXZhdGU6CisgIEVycm9yIHdyaXRlRW5jb2RlZFNpZ25lZEludGVnZXIoY29uc3QgaW50NjRfdCAmVmFsdWUpOworICBFcnJvciB3cml0ZUVuY29kZWRVbnNpZ25lZEludGVnZXIoY29uc3QgdWludDY0X3QgJlZhbHVlKTsKKworICBzdHJ1Y3QgUmVjb3JkTGltaXQgeworICAgIHVpbnQzMl90IEJlZ2luT2Zmc2V0OworICAgIE9wdGlvbmFsPHVpbnQzMl90PiBNYXhMZW5ndGg7CisKKyAgICBPcHRpb25hbDx1aW50MzJfdD4gYnl0ZXNSZW1haW5pbmcodWludDMyX3QgQ3VycmVudE9mZnNldCkgY29uc3QgeworICAgICAgaWYgKCFNYXhMZW5ndGguaGFzVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIE5vbmU7CisgICAgICBhc3NlcnQoQ3VycmVudE9mZnNldCA+PSBCZWdpbk9mZnNldCk7CisKKyAgICAgIHVpbnQzMl90IEJ5dGVzVXNlZCA9IEN1cnJlbnRPZmZzZXQgLSBCZWdpbk9mZnNldDsKKyAgICAgIGlmIChCeXRlc1VzZWQgPj0gKk1heExlbmd0aCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICByZXR1cm4gKk1heExlbmd0aCAtIEJ5dGVzVXNlZDsKKyAgICB9CisgIH07CisKKyAgU21hbGxWZWN0b3I8UmVjb3JkTGltaXQsIDI+IExpbWl0czsKKworICBCaW5hcnlTdHJlYW1SZWFkZXIgKlJlYWRlciA9IG51bGxwdHI7CisgIEJpbmFyeVN0cmVhbVdyaXRlciAqV3JpdGVyID0gbnVsbHB0cjsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0NPREVWSUVXUkVDT1JESU9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdSZWdpc3RlcnMuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdSZWdpc3RlcnMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMDY2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld1JlZ2lzdGVycy5kZWYKQEAgLTAsMCArMSwyNjggQEAKKy8vPT09LS0gQ29kZVZpZXdSZWdpc3RlcnMuZGVmIC0gQ29kZVZpZXcgcmVnaXN0ZXJzIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gU2VlIENWX0hSRUdfZSBpbiBjdmNvbnN0LmguIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSBjb25zdGFudHMgdGhlcmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBDVl9SRUdJU1RFUgorI2RlZmluZSBDVl9SRUdJU1RFUihuYW1lLCB2YWx1ZSkKKyNlbmRpZgorCisvLyBUaGlzIGN1cnJlbnRseSBvbmx5IGNvbnRhaW5zIHRoZSAicmVnaXN0ZXIgc3Vic2V0IHNocmFlZCBieSBhbGwgcHJvY2Vzc29yCisvLyB0eXBlcyIgKEVSUiBldGMuKSBhbmQgdGhlIHg4NiByZWdpc3RlcnMuCisKK0NWX1JFR0lTVEVSKEVSUiwgMzAwMDApCitDVl9SRUdJU1RFUihURUIsIDMwMDAxKQorQ1ZfUkVHSVNURVIoVElNRVIsIDMwMDAyKQorQ1ZfUkVHSVNURVIoRUZBRDEsIDMwMDAzKQorQ1ZfUkVHSVNURVIoRUZBRDIsIDMwMDA0KQorQ1ZfUkVHSVNURVIoRUZBRDMsIDMwMDA1KQorQ1ZfUkVHSVNURVIoVkZSQU1FLCAzMDAwNikKK0NWX1JFR0lTVEVSKEhBTkRMRSwgMzAwMDcpCitDVl9SRUdJU1RFUihQQVJBTVMsIDMwMDA4KQorQ1ZfUkVHSVNURVIoTE9DQUxTLCAzMDAwOSkKK0NWX1JFR0lTVEVSKFRJRCwgMzAwMTApCitDVl9SRUdJU1RFUihFTlYsIDMwMDExKQorQ1ZfUkVHSVNURVIoQ01ETE4sIDMwMDEyKQorCitDVl9SRUdJU1RFUihOT05FLCAwKQorQ1ZfUkVHSVNURVIoQUwsIDEpCitDVl9SRUdJU1RFUihDTCwgMikKK0NWX1JFR0lTVEVSKERMLCAzKQorQ1ZfUkVHSVNURVIoQkwsIDQpCitDVl9SRUdJU1RFUihBSCwgNSkKK0NWX1JFR0lTVEVSKENILCA2KQorQ1ZfUkVHSVNURVIoREgsIDcpCitDVl9SRUdJU1RFUihCSCwgOCkKK0NWX1JFR0lTVEVSKEFYLCA5KQorQ1ZfUkVHSVNURVIoQ1gsIDEwKQorQ1ZfUkVHSVNURVIoRFgsIDExKQorQ1ZfUkVHSVNURVIoQlgsIDEyKQorQ1ZfUkVHSVNURVIoU1AsIDEzKQorQ1ZfUkVHSVNURVIoQlAsIDE0KQorQ1ZfUkVHSVNURVIoU0ksIDE1KQorQ1ZfUkVHSVNURVIoREksIDE2KQorQ1ZfUkVHSVNURVIoRUFYLCAxNykKK0NWX1JFR0lTVEVSKEVDWCwgMTgpCitDVl9SRUdJU1RFUihFRFgsIDE5KQorQ1ZfUkVHSVNURVIoRUJYLCAyMCkKK0NWX1JFR0lTVEVSKEVTUCwgMjEpCitDVl9SRUdJU1RFUihFQlAsIDIyKQorQ1ZfUkVHSVNURVIoRVNJLCAyMykKK0NWX1JFR0lTVEVSKEVESSwgMjQpCitDVl9SRUdJU1RFUihFUywgMjUpCitDVl9SRUdJU1RFUihDUywgMjYpCitDVl9SRUdJU1RFUihTUywgMjcpCitDVl9SRUdJU1RFUihEUywgMjgpCitDVl9SRUdJU1RFUihGUywgMjkpCitDVl9SRUdJU1RFUihHUywgMzApCitDVl9SRUdJU1RFUihJUCwgMzEpCitDVl9SRUdJU1RFUihGTEFHUywgMzIpCitDVl9SRUdJU1RFUihFSVAsIDMzKQorQ1ZfUkVHSVNURVIoRUZMQUdTLCAzNCkKK0NWX1JFR0lTVEVSKFRFTVAsIDQwKQorQ1ZfUkVHSVNURVIoVEVNUEgsIDQxKQorQ1ZfUkVHSVNURVIoUVVPVEUsIDQyKQorQ1ZfUkVHSVNURVIoUENEUjMsIDQzKQorQ1ZfUkVHSVNURVIoUENEUjQsIDQ0KQorQ1ZfUkVHSVNURVIoUENEUjUsIDQ1KQorQ1ZfUkVHSVNURVIoUENEUjYsIDQ2KQorQ1ZfUkVHSVNURVIoUENEUjcsIDQ3KQorQ1ZfUkVHSVNURVIoQ1IwLCA4MCkKK0NWX1JFR0lTVEVSKENSMSwgODEpCitDVl9SRUdJU1RFUihDUjIsIDgyKQorQ1ZfUkVHSVNURVIoQ1IzLCA4MykKK0NWX1JFR0lTVEVSKENSNCwgODQpCitDVl9SRUdJU1RFUihEUjAsIDkwKQorQ1ZfUkVHSVNURVIoRFIxLCA5MSkKK0NWX1JFR0lTVEVSKERSMiwgOTIpCitDVl9SRUdJU1RFUihEUjMsIDkzKQorQ1ZfUkVHSVNURVIoRFI0LCA5NCkKK0NWX1JFR0lTVEVSKERSNSwgOTUpCitDVl9SRUdJU1RFUihEUjYsIDk2KQorQ1ZfUkVHSVNURVIoRFI3LCA5NykKK0NWX1JFR0lTVEVSKEdEVFIsIDExMCkKK0NWX1JFR0lTVEVSKEdEVEwsIDExMSkKK0NWX1JFR0lTVEVSKElEVFIsIDExMikKK0NWX1JFR0lTVEVSKElEVEwsIDExMykKK0NWX1JFR0lTVEVSKExEVFIsIDExNCkKK0NWX1JFR0lTVEVSKFRSLCAxMTUpCisKK0NWX1JFR0lTVEVSKFBTRVVETzEsIDExNikKK0NWX1JFR0lTVEVSKFBTRVVETzIsIDExNykKK0NWX1JFR0lTVEVSKFBTRVVETzMsIDExOCkKK0NWX1JFR0lTVEVSKFBTRVVETzQsIDExOSkKK0NWX1JFR0lTVEVSKFBTRVVETzUsIDEyMCkKK0NWX1JFR0lTVEVSKFBTRVVETzYsIDEyMSkKK0NWX1JFR0lTVEVSKFBTRVVETzcsIDEyMikKK0NWX1JFR0lTVEVSKFBTRVVETzgsIDEyMykKK0NWX1JFR0lTVEVSKFBTRVVETzksIDEyNCkKKworQ1ZfUkVHSVNURVIoU1QwLCAxMjgpCitDVl9SRUdJU1RFUihTVDEsIDEyOSkKK0NWX1JFR0lTVEVSKFNUMiwgMTMwKQorQ1ZfUkVHSVNURVIoU1QzLCAxMzEpCitDVl9SRUdJU1RFUihTVDQsIDEzMikKK0NWX1JFR0lTVEVSKFNUNSwgMTMzKQorQ1ZfUkVHSVNURVIoU1Q2LCAxMzQpCitDVl9SRUdJU1RFUihTVDcsIDEzNSkKK0NWX1JFR0lTVEVSKENUUkwsIDEzNikKK0NWX1JFR0lTVEVSKFNUQVQsIDEzNykKK0NWX1JFR0lTVEVSKFRBRywgMTM4KQorQ1ZfUkVHSVNURVIoRlBJUCwgMTM5KQorQ1ZfUkVHSVNURVIoRlBDUywgMTQwKQorQ1ZfUkVHSVNURVIoRlBETywgMTQxKQorQ1ZfUkVHSVNURVIoRlBEUywgMTQyKQorQ1ZfUkVHSVNURVIoSVNFTSwgMTQzKQorQ1ZfUkVHSVNURVIoRlBFSVAsIDE0NCkKK0NWX1JFR0lTVEVSKEZQRURPLCAxNDUpCisKK0NWX1JFR0lTVEVSKE1NMCwgMTQ2KQorQ1ZfUkVHSVNURVIoTU0xLCAxNDcpCitDVl9SRUdJU1RFUihNTTIsIDE0OCkKK0NWX1JFR0lTVEVSKE1NMywgMTQ5KQorQ1ZfUkVHSVNURVIoTU00LCAxNTApCitDVl9SRUdJU1RFUihNTTUsIDE1MSkKK0NWX1JFR0lTVEVSKE1NNiwgMTUyKQorQ1ZfUkVHSVNURVIoTU03LCAxNTMpCisKK0NWX1JFR0lTVEVSKFhNTTAsIDE1NCkKK0NWX1JFR0lTVEVSKFhNTTEsIDE1NSkKK0NWX1JFR0lTVEVSKFhNTTIsIDE1NikKK0NWX1JFR0lTVEVSKFhNTTMsIDE1NykKK0NWX1JFR0lTVEVSKFhNTTQsIDE1OCkKK0NWX1JFR0lTVEVSKFhNTTUsIDE1OSkKK0NWX1JFR0lTVEVSKFhNTTYsIDE2MCkKK0NWX1JFR0lTVEVSKFhNTTcsIDE2MSkKKworQ1ZfUkVHSVNURVIoTVhDU1IsIDIxMSkKKworQ1ZfUkVHSVNURVIoRURYRUFYLCAyMTIpCisKK0NWX1JFR0lTVEVSKEVNTTBMLCAyMjApCitDVl9SRUdJU1RFUihFTU0xTCwgMjIxKQorQ1ZfUkVHSVNURVIoRU1NMkwsIDIyMikKK0NWX1JFR0lTVEVSKEVNTTNMLCAyMjMpCitDVl9SRUdJU1RFUihFTU00TCwgMjI0KQorQ1ZfUkVHSVNURVIoRU1NNUwsIDIyNSkKK0NWX1JFR0lTVEVSKEVNTTZMLCAyMjYpCitDVl9SRUdJU1RFUihFTU03TCwgMjI3KQorCitDVl9SRUdJU1RFUihFTU0wSCwgMjI4KQorQ1ZfUkVHSVNURVIoRU1NMUgsIDIyOSkKK0NWX1JFR0lTVEVSKEVNTTJILCAyMzApCitDVl9SRUdJU1RFUihFTU0zSCwgMjMxKQorQ1ZfUkVHSVNURVIoRU1NNEgsIDIzMikKK0NWX1JFR0lTVEVSKEVNTTVILCAyMzMpCitDVl9SRUdJU1RFUihFTU02SCwgMjM0KQorQ1ZfUkVHSVNURVIoRU1NN0gsIDIzNSkKKworQ1ZfUkVHSVNURVIoTU0wMCwgMjM2KQorQ1ZfUkVHSVNURVIoTU0wMSwgMjM3KQorQ1ZfUkVHSVNURVIoTU0xMCwgMjM4KQorQ1ZfUkVHSVNURVIoTU0xMSwgMjM5KQorQ1ZfUkVHSVNURVIoTU0yMCwgMjQwKQorQ1ZfUkVHSVNURVIoTU0yMSwgMjQxKQorQ1ZfUkVHSVNURVIoTU0zMCwgMjQyKQorQ1ZfUkVHSVNURVIoTU0zMSwgMjQzKQorQ1ZfUkVHSVNURVIoTU00MCwgMjQ0KQorQ1ZfUkVHSVNURVIoTU00MSwgMjQ1KQorQ1ZfUkVHSVNURVIoTU01MCwgMjQ2KQorQ1ZfUkVHSVNURVIoTU01MSwgMjQ3KQorQ1ZfUkVHSVNURVIoTU02MCwgMjQ4KQorQ1ZfUkVHSVNURVIoTU02MSwgMjQ5KQorQ1ZfUkVHSVNURVIoTU03MCwgMjUwKQorQ1ZfUkVHSVNURVIoTU03MSwgMjUxKQorCitDVl9SRUdJU1RFUihCTkQwLCAzOTYpCitDVl9SRUdJU1RFUihCTkQxLCAzOTcpCitDVl9SRUdJU1RFUihCTkQyLCAzOTgpCisKKworQ1ZfUkVHSVNURVIoWE1NOCwgMjUyKQorQ1ZfUkVHSVNURVIoWE1NOSwgMjUzKQorQ1ZfUkVHSVNURVIoWE1NMTAsIDI1NCkKK0NWX1JFR0lTVEVSKFhNTTExLCAyNTUpCitDVl9SRUdJU1RFUihYTU0xMiwgMjU2KQorQ1ZfUkVHSVNURVIoWE1NMTMsIDI1NykKK0NWX1JFR0lTVEVSKFhNTTE0LCAyNTgpCitDVl9SRUdJU1RFUihYTU0xNSwgMjU5KQorCisKK0NWX1JFR0lTVEVSKFNJTCwgMzI0KQorQ1ZfUkVHSVNURVIoRElMLCAzMjUpCitDVl9SRUdJU1RFUihCUEwsIDMyNikKK0NWX1JFR0lTVEVSKFNQTCwgMzI3KQorCitDVl9SRUdJU1RFUihSQVgsIDMyOCkKK0NWX1JFR0lTVEVSKFJCWCwgMzI5KQorQ1ZfUkVHSVNURVIoUkNYLCAzMzApCitDVl9SRUdJU1RFUihSRFgsIDMzMSkKK0NWX1JFR0lTVEVSKFJTSSwgMzMyKQorQ1ZfUkVHSVNURVIoUkRJLCAzMzMpCitDVl9SRUdJU1RFUihSQlAsIDMzNCkKK0NWX1JFR0lTVEVSKFJTUCwgMzM1KQorCitDVl9SRUdJU1RFUihSOCwgMzM2KQorQ1ZfUkVHSVNURVIoUjksIDMzNykKK0NWX1JFR0lTVEVSKFIxMCwgMzM4KQorQ1ZfUkVHSVNURVIoUjExLCAzMzkpCitDVl9SRUdJU1RFUihSMTIsIDM0MCkKK0NWX1JFR0lTVEVSKFIxMywgMzQxKQorQ1ZfUkVHSVNURVIoUjE0LCAzNDIpCitDVl9SRUdJU1RFUihSMTUsIDM0MykKKworQ1ZfUkVHSVNURVIoUjhCLCAzNDQpCitDVl9SRUdJU1RFUihSOUIsIDM0NSkKK0NWX1JFR0lTVEVSKFIxMEIsIDM0NikKK0NWX1JFR0lTVEVSKFIxMUIsIDM0NykKK0NWX1JFR0lTVEVSKFIxMkIsIDM0OCkKK0NWX1JFR0lTVEVSKFIxM0IsIDM0OSkKK0NWX1JFR0lTVEVSKFIxNEIsIDM1MCkKK0NWX1JFR0lTVEVSKFIxNUIsIDM1MSkKKworQ1ZfUkVHSVNURVIoUjhXLCAzNTIpCitDVl9SRUdJU1RFUihSOVcsIDM1MykKK0NWX1JFR0lTVEVSKFIxMFcsIDM1NCkKK0NWX1JFR0lTVEVSKFIxMVcsIDM1NSkKK0NWX1JFR0lTVEVSKFIxMlcsIDM1NikKK0NWX1JFR0lTVEVSKFIxM1csIDM1NykKK0NWX1JFR0lTVEVSKFIxNFcsIDM1OCkKK0NWX1JFR0lTVEVSKFIxNVcsIDM1OSkKKworQ1ZfUkVHSVNURVIoUjhELCAzNjApCitDVl9SRUdJU1RFUihSOUQsIDM2MSkKK0NWX1JFR0lTVEVSKFIxMEQsIDM2MikKK0NWX1JFR0lTVEVSKFIxMUQsIDM2MykKK0NWX1JFR0lTVEVSKFIxMkQsIDM2NCkKK0NWX1JFR0lTVEVSKFIxM0QsIDM2NSkKK0NWX1JFR0lTVEVSKFIxNEQsIDM2NikKK0NWX1JFR0lTVEVSKFIxNUQsIDM2NykKKworCisvLyBjdmNvbnN0LmggZGVmaW5lcyBib3RoIENWX1JFR19ZTU0wICgyNTIpIGFuZCBDVl9BTUQ2NF9ZTU0wICgzNjgpLiBLZWVwIHRoZQorLy8gb3JpZ2luYWwgcHJlZml4IHRvIGRpc3Rpbmd1aXNoIHRoZW0uCisKK0NWX1JFR0lTVEVSKEFNRDY0X1lNTTAsIDM2OCkKK0NWX1JFR0lTVEVSKEFNRDY0X1lNTTEsIDM2OSkKK0NWX1JFR0lTVEVSKEFNRDY0X1lNTTIsIDM3MCkKK0NWX1JFR0lTVEVSKEFNRDY0X1lNTTMsIDM3MSkKK0NWX1JFR0lTVEVSKEFNRDY0X1lNTTQsIDM3MikKK0NWX1JFR0lTVEVSKEFNRDY0X1lNTTUsIDM3MykKK0NWX1JFR0lTVEVSKEFNRDY0X1lNTTYsIDM3NCkKK0NWX1JFR0lTVEVSKEFNRDY0X1lNTTcsIDM3NSkKK0NWX1JFR0lTVEVSKEFNRDY0X1lNTTgsIDM3NikKK0NWX1JFR0lTVEVSKEFNRDY0X1lNTTksIDM3NykKK0NWX1JFR0lTVEVSKEFNRDY0X1lNTTEwLCAzNzgpCitDVl9SRUdJU1RFUihBTUQ2NF9ZTU0xMSwgMzc5KQorQ1ZfUkVHSVNURVIoQU1ENjRfWU1NMTIsIDM4MCkKK0NWX1JFR0lTVEVSKEFNRDY0X1lNTTEzLCAzODEpCitDVl9SRUdJU1RFUihBTUQ2NF9ZTU0xNCwgMzgyKQorQ1ZfUkVHSVNURVIoQU1ENjRfWU1NMTUsIDM4MykKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3U3ltYm9scy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld1N5bWJvbHMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYzUzODAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld1N5bWJvbHMuZGVmCkBAIC0wLDAgKzEsMjYxIEBACisvLz09PS0tIENvZGVWaWV3U3ltYm9scy5kZWYgLSBBbGwgQ29kZVZpZXcgbGVhZiB0eXBlcyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFNlZSBMRUFGX0VOVU1fZSBpbiBjdmluZm8uaC4gVGhpcyBzaG91bGQgbWF0Y2ggdGhlIGNvbnN0YW50cyB0aGVyZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIENWX1NZTUJPTAorI2RlZmluZSBDVl9TWU1CT0woZW5hbWUsIHZhbHVlKQorI2VuZGlmCisKKyNpZm5kZWYgU1lNQk9MX1JFQ09SRAorI2RlZmluZSBTWU1CT0xfUkVDT1JEKGxmX2VuYW1lLCB2YWx1ZSwgbmFtZSkgQ1ZfU1lNQk9MKGxmX2VuYW1lLCB2YWx1ZSkKKyNlbmRpZgorCisjaWZuZGVmIFNZTUJPTF9SRUNPUkRfQUxJQVMKKyNkZWZpbmUgU1lNQk9MX1JFQ09SRF9BTElBUyhsZl9lbmFtZSwgdmFsdWUsIG5hbWUsIGFsaWFzX25hbWUpICAgICAgICAgICAgICAgICAgIFwKKyAgU1lNQk9MX1JFQ09SRChsZl9lbmFtZSwgdmFsdWUsIG5hbWUpCisjZW5kaWYKKworLy8gMTYgYml0IHN5bWJvbCB0eXBlcy4gTm90IHZlcnkgdXNlZnVsLCBwcm92aWRlZCBvbmx5IGZvciByZWZlcmVuY2UuCitDVl9TWU1CT0woU19DT01QSUxFICAgICAgICwgMHgwMDAxKQorQ1ZfU1lNQk9MKFNfUkVHSVNURVJfMTZ0ICAsIDB4MDAwMikKK0NWX1NZTUJPTChTX0NPTlNUQU5UXzE2dCAgLCAweDAwMDMpCitDVl9TWU1CT0woU19VRFRfMTZ0ICAgICAgICwgMHgwMDA0KQorQ1ZfU1lNQk9MKFNfU1NFQVJDSCAgICAgICAsIDB4MDAwNSkKK0NWX1NZTUJPTChTX1NLSVAgICAgICAgICAgLCAweDAwMDcpCitDVl9TWU1CT0woU19DVlJFU0VSVkUgICAgICwgMHgwMDA4KQorQ1ZfU1lNQk9MKFNfT0JKTkFNRV9TVCAgICAsIDB4MDAwOSkKK0NWX1NZTUJPTChTX0VOREFSRyAgICAgICAgLCAweDAwMGEpCitDVl9TWU1CT0woU19DT0JPTFVEVF8xNnQgICwgMHgwMDBiKQorQ1ZfU1lNQk9MKFNfTUFOWVJFR18xNnQgICAsIDB4MDAwYykKK0NWX1NZTUJPTChTX1JFVFVSTiAgICAgICAgLCAweDAwMGQpCitDVl9TWU1CT0woU19FTlRSWVRISVMgICAgICwgMHgwMDBlKQorQ1ZfU1lNQk9MKFNfQlBSRUwxNiAgICAgICAsIDB4MDEwMCkKK0NWX1NZTUJPTChTX0xEQVRBMTYgICAgICAgLCAweDAxMDEpCitDVl9TWU1CT0woU19HREFUQTE2ICAgICAgICwgMHgwMTAyKQorQ1ZfU1lNQk9MKFNfUFVCMTYgICAgICAgICAsIDB4MDEwMykKK0NWX1NZTUJPTChTX0xQUk9DMTYgICAgICAgLCAweDAxMDQpCitDVl9TWU1CT0woU19HUFJPQzE2ICAgICAgICwgMHgwMTA1KQorQ1ZfU1lNQk9MKFNfVEhVTksxNiAgICAgICAsIDB4MDEwNikKK0NWX1NZTUJPTChTX0JMT0NLMTYgICAgICAgLCAweDAxMDcpCitDVl9TWU1CT0woU19XSVRIMTYgICAgICAgICwgMHgwMTA4KQorQ1ZfU1lNQk9MKFNfTEFCRUwxNiAgICAgICAsIDB4MDEwOSkKK0NWX1NZTUJPTChTX0NFWE1PREVMMTYgICAgLCAweDAxMGEpCitDVl9TWU1CT0woU19WRlRBQkxFMTYgICAgICwgMHgwMTBiKQorQ1ZfU1lNQk9MKFNfUkVHUkVMMTYgICAgICAsIDB4MDEwYykKK0NWX1NZTUJPTChTX0JQUkVMMzJfMTZ0ICAgLCAweDAyMDApCitDVl9TWU1CT0woU19MREFUQTMyXzE2dCAgICwgMHgwMjAxKQorQ1ZfU1lNQk9MKFNfR0RBVEEzMl8xNnQgICAsIDB4MDIwMikKK0NWX1NZTUJPTChTX1BVQjMyXzE2dCAgICAgLCAweDAyMDMpCitDVl9TWU1CT0woU19MUFJPQzMyXzE2dCAgICwgMHgwMjA0KQorQ1ZfU1lNQk9MKFNfR1BST0MzMl8xNnQgICAsIDB4MDIwNSkKK0NWX1NZTUJPTChTX1RIVU5LMzJfU1QgICAgLCAweDAyMDYpCitDVl9TWU1CT0woU19CTE9DSzMyX1NUICAgICwgMHgwMjA3KQorQ1ZfU1lNQk9MKFNfV0lUSDMyX1NUICAgICAsIDB4MDIwOCkKK0NWX1NZTUJPTChTX0xBQkVMMzJfU1QgICAgLCAweDAyMDkpCitDVl9TWU1CT0woU19DRVhNT0RFTDMyICAgICwgMHgwMjBhKQorQ1ZfU1lNQk9MKFNfVkZUQUJMRTMyXzE2dCAsIDB4MDIwYikKK0NWX1NZTUJPTChTX1JFR1JFTDMyXzE2dCAgLCAweDAyMGMpCitDVl9TWU1CT0woU19MVEhSRUFEMzJfMTZ0ICwgMHgwMjBkKQorQ1ZfU1lNQk9MKFNfR1RIUkVBRDMyXzE2dCAsIDB4MDIwZSkKK0NWX1NZTUJPTChTX1NMSU5LMzIgICAgICAgLCAweDAyMGYpCitDVl9TWU1CT0woU19MUFJPQ01JUFNfMTZ0ICwgMHgwMzAwKQorQ1ZfU1lNQk9MKFNfR1BST0NNSVBTXzE2dCAsIDB4MDMwMSkKK0NWX1NZTUJPTChTX1BST0NSRUZfU1QgICAgLCAweDA0MDApCitDVl9TWU1CT0woU19EQVRBUkVGX1NUICAgICwgMHgwNDAxKQorQ1ZfU1lNQk9MKFNfQUxJR04gICAgICAgICAsIDB4MDQwMikKK0NWX1NZTUJPTChTX0xQUk9DUkVGX1NUICAgLCAweDA0MDMpCitDVl9TWU1CT0woU19PRU0gICAgICAgICAgICwgMHgwNDA0KQorCisvLyBBbGwgcG9zdCAxNiBiaXQgc3ltYm9sIHR5cGVzIGhhdmUgdGhlIDB4MTAwMCBiaXQgc2V0LgorQ1ZfU1lNQk9MKFNfVEkxNl9NQVggICAgICAsIDB4MTAwMCkKKworLy8gTW9zdGx5IHVudXNlZCAic3RhcnQiIHN5bWJvbCB0eXBlcy4KK0NWX1NZTUJPTChTX1JFR0lTVEVSX1NUICAgLCAweDEwMDEpCitDVl9TWU1CT0woU19DT05TVEFOVF9TVCAgICwgMHgxMDAyKQorQ1ZfU1lNQk9MKFNfVURUX1NUICAgICAgICAsIDB4MTAwMykKK0NWX1NZTUJPTChTX0NPQk9MVURUX1NUICAgLCAweDEwMDQpCitDVl9TWU1CT0woU19NQU5ZUkVHX1NUICAgICwgMHgxMDA1KQorQ1ZfU1lNQk9MKFNfQlBSRUwzMl9TVCAgICAsIDB4MTAwNikKK0NWX1NZTUJPTChTX0xEQVRBMzJfU1QgICAgLCAweDEwMDcpCitDVl9TWU1CT0woU19HREFUQTMyX1NUICAgICwgMHgxMDA4KQorQ1ZfU1lNQk9MKFNfUFVCMzJfU1QgICAgICAsIDB4MTAwOSkKK0NWX1NZTUJPTChTX0xQUk9DMzJfU1QgICAgLCAweDEwMGEpCitDVl9TWU1CT0woU19HUFJPQzMyX1NUICAgICwgMHgxMDBiKQorQ1ZfU1lNQk9MKFNfVkZUQUJMRTMyICAgICAsIDB4MTAwYykKK0NWX1NZTUJPTChTX1JFR1JFTDMyX1NUICAgLCAweDEwMGQpCitDVl9TWU1CT0woU19MVEhSRUFEMzJfU1QgICwgMHgxMDBlKQorQ1ZfU1lNQk9MKFNfR1RIUkVBRDMyX1NUICAsIDB4MTAwZikKK0NWX1NZTUJPTChTX0xQUk9DTUlQU19TVCAgLCAweDEwMTApCitDVl9TWU1CT0woU19HUFJPQ01JUFNfU1QgICwgMHgxMDExKQorCitDVl9TWU1CT0woU19DT01QSUxFMl9TVCAgICwgMHgxMDEzKQorQ1ZfU1lNQk9MKFNfTUFOWVJFRzJfU1QgICAsIDB4MTAxNCkKK0NWX1NZTUJPTChTX0xQUk9DSUE2NF9TVCAgLCAweDEwMTUpCitDVl9TWU1CT0woU19HUFJPQ0lBNjRfU1QgICwgMHgxMDE2KQorQ1ZfU1lNQk9MKFNfTE9DQUxTTE9UX1NUICAsIDB4MTAxNykKK0NWX1NZTUJPTChTX1BBUkFNU0xPVF9TVCAgLCAweDEwMTgpCitDVl9TWU1CT0woU19BTk5PVEFUSU9OICAgICwgMHgxMDE5KQorQ1ZfU1lNQk9MKFNfR01BTlBST0NfU1QgICAsIDB4MTAxYSkKK0NWX1NZTUJPTChTX0xNQU5QUk9DX1NUICAgLCAweDEwMWIpCitDVl9TWU1CT0woU19SRVNFUlZFRDEgICAgICwgMHgxMDFjKQorQ1ZfU1lNQk9MKFNfUkVTRVJWRUQyICAgICAsIDB4MTAxZCkKK0NWX1NZTUJPTChTX1JFU0VSVkVEMyAgICAgLCAweDEwMWUpCitDVl9TWU1CT0woU19SRVNFUlZFRDQgICAgICwgMHgxMDFmKQorQ1ZfU1lNQk9MKFNfTE1BTkRBVEFfU1QgICAsIDB4MTAyMCkKK0NWX1NZTUJPTChTX0dNQU5EQVRBX1NUICAgLCAweDEwMjEpCitDVl9TWU1CT0woU19NQU5GUkFNRVJFTF9TVCwgMHgxMDIyKQorQ1ZfU1lNQk9MKFNfTUFOUkVHSVNURVJfU1QsIDB4MTAyMykKK0NWX1NZTUJPTChTX01BTlNMT1RfU1QgICAgLCAweDEwMjQpCitDVl9TWU1CT0woU19NQU5NQU5ZUkVHX1NUICwgMHgxMDI1KQorQ1ZfU1lNQk9MKFNfTUFOUkVHUkVMX1NUICAsIDB4MTAyNikKK0NWX1NZTUJPTChTX01BTk1BTllSRUcyX1NULCAweDEwMjcpCitDVl9TWU1CT0woU19NQU5UWVBSRUYgICAgICwgMHgxMDI4KQorQ1ZfU1lNQk9MKFNfVU5BTUVTUEFDRV9TVCAsIDB4MTAyOSkKKworLy8gRW5kIG9mIFNfKl9TVCBzeW1ib2xzLCB3aGljaCBkbyBub3QgYXBwZWFyIHRvIGJlIGdlbmVyYXRlZCBieSBtb2Rlcm4KKy8vIGNvbXBpbGVycy4KK0NWX1NZTUJPTChTX1NUX01BWCAgICAgICAgLCAweDExMDApCisKKworQ1ZfU1lNQk9MKFNfV0lUSDMyICAgICAgICAsIDB4MTEwNCkKK0NWX1NZTUJPTChTX01BTllSRUcgICAgICAgLCAweDExMGEpCitDVl9TWU1CT0woU19MUFJPQ01JUFMgICAgICwgMHgxMTE0KQorQ1ZfU1lNQk9MKFNfR1BST0NNSVBTICAgICAsIDB4MTExNSkKK0NWX1NZTUJPTChTX01BTllSRUcyICAgICAgLCAweDExMTcpCitDVl9TWU1CT0woU19MUFJPQ0lBNjQgICAgICwgMHgxMTE4KQorQ1ZfU1lNQk9MKFNfR1BST0NJQTY0ICAgICAsIDB4MTExOSkKK0NWX1NZTUJPTChTX0xPQ0FMU0xPVCAgICAgLCAweDExMWEpCitDVl9TWU1CT0woU19QQVJBTVNMT1QgICAgICwgMHgxMTFiKQorCisvLyBNYW5hZ2VkIGNvZGUgc3ltYm9scy4KK0NWX1NZTUJPTChTX01BTkZSQU1FUkVMICAgLCAweDExMWUpCitDVl9TWU1CT0woU19NQU5SRUdJU1RFUiAgICwgMHgxMTFmKQorQ1ZfU1lNQk9MKFNfTUFOU0xPVCAgICAgICAsIDB4MTEyMCkKK0NWX1NZTUJPTChTX01BTk1BTllSRUcgICAgLCAweDExMjEpCitDVl9TWU1CT0woU19NQU5SRUdSRUwgICAgICwgMHgxMTIyKQorQ1ZfU1lNQk9MKFNfTUFOTUFOWVJFRzIgICAsIDB4MTEyMykKK0NWX1NZTUJPTChTX1VOQU1FU1BBQ0UgICAgLCAweDExMjQpCitDVl9TWU1CT0woU19EQVRBUkVGICAgICAgICwgMHgxMTI2KQorQ1ZfU1lNQk9MKFNfQU5OT1RBVElPTlJFRiAsIDB4MTEyOCkKK0NWX1NZTUJPTChTX1RPS0VOUkVGICAgICAgLCAweDExMjkpCitDVl9TWU1CT0woU19HTUFOUFJPQyAgICAgICwgMHgxMTJhKQorQ1ZfU1lNQk9MKFNfTE1BTlBST0MgICAgICAsIDB4MTEyYikKK0NWX1NZTUJPTChTX0FUVFJfRlJBTUVSRUwgLCAweDExMmUpCitDVl9TWU1CT0woU19BVFRSX1JFR0lTVEVSICwgMHgxMTJmKQorQ1ZfU1lNQk9MKFNfQVRUUl9SRUdSRUwgICAsIDB4MTEzMCkKK0NWX1NZTUJPTChTX0FUVFJfTUFOWVJFRyAgLCAweDExMzEpCisKKworQ1ZfU1lNQk9MKFNfU0VQQ09ERSAgICAgICAsIDB4MTEzMikKK0NWX1NZTUJPTChTX0xPQ0FMXzIwMDUgICAgLCAweDExMzMpCitDVl9TWU1CT0woU19ERUZSQU5HRV8yMDA1ICwgMHgxMTM0KQorQ1ZfU1lNQk9MKFNfREVGUkFOR0UyXzIwMDUsIDB4MTEzNSkKK0NWX1NZTUJPTChTX0RJU0NBUkRFRCAgICAgLCAweDExM2IpCisKKy8vIEN1cnJlbnQgc3ltYm9sIHR5cGVzIGZvciBtb3N0IHByb2NlZHVyZXMgYXMgb2YgdGhpcyB3cml0aW5nLgorQ1ZfU1lNQk9MKFNfTFBST0NNSVBTX0lEICAgLCAweDExNDgpCitDVl9TWU1CT0woU19HUFJPQ01JUFNfSUQgICAsIDB4MTE0OSkKK0NWX1NZTUJPTChTX0xQUk9DSUE2NF9JRCAgICwgMHgxMTRhKQorQ1ZfU1lNQk9MKFNfR1BST0NJQTY0X0lEICAgLCAweDExNGIpCisKK0NWX1NZTUJPTChTX0RFRlJBTkdFX0hMU0wgICwgMHgxMTUwKQorQ1ZfU1lNQk9MKFNfR0RBVEFfSExTTCAgICAgLCAweDExNTEpCitDVl9TWU1CT0woU19MREFUQV9ITFNMICAgICAsIDB4MTE1MikKK0NWX1NZTUJPTChTX0xPQ0FMX0RQQ19HUk9VUFNIQVJFRCwgMHgxMTU0KQorQ1ZfU1lNQk9MKFNfREVGUkFOR0VfRFBDX1BUUl9UQUcsIDB4MTE1NykKK0NWX1NZTUJPTChTX0RQQ19TWU1fVEFHX01BUCwgMHgxMTU4KQorQ1ZfU1lNQk9MKFNfQVJNU1dJVENIVEFCTEUgLCAweDExNTkpCitDVl9TWU1CT0woU19QT0dPREFUQSAgICAgICAsIDB4MTE1YykKK0NWX1NZTUJPTChTX0lOTElORVNJVEUyICAgICwgMHgxMTVkKQorQ1ZfU1lNQk9MKFNfTU9EX1RZUEVSRUYgICAgLCAweDExNWYpCitDVl9TWU1CT0woU19SRUZfTUlOSVBEQiAgICAsIDB4MTE2MCkKK0NWX1NZTUJPTChTX1BEQk1BUCAgICAgICAgICwgMHgxMTYxKQorQ1ZfU1lNQk9MKFNfR0RBVEFfSExTTDMyICAgLCAweDExNjIpCitDVl9TWU1CT0woU19MREFUQV9ITFNMMzIgICAsIDB4MTE2MykKK0NWX1NZTUJPTChTX0dEQVRBX0hMU0wzMl9FWCwgMHgxMTY0KQorQ1ZfU1lNQk9MKFNfTERBVEFfSExTTDMyX0VYLCAweDExNjUpCisKK0NWX1NZTUJPTChTX0ZBU1RMSU5LLCAweDExNjcpIC8vIFVuZG9jdW1lbnRlZAorU1lNQk9MX1JFQ09SRF9BTElBUyhTX0lOTElORUVTLCAweDExNjgsIElubGluZWVzU3ltLCBDYWxsZXJTeW0pIC8vIFVuZG9jdW1lbnRlZAorCisvLyBLbm93biBzeW1ib2wgdHlwZXMKK1NZTUJPTF9SRUNPUkQoU19FTkQgICAgICAgICAgICAgICAgICAsIDB4MDAwNiwgU2NvcGVFbmRTeW0pCitTWU1CT0xfUkVDT1JEX0FMSUFTKFNfSU5MSU5FU0lURV9FTkQgLCAweDExNGUsIElubGluZVNpdGVFbmQsIFNjb3BlRW5kU3ltKQorU1lNQk9MX1JFQ09SRF9BTElBUyhTX1BST0NfSURfRU5EICAgICwgMHgxMTRmLCBQcm9jRW5kLCBTY29wZUVuZFN5bSkKKworU1lNQk9MX1JFQ09SRChTX1RIVU5LMzIgICAgICAgLCAweDExMDIsIFRodW5rMzJTeW0pCitTWU1CT0xfUkVDT1JEKFNfVFJBTVBPTElORSAgICAsIDB4MTEyYywgVHJhbXBvbGluZVN5bSkKK1NZTUJPTF9SRUNPUkQoU19TRUNUSU9OICAgICAgICwgMHgxMTM2LCBTZWN0aW9uU3ltKQorU1lNQk9MX1JFQ09SRChTX0NPRkZHUk9VUCAgICAgLCAweDExMzcsIENvZmZHcm91cFN5bSkKK1NZTUJPTF9SRUNPUkQoU19FWFBPUlQgICAgICAgICwgMHgxMTM4LCBFeHBvcnRTeW0pCisKK1NZTUJPTF9SRUNPUkQoU19MUFJPQzMyICAgICAgICwgMHgxMTBmLCBQcm9jU3ltKQorU1lNQk9MX1JFQ09SRF9BTElBUyhTX0dQUk9DMzIgICAgICAgLCAweDExMTAsIEdsb2JhbFByb2NTeW0sIFByb2NTeW0pCitTWU1CT0xfUkVDT1JEX0FMSUFTKFNfTFBST0MzMl9JRCAgICAgLCAweDExNDYsIFByb2NJZFN5bSwgUHJvY1N5bSkKK1NZTUJPTF9SRUNPUkRfQUxJQVMoU19HUFJPQzMyX0lEICAgICAsIDB4MTE0NywgR2xvYmFsUHJvY0lkU3ltLCBQcm9jU3ltKQorU1lNQk9MX1JFQ09SRF9BTElBUyhTX0xQUk9DMzJfRFBDICAgICwgMHgxMTU1LCBEUENQcm9jU3ltLCBQcm9jU3ltKQorU1lNQk9MX1JFQ09SRF9BTElBUyhTX0xQUk9DMzJfRFBDX0lEICwgMHgxMTU2LCBEUENQcm9jSWRTeW0sIFByb2NTeW0pCisKK1NZTUJPTF9SRUNPUkQoU19SRUdJU1RFUiAgICAgICwgMHgxMTA2LCBSZWdpc3RlclN5bSkKK1NZTUJPTF9SRUNPUkQoU19QVUIzMiAgICAgICAgICwgMHgxMTBlLCBQdWJsaWNTeW0zMikKKworU1lNQk9MX1JFQ09SRChTX1BST0NSRUYgICAgICAgLCAweDExMjUsIFByb2NSZWZTeW0pCitTWU1CT0xfUkVDT1JEX0FMSUFTKFNfTFBST0NSRUYsIDB4MTEyNywgTG9jYWxQcm9jUmVmLCBQcm9jUmVmU3ltKQorCisKK1NZTUJPTF9SRUNPUkQoU19FTlZCTE9DSyAgICAgICwgMHgxMTNkLCBFbnZCbG9ja1N5bSkKKworU1lNQk9MX1JFQ09SRChTX0lOTElORVNJVEUgICAgICwgMHgxMTRkLCBJbmxpbmVTaXRlU3ltKQorU1lNQk9MX1JFQ09SRChTX0xPQ0FMICAgICAgICAgLCAweDExM2UsIExvY2FsU3ltKQorU1lNQk9MX1JFQ09SRChTX0RFRlJBTkdFICAgICAgLCAweDExM2YsIERlZlJhbmdlU3ltKQorU1lNQk9MX1JFQ09SRChTX0RFRlJBTkdFX1NVQkZJRUxELCAweDExNDAsIERlZlJhbmdlU3ViZmllbGRTeW0pCitTWU1CT0xfUkVDT1JEKFNfREVGUkFOR0VfUkVHSVNURVIsIDB4MTE0MSwgRGVmUmFuZ2VSZWdpc3RlclN5bSkKK1NZTUJPTF9SRUNPUkQoU19ERUZSQU5HRV9GUkFNRVBPSU5URVJfUkVMLCAweDExNDIsIERlZlJhbmdlRnJhbWVQb2ludGVyUmVsU3ltKQorU1lNQk9MX1JFQ09SRChTX0RFRlJBTkdFX1NVQkZJRUxEX1JFR0lTVEVSLCAweDExNDMsIERlZlJhbmdlU3ViZmllbGRSZWdpc3RlclN5bSkKK1NZTUJPTF9SRUNPUkQoU19ERUZSQU5HRV9GUkFNRVBPSU5URVJfUkVMX0ZVTExfU0NPUEUsIDB4MTE0NCwgRGVmUmFuZ2VGcmFtZVBvaW50ZXJSZWxGdWxsU2NvcGVTeW0pCitTWU1CT0xfUkVDT1JEKFNfREVGUkFOR0VfUkVHSVNURVJfUkVMLCAweDExNDUsIERlZlJhbmdlUmVnaXN0ZXJSZWxTeW0pCitTWU1CT0xfUkVDT1JEKFNfQkxPQ0szMiAgICAgICAsIDB4MTEwMywgQmxvY2tTeW0pCitTWU1CT0xfUkVDT1JEKFNfTEFCRUwzMiAgICAgICAsIDB4MTEwNSwgTGFiZWxTeW0pCitTWU1CT0xfUkVDT1JEKFNfT0JKTkFNRSAgICAgICAsIDB4MTEwMSwgT2JqTmFtZVN5bSkKK1NZTUJPTF9SRUNPUkQoU19DT01QSUxFMiAgICAgICwgMHgxMTE2LCBDb21waWxlMlN5bSkKK1NZTUJPTF9SRUNPUkQoU19DT01QSUxFMyAgICAgICwgMHgxMTNjLCBDb21waWxlM1N5bSkKK1NZTUJPTF9SRUNPUkQoU19GUkFNRVBST0MgICAgICwgMHgxMDEyLCBGcmFtZVByb2NTeW0pCitTWU1CT0xfUkVDT1JEKFNfQ0FMTFNJVEVJTkZPICAsIDB4MTEzOSwgQ2FsbFNpdGVJbmZvU3ltKQorU1lNQk9MX1JFQ09SRChTX0ZJTEVTVEFUSUMgICAgICwgMHgxMTUzLCBGaWxlU3RhdGljU3ltKQorU1lNQk9MX1JFQ09SRChTX0hFQVBBTExPQ1NJVEUgICwgMHgxMTVlLCBIZWFwQWxsb2NhdGlvblNpdGVTeW0pCitTWU1CT0xfUkVDT1JEKFNfRlJBTUVDT09LSUUgICAsIDB4MTEzYSwgRnJhbWVDb29raWVTeW0pCisKK1NZTUJPTF9SRUNPUkQoU19DQUxMRUVTICAgICAgICAsIDB4MTE1YSwgQ2FsbGVyU3ltKQorU1lNQk9MX1JFQ09SRF9BTElBUyhTX0NBTExFUlMsIDB4MTE1YiwgQ2FsbGVlU3ltLCBDYWxsZXJTeW0pCisKK1NZTUJPTF9SRUNPUkQoU19VRFQgICAgICAgICAgICwgMHgxMTA4LCBVRFRTeW0pCitTWU1CT0xfUkVDT1JEX0FMSUFTKFNfQ09CT0xVRFQgICAgICAsIDB4MTEwOSwgQ29ib2xVRFQsIFVEVFN5bSkKKworU1lNQk9MX1JFQ09SRChTX0JVSUxESU5GTyAgICAgICwgMHgxMTRjLCBCdWlsZEluZm9TeW0pCitTWU1CT0xfUkVDT1JEKFNfQlBSRUwzMiAgICAgICAsIDB4MTEwYiwgQlBSZWxhdGl2ZVN5bSkKK1NZTUJPTF9SRUNPUkQoU19SRUdSRUwzMiAgICAgICwgMHgxMTExLCBSZWdSZWxhdGl2ZVN5bSkKKworU1lNQk9MX1JFQ09SRChTX0NPTlNUQU5UICAgICAgLCAweDExMDcsIENvbnN0YW50U3ltKQorU1lNQk9MX1JFQ09SRF9BTElBUyhTX01BTkNPTlNUQU5UICAgLCAweDExMmQsIE1hbmFnZWRDb25zdGFudCwgQ29uc3RhbnRTeW0pCisKK1NZTUJPTF9SRUNPUkQoU19MREFUQTMyICAgICAgICwgMHgxMTBjLCBEYXRhU3ltKQorU1lNQk9MX1JFQ09SRF9BTElBUyhTX0dEQVRBMzIgICAgICAgLCAweDExMGQsIEdsb2JhbERhdGEsIERhdGFTeW0pCitTWU1CT0xfUkVDT1JEX0FMSUFTKFNfTE1BTkRBVEEgICAgICAsIDB4MTExYywgTWFuYWdlZExvY2FsRGF0YSwgRGF0YVN5bSkKK1NZTUJPTF9SRUNPUkRfQUxJQVMoU19HTUFOREFUQSAgICAgICwgMHgxMTFkLCBNYW5hZ2VkR2xvYmFsRGF0YSwgRGF0YVN5bSkKKworU1lNQk9MX1JFQ09SRChTX0xUSFJFQUQzMiAgICAgLCAweDExMTIsIFRocmVhZExvY2FsRGF0YVN5bSkKK1NZTUJPTF9SRUNPUkRfQUxJQVMoU19HVEhSRUFEMzIgICAgICwgMHgxMTEzLCBHbG9iYWxUTFMsIFRocmVhZExvY2FsRGF0YVN5bSkKKworCisjdW5kZWYgQ1ZfU1lNQk9MCisjdW5kZWYgU1lNQk9MX1JFQ09SRAorI3VuZGVmIFNZTUJPTF9SRUNPUkRfQUxJQVMKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3VHlwZXMuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdUeXBlcy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljZTk2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3VHlwZXMuZGVmCkBAIC0wLDAgKzEsMjUwIEBACisvLz09PS0tIENvZGVWaWV3VHlwZXMuZGVmIC0gQWxsIENvZGVWaWV3IGxlYWYgdHlwZXMgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFNlZSBMRUFGX0VOVU1fZSBpbiBjdmluZm8uaC4gVGhpcyBzaG91bGQgbWF0Y2ggdGhlIGNvbnN0YW50cyB0aGVyZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBJZiB0aGUgdHlwZSBpcyBrbm93biwgdGhlbiB3ZSBoYXZlIGEgcmVjb3JkIGRlc2NyaWJpbmcgaXQgaW4gVHlwZVJlY29yZC5oLgorCisjaWZuZGVmIENWX1RZUEUKKyNkZWZpbmUgQ1ZfVFlQRShsZl9lbmFtZSwgdmFsdWUpCisjZW5kaWYKKworLy8gSWYgdGhlIHR5cGUgaXMga25vd24sIHRoZW4gd2UgaGF2ZSBhIHJlY29yZCBkZXNjcmliaW5nIGl0IGluIFR5cGVSZWNvcmQuaC4KKyNpZm5kZWYgVFlQRV9SRUNPUkQKKyNkZWZpbmUgVFlQRV9SRUNPUkQobGZfZW5hbWUsIHZhbHVlLCBuYW1lKSBDVl9UWVBFKGxmX2VuYW1lLCB2YWx1ZSkKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfUkVDT1JEX0FMSUFTCisjZGVmaW5lIFRZUEVfUkVDT1JEX0FMSUFTKGxmX2VuYW1lLCB2YWx1ZSwgbmFtZSwgYWxpYXNfbmFtZSkgICAgICAgICAgICAgICAgICAgXAorICBUWVBFX1JFQ09SRChsZl9lbmFtZSwgdmFsdWUsIG5hbWUpCisjZW5kaWYKKworI2lmbmRlZiBNRU1CRVJfUkVDT1JECisjZGVmaW5lIE1FTUJFUl9SRUNPUkQobGZfZW5hbWUsIHZhbHVlLCBuYW1lKSBUWVBFX1JFQ09SRChsZl9lbmFtZSwgdmFsdWUsIG5hbWUpCisjZW5kaWYKKworI2lmbmRlZiBNRU1CRVJfUkVDT1JEX0FMSUFTCisjZGVmaW5lIE1FTUJFUl9SRUNPUkRfQUxJQVMobGZfZW5hbWUsIHZhbHVlLCBuYW1lLCBhbGlhc19uYW1lKSAgICAgICAgICAgICAgICAgXAorICBNRU1CRVJfUkVDT1JEKGxmX2VuYW1lLCB2YWx1ZSwgbmFtZSkKKyNlbmRpZgorCitUWVBFX1JFQ09SRChMRl9QT0lOVEVSLCAweDEwMDIsIFBvaW50ZXIpCitUWVBFX1JFQ09SRChMRl9NT0RJRklFUiwgMHgxMDAxLCBNb2RpZmllcikKK1RZUEVfUkVDT1JEKExGX1BST0NFRFVSRSwgMHgxMDA4LCBQcm9jZWR1cmUpCitUWVBFX1JFQ09SRChMRl9NRlVOQ1RJT04sIDB4MTAwOSwgTWVtYmVyRnVuY3Rpb24pCitUWVBFX1JFQ09SRChMRl9MQUJFTCwgMHgwMDBlLCBMYWJlbCkKK1RZUEVfUkVDT1JEKExGX0FSR0xJU1QsIDB4MTIwMSwgQXJnTGlzdCkKKworVFlQRV9SRUNPUkQoTEZfRklFTERMSVNULCAweDEyMDMsIEZpZWxkTGlzdCkKKworVFlQRV9SRUNPUkQoTEZfQVJSQVksIDB4MTUwMywgQXJyYXkpCitUWVBFX1JFQ09SRChMRl9DTEFTUywgMHgxNTA0LCBDbGFzcykKK1RZUEVfUkVDT1JEX0FMSUFTKExGX1NUUlVDVFVSRSwgMHgxNTA1LCBTdHJ1Y3QsIENsYXNzKQorVFlQRV9SRUNPUkRfQUxJQVMoTEZfSU5URVJGQUNFLCAweDE1MTksIEludGVyZmFjZSwgQ2xhc3MpCitUWVBFX1JFQ09SRChMRl9VTklPTiwgMHgxNTA2LCBVbmlvbikKK1RZUEVfUkVDT1JEKExGX0VOVU0sIDB4MTUwNywgRW51bSkKK1RZUEVfUkVDT1JEKExGX1RZUEVTRVJWRVIyLCAweDE1MTUsIFR5cGVTZXJ2ZXIyKQorVFlQRV9SRUNPUkQoTEZfVkZUQUJMRSwgMHgxNTFkLCBWRlRhYmxlKQorVFlQRV9SRUNPUkQoTEZfVlRTSEFQRSwgMHgwMDBhLCBWRlRhYmxlU2hhcGUpCisKK1RZUEVfUkVDT1JEKExGX0JJVEZJRUxELCAweDEyMDUsIEJpdEZpZWxkKQorCisvLyBNZW1iZXIgdHlwZSByZWNvcmRzLiBUaGVzZSBhcmUgZ2VuZXJhbGx5IG5vdCBsZW5ndGggcHJlZml4ZWQsIGFuZCBhcHBlYXIKKy8vIGluc2lkZSBvZiBhIGZpZWxkIGxpc3QgcmVjb3JkLgorTUVNQkVSX1JFQ09SRChMRl9CQ0xBU1MsIDB4MTQwMCwgQmFzZUNsYXNzKQorTUVNQkVSX1JFQ09SRF9BTElBUyhMRl9CSU5URVJGQUNFLCAweDE1MWEsIEJhc2VJbnRlcmZhY2UsIEJhc2VDbGFzcykKKworTUVNQkVSX1JFQ09SRChMRl9WQkNMQVNTLCAweDE0MDEsIFZpcnR1YWxCYXNlQ2xhc3MpCitNRU1CRVJfUkVDT1JEX0FMSUFTKExGX0lWQkNMQVNTLCAweDE0MDIsIEluZGlyZWN0VmlydHVhbEJhc2VDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgVmlydHVhbEJhc2VDbGFzcykKKworTUVNQkVSX1JFQ09SRChMRl9WRlVOQ1RBQiwgMHgxNDA5LCBWRlB0cikKK01FTUJFUl9SRUNPUkQoTEZfU1RNRU1CRVIsIDB4MTUwZSwgU3RhdGljRGF0YU1lbWJlcikKK01FTUJFUl9SRUNPUkQoTEZfTUVUSE9ELCAweDE1MGYsIE92ZXJsb2FkZWRNZXRob2QpCitNRU1CRVJfUkVDT1JEKExGX01FTUJFUiwgMHgxNTBkLCBEYXRhTWVtYmVyKQorTUVNQkVSX1JFQ09SRChMRl9ORVNUVFlQRSwgMHgxNTEwLCBOZXN0ZWRUeXBlKQorTUVNQkVSX1JFQ09SRChMRl9PTkVNRVRIT0QsIDB4MTUxMSwgT25lTWV0aG9kKQorTUVNQkVSX1JFQ09SRChMRl9FTlVNRVJBVEUsIDB4MTUwMiwgRW51bWVyYXRvcikKK01FTUJFUl9SRUNPUkQoTEZfSU5ERVgsIDB4MTQwNCwgTGlzdENvbnRpbnVhdGlvbikKKworLy8gSUQgbGVhZiByZWNvcmRzLiBTdWJzZXF1ZW50IGxlYWYgdHlwZXMgbWF5IGJlIHJlZmVyZW5jZWQgZnJvbSAuZGVidWckUy4KK1RZUEVfUkVDT1JEKExGX0ZVTkNfSUQsIDB4MTYwMSwgRnVuY0lkKQorVFlQRV9SRUNPUkQoTEZfTUZVTkNfSUQsIDB4MTYwMiwgTWVtYmVyRnVuY0lkKQorVFlQRV9SRUNPUkQoTEZfQlVJTERJTkZPLCAweDE2MDMsIEJ1aWxkSW5mbykKK1RZUEVfUkVDT1JEKExGX1NVQlNUUl9MSVNULCAweDE2MDQsIFN0cmluZ0xpc3QpCitUWVBFX1JFQ09SRChMRl9TVFJJTkdfSUQsIDB4MTYwNSwgU3RyaW5nSWQpCitUWVBFX1JFQ09SRChMRl9VRFRfU1JDX0xJTkUsIDB4MTYwNiwgVWR0U291cmNlTGluZSkKK1RZUEVfUkVDT1JEKExGX1VEVF9NT0RfU1JDX0xJTkUsIDB4MTYwNywgVWR0TW9kU291cmNlTGluZSkKKworCitUWVBFX1JFQ09SRChMRl9NRVRIT0RMSVNULCAweDEyMDYsIE1ldGhvZE92ZXJsb2FkTGlzdCkKKworCisvLyAxNiBiaXQgdHlwZSByZWNvcmRzLgorQ1ZfVFlQRShMRl9NT0RJRklFUl8xNnQsIDB4MDAwMSkKK0NWX1RZUEUoTEZfUE9JTlRFUl8xNnQsIDB4MDAwMikKK0NWX1RZUEUoTEZfQVJSQVlfMTZ0LCAweDAwMDMpCitDVl9UWVBFKExGX0NMQVNTXzE2dCwgMHgwMDA0KQorQ1ZfVFlQRShMRl9TVFJVQ1RVUkVfMTZ0LCAweDAwMDUpCitDVl9UWVBFKExGX1VOSU9OXzE2dCwgMHgwMDA2KQorQ1ZfVFlQRShMRl9FTlVNXzE2dCwgMHgwMDA3KQorQ1ZfVFlQRShMRl9QUk9DRURVUkVfMTZ0LCAweDAwMDgpCitDVl9UWVBFKExGX01GVU5DVElPTl8xNnQsIDB4MDAwOSkKK0NWX1RZUEUoTEZfQ09CT0wwXzE2dCwgMHgwMDBiKQorQ1ZfVFlQRShMRl9DT0JPTDEsIDB4MDAwYykKK0NWX1RZUEUoTEZfQkFSUkFZXzE2dCwgMHgwMDBkKQorQ1ZfVFlQRShMRl9OVUxMTEVBRiwgMHgwMDBmKSAvLyBMRl9OVUxMCitDVl9UWVBFKExGX05PVFRSQU4sIDB4MDAxMCkKK0NWX1RZUEUoTEZfRElNQVJSQVlfMTZ0LCAweDAwMTEpCitDVl9UWVBFKExGX1ZGVFBBVEhfMTZ0LCAweDAwMTIpCitDVl9UWVBFKExGX1BSRUNPTVBfMTZ0LCAweDAwMTMpCitDVl9UWVBFKExGX0VORFBSRUNPTVAsIDB4MDAxNCkKK0NWX1RZUEUoTEZfT0VNXzE2dCwgMHgwMDE1KQorQ1ZfVFlQRShMRl9UWVBFU0VSVkVSX1NULCAweDAwMTYpCisKK0NWX1RZUEUoTEZfU0tJUF8xNnQsIDB4MDIwMCkKK0NWX1RZUEUoTEZfQVJHTElTVF8xNnQsIDB4MDIwMSkKK0NWX1RZUEUoTEZfREVGQVJHXzE2dCwgMHgwMjAyKQorQ1ZfVFlQRShMRl9MSVNULCAweDAyMDMpCitDVl9UWVBFKExGX0ZJRUxETElTVF8xNnQsIDB4MDIwNCkKK0NWX1RZUEUoTEZfREVSSVZFRF8xNnQsIDB4MDIwNSkKK0NWX1RZUEUoTEZfQklURklFTERfMTZ0LCAweDAyMDYpCitDVl9UWVBFKExGX01FVEhPRExJU1RfMTZ0LCAweDAyMDcpCitDVl9UWVBFKExGX0RJTUNPTlVfMTZ0LCAweDAyMDgpCitDVl9UWVBFKExGX0RJTUNPTkxVXzE2dCwgMHgwMjA5KQorQ1ZfVFlQRShMRl9ESU1WQVJVXzE2dCwgMHgwMjBhKQorQ1ZfVFlQRShMRl9ESU1WQVJMVV8xNnQsIDB4MDIwYikKK0NWX1RZUEUoTEZfUkVGU1lNLCAweDAyMGMpCisKKy8vIDE2IGJpdCBtZW1iZXIgdHlwZXMuIEdlbmVyYWxseSBub3QgbGVuZ3RoIHByZWZpeGVkLgorQ1ZfVFlQRShMRl9CQ0xBU1NfMTZ0LCAweDA0MDApCitDVl9UWVBFKExGX1ZCQ0xBU1NfMTZ0LCAweDA0MDEpCitDVl9UWVBFKExGX0lWQkNMQVNTXzE2dCwgMHgwNDAyKQorQ1ZfVFlQRShMRl9FTlVNRVJBVEVfU1QsIDB4MDQwMykKK0NWX1RZUEUoTEZfRlJJRU5ERkNOXzE2dCwgMHgwNDA0KQorQ1ZfVFlQRShMRl9JTkRFWF8xNnQsIDB4MDQwNSkKK0NWX1RZUEUoTEZfTUVNQkVSXzE2dCwgMHgwNDA2KQorQ1ZfVFlQRShMRl9TVE1FTUJFUl8xNnQsIDB4MDQwNykKK0NWX1RZUEUoTEZfTUVUSE9EXzE2dCwgMHgwNDA4KQorQ1ZfVFlQRShMRl9ORVNUVFlQRV8xNnQsIDB4MDQwOSkKK0NWX1RZUEUoTEZfVkZVTkNUQUJfMTZ0LCAweDA0MGEpCitDVl9UWVBFKExGX0ZSSUVORENMU18xNnQsIDB4MDQwYikKK0NWX1RZUEUoTEZfT05FTUVUSE9EXzE2dCwgMHgwNDBjKQorQ1ZfVFlQRShMRl9WRlVOQ09GRl8xNnQsIDB4MDQwZCkKKworQ1ZfVFlQRShMRl9USTE2X01BWCwgMHgxMDAwKQorCitDVl9UWVBFKExGX0FSUkFZX1NULCAweDEwMDMpCitDVl9UWVBFKExGX0NMQVNTX1NULCAweDEwMDQpCitDVl9UWVBFKExGX1NUUlVDVFVSRV9TVCwgMHgxMDA1KQorQ1ZfVFlQRShMRl9VTklPTl9TVCwgMHgxMDA2KQorQ1ZfVFlQRShMRl9FTlVNX1NULCAweDEwMDcpCitDVl9UWVBFKExGX0NPQk9MMCwgMHgxMDBhKQorQ1ZfVFlQRShMRl9CQVJSQVksIDB4MTAwYikKK0NWX1RZUEUoTEZfRElNQVJSQVlfU1QsIDB4MTAwYykKK0NWX1RZUEUoTEZfVkZUUEFUSCwgMHgxMDBkKQorQ1ZfVFlQRShMRl9QUkVDT01QX1NULCAweDEwMGUpCitDVl9UWVBFKExGX09FTSwgMHgxMDBmKQorQ1ZfVFlQRShMRl9BTElBU19TVCwgMHgxMDEwKQorQ1ZfVFlQRShMRl9PRU0yLCAweDEwMTEpCisKK0NWX1RZUEUoTEZfU0tJUCwgMHgxMjAwKQorQ1ZfVFlQRShMRl9ERUZBUkdfU1QsIDB4MTIwMikKK0NWX1RZUEUoTEZfREVSSVZFRCwgMHgxMjA0KQorQ1ZfVFlQRShMRl9ESU1DT05VLCAweDEyMDcpCitDVl9UWVBFKExGX0RJTUNPTkxVLCAweDEyMDgpCitDVl9UWVBFKExGX0RJTVZBUlUsIDB4MTIwOSkKK0NWX1RZUEUoTEZfRElNVkFSTFUsIDB4MTIwYSkKKworLy8gTWVtYmVyIHR5cGUgcmVjb3Jkcy4gVGhlc2UgYXJlIGdlbmVyYWxseSBub3QgbGVuZ3RoIHByZWZpeGVkLCBhbmQgYXBwZWFyCisvLyBpbnNpZGUgb2YgYSBmaWVsZCBsaXN0IHJlY29yZC4KK0NWX1RZUEUoTEZfRlJJRU5ERkNOX1NULCAweDE0MDMpCitDVl9UWVBFKExGX01FTUJFUl9TVCwgMHgxNDA1KQorQ1ZfVFlQRShMRl9TVE1FTUJFUl9TVCwgMHgxNDA2KQorQ1ZfVFlQRShMRl9NRVRIT0RfU1QsIDB4MTQwNykKK0NWX1RZUEUoTEZfTkVTVFRZUEVfU1QsIDB4MTQwOCkKK0NWX1RZUEUoTEZfRlJJRU5EQ0xTLCAweDE0MGEpCitDVl9UWVBFKExGX09ORU1FVEhPRF9TVCwgMHgxNDBiKQorQ1ZfVFlQRShMRl9WRlVOQ09GRiwgMHgxNDBjKQorQ1ZfVFlQRShMRl9ORVNUVFlQRUVYX1NULCAweDE0MGQpCitDVl9UWVBFKExGX01FTUJFUk1PRElGWV9TVCwgMHgxNDBlKQorQ1ZfVFlQRShMRl9NQU5BR0VEX1NULCAweDE0MGYpCisKK0NWX1RZUEUoTEZfU1RfTUFYLCAweDE1MDApCitDVl9UWVBFKExGX1RZUEVTRVJWRVIsIDB4MTUwMSkKK0NWX1RZUEUoTEZfRElNQVJSQVksIDB4MTUwOCkKK0NWX1RZUEUoTEZfUFJFQ09NUCwgMHgxNTA5KQorQ1ZfVFlQRShMRl9BTElBUywgMHgxNTBhKQorQ1ZfVFlQRShMRl9ERUZBUkcsIDB4MTUwYikKK0NWX1RZUEUoTEZfRlJJRU5ERkNOLCAweDE1MGMpCitDVl9UWVBFKExGX05FU1RUWVBFRVgsIDB4MTUxMikKK0NWX1RZUEUoTEZfTUVNQkVSTU9ESUZZLCAweDE1MTMpCitDVl9UWVBFKExGX01BTkFHRUQsIDB4MTUxNCkKK0NWX1RZUEUoTEZfU1RSSURFRF9BUlJBWSwgMHgxNTE2KQorQ1ZfVFlQRShMRl9ITFNMLCAweDE1MTcpCitDVl9UWVBFKExGX01PRElGSUVSX0VYLCAweDE1MTgpCitDVl9UWVBFKExGX1ZFQ1RPUiwgMHgxNTFiKQorQ1ZfVFlQRShMRl9NQVRSSVgsIDB4MTUxYykKKworLy8gSUQgbGVhZiByZWNvcmRzLiBTdWJzZXF1ZW50IGxlYWYgdHlwZXMgbWF5IGJlIHJlZmVyZW5jZWQgZnJvbSAuZGVidWckUy4KKworLy8gTnVtZXJpYyBsZWFmIHR5cGVzLiBUaGVzZSBhcmUgZ2VuZXJhbGx5IGNvbnRhaW5lZCBpbiBvdGhlciByZWNvcmRzLCBhbmQgbm90CisvLyBlbmNvdW50ZXJlZCBpbiB0aGUgbWFpbiB0eXBlIHN0cmVhbS4KKworQ1ZfVFlQRShMRl9OVU1FUklDLCAweDgwMDApCitDVl9UWVBFKExGX0NIQVIsIDB4ODAwMCkKK0NWX1RZUEUoTEZfU0hPUlQsIDB4ODAwMSkKK0NWX1RZUEUoTEZfVVNIT1JULCAweDgwMDIpCitDVl9UWVBFKExGX0xPTkcsIDB4ODAwMykKK0NWX1RZUEUoTEZfVUxPTkcsIDB4ODAwNCkKK0NWX1RZUEUoTEZfUkVBTDMyLCAweDgwMDUpCitDVl9UWVBFKExGX1JFQUw2NCwgMHg4MDA2KQorQ1ZfVFlQRShMRl9SRUFMODAsIDB4ODAwNykKK0NWX1RZUEUoTEZfUkVBTDEyOCwgMHg4MDA4KQorQ1ZfVFlQRShMRl9RVUFEV09SRCwgMHg4MDA5KQorQ1ZfVFlQRShMRl9VUVVBRFdPUkQsIDB4ODAwYSkKK0NWX1RZUEUoTEZfUkVBTDQ4LCAweDgwMGIpCitDVl9UWVBFKExGX0NPTVBMRVgzMiwgMHg4MDBjKQorQ1ZfVFlQRShMRl9DT01QTEVYNjQsIDB4ODAwZCkKK0NWX1RZUEUoTEZfQ09NUExFWDgwLCAweDgwMGUpCitDVl9UWVBFKExGX0NPTVBMRVgxMjgsIDB4ODAwZikKK0NWX1RZUEUoTEZfVkFSU1RSSU5HLCAweDgwMTApCitDVl9UWVBFKExGX09DVFdPUkQsIDB4ODAxNykKK0NWX1RZUEUoTEZfVU9DVFdPUkQsIDB4ODAxOCkKK0NWX1RZUEUoTEZfREVDSU1BTCwgMHg4MDE5KQorQ1ZfVFlQRShMRl9EQVRFLCAweDgwMWEpCitDVl9UWVBFKExGX1VURjhTVFJJTkcsIDB4ODAxYikKK0NWX1RZUEUoTEZfUkVBTDE2LCAweDgwMWMpCisKKy8vIFBhZGRpbmcgYnl0ZXMuIFRoZXNlIGFyZSBlbWl0dGVkIGludG8gYWxpZ25tZW50IGJ5dGVzIGluIHRoZSB0eXBlIHN0cmVhbS4KKworQ1ZfVFlQRShMRl9QQUQwLCAweGYwKQorQ1ZfVFlQRShMRl9QQUQxLCAweGYxKQorQ1ZfVFlQRShMRl9QQUQyLCAweGYyKQorQ1ZfVFlQRShMRl9QQUQzLCAweGYzKQorQ1ZfVFlQRShMRl9QQUQ0LCAweGY0KQorQ1ZfVFlQRShMRl9QQUQ1LCAweGY1KQorQ1ZfVFlQRShMRl9QQUQ2LCAweGY2KQorQ1ZfVFlQRShMRl9QQUQ3LCAweGY3KQorQ1ZfVFlQRShMRl9QQUQ4LCAweGY4KQorQ1ZfVFlQRShMRl9QQUQ5LCAweGY5KQorQ1ZfVFlQRShMRl9QQUQxMCwgMHhmYSkKK0NWX1RZUEUoTEZfUEFEMTEsIDB4ZmIpCitDVl9UWVBFKExGX1BBRDEyLCAweGZjKQorQ1ZfVFlQRShMRl9QQUQxMywgMHhmZCkKK0NWX1RZUEUoTEZfUEFEMTQsIDB4ZmUpCitDVl9UWVBFKExGX1BBRDE1LCAweGZmKQorCisjdW5kZWYgQ1ZfVFlQRQorI3VuZGVmIFRZUEVfUkVDT1JECisjdW5kZWYgVFlQRV9SRUNPUkRfQUxJQVMKKyN1bmRlZiBNRU1CRVJfUkVDT1JECisjdW5kZWYgTUVNQkVSX1JFQ09SRF9BTElBUwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29udGludWF0aW9uUmVjb3JkQnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29udGludWF0aW9uUmVjb3JkQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmODUxYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db250aW51YXRpb25SZWNvcmRCdWlsZGVyLmgKQEAgLTAsMCArMSw2NSBAQAorLy89PT0tIENvbnRpbnVhdGlvblJlY29yZEJ1aWxkZXIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19DT05USU5VQVRJT05SRUNPUkRCVUlMREVSX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfQ09OVElOVUFUSU9OUkVDT1JEQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1JlY29yZFNlcmlhbGl6YXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXguaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZE1hcHBpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlVmlzaXRvckNhbGxiYWNrcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5Qnl0ZVN0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1Xcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKK2VudW0gY2xhc3MgQ29udGludWF0aW9uUmVjb3JkS2luZCB7IEZpZWxkTGlzdCwgTWV0aG9kT3ZlcmxvYWRMaXN0IH07CisKK2NsYXNzIENvbnRpbnVhdGlvblJlY29yZEJ1aWxkZXIgeworICBTbWFsbFZlY3Rvcjx1aW50MzJfdCwgND4gU2VnbWVudE9mZnNldHM7CisgIE9wdGlvbmFsPENvbnRpbnVhdGlvblJlY29yZEtpbmQ+IEtpbmQ7CisgIEFwcGVuZGluZ0JpbmFyeUJ5dGVTdHJlYW0gQnVmZmVyOworICBCaW5hcnlTdHJlYW1Xcml0ZXIgU2VnbWVudFdyaXRlcjsKKyAgVHlwZVJlY29yZE1hcHBpbmcgTWFwcGluZzsKKyAgQXJyYXlSZWY8dWludDhfdD4gSW5qZWN0ZWRTZWdtZW50Qnl0ZXM7CisKKyAgdWludDMyX3QgZ2V0Q3VycmVudFNlZ21lbnRMZW5ndGgoKSBjb25zdDsKKworICB2b2lkIGluc2VydFNlZ21lbnRFbmQodWludDMyX3QgT2Zmc2V0KTsKKyAgQ1ZUeXBlIGNyZWF0ZVNlZ21lbnRSZWNvcmQodWludDMyX3QgT2ZmQmVnaW4sIHVpbnQzMl90IE9mZkVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8VHlwZUluZGV4PiBSZWZlcnNUbyk7CisKK3B1YmxpYzoKKyAgQ29udGludWF0aW9uUmVjb3JkQnVpbGRlcigpOworICB+Q29udGludWF0aW9uUmVjb3JkQnVpbGRlcigpOworCisgIHZvaWQgYmVnaW4oQ29udGludWF0aW9uUmVjb3JkS2luZCBSZWNvcmRLaW5kKTsKKworICAvLyBUaGlzIHRlbXBsYXRlIGlzIGV4cGxpY2l0bHkgaW5zdGFudGlhdGVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGZvciBhbGwKKyAgLy8gc3VwcG9ydGVkIHR5cGVzLiAgVGhlIG1ldGhvZCBpdHNlbGYgaXMgdWdseSwgc28gaW5saW5pbmcgaXQgaW50byB0aGUgaGVhZGVyCisgIC8vIGZpbGUgY2x1dHRlcnMgYW4gb3RoZXJ3aXNlIHN0cmFpZ2h0Zm9yd2FyZCBpbnRlcmZhY2UuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZWNvcmRUeXBlPiB2b2lkIHdyaXRlTWVtYmVyVHlwZShSZWNvcmRUeXBlICZSZWNvcmQpOworCisgIHN0ZDo6dmVjdG9yPENWVHlwZT4gZW5kKFR5cGVJbmRleCBJbmRleCk7Cit9OworfSAvLyBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdDaGVja3N1bXNTdWJzZWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGIyODQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdDaGVja3N1bXNTdWJzZWN0aW9uLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8vPT09LSBEZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb24uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdDSEVDS1NVTVNTVUJTRUNUSU9OX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdDSEVDS1NVTVNTVUJTRUNUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtQXJyYXkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVhZGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIERlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uOworCitzdHJ1Y3QgRmlsZUNoZWNrc3VtRW50cnkgeworICB1aW50MzJfdCBGaWxlTmFtZU9mZnNldDsgICAgLy8gQnl0ZSBvZmZzZXQgb2YgZmlsZW5hbWUgaW4gZ2xvYmFsIHN0cmluZ3RhYmxlLgorICBGaWxlQ2hlY2tzdW1LaW5kIEtpbmQ7ICAgICAgLy8gVGhlIHR5cGUgb2YgY2hlY2tzdW0uCisgIEFycmF5UmVmPHVpbnQ4X3Q+IENoZWNrc3VtOyAvLyBUaGUgYnl0ZXMgb2YgdGhlIGNoZWNrc3VtLgorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBWYXJTdHJlYW1BcnJheUV4dHJhY3Rvcjxjb2Rldmlldzo6RmlsZUNoZWNrc3VtRW50cnk+IHsKK3B1YmxpYzoKKyAgdXNpbmcgQ29udGV4dFR5cGUgPSB2b2lkOworCisgIEVycm9yIG9wZXJhdG9yKCkoQmluYXJ5U3RyZWFtUmVmIFN0cmVhbSwgdWludDMyX3QgJkxlbiwKKyAgICAgICAgICAgICAgICAgICBjb2Rldmlldzo6RmlsZUNoZWNrc3VtRW50cnkgJkl0ZW0pOworfTsKKworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgRGVidWdDaGVja3N1bXNTdWJzZWN0aW9uUmVmIGZpbmFsIDogcHVibGljIERlYnVnU3Vic2VjdGlvblJlZiB7CisgIHVzaW5nIEZpbGVDaGVja3N1bUFycmF5ID0gVmFyU3RyZWFtQXJyYXk8Y29kZXZpZXc6OkZpbGVDaGVja3N1bUVudHJ5PjsKKyAgdXNpbmcgSXRlcmF0b3IgPSBGaWxlQ2hlY2tzdW1BcnJheTo6SXRlcmF0b3I7CisKK3B1YmxpYzoKKyAgRGVidWdDaGVja3N1bXNTdWJzZWN0aW9uUmVmKCkKKyAgICAgIDogRGVidWdTdWJzZWN0aW9uUmVmKERlYnVnU3Vic2VjdGlvbktpbmQ6OkZpbGVDaGVja3N1bXMpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWJ1Z1N1YnNlY3Rpb25SZWYgKlMpIHsKKyAgICByZXR1cm4gUy0+a2luZCgpID09IERlYnVnU3Vic2VjdGlvbktpbmQ6OkZpbGVDaGVja3N1bXM7CisgIH0KKworICBib29sIHZhbGlkKCkgY29uc3QgeyByZXR1cm4gQ2hlY2tzdW1zLnZhbGlkKCk7IH0KKworICBFcnJvciBpbml0aWFsaXplKEJpbmFyeVN0cmVhbVJlYWRlciBSZWFkZXIpOworICBFcnJvciBpbml0aWFsaXplKEJpbmFyeVN0cmVhbVJlZiBTdHJlYW0pOworCisgIEl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gQ2hlY2tzdW1zLmJlZ2luKCk7IH0KKyAgSXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gQ2hlY2tzdW1zLmVuZCgpOyB9CisKKyAgY29uc3QgRmlsZUNoZWNrc3VtQXJyYXkgJmdldEFycmF5KCkgY29uc3QgeyByZXR1cm4gQ2hlY2tzdW1zOyB9CisKK3ByaXZhdGU6CisgIEZpbGVDaGVja3N1bUFycmF5IENoZWNrc3VtczsKK307CisKK2NsYXNzIERlYnVnQ2hlY2tzdW1zU3Vic2VjdGlvbiBmaW5hbCA6IHB1YmxpYyBEZWJ1Z1N1YnNlY3Rpb24geworcHVibGljOgorICBleHBsaWNpdCBEZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb24oRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb24gJlN0cmluZ3MpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVidWdTdWJzZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPmtpbmQoKSA9PSBEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpGaWxlQ2hlY2tzdW1zOworICB9CisKKyAgdm9pZCBhZGRDaGVja3N1bShTdHJpbmdSZWYgRmlsZU5hbWUsIEZpbGVDaGVja3N1bUtpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiBCeXRlcyk7CisKKyAgdWludDMyX3QgY2FsY3VsYXRlU2VyaWFsaXplZFNpemUoKSBjb25zdCBvdmVycmlkZTsKKyAgRXJyb3IgY29tbWl0KEJpbmFyeVN0cmVhbVdyaXRlciAmV3JpdGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgbWFwQ2hlY2tzdW1PZmZzZXQoU3RyaW5nUmVmIEZpbGVOYW1lKSBjb25zdDsKKworcHJpdmF0ZToKKyAgRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb24gJlN0cmluZ3M7CisKKyAgRGVuc2VNYXA8dWludDMyX3QsIHVpbnQzMl90PiBPZmZzZXRNYXA7CisgIHVpbnQzMl90IFNlcmlhbGl6ZWRTaXplID0gMDsKKyAgQnVtcFB0ckFsbG9jYXRvciBTdG9yYWdlOworICBzdGQ6OnZlY3RvcjxGaWxlQ2hlY2tzdW1FbnRyeT4gQ2hlY2tzdW1zOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR0NIRUNLU1VNU1NVQlNFQ1RJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdDcm9zc0V4U3Vic2VjdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdDcm9zc0V4U3Vic2VjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmOWU5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0Nyb3NzRXhTdWJzZWN0aW9uLmgKQEAgLTAsMCArMSw2OCBAQAorLy89PT0tIERlYnVnQ3Jvc3NFeFN1YnNlY3Rpb24uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR0NST1NTRVhTVUJTRUNUSU9OX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdDUk9TU0VYU1VCU0VDVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1BcnJheS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWFkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIERlYnVnQ3Jvc3NNb2R1bGVFeHBvcnRzU3Vic2VjdGlvblJlZiBmaW5hbCA6IHB1YmxpYyBEZWJ1Z1N1YnNlY3Rpb25SZWYgeworICB1c2luZyBSZWZlcmVuY2VBcnJheSA9IEZpeGVkU3RyZWFtQXJyYXk8Q3Jvc3NNb2R1bGVFeHBvcnQ+OworICB1c2luZyBJdGVyYXRvciA9IFJlZmVyZW5jZUFycmF5OjpJdGVyYXRvcjsKKworcHVibGljOgorICBEZWJ1Z0Nyb3NzTW9kdWxlRXhwb3J0c1N1YnNlY3Rpb25SZWYoKQorICAgICAgOiBEZWJ1Z1N1YnNlY3Rpb25SZWYoRGVidWdTdWJzZWN0aW9uS2luZDo6Q3Jvc3NTY29wZUV4cG9ydHMpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWJ1Z1N1YnNlY3Rpb25SZWYgKlMpIHsKKyAgICByZXR1cm4gUy0+a2luZCgpID09IERlYnVnU3Vic2VjdGlvbktpbmQ6OkNyb3NzU2NvcGVFeHBvcnRzOworICB9CisKKyAgRXJyb3IgaW5pdGlhbGl6ZShCaW5hcnlTdHJlYW1SZWFkZXIgUmVhZGVyKTsKKyAgRXJyb3IgaW5pdGlhbGl6ZShCaW5hcnlTdHJlYW1SZWYgU3RyZWFtKTsKKworICBJdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFJlZmVyZW5jZXMuYmVnaW4oKTsgfQorICBJdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBSZWZlcmVuY2VzLmVuZCgpOyB9CisKK3ByaXZhdGU6CisgIEZpeGVkU3RyZWFtQXJyYXk8Q3Jvc3NNb2R1bGVFeHBvcnQ+IFJlZmVyZW5jZXM7Cit9OworCitjbGFzcyBEZWJ1Z0Nyb3NzTW9kdWxlRXhwb3J0c1N1YnNlY3Rpb24gZmluYWwgOiBwdWJsaWMgRGVidWdTdWJzZWN0aW9uIHsKK3B1YmxpYzoKKyAgRGVidWdDcm9zc01vZHVsZUV4cG9ydHNTdWJzZWN0aW9uKCkKKyAgICAgIDogRGVidWdTdWJzZWN0aW9uKERlYnVnU3Vic2VjdGlvbktpbmQ6OkNyb3NzU2NvcGVFeHBvcnRzKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVidWdTdWJzZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPmtpbmQoKSA9PSBEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpDcm9zc1Njb3BlRXhwb3J0czsKKyAgfQorCisgIHZvaWQgYWRkTWFwcGluZyh1aW50MzJfdCBMb2NhbCwgdWludDMyX3QgR2xvYmFsKTsKKworICB1aW50MzJfdCBjYWxjdWxhdGVTZXJpYWxpemVkU2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworICBFcnJvciBjb21taXQoQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBzdGQ6Om1hcDx1aW50MzJfdCwgdWludDMyX3Q+IE1hcHBpbmdzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdDUk9TU0VYU1VCU0VDVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0Nyb3NzSW1wU3Vic2VjdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdDcm9zc0ltcFN1YnNlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmU3ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdDcm9zc0ltcFN1YnNlY3Rpb24uaApAQCAtMCwwICsxLDk1IEBACisvLz09PS0gRGVidWdDcm9zc0V4U3Vic2VjdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0RFQlVHQ1JPU1NJTVBTVUJTRUNUSU9OX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdDUk9TU0lNUFNVQlNFQ1RJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N1YnNlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtQXJyYXkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVhZGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgY29kZXZpZXcgeworCitzdHJ1Y3QgQ3Jvc3NNb2R1bGVJbXBvcnRJdGVtIHsKKyAgY29uc3QgQ3Jvc3NNb2R1bGVJbXBvcnQgKkhlYWRlciA9IG51bGxwdHI7CisgIEZpeGVkU3RyZWFtQXJyYXk8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+IEltcG9ydHM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKKwordGVtcGxhdGUgPD4gc3RydWN0IFZhclN0cmVhbUFycmF5RXh0cmFjdG9yPGNvZGV2aWV3OjpDcm9zc01vZHVsZUltcG9ydEl0ZW0+IHsKK3B1YmxpYzoKKyAgdXNpbmcgQ29udGV4dFR5cGUgPSB2b2lkOworCisgIEVycm9yIG9wZXJhdG9yKCkoQmluYXJ5U3RyZWFtUmVmIFN0cmVhbSwgdWludDMyX3QgJkxlbiwKKyAgICAgICAgICAgICAgICAgICBjb2Rldmlldzo6Q3Jvc3NNb2R1bGVJbXBvcnRJdGVtICZJdGVtKTsKK307CisKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIERlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uOworCitjbGFzcyBEZWJ1Z0Nyb3NzTW9kdWxlSW1wb3J0c1N1YnNlY3Rpb25SZWYgZmluYWwgOiBwdWJsaWMgRGVidWdTdWJzZWN0aW9uUmVmIHsKKyAgdXNpbmcgUmVmZXJlbmNlQXJyYXkgPSBWYXJTdHJlYW1BcnJheTxDcm9zc01vZHVsZUltcG9ydEl0ZW0+OworICB1c2luZyBJdGVyYXRvciA9IFJlZmVyZW5jZUFycmF5OjpJdGVyYXRvcjsKKworcHVibGljOgorICBEZWJ1Z0Nyb3NzTW9kdWxlSW1wb3J0c1N1YnNlY3Rpb25SZWYoKQorICAgICAgOiBEZWJ1Z1N1YnNlY3Rpb25SZWYoRGVidWdTdWJzZWN0aW9uS2luZDo6Q3Jvc3NTY29wZUltcG9ydHMpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWJ1Z1N1YnNlY3Rpb25SZWYgKlMpIHsKKyAgICByZXR1cm4gUy0+a2luZCgpID09IERlYnVnU3Vic2VjdGlvbktpbmQ6OkNyb3NzU2NvcGVJbXBvcnRzOworICB9CisKKyAgRXJyb3IgaW5pdGlhbGl6ZShCaW5hcnlTdHJlYW1SZWFkZXIgUmVhZGVyKTsKKyAgRXJyb3IgaW5pdGlhbGl6ZShCaW5hcnlTdHJlYW1SZWYgU3RyZWFtKTsKKworICBJdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFJlZmVyZW5jZXMuYmVnaW4oKTsgfQorICBJdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBSZWZlcmVuY2VzLmVuZCgpOyB9CisKK3ByaXZhdGU6CisgIFJlZmVyZW5jZUFycmF5IFJlZmVyZW5jZXM7Cit9OworCitjbGFzcyBEZWJ1Z0Nyb3NzTW9kdWxlSW1wb3J0c1N1YnNlY3Rpb24gZmluYWwgOiBwdWJsaWMgRGVidWdTdWJzZWN0aW9uIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRGVidWdDcm9zc01vZHVsZUltcG9ydHNTdWJzZWN0aW9uKAorICAgICAgRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb24gJlN0cmluZ3MpCisgICAgICA6IERlYnVnU3Vic2VjdGlvbihEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpDcm9zc1Njb3BlSW1wb3J0cyksCisgICAgICAgIFN0cmluZ3MoU3RyaW5ncykge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlYnVnU3Vic2VjdGlvbiAqUykgeworICAgIHJldHVybiBTLT5raW5kKCkgPT0gRGVidWdTdWJzZWN0aW9uS2luZDo6Q3Jvc3NTY29wZUltcG9ydHM7CisgIH0KKworICB2b2lkIGFkZEltcG9ydChTdHJpbmdSZWYgTW9kdWxlLCB1aW50MzJfdCBJbXBvcnRJZCk7CisKKyAgdWludDMyX3QgY2FsY3VsYXRlU2VyaWFsaXplZFNpemUoKSBjb25zdCBvdmVycmlkZTsKKyAgRXJyb3IgY29tbWl0KEJpbmFyeVN0cmVhbVdyaXRlciAmV3JpdGVyKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb24gJlN0cmluZ3M7CisgIFN0cmluZ01hcDxzdGQ6OnZlY3RvcjxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4+IE1hcHBpbmdzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR0NST1NTSU1QU1VCU0VDVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0ZyYW1lRGF0YVN1YnNlY3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnRnJhbWVEYXRhU3Vic2VjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMzI5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0ZyYW1lRGF0YVN1YnNlY3Rpb24uaApAQCAtMCwwICsxLDYwIEBACisvLz09PS0gRGVidWdGcmFtZURhdGFTdWJzZWN0aW9uLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdGUkFNRURBVEFTVUJTRUNUSU9OX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdGUkFNRURBVEFTVUJTRUNUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdWJzZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlYWRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworY2xhc3MgRGVidWdGcmFtZURhdGFTdWJzZWN0aW9uUmVmIGZpbmFsIDogcHVibGljIERlYnVnU3Vic2VjdGlvblJlZiB7CitwdWJsaWM6CisgIERlYnVnRnJhbWVEYXRhU3Vic2VjdGlvblJlZigpCisgICAgICA6IERlYnVnU3Vic2VjdGlvblJlZihEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpGcmFtZURhdGEpIHt9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVidWdTdWJzZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPmtpbmQoKSA9PSBEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpGcmFtZURhdGE7CisgIH0KKworICBFcnJvciBpbml0aWFsaXplKEJpbmFyeVN0cmVhbVJlYWRlciBSZWFkZXIpOworCisgIEZpeGVkU3RyZWFtQXJyYXk8RnJhbWVEYXRhPjo6SXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBGcmFtZXMuYmVnaW4oKTsgfQorICBGaXhlZFN0cmVhbUFycmF5PEZyYW1lRGF0YT46Okl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEZyYW1lcy5lbmQoKTsgfQorCisgIGNvbnN0IHZvaWQgKmdldFJlbG9jUHRyKCkgY29uc3QgeyByZXR1cm4gUmVsb2NQdHI7IH0KKworcHJpdmF0ZToKKyAgY29uc3QgdWludDMyX3QgKlJlbG9jUHRyID0gbnVsbHB0cjsKKyAgRml4ZWRTdHJlYW1BcnJheTxGcmFtZURhdGE+IEZyYW1lczsKK307CisKK2NsYXNzIERlYnVnRnJhbWVEYXRhU3Vic2VjdGlvbiBmaW5hbCA6IHB1YmxpYyBEZWJ1Z1N1YnNlY3Rpb24geworcHVibGljOgorICBEZWJ1Z0ZyYW1lRGF0YVN1YnNlY3Rpb24oKQorICAgICAgOiBEZWJ1Z1N1YnNlY3Rpb24oRGVidWdTdWJzZWN0aW9uS2luZDo6RnJhbWVEYXRhKSB7fQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlYnVnU3Vic2VjdGlvbiAqUykgeworICAgIHJldHVybiBTLT5raW5kKCkgPT0gRGVidWdTdWJzZWN0aW9uS2luZDo6RnJhbWVEYXRhOworICB9CisKKyAgdWludDMyX3QgY2FsY3VsYXRlU2VyaWFsaXplZFNpemUoKSBjb25zdCBvdmVycmlkZTsKKyAgRXJyb3IgY29tbWl0KEJpbmFyeVN0cmVhbVdyaXRlciAmV3JpdGVyKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGFkZEZyYW1lRGF0YShjb25zdCBGcmFtZURhdGEgJkZyYW1lKTsKKyAgdm9pZCBzZXRGcmFtZXMoQXJyYXlSZWY8RnJhbWVEYXRhPiBGcmFtZXMpOworCitwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxGcmFtZURhdGE+IEZyYW1lczsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdJbmxpbmVlTGluZXNTdWJzZWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0lubGluZWVMaW5lc1N1YnNlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODhjMGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdJbmxpbmVlTGluZXNTdWJzZWN0aW9uLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8vPT09LSBEZWJ1Z0lubGluZWVMaW5lc1N1YnNlY3Rpb24uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdJTkxJTkVFTElORVNTVUJTRUNUSU9OX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdJTkxJTkVFTElORVNTVUJTRUNUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdWJzZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvTGluZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1BcnJheS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWFkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIERlYnVnQ2hlY2tzdW1zU3Vic2VjdGlvbjsKKworZW51bSBjbGFzcyBJbmxpbmVlTGluZXNTaWduYXR1cmUgOiB1aW50MzJfdCB7CisgIE5vcm1hbCwgICAgLy8gQ1ZfSU5MSU5FRV9TT1VSQ0VfTElORV9TSUdOQVRVUkUKKyAgRXh0cmFGaWxlcyAvLyBDVl9JTkxJTkVFX1NPVVJDRV9MSU5FX1NJR05BVFVSRV9FWAorfTsKKworc3RydWN0IElubGluZWVTb3VyY2VMaW5lSGVhZGVyIHsKKyAgVHlwZUluZGV4IElubGluZWU7ICAgICAgICAgICAgICAgICAgLy8gSUQgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgd2FzIGlubGluZWQuCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEZpbGVJRDsgICAgICAgIC8vIE9mZnNldCBpbnRvIEZpbGVDaGVja3N1bXMgc3Vic2VjdGlvbi4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU291cmNlTGluZU51bTsgLy8gRmlyc3QgbGluZSBvZiBpbmxpbmVkIGNvZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGV4dHJhIGZpbGVzIHByZXNlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdWxpdHRsZTMyX3QgRXh0cmFGaWxlQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdWxpdHRsZTMyX3QgRmlsZXNbXTsKK307CisKK3N0cnVjdCBJbmxpbmVlU291cmNlTGluZSB7CisgIGNvbnN0IElubGluZWVTb3VyY2VMaW5lSGVhZGVyICpIZWFkZXI7CisgIEZpeGVkU3RyZWFtQXJyYXk8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+IEV4dHJhRmlsZXM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKKwordGVtcGxhdGUgPD4gc3RydWN0IFZhclN0cmVhbUFycmF5RXh0cmFjdG9yPGNvZGV2aWV3OjpJbmxpbmVlU291cmNlTGluZT4geworICBFcnJvciBvcGVyYXRvcigpKEJpbmFyeVN0cmVhbVJlZiBTdHJlYW0sIHVpbnQzMl90ICZMZW4sCisgICAgICAgICAgICAgICAgICAgY29kZXZpZXc6OklubGluZWVTb3VyY2VMaW5lICZJdGVtKTsKKworICBib29sIEhhc0V4dHJhRmlsZXMgPSBmYWxzZTsKK307CisKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIERlYnVnSW5saW5lZUxpbmVzU3Vic2VjdGlvblJlZiBmaW5hbCA6IHB1YmxpYyBEZWJ1Z1N1YnNlY3Rpb25SZWYgeworICB1c2luZyBMaW5lc0FycmF5ID0gVmFyU3RyZWFtQXJyYXk8SW5saW5lZVNvdXJjZUxpbmU+OworICB1c2luZyBJdGVyYXRvciA9IExpbmVzQXJyYXk6Okl0ZXJhdG9yOworCitwdWJsaWM6CisgIERlYnVnSW5saW5lZUxpbmVzU3Vic2VjdGlvblJlZigpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVidWdTdWJzZWN0aW9uUmVmICpTKSB7CisgICAgcmV0dXJuIFMtPmtpbmQoKSA9PSBEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpJbmxpbmVlTGluZXM7CisgIH0KKworICBFcnJvciBpbml0aWFsaXplKEJpbmFyeVN0cmVhbVJlYWRlciBSZWFkZXIpOworICBib29sIGhhc0V4dHJhRmlsZXMoKSBjb25zdDsKKworICBJdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIExpbmVzLmJlZ2luKCk7IH0KKyAgSXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gTGluZXMuZW5kKCk7IH0KKworcHJpdmF0ZToKKyAgSW5saW5lZUxpbmVzU2lnbmF0dXJlIFNpZ25hdHVyZTsKKyAgVmFyU3RyZWFtQXJyYXk8SW5saW5lZVNvdXJjZUxpbmU+IExpbmVzOworfTsKKworY2xhc3MgRGVidWdJbmxpbmVlTGluZXNTdWJzZWN0aW9uIGZpbmFsIDogcHVibGljIERlYnVnU3Vic2VjdGlvbiB7CitwdWJsaWM6CisgIHN0cnVjdCBFbnRyeSB7CisgICAgc3RkOjp2ZWN0b3I8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+IEV4dHJhRmlsZXM7CisgICAgSW5saW5lZVNvdXJjZUxpbmVIZWFkZXIgSGVhZGVyOworICB9OworCisgIERlYnVnSW5saW5lZUxpbmVzU3Vic2VjdGlvbihEZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb24gJkNoZWNrc3VtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzRXh0cmFGaWxlcyA9IGZhbHNlKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlYnVnU3Vic2VjdGlvbiAqUykgeworICAgIHJldHVybiBTLT5raW5kKCkgPT0gRGVidWdTdWJzZWN0aW9uS2luZDo6SW5saW5lZUxpbmVzOworICB9CisKKyAgRXJyb3IgY29tbWl0KEJpbmFyeVN0cmVhbVdyaXRlciAmV3JpdGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgY2FsY3VsYXRlU2VyaWFsaXplZFNpemUoKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGFkZElubGluZVNpdGUoVHlwZUluZGV4IEZ1bmNJZCwgU3RyaW5nUmVmIEZpbGVOYW1lLCB1aW50MzJfdCBTb3VyY2VMaW5lKTsKKyAgdm9pZCBhZGRFeHRyYUZpbGUoU3RyaW5nUmVmIEZpbGVOYW1lKTsKKworICBib29sIGhhc0V4dHJhRmlsZXMoKSBjb25zdCB7IHJldHVybiBIYXNFeHRyYUZpbGVzOyB9CisgIHZvaWQgc2V0SGFzRXh0cmFGaWxlcyhib29sIEhhcykgeyBIYXNFeHRyYUZpbGVzID0gSGFzOyB9CisKKyAgc3RkOjp2ZWN0b3I8RW50cnk+Ojpjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEVudHJpZXMuYmVnaW4oKTsgfQorICBzdGQ6OnZlY3RvcjxFbnRyeT46OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEVudHJpZXMuZW5kKCk7IH0KKworcHJpdmF0ZToKKyAgRGVidWdDaGVja3N1bXNTdWJzZWN0aW9uICZDaGVja3N1bXM7CisgIGJvb2wgSGFzRXh0cmFGaWxlcyA9IGZhbHNlOworICB1aW50MzJfdCBFeHRyYUZpbGVDb3VudCA9IDA7CisgIHN0ZDo6dmVjdG9yPEVudHJ5PiBFbnRyaWVzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR0lOTElORUVMSU5FU1NVQlNFQ1RJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdMaW5lc1N1YnNlY3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnTGluZXNTdWJzZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwNDRiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnTGluZXNTdWJzZWN0aW9uLmgKQEAgLTAsMCArMSwxNTAgQEAKKy8vPT09LSBEZWJ1Z0xpbmVzU3Vic2VjdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdMSU5FU1NVQlNFQ1RJT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR0xJTkVTU1VCU0VDVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0xpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtQXJyYXkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVhZGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgRGVidWdDaGVja3N1bXNTdWJzZWN0aW9uOworY2xhc3MgRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb247CisKKy8vIENvcnJlc3BvbmRzIHRvIHRoZSBgQ1ZfRGVidWdTTGluZXNIZWFkZXJfdGAgc3RydWN0dXJlLgorc3RydWN0IExpbmVGcmFnbWVudEhlYWRlciB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFJlbG9jT2Zmc2V0OyAgLy8gQ29kZSBvZmZzZXQgb2YgbGluZSBjb250cmlidXRpb24uCisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFJlbG9jU2VnbWVudDsgLy8gQ29kZSBzZWdtZW50IG9mIGxpbmUgY29udHJpYnV0aW9uLgorICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBGbGFnczsgICAgICAgIC8vIFNlZSBMaW5lRmxhZ3MgZW51bWVyYXRpb24uCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IENvZGVTaXplOyAgICAgLy8gQ29kZSBzaXplIG9mIHRoaXMgbGluZSBjb250cmlidXRpb24uCit9OworCisvLyBDb3JyZXNwb25kcyB0byB0aGUgYENWX0RlYnVnU0xpbmVzRmlsZUJsb2NrSGVhZGVyX3RgIHN0cnVjdHVyZS4KK3N0cnVjdCBMaW5lQmxvY2tGcmFnbWVudEhlYWRlciB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE5hbWVJbmRleDsgLy8gT2Zmc2V0IG9mIEZpbGVDaGVja3N1bSBlbnRyeSBpbiBGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2tzdW1zIGJ1ZmZlci4gIFRoZSBjaGVja3N1bSBlbnRyeSB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGFpbnMgYW5vdGhlciBvZmZzZXQgaW50byB0aGUgc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFibGUgb2YgdGhlIGFjdHVhbCBuYW1lLgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBOdW1MaW5lczsgIC8vIE51bWJlciBvZiBsaW5lcworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBCbG9ja1NpemU7IC8vIENvZGUgc2l6ZSBvZiBibG9jaywgaW4gYnl0ZXMuCisgIC8vIFRoZSBmb2xsb3dpbmcgdHdvIHZhcmlhYmxlIGxlbmd0aCBhcnJheXMgYXBwZWFyIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQorICAvLyBoZWFkZXIuICBUaGUgc3RydWN0dXJlIGRlZmluaXRpb25zIGZvbGxvdy4KKyAgLy8gTGluZU51bWJlckVudHJ5ICAgTGluZXNbTnVtTGluZXNdOworICAvLyBDb2x1bW5OdW1iZXJFbnRyeSBDb2x1bW5zW051bUxpbmVzXTsKK307CisKKy8vIENvcnJlc3BvbmRzIHRvIGBDVl9MaW5lX3RgIHN0cnVjdHVyZQorc3RydWN0IExpbmVOdW1iZXJFbnRyeSB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE9mZnNldDsgLy8gT2Zmc2V0IHRvIHN0YXJ0IG9mIGNvZGUgYnl0ZXMgZm9yIGxpbmUgbnVtYmVyCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEZsYWdzOyAgLy8gU3RhcnQ6MjQsIEVuZDo3LCBJc1N0YXRlbWVudDoxCit9OworCisvLyBDb3JyZXNwb25kcyB0byBgQ1ZfQ29sdW1uX3RgIHN0cnVjdHVyZQorc3RydWN0IENvbHVtbk51bWJlckVudHJ5IHsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgU3RhcnRDb2x1bW47CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IEVuZENvbHVtbjsKK307CisKK3N0cnVjdCBMaW5lQ29sdW1uRW50cnkgeworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBOYW1lSW5kZXg7CisgIEZpeGVkU3RyZWFtQXJyYXk8TGluZU51bWJlckVudHJ5PiBMaW5lTnVtYmVyczsKKyAgRml4ZWRTdHJlYW1BcnJheTxDb2x1bW5OdW1iZXJFbnRyeT4gQ29sdW1uczsKK307CisKK2NsYXNzIExpbmVDb2x1bW5FeHRyYWN0b3IgeworcHVibGljOgorICBFcnJvciBvcGVyYXRvcigpKEJpbmFyeVN0cmVhbVJlZiBTdHJlYW0sIHVpbnQzMl90ICZMZW4sCisgICAgICAgICAgICAgICAgICAgTGluZUNvbHVtbkVudHJ5ICZJdGVtKTsKKworICBjb25zdCBMaW5lRnJhZ21lbnRIZWFkZXIgKkhlYWRlciA9IG51bGxwdHI7Cit9OworCitjbGFzcyBEZWJ1Z0xpbmVzU3Vic2VjdGlvblJlZiBmaW5hbCA6IHB1YmxpYyBEZWJ1Z1N1YnNlY3Rpb25SZWYgeworICBmcmllbmQgY2xhc3MgTGluZUNvbHVtbkV4dHJhY3RvcjsKKworICB1c2luZyBMaW5lSW5mb0FycmF5ID0gVmFyU3RyZWFtQXJyYXk8TGluZUNvbHVtbkVudHJ5LCBMaW5lQ29sdW1uRXh0cmFjdG9yPjsKKyAgdXNpbmcgSXRlcmF0b3IgPSBMaW5lSW5mb0FycmF5OjpJdGVyYXRvcjsKKworcHVibGljOgorICBEZWJ1Z0xpbmVzU3Vic2VjdGlvblJlZigpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVidWdTdWJzZWN0aW9uUmVmICpTKSB7CisgICAgcmV0dXJuIFMtPmtpbmQoKSA9PSBEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpMaW5lczsKKyAgfQorCisgIEVycm9yIGluaXRpYWxpemUoQmluYXJ5U3RyZWFtUmVhZGVyIFJlYWRlcik7CisKKyAgSXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBMaW5lc0FuZENvbHVtbnMuYmVnaW4oKTsgfQorICBJdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBMaW5lc0FuZENvbHVtbnMuZW5kKCk7IH0KKworICBjb25zdCBMaW5lRnJhZ21lbnRIZWFkZXIgKmhlYWRlcigpIGNvbnN0IHsgcmV0dXJuIEhlYWRlcjsgfQorCisgIGJvb2wgaGFzQ29sdW1uSW5mbygpIGNvbnN0OworCitwcml2YXRlOgorICBjb25zdCBMaW5lRnJhZ21lbnRIZWFkZXIgKkhlYWRlciA9IG51bGxwdHI7CisgIExpbmVJbmZvQXJyYXkgTGluZXNBbmRDb2x1bW5zOworfTsKKworY2xhc3MgRGVidWdMaW5lc1N1YnNlY3Rpb24gZmluYWwgOiBwdWJsaWMgRGVidWdTdWJzZWN0aW9uIHsKKyAgc3RydWN0IEJsb2NrIHsKKyAgICBCbG9jayh1aW50MzJfdCBDaGVja3N1bUJ1ZmZlck9mZnNldCkKKyAgICAgICAgOiBDaGVja3N1bUJ1ZmZlck9mZnNldChDaGVja3N1bUJ1ZmZlck9mZnNldCkge30KKworICAgIHVpbnQzMl90IENoZWNrc3VtQnVmZmVyT2Zmc2V0OworICAgIHN0ZDo6dmVjdG9yPExpbmVOdW1iZXJFbnRyeT4gTGluZXM7CisgICAgc3RkOjp2ZWN0b3I8Q29sdW1uTnVtYmVyRW50cnk+IENvbHVtbnM7CisgIH07CisKK3B1YmxpYzoKKyAgRGVidWdMaW5lc1N1YnNlY3Rpb24oRGVidWdDaGVja3N1bXNTdWJzZWN0aW9uICZDaGVja3N1bXMsCisgICAgICAgICAgICAgICAgICAgICAgIERlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uICZTdHJpbmdzKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlYnVnU3Vic2VjdGlvbiAqUykgeworICAgIHJldHVybiBTLT5raW5kKCkgPT0gRGVidWdTdWJzZWN0aW9uS2luZDo6TGluZXM7CisgIH0KKworICB2b2lkIGNyZWF0ZUJsb2NrKFN0cmluZ1JlZiBGaWxlTmFtZSk7CisgIHZvaWQgYWRkTGluZUluZm8odWludDMyX3QgT2Zmc2V0LCBjb25zdCBMaW5lSW5mbyAmTGluZSk7CisgIHZvaWQgYWRkTGluZUFuZENvbHVtbkluZm8odWludDMyX3QgT2Zmc2V0LCBjb25zdCBMaW5lSW5mbyAmTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDb2xTdGFydCwgdWludDMyX3QgQ29sRW5kKTsKKworICB1aW50MzJfdCBjYWxjdWxhdGVTZXJpYWxpemVkU2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworICBFcnJvciBjb21taXQoQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgc2V0UmVsb2NhdGlvbkFkZHJlc3ModWludDE2X3QgU2VnbWVudCwgdWludDMyX3QgT2Zmc2V0KTsKKyAgdm9pZCBzZXRDb2RlU2l6ZSh1aW50MzJfdCBTaXplKTsKKyAgdm9pZCBzZXRGbGFncyhMaW5lRmxhZ3MgRmxhZ3MpOworCisgIGJvb2wgaGFzQ29sdW1uSW5mbygpIGNvbnN0OworCitwcml2YXRlOgorICBEZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb24gJkNoZWNrc3VtczsKKyAgdWludDMyX3QgUmVsb2NPZmZzZXQgPSAwOworICB1aW50MTZfdCBSZWxvY1NlZ21lbnQgPSAwOworICB1aW50MzJfdCBDb2RlU2l6ZSA9IDA7CisgIExpbmVGbGFncyBGbGFncyA9IExGX05vbmU7CisgIHN0ZDo6dmVjdG9yPEJsb2NrPiBCbG9ja3M7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR0xJTkVTU1VCU0VDVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWJjOTYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb24uaApAQCAtMCwwICsxLDk3IEBACisvLz09PS0gRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb24uaCAtIENvZGVWaWV3IFN0cmluZyBUYWJsZSAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0RFQlVHU1RSSU5HVEFCTEVTVUJTRUNUSU9OX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdTVFJJTkdUQUJMRVNVQlNFQ1RJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJpbmFyeVN0cmVhbVJlYWRlcjsKKworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworLy8vIFJlcHJlc2VudHMgYSByZWFkLW9ubHkgdmlldyBvZiBhIENvZGVWaWV3IHN0cmluZyB0YWJsZS4gIFRoaXMgaXMgYSB2ZXJ5CisvLy8gc2ltcGxlIGZsYXQgYnVmZmVyIGNvbnNpc3Rpbmcgb2YgbnVsbC10ZXJtaW5hdGVkIHN0cmluZ3MsIHdoZXJlIHN0cmluZ3MKKy8vLyBhcmUgcmV0cmlldmVkIGJ5IHRoZWlyIG9mZnNldCBpbiB0aGUgYnVmZmVyLiAgRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb25SZWYKKy8vLyBkb2VzIG5vdCBvd24gdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBmb3IgdGhlIGJ1ZmZlci4KK2NsYXNzIERlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uUmVmIDogcHVibGljIERlYnVnU3Vic2VjdGlvblJlZiB7CitwdWJsaWM6CisgIERlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uUmVmKCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWJ1Z1N1YnNlY3Rpb25SZWYgKlMpIHsKKyAgICByZXR1cm4gUy0+a2luZCgpID09IERlYnVnU3Vic2VjdGlvbktpbmQ6OlN0cmluZ1RhYmxlOworICB9CisKKyAgRXJyb3IgaW5pdGlhbGl6ZShCaW5hcnlTdHJlYW1SZWYgQ29udGVudHMpOworICBFcnJvciBpbml0aWFsaXplKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyKTsKKworICBFeHBlY3RlZDxTdHJpbmdSZWY+IGdldFN0cmluZyh1aW50MzJfdCBPZmZzZXQpIGNvbnN0OworCisgIGJvb2wgdmFsaWQoKSBjb25zdCB7IHJldHVybiBTdHJlYW0udmFsaWQoKTsgfQorCisgIEJpbmFyeVN0cmVhbVJlZiBnZXRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBTdHJlYW07IH0KKworcHJpdmF0ZToKKyAgQmluYXJ5U3RyZWFtUmVmIFN0cmVhbTsKK307CisKKy8vLyBSZXByZXNlbnRzIGEgcmVhZC13cml0ZSB2aWV3IG9mIGEgQ29kZVZpZXcgc3RyaW5nIHRhYmxlLgorLy8vIERlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uIG93bnMgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBmb3IgdGhlIHRhYmxlLCBhbmQgaXMKKy8vLyBjYXBhYmxlIG9mIHNlcmlhbGl6aW5nIHRoZSBzdHJpbmcgdGFibGUgaW50byBhIGZvcm1hdCB1bmRlcnN0b29kIGJ5CisvLy8gRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb25SZWYuCitjbGFzcyBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvbiA6IHB1YmxpYyBEZWJ1Z1N1YnNlY3Rpb24geworcHVibGljOgorICBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvbigpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVidWdTdWJzZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPmtpbmQoKSA9PSBEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpTdHJpbmdUYWJsZTsKKyAgfQorCisgIC8vIElmIHN0cmluZyBTIGRvZXMgbm90IGV4aXN0IGluIHRoZSBzdHJpbmcgdGFibGUsIGluc2VydCBpdC4KKyAgLy8gUmV0dXJucyB0aGUgSUQgZm9yIFMuCisgIHVpbnQzMl90IGluc2VydChTdHJpbmdSZWYgUyk7CisKKyAgLy8gUmV0dXJuIHRoZSBJRCBmb3Igc3RyaW5nIFMuICBBc3N1bWVzIFMgZXhpc3RzIGluIHRoZSB0YWJsZS4KKyAgdWludDMyX3QgZ2V0SWRGb3JTdHJpbmcoU3RyaW5nUmVmIFMpIGNvbnN0OworCisgIFN0cmluZ1JlZiBnZXRTdHJpbmdGb3JJZCh1aW50MzJfdCBJZCkgY29uc3Q7CisKKyAgdWludDMyX3QgY2FsY3VsYXRlU2VyaWFsaXplZFNpemUoKSBjb25zdCBvdmVycmlkZTsKKyAgRXJyb3IgY29tbWl0KEJpbmFyeVN0cmVhbVdyaXRlciAmV3JpdGVyKSBjb25zdCBvdmVycmlkZTsKKworICB1aW50MzJfdCBzaXplKCkgY29uc3Q7CisKKyAgU3RyaW5nTWFwPHVpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIFN0cmluZ1RvSWQuYmVnaW4oKTsKKyAgfQorCisgIFN0cmluZ01hcDx1aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFN0cmluZ1RvSWQuZW5kKCk7IH0KKworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gc29ydGVkSWRzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIERlbnNlTWFwPHVpbnQzMl90LCBTdHJpbmdSZWY+IElkVG9TdHJpbmc7CisgIFN0cmluZ01hcDx1aW50MzJfdD4gU3RyaW5nVG9JZDsKKyAgdWludDMyX3QgU3RyaW5nU2l6ZSA9IDE7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0RFQlVHU1RSSU5HVEFCTEVTVUJTRUNUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdWJzZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyN2UwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvbi5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vPT09LSBEZWJ1Z1N1YnNlY3Rpb24uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19NT0RVTEVERUJVR0ZSQUdNRU5UX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfTU9EVUxFREVCVUdGUkFHTUVOVF9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1Xcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBEZWJ1Z1N1YnNlY3Rpb25SZWYgeworcHVibGljOgorICBleHBsaWNpdCBEZWJ1Z1N1YnNlY3Rpb25SZWYoRGVidWdTdWJzZWN0aW9uS2luZCBLaW5kKSA6IEtpbmQoS2luZCkge30KKyAgdmlydHVhbCB+RGVidWdTdWJzZWN0aW9uUmVmKCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWJ1Z1N1YnNlY3Rpb25SZWYgKlMpIHsgcmV0dXJuIHRydWU7IH0KKworICBEZWJ1Z1N1YnNlY3Rpb25LaW5kIGtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKK3Byb3RlY3RlZDoKKyAgRGVidWdTdWJzZWN0aW9uS2luZCBLaW5kOworfTsKKworY2xhc3MgRGVidWdTdWJzZWN0aW9uIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRGVidWdTdWJzZWN0aW9uKERlYnVnU3Vic2VjdGlvbktpbmQgS2luZCkgOiBLaW5kKEtpbmQpIHt9CisgIHZpcnR1YWwgfkRlYnVnU3Vic2VjdGlvbigpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVidWdTdWJzZWN0aW9uICpTKSB7IHJldHVybiB0cnVlOyB9CisKKyAgRGVidWdTdWJzZWN0aW9uS2luZCBraW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorCisgIHZpcnR1YWwgRXJyb3IgY29tbWl0KEJpbmFyeVN0cmVhbVdyaXRlciAmV3JpdGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgY2FsY3VsYXRlU2VyaWFsaXplZFNpemUoKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgRGVidWdTdWJzZWN0aW9uS2luZCBLaW5kOworfTsKKworfSAvLyBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX01PRFVMRURFQlVHRlJBR01FTlRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdWJzZWN0aW9uUmVjb3JkLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N1YnNlY3Rpb25SZWNvcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzBjZjBkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdWJzZWN0aW9uUmVjb3JkLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8vPT09LSBEZWJ1Z1N1YnNlY3Rpb25SZWNvcmQuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdTVUJTRUNUSU9OUkVDT1JEX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdTVUJTRUNUSU9OUkVDT1JEX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUFycmF5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJpbmFyeVN0cmVhbVdyaXRlcjsKKworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgRGVidWdTdWJzZWN0aW9uOworCisvLyBDb3JyZXNwb25kcyB0byB0aGUgYENWX0RlYnVnU1N1YnNlY3Rpb25IZWFkZXJfdGAgc3RydWN0dXJlLgorc3RydWN0IERlYnVnU3Vic2VjdGlvbkhlYWRlciB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEtpbmQ7ICAgLy8gY29kZXZpZXc6OkRlYnVnU3Vic2VjdGlvbktpbmQgZW51bQorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBMZW5ndGg7IC8vIG51bWJlciBvZiBieXRlcyBvY2N1cGllZCBieSB0aGlzIHJlY29yZC4KK307CisKK2NsYXNzIERlYnVnU3Vic2VjdGlvblJlY29yZCB7CitwdWJsaWM6CisgIERlYnVnU3Vic2VjdGlvblJlY29yZCgpOworICBEZWJ1Z1N1YnNlY3Rpb25SZWNvcmQoRGVidWdTdWJzZWN0aW9uS2luZCBLaW5kLCBCaW5hcnlTdHJlYW1SZWYgRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvZGVWaWV3Q29udGFpbmVyIENvbnRhaW5lcik7CisKKyAgc3RhdGljIEVycm9yIGluaXRpYWxpemUoQmluYXJ5U3RyZWFtUmVmIFN0cmVhbSwgRGVidWdTdWJzZWN0aW9uUmVjb3JkICZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlVmlld0NvbnRhaW5lciBDb250YWluZXIpOworCisgIHVpbnQzMl90IGdldFJlY29yZExlbmd0aCgpIGNvbnN0OworICBEZWJ1Z1N1YnNlY3Rpb25LaW5kIGtpbmQoKSBjb25zdDsKKyAgQmluYXJ5U3RyZWFtUmVmIGdldFJlY29yZERhdGEoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgQ29kZVZpZXdDb250YWluZXIgQ29udGFpbmVyID0gQ29kZVZpZXdDb250YWluZXI6Ok9iamVjdEZpbGU7CisgIERlYnVnU3Vic2VjdGlvbktpbmQgS2luZCA9IERlYnVnU3Vic2VjdGlvbktpbmQ6Ok5vbmU7CisgIEJpbmFyeVN0cmVhbVJlZiBEYXRhOworfTsKKworY2xhc3MgRGVidWdTdWJzZWN0aW9uUmVjb3JkQnVpbGRlciB7CitwdWJsaWM6CisgIERlYnVnU3Vic2VjdGlvblJlY29yZEJ1aWxkZXIoc3RkOjpzaGFyZWRfcHRyPERlYnVnU3Vic2VjdGlvbj4gU3Vic2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlVmlld0NvbnRhaW5lciBDb250YWluZXIpOworCisgIC8vLyBVc2UgdGhpcyB0byBjb3B5IGV4aXN0aW5nIHN1YnNlY3Rpb25zIGRpcmVjdGx5IGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uLgorICAvLy8gRm9yIGV4YW1wbGUsIGxpbmUgdGFibGUgc3Vic2VjdGlvbnMgaW4gYW4gb2JqZWN0IGZpbGUgb25seSBuZWVkIHRvIGJlCisgIC8vLyByZWxvY2F0ZWQgYmVmb3JlIGJlaW5nIGNvcGllZCBpbnRvIHRoZSBQREIuCisgIERlYnVnU3Vic2VjdGlvblJlY29yZEJ1aWxkZXIoY29uc3QgRGVidWdTdWJzZWN0aW9uUmVjb3JkICZDb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlVmlld0NvbnRhaW5lciBDb250YWluZXIpOworCisgIHVpbnQzMl90IGNhbGN1bGF0ZVNlcmlhbGl6ZWRMZW5ndGgoKTsKKyAgRXJyb3IgY29tbWl0KEJpbmFyeVN0cmVhbVdyaXRlciAmV3JpdGVyKSBjb25zdDsKKworcHJpdmF0ZToKKyAgLy8vIFRoZSBzdWJzZWN0aW9uIHRvIGJ1aWxkLiBXaWxsIGJlIG51bGwgaWYgQ29udGVudHMgaXMgbm9uLWVtcHR5LgorICBzdGQ6OnNoYXJlZF9wdHI8RGVidWdTdWJzZWN0aW9uPiBTdWJzZWN0aW9uOworCisgIC8vLyBUaGUgYnl0ZXMgb2YgdGhlIHN1YnNlY3Rpb24uIE9ubHkgbm9uLWVtcHR5IGlmIFN1YnNlY3Rpb24gaXMgbnVsbC4KKyAgRGVidWdTdWJzZWN0aW9uUmVjb3JkIENvbnRlbnRzOworCisgIENvZGVWaWV3Q29udGFpbmVyIENvbnRhaW5lcjsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVmFyU3RyZWFtQXJyYXlFeHRyYWN0b3I8Y29kZXZpZXc6OkRlYnVnU3Vic2VjdGlvblJlY29yZD4geworICBFcnJvciBvcGVyYXRvcigpKEJpbmFyeVN0cmVhbVJlZiBTdHJlYW0sIHVpbnQzMl90ICZMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgY29kZXZpZXc6OkRlYnVnU3Vic2VjdGlvblJlY29yZCAmSW5mbykgeworICAgIC8vIEZJWE1FOiBXZSBuZWVkIHRvIHBhc3MgdGhlIGNvbnRhaW5lciB0eXBlIHRocm91Z2ggdG8gdGhpcyBmdW5jdGlvbi4gIEluCisgICAgLy8gcHJhY3RpY2UgdGhpcyBpc24ndCBzdXBlciBpbXBvcnRhbnQgc2luY2UgdGhlIHN1YnNlY3Rpb24gaGVhZGVyIGRlc2NyaWJlcworICAgIC8vIGl0cyBsZW5ndGggYW5kIHdlIGNhbiBqdXN0IHNraXAgaXQuICBJdCdzIG1vcmUgaW1wb3J0YW50IHdoZW4gd3JpdGluZy4KKyAgICBpZiAoYXV0byBFQyA9IGNvZGV2aWV3OjpEZWJ1Z1N1YnNlY3Rpb25SZWNvcmQ6OmluaXRpYWxpemUoCisgICAgICAgICAgICBTdHJlYW0sIEluZm8sIGNvZGV2aWV3OjpDb2RlVmlld0NvbnRhaW5lcjo6UGRiKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICBMZW5ndGggPSBhbGlnblRvKEluZm8uZ2V0UmVjb3JkTGVuZ3RoKCksIDQpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9Cit9OworCituYW1lc3BhY2UgY29kZXZpZXcgeworCit1c2luZyBEZWJ1Z1N1YnNlY3Rpb25BcnJheSA9IFZhclN0cmVhbUFycmF5PERlYnVnU3Vic2VjdGlvblJlY29yZD47CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdTVUJTRUNUSU9OUkVDT1JEX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvblZpc2l0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvblZpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWY3NDlkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdWJzZWN0aW9uVmlzaXRvci5oCkBAIC0wLDAgKzEsMTE0IEBACisvLz09PS0gRGVidWdTdWJzZWN0aW9uVmlzaXRvci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfTU9EVUxFREVCVUdGUkFHTUVOVFZJU0lUT1JfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19NT0RVTEVERUJVR0ZSQUdNRU5UVklTSVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvblJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N0cmluZ3NBbmRDaGVja3N1bXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIERlYnVnQ2hlY2tzdW1zU3Vic2VjdGlvblJlZjsKK2NsYXNzIERlYnVnU3Vic2VjdGlvblJlY29yZDsKK2NsYXNzIERlYnVnSW5saW5lZUxpbmVzU3Vic2VjdGlvblJlZjsKK2NsYXNzIERlYnVnQ3Jvc3NNb2R1bGVFeHBvcnRzU3Vic2VjdGlvblJlZjsKK2NsYXNzIERlYnVnQ3Jvc3NNb2R1bGVJbXBvcnRzU3Vic2VjdGlvblJlZjsKK2NsYXNzIERlYnVnRnJhbWVEYXRhU3Vic2VjdGlvblJlZjsKK2NsYXNzIERlYnVnTGluZXNTdWJzZWN0aW9uUmVmOworY2xhc3MgRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb25SZWY7CitjbGFzcyBEZWJ1Z1N5bWJvbFJWQVN1YnNlY3Rpb25SZWY7CitjbGFzcyBEZWJ1Z1N5bWJvbHNTdWJzZWN0aW9uUmVmOworY2xhc3MgRGVidWdVbmtub3duU3Vic2VjdGlvblJlZjsKK2NsYXNzIFN0cmluZ3NBbmRDaGVja3N1bXNSZWY7CisKK2NsYXNzIERlYnVnU3Vic2VjdGlvblZpc2l0b3IgeworcHVibGljOgorICB2aXJ0dWFsIH5EZWJ1Z1N1YnNlY3Rpb25WaXNpdG9yKCkgPSBkZWZhdWx0OworCisgIHZpcnR1YWwgRXJyb3IgdmlzaXRVbmtub3duKERlYnVnVW5rbm93blN1YnNlY3Rpb25SZWYgJlVua25vd24pIHsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorICB2aXJ0dWFsIEVycm9yIHZpc2l0TGluZXMoRGVidWdMaW5lc1N1YnNlY3Rpb25SZWYgJkxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nc0FuZENoZWNrc3Vtc1JlZiAmU3RhdGUpID0gMDsKKyAgdmlydHVhbCBFcnJvciB2aXNpdEZpbGVDaGVja3N1bXMoRGVidWdDaGVja3N1bXNTdWJzZWN0aW9uUmVmICZDaGVja3N1bXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ3NBbmRDaGVja3N1bXNSZWYgJlN0YXRlKSA9IDA7CisgIHZpcnR1YWwgRXJyb3IgdmlzaXRJbmxpbmVlTGluZXMoRGVidWdJbmxpbmVlTGluZXNTdWJzZWN0aW9uUmVmICZJbmxpbmVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdzQW5kQ2hlY2tzdW1zUmVmICZTdGF0ZSkgPSAwOworICB2aXJ0dWFsIEVycm9yCisgIHZpc2l0Q3Jvc3NNb2R1bGVFeHBvcnRzKERlYnVnQ3Jvc3NNb2R1bGVFeHBvcnRzU3Vic2VjdGlvblJlZiAmQ1NFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdzQW5kQ2hlY2tzdW1zUmVmICZTdGF0ZSkgPSAwOworICB2aXJ0dWFsIEVycm9yCisgIHZpc2l0Q3Jvc3NNb2R1bGVJbXBvcnRzKERlYnVnQ3Jvc3NNb2R1bGVJbXBvcnRzU3Vic2VjdGlvblJlZiAmQ1NFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdzQW5kQ2hlY2tzdW1zUmVmICZTdGF0ZSkgPSAwOworCisgIHZpcnR1YWwgRXJyb3IgdmlzaXRTdHJpbmdUYWJsZShEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvblJlZiAmU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdzQW5kQ2hlY2tzdW1zUmVmICZTdGF0ZSkgPSAwOworCisgIHZpcnR1YWwgRXJyb3IgdmlzaXRTeW1ib2xzKERlYnVnU3ltYm9sc1N1YnNlY3Rpb25SZWYgJkNTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nc0FuZENoZWNrc3Vtc1JlZiAmU3RhdGUpID0gMDsKKworICB2aXJ0dWFsIEVycm9yIHZpc2l0RnJhbWVEYXRhKERlYnVnRnJhbWVEYXRhU3Vic2VjdGlvblJlZiAmRkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nc0FuZENoZWNrc3Vtc1JlZiAmU3RhdGUpID0gMDsKKyAgdmlydHVhbCBFcnJvciB2aXNpdENPRkZTeW1ib2xSVkFzKERlYnVnU3ltYm9sUlZBU3Vic2VjdGlvblJlZiAmUlZBcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ3NBbmRDaGVja3N1bXNSZWYgJlN0YXRlKSA9IDA7Cit9OworCitFcnJvciB2aXNpdERlYnVnU3Vic2VjdGlvbihjb25zdCBEZWJ1Z1N1YnNlY3Rpb25SZWNvcmQgJlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z1N1YnNlY3Rpb25WaXNpdG9yICZWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nc0FuZENoZWNrc3Vtc1JlZiAmU3RhdGUpOworCituYW1lc3BhY2UgZGV0YWlsIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorRXJyb3IgdmlzaXREZWJ1Z1N1YnNlY3Rpb25zKFQgJiZGcmFnbWVudFJhbmdlLCBEZWJ1Z1N1YnNlY3Rpb25WaXNpdG9yICZWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ3NBbmRDaGVja3N1bXNSZWYgJlN0YXRlKSB7CisgIFN0YXRlLmluaXRpYWxpemUoc3RkOjpmb3J3YXJkPFQ+KEZyYWdtZW50UmFuZ2UpKTsKKworICBmb3IgKGNvbnN0IERlYnVnU3Vic2VjdGlvblJlY29yZCAmTCA6IEZyYWdtZW50UmFuZ2UpIHsKKyAgICBpZiAoYXV0byBFQyA9IHZpc2l0RGVidWdTdWJzZWN0aW9uKEwsIFYsIFN0YXRlKSkKKyAgICAgIHJldHVybiBFQzsKKyAgfQorICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKK30KK30gLy8gbmFtZXNwYWNlIGRldGFpbAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK0Vycm9yIHZpc2l0RGVidWdTdWJzZWN0aW9ucyhUICYmRnJhZ21lbnRSYW5nZSwgRGVidWdTdWJzZWN0aW9uVmlzaXRvciAmVikgeworICBTdHJpbmdzQW5kQ2hlY2tzdW1zUmVmIFN0YXRlOworICByZXR1cm4gZGV0YWlsOjp2aXNpdERlYnVnU3Vic2VjdGlvbnMoc3RkOjpmb3J3YXJkPFQ+KEZyYWdtZW50UmFuZ2UpLCBWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK0Vycm9yIHZpc2l0RGVidWdTdWJzZWN0aW9ucyhUICYmRnJhZ21lbnRSYW5nZSwgRGVidWdTdWJzZWN0aW9uVmlzaXRvciAmViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvblJlZiAmU3RyaW5ncykgeworICBTdHJpbmdzQW5kQ2hlY2tzdW1zUmVmIFN0YXRlKFN0cmluZ3MpOworICByZXR1cm4gZGV0YWlsOjp2aXNpdERlYnVnU3Vic2VjdGlvbnMoc3RkOjpmb3J3YXJkPFQ+KEZyYWdtZW50UmFuZ2UpLCBWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK0Vycm9yIHZpc2l0RGVidWdTdWJzZWN0aW9ucyhUICYmRnJhZ21lbnRSYW5nZSwgRGVidWdTdWJzZWN0aW9uVmlzaXRvciAmViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvblJlZiAmU3RyaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb25SZWYgJkNoZWNrc3VtcykgeworICBTdHJpbmdzQW5kQ2hlY2tzdW1zUmVmIFN0YXRlKFN0cmluZ3MsIENoZWNrc3Vtcyk7CisgIHJldHVybiBkZXRhaWw6OnZpc2l0RGVidWdTdWJzZWN0aW9ucyhzdGQ6OmZvcndhcmQ8VD4oRnJhZ21lbnRSYW5nZSksIFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfTU9EVUxFREVCVUdGUkFHTUVOVFZJU0lUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTeW1ib2xSVkFTdWJzZWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N5bWJvbFJWQVN1YnNlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGMwNGI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTeW1ib2xSVkFTdWJzZWN0aW9uLmgKQEAgLTAsMCArMSw2NyBAQAorLy89PT0tIERlYnVnU3ltYm9sUlZBU3Vic2VjdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR1NZTUJPTFJWQVNVQlNFQ1RJT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR1NZTUJPTFJWQVNVQlNFQ1RJT05fSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N1YnNlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtQXJyYXkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmluYXJ5U3RyZWFtUmVhZGVyOworCituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBEZWJ1Z1N5bWJvbFJWQVN1YnNlY3Rpb25SZWYgZmluYWwgOiBwdWJsaWMgRGVidWdTdWJzZWN0aW9uUmVmIHsKK3B1YmxpYzoKKyAgdXNpbmcgQXJyYXlUeXBlID0gRml4ZWRTdHJlYW1BcnJheTxzdXBwb3J0Ojp1bGl0dGxlMzJfdD47CisKKyAgRGVidWdTeW1ib2xSVkFTdWJzZWN0aW9uUmVmKCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWJ1Z1N1YnNlY3Rpb25SZWYgKlMpIHsKKyAgICByZXR1cm4gUy0+a2luZCgpID09IERlYnVnU3Vic2VjdGlvbktpbmQ6OkNvZmZTeW1ib2xSVkE7CisgIH0KKworICBBcnJheVR5cGU6Okl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gUlZBcy5iZWdpbigpOyB9CisgIEFycmF5VHlwZTo6SXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gUlZBcy5lbmQoKTsgfQorCisgIEVycm9yIGluaXRpYWxpemUoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIpOworCitwcml2YXRlOgorICBBcnJheVR5cGUgUlZBczsKK307CisKK2NsYXNzIERlYnVnU3ltYm9sUlZBU3Vic2VjdGlvbiBmaW5hbCA6IHB1YmxpYyBEZWJ1Z1N1YnNlY3Rpb24geworcHVibGljOgorICBEZWJ1Z1N5bWJvbFJWQVN1YnNlY3Rpb24oKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlYnVnU3Vic2VjdGlvbiAqUykgeworICAgIHJldHVybiBTLT5raW5kKCkgPT0gRGVidWdTdWJzZWN0aW9uS2luZDo6Q29mZlN5bWJvbFJWQTsKKyAgfQorCisgIEVycm9yIGNvbW1pdChCaW5hcnlTdHJlYW1Xcml0ZXIgJldyaXRlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGNhbGN1bGF0ZVNlcmlhbGl6ZWRTaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBhZGRSVkEodWludDMyX3QgUlZBKSB7IFJWQXMucHVzaF9iYWNrKHN1cHBvcnQ6OnVsaXR0bGUzMl90KFJWQSkpOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPHN1cHBvcnQ6OnVsaXR0bGUzMl90PiBSVkFzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR1NZTUJPTFJWQVNVQlNFQ1RJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTeW1ib2xzU3Vic2VjdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTeW1ib2xzU3Vic2VjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZGE3ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N5bWJvbHNTdWJzZWN0aW9uLmgKQEAgLTAsMCArMSw1NiBAQAorLy89PT0tIERlYnVnU3ltYm9sc1N1YnNlY3Rpb24uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0RFQlVHU1lNQk9MU1NVQlNFQ1RJT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR1NZTUJPTFNTVUJTRUNUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworY2xhc3MgRGVidWdTeW1ib2xzU3Vic2VjdGlvblJlZiBmaW5hbCA6IHB1YmxpYyBEZWJ1Z1N1YnNlY3Rpb25SZWYgeworcHVibGljOgorICBEZWJ1Z1N5bWJvbHNTdWJzZWN0aW9uUmVmKCkKKyAgICAgIDogRGVidWdTdWJzZWN0aW9uUmVmKERlYnVnU3Vic2VjdGlvbktpbmQ6OlN5bWJvbHMpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWJ1Z1N1YnNlY3Rpb25SZWYgKlMpIHsKKyAgICByZXR1cm4gUy0+a2luZCgpID09IERlYnVnU3Vic2VjdGlvbktpbmQ6OlN5bWJvbHM7CisgIH0KKworICBFcnJvciBpbml0aWFsaXplKEJpbmFyeVN0cmVhbVJlYWRlciBSZWFkZXIpOworCisgIENWU3ltYm9sQXJyYXk6Okl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gUmVjb3Jkcy5iZWdpbigpOyB9CisgIENWU3ltYm9sQXJyYXk6Okl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFJlY29yZHMuZW5kKCk7IH0KKworcHJpdmF0ZToKKyAgQ1ZTeW1ib2xBcnJheSBSZWNvcmRzOworfTsKKworY2xhc3MgRGVidWdTeW1ib2xzU3Vic2VjdGlvbiBmaW5hbCA6IHB1YmxpYyBEZWJ1Z1N1YnNlY3Rpb24geworcHVibGljOgorICBEZWJ1Z1N5bWJvbHNTdWJzZWN0aW9uKCkgOiBEZWJ1Z1N1YnNlY3Rpb24oRGVidWdTdWJzZWN0aW9uS2luZDo6U3ltYm9scykge30KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWJ1Z1N1YnNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+a2luZCgpID09IERlYnVnU3Vic2VjdGlvbktpbmQ6OlN5bWJvbHM7CisgIH0KKworICB1aW50MzJfdCBjYWxjdWxhdGVTZXJpYWxpemVkU2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworICBFcnJvciBjb21taXQoQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgYWRkU3ltYm9sKENWU3ltYm9sIFN5bWJvbCk7CisKK3ByaXZhdGU6CisgIHVpbnQzMl90IExlbmd0aCA9IDA7CisgIHN0ZDo6dmVjdG9yPENWU3ltYm9sPiBSZWNvcmRzOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1Vua25vd25TdWJzZWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1Vua25vd25TdWJzZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE5YTk2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnVW5rbm93blN1YnNlY3Rpb24uaApAQCAtMCwwICsxLDMyIEBACisvLz09PS0gRGVidWdVbmtub3duU3Vic2VjdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfTU9EVUxFREVCVUdVTktOT1dORlJBR01FTlRfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19NT0RVTEVERUJVR1VOS05PV05GUkFHTUVOVF9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N1YnNlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVmLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIERlYnVnVW5rbm93blN1YnNlY3Rpb25SZWYgZmluYWwgOiBwdWJsaWMgRGVidWdTdWJzZWN0aW9uUmVmIHsKK3B1YmxpYzoKKyAgRGVidWdVbmtub3duU3Vic2VjdGlvblJlZihEZWJ1Z1N1YnNlY3Rpb25LaW5kIEtpbmQsIEJpbmFyeVN0cmVhbVJlZiBEYXRhKQorICAgICAgOiBEZWJ1Z1N1YnNlY3Rpb25SZWYoS2luZCksIERhdGEoRGF0YSkge30KKworICBCaW5hcnlTdHJlYW1SZWYgZ2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuIERhdGE7IH0KKworcHJpdmF0ZToKKyAgQmluYXJ5U3RyZWFtUmVmIERhdGE7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0VudW1UYWJsZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0VudW1UYWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTBmMGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRW51bVRhYmxlcy5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vPT09LSBFbnVtVGFibGVzLmggLSBFbnVtIHRvIHN0cmluZyBjb252ZXJzaW9uIHRhYmxlcyAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfRU5VTVRBQkxFU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0VOVU1UQUJMRVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9DT0ZGLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU2NvcGVkUHJpbnRlci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK0FycmF5UmVmPEVudW1FbnRyeTxTeW1ib2xLaW5kPj4gZ2V0U3ltYm9sVHlwZU5hbWVzKCk7CitBcnJheVJlZjxFbnVtRW50cnk8VHlwZUxlYWZLaW5kPj4gZ2V0VHlwZUxlYWZOYW1lcygpOworQXJyYXlSZWY8RW51bUVudHJ5PHVpbnQxNl90Pj4gZ2V0UmVnaXN0ZXJOYW1lcygpOworQXJyYXlSZWY8RW51bUVudHJ5PHVpbnQzMl90Pj4gZ2V0UHVibGljU3ltRmxhZ05hbWVzKCk7CitBcnJheVJlZjxFbnVtRW50cnk8dWludDhfdD4+IGdldFByb2NTeW1GbGFnTmFtZXMoKTsKK0FycmF5UmVmPEVudW1FbnRyeTx1aW50MTZfdD4+IGdldExvY2FsRmxhZ05hbWVzKCk7CitBcnJheVJlZjxFbnVtRW50cnk8dWludDhfdD4+IGdldEZyYW1lQ29va2llS2luZE5hbWVzKCk7CitBcnJheVJlZjxFbnVtRW50cnk8U291cmNlTGFuZ3VhZ2U+PiBnZXRTb3VyY2VMYW5ndWFnZU5hbWVzKCk7CitBcnJheVJlZjxFbnVtRW50cnk8dWludDMyX3Q+PiBnZXRDb21waWxlU3ltMkZsYWdOYW1lcygpOworQXJyYXlSZWY8RW51bUVudHJ5PHVpbnQzMl90Pj4gZ2V0Q29tcGlsZVN5bTNGbGFnTmFtZXMoKTsKK0FycmF5UmVmPEVudW1FbnRyeTx1aW50MzJfdD4+IGdldEZpbGVDaGVja3N1bU5hbWVzKCk7CitBcnJheVJlZjxFbnVtRW50cnk8dW5zaWduZWQ+PiBnZXRDUFVUeXBlTmFtZXMoKTsKK0FycmF5UmVmPEVudW1FbnRyeTx1aW50MzJfdD4+IGdldEZyYW1lUHJvY1N5bUZsYWdOYW1lcygpOworQXJyYXlSZWY8RW51bUVudHJ5PHVpbnQxNl90Pj4gZ2V0RXhwb3J0U3ltRmxhZ05hbWVzKCk7CitBcnJheVJlZjxFbnVtRW50cnk8dWludDMyX3Q+PiBnZXRNb2R1bGVTdWJzdHJlYW1LaW5kTmFtZXMoKTsKK0FycmF5UmVmPEVudW1FbnRyeTx1aW50OF90Pj4gZ2V0VGh1bmtPcmRpbmFsTmFtZXMoKTsKK0FycmF5UmVmPEVudW1FbnRyeTx1aW50MTZfdD4+IGdldFRyYW1wb2xpbmVOYW1lcygpOworQXJyYXlSZWY8RW51bUVudHJ5PENPRkY6OlNlY3Rpb25DaGFyYWN0ZXJpc3RpY3M+PgorZ2V0SW1hZ2VTZWN0aW9uQ2hhcmFjdGVyaXN0aWNOYW1lcygpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19FTlVNVEFCTEVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0Zvcm1hdHRlcnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0Zvcm1hdHRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzhhZDAyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRm9ybWF0dGVycy5oCkBAIC0wLDAgKzEsNzMgQEAKKy8vPT09LSBGb3JtYXR0ZXJzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfRk9STUFUVEVSU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0ZPUk1BVFRFUlNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9HVUlELmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUluZGV4LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdEFkYXB0ZXJzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdFZhcmlhZGljLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgY29kZXZpZXcgeworCituYW1lc3BhY2UgZGV0YWlsIHsKKworY2xhc3MgR3VpZEFkYXB0ZXIgZmluYWwgOiBwdWJsaWMgRm9ybWF0QWRhcHRlcjxBcnJheVJlZjx1aW50OF90Pj4geworICBBcnJheVJlZjx1aW50OF90PiBHdWlkOworCitwdWJsaWM6CisgIGV4cGxpY2l0IEd1aWRBZGFwdGVyKEFycmF5UmVmPHVpbnQ4X3Q+IEd1aWQpOworICBleHBsaWNpdCBHdWlkQWRhcHRlcihTdHJpbmdSZWYgR3VpZCk7CisKKyAgdm9pZCBmb3JtYXQocmF3X29zdHJlYW0gJlN0cmVhbSwgU3RyaW5nUmVmIFN0eWxlKSBvdmVycmlkZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKworaW5saW5lIGRldGFpbDo6R3VpZEFkYXB0ZXIgZm10X2d1aWQoU3RyaW5nUmVmIEl0ZW0pIHsKKyAgcmV0dXJuIGRldGFpbDo6R3VpZEFkYXB0ZXIoSXRlbSk7Cit9CisKK2lubGluZSBkZXRhaWw6Okd1aWRBZGFwdGVyIGZtdF9ndWlkKEFycmF5UmVmPHVpbnQ4X3Q+IEl0ZW0pIHsKKyAgcmV0dXJuIGRldGFpbDo6R3VpZEFkYXB0ZXIoSXRlbSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgZm9ybWF0X3Byb3ZpZGVyPGNvZGV2aWV3OjpUeXBlSW5kZXg+IHsKK3B1YmxpYzoKKyAgc3RhdGljIHZvaWQgZm9ybWF0KGNvbnN0IGNvZGV2aWV3OjpUeXBlSW5kZXggJlYsIHJhd19vc3RyZWFtICZTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU3R5bGUpIHsKKyAgICBpZiAoVi5pc05vbmVUeXBlKCkpCisgICAgICBTdHJlYW0gPDwgIjxubyB0eXBlPiI7CisgICAgZWxzZSB7CisgICAgICBTdHJlYW0gPDwgZm9ybWF0digiezA6WCs0fSIsIFYuZ2V0SW5kZXgoKSk7CisgICAgICBpZiAoVi5pc1NpbXBsZSgpKQorICAgICAgICBTdHJlYW0gPDwgIiAoIiA8PCBjb2Rldmlldzo6VHlwZUluZGV4OjpzaW1wbGVUeXBlTmFtZShWKSA8PCAiKSI7CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgZm9ybWF0X3Byb3ZpZGVyPGNvZGV2aWV3OjpHVUlEPiB7CisgIHN0YXRpYyB2b2lkIGZvcm1hdChjb25zdCBjb2Rldmlldzo6R1VJRCAmViwgbGx2bTo6cmF3X29zdHJlYW0gJlN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTdHlsZSkgeworICAgIFN0cmVhbSA8PCBWOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfRk9STUFUVEVSU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9GdW5jdGlvbklkLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9GdW5jdGlvbklkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmM2RhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0Z1bmN0aW9uSWQuaApAQCAtMCwwICsxLDU2IEBACisvLz09PS0gRnVuY3Rpb25JZC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0ZVTkNUSU9OSURfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19GVU5DVElPTklEX0gKKworI2luY2x1ZGUgPGNpbnR0eXBlcz4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgRnVuY3Rpb25JZCB7CitwdWJsaWM6CisgIEZ1bmN0aW9uSWQoKSA6IEluZGV4KDApIHt9CisKKyAgZXhwbGljaXQgRnVuY3Rpb25JZCh1aW50MzJfdCBJbmRleCkgOiBJbmRleChJbmRleCkge30KKworICB1aW50MzJfdCBnZXRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIEluZGV4OyB9CisKK3ByaXZhdGU6CisgIHVpbnQzMl90IEluZGV4OworfTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGdW5jdGlvbklkICZBLCBjb25zdCBGdW5jdGlvbklkICZCKSB7CisgIHJldHVybiBBLmdldEluZGV4KCkgPT0gQi5nZXRJbmRleCgpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZ1bmN0aW9uSWQgJkEsIGNvbnN0IEZ1bmN0aW9uSWQgJkIpIHsKKyAgcmV0dXJuIEEuZ2V0SW5kZXgoKSAhPSBCLmdldEluZGV4KCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBGdW5jdGlvbklkICZBLCBjb25zdCBGdW5jdGlvbklkICZCKSB7CisgIHJldHVybiBBLmdldEluZGV4KCkgPCBCLmdldEluZGV4KCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRnVuY3Rpb25JZCAmQSwgY29uc3QgRnVuY3Rpb25JZCAmQikgeworICByZXR1cm4gQS5nZXRJbmRleCgpIDw9IEIuZ2V0SW5kZXgoKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEZ1bmN0aW9uSWQgJkEsIGNvbnN0IEZ1bmN0aW9uSWQgJkIpIHsKKyAgcmV0dXJuIEEuZ2V0SW5kZXgoKSA+IEIuZ2V0SW5kZXgoKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBGdW5jdGlvbklkICZBLCBjb25zdCBGdW5jdGlvbklkICZCKSB7CisgIHJldHVybiBBLmdldEluZGV4KCkgPj0gQi5nZXRJbmRleCgpOworfQorfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0dVSUQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0dVSUQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDU1Y2U5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvR1VJRC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vPT09LSBHVUlELmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfR1VJRF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0dVSURfSAorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworLy8vIFRoaXMgcmVwcmVzZW50cyB0aGUgJ0dVSUQnIHR5cGUgZnJvbSB3aW5kb3dzLmguCitzdHJ1Y3QgR1VJRCB7CisgIHVpbnQ4X3QgR3VpZFsxNl07Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEdVSUQgJkxIUywgY29uc3QgR1VJRCAmUkhTKSB7CisgIHJldHVybiAwID09IDo6bWVtY21wKExIUy5HdWlkLCBSSFMuR3VpZCwgc2l6ZW9mKExIUy5HdWlkKSk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBHVUlEICZMSFMsIGNvbnN0IEdVSUQgJlJIUykgeworICByZXR1cm4gOjptZW1jbXAoTEhTLkd1aWQsIFJIUy5HdWlkLCBzaXplb2YoTEhTLkd1aWQpKSA8IDA7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgR1VJRCAmTEhTLCBjb25zdCBHVUlEICZSSFMpIHsKKyAgcmV0dXJuIDo6bWVtY21wKExIUy5HdWlkLCBSSFMuR3VpZCwgc2l6ZW9mKExIUy5HdWlkKSkgPD0gMDsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEdVSUQgJkxIUywgY29uc3QgR1VJRCAmUkhTKSB7CisgIHJldHVybiAhKExIUyA8PSBSSFMpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEdVSUQgJkxIUywgY29uc3QgR1VJRCAmUkhTKSB7CisgIHJldHVybiAhKExIUyA8IFJIUyk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgR1VJRCAmTEhTLCBjb25zdCBHVUlEICZSSFMpIHsKKyAgcmV0dXJuICEoTEhTID09IFJIUyk7Cit9CisKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgR1VJRCAmR3VpZCk7CisKK30gLy8gbmFtZXNwYWNlIGNvZGV2aWV3Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvR2xvYmFsVHlwZVRhYmxlQnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvR2xvYmFsVHlwZVRhYmxlQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NzA0MTYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9HbG9iYWxUeXBlVGFibGVCdWlsZGVyLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8vPT09LSBHbG9iYWxUeXBlVGFibGVCdWlsZGVyLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKy0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfR0xPQkFMVFlQRVRBQkxFQlVJTERFUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0dMT0JBTFRZUEVUQUJMRUJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TaW1wbGVUeXBlU2VyaWFsaXplci5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUhhc2hpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIENvbnRpbnVhdGlvblJlY29yZEJ1aWxkZXI7CisKK2NsYXNzIEdsb2JhbFR5cGVUYWJsZUJ1aWxkZXIgOiBwdWJsaWMgVHlwZUNvbGxlY3Rpb24geworICAvLy8gU3RvcmFnZSBmb3IgcmVjb3Jkcy4gIFRoZXNlIG5lZWQgdG8gb3V0bGl2ZSB0aGUgVHlwZVRhYmxlQnVpbGRlci4KKyAgQnVtcFB0ckFsbG9jYXRvciAmUmVjb3JkU3RvcmFnZTsKKworICAvLy8gQSBzZXJpYWxpemVyIHRoYXQgY2FuIHdyaXRlIG5vbi1jb250aW51YXRpb24gbGVhZiB0eXBlcy4gIE9ubHkgdXNlZCBhcworICAvLy8gYSBjb252ZW5pZW5jZSBmdW5jdGlvbiBzbyB0aGF0IHdlIGNhbiBwcm92aWRlIGFuIGludGVyZmFjZSBtZXRob2QgdG8KKyAgLy8vIHdyaXRlIGFuIHVuc2VyaWFsaXplZCByZWNvcmQuCisgIFNpbXBsZVR5cGVTZXJpYWxpemVyIFNpbXBsZVNlcmlhbGl6ZXI7CisKKyAgLy8vIEhhc2ggdGFibGUuCisgIERlbnNlTWFwPEdsb2JhbGx5SGFzaGVkVHlwZSwgVHlwZUluZGV4PiBIYXNoZWRSZWNvcmRzOworCisgIC8vLyBDb250YWlucyBhIGxpc3Qgb2YgYWxsIHJlY29yZHMgaW5kZXhlZCBieSBUeXBlSW5kZXgudG9BcnJheUluZGV4KCkuCisgIFNtYWxsVmVjdG9yPEFycmF5UmVmPHVpbnQ4X3Q+LCAyPiBTZWVuUmVjb3JkczsKKworICAvLy8gQ29udGFpbnMgYSBsaXN0IG9mIGFsbCBoYXNoIHZhbHVlcyBpbmV4ZWQgYnkgVHlwZUluZGV4LnRvQXJyYXlJbmRleCgpLgorICBTbWFsbFZlY3RvcjxHbG9iYWxseUhhc2hlZFR5cGUsIDI+IFNlZW5IYXNoZXM7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgR2xvYmFsVHlwZVRhYmxlQnVpbGRlcihCdW1wUHRyQWxsb2NhdG9yICZTdG9yYWdlKTsKKyAgfkdsb2JhbFR5cGVUYWJsZUJ1aWxkZXIoKTsKKworICAvLyBUeXBlVGFibGVDb2xsZWN0aW9uIG92ZXJyaWRlcworICBPcHRpb25hbDxUeXBlSW5kZXg+IGdldEZpcnN0KCkgb3ZlcnJpZGU7CisgIE9wdGlvbmFsPFR5cGVJbmRleD4gZ2V0TmV4dChUeXBlSW5kZXggUHJldikgb3ZlcnJpZGU7CisgIENWVHlwZSBnZXRUeXBlKFR5cGVJbmRleCBJbmRleCkgb3ZlcnJpZGU7CisgIFN0cmluZ1JlZiBnZXRUeXBlTmFtZShUeXBlSW5kZXggSW5kZXgpIG92ZXJyaWRlOworICBib29sIGNvbnRhaW5zKFR5cGVJbmRleCBJbmRleCkgb3ZlcnJpZGU7CisgIHVpbnQzMl90IHNpemUoKSBvdmVycmlkZTsKKyAgdWludDMyX3QgY2FwYWNpdHkoKSBvdmVycmlkZTsKKworICAvLyBwdWJsaWMgaW50ZXJmYWNlCisgIHZvaWQgcmVzZXQoKTsKKyAgVHlwZUluZGV4IG5leHRUeXBlSW5kZXgoKSBjb25zdDsKKworICBCdW1wUHRyQWxsb2NhdG9yICZnZXRBbGxvY2F0b3IoKSB7IHJldHVybiBSZWNvcmRTdG9yYWdlOyB9CisKKyAgQXJyYXlSZWY8QXJyYXlSZWY8dWludDhfdD4+IHJlY29yZHMoKSBjb25zdDsKKyAgQXJyYXlSZWY8R2xvYmFsbHlIYXNoZWRUeXBlPiBoYXNoZXMoKSBjb25zdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ3JlYXRlRnVuYz4KKyAgVHlwZUluZGV4IGluc2VydFJlY29yZEFzKEdsb2JhbGx5SGFzaGVkVHlwZSBIYXNoLCBzaXplX3QgUmVjb3JkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUZ1bmMgQ3JlYXRlKSB7CisgICAgYXV0byBSZXN1bHQgPSBIYXNoZWRSZWNvcmRzLnRyeV9lbXBsYWNlKEhhc2gsIG5leHRUeXBlSW5kZXgoKSk7CisKKyAgICBpZiAoTExWTV9VTkxJS0VMWShSZXN1bHQuc2Vjb25kKSkgeworICAgICAgdWludDhfdCAqU3RhYmxlID0gUmVjb3JkU3RvcmFnZS5BbGxvY2F0ZTx1aW50OF90PihSZWNvcmRTaXplKTsKKyAgICAgIE11dGFibGVBcnJheVJlZjx1aW50OF90PiBEYXRhKFN0YWJsZSwgUmVjb3JkU2l6ZSk7CisgICAgICBTZWVuUmVjb3Jkcy5wdXNoX2JhY2soQ3JlYXRlKERhdGEpKTsKKyAgICAgIFNlZW5IYXNoZXMucHVzaF9iYWNrKEhhc2gpOworICAgIH0KKworICAgIC8vIFVwZGF0ZSB0aGUgY2FsbGVyJ3MgY29weSBvZiBSZWNvcmQgdG8gcG9pbnQgYSBzdGFibGUgY29weS4KKyAgICByZXR1cm4gUmVzdWx0LmZpcnN0LT5zZWNvbmQ7CisgIH0KKworICBUeXBlSW5kZXggaW5zZXJ0UmVjb3JkQnl0ZXMoQXJyYXlSZWY8dWludDhfdD4gRGF0YSk7CisgIFR5cGVJbmRleCBpbnNlcnRSZWNvcmQoQ29udGludWF0aW9uUmVjb3JkQnVpbGRlciAmQnVpbGRlcik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFR5cGVJbmRleCB3cml0ZUxlYWZUeXBlKFQgJlJlY29yZCkgeworICAgIEFycmF5UmVmPHVpbnQ4X3Q+IERhdGEgPSBTaW1wbGVTZXJpYWxpemVyLnNlcmlhbGl6ZShSZWNvcmQpOworICAgIHJldHVybiBpbnNlcnRSZWNvcmRCeXRlcyhEYXRhKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfTUVSR0lOR1RZUEVUQUJMRUJVSUxERVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvTGF6eVJhbmRvbVR5cGVDb2xsZWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9MYXp5UmFuZG9tVHlwZUNvbGxlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmQ3ODY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvTGF6eVJhbmRvbVR5cGVDb2xsZWN0aW9uLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8vPT09LSBMYXp5UmFuZG9tVHlwZUNvbGxlY3Rpb24uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfTEFaWVJBTkRPTVRZUEVDT0xMRUNUSU9OX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfTEFaWVJBTkRPTVRZUEVDT0xMRUNUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlQ29sbGVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUFycmF5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1N0cmluZ1NhdmVyLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CisKKy8vLyBcYnJpZWYgUHJvdmlkZXMgYW1vcnRpemVkIE8oMSkgcmFuZG9tIGFjY2VzcyB0byBhIENvZGVWaWV3IHR5cGUgc3RyZWFtLgorLy8vIE5vcm1hbGx5IHRvIGFjY2VzcyBhIHR5cGUgZnJvbSBhIHR5cGUgc3RyZWFtLCB5b3UgbXVzdCBrbm93IGl0cyBieXRlCisvLy8gb2Zmc2V0IGludG8gdGhlIHR5cGUgc3RyZWFtLCBiZWNhdXNlIHR5cGUgcmVjb3JkcyBhcmUgdmFyaWFibGUtbGVuZ3RoZWQuCisvLy8gSG93ZXZlciwgdGhpcyBpcyBub3QgdGhlIHdheSB3ZSBwcmVmZXIgdG8gYWNjZXNzIHRoZW0uICBGb3IgZXhhbXBsZSwgZ2l2ZW4KKy8vLyBhIHN5bWJvbCByZWNvcmQgb25lIG9mIHRoZSBmaWVsZHMgbWF5IGJlIHRoZSBUeXBlSW5kZXggb2YgdGhlIHN5bWJvbCdzCisvLy8gdHlwZSByZWNvcmQuICBPciBnaXZlbiBhIHR5cGUgcmVjb3JkIHN1Y2ggYXMgYW4gYXJyYXkgdHlwZSwgdGhlcmUgbWlnaHQKKy8vLyBiZSBhIFR5cGVJbmRleCBmb3IgdGhlIGVsZW1lbnQgdHlwZS4gIFNlcXVlbnRpYWwgYWNjZXNzIGlzIHBlcmZlY3Qgd2hlbgorLy8vIHdlJ3JlIGp1c3QgZHVtcGluZyBldmVyeSBlbnRyeSwgYnV0IGl0J3MgdmVyeSBwb29yIGZvciByZWFsIHdvcmxkIHVzYWdlLgorLy8vCisvLy8gVHlwZSBzdHJlYW1zIGluIFBEQnMgY29udGFpbiBhbiBhZGRpdGlvbmFsIGZpZWxkIHdoaWNoIGlzIGEgbGlzdCBvZiBwYWlycworLy8vIGNvbnRhaW5pbmcgaW5kaWNlcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBvZmZzZXRzLCByb3VnaGx5IGV2ZXJ5IH44S0Igb2YKKy8vLyByZWNvcmQgZGF0YS4gIFRoaXMgZ2VuZXJhbCBpZGVhIG5lZWQgbm90IGJlIGNvbmZpbmVkIHRvIFBEQnMgdGhvdWdoLiAgQnkKKy8vLyBzdXBwbHlpbmcgc3VjaCBhbiBhcnJheSwgdGhlIHByb2R1Y2VyIG9mIGEgdHlwZSBzdHJlYW0gY2FuIGFsbG93IHRoZQorLy8vIGNvbnN1bWVyIG11Y2ggYmV0dGVyIGFjY2VzcyB0aW1lLCBiZWNhdXNlIHRoZSBjb25zdW1lciBjYW4gZmluZCB0aGUgbmVhcmVzdAorLy8vIGluZGV4IGluIHRoaXMgYXJyYXksIGFuZCBkbyBhIGxpbmVhciBzY2FuIGZvcndhcmQgb25seSBmcm9tIHRoZXJlLgorLy8vCisvLy8gTGF6eVJhbmRvbVR5cGVDb2xsZWN0aW9uIGltcGxlbWVudHMgdGhpcyBhbGdvcml0aG0sIGJ1dCBhZGRpdGlvbmFsbHkgZ29lcworLy8vIG9uZSBzdGVwIGZ1cnRoZXIgYnkgY2FjaGluZyBvZmZzZXRzIG9mIGV2ZXJ5IHJlY29yZCB0aGF0IGhhcyBiZWVuIHZpc2l0ZWQgYXQKKy8vLyBsZWFzdCBvbmNlLiAgVGhpcyB3YXksIGV2ZW4gcmVwZWF0ZWQgdmlzaXRzIG9mIHRoZSBzYW1lIHJlY29yZCB3aWxsIG5ldmVyCisvLy8gcmVxdWlyZSBtb3JlIHRoYW4gb25lIGxpbmVhciBzY2FuLiAgRm9yIGEgdHlwZSBzdHJlYW0gb2YgTiBlbGVtZW50cyBkaXZpZGVkCisvLy8gaW50byBNIGNodW5rcyBvZiByb3VnaGx5IGVxdWFsIHNpemUsIHRoaXMgeWllbGRzIGEgd29yc3QgY2FzZSBsb29rdXAgdGltZQorLy8vIG9mIE8oTi9NKSBhbmQgYW4gYW1vcnRpemVkIHRpbWUgb2YgTygxKS4KK2NsYXNzIExhenlSYW5kb21UeXBlQ29sbGVjdGlvbiA6IHB1YmxpYyBUeXBlQ29sbGVjdGlvbiB7CisgIHVzaW5nIFBhcnRpYWxPZmZzZXRBcnJheSA9IEZpeGVkU3RyZWFtQXJyYXk8VHlwZUluZGV4T2Zmc2V0PjsKKworICBzdHJ1Y3QgQ2FjaGVFbnRyeSB7CisgICAgQ1ZUeXBlIFR5cGU7CisgICAgdWludDMyX3QgT2Zmc2V0OworICAgIFN0cmluZ1JlZiBOYW1lOworICB9OworCitwdWJsaWM6CisgIGV4cGxpY2l0IExhenlSYW5kb21UeXBlQ29sbGVjdGlvbih1aW50MzJfdCBSZWNvcmRDb3VudEhpbnQpOworICBMYXp5UmFuZG9tVHlwZUNvbGxlY3Rpb24oU3RyaW5nUmVmIERhdGEsIHVpbnQzMl90IFJlY29yZENvdW50SGludCk7CisgIExhenlSYW5kb21UeXBlQ29sbGVjdGlvbihBcnJheVJlZjx1aW50OF90PiBEYXRhLCB1aW50MzJfdCBSZWNvcmRDb3VudEhpbnQpOworICBMYXp5UmFuZG9tVHlwZUNvbGxlY3Rpb24oY29uc3QgQ1ZUeXBlQXJyYXkgJlR5cGVzLCB1aW50MzJfdCBSZWNvcmRDb3VudEhpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aWFsT2Zmc2V0QXJyYXkgUGFydGlhbE9mZnNldHMpOworICBMYXp5UmFuZG9tVHlwZUNvbGxlY3Rpb24oY29uc3QgQ1ZUeXBlQXJyYXkgJlR5cGVzLCB1aW50MzJfdCBSZWNvcmRDb3VudEhpbnQpOworCisgIHZvaWQgcmVzZXQoQXJyYXlSZWY8dWludDhfdD4gRGF0YSwgdWludDMyX3QgUmVjb3JkQ291bnRIaW50KTsKKyAgdm9pZCByZXNldChTdHJpbmdSZWYgRGF0YSwgdWludDMyX3QgUmVjb3JkQ291bnRIaW50KTsKKyAgdm9pZCByZXNldChCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlciwgdWludDMyX3QgUmVjb3JkQ291bnRIaW50KTsKKworICB1aW50MzJfdCBnZXRPZmZzZXRPZlR5cGUoVHlwZUluZGV4IEluZGV4KTsKKworICBPcHRpb25hbDxDVlR5cGU+IHRyeUdldFR5cGUoVHlwZUluZGV4IEluZGV4KTsKKworICBDVlR5cGUgZ2V0VHlwZShUeXBlSW5kZXggSW5kZXgpIG92ZXJyaWRlOworICBTdHJpbmdSZWYgZ2V0VHlwZU5hbWUoVHlwZUluZGV4IEluZGV4KSBvdmVycmlkZTsKKyAgYm9vbCBjb250YWlucyhUeXBlSW5kZXggSW5kZXgpIG92ZXJyaWRlOworICB1aW50MzJfdCBzaXplKCkgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGNhcGFjaXR5KCkgb3ZlcnJpZGU7CisgIE9wdGlvbmFsPFR5cGVJbmRleD4gZ2V0Rmlyc3QoKSBvdmVycmlkZTsKKyAgT3B0aW9uYWw8VHlwZUluZGV4PiBnZXROZXh0KFR5cGVJbmRleCBQcmV2KSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgRXJyb3IgZW5zdXJlVHlwZUV4aXN0cyhUeXBlSW5kZXggSW5kZXgpOworICB2b2lkIGVuc3VyZUNhcGFjaXR5Rm9yKFR5cGVJbmRleCBJbmRleCk7CisKKyAgRXJyb3IgdmlzaXRSYW5nZUZvclR5cGUoVHlwZUluZGV4IFRJKTsKKyAgRXJyb3IgZnVsbFNjYW5Gb3JUeXBlKFR5cGVJbmRleCBUSSk7CisgIHZvaWQgdmlzaXRSYW5nZShUeXBlSW5kZXggQmVnaW4sIHVpbnQzMl90IEJlZ2luT2Zmc2V0LCBUeXBlSW5kZXggRW5kKTsKKworICAvLy8gTnVtYmVyIG9mIGFjdHVhbCByZWNvcmRzLgorICB1aW50MzJfdCBDb3VudCA9IDA7CisKKyAgLy8vIFRoZSBsYXJnZXN0IHR5cGUgaW5kZXggd2hpY2ggd2UndmUgdmlzaXRlZC4KKyAgVHlwZUluZGV4IExhcmdlc3RUeXBlSW5kZXggPSBUeXBlSW5kZXg6Ok5vbmUoKTsKKworICBCdW1wUHRyQWxsb2NhdG9yIEFsbG9jYXRvcjsKKyAgU3RyaW5nU2F2ZXIgTmFtZVN0b3JhZ2U7CisKKyAgLy8vIFRoZSB0eXBlIGFycmF5IHRvIGFsbG93IHJhbmRvbSBhY2Nlc3MgdmlzaXRhdGlvbiBvZi4KKyAgQ1ZUeXBlQXJyYXkgVHlwZXM7CisKKyAgc3RkOjp2ZWN0b3I8Q2FjaGVFbnRyeT4gUmVjb3JkczsKKworICAvLy8gQW4gYXJyYXkgb2YgaW5kZXggb2Zmc2V0cyBmb3IgdGhlIGdpdmVuIHR5cGUgc3RyZWFtLCBhbGxvd2luZyBsb2coTikKKyAgLy8vIGxvb2t1cHMgb2YgYSB0eXBlIHJlY29yZCBieSBpbmRleC4gIFNpbWlsYXIgdG8gS25vd25PZmZzZXRzIGJ1dCBvbmx5CisgIC8vLyBjb250YWlucyBvZmZzZXRzIGZvciBzb21lIHR5cGUgaW5kaWNlcywgc29tZSBvZiB3aGljaCBtYXkgbm90IGhhdmUKKyAgLy8vIGV2ZXIgYmVlbiB2aXNpdGVkLgorICBQYXJ0aWFsT2Zmc2V0QXJyYXkgUGFydGlhbE9mZnNldHM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19MQVpZUkFORE9NVFlQRUNPTExFQ1RJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvTGluZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvTGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMjI5YzMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9MaW5lLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8vPT09LSBMaW5lLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfTElORV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0xJTkVfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUluZGV4LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgPGNpbnR0eXBlcz4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKwordXNpbmcgbGx2bTo6c3VwcG9ydDo6dWxpdHRsZTMyX3Q7CisKK2NsYXNzIExpbmVJbmZvIHsKK3B1YmxpYzoKKyAgZW51bSA6IHVpbnQzMl90IHsKKyAgICBBbHdheXNTdGVwSW50b0xpbmVOdW1iZXIgPSAweGZlZWZlZSwKKyAgICBOZXZlclN0ZXBJbnRvTGluZU51bWJlciA9IDB4ZjAwZjAwCisgIH07CisKKyAgZW51bSA6IGludCB7IEVuZExpbmVEZWx0YVNoaWZ0ID0gMjQgfTsKKworICBlbnVtIDogdWludDMyX3QgeworICAgIFN0YXJ0TGluZU1hc2sgPSAweDAwZmZmZmZmLAorICAgIEVuZExpbmVEZWx0YU1hc2sgPSAweDdmMDAwMDAwLAorICAgIFN0YXRlbWVudEZsYWcgPSAweDgwMDAwMDAwdQorICB9OworCisgIExpbmVJbmZvKHVpbnQzMl90IFN0YXJ0TGluZSwgdWludDMyX3QgRW5kTGluZSwgYm9vbCBJc1N0YXRlbWVudCk7CisgIExpbmVJbmZvKHVpbnQzMl90IExpbmVEYXRhKSA6IExpbmVEYXRhKExpbmVEYXRhKSB7fQorCisgIHVpbnQzMl90IGdldFN0YXJ0TGluZSgpIGNvbnN0IHsgcmV0dXJuIExpbmVEYXRhICYgU3RhcnRMaW5lTWFzazsgfQorCisgIHVpbnQzMl90IGdldExpbmVEZWx0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKExpbmVEYXRhICYgRW5kTGluZURlbHRhTWFzaykgPj4gRW5kTGluZURlbHRhU2hpZnQ7CisgIH0KKworICB1aW50MzJfdCBnZXRFbmRMaW5lKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RhcnRMaW5lKCkgKyBnZXRMaW5lRGVsdGEoKTsgfQorCisgIGJvb2wgaXNTdGF0ZW1lbnQoKSBjb25zdCB7IHJldHVybiAoTGluZURhdGEgJiBTdGF0ZW1lbnRGbGFnKSAhPSAwOyB9CisKKyAgdWludDMyX3QgZ2V0UmF3RGF0YSgpIGNvbnN0IHsgcmV0dXJuIExpbmVEYXRhOyB9CisKKyAgYm9vbCBpc0Fsd2F5c1N0ZXBJbnRvKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdGFydExpbmUoKSA9PSBBbHdheXNTdGVwSW50b0xpbmVOdW1iZXI7CisgIH0KKworICBib29sIGlzTmV2ZXJTdGVwSW50bygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3RhcnRMaW5lKCkgPT0gTmV2ZXJTdGVwSW50b0xpbmVOdW1iZXI7CisgIH0KKworcHJpdmF0ZToKKyAgdWludDMyX3QgTGluZURhdGE7Cit9OworCitjbGFzcyBDb2x1bW5JbmZvIHsKK3ByaXZhdGU6CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBTdGFydENvbHVtbk1hc2sgPSAweDAwMDBmZmZmdTsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEVuZENvbHVtbk1hc2sgPSAweGZmZmYwMDAwdTsKKyAgc3RhdGljIGNvbnN0IGludCBFbmRDb2x1bW5TaGlmdCA9IDE2OworCitwdWJsaWM6CisgIENvbHVtbkluZm8odWludDE2X3QgU3RhcnRDb2x1bW4sIHVpbnQxNl90IEVuZENvbHVtbikgeworICAgIENvbHVtbkRhdGEgPQorICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFN0YXJ0Q29sdW1uKSAmIFN0YXJ0Q29sdW1uTWFzaykgfAorICAgICAgICAoKHN0YXRpY19jYXN0PHVpbnQzMl90PihFbmRDb2x1bW4pIDw8IEVuZENvbHVtblNoaWZ0KSAmIEVuZENvbHVtbk1hc2spOworICB9CisKKyAgdWludDE2X3QgZ2V0U3RhcnRDb2x1bW4oKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNl90PihDb2x1bW5EYXRhICYgU3RhcnRDb2x1bW5NYXNrKTsKKyAgfQorCisgIHVpbnQxNl90IGdldEVuZENvbHVtbigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KChDb2x1bW5EYXRhICYgRW5kQ29sdW1uTWFzaykgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZENvbHVtblNoaWZ0KTsKKyAgfQorCisgIHVpbnQzMl90IGdldFJhd0RhdGEoKSBjb25zdCB7IHJldHVybiBDb2x1bW5EYXRhOyB9CisKK3ByaXZhdGU6CisgIHVpbnQzMl90IENvbHVtbkRhdGE7Cit9OworCitjbGFzcyBMaW5lIHsKK3ByaXZhdGU6CisgIGludDMyX3QgQ29kZU9mZnNldDsKKyAgTGluZUluZm8gTGluZUluZjsKKyAgQ29sdW1uSW5mbyBDb2x1bW5JbmY7CisKK3B1YmxpYzoKKyAgTGluZShpbnQzMl90IENvZGVPZmZzZXQsIHVpbnQzMl90IFN0YXJ0TGluZSwgdWludDMyX3QgRW5kTGluZSwKKyAgICAgICB1aW50MTZfdCBTdGFydENvbHVtbiwgdWludDE2X3QgRW5kQ29sdW1uLCBib29sIElzU3RhdGVtZW50KQorICAgICAgOiBDb2RlT2Zmc2V0KENvZGVPZmZzZXQpLCBMaW5lSW5mKFN0YXJ0TGluZSwgRW5kTGluZSwgSXNTdGF0ZW1lbnQpLAorICAgICAgICBDb2x1bW5JbmYoU3RhcnRDb2x1bW4sIEVuZENvbHVtbikge30KKworICBMaW5lKGludDMyX3QgQ29kZU9mZnNldCwgTGluZUluZm8gTGluZUluZiwgQ29sdW1uSW5mbyBDb2x1bW5JbmYpCisgICAgICA6IENvZGVPZmZzZXQoQ29kZU9mZnNldCksIExpbmVJbmYoTGluZUluZiksIENvbHVtbkluZihDb2x1bW5JbmYpIHt9CisKKyAgTGluZUluZm8gZ2V0TGluZUluZm8oKSBjb25zdCB7IHJldHVybiBMaW5lSW5mOyB9CisKKyAgQ29sdW1uSW5mbyBnZXRDb2x1bW5JbmZvKCkgY29uc3QgeyByZXR1cm4gQ29sdW1uSW5mOyB9CisKKyAgaW50MzJfdCBnZXRDb2RlT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gQ29kZU9mZnNldDsgfQorCisgIHVpbnQzMl90IGdldFN0YXJ0TGluZSgpIGNvbnN0IHsgcmV0dXJuIExpbmVJbmYuZ2V0U3RhcnRMaW5lKCk7IH0KKworICB1aW50MzJfdCBnZXRMaW5lRGVsdGEoKSBjb25zdCB7IHJldHVybiBMaW5lSW5mLmdldExpbmVEZWx0YSgpOyB9CisKKyAgdWludDMyX3QgZ2V0RW5kTGluZSgpIGNvbnN0IHsgcmV0dXJuIExpbmVJbmYuZ2V0RW5kTGluZSgpOyB9CisKKyAgdWludDE2X3QgZ2V0U3RhcnRDb2x1bW4oKSBjb25zdCB7IHJldHVybiBDb2x1bW5JbmYuZ2V0U3RhcnRDb2x1bW4oKTsgfQorCisgIHVpbnQxNl90IGdldEVuZENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIENvbHVtbkluZi5nZXRFbmRDb2x1bW4oKTsgfQorCisgIGJvb2wgaXNTdGF0ZW1lbnQoKSBjb25zdCB7IHJldHVybiBMaW5lSW5mLmlzU3RhdGVtZW50KCk7IH0KKworICBib29sIGlzQWx3YXlzU3RlcEludG8oKSBjb25zdCB7IHJldHVybiBMaW5lSW5mLmlzQWx3YXlzU3RlcEludG8oKTsgfQorCisgIGJvb2wgaXNOZXZlclN0ZXBJbnRvKCkgY29uc3QgeyByZXR1cm4gTGluZUluZi5pc05ldmVyU3RlcEludG8oKTsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9NZXJnaW5nVHlwZVRhYmxlQnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvTWVyZ2luZ1R5cGVUYWJsZUJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDMwOTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvTWVyZ2luZ1R5cGVUYWJsZUJ1aWxkZXIuaApAQCAtMCwwICsxLDgxIEBACisvLz09PS0gTWVyZ2luZ1R5cGVUYWJsZUJ1aWxkZXIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKystKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX01FUkdJTkdUWVBFVEFCTEVCVUlMREVSX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfTUVSR0lOR1RZUEVUQUJMRUJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TaW1wbGVUeXBlU2VyaWFsaXplci5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUhhc2hpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIENvbnRpbnVhdGlvblJlY29yZEJ1aWxkZXI7CisKK2NsYXNzIE1lcmdpbmdUeXBlVGFibGVCdWlsZGVyIDogcHVibGljIFR5cGVDb2xsZWN0aW9uIHsKKyAgLy8vIFN0b3JhZ2UgZm9yIHJlY29yZHMuICBUaGVzZSBuZWVkIHRvIG91dGxpdmUgdGhlIFR5cGVUYWJsZUJ1aWxkZXIuCisgIEJ1bXBQdHJBbGxvY2F0b3IgJlJlY29yZFN0b3JhZ2U7CisKKyAgLy8vIEEgc2VyaWFsaXplciB0aGF0IGNhbiB3cml0ZSBub24tY29udGludWF0aW9uIGxlYWYgdHlwZXMuICBPbmx5IHVzZWQgYXMKKyAgLy8vIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gc28gdGhhdCB3ZSBjYW4gcHJvdmlkZSBhbiBpbnRlcmZhY2UgbWV0aG9kIHRvCisgIC8vLyB3cml0ZSBhbiB1bnNlcmlhbGl6ZWQgcmVjb3JkLgorICBTaW1wbGVUeXBlU2VyaWFsaXplciBTaW1wbGVTZXJpYWxpemVyOworCisgIC8vLyBIYXNoIHRhYmxlLgorICBEZW5zZU1hcDxMb2NhbGx5SGFzaGVkVHlwZSwgVHlwZUluZGV4PiBIYXNoZWRSZWNvcmRzOworCisgIC8vLyBDb250YWlucyBhIGxpc3Qgb2YgYWxsIHJlY29yZHMgaW5kZXhlZCBieSBUeXBlSW5kZXgudG9BcnJheUluZGV4KCkuCisgIFNtYWxsVmVjdG9yPEFycmF5UmVmPHVpbnQ4X3Q+LCAyPiBTZWVuUmVjb3JkczsKKworcHVibGljOgorICBleHBsaWNpdCBNZXJnaW5nVHlwZVRhYmxlQnVpbGRlcihCdW1wUHRyQWxsb2NhdG9yICZTdG9yYWdlKTsKKyAgfk1lcmdpbmdUeXBlVGFibGVCdWlsZGVyKCk7CisKKyAgLy8gVHlwZVRhYmxlQ29sbGVjdGlvbiBvdmVycmlkZXMKKyAgT3B0aW9uYWw8VHlwZUluZGV4PiBnZXRGaXJzdCgpIG92ZXJyaWRlOworICBPcHRpb25hbDxUeXBlSW5kZXg+IGdldE5leHQoVHlwZUluZGV4IFByZXYpIG92ZXJyaWRlOworICBDVlR5cGUgZ2V0VHlwZShUeXBlSW5kZXggSW5kZXgpIG92ZXJyaWRlOworICBTdHJpbmdSZWYgZ2V0VHlwZU5hbWUoVHlwZUluZGV4IEluZGV4KSBvdmVycmlkZTsKKyAgYm9vbCBjb250YWlucyhUeXBlSW5kZXggSW5kZXgpIG92ZXJyaWRlOworICB1aW50MzJfdCBzaXplKCkgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGNhcGFjaXR5KCkgb3ZlcnJpZGU7CisKKyAgLy8gcHVibGljIGludGVyZmFjZQorICB2b2lkIHJlc2V0KCk7CisgIFR5cGVJbmRleCBuZXh0VHlwZUluZGV4KCkgY29uc3Q7CisKKyAgQnVtcFB0ckFsbG9jYXRvciAmZ2V0QWxsb2NhdG9yKCkgeyByZXR1cm4gUmVjb3JkU3RvcmFnZTsgfQorCisgIEFycmF5UmVmPEFycmF5UmVmPHVpbnQ4X3Q+PiByZWNvcmRzKCkgY29uc3Q7CisKKyAgVHlwZUluZGV4IGluc2VydFJlY29yZEFzKGhhc2hfY29kZSBIYXNoLCBBcnJheVJlZjx1aW50OF90PiAmUmVjb3JkKTsKKyAgVHlwZUluZGV4IGluc2VydFJlY29yZEJ5dGVzKEFycmF5UmVmPHVpbnQ4X3Q+ICZSZWNvcmQpOworICBUeXBlSW5kZXggaW5zZXJ0UmVjb3JkKENvbnRpbnVhdGlvblJlY29yZEJ1aWxkZXIgJkJ1aWxkZXIpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUeXBlSW5kZXggd3JpdGVMZWFmVHlwZShUICZSZWNvcmQpIHsKKyAgICBBcnJheVJlZjx1aW50OF90PiBEYXRhID0gU2ltcGxlU2VyaWFsaXplci5zZXJpYWxpemUoUmVjb3JkKTsKKyAgICByZXR1cm4gaW5zZXJ0UmVjb3JkQnl0ZXMoRGF0YSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX01FUkdJTkdUWVBFVEFCTEVCVUlMREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1JlY29yZE5hbWUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1JlY29yZE5hbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDIyMTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvUmVjb3JkTmFtZS5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vPT09LSBSZWNvcmROYW1lLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLSBDKysgLS0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfUkVDT1JETkFNRV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1JFQ09SRE5BTUVfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUNvbGxlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXguaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKK3N0ZDo6c3RyaW5nIGNvbXB1dGVUeXBlTmFtZShUeXBlQ29sbGVjdGlvbiAmVHlwZXMsIFR5cGVJbmRleCBJbmRleCk7CitTdHJpbmdSZWYgZ2V0U3ltYm9sTmFtZShDVlN5bWJvbCBTeW0pOworfSAvLyBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9SZWNvcmRTZXJpYWxpemF0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9SZWNvcmRTZXJpYWxpemF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg0NDljMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1JlY29yZFNlcmlhbGl6YXRpb24uaApAQCAtMCwwICsxLDI1MSBAQAorLy89PT0tIFJlY29yZFNlcmlhbGl6YXRpb24uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19SRUNPUkRTRVJJQUxJWkFUSU9OX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfUkVDT1JEU0VSSUFMSVpBVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUFNJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdFcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWFkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y2ludHR5cGVzPgorI2luY2x1ZGUgPHR1cGxlPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgewordXNpbmcgbGx2bTo6c3VwcG9ydDo6bGl0dGxlMzJfdDsKK3VzaW5nIGxsdm06OnN1cHBvcnQ6OnVsaXR0bGUxNl90OwordXNpbmcgbGx2bTo6c3VwcG9ydDo6dWxpdHRsZTMyX3Q7CisKKy8vLyBMaW1pdCBvbiB0aGUgc2l6ZSBvZiBhbGwgY29kZXZpZXcgc3ltYm9sIGFuZCB0eXBlIHJlY29yZHMsIGluY2x1ZGluZyB0aGUKKy8vLyBSZWNvcmRQcmVmaXguIE1TVkMgZG9lcyBub3QgZW1pdCBhbnkgcmVjb3JkcyBsYXJnZXIgdGhhbiB0aGlzLgorZW51bSA6IHVuc2lnbmVkIHsgTWF4UmVjb3JkTGVuZ3RoID0gMHhGRjAwIH07CisKK3N0cnVjdCBSZWNvcmRQcmVmaXggeworICB1bGl0dGxlMTZfdCBSZWNvcmRMZW47ICAvLyBSZWNvcmQgbGVuZ3RoLCBzdGFydGluZyBmcm9tICZSZWNvcmRLaW5kLgorICB1bGl0dGxlMTZfdCBSZWNvcmRLaW5kOyAvLyBSZWNvcmQga2luZCBlbnVtIChTeW1SZWNvcmRLaW5kIG9yIFR5cGVSZWNvcmRLaW5kKQorfTsKKworLy8vIFJlaW50ZXJwcmV0IGEgYnl0ZSBhcnJheSBhcyBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLiBEb2VzIG5vdCBpbnRlcnByZXQgYXMKKy8vLyBhIEMgc3RyaW5nLCBhcyBTdHJpbmdSZWYgaGFzIHNldmVyYWwgaGVscGVycyAoc3BsaXQpIHRoYXQgbWFrZSB0aGF0IGVhc3kuCitTdHJpbmdSZWYgZ2V0Qnl0ZXNBc0NoYXJhY3RlcnMoQXJyYXlSZWY8dWludDhfdD4gTGVhZkRhdGEpOworU3RyaW5nUmVmIGdldEJ5dGVzQXNDU3RyaW5nKEFycmF5UmVmPHVpbnQ4X3Q+IExlYWZEYXRhKTsKKworaW5saW5lIEVycm9yIGNvbnN1bWUoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIpIHsgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7IH0KKworLy8vIERlY29kZXMgYSBudW1lcmljICJsZWFmIiB2YWx1ZS4gVGhlc2UgYXJlIGludGVnZXIgbGl0ZXJhbHMgZW5jb3VudGVyZWQgaW4KKy8vLyB0aGUgdHlwZSBzdHJlYW0uIElmIHRoZSB2YWx1ZSBpcyBwb3NpdGl2ZSBhbmQgbGVzcyB0aGFuIExGX05VTUVSSUMgKDEgPDwKKy8vLyAxNSksIGl0IGlzIGVtaXR0ZWQgZGlyZWN0bHkgaW4gRGF0YS4gT3RoZXJ3aXNlLCBpdCBoYXMgYSB0YWcgbGlrZSBMRl9DSEFSCisvLy8gdGhhdCBpbmRpY2F0ZXMgdGhlIGJpdHdpZHRoIGFuZCBzaWduIG9mIHRoZSBudW1lcmljIGRhdGEuCitFcnJvciBjb25zdW1lKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyLCBBUFNJbnQgJk51bSk7CisKKy8vLyBEZWNvZGVzIGEgbnVtZXJpYyBsZWFmIHZhbHVlIHRoYXQgaXMga25vd24gdG8gYmUgYSBwYXJ0aWN1bGFyIHR5cGUuCitFcnJvciBjb25zdW1lX251bWVyaWMoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIsIHVpbnQ2NF90ICZWYWx1ZSk7CisKKy8vLyBEZWNvZGVzIHNpZ25lZCBhbmQgdW5zaWduZWQgZml4ZWQtbGVuZ3RoIGludGVnZXJzLgorRXJyb3IgY29uc3VtZShCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlciwgdWludDMyX3QgJkl0ZW0pOworRXJyb3IgY29uc3VtZShCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlciwgaW50MzJfdCAmSXRlbSk7CisKKy8vLyBEZWNvZGVzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4KK0Vycm9yIGNvbnN1bWUoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIsIFN0cmluZ1JlZiAmSXRlbSk7CisKK0Vycm9yIGNvbnN1bWUoU3RyaW5nUmVmICZEYXRhLCBBUFNJbnQgJk51bSk7CitFcnJvciBjb25zdW1lKFN0cmluZ1JlZiAmRGF0YSwgdWludDMyX3QgJkl0ZW0pOworCisvLy8gRGVjb2RlcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHdob3NlIGxheW91dCBtYXRjaGVzIHRoYXQgb2YgdGhlIHVuZGVybHlpbmcKKy8vLyBieXRlIHNlcXVlbmNlLCBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBFcnJvciBjb25zdW1lKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyLCBUIComSXRlbSkgeworICByZXR1cm4gUmVhZGVyLnJlYWRPYmplY3QoSXRlbSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPiBzdHJ1Y3Qgc2VyaWFsaXplX2NvbmRpdGlvbmFsX2ltcGwgeworICBzZXJpYWxpemVfY29uZGl0aW9uYWxfaW1wbChUICZJdGVtLCBVIEZ1bmMpIDogSXRlbShJdGVtKSwgRnVuYyhGdW5jKSB7fQorCisgIEVycm9yIGRlc2VyaWFsaXplKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyKSBjb25zdCB7CisgICAgaWYgKCFGdW5jKCkpCisgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICByZXR1cm4gY29uc3VtZShSZWFkZXIsIEl0ZW0pOworICB9CisKKyAgVCAmSXRlbTsKKyAgVSBGdW5jOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitzZXJpYWxpemVfY29uZGl0aW9uYWxfaW1wbDxULCBVPiBzZXJpYWxpemVfY29uZGl0aW9uYWwoVCAmSXRlbSwgVSBGdW5jKSB7CisgIHJldHVybiBzZXJpYWxpemVfY29uZGl0aW9uYWxfaW1wbDxULCBVPihJdGVtLCBGdW5jKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHN0cnVjdCBzZXJpYWxpemVfYXJyYXlfaW1wbCB7CisgIHNlcmlhbGl6ZV9hcnJheV9pbXBsKEFycmF5UmVmPFQ+ICZJdGVtLCBVIEZ1bmMpIDogSXRlbShJdGVtKSwgRnVuYyhGdW5jKSB7fQorCisgIEVycm9yIGRlc2VyaWFsaXplKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyKSBjb25zdCB7CisgICAgcmV0dXJuIFJlYWRlci5yZWFkQXJyYXkoSXRlbSwgRnVuYygpKTsKKyAgfQorCisgIEFycmF5UmVmPFQ+ICZJdGVtOworICBVIEZ1bmM7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHNlcmlhbGl6ZV92ZWN0b3JfdGFpbF9pbXBsIHsKKyAgc2VyaWFsaXplX3ZlY3Rvcl90YWlsX2ltcGwoc3RkOjp2ZWN0b3I8VD4gJkl0ZW0pIDogSXRlbShJdGVtKSB7fQorCisgIEVycm9yIGRlc2VyaWFsaXplKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyKSBjb25zdCB7CisgICAgVCBGaWVsZDsKKyAgICAvLyBTdG9wIHdoZW4gd2UgcnVuIG91dCBvZiBieXRlcyBvciB3ZSBoaXQgcmVjb3JkIHBhZGRpbmcgYnl0ZXMuCisgICAgd2hpbGUgKCFSZWFkZXIuZW1wdHkoKSAmJiBSZWFkZXIucGVlaygpIDwgTEZfUEFEMCkgeworICAgICAgaWYgKGF1dG8gRUMgPSBjb25zdW1lKFJlYWRlciwgRmllbGQpKQorICAgICAgICByZXR1cm4gRUM7CisgICAgICBJdGVtLnB1c2hfYmFjayhGaWVsZCk7CisgICAgfQorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8VD4gJkl0ZW07Cit9OworCitzdHJ1Y3Qgc2VyaWFsaXplX251bGxfdGVybV9zdHJpbmdfYXJyYXlfaW1wbCB7CisgIHNlcmlhbGl6ZV9udWxsX3Rlcm1fc3RyaW5nX2FycmF5X2ltcGwoc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiAmSXRlbSkKKyAgICAgIDogSXRlbShJdGVtKSB7fQorCisgIEVycm9yIGRlc2VyaWFsaXplKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyKSBjb25zdCB7CisgICAgaWYgKFJlYWRlci5lbXB0eSgpKQorICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8Q29kZVZpZXdFcnJvcj4oY3ZfZXJyb3JfY29kZTo6aW5zdWZmaWNpZW50X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdWxsIHRlcm1pbmF0ZWQgc3RyaW5nIGlzIGVtcHR5ISIpOworCisgICAgd2hpbGUgKFJlYWRlci5wZWVrKCkgIT0gMCkgeworICAgICAgU3RyaW5nUmVmIEZpZWxkOworICAgICAgaWYgKGF1dG8gRUMgPSBSZWFkZXIucmVhZENTdHJpbmcoRmllbGQpKQorICAgICAgICByZXR1cm4gRUM7CisgICAgICBJdGVtLnB1c2hfYmFjayhGaWVsZCk7CisgICAgfQorICAgIHJldHVybiBSZWFkZXIuc2tpcCgxKTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gJkl0ZW07Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHNlcmlhbGl6ZV9hcnJheXJlZl90YWlsX2ltcGwgeworICBzZXJpYWxpemVfYXJyYXlyZWZfdGFpbF9pbXBsKEFycmF5UmVmPFQ+ICZJdGVtKSA6IEl0ZW0oSXRlbSkge30KKworICBFcnJvciBkZXNlcmlhbGl6ZShCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlcikgY29uc3QgeworICAgIHVpbnQzMl90IENvdW50ID0gUmVhZGVyLmJ5dGVzUmVtYWluaW5nKCkgLyBzaXplb2YoVCk7CisgICAgcmV0dXJuIFJlYWRlci5yZWFkQXJyYXkoSXRlbSwgQ291bnQpOworICB9CisKKyAgQXJyYXlSZWY8VD4gJkl0ZW07Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHNlcmlhbGl6ZV9udW1lcmljX2ltcGwgeworICBzZXJpYWxpemVfbnVtZXJpY19pbXBsKFQgJkl0ZW0pIDogSXRlbShJdGVtKSB7fQorCisgIEVycm9yIGRlc2VyaWFsaXplKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN1bWVfbnVtZXJpYyhSZWFkZXIsIEl0ZW0pOworICB9CisKKyAgVCAmSXRlbTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc2VyaWFsaXplX2FycmF5X2ltcGw8VCwgVT4gc2VyaWFsaXplX2FycmF5KEFycmF5UmVmPFQ+ICZJdGVtLCBVIEZ1bmMpIHsKKyAgcmV0dXJuIHNlcmlhbGl6ZV9hcnJheV9pbXBsPFQsIFU+KEl0ZW0sIEZ1bmMpOworfQorCitpbmxpbmUgc2VyaWFsaXplX251bGxfdGVybV9zdHJpbmdfYXJyYXlfaW1wbAorc2VyaWFsaXplX251bGxfdGVybV9zdHJpbmdfYXJyYXkoc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiAmSXRlbSkgeworICByZXR1cm4gc2VyaWFsaXplX251bGxfdGVybV9zdHJpbmdfYXJyYXlfaW1wbChJdGVtKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzZXJpYWxpemVfdmVjdG9yX3RhaWxfaW1wbDxUPiBzZXJpYWxpemVfYXJyYXlfdGFpbChzdGQ6OnZlY3RvcjxUPiAmSXRlbSkgeworICByZXR1cm4gc2VyaWFsaXplX3ZlY3Rvcl90YWlsX2ltcGw8VD4oSXRlbSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc2VyaWFsaXplX2FycmF5cmVmX3RhaWxfaW1wbDxUPiBzZXJpYWxpemVfYXJyYXlfdGFpbChBcnJheVJlZjxUPiAmSXRlbSkgeworICByZXR1cm4gc2VyaWFsaXplX2FycmF5cmVmX3RhaWxfaW1wbDxUPihJdGVtKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHNlcmlhbGl6ZV9udW1lcmljX2ltcGw8VD4gc2VyaWFsaXplX251bWVyaWMoVCAmSXRlbSkgeworICByZXR1cm4gc2VyaWFsaXplX251bWVyaWNfaW1wbDxUPihJdGVtKTsKK30KKworLy8gVGhpcyBmaWVsZCBpcyBvbmx5IHByZXNlbnQgaW4gdGhlIGJ5dGUgcmVjb3JkIGlmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZS4gIFRoZQorLy8gY29uZGl0aW9uIGlzIGV2YWx1YXRlZCBsYXppbHksIHNvIGl0IGNhbiBkZXBlbmQgb24gaXRlbXMgdGhhdCB3ZXJlCisvLyBkZXNlcmlhbGl6ZWQKKy8vIGVhcmxpZXIuCisjZGVmaW5lIENWX0NPTkRJVElPTkFMX0ZJRUxEKEksIEMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzZXJpYWxpemVfY29uZGl0aW9uYWwoSSwgWyZdKCkgeyByZXR1cm4gISEoQyk7IH0pCisKKy8vIFRoaXMgaXMgYW4gYXJyYXkgb2YgTiBpdGVtcywgd2hlcmUgTiBpcyBldmFsdWF0ZWQgbGF6aWx5LCBzbyBpdCBjYW4gcmVmZXIKKy8vIHRvIGEgZmllbGQgZGVzZXJpYWxpemVkIGVhcmxpZXIuCisjZGVmaW5lIENWX0FSUkFZX0ZJRUxEX04oSSwgTikgc2VyaWFsaXplX2FycmF5KEksIFsmXSgpIHsgcmV0dXJuIE47IH0pCisKKy8vIFRoaXMgaXMgYW4gYXJyYXkgdGhhdCBleGhhdXN0cyB0aGUgcmVtYWluZGVyIG9mIHRoZSBpbnB1dCBidWZmZXIuCisjZGVmaW5lIENWX0FSUkFZX0ZJRUxEX1RBSUwoSSkgc2VyaWFsaXplX2FycmF5X3RhaWwoSSkKKworLy8gVGhpcyBpcyBhbiBhcnJheSB0aGF0IGNvbnN1bWVzIG51bGwgdGVybWluYXRlZCBzdHJpbmdzIHVudGlsIGEgZG91YmxlIG51bGwKKy8vIGlzIGVuY291bnRlcmVkLgorI2RlZmluZSBDVl9TVFJJTkdfQVJSQVlfTlVMTF9URVJNKEkpIHNlcmlhbGl6ZV9udWxsX3Rlcm1fc3RyaW5nX2FycmF5KEkpCisKKyNkZWZpbmUgQ1ZfTlVNRVJJQ19GSUVMRChJKSBzZXJpYWxpemVfbnVtZXJpYyhJKQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK0Vycm9yIGNvbnN1bWUoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIsCisgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZV9jb25kaXRpb25hbF9pbXBsPFQsIFU+ICZJdGVtKSB7CisgIHJldHVybiBJdGVtLmRlc2VyaWFsaXplKFJlYWRlcik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorRXJyb3IgY29uc3VtZShCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlciwKKyAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplX2FycmF5X2ltcGw8VCwgVT4gJkl0ZW0pIHsKKyAgcmV0dXJuIEl0ZW0uZGVzZXJpYWxpemUoUmVhZGVyKTsKK30KKworaW5saW5lIEVycm9yIGNvbnN1bWUoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVfbnVsbF90ZXJtX3N0cmluZ19hcnJheV9pbXBsICZJdGVtKSB7CisgIHJldHVybiBJdGVtLmRlc2VyaWFsaXplKFJlYWRlcik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorRXJyb3IgY29uc3VtZShCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlciwKKyAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplX3ZlY3Rvcl90YWlsX2ltcGw8VD4gJkl0ZW0pIHsKKyAgcmV0dXJuIEl0ZW0uZGVzZXJpYWxpemUoUmVhZGVyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitFcnJvciBjb25zdW1lKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyLAorICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVfYXJyYXlyZWZfdGFpbF9pbXBsPFQ+ICZJdGVtKSB7CisgIHJldHVybiBJdGVtLmRlc2VyaWFsaXplKFJlYWRlcik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorRXJyb3IgY29uc3VtZShCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlciwKKyAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplX251bWVyaWNfaW1wbDxUPiAmSXRlbSkgeworICByZXR1cm4gSXRlbS5kZXNlcmlhbGl6ZShSZWFkZXIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUuLi4gQXJncz4KK0Vycm9yIGNvbnN1bWUoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIsIFQgJiZYLCBVICYmWSwgQXJncyAmJi4uLiBSZXN0KSB7CisgIGlmIChhdXRvIEVDID0gY29uc3VtZShSZWFkZXIsIFgpKQorICAgIHJldHVybiBFQzsKKyAgcmV0dXJuIGNvbnN1bWUoUmVhZGVyLCBZLCBzdGQ6OmZvcndhcmQ8QXJncz4oUmVzdCkuLi4pOworfQorCisjZGVmaW5lIENWX0RFU0VSSUFMSVpFKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoYXV0byBFQyA9IGNvbnN1bWUoX19WQV9BUkdTX18pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc3RkOjptb3ZlKEVDKTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TaW1wbGVUeXBlU2VyaWFsaXplci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU2ltcGxlVHlwZVNlcmlhbGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODVkOTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU2ltcGxlVHlwZVNlcmlhbGl6ZXIuaApAQCAtMCwwICsxLDUzIEBACisvLz09PS0gU2ltcGxlVHlwZVNlcmlhbGl6ZXIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NJTVBMRVRZUEVTRVJJQUxJWkVSX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU0lNUExFVFlQRVNFUklBTElaRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9SZWNvcmRTZXJpYWxpemF0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUluZGV4LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmRNYXBwaW5nLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVZpc2l0b3JDYWxsYmFja3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeUJ5dGVTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIFNpbXBsZVR5cGVTZXJpYWxpemVyIHsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2NyYXRjaEJ1ZmZlcjsKKworcHVibGljOgorICBTaW1wbGVUeXBlU2VyaWFsaXplcigpOworICB+U2ltcGxlVHlwZVNlcmlhbGl6ZXIoKTsKKworICAvLyBUaGlzIHRlbXBsYXRlIGlzIGV4cGxpY2l0bHkgaW5zdGFudGlhdGVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGZvciBhbGwKKyAgLy8gc3VwcG9ydGVkIHR5cGVzLiAgVGhlIG1ldGhvZCBpdHNlbGYgaXMgdWdseSwgc28gaW5saW5pbmcgaXQgaW50byB0aGUgaGVhZGVyCisgIC8vIGZpbGUgY2x1dHRlcnMgYW4gb3RoZXJ3aXNlIHN0cmFpZ2h0Zm9yd2FyZCBpbnRlcmZhY2UuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBBcnJheVJlZjx1aW50OF90PiBzZXJpYWxpemUoVCAmUmVjb3JkKTsKKworICAvLyBEb24ndCBhbGxvdyBzZXJpYWxpemF0aW9uIG9mIGZpZWxkIGxpc3QgcmVjb3JkcyB1c2luZyB0aGlzIGludGVyZmFjZS4KKyAgQXJyYXlSZWY8dWludDhfdD4gc2VyaWFsaXplKGNvbnN0IEZpZWxkTGlzdFJlY29yZCAmUmVjb3JkKSA9IGRlbGV0ZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NJTVBMRVRZUEVTRVJJQUxJWkVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N0cmluZ3NBbmRDaGVja3N1bXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N0cmluZ3NBbmRDaGVja3N1bXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmEzMzNlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3RyaW5nc0FuZENoZWNrc3Vtcy5oCkBAIC0wLDAgKzEsMTA3IEBACisvLz09PS0gU3RyaW5nc0FuZENoZWNrc3Vtcy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NUUklOR1NBTkRDSEVDS1NVTVNfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TVFJJTkdTQU5EQ0hFQ0tTVU1TX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdDaGVja3N1bXNTdWJzZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N1YnNlY3Rpb25SZWNvcmQuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIFN0cmluZ3NBbmRDaGVja3N1bXNSZWYgeworcHVibGljOgorICAvLyBJZiBubyBzdWJzZWN0aW9ucyBhcmUga25vd24gYWJvdXQgaW5pdGlhbGx5LCB3ZSBmaW5kIGFzIG11Y2ggYXMgd2UgY2FuLgorICBTdHJpbmdzQW5kQ2hlY2tzdW1zUmVmKCk7CisKKyAgLy8gSWYgb25seSBhIHN0cmluZyB0YWJsZSBzdWJzZWN0aW9uIGlzIGdpdmVuLCB3ZSBmaW5kIGEgY2hlY2tzdW1zIHN1YnNlY3Rpb24uCisgIGV4cGxpY2l0IFN0cmluZ3NBbmRDaGVja3N1bXNSZWYoY29uc3QgRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb25SZWYgJlN0cmluZ3MpOworCisgIC8vIElmIGJvdGggc3Vic2VjdGlvbnMgYXJlIGdpdmVuLCB3ZSBkb24ndCBuZWVkIHRvIGZpbmQgYW55dGhpbmcuCisgIFN0cmluZ3NBbmRDaGVja3N1bXNSZWYoY29uc3QgRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb25SZWYgJlN0cmluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdDaGVja3N1bXNTdWJzZWN0aW9uUmVmICZDaGVja3N1bXMpOworCisgIHZvaWQgc2V0U3RyaW5ncyhjb25zdCBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvblJlZiAmU3RyaW5ncyk7CisgIHZvaWQgc2V0Q2hlY2tzdW1zKGNvbnN0IERlYnVnQ2hlY2tzdW1zU3Vic2VjdGlvblJlZiAmQ1MpOworCisgIHZvaWQgcmVzZXQoKTsKKyAgdm9pZCByZXNldFN0cmluZ3MoKTsKKyAgdm9pZCByZXNldENoZWNrc3VtcygpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGluaXRpYWxpemUoVCAmJkZyYWdtZW50UmFuZ2UpIHsKKyAgICBmb3IgKGNvbnN0IERlYnVnU3Vic2VjdGlvblJlY29yZCAmUiA6IEZyYWdtZW50UmFuZ2UpIHsKKyAgICAgIGlmIChTdHJpbmdzICYmIENoZWNrc3VtcykKKyAgICAgICAgcmV0dXJuOworICAgICAgaWYgKFIua2luZCgpID09IERlYnVnU3Vic2VjdGlvbktpbmQ6OkZpbGVDaGVja3N1bXMpIHsKKyAgICAgICAgaW5pdGlhbGl6ZUNoZWNrc3VtcyhSKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoUi5raW5kKCkgPT0gRGVidWdTdWJzZWN0aW9uS2luZDo6U3RyaW5nVGFibGUgJiYgIVN0cmluZ3MpIHsKKyAgICAgICAgLy8gV2hpbGUgaW4gcHJhY3RpY2Ugd2Ugc2hvdWxkIG5ldmVyIGVuY291bnRlciBhIHN0cmluZyB0YWJsZSBldmVuCisgICAgICAgIC8vIHRob3VnaCB0aGUgc3RyaW5nIHRhYmxlIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQsIGluIHRoZW9yeSBpdCdzCisgICAgICAgIC8vIHBvc3NpYmxlLiAgUERCcyBhcmUgc3VwcG9zZWQgdG8gaGF2ZSBvbmUgZ2xvYmFsIHN0cmluZyB0YWJsZSBhbmQKKyAgICAgICAgLy8gdGhlbiB0aGlzIHN1YnNlY3Rpb24gc2hvdWxkIG5vdCBhcHBlYXIuICBXaGVyZWFzIG9iamVjdCBmaWxlcyBhcmUKKyAgICAgICAgLy8gc3VwcG9zZWQgdG8gaGF2ZSB0aGlzIHN1YnNlY3Rpb24gYXBwZWFyIGV4YWN0bHkgb25jZS4gIEhvd2V2ZXIsCisgICAgICAgIC8vIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGl0J3MgbmljZSB0byBiZSBhYmxlIHRvIHRlc3QgdGhpcyBzdWJzZWN0aW9uCisgICAgICAgIC8vIGluZGVwZW5kZW50bHkgb2Ygb25lIGZvcm1hdCBvciB0aGUgb3RoZXIsIHNvIGZvciBzb21lIHRlc3RzIHdlCisgICAgICAgIC8vIG1hbnVhbGx5IGNvbnN0cnVjdCBhIFBEQiB0aGF0IGNvbnRhaW5zIHRoaXMgc3Vic2VjdGlvbiBpbiBhZGRpdGlvbgorICAgICAgICAvLyB0byBhIGdsb2JhbCBzdHJpbmcgdGFibGUuCisgICAgICAgIGluaXRpYWxpemVTdHJpbmdzKFIpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjb25zdCBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvblJlZiAmc3RyaW5ncygpIGNvbnN0IHsgcmV0dXJuICpTdHJpbmdzOyB9CisgIGNvbnN0IERlYnVnQ2hlY2tzdW1zU3Vic2VjdGlvblJlZiAmY2hlY2tzdW1zKCkgY29uc3QgeyByZXR1cm4gKkNoZWNrc3VtczsgfQorCisgIGJvb2wgaGFzU3RyaW5ncygpIGNvbnN0IHsgcmV0dXJuIFN0cmluZ3MgIT0gbnVsbHB0cjsgfQorICBib29sIGhhc0NoZWNrc3VtcygpIGNvbnN0IHsgcmV0dXJuIENoZWNrc3VtcyAhPSBudWxscHRyOyB9CisKK3ByaXZhdGU6CisgIHZvaWQgaW5pdGlhbGl6ZVN0cmluZ3MoY29uc3QgRGVidWdTdWJzZWN0aW9uUmVjb3JkICZTUik7CisgIHZvaWQgaW5pdGlhbGl6ZUNoZWNrc3Vtcyhjb25zdCBEZWJ1Z1N1YnNlY3Rpb25SZWNvcmQgJkZDUik7CisKKyAgc3RkOjpzaGFyZWRfcHRyPERlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uUmVmPiBPd25lZFN0cmluZ3M7CisgIHN0ZDo6c2hhcmVkX3B0cjxEZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb25SZWY+IE93bmVkQ2hlY2tzdW1zOworCisgIGNvbnN0IERlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uUmVmICpTdHJpbmdzID0gbnVsbHB0cjsKKyAgY29uc3QgRGVidWdDaGVja3N1bXNTdWJzZWN0aW9uUmVmICpDaGVja3N1bXMgPSBudWxscHRyOworfTsKKworY2xhc3MgU3RyaW5nc0FuZENoZWNrc3VtcyB7CitwdWJsaWM6CisgIHVzaW5nIFN0cmluZ3NQdHIgPSBzdGQ6OnNoYXJlZF9wdHI8RGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb24+OworICB1c2luZyBDaGVja3N1bXNQdHIgPSBzdGQ6OnNoYXJlZF9wdHI8RGVidWdDaGVja3N1bXNTdWJzZWN0aW9uPjsKKworICAvLyBJZiBubyBzdWJzZWN0aW9ucyBhcmUga25vd24gYWJvdXQgaW5pdGlhbGx5LCB3ZSBmaW5kIGFzIG11Y2ggYXMgd2UgY2FuLgorICBTdHJpbmdzQW5kQ2hlY2tzdW1zKCkgPSBkZWZhdWx0OworCisgIHZvaWQgc2V0U3RyaW5ncyhjb25zdCBTdHJpbmdzUHRyICZTUCkgeyBTdHJpbmdzID0gU1A7IH0KKyAgdm9pZCBzZXRDaGVja3N1bXMoY29uc3QgQ2hlY2tzdW1zUHRyICZDUCkgeyBDaGVja3N1bXMgPSBDUDsgfQorCisgIGNvbnN0IFN0cmluZ3NQdHIgJnN0cmluZ3MoKSBjb25zdCB7IHJldHVybiBTdHJpbmdzOyB9CisgIGNvbnN0IENoZWNrc3Vtc1B0ciAmY2hlY2tzdW1zKCkgY29uc3QgeyByZXR1cm4gQ2hlY2tzdW1zOyB9CisKKyAgYm9vbCBoYXNTdHJpbmdzKCkgY29uc3QgeyByZXR1cm4gU3RyaW5ncyAhPSBudWxscHRyOyB9CisgIGJvb2wgaGFzQ2hlY2tzdW1zKCkgY29uc3QgeyByZXR1cm4gQ2hlY2tzdW1zICE9IG51bGxwdHI7IH0KKworcHJpdmF0ZToKKyAgU3RyaW5nc1B0ciBTdHJpbmdzOworICBDaGVja3N1bXNQdHIgQ2hlY2tzdW1zOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU1RSSU5HU0FORENIRUNLU1VNU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xEZXNlcmlhbGl6ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbERlc2VyaWFsaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NDc5ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xEZXNlcmlhbGl6ZXIuaApAQCAtMCwwICsxLDEwMCBAQAorLy89PT0tIFN5bWJvbERlc2VyaWFsaXplci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xERVNFUklBTElaRVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xERVNFUklBTElaRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmRNYXBwaW5nLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sVmlzaXRvckNhbGxiYWNrcy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFZpc2l0b3JEZWxlZ2F0ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlCeXRlU3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlYWRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworY2xhc3MgU3ltYm9sVmlzaXRvckRlbGVnYXRlOworY2xhc3MgU3ltYm9sRGVzZXJpYWxpemVyIDogcHVibGljIFN5bWJvbFZpc2l0b3JDYWxsYmFja3MgeworICBzdHJ1Y3QgTWFwcGluZ0luZm8geworICAgIE1hcHBpbmdJbmZvKEFycmF5UmVmPHVpbnQ4X3Q+IFJlY29yZERhdGEsIENvZGVWaWV3Q29udGFpbmVyIENvbnRhaW5lcikKKyAgICAgICAgOiBTdHJlYW0oUmVjb3JkRGF0YSwgbGx2bTo6c3VwcG9ydDo6bGl0dGxlKSwgUmVhZGVyKFN0cmVhbSksCisgICAgICAgICAgTWFwcGluZyhSZWFkZXIsIENvbnRhaW5lcikge30KKworICAgIEJpbmFyeUJ5dGVTdHJlYW0gU3RyZWFtOworICAgIEJpbmFyeVN0cmVhbVJlYWRlciBSZWFkZXI7CisgICAgU3ltYm9sUmVjb3JkTWFwcGluZyBNYXBwaW5nOworICB9OworCitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGF0aWMgRXJyb3IgZGVzZXJpYWxpemVBcyhDVlN5bWJvbCBTeW1ib2wsIFQgJlJlY29yZCkgeworICAgIC8vIElmIHdlJ3JlIGp1c3QgZGVzZXJpYWxpemluZyBvbmUgcmVjb3JkLCB0aGVuIGRvbid0IHdvcnJ5IGFib3V0IGFsaWdubWVudAorICAgIC8vIGFzIHRoZXJlJ3Mgbm90aGluZyB0aGF0IGNvbWVzIGFmdGVyLgorICAgIFN5bWJvbERlc2VyaWFsaXplciBTKG51bGxwdHIsIENvZGVWaWV3Q29udGFpbmVyOjpPYmplY3RGaWxlKTsKKyAgICBpZiAoYXV0byBFQyA9IFMudmlzaXRTeW1ib2xCZWdpbihTeW1ib2wpKQorICAgICAgcmV0dXJuIEVDOworICAgIGlmIChhdXRvIEVDID0gUy52aXNpdEtub3duUmVjb3JkKFN5bWJvbCwgUmVjb3JkKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICBpZiAoYXV0byBFQyA9IFMudmlzaXRTeW1ib2xFbmQoU3ltYm9sKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RhdGljIEV4cGVjdGVkPFQ+IGRlc2VyaWFsaXplQXMoQ1ZTeW1ib2wgU3ltYm9sKSB7CisgICAgVCBSZWNvcmQoU3ltYm9sLmtpbmQoKSk7CisgICAgaWYgKGF1dG8gRUMgPSBkZXNlcmlhbGl6ZUFzPFQ+KFN5bWJvbCwgUmVjb3JkKSkKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoRUMpOworICAgIHJldHVybiBSZWNvcmQ7CisgIH0KKworICBleHBsaWNpdCBTeW1ib2xEZXNlcmlhbGl6ZXIoU3ltYm9sVmlzaXRvckRlbGVnYXRlICpEZWxlZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVWaWV3Q29udGFpbmVyIENvbnRhaW5lcikKKyAgICAgIDogRGVsZWdhdGUoRGVsZWdhdGUpLCBDb250YWluZXIoQ29udGFpbmVyKSB7fQorCisgIEVycm9yIHZpc2l0U3ltYm9sQmVnaW4oQ1ZTeW1ib2wgJlJlY29yZCwgdWludDMyX3QgT2Zmc2V0KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIHZpc2l0U3ltYm9sQmVnaW4oUmVjb3JkKTsKKyAgfQorCisgIEVycm9yIHZpc2l0U3ltYm9sQmVnaW4oQ1ZTeW1ib2wgJlJlY29yZCkgb3ZlcnJpZGUgeworICAgIGFzc2VydCghTWFwcGluZyAmJiAiQWxyZWFkeSBpbiBhIHN5bWJvbCBtYXBwaW5nISIpOworICAgIE1hcHBpbmcgPSBsbHZtOjptYWtlX3VuaXF1ZTxNYXBwaW5nSW5mbz4oUmVjb3JkLmNvbnRlbnQoKSwgQ29udGFpbmVyKTsKKyAgICByZXR1cm4gTWFwcGluZy0+TWFwcGluZy52aXNpdFN5bWJvbEJlZ2luKFJlY29yZCk7CisgIH0KKyAgRXJyb3IgdmlzaXRTeW1ib2xFbmQoQ1ZTeW1ib2wgJlJlY29yZCkgb3ZlcnJpZGUgeworICAgIGFzc2VydChNYXBwaW5nICYmICJOb3QgaW4gYSBzeW1ib2wgbWFwcGluZyEiKTsKKyAgICBhdXRvIEVDID0gTWFwcGluZy0+TWFwcGluZy52aXNpdFN5bWJvbEVuZChSZWNvcmQpOworICAgIE1hcHBpbmcucmVzZXQoKTsKKyAgICByZXR1cm4gRUM7CisgIH0KKworI2RlZmluZSBTWU1CT0xfUkVDT1JEKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRXJyb3IgdmlzaXRLbm93blJlY29yZChDVlN5bWJvbCAmQ1ZSLCBOYW1lICZSZWNvcmQpIG92ZXJyaWRlIHsgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHZpc2l0S25vd25SZWNvcmRJbXBsKENWUiwgUmVjb3JkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIFNZTUJPTF9SRUNPUkRfQUxJQVMoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUsIEFsaWFzTmFtZSkKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld1N5bWJvbHMuZGVmIgorCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRXJyb3IgdmlzaXRLbm93blJlY29yZEltcGwoQ1ZTeW1ib2wgJkNWUiwgVCAmUmVjb3JkKSB7CisKKyAgICBSZWNvcmQuUmVjb3JkT2Zmc2V0ID0KKyAgICAgICAgRGVsZWdhdGUgPyBEZWxlZ2F0ZS0+Z2V0UmVjb3JkT2Zmc2V0KE1hcHBpbmctPlJlYWRlcikgOiAwOworICAgIGlmIChhdXRvIEVDID0gTWFwcGluZy0+TWFwcGluZy52aXNpdEtub3duUmVjb3JkKENWUiwgUmVjb3JkKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIFN5bWJvbFZpc2l0b3JEZWxlZ2F0ZSAqRGVsZWdhdGU7CisgIENvZGVWaWV3Q29udGFpbmVyIENvbnRhaW5lcjsKKyAgc3RkOjp1bmlxdWVfcHRyPE1hcHBpbmdJbmZvPiBNYXBwaW5nOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xEdW1wRGVsZWdhdGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbER1bXBEZWxlZ2F0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMzYzNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xEdW1wRGVsZWdhdGUuaApAQCAtMCwwICsxLDM1IEBACisvLz09PS0tIFN5bWJvbER1bXBEZWxlZ2F0ZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NZTUJPTERVTVBERUxFR0FURV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NZTUJPTERVTVBERUxFR0FURV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFZpc2l0b3JEZWxlZ2F0ZS5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIFN5bWJvbER1bXBEZWxlZ2F0ZSA6IHB1YmxpYyBTeW1ib2xWaXNpdG9yRGVsZWdhdGUgeworcHVibGljOgorICB+U3ltYm9sRHVtcERlbGVnYXRlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIHZpcnR1YWwgdm9pZCBwcmludFJlbG9jYXRlZEZpZWxkKFN0cmluZ1JlZiBMYWJlbCwgdWludDMyX3QgUmVsb2NPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICpSZWxvY1N5bSA9IG51bGxwdHIpID0gMDsKKyAgdmlydHVhbCB2b2lkIHByaW50QmluYXJ5QmxvY2tXaXRoUmVsb2NzKFN0cmluZ1JlZiBMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+IEJsb2NrKSA9IDA7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xEVU1QREVMRUdBVEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sRHVtcGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xEdW1wZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTNkYWE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sRHVtcGVyLmgKQEAgLTAsMCArMSw1NyBAQAorLy89PT0tLSBTeW1ib2xEdW1wZXIuaCAtIENvZGVWaWV3IHN5bWJvbCBpbmZvIGR1bXBlciAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xEVU1QRVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xEVU1QRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xEdW1wRGVsZWdhdGUuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXguaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU2NvcGVkUHJpbnRlcjsKKworbmFtZXNwYWNlIGNvZGV2aWV3IHsKK2NsYXNzIFR5cGVDb2xsZWN0aW9uOworCisvLy8gRHVtcGVyIGZvciBDb2RlVmlldyBzeW1ib2wgc3RyZWFtcyBmb3VuZCBpbiBDT0ZGIG9iamVjdCBmaWxlcyBhbmQgUERCIGZpbGVzLgorY2xhc3MgQ1ZTeW1ib2xEdW1wZXIgeworcHVibGljOgorICBDVlN5bWJvbER1bXBlcihTY29wZWRQcmludGVyICZXLCBUeXBlQ29sbGVjdGlvbiAmVHlwZXMsCisgICAgICAgICAgICAgICAgIENvZGVWaWV3Q29udGFpbmVyIENvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFN5bWJvbER1bXBEZWxlZ2F0ZT4gT2JqRGVsZWdhdGUsCisgICAgICAgICAgICAgICAgIGJvb2wgUHJpbnRSZWNvcmRCeXRlcykKKyAgICAgIDogVyhXKSwgVHlwZXMoVHlwZXMpLCBDb250YWluZXIoQ29udGFpbmVyKSwKKyAgICAgICAgT2JqRGVsZWdhdGUoc3RkOjptb3ZlKE9iakRlbGVnYXRlKSksCisgICAgICAgIFByaW50UmVjb3JkQnl0ZXMoUHJpbnRSZWNvcmRCeXRlcykge30KKworICAvLy8gRHVtcHMgb25lIHR5cGUgcmVjb3JkLiAgUmV0dXJucyBmYWxzZSBpZiB0aGVyZSB3YXMgYSB0eXBlIHBhcnNpbmcgZXJyb3IsCisgIC8vLyBhbmQgdHJ1ZSBvdGhlcndpc2UuICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgaW4gb3JkZXIsIHNpbmNlIHRoZSBkdW1wZXIKKyAgLy8vIG1haW50YWlucyBzdGF0ZSBhYm91dCBwcmV2aW91cyByZWNvcmRzIHdoaWNoIGFyZSBuZWNlc3NhcnkgZm9yIGNyb3NzCisgIC8vLyB0eXBlIHJlZmVyZW5jZXMuCisgIEVycm9yIGR1bXAoQ1ZSZWNvcmQ8U3ltYm9sS2luZD4gJlJlY29yZCk7CisKKyAgLy8vIER1bXBzIHRoZSB0eXBlIHJlY29yZHMgaW4gRGF0YS4gUmV0dXJucyBmYWxzZSBpZiB0aGVyZSB3YXMgYSB0eXBlIHN0cmVhbQorICAvLy8gcGFyc2UgZXJyb3IsIGFuZCB0cnVlIG90aGVyd2lzZS4KKyAgRXJyb3IgZHVtcChjb25zdCBDVlN5bWJvbEFycmF5ICZTeW1ib2xzKTsKKworcHJpdmF0ZToKKyAgU2NvcGVkUHJpbnRlciAmVzsKKyAgVHlwZUNvbGxlY3Rpb24gJlR5cGVzOworICBDb2RlVmlld0NvbnRhaW5lciBDb250YWluZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxTeW1ib2xEdW1wRGVsZWdhdGU+IE9iakRlbGVnYXRlOworCisgIGJvb2wgUHJpbnRSZWNvcmRCeXRlczsKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xEVU1QRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sUmVjb3JkLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjI2N2YyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sUmVjb3JkLmgKQEAgLTAsMCArMSw5NTYgQEAKKy8vPT09LSBTeW1ib2xSZWNvcmQuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU1lNQk9MUkVDT1JEX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU1lNQk9MUkVDT1JEX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FQU0ludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NWUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9SZWNvcmRTZXJpYWxpemF0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUluZGV4LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUFycmF5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBTeW1ib2xSZWNvcmQgeworcHJvdGVjdGVkOgorICBleHBsaWNpdCBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IEtpbmQoS2luZCkge30KKworcHVibGljOgorICBTeW1ib2xSZWNvcmRLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgU3ltYm9sUmVjb3JkS2luZCBLaW5kOworfTsKKworLy8gU19HUFJPQzMyLCBTX0xQUk9DMzIsIFNfR1BST0MzMl9JRCwgU19MUFJPQzMyX0lELCBTX0xQUk9DMzJfRFBDIG9yCisvLyBTX0xQUk9DMzJfRFBDX0lECitjbGFzcyBQcm9jU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgUmVsb2NhdGlvbk9mZnNldCA9IDMyOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFByb2NTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBQcm9jU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCwgdWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoS2luZCksIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgdWludDMyX3QgZ2V0UmVsb2NhdGlvbk9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVjb3JkT2Zmc2V0ICsgUmVsb2NhdGlvbk9mZnNldDsKKyAgfQorCisgIHVpbnQzMl90IFBhcmVudCA9IDA7CisgIHVpbnQzMl90IEVuZCA9IDA7CisgIHVpbnQzMl90IE5leHQgPSAwOworICB1aW50MzJfdCBDb2RlU2l6ZSA9IDA7CisgIHVpbnQzMl90IERiZ1N0YXJ0ID0gMDsKKyAgdWludDMyX3QgRGJnRW5kID0gMDsKKyAgVHlwZUluZGV4IEZ1bmN0aW9uVHlwZTsKKyAgdWludDMyX3QgQ29kZU9mZnNldCA9IDA7CisgIHVpbnQxNl90IFNlZ21lbnQgPSAwOworICBQcm9jU3ltRmxhZ3MgRmxhZ3MgPSBQcm9jU3ltRmxhZ3M6Ok5vbmU7CisgIFN0cmluZ1JlZiBOYW1lOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldCA9IDA7Cit9OworCisvLyBTX1RIVU5LMzIKK2NsYXNzIFRodW5rMzJTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgVGh1bmszMlN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIFRodW5rMzJTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kLCB1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChLaW5kKSwgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICB1aW50MzJfdCBQYXJlbnQ7CisgIHVpbnQzMl90IEVuZDsKKyAgdWludDMyX3QgTmV4dDsKKyAgdWludDMyX3QgT2Zmc2V0OworICB1aW50MTZfdCBTZWdtZW50OworICB1aW50MTZfdCBMZW5ndGg7CisgIFRodW5rT3JkaW5hbCBUaHVuazsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIEFycmF5UmVmPHVpbnQ4X3Q+IFZhcmlhbnREYXRhOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfVFJBTVBPTElORQorY2xhc3MgVHJhbXBvbGluZVN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBUcmFtcG9saW5lU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgVHJhbXBvbGluZVN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQsIHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKEtpbmQpLCBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIFRyYW1wb2xpbmVUeXBlIFR5cGU7CisgIHVpbnQxNl90IFNpemU7CisgIHVpbnQzMl90IFRodW5rT2Zmc2V0OworICB1aW50MzJfdCBUYXJnZXRPZmZzZXQ7CisgIHVpbnQxNl90IFRodW5rU2VjdGlvbjsKKyAgdWludDE2X3QgVGFyZ2V0U2VjdGlvbjsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX1NFQ1RJT04KK2NsYXNzIFNlY3Rpb25TeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgU2VjdGlvblN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIFNlY3Rpb25TeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kLCB1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChLaW5kKSwgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICB1aW50MTZfdCBTZWN0aW9uTnVtYmVyOworICB1aW50OF90IEFsaWdubWVudDsKKyAgdWludDMyX3QgUnZhOworICB1aW50MzJfdCBMZW5ndGg7CisgIHVpbnQzMl90IENoYXJhY3RlcmlzdGljczsKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19DT0ZGR1JPVVAKK2NsYXNzIENvZmZHcm91cFN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBDb2ZmR3JvdXBTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBDb2ZmR3JvdXBTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kLCB1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChLaW5kKSwgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICB1aW50MzJfdCBTaXplOworICB1aW50MzJfdCBDaGFyYWN0ZXJpc3RpY3M7CisgIHVpbnQzMl90IE9mZnNldDsKKyAgdWludDE2X3QgU2VnbWVudDsKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworY2xhc3MgU2NvcGVFbmRTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgU2NvcGVFbmRTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBTY29wZUVuZFN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQsIHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKEtpbmQpLCBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKK2NsYXNzIENhbGxlclN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBDYWxsZXJTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBDYWxsZXJTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kLCB1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChLaW5kKSwgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICBzdGQ6OnZlY3RvcjxUeXBlSW5kZXg+IEluZGljZXM7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworc3RydWN0IEJpbmFyeUFubm90YXRpb25JdGVyYXRvciB7CisgIHN0cnVjdCBBbm5vdGF0aW9uRGF0YSB7CisgICAgQmluYXJ5QW5ub3RhdGlvbnNPcENvZGUgT3BDb2RlOworICAgIFN0cmluZ1JlZiBOYW1lOworICAgIHVpbnQzMl90IFUxOworICAgIHVpbnQzMl90IFUyOworICAgIGludDMyX3QgUzE7CisgIH07CisKKyAgQmluYXJ5QW5ub3RhdGlvbkl0ZXJhdG9yKCkgPSBkZWZhdWx0OworICBCaW5hcnlBbm5vdGF0aW9uSXRlcmF0b3IoQXJyYXlSZWY8dWludDhfdD4gQW5ub3RhdGlvbnMpIDogRGF0YShBbm5vdGF0aW9ucykge30KKyAgQmluYXJ5QW5ub3RhdGlvbkl0ZXJhdG9yKGNvbnN0IEJpbmFyeUFubm90YXRpb25JdGVyYXRvciAmT3RoZXIpCisgICAgICA6IERhdGEoT3RoZXIuRGF0YSkge30KKworICBib29sIG9wZXJhdG9yPT0oQmluYXJ5QW5ub3RhdGlvbkl0ZXJhdG9yIE90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIERhdGEgPT0gT3RoZXIuRGF0YTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBCaW5hcnlBbm5vdGF0aW9uSXRlcmF0b3IgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gT3RoZXIpOworICB9CisKKyAgQmluYXJ5QW5ub3RhdGlvbkl0ZXJhdG9yICZvcGVyYXRvcj0oY29uc3QgQmluYXJ5QW5ub3RhdGlvbkl0ZXJhdG9yIE90aGVyKSB7CisgICAgRGF0YSA9IE90aGVyLkRhdGE7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQmluYXJ5QW5ub3RhdGlvbkl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgIGlmICghUGFyc2VDdXJyZW50QW5ub3RhdGlvbigpKSB7CisgICAgICAqdGhpcyA9IEJpbmFyeUFubm90YXRpb25JdGVyYXRvcigpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBEYXRhID0gTmV4dDsKKyAgICBOZXh0ID0gQXJyYXlSZWY8dWludDhfdD4oKTsKKyAgICBDdXJyZW50LnJlc2V0KCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQmluYXJ5QW5ub3RhdGlvbkl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CisgICAgQmluYXJ5QW5ub3RhdGlvbkl0ZXJhdG9yIE9yaWcoKnRoaXMpOworICAgICsrKCp0aGlzKTsKKyAgICByZXR1cm4gT3JpZzsKKyAgfQorCisgIGNvbnN0IEFubm90YXRpb25EYXRhICZvcGVyYXRvciooKSB7CisgICAgUGFyc2VDdXJyZW50QW5ub3RhdGlvbigpOworICAgIHJldHVybiBDdXJyZW50LmdldFZhbHVlKCk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RhdGljIHVpbnQzMl90IEdldENvbXByZXNzZWRBbm5vdGF0aW9uKEFycmF5UmVmPHVpbnQ4X3Q+ICZBbm5vdGF0aW9ucykgeworICAgIGlmIChBbm5vdGF0aW9ucy5lbXB0eSgpKQorICAgICAgcmV0dXJuIC0xOworCisgICAgdWludDhfdCBGaXJzdEJ5dGUgPSBBbm5vdGF0aW9ucy5mcm9udCgpOworICAgIEFubm90YXRpb25zID0gQW5ub3RhdGlvbnMuZHJvcF9mcm9udCgpOworCisgICAgaWYgKChGaXJzdEJ5dGUgJiAweDgwKSA9PSAweDAwKQorICAgICAgcmV0dXJuIEZpcnN0Qnl0ZTsKKworICAgIGlmIChBbm5vdGF0aW9ucy5lbXB0eSgpKQorICAgICAgcmV0dXJuIC0xOworCisgICAgdWludDhfdCBTZWNvbmRCeXRlID0gQW5ub3RhdGlvbnMuZnJvbnQoKTsKKyAgICBBbm5vdGF0aW9ucyA9IEFubm90YXRpb25zLmRyb3BfZnJvbnQoKTsKKworICAgIGlmICgoRmlyc3RCeXRlICYgMHhDMCkgPT0gMHg4MCkKKyAgICAgIHJldHVybiAoKEZpcnN0Qnl0ZSAmIDB4M0YpIDw8IDgpIHwgU2Vjb25kQnl0ZTsKKworICAgIGlmIChBbm5vdGF0aW9ucy5lbXB0eSgpKQorICAgICAgcmV0dXJuIC0xOworCisgICAgdWludDhfdCBUaGlyZEJ5dGUgPSBBbm5vdGF0aW9ucy5mcm9udCgpOworICAgIEFubm90YXRpb25zID0gQW5ub3RhdGlvbnMuZHJvcF9mcm9udCgpOworCisgICAgaWYgKEFubm90YXRpb25zLmVtcHR5KCkpCisgICAgICByZXR1cm4gLTE7CisKKyAgICB1aW50OF90IEZvdXJ0aEJ5dGUgPSBBbm5vdGF0aW9ucy5mcm9udCgpOworICAgIEFubm90YXRpb25zID0gQW5ub3RhdGlvbnMuZHJvcF9mcm9udCgpOworCisgICAgaWYgKChGaXJzdEJ5dGUgJiAweEUwKSA9PSAweEMwKQorICAgICAgcmV0dXJuICgoRmlyc3RCeXRlICYgMHgxRikgPDwgMjQpIHwgKFNlY29uZEJ5dGUgPDwgMTYpIHwKKyAgICAgICAgICAgICAoVGhpcmRCeXRlIDw8IDgpIHwgRm91cnRoQnl0ZTsKKworICAgIHJldHVybiAtMTsKKyAgfTsKKworICBzdGF0aWMgaW50MzJfdCBEZWNvZGVTaWduZWRPcGVyYW5kKHVpbnQzMl90IE9wZXJhbmQpIHsKKyAgICBpZiAoT3BlcmFuZCAmIDEpCisgICAgICByZXR1cm4gLShPcGVyYW5kID4+IDEpOworICAgIHJldHVybiBPcGVyYW5kID4+IDE7CisgIH07CisKKyAgc3RhdGljIGludDMyX3QgRGVjb2RlU2lnbmVkT3BlcmFuZChBcnJheVJlZjx1aW50OF90PiAmQW5ub3RhdGlvbnMpIHsKKyAgICByZXR1cm4gRGVjb2RlU2lnbmVkT3BlcmFuZChHZXRDb21wcmVzc2VkQW5ub3RhdGlvbihBbm5vdGF0aW9ucykpOworICB9OworCisgIGJvb2wgUGFyc2VDdXJyZW50QW5ub3RhdGlvbigpIHsKKyAgICBpZiAoQ3VycmVudC5oYXNWYWx1ZSgpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBOZXh0ID0gRGF0YTsKKyAgICB1aW50MzJfdCBPcCA9IEdldENvbXByZXNzZWRBbm5vdGF0aW9uKE5leHQpOworICAgIEFubm90YXRpb25EYXRhIFJlc3VsdDsKKyAgICBSZXN1bHQuT3BDb2RlID0gc3RhdGljX2Nhc3Q8QmluYXJ5QW5ub3RhdGlvbnNPcENvZGU+KE9wKTsKKyAgICBzd2l0Y2ggKFJlc3VsdC5PcENvZGUpIHsKKyAgICBjYXNlIEJpbmFyeUFubm90YXRpb25zT3BDb2RlOjpJbnZhbGlkOgorICAgICAgUmVzdWx0Lk5hbWUgPSAiSW52YWxpZCI7CisgICAgICBOZXh0ID0gQXJyYXlSZWY8dWludDhfdD4oKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQmluYXJ5QW5ub3RhdGlvbnNPcENvZGU6OkNvZGVPZmZzZXQ6CisgICAgICBSZXN1bHQuTmFtZSA9ICJDb2RlT2Zmc2V0IjsKKyAgICAgIFJlc3VsdC5VMSA9IEdldENvbXByZXNzZWRBbm5vdGF0aW9uKE5leHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlBbm5vdGF0aW9uc09wQ29kZTo6Q2hhbmdlQ29kZU9mZnNldEJhc2U6CisgICAgICBSZXN1bHQuTmFtZSA9ICJDaGFuZ2VDb2RlT2Zmc2V0QmFzZSI7CisgICAgICBSZXN1bHQuVTEgPSBHZXRDb21wcmVzc2VkQW5ub3RhdGlvbihOZXh0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQmluYXJ5QW5ub3RhdGlvbnNPcENvZGU6OkNoYW5nZUNvZGVPZmZzZXQ6CisgICAgICBSZXN1bHQuTmFtZSA9ICJDaGFuZ2VDb2RlT2Zmc2V0IjsKKyAgICAgIFJlc3VsdC5VMSA9IEdldENvbXByZXNzZWRBbm5vdGF0aW9uKE5leHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlBbm5vdGF0aW9uc09wQ29kZTo6Q2hhbmdlQ29kZUxlbmd0aDoKKyAgICAgIFJlc3VsdC5OYW1lID0gIkNoYW5nZUNvZGVMZW5ndGgiOworICAgICAgUmVzdWx0LlUxID0gR2V0Q29tcHJlc3NlZEFubm90YXRpb24oTmV4dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpbmFyeUFubm90YXRpb25zT3BDb2RlOjpDaGFuZ2VGaWxlOgorICAgICAgUmVzdWx0Lk5hbWUgPSAiQ2hhbmdlRmlsZSI7CisgICAgICBSZXN1bHQuVTEgPSBHZXRDb21wcmVzc2VkQW5ub3RhdGlvbihOZXh0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQmluYXJ5QW5ub3RhdGlvbnNPcENvZGU6OkNoYW5nZUxpbmVFbmREZWx0YToKKyAgICAgIFJlc3VsdC5OYW1lID0gIkNoYW5nZUxpbmVFbmREZWx0YSI7CisgICAgICBSZXN1bHQuVTEgPSBHZXRDb21wcmVzc2VkQW5ub3RhdGlvbihOZXh0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQmluYXJ5QW5ub3RhdGlvbnNPcENvZGU6OkNoYW5nZVJhbmdlS2luZDoKKyAgICAgIFJlc3VsdC5OYW1lID0gIkNoYW5nZVJhbmdlS2luZCI7CisgICAgICBSZXN1bHQuVTEgPSBHZXRDb21wcmVzc2VkQW5ub3RhdGlvbihOZXh0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQmluYXJ5QW5ub3RhdGlvbnNPcENvZGU6OkNoYW5nZUNvbHVtblN0YXJ0OgorICAgICAgUmVzdWx0Lk5hbWUgPSAiQ2hhbmdlQ29sdW1uU3RhcnQiOworICAgICAgUmVzdWx0LlUxID0gR2V0Q29tcHJlc3NlZEFubm90YXRpb24oTmV4dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpbmFyeUFubm90YXRpb25zT3BDb2RlOjpDaGFuZ2VDb2x1bW5FbmQ6CisgICAgICBSZXN1bHQuTmFtZSA9ICJDaGFuZ2VDb2x1bW5FbmQiOworICAgICAgUmVzdWx0LlUxID0gR2V0Q29tcHJlc3NlZEFubm90YXRpb24oTmV4dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpbmFyeUFubm90YXRpb25zT3BDb2RlOjpDaGFuZ2VMaW5lT2Zmc2V0OgorICAgICAgUmVzdWx0Lk5hbWUgPSAiQ2hhbmdlTGluZU9mZnNldCI7CisgICAgICBSZXN1bHQuUzEgPSBEZWNvZGVTaWduZWRPcGVyYW5kKE5leHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlBbm5vdGF0aW9uc09wQ29kZTo6Q2hhbmdlQ29sdW1uRW5kRGVsdGE6CisgICAgICBSZXN1bHQuTmFtZSA9ICJDaGFuZ2VDb2x1bW5FbmREZWx0YSI7CisgICAgICBSZXN1bHQuUzEgPSBEZWNvZGVTaWduZWRPcGVyYW5kKE5leHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlBbm5vdGF0aW9uc09wQ29kZTo6Q2hhbmdlQ29kZU9mZnNldEFuZExpbmVPZmZzZXQ6IHsKKyAgICAgIFJlc3VsdC5OYW1lID0gIkNoYW5nZUNvZGVPZmZzZXRBbmRMaW5lT2Zmc2V0IjsKKyAgICAgIHVpbnQzMl90IEFubm90YXRpb24gPSBHZXRDb21wcmVzc2VkQW5ub3RhdGlvbihOZXh0KTsKKyAgICAgIFJlc3VsdC5TMSA9IERlY29kZVNpZ25lZE9wZXJhbmQoQW5ub3RhdGlvbiA+PiA0KTsKKyAgICAgIFJlc3VsdC5VMSA9IEFubm90YXRpb24gJiAweGY7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCaW5hcnlBbm5vdGF0aW9uc09wQ29kZTo6Q2hhbmdlQ29kZUxlbmd0aEFuZENvZGVPZmZzZXQ6IHsKKyAgICAgIFJlc3VsdC5OYW1lID0gIkNoYW5nZUNvZGVMZW5ndGhBbmRDb2RlT2Zmc2V0IjsKKyAgICAgIFJlc3VsdC5VMSA9IEdldENvbXByZXNzZWRBbm5vdGF0aW9uKE5leHQpOworICAgICAgUmVzdWx0LlUyID0gR2V0Q29tcHJlc3NlZEFubm90YXRpb24oTmV4dCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIEN1cnJlbnQgPSBSZXN1bHQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBPcHRpb25hbDxBbm5vdGF0aW9uRGF0YT4gQ3VycmVudDsKKyAgQXJyYXlSZWY8dWludDhfdD4gRGF0YTsKKyAgQXJyYXlSZWY8dWludDhfdD4gTmV4dDsKK307CisKKy8vIFNfSU5MSU5FU0lURQorY2xhc3MgSW5saW5lU2l0ZVN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBJbmxpbmVTaXRlU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgSW5saW5lU2l0ZVN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpJbmxpbmVTaXRlU3ltKSwKKyAgICAgICAgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICBpdGVyYXRvcl9yYW5nZTxCaW5hcnlBbm5vdGF0aW9uSXRlcmF0b3I+IGFubm90YXRpb25zKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKEJpbmFyeUFubm90YXRpb25JdGVyYXRvcihBbm5vdGF0aW9uRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5QW5ub3RhdGlvbkl0ZXJhdG9yKCkpOworICB9CisKKyAgdWludDMyX3QgUGFyZW50OworICB1aW50MzJfdCBFbmQ7CisgIFR5cGVJbmRleCBJbmxpbmVlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBBbm5vdGF0aW9uRGF0YTsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX1BVQjMyCitjbGFzcyBQdWJsaWNTeW0zMiA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBQdWJsaWNTeW0zMihTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIGV4cGxpY2l0IFB1YmxpY1N5bTMyKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OlB1YmxpY1N5bTMyKSwKKyAgICAgICAgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICBQdWJsaWNTeW1GbGFncyBGbGFncyA9IFB1YmxpY1N5bUZsYWdzOjpOb25lOworICB1aW50MzJfdCBPZmZzZXQgPSAwOworICB1aW50MTZfdCBTZWdtZW50ID0gMDsKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0ID0gMDsKK307CisKKy8vIFNfUkVHSVNURVIKK2NsYXNzIFJlZ2lzdGVyU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFJlZ2lzdGVyU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgUmVnaXN0ZXJTeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6UmVnaXN0ZXJTeW0pLAorICAgICAgICBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIFR5cGVJbmRleCBJbmRleDsKKyAgUmVnaXN0ZXJJZCBSZWdpc3RlcjsKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19QUk9DUkVGLCBTX0xQUk9DUkVGCitjbGFzcyBQcm9jUmVmU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFByb2NSZWZTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBleHBsaWNpdCBQcm9jUmVmU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OlByb2NSZWZTeW0pLCBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7CisgIH0KKworICB1aW50MzJfdCBTdW1OYW1lOworICB1aW50MzJfdCBTeW1PZmZzZXQ7CisgIHVpbnQxNl90IE1vZHVsZTsKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19MT0NBTAorY2xhc3MgTG9jYWxTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgTG9jYWxTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBleHBsaWNpdCBMb2NhbFN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpMb2NhbFN5bSksIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgVHlwZUluZGV4IFR5cGU7CisgIExvY2FsU3ltRmxhZ3MgRmxhZ3M7CisgIFN0cmluZ1JlZiBOYW1lOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKK3N0cnVjdCBMb2NhbFZhcmlhYmxlQWRkclJhbmdlIHsKKyAgdWludDMyX3QgT2Zmc2V0U3RhcnQ7CisgIHVpbnQxNl90IElTZWN0U3RhcnQ7CisgIHVpbnQxNl90IFJhbmdlOworfTsKKworc3RydWN0IExvY2FsVmFyaWFibGVBZGRyR2FwIHsKKyAgdWludDE2X3QgR2FwU3RhcnRPZmZzZXQ7CisgIHVpbnQxNl90IFJhbmdlOworfTsKKworZW51bSA6IHVpbnQxNl90IHsgTWF4RGVmUmFuZ2UgPSAweGYwMDAgfTsKKworLy8gU19ERUZSQU5HRQorY2xhc3MgRGVmUmFuZ2VTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBSZWxvY2F0aW9uT2Zmc2V0ID0gODsKKworcHVibGljOgorICBleHBsaWNpdCBEZWZSYW5nZVN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIGV4cGxpY2l0IERlZlJhbmdlU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OkRlZlJhbmdlU3ltKSwKKyAgICAgICAgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICB1aW50MzJfdCBnZXRSZWxvY2F0aW9uT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBSZWNvcmRPZmZzZXQgKyBSZWxvY2F0aW9uT2Zmc2V0OworICB9CisKKyAgdWludDMyX3QgUHJvZ3JhbTsKKyAgTG9jYWxWYXJpYWJsZUFkZHJSYW5nZSBSYW5nZTsKKyAgc3RkOjp2ZWN0b3I8TG9jYWxWYXJpYWJsZUFkZHJHYXA+IEdhcHM7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19ERUZSQU5HRV9TVUJGSUVMRAorY2xhc3MgRGVmUmFuZ2VTdWJmaWVsZFN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFJlbG9jYXRpb25PZmZzZXQgPSAxMjsKKworcHVibGljOgorICBleHBsaWNpdCBEZWZSYW5nZVN1YmZpZWxkU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgRGVmUmFuZ2VTdWJmaWVsZFN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpEZWZSYW5nZVN1YmZpZWxkU3ltKSwKKyAgICAgICAgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICB1aW50MzJfdCBnZXRSZWxvY2F0aW9uT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBSZWNvcmRPZmZzZXQgKyBSZWxvY2F0aW9uT2Zmc2V0OworICB9CisKKyAgdWludDMyX3QgUHJvZ3JhbTsKKyAgdWludDE2X3QgT2Zmc2V0SW5QYXJlbnQ7CisgIExvY2FsVmFyaWFibGVBZGRyUmFuZ2UgUmFuZ2U7CisgIHN0ZDo6dmVjdG9yPExvY2FsVmFyaWFibGVBZGRyR2FwPiBHYXBzOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfREVGUkFOR0VfUkVHSVNURVIKK2NsYXNzIERlZlJhbmdlUmVnaXN0ZXJTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKK3B1YmxpYzoKKyAgc3RydWN0IEhlYWRlciB7CisgICAgdWxpdHRsZTE2X3QgUmVnaXN0ZXI7CisgICAgdWxpdHRsZTE2X3QgTWF5SGF2ZU5vTmFtZTsKKyAgfTsKKworICBleHBsaWNpdCBEZWZSYW5nZVJlZ2lzdGVyU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgRGVmUmFuZ2VSZWdpc3RlclN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpEZWZSYW5nZVJlZ2lzdGVyU3ltKSwKKyAgICAgICAgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICB1aW50MzJfdCBnZXRSZWxvY2F0aW9uT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gUmVjb3JkT2Zmc2V0ICsgc2l6ZW9mKEhlYWRlcik7IH0KKworICBIZWFkZXIgSGRyOworICBMb2NhbFZhcmlhYmxlQWRkclJhbmdlIFJhbmdlOworICBzdGQ6OnZlY3RvcjxMb2NhbFZhcmlhYmxlQWRkckdhcD4gR2FwczsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0RFRlJBTkdFX1NVQkZJRUxEX1JFR0lTVEVSCitjbGFzcyBEZWZSYW5nZVN1YmZpZWxkUmVnaXN0ZXJTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKK3B1YmxpYzoKKyAgc3RydWN0IEhlYWRlciB7CisgICAgdWxpdHRsZTE2X3QgUmVnaXN0ZXI7CisgICAgdWxpdHRsZTE2X3QgTWF5SGF2ZU5vTmFtZTsKKyAgICB1bGl0dGxlMzJfdCBPZmZzZXRJblBhcmVudDsKKyAgfTsKKworICBleHBsaWNpdCBEZWZSYW5nZVN1YmZpZWxkUmVnaXN0ZXJTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKQorICAgICAgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgRGVmUmFuZ2VTdWJmaWVsZFJlZ2lzdGVyU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OkRlZlJhbmdlU3ViZmllbGRSZWdpc3RlclN5bSksCisgICAgICAgIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgdWludDMyX3QgZ2V0UmVsb2NhdGlvbk9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIFJlY29yZE9mZnNldCArIHNpemVvZihIZWFkZXIpOyB9CisKKyAgSGVhZGVyIEhkcjsKKyAgTG9jYWxWYXJpYWJsZUFkZHJSYW5nZSBSYW5nZTsKKyAgc3RkOjp2ZWN0b3I8TG9jYWxWYXJpYWJsZUFkZHJHYXA+IEdhcHM7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19ERUZSQU5HRV9GUkFNRVBPSU5URVJfUkVMCitjbGFzcyBEZWZSYW5nZUZyYW1lUG9pbnRlclJlbFN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFJlbG9jYXRpb25PZmZzZXQgPSA4OworCitwdWJsaWM6CisgIGV4cGxpY2l0IERlZlJhbmdlRnJhbWVQb2ludGVyUmVsU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIERlZlJhbmdlRnJhbWVQb2ludGVyUmVsU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OkRlZlJhbmdlRnJhbWVQb2ludGVyUmVsU3ltKSwKKyAgICAgICAgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICB1aW50MzJfdCBnZXRSZWxvY2F0aW9uT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBSZWNvcmRPZmZzZXQgKyBSZWxvY2F0aW9uT2Zmc2V0OworICB9CisKKyAgaW50MzJfdCBPZmZzZXQ7CisgIExvY2FsVmFyaWFibGVBZGRyUmFuZ2UgUmFuZ2U7CisgIHN0ZDo6dmVjdG9yPExvY2FsVmFyaWFibGVBZGRyR2FwPiBHYXBzOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfREVGUkFOR0VfUkVHSVNURVJfUkVMCitjbGFzcyBEZWZSYW5nZVJlZ2lzdGVyUmVsU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CitwdWJsaWM6CisgIHN0cnVjdCBIZWFkZXIgeworICAgIHVsaXR0bGUxNl90IFJlZ2lzdGVyOworICAgIHVsaXR0bGUxNl90IEZsYWdzOworICAgIGxpdHRsZTMyX3QgQmFzZVBvaW50ZXJPZmZzZXQ7CisgIH07CisKKyAgZXhwbGljaXQgRGVmUmFuZ2VSZWdpc3RlclJlbFN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIGV4cGxpY2l0IERlZlJhbmdlUmVnaXN0ZXJSZWxTeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6RGVmUmFuZ2VSZWdpc3RlclJlbFN5bSksCisgICAgICAgIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgLy8gVGhlIGZsYWdzIGltcGxlbWVudCB0aGlzIG5vdGlvbmFsIGJpdGZpZWxkOgorICAvLyAgIHVpbnQxNl90IElzU3ViZmllbGQgOiAxOworICAvLyAgIHVpbnQxNl90IFBhZGRpbmcgOiAzOworICAvLyAgIHVpbnQxNl90IE9mZnNldEluUGFyZW50IDogMTI7CisgIGVudW0gOiB1aW50MTZfdCB7CisgICAgSXNTdWJmaWVsZEZsYWcgPSAxLAorICAgIE9mZnNldEluUGFyZW50U2hpZnQgPSA0LAorICB9OworCisgIGJvb2wgaGFzU3BpbGxlZFVEVE1lbWJlcigpIGNvbnN0IHsgcmV0dXJuIEhkci5GbGFncyAmIElzU3ViZmllbGRGbGFnOyB9CisgIHVpbnQxNl90IG9mZnNldEluUGFyZW50KCkgY29uc3QgeyByZXR1cm4gSGRyLkZsYWdzID4+IE9mZnNldEluUGFyZW50U2hpZnQ7IH0KKworICB1aW50MzJfdCBnZXRSZWxvY2F0aW9uT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gUmVjb3JkT2Zmc2V0ICsgc2l6ZW9mKEhlYWRlcik7IH0KKworICBIZWFkZXIgSGRyOworICBMb2NhbFZhcmlhYmxlQWRkclJhbmdlIFJhbmdlOworICBzdGQ6OnZlY3RvcjxMb2NhbFZhcmlhYmxlQWRkckdhcD4gR2FwczsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0RFRlJBTkdFX0ZSQU1FUE9JTlRFUl9SRUxfRlVMTF9TQ09QRQorY2xhc3MgRGVmUmFuZ2VGcmFtZVBvaW50ZXJSZWxGdWxsU2NvcGVTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRGVmUmFuZ2VGcmFtZVBvaW50ZXJSZWxGdWxsU2NvcGVTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKQorICAgICAgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgZXhwbGljaXQgRGVmUmFuZ2VGcmFtZVBvaW50ZXJSZWxGdWxsU2NvcGVTeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6RGVmUmFuZ2VGcmFtZVBvaW50ZXJSZWxGdWxsU2NvcGVTeW0pLAorICAgICAgICBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIGludDMyX3QgT2Zmc2V0OworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfQkxPQ0szMgorY2xhc3MgQmxvY2tTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBSZWxvY2F0aW9uT2Zmc2V0ID0gMTY7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgQmxvY2tTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBleHBsaWNpdCBCbG9ja1N5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpCbG9ja1N5bSksIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgdWludDMyX3QgZ2V0UmVsb2NhdGlvbk9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVjb3JkT2Zmc2V0ICsgUmVsb2NhdGlvbk9mZnNldDsKKyAgfQorCisgIHVpbnQzMl90IFBhcmVudDsKKyAgdWludDMyX3QgRW5kOworICB1aW50MzJfdCBDb2RlU2l6ZTsKKyAgdWludDMyX3QgQ29kZU9mZnNldDsKKyAgdWludDE2X3QgU2VnbWVudDsKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19MQUJFTDMyCitjbGFzcyBMYWJlbFN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFJlbG9jYXRpb25PZmZzZXQgPSA0OworCitwdWJsaWM6CisgIGV4cGxpY2l0IExhYmVsU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgZXhwbGljaXQgTGFiZWxTeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6TGFiZWxTeW0pLCBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIHVpbnQzMl90IGdldFJlbG9jYXRpb25PZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlY29yZE9mZnNldCArIFJlbG9jYXRpb25PZmZzZXQ7CisgIH0KKworICB1aW50MzJfdCBDb2RlT2Zmc2V0OworICB1aW50MTZfdCBTZWdtZW50OworICBQcm9jU3ltRmxhZ3MgRmxhZ3M7CisgIFN0cmluZ1JlZiBOYW1lOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfT0JKTkFNRQorY2xhc3MgT2JqTmFtZVN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBPYmpOYW1lU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgT2JqTmFtZVN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpPYmpOYW1lU3ltKSwgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkgeworICB9CisKKyAgdWludDMyX3QgU2lnbmF0dXJlOworICBTdHJpbmdSZWYgTmFtZTsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0VOVkJMT0NLCitjbGFzcyBFbnZCbG9ja1N5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBFbnZCbG9ja1N5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIEVudkJsb2NrU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OkVudkJsb2NrU3ltKSwKKyAgICAgICAgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IEZpZWxkczsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0VYUE9SVAorY2xhc3MgRXhwb3J0U3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IEV4cG9ydFN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIEV4cG9ydFN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpFeHBvcnRTeW0pLCBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIHVpbnQxNl90IE9yZGluYWw7CisgIEV4cG9ydEZsYWdzIEZsYWdzOworICBTdHJpbmdSZWYgTmFtZTsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0ZJTEVTVEFUSUMKK2NsYXNzIEZpbGVTdGF0aWNTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRmlsZVN0YXRpY1N5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIEZpbGVTdGF0aWNTeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6RmlsZVN0YXRpY1N5bSksCisgICAgICAgIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgVHlwZUluZGV4IEluZGV4OworICB1aW50MzJfdCBNb2RGaWxlbmFtZU9mZnNldDsKKyAgTG9jYWxTeW1GbGFncyBGbGFnczsKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19DT01QSUxFMgorY2xhc3MgQ29tcGlsZTJTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ29tcGlsZTJTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBDb21waWxlMlN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpDb21waWxlMlN5bSksCisgICAgICAgIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgQ29tcGlsZVN5bTJGbGFncyBGbGFnczsKKyAgQ1BVVHlwZSBNYWNoaW5lOworICB1aW50MTZfdCBWZXJzaW9uRnJvbnRlbmRNYWpvcjsKKyAgdWludDE2X3QgVmVyc2lvbkZyb250ZW5kTWlub3I7CisgIHVpbnQxNl90IFZlcnNpb25Gcm9udGVuZEJ1aWxkOworICB1aW50MTZfdCBWZXJzaW9uQmFja2VuZE1ham9yOworICB1aW50MTZfdCBWZXJzaW9uQmFja2VuZE1pbm9yOworICB1aW50MTZfdCBWZXJzaW9uQmFja2VuZEJ1aWxkOworICBTdHJpbmdSZWYgVmVyc2lvbjsKKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBFeHRyYVN0cmluZ3M7CisKKyAgdWludDhfdCBnZXRMYW5ndWFnZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihGbGFncykgJiAweEZGOyB9CisgIHVpbnQzMl90IGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEZsYWdzKSAmIH4weEZGOyB9CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19DT01QSUxFMworY2xhc3MgQ29tcGlsZTNTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ29tcGlsZTNTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBDb21waWxlM1N5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpDb21waWxlM1N5bSksCisgICAgICAgIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgQ29tcGlsZVN5bTNGbGFncyBGbGFnczsKKyAgQ1BVVHlwZSBNYWNoaW5lOworICB1aW50MTZfdCBWZXJzaW9uRnJvbnRlbmRNYWpvcjsKKyAgdWludDE2X3QgVmVyc2lvbkZyb250ZW5kTWlub3I7CisgIHVpbnQxNl90IFZlcnNpb25Gcm9udGVuZEJ1aWxkOworICB1aW50MTZfdCBWZXJzaW9uRnJvbnRlbmRRRkU7CisgIHVpbnQxNl90IFZlcnNpb25CYWNrZW5kTWFqb3I7CisgIHVpbnQxNl90IFZlcnNpb25CYWNrZW5kTWlub3I7CisgIHVpbnQxNl90IFZlcnNpb25CYWNrZW5kQnVpbGQ7CisgIHVpbnQxNl90IFZlcnNpb25CYWNrZW5kUUZFOworICBTdHJpbmdSZWYgVmVyc2lvbjsKKworICB2b2lkIHNldExhbmd1YWdlKFNvdXJjZUxhbmd1YWdlIExhbmcpIHsKKyAgICBGbGFncyA9IENvbXBpbGVTeW0zRmxhZ3MoKHVpbnQzMl90KEZsYWdzKSAmIDB4RkZGRkZGMDApIHwgdWludDMyX3QoTGFuZykpOworICB9CisKKyAgdWludDhfdCBnZXRMYW5ndWFnZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihGbGFncykgJiAweEZGOyB9CisgIHVpbnQzMl90IGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEZsYWdzKSAmIH4weEZGOyB9CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19GUkFNRVBST0MKK2NsYXNzIEZyYW1lUHJvY1N5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBGcmFtZVByb2NTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBleHBsaWNpdCBGcmFtZVByb2NTeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6RnJhbWVQcm9jU3ltKSwKKyAgICAgICAgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICB1aW50MzJfdCBUb3RhbEZyYW1lQnl0ZXM7CisgIHVpbnQzMl90IFBhZGRpbmdGcmFtZUJ5dGVzOworICB1aW50MzJfdCBPZmZzZXRUb1BhZGRpbmc7CisgIHVpbnQzMl90IEJ5dGVzT2ZDYWxsZWVTYXZlZFJlZ2lzdGVyczsKKyAgdWludDMyX3QgT2Zmc2V0T2ZFeGNlcHRpb25IYW5kbGVyOworICB1aW50MTZfdCBTZWN0aW9uSWRPZkV4Y2VwdGlvbkhhbmRsZXI7CisgIEZyYW1lUHJvY2VkdXJlT3B0aW9ucyBGbGFnczsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0NBTExTSVRFSU5GTworY2xhc3MgQ2FsbFNpdGVJbmZvU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgUmVsb2NhdGlvbk9mZnNldCA9IDQ7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ2FsbFNpdGVJbmZvU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgZXhwbGljaXQgQ2FsbFNpdGVJbmZvU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OkNhbGxTaXRlSW5mb1N5bSkge30KKworICB1aW50MzJfdCBnZXRSZWxvY2F0aW9uT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBSZWNvcmRPZmZzZXQgKyBSZWxvY2F0aW9uT2Zmc2V0OworICB9CisKKyAgdWludDMyX3QgQ29kZU9mZnNldDsKKyAgdWludDE2X3QgU2VnbWVudDsKKyAgVHlwZUluZGV4IFR5cGU7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19IRUFQQUxMT0NTSVRFCitjbGFzcyBIZWFwQWxsb2NhdGlvblNpdGVTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBSZWxvY2F0aW9uT2Zmc2V0ID0gNDsKKworcHVibGljOgorICBleHBsaWNpdCBIZWFwQWxsb2NhdGlvblNpdGVTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBleHBsaWNpdCBIZWFwQWxsb2NhdGlvblNpdGVTeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6SGVhcEFsbG9jYXRpb25TaXRlU3ltKSwKKyAgICAgICAgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICB1aW50MzJfdCBnZXRSZWxvY2F0aW9uT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBSZWNvcmRPZmZzZXQgKyBSZWxvY2F0aW9uT2Zmc2V0OworICB9CisKKyAgdWludDMyX3QgQ29kZU9mZnNldDsKKyAgdWludDE2X3QgU2VnbWVudDsKKyAgdWludDE2X3QgQ2FsbEluc3RydWN0aW9uU2l6ZTsKKyAgVHlwZUluZGV4IFR5cGU7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19GUkFNRUNPT0tJRQorY2xhc3MgRnJhbWVDb29raWVTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBSZWxvY2F0aW9uT2Zmc2V0ID0gNDsKKworcHVibGljOgorICBleHBsaWNpdCBGcmFtZUNvb2tpZVN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIGV4cGxpY2l0IEZyYW1lQ29va2llU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OkZyYW1lQ29va2llU3ltKSB7fQorCisgIHVpbnQzMl90IGdldFJlbG9jYXRpb25PZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlY29yZE9mZnNldCArIFJlbG9jYXRpb25PZmZzZXQ7CisgIH0KKworICB1aW50MzJfdCBDb2RlT2Zmc2V0OworICB1aW50MTZfdCBSZWdpc3RlcjsKKyAgRnJhbWVDb29raWVLaW5kIENvb2tpZUtpbmQ7CisgIHVpbnQ4X3QgRmxhZ3M7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19VRFQsIFNfQ09CT0xVRFQKK2NsYXNzIFVEVFN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBVRFRTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBleHBsaWNpdCBVRFRTeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6VURUU3ltKSB7fQorCisgIFR5cGVJbmRleCBUeXBlOworICBTdHJpbmdSZWYgTmFtZTsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0JVSUxESU5GTworY2xhc3MgQnVpbGRJbmZvU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IEJ1aWxkSW5mb1N5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIEJ1aWxkSW5mb1N5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpCdWlsZEluZm9TeW0pLAorICAgICAgICBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIFR5cGVJbmRleCBCdWlsZElkOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfQlBSRUwzMgorY2xhc3MgQlBSZWxhdGl2ZVN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBCUFJlbGF0aXZlU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgZXhwbGljaXQgQlBSZWxhdGl2ZVN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpCUFJlbGF0aXZlU3ltKSwKKyAgICAgICAgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICBpbnQzMl90IE9mZnNldDsKKyAgVHlwZUluZGV4IFR5cGU7CisgIFN0cmluZ1JlZiBOYW1lOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfUkVHUkVMMzIKK2NsYXNzIFJlZ1JlbGF0aXZlU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFJlZ1JlbGF0aXZlU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgZXhwbGljaXQgUmVnUmVsYXRpdmVTeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6UmVnUmVsYXRpdmVTeW0pLAorICAgICAgICBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIHVpbnQzMl90IE9mZnNldDsKKyAgVHlwZUluZGV4IFR5cGU7CisgIFJlZ2lzdGVySWQgUmVnaXN0ZXI7CisgIFN0cmluZ1JlZiBOYW1lOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfQ09OU1RBTlQsIFNfTUFOQ09OU1RBTlQKK2NsYXNzIENvbnN0YW50U3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IENvbnN0YW50U3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgQ29uc3RhbnRTeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6Q29uc3RhbnRTeW0pLAorICAgICAgICBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIFR5cGVJbmRleCBUeXBlOworICBBUFNJbnQgVmFsdWU7CisgIFN0cmluZ1JlZiBOYW1lOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfTERBVEEzMiwgU19HREFUQTMyLCBTX0xNQU5EQVRBLCBTX0dNQU5EQVRBCitjbGFzcyBEYXRhU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgUmVsb2NhdGlvbk9mZnNldCA9IDg7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgRGF0YVN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIERhdGFTeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6RGF0YVN5bSksIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgdWludDMyX3QgZ2V0UmVsb2NhdGlvbk9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVjb3JkT2Zmc2V0ICsgUmVsb2NhdGlvbk9mZnNldDsKKyAgfQorCisgIFR5cGVJbmRleCBUeXBlOworICB1aW50MzJfdCBEYXRhT2Zmc2V0OworICB1aW50MTZfdCBTZWdtZW50OworICBTdHJpbmdSZWYgTmFtZTsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0xUSFJFQUQzMiwgU19HVEhSRUFEMzIKK2NsYXNzIFRocmVhZExvY2FsRGF0YVN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFJlbG9jYXRpb25PZmZzZXQgPSA4OworCitwdWJsaWM6CisgIGV4cGxpY2l0IFRocmVhZExvY2FsRGF0YVN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIGV4cGxpY2l0IFRocmVhZExvY2FsRGF0YVN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpUaHJlYWRMb2NhbERhdGFTeW0pLAorICAgICAgICBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIHVpbnQzMl90IGdldFJlbG9jYXRpb25PZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlY29yZE9mZnNldCArIFJlbG9jYXRpb25PZmZzZXQ7CisgIH0KKworICBUeXBlSW5kZXggVHlwZTsKKyAgdWludDMyX3QgRGF0YU9mZnNldDsKKyAgdWludDE2X3QgU2VnbWVudDsKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19BTk5PVEFUSU9OCisKK3VzaW5nIENWU3ltYm9sID0gQ1ZSZWNvcmQ8U3ltYm9sS2luZD47Cit1c2luZyBDVlN5bWJvbEFycmF5ID0gVmFyU3RyZWFtQXJyYXk8Q1ZTeW1ib2w+OworCitFeHBlY3RlZDxDVlN5bWJvbD4gcmVhZFN5bWJvbEZyb21TdHJlYW0oQmluYXJ5U3RyZWFtUmVmIFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPZmZzZXQpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xSRUNPUkRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sUmVjb3JkTWFwcGluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sUmVjb3JkTWFwcGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MWU4ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmRNYXBwaW5nLmgKQEAgLTAsMCArMSw0NyBAQAorLy89PT0tIFN5bWJvbFJlY29yZE1hcHBpbmcuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xSRUNPUkRNQVBQSU5HX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU1lNQk9MUkVDT1JETUFQUElOR19ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld1JlY29yZElPLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sVmlzaXRvckNhbGxiYWNrcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBCaW5hcnlTdHJlYW1SZWFkZXI7CitjbGFzcyBCaW5hcnlTdHJlYW1Xcml0ZXI7CisKK25hbWVzcGFjZSBjb2RldmlldyB7CitjbGFzcyBTeW1ib2xSZWNvcmRNYXBwaW5nIDogcHVibGljIFN5bWJvbFZpc2l0b3JDYWxsYmFja3MgeworcHVibGljOgorICBleHBsaWNpdCBTeW1ib2xSZWNvcmRNYXBwaW5nKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVWaWV3Q29udGFpbmVyIENvbnRhaW5lcikKKyAgICAgIDogSU8oUmVhZGVyKSwgQ29udGFpbmVyKENvbnRhaW5lcikge30KKyAgZXhwbGljaXQgU3ltYm9sUmVjb3JkTWFwcGluZyhCaW5hcnlTdHJlYW1Xcml0ZXIgJldyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlVmlld0NvbnRhaW5lciBDb250YWluZXIpCisgICAgICA6IElPKFdyaXRlciksIENvbnRhaW5lcihDb250YWluZXIpIHt9CisKKyAgRXJyb3IgdmlzaXRTeW1ib2xCZWdpbihDVlN5bWJvbCAmUmVjb3JkKSBvdmVycmlkZTsKKyAgRXJyb3IgdmlzaXRTeW1ib2xFbmQoQ1ZTeW1ib2wgJlJlY29yZCkgb3ZlcnJpZGU7CisKKyNkZWZpbmUgU1lNQk9MX1JFQ09SRChFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVycm9yIHZpc2l0S25vd25SZWNvcmQoQ1ZTeW1ib2wgJkNWUiwgTmFtZSAmUmVjb3JkKSBvdmVycmlkZTsKKyNkZWZpbmUgU1lNQk9MX1JFQ09SRF9BTElBUyhFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSwgQWxpYXNOYW1lKQorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3U3ltYm9scy5kZWYiCisKK3ByaXZhdGU6CisgIE9wdGlvbmFsPFN5bWJvbEtpbmQ+IEtpbmQ7CisKKyAgQ29kZVZpZXdSZWNvcmRJTyBJTzsKKyAgQ29kZVZpZXdDb250YWluZXIgQ29udGFpbmVyOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xTZXJpYWxpemVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xTZXJpYWxpemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkOGFiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFNlcmlhbGl6ZXIuaApAQCAtMCwwICsxLDg0IEBACisvLz09PS0gU3ltYm9sU2VyaWFsaXplci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NZTUJPTFNFUklBTElaRVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xTRVJJQUxJWkVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9SZWNvcmRTZXJpYWxpemF0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sUmVjb3JkTWFwcGluZy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFZpc2l0b3JDYWxsYmFja3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeUJ5dGVTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIFN5bWJvbFNlcmlhbGl6ZXIgOiBwdWJsaWMgU3ltYm9sVmlzaXRvckNhbGxiYWNrcyB7CisgIEJ1bXBQdHJBbGxvY2F0b3IgJlN0b3JhZ2U7CisgIC8vIFNpbmNlIHRoaXMgaXMgYSBmaXhlZCBzaXplIGJ1ZmZlciwgdXNlIGEgc3RhY2sgYWxsb2NhdGVkIGJ1ZmZlci4gIFRoaXMKKyAgLy8geWllbGRzIG1lYXN1cmFibGUgcGVyZm9ybWFuY2UgaW5jcmVhc2Ugb3ZlciB0aGUgcmVwZWF0ZWQgaGVhcCBhbGxvY2F0aW9ucworICAvLyB3aGVuIHNlcmlhbGl6aW5nIG1hbnkgaW5kZXBlbmRlbnQgcmVjb3JkcyB2aWEgd3JpdGVPbmVTeW1ib2wuCisgIHN0ZDo6YXJyYXk8dWludDhfdCwgTWF4UmVjb3JkTGVuZ3RoPiBSZWNvcmRCdWZmZXI7CisgIE11dGFibGVCaW5hcnlCeXRlU3RyZWFtIFN0cmVhbTsKKyAgQmluYXJ5U3RyZWFtV3JpdGVyIFdyaXRlcjsKKyAgU3ltYm9sUmVjb3JkTWFwcGluZyBNYXBwaW5nOworICBPcHRpb25hbDxTeW1ib2xLaW5kPiBDdXJyZW50U3ltYm9sOworCisgIEVycm9yIHdyaXRlUmVjb3JkUHJlZml4KFN5bWJvbEtpbmQgS2luZCkgeworICAgIFJlY29yZFByZWZpeCBQcmVmaXg7CisgICAgUHJlZml4LlJlY29yZEtpbmQgPSBLaW5kOworICAgIFByZWZpeC5SZWNvcmRMZW4gPSAwOworICAgIGlmIChhdXRvIEVDID0gV3JpdGVyLndyaXRlT2JqZWN0KFByZWZpeCkpCisgICAgICByZXR1cm4gRUM7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworcHVibGljOgorICBTeW1ib2xTZXJpYWxpemVyKEJ1bXBQdHJBbGxvY2F0b3IgJlN0b3JhZ2UsIENvZGVWaWV3Q29udGFpbmVyIENvbnRhaW5lcik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFN5bVR5cGU+CisgIHN0YXRpYyBDVlN5bWJvbCB3cml0ZU9uZVN5bWJvbChTeW1UeXBlICZTeW0sIEJ1bXBQdHJBbGxvY2F0b3IgJlN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlVmlld0NvbnRhaW5lciBDb250YWluZXIpIHsKKyAgICBDVlN5bWJvbCBSZXN1bHQ7CisgICAgUmVzdWx0LlR5cGUgPSBzdGF0aWNfY2FzdDxTeW1ib2xLaW5kPihTeW0uS2luZCk7CisgICAgU3ltYm9sU2VyaWFsaXplciBTZXJpYWxpemVyKFN0b3JhZ2UsIENvbnRhaW5lcik7CisgICAgY29uc3VtZUVycm9yKFNlcmlhbGl6ZXIudmlzaXRTeW1ib2xCZWdpbihSZXN1bHQpKTsKKyAgICBjb25zdW1lRXJyb3IoU2VyaWFsaXplci52aXNpdEtub3duUmVjb3JkKFJlc3VsdCwgU3ltKSk7CisgICAgY29uc3VtZUVycm9yKFNlcmlhbGl6ZXIudmlzaXRTeW1ib2xFbmQoUmVzdWx0KSk7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIEVycm9yIHZpc2l0U3ltYm9sQmVnaW4oQ1ZTeW1ib2wgJlJlY29yZCkgb3ZlcnJpZGU7CisgIEVycm9yIHZpc2l0U3ltYm9sRW5kKENWU3ltYm9sICZSZWNvcmQpIG92ZXJyaWRlOworCisjZGVmaW5lIFNZTUJPTF9SRUNPUkQoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFcnJvciB2aXNpdEtub3duUmVjb3JkKENWU3ltYm9sICZDVlIsIE5hbWUgJlJlY29yZCkgb3ZlcnJpZGUgeyAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdmlzaXRLbm93blJlY29yZEltcGwoQ1ZSLCBSZWNvcmQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgU1lNQk9MX1JFQ09SRF9BTElBUyhFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSwgQWxpYXNOYW1lKQorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3U3ltYm9scy5kZWYiCisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZWNvcmRLaW5kPgorICBFcnJvciB2aXNpdEtub3duUmVjb3JkSW1wbChDVlN5bWJvbCAmQ1ZSLCBSZWNvcmRLaW5kICZSZWNvcmQpIHsKKyAgICByZXR1cm4gTWFwcGluZy52aXNpdEtub3duUmVjb3JkKENWUiwgUmVjb3JkKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU1lNQk9MU0VSSUFMSVpFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xWaXNpdG9yQ2FsbGJhY2tQaXBlbGluZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sVmlzaXRvckNhbGxiYWNrUGlwZWxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjk1MTFhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sVmlzaXRvckNhbGxiYWNrUGlwZWxpbmUuaApAQCAtMCwwICsxLDc5IEBACisvLz09PS0gU3ltYm9sVmlzaXRvckNhbGxiYWNrUGlwZWxpbmUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NZTUJPTFZJU0lUT1JDQUxMQkFDS1BJUEVMSU5FX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU1lNQk9MVklTSVRPUkNBTExCQUNLUElQRUxJTkVfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sVmlzaXRvckNhbGxiYWNrcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgU3ltYm9sVmlzaXRvckNhbGxiYWNrUGlwZWxpbmUgOiBwdWJsaWMgU3ltYm9sVmlzaXRvckNhbGxiYWNrcyB7CitwdWJsaWM6CisgIFN5bWJvbFZpc2l0b3JDYWxsYmFja1BpcGVsaW5lKCkgPSBkZWZhdWx0OworCisgIEVycm9yIHZpc2l0VW5rbm93blN5bWJvbChDVlN5bWJvbCAmUmVjb3JkKSBvdmVycmlkZSB7CisgICAgZm9yIChhdXRvIFZpc2l0b3IgOiBQaXBlbGluZSkgeworICAgICAgaWYgKGF1dG8gRUMgPSBWaXNpdG9yLT52aXNpdFVua25vd25TeW1ib2woUmVjb3JkKSkKKyAgICAgICAgcmV0dXJuIEVDOworICAgIH0KKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEVycm9yIHZpc2l0U3ltYm9sQmVnaW4oQ1ZTeW1ib2wgJlJlY29yZCwgdWludDMyX3QgT2Zmc2V0KSBvdmVycmlkZSB7CisgICAgZm9yIChhdXRvIFZpc2l0b3IgOiBQaXBlbGluZSkgeworICAgICAgaWYgKGF1dG8gRUMgPSBWaXNpdG9yLT52aXNpdFN5bWJvbEJlZ2luKFJlY29yZCwgT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIEVDOworICAgIH0KKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEVycm9yIHZpc2l0U3ltYm9sQmVnaW4oQ1ZTeW1ib2wgJlJlY29yZCkgb3ZlcnJpZGUgeworICAgIGZvciAoYXV0byBWaXNpdG9yIDogUGlwZWxpbmUpIHsKKyAgICAgIGlmIChhdXRvIEVDID0gVmlzaXRvci0+dmlzaXRTeW1ib2xCZWdpbihSZWNvcmQpKQorICAgICAgICByZXR1cm4gRUM7CisgICAgfQorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgdmlzaXRTeW1ib2xFbmQoQ1ZTeW1ib2wgJlJlY29yZCkgb3ZlcnJpZGUgeworICAgIGZvciAoYXV0byBWaXNpdG9yIDogUGlwZWxpbmUpIHsKKyAgICAgIGlmIChhdXRvIEVDID0gVmlzaXRvci0+dmlzaXRTeW1ib2xFbmQoUmVjb3JkKSkKKyAgICAgICAgcmV0dXJuIEVDOworICAgIH0KKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIHZvaWQgYWRkQ2FsbGJhY2tUb1BpcGVsaW5lKFN5bWJvbFZpc2l0b3JDYWxsYmFja3MgJkNhbGxiYWNrcykgeworICAgIFBpcGVsaW5lLnB1c2hfYmFjaygmQ2FsbGJhY2tzKTsKKyAgfQorCisjZGVmaW5lIFNZTUJPTF9SRUNPUkQoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFcnJvciB2aXNpdEtub3duUmVjb3JkKENWU3ltYm9sICZDVlIsIE5hbWUgJlJlY29yZCkgb3ZlcnJpZGUgeyAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGF1dG8gVmlzaXRvciA6IFBpcGVsaW5lKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoYXV0byBFQyA9IFZpc2l0b3ItPnZpc2l0S25vd25SZWNvcmQoQ1ZSLCBSZWNvcmQpKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gRUM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIFNZTUJPTF9SRUNPUkRfQUxJQVMoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUsIEFsaWFzTmFtZSkKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld1N5bWJvbHMuZGVmIgorCitwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxTeW1ib2xWaXNpdG9yQ2FsbGJhY2tzICo+IFBpcGVsaW5lOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU1lNQk9MVklTSVRPUkNBTExCQUNLUElQRUxJTkVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sVmlzaXRvckNhbGxiYWNrcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sVmlzaXRvckNhbGxiYWNrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTZmN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xWaXNpdG9yQ2FsbGJhY2tzLmgKQEAgLTAsMCArMSw1MCBAQAorLy89PT0tIFN5bWJvbFZpc2l0b3JDYWxsYmFja3MuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xWSVNJVE9SQ0FMTEJBQ0tTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU1lNQk9MVklTSVRPUkNBTExCQUNLU19ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgU3ltYm9sVmlzaXRvckNhbGxiYWNrcyB7CisgIGZyaWVuZCBjbGFzcyBDVlN5bWJvbFZpc2l0b3I7CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+U3ltYm9sVmlzaXRvckNhbGxiYWNrcygpID0gZGVmYXVsdDsKKworICAvLy8gQWN0aW9uIHRvIHRha2Ugb24gdW5rbm93biBzeW1ib2xzLiBCeSBkZWZhdWx0LCB0aGV5IGFyZSBpZ25vcmVkLgorICB2aXJ0dWFsIEVycm9yIHZpc2l0VW5rbm93blN5bWJvbChDVlN5bWJvbCAmUmVjb3JkKSB7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICAvLy8gUGFpcmVkIGJlZ2luL2VuZCBhY3Rpb25zIGZvciBhbGwgc3ltYm9scy4gUmVjZWl2ZXMgYWxsIHJlY29yZCBkYXRhLAorICAvLy8gaW5jbHVkaW5nIHRoZSBmaXhlZC1sZW5ndGggcmVjb3JkIHByZWZpeC4gIHZpc2l0U3ltYm9sQmVnaW4oKSBzaG91bGQKKyAgLy8vIHJldHVybiB0aGUgdHlwZSBvZiB0aGUgU3ltYm9sLCBvciBhbiBlcnJvciBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KKyAgdmlydHVhbCBFcnJvciB2aXNpdFN5bWJvbEJlZ2luKENWU3ltYm9sICZSZWNvcmQsIHVpbnQzMl90IE9mZnNldCkgeworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisgIHZpcnR1YWwgRXJyb3IgdmlzaXRTeW1ib2xCZWdpbihDVlN5bWJvbCAmUmVjb3JkKSB7IHJldHVybiBFcnJvcjo6c3VjY2VzcygpOyB9CisgIHZpcnR1YWwgRXJyb3IgdmlzaXRTeW1ib2xFbmQoQ1ZTeW1ib2wgJlJlY29yZCkgeyByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsgfQorCisjZGVmaW5lIFNZTUJPTF9SRUNPUkQoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2aXJ0dWFsIEVycm9yIHZpc2l0S25vd25SZWNvcmQoQ1ZTeW1ib2wgJkNWUiwgTmFtZSAmUmVjb3JkKSB7ICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgU1lNQk9MX1JFQ09SRF9BTElBUyhFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSwgQWxpYXNOYW1lKQorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3U3ltYm9scy5kZWYiCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xWSVNJVE9SQ0FMTEJBQ0tTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFZpc2l0b3JEZWxlZ2F0ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sVmlzaXRvckRlbGVnYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJhM2M2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFZpc2l0b3JEZWxlZ2F0ZS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vPT09LS0gU3ltYm9sVmlzaXRvckRlbGVnYXRlLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU1lNQk9MVklTSVRPUkRFTEVHQVRFX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU1lNQk9MVklTSVRPUkRFTEVHQVRFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmluYXJ5U3RyZWFtUmVhZGVyOworCituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvblJlZjsKKworY2xhc3MgU3ltYm9sVmlzaXRvckRlbGVnYXRlIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+U3ltYm9sVmlzaXRvckRlbGVnYXRlKCkgPSBkZWZhdWx0OworCisgIHZpcnR1YWwgdWludDMyX3QgZ2V0UmVjb3JkT2Zmc2V0KEJpbmFyeVN0cmVhbVJlYWRlciBSZWFkZXIpID0gMDsKKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0RmlsZU5hbWVGb3JGaWxlT2Zmc2V0KHVpbnQzMl90IEZpbGVPZmZzZXQpID0gMDsKKyAgdmlydHVhbCBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvblJlZiBnZXRTdHJpbmdUYWJsZSgpID0gMDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU1lNQk9MVklTSVRPUkRFTEVHQVRFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVDb2xsZWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlQ29sbGVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZmM5YjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlQ29sbGVjdGlvbi5oCkBAIC0wLDAgKzEsNDggQEAKKy8vPT09LSBUeXBlQ29sbGVjdGlvbi5oIC0gQSBjb2xsZWN0aW9uIG9mIENvZGVWaWV3IHR5cGUgcmVjb3JkcyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRUNPTExFQ1RJT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFQ09MTEVDVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmQuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKK2NsYXNzIFR5cGVDb2xsZWN0aW9uIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VHlwZUNvbGxlY3Rpb24oKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBlbXB0eSgpIHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9CisKKyAgdmlydHVhbCBPcHRpb25hbDxUeXBlSW5kZXg+IGdldEZpcnN0KCkgPSAwOworICB2aXJ0dWFsIE9wdGlvbmFsPFR5cGVJbmRleD4gZ2V0TmV4dChUeXBlSW5kZXggUHJldikgPSAwOworCisgIHZpcnR1YWwgQ1ZUeXBlIGdldFR5cGUoVHlwZUluZGV4IEluZGV4KSA9IDA7CisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldFR5cGVOYW1lKFR5cGVJbmRleCBJbmRleCkgPSAwOworICB2aXJ0dWFsIGJvb2wgY29udGFpbnMoVHlwZUluZGV4IEluZGV4KSA9IDA7CisgIHZpcnR1YWwgdWludDMyX3Qgc2l6ZSgpID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBjYXBhY2l0eSgpID0gMDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVEZ1bmM+IHZvaWQgRm9yRWFjaFJlY29yZChURnVuYyBGdW5jKSB7CisgICAgT3B0aW9uYWw8VHlwZUluZGV4PiBOZXh0ID0gZ2V0Rmlyc3QoKTsKKworICAgIHdoaWxlIChOZXh0Lmhhc1ZhbHVlKCkpIHsKKyAgICAgIFR5cGVJbmRleCBOID0gKk5leHQ7CisgICAgICBGdW5jKE4sIGdldFR5cGUoTikpOworICAgICAgTmV4dCA9IGdldE5leHQoTik7CisgICAgfQorICB9Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVEZXNlcmlhbGl6ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVEZXNlcmlhbGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODg3ZDkwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZURlc2VyaWFsaXplci5oCkBAIC0wLDAgKzEsMTY2IEBACisvLz09PS0gVHlwZURlc2VyaWFsaXplci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVERVNFUklBTElaRVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFREVTRVJJQUxJWkVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZE1hcHBpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlVmlzaXRvckNhbGxiYWNrcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlCeXRlU3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlYWRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIFR5cGVEZXNlcmlhbGl6ZXIgOiBwdWJsaWMgVHlwZVZpc2l0b3JDYWxsYmFja3MgeworICBzdHJ1Y3QgTWFwcGluZ0luZm8geworICAgIGV4cGxpY2l0IE1hcHBpbmdJbmZvKEFycmF5UmVmPHVpbnQ4X3Q+IFJlY29yZERhdGEpCisgICAgICAgIDogU3RyZWFtKFJlY29yZERhdGEsIGxsdm06OnN1cHBvcnQ6OmxpdHRsZSksIFJlYWRlcihTdHJlYW0pLAorICAgICAgICAgIE1hcHBpbmcoUmVhZGVyKSB7fQorCisgICAgQmluYXJ5Qnl0ZVN0cmVhbSBTdHJlYW07CisgICAgQmluYXJ5U3RyZWFtUmVhZGVyIFJlYWRlcjsKKyAgICBUeXBlUmVjb3JkTWFwcGluZyBNYXBwaW5nOworICB9OworCitwdWJsaWM6CisgIFR5cGVEZXNlcmlhbGl6ZXIoKSA9IGRlZmF1bHQ7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0YXRpYyBFcnJvciBkZXNlcmlhbGl6ZUFzKENWVHlwZSAmQ1ZULCBUICZSZWNvcmQpIHsKKyAgICBSZWNvcmQuS2luZCA9IHN0YXRpY19jYXN0PFR5cGVSZWNvcmRLaW5kPihDVlQua2luZCgpKTsKKyAgICBNYXBwaW5nSW5mbyBJKENWVC5jb250ZW50KCkpOworICAgIGlmIChhdXRvIEVDID0gSS5NYXBwaW5nLnZpc2l0VHlwZUJlZ2luKENWVCkpCisgICAgICByZXR1cm4gRUM7CisgICAgaWYgKGF1dG8gRUMgPSBJLk1hcHBpbmcudmlzaXRLbm93blJlY29yZChDVlQsIFJlY29yZCkpCisgICAgICByZXR1cm4gRUM7CisgICAgaWYgKGF1dG8gRUMgPSBJLk1hcHBpbmcudmlzaXRUeXBlRW5kKENWVCkpCisgICAgICByZXR1cm4gRUM7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RhdGljIEV4cGVjdGVkPFQ+IGRlc2VyaWFsaXplQXMoQXJyYXlSZWY8dWludDhfdD4gRGF0YSkgeworICAgIGNvbnN0IFJlY29yZFByZWZpeCAqUHJlZml4ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBSZWNvcmRQcmVmaXggKj4oRGF0YS5kYXRhKCkpOworICAgIFR5cGVSZWNvcmRLaW5kIEsgPQorICAgICAgICBzdGF0aWNfY2FzdDxUeXBlUmVjb3JkS2luZD4odWludDE2X3QoUHJlZml4LT5SZWNvcmRLaW5kKSk7CisgICAgVCBSZWNvcmQoSyk7CisgICAgQ1ZUeXBlIENWVChzdGF0aWNfY2FzdDxUeXBlTGVhZktpbmQ+KEspLCBEYXRhKTsKKyAgICBpZiAoYXV0byBFQyA9IGRlc2VyaWFsaXplQXM8VD4oQ1ZULCBSZWNvcmQpKQorICAgICAgcmV0dXJuIHN0ZDo6bW92ZShFQyk7CisgICAgcmV0dXJuIFJlY29yZDsKKyAgfQorCisgIEVycm9yIHZpc2l0VHlwZUJlZ2luKENWVHlwZSAmUmVjb3JkKSBvdmVycmlkZSB7CisgICAgYXNzZXJ0KCFNYXBwaW5nICYmICJBbHJlYWR5IGluIGEgdHlwZSBtYXBwaW5nISIpOworICAgIE1hcHBpbmcgPSBsbHZtOjptYWtlX3VuaXF1ZTxNYXBwaW5nSW5mbz4oUmVjb3JkLmNvbnRlbnQoKSk7CisgICAgcmV0dXJuIE1hcHBpbmctPk1hcHBpbmcudmlzaXRUeXBlQmVnaW4oUmVjb3JkKTsKKyAgfQorCisgIEVycm9yIHZpc2l0VHlwZUJlZ2luKENWVHlwZSAmUmVjb3JkLCBUeXBlSW5kZXggSW5kZXgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gdmlzaXRUeXBlQmVnaW4oUmVjb3JkKTsKKyAgfQorCisgIEVycm9yIHZpc2l0VHlwZUVuZChDVlR5cGUgJlJlY29yZCkgb3ZlcnJpZGUgeworICAgIGFzc2VydChNYXBwaW5nICYmICJOb3QgaW4gYSB0eXBlIG1hcHBpbmchIik7CisgICAgYXV0byBFQyA9IE1hcHBpbmctPk1hcHBpbmcudmlzaXRUeXBlRW5kKFJlY29yZCk7CisgICAgTWFwcGluZy5yZXNldCgpOworICAgIHJldHVybiBFQzsKKyAgfQorCisjZGVmaW5lIFRZUEVfUkVDT1JEKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFcnJvciB2aXNpdEtub3duUmVjb3JkKENWVHlwZSAmQ1ZSLCBOYW1lIyNSZWNvcmQgJlJlY29yZCkgb3ZlcnJpZGUgeyAgICAgICAgIFwKKyAgICByZXR1cm4gdmlzaXRLbm93blJlY29yZEltcGw8TmFtZSMjUmVjb3JkPihDVlIsIFJlY29yZCk7ICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgTUVNQkVSX1JFQ09SRChFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSkKKyNkZWZpbmUgVFlQRV9SRUNPUkRfQUxJQVMoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUsIEFsaWFzTmFtZSkKKyNkZWZpbmUgTUVNQkVSX1JFQ09SRF9BTElBUyhFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSwgQWxpYXNOYW1lKQorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3VHlwZXMuZGVmIgorCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVjb3JkVHlwZT4KKyAgRXJyb3IgdmlzaXRLbm93blJlY29yZEltcGwoQ1ZUeXBlICZDVlIsIFJlY29yZFR5cGUgJlJlY29yZCkgeworICAgIHJldHVybiBNYXBwaW5nLT5NYXBwaW5nLnZpc2l0S25vd25SZWNvcmQoQ1ZSLCBSZWNvcmQpOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPE1hcHBpbmdJbmZvPiBNYXBwaW5nOworfTsKKworY2xhc3MgRmllbGRMaXN0RGVzZXJpYWxpemVyIDogcHVibGljIFR5cGVWaXNpdG9yQ2FsbGJhY2tzIHsKKyAgc3RydWN0IE1hcHBpbmdJbmZvIHsKKyAgICBleHBsaWNpdCBNYXBwaW5nSW5mbyhCaW5hcnlTdHJlYW1SZWFkZXIgJlIpCisgICAgICAgIDogUmVhZGVyKFIpLCBNYXBwaW5nKFJlYWRlciksIFN0YXJ0T2Zmc2V0KDApIHt9CisKKyAgICBCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlcjsKKyAgICBUeXBlUmVjb3JkTWFwcGluZyBNYXBwaW5nOworICAgIHVpbnQzMl90IFN0YXJ0T2Zmc2V0OworICB9OworCitwdWJsaWM6CisgIGV4cGxpY2l0IEZpZWxkTGlzdERlc2VyaWFsaXplcihCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlcikgOiBNYXBwaW5nKFJlYWRlcikgeworICAgIENWVHlwZSBGaWVsZExpc3Q7CisgICAgRmllbGRMaXN0LlR5cGUgPSBUeXBlTGVhZktpbmQ6OkxGX0ZJRUxETElTVDsKKyAgICBjb25zdW1lRXJyb3IoTWFwcGluZy5NYXBwaW5nLnZpc2l0VHlwZUJlZ2luKEZpZWxkTGlzdCkpOworICB9CisKKyAgfkZpZWxkTGlzdERlc2VyaWFsaXplcigpIG92ZXJyaWRlIHsKKyAgICBDVlR5cGUgRmllbGRMaXN0OworICAgIEZpZWxkTGlzdC5UeXBlID0gVHlwZUxlYWZLaW5kOjpMRl9GSUVMRExJU1Q7CisgICAgY29uc3VtZUVycm9yKE1hcHBpbmcuTWFwcGluZy52aXNpdFR5cGVFbmQoRmllbGRMaXN0KSk7CisgIH0KKworICBFcnJvciB2aXNpdE1lbWJlckJlZ2luKENWTWVtYmVyUmVjb3JkICZSZWNvcmQpIG92ZXJyaWRlIHsKKyAgICBNYXBwaW5nLlN0YXJ0T2Zmc2V0ID0gTWFwcGluZy5SZWFkZXIuZ2V0T2Zmc2V0KCk7CisgICAgcmV0dXJuIE1hcHBpbmcuTWFwcGluZy52aXNpdE1lbWJlckJlZ2luKFJlY29yZCk7CisgIH0KKworICBFcnJvciB2aXNpdE1lbWJlckVuZChDVk1lbWJlclJlY29yZCAmUmVjb3JkKSBvdmVycmlkZSB7CisgICAgaWYgKGF1dG8gRUMgPSBNYXBwaW5nLk1hcHBpbmcudmlzaXRNZW1iZXJFbmQoUmVjb3JkKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisjZGVmaW5lIFRZUEVfUkVDT1JEKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lKQorI2RlZmluZSBNRU1CRVJfUkVDT1JEKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRXJyb3IgdmlzaXRLbm93bk1lbWJlcihDVk1lbWJlclJlY29yZCAmQ1ZSLCBOYW1lIyNSZWNvcmQgJlJlY29yZCkgb3ZlcnJpZGUgeyBcCisgICAgcmV0dXJuIHZpc2l0S25vd25NZW1iZXJJbXBsPE5hbWUjI1JlY29yZD4oQ1ZSLCBSZWNvcmQpOyAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIFRZUEVfUkVDT1JEX0FMSUFTKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lLCBBbGlhc05hbWUpCisjZGVmaW5lIE1FTUJFUl9SRUNPUkRfQUxJQVMoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUsIEFsaWFzTmFtZSkKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld1R5cGVzLmRlZiIKKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlY29yZFR5cGU+CisgIEVycm9yIHZpc2l0S25vd25NZW1iZXJJbXBsKENWTWVtYmVyUmVjb3JkICZDVlIsIFJlY29yZFR5cGUgJlJlY29yZCkgeworICAgIGlmIChhdXRvIEVDID0gTWFwcGluZy5NYXBwaW5nLnZpc2l0S25vd25NZW1iZXIoQ1ZSLCBSZWNvcmQpKQorICAgICAgcmV0dXJuIEVDOworCisgICAgdWludDMyX3QgRW5kT2Zmc2V0ID0gTWFwcGluZy5SZWFkZXIuZ2V0T2Zmc2V0KCk7CisgICAgdWludDMyX3QgUmVjb3JkTGVuZ3RoID0gRW5kT2Zmc2V0IC0gTWFwcGluZy5TdGFydE9mZnNldDsKKyAgICBNYXBwaW5nLlJlYWRlci5zZXRPZmZzZXQoTWFwcGluZy5TdGFydE9mZnNldCk7CisgICAgaWYgKGF1dG8gRUMgPSBNYXBwaW5nLlJlYWRlci5yZWFkQnl0ZXMoQ1ZSLkRhdGEsIFJlY29yZExlbmd0aCkpCisgICAgICByZXR1cm4gRUM7CisgICAgYXNzZXJ0KE1hcHBpbmcuUmVhZGVyLmdldE9mZnNldCgpID09IEVuZE9mZnNldCk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKyAgTWFwcGluZ0luZm8gTWFwcGluZzsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVERVNFUklBTElaRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUR1bXBWaXNpdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlRHVtcFZpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmI4YjM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUR1bXBWaXNpdG9yLmgKQEAgLTAsMCArMSw4NiBAQAorLy89PT0tLSBUeXBlRHVtcFZpc2l0b3IuaCAtIENvZGVWaWV3IHR5cGUgaW5mbyBkdW1wZXIgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFRFVNUFZJU0lUT1JfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFRFVNUFZJU0lUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXguaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVZpc2l0b3JDYWxsYmFja3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU2NvcGVkUHJpbnRlcjsKKworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgVHlwZUNvbGxlY3Rpb247CisKKy8vLyBEdW1wZXIgZm9yIENvZGVWaWV3IHR5cGUgc3RyZWFtcyBmb3VuZCBpbiBDT0ZGIG9iamVjdCBmaWxlcyBhbmQgUERCIGZpbGVzLgorY2xhc3MgVHlwZUR1bXBWaXNpdG9yIDogcHVibGljIFR5cGVWaXNpdG9yQ2FsbGJhY2tzIHsKK3B1YmxpYzoKKyAgVHlwZUR1bXBWaXNpdG9yKFR5cGVDb2xsZWN0aW9uICZUcGlUeXBlcywgU2NvcGVkUHJpbnRlciAqVywKKyAgICAgICAgICAgICAgICAgIGJvb2wgUHJpbnRSZWNvcmRCeXRlcykKKyAgICAgIDogVyhXKSwgUHJpbnRSZWNvcmRCeXRlcyhQcmludFJlY29yZEJ5dGVzKSwgVHBpVHlwZXMoVHBpVHlwZXMpIHt9CisKKyAgLy8vIFdoZW4gZHVtcGluZyB0eXBlcyBmcm9tIGFuIElQSSBzdHJlYW0gaW4gYSBQREIsIGEgdHlwZSBpbmRleCBtYXkgcmVmZXIgdG8KKyAgLy8vIGEgdHlwZSBvciBhbiBpdGVtIElELiBUaGUgZHVtcGVyIHdpbGwgbG9va3VwIHRoZSAibmFtZSIgb2YgdGhlIGluZGV4IGluCisgIC8vLyB0aGUgaXRlbSBkYXRhYmFzZSBpZiBhcHByb3ByaWF0ZS4gSWYgSXRlbURCIGlzIG51bGwsIGl0IHdpbGwgdXNlIFR5cGVEQiwKKyAgLy8vIHdoaWNoIGlzIGNvcnJlY3Qgd2hlbiBkdW1waW5nIHR5cGVzIGZyb20gYW4gb2JqZWN0IGZpbGUgKC9aNykuCisgIHZvaWQgc2V0SXBpVHlwZXMoVHlwZUNvbGxlY3Rpb24gJlR5cGVzKSB7IElwaVR5cGVzID0gJlR5cGVzOyB9CisKKyAgdm9pZCBwcmludFR5cGVJbmRleChTdHJpbmdSZWYgRmllbGROYW1lLCBUeXBlSW5kZXggVEkpIGNvbnN0OworCisgIHZvaWQgcHJpbnRJdGVtSW5kZXgoU3RyaW5nUmVmIEZpZWxkTmFtZSwgVHlwZUluZGV4IFRJKSBjb25zdDsKKworICAvLy8gQWN0aW9uIHRvIHRha2Ugb24gdW5rbm93biB0eXBlcy4gQnkgZGVmYXVsdCwgdGhleSBhcmUgaWdub3JlZC4KKyAgRXJyb3IgdmlzaXRVbmtub3duVHlwZShDVlR5cGUgJlJlY29yZCkgb3ZlcnJpZGU7CisgIEVycm9yIHZpc2l0VW5rbm93bk1lbWJlcihDVk1lbWJlclJlY29yZCAmUmVjb3JkKSBvdmVycmlkZTsKKworICAvLy8gUGFpcmVkIGJlZ2luL2VuZCBhY3Rpb25zIGZvciBhbGwgdHlwZXMuIFJlY2VpdmVzIGFsbCByZWNvcmQgZGF0YSwKKyAgLy8vIGluY2x1ZGluZyB0aGUgZml4ZWQtbGVuZ3RoIHJlY29yZCBwcmVmaXguCisgIEVycm9yIHZpc2l0VHlwZUJlZ2luKENWVHlwZSAmUmVjb3JkKSBvdmVycmlkZTsKKyAgRXJyb3IgdmlzaXRUeXBlQmVnaW4oQ1ZUeXBlICZSZWNvcmQsIFR5cGVJbmRleCBJbmRleCkgb3ZlcnJpZGU7CisgIEVycm9yIHZpc2l0VHlwZUVuZChDVlR5cGUgJlJlY29yZCkgb3ZlcnJpZGU7CisgIEVycm9yIHZpc2l0TWVtYmVyQmVnaW4oQ1ZNZW1iZXJSZWNvcmQgJlJlY29yZCkgb3ZlcnJpZGU7CisgIEVycm9yIHZpc2l0TWVtYmVyRW5kKENWTWVtYmVyUmVjb3JkICZSZWNvcmQpIG92ZXJyaWRlOworCisjZGVmaW5lIFRZUEVfUkVDT1JEKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFcnJvciB2aXNpdEtub3duUmVjb3JkKENWVHlwZSAmQ1ZSLCBOYW1lIyNSZWNvcmQgJlJlY29yZCkgb3ZlcnJpZGU7CisjZGVmaW5lIE1FTUJFUl9SRUNPUkQoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFcnJvciB2aXNpdEtub3duTWVtYmVyKENWTWVtYmVyUmVjb3JkICZDVlIsIE5hbWUjI1JlY29yZCAmUmVjb3JkKSBvdmVycmlkZTsKKyNkZWZpbmUgVFlQRV9SRUNPUkRfQUxJQVMoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUsIEFsaWFzTmFtZSkKKyNkZWZpbmUgTUVNQkVSX1JFQ09SRF9BTElBUyhFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSwgQWxpYXNOYW1lKQorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3VHlwZXMuZGVmIgorCitwcml2YXRlOgorICB2b2lkIHByaW50TWVtYmVyQXR0cmlidXRlcyhNZW1iZXJBdHRyaWJ1dGVzIEF0dHJzKTsKKyAgdm9pZCBwcmludE1lbWJlckF0dHJpYnV0ZXMoTWVtYmVyQWNjZXNzIEFjY2VzcywgTWV0aG9kS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RPcHRpb25zIE9wdGlvbnMpOworCisgIC8vLyBHZXQgdGhlIGRhdGFiYXNlIG9mIGluZGljZXMgZm9yIHRoZSBzdHJlYW0gdGhhdCB3ZSBhcmUgZHVtcGluZy4gSWYgSXRlbURCCisgIC8vLyBpcyBzZXQsIHRoZW4gd2UgbXVzdCBiZSBkdW1waW5nIGFuIGl0ZW0gKElQSSkgc3RyZWFtLiBUaGlzIHdpbGwgYWxzbworICAvLy8gYWx3YXlzIGdldCB0aGUgYXBwcm9wcmlhdGUgREIgZm9yIHByaW50aW5nIGl0ZW0gbmFtZXMuCisgIFR5cGVDb2xsZWN0aW9uICZnZXRTb3VyY2VUeXBlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gSXBpVHlwZXMgPyAqSXBpVHlwZXMgOiBUcGlUeXBlczsKKyAgfQorCisgIFNjb3BlZFByaW50ZXIgKlc7CisKKyAgYm9vbCBQcmludFJlY29yZEJ5dGVzID0gZmFsc2U7CisKKyAgVHlwZUNvbGxlY3Rpb24gJlRwaVR5cGVzOworICBUeXBlQ29sbGVjdGlvbiAqSXBpVHlwZXMgPSBudWxscHRyOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVIYXNoaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSGFzaGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MTMzNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSGFzaGluZy5oCkBAIC0wLDAgKzEsMjA0IEBACisvLz09PS0gVHlwZUhhc2hpbmcuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKystKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVIQVNISU5HX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRUhBU0hJTkdfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSGFzaGluZy5oIgorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlQ29sbGVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVJbmRleC5oIgorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdFByb3ZpZGVycy5oIgorCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CisKKy8vLyBBIGxvY2FsbHkgaGFzaGVkIHR5cGUgcmVwcmVzZW50cyBhIHN0cmFpZ2h0Zm9yd2FyZCBoYXNoIGNvZGUgb2YgYSBzZXJpYWxpemVkCisvLy8gcmVjb3JkLiAgVGhlIHJlY29yZCBpcyBzaW1wbHkgc2VyaWFsaXplZCwgYW5kIHRoZW4gdGhlIGJ5dGVzIGFyZSBoYXNoZWQgYnkKKy8vLyBhIHN0YW5kYXJkIGFsZ29yaXRobS4gIFRoaXMgaXMgc3VmZmljaWVudCBmb3IgdGhlIGNhc2Ugb2YgZGUtZHVwbGljYXRpbmcKKy8vLyByZWNvcmRzIHdpdGhpbiBhIHNpbmdsZSBzZXF1ZW5jZSBvZiB0eXBlcywgYmVjYXVzZSBpZiB0d28gcmVjb3JkcyBib3RoIGhhdmUKKy8vLyBhIGJhY2stcmVmZXJlbmNlIHRvIHRoZSBzYW1lIHR5cGUgaW4gdGhlIHNhbWUgc3RyZWFtLCB0aGV5IHdpbGwgYm90aCBoYXZlCisvLy8gdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZSBmb3IgdGhlIFR5cGVJbmRleCBvZiB0aGUgYmFjayByZWZlcmVuY2UuCitzdHJ1Y3QgTG9jYWxseUhhc2hlZFR5cGUgeworICBoYXNoX2NvZGUgSGFzaDsKKyAgQXJyYXlSZWY8dWludDhfdD4gUmVjb3JkRGF0YTsKKworICAvLy8gR2l2ZW4gYSB0eXBlLCBjb21wdXRlIGl0cyBsb2NhbCBoYXNoLgorICBzdGF0aWMgTG9jYWxseUhhc2hlZFR5cGUgaGFzaFR5cGUoQXJyYXlSZWY8dWludDhfdD4gUmVjb3JkRGF0YSk7CisKKyAgLy8vIEdpdmVuIGEgc2VxdWVuY2Ugb2YgdHlwZXMsIGNvbXB1dGUgYWxsIG9mIHRoZSBsb2NhbCBoYXNoZXMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSYW5nZT4KKyAgc3RhdGljIHN0ZDo6dmVjdG9yPExvY2FsbHlIYXNoZWRUeXBlPiBoYXNoVHlwZXMoUmFuZ2UgJiZSZWNvcmRzKSB7CisgICAgc3RkOjp2ZWN0b3I8TG9jYWxseUhhc2hlZFR5cGU+IEhhc2hlczsKKyAgICBIYXNoZXMucmVzZXJ2ZShzdGQ6OmRpc3RhbmNlKHN0ZDo6YmVnaW4oUmVjb3JkcyksIHN0ZDo6ZW5kKFJlY29yZHMpKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZSIDogUmVjb3JkcykKKyAgICAgIEhhc2hlcy5wdXNoX2JhY2soaGFzaFR5cGUoUikpOworCisgICAgcmV0dXJuIEhhc2hlczsKKyAgfQorCisgIHN0YXRpYyBzdGQ6OnZlY3RvcjxMb2NhbGx5SGFzaGVkVHlwZT4KKyAgaGFzaFR5cGVDb2xsZWN0aW9uKFR5cGVDb2xsZWN0aW9uICZUeXBlcykgeworICAgIHN0ZDo6dmVjdG9yPExvY2FsbHlIYXNoZWRUeXBlPiBIYXNoZXM7CisgICAgVHlwZXMuRm9yRWFjaFJlY29yZChbJkhhc2hlc10oVHlwZUluZGV4IFRJLCBjb25zdCBDVlR5cGUgJlR5cGUpIHsKKyAgICAgIEhhc2hlcy5wdXNoX2JhY2soaGFzaFR5cGUoVHlwZS5SZWNvcmREYXRhKSk7CisgICAgfSk7CisgICAgcmV0dXJuIEhhc2hlczsKKyAgfQorfTsKKworZW51bSBjbGFzcyBHbG9iYWxUeXBlSGFzaEFsZyA6IHVpbnQxNl90IHsgU0hBMSA9IDAgfTsKKworLy8vIEEgZ2xvYmFsbHkgaGFzaGVkIHR5cGUgcmVwcmVzZW50cyBhIGhhc2ggdmFsdWUgdGhhdCBpcyBzdWZmaWNpZW50IHRvCisvLy8gdW5pcXVlbHkgaWRlbnRpZnkgYSByZWNvcmQgYWNyb3NzIG11bHRpcGxlIHR5cGUgc3RyZWFtcyBvciB0eXBlIHNlcXVlbmNlcy4KKy8vLyBUaGlzIHdvcmtzIGJ5LCBmb3IgYW55IGdpdmVuIHJlY29yZCBBIHdoaWNoIHJlZmVyZW5jZXMgQiwgcmVwbGFjaW5nIHRoZQorLy8vIFR5cGVJbmRleCB0aGF0IHJlZmVycyB0byBCIHdpdGggYSBwcmV2aW91c2x5LWNvbXB1dGVkIGdsb2JhbCBoYXNoIGZvciBCLiAgQXMKKy8vLyB0aGlzIGlzIGEgcmVjdXJzaXZlIGFsZ29yaXRobSAoZS5nLiB0aGUgZ2xvYmFsIGhhc2ggb2YgQiBhbHNvIGRlcGVuZHMgb24gdGhlCisvLy8gZ2xvYmFsIGhhc2hlcyBvZiB0aGUgdHlwZXMgdGhhdCBCIHJlZmVycyB0byksIGEgZ2xvYmFsIGhhc2ggY2FuIHVuaXF1ZWx5CisvLy8gaWRlbnRpZnkgaWRlbnRpZnkgdGhhdCBBIG9jY3VycyBpbiBhbm90aGVyIHN0cmVhbSB0aGF0IGhhcyBhIGNvbXBsZXRlbHkKKy8vLyBkaWZmZXJlbnQgZ3JhcGggc3RydWN0dXJlLiAgQWx0aG91Z2ggdGhlIGhhc2ggaXRzZWxmIGlzIHNsb3dlciB0byBjb21wdXRlLAorLy8vIHByb2JpbmcgaXMgbXVjaCBmYXN0ZXIgd2l0aCBhIGdsb2JhbGx5IGhhc2hlZCB0eXBlLCBiZWNhdXNlIHRoZSBoYXNoIGl0c2VsZgorLy8vIGlzIGNvbnNpZGVyZWQgImFzIGdvb2QgYXMiIHRoZSBvcmlnaW5hbCB0eXBlLiAgU2luY2UgdHlwZSByZWNvcmRzIGNhbiBiZQorLy8vIHF1aXRlIGxhcmdlLCB0aGlzIG1ha2VzIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uIG9mIHRoZSBoYXNoIG11Y2ggZmFzdGVyIHRoYW4KKy8vLyBlcXVhbGl0eSBjb21wYXJpc29uIG9mIGEgZnVsbCByZWNvcmQuCitzdHJ1Y3QgR2xvYmFsbHlIYXNoZWRUeXBlIHsKKyAgR2xvYmFsbHlIYXNoZWRUeXBlKCkgPSBkZWZhdWx0OworICBHbG9iYWxseUhhc2hlZFR5cGUoU3RyaW5nUmVmIEgpCisgICAgICA6IEdsb2JhbGx5SGFzaGVkVHlwZShBcnJheVJlZjx1aW50OF90PihILmJ5dGVzX2JlZ2luKCksIEguYnl0ZXNfZW5kKCkpKSB7fQorICBHbG9iYWxseUhhc2hlZFR5cGUoQXJyYXlSZWY8dWludDhfdD4gSCkgeworICAgIGFzc2VydChILnNpemUoKSA9PSAyMCk7CisgICAgOjptZW1jcHkoSGFzaC5kYXRhKCksIEguZGF0YSgpLCAyMCk7CisgIH0KKyAgc3RkOjphcnJheTx1aW50OF90LCAyMD4gSGFzaDsKKworICAvLy8gR2l2ZW4gYSBzZXF1ZW5jZSBvZiBieXRlcyByZXByZXNlbnRpbmcgYSByZWNvcmQsIGNvbXB1dGUgYSBnbG9iYWwgaGFzaCBmb3IKKyAgLy8vIHRoaXMgcmVjb3JkLiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgZ2xvYmFsIGhhc2hlcyBpbmNvcnBvcmF0aW5nIHRoZSBoYXNoZXMKKyAgLy8vIG9mIHJlZmVyZW5jZWQgcmVjb3JkcywgdGhpcyBmdW5jdGlvbiByZXF1aXJlcyBhIGxpc3Qgb2YgdHlwZXMgYW5kIGlkcworICAvLy8gdGhhdCBSZWNvcmREYXRhIG1pZ2h0IHJlZmVyZW5jZSwgaW5kZXhhYmxlIGJ5IFR5cGVJbmRleC4KKyAgc3RhdGljIEdsb2JhbGx5SGFzaGVkVHlwZSBoYXNoVHlwZShBcnJheVJlZjx1aW50OF90PiBSZWNvcmREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEdsb2JhbGx5SGFzaGVkVHlwZT4gUHJldmlvdXNUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxHbG9iYWxseUhhc2hlZFR5cGU+IFByZXZpb3VzSWRzKTsKKworICAvLy8gR2l2ZW4gYSBzZXF1ZW5jZSBvZiBieXRlcyByZXByZXNlbnRpbmcgYSByZWNvcmQsIGNvbXB1dGUgYSBnbG9iYWwgaGFzaCBmb3IKKyAgLy8vIHRoaXMgcmVjb3JkLiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgZ2xvYmFsIGhhc2hlcyBpbmNvcnBvcmF0aW5nIHRoZSBoYXNoZXMKKyAgLy8vIG9mIHJlZmVyZW5jZWQgcmVjb3JkcywgdGhpcyBmdW5jdGlvbiByZXF1aXJlcyBhIGxpc3Qgb2YgdHlwZXMgYW5kIGlkcworICAvLy8gdGhhdCBSZWNvcmREYXRhIG1pZ2h0IHJlZmVyZW5jZSwgaW5kZXhhYmxlIGJ5IFR5cGVJbmRleC4KKyAgc3RhdGljIEdsb2JhbGx5SGFzaGVkVHlwZSBoYXNoVHlwZShDVlR5cGUgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxHbG9iYWxseUhhc2hlZFR5cGU+IFByZXZpb3VzVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8R2xvYmFsbHlIYXNoZWRUeXBlPiBQcmV2aW91c0lkcykgeworICAgIHJldHVybiBoYXNoVHlwZShUeXBlLlJlY29yZERhdGEsIFByZXZpb3VzVHlwZXMsIFByZXZpb3VzSWRzKTsKKyAgfQorCisgIC8vLyBHaXZlbiBhIHNlcXVlbmNlIG9mIGNvbWJpbmVkIHR5cGUgYW5kIElEIHJlY29yZHMsIGNvbXB1dGUgZ2xvYmFsIGhhc2hlcworICAvLy8gZm9yIGVhY2ggb2YgdGhlbSwgcmV0dXJuaW5nIHRoZSByZXN1bHRzIGluIGEgdmVjdG9yIG9mIGhhc2hlZCB0eXBlcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJhbmdlPgorICBzdGF0aWMgc3RkOjp2ZWN0b3I8R2xvYmFsbHlIYXNoZWRUeXBlPiBoYXNoVHlwZXMoUmFuZ2UgJiZSZWNvcmRzKSB7CisgICAgc3RkOjp2ZWN0b3I8R2xvYmFsbHlIYXNoZWRUeXBlPiBIYXNoZXM7CisgICAgZm9yIChjb25zdCBhdXRvICZSIDogUmVjb3JkcykKKyAgICAgIEhhc2hlcy5wdXNoX2JhY2soaGFzaFR5cGUoUiwgSGFzaGVzLCBIYXNoZXMpKTsKKworICAgIHJldHVybiBIYXNoZXM7CisgIH0KKworICAvLy8gR2l2ZW4gYSBzZXF1ZW5jZSBvZiBjb21iaW5lZCB0eXBlIGFuZCBJRCByZWNvcmRzLCBjb21wdXRlIGdsb2JhbCBoYXNoZXMKKyAgLy8vIGZvciBlYWNoIG9mIHRoZW0sIHJldHVybmluZyB0aGUgcmVzdWx0cyBpbiBhIHZlY3RvciBvZiBoYXNoZWQgdHlwZXMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSYW5nZT4KKyAgc3RhdGljIHN0ZDo6dmVjdG9yPEdsb2JhbGx5SGFzaGVkVHlwZT4KKyAgaGFzaElkcyhSYW5nZSAmJlJlY29yZHMsIEFycmF5UmVmPEdsb2JhbGx5SGFzaGVkVHlwZT4gVHlwZUhhc2hlcykgeworICAgIHN0ZDo6dmVjdG9yPEdsb2JhbGx5SGFzaGVkVHlwZT4gSWRIYXNoZXM7CisgICAgZm9yIChjb25zdCBhdXRvICZSIDogUmVjb3JkcykKKyAgICAgIElkSGFzaGVzLnB1c2hfYmFjayhoYXNoVHlwZShSLCBUeXBlSGFzaGVzLCBJZEhhc2hlcykpOworCisgICAgcmV0dXJuIElkSGFzaGVzOworICB9CisKKyAgc3RhdGljIHN0ZDo6dmVjdG9yPEdsb2JhbGx5SGFzaGVkVHlwZT4KKyAgaGFzaFR5cGVDb2xsZWN0aW9uKFR5cGVDb2xsZWN0aW9uICZUeXBlcykgeworICAgIHN0ZDo6dmVjdG9yPEdsb2JhbGx5SGFzaGVkVHlwZT4gSGFzaGVzOworICAgIFR5cGVzLkZvckVhY2hSZWNvcmQoWyZIYXNoZXNdKFR5cGVJbmRleCBUSSwgY29uc3QgQ1ZUeXBlICZUeXBlKSB7CisgICAgICBIYXNoZXMucHVzaF9iYWNrKGhhc2hUeXBlKFR5cGUuUmVjb3JkRGF0YSwgSGFzaGVzLCBIYXNoZXMpKTsKKyAgICB9KTsKKyAgICByZXR1cm4gSGFzaGVzOworICB9Cit9OworI2lmIGRlZmluZWQoX01TQ19WRVIpCisvLyBpc190cml2aWFsbHlfY29weWFibGUgaXMgbm90IGF2YWlsYWJsZSBpbiBvbGRlciB2ZXJzaW9ucyBvZiBsaWJjKyssIGJ1dCBpdCBpcworLy8gYXZhaWxhYmxlIGluIGFsbCBzdXBwb3J0ZWQgdmVyc2lvbnMgb2YgTVNWQywgc28gYXQgbGVhc3QgdGhpcyBnaXZlcyB1cyBzb21lCisvLyBjb3ZlcmFnZS4KK3N0YXRpY19hc3NlcnQoc3RkOjppc190cml2aWFsbHlfY29weWFibGU8R2xvYmFsbHlIYXNoZWRUeXBlPjo6dmFsdWUsCisgICAgICAgICAgICAgICJHbG9iYWxseUhhc2hlZFR5cGUgbXVzdCBiZSB0cml2aWFsbHkgY29weWFibGUgc28gdGhhdCB3ZSBjYW4gIgorICAgICAgICAgICAgICAicmVpbnRlcnByZXRfY2FzdCBhcnJheXMgb2YgaGFzaCBkYXRhIHRvIGFycmF5cyBvZiAiCisgICAgICAgICAgICAgICJHbG9iYWxseUhhc2hlZFR5cGUiKTsKKyNlbmRpZgorfSAvLyBuYW1lc3BhY2UgY29kZXZpZXcKKwordGVtcGxhdGUgPD4gc3RydWN0IERlbnNlTWFwSW5mbzxjb2Rldmlldzo6TG9jYWxseUhhc2hlZFR5cGU+IHsKKyAgc3RhdGljIGNvZGV2aWV3OjpMb2NhbGx5SGFzaGVkVHlwZSBFbXB0eTsKKyAgc3RhdGljIGNvZGV2aWV3OjpMb2NhbGx5SGFzaGVkVHlwZSBUb21ic3RvbmU7CisKKyAgc3RhdGljIGNvZGV2aWV3OjpMb2NhbGx5SGFzaGVkVHlwZSBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIEVtcHR5OyB9CisKKyAgc3RhdGljIGNvZGV2aWV3OjpMb2NhbGx5SGFzaGVkVHlwZSBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiBUb21ic3RvbmU7IH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvZGV2aWV3OjpMb2NhbGx5SGFzaGVkVHlwZSBWYWwpIHsKKyAgICByZXR1cm4gVmFsLkhhc2g7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvZGV2aWV3OjpMb2NhbGx5SGFzaGVkVHlwZSBMSFMsCisgICAgICAgICAgICAgICAgICAgICAgY29kZXZpZXc6OkxvY2FsbHlIYXNoZWRUeXBlIFJIUykgeworICAgIGlmIChMSFMuSGFzaCAhPSBSSFMuSGFzaCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gTEhTLlJlY29yZERhdGEgPT0gUkhTLlJlY29yZERhdGE7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88Y29kZXZpZXc6Okdsb2JhbGx5SGFzaGVkVHlwZT4geworICBzdGF0aWMgY29kZXZpZXc6Okdsb2JhbGx5SGFzaGVkVHlwZSBFbXB0eTsKKyAgc3RhdGljIGNvZGV2aWV3OjpHbG9iYWxseUhhc2hlZFR5cGUgVG9tYnN0b25lOworCisgIHN0YXRpYyBjb2Rldmlldzo6R2xvYmFsbHlIYXNoZWRUeXBlIGdldEVtcHR5S2V5KCkgeyByZXR1cm4gRW1wdHk7IH0KKworICBzdGF0aWMgY29kZXZpZXc6Okdsb2JhbGx5SGFzaGVkVHlwZSBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiBUb21ic3RvbmU7IH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvZGV2aWV3OjpHbG9iYWxseUhhc2hlZFR5cGUgVmFsKSB7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkICo+KFZhbC5IYXNoLmRhdGEoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvZGV2aWV3OjpHbG9iYWxseUhhc2hlZFR5cGUgTEhTLAorICAgICAgICAgICAgICAgICAgICAgIGNvZGV2aWV3OjpHbG9iYWxseUhhc2hlZFR5cGUgUkhTKSB7CisgICAgcmV0dXJuIExIUy5IYXNoID09IFJIUy5IYXNoOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgZm9ybWF0X3Byb3ZpZGVyPGNvZGV2aWV3OjpMb2NhbGx5SGFzaGVkVHlwZT4geworcHVibGljOgorICBzdGF0aWMgdm9pZCBmb3JtYXQoY29uc3QgY29kZXZpZXc6OkxvY2FsbHlIYXNoZWRUeXBlICZWLAorICAgICAgICAgICAgICAgICAgICAgbGx2bTo6cmF3X29zdHJlYW0gJlN0cmVhbSwgU3RyaW5nUmVmIFN0eWxlKSB7CisgICAgd3JpdGVfaGV4KFN0cmVhbSwgVi5IYXNoLCBIZXhQcmludFN0eWxlOjpVcHBlciwgOCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBmb3JtYXRfcHJvdmlkZXI8Y29kZXZpZXc6Okdsb2JhbGx5SGFzaGVkVHlwZT4geworcHVibGljOgorICBzdGF0aWMgdm9pZCBmb3JtYXQoY29uc3QgY29kZXZpZXc6Okdsb2JhbGx5SGFzaGVkVHlwZSAmViwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm06OnJhd19vc3RyZWFtICZTdHJlYW0sIFN0cmluZ1JlZiBTdHlsZSkgeworICAgIGZvciAodWludDhfdCBCIDogVi5IYXNoKSB7CisgICAgICB3cml0ZV9oZXgoU3RyZWFtLCBCLCBIZXhQcmludFN0eWxlOjpVcHBlciwgMik7CisgICAgfQorICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUluZGV4LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzEyODFkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUluZGV4LmgKQEAgLTAsMCArMSwyOTEgQEAKKy8vPT09LSBUeXBlSW5kZXguaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRUlOREVYX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRUlOREVYX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwSW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNpbnR0eXBlcz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFNjb3BlZFByaW50ZXI7CisKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIFR5cGVDb2xsZWN0aW9uOworCitlbnVtIGNsYXNzIFNpbXBsZVR5cGVLaW5kIDogdWludDMyX3QgeworICBOb25lID0gMHgwMDAwLCAgICAgICAgICAvLyB1bmNoYXJhY3Rlcml6ZWQgdHlwZSAobm8gdHlwZSkKKyAgVm9pZCA9IDB4MDAwMywgICAgICAgICAgLy8gdm9pZAorICBOb3RUcmFuc2xhdGVkID0gMHgwMDA3LCAvLyB0eXBlIG5vdCB0cmFuc2xhdGVkIGJ5IGN2cGFjaworICBIUmVzdWx0ID0gMHgwMDA4LCAgICAgICAvLyBPTEUvQ09NIEhSRVNVTFQKKworICBTaWduZWRDaGFyYWN0ZXIgPSAweDAwMTAsICAgLy8gOCBiaXQgc2lnbmVkCisgIFVuc2lnbmVkQ2hhcmFjdGVyID0gMHgwMDIwLCAvLyA4IGJpdCB1bnNpZ25lZAorICBOYXJyb3dDaGFyYWN0ZXIgPSAweDAwNzAsICAgLy8gcmVhbGx5IGEgY2hhcgorICBXaWRlQ2hhcmFjdGVyID0gMHgwMDcxLCAgICAgLy8gd2lkZSBjaGFyCisgIENoYXJhY3RlcjE2ID0gMHgwMDdhLCAgICAgICAvLyBjaGFyMTZfdAorICBDaGFyYWN0ZXIzMiA9IDB4MDA3YiwgICAgICAgLy8gY2hhcjMyX3QKKworICBTQnl0ZSA9IDB4MDA2OCwgICAgICAgLy8gOCBiaXQgc2lnbmVkIGludAorICBCeXRlID0gMHgwMDY5LCAgICAgICAgLy8gOCBiaXQgdW5zaWduZWQgaW50CisgIEludDE2U2hvcnQgPSAweDAwMTEsICAvLyAxNiBiaXQgc2lnbmVkCisgIFVJbnQxNlNob3J0ID0gMHgwMDIxLCAvLyAxNiBiaXQgdW5zaWduZWQKKyAgSW50MTYgPSAweDAwNzIsICAgICAgIC8vIDE2IGJpdCBzaWduZWQgaW50CisgIFVJbnQxNiA9IDB4MDA3MywgICAgICAvLyAxNiBiaXQgdW5zaWduZWQgaW50CisgIEludDMyTG9uZyA9IDB4MDAxMiwgICAvLyAzMiBiaXQgc2lnbmVkCisgIFVJbnQzMkxvbmcgPSAweDAwMjIsICAvLyAzMiBiaXQgdW5zaWduZWQKKyAgSW50MzIgPSAweDAwNzQsICAgICAgIC8vIDMyIGJpdCBzaWduZWQgaW50CisgIFVJbnQzMiA9IDB4MDA3NSwgICAgICAvLyAzMiBiaXQgdW5zaWduZWQgaW50CisgIEludDY0UXVhZCA9IDB4MDAxMywgICAvLyA2NCBiaXQgc2lnbmVkCisgIFVJbnQ2NFF1YWQgPSAweDAwMjMsICAvLyA2NCBiaXQgdW5zaWduZWQKKyAgSW50NjQgPSAweDAwNzYsICAgICAgIC8vIDY0IGJpdCBzaWduZWQgaW50CisgIFVJbnQ2NCA9IDB4MDA3NywgICAgICAvLyA2NCBiaXQgdW5zaWduZWQgaW50CisgIEludDEyOE9jdCA9IDB4MDAxNCwgICAvLyAxMjggYml0IHNpZ25lZCBpbnQKKyAgVUludDEyOE9jdCA9IDB4MDAyNCwgIC8vIDEyOCBiaXQgdW5zaWduZWQgaW50CisgIEludDEyOCA9IDB4MDA3OCwgICAgICAvLyAxMjggYml0IHNpZ25lZCBpbnQKKyAgVUludDEyOCA9IDB4MDA3OSwgICAgIC8vIDEyOCBiaXQgdW5zaWduZWQgaW50CisKKyAgRmxvYXQxNiA9IDB4MDA0NiwgICAgICAgICAgICAgICAgIC8vIDE2IGJpdCByZWFsCisgIEZsb2F0MzIgPSAweDAwNDAsICAgICAgICAgICAgICAgICAvLyAzMiBiaXQgcmVhbAorICBGbG9hdDMyUGFydGlhbFByZWNpc2lvbiA9IDB4MDA0NSwgLy8gMzIgYml0IFBQIHJlYWwKKyAgRmxvYXQ0OCA9IDB4MDA0NCwgICAgICAgICAgICAgICAgIC8vIDQ4IGJpdCByZWFsCisgIEZsb2F0NjQgPSAweDAwNDEsICAgICAgICAgICAgICAgICAvLyA2NCBiaXQgcmVhbAorICBGbG9hdDgwID0gMHgwMDQyLCAgICAgICAgICAgICAgICAgLy8gODAgYml0IHJlYWwKKyAgRmxvYXQxMjggPSAweDAwNDMsICAgICAgICAgICAgICAgIC8vIDEyOCBiaXQgcmVhbAorCisgIENvbXBsZXgxNiA9IDB4MDA1NiwgICAgICAgICAgICAgICAgIC8vIDE2IGJpdCBjb21wbGV4CisgIENvbXBsZXgzMiA9IDB4MDA1MCwgICAgICAgICAgICAgICAgIC8vIDMyIGJpdCBjb21wbGV4CisgIENvbXBsZXgzMlBhcnRpYWxQcmVjaXNpb24gPSAweDAwNTUsIC8vIDMyIGJpdCBQUCBjb21wbGV4CisgIENvbXBsZXg0OCA9IDB4MDA1NCwgICAgICAgICAgICAgICAgIC8vIDQ4IGJpdCBjb21wbGV4CisgIENvbXBsZXg2NCA9IDB4MDA1MSwgICAgICAgICAgICAgICAgIC8vIDY0IGJpdCBjb21wbGV4CisgIENvbXBsZXg4MCA9IDB4MDA1MiwgICAgICAgICAgICAgICAgIC8vIDgwIGJpdCBjb21wbGV4CisgIENvbXBsZXgxMjggPSAweDAwNTMsICAgICAgICAgICAgICAgIC8vIDEyOCBiaXQgY29tcGxleAorCisgIEJvb2xlYW44ID0gMHgwMDMwLCAgIC8vIDggYml0IGJvb2xlYW4KKyAgQm9vbGVhbjE2ID0gMHgwMDMxLCAgLy8gMTYgYml0IGJvb2xlYW4KKyAgQm9vbGVhbjMyID0gMHgwMDMyLCAgLy8gMzIgYml0IGJvb2xlYW4KKyAgQm9vbGVhbjY0ID0gMHgwMDMzLCAgLy8gNjQgYml0IGJvb2xlYW4KKyAgQm9vbGVhbjEyOCA9IDB4MDAzNCwgLy8gMTI4IGJpdCBib29sZWFuCit9OworCitlbnVtIGNsYXNzIFNpbXBsZVR5cGVNb2RlIDogdWludDMyX3QgeworICBEaXJlY3QgPSAweDAwMDAwMDAwLCAgICAgICAgLy8gTm90IGEgcG9pbnRlcgorICBOZWFyUG9pbnRlciA9IDB4MDAwMDAxMDAsICAgLy8gTmVhciBwb2ludGVyCisgIEZhclBvaW50ZXIgPSAweDAwMDAwMjAwLCAgICAvLyBGYXIgcG9pbnRlcgorICBIdWdlUG9pbnRlciA9IDB4MDAwMDAzMDAsICAgLy8gSHVnZSBwb2ludGVyCisgIE5lYXJQb2ludGVyMzIgPSAweDAwMDAwNDAwLCAvLyAzMiBiaXQgbmVhciBwb2ludGVyCisgIEZhclBvaW50ZXIzMiA9IDB4MDAwMDA1MDAsICAvLyAzMiBiaXQgZmFyIHBvaW50ZXIKKyAgTmVhclBvaW50ZXI2NCA9IDB4MDAwMDA2MDAsIC8vIDY0IGJpdCBuZWFyIHBvaW50ZXIKKyAgTmVhclBvaW50ZXIxMjggPSAweDAwMDAwNzAwIC8vIDEyOCBiaXQgbmVhciBwb2ludGVyCit9OworCisvLy8gQSAzMi1iaXQgdHlwZSByZWZlcmVuY2UuIFR5cGVzIGFyZSBpbmRleGVkIGJ5IHRoZWlyIG9yZGVyIG9mIGFwcGVhcmFuY2UgaW4KKy8vLyAuZGVidWckVCBwbHVzIDB4MTAwMC4gVHlwZSBpbmRpY2VzIGxlc3MgdGhhbiAweDEwMDAgYXJlICJzaW1wbGUiIHR5cGVzLAorLy8vIGNvbXBvc2VkIG9mIGEgU2ltcGxlVHlwZU1vZGUgYnl0ZSBmb2xsb3dlZCBieSBhIFNpbXBsZVR5cGVLaW5kIGJ5dGUuCitjbGFzcyBUeXBlSW5kZXggeworcHVibGljOgorICBzdGF0aWMgY29uc3QgdWludDMyX3QgRmlyc3ROb25TaW1wbGVJbmRleCA9IDB4MTAwMDsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IFNpbXBsZUtpbmRNYXNrID0gMHgwMDAwMDBmZjsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IFNpbXBsZU1vZGVNYXNrID0gMHgwMDAwMDcwMDsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERlY29yYXRlZEl0ZW1JZE1hc2sgPSAweDgwMDAwMDAwOworCitwdWJsaWM6CisgIFR5cGVJbmRleCgpIDogSW5kZXgoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFNpbXBsZVR5cGVLaW5kOjpOb25lKSkge30KKyAgZXhwbGljaXQgVHlwZUluZGV4KHVpbnQzMl90IEluZGV4KSA6IEluZGV4KEluZGV4KSB7fQorICBleHBsaWNpdCBUeXBlSW5kZXgoU2ltcGxlVHlwZUtpbmQgS2luZCkKKyAgICAgIDogSW5kZXgoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEtpbmQpKSB7fQorICBUeXBlSW5kZXgoU2ltcGxlVHlwZUtpbmQgS2luZCwgU2ltcGxlVHlwZU1vZGUgTW9kZSkKKyAgICAgIDogSW5kZXgoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEtpbmQpIHwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1vZGUpKSB7fQorCisgIHVpbnQzMl90IGdldEluZGV4KCkgY29uc3QgeyByZXR1cm4gSW5kZXg7IH0KKyAgdm9pZCBzZXRJbmRleCh1aW50MzJfdCBJKSB7IEluZGV4ID0gSTsgfQorICBib29sIGlzU2ltcGxlKCkgY29uc3QgeyByZXR1cm4gSW5kZXggPCBGaXJzdE5vblNpbXBsZUluZGV4OyB9CisgIGJvb2wgaXNEZWNvcmF0ZWRJdGVtSWQoKSBjb25zdCB7IHJldHVybiAhIShJbmRleCAmIERlY29yYXRlZEl0ZW1JZE1hc2spOyB9CisKKyAgYm9vbCBpc05vbmVUeXBlKCkgY29uc3QgeyByZXR1cm4gKnRoaXMgPT0gTm9uZSgpOyB9CisKKyAgdWludDMyX3QgdG9BcnJheUluZGV4KCkgY29uc3QgeworICAgIGFzc2VydCghaXNTaW1wbGUoKSk7CisgICAgcmV0dXJuIGdldEluZGV4KCkgLSBGaXJzdE5vblNpbXBsZUluZGV4OworICB9CisKKyAgc3RhdGljIFR5cGVJbmRleCBmcm9tQXJyYXlJbmRleCh1aW50MzJfdCBJbmRleCkgeworICAgIHJldHVybiBUeXBlSW5kZXgoSW5kZXggKyBGaXJzdE5vblNpbXBsZUluZGV4KTsKKyAgfQorCisgIFNpbXBsZVR5cGVLaW5kIGdldFNpbXBsZUtpbmQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzU2ltcGxlKCkpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTaW1wbGVUeXBlS2luZD4oSW5kZXggJiBTaW1wbGVLaW5kTWFzayk7CisgIH0KKworICBTaW1wbGVUeXBlTW9kZSBnZXRTaW1wbGVNb2RlKCkgY29uc3QgeworICAgIGFzc2VydChpc1NpbXBsZSgpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U2ltcGxlVHlwZU1vZGU+KEluZGV4ICYgU2ltcGxlTW9kZU1hc2spOworICB9CisKKyAgc3RhdGljIFR5cGVJbmRleCBOb25lKCkgeyByZXR1cm4gVHlwZUluZGV4KFNpbXBsZVR5cGVLaW5kOjpOb25lKTsgfQorICBzdGF0aWMgVHlwZUluZGV4IFZvaWQoKSB7IHJldHVybiBUeXBlSW5kZXgoU2ltcGxlVHlwZUtpbmQ6OlZvaWQpOyB9CisgIHN0YXRpYyBUeXBlSW5kZXggVm9pZFBvaW50ZXIzMigpIHsKKyAgICByZXR1cm4gVHlwZUluZGV4KFNpbXBsZVR5cGVLaW5kOjpWb2lkLCBTaW1wbGVUeXBlTW9kZTo6TmVhclBvaW50ZXIzMik7CisgIH0KKyAgc3RhdGljIFR5cGVJbmRleCBWb2lkUG9pbnRlcjY0KCkgeworICAgIHJldHVybiBUeXBlSW5kZXgoU2ltcGxlVHlwZUtpbmQ6OlZvaWQsIFNpbXBsZVR5cGVNb2RlOjpOZWFyUG9pbnRlcjY0KTsKKyAgfQorCisgIHN0YXRpYyBUeXBlSW5kZXggU2lnbmVkQ2hhcmFjdGVyKCkgeworICAgIHJldHVybiBUeXBlSW5kZXgoU2ltcGxlVHlwZUtpbmQ6OlNpZ25lZENoYXJhY3Rlcik7CisgIH0KKyAgc3RhdGljIFR5cGVJbmRleCBVbnNpZ25lZENoYXJhY3RlcigpIHsKKyAgICByZXR1cm4gVHlwZUluZGV4KFNpbXBsZVR5cGVLaW5kOjpVbnNpZ25lZENoYXJhY3Rlcik7CisgIH0KKyAgc3RhdGljIFR5cGVJbmRleCBOYXJyb3dDaGFyYWN0ZXIoKSB7CisgICAgcmV0dXJuIFR5cGVJbmRleChTaW1wbGVUeXBlS2luZDo6TmFycm93Q2hhcmFjdGVyKTsKKyAgfQorICBzdGF0aWMgVHlwZUluZGV4IFdpZGVDaGFyYWN0ZXIoKSB7CisgICAgcmV0dXJuIFR5cGVJbmRleChTaW1wbGVUeXBlS2luZDo6V2lkZUNoYXJhY3Rlcik7CisgIH0KKyAgc3RhdGljIFR5cGVJbmRleCBJbnQxNlNob3J0KCkgeworICAgIHJldHVybiBUeXBlSW5kZXgoU2ltcGxlVHlwZUtpbmQ6OkludDE2U2hvcnQpOworICB9CisgIHN0YXRpYyBUeXBlSW5kZXggVUludDE2U2hvcnQoKSB7CisgICAgcmV0dXJuIFR5cGVJbmRleChTaW1wbGVUeXBlS2luZDo6VUludDE2U2hvcnQpOworICB9CisgIHN0YXRpYyBUeXBlSW5kZXggSW50MzIoKSB7IHJldHVybiBUeXBlSW5kZXgoU2ltcGxlVHlwZUtpbmQ6OkludDMyKTsgfQorICBzdGF0aWMgVHlwZUluZGV4IFVJbnQzMigpIHsgcmV0dXJuIFR5cGVJbmRleChTaW1wbGVUeXBlS2luZDo6VUludDMyKTsgfQorICBzdGF0aWMgVHlwZUluZGV4IEludDMyTG9uZygpIHsgcmV0dXJuIFR5cGVJbmRleChTaW1wbGVUeXBlS2luZDo6SW50MzJMb25nKTsgfQorICBzdGF0aWMgVHlwZUluZGV4IFVJbnQzMkxvbmcoKSB7CisgICAgcmV0dXJuIFR5cGVJbmRleChTaW1wbGVUeXBlS2luZDo6VUludDMyTG9uZyk7CisgIH0KKyAgc3RhdGljIFR5cGVJbmRleCBJbnQ2NCgpIHsgcmV0dXJuIFR5cGVJbmRleChTaW1wbGVUeXBlS2luZDo6SW50NjQpOyB9CisgIHN0YXRpYyBUeXBlSW5kZXggVUludDY0KCkgeyByZXR1cm4gVHlwZUluZGV4KFNpbXBsZVR5cGVLaW5kOjpVSW50NjQpOyB9CisgIHN0YXRpYyBUeXBlSW5kZXggSW50NjRRdWFkKCkgeyByZXR1cm4gVHlwZUluZGV4KFNpbXBsZVR5cGVLaW5kOjpJbnQ2NFF1YWQpOyB9CisgIHN0YXRpYyBUeXBlSW5kZXggVUludDY0UXVhZCgpIHsKKyAgICByZXR1cm4gVHlwZUluZGV4KFNpbXBsZVR5cGVLaW5kOjpVSW50NjRRdWFkKTsKKyAgfQorCisgIHN0YXRpYyBUeXBlSW5kZXggRmxvYXQzMigpIHsgcmV0dXJuIFR5cGVJbmRleChTaW1wbGVUeXBlS2luZDo6RmxvYXQzMik7IH0KKyAgc3RhdGljIFR5cGVJbmRleCBGbG9hdDY0KCkgeyByZXR1cm4gVHlwZUluZGV4KFNpbXBsZVR5cGVLaW5kOjpGbG9hdDY0KTsgfQorCisgIFR5cGVJbmRleCAmb3BlcmF0b3IrPSh1bnNpZ25lZCBOKSB7CisgICAgSW5kZXggKz0gTjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUeXBlSW5kZXggJm9wZXJhdG9yKysoKSB7CisgICAgSW5kZXggKz0gMTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUeXBlSW5kZXggb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBUeXBlSW5kZXggQ29weSA9ICp0aGlzOworICAgIG9wZXJhdG9yKysoKTsKKyAgICByZXR1cm4gQ29weTsKKyAgfQorCisgIFR5cGVJbmRleCAmb3BlcmF0b3ItPSh1bnNpZ25lZCBOKSB7CisgICAgYXNzZXJ0KEluZGV4ID49IE4pOworICAgIEluZGV4IC09IE47CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVHlwZUluZGV4ICZvcGVyYXRvci0tKCkgeworICAgIEluZGV4IC09IDE7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVHlwZUluZGV4IG9wZXJhdG9yLS0oaW50KSB7CisgICAgVHlwZUluZGV4IENvcHkgPSAqdGhpczsKKyAgICBvcGVyYXRvci0tKCk7CisgICAgcmV0dXJuIENvcHk7CisgIH0KKworICBmcmllbmQgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUeXBlSW5kZXggJkEsIGNvbnN0IFR5cGVJbmRleCAmQikgeworICAgIHJldHVybiBBLmdldEluZGV4KCkgPT0gQi5nZXRJbmRleCgpOworICB9CisKKyAgZnJpZW5kIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgVHlwZUluZGV4ICZBLCBjb25zdCBUeXBlSW5kZXggJkIpIHsKKyAgICByZXR1cm4gQS5nZXRJbmRleCgpICE9IEIuZ2V0SW5kZXgoKTsKKyAgfQorCisgIGZyaWVuZCBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgVHlwZUluZGV4ICZBLCBjb25zdCBUeXBlSW5kZXggJkIpIHsKKyAgICByZXR1cm4gQS5nZXRJbmRleCgpIDwgQi5nZXRJbmRleCgpOworICB9CisKKyAgZnJpZW5kIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgVHlwZUluZGV4ICZBLCBjb25zdCBUeXBlSW5kZXggJkIpIHsKKyAgICByZXR1cm4gQS5nZXRJbmRleCgpIDw9IEIuZ2V0SW5kZXgoKTsKKyAgfQorCisgIGZyaWVuZCBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgVHlwZUluZGV4ICZBLCBjb25zdCBUeXBlSW5kZXggJkIpIHsKKyAgICByZXR1cm4gQS5nZXRJbmRleCgpID4gQi5nZXRJbmRleCgpOworICB9CisKKyAgZnJpZW5kIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgVHlwZUluZGV4ICZBLCBjb25zdCBUeXBlSW5kZXggJkIpIHsKKyAgICByZXR1cm4gQS5nZXRJbmRleCgpID49IEIuZ2V0SW5kZXgoKTsKKyAgfQorCisgIGZyaWVuZCBpbmxpbmUgVHlwZUluZGV4IG9wZXJhdG9yKyhjb25zdCBUeXBlSW5kZXggJkEsIHVpbnQzMl90IE4pIHsKKyAgICBUeXBlSW5kZXggUmVzdWx0KEEpOworICAgIFJlc3VsdCArPSBOOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICBmcmllbmQgaW5saW5lIFR5cGVJbmRleCBvcGVyYXRvci0oY29uc3QgVHlwZUluZGV4ICZBLCB1aW50MzJfdCBOKSB7CisgICAgYXNzZXJ0KEEuZ2V0SW5kZXgoKSA+PSBOKTsKKyAgICBUeXBlSW5kZXggUmVzdWx0KEEpOworICAgIFJlc3VsdCAtPSBOOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICBmcmllbmQgaW5saW5lIHVpbnQzMl90IG9wZXJhdG9yLShjb25zdCBUeXBlSW5kZXggJkEsIGNvbnN0IFR5cGVJbmRleCAmQikgeworICAgIGFzc2VydChBID49IEIpOworICAgIHJldHVybiBBLnRvQXJyYXlJbmRleCgpIC0gQi50b0FycmF5SW5kZXgoKTsKKyAgfQorCisgIHN0YXRpYyBTdHJpbmdSZWYgc2ltcGxlVHlwZU5hbWUoVHlwZUluZGV4IFRJKTsKKworcHJpdmF0ZToKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgSW5kZXg7Cit9OworCisvLyBVc2VkIGZvciBwc2V1ZG8taW5kZXhpbmcgYW4gYXJyYXkgb2YgdHlwZSByZWNvcmRzLiAgQW4gYXJyYXkgb2Ygc3VjaCByZWNvcmRzCisvLyBzb3J0ZWQgYnkgVHlwZUluZGV4IGNhbiBhbGxvdyBsb2coTikgbG9va3VwcyBldmVuIHRob3VnaCBzdWNoIGEgdHlwZSByZWNvcmQKKy8vIHN0cmVhbSBkb2VzIG5vdCBwcm92aWRlIHJhbmRvbSBhY2Nlc3MuCitzdHJ1Y3QgVHlwZUluZGV4T2Zmc2V0IHsKKyAgVHlwZUluZGV4IFR5cGU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE9mZnNldDsKK307CisKK3ZvaWQgcHJpbnRUeXBlSW5kZXgoU2NvcGVkUHJpbnRlciAmUHJpbnRlciwgU3RyaW5nUmVmIEZpZWxkTmFtZSwgVHlwZUluZGV4IFRJLAorICAgICAgICAgICAgICAgICAgICBUeXBlQ29sbGVjdGlvbiAmVHlwZXMpOworfQorCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPGNvZGV2aWV3OjpUeXBlSW5kZXg+IHsKKyAgc3RhdGljIGlubGluZSBjb2Rldmlldzo6VHlwZUluZGV4IGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBjb2Rldmlldzo6VHlwZUluZGV4e0RlbnNlTWFwSW5mbzx1aW50MzJfdD46OmdldEVtcHR5S2V5KCl9OworICB9CisgIHN0YXRpYyBpbmxpbmUgY29kZXZpZXc6OlR5cGVJbmRleCBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgcmV0dXJuIGNvZGV2aWV3OjpUeXBlSW5kZXh7RGVuc2VNYXBJbmZvPHVpbnQzMl90Pjo6Z2V0VG9tYnN0b25lS2V5KCl9OworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgY29kZXZpZXc6OlR5cGVJbmRleCAmVEkpIHsKKyAgICByZXR1cm4gRGVuc2VNYXBJbmZvPHVpbnQzMl90Pjo6Z2V0SGFzaFZhbHVlKFRJLmdldEluZGV4KCkpOworICB9CisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgY29kZXZpZXc6OlR5cGVJbmRleCAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGV2aWV3OjpUeXBlSW5kZXggJlJIUykgeworICAgIHJldHVybiBMSFMgPT0gUkhTOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUluZGV4RGlzY292ZXJ5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXhEaXNjb3ZlcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDI0YTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUluZGV4RGlzY292ZXJ5LmgKQEAgLTAsMCArMSw0NyBAQAorLy89PT0tIFR5cGVJbmRleERpc2NvdmVyeS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFSU5ERVhESVNDT1ZFUllfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFSU5ERVhESVNDT1ZFUllfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CitlbnVtIGNsYXNzIFRpUmVmS2luZCB7IFR5cGVSZWYsIEluZGV4UmVmIH07CitzdHJ1Y3QgVGlSZWZlcmVuY2UgeworICBUaVJlZktpbmQgS2luZDsKKyAgdWludDMyX3QgT2Zmc2V0OworICB1aW50MzJfdCBDb3VudDsKK307CisKK3ZvaWQgZGlzY292ZXJUeXBlSW5kaWNlcyhBcnJheVJlZjx1aW50OF90PiBSZWNvcmREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxUaVJlZmVyZW5jZT4gJlJlZnMpOwordm9pZCBkaXNjb3ZlclR5cGVJbmRpY2VzKGNvbnN0IENWVHlwZSAmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VGlSZWZlcmVuY2U+ICZSZWZzKTsKK3ZvaWQgZGlzY292ZXJUeXBlSW5kaWNlcyhjb25zdCBDVlR5cGUgJlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFR5cGVJbmRleD4gJkluZGljZXMpOwordm9pZCBkaXNjb3ZlclR5cGVJbmRpY2VzKEFycmF5UmVmPHVpbnQ4X3Q+IFJlY29yZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFR5cGVJbmRleD4gJkluZGljZXMpOworCisvLy8gRGlzY292ZXIgdHlwZSBpbmRpY2VzIGluIHN5bWJvbCByZWNvcmRzLiBSZXR1cm5zIGZhbHNlIGlmIHRoaXMgaXMgYW4gdW5rbm93bgorLy8vIHJlY29yZC4KK2Jvb2wgZGlzY292ZXJUeXBlSW5kaWNlc0luU3ltYm9sKGNvbnN0IENWU3ltYm9sICZTeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VGlSZWZlcmVuY2U+ICZSZWZzKTsKK2Jvb2wgZGlzY292ZXJUeXBlSW5kaWNlc0luU3ltYm9sKEFycmF5UmVmPHVpbnQ4X3Q+IFJlY29yZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VGlSZWZlcmVuY2U+ICZSZWZzKTsKK2Jvb2wgZGlzY292ZXJUeXBlSW5kaWNlc0luU3ltYm9sKEFycmF5UmVmPHVpbnQ4X3Q+IFJlY29yZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VHlwZUluZGV4PiAmSW5kaWNlcyk7Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZjI4MjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlUmVjb3JkLmgKQEAgLTAsMCArMSw5MDIgQEAKKy8vPT09LSBUeXBlUmVjb3JkLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRVJFQ09SRF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVSRUNPUkRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBTSW50LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9DVlJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvR1VJRC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1BcnJheS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK3VzaW5nIHN1cHBvcnQ6OmxpdHRsZTMyX3Q7Cit1c2luZyBzdXBwb3J0Ojp1bGl0dGxlMTZfdDsKK3VzaW5nIHN1cHBvcnQ6OnVsaXR0bGUzMl90OworCit1c2luZyBDVlR5cGUgPSBDVlJlY29yZDxUeXBlTGVhZktpbmQ+OwordXNpbmcgUmVtYXBwZWRUeXBlID0gUmVtYXBwZWRSZWNvcmQ8VHlwZUxlYWZLaW5kPjsKKworc3RydWN0IENWTWVtYmVyUmVjb3JkIHsKKyAgVHlwZUxlYWZLaW5kIEtpbmQ7CisgIEFycmF5UmVmPHVpbnQ4X3Q+IERhdGE7Cit9OwordXNpbmcgQ1ZUeXBlQXJyYXkgPSBWYXJTdHJlYW1BcnJheTxDVlR5cGU+OwordXNpbmcgQ1ZUeXBlUmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxDVlR5cGVBcnJheTo6SXRlcmF0b3I+OworCisvLy8gRXF1dmFsZW50IHRvIENWX2ZsZGF0dHJfdCBpbiBjdmluZm8uaC4KK3N0cnVjdCBNZW1iZXJBdHRyaWJ1dGVzIHsKKyAgdWludDE2X3QgQXR0cnMgPSAwOworCisgIGVudW0geworICAgIE1ldGhvZEtpbmRTaGlmdCA9IDIsCisgIH07CisKKyAgTWVtYmVyQXR0cmlidXRlcygpID0gZGVmYXVsdDsKKworICBleHBsaWNpdCBNZW1iZXJBdHRyaWJ1dGVzKE1lbWJlckFjY2VzcyBBY2Nlc3MpCisgICAgICA6IEF0dHJzKHN0YXRpY19jYXN0PHVpbnQxNl90PihBY2Nlc3MpKSB7fQorCisgIE1lbWJlckF0dHJpYnV0ZXMoTWVtYmVyQWNjZXNzIEFjY2VzcywgTWV0aG9kS2luZCBLaW5kLCBNZXRob2RPcHRpb25zIEZsYWdzKSB7CisgICAgQXR0cnMgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oQWNjZXNzKTsKKyAgICBBdHRycyB8PSAoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KEtpbmQpIDw8IE1ldGhvZEtpbmRTaGlmdCk7CisgICAgQXR0cnMgfD0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KEZsYWdzKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGFjY2VzcyBzcGVjaWZpZXIuIFZhbGlkIGZvciBhbnkga2luZCBvZiBtZW1iZXIuCisgIE1lbWJlckFjY2VzcyBnZXRBY2Nlc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIE1lbWJlckFjY2Vzcyh1bnNpZ25lZChBdHRycykgJiB1bnNpZ25lZChNZXRob2RPcHRpb25zOjpBY2Nlc3NNYXNrKSk7CisgIH0KKworICAvLy8gSW5kaWNhdGVzIGlmIGEgbWV0aG9kIGlzIGRlZmluZWQgd2l0aCBmcmllbmQsIHZpcnR1YWwsIHN0YXRpYywgZXRjLgorICBNZXRob2RLaW5kIGdldE1ldGhvZEtpbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIE1ldGhvZEtpbmQoCisgICAgICAgICh1bnNpZ25lZChBdHRycykgJiB1bnNpZ25lZChNZXRob2RPcHRpb25zOjpNZXRob2RLaW5kTWFzaykpID4+CisgICAgICAgIE1ldGhvZEtpbmRTaGlmdCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBmbGFncyB0aGF0IGFyZSBub3QgaW5jbHVkZWQgaW4gYWNjZXNzIGNvbnRyb2wgb3IgbWV0aG9kCisgIC8vLyBwcm9wZXJ0aWVzLgorICBNZXRob2RPcHRpb25zIGdldEZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBNZXRob2RPcHRpb25zKAorICAgICAgICB1bnNpZ25lZChBdHRycykgJgorICAgICAgICB+dW5zaWduZWQoTWV0aG9kT3B0aW9uczo6QWNjZXNzTWFzayB8IE1ldGhvZE9wdGlvbnM6Ok1ldGhvZEtpbmRNYXNrKSk7CisgIH0KKworICAvLy8gSXMgdGhpcyBtZXRob2QgdmlydHVhbC4KKyAgYm9vbCBpc1ZpcnR1YWwoKSBjb25zdCB7CisgICAgYXV0byBNUCA9IGdldE1ldGhvZEtpbmQoKTsKKyAgICByZXR1cm4gTVAgIT0gTWV0aG9kS2luZDo6VmFuaWxsYSAmJiBNUCAhPSBNZXRob2RLaW5kOjpGcmllbmQgJiYKKyAgICAgICAgICAgTVAgIT0gTWV0aG9kS2luZDo6U3RhdGljOworICB9CisKKyAgLy8vIERvZXMgdGhpcyBtZW1iZXIgaW50cm9kdWNlIGEgbmV3IHZpcnR1YWwgbWV0aG9kLgorICBib29sIGlzSW50cm9kdWNlZFZpcnR1YWwoKSBjb25zdCB7CisgICAgYXV0byBNUCA9IGdldE1ldGhvZEtpbmQoKTsKKyAgICByZXR1cm4gTVAgPT0gTWV0aG9kS2luZDo6SW50cm9kdWNpbmdWaXJ0dWFsIHx8CisgICAgICAgICAgIE1QID09IE1ldGhvZEtpbmQ6OlB1cmVJbnRyb2R1Y2luZ1ZpcnR1YWw7CisgIH0KK307CisKKy8vIERvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW55IHRhZywgdGhpcyBpcyB0aGUgdGFpbCBvZiBhbiBMRl9QT0lOVEVSIHJlY29yZAorLy8gaWYgaXQgcmVwcmVzZW50cyBhIG1lbWJlciBwb2ludGVyLgorY2xhc3MgTWVtYmVyUG9pbnRlckluZm8geworcHVibGljOgorICBNZW1iZXJQb2ludGVySW5mbygpID0gZGVmYXVsdDsKKworICBNZW1iZXJQb2ludGVySW5mbyhUeXBlSW5kZXggQ29udGFpbmluZ1R5cGUsCisgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJUb01lbWJlclJlcHJlc2VudGF0aW9uIFJlcHJlc2VudGF0aW9uKQorICAgICAgOiBDb250YWluaW5nVHlwZShDb250YWluaW5nVHlwZSksIFJlcHJlc2VudGF0aW9uKFJlcHJlc2VudGF0aW9uKSB7fQorCisgIFR5cGVJbmRleCBnZXRDb250YWluaW5nVHlwZSgpIGNvbnN0IHsgcmV0dXJuIENvbnRhaW5pbmdUeXBlOyB9CisgIFBvaW50ZXJUb01lbWJlclJlcHJlc2VudGF0aW9uIGdldFJlcHJlc2VudGF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBSZXByZXNlbnRhdGlvbjsKKyAgfQorCisgIFR5cGVJbmRleCBDb250YWluaW5nVHlwZTsKKyAgUG9pbnRlclRvTWVtYmVyUmVwcmVzZW50YXRpb24gUmVwcmVzZW50YXRpb247Cit9OworCitjbGFzcyBUeXBlUmVjb3JkIHsKK3Byb3RlY3RlZDoKKyAgVHlwZVJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IEtpbmQoS2luZCkge30KKworcHVibGljOgorICBUeXBlUmVjb3JkS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorCisgIFR5cGVSZWNvcmRLaW5kIEtpbmQ7Cit9OworCisvLyBMRl9NT0RJRklFUgorY2xhc3MgTW9kaWZpZXJSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIE1vZGlmaWVyUmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBNb2RpZmllclJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgTW9kaWZpZXJSZWNvcmQoVHlwZUluZGV4IE1vZGlmaWVkVHlwZSwgTW9kaWZpZXJPcHRpb25zIE1vZGlmaWVycykKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6TW9kaWZpZXIpLCBNb2RpZmllZFR5cGUoTW9kaWZpZWRUeXBlKSwKKyAgICAgICAgTW9kaWZpZXJzKE1vZGlmaWVycykge30KKworICBUeXBlSW5kZXggZ2V0TW9kaWZpZWRUeXBlKCkgY29uc3QgeyByZXR1cm4gTW9kaWZpZWRUeXBlOyB9CisgIE1vZGlmaWVyT3B0aW9ucyBnZXRNb2RpZmllcnMoKSBjb25zdCB7IHJldHVybiBNb2RpZmllcnM7IH0KKworICBUeXBlSW5kZXggTW9kaWZpZWRUeXBlOworICBNb2RpZmllck9wdGlvbnMgTW9kaWZpZXJzOworfTsKKworLy8gTEZfUFJPQ0VEVVJFCitjbGFzcyBQcm9jZWR1cmVSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIFByb2NlZHVyZVJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgUHJvY2VkdXJlUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorICBQcm9jZWR1cmVSZWNvcmQoVHlwZUluZGV4IFJldHVyblR5cGUsIENhbGxpbmdDb252ZW50aW9uIENhbGxDb252LAorICAgICAgICAgICAgICAgICAgRnVuY3Rpb25PcHRpb25zIE9wdGlvbnMsIHVpbnQxNl90IFBhcmFtZXRlckNvdW50LAorICAgICAgICAgICAgICAgICAgVHlwZUluZGV4IEFyZ3VtZW50TGlzdCkKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6UHJvY2VkdXJlKSwgUmV0dXJuVHlwZShSZXR1cm5UeXBlKSwKKyAgICAgICAgQ2FsbENvbnYoQ2FsbENvbnYpLCBPcHRpb25zKE9wdGlvbnMpLCBQYXJhbWV0ZXJDb3VudChQYXJhbWV0ZXJDb3VudCksCisgICAgICAgIEFyZ3VtZW50TGlzdChBcmd1bWVudExpc3QpIHt9CisKKyAgVHlwZUluZGV4IGdldFJldHVyblR5cGUoKSBjb25zdCB7IHJldHVybiBSZXR1cm5UeXBlOyB9CisgIENhbGxpbmdDb252ZW50aW9uIGdldENhbGxDb252KCkgY29uc3QgeyByZXR1cm4gQ2FsbENvbnY7IH0KKyAgRnVuY3Rpb25PcHRpb25zIGdldE9wdGlvbnMoKSBjb25zdCB7IHJldHVybiBPcHRpb25zOyB9CisgIHVpbnQxNl90IGdldFBhcmFtZXRlckNvdW50KCkgY29uc3QgeyByZXR1cm4gUGFyYW1ldGVyQ291bnQ7IH0KKyAgVHlwZUluZGV4IGdldEFyZ3VtZW50TGlzdCgpIGNvbnN0IHsgcmV0dXJuIEFyZ3VtZW50TGlzdDsgfQorCisgIFR5cGVJbmRleCBSZXR1cm5UeXBlOworICBDYWxsaW5nQ29udmVudGlvbiBDYWxsQ29udjsKKyAgRnVuY3Rpb25PcHRpb25zIE9wdGlvbnM7CisgIHVpbnQxNl90IFBhcmFtZXRlckNvdW50OworICBUeXBlSW5kZXggQXJndW1lbnRMaXN0OworfTsKKworLy8gTEZfTUZVTkNUSU9OCitjbGFzcyBNZW1iZXJGdW5jdGlvblJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgTWVtYmVyRnVuY3Rpb25SZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IE1lbWJlckZ1bmN0aW9uUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorCisgIE1lbWJlckZ1bmN0aW9uUmVjb3JkKFR5cGVJbmRleCBSZXR1cm5UeXBlLCBUeXBlSW5kZXggQ2xhc3NUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICBUeXBlSW5kZXggVGhpc1R5cGUsIENhbGxpbmdDb252ZW50aW9uIENhbGxDb252LAorICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbk9wdGlvbnMgT3B0aW9ucywgdWludDE2X3QgUGFyYW1ldGVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgIFR5cGVJbmRleCBBcmd1bWVudExpc3QsIGludDMyX3QgVGhpc1BvaW50ZXJBZGp1c3RtZW50KQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpNZW1iZXJGdW5jdGlvbiksIFJldHVyblR5cGUoUmV0dXJuVHlwZSksCisgICAgICAgIENsYXNzVHlwZShDbGFzc1R5cGUpLCBUaGlzVHlwZShUaGlzVHlwZSksIENhbGxDb252KENhbGxDb252KSwKKyAgICAgICAgT3B0aW9ucyhPcHRpb25zKSwgUGFyYW1ldGVyQ291bnQoUGFyYW1ldGVyQ291bnQpLAorICAgICAgICBBcmd1bWVudExpc3QoQXJndW1lbnRMaXN0KSwKKyAgICAgICAgVGhpc1BvaW50ZXJBZGp1c3RtZW50KFRoaXNQb2ludGVyQWRqdXN0bWVudCkge30KKworICBUeXBlSW5kZXggZ2V0UmV0dXJuVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFJldHVyblR5cGU7IH0KKyAgVHlwZUluZGV4IGdldENsYXNzVHlwZSgpIGNvbnN0IHsgcmV0dXJuIENsYXNzVHlwZTsgfQorICBUeXBlSW5kZXggZ2V0VGhpc1R5cGUoKSBjb25zdCB7IHJldHVybiBUaGlzVHlwZTsgfQorICBDYWxsaW5nQ29udmVudGlvbiBnZXRDYWxsQ29udigpIGNvbnN0IHsgcmV0dXJuIENhbGxDb252OyB9CisgIEZ1bmN0aW9uT3B0aW9ucyBnZXRPcHRpb25zKCkgY29uc3QgeyByZXR1cm4gT3B0aW9uczsgfQorICB1aW50MTZfdCBnZXRQYXJhbWV0ZXJDb3VudCgpIGNvbnN0IHsgcmV0dXJuIFBhcmFtZXRlckNvdW50OyB9CisgIFR5cGVJbmRleCBnZXRBcmd1bWVudExpc3QoKSBjb25zdCB7IHJldHVybiBBcmd1bWVudExpc3Q7IH0KKyAgaW50MzJfdCBnZXRUaGlzUG9pbnRlckFkanVzdG1lbnQoKSBjb25zdCB7IHJldHVybiBUaGlzUG9pbnRlckFkanVzdG1lbnQ7IH0KKworICBUeXBlSW5kZXggUmV0dXJuVHlwZTsKKyAgVHlwZUluZGV4IENsYXNzVHlwZTsKKyAgVHlwZUluZGV4IFRoaXNUeXBlOworICBDYWxsaW5nQ29udmVudGlvbiBDYWxsQ29udjsKKyAgRnVuY3Rpb25PcHRpb25zIE9wdGlvbnM7CisgIHVpbnQxNl90IFBhcmFtZXRlckNvdW50OworICBUeXBlSW5kZXggQXJndW1lbnRMaXN0OworICBpbnQzMl90IFRoaXNQb2ludGVyQWRqdXN0bWVudDsKK307CisKKy8vIExGX0xBQkVMCitjbGFzcyBMYWJlbFJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgTGFiZWxSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IExhYmVsUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorCisgIExhYmVsUmVjb3JkKExhYmVsVHlwZSBNb2RlKSA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6OkxhYmVsKSwgTW9kZShNb2RlKSB7fQorCisgIExhYmVsVHlwZSBNb2RlOworfTsKKworLy8gTEZfTUZVTkNfSUQKK2NsYXNzIE1lbWJlckZ1bmNJZFJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgTWVtYmVyRnVuY0lkUmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBNZW1iZXJGdW5jSWRSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisgIE1lbWJlckZ1bmNJZFJlY29yZChUeXBlSW5kZXggQ2xhc3NUeXBlLCBUeXBlSW5kZXggRnVuY3Rpb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpNZW1iZXJGdW5jSWQpLCBDbGFzc1R5cGUoQ2xhc3NUeXBlKSwKKyAgICAgICAgRnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSksIE5hbWUoTmFtZSkge30KKworICBUeXBlSW5kZXggZ2V0Q2xhc3NUeXBlKCkgY29uc3QgeyByZXR1cm4gQ2xhc3NUeXBlOyB9CisgIFR5cGVJbmRleCBnZXRGdW5jdGlvblR5cGUoKSBjb25zdCB7IHJldHVybiBGdW5jdGlvblR5cGU7IH0KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgVHlwZUluZGV4IENsYXNzVHlwZTsKKyAgVHlwZUluZGV4IEZ1bmN0aW9uVHlwZTsKKyAgU3RyaW5nUmVmIE5hbWU7Cit9OworCisvLyBMRl9BUkdMSVNUCitjbGFzcyBBcmdMaXN0UmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHVibGljOgorICBBcmdMaXN0UmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBBcmdMaXN0UmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorCisgIEFyZ0xpc3RSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCwgQXJyYXlSZWY8VHlwZUluZGV4PiBJbmRpY2VzKQorICAgICAgOiBUeXBlUmVjb3JkKEtpbmQpLCBBcmdJbmRpY2VzKEluZGljZXMpIHt9CisKKyAgQXJyYXlSZWY8VHlwZUluZGV4PiBnZXRJbmRpY2VzKCkgY29uc3QgeyByZXR1cm4gQXJnSW5kaWNlczsgfQorCisgIHN0ZDo6dmVjdG9yPFR5cGVJbmRleD4gQXJnSW5kaWNlczsKK307CisKKy8vIExGX1NVQlNUUl9MSVNUCitjbGFzcyBTdHJpbmdMaXN0UmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHVibGljOgorICBTdHJpbmdMaXN0UmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBTdHJpbmdMaXN0UmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorCisgIFN0cmluZ0xpc3RSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCwgQXJyYXlSZWY8VHlwZUluZGV4PiBJbmRpY2VzKQorICAgICAgOiBUeXBlUmVjb3JkKEtpbmQpLCBTdHJpbmdJbmRpY2VzKEluZGljZXMpIHt9CisKKyAgQXJyYXlSZWY8VHlwZUluZGV4PiBnZXRJbmRpY2VzKCkgY29uc3QgeyByZXR1cm4gU3RyaW5nSW5kaWNlczsgfQorCisgIHN0ZDo6dmVjdG9yPFR5cGVJbmRleD4gU3RyaW5nSW5kaWNlczsKK307CisKKy8vIExGX1BPSU5URVIKK2NsYXNzIFBvaW50ZXJSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBQb2ludGVyS2luZFNoaWZ0ID0gMDsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IFBvaW50ZXJLaW5kTWFzayA9IDB4MUY7CisKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IFBvaW50ZXJNb2RlU2hpZnQgPSA1OworICBzdGF0aWMgY29uc3QgdWludDMyX3QgUG9pbnRlck1vZGVNYXNrID0gMHgwNzsKKworICBzdGF0aWMgY29uc3QgdWludDMyX3QgUG9pbnRlck9wdGlvbk1hc2sgPSAweEZGOworCisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBQb2ludGVyU2l6ZVNoaWZ0ID0gMTM7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBQb2ludGVyU2l6ZU1hc2sgPSAweEZGOworCisgIFBvaW50ZXJSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFBvaW50ZXJSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisKKyAgUG9pbnRlclJlY29yZChUeXBlSW5kZXggUmVmZXJlbnRUeXBlLCB1aW50MzJfdCBBdHRycykKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6UG9pbnRlciksIFJlZmVyZW50VHlwZShSZWZlcmVudFR5cGUpLAorICAgICAgICBBdHRycyhBdHRycykge30KKworICBQb2ludGVyUmVjb3JkKFR5cGVJbmRleCBSZWZlcmVudFR5cGUsIFBvaW50ZXJLaW5kIFBLLCBQb2ludGVyTW9kZSBQTSwKKyAgICAgICAgICAgICAgICBQb2ludGVyT3B0aW9ucyBQTywgdWludDhfdCBTaXplKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpQb2ludGVyKSwgUmVmZXJlbnRUeXBlKFJlZmVyZW50VHlwZSksCisgICAgICAgIEF0dHJzKGNhbGNBdHRycyhQSywgUE0sIFBPLCBTaXplKSkge30KKworICBQb2ludGVyUmVjb3JkKFR5cGVJbmRleCBSZWZlcmVudFR5cGUsIFBvaW50ZXJLaW5kIFBLLCBQb2ludGVyTW9kZSBQTSwKKyAgICAgICAgICAgICAgICBQb2ludGVyT3B0aW9ucyBQTywgdWludDhfdCBTaXplLCBjb25zdCBNZW1iZXJQb2ludGVySW5mbyAmTVBJKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpQb2ludGVyKSwgUmVmZXJlbnRUeXBlKFJlZmVyZW50VHlwZSksCisgICAgICAgIEF0dHJzKGNhbGNBdHRycyhQSywgUE0sIFBPLCBTaXplKSksIE1lbWJlckluZm8oTVBJKSB7fQorCisgIFR5cGVJbmRleCBnZXRSZWZlcmVudFR5cGUoKSBjb25zdCB7IHJldHVybiBSZWZlcmVudFR5cGU7IH0KKworICBQb2ludGVyS2luZCBnZXRQb2ludGVyS2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UG9pbnRlcktpbmQ+KChBdHRycyA+PiBQb2ludGVyS2luZFNoaWZ0KSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyS2luZE1hc2spOworICB9CisKKyAgUG9pbnRlck1vZGUgZ2V0TW9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UG9pbnRlck1vZGU+KChBdHRycyA+PiBQb2ludGVyTW9kZVNoaWZ0KSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyTW9kZU1hc2spOworICB9CisKKyAgUG9pbnRlck9wdGlvbnMgZ2V0T3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UG9pbnRlck9wdGlvbnM+KEF0dHJzKTsKKyAgfQorCisgIHVpbnQ4X3QgZ2V0U2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKEF0dHJzID4+IFBvaW50ZXJTaXplU2hpZnQpICYgUG9pbnRlclNpemVNYXNrOworICB9CisKKyAgTWVtYmVyUG9pbnRlckluZm8gZ2V0TWVtYmVySW5mbygpIGNvbnN0IHsgcmV0dXJuICpNZW1iZXJJbmZvOyB9CisKKyAgYm9vbCBpc1BvaW50ZXJUb01lbWJlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TW9kZSgpID09IFBvaW50ZXJNb2RlOjpQb2ludGVyVG9EYXRhTWVtYmVyIHx8CisgICAgICAgICAgIGdldE1vZGUoKSA9PSBQb2ludGVyTW9kZTo6UG9pbnRlclRvTWVtYmVyRnVuY3Rpb247CisgIH0KKworICBib29sIGlzRmxhdCgpIGNvbnN0IHsgcmV0dXJuICEhKEF0dHJzICYgdWludDMyX3QoUG9pbnRlck9wdGlvbnM6OkZsYXQzMikpOyB9CisgIGJvb2wgaXNDb25zdCgpIGNvbnN0IHsgcmV0dXJuICEhKEF0dHJzICYgdWludDMyX3QoUG9pbnRlck9wdGlvbnM6OkNvbnN0KSk7IH0KKworICBib29sIGlzVm9sYXRpbGUoKSBjb25zdCB7CisgICAgcmV0dXJuICEhKEF0dHJzICYgdWludDMyX3QoUG9pbnRlck9wdGlvbnM6OlZvbGF0aWxlKSk7CisgIH0KKworICBib29sIGlzVW5hbGlnbmVkKCkgY29uc3QgeworICAgIHJldHVybiAhIShBdHRycyAmIHVpbnQzMl90KFBvaW50ZXJPcHRpb25zOjpVbmFsaWduZWQpKTsKKyAgfQorCisgIGJvb2wgaXNSZXN0cmljdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gISEoQXR0cnMgJiB1aW50MzJfdChQb2ludGVyT3B0aW9uczo6UmVzdHJpY3QpKTsKKyAgfQorCisgIFR5cGVJbmRleCBSZWZlcmVudFR5cGU7CisgIHVpbnQzMl90IEF0dHJzOworICBPcHRpb25hbDxNZW1iZXJQb2ludGVySW5mbz4gTWVtYmVySW5mbzsKKworICB2b2lkIHNldEF0dHJzKFBvaW50ZXJLaW5kIFBLLCBQb2ludGVyTW9kZSBQTSwgUG9pbnRlck9wdGlvbnMgUE8sCisgICAgICAgICAgICAgICAgdWludDhfdCBTaXplKSB7CisgICAgQXR0cnMgPSBjYWxjQXR0cnMoUEssIFBNLCBQTywgU2l6ZSk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RhdGljIHVpbnQzMl90IGNhbGNBdHRycyhQb2ludGVyS2luZCBQSywgUG9pbnRlck1vZGUgUE0sIFBvaW50ZXJPcHRpb25zIFBPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgU2l6ZSkgeworICAgIHVpbnQzMl90IEEgPSAwOworICAgIEEgfD0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFBLKTsKKyAgICBBIHw9IHN0YXRpY19jYXN0PHVpbnQzMl90PihQTyk7CisgICAgQSB8PSAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFBNKSA8PCBQb2ludGVyTW9kZVNoaWZ0KTsKKyAgICBBIHw9IChzdGF0aWNfY2FzdDx1aW50MzJfdD4oU2l6ZSkgPDwgUG9pbnRlclNpemVTaGlmdCk7CisgICAgcmV0dXJuIEE7CisgIH0KK307CisKKy8vIExGX05FU1RUWVBFCitjbGFzcyBOZXN0ZWRUeXBlUmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHVibGljOgorICBOZXN0ZWRUeXBlUmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBOZXN0ZWRUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorICBOZXN0ZWRUeXBlUmVjb3JkKFR5cGVJbmRleCBUeXBlLCBTdHJpbmdSZWYgTmFtZSkKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6TmVzdGVkVHlwZSksIFR5cGUoVHlwZSksIE5hbWUoTmFtZSkge30KKworICBUeXBlSW5kZXggZ2V0TmVzdGVkVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5cGU7IH0KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgVHlwZUluZGV4IFR5cGU7CisgIFN0cmluZ1JlZiBOYW1lOworfTsKKworLy8gTEZfRklFTERMSVNUCitjbGFzcyBGaWVsZExpc3RSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIEZpZWxkTGlzdFJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgRmllbGRMaXN0UmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorICBleHBsaWNpdCBGaWVsZExpc3RSZWNvcmQoQXJyYXlSZWY8dWludDhfdD4gRGF0YSkKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6RmllbGRMaXN0KSwgRGF0YShEYXRhKSB7fQorCisgIEFycmF5UmVmPHVpbnQ4X3Q+IERhdGE7Cit9OworCisvLyBMRl9BUlJBWQorY2xhc3MgQXJyYXlSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIEFycmF5UmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBBcnJheVJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgQXJyYXlSZWNvcmQoVHlwZUluZGV4IEVsZW1lbnRUeXBlLCBUeXBlSW5kZXggSW5kZXhUeXBlLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSkKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6QXJyYXkpLCBFbGVtZW50VHlwZShFbGVtZW50VHlwZSksCisgICAgICAgIEluZGV4VHlwZShJbmRleFR5cGUpLCBTaXplKFNpemUpLCBOYW1lKE5hbWUpIHt9CisKKyAgVHlwZUluZGV4IGdldEVsZW1lbnRUeXBlKCkgY29uc3QgeyByZXR1cm4gRWxlbWVudFR5cGU7IH0KKyAgVHlwZUluZGV4IGdldEluZGV4VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEluZGV4VHlwZTsgfQorICB1aW50NjRfdCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICBUeXBlSW5kZXggRWxlbWVudFR5cGU7CisgIFR5cGVJbmRleCBJbmRleFR5cGU7CisgIHVpbnQ2NF90IFNpemU7CisgIFN0cmluZ1JlZiBOYW1lOworfTsKKworY2xhc3MgVGFnUmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHJvdGVjdGVkOgorICBUYWdSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFRhZ1JlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgVGFnUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQsIHVpbnQxNl90IE1lbWJlckNvdW50LCBDbGFzc09wdGlvbnMgT3B0aW9ucywKKyAgICAgICAgICAgIFR5cGVJbmRleCBGaWVsZExpc3QsIFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgVW5pcXVlTmFtZSkKKyAgICAgIDogVHlwZVJlY29yZChLaW5kKSwgTWVtYmVyQ291bnQoTWVtYmVyQ291bnQpLCBPcHRpb25zKE9wdGlvbnMpLAorICAgICAgICBGaWVsZExpc3QoRmllbGRMaXN0KSwgTmFtZShOYW1lKSwgVW5pcXVlTmFtZShVbmlxdWVOYW1lKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBpbnQgSGZhS2luZFNoaWZ0ID0gMTE7CisgIHN0YXRpYyBjb25zdCBpbnQgSGZhS2luZE1hc2sgPSAweDE4MDA7CisgIHN0YXRpYyBjb25zdCBpbnQgV2luUlRLaW5kU2hpZnQgPSAxNDsKKyAgc3RhdGljIGNvbnN0IGludCBXaW5SVEtpbmRNYXNrID0gMHhDMDAwOworCisgIGJvb2wgaGFzVW5pcXVlTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKE9wdGlvbnMgJiBDbGFzc09wdGlvbnM6Okhhc1VuaXF1ZU5hbWUpICE9IENsYXNzT3B0aW9uczo6Tm9uZTsKKyAgfQorCisgIGJvb2wgaXNOZXN0ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIChPcHRpb25zICYgQ2xhc3NPcHRpb25zOjpOZXN0ZWQpICE9IENsYXNzT3B0aW9uczo6Tm9uZTsKKyAgfQorCisgIGJvb2wgaXNGb3J3YXJkUmVmKCkgY29uc3QgeworICAgIHJldHVybiAoT3B0aW9ucyAmIENsYXNzT3B0aW9uczo6Rm9yd2FyZFJlZmVyZW5jZSkgIT0gQ2xhc3NPcHRpb25zOjpOb25lOworICB9CisKKyAgdWludDE2X3QgZ2V0TWVtYmVyQ291bnQoKSBjb25zdCB7IHJldHVybiBNZW1iZXJDb3VudDsgfQorICBDbGFzc09wdGlvbnMgZ2V0T3B0aW9ucygpIGNvbnN0IHsgcmV0dXJuIE9wdGlvbnM7IH0KKyAgVHlwZUluZGV4IGdldEZpZWxkTGlzdCgpIGNvbnN0IHsgcmV0dXJuIEZpZWxkTGlzdDsgfQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKyAgU3RyaW5nUmVmIGdldFVuaXF1ZU5hbWUoKSBjb25zdCB7IHJldHVybiBVbmlxdWVOYW1lOyB9CisKKyAgdWludDE2X3QgTWVtYmVyQ291bnQ7CisgIENsYXNzT3B0aW9ucyBPcHRpb25zOworICBUeXBlSW5kZXggRmllbGRMaXN0OworICBTdHJpbmdSZWYgTmFtZTsKKyAgU3RyaW5nUmVmIFVuaXF1ZU5hbWU7Cit9OworCisvLyBMRl9DTEFTUywgTEZfU1RSVUNUVVJFLCBMRl9JTlRFUkZBQ0UKK2NsYXNzIENsYXNzUmVjb3JkIDogcHVibGljIFRhZ1JlY29yZCB7CitwdWJsaWM6CisgIENsYXNzUmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBDbGFzc1JlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFRhZ1JlY29yZChLaW5kKSB7fQorICBDbGFzc1JlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kLCB1aW50MTZfdCBNZW1iZXJDb3VudCwgQ2xhc3NPcHRpb25zIE9wdGlvbnMsCisgICAgICAgICAgICAgIFR5cGVJbmRleCBGaWVsZExpc3QsIFR5cGVJbmRleCBEZXJpdmF0aW9uTGlzdCwKKyAgICAgICAgICAgICAgVHlwZUluZGV4IFZUYWJsZVNoYXBlLCB1aW50NjRfdCBTaXplLCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgU3RyaW5nUmVmIFVuaXF1ZU5hbWUpCisgICAgICA6IFRhZ1JlY29yZChLaW5kLCBNZW1iZXJDb3VudCwgT3B0aW9ucywgRmllbGRMaXN0LCBOYW1lLCBVbmlxdWVOYW1lKSwKKyAgICAgICAgRGVyaXZhdGlvbkxpc3QoRGVyaXZhdGlvbkxpc3QpLCBWVGFibGVTaGFwZShWVGFibGVTaGFwZSksIFNpemUoU2l6ZSkge30KKworICBIZmFLaW5kIGdldEhmYSgpIGNvbnN0IHsKKyAgICB1aW50MTZfdCBWYWx1ZSA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihPcHRpb25zKTsKKyAgICBWYWx1ZSA9IChWYWx1ZSAmIEhmYUtpbmRNYXNrKSA+PiBIZmFLaW5kU2hpZnQ7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhmYUtpbmQ+KFZhbHVlKTsKKyAgfQorCisgIFdpbmRvd3NSVENsYXNzS2luZCBnZXRXaW5SVEtpbmQoKSBjb25zdCB7CisgICAgdWludDE2X3QgVmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oT3B0aW9ucyk7CisgICAgVmFsdWUgPSAoVmFsdWUgJiBXaW5SVEtpbmRNYXNrKSA+PiBXaW5SVEtpbmRTaGlmdDsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8V2luZG93c1JUQ2xhc3NLaW5kPihWYWx1ZSk7CisgIH0KKworICBUeXBlSW5kZXggZ2V0RGVyaXZhdGlvbkxpc3QoKSBjb25zdCB7IHJldHVybiBEZXJpdmF0aW9uTGlzdDsgfQorICBUeXBlSW5kZXggZ2V0VlRhYmxlU2hhcGUoKSBjb25zdCB7IHJldHVybiBWVGFibGVTaGFwZTsgfQorICB1aW50NjRfdCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorCisgIFR5cGVJbmRleCBEZXJpdmF0aW9uTGlzdDsKKyAgVHlwZUluZGV4IFZUYWJsZVNoYXBlOworICB1aW50NjRfdCBTaXplOworfTsKKworLy8gTEZfVU5JT04KK3N0cnVjdCBVbmlvblJlY29yZCA6IHB1YmxpYyBUYWdSZWNvcmQgeworICBVbmlvblJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgVW5pb25SZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUYWdSZWNvcmQoS2luZCkge30KKyAgVW5pb25SZWNvcmQodWludDE2X3QgTWVtYmVyQ291bnQsIENsYXNzT3B0aW9ucyBPcHRpb25zLCBUeXBlSW5kZXggRmllbGRMaXN0LAorICAgICAgICAgICAgICB1aW50NjRfdCBTaXplLCBTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIFVuaXF1ZU5hbWUpCisgICAgICA6IFRhZ1JlY29yZChUeXBlUmVjb3JkS2luZDo6VW5pb24sIE1lbWJlckNvdW50LCBPcHRpb25zLCBGaWVsZExpc3QsIE5hbWUsCisgICAgICAgICAgICAgICAgICBVbmlxdWVOYW1lKSwKKyAgICAgICAgU2l6ZShTaXplKSB7fQorCisgIEhmYUtpbmQgZ2V0SGZhKCkgY29uc3QgeworICAgIHVpbnQxNl90IFZhbHVlID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KE9wdGlvbnMpOworICAgIFZhbHVlID0gKFZhbHVlICYgSGZhS2luZE1hc2spID4+IEhmYUtpbmRTaGlmdDsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SGZhS2luZD4oVmFsdWUpOworICB9CisKKyAgdWludDY0X3QgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKworICB1aW50NjRfdCBTaXplOworfTsKKworLy8gTEZfRU5VTQorY2xhc3MgRW51bVJlY29yZCA6IHB1YmxpYyBUYWdSZWNvcmQgeworcHVibGljOgorICBFbnVtUmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBFbnVtUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVGFnUmVjb3JkKEtpbmQpIHt9CisgIEVudW1SZWNvcmQodWludDE2X3QgTWVtYmVyQ291bnQsIENsYXNzT3B0aW9ucyBPcHRpb25zLCBUeXBlSW5kZXggRmllbGRMaXN0LAorICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgVW5pcXVlTmFtZSwgVHlwZUluZGV4IFVuZGVybHlpbmdUeXBlKQorICAgICAgOiBUYWdSZWNvcmQoVHlwZVJlY29yZEtpbmQ6OkVudW0sIE1lbWJlckNvdW50LCBPcHRpb25zLCBGaWVsZExpc3QsIE5hbWUsCisgICAgICAgICAgICAgICAgICBVbmlxdWVOYW1lKSwKKyAgICAgICAgVW5kZXJseWluZ1R5cGUoVW5kZXJseWluZ1R5cGUpIHt9CisKKyAgVHlwZUluZGV4IGdldFVuZGVybHlpbmdUeXBlKCkgY29uc3QgeyByZXR1cm4gVW5kZXJseWluZ1R5cGU7IH0KKworICBUeXBlSW5kZXggVW5kZXJseWluZ1R5cGU7Cit9OworCisvLyBMRl9CSVRGSUVMRAorY2xhc3MgQml0RmllbGRSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIEJpdEZpZWxkUmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBCaXRGaWVsZFJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgQml0RmllbGRSZWNvcmQoVHlwZUluZGV4IFR5cGUsIHVpbnQ4X3QgQml0U2l6ZSwgdWludDhfdCBCaXRPZmZzZXQpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6OkJpdEZpZWxkKSwgVHlwZShUeXBlKSwgQml0U2l6ZShCaXRTaXplKSwKKyAgICAgICAgQml0T2Zmc2V0KEJpdE9mZnNldCkge30KKworICBUeXBlSW5kZXggZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5cGU7IH0KKyAgdWludDhfdCBnZXRCaXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBCaXRPZmZzZXQ7IH0KKyAgdWludDhfdCBnZXRCaXRTaXplKCkgY29uc3QgeyByZXR1cm4gQml0U2l6ZTsgfQorCisgIFR5cGVJbmRleCBUeXBlOworICB1aW50OF90IEJpdFNpemU7CisgIHVpbnQ4X3QgQml0T2Zmc2V0OworfTsKKworLy8gTEZfVlRTSEFQRQorY2xhc3MgVkZUYWJsZVNoYXBlUmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHVibGljOgorICBWRlRhYmxlU2hhcGVSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFZGVGFibGVTaGFwZVJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgZXhwbGljaXQgVkZUYWJsZVNoYXBlUmVjb3JkKEFycmF5UmVmPFZGVGFibGVTbG90S2luZD4gU2xvdHMpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6OlZGVGFibGVTaGFwZSksIFNsb3RzUmVmKFNsb3RzKSB7fQorICBleHBsaWNpdCBWRlRhYmxlU2hhcGVSZWNvcmQoc3RkOjp2ZWN0b3I8VkZUYWJsZVNsb3RLaW5kPiBTbG90cykKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6VkZUYWJsZVNoYXBlKSwgU2xvdHMoc3RkOjptb3ZlKFNsb3RzKSkge30KKworICBBcnJheVJlZjxWRlRhYmxlU2xvdEtpbmQ+IGdldFNsb3RzKCkgY29uc3QgeworICAgIGlmICghU2xvdHNSZWYuZW1wdHkoKSkKKyAgICAgIHJldHVybiBTbG90c1JlZjsKKyAgICByZXR1cm4gU2xvdHM7CisgIH0KKworICB1aW50MzJfdCBnZXRFbnRyeUNvdW50KCkgY29uc3QgeyByZXR1cm4gZ2V0U2xvdHMoKS5zaXplKCk7IH0KKworICBBcnJheVJlZjxWRlRhYmxlU2xvdEtpbmQ+IFNsb3RzUmVmOworICBzdGQ6OnZlY3RvcjxWRlRhYmxlU2xvdEtpbmQ+IFNsb3RzOworfTsKKworLy8gTEZfVFlQRVNFUlZFUjIKK2NsYXNzIFR5cGVTZXJ2ZXIyUmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHVibGljOgorICBUeXBlU2VydmVyMlJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgVHlwZVNlcnZlcjJSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisgIFR5cGVTZXJ2ZXIyUmVjb3JkKFN0cmluZ1JlZiBHdWlkU3RyLCB1aW50MzJfdCBBZ2UsIFN0cmluZ1JlZiBOYW1lKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpUeXBlU2VydmVyMiksIEFnZShBZ2UpLCBOYW1lKE5hbWUpIHsKKyAgICBhc3NlcnQoR3VpZFN0ci5zaXplKCkgPT0gMTYgJiYgImd1aWQgaXNuJ3QgMTYgYnl0ZXMiKTsKKyAgICA6Om1lbWNweShHdWlkLkd1aWQsIEd1aWRTdHIuZGF0YSgpLCAxNik7CisgIH0KKworICBjb25zdCBHVUlEICZnZXRHdWlkKCkgY29uc3QgeyByZXR1cm4gR3VpZDsgfQorICB1aW50MzJfdCBnZXRBZ2UoKSBjb25zdCB7IHJldHVybiBBZ2U7IH0KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgR1VJRCBHdWlkOworICB1aW50MzJfdCBBZ2U7CisgIFN0cmluZ1JlZiBOYW1lOworfTsKKworLy8gTEZfU1RSSU5HX0lECitjbGFzcyBTdHJpbmdJZFJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgU3RyaW5nSWRSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFN0cmluZ0lkUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorICBTdHJpbmdJZFJlY29yZChUeXBlSW5kZXggSWQsIFN0cmluZ1JlZiBTdHJpbmcpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6OlN0cmluZ0lkKSwgSWQoSWQpLCBTdHJpbmcoU3RyaW5nKSB7fQorCisgIFR5cGVJbmRleCBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIElkOyB9CisgIFN0cmluZ1JlZiBnZXRTdHJpbmcoKSBjb25zdCB7IHJldHVybiBTdHJpbmc7IH0KKworICBUeXBlSW5kZXggSWQ7CisgIFN0cmluZ1JlZiBTdHJpbmc7Cit9OworCisvLyBMRl9GVU5DX0lECitjbGFzcyBGdW5jSWRSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIEZ1bmNJZFJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgRnVuY0lkUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorICBGdW5jSWRSZWNvcmQoVHlwZUluZGV4IFBhcmVudFNjb3BlLCBUeXBlSW5kZXggRnVuY3Rpb25UeXBlLCBTdHJpbmdSZWYgTmFtZSkKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6RnVuY0lkKSwgUGFyZW50U2NvcGUoUGFyZW50U2NvcGUpLAorICAgICAgICBGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlKSwgTmFtZShOYW1lKSB7fQorCisgIFR5cGVJbmRleCBnZXRQYXJlbnRTY29wZSgpIGNvbnN0IHsgcmV0dXJuIFBhcmVudFNjb3BlOyB9CisgIFR5cGVJbmRleCBnZXRGdW5jdGlvblR5cGUoKSBjb25zdCB7IHJldHVybiBGdW5jdGlvblR5cGU7IH0KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgVHlwZUluZGV4IFBhcmVudFNjb3BlOworICBUeXBlSW5kZXggRnVuY3Rpb25UeXBlOworICBTdHJpbmdSZWYgTmFtZTsKK307CisKKy8vIExGX1VEVF9TUkNfTElORQorY2xhc3MgVWR0U291cmNlTGluZVJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgVWR0U291cmNlTGluZVJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgVWR0U291cmNlTGluZVJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgVWR0U291cmNlTGluZVJlY29yZChUeXBlSW5kZXggVURULCBUeXBlSW5kZXggU291cmNlRmlsZSwgdWludDMyX3QgTGluZU51bWJlcikKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6VWR0U291cmNlTGluZSksIFVEVChVRFQpLAorICAgICAgICBTb3VyY2VGaWxlKFNvdXJjZUZpbGUpLCBMaW5lTnVtYmVyKExpbmVOdW1iZXIpIHt9CisKKyAgVHlwZUluZGV4IGdldFVEVCgpIGNvbnN0IHsgcmV0dXJuIFVEVDsgfQorICBUeXBlSW5kZXggZ2V0U291cmNlRmlsZSgpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZUZpbGU7IH0KKyAgdWludDMyX3QgZ2V0TGluZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIExpbmVOdW1iZXI7IH0KKworICBUeXBlSW5kZXggVURUOworICBUeXBlSW5kZXggU291cmNlRmlsZTsKKyAgdWludDMyX3QgTGluZU51bWJlcjsKK307CisKKy8vIExGX1VEVF9NT0RfU1JDX0xJTkUKK2NsYXNzIFVkdE1vZFNvdXJjZUxpbmVSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIFVkdE1vZFNvdXJjZUxpbmVSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFVkdE1vZFNvdXJjZUxpbmVSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisgIFVkdE1vZFNvdXJjZUxpbmVSZWNvcmQoVHlwZUluZGV4IFVEVCwgVHlwZUluZGV4IFNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTGluZU51bWJlciwgdWludDE2X3QgTW9kdWxlKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpVZHRTb3VyY2VMaW5lKSwgVURUKFVEVCksCisgICAgICAgIFNvdXJjZUZpbGUoU291cmNlRmlsZSksIExpbmVOdW1iZXIoTGluZU51bWJlciksIE1vZHVsZShNb2R1bGUpIHt9CisKKyAgVHlwZUluZGV4IGdldFVEVCgpIGNvbnN0IHsgcmV0dXJuIFVEVDsgfQorICBUeXBlSW5kZXggZ2V0U291cmNlRmlsZSgpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZUZpbGU7IH0KKyAgdWludDMyX3QgZ2V0TGluZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIExpbmVOdW1iZXI7IH0KKyAgdWludDE2X3QgZ2V0TW9kdWxlKCkgY29uc3QgeyByZXR1cm4gTW9kdWxlOyB9CisKKyAgVHlwZUluZGV4IFVEVDsKKyAgVHlwZUluZGV4IFNvdXJjZUZpbGU7CisgIHVpbnQzMl90IExpbmVOdW1iZXI7CisgIHVpbnQxNl90IE1vZHVsZTsKK307CisKKy8vIExGX0JVSUxESU5GTworY2xhc3MgQnVpbGRJbmZvUmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHVibGljOgorICBCdWlsZEluZm9SZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IEJ1aWxkSW5mb1JlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgQnVpbGRJbmZvUmVjb3JkKEFycmF5UmVmPFR5cGVJbmRleD4gQXJnSW5kaWNlcykKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6QnVpbGRJbmZvKSwKKyAgICAgICAgQXJnSW5kaWNlcyhBcmdJbmRpY2VzLmJlZ2luKCksIEFyZ0luZGljZXMuZW5kKCkpIHt9CisKKyAgQXJyYXlSZWY8VHlwZUluZGV4PiBnZXRBcmdzKCkgY29uc3QgeyByZXR1cm4gQXJnSW5kaWNlczsgfQorCisgIFNtYWxsVmVjdG9yPFR5cGVJbmRleCwgND4gQXJnSW5kaWNlczsKK307CisKKy8vIExGX1ZGVEFCTEUKK2NsYXNzIFZGVGFibGVSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIFZGVGFibGVSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFZGVGFibGVSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisgIFZGVGFibGVSZWNvcmQoVHlwZUluZGV4IENvbXBsZXRlQ2xhc3MsIFR5cGVJbmRleCBPdmVycmlkZGVuVkZUYWJsZSwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBWRlB0ck9mZnNldCwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgQXJyYXlSZWY8U3RyaW5nUmVmPiBNZXRob2RzKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpWRlRhYmxlKSwgQ29tcGxldGVDbGFzcyhDb21wbGV0ZUNsYXNzKSwKKyAgICAgICAgT3ZlcnJpZGRlblZGVGFibGUoT3ZlcnJpZGRlblZGVGFibGUpLCBWRlB0ck9mZnNldChWRlB0ck9mZnNldCkgeworICAgIE1ldGhvZE5hbWVzLnB1c2hfYmFjayhOYW1lKTsKKyAgICBNZXRob2ROYW1lcy5pbnNlcnQoTWV0aG9kTmFtZXMuZW5kKCksIE1ldGhvZHMuYmVnaW4oKSwgTWV0aG9kcy5lbmQoKSk7CisgIH0KKworICBUeXBlSW5kZXggZ2V0Q29tcGxldGVDbGFzcygpIGNvbnN0IHsgcmV0dXJuIENvbXBsZXRlQ2xhc3M7IH0KKyAgVHlwZUluZGV4IGdldE92ZXJyaWRkZW5WVGFibGUoKSBjb25zdCB7IHJldHVybiBPdmVycmlkZGVuVkZUYWJsZTsgfQorICB1aW50MzJfdCBnZXRWRlB0ck9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIFZGUHRyT2Zmc2V0OyB9CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbWFrZUFycmF5UmVmKE1ldGhvZE5hbWVzKS5mcm9udCgpOyB9CisKKyAgQXJyYXlSZWY8U3RyaW5nUmVmPiBnZXRNZXRob2ROYW1lcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZUFycmF5UmVmKE1ldGhvZE5hbWVzKS5kcm9wX2Zyb250KCk7CisgIH0KKworICBUeXBlSW5kZXggQ29tcGxldGVDbGFzczsKKyAgVHlwZUluZGV4IE92ZXJyaWRkZW5WRlRhYmxlOworICB1aW50MzJfdCBWRlB0ck9mZnNldDsKKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBNZXRob2ROYW1lczsKK307CisKKy8vIExGX09ORU1FVEhPRAorY2xhc3MgT25lTWV0aG9kUmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHVibGljOgorICBPbmVNZXRob2RSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IE9uZU1ldGhvZFJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgT25lTWV0aG9kUmVjb3JkKFR5cGVJbmRleCBUeXBlLCBNZW1iZXJBdHRyaWJ1dGVzIEF0dHJzLCBpbnQzMl90IFZGVGFibGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSkKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6T25lTWV0aG9kKSwgVHlwZShUeXBlKSwgQXR0cnMoQXR0cnMpLAorICAgICAgICBWRlRhYmxlT2Zmc2V0KFZGVGFibGVPZmZzZXQpLCBOYW1lKE5hbWUpIHt9CisgIE9uZU1ldGhvZFJlY29yZChUeXBlSW5kZXggVHlwZSwgTWVtYmVyQWNjZXNzIEFjY2VzcywgTWV0aG9kS2luZCBNSywKKyAgICAgICAgICAgICAgICAgIE1ldGhvZE9wdGlvbnMgT3B0aW9ucywgaW50MzJfdCBWRlRhYmxlT2Zmc2V0LCBTdHJpbmdSZWYgTmFtZSkKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6T25lTWV0aG9kKSwgVHlwZShUeXBlKSwKKyAgICAgICAgQXR0cnMoQWNjZXNzLCBNSywgT3B0aW9ucyksIFZGVGFibGVPZmZzZXQoVkZUYWJsZU9mZnNldCksIE5hbWUoTmFtZSkge30KKworICBUeXBlSW5kZXggZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5cGU7IH0KKyAgTWV0aG9kS2luZCBnZXRNZXRob2RLaW5kKCkgY29uc3QgeyByZXR1cm4gQXR0cnMuZ2V0TWV0aG9kS2luZCgpOyB9CisgIE1ldGhvZE9wdGlvbnMgZ2V0T3B0aW9ucygpIGNvbnN0IHsgcmV0dXJuIEF0dHJzLmdldEZsYWdzKCk7IH0KKyAgTWVtYmVyQWNjZXNzIGdldEFjY2VzcygpIGNvbnN0IHsgcmV0dXJuIEF0dHJzLmdldEFjY2VzcygpOyB9CisgIGludDMyX3QgZ2V0VkZUYWJsZU9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIFZGVGFibGVPZmZzZXQ7IH0KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgYm9vbCBpc0ludHJvZHVjaW5nVmlydHVhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TWV0aG9kS2luZCgpID09IE1ldGhvZEtpbmQ6OkludHJvZHVjaW5nVmlydHVhbCB8fAorICAgICAgICAgICBnZXRNZXRob2RLaW5kKCkgPT0gTWV0aG9kS2luZDo6UHVyZUludHJvZHVjaW5nVmlydHVhbDsKKyAgfQorCisgIFR5cGVJbmRleCBUeXBlOworICBNZW1iZXJBdHRyaWJ1dGVzIEF0dHJzOworICBpbnQzMl90IFZGVGFibGVPZmZzZXQ7CisgIFN0cmluZ1JlZiBOYW1lOworfTsKKworLy8gTEZfTUVUSE9ETElTVAorY2xhc3MgTWV0aG9kT3ZlcmxvYWRMaXN0UmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHVibGljOgorICBNZXRob2RPdmVybG9hZExpc3RSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IE1ldGhvZE92ZXJsb2FkTGlzdFJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgTWV0aG9kT3ZlcmxvYWRMaXN0UmVjb3JkKEFycmF5UmVmPE9uZU1ldGhvZFJlY29yZD4gTWV0aG9kcykKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6TWV0aG9kT3ZlcmxvYWRMaXN0KSwgTWV0aG9kcyhNZXRob2RzKSB7fQorCisgIEFycmF5UmVmPE9uZU1ldGhvZFJlY29yZD4gZ2V0TWV0aG9kcygpIGNvbnN0IHsgcmV0dXJuIE1ldGhvZHM7IH0KKworICBzdGQ6OnZlY3RvcjxPbmVNZXRob2RSZWNvcmQ+IE1ldGhvZHM7Cit9OworCisvLy8gRm9yIG1ldGhvZCBvdmVybG9hZCBzZXRzLiAgTEZfTUVUSE9ECitjbGFzcyBPdmVybG9hZGVkTWV0aG9kUmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHVibGljOgorICBPdmVybG9hZGVkTWV0aG9kUmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBPdmVybG9hZGVkTWV0aG9kUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorICBPdmVybG9hZGVkTWV0aG9kUmVjb3JkKHVpbnQxNl90IE51bU92ZXJsb2FkcywgVHlwZUluZGV4IE1ldGhvZExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6Ok92ZXJsb2FkZWRNZXRob2QpLAorICAgICAgICBOdW1PdmVybG9hZHMoTnVtT3ZlcmxvYWRzKSwgTWV0aG9kTGlzdChNZXRob2RMaXN0KSwgTmFtZShOYW1lKSB7fQorCisgIHVpbnQxNl90IGdldE51bU92ZXJsb2FkcygpIGNvbnN0IHsgcmV0dXJuIE51bU92ZXJsb2FkczsgfQorICBUeXBlSW5kZXggZ2V0TWV0aG9kTGlzdCgpIGNvbnN0IHsgcmV0dXJuIE1ldGhvZExpc3Q7IH0KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgdWludDE2X3QgTnVtT3ZlcmxvYWRzOworICBUeXBlSW5kZXggTWV0aG9kTGlzdDsKKyAgU3RyaW5nUmVmIE5hbWU7Cit9OworCisvLyBMRl9NRU1CRVIKK2NsYXNzIERhdGFNZW1iZXJSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIERhdGFNZW1iZXJSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IERhdGFNZW1iZXJSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisgIERhdGFNZW1iZXJSZWNvcmQoTWVtYmVyQXR0cmlidXRlcyBBdHRycywgVHlwZUluZGV4IFR5cGUsIHVpbnQ2NF90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSkKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6RGF0YU1lbWJlciksIEF0dHJzKEF0dHJzKSwgVHlwZShUeXBlKSwKKyAgICAgICAgRmllbGRPZmZzZXQoT2Zmc2V0KSwgTmFtZShOYW1lKSB7fQorICBEYXRhTWVtYmVyUmVjb3JkKE1lbWJlckFjY2VzcyBBY2Nlc3MsIFR5cGVJbmRleCBUeXBlLCB1aW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6OkRhdGFNZW1iZXIpLCBBdHRycyhBY2Nlc3MpLCBUeXBlKFR5cGUpLAorICAgICAgICBGaWVsZE9mZnNldChPZmZzZXQpLCBOYW1lKE5hbWUpIHt9CisKKyAgTWVtYmVyQWNjZXNzIGdldEFjY2VzcygpIGNvbnN0IHsgcmV0dXJuIEF0dHJzLmdldEFjY2VzcygpOyB9CisgIFR5cGVJbmRleCBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVHlwZTsgfQorICB1aW50NjRfdCBnZXRGaWVsZE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIEZpZWxkT2Zmc2V0OyB9CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorCisgIE1lbWJlckF0dHJpYnV0ZXMgQXR0cnM7CisgIFR5cGVJbmRleCBUeXBlOworICB1aW50NjRfdCBGaWVsZE9mZnNldDsKKyAgU3RyaW5nUmVmIE5hbWU7Cit9OworCisvLyBMRl9TVE1FTUJFUgorY2xhc3MgU3RhdGljRGF0YU1lbWJlclJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgU3RhdGljRGF0YU1lbWJlclJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgU3RhdGljRGF0YU1lbWJlclJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgU3RhdGljRGF0YU1lbWJlclJlY29yZChNZW1iZXJBdHRyaWJ1dGVzIEF0dHJzLCBUeXBlSW5kZXggVHlwZSwgU3RyaW5nUmVmIE5hbWUpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6OlN0YXRpY0RhdGFNZW1iZXIpLCBBdHRycyhBdHRycyksIFR5cGUoVHlwZSksCisgICAgICAgIE5hbWUoTmFtZSkge30KKyAgU3RhdGljRGF0YU1lbWJlclJlY29yZChNZW1iZXJBY2Nlc3MgQWNjZXNzLCBUeXBlSW5kZXggVHlwZSwgU3RyaW5nUmVmIE5hbWUpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6OlN0YXRpY0RhdGFNZW1iZXIpLCBBdHRycyhBY2Nlc3MpLCBUeXBlKFR5cGUpLAorICAgICAgICBOYW1lKE5hbWUpIHt9CisKKyAgTWVtYmVyQWNjZXNzIGdldEFjY2VzcygpIGNvbnN0IHsgcmV0dXJuIEF0dHJzLmdldEFjY2VzcygpOyB9CisgIFR5cGVJbmRleCBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVHlwZTsgfQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICBNZW1iZXJBdHRyaWJ1dGVzIEF0dHJzOworICBUeXBlSW5kZXggVHlwZTsKKyAgU3RyaW5nUmVmIE5hbWU7Cit9OworCisvLyBMRl9FTlVNRVJBVEUKK2NsYXNzIEVudW1lcmF0b3JSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIEVudW1lcmF0b3JSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IEVudW1lcmF0b3JSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisgIEVudW1lcmF0b3JSZWNvcmQoTWVtYmVyQXR0cmlidXRlcyBBdHRycywgQVBTSW50IFZhbHVlLCBTdHJpbmdSZWYgTmFtZSkKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6RW51bWVyYXRvciksIEF0dHJzKEF0dHJzKSwKKyAgICAgICAgVmFsdWUoc3RkOjptb3ZlKFZhbHVlKSksIE5hbWUoTmFtZSkge30KKyAgRW51bWVyYXRvclJlY29yZChNZW1iZXJBY2Nlc3MgQWNjZXNzLCBBUFNJbnQgVmFsdWUsIFN0cmluZ1JlZiBOYW1lKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpFbnVtZXJhdG9yKSwgQXR0cnMoQWNjZXNzKSwKKyAgICAgICAgVmFsdWUoc3RkOjptb3ZlKFZhbHVlKSksIE5hbWUoTmFtZSkge30KKworICBNZW1iZXJBY2Nlc3MgZ2V0QWNjZXNzKCkgY29uc3QgeyByZXR1cm4gQXR0cnMuZ2V0QWNjZXNzKCk7IH0KKyAgQVBTSW50IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgTWVtYmVyQXR0cmlidXRlcyBBdHRyczsKKyAgQVBTSW50IFZhbHVlOworICBTdHJpbmdSZWYgTmFtZTsKK307CisKKy8vIExGX1ZGVU5DVEFCCitjbGFzcyBWRlB0clJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgVkZQdHJSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFZGUHRyUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorICBWRlB0clJlY29yZChUeXBlSW5kZXggVHlwZSkKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6VkZQdHIpLCBUeXBlKFR5cGUpIHt9CisKKyAgVHlwZUluZGV4IGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBUeXBlOyB9CisKKyAgVHlwZUluZGV4IFR5cGU7Cit9OworCisvLyBMRl9CQ0xBU1MsIExGX0JJTlRFUkZBQ0UKK2NsYXNzIEJhc2VDbGFzc1JlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgQmFzZUNsYXNzUmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBCYXNlQ2xhc3NSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisgIEJhc2VDbGFzc1JlY29yZChNZW1iZXJBdHRyaWJ1dGVzIEF0dHJzLCBUeXBlSW5kZXggVHlwZSwgdWludDY0X3QgT2Zmc2V0KQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpCYXNlQ2xhc3MpLCBBdHRycyhBdHRycyksIFR5cGUoVHlwZSksCisgICAgICAgIE9mZnNldChPZmZzZXQpIHt9CisgIEJhc2VDbGFzc1JlY29yZChNZW1iZXJBY2Nlc3MgQWNjZXNzLCBUeXBlSW5kZXggVHlwZSwgdWludDY0X3QgT2Zmc2V0KQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpCYXNlQ2xhc3MpLCBBdHRycyhBY2Nlc3MpLCBUeXBlKFR5cGUpLAorICAgICAgICBPZmZzZXQoT2Zmc2V0KSB7fQorCisgIE1lbWJlckFjY2VzcyBnZXRBY2Nlc3MoKSBjb25zdCB7IHJldHVybiBBdHRycy5nZXRBY2Nlc3MoKTsgfQorICBUeXBlSW5kZXggZ2V0QmFzZVR5cGUoKSBjb25zdCB7IHJldHVybiBUeXBlOyB9CisgIHVpbnQ2NF90IGdldEJhc2VPZmZzZXQoKSBjb25zdCB7IHJldHVybiBPZmZzZXQ7IH0KKworICBNZW1iZXJBdHRyaWJ1dGVzIEF0dHJzOworICBUeXBlSW5kZXggVHlwZTsKKyAgdWludDY0X3QgT2Zmc2V0OworfTsKKworLy8gTEZfVkJDTEFTUywgTEZfSVZCQ0xBU1MKK2NsYXNzIFZpcnR1YWxCYXNlQ2xhc3NSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIFZpcnR1YWxCYXNlQ2xhc3NSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFZpcnR1YWxCYXNlQ2xhc3NSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisgIFZpcnR1YWxCYXNlQ2xhc3NSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCwgTWVtYmVyQXR0cmlidXRlcyBBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlSW5kZXggQmFzZVR5cGUsIFR5cGVJbmRleCBWQlB0clR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0LCB1aW50NjRfdCBJbmRleCkKKyAgICAgIDogVHlwZVJlY29yZChLaW5kKSwgQXR0cnMoQXR0cnMpLCBCYXNlVHlwZShCYXNlVHlwZSksCisgICAgICAgIFZCUHRyVHlwZShWQlB0clR5cGUpLCBWQlB0ck9mZnNldChPZmZzZXQpLCBWVGFibGVJbmRleChJbmRleCkge30KKyAgVmlydHVhbEJhc2VDbGFzc1JlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kLCBNZW1iZXJBY2Nlc3MgQWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVJbmRleCBCYXNlVHlwZSwgVHlwZUluZGV4IFZCUHRyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXQsIHVpbnQ2NF90IEluZGV4KQorICAgICAgOiBUeXBlUmVjb3JkKEtpbmQpLCBBdHRycyhBY2Nlc3MpLCBCYXNlVHlwZShCYXNlVHlwZSksCisgICAgICAgIFZCUHRyVHlwZShWQlB0clR5cGUpLCBWQlB0ck9mZnNldChPZmZzZXQpLCBWVGFibGVJbmRleChJbmRleCkge30KKworICBNZW1iZXJBY2Nlc3MgZ2V0QWNjZXNzKCkgY29uc3QgeyByZXR1cm4gQXR0cnMuZ2V0QWNjZXNzKCk7IH0KKyAgVHlwZUluZGV4IGdldEJhc2VUeXBlKCkgY29uc3QgeyByZXR1cm4gQmFzZVR5cGU7IH0KKyAgVHlwZUluZGV4IGdldFZCUHRyVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFZCUHRyVHlwZTsgfQorICB1aW50NjRfdCBnZXRWQlB0ck9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIFZCUHRyT2Zmc2V0OyB9CisgIHVpbnQ2NF90IGdldFZUYWJsZUluZGV4KCkgY29uc3QgeyByZXR1cm4gVlRhYmxlSW5kZXg7IH0KKworICBNZW1iZXJBdHRyaWJ1dGVzIEF0dHJzOworICBUeXBlSW5kZXggQmFzZVR5cGU7CisgIFR5cGVJbmRleCBWQlB0clR5cGU7CisgIHVpbnQ2NF90IFZCUHRyT2Zmc2V0OworICB1aW50NjRfdCBWVGFibGVJbmRleDsKK307CisKKy8vLyBMRl9JTkRFWCAtIFVzZWQgdG8gY2hhaW4gdHdvIGxhcmdlIExGX0ZJRUxETElTVCBvciBMRl9NRVRIT0RMSVNUIHJlY29yZHMKKy8vLyB0b2dldGhlci4gVGhlIGZpcnN0IHdpbGwgZW5kIGluIGFuIExGX0lOREVYIHJlY29yZCB0aGF0IHBvaW50cyB0byB0aGUgbmV4dC4KK2NsYXNzIExpc3RDb250aW51YXRpb25SZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIExpc3RDb250aW51YXRpb25SZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IExpc3RDb250aW51YXRpb25SZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisgIExpc3RDb250aW51YXRpb25SZWNvcmQoVHlwZUluZGV4IENvbnRpbnVhdGlvbkluZGV4KQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpMaXN0Q29udGludWF0aW9uKSwKKyAgICAgICAgQ29udGludWF0aW9uSW5kZXgoQ29udGludWF0aW9uSW5kZXgpIHt9CisKKyAgVHlwZUluZGV4IGdldENvbnRpbnVhdGlvbkluZGV4KCkgY29uc3QgeyByZXR1cm4gQ29udGludWF0aW9uSW5kZXg7IH0KKworICBUeXBlSW5kZXggQ29udGludWF0aW9uSW5kZXg7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFUkVDT1JEX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmRNYXBwaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlUmVjb3JkTWFwcGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZThkNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlUmVjb3JkTWFwcGluZy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vPT09LSBUeXBlUmVjb3JkTWFwcGluZy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRVJFQ09SRE1BUFBJTkdfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFUkVDT1JETUFQUElOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3UmVjb3JkSU8uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlVmlzaXRvckNhbGxiYWNrcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBCaW5hcnlTdHJlYW1SZWFkZXI7CitjbGFzcyBCaW5hcnlTdHJlYW1Xcml0ZXI7CisKK25hbWVzcGFjZSBjb2RldmlldyB7CitjbGFzcyBUeXBlUmVjb3JkTWFwcGluZyA6IHB1YmxpYyBUeXBlVmlzaXRvckNhbGxiYWNrcyB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFR5cGVSZWNvcmRNYXBwaW5nKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyKSA6IElPKFJlYWRlcikge30KKyAgZXhwbGljaXQgVHlwZVJlY29yZE1hcHBpbmcoQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIpIDogSU8oV3JpdGVyKSB7fQorCisgIHVzaW5nIFR5cGVWaXNpdG9yQ2FsbGJhY2tzOjp2aXNpdFR5cGVCZWdpbjsKKyAgRXJyb3IgdmlzaXRUeXBlQmVnaW4oQ1ZUeXBlICZSZWNvcmQpIG92ZXJyaWRlOworICBFcnJvciB2aXNpdFR5cGVFbmQoQ1ZUeXBlICZSZWNvcmQpIG92ZXJyaWRlOworCisgIEVycm9yIHZpc2l0TWVtYmVyQmVnaW4oQ1ZNZW1iZXJSZWNvcmQgJlJlY29yZCkgb3ZlcnJpZGU7CisgIEVycm9yIHZpc2l0TWVtYmVyRW5kKENWTWVtYmVyUmVjb3JkICZSZWNvcmQpIG92ZXJyaWRlOworCisjZGVmaW5lIFRZUEVfUkVDT1JEKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFcnJvciB2aXNpdEtub3duUmVjb3JkKENWVHlwZSAmQ1ZSLCBOYW1lIyNSZWNvcmQgJlJlY29yZCkgb3ZlcnJpZGU7CisjZGVmaW5lIE1FTUJFUl9SRUNPUkQoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFcnJvciB2aXNpdEtub3duTWVtYmVyKENWTWVtYmVyUmVjb3JkICZDVlIsIE5hbWUjI1JlY29yZCAmUmVjb3JkKSBvdmVycmlkZTsKKyNkZWZpbmUgVFlQRV9SRUNPUkRfQUxJQVMoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUsIEFsaWFzTmFtZSkKKyNkZWZpbmUgTUVNQkVSX1JFQ09SRF9BTElBUyhFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSwgQWxpYXNOYW1lKQorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3VHlwZXMuZGVmIgorCitwcml2YXRlOgorICBPcHRpb25hbDxUeXBlTGVhZktpbmQ+IFR5cGVLaW5kOworICBPcHRpb25hbDxUeXBlTGVhZktpbmQ+IE1lbWJlcktpbmQ7CisKKyAgQ29kZVZpZXdSZWNvcmRJTyBJTzsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVN0cmVhbU1lcmdlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVN0cmVhbU1lcmdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTIxNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlU3RyZWFtTWVyZ2VyLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8vPT09LSBUeXBlU3RyZWFtTWVyZ2VyLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRVNUUkVBTU1FUkdFUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVTVFJFQU1NRVJHRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgVHlwZUluZGV4Oworc3RydWN0IEdsb2JhbGx5SGFzaGVkVHlwZTsKK2NsYXNzIEdsb2JhbFR5cGVUYWJsZUJ1aWxkZXI7CitjbGFzcyBNZXJnaW5nVHlwZVRhYmxlQnVpbGRlcjsKKworLy8vIFxicmllZiBNZXJnZSBvbmUgc2V0IG9mIHR5cGUgcmVjb3JkcyBpbnRvIGFub3RoZXIuICBUaGlzIG1ldGhvZCBhc3N1bWVzCisvLy8gdGhhdCBhbGwgcmVjb3JkcyBhcmUgdHlwZSByZWNvcmRzLCBhbmQgdGhlcmUgYXJlIG5vIElkIHJlY29yZHMgcHJlc2VudC4KKy8vLworLy8vIFxwYXJhbSBEZXN0IFRoZSB0YWJsZSB0byBzdG9yZSB0aGUgcmUtd3JpdHRlbiB0eXBlIHJlY29yZHMgaW50by4KKy8vLworLy8vIFxwYXJhbSBTb3VyY2VUb0Rlc3QgQSB2ZWN0b3IsIGluZGV4ZWQgYnkgdGhlIFR5cGVJbmRleCBpbiB0aGUgc291cmNlCisvLy8gdHlwZSBzdHJlYW0sIHRoYXQgY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUgcmVjb3JkCisvLy8gaW4gdGhlIGRlc3RpbmF0aW9uIHN0cmVhbS4KKy8vLworLy8vIFxwYXJhbSBUeXBlcyBUaGUgY29sbGVjdGlvbiBvZiB0eXBlcyB0byBtZXJnZSBpbi4KKy8vLworLy8vIFxyZXR1cm5zIEVycm9yOjpzdWNjZXNzKCkgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQsIG90aGVyd2lzZSBhbgorLy8vIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCitFcnJvciBtZXJnZVR5cGVSZWNvcmRzKE1lcmdpbmdUeXBlVGFibGVCdWlsZGVyICZEZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VHlwZUluZGV4PiAmU291cmNlVG9EZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDVlR5cGVBcnJheSAmVHlwZXMpOworCisvLy8gXGJyaWVmIE1lcmdlIG9uZSBzZXQgb2YgaWQgcmVjb3JkcyBpbnRvIGFub3RoZXIuICBUaGlzIG1ldGhvZCBhc3N1bWVzCisvLy8gdGhhdCBhbGwgcmVjb3JkcyBhcmUgaWQgcmVjb3JkcywgYW5kIHRoZXJlIGFyZSBubyBUeXBlIHJlY29yZHMgcHJlc2VudC4KKy8vLyBIb3dldmVyLCBzaW5jZSBJZCByZWNvcmRzIGNhbiByZWZlciBiYWNrIHRvIFR5cGUgcmVjb3JkcywgdGhpcyBtZXRob2QKKy8vLyBhc3N1bWVzIHRoYXQgdGhlIHJlZmVyZW5jZWQgdHlwZSByZWNvcmRzIGhhdmUgYWxzbyBiZWVuIG1lcmdlZCBpbnRvCisvLy8gYW5vdGhlciB0eXBlIHN0cmVhbSAoZm9yIGV4YW1wbGUgdXNpbmcgdGhlIGFib3ZlIG1ldGhvZCksIGFuZCBhY2NlcHRzCisvLy8gdGhlIG1hcHBpbmcgZnJvbSBzb3VyY2UgdG8gZGVzdCBmb3IgdGhhdCBzdHJlYW0gc28gdGhhdCBpdCBjYW4gcmUtd3JpdGUKKy8vLyB0aGUgdHlwZSByZWNvcmQgbWFwcGluZ3MgYWNjb3JkaW5nbHkuCisvLy8KKy8vLyBccGFyYW0gRGVzdCBUaGUgdGFibGUgdG8gc3RvcmUgdGhlIHJlLXdyaXR0ZW4gaWQgcmVjb3JkcyBpbnRvLgorLy8vCisvLy8gXHBhcmFtIFR5cGVzIFRoZSBtYXBwaW5nIHRvIHVzZSBmb3IgdGhlIHR5cGUgcmVjb3JkcyB0aGF0IHRoZXNlIGlkCisvLy8gcmVjb3JkcyByZWZlciB0by4KKy8vLworLy8vIFxwYXJhbSBTb3VyY2VUb0Rlc3QgQSB2ZWN0b3IsIGluZGV4ZWQgYnkgdGhlIFR5cGVJbmRleCBpbiB0aGUgc291cmNlCisvLy8gaWQgc3RyZWFtLCB0aGF0IGNvbnRhaW5zIHRoZSBpbmRleCBvZiB0aGUgY29ycmVzcG9uZGluZyBpZCByZWNvcmQKKy8vLyBpbiB0aGUgZGVzdGluYXRpb24gc3RyZWFtLgorLy8vCisvLy8gXHBhcmFtIElkcyBUaGUgY29sbGVjdGlvbiBvZiBpZCByZWNvcmRzIHRvIG1lcmdlIGluLgorLy8vCisvLy8gXHJldHVybnMgRXJyb3I6OnN1Y2Nlc3MoKSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCwgb3RoZXJ3aXNlIGFuCisvLy8gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KK0Vycm9yIG1lcmdlSWRSZWNvcmRzKE1lcmdpbmdUeXBlVGFibGVCdWlsZGVyICZEZXN0LCBBcnJheVJlZjxUeXBlSW5kZXg+IFR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFR5cGVJbmRleD4gJlNvdXJjZVRvRGVzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENWVHlwZUFycmF5ICZJZHMpOworCisvLy8gXGJyaWVmIE1lcmdlIGEgdW5pZmllZCBzZXQgb2YgdHlwZSBhbmQgaWQgcmVjb3Jkcywgc3BsaXR0aW5nIHRoZW0gaW50bworLy8vIHNlcGFyYXRlIG91dHB1dCBzdHJlYW1zLgorLy8vCisvLy8gXHBhcmFtIERlc3RJZHMgVGhlIHRhYmxlIHRvIHN0b3JlIHRoZSByZS13cml0dGVuIGlkIHJlY29yZHMgaW50by4KKy8vLworLy8vIFxwYXJhbSBEZXN0VHlwZXMgdGhlIHRhYmxlIHRvIHN0b3JlIHRoZSByZS13cml0dGVuIHR5cGUgcmVjb3JkcyBpbnRvLgorLy8vCisvLy8gXHBhcmFtIFNvdXJjZVRvRGVzdCBBIHZlY3RvciwgaW5kZXhlZCBieSB0aGUgVHlwZUluZGV4IGluIHRoZSBzb3VyY2UKKy8vLyBpZCBzdHJlYW0sIHRoYXQgY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBjb3JyZXNwb25kaW5nIGlkIHJlY29yZAorLy8vIGluIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0uCisvLy8KKy8vLyBccGFyYW0gSWRzQW5kVHlwZXMgVGhlIGNvbGxlY3Rpb24gb2YgaWQgcmVjb3JkcyB0byBtZXJnZSBpbi4KKy8vLworLy8vIFxyZXR1cm5zIEVycm9yOjpzdWNjZXNzKCkgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQsIG90aGVyd2lzZSBhbgorLy8vIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCitFcnJvciBtZXJnZVR5cGVBbmRJZFJlY29yZHMoTWVyZ2luZ1R5cGVUYWJsZUJ1aWxkZXIgJkRlc3RJZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVyZ2luZ1R5cGVUYWJsZUJ1aWxkZXIgJkRlc3RUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VHlwZUluZGV4PiAmU291cmNlVG9EZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENWVHlwZUFycmF5ICZJZHNBbmRUeXBlcyk7CisKK0Vycm9yIG1lcmdlVHlwZUFuZElkUmVjb3JkcyhHbG9iYWxUeXBlVGFibGVCdWlsZGVyICZEZXN0SWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFR5cGVUYWJsZUJ1aWxkZXIgJkRlc3RUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VHlwZUluZGV4PiAmU291cmNlVG9EZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENWVHlwZUFycmF5ICZJZHNBbmRUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxHbG9iYWxseUhhc2hlZFR5cGU+IEhhc2hlcyk7CisKK0Vycm9yIG1lcmdlVHlwZVJlY29yZHMoR2xvYmFsVHlwZVRhYmxlQnVpbGRlciAmRGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFR5cGVJbmRleD4gJlNvdXJjZVRvRGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1ZUeXBlQXJyYXkgJlR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxHbG9iYWxseUhhc2hlZFR5cGU+IEhhc2hlcyk7CisKK0Vycm9yIG1lcmdlSWRSZWNvcmRzKEdsb2JhbFR5cGVUYWJsZUJ1aWxkZXIgJkRlc3QsIEFycmF5UmVmPFR5cGVJbmRleD4gVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VHlwZUluZGV4PiAmU291cmNlVG9EZXN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1ZUeXBlQXJyYXkgJklkcywKKyAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEdsb2JhbGx5SGFzaGVkVHlwZT4gSGFzaGVzKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRVNUUkVBTU1FUkdFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlU3ltYm9sRW1pdHRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVN5bWJvbEVtaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmJhODNkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVN5bWJvbEVtaXR0ZXIuaApAQCAtMCwwICsxLDM4IEBACisvLz09PS0gVHlwZVN5bWJvbEVtaXR0ZXIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVTWU1CT0xFTUlUVEVSX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRVNZTUJPTEVNSVRURVJfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXguaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworCituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBUeXBlU3ltYm9sRW1pdHRlciB7Citwcml2YXRlOgorICBUeXBlU3ltYm9sRW1pdHRlcihjb25zdCBUeXBlU3ltYm9sRW1pdHRlciAmKSA9IGRlbGV0ZTsKKyAgVHlwZVN5bWJvbEVtaXR0ZXIgJm9wZXJhdG9yPShjb25zdCBUeXBlU3ltYm9sRW1pdHRlciAmKSA9IGRlbGV0ZTsKKworcHJvdGVjdGVkOgorICBUeXBlU3ltYm9sRW1pdHRlcigpIHt9CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+VHlwZVN5bWJvbEVtaXR0ZXIoKSB7fQorCitwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCB3cml0ZVVzZXJEZWZpbmVkVHlwZShUeXBlSW5kZXggVEksIFN0cmluZ1JlZiBOYW1lKSA9IDA7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVUYWJsZUNvbGxlY3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVUYWJsZUNvbGxlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDMyNmEwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVRhYmxlQ29sbGVjdGlvbi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vPT09LSBUeXBlVGFibGVDb2xsZWN0aW9uLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLSBDKysgLS0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRVRBQkxFQ09MTEVDVElPTl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVUQUJMRUNPTExFQ1RJT05fSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUNvbGxlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU3RyaW5nU2F2ZXIuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgVHlwZVRhYmxlQ29sbGVjdGlvbiA6IHB1YmxpYyBUeXBlQ29sbGVjdGlvbiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFR5cGVUYWJsZUNvbGxlY3Rpb24oQXJyYXlSZWY8QXJyYXlSZWY8dWludDhfdD4+IFJlY29yZHMpOworCisgIE9wdGlvbmFsPFR5cGVJbmRleD4gZ2V0Rmlyc3QoKSBvdmVycmlkZTsKKyAgT3B0aW9uYWw8VHlwZUluZGV4PiBnZXROZXh0KFR5cGVJbmRleCBQcmV2KSBvdmVycmlkZTsKKworICBDVlR5cGUgZ2V0VHlwZShUeXBlSW5kZXggSW5kZXgpIG92ZXJyaWRlOworICBTdHJpbmdSZWYgZ2V0VHlwZU5hbWUoVHlwZUluZGV4IEluZGV4KSBvdmVycmlkZTsKKyAgYm9vbCBjb250YWlucyhUeXBlSW5kZXggSW5kZXgpIG92ZXJyaWRlOworICB1aW50MzJfdCBzaXplKCkgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGNhcGFjaXR5KCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIEJ1bXBQdHJBbGxvY2F0b3IgQWxsb2NhdG9yOworICBTdHJpbmdTYXZlciBOYW1lU3RvcmFnZTsKKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBOYW1lczsKKyAgQXJyYXlSZWY8QXJyYXlSZWY8dWludDhfdD4+IFJlY29yZHM7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVWaXNpdG9yQ2FsbGJhY2tQaXBlbGluZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVZpc2l0b3JDYWxsYmFja1BpcGVsaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2ZmI4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVWaXNpdG9yQ2FsbGJhY2tQaXBlbGluZS5oCkBAIC0wLDAgKzEsMTIyIEBACisvLz09PS0gVHlwZVZpc2l0b3JDYWxsYmFja1BpcGVsaW5lLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVWSVNJVE9SQ0FMTEJBQ0tQSVBFTElORV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVWSVNJVE9SQ0FMTEJBQ0tQSVBFTElORV9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlVmlzaXRvckNhbGxiYWNrcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgVHlwZVZpc2l0b3JDYWxsYmFja1BpcGVsaW5lIDogcHVibGljIFR5cGVWaXNpdG9yQ2FsbGJhY2tzIHsKK3B1YmxpYzoKKyAgVHlwZVZpc2l0b3JDYWxsYmFja1BpcGVsaW5lKCkgPSBkZWZhdWx0OworCisgIEVycm9yIHZpc2l0VW5rbm93blR5cGUoQ1ZSZWNvcmQ8VHlwZUxlYWZLaW5kPiAmUmVjb3JkKSBvdmVycmlkZSB7CisgICAgZm9yIChhdXRvIFZpc2l0b3IgOiBQaXBlbGluZSkgeworICAgICAgaWYgKGF1dG8gRUMgPSBWaXNpdG9yLT52aXNpdFVua25vd25UeXBlKFJlY29yZCkpCisgICAgICAgIHJldHVybiBFQzsKKyAgICB9CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBFcnJvciB2aXNpdFVua25vd25NZW1iZXIoQ1ZNZW1iZXJSZWNvcmQgJlJlY29yZCkgb3ZlcnJpZGUgeworICAgIGZvciAoYXV0byBWaXNpdG9yIDogUGlwZWxpbmUpIHsKKyAgICAgIGlmIChhdXRvIEVDID0gVmlzaXRvci0+dmlzaXRVbmtub3duTWVtYmVyKFJlY29yZCkpCisgICAgICAgIHJldHVybiBFQzsKKyAgICB9CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBFcnJvciB2aXNpdFR5cGVCZWdpbihDVlR5cGUgJlJlY29yZCkgb3ZlcnJpZGUgeworICAgIGZvciAoYXV0byBWaXNpdG9yIDogUGlwZWxpbmUpIHsKKyAgICAgIGlmIChhdXRvIEVDID0gVmlzaXRvci0+dmlzaXRUeXBlQmVnaW4oUmVjb3JkKSkKKyAgICAgICAgcmV0dXJuIEVDOworICAgIH0KKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEVycm9yIHZpc2l0VHlwZUJlZ2luKENWVHlwZSAmUmVjb3JkLCBUeXBlSW5kZXggSW5kZXgpIG92ZXJyaWRlIHsKKyAgICBmb3IgKGF1dG8gVmlzaXRvciA6IFBpcGVsaW5lKSB7CisgICAgICBpZiAoYXV0byBFQyA9IFZpc2l0b3ItPnZpc2l0VHlwZUJlZ2luKFJlY29yZCwgSW5kZXgpKQorICAgICAgICByZXR1cm4gRUM7CisgICAgfQorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgdmlzaXRUeXBlRW5kKENWVHlwZSAmUmVjb3JkKSBvdmVycmlkZSB7CisgICAgZm9yIChhdXRvIFZpc2l0b3IgOiBQaXBlbGluZSkgeworICAgICAgaWYgKGF1dG8gRUMgPSBWaXNpdG9yLT52aXNpdFR5cGVFbmQoUmVjb3JkKSkKKyAgICAgICAgcmV0dXJuIEVDOworICAgIH0KKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEVycm9yIHZpc2l0TWVtYmVyQmVnaW4oQ1ZNZW1iZXJSZWNvcmQgJlJlY29yZCkgb3ZlcnJpZGUgeworICAgIGZvciAoYXV0byBWaXNpdG9yIDogUGlwZWxpbmUpIHsKKyAgICAgIGlmIChhdXRvIEVDID0gVmlzaXRvci0+dmlzaXRNZW1iZXJCZWdpbihSZWNvcmQpKQorICAgICAgICByZXR1cm4gRUM7CisgICAgfQorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgdmlzaXRNZW1iZXJFbmQoQ1ZNZW1iZXJSZWNvcmQgJlJlY29yZCkgb3ZlcnJpZGUgeworICAgIGZvciAoYXV0byBWaXNpdG9yIDogUGlwZWxpbmUpIHsKKyAgICAgIGlmIChhdXRvIEVDID0gVmlzaXRvci0+dmlzaXRNZW1iZXJFbmQoUmVjb3JkKSkKKyAgICAgICAgcmV0dXJuIEVDOworICAgIH0KKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIHZvaWQgYWRkQ2FsbGJhY2tUb1BpcGVsaW5lKFR5cGVWaXNpdG9yQ2FsbGJhY2tzICZDYWxsYmFja3MpIHsKKyAgICBQaXBlbGluZS5wdXNoX2JhY2soJkNhbGxiYWNrcyk7CisgIH0KKworI2RlZmluZSBUWVBFX1JFQ09SRChFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRXJyb3IgdmlzaXRLbm93blJlY29yZChDVlR5cGUgJkNWUiwgTmFtZSMjUmVjb3JkICZSZWNvcmQpIG92ZXJyaWRlIHsgICAgICAgICBcCisgICAgcmV0dXJuIHZpc2l0S25vd25SZWNvcmRJbXBsKENWUiwgUmVjb3JkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIE1FTUJFUl9SRUNPUkQoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFcnJvciB2aXNpdEtub3duTWVtYmVyKENWTWVtYmVyUmVjb3JkICZDVk1SLCBOYW1lIyNSZWNvcmQgJlJlY29yZCkgICAgICAgICAgIFwKKyAgICAgIG92ZXJyaWRlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHZpc2l0S25vd25NZW1iZXJJbXBsKENWTVIsIFJlY29yZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIFRZUEVfUkVDT1JEX0FMSUFTKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lLCBBbGlhc05hbWUpCisjZGVmaW5lIE1FTUJFUl9SRUNPUkRfQUxJQVMoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUsIEFsaWFzTmFtZSkKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld1R5cGVzLmRlZiIKKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEVycm9yIHZpc2l0S25vd25SZWNvcmRJbXBsKENWVHlwZSAmQ1ZSLCBUICZSZWNvcmQpIHsKKyAgICBmb3IgKGF1dG8gVmlzaXRvciA6IFBpcGVsaW5lKSB7CisgICAgICBpZiAoYXV0byBFQyA9IFZpc2l0b3ItPnZpc2l0S25vd25SZWNvcmQoQ1ZSLCBSZWNvcmQpKQorICAgICAgICByZXR1cm4gRUM7CisgICAgfQorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIEVycm9yIHZpc2l0S25vd25NZW1iZXJJbXBsKENWTWVtYmVyUmVjb3JkICZDVk1SLCBUICZSZWNvcmQpIHsKKyAgICBmb3IgKGF1dG8gVmlzaXRvciA6IFBpcGVsaW5lKSB7CisgICAgICBpZiAoYXV0byBFQyA9IFZpc2l0b3ItPnZpc2l0S25vd25NZW1iZXIoQ1ZNUiwgUmVjb3JkKSkKKyAgICAgICAgcmV0dXJuIEVDOworICAgIH0KKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorICBzdGQ6OnZlY3RvcjxUeXBlVmlzaXRvckNhbGxiYWNrcyAqPiBQaXBlbGluZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVWSVNJVE9SQ0FMTEJBQ0tQSVBFTElORV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlVmlzaXRvckNhbGxiYWNrcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVZpc2l0b3JDYWxsYmFja3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2E0NzMzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVZpc2l0b3JDYWxsYmFja3MuaApAQCAtMCwwICsxLDcxIEBACisvLz09PS0gVHlwZVZpc2l0b3JDYWxsYmFja3MuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVWSVNJVE9SQ0FMTEJBQ0tTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRVZJU0lUT1JDQUxMQkFDS1NfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBUeXBlVmlzaXRvckNhbGxiYWNrcyB7CitwdWJsaWM6CisgIHZpcnR1YWwgflR5cGVWaXNpdG9yQ2FsbGJhY2tzKCkgPSBkZWZhdWx0OworCisgIC8vLyBBY3Rpb24gdG8gdGFrZSBvbiB1bmtub3duIHR5cGVzLiBCeSBkZWZhdWx0LCB0aGV5IGFyZSBpZ25vcmVkLgorICB2aXJ0dWFsIEVycm9yIHZpc2l0VW5rbm93blR5cGUoQ1ZUeXBlICZSZWNvcmQpIHsgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7IH0KKyAgLy8vIFBhaXJlZCBiZWdpbi9lbmQgYWN0aW9ucyBmb3IgYWxsIHR5cGVzLiBSZWNlaXZlcyBhbGwgcmVjb3JkIGRhdGEsCisgIC8vLyBpbmNsdWRpbmcgdGhlIGZpeGVkLWxlbmd0aCByZWNvcmQgcHJlZml4LiAgdmlzaXRUeXBlQmVnaW4oKSBzaG91bGQgcmV0dXJuCisgIC8vLyB0aGUgdHlwZSBvZiB0aGUgUmVjb3JkLCBvciBhbiBlcnJvciBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4gIEV4YWN0bHkKKyAgLy8vIG9uZSBvZiB0aGUgdHdvIHZpc2l0VHlwZUJlZ2luIG1ldGhvZHMgd2lsbCBiZSBjYWxsZWQsIGRlcGVuZGluZyBvbiB3aGV0aGVyCisgIC8vLyByZWNvcmRzIGFyZSBiZWluZyB2aXNpdGVkIHNlcXVlbnRpYWxseSBvciByYW5kb21seS4gIEFuIGltcGxlbWVudGF0aW9uCisgIC8vLyBzaG91bGQgYmUgcHJlcGFyZWQgdG8gaGFuZGxlIGJvdGggKG9yIGFzc2VydCBpZiBpdCBjYW4ndCBoYW5kbGUgcmFuZG9tCisgIC8vLyBhY2Nlc3MgdmlzaXRhdGlvbikuCisgIHZpcnR1YWwgRXJyb3IgdmlzaXRUeXBlQmVnaW4oQ1ZUeXBlICZSZWNvcmQpIHsgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7IH0KKyAgdmlydHVhbCBFcnJvciB2aXNpdFR5cGVCZWdpbihDVlR5cGUgJlJlY29yZCwgVHlwZUluZGV4IEluZGV4KSB7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKyAgdmlydHVhbCBFcnJvciB2aXNpdFR5cGVFbmQoQ1ZUeXBlICZSZWNvcmQpIHsgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7IH0KKworICB2aXJ0dWFsIEVycm9yIHZpc2l0VW5rbm93bk1lbWJlcihDVk1lbWJlclJlY29yZCAmUmVjb3JkKSB7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICB2aXJ0dWFsIEVycm9yIHZpc2l0TWVtYmVyQmVnaW4oQ1ZNZW1iZXJSZWNvcmQgJlJlY29yZCkgeworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgdmlydHVhbCBFcnJvciB2aXNpdE1lbWJlckVuZChDVk1lbWJlclJlY29yZCAmUmVjb3JkKSB7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworI2RlZmluZSBUWVBFX1JFQ09SRChFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdmlydHVhbCBFcnJvciB2aXNpdEtub3duUmVjb3JkKENWVHlwZSAmQ1ZSLCBOYW1lIyNSZWNvcmQgJlJlY29yZCkgeyAgICAgICAgICBcCisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIE1FTUJFUl9SRUNPUkQoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2aXJ0dWFsIEVycm9yIHZpc2l0S25vd25NZW1iZXIoQ1ZNZW1iZXJSZWNvcmQgJkNWTSwgTmFtZSMjUmVjb3JkICZSZWNvcmQpIHsgIFwKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBUWVBFX1JFQ09SRF9BTElBUyhFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSwgQWxpYXNOYW1lKQorI2RlZmluZSBNRU1CRVJfUkVDT1JEX0FMSUFTKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lLCBBbGlhc05hbWUpCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdUeXBlcy5kZWYiCisjdW5kZWYgVFlQRV9SRUNPUkQKKyN1bmRlZiBUWVBFX1JFQ09SRF9BTElBUworI3VuZGVmIE1FTUJFUl9SRUNPUkQKKyN1bmRlZiBNRU1CRVJfUkVDT1JEX0FMSUFTCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFVklTSVRPUkNBTExCQUNLU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9ESUNvbnRleHQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RJQ29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OWViMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9ESUNvbnRleHQuaApAQCAtMCwwICsxLDI3MyBAQAorLy89PT0tIERJQ29udGV4dC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBESUNvbnRleHQsIGFuIGFic3RyYWN0IGRhdGEgc3RydWN0dXJlIHRoYXQgaG9sZHMKKy8vIGRlYnVnIGluZm9ybWF0aW9uIGRhdGEuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19ESUNPTlRFWFRfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19ESUNPTlRFWFRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9PYmplY3RGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQSBmb3JtYXQtbmV1dHJhbCBjb250YWluZXIgZm9yIHNvdXJjZSBsaW5lIGluZm9ybWF0aW9uLgorc3RydWN0IERJTGluZUluZm8geworICBzdGQ6OnN0cmluZyBGaWxlTmFtZTsKKyAgc3RkOjpzdHJpbmcgRnVuY3Rpb25OYW1lOworICBPcHRpb25hbDxTdHJpbmdSZWY+IFNvdXJjZTsKKyAgdWludDMyX3QgTGluZSA9IDA7CisgIHVpbnQzMl90IENvbHVtbiA9IDA7CisgIHVpbnQzMl90IFN0YXJ0TGluZSA9IDA7CisKKyAgLy8gRFdBUkYtc3BlY2lmaWMuCisgIHVpbnQzMl90IERpc2NyaW1pbmF0b3IgPSAwOworCisgIERJTGluZUluZm8oKSA6IEZpbGVOYW1lKCI8aW52YWxpZD4iKSwgRnVuY3Rpb25OYW1lKCI8aW52YWxpZD4iKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBESUxpbmVJbmZvICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gTGluZSA9PSBSSFMuTGluZSAmJiBDb2x1bW4gPT0gUkhTLkNvbHVtbiAmJgorICAgICAgICAgICBGaWxlTmFtZSA9PSBSSFMuRmlsZU5hbWUgJiYgRnVuY3Rpb25OYW1lID09IFJIUy5GdW5jdGlvbk5hbWUgJiYKKyAgICAgICAgICAgU3RhcnRMaW5lID09IFJIUy5TdGFydExpbmUgJiYgRGlzY3JpbWluYXRvciA9PSBSSFMuRGlzY3JpbWluYXRvcjsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBESUxpbmVJbmZvICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBSSFMpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRElMaW5lSW5mbyAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKEZpbGVOYW1lLCBGdW5jdGlvbk5hbWUsIExpbmUsIENvbHVtbiwgU3RhcnRMaW5lLAorICAgICAgICAgICAgICAgICAgICBEaXNjcmltaW5hdG9yKSA8CisgICAgICAgICAgIHN0ZDo6dGllKFJIUy5GaWxlTmFtZSwgUkhTLkZ1bmN0aW9uTmFtZSwgUkhTLkxpbmUsIFJIUy5Db2x1bW4sCisgICAgICAgICAgICAgICAgICAgIFJIUy5TdGFydExpbmUsIFJIUy5EaXNjcmltaW5hdG9yKTsKKyAgfQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAqdGhpcyAhPSBESUxpbmVJbmZvKCk7IH0KKworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TKSB7CisgICAgT1MgPDwgIkxpbmUgaW5mbzogIjsKKyAgICBpZiAoRmlsZU5hbWUgIT0gIjxpbnZhbGlkPiIpCisgICAgICBPUyA8PCAiZmlsZSAnIiA8PCBGaWxlTmFtZSA8PCAiJywgIjsKKyAgICBpZiAoRnVuY3Rpb25OYW1lICE9ICI8aW52YWxpZD4iKQorICAgICAgT1MgPDwgImZ1bmN0aW9uICciIDw8IEZ1bmN0aW9uTmFtZSA8PCAiJywgIjsKKyAgICBPUyA8PCAibGluZSAiIDw8IExpbmUgPDwgIiwgIjsKKyAgICBPUyA8PCAiY29sdW1uICIgPDwgQ29sdW1uIDw8ICIsICI7CisgICAgT1MgPDwgInN0YXJ0IGxpbmUgIiA8PCBTdGFydExpbmUgPDwgJ1xuJzsKKyAgfQorfTsKKwordXNpbmcgRElMaW5lSW5mb1RhYmxlID0gU21hbGxWZWN0b3I8c3RkOjpwYWlyPHVpbnQ2NF90LCBESUxpbmVJbmZvPiwgMTY+OworCisvLy8gQSBmb3JtYXQtbmV1dHJhbCBjb250YWluZXIgZm9yIGlubGluZWQgY29kZSBkZXNjcmlwdGlvbi4KK2NsYXNzIERJSW5saW5pbmdJbmZvIHsKKyAgU21hbGxWZWN0b3I8RElMaW5lSW5mbywgND4gRnJhbWVzOworCitwdWJsaWM6CisgIERJSW5saW5pbmdJbmZvKCkgPSBkZWZhdWx0OworCisgIERJTGluZUluZm8gZ2V0RnJhbWUodW5zaWduZWQgSW5kZXgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSW5kZXggPCBGcmFtZXMuc2l6ZSgpKTsKKyAgICByZXR1cm4gRnJhbWVzW0luZGV4XTsKKyAgfQorCisgIERJTGluZUluZm8gKmdldE11dGFibGVGcmFtZSh1bnNpZ25lZCBJbmRleCkgeworICAgIGFzc2VydChJbmRleCA8IEZyYW1lcy5zaXplKCkpOworICAgIHJldHVybiAmRnJhbWVzW0luZGV4XTsKKyAgfQorCisgIHVpbnQzMl90IGdldE51bWJlck9mRnJhbWVzKCkgY29uc3QgeworICAgIHJldHVybiBGcmFtZXMuc2l6ZSgpOworICB9CisKKyAgdm9pZCBhZGRGcmFtZShjb25zdCBESUxpbmVJbmZvICZGcmFtZSkgeworICAgIEZyYW1lcy5wdXNoX2JhY2soRnJhbWUpOworICB9Cit9OworCisvLy8gQ29udGFpbmVyIGZvciBkZXNjcmlwdGlvbiBvZiBhIGdsb2JhbCB2YXJpYWJsZS4KK3N0cnVjdCBESUdsb2JhbCB7CisgIHN0ZDo6c3RyaW5nIE5hbWU7CisgIHVpbnQ2NF90IFN0YXJ0ID0gMDsKKyAgdWludDY0X3QgU2l6ZSA9IDA7CisKKyAgRElHbG9iYWwoKSA6IE5hbWUoIjxpbnZhbGlkPiIpIHt9Cit9OworCisvLy8gQSBESU5hbWVLaW5kIGlzIHBhc3NlZCB0byBuYW1lIHNlYXJjaCBtZXRob2RzIHRvIHNwZWNpZnkgYQorLy8vIHByZWZlcmVuY2UgcmVnYXJkaW5nIHRoZSB0eXBlIG9mIG5hbWUgcmVzb2x1dGlvbiB0aGUgY2FsbGVyIHdhbnRzLgorZW51bSBjbGFzcyBESU5hbWVLaW5kIHsgTm9uZSwgU2hvcnROYW1lLCBMaW5rYWdlTmFtZSB9OworCisvLy8gQ29udHJvbHMgd2hpY2ggZmllbGRzIG9mIERJTGluZUluZm8gY29udGFpbmVyIHNob3VsZCBiZSBmaWxsZWQKKy8vLyB3aXRoIGRhdGEuCitzdHJ1Y3QgRElMaW5lSW5mb1NwZWNpZmllciB7CisgIGVudW0gY2xhc3MgRmlsZUxpbmVJbmZvS2luZCB7IE5vbmUsIERlZmF1bHQsIEFic29sdXRlRmlsZVBhdGggfTsKKyAgdXNpbmcgRnVuY3Rpb25OYW1lS2luZCA9IERJTmFtZUtpbmQ7CisKKyAgRmlsZUxpbmVJbmZvS2luZCBGTElLaW5kOworICBGdW5jdGlvbk5hbWVLaW5kIEZOS2luZDsKKworICBESUxpbmVJbmZvU3BlY2lmaWVyKEZpbGVMaW5lSW5mb0tpbmQgRkxJS2luZCA9IEZpbGVMaW5lSW5mb0tpbmQ6OkRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25OYW1lS2luZCBGTktpbmQgPSBGdW5jdGlvbk5hbWVLaW5kOjpOb25lKQorICAgICAgOiBGTElLaW5kKEZMSUtpbmQpLCBGTktpbmQoRk5LaW5kKSB7fQorfTsKKworLy8vIFRoaXMgaXMganVzdCBhIGhlbHBlciB0byBwcm9ncmFtbWF0aWNhbGx5IGNvbnN0cnVjdCBESUR1bXBUeXBlLgorZW51bSBESUR1bXBUeXBlQ291bnRlciB7CisjZGVmaW5lIEhBTkRMRV9EV0FSRl9TRUNUSU9OKEVOVU1fTkFNRSwgRUxGX05BTUUsIENNRExJTkVfTkFNRSkgXAorICBESURUX0lEXyMjRU5VTV9OQU1FLAorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKKyN1bmRlZiBIQU5ETEVfRFdBUkZfU0VDVElPTgorICBESURUX0lEX1VVSUQsCisgIERJRFRfSURfQ291bnQKK307CitzdGF0aWNfYXNzZXJ0KERJRFRfSURfQ291bnQgPD0gMzIsICJzZWN0aW9uIHR5cGVzIG92ZXJmbG93IHN0b3JhZ2UiKTsKKworLy8vIFNlbGVjdHMgd2hpY2ggZGVidWcgc2VjdGlvbnMgZ2V0IGR1bXBlZC4KK2VudW0gRElEdW1wVHlwZSA6IHVuc2lnbmVkIHsKKyAgRElEVF9OdWxsLAorICBESURUX0FsbCAgICAgICAgICAgICA9IH4wVSwKKyNkZWZpbmUgSEFORExFX0RXQVJGX1NFQ1RJT04oRU5VTV9OQU1FLCBFTEZfTkFNRSwgQ01ETElORV9OQU1FKSBcCisgIERJRFRfIyNFTlVNX05BTUUgPSAxVSA8PCBESURUX0lEXyMjRU5VTV9OQU1FLAorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKKyN1bmRlZiBIQU5ETEVfRFdBUkZfU0VDVElPTgorICBESURUX1VVSUQgPSAxIDw8IERJRFRfSURfVVVJRCwKK307CisKKy8vLyBDb250YWluZXIgZm9yIGR1bXAgb3B0aW9ucyB0aGF0IGNvbnRyb2wgd2hpY2ggZGVidWcgaW5mb3JtYXRpb24gd2lsbCBiZQorLy8vIGR1bXBlZC4KK3N0cnVjdCBESUR1bXBPcHRpb25zIHsKKyAgdW5zaWduZWQgRHVtcFR5cGUgPSBESURUX0FsbDsKKyAgdW5zaWduZWQgUmVjdXJzZURlcHRoID0gLTFVOworICBib29sIFNob3dBZGRyZXNzZXMgPSB0cnVlOworICBib29sIFNob3dDaGlsZHJlbiA9IGZhbHNlOworICBib29sIFNob3dQYXJlbnRzID0gZmFsc2U7CisgIGJvb2wgU2hvd0Zvcm0gPSBmYWxzZTsKKyAgYm9vbCBTdW1tYXJpemVUeXBlcyA9IGZhbHNlOworICBib29sIFZlcmJvc2UgPSBmYWxzZTsKKyAgYm9vbCBEaXNwbGF5UmF3Q29udGVudHMgPSBmYWxzZTsKKworICAvLy8gUmV0dXJuIGRlZmF1bHQgb3B0aW9uIHNldCBmb3IgcHJpbnRpbmcgYSBzaW5nbGUgRElFIHdpdGhvdXQgY2hpbGRyZW4uCisgIHN0YXRpYyBESUR1bXBPcHRpb25zIGdldEZvclNpbmdsZURJRSgpIHsKKyAgICBESUR1bXBPcHRpb25zIE9wdHM7CisgICAgT3B0cy5SZWN1cnNlRGVwdGggPSAwOworICAgIHJldHVybiBPcHRzOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgb3B0aW9ucyB3aXRoIFJlY3Vyc2VEZXB0aCBzZXQgdG8gMCB1bmxlc3MgZXhwbGljaXRseSByZXF1aXJlZC4KKyAgRElEdW1wT3B0aW9ucyBub0ltcGxpY2l0UmVjdXJzaW9uKCkgY29uc3QgeworICAgIERJRHVtcE9wdGlvbnMgT3B0cyA9ICp0aGlzOworICAgIGlmIChSZWN1cnNlRGVwdGggPT0gLTFVICYmICFTaG93Q2hpbGRyZW4pCisgICAgICBPcHRzLlJlY3Vyc2VEZXB0aCA9IDA7CisgICAgcmV0dXJuIE9wdHM7CisgIH0KK307CisKK2NsYXNzIERJQ29udGV4dCB7CitwdWJsaWM6CisgIGVudW0gRElDb250ZXh0S2luZCB7CisgICAgQ0tfRFdBUkYsCisgICAgQ0tfUERCCisgIH07CisKKyAgRElDb250ZXh0KERJQ29udGV4dEtpbmQgSykgOiBLaW5kKEspIHt9CisgIHZpcnR1YWwgfkRJQ29udGV4dCgpID0gZGVmYXVsdDsKKworICBESUNvbnRleHRLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgdmlydHVhbCB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBESUR1bXBPcHRpb25zIER1bXBPcHRzKSA9IDA7CisKKyAgdmlydHVhbCBib29sIHZlcmlmeShyYXdfb3N0cmVhbSAmT1MsIERJRHVtcE9wdGlvbnMgRHVtcE9wdHMgPSB7fSkgeworICAgIC8vIE5vIHZlcmlmaWVyPyBKdXN0IHNheSB0aGluZ3Mgd2VudCB3ZWxsLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdmlydHVhbCBESUxpbmVJbmZvIGdldExpbmVJbmZvRm9yQWRkcmVzcyh1aW50NjRfdCBBZGRyZXNzLAorICAgICAgRElMaW5lSW5mb1NwZWNpZmllciBTcGVjaWZpZXIgPSBESUxpbmVJbmZvU3BlY2lmaWVyKCkpID0gMDsKKyAgdmlydHVhbCBESUxpbmVJbmZvVGFibGUgZ2V0TGluZUluZm9Gb3JBZGRyZXNzUmFuZ2UodWludDY0X3QgQWRkcmVzcywKKyAgICAgIHVpbnQ2NF90IFNpemUsIERJTGluZUluZm9TcGVjaWZpZXIgU3BlY2lmaWVyID0gRElMaW5lSW5mb1NwZWNpZmllcigpKSA9IDA7CisgIHZpcnR1YWwgRElJbmxpbmluZ0luZm8gZ2V0SW5saW5pbmdJbmZvRm9yQWRkcmVzcyh1aW50NjRfdCBBZGRyZXNzLAorICAgICAgRElMaW5lSW5mb1NwZWNpZmllciBTcGVjaWZpZXIgPSBESUxpbmVJbmZvU3BlY2lmaWVyKCkpID0gMDsKKworcHJpdmF0ZToKKyAgY29uc3QgRElDb250ZXh0S2luZCBLaW5kOworfTsKKworLy8vIEFuIGluZmVyZmFjZSBmb3IgaW5xdWlyaW5nIHRoZSBsb2FkIGFkZHJlc3Mgb2YgYSBsb2FkZWQgb2JqZWN0IGZpbGUKKy8vLyB0byBiZSB1c2VkIGJ5IHRoZSBESUNvbnRleHQgaW1wbGVtZW50YXRpb25zIHdoZW4gYXBwbHlpbmcgcmVsb2NhdGlvbnMKKy8vLyBvbiB0aGUgZmx5LgorY2xhc3MgTG9hZGVkT2JqZWN0SW5mbyB7Citwcm90ZWN0ZWQ6CisgIExvYWRlZE9iamVjdEluZm8oKSA9IGRlZmF1bHQ7CisgIExvYWRlZE9iamVjdEluZm8oY29uc3QgTG9hZGVkT2JqZWN0SW5mbyAmKSA9IGRlZmF1bHQ7CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+TG9hZGVkT2JqZWN0SW5mbygpID0gZGVmYXVsdDsKKworICAvLy8gT2J0YWluIHRoZSBMb2FkIEFkZHJlc3Mgb2YgYSBzZWN0aW9uIGJ5IFNlY3Rpb25SZWYuCisgIC8vLworICAvLy8gQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBnaXZlbiBzZWN0aW9uLgorICAvLy8gVGhlIHNlY3Rpb24gbmVlZCBub3QgYmUgcHJlc2VudCBpbiB0aGUgbG9jYWwgYWRkcmVzcyBzcGFjZS4gVGhlIGFkZHJlc3NlcworICAvLy8gbmVlZCB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGFkZHJlc3NlcyB1c2VkIHRvIHF1ZXJ5IHRoZSBESUNvbnRleHQgYW5kCisgIC8vLyB0aGUgb3V0cHV0IG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGRldGVybWluaXN0aWMsIGkuZS4gcmVwZWF0ZWQgY2FsbHMKKyAgLy8vIHdpdGggdGhlIHNhbWUgU2VjIHNob3VsZCBnaXZlIHRoZSBzYW1lIGFkZHJlc3MuCisgIHZpcnR1YWwgdWludDY0X3QgZ2V0U2VjdGlvbkxvYWRBZGRyZXNzKGNvbnN0IG9iamVjdDo6U2VjdGlvblJlZiAmU2VjKSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gSWYgY29udmVuaWVudGx5IGF2YWlsYWJsZSwgcmV0dXJuIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBTZWN0aW9uLgorICAvLy8KKyAgLy8vIFdoZW4gdGhlIHNlY3Rpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBsb2NhbCBhZGRyZXNzIHNwYWNlLCBpbiByZWxvY2F0ZWQKKyAgLy8vIChsb2FkZWQpIGZvcm0sIGUuZy4gYmVjYXVzZSBpdCB3YXMgcmVsb2NhdGVkIGJ5IGEgSklUIGZvciBleGVjdXRpb24sIHRoaXMKKyAgLy8vIGZ1bmN0aW9uIHNob3VsZCBwcm92aWRlIHRoZSBjb250ZW50cyBvZiBzYWlkIHNlY3Rpb24gaW4gYERhdGFgLiBJZiB0aGUKKyAgLy8vIGxvYWRlZCBzZWN0aW9uIGlzIG5vdCBhdmFpbGFibGUsIG9yIHRoZSBjb3N0IG9mIHJldHJpZXZpbmcgaXQgd291bGQgYmUKKyAgLy8vIHByb2hpYml0aXZlLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gZmFsc2UuIEluIHRoYXQgY2FzZSwgcmVsb2NhdGlvbnMKKyAgLy8vIHdpbGwgYmUgcmVhZCBmcm9tIHRoZSBsb2NhbCAodW5yZWxvY2F0ZWQpIG9iamVjdCBmaWxlIGFuZCBhcHBsaWVkIG9uIHRoZQorICAvLy8gZmx5LiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgdXNlZCBwdXJlbHkgZm9yIG9wdGltemF0aW9uIHB1cnBvc2VzIGluIHRoZQorICAvLy8gY29tbW9uIGNhc2Ugb2YgSklUdGluZyBpbiB0aGUgbG9jYWwgYWRkcmVzcyBzcGFjZSwgc28gcmV0dXJuaW5nIGZhbHNlCisgIC8vLyBzaG91bGQgYWx3YXlzIGJlIGNvcnJlY3QuCisgIHZpcnR1YWwgYm9vbCBnZXRMb2FkZWRTZWN0aW9uQ29udGVudHMoY29uc3Qgb2JqZWN0OjpTZWN0aW9uUmVmICZTZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICZEYXRhKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gRklYTUU6IFRoaXMgaXMgdW50ZXN0ZWQgYW5kIHVudXNlZCBhbnl3aGVyZSBpbiB0aGUgTExWTSBwcm9qZWN0LCBpdCdzCisgIC8vIHVzZWQvbmVlZGVkIGJ5IEp1bGlhIChhbiBleHRlcm5hbCBwcm9qZWN0KS4gSXQgc2hvdWxkIGhhdmUgc29tZSBjb3ZlcmFnZQorICAvLyAoYXQgbGVhc3QgdGVzdHMsIGJ1dCBpZGVhbGx5IGV4YW1wbGUgZnVuY3Rpb25hbGl0eSkuCisgIC8vLyBPYnRhaW4gYSBjb3B5IG9mIHRoaXMgTG9hZGVkT2JqZWN0SW5mby4KKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8TG9hZGVkT2JqZWN0SW5mbz4gY2xvbmUoKSBjb25zdCA9IDA7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgQmFzZSA9IExvYWRlZE9iamVjdEluZm8+CitzdHJ1Y3QgTG9hZGVkT2JqZWN0SW5mb0hlbHBlciA6IEJhc2UgeworcHJvdGVjdGVkOgorICBMb2FkZWRPYmplY3RJbmZvSGVscGVyKGNvbnN0IExvYWRlZE9iamVjdEluZm9IZWxwZXIgJikgPSBkZWZhdWx0OworICBMb2FkZWRPYmplY3RJbmZvSGVscGVyKCkgPSBkZWZhdWx0OworCitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUcz4KKyAgTG9hZGVkT2JqZWN0SW5mb0hlbHBlcihUcyAmJi4uLiBBcmdzKSA6IEJhc2Uoc3RkOjpmb3J3YXJkPFRzPihBcmdzKS4uLikge30KKworICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TG9hZGVkT2JqZWN0SW5mbz4gY2xvbmUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VfdW5pcXVlPERlcml2ZWQ+KHN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQgJj4oKnRoaXMpKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RJQ09OVEVYVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiMjMzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb24uaApAQCAtMCwwICsxLDE4NCBAQAorLy89PT0tIERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb24uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRkFCQlJFVklBVElPTkRFQ0xBUkFUSU9OX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZBQkJSRVZJQVRJT05ERUNMQVJBVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhRXh0cmFjdG9yLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRFdBUkZGb3JtVmFsdWU7CitjbGFzcyBEV0FSRlVuaXQ7CitjbGFzcyByYXdfb3N0cmVhbTsKKworY2xhc3MgRFdBUkZBYmJyZXZpYXRpb25EZWNsYXJhdGlvbiB7CitwdWJsaWM6CisgIHN0cnVjdCBBdHRyaWJ1dGVTcGVjIHsKKyAgICBBdHRyaWJ1dGVTcGVjKGR3YXJmOjpBdHRyaWJ1dGUgQSwgZHdhcmY6OkZvcm0gRiwgaW50NjRfdCBWYWx1ZSkKKyAgICAgICAgOiBBdHRyKEEpLCBGb3JtKEYpLCBWYWx1ZShWYWx1ZSkgeworICAgICAgYXNzZXJ0KGlzSW1wbGljaXRDb25zdCgpKTsKKyAgICB9CisgICAgQXR0cmlidXRlU3BlYyhkd2FyZjo6QXR0cmlidXRlIEEsIGR3YXJmOjpGb3JtIEYsIE9wdGlvbmFsPHVpbnQ4X3Q+IEJ5dGVTaXplKQorICAgICAgICA6IEF0dHIoQSksIEZvcm0oRikgeworICAgICAgYXNzZXJ0KCFpc0ltcGxpY2l0Q29uc3QoKSk7CisgICAgICB0aGlzLT5CeXRlU2l6ZS5IYXNCeXRlU2l6ZSA9IEJ5dGVTaXplLmhhc1ZhbHVlKCk7CisgICAgICBpZiAodGhpcy0+Qnl0ZVNpemUuSGFzQnl0ZVNpemUpCisgICAgICAgIHRoaXMtPkJ5dGVTaXplLkJ5dGVTaXplID0gKkJ5dGVTaXplOworICAgIH0KKworICAgIGR3YXJmOjpBdHRyaWJ1dGUgQXR0cjsKKyAgICBkd2FyZjo6Rm9ybSBGb3JtOworCisgIHByaXZhdGU6CisgICAgLy8vIFRoZSBmb2xsb3dpbmcgZmllbGQgaXMgdXNlZCBmb3IgQnl0ZVNpemUgZm9yIG5vbi1pbXBsaWNpdF9jb25zdAorICAgIC8vLyBhdHRyaWJ1dGVzIGFuZCBhcyB2YWx1ZSBmb3IgaW1wbGljaXRfY29uc3Qgb25lcywgaW5kaWNhdGVkIGJ5CisgICAgLy8vIEZvcm0gPT0gRFdfRk9STV9pbXBsaWNpdF9jb25zdC4KKyAgICAvLy8gVGhlIGZvbGxvd2luZyBjYXNlcyBhcmUgZGlzdGluZ3Vpc2hlZDoKKyAgICAvLy8gKiBGb3JtICE9IERXX0ZPUk1faW1wbGljaXRfY29uc3QgYW5kIEhhc0J5dGVTaXplIGlzIHRydWU6CisgICAgLy8vICAgICBCeXRlU2l6ZSBjb250YWlucyB0aGUgZml4ZWQgc2l6ZSBpbiBieXRlcyBmb3IgdGhlIEZvcm0gaW4gdGhpcworICAgIC8vLyAgICAgb2JqZWN0LgorICAgIC8vLyAqIEZvcm0gIT0gRFdfRk9STV9pbXBsaWNpdF9jb25zdCBhbmQgSGFzQnl0ZVNpemUgaXMgZmFsc2U6CisgICAgLy8vICAgICBieXRlIHNpemUgb2YgRm9ybSBlaXRoZXIgdmFyaWVzIGFjY29yZGluZyB0byB0aGUgRFdBUkZVbml0CisgICAgLy8vICAgICB0aGF0IGl0IGlzIGNvbnRhaW5lZCBpbiBvciB0aGUgdmFsdWUgc2l6ZSB2YXJpZXMgYW5kIG11c3QgYmUKKyAgICAvLy8gICAgIGRlY29kZWQgZnJvbSB0aGUgZGVidWcgaW5mb3JtYXRpb24gaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGl0cyBzaXplLgorICAgIC8vLyAqIEZvcm0gPT0gRFdfRk9STV9pbXBsaWNpdF9jb25zdDoKKyAgICAvLy8gICAgIFZhbHVlIGNvbnRhaW5zIHZhbHVlIGZvciB0aGUgaW1wbGljaXRfY29uc3QgYXR0cmlidXRlLgorICAgIHN0cnVjdCBCeXRlU2l6ZVN0b3JhZ2UgeworICAgICAgYm9vbCBIYXNCeXRlU2l6ZTsKKyAgICAgIHVpbnQ4X3QgQnl0ZVNpemU7CisgICAgfTsKKyAgICB1bmlvbiB7CisgICAgICBCeXRlU2l6ZVN0b3JhZ2UgQnl0ZVNpemU7CisgICAgICBpbnQ2NF90IFZhbHVlOworICAgIH07CisKKyAgcHVibGljOgorICAgIGJvb2wgaXNJbXBsaWNpdENvbnN0KCkgY29uc3QgeworICAgICAgcmV0dXJuIEZvcm0gPT0gZHdhcmY6OkRXX0ZPUk1faW1wbGljaXRfY29uc3Q7CisgICAgfQorCisgICAgaW50NjRfdCBnZXRJbXBsaWNpdENvbnN0VmFsdWUoKSBjb25zdCB7CisgICAgICBhc3NlcnQoaXNJbXBsaWNpdENvbnN0KCkpOworICAgICAgcmV0dXJuIFZhbHVlOworICAgIH0KKworICAgIC8vLyBHZXQgdGhlIGZpeGVkIGJ5dGUgc2l6ZSBvZiB0aGlzIEZvcm0gaWYgcG9zc2libGUuIFRoaXMgZnVuY3Rpb24gbWlnaHQKKyAgICAvLy8gdXNlIHRoZSBEV0FSRlVuaXQgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBGb3JtLCBsaWtlIGZvcgorICAgIC8vLyBEV19BVF9hZGRyZXNzIGFuZCBEV19BVF9yZWZfYWRkciwgc28gdGhpcyBpc24ndCBqdXN0IGFuIGFjY2Vzc29yIGZvcgorICAgIC8vLyB0aGUgQnl0ZVNpemUgbWVtYmVyLgorICAgIE9wdGlvbmFsPGludDY0X3Q+IGdldEJ5dGVTaXplKGNvbnN0IERXQVJGVW5pdCAmVSkgY29uc3Q7CisgIH07CisgIHVzaW5nIEF0dHJpYnV0ZVNwZWNWZWN0b3IgPSBTbWFsbFZlY3RvcjxBdHRyaWJ1dGVTcGVjLCA4PjsKKworICBEV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uKCk7CisKKyAgdWludDMyX3QgZ2V0Q29kZSgpIGNvbnN0IHsgcmV0dXJuIENvZGU7IH0KKyAgdWludDhfdCBnZXRDb2RlQnl0ZVNpemUoKSBjb25zdCB7IHJldHVybiBDb2RlQnl0ZVNpemU7IH0KKyAgZHdhcmY6OlRhZyBnZXRUYWcoKSBjb25zdCB7IHJldHVybiBUYWc7IH0KKyAgYm9vbCBoYXNDaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIEhhc0NoaWxkcmVuOyB9CisKKyAgdXNpbmcgYXR0cl9pdGVyYXRvcl9yYW5nZSA9CisgICAgICBpdGVyYXRvcl9yYW5nZTxBdHRyaWJ1dGVTcGVjVmVjdG9yOjpjb25zdF9pdGVyYXRvcj47CisKKyAgYXR0cl9pdGVyYXRvcl9yYW5nZSBhdHRyaWJ1dGVzKCkgY29uc3QgeworICAgIHJldHVybiBhdHRyX2l0ZXJhdG9yX3JhbmdlKEF0dHJpYnV0ZVNwZWNzLmJlZ2luKCksIEF0dHJpYnV0ZVNwZWNzLmVuZCgpKTsKKyAgfQorCisgIGR3YXJmOjpGb3JtIGdldEZvcm1CeUluZGV4KHVpbnQzMl90IGlkeCkgY29uc3QgeworICAgIGFzc2VydChpZHggPCBBdHRyaWJ1dGVTcGVjcy5zaXplKCkpOworICAgIHJldHVybiBBdHRyaWJ1dGVTcGVjc1tpZHhdLkZvcm07CisgIH0KKworICBzaXplX3QgZ2V0TnVtQXR0cmlidXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0cmlidXRlU3BlY3Muc2l6ZSgpOworICB9CisKKyAgZHdhcmY6OkF0dHJpYnV0ZSBnZXRBdHRyQnlJbmRleCh1aW50MzJfdCBpZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaWR4IDwgQXR0cmlidXRlU3BlY3Muc2l6ZSgpKTsKKyAgICByZXR1cm4gQXR0cmlidXRlU3BlY3NbaWR4XS5BdHRyOworICB9CisKKyAgLy8vIEdldCB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUuCisgIC8vLworICAvLy8gU2VhcmNoZXMgdGhlIHRoaXMgYWJicmV2aWF0aW9uIGRlY2xhcmF0aW9uIGZvciB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZAorICAvLy8gYXR0cmlidXRlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBhdHRyIERXQVJGIGF0dHJpYnV0ZSB0byBzZWFyY2ggZm9yLgorICAvLy8gXHJldHVybnMgT3B0aW9uYWwgaW5kZXggb2YgdGhlIGF0dHJpYnV0ZSBpZiBmb3VuZCwgTm9uZSBvdGhlcndpc2UuCisgIE9wdGlvbmFsPHVpbnQzMl90PiBmaW5kQXR0cmlidXRlSW5kZXgoZHdhcmY6OkF0dHJpYnV0ZSBhdHRyKSBjb25zdDsKKworICAvLy8gRXh0cmFjdCBhIERXQVJGIGZvcm0gdmFsdWUgZnJvbSBhIERJRSBzcGVjaWZpZWQgYnkgRElFIG9mZnNldC4KKyAgLy8vCisgIC8vLyBFeHRyYWN0IGFuIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgYSBEV0FSRlVuaXQgZ2l2ZW4gdGhlIERJRSBvZmZzZXQgYW5kIHRoZQorICAvLy8gYXR0cmlidXRlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBESUVPZmZzZXQgdGhlIERJRSBvZmZzZXQgdGhhdCBwb2ludHMgdG8gdGhlIFVMRUIxMjggYWJicmV2aWF0aW9uCisgIC8vLyBjb2RlIGluIHRoZSAuZGVidWdfaW5mbyBkYXRhLgorICAvLy8gXHBhcmFtIEF0dHIgRFdBUkYgYXR0cmlidXRlIHRvIHNlYXJjaCBmb3IuCisgIC8vLyBccGFyYW0gVSB0aGUgRFdBUkZVbml0IHRoZSBjb250YWlucyB0aGUgRElFLgorICAvLy8gXHJldHVybnMgT3B0aW9uYWwgRFdBUkYgZm9ybSB2YWx1ZSBpZiB0aGUgYXR0cmlidXRlIHdhcyBleHRyYWN0ZWQuCisgIE9wdGlvbmFsPERXQVJGRm9ybVZhbHVlPiBnZXRBdHRyaWJ1dGVWYWx1ZShjb25zdCB1aW50MzJfdCBESUVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkd2FyZjo6QXR0cmlidXRlIEF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEV0FSRlVuaXQgJlUpIGNvbnN0OworCisgIGJvb2wgZXh0cmFjdChEYXRhRXh0cmFjdG9yIERhdGEsIHVpbnQzMl90KiBPZmZzZXRQdHIpOworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLyBSZXR1cm4gYW4gb3B0aW9uYWwgYnl0ZSBzaXplIG9mIGFsbCBhdHRyaWJ1dGUgZGF0YSBpbiB0aGlzIGFiYnJldmlhdGlvbgorICAvLyBpZiBhIGNvbnN0YW50IGJ5dGUgc2l6ZSBjYW4gYmUgY2FsY3VsYXRlZCBnaXZlbiBhIERXQVJGVW5pdC4gVGhpcyBhbGxvd3MKKyAgLy8gRFdBUkYgcGFyc2luZyB0byBiZSBmYXN0ZXIgYXMgbWFueSBEV0FSRiBESUVzIGhhdmUgYSBmaXhlZCBieXRlIHNpemUuCisgIE9wdGlvbmFsPHNpemVfdD4gZ2V0Rml4ZWRBdHRyaWJ1dGVzQnl0ZVNpemUoY29uc3QgRFdBUkZVbml0ICZVKSBjb25zdDsKKworcHJpdmF0ZToKKyAgdm9pZCBjbGVhcigpOworCisgIC8vLyBBIGhlbHBlciBzdHJ1Y3R1cmUgdGhhdCBjYW4gcXVpY2tseSBkZXRlcm1pbmUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4KKyAgLy8vIGFiYnJldmlhdGlvbiBkZWNsYXJhdGlvbi4KKyAgc3RydWN0IEZpeGVkU2l6ZUluZm8geworICAgIC8vLyBUaGUgZml4ZWQgYnl0ZSBzaXplIGZvciBmaXhlZCBzaXplIGZvcm1zLgorICAgIHVpbnQxNl90IE51bUJ5dGVzID0gMDsKKyAgICAvLy8gTnVtYmVyIG9mIERXX0ZPUk1fYWRkcmVzcyBmb3JtcyBpbiB0aGlzIGFiYnJldmF0aW9uIGRlY2xhcmF0aW9uLgorICAgIHVpbnQ4X3QgTnVtQWRkcnMgPSAwOworICAgIC8vLyBOdW1iZXIgb2YgRFdfRk9STV9yZWZfYWRkciBmb3JtcyBpbiB0aGlzIGFiYnJldmF0aW9uIGRlY2xhcmF0aW9uLgorICAgIHVpbnQ4X3QgTnVtUmVmQWRkcnMgPSAwOworICAgIC8vLyBOdW1iZXIgb2YgNCBieXRlIGluIERXQVJGMzIgYW5kIDggYnl0ZSBpbiBEV0FSRjY0IGZvcm1zLgorICAgIHVpbnQ4X3QgTnVtRHdhcmZPZmZzZXRzID0gMDsKKworICAgIEZpeGVkU2l6ZUluZm8oKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gQ2FsY3VsYXRlIHRoZSBmaXhlZCBzaXplIGluIGJ5dGVzIGdpdmVuIGEgRFdBUkZVbml0LgorICAgIC8vLworICAgIC8vLyBccGFyYW0gVSB0aGUgRFdBUkZVbml0IHRvIHVzZSB3aGVuIGRldGVybWluZyB0aGUgYnl0ZSBzaXplLgorICAgIC8vLyBccmV0dXJucyB0aGUgc2l6ZSBpbiBieXRlcyBmb3IgYWxsIGF0dHJpYnV0ZSBkYXRhIGluIHRoaXMgYWJicmV2aWF0aW9uLgorICAgIC8vLyBUaGUgcmV0dXJuZWQgc2l6ZSBkb2VzIG5vdCBpbmNsdWRlIGJ5dGVzIGZvciB0aGUgIFVMRUIxMjggYWJicmV2aWF0aW9uCisgICAgLy8vIGNvZGUKKyAgICBzaXplX3QgZ2V0Qnl0ZVNpemUoY29uc3QgRFdBUkZVbml0ICZVKSBjb25zdDsKKyAgfTsKKworICB1aW50MzJfdCBDb2RlOworICBkd2FyZjo6VGFnIFRhZzsKKyAgdWludDhfdCBDb2RlQnl0ZVNpemU7CisgIGJvb2wgSGFzQ2hpbGRyZW47CisgIEF0dHJpYnV0ZVNwZWNWZWN0b3IgQXR0cmlidXRlU3BlY3M7CisgIC8vLyBJZiB0aGlzIGFiYnJldmlhdGlvbiBoYXMgYSBmaXhlZCBieXRlIHNpemUgdGhlbiBGaXhlZEF0dHJpYnV0ZVNpemUgbWVtYmVyCisgIC8vLyB2YXJpYWJsZSBiZWxvdyB3aWxsIGhhdmUgYSB2YWx1ZS4KKyAgT3B0aW9uYWw8Rml4ZWRTaXplSW5mbz4gRml4ZWRBdHRyaWJ1dGVTaXplOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGQUJCUkVWSUFUSU9OREVDTEFSQVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZBY2NlbGVyYXRvclRhYmxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkFjY2VsZXJhdG9yVGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2YxMWNhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZBY2NlbGVyYXRvclRhYmxlLmgKQEAgLTAsMCArMSw1MTAgQEAKKy8vPT09LSBEV0FSRkFjY2VsZXJhdG9yVGFibGUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZBQ0NFTEVSQVRPUlRBQkxFX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZBQ0NFTEVSQVRPUlRBQkxFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGF0YUV4dHJhY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRm9ybVZhbHVlLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgU2NvcGVkUHJpbnRlcjsKKworLy8vIFRoZSBhY2NlbGVyYXRvciB0YWJsZXMgYXJlIGRlc2lnbmVkIHRvIGFsbG93IGVmZmljaWVudCByYW5kb20gYWNjZXNzCisvLy8gKHVzaW5nIGEgc3ltYm9sIG5hbWUgYXMgYSBrZXkpIGludG8gZGVidWcgaW5mbyBieSBwcm92aWRpbmcgYW4gaW5kZXggb2YgdGhlCisvLy8gZGVidWcgaW5mbyBESUVzLiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGNvbW1vbiBmdW5jdGlvbmFsaXR5IG9mIEFwcGxlIGFuZAorLy8vIERXQVJGIDUgYWNjZWxlcmF0b3IgdGFibGVzLgorLy8vIFRPRE86IEdlbmVyYWxpemUgdGhlIHJlc3Qgb2YgdGhlIEFwcGxlQWNjZWxlcmF0b3JUYWJsZSBpbnRlcmZhY2UgYW5kIG1vdmUgaXQKKy8vLyB0byB0aGlzIGNsYXNzLgorY2xhc3MgRFdBUkZBY2NlbGVyYXRvclRhYmxlIHsKK3Byb3RlY3RlZDoKKyAgRFdBUkZEYXRhRXh0cmFjdG9yIEFjY2VsU2VjdGlvbjsKKyAgRGF0YUV4dHJhY3RvciBTdHJpbmdTZWN0aW9uOworCitwdWJsaWM6CisgIC8vLyBBbiBhYnN0cmFjdCBjbGFzcyByZXByZXNlbnRpbmcgYSBzaW5nbGUgZW50cnkgaW4gdGhlIGFjY2VsZXJhdG9yIHRhYmxlcy4KKyAgY2xhc3MgRW50cnkgeworICBwcm90ZWN0ZWQ6CisgICAgU21hbGxWZWN0b3I8RFdBUkZGb3JtVmFsdWUsIDM+IFZhbHVlczsKKworICAgIEVudHJ5KCkgPSBkZWZhdWx0OworCisgICAgLy8gTWFrZSB0aGVzZSBwcm90ZWN0ZWQgc28gb25seSAoZmluYWwpIHN1YmNsYXNzZXMgY2FuIGJlIGNvcGllZCBhcm91bmQuCisgICAgRW50cnkoY29uc3QgRW50cnkgJikgPSBkZWZhdWx0OworICAgIEVudHJ5KEVudHJ5ICYmKSA9IGRlZmF1bHQ7CisgICAgRW50cnkgJm9wZXJhdG9yPShjb25zdCBFbnRyeSAmKSA9IGRlZmF1bHQ7CisgICAgRW50cnkgJm9wZXJhdG9yPShFbnRyeSAmJikgPSBkZWZhdWx0OworICAgIH5FbnRyeSgpID0gZGVmYXVsdDsKKworCisgIHB1YmxpYzoKKyAgICAvLy8gUmV0dXJucyB0aGUgT2Zmc2V0IG9mIHRoZSBDb21waWxhdGlvbiBVbml0IGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgLy8vIEFjY2VsZXJhdG9yIEVudHJ5IG9yIE5vbmUgaWYgdGhlIENvbXBpbGF0aW9uIFVuaXQgb2Zmc2V0IGlzIG5vdCByZWNvcmRlZAorICAgIC8vLyBpbiB0aGlzIEFjY2VsZXJhdG9yIEVudHJ5LgorICAgIHZpcnR1YWwgT3B0aW9uYWw8dWludDY0X3Q+IGdldENVT2Zmc2V0KCkgY29uc3QgPSAwOworCisgICAgLy8vIFJldHVybnMgdGhlIFNlY3Rpb24gT2Zmc2V0IG9mIHRoZSBEZWJ1ZyBJbmZvIEVudHJ5IGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgLy8vIEFjY2VsZXJhdG9yIEVudHJ5IG9yIE5vbmUgaWYgdGhlIERJRSBvZmZzZXQgaXMgbm90IHJlY29yZGVkIGluIHRoaXMKKyAgICAvLy8gQWNjZWxlcmF0b3IgRW50cnkuIFRoZSByZXR1cm5lZCBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZQorICAgIC8vLyBTZWN0aW9uIGNvbnRhaW5pbmcgdGhlIERJRS4KKyAgICB2aXJ0dWFsIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRESUVTZWN0aW9uT2Zmc2V0KCkgY29uc3QgPSAwOworCisgICAgLy8vIFJldHVybnMgdGhlIFRhZyBvZiB0aGUgRGVidWcgSW5mbyBFbnRyeSBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgIC8vLyBBY2NlbGVyYXRvciBFbnRyeSBvciBOb25lIGlmIHRoZSBUYWcgaXMgbm90IHJlY29yZGVkIGluIHRoaXMKKyAgICAvLy8gQWNjZWxlcmF0b3IgRW50cnkuCisgICAgdmlydHVhbCBPcHRpb25hbDxkd2FyZjo6VGFnPiBnZXRUYWcoKSBjb25zdCA9IDA7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgcmF3IHZhbHVlcyBvZiBmaWVsZHMgaW4gdGhlIEFjY2VsZXJhdG9yIEVudHJ5LiBJbiBnZW5lcmFsLAorICAgIC8vLyB0aGVzZSBjYW4gb25seSBiZSBpbnRlcnByZXRlZCB3aXRoIHRoZSBoZWxwIG9mIHRoZSBtZXRhZGF0YSBpbiB0aGUKKyAgICAvLy8gb3duaW5nIEFjY2VsZXJhdG9yIFRhYmxlLgorICAgIEFycmF5UmVmPERXQVJGRm9ybVZhbHVlPiBnZXRWYWx1ZXMoKSBjb25zdCB7IHJldHVybiBWYWx1ZXM7IH0KKyAgfTsKKworICBEV0FSRkFjY2VsZXJhdG9yVGFibGUoY29uc3QgRFdBUkZEYXRhRXh0cmFjdG9yICZBY2NlbFNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBEYXRhRXh0cmFjdG9yIFN0cmluZ1NlY3Rpb24pCisgICAgICA6IEFjY2VsU2VjdGlvbihBY2NlbFNlY3Rpb24pLCBTdHJpbmdTZWN0aW9uKFN0cmluZ1NlY3Rpb24pIHt9CisgIHZpcnR1YWwgfkRXQVJGQWNjZWxlcmF0b3JUYWJsZSgpOworCisgIHZpcnR1YWwgbGx2bTo6RXJyb3IgZXh0cmFjdCgpID0gMDsKKyAgdmlydHVhbCB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdCA9IDA7CisKKyAgRFdBUkZBY2NlbGVyYXRvclRhYmxlKGNvbnN0IERXQVJGQWNjZWxlcmF0b3JUYWJsZSAmKSA9IGRlbGV0ZTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgRFdBUkZBY2NlbGVyYXRvclRhYmxlICYpID0gZGVsZXRlOworfTsKKworLy8vIFRoaXMgaW1wbGVtZW50cyB0aGUgQXBwbGUgYWNjZWxlcmF0b3IgdGFibGUgZm9ybWF0LCBhIHByZWN1cnNvciBvZiB0aGUKKy8vLyBEV0FSRiA1IGFjY2VsZXJhdG9yIHRhYmxlIGZvcm1hdC4KK2NsYXNzIEFwcGxlQWNjZWxlcmF0b3JUYWJsZSA6IHB1YmxpYyBEV0FSRkFjY2VsZXJhdG9yVGFibGUgeworICBzdHJ1Y3QgSGVhZGVyIHsKKyAgICB1aW50MzJfdCBNYWdpYzsKKyAgICB1aW50MTZfdCBWZXJzaW9uOworICAgIHVpbnQxNl90IEhhc2hGdW5jdGlvbjsKKyAgICB1aW50MzJfdCBCdWNrZXRDb3VudDsKKyAgICB1aW50MzJfdCBIYXNoQ291bnQ7CisgICAgdWludDMyX3QgSGVhZGVyRGF0YUxlbmd0aDsKKworICAgIHZvaWQgZHVtcChTY29wZWRQcmludGVyICZXKSBjb25zdDsKKyAgfTsKKworICBzdHJ1Y3QgSGVhZGVyRGF0YSB7CisgICAgdXNpbmcgQXRvbVR5cGUgPSB1aW50MTZfdDsKKyAgICB1c2luZyBGb3JtID0gZHdhcmY6OkZvcm07CisKKyAgICB1aW50MzJfdCBESUVPZmZzZXRCYXNlOworICAgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxBdG9tVHlwZSwgRm9ybT4sIDM+IEF0b21zOworCisgICAgT3B0aW9uYWw8dWludDY0X3Q+IGV4dHJhY3RPZmZzZXQoT3B0aW9uYWw8RFdBUkZGb3JtVmFsdWU+IFZhbHVlKSBjb25zdDsKKyAgfTsKKworICBzdHJ1Y3QgSGVhZGVyIEhkcjsKKyAgc3RydWN0IEhlYWRlckRhdGEgSGRyRGF0YTsKKyAgYm9vbCBJc1ZhbGlkID0gZmFsc2U7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB3ZSBzaG91bGQgY29udGludWUgc2Nhbm5pbmcgZm9yIGVudHJpZXMgb3IgZmFsc2UgaWYgd2UndmUKKyAgLy8vIHJlYWNoZWQgdGhlIGxhc3QgKHNlbnRpbmVsKSBlbnRyeSBvZiBlbmNvdW50ZXJlZCBhIHBhcnNpbmcgZXJyb3IuCisgIGJvb2wgZHVtcE5hbWUoU2NvcGVkUHJpbnRlciAmVywgU21hbGxWZWN0b3JJbXBsPERXQVJGRm9ybVZhbHVlPiAmQXRvbUZvcm1zLAorICAgICAgICAgICAgICAgIHVpbnQzMl90ICpEYXRhT2Zmc2V0KSBjb25zdDsKKworcHVibGljOgorICAvLy8gQXBwbGUtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgYW4gQWNjZWxlcmF0b3IgRW50cnkuCisgIGNsYXNzIEVudHJ5IGZpbmFsIDogcHVibGljIERXQVJGQWNjZWxlcmF0b3JUYWJsZTo6RW50cnkgeworICAgIGNvbnN0IEhlYWRlckRhdGEgKkhkckRhdGEgPSBudWxscHRyOworCisgICAgRW50cnkoY29uc3QgSGVhZGVyRGF0YSAmRGF0YSk7CisgICAgRW50cnkoKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGV4dHJhY3QoY29uc3QgQXBwbGVBY2NlbGVyYXRvclRhYmxlICZBY2NlbFRhYmxlLCB1aW50MzJfdCAqT2Zmc2V0KTsKKworICBwdWJsaWM6CisgICAgT3B0aW9uYWw8dWludDY0X3Q+IGdldENVT2Zmc2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgT3B0aW9uYWw8dWludDY0X3Q+IGdldERJRVNlY3Rpb25PZmZzZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgICBPcHRpb25hbDxkd2FyZjo6VGFnPiBnZXRUYWcoKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgQXRvbSBpbiB0aGlzIEFjY2VsZXJhdG9yIEVudHJ5LCBpZiB0aGUgRW50cnkKKyAgICAvLy8gY29udGFpbnMgc3VjaCBBdG9tLgorICAgIE9wdGlvbmFsPERXQVJGRm9ybVZhbHVlPiBsb29rdXAoSGVhZGVyRGF0YTo6QXRvbVR5cGUgQXRvbSkgY29uc3Q7CisKKyAgICBmcmllbmQgY2xhc3MgQXBwbGVBY2NlbGVyYXRvclRhYmxlOworICAgIGZyaWVuZCBjbGFzcyBWYWx1ZUl0ZXJhdG9yOworICB9OworCisgIGNsYXNzIFZhbHVlSXRlcmF0b3IgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZywgRW50cnk+IHsKKyAgICBjb25zdCBBcHBsZUFjY2VsZXJhdG9yVGFibGUgKkFjY2VsVGFibGUgPSBudWxscHRyOworICAgIEVudHJ5IEN1cnJlbnQ7ICAgICAgICAgICAvLy88IFRoZSBjdXJyZW50IGVudHJ5LgorICAgIHVuc2lnbmVkIERhdGFPZmZzZXQgPSAwOyAvLy88IE9mZnNldCBpbnRvIHRoZSBzZWN0aW9uLgorICAgIHVuc2lnbmVkIERhdGEgPSAwOyAvLy88IEN1cnJlbnQgZGF0YSBlbnRyeS4KKyAgICB1bnNpZ25lZCBOdW1EYXRhID0gMDsgLy8vPCBOdW1iZXIgb2YgZGF0YSBlbnRyaWVzLgorCisgICAgLy8vIEFkdmFuY2UgdGhlIGl0ZXJhdG9yLgorICAgIHZvaWQgTmV4dCgpOworICBwdWJsaWM6CisgICAgLy8vIENvbnN0cnVjdCBhIG5ldyBpdGVyYXRvciBmb3IgdGhlIGVudHJpZXMgYXQgXHAgRGF0YU9mZnNldC4KKyAgICBWYWx1ZUl0ZXJhdG9yKGNvbnN0IEFwcGxlQWNjZWxlcmF0b3JUYWJsZSAmQWNjZWxUYWJsZSwgdW5zaWduZWQgRGF0YU9mZnNldCk7CisgICAgLy8vIEVuZCBtYXJrZXIuCisgICAgVmFsdWVJdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgIGNvbnN0IEVudHJ5ICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBDdXJyZW50OyB9CisgICAgVmFsdWVJdGVyYXRvciAmb3BlcmF0b3IrKygpIHsgTmV4dCgpOyByZXR1cm4gKnRoaXM7IH0KKyAgICBWYWx1ZUl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CisgICAgICBWYWx1ZUl0ZXJhdG9yIEkgPSAqdGhpczsKKyAgICAgIE5leHQoKTsKKyAgICAgIHJldHVybiBJOworICAgIH0KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZhbHVlSXRlcmF0b3IgJkEsIGNvbnN0IFZhbHVlSXRlcmF0b3IgJkIpIHsKKyAgICAgIHJldHVybiBBLk51bURhdGEgPT0gQi5OdW1EYXRhICYmIEEuRGF0YU9mZnNldCA9PSBCLkRhdGFPZmZzZXQ7CisgICAgfQorICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgVmFsdWVJdGVyYXRvciAmQSwgY29uc3QgVmFsdWVJdGVyYXRvciAmQikgeworICAgICAgcmV0dXJuICEoQSA9PSBCKTsKKyAgICB9CisgIH07CisKKyAgQXBwbGVBY2NlbGVyYXRvclRhYmxlKGNvbnN0IERXQVJGRGF0YUV4dHJhY3RvciAmQWNjZWxTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUV4dHJhY3RvciBTdHJpbmdTZWN0aW9uKQorICAgICAgOiBEV0FSRkFjY2VsZXJhdG9yVGFibGUoQWNjZWxTZWN0aW9uLCBTdHJpbmdTZWN0aW9uKSB7fQorCisgIGxsdm06OkVycm9yIGV4dHJhY3QoKSBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TnVtQnVja2V0cygpOworICB1aW50MzJfdCBnZXROdW1IYXNoZXMoKTsKKyAgdWludDMyX3QgZ2V0U2l6ZUhkcigpOworICB1aW50MzJfdCBnZXRIZWFkZXJEYXRhTGVuZ3RoKCk7CisKKyAgLy8vIFJldHVybiB0aGUgQXRvbSBkZXNjcmlwdGlvbiwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW50ZXJwcmV0IHRoZSByYXcgdmFsdWVzCisgIC8vLyBvZiB0aGUgQWNjZWxlcmF0b3IgRW50cmllcyBpbiB0aGlzIHRhYmxlLgorICBBcnJheVJlZjxzdGQ6OnBhaXI8SGVhZGVyRGF0YTo6QXRvbVR5cGUsIEhlYWRlckRhdGE6OkZvcm0+PiBnZXRBdG9tc0Rlc2MoKTsKKyAgYm9vbCB2YWxpZGF0ZUZvcm1zKCk7CisKKyAgLy8vIFJldHVybiBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBEV0FSRiBESUUgd2UncmUgbG9va2luZyBmb3Igd2hlbgorICAvLy8gcGVyZm9ybWluZyBhIGxvb2t1cCBieSBuYW1lLgorICAvLy8KKyAgLy8vIFxwYXJhbSBIYXNoRGF0YU9mZnNldCBhbiBvZmZzZXQgaW50byB0aGUgaGFzaCBkYXRhIHRhYmxlCisgIC8vLyBccmV0dXJucyA8RGllT2Zmc2V0LCBEaWVUYWc+CisgIC8vLyBEaWVPZmZzZXQgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uIGZvciB0aGUgRElFCisgIC8vLyByZWxhdGVkIHRvIHRoZSBpbnB1dCBoYXNoIGRhdGEgb2Zmc2V0LgorICAvLy8gRGllVGFnIGlzIHRoZSB0YWcgb2YgdGhlIERJRQorICBzdGQ6OnBhaXI8dWludDMyX3QsIGR3YXJmOjpUYWc+IHJlYWRBdG9tcyh1aW50MzJfdCAmSGFzaERhdGFPZmZzZXQpOworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gTG9vayB1cCBhbGwgZW50cmllcyBpbiB0aGUgYWNjZWxlcmF0b3IgdGFibGUgbWF0Y2hpbmcgXGMgS2V5LgorICBpdGVyYXRvcl9yYW5nZTxWYWx1ZUl0ZXJhdG9yPiBlcXVhbF9yYW5nZShTdHJpbmdSZWYgS2V5KSBjb25zdDsKK307CisKKy8vLyAuZGVidWdfbmFtZXMgc2VjdGlvbiBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSB1bml0cy4gRWFjaCB1bml0IHN0YXJ0cyB3aXRoIGEKKy8vLyBoZWFkZXIsIHdoaWNoIGlzIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiBjb21waWxhdGlvbiB1bml0cywgbG9jYWwgYW5kIGZvcmVpZ24KKy8vLyB0eXBlIHVuaXRzLgorLy8vCisvLy8gVGhlc2UgbWF5IGJlIGZvbGxvd2VkIGJ5IGFuIChvcHRpb25hbCkgaGFzaCBsb29rdXAgdGFibGUsIHdoaWNoIGNvbnNpc3RzIG9mCisvLy8gYW4gYXJyYXkgb2YgYnVja2V0cyBhbmQgaGFzaGVzIHNpbWlsYXIgdG8gdGhlIGFwcGxlIHRhYmxlcyBhYm92ZS4gVGhlIG9ubHkKKy8vLyBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIGhhc2hlcyBhcnJheSBpcyAxLWJhc2VkLCBhbmQgY29uc2VxdWVudGx5IGFuIGVtcHR5CisvLy8gYnVja2V0IGlzIGRlbm90ZWQgYnkgMCBhbmQgbm90IFVJTlQzMl9NQVguCisvLy8KKy8vLyBOZXh0IGlzIHRoZSBuYW1lIHRhYmxlLCB3aGljaCBjb25zaXN0cyBvZiBhbiBhcnJheSBvZiBuYW1lcyBhbmQgYXJyYXkgb2YKKy8vLyBlbnRyeSBvZmZzZXRzLiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBhcHBsZSB0YWJsZXMsIHdoaWNoIHN0b3JlIG5hbWVzCisvLy8gbmV4dCB0byB0aGUgYWN0dWFsIGVudHJpZXMuCisvLy8KKy8vLyBUaGUgc3RydWN0dXJlIG9mIHRoZSBlbnRyaWVzIGlzIGRlc2NyaWJlZCBieSBhbiBhYmJyZXZpYXRpb25zIHRhYmxlLCB3aGljaAorLy8vIGNvbWVzIGFmdGVyIHRoZSBuYW1lIHRhYmxlLiBVbmxpa2UgdGhlIGFwcGxlIHRhYmxlcywgd2hpY2ggaGF2ZSBhIHVuaWZvcm0KKy8vLyBlbnRyeSBzdHJ1Y3R1cmUgZGVzY3JpYmVkIGluIHRoZSBoZWFkZXIsIGVhY2ggLmRlYnVnX25hbWVzIGVudHJ5IG1heSBoYXZlCisvLy8gZGlmZmVyZW50IGluZGV4IGF0dHJpYnV0ZXMgKERXX0lEWF8/Pz8pIGF0dGFjaGVkIHRvIGl0LgorLy8vCisvLy8gVGhlIGxhc3Qgc2VnbWVudCBjb25zaXN0cyBvZiBhIGxpc3Qgb2YgZW50cmllcywgd2hpY2ggaXMgYSAwLXRlcm1pbmF0ZWQgbGlzdAorLy8vIHJlZmVyZW5jZWQgYnkgdGhlIG5hbWUgdGFibGUgYW5kIGludGVycHJldGVkIHdpdGggdGhlIGhlbHAgb2YgdGhlCisvLy8gYWJicmV2aWF0aW9uIHRhYmxlLgorY2xhc3MgRFdBUkZEZWJ1Z05hbWVzIDogcHVibGljIERXQVJGQWNjZWxlcmF0b3JUYWJsZSB7CisgIC8vLyBUaGUgZml4ZWQtc2l6ZSBwYXJ0IG9mIGEgRHdhcmYgNSBOYW1lIEluZGV4IGhlYWRlcgorICBzdHJ1Y3QgSGVhZGVyUE9EIHsKKyAgICB1aW50MzJfdCBVbml0TGVuZ3RoOworICAgIHVpbnQxNl90IFZlcnNpb247CisgICAgdWludDE2X3QgUGFkZGluZzsKKyAgICB1aW50MzJfdCBDb21wVW5pdENvdW50OworICAgIHVpbnQzMl90IExvY2FsVHlwZVVuaXRDb3VudDsKKyAgICB1aW50MzJfdCBGb3JlaWduVHlwZVVuaXRDb3VudDsKKyAgICB1aW50MzJfdCBCdWNrZXRDb3VudDsKKyAgICB1aW50MzJfdCBOYW1lQ291bnQ7CisgICAgdWludDMyX3QgQWJicmV2VGFibGVTaXplOworICAgIHVpbnQzMl90IEF1Z21lbnRhdGlvblN0cmluZ1NpemU7CisgIH07CisKK3B1YmxpYzoKKyAgY2xhc3MgTmFtZUluZGV4OworICBjbGFzcyBWYWx1ZUl0ZXJhdG9yOworCisgIC8vLyBEd2FyZiA1IE5hbWUgSW5kZXggaGVhZGVyLgorICBzdHJ1Y3QgSGVhZGVyIDogcHVibGljIEhlYWRlclBPRCB7CisgICAgU21hbGxTdHJpbmc8OD4gQXVnbWVudGF0aW9uU3RyaW5nOworCisgICAgRXJyb3IgZXh0cmFjdChjb25zdCBEV0FSRkRhdGFFeHRyYWN0b3IgJkFTLCB1aW50MzJfdCAqT2Zmc2V0KTsKKyAgICB2b2lkIGR1bXAoU2NvcGVkUHJpbnRlciAmVykgY29uc3Q7CisgIH07CisKKyAgLy8vIEluZGV4IGF0dHJpYnV0ZSBhbmQgaXRzIGVuY29kaW5nLgorICBzdHJ1Y3QgQXR0cmlidXRlRW5jb2RpbmcgeworICAgIGR3YXJmOjpJbmRleCBJbmRleDsKKyAgICBkd2FyZjo6Rm9ybSBGb3JtOworCisgICAgY29uc3RleHByIEF0dHJpYnV0ZUVuY29kaW5nKGR3YXJmOjpJbmRleCBJbmRleCwgZHdhcmY6OkZvcm0gRm9ybSkKKyAgICAgICAgOiBJbmRleChJbmRleCksIEZvcm0oRm9ybSkge30KKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgQXR0cmlidXRlRW5jb2RpbmcgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUVuY29kaW5nICZSSFMpIHsKKyAgICAgIHJldHVybiBMSFMuSW5kZXggPT0gUkhTLkluZGV4ICYmIExIUy5Gb3JtID09IFJIUy5Gb3JtOworICAgIH0KKyAgfTsKKworICAvLy8gQWJicmV2aWF0aW9uIGRlc2NyaWJpbmcgdGhlIGVuY29kaW5nIG9mIE5hbWUgSW5kZXggZW50cmllcy4KKyAgc3RydWN0IEFiYnJldiB7CisgICAgdWludDMyX3QgQ29kZTsgIC8vLzwgQWJicmV2aWF0aW9uIGNvZGUKKyAgICBkd2FyZjo6VGFnIFRhZzsgLy8vPCBEd2FyZiBUYWcgb2YgdGhlIGRlc2NyaWJlZCBlbnRpdHkuCisgICAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlRW5jb2Rpbmc+IEF0dHJpYnV0ZXM7IC8vLzwgTGlzdCBvZiBpbmRleCBhdHRyaWJ1dGVzLgorCisgICAgQWJicmV2KHVpbnQzMl90IENvZGUsIGR3YXJmOjpUYWcgVGFnLAorICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGVFbmNvZGluZz4gQXR0cmlidXRlcykKKyAgICAgICAgOiBDb2RlKENvZGUpLCBUYWcoVGFnKSwgQXR0cmlidXRlcyhzdGQ6Om1vdmUoQXR0cmlidXRlcykpIHt9CisKKyAgICB2b2lkIGR1bXAoU2NvcGVkUHJpbnRlciAmVykgY29uc3Q7CisgIH07CisKKyAgLy8vIERXQVJGIHY1LXNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIGFuIEFjY2VsZXJhdG9yIEVudHJ5LgorICBjbGFzcyBFbnRyeSBmaW5hbCA6IHB1YmxpYyBEV0FSRkFjY2VsZXJhdG9yVGFibGU6OkVudHJ5IHsKKyAgICBjb25zdCBOYW1lSW5kZXggKk5hbWVJZHg7CisgICAgY29uc3QgQWJicmV2ICpBYmJyOworCisgICAgRW50cnkoY29uc3QgTmFtZUluZGV4ICZOYW1lSWR4LCBjb25zdCBBYmJyZXYgJkFiYnIpOworCisgICAgLy8vIFJldHVybnMgdGhlIEluZGV4IGludG8gdGhlIENvbXBpbGF0aW9uIFVuaXQgbGlzdCBvZiB0aGUgb3duaW5nIE5hbWUKKyAgICAvLy8gSW5kZXggb3IgTm9uZSBpZiB0aGlzIEFjY2VsZXJhdG9yIEVudHJ5IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZAorICAgIC8vLyBDb21waWxhdGlvbiBVbml0LiBJdCBpcyB1cCB0byB0aGUgdXNlciB0byB2ZXJpZnkgdGhhdCB0aGUgcmV0dXJuZWQgSW5kZXgKKyAgICAvLy8gaXMgdmFsaWQgaW4gdGhlIG93bmluZyBOYW1lSW5kZXggKG9yIHVzZSBnZXRDVU9mZnNldCgpLCB3aGljaCB3aWxsCisgICAgLy8vIGhhbmRsZSB0aGF0IGNoZWNrIGl0c2VsZikuIE5vdGUgdGhhdCBlbnRyaWVzIGluIE5hbWVJbmRleGVzIHdoaWNoIGluZGV4CisgICAgLy8vIGp1c3QgYSBzaW5nbGUgQ29tcGlsYXRpb24gVW5pdCBhcmUgaW1wbGljaXRseSBhc3NvY2lhdGVkIHdpdGggdGhhdCB1bml0LAorICAgIC8vLyBzbyB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDAgZXZlbiB3aXRob3V0IGFuIGV4cGxpY2l0CisgICAgLy8vIERXX0lEWF9jb21waWxlX3VuaXQgYXR0cmlidXRlLgorICAgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRDVUluZGV4KCkgY29uc3Q7CisKKyAgcHVibGljOgorICAgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRDVU9mZnNldCgpIGNvbnN0IG92ZXJyaWRlOworICAgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRESUVTZWN0aW9uT2Zmc2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgT3B0aW9uYWw8ZHdhcmY6OlRhZz4gZ2V0VGFnKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdGFnKCk7IH0KKworICAgIC8vLyAuZGVidWdfbmFtZXMtc3BlY2lmaWMgZ2V0dGVyLCB3aGljaCBhbHdheXMgc3VjY2VlZHMgKERXQVJGIHY1IGluZGV4CisgICAgLy8vIGVudHJpZXMgYWx3YXlzIGhhdmUgYSB0YWcpLgorICAgIGR3YXJmOjpUYWcgdGFnKCkgY29uc3QgeyByZXR1cm4gQWJici0+VGFnOyB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgT2Zmc2V0IG9mIHRoZSBESUUgd2l0aGluIHRoZSBjb250YWluaW5nIENVIG9yIFRVLgorICAgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRESUVVbml0T2Zmc2V0KCkgY29uc3Q7CisKKyAgICAvLy8gUmV0dXJuIHRoZSBBYmJyZXZpYXRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBpbnRlcnByZXQgdGhlIHJhdyB2YWx1ZXMgb2YKKyAgICAvLy8gdGhpcyBBY2NlbGVyYXRvciBFbnRyeS4KKyAgICBjb25zdCBBYmJyZXYgJmdldEFiYnJldigpIGNvbnN0IHsgcmV0dXJuICpBYmJyOyB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIEluZGV4IEF0dHJpYnV0ZSBpbiB0aGlzIEFjY2VsZXJhdG9yIEVudHJ5LCBpZgorICAgIC8vLyB0aGUgRW50cnkgY29udGFpbnMgc3VjaCBBdHRyaWJ1dGUuCisgICAgT3B0aW9uYWw8RFdBUkZGb3JtVmFsdWU+IGxvb2t1cChkd2FyZjo6SW5kZXggSW5kZXgpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKFNjb3BlZFByaW50ZXIgJlcpIGNvbnN0OworCisgICAgZnJpZW5kIGNsYXNzIE5hbWVJbmRleDsKKyAgICBmcmllbmQgY2xhc3MgVmFsdWVJdGVyYXRvcjsKKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIEVycm9yIHJldHVybmVkIGJ5IE5hbWVJbmRleDo6Z2V0RW50cnkgdG8gcmVwb3J0IGl0IGhhcyByZWFjaGVkIHRoZSBlbmQgb2YKKyAgLy8vIHRoZSBlbnRyeSBsaXN0LgorICBjbGFzcyBTZW50aW5lbEVycm9yIDogcHVibGljIEVycm9ySW5mbzxTZW50aW5lbEVycm9yPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsKKworICAgIHZvaWQgbG9nKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgeyBPUyA8PCAiU2VudGluZWwiOyB9CisgICAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworICB9OworCisgIC8vLyBEZW5zZU1hcEluZm8gZm9yIHN0cnVjdCBBYmJyZXYuCisgIHN0cnVjdCBBYmJyZXZNYXBJbmZvIHsKKyAgICBzdGF0aWMgQWJicmV2IGdldEVtcHR5S2V5KCk7CisgICAgc3RhdGljIEFiYnJldiBnZXRUb21ic3RvbmVLZXkoKTsKKyAgICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKHVpbnQzMl90IENvZGUpIHsKKyAgICAgIHJldHVybiBEZW5zZU1hcEluZm88dWludDMyX3Q+OjpnZXRIYXNoVmFsdWUoQ29kZSk7CisgICAgfQorICAgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgQWJicmV2ICZBYmJyKSB7CisgICAgICByZXR1cm4gZ2V0SGFzaFZhbHVlKEFiYnIuQ29kZSk7CisgICAgfQorICAgIHN0YXRpYyBib29sIGlzRXF1YWwodWludDMyX3QgTEhTLCBjb25zdCBBYmJyZXYgJlJIUykgeworICAgICAgcmV0dXJuIExIUyA9PSBSSFMuQ29kZTsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBBYmJyZXYgJkxIUywgY29uc3QgQWJicmV2ICZSSFMpIHsKKyAgICAgIHJldHVybiBMSFMuQ29kZSA9PSBSSFMuQ29kZTsKKyAgICB9CisgIH07CisKK3B1YmxpYzoKKyAgLy8vIEEgc2luZ2xlIGVudHJ5IGluIHRoZSBOYW1lIFRhYmxlIChEd2FyZiA1IHNlY3QuIDYuMS4xLjQuNikgb2YgdGhlIE5hbWUKKyAgLy8vIEluZGV4LgorICBzdHJ1Y3QgTmFtZVRhYmxlRW50cnkgeworICAgIHVpbnQzMl90IFN0cmluZ09mZnNldDsgLy8vPCBPZmZzZXQgb2YgdGhlIG5hbWUgb2YgdGhlIGRlc2NyaWJlZCBlbnRpdGllcy4KKyAgICB1aW50MzJfdCBFbnRyeU9mZnNldDsgIC8vLzwgT2Zmc2V0IG9mIHRoZSBmaXJzdCBFbnRyeSBpbiB0aGUgbGlzdC4KKyAgfTsKKworICAvLy8gUmVwcmVzZW50cyBhIHNpbmdsZSBhY2NlbGVyYXRvciB0YWJsZSB3aXRoaW4gdGhlIER3YXJmIDUgLmRlYnVnX25hbWVzCisgIC8vLyBzZWN0aW9uLgorICBjbGFzcyBOYW1lSW5kZXggeworICAgIERlbnNlU2V0PEFiYnJldiwgQWJicmV2TWFwSW5mbz4gQWJicmV2czsKKyAgICBzdHJ1Y3QgSGVhZGVyIEhkcjsKKyAgICBjb25zdCBEV0FSRkRlYnVnTmFtZXMgJlNlY3Rpb247CisKKyAgICAvLyBCYXNlIG9mIHRoZSB3aG9sZSB1bml0IGFuZCBvZiB2YXJpb3VzIGltcG9ydGFudCB0YWJsZXMsIGFzIG9mZnNldHMgZnJvbQorICAgIC8vIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbi4KKyAgICB1aW50MzJfdCBCYXNlOworICAgIHVpbnQzMl90IENVc0Jhc2U7CisgICAgdWludDMyX3QgQnVja2V0c0Jhc2U7CisgICAgdWludDMyX3QgSGFzaGVzQmFzZTsKKyAgICB1aW50MzJfdCBTdHJpbmdPZmZzZXRzQmFzZTsKKyAgICB1aW50MzJfdCBFbnRyeU9mZnNldHNCYXNlOworICAgIHVpbnQzMl90IEVudHJpZXNCYXNlOworCisgICAgRXhwZWN0ZWQ8RW50cnk+IGdldEVudHJ5KHVpbnQzMl90ICpPZmZzZXQpIGNvbnN0OworCisgICAgdm9pZCBkdW1wQ1VzKFNjb3BlZFByaW50ZXIgJlcpIGNvbnN0OworICAgIHZvaWQgZHVtcExvY2FsVFVzKFNjb3BlZFByaW50ZXIgJlcpIGNvbnN0OworICAgIHZvaWQgZHVtcEZvcmVpZ25UVXMoU2NvcGVkUHJpbnRlciAmVykgY29uc3Q7CisgICAgdm9pZCBkdW1wQWJicmV2aWF0aW9ucyhTY29wZWRQcmludGVyICZXKSBjb25zdDsKKyAgICBib29sIGR1bXBFbnRyeShTY29wZWRQcmludGVyICZXLCB1aW50MzJfdCAqT2Zmc2V0KSBjb25zdDsKKyAgICB2b2lkIGR1bXBOYW1lKFNjb3BlZFByaW50ZXIgJlcsIHVpbnQzMl90IEluZGV4LAorICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8dWludDMyX3Q+IEhhc2gpIGNvbnN0OworICAgIHZvaWQgZHVtcEJ1Y2tldChTY29wZWRQcmludGVyICZXLCB1aW50MzJfdCBCdWNrZXQpIGNvbnN0OworCisgICAgRXhwZWN0ZWQ8QXR0cmlidXRlRW5jb2Rpbmc+IGV4dHJhY3RBdHRyaWJ1dGVFbmNvZGluZyh1aW50MzJfdCAqT2Zmc2V0KTsKKworICAgIEV4cGVjdGVkPHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZUVuY29kaW5nPj4KKyAgICBleHRyYWN0QXR0cmlidXRlRW5jb2RpbmdzKHVpbnQzMl90ICpPZmZzZXQpOworCisgICAgRXhwZWN0ZWQ8QWJicmV2PiBleHRyYWN0QWJicmV2KHVpbnQzMl90ICpPZmZzZXQpOworCisgIHB1YmxpYzoKKyAgICBOYW1lSW5kZXgoY29uc3QgRFdBUkZEZWJ1Z05hbWVzICZTZWN0aW9uLCB1aW50MzJfdCBCYXNlKQorICAgICAgICA6IFNlY3Rpb24oU2VjdGlvbiksIEJhc2UoQmFzZSkge30KKworICAgIC8vLyBSZWFkcyBvZmZzZXQgb2YgY29tcGlsYXRpb24gdW5pdCBDVS4gQ1UgaXMgMC1iYXNlZC4KKyAgICB1aW50MzJfdCBnZXRDVU9mZnNldCh1aW50MzJfdCBDVSkgY29uc3Q7CisgICAgdWludDMyX3QgZ2V0Q1VDb3VudCgpIGNvbnN0IHsgcmV0dXJuIEhkci5Db21wVW5pdENvdW50OyB9CisKKyAgICAvLy8gUmVhZHMgb2Zmc2V0IG9mIGxvY2FsIHR5cGUgdW5pdCBUVSwgVFUgaXMgMC1iYXNlZC4KKyAgICB1aW50MzJfdCBnZXRMb2NhbFRVT2Zmc2V0KHVpbnQzMl90IFRVKSBjb25zdDsKKyAgICB1aW50MzJfdCBnZXRMb2NhbFRVQ291bnQoKSBjb25zdCB7IHJldHVybiBIZHIuTG9jYWxUeXBlVW5pdENvdW50OyB9CisKKyAgICAvLy8gUmVhZHMgc2lnbmF0dXJlIG9mIGZvcmVpZ24gdHlwZSB1bml0IFRVLiBUVSBpcyAwLWJhc2VkLgorICAgIHVpbnQ2NF90IGdldEZvcmVpZ25UVVNpZ25hdHVyZSh1aW50MzJfdCBUVSkgY29uc3Q7CisgICAgdWludDMyX3QgZ2V0Rm9yZWlnblRVQ291bnQoKSBjb25zdCB7IHJldHVybiBIZHIuRm9yZWlnblR5cGVVbml0Q291bnQ7IH0KKworICAgIC8vLyBSZWFkcyBhbiBlbnRyeSBpbiB0aGUgQnVja2V0IEFycmF5IGZvciB0aGUgZ2l2ZW4gQnVja2V0LiBUaGUgcmV0dXJuZWQKKyAgICAvLy8gdmFsdWUgaXMgYSAoMS1iYXNlZCkgaW5kZXggaW50byB0aGUgTmFtZXMsIFN0cmluZ09mZnNldHMgYW5kCisgICAgLy8vIEVudHJ5T2Zmc2V0cyBhcnJheXMuIFRoZSBpbnB1dCBCdWNrZXQgaW5kZXggaXMgMC1iYXNlZC4KKyAgICB1aW50MzJfdCBnZXRCdWNrZXRBcnJheUVudHJ5KHVpbnQzMl90IEJ1Y2tldCkgY29uc3Q7CisgICAgdWludDMyX3QgZ2V0QnVja2V0Q291bnQoKSBjb25zdCB7IHJldHVybiBIZHIuQnVja2V0Q291bnQ7IH0KKworICAgIC8vLyBSZWFkcyBhbiBlbnRyeSBpbiB0aGUgSGFzaCBBcnJheSBmb3IgdGhlIGdpdmVuIEluZGV4LiBUaGUgaW5wdXQgSW5kZXgKKyAgICAvLy8gaXMgMS1iYXNlZC4KKyAgICB1aW50MzJfdCBnZXRIYXNoQXJyYXlFbnRyeSh1aW50MzJfdCBJbmRleCkgY29uc3Q7CisKKyAgICAvLy8gUmVhZHMgYW4gZW50cnkgaW4gdGhlIE5hbWUgVGFibGUgZm9yIHRoZSBnaXZlbiBJbmRleC4gVGhlIE5hbWUgVGFibGUKKyAgICAvLy8gY29uc2lzdHMgb2YgdHdvIGFycmF5cyAtLSBTdHJpbmcgT2Zmc2V0cyBhbmQgRW50cnkgT2Zmc2V0cy4gVGhlIHJldHVybmVkCisgICAgLy8vIG9mZnNldHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydHMgb2YgcmVzcGVjdGl2ZSBzZWN0aW9ucy4gSW5wdXQgSW5kZXgKKyAgICAvLy8gaXMgMS1iYXNlZC4KKyAgICBOYW1lVGFibGVFbnRyeSBnZXROYW1lVGFibGVFbnRyeSh1aW50MzJfdCBJbmRleCkgY29uc3Q7CisKKyAgICB1aW50MzJfdCBnZXROYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBIZHIuTmFtZUNvdW50OyB9CisKKyAgICBjb25zdCBEZW5zZVNldDxBYmJyZXYsIEFiYnJldk1hcEluZm8+ICZnZXRBYmJyZXZzKCkgY29uc3QgeworICAgICAgcmV0dXJuIEFiYnJldnM7CisgICAgfQorCisgICAgbGx2bTo6RXJyb3IgZXh0cmFjdCgpOworICAgIHVpbnQzMl90IGdldFVuaXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBCYXNlOyB9CisgICAgdWludDMyX3QgZ2V0TmV4dFVuaXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBCYXNlICsgNCArIEhkci5Vbml0TGVuZ3RoOyB9CisgICAgdm9pZCBkdW1wKFNjb3BlZFByaW50ZXIgJlcpIGNvbnN0OworCisgICAgZnJpZW5kIGNsYXNzIERXQVJGRGVidWdOYW1lczsKKyAgfTsKKworICBjbGFzcyBWYWx1ZUl0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjppbnB1dF9pdGVyYXRvcl90YWcsIEVudHJ5PiB7CisKKyAgICAvLy8gVGhlIE5hbWUgSW5kZXggd2UgYXJlIGN1cnJlbnRseSBpdGVyYXRpbmcgdGhyb3VnaC4gVGhlIGltcGxlbWVudGF0aW9uCisgICAgLy8vIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IHRoaXMgY2FuIGFsc28gYmUgdXNlZCBhcyBhbiBpdGVyYXRvciBpbnRvIHRoZQorICAgIC8vLyAiTmFtZUluZGljZXMiIHZlY3RvciBpbiB0aGUgQWNjZWxlcmF0b3Igc2VjdGlvbi4KKyAgICBjb25zdCBOYW1lSW5kZXggKkN1cnJlbnRJbmRleCA9IG51bGxwdHI7CisKKyAgICBPcHRpb25hbDxFbnRyeT4gQ3VycmVudEVudHJ5OworICAgIHVuc2lnbmVkIERhdGFPZmZzZXQgPSAwOyAvLy88IE9mZnNldCBpbnRvIHRoZSBzZWN0aW9uLgorICAgIHN0ZDo6c3RyaW5nIEtleTsgICAgICAgICAvLy88IFRoZSBLZXkgd2UgYXJlIHNlYXJjaGluZyBmb3IuCisgICAgT3B0aW9uYWw8dWludDMyX3Q+IEhhc2g7IC8vLzwgSGFzaCBvZiBLZXksIGlmIGl0IGhhcyBiZWVuIGNvbXB1dGVkLgorCisgICAgYm9vbCBnZXRFbnRyeUF0Q3VycmVudE9mZnNldCgpOworICAgIE9wdGlvbmFsPHVpbnQzMl90PiBmaW5kRW50cnlPZmZzZXRJbkN1cnJlbnRJbmRleCgpOworICAgIGJvb2wgZmluZEluQ3VycmVudEluZGV4KCk7CisgICAgdm9pZCBzZWFyY2hGcm9tU3RhcnRPZkN1cnJlbnRJbmRleCgpOworICAgIHZvaWQgbmV4dCgpOworCisgICAgLy8vIFNldCB0aGUgaXRlcmF0b3IgdG8gdGhlICJlbmQiIHN0YXRlLgorICAgIHZvaWQgc2V0RW5kKCkgeyAqdGhpcyA9IFZhbHVlSXRlcmF0b3IoKTsgfQorCisgIHB1YmxpYzoKKyAgICAvLy8gQ3JlYXRlIGEgImJlZ2luIiBpdGVyYXRvciBmb3IgbG9vcGluZyBvdmVyIGFsbCBlbnRyaWVzIGluIHRoZQorICAgIC8vLyBhY2NlbGVyYXRvciB0YWJsZSBtYXRjaGluZyBLZXkuIFRoZSBpdGVyYXRvciB3aWxsIHJ1biB0aHJvdWdoIGFsbCBOYW1lCisgICAgLy8vIEluZGV4ZXMgaW4gdGhlIHNlY3Rpb24gaW4gc2VxdWVuY2UuCisgICAgVmFsdWVJdGVyYXRvcihjb25zdCBEV0FSRkRlYnVnTmFtZXMgJkFjY2VsVGFibGUsIFN0cmluZ1JlZiBLZXkpOworCisgICAgLy8vIEVuZCBtYXJrZXIuCisgICAgVmFsdWVJdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgIGNvbnN0IEVudHJ5ICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqQ3VycmVudEVudHJ5OyB9CisgICAgVmFsdWVJdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICAgIG5leHQoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgVmFsdWVJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgICAgVmFsdWVJdGVyYXRvciBJID0gKnRoaXM7CisgICAgICBuZXh0KCk7CisgICAgICByZXR1cm4gSTsKKyAgICB9CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZhbHVlSXRlcmF0b3IgJkEsIGNvbnN0IFZhbHVlSXRlcmF0b3IgJkIpIHsKKyAgICAgIHJldHVybiBBLkN1cnJlbnRJbmRleCA9PSBCLkN1cnJlbnRJbmRleCAmJiBBLkRhdGFPZmZzZXQgPT0gQi5EYXRhT2Zmc2V0OworICAgIH0KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFZhbHVlSXRlcmF0b3IgJkEsIGNvbnN0IFZhbHVlSXRlcmF0b3IgJkIpIHsKKyAgICAgIHJldHVybiAhKEEgPT0gQik7CisgICAgfQorICB9OworCitwcml2YXRlOgorICBTbWFsbFZlY3RvcjxOYW1lSW5kZXgsIDA+IE5hbWVJbmRpY2VzOworCitwdWJsaWM6CisgIERXQVJGRGVidWdOYW1lcyhjb25zdCBEV0FSRkRhdGFFeHRyYWN0b3IgJkFjY2VsU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgIERhdGFFeHRyYWN0b3IgU3RyaW5nU2VjdGlvbikKKyAgICAgIDogRFdBUkZBY2NlbGVyYXRvclRhYmxlKEFjY2VsU2VjdGlvbiwgU3RyaW5nU2VjdGlvbikge30KKworICBsbHZtOjpFcnJvciBleHRyYWN0KCkgb3ZlcnJpZGU7CisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vLyBMb29rIHVwIGFsbCBlbnRyaWVzIGluIHRoZSBhY2NlbGVyYXRvciB0YWJsZSBtYXRjaGluZyBcYyBLZXkuCisgIGl0ZXJhdG9yX3JhbmdlPFZhbHVlSXRlcmF0b3I+IGVxdWFsX3JhbmdlKFN0cmluZ1JlZiBLZXkpIGNvbnN0OworCisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gU21hbGxWZWN0b3I8TmFtZUluZGV4LCAwPjo6Y29uc3RfaXRlcmF0b3I7CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gTmFtZUluZGljZXMuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBOYW1lSW5kaWNlcy5lbmQoKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGQUNDRUxFUkFUT1JUQUJMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkFkZHJlc3NSYW5nZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZBZGRyZXNzUmFuZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTdkZjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZBZGRyZXNzUmFuZ2UuaApAQCAtMCwwICsxLDY4IEBACisvLz09PS0gRFdBUkZBZGRyZXNzUmFuZ2UuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGQUREUkVTU1JBTkdFX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZBRERSRVNTUkFOR0VfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRElDb250ZXh0LmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK3N0cnVjdCBEV0FSRkFkZHJlc3NSYW5nZSB7CisgIHVpbnQ2NF90IExvd1BDOworICB1aW50NjRfdCBIaWdoUEM7CisgIHVpbnQ2NF90IFNlY3Rpb25JbmRleDsKKworICBEV0FSRkFkZHJlc3NSYW5nZSgpID0gZGVmYXVsdDsKKworICAvLy8gVXNlZCBmb3IgdW5pdCB0ZXN0aW5nLgorICBEV0FSRkFkZHJlc3NSYW5nZSh1aW50NjRfdCBMb3dQQywgdWludDY0X3QgSGlnaFBDLCB1aW50NjRfdCBTZWN0aW9uSW5kZXggPSAwKQorICAgICAgOiBMb3dQQyhMb3dQQyksIEhpZ2hQQyhIaWdoUEMpLCBTZWN0aW9uSW5kZXgoU2VjdGlvbkluZGV4KSB7fQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgTG93UEMgaXMgc21hbGxlciBvciBlcXVhbCB0byBIaWdoUEMuIFRoaXMgYWNjb3VudHMgZm9yCisgIC8vLyBkZWFkLXN0cmlwcGVkIHJhbmdlcy4KKyAgYm9vbCB2YWxpZCgpIGNvbnN0IHsgcmV0dXJuIExvd1BDIDw9IEhpZ2hQQzsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgW0xvd1BDLCBIaWdoUEMpIGludGVyc2VjdHMgd2l0aCBbUkhTLkxvd1BDLCBSSFMuSGlnaFBDKS4KKyAgYm9vbCBpbnRlcnNlY3RzKGNvbnN0IERXQVJGQWRkcmVzc1JhbmdlICZSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQodmFsaWQoKSAmJiBSSFMudmFsaWQoKSk7CisgICAgLy8gRW1wdHkgcmFuZ2VzIGNhbid0IGludGVyc2VjdC4KKyAgICBpZiAoTG93UEMgPT0gSGlnaFBDIHx8IFJIUy5Mb3dQQyA9PSBSSFMuSGlnaFBDKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBMb3dQQyA8IFJIUy5IaWdoUEMgJiYgUkhTLkxvd1BDIDwgSGlnaFBDOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBbTG93UEMsIEhpZ2hQQykgZnVsbHkgY29udGFpbnMgW1JIUy5Mb3dQQywgUkhTLkhpZ2hQQykuCisgIGJvb2wgY29udGFpbnMoY29uc3QgRFdBUkZBZGRyZXNzUmFuZ2UgJlJIUykgY29uc3QgeworICAgIGFzc2VydCh2YWxpZCgpICYmIFJIUy52YWxpZCgpKTsKKyAgICByZXR1cm4gTG93UEMgPD0gUkhTLkxvd1BDICYmIFJIUy5IaWdoUEMgPD0gSGlnaFBDOworICB9CisKKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUywgdWludDMyX3QgQWRkcmVzc1NpemUsCisgICAgICAgICAgICBESUR1bXBPcHRpb25zIER1bXBPcHRzID0ge30pIGNvbnN0OworfTsKKworc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBEV0FSRkFkZHJlc3NSYW5nZSAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEV0FSRkFkZHJlc3NSYW5nZSAmUkhTKSB7CisgIHJldHVybiBzdGQ6OnRpZShMSFMuTG93UEMsIExIUy5IaWdoUEMpIDwgc3RkOjp0aWUoUkhTLkxvd1BDLCBSSFMuSGlnaFBDKTsKK30KKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBEV0FSRkFkZHJlc3NSYW5nZSAmUik7CisKKy8vLyBEV0FSRkFkZHJlc3NSYW5nZXNWZWN0b3IgLSByZXByZXNlbnRzIGEgc2V0IG9mIGFic29sdXRlIGFkZHJlc3MgcmFuZ2VzLgordXNpbmcgRFdBUkZBZGRyZXNzUmFuZ2VzVmVjdG9yID0gc3RkOjp2ZWN0b3I8RFdBUkZBZGRyZXNzUmFuZ2U+OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZBRERSRVNTUkFOR0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZBdHRyaWJ1dGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGQXR0cmlidXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2NzJiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGQXR0cmlidXRlLmgKQEAgLTAsMCArMSw1NiBAQAorLy89PT0tIERXQVJGQXR0cmlidXRlLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRkFUVFJJQlVURV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0RXQVJGQVRUUklCVVRFX0gKKworI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZGb3JtVmFsdWUuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRW5jYXBzdWxhdGVzIGEgRFdBUkYgYXR0cmlidXRlIHZhbHVlIGFuZCBhbGwgb2YgdGhlIGRhdGEgcmVxdWlyZWQgdG8KKy8vLyBkZXNjcmliZSB0aGUgYXR0cmlidXRlIHZhbHVlLgorLy8vCisvLy8gVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGJ5IGNsaWVudHMgdGhhdCB3YW50IHRvIGl0ZXJhdGUgYWNyb3NzIGFsbAorLy8vIGF0dHJpYnV0ZXMgaW4gYSBEV0FSRkRpZS4KK3N0cnVjdCBEV0FSRkF0dHJpYnV0ZSB7CisgIC8vLyBUaGUgZGVidWcgaW5mby90eXBlcyBvZmZzZXQgZm9yIHRoaXMgYXR0cmlidXRlLgorICB1aW50MzJfdCBPZmZzZXQgPSAwOworICAvLy8gVGhlIGRlYnVnIGluZm8vdHlwZXMgc2VjdGlvbiBieXRlIHNpemUgb2YgdGhlIGRhdGEgZm9yIHRoaXMgYXR0cmlidXRlLgorICB1aW50MzJfdCBCeXRlU2l6ZSA9IDA7CisgIC8vLyBUaGUgYXR0cmlidXRlIGVudW1lcmF0aW9uIG9mIHRoaXMgYXR0cmlidXRlLgorICBkd2FyZjo6QXR0cmlidXRlIEF0dHI7CisgIC8vLyBUaGUgZm9ybSBhbmQgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlLgorICBEV0FSRkZvcm1WYWx1ZSBWYWx1ZTsKKworICBEV0FSRkF0dHJpYnV0ZSh1aW50MzJfdCBPLCBkd2FyZjo6QXR0cmlidXRlIEEgPSBkd2FyZjo6QXR0cmlidXRlKDApLAorICAgICAgICAgICAgICAgICBkd2FyZjo6Rm9ybSBGID0gZHdhcmY6OkZvcm0oMCkpIDogQXR0cihBKSwgVmFsdWUoRikge30KKworICBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgcmV0dXJuIE9mZnNldCAhPSAwICYmIEF0dHIgIT0gZHdhcmY6OkF0dHJpYnV0ZSgwKTsKKyAgfQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgcmV0dXJuIGlzVmFsaWQoKTsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgT2Zmc2V0ID0gMDsKKyAgICBCeXRlU2l6ZSA9IDA7CisgICAgQXR0ciA9IGR3YXJmOjpBdHRyaWJ1dGUoMCk7CisgICAgVmFsdWUgPSBEV0FSRkZvcm1WYWx1ZSgpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fRFdBUkZBVFRSSUJVVEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZDb21waWxlVW5pdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZDb21waWxlVW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOGFkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkNvbXBpbGVVbml0LmgKQEAgLTAsMCArMSwzOSBAQAorLy89PT0tIERXQVJGQ29tcGlsZVVuaXQuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRkNPTVBJTEVVTklUX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZDT01QSUxFVU5JVF9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlVuaXQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlVuaXRJbmRleC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIERXQVJGQ29tcGlsZVVuaXQgOiBwdWJsaWMgRFdBUkZVbml0IHsKK3B1YmxpYzoKKyAgRFdBUkZDb21waWxlVW5pdChEV0FSRkNvbnRleHQgJkNvbnRleHQsIGNvbnN0IERXQVJGU2VjdGlvbiAmU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEV0FSRkRlYnVnQWJicmV2ICpEQSwgY29uc3QgRFdBUkZTZWN0aW9uICpSUywKKyAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU1MsIGNvbnN0IERXQVJGU2VjdGlvbiAmU09TLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGU2VjdGlvbiAqQU9TLCBjb25zdCBEV0FSRlNlY3Rpb24gJkxTLCBib29sIExFLAorICAgICAgICAgICAgICAgICAgIGJvb2wgSXNEV08sIGNvbnN0IERXQVJGVW5pdFNlY3Rpb25CYXNlICZVbml0U2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEV0FSRlVuaXRJbmRleDo6RW50cnkgKkVudHJ5KQorICAgICAgOiBEV0FSRlVuaXQoQ29udGV4dCwgU2VjdGlvbiwgREEsIFJTLCBTUywgU09TLCBBT1MsIExTLCBMRSwgSXNEV08sCisgICAgICAgICAgICAgICAgICBVbml0U2VjdGlvbiwgRW50cnkpIHt9CisKKyAgLy8gVlRhYmxlIGFuY2hvci4KKyAgfkRXQVJGQ29tcGlsZVVuaXQoKSBvdmVycmlkZTsKKworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBESUR1bXBPcHRpb25zIER1bXBPcHRzKTsKKworICBzdGF0aWMgY29uc3QgRFdBUkZTZWN0aW9uS2luZCBTZWN0aW9uID0gRFdfU0VDVF9JTkZPOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGQ09NUElMRVVOSVRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZDb250ZXh0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODQyY2YyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZDb250ZXh0LmgKQEAgLTAsMCArMSwzMjcgQEAKKy8vPT09LSBEV0FSRkNvbnRleHQuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkNPTlRFWFRfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkNPTlRFWFRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvTWFwVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRElDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZBY2NlbGVyYXRvclRhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZDb21waWxlVW5pdC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdBYmJyZXYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnQXJhbmdlcy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdGcmFtZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0xvYy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdNYWNyby5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGllLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZHZGJJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGT2JqZWN0LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZTZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZUeXBlVW5pdC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGVW5pdC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGVW5pdEluZGV4LmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvQmluYXJ5LmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvT2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0hvc3QuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNSZWdpc3RlckluZm87CitjbGFzcyBNZW1vcnlCdWZmZXI7CitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIFVzZWQgYXMgYSByZXR1cm4gdmFsdWUgZm9yIGEgZXJyb3IgY2FsbGJhY2sgcGFzc2VkIHRvIERXQVJGIGNvbnRleHQuCisvLy8gQ2FsbGJhY2sgc2hvdWxkIHJldHVybiBIYWx0IGlmIGNsaWVudCBhcHBsaWNhdGlvbiB3YW50cyB0byBzdG9wCisvLy8gb2JqZWN0IHBhcnNpbmcsIG9yIHNob3VsZCByZXR1cm4gQ29udGludWUgb3RoZXJ3aXNlLgorZW51bSBjbGFzcyBFcnJvclBvbGljeSB7IEhhbHQsIENvbnRpbnVlIH07CisKKy8vLyBEV0FSRkNvbnRleHQKKy8vLyBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIHRoZSB0b3AgbGV2ZWwgZW50aXR5IHRoYXQgZGVhbHMgd2l0aCBkd2FyZiBkZWJ1ZworLy8vIGluZm9ybWF0aW9uIHBhcnNpbmcuIFRoZSBhY3R1YWwgZGF0YSBpcyBzdXBwbGllZCB0aHJvdWdoIERXQVJGT2JqLgorY2xhc3MgRFdBUkZDb250ZXh0IDogcHVibGljIERJQ29udGV4dCB7CisgIERXQVJGVW5pdFNlY3Rpb248RFdBUkZDb21waWxlVW5pdD4gQ1VzOworICBzdGQ6OmRlcXVlPERXQVJGVW5pdFNlY3Rpb248RFdBUkZUeXBlVW5pdD4+IFRVczsKKyAgc3RkOjp1bmlxdWVfcHRyPERXQVJGVW5pdEluZGV4PiBDVUluZGV4OworICBzdGQ6OnVuaXF1ZV9wdHI8RFdBUkZHZGJJbmRleD4gR2RiSW5kZXg7CisgIHN0ZDo6dW5pcXVlX3B0cjxEV0FSRlVuaXRJbmRleD4gVFVJbmRleDsKKyAgc3RkOjp1bmlxdWVfcHRyPERXQVJGRGVidWdBYmJyZXY+IEFiYnJldjsKKyAgc3RkOjp1bmlxdWVfcHRyPERXQVJGRGVidWdMb2M+IExvYzsKKyAgc3RkOjp1bmlxdWVfcHRyPERXQVJGRGVidWdBcmFuZ2VzPiBBcmFuZ2VzOworICBzdGQ6OnVuaXF1ZV9wdHI8RFdBUkZEZWJ1Z0xpbmU+IExpbmU7CisgIHN0ZDo6dW5pcXVlX3B0cjxEV0FSRkRlYnVnRnJhbWU+IERlYnVnRnJhbWU7CisgIHN0ZDo6dW5pcXVlX3B0cjxEV0FSRkRlYnVnRnJhbWU+IEVIRnJhbWU7CisgIHN0ZDo6dW5pcXVlX3B0cjxEV0FSRkRlYnVnTWFjcm8+IE1hY3JvOworICBzdGQ6OnVuaXF1ZV9wdHI8RFdBUkZEZWJ1Z05hbWVzPiBOYW1lczsKKyAgc3RkOjp1bmlxdWVfcHRyPEFwcGxlQWNjZWxlcmF0b3JUYWJsZT4gQXBwbGVOYW1lczsKKyAgc3RkOjp1bmlxdWVfcHRyPEFwcGxlQWNjZWxlcmF0b3JUYWJsZT4gQXBwbGVUeXBlczsKKyAgc3RkOjp1bmlxdWVfcHRyPEFwcGxlQWNjZWxlcmF0b3JUYWJsZT4gQXBwbGVOYW1lc3BhY2VzOworICBzdGQ6OnVuaXF1ZV9wdHI8QXBwbGVBY2NlbGVyYXRvclRhYmxlPiBBcHBsZU9iakM7CisKKyAgRFdBUkZVbml0U2VjdGlvbjxEV0FSRkNvbXBpbGVVbml0PiBEV09DVXM7CisgIHN0ZDo6ZGVxdWU8RFdBUkZVbml0U2VjdGlvbjxEV0FSRlR5cGVVbml0Pj4gRFdPVFVzOworICBzdGQ6OnVuaXF1ZV9wdHI8RFdBUkZEZWJ1Z0FiYnJldj4gQWJicmV2RFdPOworICBzdGQ6OnVuaXF1ZV9wdHI8RFdBUkZEZWJ1Z0xvY0RXTz4gTG9jRFdPOworCisgIC8vLyBUaGUgbWF4aW11bSBEV0FSRiB2ZXJzaW9uIG9mIGFsbCB1bml0cy4KKyAgdW5zaWduZWQgTWF4VmVyc2lvbiA9IDA7CisKKyAgc3RydWN0IERXT0ZpbGUgeworICAgIG9iamVjdDo6T3duaW5nQmluYXJ5PG9iamVjdDo6T2JqZWN0RmlsZT4gRmlsZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RFdBUkZDb250ZXh0PiBDb250ZXh0OworICB9OworICBTdHJpbmdNYXA8c3RkOjp3ZWFrX3B0cjxEV09GaWxlPj4gRFdPRmlsZXM7CisgIHN0ZDo6d2Vha19wdHI8RFdPRmlsZT4gRFdQOworICBib29sIENoZWNrZWRGb3JEV1AgPSBmYWxzZTsKKyAgc3RkOjpzdHJpbmcgRFdQTmFtZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8TUNSZWdpc3RlckluZm8+IFJlZ0luZm87CisKKyAgLy8vIFJlYWQgY29tcGlsZSB1bml0cyBmcm9tIHRoZSBkZWJ1Z19pbmZvIHNlY3Rpb24gKGlmIG5lY2Vzc2FyeSkKKyAgLy8vIGFuZCBzdG9yZSB0aGVtIGluIENVcy4KKyAgdm9pZCBwYXJzZUNvbXBpbGVVbml0cygpOworCisgIC8vLyBSZWFkIHR5cGUgdW5pdHMgZnJvbSB0aGUgZGVidWdfdHlwZXMgc2VjdGlvbnMgKGlmIG5lY2Vzc2FyeSkKKyAgLy8vIGFuZCBzdG9yZSB0aGVtIGluIFRVcy4KKyAgdm9pZCBwYXJzZVR5cGVVbml0cygpOworCisgIC8vLyBSZWFkIGNvbXBpbGUgdW5pdHMgZnJvbSB0aGUgZGVidWdfaW5mby5kd28gc2VjdGlvbiAoaWYgbmVjZXNzYXJ5KQorICAvLy8gYW5kIHN0b3JlIHRoZW0gaW4gRFdPQ1VzLgorICB2b2lkIHBhcnNlRFdPQ29tcGlsZVVuaXRzKCk7CisKKyAgLy8vIFJlYWQgdHlwZSB1bml0cyBmcm9tIHRoZSBkZWJ1Z190eXBlcy5kd28gc2VjdGlvbiAoaWYgbmVjZXNzYXJ5KQorICAvLy8gYW5kIHN0b3JlIHRoZW0gaW4gRFdPVFVzLgorICB2b2lkIHBhcnNlRFdPVHlwZVVuaXRzKCk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IERXQVJGT2JqZWN0PiBET2JqOworCitwdWJsaWM6CisgIERXQVJGQ29udGV4dChzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgRFdBUkZPYmplY3Q+IERPYmosCisgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBEV1BOYW1lID0gIiIpOworICB+RFdBUkZDb250ZXh0KCk7CisKKyAgRFdBUkZDb250ZXh0KERXQVJGQ29udGV4dCAmKSA9IGRlbGV0ZTsKKyAgRFdBUkZDb250ZXh0ICZvcGVyYXRvcj0oRFdBUkZDb250ZXh0ICYpID0gZGVsZXRlOworCisgIGNvbnN0IERXQVJGT2JqZWN0ICZnZXREV0FSRk9iaigpIGNvbnN0IHsgcmV0dXJuICpET2JqOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBESUNvbnRleHQgKkRJQ3R4KSB7CisgICAgcmV0dXJuIERJQ3R4LT5nZXRLaW5kKCkgPT0gQ0tfRFdBUkY7CisgIH0KKworICAvLy8gRHVtcCBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gdG8gXHAgT1MuIElmIGFueSBccCBEdW1wT2Zmc2V0cyBhcmUgcHJlc2VudCwKKyAgLy8vIGR1bXAgb25seSB0aGUgcmVjb3JkIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgorICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBESUR1bXBPcHRpb25zIER1bXBPcHRzLAorICAgICAgICAgICAgc3RkOjphcnJheTxPcHRpb25hbDx1aW50NjRfdD4sIERJRFRfSURfQ291bnQ+IER1bXBPZmZzZXRzKTsKKworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBESUR1bXBPcHRpb25zIER1bXBPcHRzKSBvdmVycmlkZSB7CisgICAgc3RkOjphcnJheTxPcHRpb25hbDx1aW50NjRfdD4sIERJRFRfSURfQ291bnQ+IER1bXBPZmZzZXRzOworICAgIGR1bXAoT1MsIER1bXBPcHRzLCBEdW1wT2Zmc2V0cyk7CisgIH0KKworICBib29sIHZlcmlmeShyYXdfb3N0cmVhbSAmT1MsIERJRHVtcE9wdGlvbnMgRHVtcE9wdHMgPSB7fSkgb3ZlcnJpZGU7CisKKyAgdXNpbmcgY3VfaXRlcmF0b3JfcmFuZ2UgPSBEV0FSRlVuaXRTZWN0aW9uPERXQVJGQ29tcGlsZVVuaXQ+OjppdGVyYXRvcl9yYW5nZTsKKyAgdXNpbmcgdHVfaXRlcmF0b3JfcmFuZ2UgPSBEV0FSRlVuaXRTZWN0aW9uPERXQVJGVHlwZVVuaXQ+OjppdGVyYXRvcl9yYW5nZTsKKyAgdXNpbmcgdHVfc2VjdGlvbl9pdGVyYXRvcl9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPGRlY2x0eXBlKFRVcyk6Oml0ZXJhdG9yPjsKKworICAvLy8gR2V0IGNvbXBpbGUgdW5pdHMgaW4gdGhpcyBjb250ZXh0LgorICBjdV9pdGVyYXRvcl9yYW5nZSBjb21waWxlX3VuaXRzKCkgeworICAgIHBhcnNlQ29tcGlsZVVuaXRzKCk7CisgICAgcmV0dXJuIGN1X2l0ZXJhdG9yX3JhbmdlKENVcy5iZWdpbigpLCBDVXMuZW5kKCkpOworICB9CisKKyAgLy8vIEdldCB0eXBlIHVuaXRzIGluIHRoaXMgY29udGV4dC4KKyAgdHVfc2VjdGlvbl9pdGVyYXRvcl9yYW5nZSB0eXBlX3VuaXRfc2VjdGlvbnMoKSB7CisgICAgcGFyc2VUeXBlVW5pdHMoKTsKKyAgICByZXR1cm4gdHVfc2VjdGlvbl9pdGVyYXRvcl9yYW5nZShUVXMuYmVnaW4oKSwgVFVzLmVuZCgpKTsKKyAgfQorCisgIC8vLyBHZXQgY29tcGlsZSB1bml0cyBpbiB0aGUgRFdPIGNvbnRleHQuCisgIGN1X2l0ZXJhdG9yX3JhbmdlIGR3b19jb21waWxlX3VuaXRzKCkgeworICAgIHBhcnNlRFdPQ29tcGlsZVVuaXRzKCk7CisgICAgcmV0dXJuIGN1X2l0ZXJhdG9yX3JhbmdlKERXT0NVcy5iZWdpbigpLCBEV09DVXMuZW5kKCkpOworICB9CisKKyAgLy8vIEdldCB0eXBlIHVuaXRzIGluIHRoZSBEV08gY29udGV4dC4KKyAgdHVfc2VjdGlvbl9pdGVyYXRvcl9yYW5nZSBkd29fdHlwZV91bml0X3NlY3Rpb25zKCkgeworICAgIHBhcnNlRFdPVHlwZVVuaXRzKCk7CisgICAgcmV0dXJuIHR1X3NlY3Rpb25faXRlcmF0b3JfcmFuZ2UoRFdPVFVzLmJlZ2luKCksIERXT1RVcy5lbmQoKSk7CisgIH0KKworICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgY29tcGlsZSB1bml0cyBpbiB0aGlzIGNvbnRleHQuCisgIHVuc2lnbmVkIGdldE51bUNvbXBpbGVVbml0cygpIHsKKyAgICBwYXJzZUNvbXBpbGVVbml0cygpOworICAgIHJldHVybiBDVXMuc2l6ZSgpOworICB9CisKKyAgLy8vIEdldCB0aGUgbnVtYmVyIG9mIGNvbXBpbGUgdW5pdHMgaW4gdGhpcyBjb250ZXh0LgorICB1bnNpZ25lZCBnZXROdW1UeXBlVW5pdHMoKSB7CisgICAgcGFyc2VUeXBlVW5pdHMoKTsKKyAgICByZXR1cm4gVFVzLnNpemUoKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIG51bWJlciBvZiBjb21waWxlIHVuaXRzIGluIHRoZSBEV08gY29udGV4dC4KKyAgdW5zaWduZWQgZ2V0TnVtRFdPQ29tcGlsZVVuaXRzKCkgeworICAgIHBhcnNlRFdPQ29tcGlsZVVuaXRzKCk7CisgICAgcmV0dXJuIERXT0NVcy5zaXplKCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgY29tcGlsZSB1bml0cyBpbiB0aGUgRFdPIGNvbnRleHQuCisgIHVuc2lnbmVkIGdldE51bURXT1R5cGVVbml0cygpIHsKKyAgICBwYXJzZURXT1R5cGVVbml0cygpOworICAgIHJldHVybiBEV09UVXMuc2l6ZSgpOworICB9CisKKyAgLy8vIEdldCB0aGUgY29tcGlsZSB1bml0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZm9yIHRoaXMgY29tcGlsZSB1bml0LgorICBEV0FSRkNvbXBpbGVVbml0ICpnZXRDb21waWxlVW5pdEF0SW5kZXgodW5zaWduZWQgaW5kZXgpIHsKKyAgICBwYXJzZUNvbXBpbGVVbml0cygpOworICAgIHJldHVybiBDVXNbaW5kZXhdLmdldCgpOworICB9CisKKyAgLy8vIEdldCB0aGUgY29tcGlsZSB1bml0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZm9yIHRoZSBEV08gY29tcGlsZSB1bml0cy4KKyAgRFdBUkZDb21waWxlVW5pdCAqZ2V0RFdPQ29tcGlsZVVuaXRBdEluZGV4KHVuc2lnbmVkIGluZGV4KSB7CisgICAgcGFyc2VEV09Db21waWxlVW5pdHMoKTsKKyAgICByZXR1cm4gRFdPQ1VzW2luZGV4XS5nZXQoKTsKKyAgfQorCisgIERXQVJGQ29tcGlsZVVuaXQgKmdldERXT0NvbXBpbGVVbml0Rm9ySGFzaCh1aW50NjRfdCBIYXNoKTsKKworICAvLy8gR2V0IGEgRElFIGdpdmVuIGFuIGV4YWN0IG9mZnNldC4KKyAgRFdBUkZEaWUgZ2V0RElFRm9yT2Zmc2V0KHVpbnQzMl90IE9mZnNldCk7CisKKyAgdW5zaWduZWQgZ2V0TWF4VmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIE1heFZlcnNpb247IH0KKworICB2b2lkIHNldE1heFZlcnNpb25JZkdyZWF0ZXIodW5zaWduZWQgVmVyc2lvbikgeworICAgIGlmIChWZXJzaW9uID4gTWF4VmVyc2lvbikKKyAgICAgIE1heFZlcnNpb24gPSBWZXJzaW9uOworICB9CisKKyAgY29uc3QgRFdBUkZVbml0SW5kZXggJmdldENVSW5kZXgoKTsKKyAgRFdBUkZHZGJJbmRleCAmZ2V0R2RiSW5kZXgoKTsKKyAgY29uc3QgRFdBUkZVbml0SW5kZXggJmdldFRVSW5kZXgoKTsKKworICAvLy8gR2V0IGEgcG9pbnRlciB0byB0aGUgcGFyc2VkIERlYnVnQWJicmV2IG9iamVjdC4KKyAgY29uc3QgRFdBUkZEZWJ1Z0FiYnJldiAqZ2V0RGVidWdBYmJyZXYoKTsKKworICAvLy8gR2V0IGEgcG9pbnRlciB0byB0aGUgcGFyc2VkIERlYnVnTG9jIG9iamVjdC4KKyAgY29uc3QgRFdBUkZEZWJ1Z0xvYyAqZ2V0RGVidWdMb2MoKTsKKworICAvLy8gR2V0IGEgcG9pbnRlciB0byB0aGUgcGFyc2VkIGR3byBhYmJyZXZpYXRpb25zIG9iamVjdC4KKyAgY29uc3QgRFdBUkZEZWJ1Z0FiYnJldiAqZ2V0RGVidWdBYmJyZXZEV08oKTsKKworICAvLy8gR2V0IGEgcG9pbnRlciB0byB0aGUgcGFyc2VkIERlYnVnTG9jIG9iamVjdC4KKyAgY29uc3QgRFdBUkZEZWJ1Z0xvY0RXTyAqZ2V0RGVidWdMb2NEV08oKTsKKworICAvLy8gR2V0IGEgcG9pbnRlciB0byB0aGUgcGFyc2VkIERlYnVnQXJhbmdlcyBvYmplY3QuCisgIGNvbnN0IERXQVJGRGVidWdBcmFuZ2VzICpnZXREZWJ1Z0FyYW5nZXMoKTsKKworICAvLy8gR2V0IGEgcG9pbnRlciB0byB0aGUgcGFyc2VkIGZyYW1lIGluZm9ybWF0aW9uIG9iamVjdC4KKyAgY29uc3QgRFdBUkZEZWJ1Z0ZyYW1lICpnZXREZWJ1Z0ZyYW1lKCk7CisKKyAgLy8vIEdldCBhIHBvaW50ZXIgdG8gdGhlIHBhcnNlZCBlaCBmcmFtZSBpbmZvcm1hdGlvbiBvYmplY3QuCisgIGNvbnN0IERXQVJGRGVidWdGcmFtZSAqZ2V0RUhGcmFtZSgpOworCisgIC8vLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBwYXJzZWQgRGVidWdNYWNybyBvYmplY3QuCisgIGNvbnN0IERXQVJGRGVidWdNYWNybyAqZ2V0RGVidWdNYWNybygpOworCisgIC8vLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIHBhcnNlZCBhY2NlbGVyYXRvciB0YWJsZSBvYmplY3QuCisgIGNvbnN0IERXQVJGRGVidWdOYW1lcyAmZ2V0RGVidWdOYW1lcygpOworCisgIC8vLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIHBhcnNlZCBhY2NlbGVyYXRvciB0YWJsZSBvYmplY3QuCisgIGNvbnN0IEFwcGxlQWNjZWxlcmF0b3JUYWJsZSAmZ2V0QXBwbGVOYW1lcygpOworCisgIC8vLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIHBhcnNlZCBhY2NlbGVyYXRvciB0YWJsZSBvYmplY3QuCisgIGNvbnN0IEFwcGxlQWNjZWxlcmF0b3JUYWJsZSAmZ2V0QXBwbGVUeXBlcygpOworCisgIC8vLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIHBhcnNlZCBhY2NlbGVyYXRvciB0YWJsZSBvYmplY3QuCisgIGNvbnN0IEFwcGxlQWNjZWxlcmF0b3JUYWJsZSAmZ2V0QXBwbGVOYW1lc3BhY2VzKCk7CisKKyAgLy8vIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgcGFyc2VkIGFjY2VsZXJhdG9yIHRhYmxlIG9iamVjdC4KKyAgY29uc3QgQXBwbGVBY2NlbGVyYXRvclRhYmxlICZnZXRBcHBsZU9iakMoKTsKKworICAvLy8gR2V0IGEgcG9pbnRlciB0byBhIHBhcnNlZCBsaW5lIHRhYmxlIGNvcnJlc3BvbmRpbmcgdG8gYSBjb21waWxlIHVuaXQuCisgIGNvbnN0IERXQVJGRGVidWdMaW5lOjpMaW5lVGFibGUgKmdldExpbmVUYWJsZUZvclVuaXQoRFdBUkZVbml0ICpjdSk7CisKKyAgRGF0YUV4dHJhY3RvciBnZXRTdHJpbmdFeHRyYWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIERhdGFFeHRyYWN0b3IoRE9iai0+Z2V0U3RyaW5nU2VjdGlvbigpLCBmYWxzZSwgMCk7CisgIH0KKyAgRGF0YUV4dHJhY3RvciBnZXRMaW5lU3RyaW5nRXh0cmFjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBEYXRhRXh0cmFjdG9yKERPYmotPmdldExpbmVTdHJpbmdTZWN0aW9uKCksIGZhbHNlLCAwKTsKKyAgfQorCisgIC8vLyBXcmFwcyB0aGUgcmV0dXJuZWQgRElFcyBmb3IgYSBnaXZlbiBhZGRyZXNzLgorICBzdHJ1Y3QgRElFc0ZvckFkZHJlc3MgeworICAgIERXQVJGQ29tcGlsZVVuaXQgKkNvbXBpbGVVbml0ID0gbnVsbHB0cjsKKyAgICBEV0FSRkRpZSBGdW5jdGlvbkRJRTsKKyAgICBEV0FSRkRpZSBCbG9ja0RJRTsKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gQ29tcGlsZVVuaXQgIT0gbnVsbHB0cjsgfQorICB9OworCisgIC8vLyBHZXQgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIHRoZSBmdW5jdGlvbiBESUUgYW5kIGxleGljYWwgYmxvY2sgRElFIGZvciB0aGUKKyAgLy8vIGdpdmVuIGFkZHJlc3Mgd2hlcmUgYXBwbGljYWJsZS4KKyAgRElFc0ZvckFkZHJlc3MgZ2V0RElFc0ZvckFkZHJlc3ModWludDY0X3QgQWRkcmVzcyk7CisKKyAgRElMaW5lSW5mbyBnZXRMaW5lSW5mb0ZvckFkZHJlc3ModWludDY0X3QgQWRkcmVzcywKKyAgICAgIERJTGluZUluZm9TcGVjaWZpZXIgU3BlY2lmaWVyID0gRElMaW5lSW5mb1NwZWNpZmllcigpKSBvdmVycmlkZTsKKyAgRElMaW5lSW5mb1RhYmxlIGdldExpbmVJbmZvRm9yQWRkcmVzc1JhbmdlKHVpbnQ2NF90IEFkZHJlc3MsIHVpbnQ2NF90IFNpemUsCisgICAgICBESUxpbmVJbmZvU3BlY2lmaWVyIFNwZWNpZmllciA9IERJTGluZUluZm9TcGVjaWZpZXIoKSkgb3ZlcnJpZGU7CisgIERJSW5saW5pbmdJbmZvIGdldElubGluaW5nSW5mb0ZvckFkZHJlc3ModWludDY0X3QgQWRkcmVzcywKKyAgICAgIERJTGluZUluZm9TcGVjaWZpZXIgU3BlY2lmaWVyID0gRElMaW5lSW5mb1NwZWNpZmllcigpKSBvdmVycmlkZTsKKworICBib29sIGlzTGl0dGxlRW5kaWFuKCkgY29uc3QgeyByZXR1cm4gRE9iai0+aXNMaXR0bGVFbmRpYW4oKTsgfQorICBzdGF0aWMgYm9vbCBpc1N1cHBvcnRlZFZlcnNpb24odW5zaWduZWQgdmVyc2lvbikgeworICAgIHJldHVybiB2ZXJzaW9uID09IDIgfHwgdmVyc2lvbiA9PSAzIHx8IHZlcnNpb24gPT0gNCB8fCB2ZXJzaW9uID09IDU7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8RFdBUkZDb250ZXh0PiBnZXREV09Db250ZXh0KFN0cmluZ1JlZiBBYnNvbHV0ZVBhdGgpOworCisgIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICpnZXRSZWdpc3RlckluZm8oKSBjb25zdCB7IHJldHVybiBSZWdJbmZvLmdldCgpOyB9CisKKyAgLy8vIEZ1bmN0aW9uIHVzZWQgdG8gaGFuZGxlIGRlZmF1bHQgZXJyb3IgcmVwb3J0aW5nIHBvbGljeS4gUHJpbnRzIGEgZXJyb3IKKyAgLy8vIG1lc3NhZ2UgYW5kIHJldHVybnMgQ29udGludWUsIHNvIERXQVJGIGNvbnRleHQgaWdub3JlcyB0aGUgZXJyb3IuCisgIHN0YXRpYyBFcnJvclBvbGljeSBkZWZhdWx0RXJyb3JIYW5kbGVyKEVycm9yIEUpOworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPERXQVJGQ29udGV4dD4KKyAgY3JlYXRlKGNvbnN0IG9iamVjdDo6T2JqZWN0RmlsZSAmT2JqLCBjb25zdCBMb2FkZWRPYmplY3RJbmZvICpMID0gbnVsbHB0ciwKKyAgICAgICAgIGZ1bmN0aW9uX3JlZjxFcnJvclBvbGljeShFcnJvcik+IEhhbmRsZUVycm9yID0gZGVmYXVsdEVycm9ySGFuZGxlciwKKyAgICAgICAgIHN0ZDo6c3RyaW5nIERXUE5hbWUgPSAiIik7CisKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxEV0FSRkNvbnRleHQ+CisgIGNyZWF0ZShjb25zdCBTdHJpbmdNYXA8c3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4+ICZTZWN0aW9ucywKKyAgICAgICAgIHVpbnQ4X3QgQWRkclNpemUsIGJvb2wgaXNMaXR0bGVFbmRpYW4gPSBzeXM6OklzTGl0dGxlRW5kaWFuSG9zdCk7CisKKyAgLy8vIExvYWRzIHJlZ2lzdGVyIGluZm8gZm9yIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdCBmaWxlLgorICAvLy8gSW1wcm92ZXMgcmVhZGFiaWxpdHkgb2YgZHVtcGVkIERXQVJGIGV4cHJlc3Npb25zLiBSZXF1aXJlcyB0aGUgY2FsbGVyIHRvCisgIC8vLyBoYXZlIGluaXRpYWxpemVkIHRoZSByZWxldmFudCB0YXJnZXQgZGVzY3JpcHRpb25zLgorICBFcnJvciBsb2FkUmVnaXN0ZXJJbmZvKGNvbnN0IG9iamVjdDo6T2JqZWN0RmlsZSAmT2JqKTsKKworcHJpdmF0ZToKKyAgLy8vIFJldHVybiB0aGUgY29tcGlsZSB1bml0IHRoYXQgaW5jbHVkZXMgYW4gb2Zmc2V0IChyZWxhdGl2ZSB0byAuZGVidWdfaW5mbykuCisgIERXQVJGQ29tcGlsZVVuaXQgKmdldENvbXBpbGVVbml0Rm9yT2Zmc2V0KHVpbnQzMl90IE9mZnNldCk7CisKKyAgLy8vIFJldHVybiB0aGUgY29tcGlsZSB1bml0IHdoaWNoIGNvbnRhaW5zIGluc3RydWN0aW9uIHdpdGggcHJvdmlkZWQKKyAgLy8vIGFkZHJlc3MuCisgIERXQVJGQ29tcGlsZVVuaXQgKmdldENvbXBpbGVVbml0Rm9yQWRkcmVzcyh1aW50NjRfdCBBZGRyZXNzKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkNPTlRFWFRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEYXRhRXh0cmFjdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRhdGFFeHRyYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGUxNDZiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEYXRhRXh0cmFjdG9yLmgKQEAgLTAsMCArMSw1OCBAQAorLy89PT0tIERXQVJGRGF0YUV4dHJhY3Rvci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRkRBVEFFWFRSQUNUT1JfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRkRBVEFFWFRSQUNUT1JfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZTZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFFeHRyYWN0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgRFdBUkZPYmplY3Q7CisKKy8vLyBBIERhdGFFeHRyYWN0b3IgKHR5cGljYWxseSBmb3IgYW4gaW4tbWVtb3J5IGNvcHkgb2YgYW4gb2JqZWN0LWZpbGUgc2VjdGlvbikKKy8vLyBwbHVzIGEgcmVsb2NhdGlvbiBtYXAgZm9yIHRoYXQgc2VjdGlvbiwgaWYgdGhlcmUgaXMgb25lLgorY2xhc3MgRFdBUkZEYXRhRXh0cmFjdG9yIDogcHVibGljIERhdGFFeHRyYWN0b3IgeworICBjb25zdCBEV0FSRk9iamVjdCAqT2JqID0gbnVsbHB0cjsKKyAgY29uc3QgRFdBUkZTZWN0aW9uICpTZWN0aW9uID0gbnVsbHB0cjsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0b3IgZm9yIHRoZSBub3JtYWwgY2FzZSBvZiBleHRyYWN0aW5nIGRhdGEgZnJvbSBhIERXQVJGIHNlY3Rpb24uCisgIC8vLyBUaGUgRFdBUkZTZWN0aW9uJ3MgbGlmZXRpbWUgbXVzdCBiZSBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSBleHRyYWN0b3Incy4KKyAgRFdBUkZEYXRhRXh0cmFjdG9yKGNvbnN0IERXQVJGT2JqZWN0ICZPYmosIGNvbnN0IERXQVJGU2VjdGlvbiAmU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNMaXR0bGVFbmRpYW4sIHVpbnQ4X3QgQWRkcmVzc1NpemUpCisgICAgICA6IERhdGFFeHRyYWN0b3IoU2VjdGlvbi5EYXRhLCBJc0xpdHRsZUVuZGlhbiwgQWRkcmVzc1NpemUpLCBPYmooJk9iaiksCisgICAgICAgIFNlY3Rpb24oJlNlY3Rpb24pIHt9CisKKyAgLy8vIENvbnN0cnVjdG9yIGZvciBjYXNlcyB3aGVuIHRoZXJlIGFyZSBubyByZWxvY2F0aW9ucy4KKyAgRFdBUkZEYXRhRXh0cmFjdG9yKFN0cmluZ1JlZiBEYXRhLCBib29sIElzTGl0dGxlRW5kaWFuLCB1aW50OF90IEFkZHJlc3NTaXplKQorICAgIDogRGF0YUV4dHJhY3RvcihEYXRhLCBJc0xpdHRsZUVuZGlhbiwgQWRkcmVzc1NpemUpIHt9CisKKyAgLy8vIEV4dHJhY3RzIGEgdmFsdWUgYW5kIGFwcGxpZXMgYSByZWxvY2F0aW9uIHRvIHRoZSByZXN1bHQgaWYKKyAgLy8vIG9uZSBleGlzdHMgZm9yIHRoZSBnaXZlbiBvZmZzZXQuCisgIHVpbnQ2NF90IGdldFJlbG9jYXRlZFZhbHVlKHVpbnQzMl90IFNpemUsIHVpbnQzMl90ICpPZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICpTZWN0aW9uSW5kZXggPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gRXh0cmFjdHMgYW4gYWRkcmVzcy1zaXplZCB2YWx1ZSBhbmQgYXBwbGllcyBhIHJlbG9jYXRpb24gdG8gdGhlIHJlc3VsdCBpZgorICAvLy8gb25lIGV4aXN0cyBmb3IgdGhlIGdpdmVuIG9mZnNldC4KKyAgdWludDY0X3QgZ2V0UmVsb2NhdGVkQWRkcmVzcyh1aW50MzJfdCAqT2ZmLCB1aW50NjRfdCAqU2VjSXggPSBudWxscHRyKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFJlbG9jYXRlZFZhbHVlKGdldEFkZHJlc3NTaXplKCksIE9mZiwgU2VjSXgpOworICB9CisKKyAgLy8vIEV4dHJhY3RzIGEgRFdBUkYtZW5jb2RlZCBwb2ludGVyIGluIFxwIE9mZnNldCB1c2luZyBccCBFbmNvZGluZy4KKyAgLy8vIFRoZXJlIGlzIGEgRFdBUkYgZW5jb2RpbmcgdGhhdCB1c2VzIGEgUEMtcmVsYXRpdmUgYWRqdXN0bWVudC4KKyAgLy8vIEZvciB0aGVzZSB2YWx1ZXMsIFxwIEFic1Bvc09mZnNldCBpcyB1c2VkIHRvIGZpeCB0aGVtLCB3aGljaCBzaG91bGQKKyAgLy8vIHJlZmxlY3QgdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YgdGhpcyBwb2ludGVyLgorICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0RW5jb2RlZFBvaW50ZXIodWludDMyX3QgKk9mZnNldCwgdWludDhfdCBFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEFic1Bvc09mZnNldCA9IDApIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGREFUQUVYVFJBQ1RPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnQWJicmV2LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnQWJicmV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI3N2VjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdBYmJyZXYuaApAQCAtMCwwICsxLDg4IEBACisvLz09PS0gRFdBUkZEZWJ1Z0FiYnJldi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0RXQVJGREVCVUdBQkJSRVZfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRkRFQlVHQUJCUkVWX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YUV4dHJhY3Rvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworY2xhc3MgRFdBUkZBYmJyZXZpYXRpb25EZWNsYXJhdGlvblNldCB7CisgIHVpbnQzMl90IE9mZnNldDsKKyAgLy8vIENvZGUgb2YgdGhlIGZpcnN0IGFiYnJldmlhdGlvbiwgaWYgYWxsIGFiYnJldmlhdGlvbnMgaW4gdGhlIHNldCBoYXZlCisgIC8vLyBjb25zZWN1dGl2ZSBjb2Rlcy4gVUlOVDMyX01BWCBvdGhlcndpc2UuCisgIHVpbnQzMl90IEZpcnN0QWJickNvZGU7CisgIHN0ZDo6dmVjdG9yPERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb24+IERlY2xzOworCisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0KKyAgICAgIHN0ZDo6dmVjdG9yPERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb24+Ojpjb25zdF9pdGVyYXRvcjsKKworcHVibGljOgorICBEV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uU2V0KCk7CisKKyAgdWludDMyX3QgZ2V0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gT2Zmc2V0OyB9CisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICBib29sIGV4dHJhY3QoRGF0YUV4dHJhY3RvciBEYXRhLCB1aW50MzJfdCAqT2Zmc2V0UHRyKTsKKworICBjb25zdCBEV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uICoKKyAgZ2V0QWJicmV2aWF0aW9uRGVjbGFyYXRpb24odWludDMyX3QgQWJickNvZGUpIGNvbnN0OworCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBEZWNscy5iZWdpbigpOworICB9CisKKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeworICAgIHJldHVybiBEZWNscy5lbmQoKTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIGNsZWFyKCk7Cit9OworCitjbGFzcyBEV0FSRkRlYnVnQWJicmV2IHsKKyAgdXNpbmcgRFdBUkZBYmJyZXZpYXRpb25EZWNsYXJhdGlvblNldE1hcCA9CisgICAgICBzdGQ6Om1hcDx1aW50NjRfdCwgRFdBUkZBYmJyZXZpYXRpb25EZWNsYXJhdGlvblNldD47CisKKyAgbXV0YWJsZSBEV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uU2V0TWFwIEFiYnJEZWNsU2V0czsKKyAgbXV0YWJsZSBEV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uU2V0TWFwOjpjb25zdF9pdGVyYXRvciBQcmV2QWJick9mZnNldFBvczsKKyAgbXV0YWJsZSBPcHRpb25hbDxEYXRhRXh0cmFjdG9yPiBEYXRhOworCitwdWJsaWM6CisgIERXQVJGRGVidWdBYmJyZXYoKTsKKworICBjb25zdCBEV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uU2V0ICoKKyAgZ2V0QWJicmV2aWF0aW9uRGVjbGFyYXRpb25TZXQodWludDY0X3QgQ1VBYmJyT2Zmc2V0KSBjb25zdDsKKworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgdm9pZCBwYXJzZSgpIGNvbnN0OworICB2b2lkIGV4dHJhY3QoRGF0YUV4dHJhY3RvciBEYXRhKTsKKworICBEV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uU2V0TWFwOjpjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKKyAgICBwYXJzZSgpOworICAgIHJldHVybiBBYmJyRGVjbFNldHMuYmVnaW4oKTsKKyAgfQorCisgIERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb25TZXRNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQWJickRlY2xTZXRzLmVuZCgpOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgY2xlYXIoKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRkRFQlVHQUJCUkVWX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdBcmFuZ2VTZXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdBcmFuZ2VTZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjQ2ZmFjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0FyYW5nZVNldC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8vPT09LSBEV0FSRkRlYnVnQXJhbmdlU2V0LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZERUJVR0FSQU5HRVNFVF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0RXQVJGREVCVUdBUkFOR0VTRVRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YUV4dHJhY3Rvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCitjbGFzcyBEV0FSRkRlYnVnQXJhbmdlU2V0IHsKK3B1YmxpYzoKKyAgc3RydWN0IEhlYWRlciB7CisgICAgLy8vIFRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGVudHJpZXMgZm9yIHRoYXQgc2V0LCBub3QgaW5jbHVkaW5nIHRoZSBsZW5ndGgKKyAgICAvLy8gZmllbGQgaXRzZWxmLgorICAgIHVpbnQzMl90IExlbmd0aDsKKyAgICAvLy8gVGhlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24gb2YgdGhlCisgICAgLy8vIGNvbXBpbGF0aW9uIHVuaXQgZW50cnkgcmVmZXJlbmNlZCBieSB0aGUgdGFibGUuCisgICAgdWludDMyX3QgQ3VPZmZzZXQ7CisgICAgLy8vIFRoZSBEV0FSRiB2ZXJzaW9uIG51bWJlci4KKyAgICB1aW50MTZfdCBWZXJzaW9uOworICAgIC8vLyBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBhZGRyZXNzIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiBGb3Igc2VnbWVudGVkCisgICAgLy8vIGFkZHJlc3NpbmcsIHRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIG9mZnNldCBwb3J0aW9uIG9mIHRoZSBhZGRyZXNzLgorICAgIHVpbnQ4X3QgQWRkclNpemU7CisgICAgLy8vIFRoZSBzaXplIGluIGJ5dGVzIG9mIGEgc2VnbWVudCBkZXNjcmlwdG9yIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgorICAgIC8vLyBJZiB0aGUgdGFyZ2V0IHN5c3RlbSB1c2VzIGEgZmxhdCBhZGRyZXNzIHNwYWNlLCB0aGlzIHZhbHVlIGlzIDAuCisgICAgdWludDhfdCBTZWdTaXplOworICB9OworCisgIHN0cnVjdCBEZXNjcmlwdG9yIHsKKyAgICB1aW50NjRfdCBBZGRyZXNzOworICAgIHVpbnQ2NF90IExlbmd0aDsKKworICAgIHVpbnQ2NF90IGdldEVuZEFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBBZGRyZXNzICsgTGVuZ3RoOyB9CisgICAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUywgdWludDMyX3QgQWRkcmVzc1NpemUpIGNvbnN0OworICB9OworCitwcml2YXRlOgorICB1c2luZyBEZXNjcmlwdG9yQ29sbCA9IHN0ZDo6dmVjdG9yPERlc2NyaXB0b3I+OworICB1c2luZyBkZXNjX2l0ZXJhdG9yX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8RGVzY3JpcHRvckNvbGw6OmNvbnN0X2l0ZXJhdG9yPjsKKworICB1aW50MzJfdCBPZmZzZXQ7CisgIEhlYWRlciBIZWFkZXJEYXRhOworICBEZXNjcmlwdG9yQ29sbCBBcmFuZ2VEZXNjcmlwdG9yczsKKworcHVibGljOgorICBEV0FSRkRlYnVnQXJhbmdlU2V0KCkgeyBjbGVhcigpOyB9CisKKyAgdm9pZCBjbGVhcigpOworICBib29sIGV4dHJhY3QoRGF0YUV4dHJhY3RvciBkYXRhLCB1aW50MzJfdCAqb2Zmc2V0X3B0cik7CisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIHVpbnQzMl90IGdldENvbXBpbGVVbml0RElFT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gSGVhZGVyRGF0YS5DdU9mZnNldDsgfQorCisgIGNvbnN0IEhlYWRlciAmZ2V0SGVhZGVyKCkgY29uc3QgeyByZXR1cm4gSGVhZGVyRGF0YTsgfQorCisgIGRlc2NfaXRlcmF0b3JfcmFuZ2UgZGVzY3JpcHRvcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGRlc2NfaXRlcmF0b3JfcmFuZ2UoQXJhbmdlRGVzY3JpcHRvcnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmFuZ2VEZXNjcmlwdG9ycy5lbmQoKSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRkRFQlVHQVJBTkdFU0VUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdBcmFuZ2VzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnQXJhbmdlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNzFhNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnQXJhbmdlcy5oCkBAIC0wLDAgKzEsODkgQEAKKy8vPT09LSBEV0FSRkRlYnVnQXJhbmdlcy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZERUJVR0FSQU5HRVNfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRkRFQlVHQVJBTkdFU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhRXh0cmFjdG9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRFdBUkZDb250ZXh0OworCitjbGFzcyBEV0FSRkRlYnVnQXJhbmdlcyB7CitwdWJsaWM6CisgIHZvaWQgZ2VuZXJhdGUoRFdBUkZDb250ZXh0ICpDVFgpOworICB1aW50MzJfdCBmaW5kQWRkcmVzcyh1aW50NjRfdCBBZGRyZXNzKSBjb25zdDsKKworcHJpdmF0ZToKKyAgdm9pZCBjbGVhcigpOworICB2b2lkIGV4dHJhY3QoRGF0YUV4dHJhY3RvciBEZWJ1Z0FyYW5nZXNEYXRhKTsKKworICAvLy8gQ2FsbCBhcHBlbmRSYW5nZSBtdWx0aXBsZSB0aW1lcyBhbmQgdGhlbiBjYWxsIGNvbnN0cnVjdC4KKyAgdm9pZCBhcHBlbmRSYW5nZSh1aW50MzJfdCBDVU9mZnNldCwgdWludDY0X3QgTG93UEMsIHVpbnQ2NF90IEhpZ2hQQyk7CisgIHZvaWQgY29uc3RydWN0KCk7CisKKyAgc3RydWN0IFJhbmdlIHsKKyAgICBleHBsaWNpdCBSYW5nZSh1aW50NjRfdCBMb3dQQyA9IC0xVUxMLCB1aW50NjRfdCBIaWdoUEMgPSAtMVVMTCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDVU9mZnNldCA9IC0xVSkKKyAgICAgIDogTG93UEMoTG93UEMpLCBMZW5ndGgoSGlnaFBDIC0gTG93UEMpLCBDVU9mZnNldChDVU9mZnNldCkge30KKworICAgIHZvaWQgc2V0SGlnaFBDKHVpbnQ2NF90IEhpZ2hQQykgeworICAgICAgaWYgKEhpZ2hQQyA9PSAtMVVMTCB8fCBIaWdoUEMgPD0gTG93UEMpCisgICAgICAgIExlbmd0aCA9IDA7CisgICAgICBlbHNlCisgICAgICAgIExlbmd0aCA9IEhpZ2hQQyAtIExvd1BDOworICAgIH0KKworICAgIHVpbnQ2NF90IEhpZ2hQQygpIGNvbnN0IHsKKyAgICAgIGlmIChMZW5ndGgpCisgICAgICAgIHJldHVybiBMb3dQQyArIExlbmd0aDsKKyAgICAgIHJldHVybiAtMVVMTDsKKyAgICB9CisKKyAgICBib29sIGNvbnRhaW5zQWRkcmVzcyh1aW50NjRfdCBBZGRyZXNzKSBjb25zdCB7CisgICAgICByZXR1cm4gTG93UEMgPD0gQWRkcmVzcyAmJiBBZGRyZXNzIDwgSGlnaFBDKCk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUmFuZ2UgJm90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gTG93UEMgPCBvdGhlci5Mb3dQQzsKKyAgICB9CisKKyAgICB1aW50NjRfdCBMb3dQQzsgLy8vIFN0YXJ0IG9mIGFkZHJlc3MgcmFuZ2UuCisgICAgdWludDMyX3QgTGVuZ3RoOyAvLy8gRW5kIG9mIGFkZHJlc3MgcmFuZ2UgKG5vdCBpbmNsdWRpbmcgdGhpcyBhZGRyZXNzKS4KKyAgICB1aW50MzJfdCBDVU9mZnNldDsgLy8vIE9mZnNldCBvZiB0aGUgY29tcGlsZSB1bml0IG9yIGRpZS4KKyAgfTsKKworICBzdHJ1Y3QgUmFuZ2VFbmRwb2ludCB7CisgICAgdWludDY0X3QgQWRkcmVzczsKKyAgICB1aW50MzJfdCBDVU9mZnNldDsKKyAgICBib29sIElzUmFuZ2VTdGFydDsKKworICAgIFJhbmdlRW5kcG9pbnQodWludDY0X3QgQWRkcmVzcywgdWludDMyX3QgQ1VPZmZzZXQsIGJvb2wgSXNSYW5nZVN0YXJ0KQorICAgICAgICA6IEFkZHJlc3MoQWRkcmVzcyksIENVT2Zmc2V0KENVT2Zmc2V0KSwgSXNSYW5nZVN0YXJ0KElzUmFuZ2VTdGFydCkge30KKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFJhbmdlRW5kcG9pbnQgJk90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gQWRkcmVzcyA8IE90aGVyLkFkZHJlc3M7CisgICAgfQorICB9OworCisgIHVzaW5nIFJhbmdlQ29sbCA9IHN0ZDo6dmVjdG9yPFJhbmdlPjsKKyAgdXNpbmcgUmFuZ2VDb2xsSXRlcmF0b3IgPSBSYW5nZUNvbGw6OmNvbnN0X2l0ZXJhdG9yOworCisgIHN0ZDo6dmVjdG9yPFJhbmdlRW5kcG9pbnQ+IEVuZHBvaW50czsKKyAgUmFuZ2VDb2xsIEFyYW5nZXM7CisgIERlbnNlU2V0PHVpbnQzMl90PiBQYXJzZWRDVU9mZnNldHM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fRFdBUkZERUJVR0FSQU5HRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0ZyYW1lLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnRnJhbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjFjN2ZiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0ZyYW1lLmgKQEAgLTAsMCArMSwzMDEgQEAKKy8vPT09LSBEV0FSRkRlYnVnRnJhbWUuaCAtIFBhcnNpbmcgb2YgLmRlYnVnX2ZyYW1lIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZERUJVR0ZSQU1FX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZERUJVR0ZSQU1FX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGF0YUV4dHJhY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBkd2FyZiB7CisKKy8vLyBSZXByZXNlbnQgYSBzZXF1ZW5jZSBvZiBDYWxsIEZyYW1lIEluZm9ybWF0aW9uIGluc3RydWN0aW9ucyB0aGF0LCB3aGVuIHJlYWQKKy8vLyBpbiBvcmRlciwgY29uc3RydWN0IGEgdGFibGUgbWFwcGluZyBQQyB0byBmcmFtZSBzdGF0ZS4gVGhpcyBjYW4gYWxzbyBiZQorLy8vIHJlZmVycmVkIHRvIGFzICJDRkkgcnVsZXMiIGluIERXQVJGIGxpdGVyYXR1cmUgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGgKKy8vLyBjb21wdXRlciBwcm9ncmFtcyBpbiB0aGUgYnJvYWRlciBzZW5zZSwgYW5kIGluIHRoaXMgY29udGV4dCBlYWNoIGluc3RydWN0aW9uCisvLy8gd291bGQgYmUgYSBydWxlIHRvIGVzdGFibGlzaCB0aGUgbWFwcGluZy4gUmVmZXIgdG8gcGcuIDE3MiBpbiB0aGUgRFdBUkY1CisvLy8gbWFudWFsLCAiNi40LjEgU3RydWN0dXJlIG9mIENhbGwgRnJhbWUgSW5mb3JtYXRpb24iLgorY2xhc3MgQ0ZJUHJvZ3JhbSB7CitwdWJsaWM6CisgIHR5cGVkZWYgU21hbGxWZWN0b3I8dWludDY0X3QsIDI+IE9wZXJhbmRzOworCisgIC8vLyBBbiBpbnN0cnVjdGlvbiBjb25zaXN0cyBvZiBhIERXQVJGIENGSSBvcGNvZGUgYW5kIGFuIG9wdGlvbmFsIHNlcXVlbmNlIG9mCisgIC8vLyBvcGVyYW5kcy4gSWYgaXQgcmVmZXJzIHRvIGFuIGV4cHJlc3Npb24sIHRoZW4gdGhpcyBleHByZXNzaW9uIGhhcyBpdHMgb3duCisgIC8vLyBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGFuZCBvcGVyYW5kcyBoYW5kbGVkIHNlcGFyYXRlbHkgYnkgRFdBUkZFeHByZXNzaW9uLgorICBzdHJ1Y3QgSW5zdHJ1Y3Rpb24geworICAgIEluc3RydWN0aW9uKHVpbnQ4X3QgT3Bjb2RlKSA6IE9wY29kZShPcGNvZGUpIHt9CisKKyAgICB1aW50OF90IE9wY29kZTsKKyAgICBPcGVyYW5kcyBPcHM7CisgICAgLy8gQXNzb2NpYXRlZCBEV0FSRiBleHByZXNzaW9uIGluIGNhc2UgdGhpcyBpbnN0cnVjdGlvbiByZWZlcnMgdG8gb25lCisgICAgT3B0aW9uYWw8RFdBUkZFeHByZXNzaW9uPiBFeHByZXNzaW9uOworICB9OworCisgIHVzaW5nIEluc3RyTGlzdCA9IHN0ZDo6dmVjdG9yPEluc3RydWN0aW9uPjsKKyAgdXNpbmcgaXRlcmF0b3IgPSBJbnN0ckxpc3Q6Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IEluc3RyTGlzdDo6Y29uc3RfaXRlcmF0b3I7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBJbnN0cnVjdGlvbnMuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEluc3RydWN0aW9ucy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIEluc3RydWN0aW9ucy5lbmQoKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBJbnN0cnVjdGlvbnMuZW5kKCk7IH0KKworICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gKHVuc2lnbmVkKUluc3RydWN0aW9ucy5zaXplKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEluc3RydWN0aW9ucy5lbXB0eSgpOyB9CisKKyAgQ0ZJUHJvZ3JhbSh1aW50NjRfdCBDb2RlQWxpZ25tZW50RmFjdG9yLCBpbnQ2NF90IERhdGFBbGlnbm1lbnRGYWN0b3IpCisgICAgICA6IENvZGVBbGlnbm1lbnRGYWN0b3IoQ29kZUFsaWdubWVudEZhY3RvciksCisgICAgICAgIERhdGFBbGlnbm1lbnRGYWN0b3IoRGF0YUFsaWdubWVudEZhY3Rvcikge30KKworICAvLy8gUGFyc2UgYW5kIHN0b3JlIGEgc2VxdWVuY2Ugb2YgQ0ZJIGluc3RydWN0aW9ucyBmcm9tIERhdGEsCisgIC8vLyBzdGFydGluZyBhdCAqT2Zmc2V0IGFuZCBlbmRpbmcgYXQgRW5kT2Zmc2V0LiAqT2Zmc2V0IGlzIHVwZGF0ZWQKKyAgLy8vIHRvIEVuZE9mZnNldCB1cG9uIHN1Y2Nlc3NmdWwgcGFyc2luZywgb3IgaW5kaWNhdGVzIHRoZSBvZmZzZXQKKyAgLy8vIHdoZXJlIGEgcHJvYmxlbSBvY2N1cnJlZCBpbiBjYXNlIGFuIGVycm9yIGlzIHJldHVybmVkLgorICBFcnJvciBwYXJzZShEYXRhRXh0cmFjdG9yIERhdGEsIHVpbnQzMl90ICpPZmZzZXQsIHVpbnQzMl90IEVuZE9mZnNldCk7CisKKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUywgY29uc3QgTUNSZWdpc3RlckluZm8gKk1SSSwgYm9vbCBJc0VILAorICAgICAgICAgICAgdW5zaWduZWQgSW5kZW50TGV2ZWwgPSAxKSBjb25zdDsKKworcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8SW5zdHJ1Y3Rpb24+IEluc3RydWN0aW9uczsKKyAgY29uc3QgdWludDY0X3QgQ29kZUFsaWdubWVudEZhY3RvcjsKKyAgY29uc3QgaW50NjRfdCBEYXRhQWxpZ25tZW50RmFjdG9yOworCisgIC8vLyBDb252ZW5pZW5jZSBtZXRob2QgdG8gYWRkIGEgbmV3IGluc3RydWN0aW9uIHdpdGggdGhlIGdpdmVuIG9wY29kZS4KKyAgdm9pZCBhZGRJbnN0cnVjdGlvbih1aW50OF90IE9wY29kZSkgeworICAgIEluc3RydWN0aW9ucy5wdXNoX2JhY2soSW5zdHJ1Y3Rpb24oT3Bjb2RlKSk7CisgIH0KKworICAvLy8gQWRkIGEgbmV3IHNpbmdsZS1vcGVyYW5kIGluc3RydWN0aW9uLgorICB2b2lkIGFkZEluc3RydWN0aW9uKHVpbnQ4X3QgT3Bjb2RlLCB1aW50NjRfdCBPcGVyYW5kMSkgeworICAgIEluc3RydWN0aW9ucy5wdXNoX2JhY2soSW5zdHJ1Y3Rpb24oT3Bjb2RlKSk7CisgICAgSW5zdHJ1Y3Rpb25zLmJhY2soKS5PcHMucHVzaF9iYWNrKE9wZXJhbmQxKTsKKyAgfQorCisgIC8vLyBBZGQgYSBuZXcgaW5zdHJ1Y3Rpb24gdGhhdCBoYXMgdHdvIG9wZXJhbmRzLgorICB2b2lkIGFkZEluc3RydWN0aW9uKHVpbnQ4X3QgT3Bjb2RlLCB1aW50NjRfdCBPcGVyYW5kMSwgdWludDY0X3QgT3BlcmFuZDIpIHsKKyAgICBJbnN0cnVjdGlvbnMucHVzaF9iYWNrKEluc3RydWN0aW9uKE9wY29kZSkpOworICAgIEluc3RydWN0aW9ucy5iYWNrKCkuT3BzLnB1c2hfYmFjayhPcGVyYW5kMSk7CisgICAgSW5zdHJ1Y3Rpb25zLmJhY2soKS5PcHMucHVzaF9iYWNrKE9wZXJhbmQyKTsKKyAgfQorCisgIC8vLyBUeXBlcyBvZiBvcGVyYW5kcyB0byBDRkkgaW5zdHJ1Y3Rpb25zCisgIC8vLyBJbiBEV0FSRiwgdGhpcyB0eXBlIGlzIGltcGxpY2l0bHkgdGllZCB0byBhIENGSSBpbnN0cnVjdGlvbiBvcGNvZGUgYW5kCisgIC8vLyB0aHVzIHRoaXMgdHlwZSBkb2Vzbid0IG5lZWQgdG8gYmUgZXhwbGljdGx5IHdyaXR0ZW4gdG8gdGhlIGZpbGUgKHRoaXMgaXMKKyAgLy8vIG5vdCBhIERXQVJGIGVuY29kaW5nKS4gVGhlIHJlbGF0aW9uc2hpcCBvZiBpbnN0cnMgdG8gb3BlcmFuZCB0eXBlcyBjYW4KKyAgLy8vIGJlIG9idGFpbmVkIGZyb20gZ2V0T3BlcmFuZFR5cGVzKCkgYW5kIGlzIG9ubHkgdXNlZCB0byBzaW1wbGlmeQorICAvLy8gaW5zdHJ1Y3Rpb24gcHJpbnRpbmcuCisgIGVudW0gT3BlcmFuZFR5cGUgeworICAgIE9UX1Vuc2V0LAorICAgIE9UX05vbmUsCisgICAgT1RfQWRkcmVzcywKKyAgICBPVF9PZmZzZXQsCisgICAgT1RfRmFjdG9yZWRDb2RlT2Zmc2V0LAorICAgIE9UX1NpZ25lZEZhY3REYXRhT2Zmc2V0LAorICAgIE9UX1Vuc2lnbmVkRmFjdERhdGFPZmZzZXQsCisgICAgT1RfUmVnaXN0ZXIsCisgICAgT1RfRXhwcmVzc2lvbgorICB9OworCisgIC8vLyBSZXRyaWV2ZSB0aGUgYXJyYXkgZGVzY3JpYmluZyB0aGUgdHlwZXMgb2Ygb3BlcmFuZHMgYWNjb3JkaW5nIHRvIHRoZSBlbnVtCisgIC8vLyBhYm92ZS4gVGhpcyBpcyBpbmRleGVkIGJ5IG9wY29kZS4KKyAgc3RhdGljIEFycmF5UmVmPE9wZXJhbmRUeXBlWzJdPiBnZXRPcGVyYW5kVHlwZXMoKTsKKworICAvLy8gUHJpbnQgXHAgT3Bjb2RlJ3Mgb3BlcmFuZCBudW1iZXIgXHAgT3BlcmFuZElkeCB3aGljaCBoYXMgdmFsdWUgXHAgT3BlcmFuZC4KKyAgdm9pZCBwcmludE9wZXJhbmQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqTVJJLCBib29sIElzRUgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICZJbnN0ciwgdW5zaWduZWQgT3BlcmFuZElkeCwKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT3BlcmFuZCkgY29uc3Q7Cit9OworCisvLy8gQW4gZW50cnkgaW4gZWl0aGVyIGRlYnVnX2ZyYW1lIG9yIGVoX2ZyYW1lLiBUaGlzIGVudHJ5IGNhbiBiZSBhIENJRSBvciBhbgorLy8vIEZERS4KK2NsYXNzIEZyYW1lRW50cnkgeworcHVibGljOgorICBlbnVtIEZyYW1lS2luZCB7IEZLX0NJRSwgRktfRkRFIH07CisKKyAgRnJhbWVFbnRyeShGcmFtZUtpbmQgSywgdWludDY0X3QgT2Zmc2V0LCB1aW50NjRfdCBMZW5ndGgsIHVpbnQ2NF90IENvZGVBbGlnbiwKKyAgICAgICAgICAgICBpbnQ2NF90IERhdGFBbGlnbikKKyAgICAgIDogS2luZChLKSwgT2Zmc2V0KE9mZnNldCksIExlbmd0aChMZW5ndGgpLCBDRklzKENvZGVBbGlnbiwgRGF0YUFsaWduKSB7fQorCisgIHZpcnR1YWwgfkZyYW1lRW50cnkoKSB7fQorCisgIEZyYW1lS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorICB1aW50NjRfdCBnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBPZmZzZXQ7IH0KKyAgdWludDY0X3QgZ2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gTGVuZ3RoOyB9CisgIGNvbnN0IENGSVByb2dyYW0gJmNmaXMoKSBjb25zdCB7IHJldHVybiBDRklzOyB9CisgIENGSVByb2dyYW0gJmNmaXMoKSB7IHJldHVybiBDRklzOyB9CisKKyAgLy8vIER1bXAgdGhlIGluc3RydWN0aW9ucyBpbiB0aGlzIENGSSBmcmFnbWVudAorICB2aXJ0dWFsIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICpNUkksCisgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNFSCkgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgIGNvbnN0IEZyYW1lS2luZCBLaW5kOworCisgIC8vLyBPZmZzZXQgb2YgdGhpcyBlbnRyeSBpbiB0aGUgc2VjdGlvbi4KKyAgY29uc3QgdWludDY0X3QgT2Zmc2V0OworCisgIC8vLyBFbnRyeSBsZW5ndGggYXMgc3BlY2lmaWVkIGluIERXQVJGLgorICBjb25zdCB1aW50NjRfdCBMZW5ndGg7CisKKyAgQ0ZJUHJvZ3JhbSBDRklzOworfTsKKworLy8vIERXQVJGIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeSAoQ0lFKQorY2xhc3MgQ0lFIDogcHVibGljIEZyYW1lRW50cnkgeworcHVibGljOgorICAvLyBDSUVzIChhbmQgRkRFcykgYXJlIHNpbXBseSBjb250YWluZXIgY2xhc3Nlcywgc28gdGhlIG9ubHkgc2Vuc2libGUgd2F5IHRvCisgIC8vIGNyZWF0ZSB0aGVtIGlzIGJ5IHByb3ZpZGluZyB0aGUgZnVsbCBwYXJzZWQgY29udGVudHMgaW4gdGhlIGNvbnN0cnVjdG9yLgorICBDSUUodWludDY0X3QgT2Zmc2V0LCB1aW50NjRfdCBMZW5ndGgsIHVpbnQ4X3QgVmVyc2lvbiwKKyAgICAgIFNtYWxsU3RyaW5nPDg+IEF1Z21lbnRhdGlvbiwgdWludDhfdCBBZGRyZXNzU2l6ZSwKKyAgICAgIHVpbnQ4X3QgU2VnbWVudERlc2NyaXB0b3JTaXplLCB1aW50NjRfdCBDb2RlQWxpZ25tZW50RmFjdG9yLAorICAgICAgaW50NjRfdCBEYXRhQWxpZ25tZW50RmFjdG9yLCB1aW50NjRfdCBSZXR1cm5BZGRyZXNzUmVnaXN0ZXIsCisgICAgICBTbWFsbFN0cmluZzw4PiBBdWdtZW50YXRpb25EYXRhLCB1aW50MzJfdCBGREVQb2ludGVyRW5jb2RpbmcsCisgICAgICB1aW50MzJfdCBMU0RBUG9pbnRlckVuY29kaW5nLCBPcHRpb25hbDx1aW50NjRfdD4gUGVyc29uYWxpdHksCisgICAgICBPcHRpb25hbDx1aW50MzJfdD4gUGVyc29uYWxpdHlFbmMpCisgICAgICA6IEZyYW1lRW50cnkoRktfQ0lFLCBPZmZzZXQsIExlbmd0aCwgQ29kZUFsaWdubWVudEZhY3RvciwKKyAgICAgICAgICAgICAgICAgICBEYXRhQWxpZ25tZW50RmFjdG9yKSwKKyAgICAgICAgVmVyc2lvbihWZXJzaW9uKSwgQXVnbWVudGF0aW9uKHN0ZDo6bW92ZShBdWdtZW50YXRpb24pKSwKKyAgICAgICAgQWRkcmVzc1NpemUoQWRkcmVzc1NpemUpLCBTZWdtZW50RGVzY3JpcHRvclNpemUoU2VnbWVudERlc2NyaXB0b3JTaXplKSwKKyAgICAgICAgQ29kZUFsaWdubWVudEZhY3RvcihDb2RlQWxpZ25tZW50RmFjdG9yKSwKKyAgICAgICAgRGF0YUFsaWdubWVudEZhY3RvcihEYXRhQWxpZ25tZW50RmFjdG9yKSwKKyAgICAgICAgUmV0dXJuQWRkcmVzc1JlZ2lzdGVyKFJldHVybkFkZHJlc3NSZWdpc3RlciksCisgICAgICAgIEF1Z21lbnRhdGlvbkRhdGEoc3RkOjptb3ZlKEF1Z21lbnRhdGlvbkRhdGEpKSwKKyAgICAgICAgRkRFUG9pbnRlckVuY29kaW5nKEZERVBvaW50ZXJFbmNvZGluZyksCisgICAgICAgIExTREFQb2ludGVyRW5jb2RpbmcoTFNEQVBvaW50ZXJFbmNvZGluZyksIFBlcnNvbmFsaXR5KFBlcnNvbmFsaXR5KSwKKyAgICAgICAgUGVyc29uYWxpdHlFbmMoUGVyc29uYWxpdHlFbmMpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBGcmFtZUVudHJ5ICpGRSkgeyByZXR1cm4gRkUtPmdldEtpbmQoKSA9PSBGS19DSUU7IH0KKworICBTdHJpbmdSZWYgZ2V0QXVnbWVudGF0aW9uU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gQXVnbWVudGF0aW9uOyB9CisgIHVpbnQ2NF90IGdldENvZGVBbGlnbm1lbnRGYWN0b3IoKSBjb25zdCB7IHJldHVybiBDb2RlQWxpZ25tZW50RmFjdG9yOyB9CisgIGludDY0X3QgZ2V0RGF0YUFsaWdubWVudEZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIERhdGFBbGlnbm1lbnRGYWN0b3I7IH0KKyAgdWludDhfdCBnZXRWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gVmVyc2lvbjsgfQorICB1aW50NjRfdCBnZXRSZXR1cm5BZGRyZXNzUmVnaXN0ZXIoKSBjb25zdCB7IHJldHVybiBSZXR1cm5BZGRyZXNzUmVnaXN0ZXI7IH0KKyAgT3B0aW9uYWw8dWludDY0X3Q+IGdldFBlcnNvbmFsaXR5QWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIFBlcnNvbmFsaXR5OyB9CisgIE9wdGlvbmFsPHVpbnQzMl90PiBnZXRQZXJzb25hbGl0eUVuY29kaW5nKCkgY29uc3QgeyByZXR1cm4gUGVyc29uYWxpdHlFbmM7IH0KKworICB1aW50MzJfdCBnZXRGREVQb2ludGVyRW5jb2RpbmcoKSBjb25zdCB7IHJldHVybiBGREVQb2ludGVyRW5jb2Rpbmc7IH0KKworICB1aW50MzJfdCBnZXRMU0RBUG9pbnRlckVuY29kaW5nKCkgY29uc3QgeyByZXR1cm4gTFNEQVBvaW50ZXJFbmNvZGluZzsgfQorCisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICpNUkksCisgICAgICAgICAgICBib29sIElzRUgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAvLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIGRlZmluZWQgaW4gc2VjdGlvbiA2LjQuMSBvZiB0aGUgRFdBUkYgc3RhbmRhcmQgdjQKKyAgY29uc3QgdWludDhfdCBWZXJzaW9uOworICBjb25zdCBTbWFsbFN0cmluZzw4PiBBdWdtZW50YXRpb247CisgIGNvbnN0IHVpbnQ4X3QgQWRkcmVzc1NpemU7CisgIGNvbnN0IHVpbnQ4X3QgU2VnbWVudERlc2NyaXB0b3JTaXplOworICBjb25zdCB1aW50NjRfdCBDb2RlQWxpZ25tZW50RmFjdG9yOworICBjb25zdCBpbnQ2NF90IERhdGFBbGlnbm1lbnRGYWN0b3I7CisgIGNvbnN0IHVpbnQ2NF90IFJldHVybkFkZHJlc3NSZWdpc3RlcjsKKworICAvLyBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIHdoZW4gdGhlIENJRSByZXByZXNlbnRzIGFuIEVIIGZyYW1lIGVudHJ5LgorICBjb25zdCBTbWFsbFN0cmluZzw4PiBBdWdtZW50YXRpb25EYXRhOworICBjb25zdCB1aW50MzJfdCBGREVQb2ludGVyRW5jb2Rpbmc7CisgIGNvbnN0IHVpbnQzMl90IExTREFQb2ludGVyRW5jb2Rpbmc7CisgIGNvbnN0IE9wdGlvbmFsPHVpbnQ2NF90PiBQZXJzb25hbGl0eTsKKyAgY29uc3QgT3B0aW9uYWw8dWludDMyX3Q+IFBlcnNvbmFsaXR5RW5jOworfTsKKworLy8vIERXQVJGIEZyYW1lIERlc2NyaXB0aW9uIEVudHJ5IChGREUpCitjbGFzcyBGREUgOiBwdWJsaWMgRnJhbWVFbnRyeSB7CitwdWJsaWM6CisgIC8vIEVhY2ggRkRFIGhhcyBhIENJRSBpdCdzICJsaW5rZWQgdG8iLiBPdXIgRkRFIGNvbnRhaW5zIGlzIGNvbnN0cnVjdGVkIHdpdGgKKyAgLy8gYW4gb2Zmc2V0IHRvIHRoZSBDSUUgKHByb3ZpZGVkIGJ5IHBhcnNpbmcgdGhlIEZERSBoZWFkZXIpLiBUaGUgQ0lFIGl0c2VsZgorICAvLyBpcyBvYnRhaW5lZCBsYXppbHkgb25jZSBpdCdzIGFjdHVhbGx5IHJlcXVpcmVkLgorICBGREUodWludDY0X3QgT2Zmc2V0LCB1aW50NjRfdCBMZW5ndGgsIGludDY0X3QgTGlua2VkQ0lFT2Zmc2V0LAorICAgICAgdWludDY0X3QgSW5pdGlhbExvY2F0aW9uLCB1aW50NjRfdCBBZGRyZXNzUmFuZ2UsIENJRSAqQ2llLAorICAgICAgT3B0aW9uYWw8dWludDY0X3Q+IExTREFBZGRyZXNzKQorICAgICAgOiBGcmFtZUVudHJ5KEZLX0ZERSwgT2Zmc2V0LCBMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgQ2llID8gQ2llLT5nZXRDb2RlQWxpZ25tZW50RmFjdG9yKCkgOiAwLAorICAgICAgICAgICAgICAgICAgIENpZSA/IENpZS0+Z2V0RGF0YUFsaWdubWVudEZhY3RvcigpIDogMCksCisgICAgICAgIExpbmtlZENJRU9mZnNldChMaW5rZWRDSUVPZmZzZXQpLCBJbml0aWFsTG9jYXRpb24oSW5pdGlhbExvY2F0aW9uKSwKKyAgICAgICAgQWRkcmVzc1JhbmdlKEFkZHJlc3NSYW5nZSksIExpbmtlZENJRShDaWUpLCBMU0RBQWRkcmVzcyhMU0RBQWRkcmVzcykge30KKworICB+RkRFKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIGNvbnN0IENJRSAqZ2V0TGlua2VkQ0lFKCkgY29uc3QgeyByZXR1cm4gTGlua2VkQ0lFOyB9CisgIHVpbnQ2NF90IGdldEluaXRpYWxMb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIEluaXRpYWxMb2NhdGlvbjsgfQorICB1aW50NjRfdCBnZXRBZGRyZXNzUmFuZ2UoKSBjb25zdCB7IHJldHVybiBBZGRyZXNzUmFuZ2U7IH0KKyAgT3B0aW9uYWw8dWludDY0X3Q+IGdldExTREFBZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gTFNEQUFkZHJlc3M7IH0KKworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqTVJJLAorICAgICAgICAgICAgYm9vbCBJc0VIKSBjb25zdCBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEZyYW1lRW50cnkgKkZFKSB7IHJldHVybiBGRS0+Z2V0S2luZCgpID09IEZLX0ZERTsgfQorCitwcml2YXRlOgorICAvLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIGRlZmluZWQgaW4gc2VjdGlvbiA2LjQuMSBvZiB0aGUgRFdBUkYgc3RhbmRhcmQgdjMKKyAgY29uc3QgdWludDY0X3QgTGlua2VkQ0lFT2Zmc2V0OworICBjb25zdCB1aW50NjRfdCBJbml0aWFsTG9jYXRpb247CisgIGNvbnN0IHVpbnQ2NF90IEFkZHJlc3NSYW5nZTsKKyAgY29uc3QgQ0lFICpMaW5rZWRDSUU7CisgIGNvbnN0IE9wdGlvbmFsPHVpbnQ2NF90PiBMU0RBQWRkcmVzczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkd2FyZgorCisvLy8gQSBwYXJzZWQgLmRlYnVnX2ZyYW1lIG9yIC5laF9mcmFtZSBzZWN0aW9uCitjbGFzcyBEV0FSRkRlYnVnRnJhbWUgeworICAvLyBUcnVlIGlmIHRoaXMgaXMgcGFyc2luZyBhbiBlaF9mcmFtZSBzZWN0aW9uLgorICBjb25zdCBib29sIElzRUg7CisgIC8vIE5vdCB6ZXJvIGZvciBzYW5lIHBvaW50ZXIgdmFsdWVzIGNvbWluZyBvdXQgb2YgZWhfZnJhbWUKKyAgY29uc3QgdWludDY0X3QgRUhGcmFtZUFkZHJlc3M7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGR3YXJmOjpGcmFtZUVudHJ5Pj4gRW50cmllczsKKyAgdXNpbmcgaXRlcmF0b3IgPSBwb2ludGVlX2l0ZXJhdG9yPGRlY2x0eXBlKEVudHJpZXMpOjpjb25zdF9pdGVyYXRvcj47CisKKyAgLy8vIFJldHVybiB0aGUgZW50cnkgYXQgdGhlIGdpdmVuIG9mZnNldCBvciBudWxscHRyLgorICBkd2FyZjo6RnJhbWVFbnRyeSAqZ2V0RW50cnlBdE9mZnNldCh1aW50NjRfdCBPZmZzZXQpIGNvbnN0OworCitwdWJsaWM6CisgIC8vIElmIElzRUggaXMgdHJ1ZSwgYXNzdW1lIGl0IGlzIGEgLmVoX2ZyYW1lIHNlY3Rpb24uIE90aGVyd2lzZSwKKyAgLy8gaXQgaXMgYSAuZGVidWdfZnJhbWUgc2VjdGlvbi4gRUhGcmFtZUFkZHJlc3Mgc2hvdWxkIGJlIGRpZmZlcmVudAorICAvLyB0aGFuIHplcm8gZm9yIGNvcnJlY3QgcGFyc2luZyBvZiAuZWhfZnJhbWUgYWRkcmVzc2VzIHdoZW4gdGhleQorICAvLyB1c2UgYSBQQy1yZWxhdGl2ZSBlbmNvZGluZy4KKyAgRFdBUkZEZWJ1Z0ZyYW1lKGJvb2wgSXNFSCA9IGZhbHNlLCB1aW50NjRfdCBFSEZyYW1lQWRkcmVzcyA9IDApOworICB+RFdBUkZEZWJ1Z0ZyYW1lKCk7CisKKyAgLy8vIER1bXAgdGhlIHNlY3Rpb24gZGF0YSBpbnRvIHRoZSBnaXZlbiBzdHJlYW0uCisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICpNUkksCisgICAgICAgICAgICBPcHRpb25hbDx1aW50NjRfdD4gT2Zmc2V0KSBjb25zdDsKKworICAvLy8gUGFyc2UgdGhlIHNlY3Rpb24gZnJvbSByYXcgZGF0YS4gXHAgRGF0YSBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gdGhlIHdob2xlCisgIC8vLyBmcmFtZSBzZWN0aW9uIGNvbnRlbnRzIHRvIGJlIHBhcnNlZC4KKyAgdm9pZCBwYXJzZShEV0FSRkRhdGFFeHRyYWN0b3IgRGF0YSk7CisKKyAgLy8vIFJldHVybiB3aGV0aGVyIHRoZSBzZWN0aW9uIGhhcyBhbnkgZW50cmllcy4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEVudHJpZXMuZW1wdHkoKTsgfQorCisgIC8vLyBEV0FSRiBGcmFtZSBlbnRyaWVzIGFjY2Vzc29ycworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEVudHJpZXMuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBFbnRyaWVzLmVuZCgpOyB9CisgIGl0ZXJhdG9yX3JhbmdlPGl0ZXJhdG9yPiBlbnRyaWVzKCkgY29uc3QgeworICAgIHJldHVybiBpdGVyYXRvcl9yYW5nZTxpdGVyYXRvcj4oRW50cmllcy5iZWdpbigpLCBFbnRyaWVzLmVuZCgpKTsKKyAgfQorCisgIHVpbnQ2NF90IGdldEVIRnJhbWVBZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gRUhGcmFtZUFkZHJlc3M7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkRFQlVHRlJBTUVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0luZm9FbnRyeS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0luZm9FbnRyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzhmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnSW5mb0VudHJ5LmgKQEAgLTAsMCArMSw2MyBAQAorLy89PT0tIERXQVJGRGVidWdJbmZvRW50cnkuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRkRFQlVHSU5GT0VOVFJZX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZERUJVR0lORk9FTlRSWV9ICisKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRhdGFFeHRyYWN0b3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIERhdGFFeHRyYWN0b3I7CitjbGFzcyBEV0FSRlVuaXQ7CisKKy8vLyBEV0FSRkRlYnVnSW5mb0VudHJ5IC0gQSBESUUgd2l0aCBvbmx5IHRoZSBtaW5pbXVtIHJlcXVpcmVkIGRhdGEuCitjbGFzcyBEV0FSRkRlYnVnSW5mb0VudHJ5IHsKKyAgLy8vIE9mZnNldCB3aXRoaW4gdGhlIC5kZWJ1Z19pbmZvIG9mIHRoZSBzdGFydCBvZiB0aGlzIGVudHJ5LgorICB1aW50MzJfdCBPZmZzZXQgPSAwOworCisgIC8vLyBUaGUgaW50ZWdlciBkZXB0aCBvZiB0aGlzIERJRSB3aXRoaW4gdGhlIGNvbXBpbGUgdW5pdCBESUVzIHdoZXJlIHRoZQorICAvLy8gY29tcGlsZS90eXBlIHVuaXQgRElFIGhhcyBhIGRlcHRoIG9mIHplcm8uCisgIHVpbnQzMl90IERlcHRoID0gMDsKKworICBjb25zdCBEV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uICpBYmJyZXZEZWNsID0gbnVsbHB0cjsKKworcHVibGljOgorICBEV0FSRkRlYnVnSW5mb0VudHJ5KCkgPSBkZWZhdWx0OworCisgIC8vLyBFeHRyYWN0cyBhIGRlYnVnIGluZm8gZW50cnksIHdoaWNoIGlzIGEgY2hpbGQgb2YgYSBnaXZlbiB1bml0LAorICAvLy8gc3RhcnRpbmcgYXQgYSBnaXZlbiBvZmZzZXQuIElmIERJRSBjYW4ndCBiZSBleHRyYWN0ZWQsIHJldHVybnMgZmFsc2UgYW5kCisgIC8vLyBkb2Vzbid0IGNoYW5nZSBPZmZzZXRQdHIuCisgIGJvb2wgZXh0cmFjdEZhc3QoY29uc3QgRFdBUkZVbml0ICZVLCB1aW50MzJfdCAqT2Zmc2V0UHRyKTsKKworICAvLy8gSGlnaCBwZXJmb3JtYW5jZSBleHRyYWN0aW9uIHNob3VsZCB1c2UgdGhpcyBjYWxsLgorICBib29sIGV4dHJhY3RGYXN0KGNvbnN0IERXQVJGVW5pdCAmVSwgdWludDMyX3QgKk9mZnNldFB0ciwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEV0FSRkRhdGFFeHRyYWN0b3IgJkRlYnVnSW5mb0RhdGEsIHVpbnQzMl90IFVFbmRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGVwdGgpOworCisgIHVpbnQzMl90IGdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIE9mZnNldDsgfQorICB1aW50MzJfdCBnZXREZXB0aCgpIGNvbnN0IHsgcmV0dXJuIERlcHRoOyB9CisKKyAgZHdhcmY6OlRhZyBnZXRUYWcoKSBjb25zdCB7CisgICAgcmV0dXJuIEFiYnJldkRlY2wgPyBBYmJyZXZEZWNsLT5nZXRUYWcoKSA6IGR3YXJmOjpEV19UQUdfbnVsbDsKKyAgfQorCisgIGJvb2wgaGFzQ2hpbGRyZW4oKSBjb25zdCB7IHJldHVybiBBYmJyZXZEZWNsICYmIEFiYnJldkRlY2wtPmhhc0NoaWxkcmVuKCk7IH0KKworICBjb25zdCBEV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uICpnZXRBYmJyZXZpYXRpb25EZWNsYXJhdGlvblB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gQWJicmV2RGVjbDsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGREVCVUdJTkZPRU5UUllfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0xpbmUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdMaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI0MzY0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdMaW5lLmgKQEAgLTAsMCArMSwyOTYgQEAKKy8vPT09LSBEV0FSRkRlYnVnTGluZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZERUJVR0xJTkVfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRkRFQlVHTElORV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RJQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGF0YUV4dHJhY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRm9ybVZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZSZWxvY01hcC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NRDUuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIERXQVJGVW5pdDsKK2NsYXNzIHJhd19vc3RyZWFtOworCitjbGFzcyBEV0FSRkRlYnVnTGluZSB7CitwdWJsaWM6CisgIHN0cnVjdCBGaWxlTmFtZUVudHJ5IHsKKyAgICBGaWxlTmFtZUVudHJ5KCkgPSBkZWZhdWx0OworCisgICAgRFdBUkZGb3JtVmFsdWUgTmFtZTsKKyAgICB1aW50NjRfdCBEaXJJZHggPSAwOworICAgIHVpbnQ2NF90IE1vZFRpbWUgPSAwOworICAgIHVpbnQ2NF90IExlbmd0aCA9IDA7CisgICAgTUQ1OjpNRDVSZXN1bHQgQ2hlY2tzdW07CisgICAgRFdBUkZGb3JtVmFsdWUgU291cmNlOworICB9OworCisgIC8vLyBUcmFja3Mgd2hpY2ggb3B0aW9uYWwgY29udGVudCB0eXBlcyBhcmUgcHJlc2VudCBpbiBhIERXQVJGIGZpbGUgbmFtZQorICAvLy8gZW50cnkgZm9ybWF0LgorICBzdHJ1Y3QgQ29udGVudFR5cGVUcmFja2VyIHsKKyAgICBDb250ZW50VHlwZVRyYWNrZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gV2hldGhlciBmaWxlbmFtZSBlbnRyaWVzIHByb3ZpZGUgYSBtb2RpZmljYXRpb24gdGltZXN0YW1wLgorICAgIGJvb2wgSGFzTW9kVGltZSA9IGZhbHNlOworICAgIC8vLyBXaGV0aGVyIGZpbGVuYW1lIGVudHJpZXMgcHJvdmlkZSBhIGZpbGUgc2l6ZS4KKyAgICBib29sIEhhc0xlbmd0aCA9IGZhbHNlOworICAgIC8vLyBGb3IgdjUsIHdoZXRoZXIgZmlsZW5hbWUgZW50cmllcyBwcm92aWRlIGFuIE1ENSBjaGVja3N1bS4KKyAgICBib29sIEhhc01ENSA9IGZhbHNlOworICAgIC8vLyBGb3IgdjUsIHdoZXRoZXIgZmlsZW5hbWUgZW50cmllcyBwcm92aWRlIHNvdXJjZSB0ZXh0LgorICAgIGJvb2wgSGFzU291cmNlID0gZmFsc2U7CisKKyAgICAvLy8gVXBkYXRlIHRyYWNrZWQgY29udGVudCB0eXBlcyB3aXRoIFxwIENvbnRlbnRUeXBlLgorICAgIHZvaWQgdHJhY2tDb250ZW50VHlwZShkd2FyZjo6TGluZU51bWJlckVudHJ5Rm9ybWF0IENvbnRlbnRUeXBlKTsKKyAgfTsKKworICBzdHJ1Y3QgUHJvbG9ndWUgeworICAgIFByb2xvZ3VlKCk7CisKKyAgICAvLy8gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHN0YXRlbWVudCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0CisgICAgLy8vIChub3QgaW5jbHVkaW5nIHRoZSB0b3RhbF9sZW5ndGggZmllbGQgaXRzZWxmKS4KKyAgICB1aW50NjRfdCBUb3RhbExlbmd0aDsKKyAgICAvLy8gVmVyc2lvbiwgYWRkcmVzcyBzaXplIChzdGFydGluZyBpbiB2NSksIGFuZCBEV0FSRjMyLzY0IGZvcm1hdDsgdGhlc2UKKyAgICAvLy8gcGFyYW1ldGVycyBhZmZlY3QgaW50ZXJwcmV0YXRpb24gb2YgZm9ybXMgKHVzZWQgaW4gdGhlIGRpcmVjdG9yeSBhbmQKKyAgICAvLy8gZmlsZSB0YWJsZXMgc3RhcnRpbmcgd2l0aCB2NSkuCisgICAgZHdhcmY6OkZvcm1QYXJhbXMgRm9ybVBhcmFtczsKKyAgICAvLy8gVGhlIG51bWJlciBvZiBieXRlcyBmb2xsb3dpbmcgdGhlIHByb2xvZ3VlX2xlbmd0aCBmaWVsZCB0byB0aGUgYmVnaW5uaW5nCisgICAgLy8vIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzdGF0ZW1lbnQgcHJvZ3JhbSBpdHNlbGYuCisgICAgdWludDY0X3QgUHJvbG9ndWVMZW5ndGg7CisgICAgLy8vIEluIHY1LCBzaXplIGluIGJ5dGVzIG9mIGEgc2VnbWVudCBzZWxlY3Rvci4KKyAgICB1aW50OF90IFNlZ1NlbGVjdG9yU2l6ZTsKKyAgICAvLy8gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHNtYWxsZXN0IHRhcmdldCBtYWNoaW5lIGluc3RydWN0aW9uLiBTdGF0ZW1lbnQKKyAgICAvLy8gcHJvZ3JhbSBvcGNvZGVzIHRoYXQgYWx0ZXIgdGhlIGFkZHJlc3MgcmVnaXN0ZXIgZmlyc3QgbXVsdGlwbHkgdGhlaXIKKyAgICAvLy8gb3BlcmFuZHMgYnkgdGhpcyB2YWx1ZS4KKyAgICB1aW50OF90IE1pbkluc3RMZW5ndGg7CisgICAgLy8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmRpdmlkdWFsIG9wZXJhdGlvbnMgdGhhdCBtYXkgYmUgZW5jb2RlZCBpbiBhbgorICAgIC8vLyBpbnN0cnVjdGlvbi4KKyAgICB1aW50OF90IE1heE9wc1Blckluc3Q7CisgICAgLy8vIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZWlzX3N0bXRyZWdpc3Rlci4KKyAgICB1aW50OF90IERlZmF1bHRJc1N0bXQ7CisgICAgLy8vIFRoaXMgcGFyYW1ldGVyIGFmZmVjdHMgdGhlIG1lYW5pbmcgb2YgdGhlIHNwZWNpYWwgb3Bjb2Rlcy4gU2VlIGJlbG93LgorICAgIGludDhfdCBMaW5lQmFzZTsKKyAgICAvLy8gVGhpcyBwYXJhbWV0ZXIgYWZmZWN0cyB0aGUgbWVhbmluZyBvZiB0aGUgc3BlY2lhbCBvcGNvZGVzLiBTZWUgYmVsb3cuCisgICAgdWludDhfdCBMaW5lUmFuZ2U7CisgICAgLy8vIFRoZSBudW1iZXIgYXNzaWduZWQgdG8gdGhlIGZpcnN0IHNwZWNpYWwgb3Bjb2RlLgorICAgIHVpbnQ4X3QgT3Bjb2RlQmFzZTsKKyAgICAvLy8gVGhpcyB0cmFja3Mgd2hpY2ggb3B0aW9uYWwgZmlsZSBmb3JtYXQgY29udGVudCB0eXBlcyBhcmUgcHJlc2VudC4KKyAgICBDb250ZW50VHlwZVRyYWNrZXIgQ29udGVudFR5cGVzOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFN0YW5kYXJkT3Bjb2RlTGVuZ3RoczsKKyAgICBzdGQ6OnZlY3RvcjxEV0FSRkZvcm1WYWx1ZT4gSW5jbHVkZURpcmVjdG9yaWVzOworICAgIHN0ZDo6dmVjdG9yPEZpbGVOYW1lRW50cnk+IEZpbGVOYW1lczsKKworICAgIGNvbnN0IGR3YXJmOjpGb3JtUGFyYW1zIGdldEZvcm1QYXJhbXMoKSBjb25zdCB7IHJldHVybiBGb3JtUGFyYW1zOyB9CisgICAgdWludDE2X3QgZ2V0VmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIEZvcm1QYXJhbXMuVmVyc2lvbjsgfQorICAgIHVpbnQ4X3QgZ2V0QWRkcmVzc1NpemUoKSBjb25zdCB7IHJldHVybiBGb3JtUGFyYW1zLkFkZHJTaXplOyB9CisgICAgYm9vbCBpc0RXQVJGNjQoKSBjb25zdCB7IHJldHVybiBGb3JtUGFyYW1zLkZvcm1hdCA9PSBkd2FyZjo6RFdBUkY2NDsgfQorCisgICAgdWludDMyX3Qgc2l6ZW9mVG90YWxMZW5ndGgoKSBjb25zdCB7IHJldHVybiBpc0RXQVJGNjQoKSA/IDEyIDogNDsgfQorCisgICAgdWludDMyX3Qgc2l6ZW9mUHJvbG9ndWVMZW5ndGgoKSBjb25zdCB7IHJldHVybiBpc0RXQVJGNjQoKSA/IDggOiA0OyB9CisKKyAgICAvLy8gTGVuZ3RoIG9mIHRoZSBwcm9sb2d1ZSBpbiBieXRlcy4KKyAgICB1aW50MzJfdCBnZXRMZW5ndGgoKSBjb25zdCB7CisgICAgICByZXR1cm4gUHJvbG9ndWVMZW5ndGggKyBzaXplb2ZUb3RhbExlbmd0aCgpICsgc2l6ZW9mKGdldFZlcnNpb24oKSkgKworICAgICAgICAgICAgIHNpemVvZlByb2xvZ3VlTGVuZ3RoKCk7CisgICAgfQorCisgICAgLy8vIExlbmd0aCBvZiB0aGUgbGluZSB0YWJsZSBkYXRhIGluIGJ5dGVzIChub3QgaW5jbHVkaW5nIHRoZSBwcm9sb2d1ZSkuCisgICAgdWludDMyX3QgZ2V0U3RhdGVtZW50VGFibGVMZW5ndGgoKSBjb25zdCB7CisgICAgICByZXR1cm4gVG90YWxMZW5ndGggKyBzaXplb2ZUb3RhbExlbmd0aCgpIC0gZ2V0TGVuZ3RoKCk7CisgICAgfQorCisgICAgaW50MzJfdCBnZXRNYXhMaW5lSW5jcmVtZW50Rm9yU3BlY2lhbE9wY29kZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMaW5lQmFzZSArIChpbnQ4X3QpTGluZVJhbmdlIC0gMTsKKyAgICB9CisKKyAgICB2b2lkIGNsZWFyKCk7CisgICAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUywgRElEdW1wT3B0aW9ucyBEdW1wT3B0aW9ucykgY29uc3Q7CisgICAgYm9vbCBwYXJzZShjb25zdCBEV0FSRkRhdGFFeHRyYWN0b3IgJkRlYnVnTGluZURhdGEsIHVpbnQzMl90ICpPZmZzZXRQdHIsCisgICAgICAgICAgICAgICBjb25zdCBEV0FSRkNvbnRleHQgJkN0eCwgY29uc3QgRFdBUkZVbml0ICpVID0gbnVsbHB0cik7CisgIH07CisKKyAgLy8vIFN0YW5kYXJkIC5kZWJ1Z19saW5lIHN0YXRlIG1hY2hpbmUgc3RydWN0dXJlLgorICBzdHJ1Y3QgUm93IHsKKyAgICBleHBsaWNpdCBSb3coYm9vbCBEZWZhdWx0SXNTdG10ID0gZmFsc2UpOworCisgICAgLy8vIENhbGxlZCBhZnRlciBhIHJvdyBpcyBhcHBlbmRlZCB0byB0aGUgbWF0cml4LgorICAgIHZvaWQgcG9zdEFwcGVuZCgpOworICAgIHZvaWQgcmVzZXQoYm9vbCBEZWZhdWx0SXNTdG10KTsKKyAgICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAgIHN0YXRpYyB2b2lkIGR1bXBUYWJsZUhlYWRlcihyYXdfb3N0cmVhbSAmT1MpOworCisgICAgc3RhdGljIGJvb2wgb3JkZXJCeUFkZHJlc3MoY29uc3QgUm93ICZMSFMsIGNvbnN0IFJvdyAmUkhTKSB7CisgICAgICByZXR1cm4gTEhTLkFkZHJlc3MgPCBSSFMuQWRkcmVzczsKKyAgICB9CisKKyAgICAvLy8gVGhlIHByb2dyYW0tY291bnRlciB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGEgbWFjaGluZSBpbnN0cnVjdGlvbgorICAgIC8vLyBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyLgorICAgIHVpbnQ2NF90IEFkZHJlc3M7CisgICAgLy8vIEFuIHVuc2lnbmVkIGludGVnZXIgaW5kaWNhdGluZyBhIHNvdXJjZSBsaW5lIG51bWJlci4gTGluZXMgYXJlIG51bWJlcmVkCisgICAgLy8vIGJlZ2lubmluZyBhdCAxLiBUaGUgY29tcGlsZXIgbWF5IGVtaXQgdGhlIHZhbHVlIDAgaW4gY2FzZXMgd2hlcmUgYW4KKyAgICAvLy8gaW5zdHJ1Y3Rpb24gY2Fubm90IGJlIGF0dHJpYnV0ZWQgdG8gYW55IHNvdXJjZSBsaW5lLgorICAgIHVpbnQzMl90IExpbmU7CisgICAgLy8vIEFuIHVuc2lnbmVkIGludGVnZXIgaW5kaWNhdGluZyBhIGNvbHVtbiBudW1iZXIgd2l0aGluIGEgc291cmNlIGxpbmUuCisgICAgLy8vIENvbHVtbnMgYXJlIG51bWJlcmVkIGJlZ2lubmluZyBhdCAxLiBUaGUgdmFsdWUgMCBpcyByZXNlcnZlZCB0byBpbmRpY2F0ZQorICAgIC8vLyB0aGF0IGEgc3RhdGVtZW50IGJlZ2lucyBhdCB0aGUgJ2xlZnQgZWRnZScgb2YgdGhlIGxpbmUuCisgICAgdWludDE2X3QgQ29sdW1uOworICAgIC8vLyBBbiB1bnNpZ25lZCBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIGlkZW50aXR5IG9mIHRoZSBzb3VyY2UgZmlsZQorICAgIC8vLyBjb3JyZXNwb25kaW5nIHRvIGEgbWFjaGluZSBpbnN0cnVjdGlvbi4KKyAgICB1aW50MTZfdCBGaWxlOworICAgIC8vLyBBbiB1bnNpZ25lZCBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgRFdBUkYgcGF0aCBkaXNjcmltaW5hdG9yIHZhbHVlCisgICAgLy8vIGZvciB0aGlzIGxvY2F0aW9uLgorICAgIHVpbnQzMl90IERpc2NyaW1pbmF0b3I7CisgICAgLy8vIEFuIHVuc2lnbmVkIGludGVnZXIgd2hvc2UgdmFsdWUgZW5jb2RlcyB0aGUgYXBwbGljYWJsZSBpbnN0cnVjdGlvbiBzZXQKKyAgICAvLy8gYXJjaGl0ZWN0dXJlIGZvciB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4KKyAgICB1aW50OF90IElzYTsKKyAgICAvLy8gQSBib29sZWFuIGluZGljYXRpbmcgdGhhdCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBpcyB0aGUgYmVnaW5uaW5nIG9mIGEKKyAgICAvLy8gc3RhdGVtZW50LgorICAgIHVpbnQ4X3QgSXNTdG10IDogMSwKKyAgICAgICAgLy8vIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gaXMgdGhlCisgICAgICAgIC8vLyBiZWdpbm5pbmcgb2YgYSBiYXNpYyBibG9jay4KKyAgICAgICAgQmFzaWNCbG9jayA6IDEsCisgICAgICAgIC8vLyBBIGJvb2xlYW4gaW5kaWNhdGluZyB0aGF0IHRoZSBjdXJyZW50IGFkZHJlc3MgaXMgdGhhdCBvZiB0aGUKKyAgICAgICAgLy8vIGZpcnN0IGJ5dGUgYWZ0ZXIgdGhlIGVuZCBvZiBhIHNlcXVlbmNlIG9mIHRhcmdldCBtYWNoaW5lCisgICAgICAgIC8vLyBpbnN0cnVjdGlvbnMuCisgICAgICAgIEVuZFNlcXVlbmNlIDogMSwKKyAgICAgICAgLy8vIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgdGhlIGN1cnJlbnQgYWRkcmVzcyBpcyBvbmUgKG9mIHBvc3NpYmx5CisgICAgICAgIC8vLyBtYW55KSB3aGVyZSBleGVjdXRpb24gc2hvdWxkIGJlIHN1c3BlbmRlZCBmb3IgYW4gZW50cnkgYnJlYWtwb2ludAorICAgICAgICAvLy8gb2YgYSBmdW5jdGlvbi4KKyAgICAgICAgUHJvbG9ndWVFbmQgOiAxLAorICAgICAgICAvLy8gQSBib29sZWFuIGluZGljYXRpbmcgdGhhdCB0aGUgY3VycmVudCBhZGRyZXNzIGlzIG9uZSAob2YgcG9zc2libHkKKyAgICAgICAgLy8vIG1hbnkpIHdoZXJlIGV4ZWN1dGlvbiBzaG91bGQgYmUgc3VzcGVuZGVkIGZvciBhbiBleGl0IGJyZWFrcG9pbnQKKyAgICAgICAgLy8vIG9mIGEgZnVuY3Rpb24uCisgICAgICAgIEVwaWxvZ3VlQmVnaW4gOiAxOworICB9OworCisgIC8vLyBSZXByZXNlbnRzIGEgc2VyaWVzIG9mIGNvbnRpZ3VvdXMgbWFjaGluZSBpbnN0cnVjdGlvbnMuIExpbmUgdGFibGUgZm9yCisgIC8vLyBlYWNoIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbnNpc3Qgb2YgbXVsdGlwbGUgc2VxdWVuY2VzLCB3aGljaCBhcmUgbm90CisgIC8vLyBndWFyYW50ZWVkIHRvIGJlIGluIHRoZSBvcmRlciBvZiBhc2NlbmRpbmcgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4KKyAgc3RydWN0IFNlcXVlbmNlIHsKKyAgICBTZXF1ZW5jZSgpOworCisgICAgLy8vIFNlcXVlbmNlIGRlc2NyaWJlcyBpbnN0cnVjdGlvbnMgYXQgYWRkcmVzcyByYW5nZSBbTG93UEMsIEhpZ2hQQykKKyAgICAvLy8gYW5kIGlzIGRlc2NyaWJlZCBieSBsaW5lIHRhYmxlIHJvd3MgW0ZpcnN0Um93SW5kZXgsIExhc3RSb3dJbmRleCkuCisgICAgdWludDY0X3QgTG93UEM7CisgICAgdWludDY0X3QgSGlnaFBDOworICAgIHVuc2lnbmVkIEZpcnN0Um93SW5kZXg7CisgICAgdW5zaWduZWQgTGFzdFJvd0luZGV4OworICAgIGJvb2wgRW1wdHk7CisKKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICBzdGF0aWMgYm9vbCBvcmRlckJ5TG93UEMoY29uc3QgU2VxdWVuY2UgJkxIUywgY29uc3QgU2VxdWVuY2UgJlJIUykgeworICAgICAgcmV0dXJuIExIUy5Mb3dQQyA8IFJIUy5Mb3dQQzsKKyAgICB9CisKKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICByZXR1cm4gIUVtcHR5ICYmIChMb3dQQyA8IEhpZ2hQQykgJiYgKEZpcnN0Um93SW5kZXggPCBMYXN0Um93SW5kZXgpOworICAgIH0KKworICAgIGJvb2wgY29udGFpbnNQQyh1aW50NjRfdCBQQykgY29uc3QgeyByZXR1cm4gKExvd1BDIDw9IFBDICYmIFBDIDwgSGlnaFBDKTsgfQorICB9OworCisgIHN0cnVjdCBMaW5lVGFibGUgeworICAgIExpbmVUYWJsZSgpOworCisgICAgLy8vIFJlcHJlc2VudHMgYW4gaW52YWxpZCByb3cKKyAgICBjb25zdCB1aW50MzJfdCBVbmtub3duUm93SW5kZXggPSBVSU5UMzJfTUFYOworCisgICAgdm9pZCBhcHBlbmRSb3coY29uc3QgRFdBUkZEZWJ1Z0xpbmU6OlJvdyAmUikgeyBSb3dzLnB1c2hfYmFjayhSKTsgfQorCisgICAgdm9pZCBhcHBlbmRTZXF1ZW5jZShjb25zdCBEV0FSRkRlYnVnTGluZTo6U2VxdWVuY2UgJlMpIHsKKyAgICAgIFNlcXVlbmNlcy5wdXNoX2JhY2soUyk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSByb3cgd2l0aCBmaWxlL2xpbmUgaW5mbyBmb3IgYSBnaXZlbiBhZGRyZXNzLAorICAgIC8vLyBvciBVbmtub3duUm93SW5kZXggaWYgdGhlcmUgaXMgbm8gc3VjaCByb3cuCisgICAgdWludDMyX3QgbG9va3VwQWRkcmVzcyh1aW50NjRfdCBBZGRyZXNzKSBjb25zdDsKKworICAgIGJvb2wgbG9va3VwQWRkcmVzc1JhbmdlKHVpbnQ2NF90IEFkZHJlc3MsIHVpbnQ2NF90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+ICZSZXN1bHQpIGNvbnN0OworCisgICAgYm9vbCBoYXNGaWxlQXRJbmRleCh1aW50NjRfdCBGaWxlSW5kZXgpIGNvbnN0OworCisgICAgLy8vIEV4dHJhY3RzIGZpbGVuYW1lIGJ5IGl0cyBpbmRleCBpbiBmaWxlbmFtZSB0YWJsZSBpbiBwcm9sb2d1ZS4KKyAgICAvLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCisgICAgYm9vbCBnZXRGaWxlTmFtZUJ5SW5kZXgodWludDY0X3QgRmlsZUluZGV4LCBjb25zdCBjaGFyICpDb21wRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJTGluZUluZm9TcGVjaWZpZXI6OkZpbGVMaW5lSW5mb0tpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmUmVzdWx0KSBjb25zdDsKKworICAgIC8vLyBGaWxscyB0aGUgUmVzdWx0IGFyZ3VtZW50IHdpdGggdGhlIGZpbGUgYW5kIGxpbmUgaW5mb3JtYXRpb24KKyAgICAvLy8gY29ycmVzcG9uZGluZyB0byBBZGRyZXNzLiBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KKyAgICBib29sIGdldEZpbGVMaW5lSW5mb0ZvckFkZHJlc3ModWludDY0X3QgQWRkcmVzcywgY29uc3QgY2hhciAqQ29tcERpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElMaW5lSW5mb1NwZWNpZmllcjo6RmlsZUxpbmVJbmZvS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUxpbmVJbmZvICZSZXN1bHQpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUywgRElEdW1wT3B0aW9ucyBEdW1wT3B0aW9ucykgY29uc3Q7CisgICAgdm9pZCBjbGVhcigpOworCisgICAgLy8vIFBhcnNlIHByb2xvZ3VlIGFuZCBhbGwgcm93cy4KKyAgICBib29sIHBhcnNlKERXQVJGRGF0YUV4dHJhY3RvciAmRGVidWdMaW5lRGF0YSwgdWludDMyX3QgKk9mZnNldFB0ciwKKyAgICAgICAgICAgICAgIGNvbnN0IERXQVJGQ29udGV4dCAmQ3R4LCBjb25zdCBEV0FSRlVuaXQgKlUsCisgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAqT1MgPSBudWxscHRyKTsKKworICAgIHVzaW5nIFJvd1ZlY3RvciA9IHN0ZDo6dmVjdG9yPFJvdz47CisgICAgdXNpbmcgUm93SXRlciA9IFJvd1ZlY3Rvcjo6Y29uc3RfaXRlcmF0b3I7CisgICAgdXNpbmcgU2VxdWVuY2VWZWN0b3IgPSBzdGQ6OnZlY3RvcjxTZXF1ZW5jZT47CisgICAgdXNpbmcgU2VxdWVuY2VJdGVyID0gU2VxdWVuY2VWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yOworCisgICAgc3RydWN0IFByb2xvZ3VlIFByb2xvZ3VlOworICAgIFJvd1ZlY3RvciBSb3dzOworICAgIFNlcXVlbmNlVmVjdG9yIFNlcXVlbmNlczsKKworICBwcml2YXRlOgorICAgIHVpbnQzMl90IGZpbmRSb3dJblNlcShjb25zdCBEV0FSRkRlYnVnTGluZTo6U2VxdWVuY2UgJlNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQWRkcmVzcykgY29uc3Q7CisgICAgT3B0aW9uYWw8U3RyaW5nUmVmPiBnZXRTb3VyY2VCeUluZGV4KHVpbnQ2NF90IEZpbGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElMaW5lSW5mb1NwZWNpZmllcjo6RmlsZUxpbmVJbmZvS2luZCBLaW5kKSBjb25zdDsKKyAgfTsKKworICBjb25zdCBMaW5lVGFibGUgKmdldExpbmVUYWJsZSh1aW50MzJfdCBPZmZzZXQpIGNvbnN0OworICBjb25zdCBMaW5lVGFibGUgKmdldE9yUGFyc2VMaW5lVGFibGUoRFdBUkZEYXRhRXh0cmFjdG9yICZEZWJ1Z0xpbmVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT2Zmc2V0LCBjb25zdCBEV0FSRkNvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEV0FSRlVuaXQgKlUpOworCitwcml2YXRlOgorICBzdHJ1Y3QgUGFyc2luZ1N0YXRlIHsKKyAgICBQYXJzaW5nU3RhdGUoc3RydWN0IExpbmVUYWJsZSAqTFQpOworCisgICAgdm9pZCByZXNldFJvd0FuZFNlcXVlbmNlKCk7CisgICAgdm9pZCBhcHBlbmRSb3dUb01hdHJpeCh1aW50MzJfdCBPZmZzZXQpOworCisgICAgLy8vIExpbmUgdGFibGUgd2UncmUgY3VycmVudGx5IHBhcnNpbmcuCisgICAgc3RydWN0IExpbmVUYWJsZSAqTGluZVRhYmxlOworICAgIC8vLyBUaGUgcm93IG51bWJlciB0aGF0IHN0YXJ0cyBhdCB6ZXJvIGZvciB0aGUgcHJvbG9ndWUsIGFuZCBpbmNyZWFzZXMgZm9yCisgICAgLy8vIGVhY2ggcm93IGFkZGVkIHRvIHRoZSBtYXRyaXguCisgICAgdW5zaWduZWQgUm93TnVtYmVyID0gMDsKKyAgICBzdHJ1Y3QgUm93IFJvdzsKKyAgICBzdHJ1Y3QgU2VxdWVuY2UgU2VxdWVuY2U7CisgIH07CisKKyAgdXNpbmcgTGluZVRhYmxlTWFwVHkgPSBzdGQ6Om1hcDx1aW50MzJfdCwgTGluZVRhYmxlPjsKKyAgdXNpbmcgTGluZVRhYmxlSXRlciA9IExpbmVUYWJsZU1hcFR5OjppdGVyYXRvcjsKKyAgdXNpbmcgTGluZVRhYmxlQ29uc3RJdGVyID0gTGluZVRhYmxlTWFwVHk6OmNvbnN0X2l0ZXJhdG9yOworCisgIExpbmVUYWJsZU1hcFR5IExpbmVUYWJsZU1hcDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRkRFQlVHTElORV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnTG9jLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnTG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZkMzE5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdMb2MuaApAQCAtMCwwICsxLDExMyBAQAorLy89PT0tIERXQVJGRGVidWdMb2MuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkRFQlVHTE9DX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZERUJVR0xPQ19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEYXRhRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZSZWxvY01hcC5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIERXQVJGVW5pdDsKK2NsYXNzIE1DUmVnaXN0ZXJJbmZvOworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIERXQVJGRGVidWdMb2MgeworcHVibGljOgorICAvLy8gQSBzaW5nbGUgbG9jYXRpb24gd2l0aGluIGEgbG9jYXRpb24gbGlzdC4KKyAgc3RydWN0IEVudHJ5IHsKKyAgICAvLy8gVGhlIGJlZ2lubmluZyBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiByYW5nZS4KKyAgICB1aW50NjRfdCBCZWdpbjsKKyAgICAvLy8gVGhlIGVuZGluZyBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiByYW5nZS4KKyAgICB1aW50NjRfdCBFbmQ7CisgICAgLy8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgdmFyaWFibGUgd2l0aGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UuCisgICAgU21hbGxWZWN0b3I8Y2hhciwgND4gTG9jOworICB9OworCisgIC8vLyBBIGxpc3Qgb2YgbG9jYXRpb25zIHRoYXQgY29udGFpbiBvbmUgdmFyaWFibGUuCisgIHN0cnVjdCBMb2NhdGlvbkxpc3QgeworICAgIC8vLyBUaGUgYmVnaW5uaW5nIG9mZnNldCB3aGVyZSB0aGlzIGxvY2F0aW9uIGxpc3QgaXMgc3RvcmVkIGluIHRoZSBkZWJ1Z19sb2MKKyAgICAvLy8gc2VjdGlvbi4KKyAgICB1bnNpZ25lZCBPZmZzZXQ7CisgICAgLy8vIEFsbCB0aGUgbG9jYXRpb25zIGluIHdoaWNoIHRoZSB2YXJpYWJsZSBpcyBzdG9yZWQuCisgICAgU21hbGxWZWN0b3I8RW50cnksIDI+IEVudHJpZXM7CisgICAgLy8vIER1bXAgdGhpcyBsaXN0IG9uIE9TLgorICAgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIGJvb2wgSXNMaXR0bGVFbmRpYW4sIHVuc2lnbmVkIEFkZHJlc3NTaXplLAorICAgICAgICAgICAgICBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqTVJJLCB1bnNpZ25lZCBJbmRlbnQpIGNvbnN0OworICB9OworCitwcml2YXRlOgorICB1c2luZyBMb2NhdGlvbkxpc3RzID0gU21hbGxWZWN0b3I8TG9jYXRpb25MaXN0LCA0PjsKKworICAvLy8gQSBsaXN0IG9mIGFsbCB0aGUgdmFyaWFibGVzIGluIHRoZSBkZWJ1Z19sb2Mgc2VjdGlvbiwgZWFjaCBvbmUgZGVzY3JpYmluZworICAvLy8gdGhlIGxvY2F0aW9ucyBpbiB3aGljaCB0aGUgdmFyaWFibGUgaXMgc3RvcmVkLgorICBMb2NhdGlvbkxpc3RzIExvY2F0aW9uczsKKworICB1bnNpZ25lZCBBZGRyZXNzU2l6ZTsKKworICBib29sIElzTGl0dGxlRW5kaWFuOworCitwdWJsaWM6CisgIC8vLyBQcmludCB0aGUgbG9jYXRpb24gbGlzdHMgZm91bmQgd2l0aGluIHRoZSBkZWJ1Z19sb2Mgc2VjdGlvbi4KKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUywgY29uc3QgTUNSZWdpc3RlckluZm8gKlJlZ0luZm8sCisgICAgICAgICAgICBPcHRpb25hbDx1aW50NjRfdD4gT2Zmc2V0KSBjb25zdDsKKworICAvLy8gUGFyc2UgdGhlIGRlYnVnX2xvYyBzZWN0aW9uIGFjY2Vzc2libGUgdmlhIHRoZSAnZGF0YScgcGFyYW1ldGVyIHVzaW5nIHRoZQorICAvLy8gYWRkcmVzcyBzaXplIGFsc28gZ2l2ZW4gaW4gJ2RhdGEnIHRvIGludGVycHJldCB0aGUgYWRkcmVzcyByYW5nZXMuCisgIHZvaWQgcGFyc2UoY29uc3QgRFdBUkZEYXRhRXh0cmFjdG9yICZkYXRhKTsKKworICAvLy8gUmV0dXJuIHRoZSBsb2NhdGlvbiBsaXN0IGF0IHRoZSBnaXZlbiBvZmZzZXQgb3IgbnVsbHB0ci4KKyAgTG9jYXRpb25MaXN0IGNvbnN0ICpnZXRMb2NhdGlvbkxpc3RBdE9mZnNldCh1aW50NjRfdCBPZmZzZXQpIGNvbnN0OworCisgIE9wdGlvbmFsPExvY2F0aW9uTGlzdD4gcGFyc2VPbmVMb2NhdGlvbkxpc3QoRFdBUkZEYXRhRXh0cmFjdG9yIERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKk9mZnNldCk7Cit9OworCitjbGFzcyBEV0FSRkRlYnVnTG9jRFdPIHsKK3B1YmxpYzoKKyAgc3RydWN0IEVudHJ5IHsKKyAgICB1aW50NjRfdCBTdGFydDsKKyAgICB1aW50MzJfdCBMZW5ndGg7CisgICAgU21hbGxWZWN0b3I8Y2hhciwgND4gTG9jOworICB9OworCisgIHN0cnVjdCBMb2NhdGlvbkxpc3QgeworICAgIHVuc2lnbmVkIE9mZnNldDsKKyAgICBTbWFsbFZlY3RvcjxFbnRyeSwgMj4gRW50cmllczsKKyAgICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBib29sIElzTGl0dGxlRW5kaWFuLCB1bnNpZ25lZCBBZGRyZXNzU2l6ZSwKKyAgICAgICAgICAgICAgY29uc3QgTUNSZWdpc3RlckluZm8gKlJlZ0luZm8sIHVuc2lnbmVkIEluZGVudCkgY29uc3Q7CisgIH07CisKK3ByaXZhdGU6CisgIHVzaW5nIExvY2F0aW9uTGlzdHMgPSBTbWFsbFZlY3RvcjxMb2NhdGlvbkxpc3QsIDQ+OworCisgIExvY2F0aW9uTGlzdHMgTG9jYXRpb25zOworCisgIHVuc2lnbmVkIEFkZHJlc3NTaXplOworCisgIGJvb2wgSXNMaXR0bGVFbmRpYW47CisKK3B1YmxpYzoKKyAgdm9pZCBwYXJzZShEYXRhRXh0cmFjdG9yIGRhdGEpOworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqUmVnSW5mbywKKyAgICAgICAgICAgIE9wdGlvbmFsPHVpbnQ2NF90PiBPZmZzZXQpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIGxvY2F0aW9uIGxpc3QgYXQgdGhlIGdpdmVuIG9mZnNldCBvciBudWxscHRyLgorICBMb2NhdGlvbkxpc3QgY29uc3QgKmdldExvY2F0aW9uTGlzdEF0T2Zmc2V0KHVpbnQ2NF90IE9mZnNldCkgY29uc3Q7CisKKyAgc3RhdGljIE9wdGlvbmFsPExvY2F0aW9uTGlzdD4gcGFyc2VPbmVMb2NhdGlvbkxpc3QoRGF0YUV4dHJhY3RvciBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqT2Zmc2V0KTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkRFQlVHTE9DX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdNYWNyby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z01hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZlMmZjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdNYWNyby5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vPT09LSBEV0FSRkRlYnVnTWFjcm8uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZERUJVR01BQ1JPX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZERUJVR01BQ1JPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFFeHRyYWN0b3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCitjbGFzcyBEV0FSRkRlYnVnTWFjcm8geworICAvLy8gQSBzaW5nbGUgbWFjcm8gZW50cnkgd2l0aGluIGEgbWFjcm8gbGlzdC4KKyAgc3RydWN0IEVudHJ5IHsKKyAgICAvLy8gVGhlIHR5cGUgb2YgdGhlIG1hY3JvIGVudHJ5LgorICAgIHVpbnQzMl90IFR5cGU7CisgICAgdW5pb24geworICAgICAgLy8vIFRoZSBzb3VyY2UgbGluZSB3aGVyZSB0aGUgbWFjcm8gaXMgZGVmaW5lZC4KKyAgICAgIHVpbnQ2NF90IExpbmU7CisgICAgICAvLy8gVmVuZG9yIGV4dGVuc2lvbiBjb25zdGFudCB2YWx1ZS4KKyAgICAgIHVpbnQ2NF90IEV4dENvbnN0YW50OworICAgIH07CisKKyAgICB1bmlvbiB7CisgICAgICAvLy8gVGhlIHN0cmluZyAobmFtZSwgdmFsdWUpIG9mIHRoZSBtYWNybyBlbnRyeS4KKyAgICAgIGNvbnN0IGNoYXIgKk1hY3JvU3RyOworICAgICAgLy8gQW4gdW5zaWduZWQgaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBpZGVudGl0eSBvZiB0aGUgc291cmNlIGZpbGUuCisgICAgICB1aW50NjRfdCBGaWxlOworICAgICAgLy8vIFZlbmRvciBleHRlbnNpb24gc3RyaW5nLgorICAgICAgY29uc3QgY2hhciAqRXh0U3RyOworICAgIH07CisgIH07CisKKyAgdXNpbmcgTWFjcm9MaXN0ID0gU21hbGxWZWN0b3I8RW50cnksIDQ+OworCisgIC8vLyBBIGxpc3Qgb2YgYWxsIHRoZSBtYWNybyBlbnRyaWVzIGluIHRoZSBkZWJ1Z19tYWNpbmZvIHNlY3Rpb24uCisgIE1hY3JvTGlzdCBNYWNyb3M7CisKK3B1YmxpYzoKKyAgRFdBUkZEZWJ1Z01hY3JvKCkgPSBkZWZhdWx0OworCisgIC8vLyBQcmludCB0aGUgbWFjcm8gbGlzdCBmb3VuZCB3aXRoaW4gdGhlIGRlYnVnX21hY2luZm8gc2VjdGlvbi4KKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8vIFBhcnNlIHRoZSBkZWJ1Z19tYWNpbmZvIHNlY3Rpb24gYWNjZXNzaWJsZSB2aWEgdGhlICdkYXRhJyBwYXJhbWV0ZXIuCisgIHZvaWQgcGFyc2UoRGF0YUV4dHJhY3RvciBkYXRhKTsKKworICAvLy8gUmV0dXJuIHdoZXRoZXIgdGhlIHNlY3Rpb24gaGFzIGFueSBlbnRyaWVzLgorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gTWFjcm9zLmVtcHR5KCk7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkRFQlVHTUFDUk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z1B1YlRhYmxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnUHViVGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjE4NzFkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z1B1YlRhYmxlLmgKQEAgLTAsMCArMSw3OSBAQAorLy89PT0tIERXQVJGRGVidWdQdWJUYWJsZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkRFQlVHUFVCVEFCTEVfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkRFQlVHUFVCVEFCTEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gUmVwcmVzZW50cyBzdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgYW5kIHBhcnNpbmcgLmRlYnVnX3B1YiogdGFibGVzLgorY2xhc3MgRFdBUkZEZWJ1Z1B1YlRhYmxlIHsKK3B1YmxpYzoKKyAgc3RydWN0IEVudHJ5IHsKKyAgICAvLy8gU2VjdGlvbiBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LgorICAgIHVpbnQzMl90IFNlY09mZnNldDsKKworICAgIC8vLyBBbiBlbnRyeSBvZiB0aGUgdmFyaW91cyBnbnVfcHViKiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICBkd2FyZjo6UHViSW5kZXhFbnRyeURlc2NyaXB0b3IgRGVzY3JpcHRvcjsKKworICAgIC8vLyBUaGUgbmFtZSBvZiB0aGUgb2JqZWN0IGFzIGdpdmVuIGJ5IHRoZSBEV19BVF9uYW1lIGF0dHJpYnV0ZSBvZiB0aGUKKyAgICAvLy8gcmVmZXJlbmNlZCBESUUuCisgICAgY29uc3QgY2hhciAqTmFtZTsKKyAgfTsKKworICAvLy8gRWFjaCB0YWJsZSBjb25zaXN0cyBvZiBzZXRzIG9mIHZhcmlhYmxlIGxlbmd0aCBlbnRyaWVzLiBFYWNoIHNldCBkZXNjcmliZXMKKyAgLy8vIHRoZSBuYW1lcyBvZiBnbG9iYWwgb2JqZWN0cyBhbmQgZnVuY3Rpb25zLCBvciBnbG9iYWwgdHlwZXMsIHJlc3BlY3RpdmVseSwKKyAgLy8vIHdob3NlIGRlZmluaXRpb25zIGFyZSByZXByZXNlbnRlZCBieSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cmllcyBvd25lZAorICAvLy8gYnkgYSBzaW5nbGUgY29tcGlsYXRpb24gdW5pdC4KKyAgc3RydWN0IFNldCB7CisgICAgLy8vIFRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGVudHJpZXMgZm9yIHRoYXQgc2V0LCBub3QgaW5jbHVkaW5nIHRoZSBsZW5ndGgKKyAgICAvLy8gZmllbGQgaXRzZWxmLgorICAgIHVpbnQzMl90IExlbmd0aDsKKworICAgIC8vLyBUaGlzIG51bWJlciBpcyBzcGVjaWZpYyB0byB0aGUgbmFtZSBsb29rdXAgdGFibGUgYW5kIGlzIGluZGVwZW5kZW50IG9mCisgICAgLy8vIHRoZSBEV0FSRiB2ZXJzaW9uIG51bWJlci4KKyAgICB1aW50MTZfdCBWZXJzaW9uOworCisgICAgLy8vIFRoZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uIG9mIHRoZQorICAgIC8vLyBjb21waWxhdGlvbiB1bml0IGhlYWRlciByZWZlcmVuY2VkIGJ5IHRoZSBzZXQuCisgICAgdWludDMyX3QgT2Zmc2V0OworCisgICAgLy8vIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBnZW5lcmF0ZWQKKyAgICAvLy8gdG8gcmVwcmVzZW50IHRoYXQgY29tcGlsYXRpb24gdW5pdC4KKyAgICB1aW50MzJfdCBTaXplOworCisgICAgc3RkOjp2ZWN0b3I8RW50cnk+IEVudHJpZXM7CisgIH07CisKK3ByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPFNldD4gU2V0czsKKworICAvLy8gZ251IHN0eWxlZCB0YWJsZXMgY29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKyAgLy8vIFRoaXMgZmxhZyBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHNlY3Rpb24gd2UgcGFyc2UgaXMgZGVidWdfZ251KiB0YWJsZS4KKyAgYm9vbCBHbnVTdHlsZTsKKworcHVibGljOgorICBEV0FSRkRlYnVnUHViVGFibGUoU3RyaW5nUmVmIERhdGEsIGJvb2wgTGl0dGxlRW5kaWFuLCBib29sIEdudVN0eWxlKTsKKworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICBBcnJheVJlZjxTZXQ+IGdldERhdGEoKSB7IHJldHVybiBTZXRzOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZERUJVR1BVQlRBQkxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdSYW5nZUxpc3QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdSYW5nZUxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGI3ZjIyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z1JhbmdlTGlzdC5oCkBAIC0wLDAgKzEsODYgQEAKKy8vPT09LSBEV0FSRkRlYnVnUmFuZ2VMaXN0LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZERUJVR1JBTkdFTElTVF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGREVCVUdSQU5HRUxJU1RfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZBZGRyZXNzUmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRhdGFFeHRyYWN0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3N0cnVjdCBCYXNlQWRkcmVzczsKK2NsYXNzIHJhd19vc3RyZWFtOworCitjbGFzcyBEV0FSRkRlYnVnUmFuZ2VMaXN0IHsKK3B1YmxpYzoKKyAgc3RydWN0IFJhbmdlTGlzdEVudHJ5IHsKKyAgICAvLy8gQSBiZWdpbm5pbmcgYWRkcmVzcyBvZmZzZXQuIFRoaXMgYWRkcmVzcyBvZmZzZXQgaGFzIHRoZSBzaXplIG9mIGFuCisgICAgLy8vIGFkZHJlc3MgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZSBhcHBsaWNhYmxlIGJhc2UgYWRkcmVzcyBvZiB0aGUKKyAgICAvLy8gY29tcGlsYXRpb24gdW5pdCByZWZlcmVuY2luZyB0aGlzIHJhbmdlIGxpc3QuIEl0IG1hcmtzIHRoZSBiZWdpbm5pbmcKKyAgICAvLy8gb2YgYW4gYWRkcmVzcyByYW5nZS4KKyAgICB1aW50NjRfdCBTdGFydEFkZHJlc3M7CisgICAgLy8vIEFuIGVuZGluZyBhZGRyZXNzIG9mZnNldC4gVGhpcyBhZGRyZXNzIG9mZnNldCBhZ2FpbiBoYXMgdGhlIHNpemUgb2YKKyAgICAvLy8gYW4gYWRkcmVzcyBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlIGFwcGxpY2FibGUgYmFzZSBhZGRyZXNzIG9mIHRoZQorICAgIC8vLyBjb21waWxhdGlvbiB1bml0IHJlZmVyZW5jaW5nIHRoaXMgcmFuZ2UgbGlzdC4gSXQgbWFya3MgdGhlIGZpcnN0CisgICAgLy8vIGFkZHJlc3MgcGFzdCB0aGUgZW5kIG9mIHRoZSBhZGRyZXNzIHJhbmdlLiBUaGUgZW5kaW5nIGFkZHJlc3MgbXVzdAorICAgIC8vLyBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGJlZ2lubmluZyBhZGRyZXNzLgorICAgIHVpbnQ2NF90IEVuZEFkZHJlc3M7CisgICAgLy8vIEEgc2VjdGlvbiBpbmRleCB0aGlzIHJhbmdlIGJlbG9uZ3MgdG8uCisgICAgdWludDY0X3QgU2VjdGlvbkluZGV4OworCisgICAgLy8vIFRoZSBlbmQgb2YgYW55IGdpdmVuIHJhbmdlIGxpc3QgaXMgbWFya2VkIGJ5IGFuIGVuZCBvZiBsaXN0IGVudHJ5LAorICAgIC8vLyB3aGljaCBjb25zaXN0cyBvZiBhIDAgZm9yIHRoZSBiZWdpbm5pbmcgYWRkcmVzcyBvZmZzZXQKKyAgICAvLy8gYW5kIGEgMCBmb3IgdGhlIGVuZGluZyBhZGRyZXNzIG9mZnNldC4KKyAgICBib29sIGlzRW5kT2ZMaXN0RW50cnkoKSBjb25zdCB7CisgICAgICByZXR1cm4gKFN0YXJ0QWRkcmVzcyA9PSAwKSAmJiAoRW5kQWRkcmVzcyA9PSAwKTsKKyAgICB9CisKKyAgICAvLy8gQSBiYXNlIGFkZHJlc3Mgc2VsZWN0aW9uIGVudHJ5IGNvbnNpc3RzIG9mOgorICAgIC8vLyAxLiBUaGUgdmFsdWUgb2YgdGhlIGxhcmdlc3QgcmVwcmVzZW50YWJsZSBhZGRyZXNzIG9mZnNldAorICAgIC8vLyAoZm9yIGV4YW1wbGUsIDB4ZmZmZmZmZmYgd2hlbiB0aGUgc2l6ZSBvZiBhbiBhZGRyZXNzIGlzIDMyIGJpdHMpLgorICAgIC8vLyAyLiBBbiBhZGRyZXNzLCB3aGljaCBkZWZpbmVzIHRoZSBhcHByb3ByaWF0ZSBiYXNlIGFkZHJlc3MgZm9yCisgICAgLy8vIHVzZSBpbiBpbnRlcnByZXRpbmcgdGhlIGJlZ2lubmluZyBhbmQgZW5kaW5nIGFkZHJlc3Mgb2Zmc2V0cyBvZgorICAgIC8vLyBzdWJzZXF1ZW50IGVudHJpZXMgb2YgdGhlIGxvY2F0aW9uIGxpc3QuCisgICAgYm9vbCBpc0Jhc2VBZGRyZXNzU2VsZWN0aW9uRW50cnkodWludDhfdCBBZGRyZXNzU2l6ZSkgY29uc3QgeworICAgICAgYXNzZXJ0KEFkZHJlc3NTaXplID09IDQgfHwgQWRkcmVzc1NpemUgPT0gOCk7CisgICAgICBpZiAoQWRkcmVzc1NpemUgPT0gNCkKKyAgICAgICAgcmV0dXJuIFN0YXJ0QWRkcmVzcyA9PSAtMVU7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBTdGFydEFkZHJlc3MgPT0gLTFVTEw7CisgICAgfQorICB9OworCitwcml2YXRlOgorICAvLy8gT2Zmc2V0IGluIC5kZWJ1Z19yYW5nZXMgc2VjdGlvbi4KKyAgdWludDMyX3QgT2Zmc2V0OworICB1aW50OF90IEFkZHJlc3NTaXplOworICBzdGQ6OnZlY3RvcjxSYW5nZUxpc3RFbnRyeT4gRW50cmllczsKKworcHVibGljOgorICBEV0FSRkRlYnVnUmFuZ2VMaXN0KCkgeyBjbGVhcigpOyB9CisKKyAgdm9pZCBjbGVhcigpOworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgYm9vbCBleHRyYWN0KGNvbnN0IERXQVJGRGF0YUV4dHJhY3RvciAmZGF0YSwgdWludDMyX3QgKm9mZnNldF9wdHIpOworICBjb25zdCBzdGQ6OnZlY3RvcjxSYW5nZUxpc3RFbnRyeT4gJmdldEVudHJpZXMoKSB7IHJldHVybiBFbnRyaWVzOyB9CisKKyAgLy8vIGdldEFic29sdXRlUmFuZ2VzIC0gUmV0dXJucyBhYnNvbHV0ZSBhZGRyZXNzIHJhbmdlcyBkZWZpbmVkIGJ5IHRoaXMgcmFuZ2UKKyAgLy8vIGxpc3QuIEhhcyB0byBiZSBwYXNzZWQgYmFzZSBhZGRyZXNzIG9mIHRoZSBjb21waWxlIHVuaXQgcmVmZXJlbmNpbmcgdGhpcworICAvLy8gcmFuZ2UgbGlzdC4KKyAgRFdBUkZBZGRyZXNzUmFuZ2VzVmVjdG9yCisgIGdldEFic29sdXRlUmFuZ2VzKGxsdm06Ok9wdGlvbmFsPEJhc2VBZGRyZXNzPiBCYXNlQWRkcikgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZERUJVR1JBTkdFTElTVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnUm5nbGlzdHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdSbmdsaXN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NzlkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnUm5nbGlzdHMuaApAQCAtMCwwICsxLDgxIEBACisvLz09PS0gRFdBUkZEZWJ1Z1JuZ2xpc3RzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0RXQVJGREVCVUdSTkdMSVNUU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0RXQVJGREVCVUdSTkdMSVNUU19ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9ESUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRhdGFFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnUmFuZ2VMaXN0LmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRXJyb3I7CitjbGFzcyByYXdfb3N0cmVhbTsKKworY2xhc3MgRFdBUkZEZWJ1Z1JuZ2xpc3RzIHsKK3ByaXZhdGU6CisgIHN0cnVjdCBIZWFkZXIgeworICAgIC8vLyBUaGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBlbnRyaWVzIGZvciB0aGlzIHRhYmxlLCBub3QgaW5jbHVkaW5nIHRoZSBsZW5ndGgKKyAgICAvLy8gZmllbGQgaXRzZWxmLgorICAgIHVpbnQzMl90IExlbmd0aCA9IDA7CisgICAgLy8vIFRoZSBEV0FSRiB2ZXJzaW9uIG51bWJlci4KKyAgICB1aW50MTZfdCBWZXJzaW9uOworICAgIC8vLyBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBhZGRyZXNzIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiBGb3IKKyAgICAvLy8gc2VnbWVudGVkIGFkZHJlc3NpbmcsIHRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIG9mZnNldCBwb3J0aW9uIG9mIHRoZQorICAgIC8vLyBhZGRyZXNzLgorICAgIHVpbnQ4X3QgQWRkclNpemU7CisgICAgLy8vIFRoZSBzaXplIGluIGJ5dGVzIG9mIGEgc2VnbWVudCBzZWxlY3RvciBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KKyAgICAvLy8gSWYgdGhlIHRhcmdldCBzeXN0ZW0gdXNlcyBhIGZsYXQgYWRkcmVzcyBzcGFjZSwgdGhpcyB2YWx1ZSBpcyAwLgorICAgIHVpbnQ4X3QgU2VnU2l6ZTsKKyAgICAvLy8gVGhlIG51bWJlciBvZiBvZmZzZXRzIHRoYXQgZm9sbG93IHRoZSBoZWFkZXIgYmVmb3JlIHRoZSByYW5nZSBsaXN0cy4KKyAgICB1aW50MzJfdCBPZmZzZXRFbnRyeUNvdW50OworICB9OworCitwdWJsaWM6CisgIHN0cnVjdCBSYW5nZUxpc3RFbnRyeSB7CisgICAgLy8vIFRoZSBvZmZzZXQgYXQgd2hpY2ggdGhlIGVudHJ5IGlzIGxvY2F0ZWQgaW4gdGhlIHNlY3Rpb24uCisgICAgY29uc3QgdWludDMyX3QgT2Zmc2V0OworICAgIC8vLyBUaGUgRFdBUkYgZW5jb2RpbmcgKERXX1JMRV8qKS4KKyAgICBjb25zdCB1aW50OF90IEVudHJ5S2luZDsKKyAgICAvLy8gVGhlIHZhbHVlcyBtYWtpbmcgdXAgdGhlIHJhbmdlIGxpc3QgZW50cnkuIE1vc3QgcmVwcmVzZW50IGEgcmFuZ2Ugd2l0aAorICAgIC8vLyBhIHN0YXJ0IGFuZCBlbmQgYWRkcmVzcyBvciBhIHN0YXJ0IGFkZHJlc3MgYW5kIGEgbGVuZ3RoLiBPdGhlcnMgYXJlCisgICAgLy8vIHNpbmdsZSB2YWx1ZSBiYXNlIGFkZHJlc3NlcyBvciBlbmQtb2YtbGlzdCB3aXRoIG5vIHZhbHVlcy4gVGhlIHVubmVlZGVkCisgICAgLy8vIHZhbHVlcyBhcmUgc2VtYW50aWNhbGx5IHVuZGVmaW5lZCwgYnV0IGluaXRpYWxpemVkIHRvIDAuCisgICAgY29uc3QgdWludDY0X3QgVmFsdWUwOworICAgIGNvbnN0IHVpbnQ2NF90IFZhbHVlMTsKKyAgfTsKKworICB1c2luZyBEV0FSRlJhbmdlTGlzdCA9IHN0ZDo6dmVjdG9yPFJhbmdlTGlzdEVudHJ5PjsKKworcHJpdmF0ZToKKyAgdWludDMyX3QgSGVhZGVyT2Zmc2V0OworICBIZWFkZXIgSGVhZGVyRGF0YTsKKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IE9mZnNldHM7CisgIHN0ZDo6dmVjdG9yPERXQVJGUmFuZ2VMaXN0PiBSYW5nZXM7CisgIC8vIFRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3QgZW5jb2Rpbmcgc3RyaW5nIHdlIGVuY291bnRlcmVkIGR1cmluZyBwYXJzaW5nLgorICB1aW50OF90IE1heEVuY29kaW5nU3RyaW5nTGVuZ3RoID0gMDsKKworcHVibGljOgorICB2b2lkIGNsZWFyKCk7CisgIEVycm9yIGV4dHJhY3QoRFdBUkZEYXRhRXh0cmFjdG9yIERhdGEsIHVpbnQzMl90ICpPZmZzZXRQdHIpOworICB1aW50MzJfdCBnZXRIZWFkZXJPZmZzZXQoKSBjb25zdCB7IHJldHVybiBIZWFkZXJPZmZzZXQ7IH0KKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUywgRElEdW1wT3B0aW9ucyBEdW1wT3B0cykgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGlzIHRhYmxlLCBpbmNsdWRpbmcgdGhlIGxlbmd0aCBmaWVsZCwgb3IgMCBpZiB0aGUKKyAgLy8vIGxlbmd0aCBoYXMgbm90IGJlZW4gZGV0ZXJtaW5lZCAoZS5nLiBiZWNhdXNlIHRoZSB0YWJsZSBoYXMgbm90IHlldCBiZWVuCisgIC8vLyBwYXJzZWQsIG9yIHRoZXJlIHdhcyBhIHByb2JsZW0gaW4gcGFyc2luZykuCisgIHVpbnQzMl90IGxlbmd0aCgpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGREVCVUdSTkdMSVNUU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRpZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEaWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWEzZGQzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEaWUuaApAQCAtMCwwICsxLDM1MyBAQAorLy89PT0tIERXQVJGRGllLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRkRJRV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0RXQVJGRElFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9ESUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkFkZHJlc3NSYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGQXR0cmlidXRlLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0luZm9FbnRyeS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBEV0FSRlVuaXQ7CitjbGFzcyByYXdfb3N0cmVhbTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBVdGlsaXR5IGNsYXNzIHRoYXQgY2FycmllcyB0aGUgRFdBUkYgY29tcGlsZS90eXBlIHVuaXQgYW5kIHRoZSBkZWJ1ZyBpbmZvCisvLy8gZW50cnkgaW4gYW4gb2JqZWN0LgorLy8vCisvLy8gV2hlbiBhY2Nlc3NpbmcgaW5mb3JtYXRpb24gZnJvbSBhIGRlYnVnIGluZm8gZW50cnkgd2UgYWx3YXlzIG5lZWQgdG8gRFdBUkYKKy8vLyBjb21waWxlL3R5cGUgdW5pdCBpbiBvcmRlciB0byBleHRyYWN0IHRoZSBpbmZvIGNvcnJlY3RseSBhcyBzb21lIGluZm9ybWF0aW9uCisvLy8gaXMgcmVsYXRpdmUgdG8gdGhlIGNvbXBpbGUvdHlwZSB1bml0LiBQcmlvciB0byB0aGlzIGNsYXNzIHRoZSBEV0FSRlVuaXQgYW5kCisvLy8gdGhlIERXQVJGRGVidWdJbmZvRW50cnkgd2FzIHBhc3NlZCBhcm91bmQgc2VwYXJhdGVseSBhbmQgdGhlcmUgd2FzIHRoZQorLy8vIHBvc3NpYmlsaXR5IGZvciBlcnJvciBpZiB0aGUgd3JvbmcgRFdBUkZVbml0IHdhcyB1c2VkIHRvIGV4dHJhY3QgYSB1bml0CisvLy8gcmVsYXRpdmUgb2Zmc2V0LiBUaGlzIGNsYXNzIGhlbHBzIHRvIGVuc3VyZSB0aGF0IHRoaXMgZG9lc24ndCBoYXBwZW4gYW5kCisvLy8gYWxzbyBzaW1wbGlmaWVzIHRoZSBhdHRyaWJ1dGUgZXh0cmFjdGlvbiBjYWxscyBieSBub3QgaGF2aW5nIHRvIHNwZWNpZnkgdGhlCisvLy8gRFdBUkZVbml0IGZvciBlYWNoIGNhbGwuCitjbGFzcyBEV0FSRkRpZSB7CisgIERXQVJGVW5pdCAqVSA9IG51bGxwdHI7CisgIGNvbnN0IERXQVJGRGVidWdJbmZvRW50cnkgKkRpZSA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgRFdBUkZEaWUoKSA9IGRlZmF1bHQ7CisgIERXQVJGRGllKERXQVJGVW5pdCAqVW5pdCwgY29uc3QgRFdBUkZEZWJ1Z0luZm9FbnRyeSAqIEQpIDogVShVbml0KSwgRGllKEQpIHt9CisKKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gVSAmJiBEaWU7IH0KKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGlzVmFsaWQoKTsgfQorICBjb25zdCBEV0FSRkRlYnVnSW5mb0VudHJ5ICpnZXREZWJ1Z0luZm9FbnRyeSgpIGNvbnN0IHsgcmV0dXJuIERpZTsgfQorICBEV0FSRlVuaXQgKmdldER3YXJmVW5pdCgpIGNvbnN0IHsgcmV0dXJuIFU7IH0KKworICAvLy8gR2V0IHRoZSBhYmJyZXZpYXRpb24gZGVjbGFyYXRpb24gZm9yIHRoaXMgRElFLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSBhYmJyZXZpYXRpb24gZGVjbGFyYXRpb24gb3IgTlVMTCBmb3IgbnVsbCB0YWdzLgorICBjb25zdCBEV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uICpnZXRBYmJyZXZpYXRpb25EZWNsYXJhdGlvblB0cigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJtdXN0IGNoZWNrIHZhbGlkaXR5IHByaW9yIHRvIGNhbGxpbmciKTsKKyAgICByZXR1cm4gRGllLT5nZXRBYmJyZXZpYXRpb25EZWNsYXJhdGlvblB0cigpOworICB9CisKKyAgLy8vIEdldCB0aGUgYWJzb2x1dGUgb2Zmc2V0IGludG8gdGhlIGRlYnVnIGluZm8gb3IgdHlwZXMgc2VjdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgRElFIG9mZnNldCBvciAtMVUgaWYgaW52YWxpZC4KKyAgdWludDMyX3QgZ2V0T2Zmc2V0KCkgY29uc3QgeworICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIm11c3QgY2hlY2sgdmFsaWRpdHkgcHJpb3IgdG8gY2FsbGluZyIpOworICAgIHJldHVybiBEaWUtPmdldE9mZnNldCgpOworICB9CisKKyAgZHdhcmY6OlRhZyBnZXRUYWcoKSBjb25zdCB7CisgICAgYXV0byBBYmJyZXZEZWNsID0gZ2V0QWJicmV2aWF0aW9uRGVjbGFyYXRpb25QdHIoKTsKKyAgICBpZiAoQWJicmV2RGVjbCkKKyAgICAgIHJldHVybiBBYmJyZXZEZWNsLT5nZXRUYWcoKTsKKyAgICByZXR1cm4gZHdhcmY6OkRXX1RBR19udWxsOworICB9CisKKyAgYm9vbCBoYXNDaGlsZHJlbigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJtdXN0IGNoZWNrIHZhbGlkaXR5IHByaW9yIHRvIGNhbGxpbmciKTsKKyAgICByZXR1cm4gRGllLT5oYXNDaGlsZHJlbigpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBmb3IgYSB2YWxpZCBESUUgdGhhdCB0ZXJtaW5hdGVzIGEgc2libGluZyBjaGFpbi4KKyAgYm9vbCBpc05VTEwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEFiYnJldmlhdGlvbkRlY2xhcmF0aW9uUHRyKCkgPT0gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgRElFIHJlcHJlc2VudHMgYSBzdWJwcm9ncmFtIChub3QgaW5saW5lZCkuCisgIGJvb2wgaXNTdWJwcm9ncmFtRElFKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBESUUgcmVwcmVzZW50cyBhIHN1YnByb2dyYW0gb3IgYW4gaW5saW5lZCBzdWJyb3V0aW5lLgorICBib29sIGlzU3Vicm91dGluZURJRSgpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIHBhcmVudCBvZiB0aGlzIERJRSBvYmplY3QuCisgIC8vLworICAvLy8gXHJldHVybnMgYSB2YWxpZCBEV0FSRkRpZSBpbnN0YW5jZSBpZiB0aGlzIG9iamVjdCBoYXMgYSBwYXJlbnQgb3IgYW4KKyAgLy8vIGludmFsaWQgRFdBUkZEaWUgaW5zdGFuY2UgaWYgaXQgZG9lc24ndC4KKyAgRFdBUkZEaWUgZ2V0UGFyZW50KCkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgc2libGluZyBvZiB0aGlzIERJRSBvYmplY3QuCisgIC8vLworICAvLy8gXHJldHVybnMgYSB2YWxpZCBEV0FSRkRpZSBpbnN0YW5jZSBpZiB0aGlzIG9iamVjdCBoYXMgYSBzaWJsaW5nIG9yIGFuCisgIC8vLyBpbnZhbGlkIERXQVJGRGllIGluc3RhbmNlIGlmIGl0IGRvZXNuJ3QuCisgIERXQVJGRGllIGdldFNpYmxpbmcoKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBmaXJzdCBjaGlsZCBvZiB0aGlzIERJRSBvYmplY3QuCisgIC8vLworICAvLy8gXHJldHVybnMgYSB2YWxpZCBEV0FSRkRpZSBpbnN0YW5jZSBpZiB0aGlzIG9iamVjdCBoYXMgY2hpbGRyZW4gb3IgYW4KKyAgLy8vIGludmFsaWQgRFdBUkZEaWUgaW5zdGFuY2UgaWYgaXQgZG9lc24ndC4KKyAgRFdBUkZEaWUgZ2V0Rmlyc3RDaGlsZCgpIGNvbnN0OworCisgIC8vLyBEdW1wIHRoZSBESUUgYW5kIGFsbCBvZiBpdHMgYXR0cmlidXRlcyB0byB0aGUgc3VwcGxpZWQgc3RyZWFtLgorICAvLy8KKyAgLy8vIFxwYXJhbSBPUyB0aGUgc3RyZWFtIHRvIHVzZSBmb3Igb3V0cHV0LgorICAvLy8gXHBhcmFtIGluZGVudCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gaW5kZW50IGVhY2ggbGluZSB0aGF0IGlzIG91dHB1dC4KKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgaW5kZW50ID0gMCwKKyAgICAgICAgICAgIERJRHVtcE9wdGlvbnMgRHVtcE9wdHMgPSBESUR1bXBPcHRpb25zKCkpIGNvbnN0OworCisKKyAgLy8vIENvbnZlbmllbmNlIHplcm8tYXJndW1lbnQgb3ZlcmxvYWQgZm9yIGRlYnVnZ2luZy4KKyAgTExWTV9EVU1QX01FVEhPRCB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLy8gRXh0cmFjdCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBmcm9tIHRoaXMgRElFLgorICAvLy8KKyAgLy8vIEV4dHJhY3QgYW4gYXR0cmlidXRlIHZhbHVlIGZyb20gdGhpcyBESUUgb25seS4gVGhpcyBjYWxsIGRvZXNuJ3QgbG9vaworICAvLy8gZm9yIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaW4gYW55IERXX0FUX3NwZWNpZmljYXRpb24gb3IKKyAgLy8vIERXX0FUX2Fic3RyYWN0X29yaWdpbiByZWZlcmVuY2VkIERJRXMuCisgIC8vLworICAvLy8gXHBhcmFtIEF0dHIgdGhlIGF0dHJpYnV0ZSB0byBleHRyYWN0LgorICAvLy8gXHJldHVybnMgYW4gb3B0aW9uYWwgRFdBUkZGb3JtVmFsdWUgdGhhdCB3aWxsIGhhdmUgdGhlIGZvcm0gdmFsdWUgaWYgdGhlCisgIC8vLyBhdHRyaWJ1dGUgd2FzIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQuCisgIE9wdGlvbmFsPERXQVJGRm9ybVZhbHVlPiBmaW5kKGR3YXJmOjpBdHRyaWJ1dGUgQXR0cikgY29uc3Q7CisKKyAgLy8vIEV4dHJhY3QgdGhlIGZpcnN0IHZhbHVlIG9mIGFueSBhdHRyaWJ1dGUgaW4gQXR0cnMgZnJvbSB0aGlzIERJRS4KKyAgLy8vCisgIC8vLyBFeHRyYWN0IHRoZSBmaXJzdCBhdHRyaWJ1dGUgdGhhdCBtYXRjaGVzIGZyb20gdGhpcyBESUUgb25seS4gVGhpcyBjYWxsCisgIC8vLyBkb2Vzbid0IGxvb2sgZm9yIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaW4gYW55IERXX0FUX3NwZWNpZmljYXRpb24gb3IKKyAgLy8vIERXX0FUX2Fic3RyYWN0X29yaWdpbiByZWZlcmVuY2VkIERJRXMuIFRoZSBhdHRyaWJ1dGVzIHdpbGwgYmUgc2VhcmNoZWQKKyAgLy8vIGxpbmVhcmx5IGluIHRoZSBvcmRlciB0aGV5IGFyZSBzcGVjaWZpZWQgd2l0aGluIEF0dHJzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBBdHRycyBhbiBhcnJheSBvZiBEV0FSRiBhdHRyaWJ1dGUgdG8gbG9vayBmb3IuCisgIC8vLyBccmV0dXJucyBhbiBvcHRpb25hbCB0aGF0IGhhcyBhIHZhbGlkIERXQVJGRm9ybVZhbHVlIGZvciB0aGUgZmlyc3QKKyAgLy8vIG1hdGNoaW5nIGF0dHJpYnV0ZSBpbiBBdHRycywgb3IgTm9uZSBpZiBub25lIG9mIHRoZSBhdHRyaWJ1dGVzIGluIEF0dHJzCisgIC8vLyBleGlzdCBpbiB0aGlzIERJRS4KKyAgT3B0aW9uYWw8RFdBUkZGb3JtVmFsdWU+IGZpbmQoQXJyYXlSZWY8ZHdhcmY6OkF0dHJpYnV0ZT4gQXR0cnMpIGNvbnN0OworCisgIC8vLyBFeHRyYWN0IHRoZSBmaXJzdCB2YWx1ZSBvZiBhbnkgYXR0cmlidXRlIGluIEF0dHJzIGZyb20gdGhpcyBESUUgYW5kCisgIC8vLyByZWN1cnNlIGludG8gYW55IERXX0FUX3NwZWNpZmljYXRpb24gb3IgRFdfQVRfYWJzdHJhY3Rfb3JpZ2luIHJlZmVyZW5jZWQKKyAgLy8vIERJRXMuCisgIC8vLworICAvLy8gXHBhcmFtIEF0dHJzIGFuIGFycmF5IG9mIERXQVJGIGF0dHJpYnV0ZSB0byBsb29rIGZvci4KKyAgLy8vIFxyZXR1cm5zIGFuIG9wdGlvbmFsIHRoYXQgaGFzIGEgdmFsaWQgRFdBUkZGb3JtVmFsdWUgZm9yIHRoZSBmaXJzdAorICAvLy8gbWF0Y2hpbmcgYXR0cmlidXRlIGluIEF0dHJzLCBvciBOb25lIGlmIG5vbmUgb2YgdGhlIGF0dHJpYnV0ZXMgaW4gQXR0cnMKKyAgLy8vIGV4aXN0IGluIHRoaXMgRElFIG9yIGluIGFueSBEV19BVF9zcGVjaWZpY2F0aW9uIG9yIERXX0FUX2Fic3RyYWN0X29yaWdpbgorICAvLy8gRElFcy4KKyAgT3B0aW9uYWw8RFdBUkZGb3JtVmFsdWU+CisgIGZpbmRSZWN1cnNpdmVseShBcnJheVJlZjxkd2FyZjo6QXR0cmlidXRlPiBBdHRycykgY29uc3Q7CisKKyAgLy8vIEV4dHJhY3QgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgZnJvbSB0aGlzIERJRSBhcyB0aGUgcmVmZXJlbmNlZCBESUUuCisgIC8vLworICAvLy8gUmVnYXJkbGVzcyBvZiB0aGUgcmVmZXJlbmNlIHR5cGUsIHJldHVybiB0aGUgY29ycmVjdCBEV0FSRkRpZSBpbnN0YW5jZSBpZgorICAvLy8gdGhlIGF0dHJpYnV0ZSBleGlzdHMuIFRoZSByZXR1cm5lZCBEV0FSRkRpZSBvYmplY3QgbWlnaHQgYmUgZnJvbSBhbm90aGVyCisgIC8vLyBEV0FSRlVuaXQsIGJ1dCB0aGF0IGlzIGFsbCBlbmNhcHN1bGF0ZWQgaW4gdGhlIG5ldyBEV0FSRkRpZSBvYmplY3QuCisgIC8vLworICAvLy8gRXh0cmFjdCBhbiBhdHRyaWJ1dGUgdmFsdWUgZnJvbSB0aGlzIERJRSBvbmx5LiBUaGlzIGNhbGwgZG9lc24ndCBsb29rCisgIC8vLyBmb3IgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpbiBhbnkgRFdfQVRfc3BlY2lmaWNhdGlvbiBvcgorICAvLy8gRFdfQVRfYWJzdHJhY3Rfb3JpZ2luIHJlZmVyZW5jZWQgRElFcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQXR0ciB0aGUgYXR0cmlidXRlIHRvIGV4dHJhY3QuCisgIC8vLyBccmV0dXJucyBhIHZhbGlkIERXQVJGRGllIGluc3RhbmNlIGlmIHRoZSBhdHRyaWJ1dGUgZXhpc3RzLCBvciBhbiBpbnZhbGlkCisgIC8vLyBEV0FSRkRpZSBvYmplY3QgaWYgaXQgZG9lc24ndC4KKyAgRFdBUkZEaWUgZ2V0QXR0cmlidXRlVmFsdWVBc1JlZmVyZW5jZWREaWUoZHdhcmY6OkF0dHJpYnV0ZSBBdHRyKSBjb25zdDsKKworICAvLy8gRXh0cmFjdCB0aGUgcmFuZ2UgYmFzZSBhdHRyaWJ1dGUgZnJvbSB0aGlzIERJRSBhcyBhYnNvbHV0ZSBzZWN0aW9uIG9mZnNldC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBmb3IgZWl0aGVyIHRoZSBEV19BVF9ybmdsaXN0c19iYXNlCisgIC8vLyBvciBEV19BVF9HTlVfcmFuZ2VzX2Jhc2UgYXR0cmlidXRlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGFubSBvcHRpb25hbCBhYnNvbHV0ZSBzZWN0aW9uIG9mZnNldCB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZS4KKyAgT3B0aW9uYWw8dWludDY0X3Q+IGdldFJhbmdlc0Jhc2VBdHRyaWJ1dGUoKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBEV19BVF9oaWdoX3BjIGF0dHJpYnV0ZSB2YWx1ZSBhcyBhbiBhZGRyZXNzLgorICAvLy8KKyAgLy8vIEluIERXQVJGIHZlcnNpb24gNCBhbmQgbGF0ZXIgdGhlIGhpZ2ggUEMgY2FuIGJlIGVuY29kZWQgYXMgYW4gb2Zmc2V0IGZyb20KKyAgLy8vIHRoZSBEV19BVF9sb3dfcGMuIFRoaXMgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiBleHRyYWN0aW5nIHRoZSB2YWx1ZSBhcyBhbgorICAvLy8gYWRkcmVzcyBvciBvZmZzZXQgYW5kIGFkZHMgaXQgdG8gdGhlIGxvdyBQQyBpZiBuZWVkZWQgYW5kIHJldHVybnMgdGhlCisgIC8vLyB2YWx1ZSBhcyBhbiBvcHRpb25hbCBpbiBjYXNlIHRoZSBESUUgZG9lc24ndCBoYXZlIGEgRFdfQVRfaGlnaF9wYworICAvLy8gYXR0cmlidXRlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBMb3dQQyB0aGUgbG93IFBDIHRoYXQgbWlnaHQgYmUgbmVlZGVkIHRvIGNhbGN1bGF0ZSB0aGUgaGlnaCBQQy4KKyAgLy8vIFxyZXR1cm5zIGFuIG9wdGlvbmFsIGFkZHJlc3MgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUuCisgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRIaWdoUEModWludDY0X3QgTG93UEMpIGNvbnN0OworCisgIC8vLyBSZXRyaWV2ZXMgRFdfQVRfbG93X3BjIGFuZCBEV19BVF9oaWdoX3BjIGZyb20gQ1UuCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYm90aCBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50LgorICBib29sIGdldExvd0FuZEhpZ2hQQyh1aW50NjRfdCAmTG93UEMsIHVpbnQ2NF90ICZIaWdoUEMsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICZTZWN0aW9uSW5kZXgpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIGFkZHJlc3MgcmFuZ2VzIGZvciB0aGlzIERJRS4KKyAgLy8vCisgIC8vLyBHZXQgdGhlIGhpL2xvdyBQQyByYW5nZSBpZiBib3RoIGF0dHJpYnV0ZXMgYXJlIGF2YWlsYWJsZSBvciBleHJ0cmFjdHMgdGhlCisgIC8vLyBub24tY29udGlndW91cyBhZGRyZXNzIHJhbmdlcyBmcm9tIHRoZSBEV19BVF9yYW5nZXMgYXR0cmlidXRlLgorICAvLy8KKyAgLy8vIEV4dHJhY3RzIHRoZSByYW5nZSBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgRElFIG9ubHkuIFRoaXMgY2FsbCBkb2Vzbid0IGxvb2sKKyAgLy8vIGZvciB0aGUgcmFuZ2UgaW4gYW55IERXX0FUX3NwZWNpZmljYXRpb24gb3IgRFdfQVRfYWJzdHJhY3Rfb3JpZ2luIERJRXMuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBhZGRyZXNzIHJhbmdlIHZlY3RvciB0aGF0IG1pZ2h0IGJlIGVtcHR5IGlmIG5vIGFkZHJlc3MgcmFuZ2UKKyAgLy8vIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KKyAgRFdBUkZBZGRyZXNzUmFuZ2VzVmVjdG9yIGdldEFkZHJlc3NSYW5nZXMoKSBjb25zdDsKKworICAvLy8gR2V0IGFsbCBhZGRyZXNzIHJhbmdlcyBmb3IgYW55IERXX1RBR19zdWJwcm9ncmFtIERJRXMgaW4gdGhpcyBESUUgb3IgYW55CisgIC8vLyBvZiBpdHMgY2hpbGRyZW4uCisgIC8vLworICAvLy8gR2V0IHRoZSBoaS9sb3cgUEMgcmFuZ2UgaWYgYm90aCBhdHRyaWJ1dGVzIGFyZSBhdmFpbGFibGUgb3IgZXhydHJhY3RzIHRoZQorICAvLy8gbm9uLWNvbnRpZ3VvdXMgYWRkcmVzcyByYW5nZXMgZnJvbSB0aGUgRFdfQVRfcmFuZ2VzIGF0dHJpYnV0ZSBmb3IgdGhpcyBESUUKKyAgLy8vIGFuZCBhbGwgY2hpbGRyZW4uCisgIC8vLworICAvLy8gXHBhcmFtIFJhbmdlcyB0aGUgYWRkcmVzIHJhbmdlIHZlY3RvciB0byBmaWxsIGluLgorICB2b2lkIGNvbGxlY3RDaGlsZHJlbkFkZHJlc3NSYW5nZXMoRFdBUkZBZGRyZXNzUmFuZ2VzVmVjdG9yICZSYW5nZXMpIGNvbnN0OworCisgIGJvb2wgYWRkcmVzc1JhbmdlQ29udGFpbnNBZGRyZXNzKGNvbnN0IHVpbnQ2NF90IEFkZHJlc3MpIGNvbnN0OworCisgIC8vLyBJZiBhIERJRSByZXByZXNlbnRzIGEgc3VicHJvZ3JhbSAob3IgaW5saW5lZCBzdWJyb3V0aW5lKSwgcmV0dXJucyBpdHMKKyAgLy8vIG1hbmdsZWQgbmFtZSAob3Igc2hvcnQgbmFtZSwgaWYgbWFuZ2xlZCBpcyBtaXNzaW5nKS4gVGhpcyBuYW1lIG1heSBiZQorICAvLy8gZmV0Y2hlZCBmcm9tIHNwZWNpZmljYXRpb24gb3IgYWJzdHJhY3Qgb3JpZ2luIGZvciB0aGlzIHN1YnByb2dyYW0uCisgIC8vLyBSZXR1cm5zIG51bGwgaWYgbm8gbmFtZSBpcyBmb3VuZC4KKyAgY29uc3QgY2hhciAqZ2V0U3Vicm91dGluZU5hbWUoRElOYW1lS2luZCBLaW5kKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBESUUgbmFtZSByZXNvbHZpbmcgRFdfQVRfc2VwY2lmaWNhdGlvbiBvciBEV19BVF9hYnN0cmFjdF9vcmlnaW4KKyAgLy8vIHJlZmVyZW5jZXMgaWYgbmVjZXNzYXJ5LiBSZXR1cm5zIG51bGwgaWYgbm8gbmFtZSBpcyBmb3VuZC4KKyAgY29uc3QgY2hhciAqZ2V0TmFtZShESU5hbWVLaW5kIEtpbmQpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBkZWNsYXJhdGlvbiBsaW5lIChzdGFydCBsaW5lKSBmb3IgYSBESUUsIGFzc3VtaW5nIGl0IHNwZWNpZmllcworICAvLy8gYSBzdWJwcm9ncmFtLiBUaGlzIG1heSBiZSBmZXRjaGVkIGZyb20gc3BlY2lmaWNhdGlvbiBvciBhYnN0cmFjdCBvcmlnaW4KKyAgLy8vIGZvciB0aGlzIHN1YnByb2dyYW0gYnkgcmVzb2x2aW5nIERXX0FUX3NlcGNpZmljYXRpb24gb3IKKyAgLy8vIERXX0FUX2Fic3RyYWN0X29yaWdpbiByZWZlcmVuY2VzIGlmIG5lY2Vzc2FyeS4KKyAgdWludDY0X3QgZ2V0RGVjbExpbmUoKSBjb25zdDsKKworICAvLy8gUmV0cmlldmVzIHZhbHVlcyBvZiBEV19BVF9jYWxsX2ZpbGUsIERXX0FUX2NhbGxfbGluZSBhbmQgRFdfQVRfY2FsbF9jb2x1bW4KKyAgLy8vIGZyb20gRElFIChvciB6ZXJvZXMgaWYgdGhleSBhcmUgbWlzc2luZykuIFRoaXMgZnVuY3Rpb24gbG9va3MgZm9yCisgIC8vLyBEV19BVF9jYWxsIGF0dHJpYnV0ZXMgaW4gdGhpcyBESUUgb25seSwgaXQgd2lsbCBub3QgcmVzb2x2ZSB0aGUgYXR0cmlidXRlCisgIC8vLyB2YWx1ZXMgaW4gYW55IERXX0FUX3NwZWNpZmljYXRpb24gb3IgRFdfQVRfYWJzdHJhY3Rfb3JpZ2luIERJRXMuCisgIC8vLyBccGFyYW0gQ2FsbEZpbGUgZmlsbGVkIGluIHdpdGggbm9uLXplcm8gaWYgc3VjY2Vzc2Z1bCwgemVybyBpZiB0aGVyZSBpcyBubworICAvLy8gRFdfQVRfY2FsbF9maWxlIGF0dHJpYnV0ZSBpbiB0aGlzIERJRS4KKyAgLy8vIFxwYXJhbSBDYWxsTGluZSBmaWxsZWQgaW4gd2l0aCBub24temVybyBpZiBzdWNjZXNzZnVsLCB6ZXJvIGlmIHRoZXJlIGlzIG5vCisgIC8vLyBEV19BVF9jYWxsX2xpbmUgYXR0cmlidXRlIGluIHRoaXMgRElFLgorICAvLy8gXHBhcmFtIENhbGxDb2x1bW4gZmlsbGVkIGluIHdpdGggbm9uLXplcm8gaWYgc3VjY2Vzc2Z1bCwgemVybyBpZiB0aGVyZSBpcworICAvLy8gbm8gRFdfQVRfY2FsbF9jb2x1bW4gYXR0cmlidXRlIGluIHRoaXMgRElFLgorICAvLy8gXHBhcmFtIENhbGxEaXNjcmltaW5hdG9yIGZpbGxlZCBpbiB3aXRoIG5vbi16ZXJvIGlmIHN1Y2Nlc3NmdWwsIHplcm8gaWYKKyAgLy8vIHRoZXJlIGlzIG5vIERXX0FUX0dOVV9kaXNjcmltaW5hdG9yIGF0dHJpYnV0ZSBpbiB0aGlzIERJRS4KKyAgdm9pZCBnZXRDYWxsZXJGcmFtZSh1aW50MzJfdCAmQ2FsbEZpbGUsIHVpbnQzMl90ICZDYWxsTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmQ2FsbENvbHVtbiwgdWludDMyX3QgJkNhbGxEaXNjcmltaW5hdG9yKSBjb25zdDsKKworICBjbGFzcyBhdHRyaWJ1dGVfaXRlcmF0b3I7CisKKyAgLy8vIEdldCBhbiBpdGVyYXRvciByYW5nZSB0byBhbGwgYXR0cmlidXRlcyBpbiB0aGUgY3VycmVudCBESUUgb25seS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhbiBpdGVyYXRvciByYW5nZSBmb3IgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGN1cnJlbnQgRElFLgorICBpdGVyYXRvcl9yYW5nZTxhdHRyaWJ1dGVfaXRlcmF0b3I+IGF0dHJpYnV0ZXMoKSBjb25zdDsKKworICBjbGFzcyBpdGVyYXRvcjsKKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0OworICBpdGVyYXRvciBlbmQoKSBjb25zdDsKKyAgaXRlcmF0b3JfcmFuZ2U8aXRlcmF0b3I+IGNoaWxkcmVuKCkgY29uc3Q7Cit9OworCitjbGFzcyBEV0FSRkRpZTo6YXR0cmlidXRlX2l0ZXJhdG9yIDoKKyAgICBwdWJsaWMgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8YXR0cmlidXRlX2l0ZXJhdG9yLCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEV0FSRkF0dHJpYnV0ZT4geworICAvLy8gVGhlIERXQVJGIERJRSB3ZSBhcmUgZXh0cmFjdGluZyBhdHRyaWJ1dGVzIGZyb20uCisgIERXQVJGRGllIERpZTsKKyAgLy8vIFRoZSB2YWx1ZSB2ZW5kZWQgdG8gY2xpZW50cyB2aWEgdGhlIG9wZXJhdG9yKigpIG9yIG9wZXJhdG9yLT4oKS4KKyAgRFdBUkZBdHRyaWJ1dGUgQXR0clZhbHVlOworICAvLy8gVGhlIGF0dHJpYnV0ZSBpbmRleCB3aXRoaW4gdGhlIGFiYnJldmlhdGlvbiBkZWNsYXJhdGlvbiBpbiBEaWUuCisgIHVpbnQzMl90IEluZGV4OworCisgIC8vLyBVcGRhdGUgdGhlIGF0dHJpYnV0ZSBpbmRleCBhbmQgYXR0ZW1wdCB0byByZWFkIHRoZSBhdHRyaWJ1dGUgdmFsdWUuIElmIHRoZQorICAvLy8gYXR0cmlidXRlIGlzIGFibGUgdG8gYmUgcmVhZCwgdXBkYXRlIEF0dHJWYWx1ZSBhbmQgdGhlIEluZGV4IG1lbWJlcgorICAvLy8gdmFyaWFibGUuIElmIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgbm90IGFibGUgdG8gYmUgcmVhZCwgYW4gYXBwcm9wcmlhdGUKKyAgLy8vIGVycm9yIHdpbGwgYmUgc2V0IGlmIHRoZSBFcnIgbWVtYmVyIHZhcmlhYmxlIGlzIG5vbi1OVUxMIGFuZCB0aGUgaXRlcmF0b3IKKyAgLy8vIHdpbGwgYmUgc2V0IHRvIHRoZSBlbmQgdmFsdWUgc28gaXRlcmF0aW9uIHN0b3BzLgorICB2b2lkIHVwZGF0ZUZvckluZGV4KGNvbnN0IERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb24gJkFiYnJEZWNsLCB1aW50MzJfdCBJKTsKKworcHVibGljOgorICBhdHRyaWJ1dGVfaXRlcmF0b3IoKSA9IGRlbGV0ZTsKKyAgZXhwbGljaXQgYXR0cmlidXRlX2l0ZXJhdG9yKERXQVJGRGllIEQsIGJvb2wgRW5kKTsKKworICBhdHRyaWJ1dGVfaXRlcmF0b3IgJm9wZXJhdG9yKysoKTsKKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIEF0dHJWYWx1ZS5pc1ZhbGlkKCk7IH0KKyAgY29uc3QgRFdBUkZBdHRyaWJ1dGUgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIEF0dHJWYWx1ZTsgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgYXR0cmlidXRlX2l0ZXJhdG9yICZYKSBjb25zdCB7IHJldHVybiBJbmRleCA9PSBYLkluZGV4OyB9Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IERXQVJGRGllICZMSFMsIGNvbnN0IERXQVJGRGllICZSSFMpIHsKKyAgcmV0dXJuIExIUy5nZXREZWJ1Z0luZm9FbnRyeSgpID09IFJIUy5nZXREZWJ1Z0luZm9FbnRyeSgpICYmCisgICAgICBMSFMuZ2V0RHdhcmZVbml0KCkgPT0gUkhTLmdldER3YXJmVW5pdCgpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IERXQVJGRGllICZMSFMsIGNvbnN0IERXQVJGRGllICZSSFMpIHsKKyAgcmV0dXJuICEoTEhTID09IFJIUyk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBEV0FSRkRpZSAmTEhTLCBjb25zdCBEV0FSRkRpZSAmUkhTKSB7CisgIHJldHVybiBMSFMuZ2V0T2Zmc2V0KCkgPCBSSFMuZ2V0T2Zmc2V0KCk7Cit9CisKK2NsYXNzIERXQVJGRGllOjppdGVyYXRvciA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTxpdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEV0FSRkRpZT4geworICBEV0FSRkRpZSBEaWU7CisgIHZvaWQgc2tpcE51bGwoKSB7CisgICAgaWYgKERpZSAmJiBEaWUuaXNOVUxMKCkpCisgICAgICBEaWUgPSBEV0FSRkRpZSgpOworICB9CitwdWJsaWM6CisgIGl0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgIGV4cGxpY2l0IGl0ZXJhdG9yKERXQVJGRGllIEQpIDogRGllKEQpIHsKKyAgICAvLyBJZiB3ZSBzdGFydCBvdXQgd2l0aCBvbmx5IGEgTnVsbCBESUUgdGhlbiBpbnZhbGlkYXRlLgorICAgIHNraXBOdWxsKCk7CisgIH0KKworICBpdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICBEaWUgPSBEaWUuZ2V0U2libGluZygpOworICAgIC8vIERvbid0IGluY2x1ZGUgdGhlIE5VTEwgZGllIHdoZW4gaXRlcmF0aW5nLgorICAgIHNraXBOdWxsKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIERpZS5pc1ZhbGlkKCk7IH0KKyAgY29uc3QgRFdBUkZEaWUgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIERpZTsgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3IgJlgpIGNvbnN0IHsgcmV0dXJuIERpZSA9PSBYLkRpZTsgfQorfTsKKworLy8gVGhlc2UgaW5saW5lIGZ1bmN0aW9ucyBtdXN0IGZvbGxvdyB0aGUgRFdBUkZEaWU6Oml0ZXJhdG9yIGRlZmluaXRpb24gYWJvdmUKKy8vIGFzIHRoZXkgdXNlIGZ1bmN0aW9ucyBmcm9tIHRoYXQgY2xhc3MuCitpbmxpbmUgRFdBUkZEaWU6Oml0ZXJhdG9yIERXQVJGRGllOjpiZWdpbigpIGNvbnN0IHsKKyAgcmV0dXJuIGl0ZXJhdG9yKGdldEZpcnN0Q2hpbGQoKSk7Cit9CisKK2lubGluZSBEV0FSRkRpZTo6aXRlcmF0b3IgRFdBUkZEaWU6OmVuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGl0ZXJhdG9yKCk7Cit9CisKK2lubGluZSBpdGVyYXRvcl9yYW5nZTxEV0FSRkRpZTo6aXRlcmF0b3I+IERXQVJGRGllOjpjaGlsZHJlbigpIGNvbnN0IHsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoYmVnaW4oKSwgZW5kKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fRFdBUkZESUVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZFeHByZXNzaW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkV4cHJlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmFkNjhhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZFeHByZXNzaW9uLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8vPT09LS0tIERXQVJGRXhwcmVzc2lvbi5oIC0gRFdBUkYgRXhwcmVzc2lvbiBoYW5kbGluZyAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZFWFBSRVNTSU9OX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZFWFBSRVNTSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhRXh0cmFjdG9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIERXQVJGVW5pdDsKK2NsYXNzIE1DUmVnaXN0ZXJJbmZvOworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIERXQVJGRXhwcmVzc2lvbiB7CitwdWJsaWM6CisgIGNsYXNzIGl0ZXJhdG9yOworCisgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gT3BlcmF0aW9uIGluIHRoZSBFeHByZXNzaW9uLiBFYWNoIG9wZXJhdGlvbiBjYW4KKyAgLy8vIGhhdmUgdXAgdG8gMiBvcHJlcmFuZHMuCisgIC8vLworICAvLy8gQW4gT3BlcmF0aW9uIGNhbiBiZSBpbiBFcnJvciBzdGF0ZSAoY2hlY2sgd2l0aCBpc0Vycm9yKCkpLiBUaGlzCisgIC8vLyBtZWFucyB0aGF0IGl0IGNvdWxkbid0IGJlIGRlY29kZWQgc3VjY2Vzc2Z1bGx5IGFuZCBpZiBpdCBpcyB0aGUKKyAgLy8vIGNhc2UsIGFsbCBvdGhlcnMgZmllbGRzIGNvbnRhaW4gdW5kZWZpbmVkIHZhbHVlcy4KKyAgY2xhc3MgT3BlcmF0aW9uIHsKKyAgcHVibGljOgorICAgIC8vLyBTaXplIGFuZCBzaWduZWRuZXNzIG9mIGV4cHJlc3Npb24gb3BlcmF0aW9ucycgb3BlcmFuZHMuCisgICAgZW51bSBFbmNvZGluZyA6IHVpbnQ4X3QgeworICAgICAgU2l6ZTEgPSAwLAorICAgICAgU2l6ZTIgPSAxLAorICAgICAgU2l6ZTQgPSAyLAorICAgICAgU2l6ZTggPSAzLAorICAgICAgU2l6ZUxFQiA9IDQsCisgICAgICBTaXplQWRkciA9IDUsCisgICAgICBTaXplUmVmQWRkciA9IDYsCisgICAgICBTaXplQmxvY2sgPSA3LCAvLy88IFByZWNlZGluZyBvcGVyYW5kIGNvbnRhaW5zIGJsb2NrIHNpemUKKyAgICAgIFNpZ25CaXQgPSAweDgsCisgICAgICBTaWduZWRTaXplMSA9IFNpZ25CaXQgfCBTaXplMSwKKyAgICAgIFNpZ25lZFNpemUyID0gU2lnbkJpdCB8IFNpemUyLAorICAgICAgU2lnbmVkU2l6ZTQgPSBTaWduQml0IHwgU2l6ZTQsCisgICAgICBTaWduZWRTaXplOCA9IFNpZ25CaXQgfCBTaXplOCwKKyAgICAgIFNpZ25lZFNpemVMRUIgPSBTaWduQml0IHwgU2l6ZUxFQiwKKyAgICAgIFNpemVOQSA9IDB4RkYgLy8vPCBVbnVzZWQgb3BlcmFuZHMgZ2V0IHRoaXMgZW5jb2RpbmcuCisgICAgfTsKKworICAgIGVudW0gRHdhcmZWZXJzaW9uIDogdWludDhfdCB7CisgICAgICBEd2FyZk5BLCAvLy88IFNlcnZlcyBhcyBhIG1hcmtlciBmb3IgdW51c2VkIGVudHJpZXMKKyAgICAgIER3YXJmMiA9IDIsCisgICAgICBEd2FyZjMsCisgICAgICBEd2FyZjQKKyAgICB9OworCisgICAgLy8vIERlc2NyaXB0aW9uIG9mIHRoZSBlbmNvZGluZyBvZiBvbmUgZXhwcmVzc2lvbiBPcC4KKyAgICBzdHJ1Y3QgRGVzY3JpcHRpb24geworICAgICAgRHdhcmZWZXJzaW9uIFZlcnNpb247IC8vLzwgRHdhcmYgdmVyc2lvbiB3aGVyZSB0aGUgT3Agd2FzIGludHJvZHVjZWQuCisgICAgICBFbmNvZGluZyBPcFsyXTsgICAgICAgLy8vPCBFbmNvZGluZyBmb3IgT3Agb3BlcmFuZHMsIG9yIFNpemVOQS4KKworICAgICAgRGVzY3JpcHRpb24oRHdhcmZWZXJzaW9uIFZlcnNpb24gPSBEd2FyZk5BLCBFbmNvZGluZyBPcDEgPSBTaXplTkEsCisgICAgICAgICAgICAgICAgICBFbmNvZGluZyBPcDIgPSBTaXplTkEpCisgICAgICAgICAgOiBWZXJzaW9uKFZlcnNpb24pIHsKKyAgICAgICAgT3BbMF0gPSBPcDE7CisgICAgICAgIE9wWzFdID0gT3AyOworICAgICAgfQorICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRFdBUkZFeHByZXNzaW9uOjppdGVyYXRvcjsKKyAgICB1aW50OF90IE9wY29kZTsgLy8vPCBUaGUgT3AgT3Bjb2RlLCBEV19PUF88c29tZXRoaW5nPi4KKyAgICBEZXNjcmlwdGlvbiBEZXNjOworICAgIGJvb2wgRXJyb3I7CisgICAgdWludDMyX3QgRW5kT2Zmc2V0OworICAgIHVpbnQ2NF90IE9wZXJhbmRzWzJdOworCisgIHB1YmxpYzoKKyAgICBEZXNjcmlwdGlvbiAmZ2V0RGVzY3JpcHRpb24oKSB7IHJldHVybiBEZXNjOyB9CisgICAgdWludDhfdCBnZXRDb2RlKCkgeyByZXR1cm4gT3Bjb2RlOyB9CisgICAgdWludDY0X3QgZ2V0UmF3T3BlcmFuZCh1bnNpZ25lZCBJZHgpIHsgcmV0dXJuIE9wZXJhbmRzW0lkeF07IH0KKyAgICB1aW50MzJfdCBnZXRFbmRPZmZzZXQoKSB7IHJldHVybiBFbmRPZmZzZXQ7IH0KKyAgICBib29sIGV4dHJhY3QoRGF0YUV4dHJhY3RvciBEYXRhLCB1aW50MTZfdCBWZXJzaW9uLCB1aW50OF90IEFkZHJlc3NTaXplLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCBPZmZzZXQpOworICAgIGJvb2wgaXNFcnJvcigpIHsgcmV0dXJuIEVycm9yOyB9CisgICAgYm9vbCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IERXQVJGRXhwcmVzc2lvbiAqVSwKKyAgICAgICAgICAgICAgIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICpSZWdJbmZvLCBib29sIGlzRUgpOworICB9OworCisgIC8vLyBBbiBpdGVyYXRvciB0byBnbyB0aHJvdWdoIHRoZSBleHByZXNzaW9uIG9wZXJhdGlvbnMuCisgIGNsYXNzIGl0ZXJhdG9yCisgICAgICA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTxpdGVyYXRvciwgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbj4geworICAgIGZyaWVuZCBjbGFzcyBEV0FSRkV4cHJlc3Npb247CisgICAgY29uc3QgRFdBUkZFeHByZXNzaW9uICpFeHByOworICAgIHVpbnQzMl90IE9mZnNldDsKKyAgICBPcGVyYXRpb24gT3A7CisgICAgaXRlcmF0b3IoY29uc3QgRFdBUkZFeHByZXNzaW9uICpFeHByLCB1aW50MzJfdCBPZmZzZXQpCisgICAgICAgIDogRXhwcihFeHByKSwgT2Zmc2V0KE9mZnNldCkgeworICAgICAgT3AuRXJyb3IgPQorICAgICAgICAgIE9mZnNldCA+PSBFeHByLT5EYXRhLmdldERhdGEoKS5zaXplKCkgfHwKKyAgICAgICAgICAhT3AuZXh0cmFjdChFeHByLT5EYXRhLCBFeHByLT5WZXJzaW9uLCBFeHByLT5BZGRyZXNzU2l6ZSwgT2Zmc2V0KTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIGNsYXNzIE9wZXJhdGlvbiAmb3BlcmF0b3IrKygpIHsKKyAgICAgIE9mZnNldCA9IE9wLmlzRXJyb3IoKSA/IEV4cHItPkRhdGEuZ2V0RGF0YSgpLnNpemUoKSA6IE9wLkVuZE9mZnNldDsKKyAgICAgIE9wLkVycm9yID0KKyAgICAgICAgICBPZmZzZXQgPj0gRXhwci0+RGF0YS5nZXREYXRhKCkuc2l6ZSgpIHx8CisgICAgICAgICAgIU9wLmV4dHJhY3QoRXhwci0+RGF0YSwgRXhwci0+VmVyc2lvbiwgRXhwci0+QWRkcmVzc1NpemUsIE9mZnNldCk7CisgICAgICByZXR1cm4gT3A7CisgICAgfQorCisgICAgY2xhc3MgT3BlcmF0aW9uICZvcGVyYXRvciooKSB7CisgICAgICByZXR1cm4gT3A7CisgICAgfQorCisgICAgLy8gQ29tcGFyaXNvbiBvcGVyYXRvcnMgYXJlIHByb3ZpZGVkIG91dCBvZiBsaW5lLgorICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3IgJiwgY29uc3QgaXRlcmF0b3IgJik7CisgIH07CisKKyAgRFdBUkZFeHByZXNzaW9uKERhdGFFeHRyYWN0b3IgRGF0YSwgdWludDE2X3QgVmVyc2lvbiwgdWludDhfdCBBZGRyZXNzU2l6ZSkKKyAgICAgIDogRGF0YShEYXRhKSwgVmVyc2lvbihWZXJzaW9uKSwgQWRkcmVzc1NpemUoQWRkcmVzc1NpemUpIHsKKyAgICBhc3NlcnQoQWRkcmVzc1NpemUgPT0gOCB8fCBBZGRyZXNzU2l6ZSA9PSA0KTsKKyAgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IodGhpcywgMCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IodGhpcywgRGF0YS5nZXREYXRhKCkuc2l6ZSgpKTsgfQorCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqUmVnSW5mbywKKyAgICAgICAgICAgICBib29sIElzRUggPSBmYWxzZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgIERhdGFFeHRyYWN0b3IgRGF0YTsKKyAgdWludDE2X3QgVmVyc2lvbjsKKyAgdWludDhfdCBBZGRyZXNzU2l6ZTsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRFdBUkZFeHByZXNzaW9uOjppdGVyYXRvciAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEV0FSRkV4cHJlc3Npb246Oml0ZXJhdG9yICZSSFMpIHsKKyAgcmV0dXJuIExIUy5FeHByID09IFJIUy5FeHByICYmIExIUy5PZmZzZXQgPT0gUkhTLk9mZnNldDsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBEV0FSRkV4cHJlc3Npb246Oml0ZXJhdG9yICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGRXhwcmVzc2lvbjo6aXRlcmF0b3IgJlJIUykgeworICByZXR1cm4gIShMSFMgPT0gUkhTKTsKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZGb3JtVmFsdWUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRm9ybVZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1ZjcxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRm9ybVZhbHVlLmgKQEAgLTAsMCArMSwyODggQEAKKy8vPT09LSBEV0FSRkZvcm1WYWx1ZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZGT1JNVkFMVUVfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRkZPUk1WQUxVRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRElDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEYXRhRXh0cmFjdG9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBEV0FSRkNvbnRleHQ7CitjbGFzcyBEV0FSRlVuaXQ7CitjbGFzcyByYXdfb3N0cmVhbTsKKworY2xhc3MgRFdBUkZGb3JtVmFsdWUgeworcHVibGljOgorICBlbnVtIEZvcm1DbGFzcyB7CisgICAgRkNfVW5rbm93biwKKyAgICBGQ19BZGRyZXNzLAorICAgIEZDX0Jsb2NrLAorICAgIEZDX0NvbnN0YW50LAorICAgIEZDX1N0cmluZywKKyAgICBGQ19GbGFnLAorICAgIEZDX1JlZmVyZW5jZSwKKyAgICBGQ19JbmRpcmVjdCwKKyAgICBGQ19TZWN0aW9uT2Zmc2V0LAorICAgIEZDX0V4cHJsb2MKKyAgfTsKKworcHJpdmF0ZToKKyAgc3RydWN0IFZhbHVlVHlwZSB7CisgICAgVmFsdWVUeXBlKCkgeyB1dmFsID0gMDsgfQorCisgICAgdW5pb24geworICAgICAgdWludDY0X3QgdXZhbDsKKyAgICAgIGludDY0X3Qgc3ZhbDsKKyAgICAgIGNvbnN0IGNoYXIgKmNzdHI7CisgICAgfTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gbnVsbHB0cjsKKyAgICB1aW50NjRfdCBTZWN0aW9uSW5kZXg7ICAgICAgLy8vIFNlY3Rpb24gaW5kZXggZm9yIHJlZmVyZW5jZSBmb3Jtcy4KKyAgfTsKKworICBkd2FyZjo6Rm9ybSBGb3JtOyAgICAgICAgICAgICAvLy8gRm9ybSBmb3IgdGhpcyB2YWx1ZS4KKyAgVmFsdWVUeXBlIFZhbHVlOyAgICAgICAgICAgICAgLy8vIENvbnRhaW5zIGFsbCBkYXRhIGZvciB0aGUgZm9ybS4KKyAgY29uc3QgRFdBUkZVbml0ICpVID0gbnVsbHB0cjsgLy8vIFJlbWVtYmVyIHRoZSBEV0FSRlVuaXQgYXQgZXh0cmFjdCB0aW1lLgorICBjb25zdCBEV0FSRkNvbnRleHQgKkMgPSBudWxscHRyOyAvLy8gQ29udGV4dCBmb3IgZXh0cmFjdCB0aW1lLgorcHVibGljOgorICBEV0FSRkZvcm1WYWx1ZShkd2FyZjo6Rm9ybSBGID0gZHdhcmY6OkZvcm0oMCkpIDogRm9ybShGKSB7fQorCisgIGR3YXJmOjpGb3JtIGdldEZvcm0oKSBjb25zdCB7IHJldHVybiBGb3JtOyB9CisgIHVpbnQ2NF90IGdldFJhd1VWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlLnV2YWw7IH0KKyAgdWludDY0X3QgZ2V0U2VjdGlvbkluZGV4KCkgY29uc3QgeyByZXR1cm4gVmFsdWUuU2VjdGlvbkluZGV4OyB9CisgIHZvaWQgc2V0Rm9ybShkd2FyZjo6Rm9ybSBGKSB7IEZvcm0gPSBGOyB9CisgIHZvaWQgc2V0VVZhbHVlKHVpbnQ2NF90IFYpIHsgVmFsdWUudXZhbCA9IFY7IH0KKyAgdm9pZCBzZXRTVmFsdWUoaW50NjRfdCBWKSB7IFZhbHVlLnN2YWwgPSBWOyB9CisgIHZvaWQgc2V0UFZhbHVlKGNvbnN0IGNoYXIgKlYpIHsgVmFsdWUuY3N0ciA9IFY7IH0KKworICB2b2lkIHNldEJsb2NrVmFsdWUoY29uc3QgQXJyYXlSZWY8dWludDhfdD4gJkRhdGEpIHsKKyAgICBWYWx1ZS5kYXRhID0gRGF0YS5kYXRhKCk7CisgICAgc2V0VVZhbHVlKERhdGEuc2l6ZSgpKTsKKyAgfQorCisgIGJvb2wgaXNGb3JtQ2xhc3MoRm9ybUNsYXNzIEZDKSBjb25zdDsKKyAgY29uc3QgRFdBUkZVbml0ICpnZXRVbml0KCkgY29uc3QgeyByZXR1cm4gVTsgfQorICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBESUR1bXBPcHRpb25zIER1bXBPcHRzID0gRElEdW1wT3B0aW9ucygpKSBjb25zdDsKKworICAvLy8gRXh0cmFjdHMgYSB2YWx1ZSBpbiBccCBEYXRhIGF0IG9mZnNldCBccCAqT2Zmc2V0UHRyLiBUaGUgaW5mb3JtYXRpb24KKyAgLy8vIGluIFxwIEZvcm1QYXJhbXMgaXMgbmVlZGVkIHRvIGludGVycHJldCBzb21lIGZvcm1zLiBUaGUgb3B0aW9uYWwKKyAgLy8vIFxwIENvbnRleHQgYW5kIFxwIFVuaXQgYWxsb3dzIGV4dHJhY3RpbmcgaW5mb3JtYXRpb24gaWYgdGhlIGZvcm0gcmVmZXJzCisgIC8vLyB0byBvdGhlciBzZWN0aW9ucyAoZS5nLiwgLmRlYnVnX3N0cikuCisgIGJvb2wgZXh0cmFjdFZhbHVlKGNvbnN0IERXQVJGRGF0YUV4dHJhY3RvciAmRGF0YSwgdWludDMyX3QgKk9mZnNldFB0ciwKKyAgICAgICAgICAgICAgICAgICAgZHdhcmY6OkZvcm1QYXJhbXMgRm9ybVBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRFdBUkZDb250ZXh0ICpDb250ZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRFdBUkZVbml0ICpVbml0ID0gbnVsbHB0cik7CisKKyAgYm9vbCBleHRyYWN0VmFsdWUoY29uc3QgRFdBUkZEYXRhRXh0cmFjdG9yICZEYXRhLCB1aW50MzJfdCAqT2Zmc2V0UHRyLAorICAgICAgICAgICAgICAgICAgICBkd2FyZjo6Rm9ybVBhcmFtcyBGb3JtUGFyYW1zLCBjb25zdCBEV0FSRlVuaXQgKlUpIHsKKyAgICByZXR1cm4gZXh0cmFjdFZhbHVlKERhdGEsIE9mZnNldFB0ciwgRm9ybVBhcmFtcywgbnVsbHB0ciwgVSk7CisgIH0KKworICBib29sIGlzSW5saW5lZENTdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlLmRhdGEgIT0gbnVsbHB0ciAmJiBWYWx1ZS5kYXRhID09IChjb25zdCB1aW50OF90ICopVmFsdWUuY3N0cjsKKyAgfQorCisgIC8vLyBnZXRBc0ZvbyBmdW5jdGlvbnMgYmVsb3cgcmV0dXJuIHRoZSBleHRyYWN0ZWQgdmFsdWUgYXMgRm9vIGlmIG9ubHkKKyAgLy8vIERXQVJGRm9ybVZhbHVlIGhhcyBmb3JtIGNsYXNzIGlzIHN1aXRhYmxlIGZvciByZXByZXNlbnRpbmcgRm9vLgorICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0QXNSZWZlcmVuY2UoKSBjb25zdDsKKyAgT3B0aW9uYWw8dWludDY0X3Q+IGdldEFzVW5zaWduZWRDb25zdGFudCgpIGNvbnN0OworICBPcHRpb25hbDxpbnQ2NF90PiBnZXRBc1NpZ25lZENvbnN0YW50KCkgY29uc3Q7CisgIE9wdGlvbmFsPGNvbnN0IGNoYXIgKj4gZ2V0QXNDU3RyaW5nKCkgY29uc3Q7CisgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRBc0FkZHJlc3MoKSBjb25zdDsKKyAgT3B0aW9uYWw8dWludDY0X3Q+IGdldEFzU2VjdGlvbk9mZnNldCgpIGNvbnN0OworICBPcHRpb25hbDxBcnJheVJlZjx1aW50OF90Pj4gZ2V0QXNCbG9jaygpIGNvbnN0OworICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0QXNDU3RyaW5nT2Zmc2V0KCkgY29uc3Q7CisgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRBc1JlZmVyZW5jZVVWYWwoKSBjb25zdDsKKworICAvLy8gU2tpcCBhIGZvcm0ncyB2YWx1ZSBpbiBccCBEZWJ1Z0luZm9EYXRhIGF0IHRoZSBvZmZzZXQgc3BlY2lmaWVkIGJ5CisgIC8vLyBccCBPZmZzZXRQdHIuCisgIC8vLworICAvLy8gU2tpcHMgdGhlIGJ5dGVzIGZvciB0aGUgY3VycmVudCBmb3JtIGFuZCB1cGRhdGVzIHRoZSBvZmZzZXQuCisgIC8vLworICAvLy8gXHBhcmFtIERlYnVnSW5mb0RhdGEgVGhlIGRhdGEgd2hlcmUgd2Ugd2FudCB0byBza2lwIHRoZSB2YWx1ZS4KKyAgLy8vIFxwYXJhbSBPZmZzZXRQdHIgQSByZWZlcmVuY2UgdG8gdGhlIG9mZnNldCB0aGF0IHdpbGwgYmUgdXBkYXRlZC4KKyAgLy8vIFxwYXJhbSBQYXJhbXMgRFdBUkYgcGFyYW1ldGVycyB0byBoZWxwIGludGVycHJldCBmb3Jtcy4KKyAgLy8vIFxyZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgdGhlIGZvcm0gd2FzIG5vdCBza2lwcGVkLgorICBib29sIHNraXBWYWx1ZShEYXRhRXh0cmFjdG9yIERlYnVnSW5mb0RhdGEsIHVpbnQzMl90ICpPZmZzZXRQdHIsCisgICAgICAgICAgICAgICAgIGNvbnN0IGR3YXJmOjpGb3JtUGFyYW1zIFBhcmFtcykgY29uc3QgeworICAgIHJldHVybiBEV0FSRkZvcm1WYWx1ZTo6c2tpcFZhbHVlKEZvcm0sIERlYnVnSW5mb0RhdGEsIE9mZnNldFB0ciwgUGFyYW1zKTsKKyAgfQorCisgIC8vLyBTa2lwIGEgZm9ybSdzIHZhbHVlIGluIFxwIERlYnVnSW5mb0RhdGEgYXQgdGhlIG9mZnNldCBzcGVjaWZpZWQgYnkKKyAgLy8vIFxwIE9mZnNldFB0ci4KKyAgLy8vCisgIC8vLyBTa2lwcyB0aGUgYnl0ZXMgZm9yIHRoZSBzcGVjaWZpZWQgZm9ybSBhbmQgdXBkYXRlcyB0aGUgb2Zmc2V0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBGb3JtIFRoZSBEV19GT1JNIGVudW1lcmF0aW9uIHRoYXQgaW5kaWNhdGVzIHRoZSBmb3JtIHRvIHNraXAuCisgIC8vLyBccGFyYW0gRGVidWdJbmZvRGF0YSBUaGUgZGF0YSB3aGVyZSB3ZSB3YW50IHRvIHNraXAgdGhlIHZhbHVlLgorICAvLy8gXHBhcmFtIE9mZnNldFB0ciBBIHJlZmVyZW5jZSB0byB0aGUgb2Zmc2V0IHRoYXQgd2lsbCBiZSB1cGRhdGVkLgorICAvLy8gXHBhcmFtIEZvcm1QYXJhbXMgRFdBUkYgcGFyYW1ldGVycyB0byBoZWxwIGludGVycHJldCBmb3Jtcy4KKyAgLy8vIFxyZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgdGhlIGZvcm0gd2FzIG5vdCBza2lwcGVkLgorICBzdGF0aWMgYm9vbCBza2lwVmFsdWUoZHdhcmY6OkZvcm0gRm9ybSwgRGF0YUV4dHJhY3RvciBEZWJ1Z0luZm9EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKk9mZnNldFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR3YXJmOjpGb3JtUGFyYW1zIEZvcm1QYXJhbXMpOworCitwcml2YXRlOgorICB2b2lkIGR1bXBTdHJpbmcocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKK307CisKK25hbWVzcGFjZSBkd2FyZiB7CisKKy8vLyBUYWtlIGFuIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIGFuZCB0cnkgdG8gZXh0cmFjdCBhIHN0cmluZyB2YWx1ZSBmcm9tIGl0LgorLy8vCisvLy8gXHBhcmFtIFYgYW5kIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIHRvIGF0dGVtcHQgdG8gZXh0cmFjdCB0aGUgdmFsdWUgZnJvbS4KKy8vLyBccmV0dXJucyBhbiBvcHRpb25hbCB2YWx1ZSB0aGF0IGNvbnRhaW5zIGEgdmFsdWUgaWYgdGhlIGZvcm0gdmFsdWUKKy8vLyB3YXMgdmFsaWQgYW5kIHdhcyBhIHN0cmluZy4KK2lubGluZSBPcHRpb25hbDxjb25zdCBjaGFyICo+IHRvU3RyaW5nKGNvbnN0IE9wdGlvbmFsPERXQVJGRm9ybVZhbHVlPiAmVikgeworICBpZiAoVikKKyAgICByZXR1cm4gVi0+Z2V0QXNDU3RyaW5nKCk7CisgIHJldHVybiBOb25lOworfQorCisvLy8gVGFrZSBhbiBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSBhbmQgZXh0cmFjdCBhIHN0cmluZyB2YWx1ZSBmcm9tIGl0LgorLy8vCisvLy8gXHBhcmFtIFYgYW5kIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIHRvIGF0dGVtcHQgdG8gZXh0cmFjdCB0aGUgdmFsdWUgZnJvbS4KKy8vLyBccGFyYW0gRGVmYXVsdCB0aGUgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaW4gY2FzZSBvZiBmYWlsdXJlLgorLy8vIFxyZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgb3IgRGVmYXVsdCBpZiB0aGUgViBkb2Vzbid0IGhhdmUgYSB2YWx1ZSBvciB0aGUKKy8vLyBmb3JtIHZhbHVlJ3MgZW5jb2Rpbmcgd2Fzbid0IGEgc3RyaW5nLgoraW5saW5lIGNvbnN0IGNoYXIgKnRvU3RyaW5nKGNvbnN0IE9wdGlvbmFsPERXQVJGRm9ybVZhbHVlPiAmViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpEZWZhdWx0KSB7CisgIHJldHVybiB0b1N0cmluZyhWKS5nZXRWYWx1ZU9yKERlZmF1bHQpOworfQorCisvLy8gVGFrZSBhbiBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSBhbmQgdHJ5IHRvIGV4dHJhY3QgYW4gdW5zaWduZWQgY29uc3RhbnQuCisvLy8KKy8vLyBccGFyYW0gViBhbmQgb3B0aW9uYWwgRFdBUkZGb3JtVmFsdWUgdG8gYXR0ZW1wdCB0byBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tLgorLy8vIFxyZXR1cm5zIGFuIG9wdGlvbmFsIHZhbHVlIHRoYXQgY29udGFpbnMgYSB2YWx1ZSBpZiB0aGUgZm9ybSB2YWx1ZQorLy8vIHdhcyB2YWxpZCBhbmQgaGFzIGEgdW5zaWduZWQgY29uc3RhbnQgZm9ybS4KK2lubGluZSBPcHRpb25hbDx1aW50NjRfdD4gdG9VbnNpZ25lZChjb25zdCBPcHRpb25hbDxEV0FSRkZvcm1WYWx1ZT4gJlYpIHsKKyAgaWYgKFYpCisgICAgcmV0dXJuIFYtPmdldEFzVW5zaWduZWRDb25zdGFudCgpOworICByZXR1cm4gTm9uZTsKK30KKworLy8vIFRha2UgYW4gb3B0aW9uYWwgRFdBUkZGb3JtVmFsdWUgYW5kIGV4dHJhY3QgYSB1bnNpZ25lZCBjb25zdGFudC4KKy8vLworLy8vIFxwYXJhbSBWIGFuZCBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSB0byBhdHRlbXB0IHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20uCisvLy8gXHBhcmFtIERlZmF1bHQgdGhlIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGluIGNhc2Ugb2YgZmFpbHVyZS4KKy8vLyBccmV0dXJucyB0aGUgZXh0cmFjdGVkIHVuc2lnbmVkIHZhbHVlIG9yIERlZmF1bHQgaWYgdGhlIFYgZG9lc24ndCBoYXZlIGEKKy8vLyB2YWx1ZSBvciB0aGUgZm9ybSB2YWx1ZSdzIGVuY29kaW5nIHdhc24ndCBhbiB1bnNpZ25lZCBjb25zdGFudCBmb3JtLgoraW5saW5lIHVpbnQ2NF90IHRvVW5zaWduZWQoY29uc3QgT3B0aW9uYWw8RFdBUkZGb3JtVmFsdWU+ICZWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgRGVmYXVsdCkgeworICByZXR1cm4gdG9VbnNpZ25lZChWKS5nZXRWYWx1ZU9yKERlZmF1bHQpOworfQorCisvLy8gVGFrZSBhbiBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSBhbmQgdHJ5IHRvIGV4dHJhY3QgYW4gcmVmZXJlbmNlLgorLy8vCisvLy8gXHBhcmFtIFYgYW5kIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIHRvIGF0dGVtcHQgdG8gZXh0cmFjdCB0aGUgdmFsdWUgZnJvbS4KKy8vLyBccmV0dXJucyBhbiBvcHRpb25hbCB2YWx1ZSB0aGF0IGNvbnRhaW5zIGEgdmFsdWUgaWYgdGhlIGZvcm0gdmFsdWUKKy8vLyB3YXMgdmFsaWQgYW5kIGhhcyBhIHJlZmVyZW5jZSBmb3JtLgoraW5saW5lIE9wdGlvbmFsPHVpbnQ2NF90PiB0b1JlZmVyZW5jZShjb25zdCBPcHRpb25hbDxEV0FSRkZvcm1WYWx1ZT4gJlYpIHsKKyAgaWYgKFYpCisgICAgcmV0dXJuIFYtPmdldEFzUmVmZXJlbmNlKCk7CisgIHJldHVybiBOb25lOworfQorCisvLy8gVGFrZSBhbiBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSBhbmQgZXh0cmFjdCBhIHJlZmVyZW5jZS4KKy8vLworLy8vIFxwYXJhbSBWIGFuZCBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSB0byBhdHRlbXB0IHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20uCisvLy8gXHBhcmFtIERlZmF1bHQgdGhlIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGluIGNhc2Ugb2YgZmFpbHVyZS4KKy8vLyBccmV0dXJucyB0aGUgZXh0cmFjdGVkIHJlZmVyZW5jZSB2YWx1ZSBvciBEZWZhdWx0IGlmIHRoZSBWIGRvZXNuJ3QgaGF2ZSBhCisvLy8gdmFsdWUgb3IgdGhlIGZvcm0gdmFsdWUncyBlbmNvZGluZyB3YXNuJ3QgYSByZWZlcmVuY2UgZm9ybS4KK2lubGluZSB1aW50NjRfdCB0b1JlZmVyZW5jZShjb25zdCBPcHRpb25hbDxEV0FSRkZvcm1WYWx1ZT4gJlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgRGVmYXVsdCkgeworICByZXR1cm4gdG9SZWZlcmVuY2UoVikuZ2V0VmFsdWVPcihEZWZhdWx0KTsKK30KKworLy8vIFRha2UgYW4gb3B0aW9uYWwgRFdBUkZGb3JtVmFsdWUgYW5kIHRyeSB0byBleHRyYWN0IGFuIHNpZ25lZCBjb25zdGFudC4KKy8vLworLy8vIFxwYXJhbSBWIGFuZCBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSB0byBhdHRlbXB0IHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20uCisvLy8gXHJldHVybnMgYW4gb3B0aW9uYWwgdmFsdWUgdGhhdCBjb250YWlucyBhIHZhbHVlIGlmIHRoZSBmb3JtIHZhbHVlCisvLy8gd2FzIHZhbGlkIGFuZCBoYXMgYSBzaWduZWQgY29uc3RhbnQgZm9ybS4KK2lubGluZSBPcHRpb25hbDxpbnQ2NF90PiB0b1NpZ25lZChjb25zdCBPcHRpb25hbDxEV0FSRkZvcm1WYWx1ZT4gJlYpIHsKKyAgaWYgKFYpCisgICAgcmV0dXJuIFYtPmdldEFzU2lnbmVkQ29uc3RhbnQoKTsKKyAgcmV0dXJuIE5vbmU7Cit9CisKKy8vLyBUYWtlIGFuIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIGFuZCBleHRyYWN0IGEgc2lnbmVkIGludGVnZXIuCisvLy8KKy8vLyBccGFyYW0gViBhbmQgb3B0aW9uYWwgRFdBUkZGb3JtVmFsdWUgdG8gYXR0ZW1wdCB0byBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tLgorLy8vIFxwYXJhbSBEZWZhdWx0IHRoZSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpbiBjYXNlIG9mIGZhaWx1cmUuCisvLy8gXHJldHVybnMgdGhlIGV4dHJhY3RlZCBzaWduZWQgaW50ZWdlciB2YWx1ZSBvciBEZWZhdWx0IGlmIHRoZSBWIGRvZXNuJ3QKKy8vLyBoYXZlIGEgdmFsdWUgb3IgdGhlIGZvcm0gdmFsdWUncyBlbmNvZGluZyB3YXNuJ3QgYSBzaWduZWQgaW50ZWdlciBmb3JtLgoraW5saW5lIGludDY0X3QgdG9TaWduZWQoY29uc3QgT3B0aW9uYWw8RFdBUkZGb3JtVmFsdWU+ICZWLCBpbnQ2NF90IERlZmF1bHQpIHsKKyAgcmV0dXJuIHRvU2lnbmVkKFYpLmdldFZhbHVlT3IoRGVmYXVsdCk7Cit9CisKKy8vLyBUYWtlIGFuIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIGFuZCB0cnkgdG8gZXh0cmFjdCBhbiBhZGRyZXNzLgorLy8vCisvLy8gXHBhcmFtIFYgYW5kIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIHRvIGF0dGVtcHQgdG8gZXh0cmFjdCB0aGUgdmFsdWUgZnJvbS4KKy8vLyBccmV0dXJucyBhbiBvcHRpb25hbCB2YWx1ZSB0aGF0IGNvbnRhaW5zIGEgdmFsdWUgaWYgdGhlIGZvcm0gdmFsdWUKKy8vLyB3YXMgdmFsaWQgYW5kIGhhcyBhIGFkZHJlc3MgZm9ybS4KK2lubGluZSBPcHRpb25hbDx1aW50NjRfdD4gdG9BZGRyZXNzKGNvbnN0IE9wdGlvbmFsPERXQVJGRm9ybVZhbHVlPiAmVikgeworICBpZiAoVikKKyAgICByZXR1cm4gVi0+Z2V0QXNBZGRyZXNzKCk7CisgIHJldHVybiBOb25lOworfQorCisvLy8gVGFrZSBhbiBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSBhbmQgZXh0cmFjdCBhIGFkZHJlc3MuCisvLy8KKy8vLyBccGFyYW0gViBhbmQgb3B0aW9uYWwgRFdBUkZGb3JtVmFsdWUgdG8gYXR0ZW1wdCB0byBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tLgorLy8vIFxwYXJhbSBEZWZhdWx0IHRoZSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpbiBjYXNlIG9mIGZhaWx1cmUuCisvLy8gXHJldHVybnMgdGhlIGV4dHJhY3RlZCBhZGRyZXNzIHZhbHVlIG9yIERlZmF1bHQgaWYgdGhlIFYgZG9lc24ndCBoYXZlIGEKKy8vLyB2YWx1ZSBvciB0aGUgZm9ybSB2YWx1ZSdzIGVuY29kaW5nIHdhc24ndCBhbiBhZGRyZXNzIGZvcm0uCitpbmxpbmUgdWludDY0X3QgdG9BZGRyZXNzKGNvbnN0IE9wdGlvbmFsPERXQVJGRm9ybVZhbHVlPiAmViwgdWludDY0X3QgRGVmYXVsdCkgeworICByZXR1cm4gdG9BZGRyZXNzKFYpLmdldFZhbHVlT3IoRGVmYXVsdCk7Cit9CisKKy8vLyBUYWtlIGFuIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIGFuZCB0cnkgdG8gZXh0cmFjdCBhbiBzZWN0aW9uIG9mZnNldC4KKy8vLworLy8vIFxwYXJhbSBWIGFuZCBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSB0byBhdHRlbXB0IHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20uCisvLy8gXHJldHVybnMgYW4gb3B0aW9uYWwgdmFsdWUgdGhhdCBjb250YWlucyBhIHZhbHVlIGlmIHRoZSBmb3JtIHZhbHVlCisvLy8gd2FzIHZhbGlkIGFuZCBoYXMgYSBzZWN0aW9uIG9mZnNldCBmb3JtLgoraW5saW5lIE9wdGlvbmFsPHVpbnQ2NF90PiB0b1NlY3Rpb25PZmZzZXQoY29uc3QgT3B0aW9uYWw8RFdBUkZGb3JtVmFsdWU+ICZWKSB7CisgIGlmIChWKQorICAgIHJldHVybiBWLT5nZXRBc1NlY3Rpb25PZmZzZXQoKTsKKyAgcmV0dXJuIE5vbmU7Cit9CisKKy8vLyBUYWtlIGFuIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIGFuZCBleHRyYWN0IGEgc2VjdGlvbiBvZmZzZXQuCisvLy8KKy8vLyBccGFyYW0gViBhbmQgb3B0aW9uYWwgRFdBUkZGb3JtVmFsdWUgdG8gYXR0ZW1wdCB0byBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tLgorLy8vIFxwYXJhbSBEZWZhdWx0IHRoZSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpbiBjYXNlIG9mIGZhaWx1cmUuCisvLy8gXHJldHVybnMgdGhlIGV4dHJhY3RlZCBzZWN0aW9uIG9mZnNldCB2YWx1ZSBvciBEZWZhdWx0IGlmIHRoZSBWIGRvZXNuJ3QKKy8vLyBoYXZlIGEgdmFsdWUgb3IgdGhlIGZvcm0gdmFsdWUncyBlbmNvZGluZyB3YXNuJ3QgYSBzZWN0aW9uIG9mZnNldCBmb3JtLgoraW5saW5lIHVpbnQ2NF90IHRvU2VjdGlvbk9mZnNldChjb25zdCBPcHRpb25hbDxEV0FSRkZvcm1WYWx1ZT4gJlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IERlZmF1bHQpIHsKKyAgcmV0dXJuIHRvU2VjdGlvbk9mZnNldChWKS5nZXRWYWx1ZU9yKERlZmF1bHQpOworfQorCisvLy8gVGFrZSBhbiBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSBhbmQgdHJ5IHRvIGV4dHJhY3QgYmxvY2sgZGF0YS4KKy8vLworLy8vIFxwYXJhbSBWIGFuZCBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSB0byBhdHRlbXB0IHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20uCisvLy8gXHJldHVybnMgYW4gb3B0aW9uYWwgdmFsdWUgdGhhdCBjb250YWlucyBhIHZhbHVlIGlmIHRoZSBmb3JtIHZhbHVlCisvLy8gd2FzIHZhbGlkIGFuZCBoYXMgYSBibG9jayBmb3JtLgoraW5saW5lIE9wdGlvbmFsPEFycmF5UmVmPHVpbnQ4X3Q+PiB0b0Jsb2NrKGNvbnN0IE9wdGlvbmFsPERXQVJGRm9ybVZhbHVlPiAmVikgeworICBpZiAoVikKKyAgICByZXR1cm4gVi0+Z2V0QXNCbG9jaygpOworICByZXR1cm4gTm9uZTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGR3YXJmCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRkZPUk1WQUxVRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkdkYkluZGV4LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkdkYkluZGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQxYWM1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGR2RiSW5kZXguaApAQCAtMCwwICsxLDc0IEBACisvLz09PS0gRFdBUkZHZGJJbmRleC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGR0RCSU5ERVhfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkdEQklOREVYX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFFeHRyYWN0b3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIERXQVJGR2RiSW5kZXggeworICB1aW50MzJfdCBWZXJzaW9uOworCisgIHVpbnQzMl90IEN1TGlzdE9mZnNldDsKKyAgdWludDMyX3QgQWRkcmVzc0FyZWFPZmZzZXQ7CisgIHVpbnQzMl90IFN5bWJvbFRhYmxlT2Zmc2V0OworICB1aW50MzJfdCBDb25zdGFudFBvb2xPZmZzZXQ7CisKKyAgc3RydWN0IENvbXBVbml0RW50cnkgeworICAgIHVpbnQ2NF90IE9mZnNldDsgLy8vIE9mZnNldCBvZiBhIENVIGluIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uLgorICAgIHVpbnQ2NF90IExlbmd0aDsgLy8vIExlbmd0aCBvZiB0aGF0IENVLgorICB9OworICBTbWFsbFZlY3RvcjxDb21wVW5pdEVudHJ5LCAwPiBDdUxpc3Q7CisKKyAgc3RydWN0IEFkZHJlc3NFbnRyeSB7CisgICAgdWludDY0X3QgTG93QWRkcmVzczsgIC8vLyBUaGUgbG93IGFkZHJlc3MuCisgICAgdWludDY0X3QgSGlnaEFkZHJlc3M7IC8vLyBUaGUgaGlnaCBhZGRyZXNzLgorICAgIHVpbnQzMl90IEN1SW5kZXg7ICAgICAvLy8gVGhlIENVIGluZGV4LgorICB9OworICBTbWFsbFZlY3RvcjxBZGRyZXNzRW50cnksIDA+IEFkZHJlc3NBcmVhOworCisgIHN0cnVjdCBTeW1UYWJsZUVudHJ5IHsKKyAgICB1aW50MzJfdCBOYW1lT2Zmc2V0OyAvLy8gT2Zmc2V0IG9mIHRoZSBzeW1ib2wncyBuYW1lIGluIHRoZSBjb25zdGFudCBwb29sLgorICAgIHVpbnQzMl90IFZlY09mZnNldDsgIC8vLyBPZmZzZXQgb2YgdGhlIENVIHZlY3RvciBpbiB0aGUgY29uc3RhbnQgcG9vbC4KKyAgfTsKKyAgU21hbGxWZWN0b3I8U3ltVGFibGVFbnRyeSwgMD4gU3ltYm9sVGFibGU7CisKKyAgLy8vIEVhY2ggdmFsdWUgaXMgQ1UgaW5kZXggKyBhdHRyaWJ1dGVzLgorICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dWludDMyX3QsIFNtYWxsVmVjdG9yPHVpbnQzMl90LCAwPj4sIDA+CisgICAgICBDb25zdGFudFBvb2xWZWN0b3JzOworCisgIFN0cmluZ1JlZiBDb25zdGFudFBvb2xTdHJpbmdzOworICB1aW50MzJfdCBTdHJpbmdQb29sT2Zmc2V0OworCisgIHZvaWQgZHVtcENVTGlzdChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXBBZGRyZXNzQXJlYShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXBTeW1ib2xUYWJsZShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXBDb25zdGFudFBvb2wocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICBib29sIHBhcnNlSW1wbChEYXRhRXh0cmFjdG9yIERhdGEpOworCitwdWJsaWM6CisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpOworICB2b2lkIHBhcnNlKERhdGFFeHRyYWN0b3IgRGF0YSk7CisKKyAgYm9vbCBIYXNDb250ZW50ID0gZmFsc2U7CisgIGJvb2wgSGFzRXJyb3IgPSBmYWxzZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkdEQklOREVYX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGT2JqZWN0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRk9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NWVkZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRk9iamVjdC5oCkBAIC0wLDAgKzEsODIgQEAKKy8vPT09LSBEV0FSRk9iamVjdC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZPQkpFQ1RfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRk9CSkVDVF9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlJlbG9jTWFwLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZTZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvT2JqZWN0RmlsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisvLyBUaGlzIGlzIHJlc3BvbnNpYmxlIGZvciBsb3cgbGV2ZWwgYWNjZXNzIHRvIHRoZSBvYmplY3QgZmlsZS4gSXQKKy8vIGtub3dzIGhvdyB0byBmaW5kIHRoZSByZXF1aXJlZCBzZWN0aW9ucyBhbmQgY29tcHV0ZSByZWxvY2F0ZWQKKy8vIHZhbHVlcy4KKy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZ2V0PFNlY3Rpb24+IG1ldGhvZHMgcmV0dXJuIGR1bW15IHZhbHVlcy4KKy8vIFRoaXMgaXMgdG8gYWxsb3cgY2xpZW50cyB0aGF0IG9ubHkgbmVlZCBzb21lIG9mIHRob3NlIHRvIGltcGxlbWVudCBqdXN0IHRoZQorLy8gb25lcyB0aGV5IG5lZWQuIFdlIGNhbid0IHVzZSB1bnJlYWNoYWJsZSBmb3IgYXMgbWFueSBjYXNlcyBiZWNhdXNlIHRoZSBwYXJzZXIKKy8vIGltcGxlbWVudGF0aW9uIGlzIGVhZ2VyIGFuZCB3aWxsIGNhbGwgc29tZSBvZiB0aGVzZSBtZXRob2RzIGV2ZW4gaWYgdGhlCisvLyByZXN1bHQgaXMgbm90IHVzZWQuCitjbGFzcyBEV0FSRk9iamVjdCB7CisgIERXQVJGU2VjdGlvbiBEdW1teTsKKworcHVibGljOgorICB2aXJ0dWFsIH5EV0FSRk9iamVjdCgpID0gZGVmYXVsdDsKKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0RmlsZU5hbWUoKSBjb25zdCB7IGxsdm1fdW5yZWFjaGFibGUoInVuaW1wbGVtZW50ZWQiKTsgfQorICB2aXJ0dWFsIGNvbnN0IG9iamVjdDo6T2JqZWN0RmlsZSAqZ2V0RmlsZSgpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgdmlydHVhbCBBcnJheVJlZjxTZWN0aW9uTmFtZT4gZ2V0U2VjdGlvbk5hbWVzKCkgY29uc3QgeyByZXR1cm4ge307IH0KKyAgdmlydHVhbCBib29sIGlzTGl0dGxlRW5kaWFuKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ4X3QgZ2V0QWRkcmVzc1NpemUoKSBjb25zdCB7IGxsdm1fdW5yZWFjaGFibGUoInVuaW1wbGVtZW50ZWQiKTsgfQorICB2aXJ0dWFsIGNvbnN0IERXQVJGU2VjdGlvbiAmZ2V0SW5mb1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEdW1teTsgfQorICB2aXJ0dWFsIHZvaWQKKyAgZm9yRWFjaFR5cGVzU2VjdGlvbnMoZnVuY3Rpb25fcmVmPHZvaWQoY29uc3QgRFdBUkZTZWN0aW9uICYpPiBGKSBjb25zdCB7fQorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRBYmJyZXZTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gIiI7IH0KKyAgdmlydHVhbCBjb25zdCBEV0FSRlNlY3Rpb24gJmdldExvY1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEdW1teTsgfQorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRBUmFuZ2VTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gIiI7IH0KKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0RGVidWdGcmFtZVNlY3Rpb24oKSBjb25zdCB7IHJldHVybiAiIjsgfQorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRFSEZyYW1lU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisgIHZpcnR1YWwgY29uc3QgRFdBUkZTZWN0aW9uICZnZXRMaW5lU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER1bW15OyB9CisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldExpbmVTdHJpbmdTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gIiI7IH0KKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0U3RyaW5nU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisgIHZpcnR1YWwgY29uc3QgRFdBUkZTZWN0aW9uICZnZXRSYW5nZVNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEdW1teTsgfQorICB2aXJ0dWFsIGNvbnN0IERXQVJGU2VjdGlvbiAmZ2V0Um5nbGlzdHNTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHVtbXk7IH0KKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0TWFjaW5mb1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiAiIjsgfQorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRQdWJOYW1lc1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiAiIjsgfQorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRQdWJUeXBlc1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiAiIjsgfQorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRHbnVQdWJOYW1lc1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiAiIjsgfQorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRHbnVQdWJUeXBlc1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiAiIjsgfQorICB2aXJ0dWFsIGNvbnN0IERXQVJGU2VjdGlvbiAmZ2V0U3RyaW5nT2Zmc2V0U2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER1bW15OyB9CisgIHZpcnR1YWwgY29uc3QgRFdBUkZTZWN0aW9uICZnZXRJbmZvRFdPU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER1bW15OyB9CisgIHZpcnR1YWwgdm9pZAorICBmb3JFYWNoVHlwZXNEV09TZWN0aW9ucyhmdW5jdGlvbl9yZWY8dm9pZChjb25zdCBEV0FSRlNlY3Rpb24gJik+IEYpIGNvbnN0IHt9CisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldEFiYnJldkRXT1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiAiIjsgfQorICB2aXJ0dWFsIGNvbnN0IERXQVJGU2VjdGlvbiAmZ2V0TGluZURXT1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEdW1teTsgfQorICB2aXJ0dWFsIGNvbnN0IERXQVJGU2VjdGlvbiAmZ2V0TG9jRFdPU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER1bW15OyB9CisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldFN0cmluZ0RXT1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiAiIjsgfQorICB2aXJ0dWFsIGNvbnN0IERXQVJGU2VjdGlvbiAmZ2V0U3RyaW5nT2Zmc2V0RFdPU2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gRHVtbXk7CisgIH0KKyAgdmlydHVhbCBjb25zdCBEV0FSRlNlY3Rpb24gJmdldFJhbmdlRFdPU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER1bW15OyB9CisgIHZpcnR1YWwgY29uc3QgRFdBUkZTZWN0aW9uICZnZXRBZGRyU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER1bW15OyB9CisgIHZpcnR1YWwgY29uc3QgRFdBUkZTZWN0aW9uICZnZXRBcHBsZU5hbWVzU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER1bW15OyB9CisgIHZpcnR1YWwgY29uc3QgRFdBUkZTZWN0aW9uICZnZXRBcHBsZVR5cGVzU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER1bW15OyB9CisgIHZpcnR1YWwgY29uc3QgRFdBUkZTZWN0aW9uICZnZXRBcHBsZU5hbWVzcGFjZXNTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBEdW1teTsKKyAgfQorICB2aXJ0dWFsIGNvbnN0IERXQVJGU2VjdGlvbiAmZ2V0RGVidWdOYW1lc1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEdW1teTsgfQorICB2aXJ0dWFsIGNvbnN0IERXQVJGU2VjdGlvbiAmZ2V0QXBwbGVPYmpDU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER1bW15OyB9CisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldENVSW5kZXhTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gIiI7IH0KKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0R2RiSW5kZXhTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gIiI7IH0KKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0VFVJbmRleFNlY3Rpb24oKSBjb25zdCB7IHJldHVybiAiIjsgfQorICB2aXJ0dWFsIE9wdGlvbmFsPFJlbG9jQWRkckVudHJ5PiBmaW5kKGNvbnN0IERXQVJGU2VjdGlvbiAmU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFBvcykgY29uc3QgPSAwOworfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlJlbG9jTWFwLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlJlbG9jTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxODM4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGUmVsb2NNYXAuaApAQCAtMCwwICsxLDM0IEBACisvLz09PS0gRFdBUkZSZWxvY01hcC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGUkVMT0NNQVBfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRlJFTE9DTUFQX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gUmVsb2NBZGRyRW50cnkgY29udGFpbnMgcmVsb2NhdGVkIHZhbHVlIGFuZCBzZWN0aW9uIGluZGV4LgorLy8vIFNlY3Rpb24gaW5kZXggaXMgLTFMTCBpZiByZWxvY2F0aW9uIHBvaW50cyB0byBhYnNvbHV0ZSBzeW1ib2wuCitzdHJ1Y3QgUmVsb2NBZGRyRW50cnkgeworICB1aW50NjRfdCBTZWN0aW9uSW5kZXg7CisgIHVpbnQ2NF90IFZhbHVlOworfTsKKworLy8vIEluIHBsYWNlIG9mIGFwcGx5aW5nIHRoZSByZWxvY2F0aW9ucyB0byB0aGUgZGF0YSB3ZSd2ZSByZWFkIGZyb20gZGlzayB3ZSB1c2UKKy8vLyBhIHNlcGFyYXRlIG1hcHBpbmcgdGFibGUgdG8gdGhlIHNpZGUgYW5kIGNoZWNraW5nIHRoYXQgYXQgbG9jYXRpb25zIGluIHRoZQorLy8vIGR3YXJmIHdoZXJlIHdlIGV4cGVjdCByZWxvY2F0ZWQgdmFsdWVzLiBUaGlzIGFkZHMgYSBiaXQgb2YgY29tcGxleGl0eSB0byB0aGUKKy8vLyBkd2FyZiBwYXJzaW5nL2V4dHJhY3Rpb24gYXQgdGhlIGJlbmVmaXQgb2Ygbm90IGFsbG9jYXRpbmcgbWVtb3J5IGZvciB0aGUKKy8vLyBlbnRpcmUgc2l6ZSBvZiB0aGUgZGVidWcgaW5mbyBzZWN0aW9ucy4KK3VzaW5nIFJlbG9jQWRkck1hcCA9IERlbnNlTWFwPHVpbnQ2NF90LCBSZWxvY0FkZHJFbnRyeT47CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRlJFTE9DTUFQX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGU2VjdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZTZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcwNDVmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGU2VjdGlvbi5oCkBAIC0wLDAgKzEsMjggQEAKKy8vPT09LSBEV0FSRlNlY3Rpb24uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZTRUNUSU9OX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZTRUNUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK3N0cnVjdCBEV0FSRlNlY3Rpb24geworICBTdHJpbmdSZWYgRGF0YTsKK307CisKK3N0cnVjdCBTZWN0aW9uTmFtZSB7CisgIFN0cmluZ1JlZiBOYW1lOworICBib29sIElzTmFtZVVuaXF1ZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRlNFQ1RJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZUeXBlVW5pdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZUeXBlVW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NTlhNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlR5cGVVbml0LmgKQEAgLTAsMCArMSw1NSBAQAorLy89PT0tIERXQVJGVHlwZVVuaXQuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRlRZUEVVTklUX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZUWVBFVU5JVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlVuaXQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlVuaXRJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhRXh0cmFjdG9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBEV0FSRkNvbnRleHQ7CitjbGFzcyBEV0FSRkRlYnVnQWJicmV2Oworc3RydWN0IERXQVJGU2VjdGlvbjsKK2NsYXNzIHJhd19vc3RyZWFtOworCitjbGFzcyBEV0FSRlR5cGVVbml0IDogcHVibGljIERXQVJGVW5pdCB7Citwcml2YXRlOgorICB1aW50NjRfdCBUeXBlSGFzaDsKKyAgdWludDMyX3QgVHlwZU9mZnNldDsKKworcHVibGljOgorICBEV0FSRlR5cGVVbml0KERXQVJGQ29udGV4dCAmQ29udGV4dCwgY29uc3QgRFdBUkZTZWN0aW9uICZTZWN0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGRGVidWdBYmJyZXYgKkRBLCBjb25zdCBEV0FSRlNlY3Rpb24gKlJTLAorICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTUywgY29uc3QgRFdBUkZTZWN0aW9uICZTT1MsIGNvbnN0IERXQVJGU2VjdGlvbiAqQU9TLAorICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGU2VjdGlvbiAmTFMsIGJvb2wgTEUsIGJvb2wgSXNEV08sCisgICAgICAgICAgICAgICAgY29uc3QgRFdBUkZVbml0U2VjdGlvbkJhc2UgJlVuaXRTZWN0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGVW5pdEluZGV4OjpFbnRyeSAqRW50cnkpCisgICAgICA6IERXQVJGVW5pdChDb250ZXh0LCBTZWN0aW9uLCBEQSwgUlMsIFNTLCBTT1MsIEFPUywgTFMsIExFLCBJc0RXTywKKyAgICAgICAgICAgICAgICAgIFVuaXRTZWN0aW9uLCBFbnRyeSkge30KKworICB1aW50MzJfdCBnZXRIZWFkZXJTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBEV0FSRlVuaXQ6OmdldEhlYWRlclNpemUoKSArIDEyOworICB9CisKKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUywgRElEdW1wT3B0aW9ucyBEdW1wT3B0cyA9IHt9KTsKKyAgc3RhdGljIGNvbnN0IERXQVJGU2VjdGlvbktpbmQgU2VjdGlvbiA9IERXX1NFQ1RfVFlQRVM7CisKK3Byb3RlY3RlZDoKKyAgYm9vbCBleHRyYWN0SW1wbChjb25zdCBEV0FSRkRhdGFFeHRyYWN0b3IgJmRlYnVnX2luZm8sCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm9mZnNldF9wdHIpIG92ZXJyaWRlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGVFlQRVVOSVRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZVbml0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlVuaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTNmNTczCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZVbml0LmgKQEAgLTAsMCArMSw0ODggQEAKKy8vPT09LSBEV0FSRlVuaXQuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZVTklUX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZVTklUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0luZm9FbnRyeS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdSYW5nZUxpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRpZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRm9ybVZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZSZWxvY01hcC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGU2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGVW5pdEluZGV4LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFFeHRyYWN0b3IuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBEV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uU2V0OworY2xhc3MgRFdBUkZDb250ZXh0OworY2xhc3MgRFdBUkZEZWJ1Z0FiYnJldjsKK2NsYXNzIERXQVJGVW5pdDsKKworLy8vIEJhc2UgY2xhc3MgZm9yIGFsbCBEV0FSRlVuaXRTZWN0aW9uIGNsYXNzZXMuIFRoaXMgcHJvdmlkZXMgdGhlCisvLy8gZnVuY3Rpb25hbGl0eSBjb21tb24gdG8gYWxsIHVuaXQgdHlwZXMuCitjbGFzcyBEV0FSRlVuaXRTZWN0aW9uQmFzZSB7CitwdWJsaWM6CisgIC8vLyBSZXR1cm5zIHRoZSBVbml0IHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIHNlY3Rpb24gb2Zmc2V0IGluIHRoZQorICAvLy8gc2FtZSBzZWN0aW9uIHRoaXMgVW5pdCBvcmlnaW5hdGVkIGZyb20uCisgIHZpcnR1YWwgRFdBUkZVbml0ICpnZXRVbml0Rm9yT2Zmc2V0KHVpbnQzMl90IE9mZnNldCkgY29uc3QgPSAwOworICB2aXJ0dWFsIERXQVJGVW5pdCAqZ2V0VW5pdEZvckluZGV4RW50cnkoY29uc3QgRFdBUkZVbml0SW5kZXg6OkVudHJ5ICZFKSA9IDA7CisKKyAgdm9pZCBwYXJzZShEV0FSRkNvbnRleHQgJkMsIGNvbnN0IERXQVJGU2VjdGlvbiAmU2VjdGlvbik7CisgIHZvaWQgcGFyc2VEV08oRFdBUkZDb250ZXh0ICZDLCBjb25zdCBEV0FSRlNlY3Rpb24gJkRXT1NlY3Rpb24sCisgICAgICAgICAgICAgICAgYm9vbCBMYXp5ID0gZmFsc2UpOworCitwcm90ZWN0ZWQ6CisgIH5EV0FSRlVuaXRTZWN0aW9uQmFzZSgpID0gZGVmYXVsdDsKKworICB2aXJ0dWFsIHZvaWQgcGFyc2VJbXBsKERXQVJGQ29udGV4dCAmQ29udGV4dCwgY29uc3QgRFdBUkZPYmplY3QgJk9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEV0FSRlNlY3Rpb24gJlNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRFdBUkZEZWJ1Z0FiYnJldiAqREEsIGNvbnN0IERXQVJGU2VjdGlvbiAqUlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNTLCBjb25zdCBEV0FSRlNlY3Rpb24gJlNPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEV0FSRlNlY3Rpb24gKkFPUywgY29uc3QgRFdBUkZTZWN0aW9uICZMUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTGl0dGxlRW5kaWFuLCBib29sIGlzRFdPLCBib29sIExhenkpID0gMDsKK307CisKK2NvbnN0IERXQVJGVW5pdEluZGV4ICZnZXREV0FSRlVuaXRJbmRleChEV0FSRkNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdBUkZTZWN0aW9uS2luZCBLaW5kKTsKKworLy8vIENvbmNyZXRlIGluc3RhbmNlIG9mIERXQVJGVW5pdFNlY3Rpb24sIHNwZWNpYWxpemVkIGZvciBvbmUgVW5pdCB0eXBlLgordGVtcGxhdGU8dHlwZW5hbWUgVW5pdFR5cGU+CitjbGFzcyBEV0FSRlVuaXRTZWN0aW9uIGZpbmFsIDogcHVibGljIFNtYWxsVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxVbml0VHlwZT4sIDE+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBEV0FSRlVuaXRTZWN0aW9uQmFzZSB7CisgIGJvb2wgUGFyc2VkID0gZmFsc2U7CisgIHN0ZDo6ZnVuY3Rpb248c3RkOjp1bmlxdWVfcHRyPFVuaXRUeXBlPih1aW50MzJfdCk+IFBhcnNlcjsKKworcHVibGljOgorICB1c2luZyBVbml0VmVjdG9yID0gU21hbGxWZWN0b3JJbXBsPHN0ZDo6dW5pcXVlX3B0cjxVbml0VHlwZT4+OworICB1c2luZyBpdGVyYXRvciA9IHR5cGVuYW1lIFVuaXRWZWN0b3I6Oml0ZXJhdG9yOworICB1c2luZyBpdGVyYXRvcl9yYW5nZSA9IGxsdm06Oml0ZXJhdG9yX3JhbmdlPHR5cGVuYW1lIFVuaXRWZWN0b3I6Oml0ZXJhdG9yPjsKKworICBVbml0VHlwZSAqZ2V0VW5pdEZvck9mZnNldCh1aW50MzJfdCBPZmZzZXQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBhdXRvICpDVSA9IHN0ZDo6dXBwZXJfYm91bmQoCisgICAgICAgIHRoaXMtPmJlZ2luKCksIHRoaXMtPmVuZCgpLCBPZmZzZXQsCisgICAgICAgIFtdKHVpbnQzMl90IExIUywgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFVuaXRUeXBlPiAmUkhTKSB7CisgICAgICAgICAgcmV0dXJuIExIUyA8IFJIUy0+Z2V0TmV4dFVuaXRPZmZzZXQoKTsKKyAgICAgICAgfSk7CisgICAgaWYgKENVICE9IHRoaXMtPmVuZCgpICYmICgqQ1UpLT5nZXRPZmZzZXQoKSA8PSBPZmZzZXQpCisgICAgICByZXR1cm4gQ1UtPmdldCgpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFVuaXRUeXBlICpnZXRVbml0Rm9ySW5kZXhFbnRyeShjb25zdCBEV0FSRlVuaXRJbmRleDo6RW50cnkgJkUpIG92ZXJyaWRlIHsKKyAgICBjb25zdCBhdXRvICpDVU9mZiA9IEUuZ2V0T2Zmc2V0KERXX1NFQ1RfSU5GTyk7CisgICAgaWYgKCFDVU9mZikKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgYXV0byBPZmZzZXQgPSBDVU9mZi0+T2Zmc2V0OworCisgICAgYXV0byAqQ1UgPSBzdGQ6OnVwcGVyX2JvdW5kKAorICAgICAgICB0aGlzLT5iZWdpbigpLCB0aGlzLT5lbmQoKSwgQ1VPZmYtPk9mZnNldCwKKyAgICAgICAgW10odWludDMyX3QgTEhTLCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8VW5pdFR5cGU+ICZSSFMpIHsKKyAgICAgICAgICByZXR1cm4gTEhTIDwgUkhTLT5nZXROZXh0VW5pdE9mZnNldCgpOworICAgICAgICB9KTsKKyAgICBpZiAoQ1UgIT0gdGhpcy0+ZW5kKCkgJiYgKCpDVSktPmdldE9mZnNldCgpIDw9IE9mZnNldCkKKyAgICAgIHJldHVybiBDVS0+Z2V0KCk7CisKKyAgICBpZiAoIVBhcnNlcikKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgYXV0byBVID0gUGFyc2VyKE9mZnNldCk7CisgICAgaWYgKCFVKQorICAgICAgVSA9IG51bGxwdHI7CisKKyAgICBhdXRvICpOZXdDVSA9IFUuZ2V0KCk7CisgICAgdGhpcy0+aW5zZXJ0KENVLCBzdGQ6Om1vdmUoVSkpOworICAgIHJldHVybiBOZXdDVTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIHBhcnNlSW1wbChEV0FSRkNvbnRleHQgJkNvbnRleHQsIGNvbnN0IERXQVJGT2JqZWN0ICZPYmosCisgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGU2VjdGlvbiAmU2VjdGlvbiwgY29uc3QgRFdBUkZEZWJ1Z0FiYnJldiAqREEsCisgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGU2VjdGlvbiAqUlMsIFN0cmluZ1JlZiBTUywgY29uc3QgRFdBUkZTZWN0aW9uICZTT1MsCisgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGU2VjdGlvbiAqQU9TLCBjb25zdCBEV0FSRlNlY3Rpb24gJkxTLCBib29sIExFLAorICAgICAgICAgICAgICAgICBib29sIElzRFdPLCBib29sIExhenkpIG92ZXJyaWRlIHsKKyAgICBpZiAoUGFyc2VkKQorICAgICAgcmV0dXJuOworICAgIERXQVJGRGF0YUV4dHJhY3RvciBEYXRhKE9iaiwgU2VjdGlvbiwgTEUsIDApOworICAgIGlmICghUGFyc2VyKSB7CisgICAgICBjb25zdCBEV0FSRlVuaXRJbmRleCAqSW5kZXggPSBudWxscHRyOworICAgICAgaWYgKElzRFdPKQorICAgICAgICBJbmRleCA9ICZnZXREV0FSRlVuaXRJbmRleChDb250ZXh0LCBVbml0VHlwZTo6U2VjdGlvbik7CisgICAgICBQYXJzZXIgPSBbPSwgJkNvbnRleHQsICZTZWN0aW9uLCAmU09TLAorICAgICAgICAgICAgICAgICZMU10odWludDMyX3QgT2Zmc2V0KSAtPiBzdGQ6OnVuaXF1ZV9wdHI8VW5pdFR5cGU+IHsKKyAgICAgICAgaWYgKCFEYXRhLmlzVmFsaWRPZmZzZXQoT2Zmc2V0KSkKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgYXV0byBVID0gbGx2bTo6bWFrZV91bmlxdWU8VW5pdFR5cGU+KAorICAgICAgICAgICAgQ29udGV4dCwgU2VjdGlvbiwgREEsIFJTLCBTUywgU09TLCBBT1MsIExTLCBMRSwgSXNEV08sICp0aGlzLAorICAgICAgICAgICAgSW5kZXggPyBJbmRleC0+Z2V0RnJvbU9mZnNldChPZmZzZXQpIDogbnVsbHB0cik7CisgICAgICAgIGlmICghVS0+ZXh0cmFjdChEYXRhLCAmT2Zmc2V0KSkKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIFU7CisgICAgICB9OworICAgIH0KKyAgICBpZiAoTGF6eSkKKyAgICAgIHJldHVybjsKKyAgICBhdXRvIEkgPSB0aGlzLT5iZWdpbigpOworICAgIHVpbnQzMl90IE9mZnNldCA9IDA7CisgICAgd2hpbGUgKERhdGEuaXNWYWxpZE9mZnNldChPZmZzZXQpKSB7CisgICAgICBpZiAoSSAhPSB0aGlzLT5lbmQoKSAmJiAoKkkpLT5nZXRPZmZzZXQoKSA9PSBPZmZzZXQpIHsKKyAgICAgICAgKytJOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGF1dG8gVSA9IFBhcnNlcihPZmZzZXQpOworICAgICAgaWYgKCFVKQorICAgICAgICBicmVhazsKKyAgICAgIE9mZnNldCA9IFUtPmdldE5leHRVbml0T2Zmc2V0KCk7CisgICAgICBJID0gc3RkOjpuZXh0KHRoaXMtPmluc2VydChJLCBzdGQ6Om1vdmUoVSkpKTsKKyAgICB9CisgICAgUGFyc2VkID0gdHJ1ZTsKKyAgfQorfTsKKworLy8vIFJlcHJlc2VudHMgYmFzZSBhZGRyZXNzIG9mIHRoZSBDVS4KK3N0cnVjdCBCYXNlQWRkcmVzcyB7CisgIHVpbnQ2NF90IEFkZHJlc3M7CisgIHVpbnQ2NF90IFNlY3Rpb25JbmRleDsKK307CisKKy8vLyBSZXByZXNlbnRzIGEgdW5pdCdzIGNvbnRyaWJ1dGlvbiB0byB0aGUgc3RyaW5nIG9mZnNldHMgdGFibGUuCitzdHJ1Y3QgU3RyT2Zmc2V0c0NvbnRyaWJ1dGlvbkRlc2NyaXB0b3IgeworICB1aW50NjRfdCBCYXNlID0gMDsKKyAgdWludDY0X3QgU2l6ZSA9IDA7CisgIC8vLyBGb3JtYXQgYW5kIHZlcnNpb24uCisgIGR3YXJmOjpGb3JtUGFyYW1zIEZvcm1QYXJhbXMgPSB7MCwgMCwgZHdhcmY6OkR3YXJmRm9ybWF0OjpEV0FSRjMyfTsKKworICBTdHJPZmZzZXRzQ29udHJpYnV0aW9uRGVzY3JpcHRvcih1aW50NjRfdCBCYXNlLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IFZlcnNpb24sIGR3YXJmOjpEd2FyZkZvcm1hdCBGb3JtYXQpCisgICAgICA6IEJhc2UoQmFzZSksIFNpemUoU2l6ZSksIEZvcm1QYXJhbXMoe1ZlcnNpb24sIDAsIEZvcm1hdH0pIHt9CisKKyAgdWludDhfdCBnZXRWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gRm9ybVBhcmFtcy5WZXJzaW9uOyB9CisgIGR3YXJmOjpEd2FyZkZvcm1hdCBnZXRGb3JtYXQoKSBjb25zdCB7IHJldHVybiBGb3JtUGFyYW1zLkZvcm1hdDsgfQorICB1aW50OF90IGdldER3YXJmT2Zmc2V0Qnl0ZVNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIEZvcm1QYXJhbXMuZ2V0RHdhcmZPZmZzZXRCeXRlU2l6ZSgpOworICB9CisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciBhIGNvbnRyaWJ1dGlvbiB0byB0aGUgc3RyaW5nIG9mZnNldHMgdGFibGUgaXMKKyAgLy8vIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVsZXZhbnQgc2VjdGlvbiBzaXplIGFuZCB0aGF0IGl0cyBsZW5ndGggaXMKKyAgLy8vIGEgbXVsdGlwbGUgb2YgdGhlIHNpemUgb2Ygb25lIG9mIGl0cyBlbnRyaWVzLgorICBPcHRpb25hbDxTdHJPZmZzZXRzQ29udHJpYnV0aW9uRGVzY3JpcHRvcj4KKyAgdmFsaWRhdGVDb250cmlidXRpb25TaXplKERXQVJGRGF0YUV4dHJhY3RvciAmREEpOworfTsKKworY2xhc3MgRFdBUkZVbml0IHsKKyAgRFdBUkZDb250ZXh0ICZDb250ZXh0OworICAvLy8gU2VjdGlvbiBjb250YWluaW5nIHRoaXMgRFdBUkZVbml0LgorICBjb25zdCBEV0FSRlNlY3Rpb24gJkluZm9TZWN0aW9uOworCisgIGNvbnN0IERXQVJGRGVidWdBYmJyZXYgKkFiYnJldjsKKyAgY29uc3QgRFdBUkZTZWN0aW9uICpSYW5nZVNlY3Rpb247CisgIHVpbnQzMl90IFJhbmdlU2VjdGlvbkJhc2U7CisgIGNvbnN0IERXQVJGU2VjdGlvbiAmTGluZVNlY3Rpb247CisgIFN0cmluZ1JlZiBTdHJpbmdTZWN0aW9uOworICBjb25zdCBEV0FSRlNlY3Rpb24gJlN0cmluZ09mZnNldFNlY3Rpb247CisgIGNvbnN0IERXQVJGU2VjdGlvbiAqQWRkck9mZnNldFNlY3Rpb247CisgIHVpbnQzMl90IEFkZHJPZmZzZXRTZWN0aW9uQmFzZSA9IDA7CisgIGJvb2wgaXNMaXR0bGVFbmRpYW47CisgIGJvb2wgaXNEV087CisgIGNvbnN0IERXQVJGVW5pdFNlY3Rpb25CYXNlICZVbml0U2VjdGlvbjsKKworICAvLyBWZXJzaW9uLCBhZGRyZXNzIHNpemUsIGFuZCBEV0FSRiBmb3JtYXQuCisgIGR3YXJmOjpGb3JtUGFyYW1zIEZvcm1QYXJhbXM7CisgIC8vLyBTdGFydCwgbGVuZ3RoLCBhbmQgRFdBUkYgZm9ybWF0IG9mIHRoZSB1bml0J3MgY29udHJpYnV0aW9uIHRvIHRoZSBzdHJpbmcKKyAgLy8vIG9mZnNldHMgdGFibGUgKERXQVJGIHY1KS4KKyAgT3B0aW9uYWw8U3RyT2Zmc2V0c0NvbnRyaWJ1dGlvbkRlc2NyaXB0b3I+IFN0cmluZ09mZnNldHNUYWJsZUNvbnRyaWJ1dGlvbjsKKworICB1aW50MzJfdCBPZmZzZXQ7CisgIHVpbnQzMl90IExlbmd0aDsKKyAgbXV0YWJsZSBjb25zdCBEV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uU2V0ICpBYmJyZXZzOworICB1aW50NjRfdCBBYmJyT2Zmc2V0OworICB1aW50OF90IFVuaXRUeXBlOworICBsbHZtOjpPcHRpb25hbDxCYXNlQWRkcmVzcz4gQmFzZUFkZHI7CisgIC8vLyBUaGUgY29tcGlsZSB1bml0IGRlYnVnIGluZm9ybWF0aW9uIGVudHJ5IGl0ZW1zLgorICBzdGQ6OnZlY3RvcjxEV0FSRkRlYnVnSW5mb0VudHJ5PiBEaWVBcnJheTsKKworICAvLy8gTWFwIGZyb20gcmFuZ2UncyBzdGFydCBhZGRyZXNzIHRvIGVuZCBhZGRyZXNzIGFuZCBjb3JyZXNwb25kaW5nIERJRS4KKyAgLy8vIEludGVydmFsTWFwIGRvZXMgbm90IHN1cHBvcnQgcmFuZ2UgcmVtb3ZhbCwgYXMgYSByZXN1bHQsIHdlIHVzZSB0aGUKKyAgLy8vIHN0ZDo6bWFwOjp1cHBlcl9ib3VuZCBmb3IgYWRkcmVzcyByYW5nZSBsb29rdXAuCisgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnBhaXI8dWludDY0X3QsIERXQVJGRGllPj4gQWRkckRpZU1hcDsKKworICB1c2luZyBkaWVfaXRlcmF0b3JfcmFuZ2UgPQorICAgICAgaXRlcmF0b3JfcmFuZ2U8c3RkOjp2ZWN0b3I8RFdBUkZEZWJ1Z0luZm9FbnRyeT46Oml0ZXJhdG9yPjsKKworICBzdGQ6OnNoYXJlZF9wdHI8RFdBUkZVbml0PiBEV087CisKKyAgY29uc3QgRFdBUkZVbml0SW5kZXg6OkVudHJ5ICpJbmRleEVudHJ5OworCisgIHVpbnQzMl90IGdldERJRUluZGV4KGNvbnN0IERXQVJGRGVidWdJbmZvRW50cnkgKkRpZSkgeworICAgIGF1dG8gRmlyc3QgPSBEaWVBcnJheS5kYXRhKCk7CisgICAgYXNzZXJ0KERpZSA+PSBGaXJzdCAmJiBEaWUgPCBGaXJzdCArIERpZUFycmF5LnNpemUoKSk7CisgICAgcmV0dXJuIERpZSAtIEZpcnN0OworICB9CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCBib29sIGV4dHJhY3RJbXBsKGNvbnN0IERXQVJGRGF0YUV4dHJhY3RvciAmZGVidWdfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvZmZzZXRfcHRyKTsKKworICAvLy8gU2l6ZSBpbiBieXRlcyBvZiB0aGUgdW5pdCBoZWFkZXIuCisgIHZpcnR1YWwgdWludDMyX3QgZ2V0SGVhZGVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGdldFZlcnNpb24oKSA8PSA0ID8gMTEgOiAxMjsgfQorCisgIC8vLyBGaW5kIHRoZSB1bml0J3MgY29udHJpYnV0aW9uIHRvIHRoZSBzdHJpbmcgb2Zmc2V0cyB0YWJsZSBhbmQgZGV0ZXJtaW5lIGl0cworICAvLy8gbGVuZ3RoIGFuZCBmb3JtLiBUaGUgZ2l2ZW4gb2Zmc2V0IGlzIGV4cGVjdGVkIHRvIGJlIGRlcml2ZWQgZnJvbSB0aGUgdW5pdAorICAvLy8gRElFJ3MgRFdfQVRfc3RyX29mZnNldHNfYmFzZSBhdHRyaWJ1dGUuCisgIE9wdGlvbmFsPFN0ck9mZnNldHNDb250cmlidXRpb25EZXNjcmlwdG9yPgorICBkZXRlcm1pbmVTdHJpbmdPZmZzZXRzVGFibGVDb250cmlidXRpb24oRFdBUkZEYXRhRXh0cmFjdG9yICZEQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldCk7CisKKyAgLy8vIEZpbmQgdGhlIHVuaXQncyBjb250cmlidXRpb24gdG8gdGhlIHN0cmluZyBvZmZzZXRzIHRhYmxlIGFuZCBkZXRlcm1pbmUgaXRzCisgIC8vLyBsZW5ndGggYW5kIGZvcm0uIFRoZSBnaXZlbiBvZmZzZXQgaXMgZXhwZWN0ZWQgdG8gYmUgMCBpbiBhIGR3byBmaWxlIG9yLAorICAvLy8gaW4gYSBkd3AgZmlsZSwgdGhlIHN0YXJ0IG9mIHRoZSB1bml0J3MgY29udHJpYnV0aW9uIHRvIHRoZSBzdHJpbmcgb2Zmc2V0cworICAvLy8gdGFibGUgc2VjdGlvbiAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggdGFibGUpLgorICBPcHRpb25hbDxTdHJPZmZzZXRzQ29udHJpYnV0aW9uRGVzY3JpcHRvcj4KKyAgZGV0ZXJtaW5lU3RyaW5nT2Zmc2V0c1RhYmxlQ29udHJpYnV0aW9uRFdPKERXQVJGRGF0YUV4dHJhY3RvciAmREEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXQpOworCitwdWJsaWM6CisgIERXQVJGVW5pdChEV0FSRkNvbnRleHQgJkNvbnRleHQsIGNvbnN0IERXQVJGU2VjdGlvbiAmU2VjdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IERXQVJGRGVidWdBYmJyZXYgKkRBLCBjb25zdCBEV0FSRlNlY3Rpb24gKlJTLCBTdHJpbmdSZWYgU1MsCisgICAgICAgICAgICBjb25zdCBEV0FSRlNlY3Rpb24gJlNPUywgY29uc3QgRFdBUkZTZWN0aW9uICpBT1MsCisgICAgICAgICAgICBjb25zdCBEV0FSRlNlY3Rpb24gJkxTLCBib29sIExFLCBib29sIElzRFdPLAorICAgICAgICAgICAgY29uc3QgRFdBUkZVbml0U2VjdGlvbkJhc2UgJlVuaXRTZWN0aW9uLAorICAgICAgICAgICAgY29uc3QgRFdBUkZVbml0SW5kZXg6OkVudHJ5ICpJbmRleEVudHJ5ID0gbnVsbHB0cik7CisKKyAgdmlydHVhbCB+RFdBUkZVbml0KCk7CisKKyAgRFdBUkZDb250ZXh0JiBnZXRDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQ29udGV4dDsgfQorCisgIGNvbnN0IERXQVJGU2VjdGlvbiAmZ2V0TGluZVNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBMaW5lU2VjdGlvbjsgfQorICBTdHJpbmdSZWYgZ2V0U3RyaW5nU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIFN0cmluZ1NlY3Rpb247IH0KKyAgY29uc3QgRFdBUkZTZWN0aW9uICZnZXRTdHJpbmdPZmZzZXRTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBTdHJpbmdPZmZzZXRTZWN0aW9uOworICB9CisKKyAgdm9pZCBzZXRBZGRyT2Zmc2V0U2VjdGlvbihjb25zdCBEV0FSRlNlY3Rpb24gKkFPUywgdWludDMyX3QgQmFzZSkgeworICAgIEFkZHJPZmZzZXRTZWN0aW9uID0gQU9TOworICAgIEFkZHJPZmZzZXRTZWN0aW9uQmFzZSA9IEJhc2U7CisgIH0KKworICAvLy8gUmVjdXJzaXZlbHkgdXBkYXRlIGFkZHJlc3MgdG8gRGllIG1hcC4KKyAgdm9pZCB1cGRhdGVBZGRyZXNzRGllTWFwKERXQVJGRGllIERpZSk7CisKKyAgdm9pZCBzZXRSYW5nZXNTZWN0aW9uKGNvbnN0IERXQVJGU2VjdGlvbiAqUlMsIHVpbnQzMl90IEJhc2UpIHsKKyAgICBSYW5nZVNlY3Rpb24gPSBSUzsKKyAgICBSYW5nZVNlY3Rpb25CYXNlID0gQmFzZTsKKyAgfQorCisgIGJvb2wgZ2V0QWRkck9mZnNldFNlY3Rpb25JdGVtKHVpbnQzMl90IEluZGV4LCB1aW50NjRfdCAmUmVzdWx0KSBjb25zdDsKKyAgYm9vbCBnZXRTdHJpbmdPZmZzZXRTZWN0aW9uSXRlbSh1aW50MzJfdCBJbmRleCwgdWludDY0X3QgJlJlc3VsdCkgY29uc3Q7CisKKyAgRFdBUkZEYXRhRXh0cmFjdG9yIGdldERlYnVnSW5mb0V4dHJhY3RvcigpIGNvbnN0OworCisgIERhdGFFeHRyYWN0b3IgZ2V0U3RyaW5nRXh0cmFjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBEYXRhRXh0cmFjdG9yKFN0cmluZ1NlY3Rpb24sIGZhbHNlLCAwKTsKKyAgfQorCisgIGJvb2wgZXh0cmFjdChjb25zdCBEV0FSRkRhdGFFeHRyYWN0b3IgJmRlYnVnX2luZm8sIHVpbnQzMl90ICpvZmZzZXRfcHRyKTsKKworICAvLy8gZXh0cmFjdFJhbmdlTGlzdCAtIGV4dHJhY3RzIHRoZSByYW5nZSBsaXN0IHJlZmVyZW5jZWQgYnkgdGhpcyBjb21waWxlCisgIC8vLyB1bml0IGZyb20gLmRlYnVnX3JhbmdlcyBzZWN0aW9uLiBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KKyAgLy8vIFJlcXVpcmVzIHRoYXQgY29tcGlsZSB1bml0IGlzIGFscmVhZHkgZXh0cmFjdGVkLgorICBib29sIGV4dHJhY3RSYW5nZUxpc3QodWludDMyX3QgUmFuZ2VMaXN0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgRFdBUkZEZWJ1Z1JhbmdlTGlzdCAmUmFuZ2VMaXN0KSBjb25zdDsKKyAgdm9pZCBjbGVhcigpOworICB1aW50MzJfdCBnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBPZmZzZXQ7IH0KKyAgdWludDMyX3QgZ2V0TmV4dFVuaXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBPZmZzZXQgKyBMZW5ndGggKyA0OyB9CisgIHVpbnQzMl90IGdldExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIExlbmd0aDsgfQorCisgIGNvbnN0IE9wdGlvbmFsPFN0ck9mZnNldHNDb250cmlidXRpb25EZXNjcmlwdG9yPiAmCisgIGdldFN0cmluZ09mZnNldHNUYWJsZUNvbnRyaWJ1dGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RyaW5nT2Zmc2V0c1RhYmxlQ29udHJpYnV0aW9uOworICB9CisgIGNvbnN0IGR3YXJmOjpGb3JtUGFyYW1zICZnZXRGb3JtUGFyYW1zKCkgY29uc3QgeyByZXR1cm4gRm9ybVBhcmFtczsgfQorICB1aW50MTZfdCBnZXRWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gRm9ybVBhcmFtcy5WZXJzaW9uOyB9CisgIGR3YXJmOjpEd2FyZkZvcm1hdCBnZXRGb3JtYXQoKSBjb25zdCB7IHJldHVybiBGb3JtUGFyYW1zLkZvcm1hdDsgfQorICB1aW50OF90IGdldEFkZHJlc3NCeXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEZvcm1QYXJhbXMuQWRkclNpemU7IH0KKyAgdWludDhfdCBnZXRSZWZBZGRyQnl0ZVNpemUoKSBjb25zdCB7IHJldHVybiBGb3JtUGFyYW1zLmdldFJlZkFkZHJCeXRlU2l6ZSgpOyB9CisgIHVpbnQ4X3QgZ2V0RHdhcmZPZmZzZXRCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9ybVBhcmFtcy5nZXREd2FyZk9mZnNldEJ5dGVTaXplKCk7CisgIH0KKworICB1aW50OF90IGdldER3YXJmU3RyaW5nT2Zmc2V0c0J5dGVTaXplKCkgY29uc3QgeworICAgIGFzc2VydChTdHJpbmdPZmZzZXRzVGFibGVDb250cmlidXRpb24pOworICAgIHJldHVybiBTdHJpbmdPZmZzZXRzVGFibGVDb250cmlidXRpb24tPmdldER3YXJmT2Zmc2V0Qnl0ZVNpemUoKTsKKyAgfQorCisgIHVpbnQ2NF90IGdldFN0cmluZ09mZnNldHNCYXNlKCkgY29uc3QgeworICAgIGFzc2VydChTdHJpbmdPZmZzZXRzVGFibGVDb250cmlidXRpb24pOworICAgIHJldHVybiBTdHJpbmdPZmZzZXRzVGFibGVDb250cmlidXRpb24tPkJhc2U7CisgIH0KKworICBjb25zdCBEV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uU2V0ICpnZXRBYmJyZXZpYXRpb25zKCkgY29uc3Q7CisKKyAgdWludDhfdCBnZXRVbml0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFVuaXRUeXBlOyB9CisKKyAgc3RhdGljIGJvb2wgaXNNYXRjaGluZ1VuaXRUeXBlQW5kVGFnKHVpbnQ4X3QgVW5pdFR5cGUsIGR3YXJmOjpUYWcgVGFnKSB7CisgICAgc3dpdGNoIChVbml0VHlwZSkgeworICAgIGNhc2UgZHdhcmY6OkRXX1VUX2NvbXBpbGU6CisgICAgICByZXR1cm4gVGFnID09IGR3YXJmOjpEV19UQUdfY29tcGlsZV91bml0OworICAgIGNhc2UgZHdhcmY6OkRXX1VUX3R5cGU6CisgICAgICByZXR1cm4gVGFnID09IGR3YXJmOjpEV19UQUdfdHlwZV91bml0OworICAgIGNhc2UgZHdhcmY6OkRXX1VUX3BhcnRpYWw6CisgICAgICByZXR1cm4gVGFnID09IGR3YXJmOjpEV19UQUdfcGFydGlhbF91bml0OworICAgIGNhc2UgZHdhcmY6OkRXX1VUX3NrZWxldG9uOgorICAgICAgcmV0dXJuIFRhZyA9PSBkd2FyZjo6RFdfVEFHX3NrZWxldG9uX3VuaXQ7CisgICAgY2FzZSBkd2FyZjo6RFdfVVRfc3BsaXRfY29tcGlsZToKKyAgICBjYXNlIGR3YXJmOjpEV19VVF9zcGxpdF90eXBlOgorICAgICAgcmV0dXJuIGR3YXJmOjppc1VuaXRUeXBlKFRhZyk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9yIHRoZSBoZWFkZXIgb2YgYSB1bml0IG9mCisgIC8vLyBVbml0VHlwZSB0eXBlLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBhIHZhbGlkIHVuaXQgdHlwZSB3aGljaCBpbgorICAvLy8gRFdBUkY1IGlzIGRlZmluZWQgYXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgc2l4IHR5cGVzLgorICBzdGF0aWMgdWludDMyX3QgZ2V0RFdBUkY1SGVhZGVyU2l6ZSh1aW50OF90IFVuaXRUeXBlKSB7CisgICAgc3dpdGNoIChVbml0VHlwZSkgeworICAgIGNhc2UgZHdhcmY6OkRXX1VUX2NvbXBpbGU6CisgICAgY2FzZSBkd2FyZjo6RFdfVVRfcGFydGlhbDoKKyAgICAgIHJldHVybiAxMjsKKyAgICBjYXNlIGR3YXJmOjpEV19VVF9za2VsZXRvbjoKKyAgICBjYXNlIGR3YXJmOjpEV19VVF9zcGxpdF9jb21waWxlOgorICAgICAgcmV0dXJuIDIwOworICAgIGNhc2UgZHdhcmY6OkRXX1VUX3R5cGU6CisgICAgY2FzZSBkd2FyZjo6RFdfVVRfc3BsaXRfdHlwZToKKyAgICAgIHJldHVybiAyNDsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBVbml0VHlwZS4iKTsKKyAgfQorCisgIGxsdm06Ok9wdGlvbmFsPEJhc2VBZGRyZXNzPiBnZXRCYXNlQWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIEJhc2VBZGRyOyB9CisKKyAgdm9pZCBzZXRCYXNlQWRkcmVzcyhCYXNlQWRkcmVzcyBCYXNlQWRkcikgeyB0aGlzLT5CYXNlQWRkciA9IEJhc2VBZGRyOyB9CisKKyAgRFdBUkZEaWUgZ2V0VW5pdERJRShib29sIEV4dHJhY3RVbml0RElFT25seSA9IHRydWUpIHsKKyAgICBleHRyYWN0RElFc0lmTmVlZGVkKEV4dHJhY3RVbml0RElFT25seSk7CisgICAgaWYgKERpZUFycmF5LmVtcHR5KCkpCisgICAgICByZXR1cm4gRFdBUkZEaWUoKTsKKyAgICByZXR1cm4gRFdBUkZEaWUodGhpcywgJkRpZUFycmF5WzBdKTsKKyAgfQorCisgIGNvbnN0IGNoYXIgKmdldENvbXBpbGF0aW9uRGlyKCk7CisgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXREV09JZCgpOworCisgIHZvaWQgY29sbGVjdEFkZHJlc3NSYW5nZXMoRFdBUkZBZGRyZXNzUmFuZ2VzVmVjdG9yICZDVVJhbmdlcyk7CisKKyAgLy8vIFJldHVybnMgc3VicHJvZ3JhbSBESUUgd2l0aCBhZGRyZXNzIHJhbmdlIGVuY29tcGFzc2luZyB0aGUgcHJvdmlkZWQKKyAgLy8vIGFkZHJlc3MuIFRoZSBwb2ludGVyIGlzIGFsaXZlIGFzIGxvbmcgYXMgcGFyc2VkIGNvbXBpbGUgdW5pdCBESUVzIGFyZSBub3QKKyAgLy8vIGNsZWFyZWQuCisgIERXQVJGRGllIGdldFN1YnJvdXRpbmVGb3JBZGRyZXNzKHVpbnQ2NF90IEFkZHJlc3MpOworCisgIC8vLyBnZXRJbmxpbmVkQ2hhaW5Gb3JBZGRyZXNzIC0gZmV0Y2hlcyBpbmxpbmVkIGNoYWluIGZvciBhIGdpdmVuIGFkZHJlc3MuCisgIC8vLyBSZXR1cm5zIGVtcHR5IGNoYWluIGlmIHRoZXJlIGlzIG5vIHN1YnByb2dyYW0gY29udGFpbmluZyBhZGRyZXNzLiBUaGUKKyAgLy8vIGNoYWluIGlzIHZhbGlkIGFzIGxvbmcgYXMgcGFyc2VkIGNvbXBpbGUgdW5pdCBESUVzIGFyZSBub3QgY2xlYXJlZC4KKyAgdm9pZCBnZXRJbmxpbmVkQ2hhaW5Gb3JBZGRyZXNzKHVpbnQ2NF90IEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8RFdBUkZEaWU+ICZJbmxpbmVkQ2hhaW4pOworCisgIC8vLyBnZXRVbml0U2VjdGlvbiAtIFJldHVybiB0aGUgRFdBUkZVbml0U2VjdGlvbiBjb250YWluaW5nIHRoaXMgdW5pdC4KKyAgY29uc3QgRFdBUkZVbml0U2VjdGlvbkJhc2UgJmdldFVuaXRTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gVW5pdFNlY3Rpb247IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBESUVzIGluIHRoZSB1bml0LiBQYXJzZXMgdGhlIHVuaXQKKyAgLy8vIGlmIG5lY2Vzc2FyeS4KKyAgdW5zaWduZWQgZ2V0TnVtRElFcygpIHsKKyAgICBleHRyYWN0RElFc0lmTmVlZGVkKGZhbHNlKTsKKyAgICByZXR1cm4gRGllQXJyYXkuc2l6ZSgpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGluZGV4IG9mIGEgRElFIGluc2lkZSB0aGUgdW5pdCdzIERJRSB2ZWN0b3IuCisgIC8vLworICAvLy8gSXQgaXMgaWxsZWdhbCB0byBjYWxsIHRoaXMgbWV0aG9kIHdpdGggYSBESUUgdGhhdCBoYXNuJ3QgYmUKKyAgLy8vIGNyZWF0ZWQgYnkgdGhpcyB1bml0LiBJbiBvdGhlciB3b3JkLCBpdCdzIGlsbGVnYWwgdG8gY2FsbCB0aGlzCisgIC8vLyBtZXRob2Qgb24gYSBESUUgdGhhdCBpc24ndCBhY2Nlc3NpYmxlIGJ5IGZvbGxvd2luZworICAvLy8gY2hpbGRyZW4vc2libGluZyBsaW5rcyBzdGFydGluZyBmcm9tIHRoaXMgdW5pdCdzIGdldFVuaXRESUUoKS4KKyAgdWludDMyX3QgZ2V0RElFSW5kZXgoY29uc3QgRFdBUkZEaWUgJkQpIHsKKyAgICByZXR1cm4gZ2V0RElFSW5kZXgoRC5nZXREZWJ1Z0luZm9FbnRyeSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBESUUgb2JqZWN0IGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgRFdBUkZEaWUgZ2V0RElFQXRJbmRleCh1bnNpZ25lZCBJbmRleCkgeworICAgIGFzc2VydChJbmRleCA8IERpZUFycmF5LnNpemUoKSk7CisgICAgcmV0dXJuIERXQVJGRGllKHRoaXMsICZEaWVBcnJheVtJbmRleF0pOworICB9CisKKyAgRFdBUkZEaWUgZ2V0UGFyZW50KGNvbnN0IERXQVJGRGVidWdJbmZvRW50cnkgKkRpZSk7CisgIERXQVJGRGllIGdldFNpYmxpbmcoY29uc3QgRFdBUkZEZWJ1Z0luZm9FbnRyeSAqRGllKTsKKyAgRFdBUkZEaWUgZ2V0Rmlyc3RDaGlsZChjb25zdCBEV0FSRkRlYnVnSW5mb0VudHJ5ICpEaWUpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBESUUgb2JqZWN0IGZvciBhIGdpdmVuIG9mZnNldCBpbnNpZGUgdGhlCisgIC8vLyB1bml0J3MgRElFIHZlY3Rvci4KKyAgLy8vCisgIC8vLyBUaGUgdW5pdCBuZWVkcyB0byBoYXZlIGl0cyBESUVzIGV4dHJhY3RlZCBmb3IgdGhpcyBtZXRob2QgdG8gd29yay4KKyAgRFdBUkZEaWUgZ2V0RElFRm9yT2Zmc2V0KHVpbnQzMl90IE9mZnNldCkgeworICAgIGV4dHJhY3RESUVzSWZOZWVkZWQoZmFsc2UpOworICAgIGFzc2VydCghRGllQXJyYXkuZW1wdHkoKSk7CisgICAgYXV0byBpdCA9IHN0ZDo6bG93ZXJfYm91bmQoCisgICAgICAgIERpZUFycmF5LmJlZ2luKCksIERpZUFycmF5LmVuZCgpLCBPZmZzZXQsCisgICAgICAgIFtdKGNvbnN0IERXQVJGRGVidWdJbmZvRW50cnkgJkxIUywgdWludDMyX3QgT2Zmc2V0KSB7CisgICAgICAgICAgcmV0dXJuIExIUy5nZXRPZmZzZXQoKSA8IE9mZnNldDsKKyAgICAgICAgfSk7CisgICAgaWYgKGl0ICE9IERpZUFycmF5LmVuZCgpICYmIGl0LT5nZXRPZmZzZXQoKSA9PSBPZmZzZXQpCisgICAgICByZXR1cm4gRFdBUkZEaWUodGhpcywgJippdCk7CisgICAgcmV0dXJuIERXQVJGRGllKCk7CisgIH0KKworICB1aW50MzJfdCBnZXRMaW5lVGFibGVPZmZzZXQoKSBjb25zdCB7CisgICAgaWYgKEluZGV4RW50cnkpCisgICAgICBpZiAoY29uc3QgYXV0byAqQ29udHJpYiA9IEluZGV4RW50cnktPmdldE9mZnNldChEV19TRUNUX0xJTkUpKQorICAgICAgICByZXR1cm4gQ29udHJpYi0+T2Zmc2V0OworICAgIHJldHVybiAwOworICB9CisKKyAgZGllX2l0ZXJhdG9yX3JhbmdlIGRpZXMoKSB7CisgICAgZXh0cmFjdERJRXNJZk5lZWRlZChmYWxzZSk7CisgICAgcmV0dXJuIGRpZV9pdGVyYXRvcl9yYW5nZShEaWVBcnJheS5iZWdpbigpLCBEaWVBcnJheS5lbmQoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIFNpemUgaW4gYnl0ZXMgb2YgdGhlIC5kZWJ1Z19pbmZvIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tcGlsZSB1bml0LgorICBzaXplX3QgZ2V0RGVidWdJbmZvU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIExlbmd0aCArIDQgLSBnZXRIZWFkZXJTaXplKCk7IH0KKworICAvLy8gZXh0cmFjdERJRXNJZk5lZWRlZCAtIFBhcnNlcyBhIGNvbXBpbGUgdW5pdCBhbmQgaW5kZXhlcyBpdHMgRElFcyBpZiBpdAorICAvLy8gaGFzbid0IGFscmVhZHkgYmVlbiBkb25lLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgRElFcyBwYXJzZWQgYXQgdGhpcyBjYWxsLgorICBzaXplX3QgZXh0cmFjdERJRXNJZk5lZWRlZChib29sIENVRGllT25seSk7CisKKyAgLy8vIGV4dHJhY3RESUVzVG9WZWN0b3IgLSBBcHBlbmRzIGFsbCBwYXJzZWQgRElFcyB0byBhIHZlY3Rvci4KKyAgdm9pZCBleHRyYWN0RElFc1RvVmVjdG9yKGJvb2wgQXBwZW5kQ1VEaWUsIGJvb2wgQXBwZW5kTm9uQ1VESUVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RFdBUkZEZWJ1Z0luZm9FbnRyeT4gJkRJRXMpIGNvbnN0OworCisgIC8vLyBjbGVhckRJRXMgLSBDbGVhciBwYXJzZWQgRElFcyB0byBrZWVwIG1lbW9yeSB1c2FnZSBsb3cuCisgIHZvaWQgY2xlYXJESUVzKGJvb2wgS2VlcENVRGllKTsKKworICAvLy8gcGFyc2VEV08gLSBQYXJzZXMgLmR3byBmaWxlIGZvciBjdXJyZW50IGNvbXBpbGUgdW5pdC4gUmV0dXJucyB0cnVlIGlmCisgIC8vLyBpdCB3YXMgYWN0dWFsbHkgY29uc3RydWN0ZWQuCisgIGJvb2wgcGFyc2VEV08oKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRlVOSVRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZVbml0SW5kZXguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGVW5pdEluZGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllZDRiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGVW5pdEluZGV4LmgKQEAgLTAsMCArMSwxMDUgQEAKKy8vPT09LSBEV0FSRlVuaXRJbmRleC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZVTklUSU5ERVhfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRlVOSVRJTkRFWF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhRXh0cmFjdG9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK2VudW0gRFdBUkZTZWN0aW9uS2luZCB7CisgIERXX1NFQ1RfSU5GTyA9IDEsCisgIERXX1NFQ1RfVFlQRVMsCisgIERXX1NFQ1RfQUJCUkVWLAorICBEV19TRUNUX0xJTkUsCisgIERXX1NFQ1RfTE9DLAorICBEV19TRUNUX1NUUl9PRkZTRVRTLAorICBEV19TRUNUX01BQ0lORk8sCisgIERXX1NFQ1RfTUFDUk8sCit9OworCitjbGFzcyBEV0FSRlVuaXRJbmRleCB7CisgIHN0cnVjdCBIZWFkZXIgeworICAgIHVpbnQzMl90IFZlcnNpb247CisgICAgdWludDMyX3QgTnVtQ29sdW1uczsKKyAgICB1aW50MzJfdCBOdW1Vbml0czsKKyAgICB1aW50MzJfdCBOdW1CdWNrZXRzID0gMDsKKworICAgIGJvb2wgcGFyc2UoRGF0YUV4dHJhY3RvciBJbmRleERhdGEsIHVpbnQzMl90ICpPZmZzZXRQdHIpOworICAgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB9OworCitwdWJsaWM6CisgIGNsYXNzIEVudHJ5IHsKKyAgcHVibGljOgorICAgIHN0cnVjdCBTZWN0aW9uQ29udHJpYnV0aW9uIHsKKyAgICAgIHVpbnQzMl90IE9mZnNldDsKKyAgICAgIHVpbnQzMl90IExlbmd0aDsKKyAgICB9OworCisgIHByaXZhdGU6CisgICAgY29uc3QgRFdBUkZVbml0SW5kZXggKkluZGV4OworICAgIHVpbnQ2NF90IFNpZ25hdHVyZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U2VjdGlvbkNvbnRyaWJ1dGlvbltdPiBDb250cmlidXRpb25zOworICAgIGZyaWVuZCBjbGFzcyBEV0FSRlVuaXRJbmRleDsKKworICBwdWJsaWM6CisgICAgY29uc3QgU2VjdGlvbkNvbnRyaWJ1dGlvbiAqZ2V0T2Zmc2V0KERXQVJGU2VjdGlvbktpbmQgU2VjKSBjb25zdDsKKyAgICBjb25zdCBTZWN0aW9uQ29udHJpYnV0aW9uICpnZXRPZmZzZXQoKSBjb25zdDsKKworICAgIGNvbnN0IFNlY3Rpb25Db250cmlidXRpb24gKmdldE9mZnNldHMoKSBjb25zdCB7CisgICAgICByZXR1cm4gQ29udHJpYnV0aW9ucy5nZXQoKTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBnZXRTaWduYXR1cmUoKSBjb25zdCB7IHJldHVybiBTaWduYXR1cmU7IH0KKyAgfTsKKworcHJpdmF0ZToKKyAgc3RydWN0IEhlYWRlciBIZWFkZXI7CisKKyAgRFdBUkZTZWN0aW9uS2luZCBJbmZvQ29sdW1uS2luZDsKKyAgaW50IEluZm9Db2x1bW4gPSAtMTsKKyAgc3RkOjp1bmlxdWVfcHRyPERXQVJGU2VjdGlvbktpbmRbXT4gQ29sdW1uS2luZHM7CisgIHN0ZDo6dW5pcXVlX3B0cjxFbnRyeVtdPiBSb3dzOworCisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0Q29sdW1uSGVhZGVyKERXQVJGU2VjdGlvbktpbmQgRFMpOworCisgIGJvb2wgcGFyc2VJbXBsKERhdGFFeHRyYWN0b3IgSW5kZXhEYXRhKTsKKworcHVibGljOgorICBEV0FSRlVuaXRJbmRleChEV0FSRlNlY3Rpb25LaW5kIEluZm9Db2x1bW5LaW5kKQorICAgICAgOiBJbmZvQ29sdW1uS2luZChJbmZvQ29sdW1uS2luZCkge30KKworICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gSGVhZGVyLk51bUJ1Y2tldHM7IH0KKworICBib29sIHBhcnNlKERhdGFFeHRyYWN0b3IgSW5kZXhEYXRhKTsKKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgY29uc3QgRW50cnkgKmdldEZyb21PZmZzZXQodWludDMyX3QgT2Zmc2V0KSBjb25zdDsKKyAgY29uc3QgRW50cnkgKmdldEZyb21IYXNoKHVpbnQ2NF90IE9mZnNldCkgY29uc3Q7CisKKyAgQXJyYXlSZWY8RFdBUkZTZWN0aW9uS2luZD4gZ2V0Q29sdW1uS2luZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VBcnJheVJlZihDb2x1bW5LaW5kcy5nZXQoKSwgSGVhZGVyLk51bUNvbHVtbnMpOworICB9CisKKyAgQXJyYXlSZWY8RW50cnk+IGdldFJvd3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VBcnJheVJlZihSb3dzLmdldCgpLCBIZWFkZXIuTnVtQnVja2V0cyk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRlVOSVRJTkRFWF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlZlcmlmaWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlZlcmlmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhYTI5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGVmVyaWZpZXIuaApAQCAtMCwwICsxLDMwOSBAQAorLy89PT0tIERXQVJGVmVyaWZpZXIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRlZFUklGSUVSX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZWRVJJRklFUl9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9ESUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkFjY2VsZXJhdG9yVGFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkFkZHJlc3NSYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGllLmgiCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIHJhd19vc3RyZWFtOworc3RydWN0IERXQVJGQXR0cmlidXRlOworY2xhc3MgRFdBUkZDb250ZXh0OworY2xhc3MgRFdBUkZEaWU7CitjbGFzcyBEV0FSRlVuaXQ7CitjbGFzcyBEV0FSRkRhdGFFeHRyYWN0b3I7CitjbGFzcyBEV0FSRkRlYnVnQWJicmV2OworY2xhc3MgRGF0YUV4dHJhY3RvcjsKK3N0cnVjdCBEV0FSRlNlY3Rpb247CisKKy8vLyBBIGNsYXNzIHRoYXQgdmVyaWZpZXMgRFdBUkYgZGVidWcgaW5mb3JtYXRpb24gZ2l2ZW4gYSBEV0FSRiBDb250ZXh0LgorY2xhc3MgRFdBUkZWZXJpZmllciB7CitwdWJsaWM6CisgIC8vLyBBIGNsYXNzIHRoYXQga2VlcHMgdGhlIGFkZHJlc3MgcmFuZ2UgaW5mb3JtYXRpb24gZm9yIGEgc2luZ2xlIERJRS4KKyAgc3RydWN0IERpZVJhbmdlSW5mbyB7CisgICAgRFdBUkZEaWUgRGllOworCisgICAgLy8vIFNvcnRlZCBEV0FSRkFkZHJlc3NSYW5nZXMuCisgICAgc3RkOjp2ZWN0b3I8RFdBUkZBZGRyZXNzUmFuZ2U+IFJhbmdlczsKKworICAgIC8vLyBTb3J0ZWQgRFdBUkZBZGRyZXNzUmFuZ2VJbmZvLgorICAgIHN0ZDo6c2V0PERpZVJhbmdlSW5mbz4gQ2hpbGRyZW47CisKKyAgICBEaWVSYW5nZUluZm8oKSA9IGRlZmF1bHQ7CisgICAgRGllUmFuZ2VJbmZvKERXQVJGRGllIERpZSkgOiBEaWUoRGllKSB7fQorCisgICAgLy8vIFVzZWQgZm9yIHVuaXQgdGVzdGluZy4KKyAgICBEaWVSYW5nZUluZm8oc3RkOjp2ZWN0b3I8RFdBUkZBZGRyZXNzUmFuZ2U+IFJhbmdlcykKKyAgICAgICAgOiBSYW5nZXMoc3RkOjptb3ZlKFJhbmdlcykpIHt9CisKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPERXQVJGQWRkcmVzc1JhbmdlPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgYWRkcmVzc19yYW5nZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHN0ZDo6c2V0PERpZVJhbmdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGRpZV9yYW5nZV9pbmZvX2l0ZXJhdG9yOworCisgICAgLy8vIEluc2VydHMgdGhlIGFkZHJlc3MgcmFuZ2UuIElmIHRoZSByYW5nZSBvdmVybGFwcyB3aXRoIGFuIGV4aXN0aW5nCisgICAgLy8vIHJhbmdlLCB0aGUgcmFuZ2UgaXMgKm5vdCogYWRkZWQgYW5kIGFuIGl0ZXJhdG9yIHRvIHRoZSBvdmVybGFwcGluZworICAgIC8vLyByYW5nZSBpcyByZXR1cm5lZC4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyB1c2VkIGZvciBmaW5kaW5nIG92ZXJsYXBwaW5nIHJhbmdlcyB3aXRoaW4gdGhlIHNhbWUgRElFLgorICAgIGFkZHJlc3NfcmFuZ2VfaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IERXQVJGQWRkcmVzc1JhbmdlICZSKTsKKworICAgIC8vLyBGaW5kcyBhbiBhZGRyZXNzIHJhbmdlIGluIHRoZSBzb3J0ZWQgdmVjdG9yIG9mIHJhbmdlcy4KKyAgICBhZGRyZXNzX3JhbmdlX2l0ZXJhdG9yIGZpbmRSYW5nZShjb25zdCBEV0FSRkFkZHJlc3NSYW5nZSAmUikgY29uc3QgeworICAgICAgYXV0byBCZWdpbiA9IFJhbmdlcy5iZWdpbigpOworICAgICAgYXV0byBFbmQgPSBSYW5nZXMuZW5kKCk7CisgICAgICBhdXRvIEl0ZXIgPSBzdGQ6OnVwcGVyX2JvdW5kKEJlZ2luLCBFbmQsIFIpOworICAgICAgaWYgKEl0ZXIgIT0gQmVnaW4pCisgICAgICAgIC0tSXRlcjsKKyAgICAgIHJldHVybiBJdGVyOworICAgIH0KKworICAgIC8vLyBJbnNlcnRzIHRoZSBhZGRyZXNzIHJhbmdlIGluZm8uIElmIGFueSBvZiBpdHMgcmFuZ2VzIG92ZXJsYXBzIHdpdGggYQorICAgIC8vLyByYW5nZSBpbiBhbiBleGlzdGluZyByYW5nZSBpbmZvLCB0aGUgcmFuZ2UgaW5mbyBpcyAqbm90KiBhZGRlZCBhbmQgYW4KKyAgICAvLy8gaXRlcmF0b3IgdG8gdGhlIG92ZXJsYXBwaW5nIHJhbmdlIGluZm8uCisgICAgLy8vCisgICAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgZmluZGluZyBvdmVybGFwcGluZyBjaGlsZHJlbiBvZiB0aGUgc2FtZSBESUUuCisgICAgZGllX3JhbmdlX2luZm9faXRlcmF0b3IgaW5zZXJ0KGNvbnN0IERpZVJhbmdlSW5mbyAmUkkpOworCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHJhbmdlcyBpbiB0aGlzIG9iamVjdCBjb250YWlucyBhbGwgcmFuZ2VzIHdpdGhpbiBSSFMuCisgICAgYm9vbCBjb250YWlucyhjb25zdCBEaWVSYW5nZUluZm8gJlJIUykgY29uc3Q7CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgYW55IHJhbmdlIGluIHRoaXMgb2JqZWN0IGludGVyc2VjdHMgd2l0aCBhbnkgcmFuZ2UgaW4KKyAgICAvLy8gUkhTLgorICAgIGJvb2wgaW50ZXJzZWN0cyhjb25zdCBEaWVSYW5nZUluZm8gJlJIUykgY29uc3Q7CisgIH07CisKK3ByaXZhdGU6CisgIHJhd19vc3RyZWFtICZPUzsKKyAgRFdBUkZDb250ZXh0ICZEQ3R4OworICBESUR1bXBPcHRpb25zIER1bXBPcHRzOworICAvLy8gQSBtYXAgdGhhdCB0cmFja3MgYWxsIHJlZmVyZW5jZXMgKGNvbnZlcnRlZCBhYnNvbHV0ZSByZWZlcmVuY2VzKSBzbyB3ZQorICAvLy8gY2FuIHZlcmlmeSBlYWNoIHJlZmVyZW5jZSBwb2ludHMgdG8gYSB2YWxpZCBESUUgYW5kIG5vdCBhbiBvZmZzZXQgdGhhdAorICAvLy8gbGllcyBiZXR3ZWVuIHRvIHZhbGlkIERJRXMuCisgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNldDx1aW50MzJfdD4+IFJlZmVyZW5jZVRvRElFT2Zmc2V0czsKKyAgdWludDMyX3QgTnVtRGVidWdMaW5lRXJyb3JzID0gMDsKKworICByYXdfb3N0cmVhbSAmZXJyb3IoKSBjb25zdDsKKyAgcmF3X29zdHJlYW0gJndhcm4oKSBjb25zdDsKKyAgcmF3X29zdHJlYW0gJm5vdGUoKSBjb25zdDsKKworICAvLy8gVmVyaWZpZXMgdGhlIGFiYnJldmlhdGlvbnMgc2VjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGN1cnJlbnRseSBjaGVja3MgdGhhdDoKKyAgLy8vIC0tTm8gYWJicmV2aWF0aW9uIGRlY2xhcmF0aW9uIGhhcyBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZXMgd2l0aCB0aGUgc2FtZQorICAvLy8gbmFtZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQWJicmV2IFBvaW50ZXIgdG8gdGhlIGFiYnJldmlhdGlvbnMgc2VjdGlvbiB3ZSBhcmUgdmVyaWZ5aW5nCisgIC8vLyBBYmJyZXYgY2FuIGJlIGEgcG9pbnRlciB0byBlaXRoZXIgLmRlYnVnX2FiYnJldiBvciBkZWJ1Z19hYmJyZXYuZHdvLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSBudW1iZXIgb2YgZXJyb3JzIHRoYXQgb2NjdXJyZWQgZHVyaW5nIHZlcmlmaWNhdGlvbi4KKyAgdW5zaWduZWQgdmVyaWZ5QWJicmV2U2VjdGlvbihjb25zdCBEV0FSRkRlYnVnQWJicmV2ICpBYmJyZXYpOworCisgIC8vLyBWZXJpZmllcyB0aGUgaGVhZGVyIG9mIGEgdW5pdCBpbiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGN1cnJlbnRseSBjaGVja3MgZm9yOgorICAvLy8gLSBVbml0IGlzIGluIDMyLWJpdCBEV0FSRiBmb3JtYXQuIFRoZSBmdW5jdGlvbiBjYW4gYmUgbW9kaWZpZWQgdG8KKyAgLy8vIHN1cHBvcnQgNjQtYml0IGZvcm1hdC4KKyAgLy8vIC0gVGhlIERXQVJGIHZlcnNpb24gaXMgdmFsaWQKKyAgLy8vIC0gVGhlIHVuaXQgdHlwZSBpcyB2YWxpZCAoaWYgdW5pdCBpcyBpbiB2ZXJzaW9uID49NSkKKyAgLy8vIC0gVGhlIHVuaXQgZG9lc24ndCBleHRlbmQgYmV5b25kIC5kZWJ1Z19pbmZvIHNlY3Rpb24KKyAgLy8vIC0gVGhlIGFkZHJlc3Mgc2l6ZSBpcyB2YWxpZAorICAvLy8gLSBUaGUgb2Zmc2V0IGluIHRoZSAuZGVidWdfYWJicmV2IHNlY3Rpb24gaXMgdmFsaWQKKyAgLy8vCisgIC8vLyBccGFyYW0gRGVidWdJbmZvRGF0YSBUaGUgLmRlYnVnX2luZm8gc2VjdGlvbiBkYXRhCisgIC8vLyBccGFyYW0gT2Zmc2V0IEEgcmVmZXJlbmNlIHRvIHRoZSBvZmZzZXQgc3RhcnQgb2YgdGhlIHVuaXQuIFRoZSBvZmZzZXQgd2lsbAorICAvLy8gYmUgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgbmV4dCB1bml0IGluIC5kZWJ1Z19pbmZvCisgIC8vLyBccGFyYW0gVW5pdEluZGV4IFRoZSBpbmRleCBvZiB0aGUgdW5pdCB0byBiZSB2ZXJpZmllZAorICAvLy8gXHBhcmFtIFVuaXRUeXBlIEEgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIG9mIHRoZSB1bml0CisgIC8vLyBccGFyYW0gaXNVbml0RFdBUkY2NCBBIHJlZmVyZW5jZSB0byBhIGZsYWcgdGhhdCBzaG93cyB3aGV0aGVyIHRoZSB1bml0IGlzCisgIC8vLyBpbiA2NC1iaXQgZm9ybWF0LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlIGhlYWRlciBpcyB2ZXJpZmllZCBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCB2ZXJpZnlVbml0SGVhZGVyKGNvbnN0IERXQVJGRGF0YUV4dHJhY3RvciBEZWJ1Z0luZm9EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKk9mZnNldCwgdW5zaWduZWQgVW5pdEluZGV4LCB1aW50OF90ICZVbml0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJmlzVW5pdERXQVJGNjQpOworCisgIC8vLyBWZXJpZmllcyB0aGUgaGVhZGVyIG9mIGEgdW5pdCBpbiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGN1cnJlbnRseSB2ZXJpZmllczoKKyAgLy8vICAtIFRoZSBkZWJ1ZyBpbmZvIGF0dHJpYnV0ZXMuCisgIC8vLyAgLSBUaGUgZGVidWcgaW5mbyBmb3JtPXMuCisgIC8vLyAgLSBUaGUgcHJlc2VuY2Ugb2YgYSByb290IERJRS4KKyAgLy8vICAtIFRoYXQgdGhlIHJvb3QgRElFIGlzIGEgdW5pdCBESUUuCisgIC8vLyAgLSBJZiBhIHVuaXQgdHlwZSBpcyBwcm92aWRlZCwgdGhhdCB0aGUgdW5pdCBESUUgbWF0Y2hlcyB0aGUgdW5pdCB0eXBlLgorICAvLy8gIC0gVGhlIERJRSByYW5nZXMuCisgIC8vLworICAvLy8gXHBhcmFtIFVuaXQgICAgICBUaGUgRFdBUkYgVW5pdCB0byB2ZXJpZml5LgorICAvLy8gXHBhcmFtIFVuaXRUeXBlICBBbiBvcHRpb25hbCB1bml0IHR5cGUgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHZlcmlmeSB0aGUKKyAgLy8vICAgICAgICAgICAgICAgICAgdHlwZSBvZiB0aGUgdW5pdCBESUUuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGVudCBpcyB2ZXJpZmllZCBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCB2ZXJpZnlVbml0Q29udGVudHMoRFdBUkZVbml0IFVuaXQsIHVpbnQ4X3QgVW5pdFR5cGUgPSAwKTsKKworICAvLy8gVmVyaWZ5IHRoYXQgYWxsIERpZSByYW5nZXMgYXJlIHZhbGlkLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gY3VycmVudGx5IGNoZWNrcyBmb3I6CisgIC8vLyAtIGNhc2VzIGluIHdoaWNoIGxvd1BDID49IGhpZ2hQQworICAvLy8KKyAgLy8vIFxyZXR1cm5zIE51bWJlciBvZiBlcnJvcnMgdGhhdCBvY2N1cnJlZCBkdXJpbmcgdmVyaWZpY2F0aW9uLgorICB1bnNpZ25lZCB2ZXJpZnlEaWVSYW5nZXMoY29uc3QgRFdBUkZEaWUgJkRpZSwgRGllUmFuZ2VJbmZvICZQYXJlbnRSSSk7CisKKyAgLy8vIFZlcmlmaWVzIHRoZSBhdHRyaWJ1dGUncyBEV0FSRiBhdHRyaWJ1dGUgYW5kIGl0cyB2YWx1ZS4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGN1cnJlbnRseSBjaGVja3MgZm9yOgorICAvLy8gLSBEV19BVF9yYW5nZXMgdmFsdWVzIGlzIGEgdmFsaWQgLmRlYnVnX3JhbmdlcyBvZmZzZXQKKyAgLy8vIC0gRFdfQVRfc3RtdF9saXN0IGlzIGEgdmFsaWQgLmRlYnVnX2xpbmUgb2Zmc2V0CisgIC8vLworICAvLy8gXHBhcmFtIERpZSAgICAgICAgICBUaGUgRFdBUkYgRElFIHRoYXQgb3ducyB0aGUgYXR0cmlidXRlIHZhbHVlCisgIC8vLyBccGFyYW0gQXR0clZhbHVlICAgIFRoZSBEV0FSRiBhdHRyaWJ1dGUgdmFsdWUgdG8gY2hlY2sKKyAgLy8vCisgIC8vLyBccmV0dXJucyBOdW1FcnJvcnMgVGhlIG51bWJlciBvZiBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIHZlcmlmaWNhdGlvbiBvZgorICAvLy8gYXR0cmlidXRlcycgdmFsdWVzIGluIGEgLmRlYnVnX2luZm8gc2VjdGlvbiB1bml0CisgIHVuc2lnbmVkIHZlcmlmeURlYnVnSW5mb0F0dHJpYnV0ZShjb25zdCBEV0FSRkRpZSAmRGllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdBUkZBdHRyaWJ1dGUgJkF0dHJWYWx1ZSk7CisKKyAgLy8vIFZlcmlmaWVzIHRoZSBhdHRyaWJ1dGUncyBEV0FSRiBmb3JtLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gY3VycmVudGx5IGNoZWNrcyBmb3I6CisgIC8vLyAtIEFsbCBEV19GT1JNX3JlZiB2YWx1ZXMgdGhhdCBhcmUgQ1UgcmVsYXRpdmUgaGF2ZSB2YWxpZCBDVSBvZmZzZXRzCisgIC8vLyAtIEFsbCBEV19GT1JNX3JlZl9hZGRyIHZhbHVlcyBoYXZlIHZhbGlkIC5kZWJ1Z19pbmZvIG9mZnNldHMKKyAgLy8vIC0gQWxsIERXX0ZPUk1fc3RycCB2YWx1ZXMgaGF2ZSB2YWxpZCAuZGVidWdfc3RyIG9mZnNldHMKKyAgLy8vCisgIC8vLyBccGFyYW0gRGllICAgICAgICAgIFRoZSBEV0FSRiBESUUgdGhhdCBvd25zIHRoZSBhdHRyaWJ1dGUgdmFsdWUKKyAgLy8vIFxwYXJhbSBBdHRyVmFsdWUgICAgVGhlIERXQVJGIGF0dHJpYnV0ZSB2YWx1ZSB0byBjaGVjaworICAvLy8KKyAgLy8vIFxyZXR1cm5zIE51bUVycm9ycyBUaGUgbnVtYmVyIG9mIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgdmVyaWZpY2F0aW9uIG9mCisgIC8vLyBhdHRyaWJ1dGVzJyBmb3JtcyBpbiBhIC5kZWJ1Z19pbmZvIHNlY3Rpb24gdW5pdAorICB1bnNpZ25lZCB2ZXJpZnlEZWJ1Z0luZm9Gb3JtKGNvbnN0IERXQVJGRGllICZEaWUsIERXQVJGQXR0cmlidXRlICZBdHRyVmFsdWUpOworCisgIC8vLyBWZXJpZmllcyB0aGUgYWxsIHZhbGlkIHJlZmVyZW5jZXMgdGhhdCB3ZXJlIGZvdW5kIHdoZW4gaXRlcmF0aW5nIHRocm91Z2gKKyAgLy8vIGFsbCBvZiB0aGUgRElFIGF0dHJpYnV0ZXMuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHZlcmlmeSB0aGF0IGFsbCByZWZlcmVuY2VzIHBvaW50IHRvIERJRXMgd2hvc2UgRElFCisgIC8vLyBvZmZzZXQgbWF0Y2hlcy4gVGhpcyBoZWxwcyB0byBlbnN1cmUgaWYgYSBEV0FSRiBsaW5rIHBoYXNlIG1vdmVkIHRoaW5ncworICAvLy8gYXJvdW5kLCB0aGF0IGl0IGRvZXNuJ3QgY3JlYXRlIGludmFsaWQgcmVmZXJlbmNlcyBieSBmYWlsaW5nIHRvIHJlbG9jYXRlCisgIC8vLyBDVSByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgcmVmZXJlbmNlcy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBOdW1FcnJvcnMgVGhlIG51bWJlciBvZiBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIHZlcmlmaWNhdGlvbiBvZgorICAvLy8gcmVmZXJlbmNlcyBmb3IgdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24KKyAgdW5zaWduZWQgdmVyaWZ5RGVidWdJbmZvUmVmZXJlbmNlcygpOworCisgIC8vLyBWZXJpZnkgdGhlIERXX0FUX3N0bXRfbGlzdCBlbmNvZGluZyBhbmQgdmFsdWUgYW5kIGVuc3VyZSB0aGF0IG5vCisgIC8vLyBjb21waWxlIHVuaXRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBEV19BVF9zdG10X2xpc3QgdmFsdWUuCisgIHZvaWQgdmVyaWZ5RGVidWdMaW5lU3RtdE9mZnNldHMoKTsKKworICAvLy8gVmVyaWZ5IHRoYXQgYWxsIG9mIHRoZSByb3dzIGluIHRoZSBsaW5lIHRhYmxlIGFyZSB2YWxpZC4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGN1cnJlbnRseSBjaGVja3MgZm9yOgorICAvLy8gLSBhZGRyZXNzZXMgd2l0aGluIGEgc2VxdWVuY2UgdGhhdCBkZWNyZWFzZSBpbiB2YWx1ZQorICAvLy8gLSBpbnZhbGlkIGZpbGUgaW5kZXhlcworICB2b2lkIHZlcmlmeURlYnVnTGluZVJvd3MoKTsKKworICAvLy8gVmVyaWZ5IHRoYXQgYW4gQXBwbGUtc3R5bGUgYWNjZWxlcmF0b3IgdGFibGUgaXMgdmFsaWQuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBjdXJyZW50bHkgY2hlY2tzIHRoYXQ6CisgIC8vLyAtIFRoZSBmaXhlZCBwYXJ0IG9mIHRoZSBoZWFkZXIgZml0cyBpbiB0aGUgc2VjdGlvbgorICAvLy8gLSBUaGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBpcyBhcyBsYXJnZSBhcyB3aGF0IHRoZSBoZWFkZXIgZGVzY3JpYmVzCisgIC8vLyAtIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBhdG9tCisgIC8vLyAtIFRoZSBmb3JtIGZvciBlYWNoIGF0b20gaXMgdmFsaWQKKyAgLy8vIC0gVGhlIHRhZyBmb3IgZWFjaCBESUUgaW4gdGhlIHRhYmxlIGlzIHZhbGlkCisgIC8vLyAtIFRoZSBidWNrZXRzIGhhdmUgYSB2YWxpZCBpbmRleCwgb3IgdGhleSBhcmUgZW1wdHkKKyAgLy8vIC0gRWFjaCBoYXNoZGF0YSBvZmZzZXQgaXMgdmFsaWQKKyAgLy8vIC0gRWFjaCBESUUgaXMgdmFsaWQKKyAgLy8vCisgIC8vLyBccGFyYW0gQWNjZWxTZWN0aW9uIHBvaW50ZXIgdG8gdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgYWNjZWxlcmF0aW9uIHRhYmxlCisgIC8vLyBccGFyYW0gU3RyRGF0YSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgc2VjdGlvbgorICAvLy8gXHBhcmFtIFNlY3Rpb25OYW1lIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3ZSdyZSB2ZXJpZnlpbmcKKyAgLy8vCisgIC8vLyBccmV0dXJucyBUaGUgbnVtYmVyIG9mIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgdmVyaWZpY2F0aW9uCisgIHVuc2lnbmVkIHZlcmlmeUFwcGxlQWNjZWxUYWJsZShjb25zdCBEV0FSRlNlY3Rpb24gKkFjY2VsU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFFeHRyYWN0b3IgKlN0ckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpTZWN0aW9uTmFtZSk7CisKKyAgdW5zaWduZWQgdmVyaWZ5RGVidWdOYW1lc0NVTGlzdHMoY29uc3QgRFdBUkZEZWJ1Z05hbWVzICZBY2NlbFRhYmxlKTsKKyAgdW5zaWduZWQgdmVyaWZ5TmFtZUluZGV4QnVja2V0cyhjb25zdCBEV0FSRkRlYnVnTmFtZXM6Ok5hbWVJbmRleCAmTkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUV4dHJhY3RvciAmU3RyRGF0YSk7CisgIHVuc2lnbmVkIHZlcmlmeU5hbWVJbmRleEFiYnJldnMoY29uc3QgRFdBUkZEZWJ1Z05hbWVzOjpOYW1lSW5kZXggJk5JKTsKKyAgdW5zaWduZWQgdmVyaWZ5TmFtZUluZGV4QXR0cmlidXRlKGNvbnN0IERXQVJGRGVidWdOYW1lczo6TmFtZUluZGV4ICZOSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGRGVidWdOYW1lczo6QWJicmV2ICZBYmJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdBUkZEZWJ1Z05hbWVzOjpBdHRyaWJ1dGVFbmNvZGluZyBBdHRyRW5jKTsKKworICAvLy8gVmVyaWZ5IHRoYXQgdGhlIERXQVJGIHY1IGFjY2VsZXJhdG9yIHRhYmxlIGlzIHZhbGlkLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gY3VycmVudGx5IGNoZWNrcyB0aGF0OgorICAvLy8gLSBIZWFkZXJzIGluZGl2aWR1YWwgTmFtZSBJbmRpY2VzIGZpdCBpbnRvIHRoZSBzZWN0aW9uIGFuZCBjYW4gYmUgcGFyc2VkLgorICAvLy8gLSBBYmJyZXZpYXRpb24gdGFibGVzIGNhbiBiZSBwYXJzZWQgYW5kIGNvbnRhaW4gdmFsaWQgaW5kZXggYXR0cmlidXRlcworICAvLy8gICB3aXRoIGNvcnJlY3QgZm9ybSBlbmNvZGluZ3MuCisgIC8vLyAtIFRoZSBDVSBsaXN0cyByZWZlcmVuY2UgZXhpc3RpbmcgY29tcGlsZSB1bml0cy4KKyAgLy8vIC0gVGhlIGJ1Y2tldHMgaGF2ZSBhIHZhbGlkIGluZGV4LCBvciB0aGV5IGFyZSBlbXB0eS4KKyAgLy8vIC0gQWxsIG5hbWVzIGFyZSByZWFjaGFibGUgdmlhIHRoZSBoYXNoIHRhYmxlICh0aGV5IGhhdmUgdGhlIGNvcnJlY3QgaGFzaCwKKyAgLy8vICAgYW5kIHRoZSBoYXNoIGlzIGluIHRoZSBjb3JyZWN0IGJ1Y2tldCkuCisgIC8vLworICAvLy8gXHBhcmFtIEFjY2VsU2VjdGlvbiBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGFjY2VsZXJhdGlvbiB0YWJsZQorICAvLy8gXHBhcmFtIFN0ckRhdGEgc3RyaW5nIHNlY3Rpb24KKyAgLy8vCisgIC8vLyBccmV0dXJucyBUaGUgbnVtYmVyIG9mIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgdmVyaWZpY2F0aW9uCisgIHVuc2lnbmVkIHZlcmlmeURlYnVnTmFtZXMoY29uc3QgRFdBUkZTZWN0aW9uICZBY2NlbFNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUV4dHJhY3RvciAmU3RyRGF0YSk7CisKK3B1YmxpYzoKKyAgRFdBUkZWZXJpZmllcihyYXdfb3N0cmVhbSAmUywgRFdBUkZDb250ZXh0ICZELAorICAgICAgICAgICAgICAgIERJRHVtcE9wdGlvbnMgRHVtcE9wdHMgPSBESUR1bXBPcHRpb25zOjpnZXRGb3JTaW5nbGVESUUoKSkKKyAgICAgIDogT1MoUyksIERDdHgoRCksIER1bXBPcHRzKHN0ZDo6bW92ZShEdW1wT3B0cykpIHt9CisgIC8vLyBWZXJpZnkgdGhlIGluZm9ybWF0aW9uIGluIGFueSBvZiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLCBpZiBhdmFpbGFibGU6CisgIC8vLyAuZGVidWdfYWJicmV2LCBkZWJ1Z19hYmJyZXYuZHdvCisgIC8vLworICAvLy8gQW55IGVycm9ycyBhcmUgcmVwb3J0ZWQgdG8gdGhlIHN0cmVhbSB0aGF0IHdhcyB0aGlzIG9iamVjdCB3YXMKKyAgLy8vIGNvbnN0cnVjdGVkIHdpdGguCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiAuZGVidWdfYWJicmV2IGFuZCAuZGVidWdfYWJicmV2LmR3byB2ZXJpZnkgc3VjY2Vzc2Z1bGx5LAorICAvLy8gZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGhhbmRsZURlYnVnQWJicmV2KCk7CisKKyAgLy8vIFZlcmlmeSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24uCisgIC8vLworICAvLy8gQW55IGVycm9ycyBhcmUgcmVwb3J0ZWQgdG8gdGhlIHN0cmVhbSB0aGF0IHdhcyB0aGlzIG9iamVjdCB3YXMKKyAgLy8vIGNvbnN0cnVjdGVkIHdpdGguCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGUgLmRlYnVnX2luZm8gdmVyaWZpZXMgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgaGFuZGxlRGVidWdJbmZvKCk7CisKKyAgLy8vIFZlcmlmeSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIC5kZWJ1Z19saW5lIHNlY3Rpb24uCisgIC8vLworICAvLy8gQW55IGVycm9ycyBhcmUgcmVwb3J0ZWQgdG8gdGhlIHN0cmVhbSB0aGF0IHdhcyB0aGlzIG9iamVjdCB3YXMKKyAgLy8vIGNvbnN0cnVjdGVkIHdpdGguCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGUgLmRlYnVnX2xpbmUgdmVyaWZpZXMgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgaGFuZGxlRGVidWdMaW5lKCk7CisKKyAgLy8vIFZlcmlmeSB0aGUgaW5mb3JtYXRpb24gaW4gYWNjZWxlcmF0b3IgdGFibGVzLCBpZiB0aGV5IGV4aXN0LgorICAvLy8KKyAgLy8vIEFueSBlcnJvcnMgYXJlIHJlcG9ydGVkIHRvIHRoZSBzdHJlYW0gdGhhdCB3YXMgdGhpcyBvYmplY3Qgd2FzCisgIC8vLyBjb25zdHJ1Y3RlZCB3aXRoLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlIGV4aXN0aW5nIEFwcGxlLXN0eWxlIGFjY2VsZXJhdG9yIHRhYmxlcyB2ZXJpZnkKKyAgLy8vIHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGhhbmRsZUFjY2VsVGFibGVzKCk7Cit9OworCitzdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IERXQVJGVmVyaWZpZXI6OkRpZVJhbmdlSW5mbyAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEV0FSRlZlcmlmaWVyOjpEaWVSYW5nZUluZm8gJlJIUykgeworICByZXR1cm4gc3RkOjp0aWUoTEhTLlJhbmdlcywgTEhTLkRpZSkgPCBzdGQ6OnRpZShSSFMuUmFuZ2VzLCBSSFMuRGllKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGQ09OVEVYVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9NU0YvSU1TRkZpbGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL01TRi9JTVNGRmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OGU3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9NU0YvSU1TRkZpbGUuaApAQCAtMCwwICsxLDQyIEBACisvLz09PS0gSU1TRkZpbGUuaCAtIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFuIE1TRiBmaWxlIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX01TRl9JTVNGRklMRV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX01TRl9JTVNGRklMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgbXNmIHsKKworY2xhc3MgSU1TRkZpbGUgeworcHVibGljOgorICB2aXJ0dWFsIH5JTVNGRmlsZSgpID0gZGVmYXVsdDsKKworICB2aXJ0dWFsIHVpbnQzMl90IGdldEJsb2NrU2l6ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRCbG9ja0NvdW50KCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgZ2V0TnVtU3RyZWFtcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJlYW1CeXRlU2l6ZSh1aW50MzJfdCBTdHJlYW1JbmRleCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEFycmF5UmVmPHN1cHBvcnQ6OnVsaXR0bGUzMl90PgorICBnZXRTdHJlYW1CbG9ja0xpc3QodWludDMyX3QgU3RyZWFtSW5kZXgpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIEV4cGVjdGVkPEFycmF5UmVmPHVpbnQ4X3Q+PiBnZXRCbG9ja0RhdGEodWludDMyX3QgQmxvY2tJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE51bUJ5dGVzKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgRXJyb3Igc2V0QmxvY2tEYXRhKHVpbnQzMl90IEJsb2NrSW5kZXgsIHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gRGF0YSkgY29uc3QgPSAwOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG1zZgorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX01TRl9JTVNGRklMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9NU0YvTVNGQnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vTVNGL01TRkJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWU1YzMxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vTVNGL01TRkJ1aWxkZXIuaApAQCAtMCwwICsxLDE0MCBAQAorLy89PT0tIE1TRkJ1aWxkZXIuaCAtIE1TRiBEaXJlY3RvcnkgJiBNZXRhZGF0YSBCdWlsZGVyIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19NU0ZfTVNGQlVJTERFUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX01TRl9NU0ZCVUlMREVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vTVNGL01TRkNvbW1vbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgbXNmIHsKKworY2xhc3MgTVNGQnVpbGRlciB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbmV3IGBNU0ZCdWlsZGVyYC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQmxvY2tTaXplIFRoZSBpbnRlcm5hbCBibG9jayBzaXplIHVzZWQgYnkgdGhlIFBEQiBmaWxlLiAgU2VlCisgIC8vLyBpc1ZhbGlkQmxvY2tTaXplKCkgZm9yIGEgbGlzdCBvZiB2YWxpZCBibG9jayBzaXplcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gTWluQmxvY2tDb3VudCBDYXVzZXMgdGhlIGJ1aWxkZXIgdG8gcmVzZXJ2ZSB1cCBmcm9udCBzcGFjZSBmb3IKKyAgLy8vIGF0IGxlYXN0IGBNaW5CbG9ja0NvdW50YCBibG9ja3MuICBUaGlzIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIGBNU0ZCdWlsZGVyYAorICAvLy8gdG8gcmVhZCBhbiBleGlzdGluZyBNU0YgdGhhdCB5b3Ugd2FudCB0byB3cml0ZSBiYWNrIG91dCBsYXRlci4gIFRoZQorICAvLy8gb3JpZ2luYWwgTVNGIGZpbGUncyBTdXBlckJsb2NrIGNvbnRhaW5zIHRoZSBleGFjdCBudW1iZXIgb2YgYmxvY2tzIHVzZWQKKyAgLy8vIGJ5IHRoZSBmaWxlLCBzbyBpcyBhIGdvb2QgaGludCBhcyB0byBob3cgbWFueSBibG9ja3MgdGhlIG5ldyBNU0YgZmlsZQorICAvLy8gd2lsbCBjb250YWluLiAgRnVydGhlcm1vcmUsIGl0IGlzIGFjdHVhbGx5IG5lY2Vzc2FyeSBpbiB0aGlzIGNhc2UuICBUbworICAvLy8gcHJlc2VydmUgc3RhYmlsaXR5IG9mIHRoZSBmaWxlJ3MgbGF5b3V0LCBpdCBpcyBoZWxwZnVsIHRvIHRyeSB0byBrZWVwCisgIC8vLyBhbGwgc3RyZWFtcyBtYXBwZWQgdG8gdGhlaXIgb3JpZ2luYWwgYmxvY2sgbnVtYmVycy4gIFRvIGVuc3VyZSB0aGF0IHRoaXMKKyAgLy8vIGlzIHBvc3NpYmxlLCBzcGFjZSBmb3IgYWxsIGJsb2NrcyBtdXN0IGJlIGFsbG9jYXRlZCBiZWZvcmVoYW5kIHNvIHRoYXQKKyAgLy8vIHN0cmVhbXMgY2FuIGJlIGFzc2lnbmVkIHRvIHRoZW0uCisgIC8vLworICAvLy8gXHBhcmFtIENhbkdyb3cgSWYgdHJ1ZSwgYW55IG9wZXJhdGlvbiB3aGljaCByZXN1bHRzIGluIGFuIGF0dGVtcHQgdG8KKyAgLy8vIGxvY2F0ZSBhIGZyZWUgYmxvY2sgd2hlbiBhbGwgYXZhaWxhYmxlIGJsb2NrcyBoYXZlIGJlZW4gZXhoYXVzdGVkIHdpbGwKKyAgLy8vIGFsbG9jYXRlIGEgbmV3IGJsb2NrLCB0aGVyZWJ5IGdyb3dpbmcgdGhlIHNpemUgb2YgdGhlIGZpbmFsIE1TRiBmaWxlLgorICAvLy8gV2hlbiBmYWxzZSwgYW55IHN1Y2ggYXR0ZW1wdCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgaXMgZXNwZWNpYWxseQorICAvLy8gdXNlZnVsIGluIHRlc3Rpbmcgc2NlbmFyaW9zIHdoZW4geW91IGtub3cgeW91ciB0ZXN0IGlzbid0IGdvaW5nIHRvIGRvCisgIC8vLyBhbnl0aGluZyB0byBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZSwgc28gaGF2aW5nIGFuIEVycm9yIHJldHVybmVkIGlmCisgIC8vLyBpdCB3ZXJlIHRvIGhhcHBlbiB3b3VsZCBjYXRjaCBhIHByb2dyYW1taW5nIGVycm9yCisgIC8vLworICAvLy8gXHJldHVybnMgYW4gbGx2bTo6RXJyb3IgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IKKyAgLy8vIGZhaWxlZC4gIEN1cnJlbnRseSB0aGUgb25seSB3YXkgdGhpcyBjYW4gZmFpbCBpcyBpZiBhbiBpbnZhbGlkIGJsb2NrIHNpemUKKyAgLy8vIGlzIHNwZWNpZmllZCwgb3IgYE1pbkJsb2NrQ291bnRgIGRvZXMgbm90IGxlYXZlIGVub3VnaCByb29tIGZvciB0aGUKKyAgLy8vIG1hbmRhdG9yeSByZXNlcnZlZCBibG9ja3MgcmVxdWlyZWQgYnkgYW4gTVNGIGZpbGUuCisgIHN0YXRpYyBFeHBlY3RlZDxNU0ZCdWlsZGVyPiBjcmVhdGUoQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBNaW5CbG9ja0NvdW50ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENhbkdyb3cgPSB0cnVlKTsKKworICAvLy8gUmVxdWVzdCB0aGUgYmxvY2sgbWFwIHRvIGJlIGF0IGEgc3BlY2lmaWMgYmxvY2sgYWRkcmVzcy4gIFRoaXMgaXMgdXNlZnVsCisgIC8vLyB3aGVuIGVkaXRpbmcgYSBNU0YgYW5kIHlvdSB3YW50IHRoZSBsYXlvdXQgdG8gYmUgYXMgc3RhYmxlIGFzIHBvc3NpYmxlLgorICBFcnJvciBzZXRCbG9ja01hcEFkZHIodWludDMyX3QgQWRkcik7CisgIEVycm9yIHNldERpcmVjdG9yeUJsb2Nrc0hpbnQoQXJyYXlSZWY8dWludDMyX3Q+IERpckJsb2Nrcyk7CisgIHZvaWQgc2V0RnJlZVBhZ2VNYXAodWludDMyX3QgRnBtKTsKKyAgdm9pZCBzZXRVbmtub3duMSh1aW50MzJfdCBVbmsxKTsKKworICAvLy8gQWRkIGEgc3RyZWFtIHRvIHRoZSBNU0YgZmlsZSB3aXRoIHRoZSBnaXZlbiBzaXplLCBvY2N1cHlpbmcgdGhlIGdpdmVuCisgIC8vLyBsaXN0IG9mIGJsb2Nrcy4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gcmVhZGluZyBhIE1TRiBmaWxlIGFuZCB5b3Ugd2FudCBhCisgIC8vLyBwYXJ0aWN1bGFyIHN0cmVhbSB0byBvY2N1cHkgdGhlIG9yaWdpbmFsIHNldCBvZiBibG9ja3MuICBJZiB0aGUgZ2l2ZW4KKyAgLy8vIGJsb2NrcyBhcmUgYWxyZWFkeSBhbGxvY2F0ZWQsIG9yIGlmIHRoZSBudW1iZXIgb2YgYmxvY2tzIHNwZWNpZmllZCBpcworICAvLy8gaW5jb3JyZWN0IGZvciB0aGUgZ2l2ZW4gc3RyZWFtIHNpemUsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4gRXJyb3IuCisgIEV4cGVjdGVkPHVpbnQzMl90PiBhZGRTdHJlYW0odWludDMyX3QgU2l6ZSwgQXJyYXlSZWY8dWludDMyX3Q+IEJsb2Nrcyk7CisKKyAgLy8vIEFkZCBhIHN0cmVhbSB0byB0aGUgTVNGIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gc2l6ZSwgb2NjdXB5aW5nIGFueSBhdmFpbGFibGUKKyAgLy8vIGJsb2NrcyB0aGF0IHRoZSBidWlsZGVyIGRlY2lkZXMgdG8gdXNlLiAgVGhpcyBpcyB1c2VmdWwgd2hlbiBidWlsZGluZyBhCisgIC8vLyBuZXcgUERCIGZpbGUgZnJvbSBzY3JhdGNoIGFuZCB5b3UgZG9uJ3QgY2FyZSB3aGF0IGJsb2NrcyBhIHN0cmVhbSBvY2N1cGllcworICAvLy8gYnV0IHlvdSBqdXN0IHdhbnQgaXQgdG8gd29yay4KKyAgRXhwZWN0ZWQ8dWludDMyX3Q+IGFkZFN0cmVhbSh1aW50MzJfdCBTaXplKTsKKworICAvLy8gVXBkYXRlIHRoZSBzaXplIG9mIGFuIGV4aXN0aW5nIHN0cmVhbS4gIFRoaXMgd2lsbCBhbGxvY2F0ZSBvciBkZWFsbG9jYXRlCisgIC8vLyBibG9ja3MgYXMgbmVlZGVkIHRvIG1hdGNoIHRoZSByZXF1ZXN0ZWQgc2l6ZS4gIFRoaXMgY2FuIGZhaWwgaWYgYENhbkdyb3dgCisgIC8vLyB3YXMgc2V0IHRvIGZhbHNlIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBgTVNGQnVpbGRlcmAuCisgIEVycm9yIHNldFN0cmVhbVNpemUodWludDMyX3QgSWR4LCB1aW50MzJfdCBTaXplKTsKKworICAvLy8gR2V0IHRoZSB0b3RhbCBudW1iZXIgb2Ygc3RyZWFtcyBpbiB0aGUgTVNGIGxheW91dC4gIFRoaXMgc2hvdWxkIHJldHVybiAxCisgIC8vLyBmb3IgZXZlcnkgY2FsbCB0byBgYWRkU3RyZWFtYC4KKyAgdWludDMyX3QgZ2V0TnVtU3RyZWFtcygpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIHNpemUgb2YgYSBzdHJlYW0gYnkgaW5kZXguCisgIHVpbnQzMl90IGdldFN0cmVhbVNpemUodWludDMyX3QgU3RyZWFtSWR4KSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBsaXN0IG9mIGJsb2NrcyBhbGxvY2F0ZWQgdG8gYSBwYXJ0aWN1bGFyIHN0cmVhbS4KKyAgQXJyYXlSZWY8dWludDMyX3Q+IGdldFN0cmVhbUJsb2Nrcyh1aW50MzJfdCBTdHJlYW1JZHgpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBibG9ja3MgdGhhdCB3aWxsIGJlIGFsbG9jYXRlZCB0byBhY3R1YWwgZGF0YSBpbgorICAvLy8gdGhpcyBNU0YgZmlsZS4KKyAgdWludDMyX3QgZ2V0TnVtVXNlZEJsb2NrcygpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBibG9ja3MgdGhhdCBleGlzdCBpbiB0aGUgTVNGIGZpbGUgYnV0IGFyZSBub3QKKyAgLy8vIGFsbG9jYXRlZCB0byBhbnkgdmFsaWQgZGF0YS4KKyAgdWludDMyX3QgZ2V0TnVtRnJlZUJsb2NrcygpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBibG9ja3MgaW4gdGhlIE1TRiBmaWxlLiAgSW4gcHJhY3RpY2UgdGhpcyBpcyBlcXVhbAorICAvLy8gdG8gYGdldE51bVVzZWRCbG9ja3MoKSArIGdldE51bUZyZWVCbG9ja3MoKWAuCisgIHVpbnQzMl90IGdldFRvdGFsQmxvY2tDb3VudCgpIGNvbnN0OworCisgIC8vLyBDaGVjayB3aGV0aGVyIGEgcGFydGljdWxhciBibG9jayBpcyBhbGxvY2F0ZWQgb3IgZnJlZS4KKyAgYm9vbCBpc0Jsb2NrRnJlZSh1aW50MzJfdCBJZHgpIGNvbnN0OworCisgIC8vLyBGaW5hbGl6ZSB0aGUgbGF5b3V0IGFuZCBidWlsZCB0aGUgaGVhZGVycyBhbmQgc3RydWN0dXJlcyB0aGF0IGRlc2NyaWJlIHRoZQorICAvLy8gTVNGIGxheW91dCBhbmQgY2FuIGJlIHdyaXR0ZW4gZGlyZWN0bHkgdG8gdGhlIE1TRiBmaWxlLgorICBFeHBlY3RlZDxNU0ZMYXlvdXQ+IGJ1aWxkKCk7CisKKyAgQnVtcFB0ckFsbG9jYXRvciAmZ2V0QWxsb2NhdG9yKCkgeyByZXR1cm4gQWxsb2NhdG9yOyB9CisKK3ByaXZhdGU6CisgIE1TRkJ1aWxkZXIodWludDMyX3QgQmxvY2tTaXplLCB1aW50MzJfdCBNaW5CbG9ja0NvdW50LCBib29sIENhbkdyb3csCisgICAgICAgICAgICAgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yKTsKKworICBFcnJvciBhbGxvY2F0ZUJsb2Nrcyh1aW50MzJfdCBOdW1CbG9ja3MsIE11dGFibGVBcnJheVJlZjx1aW50MzJfdD4gQmxvY2tzKTsKKyAgdWludDMyX3QgY29tcHV0ZURpcmVjdG9yeUJ5dGVTaXplKCkgY29uc3Q7CisKKyAgdXNpbmcgQmxvY2tMaXN0ID0gc3RkOjp2ZWN0b3I8dWludDMyX3Q+OworCisgIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvcjsKKworICBib29sIElzR3Jvd2FibGU7CisgIHVpbnQzMl90IEZyZWVQYWdlTWFwOworICB1aW50MzJfdCBVbmtub3duMSA9IDA7CisgIHVpbnQzMl90IEJsb2NrU2l6ZTsKKyAgdWludDMyX3QgQmxvY2tNYXBBZGRyOworICBCaXRWZWN0b3IgRnJlZUJsb2NrczsKKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IERpcmVjdG9yeUJsb2NrczsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVpbnQzMl90LCBCbG9ja0xpc3Q+PiBTdHJlYW1EYXRhOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG1zZgorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX01TRl9NU0ZCVUlMREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL01TRi9NU0ZDb21tb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL01TRi9NU0ZDb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDUzMjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vTVNGL01TRkNvbW1vbi5oCkBAIC0wLDAgKzEsMTYyIEBACisvLz09PS0gTVNGQ29tbW9uLmggLSBDb21tb24gdHlwZXMgYW5kIGZ1bmN0aW9ucyBmb3IgTVNGIGZpbGVzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX01TRl9NU0ZDT01NT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19NU0ZfTVNGQ09NTU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBtc2YgeworCitzdGF0aWMgY29uc3QgY2hhciBNYWdpY1tdID0geydNJywgICdpJywgICdjJywgICAgJ3InLCAnbycsICdzJywgICdvJywgICdmJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnLCAgJyAnLCAgJ0MnLCAgICAnLycsICdDJywgJysnLCAgJysnLCAgJyAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScsICAnUycsICAnRicsICAgICcgJywgJzcnLCAnLicsICAnMCcsICAnMCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdccicsICdcbicsICdceDFhJywgJ0QnLCAnUycsICdcMCcsICdcMCcsICdcMCd9OworCisvLyBUaGUgc3VwZXJibG9jayBpcyBvdmVybGFpZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIChvZmZzZXQgMCkuCisvLyBJdCBzdGFydHMgd2l0aCBhIG1hZ2ljIGhlYWRlciBhbmQgaXMgZm9sbG93ZWQgYnkgaW5mb3JtYXRpb24gd2hpY2gKKy8vIGRlc2NyaWJlcyB0aGUgbGF5b3V0IG9mIHRoZSBmaWxlIHN5c3RlbS4KK3N0cnVjdCBTdXBlckJsb2NrIHsKKyAgY2hhciBNYWdpY0J5dGVzW3NpemVvZihNYWdpYyldOworICAvLyBUaGUgZmlsZSBzeXN0ZW0gaXMgc3BsaXQgaW50byBhIHZhcmlhYmxlIG51bWJlciBvZiBmaXhlZCBzaXplIGVsZW1lbnRzLgorICAvLyBUaGVzZSBlbGVtZW50cyBhcmUgcmVmZXJyZWQgdG8gYXMgYmxvY2tzLiAgVGhlIHNpemUgb2YgYSBibG9jayBtYXkgdmFyeQorICAvLyBmcm9tIHN5c3RlbSB0byBzeXN0ZW0uCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEJsb2NrU2l6ZTsKKyAgLy8gVGhlIGluZGV4IG9mIHRoZSBmcmVlIGJsb2NrIG1hcC4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRnJlZUJsb2NrTWFwQmxvY2s7CisgIC8vIFRoaXMgY29udGFpbnMgdGhlIG51bWJlciBvZiBibG9ja3MgcmVzaWRlbnQgaW4gdGhlIGZpbGUgc3lzdGVtLiAgSW4KKyAgLy8gcHJhY3RpY2UsIE51bUJsb2NrcyAqIEJsb2NrU2l6ZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBzaXplIG9mIHRoZSBNU0YKKyAgLy8gZmlsZS4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTnVtQmxvY2tzOworICAvLyBUaGlzIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggbWFrZSB1cCB0aGUgZGlyZWN0b3J5LgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBOdW1EaXJlY3RvcnlCeXRlczsKKyAgLy8gVGhpcyBmaWVsZCdzIHB1cnBvc2UgaXMgbm90IHlldCBrbm93bi4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVW5rbm93bjE7CisgIC8vIFRoaXMgY29udGFpbnMgdGhlIGJsb2NrICMgb2YgdGhlIGJsb2NrIG1hcC4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQmxvY2tNYXBBZGRyOworfTsKKworc3RydWN0IE1TRkxheW91dCB7CisgIE1TRkxheW91dCgpID0gZGVmYXVsdDsKKworICB1aW50MzJfdCBtYWluRnBtQmxvY2soKSBjb25zdCB7CisgICAgYXNzZXJ0KFNCLT5GcmVlQmxvY2tNYXBCbG9jayA9PSAxIHx8IFNCLT5GcmVlQmxvY2tNYXBCbG9jayA9PSAyKTsKKyAgICByZXR1cm4gU0ItPkZyZWVCbG9ja01hcEJsb2NrOworICB9CisKKyAgdWludDMyX3QgYWx0ZXJuYXRlRnBtQmxvY2soKSBjb25zdCB7CisgICAgLy8gSWYgbWFpbkZwbUJsb2NrIGlzIDEsIHRoaXMgaXMgMi4gIElmIG1haW5GcG1CbG9jayBpcyAyLCB0aGlzIGlzIDEuCisgICAgcmV0dXJuIDNVIC0gbWFpbkZwbUJsb2NrKCk7CisgIH0KKworICBjb25zdCBTdXBlckJsb2NrICpTQiA9IG51bGxwdHI7CisgIEJpdFZlY3RvciBGcmVlUGFnZU1hcDsKKyAgQXJyYXlSZWY8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+IERpcmVjdG9yeUJsb2NrczsKKyAgQXJyYXlSZWY8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+IFN0cmVhbVNpemVzOworICBzdGQ6OnZlY3RvcjxBcnJheVJlZjxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4+IFN0cmVhbU1hcDsKK307CisKKy8vLyBcYnJpZWYgRGVzY3JpYmVzIHRoZSBsYXlvdXQgb2YgYSBzdHJlYW0gaW4gYW4gTVNGIGxheW91dC4gIEEgInN0cmVhbSIgaGVyZQorLy8vIGlzIGRlZmluZWQgYXMgYW55IGxvZ2ljYWwgdW5pdCBvZiBkYXRhIHdoaWNoIG1heSBiZSBhcnJhbmdlZCBpbnNpZGUgdGhlIE1TRgorLy8vIGZpbGUgYXMgYSBzZXF1ZW5jZSBvZiAocG9zc2libHkgZGlzY29udGlndW91cykgYmxvY2tzLiAgV2hlbiB3ZSB3YW50IHRvIHJlYWQKKy8vLyBmcm9tIGEgcGFydGljdWxhciBNU0YgU3RyZWFtLCB3ZSBmaWxsIG91dCBhIHN0cmVhbSBsYXlvdXQgc3RydWN0dXJlIGFuZCB0aGUKKy8vLyByZWFkZXIgdXNlcyBpdCB0byBkZXRlcm1pbmUgd2hpY2ggYmxvY2tzIGluIHRoZSB1bmRlcmx5aW5nIE1TRiBmaWxlIGNvbnRhaW4KKy8vLyB0aGUgZGF0YSwgc28gdGhhdCBpdCBjYW4gYmUgcGllY2VkIHRvZ2V0aGVyIGluIHRoZSByaWdodCBvcmRlci4KK2NsYXNzIE1TRlN0cmVhbUxheW91dCB7CitwdWJsaWM6CisgIHVpbnQzMl90IExlbmd0aDsKKyAgc3RkOjp2ZWN0b3I8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+IEJsb2NrczsKK307CisKKy8vLyBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBsYXlvdXQgb2YgdGhlIEZQTSBzdHJlYW0sIGdpdmVuIHRoZSBNU0YgbGF5b3V0LiAgQW4gRlBNCisvLy8gc3RyZWFtIHNwYW5zIDEgb3IgbW9yZSBibG9ja3MsIGVhY2ggYXQgZXF1YWxseSBzcGFjZWQgaW50ZXJ2YWxzIHRocm91Z2hvdXQKKy8vLyB0aGUgZmlsZS4KK01TRlN0cmVhbUxheW91dCBnZXRGcG1TdHJlYW1MYXlvdXQoY29uc3QgTVNGTGF5b3V0ICZNc2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5jbHVkZVVudXNlZEZwbURhdGEgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbHRGcG0gPSBmYWxzZSk7CisKK2lubGluZSBib29sIGlzVmFsaWRCbG9ja1NpemUodWludDMyX3QgU2l6ZSkgeworICBzd2l0Y2ggKFNpemUpIHsKKyAgY2FzZSA1MTI6CisgIGNhc2UgMTAyNDoKKyAgY2FzZSAyMDQ4OgorICBjYXNlIDQwOTY6CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBTdXBlciBCbG9jaywgRnBtMCwgRnBtMSwgYW5kIEJsb2NrIE1hcAoraW5saW5lIHVpbnQzMl90IGdldE1pbmltdW1CbG9ja0NvdW50KCkgeyByZXR1cm4gNDsgfQorCisvLyBTdXBlciBCbG9jaywgRnBtMCwgYW5kIEZwbTEgYXJlIHJlc2VydmVkLiAgVGhlIEJsb2NrIE1hcCwgYWx0aG91Z2ggcmVxdWlyZWQKKy8vIG5lZWQgbm90IGJlIGF0IGJsb2NrIDMuCitpbmxpbmUgdWludDMyX3QgZ2V0Rmlyc3RVbnJlc2VydmVkQmxvY2soKSB7IHJldHVybiAzOyB9CisKK2lubGluZSB1aW50NjRfdCBieXRlc1RvQmxvY2tzKHVpbnQ2NF90IE51bUJ5dGVzLCB1aW50NjRfdCBCbG9ja1NpemUpIHsKKyAgcmV0dXJuIGRpdmlkZUNlaWwoTnVtQnl0ZXMsIEJsb2NrU2l6ZSk7Cit9CisKK2lubGluZSB1aW50NjRfdCBibG9ja1RvT2Zmc2V0KHVpbnQ2NF90IEJsb2NrTnVtYmVyLCB1aW50NjRfdCBCbG9ja1NpemUpIHsKKyAgcmV0dXJuIEJsb2NrTnVtYmVyICogQmxvY2tTaXplOworfQorCitpbmxpbmUgdWludDMyX3QgZ2V0RnBtSW50ZXJ2YWxMZW5ndGgoY29uc3QgTVNGTGF5b3V0ICZMKSB7CisgIHJldHVybiBMLlNCLT5CbG9ja1NpemU7Cit9CisKKy8vLyBHaXZlbiBhbiBNU0Ygd2l0aCB0aGUgc3BlY2lmaWVkIGJsb2NrIHNpemUgYW5kIG51bWJlciBvZiBibG9ja3MsIGRldGVybWluZQorLy8vIGhvdyBtYW55IHBpZWNlcyB0aGUgc3BlY2lmaWVkIEZwbSBpcyBzcGxpdCBpbnRvLgorLy8vIFxwIEJsb2NrU2l6ZSAtIHRoZSBibG9jayBzaXplIG9mIHRoZSBNU0YKKy8vLyBccCBOdW1CbG9ja3MgLSB0aGUgdG90YWwgbnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgTVNGCisvLy8gXHAgSW5jbHVkZVVudXNlZEZwbURhdGEgLSBXaGVuIHRydWUsIHRoaXMgd2lsbCBjb3VudCBldmVyeSBibG9jayB0aGF0IGlzCisvLy8gICAgYm90aCBpbiB0aGUgZmlsZSBhbmQgbWF0Y2hlcyB0aGUgZm9ybSBvZiBhbiBGUE0gYmxvY2ssIGV2ZW4gaWYgc29tZSBvZgorLy8vICAgIHRob3NlIEZQTSBibG9ja3MgYXJlIHVudXNlZCAoYSBzaW5nbGUgRlBNIGJsb2NrIGNhbiBkZXNjcmliZSB0aGUKKy8vLyAgICBhbGxvY2F0aW9uIHN0YXR1cyBvZiB1cCB0byAzMiw3NjcgYmxvY2tzLCBhbHRob3VnaCBvbmUgYXBwZWFycyBvbmx5CisvLy8gICAgZXZlcnkgNCwwOTYgYmxvY2tzKS4gIFNvIHRoZXJlIGFyZSA4eCBhcyBtYW55IGJsb2NrcyB0aGF0IG1hdGNoIHRoZQorLy8vICAgIGZvcm0gYXMgdGhlcmUgYXJlIGJsb2NrcyB0aGF0IGFyZSBuZWNlc3NhcnkgdG8gZGVzY3JpYmUgdGhlIGFsbG9jYXRpb24KKy8vLyAgICBzdGF0dXMgb2YgdGhlIGZpbGUuICBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIGZhbHNlLCB0aGVzZSBleHRyYW5lb3VzCisvLy8gICAgdHJhaWxpbmcgYmxvY2tzIGFyZSBub3QgY291bnRlZC4KK2lubGluZSB1aW50MzJfdCBnZXROdW1GcG1JbnRlcnZhbHModWludDMyX3QgQmxvY2tTaXplLCB1aW50MzJfdCBOdW1CbG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5jbHVkZVVudXNlZEZwbURhdGEsIGludCBGcG1OdW1iZXIpIHsKKyAgYXNzZXJ0KEZwbU51bWJlciA9PSAxIHx8IEZwbU51bWJlciA9PSAyKTsKKyAgaWYgKEluY2x1ZGVVbnVzZWRGcG1EYXRhKSB7CisgICAgLy8gVGhpcyBjYWxjdWxhdGlvbiBkZXRlcm1pbmVzIGhvdyBtYW55IHRpbWVzIGEgbnVtYmVyIG9mIHRoZSBmb3JtCisgICAgLy8gQmxvY2tTaXplICogayArIE4gYXBwZWFycyBpbiB0aGUgcmFuZ2UgWzAsIE51bUJsb2NrcykuICBXZSBvbmx5IG5lZWQgdG8KKyAgICAvLyBkbyB0aGlzIHdoZW4gdW51c2VkIGRhdGEgaXMgaW5jbHVkZWQsIHNpbmNlIHRoZSBudW1iZXIgb2YgYmxvY2tzIGR3YXJmcworICAgIC8vIHRoZSBudW1iZXIgb2YgZnBtIGJsb2Nrcy4KKyAgICByZXR1cm4gZGl2aWRlQ2VpbChOdW1CbG9ja3MgLSBGcG1OdW1iZXIsIEJsb2NrU2l6ZSk7CisgIH0KKworICAvLyBXZSB3YW50IHRoZSBtaW5pbXVtIG51bWJlciBvZiBpbnRlcnZhbHMgcmVxdWlyZWQsIHdoZXJlIGVhY2ggaW50ZXJ2YWwgY2FuCisgIC8vIHJlcHJlc2VudCBCbG9ja1NpemUgKiA4IGJsb2Nrcy4KKyAgcmV0dXJuIGRpdmlkZUNlaWwoTnVtQmxvY2tzLCA4ICogQmxvY2tTaXplKTsKK30KKworaW5saW5lIHVpbnQzMl90IGdldE51bUZwbUludGVydmFscyhjb25zdCBNU0ZMYXlvdXQgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5jbHVkZVVudXNlZEZwbURhdGEgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbHRGcG0gPSBmYWxzZSkgeworICByZXR1cm4gZ2V0TnVtRnBtSW50ZXJ2YWxzKEwuU0ItPkJsb2NrU2l6ZSwgTC5TQi0+TnVtQmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGVVbnVzZWRGcG1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsdEZwbSA/IEwuYWx0ZXJuYXRlRnBtQmxvY2soKSA6IEwubWFpbkZwbUJsb2NrKCkpOworfQorCitFcnJvciB2YWxpZGF0ZVN1cGVyQmxvY2soY29uc3QgU3VwZXJCbG9jayAmU0IpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbXNmCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fTVNGX01TRkNPTU1PTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9NU0YvTVNGRXJyb3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL01TRi9NU0ZFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NmFlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9NU0YvTVNGRXJyb3IuaApAQCAtMCwwICsxLDQ3IEBACisvLz09PS0gTVNGRXJyb3IuaCAtIEVycm9yIGV4dGVuc2lvbnMgZm9yIE1TRiBGaWxlcyAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX01TRl9NU0ZFUlJPUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX01TRl9NU0ZFUlJPUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG1zZiB7CitlbnVtIGNsYXNzIG1zZl9lcnJvcl9jb2RlIHsKKyAgdW5zcGVjaWZpZWQgPSAxLAorICBpbnN1ZmZpY2llbnRfYnVmZmVyLAorICBub3Rfd3JpdGFibGUsCisgIG5vX3N0cmVhbSwKKyAgaW52YWxpZF9mb3JtYXQsCisgIGJsb2NrX2luX3VzZQorfTsKKworLy8vIEJhc2UgY2xhc3MgZm9yIGVycm9ycyBvcmlnaW5hdGluZyB3aGVuIHBhcnNpbmcgcmF3IFBEQiBmaWxlcworY2xhc3MgTVNGRXJyb3IgOiBwdWJsaWMgRXJyb3JJbmZvPE1TRkVycm9yPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworICBNU0ZFcnJvcihtc2ZfZXJyb3JfY29kZSBDKTsKKyAgTVNGRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnRleHQpOworICBNU0ZFcnJvcihtc2ZfZXJyb3JfY29kZSBDLCBjb25zdCBzdGQ6OnN0cmluZyAmQ29udGV4dCk7CisKKyAgdm9pZCBsb2cocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldEVycm9yTWVzc2FnZSgpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgY29udmVydFRvRXJyb3JDb2RlKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIEVyck1zZzsKKyAgbXNmX2Vycm9yX2NvZGUgQ29kZTsKK307Cit9IC8vIG5hbWVzcGFjZSBtc2YKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX01TRl9NU0ZFUlJPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9NU0YvTWFwcGVkQmxvY2tTdHJlYW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL01TRi9NYXBwZWRCbG9ja1N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWU1MjkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9NU0YvTWFwcGVkQmxvY2tTdHJlYW0uaApAQCAtMCwwICsxLDE2MyBAQAorLy89PS0gTWFwcGVkQmxvY2tTdHJlYW0uaCAtIERpc2NvbnRpZ3VvdXMgc3RyZWFtIGRhdGEgaW4gYW4gTVNGIC0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19NU0ZfTUFQUEVEQkxPQ0tTVFJFQU1fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19NU0ZfTUFQUEVEQkxPQ0tTVFJFQU1fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL01TRi9NU0ZDb21tb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgbXNmIHsKKworc3RydWN0IE1TRkxheW91dDsKKworLy8vIE1hcHBlZEJsb2NrU3RyZWFtIHJlcHJlc2VudHMgZGF0YSBzdG9yZWQgaW4gYW4gTVNGIGZpbGUgaW50byBjaHVua3Mgb2YgYQorLy8vIHBhcnRpY3VsYXIgc2l6ZSAoY2FsbGVkIHRoZSBCbG9jayBTaXplKSwgYW5kIHdob3NlIGNodW5rcyBtYXkgbm90IGJlCisvLy8gbmVjZXNzYXJpbHkgY29udGlndW91cy4gIFRoZSBhcnJhbmdlbWVudCBvZiB0aGVzZSBjaHVua3MgTVNGIHRoZSBmaWxlCisvLy8gaXMgZGVzY3JpYmVkIGJ5IHNvbWUgb3RoZXIgbWV0YWRhdGEgY29udGFpbmVkIHdpdGhpbiB0aGUgTVNGIGZpbGUuICBJbgorLy8vIHRoZSBjYXNlIG9mIGEgc3RhbmRhcmQgTVNGIFN0cmVhbSwgdGhlIGxheW91dCBvZiB0aGUgc3RyZWFtJ3MgYmxvY2tzCisvLy8gaXMgZGVzY3JpYmVkIGJ5IHRoZSBNU0YgImRpcmVjdG9yeSIsIGJ1dCBpbiB0aGUgY2FzZSBvZiB0aGUgZGlyZWN0b3J5CisvLy8gaXRzZWxmLCB0aGUgbGF5b3V0IGlzIGRlc2NyaWJlZCBieSBhbiBhcnJheSBhdCBhIGZpeGVkIGxvY2F0aW9uIHdpdGhpbgorLy8vIHRoZSBNU0YuICBNYXBwZWRCbG9ja1N0cmVhbSBwcm92aWRlcyBtZXRob2RzIGZvciByZWFkaW5nIGZyb20gYW5kIHdyaXRpbmcKKy8vLyB0byBvbmUgb2YgdGhlc2Ugc3RyZWFtcyB0cmFuc3BhcmVudGx5LCBhcyBpZiBpdCB3ZXJlIGEgY29udGlndW91cyBzZXF1ZW5jZQorLy8vIG9mIGJ5dGVzLgorY2xhc3MgTWFwcGVkQmxvY2tTdHJlYW0gOiBwdWJsaWMgQmluYXJ5U3RyZWFtIHsKKyAgZnJpZW5kIGNsYXNzIFdyaXRhYmxlTWFwcGVkQmxvY2tTdHJlYW07CisKK3B1YmxpYzoKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxNYXBwZWRCbG9ja1N0cmVhbT4KKyAgY3JlYXRlU3RyZWFtKHVpbnQzMl90IEJsb2NrU2l6ZSwgY29uc3QgTVNGU3RyZWFtTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICBCaW5hcnlTdHJlYW1SZWYgTXNmRGF0YSwgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yKTsKKworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPE1hcHBlZEJsb2NrU3RyZWFtPgorICBjcmVhdGVJbmRleGVkU3RyZWFtKGNvbnN0IE1TRkxheW91dCAmTGF5b3V0LCBCaW5hcnlTdHJlYW1SZWYgTXNmRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTdHJlYW1JbmRleCwgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yKTsKKworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPE1hcHBlZEJsb2NrU3RyZWFtPgorICBjcmVhdGVGcG1TdHJlYW0oY29uc3QgTVNGTGF5b3V0ICZMYXlvdXQsIEJpbmFyeVN0cmVhbVJlZiBNc2ZEYXRhLAorICAgICAgICAgICAgICAgICAgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yKTsKKworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPE1hcHBlZEJsb2NrU3RyZWFtPgorICBjcmVhdGVEaXJlY3RvcnlTdHJlYW0oY29uc3QgTVNGTGF5b3V0ICZMYXlvdXQsIEJpbmFyeVN0cmVhbVJlZiBNc2ZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yKTsKKworICBzdXBwb3J0OjplbmRpYW5uZXNzIGdldEVuZGlhbigpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gc3VwcG9ydDo6bGl0dGxlOworICB9CisKKyAgRXJyb3IgcmVhZEJ5dGVzKHVpbnQzMl90IE9mZnNldCwgdWludDMyX3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+ICZCdWZmZXIpIG92ZXJyaWRlOworICBFcnJvciByZWFkTG9uZ2VzdENvbnRpZ3VvdXNDaHVuayh1aW50MzJfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+ICZCdWZmZXIpIG92ZXJyaWRlOworCisgIHVpbnQzMl90IGdldExlbmd0aCgpIG92ZXJyaWRlOworCisgIEJ1bXBQdHJBbGxvY2F0b3IgJmdldEFsbG9jYXRvcigpIHsgcmV0dXJuIEFsbG9jYXRvcjsgfQorCisgIHZvaWQgaW52YWxpZGF0ZUNhY2hlKCk7CisKKyAgdWludDMyX3QgZ2V0QmxvY2tTaXplKCkgY29uc3QgeyByZXR1cm4gQmxvY2tTaXplOyB9CisgIHVpbnQzMl90IGdldE51bUJsb2NrcygpIGNvbnN0IHsgcmV0dXJuIFN0cmVhbUxheW91dC5CbG9ja3Muc2l6ZSgpOyB9CisgIHVpbnQzMl90IGdldFN0cmVhbUxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIFN0cmVhbUxheW91dC5MZW5ndGg7IH0KKworcHJvdGVjdGVkOgorICBNYXBwZWRCbG9ja1N0cmVhbSh1aW50MzJfdCBCbG9ja1NpemUsIGNvbnN0IE1TRlN0cmVhbUxheW91dCAmU3RyZWFtTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICBCaW5hcnlTdHJlYW1SZWYgTXNmRGF0YSwgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yKTsKKworcHJpdmF0ZToKKyAgY29uc3QgTVNGU3RyZWFtTGF5b3V0ICZnZXRTdHJlYW1MYXlvdXQoKSBjb25zdCB7IHJldHVybiBTdHJlYW1MYXlvdXQ7IH0KKyAgdm9pZCBmaXhDYWNoZUFmdGVyV3JpdGUodWludDMyX3QgT2Zmc2V0LCBBcnJheVJlZjx1aW50OF90PiBEYXRhKSBjb25zdDsKKworICBFcnJvciByZWFkQnl0ZXModWludDMyX3QgT2Zmc2V0LCBNdXRhYmxlQXJyYXlSZWY8dWludDhfdD4gQnVmZmVyKTsKKyAgYm9vbCB0cnlSZWFkQ29udGlndW91c2x5KHVpbnQzMl90IE9mZnNldCwgdWludDMyX3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+ICZCdWZmZXIpOworCisgIGNvbnN0IHVpbnQzMl90IEJsb2NrU2l6ZTsKKyAgY29uc3QgTVNGU3RyZWFtTGF5b3V0IFN0cmVhbUxheW91dDsKKyAgQmluYXJ5U3RyZWFtUmVmIE1zZkRhdGE7CisKKyAgdXNpbmcgQ2FjaGVFbnRyeSA9IE11dGFibGVBcnJheVJlZjx1aW50OF90PjsKKworICAvLyBXZSBqdXN0IHN0b3JlIHRoZSBhbGxvY2F0b3IgYnkgcmVmZXJlbmNlLiAgV2UgdXNlIHRoaXMgdG8gYWxsb2NhdGUKKyAgLy8gY29udGlndW91cyBtZW1vcnkgZm9yIHRoaW5ncyBsaWtlIGFycmF5cyBvciBzdHJpbmdzIHRoYXQgY3Jvc3MgYSBibG9jaworICAvLyBib3VuZGFyeSwgYW5kIHRoaXMgbWVtb3J5IGlzIGV4cGVjdGVkIHRvIG91dGxpdmUgdGhlIHN0cmVhbS4gIEZvciBleGFtcGxlLAorICAvLyBzb21lb25lIGNvdWxkIGNyZWF0ZSBhIHN0cmVhbSwgcmVhZCBzb21lIHN0dWZmLCB0aGVuIGNsb3NlIHRoZSBzdHJlYW0sIGFuZAorICAvLyB3ZSB3b3VsZCBsaWtlIG91dHN0YW5kaW5nIHJlZmVyZW5jZXMgdG8gZmllbGRzIHRvIHJlbWFpbiB2YWxpZCBzaW5jZSB0aGUKKyAgLy8gZW50aXJlIGZpbGUgaXMgbWFwcGVkIGFueXdheS4gIEJlY2F1c2Ugb2YgdGhhdCwgdGhlIHVzZXIgbXVzdCBzdXBwbHkgdGhlCisgIC8vIGFsbG9jYXRvciB0byBhbGxvY2F0ZSBicm9rZW4gcmVjb3JkcyBmcm9tLgorICBCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3I7CisgIERlbnNlTWFwPHVpbnQzMl90LCBzdGQ6OnZlY3RvcjxDYWNoZUVudHJ5Pj4gQ2FjaGVNYXA7Cit9OworCitjbGFzcyBXcml0YWJsZU1hcHBlZEJsb2NrU3RyZWFtIDogcHVibGljIFdyaXRhYmxlQmluYXJ5U3RyZWFtIHsKK3B1YmxpYzoKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxXcml0YWJsZU1hcHBlZEJsb2NrU3RyZWFtPgorICBjcmVhdGVTdHJlYW0odWludDMyX3QgQmxvY2tTaXplLCBjb25zdCBNU0ZTdHJlYW1MYXlvdXQgJkxheW91dCwKKyAgICAgICAgICAgICAgIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmIE1zZkRhdGEsIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvcik7CisKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxXcml0YWJsZU1hcHBlZEJsb2NrU3RyZWFtPgorICBjcmVhdGVJbmRleGVkU3RyZWFtKGNvbnN0IE1TRkxheW91dCAmTGF5b3V0LCBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiBNc2ZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFN0cmVhbUluZGV4LCBCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IpOworCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8V3JpdGFibGVNYXBwZWRCbG9ja1N0cmVhbT4KKyAgY3JlYXRlRGlyZWN0b3J5U3RyZWFtKGNvbnN0IE1TRkxheW91dCAmTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYgTXNmRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvcik7CisKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxXcml0YWJsZU1hcHBlZEJsb2NrU3RyZWFtPgorICBjcmVhdGVGcG1TdHJlYW0oY29uc3QgTVNGTGF5b3V0ICZMYXlvdXQsIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmIE1zZkRhdGEsCisgICAgICAgICAgICAgICAgICBCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IsIGJvb2wgQWx0RnBtID0gZmFsc2UpOworCisgIHN1cHBvcnQ6OmVuZGlhbm5lc3MgZ2V0RW5kaWFuKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBzdXBwb3J0OjpsaXR0bGU7CisgIH0KKworICBFcnJvciByZWFkQnl0ZXModWludDMyX3QgT2Zmc2V0LCB1aW50MzJfdCBTaXplLAorICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gJkJ1ZmZlcikgb3ZlcnJpZGU7CisgIEVycm9yIHJlYWRMb25nZXN0Q29udGlndW91c0NodW5rKHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gJkJ1ZmZlcikgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldExlbmd0aCgpIG92ZXJyaWRlOworCisgIEVycm9yIHdyaXRlQnl0ZXModWludDMyX3QgT2Zmc2V0LCBBcnJheVJlZjx1aW50OF90PiBCdWZmZXIpIG92ZXJyaWRlOworCisgIEVycm9yIGNvbW1pdCgpIG92ZXJyaWRlOworCisgIGNvbnN0IE1TRlN0cmVhbUxheW91dCAmZ2V0U3RyZWFtTGF5b3V0KCkgY29uc3QgeworICAgIHJldHVybiBSZWFkSW50ZXJmYWNlLmdldFN0cmVhbUxheW91dCgpOworICB9CisKKyAgdWludDMyX3QgZ2V0QmxvY2tTaXplKCkgY29uc3QgeyByZXR1cm4gUmVhZEludGVyZmFjZS5nZXRCbG9ja1NpemUoKTsgfQorICB1aW50MzJfdCBnZXROdW1CbG9ja3MoKSBjb25zdCB7IHJldHVybiBSZWFkSW50ZXJmYWNlLmdldE51bUJsb2NrcygpOyB9CisgIHVpbnQzMl90IGdldFN0cmVhbUxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIFJlYWRJbnRlcmZhY2UuZ2V0U3RyZWFtTGVuZ3RoKCk7IH0KKworcHJvdGVjdGVkOgorICBXcml0YWJsZU1hcHBlZEJsb2NrU3RyZWFtKHVpbnQzMl90IEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNU0ZTdHJlYW1MYXlvdXQgJlN0cmVhbUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiBNc2ZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvcik7CisKK3ByaXZhdGU6CisgIE1hcHBlZEJsb2NrU3RyZWFtIFJlYWRJbnRlcmZhY2U7CisgIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmIFdyaXRlSW50ZXJmYWNlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHBkYgorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX01TRl9NQVBQRURCTE9DS1NUUkVBTV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvQ29uY3JldGVTeW1ib2xFbnVtZXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvQ29uY3JldGVTeW1ib2xFbnVtZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcxM2RjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9Db25jcmV0ZVN5bWJvbEVudW1lcmF0b3IuaApAQCAtMCwwICsxLDU5IEBACisvLz09PS0gQ29uY3JldGVTeW1ib2xFbnVtZXJhdG9yLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9DT05DUkVURVNZTUJPTEVOVU1FUkFUT1JfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfQ09OQ1JFVEVTWU1CT0xFTlVNRVJBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCRW51bUNoaWxkcmVuLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL1BEQlR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hpbGRUeXBlPgorY2xhc3MgQ29uY3JldGVTeW1ib2xFbnVtZXJhdG9yIDogcHVibGljIElQREJFbnVtQ2hpbGRyZW48Q2hpbGRUeXBlPiB7CitwdWJsaWM6CisgIENvbmNyZXRlU3ltYm9sRW51bWVyYXRvcihzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPiBTeW1ib2xFbnVtZXJhdG9yKQorICAgICAgOiBFbnVtZXJhdG9yKHN0ZDo6bW92ZShTeW1ib2xFbnVtZXJhdG9yKSkge30KKworICB+Q29uY3JldGVTeW1ib2xFbnVtZXJhdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIHVpbnQzMl90IGdldENoaWxkQ291bnQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEVudW1lcmF0b3ItPmdldENoaWxkQ291bnQoKTsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDaGlsZFR5cGU+IGdldENoaWxkQXRJbmRleCh1aW50MzJfdCBJbmRleCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2w+IENoaWxkID0gRW51bWVyYXRvci0+Z2V0Q2hpbGRBdEluZGV4KEluZGV4KTsKKyAgICByZXR1cm4gdW5pcXVlX2R5bl9jYXN0X29yX251bGw8Q2hpbGRUeXBlPihDaGlsZCk7CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q2hpbGRUeXBlPiBnZXROZXh0KCkgb3ZlcnJpZGUgeworICAgIHJldHVybiB1bmlxdWVfZHluX2Nhc3Rfb3JfbnVsbDxDaGlsZFR5cGU+KEVudW1lcmF0b3ItPmdldE5leHQoKSk7CisgIH0KKworICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGUgeyBFbnVtZXJhdG9yLT5yZXNldCgpOyB9CisKKyAgQ29uY3JldGVTeW1ib2xFbnVtZXJhdG9yPENoaWxkVHlwZT4gKmNsb25lKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+IFdyYXBwZWRDbG9uZShFbnVtZXJhdG9yLT5jbG9uZSgpKTsKKyAgICByZXR1cm4gbmV3IENvbmNyZXRlU3ltYm9sRW51bWVyYXRvcjxDaGlsZFR5cGU+KHN0ZDo6bW92ZShXcmFwcGVkQ2xvbmUpKTsKKyAgfQorCitwcml2YXRlOgorCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+IEVudW1lcmF0b3I7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgcGRiCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX0NPTkNSRVRFU1lNQk9MRU5VTUVSQVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQURhdGFTdHJlYW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRGF0YVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMGJlYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQURhdGFTdHJlYW0uaApAQCAtMCwwICsxLDM1IEBACisvLz09PS0gRElBRGF0YVN0cmVhbS5oIC0gRElBIGltcGxlbWVudGF0aW9uIG9mIElQREJEYXRhU3RyZWFtIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBREFUQVNUUkVBTV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBREFUQVNUUkVBTV9ICisKKyNpbmNsdWRlICJESUFTdXBwb3J0LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJEYXRhU3RyZWFtLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgRElBRGF0YVN0cmVhbSA6IHB1YmxpYyBJUERCRGF0YVN0cmVhbSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IERJQURhdGFTdHJlYW0oQ0NvbVB0cjxJRGlhRW51bURlYnVnU3RyZWFtRGF0YT4gRGlhU3RyZWFtRGF0YSk7CisKKyAgdWludDMyX3QgZ2V0UmVjb3JkQ291bnQoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICBsbHZtOjpPcHRpb25hbDxSZWNvcmRUeXBlPiBnZXRJdGVtQXRJbmRleCh1aW50MzJfdCBJbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgZ2V0TmV4dChSZWNvcmRUeXBlICZSZWNvcmQpIG92ZXJyaWRlOworICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGU7CisgIERJQURhdGFTdHJlYW0gKmNsb25lKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIENDb21QdHI8SURpYUVudW1EZWJ1Z1N0cmVhbURhdGE+IFN0cmVhbURhdGE7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRW51bURlYnVnU3RyZWFtcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFFbnVtRGVidWdTdHJlYW1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZhZTY2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRW51bURlYnVnU3RyZWFtcy5oCkBAIC0wLDAgKzEsMzggQEAKKy8vPT0tIERJQUVudW1EZWJ1Z1N0cmVhbXMuaCAtIERJQSBEZWJ1ZyBTdHJlYW0gRW51bWVyYXRvciBpbXBsIC0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFFTlVNREVCVUdTVFJFQU1TX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFFTlVNREVCVUdTVFJFQU1TX0gKKworI2luY2x1ZGUgIkRJQVN1cHBvcnQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQkRhdGFTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQkVudW1DaGlsZHJlbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgSVBEQkRhdGFTdHJlYW07CisKK2NsYXNzIERJQUVudW1EZWJ1Z1N0cmVhbXMgOiBwdWJsaWMgSVBEQkVudW1DaGlsZHJlbjxJUERCRGF0YVN0cmVhbT4geworcHVibGljOgorICBleHBsaWNpdCBESUFFbnVtRGVidWdTdHJlYW1zKENDb21QdHI8SURpYUVudW1EZWJ1Z1N0cmVhbXM+IERpYUVudW1lcmF0b3IpOworCisgIHVpbnQzMl90IGdldENoaWxkQ291bnQoKSBjb25zdCBvdmVycmlkZTsKKyAgQ2hpbGRUeXBlUHRyIGdldENoaWxkQXRJbmRleCh1aW50MzJfdCBJbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisgIENoaWxkVHlwZVB0ciBnZXROZXh0KCkgb3ZlcnJpZGU7CisgIHZvaWQgcmVzZXQoKSBvdmVycmlkZTsKKyAgRElBRW51bURlYnVnU3RyZWFtcyAqY2xvbmUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgQ0NvbVB0cjxJRGlhRW51bURlYnVnU3RyZWFtcz4gRW51bWVyYXRvcjsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFFbnVtSW5qZWN0ZWRTb3VyY2VzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUVudW1JbmplY3RlZFNvdXJjZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTQ5MGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFFbnVtSW5qZWN0ZWRTb3VyY2VzLmgKQEAgLTAsMCArMSw0MCBAQAorLy89PS0gRElBRW51bUluamVjdGVkU291cmNlcy5oIC0gRElBIEluamVjdGVkIFNvdXJjZXMgRW51bWVyYXRvciAtKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQUVOVU1JTkpFQ1RFRFNPVVJDRVNfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQUVOVU1JTkpFQ1RFRFNPVVJDRVNfSAorCisjaW5jbHVkZSAiRElBU3VwcG9ydC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCRW51bUNoaWxkcmVuLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJJbmplY3RlZFNvdXJjZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIERJQVNlc3Npb247CisKK2NsYXNzIERJQUVudW1JbmplY3RlZFNvdXJjZXMgOiBwdWJsaWMgSVBEQkVudW1DaGlsZHJlbjxJUERCSW5qZWN0ZWRTb3VyY2U+IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRElBRW51bUluamVjdGVkU291cmNlcygKKyAgICAgIGNvbnN0IERJQVNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICBDQ29tUHRyPElEaWFFbnVtSW5qZWN0ZWRTb3VyY2VzPiBEaWFFbnVtZXJhdG9yKTsKKworICB1aW50MzJfdCBnZXRDaGlsZENvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgIENoaWxkVHlwZVB0ciBnZXRDaGlsZEF0SW5kZXgodWludDMyX3QgSW5kZXgpIGNvbnN0IG92ZXJyaWRlOworICBDaGlsZFR5cGVQdHIgZ2V0TmV4dCgpIG92ZXJyaWRlOworICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGU7CisgIERJQUVudW1JbmplY3RlZFNvdXJjZXMgKmNsb25lKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIGNvbnN0IERJQVNlc3Npb24gJlNlc3Npb247CisgIENDb21QdHI8SURpYUVudW1JbmplY3RlZFNvdXJjZXM+IEVudW1lcmF0b3I7Cit9OworfSAvLyBuYW1lc3BhY2UgcGRiCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQUVOVU1JTkpFQ1RFRFNPVVJDRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFFbnVtTGluZU51bWJlcnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRW51bUxpbmVOdW1iZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmMGRlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRW51bUxpbmVOdW1iZXJzLmgKQEAgLTAsMCArMSwzNyBAQAorLy89PS0gRElBRW51bUxpbmVOdW1iZXJzLmggLSBESUEgTGluZSBOdW1iZXIgRW51bWVyYXRvciBpbXBsIC0tLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQUVOVU1MSU5FTlVNQkVSU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBRU5VTUxJTkVOVU1CRVJTX0gKKworI2luY2x1ZGUgIkRJQVN1cHBvcnQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQkVudW1DaGlsZHJlbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCTGluZU51bWJlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIElQREJMaW5lTnVtYmVyOworCitjbGFzcyBESUFFbnVtTGluZU51bWJlcnMgOiBwdWJsaWMgSVBEQkVudW1DaGlsZHJlbjxJUERCTGluZU51bWJlcj4geworcHVibGljOgorICBleHBsaWNpdCBESUFFbnVtTGluZU51bWJlcnMoQ0NvbVB0cjxJRGlhRW51bUxpbmVOdW1iZXJzPiBEaWFFbnVtZXJhdG9yKTsKKworICB1aW50MzJfdCBnZXRDaGlsZENvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgIENoaWxkVHlwZVB0ciBnZXRDaGlsZEF0SW5kZXgodWludDMyX3QgSW5kZXgpIGNvbnN0IG92ZXJyaWRlOworICBDaGlsZFR5cGVQdHIgZ2V0TmV4dCgpIG92ZXJyaWRlOworICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGU7CisgIERJQUVudW1MaW5lTnVtYmVycyAqY2xvbmUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgQ0NvbVB0cjxJRGlhRW51bUxpbmVOdW1iZXJzPiBFbnVtZXJhdG9yOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUVudW1TZWN0aW9uQ29udHJpYnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRW51bVNlY3Rpb25Db250cmlicy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMzdkOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUVudW1TZWN0aW9uQ29udHJpYnMuaApAQCAtMCwwICsxLDQwIEBACisvLz09LSBESUFFbnVtU2VjdGlvbkNvbnRyaWJzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBRU5VTVNFQ1RJT05DT05UUklCU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBRU5VTVNFQ1RJT05DT05UUklCU19ICisKKyNpbmNsdWRlICJESUFTdXBwb3J0LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJFbnVtQ2hpbGRyZW4uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQlNlY3Rpb25Db250cmliLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgRElBU2Vzc2lvbjsKKworY2xhc3MgRElBRW51bVNlY3Rpb25Db250cmlicyA6IHB1YmxpYyBJUERCRW51bUNoaWxkcmVuPElQREJTZWN0aW9uQ29udHJpYj4geworcHVibGljOgorICBleHBsaWNpdCBESUFFbnVtU2VjdGlvbkNvbnRyaWJzKAorICAgICAgY29uc3QgRElBU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgIENDb21QdHI8SURpYUVudW1TZWN0aW9uQ29udHJpYnM+IERpYUVudW1lcmF0b3IpOworCisgIHVpbnQzMl90IGdldENoaWxkQ291bnQoKSBjb25zdCBvdmVycmlkZTsKKyAgQ2hpbGRUeXBlUHRyIGdldENoaWxkQXRJbmRleCh1aW50MzJfdCBJbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisgIENoaWxkVHlwZVB0ciBnZXROZXh0KCkgb3ZlcnJpZGU7CisgIHZvaWQgcmVzZXQoKSBvdmVycmlkZTsKKyAgRElBRW51bVNlY3Rpb25Db250cmlicyAqY2xvbmUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgY29uc3QgRElBU2Vzc2lvbiAmU2Vzc2lvbjsKKyAgQ0NvbVB0cjxJRGlhRW51bVNlY3Rpb25Db250cmlicz4gRW51bWVyYXRvcjsKK307Cit9Cit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQUVOVU1TRUNUSU9OQ09OVFJJQlNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFFbnVtU291cmNlRmlsZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRW51bVNvdXJjZUZpbGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZDE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRW51bVNvdXJjZUZpbGVzLmgKQEAgLTAsMCArMSwzOSBAQAorLy89PS0gRElBRW51bVNvdXJjZUZpbGVzLmggLSBESUEgU291cmNlIEZpbGUgRW51bWVyYXRvciBpbXBsIC0tLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQUVOVU1TT1VSQ0VGSUxFU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBRU5VTVNPVVJDRUZJTEVTX0gKKworI2luY2x1ZGUgIkRJQVN1cHBvcnQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQkVudW1DaGlsZHJlbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCU291cmNlRmlsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIERJQVNlc3Npb247CisKK2NsYXNzIERJQUVudW1Tb3VyY2VGaWxlcyA6IHB1YmxpYyBJUERCRW51bUNoaWxkcmVuPElQREJTb3VyY2VGaWxlPiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IERJQUVudW1Tb3VyY2VGaWxlcyhjb25zdCBESUFTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NvbVB0cjxJRGlhRW51bVNvdXJjZUZpbGVzPiBEaWFFbnVtZXJhdG9yKTsKKworICB1aW50MzJfdCBnZXRDaGlsZENvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgIENoaWxkVHlwZVB0ciBnZXRDaGlsZEF0SW5kZXgodWludDMyX3QgSW5kZXgpIGNvbnN0IG92ZXJyaWRlOworICBDaGlsZFR5cGVQdHIgZ2V0TmV4dCgpIG92ZXJyaWRlOworICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGU7CisgIERJQUVudW1Tb3VyY2VGaWxlcyAqY2xvbmUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgY29uc3QgRElBU2Vzc2lvbiAmU2Vzc2lvbjsKKyAgQ0NvbVB0cjxJRGlhRW51bVNvdXJjZUZpbGVzPiBFbnVtZXJhdG9yOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUVudW1TeW1ib2xzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUVudW1TeW1ib2xzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3OWNkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRW51bVN5bWJvbHMuaApAQCAtMCwwICsxLDM5IEBACisvLz09LSBESUFFbnVtU3ltYm9scy5oIC0gRElBIFN5bWJvbCBFbnVtZXJhdG9yIGltcGwgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBRU5VTVNZTUJPTFNfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQUVOVU1TWU1CT0xTX0gKKworI2luY2x1ZGUgIkRJQVN1cHBvcnQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQkVudW1DaGlsZHJlbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2wuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBESUFTZXNzaW9uOworCitjbGFzcyBESUFFbnVtU3ltYm9scyA6IHB1YmxpYyBJUERCRW51bUNoaWxkcmVuPFBEQlN5bWJvbD4geworcHVibGljOgorICBleHBsaWNpdCBESUFFbnVtU3ltYm9scyhjb25zdCBESUFTZXNzaW9uICZTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDQ29tUHRyPElEaWFFbnVtU3ltYm9scz4gRGlhRW51bWVyYXRvcik7CisKKyAgdWludDMyX3QgZ2V0Q2hpbGRDb3VudCgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sPiBnZXRDaGlsZEF0SW5kZXgodWludDMyX3QgSW5kZXgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sPiBnZXROZXh0KCkgb3ZlcnJpZGU7CisgIHZvaWQgcmVzZXQoKSBvdmVycmlkZTsKKyAgRElBRW51bVN5bWJvbHMgKmNsb25lKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIGNvbnN0IERJQVNlc3Npb24gJlNlc3Npb247CisgIENDb21QdHI8SURpYUVudW1TeW1ib2xzPiBFbnVtZXJhdG9yOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUVudW1UYWJsZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRW51bVRhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNmZjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUVudW1UYWJsZXMuaApAQCAtMCwwICsxLDM3IEBACisvLz09PS0gRElBRW51bVRhYmxlcy5oIC0gRElBIFRhYmxlcyBFbnVtZXJhdG9yIEltcGwgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBRU5VTVRBQkxFU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBRU5VTVRBQkxFU19ICisKKyNpbmNsdWRlICJESUFTdXBwb3J0LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJFbnVtQ2hpbGRyZW4uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQlRhYmxlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgSVBEQlRhYmxlOworCitjbGFzcyBESUFFbnVtVGFibGVzIDogcHVibGljIElQREJFbnVtQ2hpbGRyZW48SVBEQlRhYmxlPiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IERJQUVudW1UYWJsZXMoQ0NvbVB0cjxJRGlhRW51bVRhYmxlcz4gRGlhRW51bWVyYXRvcik7CisKKyAgdWludDMyX3QgZ2V0Q2hpbGRDb3VudCgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlRhYmxlPiBnZXRDaGlsZEF0SW5kZXgodWludDMyX3QgSW5kZXgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlRhYmxlPiBnZXROZXh0KCkgb3ZlcnJpZGU7CisgIHZvaWQgcmVzZXQoKSBvdmVycmlkZTsKKyAgRElBRW51bVRhYmxlcyAqY2xvbmUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgQ0NvbVB0cjxJRGlhRW51bVRhYmxlcz4gRW51bWVyYXRvcjsKK307Cit9Cit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQUVOVU1UQUJMRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFFcnJvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YTM5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUVycm9yLmgKQEAgLTAsMCArMSw0NSBAQAorLy89PT0tIERJQUVycm9yLmggLSBFcnJvciBleHRlbnNpb25zIGZvciBQREIgRElBIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQUVSUk9SX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFFUlJPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CitlbnVtIGNsYXNzIGRpYV9lcnJvcl9jb2RlIHsKKyAgdW5zcGVjaWZpZWQgPSAxLAorICBjb3VsZF9ub3RfY3JlYXRlX2ltcGwsCisgIGludmFsaWRfZmlsZV9mb3JtYXQsCisgIGludmFsaWRfcGFyYW1ldGVyLAorICBhbHJlYWR5X2xvYWRlZCwKKyAgZGVidWdfaW5mb19taXNtYXRjaCwKK307CisKKy8vLyBCYXNlIGNsYXNzIGZvciBlcnJvcnMgb3JpZ2luYXRpbmcgaW4gRElBIFNESywgZS5nLiBDT00gY2FsbHMKK2NsYXNzIERJQUVycm9yIDogcHVibGljIEVycm9ySW5mbzxESUFFcnJvcj4geworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKyAgRElBRXJyb3IoZGlhX2Vycm9yX2NvZGUgQyk7CisgIERJQUVycm9yKFN0cmluZ1JlZiBDb250ZXh0KTsKKyAgRElBRXJyb3IoZGlhX2Vycm9yX2NvZGUgQywgU3RyaW5nUmVmIENvbnRleHQpOworCisgIHZvaWQgbG9nKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CisgIFN0cmluZ1JlZiBnZXRFcnJvck1lc3NhZ2UoKSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBFcnJNc2c7CisgIGRpYV9lcnJvcl9jb2RlIENvZGU7Cit9OworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUluamVjdGVkU291cmNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUluamVjdGVkU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1NTA4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBSW5qZWN0ZWRTb3VyY2UuaApAQCAtMCwwICsxLDM4IEBACisvLz09PS0gRElBSW5qZWN0ZWRTb3VyY2UuaCAtIERJQSBpbXBsIGZvciBJUERCSW5qZWN0ZWRTb3VyY2UgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBSU5KRUNURURTT1VSQ0VfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQUlOSkVDVEVEU09VUkNFX0gKKworI2luY2x1ZGUgIkRJQVN1cHBvcnQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQkluamVjdGVkU291cmNlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgRElBU2Vzc2lvbjsKKworY2xhc3MgRElBSW5qZWN0ZWRTb3VyY2UgOiBwdWJsaWMgSVBEQkluamVjdGVkU291cmNlIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRElBSW5qZWN0ZWRTb3VyY2UoQ0NvbVB0cjxJRGlhSW5qZWN0ZWRTb3VyY2U+IERpYVNvdXJjZUZpbGUpOworCisgIHVpbnQzMl90IGdldENyYzMyKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldENvZGVCeXRlU2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRGaWxlTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRPYmplY3RGaWxlTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRWaXJ0dWFsRmlsZU5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgUERCX1NvdXJjZUNvbXByZXNzaW9uIGdldENvbXByZXNzaW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldENvZGUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgQ0NvbVB0cjxJRGlhSW5qZWN0ZWRTb3VyY2U+IFNvdXJjZUZpbGU7Cit9OworfSAvLyBuYW1lc3BhY2UgcGRiCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQUlOSkVDVEVEU09VUkNFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBTGluZU51bWJlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFMaW5lTnVtYmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5ZTNhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBTGluZU51bWJlci5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09LSBESUFMaW5lTnVtYmVyLmggLSBESUEgaW1wbGVtZW50YXRpb24gb2YgSVBEQkxpbmVOdW1iZXIgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFMSU5FTlVNQkVSX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFMSU5FTlVNQkVSX0gKKworI2luY2x1ZGUgIkRJQVN1cHBvcnQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQkxpbmVOdW1iZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBESUFMaW5lTnVtYmVyIDogcHVibGljIElQREJMaW5lTnVtYmVyIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRElBTGluZU51bWJlcihDQ29tUHRyPElEaWFMaW5lTnVtYmVyPiBEaWFMaW5lTnVtYmVyKTsKKworICB1aW50MzJfdCBnZXRMaW5lTnVtYmVyKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldExpbmVOdW1iZXJFbmQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0Q29sdW1uTnVtYmVyKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldENvbHVtbk51bWJlckVuZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRBZGRyZXNzU2VjdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRBZGRyZXNzT2Zmc2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFJlbGF0aXZlVmlydHVhbEFkZHJlc3MoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0VmlydHVhbEFkZHJlc3MoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TGVuZ3RoKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFNvdXJjZUZpbGVJZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRDb21waWxhbmRJZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU3RhdGVtZW50KCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIENDb21QdHI8SURpYUxpbmVOdW1iZXI+IExpbmVOdW1iZXI7Cit9OworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQVJhd1N5bWJvbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFSYXdTeW1ib2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmIzNTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFSYXdTeW1ib2wuaApAQCAtMCwwICsxLDIzMyBAQAorLy89PT0tIERJQVJhd1N5bWJvbC5oIC0gRElBIGltcGxlbWVudGF0aW9uIG9mIElQREJSYXdTeW1ib2wgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBUkFXU1lNQk9MX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFSQVdTWU1CT0xfSAorCisjaW5jbHVkZSAiRElBU3VwcG9ydC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCUmF3U3ltYm9sLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgRElBU2Vzc2lvbjsKK2NsYXNzIERJQVJhd1N5bWJvbCA6IHB1YmxpYyBJUERCUmF3U3ltYm9sIHsKK3B1YmxpYzoKKyAgRElBUmF3U3ltYm9sKGNvbnN0IERJQVNlc3Npb24gJlBEQlNlc3Npb24sIENDb21QdHI8SURpYVN5bWJvbD4gRGlhU3ltYm9sKTsKKworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBpbnQgSW5kZW50KSBjb25zdCBvdmVycmlkZTsKKworICBDQ29tUHRyPElEaWFTeW1ib2w+IGdldERpYVN5bWJvbCgpIGNvbnN0IHsgcmV0dXJuIFN5bWJvbDsgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgIGZpbmRDaGlsZHJlbihQREJfU3ltVHlwZSBUeXBlKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgZmluZENoaWxkcmVuKFBEQl9TeW1UeXBlIFR5cGUsIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncykgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgIGZpbmRDaGlsZHJlbkJ5QWRkcihQREJfU3ltVHlwZSBUeXBlLCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIFBEQl9OYW1lU2VhcmNoRmxhZ3MgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTZWN0aW9uLCB1aW50MzJfdCBPZmZzZXQpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICBmaW5kQ2hpbGRyZW5CeVZBKFBEQl9TeW1UeXBlIFR5cGUsIFN0cmluZ1JlZiBOYW1lLCBQREJfTmFtZVNlYXJjaEZsYWdzIEZsYWdzLAorICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFZBKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgZmluZENoaWxkcmVuQnlSVkEoUERCX1N5bVR5cGUgVHlwZSwgU3RyaW5nUmVmIE5hbWUsIFBEQl9OYW1lU2VhcmNoRmxhZ3MgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJWQSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgZmluZElubGluZUZyYW1lc0J5QWRkcih1aW50MzJfdCBTZWN0aW9uLCB1aW50MzJfdCBPZmZzZXQpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICBmaW5kSW5saW5lRnJhbWVzQnlSVkEodWludDMyX3QgUlZBKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgZmluZElubGluZUZyYW1lc0J5VkEodWludDY0X3QgVkEpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPiBmaW5kSW5saW5lZUxpbmVzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPgorICBmaW5kSW5saW5lZUxpbmVzQnlBZGRyKHVpbnQzMl90IFNlY3Rpb24sIHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMZW5ndGgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1MaW5lTnVtYmVycz4KKyAgZmluZElubGluZWVMaW5lc0J5UlZBKHVpbnQzMl90IFJWQSwgdWludDMyX3QgTGVuZ3RoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtTGluZU51bWJlcnM+CisgIGZpbmRJbmxpbmVlTGluZXNCeVZBKHVpbnQ2NF90IFZBLCB1aW50MzJfdCBMZW5ndGgpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgZ2V0RGF0YUJ5dGVzKGxsdm06OlNtYWxsVmVjdG9yPHVpbnQ4X3QsIDMyPiAmYnl0ZXMpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIGdldEZyb250RW5kVmVyc2lvbihWZXJzaW9uSW5mbyAmVmVyc2lvbikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0QmFja0VuZFZlcnNpb24oVmVyc2lvbkluZm8gJlZlcnNpb24pIGNvbnN0IG92ZXJyaWRlOworICBQREJfTWVtYmVyQWNjZXNzIGdldEFjY2VzcygpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRBZGRyZXNzT2Zmc2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEFkZHJlc3NTZWN0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEFnZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRBcnJheUluZGV4VHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEJhc2VEYXRhT2Zmc2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEJhc2VEYXRhU2xvdCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRCYXNlU3ltYm9sSWQoKSBjb25zdCBvdmVycmlkZTsKKyAgUERCX0J1aWx0aW5UeXBlIGdldEJ1aWx0aW5UeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEJpdFBvc2l0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFBEQl9DYWxsaW5nQ29udiBnZXRDYWxsaW5nQ29udmVudGlvbigpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRDbGFzc1BhcmVudElkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldENvbXBpbGVyTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRDb3VudCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRDb3VudExpdmVSYW5nZXMoKSBjb25zdCBvdmVycmlkZTsKKyAgUERCX0xhbmcgZ2V0TGFuZ3VhZ2UoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TGV4aWNhbFBhcmVudElkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldExpYnJhcnlOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldExpdmVSYW5nZVN0YXJ0QWRkcmVzc09mZnNldCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRMaXZlUmFuZ2VTdGFydEFkZHJlc3NTZWN0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldExpdmVSYW5nZVN0YXJ0UmVsYXRpdmVWaXJ0dWFsQWRkcmVzcygpIGNvbnN0IG92ZXJyaWRlOworICBjb2Rldmlldzo6UmVnaXN0ZXJJZCBnZXRMb2NhbEJhc2VQb2ludGVyUmVnaXN0ZXJJZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRMb3dlckJvdW5kSWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TWVtb3J5U3BhY2VLaW5kKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TnVtYmVyT2ZBY2NlbGVyYXRvclBvaW50ZXJUYWdzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldE51bWJlck9mQ29sdW1ucygpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXROdW1iZXJPZk1vZGlmaWVycygpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXROdW1iZXJPZlJlZ2lzdGVySW5kaWNlcygpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXROdW1iZXJPZlJvd3MoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0T2JqZWN0RmlsZU5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0T2VtSWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0T2VtU3ltYm9sSWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0T2Zmc2V0SW5VZHQoKSBjb25zdCBvdmVycmlkZTsKKyAgUERCX0NwdSBnZXRQbGF0Zm9ybSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRSYW5rKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGNvZGV2aWV3OjpSZWdpc3RlcklkIGdldFJlZ2lzdGVySWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0UmVnaXN0ZXJUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFJlbGF0aXZlVmlydHVhbEFkZHJlc3MoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0U2FtcGxlclNsb3QoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0U2lnbmF0dXJlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFNpemVJblVkdCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTbG90KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldFNvdXJjZUZpbGVOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCTGluZU51bWJlcj4gZ2V0U3JjTGluZU9uVHlwZURlZm4oKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0U3RyaWRlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFN1YlR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRTeW1ib2xzRmlsZU5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0U3ltSW5kZXhJZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRUYXJnZXRPZmZzZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VGFyZ2V0UmVsYXRpdmVWaXJ0dWFsQWRkcmVzcygpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRUYXJnZXRWaXJ0dWFsQWRkcmVzcygpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRUYXJnZXRTZWN0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFRleHR1cmVTbG90KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFRpbWVTdGFtcCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRUb2tlbigpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRUeXBlSWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VWF2U2xvdCgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRVbmRlY29yYXRlZE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0VW5kZWNvcmF0ZWROYW1lRXgoUERCX1VuZG5hbWVGbGFncyBGbGFncykgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFVubW9kaWZpZWRUeXBlSWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VXBwZXJCb3VuZElkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFZhcmlhbnQgZ2V0VmFsdWUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VmlydHVhbEJhc2VEaXNwSW5kZXgoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VmlydHVhbEJhc2VPZmZzZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VmlydHVhbFRhYmxlU2hhcGVJZCgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sVHlwZUJ1aWx0aW4+CisgIGdldFZpcnR1YWxCYXNlVGFibGVUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFBEQl9EYXRhS2luZCBnZXREYXRhS2luZCgpIGNvbnN0IG92ZXJyaWRlOworICBQREJfU3ltVHlwZSBnZXRTeW1UYWcoKSBjb25zdCBvdmVycmlkZTsKKyAgY29kZXZpZXc6OkdVSUQgZ2V0R3VpZCgpIGNvbnN0IG92ZXJyaWRlOworICBpbnQzMl90IGdldE9mZnNldCgpIGNvbnN0IG92ZXJyaWRlOworICBpbnQzMl90IGdldFRoaXNBZGp1c3QoKSBjb25zdCBvdmVycmlkZTsKKyAgaW50MzJfdCBnZXRWaXJ0dWFsQmFzZVBvaW50ZXJPZmZzZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgUERCX0xvY1R5cGUgZ2V0TG9jYXRpb25UeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFBEQl9NYWNoaW5lIGdldE1hY2hpbmVUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGNvZGV2aWV3OjpUaHVua09yZGluYWwgZ2V0VGh1bmtPcmRpbmFsKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldExlbmd0aCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRMaXZlUmFuZ2VMZW5ndGgoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0VmlydHVhbEFkZHJlc3MoKSBjb25zdCBvdmVycmlkZTsKKyAgUERCX1VkdFR5cGUgZ2V0VWR0S2luZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0NvbnN0cnVjdG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzQ3VzdG9tQ2FsbGluZ0NvbnZlbnRpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNGYXJSZXR1cm4oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0NvZGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0NvbXBpbGVyR2VuZXJhdGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNDb25zdFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0VkaXRBbmRDb250aW51ZUVuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0Z1bmN0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgZ2V0QWRkcmVzc1Rha2VuKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgZ2V0Tm9TdGFja09yZGVyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzQWxsb2NhKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzQXNzaWdubWVudE9wZXJhdG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzQ1R5cGVzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzQ2FzdE9wZXJhdG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzRGVidWdJbmZvKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzRUgoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNFSGEoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNJbmxBc20oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNJbmxpbmVBdHRyaWJ1dGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNJbnRlcnJ1cHRSZXR1cm4oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNGcmFtZVBvaW50ZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNMb25nSnVtcCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc01hbmFnZWRDb2RlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzTmVzdGVkVHlwZXMoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNOb0lubGluZUF0dHJpYnV0ZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc05vUmV0dXJuQXR0cmlidXRlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzT3B0aW1pemVkQ29kZURlYnVnSW5mbygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc092ZXJsb2FkZWRPcGVyYXRvcigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc1NFSCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc1NlY3VyaXR5Q2hlY2tzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzU2V0SnVtcCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc1N0cmljdEdTQ2hlY2soKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0FjY2VsZXJhdG9yR3JvdXBTaGFyZWRMb2NhbCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzQWNjZWxlcmF0b3JQb2ludGVyVGFnTGl2ZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNBY2NlbGVyYXRvclN0dWJGdW5jdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzQWdncmVnYXRlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzSW50cm9WaXJ0dWFsRnVuY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0NWVENJTCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzQ29uc3RydWN0b3JWaXJ0dWFsQmFzZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzQ3h4UmV0dXJuVWR0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNEYXRhQWxpZ25lZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzSExTTERhdGEoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0hvdHBhdGNoYWJsZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzSW5kaXJlY3RWaXJ0dWFsQmFzZUNsYXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNJbnRlcmZhY2VVZHQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0ludHJpbnNpYygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzTFRDRygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzTG9jYXRpb25Db250cm9sRmxvd0RlcGVuZGVudCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzTVNJTE5ldG1vZHVsZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzTWF0cml4Um93TWFqb3IoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc01hbmFnZWRDb2RlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNNU0lMQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzTXVsdGlwbGVJbmhlcml0YW5jZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzTmFrZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc05lc3RlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzT3B0aW1pemVkQXdheSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUGFja2VkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNQb2ludGVyQmFzZWRPblN5bWJvbFZhbHVlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNQb2ludGVyVG9EYXRhTWVtYmVyKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNQb2ludGVyVG9NZW1iZXJGdW5jdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUHVyZVZpcnR1YWwoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1JWYWx1ZVJlZmVyZW5jZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUmVmVWR0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNSZWZlcmVuY2UoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1Jlc3RyaWN0ZWRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNSZXR1cm5WYWx1ZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2FmZUJ1ZmZlcnMoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1Njb3BlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2RsKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTaW5nbGVJbmhlcml0YW5jZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU3BsaXR0ZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1N0YXRpYygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc1ByaXZhdGVTeW1ib2xzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNVbmFsaWduZWRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNVbnJlYWNoZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1ZhbHVlVWR0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNWaXJ0dWFsKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNWaXJ0dWFsQmFzZUNsYXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNWaXJ0dWFsSW5oZXJpdGFuY2UoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1ZvbGF0aWxlVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIHdhc0lubGluZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0VW51c2VkKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIGNvbnN0IERJQVNlc3Npb24gJlNlc3Npb247CisgIENDb21QdHI8SURpYVN5bWJvbD4gU3ltYm9sOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQVNlY3Rpb25Db250cmliLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQVNlY3Rpb25Db250cmliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JjMjhlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBU2VjdGlvbkNvbnRyaWIuaApAQCAtMCwwICsxLDU1IEBACisvLz09PS0gRElBU2VjdGlvbkNvbnRyaWIuaCAtIERJQSBJbXBsLiBvZiBJUERCU2VjdGlvbkNvbnRyaWIgLS0tLS0tIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBU0VDVElPTkNPTlRSSUJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQVNFQ1RJT05DT05UUklCX0gKKworI2luY2x1ZGUgIkRJQVN1cHBvcnQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQlNlY3Rpb25Db250cmliLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgRElBU2Vzc2lvbjsKKworY2xhc3MgRElBU2VjdGlvbkNvbnRyaWIgOiBwdWJsaWMgSVBEQlNlY3Rpb25Db250cmliIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRElBU2VjdGlvbkNvbnRyaWIoY29uc3QgRElBU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NvbVB0cjxJRGlhU2VjdGlvbkNvbnRyaWI+IERpYVNlY3Rpb24pOworCisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2xDb21waWxhbmQ+IGdldENvbXBpbGFuZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRBZGRyZXNzU2VjdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRBZGRyZXNzT2Zmc2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFJlbGF0aXZlVmlydHVhbEFkZHJlc3MoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0VmlydHVhbEFkZHJlc3MoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TGVuZ3RoKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNOb3RQYWdlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0NvZGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNDb2RlMTZCaXQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNJbml0aWFsaXplZERhdGEoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNVbmluaXRpYWxpemVkRGF0YSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUmVtb3ZlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0NvbWRhdCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzRGlzY2FyZGFibGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc05vdENhY2hlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2hhcmVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNFeGVjdXRhYmxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNSZWFkYWJsZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzV3JpdGFibGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0RGF0YUNyYzMyKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFJlbG9jYXRpb25zQ3JjMzIoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0Q29tcGlsYW5kSWQoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgY29uc3QgRElBU2Vzc2lvbiAmU2Vzc2lvbjsKKyAgQ0NvbVB0cjxJRGlhU2VjdGlvbkNvbnRyaWI+IFNlY3Rpb247Cit9OworfQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFTRUNUSU9OQ09OVFJJQl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQVNlc3Npb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBU2Vzc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmM2Q3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQVNlc3Npb24uaApAQCAtMCwwICsxLDg4IEBACisvLz09PS0gRElBU2Vzc2lvbi5oIC0gRElBIGltcGxlbWVudGF0aW9uIG9mIElQREJTZXNzaW9uIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBU0VTU0lPTl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBU0VTU0lPTl9ICisKKyNpbmNsdWRlICJESUFTdXBwb3J0LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJTZXNzaW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFN0cmluZ1JlZjsKKworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBESUFTZXNzaW9uIDogcHVibGljIElQREJTZXNzaW9uIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRElBU2Vzc2lvbihDQ29tUHRyPElEaWFTZXNzaW9uPiBEaWFTZXNzaW9uKTsKKworICBzdGF0aWMgRXJyb3IgY3JlYXRlRnJvbVBkYihTdHJpbmdSZWYgUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJTZXNzaW9uPiAmU2Vzc2lvbik7CisgIHN0YXRpYyBFcnJvciBjcmVhdGVGcm9tRXhlKFN0cmluZ1JlZiBQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlNlc3Npb24+ICZTZXNzaW9uKTsKKworICB1aW50NjRfdCBnZXRMb2FkQWRkcmVzcygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIHNldExvYWRBZGRyZXNzKHVpbnQ2NF90IEFkZHJlc3MpIG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sRXhlPiBnZXRHbG9iYWxTY29wZSgpIG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sPiBnZXRTeW1ib2xCeUlkKHVpbnQzMl90IFN5bWJvbElkKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIGFkZHJlc3NGb3JWQSh1aW50NjRfdCBWQSwgdWludDMyX3QgJlNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGFkZHJlc3NGb3JSVkEodWludDMyX3QgUlZBLCB1aW50MzJfdCAmU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2w+CisgIGZpbmRTeW1ib2xCeUFkZHJlc3ModWludDY0X3QgQWRkcmVzcywgUERCX1N5bVR5cGUgVHlwZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtTGluZU51bWJlcnM+CisgIGZpbmRMaW5lTnVtYmVycyhjb25zdCBQREJTeW1ib2xDb21waWxhbmQgJkNvbXBpbGFuZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IElQREJTb3VyY2VGaWxlICZGaWxlKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtTGluZU51bWJlcnM+CisgIGZpbmRMaW5lTnVtYmVyc0J5QWRkcmVzcyh1aW50NjRfdCBBZGRyZXNzLCB1aW50MzJfdCBMZW5ndGgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1MaW5lTnVtYmVycz4KKyAgZmluZExpbmVOdW1iZXJzQnlSVkEodWludDMyX3QgUlZBLCB1aW50MzJfdCBMZW5ndGgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1MaW5lTnVtYmVycz4KKyAgZmluZExpbmVOdW1iZXJzQnlTZWN0T2Zmc2V0KHVpbnQzMl90IFNlY3Rpb24sIHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IExlbmd0aCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU291cmNlRmlsZXM+CisgIGZpbmRTb3VyY2VGaWxlcyhjb25zdCBQREJTeW1ib2xDb21waWxhbmQgKkNvbXBpbGFuZCwgbGx2bTo6U3RyaW5nUmVmIFBhdHRlcm4sCisgICAgICAgICAgICAgICAgICBQREJfTmFtZVNlYXJjaEZsYWdzIEZsYWdzKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJTb3VyY2VGaWxlPgorICBmaW5kT25lU291cmNlRmlsZShjb25zdCBQREJTeW1ib2xDb21waWxhbmQgKkNvbXBpbGFuZCwKKyAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIFBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgIFBEQl9OYW1lU2VhcmNoRmxhZ3MgRmxhZ3MpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1DaGlsZHJlbjxQREJTeW1ib2xDb21waWxhbmQ+PgorICBmaW5kQ29tcGlsYW5kc0ZvclNvdXJjZUZpbGUobGx2bTo6U3RyaW5nUmVmIFBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREJfTmFtZVNlYXJjaEZsYWdzIEZsYWdzKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbENvbXBpbGFuZD4KKyAgZmluZE9uZUNvbXBpbGFuZEZvclNvdXJjZUZpbGUobGx2bTo6U3RyaW5nUmVmIFBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEQl9OYW1lU2VhcmNoRmxhZ3MgRmxhZ3MpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1Tb3VyY2VGaWxlcz4gZ2V0QWxsU291cmNlRmlsZXMoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU291cmNlRmlsZXM+IGdldFNvdXJjZUZpbGVzRm9yQ29tcGlsYW5kKAorICAgICAgY29uc3QgUERCU3ltYm9sQ29tcGlsYW5kICZDb21waWxhbmQpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlNvdXJjZUZpbGU+CisgIGdldFNvdXJjZUZpbGVCeUlkKHVpbnQzMl90IEZpbGVJZCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtRGF0YVN0cmVhbXM+IGdldERlYnVnU3RyZWFtcygpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVRhYmxlcz4gZ2V0RW51bVRhYmxlcygpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUluamVjdGVkU291cmNlcz4gZ2V0SW5qZWN0ZWRTb3VyY2VzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU2VjdGlvbkNvbnRyaWJzPiBnZXRTZWN0aW9uQ29udHJpYnMoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgQ0NvbVB0cjxJRGlhU2Vzc2lvbj4gU2Vzc2lvbjsKK307Cit9IC8vIG5hbWVzcGFjZSBwZGIKK30gLy8gbmFtZXNwYWNlIGxsdm0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFTb3VyY2VGaWxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQVNvdXJjZUZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDg4ZWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFTb3VyY2VGaWxlLmgKQEAgLTAsMCArMSw0MSBAQAorLy89PT0tIERJQVNvdXJjZUZpbGUuaCAtIERJQSBpbXBsZW1lbnRhdGlvbiBvZiBJUERCU291cmNlRmlsZSAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQVNPVVJDRUZJTEVfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQVNPVVJDRUZJTEVfSAorCisjaW5jbHVkZSAiRElBU3VwcG9ydC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCU291cmNlRmlsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIERJQVNlc3Npb247CisKK2NsYXNzIERJQVNvdXJjZUZpbGUgOiBwdWJsaWMgSVBEQlNvdXJjZUZpbGUgeworcHVibGljOgorICBleHBsaWNpdCBESUFTb3VyY2VGaWxlKGNvbnN0IERJQVNlc3Npb24gJlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0NvbVB0cjxJRGlhU291cmNlRmlsZT4gRGlhU291cmNlRmlsZSk7CisKKyAgc3RkOjpzdHJpbmcgZ2V0RmlsZU5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VW5pcXVlSWQoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0Q2hlY2tzdW0oKSBjb25zdCBvdmVycmlkZTsKKyAgUERCX0NoZWNrc3VtIGdldENoZWNrc3VtVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1DaGlsZHJlbjxQREJTeW1ib2xDb21waWxhbmQ+PgorICBnZXRDb21waWxhbmRzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgQ0NvbVB0cjxJRGlhU291cmNlRmlsZT4gZ2V0RGlhRmlsZSgpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZUZpbGU7IH0KKworcHJpdmF0ZToKKyAgY29uc3QgRElBU2Vzc2lvbiAmU2Vzc2lvbjsKKyAgQ0NvbVB0cjxJRGlhU291cmNlRmlsZT4gU291cmNlRmlsZTsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFTdXBwb3J0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQVN1cHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjRhMzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFTdXBwb3J0LmgKQEAgLTAsMCArMSw0NCBAQAorLy89PT0tIERJQVN1cHBvcnQuaCAtIENvbW1vbiBoZWFkZXIgaW5jbHVkZXMgZm9yIERJQSAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENvbW1vbiBkZWZpbmVzIGFuZCBoZWFkZXIgaW5jbHVkZXMgZm9yIGFsbCBMTFZNRGVidWdJbmZvUERCRElBLiAgVGhlCisvLyBkZWZpbml0aW9ucyBoZXJlIGNvbmZpZ3VyZSB0aGUgbmVjZXNzYXJ5ICNkZWZpbmVzIGFuZCBpbmNsdWRlIHN5c3RlbSBoZWFkZXJzCisvLyBpbiB0aGUgcHJvcGVyIG9yZGVyIGZvciB1c2luZyBESUEuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBU1VQUE9SVF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBU1VQUE9SVF9ICisKKy8vIFJlcXVpcmUgYXQgbGVhc3QgVmlzdGEKKyNkZWZpbmUgTlRERElfVkVSU0lPTiBOVERESV9WSVNUQQorI2RlZmluZSBfV0lOMzJfV0lOTlQgX1dJTjMyX1dJTk5UX1ZJU1RBCisjZGVmaW5lIFdJTlZFUiBfV0lOMzJfV0lOTlRfVklTVEEKKyNpZm5kZWYgTk9NSU5NQVgKKyNkZWZpbmUgTk9NSU5NQVgKKyNlbmRpZgorCisvLyBsbHZtL1N1cHBvcnQvRGVidWcuaCB1bmNvbmRpdGlvbmFsbHkgI2RlZmluZXMgREVCVUcgYXMgYSBtYWNyby4KKy8vIERJQSBoZWFkZXJzICNkZWZpbmUgaXQgaWYgaXQgaXMgbm90IGFscmVhZHkgZGVmaW5lZCwgc28gd2UgaGF2ZQorLy8gYW4gb3JkZXIgb2YgaW5jbHVkZXMgcHJvYmxlbS4gIFRoZSByZWFsIGZpeCBpcyB0byBtYWtlIExMVk0gdXNlCisvLyBzb21ldGhpbmcgbGVzcyBnZW5lcmljIHRoYW4gREVCVUcsIHN1Y2ggYXMgTExWTV9ERUJVRygpLCBidXQgaXQncworLy8gZmFpcmx5IHByZXZhbGVudC4gIFNvIGZvciBub3csIHdlIHNhdmUgdGhlIGRlZmluaXRpb24gc3RhdGUgYW5kCisvLyByZXN0b3JlIGl0LgorI3ByYWdtYSBwdXNoX21hY3JvKCJERUJVRyIpCisKKy8vIGF0bGJhc2UuaCBoYXMgdG8gY29tZSBiZWZvcmUgd2luZG93cy5oCisjaW5jbHVkZSA8YXRsYmFzZS5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworLy8gRElBIGhlYWRlcnMgbXVzdCBjb21lIGFmdGVyIHdpbmRvd3MgaGVhZGVycy4KKyNpbmNsdWRlIDxjdmNvbnN0Lmg+CisjaW5jbHVkZSA8ZGlhMi5oPgorI2luY2x1ZGUgPGRpYWNyZWF0ZS5oPgorCisjcHJhZ21hIHBvcF9tYWNybygiREVCVUciKQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFTVVBQT1JUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBVGFibGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBVGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTkzZmEwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFUYWJsZS5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vPT09LSBESUFUYWJsZS5oIC0gRElBIGltcGxlbWVudGF0aW9uIG9mIElQREJUYWJsZSAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFUQUJMRV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBVEFCTEVfSAorCisjaW5jbHVkZSAiRElBU3VwcG9ydC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCVGFibGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBESUFUYWJsZSA6IHB1YmxpYyBJUERCVGFibGUgeworcHVibGljOgorICBleHBsaWNpdCBESUFUYWJsZShDQ29tUHRyPElEaWFUYWJsZT4gRGlhVGFibGUpOworCisgIHVpbnQzMl90IGdldEl0ZW1Db3VudCgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFBEQl9UYWJsZVR5cGUgZ2V0VGFibGVUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIENDb21QdHI8SURpYVRhYmxlPiBUYWJsZTsKK307Cit9Cit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQVRBQkxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTg0M2UwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFVdGlscy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vPT09LSBESUFVdGlscy5oIC0gVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCBESUEgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFVVElMU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBVVRJTFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29udmVydFVURi5oIgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT2JqPgorc3RkOjpzdHJpbmcgaW52b2tlQnN0ck1ldGhvZChPYmogJk9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFU1VMVCAoX19zdGRjYWxsIE9iajo6KkZ1bmMpKEJTVFIgKikpIHsKKyAgQ0NvbUJTVFIgU3RyMTY7CisgIEhSRVNVTFQgUmVzdWx0ID0gKE9iamVjdC4qRnVuYykoJlN0cjE2KTsKKyAgaWYgKFNfT0sgIT0gUmVzdWx0KQorICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworCisgIHN0ZDo6c3RyaW5nIFN0cjg7CisgIGxsdm06OkFycmF5UmVmPGNoYXI+IFN0ckJ5dGVzKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihTdHIxNi5tX3N0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cjE2LkJ5dGVMZW5ndGgoKSk7CisgIGxsdm06OmNvbnZlcnRVVEYxNlRvVVRGOFN0cmluZyhTdHJCeXRlcywgU3RyOCk7CisgIHJldHVybiBTdHI4OworfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFVVElMU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvR2VuZXJpY0Vycm9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvR2VuZXJpY0Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyMDVhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9HZW5lcmljRXJyb3IuaApAQCAtMCwwICsxLDQ0IEBACisvLz09PS0gRXJyb3IuaCAtIHN5c3RlbV9lcnJvciBleHRlbnNpb25zIGZvciBQREIgLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9FUlJPUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9FUlJPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CisKK2VudW0gY2xhc3MgZ2VuZXJpY19lcnJvcl9jb2RlIHsKKyAgaW52YWxpZF9wYXRoID0gMSwKKyAgZGlhX3Nka19ub3RfcHJlc2VudCwKKyAgdHlwZV9zZXJ2ZXJfbm90X2ZvdW5kLAorICB1bnNwZWNpZmllZCwKK307CisKKy8vLyBCYXNlIGNsYXNzIGZvciBlcnJvcnMgb3JpZ2luYXRpbmcgd2hlbiBwYXJzaW5nIHJhdyBQREIgZmlsZXMKK2NsYXNzIEdlbmVyaWNFcnJvciA6IHB1YmxpYyBFcnJvckluZm88R2VuZXJpY0Vycm9yPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworICBHZW5lcmljRXJyb3IoZ2VuZXJpY19lcnJvcl9jb2RlIEMpOworICBHZW5lcmljRXJyb3IoU3RyaW5nUmVmIENvbnRleHQpOworICBHZW5lcmljRXJyb3IoZ2VuZXJpY19lcnJvcl9jb2RlIEMsIFN0cmluZ1JlZiBDb250ZXh0KTsKKworICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworICBTdHJpbmdSZWYgZ2V0RXJyb3JNZXNzYWdlKCkgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBjb252ZXJ0VG9FcnJvckNvZGUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgRXJyTXNnOworICBnZW5lcmljX2Vycm9yX2NvZGUgQ29kZTsKK307Cit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCRGF0YVN0cmVhbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0lQREJEYXRhU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdiNWEwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCRGF0YVN0cmVhbS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vPT09LSBJUERCRGF0YVN0cmVhbS5oIC0gYmFzZSBpbnRlcmZhY2UgZm9yIGNoaWxkIGVudW1lcmF0b3IgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0lQREJEQVRBU1RSRUFNX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0lQREJEQVRBU1RSRUFNX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CisKKy8vLyBJUERCRGF0YVN0cmVhbSBkZWZpbmVzIGFuIGludGVyZmFjZSB1c2VkIHRvIHJlcHJlc2VudCBhIHN0cmVhbSBjb25zaXN0aW5nCisvLy8gb2YgYSBuYW1lIGFuZCBhIHNlcmllcyBvZiByZWNvcmRzIHdob3NlIGZvcm1hdHMgZGVwZW5kIG9uIHRoZSBwYXJ0aWN1bGFyCisvLy8gc3RyZWFtIHR5cGUuCitjbGFzcyBJUERCRGF0YVN0cmVhbSB7CitwdWJsaWM6CisgIHVzaW5nIFJlY29yZFR5cGUgPSBTbWFsbFZlY3Rvcjx1aW50OF90LCAzMj47CisKKyAgdmlydHVhbCB+SVBEQkRhdGFTdHJlYW0oKTsKKworICB2aXJ0dWFsIHVpbnQzMl90IGdldFJlY29yZENvdW50KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldE5hbWUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgT3B0aW9uYWw8UmVjb3JkVHlwZT4gZ2V0SXRlbUF0SW5kZXgodWludDMyX3QgSW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGdldE5leHQoUmVjb3JkVHlwZSAmUmVjb3JkKSA9IDA7CisgIHZpcnR1YWwgdm9pZCByZXNldCgpID0gMDsKKyAgdmlydHVhbCBJUERCRGF0YVN0cmVhbSAqY2xvbmUoKSBjb25zdCA9IDA7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgcGRiCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX0lQREJEQVRBU1RSRUFNX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCRW51bUNoaWxkcmVuLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQkVudW1DaGlsZHJlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YjdkOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQkVudW1DaGlsZHJlbi5oCkBAIC0wLDAgKzEsMzYgQEAKKy8vPT09LSBJUERCRW51bUNoaWxkcmVuLmggLSBiYXNlIGludGVyZmFjZSBmb3IgY2hpbGQgZW51bWVyYXRvciAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0lQREJFTlVNQ0hJTERSRU5fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfSVBEQkVOVU1DSElMRFJFTl9ICisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGlsZFR5cGU+IGNsYXNzIElQREJFbnVtQ2hpbGRyZW4geworcHVibGljOgorICB1c2luZyBDaGlsZFR5cGVQdHIgPSBzdGQ6OnVuaXF1ZV9wdHI8Q2hpbGRUeXBlPjsKKyAgdXNpbmcgTXlUeXBlID0gSVBEQkVudW1DaGlsZHJlbjxDaGlsZFR5cGU+OworCisgIHZpcnR1YWwgfklQREJFbnVtQ2hpbGRyZW4oKSA9IGRlZmF1bHQ7CisKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRDaGlsZENvdW50KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENoaWxkVHlwZVB0ciBnZXRDaGlsZEF0SW5kZXgodWludDMyX3QgSW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDaGlsZFR5cGVQdHIgZ2V0TmV4dCgpID0gMDsKKyAgdmlydHVhbCB2b2lkIHJlc2V0KCkgPSAwOworICB2aXJ0dWFsIE15VHlwZSAqY2xvbmUoKSBjb25zdCA9IDA7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgcGRiCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX0lQREJFTlVNQ0hJTERSRU5fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0lQREJJbmplY3RlZFNvdXJjZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0lQREJJbmplY3RlZFNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NWQ2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQkluamVjdGVkU291cmNlLmgKQEAgLTAsMCArMSw0MiBAQAorLy89PT0tIElQREJJbmplY3RlZFNvdXJjZS5oIC0gYmFzZSBjbGFzcyBmb3IgUERCIGluamVjdGVkIGZpbGUgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfSVBEQklOSkVDVEVEU09VUkNFX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0lQREJJTkpFQ1RFRFNPVVJDRV9ICisKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIHJhd19vc3RyZWFtOworCituYW1lc3BhY2UgcGRiIHsKKworLy8vIElQREJJbmplY3RlZFNvdXJjZSBkZWZpbmVzIGFuIGludGVyZmFjZSB1c2VkIHRvIHJlcHJlc2VudCBzb3VyY2UgZmlsZXMKKy8vLyB3aGljaCB3ZXJlIGluamVjdGVkIGRpcmVjdGx5IGludG8gdGhlIFBEQiBmaWxlIGR1cmluZyB0aGUgY29tcGlsYXRpb24KKy8vLyBwcm9jZXNzLiAgVGhpcyBpcyB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gYWRkIG5hdHZpcyBmaWxlcyB0byBhIFBEQiwgYnV0CisvLy8gaW4gdGhlb3J5IGNvdWxkIGJlIHVzZWQgdG8gYWRkIGFyYml0cmFyeSBzb3VyY2UgY29kZS4KK2NsYXNzIElQREJJbmplY3RlZFNvdXJjZSB7CitwdWJsaWM6CisgIHZpcnR1YWwgfklQREJJbmplY3RlZFNvdXJjZSgpOworCisgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q3JjMzIoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDY0X3QgZ2V0Q29kZUJ5dGVTaXplKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEZpbGVOYW1lKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldE9iamVjdEZpbGVOYW1lKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldFZpcnR1YWxGaWxlTmFtZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBQREJfU291cmNlQ29tcHJlc3Npb24gZ2V0Q29tcHJlc3Npb24oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0Q29kZSgpIGNvbnN0ID0gMDsKK307Cit9IC8vIG5hbWVzcGFjZSBwZGIKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9JUERCSU5KRUNURURTT1VSQ0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0lQREJMaW5lTnVtYmVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQkxpbmVOdW1iZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjAwODBmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0lQREJMaW5lTnVtYmVyLmgKQEAgLTAsMCArMSwzNyBAQAorLy89PT0tIElQREJMaW5lTnVtYmVyLmggLSBiYXNlIGludGVyZmFjZSBmb3IgUERCIGxpbmUgbm8uIGluZm8gLS0tKi0gQysrLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfSVBEQkxJTkVOVU1CRVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfSVBEQkxJTkVOVU1CRVJfSAorCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBJUERCTGluZU51bWJlciB7CitwdWJsaWM6CisgIHZpcnR1YWwgfklQREJMaW5lTnVtYmVyKCk7CisKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRMaW5lTnVtYmVyKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldExpbmVOdW1iZXJFbmQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q29sdW1uTnVtYmVyKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldENvbHVtbk51bWJlckVuZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRBZGRyZXNzU2VjdGlvbigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRBZGRyZXNzT2Zmc2V0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFJlbGF0aXZlVmlydHVhbEFkZHJlc3MoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDY0X3QgZ2V0VmlydHVhbEFkZHJlc3MoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0TGVuZ3RoKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFNvdXJjZUZpbGVJZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRDb21waWxhbmRJZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzU3RhdGVtZW50KCkgY29uc3QgPSAwOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQlJhd1N5bWJvbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0lQREJSYXdTeW1ib2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2IyZWFhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0lQREJSYXdTeW1ib2wuaApAQCAtMCwwICsxLDI0MyBAQAorLy89PT0tIElQREJSYXdTeW1ib2wuaCAtIGJhc2UgaW50ZXJmYWNlIGZvciBQREIgc3ltYm9sIHR5cGVzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfSVBEQlJBV1NZTUJPTF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9JUERCUkFXU1lNQk9MX0gKKworI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xUeXBlVlRhYmxlOworY2xhc3MgUERCU3ltYm9sVHlwZVZUYWJsZVNoYXBlOworCisvLy8gSVBEQlJhd1N5bWJvbCBkZWZpbmVzIGFuIGludGVyZmFjZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgc3ltYm9sLgorLy8vIEl0IGV4cG9zZXMgYSBtb25vbGl0aGljIGludGVyZmFjZSBjb25zaXN0aW5nIG9mIGFjY2Vzc29ycyBmb3IgdGhlIHVuaW9uIG9mCisvLy8gYWxsIHByb3BlcnRpZXMgdGhhdCBhcmUgdmFsaWQgZm9yIGFueSBzeW1ib2wgdHlwZS4gIFRoaXMgaW50ZXJmYWNlIGlzIHRoZW4KKy8vLyB3cmFwcGVkIGJ5IGEgY29uY3JldGUgY2xhc3Mgd2hpY2ggZXhwb3NlcyBvbmx5IHRob3NlIHNldCBvZiBtZXRob2RzIHZhbGlkCisvLy8gZm9yIHRoaXMgcGFydGljdWxhciBzeW1ib2wgdHlwZS4gIFNlZSBQREJTeW1ib2wuaCBmb3IgbW9yZSBkZXRhaWxzLgorY2xhc3MgSVBEQlJhd1N5bWJvbCB7CitwdWJsaWM6CisgIHZpcnR1YWwgfklQREJSYXdTeW1ib2woKTsKKworICB2aXJ0dWFsIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIGludCBJbmRlbnQpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgIGZpbmRDaGlsZHJlbihQREJfU3ltVHlwZSBUeXBlKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICBmaW5kQ2hpbGRyZW4oUERCX1N5bVR5cGUgVHlwZSwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICBQREJfTmFtZVNlYXJjaEZsYWdzIEZsYWdzKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgZmluZENoaWxkcmVuQnlBZGRyKFBEQl9TeW1UeXBlIFR5cGUsIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNlY3Rpb24sIHVpbnQzMl90IE9mZnNldCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgIGZpbmRDaGlsZHJlbkJ5VkEoUERCX1N5bVR5cGUgVHlwZSwgU3RyaW5nUmVmIE5hbWUsIFBEQl9OYW1lU2VhcmNoRmxhZ3MgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVkEpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICBmaW5kQ2hpbGRyZW5CeVJWQShQREJfU3ltVHlwZSBUeXBlLCBTdHJpbmdSZWYgTmFtZSwgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUlZBKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICBmaW5kSW5saW5lRnJhbWVzQnlBZGRyKHVpbnQzMl90IFNlY3Rpb24sIHVpbnQzMl90IE9mZnNldCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgIGZpbmRJbmxpbmVGcmFtZXNCeVJWQSh1aW50MzJfdCBSVkEpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICBmaW5kSW5saW5lRnJhbWVzQnlWQSh1aW50NjRfdCBWQSkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtTGluZU51bWJlcnM+IGZpbmRJbmxpbmVlTGluZXMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtTGluZU51bWJlcnM+CisgIGZpbmRJbmxpbmVlTGluZXNCeUFkZHIodWludDMyX3QgU2VjdGlvbiwgdWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IExlbmd0aCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPgorICBmaW5kSW5saW5lZUxpbmVzQnlSVkEodWludDMyX3QgUlZBLCB1aW50MzJfdCBMZW5ndGgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1MaW5lTnVtYmVycz4KKyAgZmluZElubGluZWVMaW5lc0J5VkEodWludDY0X3QgVkEsIHVpbnQzMl90IExlbmd0aCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgdm9pZCBnZXREYXRhQnl0ZXMobGx2bTo6U21hbGxWZWN0b3I8dWludDhfdCwgMzI+ICZieXRlcykgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgZ2V0QmFja0VuZFZlcnNpb24oVmVyc2lvbkluZm8gJlZlcnNpb24pIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBQREJfTWVtYmVyQWNjZXNzIGdldEFjY2VzcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRBZGRyZXNzT2Zmc2V0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldEFkZHJlc3NTZWN0aW9uKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldEFnZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRBcnJheUluZGV4VHlwZUlkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldEJhc2VEYXRhT2Zmc2V0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldEJhc2VEYXRhU2xvdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRCYXNlU3ltYm9sSWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgUERCX0J1aWx0aW5UeXBlIGdldEJ1aWx0aW5UeXBlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldEJpdFBvc2l0aW9uKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIFBEQl9DYWxsaW5nQ29udiBnZXRDYWxsaW5nQ29udmVudGlvbigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRDbGFzc1BhcmVudElkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldENvbXBpbGVyTmFtZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRDb3VudCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRDb3VudExpdmVSYW5nZXMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBnZXRGcm9udEVuZFZlcnNpb24oVmVyc2lvbkluZm8gJlZlcnNpb24pIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBQREJfTGFuZyBnZXRMYW5ndWFnZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRMZXhpY2FsUGFyZW50SWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0TGl2ZVJhbmdlU3RhcnRBZGRyZXNzT2Zmc2V0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldExpdmVSYW5nZVN0YXJ0QWRkcmVzc1NlY3Rpb24oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0TGl2ZVJhbmdlU3RhcnRSZWxhdGl2ZVZpcnR1YWxBZGRyZXNzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGNvZGV2aWV3OjpSZWdpc3RlcklkIGdldExvY2FsQmFzZVBvaW50ZXJSZWdpc3RlcklkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldExvd2VyQm91bmRJZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRNZW1vcnlTcGFjZUtpbmQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0TmFtZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXROdW1iZXJPZkFjY2VsZXJhdG9yUG9pbnRlclRhZ3MoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0TnVtYmVyT2ZDb2x1bW5zKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldE51bWJlck9mTW9kaWZpZXJzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldE51bWJlck9mUmVnaXN0ZXJJbmRpY2VzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldE51bWJlck9mUm93cygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRPYmplY3RGaWxlTmFtZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRPZW1JZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRPZW1TeW1ib2xJZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRPZmZzZXRJblVkdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBQREJfQ3B1IGdldFBsYXRmb3JtKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFJhbmsoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgY29kZXZpZXc6OlJlZ2lzdGVySWQgZ2V0UmVnaXN0ZXJJZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRSZWdpc3RlclR5cGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0UmVsYXRpdmVWaXJ0dWFsQWRkcmVzcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRTYW1wbGVyU2xvdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRTaWduYXR1cmUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0U2l6ZUluVWR0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFNsb3QoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0U291cmNlRmlsZU5hbWUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElQREJMaW5lTnVtYmVyPgorICBnZXRTcmNMaW5lT25UeXBlRGVmbigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJpZGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3ViVHlwZUlkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldFN5bWJvbHNGaWxlTmFtZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRTeW1JbmRleElkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFRhcmdldE9mZnNldCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRUYXJnZXRSZWxhdGl2ZVZpcnR1YWxBZGRyZXNzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ2NF90IGdldFRhcmdldFZpcnR1YWxBZGRyZXNzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFRhcmdldFNlY3Rpb24oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0VGV4dHVyZVNsb3QoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0VGltZVN0YW1wKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFRva2VuKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFR5cGVJZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRVYXZTbG90KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldFVuZGVjb3JhdGVkTmFtZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRVbmRlY29yYXRlZE5hbWVFeChQREJfVW5kbmFtZUZsYWdzIEZsYWdzKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0VW5tb2RpZmllZFR5cGVJZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRVcHBlckJvdW5kSWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgVmFyaWFudCBnZXRWYWx1ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRWaXJ0dWFsQmFzZURpc3BJbmRleCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRWaXJ0dWFsQmFzZU9mZnNldCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sVHlwZUJ1aWx0aW4+CisgIGdldFZpcnR1YWxCYXNlVGFibGVUeXBlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFZpcnR1YWxUYWJsZVNoYXBlSWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgUERCX0RhdGFLaW5kIGdldERhdGFLaW5kKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIFBEQl9TeW1UeXBlIGdldFN5bVRhZygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBjb2Rldmlldzo6R1VJRCBnZXRHdWlkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludDMyX3QgZ2V0T2Zmc2V0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludDMyX3QgZ2V0VGhpc0FkanVzdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IGdldFZpcnR1YWxCYXNlUG9pbnRlck9mZnNldCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBQREJfTG9jVHlwZSBnZXRMb2NhdGlvblR5cGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgUERCX01hY2hpbmUgZ2V0TWFjaGluZVR5cGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgY29kZXZpZXc6OlRodW5rT3JkaW5hbCBnZXRUaHVua09yZGluYWwoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDY0X3QgZ2V0TGVuZ3RoKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ2NF90IGdldExpdmVSYW5nZUxlbmd0aCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50NjRfdCBnZXRWaXJ0dWFsQWRkcmVzcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBQREJfVWR0VHlwZSBnZXRVZHRLaW5kKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzQ29uc3RydWN0b3IoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNDdXN0b21DYWxsaW5nQ29udmVudGlvbigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0ZhclJldHVybigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzQ29kZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzQ29tcGlsZXJHZW5lcmF0ZWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0NvbnN0VHlwZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzRWRpdEFuZENvbnRpbnVlRW5hYmxlZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzRnVuY3Rpb24oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBnZXRBZGRyZXNzVGFrZW4oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBnZXROb1N0YWNrT3JkZXJpbmcoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNBbGxvY2EoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNBc3NpZ25tZW50T3BlcmF0b3IoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNDVHlwZXMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNDYXN0T3BlcmF0b3IoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNEZWJ1Z0luZm8oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNFSCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0VIYSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0ZyYW1lUG9pbnRlcigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0lubEFzbSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0lubGluZUF0dHJpYnV0ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0ludGVycnVwdFJldHVybigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0xvbmdKdW1wKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzTWFuYWdlZENvZGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNOZXN0ZWRUeXBlcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc05vSW5saW5lQXR0cmlidXRlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzTm9SZXR1cm5BdHRyaWJ1dGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNPcHRpbWl6ZWRDb2RlRGVidWdJbmZvKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzT3ZlcmxvYWRlZE9wZXJhdG9yKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzU0VIKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzU2VjdXJpdHlDaGVja3MoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNTZXRKdW1wKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzU3RyaWN0R1NDaGVjaygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzQWNjZWxlcmF0b3JHcm91cFNoYXJlZExvY2FsKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNBY2NlbGVyYXRvclBvaW50ZXJUYWdMaXZlUmFuZ2UoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0FjY2VsZXJhdG9yU3R1YkZ1bmN0aW9uKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNBZ2dyZWdhdGVkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNJbnRyb1ZpcnR1YWxGdW5jdGlvbigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzQ1ZUQ0lMKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNDb25zdHJ1Y3RvclZpcnR1YWxCYXNlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNDeHhSZXR1cm5VZHQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0RhdGFBbGlnbmVkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNITFNMRGF0YSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzSG90cGF0Y2hhYmxlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNJbmRpcmVjdFZpcnR1YWxCYXNlQ2xhc3MoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0ludGVyZmFjZVVkdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzSW50cmluc2ljKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNMVENHKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNMb2NhdGlvbkNvbnRyb2xGbG93RGVwZW5kZW50KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNNU0lMTmV0bW9kdWxlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNNYXRyaXhSb3dNYWpvcigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzTWFuYWdlZENvZGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc01TSUxDb2RlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNNdWx0aXBsZUluaGVyaXRhbmNlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNOYWtlZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzTmVzdGVkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNPcHRpbWl6ZWRBd2F5KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNQYWNrZWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1BvaW50ZXJCYXNlZE9uU3ltYm9sVmFsdWUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1BvaW50ZXJUb0RhdGFNZW1iZXIoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1BvaW50ZXJUb01lbWJlckZ1bmN0aW9uKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNQdXJlVmlydHVhbCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzUlZhbHVlUmVmZXJlbmNlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNSZWZVZHQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1JlZmVyZW5jZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzUmVzdHJpY3RlZFR5cGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1JldHVyblZhbHVlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNTYWZlQnVmZmVycygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzU2NvcGVkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNTZGwoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1NpbmdsZUluaGVyaXRhbmNlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNTcGxpdHRlZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzU3RhdGljKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzUHJpdmF0ZVN5bWJvbHMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1VuYWxpZ25lZFR5cGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1VucmVhY2hlZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzVmFsdWVVZHQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1ZpcnR1YWwoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1ZpcnR1YWxCYXNlQ2xhc3MoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1ZpcnR1YWxJbmhlcml0YW5jZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzVm9sYXRpbGVUeXBlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgd2FzSW5saW5lZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRVbnVzZWQoKSBjb25zdCA9IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBwZGIKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQlNlY3Rpb25Db250cmliLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQlNlY3Rpb25Db250cmliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkYTYyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCU2VjdGlvbkNvbnRyaWIuaApAQCAtMCwwICsxLDUwIEBACisvLz09LSBJUERCU2VjdGlvbkNvbnRyaWIuaCAtIEludGVyZmFjZXMgZm9yIFBEQiBTZWN0aW9uQ29udHJpYnMgLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9JUERCU0VDVElPTkNPTlRSSUJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfSVBEQlNFQ1RJT05DT05UUklCX0gKKworI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworCisvLy8gSVBEQlNlY3Rpb25Db250cmliIGRlZmluZXMgYW4gaW50ZXJmYWNlIHVzZWQgdG8gcmVwcmVzZW50IHNlY3Rpb24KKy8vLyBjb250cmlidXRpb25zIHdob3NlIGluZm9ybWF0aW9uIGFyZSBzdG9yZWQgaW4gdGhlIFBEQi4KK2NsYXNzIElQREJTZWN0aW9uQ29udHJpYiB7CitwdWJsaWM6CisgIHZpcnR1YWwgfklQREJTZWN0aW9uQ29udHJpYigpOworCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbENvbXBpbGFuZD4gZ2V0Q29tcGlsYW5kKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldEFkZHJlc3NTZWN0aW9uKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldEFkZHJlc3NPZmZzZXQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0UmVsYXRpdmVWaXJ0dWFsQWRkcmVzcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50NjRfdCBnZXRWaXJ0dWFsQWRkcmVzcygpIGNvbnN0ICA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0TGVuZ3RoKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNOb3RQYWdlZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0NvZGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNDb2RlMTZCaXQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNJbml0aWFsaXplZERhdGEoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNVbmluaXRpYWxpemVkRGF0YSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzUmVtb3ZlZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0NvbWRhdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzRGlzY2FyZGFibGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc05vdENhY2hlZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzU2hhcmVkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNFeGVjdXRhYmxlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNSZWFkYWJsZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzV3JpdGFibGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGF0YUNyYzMyKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFJlbG9jYXRpb25zQ3JjMzIoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q29tcGlsYW5kSWQoKSBjb25zdCA9IDA7Cit9OworfQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX0lQREJTRUNUSU9OQ09OVFJJQl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQlNlc3Npb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCU2Vzc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NWQ2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQlNlc3Npb24uaApAQCAtMCwwICsxLDkyIEBACisvLz09PS0gSVBEQlNlc3Npb24uaCAtIGJhc2UgaW50ZXJmYWNlIGZvciBhIFBEQiBzeW1ib2wgY29udGV4dCAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9JUERCU0VTU0lPTl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9JUERCU0VTU0lPTl9ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIFBEQlN5bWJvbENvbXBpbGFuZDsKK2NsYXNzIFBEQlN5bWJvbEV4ZTsKKworLy8vIElQREJTZXNzaW9uIGRlZmluZXMgYW4gaW50ZXJmYWNlIHVzZWQgdG8gcHJvdmlkZSBhIGNvbnRleHQgZm9yIHF1ZXJ5aW5nCisvLy8gZGVidWcgaW5mb3JtYXRpb24gZnJvbSBhIGRlYnVnIGRhdGEgc291cmNlIChmb3IgZXhhbXBsZSwgYSBQREIpLgorY2xhc3MgSVBEQlNlc3Npb24geworcHVibGljOgorICB2aXJ0dWFsIH5JUERCU2Vzc2lvbigpOworCisgIHZpcnR1YWwgdWludDY0X3QgZ2V0TG9hZEFkZHJlc3MoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBzZXRMb2FkQWRkcmVzcyh1aW50NjRfdCBBZGRyZXNzKSA9IDA7CisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbEV4ZT4gZ2V0R2xvYmFsU2NvcGUoKSA9IDA7CisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbD4gZ2V0U3ltYm9sQnlJZCh1aW50MzJfdCBTeW1ib2xJZCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgYm9vbCBhZGRyZXNzRm9yVkEodWludDY0X3QgVkEsIHVpbnQzMl90ICZTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGFkZHJlc3NGb3JSVkEodWludDMyX3QgUlZBLCB1aW50MzJfdCAmU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCkgY29uc3QgPSAwOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGQ6OnVuaXF1ZV9wdHI8VD4gZ2V0Q29uY3JldGVTeW1ib2xCeUlkKHVpbnQzMl90IFN5bWJvbElkKSBjb25zdCB7CisgICAgcmV0dXJuIHVuaXF1ZV9keW5fY2FzdF9vcl9udWxsPFQ+KGdldFN5bWJvbEJ5SWQoU3ltYm9sSWQpKTsKKyAgfQorCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbD4KKyAgZmluZFN5bWJvbEJ5QWRkcmVzcyh1aW50NjRfdCBBZGRyZXNzLCBQREJfU3ltVHlwZSBUeXBlKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1MaW5lTnVtYmVycz4KKyAgZmluZExpbmVOdW1iZXJzKGNvbnN0IFBEQlN5bWJvbENvbXBpbGFuZCAmQ29tcGlsYW5kLAorICAgICAgICAgICAgICAgICAgY29uc3QgSVBEQlNvdXJjZUZpbGUgJkZpbGUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1MaW5lTnVtYmVycz4KKyAgZmluZExpbmVOdW1iZXJzQnlBZGRyZXNzKHVpbnQ2NF90IEFkZHJlc3MsIHVpbnQzMl90IExlbmd0aCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPgorICBmaW5kTGluZU51bWJlcnNCeVJWQSh1aW50MzJfdCBSVkEsIHVpbnQzMl90IExlbmd0aCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPgorICBmaW5kTGluZU51bWJlcnNCeVNlY3RPZmZzZXQodWludDMyX3QgU2VjdGlvbiwgdWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTGVuZ3RoKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1Tb3VyY2VGaWxlcz4KKyAgZmluZFNvdXJjZUZpbGVzKGNvbnN0IFBEQlN5bWJvbENvbXBpbGFuZCAqQ29tcGlsYW5kLCBsbHZtOjpTdHJpbmdSZWYgUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgIFBEQl9OYW1lU2VhcmNoRmxhZ3MgRmxhZ3MpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlNvdXJjZUZpbGU+CisgIGZpbmRPbmVTb3VyY2VGaWxlKGNvbnN0IFBEQlN5bWJvbENvbXBpbGFuZCAqQ29tcGlsYW5kLAorICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncykgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUNoaWxkcmVuPFBEQlN5bWJvbENvbXBpbGFuZD4+CisgIGZpbmRDb21waWxhbmRzRm9yU291cmNlRmlsZShsbHZtOjpTdHJpbmdSZWYgUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEQl9OYW1lU2VhcmNoRmxhZ3MgRmxhZ3MpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sQ29tcGlsYW5kPgorICBmaW5kT25lQ29tcGlsYW5kRm9yU291cmNlRmlsZShsbHZtOjpTdHJpbmdSZWYgUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncykgY29uc3QgPSAwOworCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU291cmNlRmlsZXM+IGdldEFsbFNvdXJjZUZpbGVzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVNvdXJjZUZpbGVzPgorICBnZXRTb3VyY2VGaWxlc0ZvckNvbXBpbGFuZChjb25zdCBQREJTeW1ib2xDb21waWxhbmQgJkNvbXBpbGFuZCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCU291cmNlRmlsZT4KKyAgZ2V0U291cmNlRmlsZUJ5SWQodWludDMyX3QgRmlsZUlkKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1EYXRhU3RyZWFtcz4gZ2V0RGVidWdTdHJlYW1zKCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtVGFibGVzPiBnZXRFbnVtVGFibGVzKCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtSW5qZWN0ZWRTb3VyY2VzPgorICBnZXRJbmplY3RlZFNvdXJjZXMoKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TZWN0aW9uQ29udHJpYnM+CisgIGdldFNlY3Rpb25Db250cmlicygpIGNvbnN0ID0gMDsKK307Cit9IC8vIG5hbWVzcGFjZSBwZGIKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQlNvdXJjZUZpbGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCU291cmNlRmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NzZjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQlNvdXJjZUZpbGUuaApAQCAtMCwwICsxLDQwIEBACisvLz09PS0gSVBEQlNvdXJjZUZpbGUuaCAtIGJhc2UgaW50ZXJmYWNlIGZvciBhIFBEQiBzb3VyY2UgZmlsZSAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9JUERCU09VUkNFRklMRV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9JUERCU09VUkNFRklMRV9ICisKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIHJhd19vc3RyZWFtOworCituYW1lc3BhY2UgcGRiIHsKKworLy8vIElQREJTb3VyY2VGaWxlIGRlZmluZXMgYW4gaW50ZXJmYWNlIHVzZWQgdG8gcmVwcmVzZW50IHNvdXJjZSBmaWxlcyB3aG9zZQorLy8vIGluZm9ybWF0aW9uIGFyZSBzdG9yZWQgaW4gdGhlIFBEQi4KK2NsYXNzIElQREJTb3VyY2VGaWxlIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+SVBEQlNvdXJjZUZpbGUoKTsKKworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBpbnQgSW5kZW50KSBjb25zdDsKKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEZpbGVOYW1lKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFVuaXF1ZUlkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldENoZWNrc3VtKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIFBEQl9DaGVja3N1bSBnZXRDaGVja3N1bVR5cGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtQ2hpbGRyZW48UERCU3ltYm9sQ29tcGlsYW5kPj4KKyAgZ2V0Q29tcGlsYW5kcygpIGNvbnN0ID0gMDsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0lQREJUYWJsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0lQREJUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NjFjNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQlRhYmxlLmgKQEAgLTAsMCArMSwyOCBAQAorLy89PT0tIElQREJUYWJsZS5oIC0gQmFzZSBJbnRlcmZhY2UgZm9yIGEgUERCIFN5bWJvbCBDb250ZXh0IC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfSVBEQlRBQkxFX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0lQREJUQUJMRV9ICisKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIElQREJUYWJsZSB7CitwdWJsaWM6CisgIHZpcnR1YWwgfklQREJUYWJsZSgpOworCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0TmFtZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRJdGVtQ291bnQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgUERCX1RhYmxlVHlwZSBnZXRUYWJsZVR5cGUoKSBjb25zdCA9IDA7Cit9OworfQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX0lQREJUQUJMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0RiaU1vZHVsZURlc2NyaXB0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRGJpTW9kdWxlRGVzY3JpcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMDBmNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0RiaU1vZHVsZURlc2NyaXB0b3IuaApAQCAtMCwwICsxLDcwIEBACisvLz09PS0gRGJpTW9kdWxlRGVzY3JpcHRvci5oIC0gUERCIG1vZHVsZSBpbmZvcm1hdGlvbiAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfREJJTU9EVUxFREVTQ1JJUFRPUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfREJJTU9EVUxFREVTQ1JJUFRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUFycmF5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBEYmlNb2R1bGVEZXNjcmlwdG9yIHsKKyAgZnJpZW5kIGNsYXNzIERiaVN0cmVhbUJ1aWxkZXI7CisKK3B1YmxpYzoKKyAgRGJpTW9kdWxlRGVzY3JpcHRvcigpOworICBEYmlNb2R1bGVEZXNjcmlwdG9yKGNvbnN0IERiaU1vZHVsZURlc2NyaXB0b3IgJkluZm8pOworICB+RGJpTW9kdWxlRGVzY3JpcHRvcigpOworCisgIHN0YXRpYyBFcnJvciBpbml0aWFsaXplKEJpbmFyeVN0cmVhbVJlZiBTdHJlYW0sIERiaU1vZHVsZURlc2NyaXB0b3IgJkluZm8pOworCisgIGJvb2wgaGFzRUNJbmZvKCkgY29uc3Q7CisgIHVpbnQxNl90IGdldFR5cGVTZXJ2ZXJJbmRleCgpIGNvbnN0OworICB1aW50MTZfdCBnZXRNb2R1bGVTdHJlYW1JbmRleCgpIGNvbnN0OworICB1aW50MzJfdCBnZXRTeW1ib2xEZWJ1Z0luZm9CeXRlU2l6ZSgpIGNvbnN0OworICB1aW50MzJfdCBnZXRDMTFMaW5lSW5mb0J5dGVTaXplKCkgY29uc3Q7CisgIHVpbnQzMl90IGdldEMxM0xpbmVJbmZvQnl0ZVNpemUoKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0TnVtYmVyT2ZGaWxlcygpIGNvbnN0OworICB1aW50MzJfdCBnZXRTb3VyY2VGaWxlTmFtZUluZGV4KCkgY29uc3Q7CisgIHVpbnQzMl90IGdldFBkYkZpbGVQYXRoTmFtZUluZGV4KCkgY29uc3Q7CisKKyAgU3RyaW5nUmVmIGdldE1vZHVsZU5hbWUoKSBjb25zdDsKKyAgU3RyaW5nUmVmIGdldE9iakZpbGVOYW1lKCkgY29uc3Q7CisKKyAgdWludDMyX3QgZ2V0UmVjb3JkTGVuZ3RoKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIFN0cmluZ1JlZiBNb2R1bGVOYW1lOworICBTdHJpbmdSZWYgT2JqRmlsZU5hbWU7CisgIGNvbnN0IE1vZHVsZUluZm9IZWFkZXIgKkxheW91dCA9IG51bGxwdHI7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgcGRiCisKK3RlbXBsYXRlIDw+IHN0cnVjdCBWYXJTdHJlYW1BcnJheUV4dHJhY3RvcjxwZGI6OkRiaU1vZHVsZURlc2NyaXB0b3I+IHsKKyAgRXJyb3Igb3BlcmF0b3IoKShCaW5hcnlTdHJlYW1SZWYgU3RyZWFtLCB1aW50MzJfdCAmTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgIHBkYjo6RGJpTW9kdWxlRGVzY3JpcHRvciAmSW5mbykgeworICAgIGlmIChhdXRvIEVDID0gcGRiOjpEYmlNb2R1bGVEZXNjcmlwdG9yOjppbml0aWFsaXplKFN0cmVhbSwgSW5mbykpCisgICAgICByZXR1cm4gRUM7CisgICAgTGVuZ3RoID0gSW5mby5nZXRSZWNvcmRMZW5ndGgoKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfREJJTU9EVUxFREVTQ1JJUFRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0RiaU1vZHVsZURlc2NyaXB0b3JCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0RiaU1vZHVsZURlc2NyaXB0b3JCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkxOGE1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRGJpTW9kdWxlRGVzY3JpcHRvckJ1aWxkZXIuaApAQCAtMCwwICsxLDEwNSBAQAorLy89PT0tIERiaU1vZHVsZURlc2NyaXB0b3JCdWlsZGVyLmggLSBQREIgbW9kdWxlIGluZm9ybWF0aW9uIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUkFXX0RCSU1PRFVMRURFU0NSSVBUT1JCVUlMREVSX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1JBV19EQklNT0RVTEVERVNDUklQVE9SQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0lubGluZWVMaW5lc1N1YnNlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0xpbmVzU3Vic2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvblJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUmF3VHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEJpbmFyeVN0cmVhbVdyaXRlcjsKKworbmFtZXNwYWNlIGNvZGV2aWV3IHsKK2NsYXNzIERlYnVnU3Vic2VjdGlvblJlY29yZEJ1aWxkZXI7Cit9CisKK25hbWVzcGFjZSBtc2YgeworY2xhc3MgTVNGQnVpbGRlcjsKK3N0cnVjdCBNU0ZMYXlvdXQ7Cit9CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgRGJpTW9kdWxlRGVzY3JpcHRvckJ1aWxkZXIgeworICBmcmllbmQgY2xhc3MgRGJpU3RyZWFtQnVpbGRlcjsKKworcHVibGljOgorICBEYmlNb2R1bGVEZXNjcmlwdG9yQnVpbGRlcihTdHJpbmdSZWYgTW9kdWxlTmFtZSwgdWludDMyX3QgTW9kSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZjo6TVNGQnVpbGRlciAmTXNmKTsKKyAgfkRiaU1vZHVsZURlc2NyaXB0b3JCdWlsZGVyKCk7CisKKyAgRGJpTW9kdWxlRGVzY3JpcHRvckJ1aWxkZXIoY29uc3QgRGJpTW9kdWxlRGVzY3JpcHRvckJ1aWxkZXIgJikgPSBkZWxldGU7CisgIERiaU1vZHVsZURlc2NyaXB0b3JCdWlsZGVyICYKKyAgb3BlcmF0b3I9KGNvbnN0IERiaU1vZHVsZURlc2NyaXB0b3JCdWlsZGVyICYpID0gZGVsZXRlOworCisgIHZvaWQgc2V0UGRiRmlsZVBhdGhOSSh1aW50MzJfdCBOSSk7CisgIHZvaWQgc2V0T2JqRmlsZU5hbWUoU3RyaW5nUmVmIE5hbWUpOworICB2b2lkIGFkZFN5bWJvbChjb2Rldmlldzo6Q1ZTeW1ib2wgU3ltYm9sKTsKKworICB2b2lkCisgIGFkZERlYnVnU3Vic2VjdGlvbihzdGQ6OnNoYXJlZF9wdHI8Y29kZXZpZXc6OkRlYnVnU3Vic2VjdGlvbj4gU3Vic2VjdGlvbik7CisKKyAgdm9pZAorICBhZGREZWJ1Z1N1YnNlY3Rpb24oY29uc3QgY29kZXZpZXc6OkRlYnVnU3Vic2VjdGlvblJlY29yZCAmU3Vic2VjdGlvbkNvbnRlbnRzKTsKKworICB1aW50MTZfdCBnZXRTdHJlYW1JbmRleCgpIGNvbnN0OworICBTdHJpbmdSZWYgZ2V0TW9kdWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIE1vZHVsZU5hbWU7IH0KKyAgU3RyaW5nUmVmIGdldE9iakZpbGVOYW1lKCkgY29uc3QgeyByZXR1cm4gT2JqRmlsZU5hbWU7IH0KKworICB1bnNpZ25lZCBnZXRNb2R1bGVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIExheW91dC5Nb2Q7IH0KKworICBBcnJheVJlZjxzdGQ6OnN0cmluZz4gc291cmNlX2ZpbGVzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlQXJyYXlSZWYoU291cmNlRmlsZXMpOworICB9CisKKyAgdWludDMyX3QgY2FsY3VsYXRlU2VyaWFsaXplZExlbmd0aCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIG9mZnNldCB3aXRoaW4gdGhlIG1vZHVsZSBzeW1ib2wgc3RyZWFtIG9mIHRoZSBuZXh0IHN5bWJvbAorICAvLy8gcmVjb3JkIHBhc3NlZCB0byBhZGRTeW1ib2wuIEFkZCBmb3VyIHRvIGFjY291bnQgZm9yIHRoZSBzaWduYXR1cmUuCisgIHVpbnQzMl90IGdldE5leHRTeW1ib2xPZmZzZXQoKSBjb25zdCB7IHJldHVybiBTeW1ib2xCeXRlU2l6ZSArIDQ7IH0KKworICB2b2lkIGZpbmFsaXplKCk7CisgIEVycm9yIGZpbmFsaXplTXNmTGF5b3V0KCk7CisKKyAgRXJyb3IgY29tbWl0KEJpbmFyeVN0cmVhbVdyaXRlciAmTW9kaVdyaXRlciwgY29uc3QgbXNmOjpNU0ZMYXlvdXQgJk1zZkxheW91dCwKKyAgICAgICAgICAgICAgIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmIE1zZkJ1ZmZlcik7CisKK3ByaXZhdGU6CisgIHVpbnQzMl90IGNhbGN1bGF0ZUMxM0RlYnVnSW5mb1NpemUoKSBjb25zdDsKKworICB2b2lkIGFkZFNvdXJjZUZpbGUoU3RyaW5nUmVmIFBhdGgpOworICBtc2Y6Ok1TRkJ1aWxkZXIgJk1TRjsKKworICB1aW50MzJfdCBTeW1ib2xCeXRlU2l6ZSA9IDA7CisgIHVpbnQzMl90IFBkYkZpbGVQYXRoTkkgPSAwOworICBzdGQ6OnN0cmluZyBNb2R1bGVOYW1lOworICBzdGQ6OnN0cmluZyBPYmpGaWxlTmFtZTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFNvdXJjZUZpbGVzOworICBzdGQ6OnZlY3Rvcjxjb2Rldmlldzo6Q1ZTeW1ib2w+IFN5bWJvbHM7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGNvZGV2aWV3OjpEZWJ1Z1N1YnNlY3Rpb25SZWNvcmRCdWlsZGVyPj4KKyAgICAgIEMxM0J1aWxkZXJzOworCisgIE1vZHVsZUluZm9IZWFkZXIgTGF5b3V0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHBkYgorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1JBV19EQklNT0RVTEVERVNDUklQVE9SQlVJTERFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0RiaU1vZHVsZUxpc3QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRGJpTW9kdWxlTGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNmU3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0RiaU1vZHVsZUxpc3QuaApAQCAtMCwwICsxLDExOCBAQAorLy89PT0tIERiaU1vZHVsZUxpc3QuaCAtIFBEQiBtb2R1bGUgaW5mb3JtYXRpb24gbGlzdCAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX0RCSU1PRFVMRUxJU1RfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX0RCSU1PRFVMRUxJU1RfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRGJpTW9kdWxlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1BcnJheS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIERiaU1vZHVsZUxpc3Q7CitzdHJ1Y3QgRmlsZUluZm9TdWJzdHJlYW1IZWFkZXI7CisKK2NsYXNzIERiaU1vZHVsZVNvdXJjZUZpbGVzSXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTxEYmlNb2R1bGVTb3VyY2VGaWxlc0l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIFN0cmluZ1JlZj4geworICB1c2luZyBCYXNlVHlwZSA9CisgICAgICBpdGVyYXRvcl9mYWNhZGVfYmFzZTxEYmlNb2R1bGVTb3VyY2VGaWxlc0l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgU3RyaW5nUmVmPjsKKworcHVibGljOgorICBEYmlNb2R1bGVTb3VyY2VGaWxlc0l0ZXJhdG9yKGNvbnN0IERiaU1vZHVsZUxpc3QgJk1vZHVsZXMsIHVpbnQzMl90IE1vZGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgRmlsZWkpOworICBEYmlNb2R1bGVTb3VyY2VGaWxlc0l0ZXJhdG9yKCkgPSBkZWZhdWx0OworICBEYmlNb2R1bGVTb3VyY2VGaWxlc0l0ZXJhdG9yICYKKyAgb3BlcmF0b3I9KGNvbnN0IERiaU1vZHVsZVNvdXJjZUZpbGVzSXRlcmF0b3IgJlIpID0gZGVmYXVsdDsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgRGJpTW9kdWxlU291cmNlRmlsZXNJdGVyYXRvciAmUikgY29uc3Q7CisKKyAgY29uc3QgU3RyaW5nUmVmICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBUaGlzVmFsdWU7IH0KKyAgU3RyaW5nUmVmICZvcGVyYXRvciooKSB7IHJldHVybiBUaGlzVmFsdWU7IH0KKworICBib29sIG9wZXJhdG9yPChjb25zdCBEYmlNb2R1bGVTb3VyY2VGaWxlc0l0ZXJhdG9yICZSSFMpIGNvbnN0OworICBzdGQ6OnB0cmRpZmZfdCBvcGVyYXRvci0oY29uc3QgRGJpTW9kdWxlU291cmNlRmlsZXNJdGVyYXRvciAmUikgY29uc3Q7CisgIERiaU1vZHVsZVNvdXJjZUZpbGVzSXRlcmF0b3IgJm9wZXJhdG9yKz0oc3RkOjpwdHJkaWZmX3QgTik7CisgIERiaU1vZHVsZVNvdXJjZUZpbGVzSXRlcmF0b3IgJm9wZXJhdG9yLT0oc3RkOjpwdHJkaWZmX3QgTik7CisKK3ByaXZhdGU6CisgIHZvaWQgc2V0VmFsdWUoKTsKKworICBib29sIGlzRW5kKCkgY29uc3Q7CisgIGJvb2wgaXNDb21wYXRpYmxlKGNvbnN0IERiaU1vZHVsZVNvdXJjZUZpbGVzSXRlcmF0b3IgJlIpIGNvbnN0OworICBib29sIGlzVW5pdmVyc2FsRW5kKCkgY29uc3Q7CisKKyAgU3RyaW5nUmVmIFRoaXNWYWx1ZTsKKyAgY29uc3QgRGJpTW9kdWxlTGlzdCAqTW9kdWxlc3tudWxscHRyfTsKKyAgdWludDMyX3QgTW9kaXswfTsKKyAgdWludDE2X3QgRmlsZWl7MH07Cit9OworCitjbGFzcyBEYmlNb2R1bGVMaXN0IHsKKyAgZnJpZW5kIERiaU1vZHVsZVNvdXJjZUZpbGVzSXRlcmF0b3I7CisKK3B1YmxpYzoKKyAgRXJyb3IgaW5pdGlhbGl6ZShCaW5hcnlTdHJlYW1SZWYgTW9kSW5mbywgQmluYXJ5U3RyZWFtUmVmIEZpbGVJbmZvKTsKKworICBFeHBlY3RlZDxTdHJpbmdSZWY+IGdldEZpbGVOYW1lKHVpbnQzMl90IEluZGV4KSBjb25zdDsKKyAgdWludDMyX3QgZ2V0TW9kdWxlQ291bnQoKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0U291cmNlRmlsZUNvdW50KCkgY29uc3Q7CisgIHVpbnQxNl90IGdldFNvdXJjZUZpbGVDb3VudCh1aW50MzJfdCBNb2RpKSBjb25zdDsKKworICBpdGVyYXRvcl9yYW5nZTxEYmlNb2R1bGVTb3VyY2VGaWxlc0l0ZXJhdG9yPgorICBzb3VyY2VfZmlsZXModWludDMyX3QgTW9kaSkgY29uc3Q7CisKKyAgRGJpTW9kdWxlRGVzY3JpcHRvciBnZXRNb2R1bGVEZXNjcmlwdG9yKHVpbnQzMl90IE1vZGkpIGNvbnN0OworCitwcml2YXRlOgorICBFcnJvciBpbml0aWFsaXplTW9kSW5mbyhCaW5hcnlTdHJlYW1SZWYgTW9kSW5mbyk7CisgIEVycm9yIGluaXRpYWxpemVGaWxlSW5mbyhCaW5hcnlTdHJlYW1SZWYgRmlsZUluZm8pOworCisgIFZhclN0cmVhbUFycmF5PERiaU1vZHVsZURlc2NyaXB0b3I+IERlc2NyaXB0b3JzOworCisgIEZpeGVkU3RyZWFtQXJyYXk8c3VwcG9ydDo6bGl0dGxlMzJfdD4gRmlsZU5hbWVPZmZzZXRzOworICBGaXhlZFN0cmVhbUFycmF5PHN1cHBvcnQ6OnVsaXR0bGUxNl90PiBNb2RGaWxlQ291bnRBcnJheTsKKworICAvLyBGb3IgZWFjaCBtb2R1bGUsIHRoZXJlIGFyZSBtdWx0aXBsZSBmaWxlbmFtZXMsIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCBieQorICAvLyBrbm93aW5nIHRoZSBpbmRleCBvZiB0aGUgZmlsZS4gIEdpdmVuIHRoZSBpbmRleCBvZiB0aGUgZmlsZSwgb25lIGNhbiB1c2UKKyAgLy8gdGhhdCBhcyBhbiBvZmZzZXQgaW50byB0aGUgRmlsZU5hbWVPZmZzZXRzIGFycmF5LCB3aGljaCBjb250YWlucyB0aGUKKyAgLy8gYWJzb2x1dGUgb2Zmc2V0IG9mIHRoZSBmaWxlIG5hbWUgaW4gTmFtZXNCdWZmZXIuICBUaHVzLCBmb3IgZWFjaCBtb2R1bGUKKyAgLy8gd2Ugc3RvcmUgdGhlIGZpcnN0IGluZGV4IGluIHRoZSBGaWxlTmFtZU9mZnNldHMgYXJyYXkgZm9yIHRoaXMgbW9kdWxlLgorICAvLyBUaGUgbnVtYmVyIG9mIGZpbGVzIGZvciB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGUgaXMgc3RvcmVkIGluCisgIC8vIE1vZEZpbGVDb3VudEFycmF5LgorICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gTW9kdWxlSW5pdGlhbEZpbGVJbmRleDsKKworICAvLyBJbiBvcmRlciB0byBwcm92aWRlIHJhbmRvbSBhY2Nlc3MgaW50byB0aGUgRGVzY3JpcHRvcnMgYXJyYXksIHdlIGl0ZXJhdGUgaXQKKyAgLy8gb25jZSB1cCBmcm9udCB0byBmaW5kIHRoZSBvZmZzZXRzIG9mIHRoZSBpbmRpdmlkdWFsIGl0ZW1zIGFuZCBzdG9yZSB0aGVtIGluCisgIC8vIHRoaXMgYXJyYXkuCisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBNb2R1bGVEZXNjcmlwdG9yT2Zmc2V0czsKKworICBjb25zdCBGaWxlSW5mb1N1YnN0cmVhbUhlYWRlciAqRmlsZUluZm9IZWFkZXIgPSBudWxscHRyOworCisgIEJpbmFyeVN0cmVhbVJlZiBNb2RJbmZvU3Vic3RyZWFtOworICBCaW5hcnlTdHJlYW1SZWYgRmlsZUluZm9TdWJzdHJlYW07CisgIEJpbmFyeVN0cmVhbVJlZiBOYW1lc0J1ZmZlcjsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBwZGIKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX0RCSU1PRFVMRUxJU1RfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9EYmlTdHJlYW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRGJpU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwZDE5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRGJpU3RyZWFtLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8vPT09LSBEYmlTdHJlYW0uaCAtIFBEQiBEYmkgU3RyZWFtIChTdHJlYW0gMykgQWNjZXNzIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1JBV19QREJEQklTVFJFQU1fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQkRCSVNUUkVBTV9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N1YnNlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9NU0YvTWFwcGVkQmxvY2tTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0RiaU1vZHVsZURlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0RiaU1vZHVsZUxpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1BEQlN0cmluZ1RhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdDb25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL1BEQlR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUFycmF5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9iamVjdCB7CitzdHJ1Y3QgRnBvRGF0YTsKK3N0cnVjdCBjb2ZmX3NlY3Rpb247Cit9CisKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgRGJpU3RyZWFtQnVpbGRlcjsKK2NsYXNzIFBEQkZpbGU7CitjbGFzcyBJU2VjdGlvbkNvbnRyaWJWaXNpdG9yOworCitjbGFzcyBEYmlTdHJlYW0geworICBmcmllbmQgY2xhc3MgRGJpU3RyZWFtQnVpbGRlcjsKKworcHVibGljOgorICBEYmlTdHJlYW0oUERCRmlsZSAmRmlsZSwgc3RkOjp1bmlxdWVfcHRyPG1zZjo6TWFwcGVkQmxvY2tTdHJlYW0+IFN0cmVhbSk7CisgIH5EYmlTdHJlYW0oKTsKKyAgRXJyb3IgcmVsb2FkKCk7CisKKyAgUGRiUmF3X0RiaVZlciBnZXREYmlWZXJzaW9uKCkgY29uc3Q7CisgIHVpbnQzMl90IGdldEFnZSgpIGNvbnN0OworICB1aW50MTZfdCBnZXRQdWJsaWNTeW1ib2xTdHJlYW1JbmRleCgpIGNvbnN0OworICB1aW50MTZfdCBnZXRHbG9iYWxTeW1ib2xTdHJlYW1JbmRleCgpIGNvbnN0OworCisgIHVpbnQxNl90IGdldEZsYWdzKCkgY29uc3Q7CisgIGJvb2wgaXNJbmNyZW1lbnRhbGx5TGlua2VkKCkgY29uc3Q7CisgIGJvb2wgaGFzQ1R5cGVzKCkgY29uc3Q7CisgIGJvb2wgaXNTdHJpcHBlZCgpIGNvbnN0OworCisgIHVpbnQxNl90IGdldEJ1aWxkTnVtYmVyKCkgY29uc3Q7CisgIHVpbnQxNl90IGdldEJ1aWxkTWFqb3JWZXJzaW9uKCkgY29uc3Q7CisgIHVpbnQxNl90IGdldEJ1aWxkTWlub3JWZXJzaW9uKCkgY29uc3Q7CisKKyAgdWludDE2X3QgZ2V0UGRiRGxsUmJsZCgpIGNvbnN0OworICB1aW50MzJfdCBnZXRQZGJEbGxWZXJzaW9uKCkgY29uc3Q7CisKKyAgdWludDMyX3QgZ2V0U3ltUmVjb3JkU3RyZWFtSW5kZXgoKSBjb25zdDsKKworICBQREJfTWFjaGluZSBnZXRNYWNoaW5lVHlwZSgpIGNvbnN0OworCisgIGNvbnN0IERiaVN0cmVhbUhlYWRlciAqZ2V0SGVhZGVyKCkgY29uc3QgeyByZXR1cm4gSGVhZGVyOyB9CisKKyAgQmluYXJ5U3Vic3RyZWFtUmVmIGdldFNlY3Rpb25Db250cmlidXRpb25EYXRhKCkgY29uc3Q7CisgIEJpbmFyeVN1YnN0cmVhbVJlZiBnZXRTZWNNYXBTdWJzdHJlYW1EYXRhKCkgY29uc3Q7CisgIEJpbmFyeVN1YnN0cmVhbVJlZiBnZXRNb2RpU3Vic3RyZWFtRGF0YSgpIGNvbnN0OworICBCaW5hcnlTdWJzdHJlYW1SZWYgZ2V0RmlsZUluZm9TdWJzdHJlYW1EYXRhKCkgY29uc3Q7CisgIEJpbmFyeVN1YnN0cmVhbVJlZiBnZXRUeXBlU2VydmVyTWFwU3Vic3RyZWFtRGF0YSgpIGNvbnN0OworICBCaW5hcnlTdWJzdHJlYW1SZWYgZ2V0RUNTdWJzdHJlYW1EYXRhKCkgY29uc3Q7CisKKyAgLy8vIElmIHRoZSBnaXZlbiBzdHJlYW0gdHlwZSBpcyBwcmVzZW50LCByZXR1cm5zIGl0cyBzdHJlYW0gaW5kZXguIElmIGl0IGlzCisgIC8vLyBub3QgcHJlc2VudCwgcmV0dXJucyBJbnZhbGlkU3RyZWFtSW5kZXguCisgIHVpbnQzMl90IGdldERlYnVnU3RyZWFtSW5kZXgoRGJnSGVhZGVyVHlwZSBUeXBlKSBjb25zdDsKKworICBjb25zdCBEYmlNb2R1bGVMaXN0ICZtb2R1bGVzKCkgY29uc3Q7CisKKyAgRml4ZWRTdHJlYW1BcnJheTxvYmplY3Q6OmNvZmZfc2VjdGlvbj4gZ2V0U2VjdGlvbkhlYWRlcnMoKTsKKworICBGaXhlZFN0cmVhbUFycmF5PG9iamVjdDo6RnBvRGF0YT4gZ2V0RnBvUmVjb3JkcygpOworCisgIEZpeGVkU3RyZWFtQXJyYXk8U2VjTWFwRW50cnk+IGdldFNlY3Rpb25NYXAoKSBjb25zdDsKKyAgdm9pZCB2aXNpdFNlY3Rpb25Db250cmlidXRpb25zKElTZWN0aW9uQ29udHJpYlZpc2l0b3IgJlZpc2l0b3IpIGNvbnN0OworCisgIEV4cGVjdGVkPFN0cmluZ1JlZj4gZ2V0RUNOYW1lKHVpbnQzMl90IE5JKSBjb25zdDsKKworcHJpdmF0ZToKKyAgRXJyb3IgaW5pdGlhbGl6ZVNlY3Rpb25Db250cmlidXRpb25EYXRhKCk7CisgIEVycm9yIGluaXRpYWxpemVTZWN0aW9uSGVhZGVyc0RhdGEoKTsKKyAgRXJyb3IgaW5pdGlhbGl6ZVNlY3Rpb25NYXBEYXRhKCk7CisgIEVycm9yIGluaXRpYWxpemVGcG9SZWNvcmRzKCk7CisKKyAgUERCRmlsZSAmUGRiOworICBzdGQ6OnVuaXF1ZV9wdHI8bXNmOjpNYXBwZWRCbG9ja1N0cmVhbT4gU3RyZWFtOworCisgIFBEQlN0cmluZ1RhYmxlIEVDTmFtZXM7CisKKyAgQmluYXJ5U3Vic3RyZWFtUmVmIFNlY0NvbnRyU3Vic3RyZWFtOworICBCaW5hcnlTdWJzdHJlYW1SZWYgU2VjTWFwU3Vic3RyZWFtOworICBCaW5hcnlTdWJzdHJlYW1SZWYgTW9kaVN1YnN0cmVhbTsKKyAgQmluYXJ5U3Vic3RyZWFtUmVmIEZpbGVJbmZvU3Vic3RyZWFtOworICBCaW5hcnlTdWJzdHJlYW1SZWYgVHlwZVNlcnZlck1hcFN1YnN0cmVhbTsKKyAgQmluYXJ5U3Vic3RyZWFtUmVmIEVDU3Vic3RyZWFtOworCisgIERiaU1vZHVsZUxpc3QgTW9kdWxlczsKKworICBGaXhlZFN0cmVhbUFycmF5PHN1cHBvcnQ6OnVsaXR0bGUxNl90PiBEYmdTdHJlYW1zOworCisgIFBkYlJhd19EYmlTZWNDb250cmliVmVyIFNlY3Rpb25Db250cmliVmVyc2lvbiA9CisgICAgICBQZGJSYXdfRGJpU2VjQ29udHJpYlZlcjo6RGJpU2VjQ29udHJpYlZlcjYwOworICBGaXhlZFN0cmVhbUFycmF5PFNlY3Rpb25Db250cmliPiBTZWN0aW9uQ29udHJpYnM7CisgIEZpeGVkU3RyZWFtQXJyYXk8U2VjdGlvbkNvbnRyaWIyPiBTZWN0aW9uQ29udHJpYnMyOworICBGaXhlZFN0cmVhbUFycmF5PFNlY01hcEVudHJ5PiBTZWN0aW9uTWFwOworCisgIHN0ZDo6dW5pcXVlX3B0cjxtc2Y6Ok1hcHBlZEJsb2NrU3RyZWFtPiBTZWN0aW9uSGVhZGVyU3RyZWFtOworICBGaXhlZFN0cmVhbUFycmF5PG9iamVjdDo6Y29mZl9zZWN0aW9uPiBTZWN0aW9uSGVhZGVyczsKKworICBzdGQ6OnVuaXF1ZV9wdHI8bXNmOjpNYXBwZWRCbG9ja1N0cmVhbT4gRnBvU3RyZWFtOworICBGaXhlZFN0cmVhbUFycmF5PG9iamVjdDo6RnBvRGF0YT4gRnBvUmVjb3JkczsKKworICBjb25zdCBEYmlTdHJlYW1IZWFkZXIgKkhlYWRlcjsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9EYmlTdHJlYW1CdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0RiaVN0cmVhbUJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWVhMDYyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9EYmlTdHJlYW1CdWlsZGVyLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8vPT09LSBEYmlTdHJlYW1CdWlsZGVyLmggLSBQREIgRGJpIFN0cmVhbSBDcmVhdGlvbiAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1JBV19QREJEQklTVFJFQU1CVUlMREVSX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1JBV19QREJEQklTVFJFQU1CVUlMREVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1BEQkZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1BEQlN0cmluZ1RhYmxlQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUmF3Q29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL1BEQlR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeUJ5dGVTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVhZGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgbXNmIHsKK2NsYXNzIE1TRkJ1aWxkZXI7Cit9CituYW1lc3BhY2Ugb2JqZWN0IHsKK3N0cnVjdCBjb2ZmX3NlY3Rpb247Cit9CituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIERiaVN0cmVhbTsKK3N0cnVjdCBEYmlTdHJlYW1IZWFkZXI7CitjbGFzcyBEYmlNb2R1bGVEZXNjcmlwdG9yQnVpbGRlcjsKK2NsYXNzIFBEQkZpbGU7CisKK2NsYXNzIERiaVN0cmVhbUJ1aWxkZXIgeworcHVibGljOgorICBEYmlTdHJlYW1CdWlsZGVyKG1zZjo6TVNGQnVpbGRlciAmTXNmKTsKKyAgfkRiaVN0cmVhbUJ1aWxkZXIoKTsKKworICBEYmlTdHJlYW1CdWlsZGVyKGNvbnN0IERiaVN0cmVhbUJ1aWxkZXIgJikgPSBkZWxldGU7CisgIERiaVN0cmVhbUJ1aWxkZXIgJm9wZXJhdG9yPShjb25zdCBEYmlTdHJlYW1CdWlsZGVyICYpID0gZGVsZXRlOworCisgIHZvaWQgc2V0VmVyc2lvbkhlYWRlcihQZGJSYXdfRGJpVmVyIFYpOworICB2b2lkIHNldEFnZSh1aW50MzJfdCBBKTsKKyAgdm9pZCBzZXRCdWlsZE51bWJlcih1aW50MTZfdCBCKTsKKyAgdm9pZCBzZXRQZGJEbGxWZXJzaW9uKHVpbnQxNl90IFYpOworICB2b2lkIHNldFBkYkRsbFJibGQodWludDE2X3QgUik7CisgIHZvaWQgc2V0RmxhZ3ModWludDE2X3QgRik7CisgIHZvaWQgc2V0TWFjaGluZVR5cGUoUERCX01hY2hpbmUgTSk7CisgIHZvaWQgc2V0U2VjdGlvbk1hcChBcnJheVJlZjxTZWNNYXBFbnRyeT4gU2VjTWFwKTsKKworICAvLyBBZGQgZ2l2ZW4gYnl0ZXMgYXMgYSBuZXcgc3RyZWFtLgorICBFcnJvciBhZGREYmdTdHJlYW0ocGRiOjpEYmdIZWFkZXJUeXBlIFR5cGUsIEFycmF5UmVmPHVpbnQ4X3Q+IERhdGEpOworCisgIHVpbnQzMl90IGFkZEVDTmFtZShTdHJpbmdSZWYgTmFtZSk7CisKKyAgdWludDMyX3QgY2FsY3VsYXRlU2VyaWFsaXplZExlbmd0aCgpIGNvbnN0OworCisgIHZvaWQgc2V0R2xvYmFsc1N0cmVhbUluZGV4KHVpbnQzMl90IEluZGV4KTsKKyAgdm9pZCBzZXRQdWJsaWNzU3RyZWFtSW5kZXgodWludDMyX3QgSW5kZXgpOworICB2b2lkIHNldFN5bWJvbFJlY29yZFN0cmVhbUluZGV4KHVpbnQzMl90IEluZGV4KTsKKworICBFeHBlY3RlZDxEYmlNb2R1bGVEZXNjcmlwdG9yQnVpbGRlciAmPiBhZGRNb2R1bGVJbmZvKFN0cmluZ1JlZiBNb2R1bGVOYW1lKTsKKyAgRXJyb3IgYWRkTW9kdWxlU291cmNlRmlsZShEYmlNb2R1bGVEZXNjcmlwdG9yQnVpbGRlciAmTW9kdWxlLCBTdHJpbmdSZWYgRmlsZSk7CisgIEV4cGVjdGVkPHVpbnQzMl90PiBnZXRTb3VyY2VGaWxlTmFtZUluZGV4KFN0cmluZ1JlZiBGaWxlTmFtZSk7CisKKyAgRXJyb3IgZmluYWxpemVNc2ZMYXlvdXQoKTsKKworICBFcnJvciBjb21taXQoY29uc3QgbXNmOjpNU0ZMYXlvdXQgJkxheW91dCwgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYgTXNmQnVmZmVyKTsKKworICB2b2lkIGFkZFNlY3Rpb25Db250cmliKGNvbnN0IFNlY3Rpb25Db250cmliICZTQykgeworICAgIFNlY3Rpb25Db250cmlicy5lbXBsYWNlX2JhY2soU0MpOworICB9CisKKyAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgU2VjdGlvbiBNYXAgZnJvbSBhIENPRkYgc2VjdGlvbiBoZWFkZXIuCisgIHN0YXRpYyBzdGQ6OnZlY3RvcjxTZWNNYXBFbnRyeT4KKyAgY3JlYXRlU2VjdGlvbk1hcChBcnJheVJlZjxsbHZtOjpvYmplY3Q6OmNvZmZfc2VjdGlvbj4gU2VjSGRycyk7CisKK3ByaXZhdGU6CisgIHN0cnVjdCBEZWJ1Z1N0cmVhbSB7CisgICAgQXJyYXlSZWY8dWludDhfdD4gRGF0YTsKKyAgICB1aW50MTZfdCBTdHJlYW1OdW1iZXIgPSBrSW52YWxpZFN0cmVhbUluZGV4OworICB9OworCisgIEVycm9yIGZpbmFsaXplKCk7CisgIHVpbnQzMl90IGNhbGN1bGF0ZU1vZGlTdWJzdHJlYW1TaXplKCkgY29uc3Q7CisgIHVpbnQzMl90IGNhbGN1bGF0ZU5hbWVzT2Zmc2V0KCkgY29uc3Q7CisgIHVpbnQzMl90IGNhbGN1bGF0ZVNlY3Rpb25Db250cmlic1N0cmVhbVNpemUoKSBjb25zdDsKKyAgdWludDMyX3QgY2FsY3VsYXRlU2VjdGlvbk1hcFN0cmVhbVNpemUoKSBjb25zdDsKKyAgdWludDMyX3QgY2FsY3VsYXRlRmlsZUluZm9TdWJzdHJlYW1TaXplKCkgY29uc3Q7CisgIHVpbnQzMl90IGNhbGN1bGF0ZU5hbWVzQnVmZmVyU2l6ZSgpIGNvbnN0OworICB1aW50MzJfdCBjYWxjdWxhdGVEYmdTdHJlYW1zU2l6ZSgpIGNvbnN0OworCisgIEVycm9yIGdlbmVyYXRlRmlsZUluZm9TdWJzdHJlYW0oKTsKKworICBtc2Y6Ok1TRkJ1aWxkZXIgJk1zZjsKKyAgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yOworCisgIE9wdGlvbmFsPFBkYlJhd19EYmlWZXI+IFZlckhlYWRlcjsKKyAgdWludDMyX3QgQWdlOworICB1aW50MTZfdCBCdWlsZE51bWJlcjsKKyAgdWludDE2X3QgUGRiRGxsVmVyc2lvbjsKKyAgdWludDE2X3QgUGRiRGxsUmJsZDsKKyAgdWludDE2X3QgRmxhZ3M7CisgIFBEQl9NYWNoaW5lIE1hY2hpbmVUeXBlOworICB1aW50MzJfdCBHbG9iYWxzU3RyZWFtSW5kZXggPSBrSW52YWxpZFN0cmVhbUluZGV4OworICB1aW50MzJfdCBQdWJsaWNzU3RyZWFtSW5kZXggPSBrSW52YWxpZFN0cmVhbUluZGV4OworICB1aW50MzJfdCBTeW1SZWNvcmRTdHJlYW1JbmRleCA9IGtJbnZhbGlkU3RyZWFtSW5kZXg7CisKKyAgY29uc3QgRGJpU3RyZWFtSGVhZGVyICpIZWFkZXI7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPERiaU1vZHVsZURlc2NyaXB0b3JCdWlsZGVyPj4gTW9kaUxpc3Q7CisKKyAgU3RyaW5nTWFwPHVpbnQzMl90PiBTb3VyY2VGaWxlTmFtZXM7CisKKyAgUERCU3RyaW5nVGFibGVCdWlsZGVyIEVDTmFtZXNCdWlsZGVyOworICBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiBOYW1lc0J1ZmZlcjsKKyAgTXV0YWJsZUJpbmFyeUJ5dGVTdHJlYW0gRmlsZUluZm9CdWZmZXI7CisgIHN0ZDo6dmVjdG9yPFNlY3Rpb25Db250cmliPiBTZWN0aW9uQ29udHJpYnM7CisgIEFycmF5UmVmPFNlY01hcEVudHJ5PiBTZWN0aW9uTWFwOworICBzdGQ6OmFycmF5PE9wdGlvbmFsPERlYnVnU3RyZWFtPiwgKGludClEYmdIZWFkZXJUeXBlOjpNYXg+IERiZ1N0cmVhbXM7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRW51bVRhYmxlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9FbnVtVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAxODQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRW51bVRhYmxlcy5oCkBAIC0wLDAgKzEsMjIgQEAKKy8vPT09LSBFbnVtVGFibGVzLmggLSBFbnVtIHRvIHN0cmluZyBjb252ZXJzaW9uIHRhYmxlcyAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1JBV19FTlVNVEFCTEVTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1JBV19FTlVNVEFCTEVTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1Njb3BlZFByaW50ZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CitBcnJheVJlZjxFbnVtRW50cnk8dWludDE2X3Q+PiBnZXRPTUZTZWdNYXBEZXNjRmxhZ05hbWVzKCk7Cit9Cit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUkFXX0VOVU1UQUJMRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9Gb3JtYXR0ZXJzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0Zvcm1hdHRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDVlYWIyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9Gb3JtYXR0ZXJzLmgKQEAgLTAsMCArMSw0NSBAQAorLy89PT0tIEZvcm1hdHRlcnMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX0ZPUk1BVFRFUlNfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX0ZPUk1BVFRFUlNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Gb3JtYXR0ZXJzLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdDb25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdFByb3ZpZGVycy5oIgorCisjZGVmaW5lIEZPUk1BVF9DQVNFKFZhbHVlLCBOYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIFZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTdHJlYW0gPDwgTmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnJlYWs7CisKK25hbWVzcGFjZSBsbHZtIHsKK3RlbXBsYXRlIDw+IHN0cnVjdCBmb3JtYXRfcHJvdmlkZXI8cGRiOjpQZGJSYXdfSW1wbFZlcj4geworICBzdGF0aWMgdm9pZCBmb3JtYXQoY29uc3QgcGRiOjpQZGJSYXdfSW1wbFZlciAmViwgbGx2bTo6cmF3X29zdHJlYW0gJlN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTdHlsZSkgeworICAgIHN3aXRjaCAoVikgeworICAgICAgRk9STUFUX0NBU0UocGRiOjpQZGJSYXdfSW1wbFZlcjo6UGRiSW1wbFZDMTEwLCAiVkMxMTAiKQorICAgICAgRk9STUFUX0NBU0UocGRiOjpQZGJSYXdfSW1wbFZlcjo6UGRiSW1wbFZDMTQwLCAiVkMxNDAiKQorICAgICAgRk9STUFUX0NBU0UocGRiOjpQZGJSYXdfSW1wbFZlcjo6UGRiSW1wbFZDMiwgIlZDMiIpCisgICAgICBGT1JNQVRfQ0FTRShwZGI6OlBkYlJhd19JbXBsVmVyOjpQZGJJbXBsVkM0LCAiVkM0IikKKyAgICAgIEZPUk1BVF9DQVNFKHBkYjo6UGRiUmF3X0ltcGxWZXI6OlBkYkltcGxWQzQxLCAiVkM0MSIpCisgICAgICBGT1JNQVRfQ0FTRShwZGI6OlBkYlJhd19JbXBsVmVyOjpQZGJJbXBsVkM1MCwgIlZDNTAiKQorICAgICAgRk9STUFUX0NBU0UocGRiOjpQZGJSYXdfSW1wbFZlcjo6UGRiSW1wbFZDNzAsICJWQzcwIikKKyAgICAgIEZPUk1BVF9DQVNFKHBkYjo6UGRiUmF3X0ltcGxWZXI6OlBkYkltcGxWQzcwRGVwLCAiVkM3MERlcCIpCisgICAgICBGT1JNQVRfQ0FTRShwZGI6OlBkYlJhd19JbXBsVmVyOjpQZGJJbXBsVkM4MCwgIlZDODAiKQorICAgICAgRk9STUFUX0NBU0UocGRiOjpQZGJSYXdfSW1wbFZlcjo6UGRiSW1wbFZDOTgsICJWQzk4IikKKyAgICB9CisgIH0KK307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9HU0lTdHJlYW1CdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0dTSVN0cmVhbUJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTRmODlkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9HU0lTdHJlYW1CdWlsZGVyLmgKQEAgLTAsMCArMSw4MiBAQAorLy89PT0tIEdTSVN0cmVhbUJ1aWxkZXIuaCAtIFBEQiBQdWJsaWNzL0dsb2JhbHMgU3RyZWFtIENyZWF0aW9uIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUkFXX0dTSVNUUkVBTUJVSUxERVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUkFXX0dTSVNUUkVBTUJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9HbG9iYWxzU3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdDb25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeUJ5dGVTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5SXRlbVN0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBCaW5hcnlJdGVtVHJhaXRzPGNvZGV2aWV3OjpDVlN5bWJvbD4geworICBzdGF0aWMgc2l6ZV90IGxlbmd0aChjb25zdCBjb2Rldmlldzo6Q1ZTeW1ib2wgJkl0ZW0pIHsKKyAgICByZXR1cm4gSXRlbS5SZWNvcmREYXRhLnNpemUoKTsKKyAgfQorICBzdGF0aWMgQXJyYXlSZWY8dWludDhfdD4gYnl0ZXMoY29uc3QgY29kZXZpZXc6OkNWU3ltYm9sICZJdGVtKSB7CisgICAgcmV0dXJuIEl0ZW0uUmVjb3JkRGF0YTsKKyAgfQorfTsKKworbmFtZXNwYWNlIG1zZiB7CitjbGFzcyBNU0ZCdWlsZGVyOworc3RydWN0IE1TRkxheW91dDsKK30gLy8gbmFtZXNwYWNlIG1zZgorbmFtZXNwYWNlIHBkYiB7CitzdHJ1Y3QgR1NJSGFzaFN0cmVhbUJ1aWxkZXI7CisKK2NsYXNzIEdTSVN0cmVhbUJ1aWxkZXIgeworCitwdWJsaWM6CisgIGV4cGxpY2l0IEdTSVN0cmVhbUJ1aWxkZXIobXNmOjpNU0ZCdWlsZGVyICZNc2YpOworICB+R1NJU3RyZWFtQnVpbGRlcigpOworCisgIEdTSVN0cmVhbUJ1aWxkZXIoY29uc3QgR1NJU3RyZWFtQnVpbGRlciAmKSA9IGRlbGV0ZTsKKyAgR1NJU3RyZWFtQnVpbGRlciAmb3BlcmF0b3I9KGNvbnN0IEdTSVN0cmVhbUJ1aWxkZXIgJikgPSBkZWxldGU7CisKKyAgRXJyb3IgZmluYWxpemVNc2ZMYXlvdXQoKTsKKworICBFcnJvciBjb21taXQoY29uc3QgbXNmOjpNU0ZMYXlvdXQgJkxheW91dCwgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYgQnVmZmVyKTsKKworICB1aW50MzJfdCBnZXRQdWJsaWNzU3RyZWFtSW5kZXgoKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0R2xvYmFsc1N0cmVhbUluZGV4KCkgY29uc3Q7CisgIHVpbnQzMl90IGdldFJlY29yZFN0cmVhbUlkeCgpIGNvbnN0IHsgcmV0dXJuIFJlY29yZFN0cmVhbUlkeDsgfQorCisgIHZvaWQgYWRkUHVibGljU3ltYm9sKGNvbnN0IGNvZGV2aWV3OjpQdWJsaWNTeW0zMiAmUHViKTsKKworICB2b2lkIGFkZEdsb2JhbFN5bWJvbChjb25zdCBjb2Rldmlldzo6UHJvY1JlZlN5bSAmU3ltKTsKKyAgdm9pZCBhZGRHbG9iYWxTeW1ib2woY29uc3QgY29kZXZpZXc6OkRhdGFTeW0gJlN5bSk7CisgIHZvaWQgYWRkR2xvYmFsU3ltYm9sKGNvbnN0IGNvZGV2aWV3OjpDb25zdGFudFN5bSAmU3ltKTsKKyAgdm9pZCBhZGRHbG9iYWxTeW1ib2woY29uc3QgY29kZXZpZXc6OlVEVFN5bSAmU3ltKTsKKyAgdm9pZCBhZGRHbG9iYWxTeW1ib2woY29uc3QgY29kZXZpZXc6OkNWU3ltYm9sICZTeW0pOworCitwcml2YXRlOgorICB1aW50MzJfdCBjYWxjdWxhdGVQdWJsaWNzSGFzaFN0cmVhbVNpemUoKSBjb25zdDsKKyAgdWludDMyX3QgY2FsY3VsYXRlR2xvYmFsc0hhc2hTdHJlYW1TaXplKCkgY29uc3Q7CisgIEVycm9yIGNvbW1pdFN5bWJvbFJlY29yZFN0cmVhbShXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiBTdHJlYW0pOworICBFcnJvciBjb21taXRQdWJsaWNzSGFzaFN0cmVhbShXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiBTdHJlYW0pOworICBFcnJvciBjb21taXRHbG9iYWxzSGFzaFN0cmVhbShXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiBTdHJlYW0pOworCisgIHVpbnQzMl90IFJlY29yZFN0cmVhbUlkeCA9IGtJbnZhbGlkU3RyZWFtSW5kZXg7CisgIG1zZjo6TVNGQnVpbGRlciAmTXNmOworICBzdGQ6OnVuaXF1ZV9wdHI8R1NJSGFzaFN0cmVhbUJ1aWxkZXI+IFBTSDsKKyAgc3RkOjp1bmlxdWVfcHRyPEdTSUhhc2hTdHJlYW1CdWlsZGVyPiBHU0g7Cit9OworfSAvLyBuYW1lc3BhY2UgcGRiCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9HbG9iYWxzU3RyZWFtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0dsb2JhbHNTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGM1OGRjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9HbG9iYWxzU3RyZWFtLmgKQEAgLTAsMCArMSw4NCBAQAorLy89PT0tIEdsb2JhbHNTdHJlYW0uaCAtIFBEQiBJbmRleCBvZiBTeW1ib2xzIGJ5IE5hbWUgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUkFXX0dMT0JBTFNfU1RSRUFNX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1JBV19HTE9CQUxTX1NUUkVBTV9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9NU0YvTWFwcGVkQmxvY2tTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUmF3VHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvUERCVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtQXJyYXkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIERiaVN0cmVhbTsKK2NsYXNzIFBEQkZpbGU7CisKKy8vLyBJdGVyYXRvciBvdmVyIGhhc2ggcmVjb3JkcyBwcm9kdWNpbmcgc3ltYm9sIHJlY29yZCBvZmZzZXRzLiBBYnN0cmFjdHMgYXdheQorLy8vIHRoZSBmYWN0IHRoYXQgc3ltYm9sIHJlY29yZCBvZmZzZXRzIG9uIGRpc2sgYXJlIG9mZi1ieS1vbmUuCitjbGFzcyBHU0lIYXNoSXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8CisgICAgICAgICAgR1NJSGFzaEl0ZXJhdG9yLCBGaXhlZFN0cmVhbUFycmF5SXRlcmF0b3I8UFNIYXNoUmVjb3JkPiwKKyAgICAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBjb25zdCB1aW50MzJfdD4geworcHVibGljOgorICBHU0lIYXNoSXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIEdTSUhhc2hJdGVyYXRvcihUICYmdikKKyAgICAgIDogR1NJSGFzaEl0ZXJhdG9yOjppdGVyYXRvcl9hZGFwdG9yX2Jhc2Uoc3RkOjpmb3J3YXJkPFQgJiY+KHYpKSB7fQorCisgIHVpbnQzMl90IG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICB1aW50MzJfdCBPZmYgPSB0aGlzLT5JLT5PZmY7CisgICAgcmV0dXJuIC0tT2ZmOworICB9Cit9OworCisvLy8gRnJvbSBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L21pY3Jvc29mdC1wZGIvYmxvYi9tYXN0ZXIvUERCL2RiaS9nc2kuY3BwCitlbnVtIDogdW5zaWduZWQgeyBJUEhSX0hBU0ggPSA0MDk2IH07CisKKy8vLyBBIHJlYWRvbmx5IHZpZXcgb2YgYSBoYXNoIHRhYmxlIHVzZWQgaW4gdGhlIGdsb2JhbHMgYW5kIHB1YmxpY3Mgc3RyZWFtcy4KKy8vLyBNb3N0IGNsaWVudHMgd2lsbCBvbmx5IHdhbnQgdG8gaXRlcmF0ZSB0aGlzIHRvIGdldCBzeW1ib2wgcmVjb3JkIG9mZnNldHMKKy8vLyBpbnRvIHRoZSBQREIgc3ltYm9sIHN0cmVhbS4KK2NsYXNzIEdTSUhhc2hUYWJsZSB7CitwdWJsaWM6CisgIGNvbnN0IEdTSUhhc2hIZWFkZXIgKkhhc2hIZHI7CisgIEZpeGVkU3RyZWFtQXJyYXk8UFNIYXNoUmVjb3JkPiBIYXNoUmVjb3JkczsKKyAgQXJyYXlSZWY8dWludDhfdD4gSGFzaEJpdG1hcDsKKyAgRml4ZWRTdHJlYW1BcnJheTxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4gSGFzaEJ1Y2tldHM7CisKKyAgRXJyb3IgcmVhZChCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlcik7CisKKyAgdWludDMyX3QgZ2V0VmVyU2lnbmF0dXJlKCkgY29uc3QgeyByZXR1cm4gSGFzaEhkci0+VmVyU2lnbmF0dXJlOyB9CisgIHVpbnQzMl90IGdldFZlckhlYWRlcigpIGNvbnN0IHsgcmV0dXJuIEhhc2hIZHItPlZlckhkcjsgfQorICB1aW50MzJfdCBnZXRIYXNoUmVjb3JkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEhhc2hIZHItPkhyU2l6ZTsgfQorICB1aW50MzJfdCBnZXROdW1CdWNrZXRzKCkgY29uc3QgeyByZXR1cm4gSGFzaEhkci0+TnVtQnVja2V0czsgfQorCisgIHR5cGVkZWYgR1NJSGFzaEhlYWRlciBpdGVyYXRvcjsKKyAgR1NJSGFzaEl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gR1NJSGFzaEl0ZXJhdG9yKEhhc2hSZWNvcmRzLmJlZ2luKCkpOyB9CisgIEdTSUhhc2hJdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBHU0lIYXNoSXRlcmF0b3IoSGFzaFJlY29yZHMuZW5kKCkpOyB9Cit9OworCitjbGFzcyBHbG9iYWxzU3RyZWFtIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgR2xvYmFsc1N0cmVhbShzdGQ6OnVuaXF1ZV9wdHI8bXNmOjpNYXBwZWRCbG9ja1N0cmVhbT4gU3RyZWFtKTsKKyAgfkdsb2JhbHNTdHJlYW0oKTsKKyAgY29uc3QgR1NJSGFzaFRhYmxlICZnZXRHbG9iYWxzVGFibGUoKSBjb25zdCB7IHJldHVybiBHbG9iYWxzVGFibGU7IH0KKyAgRXJyb3IgcmVsb2FkKCk7CisKK3ByaXZhdGU6CisgIEdTSUhhc2hUYWJsZSBHbG9iYWxzVGFibGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxtc2Y6Ok1hcHBlZEJsb2NrU3RyZWFtPiBTdHJlYW07Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvSGFzaC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9IYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYxMWQ0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvSGFzaC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vPT09LSBIYXNoLmggLSBQREIgaGFzaCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9IQVNIX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9IQVNIX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CisKK3VpbnQzMl90IGhhc2hTdHJpbmdWMShTdHJpbmdSZWYgU3RyKTsKK3VpbnQzMl90IGhhc2hTdHJpbmdWMihTdHJpbmdSZWYgU3RyKTsKK3VpbnQzMl90IGhhc2hCdWZmZXJWOChBcnJheVJlZjx1aW50OF90PiBEYXRhKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHBkYgorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfSEFTSF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0hhc2hUYWJsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9IYXNoVGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGNjNjE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9IYXNoVGFibGUuaApAQCAtMCwwICsxLDMzNSBAQAorLy89PT0tIEhhc2hUYWJsZS5oIC0gUERCIEhhc2ggVGFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX0hBU0hUQUJMRV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfSEFTSFRBQkxFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NwYXJzZUJpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdFcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWFkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmluYXJ5U3RyZWFtUmVhZGVyOworY2xhc3MgQmluYXJ5U3RyZWFtV3JpdGVyOworCituYW1lc3BhY2UgcGRiIHsKKworRXJyb3IgcmVhZFNwYXJzZUJpdFZlY3RvcihCaW5hcnlTdHJlYW1SZWFkZXIgJlN0cmVhbSwgU3BhcnNlQml0VmVjdG9yPD4gJlYpOworRXJyb3Igd3JpdGVTcGFyc2VCaXRWZWN0b3IoQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIsIFNwYXJzZUJpdFZlY3Rvcjw+ICZWZWMpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVULCB0eXBlbmFtZSBUcmFpdHNUPiBjbGFzcyBIYXNoVGFibGU7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVQsIHR5cGVuYW1lIFRyYWl0c1Q+CitjbGFzcyBIYXNoVGFibGVJdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yX2ZhY2FkZV9iYXNlPEhhc2hUYWJsZUl0ZXJhdG9yPFZhbHVlVCwgVHJhaXRzVD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8dWludDMyX3QsIFZhbHVlVD4+IHsKKyAgZnJpZW5kIEhhc2hUYWJsZTxWYWx1ZVQsIFRyYWl0c1Q+OworCisgIEhhc2hUYWJsZUl0ZXJhdG9yKGNvbnN0IEhhc2hUYWJsZTxWYWx1ZVQsIFRyYWl0c1Q+ICZNYXAsIHVpbnQzMl90IEluZGV4LAorICAgICAgICAgICAgICAgICAgICBib29sIElzRW5kKQorICAgICAgOiBNYXAoJk1hcCksIEluZGV4KEluZGV4KSwgSXNFbmQoSXNFbmQpIHt9CisKK3B1YmxpYzoKKyAgSGFzaFRhYmxlSXRlcmF0b3IoY29uc3QgSGFzaFRhYmxlPFZhbHVlVCwgVHJhaXRzVD4gJk1hcCkgOiBNYXAoJk1hcCkgeworICAgIGludCBJID0gTWFwLlByZXNlbnQuZmluZF9maXJzdCgpOworICAgIGlmIChJID09IC0xKSB7CisgICAgICBJbmRleCA9IDA7CisgICAgICBJc0VuZCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIEluZGV4ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEkpOworICAgICAgSXNFbmQgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICBIYXNoVGFibGVJdGVyYXRvciAmb3BlcmF0b3I9KGNvbnN0IEhhc2hUYWJsZUl0ZXJhdG9yICZSKSB7CisgICAgTWFwID0gUi5NYXA7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBIYXNoVGFibGVJdGVyYXRvciAmUikgY29uc3QgeworICAgIGlmIChJc0VuZCAmJiBSLklzRW5kKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKElzRW5kICE9IFIuSXNFbmQpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gKE1hcCA9PSBSLk1hcCkgJiYgKEluZGV4ID09IFIuSW5kZXgpOworICB9CisgIGNvbnN0IHN0ZDo6cGFpcjx1aW50MzJfdCwgVmFsdWVUPiAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGFzc2VydChNYXAtPlByZXNlbnQudGVzdChJbmRleCkpOworICAgIHJldHVybiBNYXAtPkJ1Y2tldHNbSW5kZXhdOworICB9CisgIEhhc2hUYWJsZUl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgIHdoaWxlIChJbmRleCA8IE1hcC0+QnVja2V0cy5zaXplKCkpIHsKKyAgICAgICsrSW5kZXg7CisgICAgICBpZiAoTWFwLT5QcmVzZW50LnRlc3QoSW5kZXgpKQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgSXNFbmQgPSB0cnVlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCitwcml2YXRlOgorICBib29sIGlzRW5kKCkgY29uc3QgeyByZXR1cm4gSXNFbmQ7IH0KKyAgdWludDMyX3QgaW5kZXgoKSBjb25zdCB7IHJldHVybiBJbmRleDsgfQorCisgIGNvbnN0IEhhc2hUYWJsZTxWYWx1ZVQsIFRyYWl0c1Q+ICpNYXA7CisgIHVpbnQzMl90IEluZGV4OworICBib29sIElzRW5kOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBQZGJIYXNoVHJhaXRzIHt9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgUGRiSGFzaFRyYWl0czx1aW50MzJfdD4geworICB1aW50MzJfdCBoYXNoTG9va3VwS2V5KHVpbnQzMl90IE4pIGNvbnN0IHsgcmV0dXJuIE47IH0KKyAgdWludDMyX3Qgc3RvcmFnZUtleVRvTG9va3VwS2V5KHVpbnQzMl90IE4pIGNvbnN0IHsgcmV0dXJuIE47IH0KKyAgdWludDMyX3QgbG9va3VwS2V5VG9TdG9yYWdlS2V5KHVpbnQzMl90IE4pIHsgcmV0dXJuIE47IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVQsIHR5cGVuYW1lIFRyYWl0c1QgPSBQZGJIYXNoVHJhaXRzPFZhbHVlVD4+CitjbGFzcyBIYXNoVGFibGUgeworICB1c2luZyBpdGVyYXRvciA9IEhhc2hUYWJsZUl0ZXJhdG9yPFZhbHVlVCwgVHJhaXRzVD47CisgIGZyaWVuZCBpdGVyYXRvcjsKKworICBzdHJ1Y3QgSGVhZGVyIHsKKyAgICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaXplOworICAgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IENhcGFjaXR5OworICB9OworCisgIHVzaW5nIEJ1Y2tldExpc3QgPSBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dWludDMyX3QsIFZhbHVlVD4+OworCitwdWJsaWM6CisgIEhhc2hUYWJsZSgpIHsgQnVja2V0cy5yZXNpemUoOCk7IH0KKworICBleHBsaWNpdCBIYXNoVGFibGUoVHJhaXRzVCBUcmFpdHMpIDogSGFzaFRhYmxlKDgsIHN0ZDo6bW92ZShUcmFpdHMpKSB7fQorICBIYXNoVGFibGUodWludDMyX3QgQ2FwYWNpdHksIFRyYWl0c1QgVHJhaXRzKSA6IFRyYWl0cyhUcmFpdHMpIHsKKyAgICBCdWNrZXRzLnJlc2l6ZShDYXBhY2l0eSk7CisgIH0KKworICBFcnJvciBsb2FkKEJpbmFyeVN0cmVhbVJlYWRlciAmU3RyZWFtKSB7CisgICAgY29uc3QgSGVhZGVyICpIOworICAgIGlmIChhdXRvIEVDID0gU3RyZWFtLnJlYWRPYmplY3QoSCkpCisgICAgICByZXR1cm4gRUM7CisgICAgaWYgKEgtPkNhcGFjaXR5ID09IDApCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxSYXdFcnJvcj4ocmF3X2Vycm9yX2NvZGU6OmNvcnJ1cHRfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBIYXNoIFRhYmxlIENhcGFjaXR5Iik7CisgICAgaWYgKEgtPlNpemUgPiBtYXhMb2FkKEgtPkNhcGFjaXR5KSkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPFJhd0Vycm9yPihyYXdfZXJyb3JfY29kZTo6Y29ycnVwdF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEhhc2ggVGFibGUgU2l6ZSIpOworCisgICAgQnVja2V0cy5yZXNpemUoSC0+Q2FwYWNpdHkpOworCisgICAgaWYgKGF1dG8gRUMgPSByZWFkU3BhcnNlQml0VmVjdG9yKFN0cmVhbSwgUHJlc2VudCkpCisgICAgICByZXR1cm4gRUM7CisgICAgaWYgKFByZXNlbnQuY291bnQoKSAhPSBILT5TaXplKQorICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8UmF3RXJyb3I+KHJhd19lcnJvcl9jb2RlOjpjb3JydXB0X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZXNlbnQgYml0IHZlY3RvciBkb2VzIG5vdCBtYXRjaCBzaXplISIpOworCisgICAgaWYgKGF1dG8gRUMgPSByZWFkU3BhcnNlQml0VmVjdG9yKFN0cmVhbSwgRGVsZXRlZCkpCisgICAgICByZXR1cm4gRUM7CisgICAgaWYgKFByZXNlbnQuaW50ZXJzZWN0cyhEZWxldGVkKSkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPFJhd0Vycm9yPihyYXdfZXJyb3JfY29kZTo6Y29ycnVwdF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmVzZW50IGJpdCB2ZWN0b3IgaW50ZXJlc2VjdHMgZGVsZXRlZCEiKTsKKworICAgIGZvciAodWludDMyX3QgUCA6IFByZXNlbnQpIHsKKyAgICAgIGlmIChhdXRvIEVDID0gU3RyZWFtLnJlYWRJbnRlZ2VyKEJ1Y2tldHNbUF0uZmlyc3QpKQorICAgICAgICByZXR1cm4gRUM7CisgICAgICBjb25zdCBWYWx1ZVQgKlZhbHVlOworICAgICAgaWYgKGF1dG8gRUMgPSBTdHJlYW0ucmVhZE9iamVjdChWYWx1ZSkpCisgICAgICAgIHJldHVybiBFQzsKKyAgICAgIEJ1Y2tldHNbUF0uc2Vjb25kID0gKlZhbHVlOworICAgIH0KKworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgdWludDMyX3QgY2FsY3VsYXRlU2VyaWFsaXplZExlbmd0aCgpIGNvbnN0IHsKKyAgICB1aW50MzJfdCBTaXplID0gc2l6ZW9mKEhlYWRlcik7CisKKyAgICBjb25zdGV4cHIgaW50IEJpdHNQZXJXb3JkID0gOCAqIHNpemVvZih1aW50MzJfdCk7CisKKyAgICBpbnQgTnVtQml0c1AgPSBQcmVzZW50LmZpbmRfbGFzdCgpICsgMTsKKyAgICBpbnQgTnVtQml0c0QgPSBEZWxldGVkLmZpbmRfbGFzdCgpICsgMTsKKworICAgIHVpbnQzMl90IE51bVdvcmRzUCA9IGFsaWduVG8oTnVtQml0c1AsIEJpdHNQZXJXb3JkKSAvIEJpdHNQZXJXb3JkOworICAgIHVpbnQzMl90IE51bVdvcmRzRCA9IGFsaWduVG8oTnVtQml0c0QsIEJpdHNQZXJXb3JkKSAvIEJpdHNQZXJXb3JkOworCisgICAgLy8gUHJlc2VudCBiaXQgc2V0IG51bWJlciBvZiB3b3JkcyAoNCBieXRlcyksIGZvbGxvd2VkIGJ5IHRoYXQgbWFueSBhY3R1YWwKKyAgICAvLyB3b3JkcyAoNCBieXRlcyBlYWNoKS4KKyAgICBTaXplICs9IHNpemVvZih1aW50MzJfdCk7CisgICAgU2l6ZSArPSBOdW1Xb3Jkc1AgKiBzaXplb2YodWludDMyX3QpOworCisgICAgLy8gRGVsZXRlZCBiaXQgc2V0IG51bWJlciBvZiB3b3JkcyAoNCBieXRlcyksIGZvbGxvd2VkIGJ5IHRoYXQgbWFueSBhY3R1YWwKKyAgICAvLyB3b3JkcyAoNCBieXRlcyBlYWNoKS4KKyAgICBTaXplICs9IHNpemVvZih1aW50MzJfdCk7CisgICAgU2l6ZSArPSBOdW1Xb3Jkc0QgKiBzaXplb2YodWludDMyX3QpOworCisgICAgLy8gT25lIChLZXksIFZhbHVlVCkgcGFpciBmb3IgZWFjaCBlbnRyeSBQcmVzZW50LgorICAgIFNpemUgKz0gKHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YoVmFsdWVUKSkgKiBzaXplKCk7CisKKyAgICByZXR1cm4gU2l6ZTsKKyAgfQorCisgIEVycm9yIGNvbW1pdChCaW5hcnlTdHJlYW1Xcml0ZXIgJldyaXRlcikgY29uc3QgeworICAgIEhlYWRlciBIOworICAgIEguU2l6ZSA9IHNpemUoKTsKKyAgICBILkNhcGFjaXR5ID0gY2FwYWNpdHkoKTsKKyAgICBpZiAoYXV0byBFQyA9IFdyaXRlci53cml0ZU9iamVjdChIKSkKKyAgICAgIHJldHVybiBFQzsKKworICAgIGlmIChhdXRvIEVDID0gd3JpdGVTcGFyc2VCaXRWZWN0b3IoV3JpdGVyLCBQcmVzZW50KSkKKyAgICAgIHJldHVybiBFQzsKKworICAgIGlmIChhdXRvIEVDID0gd3JpdGVTcGFyc2VCaXRWZWN0b3IoV3JpdGVyLCBEZWxldGVkKSkKKyAgICAgIHJldHVybiBFQzsKKworICAgIGZvciAoY29uc3QgYXV0byAmRW50cnkgOiAqdGhpcykgeworICAgICAgaWYgKGF1dG8gRUMgPSBXcml0ZXIud3JpdGVJbnRlZ2VyKEVudHJ5LmZpcnN0KSkKKyAgICAgICAgcmV0dXJuIEVDOworICAgICAgaWYgKGF1dG8gRUMgPSBXcml0ZXIud3JpdGVPYmplY3QoRW50cnkuc2Vjb25kKSkKKyAgICAgICAgcmV0dXJuIEVDOworICAgIH0KKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgQnVja2V0cy5yZXNpemUoOCk7CisgICAgUHJlc2VudC5jbGVhcigpOworICAgIERlbGV0ZWQuY2xlYXIoKTsKKyAgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBzaXplKCkgPT0gMDsgfQorICB1aW50MzJfdCBjYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIEJ1Y2tldHMuc2l6ZSgpOyB9CisgIHVpbnQzMl90IHNpemUoKSBjb25zdCB7IHJldHVybiBQcmVzZW50LmNvdW50KCk7IH0KKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzKTsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigqdGhpcywgMCwgdHJ1ZSk7IH0KKworICAvLy8gRmluZCB0aGUgZW50cnkgd2hvc2Uga2V5IGhhcyB0aGUgc3BlY2lmaWVkIGhhc2ggdmFsdWUsIHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHRyYWl0cyBkZWZpbmluZyBoYXNoIGZ1bmN0aW9uIGFuZCBlcXVhbGl0eS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEtleT4gaXRlcmF0b3IgZmluZF9hcyhjb25zdCBLZXkgJkspIGNvbnN0IHsKKyAgICB1aW50MzJfdCBIID0gVHJhaXRzLmhhc2hMb29rdXBLZXkoSykgJSBjYXBhY2l0eSgpOworICAgIHVpbnQzMl90IEkgPSBIOworICAgIE9wdGlvbmFsPHVpbnQzMl90PiBGaXJzdFVudXNlZDsKKyAgICBkbyB7CisgICAgICBpZiAoaXNQcmVzZW50KEkpKSB7CisgICAgICAgIGlmIChUcmFpdHMuc3RvcmFnZUtleVRvTG9va3VwS2V5KEJ1Y2tldHNbSV0uZmlyc3QpID09IEspCisgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCBJLCBmYWxzZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIUZpcnN0VW51c2VkKQorICAgICAgICAgIEZpcnN0VW51c2VkID0gSTsKKyAgICAgICAgLy8gSW5zZXJ0aW9uIG9jY3VycyB2aWEgbGluZWFyIHByb2JpbmcgZnJvbSB0aGUgc2xvdCBoaW50LCBhbmQgd2lsbCBiZQorICAgICAgICAvLyBpbnNlcnRlZCBhdCB0aGUgZmlyc3QgZW1wdHkgLyBkZWxldGVkIGxvY2F0aW9uLiAgVGhlcmVmb3JlLCBpZiB3ZSBhcmUKKyAgICAgICAgLy8gcHJvYmluZyBhbmQgZmluZCBhIGxvY2F0aW9uIHRoYXQgaXMgbmVpdGhlciBwcmVzZW50IG5vciBkZWxldGVkLCB0aGVuCisgICAgICAgIC8vIG5vdGhpbmcgbXVzdCBoYXZlIEVWRVIgYmVlbiBpbnNlcnRlZCBhdCB0aGlzIGxvY2F0aW9uLCBhbmQgdGh1cyBpdCBpcworICAgICAgICAvLyBub3QgcG9zc2libGUgZm9yIGEgbWF0Y2hpbmcgdmFsdWUgdG8gb2NjdXIgbGF0ZXIuCisgICAgICAgIGlmICghaXNEZWxldGVkKEkpKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgSSA9IChJICsgMSkgJSBjYXBhY2l0eSgpOworICAgIH0gd2hpbGUgKEkgIT0gSCk7CisKKyAgICAvLyBUaGUgb25seSB3YXkgRmlyc3RVbnVzZWQgd291bGQgbm90IGJlIHNldCBpcyBpZiBldmVyeSBzaW5nbGUgZW50cnkgaW4gdGhlCisgICAgLy8gdGFibGUgd2VyZSBQcmVzZW50LiAgQnV0IHRoaXMgd291bGQgdmlvbGF0ZSB0aGUgbG9hZCBmYWN0b3IgY29uc3RyYWludHMKKyAgICAvLyB0aGF0IHdlIGltcG9zZSwgc28gaXQgc2hvdWxkIG5ldmVyIGhhcHBlbi4KKyAgICBhc3NlcnQoRmlyc3RVbnVzZWQpOworICAgIHJldHVybiBpdGVyYXRvcigqdGhpcywgKkZpcnN0VW51c2VkLCB0cnVlKTsKKyAgfQorCisgIC8vLyBTZXQgdGhlIGVudHJ5IHVzaW5nIGEga2V5IHR5cGUgdGhhdCB0aGUgc3BlY2lmaWVkIFRyYWl0cyBjYW4gY29udmVydAorICAvLy8gZnJvbSBhIHJlYWwga2V5IHRvIGFuIGludGVybmFsIGtleS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEtleT4gYm9vbCBzZXRfYXMoY29uc3QgS2V5ICZLLCBWYWx1ZVQgVikgeworICAgIHJldHVybiBzZXRfYXNfaW50ZXJuYWwoSywgc3RkOjptb3ZlKFYpLCBOb25lKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXk+IFZhbHVlVCBnZXQoY29uc3QgS2V5ICZLKSBjb25zdCB7CisgICAgYXV0byBJdGVyID0gZmluZF9hcyhLKTsKKyAgICBhc3NlcnQoSXRlciAhPSBlbmQoKSk7CisgICAgcmV0dXJuICgqSXRlcikuc2Vjb25kOworICB9CisKK3Byb3RlY3RlZDoKKyAgYm9vbCBpc1ByZXNlbnQodWludDMyX3QgSykgY29uc3QgeyByZXR1cm4gUHJlc2VudC50ZXN0KEspOyB9CisgIGJvb2wgaXNEZWxldGVkKHVpbnQzMl90IEspIGNvbnN0IHsgcmV0dXJuIERlbGV0ZWQudGVzdChLKTsgfQorCisgIFRyYWl0c1QgVHJhaXRzOworICBCdWNrZXRMaXN0IEJ1Y2tldHM7CisgIG11dGFibGUgU3BhcnNlQml0VmVjdG9yPD4gUHJlc2VudDsKKyAgbXV0YWJsZSBTcGFyc2VCaXRWZWN0b3I8PiBEZWxldGVkOworCitwcml2YXRlOgorICAvLy8gU2V0IHRoZSBlbnRyeSB1c2luZyBhIGtleSB0eXBlIHRoYXQgdGhlIHNwZWNpZmllZCBUcmFpdHMgY2FuIGNvbnZlcnQKKyAgLy8vIGZyb20gYSByZWFsIGtleSB0byBhbiBpbnRlcm5hbCBrZXkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CisgIGJvb2wgc2V0X2FzX2ludGVybmFsKGNvbnN0IEtleSAmSywgVmFsdWVUIFYsIE9wdGlvbmFsPHVpbnQzMl90PiBJbnRlcm5hbEtleSkgeworICAgIGF1dG8gRW50cnkgPSBmaW5kX2FzKEspOworICAgIGlmIChFbnRyeSAhPSBlbmQoKSkgeworICAgICAgYXNzZXJ0KGlzUHJlc2VudChFbnRyeS5pbmRleCgpKSk7CisgICAgICBhc3NlcnQoVHJhaXRzLnN0b3JhZ2VLZXlUb0xvb2t1cEtleShCdWNrZXRzW0VudHJ5LmluZGV4KCldLmZpcnN0KSA9PSBLKTsKKyAgICAgIC8vIFdlJ3JlIHVwZGF0aW5nLCBubyBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisgICAgICBCdWNrZXRzW0VudHJ5LmluZGV4KCldLnNlY29uZCA9IFY7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYXV0byAmQiA9IEJ1Y2tldHNbRW50cnkuaW5kZXgoKV07CisgICAgYXNzZXJ0KCFpc1ByZXNlbnQoRW50cnkuaW5kZXgoKSkpOworICAgIGFzc2VydChFbnRyeS5pc0VuZCgpKTsKKyAgICBCLmZpcnN0ID0gSW50ZXJuYWxLZXkgPyAqSW50ZXJuYWxLZXkgOiBUcmFpdHMubG9va3VwS2V5VG9TdG9yYWdlS2V5KEspOworICAgIEIuc2Vjb25kID0gVjsKKyAgICBQcmVzZW50LnNldChFbnRyeS5pbmRleCgpKTsKKyAgICBEZWxldGVkLnJlc2V0KEVudHJ5LmluZGV4KCkpOworCisgICAgZ3JvdygpOworCisgICAgYXNzZXJ0KChmaW5kX2FzKEspKSAhPSBlbmQoKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBzdGF0aWMgdWludDMyX3QgbWF4TG9hZCh1aW50MzJfdCBjYXBhY2l0eSkgeyByZXR1cm4gY2FwYWNpdHkgKiAyIC8gMyArIDE7IH0KKworICB2b2lkIGdyb3coKSB7CisgICAgdWludDMyX3QgUyA9IHNpemUoKTsKKyAgICB1aW50MzJfdCBNYXhMb2FkID0gbWF4TG9hZChjYXBhY2l0eSgpKTsKKyAgICBpZiAoUyA8IG1heExvYWQoY2FwYWNpdHkoKSkpCisgICAgICByZXR1cm47CisgICAgYXNzZXJ0KGNhcGFjaXR5KCkgIT0gVUlOVDMyX01BWCAmJiAiQ2FuJ3QgZ3JvdyBIYXNoIHRhYmxlISIpOworCisgICAgdWludDMyX3QgTmV3Q2FwYWNpdHkgPSAoY2FwYWNpdHkoKSA8PSBJTlQzMl9NQVgpID8gTWF4TG9hZCAqIDIgOiBVSU5UMzJfTUFYOworCisgICAgLy8gR3Jvd2luZyByZXF1aXJlcyByZWJ1aWxkaW5nIHRoZSB0YWJsZSBhbmQgcmUtaGFzaGluZyBldmVyeSBpdGVtLiAgTWFrZSBhCisgICAgLy8gY29weSB3aXRoIGEgbGFyZ2VyIGNhcGFjaXR5LCBpbnNlcnQgZXZlcnl0aGluZyBpbnRvIHRoZSBjb3B5LCB0aGVuIHN3YXAKKyAgICAvLyBpdCBpbi4KKyAgICBIYXNoVGFibGUgTmV3TWFwKE5ld0NhcGFjaXR5LCBUcmFpdHMpOworICAgIGZvciAoYXV0byBJIDogUHJlc2VudCkgeworICAgICAgYXV0byBMb29rdXBLZXkgPSBUcmFpdHMuc3RvcmFnZUtleVRvTG9va3VwS2V5KEJ1Y2tldHNbSV0uZmlyc3QpOworICAgICAgTmV3TWFwLnNldF9hc19pbnRlcm5hbChMb29rdXBLZXksIEJ1Y2tldHNbSV0uc2Vjb25kLCBCdWNrZXRzW0ldLmZpcnN0KTsKKyAgICB9CisKKyAgICBCdWNrZXRzLnN3YXAoTmV3TWFwLkJ1Y2tldHMpOworICAgIHN0ZDo6c3dhcChQcmVzZW50LCBOZXdNYXAuUHJlc2VudCk7CisgICAgc3RkOjpzd2FwKERlbGV0ZWQsIE5ld01hcC5EZWxldGVkKTsKKyAgICBhc3NlcnQoY2FwYWNpdHkoKSA9PSBOZXdDYXBhY2l0eSk7CisgICAgYXNzZXJ0KHNpemUoKSA9PSBTKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHBkYgorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9IQVNIVEFCTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9JU2VjdGlvbkNvbnRyaWJWaXNpdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0lTZWN0aW9uQ29udHJpYlZpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjAwZDZhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9JU2VjdGlvbkNvbnRyaWJWaXNpdG9yLmgKQEAgLTAsMCArMSwzMCBAQAorLy89PT0tIElTZWN0aW9uQ29udHJpYlZpc2l0b3IuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUkFXX0lTRUNUSU9OQ09OVFJJQlZJU0lUT1JfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUkFXX0lTRUNUSU9OQ09OVFJJQlZJU0lUT1JfSAorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKKworc3RydWN0IFNlY3Rpb25Db250cmliOworc3RydWN0IFNlY3Rpb25Db250cmliMjsKKworY2xhc3MgSVNlY3Rpb25Db250cmliVmlzaXRvciB7CitwdWJsaWM6CisgIHZpcnR1YWwgfklTZWN0aW9uQ29udHJpYlZpc2l0b3IoKSA9IGRlZmF1bHQ7CisKKyAgdmlydHVhbCB2b2lkIHZpc2l0KGNvbnN0IFNlY3Rpb25Db250cmliICZDKSA9IDA7CisgIHZpcnR1YWwgdm9pZCB2aXNpdChjb25zdCBTZWN0aW9uQ29udHJpYjIgJkMpID0gMDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBwZGIKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUkFXX0lTRUNUSU9OQ09OVFJJQlZJU0lUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9JbmZvU3RyZWFtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0luZm9TdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWViNDIzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9JbmZvU3RyZWFtLmgKQEAgLTAsMCArMSw3NSBAQAorLy89PT0tIEluZm9TdHJlYW0uaCAtIFBEQiBJbmZvIFN0cmVhbSAoU3RyZWFtIDEpIEFjY2VzcyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQklORk9TVFJFQU1fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQklORk9TVFJFQU1fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQml0bWFza0VudW0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9HVUlELmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vTVNGL01hcHBlZEJsb2NrU3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYW1lZFN0cmVhbU1hcC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUmF3Q29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL1BEQlR5cGVzLmgiCisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgSW5mb1N0cmVhbUJ1aWxkZXI7CitjbGFzcyBQREJGaWxlOworCitjbGFzcyBJbmZvU3RyZWFtIHsKKyAgZnJpZW5kIGNsYXNzIEluZm9TdHJlYW1CdWlsZGVyOworCitwdWJsaWM6CisgIEluZm9TdHJlYW0oc3RkOjp1bmlxdWVfcHRyPG1zZjo6TWFwcGVkQmxvY2tTdHJlYW0+IFN0cmVhbSk7CisKKyAgRXJyb3IgcmVsb2FkKCk7CisKKyAgdWludDMyX3QgZ2V0U3RyZWFtU2l6ZSgpIGNvbnN0OworCisgIGNvbnN0IEluZm9TdHJlYW1IZWFkZXIgKmdldEhlYWRlcigpIGNvbnN0IHsgcmV0dXJuIEhlYWRlcjsgfQorCisgIGJvb2wgY29udGFpbnNJZFN0cmVhbSgpIGNvbnN0OworICBQZGJSYXdfSW1wbFZlciBnZXRWZXJzaW9uKCkgY29uc3Q7CisgIHVpbnQzMl90IGdldFNpZ25hdHVyZSgpIGNvbnN0OworICB1aW50MzJfdCBnZXRBZ2UoKSBjb25zdDsKKyAgY29kZXZpZXc6OkdVSUQgZ2V0R3VpZCgpIGNvbnN0OworICB1aW50MzJfdCBnZXROYW1lZFN0cmVhbU1hcEJ5dGVTaXplKCkgY29uc3Q7CisKKyAgUGRiUmF3X0ZlYXR1cmVzIGdldEZlYXR1cmVzKCkgY29uc3Q7CisgIEFycmF5UmVmPFBkYlJhd19GZWF0dXJlU2lnPiBnZXRGZWF0dXJlU2lnbmF0dXJlcygpIGNvbnN0OworCisgIGNvbnN0IE5hbWVkU3RyZWFtTWFwICZnZXROYW1lZFN0cmVhbXMoKSBjb25zdDsKKworICBCaW5hcnlTdWJzdHJlYW1SZWYgZ2V0TmFtZWRTdHJlYW1zQnVmZmVyKCkgY29uc3Q7CisKKyAgdWludDMyX3QgZ2V0TmFtZWRTdHJlYW1JbmRleChsbHZtOjpTdHJpbmdSZWYgTmFtZSkgY29uc3Q7CisgIFN0cmluZ01hcDx1aW50MzJfdD4gbmFtZWRfc3RyZWFtcygpIGNvbnN0OworCitwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8bXNmOjpNYXBwZWRCbG9ja1N0cmVhbT4gU3RyZWFtOworCisgIGNvbnN0IEluZm9TdHJlYW1IZWFkZXIgKkhlYWRlcjsKKworICBCaW5hcnlTdWJzdHJlYW1SZWYgU3ViTmFtZWRTdHJlYW1zOworCisgIHN0ZDo6dmVjdG9yPFBkYlJhd19GZWF0dXJlU2lnPiBGZWF0dXJlU2lnbmF0dXJlczsKKyAgUGRiUmF3X0ZlYXR1cmVzIEZlYXR1cmVzID0gUGRiRmVhdHVyZU5vbmU7CisKKyAgdWludDMyX3QgTmFtZWRTdHJlYW1NYXBCeXRlU2l6ZSA9IDA7CisKKyAgTmFtZWRTdHJlYW1NYXAgTmFtZWRTdHJlYW1zOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0luZm9TdHJlYW1CdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0luZm9TdHJlYW1CdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5ZThhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvSW5mb1N0cmVhbUJ1aWxkZXIuaApAQCAtMCwwICsxLDY4IEBACisvLz09PS0gSW5mb1N0cmVhbUJ1aWxkZXIuaCAtIFBEQiBJbmZvIFN0cmVhbSBDcmVhdGlvbiAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCSU5GT1NUUkVBTUJVSUxERVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQklORk9TVFJFQU1CVUlMREVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hbWVkU3RyZWFtTWFwLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9QREJGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdDb25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWY7CisKK25hbWVzcGFjZSBtc2YgeworY2xhc3MgTVNGQnVpbGRlcjsKK30KK25hbWVzcGFjZSBwZGIgeworY2xhc3MgUERCRmlsZTsKK2NsYXNzIE5hbWVkU3RyZWFtTWFwOworCitjbGFzcyBJbmZvU3RyZWFtQnVpbGRlciB7CitwdWJsaWM6CisgIEluZm9TdHJlYW1CdWlsZGVyKG1zZjo6TVNGQnVpbGRlciAmTXNmLCBOYW1lZFN0cmVhbU1hcCAmTmFtZWRTdHJlYW1zKTsKKyAgSW5mb1N0cmVhbUJ1aWxkZXIoY29uc3QgSW5mb1N0cmVhbUJ1aWxkZXIgJikgPSBkZWxldGU7CisgIEluZm9TdHJlYW1CdWlsZGVyICZvcGVyYXRvcj0oY29uc3QgSW5mb1N0cmVhbUJ1aWxkZXIgJikgPSBkZWxldGU7CisKKyAgdm9pZCBzZXRWZXJzaW9uKFBkYlJhd19JbXBsVmVyIFYpOworICB2b2lkIHNldFNpZ25hdHVyZSh1aW50MzJfdCBTKTsKKyAgdm9pZCBzZXRBZ2UodWludDMyX3QgQSk7CisgIHZvaWQgc2V0R3VpZChjb2Rldmlldzo6R1VJRCBHKTsKKyAgdm9pZCBhZGRGZWF0dXJlKFBkYlJhd19GZWF0dXJlU2lnIFNpZyk7CisKKyAgdWludDMyX3QgZ2V0QWdlKCkgY29uc3QgeyByZXR1cm4gQWdlOyB9CisgIGNvZGV2aWV3OjpHVUlEIGdldEd1aWQoKSBjb25zdCB7IHJldHVybiBHdWlkOyB9CisgIE9wdGlvbmFsPHVpbnQzMl90PiBnZXRTaWduYXR1cmUoKSBjb25zdCB7IHJldHVybiBTaWduYXR1cmU7IH0KKworICB1aW50MzJfdCBmaW5hbGl6ZSgpOworCisgIEVycm9yIGZpbmFsaXplTXNmTGF5b3V0KCk7CisKKyAgRXJyb3IgY29tbWl0KGNvbnN0IG1zZjo6TVNGTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiBCdWZmZXIpIGNvbnN0OworCitwcml2YXRlOgorICBtc2Y6Ok1TRkJ1aWxkZXIgJk1zZjsKKworICBzdGQ6OnZlY3RvcjxQZGJSYXdfRmVhdHVyZVNpZz4gRmVhdHVyZXM7CisgIFBkYlJhd19JbXBsVmVyIFZlcjsKKyAgdWludDMyX3QgQWdlOworICBPcHRpb25hbDx1aW50MzJfdD4gU2lnbmF0dXJlOworICBjb2Rldmlldzo6R1VJRCBHdWlkOworCisgIE5hbWVkU3RyZWFtTWFwICZOYW1lZFN0cmVhbXM7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTW9kdWxlRGVidWdTdHJlYW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTW9kdWxlRGVidWdTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjAyMjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9Nb2R1bGVEZWJ1Z1N0cmVhbS5oCkBAIC0wLDAgKzEsODYgQEAKKy8vPT09LSBNb2R1bGVEZWJ1Z1N0cmVhbS5oIC0gUERCIE1vZHVsZSBJbmZvIFN0cmVhbSBBY2Nlc3MgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9NT0RVTEVERUJVR1NUUkVBTV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTU9EVUxFREVCVUdTVFJFQU1fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N1YnNlY3Rpb25SZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9NU0YvTWFwcGVkQmxvY2tTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBEYmlNb2R1bGVEZXNjcmlwdG9yOworCitjbGFzcyBNb2R1bGVEZWJ1Z1N0cmVhbVJlZiB7CisgIHVzaW5nIERlYnVnU3Vic2VjdGlvbkl0ZXJhdG9yID0gY29kZXZpZXc6OkRlYnVnU3Vic2VjdGlvbkFycmF5OjpJdGVyYXRvcjsKKworcHVibGljOgorICBNb2R1bGVEZWJ1Z1N0cmVhbVJlZihjb25zdCBEYmlNb2R1bGVEZXNjcmlwdG9yICZNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxtc2Y6Ok1hcHBlZEJsb2NrU3RyZWFtPiBTdHJlYW0pOworICBNb2R1bGVEZWJ1Z1N0cmVhbVJlZihNb2R1bGVEZWJ1Z1N0cmVhbVJlZiAmJk90aGVyKSA9IGRlZmF1bHQ7CisgIE1vZHVsZURlYnVnU3RyZWFtUmVmKGNvbnN0IE1vZHVsZURlYnVnU3RyZWFtUmVmICZPdGhlcikgPSBkZWZhdWx0OworICB+TW9kdWxlRGVidWdTdHJlYW1SZWYoKTsKKworICBFcnJvciByZWxvYWQoKTsKKworICB1aW50MzJfdCBzaWduYXR1cmUoKSBjb25zdCB7IHJldHVybiBTaWduYXR1cmU7IH0KKworICBpdGVyYXRvcl9yYW5nZTxjb2Rldmlldzo6Q1ZTeW1ib2xBcnJheTo6SXRlcmF0b3I+CisgIHN5bWJvbHMoYm9vbCAqSGFkRXJyb3IpIGNvbnN0OworCisgIGNvbnN0IGNvZGV2aWV3OjpDVlN5bWJvbEFycmF5ICZnZXRTeW1ib2xBcnJheSgpIGNvbnN0IHsgcmV0dXJuIFN5bWJvbEFycmF5OyB9CisKKyAgQmluYXJ5U3Vic3RyZWFtUmVmIGdldFN5bWJvbHNTdWJzdHJlYW0oKSBjb25zdDsKKyAgQmluYXJ5U3Vic3RyZWFtUmVmIGdldEMxMUxpbmVzU3Vic3RyZWFtKCkgY29uc3Q7CisgIEJpbmFyeVN1YnN0cmVhbVJlZiBnZXRDMTNMaW5lc1N1YnN0cmVhbSgpIGNvbnN0OworICBCaW5hcnlTdWJzdHJlYW1SZWYgZ2V0R2xvYmFsUmVmc1N1YnN0cmVhbSgpIGNvbnN0OworCisgIE1vZHVsZURlYnVnU3RyZWFtUmVmICZvcGVyYXRvcj0oTW9kdWxlRGVidWdTdHJlYW1SZWYgJiZPdGhlcikgPSBkZWZhdWx0OworCisgIGl0ZXJhdG9yX3JhbmdlPERlYnVnU3Vic2VjdGlvbkl0ZXJhdG9yPiBzdWJzZWN0aW9ucygpIGNvbnN0OworICBjb2Rldmlldzo6RGVidWdTdWJzZWN0aW9uQXJyYXkgZ2V0U3Vic2VjdGlvbnNBcnJheSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3Vic2VjdGlvbnM7CisgIH0KKworICBib29sIGhhc0RlYnVnU3Vic2VjdGlvbnMoKSBjb25zdDsKKworICBFcnJvciBjb21taXQoKTsKKworICBFeHBlY3RlZDxjb2Rldmlldzo6RGVidWdDaGVja3N1bXNTdWJzZWN0aW9uUmVmPgorICBmaW5kQ2hlY2tzdW1zU3Vic2VjdGlvbigpIGNvbnN0OworCitwcml2YXRlOgorICBjb25zdCBEYmlNb2R1bGVEZXNjcmlwdG9yICZNb2Q7CisKKyAgdWludDMyX3QgU2lnbmF0dXJlOworCisgIHN0ZDo6c2hhcmVkX3B0cjxtc2Y6Ok1hcHBlZEJsb2NrU3RyZWFtPiBTdHJlYW07CisKKyAgY29kZXZpZXc6OkNWU3ltYm9sQXJyYXkgU3ltYm9sQXJyYXk7CisKKyAgQmluYXJ5U3Vic3RyZWFtUmVmIFN5bWJvbHNTdWJzdHJlYW07CisgIEJpbmFyeVN1YnN0cmVhbVJlZiBDMTFMaW5lc1N1YnN0cmVhbTsKKyAgQmluYXJ5U3Vic3RyZWFtUmVmIEMxM0xpbmVzU3Vic3RyZWFtOworICBCaW5hcnlTdWJzdHJlYW1SZWYgR2xvYmFsUmVmc1N1YnN0cmVhbTsKKworICBjb2Rldmlldzo6RGVidWdTdWJzZWN0aW9uQXJyYXkgU3Vic2VjdGlvbnM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgcGRiCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9NT0RVTEVERUJVR1NUUkVBTV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hbWVkU3RyZWFtTWFwLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hbWVkU3RyZWFtTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiOGYxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmFtZWRTdHJlYW1NYXAuaApAQCAtMCwwICsxLDczIEBACisvLz09PS0gTmFtZWRTdHJlYW1NYXAuaCAtIFBEQiBOYW1lZCBTdHJlYW0gTWFwIC0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTkFNRURTVFJFQU1NQVBfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX05BTUVEU1RSRUFNTUFQX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0hhc2hUYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmluYXJ5U3RyZWFtUmVhZGVyOworY2xhc3MgQmluYXJ5U3RyZWFtV3JpdGVyOworCituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgTmFtZWRTdHJlYW1NYXA7CisKK3N0cnVjdCBOYW1lZFN0cmVhbU1hcFRyYWl0cyB7CisgIE5hbWVkU3RyZWFtTWFwICpOUzsKKworICBleHBsaWNpdCBOYW1lZFN0cmVhbU1hcFRyYWl0cyhOYW1lZFN0cmVhbU1hcCAmTlMpOworICB1aW50MTZfdCBoYXNoTG9va3VwS2V5KFN0cmluZ1JlZiBTKSBjb25zdDsKKyAgU3RyaW5nUmVmIHN0b3JhZ2VLZXlUb0xvb2t1cEtleSh1aW50MzJfdCBPZmZzZXQpIGNvbnN0OworICB1aW50MzJfdCBsb29rdXBLZXlUb1N0b3JhZ2VLZXkoU3RyaW5nUmVmIFMpOworfTsKKworY2xhc3MgTmFtZWRTdHJlYW1NYXAgeworICBmcmllbmQgY2xhc3MgTmFtZWRTdHJlYW1NYXBCdWlsZGVyOworCitwdWJsaWM6CisgIE5hbWVkU3RyZWFtTWFwKCk7CisKKyAgRXJyb3IgbG9hZChCaW5hcnlTdHJlYW1SZWFkZXIgJlN0cmVhbSk7CisgIEVycm9yIGNvbW1pdChCaW5hcnlTdHJlYW1Xcml0ZXIgJldyaXRlcikgY29uc3Q7CisgIHVpbnQzMl90IGNhbGN1bGF0ZVNlcmlhbGl6ZWRMZW5ndGgoKSBjb25zdDsKKworICB1aW50MzJfdCBzaXplKCkgY29uc3Q7CisgIGJvb2wgZ2V0KFN0cmluZ1JlZiBTdHJlYW0sIHVpbnQzMl90ICZTdHJlYW1ObykgY29uc3Q7CisgIHZvaWQgc2V0KFN0cmluZ1JlZiBTdHJlYW0sIHVpbnQzMl90IFN0cmVhbU5vKTsKKworICB1aW50MzJfdCBhcHBlbmRTdHJpbmdEYXRhKFN0cmluZ1JlZiBTKTsKKyAgU3RyaW5nUmVmIGdldFN0cmluZyh1aW50MzJfdCBPZmZzZXQpIGNvbnN0OworICB1aW50MzJfdCBoYXNoU3RyaW5nKHVpbnQzMl90IE9mZnNldCkgY29uc3Q7CisKKyAgU3RyaW5nTWFwPHVpbnQzMl90PiBlbnRyaWVzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIE5hbWVkU3RyZWFtTWFwVHJhaXRzIEhhc2hUcmFpdHM7CisgIC8vLyBDbG9zZWQgaGFzaCB0YWJsZSBmcm9tIE9mZnNldCAtPiBTdHJlYW1OdW1iZXIsIHdoZXJlIE9mZnNldCBpcyB0aGUgb2Zmc2V0CisgIC8vLyBvZiB0aGUgc3RyZWFtIG5hbWUgaW4gTmFtZXNCdWZmZXIuCisgIEhhc2hUYWJsZTxzdXBwb3J0Ojp1bGl0dGxlMzJfdCwgTmFtZWRTdHJlYW1NYXBUcmFpdHM+IE9mZnNldEluZGV4TWFwOworCisgIC8vLyBCdWZmZXIgb2Ygc3RyaW5nIGRhdGEuCisgIHN0ZDo6dmVjdG9yPGNoYXI+IE5hbWVzQnVmZmVyOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHBkYgorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9OQU1FRFNUUkVBTU1BUF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZUJ1aWx0aW5TeW1ib2wuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlQnVpbHRpblN5bWJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNTMyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZUJ1aWx0aW5TeW1ib2wuaApAQCAtMCwwICsxLDQ5IEBACisvLz09PS0gTmF0aXZlQnVpbHRpblN5bWJvbC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTkFUSVZFQlVJTFRJTlNZTUJPTF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTkFUSVZFQlVJTFRJTlNZTUJPTF9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZVJhd1N5bWJvbC5oIgorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL1BEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBOYXRpdmVTZXNzaW9uOworCitjbGFzcyBOYXRpdmVCdWlsdGluU3ltYm9sIDogcHVibGljIE5hdGl2ZVJhd1N5bWJvbCB7CitwdWJsaWM6CisgIE5hdGl2ZUJ1aWx0aW5TeW1ib2woTmF0aXZlU2Vzc2lvbiAmUERCU2Vzc2lvbiwgU3ltSW5kZXhJZCBJZCwKKyAgICAgICAgICAgICAgICAgICAgICBQREJfQnVpbHRpblR5cGUgVCwgdWludDY0X3QgTCk7CisgIH5OYXRpdmVCdWlsdGluU3ltYm9sKCkgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8TmF0aXZlUmF3U3ltYm9sPiBjbG9uZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIGludCBJbmRlbnQpIGNvbnN0IG92ZXJyaWRlOworCisgIFBEQl9TeW1UeXBlIGdldFN5bVRhZygpIGNvbnN0IG92ZXJyaWRlOworCisgIFBEQl9CdWlsdGluVHlwZSBnZXRCdWlsdGluVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzQ29uc3RUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldExlbmd0aCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzVW5hbGlnbmVkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzVm9sYXRpbGVUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgTmF0aXZlU2Vzc2lvbiAmU2Vzc2lvbjsKKyAgUERCX0J1aWx0aW5UeXBlIFR5cGU7CisgIHVpbnQ2NF90IExlbmd0aDsKK307CisKK30gLy8gbmFtZXNwYWNlIHBkYgorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlQ29tcGlsYW5kU3ltYm9sLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZUNvbXBpbGFuZFN5bWJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNWMwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZUNvbXBpbGFuZFN5bWJvbC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8vPT09LSBOYXRpdmVDb21waWxhbmRTeW1ib2wuaCAtIG5hdGl2ZSBpbXBsIGZvciBjb21waWxhbmQgc3ltcyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9OQVRJVkVDT01QSUxBTkRTWU1CT0xfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX05BVElWRUNPTVBJTEFORFNZTUJPTF9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0RiaU1vZHVsZURlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZVJhd1N5bWJvbC5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgTmF0aXZlQ29tcGlsYW5kU3ltYm9sIDogcHVibGljIE5hdGl2ZVJhd1N5bWJvbCB7CitwdWJsaWM6CisgIE5hdGl2ZUNvbXBpbGFuZFN5bWJvbChOYXRpdmVTZXNzaW9uICZTZXNzaW9uLCBTeW1JbmRleElkIFN5bWJvbElkLAorICAgICAgICAgICAgICAgICAgICAgICAgRGJpTW9kdWxlRGVzY3JpcHRvciBNSSk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPE5hdGl2ZVJhd1N5bWJvbD4gY2xvbmUoKSBjb25zdCBvdmVycmlkZTsKKworICBQREJfU3ltVHlwZSBnZXRTeW1UYWcoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0VkaXRBbmRDb250aW51ZUVuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TGV4aWNhbFBhcmVudElkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldExpYnJhcnlOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgRGJpTW9kdWxlRGVzY3JpcHRvciBNb2R1bGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBwZGIKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZUVudW1Nb2R1bGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZUVudW1Nb2R1bGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhMTQ2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlRW51bU1vZHVsZXMuaApAQCAtMCwwICsxLDQxIEBACisvLz09LSBOYXRpdmVFbnVtTW9kdWxlcy5oIC0gTmF0aXZlIE1vZHVsZSBFbnVtZXJhdG9yIGltcGwgLS0tLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTkFUSVZFRU5VTU1PRFVMRVNfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX05BVElWRUVOVU1NT0RVTEVTX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCRW51bUNoaWxkcmVuLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9EYmlNb2R1bGVEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbC5oIgorbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIERiaU1vZHVsZUxpc3Q7CitjbGFzcyBOYXRpdmVTZXNzaW9uOworCitjbGFzcyBOYXRpdmVFbnVtTW9kdWxlcyA6IHB1YmxpYyBJUERCRW51bUNoaWxkcmVuPFBEQlN5bWJvbD4geworcHVibGljOgorICBOYXRpdmVFbnVtTW9kdWxlcyhOYXRpdmVTZXNzaW9uICZTZXNzaW9uLCBjb25zdCBEYmlNb2R1bGVMaXN0ICZNb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJbmRleCA9IDApOworCisgIHVpbnQzMl90IGdldENoaWxkQ291bnQoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbD4gZ2V0Q2hpbGRBdEluZGV4KHVpbnQzMl90IEluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbD4gZ2V0TmV4dCgpIG92ZXJyaWRlOworICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGU7CisgIE5hdGl2ZUVudW1Nb2R1bGVzICpjbG9uZSgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBOYXRpdmVTZXNzaW9uICZTZXNzaW9uOworICBjb25zdCBEYmlNb2R1bGVMaXN0ICZNb2R1bGVzOworICB1aW50MzJfdCBJbmRleDsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVFbnVtU3ltYm9sLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZUVudW1TeW1ib2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWI3Yjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVFbnVtU3ltYm9sLmgKQEAgLTAsMCArMSw2MCBAQAorLy89PT0tIE5hdGl2ZUVudW1TeW1ib2wuaCAtIGluZm8gYWJvdXQgZW51bSB0eXBlIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX05BVElWRUVOVU1TWU1CT0xfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX05BVElWRUVOVU1TWU1CT0xfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlVmlzaXRvckNhbGxiYWNrcy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlUmF3U3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVTZXNzaW9uLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBOYXRpdmVFbnVtU3ltYm9sIDogcHVibGljIE5hdGl2ZVJhd1N5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgY29kZXZpZXc6OlR5cGVWaXNpdG9yQ2FsbGJhY2tzIHsKK3B1YmxpYzoKKyAgTmF0aXZlRW51bVN5bWJvbChOYXRpdmVTZXNzaW9uICZTZXNzaW9uLCBTeW1JbmRleElkIElkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGV2aWV3OjpDVlR5cGUgJkNWKTsKKyAgfk5hdGl2ZUVudW1TeW1ib2woKSBvdmVycmlkZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8TmF0aXZlUmF3U3ltYm9sPiBjbG9uZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgIGZpbmRDaGlsZHJlbihQREJfU3ltVHlwZSBUeXBlKSBjb25zdCBvdmVycmlkZTsKKworICBFcnJvciB2aXNpdEtub3duUmVjb3JkKGNvZGV2aWV3OjpDVlR5cGUgJkNWUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rldmlldzo6RW51bVJlY29yZCAmUmVjb3JkKSBvdmVycmlkZTsKKyAgRXJyb3IgdmlzaXRLbm93bk1lbWJlcihjb2Rldmlldzo6Q1ZNZW1iZXJSZWNvcmQgJkNWTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rldmlldzo6RW51bWVyYXRvclJlY29yZCAmUmVjb3JkKSBvdmVycmlkZTsKKworICBQREJfU3ltVHlwZSBnZXRTeW1UYWcoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0Q2xhc3NQYXJlbnRJZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRVbm1vZGlmaWVkVHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzQ29uc3RydWN0b3IoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNBc3NpZ25tZW50T3BlcmF0b3IoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNDYXN0T3BlcmF0b3IoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0TGVuZ3RoKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc05lc3RlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc092ZXJsb2FkZWRPcGVyYXRvcigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUGFja2VkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTY29wZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgY29kZXZpZXc6OkNWVHlwZSBDVjsKKyAgY29kZXZpZXc6OkVudW1SZWNvcmQgUmVjb3JkOworfTsKKworfSAvLyBuYW1lc3BhY2UgcGRiCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX05BVElWRUVOVU1TWU1CT0xfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVFbnVtVHlwZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlRW51bVR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBhNWM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlRW51bVR5cGVzLmgKQEAgLTAsMCArMSw1MSBAQAorLy89PS0gTmF0aXZlRW51bVR5cGVzLmggLSBOYXRpdmUgVHlwZSBFbnVtZXJhdG9yIGltcGwgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX05BVElWRUVOVU1UWVBFU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTkFUSVZFRU5VTVRZUEVTX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0xhenlSYW5kb21UeXBlQ29sbGVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQkVudW1DaGlsZHJlbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2wuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIE5hdGl2ZVNlc3Npb247CisKK2NsYXNzIE5hdGl2ZUVudW1UeXBlcyA6IHB1YmxpYyBJUERCRW51bUNoaWxkcmVuPFBEQlN5bWJvbD4geworcHVibGljOgorICBOYXRpdmVFbnVtVHlwZXMoTmF0aXZlU2Vzc2lvbiAmU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgIGNvZGV2aWV3OjpMYXp5UmFuZG9tVHlwZUNvbGxlY3Rpb24gJlR5cGVDb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgY29kZXZpZXc6OlR5cGVMZWFmS2luZCBLaW5kKTsKKworICB1aW50MzJfdCBnZXRDaGlsZENvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2w+IGdldENoaWxkQXRJbmRleCh1aW50MzJfdCBJbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2w+IGdldE5leHQoKSBvdmVycmlkZTsKKyAgdm9pZCByZXNldCgpIG92ZXJyaWRlOworICBOYXRpdmVFbnVtVHlwZXMgKmNsb25lKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIE5hdGl2ZUVudW1UeXBlcyhOYXRpdmVTZXNzaW9uICZTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29kZXZpZXc6OlR5cGVJbmRleD4gJk1hdGNoZXMsCisgICAgICAgICAgICAgICAgICBjb2Rldmlldzo6VHlwZUxlYWZLaW5kIEtpbmQpOworCisgIHN0ZDo6dmVjdG9yPGNvZGV2aWV3OjpUeXBlSW5kZXg+IE1hdGNoZXM7CisgIHVpbnQzMl90IEluZGV4OworICBOYXRpdmVTZXNzaW9uICZTZXNzaW9uOworICBjb2Rldmlldzo6VHlwZUxlYWZLaW5kIEtpbmQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBwZGIKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZUV4ZVN5bWJvbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVFeGVTeW1ib2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODdjN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVFeGVTeW1ib2wuaApAQCAtMCwwICsxLDQxIEBACisvLz09PS0gTmF0aXZlRXhlU3ltYm9sLmggLSBuYXRpdmUgaW1wbCBmb3IgUERCU3ltYm9sRXhlIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTkFUSVZFRVhFU1lNQk9MX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9OQVRJVkVFWEVTWU1CT0xfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVSYXdTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZVNlc3Npb24uaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIE5hdGl2ZUV4ZVN5bWJvbCA6IHB1YmxpYyBOYXRpdmVSYXdTeW1ib2wgeworcHVibGljOgorICBOYXRpdmVFeGVTeW1ib2woTmF0aXZlU2Vzc2lvbiAmU2Vzc2lvbiwgU3ltSW5kZXhJZCBTeW1ib2xJZCk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPE5hdGl2ZVJhd1N5bWJvbD4gY2xvbmUoKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICBmaW5kQ2hpbGRyZW4oUERCX1N5bVR5cGUgVHlwZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdWludDMyX3QgZ2V0QWdlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldFN5bWJvbHNGaWxlTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICBjb2Rldmlldzo6R1VJRCBnZXRHdWlkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzQ1R5cGVzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzUHJpdmF0ZVN5bWJvbHMoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgUERCRmlsZSAmRmlsZTsKK307CisKK30gLy8gbmFtZXNwYWNlIHBkYgorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlUmF3U3ltYm9sLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZVJhd1N5bWJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNzBlY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZVJhd1N5bWJvbC5oCkBAIC0wLDAgKzEsMjM5IEBACisvLz09LSBOYXRpdmVSYXdTeW1ib2wuaCAtIE5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBJUERCUmF3U3ltYm9sIC0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTkFUSVZFUkFXU1lNQk9MX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9OQVRJVkVSQVdTWU1CT0xfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJSYXdTeW1ib2wuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIE5hdGl2ZVNlc3Npb247CisKK3R5cGVkZWYgdWludDMyX3QgU3ltSW5kZXhJZDsKKworY2xhc3MgTmF0aXZlUmF3U3ltYm9sIDogcHVibGljIElQREJSYXdTeW1ib2wgeworcHVibGljOgorICBOYXRpdmVSYXdTeW1ib2woTmF0aXZlU2Vzc2lvbiAmUERCU2Vzc2lvbiwgU3ltSW5kZXhJZCBTeW1ib2xJZCk7CisKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8TmF0aXZlUmF3U3ltYm9sPiBjbG9uZSgpIGNvbnN0ID0gMDsKKworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBpbnQgSW5kZW50KSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICAgIGZpbmRDaGlsZHJlbihQREJfU3ltVHlwZSBUeXBlKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgICBmaW5kQ2hpbGRyZW4oUERCX1N5bVR5cGUgVHlwZSwgU3RyaW5nUmVmIE5hbWUsCisgICAgICBQREJfTmFtZVNlYXJjaEZsYWdzIEZsYWdzKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgICBmaW5kQ2hpbGRyZW5CeUFkZHIoUERCX1N5bVR5cGUgVHlwZSwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIFBEQl9OYW1lU2VhcmNoRmxhZ3MgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNlY3Rpb24sIHVpbnQzMl90IE9mZnNldCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgICAgZmluZENoaWxkcmVuQnlWQShQREJfU3ltVHlwZSBUeXBlLCBTdHJpbmdSZWYgTmFtZSwgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFZBKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgICBmaW5kQ2hpbGRyZW5CeVJWQShQREJfU3ltVHlwZSBUeXBlLCBTdHJpbmdSZWYgTmFtZSwgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncywKKyAgICAgIHVpbnQzMl90IFJWQSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgICBmaW5kSW5saW5lRnJhbWVzQnlBZGRyKHVpbnQzMl90IFNlY3Rpb24sIHVpbnQzMl90IE9mZnNldCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgICAgZmluZElubGluZUZyYW1lc0J5UlZBKHVpbnQzMl90IFJWQSkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgICAgZmluZElubGluZUZyYW1lc0J5VkEodWludDY0X3QgVkEpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPiBmaW5kSW5saW5lZUxpbmVzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPgorICAgIGZpbmRJbmxpbmVlTGluZXNCeUFkZHIodWludDMyX3QgU2VjdGlvbiwgdWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTGVuZ3RoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtTGluZU51bWJlcnM+CisgICAgZmluZElubGluZWVMaW5lc0J5UlZBKHVpbnQzMl90IFJWQSwgdWludDMyX3QgTGVuZ3RoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtTGluZU51bWJlcnM+CisgICAgZmluZElubGluZWVMaW5lc0J5VkEodWludDY0X3QgVkEsIHVpbnQzMl90IExlbmd0aCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZXREYXRhQnl0ZXMoU21hbGxWZWN0b3I8dWludDhfdCwgMzI+ICZCeXRlcykgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0RnJvbnRFbmRWZXJzaW9uKFZlcnNpb25JbmZvICZWZXJzaW9uKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBnZXRCYWNrRW5kVmVyc2lvbihWZXJzaW9uSW5mbyAmVmVyc2lvbikgY29uc3Qgb3ZlcnJpZGU7CisgIFBEQl9NZW1iZXJBY2Nlc3MgZ2V0QWNjZXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEFkZHJlc3NPZmZzZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0QWRkcmVzc1NlY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0QWdlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEFycmF5SW5kZXhUeXBlSWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0QmFzZURhdGFPZmZzZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0QmFzZURhdGFTbG90KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEJhc2VTeW1ib2xJZCgpIGNvbnN0IG92ZXJyaWRlOworICBQREJfQnVpbHRpblR5cGUgZ2V0QnVpbHRpblR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0Qml0UG9zaXRpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgUERCX0NhbGxpbmdDb252IGdldENhbGxpbmdDb252ZW50aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldENsYXNzUGFyZW50SWQoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0Q29tcGlsZXJOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldENvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldENvdW50TGl2ZVJhbmdlcygpIGNvbnN0IG92ZXJyaWRlOworICBQREJfTGFuZyBnZXRMYW5ndWFnZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRMZXhpY2FsUGFyZW50SWQoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TGl2ZVJhbmdlU3RhcnRBZGRyZXNzT2Zmc2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldExpdmVSYW5nZVN0YXJ0QWRkcmVzc1NlY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TGl2ZVJhbmdlU3RhcnRSZWxhdGl2ZVZpcnR1YWxBZGRyZXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGNvZGV2aWV3OjpSZWdpc3RlcklkIGdldExvY2FsQmFzZVBvaW50ZXJSZWdpc3RlcklkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldExvd2VyQm91bmRJZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRNZW1vcnlTcGFjZUtpbmQoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXROdW1iZXJPZkFjY2VsZXJhdG9yUG9pbnRlclRhZ3MoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TnVtYmVyT2ZDb2x1bW5zKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldE51bWJlck9mTW9kaWZpZXJzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldE51bWJlck9mUmVnaXN0ZXJJbmRpY2VzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldE51bWJlck9mUm93cygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRPYmplY3RGaWxlTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRPZW1JZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRPZW1TeW1ib2xJZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRPZmZzZXRJblVkdCgpIGNvbnN0IG92ZXJyaWRlOworICBQREJfQ3B1IGdldFBsYXRmb3JtKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFJhbmsoKSBjb25zdCBvdmVycmlkZTsKKyAgY29kZXZpZXc6OlJlZ2lzdGVySWQgZ2V0UmVnaXN0ZXJJZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRSZWdpc3RlclR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0UmVsYXRpdmVWaXJ0dWFsQWRkcmVzcygpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTYW1wbGVyU2xvdCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTaWduYXR1cmUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0U2l6ZUluVWR0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFNsb3QoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0U291cmNlRmlsZU5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJMaW5lTnVtYmVyPiBnZXRTcmNMaW5lT25UeXBlRGVmbigpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTdHJpZGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0U3ViVHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldFN5bWJvbHNGaWxlTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTeW1JbmRleElkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFRhcmdldE9mZnNldCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRUYXJnZXRSZWxhdGl2ZVZpcnR1YWxBZGRyZXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFRhcmdldFZpcnR1YWxBZGRyZXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFRhcmdldFNlY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VGV4dHVyZVNsb3QoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VGltZVN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFRva2VuKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRVYXZTbG90KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldFVuZGVjb3JhdGVkTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRVbmRlY29yYXRlZE5hbWVFeChQREJfVW5kbmFtZUZsYWdzIEZsYWdzKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VW5tb2RpZmllZFR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRVcHBlckJvdW5kSWQoKSBjb25zdCBvdmVycmlkZTsKKyAgVmFyaWFudCBnZXRWYWx1ZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRWaXJ0dWFsQmFzZURpc3BJbmRleCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRWaXJ0dWFsQmFzZU9mZnNldCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRWaXJ0dWFsVGFibGVTaGFwZUlkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2xUeXBlQnVpbHRpbj4KKyAgZ2V0VmlydHVhbEJhc2VUYWJsZVR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgUERCX0RhdGFLaW5kIGdldERhdGFLaW5kKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFBEQl9TeW1UeXBlIGdldFN5bVRhZygpIGNvbnN0IG92ZXJyaWRlOworICBjb2Rldmlldzo6R1VJRCBnZXRHdWlkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludDMyX3QgZ2V0T2Zmc2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludDMyX3QgZ2V0VGhpc0FkanVzdCgpIGNvbnN0IG92ZXJyaWRlOworICBpbnQzMl90IGdldFZpcnR1YWxCYXNlUG9pbnRlck9mZnNldCgpIGNvbnN0IG92ZXJyaWRlOworICBQREJfTG9jVHlwZSBnZXRMb2NhdGlvblR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgUERCX01hY2hpbmUgZ2V0TWFjaGluZVR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgY29kZXZpZXc6OlRodW5rT3JkaW5hbCBnZXRUaHVua09yZGluYWwoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0TGVuZ3RoKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldExpdmVSYW5nZUxlbmd0aCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRWaXJ0dWFsQWRkcmVzcygpIGNvbnN0IG92ZXJyaWRlOworICBQREJfVWR0VHlwZSBnZXRVZHRLaW5kKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzQ29uc3RydWN0b3IoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNDdXN0b21DYWxsaW5nQ29udmVudGlvbigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0ZhclJldHVybigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzQ29tcGlsZXJHZW5lcmF0ZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0NvbnN0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzRWRpdEFuZENvbnRpbnVlRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzRnVuY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBnZXRBZGRyZXNzVGFrZW4oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBnZXROb1N0YWNrT3JkZXJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNBbGxvY2EoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNBc3NpZ25tZW50T3BlcmF0b3IoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNDVHlwZXMoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNDYXN0T3BlcmF0b3IoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNEZWJ1Z0luZm8oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNFSCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0VIYSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0lubEFzbSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0lubGluZUF0dHJpYnV0ZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0ludGVycnVwdFJldHVybigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0ZyYW1lUG9pbnRlcigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0xvbmdKdW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzTWFuYWdlZENvZGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNOZXN0ZWRUeXBlcygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc05vSW5saW5lQXR0cmlidXRlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzTm9SZXR1cm5BdHRyaWJ1dGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNPcHRpbWl6ZWRDb2RlRGVidWdJbmZvKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzT3ZlcmxvYWRlZE9wZXJhdG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzU0VIKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzU2VjdXJpdHlDaGVja3MoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNTZXRKdW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzU3RyaWN0R1NDaGVjaygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzQWNjZWxlcmF0b3JHcm91cFNoYXJlZExvY2FsKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNBY2NlbGVyYXRvclBvaW50ZXJUYWdMaXZlUmFuZ2UoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0FjY2VsZXJhdG9yU3R1YkZ1bmN0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNBZ2dyZWdhdGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNJbnRyb1ZpcnR1YWxGdW5jdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzQ1ZUQ0lMKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNDb25zdHJ1Y3RvclZpcnR1YWxCYXNlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNDeHhSZXR1cm5VZHQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0RhdGFBbGlnbmVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNITFNMRGF0YSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzSG90cGF0Y2hhYmxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNJbmRpcmVjdFZpcnR1YWxCYXNlQ2xhc3MoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0ludGVyZmFjZVVkdCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzSW50cmluc2ljKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNMVENHKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNMb2NhdGlvbkNvbnRyb2xGbG93RGVwZW5kZW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNNU0lMTmV0bW9kdWxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNNYXRyaXhSb3dNYWpvcigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzTWFuYWdlZENvZGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc01TSUxDb2RlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNNdWx0aXBsZUluaGVyaXRhbmNlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNOYWtlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzTmVzdGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNPcHRpbWl6ZWRBd2F5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNQYWNrZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1BvaW50ZXJCYXNlZE9uU3ltYm9sVmFsdWUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1BvaW50ZXJUb0RhdGFNZW1iZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1BvaW50ZXJUb01lbWJlckZ1bmN0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNQdXJlVmlydHVhbCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUlZhbHVlUmVmZXJlbmNlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNSZWZVZHQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1JlZmVyZW5jZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUmVzdHJpY3RlZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1JldHVyblZhbHVlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTYWZlQnVmZmVycygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2NvcGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZGwoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1NpbmdsZUluaGVyaXRhbmNlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTcGxpdHRlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU3RhdGljKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzUHJpdmF0ZVN5bWJvbHMoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1VuYWxpZ25lZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1VucmVhY2hlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzVmFsdWVVZHQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1ZpcnR1YWwoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1ZpcnR1YWxCYXNlQ2xhc3MoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1ZpcnR1YWxJbmhlcml0YW5jZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzVm9sYXRpbGVUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgd2FzSW5saW5lZCgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRVbnVzZWQoKSBjb25zdCBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICBOYXRpdmVTZXNzaW9uICZTZXNzaW9uOworICBTeW1JbmRleElkIFN5bWJvbElkOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHBkYgorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTkFUSVZFUkFXU1lNQk9MX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlU2Vzc2lvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVTZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhOTRkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlU2Vzc2lvbi5oCkBAIC0wLDAgKzEsMTE0IEBACisvLz09PS0gTmF0aXZlU2Vzc2lvbi5oIC0gTmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIElQREJTZXNzaW9uIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTkFUSVZFU0VTU0lPTl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTkFUSVZFU0VTU0lPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCUmF3U3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJTZXNzaW9uLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9EYmlNb2R1bGVEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVCdWlsdGluU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVSYXdTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1lbW9yeUJ1ZmZlcjsKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgUERCRmlsZTsKKworY2xhc3MgTmF0aXZlU2Vzc2lvbiA6IHB1YmxpYyBJUERCU2Vzc2lvbiB7CitwdWJsaWM6CisgIE5hdGl2ZVNlc3Npb24oc3RkOjp1bmlxdWVfcHRyPFBEQkZpbGU+IFBkYkZpbGUsCisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJ1bXBQdHJBbGxvY2F0b3I+IEFsbG9jYXRvcik7CisgIH5OYXRpdmVTZXNzaW9uKCkgb3ZlcnJpZGU7CisKKyAgc3RhdGljIEVycm9yIGNyZWF0ZUZyb21QZGIoc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gTUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCU2Vzc2lvbj4gJlNlc3Npb24pOworICBzdGF0aWMgRXJyb3IgY3JlYXRlRnJvbUV4ZShTdHJpbmdSZWYgUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJTZXNzaW9uPiAmU2Vzc2lvbik7CisKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbENvbXBpbGFuZD4KKyAgY3JlYXRlQ29tcGlsYW5kU3ltYm9sKERiaU1vZHVsZURlc2NyaXB0b3IgTUkpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2xUeXBlRW51bT4KKyAgY3JlYXRlRW51bVN5bWJvbChjb2Rldmlldzo6VHlwZUluZGV4IEluZGV4KTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICBjcmVhdGVUeXBlRW51bWVyYXRvcihjb2Rldmlldzo6VHlwZUxlYWZLaW5kIEtpbmQpOworCisgIFN5bUluZGV4SWQgZmluZFN5bWJvbEJ5VHlwZUluZGV4KGNvZGV2aWV3OjpUeXBlSW5kZXggVEkpOworCisgIHVpbnQ2NF90IGdldExvYWRBZGRyZXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgc2V0TG9hZEFkZHJlc3ModWludDY0X3QgQWRkcmVzcykgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2xFeGU+IGdldEdsb2JhbFNjb3BlKCkgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2w+IGdldFN5bWJvbEJ5SWQodWludDMyX3QgU3ltYm9sSWQpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgYWRkcmVzc0ZvclZBKHVpbnQ2NF90IFZBLCB1aW50MzJfdCAmU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgYWRkcmVzc0ZvclJWQSh1aW50MzJfdCBSVkEsIHVpbnQzMl90ICZTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbD4KKyAgZmluZFN5bWJvbEJ5QWRkcmVzcyh1aW50NjRfdCBBZGRyZXNzLCBQREJfU3ltVHlwZSBUeXBlKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1MaW5lTnVtYmVycz4KKyAgZmluZExpbmVOdW1iZXJzKGNvbnN0IFBEQlN5bWJvbENvbXBpbGFuZCAmQ29tcGlsYW5kLAorICAgICAgICAgICAgICAgICAgY29uc3QgSVBEQlNvdXJjZUZpbGUgJkZpbGUpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1MaW5lTnVtYmVycz4KKyAgZmluZExpbmVOdW1iZXJzQnlBZGRyZXNzKHVpbnQ2NF90IEFkZHJlc3MsIHVpbnQzMl90IExlbmd0aCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPgorICBmaW5kTGluZU51bWJlcnNCeVJWQSh1aW50MzJfdCBSVkEsIHVpbnQzMl90IExlbmd0aCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPgorICBmaW5kTGluZU51bWJlcnNCeVNlY3RPZmZzZXQodWludDMyX3QgU2VjdGlvbiwgdWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTGVuZ3RoKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1Tb3VyY2VGaWxlcz4KKyAgZmluZFNvdXJjZUZpbGVzKGNvbnN0IFBEQlN5bWJvbENvbXBpbGFuZCAqQ29tcGlsYW5kLCBsbHZtOjpTdHJpbmdSZWYgUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgIFBEQl9OYW1lU2VhcmNoRmxhZ3MgRmxhZ3MpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlNvdXJjZUZpbGU+CisgIGZpbmRPbmVTb3VyY2VGaWxlKGNvbnN0IFBEQlN5bWJvbENvbXBpbGFuZCAqQ29tcGlsYW5kLAorICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncykgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUNoaWxkcmVuPFBEQlN5bWJvbENvbXBpbGFuZD4+CisgIGZpbmRDb21waWxhbmRzRm9yU291cmNlRmlsZShsbHZtOjpTdHJpbmdSZWYgUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEQl9OYW1lU2VhcmNoRmxhZ3MgRmxhZ3MpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sQ29tcGlsYW5kPgorICBmaW5kT25lQ29tcGlsYW5kRm9yU291cmNlRmlsZShsbHZtOjpTdHJpbmdSZWYgUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncykgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVNvdXJjZUZpbGVzPiBnZXRBbGxTb3VyY2VGaWxlcygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1Tb3VyY2VGaWxlcz4gZ2V0U291cmNlRmlsZXNGb3JDb21waWxhbmQoCisgICAgICBjb25zdCBQREJTeW1ib2xDb21waWxhbmQgJkNvbXBpbGFuZCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCU291cmNlRmlsZT4KKyAgZ2V0U291cmNlRmlsZUJ5SWQodWludDMyX3QgRmlsZUlkKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1EYXRhU3RyZWFtcz4gZ2V0RGVidWdTdHJlYW1zKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtVGFibGVzPiBnZXRFbnVtVGFibGVzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtSW5qZWN0ZWRTb3VyY2VzPiBnZXRJbmplY3RlZFNvdXJjZXMoKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TZWN0aW9uQ29udHJpYnM+IGdldFNlY3Rpb25Db250cmlicygpIGNvbnN0IG92ZXJyaWRlOworCisgIFBEQkZpbGUgJmdldFBEQkZpbGUoKSB7IHJldHVybiAqUGRiOyB9CisgIGNvbnN0IFBEQkZpbGUgJmdldFBEQkZpbGUoKSBjb25zdCB7IHJldHVybiAqUGRiOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxQREJGaWxlPiBQZGI7CisgIHN0ZDo6dW5pcXVlX3B0cjxCdW1wUHRyQWxsb2NhdG9yPiBBbGxvY2F0b3I7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxOYXRpdmVSYXdTeW1ib2w+PiBTeW1ib2xDYWNoZTsKKyAgRGVuc2VNYXA8Y29kZXZpZXc6OlR5cGVJbmRleCwgU3ltSW5kZXhJZD4gVHlwZUluZGV4VG9TeW1ib2xJZDsKK307Cit9IC8vIG5hbWVzcGFjZSBwZGIKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1BEQkZpbGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUERCRmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMzlhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1BEQkZpbGUuaApAQCAtMCwwICsxLDE0NCBAQAorLy89PT0tIFBEQkZpbGUuaCAtIExvdyBsZXZlbCBpbnRlcmZhY2UgdG8gYSBQREIgZmlsZSAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQkZJTEVfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQkZJTEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9NU0YvSU1TRkZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9NU0YvTVNGQ29tbW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCaW5hcnlTdHJlYW07CisKK25hbWVzcGFjZSBtc2YgeworY2xhc3MgTWFwcGVkQmxvY2tTdHJlYW07Cit9CisKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgRGJpU3RyZWFtOworY2xhc3MgR2xvYmFsc1N0cmVhbTsKK2NsYXNzIEluZm9TdHJlYW07CitjbGFzcyBQREJTdHJpbmdUYWJsZTsKK2NsYXNzIFBEQkZpbGVCdWlsZGVyOworY2xhc3MgUHVibGljc1N0cmVhbTsKK2NsYXNzIFN5bWJvbFN0cmVhbTsKK2NsYXNzIFRwaVN0cmVhbTsKKworY2xhc3MgUERCRmlsZSA6IHB1YmxpYyBtc2Y6OklNU0ZGaWxlIHsKKyAgZnJpZW5kIFBEQkZpbGVCdWlsZGVyOworCitwdWJsaWM6CisgIFBEQkZpbGUoU3RyaW5nUmVmIFBhdGgsIHN0ZDo6dW5pcXVlX3B0cjxCaW5hcnlTdHJlYW0+IFBkYkZpbGVCdWZmZXIsCisgICAgICAgICAgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yKTsKKyAgflBEQkZpbGUoKSBvdmVycmlkZTsKKworICBTdHJpbmdSZWYgZ2V0RmlsZURpcmVjdG9yeSgpIGNvbnN0OworICBTdHJpbmdSZWYgZ2V0RmlsZVBhdGgoKSBjb25zdDsKKworICB1aW50MzJfdCBnZXRGcmVlQmxvY2tNYXBCbG9jaygpIGNvbnN0OworICB1aW50MzJfdCBnZXRVbmtub3duMSgpIGNvbnN0OworCisgIHVpbnQzMl90IGdldEJsb2NrU2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRCbG9ja0NvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldE51bURpcmVjdG9yeUJ5dGVzKCkgY29uc3Q7CisgIHVpbnQzMl90IGdldEJsb2NrTWFwSW5kZXgoKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0TnVtRGlyZWN0b3J5QmxvY2tzKCkgY29uc3Q7CisgIHVpbnQ2NF90IGdldEJsb2NrTWFwT2Zmc2V0KCkgY29uc3Q7CisKKyAgdWludDMyX3QgZ2V0TnVtU3RyZWFtcygpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRNYXhTdHJlYW1TaXplKCkgY29uc3Q7CisgIHVpbnQzMl90IGdldFN0cmVhbUJ5dGVTaXplKHVpbnQzMl90IFN0cmVhbUluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgQXJyYXlSZWY8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+CisgIGdldFN0cmVhbUJsb2NrTGlzdCh1aW50MzJfdCBTdHJlYW1JbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEZpbGVTaXplKCkgY29uc3Q7CisKKyAgRXhwZWN0ZWQ8QXJyYXlSZWY8dWludDhfdD4+IGdldEJsb2NrRGF0YSh1aW50MzJfdCBCbG9ja0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE51bUJ5dGVzKSBjb25zdCBvdmVycmlkZTsKKyAgRXJyb3Igc2V0QmxvY2tEYXRhKHVpbnQzMl90IEJsb2NrSW5kZXgsIHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+IERhdGEpIGNvbnN0IG92ZXJyaWRlOworCisgIEFycmF5UmVmPHN1cHBvcnQ6OnVsaXR0bGUzMl90PiBnZXRTdHJlYW1TaXplcygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29udGFpbmVyTGF5b3V0LlN0cmVhbVNpemVzOworICB9CisgIEFycmF5UmVmPEFycmF5UmVmPHN1cHBvcnQ6OnVsaXR0bGUzMl90Pj4gZ2V0U3RyZWFtTWFwKCkgY29uc3QgeworICAgIHJldHVybiBDb250YWluZXJMYXlvdXQuU3RyZWFtTWFwOworICB9CisKKyAgY29uc3QgbXNmOjpNU0ZMYXlvdXQgJmdldE1zZkxheW91dCgpIGNvbnN0IHsgcmV0dXJuIENvbnRhaW5lckxheW91dDsgfQorICBCaW5hcnlTdHJlYW1SZWYgZ2V0TXNmQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gKkJ1ZmZlcjsgfQorCisgIEFycmF5UmVmPHN1cHBvcnQ6OnVsaXR0bGUzMl90PiBnZXREaXJlY3RvcnlCbG9ja0FycmF5KCkgY29uc3Q7CisKKyAgc3RkOjp1bmlxdWVfcHRyPG1zZjo6TWFwcGVkQmxvY2tTdHJlYW0+IGNyZWF0ZUluZGV4ZWRTdHJlYW0odWludDE2X3QgU04pOworCisgIG1zZjo6TVNGU3RyZWFtTGF5b3V0IGdldFN0cmVhbUxheW91dCh1aW50MzJfdCBTdHJlYW1JZHgpIGNvbnN0OworICBtc2Y6Ok1TRlN0cmVhbUxheW91dCBnZXRGcG1TdHJlYW1MYXlvdXQoKSBjb25zdDsKKworICBFcnJvciBwYXJzZUZpbGVIZWFkZXJzKCk7CisgIEVycm9yIHBhcnNlU3RyZWFtRGF0YSgpOworCisgIEV4cGVjdGVkPEluZm9TdHJlYW0gJj4gZ2V0UERCSW5mb1N0cmVhbSgpOworICBFeHBlY3RlZDxEYmlTdHJlYW0gJj4gZ2V0UERCRGJpU3RyZWFtKCk7CisgIEV4cGVjdGVkPEdsb2JhbHNTdHJlYW0gJj4gZ2V0UERCR2xvYmFsc1N0cmVhbSgpOworICBFeHBlY3RlZDxUcGlTdHJlYW0gJj4gZ2V0UERCVHBpU3RyZWFtKCk7CisgIEV4cGVjdGVkPFRwaVN0cmVhbSAmPiBnZXRQREJJcGlTdHJlYW0oKTsKKyAgRXhwZWN0ZWQ8UHVibGljc1N0cmVhbSAmPiBnZXRQREJQdWJsaWNzU3RyZWFtKCk7CisgIEV4cGVjdGVkPFN5bWJvbFN0cmVhbSAmPiBnZXRQREJTeW1ib2xTdHJlYW0oKTsKKyAgRXhwZWN0ZWQ8UERCU3RyaW5nVGFibGUgJj4gZ2V0U3RyaW5nVGFibGUoKTsKKworICBCdW1wUHRyQWxsb2NhdG9yICZnZXRBbGxvY2F0b3IoKSB7IHJldHVybiBBbGxvY2F0b3I7IH0KKworICBib29sIGhhc1BEQkRiaVN0cmVhbSgpIGNvbnN0OworICBib29sIGhhc1BEQkdsb2JhbHNTdHJlYW0oKTsKKyAgYm9vbCBoYXNQREJJbmZvU3RyZWFtKCkgY29uc3Q7CisgIGJvb2wgaGFzUERCSXBpU3RyZWFtKCkgY29uc3Q7CisgIGJvb2wgaGFzUERCUHVibGljc1N0cmVhbSgpOworICBib29sIGhhc1BEQlN5bWJvbFN0cmVhbSgpOworICBib29sIGhhc1BEQlRwaVN0cmVhbSgpIGNvbnN0OworICBib29sIGhhc1BEQlN0cmluZ1RhYmxlKCk7CisKKyAgdWludDMyX3QgZ2V0UG9pbnRlclNpemUoKTsKKworcHJpdmF0ZToKKyAgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPG1zZjo6TWFwcGVkQmxvY2tTdHJlYW0+PgorICBzYWZlbHlDcmVhdGVJbmRleGVkU3RyZWFtKGNvbnN0IG1zZjo6TVNGTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5U3RyZWFtUmVmIE1zZkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU3RyZWFtSW5kZXgpIGNvbnN0OworCisgIHN0ZDo6c3RyaW5nIEZpbGVQYXRoOworICBCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3I7CisKKyAgc3RkOjp1bmlxdWVfcHRyPEJpbmFyeVN0cmVhbT4gQnVmZmVyOworCisgIG1zZjo6TVNGTGF5b3V0IENvbnRhaW5lckxheW91dDsKKworICBzdGQ6OnVuaXF1ZV9wdHI8R2xvYmFsc1N0cmVhbT4gR2xvYmFsczsKKyAgc3RkOjp1bmlxdWVfcHRyPEluZm9TdHJlYW0+IEluZm87CisgIHN0ZDo6dW5pcXVlX3B0cjxEYmlTdHJlYW0+IERiaTsKKyAgc3RkOjp1bmlxdWVfcHRyPFRwaVN0cmVhbT4gVHBpOworICBzdGQ6OnVuaXF1ZV9wdHI8VHBpU3RyZWFtPiBJcGk7CisgIHN0ZDo6dW5pcXVlX3B0cjxQdWJsaWNzU3RyZWFtPiBQdWJsaWNzOworICBzdGQ6OnVuaXF1ZV9wdHI8U3ltYm9sU3RyZWFtPiBTeW1ib2xzOworICBzdGQ6OnVuaXF1ZV9wdHI8bXNmOjpNYXBwZWRCbG9ja1N0cmVhbT4gRGlyZWN0b3J5U3RyZWFtOworICBzdGQ6OnVuaXF1ZV9wdHI8bXNmOjpNYXBwZWRCbG9ja1N0cmVhbT4gU3RyaW5nVGFibGVTdHJlYW07CisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTdHJpbmdUYWJsZT4gU3RyaW5nczsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9QREJGaWxlQnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9QREJGaWxlQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZGRhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1BEQkZpbGVCdWlsZGVyLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8vPT09LSBQREJGaWxlQnVpbGRlci5oIC0gUERCIEZpbGUgQ3JlYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1JBV19QREJGSUxFQlVJTERFUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCRklMRUJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmFtZWRTdHJlYW1NYXAuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1BEQkZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1BEQlN0cmluZ1RhYmxlQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUmF3Q29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG1zZiB7CitjbGFzcyBNU0ZCdWlsZGVyOworfQorbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBEYmlTdHJlYW1CdWlsZGVyOworY2xhc3MgSW5mb1N0cmVhbUJ1aWxkZXI7CitjbGFzcyBHU0lTdHJlYW1CdWlsZGVyOworY2xhc3MgVHBpU3RyZWFtQnVpbGRlcjsKKworY2xhc3MgUERCRmlsZUJ1aWxkZXIgeworcHVibGljOgorICBleHBsaWNpdCBQREJGaWxlQnVpbGRlcihCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IpOworICB+UERCRmlsZUJ1aWxkZXIoKTsKKyAgUERCRmlsZUJ1aWxkZXIoY29uc3QgUERCRmlsZUJ1aWxkZXIgJikgPSBkZWxldGU7CisgIFBEQkZpbGVCdWlsZGVyICZvcGVyYXRvcj0oY29uc3QgUERCRmlsZUJ1aWxkZXIgJikgPSBkZWxldGU7CisKKyAgRXJyb3IgaW5pdGlhbGl6ZSh1aW50MzJfdCBCbG9ja1NpemUpOworCisgIG1zZjo6TVNGQnVpbGRlciAmZ2V0TXNmQnVpbGRlcigpOworICBJbmZvU3RyZWFtQnVpbGRlciAmZ2V0SW5mb0J1aWxkZXIoKTsKKyAgRGJpU3RyZWFtQnVpbGRlciAmZ2V0RGJpQnVpbGRlcigpOworICBUcGlTdHJlYW1CdWlsZGVyICZnZXRUcGlCdWlsZGVyKCk7CisgIFRwaVN0cmVhbUJ1aWxkZXIgJmdldElwaUJ1aWxkZXIoKTsKKyAgUERCU3RyaW5nVGFibGVCdWlsZGVyICZnZXRTdHJpbmdUYWJsZUJ1aWxkZXIoKTsKKyAgR1NJU3RyZWFtQnVpbGRlciAmZ2V0R3NpQnVpbGRlcigpOworCisgIEVycm9yIGNvbW1pdChTdHJpbmdSZWYgRmlsZW5hbWUpOworCisgIEV4cGVjdGVkPHVpbnQzMl90PiBnZXROYW1lZFN0cmVhbUluZGV4KFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKyAgRXJyb3IgYWRkTmFtZWRTdHJlYW0oU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBEYXRhKTsKKyAgdm9pZCBhZGRJbmplY3RlZFNvdXJjZShTdHJpbmdSZWYgTmFtZSwgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gQnVmZmVyKTsKKworcHJpdmF0ZToKKyAgc3RydWN0IEluamVjdGVkU291cmNlRGVzY3JpcHRvciB7CisgICAgLy8gVGhlIGZ1bGwgbmFtZSBvZiB0aGUgc3RyZWFtIHRoYXQgY29udGFpbnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgaW5qZWN0ZWQKKyAgICAvLyBzb3VyY2UuICBUaGlzIGlzIGJ1aWx0IGFzIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgbGl0ZXJhbCAiL3NyYy9maWxlcyIKKyAgICAvLyBwbHVzIHRoZSAidm5hbWUiLgorICAgIHN0ZDo6c3RyaW5nIFN0cmVhbU5hbWU7CisKKyAgICAvLyBUaGUgZXhhY3QgbmFtZSBvZiB0aGUgZmlsZSBuYW1lIGFzIHNwZWNpZmllZCBieSB0aGUgdXNlci4KKyAgICB1aW50MzJfdCBOYW1lSW5kZXg7CisKKyAgICAvLyBUaGUgc3RyaW5nIHRhYmxlIGluZGV4IG9mIHRoZSAidm5hbWUiIG9mIHRoZSBmaWxlLiAgQXMgZmFyIGFzIHdlCisgICAgLy8gdW5kZXJzdGFuZCwgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZSwgZXhjZXB0IGl0IGlzIGxvd2VyY2FzZWQgYW5kCisgICAgLy8gZm9yd2FyZCBzbGFzaGVzIGFyZSBjb252ZXJ0ZWQgdG8gYmFja3NsYXNoZXMuCisgICAgdWludDMyX3QgVk5hbWVJbmRleDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBDb250ZW50OworICB9OworCisgIEV4cGVjdGVkPG1zZjo6TVNGTGF5b3V0PiBmaW5hbGl6ZU1zZkxheW91dCgpOworICBFeHBlY3RlZDx1aW50MzJfdD4gYWxsb2NhdGVOYW1lZFN0cmVhbShTdHJpbmdSZWYgTmFtZSwgdWludDMyX3QgU2l6ZSk7CisKKyAgdm9pZCBjb21taXRGcG0oV3JpdGFibGVCaW5hcnlTdHJlYW0gJk1zZkJ1ZmZlciwgY29uc3QgbXNmOjpNU0ZMYXlvdXQgJkxheW91dCk7CisgIHZvaWQgY29tbWl0SW5qZWN0ZWRTb3VyY2VzKFdyaXRhYmxlQmluYXJ5U3RyZWFtICZNc2ZCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1zZjo6TVNGTGF5b3V0ICZMYXlvdXQpOworICB2b2lkIGNvbW1pdFNyY0hlYWRlckJsb2NrKFdyaXRhYmxlQmluYXJ5U3RyZWFtICZNc2ZCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbXNmOjpNU0ZMYXlvdXQgJkxheW91dCk7CisKKyAgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yOworCisgIHN0ZDo6dW5pcXVlX3B0cjxtc2Y6Ok1TRkJ1aWxkZXI+IE1zZjsKKyAgc3RkOjp1bmlxdWVfcHRyPEluZm9TdHJlYW1CdWlsZGVyPiBJbmZvOworICBzdGQ6OnVuaXF1ZV9wdHI8RGJpU3RyZWFtQnVpbGRlcj4gRGJpOworICBzdGQ6OnVuaXF1ZV9wdHI8R1NJU3RyZWFtQnVpbGRlcj4gR3NpOworICBzdGQ6OnVuaXF1ZV9wdHI8VHBpU3RyZWFtQnVpbGRlcj4gVHBpOworICBzdGQ6OnVuaXF1ZV9wdHI8VHBpU3RyZWFtQnVpbGRlcj4gSXBpOworCisgIFBEQlN0cmluZ1RhYmxlQnVpbGRlciBTdHJpbmdzOworICBTdHJpbmdUYWJsZUhhc2hUcmFpdHMgSW5qZWN0ZWRTb3VyY2VIYXNoVHJhaXRzOworICBIYXNoVGFibGU8U3JjSGVhZGVyQmxvY2tFbnRyeSwgU3RyaW5nVGFibGVIYXNoVHJhaXRzPiBJbmplY3RlZFNvdXJjZVRhYmxlOworCisgIFNtYWxsVmVjdG9yPEluamVjdGVkU291cmNlRGVzY3JpcHRvciwgMj4gSW5qZWN0ZWRTb3VyY2VzOworCisgIE5hbWVkU3RyZWFtTWFwIE5hbWVkU3RyZWFtczsKKyAgRGVuc2VNYXA8dWludDMyX3QsIHN0ZDo6c3RyaW5nPiBOYW1lZFN0cmVhbURhdGE7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUERCU3RyaW5nVGFibGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUERCU3RyaW5nVGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTE2N2M5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9QREJTdHJpbmdUYWJsZS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8vPT09LSBQREJTdHJpbmdUYWJsZS5oIC0gUERCIFN0cmluZyBUYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKy0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1JBV19QREJTVFJJTkdUQUJMRV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCU1RSSU5HVEFCTEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1BcnJheS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEJpbmFyeVN0cmVhbVJlYWRlcjsKKworbmFtZXNwYWNlIG1zZiB7CitjbGFzcyBNYXBwZWRCbG9ja1N0cmVhbTsKK30KKworbmFtZXNwYWNlIHBkYiB7CisKK3N0cnVjdCBQREJTdHJpbmdUYWJsZUhlYWRlcjsKKworY2xhc3MgUERCU3RyaW5nVGFibGUgeworcHVibGljOgorICBFcnJvciByZWxvYWQoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIpOworCisgIHVpbnQzMl90IGdldEJ5dGVTaXplKCkgY29uc3Q7CisgIHVpbnQzMl90IGdldE5hbWVDb3VudCgpIGNvbnN0OworICB1aW50MzJfdCBnZXRIYXNoVmVyc2lvbigpIGNvbnN0OworICB1aW50MzJfdCBnZXRTaWduYXR1cmUoKSBjb25zdDsKKworICBFeHBlY3RlZDxTdHJpbmdSZWY+IGdldFN0cmluZ0ZvcklEKHVpbnQzMl90IElEKSBjb25zdDsKKyAgRXhwZWN0ZWQ8dWludDMyX3Q+IGdldElERm9yU3RyaW5nKFN0cmluZ1JlZiBTdHIpIGNvbnN0OworCisgIEZpeGVkU3RyZWFtQXJyYXk8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+IG5hbWVfaWRzKCkgY29uc3Q7CisKKyAgY29uc3QgY29kZXZpZXc6OkRlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uUmVmICZnZXRTdHJpbmdUYWJsZSgpIGNvbnN0OworCitwcml2YXRlOgorICBFcnJvciByZWFkSGVhZGVyKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyKTsKKyAgRXJyb3IgcmVhZFN0cmluZ3MoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIpOworICBFcnJvciByZWFkSGFzaFRhYmxlKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyKTsKKyAgRXJyb3IgcmVhZEVwaWxvZ3VlKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyKTsKKworICBjb25zdCBQREJTdHJpbmdUYWJsZUhlYWRlciAqSGVhZGVyID0gbnVsbHB0cjsKKyAgY29kZXZpZXc6OkRlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uUmVmIFN0cmluZ3M7CisgIEZpeGVkU3RyZWFtQXJyYXk8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+IElEczsKKyAgdWludDMyX3QgTmFtZUNvdW50ID0gMDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBwZGIKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1NUUklOR1RBQkxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUERCU3RyaW5nVGFibGVCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1BEQlN0cmluZ1RhYmxlQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmODFjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1BEQlN0cmluZ1RhYmxlQnVpbGRlci5oCkBAIC0wLDAgKzEsNzIgQEAKKy8vPT09LSBQREJTdHJpbmdUYWJsZUJ1aWxkZXIuaCAtIFBEQiBTdHJpbmcgVGFibGUgQnVpbGRlciAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNyZWF0ZXMgdGhlICIvbmFtZXMiIHN0cmVhbS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCU1RSSU5HVEFCTEVCVUlMREVSX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1JBV19QREJTVFJJTkdUQUJMRUJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQmluYXJ5U3RyZWFtV3JpdGVyOworY2xhc3MgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWY7CisKK25hbWVzcGFjZSBtc2Ygeworc3RydWN0IE1TRkxheW91dDsKK30KKworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQkZpbGVCdWlsZGVyOworY2xhc3MgUERCU3RyaW5nVGFibGVCdWlsZGVyOworCitzdHJ1Y3QgU3RyaW5nVGFibGVIYXNoVHJhaXRzIHsKKyAgUERCU3RyaW5nVGFibGVCdWlsZGVyICpUYWJsZTsKKworICBleHBsaWNpdCBTdHJpbmdUYWJsZUhhc2hUcmFpdHMoUERCU3RyaW5nVGFibGVCdWlsZGVyICZUYWJsZSk7CisgIHVpbnQzMl90IGhhc2hMb29rdXBLZXkoU3RyaW5nUmVmIFMpIGNvbnN0OworICBTdHJpbmdSZWYgc3RvcmFnZUtleVRvTG9va3VwS2V5KHVpbnQzMl90IE9mZnNldCkgY29uc3Q7CisgIHVpbnQzMl90IGxvb2t1cEtleVRvU3RvcmFnZUtleShTdHJpbmdSZWYgUyk7Cit9OworCitjbGFzcyBQREJTdHJpbmdUYWJsZUJ1aWxkZXIgeworcHVibGljOgorICAvLyBJZiBzdHJpbmcgUyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgc3RyaW5nIHRhYmxlLCBpbnNlcnQgaXQuCisgIC8vIFJldHVybnMgdGhlIElEIGZvciBTLgorICB1aW50MzJfdCBpbnNlcnQoU3RyaW5nUmVmIFMpOworCisgIHVpbnQzMl90IGdldElkRm9yU3RyaW5nKFN0cmluZ1JlZiBTKSBjb25zdDsKKyAgU3RyaW5nUmVmIGdldFN0cmluZ0ZvcklkKHVpbnQzMl90IElkKSBjb25zdDsKKworICB1aW50MzJfdCBjYWxjdWxhdGVTZXJpYWxpemVkU2l6ZSgpIGNvbnN0OworICBFcnJvciBjb21taXQoQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIpIGNvbnN0OworCisgIHZvaWQgc2V0U3RyaW5ncyhjb25zdCBjb2Rldmlldzo6RGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb24gJlN0cmluZ3MpOworCitwcml2YXRlOgorICB1aW50MzJfdCBjYWxjdWxhdGVIYXNoVGFibGVTaXplKCkgY29uc3Q7CisgIEVycm9yIHdyaXRlSGVhZGVyKEJpbmFyeVN0cmVhbVdyaXRlciAmV3JpdGVyKSBjb25zdDsKKyAgRXJyb3Igd3JpdGVTdHJpbmdzKEJpbmFyeVN0cmVhbVdyaXRlciAmV3JpdGVyKSBjb25zdDsKKyAgRXJyb3Igd3JpdGVIYXNoVGFibGUoQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIpIGNvbnN0OworICBFcnJvciB3cml0ZUVwaWxvZ3VlKEJpbmFyeVN0cmVhbVdyaXRlciAmV3JpdGVyKSBjb25zdDsKKworICBjb2Rldmlldzo6RGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb24gU3RyaW5nczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBwZGIKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQlNUUklOR1RBQkxFQlVJTERFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1B1YmxpY3NTdHJlYW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUHVibGljc1N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMDIyMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1B1YmxpY3NTdHJlYW0uaApAQCAtMCwwICsxLDYwIEBACisvLz09PS0gUHVibGljc1N0cmVhbS5oIC0gUERCIFB1YmxpYyBTeW1ib2wgU3RyZWFtIC0tLS0tLS0tIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUFVCTElDU1NUUkVBTV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUFVCTElDU1NUUkVBTV9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9NU0YvTWFwcGVkQmxvY2tTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0dsb2JhbHNTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUmF3VHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvUERCVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtQXJyYXkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBEYmlTdHJlYW07CitzdHJ1Y3QgR1NJSGFzaEhlYWRlcjsKK2NsYXNzIFBEQkZpbGU7CisKK2NsYXNzIFB1YmxpY3NTdHJlYW0geworcHVibGljOgorICBQdWJsaWNzU3RyZWFtKHN0ZDo6dW5pcXVlX3B0cjxtc2Y6Ok1hcHBlZEJsb2NrU3RyZWFtPiBTdHJlYW0pOworICB+UHVibGljc1N0cmVhbSgpOworICBFcnJvciByZWxvYWQoKTsKKworICB1aW50MzJfdCBnZXRTeW1IYXNoKCkgY29uc3Q7CisgIHVpbnQxNl90IGdldFRodW5rVGFibGVTZWN0aW9uKCkgY29uc3Q7CisgIHVpbnQzMl90IGdldFRodW5rVGFibGVPZmZzZXQoKSBjb25zdDsKKyAgY29uc3QgR1NJSGFzaFRhYmxlICZnZXRQdWJsaWNzVGFibGUoKSBjb25zdCB7IHJldHVybiBQdWJsaWNzVGFibGU7IH0KKyAgRml4ZWRTdHJlYW1BcnJheTxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4gZ2V0QWRkcmVzc01hcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQWRkcmVzc01hcDsKKyAgfQorICBGaXhlZFN0cmVhbUFycmF5PHN1cHBvcnQ6OnVsaXR0bGUzMl90PiBnZXRUaHVua01hcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVGh1bmtNYXA7CisgIH0KKyAgRml4ZWRTdHJlYW1BcnJheTxTZWN0aW9uT2Zmc2V0PiBnZXRTZWN0aW9uT2Zmc2V0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gU2VjdGlvbk9mZnNldHM7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPG1zZjo6TWFwcGVkQmxvY2tTdHJlYW0+IFN0cmVhbTsKKyAgR1NJSGFzaFRhYmxlIFB1YmxpY3NUYWJsZTsKKyAgRml4ZWRTdHJlYW1BcnJheTxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4gQWRkcmVzc01hcDsKKyAgRml4ZWRTdHJlYW1BcnJheTxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4gVGh1bmtNYXA7CisgIEZpeGVkU3RyZWFtQXJyYXk8U2VjdGlvbk9mZnNldD4gU2VjdGlvbk9mZnNldHM7CisKKyAgY29uc3QgUHVibGljc1N0cmVhbUhlYWRlciAqSGVhZGVyOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd0NvbnN0YW50cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdDb25zdGFudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmJkMzMxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdDb25zdGFudHMuaApAQCAtMCwwICsxLDExOSBAQAorLy89PT0tIFJhd0NvbnN0YW50cy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQlJBV0NPTlNUQU5UU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCUkFXQ09OU1RBTlRTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0JpdG1hc2tFbnVtLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKKworY29uc3QgdWludDE2X3Qga0ludmFsaWRTdHJlYW1JbmRleCA9IDB4RkZGRjsKKworZW51bSBQZGJSYXdfSW1wbFZlciA6IHVpbnQzMl90IHsKKyAgUGRiSW1wbFZDMiA9IDE5OTQxNjEwLAorICBQZGJJbXBsVkM0ID0gMTk5NTA2MjMsCisgIFBkYkltcGxWQzQxID0gMTk5NTA4MTQsCisgIFBkYkltcGxWQzUwID0gMTk5NjAzMDcsCisgIFBkYkltcGxWQzk4ID0gMTk5NzA2MDQsCisgIFBkYkltcGxWQzcwRGVwID0gMTk5OTA2MDQsIC8vIGRlcHJlY2F0ZWQKKyAgUGRiSW1wbFZDNzAgPSAyMDAwMDQwNCwKKyAgUGRiSW1wbFZDODAgPSAyMDAzMDkwMSwKKyAgUGRiSW1wbFZDMTEwID0gMjAwOTEyMDEsCisgIFBkYkltcGxWQzE0MCA9IDIwMTQwNTA4LAorfTsKKworZW51bSBjbGFzcyBQZGJSYXdfU3JjSGVhZGVyQmxvY2tWZXIgOiB1aW50MzJfdCB7IFNyY1Zlck9uZSA9IDE5OTgwODI3IH07CisKK2VudW0gY2xhc3MgUGRiUmF3X0ZlYXR1cmVTaWcgOiB1aW50MzJfdCB7CisgIFZDMTEwID0gUGRiSW1wbFZDMTEwLAorICBWQzE0MCA9IFBkYkltcGxWQzE0MCwKKyAgTm9UeXBlTWVyZ2UgPSAweDRENTQ0RjRFLAorICBNaW5pbWFsRGVidWdJbmZvID0gMHg0OTRFNDk0RCwKK307CisKK2VudW0gUGRiUmF3X0ZlYXR1cmVzIDogdWludDMyX3QgeworICBQZGJGZWF0dXJlTm9uZSA9IDB4MCwKKyAgUGRiRmVhdHVyZUNvbnRhaW5zSWRTdHJlYW0gPSAweDEsCisgIFBkYkZlYXR1cmVNaW5pbWFsRGVidWdJbmZvID0gMHgyLAorICBQZGJGZWF0dXJlTm9UeXBlTWVyZ2luZyA9IDB4NCwKKyAgTExWTV9NQVJLX0FTX0JJVE1BU0tfRU5VTSgvKiBMYXJnZXN0VmFsdWUgPSAqLyBQZGJGZWF0dXJlTm9UeXBlTWVyZ2luZykKK307CisKK2VudW0gUGRiUmF3X0RiaVZlciA6IHVpbnQzMl90IHsKKyAgUGRiRGJpVkM0MSA9IDkzMDgwMywKKyAgUGRiRGJpVjUwID0gMTk5NjAzMDcsCisgIFBkYkRiaVY2MCA9IDE5OTcwNjA2LAorICBQZGJEYmlWNzAgPSAxOTk5MDkwMywKKyAgUGRiRGJpVjExMCA9IDIwMDkxMjAxCit9OworCitlbnVtIFBkYlJhd19UcGlWZXIgOiB1aW50MzJfdCB7CisgIFBkYlRwaVY0MCA9IDE5OTUwNDEwLAorICBQZGJUcGlWNDEgPSAxOTk1MTEyMiwKKyAgUGRiVHBpVjUwID0gMTk5NjEwMzEsCisgIFBkYlRwaVY3MCA9IDE5OTkwOTAzLAorICBQZGJUcGlWODAgPSAyMDA0MDIwMywKK307CisKK2VudW0gUGRiUmF3X0RiaVNlY0NvbnRyaWJWZXIgOiB1aW50MzJfdCB7CisgIERiaVNlY0NvbnRyaWJWZXI2MCA9IDB4ZWZmZTAwMDAgKyAxOTk3MDYwNSwKKyAgRGJpU2VjQ29udHJpYlYyID0gMHhlZmZlMDAwMCArIDIwMTQwNTE2Cit9OworCitlbnVtIFNwZWNpYWxTdHJlYW0gOiB1aW50MzJfdCB7CisgIC8vIFN0cmVhbSAwIGNvbnRhaW5zIHRoZSBjb3B5IG9mIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIE1TRiBkaXJlY3RvcnkuCisgIC8vIFdlIGFyZSBub3QgY3VycmVudGx5IHVzaW5nIGl0LCBidXQgdGVjaG5pY2FsbHkgaWYgd2UgZmluZCB0aGUgbWFpbgorICAvLyBNU0YgaXMgY29ycnVwdGVkLCB3ZSBjb3VsZCBmYWxsYmFjayB0byBpdC4KKyAgT2xkTVNGRGlyZWN0b3J5ID0gMCwKKworICBTdHJlYW1QREIgPSAxLAorICBTdHJlYW1UUEkgPSAyLAorICBTdHJlYW1EQkkgPSAzLAorICBTdHJlYW1JUEkgPSA0LAorCisgIGtTcGVjaWFsU3RyZWFtQ291bnQKK307CisKK2VudW0gY2xhc3MgRGJnSGVhZGVyVHlwZSA6IHVpbnQxNl90IHsKKyAgRlBPLAorICBFeGNlcHRpb24sCisgIEZpeHVwLAorICBPbWFwVG9TcmMsCisgIE9tYXBGcm9tU3JjLAorICBTZWN0aW9uSGRyLAorICBUb2tlblJpZE1hcCwKKyAgWGRhdGEsCisgIFBkYXRhLAorICBOZXdGUE8sCisgIFNlY3Rpb25IZHJPcmlnLAorICBNYXgKK307CisKK2VudW0gY2xhc3MgT01GU2VnRGVzY0ZsYWdzIDogdWludDE2X3QgeworICBOb25lID0gMCwKKyAgUmVhZCA9IDEgPDwgMCwgICAgICAgICAgICAgIC8vIFNlZ21lbnQgaXMgcmVhZGFibGUuCisgIFdyaXRlID0gMSA8PCAxLCAgICAgICAgICAgICAvLyBTZWdtZW50IGlzIHdyaXRhYmxlLgorICBFeGVjdXRlID0gMSA8PCAyLCAgICAgICAgICAgLy8gU2VnbWVudCBpcyBleGVjdXRhYmxlLgorICBBZGRyZXNzSXMzMkJpdCA9IDEgPDwgMywgICAgLy8gRGVzY3JpcHRvciBkZXNjcmliZXMgYSAzMi1iaXQgbGluZWFyIGFkZHJlc3MuCisgIElzU2VsZWN0b3IgPSAxIDw8IDgsICAgICAgICAvLyBGcmFtZSByZXByZXNlbnRzIGEgc2VsZWN0b3IuCisgIElzQWJzb2x1dGVBZGRyZXNzID0gMSA8PCA5LCAvLyBGcmFtZSByZXByZXNlbnRzIGFuIGFic29sdXRlIGFkZHJlc3MuCisgIElzR3JvdXAgPSAxIDw8IDEwLCAgICAgICAgICAvLyBJZiBzZXQsIGRlc2NyaXB0b3IgcmVwcmVzZW50cyBhIGdyb3VwLgorICBMTFZNX01BUktfQVNfQklUTUFTS19FTlVNKC8qIExhcmdlc3RWYWx1ZSA9ICovIElzR3JvdXApCit9OworCitMTFZNX0VOQUJMRV9CSVRNQVNLX0VOVU1TX0lOX05BTUVTUEFDRSgpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgcGRiCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1JBV19QREJSQVdDT05TVEFOVFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdFcnJvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MjRhNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd0Vycm9yLmgKQEAgLTAsMCArMSw1MyBAQAorLy89PT0tIFJhd0Vycm9yLmggLSBFcnJvciBleHRlbnNpb25zIGZvciByYXcgUERCIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1JBV0VSUk9SX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1JBV19SQVdFUlJPUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CitlbnVtIGNsYXNzIHJhd19lcnJvcl9jb2RlIHsKKyAgdW5zcGVjaWZpZWQgPSAxLAorICBmZWF0dXJlX3Vuc3VwcG9ydGVkLAorICBpbnZhbGlkX2Zvcm1hdCwKKyAgY29ycnVwdF9maWxlLAorICBpbnN1ZmZpY2llbnRfYnVmZmVyLAorICBub19zdHJlYW0sCisgIGluZGV4X291dF9vZl9ib3VuZHMsCisgIGludmFsaWRfYmxvY2tfYWRkcmVzcywKKyAgZHVwbGljYXRlX2VudHJ5LAorICBub19lbnRyeSwKKyAgbm90X3dyaXRhYmxlLAorICBzdHJlYW1fdG9vX2xvbmcsCisgIGludmFsaWRfdHBpX2hhc2gsCit9OworCisvLy8gQmFzZSBjbGFzcyBmb3IgZXJyb3JzIG9yaWdpbmF0aW5nIHdoZW4gcGFyc2luZyByYXcgUERCIGZpbGVzCitjbGFzcyBSYXdFcnJvciA6IHB1YmxpYyBFcnJvckluZm88UmF3RXJyb3I+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIFJhd0Vycm9yKHJhd19lcnJvcl9jb2RlIEMpOworICBSYXdFcnJvcihjb25zdCBzdGQ6OnN0cmluZyAmQ29udGV4dCk7CisgIFJhd0Vycm9yKHJhd19lcnJvcl9jb2RlIEMsIGNvbnN0IHN0ZDo6c3RyaW5nICZDb250ZXh0KTsKKworICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0RXJyb3JNZXNzYWdlKCkgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBjb252ZXJ0VG9FcnJvckNvZGUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgRXJyTXNnOworICByYXdfZXJyb3JfY29kZSBDb2RlOworfTsKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdUeXBlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYzg4MjEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd1R5cGVzLmgKQEAgLTAsMCArMSwzNjIgQEAKKy8vPT09LSBSYXdUeXBlcy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1JBV19SQVdUWVBFU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUkFXVFlQRVNfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvR1VJRC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworLy8gVGhpcyBzdHJ1Y3QgaXMgZGVmaW5lZCBhcyAiU08iIGluIGxhbmdhcGkvaW5jbHVkZS9wZGIuaC4KK3N0cnVjdCBTZWN0aW9uT2Zmc2V0IHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgT2ZmOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBJc2VjdDsKKyAgY2hhciBQYWRkaW5nWzJdOworfTsKKworLy8vIEhlYWRlciBvZiB0aGUgaGFzaCB0YWJsZXMgZm91bmQgaW4gdGhlIGdsb2JhbHMgYW5kIHB1YmxpY3Mgc2VjdGlvbnMuCisvLy8gQmFzZWQgb24gR1NJSGFzaEhkciBpbgorLy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvbWljcm9zb2Z0LXBkYi9ibG9iL21hc3Rlci9QREIvZGJpL2dzaS5oCitzdHJ1Y3QgR1NJSGFzaEhlYWRlciB7CisgIGVudW0gOiB1bnNpZ25lZCB7CisgICAgSGRyU2lnbmF0dXJlID0gfjBVLAorICAgIEhkclZlcnNpb24gPSAweGVmZmUwMDAwICsgMTk5OTA4MTAsCisgIH07CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFZlclNpZ25hdHVyZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVmVySGRyOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBIclNpemU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE51bUJ1Y2tldHM7Cit9OworCisvLyBUaGlzIGlzIEhSRmlsZS4KK3N0cnVjdCBQU0hhc2hSZWNvcmQgeworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBPZmY7IC8vIE9mZnNldCBpbiB0aGUgc3ltYm9sIHJlY29yZCBzdHJlYW0KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQ1JlZjsKK307CisKKy8vIFRoaXMgc3RydWN0IGlzIGRlZmluZWQgYXMgYFNDYCBpbiBpbmNsdWRlL2RiaWNvbW1vbi5oCitzdHJ1Y3QgU2VjdGlvbkNvbnRyaWIgeworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBJU2VjdDsKKyAgY2hhciBQYWRkaW5nWzJdOworICBzdXBwb3J0OjpsaXR0bGUzMl90IE9mZjsKKyAgc3VwcG9ydDo6bGl0dGxlMzJfdCBTaXplOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDaGFyYWN0ZXJpc3RpY3M7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IEltb2Q7CisgIGNoYXIgUGFkZGluZzJbMl07CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IERhdGFDcmM7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFJlbG9jQ3JjOworfTsKKworLy8gVGhpcyBzdHJ1Y3QgaXMgZGVmaW5lZCBhcyBgU0MyYCBpbiBpbmNsdWRlL2RiaWNvbW1vbi5oCitzdHJ1Y3QgU2VjdGlvbkNvbnRyaWIyIHsKKyAgLy8gVG8gZ3VhcmFudGVlIFNlY3Rpb25Db250cmliMiBpcyBzdGFuZGFyZCBsYXlvdXQsIHdlIGNhbm5vdCB1c2UgaW5oZXJpdGFuY2UuCisgIFNlY3Rpb25Db250cmliIEJhc2U7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IElTZWN0Q29mZjsKK307CisKKy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGBPTUZTZWdNYXBgIHN0cnVjdHVyZS4KK3N0cnVjdCBTZWNNYXBIZWFkZXIgeworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBTZWNDb3VudDsgICAgLy8gTnVtYmVyIG9mIHNlZ21lbnQgZGVzY3JpcHRvcnMgaW4gdGFibGUKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgU2VjQ291bnRMb2c7IC8vIE51bWJlciBvZiBsb2dpY2FsIHNlZ21lbnQgZGVzY3JpcHRvcnMKK307CisKKy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGBPTUZTZWdNYXBEZXNjYCBzdHJ1Y3R1cmUuICBUaGUgZGVmaW5pdGlvbiBpcyBub3QKKy8vIHByZXNlbnQgaW4gdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiwgYnV0IHRoZSBsYXlvdXQgaXMgZGVyaXZlZCBmcm9tCisvLyBjb2RlIHRoYXQgYWNjZXNzZXMgdGhlIGZpZWxkcy4KK3N0cnVjdCBTZWNNYXBFbnRyeSB7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IEZsYWdzOyAvLyBEZXNjcmlwdG9yIGZsYWdzLiAgU2VlIE9NRlNlZ0Rlc2NGbGFncworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBPdmw7ICAgLy8gTG9naWNhbCBvdmVybGF5IG51bWJlci4KKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgR3JvdXA7IC8vIEdyb3VwIGluZGV4IGludG8gZGVzY3JpcHRvciBhcnJheS4KKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgRnJhbWU7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFNlY05hbWU7ICAgICAgIC8vIEJ5dGUgaW5kZXggb2YgdGhlIHNlZ21lbnQgb3IgZ3JvdXAgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgc3N0U2VnTmFtZSB0YWJsZSwgb3IgMHhGRkZGLgorICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBDbGFzc05hbWU7ICAgICAvLyBCeXRlIGluZGV4IG9mIHRoZSBjbGFzcyBuYW1lIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzc3RTZWdOYW1lIHRhYmxlLCBvciAweEZGRkYuCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE9mZnNldDsgICAgICAgIC8vIEJ5dGUgb2Zmc2V0IG9mIHRoZSBsb2dpY2FsIHNlZ21lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aGluIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgc2VnbWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZ3JvdXAgaXMgc2V0IGluIGZsYWdzLCBvZmZzZXQgaXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBvZiB0aGUgZ3JvdXAuCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNlY0J5dGVMZW5ndGg7IC8vIEJ5dGUgY291bnQgb2YgdGhlIHNlZ21lbnQgb3IgZ3JvdXAuCit9OworCisvLy8gU29tZSBvZiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gYml0ZmllbGRzLiAgU2luY2UgdGhpcyBuZWVkcyB0byBiZSBwb3J0YWJsZQorLy8vIGFjcm9zcyBjb21waWxlcnMgYW5kIGFyY2hpdGVjdHVyZXMgKGJpZyAvIGxpdHRsZSBlbmRpYW4gaW4gcGFydGljdWxhcikgd2UKKy8vLyBjYW4ndCB1c2UgdGhlIGFjdHVhbCBzdHJ1Y3R1cmVzIGJlbG93LCBidXQgbXVzdCBpbnN0ZWFkIGRvIHRoZSBzaGlmdGluZworLy8vIGFuZCBtYXNraW5nIG91cnNlbHZlcy4gIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbnMgYXJlIHByb3ZpZGVkIGZvciByZWZlcmVuY2UuCitzdHJ1Y3QgRGJpRmxhZ3MgeworICAvLy8gIHVpbnQxNl90IEluY3JlbWVudGFsTGlua2luZyA6IDE7IC8vIFRydWUgaWYgbGlua2VkIGluY3JlbWVudGFsbHkKKyAgLy8vICB1aW50MTZfdCBJc1N0cmlwcGVkIDogMTsgICAgICAgICAvLyBUcnVlIGlmIHByaXZhdGUgc3ltYm9scyB3ZXJlCisgIC8vLyAgc3RyaXBwZWQuCisgIC8vLyAgdWludDE2X3QgSGFzQ1R5cGVzIDogMTsgICAgICAgICAgLy8gVHJ1ZSBpZiBsaW5rZWQgd2l0aCAvZGVidWc6Y3R5cGVzLgorICAvLy8gIHVpbnQxNl90IFJlc2VydmVkIDogMTM7CisgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBGbGFnSW5jcmVtZW50YWxNYXNrID0gMHgwMDAxOworICBzdGF0aWMgY29uc3QgdWludDE2X3QgRmxhZ1N0cmlwcGVkTWFzayA9IDB4MDAwMjsKKyAgc3RhdGljIGNvbnN0IHVpbnQxNl90IEZsYWdIYXNDVHlwZXNNYXNrID0gMHgwMDA0OworfTsKKworc3RydWN0IERiaUJ1aWxkTm8geworICAvLy8gIHVpbnQxNl90IE1pbm9yVmVyc2lvbiA6IDg7CisgIC8vLyAgdWludDE2X3QgTWFqb3JWZXJzaW9uIDogNzsKKyAgLy8vICB1aW50MTZfdCBOZXdWZXJzaW9uRm9ybWF0IDogMTsKKyAgc3RhdGljIGNvbnN0IHVpbnQxNl90IEJ1aWxkTWlub3JNYXNrID0gMHgwMEZGOworICBzdGF0aWMgY29uc3QgdWludDE2X3QgQnVpbGRNaW5vclNoaWZ0ID0gMDsKKworICBzdGF0aWMgY29uc3QgdWludDE2X3QgQnVpbGRNYWpvck1hc2sgPSAweDdGMDA7CisgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBCdWlsZE1ham9yU2hpZnQgPSA4OworfTsKKworLy8vIFRoZSBmaXhlZCBzaXplIGhlYWRlciB0aGF0IGFwcGVhcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgREJJIFN0cmVhbS4KK3N0cnVjdCBEYmlTdHJlYW1IZWFkZXIgeworICBzdXBwb3J0OjpsaXR0bGUzMl90IFZlcnNpb25TaWduYXR1cmU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFZlcnNpb25IZWFkZXI7CisKKyAgLy8vIEhvdyAib2xkIiBpcyB0aGlzIERCSSBTdHJlYW0uIFNob3VsZCBtYXRjaCB0aGUgYWdlIG9mIHRoZSBQREIgSW5mb1N0cmVhbS4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQWdlOworCisgIC8vLyBHbG9iYWwgc3ltYm9sIHN0cmVhbSAjCisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IEdsb2JhbFN5bWJvbFN0cmVhbUluZGV4OworCisgIC8vLyBTZWUgRGJpQnVpbGRObyBzdHJ1Y3R1cmUuCisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IEJ1aWxkTnVtYmVyOworCisgIC8vLyBQdWJsaWMgc3ltYm9scyBzdHJlYW0gIworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBQdWJsaWNTeW1ib2xTdHJlYW1JbmRleDsKKworICAvLy8gdmVyc2lvbiBvZiBtc3BkYk5OTi5kbGwKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgUGRiRGxsVmVyc2lvbjsKKworICAvLy8gU3ltYm9sIHJlY29yZHMgc3RyZWFtICMKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgU3ltUmVjb3JkU3RyZWFtSW5kZXg7CisKKyAgLy8vIHJibGQgbnVtYmVyIG9mIG1zcGRiTk5OLmRsbAorICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBQZGJEbGxSYmxkOworCisgIC8vLyBTaXplIG9mIG1vZHVsZSBpbmZvIHN0cmVhbQorICBzdXBwb3J0OjpsaXR0bGUzMl90IE1vZGlTdWJzdHJlYW1TaXplOworCisgIC8vLyBTaXplIG9mIHNlYy4gY29udHJpYiBzdHJlYW0KKyAgc3VwcG9ydDo6bGl0dGxlMzJfdCBTZWNDb250clN1YnN0cmVhbVNpemU7CisKKyAgLy8vIFNpemUgb2Ygc2VjLiBtYXAgc3Vic3RyZWFtCisgIHN1cHBvcnQ6OmxpdHRsZTMyX3QgU2VjdGlvbk1hcFNpemU7CisKKyAgLy8vIFNpemUgb2YgZmlsZSBpbmZvIHN1YnN0cmVhbQorICBzdXBwb3J0OjpsaXR0bGUzMl90IEZpbGVJbmZvU2l6ZTsKKworICAvLy8gU2l6ZSBvZiB0eXBlIHNlcnZlciBtYXAKKyAgc3VwcG9ydDo6bGl0dGxlMzJfdCBUeXBlU2VydmVyU2l6ZTsKKworICAvLy8gSW5kZXggb2YgTUZDIFR5cGUgU2VydmVyCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE1GQ1R5cGVTZXJ2ZXJJbmRleDsKKworICAvLy8gU2l6ZSBvZiBEYmdIZWFkZXIgaW5mbworICBzdXBwb3J0OjpsaXR0bGUzMl90IE9wdGlvbmFsRGJnSGRyU2l6ZTsKKworICAvLy8gU2l6ZSBvZiBFQyBzdHJlYW0gKHdoYXQgaXMgRUM/KQorICBzdXBwb3J0OjpsaXR0bGUzMl90IEVDU3Vic3RyZWFtU2l6ZTsKKworICAvLy8gU2VlIERiaUZsYWdzIGVudW0uCisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IEZsYWdzOworCisgIC8vLyBTZWUgUERCX01hY2hpbmVUeXBlIGVudW0uCisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1hY2hpbmVUeXBlOworCisgIC8vLyBQYWQgdG8gNjQgYnl0ZXMKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUmVzZXJ2ZWQ7Cit9Oworc3RhdGljX2Fzc2VydChzaXplb2YoRGJpU3RyZWFtSGVhZGVyKSA9PSA2NCwgIkludmFsaWQgRGJpU3RyZWFtSGVhZGVyIHNpemUhIik7CisKK3N0cnVjdCBTZWN0aW9uQ29udHJpYkVudHJ5IHsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgU2VjdGlvbjsKKyAgY2hhciBQYWRkaW5nMVsyXTsKKyAgc3VwcG9ydDo6bGl0dGxlMzJfdCBPZmZzZXQ7CisgIHN1cHBvcnQ6OmxpdHRsZTMyX3QgU2l6ZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQ2hhcmFjdGVyaXN0aWNzOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNb2R1bGVJbmRleDsKKyAgY2hhciBQYWRkaW5nMlsyXTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRGF0YUNyYzsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUmVsb2NDcmM7Cit9OworCisvLy8gVGhlIGhlYWRlciBwcmVjZWVkaW5nIHRoZSBGaWxlIEluZm8gU3Vic3RyZWFtIG9mIHRoZSBEQkkgc3RyZWFtLgorc3RydWN0IEZpbGVJbmZvU3Vic3RyZWFtSGVhZGVyIHsKKyAgLy8vIFRvdGFsICMgb2YgbW9kdWxlcywgc2hvdWxkIG1hdGNoIG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBNb2R1bGVJbmZvCisgIC8vLyBzdWJzdHJlYW0uCisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE51bU1vZHVsZXM7CisKKyAgLy8vIFRvdGFsICMgb2Ygc291cmNlIGZpbGVzLiBUaGlzIHZhbHVlIGlzIG5vdCBhY2N1cmF0ZSBiZWNhdXNlIFBEQiBhY3R1YWxseQorICAvLy8gc3VwcG9ydHMgbW9yZSB0aGFuIDY0ayBzb3VyY2UgZmlsZXMsIHNvIHdlIGlnbm9yZSBpdCBhbmQgY29tcHV0ZSB0aGUgdmFsdWUKKyAgLy8vIGZyb20gb3RoZXIgc3RyZWFtIGZpZWxkcy4KKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTnVtU291cmNlRmlsZXM7CisKKyAgLy8vIEZvbGxvd2luZyB0aGlzIGhlYWRlciB0aGUgRmlsZSBJbmZvIFN1YnN0cmVhbSBpcyBsYWlkIG91dCBhcyBmb2xsb3dzOgorICAvLy8gICB1bGl0dGxlMTZfdCBNb2RJbmRpY2VzW051bU1vZHVsZXNdOworICAvLy8gICB1bGl0dGxlMTZfdCBNb2RGaWxlQ291bnRzW051bU1vZHVsZXNdOworICAvLy8gICB1bGl0dGxlMzJfdCBGaWxlTmFtZU9mZnNldHNbTnVtU291cmNlRmlsZXNdOworICAvLy8gICBjaGFyIE5hbWVzW11bTnVtU291cmNlRmlsZXNdOworICAvLy8gd2l0aCB0aGUgY2F2ZWF0IHRoYXQgYE51bVNvdXJjZUZpbGVzYCBjYW5ub3QgYmUgdHJ1c3RlZCwgc28KKyAgLy8vIGl0IGlzIGNvbXB1dGVkIGJ5IHN1bW1pbmcgdGhlIGBNb2RGaWxlQ291bnRzYCBhcnJheS4KK307CisKK3N0cnVjdCBNb2RJbmZvRmxhZ3MgeworICAvLy8gIHVpbnQxNl90IGZXcml0dGVuIDogMTsgICAvLyBUcnVlIGlmIERiaU1vZHVsZURlc2NyaXB0b3IgaXMgZGlydHkKKyAgLy8vICB1aW50MTZfdCBmRUNFbmFibGVkIDogMTsgLy8gSXMgRUMgc3ltYm9saWMgaW5mbyBwcmVzZW50PyAgKFdoYXQgaXMgRUM/KQorICAvLy8gIHVpbnQxNl90IHVudXNlZCA6IDY7ICAgICAvLyBSZXNlcnZlZAorICAvLy8gIHVpbnQxNl90IGlUU00gOiA4OyAgICAgICAvLyBUeXBlIFNlcnZlciBJbmRleCBmb3IgdGhpcyBtb2R1bGUKKyAgc3RhdGljIGNvbnN0IHVpbnQxNl90IEhhc0VDRmxhZ01hc2sgPSAweDI7CisKKyAgc3RhdGljIGNvbnN0IHVpbnQxNl90IFR5cGVTZXJ2ZXJJbmRleE1hc2sgPSAweEZGMDA7CisgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBUeXBlU2VydmVySW5kZXhTaGlmdCA9IDg7Cit9OworCisvLy8gVGhlIGhlYWRlciBwcmVjZWVkaW5nIGVhY2ggZW50cnkgaW4gdGhlIE1vZHVsZSBJbmZvIHN1YnN0cmVhbSBvZiB0aGUgREJJCisvLy8gc3RyZWFtLiAgQ29ycmVzcG9uZHMgdG8gdGhlIHR5cGUgTU9ESSBpbiB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLgorc3RydWN0IE1vZHVsZUluZm9IZWFkZXIgeworICAvLy8gQ3VycmVudGx5IG9wZW5lZCBtb2R1bGUuIFRoaXMgZmllbGQgaXMgYSBwb2ludGVyIGluIHRoZSByZWZlcmVuY2UKKyAgLy8vIGltcGxlbWVudGF0aW9uLCBidXQgdGhhdCB3b24ndCB3b3JrIG9uIDY0LWJpdCBzeXN0ZW1zLCBhbmQgYW55d2F5IGl0CisgIC8vLyBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcmVhZCBhIHBvaW50ZXIgZnJvbSBhIGZpbGUuIEZvciBub3cgaXQgaXMgdW51c2VkLAorICAvLy8gc28ganVzdCBpZ25vcmUgaXQuCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE1vZDsKKworICAvLy8gRmlyc3Qgc2VjdGlvbiBjb250cmlidXRpb24gb2YgdGhpcyBtb2R1bGUuCisgIFNlY3Rpb25Db250cmliRW50cnkgU0M7CisKKyAgLy8vIFNlZSBNb2RJbmZvRmxhZ3MgZGVmaW5pdGlvbi4KKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgRmxhZ3M7CisKKyAgLy8vIFN0cmVhbSBOdW1iZXIgb2YgbW9kdWxlIGRlYnVnIGluZm8KKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTW9kRGlTdHJlYW07CisKKyAgLy8vIFNpemUgb2YgbG9jYWwgc3ltYm9sIGRlYnVnIGluZm8gaW4gYWJvdmUgc3RyZWFtCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFN5bUJ5dGVzOworCisgIC8vLyBTaXplIG9mIEMxMSBsaW5lIG51bWJlciBpbmZvIGluIGFib3ZlIHN0cmVhbQorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDMTFCeXRlczsKKworICAvLy8gU2l6ZSBvZiBDMTMgbGluZSBudW1iZXIgaW5mbyBpbiBhYm92ZSBzdHJlYW0KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQzEzQnl0ZXM7CisKKyAgLy8vIE51bWJlciBvZiBmaWxlcyBjb250cmlidXRpbmcgdG8gdGhpcyBtb2R1bGUKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTnVtRmlsZXM7CisKKyAgLy8vIFBhZGRpbmcgc28gdGhlIG5leHQgZmllbGQgaXMgNC1ieXRlIGFsaWduZWQuCisgIGNoYXIgUGFkZGluZzFbMl07CisKKyAgLy8vIEFycmF5IG9mIFswLi5OdW1GaWxlcykgREJJIG5hbWUgYnVmZmVyIG9mZnNldHMuICBJbiB0aGUgcmVmZXJlbmNlCisgIC8vLyBpbXBsZW1lbnRhdGlvbiB0aGlzIGZpZWxkIGlzIGEgcG9pbnRlci4gIEJ1dCBzaW5jZSB5b3UgY2FuJ3QgcG9ydGFibHkKKyAgLy8vIHNlcmlhbGl6ZSBhIHBvaW50ZXIsIG9uIDY0LWJpdCBwbGF0Zm9ybXMgdGhleSBjb3B5IGFsbCB0aGUgdmFsdWVzIGV4Y2VwdAorICAvLy8gdGhpcyBvbmUgaW50byB0aGUgMzItYml0IHZlcnNpb24gb2YgdGhlIHN0cnVjdCBhbmQgdXNlIHRoYXQgZm9yCisgIC8vLyBzZXJpYWxpemF0aW9uLiAgUmVnYXJkbGVzcywgdGhpcyBmaWVsZCBpcyB1bnVzZWQsIGl0IGlzIG9ubHkgdGhlcmUgdG8KKyAgLy8vIHN0b3JlIGEgcG9pbnRlciB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBhdCBydW50aW1lLgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBGaWxlTmFtZU9mZnM7CisKKyAgLy8vIE5hbWUgSW5kZXggZm9yIHNyYyBmaWxlIG5hbWUKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU3JjRmlsZU5hbWVOSTsKKworICAvLy8gTmFtZSBJbmRleCBmb3IgcGF0aCB0byBjb21waWxlciBQREIKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUGRiRmlsZVBhdGhOSTsKKworICAvLy8gRm9sbG93aW5nIHRoaXMgaGVhZGVyIGFyZSB0d28gemVybyB0ZXJtaW5hdGVkIHN0cmluZ3MuCisgIC8vLyBjaGFyIE1vZHVsZU5hbWVbXTsKKyAgLy8vIGNoYXIgT2JqRmlsZU5hbWVbXTsKK307CisKKy8vIFRoaXMgaXMgUFNHU0lIRFIgc3RydWN0IGRlZmluZWQgaW4KKy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvbWljcm9zb2Z0LXBkYi9ibG9iL21hc3Rlci9QREIvZGJpL2dzaS5oCitzdHJ1Y3QgUHVibGljc1N0cmVhbUhlYWRlciB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFN5bUhhc2g7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEFkZHJNYXA7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE51bVRodW5rczsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZU9mVGh1bms7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IElTZWN0VGh1bmtUYWJsZTsKKyAgY2hhciBQYWRkaW5nWzJdOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBPZmZUaHVua1RhYmxlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBOdW1TZWN0aW9uczsKK307CisKKy8vIFRoZSBoZWFkZXIgcHJlY2VlZGluZyB0aGUgZ2xvYmFsIFRQSSBzdHJlYW0uCisvLyBUaGlzIGNvcnJlc3BvbmRzIHRvIGBIRFJgIGluIFBEQi9kYmkvdHBpLmguCitzdHJ1Y3QgVHBpU3RyZWFtSGVhZGVyIHsKKyAgc3RydWN0IEVtYmVkZGVkQnVmIHsKKyAgICBzdXBwb3J0OjpsaXR0bGUzMl90IE9mZjsKKyAgICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBMZW5ndGg7CisgIH07CisKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgSGVhZGVyU2l6ZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVHlwZUluZGV4QmVnaW47CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFR5cGVJbmRleEVuZDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVHlwZVJlY29yZEJ5dGVzOworCisgIC8vIFRoZSBmb2xsb3dpbmcgbWVtYmVycyBjb3JyZXNwb25kIHRvIGBUcGlIYXNoYCBpbiBQREIvZGJpL3RwaS5oLgorICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBIYXNoU3RyZWFtSW5kZXg7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IEhhc2hBdXhTdHJlYW1JbmRleDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgSGFzaEtleVNpemU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE51bUhhc2hCdWNrZXRzOworCisgIEVtYmVkZGVkQnVmIEhhc2hWYWx1ZUJ1ZmZlcjsKKyAgRW1iZWRkZWRCdWYgSW5kZXhPZmZzZXRCdWZmZXI7CisgIEVtYmVkZGVkQnVmIEhhc2hBZGpCdWZmZXI7Cit9OworCitjb25zdCB1aW50MzJfdCBNaW5UcGlIYXNoQnVja2V0cyA9IDB4MTAwMDsKK2NvbnN0IHVpbnQzMl90IE1heFRwaUhhc2hCdWNrZXRzID0gMHg0MDAwMDsKKworLy8vIFRoZSBoZWFkZXIgcHJlY2VlZGluZyB0aGUgZ2xvYmFsIFBEQiBTdHJlYW0gKFN0cmVhbSAxKQorc3RydWN0IEluZm9TdHJlYW1IZWFkZXIgeworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaWduYXR1cmU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEFnZTsKKyAgY29kZXZpZXc6OkdVSUQgR3VpZDsKK307CisKKy8vLyBUaGUgaGVhZGVyIHByZWNlZWRpbmcgdGhlIC9uYW1lcyBzdHJlYW0uCitzdHJ1Y3QgUERCU3RyaW5nVGFibGVIZWFkZXIgeworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaWduYXR1cmU7ICAgLy8gUERCU3RyaW5nVGFibGVTaWduYXR1cmUKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgSGFzaFZlcnNpb247IC8vIDEgb3IgMgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBCeXRlU2l6ZTsgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIG9mIG5hbWVzIGJ1ZmZlci4KK307CisKK2NvbnN0IHVpbnQzMl90IFBEQlN0cmluZ1RhYmxlU2lnbmF0dXJlID0gMHhFRkZFRUZGRTsKKworLy8vIFRoZSBoZWFkZXIgcHJlY2VkaW5nIHRoZSAvc3JjL2hlYWRlcmJsb2NrIHN0cmVhbS4KK3N0cnVjdCBTcmNIZWFkZXJCbG9ja0hlYWRlciB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFZlcnNpb247IC8vIFBkYlJhd19TcmNIZWFkZXJCbG9ja1ZlciBlbnVtZXJhdGlvbi4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZTsgICAgLy8gU2l6ZSBvZiBlbnRpcmUgc3RyZWFtLgorICB1aW50NjRfdCBGaWxlVGltZTsgICAgICAgICAgICAvLyBUaW1lIHN0YW1wIChXaW5kb3dzIEZJTEVUSU1FIGZvcm1hdCkuCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEFnZTsgICAgIC8vIEFnZQorICB1aW50OF90IFBhZGRpbmdbNDRdOyAgICAgICAgICAvLyBQYWQgdG8gNjQgYnl0ZXMuCit9Oworc3RhdGljX2Fzc2VydChzaXplb2YoU3JjSGVhZGVyQmxvY2tIZWFkZXIpID09IDY0LCAiSW5jb3JyZWN0IHN0cnVjdCBzaXplISIpOworCisvLy8gQSBzaW5nbGUgZmlsZSByZWNvcmQgZW50cnkgd2l0aGluIHRoZSAvc3JjL2hlYWRlcmJsb2NrIHN0cmVhbS4KK3N0cnVjdCBTcmNIZWFkZXJCbG9ja0VudHJ5IHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZTsgICAgIC8vIFJlY29yZCBMZW5ndGguCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFZlcnNpb247ICAvLyBQZGJSYXdfU3JjSGVhZGVyQmxvY2tWZXIgZW51bWVyYXRpb24uCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IENSQzsgICAgICAvLyBDUkMgb2YgdGhlIG9yaWdpbmFsIGZpbGUgY29udGVudHMuCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEZpbGVTaXplOyAvLyBTaXplIG9mIG9yaWdpbmFsIHNvdXJjZSBmaWxlLgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBGaWxlTkk7ICAgLy8gU3RyaW5nIHRhYmxlIGluZGV4IG9mIGZpbGUgbmFtZS4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgT2JqTkk7ICAgIC8vIFN0cmluZyB0YWJsZSBpbmRleCBvZiBvYmplY3QgbmFtZS4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVkZpbGVOSTsgIC8vIFN0cmluZyB0YWJsZSBpbmRleCBvZiB2aXJ0dWFsIGZpbGUgbmFtZS4KKyAgdWludDhfdCBDb21wcmVzc2lvbjsgICAgICAgICAgIC8vIFBEQl9Tb3VyY2VDb21wcmVzc2lvbiBlbnVtZXJhdGlvbi4KKyAgdWludDhfdCBJc1ZpcnR1YWw7ICAgICAgICAgICAgIC8vIElzIHRoaXMgYSB2aXJ0dWFsIGZpbGUgKGluamVjdGVkKT8KKyAgc2hvcnQgUGFkZGluZzsgICAgICAgICAgICAgICAgIC8vIFBhZCB0byA0IGJ5dGVzLgorICBjaGFyIFJlc2VydmVkWzhdOworfTsKKworY29uc3RleHByIGludCBJID0gc2l6ZW9mKFNyY0hlYWRlckJsb2NrRW50cnkpOworc3RhdGljX2Fzc2VydChzaXplb2YoU3JjSGVhZGVyQmxvY2tFbnRyeSkgPT0gNDAsICJJbmNvcnJlY3Qgc3RydWN0IHNpemUhIik7CisKK30gLy8gbmFtZXNwYWNlIHBkYgorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvU3ltYm9sU3RyZWFtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1N5bWJvbFN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOWY3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1N5bWJvbFN0cmVhbS5oCkBAIC0wLDAgKzEsNDggQEAKKy8vPT09LSBTeW1ib2xTdHJlYW0uY3BwIC0gUERCIFN5bWJvbCBTdHJlYW0gQWNjZXNzIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1JBV19QREJTWU1CT0xTVFJFQU1fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQlNZTUJPTFNUUkVBTV9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmQuaCIKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgbXNmIHsKK2NsYXNzIE1hcHBlZEJsb2NrU3RyZWFtOworfQorbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBQREJGaWxlOworCitjbGFzcyBTeW1ib2xTdHJlYW0geworcHVibGljOgorICBTeW1ib2xTdHJlYW0oc3RkOjp1bmlxdWVfcHRyPG1zZjo6TWFwcGVkQmxvY2tTdHJlYW0+IFN0cmVhbSk7CisgIH5TeW1ib2xTdHJlYW0oKTsKKyAgRXJyb3IgcmVsb2FkKCk7CisKKyAgY29uc3QgY29kZXZpZXc6OkNWU3ltYm9sQXJyYXkgJmdldFN5bWJvbEFycmF5KCkgY29uc3QgeworICAgIHJldHVybiBTeW1ib2xSZWNvcmRzOworICB9CisKKyAgY29kZXZpZXc6OkNWU3ltYm9sIHJlYWRSZWNvcmQodWludDMyX3QgT2Zmc2V0KSBjb25zdDsKKworICBpdGVyYXRvcl9yYW5nZTxjb2Rldmlldzo6Q1ZTeW1ib2xBcnJheTo6SXRlcmF0b3I+CisgIGdldFN5bWJvbHMoYm9vbCAqSGFkRXJyb3IpIGNvbnN0OworCisgIEVycm9yIGNvbW1pdCgpOworCitwcml2YXRlOgorICBjb2Rldmlldzo6Q1ZTeW1ib2xBcnJheSBTeW1ib2xSZWNvcmRzOworICBzdGQ6OnVuaXF1ZV9wdHI8bXNmOjpNYXBwZWRCbG9ja1N0cmVhbT4gU3RyZWFtOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1RwaUhhc2hpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvVHBpSGFzaGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZWRlYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1RwaUhhc2hpbmcuaApAQCAtMCwwICsxLDI0IEBACisvLz09PS0gVHBpSGFzaGluZy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9UUElIQVNISU5HX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1RQSUhBU0hJTkdfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKKworRXhwZWN0ZWQ8dWludDMyX3Q+IGhhc2hUeXBlUmVjb3JkKGNvbnN0IGxsdm06OmNvZGV2aWV3OjpDVlR5cGUgJlR5cGUpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgcGRiCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1RQSUhBU0hJTkdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9UcGlTdHJlYW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvVHBpU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3OTM5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvVHBpU3RyZWFtLmgKQEAgLTAsMCArMSw4NSBAQAorLy89PT0tIFRwaVN0cmVhbS5jcHAgLSBQREIgVHlwZSBJbmZvIChUUEkpIFN0cmVhbSAyIEFjY2VzcyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQlRQSVNUUkVBTV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCVFBJU1RSRUFNX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0hhc2hUYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUmF3Q29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9QREJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1BcnJheS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworY2xhc3MgTGF6eVJhbmRvbVR5cGVDb2xsZWN0aW9uOworfQorbmFtZXNwYWNlIG1zZiB7CitjbGFzcyBNYXBwZWRCbG9ja1N0cmVhbTsKK30KK25hbWVzcGFjZSBwZGIgeworY2xhc3MgUERCRmlsZTsKKworY2xhc3MgVHBpU3RyZWFtIHsKKyAgZnJpZW5kIGNsYXNzIFRwaVN0cmVhbUJ1aWxkZXI7CisKK3B1YmxpYzoKKyAgVHBpU3RyZWFtKFBEQkZpbGUgJkZpbGUsIHN0ZDo6dW5pcXVlX3B0cjxtc2Y6Ok1hcHBlZEJsb2NrU3RyZWFtPiBTdHJlYW0pOworICB+VHBpU3RyZWFtKCk7CisgIEVycm9yIHJlbG9hZCgpOworCisgIFBkYlJhd19UcGlWZXIgZ2V0VHBpVmVyc2lvbigpIGNvbnN0OworCisgIHVpbnQzMl90IFR5cGVJbmRleEJlZ2luKCkgY29uc3Q7CisgIHVpbnQzMl90IFR5cGVJbmRleEVuZCgpIGNvbnN0OworICB1aW50MzJfdCBnZXROdW1UeXBlUmVjb3JkcygpIGNvbnN0OworICB1aW50MTZfdCBnZXRUeXBlSGFzaFN0cmVhbUluZGV4KCkgY29uc3Q7CisgIHVpbnQxNl90IGdldFR5cGVIYXNoU3RyZWFtQXV4SW5kZXgoKSBjb25zdDsKKworICB1aW50MzJfdCBnZXRIYXNoS2V5U2l6ZSgpIGNvbnN0OworICB1aW50MzJfdCBnZXROdW1IYXNoQnVja2V0cygpIGNvbnN0OworICBGaXhlZFN0cmVhbUFycmF5PHN1cHBvcnQ6OnVsaXR0bGUzMl90PiBnZXRIYXNoVmFsdWVzKCkgY29uc3Q7CisgIEZpeGVkU3RyZWFtQXJyYXk8Y29kZXZpZXc6OlR5cGVJbmRleE9mZnNldD4gZ2V0VHlwZUluZGV4T2Zmc2V0cygpIGNvbnN0OworICBIYXNoVGFibGU8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+ICZnZXRIYXNoQWRqdXN0ZXJzKCk7CisKKyAgY29kZXZpZXc6OkNWVHlwZVJhbmdlIHR5cGVzKGJvb2wgKkhhZEVycm9yKSBjb25zdDsKKyAgY29uc3QgY29kZXZpZXc6OkNWVHlwZUFycmF5ICZ0eXBlQXJyYXkoKSBjb25zdCB7IHJldHVybiBUeXBlUmVjb3JkczsgfQorCisgIGNvZGV2aWV3OjpMYXp5UmFuZG9tVHlwZUNvbGxlY3Rpb24gJnR5cGVDb2xsZWN0aW9uKCkgeyByZXR1cm4gKlR5cGVzOyB9CisKKyAgQmluYXJ5U3Vic3RyZWFtUmVmIGdldFR5cGVSZWNvcmRzU3Vic3RyZWFtKCkgY29uc3Q7CisKKyAgRXJyb3IgY29tbWl0KCk7CisKK3ByaXZhdGU6CisgIFBEQkZpbGUgJlBkYjsKKyAgc3RkOjp1bmlxdWVfcHRyPG1zZjo6TWFwcGVkQmxvY2tTdHJlYW0+IFN0cmVhbTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Y29kZXZpZXc6OkxhenlSYW5kb21UeXBlQ29sbGVjdGlvbj4gVHlwZXM7CisKKyAgQmluYXJ5U3Vic3RyZWFtUmVmIFR5cGVSZWNvcmRzU3Vic3RyZWFtOworCisgIGNvZGV2aWV3OjpDVlR5cGVBcnJheSBUeXBlUmVjb3JkczsKKworICBzdGQ6OnVuaXF1ZV9wdHI8QmluYXJ5U3RyZWFtPiBIYXNoU3RyZWFtOworICBGaXhlZFN0cmVhbUFycmF5PHN1cHBvcnQ6OnVsaXR0bGUzMl90PiBIYXNoVmFsdWVzOworICBGaXhlZFN0cmVhbUFycmF5PGNvZGV2aWV3OjpUeXBlSW5kZXhPZmZzZXQ+IFR5cGVJbmRleE9mZnNldHM7CisgIEhhc2hUYWJsZTxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4gSGFzaEFkanVzdGVyczsKKworICBjb25zdCBUcGlTdHJlYW1IZWFkZXIgKkhlYWRlcjsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9UcGlTdHJlYW1CdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1RwaVN0cmVhbUJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTE3MjBkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9UcGlTdHJlYW1CdWlsZGVyLmgKQEAgLTAsMCArMSw5MCBAQAorLy89PT0tIFRwaVN0cmVhbUJ1aWxkZXIuaCAtIFBEQiBUcGkgU3RyZWFtIENyZWF0aW9uIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQlRQSVNUUkVBTUJVSUxERVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQlRQSVNUUkVBTUJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdDb25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlCeXRlU3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeUl0ZW1TdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEJpbmFyeUJ5dGVTdHJlYW07CitjbGFzcyBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZjsKKwordGVtcGxhdGUgPD4gc3RydWN0IEJpbmFyeUl0ZW1UcmFpdHM8bGx2bTo6Y29kZXZpZXc6OkNWVHlwZT4geworICBzdGF0aWMgc2l6ZV90IGxlbmd0aChjb25zdCBjb2Rldmlldzo6Q1ZUeXBlICZJdGVtKSB7IHJldHVybiBJdGVtLmxlbmd0aCgpOyB9CisgIHN0YXRpYyBBcnJheVJlZjx1aW50OF90PiBieXRlcyhjb25zdCBjb2Rldmlldzo6Q1ZUeXBlICZJdGVtKSB7CisgICAgcmV0dXJuIEl0ZW0uZGF0YSgpOworICB9Cit9OworCituYW1lc3BhY2UgY29kZXZpZXcgeworY2xhc3MgVHlwZVJlY29yZDsKK30KK25hbWVzcGFjZSBtc2YgeworY2xhc3MgTVNGQnVpbGRlcjsKK3N0cnVjdCBNU0ZMYXlvdXQ7Cit9CituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIFBEQkZpbGU7CitjbGFzcyBUcGlTdHJlYW07CitzdHJ1Y3QgVHBpU3RyZWFtSGVhZGVyOworCitjbGFzcyBUcGlTdHJlYW1CdWlsZGVyIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgVHBpU3RyZWFtQnVpbGRlcihtc2Y6Ok1TRkJ1aWxkZXIgJk1zZiwgdWludDMyX3QgU3RyZWFtSWR4KTsKKyAgflRwaVN0cmVhbUJ1aWxkZXIoKTsKKworICBUcGlTdHJlYW1CdWlsZGVyKGNvbnN0IFRwaVN0cmVhbUJ1aWxkZXIgJikgPSBkZWxldGU7CisgIFRwaVN0cmVhbUJ1aWxkZXIgJm9wZXJhdG9yPShjb25zdCBUcGlTdHJlYW1CdWlsZGVyICYpID0gZGVsZXRlOworCisgIHZvaWQgc2V0VmVyc2lvbkhlYWRlcihQZGJSYXdfVHBpVmVyIFZlcnNpb24pOworICB2b2lkIGFkZFR5cGVSZWNvcmQoQXJyYXlSZWY8dWludDhfdD4gVHlwZSwgT3B0aW9uYWw8dWludDMyX3Q+IEhhc2gpOworCisgIEVycm9yIGZpbmFsaXplTXNmTGF5b3V0KCk7CisKKyAgdWludDMyX3QgZ2V0UmVjb3JkQ291bnQoKSBjb25zdCB7IHJldHVybiBUeXBlUmVjb3Jkcy5zaXplKCk7IH0KKworICBFcnJvciBjb21taXQoY29uc3QgbXNmOjpNU0ZMYXlvdXQgJkxheW91dCwgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYgQnVmZmVyKTsKKworICB1aW50MzJfdCBjYWxjdWxhdGVTZXJpYWxpemVkTGVuZ3RoKCk7CisKK3ByaXZhdGU6CisgIHVpbnQzMl90IGNhbGN1bGF0ZUhhc2hCdWZmZXJTaXplKCkgY29uc3Q7CisgIHVpbnQzMl90IGNhbGN1bGF0ZUluZGV4T2Zmc2V0U2l6ZSgpIGNvbnN0OworICBFcnJvciBmaW5hbGl6ZSgpOworCisgIG1zZjo6TVNGQnVpbGRlciAmTXNmOworICBCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3I7CisKKyAgc2l6ZV90IFR5cGVSZWNvcmRCeXRlcyA9IDA7CisKKyAgUGRiUmF3X1RwaVZlciBWZXJIZWFkZXIgPSBQZGJSYXdfVHBpVmVyOjpQZGJUcGlWODA7CisgIHN0ZDo6dmVjdG9yPEFycmF5UmVmPHVpbnQ4X3Q+PiBUeXBlUmVjb3JkczsKKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IFR5cGVIYXNoZXM7CisgIHN0ZDo6dmVjdG9yPGNvZGV2aWV3OjpUeXBlSW5kZXhPZmZzZXQ+IFR5cGVJbmRleE9mZnNldHM7CisgIHVpbnQzMl90IEhhc2hTdHJlYW1JbmRleCA9IGtJbnZhbGlkU3RyZWFtSW5kZXg7CisgIHN0ZDo6dW5pcXVlX3B0cjxCaW5hcnlCeXRlU3RyZWFtPiBIYXNoVmFsdWVTdHJlYW07CisKKyAgY29uc3QgVHBpU3RyZWFtSGVhZGVyICpIZWFkZXI7CisgIHVpbnQzMl90IElkeDsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOWRhMzkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCLmgKQEAgLTAsMCArMSwzMiBAQAorLy89PT0tIFBEQi5oIC0gYmFzZSBoZWFkZXIgZmlsZSBmb3IgY3JlYXRpbmcgYSBQREIgcmVhZGVyIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvUERCVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBJUERCU2Vzc2lvbjsKKworRXJyb3IgbG9hZERhdGFGb3JQREIoUERCX1JlYWRlclR5cGUgVHlwZSwgU3RyaW5nUmVmIFBhdGgsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlNlc3Npb24+ICZTZXNzaW9uKTsKKworRXJyb3IgbG9hZERhdGFGb3JFWEUoUERCX1JlYWRlclR5cGUgVHlwZSwgU3RyaW5nUmVmIFBhdGgsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlNlc3Npb24+ICZTZXNzaW9uKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHBkYgorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQkNvbnRleHQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlNDlmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJDb250ZXh0LmgKQEAgLTAsMCArMSw2NSBAQAorLy89PT0tLSBQREJDb250ZXh0LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09LworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJDT05URVhUX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQkNPTlRFWFRfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRElDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJTZXNzaW9uLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBvYmplY3QgeworY2xhc3MgQ09GRk9iamVjdEZpbGU7Cit9IC8vIGVuZCBuYW1lc3BhY2Ugb2JqZWN0CisKK25hbWVzcGFjZSBwZGIgeworCisgIC8vLyBQREJDb250ZXh0CisgIC8vLyBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIHRoZSB0b3AgbGV2ZWwgZW50aXR5IHRoYXQgZGVhbHMgd2l0aCBQREIgZGVidWcKKyAgLy8vIGluZm9ybWF0aW9uIHBhcnNpbmcuICBUaGlzIGRhdGEgc3RydWN0dXJlIGV4aXN0cyBvbmx5IHdoZW4gdGhlcmUgaXMgYQorICAvLy8gbmVlZCBmb3IgYSB0cmFuc3BhcmVudCBpbnRlcmZhY2UgdG8gZGlmZmVyZW50IGRlYnVnIGluZm9ybWF0aW9uIGZvcm1hdHMKKyAgLy8vIChlLmcuIFBEQiBhbmQgRFdBUkYpLiAgTW9yZSBjb250cm9sIGFuZCBwb3dlciBvdmVyIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbgorICAvLy8gYWNjZXNzIGNhbiBiZSBoYWQgYnkgdXNpbmcgdGhlIFBEQiBpbnRlcmZhY2VzIGRpcmVjdGx5LgorICBjbGFzcyBQREJDb250ZXh0IDogcHVibGljIERJQ29udGV4dCB7CisgIHB1YmxpYzoKKyAgICBQREJDb250ZXh0KGNvbnN0IG9iamVjdDo6Q09GRk9iamVjdEZpbGUgJk9iamVjdCwKKyAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCU2Vzc2lvbj4gUERCU2Vzc2lvbik7CisgICAgUERCQ29udGV4dChQREJDb250ZXh0ICYpID0gZGVsZXRlOworICAgIFBEQkNvbnRleHQgJm9wZXJhdG9yPShQREJDb250ZXh0ICYpID0gZGVsZXRlOworCisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBESUNvbnRleHQgKkRJQ3R4KSB7CisgICAgICByZXR1cm4gRElDdHgtPmdldEtpbmQoKSA9PSBDS19QREI7CisgICAgfQorCisgICAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUywgRElEdW1wT3B0aW9ucyBESUR1bXBPcHRzKSBvdmVycmlkZTsKKworICAgIERJTGluZUluZm8gZ2V0TGluZUluZm9Gb3JBZGRyZXNzKAorICAgICAgICB1aW50NjRfdCBBZGRyZXNzLAorICAgICAgICBESUxpbmVJbmZvU3BlY2lmaWVyIFNwZWNpZmllciA9IERJTGluZUluZm9TcGVjaWZpZXIoKSkgb3ZlcnJpZGU7CisgICAgRElMaW5lSW5mb1RhYmxlIGdldExpbmVJbmZvRm9yQWRkcmVzc1JhbmdlKAorICAgICAgICB1aW50NjRfdCBBZGRyZXNzLCB1aW50NjRfdCBTaXplLAorICAgICAgICBESUxpbmVJbmZvU3BlY2lmaWVyIFNwZWNpZmllciA9IERJTGluZUluZm9TcGVjaWZpZXIoKSkgb3ZlcnJpZGU7CisgICAgRElJbmxpbmluZ0luZm8gZ2V0SW5saW5pbmdJbmZvRm9yQWRkcmVzcygKKyAgICAgICAgdWludDY0X3QgQWRkcmVzcywKKyAgICAgICAgRElMaW5lSW5mb1NwZWNpZmllciBTcGVjaWZpZXIgPSBESUxpbmVJbmZvU3BlY2lmaWVyKCkpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgZ2V0RnVuY3Rpb25OYW1lKHVpbnQ2NF90IEFkZHJlc3MsIERJTmFtZUtpbmQgTmFtZUtpbmQpIGNvbnN0OworICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCU2Vzc2lvbj4gU2Vzc2lvbjsKKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHBkYgorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQkNPTlRFWFRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQkV4dHJhcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQkV4dHJhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOWExOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCRXh0cmFzLmgKQEAgLTAsMCArMSw0OCBAQAorLy89PT0tIFBEQkV4dHJhcy5oIC0gaGVscGVyIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBmb3IgUERCcyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCRVhUUkFTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQkVYVFJBU19ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9QREJUeXBlcy5oIgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBwZGIgeworCit1c2luZyBUYWdTdGF0cyA9IHN0ZDo6dW5vcmRlcmVkX21hcDxQREJfU3ltVHlwZSwgaW50PjsKKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQREJfVmFyaWFudFR5cGUgJlZhbHVlKTsKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUERCX0NhbGxpbmdDb252ICZDb252KTsKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUERCX0RhdGFLaW5kICZEYXRhKTsKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgY29kZXZpZXc6OlJlZ2lzdGVySWQgJlJlZyk7CityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFBEQl9Mb2NUeXBlICZMb2MpOworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBjb2Rldmlldzo6VGh1bmtPcmRpbmFsICZUaHVuayk7CityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFBEQl9DaGVja3N1bSAmQ2hlY2tzdW0pOworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQREJfTGFuZyAmTGFuZyk7CityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFBEQl9TeW1UeXBlICZUYWcpOworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQREJfTWVtYmVyQWNjZXNzICZBY2Nlc3MpOworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQREJfVWR0VHlwZSAmVHlwZSk7CityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFBEQl9NYWNoaW5lICZNYWNoaW5lKTsKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBEQl9Tb3VyY2VDb21wcmVzc2lvbiAmQ29tcHJlc3Npb24pOworCityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFZhcmlhbnQgJlZhbHVlKTsKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgVmVyc2lvbkluZm8gJlZlcnNpb24pOworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBUYWdTdGF0cyAmU3RhdHMpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgcGRiCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCRVhUUkFTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1EdW1wZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1EdW1wZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTc2OTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bUR1bXBlci5oCkBAIC0wLDAgKzEsNzkgQEAKKy8vPT09LSBQREJTeW1EdW1wZXIuaCAtIGJhc2UgaW50ZXJmYWNlIGZvciBQREIgc3ltYm9sIGR1bXBlciAqLSBDKysgLS0tLS0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTURVTVBFUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1EVU1QRVJfSAorCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1EdW1wZXIgeworcHVibGljOgorICBQREJTeW1EdW1wZXIoYm9vbCBTaG91bGRSZXF1aXJlSW1wbCk7CisgIHZpcnR1YWwgflBEQlN5bUR1bXBlcigpOworCisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbEFubm90YXRpb24gJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbEJsb2NrICZTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgZHVtcChjb25zdCBQREJTeW1ib2xDb21waWxhbmQgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbENvbXBpbGFuZERldGFpbHMgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbENvbXBpbGFuZEVudiAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sQ3VzdG9tICZTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgZHVtcChjb25zdCBQREJTeW1ib2xEYXRhICZTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgZHVtcChjb25zdCBQREJTeW1ib2xFeGUgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbEZ1bmMgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbEZ1bmNEZWJ1Z0VuZCAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sRnVuY0RlYnVnU3RhcnQgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbExhYmVsICZTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgZHVtcChjb25zdCBQREJTeW1ib2xQdWJsaWNTeW1ib2wgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbFRodW5rICZTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgZHVtcChjb25zdCBQREJTeW1ib2xUeXBlQXJyYXkgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbFR5cGVCYXNlQ2xhc3MgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbFR5cGVCdWlsdGluICZTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgZHVtcChjb25zdCBQREJTeW1ib2xUeXBlQ3VzdG9tICZTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgZHVtcChjb25zdCBQREJTeW1ib2xUeXBlRGltZW5zaW9uICZTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgZHVtcChjb25zdCBQREJTeW1ib2xUeXBlRW51bSAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sVHlwZUZyaWVuZCAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sVHlwZUZ1bmN0aW9uQXJnICZTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgZHVtcChjb25zdCBQREJTeW1ib2xUeXBlRnVuY3Rpb25TaWcgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbFR5cGVNYW5hZ2VkICZTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgZHVtcChjb25zdCBQREJTeW1ib2xUeXBlUG9pbnRlciAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sVHlwZVR5cGVkZWYgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbFR5cGVVRFQgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbFR5cGVWVGFibGUgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbFR5cGVWVGFibGVTaGFwZSAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sVW5rbm93biAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sVXNpbmdOYW1lc3BhY2UgJlN5bWJvbCk7CisKKyAgdmlydHVhbCB2b2lkIGR1bXBSaWdodChjb25zdCBQREJTeW1ib2xUeXBlQXJyYXkgJlN5bWJvbCkge30KKyAgdmlydHVhbCB2b2lkIGR1bXBSaWdodChjb25zdCBQREJTeW1ib2xUeXBlQmFzZUNsYXNzICZTeW1ib2wpIHt9CisgIHZpcnR1YWwgdm9pZCBkdW1wUmlnaHQoY29uc3QgUERCU3ltYm9sVHlwZUJ1aWx0aW4gJlN5bWJvbCkge30KKyAgdmlydHVhbCB2b2lkIGR1bXBSaWdodChjb25zdCBQREJTeW1ib2xUeXBlQ3VzdG9tICZTeW1ib2wpIHt9CisgIHZpcnR1YWwgdm9pZCBkdW1wUmlnaHQoY29uc3QgUERCU3ltYm9sVHlwZURpbWVuc2lvbiAmU3ltYm9sKSB7fQorICB2aXJ0dWFsIHZvaWQgZHVtcFJpZ2h0KGNvbnN0IFBEQlN5bWJvbFR5cGVFbnVtICZTeW1ib2wpIHt9CisgIHZpcnR1YWwgdm9pZCBkdW1wUmlnaHQoY29uc3QgUERCU3ltYm9sVHlwZUZyaWVuZCAmU3ltYm9sKSB7fQorICB2aXJ0dWFsIHZvaWQgZHVtcFJpZ2h0KGNvbnN0IFBEQlN5bWJvbFR5cGVGdW5jdGlvbkFyZyAmU3ltYm9sKSB7fQorICB2aXJ0dWFsIHZvaWQgZHVtcFJpZ2h0KGNvbnN0IFBEQlN5bWJvbFR5cGVGdW5jdGlvblNpZyAmU3ltYm9sKSB7fQorICB2aXJ0dWFsIHZvaWQgZHVtcFJpZ2h0KGNvbnN0IFBEQlN5bWJvbFR5cGVNYW5hZ2VkICZTeW1ib2wpIHt9CisgIHZpcnR1YWwgdm9pZCBkdW1wUmlnaHQoY29uc3QgUERCU3ltYm9sVHlwZVBvaW50ZXIgJlN5bWJvbCkge30KKyAgdmlydHVhbCB2b2lkIGR1bXBSaWdodChjb25zdCBQREJTeW1ib2xUeXBlVHlwZWRlZiAmU3ltYm9sKSB7fQorICB2aXJ0dWFsIHZvaWQgZHVtcFJpZ2h0KGNvbnN0IFBEQlN5bWJvbFR5cGVVRFQgJlN5bWJvbCkge30KKyAgdmlydHVhbCB2b2lkIGR1bXBSaWdodChjb25zdCBQREJTeW1ib2xUeXBlVlRhYmxlICZTeW1ib2wpIHt9CisgIHZpcnR1YWwgdm9pZCBkdW1wUmlnaHQoY29uc3QgUERCU3ltYm9sVHlwZVZUYWJsZVNoYXBlICZTeW1ib2wpIHt9CisKK3ByaXZhdGU6CisgIGJvb2wgUmVxdWlyZUltcGw7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2wuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDM3MzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbC5oCkBAIC0wLDAgKzEsMTQwIEBACisvLz09PS0gUERCU3ltYm9sLmggLSBiYXNlIGNsYXNzIGZvciB1c2VyLWZhY2luZyBzeW1ib2wgdHlwZXMgLS0tLS0qLSBDKystKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MX0gKKworI2luY2x1ZGUgIkNvbmNyZXRlU3ltYm9sRW51bWVyYXRvci5oIgorI2luY2x1ZGUgIklQREJSYXdTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJFeHRyYXMuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisKKyNkZWZpbmUgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKE1ldGhvZE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGF1dG8gTWV0aG9kTmFtZSgpIGNvbnN0LT5kZWNsdHlwZShSYXdTeW1ib2wtPk1ldGhvZE5hbWUoKSkgeyAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBSYXdTeW1ib2wtPk1ldGhvZE5hbWUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIEZPUldBUkRfQ09OQ1JFVEVfU1lNQk9MX0lEX01FVEhPRF9XSVRIX05BTUUoQ29uY3JldGVUeXBlLCBQcml2YXRlTmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1YmxpY05hbWUpICAgICAgICAgICAgICAgIFwKKyAgYXV0byBQdWJsaWNOYW1lIyNJZCgpIGNvbnN0LT5kZWNsdHlwZShSYXdTeW1ib2wtPlByaXZhdGVOYW1lIyNJZCgpKSB7ICAgICAgICBcCisgICAgcmV0dXJuIFJhd1N5bWJvbC0+UHJpdmF0ZU5hbWUjI0lkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RkOjp1bmlxdWVfcHRyPENvbmNyZXRlVHlwZT4gUHVibGljTmFtZSgpIGNvbnN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgSWQgPSBQdWJsaWNOYW1lIyNJZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBnZXRDb25jcmV0ZVN5bWJvbEJ5SWRIZWxwZXI8Q29uY3JldGVUeXBlPihJZCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRF9XSVRIX05BTUUoUHJpdmF0ZU5hbWUsIFB1YmxpY05hbWUpICAgICAgICAgICAgXAorICBGT1JXQVJEX0NPTkNSRVRFX1NZTUJPTF9JRF9NRVRIT0RfV0lUSF9OQU1FKFBEQlN5bWJvbCwgUHJpdmF0ZU5hbWUsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdWJsaWNOYW1lKQorCisjZGVmaW5lIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChNZXRob2ROYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0RfV0lUSF9OQU1FKE1ldGhvZE5hbWUsIE1ldGhvZE5hbWUpCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgSVBEQlJhd1N5bWJvbDsKK2NsYXNzIElQREJTZXNzaW9uOworCisjZGVmaW5lIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFRhZ1ZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgY29uc3QgUERCX1N5bVR5cGUgVGFnID0gVGFnVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBQREJTeW1ib2wgKlMpIHsgcmV0dXJuIFMtPmdldFN5bVRhZygpID09IFRhZzsgfQorCisvLy8gUERCU3ltYm9sIGRlZmluZXMgdGhlIGJhc2Ugb2YgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBmb3IgY29uY3JldGUgc3ltYm9sCisvLy8gdHlwZXMgKGUuZy4gZnVuY3Rpb25zLCBleGVjdXRhYmxlcywgdnRhYmxlcywgZXRjKS4gIEFsbCBjb25jcmV0ZSBzeW1ib2wKKy8vLyB0eXBlcyBpbmhlcml0IGZyb20gUERCU3ltYm9sIGFuZCBleHBvc2UgdGhlIGV4YWN0IHNldCBvZiBtZXRob2RzIHRoYXQgYXJlCisvLy8gdmFsaWQgZm9yIHRoYXQgcGFydGljdWxhciBzeW1ib2wgdHlwZSwgYXMgZGVzY3JpYmVkIGluIHRoZSBNaWNyb3NvZnQKKy8vLyByZWZlcmVuY2UgIkxleGljYWwgYW5kIENsYXNzIEhpZXJhcmNoeSBvZiBTeW1ib2wgVHlwZXMiOgorLy8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvMzcwaHM2azQuYXNweAorY2xhc3MgUERCU3ltYm9sIHsKK3Byb3RlY3RlZDoKKyAgUERCU3ltYm9sKGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFN5bWJvbCk7CisgIFBEQlN5bWJvbChQREJTeW1ib2wgJlN5bWJvbCk7CisKK3B1YmxpYzoKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2w+CisgIGNyZWF0ZShjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFN5bWJvbCk7CisKKyAgdmlydHVhbCB+UERCU3ltYm9sKCk7CisKKyAgLy8vIER1bXBzIHRoZSBjb250ZW50cyBvZiBhIHN5bWJvbCBhIHJhd19vc3RyZWFtLiAgQnkgZGVmYXVsdCB0aGlzIHdpbGwganVzdAorICAvLy8gY2FsbCBkdW1wKCkgb24gdGhlIHVuZGVybHlpbmcgUmF3U3ltYm9sLCB3aGljaCBhbGxvd3MgdXMgdG8gZGlzY292ZXIKKyAgLy8vIHVua25vd24gcHJvcGVydGllcywgYnV0IGluZGl2aWR1YWwgaW1wbGVtZW50YXRpb25zIG9mIFBEQlN5bWJvbCBtYXkKKyAgLy8vIG92ZXJyaWRlIHRoZSBiZWhhdmlvciB0byBvbmx5IGR1bXAga25vd24gZmllbGRzLgorICB2aXJ0dWFsIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3QgPSAwOworCisgIC8vLyBGb3IgY2VydGFpbiBQREJTeW1ib2xUeXBlcywgZHVtcHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIHR5cGUgdGhhdAorICAvLy8gbm9ybWFsbHkgZ29lcyBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgc3ltYm9sLgorICB2aXJ0dWFsIHZvaWQgZHVtcFJpZ2h0KFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCB7fQorCisgIHZvaWQgZGVmYXVsdER1bXAocmF3X29zdHJlYW0gJk9TLCBpbnQgSW5kZW50KSBjb25zdDsKKyAgdm9pZCBkdW1wUHJvcGVydGllcygpIGNvbnN0OworICB2b2lkIGR1bXBDaGlsZFN0YXRzKCkgY29uc3Q7CisKKyAgUERCX1N5bVR5cGUgZ2V0U3ltVGFnKCkgY29uc3Q7CisgIHVpbnQzMl90IGdldFN5bUluZGV4SWQoKSBjb25zdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RkOjp1bmlxdWVfcHRyPFQ+IGZpbmRPbmVDaGlsZCgpIGNvbnN0IHsKKyAgICBhdXRvIEVudW1lcmF0b3IoZmluZEFsbENoaWxkcmVuPFQ+KCkpOworICAgIGlmICghRW51bWVyYXRvcikKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBFbnVtZXJhdG9yLT5nZXROZXh0KCk7CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sPiBjbG9uZSgpIGNvbnN0OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGQ6OnVuaXF1ZV9wdHI8Q29uY3JldGVTeW1ib2xFbnVtZXJhdG9yPFQ+PiBmaW5kQWxsQ2hpbGRyZW4oKSBjb25zdCB7CisgICAgYXV0byBCYXNlSXRlciA9IFJhd1N5bWJvbC0+ZmluZENoaWxkcmVuKFQ6OlRhZyk7CisgICAgaWYgKCFCYXNlSXRlcikKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBsbHZtOjptYWtlX3VuaXF1ZTxDb25jcmV0ZVN5bWJvbEVudW1lcmF0b3I8VD4+KHN0ZDo6bW92ZShCYXNlSXRlcikpOworICB9CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+IGZpbmRBbGxDaGlsZHJlbihQREJfU3ltVHlwZSBUeXBlKSBjb25zdDsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4gZmluZEFsbENoaWxkcmVuKCkgY29uc3Q7CisKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgZmluZENoaWxkcmVuKFBEQl9TeW1UeXBlIFR5cGUsIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncykgY29uc3Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+IGZpbmRDaGlsZHJlbkJ5UlZBKFBEQl9TeW1UeXBlIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREJfTmFtZVNlYXJjaEZsYWdzIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSVkEpIGNvbnN0OworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPiBmaW5kSW5saW5lRnJhbWVzQnlSVkEodWludDMyX3QgUlZBKSBjb25zdDsKKworICBjb25zdCBJUERCUmF3U3ltYm9sICZnZXRSYXdTeW1ib2woKSBjb25zdCB7IHJldHVybiAqUmF3U3ltYm9sOyB9CisgIElQREJSYXdTeW1ib2wgJmdldFJhd1N5bWJvbCgpIHsgcmV0dXJuICpSYXdTeW1ib2w7IH0KKworICBjb25zdCBJUERCU2Vzc2lvbiAmZ2V0U2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIFNlc3Npb247IH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPiBnZXRDaGlsZFN0YXRzKFRhZ1N0YXRzICZTdGF0cykgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbD4gZ2V0U3ltYm9sQnlJZEhlbHBlcih1aW50MzJfdCBJZCkgY29uc3Q7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbmNyZXRlVHlwZT4KKyAgc3RkOjp1bmlxdWVfcHRyPENvbmNyZXRlVHlwZT4gZ2V0Q29uY3JldGVTeW1ib2xCeUlkSGVscGVyKHVpbnQzMl90IElkKSBjb25zdCB7CisgICAgcmV0dXJuIHVuaXF1ZV9keW5fY2FzdF9vcl9udWxsPENvbmNyZXRlVHlwZT4oZ2V0U3ltYm9sQnlJZEhlbHBlcihJZCkpOworICB9CisKKyAgY29uc3QgSVBEQlNlc3Npb24gJlNlc3Npb247CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCUmF3U3ltYm9sPiBSYXdTeW1ib2w7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbEFubm90YXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xBbm5vdGF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2OTE0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xBbm5vdGF0aW9uLmgKQEAgLTAsMCArMSwzOSBAQAorLy89PT0tIFBEQlN5bWJvbEFubm90YXRpb24uaCAtIEFjY2Vzc29ycyBmb3IgcXVlcnlpbmcgUERCIGFubm90YXRpb25zIC0tLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTEFOTk9UQVRJT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MQU5OT1RBVElPTl9ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbEFubm90YXRpb24gOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sQW5ub3RhdGlvbihjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6QW5ub3RhdGlvbikKKworICB2b2lkIGR1bXAoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBZGRyZXNzT2Zmc2V0KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QWRkcmVzc1NlY3Rpb24pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXREYXRhS2luZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFJlbGF0aXZlVmlydHVhbEFkZHJlc3MpCisgIC8vIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRWYWx1ZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFZpcnR1YWxBZGRyZXNzKQorfTsKK30KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xBTk5PVEFUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xCbG9jay5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbEJsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgxZGExZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xCbG9jay5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vPT09LSBQREJTeW1ib2xCbG9jay5oIC0gQWNjZXNzb3JzIGZvciBxdWVyeWluZyBQREIgYmxvY2tzIC0tLS0tLS0tLS0tLS0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xCTE9DS19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xCTE9DS19ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgUERCU3ltYm9sQmxvY2sgOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sQmxvY2soY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCUmF3U3ltYm9sPiBTeW1ib2wpOworCisgIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFBEQl9TeW1UeXBlOjpCbG9jaykKKworICB2b2lkIGR1bXAoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBZGRyZXNzT2Zmc2V0KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QWRkcmVzc1NlY3Rpb24pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRMZW5ndGgpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TG9jYXRpb25UeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TmFtZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFJlbGF0aXZlVmlydHVhbEFkZHJlc3MpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRWaXJ0dWFsQWRkcmVzcykKK307Cit9Cit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MQkxPQ0tfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbENvbXBpbGFuZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbENvbXBpbGFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDkwODkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sQ29tcGlsYW5kLmgKQEAgLTAsMCArMSw0MiBAQAorLy89PT0tIFBEQlN5bWJvbENvbXBpbGFuZC5oIC0gQWNjZXNzb3JzIGZvciBxdWVyeWluZyBQREIgY29tcGlsYW5kcyAtLS0tLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTENPTVBJTEFORF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xDT01QSUxBTkRfSAorCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xDb21waWxhbmQgOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sQ29tcGlsYW5kKGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IENvbXBpbGFuZFN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OkNvbXBpbGFuZCkKKworICB2b2lkIGR1bXAoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc0VkaXRBbmRDb250aW51ZUVuYWJsZWQpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TGlicmFyeU5hbWUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXROYW1lKQorCisgIHN0ZDo6c3RyaW5nIGdldFNvdXJjZUZpbGVOYW1lKCkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nIGdldFNvdXJjZUZpbGVGdWxsUGF0aCgpIGNvbnN0OworfTsKK30KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xDT01QSUxBTkRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbENvbXBpbGFuZERldGFpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xDb21waWxhbmREZXRhaWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhNTBjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xDb21waWxhbmREZXRhaWxzLmgKQEAgLTAsMCArMSw1NyBAQAorLy89PT0tIFBEQlN5bWJvbENvbXBpbGFuZERldGFpbHMuaCAtIFBEQiBjb21waWxhbmQgZGV0YWlscyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MQ09NUElMQU5EREVUQUlMU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xDT01QSUxBTkRERVRBSUxTX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgUERCU3ltYm9sQ29tcGlsYW5kRGV0YWlscyA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xDb21waWxhbmREZXRhaWxzKGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCUmF3U3ltYm9sPiBTeW1ib2wpOworCisgIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFBEQl9TeW1UeXBlOjpDb21waWxhbmREZXRhaWxzKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZXRGcm9udEVuZFZlcnNpb24oVmVyc2lvbkluZm8gJlZlcnNpb24pIGNvbnN0IHsKKyAgICBSYXdTeW1ib2wtPmdldEZyb250RW5kVmVyc2lvbihWZXJzaW9uKTsKKyAgfQorCisgIHZvaWQgZ2V0QmFja0VuZFZlcnNpb24oVmVyc2lvbkluZm8gJlZlcnNpb24pIGNvbnN0IHsKKyAgICBSYXdTeW1ib2wtPmdldEJhY2tFbmRWZXJzaW9uKFZlcnNpb24pOworICB9CisKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldENvbXBpbGVyTmFtZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzRWRpdEFuZENvbnRpbnVlRW5hYmxlZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0RlYnVnSW5mbykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc01hbmFnZWRDb2RlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzU2VjdXJpdHlDaGVja3MpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc0NWVENJTCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzRGF0YUFsaWduZWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc0hvdHBhdGNoYWJsZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzTFRDRykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzTVNJTE5ldG1vZHVsZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldExhbmd1YWdlKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0TGV4aWNhbFBhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFBsYXRmb3JtKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0U291cmNlRmlsZU5hbWUpCit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCRlVOQ1RJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbENvbXBpbGFuZEVudi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbENvbXBpbGFuZEVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NjhmMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sQ29tcGlsYW5kRW52LmgKQEAgLTAsMCArMSwzNyBAQAorLy89PT0tIFBEQlN5bWJvbENvbXBpbGFuZEVudi5oIC0gY29tcGlsYW5kIGVudmlyb25tZW50IHZhcmlhYmxlcyAqLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MQ09NUElMQU5ERU5WX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTENPTVBJTEFOREVOVl9ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBQREJTeW1ib2xDb21waWxhbmRFbnYgOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sQ29tcGlsYW5kRW52KGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OkNvbXBpbGFuZEVudikKKworICB2b2lkIGR1bXAoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TmFtZSkKKyAgc3RkOjpzdHJpbmcgZ2V0VmFsdWUoKSBjb25zdDsKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xDT01QSUxBTkRFTlZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbEN1c3RvbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbEN1c3RvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZjA4OTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sQ3VzdG9tLmgKQEAgLTAsMCArMSw0MCBAQAorLy89PT0tIFBEQlN5bWJvbEN1c3RvbS5oIC0gY29tcGlsZXItc3BlY2lmaWMgdHlwZXMgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MQ1VTVE9NX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTENVU1RPTV9ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBwZGIgeworLy8vIFBEQlN5bWJvbEN1c3RvbSByZXByZXNlbnRzIHN5bWJvbHMgdGhhdCBhcmUgY29tcGlsZXItc3BlY2lmaWMgYW5kIGRvIG5vdAorLy8vIGZpdCBhbnl3aGVyZSBlbHNlIGluIHRoZSBsZXhpY2FsIGhpZXJhcmNoeS4KKy8vLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2Q4OHNmMDloLmFzcHgKK2NsYXNzIFBEQlN5bWJvbEN1c3RvbSA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xDdXN0b20oY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gQ3VzdG9tU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6Q3VzdG9tKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZXREYXRhQnl0ZXMobGx2bTo6U21hbGxWZWN0b3I8dWludDhfdCwgMzI+ICZieXRlcyk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MQ1VTVE9NX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xEYXRhLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sRGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YjE0YmYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sRGF0YS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vPT09LSBQREJTeW1ib2xEYXRhLmggLSBQREIgZGF0YSAoZS5nLiB2YXJpYWJsZSkgYWNjZXNzb3JzIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTERBVEFfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MREFUQV9ICisKKyNpbmNsdWRlICJJUERCTGluZU51bWJlci5oIgorI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xEYXRhIDogcHVibGljIFBEQlN5bWJvbCB7CitwdWJsaWM6CisgIFBEQlN5bWJvbERhdGEoY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IERhdGFTeW1ib2wpOworCisgIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFBEQl9TeW1UeXBlOjpEYXRhKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEFjY2VzcykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEFkZHJlc3NPZmZzZXQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBZGRyZXNzU2VjdGlvbikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEFkZHJlc3NUYWtlbikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEJpdFBvc2l0aW9uKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0Q2xhc3NQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc0NvbXBpbGVyR2VuZXJhdGVkKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNDb25zdFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXREYXRhS2luZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzQWdncmVnYXRlZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzU3BsaXR0ZWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRMZW5ndGgpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TG9jYXRpb25UeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TmFtZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldE9mZnNldCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFJlZ2lzdGVySWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRSZWxhdGl2ZVZpcnR1YWxBZGRyZXNzKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0U2xvdCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFRva2VuKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0VHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVW5hbGlnbmVkVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFZhbHVlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VmlydHVhbEFkZHJlc3MpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1ZvbGF0aWxlVHlwZSkKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1MaW5lTnVtYmVycz4gZ2V0TGluZU51bWJlcnMoKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0Q29tcGlsYW5kSWQoKSBjb25zdDsKK307Cit9IC8vIG5hbWVzcGFjZSBwZGIKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xEQVRBX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xFeGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xFeGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzJkNzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbEV4ZS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8vPT09LSBQREJTeW1ib2xFeGUuaCAtIEFjY2Vzc29ycyBmb3IgcXVlcnlpbmcgZXhlY3V0YWJsZXMgaW4gYSBQREIgLS0tLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MRVhFX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTEVYRV9ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgUERCU3ltYm9sRXhlIDogcHVibGljIFBEQlN5bWJvbCB7CitwdWJsaWM6CisgIFBEQlN5bWJvbEV4ZShjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCUmF3U3ltYm9sPiBFeGVTeW1ib2wpOworCisgIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFBEQl9TeW1UeXBlOjpFeGUpCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QWdlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0R3VpZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0NUeXBlcykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc1ByaXZhdGVTeW1ib2xzKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TWFjaGluZVR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXROYW1lKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0U2lnbmF0dXJlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0U3ltYm9sc0ZpbGVOYW1lKQorCisgIHVpbnQzMl90IGdldFBvaW50ZXJCeXRlU2l6ZSgpIGNvbnN0OworCitwcml2YXRlOgorICB2b2lkIGR1bXBDaGlsZHJlbihyYXdfb3N0cmVhbSAmT1MsIFN0cmluZ1JlZiBMYWJlbCwgUERCX1N5bVR5cGUgQ2hpbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICBpbnQgSW5kZW50KSBjb25zdDsKK307Cit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MRVhFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xGdW5jLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sRnVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MDEzZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sRnVuYy5oCkBAIC0wLDAgKzEsODggQEAKKy8vPT09LSBQREJTeW1ib2xGdW5jLmggLSBjbGFzcyByZXByZXNlbnRpbmcgYSBmdW5jdGlvbiBpbnN0YW5jZSAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTEZVTkNfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MRlVOQ19ICisKKyNpbmNsdWRlICJJUERCTGluZU51bWJlci5oIgorI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlN5bWJvbFR5cGVGdW5jdGlvblNpZy5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xGdW5jIDogcHVibGljIFBEQlN5bWJvbCB7CitwdWJsaWM6CisgIFBEQlN5bWJvbEZ1bmMoY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IEZ1bmNTeW1ib2wpOworCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBpc0Rlc3RydWN0b3IoKSBjb25zdDsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1DaGlsZHJlbjxQREJTeW1ib2xEYXRhPj4gZ2V0QXJndW1lbnRzKCkgY29uc3Q7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OkZ1bmN0aW9uKQorCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBY2Nlc3MpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBZGRyZXNzT2Zmc2V0KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QWRkcmVzc1NlY3Rpb24pCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRDbGFzc1BhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzQ29tcGlsZXJHZW5lcmF0ZWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc0NvbnN0VHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0N1c3RvbUNhbGxpbmdDb252ZW50aW9uKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzRmFyUmV0dXJuKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzQWxsb2NhKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzRUgpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNFSGEpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNJbmxBc20pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNMb25nSnVtcCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc1NFSCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc1NlY3VyaXR5Q2hlY2tzKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzU2V0SnVtcCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0ludGVycnVwdFJldHVybikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzSW50cm9WaXJ0dWFsRnVuY3Rpb24pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNJbmxpbmVBdHRyaWJ1dGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc05ha2VkKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNTdGF0aWMpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRMZW5ndGgpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TG9jYWxCYXNlUG9pbnRlclJlZ2lzdGVySWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRMb2NhdGlvblR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXROYW1lKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzRnJhbWVQb2ludGVyKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzTm9JbmxpbmVBdHRyaWJ1dGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNOb1JldHVybkF0dHJpYnV0ZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVW5yZWFjaGVkKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0Tm9TdGFja09yZGVyaW5nKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzT3B0aW1pemVkQ29kZURlYnVnSW5mbykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzUHVyZVZpcnR1YWwpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRSZWxhdGl2ZVZpcnR1YWxBZGRyZXNzKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VG9rZW4pCisgIEZPUldBUkRfQ09OQ1JFVEVfU1lNQk9MX0lEX01FVEhPRF9XSVRIX05BTUUoUERCU3ltYm9sVHlwZUZ1bmN0aW9uU2lnLCBnZXRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNpZ25hdHVyZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVW5hbGlnbmVkVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFVuZGVjb3JhdGVkTmFtZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVmlydHVhbCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFZpcnR1YWxBZGRyZXNzKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VmlydHVhbEJhc2VPZmZzZXQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1ZvbGF0aWxlVHlwZSkKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1MaW5lTnVtYmVycz4gZ2V0TGluZU51bWJlcnMoKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0Q29tcGlsYW5kSWQoKSBjb25zdDsKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xGVU5DX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xGdW5jRGVidWdFbmQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xGdW5jRGVidWdFbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzQxYmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbEZ1bmNEZWJ1Z0VuZC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vPT09LSBQREJTeW1ib2xGdW5jRGVidWdFbmQuaCAtIGZ1bmN0aW9uIGVuZCBib3VuZHMgaW5mbyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTEZVTkNERUJVR0VORF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xGVU5DREVCVUdFTkRfSAorCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbEZ1bmNEZWJ1Z0VuZCA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xGdW5jRGVidWdFbmQoY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gRnVuY0RlYnVnRW5kU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6RnVuY0RlYnVnRW5kKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEFkZHJlc3NPZmZzZXQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBZGRyZXNzU2VjdGlvbikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0N1c3RvbUNhbGxpbmdDb252ZW50aW9uKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzRmFyUmV0dXJuKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzSW50ZXJydXB0UmV0dXJuKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNTdGF0aWMpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TG9jYXRpb25UeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzTm9JbmxpbmVBdHRyaWJ1dGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNOb1JldHVybkF0dHJpYnV0ZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVW5yZWFjaGVkKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0T2Zmc2V0KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzT3B0aW1pemVkQ29kZURlYnVnSW5mbykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFJlbGF0aXZlVmlydHVhbEFkZHJlc3MpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRWaXJ0dWFsQWRkcmVzcykKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xGVU5DREVCVUdFTkRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbEZ1bmNEZWJ1Z1N0YXJ0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sRnVuY0RlYnVnU3RhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzI5ODM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbEZ1bmNEZWJ1Z1N0YXJ0LmgKQEAgLTAsMCArMSw1MCBAQAorLy89PT0tIFBEQlN5bWJvbEZ1bmNEZWJ1Z1N0YXJ0LmggLSBmdW5jdGlvbiBzdGFydCBib3VuZHMgaW5mbyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MRlVOQ0RFQlVHU1RBUlRfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MRlVOQ0RFQlVHU1RBUlRfSAorCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xGdW5jRGVidWdTdGFydCA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xGdW5jRGVidWdTdGFydChjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IEZ1bmNEZWJ1Z1N0YXJ0U3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6RnVuY0RlYnVnU3RhcnQpCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QWRkcmVzc09mZnNldCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEFkZHJlc3NTZWN0aW9uKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzQ3VzdG9tQ2FsbGluZ0NvbnZlbnRpb24pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNGYXJSZXR1cm4pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNJbnRlcnJ1cHRSZXR1cm4pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1N0YXRpYykKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldExleGljYWxQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRMb2NhdGlvblR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNOb0lubGluZUF0dHJpYnV0ZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc05vUmV0dXJuQXR0cmlidXRlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNVbnJlYWNoZWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRPZmZzZXQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNPcHRpbWl6ZWRDb2RlRGVidWdJbmZvKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0UmVsYXRpdmVWaXJ0dWFsQWRkcmVzcykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFZpcnR1YWxBZGRyZXNzKQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTEZVTkNERUJVR1NUQVJUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xMYWJlbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbExhYmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiMWMyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xMYWJlbC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8vPT09LSBQREJTeW1ib2xMYWJlbC5oIC0gbGFiZWwgaW5mbyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTExBQkVMX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTExBQkVMX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgUERCU3ltYm9sTGFiZWwgOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sTGFiZWwoY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCUmF3U3ltYm9sPiBMYWJlbFN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OkxhYmVsKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEFkZHJlc3NPZmZzZXQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBZGRyZXNzU2VjdGlvbikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0N1c3RvbUNhbGxpbmdDb252ZW50aW9uKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzRmFyUmV0dXJuKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzSW50ZXJydXB0UmV0dXJuKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0TGV4aWNhbFBhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldExvY2F0aW9uVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldE5hbWUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNOb0lubGluZUF0dHJpYnV0ZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc05vUmV0dXJuQXR0cmlidXRlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNVbnJlYWNoZWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRPZmZzZXQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNPcHRpbWl6ZWRDb2RlRGVidWdJbmZvKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0UmVsYXRpdmVWaXJ0dWFsQWRkcmVzcykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFZpcnR1YWxBZGRyZXNzKQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTExBQkVMX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xQdWJsaWNTeW1ib2wuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xQdWJsaWNTeW1ib2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWU2ZWU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFB1YmxpY1N5bWJvbC5oCkBAIC0wLDAgKzEsNDggQEAKKy8vPT09LSBQREJTeW1ib2xQdWJsaWNTeW1ib2wuaCAtIHB1YmxpYyBzeW1ib2wgaW5mbyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFBVQkxJQ1NZTUJPTF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xQVUJMSUNTWU1CT0xfSAorCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xQdWJsaWNTeW1ib2wgOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sUHVibGljU3ltYm9sKGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFB1YmxpY1N5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OlB1YmxpY1N5bWJvbCkKKworICB2b2lkIGR1bXAoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBZGRyZXNzT2Zmc2V0KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QWRkcmVzc1NlY3Rpb24pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc0NvZGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc0Z1bmN0aW9uKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TGVuZ3RoKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0TGV4aWNhbFBhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldExvY2F0aW9uVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzTWFuYWdlZENvZGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc01TSUxDb2RlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TmFtZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFJlbGF0aXZlVmlydHVhbEFkZHJlc3MpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRWaXJ0dWFsQWRkcmVzcykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFVuZGVjb3JhdGVkTmFtZSkKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xQVUJMSUNTWU1CT0xfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFRodW5rLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVGh1bmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTRmYWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFRodW5rLmgKQEAgLTAsMCArMSw1NyBAQAorLy89PT0tIFBEQlN5bWJvbFRodW5rLmggLSBTdXBwb3J0IGZvciBxdWVyeWluZyBQREIgdGh1bmtzIC0tLS0tLS0tLS0tLS0tLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVEhVTktfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVEhVTktfSAorCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xUaHVuayA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xUaHVuayhjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFRodW5rU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6VGh1bmspCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QWNjZXNzKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QWRkcmVzc09mZnNldCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEFkZHJlc3NTZWN0aW9uKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0Q2xhc3NQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc0NvbnN0VHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzSW50cm9WaXJ0dWFsRnVuY3Rpb24pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1N0YXRpYykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldExlbmd0aCkKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldExleGljYWxQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXROYW1lKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNQdXJlVmlydHVhbCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFJlbGF0aXZlVmlydHVhbEFkZHJlc3MpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRUYXJnZXRPZmZzZXQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRUYXJnZXRSZWxhdGl2ZVZpcnR1YWxBZGRyZXNzKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VGFyZ2V0VmlydHVhbEFkZHJlc3MpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRUYXJnZXRTZWN0aW9uKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VGh1bmtPcmRpbmFsKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0VHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVW5hbGlnbmVkVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVmlydHVhbCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFZpcnR1YWxBZGRyZXNzKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VmlydHVhbEJhc2VPZmZzZXQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1ZvbGF0aWxlVHlwZSkKK307Cit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVEhVTktfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVBcnJheS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVBcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YjdkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZUFycmF5LmgKQEAgLTAsMCArMSw0NSBAQAorLy89PT0tIFBEQlN5bWJvbFR5cGVBcnJheS5oIC0gYXJyYXkgdHlwZSBpbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRUFSUkFZX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVBUlJBWV9ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbFR5cGVBcnJheSA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xUeXBlQXJyYXkoY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gQXJyYXlUeXBlU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6QXJyYXlUeXBlKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZHVtcFJpZ2h0KFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0QXJyYXlJbmRleFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc0NvbnN0VHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldENvdW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TGVuZ3RoKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0TGV4aWNhbFBhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFJhbmspCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRF9XSVRIX05BTUUoZ2V0VHlwZSwgZ2V0RWxlbWVudFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1VuYWxpZ25lZFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1ZvbGF0aWxlVHlwZSkKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFQVJSQVlfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVCYXNlQ2xhc3MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlQmFzZUNsYXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwN2EzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlQmFzZUNsYXNzLmgKQEAgLTAsMCArMSw2NCBAQAorLy89PT0tIFBEQlN5bWJvbFR5cGVCYXNlQ2xhc3MuaCAtIGJhc2UgY2xhc3MgdHlwZSBpbmZvcm1hdGlvbiAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRUJBU0VDTEFTU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFQkFTRUNMQVNTX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZVZUYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlVlRhYmxlU2hhcGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xUeXBlQmFzZUNsYXNzIDogcHVibGljIFBEQlN5bWJvbCB7CitwdWJsaWM6CisgIFBEQlN5bWJvbFR5cGVCYXNlQ2xhc3MoY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OkJhc2VDbGFzcykKKworICB2b2lkIGR1bXAoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBY2Nlc3MpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRDbGFzc1BhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0NvbnN0cnVjdG9yKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNDb25zdFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNBc3NpZ25tZW50T3BlcmF0b3IpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNDYXN0T3BlcmF0b3IpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNOZXN0ZWRUeXBlcykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzSW5kaXJlY3RWaXJ0dWFsQmFzZUNsYXNzKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TGVuZ3RoKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0TGV4aWNhbFBhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldE5hbWUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc05lc3RlZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldE9mZnNldCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc092ZXJsb2FkZWRPcGVyYXRvcikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzUGFja2VkKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNTY29wZWQpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VWR0S2luZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVW5hbGlnbmVkVHlwZSkKKworICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNWaXJ0dWFsQmFzZUNsYXNzKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VmlydHVhbEJhc2VEaXNwSW5kZXgpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRWaXJ0dWFsQmFzZVBvaW50ZXJPZmZzZXQpCisgIC8vIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRWaXJ0dWFsQmFzZVRhYmxlVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldFZpcnR1YWxUYWJsZVNoYXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNWb2xhdGlsZVR5cGUpCit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRUJBU0VDTEFTU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZUJ1aWx0aW4uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlQnVpbHRpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMTg2M2MKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZUJ1aWx0aW4uaApAQCAtMCwwICsxLDQxIEBACisvLz09PS0gUERCU3ltYm9sVHlwZUJ1aWx0aW4uaCAtIGJ1aWx0aW4gdHlwZSBpbmZvcm1hdGlvbiAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFQlVJTFRJTl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFQlVJTFRJTl9ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbFR5cGVCdWlsdGluIDogcHVibGljIFBEQlN5bWJvbCB7CitwdWJsaWM6CisgIFBEQlN5bWJvbFR5cGVCdWlsdGluKGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6QnVpbHRpblR5cGUpCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QnVpbHRpblR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc0NvbnN0VHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldExlbmd0aCkKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldExleGljYWxQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1VuYWxpZ25lZFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1ZvbGF0aWxlVHlwZSkKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFQlVJTFRJTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZUN1c3RvbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVDdXN0b20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTliM2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVDdXN0b20uaApAQCAtMCwwICsxLDM3IEBACisvLz09PS0gUERCU3ltYm9sVHlwZUN1c3RvbS5oIC0gY3VzdG9tIGNvbXBpbGVyIHR5cGUgaW5mb3JtYXRpb24gLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFQ1VTVE9NX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVDVVNUT01fSAorCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xUeXBlQ3VzdG9tIDogcHVibGljIFBEQlN5bWJvbCB7CitwdWJsaWM6CisgIFBEQlN5bWJvbFR5cGVDdXN0b20oY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OkN1c3RvbVR5cGUpCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0T2VtSWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRPZW1TeW1ib2xJZCkKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFQ1VTVE9NX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlRGltZW5zaW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZURpbWVuc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MzVlYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZURpbWVuc2lvbi5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vPT09LSBQREJTeW1ib2xUeXBlRGltZW5zaW9uLmggLSBhcnJheSBkaW1lbnNpb24gdHlwZSBpbmZvIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVESU1FTlNJT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRURJTUVOU0lPTl9ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbFR5cGVEaW1lbnNpb24gOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sVHlwZURpbWVuc2lvbihjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6RGltZW5zaW9uKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldExvd2VyQm91bmRJZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFVwcGVyQm91bmRJZCkKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFRElNRU5TSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlRW51bS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVFbnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiZTdlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlRW51bS5oCkBAIC0wLDAgKzEsNTYgQEAKKy8vPT09LSBQREJTeW1ib2xUeXBlRW51bS5oIC0gZW51bSB0eXBlIGluZm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVFTlVNX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVFTlVNX0gKKworI2luY2x1ZGUgIklQREJMaW5lTnVtYmVyLmgiCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCU3ltYm9sVHlwZUJ1aWx0aW4uaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbFR5cGVFbnVtIDogcHVibGljIFBEQlN5bWJvbCB7CitwdWJsaWM6CisgIFBEQlN5bWJvbFR5cGVFbnVtKGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gRW51bVR5cGVTeW1ib2wpOworCisgIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFBEQl9TeW1UeXBlOjpFbnVtKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEJ1aWx0aW5UeXBlKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0Q2xhc3NQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNDb25zdHJ1Y3RvcikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzQ29uc3RUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzQXNzaWdubWVudE9wZXJhdG9yKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzQ2FzdE9wZXJhdG9yKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzTmVzdGVkVHlwZXMpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRMZW5ndGgpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TmFtZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFNyY0xpbmVPblR5cGVEZWZuKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNOZXN0ZWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNPdmVybG9hZGVkT3BlcmF0b3IpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1BhY2tlZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzU2NvcGVkKQorICBGT1JXQVJEX0NPTkNSRVRFX1NZTUJPTF9JRF9NRVRIT0RfV0lUSF9OQU1FKFBEQlN5bWJvbFR5cGVCdWlsdGluLCBnZXRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFVuZGVybHlpbmdUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNVbmFsaWduZWRUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNWb2xhdGlsZVR5cGUpCit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRUVOVU1fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVGcmllbmQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlRnJpZW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjMTMxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlRnJpZW5kLmgKQEAgLTAsMCArMSwzOCBAQAorLy89PT0tIFBEQlN5bWJvbFR5cGVGcmllbmQuaCAtIGZyaWVuZCB0eXBlIGluZm8gLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRUZSSUVORF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFRlJJRU5EX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgUERCU3ltYm9sVHlwZUZyaWVuZCA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xUeXBlRnJpZW5kKGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCUmF3U3ltYm9sPiBTeW1ib2wpOworCisgIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFBEQl9TeW1UeXBlOjpGcmllbmQpCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0Q2xhc3NQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXROYW1lKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0VHlwZSkKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFRlJJRU5EX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlRnVuY3Rpb25BcmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlRnVuY3Rpb25BcmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODU1OTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVGdW5jdGlvbkFyZy5oCkBAIC0wLDAgKzEsMzggQEAKKy8vPT09LSBQREJTeW1ib2xUeXBlRnVuY3Rpb25BcmcuaCAtIGZ1bmN0aW9uIGFyZyB0eXBlIGluZm8gLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVGVU5DVElPTkFSR19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFRlVOQ1RJT05BUkdfSAorCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xUeXBlRnVuY3Rpb25BcmcgOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sVHlwZUZ1bmN0aW9uQXJnKGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OkZ1bmN0aW9uQXJnKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldENsYXNzUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0TGV4aWNhbFBhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldFR5cGUpCit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRUZVTkNUSU9OQVJHX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlRnVuY3Rpb25TaWcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlRnVuY3Rpb25TaWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmQ0Y2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVGdW5jdGlvblNpZy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vPT09LSBQREJTeW1ib2xUeXBlRnVuY3Rpb25TaWcuaCAtIGZ1bmN0aW9uIHNpZ25hdHVyZSB0eXBlIGluZm8gKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVGVU5DVElPTlNJR19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFRlVOQ1RJT05TSUdfSAorCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xUeXBlRnVuY3Rpb25TaWcgOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sVHlwZUZ1bmN0aW9uU2lnKGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OkZ1bmN0aW9uU2lnKQorCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+IGdldEFyZ3VtZW50cygpIGNvbnN0OworCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZHVtcFJpZ2h0KFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBkdW1wQXJnTGlzdChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIGJvb2wgaXNDVmFyQXJncygpIGNvbnN0OworCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRDYWxsaW5nQ29udmVudGlvbikKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldENsYXNzUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0VW5tb2RpZmllZFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc0NvbnN0VHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldENvdW50KQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0TGV4aWNhbFBhcmVudCkKKyAgLy8gRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldE9iamVjdFBvaW50ZXJUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VGhpc0FkanVzdCkKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EX1dJVEhfTkFNRShnZXRUeXBlLCBnZXRSZXR1cm5UeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNVbmFsaWduZWRUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNWb2xhdGlsZVR5cGUpCit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRUZVTkNUSU9OU0lHX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlTWFuYWdlZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVNYW5hZ2VkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjZjUzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlTWFuYWdlZC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8vPT09LSBQREJTeW1ib2xUeXBlTWFuYWdlZC5oIC0gbWFuYWdlZCB0eXBlIGluZm8gLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVNQU5BR0VEX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVNQU5BR0VEX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgUERCU3ltYm9sVHlwZU1hbmFnZWQgOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sVHlwZU1hbmFnZWQoY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCUmF3U3ltYm9sPiBTeW1ib2wpOworCisgIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFBEQl9TeW1UeXBlOjpNYW5hZ2VkVHlwZSkKKworICB2b2lkIGR1bXAoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXROYW1lKQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVNQU5BR0VEX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlUG9pbnRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVQb2ludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxMmViYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlUG9pbnRlci5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vPT09LSBQREJTeW1ib2xUeXBlUG9pbnRlci5oIC0gcG9pbnRlciB0eXBlIGluZm8gLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVQT0lOVEVSX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVQT0lOVEVSX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgUERCU3ltYm9sVHlwZVBvaW50ZXIgOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sVHlwZVBvaW50ZXIoY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCUmF3U3ltYm9sPiBTeW1ib2wpOworCisgIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFBEQl9TeW1UeXBlOjpQb2ludGVyVHlwZSkKKworICB2b2lkIGR1bXAoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIGR1bXBSaWdodChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzQ29uc3RUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TGVuZ3RoKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0TGV4aWNhbFBhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzUmVmZXJlbmNlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNSVmFsdWVSZWZlcmVuY2UpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1BvaW50ZXJUb0RhdGFNZW1iZXIpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1BvaW50ZXJUb01lbWJlckZ1bmN0aW9uKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0RfV0lUSF9OQU1FKGdldFR5cGUsIGdldFBvaW50ZWVUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNSZXN0cmljdGVkVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVW5hbGlnbmVkVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVm9sYXRpbGVUeXBlKQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVQT0lOVEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlVHlwZWRlZi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVUeXBlZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjMWQxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlVHlwZWRlZi5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vPT09LSBQREJTeW1ib2xUeXBlVHlwZWRlZi5oIC0gdHlwZWRlZiB0eXBlIGluZm8gLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVUWVBFREVGX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVUWVBFREVGX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgUERCU3ltYm9sVHlwZVR5cGVkZWYgOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sVHlwZVR5cGVkZWYoY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCUmF3U3ltYm9sPiBTeW1ib2wpOworCisgIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFBEQl9TeW1UeXBlOjpUeXBlZGVmKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEJ1aWx0aW5UeXBlKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0Q2xhc3NQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNDb25zdHJ1Y3RvcikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzQ29uc3RUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzQXNzaWdubWVudE9wZXJhdG9yKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzQ2FzdE9wZXJhdG9yKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzTmVzdGVkVHlwZXMpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRMZW5ndGgpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TmFtZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzTmVzdGVkKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzT3ZlcmxvYWRlZE9wZXJhdG9yKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNQYWNrZWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1JlZmVyZW5jZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzU2NvcGVkKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0VHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFVkdEtpbmQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1VuYWxpZ25lZFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRWaXJ0dWFsVGFibGVTaGFwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVm9sYXRpbGVUeXBlKQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVUWVBFREVGX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlVURULmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZVVEVC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNTliNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZVVEVC5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vPT09LSBQREJTeW1ib2xUeXBlVURULmggLSBVRFQgdHlwZSBpbmZvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVVRFRfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRVVEVF9ICisKKyNpbmNsdWRlICJJUERCTGluZU51bWJlci5oIgorI2luY2x1ZGUgIklQREJTZXNzaW9uLmgiCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCU3ltYm9sVHlwZUJhc2VDbGFzcy5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xUeXBlVURUIDogcHVibGljIFBEQlN5bWJvbCB7CitwdWJsaWM6CisgIFBEQlN5bWJvbFR5cGVVRFQoY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFVEVFN5bWJvbCk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbFR5cGVVRFQ+IGNsb25lKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTZXNzaW9uKCkuZ2V0Q29uY3JldGVTeW1ib2xCeUlkPFBEQlN5bWJvbFR5cGVVRFQ+KAorICAgICAgICBnZXRTeW1JbmRleElkKCkpOworICB9CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OlVEVCkKKworICB2b2lkIGR1bXAoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRDbGFzc1BhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldFVubW9kaWZpZWRUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzQ29uc3RydWN0b3IpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc0NvbnN0VHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0Fzc2lnbm1lbnRPcGVyYXRvcikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0Nhc3RPcGVyYXRvcikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc05lc3RlZFR5cGVzKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TGVuZ3RoKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0TGV4aWNhbFBhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldE5hbWUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRTcmNMaW5lT25UeXBlRGVmbikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzTmVzdGVkKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzT3ZlcmxvYWRlZE9wZXJhdG9yKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNQYWNrZWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1Njb3BlZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFVkdEtpbmQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1VuYWxpZ25lZFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRWaXJ0dWFsVGFibGVTaGFwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVm9sYXRpbGVUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QWNjZXNzKQorfTsKK30KK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFVURUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlVlRhYmxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZVZUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNzBjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZVZUYWJsZS5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vPT09LSBQREJTeW1ib2xUeXBlVlRhYmxlLmggLSBWVGFibGUgdHlwZSBpbmZvIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVWVEFCTEVfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRVZUQUJMRV9ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbFR5cGVWVGFibGUgOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sVHlwZVZUYWJsZShjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gVnRibFN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OlZUYWJsZSkKKworICB2b2lkIGR1bXAoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRDbGFzc1BhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldE9mZnNldCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzQ29uc3RUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0TGV4aWNhbFBhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1VuYWxpZ25lZFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1ZvbGF0aWxlVHlwZSkKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFVlRBQkxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlVlRhYmxlU2hhcGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlVlRhYmxlU2hhcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWNhYWJlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVWVGFibGVTaGFwZS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09LSBQREJTeW1ib2xUeXBlVlRhYmxlU2hhcGUuaCAtIFZUYWJsZSBzaGFwZSBpbmZvIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVWVEFCTEVTSEFQRV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFVlRBQkxFU0hBUEVfSAorCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xUeXBlVlRhYmxlU2hhcGUgOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sVHlwZVZUYWJsZVNoYXBlKGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFZ0YmxTaGFwZVN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OlZUYWJsZVNoYXBlKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzQ29uc3RUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0Q291bnQpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNVbmFsaWduZWRUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNWb2xhdGlsZVR5cGUpCit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRVZUQUJMRVNIQVBFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xVbmtub3duLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVW5rbm93bi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNDNlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVW5rbm93bi5oCkBAIC0wLDAgKzEsMzYgQEAKKy8vPT09LSBQREJTeW1ib2xVbmtub3duLmggLSB1bmtub3duIHN5bWJvbCB0eXBlIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFVOS05PV05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVU5LTk9XTl9ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xVbmtub3duIDogcHVibGljIFBEQlN5bWJvbCB7CitwdWJsaWM6CisgIFBEQlN5bWJvbFVua25vd24oY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFVua25vd25TeW1ib2wpOworCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBQREJTeW1ib2wgKlMpIHsKKyAgICByZXR1cm4gKFMtPmdldFN5bVRhZygpID09IFBEQl9TeW1UeXBlOjpOb25lIHx8CisgICAgICAgICAgICBTLT5nZXRTeW1UYWcoKSA+PSBQREJfU3ltVHlwZTo6TWF4KTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFVOS05PV05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFVzaW5nTmFtZXNwYWNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVXNpbmdOYW1lc3BhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGZiZDViCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFVzaW5nTmFtZXNwYWNlLmgKQEAgLTAsMCArMSwzNyBAQAorLy89PT0tIFBEQlN5bWJvbFVzaW5nTmFtZXNwYWNlLmggLSB1c2luZyBuYW1lc3BhY2UgaW5mbyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVVNJTkdOQU1FU1BBQ0VfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVVNJTkdOQU1FU1BBQ0VfSAorCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xVc2luZ05hbWVzcGFjZSA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xVc2luZ05hbWVzcGFjZShjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OlVzaW5nTmFtZXNwYWNlKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldExleGljYWxQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXROYW1lKQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFVTSU5HTkFNRVNQQUNFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJUeXBlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2MjMzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJUeXBlcy5oCkBAIC0wLDAgKzEsNDA4IEBACisvLz09PS0gUERCVHlwZXMuaCAtIERlZmluZXMgZW51bXMgZm9yIHZhcmlvdXMgZmllbGRzIGNvbnRhaW5lZCBpbiBQREIgLS0tLT09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJUWVBFU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJUWVBFU19ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCRW51bUNoaWxkcmVuLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdUeXBlcy5oIgorI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgSVBEQkRhdGFTdHJlYW07CitjbGFzcyBJUERCSW5qZWN0ZWRTb3VyY2U7CitjbGFzcyBJUERCTGluZU51bWJlcjsKK2NsYXNzIElQREJTZWN0aW9uQ29udHJpYjsKK2NsYXNzIElQREJTb3VyY2VGaWxlOworY2xhc3MgSVBEQlRhYmxlOworY2xhc3MgUERCU3ltRHVtcGVyOworY2xhc3MgUERCU3ltYm9sOworY2xhc3MgUERCU3ltYm9sRXhlOworY2xhc3MgUERCU3ltYm9sQ29tcGlsYW5kOworY2xhc3MgUERCU3ltYm9sQ29tcGlsYW5kRGV0YWlsczsKK2NsYXNzIFBEQlN5bWJvbENvbXBpbGFuZEVudjsKK2NsYXNzIFBEQlN5bWJvbEZ1bmM7CitjbGFzcyBQREJTeW1ib2xCbG9jazsKK2NsYXNzIFBEQlN5bWJvbERhdGE7CitjbGFzcyBQREJTeW1ib2xBbm5vdGF0aW9uOworY2xhc3MgUERCU3ltYm9sTGFiZWw7CitjbGFzcyBQREJTeW1ib2xQdWJsaWNTeW1ib2w7CitjbGFzcyBQREJTeW1ib2xUeXBlVURUOworY2xhc3MgUERCU3ltYm9sVHlwZUVudW07CitjbGFzcyBQREJTeW1ib2xUeXBlRnVuY3Rpb25TaWc7CitjbGFzcyBQREJTeW1ib2xUeXBlUG9pbnRlcjsKK2NsYXNzIFBEQlN5bWJvbFR5cGVBcnJheTsKK2NsYXNzIFBEQlN5bWJvbFR5cGVCdWlsdGluOworY2xhc3MgUERCU3ltYm9sVHlwZVR5cGVkZWY7CitjbGFzcyBQREJTeW1ib2xUeXBlQmFzZUNsYXNzOworY2xhc3MgUERCU3ltYm9sVHlwZUZyaWVuZDsKK2NsYXNzIFBEQlN5bWJvbFR5cGVGdW5jdGlvbkFyZzsKK2NsYXNzIFBEQlN5bWJvbEZ1bmNEZWJ1Z1N0YXJ0OworY2xhc3MgUERCU3ltYm9sRnVuY0RlYnVnRW5kOworY2xhc3MgUERCU3ltYm9sVXNpbmdOYW1lc3BhY2U7CitjbGFzcyBQREJTeW1ib2xUeXBlVlRhYmxlU2hhcGU7CitjbGFzcyBQREJTeW1ib2xUeXBlVlRhYmxlOworY2xhc3MgUERCU3ltYm9sQ3VzdG9tOworY2xhc3MgUERCU3ltYm9sVGh1bms7CitjbGFzcyBQREJTeW1ib2xUeXBlQ3VzdG9tOworY2xhc3MgUERCU3ltYm9sVHlwZU1hbmFnZWQ7CitjbGFzcyBQREJTeW1ib2xUeXBlRGltZW5zaW9uOworY2xhc3MgUERCU3ltYm9sVW5rbm93bjsKKwordXNpbmcgSVBEQkVudW1TeW1ib2xzID0gSVBEQkVudW1DaGlsZHJlbjxQREJTeW1ib2w+OwordXNpbmcgSVBEQkVudW1Tb3VyY2VGaWxlcyA9IElQREJFbnVtQ2hpbGRyZW48SVBEQlNvdXJjZUZpbGU+OwordXNpbmcgSVBEQkVudW1EYXRhU3RyZWFtcyA9IElQREJFbnVtQ2hpbGRyZW48SVBEQkRhdGFTdHJlYW0+OwordXNpbmcgSVBEQkVudW1MaW5lTnVtYmVycyA9IElQREJFbnVtQ2hpbGRyZW48SVBEQkxpbmVOdW1iZXI+OwordXNpbmcgSVBEQkVudW1UYWJsZXMgPSBJUERCRW51bUNoaWxkcmVuPElQREJUYWJsZT47Cit1c2luZyBJUERCRW51bUluamVjdGVkU291cmNlcyA9IElQREJFbnVtQ2hpbGRyZW48SVBEQkluamVjdGVkU291cmNlPjsKK3VzaW5nIElQREJFbnVtU2VjdGlvbkNvbnRyaWJzID0gSVBEQkVudW1DaGlsZHJlbjxJUERCU2VjdGlvbkNvbnRyaWI+OworCisvLy8gU3BlY2lmaWVzIHdoaWNoIFBEQiByZWFkZXIgaW1wbGVtZW50YXRpb24gaXMgdG8gYmUgdXNlZC4gIE9ubHkgYSB2YWx1ZQorLy8vIG9mIFBEQl9SZWFkZXJUeXBlOjpESUEgaXMgY3VycmVudGx5IHN1cHBvcnRlZCwgYnV0IE5hdGl2ZSBpcyBpbiB0aGUgd29ya3MuCitlbnVtIGNsYXNzIFBEQl9SZWFkZXJUeXBlIHsKKyAgRElBID0gMCwKKyAgTmF0aXZlID0gMSwKK307CisKKy8vLyBBbiBlbnVtZXJhdGlvbiBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGRhdGEgY29udGFpbmVkIGluIHRoaXMgdGFibGUuCitlbnVtIGNsYXNzIFBEQl9UYWJsZVR5cGUgeworICBUYWJsZUludmFsaWQgPSAwLAorICBTeW1ib2xzLAorICBTb3VyY2VGaWxlcywKKyAgTGluZU51bWJlcnMsCisgIFNlY3Rpb25Db250cmlicywKKyAgU2VnbWVudHMsCisgIEluamVjdGVkU291cmNlcywKKyAgRnJhbWVEYXRhLAorICBJbnB1dEFzc2VtYmx5RmlsZXMsCisgIERiZworfTsKKworLy8vIERlZmluZXMgZmxhZ3MgdXNlZCBmb3IgZW51bWVyYXRpbmcgY2hpbGQgc3ltYm9scy4gIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlCisvLy8gTmFtZVNlYXJjaE9wdGlvbnMgZW51bWVyYXRpb24gd2hpY2ggaXMgZG9jdW1lbnRlZCBoZXJlOgorLy8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkveWF0MjhhZHMuYXNweAorZW51bSBQREJfTmFtZVNlYXJjaEZsYWdzIHsKKyAgTlNfRGVmYXVsdCA9IDB4MCwKKyAgTlNfQ2FzZVNlbnNpdGl2ZSA9IDB4MSwKKyAgTlNfQ2FzZUluc2Vuc2l0aXZlID0gMHgyLAorICBOU19GaWxlTmFtZUV4dE1hdGNoID0gMHg0LAorICBOU19SZWdleCA9IDB4OCwKKyAgTlNfVW5kZWNvcmF0ZWROYW1lID0gMHgxMCwKKworICAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAgTlNfQ2FzZUluRmlsZU5hbWVFeHQgPSBOU19DYXNlSW5zZW5zaXRpdmUgfCBOU19GaWxlTmFtZUV4dE1hdGNoLAorICBOU19DYXNlUmVnZXggPSBOU19SZWdleCB8IE5TX0Nhc2VTZW5zaXRpdmUsCisgIE5TX0Nhc2VJblJleCA9IE5TX1JlZ2V4IHwgTlNfQ2FzZUluc2Vuc2l0aXZlCit9OworCisvLy8gU3BlY2lmaWVzIHRoZSBoYXNoIGFsZ29yaXRobSB0aGF0IGEgc291cmNlIGZpbGUgZnJvbSBhIFBEQiB3YXMgaGFzaGVkIHdpdGguCisvLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgQ1ZfU291cmNlQ2hrc3VtX3QgZW51bWVyYXRpb24gYW5kIGFyZSBkb2N1bWVudGVkCisvLy8gaGVyZTogaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9lOTZhejIxeC5hc3B4CitlbnVtIGNsYXNzIFBEQl9DaGVja3N1bSB7IE5vbmUgPSAwLCBNRDUgPSAxLCBTSEExID0gMiB9OworCisvLy8gVGhlc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIENWX0NQVV9UWVBFX2UgZW51bWVyYXRpb24sIGFuZCBhcmUgZG9jdW1lbnRlZAorLy8vIGhlcmU6IGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYjJmYzY0ZWsuYXNweAordXNpbmcgUERCX0NwdSA9IGNvZGV2aWV3OjpDUFVUeXBlOworCitlbnVtIGNsYXNzIFBEQl9NYWNoaW5lIHsKKyAgSW52YWxpZCA9IDB4ZmZmZiwKKyAgVW5rbm93biA9IDB4MCwKKyAgQW0zMyA9IDB4MTMsCisgIEFtZDY0ID0gMHg4NjY0LAorICBBcm0gPSAweDFDMCwKKyAgQXJtTlQgPSAweDFDNCwKKyAgRWJjID0gMHhFQkMsCisgIHg4NiA9IDB4MTRDLAorICBJYTY0ID0gMHgyMDAsCisgIE0zMlIgPSAweDkwNDEsCisgIE1pcHMxNiA9IDB4MjY2LAorICBNaXBzRnB1ID0gMHgzNjYsCisgIE1pcHNGcHUxNiA9IDB4NDY2LAorICBQb3dlclBDID0gMHgxRjAsCisgIFBvd2VyUENGUCA9IDB4MUYxLAorICBSNDAwMCA9IDB4MTY2LAorICBTSDMgPSAweDFBMiwKKyAgU0gzRFNQID0gMHgxQTMsCisgIFNINCA9IDB4MUE2LAorICBTSDUgPSAweDFBOCwKKyAgVGh1bWIgPSAweDFDMiwKKyAgV2NlTWlwc1YyID0gMHgxNjkKK307CisKK2VudW0gY2xhc3MgUERCX1NvdXJjZUNvbXByZXNzaW9uIHsKKyAgTm9uZSwKKyAgUnVuTGVuZ3RoRW5jb2RlZCwKKyAgSHVmZm1hbiwKKyAgTFosCit9OworCisvLy8gVGhlc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIENWX2NhbGxfZSBlbnVtZXJhdGlvbiwgYW5kIGFyZSBkb2N1bWVudGVkCisvLy8gYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisvLy8gICBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2IyZmM2NGVrLmFzcHgKKy8vLyAgIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL21zNjgwMjA3KHY9dnMuODUpLmFzcHgKK3VzaW5nIFBEQl9DYWxsaW5nQ29udiA9IGNvZGV2aWV3OjpDYWxsaW5nQ29udmVudGlvbjsKKworLy8vIFRoZXNlIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBDVl9DRkxfTEFORyBlbnVtZXJhdGlvbiwgYW5kIGFyZSBkb2N1bWVudGVkCisvLy8gaGVyZTogaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9idzNhZWt3Ni5hc3B4Cit1c2luZyBQREJfTGFuZyA9IGNvZGV2aWV3OjpTb3VyY2VMYW5ndWFnZTsKKworLy8vIFRoZXNlIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBEYXRhS2luZCBlbnVtZXJhdGlvbiwgYW5kIGFyZSBkb2N1bWVudGVkCisvLy8gaGVyZTogaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9iMngydDMxMy5hc3B4CitlbnVtIGNsYXNzIFBEQl9EYXRhS2luZCB7CisgIFVua25vd24sCisgIExvY2FsLAorICBTdGF0aWNMb2NhbCwKKyAgUGFyYW0sCisgIE9iamVjdFB0ciwKKyAgRmlsZVN0YXRpYywKKyAgR2xvYmFsLAorICBNZW1iZXIsCisgIFN0YXRpY01lbWJlciwKKyAgQ29uc3RhbnQKK307CisKKy8vLyBUaGVzZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgU3ltVGFnRW51bSBlbnVtZXJhdGlvbiwgYW5kIGFyZSBkb2N1bWVudGVkCisvLy8gaGVyZTogaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9ia2Vkc3M1Zi5hc3B4CitlbnVtIGNsYXNzIFBEQl9TeW1UeXBlIHsKKyAgTm9uZSwKKyAgRXhlLAorICBDb21waWxhbmQsCisgIENvbXBpbGFuZERldGFpbHMsCisgIENvbXBpbGFuZEVudiwKKyAgRnVuY3Rpb24sCisgIEJsb2NrLAorICBEYXRhLAorICBBbm5vdGF0aW9uLAorICBMYWJlbCwKKyAgUHVibGljU3ltYm9sLAorICBVRFQsCisgIEVudW0sCisgIEZ1bmN0aW9uU2lnLAorICBQb2ludGVyVHlwZSwKKyAgQXJyYXlUeXBlLAorICBCdWlsdGluVHlwZSwKKyAgVHlwZWRlZiwKKyAgQmFzZUNsYXNzLAorICBGcmllbmQsCisgIEZ1bmN0aW9uQXJnLAorICBGdW5jRGVidWdTdGFydCwKKyAgRnVuY0RlYnVnRW5kLAorICBVc2luZ05hbWVzcGFjZSwKKyAgVlRhYmxlU2hhcGUsCisgIFZUYWJsZSwKKyAgQ3VzdG9tLAorICBUaHVuaywKKyAgQ3VzdG9tVHlwZSwKKyAgTWFuYWdlZFR5cGUsCisgIERpbWVuc2lvbiwKKyAgTWF4Cit9OworCisvLy8gVGhlc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIExvY2F0aW9uVHlwZSBlbnVtZXJhdGlvbiwgYW5kIGFyZSBkb2N1bWVudGVkCisvLy8gaGVyZTogaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9mNTdrYWV6My5hc3B4CitlbnVtIGNsYXNzIFBEQl9Mb2NUeXBlIHsKKyAgTnVsbCwKKyAgU3RhdGljLAorICBUTFMsCisgIFJlZ1JlbCwKKyAgVGhpc1JlbCwKKyAgRW5yZWdpc3RlcmVkLAorICBCaXRGaWVsZCwKKyAgU2xvdCwKKyAgSWxSZWwsCisgIE1ldGFEYXRhLAorICBDb25zdGFudCwKKyAgTWF4Cit9OworCisvLy8gVGhlc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIFVkdEtpbmQgZW51bWVyYXRpb24sIGFuZCBhcmUgZG9jdW1lbnRlZAorLy8vIGhlcmU6IGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2NzdGs2NnQuYXNweAorZW51bSBjbGFzcyBQREJfVWR0VHlwZSB7IFN0cnVjdCwgQ2xhc3MsIFVuaW9uLCBJbnRlcmZhY2UgfTsKKworLy8vIFRoZXNlIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBTdGFja0ZyYW1lVHlwZUVudW0gZW51bWVyYXRpb24sIGFuZCBhcmUKKy8vLyBkb2N1bWVudGVkIGhlcmU6IGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYmM1MjA3eHcuYXNweC4KK2VudW0gY2xhc3MgUERCX1N0YWNrRnJhbWVUeXBlIHsgRlBPLCBLZXJuZWxUcmFwLCBLZXJuZWxUU1MsIEVCUCwgRnJhbWVEYXRhIH07CisKKy8vLyBUaGVzZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgU3RhY2tGcmFtZVR5cGVFbnVtIGVudW1lcmF0aW9uLCBhbmQgYXJlCisvLy8gZG9jdW1lbnRlZCBoZXJlOiBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2JjNTIwN3h3LmFzcHguCitlbnVtIGNsYXNzIFBEQl9NZW1vcnlUeXBlIHsgQ29kZSwgRGF0YSwgU3RhY2ssIEhlYXBDb2RlIH07CisKKy8vLyBUaGVzZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgQmFzaWN0eXBlIGVudW1lcmF0aW9uLCBhbmQgYXJlIGRvY3VtZW50ZWQKKy8vLyBoZXJlOiBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5LzRzemR0emMzLmFzcHgKK2VudW0gY2xhc3MgUERCX0J1aWx0aW5UeXBlIHsKKyAgTm9uZSA9IDAsCisgIFZvaWQgPSAxLAorICBDaGFyID0gMiwKKyAgV0NoYXJUID0gMywKKyAgSW50ID0gNiwKKyAgVUludCA9IDcsCisgIEZsb2F0ID0gOCwKKyAgQkNEID0gOSwKKyAgQm9vbCA9IDEwLAorICBMb25nID0gMTMsCisgIFVMb25nID0gMTQsCisgIEN1cnJlbmN5ID0gMjUsCisgIERhdGUgPSAyNiwKKyAgVmFyaWFudCA9IDI3LAorICBDb21wbGV4ID0gMjgsCisgIEJpdGZpZWxkID0gMjksCisgIEJTVFIgPSAzMCwKKyAgSFJlc3VsdCA9IDMxLAorICBDaGFyMTYgPSAzMiwKKyAgQ2hhcjMyID0gMzMKK307CisKKy8vLyBUaGVzZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgZmxhZ3MgdGhhdCBjYW4gYmUgY29tYmluZWQgdG8gY29udHJvbCB0aGUKKy8vLyByZXR1cm4gb2YgYW4gdW5kZWNvcmF0ZWQgbmFtZSBmb3IgYSBDKysgZGVjb3JhdGVkIG5hbWUsIGFuZCBhcmUgZG9jdW1lbnRlZAorLy8vIGhlcmU6IGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkva3N6ZmswZnMuYXNweAorZW51bSBQREJfVW5kbmFtZUZsYWdzOiB1aW50MzJfdCB7CisgIFVuZG5hbWVfQ29tcGxldGUgPSAweDAsCisgIFVuZG5hbWVfTm9MZWFkaW5nVW5kZXJzY29yZXMgPSAweDEsCisgIFVuZG5hbWVfTm9Nc0tleXdvcmRzID0gMHgyLAorICBVbmRuYW1lX05vRnVuY1JldHVybnMgPSAweDQsCisgIFVuZG5hbWVfTm9BbGxvY01vZGVsID0gMHg4LAorICBVbmRuYW1lX05vQWxsb2NMYW5nID0gMHgxMCwKKyAgVW5kbmFtZV9SZXNlcnZlZDEgPSAweDIwLAorICBVbmRuYW1lX1Jlc2VydmVkMiA9IDB4NDAsCisgIFVuZG5hbWVfTm9UaGlzVHlwZSA9IDB4NjAsCisgIFVuZG5hbWVfTm9BY2Nlc3NTcGVjID0gMHg4MCwKKyAgVW5kbmFtZV9Ob1Rocm93U2lnID0gMHgxMDAsCisgIFVuZG5hbWVfTm9NZW1iZXJUeXBlID0gMHgyMDAsCisgIFVuZG5hbWVfTm9SZXR1cm5VRFRNb2RlbCA9IDB4NDAwLAorICBVbmRuYW1lXzMyQml0RGVjb2RlID0gMHg4MDAsCisgIFVuZG5hbWVfTmFtZU9ubHkgPSAweDEwMDAsCisgIFVuZG5hbWVfVHlwZU9ubHkgPSAweDIwMDAsCisgIFVuZG5hbWVfSGF2ZVBhcmFtcyA9IDB4NDAwMCwKKyAgVW5kbmFtZV9Ob0VDU1UgPSAweDgwMDAsCisgIFVuZG5hbWVfTm9JZGVudENoYXJDaGVjayA9IDB4MTAwMDAsCisgIFVuZG5hbWVfTm9QVFI2NCA9IDB4MjAwMDAKK307CisKK2VudW0gY2xhc3MgUERCX01lbWJlckFjY2VzcyB7IFByaXZhdGUgPSAxLCBQcm90ZWN0ZWQgPSAyLCBQdWJsaWMgPSAzIH07CisKK3N0cnVjdCBWZXJzaW9uSW5mbyB7CisgIHVpbnQzMl90IE1ham9yOworICB1aW50MzJfdCBNaW5vcjsKKyAgdWludDMyX3QgQnVpbGQ7CisgIHVpbnQzMl90IFFGRTsKK307CisKK2VudW0gUERCX1ZhcmlhbnRUeXBlIHsKKyAgRW1wdHksCisgIFVua25vd24sCisgIEludDgsCisgIEludDE2LAorICBJbnQzMiwKKyAgSW50NjQsCisgIFNpbmdsZSwKKyAgRG91YmxlLAorICBVSW50OCwKKyAgVUludDE2LAorICBVSW50MzIsCisgIFVJbnQ2NCwKKyAgQm9vbCwKKyAgU3RyaW5nCit9OworCitzdHJ1Y3QgVmFyaWFudCB7CisgIFZhcmlhbnQoKSA9IGRlZmF1bHQ7CisKKyAgVmFyaWFudChjb25zdCBWYXJpYW50ICZPdGhlcikgeworICAgICp0aGlzID0gT3RoZXI7CisgIH0KKworICB+VmFyaWFudCgpIHsKKyAgICBpZiAoVHlwZSA9PSBQREJfVmFyaWFudFR5cGU6OlN0cmluZykKKyAgICAgIGRlbGV0ZVtdIFZhbHVlLlN0cmluZzsKKyAgfQorCisgIFBEQl9WYXJpYW50VHlwZSBUeXBlID0gUERCX1ZhcmlhbnRUeXBlOjpFbXB0eTsKKyAgdW5pb24geworICAgIGJvb2wgQm9vbDsKKyAgICBpbnQ4X3QgSW50ODsKKyAgICBpbnQxNl90IEludDE2OworICAgIGludDMyX3QgSW50MzI7CisgICAgaW50NjRfdCBJbnQ2NDsKKyAgICBmbG9hdCBTaW5nbGU7CisgICAgZG91YmxlIERvdWJsZTsKKyAgICB1aW50OF90IFVJbnQ4OworICAgIHVpbnQxNl90IFVJbnQxNjsKKyAgICB1aW50MzJfdCBVSW50MzI7CisgICAgdWludDY0X3QgVUludDY0OworICAgIGNoYXIgKlN0cmluZzsKKyAgfSBWYWx1ZTsKKworI2RlZmluZSBWQVJJQU5UX0VRVUFMX0NBU0UoRW51bSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBQREJfVmFyaWFudFR5cGU6OkVudW06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIFZhbHVlLkVudW0gPT0gT3RoZXIuVmFsdWUuRW51bTsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVmFyaWFudCAmT3RoZXIpIGNvbnN0IHsKKyAgICBpZiAoVHlwZSAhPSBPdGhlci5UeXBlKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHN3aXRjaCAoVHlwZSkgeworICAgICAgVkFSSUFOVF9FUVVBTF9DQVNFKEJvb2wpCisgICAgICBWQVJJQU5UX0VRVUFMX0NBU0UoSW50OCkKKyAgICAgIFZBUklBTlRfRVFVQUxfQ0FTRShJbnQxNikKKyAgICAgIFZBUklBTlRfRVFVQUxfQ0FTRShJbnQzMikKKyAgICAgIFZBUklBTlRfRVFVQUxfQ0FTRShJbnQ2NCkKKyAgICAgIFZBUklBTlRfRVFVQUxfQ0FTRShTaW5nbGUpCisgICAgICBWQVJJQU5UX0VRVUFMX0NBU0UoRG91YmxlKQorICAgICAgVkFSSUFOVF9FUVVBTF9DQVNFKFVJbnQ4KQorICAgICAgVkFSSUFOVF9FUVVBTF9DQVNFKFVJbnQxNikKKyAgICAgIFZBUklBTlRfRVFVQUxfQ0FTRShVSW50MzIpCisgICAgICBWQVJJQU5UX0VRVUFMX0NBU0UoVUludDY0KQorICAgICAgVkFSSUFOVF9FUVVBTF9DQVNFKFN0cmluZykKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyN1bmRlZiBWQVJJQU5UX0VRVUFMX0NBU0UKKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgVmFyaWFudCAmT3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gT3RoZXIpOyB9CisgIFZhcmlhbnQgJm9wZXJhdG9yPShjb25zdCBWYXJpYW50ICZPdGhlcikgeworICAgIGlmICh0aGlzID09ICZPdGhlcikKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICBpZiAoVHlwZSA9PSBQREJfVmFyaWFudFR5cGU6OlN0cmluZykKKyAgICAgIGRlbGV0ZVtdIFZhbHVlLlN0cmluZzsKKyAgICBUeXBlID0gT3RoZXIuVHlwZTsKKyAgICBWYWx1ZSA9IE90aGVyLlZhbHVlOworICAgIGlmIChPdGhlci5UeXBlID09IFBEQl9WYXJpYW50VHlwZTo6U3RyaW5nICYmCisgICAgICAgIE90aGVyLlZhbHVlLlN0cmluZyAhPSBudWxscHRyKSB7CisgICAgICBWYWx1ZS5TdHJpbmcgPSBuZXcgY2hhcltzdHJsZW4oT3RoZXIuVmFsdWUuU3RyaW5nKSArIDFdOworICAgICAgOjpzdHJjcHkoVmFsdWUuU3RyaW5nLCBPdGhlci5WYWx1ZS5TdHJpbmcpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBwZGIKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBzdGQgeworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaGFzaDxsbHZtOjpwZGI6OlBEQl9TeW1UeXBlPiB7CisgIHVzaW5nIGFyZ3VtZW50X3R5cGUgPSBsbHZtOjpwZGI6OlBEQl9TeW1UeXBlOworICB1c2luZyByZXN1bHRfdHlwZSA9IHN0ZDo6c2l6ZV90OworCisgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoY29uc3QgYXJndW1lbnRfdHlwZSAmQXJnKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6aGFzaDxpbnQ+KCkoc3RhdGljX2Nhc3Q8aW50PihBcmcpKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlRZUEVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9VRFRMYXlvdXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9VRFRMYXlvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDIzNGMxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1VEVExheW91dC5oCkBAIC0wLDAgKzEsMTgyIEBACisvLz09PS0gVURUTGF5b3V0LmggLSBVRFQgbGF5b3V0IGluZm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9VRFRMQVlPVVRfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfVURUTEFZT1VUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xEYXRhLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVCYXNlQ2xhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZUJ1aWx0aW4uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZVVEVC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlVlRhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL1BEQlR5cGVzLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIEJhc2VDbGFzc0xheW91dDsKK2NsYXNzIENsYXNzTGF5b3V0OworY2xhc3MgVURUTGF5b3V0QmFzZTsKKworY2xhc3MgTGF5b3V0SXRlbUJhc2UgeworcHVibGljOgorICBMYXlvdXRJdGVtQmFzZShjb25zdCBVRFRMYXlvdXRCYXNlICpQYXJlbnQsIGNvbnN0IFBEQlN5bWJvbCAqU3ltYm9sLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwgdWludDMyX3QgT2Zmc2V0SW5QYXJlbnQsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNpemUsIGJvb2wgSXNFbGlkZWQpOworICB2aXJ0dWFsIH5MYXlvdXRJdGVtQmFzZSgpID0gZGVmYXVsdDsKKworICB1aW50MzJfdCBkZWVwUGFkZGluZ1NpemUoKSBjb25zdDsKKyAgdmlydHVhbCB1aW50MzJfdCBpbW1lZGlhdGVQYWRkaW5nKCkgY29uc3QgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHRhaWxQYWRkaW5nKCkgY29uc3Q7CisKKyAgY29uc3QgVURUTGF5b3V0QmFzZSAqZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gUGFyZW50OyB9CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorICB1aW50MzJfdCBnZXRPZmZzZXRJblBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIE9mZnNldEluUGFyZW50OyB9CisgIHVpbnQzMl90IGdldFNpemUoKSBjb25zdCB7IHJldHVybiBTaXplT2Y7IH0KKyAgdWludDMyX3QgZ2V0TGF5b3V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIExheW91dFNpemU7IH0KKyAgY29uc3QgUERCU3ltYm9sICpnZXRTeW1ib2woKSBjb25zdCB7IHJldHVybiBTeW1ib2w7IH0KKyAgY29uc3QgQml0VmVjdG9yICZ1c2VkQnl0ZXMoKSBjb25zdCB7IHJldHVybiBVc2VkQnl0ZXM7IH0KKyAgYm9vbCBpc0VsaWRlZCgpIGNvbnN0IHsgcmV0dXJuIElzRWxpZGVkOyB9CisgIHZpcnR1YWwgYm9vbCBpc1ZCUHRyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICB1aW50MzJfdCBjb250YWluc09mZnNldCh1aW50MzJfdCBPZmYpIGNvbnN0IHsKKyAgICB1aW50MzJfdCBCZWdpbiA9IGdldE9mZnNldEluUGFyZW50KCk7CisgICAgdWludDMyX3QgRW5kID0gQmVnaW4gKyBnZXRTaXplKCk7CisgICAgcmV0dXJuIChPZmYgPj0gQmVnaW4gJiYgT2ZmIDwgRW5kKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGNvbnN0IFBEQlN5bWJvbCAqU3ltYm9sID0gbnVsbHB0cjsKKyAgY29uc3QgVURUTGF5b3V0QmFzZSAqUGFyZW50ID0gbnVsbHB0cjsKKyAgQml0VmVjdG9yIFVzZWRCeXRlczsKKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgdWludDMyX3QgT2Zmc2V0SW5QYXJlbnQgPSAwOworICB1aW50MzJfdCBTaXplT2YgPSAwOworICB1aW50MzJfdCBMYXlvdXRTaXplID0gMDsKKyAgYm9vbCBJc0VsaWRlZCA9IGZhbHNlOworfTsKKworY2xhc3MgVkJQdHJMYXlvdXRJdGVtIDogcHVibGljIExheW91dEl0ZW1CYXNlIHsKK3B1YmxpYzoKKyAgVkJQdHJMYXlvdXRJdGVtKGNvbnN0IFVEVExheW91dEJhc2UgJlBhcmVudCwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2xUeXBlQnVpbHRpbj4gU3ltLCB1aW50MzJfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTaXplKTsKKworICBib29sIGlzVkJQdHIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2xUeXBlQnVpbHRpbj4gVHlwZTsKK307CisKK2NsYXNzIERhdGFNZW1iZXJMYXlvdXRJdGVtIDogcHVibGljIExheW91dEl0ZW1CYXNlIHsKK3B1YmxpYzoKKyAgRGF0YU1lbWJlckxheW91dEl0ZW0oY29uc3QgVURUTGF5b3V0QmFzZSAmUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sRGF0YT4gRGF0YU1lbWJlcik7CisKKyAgY29uc3QgUERCU3ltYm9sRGF0YSAmZ2V0RGF0YU1lbWJlcigpOworICBib29sIGhhc1VEVExheW91dCgpIGNvbnN0OworICBjb25zdCBDbGFzc0xheW91dCAmZ2V0VURUTGF5b3V0KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2xEYXRhPiBEYXRhTWVtYmVyOworICBzdGQ6OnVuaXF1ZV9wdHI8Q2xhc3NMYXlvdXQ+IFVkdExheW91dDsKK307CisKK2NsYXNzIFZUYWJsZUxheW91dEl0ZW0gOiBwdWJsaWMgTGF5b3V0SXRlbUJhc2UgeworcHVibGljOgorICBWVGFibGVMYXlvdXRJdGVtKGNvbnN0IFVEVExheW91dEJhc2UgJlBhcmVudCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sVHlwZVZUYWJsZT4gVlRhYmxlKTsKKworICB1aW50MzJfdCBnZXRFbGVtZW50U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEVsZW1lbnRTaXplOyB9CisKK3ByaXZhdGU6CisgIHVpbnQzMl90IEVsZW1lbnRTaXplID0gMDsKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbFR5cGVWVGFibGU+IFZUYWJsZTsKK307CisKK2NsYXNzIFVEVExheW91dEJhc2UgOiBwdWJsaWMgTGF5b3V0SXRlbUJhc2UgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdXNpbmcgVW5pcXVlUHRyVmVjdG9yID0gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFQ+PjsKKworcHVibGljOgorICBVRFRMYXlvdXRCYXNlKGNvbnN0IFVEVExheW91dEJhc2UgKlBhcmVudCwgY29uc3QgUERCU3ltYm9sICZTeW0sCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsIHVpbnQzMl90IE9mZnNldEluUGFyZW50LCB1aW50MzJfdCBTaXplLAorICAgICAgICAgICAgICAgIGJvb2wgSXNFbGlkZWQpOworCisgIHVpbnQzMl90IHRhaWxQYWRkaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIEFycmF5UmVmPExheW91dEl0ZW1CYXNlICo+IGxheW91dF9pdGVtcygpIGNvbnN0IHsgcmV0dXJuIExheW91dEl0ZW1zOyB9CisgIEFycmF5UmVmPEJhc2VDbGFzc0xheW91dCAqPiBiYXNlcygpIGNvbnN0IHsgcmV0dXJuIEFsbEJhc2VzOyB9CisgIEFycmF5UmVmPEJhc2VDbGFzc0xheW91dCAqPiByZWd1bGFyX2Jhc2VzKCkgY29uc3QgeyByZXR1cm4gTm9uVmlydHVhbEJhc2VzOyB9CisgIEFycmF5UmVmPEJhc2VDbGFzc0xheW91dCAqPiB2aXJ0dWFsX2Jhc2VzKCkgY29uc3QgeyByZXR1cm4gVmlydHVhbEJhc2VzOyB9CisgIHVpbnQzMl90IGRpcmVjdFZpcnR1YWxCYXNlQ291bnQoKSBjb25zdCB7IHJldHVybiBEaXJlY3RWQmFzZUNvdW50OyB9CisgIEFycmF5UmVmPHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2xGdW5jPj4gZnVuY3MoKSBjb25zdCB7IHJldHVybiBGdW5jczsgfQorICBBcnJheVJlZjxzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sPj4gb3RoZXJfaXRlbXMoKSBjb25zdCB7IHJldHVybiBPdGhlcjsgfQorCitwcm90ZWN0ZWQ6CisgIGJvb2wgaGFzVkJQdHJBdE9mZnNldCh1aW50MzJfdCBPZmYpIGNvbnN0OworICB2b2lkIGluaXRpYWxpemVDaGlsZHJlbihjb25zdCBQREJTeW1ib2wgJlN5bSk7CisKKyAgdm9pZCBhZGRDaGlsZFRvTGF5b3V0KHN0ZDo6dW5pcXVlX3B0cjxMYXlvdXRJdGVtQmFzZT4gQ2hpbGQpOworCisgIHVpbnQzMl90IERpcmVjdFZCYXNlQ291bnQgPSAwOworCisgIFVuaXF1ZVB0clZlY3RvcjxQREJTeW1ib2w+IE90aGVyOworICBVbmlxdWVQdHJWZWN0b3I8UERCU3ltYm9sRnVuYz4gRnVuY3M7CisgIFVuaXF1ZVB0clZlY3RvcjxMYXlvdXRJdGVtQmFzZT4gQ2hpbGRTdG9yYWdlOworICBzdGQ6OnZlY3RvcjxMYXlvdXRJdGVtQmFzZSAqPiBMYXlvdXRJdGVtczsKKworICBzdGQ6OnZlY3RvcjxCYXNlQ2xhc3NMYXlvdXQgKj4gQWxsQmFzZXM7CisgIEFycmF5UmVmPEJhc2VDbGFzc0xheW91dCAqPiBOb25WaXJ0dWFsQmFzZXM7CisgIEFycmF5UmVmPEJhc2VDbGFzc0xheW91dCAqPiBWaXJ0dWFsQmFzZXM7CisKKyAgVlRhYmxlTGF5b3V0SXRlbSAqVlRhYmxlID0gbnVsbHB0cjsKKyAgVkJQdHJMYXlvdXRJdGVtICpWQlB0ciA9IG51bGxwdHI7Cit9OworCitjbGFzcyBCYXNlQ2xhc3NMYXlvdXQgOiBwdWJsaWMgVURUTGF5b3V0QmFzZSB7CitwdWJsaWM6CisgIEJhc2VDbGFzc0xheW91dChjb25zdCBVRFRMYXlvdXRCYXNlICZQYXJlbnQsIHVpbnQzMl90IE9mZnNldEluUGFyZW50LAorICAgICAgICAgICAgICAgICAgYm9vbCBFbGlkZSwgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbFR5cGVCYXNlQ2xhc3M+IEJhc2UpOworCisgIGNvbnN0IFBEQlN5bWJvbFR5cGVCYXNlQ2xhc3MgJmdldEJhc2UoKSBjb25zdCB7IHJldHVybiAqQmFzZTsgfQorICBib29sIGlzVmlydHVhbEJhc2UoKSBjb25zdCB7IHJldHVybiBJc1ZpcnR1YWxCYXNlOyB9CisgIGJvb2wgaXNFbXB0eUJhc2UoKSB7IHJldHVybiBTaXplT2YgPT0gMSAmJiBMYXlvdXRTaXplID09IDA7IH0KKworcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbFR5cGVCYXNlQ2xhc3M+IEJhc2U7CisgIGJvb2wgSXNWaXJ0dWFsQmFzZTsKK307CisKK2NsYXNzIENsYXNzTGF5b3V0IDogcHVibGljIFVEVExheW91dEJhc2UgeworcHVibGljOgorICBleHBsaWNpdCBDbGFzc0xheW91dChjb25zdCBQREJTeW1ib2xUeXBlVURUICZVRFQpOworICBleHBsaWNpdCBDbGFzc0xheW91dChzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sVHlwZVVEVD4gVURUKTsKKworICBDbGFzc0xheW91dChDbGFzc0xheW91dCAmJk90aGVyKSA9IGRlZmF1bHQ7CisKKyAgY29uc3QgUERCU3ltYm9sVHlwZVVEVCAmZ2V0Q2xhc3MoKSBjb25zdCB7IHJldHVybiBVRFQ7IH0KKyAgdWludDMyX3QgaW1tZWRpYXRlUGFkZGluZygpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBCaXRWZWN0b3IgSW1tZWRpYXRlVXNlZEJ5dGVzOworICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sVHlwZVVEVD4gT3duZWRTdG9yYWdlOworICBjb25zdCBQREJTeW1ib2xUeXBlVURUICZVRFQ7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgcGRiCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1VEVExBWU9VVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9TeW1ib2xpemUvRElQcmludGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9TeW1ib2xpemUvRElQcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI4MmJlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1N5bWJvbGl6ZS9ESVByaW50ZXIuaApAQCAtMCwwICsxLDUzIEBACisvLz09PS0gbGx2bS9EZWJ1Z0luZm8vU3ltYm9saXplL0RJUHJpbnRlci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgRElQcmludGVyIGNsYXNzLCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgcHJpbnRpbmcKKy8vIHN0cnVjdHVyZXMgZGVmaW5lZCBpbiBEZWJ1Z0luZm8vRElDb250ZXh0LmgKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1NZTUJPTElaRV9ESVBSSU5URVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19TWU1CT0xJWkVfRElQUklOVEVSX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgbGx2bSB7CitzdHJ1Y3QgRElMaW5lSW5mbzsKK2NsYXNzIERJSW5saW5pbmdJbmZvOworc3RydWN0IERJR2xvYmFsOworCituYW1lc3BhY2Ugc3ltYm9saXplIHsKKworY2xhc3MgRElQcmludGVyIHsKKyAgcmF3X29zdHJlYW0gJk9TOworICBib29sIFByaW50RnVuY3Rpb25OYW1lczsKKyAgYm9vbCBQcmludFByZXR0eTsKKyAgaW50IFByaW50U291cmNlQ29udGV4dDsKKyAgYm9vbCBWZXJib3NlOworCisgIHZvaWQgcHJpbnQoY29uc3QgRElMaW5lSW5mbyAmSW5mbywgYm9vbCBJbmxpbmVkKTsKKyAgdm9pZCBwcmludENvbnRleHQoY29uc3Qgc3RkOjpzdHJpbmcgJkZpbGVOYW1lLCBpbnQ2NF90IExpbmUpOworCitwdWJsaWM6CisgIERJUHJpbnRlcihyYXdfb3N0cmVhbSAmT1MsIGJvb2wgUHJpbnRGdW5jdGlvbk5hbWVzID0gdHJ1ZSwKKyAgICAgICAgICAgIGJvb2wgUHJpbnRQcmV0dHkgPSBmYWxzZSwgaW50IFByaW50U291cmNlQ29udGV4dCA9IDAsCisgICAgICAgICAgICBib29sIFZlcmJvc2UgPSBmYWxzZSkKKyAgICAgIDogT1MoT1MpLCBQcmludEZ1bmN0aW9uTmFtZXMoUHJpbnRGdW5jdGlvbk5hbWVzKSwKKyAgICAgICAgUHJpbnRQcmV0dHkoUHJpbnRQcmV0dHkpLCBQcmludFNvdXJjZUNvbnRleHQoUHJpbnRTb3VyY2VDb250ZXh0KSwKKyAgICAgICAgVmVyYm9zZShWZXJib3NlKSB7fQorCisgIERJUHJpbnRlciAmb3BlcmF0b3I8PChjb25zdCBESUxpbmVJbmZvICZJbmZvKTsKKyAgRElQcmludGVyICZvcGVyYXRvcjw8KGNvbnN0IERJSW5saW5pbmdJbmZvICZJbmZvKTsKKyAgRElQcmludGVyICZvcGVyYXRvcjw8KGNvbnN0IERJR2xvYmFsICZHbG9iYWwpOworfTsKK30KK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1N5bWJvbGl6ZS9TeW1ib2xpemFibGVNb2R1bGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1N5bWJvbGl6ZS9TeW1ib2xpemFibGVNb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTc2YTkxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vU3ltYm9saXplL1N5bWJvbGl6YWJsZU1vZHVsZS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vPT09LSBTeW1ib2xpemFibGVNb2R1bGUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBTeW1ib2xpemFibGVNb2R1bGUgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1NZTUJPTElaRV9TWU1CT0xJWkFCTEVNT0RVTEVfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19TWU1CT0xJWkVfU1lNQk9MSVpBQkxFTU9EVUxFX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RJQ29udGV4dC5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzeW1ib2xpemUgeworCit1c2luZyBGdW5jdGlvbk5hbWVLaW5kID0gRElMaW5lSW5mb1NwZWNpZmllcjo6RnVuY3Rpb25OYW1lS2luZDsKKworY2xhc3MgU3ltYm9saXphYmxlTW9kdWxlIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+U3ltYm9saXphYmxlTW9kdWxlKCkgPSBkZWZhdWx0OworCisgIHZpcnR1YWwgRElMaW5lSW5mbyBzeW1ib2xpemVDb2RlKHVpbnQ2NF90IE1vZHVsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25OYW1lS2luZCBGTktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVXNlU3ltYm9sVGFibGUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBESUlubGluaW5nSW5mbyBzeW1ib2xpemVJbmxpbmVkQ29kZSh1aW50NjRfdCBNb2R1bGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25OYW1lS2luZCBGTktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVc2VTeW1ib2xUYWJsZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIERJR2xvYmFsIHN5bWJvbGl6ZURhdGEodWludDY0X3QgTW9kdWxlT2Zmc2V0KSBjb25zdCA9IDA7CisKKyAgLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIDMyLWJpdCB4ODYgUEUgQ09GRiBtb2R1bGUuCisgIHZpcnR1YWwgYm9vbCBpc1dpbjMyTW9kdWxlKCkgY29uc3QgPSAwOworCisgIC8vIFJldHVybnMgdGhlIHByZWZlcnJlZCBiYXNlIG9mIHRoZSBtb2R1bGUsIGkuZS4gd2hlcmUgdGhlIGxvYWRlciB3b3VsZCBwbGFjZQorICAvLyBpdCBpbiBtZW1vcnkgYXNzdW1pbmcgdGhlcmUgd2VyZSBubyBjb25mbGljdHMuCisgIHZpcnR1YWwgdWludDY0X3QgZ2V0TW9kdWxlUHJlZmVycmVkQmFzZSgpIGNvbnN0ID0gMDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBzeW1ib2xpemUKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAgLy8gTExWTV9ERUJVR0lORk9fU1lNQk9MSVpFX1NZTUJPTElaQUJMRU1PRFVMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9TeW1ib2xpemUvU3ltYm9saXplLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9TeW1ib2xpemUvU3ltYm9saXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4MGFlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1N5bWJvbGl6ZS9TeW1ib2xpemUuaApAQCAtMCwwICsxLDEyMyBAQAorLy89PT0tIFN5bWJvbGl6ZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBIZWFkZXIgZm9yIExMVk0gc3ltYm9saXphdGlvbiBsaWJyYXJ5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fU1lNQk9MSVpFX1NZTUJPTElaRV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1NZTUJPTElaRV9TWU1CT0xJWkVfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vU3ltYm9saXplL1N5bWJvbGl6YWJsZU1vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0JpbmFyeS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L09iamVjdEZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHN5bWJvbGl6ZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBvYmplY3Q7CisKK3VzaW5nIEZ1bmN0aW9uTmFtZUtpbmQgPSBESUxpbmVJbmZvU3BlY2lmaWVyOjpGdW5jdGlvbk5hbWVLaW5kOworCitjbGFzcyBMTFZNU3ltYm9saXplciB7CitwdWJsaWM6CisgIHN0cnVjdCBPcHRpb25zIHsKKyAgICBGdW5jdGlvbk5hbWVLaW5kIFByaW50RnVuY3Rpb25zOworICAgIGJvb2wgVXNlU3ltYm9sVGFibGUgOiAxOworICAgIGJvb2wgRGVtYW5nbGUgOiAxOworICAgIGJvb2wgUmVsYXRpdmVBZGRyZXNzZXMgOiAxOworICAgIHN0ZDo6c3RyaW5nIERlZmF1bHRBcmNoOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBEc3ltSGludHM7CisKKyAgICBPcHRpb25zKEZ1bmN0aW9uTmFtZUtpbmQgUHJpbnRGdW5jdGlvbnMgPSBGdW5jdGlvbk5hbWVLaW5kOjpMaW5rYWdlTmFtZSwKKyAgICAgICAgICAgIGJvb2wgVXNlU3ltYm9sVGFibGUgPSB0cnVlLCBib29sIERlbWFuZ2xlID0gdHJ1ZSwKKyAgICAgICAgICAgIGJvb2wgUmVsYXRpdmVBZGRyZXNzZXMgPSBmYWxzZSwgc3RkOjpzdHJpbmcgRGVmYXVsdEFyY2ggPSAiIikKKyAgICAgICAgOiBQcmludEZ1bmN0aW9ucyhQcmludEZ1bmN0aW9ucyksIFVzZVN5bWJvbFRhYmxlKFVzZVN5bWJvbFRhYmxlKSwKKyAgICAgICAgICBEZW1hbmdsZShEZW1hbmdsZSksIFJlbGF0aXZlQWRkcmVzc2VzKFJlbGF0aXZlQWRkcmVzc2VzKSwKKyAgICAgICAgICBEZWZhdWx0QXJjaChzdGQ6Om1vdmUoRGVmYXVsdEFyY2gpKSB7fQorICB9OworCisgIExMVk1TeW1ib2xpemVyKGNvbnN0IE9wdGlvbnMgJk9wdHMgPSBPcHRpb25zKCkpIDogT3B0cyhPcHRzKSB7fQorCisgIH5MTFZNU3ltYm9saXplcigpIHsKKyAgICBmbHVzaCgpOworICB9CisKKyAgRXhwZWN0ZWQ8RElMaW5lSW5mbz4gc3ltYm9saXplQ29kZShjb25zdCBzdGQ6OnN0cmluZyAmTW9kdWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBNb2R1bGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERXUE5hbWUgPSAiIik7CisgIEV4cGVjdGVkPERJSW5saW5pbmdJbmZvPiBzeW1ib2xpemVJbmxpbmVkQ29kZShjb25zdCBzdGQ6OnN0cmluZyAmTW9kdWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE1vZHVsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEV1BOYW1lID0gIiIpOworICBFeHBlY3RlZDxESUdsb2JhbD4gc3ltYm9saXplRGF0YShjb25zdCBzdGQ6OnN0cmluZyAmTW9kdWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgTW9kdWxlT2Zmc2V0KTsKKyAgdm9pZCBmbHVzaCgpOworCisgIHN0YXRpYyBzdGQ6OnN0cmluZworICBEZW1hbmdsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICBjb25zdCBTeW1ib2xpemFibGVNb2R1bGUgKkRiaU1vZHVsZURlc2NyaXB0b3IpOworCitwcml2YXRlOgorICAvLyBCdW5kbGVzIHRvZ2V0aGVyIG9iamVjdCBmaWxlIHdpdGggY29kZS9kYXRhIGFuZCBvYmplY3QgZmlsZSB3aXRoCisgIC8vIGNvcnJlc3BvbmRpbmcgZGVidWcgaW5mby4gVGhlc2Ugb2JqZWN0cyBjYW4gYmUgdGhlIHNhbWUuCisgIHVzaW5nIE9iamVjdFBhaXIgPSBzdGQ6OnBhaXI8T2JqZWN0RmlsZSAqLCBPYmplY3RGaWxlICo+OworCisgIC8vLyBSZXR1cm5zIGEgU3ltYm9saXphYmxlTW9kdWxlIG9yIGFuIGVycm9yIGlmIGxvYWRpbmcgZGVidWcgaW5mbyBmYWlsZWQuCisgIC8vLyBPbmx5IG9uZSBhdHRlbXB0IGlzIG1hZGUgdG8gbG9hZCBhIG1vZHVsZSwgYW5kIGVycm9ycyBkdXJpbmcgbG9hZGluZyBhcmUKKyAgLy8vIG9ubHkgcmVwb3J0ZWQgb25jZS4gU3Vic2VxdWVudCBjYWxscyB0byBnZXQgbW9kdWxlIGluZm8gZm9yIGEgbW9kdWxlIHRoYXQKKyAgLy8vIGZhaWxlZCB0byBsb2FkIHdpbGwgcmV0dXJuIG51bGxwdHIuCisgIEV4cGVjdGVkPFN5bWJvbGl6YWJsZU1vZHVsZSAqPgorICBnZXRPckNyZWF0ZU1vZHVsZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcgJk1vZHVsZU5hbWUsIFN0cmluZ1JlZiBEV1BOYW1lID0gIiIpOworCisgIE9iamVjdEZpbGUgKmxvb2tVcERzeW1GaWxlKGNvbnN0IHN0ZDo6c3RyaW5nICZQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoT09iamVjdEZpbGUgKkV4ZU9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkFyY2hOYW1lKTsKKyAgT2JqZWN0RmlsZSAqbG9va1VwRGVidWdsaW5rT2JqZWN0KGNvbnN0IHN0ZDo6c3RyaW5nICZQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqZWN0RmlsZSAqT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkFyY2hOYW1lKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgcGFpciBvZiBwb2ludGVycyB0byBvYmplY3QgYW5kIGRlYnVnIG9iamVjdC4KKyAgRXhwZWN0ZWQ8T2JqZWN0UGFpcj4gZ2V0T3JDcmVhdGVPYmplY3RQYWlyKGNvbnN0IHN0ZDo6c3RyaW5nICZQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQXJjaE5hbWUpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgcG9pbnRlciB0byBvYmplY3QgZmlsZSBhdCBzcGVjaWZpZWQgcGF0aCwgZm9yIGEgc3BlY2lmaWVkCisgIC8vLyBhcmNoaXRlY3R1cmUgKGUuZy4gaWYgcGF0aCByZWZlcnMgdG8gYSBNYWNoLU8gdW5pdmVyc2FsIGJpbmFyeSwgb25seSBvbmUKKyAgLy8vIG9iamVjdCBmaWxlIGZyb20gaXQgd2lsbCBiZSByZXR1cm5lZCkuCisgIEV4cGVjdGVkPE9iamVjdEZpbGUgKj4gZ2V0T3JDcmVhdGVPYmplY3QoY29uc3Qgc3RkOjpzdHJpbmcgJlBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQXJjaE5hbWUpOworCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8U3ltYm9saXphYmxlTW9kdWxlPj4gTW9kdWxlczsKKworICAvLy8gXGJyaWVmIENvbnRhaW5zIGNhY2hlZCByZXN1bHRzIG9mIGdldE9yQ3JlYXRlT2JqZWN0UGFpcigpLgorICBzdGQ6Om1hcDxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiwgT2JqZWN0UGFpcj4KKyAgICAgIE9iamVjdFBhaXJGb3JQYXRoQXJjaDsKKworICAvLy8gXGJyaWVmIENvbnRhaW5zIHBhcnNlZCBiaW5hcnkgZm9yIGVhY2ggcGF0aCwgb3IgcGFyc2luZyBlcnJvci4KKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIE93bmluZ0JpbmFyeTxCaW5hcnk+PiBCaW5hcnlGb3JQYXRoOworCisgIC8vLyBcYnJpZWYgUGFyc2VkIG9iamVjdCBmaWxlIGZvciBwYXRoL2FyY2hpdGVjdHVyZSBwYWlyLCB3aGVyZSAicGF0aCIgcmVmZXJzCisgIC8vLyB0byBNYWNoLU8gdW5pdmVyc2FsIGJpbmFyeS4KKyAgc3RkOjptYXA8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4sIHN0ZDo6dW5pcXVlX3B0cjxPYmplY3RGaWxlPj4KKyAgICAgIE9iamVjdEZvclVCUGF0aEFuZEFyY2g7CisKKyAgT3B0aW9ucyBPcHRzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHN5bWJvbGl6ZQorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1NZTUJPTElaRV9TWU1CT0xJWkVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZW1hbmdsZS9Db21waWxlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZW1hbmdsZS9Db21waWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OTZmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlbWFuZ2xlL0NvbXBpbGVyLmgKQEAgLTAsMCArMSw1MDYgQEAKKy8vPT09LS0gbGx2bS9EZW1hbmdsZS9Db21waWxlci5oIC0gQ29tcGlsZXIgYWJzdHJhY3Rpb24gc3VwcG9ydCAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgc2V2ZXJhbCBtYWNyb3MsIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbXBpbGVyLiAgVGhpcyBhbGxvd3MKKy8vIHVzZSBvZiBjb21waWxlci1zcGVjaWZpYyBmZWF0dXJlcyBpbiBhIHdheSB0aGF0IHJlbWFpbnMgcG9ydGFibGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQ09NUElMRVJfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQ09NUElMRVJfSAorCisjaW5jbHVkZSAibGx2bS9Db25maWcvbGx2bS1jb25maWcuaCIKKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjaW5jbHVkZSA8c2FsLmg+CisjZW5kaWYKKworI2lmbmRlZiBfX2hhc19mZWF0dXJlCisjIGRlZmluZSBfX2hhc19mZWF0dXJlKHgpIDAKKyNlbmRpZgorCisjaWZuZGVmIF9faGFzX2V4dGVuc2lvbgorIyBkZWZpbmUgX19oYXNfZXh0ZW5zaW9uKHgpIDAKKyNlbmRpZgorCisjaWZuZGVmIF9faGFzX2F0dHJpYnV0ZQorIyBkZWZpbmUgX19oYXNfYXR0cmlidXRlKHgpIDAKKyNlbmRpZgorCisjaWZuZGVmIF9faGFzX2NwcF9hdHRyaWJ1dGUKKyMgZGVmaW5lIF9faGFzX2NwcF9hdHRyaWJ1dGUoeCkgMAorI2VuZGlmCisKKyNpZm5kZWYgX19oYXNfYnVpbHRpbgorIyBkZWZpbmUgX19oYXNfYnVpbHRpbih4KSAwCisjZW5kaWYKKworLy8vIFxtYWNybyBMTFZNX0dOVUNfUFJFUkVRCisvLy8gXGJyaWVmIEV4dGVuZCB0aGUgZGVmYXVsdCBfX0dOVUNfUFJFUkVRIGV2ZW4gaWYgZ2xpYmMncyBmZWF0dXJlcy5oIGlzbid0CisvLy8gYXZhaWxhYmxlLgorI2lmbmRlZiBMTFZNX0dOVUNfUFJFUkVRCisjIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTlVDX01JTk9SX18pICYmIGRlZmluZWQoX19HTlVDX1BBVENITEVWRUxfXykKKyMgIGRlZmluZSBMTFZNX0dOVUNfUFJFUkVRKG1haiwgbWluLCBwYXRjaCkgXAorICAgICgoX19HTlVDX18gPDwgMjApICsgKF9fR05VQ19NSU5PUl9fIDw8IDEwKSArIF9fR05VQ19QQVRDSExFVkVMX18gPj0gXAorICAgICAoKG1haikgPDwgMjApICsgKChtaW4pIDw8IDEwKSArIChwYXRjaCkpCisjIGVsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykKKyMgIGRlZmluZSBMTFZNX0dOVUNfUFJFUkVRKG1haiwgbWluLCBwYXRjaCkgXAorICAgICgoX19HTlVDX18gPDwgMjApICsgKF9fR05VQ19NSU5PUl9fIDw8IDEwKSA+PSAoKG1haikgPDwgMjApICsgKChtaW4pIDw8IDEwKSkKKyMgZWxzZQorIyAgZGVmaW5lIExMVk1fR05VQ19QUkVSRVEobWFqLCBtaW4sIHBhdGNoKSAwCisjIGVuZGlmCisjZW5kaWYKKworLy8vIFxtYWNybyBMTFZNX01TQ19QUkVSRVEKKy8vLyBcYnJpZWYgSXMgdGhlIGNvbXBpbGVyIE1TVkMgb2YgYXQgbGVhc3QgdGhlIHNwZWNpZmllZCB2ZXJzaW9uPworLy8vIFRoZSBjb21tb24gXHBhcmFtIHZlcnNpb24gdmFsdWVzIHRvIGNoZWNrIGZvciBhcmU6CisvLy8gICogMTkwMDogTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMjAxNSAvIDE0LjAKKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSBMTFZNX01TQ19QUkVSRVEodmVyc2lvbikgKF9NU0NfVkVSID49ICh2ZXJzaW9uKSkKKworLy8gV2UgcmVxdWlyZSBhdCBsZWFzdCBNU1ZDIDIwMTUuCisjaWYgIUxMVk1fTVNDX1BSRVJFUSgxOTAwKQorI2Vycm9yIExMVk0gcmVxdWlyZXMgYXQgbGVhc3QgTVNWQyAyMDE1LgorI2VuZGlmCisKKyNlbHNlCisjZGVmaW5lIExMVk1fTVNDX1BSRVJFUSh2ZXJzaW9uKSAwCisjZW5kaWYKKworLy8vIFxicmllZiBEb2VzIHRoZSBjb21waWxlciBzdXBwb3J0IHJlZi1xdWFsaWZpZXJzIGZvciAqdGhpcz8KKy8vLworLy8vIFNhZGx5LCB0aGlzIGlzIHNlcGFyYXRlIGZyb20ganVzdCBydmFsdWUgcmVmZXJlbmNlIHN1cHBvcnQgYmVjYXVzZSBHQ0MKKy8vLyBhbmQgTVNWQyBpbXBsZW1lbnRlZCB0aGlzIGxhdGVyIHRoYW4gZXZlcnl0aGluZyBlbHNlLgorI2lmIF9faGFzX2ZlYXR1cmUoY3h4X3J2YWx1ZV9yZWZlcmVuY2VzKSB8fCBMTFZNX0dOVUNfUFJFUkVRKDQsIDgsIDEpCisjZGVmaW5lIExMVk1fSEFTX1JWQUxVRV9SRUZFUkVOQ0VfVEhJUyAxCisjZWxzZQorI2RlZmluZSBMTFZNX0hBU19SVkFMVUVfUkVGRVJFTkNFX1RISVMgMAorI2VuZGlmCisKKy8vLyBFeHBhbmRzIHRvICcmJyBpZiByZWYtcXVhbGlmaWVycyBmb3IgKnRoaXMgYXJlIHN1cHBvcnRlZC4KKy8vLworLy8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBsdmFsdWUvcnZhbHVlIG92ZXJyaWRlcyBvZiBtZW1iZXIgZnVuY3Rpb25zLgorLy8vIFRoZSBydmFsdWUgb3ZlcnJpZGUgc2hvdWxkIGJlIGd1YXJkZWQgYnkgTExWTV9IQVNfUlZBTFVFX1JFRkVSRU5DRV9USElTCisjaWYgTExWTV9IQVNfUlZBTFVFX1JFRkVSRU5DRV9USElTCisjZGVmaW5lIExMVk1fTFZBTFVFX0ZVTkNUSU9OICYKKyNlbHNlCisjZGVmaW5lIExMVk1fTFZBTFVFX0ZVTkNUSU9OCisjZW5kaWYKKworLy8vIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIC0gSWYgYSBjbGFzcyBtYXJrZWQgd2l0aCB0aGlzIGF0dHJpYnV0ZSBpcyBsaW5rZWQKKy8vLyBpbnRvIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gdGhlIGNsYXNzIHNob3VsZCBiZSBwcml2YXRlIHRvIHRoZSBsaWJyYXJ5IGFuZAorLy8vIG5vdCBhY2Nlc3NpYmxlIGZyb20gb3V0c2lkZSBpdC4gIENhbiBhbHNvIGJlIHVzZWQgdG8gbWFyayB2YXJpYWJsZXMgYW5kCisvLy8gZnVuY3Rpb25zLCBtYWtpbmcgdGhlbSBwcml2YXRlIHRvIGFueSBzaGFyZWQgbGlicmFyeSB0aGV5IGFyZSBsaW5rZWQgaW50by4KKy8vLyBPbiBQRS9DT0ZGIHRhcmdldHMsIGxpYnJhcnkgdmlzaWJpbGl0eSBpcyB0aGUgZGVmYXVsdCwgc28gdGhpcyBpc24ndCBuZWVkZWQuCisjaWYgKF9faGFzX2F0dHJpYnV0ZSh2aXNpYmlsaXR5KSB8fCBMTFZNX0dOVUNfUFJFUkVRKDQsIDAsIDApKSAmJiAgICAgICAgICAgICAgXAorICAgICFkZWZpbmVkKF9fTUlOR1czMl9fKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKSAmJiAhZGVmaW5lZChMTFZNX09OX1dJTjMyKQorI2RlZmluZSBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSgiaGlkZGVuIikpKQorI2Vsc2UKKyNkZWZpbmUgTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNkZWZpbmUgTExWTV9QUkVGRVRDSChhZGRyLCBydywgbG9jYWxpdHkpIF9fYnVpbHRpbl9wcmVmZXRjaChhZGRyLCBydywgbG9jYWxpdHkpCisjZWxzZQorI2RlZmluZSBMTFZNX1BSRUZFVENIKGFkZHIsIHJ3LCBsb2NhbGl0eSkKKyNlbmRpZgorCisjaWYgX19oYXNfYXR0cmlidXRlKHVzZWQpIHx8IExMVk1fR05VQ19QUkVSRVEoMywgMSwgMCkKKyNkZWZpbmUgTExWTV9BVFRSSUJVVEVfVVNFRCBfX2F0dHJpYnV0ZV9fKChfX3VzZWRfXykpCisjZWxzZQorI2RlZmluZSBMTFZNX0FUVFJJQlVURV9VU0VECisjZW5kaWYKKworLy8vIExMVk1fTk9ESVNDQVJEIC0gV2FybiBpZiBhIHR5cGUgb3IgcmV0dXJuIHZhbHVlIGlzIGRpc2NhcmRlZC4KKyNpZiBfX2NwbHVzcGx1cyA+IDIwMTQwMkwgJiYgX19oYXNfY3BwX2F0dHJpYnV0ZShub2Rpc2NhcmQpCisjZGVmaW5lIExMVk1fTk9ESVNDQVJEIFtbbm9kaXNjYXJkXV0KKyNlbGlmICFfX2NwbHVzcGx1cworLy8gV29ya2Fyb3VuZCBmb3IgbGx2bS5vcmcvUFIyMzQzNSwgc2luY2UgY2xhbmcgMy42IGFuZCBiZWxvdyBlbWl0IGEgc3B1cmlvdXMKKy8vIGVycm9yIHdoZW4gX19oYXNfY3BwX2F0dHJpYnV0ZSBpcyBnaXZlbiBhIHNjb3BlZCBhdHRyaWJ1dGUgaW4gQyBtb2RlLgorI2RlZmluZSBMTFZNX05PRElTQ0FSRAorI2VsaWYgX19oYXNfY3BwX2F0dHJpYnV0ZShjbGFuZzo6d2Fybl91bnVzZWRfcmVzdWx0KQorI2RlZmluZSBMTFZNX05PRElTQ0FSRCBbW2NsYW5nOjp3YXJuX3VudXNlZF9yZXN1bHRdXQorI2Vsc2UKKyNkZWZpbmUgTExWTV9OT0RJU0NBUkQKKyNlbmRpZgorCisvLyBTb21lIGNvbXBpbGVycyB3YXJuIGFib3V0IHVudXNlZCBmdW5jdGlvbnMuIFdoZW4gYSBmdW5jdGlvbiBpcyBzb21ldGltZXMKKy8vIHVzZWQgb3Igbm90IGRlcGVuZGluZyBvbiBidWlsZCBzZXR0aW5ncyAoZS5nLiBhIGZ1bmN0aW9uIG9ubHkgY2FsbGVkIGZyb20KKy8vIHdpdGhpbiAiYXNzZXJ0IiksIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIHN1Y2ggd2FybmluZ3MuCisvLworLy8gSG93ZXZlciwgaXQgc2hvdWxkbid0IGJlIHVzZWQgZm9yIHVudXNlZCAqdmFyaWFibGVzKiwgYXMgdGhvc2UgaGF2ZSBhIG11Y2gKKy8vIG1vcmUgcG9ydGFibGUgc29sdXRpb246CisvLyAgICh2b2lkKXVudXNlZF92YXJfbmFtZTsKKy8vIFByZWZlciBjYXN0LXRvLXZvaWQgd2hlcmV2ZXIgaXQgaXMgc3VmZmljaWVudC4KKyNpZiBfX2hhc19hdHRyaWJ1dGUodW51c2VkKSB8fCBMTFZNX0dOVUNfUFJFUkVRKDMsIDEsIDApCisjZGVmaW5lIExMVk1fQVRUUklCVVRFX1VOVVNFRCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKKyNlbHNlCisjZGVmaW5lIExMVk1fQVRUUklCVVRFX1VOVVNFRAorI2VuZGlmCisKKy8vIEZJWE1FOiBQcm92aWRlIHRoaXMgZm9yIFBFL0NPRkYgdGFyZ2V0cy4KKyNpZiAoX19oYXNfYXR0cmlidXRlKHdlYWspIHx8IExMVk1fR05VQ19QUkVSRVEoNCwgMCwgMCkpICYmICAgICAgICAgICAgICAgICAgICBcCisgICAgKCFkZWZpbmVkKF9fTUlOR1czMl9fKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKSAmJiAhZGVmaW5lZChMTFZNX09OX1dJTjMyKSkKKyNkZWZpbmUgTExWTV9BVFRSSUJVVEVfV0VBSyBfX2F0dHJpYnV0ZV9fKChfX3dlYWtfXykpCisjZWxzZQorI2RlZmluZSBMTFZNX0FUVFJJQlVURV9XRUFLCisjZW5kaWYKKworLy8gUHJpb3IgdG8gY2xhbmcgMy4yLCBjbGFuZyBkaWQgbm90IGFjY2VwdCBhbnkgc3BlbGxpbmcgb2YKKy8vIF9faGFzX2F0dHJpYnV0ZShjb25zdCksIHNvIGFzc3VtZSBpdCBpcyBzdXBwb3J0ZWQuCisjaWYgZGVmaW5lZChfX2NsYW5nX18pIHx8IGRlZmluZWQoX19HTlVDX18pCisvLyBha2EgJ0NPTlNUJyBidXQgZm9sbG93aW5nIExMVk0gQ29udmVudGlvbnMuCisjZGVmaW5lIExMVk1fUkVBRE5PTkUgX19hdHRyaWJ1dGVfXygoX19jb25zdF9fKSkKKyNlbHNlCisjZGVmaW5lIExMVk1fUkVBRE5PTkUKKyNlbmRpZgorCisjaWYgX19oYXNfYXR0cmlidXRlKHB1cmUpIHx8IGRlZmluZWQoX19HTlVDX18pCisvLyBha2EgJ1BVUkUnIGJ1dCBmb2xsb3dpbmcgTExWTSBDb252ZW50aW9ucy4KKyNkZWZpbmUgTExWTV9SRUFET05MWSBfX2F0dHJpYnV0ZV9fKChfX3B1cmVfXykpCisjZWxzZQorI2RlZmluZSBMTFZNX1JFQURPTkxZCisjZW5kaWYKKworI2lmIF9faGFzX2J1aWx0aW4oX19idWlsdGluX2V4cGVjdCkgfHwgTExWTV9HTlVDX1BSRVJFUSg0LCAwLCAwKQorI2RlZmluZSBMTFZNX0xJS0VMWShFWFBSKSBfX2J1aWx0aW5fZXhwZWN0KChib29sKShFWFBSKSwgdHJ1ZSkKKyNkZWZpbmUgTExWTV9VTkxJS0VMWShFWFBSKSBfX2J1aWx0aW5fZXhwZWN0KChib29sKShFWFBSKSwgZmFsc2UpCisjZWxzZQorI2RlZmluZSBMTFZNX0xJS0VMWShFWFBSKSAoRVhQUikKKyNkZWZpbmUgTExWTV9VTkxJS0VMWShFWFBSKSAoRVhQUikKKyNlbmRpZgorCisvLy8gTExWTV9BVFRSSUJVVEVfTk9JTkxJTkUgLSBPbiBjb21waWxlcnMgd2hlcmUgd2UgaGF2ZSBhIGRpcmVjdGl2ZSB0byBkbyBzbywKKy8vLyBtYXJrIGEgbWV0aG9kICJub3QgZm9yIGlubGluaW5nIi4KKyNpZiBfX2hhc19hdHRyaWJ1dGUobm9pbmxpbmUpIHx8IExMVk1fR05VQ19QUkVSRVEoMywgNCwgMCkKKyNkZWZpbmUgTExWTV9BVFRSSUJVVEVfTk9JTkxJTkUgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgTExWTV9BVFRSSUJVVEVfTk9JTkxJTkUgX19kZWNsc3BlYyhub2lubGluZSkKKyNlbHNlCisjZGVmaW5lIExMVk1fQVRUUklCVVRFX05PSU5MSU5FCisjZW5kaWYKKworLy8vIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgLSBPbiBjb21waWxlcnMgd2hlcmUgd2UgaGF2ZSBhIGRpcmVjdGl2ZSB0byBkbworLy8vIHNvLCBtYXJrIGEgbWV0aG9kICJhbHdheXMgaW5saW5lIiBiZWNhdXNlIGl0IGlzIHBlcmZvcm1hbmNlIHNlbnNpdGl2ZS4gR0NDCisvLy8gMy40IHN1cHBvcnRlZCB0aGlzIGJ1dCBpcyBidWdneSBpbiB2YXJpb3VzIGNhc2VzIGFuZCBwcm9kdWNlcyB1bmltcGxlbWVudGVkCisvLy8gZXJyb3JzLCBqdXN0IHVzZSBpdCBpbiBHQ0MgNC4wIGFuZCBsYXRlci4KKyNpZiBfX2hhc19hdHRyaWJ1dGUoYWx3YXlzX2lubGluZSkgfHwgTExWTV9HTlVDX1BSRVJFUSg0LCAwLCAwKQorI2RlZmluZSBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUpKQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBfX2ZvcmNlaW5saW5lCisjZWxzZQorI2RlZmluZSBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIExMVk1fQVRUUklCVVRFX05PUkVUVVJOIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIExMVk1fQVRUUklCVVRFX05PUkVUVVJOIF9fZGVjbHNwZWMobm9yZXR1cm4pCisjZWxzZQorI2RlZmluZSBMTFZNX0FUVFJJQlVURV9OT1JFVFVSTgorI2VuZGlmCisKKyNpZiBfX2hhc19hdHRyaWJ1dGUocmV0dXJuc19ub25udWxsKSB8fCBMTFZNX0dOVUNfUFJFUkVRKDQsIDksIDApCisjZGVmaW5lIExMVk1fQVRUUklCVVRFX1JFVFVSTlNfTk9OTlVMTCBfX2F0dHJpYnV0ZV9fKChyZXR1cm5zX25vbm51bGwpKQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgTExWTV9BVFRSSUJVVEVfUkVUVVJOU19OT05OVUxMIF9SZXRfbm90bnVsbF8KKyNlbHNlCisjZGVmaW5lIExMVk1fQVRUUklCVVRFX1JFVFVSTlNfTk9OTlVMTAorI2VuZGlmCisKKy8vLyBcbWFjcm8gTExWTV9BVFRSSUJVVEVfUkVUVVJOU19OT0FMSUFTIFVzZWQgdG8gbWFyayBhIGZ1bmN0aW9uIGFzIHJldHVybmluZyBhCisvLy8gcG9pbnRlciB0aGF0IGRvZXMgbm90IGFsaWFzIGFueSBvdGhlciB2YWxpZCBwb2ludGVyLgorI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIExMVk1fQVRUUklCVVRFX1JFVFVSTlNfTk9BTElBUyBfX2F0dHJpYnV0ZV9fKChfX21hbGxvY19fKSkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIExMVk1fQVRUUklCVVRFX1JFVFVSTlNfTk9BTElBUyBfX2RlY2xzcGVjKHJlc3RyaWN0KQorI2Vsc2UKKyNkZWZpbmUgTExWTV9BVFRSSUJVVEVfUkVUVVJOU19OT0FMSUFTCisjZW5kaWYKKworLy8vIExMVk1fRkFMTFRIUk9VR0ggLSBNYXJrIGZhbGx0aHJvdWdoIGNhc2VzIGluIHN3aXRjaCBzdGF0ZW1lbnRzLgorI2lmIF9fY3BsdXNwbHVzID4gMjAxNDAyTCAmJiBfX2hhc19jcHBfYXR0cmlidXRlKGZhbGx0aHJvdWdoKQorI2RlZmluZSBMTFZNX0ZBTExUSFJPVUdIIFtbZmFsbHRocm91Z2hdXQorI2VsaWYgX19oYXNfY3BwX2F0dHJpYnV0ZShnbnU6OmZhbGx0aHJvdWdoKQorI2RlZmluZSBMTFZNX0ZBTExUSFJPVUdIIFtbZ251OjpmYWxsdGhyb3VnaF1dCisjZWxpZiAhX19jcGx1c3BsdXMKKy8vIFdvcmthcm91bmQgZm9yIGxsdm0ub3JnL1BSMjM0MzUsIHNpbmNlIGNsYW5nIDMuNiBhbmQgYmVsb3cgZW1pdCBhIHNwdXJpb3VzCisvLyBlcnJvciB3aGVuIF9faGFzX2NwcF9hdHRyaWJ1dGUgaXMgZ2l2ZW4gYSBzY29wZWQgYXR0cmlidXRlIGluIEMgbW9kZS4KKyNkZWZpbmUgTExWTV9GQUxMVEhST1VHSAorI2VsaWYgX19oYXNfY3BwX2F0dHJpYnV0ZShjbGFuZzo6ZmFsbHRocm91Z2gpCisjZGVmaW5lIExMVk1fRkFMTFRIUk9VR0ggW1tjbGFuZzo6ZmFsbHRocm91Z2hdXQorI2Vsc2UKKyNkZWZpbmUgTExWTV9GQUxMVEhST1VHSAorI2VuZGlmCisKKy8vLyBMTFZNX0VYVEVOU0lPTiAtIFN1cHBvcnQgY29tcGlsZXJzIHdoZXJlIHdlIGhhdmUgYSBrZXl3b3JkIHRvIHN1cHByZXNzCisvLy8gcGVkYW50aWMgZGlhZ25vc3RpY3MuCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgTExWTV9FWFRFTlNJT04gX19leHRlbnNpb25fXworI2Vsc2UKKyNkZWZpbmUgTExWTV9FWFRFTlNJT04KKyNlbmRpZgorCisvLyBMTFZNX0FUVFJJQlVURV9ERVBSRUNBVEVEKGRlY2wsICJtZXNzYWdlIikKKyNpZiBfX2hhc19mZWF0dXJlKGF0dHJpYnV0ZV9kZXByZWNhdGVkX3dpdGhfbWVzc2FnZSkKKyMgZGVmaW5lIExMVk1fQVRUUklCVVRFX0RFUFJFQ0FURUQoZGVjbCwgbWVzc2FnZSkgXAorICBkZWNsIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQobWVzc2FnZSkpKQorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKKyMgZGVmaW5lIExMVk1fQVRUUklCVVRFX0RFUFJFQ0FURUQoZGVjbCwgbWVzc2FnZSkgXAorICBkZWNsIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyMgZGVmaW5lIExMVk1fQVRUUklCVVRFX0RFUFJFQ0FURUQoZGVjbCwgbWVzc2FnZSkgXAorICBfX2RlY2xzcGVjKGRlcHJlY2F0ZWQobWVzc2FnZSkpIGRlY2wKKyNlbHNlCisjIGRlZmluZSBMTFZNX0FUVFJJQlVURV9ERVBSRUNBVEVEKGRlY2wsIG1lc3NhZ2UpIFwKKyAgZGVjbAorI2VuZGlmCisKKy8vLyBMTFZNX0JVSUxUSU5fVU5SRUFDSEFCTEUgLSBPbiBjb21waWxlcnMgd2hpY2ggc3VwcG9ydCBpdCwgZXhwYW5kcworLy8vIHRvIGFuIGV4cHJlc3Npb24gd2hpY2ggc3RhdGVzIHRoYXQgaXQgaXMgdW5kZWZpbmVkIGJlaGF2aW9yIGZvciB0aGUKKy8vLyBjb21waWxlciB0byByZWFjaCB0aGlzIHBvaW50LiAgT3RoZXJ3aXNlIGlzIG5vdCBkZWZpbmVkLgorI2lmIF9faGFzX2J1aWx0aW4oX19idWlsdGluX3VucmVhY2hhYmxlKSB8fCBMTFZNX0dOVUNfUFJFUkVRKDQsIDUsIDApCisjIGRlZmluZSBMTFZNX0JVSUxUSU5fVU5SRUFDSEFCTEUgX19idWlsdGluX3VucmVhY2hhYmxlKCkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjIGRlZmluZSBMTFZNX0JVSUxUSU5fVU5SRUFDSEFCTEUgX19hc3N1bWUoZmFsc2UpCisjZW5kaWYKKworLy8vIExMVk1fQlVJTFRJTl9UUkFQIC0gT24gY29tcGlsZXJzIHdoaWNoIHN1cHBvcnQgaXQsIGV4cGFuZHMgdG8gYW4gZXhwcmVzc2lvbgorLy8vIHdoaWNoIGNhdXNlcyB0aGUgcHJvZ3JhbSB0byBleGl0IGFibm9ybWFsbHkuCisjaWYgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fdHJhcCkgfHwgTExWTV9HTlVDX1BSRVJFUSg0LCAzLCAwKQorIyBkZWZpbmUgTExWTV9CVUlMVElOX1RSQVAgX19idWlsdGluX3RyYXAoKQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKy8vIFRoZSBfX2RlYnVnYnJlYWsgaW50cmluc2ljIGlzIHN1cHBvcnRlZCBieSBNU1ZDLCBkb2VzIG5vdCByZXF1aXJlIGZvcndhcmQKKy8vIGRlY2xhcmF0aW9ucyBpbnZvbHZpbmcgcGxhdGZvcm0tc3BlY2lmaWMgdHlwZWRlZnMgKHVubGlrZSBSYWlzZUV4Y2VwdGlvbiksCisvLyByZXN1bHRzIGluIGEgY2FsbCB0byB2ZWN0b3JlZCBleGNlcHRpb24gaGFuZGxlcnMsIGFuZCBlbmNvZGVzIHRvIGEgc2hvcnQKKy8vIGluc3RydWN0aW9uIHRoYXQgc3RpbGwgY2F1c2VzIHRoZSB0cmFwcGluZyBiZWhhdmlvciB3ZSB3YW50LgorIyBkZWZpbmUgTExWTV9CVUlMVElOX1RSQVAgX19kZWJ1Z2JyZWFrKCkKKyNlbHNlCisjIGRlZmluZSBMTFZNX0JVSUxUSU5fVFJBUCAqKHZvbGF0aWxlIGludCopMHgxMSA9IDAKKyNlbmRpZgorCisvLy8gTExWTV9CVUlMVElOX0RFQlVHVFJBUCAtIE9uIGNvbXBpbGVycyB3aGljaCBzdXBwb3J0IGl0LCBleHBhbmRzIHRvCisvLy8gYW4gZXhwcmVzc2lvbiB3aGljaCBjYXVzZXMgdGhlIHByb2dyYW0gdG8gYnJlYWsgd2hpbGUgcnVubmluZworLy8vIHVuZGVyIGEgZGVidWdnZXIuCisjaWYgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fZGVidWd0cmFwKQorIyBkZWZpbmUgTExWTV9CVUlMVElOX0RFQlVHVFJBUCBfX2J1aWx0aW5fZGVidWd0cmFwKCkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisvLyBUaGUgX19kZWJ1Z2JyZWFrIGludHJpbnNpYyBpcyBzdXBwb3J0ZWQgYnkgTVNWQyBhbmQgYnJlYWtzIHdoaWxlCisvLyBydW5uaW5nIHVuZGVyIHRoZSBkZWJ1Z2dlciwgYW5kIGFsc28gc3VwcG9ydHMgaW52b2tpbmcgYSBkZWJ1Z2dlcgorLy8gd2hlbiB0aGUgT1MgaXMgY29uZmlndXJlZCBhcHByb3ByaWF0ZWx5LgorIyBkZWZpbmUgTExWTV9CVUlMVElOX0RFQlVHVFJBUCBfX2RlYnVnYnJlYWsoKQorI2Vsc2UKKy8vIEp1c3QgY29udGludWUgZXhlY3V0aW9uIHdoZW4gYnVpbHQgd2l0aCBjb21waWxlcnMgdGhhdCBoYXZlIG5vCisvLyBzdXBwb3J0LiBUaGlzIGlzIGEgZGVidWdnaW5nIGFpZCBhbmQgbm90IGludGVuZGVkIHRvIGZvcmNlIHRoZQorLy8gcHJvZ3JhbSB0byBhYm9ydCBpZiBlbmNvdW50ZXJlZC4KKyMgZGVmaW5lIExMVk1fQlVJTFRJTl9ERUJVR1RSQVAKKyNlbmRpZgorCisvLy8gXG1hY3JvIExMVk1fQVNTVU1FX0FMSUdORUQKKy8vLyBcYnJpZWYgUmV0dXJucyBhIHBvaW50ZXIgd2l0aCBhbiBhc3N1bWVkIGFsaWdubWVudC4KKyNpZiBfX2hhc19idWlsdGluKF9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZCkgfHwgTExWTV9HTlVDX1BSRVJFUSg0LCA3LCAwKQorIyBkZWZpbmUgTExWTV9BU1NVTUVfQUxJR05FRChwLCBhKSBfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQocCwgYSkKKyNlbGlmIGRlZmluZWQoTExWTV9CVUlMVElOX1VOUkVBQ0hBQkxFKQorLy8gQXMgb2YgdG9kYXksIGNsYW5nIGRvZXMgbm90IHN1cHBvcnQgX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkLgorIyBkZWZpbmUgTExWTV9BU1NVTUVfQUxJR05FRChwLCBhKSBcCisgICAgICAgICAgICgoKHVpbnRwdHJfdChwKSAlIChhKSkgPT0gMCkgPyAocCkgOiAoTExWTV9CVUlMVElOX1VOUkVBQ0hBQkxFLCAocCkpKQorI2Vsc2UKKyMgZGVmaW5lIExMVk1fQVNTVU1FX0FMSUdORUQocCwgYSkgKHApCisjZW5kaWYKKworLy8vIFxtYWNybyBMTFZNX0FMSUdOQVMKKy8vLyBcYnJpZWYgVXNlZCB0byBzcGVjaWZ5IGEgbWluaW11bSBhbGlnbm1lbnQgZm9yIGEgc3RydWN0dXJlIG9yIHZhcmlhYmxlLgorI2lmIF9fR05VQ19fICYmICFfX2hhc19mZWF0dXJlKGN4eF9hbGlnbmFzKSAmJiAhTExWTV9HTlVDX1BSRVJFUSg0LCA4LCAxKQorIyBkZWZpbmUgTExWTV9BTElHTkFTKHgpIF9fYXR0cmlidXRlX18oKGFsaWduZWQoeCkpKQorI2Vsc2UKKyMgZGVmaW5lIExMVk1fQUxJR05BUyh4KSBhbGlnbmFzKHgpCisjZW5kaWYKKworLy8vIFxtYWNybyBMTFZNX1BBQ0tFRAorLy8vIFxicmllZiBVc2VkIHRvIHNwZWNpZnkgYSBwYWNrZWQgc3RydWN0dXJlLgorLy8vIExMVk1fUEFDS0VEKAorLy8vICAgIHN0cnVjdCBBIHsKKy8vLyAgICAgIGludCBpOworLy8vICAgICAgaW50IGo7CisvLy8gICAgICBpbnQgazsKKy8vLyAgICAgIGxvbmcgbG9uZyBsOworLy8vICAgfSk7CisvLy8KKy8vLyBMTFZNX1BBQ0tFRF9TVEFSVAorLy8vIHN0cnVjdCBCIHsKKy8vLyAgIGludCBpOworLy8vICAgaW50IGo7CisvLy8gICBpbnQgazsKKy8vLyAgIGxvbmcgbG9uZyBsOworLy8vIH07CisvLy8gTExWTV9QQUNLRURfRU5ECisjaWZkZWYgX01TQ19WRVIKKyMgZGVmaW5lIExMVk1fUEFDS0VEKGQpIF9fcHJhZ21hKHBhY2socHVzaCwgMSkpIGQgX19wcmFnbWEocGFjayhwb3ApKQorIyBkZWZpbmUgTExWTV9QQUNLRURfU1RBUlQgX19wcmFnbWEocGFjayhwdXNoLCAxKSkKKyMgZGVmaW5lIExMVk1fUEFDS0VEX0VORCAgIF9fcHJhZ21hKHBhY2socG9wKSkKKyNlbHNlCisjIGRlZmluZSBMTFZNX1BBQ0tFRChkKSBkIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCisjIGRlZmluZSBMTFZNX1BBQ0tFRF9TVEFSVCBfUHJhZ21hKCJwYWNrKHB1c2gsIDEpIikKKyMgZGVmaW5lIExMVk1fUEFDS0VEX0VORCAgIF9QcmFnbWEoInBhY2socG9wKSIpCisjZW5kaWYKKworLy8vIFxtYWNybyBMTFZNX1BUUl9TSVpFCisvLy8gXGJyaWVmIEEgY29uc3RhbnQgaW50ZWdlciBlcXVpdmFsZW50IHRvIHRoZSB2YWx1ZSBvZiBzaXplb2Yodm9pZCopLgorLy8vIEdlbmVyYWxseSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggTExWTV9BTElHTkFTIG9yIHdoZW4gZG9pbmcgY29tcHV0YXRpb24gaW4KKy8vLyB0aGUgcHJlcHJvY2Vzc29yLgorI2lmZGVmIF9fU0laRU9GX1BPSU5URVJfXworIyBkZWZpbmUgTExWTV9QVFJfU0laRSBfX1NJWkVPRl9QT0lOVEVSX18KKyNlbGlmIGRlZmluZWQoX1dJTjY0KQorIyBkZWZpbmUgTExWTV9QVFJfU0laRSA4CisjZWxpZiBkZWZpbmVkKF9XSU4zMikKKyMgZGVmaW5lIExMVk1fUFRSX1NJWkUgNAorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyMgZXJyb3IgImNvdWxkIG5vdCBkZXRlcm1pbmUgTExWTV9QVFJfU0laRSBhcyBhIGNvbnN0YW50IGludCBmb3IgTVNWQyIKKyNlbHNlCisjIGRlZmluZSBMTFZNX1BUUl9TSVpFIHNpemVvZih2b2lkICopCisjZW5kaWYKKworLy8vIFxtYWNybyBMTFZNX01FTU9SWV9TQU5JVElaRVJfQlVJTEQKKy8vLyBcYnJpZWYgV2hldGhlciBMTFZNIGl0c2VsZiBpcyBidWlsdCB3aXRoIE1lbW9yeVNhbml0aXplciBpbnN0cnVtZW50YXRpb24uCisjaWYgX19oYXNfZmVhdHVyZShtZW1vcnlfc2FuaXRpemVyKQorIyBkZWZpbmUgTExWTV9NRU1PUllfU0FOSVRJWkVSX0JVSUxEIDEKKyMgaW5jbHVkZSA8c2FuaXRpemVyL21zYW5faW50ZXJmYWNlLmg+CisjZWxzZQorIyBkZWZpbmUgTExWTV9NRU1PUllfU0FOSVRJWkVSX0JVSUxEIDAKKyMgZGVmaW5lIF9fbXNhbl9hbGxvY2F0ZWRfbWVtb3J5KHAsIHNpemUpCisjIGRlZmluZSBfX21zYW5fdW5wb2lzb24ocCwgc2l6ZSkKKyNlbmRpZgorCisvLy8gXG1hY3JvIExMVk1fQUREUkVTU19TQU5JVElaRVJfQlVJTEQKKy8vLyBcYnJpZWYgV2hldGhlciBMTFZNIGl0c2VsZiBpcyBidWlsdCB3aXRoIEFkZHJlc3NTYW5pdGl6ZXIgaW5zdHJ1bWVudGF0aW9uLgorI2lmIF9faGFzX2ZlYXR1cmUoYWRkcmVzc19zYW5pdGl6ZXIpIHx8IGRlZmluZWQoX19TQU5JVElaRV9BRERSRVNTX18pCisjIGRlZmluZSBMTFZNX0FERFJFU1NfU0FOSVRJWkVSX0JVSUxEIDEKKyMgaW5jbHVkZSA8c2FuaXRpemVyL2FzYW5faW50ZXJmYWNlLmg+CisjZWxzZQorIyBkZWZpbmUgTExWTV9BRERSRVNTX1NBTklUSVpFUl9CVUlMRCAwCisjIGRlZmluZSBfX2FzYW5fcG9pc29uX21lbW9yeV9yZWdpb24ocCwgc2l6ZSkKKyMgZGVmaW5lIF9fYXNhbl91bnBvaXNvbl9tZW1vcnlfcmVnaW9uKHAsIHNpemUpCisjZW5kaWYKKworLy8vIFxtYWNybyBMTFZNX1RIUkVBRF9TQU5JVElaRVJfQlVJTEQKKy8vLyBcYnJpZWYgV2hldGhlciBMTFZNIGl0c2VsZiBpcyBidWlsdCB3aXRoIFRocmVhZFNhbml0aXplciBpbnN0cnVtZW50YXRpb24uCisjaWYgX19oYXNfZmVhdHVyZSh0aHJlYWRfc2FuaXRpemVyKSB8fCBkZWZpbmVkKF9fU0FOSVRJWkVfVEhSRUFEX18pCisjIGRlZmluZSBMTFZNX1RIUkVBRF9TQU5JVElaRVJfQlVJTEQgMQorI2Vsc2UKKyMgZGVmaW5lIExMVk1fVEhSRUFEX1NBTklUSVpFUl9CVUlMRCAwCisjZW5kaWYKKworI2lmIExMVk1fVEhSRUFEX1NBTklUSVpFUl9CVUlMRAorLy8gVGhyZWFkIFNhbml0aXplciBpcyBhIHRvb2wgdGhhdCBmaW5kcyByYWNlcyBpbiBjb2RlLgorLy8gU2VlIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9kYXRhLXJhY2UtdGVzdC93aWtpL0R5bmFtaWNBbm5vdGF0aW9ucyAuCisvLyB0c2FuIGRldGVjdHMgdGhlc2UgZXhhY3QgZnVuY3Rpb25zIGJ5IG5hbWUuCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCit2b2lkIEFubm90YXRlSGFwcGVuc0FmdGVyKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCB2b2xhdGlsZSB2b2lkICpjdik7Cit2b2lkIEFubm90YXRlSGFwcGVuc0JlZm9yZShjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3Qgdm9sYXRpbGUgdm9pZCAqY3YpOwordm9pZCBBbm5vdGF0ZUlnbm9yZVdyaXRlc0JlZ2luKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKTsKK3ZvaWQgQW5ub3RhdGVJZ25vcmVXcml0ZXNFbmQoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLy8gVGhpcyBtYXJrZXIgaXMgdXNlZCB0byBkZWZpbmUgYSBoYXBwZW5zLWJlZm9yZSBhcmMuIFRoZSByYWNlIGRldGVjdG9yIHdpbGwKKy8vIGluZmVyIGFuIGFyYyBmcm9tIHRoZSBiZWdpbiB0byB0aGUgZW5kIHdoZW4gdGhleSBzaGFyZSB0aGUgc2FtZSBwb2ludGVyCisvLyBhcmd1bWVudC4KKyMgZGVmaW5lIFRzYW5IYXBwZW5zQmVmb3JlKGN2KSBBbm5vdGF0ZUhhcHBlbnNCZWZvcmUoX19GSUxFX18sIF9fTElORV9fLCBjdikKKworLy8gVGhpcyBtYXJrZXIgZGVmaW5lcyB0aGUgZGVzdGluYXRpb24gb2YgYSBoYXBwZW5zLWJlZm9yZSBhcmMuCisjIGRlZmluZSBUc2FuSGFwcGVuc0FmdGVyKGN2KSBBbm5vdGF0ZUhhcHBlbnNBZnRlcihfX0ZJTEVfXywgX19MSU5FX18sIGN2KQorCisvLyBJZ25vcmUgYW55IHJhY2VzIG9uIHdyaXRlcyBiZXR3ZWVuIGhlcmUgYW5kIHRoZSBuZXh0IFRzYW5JZ25vcmVXcml0ZXNFbmQuCisjIGRlZmluZSBUc2FuSWdub3JlV3JpdGVzQmVnaW4oKSBBbm5vdGF0ZUlnbm9yZVdyaXRlc0JlZ2luKF9fRklMRV9fLCBfX0xJTkVfXykKKworLy8gUmVzdW1lIGNoZWNraW5nIGZvciByYWN5IHdyaXRlcy4KKyMgZGVmaW5lIFRzYW5JZ25vcmVXcml0ZXNFbmQoKSBBbm5vdGF0ZUlnbm9yZVdyaXRlc0VuZChfX0ZJTEVfXywgX19MSU5FX18pCisjZWxzZQorIyBkZWZpbmUgVHNhbkhhcHBlbnNCZWZvcmUoY3YpCisjIGRlZmluZSBUc2FuSGFwcGVuc0FmdGVyKGN2KQorIyBkZWZpbmUgVHNhbklnbm9yZVdyaXRlc0JlZ2luKCkKKyMgZGVmaW5lIFRzYW5JZ25vcmVXcml0ZXNFbmQoKQorI2VuZGlmCisKKy8vLyBcbWFjcm8gTExWTV9OT19TQU5JVElaRQorLy8vIFxicmllZiBEaXNhYmxlIGEgcGFydGljdWxhciBzYW5pdGl6ZXIgZm9yIGEgZnVuY3Rpb24uCisjaWYgX19oYXNfYXR0cmlidXRlKG5vX3Nhbml0aXplKQorI2RlZmluZSBMTFZNX05PX1NBTklUSVpFKEtJTkQpIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKEtJTkQpKSkKKyNlbHNlCisjZGVmaW5lIExMVk1fTk9fU0FOSVRJWkUoS0lORCkKKyNlbmRpZgorCisvLy8gXGJyaWVmIE1hcmsgZGVidWcgaGVscGVyIGZ1bmN0aW9uIGRlZmluaXRpb25zIGxpa2UgZHVtcCgpIHRoYXQgc2hvdWxkIG5vdCBiZQorLy8vIHN0cmlwcGVkIGZyb20gZGVidWcgYnVpbGRzLgorLy8vIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIGFsc28gc3Vycm91bmQgZHVtcCgpIGZ1bmN0aW9ucyB3aXRoCisvLy8gYCNpZiAhZGVmaW5lZChOREVCVUcpIHx8IGRlZmluZWQoTExWTV9FTkFCTEVfRFVNUClgIHNvIHRoZXkgZG8gYWx3YXlzCisvLy8gZ2V0IHN0cmlwcGVkIGluIHJlbGVhc2UgYnVpbGRzLgorLy8gRklYTUU6IE1vdmUgdGhpcyB0byBhIHByaXZhdGUgY29uZmlnLmggYXMgaXQncyBub3QgdXNhYmxlIGluIHB1YmxpYyBoZWFkZXJzLgorI2lmICFkZWZpbmVkKE5ERUJVRykgfHwgZGVmaW5lZChMTFZNX0VOQUJMRV9EVU1QKQorI2RlZmluZSBMTFZNX0RVTVBfTUVUSE9EIExMVk1fQVRUUklCVVRFX05PSU5MSU5FIExMVk1fQVRUUklCVVRFX1VTRUQKKyNlbHNlCisjZGVmaW5lIExMVk1fRFVNUF9NRVRIT0QgTExWTV9BVFRSSUJVVEVfTk9JTkxJTkUKKyNlbmRpZgorCisvLy8gXG1hY3JvIExMVk1fUFJFVFRZX0ZVTkNUSU9OCisvLy8gXGJyaWVmIEdldHMgYSB1c2VyLWZyaWVuZGx5IGxvb2tpbmcgZnVuY3Rpb24gc2lnbmF0dXJlIGZvciB0aGUgY3VycmVudCBzY29wZQorLy8vIHVzaW5nIHRoZSBiZXN0IGF2YWlsYWJsZSBtZXRob2Qgb24gZWFjaCBwbGF0Zm9ybS4gIFRoZSBleGFjdCBmb3JtYXQgb2YgdGhlCisvLy8gcmVzdWx0aW5nIHN0cmluZyBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBhbmQgbm9uLXBvcnRhYmxlLCBzbyB0aGlzIHNob3VsZAorLy8vIG9ubHkgYmUgdXNlZCwgZm9yIGV4YW1wbGUsIGZvciBsb2dnaW5nIG9yIGRpYWdub3N0aWNzLgorI2lmIGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIExMVk1fUFJFVFRZX0ZVTkNUSU9OIF9fRlVOQ1NJR19fCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykKKyNkZWZpbmUgTExWTV9QUkVUVFlfRlVOQ1RJT04gX19QUkVUVFlfRlVOQ1RJT05fXworI2Vsc2UKKyNkZWZpbmUgTExWTV9QUkVUVFlfRlVOQ1RJT04gX19mdW5jX18KKyNlbmRpZgorCisvLy8gXG1hY3JvIExMVk1fVEhSRUFEX0xPQ0FMCisvLy8gXGJyaWVmIEEgdGhyZWFkLWxvY2FsIHN0b3JhZ2Ugc3BlY2lmaWVyIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggZ2xvYmFscywKKy8vLyBleHRlcm4gZ2xvYmFscywgYW5kIHN0YXRpYyBnbG9iYWxzLgorLy8vCisvLy8gVGhpcyBpcyBlc3NlbnRpYWxseSBhbiBleHRyZW1lbHkgcmVzdHJpY3RlZCBhbmFsb2cgdG8gQysrMTEncyB0aHJlYWRfbG9jYWwKKy8vLyBzdXBwb3J0LCBhbmQgdXNlcyB0aGF0IHdoZW4gYXZhaWxhYmxlLiBIb3dldmVyLCBpdCBmYWxscyBiYWNrIG9uCisvLy8gcGxhdGZvcm0tc3BlY2lmaWMgb3IgdmVuZG9yLXByb3ZpZGVkIGV4dGVuc2lvbnMgd2hlbiBuZWNlc3NhcnkuIFRoZXNlCisvLy8gZXh0ZW5zaW9ucyBkb24ndCBzdXBwb3J0IG1hbnkgb2YgdGhlIEMrKzExIHRocmVhZF9sb2NhbCdzIGZlYXR1cmVzLiBZb3UKKy8vLyBzaG91bGQgb25seSB1c2UgdGhpcyBmb3IgUE9EcyB0aGF0IHlvdSBjYW4gc3RhdGljYWxseSBpbml0aWFsaXplIHRvCisvLy8gc29tZSBjb25zdGFudCB2YWx1ZS4gSW4gYWxtb3N0IGFsbCBjaXJjdW1zdGFuY2VzIHRoaXMgaXMgbW9zdCBhcHByb3ByaWF0ZQorLy8vIGZvciB1c2Ugd2l0aCBhIHBvaW50ZXIsIGludGVnZXIsIG9yIHNtYWxsIGFnZ3JlZ2F0aW9uIG9mIHBvaW50ZXJzIGFuZAorLy8vIGludGVnZXJzLgorI2lmIExMVk1fRU5BQkxFX1RIUkVBRFMKKyNpZiBfX2hhc19mZWF0dXJlKGN4eF90aHJlYWRfbG9jYWwpCisjZGVmaW5lIExMVk1fVEhSRUFEX0xPQ0FMIHRocmVhZF9sb2NhbAorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKy8vIE1TVkMgc3VwcG9ydHMgdGhpcyB3aXRoIGEgX19kZWNsc3BlYy4KKyNkZWZpbmUgTExWTV9USFJFQURfTE9DQUwgX19kZWNsc3BlYyh0aHJlYWQpCisjZWxzZQorLy8gQ2xhbmcsIEdDQywgYW5kIG90aGVyIGNvbXBhdGlibGUgY29tcGlsZXJzIHVzZWQgX190aHJlYWQgcHJpb3IgdG8gQysrMTEgYW5kCisvLyB3ZSBvbmx5IG5lZWQgdGhlIHJlc3RyaWN0ZWQgZnVuY3Rpb25hbGl0eSB0aGF0IHByb3ZpZGVzLgorI2RlZmluZSBMTFZNX1RIUkVBRF9MT0NBTCBfX3RocmVhZAorI2VuZGlmCisjZWxzZSAvLyAhTExWTV9FTkFCTEVfVEhSRUFEUworLy8gSWYgdGhyZWFkaW5nIGlzIGRpc2FibGVkIGVudGlyZWx5LCB0aGlzIGNvbXBpbGVzIHRvIG5vdGhpbmcgYW5kIHlvdSBnZXQKKy8vIGEgbm9ybWFsIGdsb2JhbCB2YXJpYWJsZS4KKyNkZWZpbmUgTExWTV9USFJFQURfTE9DQUwKKyNlbmRpZgorCisvLy8gXG1hY3JvIExMVk1fRU5BQkxFX0VYQ0VQVElPTlMKKy8vLyBcYnJpZWYgV2hldGhlciBMTFZNIGlzIGJ1aWx0IHdpdGggZXhjZXB0aW9uIHN1cHBvcnQuCisjaWYgX19oYXNfZmVhdHVyZShjeHhfZXhjZXB0aW9ucykKKyNkZWZpbmUgTExWTV9FTkFCTEVfRVhDRVBUSU9OUyAxCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fRVhDRVBUSU9OUykKKyNkZWZpbmUgTExWTV9FTkFCTEVfRVhDRVBUSU9OUyAxCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9DUFBVTldJTkQpCisjZGVmaW5lIExMVk1fRU5BQkxFX0VYQ0VQVElPTlMgMQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZW1hbmdsZS9EZW1hbmdsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZW1hbmdsZS9EZW1hbmdsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZWI1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlbWFuZ2xlL0RlbWFuZ2xlLmgKQEAgLTAsMCArMSwyOCBAQAorLy89PT0tLS0gRGVtYW5nbGUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBsbHZtIHsKKy8vLyBUaGlzIGlzIGEgbGx2bSBsb2NhbCB2ZXJzaW9uIG9mIF9fY3hhX2RlbWFuZ2xlLiBPdGhlciB0aGFuIHRoZSBuYW1lIGFuZAorLy8vIGJlaW5nIGluIHRoZSBsbHZtIG5hbWVzcGFjZSBpdCBpcyBpZGVudGljYWwuCisvLy8KKy8vLyBUaGUgbWFuZ2xlZF9uYW1lIGlzIGRlbWFuZ2xlZCBpbnRvIGJ1ZiBhbmQgcmV0dXJuZWQuIElmIHRoZSBidWZmZXIgaXMgbm90CisvLy8gbGFyZ2UgZW5vdWdoLCByZWFsbG9jIGlzIHVzZWQgdG8gZXhwYW5kIGl0LgorLy8vCisvLy8gVGhlICpzdGF0dXMgd2lsbCBiZSBzZXQgdG8KKy8vLyAgIHVua25vd25fZXJyb3I6IC00CisvLy8gICBpbnZhbGlkX2FyZ3M6ICAtMworLy8vICAgaW52YWxpZF9tYW5nbGVkX25hbWU6IC0yCisvLy8gICBtZW1vcnlfYWxsb2NfZmFpbHVyZTogLTEKKy8vLyAgIHN1Y2Nlc3M6IDAKKworY2hhciAqaXRhbml1bURlbWFuZ2xlKGNvbnN0IGNoYXIgKm1hbmdsZWRfbmFtZSwgY2hhciAqYnVmLCBzaXplX3QgKm4sCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvRXhlY3V0aW9uRW5naW5lLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTMyNjg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvRXhlY3V0aW9uRW5naW5lLmgKQEAgLTAsMCArMSw2NjcgQEAKKy8vPT09LSBFeGVjdXRpb25FbmdpbmUuaCAtIEFic3RyYWN0IEV4ZWN1dGlvbiBFbmdpbmUgSW50ZXJmYWNlIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGFic3RyYWN0IGludGVyZmFjZSB0aGF0IGltcGxlbWVudHMgZXhlY3V0aW9uIHN1cHBvcnQKKy8vIGZvciBMTFZNLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfRVhFQ1VUSU9ORU5HSU5FX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfRVhFQ1VUSU9ORU5HSU5FX0gKKworI2luY2x1ZGUgImxsdm0tYy9FeGVjdXRpb25FbmdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RhdGFMYXlvdXQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0JpbmFyeS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DQmluZGluZ1dyYXBwaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvZGVHZW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NdXRleC5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ29uc3RhbnQ7CitjbGFzcyBGdW5jdGlvbjsKK3N0cnVjdCBHZW5lcmljVmFsdWU7CitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIEdsb2JhbFZhcmlhYmxlOworY2xhc3MgSklURXZlbnRMaXN0ZW5lcjsKK2NsYXNzIE1DSklUTWVtb3J5TWFuYWdlcjsKK2NsYXNzIE9iamVjdENhY2hlOworY2xhc3MgUlREeWxkTWVtb3J5TWFuYWdlcjsKK2NsYXNzIFRyaXBsZTsKK2NsYXNzIFR5cGU7CisKK25hbWVzcGFjZSBvYmplY3QgeworCitjbGFzcyBBcmNoaXZlOworY2xhc3MgT2JqZWN0RmlsZTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9iamVjdAorCisvLy8gXGJyaWVmIEhlbHBlciBjbGFzcyBmb3IgaGVscGluZyBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlIGdsb2JhbCBhZGRyZXNzIG1hcAorLy8vIHRhYmxlLiAgQWNjZXNzIHRvIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHNlcmlhbGl6ZWQgdW5kZXIgYSBtdXRleC4KK2NsYXNzIEV4ZWN1dGlvbkVuZ2luZVN0YXRlIHsKK3B1YmxpYzoKKyAgdXNpbmcgR2xvYmFsQWRkcmVzc01hcFR5ID0gU3RyaW5nTWFwPHVpbnQ2NF90PjsKKworcHJpdmF0ZToKKyAgLy8vIEdsb2JhbEFkZHJlc3NNYXAgLSBBIG1hcHBpbmcgYmV0d2VlbiBMTFZNIGdsb2JhbCBzeW1ib2wgbmFtZXMgdmFsdWVzIGFuZAorICAvLy8gdGhlaXIgYWN0dWFsaXplZCB2ZXJzaW9uLi4uCisgIEdsb2JhbEFkZHJlc3NNYXBUeSBHbG9iYWxBZGRyZXNzTWFwOworCisgIC8vLyBHbG9iYWxBZGRyZXNzUmV2ZXJzZU1hcCAtIFRoaXMgaXMgdGhlIHJldmVyc2UgbWFwcGluZyBvZiBHbG9iYWxBZGRyZXNzTWFwLAorICAvLy8gdXNlZCB0byBjb252ZXJ0IHJhdyBhZGRyZXNzZXMgaW50byB0aGUgTExWTSBnbG9iYWwgdmFsdWUgdGhhdCBpcyBlbWl0dGVkCisgIC8vLyBhdCB0aGUgYWRkcmVzcy4gIFRoaXMgbWFwIGlzIG5vdCBjb21wdXRlZCB1bmxlc3MgZ2V0R2xvYmFsVmFsdWVBdEFkZHJlc3MKKyAgLy8vIGlzIGNhbGxlZCBhdCBzb21lIHBvaW50LgorICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjpzdHJpbmc+IEdsb2JhbEFkZHJlc3NSZXZlcnNlTWFwOworCitwdWJsaWM6CisgIEdsb2JhbEFkZHJlc3NNYXBUeSAmZ2V0R2xvYmFsQWRkcmVzc01hcCgpIHsKKyAgICByZXR1cm4gR2xvYmFsQWRkcmVzc01hcDsKKyAgfQorCisgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnN0cmluZz4gJmdldEdsb2JhbEFkZHJlc3NSZXZlcnNlTWFwKCkgeworICAgIHJldHVybiBHbG9iYWxBZGRyZXNzUmV2ZXJzZU1hcDsKKyAgfQorCisgIC8vLyBcYnJpZWYgRXJhc2UgYW4gZW50cnkgZnJvbSB0aGUgbWFwcGluZyB0YWJsZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBUaGUgYWRkcmVzcyB0aGF0IFxwIFRvVW5tYXAgd2FzIGhhcHBlZCB0by4KKyAgdWludDY0X3QgUmVtb3ZlTWFwcGluZyhTdHJpbmdSZWYgTmFtZSk7Cit9OworCit1c2luZyBGdW5jdGlvbkNyZWF0b3IgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQgKihjb25zdCBzdGQ6OnN0cmluZyAmKT47CisKKy8vLyBcYnJpZWYgQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBpbXBsZW1lbnRhdGlvbiBleGVjdXRpb24gb2YgTExWTSBtb2R1bGVzLAorLy8vIGRlc2lnbmVkIHRvIHN1cHBvcnQgYm90aCBpbnRlcnByZXRlciBhbmQganVzdC1pbi10aW1lIChKSVQpIGNvbXBpbGVyCisvLy8gaW1wbGVtZW50YXRpb25zLgorY2xhc3MgRXhlY3V0aW9uRW5naW5lIHsKKyAgLy8vIFRoZSBzdGF0ZSBvYmplY3QgaG9sZGluZyB0aGUgZ2xvYmFsIGFkZHJlc3MgbWFwcGluZywgd2hpY2ggbXVzdCBiZQorICAvLy8gYWNjZXNzZWQgc3luY2hyb25vdXNseS4KKyAgLy8KKyAgLy8gRklYTUU6IFRoZXJlIGlzIG5vIHBhcnRpY3VsYXIgbmVlZCB0aGUgZW50aXJlIG1hcCBuZWVkcyB0byBiZQorICAvLyBzeW5jaHJvbml6ZWQuICBXb3VsZG4ndCBhIHJlYWRlci13cml0ZXIgZGVzaWduIGJlIGJldHRlciBoZXJlPworICBFeGVjdXRpb25FbmdpbmVTdGF0ZSBFRVN0YXRlOworCisgIC8vLyBUaGUgdGFyZ2V0IGRhdGEgZm9yIHRoZSBwbGF0Zm9ybSBmb3Igd2hpY2ggZXhlY3V0aW9uIGlzIGJlaW5nIHBlcmZvcm1lZC4KKyAgLy8vCisgIC8vLyBOb3RlOiB0aGUgRGF0YUxheW91dCBpcyBMTFZNQ29udGV4dCBzcGVjaWZpYyBiZWNhdXNlIGl0IGhhcyBhbgorICAvLy8gaW50ZXJuYWwgY2FjaGUgYmFzZWQgb24gdHlwZSBwb2ludGVycy4gSXQgbWFrZXMgdW5zYWZlIHRvIHJldXNlIHRoZQorICAvLy8gRXhlY3V0aW9uRW5naW5lIGFjcm9zcyBjb250ZXh0LCB3ZSBkb24ndCBlbmZvcmNlIHRoaXMgcnVsZSBidXQgdW5kZWZpbmVkCisgIC8vLyBiZWhhdmlvciBjYW4gb2NjdXJzIGlmIHRoZSB1c2VyIHRyaWVzIHRvIGRvIGl0LgorICBjb25zdCBEYXRhTGF5b3V0IERMOworCisgIC8vLyBXaGV0aGVyIGxhenkgSklUIGNvbXBpbGF0aW9uIGlzIGVuYWJsZWQuCisgIGJvb2wgQ29tcGlsaW5nTGF6aWx5OworCisgIC8vLyBXaGV0aGVyIEpJVCBjb21waWxhdGlvbiBvZiBleHRlcm5hbCBnbG9iYWwgdmFyaWFibGVzIGlzIGFsbG93ZWQuCisgIGJvb2wgR1ZDb21waWxhdGlvbkRpc2FibGVkOworCisgIC8vLyBXaGV0aGVyIHRoZSBKSVQgc2hvdWxkIHBlcmZvcm0gbG9va3VwcyBvZiBleHRlcm5hbCBzeW1ib2xzIChlLmcuLAorICAvLy8gdXNpbmcgZGxzeW0pLgorICBib29sIFN5bWJvbFNlYXJjaGluZ0Rpc2FibGVkOworCisgIC8vLyBXaGV0aGVyIHRoZSBKSVQgc2hvdWxkIHZlcmlmeSBJUiBtb2R1bGVzIGR1cmluZyBjb21waWxhdGlvbi4KKyAgYm9vbCBWZXJpZnlNb2R1bGVzOworCisgIGZyaWVuZCBjbGFzcyBFbmdpbmVCdWlsZGVyOyAgLy8gVG8gYWxsb3cgYWNjZXNzIHRvIEpJVEN0b3IgYW5kIEludGVycEN0b3IuCisKK3Byb3RlY3RlZDoKKyAgLy8vIFRoZSBsaXN0IG9mIE1vZHVsZXMgdGhhdCB3ZSBhcmUgSklUJ2luZyBmcm9tLiAgV2UgdXNlIGEgU21hbGxWZWN0b3IgdG8KKyAgLy8vIG9wdGltaXplIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBvbmx5IG9uZSBtb2R1bGUuCisgIFNtYWxsVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+LCAxPiBNb2R1bGVzOworCisgIC8vLyBnZXRNZW1vcnlmb3JHViAtIEFsbG9jYXRlIG1lbW9yeSBmb3IgYSBnbG9iYWwgdmFyaWFibGUuCisgIHZpcnR1YWwgY2hhciAqZ2V0TWVtb3J5Rm9yR1YoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWKTsKKworICBzdGF0aWMgRXhlY3V0aW9uRW5naW5lICooKk1DSklUQ3RvcikoCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNLCBzdGQ6OnN0cmluZyAqRXJyb3JTdHIsCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8TUNKSVRNZW1vcnlNYW5hZ2VyPiBNTSwKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMZWdhY3lKSVRTeW1ib2xSZXNvbHZlcj4gU1IsCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VGFyZ2V0TWFjaGluZT4gVE0pOworCisgIHN0YXRpYyBFeGVjdXRpb25FbmdpbmUgKigqT3JjTUNKSVRSZXBsYWNlbWVudEN0b3IpKAorICAgICAgc3RkOjpzdHJpbmcgKkVycm9yU3RyLCBzdGQ6OnNoYXJlZF9wdHI8TUNKSVRNZW1vcnlNYW5hZ2VyPiBNTSwKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMZWdhY3lKSVRTeW1ib2xSZXNvbHZlcj4gU1IsCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VGFyZ2V0TWFjaGluZT4gVE0pOworCisgIHN0YXRpYyBFeGVjdXRpb25FbmdpbmUgKigqSW50ZXJwQ3Rvcikoc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqRXJyb3JTdHIpOworCisgIC8vLyBMYXp5RnVuY3Rpb25DcmVhdG9yIC0gSWYgYW4gdW5rbm93biBmdW5jdGlvbiBpcyBuZWVkZWQsIHRoaXMgZnVuY3Rpb24KKyAgLy8vIHBvaW50ZXIgaXMgaW52b2tlZCB0byBjcmVhdGUgaXQuICBJZiB0aGlzIHJldHVybnMgbnVsbCwgdGhlIEpJVCB3aWxsCisgIC8vLyBhYm9ydC4KKyAgRnVuY3Rpb25DcmVhdG9yIExhenlGdW5jdGlvbkNyZWF0b3I7CisKKyAgLy8vIGdldE1hbmdsZWROYW1lIC0gR2V0IG1hbmdsZWQgbmFtZS4KKyAgc3RkOjpzdHJpbmcgZ2V0TWFuZ2xlZE5hbWUoY29uc3QgR2xvYmFsVmFsdWUgKkdWKTsKKworcHVibGljOgorICAvLy8gbG9jayAtIFRoaXMgbG9jayBwcm90ZWN0cyB0aGUgRXhlY3V0aW9uRW5naW5lIGFuZCBNQ0pJVCBjbGFzc2VzLiBJdCBtdXN0CisgIC8vLyBiZSBoZWxkIHdoaWxlIGNoYW5naW5nIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBhbnkgb2YgdGhvc2UgY2xhc3Nlcy4KKyAgc3lzOjpNdXRleCBsb2NrOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyAgRXhlY3V0aW9uRW5naW5lIFN0YXJ0dXAKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgdmlydHVhbCB+RXhlY3V0aW9uRW5naW5lKCk7CisKKyAgLy8vIEFkZCBhIE1vZHVsZSB0byB0aGUgbGlzdCBvZiBtb2R1bGVzIHRoYXQgd2UgY2FuIEpJVCBmcm9tLgorICB2aXJ0dWFsIHZvaWQgYWRkTW9kdWxlKHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IE0pIHsKKyAgICBNb2R1bGVzLnB1c2hfYmFjayhzdGQ6Om1vdmUoTSkpOworICB9CisKKyAgLy8vIGFkZE9iamVjdEZpbGUgLSBBZGQgYW4gT2JqZWN0RmlsZSB0byB0aGUgZXhlY3V0aW9uIGVuZ2luZS4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBpcyBvbmx5IHN1cHBvcnRlZCBieSBNQ0pJVC4gIE1DSklUIHdpbGwgaW1tZWRpYXRlbHkgbG9hZCB0aGUKKyAgLy8vIG9iamVjdCBpbnRvIG1lbW9yeSBhbmQgYWRkcyBpdHMgc3ltYm9scyB0byB0aGUgbGlzdCB1c2VkIHRvIHJlc29sdmUKKyAgLy8vIGV4dGVybmFsIHN5bWJvbHMgd2hpbGUgcHJlcGFyaW5nIG90aGVyIG9iamVjdHMgZm9yIGV4ZWN1dGlvbi4KKyAgLy8vCisgIC8vLyBPYmplY3RzIGFkZGVkIHVzaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgYmUgbWFkZSBleGVjdXRhYmxlIHVudGlsCisgIC8vLyBuZWVkZWQgYnkgYW5vdGhlciBvYmplY3QuCisgIC8vLworICAvLy8gTUNKSVQgd2lsbCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgT2JqZWN0RmlsZS4KKyAgdmlydHVhbCB2b2lkIGFkZE9iamVjdEZpbGUoc3RkOjp1bmlxdWVfcHRyPG9iamVjdDo6T2JqZWN0RmlsZT4gTyk7CisgIHZpcnR1YWwgdm9pZCBhZGRPYmplY3RGaWxlKG9iamVjdDo6T3duaW5nQmluYXJ5PG9iamVjdDo6T2JqZWN0RmlsZT4gTyk7CisKKyAgLy8vIGFkZEFyY2hpdmUgLSBBZGQgYW4gQXJjaGl2ZSB0byB0aGUgZXhlY3V0aW9uIGVuZ2luZS4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBpcyBvbmx5IHN1cHBvcnRlZCBieSBNQ0pJVC4gIE1DSklUIHdpbGwgdXNlIHRoZSBhcmNoaXZlIHRvCisgIC8vLyByZXNvbHZlIGV4dGVybmFsIHN5bWJvbHMgaW4gb2JqZWN0cyBpdCBpcyBsb2FkaW5nLiAgSWYgYSBzeW1ib2wgaXMgZm91bmQKKyAgLy8vIGluIHRoZSBBcmNoaXZlIHRoZSBjb250YWluZWQgb2JqZWN0IGZpbGUgd2lsbCBiZSBleHRyYWN0ZWQgKGluIG1lbW9yeSkKKyAgLy8vIGFuZCBsb2FkZWQgZm9yIHBvc3NpYmxlIGV4ZWN1dGlvbi4KKyAgdmlydHVhbCB2b2lkIGFkZEFyY2hpdmUob2JqZWN0OjpPd25pbmdCaW5hcnk8b2JqZWN0OjpBcmNoaXZlPiBBKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBjb25zdCBEYXRhTGF5b3V0ICZnZXREYXRhTGF5b3V0KCkgY29uc3QgeyByZXR1cm4gREw7IH0KKworICAvLy8gcmVtb3ZlTW9kdWxlIC0gUmVtb3ZlcyBhIE1vZHVsZSBmcm9tIHRoZSBsaXN0IG9mIG1vZHVsZXMsIGJ1dCBkb2VzIG5vdAorICAvLy8gZnJlZSB0aGUgbW9kdWxlJ3MgbWVtb3J5LiBSZXR1cm5zIHRydWUgaWYgTSBpcyBmb3VuZCwgaW4gd2hpY2ggY2FzZSB0aGUKKyAgLy8vIGNhbGxlciBhc3N1bWVzIHJlc3BvbnNpYmlsaXR5IGZvciBkZWxldGluZyB0aGUgbW9kdWxlLgorICAvLworICAvLyBGSVhNRTogVGhpcyBzdGVhbHRoIG93bmVyc2hpcCB0cmFuc2ZlciBpcyBob3JyaWJsZS4gVGhpcyB3aWxsIHByb2JhYmx5IGJlCisgIC8vICAgICAgICBmaXhlZCBieSBkZWxldGluZyBFeGVjdXRpb25FbmdpbmUuCisgIHZpcnR1YWwgYm9vbCByZW1vdmVNb2R1bGUoTW9kdWxlICpNKTsKKworICAvLy8gRmluZEZ1bmN0aW9uTmFtZWQgLSBTZWFyY2ggYWxsIG9mIHRoZSBhY3RpdmUgbW9kdWxlcyB0byBmaW5kIHRoZSBmdW5jdGlvbiB0aGF0CisgIC8vLyBkZWZpbmVzIEZuTmFtZS4gIFRoaXMgaXMgdmVyeSBzbG93IG9wZXJhdGlvbiBhbmQgc2hvdWxkbid0IGJlIHVzZWQgZm9yCisgIC8vLyBnZW5lcmFsIGNvZGUuCisgIHZpcnR1YWwgRnVuY3Rpb24gKkZpbmRGdW5jdGlvbk5hbWVkKFN0cmluZ1JlZiBGbk5hbWUpOworCisgIC8vLyBGaW5kR2xvYmFsVmFyaWFibGVOYW1lZCAtIFNlYXJjaCBhbGwgb2YgdGhlIGFjdGl2ZSBtb2R1bGVzIHRvIGZpbmQgdGhlIGdsb2JhbCB2YXJpYWJsZQorICAvLy8gdGhhdCBkZWZpbmVzIE5hbWUuICBUaGlzIGlzIHZlcnkgc2xvdyBvcGVyYXRpb24gYW5kIHNob3VsZG4ndCBiZSB1c2VkIGZvcgorICAvLy8gZ2VuZXJhbCBjb2RlLgorICB2aXJ0dWFsIEdsb2JhbFZhcmlhYmxlICpGaW5kR2xvYmFsVmFyaWFibGVOYW1lZChTdHJpbmdSZWYgTmFtZSwgYm9vbCBBbGxvd0ludGVybmFsID0gZmFsc2UpOworCisgIC8vLyBydW5GdW5jdGlvbiAtIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLAorICAvLy8gYW5kIHJldHVybiB0aGUgcmVzdWx0LgorICAvLy8KKyAgLy8vIEZvciBNQ0pJVCBleGVjdXRpb24gZW5naW5lcywgY2xpZW50cyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgdGhlCisgIC8vLyAiR2V0RnVuY3Rpb25BZGRyZXNzIiBtZXRob2QgKHJhdGhlciB0aGFuIHJ1bkZ1bmN0aW9uKSBhbmQgY2FzdCB0aGUKKyAgLy8vIHJldHVybmVkIHVpbnQ2NF90IHRvIHRoZSBkZXNpcmVkIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZS4gSG93ZXZlciwgZm9yCisgIC8vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBNQ0pJVCdzIGltcGxlbWVudGF0aW9uIGNhbiBleGVjdXRlICdtYWluLWxpa2UnCisgIC8vLyBmdW5jdGlvbiAoaS5lLiB0aG9zZSByZXR1cm5pbmcgdm9pZCBvciBpbnQsIGFuZCB0YWtpbmcgZWl0aGVyIG5vCisgIC8vLyBhcmd1bWVudHMgb3IgKGludCwgY2hhcipbXSkpLgorICB2aXJ0dWFsIEdlbmVyaWNWYWx1ZSBydW5GdW5jdGlvbihGdW5jdGlvbiAqRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8R2VuZXJpY1ZhbHVlPiBBcmdWYWx1ZXMpID0gMDsKKworICAvLy8gZ2V0UG9pbnRlclRvTmFtZWRGdW5jdGlvbiAtIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlCisgIC8vLyBzcGVjaWZpZWQgZnVuY3Rpb24gYnkgdXNpbmcgdGhlIGRsc3ltIGZ1bmN0aW9uIGNhbGwuICBBcyBzdWNoIGl0IGlzIG9ubHkKKyAgLy8vIHVzZWZ1bCBmb3IgcmVzb2x2aW5nIGxpYnJhcnkgc3ltYm9scywgbm90IGNvZGUgZ2VuZXJhdGVkIHN5bWJvbHMuCisgIC8vLworICAvLy8gSWYgQWJvcnRPbkZhaWx1cmUgaXMgZmFsc2UgYW5kIG5vIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgaXMKKyAgLy8vIGZvdW5kLCB0aGlzIGZ1bmN0aW9uIHNpbGVudGx5IHJldHVybnMgYSBudWxsIHBvaW50ZXIuIE90aGVyd2lzZSwKKyAgLy8vIGl0IHByaW50cyBhIG1lc3NhZ2UgdG8gc3RkZXJyIGFuZCBhYm9ydHMuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIGZvciB0aGUgTUNKSVQgZXhlY3V0aW9uIGVuZ2luZS4KKyAgdmlydHVhbCB2b2lkICpnZXRQb2ludGVyVG9OYW1lZEZ1bmN0aW9uKFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBYm9ydE9uRmFpbHVyZSA9IHRydWUpID0gMDsKKworICAvLy8gbWFwU2VjdGlvbkFkZHJlc3MgLSBtYXAgYSBzZWN0aW9uIHRvIGl0cyB0YXJnZXQgYWRkcmVzcyBzcGFjZSB2YWx1ZS4KKyAgLy8vIE1hcCB0aGUgYWRkcmVzcyBvZiBhIEpJVCBzZWN0aW9uIGFzIHJldHVybmVkIGZyb20gdGhlIG1lbW9yeSBtYW5hZ2VyCisgIC8vLyB0byB0aGUgYWRkcmVzcyBpbiB0aGUgdGFyZ2V0IHByb2Nlc3MgYXMgdGhlIHJ1bm5pbmcgY29kZSB3aWxsIHNlZSBpdC4KKyAgLy8vIFRoaXMgaXMgdGhlIGFkZHJlc3Mgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciByZWxvY2F0aW9uIHJlc29sdXRpb24uCisgIHZpcnR1YWwgdm9pZCBtYXBTZWN0aW9uQWRkcmVzcyhjb25zdCB2b2lkICpMb2NhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBUYXJnZXRBZGRyZXNzKSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiUmUtbWFwcGluZyBvZiBzZWN0aW9uIGFkZHJlc3NlcyBub3Qgc3VwcG9ydGVkIHdpdGggdGhpcyAiCisgICAgICAgICAgICAgICAgICAgICAiRUUhIik7CisgIH0KKworICAvLy8gZ2VuZXJhdGVDb2RlRm9yTW9kdWxlIC0gUnVuIGNvZGUgZ2VuZXJhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUgYW5kCisgIC8vLyBsb2FkIGl0IGludG8gbWVtb3J5LgorICAvLy8KKyAgLy8vIFdoZW4gdGhpcyBmdW5jdGlvbiBoYXMgY29tcGxldGVkLCBhbGwgY29kZSBhbmQgZGF0YSBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gbW9kdWxlLCBhbmQgYW55IG1vZHVsZSBvbiB3aGljaCB0aGlzIG1vZHVsZSBkZXBlbmRzLCB3aWxsIGJlIGdlbmVyYXRlZAorICAvLy8gYW5kIGxvYWRlZCBpbnRvIG1lbW9yeSwgYnV0IHJlbG9jYXRpb25zIHdpbGwgbm90IHlldCBoYXZlIGJlZW4gYXBwbGllZAorICAvLy8gYW5kIGFsbCBtZW1vcnkgd2lsbCBiZSByZWFkYWJsZSBhbmQgd3JpdGFibGUgYnV0IG5vdCBleGVjdXRhYmxlLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgcHJpbWFyaWx5IHVzZWZ1bCB3aGVuIGdlbmVyYXRpbmcgY29kZSBmb3IgYW4gZXh0ZXJuYWwKKyAgLy8vIHRhcmdldCwgYWxsb3dpbmcgdGhlIGNsaWVudCBhbiBvcHBvcnR1bml0eSB0byByZW1hcCBzZWN0aW9uIGFkZHJlc3NlcworICAvLy8gYmVmb3JlIHJlbG9jYXRpb25zIGFyZSBhcHBsaWVkLiAgQ2xpZW50cyB0aGF0IGludGVuZCB0byBleGVjdXRlIGNvZGUKKyAgLy8vIGxvY2FsbHkgY2FuIHVzZSB0aGUgZ2V0RnVuY3Rpb25BZGRyZXNzIGNhbGwsIHdoaWNoIHdpbGwgZ2VuZXJhdGUgY29kZQorICAvLy8gYW5kIGFwcGx5IGZpbmFsIHByZXBhcmF0aW9ucyBhbGwgaW4gb25lIHN0ZXAuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBmb3IgdGhlIGludGVycGV0ZXIuCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZUNvZGVGb3JNb2R1bGUoTW9kdWxlICpNKSB7fQorCisgIC8vLyBmaW5hbGl6ZU9iamVjdCAtIGVuc3VyZSB0aGUgbW9kdWxlIGlzIGZ1bGx5IHByb2Nlc3NlZCBhbmQgaXMgdXNhYmxlLgorICAvLy8KKyAgLy8vIEl0IGlzIHRoZSB1c2VyLWxldmVsIGZ1bmN0aW9uIGZvciBjb21wbGV0aW5nIHRoZSBwcm9jZXNzIG9mIG1ha2luZyB0aGUKKyAgLy8vIG9iamVjdCB1c2FibGUgZm9yIGV4ZWN1dGlvbi4gIEl0IHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgc2VjdGlvbnMgd2l0aGluIGFuCisgIC8vLyBvYmplY3QgaGF2ZSBiZWVuIHJlbG9jYXRlZCB1c2luZyBtYXBTZWN0aW9uQWRkcmVzcy4gIFdoZW4gdGhpcyBtZXRob2QgaXMKKyAgLy8vIGNhbGxlZCB0aGUgTUNKSVQgZXhlY3V0aW9uIGVuZ2luZSB3aWxsIHJlYXBwbHkgcmVsb2NhdGlvbnMgZm9yIGEgbG9hZGVkCisgIC8vLyBvYmplY3QuICBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IGZvciB0aGUgaW50ZXJwZXRlci4KKyAgdmlydHVhbCB2b2lkIGZpbmFsaXplT2JqZWN0KCkge30KKworICAvLy8gcnVuU3RhdGljQ29uc3RydWN0b3JzRGVzdHJ1Y3RvcnMgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGV4ZWN1dGUgYWxsIG9mCisgIC8vLyB0aGUgc3RhdGljIGNvbnN0cnVjdG9ycyBvciBkZXN0cnVjdG9ycyBmb3IgYSBwcm9ncmFtLgorICAvLy8KKyAgLy8vIFxwYXJhbSBpc0R0b3JzIC0gUnVuIHRoZSBkZXN0cnVjdG9ycyBpbnN0ZWFkIG9mIGNvbnN0cnVjdG9ycy4KKyAgdmlydHVhbCB2b2lkIHJ1blN0YXRpY0NvbnN0cnVjdG9yc0Rlc3RydWN0b3JzKGJvb2wgaXNEdG9ycyk7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZXhlY3V0ZSBhbGwgb2YgdGhlIHN0YXRpYyBjb25zdHJ1Y3RvcnMgb3IKKyAgLy8vIGRlc3RydWN0b3JzIGZvciBhIHBhcnRpY3VsYXIgbW9kdWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBpc0R0b3JzIC0gUnVuIHRoZSBkZXN0cnVjdG9ycyBpbnN0ZWFkIG9mIGNvbnN0cnVjdG9ycy4KKyAgdm9pZCBydW5TdGF0aWNDb25zdHJ1Y3RvcnNEZXN0cnVjdG9ycyhNb2R1bGUgJm1vZHVsZSwgYm9vbCBpc0R0b3JzKTsKKworCisgIC8vLyBydW5GdW5jdGlvbkFzTWFpbiAtIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggd3JhcHMgcnVuRnVuY3Rpb24gdG8KKyAgLy8vIGhhbmRsZSB0aGUgY29tbW9uIHRhc2sgb2Ygc3RhcnRpbmcgdXAgbWFpbiB3aXRoIHRoZSBzcGVjaWZpZWQgYXJnYywgYXJndiwKKyAgLy8vIGFuZCBlbnZwIHBhcmFtZXRlcnMuCisgIGludCBydW5GdW5jdGlvbkFzTWFpbihGdW5jdGlvbiAqRm4sIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqIGVudnApOworCisKKyAgLy8vIGFkZEdsb2JhbE1hcHBpbmcgLSBUZWxsIHRoZSBleGVjdXRpb24gZW5naW5lIHRoYXQgdGhlIHNwZWNpZmllZCBnbG9iYWwgaXMKKyAgLy8vIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uICBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSBhcyBmdW5jdGlvbnMgYXJlIEpJVCdkCisgIC8vLyBhbmQgYXMgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbGFpZCBvdXQgaW4gbWVtb3J5LiAgSXQgY2FuIGFuZCBzaG91bGQgYWxzbyBiZQorICAvLy8gdXNlZCBieSBjbGllbnRzIG9mIHRoZSBFRSB0aGF0IHdhbnQgdG8gaGF2ZSBhbiBMTFZNIGdsb2JhbCBvdmVybGF5CisgIC8vLyBleGlzdGluZyBkYXRhIGluIG1lbW9yeS4gVmFsdWVzIHRvIGJlIG1hcHBlZCBzaG91bGQgYmUgbmFtZWQsIGFuZCBoYXZlCisgIC8vLyBleHRlcm5hbCBvciB3ZWFrIGxpbmthZ2UuIE1hcHBpbmdzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2hlbiB0aGVpcgorICAvLy8gR2xvYmFsVmFsdWUgaXMgZGVzdHJveWVkLgorICB2b2lkIGFkZEdsb2JhbE1hcHBpbmcoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCB2b2lkICpBZGRyKTsKKyAgdm9pZCBhZGRHbG9iYWxNYXBwaW5nKFN0cmluZ1JlZiBOYW1lLCB1aW50NjRfdCBBZGRyKTsKKworICAvLy8gY2xlYXJBbGxHbG9iYWxNYXBwaW5ncyAtIENsZWFyIGFsbCBnbG9iYWwgbWFwcGluZ3MgYW5kIHN0YXJ0IG92ZXIgYWdhaW4sCisgIC8vLyBmb3IgdXNlIGluIGR5bmFtaWMgY29tcGlsYXRpb24gc2NlbmFyaW9zIHRvIG1vdmUgZ2xvYmFscy4KKyAgdm9pZCBjbGVhckFsbEdsb2JhbE1hcHBpbmdzKCk7CisKKyAgLy8vIGNsZWFyR2xvYmFsTWFwcGluZ3NGcm9tTW9kdWxlIC0gQ2xlYXIgYWxsIGdsb2JhbCBtYXBwaW5ncyB0aGF0IGNhbWUgZnJvbSBhCisgIC8vLyBwYXJ0aWN1bGFyIG1vZHVsZSwgYmVjYXVzZSBpdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIEpJVC4KKyAgdm9pZCBjbGVhckdsb2JhbE1hcHBpbmdzRnJvbU1vZHVsZShNb2R1bGUgKk0pOworCisgIC8vLyB1cGRhdGVHbG9iYWxNYXBwaW5nIC0gUmVwbGFjZSBhbiBleGlzdGluZyBtYXBwaW5nIGZvciBHViB3aXRoIGEgbmV3CisgIC8vLyBhZGRyZXNzLiAgVGhpcyB1cGRhdGVzIGJvdGggbWFwcyBhcyByZXF1aXJlZC4gIElmICJBZGRyIiBpcyBudWxsLCB0aGUKKyAgLy8vIGVudHJ5IGZvciB0aGUgZ2xvYmFsIGlzIHJlbW92ZWQgZnJvbSB0aGUgbWFwcGluZ3MuICBUaGlzIHJldHVybnMgdGhlIG9sZAorICAvLy8gdmFsdWUgb2YgdGhlIHBvaW50ZXIsIG9yIG51bGwgaWYgaXQgd2FzIG5vdCBpbiB0aGUgbWFwLgorICB1aW50NjRfdCB1cGRhdGVHbG9iYWxNYXBwaW5nKGNvbnN0IEdsb2JhbFZhbHVlICpHViwgdm9pZCAqQWRkcik7CisgIHVpbnQ2NF90IHVwZGF0ZUdsb2JhbE1hcHBpbmcoU3RyaW5nUmVmIE5hbWUsIHVpbnQ2NF90IEFkZHIpOworCisgIC8vLyBnZXRBZGRyZXNzVG9HbG9iYWxJZkF2YWlsYWJsZSAtIFRoaXMgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkCisgIC8vLyBnbG9iYWwgc3ltYm9sLgorICB1aW50NjRfdCBnZXRBZGRyZXNzVG9HbG9iYWxJZkF2YWlsYWJsZShTdHJpbmdSZWYgUyk7CisKKyAgLy8vIGdldFBvaW50ZXJUb0dsb2JhbElmQXZhaWxhYmxlIC0gVGhpcyByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQKKyAgLy8vIGdsb2JhbCB2YWx1ZSBpZiBpdCBpcyBoYXMgYWxyZWFkeSBiZWVuIGNvZGVnZW4nZCwgb3RoZXJ3aXNlIGl0IHJldHVybnMKKyAgLy8vIG51bGwuCisgIHZvaWQgKmdldFBvaW50ZXJUb0dsb2JhbElmQXZhaWxhYmxlKFN0cmluZ1JlZiBTKTsKKyAgdm9pZCAqZ2V0UG9pbnRlclRvR2xvYmFsSWZBdmFpbGFibGUoY29uc3QgR2xvYmFsVmFsdWUgKkdWKTsKKworICAvLy8gZ2V0UG9pbnRlclRvR2xvYmFsIC0gVGhpcyByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgZ2xvYmFsCisgIC8vLyB2YWx1ZS4gVGhpcyBtYXkgaW52b2x2ZSBjb2RlIGdlbmVyYXRpb24gaWYgaXQncyBhIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBmb3IgdGhlIE1DSklUIGV4ZWN1dGlvbiBlbmdpbmUuICBVc2UKKyAgLy8vIGdldEdsb2JhbFZhbHVlQWRkcmVzcyBpbnN0ZWFkLgorICB2b2lkICpnZXRQb2ludGVyVG9HbG9iYWwoY29uc3QgR2xvYmFsVmFsdWUgKkdWKTsKKworICAvLy8gZ2V0UG9pbnRlclRvRnVuY3Rpb24gLSBUaGUgZGlmZmVyZW50IEVFJ3MgcmVwcmVzZW50IGZ1bmN0aW9uIGJvZGllcyBpbgorICAvLy8gZGlmZmVyZW50IHdheXMuICBUaGV5IHNob3VsZCBlYWNoIGltcGxlbWVudCB0aGlzIHRvIHNheSB3aGF0IGEgZnVuY3Rpb24KKyAgLy8vIHBvaW50ZXIgc2hvdWxkIGxvb2sgbGlrZS4gIFdoZW4gRiBpcyBkZXN0cm95ZWQsIHRoZSBFeGVjdXRpb25FbmdpbmUgd2lsbAorICAvLy8gcmVtb3ZlIGl0cyBnbG9iYWwgbWFwcGluZyBhbmQgZnJlZSBhbnkgbWFjaGluZSBjb2RlLiAgQmUgc3VyZSBubyB0aHJlYWRzCisgIC8vLyBhcmUgcnVubmluZyBpbnNpZGUgRiB3aGVuIHRoYXQgaGFwcGVucy4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgZm9yIHRoZSBNQ0pJVCBleGVjdXRpb24gZW5naW5lLiAgVXNlCisgIC8vLyBnZXRGdW5jdGlvbkFkZHJlc3MgaW5zdGVhZC4KKyAgdmlydHVhbCB2b2lkICpnZXRQb2ludGVyVG9GdW5jdGlvbihGdW5jdGlvbiAqRikgPSAwOworCisgIC8vLyBnZXRQb2ludGVyVG9GdW5jdGlvbk9yU3R1YiAtIElmIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gaGFzIGJlZW4KKyAgLy8vIGNvZGUtZ2VuJ2QsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uLiAgSWYgbm90LCBjb21waWxlIGl0LCBvciB1c2UKKyAgLy8vIGEgc3R1YiB0byBpbXBsZW1lbnQgbGF6eSBjb21waWxhdGlvbiBpZiBhdmFpbGFibGUuICBTZWUKKyAgLy8vIGdldFBvaW50ZXJUb0Z1bmN0aW9uIGZvciB0aGUgcmVxdWlyZW1lbnRzIG9uIGRlc3Ryb3lpbmcgRi4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgZm9yIHRoZSBNQ0pJVCBleGVjdXRpb24gZW5naW5lLiAgVXNlCisgIC8vLyBnZXRGdW5jdGlvbkFkZHJlc3MgaW5zdGVhZC4KKyAgdmlydHVhbCB2b2lkICpnZXRQb2ludGVyVG9GdW5jdGlvbk9yU3R1YihGdW5jdGlvbiAqRikgeworICAgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24sIGp1c3QgY29kZWdlbiB0aGUgZnVuY3Rpb24uCisgICAgcmV0dXJuIGdldFBvaW50ZXJUb0Z1bmN0aW9uKEYpOworICB9CisKKyAgLy8vIGdldEdsb2JhbFZhbHVlQWRkcmVzcyAtIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkIGdsb2JhbAorICAvLy8gdmFsdWUuIFRoaXMgbWF5IGludm9sdmUgY29kZSBnZW5lcmF0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2l0aCB0aGUgaW50ZXJwcmV0ZXIgZW5naW5lLgorICB2aXJ0dWFsIHVpbnQ2NF90IGdldEdsb2JhbFZhbHVlQWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworICAgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBpbnRlcnByZXRlci4gIE1DSklUIHdpbGwgb3ZlcnJpZGUgdGhpcy4KKyAgICAvLyBKSVQgYW5kIGludGVycHJldGVyIGNsaWVudHMgc2hvdWxkIHVzZSBnZXRQb2ludGVyVG9HbG9iYWwgaW5zdGVhZC4KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBnZXRGdW5jdGlvbkFkZHJlc3MgLSBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBmdW5jdGlvbi4KKyAgLy8vIFRoaXMgbWF5IGludm9sdmUgY29kZSBnZW5lcmF0aW9uLgorICB2aXJ0dWFsIHVpbnQ2NF90IGdldEZ1bmN0aW9uQWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworICAgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBpbnRlcnByZXRlci4gIE1DSklUIHdpbGwgb3ZlcnJpZGUgdGhpcy4KKyAgICAvLyBJbnRlcnByZXRlciBjbGllbnRzIHNob3VsZCB1c2UgZ2V0UG9pbnRlclRvRnVuY3Rpb24gaW5zdGVhZC4KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBnZXRHbG9iYWxWYWx1ZUF0QWRkcmVzcyAtIFJldHVybiB0aGUgTExWTSBnbG9iYWwgdmFsdWUgb2JqZWN0IHRoYXQgc3RhcnRzCisgIC8vLyBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCisgIC8vLworICBjb25zdCBHbG9iYWxWYWx1ZSAqZ2V0R2xvYmFsVmFsdWVBdEFkZHJlc3Modm9pZCAqQWRkcik7CisKKyAgLy8vIFN0b3JlVmFsdWVUb01lbW9yeSAtIFN0b3JlcyB0aGUgZGF0YSBpbiBWYWwgb2YgdHlwZSBUeSBhdCBhZGRyZXNzIFB0ci4KKyAgLy8vIFB0ciBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGF0IHdoaWNoIHRvIHN0b3JlIFZhbCwgY2FzdCB0bworICAvLy8gR2VuZXJpY1ZhbHVlICouICBJdCBpcyBub3QgYSBwb2ludGVyIHRvIGEgR2VuZXJpY1ZhbHVlIGNvbnRhaW5pbmcgdGhlCisgIC8vLyBhZGRyZXNzIGF0IHdoaWNoIHRvIHN0b3JlIFZhbC4KKyAgdm9pZCBTdG9yZVZhbHVlVG9NZW1vcnkoY29uc3QgR2VuZXJpY1ZhbHVlICZWYWwsIEdlbmVyaWNWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpUeSk7CisKKyAgdm9pZCBJbml0aWFsaXplTWVtb3J5KGNvbnN0IENvbnN0YW50ICpJbml0LCB2b2lkICpBZGRyKTsKKworICAvLy8gZ2V0T3JFbWl0R2xvYmFsVmFyaWFibGUgLSBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBnbG9iYWwKKyAgLy8vIHZhcmlhYmxlLCBwb3NzaWJseSBlbWl0dGluZyBpdCB0byBtZW1vcnkgaWYgbmVlZGVkLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZQorICAvLy8gRW1pdHRlci4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgZm9yIHRoZSBNQ0pJVCBleGVjdXRpb24gZW5naW5lLiAgVXNlCisgIC8vLyBnZXRHbG9iYWxWYWx1ZUFkZHJlc3MgaW5zdGVhZC4KKyAgdmlydHVhbCB2b2lkICpnZXRPckVtaXRHbG9iYWxWYXJpYWJsZShjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpIHsKKyAgICByZXR1cm4gZ2V0UG9pbnRlclRvR2xvYmFsKChjb25zdCBHbG9iYWxWYWx1ZSAqKUdWKTsKKyAgfQorCisgIC8vLyBSZWdpc3RlcnMgYSBsaXN0ZW5lciB0byBiZSBjYWxsZWQgYmFjayBvbiB2YXJpb3VzIGV2ZW50cyB3aXRoaW4KKyAgLy8vIHRoZSBKSVQuICBTZWUgSklURXZlbnRMaXN0ZW5lci5oIGZvciBtb3JlIGRldGFpbHMuICBEb2VzIG5vdAorICAvLy8gdGFrZSBvd25lcnNoaXAgb2YgdGhlIGFyZ3VtZW50LiAgVGhlIGFyZ3VtZW50IG1heSBiZSBOVUxMLCBpbgorICAvLy8gd2hpY2ggY2FzZSB0aGVzZSBmdW5jdGlvbnMgZG8gbm90aGluZy4KKyAgdmlydHVhbCB2b2lkIFJlZ2lzdGVySklURXZlbnRMaXN0ZW5lcihKSVRFdmVudExpc3RlbmVyICopIHt9CisgIHZpcnR1YWwgdm9pZCBVbnJlZ2lzdGVySklURXZlbnRMaXN0ZW5lcihKSVRFdmVudExpc3RlbmVyICopIHt9CisKKyAgLy8vIFNldHMgdGhlIHByZS1jb21waWxlZCBvYmplY3QgY2FjaGUuICBUaGUgb3duZXJzaGlwIG9mIHRoZSBPYmplY3RDYWNoZSBpcworICAvLy8gbm90IGNoYW5nZWQuICBTdXBwb3J0ZWQgYnkgTUNKSVQgYnV0IG5vdCB0aGUgaW50ZXJwcmV0ZXIuCisgIHZpcnR1YWwgdm9pZCBzZXRPYmplY3RDYWNoZShPYmplY3RDYWNoZSAqKSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiTm8gc3VwcG9ydCBmb3IgYW4gb2JqZWN0IGNhY2hlIik7CisgIH0KKworICAvLy8gc2V0UHJvY2Vzc0FsbFNlY3Rpb25zIChNQ0pJVCBPbmx5KTogQnkgZGVmYXVsdCwgb25seSBzZWN0aW9ucyB0aGF0IGFyZQorICAvLy8gInJlcXVpcmVkIGZvciBleGVjdXRpb24iIGFyZSBwYXNzZWQgdG8gdGhlIFJURHlsZE1lbW9yeU1hbmFnZXIsIGFuZCBvdGhlcgorICAvLy8gc2VjdGlvbnMgYXJlIGRpc2NhcmRlZC4gUGFzc2luZyAndHJ1ZScgdG8gdGhpcyBtZXRob2Qgd2lsbCBjYXVzZQorICAvLy8gUnVudGltZUR5bGQgdG8gcGFzcyBhbGwgc2VjdGlvbnMgdG8gaXRzIFJURHlsZE1lbW9yeU1hbmFnZXIgcmVnYXJkbGVzcworICAvLy8gb2Ygd2hldGhlciB0aGV5IGFyZSAicmVxdWlyZWQgdG8gZXhlY3V0ZSIgaW4gdGhlIHVzdWFsIHNlbnNlLgorICAvLy8KKyAgLy8vIFJhdGlvbmFsZTogU29tZSBNQ0pJVCBjbGllbnRzIHdhbnQgdG8gYmUgYWJsZSB0byBpbnNwZWN0IG1ldGFkYXRhCisgIC8vLyBzZWN0aW9ucyAoZS5nLiBEd2FyZiwgU3RhY2stbWFwcykgdG8gZW5hYmxlIGZ1bmN0aW9uYWxpdHkgb3IgYW5hbHl6ZQorICAvLy8gcGVyZm9ybWFuY2UuIFBhc3NpbmcgdGhlc2Ugc2VjdGlvbnMgdG8gdGhlIG1lbW9yeSBtYW5hZ2VyIGFsbG93cyB0aGUKKyAgLy8vIGNsaWVudCB0byBtYWtlIHBvbGljeSBhYm91dCB0aGUgcmVsZXZhbnQgc2VjdGlvbnMsIHJhdGhlciB0aGFuIGhhdmluZworICAvLy8gTUNKSVQgZG8gaXQuCisgIHZpcnR1YWwgdm9pZCBzZXRQcm9jZXNzQWxsU2VjdGlvbnMoYm9vbCBQcm9jZXNzQWxsU2VjdGlvbnMpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJObyBzdXBwb3J0IGZvciBQcm9jZXNzQWxsU2VjdGlvbnMgb3B0aW9uIik7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSB0YXJnZXQgbWFjaGluZSAoaWYgYXZhaWxhYmxlKS4KKyAgdmlydHVhbCBUYXJnZXRNYWNoaW5lICpnZXRUYXJnZXRNYWNoaW5lKCkgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgIC8vLyBEaXNhYmxlTGF6eUNvbXBpbGF0aW9uIC0gV2hlbiBsYXp5IGNvbXBpbGF0aW9uIGlzIG9mZiAodGhlIGRlZmF1bHQpLCB0aGUKKyAgLy8vIEpJVCB3aWxsIGVhZ2VybHkgY29tcGlsZSBldmVyeSBmdW5jdGlvbiByZWFjaGFibGUgZnJvbSB0aGUgYXJndW1lbnQgdG8KKyAgLy8vIGdldFBvaW50ZXJUb0Z1bmN0aW9uLiAgSWYgbGF6eSBjb21waWxhdGlvbiBpcyB0dXJuZWQgb24sIHRoZSBKSVQgd2lsbCBvbmx5CisgIC8vLyBjb21waWxlIHRoZSBvbmUgZnVuY3Rpb24gYW5kIGVtaXQgc3R1YnMgdG8gY29tcGlsZSB0aGUgcmVzdCB3aGVuIHRoZXkncmUKKyAgLy8vIGZpcnN0IGNhbGxlZC4gIElmIGxhenkgY29tcGlsYXRpb24gaXMgdHVybmVkIG9mZiBhZ2FpbiB3aGlsZSBzb21lIGxhenkKKyAgLy8vIHN0dWJzIGFyZSBzdGlsbCBhcm91bmQsIGFuZCBvbmUgb2YgdGhvc2Ugc3R1YnMgaXMgY2FsbGVkLCB0aGUgcHJvZ3JhbSB3aWxsCisgIC8vLyBhYm9ydC4KKyAgLy8vCisgIC8vLyBJbiBvcmRlciB0byBzYWZlbHkgY29tcGlsZSBsYXppbHkgaW4gYSB0aHJlYWRlZCBwcm9ncmFtLCB0aGUgdXNlciBtdXN0CisgIC8vLyBlbnN1cmUgdGhhdCAxKSBvbmx5IG9uZSB0aHJlYWQgYXQgYSB0aW1lIGNhbiBjYWxsIGFueSBwYXJ0aWN1bGFyIGxhenkKKyAgLy8vIHN0dWIsIGFuZCAyKSBhbnkgdGhyZWFkIG1vZGlmeWluZyBMTFZNIElSIG11c3QgaG9sZCB0aGUgSklUJ3MgbG9jaworICAvLy8gKEV4ZWN1dGlvbkVuZ2luZTo6bG9jaykgb3Igb3RoZXJ3aXNlIGVuc3VyZSB0aGF0IG5vIG90aGVyIHRocmVhZCBjYWxscyBhCisgIC8vLyBsYXp5IHN0dWIuICBTZWUgaHR0cDovL2xsdm0ub3JnL1BSNTE4NCBmb3IgZGV0YWlscy4KKyAgdm9pZCBEaXNhYmxlTGF6eUNvbXBpbGF0aW9uKGJvb2wgRGlzYWJsZWQgPSB0cnVlKSB7CisgICAgQ29tcGlsaW5nTGF6aWx5ID0gIURpc2FibGVkOworICB9CisgIGJvb2wgaXNDb21waWxpbmdMYXppbHkoKSBjb25zdCB7CisgICAgcmV0dXJuIENvbXBpbGluZ0xhemlseTsKKyAgfQorCisgIC8vLyBEaXNhYmxlR1ZDb21waWxhdGlvbiAtIElmIGNhbGxlZCwgdGhlIEpJVCB3aWxsIGFib3J0IGlmIGl0J3MgYXNrZWQgdG8KKyAgLy8vIGFsbG9jYXRlIHNwYWNlIGFuZCBwb3B1bGF0ZSBhIEdsb2JhbFZhcmlhYmxlIHRoYXQgaXMgbm90IGludGVybmFsIHRvCisgIC8vLyB0aGUgbW9kdWxlLgorICB2b2lkIERpc2FibGVHVkNvbXBpbGF0aW9uKGJvb2wgRGlzYWJsZWQgPSB0cnVlKSB7CisgICAgR1ZDb21waWxhdGlvbkRpc2FibGVkID0gRGlzYWJsZWQ7CisgIH0KKyAgYm9vbCBpc0dWQ29tcGlsYXRpb25EaXNhYmxlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR1ZDb21waWxhdGlvbkRpc2FibGVkOworICB9CisKKyAgLy8vIERpc2FibGVTeW1ib2xTZWFyY2hpbmcgLSBJZiBjYWxsZWQsIHRoZSBKSVQgd2lsbCBub3QgdHJ5IHRvIGxvb2t1cCB1bmtub3duCisgIC8vLyBzeW1ib2xzIHdpdGggZGxzeW0uICBBIGNsaWVudCBjYW4gc3RpbGwgdXNlIEluc3RhbGxMYXp5RnVuY3Rpb25DcmVhdG9yIHRvCisgIC8vLyByZXNvbHZlIHN5bWJvbHMgaW4gYSBjdXN0b20gd2F5LgorICB2b2lkIERpc2FibGVTeW1ib2xTZWFyY2hpbmcoYm9vbCBEaXNhYmxlZCA9IHRydWUpIHsKKyAgICBTeW1ib2xTZWFyY2hpbmdEaXNhYmxlZCA9IERpc2FibGVkOworICB9CisgIGJvb2wgaXNTeW1ib2xTZWFyY2hpbmdEaXNhYmxlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3ltYm9sU2VhcmNoaW5nRGlzYWJsZWQ7CisgIH0KKworICAvLy8gRW5hYmxlL0Rpc2FibGUgSVIgbW9kdWxlIHZlcmlmaWNhdGlvbi4KKyAgLy8vCisgIC8vLyBOb3RlOiBNb2R1bGUgdmVyaWZpY2F0aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBpbiBEZWJ1ZyBidWlsZHMsIGFuZAorICAvLy8gZGlzYWJsZWQgYnkgZGVmYXVsdCBpbiBSZWxlYXNlLiBVc2UgdGhpcyBtZXRob2QgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQuCisgIHZvaWQgc2V0VmVyaWZ5TW9kdWxlcyhib29sIFZlcmlmeSkgeworICAgIFZlcmlmeU1vZHVsZXMgPSBWZXJpZnk7CisgIH0KKyAgYm9vbCBnZXRWZXJpZnlNb2R1bGVzKCkgY29uc3QgeworICAgIHJldHVybiBWZXJpZnlNb2R1bGVzOworICB9CisKKyAgLy8vIEluc3RhbGxMYXp5RnVuY3Rpb25DcmVhdG9yIC0gSWYgYW4gdW5rbm93biBmdW5jdGlvbiBpcyBuZWVkZWQsIHRoZQorICAvLy8gc3BlY2lmaWVkIGZ1bmN0aW9uIHBvaW50ZXIgaXMgaW52b2tlZCB0byBjcmVhdGUgaXQuICBJZiBpdCByZXR1cm5zIG51bGwsCisgIC8vLyB0aGUgSklUIHdpbGwgYWJvcnQuCisgIHZvaWQgSW5zdGFsbExhenlGdW5jdGlvbkNyZWF0b3IoRnVuY3Rpb25DcmVhdG9yIEMpIHsKKyAgICBMYXp5RnVuY3Rpb25DcmVhdG9yID0gc3RkOjptb3ZlKEMpOworICB9CisKK3Byb3RlY3RlZDoKKyAgRXhlY3V0aW9uRW5naW5lKERhdGFMYXlvdXQgREwpIDogREwoc3RkOjptb3ZlKERMKSkge30KKyAgZXhwbGljaXQgRXhlY3V0aW9uRW5naW5lKERhdGFMYXlvdXQgREwsIHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IE0pOworICBleHBsaWNpdCBFeGVjdXRpb25FbmdpbmUoc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gTSk7CisKKyAgdm9pZCBlbWl0R2xvYmFscygpOworCisgIHZvaWQgRW1pdEdsb2JhbFZhcmlhYmxlKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHVik7CisKKyAgR2VuZXJpY1ZhbHVlIGdldENvbnN0YW50VmFsdWUoY29uc3QgQ29uc3RhbnQgKkMpOworICB2b2lkIExvYWRWYWx1ZUZyb21NZW1vcnkoR2VuZXJpY1ZhbHVlICZSZXN1bHQsIEdlbmVyaWNWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqVHkpOworCitwcml2YXRlOgorICB2b2lkIEluaXQoc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gTSk7Cit9OworCituYW1lc3BhY2UgRW5naW5lS2luZCB7CisKKyAgLy8gVGhlc2UgYXJlIGFjdHVhbGx5IGJpdG1hc2tzIHRoYXQgZ2V0IG9yLWVkIHRvZ2V0aGVyLgorICBlbnVtIEtpbmQgeworICAgIEpJVCAgICAgICAgID0gMHgxLAorICAgIEludGVycHJldGVyID0gMHgyCisgIH07CisgIGNvbnN0IHN0YXRpYyBLaW5kIEVpdGhlciA9IChLaW5kKShKSVQgfCBJbnRlcnByZXRlcik7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFbmdpbmVLaW5kCisKKy8vLyBCdWlsZGVyIGNsYXNzIGZvciBFeGVjdXRpb25FbmdpbmVzLiBVc2UgdGhpcyBieSBzdGFjay1hbGxvY2F0aW5nIGEgYnVpbGRlciwKKy8vLyBjaGFpbmluZyB0aGUgdmFyaW91cyBzZXQqIG1ldGhvZHMsIGFuZCB0ZXJtaW5hdGluZyBpdCB3aXRoIGEgLmNyZWF0ZSgpCisvLy8gY2FsbC4KK2NsYXNzIEVuZ2luZUJ1aWxkZXIgeworcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gTTsKKyAgRW5naW5lS2luZDo6S2luZCBXaGljaEVuZ2luZTsKKyAgc3RkOjpzdHJpbmcgKkVycm9yU3RyOworICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbDsKKyAgc3RkOjpzaGFyZWRfcHRyPE1DSklUTWVtb3J5TWFuYWdlcj4gTWVtTWdyOworICBzdGQ6OnNoYXJlZF9wdHI8TGVnYWN5SklUU3ltYm9sUmVzb2x2ZXI+IFJlc29sdmVyOworICBUYXJnZXRPcHRpb25zIE9wdGlvbnM7CisgIE9wdGlvbmFsPFJlbG9jOjpNb2RlbD4gUmVsb2NNb2RlbDsKKyAgT3B0aW9uYWw8Q29kZU1vZGVsOjpNb2RlbD4gQ01Nb2RlbDsKKyAgc3RkOjpzdHJpbmcgTUFyY2g7CisgIHN0ZDo6c3RyaW5nIE1DUFU7CisgIFNtYWxsVmVjdG9yPHN0ZDo6c3RyaW5nLCA0PiBNQXR0cnM7CisgIGJvb2wgVmVyaWZ5TW9kdWxlczsKKyAgYm9vbCBVc2VPcmNNQ0pJVFJlcGxhY2VtZW50OworICBib29sIEVtdWxhdGVkVExTID0gdHJ1ZTsKKworcHVibGljOgorICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgRW5naW5lQnVpbGRlci4KKyAgRW5naW5lQnVpbGRlcigpOworCisgIC8vLyBDb25zdHJ1Y3RvciBmb3IgRW5naW5lQnVpbGRlci4KKyAgRW5naW5lQnVpbGRlcihzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNKTsKKworICAvLyBPdXQtb2YtbGluZSBzaW5jZSB3ZSBkb24ndCBoYXZlIHRoZSBkZWYnbiBvZiBSVER5bGRNZW1vcnlNYW5hZ2VyIGhlcmUuCisgIH5FbmdpbmVCdWlsZGVyKCk7CisKKyAgLy8vIHNldEVuZ2luZUtpbmQgLSBDb250cm9scyB3aGV0aGVyIHRoZSB1c2VyIHdhbnRzIHRoZSBpbnRlcnByZXRlciwgdGhlIEpJVCwKKyAgLy8vIG9yIHdoaWNoZXZlciBlbmdpbmUgd29ya3MuICBUaGlzIG9wdGlvbiBkZWZhdWx0cyB0byBFbmdpbmVLaW5kOjpFaXRoZXIuCisgIEVuZ2luZUJ1aWxkZXIgJnNldEVuZ2luZUtpbmQoRW5naW5lS2luZDo6S2luZCB3KSB7CisgICAgV2hpY2hFbmdpbmUgPSB3OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBzZXRNQ0pJVE1lbW9yeU1hbmFnZXIgLSBTZXRzIHRoZSBNQ0pJVCBtZW1vcnkgbWFuYWdlciB0byB1c2UuIFRoaXMgYWxsb3dzCisgIC8vLyBjbGllbnRzIHRvIGN1c3RvbWl6ZSB0aGVpciBtZW1vcnkgYWxsb2NhdGlvbiBwb2xpY2llcyBmb3IgdGhlIE1DSklULiBUaGlzCisgIC8vLyBpcyBvbmx5IGFwcHJvcHJpYXRlIGZvciB0aGUgTUNKSVQ7IHNldHRpbmcgdGhpcyBhbmQgY29uZmlndXJpbmcgdGhlIGJ1aWxkZXIKKyAgLy8vIHRvIGNyZWF0ZSBhbnl0aGluZyBvdGhlciB0aGFuIE1DSklUIHdpbGwgY2F1c2UgYSBydW50aW1lIGVycm9yLiBJZiBjcmVhdGUoKQorICAvLy8gaXMgY2FsbGVkIGFuZCBpcyBzdWNjZXNzZnVsLCB0aGUgY3JlYXRlZCBlbmdpbmUgdGFrZXMgb3duZXJzaGlwIG9mIHRoZQorICAvLy8gbWVtb3J5IG1hbmFnZXIuIFRoaXMgb3B0aW9uIGRlZmF1bHRzIHRvIE5VTEwuCisgIEVuZ2luZUJ1aWxkZXIgJnNldE1DSklUTWVtb3J5TWFuYWdlcihzdGQ6OnVuaXF1ZV9wdHI8UlREeWxkTWVtb3J5TWFuYWdlcj4gbWNqbW0pOworCisgIEVuZ2luZUJ1aWxkZXImCisgIHNldE1lbW9yeU1hbmFnZXIoc3RkOjp1bmlxdWVfcHRyPE1DSklUTWVtb3J5TWFuYWdlcj4gTU0pOworCisgIEVuZ2luZUJ1aWxkZXIgJnNldFN5bWJvbFJlc29sdmVyKHN0ZDo6dW5pcXVlX3B0cjxMZWdhY3lKSVRTeW1ib2xSZXNvbHZlcj4gU1IpOworCisgIC8vLyBzZXRFcnJvclN0ciAtIFNldCB0aGUgZXJyb3Igc3RyaW5nIHRvIHdyaXRlIHRvIG9uIGVycm9yLiAgVGhpcyBvcHRpb24KKyAgLy8vIGRlZmF1bHRzIHRvIE5VTEwuCisgIEVuZ2luZUJ1aWxkZXIgJnNldEVycm9yU3RyKHN0ZDo6c3RyaW5nICplKSB7CisgICAgRXJyb3JTdHIgPSBlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBzZXRPcHRMZXZlbCAtIFNldCB0aGUgb3B0aW1pemF0aW9uIGxldmVsIGZvciB0aGUgSklULiAgVGhpcyBvcHRpb24KKyAgLy8vIGRlZmF1bHRzIHRvIENvZGVHZW5PcHQ6OkRlZmF1bHQuCisgIEVuZ2luZUJ1aWxkZXIgJnNldE9wdExldmVsKENvZGVHZW5PcHQ6OkxldmVsIGwpIHsKKyAgICBPcHRMZXZlbCA9IGw7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIHNldFRhcmdldE9wdGlvbnMgLSBTZXQgdGhlIHRhcmdldCBvcHRpb25zIHRoYXQgdGhlIEV4ZWN1dGlvbkVuZ2luZQorICAvLy8gdGFyZ2V0IGlzIHVzaW5nLiBEZWZhdWx0cyB0byBUYXJnZXRPcHRpb25zKCkuCisgIEVuZ2luZUJ1aWxkZXIgJnNldFRhcmdldE9wdGlvbnMoY29uc3QgVGFyZ2V0T3B0aW9ucyAmT3B0cykgeworICAgIE9wdGlvbnMgPSBPcHRzOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBzZXRSZWxvY2F0aW9uTW9kZWwgLSBTZXQgdGhlIHJlbG9jYXRpb24gbW9kZWwgdGhhdCB0aGUgRXhlY3V0aW9uRW5naW5lCisgIC8vLyB0YXJnZXQgaXMgdXNpbmcuIERlZmF1bHRzIHRvIHRhcmdldCBzcGVjaWZpYyBkZWZhdWx0ICJSZWxvYzo6RGVmYXVsdCIuCisgIEVuZ2luZUJ1aWxkZXIgJnNldFJlbG9jYXRpb25Nb2RlbChSZWxvYzo6TW9kZWwgUk0pIHsKKyAgICBSZWxvY01vZGVsID0gUk07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIHNldENvZGVNb2RlbCAtIFNldCB0aGUgQ29kZU1vZGVsIHRoYXQgdGhlIEV4ZWN1dGlvbkVuZ2luZSB0YXJnZXQKKyAgLy8vIGRhdGEgaXMgdXNpbmcuIERlZmF1bHRzIHRvIHRhcmdldCBzcGVjaWZpYyBkZWZhdWx0CisgIC8vLyAiQ29kZU1vZGVsOjpKSVREZWZhdWx0Ii4KKyAgRW5naW5lQnVpbGRlciAmc2V0Q29kZU1vZGVsKENvZGVNb2RlbDo6TW9kZWwgTSkgeworICAgIENNTW9kZWwgPSBNOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBzZXRNQXJjaCAtIE92ZXJyaWRlIHRoZSBhcmNoaXRlY3R1cmUgc2V0IGJ5IHRoZSBNb2R1bGUncyB0cmlwbGUuCisgIEVuZ2luZUJ1aWxkZXIgJnNldE1BcmNoKFN0cmluZ1JlZiBtYXJjaCkgeworICAgIE1BcmNoLmFzc2lnbihtYXJjaC5iZWdpbigpLCBtYXJjaC5lbmQoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIHNldE1DUFUgLSBUYXJnZXQgYSBzcGVjaWZpYyBjcHUgdHlwZS4KKyAgRW5naW5lQnVpbGRlciAmc2V0TUNQVShTdHJpbmdSZWYgbWNwdSkgeworICAgIE1DUFUuYXNzaWduKG1jcHUuYmVnaW4oKSwgbWNwdS5lbmQoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIHNldFZlcmlmeU1vZHVsZXMgLSBTZXQgd2hldGhlciB0aGUgSklUIGltcGxlbWVudGF0aW9uIHNob3VsZCB2ZXJpZnkKKyAgLy8vIElSIG1vZHVsZXMgZHVyaW5nIGNvbXBpbGF0aW9uLgorICBFbmdpbmVCdWlsZGVyICZzZXRWZXJpZnlNb2R1bGVzKGJvb2wgVmVyaWZ5KSB7CisgICAgVmVyaWZ5TW9kdWxlcyA9IFZlcmlmeTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gc2V0TUF0dHJzIC0gU2V0IGNwdS1zcGVjaWZpYyBhdHRyaWJ1dGVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJpbmdTZXF1ZW5jZT4KKyAgRW5naW5lQnVpbGRlciAmc2V0TUF0dHJzKGNvbnN0IFN0cmluZ1NlcXVlbmNlICZtYXR0cnMpIHsKKyAgICBNQXR0cnMuY2xlYXIoKTsKKyAgICBNQXR0cnMuYXBwZW5kKG1hdHRycy5iZWdpbigpLCBtYXR0cnMuZW5kKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIFxicmllZiBVc2UgT3JjTUNKSVRSZXBsYWNlbWVudCBpbnN0ZWFkIG9mIE1DSklULiBPZmYgYnkgZGVmYXVsdC4KKyAgdm9pZCBzZXRVc2VPcmNNQ0pJVFJlcGxhY2VtZW50KGJvb2wgVXNlT3JjTUNKSVRSZXBsYWNlbWVudCkgeworICAgIHRoaXMtPlVzZU9yY01DSklUUmVwbGFjZW1lbnQgPSBVc2VPcmNNQ0pJVFJlcGxhY2VtZW50OworICB9CisKKyAgdm9pZCBzZXRFbXVsYXRlZFRMUyhib29sIEVtdWxhdGVkVExTKSB7CisgICAgdGhpcy0+RW11bGF0ZWRUTFMgPSBFbXVsYXRlZFRMUzsKKyAgfQorICAKKyAgVGFyZ2V0TWFjaGluZSAqc2VsZWN0VGFyZ2V0KCk7CisKKyAgLy8vIHNlbGVjdFRhcmdldCAtIFBpY2sgYSB0YXJnZXQgZWl0aGVyIHZpYSAtbWFyY2ggb3IgYnkgZ3Vlc3NpbmcgdGhlIG5hdGl2ZQorICAvLy8gYXJjaC4gIEFkZCBhbnkgQ1BVIGZlYXR1cmVzIHNwZWNpZmllZCB2aWEgLW1jcHUgb3IgLW1hdHRyLgorICBUYXJnZXRNYWNoaW5lICpzZWxlY3RUYXJnZXQoY29uc3QgVHJpcGxlICZUYXJnZXRUcmlwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTUFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTUNQVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnN0cmluZz4mIE1BdHRycyk7CisKKyAgRXhlY3V0aW9uRW5naW5lICpjcmVhdGUoKSB7CisgICAgcmV0dXJuIGNyZWF0ZShzZWxlY3RUYXJnZXQoKSk7CisgIH0KKworICBFeGVjdXRpb25FbmdpbmUgKmNyZWF0ZShUYXJnZXRNYWNoaW5lICpUTSk7Cit9OworCisvLyBDcmVhdGUgd3JhcHBlcnMgZm9yIEMgQmluZGluZyB0eXBlcyAoc2VlIENCaW5kaW5nV3JhcHBpbmcuaCkuCitERUZJTkVfU0lNUExFX0NPTlZFUlNJT05fRlVOQ1RJT05TKEV4ZWN1dGlvbkVuZ2luZSwgTExWTUV4ZWN1dGlvbkVuZ2luZVJlZikKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX0VYRUNVVElPTkVOR0lORV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9HZW5lcmljVmFsdWUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL0dlbmVyaWNWYWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNGUzMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9HZW5lcmljVmFsdWUuaApAQCAtMCwwICsxLDU1IEBACisvLz09PS0gR2VuZXJpY1ZhbHVlLmggLSBSZXByZXNlbnQgYW55IHR5cGUgb2YgTExWTSB2YWx1ZSAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoZSBHZW5lcmljVmFsdWUgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgYW4gTExWTSB2YWx1ZSBvZiBhcmJpdHJhcnkgdHlwZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX0dFTkVSSUNWQUxVRV9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX0dFTkVSSUNWQUxVRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEludC5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCit1c2luZyBQb2ludGVyVHkgPSB2b2lkICo7CisKK3N0cnVjdCBHZW5lcmljVmFsdWUgeworICBzdHJ1Y3QgSW50UGFpciB7CisgICAgdW5zaWduZWQgaW50IGZpcnN0OworICAgIHVuc2lnbmVkIGludCBzZWNvbmQ7CisgIH07CisgIHVuaW9uIHsKKyAgICBkb3VibGUgRG91YmxlVmFsOworICAgIGZsb2F0IEZsb2F0VmFsOworICAgIFBvaW50ZXJUeSBQb2ludGVyVmFsOworICAgIHN0cnVjdCBJbnRQYWlyIFVJbnRQYWlyVmFsOworICAgIHVuc2lnbmVkIGNoYXIgVW50eXBlZFs4XTsKKyAgfTsKKyAgQVBJbnQgSW50VmFsOyAvLyBhbHNvIHVzZWQgZm9yIGxvbmcgZG91Ymxlcy4KKyAgLy8gRm9yIGFnZ3JlZ2F0ZSBkYXRhIHR5cGVzLgorICBzdGQ6OnZlY3RvcjxHZW5lcmljVmFsdWU+IEFnZ3JlZ2F0ZVZhbDsKKworICAvLyB0byBtYWtlIGNvZGUgZmFzdGVyLCBzZXQgR2VuZXJpY1ZhbHVlIHRvIHplcm8gY291bGQgYmUgb21pdHRlZCwgYnV0IGl0IGlzCisgIC8vIHBvdGVudGlhbGx5IGNhbiBjYXVzZSBwcm9ibGVtcywgc2luY2UgR2VuZXJpY1ZhbHVlIHRvIHN0b3JlIGdhcmJhZ2UKKyAgLy8gaW5zdGVhZCBvZiB6ZXJvLgorICBHZW5lcmljVmFsdWUoKSA6IEludFZhbCgxLCAwKSB7CisgICAgVUludFBhaXJWYWwuZmlyc3QgPSAwOworICAgIFVJbnRQYWlyVmFsLnNlY29uZCA9IDA7CisgIH0KKyAgZXhwbGljaXQgR2VuZXJpY1ZhbHVlKHZvaWQgKlYpIDogUG9pbnRlclZhbChWKSwgSW50VmFsKDEsIDApIHt9Cit9OworCitpbmxpbmUgR2VuZXJpY1ZhbHVlIFBUT0dWKHZvaWQgKlApIHsgcmV0dXJuIEdlbmVyaWNWYWx1ZShQKTsgfQoraW5saW5lIHZvaWQgKkdWVE9QKGNvbnN0IEdlbmVyaWNWYWx1ZSAmR1YpIHsgcmV0dXJuIEdWLlBvaW50ZXJWYWw7IH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX0dFTkVSSUNWQUxVRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9JbnRlcnByZXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvSW50ZXJwcmV0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTQ3MDc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvSW50ZXJwcmV0ZXIuaApAQCAtMCwwICsxLDI4IEBACisvLz09PS0tIEludGVycHJldGVyLmggLSBBYnN0cmFjdCBFeGVjdXRpb24gRW5naW5lIEludGVyZmFjZSAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBmb3JjZXMgdGhlIGludGVycHJldGVyIHRvIGxpbmsgaW4gb24gY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KKy8vIChXaW5kb3dzKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX0lOVEVSUFJFVEVSX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfSU5URVJQUkVURVJfSAorCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvRXhlY3V0aW9uRW5naW5lLmgiCisKK2V4dGVybiAiQyIgdm9pZCBMTFZNTGlua0luSW50ZXJwcmV0ZXIoKTsKKworbmFtZXNwYWNlIHsKKyAgc3RydWN0IEZvcmNlSW50ZXJwcmV0ZXJMaW5raW5nIHsKKyAgICBGb3JjZUludGVycHJldGVyTGlua2luZygpIHsgTExWTUxpbmtJbkludGVycHJldGVyKCk7IH0KKyAgfSBGb3JjZUludGVycHJldGVyTGlua2luZzsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRFdmVudExpc3RlbmVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRFdmVudExpc3RlbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3ODQwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL0pJVEV2ZW50TGlzdGVuZXIuaApAQCAtMCwwICsxLDEyNCBAQAorLy89PT0tIEpJVEV2ZW50TGlzdGVuZXIuaCAtIEV4cG9zZXMgZXZlbnRzIGZyb20gSklUIGNvbXBpbGF0aW9uIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgSklURXZlbnRMaXN0ZW5lciBpbnRlcmZhY2UsIHdoaWNoIGxldHMgdXNlcnMgZ2V0CisvLyBjYWxsYmFja3Mgd2hlbiBzaWduaWZpY2FudCBldmVudHMgaGFwcGVuIGR1cmluZyB0aGUgSklUIGNvbXBpbGF0aW9uIHByb2Nlc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9KSVRFVkVOVExJU1RFTkVSX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfSklURVZFTlRMSVNURU5FUl9ICisKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9sbHZtLWNvbmZpZy5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL1J1bnRpbWVEeWxkLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZWJ1Z0xvYy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEludGVsSklURXZlbnRzV3JhcHBlcjsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE9Qcm9maWxlV3JhcHBlcjsKKworbmFtZXNwYWNlIG9iamVjdCB7CisKK2NsYXNzIE9iamVjdEZpbGU7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvYmplY3QKKworLy8vIEpJVEV2ZW50X0VtaXR0ZWRGdW5jdGlvbkRldGFpbHMgLSBIZWxwZXIgc3RydWN0IGZvciBjb250YWluaW5nIGluZm9ybWF0aW9uCisvLy8gYWJvdXQgYSBnZW5lcmF0ZWQgbWFjaGluZSBjb2RlIGZ1bmN0aW9uLgorc3RydWN0IEpJVEV2ZW50X0VtaXR0ZWRGdW5jdGlvbkRldGFpbHMgeworICBzdHJ1Y3QgTGluZVN0YXJ0IHsKKyAgICAvLy8gVGhlIGFkZHJlc3MgYXQgd2hpY2ggdGhlIGN1cnJlbnQgbGluZSBjaGFuZ2VzLgorICAgIHVpbnRwdHJfdCBBZGRyZXNzOworCisgICAgLy8vIFRoZSBuZXcgbG9jYXRpb24gaW5mb3JtYXRpb24uICBUaGVzZSBjYW4gYmUgdHJhbnNsYXRlZCB0byBEZWJ1Z0xvY1R1cGxlcworICAgIC8vLyB1c2luZyBNRi0+Z2V0RGVidWdMb2NUdXBsZSgpLgorICAgIERlYnVnTG9jIExvYzsKKyAgfTsKKworICAvLy8gVGhlIG1hY2hpbmUgZnVuY3Rpb24gdGhlIHN0cnVjdCBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IuCisgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUY7CisKKyAgLy8vIFRoZSBsaXN0IG9mIGxpbmUgYm91bmRhcnkgaW5mb3JtYXRpb24sIHNvcnRlZCBieSBhZGRyZXNzLgorICBzdGQ6OnZlY3RvcjxMaW5lU3RhcnQ+IExpbmVTdGFydHM7Cit9OworCisvLy8gSklURXZlbnRMaXN0ZW5lciAtIEFic3RyYWN0IGludGVyZmFjZSBmb3IgdXNlIGJ5IHRoZSBKSVQgdG8gbm90aWZ5IGNsaWVudHMKKy8vLyBhYm91dCBzaWduaWZpY2FudCBldmVudHMgZHVyaW5nIGNvbXBpbGF0aW9uLiBGb3IgZXhhbXBsZSwgdG8gbm90aWZ5CisvLy8gcHJvZmlsZXJzIGFuZCBkZWJ1Z2dlcnMgdGhhdCBuZWVkIHRvIGtub3cgd2hlcmUgZnVuY3Rpb25zIGhhdmUgYmVlbiBlbWl0dGVkLgorLy8vCisvLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgZWFjaCBtZXRob2QgZG9lcyBub3RoaW5nLgorY2xhc3MgSklURXZlbnRMaXN0ZW5lciB7CitwdWJsaWM6CisgIHVzaW5nIEVtaXR0ZWRGdW5jdGlvbkRldGFpbHMgPSBKSVRFdmVudF9FbWl0dGVkRnVuY3Rpb25EZXRhaWxzOworCitwdWJsaWM6CisgIEpJVEV2ZW50TGlzdGVuZXIoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgfkpJVEV2ZW50TGlzdGVuZXIoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIE5vdGlmeU9iamVjdEVtaXR0ZWQgLSBDYWxsZWQgYWZ0ZXIgYW4gb2JqZWN0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQorICAvLy8gZW1pdHRlZCB0byBtZW1vcnkuICBOb3RpZnlGdW5jdGlvbkVtaXR0ZWQgd2lsbCBub3QgYmUgY2FsbGVkIGZvcgorICAvLy8gaW5kaXZpZHVhbCBmdW5jdGlvbnMgaW4gdGhlIG9iamVjdC4KKyAgLy8vCisgIC8vLyBFTEYtc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAgLy8vIFRoZSBPYmplY3RJbWFnZSBjb250YWlucyB0aGUgZ2VuZXJhdGVkIG9iamVjdCBpbWFnZQorICAvLy8gd2l0aCBzZWN0aW9uIGhlYWRlcnMgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBhZGRyZXNzIGF0IHdoaWNoIHNlY3Rpb25zCisgIC8vLyB3ZXJlIGxvYWRlZCBhbmQgd2l0aCByZWxvY2F0aW9ucyBwZXJmb3JtZWQgaW4tcGxhY2Ugb24gZGVidWcgc2VjdGlvbnMuCisgIHZpcnR1YWwgdm9pZCBOb3RpZnlPYmplY3RFbWl0dGVkKGNvbnN0IG9iamVjdDo6T2JqZWN0RmlsZSAmT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lRHlsZDo6TG9hZGVkT2JqZWN0SW5mbyAmTCkge30KKworICAvLy8gTm90aWZ5RnJlZWluZ09iamVjdCAtIENhbGxlZCBqdXN0IGJlZm9yZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aAorICAvLy8gYSBwcmV2aW91c2x5IGVtaXR0ZWQgb2JqZWN0IGlzIHJlbGVhc2VkLgorICB2aXJ0dWFsIHZvaWQgTm90aWZ5RnJlZWluZ09iamVjdChjb25zdCBvYmplY3Q6Ok9iamVjdEZpbGUgJk9iaikge30KKworICAvLyBHZXQgYSBwb2ludGUgdG8gdGhlIEdEQiBkZWJ1Z2dlciByZWdpc3RyYXRpb24gbGlzdGVuZXIuCisgIHN0YXRpYyBKSVRFdmVudExpc3RlbmVyICpjcmVhdGVHREJSZWdpc3RyYXRpb25MaXN0ZW5lcigpOworCisjaWYgTExWTV9VU0VfSU5URUxfSklURVZFTlRTCisgIC8vIENvbnN0cnVjdCBhbiBJbnRlbEpJVEV2ZW50TGlzdGVuZXIKKyAgc3RhdGljIEpJVEV2ZW50TGlzdGVuZXIgKmNyZWF0ZUludGVsSklURXZlbnRMaXN0ZW5lcigpOworCisgIC8vIENvbnN0cnVjdCBhbiBJbnRlbEpJVEV2ZW50TGlzdGVuZXIgd2l0aCBhIHRlc3QgSW50ZWwgSklUIEFQSSBpbXBsZW1lbnRhdGlvbgorICBzdGF0aWMgSklURXZlbnRMaXN0ZW5lciAqY3JlYXRlSW50ZWxKSVRFdmVudExpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbEpJVEV2ZW50c1dyYXBwZXIqIEFsdGVybmF0aXZlSW1wbCk7CisjZWxzZQorICBzdGF0aWMgSklURXZlbnRMaXN0ZW5lciAqY3JlYXRlSW50ZWxKSVRFdmVudExpc3RlbmVyKCkgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgIHN0YXRpYyBKSVRFdmVudExpc3RlbmVyICpjcmVhdGVJbnRlbEpJVEV2ZW50TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVsSklURXZlbnRzV3JhcHBlciogQWx0ZXJuYXRpdmVJbXBsKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyNlbmRpZiAvLyBVU0VfSU5URUxfSklURVZFTlRTCisKKyNpZiBMTFZNX1VTRV9PUFJPRklMRQorICAvLyBDb25zdHJ1Y3QgYW4gT1Byb2ZpbGVKSVRFdmVudExpc3RlbmVyCisgIHN0YXRpYyBKSVRFdmVudExpc3RlbmVyICpjcmVhdGVPUHJvZmlsZUpJVEV2ZW50TGlzdGVuZXIoKTsKKworICAvLyBDb25zdHJ1Y3QgYW4gT1Byb2ZpbGVKSVRFdmVudExpc3RlbmVyIHdpdGggYSB0ZXN0IG9wYWdlbnQgaW1wbGVtZW50YXRpb24KKyAgc3RhdGljIEpJVEV2ZW50TGlzdGVuZXIgKmNyZWF0ZU9Qcm9maWxlSklURXZlbnRMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1Byb2ZpbGVXcmFwcGVyKiBBbHRlcm5hdGl2ZUltcGwpOworI2Vsc2UKKyAgc3RhdGljIEpJVEV2ZW50TGlzdGVuZXIgKmNyZWF0ZU9Qcm9maWxlSklURXZlbnRMaXN0ZW5lcigpIHsgcmV0dXJuIG51bGxwdHI7IH0KKworICBzdGF0aWMgSklURXZlbnRMaXN0ZW5lciAqY3JlYXRlT1Byb2ZpbGVKSVRFdmVudExpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUHJvZmlsZVdyYXBwZXIqIEFsdGVybmF0aXZlSW1wbCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisjZW5kaWYgLy8gVVNFX09QUk9GSUxFCisKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9KSVRFVkVOVExJU1RFTkVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL0pJVFN5bWJvbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhYjE3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL0pJVFN5bWJvbC5oCkBAIC0wLDAgKzEsMzQ0IEBACisvLz09PS0gSklUU3ltYm9sLmggLSBKSVQgc3ltYm9sIGFic3RyYWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEFic3RyYWN0aW9uIGZvciB0YXJnZXQgcHJvY2VzcyBhZGRyZXNzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9KSVRTWU1CT0xfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9KSVRTWU1CT0xfSAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBHbG9iYWxWYWx1ZTsKKworbmFtZXNwYWNlIG9iamVjdCB7CisKK2NsYXNzIEJhc2ljU3ltYm9sUmVmOworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb2JqZWN0CisKKy8vLyBAYnJpZWYgUmVwcmVzZW50cyBhbiBhZGRyZXNzIGluIHRoZSB0YXJnZXQgcHJvY2VzcydzIGFkZHJlc3Mgc3BhY2UuCit1c2luZyBKSVRUYXJnZXRBZGRyZXNzID0gdWludDY0X3Q7CisKKy8vLyBAYnJpZWYgRmxhZ3MgZm9yIHN5bWJvbHMgaW4gdGhlIEpJVC4KK2NsYXNzIEpJVFN5bWJvbEZsYWdzIHsKK3B1YmxpYzoKKyAgdXNpbmcgVW5kZXJseWluZ1R5cGUgPSB1aW50OF90OworICB1c2luZyBUYXJnZXRGbGFnc1R5cGUgPSB1aW50NjRfdDsKKworICBlbnVtIEZsYWdOYW1lcyA6IFVuZGVybHlpbmdUeXBlIHsKKyAgICBOb25lID0gMCwKKyAgICBIYXNFcnJvciA9IDFVIDw8IDAsCisgICAgV2VhayA9IDFVIDw8IDEsCisgICAgQ29tbW9uID0gMVUgPDwgMiwKKyAgICBBYnNvbHV0ZSA9IDFVIDw8IDMsCisgICAgRXhwb3J0ZWQgPSAxVSA8PCA0LAorICAgIE5vdE1hdGVyaWFsaXplZCA9IDFVIDw8IDUKKyAgfTsKKworICBzdGF0aWMgSklUU3ltYm9sRmxhZ3Mgc3RyaXBUcmFuc2llbnRGbGFncyhKSVRTeW1ib2xGbGFncyBPcmlnKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEZsYWdOYW1lcz4oT3JpZy5GbGFncyAmIH5Ob3RNYXRlcmlhbGl6ZWQpOworICB9CisKKyAgLy8vIEBicmllZiBEZWZhdWx0LWNvbnN0cnVjdCBhIEpJVFN5bWJvbEZsYWdzIGluc3RhbmNlLgorICBKSVRTeW1ib2xGbGFncygpID0gZGVmYXVsdDsKKworICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhIEpJVFN5bWJvbEZsYWdzIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIGZsYWdzLgorICBKSVRTeW1ib2xGbGFncyhGbGFnTmFtZXMgRmxhZ3MpIDogRmxhZ3MoRmxhZ3MpIHt9CisKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3QgYSBKSVRTeW1ib2xGbGFncyBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBmbGFncyBhbmQgdGFyZ2V0CisgIC8vLyAgICAgICAgZmxhZ3MuCisgIEpJVFN5bWJvbEZsYWdzKEZsYWdOYW1lcyBGbGFncywgVGFyZ2V0RmxhZ3NUeXBlIFRhcmdldEZsYWdzKQorICAgIDogRmxhZ3MoRmxhZ3MpLCBUYXJnZXRGbGFncyhUYXJnZXRGbGFncykge30KKworICAvLy8gQGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZXRyaWV2aW5nIHRoaXMgc3ltYm9sLgorICBib29sIGhhc0Vycm9yKCkgY29uc3QgeworICAgIHJldHVybiAoRmxhZ3MgJiBIYXNFcnJvcikgPT0gSGFzRXJyb3I7CisgIH0KKworICAvLy8gQGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHN5bWJvbCBoYXMgYmVlbiBmdWxseSBtYXRlcmlhbGl6ZWQgKGkuZS4gaXMKKyAgLy8vICAgICAgICBjYWxsYWJsZSkuCisgIGJvb2wgaXNNYXRlcmlhbGl6ZWQoKSBjb25zdCB7IHJldHVybiAhKEZsYWdzICYgTm90TWF0ZXJpYWxpemVkKTsgfQorCisgIC8vLyBAYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBXZWFrIGZsYWcgaXMgc2V0LgorICBib29sIGlzV2VhaygpIGNvbnN0IHsKKyAgICByZXR1cm4gKEZsYWdzICYgV2VhaykgPT0gV2VhazsKKyAgfQorCisgIC8vLyBAYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBDb21tb24gZmxhZyBpcyBzZXQuCisgIGJvb2wgaXNDb21tb24oKSBjb25zdCB7CisgICAgcmV0dXJuIChGbGFncyAmIENvbW1vbikgPT0gQ29tbW9uOworICB9CisKKyAgLy8vIEBicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIHN5bWJvbCBpc24ndCB3ZWFrIG9yIGNvbW1vbi4KKyAgYm9vbCBpc1N0cm9uZygpIGNvbnN0IHsKKyAgICByZXR1cm4gIWlzV2VhaygpICYmICFpc0NvbW1vbigpOworICB9CisKKyAgLy8vIEBicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIEV4cG9ydGVkIGZsYWcgaXMgc2V0LgorICBib29sIGlzRXhwb3J0ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIChGbGFncyAmIEV4cG9ydGVkKSA9PSBFeHBvcnRlZDsKKyAgfQorCisgIC8vLyBAYnJpZWYgSW1wbGljaXRseSBjb252ZXJ0IHRvIHRoZSB1bmRlcmx5aW5nIGZsYWdzIHR5cGUuCisgIG9wZXJhdG9yIFVuZGVybHlpbmdUeXBlJigpIHsgcmV0dXJuIEZsYWdzOyB9CisKKyAgLy8vIEBicmllZiBJbXBsaWNpdGx5IGNvbnZlcnQgdG8gdGhlIHVuZGVybHlpbmcgZmxhZ3MgdHlwZS4KKyAgb3BlcmF0b3IgY29uc3QgVW5kZXJseWluZ1R5cGUmKCkgY29uc3QgeyByZXR1cm4gRmxhZ3M7IH0KKworICAvLy8gQGJyaWVmIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgdGFyZ2V0LXNwZWNpZmljIGZsYWdzLgorICBUYXJnZXRGbGFnc1R5cGUmIGdldFRhcmdldEZsYWdzKCkgeyByZXR1cm4gVGFyZ2V0RmxhZ3M7IH0KKworICAvLy8gQGJyaWVmIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgdGFyZ2V0LXNwZWNpZmljIGZsYWdzLgorICBjb25zdCBUYXJnZXRGbGFnc1R5cGUmIGdldFRhcmdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gVGFyZ2V0RmxhZ3M7IH0KKworICAvLy8gQ29uc3RydWN0IGEgSklUU3ltYm9sRmxhZ3MgdmFsdWUgYmFzZWQgb24gdGhlIGZsYWdzIG9mIHRoZSBnaXZlbiBnbG9iYWwKKyAgLy8vIHZhbHVlLgorICBzdGF0aWMgSklUU3ltYm9sRmxhZ3MgZnJvbUdsb2JhbFZhbHVlKGNvbnN0IEdsb2JhbFZhbHVlICZHVik7CisKKyAgLy8vIENvbnN0cnVjdCBhIEpJVFN5bWJvbEZsYWdzIHZhbHVlIGJhc2VkIG9uIHRoZSBmbGFncyBvZiB0aGUgZ2l2ZW4gbGlib2JqZWN0CisgIC8vLyBzeW1ib2wuCisgIHN0YXRpYyBKSVRTeW1ib2xGbGFncyBmcm9tT2JqZWN0U3ltYm9sKGNvbnN0IG9iamVjdDo6QmFzaWNTeW1ib2xSZWYgJlN5bWJvbCk7CisKK3ByaXZhdGU6CisgIFVuZGVybHlpbmdUeXBlIEZsYWdzID0gTm9uZTsKKyAgVGFyZ2V0RmxhZ3NUeXBlIFRhcmdldEZsYWdzID0gMDsKK307CisKKy8vLyBAYnJpZWYgQVJNLXNwZWNpZmljIEpJVCBzeW1ib2wgZmxhZ3MuCisvLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIG1vdmVkIGludG8gYSB0YXJnZXQtc3BlY2lmaWMgaGVhZGVyLgorY2xhc3MgQVJNSklUU3ltYm9sRmxhZ3MgeworcHVibGljOgorICBBUk1KSVRTeW1ib2xGbGFncygpID0gZGVmYXVsdDsKKworICBlbnVtIEZsYWdOYW1lcyB7CisgICAgTm9uZSA9IDAsCisgICAgVGh1bWIgPSAxIDw8IDAKKyAgfTsKKworICBvcGVyYXRvciBKSVRTeW1ib2xGbGFnczo6VGFyZ2V0RmxhZ3NUeXBlJigpIHsgcmV0dXJuIEZsYWdzOyB9CisKKyAgc3RhdGljIEFSTUpJVFN5bWJvbEZsYWdzIGZyb21PYmplY3RTeW1ib2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0OjpCYXNpY1N5bWJvbFJlZiAmU3ltYm9sKTsKK3ByaXZhdGU6CisgIEpJVFN5bWJvbEZsYWdzOjpUYXJnZXRGbGFnc1R5cGUgRmxhZ3MgPSAwOworfTsKKworLy8vIEBicmllZiBSZXByZXNlbnRzIGEgc3ltYm9sIHRoYXQgaGFzIGJlZW4gZXZhbHVhdGVkIHRvIGFuIGFkZHJlc3MgYWxyZWFkeS4KK2NsYXNzIEpJVEV2YWx1YXRlZFN5bWJvbCB7CitwdWJsaWM6CisgIEpJVEV2YWx1YXRlZFN5bWJvbCgpID0gZGVmYXVsdDsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhICdudWxsJyBzeW1ib2wuCisgIEpJVEV2YWx1YXRlZFN5bWJvbChzdGQ6Om51bGxwdHJfdCkge30KKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIHN5bWJvbCBmb3IgdGhlIGdpdmVuIGFkZHJlc3MgYW5kIGZsYWdzLgorICBKSVRFdmFsdWF0ZWRTeW1ib2woSklUVGFyZ2V0QWRkcmVzcyBBZGRyZXNzLCBKSVRTeW1ib2xGbGFncyBGbGFncykKKyAgICAgIDogQWRkcmVzcyhBZGRyZXNzKSwgRmxhZ3MoRmxhZ3MpIHt9CisKKyAgLy8vIEBicmllZiBBbiBldmFsdWF0ZWQgc3ltYm9sIGNvbnZlcnRzIHRvICd0cnVlJyBpZiBpdHMgYWRkcmVzcyBpcyBub24temVyby4KKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIEFkZHJlc3MgIT0gMDsgfQorCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoaXMgc3ltYm9sLgorICBKSVRUYXJnZXRBZGRyZXNzIGdldEFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBBZGRyZXNzOyB9CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIGZsYWdzIGZvciB0aGlzIHN5bWJvbC4KKyAgSklUU3ltYm9sRmxhZ3MgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBGbGFnczsgfQorCitwcml2YXRlOgorICBKSVRUYXJnZXRBZGRyZXNzIEFkZHJlc3MgPSAwOworICBKSVRTeW1ib2xGbGFncyBGbGFnczsKK307CisKKy8vLyBAYnJpZWYgUmVwcmVzZW50cyBhIHN5bWJvbCBpbiB0aGUgSklULgorY2xhc3MgSklUU3ltYm9sIHsKK3B1YmxpYzoKKyAgdXNpbmcgR2V0QWRkcmVzc0Z0b3IgPSBzdGQ6OmZ1bmN0aW9uPEV4cGVjdGVkPEpJVFRhcmdldEFkZHJlc3M+KCk+OworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgJ251bGwnIHN5bWJvbCwgdXNlZCB0byByZXByZXNlbnQgYSAic3ltYm9sIG5vdCBmb3VuZCIKKyAgLy8vICAgICAgICByZXN1bHQgZnJvbSBhIHN1Y2Nlc3NmdWwgKG5vbi1lcnJvbmVvdXMpIGxvb2t1cC4KKyAgSklUU3ltYm9sKHN0ZDo6bnVsbHB0cl90KQorICAgICAgOiBDYWNoZWRBZGRyKDApIHt9CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBKSVRTeW1ib2wgcmVwcmVzZW50aW5nIGFuIGVycm9yIGluIHRoZSBzeW1ib2wgbG9va3VwCisgIC8vLyAgICAgICAgcHJvY2VzcyAoZS5nLiBhIG5ldHdvcmsgZmFpbHVyZSBkdXJpbmcgYSByZW1vdGUgbG9va3VwKS4KKyAgSklUU3ltYm9sKEVycm9yIEVycikKKyAgICA6IEVycihzdGQ6Om1vdmUoRXJyKSksIEZsYWdzKEpJVFN5bWJvbEZsYWdzOjpIYXNFcnJvcikge30KKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIHN5bWJvbCBmb3IgYSBkZWZpbml0aW9uIHdpdGggYSBrbm93biBhZGRyZXNzLgorICBKSVRTeW1ib2woSklUVGFyZ2V0QWRkcmVzcyBBZGRyLCBKSVRTeW1ib2xGbGFncyBGbGFncykKKyAgICAgIDogQ2FjaGVkQWRkcihBZGRyKSwgRmxhZ3MoRmxhZ3MpIHt9CisKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3QgYSBKSVRTeW1ib2wgZnJvbSBhIEpJVEV2YWx1YXRlZFN5bWJvbC4KKyAgSklUU3ltYm9sKEpJVEV2YWx1YXRlZFN5bWJvbCBTeW0pCisgICAgICA6IENhY2hlZEFkZHIoU3ltLmdldEFkZHJlc3MoKSksIEZsYWdzKFN5bS5nZXRGbGFncygpKSB7fQorCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgc3ltYm9sIGZvciBhIGRlZmluaXRpb24gdGhhdCBkb2Vzbid0IGhhdmUgYSBrbm93biBhZGRyZXNzCisgIC8vLyAgICAgICAgeWV0LgorICAvLy8gQHBhcmFtIEdldEFkZHJlc3MgQSBmdW5jdG9yIHRvIG1hdGVyaWFsaXplIGEgZGVmaW5pdGlvbiAoZml4aW5nIHRoZQorICAvLy8gICAgICAgIGFkZHJlc3MpIG9uIGRlbWFuZC4KKyAgLy8vCisgIC8vLyAgIFRoaXMgY29uc3RydWN0b3IgYWxsb3dzIGEgSklUIGxheWVyIHRvIHByb3ZpZGUgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wKKyAgLy8vIGRlZmluaXRpb24gd2l0aG91dCBhY3R1YWxseSBtYXRlcmlhbGl6aW5nIHRoZSBkZWZpbml0aW9uIHVwIGZyb250LiBUaGUKKyAgLy8vIHVzZXIgY2FuIG1hdGVyaWFsaXplIHRoZSBkZWZpbml0aW9uIGF0IGFueSB0aW1lIGJ5IGNhbGxpbmcgdGhlIGdldEFkZHJlc3MKKyAgLy8vIG1ldGhvZC4KKyAgSklUU3ltYm9sKEdldEFkZHJlc3NGdG9yIEdldEFkZHJlc3MsIEpJVFN5bWJvbEZsYWdzIEZsYWdzKQorICAgICAgOiBHZXRBZGRyZXNzKHN0ZDo6bW92ZShHZXRBZGRyZXNzKSksIENhY2hlZEFkZHIoMCksIEZsYWdzKEZsYWdzKSB7fQorCisgIEpJVFN5bWJvbChjb25zdCBKSVRTeW1ib2wmKSA9IGRlbGV0ZTsKKyAgSklUU3ltYm9sJiBvcGVyYXRvcj0oY29uc3QgSklUU3ltYm9sJikgPSBkZWxldGU7CisKKyAgSklUU3ltYm9sKEpJVFN5bWJvbCAmJk90aGVyKQorICAgIDogR2V0QWRkcmVzcyhzdGQ6Om1vdmUoT3RoZXIuR2V0QWRkcmVzcykpLCBGbGFncyhzdGQ6Om1vdmUoT3RoZXIuRmxhZ3MpKSB7CisgICAgaWYgKEZsYWdzLmhhc0Vycm9yKCkpCisgICAgICBFcnIgPSBzdGQ6Om1vdmUoT3RoZXIuRXJyKTsKKyAgICBlbHNlCisgICAgICBDYWNoZWRBZGRyID0gc3RkOjptb3ZlKE90aGVyLkNhY2hlZEFkZHIpOworICB9CisKKyAgSklUU3ltYm9sJiBvcGVyYXRvcj0oSklUU3ltYm9sICYmT3RoZXIpIHsKKyAgICBHZXRBZGRyZXNzID0gc3RkOjptb3ZlKE90aGVyLkdldEFkZHJlc3MpOworICAgIEZsYWdzID0gc3RkOjptb3ZlKE90aGVyLkZsYWdzKTsKKyAgICBpZiAoRmxhZ3MuaGFzRXJyb3IoKSkKKyAgICAgIEVyciA9IHN0ZDo6bW92ZShPdGhlci5FcnIpOworICAgIGVsc2UKKyAgICAgIENhY2hlZEFkZHIgPSBzdGQ6Om1vdmUoT3RoZXIuQ2FjaGVkQWRkcik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgfkpJVFN5bWJvbCgpIHsKKyAgICBpZiAoRmxhZ3MuaGFzRXJyb3IoKSkKKyAgICAgIEVyci5+RXJyb3IoKTsKKyAgICBlbHNlCisgICAgICBDYWNoZWRBZGRyLn5KSVRUYXJnZXRBZGRyZXNzKCk7CisgIH0KKworICAvLy8gQGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3ltYm9sIGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlLgorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgIHJldHVybiAhRmxhZ3MuaGFzRXJyb3IoKSAmJiAoQ2FjaGVkQWRkciB8fCBHZXRBZGRyZXNzKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgTW92ZSB0aGUgZXJyb3IgZmllbGQgdmFsdWUgb3V0IG9mIHRoaXMgSklUU3ltYm9sLgorICBFcnJvciB0YWtlRXJyb3IoKSB7CisgICAgaWYgKEZsYWdzLmhhc0Vycm9yKCkpCisgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICAvLy8gQGJyaWVmIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIGluIHRoZSB0YXJnZXQgYWRkcmVzcyBzcGFjZS4gUmV0dXJucworICAvLy8gICAgICAgICcwJyBpZiB0aGUgc3ltYm9sIGRvZXMgbm90IGV4aXN0LgorICBFeHBlY3RlZDxKSVRUYXJnZXRBZGRyZXNzPiBnZXRBZGRyZXNzKCkgeworICAgIGFzc2VydCghRmxhZ3MuaGFzRXJyb3IoKSAmJiAiZ2V0QWRkcmVzcyBjYWxsZWQgb24gZXJyb3IgdmFsdWUiKTsKKyAgICBpZiAoR2V0QWRkcmVzcykgeworICAgICAgaWYgKGF1dG8gQ2FjaGVkQWRkck9yRXJyID0gR2V0QWRkcmVzcygpKSB7CisgICAgICAgIEdldEFkZHJlc3MgPSBudWxscHRyOworICAgICAgICBDYWNoZWRBZGRyID0gKkNhY2hlZEFkZHJPckVycjsKKyAgICAgICAgYXNzZXJ0KENhY2hlZEFkZHIgJiYgIlN5bWJvbCBjb3VsZCBub3QgYmUgbWF0ZXJpYWxpemVkLiIpOworICAgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBDYWNoZWRBZGRyT3JFcnIudGFrZUVycm9yKCk7CisgICAgfQorICAgIHJldHVybiBDYWNoZWRBZGRyOworICB9CisKKyAgSklUU3ltYm9sRmxhZ3MgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBGbGFnczsgfQorCitwcml2YXRlOgorICBHZXRBZGRyZXNzRnRvciBHZXRBZGRyZXNzOworICB1bmlvbiB7CisgICAgSklUVGFyZ2V0QWRkcmVzcyBDYWNoZWRBZGRyOworICAgIEVycm9yIEVycjsKKyAgfTsKKyAgSklUU3ltYm9sRmxhZ3MgRmxhZ3M7Cit9OworCisvLy8gQGJyaWVmIFN5bWJvbCByZXNvbHV0aW9uIGludGVyZmFjZS4KKy8vLworLy8vIEFsbG93cyBzeW1ib2wgZmxhZ3MgYW5kIGFkZHJlc3NlcyB0byBiZSBsb29rZWQgdXAgYnkgbmFtZS4KKy8vLyBTeW1ib2wgcXVlcmllcyBhcmUgZG9uZSBpbiBidWxrIChpLmUuIHlvdSByZXF1ZXN0IHJlc29sdXRpb24gb2YgYSBzZXQgb2YKKy8vLyBzeW1ib2xzLCByYXRoZXIgdGhhbiBhIHNpbmdsZSBvbmUpIHRvIHJlZHVjZSBJUEMgb3ZlcmhlYWQgaW4gdGhlIGNhc2Ugb2YKKy8vLyByZW1vdGUgSklUaW5nLCBhbmQgZXhwb3NlIG9wcG9ydHVuaXRpZXMgZm9yIHBhcmFsbGVsIGNvbXBpbGF0aW9uLgorY2xhc3MgSklUU3ltYm9sUmVzb2x2ZXIgeworcHVibGljOgorICB1c2luZyBMb29rdXBTZXQgPSBzdGQ6OnNldDxTdHJpbmdSZWY+OworICB1c2luZyBMb29rdXBSZXN1bHQgPSBzdGQ6Om1hcDxTdHJpbmdSZWYsIEpJVEV2YWx1YXRlZFN5bWJvbD47CisgIHVzaW5nIExvb2t1cEZsYWdzUmVzdWx0ID0gc3RkOjptYXA8U3RyaW5nUmVmLCBKSVRTeW1ib2xGbGFncz47CisKKyAgdmlydHVhbCB+SklUU3ltYm9sUmVzb2x2ZXIoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIEBicmllZiBSZXR1cm5zIHRoZSBmdWxseSByZXNvbHZlZCBhZGRyZXNzIGFuZCBmbGFncyBmb3IgZWFjaCBvZiB0aGUgZ2l2ZW4KKyAgLy8vICAgICAgICBzeW1ib2xzLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGFuIGVycm9yIGlmIGFueSBvZiB0aGUgZ2l2ZW4gc3ltYm9scyBjYW4gbm90IGJlCisgIC8vLyByZXNvbHZlZCwgb3IgaWYgdGhlIHJlc29sdXRpb24gcHJvY2VzcyBpdHNlbGYgdHJpZ2dlcnMgYW4gZXJyb3IuCisgIHZpcnR1YWwgRXhwZWN0ZWQ8TG9va3VwUmVzdWx0PiBsb29rdXAoY29uc3QgTG9va3VwU2V0ICZTeW1ib2xzKSA9IDA7CisKKyAgLy8vIEBicmllZiBSZXR1cm5zIHRoZSBzeW1ib2wgZmxhZ3MgZm9yIGVhY2ggb2YgdGhlIGdpdmVuIHN5bWJvbHMuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgZG9lcyBOT1QgcmV0dXJuIGFuIGVycm9yIGlmIGFueSBvZiB0aGUgZ2l2ZW4gc3ltYm9scyBpcworICAvLy8gbWlzc2luZy4gSW5zdGVhZCwgdGhhdCBzeW1ib2wgd2lsbCBiZSBsZWZ0IG91dCBvZiB0aGUgcmVzdWx0IG1hcC4KKyAgdmlydHVhbCBFeHBlY3RlZDxMb29rdXBGbGFnc1Jlc3VsdD4gbG9va3VwRmxhZ3MoY29uc3QgTG9va3VwU2V0ICZTeW1ib2xzKSA9IDA7CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKK307CisKKy8vLyBcYnJpZWYgTGVnYWN5IHN5bWJvbCByZXNvbHV0aW9uIGludGVyZmFjZS4KK2NsYXNzIExlZ2FjeUpJVFN5bWJvbFJlc29sdmVyIDogcHVibGljIEpJVFN5bWJvbFJlc29sdmVyIHsKK3B1YmxpYzoKKyAgLy8vIEBicmllZiBQZXJmb3JtcyBsb29rdXAgYnksIGZvciBlYWNoIHN5bWJvbCwgZmlyc3QgY2FsbGluZworICAvLy8gICAgICAgIGZpbmRTeW1ib2xJbkxvZ2ljYWxEeWxpYiBhbmQgaWYgdGhhdCBmYWlscyBjYWxsaW5nCisgIC8vLyAgICAgICAgZmluZFN5bWJvbC4KKyAgRXhwZWN0ZWQ8TG9va3VwUmVzdWx0PiBsb29rdXAoY29uc3QgTG9va3VwU2V0ICZTeW1ib2xzKSBmaW5hbDsKKworICAvLy8gQGJyaWVmIFBlcmZvcm1zIGZsYWdzIGxvb2t1cCBieSBjYWxsaW5nIGZpbmRTeW1ib2xJbkxvZ2ljYWxEeWxpYiBhbmQKKyAgLy8vICAgICAgICByZXR1cm5pbmcgdGhlIGZsYWdzIHZhbHVlIGZvciB0aGF0IHN5bWJvbC4KKyAgRXhwZWN0ZWQ8TG9va3VwRmxhZ3NSZXN1bHQ+IGxvb2t1cEZsYWdzKGNvbnN0IExvb2t1cFNldCAmU3ltYm9scykgZmluYWw7CisKKyAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBzeW1ib2wgaWYgaXQgZXhpc3RzCisgIC8vLyB3aXRoaW4gdGhlIGxvZ2ljYWwgZHluYW1pYyBsaWJyYXJ5IHJlcHJlc2VudGVkIGJ5IHRoaXMgSklUU3ltYm9sUmVzb2x2ZXIuCisgIC8vLyBVbmxpa2UgZmluZFN5bWJvbCwgcXVlcmllcyB0aHJvdWdoIHRoaXMgaW50ZXJmYWNlIHNob3VsZCByZXR1cm4gYWRkcmVzc2VzCisgIC8vLyBmb3IgaGlkZGVuIHN5bWJvbHMuCisgIC8vLworICAvLy8gVGhpcyBpcyBvZiBwYXJ0aWN1bGFyIGltcG9ydGFuY2UgZm9yIHRoZSBPcmMgSklUIEFQSXMsIHdoaWNoIHN1cHBvcnQgbGF6eQorICAvLy8gY29tcGlsYXRpb24gYnkgYnJlYWtpbmcgdXAgbW9kdWxlczogRWFjaCBvZiB0aG9zZSBicm9rZW4gb3V0IG1vZHVsZXMKKyAgLy8vIG11c3QgYmUgYWJsZSB0byByZXNvbHZlIGhpZGRlbiBzeW1ib2xzIHByb3ZpZGVkIGJ5IHRoZSBvdGhlcnMuIENsaWVudHMKKyAgLy8vIHdyaXRpbmcgbWVtb3J5IG1hbmFnZXJzIGZvciBNQ0pJVCBjYW4gdXN1YWxseSBpZ25vcmUgdGhpcyBtZXRob2QuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2Qgd2lsbCBiZSBxdWVyaWVkIGJ5IFJ1bnRpbWVEeWxkIHdoZW4gY2hlY2tpbmcgZm9yIHByZXZpb3VzCisgIC8vLyBkZWZpbml0aW9ucyBvZiBjb21tb24gc3ltYm9scy4KKyAgdmlydHVhbCBKSVRTeW1ib2wgZmluZFN5bWJvbEluTG9naWNhbER5bGliKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSA9IDA7CisKKyAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBvciB2YXJpYWJsZS4KKyAgLy8vIEl0IGlzIHVzZWQgdG8gcmVzb2x2ZSBzeW1ib2xzIGR1cmluZyBtb2R1bGUgbGlua2luZy4KKyAgLy8vCisgIC8vLyBJZiB0aGUgcmV0dXJuZWQgc3ltYm9sJ3MgYWRkcmVzcyBpcyBlcXVhbCB0byB+MFVMTCB0aGVuIFJ1bnRpbWVEeWxkIHdpbGwKKyAgLy8vIHNraXAgYWxsIHJlbG9jYXRpb25zIGZvciB0aGF0IHN5bWJvbCwgYW5kIHRoZSBjbGllbnQgd2lsbCBiZSByZXNwb25zaWJsZQorICAvLy8gZm9yIGhhbmRsaW5nIHRoZW0gbWFudWFsbHkuCisgIHZpcnR1YWwgSklUU3ltYm9sIGZpbmRTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpID0gMDsKKworcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX0pJVFNZTUJPTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9NQ0pJVC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvTUNKSVQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmRkYjdjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvTUNKSVQuaApAQCAtMCwwICsxLDM4IEBACisvLz09PS0tIE1DSklULmggLSBNQy1CYXNlZCBKdXN0LUluLVRpbWUgRXhlY3V0aW9uIEVuZ2luZSAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBmb3JjZXMgdGhlIE1DSklUIHRvIGxpbmsgaW4gb24gY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KKy8vIChXaW5kb3dzKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX01DSklUX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfTUNKSVRfSAorCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvRXhlY3V0aW9uRW5naW5lLmgiCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworZXh0ZXJuICJDIiB2b2lkIExMVk1MaW5rSW5NQ0pJVCgpOworCituYW1lc3BhY2UgeworICBzdHJ1Y3QgRm9yY2VNQ0pJVExpbmtpbmcgeworICAgIEZvcmNlTUNKSVRMaW5raW5nKCkgeworICAgICAgLy8gV2UgbXVzdCByZWZlcmVuY2UgTUNKSVQgaW4gc3VjaCBhIHdheSB0aGF0IGNvbXBpbGVycyB3aWxsIG5vdAorICAgICAgLy8gZGVsZXRlIGl0IGFsbCBhcyBkZWFkIGNvZGUsIGV2ZW4gd2l0aCB3aG9sZSBwcm9ncmFtIG9wdGltaXphdGlvbiwKKyAgICAgIC8vIHlldCBpcyBlZmZlY3RpdmVseSBhIE5PLU9QLiBBcyB0aGUgY29tcGlsZXIgaXNuJ3Qgc21hcnQgZW5vdWdoCisgICAgICAvLyB0byBrbm93IHRoYXQgZ2V0ZW52KCkgbmV2ZXIgcmV0dXJucyAtMSwgdGhpcyB3aWxsIGRvIHRoZSBqb2IuCisgICAgICBpZiAoc3RkOjpnZXRlbnYoImJhciIpICE9IChjaGFyKikgLTEpCisgICAgICAgIHJldHVybjsKKworICAgICAgTExWTUxpbmtJbk1DSklUKCk7CisgICAgfQorICB9IEZvcmNlTUNKSVRMaW5raW5nOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09Qcm9maWxlV3JhcHBlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT1Byb2ZpbGVXcmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkYTU5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09Qcm9maWxlV3JhcHBlci5oCkBAIC0wLDAgKzEsMTI0IEBACisvLz09PS0tIE9Qcm9maWxlV3JhcHBlci5oIC0gT1Byb2ZpbGUgSklUIEFQSSBXcmFwcGVyIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBPUHJvZmlsZVdyYXBwZXIgb2JqZWN0IHRoYXQgZGV0ZWN0cyBpZiB0aGUgb3Byb2ZpbGUKKy8vIGRhZW1vbiBpcyBydW5uaW5nLCBhbmQgcHJvdmlkZXMgd3JhcHBlcnMgZm9yIG9wYWdlbnQgZnVuY3Rpb25zIHVzZWQgdG8KKy8vIGNvbW11bmljYXRlIHdpdGggdGhlIG9wcm9maWxlIEpJVCBpbnRlcmZhY2UuIFRoZSBkeW5hbWljIGxpYnJhcnkgbGlib3BhZ2VudAorLy8gZG9lcyBub3QgbmVlZCB0byBiZSBsaW5rZWQgZGlyZWN0bHkgYXMgdGhpcyBvYmplY3QgbGF6aWx5IGxvYWRzIHRoZSBsaWJyYXJ5CisvLyB3aGVuIHRoZSBmaXJzdCBvcF8gZnVuY3Rpb24gaXMgY2FsbGVkLgorLy8KKy8vIFNlZSBodHRwOi8vb3Byb2ZpbGUuc291cmNlZm9yZ2UubmV0L2RvYy9kZXZlbC9qaXQtaW50ZXJmYWNlLmh0bWwgZm9yIHRoZQorLy8gZGVmaW5pdGlvbiBvZiB0aGUgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1BST0ZJTEVXUkFQUEVSX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfT1BST0ZJTEVXUkFQUEVSX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxvcGFnZW50Lmg+CisKK25hbWVzcGFjZSBsbHZtIHsKKworCitjbGFzcyBPUHJvZmlsZVdyYXBwZXIgeworICB0eXBlZGVmICBvcF9hZ2VudF90ICAgICgqb3Bfb3Blbl9hZ2VudF9wdHJfdCkoKTsKKyAgdHlwZWRlZiAgaW50ICAgICAgICAgICAoKm9wX2Nsb3NlX2FnZW50X3B0cl90KShvcF9hZ2VudF90KTsKKyAgdHlwZWRlZiAgaW50ICAgICAgICAgICAoKm9wX3dyaXRlX25hdGl2ZV9jb2RlX3B0cl90KShvcF9hZ2VudF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgY29uc3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50KTsKKyAgdHlwZWRlZiAgaW50ICAgICAgICAgICAoKm9wX3dyaXRlX2RlYnVnX2xpbmVfaW5mb19wdHJfdCkob3BfYWdlbnRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgY29uc3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRlYnVnX2xpbmVfaW5mbyBjb25zdCopOworICB0eXBlZGVmICBpbnQgICAgICAgICAgICgqb3BfdW5sb2FkX25hdGl2ZV9jb2RlX3B0cl90KShvcF9hZ2VudF90LCB1aW50NjRfdCk7CisKKyAgLy8gQWxzbyB1c2VkIGZvciBvcF9taW5vcl92ZXJzaW9uIGZ1bmN0aW9uIHdoaWNoIGhhcyB0aGUgc2FtZSBzaWduYXR1cmUKKyAgdHlwZWRlZiAgaW50ICAgICAgICAgICAoKm9wX21ham9yX3ZlcnNpb25fcHRyX3QpKCk7CisKKyAgLy8gVGhpcyBpcyBub3QgYSBwYXJ0IG9mIHRoZSBvcGFnZW50IEFQSSwgYnV0IGlzIHVzZWZ1bCBub25ldGhlbGVzcworICB0eXBlZGVmICBib29sICAgICAgICAgICgqSXNPUHJvZmlsZVJ1bm5pbmdQdHJUKSgpOworCisKKyAgb3BfYWdlbnRfdCAgICAgICAgICAgICAgICAgICAgICBBZ2VudDsKKyAgb3Bfb3Blbl9hZ2VudF9wdHJfdCAgICAgICAgICAgICBPcGVuQWdlbnRGdW5jOworICBvcF9jbG9zZV9hZ2VudF9wdHJfdCAgICAgICAgICAgIENsb3NlQWdlbnRGdW5jOworICBvcF93cml0ZV9uYXRpdmVfY29kZV9wdHJfdCAgICAgIFdyaXRlTmF0aXZlQ29kZUZ1bmM7CisgIG9wX3dyaXRlX2RlYnVnX2xpbmVfaW5mb19wdHJfdCAgV3JpdGVEZWJ1Z0xpbmVJbmZvRnVuYzsKKyAgb3BfdW5sb2FkX25hdGl2ZV9jb2RlX3B0cl90ICAgICBVbmxvYWROYXRpdmVDb2RlRnVuYzsKKyAgb3BfbWFqb3JfdmVyc2lvbl9wdHJfdCAgICAgICAgICBNYWpvclZlcnNpb25GdW5jOworICBvcF9tYWpvcl92ZXJzaW9uX3B0cl90ICAgICAgICAgIE1pbm9yVmVyc2lvbkZ1bmM7CisgIElzT1Byb2ZpbGVSdW5uaW5nUHRyVCAgICAgICAgICAgSXNPUHJvZmlsZVJ1bm5pbmdGdW5jOworCisgIGJvb2wgSW5pdGlhbGl6ZWQ7CisKK3B1YmxpYzoKKyAgT1Byb2ZpbGVXcmFwcGVyKCk7CisKKyAgLy8gRm9yIHRlc3Rpbmcgd2l0aCBhIG1vY2sgb3BhZ2VudCBpbXBsZW1lbnRhdGlvbiwgc2tpcHMgdGhlIGR5bmFtaWMgbG9hZCBhbmQKKyAgLy8gdGhlIGZ1bmN0aW9uIHJlc29sdXRpb24uCisgIE9Qcm9maWxlV3JhcHBlcihvcF9vcGVuX2FnZW50X3B0cl90IE9wZW5BZ2VudEltcGwsCisgICAgICAgICAgICAgICAgICBvcF9jbG9zZV9hZ2VudF9wdHJfdCBDbG9zZUFnZW50SW1wbCwKKyAgICAgICAgICAgICAgICAgIG9wX3dyaXRlX25hdGl2ZV9jb2RlX3B0cl90IFdyaXRlTmF0aXZlQ29kZUltcGwsCisgICAgICAgICAgICAgICAgICBvcF93cml0ZV9kZWJ1Z19saW5lX2luZm9fcHRyX3QgV3JpdGVEZWJ1Z0xpbmVJbmZvSW1wbCwKKyAgICAgICAgICAgICAgICAgIG9wX3VubG9hZF9uYXRpdmVfY29kZV9wdHJfdCBVbmxvYWROYXRpdmVDb2RlSW1wbCwKKyAgICAgICAgICAgICAgICAgIG9wX21ham9yX3ZlcnNpb25fcHRyX3QgTWFqb3JWZXJzaW9uSW1wbCwKKyAgICAgICAgICAgICAgICAgIG9wX21ham9yX3ZlcnNpb25fcHRyX3QgTWlub3JWZXJzaW9uSW1wbCwKKyAgICAgICAgICAgICAgICAgIElzT1Byb2ZpbGVSdW5uaW5nUHRyVCBNb2NrSXNPUHJvZmlsZVJ1bm5pbmdJbXBsID0gMCkKKyAgOiBPcGVuQWdlbnRGdW5jKE9wZW5BZ2VudEltcGwpLAorICAgIENsb3NlQWdlbnRGdW5jKENsb3NlQWdlbnRJbXBsKSwKKyAgICBXcml0ZU5hdGl2ZUNvZGVGdW5jKFdyaXRlTmF0aXZlQ29kZUltcGwpLAorICAgIFdyaXRlRGVidWdMaW5lSW5mb0Z1bmMoV3JpdGVEZWJ1Z0xpbmVJbmZvSW1wbCksCisgICAgVW5sb2FkTmF0aXZlQ29kZUZ1bmMoVW5sb2FkTmF0aXZlQ29kZUltcGwpLAorICAgIE1ham9yVmVyc2lvbkZ1bmMoTWFqb3JWZXJzaW9uSW1wbCksCisgICAgTWlub3JWZXJzaW9uRnVuYyhNaW5vclZlcnNpb25JbXBsKSwKKyAgICBJc09Qcm9maWxlUnVubmluZ0Z1bmMoTW9ja0lzT1Byb2ZpbGVSdW5uaW5nSW1wbCksCisgICAgSW5pdGlhbGl6ZWQodHJ1ZSkKKyAgeworICB9CisKKyAgLy8gQ2FsbHMgb3Bfb3Blbl9hZ2VudCBpbiB0aGUgb3Byb2ZpbGUgSklUIGxpYnJhcnkgYW5kIHNhdmVzIHRoZSByZXR1cm5lZAorICAvLyBvcF9hZ2VudF90IGhhbmRsZSBpbnRlcm5hbGx5IHNvIGl0IGNhbiBiZSB1c2VkIHdoZW4gY2FsbGluZyBhbGwgdGhlIG90aGVyCisgIC8vIG9wXyogZnVuY3Rpb25zLiBDYWxsZXJzIG9mIHRoaXMgY2xhc3MgZG8gbm90IG5lZWQgdG8ga2VlcCB0cmFjayBvZgorICAvLyBvcF9hZ2VudF90IG9iamVjdHMuCisgIGJvb2wgb3Bfb3Blbl9hZ2VudCgpOworCisgIGludCBvcF9jbG9zZV9hZ2VudCgpOworICBpbnQgb3Bfd3JpdGVfbmF0aXZlX2NvZGUoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIGNvbnN0KiBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IHNpemUpOworICBpbnQgb3Bfd3JpdGVfZGVidWdfbGluZV9pbmZvKHZvaWQgY29uc3QqIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZWJ1Z19saW5lX2luZm8gY29uc3QqIGluZm8pOworICBpbnQgb3BfdW5sb2FkX25hdGl2ZV9jb2RlKHVpbnQ2NF90IGFkZHIpOworICBpbnQgb3BfbWFqb3JfdmVyc2lvbigpOworICBpbnQgb3BfbWlub3JfdmVyc2lvbigpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgb3Byb2ZpbGVkIHByb2Nlc3MgaXMgcnVubmluZywgdGhlIG9wYWdlbnQgbGlicmFyeSBpcworICAvLyBsb2FkZWQgYW5kIGEgY29ubmVjdGlvbiB0byB0aGUgYWdlbnQgaGFzIGJlZW4gZXN0YWJsaXNoZWQsIGFuZCBmYWxzZQorICAvLyBvdGhlcndpc2UuCisgIGJvb2wgaXNBZ2VudEF2YWlsYWJsZSgpOworCitwcml2YXRlOgorICAvLyBMb2FkcyB0aGUgbGlib3BhZ2VudCBsaWJyYXJ5IGFuZCBpbml0aWFsaXplcyB0aGlzIHdyYXBwZXIgaWYgdGhlIG9wcm9maWxlCisgIC8vIGRhZW1vbiBpcyBydW5uaW5nCisgIGJvb2wgaW5pdGlhbGl6ZSgpOworCisgIC8vIFNlYXJjaGVzIC9wcm9jIGZvciB0aGUgb3Byb2ZpbGUgZGFlbW9uIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHByb2Nlc3MgaWYKKyAgLy8gZm91bmQsIG9yIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBjaGVja0Zvck9Qcm9maWxlUHJvY0VudHJ5KCk7CisKKyAgYm9vbCBpc09Qcm9maWxlUnVubmluZygpOworfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfT1BST0ZJTEVXUkFQUEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09iamVjdENhY2hlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PYmplY3RDYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NzA0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PYmplY3RDYWNoZS5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vPT09LS0gT2JqZWN0Q2FjaGUuaCAtIENsYXNzIGRlZmluaXRpb24gZm9yIHRoZSBPYmplY3RDYWNoZSAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT0JKRUNUQ0FDSEVfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PQkpFQ1RDQUNIRV9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZTsKKworLy8vIFRoaXMgaXMgdGhlIGJhc2UgT2JqZWN0Q2FjaGUgdHlwZSB3aGljaCBjYW4gYmUgcHJvdmlkZWQgdG8gYW4KKy8vLyBFeGVjdXRpb25FbmdpbmUgZm9yIHRoZSBwdXJwb3NlIG9mIGF2b2lkaW5nIGNvbXBpbGF0aW9uIGZvciBNb2R1bGVzIHRoYXQKKy8vLyBoYXZlIGFscmVhZHkgYmVlbiBjb21waWxlZCBhbmQgYW4gb2JqZWN0IGZpbGUgaXMgYXZhaWxhYmxlLgorY2xhc3MgT2JqZWN0Q2FjaGUgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3B1YmxpYzoKKyAgT2JqZWN0Q2FjaGUoKSA9IGRlZmF1bHQ7CisKKyAgdmlydHVhbCB+T2JqZWN0Q2FjaGUoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIG5vdGlmeU9iamVjdENvbXBpbGVkIC0gUHJvdmlkZXMgYSBwb2ludGVyIHRvIGNvbXBpbGVkIGNvZGUgZm9yIE1vZHVsZSBNLgorICB2aXJ0dWFsIHZvaWQgbm90aWZ5T2JqZWN0Q29tcGlsZWQoY29uc3QgTW9kdWxlICpNLCBNZW1vcnlCdWZmZXJSZWYgT2JqKSA9IDA7CisKKyAgLy8vIFJldHVybnMgYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIE1lbW9yeUJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZQorICAvLy8gb2JqZWN0IHdoaWNoIGNvcnJlc3BvbmRzIHdpdGggTW9kdWxlIE0sIG9yIDAgaWYgYW4gb2JqZWN0IGlzIG5vdAorICAvLy8gYXZhaWxhYmxlLgorICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IGdldE9iamVjdChjb25zdCBNb2R1bGUqIE0pID0gMDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9PQkpFQ1RDQUNIRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PYmplY3RNZW1vcnlCdWZmZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09iamVjdE1lbW9yeUJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMDBhZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PYmplY3RNZW1vcnlCdWZmZXIuaApAQCAtMCwwICsxLDYzIEBACisvLz09PS0gT2JqZWN0TWVtb3J5QnVmZmVyLmggLSBTbWFsbFZlY3Rvci1iYWNrZWQgTWVtb3J5QnVmZnJlciAgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBhIHdyYXBwZXIgY2xhc3MgdG8gaG9sZCB0aGUgbWVtb3J5IGludG8gd2hpY2ggYW4KKy8vIG9iamVjdCB3aWxsIGJlIGdlbmVyYXRlZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09CSkVDVE1FTU9SWUJVRkZFUl9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09CSkVDVE1FTU9SWUJVRkZFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gXGJyaWVmIFNtYWxsVmVjdG9yLWJhY2tlZCBNZW1vcnlCdWZmZXIgaW5zdGFuY2UuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGVuYWJsZXMgZWZmaWNpZW50IGNvbnN0cnVjdGlvbiBvZiBNZW1vcnlCdWZmZXJzIGZyb20gU21hbGxWZWN0b3IKKy8vLyBpbnN0YW5jZXMuIFRoaXMgaXMgdXNlZnVsIGZvciBNQ0pJVCBhbmQgT3JjLCB3aGVyZSBvYmplY3QgZmlsZXMgYXJlIHN0cmVhbWVkCisvLy8gaW50byBTbWFsbFZlY3RvcnMsIHRoZW4gaW5zcGVjdGVkIHVzaW5nIE9iamVjdEZpbGUgKHdoaWNoIHRha2VzIGEKKy8vLyBNZW1vcnlCdWZmZXIpLgorY2xhc3MgT2JqZWN0TWVtb3J5QnVmZmVyIDogcHVibGljIE1lbW9yeUJ1ZmZlciB7CitwdWJsaWM6CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYW4gT2JqZWN0TWVtb3J5QnVmZmVyIGZyb20gdGhlIGdpdmVuIFNtYWxsVmVjdG9yIHItdmFsdWUuCisgIC8vLworICAvLy8gRklYTUU6IEl0J2QgYmUgbmljZSBmb3IgdGhpcyB0byBiZSBhIG5vbi10ZW1wbGF0ZWQgY29uc3RydWN0b3IgdGFraW5nIGEKKyAgLy8vIFNtYWxsVmVjdG9ySW1wbCBoZXJlIGluc3RlYWQgb2YgYSB0ZW1wbGF0ZWQgb25lIHRha2luZyBhIFNtYWxsVmVjdG9yPE4+LAorICAvLy8gYnV0IFNtYWxsVmVjdG9yJ3MgbW92ZS1jb25zdHJ1Y3Rpb24vYXNzaWdubWVudCBjdXJyZW50bHkgb25seSB0YWtlCisgIC8vLyBTbWFsbFZlY3RvcnMuIElmL3doZW4gdGhhdCBpcyBmaXhlZCB3ZSBjYW4gc2ltcGxpZnkgdGhpcyBjb25zdHJ1Y3RvciBhbmQKKyAgLy8vIHRoZSBmb2xsb3dpbmcgb25lLgorICBPYmplY3RNZW1vcnlCdWZmZXIoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICYmU1YpCisgICAgOiBTVihzdGQ6Om1vdmUoU1YpKSwgQnVmZmVyTmFtZSgiPGluLW1lbW9yeSBvYmplY3Q+IikgeworICAgIGluaXQodGhpcy0+U1YuYmVnaW4oKSwgdGhpcy0+U1YuZW5kKCksIGZhbHNlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgbmFtZWQgT2JqZWN0TWVtb3J5QnVmZmVyIGZyb20gdGhlIGdpdmVuIFNtYWxsVmVjdG9yCisgIC8vLyAgICAgICAgci12YWx1ZSBhbmQgU3RyaW5nUmVmLgorICBPYmplY3RNZW1vcnlCdWZmZXIoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICYmU1YsIFN0cmluZ1JlZiBOYW1lKQorICAgIDogU1Yoc3RkOjptb3ZlKFNWKSksIEJ1ZmZlck5hbWUoTmFtZSkgeworICAgIGluaXQodGhpcy0+U1YuYmVnaW4oKSwgdGhpcy0+U1YuZW5kKCksIGZhbHNlKTsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRCdWZmZXJJZGVudGlmaWVyKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gQnVmZmVyTmFtZTsgfQorCisgIEJ1ZmZlcktpbmQgZ2V0QnVmZmVyS2luZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIE1lbW9yeUJ1ZmZlcl9NYWxsb2M7IH0KKworcHJpdmF0ZToKKyAgU21hbGxWZWN0b3I8Y2hhciwgMD4gU1Y7CisgIHN0ZDo6c3RyaW5nIEJ1ZmZlck5hbWU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0NvbXBpbGVPbkRlbWFuZExheWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvQ29tcGlsZU9uRGVtYW5kTGF5ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjRhNmRkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0NvbXBpbGVPbkRlbWFuZExheWVyLmgKQEAgLTAsMCArMSw2ODEgQEAKKy8vPT09LSBDb21waWxlT25EZW1hbmRMYXllci5oIC0gQ29tcGlsZSBlYWNoIGZ1bmN0aW9uIG9uIGRlbWFuZCAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gSklUIGxheWVyIGZvciBicmVha2luZyB1cCBtb2R1bGVzIGFuZCBpbnNlcnRpbmcgY2FsbGJhY2tzIHRvIGFsbG93CisvLyBpbmRpdmlkdWFsIGZ1bmN0aW9ucyB0byBiZSBjb21waWxlZCBvbiBkZW1hbmQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfQ09NUElMRU9OREVNQU5ETEFZRVJfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfQ09NUElMRU9OREVNQU5ETEFZRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0pJVFN5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9Db3JlLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0luZGlyZWN0aW9uVXRpbHMuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvTGFtYmRhUmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT3JjRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9SdW50aW1lRHlsZC5oIgorI2luY2x1ZGUgImxsdm0vSVIvQXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGF0YUxheW91dC5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbEFsaWFzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9HbG9iYWxWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFyaWFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9NYW5nbGVyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9WYWx1ZU1hcHBlci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBWYWx1ZTsKKworbmFtZXNwYWNlIG9yYyB7CisKKy8vLyBAYnJpZWYgQ29tcGlsZS1vbi1kZW1hbmQgbGF5ZXIuCisvLy8KKy8vLyAgIFdoZW4gYSBtb2R1bGUgaXMgYWRkZWQgdG8gdGhpcyBsYXllciBhIHN0dWIgaXMgY3JlYXRlZCBmb3IgZWFjaCBvZiBpdHMKKy8vLyBmdW5jdGlvbiBkZWZpbml0aW9ucy4gVGhlIHN0dWJzIGFuZCBvdGhlciBnbG9iYWwgdmFsdWVzIGFyZSBpbW1lZGlhdGVseQorLy8vIGFkZGVkIHRvIHRoZSBsYXllciBiZWxvdy4gV2hlbiBhIHN0dWIgaXMgY2FsbGVkIGl0IHRyaWdnZXJzIHRoZSBleHRyYWN0aW9uCisvLy8gb2YgdGhlIGZ1bmN0aW9uIGJvZHkgZnJvbSB0aGUgb3JpZ2luYWwgbW9kdWxlLiBUaGUgZXh0cmFjdGVkIGJvZHkgaXMgdGhlbgorLy8vIGNvbXBpbGVkIGFuZCBleGVjdXRlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBCYXNlTGF5ZXJULAorICAgICAgICAgIHR5cGVuYW1lIENvbXBpbGVDYWxsYmFja01nclQgPSBKSVRDb21waWxlQ2FsbGJhY2tNYW5hZ2VyLAorICAgICAgICAgIHR5cGVuYW1lIEluZGlyZWN0U3R1YnNNZ3JUID0gSW5kaXJlY3RTdHVic01hbmFnZXI+CitjbGFzcyBDb21waWxlT25EZW1hbmRMYXllciB7Citwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0ZXJpYWxpemVyRnRvcj4KKyAgY2xhc3MgTGFtYmRhTWF0ZXJpYWxpemVyIGZpbmFsIDogcHVibGljIFZhbHVlTWF0ZXJpYWxpemVyIHsKKyAgcHVibGljOgorICAgIExhbWJkYU1hdGVyaWFsaXplcihNYXRlcmlhbGl6ZXJGdG9yIE0pIDogTShzdGQ6Om1vdmUoTSkpIHt9CisKKyAgICBWYWx1ZSAqbWF0ZXJpYWxpemUoVmFsdWUgKlYpIGZpbmFsIHsgcmV0dXJuIE0oVik7IH0KKworICBwcml2YXRlOgorICAgIE1hdGVyaWFsaXplckZ0b3IgTTsKKyAgfTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0ZXJpYWxpemVyRnRvcj4KKyAgTGFtYmRhTWF0ZXJpYWxpemVyPE1hdGVyaWFsaXplckZ0b3I+CisgIGNyZWF0ZUxhbWJkYU1hdGVyaWFsaXplcihNYXRlcmlhbGl6ZXJGdG9yIE0pIHsKKyAgICByZXR1cm4gTGFtYmRhTWF0ZXJpYWxpemVyPE1hdGVyaWFsaXplckZ0b3I+KHN0ZDo6bW92ZShNKSk7CisgIH0KKworICAvLyBQcm92aWRlIHR5cGUtZXJhc3VyZSBmb3IgdGhlIE1vZHVsZXMgYW5kIE1lbW9yeU1hbmFnZXJzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzb3VyY2VUPgorICBjbGFzcyBSZXNvdXJjZU93bmVyIHsKKyAgcHVibGljOgorICAgIFJlc291cmNlT3duZXIoKSA9IGRlZmF1bHQ7CisgICAgUmVzb3VyY2VPd25lcihjb25zdCBSZXNvdXJjZU93bmVyICYpID0gZGVsZXRlOworICAgIFJlc291cmNlT3duZXIgJm9wZXJhdG9yPShjb25zdCBSZXNvdXJjZU93bmVyICYpID0gZGVsZXRlOworICAgIHZpcnR1YWwgflJlc291cmNlT3duZXIoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIFJlc291cmNlVCYgZ2V0UmVzb3VyY2UoKSBjb25zdCA9IDA7CisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc291cmNlVCwgdHlwZW5hbWUgUmVzb3VyY2VQdHJUPgorICBjbGFzcyBSZXNvdXJjZU93bmVySW1wbCA6IHB1YmxpYyBSZXNvdXJjZU93bmVyPFJlc291cmNlVD4geworICBwdWJsaWM6CisgICAgUmVzb3VyY2VPd25lckltcGwoUmVzb3VyY2VQdHJUIFJlc291cmNlUHRyKQorICAgICAgOiBSZXNvdXJjZVB0cihzdGQ6Om1vdmUoUmVzb3VyY2VQdHIpKSB7fQorCisgICAgUmVzb3VyY2VUJiBnZXRSZXNvdXJjZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICpSZXNvdXJjZVB0cjsgfQorCisgIHByaXZhdGU6CisgICAgUmVzb3VyY2VQdHJUIFJlc291cmNlUHRyOworICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXNvdXJjZVQsIHR5cGVuYW1lIFJlc291cmNlUHRyVD4KKyAgc3RkOjp1bmlxdWVfcHRyPFJlc291cmNlT3duZXI8UmVzb3VyY2VUPj4KKyAgd3JhcE93bmVyc2hpcChSZXNvdXJjZVB0clQgUmVzb3VyY2VQdHIpIHsKKyAgICB1c2luZyBSTyA9IFJlc291cmNlT3duZXJJbXBsPFJlc291cmNlVCwgUmVzb3VyY2VQdHJUPjsKKyAgICByZXR1cm4gbGx2bTo6bWFrZV91bmlxdWU8Uk8+KHN0ZDo6bW92ZShSZXNvdXJjZVB0cikpOworICB9CisKKyAgY2xhc3MgU3RhdGljR2xvYmFsUmVuYW1lciB7CisgIHB1YmxpYzoKKyAgICBTdGF0aWNHbG9iYWxSZW5hbWVyKCkgPSBkZWZhdWx0OworICAgIFN0YXRpY0dsb2JhbFJlbmFtZXIoU3RhdGljR2xvYmFsUmVuYW1lciAmJikgPSBkZWZhdWx0OworICAgIFN0YXRpY0dsb2JhbFJlbmFtZXIgJm9wZXJhdG9yPShTdGF0aWNHbG9iYWxSZW5hbWVyICYmKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIHJlbmFtZShNb2R1bGUgJk0pIHsKKyAgICAgIGZvciAoYXV0byAmRiA6IE0pCisgICAgICAgIGlmIChGLmhhc0xvY2FsTGlua2FnZSgpKQorICAgICAgICAgIEYuc2V0TmFtZSgiJHN0YXRpYy4iICsgVHdpbmUoTmV4dElkKyspKTsKKyAgICAgIGZvciAoYXV0byAmRyA6IE0uZ2xvYmFscygpKQorICAgICAgICBpZiAoRy5oYXNMb2NhbExpbmthZ2UoKSkKKyAgICAgICAgICBHLnNldE5hbWUoIiRzdGF0aWMuIiArIFR3aW5lKE5leHRJZCsrKSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdW5zaWduZWQgTmV4dElkID0gMDsKKyAgfTsKKworICBzdHJ1Y3QgTG9naWNhbER5bGliIHsKKyAgICBzdHJ1Y3QgU291cmNlTW9kdWxlRW50cnkgeworICAgICAgc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gU291cmNlTW9kOworICAgICAgc3RkOjpzZXQ8RnVuY3Rpb24qPiBTdHVic1RvQ2xvbmU7CisgICAgfTsKKworICAgIHVzaW5nIFNvdXJjZU1vZHVsZXNMaXN0ID0gc3RkOjp2ZWN0b3I8U291cmNlTW9kdWxlRW50cnk+OworICAgIHVzaW5nIFNvdXJjZU1vZHVsZUhhbmRsZSA9IHR5cGVuYW1lIFNvdXJjZU1vZHVsZXNMaXN0OjpzaXplX3R5cGU7CisKKyAgICBMb2dpY2FsRHlsaWIoKSA9IGRlZmF1bHQ7CisKKyAgICBMb2dpY2FsRHlsaWIoVk1vZHVsZUtleSBLLCBzdGQ6OnNoYXJlZF9wdHI8U3ltYm9sUmVzb2x2ZXI+IEJhY2tpbmdSZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEluZGlyZWN0U3R1YnNNZ3JUPiBTdHVic01ncikKKyAgICAgICAgOiBLKHN0ZDo6bW92ZShLKSksIEJhY2tpbmdSZXNvbHZlcihzdGQ6Om1vdmUoQmFja2luZ1Jlc29sdmVyKSksCisgICAgICAgICAgU3R1YnNNZ3Ioc3RkOjptb3ZlKFN0dWJzTWdyKSkge30KKworICAgIFNvdXJjZU1vZHVsZUhhbmRsZSBhZGRTb3VyY2VNb2R1bGUoc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gTSkgeworICAgICAgU291cmNlTW9kdWxlSGFuZGxlIEggPSBTb3VyY2VNb2R1bGVzLnNpemUoKTsKKyAgICAgIFNvdXJjZU1vZHVsZXMucHVzaF9iYWNrKFNvdXJjZU1vZHVsZUVudHJ5KCkpOworICAgICAgU291cmNlTW9kdWxlcy5iYWNrKCkuU291cmNlTW9kID0gc3RkOjptb3ZlKE0pOworICAgICAgcmV0dXJuIEg7CisgICAgfQorCisgICAgTW9kdWxlJiBnZXRTb3VyY2VNb2R1bGUoU291cmNlTW9kdWxlSGFuZGxlIEgpIHsKKyAgICAgIHJldHVybiAqU291cmNlTW9kdWxlc1tIXS5Tb3VyY2VNb2Q7CisgICAgfQorCisgICAgc3RkOjpzZXQ8RnVuY3Rpb24qPiYgZ2V0U3R1YnNUb0Nsb25lKFNvdXJjZU1vZHVsZUhhbmRsZSBIKSB7CisgICAgICByZXR1cm4gU291cmNlTW9kdWxlc1tIXS5TdHVic1RvQ2xvbmU7CisgICAgfQorCisgICAgSklUU3ltYm9sIGZpbmRTeW1ib2woQmFzZUxheWVyVCAmQmFzZUxheWVyLCBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEV4cG9ydGVkU3ltYm9sc09ubHkpIHsKKyAgICAgIGlmIChhdXRvIFN5bSA9IFN0dWJzTWdyLT5maW5kU3R1YihOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KSkKKyAgICAgICAgcmV0dXJuIFN5bTsKKyAgICAgIGZvciAoYXV0byBCTEsgOiBCYXNlTGF5ZXJWTW9kdWxlS2V5cykKKyAgICAgICAgaWYgKGF1dG8gU3ltID0gQmFzZUxheWVyLmZpbmRTeW1ib2xJbihCTEssIE5hbWUsIEV4cG9ydGVkU3ltYm9sc09ubHkpKQorICAgICAgICAgIHJldHVybiBTeW07CisgICAgICAgIGVsc2UgaWYgKGF1dG8gRXJyID0gU3ltLnRha2VFcnJvcigpKQorICAgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIEVycm9yIHJlbW92ZU1vZHVsZXNGcm9tQmFzZUxheWVyKEJhc2VMYXllclQgJkJhc2VMYXllcikgeworICAgICAgZm9yIChhdXRvICZCTEsgOiBCYXNlTGF5ZXJWTW9kdWxlS2V5cykKKyAgICAgICAgaWYgKGF1dG8gRXJyID0gQmFzZUxheWVyLnJlbW92ZU1vZHVsZShCTEspKQorICAgICAgICAgIHJldHVybiBFcnI7CisgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICBWTW9kdWxlS2V5IEs7CisgICAgc3RkOjpzaGFyZWRfcHRyPFN5bWJvbFJlc29sdmVyPiBCYWNraW5nUmVzb2x2ZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPEluZGlyZWN0U3R1YnNNZ3JUPiBTdHVic01ncjsKKyAgICBTdGF0aWNHbG9iYWxSZW5hbWVyIFN0YXRpY1JlbmFtZXI7CisgICAgU291cmNlTW9kdWxlc0xpc3QgU291cmNlTW9kdWxlczsKKyAgICBzdGQ6OnZlY3RvcjxWTW9kdWxlS2V5PiBCYXNlTGF5ZXJWTW9kdWxlS2V5czsKKyAgfTsKKworcHVibGljOgorCisgIC8vLyBAYnJpZWYgTW9kdWxlIHBhcnRpdGlvbmluZyBmdW5jdG9yLgorICB1c2luZyBQYXJ0aXRpb25pbmdGdG9yID0gc3RkOjpmdW5jdGlvbjxzdGQ6OnNldDxGdW5jdGlvbio+KEZ1bmN0aW9uJik+OworCisgIC8vLyBAYnJpZWYgQnVpbGRlciBmb3IgSW5kaXJlY3RTdHVic01hbmFnZXJzLgorICB1c2luZyBJbmRpcmVjdFN0dWJzTWFuYWdlckJ1aWxkZXJUID0KKyAgICAgIHN0ZDo6ZnVuY3Rpb248c3RkOjp1bmlxdWVfcHRyPEluZGlyZWN0U3R1YnNNZ3JUPigpPjsKKworICB1c2luZyBTeW1ib2xSZXNvbHZlckdldHRlciA9CisgICAgICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxTeW1ib2xSZXNvbHZlcj4oVk1vZHVsZUtleSBLKT47CisKKyAgdXNpbmcgU3ltYm9sUmVzb2x2ZXJTZXR0ZXIgPQorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKFZNb2R1bGVLZXkgSywgc3RkOjpzaGFyZWRfcHRyPFN5bWJvbFJlc29sdmVyPiBSKT47CisKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3QgYSBjb21waWxlLW9uLWRlbWFuZCBsYXllciBpbnN0YW5jZS4KKyAgQ29tcGlsZU9uRGVtYW5kTGF5ZXIoRXhlY3V0aW9uU2Vzc2lvbiAmRVMsIEJhc2VMYXllclQgJkJhc2VMYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sUmVzb2x2ZXJHZXR0ZXIgR2V0U3ltYm9sUmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFJlc29sdmVyU2V0dGVyIFNldFN5bWJvbFJlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb25pbmdGdG9yIFBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZUNhbGxiYWNrTWdyVCAmQ2FsbGJhY2tNZ3IsCisgICAgICAgICAgICAgICAgICAgICAgIEluZGlyZWN0U3R1YnNNYW5hZ2VyQnVpbGRlclQgQ3JlYXRlSW5kaXJlY3RTdHVic01hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ2xvbmVTdHVic0ludG9QYXJ0aXRpb25zID0gdHJ1ZSkKKyAgICAgIDogRVMoRVMpLCBCYXNlTGF5ZXIoQmFzZUxheWVyKSwKKyAgICAgICAgR2V0U3ltYm9sUmVzb2x2ZXIoc3RkOjptb3ZlKEdldFN5bWJvbFJlc29sdmVyKSksCisgICAgICAgIFNldFN5bWJvbFJlc29sdmVyKHN0ZDo6bW92ZShTZXRTeW1ib2xSZXNvbHZlcikpLAorICAgICAgICBQYXJ0aXRpb24oc3RkOjptb3ZlKFBhcnRpdGlvbikpLCBDb21waWxlQ2FsbGJhY2tNZ3IoQ2FsbGJhY2tNZ3IpLAorICAgICAgICBDcmVhdGVJbmRpcmVjdFN0dWJzTWFuYWdlcihzdGQ6Om1vdmUoQ3JlYXRlSW5kaXJlY3RTdHVic01hbmFnZXIpKSwKKyAgICAgICAgQ2xvbmVTdHVic0ludG9QYXJ0aXRpb25zKENsb25lU3R1YnNJbnRvUGFydGl0aW9ucykge30KKworICB+Q29tcGlsZU9uRGVtYW5kTGF5ZXIoKSB7CisgICAgLy8gRklYTUU6IFJlcG9ydCBlcnJvciBvbiBsb2cuCisgICAgd2hpbGUgKCFMb2dpY2FsRHlsaWJzLmVtcHR5KCkpCisgICAgICBjb25zdW1lRXJyb3IocmVtb3ZlTW9kdWxlKExvZ2ljYWxEeWxpYnMuYmVnaW4oKS0+Zmlyc3QpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgQWRkIGEgbW9kdWxlIHRvIHRoZSBjb21waWxlLW9uLWRlbWFuZCBsYXllci4KKyAgRXJyb3IgYWRkTW9kdWxlKFZNb2R1bGVLZXkgSywgc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gTSkgeworCisgICAgYXNzZXJ0KCFMb2dpY2FsRHlsaWJzLmNvdW50KEspICYmICJWTW9kdWxlS2V5IEsgYWxyZWFkeSBpbiB1c2UiKTsKKyAgICBhdXRvIEkgPSBMb2dpY2FsRHlsaWJzLmluc2VydCgKKyAgICAgICAgTG9naWNhbER5bGlicy5lbmQoKSwKKyAgICAgICAgc3RkOjptYWtlX3BhaXIoSywgTG9naWNhbER5bGliKEssIEdldFN5bWJvbFJlc29sdmVyKEspLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlSW5kaXJlY3RTdHVic01hbmFnZXIoKSkpKTsKKworICAgIHJldHVybiBhZGRMb2dpY2FsTW9kdWxlKEktPnNlY29uZCwgc3RkOjptb3ZlKE0pKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgQWRkIGV4dHJhIG1vZHVsZXMgdG8gYW4gZXhpc3RpbmcgbG9naWNhbCBtb2R1bGUuCisgIEVycm9yIGFkZEV4dHJhTW9kdWxlKFZNb2R1bGVLZXkgSywgc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gTSkgeworICAgIHJldHVybiBhZGRMb2dpY2FsTW9kdWxlKExvZ2ljYWxEeWxpYnNbS10sIHN0ZDo6bW92ZShNKSk7CisgIH0KKworICAvLy8gQGJyaWVmIFJlbW92ZSB0aGUgbW9kdWxlIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBrZXkuCisgIC8vLworICAvLy8gICBUaGlzIHdpbGwgcmVtb3ZlIGFsbCBtb2R1bGVzIGluIHRoZSBsYXllcnMgYmVsb3cgdGhhdCB3ZXJlIGRlcml2ZWQgZnJvbQorICAvLy8gdGhlIG1vZHVsZSByZXByZXNlbnRlZCBieSBLLgorICBFcnJvciByZW1vdmVNb2R1bGUoVk1vZHVsZUtleSBLKSB7CisgICAgYXV0byBJID0gTG9naWNhbER5bGlicy5maW5kKEspOworICAgIGFzc2VydChJICE9IExvZ2ljYWxEeWxpYnMuZW5kKCkgJiYgIlZNb2R1bGVLZXkgSyBub3QgdmFsaWQgaGVyZSIpOworICAgIGF1dG8gRXJyID0gSS0+c2Vjb25kLnJlbW92ZU1vZHVsZXNGcm9tQmFzZUxheWVyKEJhc2VMYXllcik7CisgICAgTG9naWNhbER5bGlicy5lcmFzZShJKTsKKyAgICByZXR1cm4gRXJyOworICB9CisKKyAgLy8vIEBicmllZiBTZWFyY2ggZm9yIHRoZSBnaXZlbiBuYW1lZCBzeW1ib2wuCisgIC8vLyBAcGFyYW0gTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIHNlYXJjaCBmb3IuCisgIC8vLyBAcGFyYW0gRXhwb3J0ZWRTeW1ib2xzT25seSBJZiB0cnVlLCBzZWFyY2ggb25seSBmb3IgZXhwb3J0ZWQgc3ltYm9scy4KKyAgLy8vIEByZXR1cm4gQSBoYW5kbGUgZm9yIHRoZSBnaXZlbiBuYW1lZCBzeW1ib2wsIGlmIGl0IGV4aXN0cy4KKyAgSklUU3ltYm9sIGZpbmRTeW1ib2woU3RyaW5nUmVmIE5hbWUsIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSkgeworICAgIGZvciAoYXV0byAmS1YgOiBMb2dpY2FsRHlsaWJzKSB7CisgICAgICBpZiAoYXV0byBTeW0gPSBLVi5zZWNvbmQuU3R1YnNNZ3ItPmZpbmRTdHViKE5hbWUsIEV4cG9ydGVkU3ltYm9sc09ubHkpKQorICAgICAgICByZXR1cm4gU3ltOworICAgICAgaWYgKGF1dG8gU3ltID0gZmluZFN5bWJvbEluKEtWLmZpcnN0LCBOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KSkKKyAgICAgICAgcmV0dXJuIFN5bTsKKyAgICAgIGVsc2UgaWYgKGF1dG8gRXJyID0gU3ltLnRha2VFcnJvcigpKQorICAgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisgICAgfQorICAgIHJldHVybiBCYXNlTGF5ZXIuZmluZFN5bWJvbChOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBhZGRyZXNzIG9mIGEgc3ltYm9sIHByb3ZpZGVkIGJ5IHRoaXMgbGF5ZXIsIG9yIHNvbWUgbGF5ZXIKKyAgLy8vICAgICAgICBiZWxvdyB0aGlzIG9uZS4KKyAgSklUU3ltYm9sIGZpbmRTeW1ib2xJbihWTW9kdWxlS2V5IEssIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSkgeworICAgIGFzc2VydChMb2dpY2FsRHlsaWJzLmNvdW50KEspICYmICJWTW9kdWxlS2V5IEsgaXMgbm90IHZhbGlkIGhlcmUiKTsKKyAgICByZXR1cm4gTG9naWNhbER5bGlic1tLXS5maW5kU3ltYm9sKEJhc2VMYXllciwgTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSk7CisgIH0KKworICAvLy8gQGJyaWVmIFVwZGF0ZSB0aGUgc3R1YiBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uIHRvIHBvaW50IGF0IEZuQm9keUFkZHIuCisgIC8vLyBUaGlzIGNhbiBiZSB1c2VkIHRvIHN1cHBvcnQgcmUtb3B0aW1pemF0aW9uLgorICAvLy8gQHJldHVybiB0cnVlIGlmIHRoZSBmdW5jdGlvbiBleGlzdHMgYW5kIHRoZSBzdHViIGlzIHVwZGF0ZWQsIGZhbHNlCisgIC8vLyAgICAgICAgIG90aGVyd2lzZS4KKyAgLy8KKyAgLy8gRklYTUU6IFdlIHNob3VsZCB0cmFjayBhbmQgZnJlZSBhc3NvY2lhdGVkIHJlc291cmNlcyAodW51c2VkIGNvbXBpbGUKKyAgLy8gICAgICAgIGNhbGxiYWNrcywgdW5jb21waWxlZCBJUiwgYW5kIG5vLWxvbmdlci1uZWVkZWQvcmVhY2hhYmxlIGZ1bmN0aW9uCisgIC8vICAgICAgICBpbXBsZW1lbnRhdGlvbnMpLgorICBFcnJvciB1cGRhdGVQb2ludGVyKHN0ZDo6c3RyaW5nIEZ1bmNOYW1lLCBKSVRUYXJnZXRBZGRyZXNzIEZuQm9keUFkZHIpIHsKKyAgICAvL0ZpbmQgb3V0IHdoaWNoIGxvZ2ljYWwgZHlsaWIgY29udGFpbnMgb3VyIHN5bWJvbAorICAgIGF1dG8gTERJID0gTG9naWNhbER5bGlicy5iZWdpbigpOworICAgIGZvciAoYXV0byBMREUgPSBMb2dpY2FsRHlsaWJzLmVuZCgpOyBMREkgIT0gTERFOyArK0xESSkgeworICAgICAgaWYgKGF1dG8gTE1SZXNvdXJjZXMgPQorICAgICAgICAgICAgTERJLT5nZXRMb2dpY2FsTW9kdWxlUmVzb3VyY2VzRm9yU3ltYm9sKEZ1bmNOYW1lLCBmYWxzZSkpIHsKKyAgICAgICAgTW9kdWxlICZTcmNNID0gTE1SZXNvdXJjZXMtPlNvdXJjZU1vZHVsZS0+Z2V0UmVzb3VyY2UoKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgQ2FsbGVkRm5OYW1lID0gbWFuZ2xlKEZ1bmNOYW1lLCBTcmNNLmdldERhdGFMYXlvdXQoKSk7CisgICAgICAgIGlmIChhdXRvIEVyciA9IExNUmVzb3VyY2VzLT5TdHVic01nci0+dXBkYXRlUG9pbnRlcihDYWxsZWRGbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbkJvZHlBZGRyKSkKKyAgICAgICAgICByZXR1cm4gRXJyOworICAgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1ha2VfZXJyb3I8SklUU3ltYm9sTm90Rm91bmQ+KEZ1bmNOYW1lKTsKKyAgfQorCitwcml2YXRlOgorICBFcnJvciBhZGRMb2dpY2FsTW9kdWxlKExvZ2ljYWxEeWxpYiAmTEQsIHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IFNyY01QdHIpIHsKKworICAgIC8vIFJlbmFtZSBhbGwgc3RhdGljIGZ1bmN0aW9ucyAvIGdsb2JhbHMgdG8gJHN0YXRpYy5YIDoKKyAgICAvLyBUaGlzIHdpbGwgdW5pcXVlIHRoZSBuYW1lcyBhY3Jvc3MgYWxsIG1vZHVsZXMgaW4gdGhlIGxvZ2ljYWwgZHlsaWIsCisgICAgLy8gc2ltcGxpZnlpbmcgc3ltYm9sIGxvb2t1cC4KKyAgICBMRC5TdGF0aWNSZW5hbWVyLnJlbmFtZSgqU3JjTVB0cik7CisKKyAgICAvLyBCdW1wIHRoZSBsaW5rYWdlIGFuZCByZW5hbWUgYW55IGFub255bW91cy9wcml2b3RlIG1lbWJlcnMgaW4gU3JjTSB0bworICAgIC8vIGVuc3VyZSB0aGF0IGV2ZXJ5dGhpbmcgd2lsbCByZXNvbHZlIHByb3Blcmx5IGFmdGVyIHdlIHBhcnRpdGlvbiBTcmNNLgorICAgIG1ha2VBbGxTeW1ib2xzRXh0ZXJuYWxseUFjY2Vzc2libGUoKlNyY01QdHIpOworCisgICAgLy8gQ3JlYXRlIGEgbG9naWNhbCBtb2R1bGUgaGFuZGxlIGZvciBTcmNNIHdpdGhpbiB0aGUgbG9naWNhbCBkeWxpYi4KKyAgICBNb2R1bGUgJlNyY00gPSAqU3JjTVB0cjsKKyAgICBhdXRvIExNSWQgPSBMRC5hZGRTb3VyY2VNb2R1bGUoc3RkOjptb3ZlKFNyY01QdHIpKTsKKworICAgIC8vIENyZWF0ZSBzdHViIGZ1bmN0aW9ucy4KKyAgICBjb25zdCBEYXRhTGF5b3V0ICZETCA9IFNyY00uZ2V0RGF0YUxheW91dCgpOworICAgIHsKKyAgICAgIHR5cGVuYW1lIEluZGlyZWN0U3R1YnNNZ3JUOjpTdHViSW5pdHNNYXAgU3R1YkluaXRzOworICAgICAgZm9yIChhdXRvICZGIDogU3JjTSkgeworICAgICAgICAvLyBTa2lwIGRlY2xhcmF0aW9ucy4KKyAgICAgICAgaWYgKEYuaXNEZWNsYXJhdGlvbigpKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIFNraXAgd2VhayBmdW5jdGlvbnMgZm9yIHdoaWNoIHdlIGFscmVhZHkgaGF2ZSBkZWZpbml0aW9ucy4KKyAgICAgICAgYXV0byBNYW5nbGVkTmFtZSA9IG1hbmdsZShGLmdldE5hbWUoKSwgREwpOworICAgICAgICBpZiAoRi5oYXNXZWFrTGlua2FnZSgpIHx8IEYuaGFzTGlua09uY2VMaW5rYWdlKCkpIHsKKyAgICAgICAgICBpZiAoYXV0byBTeW0gPSBMRC5maW5kU3ltYm9sKEJhc2VMYXllciwgTWFuZ2xlZE5hbWUsIGZhbHNlKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGVsc2UgaWYgKGF1dG8gRXJyID0gU3ltLnRha2VFcnJvcigpKQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShFcnIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVjb3JkIGFsbCBmdW5jdGlvbnMgZGVmaW5lZCBieSB0aGlzIG1vZHVsZS4KKyAgICAgICAgaWYgKENsb25lU3R1YnNJbnRvUGFydGl0aW9ucykKKyAgICAgICAgICBMRC5nZXRTdHVic1RvQ2xvbmUoTE1JZCkuaW5zZXJ0KCZGKTsKKworICAgICAgICAvLyBDcmVhdGUgYSBjYWxsYmFjaywgYXNzb2NpYXRlIGl0IHdpdGggdGhlIHN0dWIgZm9yIHRoZSBmdW5jdGlvbiwKKyAgICAgICAgLy8gYW5kIHNldCB0aGUgY29tcGlsZSBhY3Rpb24gdG8gY29tcGlsZSB0aGUgcGFydGl0aW9uIGNvbnRhaW5pbmcgdGhlCisgICAgICAgIC8vIGZ1bmN0aW9uLgorICAgICAgICBpZiAoYXV0byBDQ0luZm9PckVyciA9IENvbXBpbGVDYWxsYmFja01nci5nZXRDb21waWxlQ2FsbGJhY2soKSkgeworICAgICAgICAgIGF1dG8gJkNDSW5mbyA9ICpDQ0luZm9PckVycjsKKyAgICAgICAgICBTdHViSW5pdHNbTWFuZ2xlZE5hbWVdID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENDSW5mby5nZXRBZGRyZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRTeW1ib2xGbGFnczo6ZnJvbUdsb2JhbFZhbHVlKEYpKTsKKyAgICAgICAgICBDQ0luZm8uc2V0Q29tcGlsZUFjdGlvbihbdGhpcywgJkxELCBMTUlkLCAmRl0oKSAtPiBKSVRUYXJnZXRBZGRyZXNzIHsKKyAgICAgICAgICAgICAgaWYgKGF1dG8gRm5JbXBsQWRkck9yRXJyID0gdGhpcy0+ZXh0cmFjdEFuZENvbXBpbGUoTEQsIExNSWQsIEYpKQorICAgICAgICAgICAgICAgIHJldHVybiAqRm5JbXBsQWRkck9yRXJyOworICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogUmVwb3J0IGVycm9yLCByZXR1cm4gdG8gJ2Fib3J0JyBvciBzb21ldGhpbmcgc2ltaWxhci4KKyAgICAgICAgICAgICAgICBjb25zdW1lRXJyb3IoRm5JbXBsQWRkck9yRXJyLnRha2VFcnJvcigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIHJldHVybiBDQ0luZm9PckVyci50YWtlRXJyb3IoKTsKKyAgICAgIH0KKworICAgICAgaWYgKGF1dG8gRXJyID0gTEQuU3R1YnNNZ3ItPmNyZWF0ZVN0dWJzKFN0dWJJbml0cykpCisgICAgICAgIHJldHVybiBFcnI7CisgICAgfQorCisgICAgLy8gSWYgdGhpcyBtb2R1bGUgZG9lc24ndCBjb250YWluIGFueSBnbG9iYWxzLCBhbGlhc2VzLCBvciBtb2R1bGUgZmxhZ3MgdGhlbgorICAgIC8vIHdlIGNhbiBiYWlsIG91dCBlYXJseSBhbmQgYXZvaWQgdGhlIG92ZXJoZWFkIG9mIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBhbgorICAgIC8vIGVtcHR5IGdsb2JhbHMgbW9kdWxlLgorICAgIGlmIChTcmNNLmdsb2JhbF9lbXB0eSgpICYmIFNyY00uYWxpYXNfZW1wdHkoKSAmJgorICAgICAgICAhU3JjTS5nZXRNb2R1bGVGbGFnc01ldGFkYXRhKCkpCisgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKworICAgIC8vIENyZWF0ZSB0aGUgR2xvYmFsVmFsdWVzIG1vZHVsZS4KKyAgICBhdXRvIEdWc00gPSBsbHZtOjptYWtlX3VuaXF1ZTxNb2R1bGU+KChTcmNNLmdldE5hbWUoKSArICIuZ2xvYmFscyIpLnN0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjTS5nZXRDb250ZXh0KCkpOworICAgIEdWc00tPnNldERhdGFMYXlvdXQoREwpOworCisgICAgVmFsdWVUb1ZhbHVlTWFwVHkgVk1hcDsKKworICAgIC8vIENsb25lIGdsb2JhbCB2YXJpYWJsZSBkZWNscy4KKyAgICBmb3IgKGF1dG8gJkdWIDogU3JjTS5nbG9iYWxzKCkpCisgICAgICBpZiAoIUdWLmlzRGVjbGFyYXRpb24oKSAmJiAhVk1hcC5jb3VudCgmR1YpKQorICAgICAgICBjbG9uZUdsb2JhbFZhcmlhYmxlRGVjbCgqR1ZzTSwgR1YsICZWTWFwKTsKKworICAgIC8vIEFuZCB0aGUgYWxpYXNlcy4KKyAgICBmb3IgKGF1dG8gJkEgOiBTcmNNLmFsaWFzZXMoKSkKKyAgICAgIGlmICghVk1hcC5jb3VudCgmQSkpCisgICAgICAgIGNsb25lR2xvYmFsQWxpYXNEZWNsKCpHVnNNLCBBLCBWTWFwKTsKKworICAgIC8vIENsb25lIHRoZSBtb2R1bGUgZmxhZ3MuCisgICAgY2xvbmVNb2R1bGVGbGFnc01ldGFkYXRhKCpHVnNNLCBTcmNNLCBWTWFwKTsKKworICAgIC8vIE5vdyB3ZSBuZWVkIHRvIGNsb25lIHRoZSBHViBhbmQgYWxpYXMgaW5pdGlhbGl6ZXJzLgorCisgICAgLy8gSW5pdGlhbGl6ZXJzIG1heSByZWZlciB0byBmdW5jdGlvbnMgZGVjbGFyZWQgKGJ1dCBub3QgZGVmaW5lZCkgaW4gdGhpcworICAgIC8vIG1vZHVsZS4gQnVpbGQgYSBtYXRlcmlhbGl6ZXIgdG8gY2xvbmUgZGVjbHMgb24gZGVtYW5kLgorICAgIEVycm9yIE1hdGVyaWFsaXplckVycm9ycyA9IEVycm9yOjpzdWNjZXNzKCk7CisgICAgYXV0byBNYXRlcmlhbGl6ZXIgPSBjcmVhdGVMYW1iZGFNYXRlcmlhbGl6ZXIoCisgICAgICBbJkxELCAmR1ZzTSwgJk1hdGVyaWFsaXplckVycm9yc10oVmFsdWUgKlYpIC0+IFZhbHVlKiB7CisgICAgICAgIGlmIChhdXRvICpGID0gZHluX2Nhc3Q8RnVuY3Rpb24+KFYpKSB7CisgICAgICAgICAgLy8gRGVjbHMgaW4gdGhlIG9yaWdpbmFsIG1vZHVsZSBqdXN0IGdldCBjbG9uZWQuCisgICAgICAgICAgaWYgKEYtPmlzRGVjbGFyYXRpb24oKSkKKyAgICAgICAgICAgIHJldHVybiBjbG9uZUZ1bmN0aW9uRGVjbCgqR1ZzTSwgKkYpOworCisgICAgICAgICAgLy8gRGVmaW5pdGlvbnMgaW4gdGhlIG9yaWdpbmFsIG1vZHVsZSAod2hpY2ggd2UgaGF2ZSBlbWl0dGVkIHN0dWJzCisgICAgICAgICAgLy8gZm9yIGF0IHRoaXMgcG9pbnQpIGdldCB0dXJuZWQgaW50byBhIGNvbnN0YW50IGFsaWFzIHRvIHRoZSBzdHViCisgICAgICAgICAgLy8gaW5zdGVhZC4KKyAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCA9IEdWc00tPmdldERhdGFMYXlvdXQoKTsKKyAgICAgICAgICBzdGQ6OnN0cmluZyBGTmFtZSA9IG1hbmdsZShGLT5nZXROYW1lKCksIERMKTsKKyAgICAgICAgICB1bnNpZ25lZCBQdHJCaXRXaWR0aCA9IERMLmdldFBvaW50ZXJUeXBlU2l6ZUluQml0cyhGLT5nZXRUeXBlKCkpOworICAgICAgICAgIEpJVFRhcmdldEFkZHJlc3MgU3R1YkFkZHIgPSAwOworCisgICAgICAgICAgLy8gR2V0IHRoZSBhZGRyZXNzIGZvciB0aGUgc3R1Yi4gSWYgd2UgZW5jb3VudGVyIGFuIGVycm9yIHdoaWxlCisgICAgICAgICAgLy8gZG9pbmcgc28sIHN0YXNoIGl0IGluIHRoZSBNYXRlcmlhbGl6ZXJFcnJvcnMgdmFyaWFibGUgYW5kIHVzZSBhCisgICAgICAgICAgLy8gbnVsbCBhZGRyZXNzIGFzIGEgcGxhY2Vob2xkZXIuCisgICAgICAgICAgaWYgKGF1dG8gU3R1YlN5bSA9IExELlN0dWJzTWdyLT5maW5kU3R1YihGTmFtZSwgZmFsc2UpKSB7CisgICAgICAgICAgICBpZiAoYXV0byBTdHViQWRkck9yRXJyID0gU3R1YlN5bS5nZXRBZGRyZXNzKCkpCisgICAgICAgICAgICAgIFN0dWJBZGRyID0gKlN0dWJBZGRyT3JFcnI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIE1hdGVyaWFsaXplckVycm9ycyA9IGpvaW5FcnJvcnMoc3RkOjptb3ZlKE1hdGVyaWFsaXplckVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3R1YkFkZHJPckVyci50YWtlRXJyb3IoKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgQ29uc3RhbnRJbnQgKlN0dWJBZGRyQ0kgPQorICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChHVnNNLT5nZXRDb250ZXh0KCksIEFQSW50KFB0ckJpdFdpZHRoLCBTdHViQWRkcikpOworICAgICAgICAgIENvbnN0YW50ICpJbml0ID0gQ29uc3RhbnRFeHByOjpnZXRDYXN0KEluc3RydWN0aW9uOjpJbnRUb1B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHViQWRkckNJLCBGLT5nZXRUeXBlKCkpOworICAgICAgICAgIHJldHVybiBHbG9iYWxBbGlhczo6Y3JlYXRlKEYtPmdldEZ1bmN0aW9uVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYtPmdldFR5cGUoKS0+Z2V0QWRkcmVzc1NwYWNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRi0+Z2V0TGlua2FnZSgpLCBGLT5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdCwgR1ZzTS5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gZWxzZS4uLi4KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9KTsKKworICAgIC8vIENsb25lIHRoZSBnbG9iYWwgdmFyaWFibGUgaW5pdGlhbGl6ZXJzLgorICAgIGZvciAoYXV0byAmR1YgOiBTcmNNLmdsb2JhbHMoKSkKKyAgICAgIGlmICghR1YuaXNEZWNsYXJhdGlvbigpKQorICAgICAgICBtb3ZlR2xvYmFsVmFyaWFibGVJbml0aWFsaXplcihHViwgVk1hcCwgJk1hdGVyaWFsaXplcik7CisKKyAgICAvLyBDbG9uZSB0aGUgZ2xvYmFsIGFsaWFzIGluaXRpYWxpemVycy4KKyAgICBmb3IgKGF1dG8gJkEgOiBTcmNNLmFsaWFzZXMoKSkgeworICAgICAgYXV0byAqTmV3QSA9IGNhc3Q8R2xvYmFsQWxpYXM+KFZNYXBbJkFdKTsKKyAgICAgIGFzc2VydChOZXdBICYmICJBbGlhcyBub3QgY2xvbmVkPyIpOworICAgICAgVmFsdWUgKkluaXQgPSBNYXBWYWx1ZShBLmdldEFsaWFzZWUoKSwgVk1hcCwgUkZfTm9uZSwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1hdGVyaWFsaXplcik7CisgICAgICBOZXdBLT5zZXRBbGlhc2VlKGNhc3Q8Q29uc3RhbnQ+KEluaXQpKTsKKyAgICB9CisKKyAgICBpZiAoTWF0ZXJpYWxpemVyRXJyb3JzKQorICAgICAgcmV0dXJuIE1hdGVyaWFsaXplckVycm9yczsKKworICAgIC8vIEJ1aWxkIGEgcmVzb2x2ZXIgZm9yIHRoZSBnbG9iYWxzIG1vZHVsZSBhbmQgYWRkIGl0IHRvIHRoZSBiYXNlIGxheWVyLgorICAgIGF1dG8gTGVnYWN5TG9va3VwID0gW3RoaXMsICZMRF0oY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIC0+IEpJVFN5bWJvbCB7CisgICAgICBpZiAoYXV0byBTeW0gPSBMRC5TdHVic01nci0+ZmluZFN0dWIoTmFtZSwgZmFsc2UpKQorICAgICAgICByZXR1cm4gU3ltOworICAgICAgZWxzZSBpZiAoYXV0byBFcnIgPSBTeW0udGFrZUVycm9yKCkpCisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKworICAgICAgaWYgKGF1dG8gU3ltID0gTEQuZmluZFN5bWJvbChCYXNlTGF5ZXIsIE5hbWUsIGZhbHNlKSkKKyAgICAgICAgcmV0dXJuIFN5bTsKKyAgICAgIGVsc2UgaWYgKGF1dG8gRXJyID0gU3ltLnRha2VFcnJvcigpKQorICAgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH07CisKKyAgICBhdXRvIEdWc1Jlc29sdmVyID0gY3JlYXRlU3ltYm9sUmVzb2x2ZXIoCisgICAgICAgIFsmTEQsIExlZ2FjeUxvb2t1cF0oU3ltYm9sRmxhZ3NNYXAgJlN5bWJvbEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN5bWJvbE5hbWVTZXQgJlN5bWJvbHMpIHsKKyAgICAgICAgICBhdXRvIE5vdEZvdW5kVmlhTGVnYWN5TG9va3VwID0KKyAgICAgICAgICAgICAgbG9va3VwRmxhZ3NXaXRoTGVnYWN5Rm4oU3ltYm9sRmxhZ3MsIFN5bWJvbHMsIExlZ2FjeUxvb2t1cCk7CisKKyAgICAgICAgICBpZiAoIU5vdEZvdW5kVmlhTGVnYWN5TG9va3VwKSB7CisgICAgICAgICAgICBsb2dBbGxVbmhhbmRsZWRFcnJvcnMoTm90Rm91bmRWaWFMZWdhY3lMb29rdXAudGFrZUVycm9yKCksIGVycnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09ETGF5ZXIvR1ZzUmVzb2x2ZXIgZmxhZ3MgbG9va3VwIGZhaWxlZDogIik7CisgICAgICAgICAgICBTeW1ib2xGbGFncy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIFN5bWJvbE5hbWVTZXQoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gTEQuQmFja2luZ1Jlc29sdmVyLT5sb29rdXBGbGFncyhTeW1ib2xGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTm90Rm91bmRWaWFMZWdhY3lMb29rdXApOworICAgICAgICB9LAorICAgICAgICBbJkxELCBMZWdhY3lMb29rdXBdKHN0ZDo6c2hhcmVkX3B0cjxBc3luY2hyb25vdXNTeW1ib2xRdWVyeT4gUXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sTmFtZVNldCBTeW1ib2xzKSB7CisgICAgICAgICAgYXV0byBOb3RGb3VuZFZpYUxlZ2FjeUxvb2t1cCA9CisgICAgICAgICAgICAgIGxvb2t1cFdpdGhMZWdhY3lGbigqUXVlcnksIFN5bWJvbHMsIExlZ2FjeUxvb2t1cCk7CisgICAgICAgICAgcmV0dXJuIExELkJhY2tpbmdSZXNvbHZlci0+bG9va3VwKFF1ZXJ5LCBOb3RGb3VuZFZpYUxlZ2FjeUxvb2t1cCk7CisgICAgICAgIH0pOworCisgICAgU2V0U3ltYm9sUmVzb2x2ZXIoTEQuSywgc3RkOjptb3ZlKEdWc1Jlc29sdmVyKSk7CisKKyAgICBpZiAoYXV0byBFcnIgPSBCYXNlTGF5ZXIuYWRkTW9kdWxlKExELkssIHN0ZDo6bW92ZShHVnNNKSkpCisgICAgICByZXR1cm4gRXJyOworCisgICAgTEQuQmFzZUxheWVyVk1vZHVsZUtleXMucHVzaF9iYWNrKExELkspOworCisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgbWFuZ2xlKFN0cmluZ1JlZiBOYW1lLCBjb25zdCBEYXRhTGF5b3V0ICZETCkgeworICAgIHN0ZDo6c3RyaW5nIE1hbmdsZWROYW1lOworICAgIHsKKyAgICAgIHJhd19zdHJpbmdfb3N0cmVhbSBNYW5nbGVkTmFtZVN0cmVhbShNYW5nbGVkTmFtZSk7CisgICAgICBNYW5nbGVyOjpnZXROYW1lV2l0aFByZWZpeChNYW5nbGVkTmFtZVN0cmVhbSwgTmFtZSwgREwpOworICAgIH0KKyAgICByZXR1cm4gTWFuZ2xlZE5hbWU7CisgIH0KKworICBFeHBlY3RlZDxKSVRUYXJnZXRBZGRyZXNzPgorICBleHRyYWN0QW5kQ29tcGlsZShMb2dpY2FsRHlsaWIgJkxELAorICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBMb2dpY2FsRHlsaWI6OlNvdXJjZU1vZHVsZUhhbmRsZSBMTUlkLAorICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiAmRikgeworICAgIE1vZHVsZSAmU3JjTSA9IExELmdldFNvdXJjZU1vZHVsZShMTUlkKTsKKworICAgIC8vIElmIEYgaXMgYSBkZWNsYXJhdGlvbiB3ZSBtdXN0IGFscmVhZHkgaGF2ZSBjb21waWxlZCBpdC4KKyAgICBpZiAoRi5pc0RlY2xhcmF0aW9uKCkpCisgICAgICByZXR1cm4gMDsKKworICAgIC8vIEdyYWIgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZCBoZXJlLgorICAgIHN0ZDo6c3RyaW5nIENhbGxlZEZuTmFtZSA9IG1hbmdsZShGLmdldE5hbWUoKSwgU3JjTS5nZXREYXRhTGF5b3V0KCkpOworCisgICAgSklUVGFyZ2V0QWRkcmVzcyBDYWxsZWRBZGRyID0gMDsKKyAgICBhdXRvIFBhcnQgPSBQYXJ0aXRpb24oRik7CisgICAgaWYgKGF1dG8gUGFydEtleU9yRXJyID0gZW1pdFBhcnRpdGlvbihMRCwgTE1JZCwgUGFydCkpIHsKKyAgICAgIGF1dG8gJlBhcnRLZXkgPSAqUGFydEtleU9yRXJyOworICAgICAgZm9yIChhdXRvICpTdWJGIDogUGFydCkgeworICAgICAgICBzdGQ6OnN0cmluZyBGbk5hbWUgPSBtYW5nbGUoU3ViRi0+Z2V0TmFtZSgpLCBTcmNNLmdldERhdGFMYXlvdXQoKSk7CisgICAgICAgIGlmIChhdXRvIEZuQm9keVN5bSA9IEJhc2VMYXllci5maW5kU3ltYm9sSW4oUGFydEtleSwgRm5OYW1lLCBmYWxzZSkpIHsKKyAgICAgICAgICBpZiAoYXV0byBGbkJvZHlBZGRyT3JFcnIgPSBGbkJvZHlTeW0uZ2V0QWRkcmVzcygpKSB7CisgICAgICAgICAgICBKSVRUYXJnZXRBZGRyZXNzIEZuQm9keUFkZHIgPSAqRm5Cb2R5QWRkck9yRXJyOworCisgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmdW5jdGlvbiB3ZSdyZSBjYWxsaW5nIHJlY29yZCB0aGUgYWRkcmVzcyBzbyB3ZSBjYW4KKyAgICAgICAgICAgIC8vIHJldHVybiBpdCBmcm9tIHRoaXMgZnVuY3Rpb24uCisgICAgICAgICAgICBpZiAoU3ViRiA9PSAmRikKKyAgICAgICAgICAgICAgQ2FsbGVkQWRkciA9IEZuQm9keUFkZHI7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgZnVuY3Rpb24gYm9keSBwb2ludGVyIGZvciB0aGUgc3R1Yi4KKyAgICAgICAgICAgIGlmIChhdXRvIEVDID0gTEQuU3R1YnNNZ3ItPnVwZGF0ZVBvaW50ZXIoRm5OYW1lLCBGbkJvZHlBZGRyKSkKKyAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBGbkJvZHlBZGRyT3JFcnIudGFrZUVycm9yKCk7CisgICAgICAgIH0gZWxzZSBpZiAoYXV0byBFcnIgPSBGbkJvZHlTeW0udGFrZUVycm9yKCkpCisgICAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShFcnIpOworICAgICAgICBlbHNlCisgICAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiRnVuY3Rpb24gbm90IGVtaXR0ZWQgZm9yIHBhcnRpdGlvbiIpOworICAgICAgfQorCisgICAgICBMRC5CYXNlTGF5ZXJWTW9kdWxlS2V5cy5wdXNoX2JhY2soUGFydEtleSk7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gUGFydEtleU9yRXJyLnRha2VFcnJvcigpOworCisgICAgcmV0dXJuIENhbGxlZEFkZHI7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFydGl0aW9uVD4KKyAgRXhwZWN0ZWQ8Vk1vZHVsZUtleT4KKyAgZW1pdFBhcnRpdGlvbihMb2dpY2FsRHlsaWIgJkxELAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIExvZ2ljYWxEeWxpYjo6U291cmNlTW9kdWxlSGFuZGxlIExNSWQsCisgICAgICAgICAgICAgICAgY29uc3QgUGFydGl0aW9uVCAmUGFydCkgeworICAgIE1vZHVsZSAmU3JjTSA9IExELmdldFNvdXJjZU1vZHVsZShMTUlkKTsKKworICAgIC8vIENyZWF0ZSB0aGUgbW9kdWxlLgorICAgIHN0ZDo6c3RyaW5nIE5ld05hbWUgPSBTcmNNLmdldE5hbWUoKTsKKyAgICBmb3IgKGF1dG8gKkYgOiBQYXJ0KSB7CisgICAgICBOZXdOYW1lICs9ICIuIjsKKyAgICAgIE5ld05hbWUgKz0gRi0+Z2V0TmFtZSgpOworICAgIH0KKworICAgIGF1dG8gTSA9IGxsdm06Om1ha2VfdW5pcXVlPE1vZHVsZT4oTmV3TmFtZSwgU3JjTS5nZXRDb250ZXh0KCkpOworICAgIE0tPnNldERhdGFMYXlvdXQoU3JjTS5nZXREYXRhTGF5b3V0KCkpOworICAgIFZhbHVlVG9WYWx1ZU1hcFR5IFZNYXA7CisKKyAgICBhdXRvIE1hdGVyaWFsaXplciA9IGNyZWF0ZUxhbWJkYU1hdGVyaWFsaXplcihbJkxELCAmTE1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1dKFZhbHVlICpWKSAtPiBWYWx1ZSAqIHsKKyAgICAgIGlmIChhdXRvICpHViA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihWKSkKKyAgICAgICAgcmV0dXJuIGNsb25lR2xvYmFsVmFyaWFibGVEZWNsKCpNLCAqR1YpOworCisgICAgICBpZiAoYXV0byAqRiA9IGR5bl9jYXN0PEZ1bmN0aW9uPihWKSkgeworICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHdlIHdhbnQgdG8gY2xvbmUgYW4gYXZhaWxhYmxlX2V4dGVybmFsbHkgZGVmaW5pdGlvbi4KKyAgICAgICAgaWYgKCFMRC5nZXRTdHVic1RvQ2xvbmUoTE1JZCkuY291bnQoRikpCisgICAgICAgICAgcmV0dXJuIGNsb25lRnVuY3Rpb25EZWNsKCpNLCAqRik7CisKKyAgICAgICAgLy8gT2sgLSB3ZSB3YW50IGFuIGlubGluYWJsZSBzdHViLiBGb3IgdGhhdCB0byB3b3JrIHdlIG5lZWQgYSBkZWNsCisgICAgICAgIC8vIGZvciB0aGUgc3R1YiBwb2ludGVyLgorICAgICAgICBhdXRvICpTdHViUHRyID0gY3JlYXRlSW1wbFBvaW50ZXIoKkYtPmdldFR5cGUoKSwgKk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGLT5nZXROYW1lKCkgKyAiJHN0dWJfcHRyIiwgbnVsbHB0cik7CisgICAgICAgIGF1dG8gKkNsb25lZEYgPSBjbG9uZUZ1bmN0aW9uRGVjbCgqTSwgKkYpOworICAgICAgICBtYWtlU3R1YigqQ2xvbmVkRiwgKlN0dWJQdHIpOworICAgICAgICBDbG9uZWRGLT5zZXRMaW5rYWdlKEdsb2JhbFZhbHVlOjpBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZSk7CisgICAgICAgIENsb25lZEYtPmFkZEZuQXR0cihBdHRyaWJ1dGU6OkFsd2F5c0lubGluZSk7CisgICAgICAgIHJldHVybiBDbG9uZWRGOworICAgICAgfQorCisgICAgICBpZiAoYXV0byAqQSA9IGR5bl9jYXN0PEdsb2JhbEFsaWFzPihWKSkgeworICAgICAgICBhdXRvICpUeSA9IEEtPmdldFZhbHVlVHlwZSgpOworICAgICAgICBpZiAoVHktPmlzRnVuY3Rpb25UeSgpKQorICAgICAgICAgIHJldHVybiBGdW5jdGlvbjo6Q3JlYXRlKGNhc3Q8RnVuY3Rpb25UeXBlPihUeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwgQS0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0uZ2V0KCkpOworCisgICAgICAgIHJldHVybiBuZXcgR2xvYmFsVmFyaWFibGUoKk0sIFR5LCBmYWxzZSwgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBBLT5nZXROYW1lKCksIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6Ok5vdFRocmVhZExvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEtPmdldFR5cGUoKS0+Z2V0QWRkcmVzc1NwYWNlKCkpOworICAgICAgfQorCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9KTsKKworICAgIC8vIENyZWF0ZSBkZWNscyBpbiB0aGUgbmV3IG1vZHVsZS4KKyAgICBmb3IgKGF1dG8gKkYgOiBQYXJ0KQorICAgICAgY2xvbmVGdW5jdGlvbkRlY2woKk0sICpGLCAmVk1hcCk7CisKKyAgICAvLyBNb3ZlIHRoZSBmdW5jdGlvbiBib2RpZXMuCisgICAgZm9yIChhdXRvICpGIDogUGFydCkKKyAgICAgIG1vdmVGdW5jdGlvbkJvZHkoKkYsIFZNYXAsICZNYXRlcmlhbGl6ZXIpOworCisgICAgYXV0byBLID0gRVMuYWxsb2NhdGVWTW9kdWxlKCk7CisKKyAgICBhdXRvIExlZ2FjeUxvb2t1cCA9IFt0aGlzLCAmTERdKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSAtPiBKSVRTeW1ib2wgeworICAgICAgcmV0dXJuIExELmZpbmRTeW1ib2woQmFzZUxheWVyLCBOYW1lLCBmYWxzZSk7CisgICAgfTsKKworICAgIC8vIENyZWF0ZSBtZW1vcnkgbWFuYWdlciBhbmQgc3ltYm9sIHJlc29sdmVyLgorICAgIGF1dG8gUmVzb2x2ZXIgPSBjcmVhdGVTeW1ib2xSZXNvbHZlcigKKyAgICAgICAgWyZMRCwgTGVnYWN5TG9va3VwXShTeW1ib2xGbGFnc01hcCAmU3ltYm9sRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ltYm9sTmFtZVNldCAmU3ltYm9scykgeworICAgICAgICAgIGF1dG8gTm90Rm91bmRWaWFMZWdhY3lMb29rdXAgPQorICAgICAgICAgICAgICBsb29rdXBGbGFnc1dpdGhMZWdhY3lGbihTeW1ib2xGbGFncywgU3ltYm9scywgTGVnYWN5TG9va3VwKTsKKyAgICAgICAgICBpZiAoIU5vdEZvdW5kVmlhTGVnYWN5TG9va3VwKSB7CisgICAgICAgICAgICBsb2dBbGxVbmhhbmRsZWRFcnJvcnMoTm90Rm91bmRWaWFMZWdhY3lMb29rdXAudGFrZUVycm9yKCksIGVycnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09ETGF5ZXIvU3ViUmVzb2x2ZXIgZmxhZ3MgbG9va3VwIGZhaWxlZDogIik7CisgICAgICAgICAgICBTeW1ib2xGbGFncy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIFN5bWJvbE5hbWVTZXQoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIExELkJhY2tpbmdSZXNvbHZlci0+bG9va3VwRmxhZ3MoU3ltYm9sRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKk5vdEZvdW5kVmlhTGVnYWN5TG9va3VwKTsKKyAgICAgICAgfSwKKyAgICAgICAgWyZMRCwgTGVnYWN5TG9va3VwXShzdGQ6OnNoYXJlZF9wdHI8QXN5bmNocm9ub3VzU3ltYm9sUXVlcnk+IFEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sTmFtZVNldCBTeW1ib2xzKSB7CisgICAgICAgICAgYXV0byBOb3RGb3VuZFZpYUxlZ2FjeUxvb2t1cCA9CisgICAgICAgICAgICAgIGxvb2t1cFdpdGhMZWdhY3lGbigqUSwgU3ltYm9scywgTGVnYWN5TG9va3VwKTsKKyAgICAgICAgICByZXR1cm4gTEQuQmFja2luZ1Jlc29sdmVyLT5sb29rdXAoUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKE5vdEZvdW5kVmlhTGVnYWN5TG9va3VwKSk7CisgICAgICAgIH0pOworICAgIFNldFN5bWJvbFJlc29sdmVyKEssIHN0ZDo6bW92ZShSZXNvbHZlcikpOworCisgICAgaWYgKGF1dG8gRXJyID0gQmFzZUxheWVyLmFkZE1vZHVsZShzdGQ6Om1vdmUoSyksIHN0ZDo6bW92ZShNKSkpCisgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisKKyAgICByZXR1cm4gSzsKKyAgfQorCisgIEV4ZWN1dGlvblNlc3Npb24gJkVTOworICBCYXNlTGF5ZXJUICZCYXNlTGF5ZXI7CisgIFN5bWJvbFJlc29sdmVyR2V0dGVyIEdldFN5bWJvbFJlc29sdmVyOworICBTeW1ib2xSZXNvbHZlclNldHRlciBTZXRTeW1ib2xSZXNvbHZlcjsKKyAgUGFydGl0aW9uaW5nRnRvciBQYXJ0aXRpb247CisgIENvbXBpbGVDYWxsYmFja01nclQgJkNvbXBpbGVDYWxsYmFja01ncjsKKyAgSW5kaXJlY3RTdHVic01hbmFnZXJCdWlsZGVyVCBDcmVhdGVJbmRpcmVjdFN0dWJzTWFuYWdlcjsKKworICBzdGQ6Om1hcDxWTW9kdWxlS2V5LCBMb2dpY2FsRHlsaWI+IExvZ2ljYWxEeWxpYnM7CisgIGJvb2wgQ2xvbmVTdHVic0ludG9QYXJ0aXRpb25zOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9yYworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0NPTVBJTEVPTkRFTUFORExBWUVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9Db21waWxlVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9Db21waWxlVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODA1MGZmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0NvbXBpbGVVdGlscy5oCkBAIC0wLDAgKzEsMTIxIEBACisvLz09PS0gQ29tcGlsZVV0aWxzLmggLSBVdGlsaXRpZXMgZm9yIGNvbXBpbGluZyBJUiBpbiB0aGUgSklUIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENvbnRhaW5zIHV0aWxpdGllcyBmb3IgY29tcGlsaW5nIElSIHRvIG9iamVjdCBmaWxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19DT01QSUxFVVRJTFNfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfQ09NUElMRVVUSUxTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT2JqZWN0Q2FjaGUuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9PYmplY3RNZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0xlZ2FjeVBhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvQmluYXJ5LmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvT2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1vZHVsZTsKKworbmFtZXNwYWNlIG9yYyB7CisKKy8vLyBAYnJpZWYgU2ltcGxlIGNvbXBpbGUgZnVuY3RvcjogVGFrZXMgYSBzaW5nbGUgSVIgbW9kdWxlIGFuZCByZXR1cm5zIGFuCisvLy8gICAgICAgIE9iamVjdEZpbGUuCitjbGFzcyBTaW1wbGVDb21waWxlciB7Citwcml2YXRlOgorICBjbGFzcyBTbWFsbFZlY3Rvck1lbW9yeUJ1ZmZlciA6IHB1YmxpYyBNZW1vcnlCdWZmZXIgeworICBwdWJsaWM6CisgICAgU21hbGxWZWN0b3JNZW1vcnlCdWZmZXIoU21hbGxWZWN0b3I8Y2hhciwgMD4gQnVmZmVyKQorICAgICAgICA6IEJ1ZmZlcihzdGQ6Om1vdmUoQnVmZmVyKSkgeworICAgICAgaW5pdCh0aGlzLT5CdWZmZXIuZGF0YSgpLCB0aGlzLT5CdWZmZXIuZGF0YSgpICsgdGhpcy0+QnVmZmVyLnNpemUoKSwKKyAgICAgICAgICAgZmFsc2UpOworICAgIH0KKworICAgIEJ1ZmZlcktpbmQgZ2V0QnVmZmVyS2luZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIE1lbW9yeUJ1ZmZlcl9NYWxsb2M7IH0KKworICBwcml2YXRlOgorICAgIFNtYWxsVmVjdG9yPGNoYXIsIDA+IEJ1ZmZlcjsKKyAgfTsKKworcHVibGljOgorICB1c2luZyBDb21waWxlUmVzdWx0ID0gc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj47CisKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3QgYSBzaW1wbGUgY29tcGlsZSBmdW5jdG9yIHdpdGggdGhlIGdpdmVuIHRhcmdldC4KKyAgU2ltcGxlQ29tcGlsZXIoVGFyZ2V0TWFjaGluZSAmVE0sIE9iamVjdENhY2hlICpPYmpDYWNoZSA9IG51bGxwdHIpCisgICAgOiBUTShUTSksIE9iakNhY2hlKE9iakNhY2hlKSB7fQorCisgIC8vLyBAYnJpZWYgU2V0IGFuIE9iamVjdENhY2hlIHRvIHF1ZXJ5IGJlZm9yZSBjb21waWxpbmcuCisgIHZvaWQgc2V0T2JqZWN0Q2FjaGUoT2JqZWN0Q2FjaGUgKk5ld0NhY2hlKSB7IE9iakNhY2hlID0gTmV3Q2FjaGU7IH0KKworICAvLy8gQGJyaWVmIENvbXBpbGUgYSBNb2R1bGUgdG8gYW4gT2JqZWN0RmlsZS4KKyAgQ29tcGlsZVJlc3VsdCBvcGVyYXRvcigpKE1vZHVsZSAmTSkgeworICAgIENvbXBpbGVSZXN1bHQgQ2FjaGVkT2JqZWN0ID0gdHJ5VG9Mb2FkRnJvbU9iamVjdENhY2hlKE0pOworICAgIGlmIChDYWNoZWRPYmplY3QpCisgICAgICByZXR1cm4gQ2FjaGVkT2JqZWN0OworCisgICAgU21hbGxWZWN0b3I8Y2hhciwgMD4gT2JqQnVmZmVyU1Y7CisKKyAgICB7CisgICAgICByYXdfc3ZlY3Rvcl9vc3RyZWFtIE9ialN0cmVhbShPYmpCdWZmZXJTVik7CisKKyAgICAgIGxlZ2FjeTo6UGFzc01hbmFnZXIgUE07CisgICAgICBNQ0NvbnRleHQgKkN0eDsKKyAgICAgIGlmIChUTS5hZGRQYXNzZXNUb0VtaXRNQyhQTSwgQ3R4LCBPYmpTdHJlYW0pKQorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJUYXJnZXQgZG9lcyBub3Qgc3VwcG9ydCBNQyBlbWlzc2lvbi4iKTsKKyAgICAgIFBNLnJ1bihNKTsKKyAgICB9CisKKyAgICBhdXRvIE9iakJ1ZmZlciA9CisgICAgICAgIGxsdm06Om1ha2VfdW5pcXVlPFNtYWxsVmVjdG9yTWVtb3J5QnVmZmVyPihzdGQ6Om1vdmUoT2JqQnVmZmVyU1YpKTsKKyAgICBhdXRvIE9iaiA9CisgICAgICAgIG9iamVjdDo6T2JqZWN0RmlsZTo6Y3JlYXRlT2JqZWN0RmlsZShPYmpCdWZmZXItPmdldE1lbUJ1ZmZlclJlZigpKTsKKworICAgIGlmIChPYmopIHsKKyAgICAgIG5vdGlmeU9iamVjdENvbXBpbGVkKE0sICpPYmpCdWZmZXIpOworICAgICAgcmV0dXJuIHN0ZDo6bW92ZShPYmpCdWZmZXIpOworICAgIH0KKworICAgIC8vIFRPRE86IEFjdHVhbGx5IHJlcG9ydCBlcnJvcnMgaGVscGZ1bGx5LgorICAgIGNvbnN1bWVFcnJvcihPYmoudGFrZUVycm9yKCkpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKK3ByaXZhdGU6CisKKyAgQ29tcGlsZVJlc3VsdCB0cnlUb0xvYWRGcm9tT2JqZWN0Q2FjaGUoY29uc3QgTW9kdWxlICZNKSB7CisgICAgaWYgKCFPYmpDYWNoZSkKKyAgICAgIHJldHVybiBDb21waWxlUmVzdWx0KCk7CisKKyAgICByZXR1cm4gT2JqQ2FjaGUtPmdldE9iamVjdCgmTSk7CisgIH0KKworICB2b2lkIG5vdGlmeU9iamVjdENvbXBpbGVkKGNvbnN0IE1vZHVsZSAmTSwgY29uc3QgTWVtb3J5QnVmZmVyICZPYmpCdWZmZXIpIHsKKyAgICBpZiAoT2JqQ2FjaGUpCisgICAgICBPYmpDYWNoZS0+bm90aWZ5T2JqZWN0Q29tcGlsZWQoJk0sIE9iakJ1ZmZlci5nZXRNZW1CdWZmZXJSZWYoKSk7CisgIH0KKworICBUYXJnZXRNYWNoaW5lICZUTTsKKyAgT2JqZWN0Q2FjaGUgKk9iakNhY2hlID0gbnVsbHB0cjsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvcmMKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19DT01QSUxFVVRJTFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0NvcmUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9Db3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmZWM4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9Db3JlLmgKQEAgLTAsMCArMSwzOTQgQEAKKy8vPT09LS0tLS0tIENvcmUuaCAtLSBDb3JlIE9SQyBBUElzIChMYXllciwgSklURHlsaWIsIGV0Yy4pIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ29udGFpbnMgY29yZSBPUkMgQVBJcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19DT1JFX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0NPUkVfSAorCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL1N5bWJvbFN0cmluZ1Bvb2wuaCIKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9yYyB7CisKKy8vLyBWTW9kdWxlS2V5IHByb3ZpZGVzIGEgdW5pcXVlIGlkZW50aWZpZXIgKGFsbG9jYXRlZCBhbmQgbWFuYWdlZCBieQorLy8vIEV4ZWN1dGlvblNlc3Npb25zKSBmb3IgYSBtb2R1bGUgYWRkZWQgdG8gdGhlIEpJVC4KK3VzaW5nIFZNb2R1bGVLZXkgPSB1aW50NjRfdDsKKworY2xhc3MgVlNPOworCisvLy8gQGJyaWVmIEEgc2V0IG9mIHN5bWJvbCBuYW1lcyAocmVwcmVzZW50ZWQgYnkgU3ltYm9sU3RyaW5nUHRycyBmb3IKKy8vICAgICAgICAgZWZmaWNpZW5jeSkuCit1c2luZyBTeW1ib2xOYW1lU2V0ID0gc3RkOjpzZXQ8U3ltYm9sU3RyaW5nUHRyPjsKKworLy8vIEBicmllZiBBIG1hcCBmcm9tIHN5bWJvbCBuYW1lcyAoYXMgU3ltYm9sU3RyaW5nUHRycykgdG8gSklUU3ltYm9scworLy8vICAgICAgICAoYWRkcmVzcy9mbGFncyBwYWlycykuCit1c2luZyBTeW1ib2xNYXAgPSBzdGQ6Om1hcDxTeW1ib2xTdHJpbmdQdHIsIEpJVEV2YWx1YXRlZFN5bWJvbD47CisKKy8vLyBAYnJpZWYgQSBtYXAgZnJvbSBzeW1ib2wgbmFtZXMgKGFzIFN5bWJvbFN0cmluZ1B0cnMpIHRvIEpJVFN5bWJvbEZsYWdzLgordXNpbmcgU3ltYm9sRmxhZ3NNYXAgPSBzdGQ6Om1hcDxTeW1ib2xTdHJpbmdQdHIsIEpJVFN5bWJvbEZsYWdzPjsKKworLy8vIEBicmllZiBBIHN5bWJvbCBxdWVyeSB0aGF0IHJldHVybnMgcmVzdWx0cyB2aWEgYSBjYWxsYmFjayB3aGVuIHJlc3VsdHMgYXJlCisvLy8gICAgICAgIHJlYWR5LgorLy8vCisvLy8gbWFrZXMgYSBjYWxsYmFjayB3aGVuIGFsbCBzeW1ib2xzIGFyZSBhdmFpbGFibGUuCitjbGFzcyBBc3luY2hyb25vdXNTeW1ib2xRdWVyeSB7CitwdWJsaWM6CisgIC8vLyBAYnJpZWYgQ2FsbGJhY2sgdG8gbm90aWZ5IGNsaWVudCB0aGF0IHN5bWJvbHMgaGF2ZSBiZWVuIHJlc29sdmVkLgorICB1c2luZyBTeW1ib2xzUmVzb2x2ZWRDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChFeHBlY3RlZDxTeW1ib2xNYXA+KT47CisKKyAgLy8vIEBicmllZiBDYWxsYmFjayB0byBub3RpZnkgY2xpZW50IHRoYXQgc3ltYm9scyBhcmUgcmVhZHkgZm9yIGV4ZWN1dGlvbi4KKyAgdXNpbmcgU3ltYm9sc1JlYWR5Q2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoRXJyb3IpPjsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIHF1ZXJ5IGZvciB0aGUgZ2l2ZW4gc3ltYm9scywgbm90aWZ5LXJlc29sdmVkIGFuZAorICAvLy8gICAgICAgIG5vdGlmeS1yZWFkeSBjYWxsYmFja3MuCisgIEFzeW5jaHJvbm91c1N5bWJvbFF1ZXJ5KGNvbnN0IFN5bWJvbE5hbWVTZXQgJlN5bWJvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbHNSZXNvbHZlZENhbGxiYWNrIE5vdGlmeVN5bWJvbHNSZXNvbHZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sc1JlYWR5Q2FsbGJhY2sgTm90aWZ5U3ltYm9sc1JlYWR5KTsKKworICAvLy8gQGJyaWVmIE5vdGlmeSBjbGllbnQgdGhhdCB0aGUgcXVlcnkgZmFpbGVkLgorICAvLy8KKyAgLy8vIElmIHRoZSBub3RpZnktcmVzb2x2ZWQgY2FsbGJhY2sgaGFzIG5vdCBiZWVuIG1hZGUgeWV0LCB0aGVuIGl0IGlzIGNhbGxlZAorICAvLy8gd2l0aCB0aGUgZ2l2ZW4gZXJyb3IsIGFuZCB0aGUgbm90aWZ5LWZpbmFsaXplZCBjYWxsYmFjayBpcyBuZXZlciBtYWRlLgorICAvLy8KKyAgLy8vIElmIHRoZSBub3RpZnktcmVzb2x2ZWQgY2FsbGJhY2sgaGFzIGFscmVhZHkgYmVlbiBtYWRlIHRoZW4gdGhlbiB0aGUKKyAgLy8vIG5vdGlmeS1maW5hbGl6ZWQgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggdGhlIGdpdmVuIGVycm9yLgorICAvLy8KKyAgLy8vIEl0IGlzIGlsbGVnYWwgdG8gY2FsbCBzZXRGYWlsZWQgYWZ0ZXIgYm90aCBjYWxsYmFja3MgaGF2ZSBiZWVuIG1hZGUuCisgIHZvaWQgc2V0RmFpbGVkKEVycm9yIEVycik7CisKKyAgLy8vIEBicmllZiBTZXQgdGhlIHJlc29sdmVkIHN5bWJvbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIHN5bWJvbCBuYW1lLgorICAvLy8KKyAgLy8vIElmIHRoaXMgc3ltYm9sIHdhcyB0aGUgbGFzdCBvbmUgbm90IHJlc29sdmVkLCB0aGlzIHdpbGwgdHJpZ2dlciBhIGNhbGwgdG8KKyAgLy8vIHRoZSBub3RpZnktZmluYWxpemVkIGNhbGxiYWNrIHBhc3NpbmcgdGhlIGNvbXBsZXRlZCBzeWJvbCBtYXAuCisgIHZvaWQgc2V0RGVmaW5pdGlvbihTeW1ib2xTdHJpbmdQdHIgTmFtZSwgSklURXZhbHVhdGVkU3ltYm9sIFN5bSk7CisKKyAgLy8vIEBicmllZiBOb3RpZnkgdGhlIHF1ZXJ5IHRoYXQgYSByZXF1ZXN0ZWQgc3ltYm9sIGlzIHJlYWR5IGZvciBleGVjdXRpb24uCisgIC8vLworICAvLy8gVGhpcyBkZWNyZW1lbnRzIHRoZSBxdWVyeSdzIGludGVybmFsIGNvdW50IG9mIG5vdC15ZXQtcmVhZHkgc3ltYm9scy4gSWYKKyAgLy8vIHRoaXMgY2FsbCB0byBub3RpZnlTeW1ib2xGaW5hbGl6ZWQgc2V0cyB0aGUgY291bnRlciB0byB6ZXJvLCBpdCB3aWxsIGNhbGwKKyAgLy8vIHRoZSBub3RpZnktZmluYWxpemVkIGNhbGxiYWNrIHdpdGggRXJyb3I6OnN1Y2Nlc3MgYXMgdGhlIHZhbHVlLgorICB2b2lkIG5vdGlmeVN5bWJvbEZpbmFsaXplZCgpOworCitwcml2YXRlOgorICBTeW1ib2xNYXAgU3ltYm9sczsKKyAgc2l6ZV90IE91dHN0YW5kaW5nUmVzb2x1dGlvbnMgPSAwOworICBzaXplX3QgT3V0c3RhbmRpbmdGaW5hbGl6YXRpb25zID0gMDsKKyAgU3ltYm9sc1Jlc29sdmVkQ2FsbGJhY2sgTm90aWZ5U3ltYm9sc1Jlc29sdmVkOworICBTeW1ib2xzUmVhZHlDYWxsYmFjayBOb3RpZnlTeW1ib2xzUmVhZHk7Cit9OworCisvLy8gQGJyaWVmIFN5bWJvbFJlc29sdmVyIGlzIGEgY29tcG9zYWJsZSBpbnRlcmZhY2UgZm9yIGxvb2tpbmcgdXAgc3ltYm9sIGZsYWdzCisvLy8gICAgICAgIGFuZCBhZGRyZXNzZXMgdXNpbmcgdGhlIEFzeW5jaHJvbm91c1N5bWJvbFF1ZXJ5IHR5cGUuIEl0IHdpbGwKKy8vLyAgICAgICAgZXZlbnR1YWxseSByZXBsYWNlIHRoZSBMZWdhY3lKSVRTeW1ib2xSZXNvbHZlciBpbnRlcmZhY2UgYXMgdGhlCisvLy8gICAgICAgIHN0YXJkYXJkIE9SQyBzeW1ib2wgcmVzb2x2ZXIgdHlwZS4KK2NsYXNzIFN5bWJvbFJlc29sdmVyIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+U3ltYm9sUmVzb2x2ZXIoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIEBicmllZiBSZXR1cm5zIHRoZSBmbGFncyBmb3IgZWFjaCBzeW1ib2wgaW4gU3ltYm9scyB0aGF0IGNhbiBiZSBmb3VuZCwKKyAgLy8vICAgICAgICBhbG9uZyB3aXRoIHRoZSBzZXQgb2Ygc3ltYm9sIHRoYXQgY291bGQgbm90IGJlIGZvdW5kLgorICB2aXJ0dWFsIFN5bWJvbE5hbWVTZXQgbG9va3VwRmxhZ3MoU3ltYm9sRmxhZ3NNYXAgJkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ltYm9sTmFtZVNldCAmU3ltYm9scykgPSAwOworCisgIC8vLyBAYnJpZWYgRm9yIGVhY2ggc3ltYm9sIGluIFN5bWJvbHMgdGhhdCBjYW4gYmUgZm91bmQsIGFzc2lnbnMgdGhhdCBzeW1ib2xzCisgIC8vLyAgICAgICAgdmFsdWUgaW4gUXVlcnkuIFJldHVybnMgdGhlIHNldCBvZiBzeW1ib2xzIHRoYXQgY291bGQgbm90IGJlIGZvdW5kLgorICB2aXJ0dWFsIFN5bWJvbE5hbWVTZXQgbG9va3VwKHN0ZDo6c2hhcmVkX3B0cjxBc3luY2hyb25vdXNTeW1ib2xRdWVyeT4gUXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sTmFtZVNldCBTeW1ib2xzKSA9IDA7CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKK307CisKKy8vLyBAYnJpZWYgSW1wbGVtZW50cyBTeW1ib2xSZXNvbHZlciB3aXRoIGEgcGFpciBvZiBzdXBwbGllZCBmdW5jdGlvbiBvYmplY3RzCisvLy8gICAgICAgIGZvciBjb252ZW5pZW5jZS4gU2VlIGNyZWF0ZVN5bWJvbFJlc29sdmVyLgordGVtcGxhdGUgPHR5cGVuYW1lIExvb2t1cEZsYWdzRm4sIHR5cGVuYW1lIExvb2t1cEZuPgorY2xhc3MgTGFtYmRhU3ltYm9sUmVzb2x2ZXIgZmluYWwgOiBwdWJsaWMgU3ltYm9sUmVzb2x2ZXIgeworcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9va3VwRmxhZ3NGblJlZiwgdHlwZW5hbWUgTG9va3VwRm5SZWY+CisgIExhbWJkYVN5bWJvbFJlc29sdmVyKExvb2t1cEZsYWdzRm5SZWYgJiZMb29rdXBGbGFncywgTG9va3VwRm5SZWYgJiZMb29rdXApCisgICAgICA6IExvb2t1cEZsYWdzKHN0ZDo6Zm9yd2FyZDxMb29rdXBGbGFnc0ZuUmVmPihMb29rdXBGbGFncykpLAorICAgICAgICBMb29rdXAoc3RkOjpmb3J3YXJkPExvb2t1cEZuUmVmPihMb29rdXApKSB7fQorCisgIFN5bWJvbE5hbWVTZXQgbG9va3VwRmxhZ3MoU3ltYm9sRmxhZ3NNYXAgJkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN5bWJvbE5hbWVTZXQgJlN5bWJvbHMpIGZpbmFsIHsKKyAgICByZXR1cm4gTG9va3VwRmxhZ3MoRmxhZ3MsIFN5bWJvbHMpOworICB9CisKKyAgU3ltYm9sTmFtZVNldCBsb29rdXAoc3RkOjpzaGFyZWRfcHRyPEFzeW5jaHJvbm91c1N5bWJvbFF1ZXJ5PiBRdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sTmFtZVNldCBTeW1ib2xzKSBmaW5hbCB7CisgICAgcmV0dXJuIExvb2t1cChzdGQ6Om1vdmUoUXVlcnkpLCBzdGQ6Om1vdmUoU3ltYm9scykpOworICB9CisKK3ByaXZhdGU6CisgIExvb2t1cEZsYWdzRm4gTG9va3VwRmxhZ3M7CisgIExvb2t1cEZuIExvb2t1cDsKK307CisKKy8vLyBAYnJpZWYgQ3JlYXRlcyBhIFN5bWJvbFJlc29sdmVyIGltcGxlbWVudGF0aW9uIGZyb20gdGhlIHBhaXIgb2Ygc3VwcGxpZWQKKy8vLyAgICAgICAgZnVuY3Rpb24gb2JqZWN0cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBMb29rdXBGbGFnc0ZuLCB0eXBlbmFtZSBMb29rdXBGbj4KK3N0ZDo6dW5pcXVlX3B0cjxMYW1iZGFTeW1ib2xSZXNvbHZlcjwKKyAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jdjwKKyAgICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPExvb2t1cEZsYWdzRm4+Ojp0eXBlPjo6dHlwZSwKKyAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jdjwKKyAgICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPExvb2t1cEZuPjo6dHlwZT46OnR5cGU+PgorY3JlYXRlU3ltYm9sUmVzb2x2ZXIoTG9va3VwRmxhZ3NGbiAmJkxvb2t1cEZsYWdzLCBMb29rdXBGbiAmJkxvb2t1cCkgeworICB1c2luZyBMYW1iZGFTeW1ib2xSZXNvbHZlckltcGwgPSBMYW1iZGFTeW1ib2xSZXNvbHZlcjwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2N2PAorICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxMb29rdXBGbGFnc0ZuPjo6dHlwZT46OnR5cGUsCisgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jdjwKKyAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8TG9va3VwRm4+Ojp0eXBlPjo6dHlwZT47CisgIHJldHVybiBsbHZtOjptYWtlX3VuaXF1ZTxMYW1iZGFTeW1ib2xSZXNvbHZlckltcGw+KAorICAgICAgc3RkOjpmb3J3YXJkPExvb2t1cEZsYWdzRm4+KExvb2t1cEZsYWdzKSwgc3RkOjpmb3J3YXJkPExvb2t1cEZuPihMb29rdXApKTsKK30KKworLy8vIEBicmllZiBBIE1hdGVyaWFsaXphdGlvblVuaXQgcmVwcmVzZW50cyBhIHNldCBvZiBzeW1ib2wgZGVmaW5pdGlvbnMgdGhhdCBjYW4KKy8vLyAgICAgICAgYmUgbWF0ZXJpYWxpemVkIGFzIGEgZ3JvdXAsIG9yIGluZGl2aWR1YWxseSBkaXNjYXJkZWQgKHdoZW4KKy8vLyAgICAgICAgb3ZlcnJpZGluZyBkZWZpbml0aW9ucyBhcmUgZW5jb3VudGVyZWQpLgorLy8vCisvLy8gTWF0ZXJpYWxpemF0aW9uVW5pdHMgYXJlIHVzZWQgd2hlbiBwcm92aWRpbmcgbGF6eSBkZWZpbml0aW9ucyBvZiBzeW1ib2xzIHRvCisvLy8gVlNPcy4gVGhlIFZTTyB3aWxsIGNhbGwgbWF0ZXJpYWxpemUgd2hlbiB0aGUgYWRkcmVzcyBvZiBhIHN5bWJvbCBpcworLy8vIHJlcXVlc3RlZCB2aWEgdGhlIGxvb2t1cCBtZXRob2QuIFRoZSBWU08gd2lsbCBjYWxsIGRpc2NhcmQgaWYgYSBzdHJvbmdlcgorLy8vIGRlZmluaXRpb24gaXMgYWRkZWQgb3IgYWxyZWFkeSBwcmVzZW50LgorY2xhc3MgTWF0ZXJpYWxpemF0aW9uVW5pdCB7CitwdWJsaWM6CisgIHZpcnR1YWwgfk1hdGVyaWFsaXphdGlvblVuaXQoKSB7fQorCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBzZXQgb2Ygc3ltYm9scyB0aGF0IHRoaXMgc291cmNlIHByb3ZpZGVzLgorICB2aXJ0dWFsIFN5bWJvbEZsYWdzTWFwIGdldFN5bWJvbHMoKSA9IDA7CisKKyAgLy8vIEBicmllZiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIG1hdGVyaWFsaXplIGFsbCBzeW1ib2xzCisgIC8vLyAgICAgICAgaW4gdGhlIG1hdGVyaWFsemF0aW9uIHVuaXQsIGV4Y2VwdCBmb3IgdGhvc2UgdGhhdCBoYXZlIGJlZW4KKyAgLy8vICAgICAgICBwcmV2aW91c2x5IGRpc2NhcmRlZC4KKyAgdmlydHVhbCBFcnJvciBtYXRlcmlhbGl6ZShWU08gJlYpID0gMDsKKworICAvLy8gQGJyaWVmIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgZGlzY2FyZCB0aGUgZ2l2ZW4gc3ltYm9sCisgIC8vLyAgICAgICAgZnJvbSB0aGUgc291cmNlIChlLmcuIGlmIHRoZSBzb3VyY2UgaXMgYW4gTExWTSBJUiBNb2R1bGUgYW5kIHRoZQorICAvLy8gICAgICAgIHN5bWJvbCBpcyBhIGZ1bmN0aW9uLCBkZWxldGUgdGhlIGZ1bmN0aW9uIGJvZHkgb3IgbWFyayBpdCBhdmFpbGFibGUKKyAgLy8vICAgICAgICBleHRlcm5hbGx5KS4KKyAgdmlydHVhbCB2b2lkIGRpc2NhcmQoVlNPICZWLCBTeW1ib2xTdHJpbmdQdHIgTmFtZSkgPSAwOworCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7Cit9OworCisvLy8gQGJyaWVmIFJlcHJlc2VudHMgYSBkeW5hbWljIGxpbmthZ2UgdW5pdCBpbiBhIEpJVCBwcm9jZXNzLgorLy8vCisvLy8gVlNPIGFjdHMgYXMgYSBzeW1ib2wgdGFibGUgKHN5bWJvbCBkZWZpbml0aW9ucyBjYW4gYmUgc2V0IGFuZCB0aGUgZHlsaWIKKy8vLyBxdWVyaWVkIHRvIGZpbmQgc3ltYm9sIGFkZHJlc3NlcykgYW5kIGFzIGEga2V5IGZvciB0cmFja2luZyByZXNvdXJjZXMKKy8vLyAoc2luY2UgYSBWU08ncyBhZGRyZXNzIGlzIGZpeGVkKS4KK2NsYXNzIFZTTyB7CisgIGZyaWVuZCBjbGFzcyBFeGVjdXRpb25TZXNzaW9uOworCitwdWJsaWM6CisgIGVudW0gUmVsYXRpdmVMaW5rYWdlU3RyZW5ndGggeworICAgIE5ld0RlZmluaXRpb25Jc1N0cm9uZ2VyLAorICAgIER1cGxpY2F0ZURlZmluaXRpb24sCisgICAgRXhpc3RpbmdEZWZpbml0aW9uSXNTdHJvbmdlcgorICB9OworCisgIHVzaW5nIFNldERlZmluaXRpb25zUmVzdWx0ID0KKyAgICAgIHN0ZDo6bWFwPFN5bWJvbFN0cmluZ1B0ciwgUmVsYXRpdmVMaW5rYWdlU3RyZW5ndGg+OworCisgIHVzaW5nIE1hdGVyaWFsaXphdGlvblVuaXRMaXN0ID0KKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxNYXRlcmlhbGl6YXRpb25Vbml0Pj47CisKKyAgc3RydWN0IExvb2t1cFJlc3VsdCB7CisgICAgTWF0ZXJpYWxpemF0aW9uVW5pdExpc3QgTWF0ZXJpYWxpemF0aW9uVW5pdHM7CisgICAgU3ltYm9sTmFtZVNldCBVbnJlc29sdmVkU3ltYm9sczsKKyAgfTsKKworICBWU08oKSA9IGRlZmF1bHQ7CisKKyAgVlNPKGNvbnN0IFZTTyAmKSA9IGRlbGV0ZTsKKyAgVlNPICZvcGVyYXRvcj0oY29uc3QgVlNPICYpID0gZGVsZXRlOworICBWU08oVlNPICYmKSA9IGRlbGV0ZTsKKyAgVlNPICZvcGVyYXRvcj0oVlNPICYmKSA9IGRlbGV0ZTsKKworICAvLy8gQGJyaWVmIENvbXBhcmUgbmV3IGxpbmthZ2Ugd2l0aCBleGlzdGluZyBsaW5rYWdlLgorICBzdGF0aWMgUmVsYXRpdmVMaW5rYWdlU3RyZW5ndGgKKyAgY29tcGFyZUxpbmthZ2UoT3B0aW9uYWw8SklUU3ltYm9sRmxhZ3M+IE9sZEZsYWdzLCBKSVRTeW1ib2xGbGFncyBOZXdGbGFncyk7CisKKyAgLy8vIEBicmllZiBDb21wYXJlIG5ldyBsaW5rYWdlIHdpdGggYW4gZXhpc3Rpbmcgc3ltYm9sJ3MgbGlua2FnZS4KKyAgUmVsYXRpdmVMaW5rYWdlU3RyZW5ndGggY29tcGFyZUxpbmthZ2UoU3ltYm9sU3RyaW5nUHRyIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVFN5bWJvbEZsYWdzIE5ld0ZsYWdzKSBjb25zdDsKKworICAvLy8gQGJyaWVmIEFkZHMgdGhlIGdpdmVuIHN5bWJvbHMgdG8gdGhlIG1hcHBpbmcgYXMgcmVzb2x2ZWQsIGZpbmFsaXplZAorICAvLy8gICAgICAgIHN5bWJvbHMuCisgIC8vLworICAvLy8gRklYTUU6IFdlIGNhbiB0YWtlIHRoaXMgYnkgY29uc3QtcmVmIG9uY2Ugc3ltYm9sLWJhc2VkIGxhemluZXNzIGlzCisgIC8vLyAgICAgICAgcmVtb3ZlZC4KKyAgRXJyb3IgZGVmaW5lKFN5bWJvbE1hcCBOZXdTeW1ib2xzKTsKKworICAvLy8gQGJyaWVmIEFkZHMgdGhlIGdpdmVuIHN5bWJvbHMgdG8gdGhlIG1hcHBpbmcgYXMgbGF6eSBzeW1ib2xzLgorICBFcnJvciBkZWZpbmVMYXp5KHN0ZDo6dW5pcXVlX3B0cjxNYXRlcmlhbGl6YXRpb25Vbml0PiBTb3VyY2UpOworCisgIC8vLyBAYnJpZWYgQWRkIHRoZSBnaXZlbiBzeW1ib2wvYWRkcmVzcyBtYXBwaW5ncyB0byB0aGUgZHlsaWIsIGJ1dCBkbyBub3QKKyAgLy8vICAgICAgICBtYXJrIHRoZSBzeW1ib2xzIGFzIGZpbmFsaXplZCB5ZXQuCisgIHZvaWQgcmVzb2x2ZShTeW1ib2xNYXAgU3ltYm9sVmFsdWVzKTsKKworICAvLy8gQGJyaWVmIEZpbmFsaXplIHRoZSBnaXZlbiBzeW1ib2xzLgorICB2b2lkIGZpbmFsaXplKFN5bWJvbE5hbWVTZXQgU3ltYm9sc1RvRmluYWxpemUpOworCisgIC8vLyBAYnJpZWYgTG9vayB1cCB0aGUgZmxhZ3MgZm9yIHRoZSBnaXZlbiBzeW1ib2xzLgorICAvLy8KKyAgLy8vIFJldHVybnMgdGhlIGZsYWdzIGZvciB0aGUgZ2l2ZSBzeW1ib2xzLCB0b2dldGhlciB3aXRoIHRoZSBzZXQgb2Ygc3ltYm9scworICAvLy8gbm90IGZvdW5kLgorICBTeW1ib2xOYW1lU2V0IGxvb2t1cEZsYWdzKFN5bWJvbEZsYWdzTWFwICZGbGFncywgU3ltYm9sTmFtZVNldCBTeW1ib2xzKTsKKworICAvLy8gQGJyaWVmIEFwcGx5IHRoZSBnaXZlbiBxdWVyeSB0byB0aGUgZ2l2ZW4gc3ltYm9scyBpbiB0aGlzIFZTTy4KKyAgLy8vCisgIC8vLyBGb3Igc3ltYm9scyBpbiB0aGlzIFZTTyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIG1hdGVyaWFsaXplZCwgdGhlaXIgYWRkcmVzcworICAvLy8gd2lsbCBiZSBzZXQgaW4gdGhlIHF1ZXJ5IGltbWVkaWF0ZWx5LgorICAvLy8KKyAgLy8vIEZvciBzeW1ib2xzIGluIHRoaXMgVlNPIHRoYXQgaGF2ZSBub3QgYmVlbiBtYXRlcmlhbGl6ZWQsIHRoZSBxdWVyeSB3aWxsIGJlCisgIC8vLyByZWNvcmRlZCBhbmQgdGhlIHNvdXJjZSBmb3IgdGhvc2Ugc3ltYm9scyAocGx1cyB0aGUgc2V0IG9mIHN5bWJvbHMgdG8gYmUKKyAgLy8vIG1hdGVyaWFsaXplZCBieSB0aGF0IHNvdXJjZSkgd2lsbCBiZSByZXR1cm5lZCBhcyB0aGUgTWF0ZXJpYWxpemF0aW9uV29yaworICAvLy8gZmllbGQgb2YgdGhlIExvb2t1cFJlc3VsdC4KKyAgLy8vCisgIC8vLyBBbnkgc3ltYm9scyBub3QgZm91bmQgaW4gdGhpcyBWU08gd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUKKyAgLy8vIFVucmVzb2x2ZWRTeW1ib2xzIGZpZWxkIG9mIHRoZSBMb29rdXBSZXN1bHQuCisgIExvb2t1cFJlc3VsdCBsb29rdXAoc3RkOjpzaGFyZWRfcHRyPEFzeW5jaHJvbm91c1N5bWJvbFF1ZXJ5PiBRdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xOYW1lU2V0IFN5bWJvbHMpOworCitwcml2YXRlOgorICBjbGFzcyBNYXRlcmlhbGl6YXRpb25JbmZvIHsKKyAgcHVibGljOgorICAgIHVzaW5nIFF1ZXJ5TGlzdCA9IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxBc3luY2hyb25vdXNTeW1ib2xRdWVyeT4+OworCisgICAgTWF0ZXJpYWxpemF0aW9uSW5mbyhzaXplX3QgU3ltYm9sc1JlbWFpbmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNYXRlcmlhbGl6YXRpb25Vbml0PiBNVSk7CisKKyAgICB1aW50NjRfdCBTeW1ib2xzUmVtYWluaW5nOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNYXRlcmlhbGl6YXRpb25Vbml0PiBNVTsKKyAgICBTeW1ib2xNYXAgU3ltYm9sczsKKyAgICBzdGQ6Om1hcDxTeW1ib2xTdHJpbmdQdHIsIFF1ZXJ5TGlzdD4gUGVuZGluZ1Jlc29sdXRpb247CisgICAgc3RkOjptYXA8U3ltYm9sU3RyaW5nUHRyLCBRdWVyeUxpc3Q+IFBlbmRpbmdGaW5hbGl6YXRpb247CisgIH07CisKKyAgdXNpbmcgTWF0ZXJpYWxpemF0aW9uSW5mb1NldCA9IHN0ZDo6c2V0PHN0ZDo6dW5pcXVlX3B0cjxNYXRlcmlhbGl6YXRpb25JbmZvPj47CisKKyAgdXNpbmcgTWF0ZXJpYWxpemF0aW9uSW5mb0l0ZXJhdG9yID0gTWF0ZXJpYWxpemF0aW9uSW5mb1NldDo6aXRlcmF0b3I7CisKKyAgY2xhc3MgU3ltYm9sVGFibGVFbnRyeSB7CisgIHB1YmxpYzoKKyAgICBTeW1ib2xUYWJsZUVudHJ5KEpJVFN5bWJvbEZsYWdzIFN5bWJvbEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgTWF0ZXJpYWxpemF0aW9uSW5mb0l0ZXJhdG9yIE1hdGVyaWFsaXphdGlvbkluZm9JdHIpOworICAgIFN5bWJvbFRhYmxlRW50cnkoSklURXZhbHVhdGVkU3ltYm9sIFN5bSk7CisgICAgU3ltYm9sVGFibGVFbnRyeShTeW1ib2xUYWJsZUVudHJ5ICYmT3RoZXIpOworICAgIH5TeW1ib2xUYWJsZUVudHJ5KCk7CisKKyAgICBTeW1ib2xUYWJsZUVudHJ5ICZvcGVyYXRvcj0oSklURXZhbHVhdGVkU3ltYm9sIFN5bSk7CisKKyAgICBKSVRTeW1ib2xGbGFncyBnZXRGbGFncygpIGNvbnN0OworICAgIHZvaWQgcmVwbGFjZVdpdGgoVlNPICZWLCBTeW1ib2xTdHJpbmdQdHIgTmFtZSwgSklUU3ltYm9sRmxhZ3MgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICBNYXRlcmlhbGl6YXRpb25JbmZvSXRlcmF0b3IgTmV3TWF0ZXJpYWxpemF0aW9uSW5mb0l0cik7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1hdGVyaWFsaXphdGlvblVuaXQ+CisgICAgcXVlcnkoU3ltYm9sU3RyaW5nUHRyIE5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxBc3luY2hyb25vdXNTeW1ib2xRdWVyeT4gUXVlcnkpOworICAgIHZvaWQgcmVzb2x2ZShWU08gJlYsIFN5bWJvbFN0cmluZ1B0ciBOYW1lLCBKSVRFdmFsdWF0ZWRTeW1ib2wgU3ltKTsKKyAgICB2b2lkIGZpbmFsaXplKFZTTyAmViwgU3ltYm9sU3RyaW5nUHRyIE5hbWUpOworICAgIHZvaWQgZGlzY2FyZChWU08gJlYsIFN5bWJvbFN0cmluZ1B0ciBOYW1lKTsKKworICBwcml2YXRlOgorICAgIHZvaWQgZGVzdHJveSgpOworCisgICAgSklUU3ltYm9sRmxhZ3MgRmxhZ3M7CisgICAgTWF0ZXJpYWxpemF0aW9uSW5mb0l0ZXJhdG9yIE1JSTsKKyAgICB1bmlvbiB7CisgICAgICBKSVRUYXJnZXRBZGRyZXNzIEFkZHJlc3M7CisgICAgICBNYXRlcmlhbGl6YXRpb25JbmZvSXRlcmF0b3IgTWF0ZXJpYWxpemF0aW9uSW5mb0l0cjsKKyAgICB9OworICB9OworCisgIHN0ZDo6bWFwPFN5bWJvbFN0cmluZ1B0ciwgU3ltYm9sVGFibGVFbnRyeT4gU3ltYm9sczsKKyAgTWF0ZXJpYWxpemF0aW9uSW5mb1NldCBNYXRlcmlhbGl6YXRpb25JbmZvczsKK307CisKKy8vLyBAYnJpZWYgQW4gRXhlY3V0aW9uU2Vzc2lvbiByZXByZXNlbnRzIGEgcnVubmluZyBKSVQgcHJvZ3JhbS4KK2NsYXNzIEV4ZWN1dGlvblNlc3Npb24geworcHVibGljOgorICB1c2luZyBFcnJvclJlcG9ydGVyID0gc3RkOjpmdW5jdGlvbjx2b2lkKEVycm9yKT47CisKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3QgYW4gRXhlY3V0aW9uRW5naW5lLgorICAvLy8KKyAgLy8vIFN5bWJvbFN0cmluZ1Bvb2xzIG1heSBiZSBzaGFyZWQgYmV0d2VlbiBFeGVjdXRpb25TZXNzaW9ucy4KKyAgRXhlY3V0aW9uU2Vzc2lvbihTeW1ib2xTdHJpbmdQb29sICZTU1ApOworCisgIC8vLyBAYnJpZWYgUmV0dXJucyB0aGUgU3ltYm9sU3RyaW5nUG9vbCBmb3IgdGhpcyBFeGVjdXRpb25TZXNzaW9uLgorICBTeW1ib2xTdHJpbmdQb29sICZnZXRTeW1ib2xTdHJpbmdQb29sKCkgY29uc3QgeyByZXR1cm4gU1NQOyB9CisKKyAgLy8vIEBicmllZiBTZXQgdGhlIGVycm9yIHJlcG9ydGVyIGZ1bmN0aW9uLgorICB2b2lkIHNldEVycm9yUmVwb3J0ZXIoRXJyb3JSZXBvcnRlciBSZXBvcnRFcnJvcikgeworICAgIHRoaXMtPlJlcG9ydEVycm9yID0gc3RkOjptb3ZlKFJlcG9ydEVycm9yKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgUmVwb3J0IGEgZXJyb3IgZm9yIHRoaXMgZXhlY3V0aW9uIHNlc3Npb24uCisgIC8vLworICAvLy8gVW5oYW5kbGVkIGVycm9ycyBjYW4gYmUgc2VudCBoZXJlIHRvIGxvZyB0aGVtLgorICB2b2lkIHJlcG9ydEVycm9yKEVycm9yIEVycikgeyBSZXBvcnRFcnJvcihzdGQ6Om1vdmUoRXJyKSk7IH0KKworICAvLy8gQGJyaWVmIEFsbG9jYXRlIGEgbW9kdWxlIGtleSBmb3IgYSBuZXcgbW9kdWxlIHRvIGFkZCB0byB0aGUgSklULgorICBWTW9kdWxlS2V5IGFsbG9jYXRlVk1vZHVsZSgpOworCisgIC8vLyBAYnJpZWYgUmV0dXJuIGEgbW9kdWxlIGtleSB0byB0aGUgRXhlY3V0aW9uU2Vzc2lvbiBzbyB0aGF0IGl0IGNhbiBiZQorICAvLy8gICAgICAgIHJlLXVzZWQuIFRoaXMgc2hvdWxkIG9ubHkgYmUgZG9uZSBvbmNlIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZAorICAvLy8vICAgICAgIHdpdGggdGhlIG9yaWdpbmFsIGtleSBoYXZlIGJlZW4gcmVsZWFzZWQuCisgIHZvaWQgcmVsZWFzZVZNb2R1bGUoVk1vZHVsZUtleSBLZXkpOworCitwdWJsaWM6CisgIHN0YXRpYyB2b2lkIGxvZ0Vycm9yc1RvU3RkRXJyKEVycm9yIEVycik7CisKKyAgU3ltYm9sU3RyaW5nUG9vbCAmU1NQOworICBWTW9kdWxlS2V5IExhc3RLZXkgPSAwOworICBFcnJvclJlcG9ydGVyIFJlcG9ydEVycm9yID0gbG9nRXJyb3JzVG9TdGRFcnI7Cit9OworCisvLy8gUnVucyBNYXRlcmlhbGl6ZXJzIG9uIHRoZSBjdXJyZW50IHRocmVhZCBhbmQgcmVwb3J0cyBlcnJvcnMgdG8gdGhlIGdpdmVuCisvLy8gRXhlY3V0aW9uU2Vzc2lvbi4KK2NsYXNzIE1hdGVyaWFsaXplT25DdXJyZW50VGhyZWFkIHsKK3B1YmxpYzoKKyAgTWF0ZXJpYWxpemVPbkN1cnJlbnRUaHJlYWQoRXhlY3V0aW9uU2Vzc2lvbiAmRVMpIDogRVMoRVMpIHt9CisKKyAgdm9pZCBvcGVyYXRvcigpKFZTTyAmViwgc3RkOjp1bmlxdWVfcHRyPE1hdGVyaWFsaXphdGlvblVuaXQ+IE1VKSB7CisgICAgaWYgKGF1dG8gRXJyID0gTVUtPm1hdGVyaWFsaXplKFYpKQorICAgICAgRVMucmVwb3J0RXJyb3Ioc3RkOjptb3ZlKEVycikpOworICB9CisKK3ByaXZhdGU6CisgIEV4ZWN1dGlvblNlc3Npb24gJkVTOworfTsKKworLy8vIE1hdGVyaWFsaXphdGlvbiBmdW5jdGlvbiBvYmplY3Qgd3JhcHBlciBmb3IgdGhlIGxvb2t1cCBtZXRob2QuCit1c2luZyBNYXRlcmlhbGl6YXRpb25EaXNwYXRjaGVyID0KKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoVlNPICZWLCBzdGQ6OnVuaXF1ZV9wdHI8TWF0ZXJpYWxpemF0aW9uVW5pdD4gUyk+OworCisvLy8gQGJyaWVmIExvb2sgdXAgYSBzZXQgb2Ygc3ltYm9scyBieSBzZWFyY2hpbmcgYSBsaXN0IG9mIFZTT3MuCisvLy8KKy8vLyBBbGwgVlNPcyBpbiB0aGUgbGlzdCBzaG91bGQgYmUgbm9uLW51bGwuCitFeHBlY3RlZDxTeW1ib2xNYXA+IGxvb2t1cChjb25zdCBzdGQ6OnZlY3RvcjxWU08gKj4gJlZTT3MsIFN5bWJvbE5hbWVTZXQgTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRlcmlhbGl6YXRpb25EaXNwYXRjaGVyIERpc3BhdGNoTWF0ZXJpYWxpemF0aW9uKTsKKworLy8vIEBicmllZiBMb29rIHVwIGEgc3ltYm9sIGJ5IHNlYXJjaGluZyBhIGxpc3Qgb2YgVlNPcy4KK0V4cGVjdGVkPEpJVEV2YWx1YXRlZFN5bWJvbD4KK2xvb2t1cChjb25zdCBzdGQ6OnZlY3RvcjxWU08gKj4gVlNPcywgU3ltYm9sU3RyaW5nUHRyIE5hbWUsCisgICAgICAgTWF0ZXJpYWxpemF0aW9uRGlzcGF0Y2hlciBEaXNwYXRjaE1hdGVyaWFsaXphdGlvbik7CisKK30gLy8gRW5kIG5hbWVzcGFjZSBvcmMKK30gLy8gRW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfQ09SRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvRXhlY3V0aW9uVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9FeGVjdXRpb25VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NjZkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvRXhlY3V0aW9uVXRpbHMuaApAQCAtMCwwICsxLDE5MCBAQAorLy89PT0tIEV4ZWN1dGlvblV0aWxzLmggLSBVdGlsaXRpZXMgZm9yIGV4ZWN1dGluZyBjb2RlIGluIE9yYyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDb250YWlucyB1dGlsaXRpZXMgZm9yIGV4ZWN1dGluZyBjb2RlIGluIE9yYy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19FWEVDVVRJT05VVElMU19ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19FWEVDVVRJT05VVElMU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0pJVFN5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9Db3JlLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL09yY0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvUnVudGltZUR5bGQuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ29uc3RhbnRBcnJheTsKK2NsYXNzIEdsb2JhbFZhcmlhYmxlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBNb2R1bGU7CitjbGFzcyBWYWx1ZTsKKworbmFtZXNwYWNlIG9yYyB7CisKKy8vLyBAYnJpZWYgVGhpcyBpdGVyYXRvciBwcm92aWRlcyBhIGNvbnZlbmllbnQgd2F5IHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMKKy8vLyAgICAgICAgb2YgYW4gbGx2bS5nbG9iYWxfY3RvcnMvbGx2bS5nbG9iYWxfZHRvcnMgaW5zdGFuY2UuCisvLy8KKy8vLyAgIFRoZSBlYXNpZXN0IHdheSB0byBnZXQgaG9sZCBvZiBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBpcyB0byB1c2UgdGhlCisvLy8gZ2V0Q29uc3RydWN0b3JzL2dldERlc3RydWN0b3JzIGZ1bmN0aW9ucy4KK2NsYXNzIEN0b3JEdG9ySXRlcmF0b3IgeworcHVibGljOgorICAvLy8gQGJyaWVmIEFjY2Vzc29yIGZvciBhbiBlbGVtZW50IG9mIHRoZSBnbG9iYWxfY3RvcnMvZ2xvYmFsX2R0b3JzIGFycmF5LgorICAvLy8KKyAgLy8vICAgVGhpcyBjbGFzcyBwcm92aWRlcyBhIHJlYWQtb25seSB2aWV3IG9mIHRoZSBlbGVtZW50IHdpdGggYW55IGNhc3RzIG9uCisgIC8vLyB0aGUgZnVuY3Rpb24gc3RyaXBwZWQgYXdheS4KKyAgc3RydWN0IEVsZW1lbnQgeworICAgIEVsZW1lbnQodW5zaWduZWQgUHJpb3JpdHksIEZ1bmN0aW9uICpGdW5jLCBWYWx1ZSAqRGF0YSkKKyAgICAgIDogUHJpb3JpdHkoUHJpb3JpdHkpLCBGdW5jKEZ1bmMpLCBEYXRhKERhdGEpIHt9CisKKyAgICB1bnNpZ25lZCBQcmlvcml0eTsKKyAgICBGdW5jdGlvbiAqRnVuYzsKKyAgICBWYWx1ZSAqRGF0YTsKKyAgfTsKKworICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhbiBpdGVyYXRvciBpbnN0YW5jZS4gSWYgRW5kIGlzIHRydWUgdGhlbiB0aGlzIGl0ZXJhdG9yCisgIC8vLyAgICAgICAgYWN0cyBhcyB0aGUgZW5kIG9mIHRoZSByYW5nZSwgb3RoZXJ3aXNlIGl0IGlzIHRoZSBiZWdpbm5pbmcuCisgIEN0b3JEdG9ySXRlcmF0b3IoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWLCBib29sIEVuZCk7CisKKyAgLy8vIEBicmllZiBUZXN0IGl0ZXJhdG9ycyBmb3IgZXF1YWxpdHkuCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDdG9yRHRvckl0ZXJhdG9yICZPdGhlcikgY29uc3Q7CisKKyAgLy8vIEBicmllZiBUZXN0IGl0ZXJhdG9ycyBmb3IgaW5lcXVhbGl0eS4KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEN0b3JEdG9ySXRlcmF0b3IgJk90aGVyKSBjb25zdDsKKworICAvLy8gQGJyaWVmIFByZS1pbmNyZW1lbnQgaXRlcmF0b3IuCisgIEN0b3JEdG9ySXRlcmF0b3ImIG9wZXJhdG9yKysoKTsKKworICAvLy8gQGJyaWVmIFBvc3QtaW5jcmVtZW50IGl0ZXJhdG9yLgorICBDdG9yRHRvckl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KTsKKworICAvLy8gQGJyaWVmIERlcmVmZXJlbmNlIGl0ZXJhdG9yLiBUaGUgcmVzdWx0aW5nIHZhbHVlIHByb3ZpZGVzIGEgcmVhZC1vbmx5IHZpZXcKKyAgLy8vICAgICAgICBvZiB0aGlzIGVsZW1lbnQgb2YgdGhlIGdsb2JhbF9jdG9ycy9nbG9iYWxfZHRvcnMgbGlzdC4KKyAgRWxlbWVudCBvcGVyYXRvciooKSBjb25zdDsKKworcHJpdmF0ZToKKyAgY29uc3QgQ29uc3RhbnRBcnJheSAqSW5pdExpc3Q7CisgIHVuc2lnbmVkIEk7Cit9OworCisvLy8gQGJyaWVmIENyZWF0ZSBhbiBpdGVyYXRvciByYW5nZSBvdmVyIHRoZSBlbnRyaWVzIG9mIHRoZSBsbHZtLmdsb2JhbF9jdG9ycworLy8vICAgICAgICBhcnJheS4KK2l0ZXJhdG9yX3JhbmdlPEN0b3JEdG9ySXRlcmF0b3I+IGdldENvbnN0cnVjdG9ycyhjb25zdCBNb2R1bGUgJk0pOworCisvLy8gQGJyaWVmIENyZWF0ZSBhbiBpdGVyYXRvciByYW5nZSBvdmVyIHRoZSBlbnRyaWVzIG9mIHRoZSBsbHZtLmdsb2JhbF9jdG9ycworLy8vICAgICAgICBhcnJheS4KK2l0ZXJhdG9yX3JhbmdlPEN0b3JEdG9ySXRlcmF0b3I+IGdldERlc3RydWN0b3JzKGNvbnN0IE1vZHVsZSAmTSk7CisKKy8vLyBAYnJpZWYgQ29udmVuaWVuY2UgY2xhc3MgZm9yIHJlY29yZGluZyBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIG5hbWVzIGZvcgorLy8vICAgICAgICBsYXRlciBleGVjdXRpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSklUTGF5ZXJUPgorY2xhc3MgQ3RvckR0b3JSdW5uZXIgeworcHVibGljOgorICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhIEN0b3JEdG9yUnVubmVyIGZvciB0aGUgZ2l2ZW4gcmFuZ2UgdXNpbmcgdGhlIGdpdmVuCisgIC8vLyAgICAgICAgbmFtZSBtYW5nbGluZyBmdW5jdGlvbi4KKyAgQ3RvckR0b3JSdW5uZXIoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEN0b3JEdG9yTmFtZXMsIFZNb2R1bGVLZXkgSykKKyAgICAgIDogQ3RvckR0b3JOYW1lcyhzdGQ6Om1vdmUoQ3RvckR0b3JOYW1lcykpLCBLKEspIHt9CisKKyAgLy8vIEBicmllZiBSdW4gdGhlIHJlY29yZGVkIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycyB0aHJvdWdoIHRoZSBnaXZlbiBKSVQKKyAgLy8vICAgICAgICBsYXllci4KKyAgRXJyb3IgcnVuVmlhTGF5ZXIoSklUTGF5ZXJUICZKSVRMYXllcikgY29uc3QgeworICAgIHVzaW5nIEN0b3JEdG9yVHkgPSB2b2lkICgqKSgpOworCisgICAgZm9yIChjb25zdCBhdXRvICZDdG9yRHRvck5hbWUgOiBDdG9yRHRvck5hbWVzKSB7CisgICAgICBpZiAoYXV0byBDdG9yRHRvclN5bSA9IEpJVExheWVyLmZpbmRTeW1ib2xJbihLLCBDdG9yRHRvck5hbWUsIGZhbHNlKSkgeworICAgICAgICBpZiAoYXV0byBBZGRyT3JFcnIgPSBDdG9yRHRvclN5bS5nZXRBZGRyZXNzKCkpIHsKKyAgICAgICAgICBDdG9yRHRvclR5IEN0b3JEdG9yID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q3RvckR0b3JUeT4oc3RhdGljX2Nhc3Q8dWludHB0cl90PigqQWRkck9yRXJyKSk7CisgICAgICAgICAgQ3RvckR0b3IoKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgcmV0dXJuIEFkZHJPckVyci50YWtlRXJyb3IoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhdXRvIEVyciA9IEN0b3JEdG9yU3ltLnRha2VFcnJvcigpKQorICAgICAgICAgIHJldHVybiBFcnI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gbWFrZV9lcnJvcjxKSVRTeW1ib2xOb3RGb3VuZD4oQ3RvckR0b3JOYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEN0b3JEdG9yTmFtZXM7CisgIG9yYzo6Vk1vZHVsZUtleSBLOworfTsKKworLy8vIEBicmllZiBTdXBwb3J0IGNsYXNzIGZvciBzdGF0aWMgZHRvciBleGVjdXRpb24uIEZvciBob3N0ZWQgKGluLXByb2Nlc3MpIEpJVHMKKy8vLyAgICAgICAgb25seSEKKy8vLworLy8vICAgSWYgYSBfX2N4YV9hdGV4aXQgZnVuY3Rpb24gaXNuJ3QgZm91bmQgQysrIHByb2dyYW1zIHRoYXQgdXNlIHN0YXRpYworLy8vIGRlc3RydWN0b3JzIHdpbGwgZmFpbCB0byBsaW5rLiBIb3dldmVyLCB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgaG9zdAorLy8vIHByb2Nlc3MncyBfX2N4YV9hdGV4aXQsIGJlY2F1c2UgaXQgd2lsbCBzY2hlZHVsZSBKSVQnZCBkZXN0cnVjdG9ycyB0byBydW4KKy8vLyBhZnRlciB0aGUgSklUIGhhcyBiZWVuIHRvcm4gZG93biwgd2hpY2ggaXMgbm8gZ29vZC4gVGhpcyBjbGFzcyBtYWtlcyBpdCBlYXN5CisvLy8gdG8gb3ZlcnJpZGUgX19jeGFfYXRleGl0IChhbmQgdGhlIHJlbGF0ZWQgX19kc29faGFuZGxlKS4KKy8vLworLy8vICAgVG8gdXNlLCBjbGllbnRzIHNob3VsZCBtYW51YWxseSBjYWxsIHNlYXJjaE92ZXJyaWRlcyBmcm9tIHRoZWlyIHN5bWJvbAorLy8vIHJlc29sdmVyLiBUaGlzIHNob3VsZCBnZW5lcmFsbHkgYmUgZG9uZSBhZnRlciBhdHRlbXB0aW5nIHN5bWJvbCByZXNvbHV0aW9uCisvLy8gaW5zaWRlIHRoZSBKSVQsIGJ1dCBiZWZvcmUgc2VhcmNoaW5nIHRoZSBob3N0IHByb2Nlc3MncyBzeW1ib2wgdGFibGUuIFdoZW4KKy8vLyB0aGUgY2xpZW50IGRldGVybWluZXMgdGhhdCBkZXN0cnVjdG9ycyBzaG91bGQgYmUgcnVuIChnZW5lcmFsbHkgYXQgSklUCisvLy8gdGVhcmRvd24gb3IgYWZ0ZXIgYSByZXR1cm4gZnJvbSBtYWluKSwgdGhlIHJ1bkRlc3RydWN0b3JzIG1ldGhvZCBzaG91bGQgYmUKKy8vLyBjYWxsZWQuCitjbGFzcyBMb2NhbENYWFJ1bnRpbWVPdmVycmlkZXMgeworcHVibGljOgorICAvLy8gQ3JlYXRlIGEgcnVudGltZS1vdmVycmlkZXMgY2xhc3MuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNYW5nbGVGdG9yVD4KKyAgTG9jYWxDWFhSdW50aW1lT3ZlcnJpZGVzKGNvbnN0IE1hbmdsZUZ0b3JUICZNYW5nbGUpIHsKKyAgICBhZGRPdmVycmlkZShNYW5nbGUoIl9fZHNvX2hhbmRsZSIpLCB0b1RhcmdldEFkZHJlc3MoJkRTT0hhbmRsZU92ZXJyaWRlKSk7CisgICAgYWRkT3ZlcnJpZGUoTWFuZ2xlKCJfX2N4YV9hdGV4aXQiKSwgdG9UYXJnZXRBZGRyZXNzKCZDWEFBdEV4aXRPdmVycmlkZSkpOworICB9CisKKyAgLy8vIFNlYXJjaCBvdmVycmlkZWQgc3ltYm9scy4KKyAgSklURXZhbHVhdGVkU3ltYm9sIHNlYXJjaE92ZXJyaWRlcyhjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworICAgIGF1dG8gSSA9IENYWFJ1bnRpbWVPdmVycmlkZXMuZmluZChOYW1lKTsKKyAgICBpZiAoSSAhPSBDWFhSdW50aW1lT3ZlcnJpZGVzLmVuZCgpKQorICAgICAgcmV0dXJuIEpJVEV2YWx1YXRlZFN5bWJvbChJLT5zZWNvbmQsIEpJVFN5bWJvbEZsYWdzOjpFeHBvcnRlZCk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gUnVuIGFueSBkZXN0cnVjdG9ycyByZWNvcmRlZCBieSB0aGUgb3ZlcnJpZGVuIF9fY3hhX2F0ZXhpdCBmdW5jdGlvbgorICAvLy8gKENYQUF0RXhpdE92ZXJyaWRlKS4KKyAgdm9pZCBydW5EZXN0cnVjdG9ycygpOworCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHRyVHk+CisgIEpJVFRhcmdldEFkZHJlc3MgdG9UYXJnZXRBZGRyZXNzKFB0clR5KiBQKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEpJVFRhcmdldEFkZHJlc3M+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihQKSk7CisgIH0KKworICB2b2lkIGFkZE92ZXJyaWRlKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLCBKSVRUYXJnZXRBZGRyZXNzIEFkZHIpIHsKKyAgICBDWFhSdW50aW1lT3ZlcnJpZGVzLmluc2VydChzdGQ6Om1ha2VfcGFpcihOYW1lLCBBZGRyKSk7CisgIH0KKworICBTdHJpbmdNYXA8SklUVGFyZ2V0QWRkcmVzcz4gQ1hYUnVudGltZU92ZXJyaWRlczsKKworICB1c2luZyBEZXN0cnVjdG9yUHRyID0gdm9pZCAoKikodm9pZCAqKTsKKyAgdXNpbmcgQ1hYRGVzdHJ1Y3RvckRhdGFQYWlyID0gc3RkOjpwYWlyPERlc3RydWN0b3JQdHIsIHZvaWQgKj47CisgIHVzaW5nIENYWERlc3RydWN0b3JEYXRhUGFpckxpc3QgPSBzdGQ6OnZlY3RvcjxDWFhEZXN0cnVjdG9yRGF0YVBhaXI+OworICBDWFhEZXN0cnVjdG9yRGF0YVBhaXJMaXN0IERTT0hhbmRsZU92ZXJyaWRlOworICBzdGF0aWMgaW50IENYQUF0RXhpdE92ZXJyaWRlKERlc3RydWN0b3JQdHIgRGVzdHJ1Y3Rvciwgdm9pZCAqQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkRTT0hhbmRsZSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb3JjCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfRVhFQ1VUSU9OVVRJTFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0dsb2JhbE1hcHBpbmdMYXllci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0dsb2JhbE1hcHBpbmdMYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNDhjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvR2xvYmFsTWFwcGluZ0xheWVyLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8vPT09LSBHbG9iYWxNYXBwaW5nTGF5ZXIuaCAtIFJ1biBhbGwgSVIgdGhyb3VnaCBhIGZ1bmN0b3IgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ29udmVuaWVuY2UgbGF5ZXIgZm9yIGluamVjdGluZyBzeW1ib2xzIHRoYXQgd2lsbCBhcHBlYXIgaW4gY2FsbHMgdG8KKy8vIGZpbmRTeW1ib2wuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfR0xPQkFMTUFQUElOR0xBWUVSX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0dMT0JBTE1BUFBJTkdMQVlFUl9ICisKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRTeW1ib2wuaCIKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNb2R1bGU7CitjbGFzcyBKSVRTeW1ib2xSZXNvbHZlcjsKKworbmFtZXNwYWNlIG9yYyB7CisKKy8vLyBAYnJpZWYgR2xvYmFsIG1hcHBpbmcgbGF5ZXIuCisvLy8KKy8vLyAgIFRoaXMgbGF5ZXIgb3ZlcnJpZGVzIHRoZSBmaW5kU3ltYm9sIG1ldGhvZCB0byBmaXJzdCBzZWFyY2ggYSBsb2NhbCBzeW1ib2wKKy8vLyB0YWJsZSB0aGF0IHRoZSBjbGllbnQgY2FuIGRlZmluZS4gSXQgY2FuIGJlIHVzZWQgdG8gaW5qZWN0IG5ldyBzeW1ib2wKKy8vLyBtYXBwaW5ncyBpbnRvIHRoZSBKSVQuIEJld2FyZSwgaG93ZXZlcjogc3ltYm9scyB3aXRoaW4gYSBzaW5nbGUgSVIgbW9kdWxlIG9yCisvLy8gb2JqZWN0IGZpbGUgd2lsbCBzdGlsbCByZXNvbHZlIGxvY2FsbHkgKHZpYSBSdW50aW1lRHlsZCdzIHN5bWJvbCB0YWJsZSkgLQorLy8vIHN1Y2ggaW50ZXJuYWwgcmVmZXJlbmNlcyBjYW5ub3QgYmUgb3ZlcnJpZGVuIHZpYSB0aGlzIGxheWVyLgordGVtcGxhdGUgPHR5cGVuYW1lIEJhc2VMYXllclQ+CitjbGFzcyBHbG9iYWxNYXBwaW5nTGF5ZXIgeworcHVibGljOgorCisgIC8vLyBAYnJpZWYgSGFuZGxlIHRvIGFuIGFkZGVkIG1vZHVsZS4KKyAgdXNpbmcgTW9kdWxlSGFuZGxlVCA9IHR5cGVuYW1lIEJhc2VMYXllclQ6Ok1vZHVsZUhhbmRsZVQ7CisKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3QgYW4gR2xvYmFsTWFwcGluZ0xheWVyIHdpdGggdGhlIGdpdmVuIEJhc2VMYXllcgorICBHbG9iYWxNYXBwaW5nTGF5ZXIoQmFzZUxheWVyVCAmQmFzZUxheWVyKSA6IEJhc2VMYXllcihCYXNlTGF5ZXIpIHt9CisKKyAgLy8vIEBicmllZiBBZGQgdGhlIGdpdmVuIG1vZHVsZSB0byB0aGUgSklULgorICAvLy8gQHJldHVybiBBIGhhbmRsZSBmb3IgdGhlIGFkZGVkIG1vZHVsZXMuCisgIEV4cGVjdGVkPE1vZHVsZUhhbmRsZVQ+CisgIGFkZE1vZHVsZShzdGQ6OnNoYXJlZF9wdHI8TW9kdWxlPiBNLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEpJVFN5bWJvbFJlc29sdmVyPiBSZXNvbHZlcikgeworICAgIHJldHVybiBCYXNlTGF5ZXIuYWRkTW9kdWxlKHN0ZDo6bW92ZShNKSwgc3RkOjptb3ZlKFJlc29sdmVyKSk7CisgIH0KKworICAvLy8gQGJyaWVmIFJlbW92ZSB0aGUgbW9kdWxlIHNldCBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZSBILgorICBFcnJvciByZW1vdmVNb2R1bGUoTW9kdWxlSGFuZGxlVCBIKSB7IHJldHVybiBCYXNlTGF5ZXIucmVtb3ZlTW9kdWxlKEgpOyB9CisKKyAgLy8vIEBicmllZiBNYW51YWxseSBzZXQgdGhlIGFkZHJlc3MgdG8gcmV0dXJuIGZvciB0aGUgZ2l2ZW4gc3ltYm9sLgorICB2b2lkIHNldEdsb2JhbE1hcHBpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsIEpJVFRhcmdldEFkZHJlc3MgQWRkcikgeworICAgIFN5bWJvbFRhYmxlW05hbWVdID0gQWRkcjsKKyAgfQorCisgIC8vLyBAYnJpZWYgUmVtb3ZlIHRoZSBnaXZlbiBzeW1ib2wgZnJvbSB0aGUgZ2xvYmFsIG1hcHBpbmcuCisgIHZvaWQgZXJhc2VHbG9iYWxNYXBwaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgICAgU3ltYm9sVGFibGUuZXJhc2UoTmFtZSk7CisgIH0KKworICAvLy8gQGJyaWVmIFNlYXJjaCBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbC4KKyAgLy8vCisgIC8vLyAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGZpcnN0IHNlYXJjaCB0aGUgbG9jYWwgc3ltYm9sIHRhYmxlLCByZXR1cm5pbmcKKyAgLy8vICAgICAgICBhbnkgc3ltYm9sIGZvdW5kIHRoZXJlLiBJZiB0aGUgc3ltYm9sIGlzIG5vdCBmb3VuZCBpbiB0aGUgbG9jYWwKKyAgLy8vICAgICAgICB0YWJsZSB0aGVuIHRoaXMgY2FsbCB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBiYXNlIGxheWVyLgorICAvLy8KKyAgLy8vIEBwYXJhbSBOYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gc2VhcmNoIGZvci4KKyAgLy8vIEBwYXJhbSBFeHBvcnRlZFN5bWJvbHNPbmx5IElmIHRydWUsIHNlYXJjaCBvbmx5IGZvciBleHBvcnRlZCBzeW1ib2xzLgorICAvLy8gQHJldHVybiBBIGhhbmRsZSBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbCwgaWYgaXQgZXhpc3RzLgorICBKSVRTeW1ib2wgZmluZFN5bWJvbChjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5KSB7CisgICAgYXV0byBJID0gU3ltYm9sVGFibGUuZmluZChOYW1lKTsKKyAgICBpZiAoSSAhPSBTeW1ib2xUYWJsZS5lbmQoKSkKKyAgICAgIHJldHVybiBKSVRTeW1ib2woSS0+c2Vjb25kLCBKSVRTeW1ib2xGbGFnczo6RXhwb3J0ZWQpOworICAgIHJldHVybiBCYXNlTGF5ZXIuZmluZFN5bWJvbChOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBnaXZlbiBzeW1ib2wgaW4gdGhlIGNvbnRleHQgb2YgdGhlIG9mIHRoZQorICAvLy8gICAgICAgIG1vZHVsZSByZXByZXNlbnRlZCBieSB0aGUgaGFuZGxlIEguIFRoaXMgY2FsbCBpcyBmb3J3YXJkZWQgdG8gdGhlCisgIC8vLyAgICAgICAgYmFzZSBsYXllcidzIGltcGxlbWVudGF0aW9uLgorICAvLy8gQHBhcmFtIEggVGhlIGhhbmRsZSBmb3IgdGhlIG1vZHVsZSB0byBzZWFyY2ggaW4uCisgIC8vLyBAcGFyYW0gTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIHNlYXJjaCBmb3IuCisgIC8vLyBAcGFyYW0gRXhwb3J0ZWRTeW1ib2xzT25seSBJZiB0cnVlLCBzZWFyY2ggb25seSBmb3IgZXhwb3J0ZWQgc3ltYm9scy4KKyAgLy8vIEByZXR1cm4gQSBoYW5kbGUgZm9yIHRoZSBnaXZlbiBuYW1lZCBzeW1ib2wsIGlmIGl0IGlzIGZvdW5kIGluIHRoZQorICAvLy8gICAgICAgICBnaXZlbiBtb2R1bGUuCisgIEpJVFN5bWJvbCBmaW5kU3ltYm9sSW4oTW9kdWxlSGFuZGxlVCBILCBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEV4cG9ydGVkU3ltYm9sc09ubHkpIHsKKyAgICByZXR1cm4gQmFzZUxheWVyLmZpbmRTeW1ib2xJbihILCBOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgSW1tZWRpYXRlbHkgZW1pdCBhbmQgZmluYWxpemUgdGhlIG1vZHVsZSBzZXQgcmVwcmVzZW50ZWQgYnkgdGhlCisgIC8vLyAgICAgICAgZ2l2ZW4gaGFuZGxlLgorICAvLy8gQHBhcmFtIEggSGFuZGxlIGZvciBtb2R1bGUgc2V0IHRvIGVtaXQvZmluYWxpemUuCisgIEVycm9yIGVtaXRBbmRGaW5hbGl6ZShNb2R1bGVIYW5kbGVUIEgpIHsKKyAgICByZXR1cm4gQmFzZUxheWVyLmVtaXRBbmRGaW5hbGl6ZShIKTsKKyAgfQorCitwcml2YXRlOgorICBCYXNlTGF5ZXJUICZCYXNlTGF5ZXI7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBKSVRUYXJnZXRBZGRyZXNzPiBTeW1ib2xUYWJsZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvcmMKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfR0xPQkFMTUFQUElOR0xBWUVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9JUkNvbXBpbGVMYXllci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0lSQ29tcGlsZUxheWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdmOTQxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9JUkNvbXBpbGVMYXllci5oCkBAIC0wLDAgKzEsMTA3IEBACisvLz09PS0gSVJDb21waWxlTGF5ZXIuaCAtLSBFYWdlcmx5IGNvbXBpbGUgSVIgZm9yIEpJVCAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENvbnRhaW5zIHRoZSBkZWZpbml0aW9uIGZvciBhIGJhc2ljLCBlYWdlcmx5IGNvbXBpbGluZyBsYXllciBvZiB0aGUgSklULgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0lSQ09NUElMRUxBWUVSX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0lSQ09NUElMRUxBWUVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0pJVFN5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9Db3JlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNb2R1bGU7CisKK25hbWVzcGFjZSBvcmMgeworCisvLy8gQGJyaWVmIEVhZ2VyIElSIGNvbXBpbGluZyBsYXllci4KKy8vLworLy8vICAgVGhpcyBsYXllciBpbW1lZGlhdGVseSBjb21waWxlcyBlYWNoIElSIG1vZHVsZSBhZGRlZCB2aWEgYWRkTW9kdWxlIHRvIGFuCisvLy8gb2JqZWN0IGZpbGUgYW5kIGFkZHMgdGhpcyBtb2R1bGUgZmlsZSB0byB0aGUgbGF5ZXIgYmVsb3csIHdoaWNoIG11c3QKKy8vLyBpbXBsZW1lbnQgdGhlIG9iamVjdCBsYXllciBjb25jZXB0LgordGVtcGxhdGUgPHR5cGVuYW1lIEJhc2VMYXllclQsIHR5cGVuYW1lIENvbXBpbGVGdG9yPgorY2xhc3MgSVJDb21waWxlTGF5ZXIgeworcHVibGljOgorICAvLy8gQGJyaWVmIENhbGxiYWNrIHR5cGUgZm9yIG5vdGlmaWNhdGlvbnMgd2hlbiBtb2R1bGVzIGFyZSBjb21waWxlZC4KKyAgdXNpbmcgTm90aWZ5Q29tcGlsZWRDYWxsYmFjayA9CisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoVk1vZHVsZUtleSBLLCBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPik+OworCisgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGFuIElSQ29tcGlsZUxheWVyIHdpdGggdGhlIGdpdmVuIEJhc2VMYXllciwgd2hpY2ggbXVzdAorICAvLy8gICAgICAgIGltcGxlbWVudCB0aGUgT2JqZWN0TGF5ZXIgY29uY2VwdC4KKyAgSVJDb21waWxlTGF5ZXIoCisgICAgICBCYXNlTGF5ZXJUICZCYXNlTGF5ZXIsIENvbXBpbGVGdG9yIENvbXBpbGUsCisgICAgICBOb3RpZnlDb21waWxlZENhbGxiYWNrIE5vdGlmeUNvbXBpbGVkID0gTm90aWZ5Q29tcGlsZWRDYWxsYmFjaygpKQorICAgICAgOiBCYXNlTGF5ZXIoQmFzZUxheWVyKSwgQ29tcGlsZShzdGQ6Om1vdmUoQ29tcGlsZSkpLAorICAgICAgICBOb3RpZnlDb21waWxlZChzdGQ6Om1vdmUoTm90aWZ5Q29tcGlsZWQpKSB7fQorCisgIC8vLyBAYnJpZWYgR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBjb21waWxlciBmdW5jdG9yLgorICBDb21waWxlRnRvciYgZ2V0Q29tcGlsZXIoKSB7IHJldHVybiBDb21waWxlOyB9CisKKyAgLy8vIEBicmllZiAoUmUpc2V0IHRoZSBOb3RpZnlDb21waWxlZCBjYWxsYmFjay4KKyAgdm9pZCBzZXROb3RpZnlDb21waWxlZChOb3RpZnlDb21waWxlZENhbGxiYWNrIE5vdGlmeUNvbXBpbGVkKSB7CisgICAgdGhpcy0+Tm90aWZ5Q29tcGlsZWQgPSBzdGQ6Om1vdmUoTm90aWZ5Q29tcGlsZWQpOworICB9CisKKyAgLy8vIEBicmllZiBDb21waWxlIHRoZSBtb2R1bGUsIGFuZCBhZGQgdGhlIHJlc3VsdGluZyBvYmplY3QgdG8gdGhlIGJhc2UgbGF5ZXIKKyAgLy8vICAgICAgICBhbG9uZyB3aXRoIHRoZSBnaXZlbiBtZW1vcnkgbWFuYWdlciBhbmQgc3ltYm9sIHJlc29sdmVyLgorICBFcnJvciBhZGRNb2R1bGUoVk1vZHVsZUtleSBLLCBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNKSB7CisgICAgaWYgKGF1dG8gRXJyID0gQmFzZUxheWVyLmFkZE9iamVjdChzdGQ6Om1vdmUoSyksIENvbXBpbGUoKk0pKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgaWYgKE5vdGlmeUNvbXBpbGVkKQorICAgICAgTm90aWZ5Q29tcGlsZWQoc3RkOjptb3ZlKEspLCBzdGQ6Om1vdmUoTSkpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgLy8vIEBicmllZiBSZW1vdmUgdGhlIG1vZHVsZSBhc3NvY2lhdGVkIHdpdGggdGhlIFZNb2R1bGVLZXkgSy4KKyAgRXJyb3IgcmVtb3ZlTW9kdWxlKFZNb2R1bGVLZXkgSykgeyByZXR1cm4gQmFzZUxheWVyLnJlbW92ZU9iamVjdChLKTsgfQorCisgIC8vLyBAYnJpZWYgU2VhcmNoIGZvciB0aGUgZ2l2ZW4gbmFtZWQgc3ltYm9sLgorICAvLy8gQHBhcmFtIE5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0byBzZWFyY2ggZm9yLgorICAvLy8gQHBhcmFtIEV4cG9ydGVkU3ltYm9sc09ubHkgSWYgdHJ1ZSwgc2VhcmNoIG9ubHkgZm9yIGV4cG9ydGVkIHN5bWJvbHMuCisgIC8vLyBAcmV0dXJuIEEgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gbmFtZWQgc3ltYm9sLCBpZiBpdCBleGlzdHMuCisgIEpJVFN5bWJvbCBmaW5kU3ltYm9sKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLCBib29sIEV4cG9ydGVkU3ltYm9sc09ubHkpIHsKKyAgICByZXR1cm4gQmFzZUxheWVyLmZpbmRTeW1ib2woTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSk7CisgIH0KKworICAvLy8gQGJyaWVmIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZ2l2ZW4gc3ltYm9sIGluIGNvbXBpbGVkIG1vZHVsZSByZXByZXNlbnRlZAorICAvLy8gICAgICAgIGJ5IHRoZSBoYW5kbGUgSC4gVGhpcyBjYWxsIGlzIGZvcndhcmRlZCB0byB0aGUgYmFzZSBsYXllcidzCisgIC8vLyAgICAgICAgaW1wbGVtZW50YXRpb24uCisgIC8vLyBAcGFyYW0gSyBUaGUgVk1vZHVsZUtleSBmb3IgdGhlIG1vZHVsZSB0byBzZWFyY2ggaW4uCisgIC8vLyBAcGFyYW0gTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIHNlYXJjaCBmb3IuCisgIC8vLyBAcGFyYW0gRXhwb3J0ZWRTeW1ib2xzT25seSBJZiB0cnVlLCBzZWFyY2ggb25seSBmb3IgZXhwb3J0ZWQgc3ltYm9scy4KKyAgLy8vIEByZXR1cm4gQSBoYW5kbGUgZm9yIHRoZSBnaXZlbiBuYW1lZCBzeW1ib2wsIGlmIGl0IGlzIGZvdW5kIGluIHRoZQorICAvLy8gICAgICAgICBnaXZlbiBtb2R1bGUuCisgIEpJVFN5bWJvbCBmaW5kU3ltYm9sSW4oVk1vZHVsZUtleSBLLCBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEV4cG9ydGVkU3ltYm9sc09ubHkpIHsKKyAgICByZXR1cm4gQmFzZUxheWVyLmZpbmRTeW1ib2xJbihLLCBOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgSW1tZWRpYXRlbHkgZW1pdCBhbmQgZmluYWxpemUgdGhlIG1vZHVsZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4KKyAgLy8vICAgICAgICBoYW5kbGUuCisgIC8vLyBAcGFyYW0gSyBUaGUgVk1vZHVsZUtleSBmb3IgdGhlIG1vZHVsZSB0byBlbWl0L2ZpbmFsaXplLgorICBFcnJvciBlbWl0QW5kRmluYWxpemUoVk1vZHVsZUtleSBLKSB7IHJldHVybiBCYXNlTGF5ZXIuZW1pdEFuZEZpbmFsaXplKEspOyB9CisKK3ByaXZhdGU6CisgIEJhc2VMYXllclQgJkJhc2VMYXllcjsKKyAgQ29tcGlsZUZ0b3IgQ29tcGlsZTsKKyAgTm90aWZ5Q29tcGlsZWRDYWxsYmFjayBOb3RpZnlDb21waWxlZDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvcmMKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19JUkNPTVBJTElOR0xBWUVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9JUlRyYW5zZm9ybUxheWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvSVJUcmFuc2Zvcm1MYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMWZlN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvSVJUcmFuc2Zvcm1MYXllci5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vPT09LSBJUlRyYW5zZm9ybUxheWVyLmggLSBSdW4gYWxsIElSIHRocm91Z2ggYSBmdW5jdG9yIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gUnVuIGFsbCBJUiBwYXNzZWQgaW4gdGhyb3VnaCBhIHVzZXIgc3VwcGxpZWQgZnVuY3Rvci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19JUlRSQU5TRk9STUxBWUVSX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0lSVFJBTlNGT1JNTEFZRVJfSAorCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0NvcmUuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNb2R1bGU7CituYW1lc3BhY2Ugb3JjIHsKKworLy8vIEBicmllZiBJUiBtdXRhdGluZyBsYXllci4KKy8vLworLy8vICAgVGhpcyBsYXllciBhcHBsaWVzIGEgdXNlciBzdXBwbGllZCB0cmFuc2Zvcm0gdG8gZWFjaCBtb2R1bGUgdGhhdCBpcyBhZGRlZCwKKy8vLyB0aGVuIGFkZHMgdGhlIHRyYW5zZm9ybWVkIG1vZHVsZSB0byB0aGUgbGF5ZXIgYmVsb3cuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmFzZUxheWVyVCwgdHlwZW5hbWUgVHJhbnNmb3JtRnRvcj4KK2NsYXNzIElSVHJhbnNmb3JtTGF5ZXIgeworcHVibGljOgorCisgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGFuIElSVHJhbnNmb3JtTGF5ZXIgd2l0aCB0aGUgZ2l2ZW4gQmFzZUxheWVyCisgIElSVHJhbnNmb3JtTGF5ZXIoQmFzZUxheWVyVCAmQmFzZUxheWVyLAorICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybUZ0b3IgVHJhbnNmb3JtID0gVHJhbnNmb3JtRnRvcigpKQorICAgIDogQmFzZUxheWVyKEJhc2VMYXllciksIFRyYW5zZm9ybShzdGQ6Om1vdmUoVHJhbnNmb3JtKSkge30KKworICAvLy8gQGJyaWVmIEFwcGx5IHRoZSB0cmFuc2Zvcm0gZnVuY3RvciB0byB0aGUgbW9kdWxlLCB0aGVuIGFkZCB0aGUgbW9kdWxlIHRvCisgIC8vLyAgICAgICAgdGhlIGxheWVyIGJlbG93LCBhbG9uZyB3aXRoIHRoZSBtZW1vcnkgbWFuYWdlciBhbmQgc3ltYm9sIHJlc29sdmVyLgorICAvLy8KKyAgLy8vIEByZXR1cm4gQSBoYW5kbGUgZm9yIHRoZSBhZGRlZCBtb2R1bGVzLgorICBFcnJvciBhZGRNb2R1bGUoVk1vZHVsZUtleSBLLCBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNKSB7CisgICAgcmV0dXJuIEJhc2VMYXllci5hZGRNb2R1bGUoc3RkOjptb3ZlKEspLCBUcmFuc2Zvcm0oc3RkOjptb3ZlKE0pKSk7CisgIH0KKworICAvLy8gQGJyaWVmIFJlbW92ZSB0aGUgbW9kdWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgVk1vZHVsZUtleSBLLgorICBFcnJvciByZW1vdmVNb2R1bGUoVk1vZHVsZUtleSBLKSB7IHJldHVybiBCYXNlTGF5ZXIucmVtb3ZlTW9kdWxlKEspOyB9CisKKyAgLy8vIEBicmllZiBTZWFyY2ggZm9yIHRoZSBnaXZlbiBuYW1lZCBzeW1ib2wuCisgIC8vLyBAcGFyYW0gTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIHNlYXJjaCBmb3IuCisgIC8vLyBAcGFyYW0gRXhwb3J0ZWRTeW1ib2xzT25seSBJZiB0cnVlLCBzZWFyY2ggb25seSBmb3IgZXhwb3J0ZWQgc3ltYm9scy4KKyAgLy8vIEByZXR1cm4gQSBoYW5kbGUgZm9yIHRoZSBnaXZlbiBuYW1lZCBzeW1ib2wsIGlmIGl0IGV4aXN0cy4KKyAgSklUU3ltYm9sIGZpbmRTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSkgeworICAgIHJldHVybiBCYXNlTGF5ZXIuZmluZFN5bWJvbChOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBnaXZlbiBzeW1ib2wgaW4gdGhlIGNvbnRleHQgb2YgdGhlIG1vZHVsZQorICAvLy8gICAgICAgIHJlcHJlc2VudGVkIGJ5IHRoZSBWTW9kdWxlS2V5IEsuIFRoaXMgY2FsbCBpcyBmb3J3YXJkZWQgdG8gdGhlIGJhc2UKKyAgLy8vICAgICAgICBsYXllcidzIGltcGxlbWVudGF0aW9uLgorICAvLy8gQHBhcmFtIEsgVGhlIFZNb2R1bGVLZXkgZm9yIHRoZSBtb2R1bGUgdG8gc2VhcmNoIGluLgorICAvLy8gQHBhcmFtIE5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0byBzZWFyY2ggZm9yLgorICAvLy8gQHBhcmFtIEV4cG9ydGVkU3ltYm9sc09ubHkgSWYgdHJ1ZSwgc2VhcmNoIG9ubHkgZm9yIGV4cG9ydGVkIHN5bWJvbHMuCisgIC8vLyBAcmV0dXJuIEEgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gbmFtZWQgc3ltYm9sLCBpZiBpdCBpcyBmb3VuZCBpbiB0aGUKKyAgLy8vICAgICAgICAgZ2l2ZW4gbW9kdWxlLgorICBKSVRTeW1ib2wgZmluZFN5bWJvbEluKFZNb2R1bGVLZXkgSywgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5KSB7CisgICAgcmV0dXJuIEJhc2VMYXllci5maW5kU3ltYm9sSW4oSywgTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSk7CisgIH0KKworICAvLy8gQGJyaWVmIEltbWVkaWF0ZWx5IGVtaXQgYW5kIGZpbmFsaXplIHRoZSBtb2R1bGUgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuCisgIC8vLyAgICAgICAgVk1vZHVsZUtleS4KKyAgLy8vIEBwYXJhbSBLIFRoZSBWTW9kdWxlS2V5IGZvciB0aGUgbW9kdWxlIHRvIGVtaXQvZmluYWxpemUuCisgIEVycm9yIGVtaXRBbmRGaW5hbGl6ZShWTW9kdWxlS2V5IEspIHsgcmV0dXJuIEJhc2VMYXllci5lbWl0QW5kRmluYWxpemUoSyk7IH0KKworICAvLy8gQGJyaWVmIEFjY2VzcyB0aGUgdHJhbnNmb3JtIGZ1bmN0b3IgZGlyZWN0bHkuCisgIFRyYW5zZm9ybUZ0b3ImIGdldFRyYW5zZm9ybSgpIHsgcmV0dXJuIFRyYW5zZm9ybTsgfQorCisgIC8vLyBAYnJpZWYgQWNjZXNzIHRoZSBtdW1hdGUgZnVuY3RvciBkaXJlY3RseS4KKyAgY29uc3QgVHJhbnNmb3JtRnRvciYgZ2V0VHJhbnNmb3JtKCkgY29uc3QgeyByZXR1cm4gVHJhbnNmb3JtOyB9CisKK3ByaXZhdGU6CisgIEJhc2VMYXllclQgJkJhc2VMYXllcjsKKyAgVHJhbnNmb3JtRnRvciBUcmFuc2Zvcm07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb3JjCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0lSVFJBTlNGT1JNTEFZRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0luZGlyZWN0aW9uVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9JbmRpcmVjdGlvblV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5Yjg2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9JbmRpcmVjdGlvblV0aWxzLmgKQEAgLTAsMCArMSw0NTEgQEAKKy8vPT09LSBJbmRpcmVjdGlvblV0aWxzLmggLSBVdGlsaXRpZXMgZm9yIGFkZGluZyBpbmRpcmVjdGlvbnMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ29udGFpbnMgdXRpbGl0aWVzIGZvciBhZGRpbmcgaW5kaXJlY3Rpb25zIGFuZCBicmVha2luZyB1cCBtb2R1bGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0lORElSRUNUSU9OVVRJTFNfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfSU5ESVJFQ1RJT05VVElMU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0pJVFN5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUHJvY2Vzcy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9WYWx1ZU1hcHBlci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBDb25zdGFudDsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgRnVuY3Rpb25UeXBlOworY2xhc3MgR2xvYmFsQWxpYXM7CitjbGFzcyBHbG9iYWxWYXJpYWJsZTsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFBvaW50ZXJUeXBlOworY2xhc3MgVHJpcGxlOworY2xhc3MgVmFsdWU7CisKK25hbWVzcGFjZSBvcmMgeworCisvLy8gQGJyaWVmIFRhcmdldC1pbmRlcGVuZGVudCBiYXNlIGNsYXNzIGZvciBjb21waWxlIGNhbGxiYWNrIG1hbmFnZW1lbnQuCitjbGFzcyBKSVRDb21waWxlQ2FsbGJhY2tNYW5hZ2VyIHsKK3B1YmxpYzoKKyAgdXNpbmcgQ29tcGlsZUZ0b3IgPSBzdGQ6OmZ1bmN0aW9uPEpJVFRhcmdldEFkZHJlc3MoKT47CisKKyAgLy8vIEBicmllZiBIYW5kbGUgdG8gYSBuZXdseSBjcmVhdGVkIGNvbXBpbGUgY2FsbGJhY2suIENhbiBiZSB1c2VkIHRvIGdldCBhbgorICAvLy8gICAgICAgIElSIGNvbnN0YW50IHJlcHJlc2VudGluZyB0aGUgYWRkcmVzcyBvZiB0aGUgdHJhbXBvbGluZSwgYW5kIHRvIHNldAorICAvLy8gICAgICAgIHRoZSBjb21waWxlIGFjdGlvbiBmb3IgdGhlIGNhbGxiYWNrLgorICBjbGFzcyBDb21waWxlQ2FsbGJhY2tJbmZvIHsKKyAgcHVibGljOgorICAgIENvbXBpbGVDYWxsYmFja0luZm8oSklUVGFyZ2V0QWRkcmVzcyBBZGRyLCBDb21waWxlRnRvciAmQ29tcGlsZSkKKyAgICAgICAgOiBBZGRyKEFkZHIpLCBDb21waWxlKENvbXBpbGUpIHt9CisKKyAgICBKSVRUYXJnZXRBZGRyZXNzIGdldEFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBBZGRyOyB9CisgICAgdm9pZCBzZXRDb21waWxlQWN0aW9uKENvbXBpbGVGdG9yIENvbXBpbGUpIHsKKyAgICAgIHRoaXMtPkNvbXBpbGUgPSBzdGQ6Om1vdmUoQ29tcGlsZSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgSklUVGFyZ2V0QWRkcmVzcyBBZGRyOworICAgIENvbXBpbGVGdG9yICZDb21waWxlOworICB9OworCisgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGEgSklUQ29tcGlsZUNhbGxiYWNrTWFuYWdlci4KKyAgLy8vIEBwYXJhbSBFcnJvckhhbmRsZXJBZGRyZXNzIFRoZSBhZGRyZXNzIG9mIGFuIGVycm9yIGhhbmRsZXIgaW4gdGhlIHRhcmdldAorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyB0byBiZSB1c2VkIGlmIGEgY29tcGlsZSBjYWxsYmFjayBmYWlscy4KKyAgSklUQ29tcGlsZUNhbGxiYWNrTWFuYWdlcihKSVRUYXJnZXRBZGRyZXNzIEVycm9ySGFuZGxlckFkZHJlc3MpCisgICAgICA6IEVycm9ySGFuZGxlckFkZHJlc3MoRXJyb3JIYW5kbGVyQWRkcmVzcykge30KKworICB2aXJ0dWFsIH5KSVRDb21waWxlQ2FsbGJhY2tNYW5hZ2VyKCkgPSBkZWZhdWx0OworCisgIC8vLyBAYnJpZWYgRXhlY3V0ZSB0aGUgY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiB0cmFtcG9saW5lIGlkLiBDYWxsZWQgYnkgdGhlIEpJVAorICAvLy8gICAgICAgIHRvIGNvbXBpbGUgZnVuY3Rpb25zIG9uIGRlbWFuZC4KKyAgSklUVGFyZ2V0QWRkcmVzcyBleGVjdXRlQ29tcGlsZUNhbGxiYWNrKEpJVFRhcmdldEFkZHJlc3MgVHJhbXBvbGluZUFkZHIpIHsKKyAgICBhdXRvIEkgPSBBY3RpdmVUcmFtcG9saW5lcy5maW5kKFRyYW1wb2xpbmVBZGRyKTsKKyAgICAvLyBGSVhNRTogQWxzbyByYWlzZSBhbiBlcnJvciBpbiB0aGUgT3JjIGVycm9yLWhhbmRsZXIgd2hlbiB3ZSBmaW5hbGx5IGhhdmUKKyAgICAvLyAgICAgICAgb25lLgorICAgIGlmIChJID09IEFjdGl2ZVRyYW1wb2xpbmVzLmVuZCgpKQorICAgICAgcmV0dXJuIEVycm9ySGFuZGxlckFkZHJlc3M7CisKKyAgICAvLyBGb3VuZCBhIGNhbGxiYWNrIGhhbmRsZXIuIFlhbmsgdGhpcyB0cmFtcG9saW5lIG91dCBvZiB0aGUgYWN0aXZlIGxpc3QgYW5kCisgICAgLy8gcHV0IGl0IGJhY2sgaW4gdGhlIGF2YWlsYWJsZSB0cmFtcG9saW5lcyBsaXN0LCB0aGVuIHRyeSB0byBydW4gdGhlCisgICAgLy8gaGFuZGxlcidzIGNvbXBpbGUgYW5kIHVwZGF0ZSBhY3Rpb25zLgorICAgIC8vIE1vdmluZyB0aGUgdHJhbXBvbGluZSBJRCBiYWNrIHRvIHRoZSBhdmFpbGFibGUgbGlzdCBmaXJzdCBtZWFucyB0aGVyZSdzCisgICAgLy8gYXQKKyAgICAvLyBsZWFzdCBvbmUgYXZhaWxhYmxlIHRyYW1wb2xpbmUgaWYgdGhlIGNvbXBpbGUgYWN0aW9uIHRyaWdnZXJzIGEgcmVxdWVzdAorICAgIC8vIGZvcgorICAgIC8vIGEgbmV3IG9uZS4KKyAgICBhdXRvIENvbXBpbGUgPSBzdGQ6Om1vdmUoSS0+c2Vjb25kKTsKKyAgICBBY3RpdmVUcmFtcG9saW5lcy5lcmFzZShJKTsKKyAgICBBdmFpbGFibGVUcmFtcG9saW5lcy5wdXNoX2JhY2soVHJhbXBvbGluZUFkZHIpOworCisgICAgaWYgKGF1dG8gQWRkciA9IENvbXBpbGUoKSkKKyAgICAgIHJldHVybiBBZGRyOworCisgICAgcmV0dXJuIEVycm9ySGFuZGxlckFkZHJlc3M7CisgIH0KKworICAvLy8gQGJyaWVmIFJlc2VydmUgYSBjb21waWxlIGNhbGxiYWNrLgorICBFeHBlY3RlZDxDb21waWxlQ2FsbGJhY2tJbmZvPiBnZXRDb21waWxlQ2FsbGJhY2soKSB7CisgICAgaWYgKGF1dG8gVHJhbXBvbGluZUFkZHJPckVyciA9IGdldEF2YWlsYWJsZVRyYW1wb2xpbmVBZGRyKCkpIHsKKyAgICAgIGNvbnN0IGF1dG8gJlRyYW1wb2xpbmVBZGRyID0gKlRyYW1wb2xpbmVBZGRyT3JFcnI7CisgICAgICBhdXRvICZDb21waWxlID0gdGhpcy0+QWN0aXZlVHJhbXBvbGluZXNbVHJhbXBvbGluZUFkZHJdOworICAgICAgcmV0dXJuIENvbXBpbGVDYWxsYmFja0luZm8oVHJhbXBvbGluZUFkZHIsIENvbXBpbGUpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIFRyYW1wb2xpbmVBZGRyT3JFcnIudGFrZUVycm9yKCk7CisgIH0KKworICAvLy8gQGJyaWVmIEdldCBhIENvbXBpbGVDYWxsYmFja0luZm8gZm9yIGFuIGV4aXN0aW5nIGNhbGxiYWNrLgorICBDb21waWxlQ2FsbGJhY2tJbmZvIGdldENvbXBpbGVDYWxsYmFja0luZm8oSklUVGFyZ2V0QWRkcmVzcyBUcmFtcG9saW5lQWRkcikgeworICAgIGF1dG8gSSA9IEFjdGl2ZVRyYW1wb2xpbmVzLmZpbmQoVHJhbXBvbGluZUFkZHIpOworICAgIGFzc2VydChJICE9IEFjdGl2ZVRyYW1wb2xpbmVzLmVuZCgpICYmICJOb3QgYW4gYWN0aXZlIHRyYW1wb2xpbmUuIik7CisgICAgcmV0dXJuIENvbXBpbGVDYWxsYmFja0luZm8oSS0+Zmlyc3QsIEktPnNlY29uZCk7CisgIH0KKworICAvLy8gQGJyaWVmIFJlbGVhc2UgYSBjb21waWxlIGNhbGxiYWNrLgorICAvLy8KKyAgLy8vICAgTm90ZTogQ2FsbGJhY2tzIGFyZSBhdXRvLXJlbGVhc2VkIGFmdGVyIHRoZXkgZXhlY3V0ZS4gVGhpcyBtZXRob2Qgc2hvdWxkCisgIC8vLyBvbmx5IGJlIGNhbGxlZCB0byBtYW51YWxseSByZWxlYXNlIGEgY2FsbGJhY2sgdGhhdCBpcyBub3QgZ29pbmcgdG8KKyAgLy8vIGV4ZWN1dGUuCisgIHZvaWQgcmVsZWFzZUNvbXBpbGVDYWxsYmFjayhKSVRUYXJnZXRBZGRyZXNzIFRyYW1wb2xpbmVBZGRyKSB7CisgICAgYXV0byBJID0gQWN0aXZlVHJhbXBvbGluZXMuZmluZChUcmFtcG9saW5lQWRkcik7CisgICAgYXNzZXJ0KEkgIT0gQWN0aXZlVHJhbXBvbGluZXMuZW5kKCkgJiYgIk5vdCBhbiBhY3RpdmUgdHJhbXBvbGluZS4iKTsKKyAgICBBY3RpdmVUcmFtcG9saW5lcy5lcmFzZShJKTsKKyAgICBBdmFpbGFibGVUcmFtcG9saW5lcy5wdXNoX2JhY2soVHJhbXBvbGluZUFkZHIpOworICB9CisKK3Byb3RlY3RlZDoKKyAgSklUVGFyZ2V0QWRkcmVzcyBFcnJvckhhbmRsZXJBZGRyZXNzOworCisgIHVzaW5nIFRyYW1wb2xpbmVNYXBUID0gc3RkOjptYXA8SklUVGFyZ2V0QWRkcmVzcywgQ29tcGlsZUZ0b3I+OworICBUcmFtcG9saW5lTWFwVCBBY3RpdmVUcmFtcG9saW5lczsKKyAgc3RkOjp2ZWN0b3I8SklUVGFyZ2V0QWRkcmVzcz4gQXZhaWxhYmxlVHJhbXBvbGluZXM7CisKK3ByaXZhdGU6CisgIEV4cGVjdGVkPEpJVFRhcmdldEFkZHJlc3M+IGdldEF2YWlsYWJsZVRyYW1wb2xpbmVBZGRyKCkgeworICAgIGlmICh0aGlzLT5BdmFpbGFibGVUcmFtcG9saW5lcy5lbXB0eSgpKQorICAgICAgaWYgKGF1dG8gRXJyID0gZ3JvdygpKQorICAgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisgICAgYXNzZXJ0KCF0aGlzLT5BdmFpbGFibGVUcmFtcG9saW5lcy5lbXB0eSgpICYmCisgICAgICAgICAgICJGYWlsZWQgdG8gZ3JvdyBhdmFpbGFibGUgdHJhbXBvbGluZXMuIik7CisgICAgSklUVGFyZ2V0QWRkcmVzcyBUcmFtcG9saW5lQWRkciA9IHRoaXMtPkF2YWlsYWJsZVRyYW1wb2xpbmVzLmJhY2soKTsKKyAgICB0aGlzLT5BdmFpbGFibGVUcmFtcG9saW5lcy5wb3BfYmFjaygpOworICAgIHJldHVybiBUcmFtcG9saW5lQWRkcjsKKyAgfQorCisgIC8vIENyZWF0ZSBuZXcgdHJhbXBvbGluZXMgLSB0byBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzLgorICB2aXJ0dWFsIEVycm9yIGdyb3coKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworfTsKKworLy8vIEBicmllZiBNYW5hZ2UgY29tcGlsZSBjYWxsYmFja3MgZm9yIGluLXByb2Nlc3MgSklUcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUYXJnZXRUPgorY2xhc3MgTG9jYWxKSVRDb21waWxlQ2FsbGJhY2tNYW5hZ2VyIDogcHVibGljIEpJVENvbXBpbGVDYWxsYmFja01hbmFnZXIgeworcHVibGljOgorICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhIEluUHJvY2Vzc0pJVENvbXBpbGVDYWxsYmFja01hbmFnZXIuCisgIC8vLyBAcGFyYW0gRXJyb3JIYW5kbGVyQWRkcmVzcyBUaGUgYWRkcmVzcyBvZiBhbiBlcnJvciBoYW5kbGVyIGluIHRoZSB0YXJnZXQKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgdG8gYmUgdXNlZCBpZiBhIGNvbXBpbGUgY2FsbGJhY2sgZmFpbHMuCisgIExvY2FsSklUQ29tcGlsZUNhbGxiYWNrTWFuYWdlcihKSVRUYXJnZXRBZGRyZXNzIEVycm9ySGFuZGxlckFkZHJlc3MpCisgICAgICA6IEpJVENvbXBpbGVDYWxsYmFja01hbmFnZXIoRXJyb3JIYW5kbGVyQWRkcmVzcykgeworICAgIC8vLyBTZXQgdXAgdGhlIHJlc29sdmVyIGJsb2NrLgorICAgIHN0ZDo6ZXJyb3JfY29kZSBFQzsKKyAgICBSZXNvbHZlckJsb2NrID0gc3lzOjpPd25pbmdNZW1vcnlCbG9jayhzeXM6Ok1lbW9yeTo6YWxsb2NhdGVNYXBwZWRNZW1vcnkoCisgICAgICAgIFRhcmdldFQ6OlJlc29sdmVyQ29kZVNpemUsIG51bGxwdHIsCisgICAgICAgIHN5czo6TWVtb3J5OjpNRl9SRUFEIHwgc3lzOjpNZW1vcnk6Ok1GX1dSSVRFLCBFQykpOworICAgIGFzc2VydCghRUMgJiYgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXNvbHZlciBibG9jayIpOworCisgICAgVGFyZ2V0VDo6d3JpdGVSZXNvbHZlckNvZGUoc3RhdGljX2Nhc3Q8dWludDhfdCAqPihSZXNvbHZlckJsb2NrLmJhc2UoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZW50ZXIsIHRoaXMpOworCisgICAgRUMgPSBzeXM6Ok1lbW9yeTo6cHJvdGVjdE1hcHBlZE1lbW9yeShSZXNvbHZlckJsb2NrLmdldE1lbW9yeUJsb2NrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXM6Ok1lbW9yeTo6TUZfUkVBRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzOjpNZW1vcnk6Ok1GX0VYRUMpOworICAgIGFzc2VydCghRUMgJiYgIkZhaWxlZCB0byBtcHJvdGVjdCByZXNvbHZlciBibG9jayIpOworICB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyBKSVRUYXJnZXRBZGRyZXNzIHJlZW50ZXIodm9pZCAqQ0NNZ3IsIHZvaWQgKlRyYW1wb2xpbmVJZCkgeworICAgIEpJVENvbXBpbGVDYWxsYmFja01hbmFnZXIgKk1nciA9CisgICAgICAgIHN0YXRpY19jYXN0PEpJVENvbXBpbGVDYWxsYmFja01hbmFnZXIgKj4oQ0NNZ3IpOworICAgIHJldHVybiBNZ3ItPmV4ZWN1dGVDb21waWxlQ2FsbGJhY2soCisgICAgICAgIHN0YXRpY19jYXN0PEpJVFRhcmdldEFkZHJlc3M+KAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFRyYW1wb2xpbmVJZCkpKTsKKyAgfQorCisgIEVycm9yIGdyb3coKSBvdmVycmlkZSB7CisgICAgYXNzZXJ0KHRoaXMtPkF2YWlsYWJsZVRyYW1wb2xpbmVzLmVtcHR5KCkgJiYgIkdyb3dpbmcgcHJlbWF0dXJlbHk/Iik7CisKKyAgICBzdGQ6OmVycm9yX2NvZGUgRUM7CisgICAgYXV0byBUcmFtcG9saW5lQmxvY2sgPQorICAgICAgICBzeXM6Ok93bmluZ01lbW9yeUJsb2NrKHN5czo6TWVtb3J5OjphbGxvY2F0ZU1hcHBlZE1lbW9yeSgKKyAgICAgICAgICAgIHN5czo6UHJvY2Vzczo6Z2V0UGFnZVNpemUoKSwgbnVsbHB0ciwKKyAgICAgICAgICAgIHN5czo6TWVtb3J5OjpNRl9SRUFEIHwgc3lzOjpNZW1vcnk6Ok1GX1dSSVRFLCBFQykpOworICAgIGlmIChFQykKKyAgICAgIHJldHVybiBlcnJvckNvZGVUb0Vycm9yKEVDKTsKKworICAgIHVuc2lnbmVkIE51bVRyYW1wb2xpbmVzID0KKyAgICAgICAgKHN5czo6UHJvY2Vzczo6Z2V0UGFnZVNpemUoKSAtIFRhcmdldFQ6OlBvaW50ZXJTaXplKSAvCisgICAgICAgIFRhcmdldFQ6OlRyYW1wb2xpbmVTaXplOworCisgICAgdWludDhfdCAqVHJhbXBvbGluZU1lbSA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oVHJhbXBvbGluZUJsb2NrLmJhc2UoKSk7CisgICAgVGFyZ2V0VDo6d3JpdGVUcmFtcG9saW5lcyhUcmFtcG9saW5lTWVtLCBSZXNvbHZlckJsb2NrLmJhc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVRyYW1wb2xpbmVzKTsKKworICAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgPCBOdW1UcmFtcG9saW5lczsgKytJKQorICAgICAgdGhpcy0+QXZhaWxhYmxlVHJhbXBvbGluZXMucHVzaF9iYWNrKAorICAgICAgICAgIHN0YXRpY19jYXN0PEpJVFRhcmdldEFkZHJlc3M+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PigKKyAgICAgICAgICAgICAgVHJhbXBvbGluZU1lbSArIChJICogVGFyZ2V0VDo6VHJhbXBvbGluZVNpemUpKSkpOworCisgICAgaWYgKGF1dG8gRUMgPSBzeXM6Ok1lbW9yeTo6cHJvdGVjdE1hcHBlZE1lbW9yeSgKKyAgICAgICAgICAgICAgICAgICAgVHJhbXBvbGluZUJsb2NrLmdldE1lbW9yeUJsb2NrKCksCisgICAgICAgICAgICAgICAgICAgIHN5czo6TWVtb3J5OjpNRl9SRUFEIHwgc3lzOjpNZW1vcnk6Ok1GX0VYRUMpKQorICAgICAgcmV0dXJuIGVycm9yQ29kZVRvRXJyb3IoRUMpOworCisgICAgVHJhbXBvbGluZUJsb2Nrcy5wdXNoX2JhY2soc3RkOjptb3ZlKFRyYW1wb2xpbmVCbG9jaykpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgc3lzOjpPd25pbmdNZW1vcnlCbG9jayBSZXNvbHZlckJsb2NrOworICBzdGQ6OnZlY3RvcjxzeXM6Ok93bmluZ01lbW9yeUJsb2NrPiBUcmFtcG9saW5lQmxvY2tzOworfTsKKworLy8vIEBicmllZiBCYXNlIGNsYXNzIGZvciBtYW5hZ2luZyBjb2xsZWN0aW9ucyBvZiBuYW1lZCBpbmRpcmVjdCBzdHVicy4KK2NsYXNzIEluZGlyZWN0U3R1YnNNYW5hZ2VyIHsKK3B1YmxpYzoKKyAgLy8vIEBicmllZiBNYXAgdHlwZSBmb3IgaW5pdGlhbGl6aW5nIHRoZSBtYW5hZ2VyLiBTZWUgaW5pdC4KKyAgdXNpbmcgU3R1YkluaXRzTWFwID0gU3RyaW5nTWFwPHN0ZDo6cGFpcjxKSVRUYXJnZXRBZGRyZXNzLCBKSVRTeW1ib2xGbGFncz4+OworCisgIHZpcnR1YWwgfkluZGlyZWN0U3R1YnNNYW5hZ2VyKCkgPSBkZWZhdWx0OworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgc2luZ2xlIHN0dWIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgdGFyZ2V0IGFkZHJlc3MgYW5kIGZsYWdzLgorICB2aXJ0dWFsIEVycm9yIGNyZWF0ZVN0dWIoU3RyaW5nUmVmIFN0dWJOYW1lLCBKSVRUYXJnZXRBZGRyZXNzIFN0dWJBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUU3ltYm9sRmxhZ3MgU3R1YkZsYWdzKSA9IDA7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgU3R1YkluaXRzLnNpemUoKSBzdHVicyB3aXRoIHRoZSBnaXZlbiBuYW1lcywgdGFyZ2V0CisgIC8vLyAgICAgICAgYWRkcmVzc2VzLCBhbmQgZmxhZ3MuCisgIHZpcnR1YWwgRXJyb3IgY3JlYXRlU3R1YnMoY29uc3QgU3R1YkluaXRzTWFwICZTdHViSW5pdHMpID0gMDsKKworICAvLy8gQGJyaWVmIEZpbmQgdGhlIHN0dWIgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gSWYgRXhwb3J0ZWRTdHVic09ubHkgaXMgdHJ1ZSwKKyAgLy8vICAgICAgICB0aGlzIHdpbGwgb25seSByZXR1cm4gYSByZXN1bHQgaWYgdGhlIHN0dWIncyBmbGFncyBpbmRpY2F0ZSB0aGF0IGl0CisgIC8vLyAgICAgICAgaXMgZXhwb3J0ZWQuCisgIHZpcnR1YWwgSklUU3ltYm9sIGZpbmRTdHViKFN0cmluZ1JlZiBOYW1lLCBib29sIEV4cG9ydGVkU3R1YnNPbmx5KSA9IDA7CisKKyAgLy8vIEBicmllZiBGaW5kIHRoZSBpbXBsZW1lbnRhdGlvbi1wb2ludGVyIGZvciB0aGUgc3R1Yi4KKyAgdmlydHVhbCBKSVRTeW1ib2wgZmluZFBvaW50ZXIoU3RyaW5nUmVmIE5hbWUpID0gMDsKKworICAvLy8gQGJyaWVmIENoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIHBvaW50ZXIgZm9yIHRoZSBzdHViLgorICB2aXJ0dWFsIEVycm9yIHVwZGF0ZVBvaW50ZXIoU3RyaW5nUmVmIE5hbWUsIEpJVFRhcmdldEFkZHJlc3MgTmV3QWRkcikgPSAwOworCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7Cit9OworCisvLy8gQGJyaWVmIEluZGlyZWN0U3R1YnNNYW5hZ2VyIGltcGxlbWVudGF0aW9uIGZvciB0aGUgaG9zdCBhcmNoaXRlY3R1cmUsIGUuZy4KKy8vLyAgICAgICAgT3JjWDg2XzY0LiAoU2VlIE9yY0FyY2hpdGVjdHVyZVN1cHBvcnQuaCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGFyZ2V0VD4KK2NsYXNzIExvY2FsSW5kaXJlY3RTdHVic01hbmFnZXIgOiBwdWJsaWMgSW5kaXJlY3RTdHVic01hbmFnZXIgeworcHVibGljOgorICBFcnJvciBjcmVhdGVTdHViKFN0cmluZ1JlZiBTdHViTmFtZSwgSklUVGFyZ2V0QWRkcmVzcyBTdHViQWRkciwKKyAgICAgICAgICAgICAgICAgICBKSVRTeW1ib2xGbGFncyBTdHViRmxhZ3MpIG92ZXJyaWRlIHsKKyAgICBpZiAoYXV0byBFcnIgPSByZXNlcnZlU3R1YnMoMSkpCisgICAgICByZXR1cm4gRXJyOworCisgICAgY3JlYXRlU3R1YkludGVybmFsKFN0dWJOYW1lLCBTdHViQWRkciwgU3R1YkZsYWdzKTsKKworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgY3JlYXRlU3R1YnMoY29uc3QgU3R1YkluaXRzTWFwICZTdHViSW5pdHMpIG92ZXJyaWRlIHsKKyAgICBpZiAoYXV0byBFcnIgPSByZXNlcnZlU3R1YnMoU3R1YkluaXRzLnNpemUoKSkpCisgICAgICByZXR1cm4gRXJyOworCisgICAgZm9yIChhdXRvICZFbnRyeSA6IFN0dWJJbml0cykKKyAgICAgIGNyZWF0ZVN0dWJJbnRlcm5hbChFbnRyeS5maXJzdCgpLCBFbnRyeS5zZWNvbmQuZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnkuc2Vjb25kLnNlY29uZCk7CisKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEpJVFN5bWJvbCBmaW5kU3R1YihTdHJpbmdSZWYgTmFtZSwgYm9vbCBFeHBvcnRlZFN0dWJzT25seSkgb3ZlcnJpZGUgeworICAgIGF1dG8gSSA9IFN0dWJJbmRleGVzLmZpbmQoTmFtZSk7CisgICAgaWYgKEkgPT0gU3R1YkluZGV4ZXMuZW5kKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBhdXRvIEtleSA9IEktPnNlY29uZC5maXJzdDsKKyAgICB2b2lkICpTdHViQWRkciA9IEluZGlyZWN0U3R1YnNJbmZvc1tLZXkuZmlyc3RdLmdldFN0dWIoS2V5LnNlY29uZCk7CisgICAgYXNzZXJ0KFN0dWJBZGRyICYmICJNaXNzaW5nIHN0dWIgYWRkcmVzcyIpOworICAgIGF1dG8gU3R1YlRhcmdldEFkZHIgPQorICAgICAgICBzdGF0aWNfY2FzdDxKSVRUYXJnZXRBZGRyZXNzPihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oU3R1YkFkZHIpKTsKKyAgICBhdXRvIFN0dWJTeW1ib2wgPSBKSVRTeW1ib2woU3R1YlRhcmdldEFkZHIsIEktPnNlY29uZC5zZWNvbmQpOworICAgIGlmIChFeHBvcnRlZFN0dWJzT25seSAmJiAhU3R1YlN5bWJvbC5nZXRGbGFncygpLmlzRXhwb3J0ZWQoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBTdHViU3ltYm9sOworICB9CisKKyAgSklUU3ltYm9sIGZpbmRQb2ludGVyKFN0cmluZ1JlZiBOYW1lKSBvdmVycmlkZSB7CisgICAgYXV0byBJID0gU3R1YkluZGV4ZXMuZmluZChOYW1lKTsKKyAgICBpZiAoSSA9PSBTdHViSW5kZXhlcy5lbmQoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIGF1dG8gS2V5ID0gSS0+c2Vjb25kLmZpcnN0OworICAgIHZvaWQgKlB0ckFkZHIgPSBJbmRpcmVjdFN0dWJzSW5mb3NbS2V5LmZpcnN0XS5nZXRQdHIoS2V5LnNlY29uZCk7CisgICAgYXNzZXJ0KFB0ckFkZHIgJiYgIk1pc3NpbmcgcG9pbnRlciBhZGRyZXNzIik7CisgICAgYXV0byBQdHJUYXJnZXRBZGRyID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8SklUVGFyZ2V0QWRkcmVzcz4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFB0ckFkZHIpKTsKKyAgICByZXR1cm4gSklUU3ltYm9sKFB0clRhcmdldEFkZHIsIEktPnNlY29uZC5zZWNvbmQpOworICB9CisKKyAgRXJyb3IgdXBkYXRlUG9pbnRlcihTdHJpbmdSZWYgTmFtZSwgSklUVGFyZ2V0QWRkcmVzcyBOZXdBZGRyKSBvdmVycmlkZSB7CisgICAgYXV0byBJID0gU3R1YkluZGV4ZXMuZmluZChOYW1lKTsKKyAgICBhc3NlcnQoSSAhPSBTdHViSW5kZXhlcy5lbmQoKSAmJiAiTm8gc3R1YiBwb2ludGVyIGZvciBzeW1ib2wiKTsKKyAgICBhdXRvIEtleSA9IEktPnNlY29uZC5maXJzdDsKKyAgICAqSW5kaXJlY3RTdHVic0luZm9zW0tleS5maXJzdF0uZ2V0UHRyKEtleS5zZWNvbmQpID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oTmV3QWRkcikpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKK3ByaXZhdGU6CisgIEVycm9yIHJlc2VydmVTdHVicyh1bnNpZ25lZCBOdW1TdHVicykgeworICAgIGlmIChOdW1TdHVicyA8PSBGcmVlU3R1YnMuc2l6ZSgpKQorICAgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisKKyAgICB1bnNpZ25lZCBOZXdTdHVic1JlcXVpcmVkID0gTnVtU3R1YnMgLSBGcmVlU3R1YnMuc2l6ZSgpOworICAgIHVuc2lnbmVkIE5ld0Jsb2NrSWQgPSBJbmRpcmVjdFN0dWJzSW5mb3Muc2l6ZSgpOworICAgIHR5cGVuYW1lIFRhcmdldFQ6OkluZGlyZWN0U3R1YnNJbmZvIElTSTsKKyAgICBpZiAoYXV0byBFcnIgPQorICAgICAgICAgICAgVGFyZ2V0VDo6ZW1pdEluZGlyZWN0U3R1YnNCbG9jayhJU0ksIE5ld1N0dWJzUmVxdWlyZWQsIG51bGxwdHIpKQorICAgICAgcmV0dXJuIEVycjsKKyAgICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJIDwgSVNJLmdldE51bVN0dWJzKCk7ICsrSSkKKyAgICAgIEZyZWVTdHVicy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoTmV3QmxvY2tJZCwgSSkpOworICAgIEluZGlyZWN0U3R1YnNJbmZvcy5wdXNoX2JhY2soc3RkOjptb3ZlKElTSSkpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgdm9pZCBjcmVhdGVTdHViSW50ZXJuYWwoU3RyaW5nUmVmIFN0dWJOYW1lLCBKSVRUYXJnZXRBZGRyZXNzIEluaXRBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRTeW1ib2xGbGFncyBTdHViRmxhZ3MpIHsKKyAgICBhdXRvIEtleSA9IEZyZWVTdHVicy5iYWNrKCk7CisgICAgRnJlZVN0dWJzLnBvcF9iYWNrKCk7CisgICAgKkluZGlyZWN0U3R1YnNJbmZvc1tLZXkuZmlyc3RdLmdldFB0cihLZXkuc2Vjb25kKSA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KEluaXRBZGRyKSk7CisgICAgU3R1YkluZGV4ZXNbU3R1Yk5hbWVdID0gc3RkOjptYWtlX3BhaXIoS2V5LCBTdHViRmxhZ3MpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8dHlwZW5hbWUgVGFyZ2V0VDo6SW5kaXJlY3RTdHVic0luZm8+IEluZGlyZWN0U3R1YnNJbmZvczsKKyAgdXNpbmcgU3R1YktleSA9IHN0ZDo6cGFpcjx1aW50MTZfdCwgdWludDE2X3Q+OworICBzdGQ6OnZlY3RvcjxTdHViS2V5PiBGcmVlU3R1YnM7CisgIFN0cmluZ01hcDxzdGQ6OnBhaXI8U3R1YktleSwgSklUU3ltYm9sRmxhZ3M+PiBTdHViSW5kZXhlczsKK307CisKKy8vLyBAYnJpZWYgQ3JlYXRlIGEgbG9jYWwgY29tcGlsZSBjYWxsYmFjayBtYW5hZ2VyLgorLy8vCisvLy8gVGhlIGdpdmVuIHRhcmdldCB0cmlwbGUgd2lsbCBkZXRlcm1pbmUgdGhlIEFCSSwgYW5kIHRoZSBnaXZlbgorLy8vIEVycm9ySGFuZGxlckFkZHJlc3Mgd2lsbCBiZSB1c2VkIGJ5IHRoZSByZXN1bHRpbmcgY29tcGlsZSBjYWxsYmFjaworLy8vIG1hbmFnZXIgaWYgYSBjb21waWxlIGNhbGxiYWNrIGZhaWxzLgorc3RkOjp1bmlxdWVfcHRyPEpJVENvbXBpbGVDYWxsYmFja01hbmFnZXI+CitjcmVhdGVMb2NhbENvbXBpbGVDYWxsYmFja01hbmFnZXIoY29uc3QgVHJpcGxlICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVFRhcmdldEFkZHJlc3MgRXJyb3JIYW5kbGVyQWRkcmVzcyk7CisKKy8vLyBAYnJpZWYgQ3JlYXRlIGEgbG9jYWwgaW5kcmllY3Qgc3R1YnMgbWFuYWdlciBidWlsZGVyLgorLy8vCisvLy8gVGhlIGdpdmVuIHRhcmdldCB0cmlwbGUgd2lsbCBkZXRlcm1pbmUgdGhlIEFCSS4KK3N0ZDo6ZnVuY3Rpb248c3RkOjp1bmlxdWVfcHRyPEluZGlyZWN0U3R1YnNNYW5hZ2VyPigpPgorY3JlYXRlTG9jYWxJbmRpcmVjdFN0dWJzTWFuYWdlckJ1aWxkZXIoY29uc3QgVHJpcGxlICZUKTsKKworLy8vIEBicmllZiBCdWlsZCBhIGZ1bmN0aW9uIHBvaW50ZXIgb2YgRnVuY3Rpb25UeXBlIHdpdGggdGhlIGdpdmVuIGNvbnN0YW50CisvLy8gICAgICAgIGFkZHJlc3MuCisvLy8KKy8vLyAgIFVzYWdlIGV4YW1wbGU6IFR1cm4gYSB0cmFtcG9saW5lIGFkZHJlc3MgaW50byBhIGZ1bmN0aW9uIHBvaW50ZXIgY29uc3RhbnQKKy8vLyBmb3IgdXNlIGluIGEgc3R1Yi4KK0NvbnN0YW50ICpjcmVhdGVJUlR5cGVkQWRkcmVzcyhGdW5jdGlvblR5cGUgJkZULCBKSVRUYXJnZXRBZGRyZXNzIEFkZHIpOworCisvLy8gQGJyaWVmIENyZWF0ZSBhIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCB0aGUgZ2l2ZW4gdHlwZSwgbmFtZSwgYW5kIGluaXRpYWxpemVyCisvLy8gICAgICAgIGluIHRoZSBnaXZlbiBNb2R1bGUuCitHbG9iYWxWYXJpYWJsZSAqY3JlYXRlSW1wbFBvaW50ZXIoUG9pbnRlclR5cGUgJlBULCBNb2R1bGUgJk0sIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpJbml0aWFsaXplcik7CisKKy8vLyBAYnJpZWYgVHVybiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGludG8gYSBzdHViIGZ1bmN0aW9uIHRoYXQgbWFrZXMgYW4KKy8vLyAgICAgICAgaW5kaXJlY3QgY2FsbCB1c2luZyB0aGUgZ2l2ZW4gZnVuY3Rpb24gcG9pbnRlci4KK3ZvaWQgbWFrZVN0dWIoRnVuY3Rpb24gJkYsIFZhbHVlICZJbXBsUG9pbnRlcik7CisKKy8vLyBAYnJpZWYgUmFpc2UgbGlua2FnZSB0eXBlcyBhbmQgcmVuYW1lIGFzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCBhbGwKKy8vLyAgICAgICAgc3ltYm9scyBhcmUgYWNjZXNzaWJsZSBmb3Igb3RoZXIgbW9kdWxlcy4KKy8vLworLy8vICAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBwYXJ0aXRpb25pbmcgYSBtb2R1bGUgdG8gZW5zdXJlIHRoYXQgdGhlCisvLy8gcGFydGl0aW9ucyByZXRhaW4gYWNjZXNzIHRvIGVhY2ggb3RoZXIncyBzeW1ib2xzLgordm9pZCBtYWtlQWxsU3ltYm9sc0V4dGVybmFsbHlBY2Nlc3NpYmxlKE1vZHVsZSAmTSk7CisKKy8vLyBAYnJpZWYgQ2xvbmUgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpbnRvIGEgbmV3IG1vZHVsZS4KKy8vLworLy8vICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBhcyB0aGUgZmlyc3Qgc3RlcCB0b3dhcmRzIGNyZWF0aW5nIGEgY2FsbGJhY2sKKy8vLyBzdHViIChzZWUgbWFrZVN0dWIpLCBvciBtb3ZpbmcgYSBmdW5jdGlvbiBib2R5IChzZWUgbW92ZUZ1bmN0aW9uQm9keSkuCisvLy8KKy8vLyAgIElmIHRoZSBWTWFwIGFyZ3VtZW50IGlzIG5vbi1udWxsLCBhIG1hcHBpbmcgd2lsbCBiZSBhZGRlZCBiZXR3ZWVuIEYgYW5kCisvLy8gdGhlIG5ldyBkZWNsYXJhdGlvbiwgYW5kIGJldHdlZW4gZWFjaCBvZiBGJ3MgYXJndW1lbnRzIGFuZCB0aGUgbmV3CisvLy8gZGVjbGFyYXRpb24ncyBhcmd1bWVudHMuIFRoaXMgbWFwIGNhbiB0aGVuIGJlIHBhc3NlZCBpbiB0byBtb3ZlRnVuY3Rpb24gdG8KKy8vLyBtb3ZlIHRoZSBmdW5jdGlvbiBib2R5IGlmIHJlcXVpcmVkLiBOb3RlOiBXaGVuIG1vdmluZyBmdW5jdGlvbnMgYmV0d2VlbgorLy8vIG1vZHVsZXMgd2l0aCB0aGVzZSB1dGlsaXRpZXMsIGFsbCBkZWNscyBzaG91bGQgYmUgY2xvbmVkIChhbmQgYWRkZWQgdG8gYQorLy8vIHNpbmdsZSBWTWFwKSBiZWZvcmUgYW55IGJvZGllcyBhcmUgbW92ZWQuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCByZWZlcmVuY2VzCisvLy8gYmV0d2VlbiBmdW5jdGlvbnMgYWxsIHJlZmVyIHRvIHRoZSB2ZXJzaW9ucyBpbiB0aGUgbmV3IG1vZHVsZS4KK0Z1bmN0aW9uICpjbG9uZUZ1bmN0aW9uRGVjbChNb2R1bGUgJkRzdCwgY29uc3QgRnVuY3Rpb24gJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVUb1ZhbHVlTWFwVHkgKlZNYXAgPSBudWxscHRyKTsKKworLy8vIEBicmllZiBNb3ZlIHRoZSBib2R5IG9mIGZ1bmN0aW9uICdGJyB0byBhIGNsb25lZCBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpbiBhCisvLy8gICAgICAgIGRpZmZlcmVudCBtb2R1bGUgKFNlZSByZWxhdGVkIGNsb25lRnVuY3Rpb25EZWNsKS4KKy8vLworLy8vICAgSWYgdGhlIHRhcmdldCBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpcyBub3Qgc3VwcGxpZWQgdmlhIHRoZSBOZXdGIHBhcmFtZXRlcgorLy8vIHRoZW4gaXQgd2lsbCBiZSBsb29rZWQgdXAgdmlhIHRoZSBWTWFwLgorLy8vCisvLy8gICBUaGlzIHdpbGwgZGVsZXRlIHRoZSBib2R5IG9mIGZ1bmN0aW9uICdGJyBmcm9tIGl0cyBvcmlnaW5hbCBwYXJlbnQgbW9kdWxlLAorLy8vIGJ1dCBsZWF2ZSBpdHMgZGVjbGFyYXRpb24uCit2b2lkIG1vdmVGdW5jdGlvbkJvZHkoRnVuY3Rpb24gJk9yaWdGLCBWYWx1ZVRvVmFsdWVNYXBUeSAmVk1hcCwKKyAgICAgICAgICAgICAgICAgICAgICBWYWx1ZU1hdGVyaWFsaXplciAqTWF0ZXJpYWxpemVyID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiAqTmV3RiA9IG51bGxwdHIpOworCisvLy8gQGJyaWVmIENsb25lIGEgZ2xvYmFsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGludG8gYSBuZXcgbW9kdWxlLgorR2xvYmFsVmFyaWFibGUgKmNsb25lR2xvYmFsVmFyaWFibGVEZWNsKE1vZHVsZSAmRHN0LCBjb25zdCBHbG9iYWxWYXJpYWJsZSAmR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVUb1ZhbHVlTWFwVHkgKlZNYXAgPSBudWxscHRyKTsKKworLy8vIEBicmllZiBNb3ZlIGdsb2JhbCB2YXJpYWJsZSBHViBmcm9tIGl0cyBwYXJlbnQgbW9kdWxlIHRvIGNsb25lZCBnbG9iYWwKKy8vLyAgICAgICAgZGVjbGFyYXRpb24gaW4gYSBkaWZmZXJlbnQgbW9kdWxlLgorLy8vCisvLy8gICBJZiB0aGUgdGFyZ2V0IGdsb2JhbCBkZWNsYXJhdGlvbiBpcyBub3Qgc3VwcGxpZWQgdmlhIHRoZSBOZXdHViBwYXJhbWV0ZXIKKy8vLyB0aGVuIGl0IHdpbGwgYmUgbG9va2VkIHVwIHZpYSB0aGUgVk1hcC4KKy8vLworLy8vICAgVGhpcyB3aWxsIGRlbGV0ZSB0aGUgaW5pdGlhbGl6ZXIgb2YgR1YgZnJvbSBpdHMgb3JpZ2luYWwgcGFyZW50IG1vZHVsZSwKKy8vLyBidXQgbGVhdmUgaXRzIGRlY2xhcmF0aW9uLgordm9pZCBtb3ZlR2xvYmFsVmFyaWFibGVJbml0aWFsaXplcihHbG9iYWxWYXJpYWJsZSAmT3JpZ0dWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVRvVmFsdWVNYXBUeSAmVk1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVNYXRlcmlhbGl6ZXIgKk1hdGVyaWFsaXplciA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhcmlhYmxlICpOZXdHViA9IG51bGxwdHIpOworCisvLy8gQGJyaWVmIENsb25lIGEgZ2xvYmFsIGFsaWFzIGRlY2xhcmF0aW9uIGludG8gYSBuZXcgbW9kdWxlLgorR2xvYmFsQWxpYXMgKmNsb25lR2xvYmFsQWxpYXNEZWNsKE1vZHVsZSAmRHN0LCBjb25zdCBHbG9iYWxBbGlhcyAmT3JpZ0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVUb1ZhbHVlTWFwVHkgJlZNYXApOworCisvLy8gQGJyaWVmIENsb25lIG1vZHVsZSBmbGFncyBtZXRhZGF0YSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBtb2R1bGUuCit2b2lkIGNsb25lTW9kdWxlRmxhZ3NNZXRhZGF0YShNb2R1bGUgJkRzdCwgY29uc3QgTW9kdWxlICZTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVRvVmFsdWVNYXBUeSAmVk1hcCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvcmMKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19JTkRJUkVDVElPTlVUSUxTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9MYW1iZGFSZXNvbHZlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0xhbWJkYVJlc29sdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2ZjNkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9MYW1iZGFSZXNvbHZlci5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vPT09LSBMYW1iZGFSZXNvbHZlck1NIC0gUmVkaXJlY3Qgc3ltYm9sIGxvb2t1cCB2aWEgYSBmdW5jdG9yIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICBEZWZpbmVzIGEgUnVudGltZUR5bGQ6OlN5bWJvbFJlc29sdmVyIHN1YmNsYXNzIHRoYXQgdXNlcyBhIHVzZXItc3VwcGxpZWQKKy8vIGZ1bmN0b3IgZm9yIHN5bWJvbCByZXNvbHV0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0xBTUJEQVJFU09MVkVSX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0xBTUJEQVJFU09MVkVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0pJVFN5bWJvbC5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9yYyB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEeWxpYkxvb2t1cEZ0b3JULCB0eXBlbmFtZSBFeHRlcm5hbExvb2t1cEZ0b3JUPgorY2xhc3MgTGFtYmRhUmVzb2x2ZXIgOiBwdWJsaWMgTGVnYWN5SklUU3ltYm9sUmVzb2x2ZXIgeworcHVibGljOgorICBMYW1iZGFSZXNvbHZlcihEeWxpYkxvb2t1cEZ0b3JUIER5bGliTG9va3VwRnRvciwKKyAgICAgICAgICAgICAgICAgRXh0ZXJuYWxMb29rdXBGdG9yVCBFeHRlcm5hbExvb2t1cEZ0b3IpCisgICAgICA6IER5bGliTG9va3VwRnRvcihEeWxpYkxvb2t1cEZ0b3IpLAorICAgICAgICBFeHRlcm5hbExvb2t1cEZ0b3IoRXh0ZXJuYWxMb29rdXBGdG9yKSB7fQorCisgIEpJVFN5bWJvbCBmaW5kU3ltYm9sSW5Mb2dpY2FsRHlsaWIoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIGZpbmFsIHsKKyAgICByZXR1cm4gRHlsaWJMb29rdXBGdG9yKE5hbWUpOworICB9CisKKyAgSklUU3ltYm9sIGZpbmRTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIGZpbmFsIHsKKyAgICByZXR1cm4gRXh0ZXJuYWxMb29rdXBGdG9yKE5hbWUpOworICB9CisKK3ByaXZhdGU6CisgIER5bGliTG9va3VwRnRvclQgRHlsaWJMb29rdXBGdG9yOworICBFeHRlcm5hbExvb2t1cEZ0b3JUIEV4dGVybmFsTG9va3VwRnRvcjsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEeWxpYkxvb2t1cEZ0b3JULAorICAgICAgICAgIHR5cGVuYW1lIEV4dGVybmFsTG9va3VwRnRvclQ+CitzdGQ6OnNoYXJlZF9wdHI8TGFtYmRhUmVzb2x2ZXI8RHlsaWJMb29rdXBGdG9yVCwgRXh0ZXJuYWxMb29rdXBGdG9yVD4+CitjcmVhdGVMYW1iZGFSZXNvbHZlcihEeWxpYkxvb2t1cEZ0b3JUIER5bGliTG9va3VwRnRvciwKKyAgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsTG9va3VwRnRvclQgRXh0ZXJuYWxMb29rdXBGdG9yKSB7CisgIHVzaW5nIExSID0gTGFtYmRhUmVzb2x2ZXI8RHlsaWJMb29rdXBGdG9yVCwgRXh0ZXJuYWxMb29rdXBGdG9yVD47CisgIHJldHVybiBtYWtlX3VuaXF1ZTxMUj4oc3RkOjptb3ZlKER5bGliTG9va3VwRnRvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKEV4dGVybmFsTG9va3VwRnRvcikpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2Ugb3JjCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0xBTUJEQVJFU09MVkVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9MYXp5RW1pdHRpbmdMYXllci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0xhenlFbWl0dGluZ0xheWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExN2E5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9MYXp5RW1pdHRpbmdMYXllci5oCkBAIC0wLDAgKzEsMjYxIEBACisvLz09PS0gTGF6eUVtaXR0aW5nTGF5ZXIuaCAtIExhemlseSBlbWl0IElSIHRvIGxvd2VyIEpJVCBsYXllcnMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENvbnRhaW5zIHRoZSBkZWZpbml0aW9uIGZvciBhIGxhenktZW1pdHRpbmcgbGF5ZXIgZm9yIHRoZSBKSVQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfTEFaWUVNSVRUSU5HTEFZRVJfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfTEFaWUVNSVRUSU5HTEFZRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0NvcmUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9NYW5nbGVyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9yYyB7CisKKy8vLyBAYnJpZWYgTGF6eS1lbWl0dGluZyBJUiBsYXllci4KKy8vLworLy8vICAgVGhpcyBsYXllciBhY2NlcHRzIExMVk0gSVIgTW9kdWxlcyAodmlhIGFkZE1vZHVsZSksIGJ1dCBkb2VzIG5vdAorLy8vIGltbWVkaWF0ZWx5IGVtaXQgdGhlbSB0aGUgbGF5ZXIgYmVsb3cuIEluc3RlYWQsIGVtaXNzaW5nIHRvIHRoZSBiYXNlIGxheWVyCisvLy8gaXMgZGVmZXJyZWQgdW50aWwgdGhlIGZpcnN0IHRpbWUgdGhlIGNsaWVudCByZXF1ZXN0cyB0aGUgYWRkcmVzcyAodmlhCisvLy8gSklUU3ltYm9sOjpnZXRBZGRyZXNzKSBmb3IgYSBzeW1ib2wgY29udGFpbmVkIGluIHRoaXMgbGF5ZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmFzZUxheWVyVD4gY2xhc3MgTGF6eUVtaXR0aW5nTGF5ZXIgeworcHJpdmF0ZToKKyAgY2xhc3MgRW1pc3Npb25EZWZlcnJlZE1vZHVsZSB7CisgIHB1YmxpYzoKKyAgICBFbWlzc2lvbkRlZmVycmVkTW9kdWxlKFZNb2R1bGVLZXkgSywgc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gTSkKKyAgICAgICAgOiBLKHN0ZDo6bW92ZShLKSksIE0oc3RkOjptb3ZlKE0pKSB7fQorCisgICAgSklUU3ltYm9sIGZpbmQoU3RyaW5nUmVmIE5hbWUsIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSwgQmFzZUxheWVyVCAmQikgeworICAgICAgc3dpdGNoIChFbWl0U3RhdGUpIHsKKyAgICAgIGNhc2UgTm90RW1pdHRlZDoKKyAgICAgICAgaWYgKGF1dG8gR1YgPSBzZWFyY2hHVnMoTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSkpIHsKKyAgICAgICAgICAvLyBDcmVhdGUgYSBzdGQ6OnN0cmluZyB2ZXJzaW9uIG9mIE5hbWUgdG8gY2FwdHVyZSBoZXJlIC0gdGhlIGFyZ3VtZW50CisgICAgICAgICAgLy8gKGEgU3RyaW5nUmVmKSBtYXkgZ28gYXdheSBiZWZvcmUgdGhlIGxhbWJkYSBpcyBleGVjdXRlZC4KKyAgICAgICAgICAvLyBGSVhNRTogVXNlIGNhcHR1cmUtaW5pdCB3aGVuIHdlIG1vdmUgdG8gQysrMTQuCisgICAgICAgICAgc3RkOjpzdHJpbmcgUE5hbWUgPSBOYW1lOworICAgICAgICAgIEpJVFN5bWJvbEZsYWdzIEZsYWdzID0gSklUU3ltYm9sRmxhZ3M6OmZyb21HbG9iYWxWYWx1ZSgqR1YpOworICAgICAgICAgIGF1dG8gR2V0QWRkcmVzcyA9CisgICAgICAgICAgICBbdGhpcywgRXhwb3J0ZWRTeW1ib2xzT25seSwgUE5hbWUsICZCXSgpIC0+IEV4cGVjdGVkPEpJVFRhcmdldEFkZHJlc3M+IHsKKyAgICAgICAgICAgICAgaWYgKHRoaXMtPkVtaXRTdGF0ZSA9PSBFbWl0dGluZykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy0+RW1pdFN0YXRlID09IE5vdEVtaXR0ZWQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLT5FbWl0U3RhdGUgPSBFbWl0dGluZzsKKyAgICAgICAgICAgICAgICBpZiAoYXV0byBFcnIgPSB0aGlzLT5lbWl0VG9CYXNlTGF5ZXIoQikpCisgICAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisgICAgICAgICAgICAgICAgdGhpcy0+RW1pdFN0YXRlID0gRW1pdHRlZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoYXV0byBTeW0gPSBCLmZpbmRTeW1ib2xJbihLLCBQTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFN5bS5nZXRBZGRyZXNzKCk7CisgICAgICAgICAgICAgIGVsc2UgaWYgKGF1dG8gRXJyID0gU3ltLnRha2VFcnJvcigpKQorICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlN1Y2Nlc3NmdWwgc3ltYm9sIGxvb2t1cCBzaG91bGQgcmV0dXJuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZpbml0aW9uIGFkZHJlc3MgaGVyZSIpOworICAgICAgICAgIH07CisgICAgICAgICAgcmV0dXJuIEpJVFN5bWJvbChzdGQ6Om1vdmUoR2V0QWRkcmVzcyksIEZsYWdzKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICBjYXNlIEVtaXR0aW5nOgorICAgICAgICAvLyBDYWxsaW5nICJlbWl0IiBjYW4gdHJpZ2dlciBhIHJlY3Vyc2l2ZSBjYWxsIHRvICdmaW5kJyAoZS5nLiB0byBjaGVjaworICAgICAgICAvLyBmb3IgcHJlLWV4aXN0aW5nIGRlZmluaXRpb25zIG9mIGNvbW1vbi1zeW1ib2wpLCBidXQgYW55IHN5bWJvbCBpbgorICAgICAgICAvLyB0aGlzIG1vZHVsZSB3b3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBmb3VuZCBpbnRlcm5hbGx5IChpbiB0aGUKKyAgICAgICAgLy8gUnVudGltZUR5bGQgdGhhdCBkaWQgdGhlIGxvb2t1cCksIHNvIGp1c3QgcmV0dXJuIGEgbnVsbHB0ciBoZXJlLgorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGNhc2UgRW1pdHRlZDoKKyAgICAgICAgcmV0dXJuIEIuZmluZFN5bWJvbEluKEssIE5hbWUsIEV4cG9ydGVkU3ltYm9sc09ubHkpOworICAgICAgfQorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBlbWl0LXN0YXRlLiIpOworICAgIH0KKworICAgIEVycm9yIHJlbW92ZU1vZHVsZUZyb21CYXNlTGF5ZXIoQmFzZUxheWVyVCYgQmFzZUxheWVyKSB7CisgICAgICByZXR1cm4gRW1pdFN0YXRlICE9IE5vdEVtaXR0ZWQgPyBCYXNlTGF5ZXIucmVtb3ZlTW9kdWxlKEspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFcnJvcjo6c3VjY2VzcygpOworICAgIH0KKworICAgIHZvaWQgZW1pdEFuZEZpbmFsaXplKEJhc2VMYXllclQgJkJhc2VMYXllcikgeworICAgICAgYXNzZXJ0KEVtaXRTdGF0ZSAhPSBFbWl0dGluZyAmJgorICAgICAgICAgICAgICJDYW5ub3QgZW1pdEFuZEZpbmFsaXplIHdoaWxlIGFscmVhZHkgZW1pdHRpbmciKTsKKyAgICAgIGlmIChFbWl0U3RhdGUgPT0gTm90RW1pdHRlZCkgeworICAgICAgICBFbWl0U3RhdGUgPSBFbWl0dGluZzsKKyAgICAgICAgZW1pdFRvQmFzZUxheWVyKEJhc2VMYXllcik7CisgICAgICAgIEVtaXRTdGF0ZSA9IEVtaXR0ZWQ7CisgICAgICB9CisgICAgICBCYXNlTGF5ZXIuZW1pdEFuZEZpbmFsaXplKEspOworICAgIH0KKworICBwcml2YXRlOgorCisgICAgY29uc3QgR2xvYmFsVmFsdWUqIHNlYXJjaEdWcyhTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSkgY29uc3QgeworICAgICAgLy8gRklYTUU6IFdlIGNvdWxkIGNsZWFuIGFsbCB0aGlzIHVwIGlmIHdlIGhhZCBhIHdheSB0byByZWxpYWJseSBkZW1hbmdsZQorICAgICAgLy8gICAgICAgIG5hbWVzOiBXZSBjb3VsZCBqdXN0IGRlbWFuZ2xlIG5hbWUgYW5kIHNlYXJjaCwgcmF0aGVyIHRoYW4KKyAgICAgIC8vICAgICAgICBtYW5nbGluZyBldmVyeXRoaW5nIGVsc2UuCisKKyAgICAgIC8vIElmIHdlIGhhdmUgYWxyZWFkeSBidWlsdCB0aGUgbWFuZ2xlZCBuYW1lIHNldCB0aGVuIGp1c3Qgc2VhcmNoIGl0LgorICAgICAgaWYgKE1hbmdsZWRTeW1ib2xzKSB7CisgICAgICAgIGF1dG8gVkkgPSBNYW5nbGVkU3ltYm9scy0+ZmluZChOYW1lKTsKKyAgICAgICAgaWYgKFZJID09IE1hbmdsZWRTeW1ib2xzLT5lbmQoKSkKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgYXV0byBHViA9IFZJLT5zZWNvbmQ7CisgICAgICAgIGlmICghRXhwb3J0ZWRTeW1ib2xzT25seSB8fCBHVi0+aGFzRGVmYXVsdFZpc2liaWxpdHkoKSkKKyAgICAgICAgICByZXR1cm4gR1Y7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgfQorCisgICAgICAvLyBJZiB3ZSBoYXZlbid0IGJ1aWx0IHRoZSBtYW5nbGVkIG5hbWUgc2V0IHlldCwgdHJ5IHRvIGJ1aWxkIGl0LiBBcyBhbgorICAgICAgLy8gb3B0aW1pemF0aW9uIHRoaXMgd2lsbCBsZWF2ZSBNYW5nbGVkTmFtZXMgc2V0IHRvIG51bGxwdHIgaWYgd2UgZmluZAorICAgICAgLy8gTmFtZSBpbiB0aGUgcHJvY2VzcyBvZiBidWlsZGluZyB0aGUgc2V0LgorICAgICAgcmV0dXJuIGJ1aWxkTWFuZ2xlZFN5bWJvbHMoTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSk7CisgICAgfQorCisgICAgRXJyb3IgZW1pdFRvQmFzZUxheWVyKEJhc2VMYXllclQgJkJhc2VMYXllcikgeworICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0aGUgbWFuZ2xlZCBuYW1lcyBzZXQgYW55IG1vcmU6IE9uY2Ugd2UndmUgZW1pdHRlZCB0aGlzCisgICAgICAvLyB0byB0aGUgYmFzZSBsYXllciB3ZSdsbCBqdXN0IGxvb2sgZm9yIHN5bWJvbHMgdGhlcmUuCisgICAgICBNYW5nbGVkU3ltYm9scy5yZXNldCgpOworICAgICAgcmV0dXJuIEJhc2VMYXllci5hZGRNb2R1bGUoc3RkOjptb3ZlKEspLCBzdGQ6Om1vdmUoTSkpOworICAgIH0KKworICAgIC8vIElmIHRoZSBtYW5nbGVkIG5hbWUgb2YgdGhlIGdpdmVuIEdsb2JhbFZhbHVlIG1hdGNoZXMgdGhlIGdpdmVuIHNlYXJjaAorICAgIC8vIG5hbWUgKGFuZCBpdHMgdmlzaWJpbGl0eSBjb25mb3JtcyB0byB0aGUgRXhwb3J0ZWRTeW1ib2xzT25seSBmbGFnKSB0aGVuCisgICAgLy8gcmV0dXJuIHRoZSBzeW1ib2wuIE90aGVyd2lzZSwgYWRkIHRoZSBtYW5nbGVkIG5hbWUgdG8gdGhlIE5hbWVzIG1hcCBhbmQKKyAgICAvLyByZXR1cm4gbnVsbHB0ci4KKyAgICBjb25zdCBHbG9iYWxWYWx1ZSogYWRkR2xvYmFsVmFsdWUoU3RyaW5nTWFwPGNvbnN0IEdsb2JhbFZhbHVlKj4gJk5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHbG9iYWxWYWx1ZSAmR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hbmdsZXIgJk1hbmcsIFN0cmluZ1JlZiBTZWFyY2hOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEV4cG9ydGVkU3ltYm9sc09ubHkpIGNvbnN0IHsKKyAgICAgIC8vIE1vZHVsZXMgZG9uJ3QgInByb3ZpZGUiIGRlY2xzIG9yIGNvbW1vbiBzeW1ib2xzLgorICAgICAgaWYgKEdWLmlzRGVjbGFyYXRpb24oKSB8fCBHVi5oYXNDb21tb25MaW5rYWdlKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAvLyBNYW5nbGUgdGhlIEdWIG5hbWUuCisgICAgICBzdGQ6OnN0cmluZyBNYW5nbGVkTmFtZTsKKyAgICAgIHsKKyAgICAgICAgcmF3X3N0cmluZ19vc3RyZWFtIE1hbmdsZWROYW1lU3RyZWFtKE1hbmdsZWROYW1lKTsKKyAgICAgICAgTWFuZy5nZXROYW1lV2l0aFByZWZpeChNYW5nbGVkTmFtZVN0cmVhbSwgJkdWLCBmYWxzZSk7CisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBpcyB0aGUgbmFtZSB3ZSB3ZXJlIHNlYXJjaGluZyBmb3IsIGFuZCBpZiBpdCBpcyB0aGVuCisgICAgICAvLyBiYWlsIG91dCBlYXJseS4KKyAgICAgIGlmIChNYW5nbGVkTmFtZSA9PSBTZWFyY2hOYW1lKQorICAgICAgICBpZiAoIUV4cG9ydGVkU3ltYm9sc09ubHkgfHwgR1YuaGFzRGVmYXVsdFZpc2liaWxpdHkoKSkKKyAgICAgICAgICByZXR1cm4gJkdWOworCisgICAgICAvLyBPdGhlcndpc2UgYWRkIHRoaXMgdG8gdGhlIG1hcCBmb3IgbGF0ZXIuCisgICAgICBOYW1lc1tNYW5nbGVkTmFtZV0gPSAmR1Y7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyBCdWlsZCB0aGUgTWFuZ2xlZFN5bWJvbHMgbWFwLiBCYWlscyBvdXQgZWFybHkgKHdpdGggTWFuZ2xlZFN5bWJvbHMgbGVmdCBzZXQKKyAgICAvLyB0byBudWxscHRyKSBpZiB0aGUgZ2l2ZW4gU2VhcmNoTmFtZSBpcyBmb3VuZCB3aGlsZSBidWlsZGluZyB0aGUgbWFwLgorICAgIGNvbnN0IEdsb2JhbFZhbHVlKiBidWlsZE1hbmdsZWRTeW1ib2xzKFN0cmluZ1JlZiBTZWFyY2hOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSkgY29uc3QgeworICAgICAgYXNzZXJ0KCFNYW5nbGVkU3ltYm9scyAmJiAiTWFuZ2xlZCBzeW1ib2xzIG1hcCBhbHJlYWR5IGV4aXN0cz8iKTsKKworICAgICAgYXV0byBTeW1ib2xzID0gbGx2bTo6bWFrZV91bmlxdWU8U3RyaW5nTWFwPGNvbnN0IEdsb2JhbFZhbHVlKj4+KCk7CisKKyAgICAgIE1hbmdsZXIgTWFuZzsKKworICAgICAgZm9yIChjb25zdCBhdXRvICZHTyA6IE0tPmdsb2JhbF9vYmplY3RzKCkpCisgICAgICAgICAgaWYgKGF1dG8gR1YgPSBhZGRHbG9iYWxWYWx1ZSgqU3ltYm9scywgR08sIE1hbmcsIFNlYXJjaE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBvcnRlZFN5bWJvbHNPbmx5KSkKKyAgICAgICAgICAgIHJldHVybiBHVjsKKworICAgICAgTWFuZ2xlZFN5bWJvbHMgPSBzdGQ6Om1vdmUoU3ltYm9scyk7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBlbnVtIHsgTm90RW1pdHRlZCwgRW1pdHRpbmcsIEVtaXR0ZWQgfSBFbWl0U3RhdGUgPSBOb3RFbWl0dGVkOworICAgIFZNb2R1bGVLZXkgSzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNOworICAgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPFN0cmluZ01hcDxjb25zdCBHbG9iYWxWYWx1ZSo+PiBNYW5nbGVkU3ltYm9sczsKKyAgfTsKKworICBCYXNlTGF5ZXJUICZCYXNlTGF5ZXI7CisgIHN0ZDo6bWFwPFZNb2R1bGVLZXksIHN0ZDo6dW5pcXVlX3B0cjxFbWlzc2lvbkRlZmVycmVkTW9kdWxlPj4gTW9kdWxlTWFwOworCitwdWJsaWM6CisKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3QgYSBsYXp5IGVtaXR0aW5nIGxheWVyLgorICBMYXp5RW1pdHRpbmdMYXllcihCYXNlTGF5ZXJUICZCYXNlTGF5ZXIpIDogQmFzZUxheWVyKEJhc2VMYXllcikge30KKworICAvLy8gQGJyaWVmIEFkZCB0aGUgZ2l2ZW4gbW9kdWxlIHRvIHRoZSBsYXp5IGVtaXR0aW5nIGxheWVyLgorICBFcnJvciBhZGRNb2R1bGUoVk1vZHVsZUtleSBLLCBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNKSB7CisgICAgYXNzZXJ0KCFNb2R1bGVNYXAuY291bnQoSykgJiYgIlZNb2R1bGVLZXkgSyBhbHJlYWR5IGluIHVzZSIpOworICAgIE1vZHVsZU1hcFtLXSA9CisgICAgICAgIGxsdm06Om1ha2VfdW5pcXVlPEVtaXNzaW9uRGVmZXJyZWRNb2R1bGU+KHN0ZDo6bW92ZShLKSwgc3RkOjptb3ZlKE0pKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgUmVtb3ZlIHRoZSBtb2R1bGUgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIGhhbmRsZS4KKyAgLy8vCisgIC8vLyAgIFRoaXMgbWV0aG9kIHdpbGwgZnJlZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbW9kdWxlLCBib3RoCisgIC8vLyBpbiB0aGlzIGxheWVyLCBhbmQgdGhlIGJhc2UgbGF5ZXIuCisgIEVycm9yIHJlbW92ZU1vZHVsZShWTW9kdWxlS2V5IEspIHsKKyAgICBhdXRvIEkgPSBNb2R1bGVNYXAuZmluZChLKTsKKyAgICBhc3NlcnQoSSAhPSBNb2R1bGVNYXAuZW5kKCkgJiYgIlZNb2R1bGVLZXkgSyBub3QgdmFsaWQgaGVyZSIpOworICAgIGF1dG8gRURNID0gc3RkOjptb3ZlKEkuc2Vjb25kKTsKKyAgICBNb2R1bGVNYXAuZXJhc2UoSSk7CisgICAgcmV0dXJuIEVETS0+cmVtb3ZlTW9kdWxlRnJvbUJhc2VMYXllcihCYXNlTGF5ZXIpOworICB9CisKKyAgLy8vIEBicmllZiBTZWFyY2ggZm9yIHRoZSBnaXZlbiBuYW1lZCBzeW1ib2wuCisgIC8vLyBAcGFyYW0gTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIHNlYXJjaCBmb3IuCisgIC8vLyBAcGFyYW0gRXhwb3J0ZWRTeW1ib2xzT25seSBJZiB0cnVlLCBzZWFyY2ggb25seSBmb3IgZXhwb3J0ZWQgc3ltYm9scy4KKyAgLy8vIEByZXR1cm4gQSBoYW5kbGUgZm9yIHRoZSBnaXZlbiBuYW1lZCBzeW1ib2wsIGlmIGl0IGV4aXN0cy4KKyAgSklUU3ltYm9sIGZpbmRTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSkgeworICAgIC8vIExvb2sgZm9yIHRoZSBzeW1ib2wgYW1vbmcgZXhpc3RpbmcgZGVmaW5pdGlvbnMuCisgICAgaWYgKGF1dG8gU3ltYm9sID0gQmFzZUxheWVyLmZpbmRTeW1ib2woTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSkpCisgICAgICByZXR1cm4gU3ltYm9sOworCisgICAgLy8gSWYgbm90IGZvdW5kIHRoZW4gc2VhcmNoIHRoZSBkZWZlcnJlZCBtb2R1bGVzLiBJZiBhbnkgb2YgdGhlc2UgY29udGFpbiBhCisgICAgLy8gZGVmaW5pdGlvbiBvZiAnTmFtZScgdGhlbiB0aGV5IHdpbGwgcmV0dXJuIGEgSklUU3ltYm9sIHRoYXQgd2lsbCBlbWl0CisgICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlIHdoZW4gdGhlIHN5bWJvbCBhZGRyZXNzIGlzIHJlcXVlc3RlZC4KKyAgICBmb3IgKGF1dG8gJktWIDogTW9kdWxlTWFwKQorICAgICAgaWYgKGF1dG8gU3ltYm9sID0gS1Yuc2Vjb25kLT5maW5kKE5hbWUsIEV4cG9ydGVkU3ltYm9sc09ubHksIEJhc2VMYXllcikpCisgICAgICAgIHJldHVybiBTeW1ib2w7CisKKyAgICAvLyBJZiBubyBkZWZpbml0aW9uIGZvdW5kIGFueXdoZXJlIHJldHVybiBhIG51bGwgc3ltYm9sLgorICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGdpdmVuIHN5bWJvbCBpbiB0aGUgY29udGV4dCBvZiB0aGUgb2YKKyAgLy8vICAgICAgICBjb21waWxlZCBtb2R1bGVzIHJlcHJlc2VudGVkIGJ5IHRoZSBrZXkgSy4KKyAgSklUU3ltYm9sIGZpbmRTeW1ib2xJbihWTW9kdWxlS2V5IEssIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSkgeworICAgIGFzc2VydChNb2R1bGVNYXAuY291bnQoSykgJiYgIlZNb2R1bGVLZXkgSyBub3QgdmFsaWQgaGVyZSIpOworICAgIHJldHVybiBNb2R1bGVNYXBbS10tPmZpbmQoTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSwgQmFzZUxheWVyKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgSW1tZWRpYXRlbHkgZW1pdCBhbmQgZmluYWxpemUgdGhlIG1vZHVsZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4KKyAgLy8vICAgICAgICBrZXkuCisgIEVycm9yIGVtaXRBbmRGaW5hbGl6ZShWTW9kdWxlS2V5IEspIHsKKyAgICBhc3NlcnQoTW9kdWxlTWFwLmNvdW50KEspICYmICJWTW9kdWxlS2V5IEsgbm90IHZhbGlkIGhlcmUiKTsKKyAgICByZXR1cm4gTW9kdWxlTWFwW0tdLT5lbWl0QW5kRmluYWxpemUoQmFzZUxheWVyKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9yYworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19MQVpZRU1JVFRJTkdMQVlFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvTGVnYWN5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvTGVnYWN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiMzg5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9MZWdhY3kuaApAQCAtMCwwICsxLDEzOCBAQAorLy89PT0tLS0gTGVnYWN5LmggLS0gQWRhcHRlcnMgZm9yIEV4ZWN1dGlvbkVuZ2luZSBBUEkgaW50ZXJvcCAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDb250YWlucyBjb3JlIE9SQyBBUElzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0xFR0FDWV9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19MRUdBQ1lfSAorCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0NvcmUuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9yYyB7CisKK2NsYXNzIEpJVFN5bWJvbFJlc29sdmVyQWRhcHRlciA6IHB1YmxpYyBKSVRTeW1ib2xSZXNvbHZlciB7CitwdWJsaWM6CisgIEpJVFN5bWJvbFJlc29sdmVyQWRhcHRlcihFeGVjdXRpb25TZXNzaW9uICZFUywgU3ltYm9sUmVzb2x2ZXIgJlIpOworICBFeHBlY3RlZDxMb29rdXBGbGFnc1Jlc3VsdD4gbG9va3VwRmxhZ3MoY29uc3QgTG9va3VwU2V0ICZTeW1ib2xzKSBvdmVycmlkZTsKKyAgRXhwZWN0ZWQ8TG9va3VwUmVzdWx0PiBsb29rdXAoY29uc3QgTG9va3VwU2V0ICZTeW1ib2xzKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgRXhlY3V0aW9uU2Vzc2lvbiAmRVM7CisgIHN0ZDo6c2V0PFN5bWJvbFN0cmluZ1B0cj4gUmVzb2x2ZWRTdHJpbmdzOworICBTeW1ib2xSZXNvbHZlciAmUjsKK307CisKKy8vLyBAYnJpZWYgVXNlIHRoZSBnaXZlbiBsZWdhY3ktc3R5bGUgRmluZFN5bWJvbCBmdW5jdGlvbiAoaS5lLiBhIGZ1bmN0aW9uIHRoYXQKKy8vLyAgICAgICAgdGFrZXMgYSBjb25zdCBzdGQ6OnN0cmluZyYgb3IgU3RyaW5nUmVmIGFuZCByZXR1cm5zIGEgSklUU3ltYm9sKSB0bworLy8vICAgICAgICBmaW5kIHRoZSBmbGFncyBmb3IgZWFjaCBzeW1ib2wgaW4gU3ltYm9scyBhbmQgc3RvcmUgdGhlaXIgZmxhZ3MgaW4KKy8vLyAgICAgICAgU3ltYm9sRmxhZ3MuIElmIGFueSBKSVRTeW1ib2wgcmV0dXJuZWQgYnkgRmluZFN5bWJvbCBpcyBpbiBhbiBlcnJvcgorLy8vICAgICAgICBzdGF0ZSB0aGUgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIHRoYXQgZXJyb3IsIG90aGVyd2lzZSBpdAorLy8vICAgICAgICByZXR1cm5zIHRoZSBzZXQgb2Ygc3ltYm9scyBub3QgZm91bmQuCisvLy8KKy8vLyBVc2VmdWwgZm9yIGltcGxlbWVudGluZyBsb29rdXBGbGFncyBib2RpZXMgdGhhdCBxdWVyeSBsZWdhY3kgcmVzb2x2ZXJzLgordGVtcGxhdGUgPHR5cGVuYW1lIEZpbmRTeW1ib2xGbj4KK0V4cGVjdGVkPFN5bWJvbE5hbWVTZXQ+IGxvb2t1cEZsYWdzV2l0aExlZ2FjeUZuKFN5bWJvbEZsYWdzTWFwICZTeW1ib2xGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN5bWJvbE5hbWVTZXQgJlN5bWJvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5kU3ltYm9sRm4gRmluZFN5bWJvbCkgeworICBTeW1ib2xOYW1lU2V0IFN5bWJvbHNOb3RGb3VuZDsKKworICBmb3IgKGF1dG8gJlMgOiBTeW1ib2xzKSB7CisgICAgaWYgKEpJVFN5bWJvbCBTeW0gPSBGaW5kU3ltYm9sKCpTKSkKKyAgICAgIFN5bWJvbEZsYWdzW1NdID0gU3ltLmdldEZsYWdzKCk7CisgICAgZWxzZSBpZiAoYXV0byBFcnIgPSBTeW0udGFrZUVycm9yKCkpCisgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisgICAgZWxzZQorICAgICAgU3ltYm9sc05vdEZvdW5kLmluc2VydChTKTsKKyAgfQorCisgIHJldHVybiBTeW1ib2xzTm90Rm91bmQ7Cit9CisKKy8vLyBAYnJpZWYgVXNlIHRoZSBnaXZlbiBsZWdhY3ktc3R5bGUgRmluZFN5bWJvbCBmdW5jdGlvbiAoaS5lLiBhIGZ1bmN0aW9uIHRoYXQKKy8vLyAgICAgICAgdGFrZXMgYSBjb25zdCBzdGQ6OnN0cmluZyYgb3IgU3RyaW5nUmVmIGFuZCByZXR1cm5zIGEgSklUU3ltYm9sKSB0bworLy8vICAgICAgICBmaW5kIHRoZSBhZGRyZXNzIGFuZCBmbGFncyBmb3IgZWFjaCBzeW1ib2wgaW4gU3ltYm9scyBhbmQgc3RvcmUgdGhlCisvLy8gICAgICAgIHJlc3VsdCBpbiBRdWVyeS4gSWYgYW55IEpJVFN5bWJvbCByZXR1cm5lZCBieSBGaW5kU3ltYm9sIGlzIGluIGFuCisvLy8gICAgICAgIGVycm9yIHRoZW4gUXVlcnkuc2V0RmFpbGVkKC4uLikgaXMgY2FsbGVkIHdpdGggdGhhdCBlcnJvciBhbmQgdGhlCisvLy8gICAgICAgIGZ1bmN0aW9uIHJldHVybnMgaW1tZWRpYXRlbHkuIE9uIHN1Y2Nlc3MsIHJldHVybnMgdGhlIHNldCBvZiBzeW1ib2xzCisvLy8gICAgICAgIG5vdCBmb3VuZC4KKy8vLworLy8vIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIGxvb2t1cCBib2RpZXMgdGhhdCBxdWVyeSBsZWdhY3kgcmVzb2x2ZXJzLgordGVtcGxhdGUgPHR5cGVuYW1lIEZpbmRTeW1ib2xGbj4KK1N5bWJvbE5hbWVTZXQgbG9va3VwV2l0aExlZ2FjeUZuKEFzeW5jaHJvbm91c1N5bWJvbFF1ZXJ5ICZRdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN5bWJvbE5hbWVTZXQgJlN5bWJvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5kU3ltYm9sRm4gRmluZFN5bWJvbCkgeworICBTeW1ib2xOYW1lU2V0IFN5bWJvbHNOb3RGb3VuZDsKKworICBmb3IgKGF1dG8gJlMgOiBTeW1ib2xzKSB7CisgICAgaWYgKEpJVFN5bWJvbCBTeW0gPSBGaW5kU3ltYm9sKCpTKSkgeworICAgICAgaWYgKGF1dG8gQWRkciA9IFN5bS5nZXRBZGRyZXNzKCkpIHsKKyAgICAgICAgUXVlcnkuc2V0RGVmaW5pdGlvbihTLCBKSVRFdmFsdWF0ZWRTeW1ib2woKkFkZHIsIFN5bS5nZXRGbGFncygpKSk7CisgICAgICAgIFF1ZXJ5Lm5vdGlmeVN5bWJvbEZpbmFsaXplZCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUXVlcnkuc2V0RmFpbGVkKEFkZHIudGFrZUVycm9yKCkpOworICAgICAgICByZXR1cm4gU3ltYm9sTmFtZVNldCgpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXV0byBFcnIgPSBTeW0udGFrZUVycm9yKCkpIHsKKyAgICAgIFF1ZXJ5LnNldEZhaWxlZChzdGQ6Om1vdmUoRXJyKSk7CisgICAgICByZXR1cm4gU3ltYm9sTmFtZVNldCgpOworICAgIH0gZWxzZQorICAgICAgU3ltYm9sc05vdEZvdW5kLmluc2VydChTKTsKKyAgfQorCisgIHJldHVybiBTeW1ib2xzTm90Rm91bmQ7Cit9CisKKy8vLyBAYnJpZWYgQW4gT1JDIFN5bWJvbFJlc29sdmVyIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBhIGxlZ2FjeQorLy8vICAgICAgICBmaW5kU3ltYm9sLWxpa2UgZnVuY3Rpb24gdG8gcGVyZm9ybSBsb29rdXA7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTGVnYWN5TG9va3VwRm4+CitjbGFzcyBMZWdhY3lMb29rdXBGblJlc29sdmVyIGZpbmFsIDogcHVibGljIFN5bWJvbFJlc29sdmVyIHsKK3B1YmxpYzoKKyAgdXNpbmcgRXJyb3JSZXBvcnRlciA9IHN0ZDo6ZnVuY3Rpb248dm9pZChFcnJvcik+OworCisgIExlZ2FjeUxvb2t1cEZuUmVzb2x2ZXIoTGVnYWN5TG9va3VwRm4gTGVnYWN5TG9va3VwLCBFcnJvclJlcG9ydGVyIFJlcG9ydEVycm9yKQorICAgICAgOiBMZWdhY3lMb29rdXAoc3RkOjptb3ZlKExlZ2FjeUxvb2t1cCkpLAorICAgICAgICBSZXBvcnRFcnJvcihzdGQ6Om1vdmUoUmVwb3J0RXJyb3IpKSB7fQorCisgIFN5bWJvbE5hbWVTZXQgbG9va3VwRmxhZ3MoU3ltYm9sRmxhZ3NNYXAgJkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN5bWJvbE5hbWVTZXQgJlN5bWJvbHMpIGZpbmFsIHsKKyAgICBpZiAoYXV0byBSZW1haW5pbmdTeW1ib2xzID0KKyAgICAgICAgICAgIGxvb2t1cEZsYWdzV2l0aExlZ2FjeUZuKEZsYWdzLCBTeW1ib2xzLCBMZWdhY3lMb29rdXApKQorICAgICAgcmV0dXJuIHN0ZDo6bW92ZSgqUmVtYWluaW5nU3ltYm9scyk7CisgICAgZWxzZSB7CisgICAgICBSZXBvcnRFcnJvcihSZW1haW5pbmdTeW1ib2xzLnRha2VFcnJvcigpKTsKKyAgICAgIHJldHVybiBTeW1ib2xzOworICAgIH0KKyAgfQorCisgIFN5bWJvbE5hbWVTZXQgbG9va3VwKHN0ZDo6c2hhcmVkX3B0cjxBc3luY2hyb25vdXNTeW1ib2xRdWVyeT4gUXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbE5hbWVTZXQgU3ltYm9scykgZmluYWwgeworICAgIHJldHVybiBsb29rdXBXaXRoTGVnYWN5Rm4oKlF1ZXJ5LCBTeW1ib2xzLCBMZWdhY3lMb29rdXApOworICB9CisKK3ByaXZhdGU6CisgIExlZ2FjeUxvb2t1cEZuIExlZ2FjeUxvb2t1cDsKKyAgRXJyb3JSZXBvcnRlciBSZXBvcnRFcnJvcjsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMZWdhY3lMb29rdXBGbj4KK3N0ZDo6c2hhcmVkX3B0cjxMZWdhY3lMb29rdXBGblJlc29sdmVyPExlZ2FjeUxvb2t1cEZuPj4KK2NyZWF0ZUxlZ2FjeUxvb2t1cFJlc29sdmVyKExlZ2FjeUxvb2t1cEZuIExlZ2FjeUxvb2t1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChFcnJvcik+IEVycm9yUmVwb3J0ZXIpIHsKKyAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8TGVnYWN5TG9va3VwRm5SZXNvbHZlcjxMZWdhY3lMb29rdXBGbj4+KAorICAgICAgc3RkOjptb3ZlKExlZ2FjeUxvb2t1cCksIHN0ZDo6bW92ZShFcnJvclJlcG9ydGVyKSk7Cit9CisKK30gLy8gRW5kIG5hbWVzcGFjZSBvcmMKK30gLy8gRW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfTEVHQUNZX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9OdWxsUmVzb2x2ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9OdWxsUmVzb2x2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmE5Yjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL051bGxSZXNvbHZlci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vPT09LS0tLS0tIE51bGxSZXNvbHZlci5oIC0gUmVqZWN0IHN5bWJvbCBsb29rdXAgcmVxdWVzdHMgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICBEZWZpbmVzIGEgUnVudGltZUR5bGQ6OlN5bWJvbFJlc29sdmVyIHN1YmNsYXNzIHRoYXQgcmVqZWN0cyBhbGwgc3ltYm9sCisvLyByZXNvbHV0aW9uIHJlcXVlc3RzLCBmb3IgY2xpZW50cyB0aGF0IGhhdmUgbm8gY3Jvc3Mtb2JqZWN0IGZpeHVwcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19OVUxMUkVTT0xWRVJfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfTlVMTFJFU09MVkVSX0gKKworI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9Db3JlLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvUnVudGltZUR5bGQuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9yYyB7CisKK2NsYXNzIE51bGxSZXNvbHZlciA6IHB1YmxpYyBTeW1ib2xSZXNvbHZlciB7CitwdWJsaWM6CisgIFN5bWJvbE5hbWVTZXQgbG9va3VwRmxhZ3MoU3ltYm9sRmxhZ3NNYXAgJkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN5bWJvbE5hbWVTZXQgJlN5bWJvbHMpIG92ZXJyaWRlOworCisgIFN5bWJvbE5hbWVTZXQgbG9va3VwKHN0ZDo6c2hhcmVkX3B0cjxBc3luY2hyb25vdXNTeW1ib2xRdWVyeT4gUXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbE5hbWVTZXQgU3ltYm9scykgb3ZlcnJpZGU7Cit9OworCisvLy8gU3ltYm9sUmVzb2x2ZXIgaW1wbGllbWVudGF0aW9uIHRoYXQgcmVqZWN0cyBhbGwgcmVzb2x1dGlvbiByZXF1ZXN0cy4KKy8vLyBVc2VmdWwgZm9yIGNsaWVudHMgdGhhdCBoYXZlIG5vIGNyb3NzLW9iamVjdCBmaXh1cHMuCitjbGFzcyBOdWxsTGVnYWN5UmVzb2x2ZXIgOiBwdWJsaWMgTGVnYWN5SklUU3ltYm9sUmVzb2x2ZXIgeworcHVibGljOgorICBKSVRTeW1ib2wgZmluZFN5bWJvbChjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgZmluYWw7CisKKyAgSklUU3ltYm9sIGZpbmRTeW1ib2xJbkxvZ2ljYWxEeWxpYihjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgZmluYWw7Cit9OworCit9IC8vIEVuZCBuYW1lc3BhY2Ugb3JjLgorfSAvLyBFbmQgbmFtZXNwYWNlIGxsdm0uCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfTlVMTFJFU09MVkVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PYmplY3RUcmFuc2Zvcm1MYXllci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL09iamVjdFRyYW5zZm9ybUxheWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjMzkyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PYmplY3RUcmFuc2Zvcm1MYXllci5oCkBAIC0wLDAgKzEsOTcgQEAKKy8vPT09LSBPYmplY3RUcmFuc2Zvcm1MYXllci5oIC0gUnVuIGFsbCBvYmplY3RzIHRocm91Z2ggZnVuY3RvciAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gUnVuIGFsbCBvYmplY3RzIHBhc3NlZCBpbiB0aHJvdWdoIGEgdXNlciBzdXBwbGllZCBmdW5jdG9yLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX09CSkVDVFRSQU5TRk9STUxBWUVSX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX09CSkVDVFRSQU5TRk9STUxBWUVSX0gKKworI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0pJVFN5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9Db3JlLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvcmMgeworCisvLy8gQGJyaWVmIE9iamVjdCBtdXRhdGluZyBsYXllci4KKy8vLworLy8vICAgVGhpcyBsYXllciBhY2NlcHRzIHNldHMgb2YgT2JqZWN0RmlsZXMgKHZpYSBhZGRPYmplY3QpLiBJdAorLy8vIGltbWVkaWF0ZWx5IGFwcGxpZXMgdGhlIHVzZXIgc3VwcGxpZWQgZnVuY3RvciB0byBlYWNoIG9iamVjdCwgdGhlbiBhZGRzCisvLy8gdGhlIHNldCBvZiB0cmFuc2Zvcm1lZCBvYmplY3RzIHRvIHRoZSBsYXllciBiZWxvdy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBCYXNlTGF5ZXJULCB0eXBlbmFtZSBUcmFuc2Zvcm1GdG9yPgorY2xhc3MgT2JqZWN0VHJhbnNmb3JtTGF5ZXIgeworcHVibGljOgorICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhbiBPYmplY3RUcmFuc2Zvcm1MYXllciB3aXRoIHRoZSBnaXZlbiBCYXNlTGF5ZXIKKyAgT2JqZWN0VHJhbnNmb3JtTGF5ZXIoQmFzZUxheWVyVCAmQmFzZUxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1GdG9yIFRyYW5zZm9ybSA9IFRyYW5zZm9ybUZ0b3IoKSkKKyAgICAgIDogQmFzZUxheWVyKEJhc2VMYXllciksIFRyYW5zZm9ybShzdGQ6Om1vdmUoVHJhbnNmb3JtKSkge30KKworICAvLy8gQGJyaWVmIEFwcGx5IHRoZSB0cmFuc2Zvcm0gZnVuY3RvciB0byBlYWNoIG9iamVjdCBpbiB0aGUgb2JqZWN0IHNldCwgdGhlbgorICAvLy8gICAgICAgIGFkZCB0aGUgcmVzdWx0aW5nIHNldCBvZiBvYmplY3RzIHRvIHRoZSBiYXNlIGxheWVyLCBhbG9uZyB3aXRoIHRoZQorICAvLy8gICAgICAgIG1lbW9yeSBtYW5hZ2VyIGFuZCBzeW1ib2wgcmVzb2x2ZXIuCisgIC8vLworICAvLy8gQHJldHVybiBBIGhhbmRsZSBmb3IgdGhlIGFkZGVkIG9iamVjdHMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPYmplY3RQdHI+IEVycm9yIGFkZE9iamVjdChWTW9kdWxlS2V5IEssIE9iamVjdFB0ciBPYmopIHsKKyAgICByZXR1cm4gQmFzZUxheWVyLmFkZE9iamVjdChzdGQ6Om1vdmUoSyksIFRyYW5zZm9ybShzdGQ6Om1vdmUoT2JqKSkpOworICB9CisKKyAgLy8vIEBicmllZiBSZW1vdmUgdGhlIG9iamVjdCBzZXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBWTW9kdWxlS2V5IEsuCisgIEVycm9yIHJlbW92ZU9iamVjdChWTW9kdWxlS2V5IEspIHsgcmV0dXJuIEJhc2VMYXllci5yZW1vdmVPYmplY3QoSyk7IH0KKworICAvLy8gQGJyaWVmIFNlYXJjaCBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbC4KKyAgLy8vIEBwYXJhbSBOYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gc2VhcmNoIGZvci4KKyAgLy8vIEBwYXJhbSBFeHBvcnRlZFN5bWJvbHNPbmx5IElmIHRydWUsIHNlYXJjaCBvbmx5IGZvciBleHBvcnRlZCBzeW1ib2xzLgorICAvLy8gQHJldHVybiBBIGhhbmRsZSBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbCwgaWYgaXQgZXhpc3RzLgorICBKSVRTeW1ib2wgZmluZFN5bWJvbChjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5KSB7CisgICAgcmV0dXJuIEJhc2VMYXllci5maW5kU3ltYm9sKE5hbWUsIEV4cG9ydGVkU3ltYm9sc09ubHkpOworICB9CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGdpdmVuIHN5bWJvbCBpbiB0aGUgY29udGV4dCBvZiB0aGUgc2V0IG9mCisgIC8vLyAgICAgICAgb2JqZWN0cyByZXByZXNlbnRlZCBieSB0aGUgVk1vZHVsZUtleSBLLiBUaGlzIGNhbGwgaXMgZm9yd2FyZGVkIHRvCisgIC8vLyAgICAgICAgdGhlIGJhc2UgbGF5ZXIncyBpbXBsZW1lbnRhdGlvbi4KKyAgLy8vIEBwYXJhbSBLIFRoZSBWTW9kdWxlS2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0IHNldCB0byBzZWFyY2ggaW4uCisgIC8vLyBAcGFyYW0gTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIHNlYXJjaCBmb3IuCisgIC8vLyBAcGFyYW0gRXhwb3J0ZWRTeW1ib2xzT25seSBJZiB0cnVlLCBzZWFyY2ggb25seSBmb3IgZXhwb3J0ZWQgc3ltYm9scy4KKyAgLy8vIEByZXR1cm4gQSBoYW5kbGUgZm9yIHRoZSBnaXZlbiBuYW1lZCBzeW1ib2wsIGlmIGl0IGlzIGZvdW5kIGluIHRoZQorICAvLy8gICAgICAgICBnaXZlbiBvYmplY3Qgc2V0LgorICBKSVRTeW1ib2wgZmluZFN5bWJvbEluKFZNb2R1bGVLZXkgSywgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5KSB7CisgICAgcmV0dXJuIEJhc2VMYXllci5maW5kU3ltYm9sSW4oSywgTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSk7CisgIH0KKworICAvLy8gQGJyaWVmIEltbWVkaWF0ZWx5IGVtaXQgYW5kIGZpbmFsaXplIHRoZSBvYmplY3Qgc2V0IHJlcHJlc2VudGVkIGJ5IHRoZQorICAvLy8gICAgICAgIGdpdmVuIFZNb2R1bGVLZXkgSy4KKyAgRXJyb3IgZW1pdEFuZEZpbmFsaXplKFZNb2R1bGVLZXkgSykgeyByZXR1cm4gQmFzZUxheWVyLmVtaXRBbmRGaW5hbGl6ZShLKTsgfQorCisgIC8vLyBAYnJpZWYgTWFwIHNlY3Rpb24gYWRkcmVzc2VzIGZvciB0aGUgb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhlCisgIC8vLyBWTW9kdWxlS2V5IEsuCisgIHZvaWQgbWFwU2VjdGlvbkFkZHJlc3MoVk1vZHVsZUtleSBLLCBjb25zdCB2b2lkICpMb2NhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgSklUVGFyZ2V0QWRkcmVzcyBUYXJnZXRBZGRyKSB7CisgICAgQmFzZUxheWVyLm1hcFNlY3Rpb25BZGRyZXNzKEssIExvY2FsQWRkcmVzcywgVGFyZ2V0QWRkcik7CisgIH0KKworICAvLy8gQGJyaWVmIEFjY2VzcyB0aGUgdHJhbnNmb3JtIGZ1bmN0b3IgZGlyZWN0bHkuCisgIFRyYW5zZm9ybUZ0b3IgJmdldFRyYW5zZm9ybSgpIHsgcmV0dXJuIFRyYW5zZm9ybTsgfQorCisgIC8vLyBAYnJpZWYgQWNjZXNzIHRoZSBtdW1hdGUgZnVuY3RvciBkaXJlY3RseS4KKyAgY29uc3QgVHJhbnNmb3JtRnRvciAmZ2V0VHJhbnNmb3JtKCkgY29uc3QgeyByZXR1cm4gVHJhbnNmb3JtOyB9CisKK3ByaXZhdGU6CisgIEJhc2VMYXllclQgJkJhc2VMYXllcjsKKyAgVHJhbnNmb3JtRnRvciBUcmFuc2Zvcm07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb3JjCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX09CSkVDVFRSQU5TRk9STUxBWUVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PcmNBQklTdXBwb3J0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT3JjQUJJU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYjU1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT3JjQUJJU3VwcG9ydC5oCkBAIC0wLDAgKzEsMjQ0IEBACisvLz09PS0gT3JjQUJJU3VwcG9ydC5oIC0gQUJJIHN1cHBvcnQgY29kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEFCSSBzcGVjaWZpYyBjb2RlIGZvciBPcmMsIGUuZy4gY2FsbGJhY2sgYXNzZW1ibHkuCisvLworLy8gQUJJIGNsYXNzZXMgc2hvdWxkIGJlIHBhcnQgb2YgdGhlIEpJVCAqdGFyZ2V0KiBwcm9jZXNzLCBub3QgdGhlIGhvc3QKKy8vIHByb2Nlc3MgKGV4Y2VwdCB3aGVyZSB5b3UncmUgZG9pbmcgaG9zdGVkIEpJVGluZyBhbmQgdGhlIHR3byBhcmUgb25lIGFuZCB0aGUKKy8vIHNhbWUpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX09SQ0FCSVNVUFBPUlRfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfT1JDQUJJU1VQUE9SVF9ICisKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnkuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9yYyB7CisKKy8vLyBHZW5lcmljIE9SQyBBQkkgc3VwcG9ydC4KKy8vLworLy8vIFRoaXMgY2xhc3MgY2FuIGJlIHN1YnN0aXR1dGVkIGFzIHRoZSB0YXJnZXQgYXJjaGl0ZWN1cmUgc3VwcG9ydCBjbGFzcyBmb3IKKy8vLyBPUkMgdGVtcGxhdGVzIHRoYXQgcmVxdWlyZSBvbmUgKGUuZy4gSW5kaXJlY3RTdHVic01hbmFnZXJzKS4gSXQgZG9lcyBub3QKKy8vLyBzdXBwb3J0IGxhenkgSklUaW5nIGhvd2V2ZXIsIGFuZCBhbnkgYXR0ZW1wdCB0byB1c2UgdGhhdCBmdW5jdGlvbmFsaXR5CisvLy8gd2lsbCByZXN1bHQgaW4gZXhlY3V0aW9uIG9mIGFuIGxsdm1fdW5yZWFjaGFibGUuCitjbGFzcyBPcmNHZW5lcmljQUJJIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFBvaW50ZXJTaXplID0gc2l6ZW9mKHVpbnRwdHJfdCk7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBUcmFtcG9saW5lU2l6ZSA9IDE7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZXNvbHZlckNvZGVTaXplID0gMTsKKworICB1c2luZyBKSVRSZWVudHJ5Rm4gPSBKSVRUYXJnZXRBZGRyZXNzICgqKSh2b2lkICpDYWxsYmFja01nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqVHJhbXBvbGluZUlkKTsKKworICBzdGF0aWMgdm9pZCB3cml0ZVJlc29sdmVyQ29kZSh1aW50OF90ICpSZXNvbHZlTWVtLCBKSVRSZWVudHJ5Rm4gUmVlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQ2FsbGJhY2tNZ3IpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJ3cml0ZVJlc29sdmVyQ29kZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBnZW5lcmljIGhvc3QgIgorICAgICAgICAgICAgICAgICAgICAgInN1cHBvcnQgY2xhc3MiKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIHdyaXRlVHJhbXBvbGluZXModWludDhfdCAqVHJhbXBvbGluZU1lbSwgdm9pZCAqUmVzb2x2ZXJBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVRyYW1wb2xpbmVzKSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgid3JpdGVUcmFtcG9saW5lcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBnZW5lcmljIGhvc3QgIgorICAgICAgICAgICAgICAgICAgICAgInN1cHBvcnQgY2xhc3MiKTsKKyAgfQorCisgIGNsYXNzIEluZGlyZWN0U3R1YnNJbmZvIHsKKyAgcHVibGljOgorICAgIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBTdHViU2l6ZSA9IDE7CisKKyAgICB1bnNpZ25lZCBnZXROdW1TdHVicygpIGNvbnN0IHsgbGx2bV91bnJlYWNoYWJsZSgiTm90IHN1cHBvcnRlZCIpOyB9CisgICAgdm9pZCAqZ2V0U3R1Yih1bnNpZ25lZCBJZHgpIGNvbnN0IHsgbGx2bV91bnJlYWNoYWJsZSgiTm90IHN1cHBvcnRlZCIpOyB9CisgICAgdm9pZCAqKmdldFB0cih1bnNpZ25lZCBJZHgpIGNvbnN0IHsgbGx2bV91bnJlYWNoYWJsZSgiTm90IHN1cHBvcnRlZCIpOyB9CisgIH07CisKKyAgc3RhdGljIEVycm9yIGVtaXRJbmRpcmVjdFN0dWJzQmxvY2soSW5kaXJlY3RTdHVic0luZm8gJlN0dWJzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWluU3R1YnMsIHZvaWQgKkluaXRpYWxQdHJWYWwpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJlbWl0SW5kaXJlY3RTdHVic0Jsb2NrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGdlbmVyaWMgIgorICAgICAgICAgICAgICAgICAgICAgImhvc3Qgc3VwcG9ydCBjbGFzcyIpOworICB9Cit9OworCisvLy8gQGJyaWVmIFByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgc3R1YiBibG9ja3MgZ2VuZXJhdGVkIGJ5IHRoZQorLy8vICAgICAgICBtYWtlSW5kaXJlY3RTdHVic0Jsb2NrIGZ1bmN0aW9uLgordGVtcGxhdGUgPHVuc2lnbmVkIFN0dWJTaXplVmFsPiBjbGFzcyBHZW5lcmljSW5kaXJlY3RTdHVic0luZm8geworcHVibGljOgorICBjb25zdCBzdGF0aWMgdW5zaWduZWQgU3R1YlNpemUgPSBTdHViU2l6ZVZhbDsKKworICBHZW5lcmljSW5kaXJlY3RTdHVic0luZm8oKSA9IGRlZmF1bHQ7CisgIEdlbmVyaWNJbmRpcmVjdFN0dWJzSW5mbyh1bnNpZ25lZCBOdW1TdHVicywgc3lzOjpPd25pbmdNZW1vcnlCbG9jayBTdHVic01lbSkKKyAgICAgIDogTnVtU3R1YnMoTnVtU3R1YnMpLCBTdHVic01lbShzdGQ6Om1vdmUoU3R1YnNNZW0pKSB7fQorICBHZW5lcmljSW5kaXJlY3RTdHVic0luZm8oR2VuZXJpY0luZGlyZWN0U3R1YnNJbmZvICYmT3RoZXIpCisgICAgICA6IE51bVN0dWJzKE90aGVyLk51bVN0dWJzKSwgU3R1YnNNZW0oc3RkOjptb3ZlKE90aGVyLlN0dWJzTWVtKSkgeworICAgIE90aGVyLk51bVN0dWJzID0gMDsKKyAgfQorCisgIEdlbmVyaWNJbmRpcmVjdFN0dWJzSW5mbyAmb3BlcmF0b3I9KEdlbmVyaWNJbmRpcmVjdFN0dWJzSW5mbyAmJk90aGVyKSB7CisgICAgTnVtU3R1YnMgPSBPdGhlci5OdW1TdHViczsKKyAgICBPdGhlci5OdW1TdHVicyA9IDA7CisgICAgU3R1YnNNZW0gPSBzdGQ6Om1vdmUoT3RoZXIuU3R1YnNNZW0pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBAYnJpZWYgTnVtYmVyIG9mIHN0dWJzIGluIHRoaXMgYmxvY2suCisgIHVuc2lnbmVkIGdldE51bVN0dWJzKCkgY29uc3QgeyByZXR1cm4gTnVtU3R1YnM7IH0KKworICAvLy8gQGJyaWVmIEdldCBhIHBvaW50ZXIgdG8gdGhlIHN0dWIgYXQgdGhlIGdpdmVuIGluZGV4LCB3aGljaCBtdXN0IGJlIGluCisgIC8vLyAgICAgICAgdGhlIHJhbmdlIDAgLi4gZ2V0TnVtU3R1YnMoKSAtIDEuCisgIHZvaWQgKmdldFN0dWIodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXIgKj4oU3R1YnNNZW0uYmFzZSgpKSArIElkeCAqIFN0dWJTaXplOworICB9CisKKyAgLy8vIEBicmllZiBHZXQgYSBwb2ludGVyIHRvIHRoZSBpbXBsZW1lbnRhdGlvbi1wb2ludGVyIGF0IHRoZSBnaXZlbiBpbmRleCwKKyAgLy8vICAgICAgICB3aGljaCBtdXN0IGJlIGluIHRoZSByYW5nZSAwIC4uIGdldE51bVN0dWJzKCkgLSAxLgorICB2b2lkICoqZ2V0UHRyKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGNoYXIgKlB0cnNCYXNlID0gc3RhdGljX2Nhc3Q8Y2hhciAqPihTdHVic01lbS5iYXNlKCkpICsgTnVtU3R1YnMgKiBTdHViU2l6ZTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPihQdHJzQmFzZSkgKyBJZHg7CisgIH0KKworcHJpdmF0ZToKKyAgdW5zaWduZWQgTnVtU3R1YnMgPSAwOworICBzeXM6Ok93bmluZ01lbW9yeUJsb2NrIFN0dWJzTWVtOworfTsKKworY2xhc3MgT3JjQUFyY2g2NCB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBQb2ludGVyU2l6ZSA9IDg7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBUcmFtcG9saW5lU2l6ZSA9IDEyOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUmVzb2x2ZXJDb2RlU2l6ZSA9IDB4MTIwOworCisgIHVzaW5nIEluZGlyZWN0U3R1YnNJbmZvID0gR2VuZXJpY0luZGlyZWN0U3R1YnNJbmZvPDg+OworCisgIHVzaW5nIEpJVFJlZW50cnlGbiA9IEpJVFRhcmdldEFkZHJlc3MgKCopKHZvaWQgKkNhbGxiYWNrTWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpUcmFtcG9saW5lSWQpOworCisgIC8vLyBAYnJpZWYgV3JpdGUgdGhlIHJlc29sdmVyIGNvZGUgaW50byB0aGUgZ2l2ZW4gbWVtb3J5LiBUaGUgdXNlciBpcyBiZQorICAvLy8gICAgICAgIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIHRoZSBtZW1vcnkgYW5kIHNldHRpbmcgcGVybWlzc2lvbnMuCisgIHN0YXRpYyB2b2lkIHdyaXRlUmVzb2x2ZXJDb2RlKHVpbnQ4X3QgKlJlc29sdmVNZW0sIEpJVFJlZW50cnlGbiBSZWVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDYWxsYmFja01ncik7CisKKyAgLy8vIEBicmllZiBXcml0ZSB0aGUgcmVxdXN0ZWQgbnVtYmVyIG9mIHRyYW1wb2xpbmVzIGludG8gdGhlIGdpdmVuIG1lbW9yeSwKKyAgLy8vICAgICAgICB3aGljaCBtdXN0IGJlIGJpZyBlbm91Z2ggdG8gaG9sZCAxIHBvaW50ZXIsIHBsdXMgTnVtVHJhbXBvbGluZXMKKyAgLy8vICAgICAgICB0cmFtcG9saW5lcy4KKyAgc3RhdGljIHZvaWQgd3JpdGVUcmFtcG9saW5lcyh1aW50OF90ICpUcmFtcG9saW5lTWVtLCB2b2lkICpSZXNvbHZlckFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtVHJhbXBvbGluZXMpOworCisgIC8vLyBAYnJpZWYgRW1pdCBhdCBsZWFzdCBNaW5TdHVicyB3b3J0aCBvZiBpbmRpcmVjdCBjYWxsIHN0dWJzLCByb3VuZGVkIG91dCB0bworICAvLy8gICAgICAgIHRoZSBuZWFyZXN0IHBhZ2Ugc2l6ZS4KKyAgLy8vCisgIC8vLyAgIEUuZy4gQXNraW5nIGZvciA0IHN0dWJzIG9uIHg4Ni02NCwgd2hlcmUgc3R1YnMgYXJlIDgtYnl0ZXMsIHdpdGggNGsKKyAgLy8vIHBhZ2VzIHdpbGwgcmV0dXJuIGEgYmxvY2sgb2YgNTEyIHN0dWJzICg0MDk2IC8gOCA9IDUxMikuIEFza2luZyBmb3IgNTEzCisgIC8vLyB3aWxsIHJldHVybiBhIGJsb2NrIG9mIDEwMjQgKDItcGFnZXMgd29ydGgpLgorICBzdGF0aWMgRXJyb3IgZW1pdEluZGlyZWN0U3R1YnNCbG9jayhJbmRpcmVjdFN0dWJzSW5mbyAmU3R1YnNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNaW5TdHVicywgdm9pZCAqSW5pdGlhbFB0clZhbCk7Cit9OworCisvLy8gQGJyaWVmIFg4Nl82NCBjb2RlIHRoYXQncyBjb21tb24gdG8gYWxsIEFCSXMuCisvLy8KKy8vLyBYODZfNjQgc3VwcG9ydHMgbGF6eSBKSVRpbmcuCitjbGFzcyBPcmNYODZfNjRfQmFzZSB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBQb2ludGVyU2l6ZSA9IDg7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBUcmFtcG9saW5lU2l6ZSA9IDg7CisKKyAgdXNpbmcgSW5kaXJlY3RTdHVic0luZm8gPSBHZW5lcmljSW5kaXJlY3RTdHVic0luZm88OD47CisKKyAgLy8vIEBicmllZiBXcml0ZSB0aGUgcmVxdXN0ZWQgbnVtYmVyIG9mIHRyYW1wb2xpbmVzIGludG8gdGhlIGdpdmVuIG1lbW9yeSwKKyAgLy8vICAgICAgICB3aGljaCBtdXN0IGJlIGJpZyBlbm91Z2ggdG8gaG9sZCAxIHBvaW50ZXIsIHBsdXMgTnVtVHJhbXBvbGluZXMKKyAgLy8vICAgICAgICB0cmFtcG9saW5lcy4KKyAgc3RhdGljIHZvaWQgd3JpdGVUcmFtcG9saW5lcyh1aW50OF90ICpUcmFtcG9saW5lTWVtLCB2b2lkICpSZXNvbHZlckFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtVHJhbXBvbGluZXMpOworCisgIC8vLyBAYnJpZWYgRW1pdCBhdCBsZWFzdCBNaW5TdHVicyB3b3J0aCBvZiBpbmRpcmVjdCBjYWxsIHN0dWJzLCByb3VuZGVkIG91dCB0bworICAvLy8gICAgICAgIHRoZSBuZWFyZXN0IHBhZ2Ugc2l6ZS4KKyAgLy8vCisgIC8vLyAgIEUuZy4gQXNraW5nIGZvciA0IHN0dWJzIG9uIHg4Ni02NCwgd2hlcmUgc3R1YnMgYXJlIDgtYnl0ZXMsIHdpdGggNGsKKyAgLy8vIHBhZ2VzIHdpbGwgcmV0dXJuIGEgYmxvY2sgb2YgNTEyIHN0dWJzICg0MDk2IC8gOCA9IDUxMikuIEFza2luZyBmb3IgNTEzCisgIC8vLyB3aWxsIHJldHVybiBhIGJsb2NrIG9mIDEwMjQgKDItcGFnZXMgd29ydGgpLgorICBzdGF0aWMgRXJyb3IgZW1pdEluZGlyZWN0U3R1YnNCbG9jayhJbmRpcmVjdFN0dWJzSW5mbyAmU3R1YnNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNaW5TdHVicywgdm9pZCAqSW5pdGlhbFB0clZhbCk7Cit9OworCisvLy8gQGJyaWVmIFg4Nl82NCBzdXBwb3J0IGZvciBTeXNWIEFCSSAoTGludXgsIE1hY09TWCkuCisvLy8KKy8vLyBYODZfNjRfU3lzViBzdXBwb3J0cyBsYXp5IEpJVGluZy4KK2NsYXNzIE9yY1g4Nl82NF9TeXNWIDogcHVibGljIE9yY1g4Nl82NF9CYXNlIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlc29sdmVyQ29kZVNpemUgPSAweDZDOworCisgIHVzaW5nIEpJVFJlZW50cnlGbiA9IEpJVFRhcmdldEFkZHJlc3MgKCopKHZvaWQgKkNhbGxiYWNrTWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpUcmFtcG9saW5lSWQpOworCisgIC8vLyBAYnJpZWYgV3JpdGUgdGhlIHJlc29sdmVyIGNvZGUgaW50byB0aGUgZ2l2ZW4gbWVtb3J5LiBUaGUgdXNlciBpcyBiZQorICAvLy8gICAgICAgIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIHRoZSBtZW1vcnkgYW5kIHNldHRpbmcgcGVybWlzc2lvbnMuCisgIHN0YXRpYyB2b2lkIHdyaXRlUmVzb2x2ZXJDb2RlKHVpbnQ4X3QgKlJlc29sdmVNZW0sIEpJVFJlZW50cnlGbiBSZWVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDYWxsYmFja01ncik7Cit9OworCisvLy8gQGJyaWVmIFg4Nl82NCBzdXBwb3J0IGZvciBXaW4zMi4KKy8vLworLy8vIFg4Nl82NF9XaW4zMiBzdXBwb3J0cyBsYXp5IEpJVGluZy4KK2NsYXNzIE9yY1g4Nl82NF9XaW4zMiA6IHB1YmxpYyBPcmNYODZfNjRfQmFzZSB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZXNvbHZlckNvZGVTaXplID0gMHg3NDsKKworICB1c2luZyBKSVRSZWVudHJ5Rm4gPSBKSVRUYXJnZXRBZGRyZXNzICgqKSh2b2lkICpDYWxsYmFja01nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqVHJhbXBvbGluZUlkKTsKKworICAvLy8gQGJyaWVmIFdyaXRlIHRoZSByZXNvbHZlciBjb2RlIGludG8gdGhlIGdpdmVuIG1lbW9yeS4gVGhlIHVzZXIgaXMgYmUKKyAgLy8vICAgICAgICByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZyB0aGUgbWVtb3J5IGFuZCBzZXR0aW5nIHBlcm1pc3Npb25zLgorICBzdGF0aWMgdm9pZCB3cml0ZVJlc29sdmVyQ29kZSh1aW50OF90ICpSZXNvbHZlTWVtLCBKSVRSZWVudHJ5Rm4gUmVlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQ2FsbGJhY2tNZ3IpOworfTsKKworLy8vIEBicmllZiBJMzg2IHN1cHBvcnQuCisvLy8KKy8vLyBJMzg2IHN1cHBvcnRzIGxhenkgSklUaW5nLgorY2xhc3MgT3JjSTM4NiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBQb2ludGVyU2l6ZSA9IDQ7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBUcmFtcG9saW5lU2l6ZSA9IDg7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZXNvbHZlckNvZGVTaXplID0gMHg0YTsKKworICB1c2luZyBJbmRpcmVjdFN0dWJzSW5mbyA9IEdlbmVyaWNJbmRpcmVjdFN0dWJzSW5mbzw4PjsKKworICB1c2luZyBKSVRSZWVudHJ5Rm4gPSBKSVRUYXJnZXRBZGRyZXNzICgqKSh2b2lkICpDYWxsYmFja01nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqVHJhbXBvbGluZUlkKTsKKworICAvLy8gQGJyaWVmIFdyaXRlIHRoZSByZXNvbHZlciBjb2RlIGludG8gdGhlIGdpdmVuIG1lbW9yeS4gVGhlIHVzZXIgaXMgYmUKKyAgLy8vICAgICAgICByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZyB0aGUgbWVtb3J5IGFuZCBzZXR0aW5nIHBlcm1pc3Npb25zLgorICBzdGF0aWMgdm9pZCB3cml0ZVJlc29sdmVyQ29kZSh1aW50OF90ICpSZXNvbHZlTWVtLCBKSVRSZWVudHJ5Rm4gUmVlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQ2FsbGJhY2tNZ3IpOworCisgIC8vLyBAYnJpZWYgV3JpdGUgdGhlIHJlcXVzdGVkIG51bWJlciBvZiB0cmFtcG9saW5lcyBpbnRvIHRoZSBnaXZlbiBtZW1vcnksCisgIC8vLyAgICAgICAgd2hpY2ggbXVzdCBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgMSBwb2ludGVyLCBwbHVzIE51bVRyYW1wb2xpbmVzCisgIC8vLyAgICAgICAgdHJhbXBvbGluZXMuCisgIHN0YXRpYyB2b2lkIHdyaXRlVHJhbXBvbGluZXModWludDhfdCAqVHJhbXBvbGluZU1lbSwgdm9pZCAqUmVzb2x2ZXJBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVRyYW1wb2xpbmVzKTsKKworICAvLy8gQGJyaWVmIEVtaXQgYXQgbGVhc3QgTWluU3R1YnMgd29ydGggb2YgaW5kaXJlY3QgY2FsbCBzdHVicywgcm91bmRlZCBvdXQgdG8KKyAgLy8vICAgICAgICB0aGUgbmVhcmVzdCBwYWdlIHNpemUuCisgIC8vLworICAvLy8gICBFLmcuIEFza2luZyBmb3IgNCBzdHVicyBvbiBpMzg2LCB3aGVyZSBzdHVicyBhcmUgOC1ieXRlcywgd2l0aCA0aworICAvLy8gcGFnZXMgd2lsbCByZXR1cm4gYSBibG9jayBvZiA1MTIgc3R1YnMgKDQwOTYgLyA4ID0gNTEyKS4gQXNraW5nIGZvciA1MTMKKyAgLy8vIHdpbGwgcmV0dXJuIGEgYmxvY2sgb2YgMTAyNCAoMi1wYWdlcyB3b3J0aCkuCisgIHN0YXRpYyBFcnJvciBlbWl0SW5kaXJlY3RTdHVic0Jsb2NrKEluZGlyZWN0U3R1YnNJbmZvICZTdHVic0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1pblN0dWJzLCB2b2lkICpJbml0aWFsUHRyVmFsKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvcmMKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfT1JDQUJJU1VQUE9SVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT3JjRXJyb3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PcmNFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZmY0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT3JjRXJyb3IuaApAQCAtMCwwICsxLDcwIEBACisvLz09PS0tLS0tLSBPcmNFcnJvci5oIC0gUmVqZWN0IHN5bWJvbCBsb29rdXAgcmVxdWVzdHMgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICBEZWZpbmUgYW4gZXJyb3IgY2F0ZWdvcnksIGVycm9yIGNvZGVzLCBhbmQgaGVscGVyIHV0aWxpdGllcyBmb3IgT3JjLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX09SQ0VSUk9SX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX09SQ0VSUk9SX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9yYyB7CisKK2VudW0gY2xhc3MgT3JjRXJyb3JDb2RlIDogaW50IHsKKyAgLy8gUlBDIEVycm9ycworICBEdXBsaWNhdGVEZWZpbml0aW9uID0gMSwKKyAgSklUU3ltYm9sTm90Rm91bmQsCisgIFJlbW90ZUFsbG9jYXRvckRvZXNOb3RFeGlzdCwKKyAgUmVtb3RlQWxsb2NhdG9ySWRBbHJlYWR5SW5Vc2UsCisgIFJlbW90ZU1Qcm90ZWN0QWRkclVucmVjb2duaXplZCwKKyAgUmVtb3RlSW5kaXJlY3RTdHVic093bmVyRG9lc05vdEV4aXN0LAorICBSZW1vdGVJbmRpcmVjdFN0dWJzT3duZXJJZEFscmVhZHlJblVzZSwKKyAgUlBDQ29ubmVjdGlvbkNsb3NlZCwKKyAgUlBDQ291bGROb3ROZWdvdGlhdGVGdW5jdGlvbiwKKyAgUlBDUmVzcG9uc2VBYmFuZG9uZWQsCisgIFVuZXhwZWN0ZWRSUENDYWxsLAorICBVbmV4cGVjdGVkUlBDUmVzcG9uc2UsCisgIFVua25vd25FcnJvckNvZGVGcm9tUmVtb3RlLAorICBVbmtub3duUmVzb3VyY2VIYW5kbGUKK307CisKK3N0ZDo6ZXJyb3JfY29kZSBvcmNFcnJvcihPcmNFcnJvckNvZGUgRXJyQ29kZSk7CisKK2NsYXNzIER1cGxpY2F0ZURlZmluaXRpb24gOiBwdWJsaWMgRXJyb3JJbmZvPER1cGxpY2F0ZURlZmluaXRpb24+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgRHVwbGljYXRlRGVmaW5pdGlvbihzdGQ6OnN0cmluZyBTeW1ib2xOYW1lKTsKKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0U3ltYm9sTmFtZSgpIGNvbnN0OworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgU3ltYm9sTmFtZTsKK307CisKK2NsYXNzIEpJVFN5bWJvbE5vdEZvdW5kIDogcHVibGljIEVycm9ySW5mbzxKSVRTeW1ib2xOb3RGb3VuZD4geworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBKSVRTeW1ib2xOb3RGb3VuZChzdGQ6OnN0cmluZyBTeW1ib2xOYW1lKTsKKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0U3ltYm9sTmFtZSgpIGNvbnN0OworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgU3ltYm9sTmFtZTsKK307CisKK30gLy8gRW5kIG5hbWVzcGFjZSBvcmMuCit9IC8vIEVuZCBuYW1lc3BhY2UgbGx2bS4KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19PUkNFUlJPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT3JjUmVtb3RlVGFyZ2V0Q2xpZW50LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT3JjUmVtb3RlVGFyZ2V0Q2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3OWU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PcmNSZW1vdGVUYXJnZXRDbGllbnQuaApAQCAtMCwwICsxLDY3MiBAQAorLy89PT0tIE9yY1JlbW90ZVRhcmdldENsaWVudC5oIC0gT3JjIFJlbW90ZS10YXJnZXQgQ2xpZW50IC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgT3JjUmVtb3RlVGFyZ2V0Q2xpZW50IGNsYXNzIGFuZCBoZWxwZXJzLiBUaGlzIGNsYXNzCisvLyBjYW4gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSBvdmVyIGFuIFJhd0J5dGVDaGFubmVsIHdpdGggYW4KKy8vIE9yY1JlbW90ZVRhcmdldFNlcnZlciBpbnN0YW5jZSB0byBzdXBwb3J0IHJlbW90ZS1KSVRpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfT1JDUkVNT1RFVEFSR0VUQ0xJRU5UX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX09SQ1JFTU9URVRBUkdFVENMSUVOVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0pJVFN5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9JbmRpcmVjdGlvblV0aWxzLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL09yY1JlbW90ZVRhcmdldFJQQ0FQSS5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL1J1bnRpbWVEeWxkLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjZGVmaW5lIERFQlVHX1RZUEUgIm9yYy1yZW1vdGUiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvcmMgeworbmFtZXNwYWNlIHJlbW90ZSB7CisKKy8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIHV0aWxpdGllcyAoaW5jbHVkaW5nIG1lbW9yeSBtYW5hZ2VyLCBpbmRpcmVjdCBzdHVicworLy8vIG1hbmFnZXIsIGFuZCBjb21waWxlIGNhbGxiYWNrIG1hbmFnZXIgdHlwZXMpIHRoYXQgc3VwcG9ydCByZW1vdGUgSklUaW5nCisvLy8gaW4gT1JDLgorLy8vCisvLy8gRWFjaCBvZiB0aGUgdXRpbGl0eSBjbGFzc2VzIHRhbGtzIHRvIGEgSklUIHNlcnZlciAoYW4gaW5zdGFuY2Ugb2YgdGhlCisvLy8gT3JjUmVtb3RlVGFyZ2V0U2VydmVyIGNsYXNzKSB2aWEgYW4gUlBDIHN5c3RlbSAoc2VlIFJQQ1V0aWxzLmgpIHRvIGNhcnJ5IG91dAorLy8vIGl0cyBhY3Rpb25zLgorY2xhc3MgT3JjUmVtb3RlVGFyZ2V0Q2xpZW50CisgICAgOiBwdWJsaWMgcnBjOjpTaW5nbGVUaHJlYWRlZFJQQ0VuZHBvaW50PHJwYzo6UmF3Qnl0ZUNoYW5uZWw+IHsKK3B1YmxpYzoKKyAgLy8vIFJlbW90ZS1tYXBwZWQgUnVudGltZUR5bGQtY29tcGF0aWJsZSBtZW1vcnkgbWFuYWdlci4KKyAgY2xhc3MgUmVtb3RlUlREeWxkTWVtb3J5TWFuYWdlciA6IHB1YmxpYyBSdW50aW1lRHlsZDo6TWVtb3J5TWFuYWdlciB7CisgICAgZnJpZW5kIGNsYXNzIE9yY1JlbW90ZVRhcmdldENsaWVudDsKKworICBwdWJsaWM6CisgICAgflJlbW90ZVJURHlsZE1lbW9yeU1hbmFnZXIoKSB7CisgICAgICBDbGllbnQuZGVzdHJveVJlbW90ZUFsbG9jYXRvcihJZCk7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIkRlc3Ryb3llZCByZW1vdGUgYWxsb2NhdG9yICIgPDwgSWQgPDwgIlxuIik7CisgICAgfQorCisgICAgUmVtb3RlUlREeWxkTWVtb3J5TWFuYWdlcihjb25zdCBSZW1vdGVSVER5bGRNZW1vcnlNYW5hZ2VyICYpID0gZGVsZXRlOworICAgIFJlbW90ZVJURHlsZE1lbW9yeU1hbmFnZXIgJgorICAgIG9wZXJhdG9yPShjb25zdCBSZW1vdGVSVER5bGRNZW1vcnlNYW5hZ2VyICYpID0gZGVsZXRlOworICAgIFJlbW90ZVJURHlsZE1lbW9yeU1hbmFnZXIoUmVtb3RlUlREeWxkTWVtb3J5TWFuYWdlciAmJikgPSBkZWZhdWx0OworICAgIFJlbW90ZVJURHlsZE1lbW9yeU1hbmFnZXIgJgorICAgIG9wZXJhdG9yPShSZW1vdGVSVER5bGRNZW1vcnlNYW5hZ2VyICYmKSA9IGRlZmF1bHQ7CisKKyAgICB1aW50OF90ICphbGxvY2F0ZUNvZGVTZWN0aW9uKHVpbnRwdHJfdCBTaXplLCB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTZWN0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VjdGlvbk5hbWUpIG92ZXJyaWRlIHsKKyAgICAgIFVubWFwcGVkLmJhY2soKS5Db2RlQWxsb2NzLmVtcGxhY2VfYmFjayhTaXplLCBBbGlnbm1lbnQpOworICAgICAgdWludDhfdCAqQWxsb2MgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oCisgICAgICAgICAgVW5tYXBwZWQuYmFjaygpLkNvZGVBbGxvY3MuYmFjaygpLmdldExvY2FsQWRkcmVzcygpKTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiQWxsb2NhdG9yICIgPDwgSWQgPDwgIiBhbGxvY2F0ZWQgY29kZSBmb3IgIgorICAgICAgICAgICAgICAgICAgIDw8IFNlY3Rpb25OYW1lIDw8ICI6ICIgPDwgQWxsb2MgPDwgIiAoIiA8PCBTaXplCisgICAgICAgICAgICAgICAgICAgPDwgIiBieXRlcywgYWxpZ25tZW50ICIgPDwgQWxpZ25tZW50IDw8ICIpXG4iKTsKKyAgICAgIHJldHVybiBBbGxvYzsKKyAgICB9CisKKyAgICB1aW50OF90ICphbGxvY2F0ZURhdGFTZWN0aW9uKHVpbnRwdHJfdCBTaXplLCB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTZWN0aW9uSUQsIFN0cmluZ1JlZiBTZWN0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNSZWFkT25seSkgb3ZlcnJpZGUgeworICAgICAgaWYgKElzUmVhZE9ubHkpIHsKKyAgICAgICAgVW5tYXBwZWQuYmFjaygpLlJPRGF0YUFsbG9jcy5lbXBsYWNlX2JhY2soU2l6ZSwgQWxpZ25tZW50KTsKKyAgICAgICAgdWludDhfdCAqQWxsb2MgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oCisgICAgICAgICAgICBVbm1hcHBlZC5iYWNrKCkuUk9EYXRhQWxsb2NzLmJhY2soKS5nZXRMb2NhbEFkZHJlc3MoKSk7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiQWxsb2NhdG9yICIgPDwgSWQgPDwgIiBhbGxvY2F0ZWQgcm8tZGF0YSBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgPDwgU2VjdGlvbk5hbWUgPDwgIjogIiA8PCBBbGxvYyA8PCAiICgiIDw8IFNpemUKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgYnl0ZXMsIGFsaWdubWVudCAiIDw8IEFsaWdubWVudCA8PCAiKVxuIik7CisgICAgICAgIHJldHVybiBBbGxvYzsKKyAgICAgIH0gLy8gZWxzZS4uLgorCisgICAgICBVbm1hcHBlZC5iYWNrKCkuUldEYXRhQWxsb2NzLmVtcGxhY2VfYmFjayhTaXplLCBBbGlnbm1lbnQpOworICAgICAgdWludDhfdCAqQWxsb2MgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oCisgICAgICAgICAgVW5tYXBwZWQuYmFjaygpLlJXRGF0YUFsbG9jcy5iYWNrKCkuZ2V0TG9jYWxBZGRyZXNzKCkpOworICAgICAgREVCVUcoZGJncygpIDw8ICJBbGxvY2F0b3IgIiA8PCBJZCA8PCAiIGFsbG9jYXRlZCBydy1kYXRhIGZvciAiCisgICAgICAgICAgICAgICAgICAgPDwgU2VjdGlvbk5hbWUgPDwgIjogIiA8PCBBbGxvYyA8PCAiICgiIDw8IFNpemUKKyAgICAgICAgICAgICAgICAgICA8PCAiIGJ5dGVzLCBhbGlnbm1lbnQgIiA8PCBBbGlnbm1lbnQgPDwgIilcbiIpOworICAgICAgcmV0dXJuIEFsbG9jOworICAgIH0KKworICAgIHZvaWQgcmVzZXJ2ZUFsbG9jYXRpb25TcGFjZSh1aW50cHRyX3QgQ29kZVNpemUsIHVpbnQzMl90IENvZGVBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IFJPRGF0YVNpemUsIHVpbnQzMl90IFJPRGF0YUFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgUldEYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUldEYXRhQWxpZ24pIG92ZXJyaWRlIHsKKyAgICAgIFVubWFwcGVkLnB1c2hfYmFjayhPYmplY3RBbGxvY3MoKSk7CisKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiQWxsb2NhdG9yICIgPDwgSWQgPDwgIiByZXNlcnZlZDpcbiIpOworCisgICAgICBpZiAoQ29kZVNpemUgIT0gMCkgeworICAgICAgICBVbm1hcHBlZC5iYWNrKCkuUmVtb3RlQ29kZUFkZHIgPQorICAgICAgICAgICAgQ2xpZW50LnJlc2VydmVNZW0oSWQsIENvZGVTaXplLCBDb2RlQWxpZ24pOworCisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiICBjb2RlOiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmb3JtYXQoIjB4JTAxNngiLCBVbm1hcHBlZC5iYWNrKCkuUmVtb3RlQ29kZUFkZHIpCisgICAgICAgICAgICAgICAgICAgICA8PCAiICgiIDw8IENvZGVTaXplIDw8ICIgYnl0ZXMsIGFsaWdubWVudCAiIDw8IENvZGVBbGlnbgorICAgICAgICAgICAgICAgICAgICAgPDwgIilcbiIpOworICAgICAgfQorCisgICAgICBpZiAoUk9EYXRhU2l6ZSAhPSAwKSB7CisgICAgICAgIFVubWFwcGVkLmJhY2soKS5SZW1vdGVST0RhdGFBZGRyID0KKyAgICAgICAgICAgIENsaWVudC5yZXNlcnZlTWVtKElkLCBST0RhdGFTaXplLCBST0RhdGFBbGlnbik7CisKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICIgIHJvLWRhdGE6ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZvcm1hdCgiMHglMDE2eCIsIFVubWFwcGVkLmJhY2soKS5SZW1vdGVST0RhdGFBZGRyKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiAoIiA8PCBST0RhdGFTaXplIDw8ICIgYnl0ZXMsIGFsaWdubWVudCAiCisgICAgICAgICAgICAgICAgICAgICA8PCBST0RhdGFBbGlnbiA8PCAiKVxuIik7CisgICAgICB9CisKKyAgICAgIGlmIChSV0RhdGFTaXplICE9IDApIHsKKyAgICAgICAgVW5tYXBwZWQuYmFjaygpLlJlbW90ZVJXRGF0YUFkZHIgPQorICAgICAgICAgICAgQ2xpZW50LnJlc2VydmVNZW0oSWQsIFJXRGF0YVNpemUsIFJXRGF0YUFsaWduKTsKKworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiAgcnctZGF0YTogIgorICAgICAgICAgICAgICAgICAgICAgPDwgZm9ybWF0KCIweCUwMTZ4IiwgVW5tYXBwZWQuYmFjaygpLlJlbW90ZVJXRGF0YUFkZHIpCisgICAgICAgICAgICAgICAgICAgICA8PCAiICgiIDw8IFJXRGF0YVNpemUgPDwgIiBieXRlcywgYWxpZ25tZW50ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IFJXRGF0YUFsaWduIDw8ICIpXG4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBib29sIG5lZWRzVG9SZXNlcnZlQWxsb2NhdGlvblNwYWNlKCkgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdm9pZCByZWdpc3RlckVIRnJhbWVzKHVpbnQ4X3QgKkFkZHIsIHVpbnQ2NF90IExvYWRBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgU2l6ZSkgb3ZlcnJpZGUgeworICAgICAgVW5maW5hbGl6ZWRFSEZyYW1lcy5wdXNoX2JhY2soe0xvYWRBZGRyLCBTaXplfSk7CisgICAgfQorCisgICAgdm9pZCBkZXJlZ2lzdGVyRUhGcmFtZXMoKSBvdmVycmlkZSB7CisgICAgICBmb3IgKGF1dG8gJkZyYW1lIDogUmVnaXN0ZXJlZEVIRnJhbWVzKSB7CisgICAgICAgIC8vIEZJWE1FOiBBZGQgZXJyb3IgcG9sbC4KKyAgICAgICAgQ2xpZW50LmRlcmVnaXN0ZXJFSEZyYW1lcyhGcmFtZS5BZGRyLCBGcmFtZS5TaXplKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG5vdGlmeU9iamVjdExvYWRlZChSdW50aW1lRHlsZCAmRHlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvYmplY3Q6Ok9iamVjdEZpbGUgJk9iaikgb3ZlcnJpZGUgeworICAgICAgREVCVUcoZGJncygpIDw8ICJBbGxvY2F0b3IgIiA8PCBJZCA8PCAiIGFwcGxpZWQgbWFwcGluZ3M6XG4iKTsKKyAgICAgIGZvciAoYXV0byAmT2JqQWxsb2NzIDogVW5tYXBwZWQpIHsKKyAgICAgICAgbWFwQWxsb2NzVG9SZW1vdGVBZGRycyhEeWxkLCBPYmpBbGxvY3MuQ29kZUFsbG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpBbGxvY3MuUmVtb3RlQ29kZUFkZHIpOworICAgICAgICBtYXBBbGxvY3NUb1JlbW90ZUFkZHJzKER5bGQsIE9iakFsbG9jcy5ST0RhdGFBbGxvY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQWxsb2NzLlJlbW90ZVJPRGF0YUFkZHIpOworICAgICAgICBtYXBBbGxvY3NUb1JlbW90ZUFkZHJzKER5bGQsIE9iakFsbG9jcy5SV0RhdGFBbGxvY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQWxsb2NzLlJlbW90ZVJXRGF0YUFkZHIpOworICAgICAgICBVbmZpbmFsaXplZC5wdXNoX2JhY2soc3RkOjptb3ZlKE9iakFsbG9jcykpOworICAgICAgfQorICAgICAgVW5tYXBwZWQuY2xlYXIoKTsKKyAgICB9CisKKyAgICBib29sIGZpbmFsaXplTWVtb3J5KHN0ZDo6c3RyaW5nICpFcnJNc2cgPSBudWxscHRyKSBvdmVycmlkZSB7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIkFsbG9jYXRvciAiIDw8IElkIDw8ICIgZmluYWxpemluZzpcbiIpOworCisgICAgICBmb3IgKGF1dG8gJk9iakFsbG9jcyA6IFVuZmluYWxpemVkKSB7CisgICAgICAgIGlmIChjb3B5QW5kUHJvdGVjdChPYmpBbGxvY3MuQ29kZUFsbG9jcywgT2JqQWxsb2NzLlJlbW90ZUNvZGVBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzOjpNZW1vcnk6Ok1GX1JFQUQgfCBzeXM6Ok1lbW9yeTo6TUZfRVhFQykpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgaWYgKGNvcHlBbmRQcm90ZWN0KE9iakFsbG9jcy5ST0RhdGFBbGxvY3MsIE9iakFsbG9jcy5SZW1vdGVST0RhdGFBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzOjpNZW1vcnk6Ok1GX1JFQUQpKQorICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGlmIChjb3B5QW5kUHJvdGVjdChPYmpBbGxvY3MuUldEYXRhQWxsb2NzLCBPYmpBbGxvY3MuUmVtb3RlUldEYXRhQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5czo6TWVtb3J5OjpNRl9SRUFEIHwgc3lzOjpNZW1vcnk6Ok1GX1dSSVRFKSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIFVuZmluYWxpemVkLmNsZWFyKCk7CisKKyAgICAgIGZvciAoYXV0byAmRUhGcmFtZSA6IFVuZmluYWxpemVkRUhGcmFtZXMpIHsKKyAgICAgICAgaWYgKGF1dG8gRXJyID0gQ2xpZW50LnJlZ2lzdGVyRUhGcmFtZXMoRUhGcmFtZS5BZGRyLCBFSEZyYW1lLlNpemUpKSB7CisgICAgICAgICAgLy8gRklYTUU6IFJlcGxhY2UgdGhpcyBvbmNlIGZpbmFsaXplTWVtb3J5IGNhbiByZXR1cm4gYW4gRXJyb3IuCisgICAgICAgICAgaGFuZGxlQWxsRXJyb3JzKHN0ZDo6bW92ZShFcnIpLCBbJl0oRXJyb3JJbmZvQmFzZSAmRUlCKSB7CisgICAgICAgICAgICBpZiAoRXJyTXNnKSB7CisgICAgICAgICAgICAgIHJhd19zdHJpbmdfb3N0cmVhbSBFcnJPdXQoKkVyck1zZyk7CisgICAgICAgICAgICAgIEVJQi5sb2coRXJyT3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFJlZ2lzdGVyZWRFSEZyYW1lcyA9IHN0ZDo6bW92ZShVbmZpbmFsaXplZEVIRnJhbWVzKTsKKyAgICAgIFVuZmluYWxpemVkRUhGcmFtZXMgPSB7fTsKKworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBwcml2YXRlOgorICAgIGNsYXNzIEFsbG9jIHsKKyAgICBwdWJsaWM6CisgICAgICBBbGxvYyh1aW50NjRfdCBTaXplLCB1bnNpZ25lZCBBbGlnbikKKyAgICAgICAgICA6IFNpemUoU2l6ZSksIEFsaWduKEFsaWduKSwgQ29udGVudHMobmV3IGNoYXJbU2l6ZSArIEFsaWduIC0gMV0pIHt9CisKKyAgICAgIEFsbG9jKGNvbnN0IEFsbG9jICYpID0gZGVsZXRlOworICAgICAgQWxsb2MgJm9wZXJhdG9yPShjb25zdCBBbGxvYyAmKSA9IGRlbGV0ZTsKKyAgICAgIEFsbG9jKEFsbG9jICYmKSA9IGRlZmF1bHQ7CisgICAgICBBbGxvYyAmb3BlcmF0b3I9KEFsbG9jICYmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHVpbnQ2NF90IGdldFNpemUoKSBjb25zdCB7IHJldHVybiBTaXplOyB9CisKKyAgICAgIHVuc2lnbmVkIGdldEFsaWduKCkgY29uc3QgeyByZXR1cm4gQWxpZ247IH0KKworICAgICAgY2hhciAqZ2V0TG9jYWxBZGRyZXNzKCkgY29uc3QgeworICAgICAgICB1aW50cHRyX3QgTG9jYWxBZGRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KENvbnRlbnRzLmdldCgpKTsKKyAgICAgICAgTG9jYWxBZGRyID0gYWxpZ25UbyhMb2NhbEFkZHIsIEFsaWduKTsKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihMb2NhbEFkZHIpOworICAgICAgfQorCisgICAgICB2b2lkIHNldFJlbW90ZUFkZHJlc3MoSklUVGFyZ2V0QWRkcmVzcyBSZW1vdGVBZGRyKSB7CisgICAgICAgIHRoaXMtPlJlbW90ZUFkZHIgPSBSZW1vdGVBZGRyOworICAgICAgfQorCisgICAgICBKSVRUYXJnZXRBZGRyZXNzIGdldFJlbW90ZUFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBSZW1vdGVBZGRyOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdWludDY0X3QgU2l6ZTsKKyAgICAgIHVuc2lnbmVkIEFsaWduOworICAgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gQ29udGVudHM7CisgICAgICBKSVRUYXJnZXRBZGRyZXNzIFJlbW90ZUFkZHIgPSAwOworICAgIH07CisKKyAgICBzdHJ1Y3QgT2JqZWN0QWxsb2NzIHsKKyAgICAgIE9iamVjdEFsbG9jcygpID0gZGVmYXVsdDsKKyAgICAgIE9iamVjdEFsbG9jcyhjb25zdCBPYmplY3RBbGxvY3MgJikgPSBkZWxldGU7CisgICAgICBPYmplY3RBbGxvY3MgJm9wZXJhdG9yPShjb25zdCBPYmplY3RBbGxvY3MgJikgPSBkZWxldGU7CisgICAgICBPYmplY3RBbGxvY3MoT2JqZWN0QWxsb2NzICYmKSA9IGRlZmF1bHQ7CisgICAgICBPYmplY3RBbGxvY3MgJm9wZXJhdG9yPShPYmplY3RBbGxvY3MgJiYpID0gZGVmYXVsdDsKKworICAgICAgSklUVGFyZ2V0QWRkcmVzcyBSZW1vdGVDb2RlQWRkciA9IDA7CisgICAgICBKSVRUYXJnZXRBZGRyZXNzIFJlbW90ZVJPRGF0YUFkZHIgPSAwOworICAgICAgSklUVGFyZ2V0QWRkcmVzcyBSZW1vdGVSV0RhdGFBZGRyID0gMDsKKyAgICAgIHN0ZDo6dmVjdG9yPEFsbG9jPiBDb2RlQWxsb2NzLCBST0RhdGFBbGxvY3MsIFJXRGF0YUFsbG9jczsKKyAgICB9OworCisgICAgUmVtb3RlUlREeWxkTWVtb3J5TWFuYWdlcihPcmNSZW1vdGVUYXJnZXRDbGllbnQgJkNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlSWRNZ3I6OlJlc291cmNlSWQgSWQpCisgICAgICAgIDogQ2xpZW50KENsaWVudCksIElkKElkKSB7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIkNyZWF0ZWQgcmVtb3RlIGFsbG9jYXRvciAiIDw8IElkIDw8ICJcbiIpOworICAgIH0KKworICAgIC8vIE1hcHMgYWxsIGFsbG9jYXRpb25zIGluIEFsbG9jcyB0byBhbGlnbmVkIGJsb2NrcworICAgIHZvaWQgbWFwQWxsb2NzVG9SZW1vdGVBZGRycyhSdW50aW1lRHlsZCAmRHlsZCwgc3RkOjp2ZWN0b3I8QWxsb2M+ICZBbGxvY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVFRhcmdldEFkZHJlc3MgTmV4dEFkZHIpIHsKKyAgICAgIGZvciAoYXV0byAmQWxsb2MgOiBBbGxvY3MpIHsKKyAgICAgICAgTmV4dEFkZHIgPSBhbGlnblRvKE5leHRBZGRyLCBBbGxvYy5nZXRBbGlnbigpKTsKKyAgICAgICAgRHlsZC5tYXBTZWN0aW9uQWRkcmVzcyhBbGxvYy5nZXRMb2NhbEFkZHJlc3MoKSwgTmV4dEFkZHIpOworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiAgICAgIiA8PCBzdGF0aWNfY2FzdDx2b2lkICo+KEFsbG9jLmdldExvY2FsQWRkcmVzcygpKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiAtPiAiIDw8IGZvcm1hdCgiMHglMDE2eCIsIE5leHRBZGRyKSA8PCAiXG4iKTsKKyAgICAgICAgQWxsb2Muc2V0UmVtb3RlQWRkcmVzcyhOZXh0QWRkcik7CisKKyAgICAgICAgLy8gT25seSBhZHZhbmNlIE5leHRBZGRyIGlmIGl0IHdhcyBub24tbnVsbCB0byBiZWdpbiB3aXRoLAorICAgICAgICAvLyBvdGhlcndpc2UgbGVhdmUgaXQgYXMgbnVsbC4KKyAgICAgICAgaWYgKE5leHRBZGRyKQorICAgICAgICAgIE5leHRBZGRyICs9IEFsbG9jLmdldFNpemUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb3BpZXMgZGF0YSBmb3IgZWFjaCBhbGxvYyBpbiB0aGUgbGlzdCwgdGhlbiBzZXQgcGVybWlzc2lvbnMgb24gdGhlCisgICAgLy8gc2VnbWVudC4KKyAgICBib29sIGNvcHlBbmRQcm90ZWN0KGNvbnN0IHN0ZDo6dmVjdG9yPEFsbG9jPiAmQWxsb2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgSklUVGFyZ2V0QWRkcmVzcyBSZW1vdGVTZWdtZW50QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBlcm1pc3Npb25zKSB7CisgICAgICBpZiAoUmVtb3RlU2VnbWVudEFkZHIpIHsKKyAgICAgICAgYXNzZXJ0KCFBbGxvY3MuZW1wdHkoKSAmJiAiTm8gc2VjdGlvbnMgaW4gYWxsb2NhdGVkIHNlZ21lbnQiKTsKKworICAgICAgICBmb3IgKGF1dG8gJkFsbG9jIDogQWxsb2NzKSB7CisgICAgICAgICAgREVCVUcoZGJncygpIDw8ICIgIGNvcHlpbmcgc2VjdGlvbjogIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDx2b2lkICo+KEFsbG9jLmdldExvY2FsQWRkcmVzcygpKSA8PCAiIC0+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZm9ybWF0KCIweCUwMTZ4IiwgQWxsb2MuZ2V0UmVtb3RlQWRkcmVzcygpKSA8PCAiICgiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IEFsbG9jLmdldFNpemUoKSA8PCAiIGJ5dGVzKVxuIjspOworCisgICAgICAgICAgaWYgKENsaWVudC53cml0ZU1lbShBbGxvYy5nZXRSZW1vdGVBZGRyZXNzKCksIEFsbG9jLmdldExvY2FsQWRkcmVzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2MuZ2V0U2l6ZSgpKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICIgIHNldHRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgPDwgKFBlcm1pc3Npb25zICYgc3lzOjpNZW1vcnk6Ok1GX1JFQUQgPyAnUicgOiAnLScpCisgICAgICAgICAgICAgICAgICAgICA8PCAoUGVybWlzc2lvbnMgJiBzeXM6Ok1lbW9yeTo6TUZfV1JJVEUgPyAnVycgOiAnLScpCisgICAgICAgICAgICAgICAgICAgICA8PCAoUGVybWlzc2lvbnMgJiBzeXM6Ok1lbW9yeTo6TUZfRVhFQyA/ICdYJyA6ICctJykKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgcGVybWlzc2lvbnMgb24gYmxvY2s6ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZvcm1hdCgiMHglMDE2eCIsIFJlbW90ZVNlZ21lbnRBZGRyKSA8PCAiXG4iKTsKKyAgICAgICAgaWYgKENsaWVudC5zZXRQcm90ZWN0aW9ucyhJZCwgUmVtb3RlU2VnbWVudEFkZHIsIFBlcm1pc3Npb25zKSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBPcmNSZW1vdGVUYXJnZXRDbGllbnQgJkNsaWVudDsKKyAgICBSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkIElkOworICAgIHN0ZDo6dmVjdG9yPE9iamVjdEFsbG9jcz4gVW5tYXBwZWQ7CisgICAgc3RkOjp2ZWN0b3I8T2JqZWN0QWxsb2NzPiBVbmZpbmFsaXplZDsKKworICAgIHN0cnVjdCBFSEZyYW1lIHsKKyAgICAgIEpJVFRhcmdldEFkZHJlc3MgQWRkcjsKKyAgICAgIHVpbnQ2NF90IFNpemU7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxFSEZyYW1lPiBVbmZpbmFsaXplZEVIRnJhbWVzOworICAgIHN0ZDo6dmVjdG9yPEVIRnJhbWU+IFJlZ2lzdGVyZWRFSEZyYW1lczsKKyAgfTsKKworICAvLy8gUmVtb3RlIGluZGlyZWN0IHN0dWJzIG1hbmFnZXIuCisgIGNsYXNzIFJlbW90ZUluZGlyZWN0U3R1YnNNYW5hZ2VyIDogcHVibGljIEluZGlyZWN0U3R1YnNNYW5hZ2VyIHsKKyAgcHVibGljOgorICAgIFJlbW90ZUluZGlyZWN0U3R1YnNNYW5hZ2VyKE9yY1JlbW90ZVRhcmdldENsaWVudCAmQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlSWRNZ3I6OlJlc291cmNlSWQgSWQpCisgICAgICAgIDogQ2xpZW50KENsaWVudCksIElkKElkKSB7fQorCisgICAgflJlbW90ZUluZGlyZWN0U3R1YnNNYW5hZ2VyKCkgb3ZlcnJpZGUgeworICAgICAgQ2xpZW50LmRlc3Ryb3lJbmRpcmVjdFN0dWJzTWFuYWdlcihJZCk7CisgICAgfQorCisgICAgRXJyb3IgY3JlYXRlU3R1YihTdHJpbmdSZWYgU3R1Yk5hbWUsIEpJVFRhcmdldEFkZHJlc3MgU3R1YkFkZHIsCisgICAgICAgICAgICAgICAgICAgICBKSVRTeW1ib2xGbGFncyBTdHViRmxhZ3MpIG92ZXJyaWRlIHsKKyAgICAgIGlmIChhdXRvIEVyciA9IHJlc2VydmVTdHVicygxKSkKKyAgICAgICAgcmV0dXJuIEVycjsKKworICAgICAgcmV0dXJuIGNyZWF0ZVN0dWJJbnRlcm5hbChTdHViTmFtZSwgU3R1YkFkZHIsIFN0dWJGbGFncyk7CisgICAgfQorCisgICAgRXJyb3IgY3JlYXRlU3R1YnMoY29uc3QgU3R1YkluaXRzTWFwICZTdHViSW5pdHMpIG92ZXJyaWRlIHsKKyAgICAgIGlmIChhdXRvIEVyciA9IHJlc2VydmVTdHVicyhTdHViSW5pdHMuc2l6ZSgpKSkKKyAgICAgICAgcmV0dXJuIEVycjsKKworICAgICAgZm9yIChhdXRvICZFbnRyeSA6IFN0dWJJbml0cykKKyAgICAgICAgaWYgKGF1dG8gRXJyID0gY3JlYXRlU3R1YkludGVybmFsKEVudHJ5LmZpcnN0KCksIEVudHJ5LnNlY29uZC5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5LnNlY29uZC5zZWNvbmQpKQorICAgICAgICAgIHJldHVybiBFcnI7CisKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgIH0KKworICAgIEpJVFN5bWJvbCBmaW5kU3R1YihTdHJpbmdSZWYgTmFtZSwgYm9vbCBFeHBvcnRlZFN0dWJzT25seSkgb3ZlcnJpZGUgeworICAgICAgYXV0byBJID0gU3R1YkluZGV4ZXMuZmluZChOYW1lKTsKKyAgICAgIGlmIChJID09IFN0dWJJbmRleGVzLmVuZCgpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGF1dG8gS2V5ID0gSS0+c2Vjb25kLmZpcnN0OworICAgICAgYXV0byBGbGFncyA9IEktPnNlY29uZC5zZWNvbmQ7CisgICAgICBhdXRvIFN0dWJTeW1ib2wgPSBKSVRTeW1ib2woZ2V0U3R1YkFkZHIoS2V5KSwgRmxhZ3MpOworICAgICAgaWYgKEV4cG9ydGVkU3R1YnNPbmx5ICYmICFTdHViU3ltYm9sLmdldEZsYWdzKCkuaXNFeHBvcnRlZCgpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIHJldHVybiBTdHViU3ltYm9sOworICAgIH0KKworICAgIEpJVFN5bWJvbCBmaW5kUG9pbnRlcihTdHJpbmdSZWYgTmFtZSkgb3ZlcnJpZGUgeworICAgICAgYXV0byBJID0gU3R1YkluZGV4ZXMuZmluZChOYW1lKTsKKyAgICAgIGlmIChJID09IFN0dWJJbmRleGVzLmVuZCgpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGF1dG8gS2V5ID0gSS0+c2Vjb25kLmZpcnN0OworICAgICAgYXV0byBGbGFncyA9IEktPnNlY29uZC5zZWNvbmQ7CisgICAgICByZXR1cm4gSklUU3ltYm9sKGdldFB0ckFkZHIoS2V5KSwgRmxhZ3MpOworICAgIH0KKworICAgIEVycm9yIHVwZGF0ZVBvaW50ZXIoU3RyaW5nUmVmIE5hbWUsIEpJVFRhcmdldEFkZHJlc3MgTmV3QWRkcikgb3ZlcnJpZGUgeworICAgICAgYXV0byBJID0gU3R1YkluZGV4ZXMuZmluZChOYW1lKTsKKyAgICAgIGFzc2VydChJICE9IFN0dWJJbmRleGVzLmVuZCgpICYmICJObyBzdHViIHBvaW50ZXIgZm9yIHN5bWJvbCIpOworICAgICAgYXV0byBLZXkgPSBJLT5zZWNvbmQuZmlyc3Q7CisgICAgICByZXR1cm4gQ2xpZW50LndyaXRlUG9pbnRlcihnZXRQdHJBZGRyKEtleSksIE5ld0FkZHIpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0cnVjdCBSZW1vdGVJbmRpcmVjdFN0dWJzSW5mbyB7CisgICAgICBKSVRUYXJnZXRBZGRyZXNzIFN0dWJCYXNlOworICAgICAgSklUVGFyZ2V0QWRkcmVzcyBQdHJCYXNlOworICAgICAgdW5zaWduZWQgTnVtU3R1YnM7CisgICAgfTsKKworICAgIHVzaW5nIFN0dWJLZXkgPSBzdGQ6OnBhaXI8dWludDE2X3QsIHVpbnQxNl90PjsKKworICAgIEVycm9yIHJlc2VydmVTdHVicyh1bnNpZ25lZCBOdW1TdHVicykgeworICAgICAgaWYgKE51bVN0dWJzIDw9IEZyZWVTdHVicy5zaXplKCkpCisgICAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworCisgICAgICB1bnNpZ25lZCBOZXdTdHVic1JlcXVpcmVkID0gTnVtU3R1YnMgLSBGcmVlU3R1YnMuc2l6ZSgpOworICAgICAgSklUVGFyZ2V0QWRkcmVzcyBTdHViQmFzZTsKKyAgICAgIEpJVFRhcmdldEFkZHJlc3MgUHRyQmFzZTsKKyAgICAgIHVuc2lnbmVkIE51bVN0dWJzRW1pdHRlZDsKKworICAgICAgaWYgKGF1dG8gU3R1YkluZm9PckVyciA9IENsaWVudC5lbWl0SW5kaXJlY3RTdHVicyhJZCwgTmV3U3R1YnNSZXF1aXJlZCkpCisgICAgICAgIHN0ZDo6dGllKFN0dWJCYXNlLCBQdHJCYXNlLCBOdW1TdHVic0VtaXR0ZWQpID0gKlN0dWJJbmZvT3JFcnI7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBTdHViSW5mb09yRXJyLnRha2VFcnJvcigpOworCisgICAgICB1bnNpZ25lZCBOZXdCbG9ja0lkID0gUmVtb3RlSW5kaXJlY3RTdHVic0luZm9zLnNpemUoKTsKKyAgICAgIFJlbW90ZUluZGlyZWN0U3R1YnNJbmZvcy5wdXNoX2JhY2soe1N0dWJCYXNlLCBQdHJCYXNlLCBOdW1TdHVic0VtaXR0ZWR9KTsKKworICAgICAgZm9yICh1bnNpZ25lZCBJID0gMDsgSSA8IE51bVN0dWJzRW1pdHRlZDsgKytJKQorICAgICAgICBGcmVlU3R1YnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKE5ld0Jsb2NrSWQsIEkpKTsKKworICAgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgICAgfQorCisgICAgRXJyb3IgY3JlYXRlU3R1YkludGVybmFsKFN0cmluZ1JlZiBTdHViTmFtZSwgSklUVGFyZ2V0QWRkcmVzcyBJbml0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUU3ltYm9sRmxhZ3MgU3R1YkZsYWdzKSB7CisgICAgICBhdXRvIEtleSA9IEZyZWVTdHVicy5iYWNrKCk7CisgICAgICBGcmVlU3R1YnMucG9wX2JhY2soKTsKKyAgICAgIFN0dWJJbmRleGVzW1N0dWJOYW1lXSA9IHN0ZDo6bWFrZV9wYWlyKEtleSwgU3R1YkZsYWdzKTsKKyAgICAgIHJldHVybiBDbGllbnQud3JpdGVQb2ludGVyKGdldFB0ckFkZHIoS2V5KSwgSW5pdEFkZHIpOworICAgIH0KKworICAgIEpJVFRhcmdldEFkZHJlc3MgZ2V0U3R1YkFkZHIoU3R1YktleSBLKSB7CisgICAgICBhc3NlcnQoUmVtb3RlSW5kaXJlY3RTdHVic0luZm9zW0suZmlyc3RdLlN0dWJCYXNlICE9IDAgJiYKKyAgICAgICAgICAgICAiTWlzc2luZyBzdHViIGFkZHJlc3MiKTsKKyAgICAgIHJldHVybiBSZW1vdGVJbmRpcmVjdFN0dWJzSW5mb3NbSy5maXJzdF0uU3R1YkJhc2UgKworICAgICAgICAgICAgIEsuc2Vjb25kICogQ2xpZW50LmdldEluZGlyZWN0U3R1YlNpemUoKTsKKyAgICB9CisKKyAgICBKSVRUYXJnZXRBZGRyZXNzIGdldFB0ckFkZHIoU3R1YktleSBLKSB7CisgICAgICBhc3NlcnQoUmVtb3RlSW5kaXJlY3RTdHVic0luZm9zW0suZmlyc3RdLlB0ckJhc2UgIT0gMCAmJgorICAgICAgICAgICAgICJNaXNzaW5nIHBvaW50ZXIgYWRkcmVzcyIpOworICAgICAgcmV0dXJuIFJlbW90ZUluZGlyZWN0U3R1YnNJbmZvc1tLLmZpcnN0XS5QdHJCYXNlICsKKyAgICAgICAgICAgICBLLnNlY29uZCAqIENsaWVudC5nZXRQb2ludGVyU2l6ZSgpOworICAgIH0KKworICAgIE9yY1JlbW90ZVRhcmdldENsaWVudCAmQ2xpZW50OworICAgIFJlc291cmNlSWRNZ3I6OlJlc291cmNlSWQgSWQ7CisgICAgc3RkOjp2ZWN0b3I8UmVtb3RlSW5kaXJlY3RTdHVic0luZm8+IFJlbW90ZUluZGlyZWN0U3R1YnNJbmZvczsKKyAgICBzdGQ6OnZlY3RvcjxTdHViS2V5PiBGcmVlU3R1YnM7CisgICAgU3RyaW5nTWFwPHN0ZDo6cGFpcjxTdHViS2V5LCBKSVRTeW1ib2xGbGFncz4+IFN0dWJJbmRleGVzOworICB9OworCisgIC8vLyBSZW1vdGUgY29tcGlsZSBjYWxsYmFjayBtYW5hZ2VyLgorICBjbGFzcyBSZW1vdGVDb21waWxlQ2FsbGJhY2tNYW5hZ2VyIDogcHVibGljIEpJVENvbXBpbGVDYWxsYmFja01hbmFnZXIgeworICBwdWJsaWM6CisgICAgUmVtb3RlQ29tcGlsZUNhbGxiYWNrTWFuYWdlcihPcmNSZW1vdGVUYXJnZXRDbGllbnQgJkNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVFRhcmdldEFkZHJlc3MgRXJyb3JIYW5kbGVyQWRkcmVzcykKKyAgICAgICAgOiBKSVRDb21waWxlQ2FsbGJhY2tNYW5hZ2VyKEVycm9ySGFuZGxlckFkZHJlc3MpLCBDbGllbnQoQ2xpZW50KSB7fQorCisgIHByaXZhdGU6CisgICAgRXJyb3IgZ3JvdygpIG92ZXJyaWRlIHsKKyAgICAgIEpJVFRhcmdldEFkZHJlc3MgQmxvY2tBZGRyID0gMDsKKyAgICAgIHVpbnQzMl90IE51bVRyYW1wb2xpbmVzID0gMDsKKyAgICAgIGlmIChhdXRvIFRyYW1wb2xpbmVJbmZvT3JFcnIgPSBDbGllbnQuZW1pdFRyYW1wb2xpbmVCbG9jaygpKQorICAgICAgICBzdGQ6OnRpZShCbG9ja0FkZHIsIE51bVRyYW1wb2xpbmVzKSA9ICpUcmFtcG9saW5lSW5mb09yRXJyOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gVHJhbXBvbGluZUluZm9PckVyci50YWtlRXJyb3IoKTsKKworICAgICAgdWludDMyX3QgVHJhbXBvbGluZVNpemUgPSBDbGllbnQuZ2V0VHJhbXBvbGluZVNpemUoKTsKKyAgICAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgPCBOdW1UcmFtcG9saW5lczsgKytJKQorICAgICAgICB0aGlzLT5BdmFpbGFibGVUcmFtcG9saW5lcy5wdXNoX2JhY2soQmxvY2tBZGRyICsgKEkgKiBUcmFtcG9saW5lU2l6ZSkpOworCisgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICBPcmNSZW1vdGVUYXJnZXRDbGllbnQgJkNsaWVudDsKKyAgfTsKKworICAvLy8gQ3JlYXRlIGFuIE9yY1JlbW90ZVRhcmdldENsaWVudC4KKyAgLy8vIENoYW5uZWwgaXMgdGhlIENoYW5uZWxUIGluc3RhbmNlIHRvIGNvbW11bmljYXRlIG9uLiBJdCBpcyBhc3N1bWVkIHRoYXQKKyAgLy8vIHRoZSBjaGFubmVsIGlzIHJlYWR5IHRvIGJlIHJlYWQgZnJvbSBhbmQgd3JpdHRlbiB0by4KKyAgc3RhdGljIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxPcmNSZW1vdGVUYXJnZXRDbGllbnQ+PgorICBDcmVhdGUocnBjOjpSYXdCeXRlQ2hhbm5lbCAmQ2hhbm5lbCwgc3RkOjpmdW5jdGlvbjx2b2lkKEVycm9yKT4gUmVwb3J0RXJyb3IpIHsKKyAgICBFcnJvciBFcnIgPSBFcnJvcjo6c3VjY2VzcygpOworICAgIGF1dG8gQ2xpZW50ID0gc3RkOjp1bmlxdWVfcHRyPE9yY1JlbW90ZVRhcmdldENsaWVudD4oCisgICAgICAgIG5ldyBPcmNSZW1vdGVUYXJnZXRDbGllbnQoQ2hhbm5lbCwgc3RkOjptb3ZlKFJlcG9ydEVycm9yKSwgRXJyKSk7CisgICAgaWYgKEVycikKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKyAgICByZXR1cm4gc3RkOjptb3ZlKENsaWVudCk7CisgIH0KKworICAvLy8gQ2FsbCB0aGUgaW50KHZvaWQpIGZ1bmN0aW9uIGF0IHRoZSBnaXZlbiBhZGRyZXNzIGluIHRoZSB0YXJnZXQgYW5kIHJldHVybgorICAvLy8gaXRzIHJlc3VsdC4KKyAgRXhwZWN0ZWQ8aW50PiBjYWxsSW50Vm9pZChKSVRUYXJnZXRBZGRyZXNzIEFkZHIpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkNhbGxpbmcgaW50KCopKHZvaWQpICIgPDwgZm9ybWF0KCIweCUwMTZ4IiwgQWRkcikgPDwgIlxuIik7CisgICAgcmV0dXJuIGNhbGxCPGV4ZWM6OkNhbGxJbnRWb2lkPihBZGRyKTsKKyAgfQorCisgIC8vLyBDYWxsIHRoZSBpbnQoaW50LCBjaGFyKltdKSBmdW5jdGlvbiBhdCB0aGUgZ2l2ZW4gYWRkcmVzcyBpbiB0aGUgdGFyZ2V0IGFuZAorICAvLy8gcmV0dXJuIGl0cyByZXN1bHQuCisgIEV4cGVjdGVkPGludD4gY2FsbE1haW4oSklUVGFyZ2V0QWRkcmVzcyBBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmQXJncykgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiQ2FsbGluZyBpbnQoKikoaW50LCBjaGFyKltdKSAiIDw8IGZvcm1hdCgiMHglMDE2eCIsIEFkZHIpCisgICAgICAgICAgICAgICAgIDw8ICJcbiIpOworICAgIHJldHVybiBjYWxsQjxleGVjOjpDYWxsTWFpbj4oQWRkciwgQXJncyk7CisgIH0KKworICAvLy8gQ2FsbCB0aGUgdm9pZCgpIGZ1bmN0aW9uIGF0IHRoZSBnaXZlbiBhZGRyZXNzIGluIHRoZSB0YXJnZXQgYW5kIHdhaXQgZm9yCisgIC8vLyBpdCB0byBmaW5pc2guCisgIEVycm9yIGNhbGxWb2lkVm9pZChKSVRUYXJnZXRBZGRyZXNzIEFkZHIpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkNhbGxpbmcgdm9pZCgqKSh2b2lkKSAiIDw8IGZvcm1hdCgiMHglMDE2eCIsIEFkZHIpCisgICAgICAgICAgICAgICAgIDw8ICJcbiIpOworICAgIHJldHVybiBjYWxsQjxleGVjOjpDYWxsVm9pZFZvaWQ+KEFkZHIpOworICB9CisKKyAgLy8vIENyZWF0ZSBhbiBSQ01lbW9yeU1hbmFnZXIgd2hpY2ggd2lsbCBhbGxvY2F0ZSBpdHMgbWVtb3J5IG9uIHRoZSByZW1vdGUKKyAgLy8vIHRhcmdldC4KKyAgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPFJlbW90ZVJURHlsZE1lbW9yeU1hbmFnZXI+PgorICBjcmVhdGVSZW1vdGVNZW1vcnlNYW5hZ2VyKCkgeworICAgIGF1dG8gSWQgPSBBbGxvY2F0b3JJZHMuZ2V0TmV4dCgpOworICAgIGlmIChhdXRvIEVyciA9IGNhbGxCPG1lbTo6Q3JlYXRlUmVtb3RlQWxsb2NhdG9yPihJZCkpCisgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxSZW1vdGVSVER5bGRNZW1vcnlNYW5hZ2VyPigKKyAgICAgICAgbmV3IFJlbW90ZVJURHlsZE1lbW9yeU1hbmFnZXIoKnRoaXMsIElkKSk7CisgIH0KKworICAvLy8gQ3JlYXRlIGFuIFJDSW5kaXJlY3RTdHVic01hbmFnZXIgdGhhdCB3aWxsIGFsbG9jYXRlIHN0dWJzIG9uIHRoZSByZW1vdGUKKyAgLy8vIHRhcmdldC4KKyAgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPFJlbW90ZUluZGlyZWN0U3R1YnNNYW5hZ2VyPj4KKyAgY3JlYXRlSW5kaXJlY3RTdHVic01hbmFnZXIoKSB7CisgICAgYXV0byBJZCA9IEluZGlyZWN0U3R1Yk93bmVySWRzLmdldE5leHQoKTsKKyAgICBpZiAoYXV0byBFcnIgPSBjYWxsQjxzdHViczo6Q3JlYXRlSW5kaXJlY3RTdHVic093bmVyPihJZCkpCisgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisgICAgcmV0dXJuIGxsdm06Om1ha2VfdW5pcXVlPFJlbW90ZUluZGlyZWN0U3R1YnNNYW5hZ2VyPigqdGhpcywgSWQpOworICB9CisKKyAgRXhwZWN0ZWQ8UmVtb3RlQ29tcGlsZUNhbGxiYWNrTWFuYWdlciAmPgorICBlbmFibGVDb21waWxlQ2FsbGJhY2tzKEpJVFRhcmdldEFkZHJlc3MgRXJyb3JIYW5kbGVyQWRkcmVzcykgeworICAgIC8vIEVtaXQgdGhlIHJlc29sdmVyIGJsb2NrIG9uIHRoZSBKSVQgc2VydmVyLgorICAgIGlmIChhdXRvIEVyciA9IGNhbGxCPHN0dWJzOjpFbWl0UmVzb2x2ZXJCbG9jaz4oKSkKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKworICAgIC8vIENyZWF0ZSB0aGUgY2FsbGJhY2sgbWFuYWdlci4KKyAgICBDYWxsYmFja01hbmFnZXIuZW1wbGFjZSgqdGhpcywgRXJyb3JIYW5kbGVyQWRkcmVzcyk7CisgICAgUmVtb3RlQ29tcGlsZUNhbGxiYWNrTWFuYWdlciAmTWdyID0gKkNhbGxiYWNrTWFuYWdlcjsKKyAgICByZXR1cm4gTWdyOworICB9CisKKyAgLy8vIFNlYXJjaCBmb3Igc3ltYm9scyBpbiB0aGUgcmVtb3RlIHByb2Nlc3MuIE5vdGU6IFRoaXMgc2hvdWxkIGJlIHVzZWQgYnkKKyAgLy8vIHN5bWJvbCByZXNvbHZlcnMgKmFmdGVyKiB0aGV5J3ZlIHNlYXJjaGVkIHRoZSBsb2NhbCBzeW1ib2wgdGFibGUgaW4gdGhlCisgIC8vLyBKSVQgc3RhY2suCisgIEV4cGVjdGVkPEpJVFRhcmdldEFkZHJlc3M+IGdldFN5bWJvbEFkZHJlc3MoU3RyaW5nUmVmIE5hbWUpIHsKKyAgICByZXR1cm4gY2FsbEI8dXRpbHM6OkdldFN5bWJvbEFkZHJlc3M+KE5hbWUpOworICB9CisKKyAgLy8vIEdldCB0aGUgdHJpcGxlIGZvciB0aGUgcmVtb3RlIHRhcmdldC4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldFRhcmdldFRyaXBsZSgpIGNvbnN0IHsgcmV0dXJuIFJlbW90ZVRhcmdldFRyaXBsZTsgfQorCisgIEVycm9yIHRlcm1pbmF0ZVNlc3Npb24oKSB7IHJldHVybiBjYWxsQjx1dGlsczo6VGVybWluYXRlU2Vzc2lvbj4oKTsgfQorCitwcml2YXRlOgorICBPcmNSZW1vdGVUYXJnZXRDbGllbnQocnBjOjpSYXdCeXRlQ2hhbm5lbCAmQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChFcnJvcik+IFJlcG9ydEVycm9yLCBFcnJvciAmRXJyKQorICAgICAgOiBycGM6OlNpbmdsZVRocmVhZGVkUlBDRW5kcG9pbnQ8cnBjOjpSYXdCeXRlQ2hhbm5lbD4oQ2hhbm5lbCwgdHJ1ZSksCisgICAgICAgIFJlcG9ydEVycm9yKHN0ZDo6bW92ZShSZXBvcnRFcnJvcikpIHsKKyAgICBFcnJvckFzT3V0UGFyYW1ldGVyIEVBTygmRXJyKTsKKworICAgIGFkZEhhbmRsZXI8dXRpbHM6OlJlcXVlc3RDb21waWxlPigKKyAgICAgICAgW3RoaXNdKEpJVFRhcmdldEFkZHJlc3MgQWRkcikgLT4gSklUVGFyZ2V0QWRkcmVzcyB7CisgICAgICAgICAgaWYgKENhbGxiYWNrTWFuYWdlcikKKyAgICAgICAgICAgIHJldHVybiBDYWxsYmFja01hbmFnZXItPmV4ZWN1dGVDb21waWxlQ2FsbGJhY2soQWRkcik7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0pOworCisgICAgaWYgKGF1dG8gUklPckVyciA9IGNhbGxCPHV0aWxzOjpHZXRSZW1vdGVJbmZvPigpKSB7CisgICAgICBzdGQ6OnRpZShSZW1vdGVUYXJnZXRUcmlwbGUsIFJlbW90ZVBvaW50ZXJTaXplLCBSZW1vdGVQYWdlU2l6ZSwKKyAgICAgICAgICAgICAgIFJlbW90ZVRyYW1wb2xpbmVTaXplLCBSZW1vdGVJbmRpcmVjdFN0dWJTaXplKSA9ICpSSU9yRXJyOworICAgICAgRXJyID0gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICB9IGVsc2UKKyAgICAgIEVyciA9IFJJT3JFcnIudGFrZUVycm9yKCk7CisgIH0KKworICB2b2lkIGRlcmVnaXN0ZXJFSEZyYW1lcyhKSVRUYXJnZXRBZGRyZXNzIEFkZHIsIHVpbnQzMl90IFNpemUpIHsKKyAgICBpZiAoYXV0byBFcnIgPSBjYWxsQjxlaDo6UmVnaXN0ZXJFSEZyYW1lcz4oQWRkciwgU2l6ZSkpCisgICAgICBSZXBvcnRFcnJvcihzdGQ6Om1vdmUoRXJyKSk7CisgIH0KKworICB2b2lkIGRlc3Ryb3lSZW1vdGVBbGxvY2F0b3IoUmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZCBJZCkgeworICAgIGlmIChhdXRvIEVyciA9IGNhbGxCPG1lbTo6RGVzdHJveVJlbW90ZUFsbG9jYXRvcj4oSWQpKSB7CisgICAgICAvLyBGSVhNRTogVGhpcyB3aWxsIGJlIHRyaWdnZXJlZCBieSBhIHJlbW92ZU1vZHVsZVNldCBjYWxsOiBQcm9wYWdhdGUKKyAgICAgIC8vICAgICAgICBlcnJvciByZXR1cm4gdXAgdGhyb3VnaCB0aGF0LgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiRmFpbGVkIHRvIGRlc3Ryb3kgcmVtb3RlIGFsbG9jYXRvci4iKTsKKyAgICAgIEFsbG9jYXRvcklkcy5yZWxlYXNlKElkKTsKKyAgICB9CisgIH0KKworICB2b2lkIGRlc3Ryb3lJbmRpcmVjdFN0dWJzTWFuYWdlcihSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkIElkKSB7CisgICAgSW5kaXJlY3RTdHViT3duZXJJZHMucmVsZWFzZShJZCk7CisgICAgaWYgKGF1dG8gRXJyID0gY2FsbEI8c3R1YnM6OkRlc3Ryb3lJbmRpcmVjdFN0dWJzT3duZXI+KElkKSkKKyAgICAgIFJlcG9ydEVycm9yKHN0ZDo6bW92ZShFcnIpKTsKKyAgfQorCisgIEV4cGVjdGVkPHN0ZDo6dHVwbGU8SklUVGFyZ2V0QWRkcmVzcywgSklUVGFyZ2V0QWRkcmVzcywgdWludDMyX3Q+PgorICBlbWl0SW5kaXJlY3RTdHVicyhSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkIElkLCB1aW50MzJfdCBOdW1TdHVic1JlcXVpcmVkKSB7CisgICAgcmV0dXJuIGNhbGxCPHN0dWJzOjpFbWl0SW5kaXJlY3RTdHVicz4oSWQsIE51bVN0dWJzUmVxdWlyZWQpOworICB9CisKKyAgRXhwZWN0ZWQ8c3RkOjp0dXBsZTxKSVRUYXJnZXRBZGRyZXNzLCB1aW50MzJfdD4+IGVtaXRUcmFtcG9saW5lQmxvY2soKSB7CisgICAgcmV0dXJuIGNhbGxCPHN0dWJzOjpFbWl0VHJhbXBvbGluZUJsb2NrPigpOworICB9CisKKyAgdWludDMyX3QgZ2V0SW5kaXJlY3RTdHViU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFJlbW90ZUluZGlyZWN0U3R1YlNpemU7IH0KKyAgdWludDMyX3QgZ2V0UGFnZVNpemUoKSBjb25zdCB7IHJldHVybiBSZW1vdGVQYWdlU2l6ZTsgfQorICB1aW50MzJfdCBnZXRQb2ludGVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFJlbW90ZVBvaW50ZXJTaXplOyB9CisKKyAgdWludDMyX3QgZ2V0VHJhbXBvbGluZVNpemUoKSBjb25zdCB7IHJldHVybiBSZW1vdGVUcmFtcG9saW5lU2l6ZTsgfQorCisgIEV4cGVjdGVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiByZWFkTWVtKGNoYXIgKkRzdCwgSklUVGFyZ2V0QWRkcmVzcyBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUpIHsKKyAgICByZXR1cm4gY2FsbEI8bWVtOjpSZWFkTWVtPihTcmMsIFNpemUpOworICB9CisKKyAgRXJyb3IgcmVnaXN0ZXJFSEZyYW1lcyhKSVRUYXJnZXRBZGRyZXNzICZSQWRkciwgdWludDMyX3QgU2l6ZSkgeworICAgIC8vIEZJWE1FOiBEdXBsaWNhdGUgZXJyb3IgYW5kIHJlcG9ydCBpdCB2aWEgUmVwb3J0RXJyb3IgdG9vPworICAgIHJldHVybiBjYWxsQjxlaDo6UmVnaXN0ZXJFSEZyYW1lcz4oUkFkZHIsIFNpemUpOworICB9CisKKyAgSklUVGFyZ2V0QWRkcmVzcyByZXNlcnZlTWVtKFJlc291cmNlSWRNZ3I6OlJlc291cmNlSWQgSWQsIHVpbnQ2NF90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBbGlnbikgeworICAgIGlmIChhdXRvIEFkZHJPckVyciA9IGNhbGxCPG1lbTo6UmVzZXJ2ZU1lbT4oSWQsIFNpemUsIEFsaWduKSkKKyAgICAgIHJldHVybiAqQWRkck9yRXJyOworICAgIGVsc2UgeworICAgICAgUmVwb3J0RXJyb3IoQWRkck9yRXJyLnRha2VFcnJvcigpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGJvb2wgc2V0UHJvdGVjdGlvbnMoUmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZCBJZCwKKyAgICAgICAgICAgICAgICAgICAgICBKSVRUYXJnZXRBZGRyZXNzIFJlbW90ZVNlZ0FkZHIsIHVuc2lnbmVkIFByb3RGbGFncykgeworICAgIGlmIChhdXRvIEVyciA9IGNhbGxCPG1lbTo6U2V0UHJvdGVjdGlvbnM+KElkLCBSZW1vdGVTZWdBZGRyLCBQcm90RmxhZ3MpKSB7CisgICAgICBSZXBvcnRFcnJvcihzdGQ6Om1vdmUoRXJyKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgd3JpdGVNZW0oSklUVGFyZ2V0QWRkcmVzcyBBZGRyLCBjb25zdCBjaGFyICpTcmMsIHVpbnQ2NF90IFNpemUpIHsKKyAgICBpZiAoYXV0byBFcnIgPSBjYWxsQjxtZW06OldyaXRlTWVtPihEaXJlY3RCdWZmZXJXcml0ZXIoU3JjLCBBZGRyLCBTaXplKSkpIHsKKyAgICAgIFJlcG9ydEVycm9yKHN0ZDo6bW92ZShFcnIpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRXJyb3Igd3JpdGVQb2ludGVyKEpJVFRhcmdldEFkZHJlc3MgQWRkciwgSklUVGFyZ2V0QWRkcmVzcyBQdHJWYWwpIHsKKyAgICByZXR1cm4gY2FsbEI8bWVtOjpXcml0ZVB0cj4oQWRkciwgUHRyVmFsKTsKKyAgfQorCisgIHN0YXRpYyBFcnJvciBkb05vdGhpbmcoKSB7IHJldHVybiBFcnJvcjo6c3VjY2VzcygpOyB9CisKKyAgc3RkOjpmdW5jdGlvbjx2b2lkKEVycm9yKT4gUmVwb3J0RXJyb3I7CisgIHN0ZDo6c3RyaW5nIFJlbW90ZVRhcmdldFRyaXBsZTsKKyAgdWludDMyX3QgUmVtb3RlUG9pbnRlclNpemUgPSAwOworICB1aW50MzJfdCBSZW1vdGVQYWdlU2l6ZSA9IDA7CisgIHVpbnQzMl90IFJlbW90ZVRyYW1wb2xpbmVTaXplID0gMDsKKyAgdWludDMyX3QgUmVtb3RlSW5kaXJlY3RTdHViU2l6ZSA9IDA7CisgIFJlc291cmNlSWRNZ3IgQWxsb2NhdG9ySWRzLCBJbmRpcmVjdFN0dWJPd25lcklkczsKKyAgT3B0aW9uYWw8UmVtb3RlQ29tcGlsZUNhbGxiYWNrTWFuYWdlcj4gQ2FsbGJhY2tNYW5hZ2VyOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHJlbW90ZQorfSAvLyBlbmQgbmFtZXNwYWNlIG9yYworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI3VuZGVmIERFQlVHX1RZUEUKKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19PUkNSRU1PVEVUQVJHRVRDTElFTlRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL09yY1JlbW90ZVRhcmdldFJQQ0FQSS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL09yY1JlbW90ZVRhcmdldFJQQ0FQSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMGRhMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT3JjUmVtb3RlVGFyZ2V0UlBDQVBJLmgKQEAgLTAsMCArMSwzNzcgQEAKKy8vPT09LSBPcmNSZW1vdGVUYXJnZXRSUENBUEkuaCAtIE9yYyBSZW1vdGUtdGFyZ2V0IFJQQyBBUEkgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIE9yYyByZW1vdGUtdGFyZ2V0IFJQQyBBUEkuIEl0IHNob3VsZCBub3QgYmUgdXNlZAorLy8gZGlyZWN0bHksIGJ1dCBpcyB1c2VkIGJ5IHRoZSBSZW1vdGVUYXJnZXRDbGllbnQgYW5kIFJlbW90ZVRhcmdldFNlcnZlcgorLy8gY2xhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19PUkNSRU1PVEVUQVJHRVRSUENBUElfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfT1JDUkVNT1RFVEFSR0VUUlBDQVBJX0gKKworI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0pJVFN5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9SUENVdGlscy5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9SYXdCeXRlQ2hhbm5lbC5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb3JjIHsKKworbmFtZXNwYWNlIHJlbW90ZSB7CisKKy8vLyBUZW1wbGF0ZSBlcnJvciBmb3IgbWlzc2luZyByZXNvdXJjZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzb3VyY2VJZFQ+CitjbGFzcyBSZXNvdXJjZU5vdEZvdW5kCisgIDogcHVibGljIEVycm9ySW5mbzxSZXNvdXJjZU5vdEZvdW5kPFJlc291cmNlSWRUPj4geworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBSZXNvdXJjZU5vdEZvdW5kKFJlc291cmNlSWRUIFJlc291cmNlSWQsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgUmVzb3VyY2VEZXNjcmlwdGlvbiA9ICIiKQorICAgIDogUmVzb3VyY2VJZChzdGQ6Om1vdmUoUmVzb3VyY2VJZCkpLAorICAgICAgUmVzb3VyY2VEZXNjcmlwdGlvbihzdGQ6Om1vdmUoUmVzb3VyY2VEZXNjcmlwdGlvbikpIHt9CisKKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gb3JjRXJyb3IoT3JjRXJyb3JDb2RlOjpVbmtub3duUmVzb3VyY2VIYW5kbGUpOworICB9CisKKyAgdm9pZCBsb2cocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CisgICAgT1MgPDwgKFJlc291cmNlRGVzY3JpcHRpb24uZW1wdHkoKQorICAgICAgICAgICAgID8gIlJlbW90ZSByZXNvdXJjZSB3aXRoIGlkICIKKyAgICAgICAgICAgICAgIDogUmVzb3VyY2VEZXNjcmlwdGlvbikKKyAgICAgICA8PCAiICIgPDwgUmVzb3VyY2VJZCA8PCAiIG5vdCBmb3VuZCI7CisgIH0KKworcHJpdmF0ZToKKyAgUmVzb3VyY2VJZFQgUmVzb3VyY2VJZDsKKyAgc3RkOjpzdHJpbmcgUmVzb3VyY2VEZXNjcmlwdGlvbjsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXNvdXJjZUlkVD4KK2NoYXIgUmVzb3VyY2VOb3RGb3VuZDxSZXNvdXJjZUlkVD46OklEID0gMDsKKworY2xhc3MgRGlyZWN0QnVmZmVyV3JpdGVyIHsKK3B1YmxpYzoKKyAgRGlyZWN0QnVmZmVyV3JpdGVyKCkgPSBkZWZhdWx0OworICBEaXJlY3RCdWZmZXJXcml0ZXIoY29uc3QgY2hhciAqU3JjLCBKSVRUYXJnZXRBZGRyZXNzIERzdCwgdWludDY0X3QgU2l6ZSkKKyAgICAgIDogU3JjKFNyYyksIERzdChEc3QpLCBTaXplKFNpemUpIHt9CisKKyAgY29uc3QgY2hhciAqZ2V0U3JjKCkgY29uc3QgeyByZXR1cm4gU3JjOyB9CisgIEpJVFRhcmdldEFkZHJlc3MgZ2V0RHN0KCkgY29uc3QgeyByZXR1cm4gRHN0OyB9CisgIHVpbnQ2NF90IGdldFNpemUoKSBjb25zdCB7IHJldHVybiBTaXplOyB9CisKK3ByaXZhdGU6CisgIGNvbnN0IGNoYXIgKlNyYzsKKyAgSklUVGFyZ2V0QWRkcmVzcyBEc3Q7CisgIHVpbnQ2NF90IFNpemU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgcmVtb3RlCisKK25hbWVzcGFjZSBycGMgeworCit0ZW1wbGF0ZSA8PgorY2xhc3MgUlBDVHlwZU5hbWU8SklUU3ltYm9sRmxhZ3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiSklUU3ltYm9sRmxhZ3MiOyB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQ+CitjbGFzcyBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBKSVRTeW1ib2xGbGFncz4geworcHVibGljOgorCisgIHN0YXRpYyBFcnJvciBzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIGNvbnN0IEpJVFN5bWJvbEZsYWdzICZGbGFncykgeworICAgIHJldHVybiBzZXJpYWxpemVTZXEoQywgc3RhdGljX2Nhc3Q8SklUU3ltYm9sRmxhZ3M6OlVuZGVybHlpbmdUeXBlPihGbGFncyksCisgICAgICAgICAgICAgICAgICAgICAgICBGbGFncy5nZXRUYXJnZXRGbGFncygpKTsKKyAgfQorCisgIHN0YXRpYyBFcnJvciBkZXNlcmlhbGl6ZShDaGFubmVsVCAmQywgSklUU3ltYm9sRmxhZ3MgJkZsYWdzKSB7CisgICAgSklUU3ltYm9sRmxhZ3M6OlVuZGVybHlpbmdUeXBlIEpJVEZsYWdzOworICAgIEpJVFN5bWJvbEZsYWdzOjpUYXJnZXRGbGFnc1R5cGUgVGFyZ2V0RmxhZ3M7CisgICAgaWYgKGF1dG8gRXJyID0gZGVzZXJpYWxpemVTZXEoQywgSklURmxhZ3MsIFRhcmdldEZsYWdzKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgRmxhZ3MgPSBKSVRTeW1ib2xGbGFncyhzdGF0aWNfY2FzdDxKSVRTeW1ib2xGbGFnczo6RmxhZ05hbWVzPihKSVRGbGFncyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRGbGFncyk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IGNsYXNzIFJQQ1R5cGVOYW1lPHJlbW90ZTo6RGlyZWN0QnVmZmVyV3JpdGVyPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIkRpcmVjdEJ1ZmZlcldyaXRlciI7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVD4KK2NsYXNzIFNlcmlhbGl6YXRpb25UcmFpdHM8CisgICAgQ2hhbm5lbFQsIHJlbW90ZTo6RGlyZWN0QnVmZmVyV3JpdGVyLCByZW1vdGU6OkRpcmVjdEJ1ZmZlcldyaXRlciwKKyAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgc3RkOjppc19iYXNlX29mPFJhd0J5dGVDaGFubmVsLCBDaGFubmVsVD46OnZhbHVlPjo6dHlwZT4geworcHVibGljOgorICBzdGF0aWMgRXJyb3Igc2VyaWFsaXplKENoYW5uZWxUICZDLCBjb25zdCByZW1vdGU6OkRpcmVjdEJ1ZmZlcldyaXRlciAmREJXKSB7CisgICAgaWYgKGF1dG8gRUMgPSBzZXJpYWxpemVTZXEoQywgREJXLmdldERzdCgpKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICBpZiAoYXV0byBFQyA9IHNlcmlhbGl6ZVNlcShDLCBEQlcuZ2V0U2l6ZSgpKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICByZXR1cm4gQy5hcHBlbmRCeXRlcyhEQlcuZ2V0U3JjKCksIERCVy5nZXRTaXplKCkpOworICB9CisKKyAgc3RhdGljIEVycm9yIGRlc2VyaWFsaXplKENoYW5uZWxUICZDLCByZW1vdGU6OkRpcmVjdEJ1ZmZlcldyaXRlciAmREJXKSB7CisgICAgSklUVGFyZ2V0QWRkcmVzcyBEc3Q7CisgICAgaWYgKGF1dG8gRUMgPSBkZXNlcmlhbGl6ZVNlcShDLCBEc3QpKQorICAgICAgcmV0dXJuIEVDOworICAgIHVpbnQ2NF90IFNpemU7CisgICAgaWYgKGF1dG8gRUMgPSBkZXNlcmlhbGl6ZVNlcShDLCBTaXplKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICBjaGFyICpBZGRyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oRHN0KSk7CisKKyAgICBEQlcgPSByZW1vdGU6OkRpcmVjdEJ1ZmZlcldyaXRlcihudWxscHRyLCBEc3QsIFNpemUpOworCisgICAgcmV0dXJuIEMucmVhZEJ5dGVzKEFkZHIsIFNpemUpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgcnBjCisKK25hbWVzcGFjZSByZW1vdGUgeworCitjbGFzcyBSZXNvdXJjZUlkTWdyIHsKK3B1YmxpYzoKKyAgdXNpbmcgUmVzb3VyY2VJZCA9IHVpbnQ2NF90OworICBzdGF0aWMgY29uc3QgUmVzb3VyY2VJZCBJbnZhbGlkSWQgPSB+MFU7CisKKyAgUmVzb3VyY2VJZE1ncigpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgUmVzb3VyY2VJZE1ncihSZXNvdXJjZUlkIEZpcnN0VmFsaWRJZCkKKyAgICA6IE5leHRJZChzdGQ6Om1vdmUoRmlyc3RWYWxpZElkKSkge30KKworICBSZXNvdXJjZUlkIGdldE5leHQoKSB7CisgICAgaWYgKCFGcmVlSWRzLmVtcHR5KCkpIHsKKyAgICAgIFJlc291cmNlSWQgSSA9IEZyZWVJZHMuYmFjaygpOworICAgICAgRnJlZUlkcy5wb3BfYmFjaygpOworICAgICAgcmV0dXJuIEk7CisgICAgfQorICAgIGFzc2VydChOZXh0SWQgKyAxICE9IH4wVUxMICYmICJBbGwgaWRzIGFsbG9jYXRlZCIpOworICAgIHJldHVybiBOZXh0SWQrKzsKKyAgfQorCisgIHZvaWQgcmVsZWFzZShSZXNvdXJjZUlkIEkpIHsgRnJlZUlkcy5wdXNoX2JhY2soSSk7IH0KKworcHJpdmF0ZToKKyAgUmVzb3VyY2VJZCBOZXh0SWQgPSAxOworICBzdGQ6OnZlY3RvcjxSZXNvdXJjZUlkPiBGcmVlSWRzOworfTsKKworLy8vIFJlZ2lzdGVycyBFSCBmcmFtZXMgb24gdGhlIHJlbW90ZS4KK25hbWVzcGFjZSBlaCB7CisKKyAgLy8vIFJlZ2lzdGVycyBFSCBmcmFtZXMgb24gdGhlIHJlbW90ZS4KKyAgY2xhc3MgUmVnaXN0ZXJFSEZyYW1lcworICAgICAgOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjxSZWdpc3RlckVIRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKEpJVFRhcmdldEFkZHJlc3MgQWRkciwgdWludDMyX3QgU2l6ZSk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIlJlZ2lzdGVyRUhGcmFtZXMiOyB9CisgIH07CisKKyAgLy8vIERlcmVnaXN0ZXJzIEVIIGZyYW1lcyBvbiB0aGUgcmVtb3RlLgorICBjbGFzcyBEZXJlZ2lzdGVyRUhGcmFtZXMKKyAgICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248RGVyZWdpc3RlckVIRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKEpJVFRhcmdldEFkZHJlc3MgQWRkciwgdWludDMyX3QgU2l6ZSk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIkRlcmVnaXN0ZXJFSEZyYW1lcyI7IH0KKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGVoCisKKy8vLyBSUEMgZnVuY3Rpb25zIGZvciBleGVjdXRpbmcgcmVtb3RlIGNvZGUuCituYW1lc3BhY2UgZXhlYyB7CisKKyAgLy8vIENhbGwgYW4gJ2ludDMyX3QoKSctdHlwZSBmdW5jdGlvbiBvbiB0aGUgcmVtb3RlLCByZXR1cm5zIHRoZSBjYWxsZWQKKyAgLy8vIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlLgorICBjbGFzcyBDYWxsSW50Vm9pZAorICAgICAgOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjxDYWxsSW50Vm9pZCwgaW50MzJfdChKSVRUYXJnZXRBZGRyZXNzIEFkZHIpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJDYWxsSW50Vm9pZCI7IH0KKyAgfTsKKworICAvLy8gQ2FsbCBhbiAnaW50MzJfdChpbnQzMl90LCBjaGFyKiopJy10eXBlIGZ1bmN0aW9uIG9uIHRoZSByZW1vdGUsIHJldHVybnMgdGhlCisgIC8vLyBjYWxsZWQgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUuCisgIGNsYXNzIENhbGxNYWluCisgICAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPENhbGxNYWluLCBpbnQzMl90KEpJVFRhcmdldEFkZHJlc3MgQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEFyZ3MpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJDYWxsTWFpbiI7IH0KKyAgfTsKKworICAvLy8gQ2FsbHMgYSAndm9pZCgpJy10eXBlIGZ1bmN0aW9uIG9uIHRoZSByZW1vdGUsIHJldHVybnMgd2hlbiB0aGUgY2FsbGVkCisgIC8vLyBmdW5jdGlvbiBjb21wbGV0ZXMuCisgIGNsYXNzIENhbGxWb2lkVm9pZAorICAgICAgOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjxDYWxsVm9pZFZvaWQsIHZvaWQoSklUVGFyZ2V0QWRkcmVzcyBGbkFkZHIpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJDYWxsVm9pZFZvaWQiOyB9CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBleGVjCisKKy8vLyBSUEMgZnVuY3Rpb25zIGZvciByZW1vdGUgbWVtb3J5IG1hbmFnZW1lbnQgLyBpbnNwZWN0aW9uIC8gbW9kaWZpY2F0aW9uLgorbmFtZXNwYWNlIG1lbSB7CisKKyAgLy8vIENyZWF0ZXMgYSBtZW1vcnkgYWxsb2NhdG9yIG9uIHRoZSByZW1vdGUuCisgIGNsYXNzIENyZWF0ZVJlbW90ZUFsbG9jYXRvcgorICAgICAgOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjxDcmVhdGVSZW1vdGVBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQoUmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZCBBbGxvY2F0b3JJRCk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIkNyZWF0ZVJlbW90ZUFsbG9jYXRvciI7IH0KKyAgfTsKKworICAvLy8gRGVzdHJveXMgYSByZW1vdGUgYWxsb2NhdG9yLCBmcmVlaW5nIGFueSBtZW1vcnkgYWxsb2NhdGVkIGJ5IGl0LgorICBjbGFzcyBEZXN0cm95UmVtb3RlQWxsb2NhdG9yCisgICAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPERlc3Ryb3lSZW1vdGVBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQoUmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZCBBbGxvY2F0b3JJRCk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIkRlc3Ryb3lSZW1vdGVBbGxvY2F0b3IiOyB9CisgIH07CisKKyAgLy8vIFJlYWQgYSByZW1vdGUgbWVtb3J5IGJsb2NrLgorICBjbGFzcyBSZWFkTWVtCisgICAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPFJlYWRNZW0sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KEpJVFRhcmdldEFkZHJlc3MgU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiUmVhZE1lbSI7IH0KKyAgfTsKKworICAvLy8gUmVzZXJ2ZSBhIGJsb2NrIG9mIG1lbW9yeSBvbiB0aGUgcmVtb3RlIHZpYSB0aGUgZ2l2ZW4gYWxsb2NhdG9yLgorICBjbGFzcyBSZXNlcnZlTWVtCisgICAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPFJlc2VydmVNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVFRhcmdldEFkZHJlc3MoUmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZCBBbGxvY0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUsIHVpbnQzMl90IEFsaWduKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiUmVzZXJ2ZU1lbSI7IH0KKyAgfTsKKworICAvLy8gU2V0IHRoZSBtZW1vcnkgcHJvdGVjdGlvbiBvbiBhIG1lbW9yeSBibG9jay4KKyAgY2xhc3MgU2V0UHJvdGVjdGlvbnMKKyAgICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248U2V0UHJvdGVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQoUmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZCBBbGxvY0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVFRhcmdldEFkZHJlc3MgRHN0LCB1aW50MzJfdCBQcm90RmxhZ3MpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJTZXRQcm90ZWN0aW9ucyI7IH0KKyAgfTsKKworICAvLy8gV3JpdGUgdG8gYSByZW1vdGUgbWVtb3J5IGJsb2NrLgorICBjbGFzcyBXcml0ZU1lbQorICAgICAgOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjxXcml0ZU1lbSwgdm9pZChyZW1vdGU6OkRpcmVjdEJ1ZmZlcldyaXRlciBEQik+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIldyaXRlTWVtIjsgfQorICB9OworCisgIC8vLyBXcml0ZSB0byBhIHJlbW90ZSBwb2ludGVyLgorICBjbGFzcyBXcml0ZVB0ciA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPFdyaXRlUHRyLCB2b2lkKEpJVFRhcmdldEFkZHJlc3MgRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVFRhcmdldEFkZHJlc3MgVmFsKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiV3JpdGVQdHIiOyB9CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBtZW0KKworLy8vIFJQQyBmdW5jdGlvbnMgZm9yIHJlbW90ZSBzdHViIGFuZCB0cmFtcG9saW5lIG1hbmFnZW1lbnQuCituYW1lc3BhY2Ugc3R1YnMgeworCisgIC8vLyBDcmVhdGVzIGFuIGluZGlyZWN0IHN0dWIgb3duZXIgb24gdGhlIHJlbW90ZS4KKyAgY2xhc3MgQ3JlYXRlSW5kaXJlY3RTdHVic093bmVyCisgICAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPENyZWF0ZUluZGlyZWN0U3R1YnNPd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZChSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkIFN0dWJPd25lcklEKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiQ3JlYXRlSW5kaXJlY3RTdHVic093bmVyIjsgfQorICB9OworCisgIC8vLyBSUEMgZnVuY3Rpb24gZm9yIGRlc3Ryb3lpbmcgYW4gaW5kaXJlY3Qgc3R1YnMgb3duZXIuCisgIGNsYXNzIERlc3Ryb3lJbmRpcmVjdFN0dWJzT3duZXIKKyAgICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248RGVzdHJveUluZGlyZWN0U3R1YnNPd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZChSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkIFN0dWJzT3duZXJJRCk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIkRlc3Ryb3lJbmRpcmVjdFN0dWJzT3duZXIiOyB9CisgIH07CisKKyAgLy8vIEVtaXRJbmRpcmVjdFN0dWJzIHJlc3VsdCBpcyAoU3R1YnNCYXNlLCBQdHJzQmFzZSwgTnVtU3R1YnNFbWl0dGVkKS4KKyAgY2xhc3MgRW1pdEluZGlyZWN0U3R1YnMKKyAgICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248CisgICAgICAgICAgICBFbWl0SW5kaXJlY3RTdHVicywKKyAgICAgICAgICAgIHN0ZDo6dHVwbGU8SklUVGFyZ2V0QWRkcmVzcywgSklUVGFyZ2V0QWRkcmVzcywgdWludDMyX3Q+KAorICAgICAgICAgICAgICAgIFJlc291cmNlSWRNZ3I6OlJlc291cmNlSWQgU3R1YnNPd25lcklELAorICAgICAgICAgICAgICAgIHVpbnQzMl90IE51bVN0dWJzUmVxdWlyZWQpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJFbWl0SW5kaXJlY3RTdHVicyI7IH0KKyAgfTsKKworICAvLy8gUlBDIGZ1bmN0aW9uIHRvIGVtaXQgdGhlIHJlc29sdmVyIGJsb2NrIGFuZCByZXR1cm4gaXRzIGFkZHJlc3MuCisgIGNsYXNzIEVtaXRSZXNvbHZlckJsb2NrIDogcHVibGljIHJwYzo6RnVuY3Rpb248RW1pdFJlc29sdmVyQmxvY2ssIHZvaWQoKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiRW1pdFJlc29sdmVyQmxvY2siOyB9CisgIH07CisKKyAgLy8vIEVtaXRUcmFtcG9saW5lQmxvY2sgcmVzdWx0IGlzIChCbG9ja0FkZHIsIE51bVRyYW1wb2xpbmVzKS4KKyAgY2xhc3MgRW1pdFRyYW1wb2xpbmVCbG9jaworICAgICAgOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjxFbWl0VHJhbXBvbGluZUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnR1cGxlPEpJVFRhcmdldEFkZHJlc3MsIHVpbnQzMl90PigpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJFbWl0VHJhbXBvbGluZUJsb2NrIjsgfQorICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugc3R1YnMKKworLy8vIE1pc2NlbGFuZW91cyBSUEMgZnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggcmVtb3Rlcy4KK25hbWVzcGFjZSB1dGlscyB7CisKKyAgLy8vIEdldFJlbW90ZUluZm8gcmVzdWx0IGlzIChUcmlwbGUsIFBvaW50ZXJTaXplLCBQYWdlU2l6ZSwgVHJhbXBvbGluZVNpemUsCisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaXJlY3RTdHVic1NpemUpLgorICBjbGFzcyBHZXRSZW1vdGVJbmZvCisgICAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPAorICAgICAgICAgICAgR2V0UmVtb3RlSW5mbywKKyAgICAgICAgICAgIHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHVpbnQzMl90LCB1aW50MzJfdCwgdWludDMyX3QsIHVpbnQzMl90PigpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJHZXRSZW1vdGVJbmZvIjsgfQorICB9OworCisgIC8vLyBHZXQgdGhlIGFkZHJlc3Mgb2YgYSByZW1vdGUgc3ltYm9sLgorICBjbGFzcyBHZXRTeW1ib2xBZGRyZXNzCisgICAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPEdldFN5bWJvbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVFRhcmdldEFkZHJlc3Moc3RkOjpzdHJpbmcgU3ltYm9sTmFtZSk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIkdldFN5bWJvbEFkZHJlc3MiOyB9CisgIH07CisKKyAgLy8vIFJlcXVlc3QgdGhhdCB0aGUgaG9zdCBleGVjdXRlIGEgY29tcGlsZSBjYWxsYmFjay4KKyAgY2xhc3MgUmVxdWVzdENvbXBpbGUKKyAgICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248CisgICAgICAgICAgICBSZXF1ZXN0Q29tcGlsZSwgSklUVGFyZ2V0QWRkcmVzcyhKSVRUYXJnZXRBZGRyZXNzIFRyYW1wb2xpbmVBZGRyKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiUmVxdWVzdENvbXBpbGUiOyB9CisgIH07CisKKyAgLy8vIE5vdGlmeSB0aGUgcmVtb3RlIGFuZCB0ZXJtaW5hdGUgdGhlIHNlc3Npb24uCisgIGNsYXNzIFRlcm1pbmF0ZVNlc3Npb24gOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjxUZXJtaW5hdGVTZXNzaW9uLCB2b2lkKCk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIlRlcm1pbmF0ZVNlc3Npb24iOyB9CisgIH07CisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCisKK2NsYXNzIE9yY1JlbW90ZVRhcmdldFJQQ0FQSQorICAgIDogcHVibGljIHJwYzo6U2luZ2xlVGhyZWFkZWRSUENFbmRwb2ludDxycGM6OlJhd0J5dGVDaGFubmVsPiB7CitwdWJsaWM6CisgIC8vIEZJWE1FOiBSZW1vdmUgY29uc3RydWN0b3JzIG9uY2UgTVNWQyBzdXBwb3J0cyBzeW50aGVzaXppbmcgbW92ZS1vcHMuCisgIE9yY1JlbW90ZVRhcmdldFJQQ0FQSShycGM6OlJhd0J5dGVDaGFubmVsICZDKQorICAgICAgOiBycGM6OlNpbmdsZVRocmVhZGVkUlBDRW5kcG9pbnQ8cnBjOjpSYXdCeXRlQ2hhbm5lbD4oQywgdHJ1ZSkge30KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSByZW1vdGUKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9yYworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19PUkNSRU1PVEVUQVJHRVRSUENBUElfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL09yY1JlbW90ZVRhcmdldFNlcnZlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL09yY1JlbW90ZVRhcmdldFNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDE5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT3JjUmVtb3RlVGFyZ2V0U2VydmVyLmgKQEAgLTAsMCArMSw0NDcgQEAKKy8vPT09LSBPcmNSZW1vdGVUYXJnZXRTZXJ2ZXIuaCAtIE9yYyBSZW1vdGUtdGFyZ2V0IFNlcnZlciAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIE9yY1JlbW90ZVRhcmdldFNlcnZlciBjbGFzcy4gSXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYQorLy8gSklUIHNlcnZlciB0aGF0IGNhbiBleGVjdXRlIGNvZGUgc2VudCBmcm9tIGFuIE9yY1JlbW90ZVRhcmdldENsaWVudC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19PUkNSRU1PVEVUQVJHRVRTRVJWRVJfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfT1JDUkVNT1RFVEFSR0VUU0VSVkVSX0gKKworI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0pJVFN5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PcmNFcnJvci5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PcmNSZW1vdGVUYXJnZXRSUENBUEkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0hvc3QuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1Byb2Nlc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjZGVmaW5lIERFQlVHX1RZUEUgIm9yYy1yZW1vdGUiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvcmMgeworbmFtZXNwYWNlIHJlbW90ZSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUgVGFyZ2V0VD4KK2NsYXNzIE9yY1JlbW90ZVRhcmdldFNlcnZlcgorICAgIDogcHVibGljIHJwYzo6U2luZ2xlVGhyZWFkZWRSUENFbmRwb2ludDxycGM6OlJhd0J5dGVDaGFubmVsPiB7CitwdWJsaWM6CisgIHVzaW5nIFN5bWJvbExvb2t1cEZ0b3IgPQorICAgICAgc3RkOjpmdW5jdGlvbjxKSVRUYXJnZXRBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKT47CisKKyAgdXNpbmcgRUhGcmFtZVJlZ2lzdHJhdGlvbkZ0b3IgPQorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQ4X3QgKkFkZHIsIHVpbnQzMl90IFNpemUpPjsKKworICBPcmNSZW1vdGVUYXJnZXRTZXJ2ZXIoQ2hhbm5lbFQgJkNoYW5uZWwsIFN5bWJvbExvb2t1cEZ0b3IgU3ltYm9sTG9va3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgRUhGcmFtZVJlZ2lzdHJhdGlvbkZ0b3IgRUhGcmFtZXNSZWdpc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVIRnJhbWVSZWdpc3RyYXRpb25GdG9yIEVIRnJhbWVzRGVyZWdpc3RlcikKKyAgICAgIDogcnBjOjpTaW5nbGVUaHJlYWRlZFJQQ0VuZHBvaW50PHJwYzo6UmF3Qnl0ZUNoYW5uZWw+KENoYW5uZWwsIHRydWUpLAorICAgICAgICBTeW1ib2xMb29rdXAoc3RkOjptb3ZlKFN5bWJvbExvb2t1cCkpLAorICAgICAgICBFSEZyYW1lc1JlZ2lzdGVyKHN0ZDo6bW92ZShFSEZyYW1lc1JlZ2lzdGVyKSksCisgICAgICAgIEVIRnJhbWVzRGVyZWdpc3RlcihzdGQ6Om1vdmUoRUhGcmFtZXNEZXJlZ2lzdGVyKSkgeworICAgIHVzaW5nIFRoaXNUID0gdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPGRlY2x0eXBlKCp0aGlzKT46OnR5cGU7CisgICAgYWRkSGFuZGxlcjxleGVjOjpDYWxsSW50Vm9pZD4oKnRoaXMsICZUaGlzVDo6aGFuZGxlQ2FsbEludFZvaWQpOworICAgIGFkZEhhbmRsZXI8ZXhlYzo6Q2FsbE1haW4+KCp0aGlzLCAmVGhpc1Q6OmhhbmRsZUNhbGxNYWluKTsKKyAgICBhZGRIYW5kbGVyPGV4ZWM6OkNhbGxWb2lkVm9pZD4oKnRoaXMsICZUaGlzVDo6aGFuZGxlQ2FsbFZvaWRWb2lkKTsKKyAgICBhZGRIYW5kbGVyPG1lbTo6Q3JlYXRlUmVtb3RlQWxsb2NhdG9yPigqdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmVGhpc1Q6OmhhbmRsZUNyZWF0ZVJlbW90ZUFsbG9jYXRvcik7CisgICAgYWRkSGFuZGxlcjxtZW06OkRlc3Ryb3lSZW1vdGVBbGxvY2F0b3I+KAorICAgICAgICAqdGhpcywgJlRoaXNUOjpoYW5kbGVEZXN0cm95UmVtb3RlQWxsb2NhdG9yKTsKKyAgICBhZGRIYW5kbGVyPG1lbTo6UmVhZE1lbT4oKnRoaXMsICZUaGlzVDo6aGFuZGxlUmVhZE1lbSk7CisgICAgYWRkSGFuZGxlcjxtZW06OlJlc2VydmVNZW0+KCp0aGlzLCAmVGhpc1Q6OmhhbmRsZVJlc2VydmVNZW0pOworICAgIGFkZEhhbmRsZXI8bWVtOjpTZXRQcm90ZWN0aW9ucz4oKnRoaXMsICZUaGlzVDo6aGFuZGxlU2V0UHJvdGVjdGlvbnMpOworICAgIGFkZEhhbmRsZXI8bWVtOjpXcml0ZU1lbT4oKnRoaXMsICZUaGlzVDo6aGFuZGxlV3JpdGVNZW0pOworICAgIGFkZEhhbmRsZXI8bWVtOjpXcml0ZVB0cj4oKnRoaXMsICZUaGlzVDo6aGFuZGxlV3JpdGVQdHIpOworICAgIGFkZEhhbmRsZXI8ZWg6OlJlZ2lzdGVyRUhGcmFtZXM+KCp0aGlzLCAmVGhpc1Q6OmhhbmRsZVJlZ2lzdGVyRUhGcmFtZXMpOworICAgIGFkZEhhbmRsZXI8ZWg6OkRlcmVnaXN0ZXJFSEZyYW1lcz4oKnRoaXMsICZUaGlzVDo6aGFuZGxlRGVyZWdpc3RlckVIRnJhbWVzKTsKKyAgICBhZGRIYW5kbGVyPHN0dWJzOjpDcmVhdGVJbmRpcmVjdFN0dWJzT3duZXI+KAorICAgICAgICAqdGhpcywgJlRoaXNUOjpoYW5kbGVDcmVhdGVJbmRpcmVjdFN0dWJzT3duZXIpOworICAgIGFkZEhhbmRsZXI8c3R1YnM6OkRlc3Ryb3lJbmRpcmVjdFN0dWJzT3duZXI+KAorICAgICAgICAqdGhpcywgJlRoaXNUOjpoYW5kbGVEZXN0cm95SW5kaXJlY3RTdHVic093bmVyKTsKKyAgICBhZGRIYW5kbGVyPHN0dWJzOjpFbWl0SW5kaXJlY3RTdHVicz4oKnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZUaGlzVDo6aGFuZGxlRW1pdEluZGlyZWN0U3R1YnMpOworICAgIGFkZEhhbmRsZXI8c3R1YnM6OkVtaXRSZXNvbHZlckJsb2NrPigqdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlRoaXNUOjpoYW5kbGVFbWl0UmVzb2x2ZXJCbG9jayk7CisgICAgYWRkSGFuZGxlcjxzdHViczo6RW1pdFRyYW1wb2xpbmVCbG9jaz4oKnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlRoaXNUOjpoYW5kbGVFbWl0VHJhbXBvbGluZUJsb2NrKTsKKyAgICBhZGRIYW5kbGVyPHV0aWxzOjpHZXRTeW1ib2xBZGRyZXNzPigqdGhpcywgJlRoaXNUOjpoYW5kbGVHZXRTeW1ib2xBZGRyZXNzKTsKKyAgICBhZGRIYW5kbGVyPHV0aWxzOjpHZXRSZW1vdGVJbmZvPigqdGhpcywgJlRoaXNUOjpoYW5kbGVHZXRSZW1vdGVJbmZvKTsKKyAgICBhZGRIYW5kbGVyPHV0aWxzOjpUZXJtaW5hdGVTZXNzaW9uPigqdGhpcywgJlRoaXNUOjpoYW5kbGVUZXJtaW5hdGVTZXNzaW9uKTsKKyAgfQorCisgIC8vIEZJWE1FOiBSZW1vdmUgbW92ZS9jb3B5IG9wcyBvbmNlIE1TVkMgc3VwcG9ydHMgc3ludGhlc2l6aW5nIG1vdmUgb3BzLgorICBPcmNSZW1vdGVUYXJnZXRTZXJ2ZXIoY29uc3QgT3JjUmVtb3RlVGFyZ2V0U2VydmVyICYpID0gZGVsZXRlOworICBPcmNSZW1vdGVUYXJnZXRTZXJ2ZXIgJm9wZXJhdG9yPShjb25zdCBPcmNSZW1vdGVUYXJnZXRTZXJ2ZXIgJikgPSBkZWxldGU7CisKKyAgT3JjUmVtb3RlVGFyZ2V0U2VydmVyKE9yY1JlbW90ZVRhcmdldFNlcnZlciAmJk90aGVyKSA9IGRlZmF1bHQ7CisgIE9yY1JlbW90ZVRhcmdldFNlcnZlciAmb3BlcmF0b3I9KE9yY1JlbW90ZVRhcmdldFNlcnZlciAmJikgPSBkZWxldGU7CisKKyAgRXhwZWN0ZWQ8SklUVGFyZ2V0QWRkcmVzcz4gcmVxdWVzdENvbXBpbGUoSklUVGFyZ2V0QWRkcmVzcyBUcmFtcG9saW5lQWRkcikgeworICAgIHJldHVybiBjYWxsQjx1dGlsczo6UmVxdWVzdENvbXBpbGU+KFRyYW1wb2xpbmVBZGRyKTsKKyAgfQorCisgIGJvb2wgcmVjZWl2ZWRUZXJtaW5hdGUoKSBjb25zdCB7IHJldHVybiBUZXJtaW5hdGVGbGFnOyB9CisKK3ByaXZhdGU6CisgIHN0cnVjdCBBbGxvY2F0b3IgeworICAgIEFsbG9jYXRvcigpID0gZGVmYXVsdDsKKyAgICBBbGxvY2F0b3IoQWxsb2NhdG9yICYmT3RoZXIpIDogQWxsb2NzKHN0ZDo6bW92ZShPdGhlci5BbGxvY3MpKSB7fQorCisgICAgQWxsb2NhdG9yICZvcGVyYXRvcj0oQWxsb2NhdG9yICYmT3RoZXIpIHsKKyAgICAgIEFsbG9jcyA9IHN0ZDo6bW92ZShPdGhlci5BbGxvY3MpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIH5BbGxvY2F0b3IoKSB7CisgICAgICBmb3IgKGF1dG8gJkFsbG9jIDogQWxsb2NzKQorICAgICAgICBzeXM6Ok1lbW9yeTo6cmVsZWFzZU1hcHBlZE1lbW9yeShBbGxvYy5zZWNvbmQpOworICAgIH0KKworICAgIEVycm9yIGFsbG9jYXRlKHZvaWQgKiZBZGRyLCBzaXplX3QgU2l6ZSwgdWludDMyX3QgQWxpZ24pIHsKKyAgICAgIHN0ZDo6ZXJyb3JfY29kZSBFQzsKKyAgICAgIHN5czo6TWVtb3J5QmxvY2sgTUIgPSBzeXM6Ok1lbW9yeTo6YWxsb2NhdGVNYXBwZWRNZW1vcnkoCisgICAgICAgICAgU2l6ZSwgbnVsbHB0ciwgc3lzOjpNZW1vcnk6Ok1GX1JFQUQgfCBzeXM6Ok1lbW9yeTo6TUZfV1JJVEUsIEVDKTsKKyAgICAgIGlmIChFQykKKyAgICAgICAgcmV0dXJuIGVycm9yQ29kZVRvRXJyb3IoRUMpOworCisgICAgICBBZGRyID0gTUIuYmFzZSgpOworICAgICAgYXNzZXJ0KEFsbG9jcy5maW5kKE1CLmJhc2UoKSkgPT0gQWxsb2NzLmVuZCgpICYmICJEdXBsaWNhdGUgYWxsb2MiKTsKKyAgICAgIEFsbG9jc1tNQi5iYXNlKCldID0gc3RkOjptb3ZlKE1CKTsKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgIH0KKworICAgIEVycm9yIHNldFByb3RlY3Rpb25zKHZvaWQgKmJsb2NrLCB1bnNpZ25lZCBGbGFncykgeworICAgICAgYXV0byBJID0gQWxsb2NzLmZpbmQoYmxvY2spOworICAgICAgaWYgKEkgPT0gQWxsb2NzLmVuZCgpKQorICAgICAgICByZXR1cm4gZXJyb3JDb2RlVG9FcnJvcihvcmNFcnJvcihPcmNFcnJvckNvZGU6OlJlbW90ZU1Qcm90ZWN0QWRkclVucmVjb2duaXplZCkpOworICAgICAgcmV0dXJuIGVycm9yQ29kZVRvRXJyb3IoCisgICAgICAgICAgc3lzOjpNZW1vcnk6OnByb3RlY3RNYXBwZWRNZW1vcnkoSS0+c2Vjb25kLCBGbGFncykpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0ZDo6bWFwPHZvaWQgKiwgc3lzOjpNZW1vcnlCbG9jaz4gQWxsb2NzOworICB9OworCisgIHN0YXRpYyBFcnJvciBkb05vdGhpbmcoKSB7IHJldHVybiBFcnJvcjo6c3VjY2VzcygpOyB9CisKKyAgc3RhdGljIEpJVFRhcmdldEFkZHJlc3MgcmVlbnRlcih2b2lkICpKSVRUYXJnZXRBZGRyLCB2b2lkICpUcmFtcG9saW5lQWRkcikgeworICAgIGF1dG8gVCA9IHN0YXRpY19jYXN0PE9yY1JlbW90ZVRhcmdldFNlcnZlciAqPihKSVRUYXJnZXRBZGRyKTsKKyAgICBhdXRvIEFkZHJPckVyciA9IFQtPnJlcXVlc3RDb21waWxlKHN0YXRpY19jYXN0PEpJVFRhcmdldEFkZHJlc3M+KAorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oVHJhbXBvbGluZUFkZHIpKSk7CisgICAgLy8gRklYTUU6IEFsbG93IGN1c3RvbWl6YWJsZSBmYWlsdXJlIHN1YnN0aXR1dGlvbiBmdW5jdGlvbnMuCisgICAgYXNzZXJ0KEFkZHJPckVyciAmJiAiQ29tcGlsZSByZXF1ZXN0IGZhaWxlZCIpOworICAgIHJldHVybiAqQWRkck9yRXJyOworICB9CisKKyAgRXhwZWN0ZWQ8aW50MzJfdD4gaGFuZGxlQ2FsbEludFZvaWQoSklUVGFyZ2V0QWRkcmVzcyBBZGRyKSB7CisgICAgdXNpbmcgSW50Vm9pZEZuVHkgPSBpbnQgKCopKCk7CisKKyAgICBJbnRWb2lkRm5UeSBGbiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8SW50Vm9pZEZuVHk+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oQWRkcikpOworCisgICAgREVCVUcoZGJncygpIDw8ICIgIENhbGxpbmcgIiA8PCBmb3JtYXQoIjB4JTAxNngiLCBBZGRyKSA8PCAiXG4iKTsKKyAgICBpbnQgUmVzdWx0ID0gRm4oKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgUmVzdWx0ID0gIiA8PCBSZXN1bHQgPDwgIlxuIik7CisKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgRXhwZWN0ZWQ8aW50MzJfdD4gaGFuZGxlQ2FsbE1haW4oSklUVGFyZ2V0QWRkcmVzcyBBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQXJncykgeworICAgIHVzaW5nIE1haW5GblR5ID0gaW50ICgqKShpbnQsIGNvbnN0IGNoYXIgKltdKTsKKworICAgIE1haW5GblR5IEZuID0gcmVpbnRlcnByZXRfY2FzdDxNYWluRm5UeT4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihBZGRyKSk7CisgICAgaW50IEFyZ0MgPSBBcmdzLnNpemUoKSArIDE7CisgICAgaW50IElkeCA9IDE7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IGNoYXIgKltdPiBBcmdWKG5ldyBjb25zdCBjaGFyICpbQXJnQyArIDFdKTsKKyAgICBBcmdWWzBdID0gIjxqaXQgcHJvY2Vzcz4iOworICAgIGZvciAoYXV0byAmQXJnIDogQXJncykKKyAgICAgIEFyZ1ZbSWR4KytdID0gQXJnLmNfc3RyKCk7CisgICAgQXJnVltBcmdDXSA9IDA7CisgICAgREVCVUcoCisgICAgICBmb3IgKGludCBJZHggPSAwOyBJZHggPCBBcmdDOyArK0lkeCkgeworICAgICAgICBsbHZtOjpkYmdzKCkgPDwgIkFyZyAiIDw8IElkeCA8PCAiOiAiIDw8IEFyZ1ZbSWR4XSA8PCAiXG4iOworICAgICAgfQorICAgICk7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgQ2FsbGluZyAiIDw8IGZvcm1hdCgiMHglMDE2eCIsIEFkZHIpIDw8ICJcbiIpOworICAgIGludCBSZXN1bHQgPSBGbihBcmdDLCBBcmdWLmdldCgpKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgUmVzdWx0ID0gIiA8PCBSZXN1bHQgPDwgIlxuIik7CisKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgRXJyb3IgaGFuZGxlQ2FsbFZvaWRWb2lkKEpJVFRhcmdldEFkZHJlc3MgQWRkcikgeworICAgIHVzaW5nIFZvaWRWb2lkRm5UeSA9IHZvaWQgKCopKCk7CisKKyAgICBWb2lkVm9pZEZuVHkgRm4gPQorICAgICAgICByZWludGVycHJldF9jYXN0PFZvaWRWb2lkRm5UeT4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihBZGRyKSk7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgQ2FsbGluZyAiIDw8IGZvcm1hdCgiMHglMDE2eCIsIEFkZHIpIDw8ICJcbiIpOworICAgIEZuKCk7CisgICAgREVCVUcoZGJncygpIDw8ICIgIENvbXBsZXRlLlxuIik7CisKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEVycm9yIGhhbmRsZUNyZWF0ZVJlbW90ZUFsbG9jYXRvcihSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkIElkKSB7CisgICAgYXV0byBJID0gQWxsb2NhdG9ycy5maW5kKElkKTsKKyAgICBpZiAoSSAhPSBBbGxvY2F0b3JzLmVuZCgpKQorICAgICAgcmV0dXJuIGVycm9yQ29kZVRvRXJyb3IoCisgICAgICAgICAgICAgICBvcmNFcnJvcihPcmNFcnJvckNvZGU6OlJlbW90ZUFsbG9jYXRvcklkQWxyZWFkeUluVXNlKSk7CisgICAgREVCVUcoZGJncygpIDw8ICIgIENyZWF0ZWQgYWxsb2NhdG9yICIgPDwgSWQgPDwgIlxuIik7CisgICAgQWxsb2NhdG9yc1tJZF0gPSBBbGxvY2F0b3IoKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEVycm9yIGhhbmRsZUNyZWF0ZUluZGlyZWN0U3R1YnNPd25lcihSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkIElkKSB7CisgICAgYXV0byBJID0gSW5kaXJlY3RTdHVic093bmVycy5maW5kKElkKTsKKyAgICBpZiAoSSAhPSBJbmRpcmVjdFN0dWJzT3duZXJzLmVuZCgpKQorICAgICAgcmV0dXJuIGVycm9yQ29kZVRvRXJyb3IoCisgICAgICAgICAgICAgICBvcmNFcnJvcihPcmNFcnJvckNvZGU6OlJlbW90ZUluZGlyZWN0U3R1YnNPd25lcklkQWxyZWFkeUluVXNlKSk7CisgICAgREVCVUcoZGJncygpIDw8ICIgIENyZWF0ZSBpbmRpcmVjdCBzdHVicyBvd25lciAiIDw8IElkIDw8ICJcbiIpOworICAgIEluZGlyZWN0U3R1YnNPd25lcnNbSWRdID0gSVNCbG9ja093bmVyTGlzdCgpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgaGFuZGxlRGVyZWdpc3RlckVIRnJhbWVzKEpJVFRhcmdldEFkZHJlc3MgVEFkZHIsIHVpbnQzMl90IFNpemUpIHsKKyAgICB1aW50OF90ICpBZGRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oVEFkZHIpKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgUmVnaXN0ZXJpbmcgRUggZnJhbWVzIGF0ICIgPDwgZm9ybWF0KCIweCUwMTZ4IiwgVEFkZHIpCisgICAgICAgICAgICAgICAgIDw8ICIsIFNpemUgPSAiIDw8IFNpemUgPDwgIiBieXRlc1xuIik7CisgICAgRUhGcmFtZXNEZXJlZ2lzdGVyKEFkZHIsIFNpemUpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgaGFuZGxlRGVzdHJveVJlbW90ZUFsbG9jYXRvcihSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkIElkKSB7CisgICAgYXV0byBJID0gQWxsb2NhdG9ycy5maW5kKElkKTsKKyAgICBpZiAoSSA9PSBBbGxvY2F0b3JzLmVuZCgpKQorICAgICAgcmV0dXJuIGVycm9yQ29kZVRvRXJyb3IoCisgICAgICAgICAgICAgICBvcmNFcnJvcihPcmNFcnJvckNvZGU6OlJlbW90ZUFsbG9jYXRvckRvZXNOb3RFeGlzdCkpOworICAgIEFsbG9jYXRvcnMuZXJhc2UoSSk7CisgICAgREVCVUcoZGJncygpIDw8ICIgIERlc3Ryb3llZCBhbGxvY2F0b3IgIiA8PCBJZCA8PCAiXG4iKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEVycm9yIGhhbmRsZURlc3Ryb3lJbmRpcmVjdFN0dWJzT3duZXIoUmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZCBJZCkgeworICAgIGF1dG8gSSA9IEluZGlyZWN0U3R1YnNPd25lcnMuZmluZChJZCk7CisgICAgaWYgKEkgPT0gSW5kaXJlY3RTdHVic093bmVycy5lbmQoKSkKKyAgICAgIHJldHVybiBlcnJvckNvZGVUb0Vycm9yKAorICAgICAgICAgICAgICAgb3JjRXJyb3IoT3JjRXJyb3JDb2RlOjpSZW1vdGVJbmRpcmVjdFN0dWJzT3duZXJEb2VzTm90RXhpc3QpKTsKKyAgICBJbmRpcmVjdFN0dWJzT3duZXJzLmVyYXNlKEkpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXhwZWN0ZWQ8c3RkOjp0dXBsZTxKSVRUYXJnZXRBZGRyZXNzLCBKSVRUYXJnZXRBZGRyZXNzLCB1aW50MzJfdD4+CisgIGhhbmRsZUVtaXRJbmRpcmVjdFN0dWJzKFJlc291cmNlSWRNZ3I6OlJlc291cmNlSWQgSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE51bVN0dWJzUmVxdWlyZWQpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgSVNNZ3IgIiA8PCBJZCA8PCAiIHJlcXVlc3QgIiA8PCBOdW1TdHVic1JlcXVpcmVkCisgICAgICAgICAgICAgICAgIDw8ICIgc3R1YnMuXG4iKTsKKworICAgIGF1dG8gU3R1Yk93bmVySXRyID0gSW5kaXJlY3RTdHVic093bmVycy5maW5kKElkKTsKKyAgICBpZiAoU3R1Yk93bmVySXRyID09IEluZGlyZWN0U3R1YnNPd25lcnMuZW5kKCkpCisgICAgICByZXR1cm4gZXJyb3JDb2RlVG9FcnJvcigKKyAgICAgICAgICAgICAgIG9yY0Vycm9yKE9yY0Vycm9yQ29kZTo6UmVtb3RlSW5kaXJlY3RTdHVic093bmVyRG9lc05vdEV4aXN0KSk7CisKKyAgICB0eXBlbmFtZSBUYXJnZXRUOjpJbmRpcmVjdFN0dWJzSW5mbyBJUzsKKyAgICBpZiAoYXV0byBFcnIgPQorICAgICAgICAgICAgVGFyZ2V0VDo6ZW1pdEluZGlyZWN0U3R1YnNCbG9jayhJUywgTnVtU3R1YnNSZXF1aXJlZCwgbnVsbHB0cikpCisgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisKKyAgICBKSVRUYXJnZXRBZGRyZXNzIFN0dWJzQmFzZSA9IHN0YXRpY19jYXN0PEpJVFRhcmdldEFkZHJlc3M+KAorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oSVMuZ2V0U3R1YigwKSkpOworICAgIEpJVFRhcmdldEFkZHJlc3MgUHRyc0Jhc2UgPSBzdGF0aWNfY2FzdDxKSVRUYXJnZXRBZGRyZXNzPigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KElTLmdldFB0cigwKSkpOworICAgIHVpbnQzMl90IE51bVN0dWJzRW1pdHRlZCA9IElTLmdldE51bVN0dWJzKCk7CisKKyAgICBhdXRvICZCbG9ja0xpc3QgPSBTdHViT3duZXJJdHItPnNlY29uZDsKKyAgICBCbG9ja0xpc3QucHVzaF9iYWNrKHN0ZDo6bW92ZShJUykpOworCisgICAgcmV0dXJuIHN0ZDo6bWFrZV90dXBsZShTdHVic0Jhc2UsIFB0cnNCYXNlLCBOdW1TdHVic0VtaXR0ZWQpOworICB9CisKKyAgRXJyb3IgaGFuZGxlRW1pdFJlc29sdmVyQmxvY2soKSB7CisgICAgc3RkOjplcnJvcl9jb2RlIEVDOworICAgIFJlc29sdmVyQmxvY2sgPSBzeXM6Ok93bmluZ01lbW9yeUJsb2NrKHN5czo6TWVtb3J5OjphbGxvY2F0ZU1hcHBlZE1lbW9yeSgKKyAgICAgICAgVGFyZ2V0VDo6UmVzb2x2ZXJDb2RlU2l6ZSwgbnVsbHB0ciwKKyAgICAgICAgc3lzOjpNZW1vcnk6Ok1GX1JFQUQgfCBzeXM6Ok1lbW9yeTo6TUZfV1JJVEUsIEVDKSk7CisgICAgaWYgKEVDKQorICAgICAgcmV0dXJuIGVycm9yQ29kZVRvRXJyb3IoRUMpOworCisgICAgVGFyZ2V0VDo6d3JpdGVSZXNvbHZlckNvZGUoc3RhdGljX2Nhc3Q8dWludDhfdCAqPihSZXNvbHZlckJsb2NrLmJhc2UoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZW50ZXIsIHRoaXMpOworCisgICAgcmV0dXJuIGVycm9yQ29kZVRvRXJyb3Ioc3lzOjpNZW1vcnk6OnByb3RlY3RNYXBwZWRNZW1vcnkoCisgICAgICAgIFJlc29sdmVyQmxvY2suZ2V0TWVtb3J5QmxvY2soKSwKKyAgICAgICAgc3lzOjpNZW1vcnk6Ok1GX1JFQUQgfCBzeXM6Ok1lbW9yeTo6TUZfRVhFQykpOworICB9CisKKyAgRXhwZWN0ZWQ8c3RkOjp0dXBsZTxKSVRUYXJnZXRBZGRyZXNzLCB1aW50MzJfdD4+IGhhbmRsZUVtaXRUcmFtcG9saW5lQmxvY2soKSB7CisgICAgc3RkOjplcnJvcl9jb2RlIEVDOworICAgIGF1dG8gVHJhbXBvbGluZUJsb2NrID0KKyAgICAgICAgc3lzOjpPd25pbmdNZW1vcnlCbG9jayhzeXM6Ok1lbW9yeTo6YWxsb2NhdGVNYXBwZWRNZW1vcnkoCisgICAgICAgICAgICBzeXM6OlByb2Nlc3M6OmdldFBhZ2VTaXplKCksIG51bGxwdHIsCisgICAgICAgICAgICBzeXM6Ok1lbW9yeTo6TUZfUkVBRCB8IHN5czo6TWVtb3J5OjpNRl9XUklURSwgRUMpKTsKKyAgICBpZiAoRUMpCisgICAgICByZXR1cm4gZXJyb3JDb2RlVG9FcnJvcihFQyk7CisKKyAgICB1aW50MzJfdCBOdW1UcmFtcG9saW5lcyA9CisgICAgICAgIChzeXM6OlByb2Nlc3M6OmdldFBhZ2VTaXplKCkgLSBUYXJnZXRUOjpQb2ludGVyU2l6ZSkgLworICAgICAgICBUYXJnZXRUOjpUcmFtcG9saW5lU2l6ZTsKKworICAgIHVpbnQ4X3QgKlRyYW1wb2xpbmVNZW0gPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KFRyYW1wb2xpbmVCbG9jay5iYXNlKCkpOworICAgIFRhcmdldFQ6OndyaXRlVHJhbXBvbGluZXMoVHJhbXBvbGluZU1lbSwgUmVzb2x2ZXJCbG9jay5iYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1UcmFtcG9saW5lcyk7CisKKyAgICBFQyA9IHN5czo6TWVtb3J5Ojpwcm90ZWN0TWFwcGVkTWVtb3J5KFRyYW1wb2xpbmVCbG9jay5nZXRNZW1vcnlCbG9jaygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzOjpNZW1vcnk6Ok1GX1JFQUQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5czo6TWVtb3J5OjpNRl9FWEVDKTsKKworICAgIFRyYW1wb2xpbmVCbG9ja3MucHVzaF9iYWNrKHN0ZDo6bW92ZShUcmFtcG9saW5lQmxvY2spKTsKKworICAgIGF1dG8gVHJhbXBvbGluZUJhc2VBZGRyID0gc3RhdGljX2Nhc3Q8SklUVGFyZ2V0QWRkcmVzcz4oCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihUcmFtcG9saW5lTWVtKSk7CisKKyAgICByZXR1cm4gc3RkOjptYWtlX3R1cGxlKFRyYW1wb2xpbmVCYXNlQWRkciwgTnVtVHJhbXBvbGluZXMpOworICB9CisKKyAgRXhwZWN0ZWQ8SklUVGFyZ2V0QWRkcmVzcz4gaGFuZGxlR2V0U3ltYm9sQWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworICAgIEpJVFRhcmdldEFkZHJlc3MgQWRkciA9IFN5bWJvbExvb2t1cChOYW1lKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgU3ltYm9sICciIDw8IE5hbWUgPDwgIicgPSAgIiA8PCBmb3JtYXQoIjB4JTAxNngiLCBBZGRyKQorICAgICAgICAgICAgICAgICA8PCAiXG4iKTsKKyAgICByZXR1cm4gQWRkcjsKKyAgfQorCisgIEV4cGVjdGVkPHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHVpbnQzMl90LCB1aW50MzJfdCwgdWludDMyX3QsIHVpbnQzMl90Pj4KKyAgaGFuZGxlR2V0UmVtb3RlSW5mbygpIHsKKyAgICBzdGQ6OnN0cmluZyBQcm9jZXNzVHJpcGxlID0gc3lzOjpnZXRQcm9jZXNzVHJpcGxlKCk7CisgICAgdWludDMyX3QgUG9pbnRlclNpemUgPSBUYXJnZXRUOjpQb2ludGVyU2l6ZTsKKyAgICB1aW50MzJfdCBQYWdlU2l6ZSA9IHN5czo6UHJvY2Vzczo6Z2V0UGFnZVNpemUoKTsKKyAgICB1aW50MzJfdCBUcmFtcG9saW5lU2l6ZSA9IFRhcmdldFQ6OlRyYW1wb2xpbmVTaXplOworICAgIHVpbnQzMl90IEluZGlyZWN0U3R1YlNpemUgPSBUYXJnZXRUOjpJbmRpcmVjdFN0dWJzSW5mbzo6U3R1YlNpemU7CisgICAgREVCVUcoZGJncygpIDw8ICIgIFJlbW90ZSBpbmZvOlxuIgorICAgICAgICAgICAgICAgICA8PCAiICAgIHRyaXBsZSAgICAgICAgICAgICA9ICciIDw8IFByb2Nlc3NUcmlwbGUgPDwgIidcbiIKKyAgICAgICAgICAgICAgICAgPDwgIiAgICBwb2ludGVyIHNpemUgICAgICAgPSAiIDw8IFBvaW50ZXJTaXplIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgPDwgIiAgICBwYWdlIHNpemUgICAgICAgICAgPSAiIDw8IFBhZ2VTaXplIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgPDwgIiAgICB0cmFtcG9saW5lIHNpemUgICAgPSAiIDw8IFRyYW1wb2xpbmVTaXplIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgPDwgIiAgICBpbmRpcmVjdCBzdHViIHNpemUgPSAiIDw8IEluZGlyZWN0U3R1YlNpemUgPDwgIlxuIik7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV90dXBsZShQcm9jZXNzVHJpcGxlLCBQb2ludGVyU2l6ZSwgUGFnZVNpemUsIFRyYW1wb2xpbmVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaXJlY3RTdHViU2l6ZSk7CisgIH0KKworICBFeHBlY3RlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gaGFuZGxlUmVhZE1lbShKSVRUYXJnZXRBZGRyZXNzIFJTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUpIHsKKyAgICB1aW50OF90ICpTcmMgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihSU3JjKSk7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgUmVhZGluZyAiIDw8IFNpemUgPDwgIiBieXRlcyBmcm9tICIKKyAgICAgICAgICAgICAgICAgPDwgZm9ybWF0KCIweCUwMTZ4IiwgUlNyYykgPDwgIlxuIik7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBCdWZmZXI7CisgICAgQnVmZmVyLnJlc2l6ZShTaXplKTsKKyAgICBmb3IgKHVpbnQ4X3QgKlAgPSBTcmM7IFNpemUgIT0gMDsgLS1TaXplKQorICAgICAgQnVmZmVyLnB1c2hfYmFjaygqUCsrKTsKKworICAgIHJldHVybiBCdWZmZXI7CisgIH0KKworICBFcnJvciBoYW5kbGVSZWdpc3RlckVIRnJhbWVzKEpJVFRhcmdldEFkZHJlc3MgVEFkZHIsIHVpbnQzMl90IFNpemUpIHsKKyAgICB1aW50OF90ICpBZGRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oVEFkZHIpKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgUmVnaXN0ZXJpbmcgRUggZnJhbWVzIGF0ICIgPDwgZm9ybWF0KCIweCUwMTZ4IiwgVEFkZHIpCisgICAgICAgICAgICAgICAgIDw8ICIsIFNpemUgPSAiIDw8IFNpemUgPDwgIiBieXRlc1xuIik7CisgICAgRUhGcmFtZXNSZWdpc3RlcihBZGRyLCBTaXplKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEV4cGVjdGVkPEpJVFRhcmdldEFkZHJlc3M+IGhhbmRsZVJlc2VydmVNZW0oUmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZCBJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplLCB1aW50MzJfdCBBbGlnbikgeworICAgIGF1dG8gSSA9IEFsbG9jYXRvcnMuZmluZChJZCk7CisgICAgaWYgKEkgPT0gQWxsb2NhdG9ycy5lbmQoKSkKKyAgICAgIHJldHVybiBlcnJvckNvZGVUb0Vycm9yKAorICAgICAgICAgICAgICAgb3JjRXJyb3IoT3JjRXJyb3JDb2RlOjpSZW1vdGVBbGxvY2F0b3JEb2VzTm90RXhpc3QpKTsKKyAgICBhdXRvICZBbGxvY2F0b3IgPSBJLT5zZWNvbmQ7CisgICAgdm9pZCAqTG9jYWxBbGxvY0FkZHIgPSBudWxscHRyOworICAgIGlmIChhdXRvIEVyciA9IEFsbG9jYXRvci5hbGxvY2F0ZShMb2NhbEFsbG9jQWRkciwgU2l6ZSwgQWxpZ24pKQorICAgICAgcmV0dXJuIHN0ZDo6bW92ZShFcnIpOworCisgICAgREVCVUcoZGJncygpIDw8ICIgIEFsbG9jYXRvciAiIDw8IElkIDw8ICIgcmVzZXJ2ZWQgIiA8PCBMb2NhbEFsbG9jQWRkcgorICAgICAgICAgICAgICAgICA8PCAiICgiIDw8IFNpemUgPDwgIiBieXRlcywgYWxpZ25tZW50ICIgPDwgQWxpZ24gPDwgIilcbiIpOworCisgICAgSklUVGFyZ2V0QWRkcmVzcyBBbGxvY0FkZHIgPSBzdGF0aWNfY2FzdDxKSVRUYXJnZXRBZGRyZXNzPigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KExvY2FsQWxsb2NBZGRyKSk7CisKKyAgICByZXR1cm4gQWxsb2NBZGRyOworICB9CisKKyAgRXJyb3IgaGFuZGxlU2V0UHJvdGVjdGlvbnMoUmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZCBJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUVGFyZ2V0QWRkcmVzcyBBZGRyLCB1aW50MzJfdCBGbGFncykgeworICAgIGF1dG8gSSA9IEFsbG9jYXRvcnMuZmluZChJZCk7CisgICAgaWYgKEkgPT0gQWxsb2NhdG9ycy5lbmQoKSkKKyAgICAgIHJldHVybiBlcnJvckNvZGVUb0Vycm9yKAorICAgICAgICAgICAgICAgb3JjRXJyb3IoT3JjRXJyb3JDb2RlOjpSZW1vdGVBbGxvY2F0b3JEb2VzTm90RXhpc3QpKTsKKyAgICBhdXRvICZBbGxvY2F0b3IgPSBJLT5zZWNvbmQ7CisgICAgdm9pZCAqTG9jYWxBZGRyID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oQWRkcikpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiICBBbGxvY2F0b3IgIiA8PCBJZCA8PCAiIHNldCBwZXJtaXNzaW9ucyBvbiAiIDw8IExvY2FsQWRkcgorICAgICAgICAgICAgICAgICA8PCAiIHRvICIgPDwgKEZsYWdzICYgc3lzOjpNZW1vcnk6Ok1GX1JFQUQgPyAnUicgOiAnLScpCisgICAgICAgICAgICAgICAgIDw8IChGbGFncyAmIHN5czo6TWVtb3J5OjpNRl9XUklURSA/ICdXJyA6ICctJykKKyAgICAgICAgICAgICAgICAgPDwgKEZsYWdzICYgc3lzOjpNZW1vcnk6Ok1GX0VYRUMgPyAnWCcgOiAnLScpIDw8ICJcbiIpOworICAgIHJldHVybiBBbGxvY2F0b3Iuc2V0UHJvdGVjdGlvbnMoTG9jYWxBZGRyLCBGbGFncyk7CisgIH0KKworICBFcnJvciBoYW5kbGVUZXJtaW5hdGVTZXNzaW9uKCkgeworICAgIFRlcm1pbmF0ZUZsYWcgPSB0cnVlOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgaGFuZGxlV3JpdGVNZW0oRGlyZWN0QnVmZmVyV3JpdGVyIERCVykgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiICBXcml0aW5nICIgPDwgREJXLmdldFNpemUoKSA8PCAiIGJ5dGVzIHRvICIKKyAgICAgICAgICAgICAgICAgPDwgZm9ybWF0KCIweCUwMTZ4IiwgREJXLmdldERzdCgpKSA8PCAiXG4iKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEVycm9yIGhhbmRsZVdyaXRlUHRyKEpJVFRhcmdldEFkZHJlc3MgQWRkciwgSklUVGFyZ2V0QWRkcmVzcyBQdHJWYWwpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgV3JpdGluZyBwb2ludGVyICoiIDw8IGZvcm1hdCgiMHglMDE2eCIsIEFkZHIpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8IGZvcm1hdCgiMHglMDE2eCIsIFB0clZhbCkgPDwgIlxuIik7CisgICAgdWludHB0cl90ICpQdHIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdCAqPihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KEFkZHIpKTsKKyAgICAqUHRyID0gc3RhdGljX2Nhc3Q8dWludHB0cl90PihQdHJWYWwpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgU3ltYm9sTG9va3VwRnRvciBTeW1ib2xMb29rdXA7CisgIEVIRnJhbWVSZWdpc3RyYXRpb25GdG9yIEVIRnJhbWVzUmVnaXN0ZXIsIEVIRnJhbWVzRGVyZWdpc3RlcjsKKyAgc3RkOjptYXA8UmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZCwgQWxsb2NhdG9yPiBBbGxvY2F0b3JzOworICB1c2luZyBJU0Jsb2NrT3duZXJMaXN0ID0gc3RkOjp2ZWN0b3I8dHlwZW5hbWUgVGFyZ2V0VDo6SW5kaXJlY3RTdHVic0luZm8+OworICBzdGQ6Om1hcDxSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkLCBJU0Jsb2NrT3duZXJMaXN0PiBJbmRpcmVjdFN0dWJzT3duZXJzOworICBzeXM6Ok93bmluZ01lbW9yeUJsb2NrIFJlc29sdmVyQmxvY2s7CisgIHN0ZDo6dmVjdG9yPHN5czo6T3duaW5nTWVtb3J5QmxvY2s+IFRyYW1wb2xpbmVCbG9ja3M7CisgIGJvb2wgVGVybWluYXRlRmxhZyA9IGZhbHNlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHJlbW90ZQorfSAvLyBlbmQgbmFtZXNwYWNlIG9yYworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI3VuZGVmIERFQlVHX1RZUEUKKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19PUkNSRU1PVEVUQVJHRVRTRVJWRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL1JQQ1NlcmlhbGl6YXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9SUENTZXJpYWxpemF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5YzUwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9SUENTZXJpYWxpemF0aW9uLmgKQEAgLTAsMCArMSw2MDkgQEAKKy8vPT09LSBsbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvUlBDU2VyaWFsaXphdGlvbi5oIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX1JQQ1NFUklBTElaQVRJT05fSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfUlBDU0VSSUFMSVpBVElPTl9ICisKKyNpbmNsdWRlICJPcmNFcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC90aHJlYWQuaCIKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9yYyB7CituYW1lc3BhY2UgcnBjIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBSUENUeXBlTmFtZTsKKworLy8vIFR5cGVOYW1lU2VxdWVuY2UgaXMgYSB1dGlsaXR5IGZvciByZW5kZXJpbmcgc2VxdWVuY2VzIG9mIHR5cGVzIHRvIGEgc3RyaW5nCisvLy8gYnkgcmVuZGVyaW5nIGVhY2ggdHlwZSwgc2VwYXJhdGVkIGJ5ICIsICIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJnVHM+IGNsYXNzIFJQQ1R5cGVOYW1lU2VxdWVuY2Uge307CisKKy8vLyBSZW5kZXIgYW4gZW1wdHkgVHlwZU5hbWVTZXF1ZW5jZSB0byBhbiBvc3RyZWFtLgordGVtcGxhdGUgPHR5cGVuYW1lIE9TdHJlYW0+CitPU3RyZWFtICZvcGVyYXRvcjw8KE9TdHJlYW0gJk9TLCBjb25zdCBSUENUeXBlTmFtZVNlcXVlbmNlPD4gJlYpIHsKKyAgcmV0dXJuIE9TOworfQorCisvLy8gUmVuZGVyIGEgVHlwZU5hbWVTZXF1ZW5jZSBvZiBhIHNpbmdsZSB0eXBlIHRvIGFuIG9zdHJlYW0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT1N0cmVhbSwgdHlwZW5hbWUgQXJnVD4KK09TdHJlYW0gJm9wZXJhdG9yPDwoT1N0cmVhbSAmT1MsIGNvbnN0IFJQQ1R5cGVOYW1lU2VxdWVuY2U8QXJnVD4gJlYpIHsKKyAgT1MgPDwgUlBDVHlwZU5hbWU8QXJnVD46OmdldE5hbWUoKTsKKyAgcmV0dXJuIE9TOworfQorCisvLy8gUmVuZGVyIGEgVHlwZU5hbWVTZXF1ZW5jZSBvZiBtb3JlIHRoYW4gb25lIHR5cGUgdG8gYW4gb3N0cmVhbS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBPU3RyZWFtLCB0eXBlbmFtZSBBcmdUMSwgdHlwZW5hbWUgQXJnVDIsIHR5cGVuYW1lLi4uIEFyZ1RzPgorT1N0cmVhbSYKK29wZXJhdG9yPDwoT1N0cmVhbSAmT1MsIGNvbnN0IFJQQ1R5cGVOYW1lU2VxdWVuY2U8QXJnVDEsIEFyZ1QyLCBBcmdUcy4uLj4gJlYpIHsKKyAgT1MgPDwgUlBDVHlwZU5hbWU8QXJnVDE+OjpnZXROYW1lKCkgPDwgIiwgIgorICAgICA8PCBSUENUeXBlTmFtZVNlcXVlbmNlPEFyZ1QyLCBBcmdUcy4uLj4oKTsKKyAgcmV0dXJuIE9TOworfQorCit0ZW1wbGF0ZSA8PgorY2xhc3MgUlBDVHlwZU5hbWU8dm9pZD4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpIHsgcmV0dXJuICJ2b2lkIjsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIFJQQ1R5cGVOYW1lPGludDhfdD4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpIHsgcmV0dXJuICJpbnQ4X3QiOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgUlBDVHlwZU5hbWU8dWludDhfdD4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpIHsgcmV0dXJuICJ1aW50OF90IjsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIFJQQ1R5cGVOYW1lPGludDE2X3Q+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKSB7IHJldHVybiAiaW50MTZfdCI7IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBSUENUeXBlTmFtZTx1aW50MTZfdD4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpIHsgcmV0dXJuICJ1aW50MTZfdCI7IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBSUENUeXBlTmFtZTxpbnQzMl90PiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCkgeyByZXR1cm4gImludDMyX3QiOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgUlBDVHlwZU5hbWU8dWludDMyX3Q+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKSB7IHJldHVybiAidWludDMyX3QiOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgUlBDVHlwZU5hbWU8aW50NjRfdD4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpIHsgcmV0dXJuICJpbnQ2NF90IjsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIFJQQ1R5cGVOYW1lPHVpbnQ2NF90PiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCkgeyByZXR1cm4gInVpbnQ2NF90IjsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIFJQQ1R5cGVOYW1lPGJvb2w+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKSB7IHJldHVybiAiYm9vbCI7IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBSUENUeXBlTmFtZTxzdGQ6OnN0cmluZz4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpIHsgcmV0dXJuICJzdGQ6OnN0cmluZyI7IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBSUENUeXBlTmFtZTxFcnJvcj4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpIHsgcmV0dXJuICJFcnJvciI7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUlBDVHlwZU5hbWU8RXhwZWN0ZWQ8VD4+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IExvY2soTmFtZU11dGV4KTsKKyAgICBpZiAoTmFtZS5lbXB0eSgpKQorICAgICAgcmF3X3N0cmluZ19vc3RyZWFtKE5hbWUpIDw8ICJFeHBlY3RlZDwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgUlBDVHlwZU5hbWVTZXF1ZW5jZTxUPigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIj4iOworICAgIHJldHVybiBOYW1lLmRhdGEoKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgc3RkOjptdXRleCBOYW1lTXV0ZXg7CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBOYW1lOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6Om11dGV4IFJQQ1R5cGVOYW1lPEV4cGVjdGVkPFQ+Pjo6TmFtZU11dGV4OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIFJQQ1R5cGVOYW1lPEV4cGVjdGVkPFQ+Pjo6TmFtZTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2NsYXNzIFJQQ1R5cGVOYW1lPHN0ZDo6cGFpcjxUMSwgVDI+PiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBMb2NrKE5hbWVNdXRleCk7CisgICAgaWYgKE5hbWUuZW1wdHkoKSkKKyAgICAgIHJhd19zdHJpbmdfb3N0cmVhbShOYW1lKSA8PCAic3RkOjpwYWlyPCIgPDwgUlBDVHlwZU5hbWVTZXF1ZW5jZTxUMSwgVDI+KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiPiI7CisgICAgcmV0dXJuIE5hbWUuZGF0YSgpOworICB9Citwcml2YXRlOgorICBzdGF0aWMgc3RkOjptdXRleCBOYW1lTXV0ZXg7CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBOYW1lOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0ZDo6bXV0ZXggUlBDVHlwZU5hbWU8c3RkOjpwYWlyPFQxLCBUMj4+OjpOYW1lTXV0ZXg7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RkOjpzdHJpbmcgUlBDVHlwZU5hbWU8c3RkOjpwYWlyPFQxLCBUMj4+OjpOYW1lOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJnVHM+CitjbGFzcyBSUENUeXBlTmFtZTxzdGQ6OnR1cGxlPEFyZ1RzLi4uPj4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gTG9jayhOYW1lTXV0ZXgpOworICAgIGlmIChOYW1lLmVtcHR5KCkpCisgICAgICByYXdfc3RyaW5nX29zdHJlYW0oTmFtZSkgPDwgInN0ZDo6dHVwbGU8IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFJQQ1R5cGVOYW1lU2VxdWVuY2U8QXJnVHMuLi4+KCkgPDwgIj4iOworICAgIHJldHVybiBOYW1lLmRhdGEoKTsKKyAgfQorcHJpdmF0ZToKKyAgc3RhdGljIHN0ZDo6bXV0ZXggTmFtZU11dGV4OworICBzdGF0aWMgc3RkOjpzdHJpbmcgTmFtZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdUcz4KK3N0ZDo6bXV0ZXggUlBDVHlwZU5hbWU8c3RkOjp0dXBsZTxBcmdUcy4uLj4+OjpOYW1lTXV0ZXg7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJnVHM+CitzdGQ6OnN0cmluZyBSUENUeXBlTmFtZTxzdGQ6OnR1cGxlPEFyZ1RzLi4uPj46Ok5hbWU7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUlBDVHlwZU5hbWU8c3RkOjp2ZWN0b3I8VD4+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGNoYXIqZ2V0TmFtZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gTG9jayhOYW1lTXV0ZXgpOworICAgIGlmIChOYW1lLmVtcHR5KCkpCisgICAgICByYXdfc3RyaW5nX29zdHJlYW0oTmFtZSkgPDwgInN0ZDo6dmVjdG9yPCIgPDwgUlBDVHlwZU5hbWU8VD46OmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI+IjsKKyAgICByZXR1cm4gTmFtZS5kYXRhKCk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RhdGljIHN0ZDo6bXV0ZXggTmFtZU11dGV4OworICBzdGF0aWMgc3RkOjpzdHJpbmcgTmFtZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjptdXRleCBSUENUeXBlTmFtZTxzdGQ6OnZlY3RvcjxUPj46Ok5hbWVNdXRleDsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgUlBDVHlwZU5hbWU8c3RkOjp2ZWN0b3I8VD4+OjpOYW1lOworCisKKy8vLyBUaGUgU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgVD4gY2xhc3MgZGVzY3JpYmVzIGhvdyB0byBzZXJpYWxpemUgYW5kCisvLy8gZGVzZXJpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdHlwZSBUIHRvL2Zyb20gYW4gYWJzdHJhY3QgY2hhbm5lbCBvZiB0eXBlCisvLy8gQ2hhbm5lbFQuIEl0IGFsc28gcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSdzIG5hbWUgdmlhIHRoZQorLy8vIGdldE5hbWUgbWV0aG9kLgorLy8vCisvLy8gU3BlY2lhbGl6YXRpb25zIG9mIHRoaXMgY2xhc3Mgc2hvdWxkIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CisvLy8KKy8vLyAgIEBjb2Rley5jcHB9CisvLy8KKy8vLyAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCk7CisvLy8gICBzdGF0aWMgRXJyb3Igc2VyaWFsaXplKENoYW5uZWxUJiwgY29uc3QgVCYpOworLy8vICAgc3RhdGljIEVycm9yIGRlc2VyaWFsaXplKENoYW5uZWxUJiwgVCYpOworLy8vCisvLy8gICBAZW5kY29kZQorLy8vCisvLy8gVGhlIHRoaXJkIGFyZ3VtZW50IG9mIFNlcmlhbGl6YXRpb25UcmFpdHMgaXMgaW50ZW5kZWQgdG8gc3VwcG9ydCBTRklOQUUuCisvLy8gRS5nLjoKKy8vLworLy8vICAgQGNvZGV7LmNwcH0KKy8vLworLy8vICAgY2xhc3MgTXlWaXJ0dWFsQ2hhbm5lbCB7IC4uLiB9OworLy8vCisvLy8gICB0ZW1wbGF0ZSA8RGVyaXZlZENoYW5uZWxUPgorLy8vICAgY2xhc3MgU2VyaWFsaXphdGlvblRyYWl0czxEZXJpdmVkQ2hhbm5lbFQsIGJvb2wsCisvLy8gICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKy8vLyAgICAgICAgICAgc3RkOjppc19iYXNlX29mPFZpcnRDaGFubmVsLCBEZXJpdmVkQ2hhbm5lbD46OnZhbHVlCisvLy8gICAgICAgICA+Ojp0eXBlPiB7CisvLy8gICBwdWJsaWM6CisvLy8gICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCkgeyAuLi4gfTsKKy8vLyAgIH0KKy8vLworLy8vICAgQGVuZGNvZGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUgV2lyZVR5cGUsCisgICAgICAgICAgdHlwZW5hbWUgQ29uY3JldGVUeXBlID0gV2lyZVR5cGUsIHR5cGVuYW1lID0gdm9pZD4KK2NsYXNzIFNlcmlhbGl6YXRpb25UcmFpdHM7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVD4KK2NsYXNzIFNlcXVlbmNlVHJhaXRzIHsKK3B1YmxpYzoKKyAgc3RhdGljIEVycm9yIGVtaXRTZXBhcmF0b3IoQ2hhbm5lbFQgJkMpIHsgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7IH0KKyAgc3RhdGljIEVycm9yIGNvbnN1bWVTZXBhcmF0b3IoQ2hhbm5lbFQgJkMpIHsgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7IH0KK307CisKKy8vLyBVdGlsaXR5IGNsYXNzIGZvciBzZXJpYWxpemluZyBzZXF1ZW5jZXMgb2YgdmFsdWVzIG9mIHZhcnlpbmcgdHlwZXMuCisvLy8gU3BlY2lhbGl6YXRpb25zIG9mIHRoaXMgY2xhc3MgY29udGFpbiAnc2VyaWFsaXplJyBhbmQgJ2Rlc2VyaWFsaXplJyBtZXRob2RzCisvLy8gZm9yIHRoZSBnaXZlbiBjaGFubmVsLiBUaGUgQXJnVHMuLi4gbGlzdCB3aWxsIGRldGVybWluZSB0aGUgIm92ZXItdGhlLXdpcmUiCisvLy8gdHlwZXMgdG8gYmUgc2VyaWFsaXplZC4gVGhlIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgbWV0aG9kcyB0YWtlIGEgbGlzdAorLy8vIENBcmdUcy4uLiAoImNhbGxlciBhcmcgdHlwZXMiKSB3aGljaCBtdXN0IGJlIHRoZSBzYW1lIGxlbmd0aCBhcyBBcmdUcy4uLiwKKy8vLyBidXQgbWF5IGJlIGRpZmZlcmVudCB0eXBlcyBmcm9tIEFyZ1RzLCBwcm92aWRlZCB0aGF0IGZvciBlYWNoIENBcmdUIHRoZXJlCisvLy8gaXMgYSBTZXJpYWxpemF0aW9uVHJhaXRzIHNwZWNpYWxpemF0aW9uCisvLy8gU2VyaWFsaXplVHJhaXRzPENoYW5uZWxULCBBcmdULCBDQXJnVD4gd2l0aCBtZXRob2RzIHRoYXQgY2FuIHNlcmlhbGl6ZSB0aGUKKy8vLyBjYWxsZXIgYXJndW1lbnQgdG8gb3Zlci10aGUtd2lyZSB2YWx1ZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUuLi4gQXJnVHM+CitjbGFzcyBTZXF1ZW5jZVNlcmlhbGl6YXRpb247CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVD4KK2NsYXNzIFNlcXVlbmNlU2VyaWFsaXphdGlvbjxDaGFubmVsVD4geworcHVibGljOgorICBzdGF0aWMgRXJyb3Igc2VyaWFsaXplKENoYW5uZWxUICZDKSB7IHJldHVybiBFcnJvcjo6c3VjY2VzcygpOyB9CisgIHN0YXRpYyBFcnJvciBkZXNlcmlhbGl6ZShDaGFubmVsVCAmQykgeyByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZSBBcmdUPgorY2xhc3MgU2VxdWVuY2VTZXJpYWxpemF0aW9uPENoYW5uZWxULCBBcmdUPiB7CitwdWJsaWM6CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENBcmdUPgorICBzdGF0aWMgRXJyb3Igc2VyaWFsaXplKENoYW5uZWxUICZDLCBDQXJnVCAmJkNBcmcpIHsKKyAgICByZXR1cm4gU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgQXJnVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmRlY2F5PENBcmdUPjo6dHlwZT46OgorICAgICAgICAgICAgIHNlcmlhbGl6ZShDLCBzdGQ6OmZvcndhcmQ8Q0FyZ1Q+KENBcmcpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDQXJnVD4KKyAgc3RhdGljIEVycm9yIGRlc2VyaWFsaXplKENoYW5uZWxUICZDLCBDQXJnVCAmQ0FyZykgeworICAgIHJldHVybiBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBBcmdULCBDQXJnVD46OmRlc2VyaWFsaXplKEMsIENBcmcpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lLi4uIEFyZ1RzPgorY2xhc3MgU2VxdWVuY2VTZXJpYWxpemF0aW9uPENoYW5uZWxULCBBcmdULCBBcmdUcy4uLj4geworcHVibGljOgorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDQXJnVCwgdHlwZW5hbWUuLi4gQ0FyZ1RzPgorICBzdGF0aWMgRXJyb3Igc2VyaWFsaXplKENoYW5uZWxUICZDLCBDQXJnVCAmJkNBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0FyZ1RzICYmLi4uIENBcmdzKSB7CisgICAgaWYgKGF1dG8gRXJyID0KKyAgICAgICAgU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgQXJnVCwgdHlwZW5hbWUgc3RkOjpkZWNheTxDQXJnVD46OnR5cGU+OjoKKyAgICAgICAgICBzZXJpYWxpemUoQywgc3RkOjpmb3J3YXJkPENBcmdUPihDQXJnKSkpCisgICAgICByZXR1cm4gRXJyOworICAgIGlmIChhdXRvIEVyciA9IFNlcXVlbmNlVHJhaXRzPENoYW5uZWxUPjo6ZW1pdFNlcGFyYXRvcihDKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgcmV0dXJuIFNlcXVlbmNlU2VyaWFsaXphdGlvbjxDaGFubmVsVCwgQXJnVHMuLi4+OjoKKyAgICAgICAgICAgICBzZXJpYWxpemUoQywgc3RkOjpmb3J3YXJkPENBcmdUcz4oQ0FyZ3MpLi4uKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDQXJnVCwgdHlwZW5hbWUuLi4gQ0FyZ1RzPgorICBzdGF0aWMgRXJyb3IgZGVzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIENBcmdUICZDQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FyZ1RzICYuLi4gQ0FyZ3MpIHsKKyAgICBpZiAoYXV0byBFcnIgPQorICAgICAgICBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBBcmdULCBDQXJnVD46OmRlc2VyaWFsaXplKEMsIENBcmcpKQorICAgICAgcmV0dXJuIEVycjsKKyAgICBpZiAoYXV0byBFcnIgPSBTZXF1ZW5jZVRyYWl0czxDaGFubmVsVD46OmNvbnN1bWVTZXBhcmF0b3IoQykpCisgICAgICByZXR1cm4gRXJyOworICAgIHJldHVybiBTZXF1ZW5jZVNlcmlhbGl6YXRpb248Q2hhbm5lbFQsIEFyZ1RzLi4uPjo6ZGVzZXJpYWxpemUoQywgQ0FyZ3MuLi4pOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorRXJyb3Igc2VyaWFsaXplU2VxKENoYW5uZWxUICZDLCBBcmdUcyAmJi4uLiBBcmdzKSB7CisgIHJldHVybiBTZXF1ZW5jZVNlcmlhbGl6YXRpb248Q2hhbm5lbFQsIHR5cGVuYW1lIHN0ZDo6ZGVjYXk8QXJnVHM+Ojp0eXBlLi4uPjo6CisgICAgICAgICAgIHNlcmlhbGl6ZShDLCBzdGQ6OmZvcndhcmQ8QXJnVHM+KEFyZ3MpLi4uKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZS4uLiBBcmdUcz4KK0Vycm9yIGRlc2VyaWFsaXplU2VxKENoYW5uZWxUICZDLCBBcmdUcyAmLi4uIEFyZ3MpIHsKKyAgcmV0dXJuIFNlcXVlbmNlU2VyaWFsaXphdGlvbjxDaGFubmVsVCwgQXJnVHMuLi4+OjpkZXNlcmlhbGl6ZShDLCBBcmdzLi4uKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxUPgorY2xhc3MgU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgRXJyb3I+IHsKK3B1YmxpYzoKKworICB1c2luZyBXcmFwcGVkRXJyb3JTZXJpYWxpemVyID0KKyAgICBzdGQ6OmZ1bmN0aW9uPEVycm9yKENoYW5uZWxUICZDLCBjb25zdCBFcnJvckluZm9CYXNlJik+OworCisgIHVzaW5nIFdyYXBwZWRFcnJvckRlc2VyaWFsaXplciA9CisgICAgc3RkOjpmdW5jdGlvbjxFcnJvcihDaGFubmVsVCAmQywgRXJyb3IgJkVycik+OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBFcnJvckluZm9ULCB0eXBlbmFtZSBTZXJpYWxpemVGdG9yLAorICAgICAgICAgICAgdHlwZW5hbWUgRGVzZXJpYWxpemVGdG9yPgorICBzdGF0aWMgdm9pZCByZWdpc3RlckVycm9yVHlwZShzdGQ6OnN0cmluZyBOYW1lLCBTZXJpYWxpemVGdG9yIFNlcmlhbGl6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzZXJpYWxpemVGdG9yIERlc2VyaWFsaXplKSB7CisgICAgYXNzZXJ0KCFOYW1lLmVtcHR5KCkgJiYKKyAgICAgICAgICAgIlRoZSBlbXB0eSBzdHJpbmcgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBTdWNjZXNzIHZhbHVlIik7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAqS2V5TmFtZSA9IG51bGxwdHI7CisgICAgeworICAgICAgLy8gV2UncmUgYWJ1c2luZyB0aGUgc3RhYmlsaXR5IG9mIHN0ZDo6bWFwIGhlcmU6IFdlIHRha2UgYSByZWZlcmVuY2UgdG8gdGhlCisgICAgICAvLyBrZXkgb2YgdGhlIGRlc2VyaWFsaXplcnMgbWFwIHRvIHNhdmUgdXMgZnJvbSBkdXBsaWNhdGluZyB0aGUgc3RyaW5nIGluCisgICAgICAvLyB0aGUgc2VyaWFsaXplci4gVGhpcyBzaG91bGQgYmUgY2hhbmdlZCB0byB1c2UgYSBzdHJpbmdwb29sIGlmIHdlIHN3aXRjaAorICAgICAgLy8gdG8gYSBtYXAgdHlwZSB0aGF0IG1heSBtb3ZlIGtleXMgaW4gbWVtb3J5LgorICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBMb2NrKERlc2VyaWFsaXplcnNNdXRleCk7CisgICAgICBhdXRvIEkgPQorICAgICAgICBEZXNlcmlhbGl6ZXJzLmluc2VydChEZXNlcmlhbGl6ZXJzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKHN0ZDo6bW92ZShOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKERlc2VyaWFsaXplKSkpOworICAgICAgS2V5TmFtZSA9ICZJLT5maXJzdDsKKyAgICB9CisKKyAgICB7CisgICAgICBhc3NlcnQoS2V5TmFtZSAhPSBudWxscHRyICYmICJObyBrZXluYW1lIHBvaW50ZXIiKTsKKyAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gTG9jayhTZXJpYWxpemVyc011dGV4KTsKKyAgICAgIC8vIEZJWE1FOiBNb3ZlIGNhcHR1cmUgU2VyaWFsaXplIG9uY2Ugd2UgaGF2ZSBDKysxNC4KKyAgICAgIFNlcmlhbGl6ZXJzW0Vycm9ySW5mb1Q6OmNsYXNzSUQoKV0gPQorICAgICAgICAgIFtLZXlOYW1lLCBTZXJpYWxpemVdKENoYW5uZWxUICZDLCBjb25zdCBFcnJvckluZm9CYXNlICZFSUIpIC0+IEVycm9yIHsKKyAgICAgICAgYXNzZXJ0KEVJQi5keW5hbWljQ2xhc3NJRCgpID09IEVycm9ySW5mb1Q6OmNsYXNzSUQoKSAmJgorICAgICAgICAgICAgICAgIlNlcmlhbGl6ZXIgY2FsbGVkIGZvciB3cm9uZyBlcnJvciB0eXBlIik7CisgICAgICAgIGlmIChhdXRvIEVyciA9IHNlcmlhbGl6ZVNlcShDLCAqS2V5TmFtZSkpCisgICAgICAgICAgcmV0dXJuIEVycjsKKyAgICAgICAgcmV0dXJuIFNlcmlhbGl6ZShDLCBzdGF0aWNfY2FzdDxjb25zdCBFcnJvckluZm9UICY+KEVJQikpOworICAgICAgfTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgRXJyb3Igc2VyaWFsaXplKENoYW5uZWxUICZDLCBFcnJvciAmJkVycikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gTG9jayhTZXJpYWxpemVyc011dGV4KTsKKworICAgIGlmICghRXJyKQorICAgICAgcmV0dXJuIHNlcmlhbGl6ZVNlcShDLCBzdGQ6OnN0cmluZygpKTsKKworICAgIHJldHVybiBoYW5kbGVFcnJvcnMoc3RkOjptb3ZlKEVyciksCisgICAgICAgICAgICAgICAgICAgICAgICBbJkNdKGNvbnN0IEVycm9ySW5mb0Jhc2UgJkVJQikgeworICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIFNJID0gU2VyaWFsaXplcnMuZmluZChFSUIuZHluYW1pY0NsYXNzSUQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTSSA9PSBTZXJpYWxpemVycy5lbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplQXNTdHJpbmdFcnJvcihDLCBFSUIpOworICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFNJLT5zZWNvbmQpKEMsIEVJQik7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgfQorCisgIHN0YXRpYyBFcnJvciBkZXNlcmlhbGl6ZShDaGFubmVsVCAmQywgRXJyb3IgJkVycikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gTG9jayhEZXNlcmlhbGl6ZXJzTXV0ZXgpOworCisgICAgc3RkOjpzdHJpbmcgS2V5OworICAgIGlmIChhdXRvIEVyciA9IGRlc2VyaWFsaXplU2VxKEMsIEtleSkpCisgICAgICByZXR1cm4gRXJyOworCisgICAgaWYgKEtleS5lbXB0eSgpKSB7CisgICAgICBFcnJvckFzT3V0UGFyYW1ldGVyIEVBTygmRXJyKTsKKyAgICAgIEVyciA9IEVycm9yOjpzdWNjZXNzKCk7CisgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICBhdXRvIERJID0gRGVzZXJpYWxpemVycy5maW5kKEtleSk7CisgICAgYXNzZXJ0KERJICE9IERlc2VyaWFsaXplcnMuZW5kKCkgJiYgIk5vIGRlc2VyaWFsaXplciBmb3IgZXJyb3IgdHlwZSIpOworICAgIHJldHVybiAoREktPnNlY29uZCkoQywgRXJyKTsKKyAgfQorCitwcml2YXRlOgorCisgIHN0YXRpYyBFcnJvciBzZXJpYWxpemVBc1N0cmluZ0Vycm9yKENoYW5uZWxUICZDLCBjb25zdCBFcnJvckluZm9CYXNlICZFSUIpIHsKKyAgICBzdGQ6OnN0cmluZyBFcnJNc2c7CisgICAgeworICAgICAgcmF3X3N0cmluZ19vc3RyZWFtIEVyck1zZ1N0cmVhbShFcnJNc2cpOworICAgICAgRUlCLmxvZyhFcnJNc2dTdHJlYW0pOworICAgIH0KKyAgICByZXR1cm4gc2VyaWFsaXplKEMsIG1ha2VfZXJyb3I8U3RyaW5nRXJyb3I+KHN0ZDo6bW92ZShFcnJNc2cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb252ZXJ0aWJsZUVycm9yQ29kZSgpKSk7CisgIH0KKworICBzdGF0aWMgc3RkOjpyZWN1cnNpdmVfbXV0ZXggU2VyaWFsaXplcnNNdXRleDsKKyAgc3RhdGljIHN0ZDo6cmVjdXJzaXZlX211dGV4IERlc2VyaWFsaXplcnNNdXRleDsKKyAgc3RhdGljIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCBXcmFwcGVkRXJyb3JTZXJpYWxpemVyPiBTZXJpYWxpemVyczsKKyAgc3RhdGljIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBXcmFwcGVkRXJyb3JEZXNlcmlhbGl6ZXI+IERlc2VyaWFsaXplcnM7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQ+CitzdGQ6OnJlY3Vyc2l2ZV9tdXRleCBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBFcnJvcj46OlNlcmlhbGl6ZXJzTXV0ZXg7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVD4KK3N0ZDo6cmVjdXJzaXZlX211dGV4IFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIEVycm9yPjo6RGVzZXJpYWxpemVyc011dGV4OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQ+CitzdGQ6Om1hcDxjb25zdCB2b2lkKiwKKyAgICAgICAgIHR5cGVuYW1lIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIEVycm9yPjo6V3JhcHBlZEVycm9yU2VyaWFsaXplcj4KK1NlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIEVycm9yPjo6U2VyaWFsaXplcnM7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVD4KK3N0ZDo6bWFwPHN0ZDo6c3RyaW5nLAorICAgICAgICAgdHlwZW5hbWUgU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgRXJyb3I+OjpXcmFwcGVkRXJyb3JEZXNlcmlhbGl6ZXI+CitTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBFcnJvcj46OkRlc2VyaWFsaXplcnM7CisKKy8vLyBSZWdpc3RlcnMgYSBzZXJpYWxpemVyIGFuZCBkZXNlcmlhbGl6ZXIgZm9yIHRoZSBnaXZlbiBlcnJvciB0eXBlIG9uIHRoZQorLy8vIGdpdmVuIGNoYW5uZWwgdHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUgRXJyb3JJbmZvVCwgdHlwZW5hbWUgU2VyaWFsaXplRnRvciwKKyAgICAgICAgICB0eXBlbmFtZSBEZXNlcmlhbGl6ZUZ0b3I+Cit2b2lkIHJlZ2lzdGVyRXJyb3JTZXJpYWxpemF0aW9uKHN0ZDo6c3RyaW5nIE5hbWUsIFNlcmlhbGl6ZUZ0b3IgJiZTZXJpYWxpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2VyaWFsaXplRnRvciAmJkRlc2VyaWFsaXplKSB7CisgIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIEVycm9yPjo6dGVtcGxhdGUgcmVnaXN0ZXJFcnJvclR5cGU8RXJyb3JJbmZvVD4oCisgICAgc3RkOjptb3ZlKE5hbWUpLAorICAgIHN0ZDo6Zm9yd2FyZDxTZXJpYWxpemVGdG9yPihTZXJpYWxpemUpLAorICAgIHN0ZDo6Zm9yd2FyZDxEZXNlcmlhbGl6ZUZ0b3I+KERlc2VyaWFsaXplKSk7Cit9CisKKy8vLyBSZWdpc3RlcnMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gZm9yIFN0cmluZ0Vycm9yLgordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxUPgordm9pZCByZWdpc3RlclN0cmluZ0Vycm9yKCkgeworICBzdGF0aWMgYm9vbCBBbHJlYWR5UmVnaXN0ZXJlZCA9IGZhbHNlOworICBpZiAoIUFscmVhZHlSZWdpc3RlcmVkKSB7CisgICAgcmVnaXN0ZXJFcnJvclNlcmlhbGl6YXRpb248Q2hhbm5lbFQsIFN0cmluZ0Vycm9yPigKKyAgICAgICJTdHJpbmdFcnJvciIsCisgICAgICBbXShDaGFubmVsVCAmQywgY29uc3QgU3RyaW5nRXJyb3IgJlNFKSB7CisgICAgICAgIHJldHVybiBzZXJpYWxpemVTZXEoQywgU0UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0sCisgICAgICBbXShDaGFubmVsVCAmQywgRXJyb3IgJkVycikgLT4gRXJyb3IgeworICAgICAgICBFcnJvckFzT3V0UGFyYW1ldGVyIEVBTygmRXJyKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgTXNnOworICAgICAgICBpZiAoYXV0byBFMiA9IGRlc2VyaWFsaXplU2VxKEMsIE1zZykpCisgICAgICAgICAgcmV0dXJuIEUyOworICAgICAgICBFcnIgPQorICAgICAgICAgIG1ha2VfZXJyb3I8U3RyaW5nRXJyb3I+KHN0ZDo6bW92ZShNc2cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yY0Vycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JjRXJyb3JDb2RlOjpVbmtub3duRXJyb3JDb2RlRnJvbVJlbW90ZSkpOworICAgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICAgIH0pOworICAgIEFscmVhZHlSZWdpc3RlcmVkID0gdHJ1ZTsKKyAgfQorfQorCisvLy8gU2VyaWFsaXphdGlvblRyYWl0cyBmb3IgRXhwZWN0ZWQ8VDE+IGZyb20gYW4gRXhwZWN0ZWQ8VDI+LgordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitjbGFzcyBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBFeHBlY3RlZDxUMT4sIEV4cGVjdGVkPFQyPj4geworcHVibGljOgorCisgIHN0YXRpYyBFcnJvciBzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIEV4cGVjdGVkPFQyPiAmJlZhbE9yRXJyKSB7CisgICAgaWYgKFZhbE9yRXJyKSB7CisgICAgICBpZiAoYXV0byBFcnIgPSBzZXJpYWxpemVTZXEoQywgdHJ1ZSkpCisgICAgICAgIHJldHVybiBFcnI7CisgICAgICByZXR1cm4gU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgVDEsIFQyPjo6c2VyaWFsaXplKEMsICpWYWxPckVycik7CisgICAgfQorICAgIGlmIChhdXRvIEVyciA9IHNlcmlhbGl6ZVNlcShDLCBmYWxzZSkpCisgICAgICByZXR1cm4gRXJyOworICAgIHJldHVybiBzZXJpYWxpemVTZXEoQywgVmFsT3JFcnIudGFrZUVycm9yKCkpOworICB9CisKKyAgc3RhdGljIEVycm9yIGRlc2VyaWFsaXplKENoYW5uZWxUICZDLCBFeHBlY3RlZDxUMj4gJlZhbE9yRXJyKSB7CisgICAgRXhwZWN0ZWRBc091dFBhcmFtZXRlcjxUMj4gRUFPKCZWYWxPckVycik7CisgICAgYm9vbCBIYXNWYWx1ZTsKKyAgICBpZiAoYXV0byBFcnIgPSBkZXNlcmlhbGl6ZVNlcShDLCBIYXNWYWx1ZSkpCisgICAgICByZXR1cm4gRXJyOworICAgIGlmIChIYXNWYWx1ZSkKKyAgICAgIHJldHVybiBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBUMSwgVDI+OjpkZXNlcmlhbGl6ZShDLCAqVmFsT3JFcnIpOworICAgIEVycm9yIEVyciA9IEVycm9yOjpzdWNjZXNzKCk7CisgICAgaWYgKGF1dG8gRTIgPSBkZXNlcmlhbGl6ZVNlcShDLCBFcnIpKQorICAgICAgcmV0dXJuIEUyOworICAgIFZhbE9yRXJyID0gc3RkOjptb3ZlKEVycik7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KK307CisKKy8vLyBTZXJpYWxpemF0aW9uVHJhaXRzIGZvciBFeHBlY3RlZDxUMT4gZnJvbSBhIFQyLgordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitjbGFzcyBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBFeHBlY3RlZDxUMT4sIFQyPiB7CitwdWJsaWM6CisKKyAgc3RhdGljIEVycm9yIHNlcmlhbGl6ZShDaGFubmVsVCAmQywgVDIgJiZWYWwpIHsKKyAgICByZXR1cm4gc2VyaWFsaXplU2VxKEMsIEV4cGVjdGVkPFQyPihzdGQ6OmZvcndhcmQ8VDI+KFZhbCkpKTsKKyAgfQorfTsKKworLy8vIFNlcmlhbGl6YXRpb25UcmFpdHMgZm9yIEV4cGVjdGVkPFQxPiBmcm9tIGFuIEVycm9yLgordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZSBUPgorY2xhc3MgU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgRXhwZWN0ZWQ8VD4sIEVycm9yPiB7CitwdWJsaWM6CisKKyAgc3RhdGljIEVycm9yIHNlcmlhbGl6ZShDaGFubmVsVCAmQywgRXJyb3IgJiZFcnIpIHsKKyAgICByZXR1cm4gc2VyaWFsaXplU2VxKEMsIEV4cGVjdGVkPFQ+KHN0ZDo6bW92ZShFcnIpKSk7CisgIH0KK307CisKKy8vLyBTZXJpYWxpemF0aW9uVHJhaXRzIGRlZmF1bHQgc3BlY2lhbGl6YXRpb24gZm9yIHN0ZDo6cGFpci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorY2xhc3MgU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgc3RkOjpwYWlyPFQxLCBUMj4+IHsKK3B1YmxpYzoKKyAgc3RhdGljIEVycm9yIHNlcmlhbGl6ZShDaGFubmVsVCAmQywgY29uc3Qgc3RkOjpwYWlyPFQxLCBUMj4gJlYpIHsKKyAgICByZXR1cm4gc2VyaWFsaXplU2VxKEMsIFYuZmlyc3QsIFYuc2Vjb25kKTsKKyAgfQorCisgIHN0YXRpYyBFcnJvciBkZXNlcmlhbGl6ZShDaGFubmVsVCAmQywgc3RkOjpwYWlyPFQxLCBUMj4gJlYpIHsKKyAgICByZXR1cm4gZGVzZXJpYWxpemVTZXEoQywgVi5maXJzdCwgVi5zZWNvbmQpOworICB9Cit9OworCisvLy8gU2VyaWFsaXphdGlvblRyYWl0cyBkZWZhdWx0IHNwZWNpYWxpemF0aW9uIGZvciBzdGQ6OnR1cGxlLgordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZS4uLiBBcmdUcz4KK2NsYXNzIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIHN0ZDo6dHVwbGU8QXJnVHMuLi4+PiB7CitwdWJsaWM6CisKKyAgLy8vIFJQQyBjaGFubmVsIHNlcmlhbGl6YXRpb24gZm9yIHN0ZDo6dHVwbGUuCisgIHN0YXRpYyBFcnJvciBzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIGNvbnN0IHN0ZDo6dHVwbGU8QXJnVHMuLi4+ICZWKSB7CisgICAgcmV0dXJuIHNlcmlhbGl6ZVR1cGxlSGVscGVyKEMsIFYsIGxsdm06OmluZGV4X3NlcXVlbmNlX2ZvcjxBcmdUcy4uLj4oKSk7CisgIH0KKworICAvLy8gUlBDIGNoYW5uZWwgZGVzZXJpYWxpemF0aW9uIGZvciBzdGQ6OnR1cGxlLgorICBzdGF0aWMgRXJyb3IgZGVzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIHN0ZDo6dHVwbGU8QXJnVHMuLi4+ICZWKSB7CisgICAgcmV0dXJuIGRlc2VyaWFsaXplVHVwbGVIZWxwZXIoQywgViwgbGx2bTo6aW5kZXhfc2VxdWVuY2VfZm9yPEFyZ1RzLi4uPigpKTsKKyAgfQorCitwcml2YXRlOgorICAvLyBTZXJpYWxpemF0aW9uIGhlbHBlciBmb3Igc3RkOjp0dXBsZS4KKyAgdGVtcGxhdGUgPHNpemVfdC4uLiBJcz4KKyAgc3RhdGljIEVycm9yIHNlcmlhbGl6ZVR1cGxlSGVscGVyKENoYW5uZWxUICZDLCBjb25zdCBzdGQ6OnR1cGxlPEFyZ1RzLi4uPiAmViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmluZGV4X3NlcXVlbmNlPElzLi4uPiBfKSB7CisgICAgcmV0dXJuIHNlcmlhbGl6ZVNlcShDLCBzdGQ6OmdldDxJcz4oVikuLi4pOworICB9CisKKyAgLy8gU2VyaWFsaXphdGlvbiBoZWxwZXIgZm9yIHN0ZDo6dHVwbGUuCisgIHRlbXBsYXRlIDxzaXplX3QuLi4gSXM+CisgIHN0YXRpYyBFcnJvciBkZXNlcmlhbGl6ZVR1cGxlSGVscGVyKENoYW5uZWxUICZDLCBzdGQ6OnR1cGxlPEFyZ1RzLi4uPiAmViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6aW5kZXhfc2VxdWVuY2U8SXMuLi4+IF8pIHsKKyAgICByZXR1cm4gZGVzZXJpYWxpemVTZXEoQywgc3RkOjpnZXQ8SXM+KFYpLi4uKTsKKyAgfQorfTsKKworLy8vIFNlcmlhbGl6YXRpb25UcmFpdHMgZGVmYXVsdCBzcGVjaWFsaXphdGlvbiBmb3Igc3RkOjp2ZWN0b3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lIFQ+CitjbGFzcyBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBzdGQ6OnZlY3RvcjxUPj4geworcHVibGljOgorCisgIC8vLyBTZXJpYWxpemUgYSBzdGQ6OnZlY3RvcjxUPiBmcm9tIHN0ZDo6dmVjdG9yPFQ+LgorICBzdGF0aWMgRXJyb3Igc2VyaWFsaXplKENoYW5uZWxUICZDLCBjb25zdCBzdGQ6OnZlY3RvcjxUPiAmVikgeworICAgIGlmIChhdXRvIEVyciA9IHNlcmlhbGl6ZVNlcShDLCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oVi5zaXplKCkpKSkKKyAgICAgIHJldHVybiBFcnI7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkUgOiBWKQorICAgICAgaWYgKGF1dG8gRXJyID0gc2VyaWFsaXplU2VxKEMsIEUpKQorICAgICAgICByZXR1cm4gRXJyOworCisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICAvLy8gRGVzZXJpYWxpemUgYSBzdGQ6OnZlY3RvcjxUPiB0byBhIHN0ZDo6dmVjdG9yPFQ+LgorICBzdGF0aWMgRXJyb3IgZGVzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIHN0ZDo6dmVjdG9yPFQ+ICZWKSB7CisgICAgdWludDY0X3QgQ291bnQgPSAwOworICAgIGlmIChhdXRvIEVyciA9IGRlc2VyaWFsaXplU2VxKEMsIENvdW50KSkKKyAgICAgIHJldHVybiBFcnI7CisKKyAgICBWLnJlc2l6ZShDb3VudCk7CisgICAgZm9yIChhdXRvICZFIDogVikKKyAgICAgIGlmIChhdXRvIEVyciA9IGRlc2VyaWFsaXplU2VxKEMsIEUpKQorICAgICAgICByZXR1cm4gRXJyOworCisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBycGMKK30gLy8gZW5kIG5hbWVzcGFjZSBvcmMKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfUlBDU0VSSUFMSVpBVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvUlBDVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9SUENVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNzhjYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvUlBDVXRpbHMuaApAQCAtMCwwICsxLDE3NTIgQEAKKy8vPT09LS0tLS0tLSBSUENVVGlscy5oIC0gVXRpbGl0aWVzIGZvciBidWlsZGluZyBSUEMgQVBJcyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVXRpbGl0aWVzIHRvIHN1cHBvcnQgY29uc3RydWN0aW9uIG9mIHNpbXBsZSBSUEMgQVBJcy4KKy8vCisvLyBUaGUgUlBDIHV0aWxpdGllcyBhaW0gZm9yIGVhc2Ugb2YgdXNlIChtaW5pbWFsIGNvbmNlcHR1YWwgb3ZlcmhlYWQpIGZvciBDKysKKy8vIHByb2dyYW1tZXJzLCBoaWdoIHBlcmZvcm1hbmNlLCBsb3cgbWVtb3J5IG92ZXJoZWFkLCBhbmQgZWZmaWNpZW50IHVzZSBvZiB0aGUKKy8vIGNvbW11bmljYXRpb25zIGNoYW5uZWwuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfUlBDVVRJTFNfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfUlBDVVRJTFNfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT3JjRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvUlBDU2VyaWFsaXphdGlvbi5oIgorCisjaW5jbHVkZSA8ZnV0dXJlPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb3JjIHsKK25hbWVzcGFjZSBycGMgeworCisvLy8gQmFzZSBjbGFzcyBvZiBhbGwgZmF0YWwgUlBDIGVycm9ycyAodGhvc2UgdGhhdCBuZWNlc3NhcmlseSByZXN1bHQgaW4gdGhlCisvLy8gdGVybWluYXRpb24gb2YgdGhlIFJQQyBzZXNzaW9uKS4KK2NsYXNzIFJQQ0ZhdGFsRXJyb3IgOiBwdWJsaWMgRXJyb3JJbmZvPFJQQ0ZhdGFsRXJyb3I+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7Cit9OworCisvLy8gUlBDQ29ubmVjdGlvbkNsb3NlZCBpcyByZXR1cm5lZCBmcm9tIFJQQyBvcGVyYXRpb25zIGlmIHRoZSBSUEMgY29ubmVjdGlvbgorLy8vIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIGR1ZSB0byBlaXRoZXIgYW4gZXJyb3Igb3IgZ3JhY2VmdWwgZGlzY29ubmVjdGlvbi4KK2NsYXNzIENvbm5lY3Rpb25DbG9zZWQgOiBwdWJsaWMgRXJyb3JJbmZvPENvbm5lY3Rpb25DbG9zZWQ+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIHN0ZDo6ZXJyb3JfY29kZSBjb252ZXJ0VG9FcnJvckNvZGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBsb2cocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyBCYWRGdW5jdGlvbkNhbGwgaXMgcmV0dXJuZWQgZnJvbSBoYW5kbGVPbmUgd2hlbiB0aGUgcmVtb3RlIG1ha2VzIGEgY2FsbCB3aXRoCisvLy8gYW4gdW5yZWNvZ25pemVkIGZ1bmN0aW9uIGlkLgorLy8vCisvLy8gVGhpcyBlcnJvciBpcyBmYXRhbCBiZWNhdXNlIE9yYyBSUEMgbmVlZHMgdG8ga25vdyBob3cgdG8gcGFyc2UgYSBmdW5jdGlvbgorLy8vIGNhbGwgdG8ga25vdyB3aGVyZSB0aGUgbmV4dCBjYWxsIHN0YXJ0cywgYW5kIGlmIGl0IGRvZXNuJ3QgcmVjb2duaXplIHRoZQorLy8vIGZ1bmN0aW9uIGlkIGl0IGNhbm5vdCBwYXJzZSB0aGUgY2FsbC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGbklkVCwgdHlwZW5hbWUgU2VxTm9UPgorY2xhc3MgQmFkRnVuY3Rpb25DYWxsCisgIDogcHVibGljIEVycm9ySW5mbzxCYWRGdW5jdGlvbkNhbGw8Rm5JZFQsIFNlcU5vVD4sIFJQQ0ZhdGFsRXJyb3I+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgQmFkRnVuY3Rpb25DYWxsKEZuSWRUIEZuSWQsIFNlcU5vVCBTZXFObykKKyAgICAgIDogRm5JZChzdGQ6Om1vdmUoRm5JZCkpLCBTZXFObyhzdGQ6Om1vdmUoU2VxTm8pKSB7fQorCisgIHN0ZDo6ZXJyb3JfY29kZSBjb252ZXJ0VG9FcnJvckNvZGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIG9yY0Vycm9yKE9yY0Vycm9yQ29kZTo6VW5leHBlY3RlZFJQQ0NhbGwpOworICB9CisKKyAgdm9pZCBsb2cocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CisgICAgT1MgPDwgIkNhbGwgdG8gaW52YWxpZCBSUEMgZnVuY3Rpb24gaWQgJyIgPDwgRm5JZCA8PCAiJyB3aXRoICIKKyAgICAgICAgICAic2VxdWVuY2UgbnVtYmVyICIgPDwgU2VxTm87CisgIH0KKworcHJpdmF0ZToKKyAgRm5JZFQgRm5JZDsKKyAgU2VxTm9UIFNlcU5vOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZuSWRULCB0eXBlbmFtZSBTZXFOb1Q+CitjaGFyIEJhZEZ1bmN0aW9uQ2FsbDxGbklkVCwgU2VxTm9UPjo6SUQgPSAwOworCisvLy8gSW52YWxpZFNlcXVlbmNlTnVtYmVyRm9yUmVzcG9uc2UgaXMgcmV0dXJuZWQgZnJvbSBoYW5kbGVPbmUgd2hlbiBhIHJlc3BvbnNlCisvLy8gY2FsbCBhcnJpdmVzIHdpdGggYSBzZXF1ZW5jZSBudW1iZXIgdGhhdCBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYW55IGluLWZsaWdodAorLy8vIGZ1bmN0aW9uIGNhbGwuCisvLy8KKy8vLyBUaGlzIGVycm9yIGlzIGZhdGFsIGJlY2F1c2UgT3JjIFJQQyBuZWVkcyB0byBrbm93IGhvdyB0byBwYXJzZSB0aGUgcmVzdCBvZgorLy8vIHRoZSByZXNwb25zZSBjYWxsIHRvIGtub3cgd2hlcmUgdGhlIG5leHQgY2FsbCBzdGFydHMsIGFuZCBpZiBpdCBkb2Vzbid0IGhhdmUKKy8vLyBhIHJlc3VsdCBwYXJzZXIgZm9yIHRoaXMgc2VxdWVuY2UgbnVtYmVyIGl0IGNhbid0IGRvIHRoYXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VxTm9UPgorY2xhc3MgSW52YWxpZFNlcXVlbmNlTnVtYmVyRm9yUmVzcG9uc2UKKyAgICA6IHB1YmxpYyBFcnJvckluZm88SW52YWxpZFNlcXVlbmNlTnVtYmVyRm9yUmVzcG9uc2U8U2VxTm9UPiwgUlBDRmF0YWxFcnJvcj4geworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBJbnZhbGlkU2VxdWVuY2VOdW1iZXJGb3JSZXNwb25zZShTZXFOb1QgU2VxTm8pCisgICAgICA6IFNlcU5vKHN0ZDo6bW92ZShTZXFObykpIHt9CisKKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gb3JjRXJyb3IoT3JjRXJyb3JDb2RlOjpVbmV4cGVjdGVkUlBDQ2FsbCk7CisgIH07CisKKyAgdm9pZCBsb2cocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CisgICAgT1MgPDwgIlJlc3BvbnNlIGhhcyB1bmtub3duIHNlcXVlbmNlIG51bWJlciAiIDw8IFNlcU5vOworICB9Citwcml2YXRlOgorICBTZXFOb1QgU2VxTm87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VxTm9UPgorY2hhciBJbnZhbGlkU2VxdWVuY2VOdW1iZXJGb3JSZXNwb25zZTxTZXFOb1Q+OjpJRCA9IDA7CisKKy8vLyBUaGlzIG5vbi1mYXRhbCBlcnJvciB3aWxsIGJlIHBhc3NlZCB0byBhc3luY2hyb25vdXMgcmVzdWx0IGhhbmRsZXJzIGluIHBsYWNlCisvLy8gb2YgYSByZXN1bHQgaWYgdGhlIGNvbm5lY3Rpb24gZ29lcyBkb3duIGJlZm9yZSBhIHJlc3VsdCByZXR1cm5zLCBvciBpZiB0aGUKKy8vLyBmdW5jdGlvbiB0byBiZSBjYWxsZWQgY2Fubm90IGJlIG5lZ290aWF0ZWQgd2l0aCB0aGUgcmVtb3RlLgorY2xhc3MgUmVzcG9uc2VBYmFuZG9uZWQgOiBwdWJsaWMgRXJyb3JJbmZvPFJlc3BvbnNlQWJhbmRvbmVkPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIHN0ZDo6ZXJyb3JfY29kZSBjb252ZXJ0VG9FcnJvckNvZGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBsb2cocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyBUaGlzIGVycm9yIGlzIHJldHVybmVkIGlmIHRoZSByZW1vdGUgZG9lcyBub3QgaGF2ZSBhIGhhbmRsZXIgaW5zdGFsbGVkIGZvcgorLy8vIHRoZSBnaXZlbiBSUEMgZnVuY3Rpb24uCitjbGFzcyBDb3VsZE5vdE5lZ290aWF0ZSA6IHB1YmxpYyBFcnJvckluZm88Q291bGROb3ROZWdvdGlhdGU+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgQ291bGROb3ROZWdvdGlhdGUoc3RkOjpzdHJpbmcgU2lnbmF0dXJlKTsKKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0U2lnbmF0dXJlKCkgY29uc3QgeyByZXR1cm4gU2lnbmF0dXJlOyB9Citwcml2YXRlOgorICBzdGQ6OnN0cmluZyBTaWduYXR1cmU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZEZ1bmMsIHR5cGVuYW1lIEZuVD4gY2xhc3MgRnVuY3Rpb247CisKKy8vIFJQQyBGdW5jdGlvbiBjbGFzcy4KKy8vIERlcml2ZWRGdW5jIHNob3VsZCBiZSBhIHVzZXIgZGVmaW5lZCBjbGFzcyB3aXRoIGEgc3RhdGljICdnZXROYW1lKCknIG1ldGhvZAorLy8gcmV0dXJuaW5nIGEgY29uc3QgY2hhciogcmVwcmVzZW50aW5nIHRoZSBmdW5jdGlvbidzIG5hbWUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZEZ1bmMsIHR5cGVuYW1lIFJldFQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorY2xhc3MgRnVuY3Rpb248RGVyaXZlZEZ1bmMsIFJldFQoQXJnVHMuLi4pPiB7CitwdWJsaWM6CisgIC8vLyBVc2VyIGRlZmluZWQgZnVuY3Rpb24gdHlwZS4KKyAgdXNpbmcgVHlwZSA9IFJldFQoQXJnVHMuLi4pOworCisgIC8vLyBSZXR1cm4gdHlwZS4KKyAgdXNpbmcgUmV0dXJuVHlwZSA9IFJldFQ7CisKKyAgLy8vIFJldHVybnMgdGhlIGZ1bGwgZnVuY3Rpb24gcHJvdG90eXBlIGFzIGEgc3RyaW5nLgorICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0UHJvdG90eXBlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBMb2NrKE5hbWVNdXRleCk7CisgICAgaWYgKE5hbWUuZW1wdHkoKSkKKyAgICAgIHJhd19zdHJpbmdfb3N0cmVhbShOYW1lKQorICAgICAgICAgIDw8IFJQQ1R5cGVOYW1lPFJldFQ+OjpnZXROYW1lKCkgPDwgIiAiIDw8IERlcml2ZWRGdW5jOjpnZXROYW1lKCkKKyAgICAgICAgICA8PCAiKCIgPDwgbGx2bTo6b3JjOjpycGM6OlJQQ1R5cGVOYW1lU2VxdWVuY2U8QXJnVHMuLi4+KCkgPDwgIikiOworICAgIHJldHVybiBOYW1lLmRhdGEoKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgc3RkOjptdXRleCBOYW1lTXV0ZXg7CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBOYW1lOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWRGdW5jLCB0eXBlbmFtZSBSZXRULCB0eXBlbmFtZS4uLiBBcmdUcz4KK3N0ZDo6bXV0ZXggRnVuY3Rpb248RGVyaXZlZEZ1bmMsIFJldFQoQXJnVHMuLi4pPjo6TmFtZU11dGV4OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZEZ1bmMsIHR5cGVuYW1lIFJldFQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorc3RkOjpzdHJpbmcgRnVuY3Rpb248RGVyaXZlZEZ1bmMsIFJldFQoQXJnVHMuLi4pPjo6TmFtZTsKKworLy8vIEFsbG9jYXRlcyBSUEMgZnVuY3Rpb24gaWRzIGR1cmluZyBhdXRvbmVnb3RpYXRpb24uCisvLy8gU3BlY2lhbGl6YXRpb25zIG9mIHRoaXMgY2xhc3MgbXVzdCBwcm92aWRlIGZvdXIgbWVtYmVyczoKKy8vLworLy8vIHN0YXRpYyBUIGdldEludmFsaWRJZCgpOgorLy8vICAgU2hvdWxkIHJldHVybiBhIHJlc2VydmVkIGlkIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJlcHJlc2VudCBtaXNzaW5nCisvLy8gZnVuY3Rpb25zIGR1cmluZyBhdXRvbmVnb3RpYXRpb24uCisvLy8KKy8vLyBzdGF0aWMgVCBnZXRSZXNwb25zZUlkKCk6CisvLy8gICBTaG91bGQgcmV0dXJuIGEgcmVzZXJ2ZWQgaWQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2VuZCBmdW5jdGlvbiByZXNwb25zZXMKKy8vLyAocmV0dXJuIHZhbHVlcykuCisvLy8KKy8vLyBzdGF0aWMgVCBnZXROZWdvdGlhdGVJZCgpOgorLy8vICAgU2hvdWxkIHJldHVybiBhIHJlc2VydmVkIGlkIGZvciB0aGUgbmVnb3RpYXRlIGZ1bmN0aW9uLCB3aGljaCB3aWxsIGJlIHVzZWQKKy8vLyB0byBuZWdvdGlhdGUgaWRzIGZvciB1c2VyIGRlZmluZWQgZnVuY3Rpb25zLgorLy8vCisvLy8gdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmM+IFQgYWxsb2NhdGUoKToKKy8vLyAgIEFsbG9jYXRlIGEgdW5pcXVlIGlkIGZvciBmdW5jdGlvbiBGdW5jLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdm9pZD4gY2xhc3MgUlBDRnVuY3Rpb25JZEFsbG9jYXRvcjsKKworLy8vIFRoaXMgc3BlY2lhbGl6YXRpb24gb2YgUlBDRnVuY3Rpb25JZEFsbG9jYXRvciBwcm92aWRlcyBhIGRlZmF1bHQKKy8vLyBpbXBsZW1lbnRhdGlvbiBmb3IgaW50ZWdyYWwgdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFJQQ0Z1bmN0aW9uSWRBbGxvY2F0b3I8CisgICAgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWU+Ojp0eXBlPiB7CitwdWJsaWM6CisgIHN0YXRpYyBUIGdldEludmFsaWRJZCgpIHsgcmV0dXJuIFQoMCk7IH0KKyAgc3RhdGljIFQgZ2V0UmVzcG9uc2VJZCgpIHsgcmV0dXJuIFQoMSk7IH0KKyAgc3RhdGljIFQgZ2V0TmVnb3RpYXRlSWQoKSB7IHJldHVybiBUKDIpOyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmM+IFQgYWxsb2NhdGUoKSB7IHJldHVybiBOZXh0SWQrKzsgfQorCitwcml2YXRlOgorICBUIE5leHRJZCA9IDM7Cit9OworCituYW1lc3BhY2UgZGV0YWlsIHsKKworLy8gRklYTUU6IFJlbW92ZSBNU1ZDUEVycm9yL01TVkNQRXhwZWN0ZWQgb25jZSBNU1ZDJ3MgZnV0dXJlIGltcGxlbWVudGF0aW9uCisvLyAgICAgICAgc3VwcG9ydHMgY2xhc3NlcyB3aXRob3V0IGRlZmF1bHQgY29uc3RydWN0b3JzLgorI2lmZGVmIF9NU0NfVkVSCisKK25hbWVzcGFjZSBtc3ZjX2hhY2tzIHsKKworLy8gV29yayBhcm91bmQgTVNWQydzIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbidzIHVzZSBvZiBkZWZhdWx0IGNvbnN0cnVjdG9yczoKKy8vIEEgZGVmYXVsdCBjb25zdHJ1Y3RlZCB2YWx1ZSBpbiB0aGUgcHJvbWlzZSB3aWxsIGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlCisvLyByZWFsIGVycm9yIGlzIHNldCAtIHNvIHRoZSBkZWZhdWx0IGNvbnN0cnVjdGVkIEVycm9yIGhhcyB0byBiZSBjaGVja2VkCisvLyBhbHJlYWR5LgorY2xhc3MgTVNWQ1BFcnJvciA6IHB1YmxpYyBFcnJvciB7CitwdWJsaWM6CisgIE1TVkNQRXJyb3IoKSB7ICh2b2lkKSEhKnRoaXM7IH0KKworICBNU1ZDUEVycm9yKE1TVkNQRXJyb3IgJiZPdGhlcikgOiBFcnJvcihzdGQ6Om1vdmUoT3RoZXIpKSB7fQorCisgIE1TVkNQRXJyb3IgJm9wZXJhdG9yPShNU1ZDUEVycm9yIE90aGVyKSB7CisgICAgRXJyb3I6Om9wZXJhdG9yPShzdGQ6Om1vdmUoT3RoZXIpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBNU1ZDUEVycm9yKEVycm9yIEVycikgOiBFcnJvcihzdGQ6Om1vdmUoRXJyKSkge30KK307CisKKy8vIFdvcmsgYXJvdW5kIE1TVkMncyBmdXR1cmUgaW1wbGVtZW50YXRpb24sIHNpbWlsYXIgdG8gTVNWQ1BFcnJvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBNU1ZDUEV4cGVjdGVkIDogcHVibGljIEV4cGVjdGVkPFQ+IHsKK3B1YmxpYzoKKyAgTVNWQ1BFeHBlY3RlZCgpCisgICAgICA6IEV4cGVjdGVkPFQ+KG1ha2VfZXJyb3I8U3RyaW5nRXJyb3I+KCIiLCBpbmNvbnZlcnRpYmxlRXJyb3JDb2RlKCkpKSB7CisgICAgY29uc3VtZUVycm9yKHRoaXMtPnRha2VFcnJvcigpKTsKKyAgfQorCisgIE1TVkNQRXhwZWN0ZWQoTVNWQ1BFeHBlY3RlZCAmJk90aGVyKSA6IEV4cGVjdGVkPFQ+KHN0ZDo6bW92ZShPdGhlcikpIHt9CisKKyAgTVNWQ1BFeHBlY3RlZCAmb3BlcmF0b3I9KE1TVkNQRXhwZWN0ZWQgJiZPdGhlcikgeworICAgIEV4cGVjdGVkPFQ+OjpvcGVyYXRvcj0oc3RkOjptb3ZlKE90aGVyKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTVNWQ1BFeHBlY3RlZChFcnJvciBFcnIpIDogRXhwZWN0ZWQ8VD4oc3RkOjptb3ZlKEVycikpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE90aGVyVD4KKyAgTVNWQ1BFeHBlY3RlZCgKKyAgICAgIE90aGVyVCAmJlZhbCwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8T3RoZXJULCBUPjo6dmFsdWU+Ojp0eXBlICogPQorICAgICAgICAgIG51bGxwdHIpCisgICAgICA6IEV4cGVjdGVkPFQ+KHN0ZDo6bW92ZShWYWwpKSB7fQorCisgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclQ+CisgIE1TVkNQRXhwZWN0ZWQoCisgICAgICBFeHBlY3RlZDxPdGhlclQ+ICYmT3RoZXIsCisgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPE90aGVyVCwgVD46OnZhbHVlPjo6dHlwZSAqID0KKyAgICAgICAgICBudWxscHRyKQorICAgICAgOiBFeHBlY3RlZDxUPihzdGQ6Om1vdmUoT3RoZXIpKSB7fQorCisgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclQ+CisgIGV4cGxpY2l0IE1TVkNQRXhwZWN0ZWQoCisgICAgICBFeHBlY3RlZDxPdGhlclQ+ICYmT3RoZXIsCisgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19jb252ZXJ0aWJsZTxPdGhlclQsIFQ+Ojp2YWx1ZT46OnR5cGUgKiA9CisgICAgICAgICAgbnVsbHB0cikKKyAgICAgIDogRXhwZWN0ZWQ8VD4oc3RkOjptb3ZlKE90aGVyKSkge30KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBtc3ZjX2hhY2tzCisKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisvLy8gUHJvdmlkZXMgYSB0eXBlZGVmIGZvciBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGRlY2F5ZWQgYXJndW1lbnQgdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgRnVuY3Rpb25BcmdzVHVwbGU7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXRULCB0eXBlbmFtZS4uLiBBcmdUcz4KK2NsYXNzIEZ1bmN0aW9uQXJnc1R1cGxlPFJldFQoQXJnVHMuLi4pPiB7CitwdWJsaWM6CisgIHVzaW5nIFR5cGUgPSBzdGQ6OnR1cGxlPHR5cGVuYW1lIHN0ZDo6ZGVjYXk8CisgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8QXJnVHM+Ojp0eXBlPjo6dHlwZS4uLj47Cit9OworCisvLyBSZXN1bHRUcmFpdHMgcHJvdmlkZXMgdHlwZWRlZnMgYW5kIHV0aWxpdGllcyBzcGVjaWZpYyB0byB0aGUgcmV0dXJuIHR5cGUKKy8vIG9mIGZ1bmN0aW9ucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXRUPiBjbGFzcyBSZXN1bHRUcmFpdHMgeworcHVibGljOgorICAvLyBUaGUgcmV0dXJuIHR5cGUgd3JhcHBlZCBpbiBsbHZtOjpFeHBlY3RlZC4KKyAgdXNpbmcgRXJyb3JSZXR1cm5UeXBlID0gRXhwZWN0ZWQ8UmV0VD47CisKKyNpZmRlZiBfTVNDX1ZFUgorICAvLyBUaGUgRXJyb3JSZXR1cm5UeXBlIHdyYXBwZWQgaW4gYSBzdGQ6OnByb21pc2UuCisgIHVzaW5nIFJldHVyblByb21pc2VUeXBlID0gc3RkOjpwcm9taXNlPG1zdmNfaGFja3M6Ok1TVkNQRXhwZWN0ZWQ8UmV0VD4+OworCisgIC8vIFRoZSBFcnJvclJldHVyblR5cGUgd3JhcHBlZCBpbiBhIHN0ZDo6ZnV0dXJlLgorICB1c2luZyBSZXR1cm5GdXR1cmVUeXBlID0gc3RkOjpmdXR1cmU8bXN2Y19oYWNrczo6TVNWQ1BFeHBlY3RlZDxSZXRUPj47CisjZWxzZQorICAvLyBUaGUgRXJyb3JSZXR1cm5UeXBlIHdyYXBwZWQgaW4gYSBzdGQ6OnByb21pc2UuCisgIHVzaW5nIFJldHVyblByb21pc2VUeXBlID0gc3RkOjpwcm9taXNlPEVycm9yUmV0dXJuVHlwZT47CisKKyAgLy8gVGhlIEVycm9yUmV0dXJuVHlwZSB3cmFwcGVkIGluIGEgc3RkOjpmdXR1cmUuCisgIHVzaW5nIFJldHVybkZ1dHVyZVR5cGUgPSBzdGQ6OmZ1dHVyZTxFcnJvclJldHVyblR5cGU+OworI2VuZGlmCisKKyAgLy8gQ3JlYXRlIGEgJ2JsYW5rJyB2YWx1ZSBvZiB0aGUgRXJyb3JSZXR1cm5UeXBlLCByZWFkeSBhbmQgc2FmZSB0bworICAvLyBvdmVyd3JpdGUuCisgIHN0YXRpYyBFcnJvclJldHVyblR5cGUgY3JlYXRlQmxhbmtFcnJvclJldHVyblZhbHVlKCkgeworICAgIHJldHVybiBFcnJvclJldHVyblR5cGUoUmV0VCgpKTsKKyAgfQorCisgIC8vIENvbnN1bWUgYW4gYWJhbmRvbmVkIEVycm9yUmV0dXJuVHlwZS4KKyAgc3RhdGljIHZvaWQgY29uc3VtZUFiYW5kb25lZChFcnJvclJldHVyblR5cGUgUmV0T3JFcnIpIHsKKyAgICBjb25zdW1lRXJyb3IoUmV0T3JFcnIudGFrZUVycm9yKCkpOworICB9Cit9OworCisvLyBSZXN1bHRUcmFpdHMgc3BlY2lhbGl6YXRpb24gZm9yIHZvaWQgZnVuY3Rpb25zLgordGVtcGxhdGUgPD4gY2xhc3MgUmVzdWx0VHJhaXRzPHZvaWQ+IHsKK3B1YmxpYzoKKyAgLy8gRm9yIHZvaWQgZnVuY3Rpb25zLCBFcnJvclJldHVyblR5cGUgaXMgbGx2bTo6RXJyb3IuCisgIHVzaW5nIEVycm9yUmV0dXJuVHlwZSA9IEVycm9yOworCisjaWZkZWYgX01TQ19WRVIKKyAgLy8gVGhlIEVycm9yUmV0dXJuVHlwZSB3cmFwcGVkIGluIGEgc3RkOjpwcm9taXNlLgorICB1c2luZyBSZXR1cm5Qcm9taXNlVHlwZSA9IHN0ZDo6cHJvbWlzZTxtc3ZjX2hhY2tzOjpNU1ZDUEVycm9yPjsKKworICAvLyBUaGUgRXJyb3JSZXR1cm5UeXBlIHdyYXBwZWQgaW4gYSBzdGQ6OmZ1dHVyZS4KKyAgdXNpbmcgUmV0dXJuRnV0dXJlVHlwZSA9IHN0ZDo6ZnV0dXJlPG1zdmNfaGFja3M6Ok1TVkNQRXJyb3I+OworI2Vsc2UKKyAgLy8gVGhlIEVycm9yUmV0dXJuVHlwZSB3cmFwcGVkIGluIGEgc3RkOjpwcm9taXNlLgorICB1c2luZyBSZXR1cm5Qcm9taXNlVHlwZSA9IHN0ZDo6cHJvbWlzZTxFcnJvclJldHVyblR5cGU+OworCisgIC8vIFRoZSBFcnJvclJldHVyblR5cGUgd3JhcHBlZCBpbiBhIHN0ZDo6ZnV0dXJlLgorICB1c2luZyBSZXR1cm5GdXR1cmVUeXBlID0gc3RkOjpmdXR1cmU8RXJyb3JSZXR1cm5UeXBlPjsKKyNlbmRpZgorCisgIC8vIENyZWF0ZSBhICdibGFuaycgdmFsdWUgb2YgdGhlIEVycm9yUmV0dXJuVHlwZSwgcmVhZHkgYW5kIHNhZmUgdG8KKyAgLy8gb3ZlcndyaXRlLgorICBzdGF0aWMgRXJyb3JSZXR1cm5UeXBlIGNyZWF0ZUJsYW5rRXJyb3JSZXR1cm5WYWx1ZSgpIHsKKyAgICByZXR1cm4gRXJyb3JSZXR1cm5UeXBlOjpzdWNjZXNzKCk7CisgIH0KKworICAvLyBDb25zdW1lIGFuIGFiYW5kb25lZCBFcnJvclJldHVyblR5cGUuCisgIHN0YXRpYyB2b2lkIGNvbnN1bWVBYmFuZG9uZWQoRXJyb3JSZXR1cm5UeXBlIEVycikgeworICAgIGNvbnN1bWVFcnJvcihzdGQ6Om1vdmUoRXJyKSk7CisgIH0KK307CisKKy8vIFJlc3VsdFRyYWl0czxFcnJvcj4gaXMgZXF1aXZhbGVudCB0byBSZXN1bHRUcmFpdHM8dm9pZD4uIFRoaXMgYWxsb3dzCisvLyBoYW5kbGVycyBmb3Igdm9pZCBSUEMgZnVuY3Rpb25zIHRvIHJldHVybiBlaXRoZXIgdm9pZCAoaW4gd2hpY2ggY2FzZSB0aGV5CisvLyBpbXBsaWNpdGx5IHN1Y2NlZWQpIG9yIEVycm9yIChpbiB3aGljaCBjYXNlIHRoZWlyIGVycm9yIHJldHVybiBpcworLy8gcHJvcGFnYXRlZCkuIFNlZSB1c2FnZSBpbiBIYW5kbGVyVHJhaXRzOjpydW5IYW5kbGVySGVscGVyLgordGVtcGxhdGUgPD4gY2xhc3MgUmVzdWx0VHJhaXRzPEVycm9yPiA6IHB1YmxpYyBSZXN1bHRUcmFpdHM8dm9pZD4ge307CisKKy8vIFJlc3VsdFRyYWl0czxFeHBlY3RlZDxUPj4gaXMgZXF1aXZhbGVudCB0byBSZXN1bHRUcmFpdHM8VD4uIFRoaXMgYWxsb3dzCisvLyBoYW5kbGVycyBmb3IgUlBDIGZ1bmN0aW9ucyByZXR1cm5pbmcgYSBUIHRvIHJldHVybiBlaXRoZXIgYSBUIChpbiB3aGljaAorLy8gY2FzZSB0aGV5IGltcGxpY2l0bHkgc3VjY2VlZCkgb3IgRXhwZWN0ZWQ8VD4gKGluIHdoaWNoIGNhc2UgdGhlaXIgZXJyb3IKKy8vIHJldHVybiBpcyBwcm9wYWdhdGVkKS4gU2VlIHVzYWdlIGluIEhhbmRsZXJUcmFpdHM6OnJ1bkhhbmRsZXJIZWxwZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmV0VD4KK2NsYXNzIFJlc3VsdFRyYWl0czxFeHBlY3RlZDxSZXRUPj4gOiBwdWJsaWMgUmVzdWx0VHJhaXRzPFJldFQ+IHt9OworCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gUlBDIGZ1bmN0aW9uJ3MgZGVmaW5lZCBlcnJvciByZXR1cm4gdHlwZSBzdXBwb3J0cworLy8gZXJyb3IgcmV0dXJuIHZhbHVlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBTdXBwb3J0c0Vycm9yUmV0dXJuIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBTdXBwb3J0c0Vycm9yUmV0dXJuPEVycm9yPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgU3VwcG9ydHNFcnJvclJldHVybjxFeHBlY3RlZDxUPj4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworCisvLyBSZXNwb25kSGVscGVyIHBhY2thZ2VzIHJldHVybiB2YWx1ZXMgYmFzZWQgb24gd2hldGhlciBvciBub3QgdGhlIGRlY2xhcmVkCisvLyBSUEMgZnVuY3Rpb24gcmV0dXJuIHR5cGUgc3VwcG9ydHMgZXJyb3IgcmV0dXJucy4KK3RlbXBsYXRlIDxib29sIEZ1bmNTdXBwb3J0c0Vycm9yUmV0dXJuPgorY2xhc3MgUmVzcG9uZEhlbHBlcjsKKworLy8gUmVzcG9uZEhlbHBlciBzcGVjaWFsaXphdGlvbiBmb3IgZnVuY3Rpb25zIHRoYXQgc3VwcG9ydCBlcnJvciByZXR1cm5zLgordGVtcGxhdGUgPD4KK2NsYXNzIFJlc3BvbmRIZWxwZXI8dHJ1ZT4geworcHVibGljOgorCisgIC8vIFNlbmQgRXhwZWN0ZWQ8VD4uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBXaXJlUmV0VCwgdHlwZW5hbWUgSGFuZGxlclJldFQsIHR5cGVuYW1lIENoYW5uZWxULAorICAgICAgICAgICAgdHlwZW5hbWUgRnVuY3Rpb25JZFQsIHR5cGVuYW1lIFNlcXVlbmNlTnVtYmVyVD4KKyAgc3RhdGljIEVycm9yIHNlbmRSZXN1bHQoQ2hhbm5lbFQgJkMsIGNvbnN0IEZ1bmN0aW9uSWRUICZSZXNwb25zZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZU51bWJlclQgU2VxTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGVkPEhhbmRsZXJSZXRUPiBSZXN1bHRPckVycikgeworICAgIGlmICghUmVzdWx0T3JFcnIgJiYgUmVzdWx0T3JFcnIudGVtcGxhdGUgZXJyb3JJc0E8UlBDRmF0YWxFcnJvcj4oKSkKKyAgICAgIHJldHVybiBSZXN1bHRPckVyci50YWtlRXJyb3IoKTsKKworICAgIC8vIE9wZW4gdGhlIHJlc3BvbnNlIG1lc3NhZ2UuCisgICAgaWYgKGF1dG8gRXJyID0gQy5zdGFydFNlbmRNZXNzYWdlKFJlc3BvbnNlSWQsIFNlcU5vKSkKKyAgICAgIHJldHVybiBFcnI7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlc3VsdC4KKyAgICBpZiAoYXV0byBFcnIgPQorICAgICAgICBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBXaXJlUmV0VCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RlZDxIYW5kbGVyUmV0VD4+OjpzZXJpYWxpemUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMsIHN0ZDo6bW92ZShSZXN1bHRPckVycikpKQorICAgICAgcmV0dXJuIEVycjsKKworICAgIC8vIENsb3NlIHRoZSByZXNwb25zZSBtZXNzYWdlLgorICAgIHJldHVybiBDLmVuZFNlbmRNZXNzYWdlKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lIEZ1bmN0aW9uSWRULCB0eXBlbmFtZSBTZXF1ZW5jZU51bWJlclQ+CisgIHN0YXRpYyBFcnJvciBzZW5kUmVzdWx0KENoYW5uZWxUICZDLCBjb25zdCBGdW5jdGlvbklkVCAmUmVzcG9uc2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXJUIFNlcU5vLCBFcnJvciBFcnIpIHsKKyAgICBpZiAoRXJyICYmIEVyci5pc0E8UlBDRmF0YWxFcnJvcj4oKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgaWYgKGF1dG8gRXJyMiA9IEMuc3RhcnRTZW5kTWVzc2FnZShSZXNwb25zZUlkLCBTZXFObykpCisgICAgICByZXR1cm4gRXJyMjsKKyAgICBpZiAoYXV0byBFcnIyID0gc2VyaWFsaXplU2VxKEMsIHN0ZDo6bW92ZShFcnIpKSkKKyAgICAgIHJldHVybiBFcnIyOworICAgIHJldHVybiBDLmVuZFNlbmRNZXNzYWdlKCk7CisgIH0KKworfTsKKworLy8gUmVzcG9uZEhlbHBlciBzcGVjaWFsaXphdGlvbiBmb3IgZnVuY3Rpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgZXJyb3IgcmV0dXJucy4KK3RlbXBsYXRlIDw+CitjbGFzcyBSZXNwb25kSGVscGVyPGZhbHNlPiB7CitwdWJsaWM6CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFdpcmVSZXRULCB0eXBlbmFtZSBIYW5kbGVyUmV0VCwgdHlwZW5hbWUgQ2hhbm5lbFQsCisgICAgICAgICAgICB0eXBlbmFtZSBGdW5jdGlvbklkVCwgdHlwZW5hbWUgU2VxdWVuY2VOdW1iZXJUPgorICBzdGF0aWMgRXJyb3Igc2VuZFJlc3VsdChDaGFubmVsVCAmQywgY29uc3QgRnVuY3Rpb25JZFQgJlJlc3BvbnNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyVCBTZXFObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0ZWQ8SGFuZGxlclJldFQ+IFJlc3VsdE9yRXJyKSB7CisgICAgaWYgKGF1dG8gRXJyID0gUmVzdWx0T3JFcnIudGFrZUVycm9yKCkpCisgICAgICByZXR1cm4gRXJyOworCisgICAgLy8gT3BlbiB0aGUgcmVzcG9uc2UgbWVzc2FnZS4KKyAgICBpZiAoYXV0byBFcnIgPSBDLnN0YXJ0U2VuZE1lc3NhZ2UoUmVzcG9uc2VJZCwgU2VxTm8pKQorICAgICAgcmV0dXJuIEVycjsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVzdWx0LgorICAgIGlmIChhdXRvIEVyciA9CisgICAgICAgIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIFdpcmVSZXRULCBIYW5kbGVyUmV0VD46OnNlcmlhbGl6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMsICpSZXN1bHRPckVycikpCisgICAgICByZXR1cm4gRXJyOworCisgICAgLy8gQ2xvc2UgdGhlIHJlc3BvbnNlIG1lc3NhZ2UuCisgICAgcmV0dXJuIEMuZW5kU2VuZE1lc3NhZ2UoKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUgRnVuY3Rpb25JZFQsIHR5cGVuYW1lIFNlcXVlbmNlTnVtYmVyVD4KKyAgc3RhdGljIEVycm9yIHNlbmRSZXN1bHQoQ2hhbm5lbFQgJkMsIGNvbnN0IEZ1bmN0aW9uSWRUICZSZXNwb25zZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZU51bWJlclQgU2VxTm8sIEVycm9yIEVycikgeworICAgIGlmIChFcnIpCisgICAgICByZXR1cm4gRXJyOworICAgIGlmIChhdXRvIEVycjIgPSBDLnN0YXJ0U2VuZE1lc3NhZ2UoUmVzcG9uc2VJZCwgU2VxTm8pKQorICAgICAgcmV0dXJuIEVycjI7CisgICAgcmV0dXJuIEMuZW5kU2VuZE1lc3NhZ2UoKTsKKyAgfQorCit9OworCisKKy8vIFNlbmQgYSByZXNwb25zZSBvZiB0aGUgZ2l2ZW4gd2lyZSByZXR1cm4gdHlwZSAoV2lyZVJldFQpIG92ZXIgdGhlCisvLyBjaGFubmVsLCB3aXRoIHRoZSBnaXZlbiBzZXF1ZW5jZSBudW1iZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgV2lyZVJldFQsIHR5cGVuYW1lIEhhbmRsZXJSZXRULCB0eXBlbmFtZSBDaGFubmVsVCwKKyAgICAgICAgICB0eXBlbmFtZSBGdW5jdGlvbklkVCwgdHlwZW5hbWUgU2VxdWVuY2VOdW1iZXJUPgorRXJyb3IgcmVzcG9uZChDaGFubmVsVCAmQywgY29uc3QgRnVuY3Rpb25JZFQgJlJlc3BvbnNlSWQsCisgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyVCBTZXFObywgRXhwZWN0ZWQ8SGFuZGxlclJldFQ+IFJlc3VsdE9yRXJyKSB7CisgIHJldHVybiBSZXNwb25kSGVscGVyPFN1cHBvcnRzRXJyb3JSZXR1cm48V2lyZVJldFQ+Ojp2YWx1ZT46OgorICAgIHRlbXBsYXRlIHNlbmRSZXN1bHQ8V2lyZVJldFQ+KEMsIFJlc3BvbnNlSWQsIFNlcU5vLCBzdGQ6Om1vdmUoUmVzdWx0T3JFcnIpKTsKK30KKworLy8gU2VuZCBhbiBlbXB0eSByZXNwb25zZSBtZXNzYWdlIG9uIHRoZSBnaXZlbiBjaGFubmVsIHRvIGluZGljYXRlIHRoYXQKKy8vIHRoZSBoYW5kbGVyIHJhbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBXaXJlUmV0VCwgdHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lIEZ1bmN0aW9uSWRULAorICAgICAgICAgIHR5cGVuYW1lIFNlcXVlbmNlTnVtYmVyVD4KK0Vycm9yIHJlc3BvbmQoQ2hhbm5lbFQgJkMsIGNvbnN0IEZ1bmN0aW9uSWRUICZSZXNwb25zZUlkLCBTZXF1ZW5jZU51bWJlclQgU2VxTm8sCisgICAgICAgICAgICAgIEVycm9yIEVycikgeworICByZXR1cm4gUmVzcG9uZEhlbHBlcjxTdXBwb3J0c0Vycm9yUmV0dXJuPFdpcmVSZXRUPjo6dmFsdWU+OjoKKyAgICBzZW5kUmVzdWx0KEMsIFJlc3BvbnNlSWQsIFNlcU5vLCBzdGQ6Om1vdmUoRXJyKSk7Cit9CisKKy8vIENvbnZlcnRzIGEgZ2l2ZW4gdHlwZSB0byB0aGUgZXF1aXZhbGVudCBlcnJvciByZXR1cm4gdHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBXcmFwcGVkSGFuZGxlclJldHVybiB7CitwdWJsaWM6CisgIHVzaW5nIFR5cGUgPSBFeHBlY3RlZDxUPjsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBXcmFwcGVkSGFuZGxlclJldHVybjxFeHBlY3RlZDxUPj4geworcHVibGljOgorICB1c2luZyBUeXBlID0gRXhwZWN0ZWQ8VD47Cit9OworCit0ZW1wbGF0ZSA8PiBjbGFzcyBXcmFwcGVkSGFuZGxlclJldHVybjx2b2lkPiB7CitwdWJsaWM6CisgIHVzaW5nIFR5cGUgPSBFcnJvcjsKK307CisKK3RlbXBsYXRlIDw+IGNsYXNzIFdyYXBwZWRIYW5kbGVyUmV0dXJuPEVycm9yPiB7CitwdWJsaWM6CisgIHVzaW5nIFR5cGUgPSBFcnJvcjsKK307CisKK3RlbXBsYXRlIDw+IGNsYXNzIFdyYXBwZWRIYW5kbGVyUmV0dXJuPEVycm9yU3VjY2Vzcz4geworcHVibGljOgorICB1c2luZyBUeXBlID0gRXJyb3I7Cit9OworCisvLyBUcmFpdHMgY2xhc3MgdGhhdCBzdHJpcHMgdGhlIHJlc3BvbnNlIGZ1bmN0aW9uIGZyb20gdGhlIGxpc3Qgb2YgaGFuZGxlcgorLy8gYXJndW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIEZuVD4gY2xhc3MgQXN5bmNIYW5kbGVyVHJhaXRzOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0VCwgdHlwZW5hbWUuLi4gQXJnVHM+CitjbGFzcyBBc3luY0hhbmRsZXJUcmFpdHM8RXJyb3Ioc3RkOjpmdW5jdGlvbjxFcnJvcihFeHBlY3RlZDxSZXN1bHRUPik+LCBBcmdUcy4uLik+IHsKK3B1YmxpYzoKKyAgdXNpbmcgVHlwZSA9IEVycm9yKEFyZ1RzLi4uKTsKKyAgdXNpbmcgUmVzdWx0VHlwZSA9IEV4cGVjdGVkPFJlc3VsdFQ+OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ1RzPgorY2xhc3MgQXN5bmNIYW5kbGVyVHJhaXRzPEVycm9yKHN0ZDo6ZnVuY3Rpb248RXJyb3IoRXJyb3IpPiwgQXJnVHMuLi4pPiB7CitwdWJsaWM6CisgIHVzaW5nIFR5cGUgPSBFcnJvcihBcmdUcy4uLik7CisgIHVzaW5nIFJlc3VsdFR5cGUgPSBFcnJvcjsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdUcz4KK2NsYXNzIEFzeW5jSGFuZGxlclRyYWl0czxFcnJvclN1Y2Nlc3Moc3RkOjpmdW5jdGlvbjxFcnJvcihFcnJvcik+LCBBcmdUcy4uLik+IHsKK3B1YmxpYzoKKyAgdXNpbmcgVHlwZSA9IEVycm9yKEFyZ1RzLi4uKTsKKyAgdXNpbmcgUmVzdWx0VHlwZSA9IEVycm9yOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ1RzPgorY2xhc3MgQXN5bmNIYW5kbGVyVHJhaXRzPHZvaWQoc3RkOjpmdW5jdGlvbjxFcnJvcihFcnJvcik+LCBBcmdUcy4uLik+IHsKK3B1YmxpYzoKKyAgdXNpbmcgVHlwZSA9IEVycm9yKEFyZ1RzLi4uKTsKKyAgdXNpbmcgUmVzdWx0VHlwZSA9IEVycm9yOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFJlc3BvbnNlSGFuZGxlclQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorY2xhc3MgQXN5bmNIYW5kbGVyVHJhaXRzPEVycm9yKFJlc3BvbnNlSGFuZGxlclQsIEFyZ1RzLi4uKT4gOgorICAgIHB1YmxpYyBBc3luY0hhbmRsZXJUcmFpdHM8RXJyb3IodHlwZW5hbWUgc3RkOjpkZWNheTxSZXNwb25zZUhhbmRsZXJUPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1RzLi4uKT4ge307CisKKy8vIFRoaXMgdGVtcGxhdGUgY2xhc3MgcHJvdmlkZXMgdXRpbGl0aWVzIHJlbGF0ZWQgdG8gUlBDIGZ1bmN0aW9uIGhhbmRsZXJzLgorLy8gVGhlIGJhc2UgY2FzZSBhcHBsaWVzIHRvIG5vbi1mdW5jdGlvbiB0eXBlcyAodGhlIHRlbXBsYXRlIGNsYXNzIGlzCisvLyBzcGVjaWFsaXplZCBmb3IgZnVuY3Rpb24gdHlwZXMpIGFuZCBpbmhlcml0cyBmcm9tIHRoZSBhcHByb3ByaWF0ZQorLy8gc3BlY2lpbGl6YXRpb24gZm9yIHRoZSBnaXZlbiBub24tZnVuY3Rpb24gdHlwZSdzIGNhbGwgb3BlcmF0b3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlclQ+CitjbGFzcyBIYW5kbGVyVHJhaXRzIDogcHVibGljIEhhbmRsZXJUcmFpdHM8ZGVjbHR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8SGFuZGxlclQ+Ojp0eXBlOjpvcGVyYXRvcigpKT4geworfTsKKworLy8gVHJhaXRzIGZvciBoYW5kbGVycyB3aXRoIGEgZ2l2ZW4gZnVuY3Rpb24gdHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXRULCB0eXBlbmFtZS4uLiBBcmdUcz4KK2NsYXNzIEhhbmRsZXJUcmFpdHM8UmV0VChBcmdUcy4uLik+IHsKK3B1YmxpYzoKKyAgLy8gRnVuY3Rpb24gdHlwZSBvZiB0aGUgaGFuZGxlci4KKyAgdXNpbmcgVHlwZSA9IFJldFQoQXJnVHMuLi4pOworCisgIC8vIFJldHVybiB0eXBlIG9mIHRoZSBoYW5kbGVyLgorICB1c2luZyBSZXR1cm5UeXBlID0gUmV0VDsKKworICAvLyBDYWxsIHRoZSBnaXZlbiBoYW5kbGVyIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXJULCB0eXBlbmFtZS4uLiBUQXJnVHM+CisgIHN0YXRpYyB0eXBlbmFtZSBXcmFwcGVkSGFuZGxlclJldHVybjxSZXRUPjo6VHlwZQorICB1bnBhY2tBbmRSdW4oSGFuZGxlclQgJkhhbmRsZXIsIHN0ZDo6dHVwbGU8VEFyZ1RzLi4uPiAmQXJncykgeworICAgIHJldHVybiB1bnBhY2tBbmRSdW5IZWxwZXIoSGFuZGxlciwgQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmluZGV4X3NlcXVlbmNlX2ZvcjxUQXJnVHMuLi4+KCkpOworICB9CisKKyAgLy8gQ2FsbCB0aGUgZ2l2ZW4gaGFuZGxlciB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyVCwgdHlwZW5hbWUgUmVzcG9uZGVyVCwgdHlwZW5hbWUuLi4gVEFyZ1RzPgorICBzdGF0aWMgRXJyb3IgdW5wYWNrQW5kUnVuQXN5bmMoSGFuZGxlclQgJkhhbmRsZXIsIFJlc3BvbmRlclQgJlJlc3BvbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dHVwbGU8VEFyZ1RzLi4uPiAmQXJncykgeworICAgIHJldHVybiB1bnBhY2tBbmRSdW5Bc3luY0hlbHBlcihIYW5kbGVyLCBSZXNwb25kZXIsIEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmluZGV4X3NlcXVlbmNlX2ZvcjxUQXJnVHMuLi4+KCkpOworICB9CisKKyAgLy8gQ2FsbCB0aGUgZ2l2ZW4gaGFuZGxlciB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyVD4KKyAgc3RhdGljIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgc3RkOjppc192b2lkPHR5cGVuYW1lIEhhbmRsZXJUcmFpdHM8SGFuZGxlclQ+OjpSZXR1cm5UeXBlPjo6dmFsdWUsCisgICAgICBFcnJvcj46OnR5cGUKKyAgcnVuKEhhbmRsZXJUICZIYW5kbGVyLCBBcmdUcyAmJi4uLiBBcmdzKSB7CisgICAgSGFuZGxlcihzdGQ6Om1vdmUoQXJncykuLi4pOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXJULCB0eXBlbmFtZS4uLiBUQXJnVHM+CisgIHN0YXRpYyB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICFzdGQ6OmlzX3ZvaWQ8dHlwZW5hbWUgSGFuZGxlclRyYWl0czxIYW5kbGVyVD46OlJldHVyblR5cGU+Ojp2YWx1ZSwKKyAgICAgIHR5cGVuYW1lIEhhbmRsZXJUcmFpdHM8SGFuZGxlclQ+OjpSZXR1cm5UeXBlPjo6dHlwZQorICBydW4oSGFuZGxlclQgJkhhbmRsZXIsIFRBcmdUcy4uLiBBcmdzKSB7CisgICAgcmV0dXJuIEhhbmRsZXIoc3RkOjptb3ZlKEFyZ3MpLi4uKTsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZSBhcmd1bWVudHMgdG8gdGhlIGNoYW5uZWwuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUuLi4gQ0FyZ1RzPgorICBzdGF0aWMgRXJyb3Igc2VyaWFsaXplQXJncyhDaGFubmVsVCAmQywgY29uc3QgQ0FyZ1RzLi4uIENBcmdzKSB7CisgICAgcmV0dXJuIFNlcXVlbmNlU2VyaWFsaXphdGlvbjxDaGFubmVsVCwgQXJnVHMuLi4+OjpzZXJpYWxpemUoQywgQ0FyZ3MuLi4pOworICB9CisKKyAgLy8gRGVzZXJpYWxpemUgYXJndW1lbnRzIGZyb20gdGhlIGNoYW5uZWwuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUuLi4gQ0FyZ1RzPgorICBzdGF0aWMgRXJyb3IgZGVzZXJpYWxpemVBcmdzKENoYW5uZWxUICZDLCBzdGQ6OnR1cGxlPENBcmdUcy4uLj4gJkFyZ3MpIHsKKyAgICByZXR1cm4gZGVzZXJpYWxpemVBcmdzSGVscGVyKEMsIEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjppbmRleF9zZXF1ZW5jZV9mb3I8Q0FyZ1RzLi4uPigpKTsKKyAgfQorCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lLi4uIENBcmdUcywgc2l6ZV90Li4uIEluZGV4ZXM+CisgIHN0YXRpYyBFcnJvciBkZXNlcmlhbGl6ZUFyZ3NIZWxwZXIoQ2hhbm5lbFQgJkMsIHN0ZDo6dHVwbGU8Q0FyZ1RzLi4uPiAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjppbmRleF9zZXF1ZW5jZTxJbmRleGVzLi4uPiBfKSB7CisgICAgcmV0dXJuIFNlcXVlbmNlU2VyaWFsaXphdGlvbjxDaGFubmVsVCwgQXJnVHMuLi4+OjpkZXNlcmlhbGl6ZSgKKyAgICAgICAgQywgc3RkOjpnZXQ8SW5kZXhlcz4oQXJncykuLi4pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXJULCB0eXBlbmFtZSBBcmdUdXBsZSwgc2l6ZV90Li4uIEluZGV4ZXM+CisgIHN0YXRpYyB0eXBlbmFtZSBXcmFwcGVkSGFuZGxlclJldHVybjwKKyAgICAgIHR5cGVuYW1lIEhhbmRsZXJUcmFpdHM8SGFuZGxlclQ+OjpSZXR1cm5UeXBlPjo6VHlwZQorICB1bnBhY2tBbmRSdW5IZWxwZXIoSGFuZGxlclQgJkhhbmRsZXIsIEFyZ1R1cGxlICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgbGx2bTo6aW5kZXhfc2VxdWVuY2U8SW5kZXhlcy4uLj4pIHsKKyAgICByZXR1cm4gcnVuKEhhbmRsZXIsIHN0ZDo6bW92ZShzdGQ6OmdldDxJbmRleGVzPihBcmdzKSkuLi4pOworICB9CisKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlclQsIHR5cGVuYW1lIFJlc3BvbmRlclQsIHR5cGVuYW1lIEFyZ1R1cGxlLAorICAgICAgICAgICAgc2l6ZV90Li4uIEluZGV4ZXM+CisgIHN0YXRpYyB0eXBlbmFtZSBXcmFwcGVkSGFuZGxlclJldHVybjwKKyAgICAgIHR5cGVuYW1lIEhhbmRsZXJUcmFpdHM8SGFuZGxlclQ+OjpSZXR1cm5UeXBlPjo6VHlwZQorICB1bnBhY2tBbmRSdW5Bc3luY0hlbHBlcihIYW5kbGVyVCAmSGFuZGxlciwgUmVzcG9uZGVyVCAmUmVzcG9uZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdUdXBsZSAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6aW5kZXhfc2VxdWVuY2U8SW5kZXhlcy4uLj4pIHsKKyAgICByZXR1cm4gcnVuKEhhbmRsZXIsIFJlc3BvbmRlciwgc3RkOjptb3ZlKHN0ZDo6Z2V0PEluZGV4ZXM+KEFyZ3MpKS4uLik7CisgIH0KK307CisKKy8vIEhhbmRsZXIgdHJhaXRzIGZvciBmcmVlIGZ1bmN0aW9ucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXRULCB0eXBlbmFtZS4uLiBBcmdUcz4KK2NsYXNzIEhhbmRsZXJUcmFpdHM8UmV0VCgqKShBcmdUcy4uLik+CisgIDogcHVibGljIEhhbmRsZXJUcmFpdHM8UmV0VChBcmdUcy4uLik+IHt9OworCisvLyBIYW5kbGVyIHRyYWl0cyBmb3IgY2xhc3MgbWV0aG9kcyAoZXNwZWNpYWxseSBjYWxsIG9wZXJhdG9ycyBmb3IgbGFtYmRhcykuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIFJldFQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorY2xhc3MgSGFuZGxlclRyYWl0czxSZXRUIChDbGFzczo6KikoQXJnVHMuLi4pPgorICAgIDogcHVibGljIEhhbmRsZXJUcmFpdHM8UmV0VChBcmdUcy4uLik+IHt9OworCisvLyBIYW5kbGVyIHRyYWl0cyBmb3IgY29uc3QgY2xhc3MgbWV0aG9kcyAoZXNwZWNpYWxseSBjYWxsIG9wZXJhdG9ycyBmb3IKKy8vIGxhbWJkYXMpLgordGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzLCB0eXBlbmFtZSBSZXRULCB0eXBlbmFtZS4uLiBBcmdUcz4KK2NsYXNzIEhhbmRsZXJUcmFpdHM8UmV0VCAoQ2xhc3M6OiopKEFyZ1RzLi4uKSBjb25zdD4KKyAgICA6IHB1YmxpYyBIYW5kbGVyVHJhaXRzPFJldFQoQXJnVHMuLi4pPiB7fTsKKworLy8gVXRpbGl0eSB0byBwZWVsIHRoZSBFeHBlY3RlZCB3cmFwcGVyIG9mZiBhIHJlc3BvbnNlIGhhbmRsZXIgZXJyb3IgdHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyVD4gY2xhc3MgUmVzcG9uc2VIYW5kbGVyQXJnOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVD4gY2xhc3MgUmVzcG9uc2VIYW5kbGVyQXJnPEVycm9yKEV4cGVjdGVkPEFyZ1Q+KT4geworcHVibGljOgorICB1c2luZyBBcmdUeXBlID0gRXhwZWN0ZWQ8QXJnVD47CisgIHVzaW5nIFVud3JhcHBlZEFyZ1R5cGUgPSBBcmdUOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1Q+CitjbGFzcyBSZXNwb25zZUhhbmRsZXJBcmc8RXJyb3JTdWNjZXNzKEV4cGVjdGVkPEFyZ1Q+KT4geworcHVibGljOgorICB1c2luZyBBcmdUeXBlID0gRXhwZWN0ZWQ8QXJnVD47CisgIHVzaW5nIFVud3JhcHBlZEFyZ1R5cGUgPSBBcmdUOworfTsKKwordGVtcGxhdGUgPD4gY2xhc3MgUmVzcG9uc2VIYW5kbGVyQXJnPEVycm9yKEVycm9yKT4geworcHVibGljOgorICB1c2luZyBBcmdUeXBlID0gRXJyb3I7Cit9OworCit0ZW1wbGF0ZSA8PiBjbGFzcyBSZXNwb25zZUhhbmRsZXJBcmc8RXJyb3JTdWNjZXNzKEVycm9yKT4geworcHVibGljOgorICB1c2luZyBBcmdUeXBlID0gRXJyb3I7Cit9OworCisvLyBSZXNwb25zZUhhbmRsZXIgcmVwcmVzZW50cyBhIGhhbmRsZXIgZm9yIGEgbm90LXlldC1yZWNlaXZlZCBmdW5jdGlvbiBjYWxsCisvLyByZXN1bHQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQ+IGNsYXNzIFJlc3BvbnNlSGFuZGxlciB7CitwdWJsaWM6CisgIHZpcnR1YWwgflJlc3BvbnNlSGFuZGxlcigpIHt9CisKKyAgLy8gUmVhZHMgdGhlIGZ1bmN0aW9uIHJlc3VsdCBvZmYgdGhlIHdpcmUgYW5kIGFjdHMgb24gaXQuIFRoZSBtZWFuaW5nIG9mCisgIC8vICJhY3QiIHdpbGwgZGVwZW5kIG9uIGhvdyB0aGlzIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCBpbiBhbnkgZ2l2ZW4KKyAgLy8gUmVzcG9uc2VIYW5kbGVyIHN1YmNsYXNzIGJ1dCBjb3VsZCwgZm9yIGV4YW1wbGUsIG1lYW4gcnVubmluZyBhCisgIC8vIHVzZXItc3BlY2lmaWVkIGhhbmRsZXIgb3Igc2V0dGluZyBhIHByb21pc2UgdmFsdWUuCisgIHZpcnR1YWwgRXJyb3IgaGFuZGxlUmVzcG9uc2UoQ2hhbm5lbFQgJkMpID0gMDsKKworICAvLyBBYmFuZG9ucyB0aGlzIG91dHN0YW5kaW5nIHJlc3VsdC4KKyAgdmlydHVhbCB2b2lkIGFiYW5kb24oKSA9IDA7CisKKyAgLy8gQ3JlYXRlIGFuIGVycm9yIGluc3RhbmNlIHJlcHJlc2VudGluZyBhbiBhYmFuZG9uZWQgcmVzcG9uc2UuCisgIHN0YXRpYyBFcnJvciBjcmVhdGVBYmFuZG9uZWRSZXNwb25zZUVycm9yKCkgeworICAgIHJldHVybiBtYWtlX2Vycm9yPFJlc3BvbnNlQWJhbmRvbmVkPigpOworICB9Cit9OworCisvLyBSZXNwb25zZUhhbmRsZXIgc3ViY2xhc3MgZm9yIFJQQyBmdW5jdGlvbnMgd2l0aCBub24tdm9pZCByZXR1cm5zLgordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZSBGdW5jUmV0VCwgdHlwZW5hbWUgSGFuZGxlclQ+CitjbGFzcyBSZXNwb25zZUhhbmRsZXJJbXBsIDogcHVibGljIFJlc3BvbnNlSGFuZGxlcjxDaGFubmVsVD4geworcHVibGljOgorICBSZXNwb25zZUhhbmRsZXJJbXBsKEhhbmRsZXJUIEhhbmRsZXIpIDogSGFuZGxlcihzdGQ6Om1vdmUoSGFuZGxlcikpIHt9CisKKyAgLy8gSGFuZGxlIHRoZSByZXN1bHQgYnkgZGVzZXJpYWxpemluZyBpdCBmcm9tIHRoZSBjaGFubmVsIHRoZW4gcGFzc2luZyBpdAorICAvLyB0byB0aGUgdXNlciBkZWZpbmVkIGhhbmRsZXIuCisgIEVycm9yIGhhbmRsZVJlc3BvbnNlKENoYW5uZWxUICZDKSBvdmVycmlkZSB7CisgICAgdXNpbmcgVW53cmFwcGVkQXJnVHlwZSA9IHR5cGVuYW1lIFJlc3BvbnNlSGFuZGxlckFyZzwKKyAgICAgICAgdHlwZW5hbWUgSGFuZGxlclRyYWl0czxIYW5kbGVyVD46OlR5cGU+OjpVbndyYXBwZWRBcmdUeXBlOworICAgIFVud3JhcHBlZEFyZ1R5cGUgUmVzdWx0OworICAgIGlmIChhdXRvIEVyciA9CisgICAgICAgICAgICBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBGdW5jUmV0VCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW53cmFwcGVkQXJnVHlwZT46OmRlc2VyaWFsaXplKEMsIFJlc3VsdCkpCisgICAgICByZXR1cm4gRXJyOworICAgIGlmIChhdXRvIEVyciA9IEMuZW5kUmVjZWl2ZU1lc3NhZ2UoKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgcmV0dXJuIEhhbmRsZXIoc3RkOjptb3ZlKFJlc3VsdCkpOworICB9CisKKyAgLy8gQWJhbmRvbiB0aGlzIHJlc3BvbnNlIGJ5IGNhbGxpbmcgdGhlIGhhbmRsZXIgd2l0aCBhbiAnYWJhbmRvbmVkIHJlc3BvbnNlJworICAvLyBlcnJvci4KKyAgdm9pZCBhYmFuZG9uKCkgb3ZlcnJpZGUgeworICAgIGlmIChhdXRvIEVyciA9IEhhbmRsZXIodGhpcy0+Y3JlYXRlQWJhbmRvbmVkUmVzcG9uc2VFcnJvcigpKSkgeworICAgICAgLy8gSGFuZGxlcnMgc2hvdWxkIG5vdCBmYWlsIHdoZW4gcGFzc2VkIGFuIGFiYW5kb25lZCByZXNwb25zZSBlcnJvci4KKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcihzdGQ6Om1vdmUoRXJyKSk7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIEhhbmRsZXJUIEhhbmRsZXI7Cit9OworCisvLyBSZXNwb25zZUhhbmRsZXIgc3ViY2xhc3MgZm9yIFJQQyBmdW5jdGlvbnMgd2l0aCB2b2lkIHJldHVybnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lIEhhbmRsZXJUPgorY2xhc3MgUmVzcG9uc2VIYW5kbGVySW1wbDxDaGFubmVsVCwgdm9pZCwgSGFuZGxlclQ+CisgICAgOiBwdWJsaWMgUmVzcG9uc2VIYW5kbGVyPENoYW5uZWxUPiB7CitwdWJsaWM6CisgIFJlc3BvbnNlSGFuZGxlckltcGwoSGFuZGxlclQgSGFuZGxlcikgOiBIYW5kbGVyKHN0ZDo6bW92ZShIYW5kbGVyKSkge30KKworICAvLyBIYW5kbGUgdGhlIHJlc3VsdCAobm8gYWN0dWFsIHZhbHVlLCBqdXN0IGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlIGZ1bmN0aW9uCisgIC8vIGhhcyBjb21wbGV0ZWQgb24gdGhlIHJlbW90ZSBlbmQpIGJ5IGNhbGxpbmcgdGhlIHVzZXItZGVmaW5lZCBoYW5kbGVyIHdpdGgKKyAgLy8gRXJyb3I6OnN1Y2Nlc3MoKS4KKyAgRXJyb3IgaGFuZGxlUmVzcG9uc2UoQ2hhbm5lbFQgJkMpIG92ZXJyaWRlIHsKKyAgICBpZiAoYXV0byBFcnIgPSBDLmVuZFJlY2VpdmVNZXNzYWdlKCkpCisgICAgICByZXR1cm4gRXJyOworICAgIHJldHVybiBIYW5kbGVyKEVycm9yOjpzdWNjZXNzKCkpOworICB9CisKKyAgLy8gQWJhbmRvbiB0aGlzIHJlc3BvbnNlIGJ5IGNhbGxpbmcgdGhlIGhhbmRsZXIgd2l0aCBhbiAnYWJhbmRvbmVkIHJlc3BvbnNlJworICAvLyBlcnJvci4KKyAgdm9pZCBhYmFuZG9uKCkgb3ZlcnJpZGUgeworICAgIGlmIChhdXRvIEVyciA9IEhhbmRsZXIodGhpcy0+Y3JlYXRlQWJhbmRvbmVkUmVzcG9uc2VFcnJvcigpKSkgeworICAgICAgLy8gSGFuZGxlcnMgc2hvdWxkIG5vdCBmYWlsIHdoZW4gcGFzc2VkIGFuIGFiYW5kb25lZCByZXNwb25zZSBlcnJvci4KKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcihzdGQ6Om1vdmUoRXJyKSk7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIEhhbmRsZXJUIEhhbmRsZXI7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lIEZ1bmNSZXRULCB0eXBlbmFtZSBIYW5kbGVyVD4KK2NsYXNzIFJlc3BvbnNlSGFuZGxlckltcGw8Q2hhbm5lbFQsIEV4cGVjdGVkPEZ1bmNSZXRUPiwgSGFuZGxlclQ+CisgICAgOiBwdWJsaWMgUmVzcG9uc2VIYW5kbGVyPENoYW5uZWxUPiB7CitwdWJsaWM6CisgIFJlc3BvbnNlSGFuZGxlckltcGwoSGFuZGxlclQgSGFuZGxlcikgOiBIYW5kbGVyKHN0ZDo6bW92ZShIYW5kbGVyKSkge30KKworICAvLyBIYW5kbGUgdGhlIHJlc3VsdCBieSBkZXNlcmlhbGl6aW5nIGl0IGZyb20gdGhlIGNoYW5uZWwgdGhlbiBwYXNzaW5nIGl0CisgIC8vIHRvIHRoZSB1c2VyIGRlZmluZWQgaGFuZGxlci4KKyAgRXJyb3IgaGFuZGxlUmVzcG9uc2UoQ2hhbm5lbFQgJkMpIG92ZXJyaWRlIHsKKyAgICB1c2luZyBIYW5kbGVyQXJnVHlwZSA9IHR5cGVuYW1lIFJlc3BvbnNlSGFuZGxlckFyZzwKKyAgICAgICAgdHlwZW5hbWUgSGFuZGxlclRyYWl0czxIYW5kbGVyVD46OlR5cGU+OjpBcmdUeXBlOworICAgIEhhbmRsZXJBcmdUeXBlIFJlc3VsdCgodHlwZW5hbWUgSGFuZGxlckFyZ1R5cGU6OnZhbHVlX3R5cGUoKSkpOworCisgICAgaWYgKGF1dG8gRXJyID0KKyAgICAgICAgICAgIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIEV4cGVjdGVkPEZ1bmNSZXRUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckFyZ1R5cGU+OjpkZXNlcmlhbGl6ZShDLCBSZXN1bHQpKQorICAgICAgcmV0dXJuIEVycjsKKyAgICBpZiAoYXV0byBFcnIgPSBDLmVuZFJlY2VpdmVNZXNzYWdlKCkpCisgICAgICByZXR1cm4gRXJyOworICAgIHJldHVybiBIYW5kbGVyKHN0ZDo6bW92ZShSZXN1bHQpKTsKKyAgfQorCisgIC8vIEFiYW5kb24gdGhpcyByZXNwb25zZSBieSBjYWxsaW5nIHRoZSBoYW5kbGVyIHdpdGggYW4gJ2FiYW5kb25lZCByZXNwb25zZScKKyAgLy8gZXJyb3IuCisgIHZvaWQgYWJhbmRvbigpIG92ZXJyaWRlIHsKKyAgICBpZiAoYXV0byBFcnIgPSBIYW5kbGVyKHRoaXMtPmNyZWF0ZUFiYW5kb25lZFJlc3BvbnNlRXJyb3IoKSkpIHsKKyAgICAgIC8vIEhhbmRsZXJzIHNob3VsZCBub3QgZmFpbCB3aGVuIHBhc3NlZCBhbiBhYmFuZG9uZWQgcmVzcG9uc2UgZXJyb3IuCisgICAgICByZXBvcnRfZmF0YWxfZXJyb3Ioc3RkOjptb3ZlKEVycikpOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICBIYW5kbGVyVCBIYW5kbGVyOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZSBIYW5kbGVyVD4KK2NsYXNzIFJlc3BvbnNlSGFuZGxlckltcGw8Q2hhbm5lbFQsIEVycm9yLCBIYW5kbGVyVD4KKyAgICA6IHB1YmxpYyBSZXNwb25zZUhhbmRsZXI8Q2hhbm5lbFQ+IHsKK3B1YmxpYzoKKyAgUmVzcG9uc2VIYW5kbGVySW1wbChIYW5kbGVyVCBIYW5kbGVyKSA6IEhhbmRsZXIoc3RkOjptb3ZlKEhhbmRsZXIpKSB7fQorCisgIC8vIEhhbmRsZSB0aGUgcmVzdWx0IGJ5IGRlc2VyaWFsaXppbmcgaXQgZnJvbSB0aGUgY2hhbm5lbCB0aGVuIHBhc3NpbmcgaXQKKyAgLy8gdG8gdGhlIHVzZXIgZGVmaW5lZCBoYW5kbGVyLgorICBFcnJvciBoYW5kbGVSZXNwb25zZShDaGFubmVsVCAmQykgb3ZlcnJpZGUgeworICAgIEVycm9yIFJlc3VsdCA9IEVycm9yOjpzdWNjZXNzKCk7CisgICAgaWYgKGF1dG8gRXJyID0KKyAgICAgICAgICAgIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIEVycm9yLCBFcnJvcj46OmRlc2VyaWFsaXplKEMsIFJlc3VsdCkpCisgICAgICByZXR1cm4gRXJyOworICAgIGlmIChhdXRvIEVyciA9IEMuZW5kUmVjZWl2ZU1lc3NhZ2UoKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgcmV0dXJuIEhhbmRsZXIoc3RkOjptb3ZlKFJlc3VsdCkpOworICB9CisKKyAgLy8gQWJhbmRvbiB0aGlzIHJlc3BvbnNlIGJ5IGNhbGxpbmcgdGhlIGhhbmRsZXIgd2l0aCBhbiAnYWJhbmRvbmVkIHJlc3BvbnNlJworICAvLyBlcnJvci4KKyAgdm9pZCBhYmFuZG9uKCkgb3ZlcnJpZGUgeworICAgIGlmIChhdXRvIEVyciA9IEhhbmRsZXIodGhpcy0+Y3JlYXRlQWJhbmRvbmVkUmVzcG9uc2VFcnJvcigpKSkgeworICAgICAgLy8gSGFuZGxlcnMgc2hvdWxkIG5vdCBmYWlsIHdoZW4gcGFzc2VkIGFuIGFiYW5kb25lZCByZXNwb25zZSBlcnJvci4KKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcihzdGQ6Om1vdmUoRXJyKSk7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIEhhbmRsZXJUIEhhbmRsZXI7Cit9OworCisvLyBDcmVhdGUgYSBSZXNwb25zZUhhbmRsZXIgZnJvbSBhIGdpdmVuIHVzZXIgaGFuZGxlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUgRnVuY1JldFQsIHR5cGVuYW1lIEhhbmRsZXJUPgorc3RkOjp1bmlxdWVfcHRyPFJlc3BvbnNlSGFuZGxlcjxDaGFubmVsVD4+IGNyZWF0ZVJlc3BvbnNlSGFuZGxlcihIYW5kbGVyVCBIKSB7CisgIHJldHVybiBsbHZtOjptYWtlX3VuaXF1ZTxSZXNwb25zZUhhbmRsZXJJbXBsPENoYW5uZWxULCBGdW5jUmV0VCwgSGFuZGxlclQ+PigKKyAgICAgIHN0ZDo6bW92ZShIKSk7Cit9CisKKy8vIEhlbHBlciBmb3Igd3JhcHBpbmcgbWVtYmVyIGZ1bmN0aW9ucyB1cCBhcyBmdW5jdG9ycy4gVGhpcyBpcyB1c2VmdWwgZm9yCisvLyBpbnN0YWxsaW5nIG1ldGhvZHMgYXMgcmVzdWx0IGhhbmRsZXJzLgordGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzVCwgdHlwZW5hbWUgUmV0VCwgdHlwZW5hbWUuLi4gQXJnVHM+CitjbGFzcyBNZW1iZXJGbldyYXBwZXIgeworcHVibGljOgorICB1c2luZyBNZXRob2RUID0gUmV0VCAoQ2xhc3NUOjoqKShBcmdUcy4uLik7CisgIE1lbWJlckZuV3JhcHBlcihDbGFzc1QgJkluc3RhbmNlLCBNZXRob2RUIE1ldGhvZCkKKyAgICAgIDogSW5zdGFuY2UoSW5zdGFuY2UpLCBNZXRob2QoTWV0aG9kKSB7fQorICBSZXRUIG9wZXJhdG9yKCkoQXJnVHMgJiYuLi4gQXJncykgeworICAgIHJldHVybiAoSW5zdGFuY2UuKk1ldGhvZCkoc3RkOjptb3ZlKEFyZ3MpLi4uKTsKKyAgfQorCitwcml2YXRlOgorICBDbGFzc1QgJkluc3RhbmNlOworICBNZXRob2RUIE1ldGhvZDsKK307CisKKy8vIEhlbHBlciB0aGF0IHByb3ZpZGVzIGEgRnVuY3RvciBmb3IgZGVzZXJpYWxpemluZyBhcmd1bWVudHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJnVHM+IGNsYXNzIFJlYWRBcmdzIHsKK3B1YmxpYzoKKyAgRXJyb3Igb3BlcmF0b3IoKSgpIHsgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmdULCB0eXBlbmFtZS4uLiBBcmdUcz4KK2NsYXNzIFJlYWRBcmdzPEFyZ1QsIEFyZ1RzLi4uPiA6IHB1YmxpYyBSZWFkQXJnczxBcmdUcy4uLj4geworcHVibGljOgorICBSZWFkQXJncyhBcmdUICZBcmcsIEFyZ1RzICYuLi4gQXJncykKKyAgICAgIDogUmVhZEFyZ3M8QXJnVHMuLi4+KEFyZ3MuLi4pLCBBcmcoQXJnKSB7fQorCisgIEVycm9yIG9wZXJhdG9yKCkoQXJnVCAmQXJnVmFsLCBBcmdUcyAmLi4uIEFyZ1ZhbHMpIHsKKyAgICB0aGlzLT5BcmcgPSBzdGQ6Om1vdmUoQXJnVmFsKTsKKyAgICByZXR1cm4gUmVhZEFyZ3M8QXJnVHMuLi4+OjpvcGVyYXRvcigpKEFyZ1ZhbHMuLi4pOworICB9CisKK3ByaXZhdGU6CisgIEFyZ1QgJkFyZzsKK307CisKKy8vIE1hbmFnZSBzZXF1ZW5jZSBudW1iZXJzLgordGVtcGxhdGUgPHR5cGVuYW1lIFNlcXVlbmNlTnVtYmVyVD4gY2xhc3MgU2VxdWVuY2VOdW1iZXJNYW5hZ2VyIHsKK3B1YmxpYzoKKyAgLy8gUmVzZXQsIG1ha2luZyBhbGwgc2VxdWVuY2UgbnVtYmVycyBhdmFpbGFibGUuCisgIHZvaWQgcmVzZXQoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IExvY2soU2VxTm9Mb2NrKTsKKyAgICBOZXh0U2VxdWVuY2VOdW1iZXIgPSAwOworICAgIEZyZWVTZXF1ZW5jZU51bWJlcnMuY2xlYXIoKTsKKyAgfQorCisgIC8vIEdldCB0aGUgbmV4dCBhdmFpbGFibGUgc2VxdWVuY2UgbnVtYmVyLiBXaWxsIHJlLXVzZSBudW1iZXJzIHRoYXQgaGF2ZQorICAvLyBiZWVuIHJlbGVhc2VkLgorICBTZXF1ZW5jZU51bWJlclQgZ2V0U2VxdWVuY2VOdW1iZXIoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IExvY2soU2VxTm9Mb2NrKTsKKyAgICBpZiAoRnJlZVNlcXVlbmNlTnVtYmVycy5lbXB0eSgpKQorICAgICAgcmV0dXJuIE5leHRTZXF1ZW5jZU51bWJlcisrOworICAgIGF1dG8gU2VxdWVuY2VOdW1iZXIgPSBGcmVlU2VxdWVuY2VOdW1iZXJzLmJhY2soKTsKKyAgICBGcmVlU2VxdWVuY2VOdW1iZXJzLnBvcF9iYWNrKCk7CisgICAgcmV0dXJuIFNlcXVlbmNlTnVtYmVyOworICB9CisKKyAgLy8gUmVsZWFzZSBhIHNlcXVlbmNlIG51bWJlciwgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3IgcmUtdXNlLgorICB2b2lkIHJlbGVhc2VTZXF1ZW5jZU51bWJlcihTZXF1ZW5jZU51bWJlclQgU2VxdWVuY2VOdW1iZXIpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gTG9jayhTZXFOb0xvY2spOworICAgIEZyZWVTZXF1ZW5jZU51bWJlcnMucHVzaF9iYWNrKFNlcXVlbmNlTnVtYmVyKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6Om11dGV4IFNlcU5vTG9jazsKKyAgU2VxdWVuY2VOdW1iZXJUIE5leHRTZXF1ZW5jZU51bWJlciA9IDA7CisgIHN0ZDo6dmVjdG9yPFNlcXVlbmNlTnVtYmVyVD4gRnJlZVNlcXVlbmNlTnVtYmVyczsKK307CisKKy8vIENoZWNrcyB0aGF0IHByZWRpY2F0ZSBQIGhvbGRzIGZvciBlYWNoIGNvcnJlc3BvbmRpbmcgcGFpciBvZiB0eXBlIGFyZ3VtZW50cworLy8gZnJvbSBUMSBhbmQgVDIgdHVwbGUuCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLCBjbGFzcz4gY2xhc3MgUCwgdHlwZW5hbWUgVDFUdXBsZSwgdHlwZW5hbWUgVDJUdXBsZT4KK2NsYXNzIFJQQ0FyZ1R5cGVDaGVja0hlbHBlcjsKKwordGVtcGxhdGUgPHRlbXBsYXRlIDxjbGFzcywgY2xhc3M+IGNsYXNzIFA+CitjbGFzcyBSUENBcmdUeXBlQ2hlY2tIZWxwZXI8UCwgc3RkOjp0dXBsZTw+LCBzdGQ6OnR1cGxlPD4+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKwordGVtcGxhdGUgPHRlbXBsYXRlIDxjbGFzcywgY2xhc3M+IGNsYXNzIFAsIHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFRzLAorICAgICAgICAgIHR5cGVuYW1lIFUsIHR5cGVuYW1lLi4uIFVzPgorY2xhc3MgUlBDQXJnVHlwZUNoZWNrSGVscGVyPFAsIHN0ZDo6dHVwbGU8VCwgVHMuLi4+LCBzdGQ6OnR1cGxlPFUsIFVzLi4uPj4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9CisgICAgICBQPFQsIFU+Ojp2YWx1ZSAmJgorICAgICAgUlBDQXJnVHlwZUNoZWNrSGVscGVyPFAsIHN0ZDo6dHVwbGU8VHMuLi4+LCBzdGQ6OnR1cGxlPFVzLi4uPj46OnZhbHVlOworfTsKKwordGVtcGxhdGUgPHRlbXBsYXRlIDxjbGFzcywgY2xhc3M+IGNsYXNzIFAsIHR5cGVuYW1lIFQxU2lnLCB0eXBlbmFtZSBUMlNpZz4KK2NsYXNzIFJQQ0FyZ1R5cGVDaGVjayB7CitwdWJsaWM6CisgIHVzaW5nIFQxVHVwbGUgPSB0eXBlbmFtZSBGdW5jdGlvbkFyZ3NUdXBsZTxUMVNpZz46OlR5cGU7CisgIHVzaW5nIFQyVHVwbGUgPSB0eXBlbmFtZSBGdW5jdGlvbkFyZ3NUdXBsZTxUMlNpZz46OlR5cGU7CisKKyAgc3RhdGljX2Fzc2VydChzdGQ6OnR1cGxlX3NpemU8VDFUdXBsZT46OnZhbHVlID49CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dHVwbGVfc2l6ZTxUMlR1cGxlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIlRvbyBtYW55IGFyZ3VtZW50cyB0byBSUEMgY2FsbCIpOworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6dHVwbGVfc2l6ZTxUMVR1cGxlPjo6dmFsdWUgPD0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjp0dXBsZV9zaXplPFQyVHVwbGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiVG9vIGZldyBhcmd1bWVudHMgdG8gUlBDIGNhbGwiKTsKKworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IFJQQ0FyZ1R5cGVDaGVja0hlbHBlcjxQLCBUMVR1cGxlLCBUMlR1cGxlPjo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lIFdpcmVULCB0eXBlbmFtZSBDb25jcmV0ZVQ+CitjbGFzcyBDYW5TZXJpYWxpemUgeworcHJpdmF0ZToKKyAgdXNpbmcgUyA9IFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIFdpcmVULCBDb25jcmV0ZVQ+OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgc3RkOjp0cnVlX3R5cGUKKyAgY2hlY2sodHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgIHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShUOjpzZXJpYWxpemUoc3RkOjpkZWNsdmFsPENoYW5uZWxUICY+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpkZWNsdmFsPGNvbnN0IENvbmNyZXRlVCAmPigpKSksCisgICAgICAgICAgICAgICAgICAgICBFcnJvcj46OnZhbHVlLAorICAgICAgICB2b2lkICo+Ojp0eXBlKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWU+IHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgY2hlY2soLi4uKTsKKworcHVibGljOgorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGRlY2x0eXBlKGNoZWNrPFM+KDApKTo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lIFdpcmVULCB0eXBlbmFtZSBDb25jcmV0ZVQ+CitjbGFzcyBDYW5EZXNlcmlhbGl6ZSB7Citwcml2YXRlOgorICB1c2luZyBTID0gU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgV2lyZVQsIENvbmNyZXRlVD47CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZQorICBjaGVjayh0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgc3RkOjppc19zYW1lPGRlY2x0eXBlKFQ6OmRlc2VyaWFsaXplKHN0ZDo6ZGVjbHZhbDxDaGFubmVsVCAmPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpkZWNsdmFsPENvbmNyZXRlVCAmPigpKSksCisgICAgICAgICAgICAgICAgICAgICBFcnJvcj46OnZhbHVlLAorICAgICAgICB2b2lkICo+Ojp0eXBlKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWU+IHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgY2hlY2soLi4uKTsKKworcHVibGljOgorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGRlY2x0eXBlKGNoZWNrPFM+KDApKTo6dmFsdWU7Cit9OworCisvLy8gQ29udGFpbnMgcHJpbWl0aXZlIHV0aWxpdGllcyBmb3IgZGVmaW5pbmcsIGNhbGxpbmcgYW5kIGhhbmRsaW5nIGNhbGxzIHRvCisvLy8gcmVtb3RlIHByb2NlZHVyZXMuIENoYW5uZWxUIGlzIGEgYmlkaXJlY3Rpb25hbCBzdHJlYW0gY29uZm9ybWluZyB0byB0aGUKKy8vLyBSUENDaGFubmVsIGludGVyZmFjZSAoc2VlIFJQQ0NoYW5uZWwuaCksIEZ1bmN0aW9uSWRUIGlzIGEgcHJvY2VkdXJlCisvLy8gaWRlbnRpZmllciB0eXBlIHRoYXQgbXVzdCBiZSBzZXJpYWxpemFibGUgb24gQ2hhbm5lbFQsIGFuZCBTZXF1ZW5jZU51bWJlclQKKy8vLyBpcyBhbiBpbnRlZ3JhbCB0eXBlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG51bWJlciBpbi1mbGlnaHQgZnVuY3Rpb24gY2FsbHMuCisvLy8KKy8vLyBUaGVzZSB1dGlsaXRpZXMgc3VwcG9ydCB0aGUgY29uc3RydWN0aW9uIG9mIHZlcnkgcHJpbWl0aXZlIFJQQyB1dGlsaXRpZXMuCisvLy8gVGhlaXIgaW50ZW50IGlzIHRvIGVuc3VyZSBjb3JyZWN0IHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbiBvZgorLy8vIHByb2NlZHVyZSBhcmd1bWVudHMsIGFuZCB0byBrZWVwIHRoZSBjbGllbnQgYW5kIHNlcnZlcidzIHZpZXcgb2YgdGhlIEFQSSBpbgorLy8vIHN5bmMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbFQsIHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZSBGdW5jdGlvbklkVCwKKyAgICAgICAgICB0eXBlbmFtZSBTZXF1ZW5jZU51bWJlclQ+CitjbGFzcyBSUENFbmRwb2ludEJhc2UgeworcHJvdGVjdGVkOgorICBjbGFzcyBPcmNSUENJbnZhbGlkIDogcHVibGljIEZ1bmN0aW9uPE9yY1JQQ0ludmFsaWQsIHZvaWQoKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiX19vcmNfcnBjJGludmFsaWQiOyB9CisgIH07CisKKyAgY2xhc3MgT3JjUlBDUmVzcG9uc2UgOiBwdWJsaWMgRnVuY3Rpb248T3JjUlBDUmVzcG9uc2UsIHZvaWQoKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiX19vcmNfcnBjJHJlc3BvbnNlIjsgfQorICB9OworCisgIGNsYXNzIE9yY1JQQ05lZ290aWF0ZQorICAgICAgOiBwdWJsaWMgRnVuY3Rpb248T3JjUlBDTmVnb3RpYXRlLCBGdW5jdGlvbklkVChzdGQ6OnN0cmluZyk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIl9fb3JjX3JwYyRuZWdvdGlhdGUiOyB9CisgIH07CisKKyAgLy8gSGVscGVyIHByZWRpY2F0ZSBmb3IgdGVzdGluZyBmb3IgdGhlIHByZXNlbmNlIG9mIFNlcmlhbGl6ZVRyYWl0cworICAvLyBzZXJpYWxpemVycy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFdpcmVULCB0eXBlbmFtZSBDb25jcmV0ZVQ+CisgIGNsYXNzIENhblNlcmlhbGl6ZUNoZWNrIDogZGV0YWlsOjpDYW5TZXJpYWxpemU8Q2hhbm5lbFQsIFdpcmVULCBDb25jcmV0ZVQ+IHsKKyAgcHVibGljOgorICAgIHVzaW5nIGRldGFpbDo6Q2FuU2VyaWFsaXplPENoYW5uZWxULCBXaXJlVCwgQ29uY3JldGVUPjo6dmFsdWU7CisKKyAgICBzdGF0aWNfYXNzZXJ0KHZhbHVlLCAiTWlzc2luZyBzZXJpYWxpemVyIGZvciBhcmd1bWVudCAoQ2FuJ3Qgc2VyaWFsaXplIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZpcnN0IHRlbXBsYXRlIHR5cGUgYXJndW1lbnQgb2YgQ2FuU2VyaWFsaXplQ2hlY2sgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJmcm9tIHRoZSBzZWNvbmQpIik7CisgIH07CisKKyAgLy8gSGVscGVyIHByZWRpY2F0ZSBmb3IgdGVzdGluZyBmb3IgdGhlIHByZXNlbmNlIG9mIFNlcmlhbGl6ZVRyYWl0cworICAvLyBkZXNlcmlhbGl6ZXJzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgV2lyZVQsIHR5cGVuYW1lIENvbmNyZXRlVD4KKyAgY2xhc3MgQ2FuRGVzZXJpYWxpemVDaGVjaworICAgICAgOiBkZXRhaWw6OkNhbkRlc2VyaWFsaXplPENoYW5uZWxULCBXaXJlVCwgQ29uY3JldGVUPiB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBkZXRhaWw6OkNhbkRlc2VyaWFsaXplPENoYW5uZWxULCBXaXJlVCwgQ29uY3JldGVUPjo6dmFsdWU7CisKKyAgICBzdGF0aWNfYXNzZXJ0KHZhbHVlLCAiTWlzc2luZyBkZXNlcmlhbGl6ZXIgZm9yIGFyZ3VtZW50IChDYW4ndCBkZXNlcmlhbGl6ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBzZWNvbmQgdGVtcGxhdGUgdHlwZSBhcmd1bWVudCBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbkRlc2VyaWFsaXplQ2hlY2sgZnJvbSB0aGUgZmlyc3QpIik7CisgIH07CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdCBhbiBSUEMgaW5zdGFuY2Ugb24gYSBjaGFubmVsLgorICBSUENFbmRwb2ludEJhc2UoQ2hhbm5lbFQgJkMsIGJvb2wgTGF6eUF1dG9OZWdvdGlhdGlvbikKKyAgICAgIDogQyhDKSwgTGF6eUF1dG9OZWdvdGlhdGlvbihMYXp5QXV0b05lZ290aWF0aW9uKSB7CisgICAgLy8gSG9sZCBSZXNwb25zZUlkIGluIGEgc3BlY2lhbCB2YXJpYWJsZSwgc2luY2Ugd2UgZXhwZWN0IFJlc3BvbnNlIHRvIGJlCisgICAgLy8gY2FsbGVkIHJlbGF0aXZlbHkgZnJlcXVlbnRseSwgYW5kIHdhbnQgdG8gYXZvaWQgdGhlIG1hcCBsb29rdXAuCisgICAgUmVzcG9uc2VJZCA9IEZuSWRBbGxvY2F0b3IuZ2V0UmVzcG9uc2VJZCgpOworICAgIFJlbW90ZUZ1bmN0aW9uSWRzW09yY1JQQ1Jlc3BvbnNlOjpnZXRQcm90b3R5cGUoKV0gPSBSZXNwb25zZUlkOworCisgICAgLy8gUmVnaXN0ZXIgdGhlIG5lZ290aWF0ZSBmdW5jdGlvbiBpZCBhbmQgaGFuZGxlci4KKyAgICBhdXRvIE5lZ290aWF0ZUlkID0gRm5JZEFsbG9jYXRvci5nZXROZWdvdGlhdGVJZCgpOworICAgIFJlbW90ZUZ1bmN0aW9uSWRzW09yY1JQQ05lZ290aWF0ZTo6Z2V0UHJvdG90eXBlKCldID0gTmVnb3RpYXRlSWQ7CisgICAgSGFuZGxlcnNbTmVnb3RpYXRlSWRdID0gd3JhcEhhbmRsZXI8T3JjUlBDTmVnb3RpYXRlPigKKyAgICAgICAgW3RoaXNdKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7IHJldHVybiBoYW5kbGVOZWdvdGlhdGUoTmFtZSk7IH0pOworICB9CisKKworICAvLy8gTmVnb3RpYXRlIGEgZnVuY3Rpb24gaWQgZm9yIEZ1bmMgd2l0aCB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjaGFubmVsLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYz4gRXJyb3IgbmVnb3RpYXRlRnVuY3Rpb24oYm9vbCBSZXRyeSA9IGZhbHNlKSB7CisgICAgcmV0dXJuIGdldFJlbW90ZUZ1bmN0aW9uSWQ8RnVuYz4odHJ1ZSwgUmV0cnkpLnRha2VFcnJvcigpOworICB9CisKKyAgLy8vIEFwcGVuZCBhIGNhbGwgRnVuYywgZG9lcyBub3QgY2FsbCBzZW5kIG9uIHRoZSBjaGFubmVsLgorICAvLy8gVGhlIGZpcnN0IGFyZ3VtZW50IHNwZWNpZmllcyBhIHVzZXItZGVmaW5lZCBoYW5kbGVyIHRvIGJlIHJ1biB3aGVuIHRoZQorICAvLy8gZnVuY3Rpb24gcmV0dXJucy4gVGhlIGhhbmRsZXIgc2hvdWxkIHRha2UgYW4gRXhwZWN0ZWQ8RnVuYzo6UmV0dXJuVHlwZT4sCisgIC8vLyBvciBhbiBFcnJvciAoaWYgRnVuYzo6UmV0dXJuVHlwZSBpcyB2b2lkKS4gVGhlIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQKKyAgLy8vIHdpdGggYW4gZXJyb3IgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyBhYmFuZG9uZWQgZHVlIHRvIGEgY2hhbm5lbCBlcnJvci4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIEhhbmRsZXJULCB0eXBlbmFtZS4uLiBBcmdUcz4KKyAgRXJyb3IgYXBwZW5kQ2FsbEFzeW5jKEhhbmRsZXJUIEhhbmRsZXIsIGNvbnN0IEFyZ1RzICYuLi4gQXJncykgeworCisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgZGV0YWlsOjpSUENBcmdUeXBlQ2hlY2s8Q2FuU2VyaWFsaXplQ2hlY2ssIHR5cGVuYW1lIEZ1bmM6OlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQoQXJnVHMuLi4pPjo6dmFsdWUsCisgICAgICAgICIiKTsKKworICAgIC8vIExvb2sgdXAgdGhlIGZ1bmN0aW9uIElELgorICAgIEZ1bmN0aW9uSWRUIEZuSWQ7CisgICAgaWYgKGF1dG8gRm5JZE9yRXJyID0gZ2V0UmVtb3RlRnVuY3Rpb25JZDxGdW5jPihMYXp5QXV0b05lZ290aWF0aW9uLCBmYWxzZSkpCisgICAgICBGbklkID0gKkZuSWRPckVycjsKKyAgICBlbHNlIHsKKyAgICAgIC8vIE5lZ290aWF0aW9uIGZhaWxlZC4gTm90aWZ5IHRoZSBoYW5kbGVyIHRoZW4gcmV0dXJuIHRoZSBuZWdvdGlhdGUtZmFpbGVkCisgICAgICAvLyBlcnJvci4KKyAgICAgIGNhbnRGYWlsKEhhbmRsZXIobWFrZV9lcnJvcjxSZXNwb25zZUFiYW5kb25lZD4oKSkpOworICAgICAgcmV0dXJuIEZuSWRPckVyci50YWtlRXJyb3IoKTsKKyAgICB9CisKKyAgICBTZXF1ZW5jZU51bWJlclQgU2VxTm87IC8vIGluaXRpYWxpemVkIGluIGxvY2tlZCBzY29wZSBiZWxvdy4KKyAgICB7CisgICAgICAvLyBMb2NrIHRoZSBwZW5kaW5nIHJlc3BvbnNlcyBtYXAgYW5kIHNlcXVlbmNlIG51bWJlciBtYW5hZ2VyLgorICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IExvY2soUmVzcG9uc2VzTXV0ZXgpOworCisgICAgICAvLyBBbGxvY2F0ZSBhIHNlcXVlbmNlIG51bWJlci4KKyAgICAgIFNlcU5vID0gU2VxdWVuY2VOdW1iZXJNZ3IuZ2V0U2VxdWVuY2VOdW1iZXIoKTsKKyAgICAgIGFzc2VydCghUGVuZGluZ1Jlc3BvbnNlcy5jb3VudChTZXFObykgJiYKKyAgICAgICAgICAgICAiU2VxdWVuY2UgbnVtYmVyIGFscmVhZHkgYWxsb2NhdGVkIik7CisKKyAgICAgIC8vIEluc3RhbGwgdGhlIHVzZXIgaGFuZGxlci4KKyAgICAgIFBlbmRpbmdSZXNwb25zZXNbU2VxTm9dID0KKyAgICAgICAgZGV0YWlsOjpjcmVhdGVSZXNwb25zZUhhbmRsZXI8Q2hhbm5lbFQsIHR5cGVuYW1lIEZ1bmM6OlJldHVyblR5cGU+KAorICAgICAgICAgICAgc3RkOjptb3ZlKEhhbmRsZXIpKTsKKyAgICB9CisKKyAgICAvLyBPcGVuIHRoZSBmdW5jdGlvbiBjYWxsIG1lc3NhZ2UuCisgICAgaWYgKGF1dG8gRXJyID0gQy5zdGFydFNlbmRNZXNzYWdlKEZuSWQsIFNlcU5vKSkgeworICAgICAgYWJhbmRvblBlbmRpbmdSZXNwb25zZXMoKTsKKyAgICAgIHJldHVybiBFcnI7CisgICAgfQorCisgICAgLy8gU2VyaWFsaXplIHRoZSBjYWxsIGFyZ3VtZW50cy4KKyAgICBpZiAoYXV0byBFcnIgPSBkZXRhaWw6OkhhbmRsZXJUcmFpdHM8dHlwZW5hbWUgRnVuYzo6VHlwZT46OnNlcmlhbGl6ZUFyZ3MoCisgICAgICAgICAgICBDLCBBcmdzLi4uKSkgeworICAgICAgYWJhbmRvblBlbmRpbmdSZXNwb25zZXMoKTsKKyAgICAgIHJldHVybiBFcnI7CisgICAgfQorCisgICAgLy8gQ2xvc2UgdGhlIGZ1bmN0aW9uIGNhbGwgbWVzc2FnZWUuCisgICAgaWYgKGF1dG8gRXJyID0gQy5lbmRTZW5kTWVzc2FnZSgpKSB7CisgICAgICBhYmFuZG9uUGVuZGluZ1Jlc3BvbnNlcygpOworICAgICAgcmV0dXJuIEVycjsKKyAgICB9CisKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEVycm9yIHNlbmRBcHBlbmRlZENhbGxzKCkgeyByZXR1cm4gQy5zZW5kKCk7IH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIEhhbmRsZXJULCB0eXBlbmFtZS4uLiBBcmdUcz4KKyAgRXJyb3IgY2FsbEFzeW5jKEhhbmRsZXJUIEhhbmRsZXIsIGNvbnN0IEFyZ1RzICYuLi4gQXJncykgeworICAgIGlmIChhdXRvIEVyciA9IGFwcGVuZENhbGxBc3luYzxGdW5jPihzdGQ6Om1vdmUoSGFuZGxlciksIEFyZ3MuLi4pKQorICAgICAgcmV0dXJuIEVycjsKKyAgICByZXR1cm4gQy5zZW5kKCk7CisgIH0KKworICAvLy8gSGFuZGxlIG9uZSBpbmNvbWluZyBjYWxsLgorICBFcnJvciBoYW5kbGVPbmUoKSB7CisgICAgRnVuY3Rpb25JZFQgRm5JZDsKKyAgICBTZXF1ZW5jZU51bWJlclQgU2VxTm87CisgICAgaWYgKGF1dG8gRXJyID0gQy5zdGFydFJlY2VpdmVNZXNzYWdlKEZuSWQsIFNlcU5vKSkgeworICAgICAgYWJhbmRvblBlbmRpbmdSZXNwb25zZXMoKTsKKyAgICAgIHJldHVybiBFcnI7CisgICAgfQorICAgIGlmIChGbklkID09IFJlc3BvbnNlSWQpCisgICAgICByZXR1cm4gaGFuZGxlUmVzcG9uc2UoU2VxTm8pOworICAgIGF1dG8gSSA9IEhhbmRsZXJzLmZpbmQoRm5JZCk7CisgICAgaWYgKEkgIT0gSGFuZGxlcnMuZW5kKCkpCisgICAgICByZXR1cm4gSS0+c2Vjb25kKEMsIFNlcU5vKTsKKworICAgIC8vIGVsc2U6IE5vIGhhbmRsZXIgZm91bmQuIFJlcG9ydCBlcnJvciB0byBjbGllbnQ/CisgICAgcmV0dXJuIG1ha2VfZXJyb3I8QmFkRnVuY3Rpb25DYWxsPEZ1bmN0aW9uSWRULCBTZXF1ZW5jZU51bWJlclQ+PihGbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxTm8pOworICB9CisKKyAgLy8vIEhlbHBlciBmb3IgaGFuZGxpbmcgc2V0dGVyIHByb2NlZHVyZXMgLSB0aGlzIG1ldGhvZCByZXR1cm5zIGEgZnVuY3RvciB0aGF0CisgIC8vLyBzZXRzIHRoZSB2YXJpYWJsZXMgcmVmZXJyZWQgdG8gYnkgQXJncy4uLiB0byB2YWx1ZXMgZGVzZXJpYWxpemVkIGZyb20gdGhlCisgIC8vLyBjaGFubmVsLgorICAvLy8gRS5nLgorICAvLy8KKyAgLy8vICAgdHlwZWRlZiBGdW5jdGlvbjwwLCBib29sLCBpbnQ+IEZ1bmMxOworICAvLy8KKyAgLy8vICAgLi4uCisgIC8vLyAgIGJvb2wgQjsKKyAgLy8vICAgaW50IEk7CisgIC8vLyAgIGlmIChhdXRvIEVyciA9IGV4cGVjdDxGdW5jMT4oQ2hhbm5lbCwgcmVhZEFyZ3MoQiwgSSkpKQorICAvLy8gICAgIC8qIEhhbmRsZSBBcmdzICovIDsKKyAgLy8vCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdUcz4KKyAgc3RhdGljIGRldGFpbDo6UmVhZEFyZ3M8QXJnVHMuLi4+IHJlYWRBcmdzKEFyZ1RzICYuLi4gQXJncykgeworICAgIHJldHVybiBkZXRhaWw6OlJlYWRBcmdzPEFyZ1RzLi4uPihBcmdzLi4uKTsKKyAgfQorCisgIC8vLyBBYmFuZG9uIGFsbCBvdXRzdGFuZGluZyByZXN1bHQgaGFuZGxlcnMuCisgIC8vLworICAvLy8gVGhpcyB3aWxsIGNhbGwgYWxsIGN1cnJlbnRseSByZWdpc3RlcmVkIHJlc3VsdCBoYW5kbGVycyB0byByZWNlaXZlIGFuCisgIC8vLyAiYWJhbmRvbmVkIiBlcnJvciBhcyB0aGVpciBhcmd1bWVudC4gVGhpcyBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIFJQQworICAvLy8gaW4gZXJyb3Igc2l0dWF0aW9ucywgYnV0IGNhbiBhbHNvIGJlIGNhbGxlZCBkaXJlY3RseSBieSBjbGllbnRzIHdobyBhcmUKKyAgLy8vIGRpc2Nvbm5lY3RpbmcgZnJvbSB0aGUgcmVtb3RlIGFuZCBkb24ndCBvciBjYW4ndCBleHBlY3QgcmVzcG9uc2VzIHRvIHRoZWlyCisgIC8vLyBvdXRzdGFuZGluZyBjYWxscy4gKEVzcGVjaWFsbHkgZm9yIG91dHN0YW5kaW5nIGJsb2NraW5nIGNhbGxzLCBjYWxsaW5nCisgIC8vLyB0aGlzIGZ1bmN0aW9uIG1heSBiZSBuZWNlc3NhcnkgdG8gYXZvaWQgZGVhZCB0aHJlYWRzKS4KKyAgdm9pZCBhYmFuZG9uUGVuZGluZ1Jlc3BvbnNlcygpIHsKKyAgICAvLyBMb2NrIHRoZSBwZW5kaW5nIHJlc3BvbnNlcyBtYXAgYW5kIHNlcXVlbmNlIG51bWJlciBtYW5hZ2VyLgorICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBMb2NrKFJlc3BvbnNlc011dGV4KTsKKworICAgIGZvciAoYXV0byAmS1YgOiBQZW5kaW5nUmVzcG9uc2VzKQorICAgICAgS1Yuc2Vjb25kLT5hYmFuZG9uKCk7CisgICAgUGVuZGluZ1Jlc3BvbnNlcy5jbGVhcigpOworICAgIFNlcXVlbmNlTnVtYmVyTWdyLnJlc2V0KCk7CisgIH0KKworICAvLy8gUmVtb3ZlIHRoZSBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gZnVuY3Rpb24uCisgIC8vLyBBIGhhbmRsZXIgbXVzdCBjdXJyZW50bHkgYmUgcmVnaXN0ZXJlZCBmb3IgdGhpcyBmdW5jdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmM+CisgIHZvaWQgcmVtb3ZlSGFuZGxlcigpIHsKKyAgICBhdXRvIElkSXRyID0gTG9jYWxGdW5jdGlvbklkcy5maW5kKEZ1bmM6OmdldFByb3RvdHlwZSgpKTsKKyAgICBhc3NlcnQoSWRJdHIgIT0gTG9jYWxGdW5jdGlvbklkcy5lbmQoKSAmJgorICAgICAgICAgICAiRnVuY3Rpb24gZG9lcyBub3QgaGF2ZSBhIHJlZ2lzdGVyZWQgaGFuZGxlciIpOworICAgIGF1dG8gSGFuZGxlckl0ciA9IEhhbmRsZXJzLmZpbmQoSWRJdHItPnNlY29uZCk7CisgICAgYXNzZXJ0KEhhbmRsZXJJdHIgIT0gSGFuZGxlcnMuZW5kKCkgJiYKKyAgICAgICAgICAgIkZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYSByZWdpc3RlcmVkIGhhbmRsZXIiKTsKKyAgICBIYW5kbGVycy5lcmFzZShIYW5kbGVySXRyKTsKKyAgfQorCisgIC8vLyBDbGVhciBhbGwgaGFuZGxlcnMuCisgIHZvaWQgY2xlYXJIYW5kbGVycygpIHsKKyAgICBIYW5kbGVycy5jbGVhcigpOworICB9CisKK3Byb3RlY3RlZDoKKworICBGdW5jdGlvbklkVCBnZXRJbnZhbGlkRnVuY3Rpb25JZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRm5JZEFsbG9jYXRvci5nZXRJbnZhbGlkSWQoKTsKKyAgfQorCisgIC8vLyBBZGQgdGhlIGdpdmVuIGhhbmRsZXIgdG8gdGhlIGhhbmRsZXIgbWFwIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSBmb3IKKyAgLy8vIGF1dG9uZWdvdGlhdGlvbiBhbmQgZXhlY3V0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgSGFuZGxlclQ+CisgIHZvaWQgYWRkSGFuZGxlckltcGwoSGFuZGxlclQgSGFuZGxlcikgeworCisgICAgc3RhdGljX2Fzc2VydChkZXRhaWw6OlJQQ0FyZ1R5cGVDaGVjazwKKyAgICAgICAgICAgICAgICAgICAgICBDYW5EZXNlcmlhbGl6ZUNoZWNrLCB0eXBlbmFtZSBGdW5jOjpUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGRldGFpbDo6SGFuZGxlclRyYWl0czxIYW5kbGVyVD46OlR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICIiKTsKKworICAgIEZ1bmN0aW9uSWRUIE5ld0ZuSWQgPSBGbklkQWxsb2NhdG9yLnRlbXBsYXRlIGFsbG9jYXRlPEZ1bmM+KCk7CisgICAgTG9jYWxGdW5jdGlvbklkc1tGdW5jOjpnZXRQcm90b3R5cGUoKV0gPSBOZXdGbklkOworICAgIEhhbmRsZXJzW05ld0ZuSWRdID0gd3JhcEhhbmRsZXI8RnVuYz4oc3RkOjptb3ZlKEhhbmRsZXIpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBIYW5kbGVyVD4KKyAgdm9pZCBhZGRBc3luY0hhbmRsZXJJbXBsKEhhbmRsZXJUIEhhbmRsZXIpIHsKKworICAgIHN0YXRpY19hc3NlcnQoZGV0YWlsOjpSUENBcmdUeXBlQ2hlY2s8CisgICAgICAgICAgICAgICAgICAgICAgQ2FuRGVzZXJpYWxpemVDaGVjaywgdHlwZW5hbWUgRnVuYzo6VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBkZXRhaWw6OkFzeW5jSGFuZGxlclRyYWl0czwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGRldGFpbDo6SGFuZGxlclRyYWl0czxIYW5kbGVyVD46OlR5cGUKKyAgICAgICAgICAgICAgICAgICAgICA+OjpUeXBlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiIik7CisKKyAgICBGdW5jdGlvbklkVCBOZXdGbklkID0gRm5JZEFsbG9jYXRvci50ZW1wbGF0ZSBhbGxvY2F0ZTxGdW5jPigpOworICAgIExvY2FsRnVuY3Rpb25JZHNbRnVuYzo6Z2V0UHJvdG90eXBlKCldID0gTmV3Rm5JZDsKKyAgICBIYW5kbGVyc1tOZXdGbklkXSA9IHdyYXBBc3luY0hhbmRsZXI8RnVuYz4oc3RkOjptb3ZlKEhhbmRsZXIpKTsKKyAgfQorCisgIEVycm9yIGhhbmRsZVJlc3BvbnNlKFNlcXVlbmNlTnVtYmVyVCBTZXFObykgeworICAgIHVzaW5nIEhhbmRsZXIgPSB0eXBlbmFtZSBkZWNsdHlwZShQZW5kaW5nUmVzcG9uc2VzKTo6bWFwcGVkX3R5cGU7CisgICAgSGFuZGxlciBQUkhhbmRsZXI7CisKKyAgICB7CisgICAgICAvLyBMb2NrIHRoZSBwZW5kaW5nIHJlc3BvbnNlcyBtYXAgYW5kIHNlcXVlbmNlIG51bWJlciBtYW5hZ2VyLgorICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBMb2NrKFJlc3BvbnNlc011dGV4KTsKKyAgICAgIGF1dG8gSSA9IFBlbmRpbmdSZXNwb25zZXMuZmluZChTZXFObyk7CisKKyAgICAgIGlmIChJICE9IFBlbmRpbmdSZXNwb25zZXMuZW5kKCkpIHsKKyAgICAgICAgUFJIYW5kbGVyID0gc3RkOjptb3ZlKEktPnNlY29uZCk7CisgICAgICAgIFBlbmRpbmdSZXNwb25zZXMuZXJhc2UoSSk7CisgICAgICAgIFNlcXVlbmNlTnVtYmVyTWdyLnJlbGVhc2VTZXF1ZW5jZU51bWJlcihTZXFObyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBVbmxvY2sgdGhlIHBlbmRpbmcgcmVzdWx0cyBtYXAgdG8gcHJldmVudCByZWN1cnNpdmUgbG9jay4KKyAgICAgICAgTG9jay51bmxvY2soKTsKKyAgICAgICAgYWJhbmRvblBlbmRpbmdSZXNwb25zZXMoKTsKKyAgICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8CisgICAgICAgICAgICAgICAgIEludmFsaWRTZXF1ZW5jZU51bWJlckZvclJlc3BvbnNlPFNlcXVlbmNlTnVtYmVyVD4+KFNlcU5vKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnQoUFJIYW5kbGVyICYmCisgICAgICAgICAgICJJZiB3ZSBkaWRuJ3QgZmluZCBhIHJlc3BvbnNlIGhhbmRsZXIgd2Ugc2hvdWxkIGhhdmUgYmFpbGVkIG91dCIpOworCisgICAgaWYgKGF1dG8gRXJyID0gUFJIYW5kbGVyLT5oYW5kbGVSZXNwb25zZShDKSkgeworICAgICAgYWJhbmRvblBlbmRpbmdSZXNwb25zZXMoKTsKKyAgICAgIHJldHVybiBFcnI7CisgICAgfQorCisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBGdW5jdGlvbklkVCBoYW5kbGVOZWdvdGlhdGUoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIHsKKyAgICBhdXRvIEkgPSBMb2NhbEZ1bmN0aW9uSWRzLmZpbmQoTmFtZSk7CisgICAgaWYgKEkgPT0gTG9jYWxGdW5jdGlvbklkcy5lbmQoKSkKKyAgICAgIHJldHVybiBnZXRJbnZhbGlkRnVuY3Rpb25JZCgpOworICAgIHJldHVybiBJLT5zZWNvbmQ7CisgIH0KKworICAvLyBGaW5kIHRoZSByZW1vdGUgRnVuY3Rpb25JZCBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYz4KKyAgRXhwZWN0ZWQ8RnVuY3Rpb25JZFQ+IGdldFJlbW90ZUZ1bmN0aW9uSWQoYm9vbCBOZWdvdGlhdGVJZk5vdEluTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE5lZ290aWF0ZUlmSW52YWxpZCkgeworICAgIGJvb2wgRG9OZWdvdGlhdGU7CisKKyAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBmdW5jdGlvbiBpZC4uLgorICAgIGF1dG8gSSA9IFJlbW90ZUZ1bmN0aW9uSWRzLmZpbmQoRnVuYzo6Z2V0UHJvdG90eXBlKCkpOworICAgIGlmIChJICE9IFJlbW90ZUZ1bmN0aW9uSWRzLmVuZCgpKSB7CisgICAgICAvLyBJZiBpdCdzIHZhbGlkIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvLgorICAgICAgaWYgKEktPnNlY29uZCAhPSBnZXRJbnZhbGlkRnVuY3Rpb25JZCgpKQorICAgICAgICByZXR1cm4gSS0+c2Vjb25kOworICAgICAgRG9OZWdvdGlhdGUgPSBOZWdvdGlhdGVJZkludmFsaWQ7CisgICAgfSBlbHNlCisgICAgICBEb05lZ290aWF0ZSA9IE5lZ290aWF0ZUlmTm90SW5NYXA7CisKKyAgICAvLyBXZSBkb24ndCBoYXZlIGEgZnVuY3Rpb24gaWQgZm9yIEZ1bmMgeWV0LCBidXQgd2UncmUgYWxsb3dlZCB0byB0cnkgdG8KKyAgICAvLyBuZWdvdGlhdGUgb25lLgorICAgIGlmIChEb05lZ290aWF0ZSkgeworICAgICAgYXV0byAmSW1wbCA9IHN0YXRpY19jYXN0PEltcGxUICY+KCp0aGlzKTsKKyAgICAgIGlmIChhdXRvIFJlbW90ZUlkT3JFcnIgPQorICAgICAgICAgIEltcGwudGVtcGxhdGUgY2FsbEI8T3JjUlBDTmVnb3RpYXRlPihGdW5jOjpnZXRQcm90b3R5cGUoKSkpIHsKKyAgICAgICAgUmVtb3RlRnVuY3Rpb25JZHNbRnVuYzo6Z2V0UHJvdG90eXBlKCldID0gKlJlbW90ZUlkT3JFcnI7CisgICAgICAgIGlmICgqUmVtb3RlSWRPckVyciA9PSBnZXRJbnZhbGlkRnVuY3Rpb25JZCgpKQorICAgICAgICAgIHJldHVybiBtYWtlX2Vycm9yPENvdWxkTm90TmVnb3RpYXRlPihGdW5jOjpnZXRQcm90b3R5cGUoKSk7CisgICAgICAgIHJldHVybiAqUmVtb3RlSWRPckVycjsKKyAgICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gUmVtb3RlSWRPckVyci50YWtlRXJyb3IoKTsKKyAgICB9CisKKyAgICAvLyBObyBrZXkgd2FzIGF2YWlsYWJsZSBpbiB0aGUgbWFwIGFuZCB3ZSB3ZXJlbid0IGFsbG93ZWQgdG8gdHJ5IHRvCisgICAgLy8gbmVnb3RpYXRlIG9uZSwgc28gcmV0dXJuIGFuIHVua25vd24gZnVuY3Rpb24gZXJyb3IuCisgICAgcmV0dXJuIG1ha2VfZXJyb3I8Q291bGROb3ROZWdvdGlhdGU+KEZ1bmM6OmdldFByb3RvdHlwZSgpKTsKKyAgfQorCisgIHVzaW5nIFdyYXBwZWRIYW5kbGVyRm4gPSBzdGQ6OmZ1bmN0aW9uPEVycm9yKENoYW5uZWxUICYsIFNlcXVlbmNlTnVtYmVyVCk+OworCisgIC8vIFdyYXAgdGhlIGdpdmVuIHVzZXIgaGFuZGxlciBpbiB0aGUgbmVjZXNzYXJ5IGFyZ3VtZW50LWRlc2VyaWFsaXphdGlvbiBjb2RlLAorICAvLyByZXN1bHQtc2VyaWFsaXphdGlvbiBjb2RlLCBhbmQgY2FsbCB0byB0aGUgbGF1bmNoIHBvbGljeSAoaWYgcHJlc2VudCkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBIYW5kbGVyVD4KKyAgV3JhcHBlZEhhbmRsZXJGbiB3cmFwSGFuZGxlcihIYW5kbGVyVCBIYW5kbGVyKSB7CisgICAgcmV0dXJuIFt0aGlzLCBIYW5kbGVyXShDaGFubmVsVCAmQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyVCBTZXFObykgbXV0YWJsZSAtPiBFcnJvciB7CisgICAgICAvLyBTdGFydCBieSBkZXNlcmlhbGl6aW5nIHRoZSBhcmd1bWVudHMuCisgICAgICB1c2luZyBBcmdzVHVwbGUgPQorICAgICAgICAgIHR5cGVuYW1lIGRldGFpbDo6RnVuY3Rpb25BcmdzVHVwbGU8CisgICAgICAgICAgICB0eXBlbmFtZSBkZXRhaWw6OkhhbmRsZXJUcmFpdHM8SGFuZGxlclQ+OjpUeXBlPjo6VHlwZTsKKyAgICAgIGF1dG8gQXJncyA9IHN0ZDo6bWFrZV9zaGFyZWQ8QXJnc1R1cGxlPigpOworCisgICAgICBpZiAoYXV0byBFcnIgPQorICAgICAgICAgICAgICBkZXRhaWw6OkhhbmRsZXJUcmFpdHM8dHlwZW5hbWUgRnVuYzo6VHlwZT46OmRlc2VyaWFsaXplQXJncygKKyAgICAgICAgICAgICAgICAgIENoYW5uZWwsICpBcmdzKSkKKyAgICAgICAgcmV0dXJuIEVycjsKKworICAgICAgLy8gR0NDIDQuNyBhbmQgNC44IGluY29ycmVjdGx5IGlzc3VlIGEgLVd1bnVzZWQtYnV0LXNldC12YXJpYWJsZSB3YXJuaW5nCisgICAgICAvLyBmb3IgUlBDQXJncy4gVm9pZCBjYXN0IFJQQ0FyZ3MgdG8gd29yayBhcm91bmQgdGhpcyBmb3Igbm93LgorICAgICAgLy8gRklYTUU6IFJlbW92ZSB0aGlzIHdvcmthcm91bmQgb25jZSB3ZSBjYW4gYXNzdW1lIGEgd29ya2luZyBHQ0MgdmVyc2lvbi4KKyAgICAgICh2b2lkKUFyZ3M7CisKKyAgICAgIC8vIEVuZCByZWNlaWV2ZSBtZXNzYWdlLCB1bmxvY2tpbmcgdGhlIGNoYW5uZWwgZm9yIHJlYWRpbmcuCisgICAgICBpZiAoYXV0byBFcnIgPSBDaGFubmVsLmVuZFJlY2VpdmVNZXNzYWdlKCkpCisgICAgICAgIHJldHVybiBFcnI7CisKKyAgICAgIHVzaW5nIEhUcmFpdHMgPSBkZXRhaWw6OkhhbmRsZXJUcmFpdHM8SGFuZGxlclQ+OworICAgICAgdXNpbmcgRnVuY1JldHVybiA9IHR5cGVuYW1lIEZ1bmM6OlJldHVyblR5cGU7CisgICAgICByZXR1cm4gZGV0YWlsOjpyZXNwb25kPEZ1bmNSZXR1cm4+KENoYW5uZWwsIFJlc3BvbnNlSWQsIFNlcU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVHJhaXRzOjp1bnBhY2tBbmRSdW4oSGFuZGxlciwgKkFyZ3MpKTsKKyAgICB9OworICB9CisKKyAgLy8gV3JhcCB0aGUgZ2l2ZW4gdXNlciBoYW5kbGVyIGluIHRoZSBuZWNlc3NhcnkgYXJndW1lbnQtZGVzZXJpYWxpemF0aW9uIGNvZGUsCisgIC8vIHJlc3VsdC1zZXJpYWxpemF0aW9uIGNvZGUsIGFuZCBjYWxsIHRvIHRoZSBsYXVuY2ggcG9saWN5IChpZiBwcmVzZW50KS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIEhhbmRsZXJUPgorICBXcmFwcGVkSGFuZGxlckZuIHdyYXBBc3luY0hhbmRsZXIoSGFuZGxlclQgSGFuZGxlcikgeworICAgIHJldHVybiBbdGhpcywgSGFuZGxlcl0oQ2hhbm5lbFQgJkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZU51bWJlclQgU2VxTm8pIG11dGFibGUgLT4gRXJyb3IgeworICAgICAgLy8gU3RhcnQgYnkgZGVzZXJpYWxpemluZyB0aGUgYXJndW1lbnRzLgorICAgICAgdXNpbmcgQUhUcmFpdHMgPSBkZXRhaWw6OkFzeW5jSGFuZGxlclRyYWl0czwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBkZXRhaWw6OkhhbmRsZXJUcmFpdHM8SGFuZGxlclQ+OjpUeXBlPjsKKyAgICAgIHVzaW5nIEFyZ3NUdXBsZSA9CisgICAgICAgICAgdHlwZW5hbWUgZGV0YWlsOjpGdW5jdGlvbkFyZ3NUdXBsZTx0eXBlbmFtZSBBSFRyYWl0czo6VHlwZT46OlR5cGU7CisgICAgICBhdXRvIEFyZ3MgPSBzdGQ6Om1ha2Vfc2hhcmVkPEFyZ3NUdXBsZT4oKTsKKworICAgICAgaWYgKGF1dG8gRXJyID0KKyAgICAgICAgICAgICAgZGV0YWlsOjpIYW5kbGVyVHJhaXRzPHR5cGVuYW1lIEZ1bmM6OlR5cGU+OjpkZXNlcmlhbGl6ZUFyZ3MoCisgICAgICAgICAgICAgICAgICBDaGFubmVsLCAqQXJncykpCisgICAgICAgIHJldHVybiBFcnI7CisKKyAgICAgIC8vIEdDQyA0LjcgYW5kIDQuOCBpbmNvcnJlY3RseSBpc3N1ZSBhIC1XdW51c2VkLWJ1dC1zZXQtdmFyaWFibGUgd2FybmluZworICAgICAgLy8gZm9yIFJQQ0FyZ3MuIFZvaWQgY2FzdCBSUENBcmdzIHRvIHdvcmsgYXJvdW5kIHRoaXMgZm9yIG5vdy4KKyAgICAgIC8vIEZJWE1FOiBSZW1vdmUgdGhpcyB3b3JrYXJvdW5kIG9uY2Ugd2UgY2FuIGFzc3VtZSBhIHdvcmtpbmcgR0NDIHZlcnNpb24uCisgICAgICAodm9pZClBcmdzOworCisgICAgICAvLyBFbmQgcmVjZWlldmUgbWVzc2FnZSwgdW5sb2NraW5nIHRoZSBjaGFubmVsIGZvciByZWFkaW5nLgorICAgICAgaWYgKGF1dG8gRXJyID0gQ2hhbm5lbC5lbmRSZWNlaXZlTWVzc2FnZSgpKQorICAgICAgICByZXR1cm4gRXJyOworCisgICAgICB1c2luZyBIVHJhaXRzID0gZGV0YWlsOjpIYW5kbGVyVHJhaXRzPEhhbmRsZXJUPjsKKyAgICAgIHVzaW5nIEZ1bmNSZXR1cm4gPSB0eXBlbmFtZSBGdW5jOjpSZXR1cm5UeXBlOworICAgICAgYXV0byBSZXNwb25kZXIgPQorICAgICAgICBbdGhpcywgU2VxTm9dKHR5cGVuYW1lIEFIVHJhaXRzOjpSZXN1bHRUeXBlIFJldFZhbCkgLT4gRXJyb3IgeworICAgICAgICAgIHJldHVybiBkZXRhaWw6OnJlc3BvbmQ8RnVuY1JldHVybj4oQywgUmVzcG9uc2VJZCwgU2VxTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoUmV0VmFsKSk7CisgICAgICAgIH07CisKKyAgICAgIHJldHVybiBIVHJhaXRzOjp1bnBhY2tBbmRSdW5Bc3luYyhIYW5kbGVyLCBSZXNwb25kZXIsICpBcmdzKTsKKyAgICB9OworICB9CisKKyAgQ2hhbm5lbFQgJkM7CisKKyAgYm9vbCBMYXp5QXV0b05lZ290aWF0aW9uOworCisgIFJQQ0Z1bmN0aW9uSWRBbGxvY2F0b3I8RnVuY3Rpb25JZFQ+IEZuSWRBbGxvY2F0b3I7CisKKyAgRnVuY3Rpb25JZFQgUmVzcG9uc2VJZDsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEZ1bmN0aW9uSWRUPiBMb2NhbEZ1bmN0aW9uSWRzOworICBzdGQ6Om1hcDxjb25zdCBjaGFyICosIEZ1bmN0aW9uSWRUPiBSZW1vdGVGdW5jdGlvbklkczsKKworICBzdGQ6Om1hcDxGdW5jdGlvbklkVCwgV3JhcHBlZEhhbmRsZXJGbj4gSGFuZGxlcnM7CisKKyAgc3RkOjptdXRleCBSZXNwb25zZXNNdXRleDsKKyAgZGV0YWlsOjpTZXF1ZW5jZU51bWJlck1hbmFnZXI8U2VxdWVuY2VOdW1iZXJUPiBTZXF1ZW5jZU51bWJlck1ncjsKKyAgc3RkOjptYXA8U2VxdWVuY2VOdW1iZXJULCBzdGQ6OnVuaXF1ZV9wdHI8ZGV0YWlsOjpSZXNwb25zZUhhbmRsZXI8Q2hhbm5lbFQ+Pj4KKyAgICAgIFBlbmRpbmdSZXNwb25zZXM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUgRnVuY3Rpb25JZFQgPSB1aW50MzJfdCwKKyAgICAgICAgICB0eXBlbmFtZSBTZXF1ZW5jZU51bWJlclQgPSB1aW50MzJfdD4KK2NsYXNzIE11bHRpVGhyZWFkZWRSUENFbmRwb2ludAorICAgIDogcHVibGljIGRldGFpbDo6UlBDRW5kcG9pbnRCYXNlPAorICAgICAgICAgIE11bHRpVGhyZWFkZWRSUENFbmRwb2ludDxDaGFubmVsVCwgRnVuY3Rpb25JZFQsIFNlcXVlbmNlTnVtYmVyVD4sCisgICAgICAgICAgQ2hhbm5lbFQsIEZ1bmN0aW9uSWRULCBTZXF1ZW5jZU51bWJlclQ+IHsKK3ByaXZhdGU6CisgIHVzaW5nIEJhc2VDbGFzcyA9CisgICAgICBkZXRhaWw6OlJQQ0VuZHBvaW50QmFzZTwKKyAgICAgICAgTXVsdGlUaHJlYWRlZFJQQ0VuZHBvaW50PENoYW5uZWxULCBGdW5jdGlvbklkVCwgU2VxdWVuY2VOdW1iZXJUPiwKKyAgICAgICAgQ2hhbm5lbFQsIEZ1bmN0aW9uSWRULCBTZXF1ZW5jZU51bWJlclQ+OworCitwdWJsaWM6CisgIE11bHRpVGhyZWFkZWRSUENFbmRwb2ludChDaGFubmVsVCAmQywgYm9vbCBMYXp5QXV0b05lZ290aWF0aW9uKQorICAgICAgOiBCYXNlQ2xhc3MoQywgTGF6eUF1dG9OZWdvdGlhdGlvbikge30KKworICAvLy8gQWRkIGEgaGFuZGxlciBmb3IgdGhlIGdpdmVuIFJQQyBmdW5jdGlvbi4KKyAgLy8vIFRoaXMgaW5zdGFsbHMgdGhlIGdpdmVuIGhhbmRsZXIgZnVuY3RvciBmb3IgdGhlIGdpdmVuIFJQQyBGdW5jdGlvbiwgYW5kCisgIC8vLyBtYWtlcyB0aGUgUlBDIGZ1bmN0aW9uIGF2YWlsYWJsZSBmb3IgbmVnb3RpYXRpb24vY2FsbGluZyBmcm9tIHRoZSByZW1vdGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBIYW5kbGVyVD4KKyAgdm9pZCBhZGRIYW5kbGVyKEhhbmRsZXJUIEhhbmRsZXIpIHsKKyAgICByZXR1cm4gdGhpcy0+dGVtcGxhdGUgYWRkSGFuZGxlckltcGw8RnVuYz4oc3RkOjptb3ZlKEhhbmRsZXIpKTsKKyAgfQorCisgIC8vLyBBZGQgYSBjbGFzcy1tZXRob2QgYXMgYSBoYW5kbGVyLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgQ2xhc3NULCB0eXBlbmFtZSBSZXRULCB0eXBlbmFtZS4uLiBBcmdUcz4KKyAgdm9pZCBhZGRIYW5kbGVyKENsYXNzVCAmT2JqZWN0LCBSZXRUIChDbGFzc1Q6OipNZXRob2QpKEFyZ1RzLi4uKSkgeworICAgIGFkZEhhbmRsZXI8RnVuYz4oCisgICAgICBkZXRhaWw6Ok1lbWJlckZuV3JhcHBlcjxDbGFzc1QsIFJldFQsIEFyZ1RzLi4uPihPYmplY3QsIE1ldGhvZCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIEhhbmRsZXJUPgorICB2b2lkIGFkZEFzeW5jSGFuZGxlcihIYW5kbGVyVCBIYW5kbGVyKSB7CisgICAgcmV0dXJuIHRoaXMtPnRlbXBsYXRlIGFkZEFzeW5jSGFuZGxlckltcGw8RnVuYz4oc3RkOjptb3ZlKEhhbmRsZXIpKTsKKyAgfQorCisgIC8vLyBBZGQgYSBjbGFzcy1tZXRob2QgYXMgYSBoYW5kbGVyLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgQ2xhc3NULCB0eXBlbmFtZSBSZXRULCB0eXBlbmFtZS4uLiBBcmdUcz4KKyAgdm9pZCBhZGRBc3luY0hhbmRsZXIoQ2xhc3NUICZPYmplY3QsIFJldFQgKENsYXNzVDo6Kk1ldGhvZCkoQXJnVHMuLi4pKSB7CisgICAgYWRkQXN5bmNIYW5kbGVyPEZ1bmM+KAorICAgICAgZGV0YWlsOjpNZW1iZXJGbldyYXBwZXI8Q2xhc3NULCBSZXRULCBBcmdUcy4uLj4oT2JqZWN0LCBNZXRob2QpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHlwZSBmb3Igbm9uLWJsb2NraW5nIGNhbGwgcHJpbWl0aXZlcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmM+CisgIHVzaW5nIE5vbkJsb2NraW5nQ2FsbFJlc3VsdCA9IHR5cGVuYW1lIGRldGFpbDo6UmVzdWx0VHJhaXRzPAorICAgICAgdHlwZW5hbWUgRnVuYzo6UmV0dXJuVHlwZT46OlJldHVybkZ1dHVyZVR5cGU7CisKKyAgLy8vIENhbGwgRnVuYyBvbiBDaGFubmVsIEMuIERvZXMgbm90IGJsb2NrLCBkb2VzIG5vdCBjYWxsIHNlbmQuIFJldHVybnMgYSBwYWlyCisgIC8vLyBvZiBhIGZ1dHVyZSByZXN1bHQgYW5kIHRoZSBzZXF1ZW5jZSBudW1iZXIgYXNzaWduZWQgdG8gdGhlIHJlc3VsdC4KKyAgLy8vCisgIC8vLyBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gaXMgcHJpbWFyaWx5IHVzZWQgZm9yIHNpbmdsZS10aHJlYWRlZCBtb2RlIHN1cHBvcnQsCisgIC8vLyB3aGVyZSB0aGUgc2VxdWVuY2UgbnVtYmVyIGNhbiBiZSB1c2VkIHRvIHdhaXQgZm9yIHRoZSBjb3JyZXNwb25kaW5nCisgIC8vLyByZXN1bHQuIEluIG11bHRpLXRocmVhZGVkIG1vZGUgdGhlIGFwcGVuZENhbGxOQiBtZXRob2QsIHdoaWNoIGRvZXMgbm90CisgIC8vLyByZXR1cm4gdGhlIHNlcXVlbmNlIG51bWViZXIsIHNob3VsZCBiZSBwcmVmZXJyZWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZS4uLiBBcmdUcz4KKyAgRXhwZWN0ZWQ8Tm9uQmxvY2tpbmdDYWxsUmVzdWx0PEZ1bmM+PiBhcHBlbmRDYWxsTkIoY29uc3QgQXJnVHMgJi4uLiBBcmdzKSB7CisgICAgdXNpbmcgUlRyYWl0cyA9IGRldGFpbDo6UmVzdWx0VHJhaXRzPHR5cGVuYW1lIEZ1bmM6OlJldHVyblR5cGU+OworICAgIHVzaW5nIEVycm9yUmV0dXJuID0gdHlwZW5hbWUgUlRyYWl0czo6RXJyb3JSZXR1cm5UeXBlOworICAgIHVzaW5nIEVycm9yUmV0dXJuUHJvbWlzZSA9IHR5cGVuYW1lIFJUcmFpdHM6OlJldHVyblByb21pc2VUeXBlOworCisgICAgLy8gRklYTUU6IFN0YWNrIGFsbG9jYXRlIGFuZCBtb3ZlIHRoaXMgaW50byB0aGUgaGFuZGxlciBvbmNlIExMVk0gYnVpbGRzCisgICAgLy8gICAgICAgIHdpdGggQysrMTQuCisgICAgYXV0byBQcm9taXNlID0gc3RkOjptYWtlX3NoYXJlZDxFcnJvclJldHVyblByb21pc2U+KCk7CisgICAgYXV0byBGdXR1cmVSZXN1bHQgPSBQcm9taXNlLT5nZXRfZnV0dXJlKCk7CisKKyAgICBpZiAoYXV0byBFcnIgPSB0aGlzLT50ZW1wbGF0ZSBhcHBlbmRDYWxsQXN5bmM8RnVuYz4oCisgICAgICAgICAgICBbUHJvbWlzZV0oRXJyb3JSZXR1cm4gUmV0T3JFcnIpIHsKKyAgICAgICAgICAgICAgUHJvbWlzZS0+c2V0X3ZhbHVlKHN0ZDo6bW92ZShSZXRPckVycikpOworICAgICAgICAgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBBcmdzLi4uKSkgeworICAgICAgUlRyYWl0czo6Y29uc3VtZUFiYW5kb25lZChGdXR1cmVSZXN1bHQuZ2V0KCkpOworICAgICAgcmV0dXJuIHN0ZDo6bW92ZShFcnIpOworICAgIH0KKyAgICByZXR1cm4gc3RkOjptb3ZlKEZ1dHVyZVJlc3VsdCk7CisgIH0KKworICAvLy8gVGhlIHNhbWUgYXMgYXBwZW5kQ2FsbE5CV2l0aFNlcSwgZXhjZXB0IHRoYXQgaXQgY2FsbHMgQy5zZW5kKCkgdG8KKyAgLy8vIGZsdXNoIHRoZSBjaGFubmVsIGFmdGVyIHNlcmlhbGl6aW5nIHRoZSBjYWxsLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUuLi4gQXJnVHM+CisgIEV4cGVjdGVkPE5vbkJsb2NraW5nQ2FsbFJlc3VsdDxGdW5jPj4gY2FsbE5CKGNvbnN0IEFyZ1RzICYuLi4gQXJncykgeworICAgIGF1dG8gUmVzdWx0ID0gYXBwZW5kQ2FsbE5CPEZ1bmM+KEFyZ3MuLi4pOworICAgIGlmICghUmVzdWx0KQorICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICBpZiAoYXV0byBFcnIgPSB0aGlzLT5DLnNlbmQoKSkgeworICAgICAgdGhpcy0+YWJhbmRvblBlbmRpbmdSZXNwb25zZXMoKTsKKyAgICAgIGRldGFpbDo6UmVzdWx0VHJhaXRzPHR5cGVuYW1lIEZ1bmM6OlJldHVyblR5cGU+Ojpjb25zdW1lQWJhbmRvbmVkKAorICAgICAgICAgIHN0ZDo6bW92ZShSZXN1bHQtPmdldCgpKSk7CisgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICAvLy8gQ2FsbCBGdW5jIG9uIENoYW5uZWwgQy4gQmxvY2tzIHdhaXRpbmcgZm9yIGEgcmVzdWx0LiBSZXR1cm5zIGFuIEVycm9yCisgIC8vLyBmb3Igdm9pZCBmdW5jdGlvbnMgb3IgYW4gRXhwZWN0ZWQ8VD4gZm9yIGZ1bmN0aW9ucyByZXR1cm5pbmcgYSBULgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgZm9yIHVzZSBpbiB0aHJlYWRlZCBjb2RlIHdoZXJlIGFub3RoZXIgdGhyZWFkIGlzCisgIC8vLyBoYW5kbGluZyByZXNwb25zZXMgYW5kIGluY29taW5nIGNhbGxzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUuLi4gQXJnVHMsCisgICAgICAgICAgICB0eXBlbmFtZSBBbHRSZXRUID0gdHlwZW5hbWUgRnVuYzo6UmV0dXJuVHlwZT4KKyAgdHlwZW5hbWUgZGV0YWlsOjpSZXN1bHRUcmFpdHM8QWx0UmV0VD46OkVycm9yUmV0dXJuVHlwZQorICBjYWxsQihjb25zdCBBcmdUcyAmLi4uIEFyZ3MpIHsKKyAgICBpZiAoYXV0byBGdXR1cmVSZXNPckVyciA9IGNhbGxOQjxGdW5jPihBcmdzLi4uKSkKKyAgICAgIHJldHVybiBGdXR1cmVSZXNPckVyci0+Z2V0KCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIEZ1dHVyZVJlc09yRXJyLnRha2VFcnJvcigpOworICB9CisKKyAgLy8vIEhhbmRsZSBpbmNvbWluZyBSUEMgY2FsbHMuCisgIEVycm9yIGhhbmRsZXJMb29wKCkgeworICAgIHdoaWxlICh0cnVlKQorICAgICAgaWYgKGF1dG8gRXJyID0gdGhpcy0+aGFuZGxlT25lKCkpCisgICAgICAgIHJldHVybiBFcnI7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUgRnVuY3Rpb25JZFQgPSB1aW50MzJfdCwKKyAgICAgICAgICB0eXBlbmFtZSBTZXF1ZW5jZU51bWJlclQgPSB1aW50MzJfdD4KK2NsYXNzIFNpbmdsZVRocmVhZGVkUlBDRW5kcG9pbnQKKyAgICA6IHB1YmxpYyBkZXRhaWw6OlJQQ0VuZHBvaW50QmFzZTwKKyAgICAgICAgICBTaW5nbGVUaHJlYWRlZFJQQ0VuZHBvaW50PENoYW5uZWxULCBGdW5jdGlvbklkVCwgU2VxdWVuY2VOdW1iZXJUPiwKKyAgICAgICAgICBDaGFubmVsVCwgRnVuY3Rpb25JZFQsIFNlcXVlbmNlTnVtYmVyVD4geworcHJpdmF0ZToKKyAgdXNpbmcgQmFzZUNsYXNzID0KKyAgICAgIGRldGFpbDo6UlBDRW5kcG9pbnRCYXNlPAorICAgICAgICBTaW5nbGVUaHJlYWRlZFJQQ0VuZHBvaW50PENoYW5uZWxULCBGdW5jdGlvbklkVCwgU2VxdWVuY2VOdW1iZXJUPiwKKyAgICAgICAgQ2hhbm5lbFQsIEZ1bmN0aW9uSWRULCBTZXF1ZW5jZU51bWJlclQ+OworCitwdWJsaWM6CisgIFNpbmdsZVRocmVhZGVkUlBDRW5kcG9pbnQoQ2hhbm5lbFQgJkMsIGJvb2wgTGF6eUF1dG9OZWdvdGlhdGlvbikKKyAgICAgIDogQmFzZUNsYXNzKEMsIExhenlBdXRvTmVnb3RpYXRpb24pIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIEhhbmRsZXJUPgorICB2b2lkIGFkZEhhbmRsZXIoSGFuZGxlclQgSGFuZGxlcikgeworICAgIHJldHVybiB0aGlzLT50ZW1wbGF0ZSBhZGRIYW5kbGVySW1wbDxGdW5jPihzdGQ6Om1vdmUoSGFuZGxlcikpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIENsYXNzVCwgdHlwZW5hbWUgUmV0VCwgdHlwZW5hbWUuLi4gQXJnVHM+CisgIHZvaWQgYWRkSGFuZGxlcihDbGFzc1QgJk9iamVjdCwgUmV0VCAoQ2xhc3NUOjoqTWV0aG9kKShBcmdUcy4uLikpIHsKKyAgICBhZGRIYW5kbGVyPEZ1bmM+KAorICAgICAgICBkZXRhaWw6Ok1lbWJlckZuV3JhcHBlcjxDbGFzc1QsIFJldFQsIEFyZ1RzLi4uPihPYmplY3QsIE1ldGhvZCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIEhhbmRsZXJUPgorICB2b2lkIGFkZEFzeW5jSGFuZGxlcihIYW5kbGVyVCBIYW5kbGVyKSB7CisgICAgcmV0dXJuIHRoaXMtPnRlbXBsYXRlIGFkZEFzeW5jSGFuZGxlckltcGw8RnVuYz4oc3RkOjptb3ZlKEhhbmRsZXIpKTsKKyAgfQorCisgIC8vLyBBZGQgYSBjbGFzcy1tZXRob2QgYXMgYSBoYW5kbGVyLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgQ2xhc3NULCB0eXBlbmFtZSBSZXRULCB0eXBlbmFtZS4uLiBBcmdUcz4KKyAgdm9pZCBhZGRBc3luY0hhbmRsZXIoQ2xhc3NUICZPYmplY3QsIFJldFQgKENsYXNzVDo6Kk1ldGhvZCkoQXJnVHMuLi4pKSB7CisgICAgYWRkQXN5bmNIYW5kbGVyPEZ1bmM+KAorICAgICAgZGV0YWlsOjpNZW1iZXJGbldyYXBwZXI8Q2xhc3NULCBSZXRULCBBcmdUcy4uLj4oT2JqZWN0LCBNZXRob2QpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZS4uLiBBcmdUcywKKyAgICAgICAgICAgIHR5cGVuYW1lIEFsdFJldFQgPSB0eXBlbmFtZSBGdW5jOjpSZXR1cm5UeXBlPgorICB0eXBlbmFtZSBkZXRhaWw6OlJlc3VsdFRyYWl0czxBbHRSZXRUPjo6RXJyb3JSZXR1cm5UeXBlCisgIGNhbGxCKGNvbnN0IEFyZ1RzICYuLi4gQXJncykgeworICAgIGJvb2wgUmVjZWl2ZWRSZXNwb25zZSA9IGZhbHNlOworICAgIHVzaW5nIFJlc3VsdFR5cGUgPSB0eXBlbmFtZSBkZXRhaWw6OlJlc3VsdFRyYWl0czxBbHRSZXRUPjo6RXJyb3JSZXR1cm5UeXBlOworICAgIGF1dG8gUmVzdWx0ID0gZGV0YWlsOjpSZXN1bHRUcmFpdHM8QWx0UmV0VD46OmNyZWF0ZUJsYW5rRXJyb3JSZXR1cm5WYWx1ZSgpOworCisgICAgLy8gV2UgaGF2ZSB0byAnQ2hlY2snIHJlc3VsdCAod2hpY2ggd2Uga25vdyBpcyBpbiBhIHN1Y2Nlc3Mgc3RhdGUgYXQgdGhpcworICAgIC8vIHBvaW50KSBzbyB0aGF0IGl0IGNhbiBiZSBvdmVyd3JpdHRlbiBpbiB0aGUgYXN5bmMgaGFuZGxlci4KKyAgICAodm9pZCkhIVJlc3VsdDsKKworICAgIGlmIChhdXRvIEVyciA9IHRoaXMtPnRlbXBsYXRlIGFwcGVuZENhbGxBc3luYzxGdW5jPigKKyAgICAgICAgICAgIFsmXShSZXN1bHRUeXBlIFIpIHsKKyAgICAgICAgICAgICAgUmVzdWx0ID0gc3RkOjptb3ZlKFIpOworICAgICAgICAgICAgICBSZWNlaXZlZFJlc3BvbnNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgQXJncy4uLikpIHsKKyAgICAgIGRldGFpbDo6UmVzdWx0VHJhaXRzPHR5cGVuYW1lIEZ1bmM6OlJldHVyblR5cGU+Ojpjb25zdW1lQWJhbmRvbmVkKAorICAgICAgICAgIHN0ZDo6bW92ZShSZXN1bHQpKTsKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKyAgICB9CisKKyAgICB3aGlsZSAoIVJlY2VpdmVkUmVzcG9uc2UpIHsKKyAgICAgIGlmIChhdXRvIEVyciA9IHRoaXMtPmhhbmRsZU9uZSgpKSB7CisgICAgICAgIGRldGFpbDo6UmVzdWx0VHJhaXRzPHR5cGVuYW1lIEZ1bmM6OlJldHVyblR5cGU+Ojpjb25zdW1lQWJhbmRvbmVkKAorICAgICAgICAgICAgc3RkOjptb3ZlKFJlc3VsdCkpOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorfTsKKworLy8vIEFzeW5jaHJvbm91cyBkaXNwYXRjaCBmb3IgYSBmdW5jdGlvbiBvbiBhbiBSUEMgZW5kcG9pbnQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUlBDQ2xhc3MsIHR5cGVuYW1lIEZ1bmM+CitjbGFzcyBSUENBc3luY0Rpc3BhdGNoIHsKK3B1YmxpYzoKKyAgUlBDQXN5bmNEaXNwYXRjaChSUENDbGFzcyAmRW5kcG9pbnQpIDogRW5kcG9pbnQoRW5kcG9pbnQpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXJULCB0eXBlbmFtZS4uLiBBcmdUcz4KKyAgRXJyb3Igb3BlcmF0b3IoKShIYW5kbGVyVCBIYW5kbGVyLCBjb25zdCBBcmdUcyAmLi4uIEFyZ3MpIGNvbnN0IHsKKyAgICByZXR1cm4gRW5kcG9pbnQudGVtcGxhdGUgYXBwZW5kQ2FsbEFzeW5jPEZ1bmM+KHN0ZDo6bW92ZShIYW5kbGVyKSwgQXJncy4uLik7CisgIH0KKworcHJpdmF0ZToKKyAgUlBDQ2xhc3MgJkVuZHBvaW50OworfTsKKworLy8vIENvbnN0cnVjdCBhbiBhc3luY2hyb25vdXMgZGlzcGF0Y2hlciBmcm9tIGFuIFJQQyBlbmRwb2ludCBhbmQgYSBGdW5jLgordGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIFJQQ0VuZHBvaW50VD4KK1JQQ0FzeW5jRGlzcGF0Y2g8UlBDRW5kcG9pbnRULCBGdW5jPiBycGNBc3luY0Rpc3BhdGNoKFJQQ0VuZHBvaW50VCAmRW5kcG9pbnQpIHsKKyAgcmV0dXJuIFJQQ0FzeW5jRGlzcGF0Y2g8UlBDRW5kcG9pbnRULCBGdW5jPihFbmRwb2ludCk7Cit9CisKKy8vLyBcYnJpZWYgQWxsb3dzIGEgc2V0IG9mIGFzeW5jaHJvdW5vdXMgY2FsbHMgdG8gYmUgZGlzcGF0Y2hlZCwgYW5kIHRoZW4KKy8vLyAgICAgICAgd2FpdGVkIG9uIGFzIGEgZ3JvdXAuCitjbGFzcyBQYXJhbGxlbENhbGxHcm91cCB7CitwdWJsaWM6CisKKyAgUGFyYWxsZWxDYWxsR3JvdXAoKSA9IGRlZmF1bHQ7CisgIFBhcmFsbGVsQ2FsbEdyb3VwKGNvbnN0IFBhcmFsbGVsQ2FsbEdyb3VwICYpID0gZGVsZXRlOworICBQYXJhbGxlbENhbGxHcm91cCAmb3BlcmF0b3I9KGNvbnN0IFBhcmFsbGVsQ2FsbEdyb3VwICYpID0gZGVsZXRlOworCisgIC8vLyBcYnJpZWYgTWFrZSBhcyBhc3luY2hyb25vdXMgY2FsbC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jRGlzcGF0Y2hlciwgdHlwZW5hbWUgSGFuZGxlclQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorICBFcnJvciBjYWxsKGNvbnN0IEFzeW5jRGlzcGF0Y2hlciAmQXN5bmNEaXNwYXRjaCwgSGFuZGxlclQgSGFuZGxlciwKKyAgICAgICAgICAgICBjb25zdCBBcmdUcyAmLi4uIEFyZ3MpIHsKKyAgICAvLyBJbmNyZW1lbnQgdGhlIGNvdW50IG9mIG91dHN0YW5kaW5nIGNhbGxzLiBUaGlzIGhhcyB0byBoYXBwZW4gYmVmb3JlCisgICAgLy8gd2UgaW52b2tlIHRoZSBjYWxsLCBhcyB0aGUgaGFuZGxlciBtYXkgKGRlcGVuZGluZyBvbiBzY2hlZHVsaW5nKQorICAgIC8vIGJlIHJ1biBpbW1lZGlhdGVseSBvbiBhbm90aGVyIHRocmVhZCwgYW5kIHdlIGRvbid0IHdhbnQgdGhlIGRlY3JlbWVudAorICAgIC8vIGluIHRoZSB3cmFwcGVkIGhhbmRsZXIgYmVsb3cgdG8gcnVuIGJlZm9yZSB0aGUgaW5jcmVtZW50LgorICAgIHsKKyAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gTG9jayhNKTsKKyAgICAgICsrTnVtT3V0c3RhbmRpbmdDYWxsczsKKyAgICB9CisKKyAgICAvLyBXcmFwIHRoZSB1c2VyIGhhbmRsZXIgaW4gYSBsYW1iZGEgdGhhdCB3aWxsIGRlY3JlbWVudCB0aGUKKyAgICAvLyBvdXRzdGFuZGluZyBjYWxscyBjb3VudCwgdGhlbiBwb2tlIHRoZSBjb25kaXRpb24gdmFyaWFibGUuCisgICAgdXNpbmcgQXJnVHlwZSA9IHR5cGVuYW1lIGRldGFpbDo6UmVzcG9uc2VIYW5kbGVyQXJnPAorICAgICAgICB0eXBlbmFtZSBkZXRhaWw6OkhhbmRsZXJUcmFpdHM8SGFuZGxlclQ+OjpUeXBlPjo6QXJnVHlwZTsKKyAgICAvLyBGSVhNRTogTW92ZSBoYW5kbGVyIGludG8gd3JhcHBlZCBoYW5kbGVyIG9uY2Ugd2UgaGF2ZSBDKysxNC4KKyAgICBhdXRvIFdyYXBwZWRIYW5kbGVyID0gW3RoaXMsIEhhbmRsZXJdKEFyZ1R5cGUgQXJnKSB7CisgICAgICBhdXRvIEVyciA9IEhhbmRsZXIoc3RkOjptb3ZlKEFyZykpOworICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBMb2NrKE0pOworICAgICAgLS1OdW1PdXRzdGFuZGluZ0NhbGxzOworICAgICAgQ1Yubm90aWZ5X2FsbCgpOworICAgICAgcmV0dXJuIEVycjsKKyAgICB9OworCisgICAgcmV0dXJuIEFzeW5jRGlzcGF0Y2goc3RkOjptb3ZlKFdyYXBwZWRIYW5kbGVyKSwgQXJncy4uLik7CisgIH0KKworICAvLy8gXGJyaWVmIEJsb2NrcyB1bnRpbCBhbGwgY2FsbHMgaGF2ZSBiZWVuIGNvbXBsZXRlZCBhbmQgdGhlaXIgcmV0dXJuIHZhbHVlCisgIC8vLyAgICAgICAgaGFuZGxlcnMgcnVuLgorICB2b2lkIHdhaXQoKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBMb2NrKE0pOworICAgIHdoaWxlIChOdW1PdXRzdGFuZGluZ0NhbGxzID4gMCkKKyAgICAgIENWLndhaXQoTG9jayk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjptdXRleCBNOworICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBDVjsKKyAgdWludDMyX3QgTnVtT3V0c3RhbmRpbmdDYWxscyA9IDA7Cit9OworCisvLy8gQGJyaWVmIENvbnZlbmllbmNlIGNsYXNzIGZvciBncm91cGluZyBSUEMgRnVuY3Rpb25zIGludG8gQVBJcyB0aGF0IGNhbiBiZQorLy8vICAgICAgICBuZWdvdGlhdGVkIGFzIGEgYmxvY2suCisvLy8KK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBGdW5jcz4KK2NsYXNzIEFQSUNhbGxzIHsKK3B1YmxpYzoKKworICAvLy8gQGJyaWVmIFRlc3Qgd2hldGhlciB0aGlzIEFQSSBjb250YWlucyBGdW5jdGlvbiBGLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KKyAgY2xhc3MgQ29udGFpbnMgeworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKKyAgfTsKKworICAvLy8gQGJyaWVmIE5lZ290aWF0ZSBhbGwgZnVuY3Rpb25zIGluIHRoaXMgQVBJLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUlBDRW5kcG9pbnQ+CisgIHN0YXRpYyBFcnJvciBuZWdvdGlhdGUoUlBDRW5kcG9pbnQgJlIpIHsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lLi4uIEZ1bmNzPgorY2xhc3MgQVBJQ2FsbHM8RnVuYywgRnVuY3MuLi4+IHsKK3B1YmxpYzoKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KKyAgY2xhc3MgQ29udGFpbnMgeworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBzdGQ6OmlzX3NhbWU8RiwgRnVuYz46OnZhbHVlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSUNhbGxzPEZ1bmNzLi4uPjo6dGVtcGxhdGUgQ29udGFpbnM8Rj46OnZhbHVlOworICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSUENFbmRwb2ludD4KKyAgc3RhdGljIEVycm9yIG5lZ290aWF0ZShSUENFbmRwb2ludCAmUikgeworICAgIGlmIChhdXRvIEVyciA9IFIudGVtcGxhdGUgbmVnb3RpYXRlRnVuY3Rpb248RnVuYz4oKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgcmV0dXJuIEFQSUNhbGxzPEZ1bmNzLi4uPjo6bmVnb3RpYXRlKFIpOworICB9CisKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBJbm5lckZ1bmNzLCB0eXBlbmFtZS4uLiBGdW5jcz4KK2NsYXNzIEFQSUNhbGxzPEFQSUNhbGxzPElubmVyRnVuY3MuLi4+LCBGdW5jcy4uLj4geworcHVibGljOgorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgorICBjbGFzcyBDb250YWlucyB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9CisgICAgICBBUElDYWxsczxJbm5lckZ1bmNzLi4uPjo6dGVtcGxhdGUgQ29udGFpbnM8Rj46OnZhbHVlIHwKKyAgICAgIEFQSUNhbGxzPEZ1bmNzLi4uPjo6dGVtcGxhdGUgQ29udGFpbnM8Rj46OnZhbHVlOworICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSUENFbmRwb2ludD4KKyAgc3RhdGljIEVycm9yIG5lZ290aWF0ZShSUENFbmRwb2ludCAmUikgeworICAgIGlmIChhdXRvIEVyciA9IEFQSUNhbGxzPElubmVyRnVuY3MuLi4+OjpuZWdvdGlhdGUoUikpCisgICAgICByZXR1cm4gRXJyOworICAgIHJldHVybiBBUElDYWxsczxGdW5jcy4uLj46Om5lZ290aWF0ZShSKTsKKyAgfQorCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgcnBjCit9IC8vIGVuZCBuYW1lc3BhY2Ugb3JjCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9SVER5bGRPYmplY3RMaW5raW5nTGF5ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9SVER5bGRPYmplY3RMaW5raW5nTGF5ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjBkOWZhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL1JURHlsZE9iamVjdExpbmtpbmdMYXllci5oCkBAIC0wLDAgKzEsMzQ5IEBACisvLz09PS0gUlREeWxkT2JqZWN0TGlua2luZ0xheWVyLmggLSBSVER5bGQtYmFzZWQgaml0IGxpbmtpbmcgIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENvbnRhaW5zIHRoZSBkZWZpbml0aW9uIGZvciBhbiBSVER5bGQtYmFzZWQsIGluLXByb2Nlc3Mgb2JqZWN0IGxpbmtpbmcgbGF5ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfUlREWUxET0JKRUNUTElOS0lOR0xBWUVSX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX1JURFlMRE9CSkVDVExJTktJTkdMQVlFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvQ29yZS5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9MZWdhY3kuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9SdW50aW1lRHlsZC5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L09iamVjdEZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9yYyB7CisKK2NsYXNzIFJURHlsZE9iamVjdExpbmtpbmdMYXllckJhc2UgeworcHVibGljOgorICB1c2luZyBPYmplY3RQdHIgPSBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPjsKKworcHJvdGVjdGVkOgorCisgIC8vLyBAYnJpZWYgSG9sZHMgYW4gb2JqZWN0IHRvIGJlIGFsbG9jYXRlZC9saW5rZWQgYXMgYSB1bml0IGluIHRoZSBKSVQuCisgIC8vLworICAvLy8gQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aWxsIGJlIGNyZWF0ZWQgZm9yIGVhY2ggb2JqZWN0IGFkZGVkCisgIC8vLyB2aWEgSklUT2JqZWN0TGF5ZXI6OmFkZE9iamVjdC4gRGVsZXRpbmcgdGhlIGluc3RhbmNlICh2aWEKKyAgLy8vIHJlbW92ZU9iamVjdCkgZnJlZXMgaXRzIG1lbW9yeSwgcmVtb3ZpbmcgYWxsIHN5bWJvbCBkZWZpbml0aW9ucyB0aGF0CisgIC8vLyBoYWQgYmVlbiBwcm92aWRlZCBieSB0aGlzIGluc3RhbmNlLiBIaWdoZXIgbGV2ZWwgbGF5ZXJzIGFyZSByZXNwb25zaWJsZQorICAvLy8gZm9yIHRha2luZyBhbnkgYWN0aW9uIHJlcXVpcmVkIHRvIGhhbmRsZSB0aGUgbWlzc2luZyBzeW1ib2xzLgorICBjbGFzcyBMaW5rZWRPYmplY3QgeworICBwdWJsaWM6CisgICAgTGlua2VkT2JqZWN0KCkgPSBkZWZhdWx0OworICAgIExpbmtlZE9iamVjdChjb25zdCBMaW5rZWRPYmplY3QmKSA9IGRlbGV0ZTsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBMaW5rZWRPYmplY3QmKSA9IGRlbGV0ZTsKKyAgICB2aXJ0dWFsIH5MaW5rZWRPYmplY3QoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIEVycm9yIGZpbmFsaXplKCkgPSAwOworCisgICAgdmlydHVhbCBKSVRTeW1ib2w6OkdldEFkZHJlc3NGdG9yCisgICAgZ2V0U3ltYm9sTWF0ZXJpYWxpemVyKHN0ZDo6c3RyaW5nIE5hbWUpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBtYXBTZWN0aW9uQWRkcmVzcyhjb25zdCB2b2lkICpMb2NhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVFRhcmdldEFkZHJlc3MgVGFyZ2V0QWRkcikgY29uc3QgPSAwOworCisgICAgSklUU3ltYm9sIGdldFN5bWJvbChTdHJpbmdSZWYgTmFtZSwgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5KSB7CisgICAgICBhdXRvIFN5bUVudHJ5ID0gU3ltYm9sVGFibGUuZmluZChOYW1lKTsKKyAgICAgIGlmIChTeW1FbnRyeSA9PSBTeW1ib2xUYWJsZS5lbmQoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICBpZiAoIVN5bUVudHJ5LT5zZWNvbmQuZ2V0RmxhZ3MoKS5pc0V4cG9ydGVkKCkgJiYgRXhwb3J0ZWRTeW1ib2xzT25seSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICBpZiAoIUZpbmFsaXplZCkKKyAgICAgICAgcmV0dXJuIEpJVFN5bWJvbChnZXRTeW1ib2xNYXRlcmlhbGl6ZXIoTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgU3ltRW50cnktPnNlY29uZC5nZXRGbGFncygpKTsKKyAgICAgIHJldHVybiBKSVRTeW1ib2woU3ltRW50cnktPnNlY29uZCk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICBTdHJpbmdNYXA8SklURXZhbHVhdGVkU3ltYm9sPiBTeW1ib2xUYWJsZTsKKyAgICBib29sIEZpbmFsaXplZCA9IGZhbHNlOworICB9OworfTsKKworLy8vIEBicmllZiBCYXJlIGJvbmVzIG9iamVjdCBsaW5raW5nIGxheWVyLgorLy8vCisvLy8gICBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UgbGF5ZXIgZm9yIGEgSklULiBJdCBhbGxvd3MKKy8vLyBvYmplY3QgZmlsZXMgdG8gYmUgbG9hZGVkIGludG8gbWVtb3J5LCBsaW5rZWQsIGFuZCB0aGUgYWRkcmVzc2VzIG9mIHRoZWlyCisvLy8gc3ltYm9scyBxdWVyaWVkLiBBbGwgb2JqZWN0cyBhZGRlZCB0byB0aGlzIGxheWVyIGNhbiBzZWUgZWFjaCBvdGhlcidzCisvLy8gc3ltYm9scy4KK2NsYXNzIFJURHlsZE9iamVjdExpbmtpbmdMYXllciA6IHB1YmxpYyBSVER5bGRPYmplY3RMaW5raW5nTGF5ZXJCYXNlIHsKK3B1YmxpYzoKKworICB1c2luZyBSVER5bGRPYmplY3RMaW5raW5nTGF5ZXJCYXNlOjpPYmplY3RQdHI7CisKKyAgLy8vIEBicmllZiBGdW5jdG9yIGZvciByZWNlaXZpbmcgb2JqZWN0LWxvYWRlZCBub3RpZmljYXRpb25zLgorICB1c2luZyBOb3RpZnlMb2FkZWRGdG9yID0KKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChWTW9kdWxlS2V5LCBjb25zdCBvYmplY3Q6Ok9iamVjdEZpbGUgJk9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lRHlsZDo6TG9hZGVkT2JqZWN0SW5mbyAmKT47CisKKyAgLy8vIEBicmllZiBGdW5jdG9yIGZvciByZWNlaXZpbmcgZmluYWxpemF0aW9uIG5vdGlmaWNhdGlvbnMuCisgIHVzaW5nIE5vdGlmeUZpbmFsaXplZEZ0b3IgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoVk1vZHVsZUtleSk+OworCitwcml2YXRlOgorICB1c2luZyBPd25lZE9iamVjdCA9IG9iamVjdDo6T3duaW5nQmluYXJ5PG9iamVjdDo6T2JqZWN0RmlsZT47CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1lbW9yeU1hbmFnZXJQdHJUPgorICBjbGFzcyBDb25jcmV0ZUxpbmtlZE9iamVjdCA6IHB1YmxpYyBMaW5rZWRPYmplY3QgeworICBwdWJsaWM6CisgICAgQ29uY3JldGVMaW5rZWRPYmplY3QoUlREeWxkT2JqZWN0TGlua2luZ0xheWVyICZQYXJlbnQsIFZNb2R1bGVLZXkgSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPd25lZE9iamVjdCBPYmosIE1lbW9yeU1hbmFnZXJQdHJUIE1lbU1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3ltYm9sUmVzb2x2ZXI+IFJlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUHJvY2Vzc0FsbFNlY3Rpb25zKQorICAgICAgICA6IE1lbU1ncihzdGQ6Om1vdmUoTWVtTWdyKSksCisgICAgICAgICAgUEZDKGxsdm06Om1ha2VfdW5pcXVlPFByZUZpbmFsaXplQ29udGVudHM+KAorICAgICAgICAgICAgICBQYXJlbnQsIHN0ZDo6bW92ZShLKSwgc3RkOjptb3ZlKE9iaiksIHN0ZDo6bW92ZShSZXNvbHZlciksCisgICAgICAgICAgICAgIFByb2Nlc3NBbGxTZWN0aW9ucykpIHsKKyAgICAgIGJ1aWxkSW5pdGlhbFN5bWJvbFRhYmxlKFBGQy0+T2JqKTsKKyAgICB9CisKKyAgICB+Q29uY3JldGVMaW5rZWRPYmplY3QoKSBvdmVycmlkZSB7CisgICAgICBNZW1NZ3ItPmRlcmVnaXN0ZXJFSEZyYW1lcygpOworICAgIH0KKworICAgIEVycm9yIGZpbmFsaXplKCkgb3ZlcnJpZGUgeworICAgICAgYXNzZXJ0KFBGQyAmJiAibWFwU2VjdGlvbkFkZHJlc3MgY2FsbGVkIG9uIGZpbmFsaXplZCBMaW5rZWRPYmplY3QiKTsKKworICAgICAgSklUU3ltYm9sUmVzb2x2ZXJBZGFwdGVyIFJlc29sdmVyQWRhcHRlcihQRkMtPlBhcmVudC5FUywgKlBGQy0+UmVzb2x2ZXIpOworICAgICAgUEZDLT5SVER5bGQgPSBsbHZtOjptYWtlX3VuaXF1ZTxSdW50aW1lRHlsZD4oKk1lbU1nciwgUmVzb2x2ZXJBZGFwdGVyKTsKKyAgICAgIFBGQy0+UlREeWxkLT5zZXRQcm9jZXNzQWxsU2VjdGlvbnMoUEZDLT5Qcm9jZXNzQWxsU2VjdGlvbnMpOworCisgICAgICBGaW5hbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UnVudGltZUR5bGQ6OkxvYWRlZE9iamVjdEluZm8+IEluZm8gPQorICAgICAgICAgIFBGQy0+UlREeWxkLT5sb2FkT2JqZWN0KCpQRkMtPk9iai5nZXRCaW5hcnkoKSk7CisKKyAgICAgIC8vIENvcHkgdGhlIHN5bWJvbCB0YWJsZSBvdXQgb2YgdGhlIFJ1bnRpbWVEeWxkIGluc3RhbmNlLgorICAgICAgeworICAgICAgICBhdXRvIFN5bVRhYiA9IFBGQy0+UlREeWxkLT5nZXRTeW1ib2xUYWJsZSgpOworICAgICAgICBmb3IgKGF1dG8gJktWIDogU3ltVGFiKQorICAgICAgICAgIFN5bWJvbFRhYmxlW0tWLmZpcnN0XSA9IEtWLnNlY29uZDsKKyAgICAgIH0KKworICAgICAgaWYgKFBGQy0+UGFyZW50Lk5vdGlmeUxvYWRlZCkKKyAgICAgICAgUEZDLT5QYXJlbnQuTm90aWZ5TG9hZGVkKFBGQy0+SywgKlBGQy0+T2JqLmdldEJpbmFyeSgpLCAqSW5mbyk7CisKKyAgICAgIFBGQy0+UlREeWxkLT5maW5hbGl6ZVdpdGhNZW1vcnlNYW5hZ2VyTG9ja2luZygpOworCisgICAgICBpZiAoUEZDLT5SVER5bGQtPmhhc0Vycm9yKCkpCisgICAgICAgIHJldHVybiBtYWtlX2Vycm9yPFN0cmluZ0Vycm9yPihQRkMtPlJURHlsZC0+Z2V0RXJyb3JTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29udmVydGlibGVFcnJvckNvZGUoKSk7CisKKyAgICAgIGlmIChQRkMtPlBhcmVudC5Ob3RpZnlGaW5hbGl6ZWQpCisgICAgICAgIFBGQy0+UGFyZW50Lk5vdGlmeUZpbmFsaXplZChQRkMtPkspOworCisgICAgICAvLyBSZWxlYXNlIHJlc291cmNlcy4KKyAgICAgIFBGQyA9IG51bGxwdHI7CisgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICBKSVRTeW1ib2w6OkdldEFkZHJlc3NGdG9yIGdldFN5bWJvbE1hdGVyaWFsaXplcihzdGQ6OnN0cmluZyBOYW1lKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gW3RoaXMsIE5hbWVdKCkgLT4gRXhwZWN0ZWQ8SklUVGFyZ2V0QWRkcmVzcz4geworICAgICAgICAvLyBUaGUgc3ltYm9sIG1heSBiZSBtYXRlcmlhbGl6ZWQgYmV0d2VlbiB0aGUgY3JlYXRpb24gb2YgdGhpcyBsYW1iZGEKKyAgICAgICAgLy8gYW5kIGl0cyBleGVjdXRpb24sIHNvIHdlIG5lZWQgdG8gZG91YmxlIGNoZWNrLgorICAgICAgICBpZiAoIXRoaXMtPkZpbmFsaXplZCkKKyAgICAgICAgICBpZiAoYXV0byBFcnIgPSB0aGlzLT5maW5hbGl6ZSgpKQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShFcnIpOworICAgICAgICByZXR1cm4gdGhpcy0+Z2V0U3ltYm9sKE5hbWUsIGZhbHNlKS5nZXRBZGRyZXNzKCk7CisgICAgICB9OworICAgIH0KKworICAgIHZvaWQgbWFwU2VjdGlvbkFkZHJlc3MoY29uc3Qgdm9pZCAqTG9jYWxBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUVGFyZ2V0QWRkcmVzcyBUYXJnZXRBZGRyKSBjb25zdCBvdmVycmlkZSB7CisgICAgICBhc3NlcnQoUEZDICYmICJtYXBTZWN0aW9uQWRkcmVzcyBjYWxsZWQgb24gZmluYWxpemVkIExpbmtlZE9iamVjdCIpOworICAgICAgYXNzZXJ0KFBGQy0+UlREeWxkICYmICJtYXBTZWN0aW9uQWRkcmVzcyBjYWxsZWQgb24gcmF3IExpbmtlZE9iamVjdCIpOworICAgICAgUEZDLT5SVER5bGQtPm1hcFNlY3Rpb25BZGRyZXNzKExvY2FsQWRkcmVzcywgVGFyZ2V0QWRkcik7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBidWlsZEluaXRpYWxTeW1ib2xUYWJsZShjb25zdCBPd25lZE9iamVjdCAmT2JqKSB7CisgICAgICBmb3IgKGF1dG8gJlN5bWJvbCA6IE9iai5nZXRCaW5hcnkoKS0+c3ltYm9scygpKSB7CisgICAgICAgIGlmIChTeW1ib2wuZ2V0RmxhZ3MoKSAmIG9iamVjdDo6U3ltYm9sUmVmOjpTRl9VbmRlZmluZWQpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIEV4cGVjdGVkPFN0cmluZ1JlZj4gU3ltYm9sTmFtZSA9IFN5bWJvbC5nZXROYW1lKCk7CisgICAgICAgIC8vIEZJWE1FOiBSYWlzZSBhbiBlcnJvciBmb3IgYmFkIHN5bWJvbHMuCisgICAgICAgIGlmICghU3ltYm9sTmFtZSkgeworICAgICAgICAgIGNvbnN1bWVFcnJvcihTeW1ib2xOYW1lLnRha2VFcnJvcigpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIEZsYWdzID0gSklUU3ltYm9sRmxhZ3M6OmZyb21PYmplY3RTeW1ib2woU3ltYm9sKTsKKyAgICAgICAgU3ltYm9sVGFibGUuaW5zZXJ0KAorICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKCpTeW1ib2xOYW1lLCBKSVRFdmFsdWF0ZWRTeW1ib2woMCwgRmxhZ3MpKSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gQ29udGFpbnMgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCBwcmlvciB0byBmaW5hbGl6YXRpb246IHRoZSBvYmplY3QgZmlsZXMsCisgICAgLy8gbWVtb3J5IG1hbmFnZXIsIHJlc29sdmVyLCBhbmQgZmxhZ3MgbmVlZGVkIGZvciBSdW50aW1lRHlsZC4KKyAgICBzdHJ1Y3QgUHJlRmluYWxpemVDb250ZW50cyB7CisgICAgICBQcmVGaW5hbGl6ZUNvbnRlbnRzKFJURHlsZE9iamVjdExpbmtpbmdMYXllciAmUGFyZW50LCBWTW9kdWxlS2V5IEssCisgICAgICAgICAgICAgICAgICAgICAgICAgIE93bmVkT2JqZWN0IE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFN5bWJvbFJlc29sdmVyPiBSZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQcm9jZXNzQWxsU2VjdGlvbnMpCisgICAgICAgICAgOiBQYXJlbnQoUGFyZW50KSwgSyhzdGQ6Om1vdmUoSykpLCBPYmooc3RkOjptb3ZlKE9iaikpLAorICAgICAgICAgICAgUmVzb2x2ZXIoc3RkOjptb3ZlKFJlc29sdmVyKSksCisgICAgICAgICAgICBQcm9jZXNzQWxsU2VjdGlvbnMoUHJvY2Vzc0FsbFNlY3Rpb25zKSB7fQorCisgICAgICBSVER5bGRPYmplY3RMaW5raW5nTGF5ZXIgJlBhcmVudDsKKyAgICAgIFZNb2R1bGVLZXkgSzsKKyAgICAgIE93bmVkT2JqZWN0IE9iajsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTeW1ib2xSZXNvbHZlcj4gUmVzb2x2ZXI7CisgICAgICBib29sIFByb2Nlc3NBbGxTZWN0aW9uczsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxSdW50aW1lRHlsZD4gUlREeWxkOworICAgIH07CisKKyAgICBNZW1vcnlNYW5hZ2VyUHRyVCBNZW1NZ3I7CisgICAgc3RkOjp1bmlxdWVfcHRyPFByZUZpbmFsaXplQ29udGVudHM+IFBGQzsKKyAgfTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWVtb3J5TWFuYWdlclB0clQ+CisgIHN0ZDo6dW5pcXVlX3B0cjxDb25jcmV0ZUxpbmtlZE9iamVjdDxNZW1vcnlNYW5hZ2VyUHRyVD4+CisgIGNyZWF0ZUxpbmtlZE9iamVjdChSVER5bGRPYmplY3RMaW5raW5nTGF5ZXIgJlBhcmVudCwgVk1vZHVsZUtleSBLLAorICAgICAgICAgICAgICAgICAgICAgT3duZWRPYmplY3QgT2JqLCBNZW1vcnlNYW5hZ2VyUHRyVCBNZW1NZ3IsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3ltYm9sUmVzb2x2ZXI+IFJlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBQcm9jZXNzQWxsU2VjdGlvbnMpIHsKKyAgICB1c2luZyBMT1MgPSBDb25jcmV0ZUxpbmtlZE9iamVjdDxNZW1vcnlNYW5hZ2VyUHRyVD47CisgICAgcmV0dXJuIGxsdm06Om1ha2VfdW5pcXVlPExPUz4oUGFyZW50LCBzdGQ6Om1vdmUoSyksIHN0ZDo6bW92ZShPYmopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShNZW1NZ3IpLCBzdGQ6Om1vdmUoUmVzb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NBbGxTZWN0aW9ucyk7CisgIH0KKworcHVibGljOgorICBzdHJ1Y3QgUmVzb3VyY2VzIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UnVudGltZUR5bGQ6Ok1lbW9yeU1hbmFnZXI+IE1lbU1ncjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U3ltYm9sUmVzb2x2ZXI+IFJlc29sdmVyOworICB9OworCisgIHVzaW5nIFJlc291cmNlc0dldHRlciA9IHN0ZDo6ZnVuY3Rpb248UmVzb3VyY2VzKFZNb2R1bGVLZXkpPjsKKworICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhbiBPYmplY3RMaW5raW5nTGF5ZXIgd2l0aCB0aGUgZ2l2ZW4gTm90aWZ5TG9hZGVkLAorICAvLy8gICAgICAgIGFuZCBOb3RpZnlGaW5hbGl6ZWQgZnVuY3RvcnMuCisgIFJURHlsZE9iamVjdExpbmtpbmdMYXllcigKKyAgICAgIEV4ZWN1dGlvblNlc3Npb24gJkVTLCBSZXNvdXJjZXNHZXR0ZXIgR2V0UmVzb3VyY2VzLAorICAgICAgTm90aWZ5TG9hZGVkRnRvciBOb3RpZnlMb2FkZWQgPSBOb3RpZnlMb2FkZWRGdG9yKCksCisgICAgICBOb3RpZnlGaW5hbGl6ZWRGdG9yIE5vdGlmeUZpbmFsaXplZCA9IE5vdGlmeUZpbmFsaXplZEZ0b3IoKSkKKyAgICAgIDogRVMoRVMpLCBHZXRSZXNvdXJjZXMoc3RkOjptb3ZlKEdldFJlc291cmNlcykpLAorICAgICAgICBOb3RpZnlMb2FkZWQoc3RkOjptb3ZlKE5vdGlmeUxvYWRlZCkpLAorICAgICAgICBOb3RpZnlGaW5hbGl6ZWQoc3RkOjptb3ZlKE5vdGlmeUZpbmFsaXplZCkpLCBQcm9jZXNzQWxsU2VjdGlvbnMoZmFsc2UpIHsKKyAgfQorCisgIC8vLyBAYnJpZWYgU2V0IHRoZSAnUHJvY2Vzc0FsbFNlY3Rpb25zJyBmbGFnLgorICAvLy8KKyAgLy8vIElmIHNldCB0byB0cnVlLCBhbGwgc2VjdGlvbnMgaW4gZWFjaCBvYmplY3QgZmlsZSB3aWxsIGJlIGFsbG9jYXRlZCB1c2luZworICAvLy8gdGhlIG1lbW9yeSBtYW5hZ2VyLCByYXRoZXIgdGhhbiBqdXN0IHRoZSBzZWN0aW9ucyByZXF1aXJlZCBmb3IgZXhlY3V0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgaXMga2x1ZGd5LCBhbmQgbWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KKyAgdm9pZCBzZXRQcm9jZXNzQWxsU2VjdGlvbnMoYm9vbCBQcm9jZXNzQWxsU2VjdGlvbnMpIHsKKyAgICB0aGlzLT5Qcm9jZXNzQWxsU2VjdGlvbnMgPSBQcm9jZXNzQWxsU2VjdGlvbnM7CisgIH0KKworICAvLy8gQGJyaWVmIEFkZCBhbiBvYmplY3QgdG8gdGhlIEpJVC4KKyAgRXJyb3IgYWRkT2JqZWN0KFZNb2R1bGVLZXkgSywgT2JqZWN0UHRyIE9iakJ1ZmZlcikgeworCisgICAgYXV0byBPYmogPQorICAgICAgICBvYmplY3Q6Ok9iamVjdEZpbGU6OmNyZWF0ZU9iamVjdEZpbGUoT2JqQnVmZmVyLT5nZXRNZW1CdWZmZXJSZWYoKSk7CisgICAgaWYgKCFPYmopCisgICAgICByZXR1cm4gT2JqLnRha2VFcnJvcigpOworCisgICAgYXNzZXJ0KCFMaW5rZWRPYmplY3RzLmNvdW50KEspICYmICJWTW9kdWxlS2V5IGFscmVhZHkgaW4gdXNlIik7CisKKyAgICBhdXRvIFIgPSBHZXRSZXNvdXJjZXMoSyk7CisKKyAgICBMaW5rZWRPYmplY3RzW0tdID0gY3JlYXRlTGlua2VkT2JqZWN0KAorICAgICAgICAqdGhpcywgSywgT3duZWRPYmplY3Qoc3RkOjptb3ZlKCpPYmopLCBzdGQ6Om1vdmUoT2JqQnVmZmVyKSksCisgICAgICAgIHN0ZDo6bW92ZShSLk1lbU1nciksIHN0ZDo6bW92ZShSLlJlc29sdmVyKSwgUHJvY2Vzc0FsbFNlY3Rpb25zKTsKKworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgLy8vIEBicmllZiBSZW1vdmUgdGhlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggVk1vZHVsZUtleSBLLgorICAvLy8KKyAgLy8vICAgQWxsIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBvYmplY3Qgd2lsbCBiZSBmcmVlZCwgYW5kIHRoZSBzZWN0aW9ucyBhbmQKKyAgLy8vIHN5bWJvbHMgaXQgcHJvdmlkZWQgd2lsbCBubyBsb25nZXIgYmUgYXZhaWxhYmxlLiBObyBhdHRlbXB0IGlzIG1hZGUgdG8KKyAgLy8vIHJlLWVtaXQgdGhlIG1pc3Npbmcgc3ltYm9scywgYW5kIGFueSB1c2Ugb2YgdGhlc2Ugc3ltYm9scyAoZGlyZWN0bHkgb3IKKyAgLy8vIGluZGlyZWN0bHkpIHdpbGwgcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvci4gSWYgZGVwZW5kZW5jZSB0cmFja2luZyBpcworICAvLy8gcmVxdWlyZWQgdG8gZGV0ZWN0IG9yIHJlc29sdmUgc3VjaCBpc3N1ZXMgaXQgc2hvdWxkIGJlIGFkZGVkIGF0IGEgaGlnaGVyCisgIC8vLyBsYXllci4KKyAgRXJyb3IgcmVtb3ZlT2JqZWN0KFZNb2R1bGVLZXkgSykgeworICAgIGFzc2VydChMaW5rZWRPYmplY3RzLmNvdW50KEspICYmICJWTW9kdWxlS2V5IG5vdCBhc3NvY2lhdGVkIHdpdGggb2JqZWN0Iik7CisgICAgLy8gSG93IGRvIHdlIGludmFsaWRhdGUgdGhlIHN5bWJvbHMgaW4gSD8KKyAgICBMaW5rZWRPYmplY3RzLmVyYXNlKEspOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgLy8vIEBicmllZiBTZWFyY2ggZm9yIHRoZSBnaXZlbiBuYW1lZCBzeW1ib2wuCisgIC8vLyBAcGFyYW0gTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIHNlYXJjaCBmb3IuCisgIC8vLyBAcGFyYW0gRXhwb3J0ZWRTeW1ib2xzT25seSBJZiB0cnVlLCBzZWFyY2ggb25seSBmb3IgZXhwb3J0ZWQgc3ltYm9scy4KKyAgLy8vIEByZXR1cm4gQSBoYW5kbGUgZm9yIHRoZSBnaXZlbiBuYW1lZCBzeW1ib2wsIGlmIGl0IGV4aXN0cy4KKyAgSklUU3ltYm9sIGZpbmRTeW1ib2woU3RyaW5nUmVmIE5hbWUsIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSkgeworICAgIGZvciAoYXV0byAmS1YgOiBMaW5rZWRPYmplY3RzKQorICAgICAgaWYgKGF1dG8gU3ltID0gS1Yuc2Vjb25kLT5nZXRTeW1ib2woTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSkpCisgICAgICAgIHJldHVybiBTeW07CisgICAgICBlbHNlIGlmIChhdXRvIEVyciA9IFN5bS50YWtlRXJyb3IoKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShFcnIpOworCisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gQGJyaWVmIFNlYXJjaCBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbCBpbiB0aGUgY29udGV4dCBvZiB0aGUgbG9hZGVkCisgIC8vLyAgICAgICAgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoZSBWTW9kdWxlS2V5IEsuCisgIC8vLyBAcGFyYW0gSyBUaGUgVk1vZHVsZUtleSBmb3IgdGhlIG9iamVjdCB0byBzZWFyY2ggaW4uCisgIC8vLyBAcGFyYW0gTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIHNlYXJjaCBmb3IuCisgIC8vLyBAcGFyYW0gRXhwb3J0ZWRTeW1ib2xzT25seSBJZiB0cnVlLCBzZWFyY2ggb25seSBmb3IgZXhwb3J0ZWQgc3ltYm9scy4KKyAgLy8vIEByZXR1cm4gQSBoYW5kbGUgZm9yIHRoZSBnaXZlbiBuYW1lZCBzeW1ib2wsIGlmIGl0IGlzIGZvdW5kIGluIHRoZQorICAvLy8gICAgICAgICBnaXZlbiBvYmplY3QuCisgIEpJVFN5bWJvbCBmaW5kU3ltYm9sSW4oVk1vZHVsZUtleSBLLCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEV4cG9ydGVkU3ltYm9sc09ubHkpIHsKKyAgICBhc3NlcnQoTGlua2VkT2JqZWN0cy5jb3VudChLKSAmJiAiVk1vZHVsZUtleSBub3QgYXNzb2NpYXRlZCB3aXRoIG9iamVjdCIpOworICAgIHJldHVybiBMaW5rZWRPYmplY3RzW0tdLT5nZXRTeW1ib2woTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSk7CisgIH0KKworICAvLy8gQGJyaWVmIE1hcCBzZWN0aW9uIGFkZHJlc3NlcyBmb3IgdGhlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlCisgIC8vLyAgICAgICAgVk1vZHVsZUtleSBLLgorICB2b2lkIG1hcFNlY3Rpb25BZGRyZXNzKFZNb2R1bGVLZXkgSywgY29uc3Qgdm9pZCAqTG9jYWxBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEpJVFRhcmdldEFkZHJlc3MgVGFyZ2V0QWRkcikgeworICAgIGFzc2VydChMaW5rZWRPYmplY3RzLmNvdW50KEspICYmICJWTW9kdWxlS2V5IG5vdCBhc3NvY2lhdGVkIHdpdGggb2JqZWN0Iik7CisgICAgTGlua2VkT2JqZWN0c1tLXS0+bWFwU2VjdGlvbkFkZHJlc3MoTG9jYWxBZGRyZXNzLCBUYXJnZXRBZGRyKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgSW1tZWRpYXRlbHkgZW1pdCBhbmQgZmluYWxpemUgdGhlIG9iamVjdCByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4KKyAgLy8vICAgICAgICBWTW9kdWxlS2V5LgorICAvLy8gQHBhcmFtIEsgVk1vZHVsZUtleSBmb3Igb2JqZWN0IHRvIGVtaXQvZmluYWxpemUuCisgIEVycm9yIGVtaXRBbmRGaW5hbGl6ZShWTW9kdWxlS2V5IEspIHsKKyAgICBhc3NlcnQoTGlua2VkT2JqZWN0cy5jb3VudChLKSAmJiAiVk1vZHVsZUtleSBub3QgYXNzb2NpYXRlZCB3aXRoIG9iamVjdCIpOworICAgIHJldHVybiBMaW5rZWRPYmplY3RzW0tdLT5maW5hbGl6ZSgpOworICB9CisKK3ByaXZhdGU6CisgIEV4ZWN1dGlvblNlc3Npb24gJkVTOworCisgIHN0ZDo6bWFwPFZNb2R1bGVLZXksIHN0ZDo6dW5pcXVlX3B0cjxMaW5rZWRPYmplY3Q+PiBMaW5rZWRPYmplY3RzOworICBSZXNvdXJjZXNHZXR0ZXIgR2V0UmVzb3VyY2VzOworICBOb3RpZnlMb2FkZWRGdG9yIE5vdGlmeUxvYWRlZDsKKyAgTm90aWZ5RmluYWxpemVkRnRvciBOb3RpZnlGaW5hbGl6ZWQ7CisgIGJvb2wgUHJvY2Vzc0FsbFNlY3Rpb25zID0gZmFsc2U7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb3JjCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX1JURFlMRE9CSkVDVExJTktJTkdMQVlFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvUmF3Qnl0ZUNoYW5uZWwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9SYXdCeXRlQ2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiODEwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvUmF3Qnl0ZUNoYW5uZWwuaApAQCAtMCwwICsxLDE4NSBAQAorLy89PT0tIGxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9SYXdCeXRlQ2hhbm5lbC5oIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfUkFXQllURUNIQU5ORUxfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfUkFXQllURUNIQU5ORUxfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL1JQQ1NlcmlhbGl6YXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvcmMgeworbmFtZXNwYWNlIHJwYyB7CisKKy8vLyBJbnRlcmZhY2UgZm9yIGJ5dGUtc3RyZWFtcyB0byBiZSB1c2VkIHdpdGggUlBDLgorY2xhc3MgUmF3Qnl0ZUNoYW5uZWwgeworcHVibGljOgorICB2aXJ0dWFsIH5SYXdCeXRlQ2hhbm5lbCgpID0gZGVmYXVsdDsKKworICAvLy8gUmVhZCBTaXplIGJ5dGVzIGZyb20gdGhlIHN0cmVhbSBpbnRvICpEc3QuCisgIHZpcnR1YWwgRXJyb3IgcmVhZEJ5dGVzKGNoYXIgKkRzdCwgdW5zaWduZWQgU2l6ZSkgPSAwOworCisgIC8vLyBSZWFkIHNpemUgYnl0ZXMgZnJvbSAqU3JjIGFuZCBhcHBlbmQgdGhlbSB0byB0aGUgc3RyZWFtLgorICB2aXJ0dWFsIEVycm9yIGFwcGVuZEJ5dGVzKGNvbnN0IGNoYXIgKlNyYywgdW5zaWduZWQgU2l6ZSkgPSAwOworCisgIC8vLyBGbHVzaCB0aGUgc3RyZWFtIGlmIHBvc3NpYmxlLgorICB2aXJ0dWFsIEVycm9yIHNlbmQoKSA9IDA7CisKKyAgLy8vIE5vdGlmeSB0aGUgY2hhbm5lbCB0aGF0IHdlJ3JlIHN0YXJ0aW5nIGEgbWVzc2FnZSBzZW5kLgorICAvLy8gTG9ja3MgdGhlIGNoYW5uZWwgZm9yIHdyaXRpbmcuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbklkVCwgdHlwZW5hbWUgU2VxdWVuY2VJZFQ+CisgIEVycm9yIHN0YXJ0U2VuZE1lc3NhZ2UoY29uc3QgRnVuY3Rpb25JZFQgJkZuSWQsIGNvbnN0IFNlcXVlbmNlSWRUICZTZXFObykgeworICAgIHdyaXRlTG9jay5sb2NrKCk7CisgICAgaWYgKGF1dG8gRXJyID0gc2VyaWFsaXplU2VxKCp0aGlzLCBGbklkLCBTZXFObykpIHsKKyAgICAgIHdyaXRlTG9jay51bmxvY2soKTsKKyAgICAgIHJldHVybiBFcnI7CisgICAgfQorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgLy8vIE5vdGlmeSB0aGUgY2hhbm5lbCB0aGF0IHdlJ3JlIGVuZGluZyBhIG1lc3NhZ2Ugc2VuZC4KKyAgLy8vIFVubG9ja3MgdGhlIGNoYW5uZWwgZm9yIHdyaXRpbmcuCisgIEVycm9yIGVuZFNlbmRNZXNzYWdlKCkgeworICAgIHdyaXRlTG9jay51bmxvY2soKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIC8vLyBOb3RpZnkgdGhlIGNoYW5uZWwgdGhhdCB3ZSdyZSBzdGFydGluZyBhIG1lc3NhZ2UgcmVjZWl2ZS4KKyAgLy8vIExvY2tzIHRoZSBjaGFubmVsIGZvciByZWFkaW5nLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb25JZFQsIHR5cGVuYW1lIFNlcXVlbmNlTnVtYmVyVD4KKyAgRXJyb3Igc3RhcnRSZWNlaXZlTWVzc2FnZShGdW5jdGlvbklkVCAmRm5JZCwgU2VxdWVuY2VOdW1iZXJUICZTZXFObykgeworICAgIHJlYWRMb2NrLmxvY2soKTsKKyAgICBpZiAoYXV0byBFcnIgPSBkZXNlcmlhbGl6ZVNlcSgqdGhpcywgRm5JZCwgU2VxTm8pKSB7CisgICAgICByZWFkTG9jay51bmxvY2soKTsKKyAgICAgIHJldHVybiBFcnI7CisgICAgfQorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgLy8vIE5vdGlmeSB0aGUgY2hhbm5lbCB0aGF0IHdlJ3JlIGVuZGluZyBhIG1lc3NhZ2UgcmVjZWl2ZS4KKyAgLy8vIFVubG9ja3MgdGhlIGNoYW5uZWwgZm9yIHJlYWRpbmcuCisgIEVycm9yIGVuZFJlY2VpdmVNZXNzYWdlKCkgeworICAgIHJlYWRMb2NrLnVubG9jaygpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgLy8vIEdldCB0aGUgbG9jayBmb3Igc3RyZWFtIHJlYWRpbmcuCisgIHN0ZDo6bXV0ZXggJmdldFJlYWRMb2NrKCkgeyByZXR1cm4gcmVhZExvY2s7IH0KKworICAvLy8gR2V0IHRoZSBsb2NrIGZvciBzdHJlYW0gd3JpdGluZy4KKyAgc3RkOjptdXRleCAmZ2V0V3JpdGVMb2NrKCkgeyByZXR1cm4gd3JpdGVMb2NrOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6bXV0ZXggcmVhZExvY2ssIHdyaXRlTG9jazsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUgVD4KK2NsYXNzIFNlcmlhbGl6YXRpb25UcmFpdHM8CisgICAgQ2hhbm5lbFQsIFQsIFQsCisgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxSYXdCeXRlQ2hhbm5lbCwgQ2hhbm5lbFQ+Ojp2YWx1ZSAmJgorICAgICAgICAoc3RkOjppc19zYW1lPFQsIHVpbnQ4X3Q+Ojp2YWx1ZSB8fCBzdGQ6OmlzX3NhbWU8VCwgaW50OF90Pjo6dmFsdWUgfHwKKyAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB1aW50MTZfdD46OnZhbHVlIHx8IHN0ZDo6aXNfc2FtZTxULCBpbnQxNl90Pjo6dmFsdWUgfHwKKyAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB1aW50MzJfdD46OnZhbHVlIHx8IHN0ZDo6aXNfc2FtZTxULCBpbnQzMl90Pjo6dmFsdWUgfHwKKyAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB1aW50NjRfdD46OnZhbHVlIHx8IHN0ZDo6aXNfc2FtZTxULCBpbnQ2NF90Pjo6dmFsdWUgfHwKKyAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpPjo6dHlwZT4geworcHVibGljOgorICBzdGF0aWMgRXJyb3Igc2VyaWFsaXplKENoYW5uZWxUICZDLCBUIFYpIHsKKyAgICBzdXBwb3J0OjplbmRpYW46OmJ5dGVfc3dhcDxULCBzdXBwb3J0OjpiaWc+KFYpOworICAgIHJldHVybiBDLmFwcGVuZEJ5dGVzKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmViksIHNpemVvZihUKSk7CisgIH07CisKKyAgc3RhdGljIEVycm9yIGRlc2VyaWFsaXplKENoYW5uZWxUICZDLCBUICZWKSB7CisgICAgaWYgKGF1dG8gRXJyID0gQy5yZWFkQnl0ZXMocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KCZWKSwgc2l6ZW9mKFQpKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgc3VwcG9ydDo6ZW5kaWFuOjpieXRlX3N3YXA8VCwgc3VwcG9ydDo6YmlnPihWKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVD4KK2NsYXNzIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIGJvb2wsIGJvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfYmFzZV9vZjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0J5dGVDaGFubmVsLCBDaGFubmVsVD46OnZhbHVlPjo6dHlwZT4geworcHVibGljOgorICBzdGF0aWMgRXJyb3Igc2VyaWFsaXplKENoYW5uZWxUICZDLCBib29sIFYpIHsKKyAgICB1aW50OF90IFRtcCA9IFYgPyAxIDogMDsKKyAgICBpZiAoYXV0byBFcnIgPQorICAgICAgICAgIEMuYXBwZW5kQnl0ZXMocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZUbXApLCAxKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBzdGF0aWMgRXJyb3IgZGVzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIGJvb2wgJlYpIHsKKyAgICB1aW50OF90IFRtcCA9IDA7CisgICAgaWYgKGF1dG8gRXJyID0gQy5yZWFkQnl0ZXMocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KCZUbXApLCAxKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgViA9IFRtcCAhPSAwOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQ+CitjbGFzcyBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBzdGQ6OnN0cmluZywgU3RyaW5nUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Jhc2Vfb2Y8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdCeXRlQ2hhbm5lbCwgQ2hhbm5lbFQ+Ojp2YWx1ZT46OnR5cGU+IHsKK3B1YmxpYzoKKyAgLy8vIFJQQyBjaGFubmVsIHNlcmlhbGl6YXRpb24gZm9yIHN0ZDo6c3RyaW5ncy4KKyAgc3RhdGljIEVycm9yIHNlcmlhbGl6ZShSYXdCeXRlQ2hhbm5lbCAmQywgU3RyaW5nUmVmIFMpIHsKKyAgICBpZiAoYXV0byBFcnIgPSBzZXJpYWxpemVTZXEoQywgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KFMuc2l6ZSgpKSkpCisgICAgICByZXR1cm4gRXJyOworICAgIHJldHVybiBDLmFwcGVuZEJ5dGVzKChjb25zdCBjaGFyICopUy5kYXRhKCksIFMuc2l6ZSgpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZSBUPgorY2xhc3MgU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgc3RkOjpzdHJpbmcsIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxSYXdCeXRlQ2hhbm5lbCwgQ2hhbm5lbFQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGQ6OmlzX3NhbWU8VCwgY29uc3QgY2hhcio+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgY2hhcio+Ojp2YWx1ZSk+Ojp0eXBlPiB7CitwdWJsaWM6CisgIHN0YXRpYyBFcnJvciBzZXJpYWxpemUoUmF3Qnl0ZUNoYW5uZWwgJkMsIGNvbnN0IGNoYXIgKlMpIHsKKyAgICByZXR1cm4gU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgc3RkOjpzdHJpbmcsIFN0cmluZ1JlZj46OnNlcmlhbGl6ZShDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQ+CitjbGFzcyBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfYmFzZV9vZjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0J5dGVDaGFubmVsLCBDaGFubmVsVD46OnZhbHVlPjo6dHlwZT4geworcHVibGljOgorICAvLy8gUlBDIGNoYW5uZWwgc2VyaWFsaXphdGlvbiBmb3Igc3RkOjpzdHJpbmdzLgorICBzdGF0aWMgRXJyb3Igc2VyaWFsaXplKFJhd0J5dGVDaGFubmVsICZDLCBjb25zdCBzdGQ6OnN0cmluZyAmUykgeworICAgIHJldHVybiBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBzdGQ6OnN0cmluZywgU3RyaW5nUmVmPjo6c2VyaWFsaXplKEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUyk7CisgIH0KKworICAvLy8gUlBDIGNoYW5uZWwgZGVzZXJpYWxpemF0aW9uIGZvciBzdGQ6OnN0cmluZ3MuCisgIHN0YXRpYyBFcnJvciBkZXNlcmlhbGl6ZShSYXdCeXRlQ2hhbm5lbCAmQywgc3RkOjpzdHJpbmcgJlMpIHsKKyAgICB1aW50NjRfdCBDb3VudCA9IDA7CisgICAgaWYgKGF1dG8gRXJyID0gZGVzZXJpYWxpemVTZXEoQywgQ291bnQpKQorICAgICAgcmV0dXJuIEVycjsKKyAgICBTLnJlc2l6ZShDb3VudCk7CisgICAgcmV0dXJuIEMucmVhZEJ5dGVzKCZTWzBdLCBDb3VudCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBycGMKK30gLy8gZW5kIG5hbWVzcGFjZSBvcmMKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfUkFXQllURUNIQU5ORUxfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL1JlbW90ZU9iamVjdExheWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvUmVtb3RlT2JqZWN0TGF5ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTVmYWFhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL1JlbW90ZU9iamVjdExheWVyLmgKQEAgLTAsMCArMSw1MjkgQEAKKy8vPT09LS0tLS0tIFJlbW90ZU9iamVjdExheWVyLmggLSBGb3J3YXJkcyBvYmpzIHRvIGEgcmVtb3RlIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRm9yd2FyZHMgb2JqZWN0cyB0byBhIHJlbW90ZSBvYmplY3QgbGF5ZXIgdmlhIFJQQy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19SRU1PVEVPQkpFQ1RMQVlFUl9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19SRU1PVEVPQkpFQ1RMQVlFUl9ICisKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT3JjUmVtb3RlVGFyZ2V0UlBDQVBJLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvT2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9MYW1iZGFSZXNvbHZlci5oIgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9yYyB7CisKKy8vLyBSUEMgQVBJIG5lZWRlZCBieSBSZW1vdGVPYmplY3RDbGllbnRMYXllciBhbmQgUmVtb3RlT2JqZWN0U2VydmVyTGF5ZXIuCitjbGFzcyBSZW1vdGVPYmplY3RMYXllckFQSSB7CitwdWJsaWM6CisKKyAgdXNpbmcgT2JqSGFuZGxlVCA9IHJlbW90ZTo6UmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZDsKKworcHJvdGVjdGVkOgorCisgIHVzaW5nIFJlbW90ZVN5bWJvbElkID0gcmVtb3RlOjpSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkOworICB1c2luZyBSZW1vdGVTeW1ib2wgPSBzdGQ6OnBhaXI8UmVtb3RlU3ltYm9sSWQsIEpJVFN5bWJvbEZsYWdzPjsKKworcHVibGljOgorCisgIHVzaW5nIEJhZFN5bWJvbEhhbmRsZUVycm9yID0gcmVtb3RlOjpSZXNvdXJjZU5vdEZvdW5kPFJlbW90ZVN5bWJvbElkPjsKKyAgdXNpbmcgQmFkT2JqZWN0SGFuZGxlRXJyb3IgPSByZW1vdGU6OlJlc291cmNlTm90Rm91bmQ8T2JqSGFuZGxlVD47CisKK3Byb3RlY3RlZDoKKworICBzdGF0aWMgY29uc3QgT2JqSGFuZGxlVCBJbnZhbGlkT2JqZWN0SGFuZGxlSWQgPSAwOworICBzdGF0aWMgY29uc3QgUmVtb3RlU3ltYm9sSWQgTnVsbFN5bWJvbElkID0gMDsKKworICBjbGFzcyBBZGRPYmplY3QKKyAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPEFkZE9iamVjdCwgRXhwZWN0ZWQ8T2JqSGFuZGxlVD4oc3RkOjpzdHJpbmcpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJBZGRPYmplY3QiOyB9CisgIH07CisKKyAgY2xhc3MgUmVtb3ZlT2JqZWN0CisgICAgOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjxSZW1vdmVPYmplY3QsIEVycm9yKE9iakhhbmRsZVQpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJSZW1vdmVPYmplY3QiOyB9CisgIH07CisKKyAgY2xhc3MgRmluZFN5bWJvbAorICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248RmluZFN5bWJvbCwgRXhwZWN0ZWQ8UmVtb3RlU3ltYm9sPihzdGQ6OnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIkZpbmRTeW1ib2wiOyB9CisgIH07CisKKyAgY2xhc3MgRmluZFN5bWJvbEluCisgICAgOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjxGaW5kU3ltYm9sSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RlZDxSZW1vdGVTeW1ib2w+KE9iakhhbmRsZVQsIHN0ZDo6c3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiRmluZFN5bWJvbEluIjsgfQorICB9OworCisgIGNsYXNzIEVtaXRBbmRGaW5hbGl6ZQorICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248RW1pdEFuZEZpbmFsaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IoT2JqSGFuZGxlVCk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIkVtaXRBbmRGaW5hbGl6ZSI7IH0KKyAgfTsKKworICBjbGFzcyBMb29rdXAKKyAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPExvb2t1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGVkPFJlbW90ZVN5bWJvbD4oT2JqSGFuZGxlVCwgc3RkOjpzdHJpbmcpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJMb29rdXAiOyB9CisgIH07CisKKyAgY2xhc3MgTG9va3VwSW5Mb2dpY2FsRHlsaWIKKyAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPExvb2t1cEluTG9naWNhbER5bGliLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0ZWQ8UmVtb3RlU3ltYm9sPihPYmpIYW5kbGVULCBzdGQ6OnN0cmluZyk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIkxvb2t1cEluTG9naWNhbER5bGliIjsgfQorICB9OworCisgIGNsYXNzIFJlbGVhc2VSZW1vdGVTeW1ib2wKKyAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPFJlbGVhc2VSZW1vdGVTeW1ib2wsIEVycm9yKFJlbW90ZVN5bWJvbElkKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiUmVsZWFzZVJlbW90ZVN5bWJvbCI7IH0KKyAgfTsKKworICBjbGFzcyBNYXRlcmlhbGl6ZVJlbW90ZVN5bWJvbAorICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248TWF0ZXJpYWxpemVSZW1vdGVTeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RlZDxKSVRUYXJnZXRBZGRyZXNzPihSZW1vdGVTeW1ib2xJZCk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIk1hdGVyaWFsaXplUmVtb3RlU3ltYm9sIjsgfQorICB9OworfTsKKworLy8vIEJhc2UgY2xhc3MgY29udGFpbmluZyBjb21tb24gdXRpbGl0aWVzIGZvciBSZW1vdGVPYmplY3RDbGllbnRMYXllciBhbmQKKy8vLyBSZW1vdGVPYmplY3RTZXJ2ZXJMYXllci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSUENFbmRwb2ludD4KK2NsYXNzIFJlbW90ZU9iamVjdExheWVyIDogcHVibGljIFJlbW90ZU9iamVjdExheWVyQVBJIHsKK3B1YmxpYzoKKworICBSZW1vdGVPYmplY3RMYXllcihSUENFbmRwb2ludCAmUmVtb3RlLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoRXJyb3IpPiBSZXBvcnRFcnJvcikKKyAgICAgIDogUmVtb3RlKFJlbW90ZSksIFJlcG9ydEVycm9yKHN0ZDo6bW92ZShSZXBvcnRFcnJvcikpLAorICAgICAgICBTeW1ib2xJZE1ncihOdWxsU3ltYm9sSWQgKyAxKSB7CisgICAgdXNpbmcgVGhpc1QgPSBSZW1vdGVPYmplY3RMYXllcjxSUENFbmRwb2ludD47CisgICAgUmVtb3RlLnRlbXBsYXRlIGFkZEhhbmRsZXI8UmVsZWFzZVJlbW90ZVN5bWJvbD4oCisgICAgICAgICAgICAgKnRoaXMsICZUaGlzVDo6aGFuZGxlUmVsZWFzZVJlbW90ZVN5bWJvbCk7CisgICAgUmVtb3RlLnRlbXBsYXRlIGFkZEhhbmRsZXI8TWF0ZXJpYWxpemVSZW1vdGVTeW1ib2w+KAorICAgICAgICAgICAgICp0aGlzLCAmVGhpc1Q6OmhhbmRsZU1hdGVyaWFsaXplUmVtb3RlU3ltYm9sKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisKKyAgLy8vIFRoaXMgY2xhc3MgaXMgdXNlZCBhcyB0aGUgc3ltYm9sIG1hdGVyaWFsaXplciBmb3IgSklUU3ltYm9scyByZXR1cm5lZCBieQorICAvLy8gUmVtb3RlT2JqZWN0TGF5ZXJDbGllbnQvUmVtb3RlT2JqZWN0TGF5ZXJTZXJ2ZXIgLS0gdGhlIG1hdGVyaWFsaXplciBrbm93cworICAvLy8gaG93IHRvIGNhbGwgYmFjayB0byB0aGUgb3RoZXIgUlBDIGVuZHBvaW50IHRvIGdldCB0aGUgYWRkcmVzcyB3aGVuCisgIC8vLyByZXF1ZXN0ZWQuCisgIGNsYXNzIFJlbW90ZVN5bWJvbE1hdGVyaWFsaXplciB7CisgIHB1YmxpYzoKKworICAgIC8vLyBDb25zdHJ1Y3QgYSBSZW1vdGVTeW1ib2xNYXRlcmlhbGl6ZXIgZm9yIHRoZSBnaXZlbiBSZW1vdGVPYmplY3RMYXllcgorICAgIC8vLyB3aXRoIHRoZSBnaXZlbiBJZC4KKyAgICBSZW1vdGVTeW1ib2xNYXRlcmlhbGl6ZXIoUmVtb3RlT2JqZWN0TGF5ZXIgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW90ZVN5bWJvbElkIElkKQorICAgICAgOiBDKEMpLCBJZChJZCkge30KKworICAgIFJlbW90ZVN5bWJvbE1hdGVyaWFsaXplcihjb25zdCBSZW1vdGVTeW1ib2xNYXRlcmlhbGl6ZXIgJk90aGVyKQorICAgICAgOiBDKE90aGVyLkMpLCBJZChPdGhlci5JZCkgeworICAgICAgLy8gRklYTUU6IFRoaXMgaXMgYSBob3JyaWJsZSwgYXV0b19wdHItc3R5bGUsIGNvcHktYXMtbW92ZSBvcGVyYXRpb24uCisgICAgICAvLyAgICAgICAgSXQgc2hvdWxkIGJlIHJlbW92ZWQgYXMgc29vbiBhcyBMTFZNIGhhcyBDKysxNCdzIGdlbmVyYWxpemVkCisgICAgICAvLyAgICAgICAgbGFtYmRhIGNhcHR1cmUgKGF0IHdoaWNoIHBvaW50IHRoZSBtYXRlcmlhbGl6ZXIgY2FuIGJlIG1vdmVkCisgICAgICAvLyAgICAgICAgaW50byB0aGUgbGFtYmRhIGluIHJlbW90ZVRvSklUU3ltYm9sIGJlbG93KS4KKyAgICAgIGNvbnN0X2Nhc3Q8UmVtb3RlU3ltYm9sTWF0ZXJpYWxpemVyJj4oT3RoZXIpLklkID0gMDsKKyAgICB9CisKKyAgICBSZW1vdGVTeW1ib2xNYXRlcmlhbGl6ZXImCisgICAgb3BlcmF0b3I9KGNvbnN0IFJlbW90ZVN5bWJvbE1hdGVyaWFsaXplciYpID0gZGVsZXRlOworCisgICAgLy8vIFJlbGVhc2UgdGhlIHJlbW90ZSBzeW1ib2wuCisgICAgflJlbW90ZVN5bWJvbE1hdGVyaWFsaXplcigpIHsKKyAgICAgIGlmIChJZCkKKyAgICAgICAgQy5yZWxlYXNlUmVtb3RlU3ltYm9sKElkKTsKKyAgICB9CisKKyAgICAvLy8gTWF0ZXJpYWxpemUgdGhlIHN5bWJvbCBvbiB0aGUgcmVtb3RlIGFuZCBnZXQgaXRzIGFkZHJlc3MuCisgICAgRXhwZWN0ZWQ8SklUVGFyZ2V0QWRkcmVzcz4gbWF0ZXJpYWxpemUoKSB7CisgICAgICBhdXRvIEFkZHIgPSBDLm1hdGVyaWFsaXplUmVtb3RlU3ltYm9sKElkKTsKKyAgICAgIElkID0gMDsKKyAgICAgIHJldHVybiBBZGRyOworICAgIH0KKworICBwcml2YXRlOgorICAgIFJlbW90ZU9iamVjdExheWVyICZDOworICAgIFJlbW90ZVN5bWJvbElkIElkOworICB9OworCisgIC8vLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgZ2V0dGluZyBhIG51bGwgcmVtb3RlIHN5bWJvbCB2YWx1ZS4KKyAgUmVtb3RlU3ltYm9sIG51bGxSZW1vdGVTeW1ib2woKSB7CisgICAgcmV0dXJuIFJlbW90ZVN5bWJvbCgwLCBKSVRTeW1ib2xGbGFncygpKTsKKyAgfQorCisgIC8vLyBDcmVhdGVzIGEgU3RyaW5nRXJyb3IgdGhhdCBjb250YWlucyBhIGNvcHkgb2YgRXJyJ3MgbG9nIG1lc3NhZ2UsIHRoZW4KKyAgLy8vIHNlbmRzIHRoYXQgU3RyaW5nRXJyb3IgdG8gUmVwb3J0RXJyb3IuCisgIC8vLworICAvLy8gVGhpcyBhbGxvd3MgdXMgdG8gbG9jYWxseSBsb2cgZXJyb3IgbWVzc2FnZXMgZm9yIGVycm9ycyB0aGF0IHdpbGwgYWN0dWFsbHkKKyAgLy8vIGJlIGRlbGl2ZXJlZCB0byB0aGUgcmVtb3RlLgorICBFcnJvciB0ZWVMb2coRXJyb3IgRXJyKSB7CisgICAgcmV0dXJuIGhhbmRsZUVycm9ycyhzdGQ6Om1vdmUoRXJyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzXShzdGQ6OnVuaXF1ZV9wdHI8RXJyb3JJbmZvQmFzZT4gRUlCKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcG9ydEVycm9yKG1ha2VfZXJyb3I8U3RyaW5nRXJyb3I+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVJQi0+bWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVJQi0+Y29udmVydFRvRXJyb3JDb2RlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yKHN0ZDo6bW92ZShFSUIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICB9CisKKyAgRXJyb3IgYmFkUmVtb3RlU3ltYm9sSWRFcnJvcihSZW1vdGVTeW1ib2xJZCBJZCkgeworICAgIHJldHVybiBtYWtlX2Vycm9yPEJhZFN5bWJvbEhhbmRsZUVycm9yPihJZCwgIlJlbW90ZSBKSVQgU3ltYm9sIik7CisgIH0KKworICBFcnJvciBiYWRPYmplY3RIYW5kbGVFcnJvcihPYmpIYW5kbGVUIEgpIHsKKyAgICByZXR1cm4gbWFrZV9lcnJvcjxSZW1vdGVPYmplY3RMYXllckFQSTo6QmFkT2JqZWN0SGFuZGxlRXJyb3I+KAorICAgICAgICAgICAgIEgsICJCYWQgb2JqZWN0IGhhbmRsZSIpOworICB9CisKKyAgLy8vIENyZWF0ZSBhIFJlbW90ZVN5bWJvbCB3cmFwcGluZyB0aGUgZ2l2ZW4gSklUU3ltYm9sLgorICBFeHBlY3RlZDxSZW1vdGVTeW1ib2w+IGppdFN5bWJvbFRvUmVtb3RlKEpJVFN5bWJvbCBTeW0pIHsKKyAgICBpZiAoU3ltKSB7CisgICAgICBhdXRvIElkID0gU3ltYm9sSWRNZ3IuZ2V0TmV4dCgpOworICAgICAgYXV0byBGbGFncyA9IFN5bS5nZXRGbGFncygpOworICAgICAgYXNzZXJ0KCFJblVzZVN5bWJvbHMuY291bnQoSWQpICYmICJTeW1ib2wgaWQgYWxyZWFkeSBpbiB1c2UiKTsKKyAgICAgIEluVXNlU3ltYm9scy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoSWQsIHN0ZDo6bW92ZShTeW0pKSk7CisgICAgICByZXR1cm4gUmVtb3RlU3ltYm9sKElkLCBGbGFncyk7CisgICAgfSBlbHNlIGlmIChhdXRvIEVyciA9IFN5bS50YWtlRXJyb3IoKSkKKyAgICAgIHJldHVybiB0ZWVMb2coc3RkOjptb3ZlKEVycikpOworICAgIC8vIGVsc2UuLi4KKyAgICByZXR1cm4gbnVsbFJlbW90ZVN5bWJvbCgpOworICB9CisKKyAgLy8vIENvbnZlcnQgYW4gRXhwZWN0ZWQ8UmVtb3RlU3ltYm9sPiB0byBhIEpJVFN5bWJvbC4KKyAgSklUU3ltYm9sIHJlbW90ZVRvSklUU3ltYm9sKEV4cGVjdGVkPFJlbW90ZVN5bWJvbD4gUmVtb3RlU3ltT3JFcnIpIHsKKyAgICBpZiAoUmVtb3RlU3ltT3JFcnIpIHsKKyAgICAgIGF1dG8gJlJlbW90ZVN5bSA9ICpSZW1vdGVTeW1PckVycjsKKyAgICAgIGlmIChSZW1vdGVTeW0gPT0gbnVsbFJlbW90ZVN5bWJvbCgpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIC8vIGVsc2UuLi4KKyAgICAgIFJlbW90ZVN5bWJvbE1hdGVyaWFsaXplciBSU00oKnRoaXMsIFJlbW90ZVN5bS5maXJzdCk7CisgICAgICBhdXRvIFN5bSA9CisgICAgICAgIEpJVFN5bWJvbChbUlNNXSgpIG11dGFibGUgeyByZXR1cm4gUlNNLm1hdGVyaWFsaXplKCk7IH0sCisgICAgICAgICAgICAgICAgICBSZW1vdGVTeW0uc2Vjb25kKTsKKyAgICAgIHJldHVybiBTeW07CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gUmVtb3RlU3ltT3JFcnIudGFrZUVycm9yKCk7CisgIH0KKworICBSUENFbmRwb2ludCAmUmVtb3RlOworICBzdGQ6OmZ1bmN0aW9uPHZvaWQoRXJyb3IpPiBSZXBvcnRFcnJvcjsKKworcHJpdmF0ZToKKworICAvLy8gTm90aWZ5IHRoZSByZW1vdGUgdG8gcmVsZWFzZSB0aGUgZ2l2ZW4gSklUU3ltYm9sLgorICB2b2lkIHJlbGVhc2VSZW1vdGVTeW1ib2woUmVtb3RlU3ltYm9sSWQgSWQpIHsKKyAgICBpZiAoYXV0byBFcnIgPSBSZW1vdGUudGVtcGxhdGUgY2FsbEI8UmVsZWFzZVJlbW90ZVN5bWJvbD4oSWQpKQorICAgICAgUmVwb3J0RXJyb3Ioc3RkOjptb3ZlKEVycikpOworICB9CisKKyAgLy8vIE5vdGlmeSB0aGUgcmVtb3RlIHRvIG1hdGVyaWFsaXplIHRoZSBKSVRTeW1ib2wgd2l0aCB0aGUgZ2l2ZW4gSWQgYW5kCisgIC8vLyByZXR1cm4gaXRzIGFkZHJlc3MuCisgIEV4cGVjdGVkPEpJVFRhcmdldEFkZHJlc3M+IG1hdGVyaWFsaXplUmVtb3RlU3ltYm9sKFJlbW90ZVN5bWJvbElkIElkKSB7CisgICAgcmV0dXJuIFJlbW90ZS50ZW1wbGF0ZSBjYWxsQjxNYXRlcmlhbGl6ZVJlbW90ZVN5bWJvbD4oSWQpOworICB9CisKKyAgLy8vIFJlbGVhc2UgdGhlIEpJVFN5bWJvbCB3aXRoIHRoZSBnaXZlbiBJZC4KKyAgRXJyb3IgaGFuZGxlUmVsZWFzZVJlbW90ZVN5bWJvbChSZW1vdGVTeW1ib2xJZCBJZCkgeworICAgIGF1dG8gU0kgPSBJblVzZVN5bWJvbHMuZmluZChJZCk7CisgICAgaWYgKFNJICE9IEluVXNlU3ltYm9scy5lbmQoKSkgeworICAgICAgSW5Vc2VTeW1ib2xzLmVyYXNlKFNJKTsKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIHRlZUxvZyhiYWRSZW1vdGVTeW1ib2xJZEVycm9yKElkKSk7CisgIH0KKworICAvLy8gUnVuIHRoZSBtYXRlcmlhbGl6ZXIgZm9yIHRoZSBKSVRTeW1ib2wgd2l0aCB0aGUgZ2l2ZW4gSWQgYW5kIHJldHVybiBpdHMKKyAgLy8vIGFkZHJlc3MuCisgIEV4cGVjdGVkPEpJVFRhcmdldEFkZHJlc3M+IGhhbmRsZU1hdGVyaWFsaXplUmVtb3RlU3ltYm9sKFJlbW90ZVN5bWJvbElkIElkKSB7CisgICAgYXV0byBTSSA9IEluVXNlU3ltYm9scy5maW5kKElkKTsKKyAgICBpZiAoU0kgIT0gSW5Vc2VTeW1ib2xzLmVuZCgpKSB7CisgICAgICBhdXRvIEFkZHJPckVyciA9IFNJLT5zZWNvbmQuZ2V0QWRkcmVzcygpOworICAgICAgSW5Vc2VTeW1ib2xzLmVyYXNlKFNJKTsKKyAgICAgIFN5bWJvbElkTWdyLnJlbGVhc2UoSWQpOworICAgICAgaWYgKEFkZHJPckVycikKKyAgICAgICAgcmV0dXJuICpBZGRyT3JFcnI7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiB0ZWVMb2coQWRkck9yRXJyLnRha2VFcnJvcigpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHRlZUxvZyhiYWRSZW1vdGVTeW1ib2xJZEVycm9yKElkKSk7CisgICAgfQorICB9CisKKyAgcmVtb3RlOjpSZXNvdXJjZUlkTWdyIFN5bWJvbElkTWdyOworICBzdGQ6Om1hcDxSZW1vdGVTeW1ib2xJZCwgSklUU3ltYm9sPiBJblVzZVN5bWJvbHM7Cit9OworCisvLy8gUmVtb3RlT2JqZWN0Q2xpZW50TGF5ZXIgZm9yd2FyZHMgdGhlIE9SQyBPYmplY3QgTGF5ZXIgQVBJIG92ZXIgYW4gUlBDCisvLy8gY29ubmVjdGlvbi4KKy8vLworLy8vIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgYXMgdGhlIGJhc2UgbGF5ZXIgb2YgYSBKSVQgc3RhY2sgb24gdGhlIGNsaWVudCBhbmQKKy8vLyB3aWxsIGZvcndhcmQgb3BlcmF0aW9ucyB0byBhIGNvcnJlc3BvbmRpbmcgUmVtb3RlT2JqZWN0U2VydmVyTGF5ZXIgb24gdGhlCisvLy8gc2VydmVyICh3aGljaCBjYW4gYmUgY29tcG9zZWQgb24gdG9wIG9mIGEgInJlYWwiIG9iamVjdCBsYXllciBsaWtlCisvLy8gUlREeWxkT2JqZWN0TGlua2luZ0xheWVyIHRvIGFjdHVhbGx5IGNhcnJ5IG91dCB0aGUgb3BlcmF0aW9ucykuCisvLy8KKy8vLyBTZW5kaW5nIHJlbG9jYXRhYmxlIG9iamVjdHMgdG8gdGhlIHNlcnZlciAocmF0aGVyIHRoYW4gZnVsbHkgcmVsb2NhdGVkCisvLy8gYml0cykgYWxsb3dzIEpJVCdkIGNvZGUgdG8gYmUgY2FjaGVkIG9uIHRoZSBzZXJ2ZXIgc2lkZSBhbmQgcmUtdXNlZCBpbgorLy8vIHN1YnNlcXVlbnQgSklUIHNlc3Npb25zLgordGVtcGxhdGUgPHR5cGVuYW1lIFJQQ0VuZHBvaW50PgorY2xhc3MgUmVtb3RlT2JqZWN0Q2xpZW50TGF5ZXIgOiBwdWJsaWMgUmVtb3RlT2JqZWN0TGF5ZXI8UlBDRW5kcG9pbnQ+IHsKK3ByaXZhdGU6CisKKyAgdXNpbmcgQWRkT2JqZWN0ID0gUmVtb3RlT2JqZWN0TGF5ZXJBUEk6OkFkZE9iamVjdDsKKyAgdXNpbmcgUmVtb3ZlT2JqZWN0ID0gUmVtb3RlT2JqZWN0TGF5ZXJBUEk6OlJlbW92ZU9iamVjdDsKKyAgdXNpbmcgRmluZFN5bWJvbCA9IFJlbW90ZU9iamVjdExheWVyQVBJOjpGaW5kU3ltYm9sOworICB1c2luZyBGaW5kU3ltYm9sSW4gPSBSZW1vdGVPYmplY3RMYXllckFQSTo6RmluZFN5bWJvbEluOworICB1c2luZyBFbWl0QW5kRmluYWxpemUgPSBSZW1vdGVPYmplY3RMYXllckFQSTo6RW1pdEFuZEZpbmFsaXplOworICB1c2luZyBMb29rdXAgPSBSZW1vdGVPYmplY3RMYXllckFQSTo6TG9va3VwOworICB1c2luZyBMb29rdXBJbkxvZ2ljYWxEeWxpYiA9IFJlbW90ZU9iamVjdExheWVyQVBJOjpMb29rdXBJbkxvZ2ljYWxEeWxpYjsKKworICB1c2luZyBSZW1vdGVPYmplY3RMYXllcjxSUENFbmRwb2ludD46OnRlZUxvZzsKKyAgdXNpbmcgUmVtb3RlT2JqZWN0TGF5ZXI8UlBDRW5kcG9pbnQ+OjpiYWRPYmplY3RIYW5kbGVFcnJvcjsKKyAgdXNpbmcgUmVtb3RlT2JqZWN0TGF5ZXI8UlBDRW5kcG9pbnQ+OjpyZW1vdGVUb0pJVFN5bWJvbDsKKworcHVibGljOgorCisgIHVzaW5nIE9iakhhbmRsZVQgPSBSZW1vdGVPYmplY3RMYXllckFQSTo6T2JqSGFuZGxlVDsKKyAgdXNpbmcgUmVtb3RlU3ltYm9sID0gUmVtb3RlT2JqZWN0TGF5ZXJBUEk6OlJlbW90ZVN5bWJvbDsKKworICB1c2luZyBPYmplY3RQdHIgPSBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPjsKKworICAvLy8gQ3JlYXRlIGEgUmVtb3RlT2JqZWN0Q2xpZW50TGF5ZXIgdGhhdCBjb21tdW5pY2F0ZXMgd2l0aCBhCisgIC8vLyBSZW1vdGVPYmplY3RTZXJ2ZXJMYXllciBpbnN0YW5jZSB2aWEgdGhlIGdpdmVuIFJQQ0VuZHBvaW50LgorICAvLy8KKyAgLy8vIFRoZSBSZXBvcnRFcnJvciBmdW5jdG9yIGNhbiBiZSB1c2VkIGxvY2FsbHkgbG9nIGVycm9ycyB0aGF0IGFyZSBpbnRlbmRlZAorICAvLy8gdG8gYmUgc2VudCAgc2VudAorICBSZW1vdGVPYmplY3RDbGllbnRMYXllcihSUENFbmRwb2ludCAmUmVtb3RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoRXJyb3IpPiBSZXBvcnRFcnJvcikKKyAgICAgIDogUmVtb3RlT2JqZWN0TGF5ZXI8UlBDRW5kcG9pbnQ+KFJlbW90ZSwgc3RkOjptb3ZlKFJlcG9ydEVycm9yKSkgeworICAgIHVzaW5nIFRoaXNUID0gUmVtb3RlT2JqZWN0Q2xpZW50TGF5ZXI8UlBDRW5kcG9pbnQ+OworICAgIFJlbW90ZS50ZW1wbGF0ZSBhZGRIYW5kbGVyPExvb2t1cD4oKnRoaXMsICZUaGlzVDo6bG9va3VwKTsKKyAgICBSZW1vdGUudGVtcGxhdGUgYWRkSGFuZGxlcjxMb29rdXBJbkxvZ2ljYWxEeWxpYj4oCisgICAgICAgICAgICAqdGhpcywgJlRoaXNUOjpsb29rdXBJbkxvZ2ljYWxEeWxpYik7CisgIH0KKworICAvLy8gQGJyaWVmIEFkZCBhbiBvYmplY3QgdG8gdGhlIEpJVC4KKyAgLy8vCisgIC8vLyBAcmV0dXJuIEEgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGxvYWRlZCBvYmplY3QgKGZvcgorICAvLy8gICAgICAgICBzeW1ib2wgc2VhcmNoaW5nLCBmaW5hbGl6YXRpb24sIGZyZWVpbmcgbWVtb3J5LCBldGMuKS4KKyAgRXhwZWN0ZWQ8T2JqSGFuZGxlVD4KKyAgYWRkT2JqZWN0KE9iamVjdFB0ciBPYmpCdWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TGVnYWN5SklUU3ltYm9sUmVzb2x2ZXI+IFJlc29sdmVyKSB7CisgICAgaWYgKGF1dG8gSGFuZGxlT3JFcnIgPQorICAgICAgICAgICAgdGhpcy0+UmVtb3RlLnRlbXBsYXRlIGNhbGxCPEFkZE9iamVjdD4oT2JqQnVmZmVyLT5nZXRCdWZmZXIoKSkpIHsKKyAgICAgIGF1dG8gJkhhbmRsZSA9ICpIYW5kbGVPckVycjsKKyAgICAgIC8vIEZJWE1FOiBSZXR1cm4gYW4gZXJyb3IgZm9yIHRoaXM6CisgICAgICBhc3NlcnQoIVJlc29sdmVycy5jb3VudChIYW5kbGUpICYmICJIYW5kbGUgYWxyZWFkeSBpbiB1c2U/Iik7CisgICAgICBSZXNvbHZlcnNbSGFuZGxlXSA9IHN0ZDo6bW92ZShSZXNvbHZlcik7CisgICAgICByZXR1cm4gSGFuZGxlOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIEhhbmRsZU9yRXJyLnRha2VFcnJvcigpOworICB9CisKKyAgLy8vIEBicmllZiBSZW1vdmUgdGhlIGdpdmVuIG9iamVjdCBmcm9tIHRoZSBKSVQuCisgIEVycm9yIHJlbW92ZU9iamVjdChPYmpIYW5kbGVUIEgpIHsKKyAgICByZXR1cm4gdGhpcy0+UmVtb3RlLnRlbXBsYXRlIGNhbGxCPFJlbW92ZU9iamVjdD4oSCk7CisgIH0KKworICAvLy8gQGJyaWVmIFNlYXJjaCBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbC4KKyAgSklUU3ltYm9sIGZpbmRTeW1ib2woU3RyaW5nUmVmIE5hbWUsIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSkgeworICAgIHJldHVybiByZW1vdGVUb0pJVFN5bWJvbCgKKyAgICAgICAgICAgICB0aGlzLT5SZW1vdGUudGVtcGxhdGUgY2FsbEI8RmluZFN5bWJvbD4oTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwb3J0ZWRTeW1ib2xzT25seSkpOworICB9CisKKyAgLy8vIEBicmllZiBTZWFyY2ggZm9yIHRoZSBnaXZlbiBuYW1lZCBzeW1ib2wgd2l0aGluIHRoZSBnaXZlbiBjb250ZXh0LgorICBKSVRTeW1ib2wgZmluZFN5bWJvbEluKE9iakhhbmRsZVQgSCwgU3RyaW5nUmVmIE5hbWUsIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSkgeworICAgIHJldHVybiByZW1vdGVUb0pJVFN5bWJvbCgKKyAgICAgICAgICAgICB0aGlzLT5SZW1vdGUudGVtcGxhdGUgY2FsbEI8RmluZFN5bWJvbEluPihILCBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cG9ydGVkU3ltYm9sc09ubHkpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgSW1tZWRpYXRlbHkgZW1pdCBhbmQgZmluYWxpemUgdGhlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBoYW5kbGUuCisgIEVycm9yIGVtaXRBbmRGaW5hbGl6ZShPYmpIYW5kbGVUIEgpIHsKKyAgICByZXR1cm4gdGhpcy0+UmVtb3RlLnRlbXBsYXRlIGNhbGxCPEVtaXRBbmRGaW5hbGl6ZT4oSCk7CisgIH0KKworcHJpdmF0ZToKKworICBFeHBlY3RlZDxSZW1vdGVTeW1ib2w+IGxvb2t1cChPYmpIYW5kbGVUIEgsIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgICAgYXV0byBSSSA9IFJlc29sdmVycy5maW5kKEgpOworICAgIGlmIChSSSAhPSBSZXNvbHZlcnMuZW5kKCkpIHsKKyAgICAgIHJldHVybiB0aGlzLT5qaXRTeW1ib2xUb1JlbW90ZShSSS0+c2Vjb25kLT5maW5kU3ltYm9sKE5hbWUpKTsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiB0ZWVMb2coYmFkT2JqZWN0SGFuZGxlRXJyb3IoSCkpOworICB9CisKKyAgRXhwZWN0ZWQ8UmVtb3RlU3ltYm9sPiBsb29rdXBJbkxvZ2ljYWxEeWxpYihPYmpIYW5kbGVUIEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIHsKKyAgICBhdXRvIFJJID0gUmVzb2x2ZXJzLmZpbmQoSCk7CisgICAgaWYgKFJJICE9IFJlc29sdmVycy5lbmQoKSkKKyAgICAgIHJldHVybiB0aGlzLT5qaXRTeW1ib2xUb1JlbW90ZSgKKyAgICAgICAgICAgICAgIFJJLT5zZWNvbmQtPmZpbmRTeW1ib2xJbkxvZ2ljYWxEeWxpYihOYW1lKSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHRlZUxvZyhiYWRPYmplY3RIYW5kbGVFcnJvcihIKSk7CisgIH0KKworICBzdGQ6Om1hcDxyZW1vdGU6OlJlc291cmNlSWRNZ3I6OlJlc291cmNlSWQsCisgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMZWdhY3lKSVRTeW1ib2xSZXNvbHZlcj4+CisgICAgICBSZXNvbHZlcnM7Cit9OworCisvLy8gUmVtb3RlT2JqZWN0U2VydmVyTGF5ZXIgYWN0cyBhcyBhIHNlcnZlciBhbmQgaGFuZGxpbmcgUlBDIGNhbGxzIGZvciB0aGUKKy8vLyBvYmplY3QgbGF5ZXIgQVBJIGZyb20gdGhlIGdpdmVuIFJQQyBjb25uZWN0aW9uLgorLy8vCisvLy8gVGhpcyBjbGFzcyBjYW4gYmUgY29tcG9zZWQgb24gdG9wIG9mIGEgJ3JlYWwnIG9iamVjdCBsYXllciAoZS5nLgorLy8vIFJURHlsZE9iamVjdExpbmtpbmdMYXllcikgdG8gZG8gdGhlIGFjdHVhbCB3b3JrIG9mIHJlbG9jYXRpbmcgb2JqZWN0cworLy8vIGFuZCBtYWtpbmcgdGhlbSBleGVjdXRhYmxlLgordGVtcGxhdGUgPHR5cGVuYW1lIEJhc2VMYXllclQsIHR5cGVuYW1lIFJQQ0VuZHBvaW50PgorY2xhc3MgUmVtb3RlT2JqZWN0U2VydmVyTGF5ZXIgOiBwdWJsaWMgUmVtb3RlT2JqZWN0TGF5ZXI8UlBDRW5kcG9pbnQ+IHsKK3ByaXZhdGU6CisKKyAgdXNpbmcgT2JqSGFuZGxlVCA9IFJlbW90ZU9iamVjdExheWVyQVBJOjpPYmpIYW5kbGVUOworICB1c2luZyBSZW1vdGVTeW1ib2wgPSBSZW1vdGVPYmplY3RMYXllckFQSTo6UmVtb3RlU3ltYm9sOworCisgIHVzaW5nIEFkZE9iamVjdCA9IFJlbW90ZU9iamVjdExheWVyQVBJOjpBZGRPYmplY3Q7CisgIHVzaW5nIFJlbW92ZU9iamVjdCA9IFJlbW90ZU9iamVjdExheWVyQVBJOjpSZW1vdmVPYmplY3Q7CisgIHVzaW5nIEZpbmRTeW1ib2wgPSBSZW1vdGVPYmplY3RMYXllckFQSTo6RmluZFN5bWJvbDsKKyAgdXNpbmcgRmluZFN5bWJvbEluID0gUmVtb3RlT2JqZWN0TGF5ZXJBUEk6OkZpbmRTeW1ib2xJbjsKKyAgdXNpbmcgRW1pdEFuZEZpbmFsaXplID0gUmVtb3RlT2JqZWN0TGF5ZXJBUEk6OkVtaXRBbmRGaW5hbGl6ZTsKKyAgdXNpbmcgTG9va3VwID0gUmVtb3RlT2JqZWN0TGF5ZXJBUEk6Okxvb2t1cDsKKyAgdXNpbmcgTG9va3VwSW5Mb2dpY2FsRHlsaWIgPSBSZW1vdGVPYmplY3RMYXllckFQSTo6TG9va3VwSW5Mb2dpY2FsRHlsaWI7CisKKyAgdXNpbmcgUmVtb3RlT2JqZWN0TGF5ZXI8UlBDRW5kcG9pbnQ+Ojp0ZWVMb2c7CisgIHVzaW5nIFJlbW90ZU9iamVjdExheWVyPFJQQ0VuZHBvaW50Pjo6YmFkT2JqZWN0SGFuZGxlRXJyb3I7CisgIHVzaW5nIFJlbW90ZU9iamVjdExheWVyPFJQQ0VuZHBvaW50Pjo6cmVtb3RlVG9KSVRTeW1ib2w7CisKK3B1YmxpYzoKKworICAvLy8gQ3JlYXRlIGEgUmVtb3RlT2JqZWN0U2VydmVyTGF5ZXIgd2l0aCB0aGUgZ2l2ZW4gYmFzZSBsYXllciAod2hpY2ggbXVzdCBiZQorICAvLy8gYW4gb2JqZWN0IGxheWVyKSwgUlBDIGVuZHBvaW50LCBhbmQgZXJyb3IgcmVwb3J0ZXIgZnVuY3Rpb24uCisgIFJlbW90ZU9iamVjdFNlcnZlckxheWVyKEJhc2VMYXllclQgJkJhc2VMYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUlBDRW5kcG9pbnQgJlJlbW90ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEVycm9yKT4gUmVwb3J0RXJyb3IpCisgICAgOiBSZW1vdGVPYmplY3RMYXllcjxSUENFbmRwb2ludD4oUmVtb3RlLCBzdGQ6Om1vdmUoUmVwb3J0RXJyb3IpKSwKKyAgICAgIEJhc2VMYXllcihCYXNlTGF5ZXIpLCBIYW5kbGVJZE1ncigxKSB7CisgICAgdXNpbmcgVGhpc1QgPSBSZW1vdGVPYmplY3RTZXJ2ZXJMYXllcjxCYXNlTGF5ZXJULCBSUENFbmRwb2ludD47CisKKyAgICBSZW1vdGUudGVtcGxhdGUgYWRkSGFuZGxlcjxBZGRPYmplY3Q+KCp0aGlzLCAmVGhpc1Q6OmFkZE9iamVjdCk7CisgICAgUmVtb3RlLnRlbXBsYXRlIGFkZEhhbmRsZXI8UmVtb3ZlT2JqZWN0PigqdGhpcywgJlRoaXNUOjpyZW1vdmVPYmplY3QpOworICAgIFJlbW90ZS50ZW1wbGF0ZSBhZGRIYW5kbGVyPEZpbmRTeW1ib2w+KCp0aGlzLCAmVGhpc1Q6OmZpbmRTeW1ib2wpOworICAgIFJlbW90ZS50ZW1wbGF0ZSBhZGRIYW5kbGVyPEZpbmRTeW1ib2xJbj4oKnRoaXMsICZUaGlzVDo6ZmluZFN5bWJvbEluKTsKKyAgICBSZW1vdGUudGVtcGxhdGUgYWRkSGFuZGxlcjxFbWl0QW5kRmluYWxpemU+KCp0aGlzLCAmVGhpc1Q6OmVtaXRBbmRGaW5hbGl6ZSk7CisgIH0KKworcHJpdmF0ZToKKworICBjbGFzcyBTdHJpbmdNZW1vcnlCdWZmZXIgOiBwdWJsaWMgTWVtb3J5QnVmZmVyIHsKKyAgcHVibGljOgorICAgIFN0cmluZ01lbW9yeUJ1ZmZlcihzdGQ6OnN0cmluZyBCdWZmZXIpCisgICAgICA6IEJ1ZmZlcihzdGQ6Om1vdmUoQnVmZmVyKSkgeworICAgICAgaW5pdCh0aGlzLT5CdWZmZXIuZGF0YSgpLCB0aGlzLT5CdWZmZXIuZGF0YSgpICsgdGhpcy0+QnVmZmVyLnNpemUoKSwKKyAgICAgICAgICAgZmFsc2UpOworICAgIH0KKworICAgIEJ1ZmZlcktpbmQgZ2V0QnVmZmVyS2luZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIE1lbW9yeUJ1ZmZlcl9NYWxsb2M7IH0KKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBCdWZmZXI7CisgIH07CisKKyAgSklUU3ltYm9sIGxvb2t1cChPYmpIYW5kbGVUIElkLCBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworICAgIHJldHVybiByZW1vdGVUb0pJVFN5bWJvbCgKKyAgICAgICAgICAgICB0aGlzLT5SZW1vdGUudGVtcGxhdGUgY2FsbEI8TG9va3VwPihJZCwgTmFtZSkpOworICB9CisKKyAgSklUU3ltYm9sIGxvb2t1cEluTG9naWNhbER5bGliKE9iakhhbmRsZVQgSWQsIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgICAgcmV0dXJuIHJlbW90ZVRvSklUU3ltYm9sKAorICAgICAgICAgICAgIHRoaXMtPlJlbW90ZS50ZW1wbGF0ZSBjYWxsQjxMb29rdXBJbkxvZ2ljYWxEeWxpYj4oSWQsIE5hbWUpKTsKKyAgfQorCisgIEV4cGVjdGVkPE9iakhhbmRsZVQ+IGFkZE9iamVjdChzdGQ6OnN0cmluZyBPYmpCdWZmZXIpIHsKKyAgICBhdXRvIEJ1ZmZlciA9IGxsdm06Om1ha2VfdW5pcXVlPFN0cmluZ01lbW9yeUJ1ZmZlcj4oc3RkOjptb3ZlKE9iakJ1ZmZlcikpOworICAgIGF1dG8gSWQgPSBIYW5kbGVJZE1nci5nZXROZXh0KCk7CisgICAgYXNzZXJ0KCFCYXNlTGF5ZXJIYW5kbGVzLmNvdW50KElkKSAmJiAiSWQgYWxyZWFkeSBpbiB1c2U/Iik7CisKKyAgICBhdXRvIFJlc29sdmVyID0gY3JlYXRlTGFtYmRhUmVzb2x2ZXIoCisgICAgICAgIFt0aGlzLCBJZF0oY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIHsgcmV0dXJuIGxvb2t1cChJZCwgTmFtZSk7IH0sCisgICAgICAgIFt0aGlzLCBJZF0oY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIHsKKyAgICAgICAgICByZXR1cm4gbG9va3VwSW5Mb2dpY2FsRHlsaWIoSWQsIE5hbWUpOworICAgICAgICB9KTsKKworICAgIGlmIChhdXRvIEhhbmRsZU9yRXJyID0KKyAgICAgICAgICAgIEJhc2VMYXllci5hZGRPYmplY3Qoc3RkOjptb3ZlKEJ1ZmZlciksIHN0ZDo6bW92ZShSZXNvbHZlcikpKSB7CisgICAgICBCYXNlTGF5ZXJIYW5kbGVzW0lkXSA9IHN0ZDo6bW92ZSgqSGFuZGxlT3JFcnIpOworICAgICAgcmV0dXJuIElkOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIHRlZUxvZyhIYW5kbGVPckVyci50YWtlRXJyb3IoKSk7CisgIH0KKworICBFcnJvciByZW1vdmVPYmplY3QoT2JqSGFuZGxlVCBIKSB7CisgICAgYXV0byBISSA9IEJhc2VMYXllckhhbmRsZXMuZmluZChIKTsKKyAgICBpZiAoSEkgIT0gQmFzZUxheWVySGFuZGxlcy5lbmQoKSkgeworICAgICAgaWYgKGF1dG8gRXJyID0gQmFzZUxheWVyLnJlbW92ZU9iamVjdChISS0+c2Vjb25kKSkKKyAgICAgICAgcmV0dXJuIHRlZUxvZyhzdGQ6Om1vdmUoRXJyKSk7CisgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiB0ZWVMb2coYmFkT2JqZWN0SGFuZGxlRXJyb3IoSCkpOworICB9CisKKyAgRXhwZWN0ZWQ8UmVtb3RlU3ltYm9sPiBmaW5kU3ltYm9sKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5KSB7CisgICAgaWYgKGF1dG8gU3ltID0gQmFzZUxheWVyLmZpbmRTeW1ib2woTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSkpCisgICAgICByZXR1cm4gdGhpcy0+aml0U3ltYm9sVG9SZW1vdGUoc3RkOjptb3ZlKFN5bSkpOworICAgIGVsc2UgaWYgKGF1dG8gRXJyID0gU3ltLnRha2VFcnJvcigpKQorICAgICAgcmV0dXJuIHRlZUxvZyhzdGQ6Om1vdmUoRXJyKSk7CisgICAgcmV0dXJuIHRoaXMtPm51bGxSZW1vdGVTeW1ib2woKTsKKyAgfQorCisgIEV4cGVjdGVkPFJlbW90ZVN5bWJvbD4gZmluZFN5bWJvbEluKE9iakhhbmRsZVQgSCwgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSkgeworICAgIGF1dG8gSEkgPSBCYXNlTGF5ZXJIYW5kbGVzLmZpbmQoSCk7CisgICAgaWYgKEhJICE9IEJhc2VMYXllckhhbmRsZXMuZW5kKCkpIHsKKyAgICAgIGlmIChhdXRvIFN5bSA9IEJhc2VMYXllci5maW5kU3ltYm9sSW4oSEktPnNlY29uZCwgTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSkpCisgICAgICAgIHJldHVybiB0aGlzLT5qaXRTeW1ib2xUb1JlbW90ZShzdGQ6Om1vdmUoU3ltKSk7CisgICAgICBlbHNlIGlmIChhdXRvIEVyciA9IFN5bS50YWtlRXJyb3IoKSkKKyAgICAgICAgcmV0dXJuIHRlZUxvZyhzdGQ6Om1vdmUoRXJyKSk7CisgICAgICByZXR1cm4gdGhpcy0+bnVsbFJlbW90ZVN5bWJvbCgpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIHRlZUxvZyhiYWRPYmplY3RIYW5kbGVFcnJvcihIKSk7CisgIH0KKworICBFcnJvciBlbWl0QW5kRmluYWxpemUoT2JqSGFuZGxlVCBIKSB7CisgICAgYXV0byBISSA9IEJhc2VMYXllckhhbmRsZXMuZmluZChIKTsKKyAgICBpZiAoSEkgIT0gQmFzZUxheWVySGFuZGxlcy5lbmQoKSkgeworICAgICAgaWYgKGF1dG8gRXJyID0gQmFzZUxheWVyLmVtaXRBbmRGaW5hbGl6ZShISS0+c2Vjb25kKSkKKyAgICAgICAgcmV0dXJuIHRlZUxvZyhzdGQ6Om1vdmUoRXJyKSk7CisgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiB0ZWVMb2coYmFkT2JqZWN0SGFuZGxlRXJyb3IoSCkpOworICB9CisKKyAgQmFzZUxheWVyVCAmQmFzZUxheWVyOworICByZW1vdGU6OlJlc291cmNlSWRNZ3IgSGFuZGxlSWRNZ3I7CisgIHN0ZDo6bWFwPE9iakhhbmRsZVQsIHR5cGVuYW1lIEJhc2VMYXllclQ6Ok9iakhhbmRsZVQ+IEJhc2VMYXllckhhbmRsZXM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb3JjCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX1JFTU9URU9CSkVDVExBWUVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9TeW1ib2xTdHJpbmdQb29sLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvU3ltYm9sU3RyaW5nUG9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNDBkMWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvU3ltYm9sU3RyaW5nUG9vbC5oCkBAIC0wLDAgKzEsMTM3IEBACisvLz09PS0gU3ltYm9sU3RyaW5nUG9vbC5oIC0gTXVsdGktdGhyZWFkZWQgcG9vbCBmb3IgSklUIHN5bWJvbHMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENvbnRhaW5zIGEgbXVsdGktdGhyZWFkZWQgc3RyaW5nIHBvb2wgc3VpdGFibGUgZm9yIHVzZSB3aXRoIE9SQy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19TWU1CT0xTVFJJTkdQT09MX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX1NZTUJPTFNUUklOR1BPT0xfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb3JjIHsKKworY2xhc3MgU3ltYm9sU3RyaW5nUHRyOworCisvLy8gQGJyaWVmIFN0cmluZyBwb29sIGZvciBzeW1ib2wgbmFtZXMgdXNlZCBieSB0aGUgSklULgorY2xhc3MgU3ltYm9sU3RyaW5nUG9vbCB7CisgIGZyaWVuZCBjbGFzcyBTeW1ib2xTdHJpbmdQdHI7CitwdWJsaWM6CisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgc3ltYm9sIHN0cmluZyBwb2ludGVyIGZyb20gdGhlIGdpdmVuIHN0cmluZy4KKyAgU3ltYm9sU3RyaW5nUHRyIGludGVybihTdHJpbmdSZWYgUyk7CisKKyAgLy8vIEBicmllZiBSZW1vdmUgZnJvbSB0aGUgcG9vbCBhbnkgZW50cmllcyB0aGF0IGFyZSBubyBsb25nZXIgcmVmZXJlbmNlZC4KKyAgdm9pZCBjbGVhckRlYWRFbnRyaWVzKCk7CisKKyAgLy8vIEBicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIHBvb2wgaXMgZW1wdHkuCisgIGJvb2wgZW1wdHkoKSBjb25zdDsKK3ByaXZhdGU6CisgIHVzaW5nIFJlZkNvdW50VHlwZSA9IHN0ZDo6YXRvbWljPHNpemVfdD47CisgIHVzaW5nIFBvb2xNYXAgPSBTdHJpbmdNYXA8UmVmQ291bnRUeXBlPjsKKyAgdXNpbmcgUG9vbE1hcEVudHJ5ID0gU3RyaW5nTWFwRW50cnk8UmVmQ291bnRUeXBlPjsKKyAgbXV0YWJsZSBzdGQ6Om11dGV4IFBvb2xNdXRleDsKKyAgUG9vbE1hcCBQb29sOworfTsKKworLy8vIEBicmllZiBQb2ludGVyIHRvIGEgcG9vbGVkIHN0cmluZyByZXByZXNlbnRpbmcgYSBzeW1ib2wgbmFtZS4KK2NsYXNzIFN5bWJvbFN0cmluZ1B0ciB7CisgIGZyaWVuZCBjbGFzcyBTeW1ib2xTdHJpbmdQb29sOworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN5bWJvbFN0cmluZ1B0ciAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN5bWJvbFN0cmluZ1B0ciAmUkhTKTsKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFN5bWJvbFN0cmluZ1B0ciAmTEhTLCBjb25zdCBTeW1ib2xTdHJpbmdQdHIgJlJIUyk7CisKK3B1YmxpYzoKKyAgU3ltYm9sU3RyaW5nUHRyKCkgPSBkZWZhdWx0OworICBTeW1ib2xTdHJpbmdQdHIoY29uc3QgU3ltYm9sU3RyaW5nUHRyICZPdGhlcikKKyAgICA6IFMoT3RoZXIuUykgeworICAgIGlmIChTKQorICAgICAgKytTLT5nZXRWYWx1ZSgpOworICB9CisKKyAgU3ltYm9sU3RyaW5nUHRyJiBvcGVyYXRvcj0oY29uc3QgU3ltYm9sU3RyaW5nUHRyICZPdGhlcikgeworICAgIGlmIChTKQorICAgICAgLS1TLT5nZXRWYWx1ZSgpOworICAgIFMgPSBPdGhlci5TOworICAgIGlmIChTKQorICAgICAgKytTLT5nZXRWYWx1ZSgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFN5bWJvbFN0cmluZ1B0cihTeW1ib2xTdHJpbmdQdHIgJiZPdGhlcikgOiBTKG51bGxwdHIpIHsKKyAgICBzdGQ6OnN3YXAoUywgT3RoZXIuUyk7CisgIH0KKworICBTeW1ib2xTdHJpbmdQdHImIG9wZXJhdG9yPShTeW1ib2xTdHJpbmdQdHIgJiZPdGhlcikgeworICAgIGlmIChTKQorICAgICAgLS1TLT5nZXRWYWx1ZSgpOworICAgIFMgPSBudWxscHRyOworICAgIHN0ZDo6c3dhcChTLCBPdGhlci5TKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB+U3ltYm9sU3RyaW5nUHRyKCkgeworICAgIGlmIChTKQorICAgICAgLS1TLT5nZXRWYWx1ZSgpOworICB9CisKKyAgU3RyaW5nUmVmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIFMtPmZpcnN0KCk7IH0KKworcHJpdmF0ZToKKworICBTeW1ib2xTdHJpbmdQdHIoU3ltYm9sU3RyaW5nUG9vbDo6UG9vbE1hcEVudHJ5ICpTKQorICAgICAgOiBTKFMpIHsKKyAgICBpZiAoUykKKyAgICAgICsrUy0+Z2V0VmFsdWUoKTsKKyAgfQorCisgIFN5bWJvbFN0cmluZ1Bvb2w6OlBvb2xNYXBFbnRyeSAqUyA9IG51bGxwdHI7Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN5bWJvbFN0cmluZ1B0ciAmTEhTLCBjb25zdCBTeW1ib2xTdHJpbmdQdHIgJlJIUykgeworICByZXR1cm4gTEhTLlMgPT0gUkhTLlM7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgU3ltYm9sU3RyaW5nUHRyICZMSFMsIGNvbnN0IFN5bWJvbFN0cmluZ1B0ciAmUkhTKSB7CisgIHJldHVybiAhKExIUyA9PSBSSFMpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgU3ltYm9sU3RyaW5nUHRyICZMSFMsIGNvbnN0IFN5bWJvbFN0cmluZ1B0ciAmUkhTKSB7CisgIHJldHVybiBMSFMuUyA8IFJIUy5TOworfQorCitpbmxpbmUgU3ltYm9sU3RyaW5nUHRyIFN5bWJvbFN0cmluZ1Bvb2w6OmludGVybihTdHJpbmdSZWYgUykgeworICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gTG9jayhQb29sTXV0ZXgpOworICBQb29sTWFwOjppdGVyYXRvciBJOworICBib29sIEFkZGVkOworICBzdGQ6OnRpZShJLCBBZGRlZCkgPSBQb29sLnRyeV9lbXBsYWNlKFMsIDApOworICByZXR1cm4gU3ltYm9sU3RyaW5nUHRyKCYqSSk7Cit9CisKK2lubGluZSB2b2lkIFN5bWJvbFN0cmluZ1Bvb2w6OmNsZWFyRGVhZEVudHJpZXMoKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBMb2NrKFBvb2xNdXRleCk7CisgIGZvciAoYXV0byBJID0gUG9vbC5iZWdpbigpLCBFID0gUG9vbC5lbmQoKTsgSSAhPSBFOykgeworICAgIGF1dG8gVG1wID0gSSsrOworICAgIGlmIChUbXAtPnNlY29uZCA9PSAwKQorICAgICAgUG9vbC5lcmFzZShUbXApOworICB9Cit9CisKK2lubGluZSBib29sIFN5bWJvbFN0cmluZ1Bvb2w6OmVtcHR5KCkgY29uc3QgeworICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gTG9jayhQb29sTXV0ZXgpOworICByZXR1cm4gUG9vbC5lbXB0eSgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2Ugb3JjCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX1NZTUJPTFNUUklOR1BPT0xfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjTUNKSVRSZXBsYWNlbWVudC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjTUNKSVRSZXBsYWNlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZDU2NDgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmNNQ0pJVFJlcGxhY2VtZW50LmgKQEAgLTAsMCArMSwzOCBAQAorLy89PT0tLS0tIE9yY01DSklUUmVwbGFjZW1lbnQuaCAtIE9yYy1iYXNlZCBNQ0pJVCByZXBsYWNlbWVudCAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZm9yY2VzIE9yY01DSklUUmVwbGFjZW1lbnQgdG8gbGluayBpbiBvbiBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorLy8gKFdpbmRvd3MpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDTUNKSVRSRVBMQUNFTUVOVF9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ01DSklUUkVQTEFDRU1FTlRfSAorCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvRXhlY3V0aW9uRW5naW5lLmgiCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworZXh0ZXJuICJDIiB2b2lkIExMVk1MaW5rSW5PcmNNQ0pJVFJlcGxhY2VtZW50KCk7CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBGb3JjZU9yY01DSklUUmVwbGFjZW1lbnRMaW5raW5nIHsKKyAgICBGb3JjZU9yY01DSklUUmVwbGFjZW1lbnRMaW5raW5nKCkgeworICAgICAgLy8gV2UgbXVzdCByZWZlcmVuY2UgT3JjTUNKSVRSZXBsYWNlbWVudCBpbiBzdWNoIGEgd2F5IHRoYXQgY29tcGlsZXJzIHdpbGwKKyAgICAgIC8vIG5vdCBkZWxldGUgaXQgYWxsIGFzIGRlYWQgY29kZSwgZXZlbiB3aXRoIHdob2xlIHByb2dyYW0gb3B0aW1pemF0aW9uLAorICAgICAgLy8geWV0IGlzIGVmZmVjdGl2ZWx5IGEgTk8tT1AuIEFzIHRoZSBjb21waWxlciBpc24ndCBzbWFydCBlbm91Z2ggdG8ga25vdworICAgICAgLy8gdGhhdCBnZXRlbnYoKSBuZXZlciByZXR1cm5zIC0xLCB0aGlzIHdpbGwgZG8gdGhlIGpvYi4KKyAgICAgIGlmIChzdGQ6OmdldGVudigiYmFyIikgIT0gKGNoYXIqKSAtMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgICBMTFZNTGlua0luT3JjTUNKSVRSZXBsYWNlbWVudCgpOworICAgIH0KKyAgfSBGb3JjZU9yY01DSklUUmVwbGFjZW1lbnRMaW5raW5nOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL1JURHlsZE1lbW9yeU1hbmFnZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL1JURHlsZE1lbW9yeU1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTc1MjAyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvUlREeWxkTWVtb3J5TWFuYWdlci5oCkBAIC0wLDAgKzEsMTUzIEBACisvLz09PS0tIFJURHlsZE1lbW9yeU1hbmFnZXIuY3BwIC0gTWVtb3J5IG1hbmFnZXIgZm9yIE1DLUpJVCAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEludGVyZmFjZSBvZiB0aGUgcnVudGltZSBkeW5hbWljIG1lbW9yeSBtYW5hZ2VyIGJhc2UgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9SVERZTERNRU1PUllNQU5BR0VSX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfUlREWUxETUVNT1JZTUFOQUdFUl9ICisKKyNpbmNsdWRlICJsbHZtLWMvRXhlY3V0aW9uRW5naW5lLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvUnVudGltZUR5bGQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0JpbmRpbmdXcmFwcGluZy5oIgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRXhlY3V0aW9uRW5naW5lOworCituYW1lc3BhY2Ugb2JqZWN0IHsKKyAgY2xhc3MgT2JqZWN0RmlsZTsKK30gLy8gZW5kIG5hbWVzcGFjZSBvYmplY3QKKworY2xhc3MgTUNKSVRNZW1vcnlNYW5hZ2VyIDogcHVibGljIFJ1bnRpbWVEeWxkOjpNZW1vcnlNYW5hZ2VyIHsKK3B1YmxpYzoKKyAgLy8gRG9uJ3QgaGlkZSB0aGUgbm90aWZ5T2JqZWN0TG9hZGVkIG1ldGhvZCBmcm9tIFJ1bnRpbWVEeWxkOjpNZW1vcnlNYW5hZ2VyLgorICB1c2luZyBSdW50aW1lRHlsZDo6TWVtb3J5TWFuYWdlcjo6bm90aWZ5T2JqZWN0TG9hZGVkOworCisgIC8vLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYW4gb2JqZWN0IGhhcyBiZWVuIGxvYWRlZCBpbnRvIG1lbW9yeSBidXQKKyAgLy8vIGJlZm9yZSByZWxvY2F0aW9ucyBhcmUgYXBwbGllZCB0byB0aGUgbG9hZGVkIHNlY3Rpb25zLiAgVGhlIG9iamVjdCBsb2FkCisgIC8vLyBtYXkgaGF2ZSBiZWVuIGluaXRpYXRlZCBieSBNQ0pJVCB0byByZXNvbHZlIGFuIGV4dGVybmFsIHN5bWJvbCBmb3IgYW5vdGhlcgorICAvLy8gb2JqZWN0IHRoYXQgaXMgYmVpbmcgZmluYWxpemVkLiAgSW4gdGhhdCBjYXNlLCB0aGUgb2JqZWN0IGFib3V0IHdoaWNoCisgIC8vLyB0aGUgbWVtb3J5IG1hbmFnZXIgaXMgYmVpbmcgbm90aWZpZWQgd2lsbCBiZSBmaW5hbGl6ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIKKyAgLy8vIHRoZSBtZW1vcnkgbWFuYWdlciByZXR1cm5zIGZyb20gdGhpcyBjYWxsLgorICAvLy8KKyAgLy8vIE1lbW9yeSBtYW5hZ2VycyB3aGljaCBhcmUgcHJlcGFyaW5nIGNvZGUgZm9yIGV4ZWN1dGlvbiBpbiBhbiBleHRlcm5hbAorICAvLy8gYWRkcmVzcyBzcGFjZSBjYW4gdXNlIHRoaXMgY2FsbCB0byByZW1hcCB0aGUgc2VjdGlvbiBhZGRyZXNzZXMgZm9yIHRoZQorICAvLy8gbmV3bHkgbG9hZGVkIG9iamVjdC4KKyAgdmlydHVhbCB2b2lkIG5vdGlmeU9iamVjdExvYWRlZChFeGVjdXRpb25FbmdpbmUgKkVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iamVjdDo6T2JqZWN0RmlsZSAmKSB7fQorfTsKKworLy8gUnVudGltZUR5bGQgY2xpZW50cyBvZnRlbiB3YW50IHRvIGhhbmRsZSB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgb2YKKy8vIHdoYXQgZ2V0cyBwbGFjZWQgd2hlcmUuIEZvciBKSVQgY2xpZW50cywgdGhpcyBpcyB0aGUgc3Vic2V0IG9mCisvLyBKSVRNZW1vcnlNYW5hZ2VyIHJlcXVpcmVkIGZvciBkeW5hbWljIGxvYWRpbmcgb2YgYmluYXJpZXMuCisvLworLy8gRklYTUU6IEFzIHRoZSBSdW50aW1lRHlsZCBmaWxscyBvdXQsIGFkZGl0aW9uYWwgcm91dGluZXMgd2lsbCBiZSBuZWVkZWQKKy8vICAgICAgICBmb3IgdGhlIHZhcnlpbmcgdHlwZXMgb2Ygb2JqZWN0cyB0byBiZSBhbGxvY2F0ZWQuCitjbGFzcyBSVER5bGRNZW1vcnlNYW5hZ2VyIDogcHVibGljIE1DSklUTWVtb3J5TWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTGVnYWN5SklUU3ltYm9sUmVzb2x2ZXIgeworcHVibGljOgorICBSVER5bGRNZW1vcnlNYW5hZ2VyKCkgPSBkZWZhdWx0OworICBSVER5bGRNZW1vcnlNYW5hZ2VyKGNvbnN0IFJURHlsZE1lbW9yeU1hbmFnZXImKSA9IGRlbGV0ZTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgUlREeWxkTWVtb3J5TWFuYWdlciYpID0gZGVsZXRlOworICB+UlREeWxkTWVtb3J5TWFuYWdlcigpIG92ZXJyaWRlOworCisgIC8vLyBSZWdpc3RlciBFSCBmcmFtZXMgaW4gdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAgc3RhdGljIHZvaWQgcmVnaXN0ZXJFSEZyYW1lc0luUHJvY2Vzcyh1aW50OF90ICpBZGRyLCBzaXplX3QgU2l6ZSk7CisKKyAgLy8vIERlcmVnaXN0ZXIgRUggZnJhbWVzIGluIHRoZSBjdXJyZW50IHByb2Nlcy4KKyAgc3RhdGljIHZvaWQgZGVyZWdpc3RlckVIRnJhbWVzSW5Qcm9jZXNzKHVpbnQ4X3QgKkFkZHIsIHNpemVfdCBTaXplKTsKKworICB2b2lkIHJlZ2lzdGVyRUhGcmFtZXModWludDhfdCAqQWRkciwgdWludDY0X3QgTG9hZEFkZHIsIHNpemVfdCBTaXplKSBvdmVycmlkZTsKKyAgdm9pZCBkZXJlZ2lzdGVyRUhGcmFtZXMoKSBvdmVycmlkZTsKKworICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIGluCisgIC8vLyB0aGUgY3VycmVudCBwcm9jZXNzLgorICBzdGF0aWMgdWludDY0X3QgZ2V0U3ltYm9sQWRkcmVzc0luUHJvY2Vzcyhjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSk7CisKKyAgLy8vIExlZ2FjeSBzeW1ib2wgbG9va3VwIC0gREVQUkVDQVRFRCEgUGxlYXNlIG92ZXJyaWRlIGZpbmRTeW1ib2wgaW5zdGVhZC4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gb3IgdmFyaWFibGUuCisgIC8vLyBJdCBpcyB1c2VkIHRvIHJlc29sdmUgc3ltYm9scyBkdXJpbmcgbW9kdWxlIGxpbmtpbmcuCisgIHZpcnR1YWwgdWludDY0X3QgZ2V0U3ltYm9sQWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworICAgIHJldHVybiBnZXRTeW1ib2xBZGRyZXNzSW5Qcm9jZXNzKE5hbWUpOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgYSBSdW50aW1lRHlsZDo6U3ltYm9sSW5mbyBmb3IgdGhlIHNwZWNpZmllZCBmdW5jdGlvbgorICAvLy8gb3IgdmFyaWFibGUuIEl0IGlzIHVzZWQgdG8gcmVzb2x2ZSBzeW1ib2xzIGR1cmluZyBtb2R1bGUgbGlua2luZy4KKyAgLy8vCisgIC8vLyBCeSBkZWZhdWx0IHRoaXMgZmFsbHMgYmFjayBvbiB0aGUgbGVnYWN5IGxvb2t1cCBtZXRob2Q6CisgIC8vLyAnZ2V0U3ltYm9sQWRkcmVzcycuIFRoZSBhZGRyZXNzIHJldHVybmVkIGJ5IGdldFN5bWJvbEFkZHJlc3MgaXMgdHJlYXRlZCBhcworICAvLy8gYSBzdHJvbmcsIGV4cG9ydGVkIHN5bWJvbCwgY29uc2lzdGVudCB3aXRoIGhpc3RvcmljYWwgdHJlYXRtZW50IGJ5CisgIC8vLyBSdW50aW1lRHlsZC4KKyAgLy8vCisgIC8vLyBDbGllbnRzIHdyaXRpbmcgY3VzdG9tIFJURHlsZE1lbW9yeU1hbmFnZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIG92ZXJyaWRlCisgIC8vLyB0aGlzIG1ldGhvZCBhbmQgcmV0dXJuIGEgU3ltYm9sSW5mbyB3aXRoIHRoZSBmbGFncyBzZXQgY29ycmVjdGx5LiBUaGlzIGlzCisgIC8vLyBuZWNlc3NhcnkgZm9yIFJ1bnRpbWVEeWxkIHRvIGNvcnJlY3RseSBoYW5kbGUgd2VhayBhbmQgbm9uLWV4cG9ydGVkIHN5bWJvbHMuCisgIEpJVFN5bWJvbCBmaW5kU3ltYm9sKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEpJVFN5bWJvbChnZXRTeW1ib2xBZGRyZXNzKE5hbWUpLCBKSVRTeW1ib2xGbGFnczo6RXhwb3J0ZWQpOworICB9CisKKyAgLy8vIExlZ2FjeSBzeW1ib2wgbG9va3VwIC0tIERFUFJFQ0FURUQhIFBsZWFzZSBvdmVycmlkZQorICAvLy8gZmluZFN5bWJvbEluTG9naWNhbER5bGliIGluc3RlYWQuCisgIC8vLworICAvLy8gRGVmYXVsdCB0byB0cmVhdGluZyBhbGwgbW9kdWxlcyBhcyBzZXBhcmF0ZS4KKyAgdmlydHVhbCB1aW50NjRfdCBnZXRTeW1ib2xBZGRyZXNzSW5Mb2dpY2FsRHlsaWIoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBEZWZhdWx0IHRvIHRyZWF0aW5nIGFsbCBtb2R1bGVzIGFzIHNlcGFyYXRlLgorICAvLy8KKyAgLy8vIEJ5IGRlZmF1bHQgdGhpcyBmYWxscyBiYWNrIG9uIHRoZSBsZWdhY3kgbG9va3VwIG1ldGhvZDoKKyAgLy8vICdnZXRTeW1ib2xBZGRyZXNzSW5Mb2dpY2FsRHlsaWInLiBUaGUgYWRkcmVzcyByZXR1cm5lZCBieQorICAvLy8gZ2V0U3ltYm9sQWRkcmVzc0luTG9naWNhbER5bGliIGlzIHRyZWF0ZWQgYXMgYSBzdHJvbmcsIGV4cG9ydGVkIHN5bWJvbCwKKyAgLy8vIGNvbnNpc3RlbnQgd2l0aCBoaXN0b3JpY2FsIHRyZWF0bWVudCBieSBSdW50aW1lRHlsZC4KKyAgLy8vCisgIC8vLyBDbGllbnRzIHdyaXRpbmcgY3VzdG9tIFJURHlsZE1lbW9yeU1hbmFnZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIG92ZXJyaWRlCisgIC8vLyB0aGlzIG1ldGhvZCBhbmQgcmV0dXJuIGEgU3ltYm9sSW5mbyB3aXRoIHRoZSBmbGFncyBzZXQgY29ycmVjdGx5LiBUaGlzIGlzCisgIC8vLyBuZWNlc3NhcnkgZm9yIFJ1bnRpbWVEeWxkIHRvIGNvcnJlY3RseSBoYW5kbGUgd2VhayBhbmQgbm9uLWV4cG9ydGVkIHN5bWJvbHMuCisgIEpJVFN5bWJvbAorICBmaW5kU3ltYm9sSW5Mb2dpY2FsRHlsaWIoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSklUU3ltYm9sKGdldFN5bWJvbEFkZHJlc3NJbkxvZ2ljYWxEeWxpYihOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSklUU3ltYm9sRmxhZ3M6OkV4cG9ydGVkKTsKKyAgfQorCisgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24uIEFzIHN1Y2ggaXQgaXMKKyAgLy8vIG9ubHkgdXNlZnVsIGZvciByZXNvbHZpbmcgbGlicmFyeSBzeW1ib2xzLCBub3QgY29kZSBnZW5lcmF0ZWQgc3ltYm9scy4KKyAgLy8vCisgIC8vLyBJZiBccCBBYm9ydE9uRmFpbHVyZSBpcyBmYWxzZSBhbmQgbm8gZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpcworICAvLy8gZm91bmQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG51bGwgcG9pbnRlci4gT3RoZXJ3aXNlLCBpdCBwcmludHMgYQorICAvLy8gbWVzc2FnZSB0byBzdGRlcnIgYW5kIGFib3J0cy4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgZm9yIG1lbW9yeSBtYW5hZ2VycyB0byBiZSB1c2VkIHdpdGgKKyAgLy8vIE1DSklUIG9yIFJ1bnRpbWVEeWxkLiAgVXNlIGdldFN5bWJvbEFkZHJlc3MgaW5zdGVhZC4KKyAgdmlydHVhbCB2b2lkICpnZXRQb2ludGVyVG9OYW1lZEZ1bmN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBYm9ydE9uRmFpbHVyZSA9IHRydWUpOworCitwcm90ZWN0ZWQ6CisgIHN0cnVjdCBFSEZyYW1lIHsKKyAgICB1aW50OF90ICpBZGRyOworICAgIHNpemVfdCBTaXplOworICB9OworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPEVIRnJhbWU+IEVIRnJhbWVJbmZvczsKKyAgRUhGcmFtZUluZm9zIEVIRnJhbWVzOworfTsKKworLy8gQ3JlYXRlIHdyYXBwZXJzIGZvciBDIEJpbmRpbmcgdHlwZXMgKHNlZSBDQmluZGluZ1dyYXBwaW5nLmgpLgorREVGSU5FX1NJTVBMRV9DT05WRVJTSU9OX0ZVTkNUSU9OUygKKyAgICBSVER5bGRNZW1vcnlNYW5hZ2VyLCBMTFZNTUNKSVRNZW1vcnlNYW5hZ2VyUmVmKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfUlREWUxETUVNT1JZTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9SdW50aW1lRHlsZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvUnVudGltZUR5bGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGRhNWFmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvUnVudGltZUR5bGQuaApAQCAtMCwwICsxLDI2NCBAQAorLy89PT0tIFJ1bnRpbWVEeWxkLmggLSBSdW4tdGltZSBkeW5hbWljIGxpbmtlciBmb3IgTUMtSklUIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJbnRlcmZhY2UgZm9yIHRoZSBydW50aW1lIGR5bmFtaWMgbGlua2VyIGZhY2lsaXRpZXMgb2YgdGhlIE1DLUpJVC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX1JVTlRJTUVEWUxEX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfUlVOVElNRURZTERfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRElDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvT2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIG9iamVjdCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBPd25pbmdCaW5hcnk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvYmplY3QKKworLy8vIEJhc2UgY2xhc3MgZm9yIGVycm9ycyBvcmlnaW5hdGluZyBpbiBSdW50aW1lRHlsZCwgZS5nLiBtaXNzaW5nIHJlbG9jYXRpb24KKy8vLyBzdXBwb3J0LgorY2xhc3MgUnVudGltZUR5bGRFcnJvciA6IHB1YmxpYyBFcnJvckluZm88UnVudGltZUR5bGRFcnJvcj4geworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBSdW50aW1lRHlsZEVycm9yKHN0ZDo6c3RyaW5nIEVyck1zZykgOiBFcnJNc2coc3RkOjptb3ZlKEVyck1zZykpIHt9CisKKyAgdm9pZCBsb2cocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldEVycm9yTWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIEVyck1zZzsgfQorICBzdGQ6OmVycm9yX2NvZGUgY29udmVydFRvRXJyb3JDb2RlKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIEVyck1zZzsKK307CisKK2NsYXNzIFJ1bnRpbWVEeWxkQ2hlY2tlckltcGw7CitjbGFzcyBSdW50aW1lRHlsZEltcGw7CisKK2NsYXNzIFJ1bnRpbWVEeWxkIHsKKyAgZnJpZW5kIGNsYXNzIFJ1bnRpbWVEeWxkQ2hlY2tlckltcGw7CisKK3Byb3RlY3RlZDoKKyAgLy8gQ2hhbmdlIHRoZSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCBhIHNlY3Rpb24gd2hlbiByZXNvbHZpbmcgcmVsb2NhdGlvbnMuCisgIC8vIEFueSByZWxvY2F0aW9ucyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ltYm9sIHdpbGwgYmUgcmUtcmVzb2x2ZWQuCisgIHZvaWQgcmVhc3NpZ25TZWN0aW9uQWRkcmVzcyh1bnNpZ25lZCBTZWN0aW9uSUQsIHVpbnQ2NF90IEFkZHIpOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvYWRlZCBvYmplY3QuCisgIGNsYXNzIExvYWRlZE9iamVjdEluZm8gOiBwdWJsaWMgbGx2bTo6TG9hZGVkT2JqZWN0SW5mbyB7CisgICAgZnJpZW5kIGNsYXNzIFJ1bnRpbWVEeWxkSW1wbDsKKworICBwdWJsaWM6CisgICAgdXNpbmcgT2JqU2VjdGlvblRvSURNYXAgPSBzdGQ6Om1hcDxvYmplY3Q6OlNlY3Rpb25SZWYsIHVuc2lnbmVkPjsKKworICAgIExvYWRlZE9iamVjdEluZm8oUnVudGltZUR5bGRJbXBsICZSVER5bGQsIE9ialNlY3Rpb25Ub0lETWFwIE9ialNlY1RvSURNYXApCisgICAgICAgIDogUlREeWxkKFJURHlsZCksIE9ialNlY1RvSURNYXAoc3RkOjptb3ZlKE9ialNlY1RvSURNYXApKSB7fQorCisgICAgdmlydHVhbCBvYmplY3Q6Ok93bmluZ0JpbmFyeTxvYmplY3Q6Ok9iamVjdEZpbGU+CisgICAgZ2V0T2JqZWN0Rm9yRGVidWcoY29uc3Qgb2JqZWN0OjpPYmplY3RGaWxlICZPYmopIGNvbnN0ID0gMDsKKworICAgIHVpbnQ2NF90CisgICAgZ2V0U2VjdGlvbkxvYWRBZGRyZXNzKGNvbnN0IG9iamVjdDo6U2VjdGlvblJlZiAmU2VjKSBjb25zdCBvdmVycmlkZTsKKworICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCisgICAgUnVudGltZUR5bGRJbXBsICZSVER5bGQ7CisgICAgT2JqU2VjdGlvblRvSURNYXAgT2JqU2VjVG9JRE1hcDsKKyAgfTsKKworICAvLy8gXGJyaWVmIE1lbW9yeSBNYW5hZ2VtZW50LgorICBjbGFzcyBNZW1vcnlNYW5hZ2VyIHsKKyAgICBmcmllbmQgY2xhc3MgUnVudGltZUR5bGQ7CisKKyAgcHVibGljOgorICAgIE1lbW9yeU1hbmFnZXIoKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB+TWVtb3J5TWFuYWdlcigpID0gZGVmYXVsdDsKKworICAgIC8vLyBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBvZiAoYXQgbGVhc3QpIHRoZSBnaXZlbiBzaXplIHN1aXRhYmxlIGZvcgorICAgIC8vLyBleGVjdXRhYmxlIGNvZGUuIFRoZSBTZWN0aW9uSUQgaXMgYSB1bmlxdWUgaWRlbnRpZmllciBhc3NpZ25lZCBieSB0aGUKKyAgICAvLy8gUnVudGltZUR5bGQgaW5zdGFuY2UsIGFuZCBvcHRpb25hbGx5IHJlY29yZGVkIGJ5IHRoZSBtZW1vcnkgbWFuYWdlciB0bworICAgIC8vLyBhY2Nlc3MgYSBsb2FkZWQgc2VjdGlvbi4KKyAgICB2aXJ0dWFsIHVpbnQ4X3QgKmFsbG9jYXRlQ29kZVNlY3Rpb24odWludHB0cl90IFNpemUsIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2VjdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VjdGlvbk5hbWUpID0gMDsKKworICAgIC8vLyBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBvZiAoYXQgbGVhc3QpIHRoZSBnaXZlbiBzaXplIHN1aXRhYmxlIGZvciBkYXRhLgorICAgIC8vLyBUaGUgU2VjdGlvbklEIGlzIGEgdW5pcXVlIGlkZW50aWZpZXIgYXNzaWduZWQgYnkgdGhlIEpJVCBlbmdpbmUsIGFuZAorICAgIC8vLyBvcHRpb25hbGx5IHJlY29yZGVkIGJ5IHRoZSBtZW1vcnkgbWFuYWdlciB0byBhY2Nlc3MgYSBsb2FkZWQgc2VjdGlvbi4KKyAgICB2aXJ0dWFsIHVpbnQ4X3QgKmFsbG9jYXRlRGF0YVNlY3Rpb24odWludHB0cl90IFNpemUsIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2VjdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VjdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNSZWFkT25seSkgPSAwOworCisgICAgLy8vIEluZm9ybSB0aGUgbWVtb3J5IG1hbmFnZXIgYWJvdXQgdGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8KKyAgICAvLy8gYWxsb2NhdGUgYWxsIHNlY3Rpb25zIHRvIGJlIGxvYWRlZDoKKyAgICAvLy8gXHAgQ29kZVNpemUgLSB0aGUgdG90YWwgc2l6ZSBvZiBhbGwgY29kZSBzZWN0aW9ucworICAgIC8vLyBccCBEYXRhU2l6ZVJPIC0gdGhlIHRvdGFsIHNpemUgb2YgYWxsIHJlYWQtb25seSBkYXRhIHNlY3Rpb25zCisgICAgLy8vIFxwIERhdGFTaXplUlcgLSB0aGUgdG90YWwgc2l6ZSBvZiBhbGwgcmVhZC13cml0ZSBkYXRhIHNlY3Rpb25zCisgICAgLy8vCisgICAgLy8vIE5vdGUgdGhhdCBieSBkZWZhdWx0IHRoZSBjYWxsYmFjayBpcyBkaXNhYmxlZC4gVG8gZW5hYmxlIGl0CisgICAgLy8vIHJlZGVmaW5lIHRoZSBtZXRob2QgbmVlZHNUb1Jlc2VydmVBbGxvY2F0aW9uU3BhY2UgdG8gcmV0dXJuIHRydWUuCisgICAgdmlydHVhbCB2b2lkIHJlc2VydmVBbGxvY2F0aW9uU3BhY2UodWludHB0cl90IENvZGVTaXplLCB1aW50MzJfdCBDb2RlQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IFJPRGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUk9EYXRhQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IFJXRGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUldEYXRhQWxpZ24pIHt9CisKKyAgICAvLy8gT3ZlcnJpZGUgdG8gcmV0dXJuIHRydWUgdG8gZW5hYmxlIHRoZSByZXNlcnZlQWxsb2NhdGlvblNwYWNlIGNhbGxiYWNrLgorICAgIHZpcnR1YWwgYm9vbCBuZWVkc1RvUmVzZXJ2ZUFsbG9jYXRpb25TcGFjZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAvLy8gUmVnaXN0ZXIgdGhlIEVIIGZyYW1lcyB3aXRoIHRoZSBydW50aW1lIHNvIHRoYXQgYysrIGV4Y2VwdGlvbnMgd29yay4KKyAgICAvLy8KKyAgICAvLy8gXHAgQWRkciBwYXJhbWV0ZXIgcHJvdmlkZXMgdGhlIGxvY2FsIGFkZHJlc3Mgb2YgdGhlIEVIIGZyYW1lIHNlY3Rpb24KKyAgICAvLy8gZGF0YSwgd2hpbGUgXHAgTG9hZEFkZHIgcHJvdmlkZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgaW4gdGhlIHRhcmdldAorICAgIC8vLyBhZGRyZXNzIHNwYWNlLiAgSWYgdGhlIHNlY3Rpb24gaGFzIG5vdCBiZWVuIHJlbWFwcGVkICh3aGljaCB3aWxsIHVzdWFsbHkKKyAgICAvLy8gYmUgdGhlIGNhc2UgZm9yIGxvY2FsIGV4ZWN1dGlvbikgdGhlc2UgdHdvIHZhbHVlcyB3aWxsIGJlIHRoZSBzYW1lLgorICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckVIRnJhbWVzKHVpbnQ4X3QgKkFkZHIsIHVpbnQ2NF90IExvYWRBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBTaXplKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRlcmVnaXN0ZXJFSEZyYW1lcygpID0gMDsKKworICAgIC8vLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBvYmplY3QgbG9hZGluZyBpcyBjb21wbGV0ZSBhbmQgc2VjdGlvbiBwYWdlCisgICAgLy8vIHBlcm1pc3Npb25zIGNhbiBiZSBhcHBsaWVkLiAgSXQgaXMgdXAgdG8gdGhlIG1lbW9yeSBtYW5hZ2VyIGltcGxlbWVudGF0aW9uCisgICAgLy8vIHRvIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCB0byBhY3Qgb24gdGhpcyBtZXRob2QuICBUaGUgbWVtb3J5IG1hbmFnZXIgd2lsbAorICAgIC8vLyB0eXBpY2FsbHkgYWxsb2NhdGUgYWxsIHNlY3Rpb25zIGFzIHJlYWQtd3JpdGUgYW5kIHRoZW4gYXBwbHkgc3BlY2lmaWMKKyAgICAvLy8gcGVybWlzc2lvbnMgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuICBDb2RlIHNlY3Rpb25zIGNhbm5vdCBiZSBleGVjdXRlZAorICAgIC8vLyB1bnRpbCB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZC4gIEluIGFkZGl0aW9uLCBhbnkgY2FjaGUgY29oZXJlbmN5CisgICAgLy8vIG9wZXJhdGlvbnMgbmVlZGVkIHRvIHJlbGlhYmx5IHVzZSB0aGUgbWVtb3J5IGFyZSBhbHNvIHBlcmZvcm1lZC4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgdmlydHVhbCBib29sIGZpbmFsaXplTWVtb3J5KHN0ZDo6c3RyaW5nICpFcnJNc2cgPSBudWxscHRyKSA9IDA7CisKKyAgICAvLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGFuIG9iamVjdCBoYXMgYmVlbiBsb2FkZWQgaW50byBtZW1vcnkgYnV0CisgICAgLy8vIGJlZm9yZSByZWxvY2F0aW9ucyBhcmUgYXBwbGllZCB0byB0aGUgbG9hZGVkIHNlY3Rpb25zLgorICAgIC8vLworICAgIC8vLyBNZW1vcnkgbWFuYWdlcnMgd2hpY2ggYXJlIHByZXBhcmluZyBjb2RlIGZvciBleGVjdXRpb24gaW4gYW4gZXh0ZXJuYWwKKyAgICAvLy8gYWRkcmVzcyBzcGFjZSBjYW4gdXNlIHRoaXMgY2FsbCB0byByZW1hcCB0aGUgc2VjdGlvbiBhZGRyZXNzZXMgZm9yIHRoZQorICAgIC8vLyBuZXdseSBsb2FkZWQgb2JqZWN0LgorICAgIC8vLworICAgIC8vLyBGb3IgY2xpZW50cyB0aGF0IGRvIG5vdCBuZWVkIGFjY2VzcyB0byBhbiBFeGVjdXRpb25FbmdpbmUgaW5zdGFuY2UgdGhpcworICAgIC8vLyBtZXRob2Qgc2hvdWxkIGJlIHByZWZlcnJlZCB0byBpdHMgY291c2luCisgICAgLy8vIE1DSklUTWVtb3J5TWFuYWdlcjo6bm90aWZ5T2JqZWN0TG9hZGVkIGFzIHRoaXMgbWV0aG9kIGlzIGNvbXBhdGlibGUgd2l0aAorICAgIC8vLyBPUkMgSklUIHN0YWNrcy4KKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5T2JqZWN0TG9hZGVkKFJ1bnRpbWVEeWxkICZSVER5bGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvYmplY3Q6Ok9iamVjdEZpbGUgJk9iaikge30KKworICBwcml2YXRlOgorICAgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworICAgIGJvb2wgRmluYWxpemF0aW9uTG9ja2VkID0gZmFsc2U7CisgIH07CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBSdW50aW1lRHlsZCBpbnN0YW5jZS4KKyAgUnVudGltZUR5bGQoTWVtb3J5TWFuYWdlciAmTWVtTWdyLCBKSVRTeW1ib2xSZXNvbHZlciAmUmVzb2x2ZXIpOworICBSdW50aW1lRHlsZChjb25zdCBSdW50aW1lRHlsZCAmKSA9IGRlbGV0ZTsKKyAgUnVudGltZUR5bGQgJm9wZXJhdG9yPShjb25zdCBSdW50aW1lRHlsZCAmKSA9IGRlbGV0ZTsKKyAgflJ1bnRpbWVEeWxkKCk7CisKKyAgLy8vIEFkZCB0aGUgcmVmZXJlbmNlZCBvYmplY3QgZmlsZSB0byB0aGUgbGlzdCBvZiBvYmplY3RzIHRvIGJlIGxvYWRlZCBhbmQKKyAgLy8vIHJlbG9jYXRlZC4KKyAgc3RkOjp1bmlxdWVfcHRyPExvYWRlZE9iamVjdEluZm8+IGxvYWRPYmplY3QoY29uc3Qgb2JqZWN0OjpPYmplY3RGaWxlICZPKTsKKworICAvLy8gR2V0IHRoZSBhZGRyZXNzIG9mIG91ciBsb2NhbCBjb3B5IG9mIHRoZSBzeW1ib2wuIFRoaXMgbWF5IG9yIG1heSBub3QKKyAgLy8vIGJlIHRoZSBhZGRyZXNzIHVzZWQgZm9yIHJlbG9jYXRpb24gKGNsaWVudHMgY2FuIGNvcHkgdGhlIGRhdGEgYXJvdW5kCisgIC8vLyBhbmQgcmVzb2x2ZSByZWxvY2F0b25zIGJhc2VkIG9uIHdoZXJlIHRoZXkgcHV0IGl0KS4KKyAgdm9pZCAqZ2V0U3ltYm9sTG9jYWxBZGRyZXNzKFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSB0YXJnZXQgYWRkcmVzcyBhbmQgZmxhZ3MgZm9yIHRoZSBuYW1lZCBzeW1ib2wuCisgIC8vLyBUaGlzIGFkZHJlc3MgaXMgdGhlIG9uZSB1c2VkIGZvciByZWxvY2F0aW9uLgorICBKSVRFdmFsdWF0ZWRTeW1ib2wgZ2V0U3ltYm9sKFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKworICAvLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIHN5bWJvbCB0YWJsZS4gVGhpcyBjYW4gYmUgdXNlZCBieSBvbi1maW5hbGl6ZWQKKyAgLy8vIGNhbGxiYWNrcyB0byBleHRyYWN0IHRoZSBzeW1ib2wgdGFibGUgYmVmb3JlIHRocm93aW5nIGF3YXkgdGhlCisgIC8vLyBSdW50aW1lRHlsZCBpbnN0YW5jZS4gQmVjYXVzZSB0aGUgbWFwIGtleXMgKFN0cmluZ1JlZnMpIGFyZSBiYWNrZWQgYnkKKyAgLy8vIHN0cmluZ3MgaW5zaWRlIHRoZSBSdW50aW1lRHlsZCBpbnN0YW5jZSwgdGhlIG1hcCBzaG91bGQgYmUgcHJvY2Vzc2VkCisgIC8vLyBiZWZvcmUgdGhlIFJ1bnRpbWVEeWxkIGluc3RhbmNlIGlzIGRpc2NhcmRlZC4KKyAgc3RkOjptYXA8U3RyaW5nUmVmLCBKSVRFdmFsdWF0ZWRTeW1ib2w+IGdldFN5bWJvbFRhYmxlKCkgY29uc3Q7CisKKyAgLy8vIFJlc29sdmUgdGhlIHJlbG9jYXRpb25zIGZvciBhbGwgc3ltYm9scyB3ZSBjdXJyZW50bHkga25vdyBhYm91dC4KKyAgdm9pZCByZXNvbHZlUmVsb2NhdGlvbnMoKTsKKworICAvLy8gTWFwIGEgc2VjdGlvbiB0byBpdHMgdGFyZ2V0IGFkZHJlc3Mgc3BhY2UgdmFsdWUuCisgIC8vLyBNYXAgdGhlIGFkZHJlc3Mgb2YgYSBKSVQgc2VjdGlvbiBhcyByZXR1cm5lZCBmcm9tIHRoZSBtZW1vcnkgbWFuYWdlcgorICAvLy8gdG8gdGhlIGFkZHJlc3MgaW4gdGhlIHRhcmdldCBwcm9jZXNzIGFzIHRoZSBydW5uaW5nIGNvZGUgd2lsbCBzZWUgaXQuCisgIC8vLyBUaGlzIGlzIHRoZSBhZGRyZXNzIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgcmVsb2NhdGlvbiByZXNvbHV0aW9uLgorICB2b2lkIG1hcFNlY3Rpb25BZGRyZXNzKGNvbnN0IHZvaWQgKkxvY2FsQWRkcmVzcywgdWludDY0X3QgVGFyZ2V0QWRkcmVzcyk7CisKKyAgLy8vIFJlZ2lzdGVyIGFueSBFSCBmcmFtZSBzZWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgYnV0IG5vdCBwcmV2aW91c2x5CisgIC8vLyByZWdpc3RlcmVkIHdpdGggdGhlIG1lbW9yeSBtYW5hZ2VyLiAgTm90ZSwgUnVudGltZUR5bGQgaXMgcmVzcG9uc2libGUKKyAgLy8vIGZvciBpZGVudGlmeWluZyB0aGUgRUggZnJhbWUgYW5kIGNhbGxpbmcgdGhlIG1lbW9yeSBtYW5hZ2VyIHdpdGggdGhlCisgIC8vLyBFSCBmcmFtZSBzZWN0aW9uIGRhdGEuICBIb3dldmVyLCB0aGUgbWVtb3J5IG1hbmFnZXIgaXRzZWxmIHdpbGwgaGFuZGxlCisgIC8vLyB0aGUgYWN0dWFsIHRhcmdldC1zcGVjaWZpYyBFSCBmcmFtZSByZWdpc3RyYXRpb24uCisgIHZvaWQgcmVnaXN0ZXJFSEZyYW1lcygpOworCisgIHZvaWQgZGVyZWdpc3RlckVIRnJhbWVzKCk7CisKKyAgYm9vbCBoYXNFcnJvcigpOworICBTdHJpbmdSZWYgZ2V0RXJyb3JTdHJpbmcoKTsKKworICAvLy8gQnkgZGVmYXVsdCwgb25seSBzZWN0aW9ucyB0aGF0IGFyZSAicmVxdWlyZWQgZm9yIGV4ZWN1dGlvbiIgYXJlIHBhc3NlZCB0bworICAvLy8gdGhlIFJURHlsZE1lbW9yeU1hbmFnZXIsIGFuZCBvdGhlciBzZWN0aW9ucyBhcmUgZGlzY2FyZGVkLiBQYXNzaW5nICd0cnVlJworICAvLy8gdG8gdGhpcyBtZXRob2Qgd2lsbCBjYXVzZSBSdW50aW1lRHlsZCB0byBwYXNzIGFsbCBzZWN0aW9ucyB0byBpdHMKKyAgLy8vIG1lbW9yeSBtYW5hZ2VyIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZSAicmVxdWlyZWQgdG8gZXhlY3V0ZSIgaW4gdGhlCisgIC8vLyB1c3VhbCBzZW5zZS4gVGhpcyBpcyB1c2VmdWwgZm9yIGluc3BlY3RpbmcgbWV0YWRhdGEgc2VjdGlvbnMgdGhhdCBtYXkgbm90CisgIC8vLyBjb250YWluIHJlbG9jYXRpb25zLCBFLmcuIERlYnVnIGluZm8sIHN0YWNrbWFwcy4KKyAgLy8vCisgIC8vLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IG9iamVjdCBmaWxlIGlzIGxvYWRlZC4KKyAgdm9pZCBzZXRQcm9jZXNzQWxsU2VjdGlvbnMoYm9vbCBQcm9jZXNzQWxsU2VjdGlvbnMpIHsKKyAgICBhc3NlcnQoIUR5bGQgJiYgInNldFByb2Nlc3NBbGxTZWN0aW9ucyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgbG9hZE9iamVjdC4iKTsKKyAgICB0aGlzLT5Qcm9jZXNzQWxsU2VjdGlvbnMgPSBQcm9jZXNzQWxsU2VjdGlvbnM7CisgIH0KKworICAvLy8gUGVyZm9ybSBhbGwgYWN0aW9ucyBuZWVkZWQgdG8gbWFrZSB0aGUgY29kZSBvd25lZCBieSB0aGlzIFJ1bnRpbWVEeWxkCisgIC8vLyBpbnN0YW5jZSBleGVjdXRhYmxlOgorICAvLy8KKyAgLy8vIDEpIEFwcGx5IHJlbG9jYXRpb25zLgorICAvLy8gMikgUmVnaXN0ZXIgRUggZnJhbWVzLgorICAvLy8gMykgVXBkYXRlIG1lbW9yeSBwZXJtaXNzaW9ucyouCisgIC8vLworICAvLy8gKiBGaW5hbGl6YXRpb24gaXMgcG90ZW50aWFsbHkgcmVjdXJzaXZlKiosIGFuZCB0aGUgM3JkIHN0ZXAgd2lsbCBvbmx5IGJlCisgIC8vLyAgIGFwcGxpZWQgYnkgdGhlIG91dGVybW9zdCBjYWxsIHRvIGZpbmFsaXplLiBUaGlzIGFsbG93cyBkaWZmZXJlbnQKKyAgLy8vICAgUnVudGltZUR5bGQgaW5zdGFuY2VzIHRvIHNoYXJlIGEgbWVtb3J5IG1hbmFnZXIgd2l0aG91dCB0aGUgaW5uZXJtb3N0CisgIC8vLyAgIGZpbmFsaXphdGlvbiBsb2NraW5nIHRoZSBtZW1vcnkgYW5kIGNhdXNpbmcgcmVsb2NhdGlvbiBmaXh1cCBlcnJvcnMgaW4KKyAgLy8vICAgb3V0ZXIgaW5zdGFuY2VzLgorICAvLy8KKyAgLy8vICoqIFJlY3Vyc2l2ZSBmaW5hbGl6YXRpb24gb2NjdXJzIHdoZW4gb25lIFJ1bnRpbWVEeWxkIGluc3RhbmNlcyBuZWVkcyB0aGUKKyAgLy8vICAgYWRkcmVzcyBvZiBhIHN5bWJvbCBvd25lZCBieSBzb21lIG90aGVyIGluc3RhbmNlIGluIG9yZGVyIHRvIGFwcGx5CisgIC8vLyAgIHJlbG9jYXRpb25zLgorICAvLy8KKyAgdm9pZCBmaW5hbGl6ZVdpdGhNZW1vcnlNYW5hZ2VyTG9ja2luZygpOworCitwcml2YXRlOgorICAvLyBSdW50aW1lRHlsZEltcGwgaXMgdGhlIGFjdHVhbCBjbGFzcy4gUnVudGltZUR5bGQgaXMganVzdCB0aGUgcHVibGljCisgIC8vIGludGVyZmFjZS4KKyAgc3RkOjp1bmlxdWVfcHRyPFJ1bnRpbWVEeWxkSW1wbD4gRHlsZDsKKyAgTWVtb3J5TWFuYWdlciAmTWVtTWdyOworICBKSVRTeW1ib2xSZXNvbHZlciAmUmVzb2x2ZXI7CisgIGJvb2wgUHJvY2Vzc0FsbFNlY3Rpb25zOworICBSdW50aW1lRHlsZENoZWNrZXJJbXBsICpDaGVja2VyOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX1JVTlRJTUVEWUxEX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL1J1bnRpbWVEeWxkQ2hlY2tlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvUnVudGltZUR5bGRDaGVja2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU4OWY0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL1J1bnRpbWVEeWxkQ2hlY2tlci5oCkBAIC0wLDAgKzEsMTEyIEBACisvLz09PS0tLS0gUnVudGltZUR5bGRDaGVja2VyLmggLSBSdW50aW1lRHlsZCB0ZXN0ZXIgZnJhbWV3b3JrIC0tLS0tKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX1JVTlRJTUVEWUxEQ0hFQ0tFUl9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX1JVTlRJTUVEWUxEQ0hFQ0tFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgTUNEaXNhc3NlbWJsZXI7CitjbGFzcyBNZW1vcnlCdWZmZXI7CitjbGFzcyBNQ0luc3RQcmludGVyOworY2xhc3MgUnVudGltZUR5bGQ7CitjbGFzcyBSdW50aW1lRHlsZENoZWNrZXJJbXBsOworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vLyBcYnJpZWYgUnVudGltZUR5bGQgaW52YXJpYW50IGNoZWNrZXIgZm9yIHZlcmlmeWluZyB0aGF0IFJ1bnRpbWVEeWxkIGhhcworLy8vICAgICAgICBjb3JyZWN0bHkgYXBwbGllZCByZWxvY2F0aW9ucy4KKy8vLworLy8vIFRoZSBSdW50aW1lRHlsZENoZWNrZXIgY2xhc3MgZXZhbHVhdGVzIGV4cHJlc3Npb25zIGFnYWluc3QgYW4gYXR0YWNoZWQKKy8vLyBSdW50aW1lRHlsZCBpbnN0YW5jZSB0byB2ZXJpZnkgdGhhdCByZWxvY2F0aW9ucyBoYXZlIGJlZW4gYXBwbGllZAorLy8vIGNvcnJlY3RseS4KKy8vLworLy8vIFRoZSBleHByZXNzaW9uIGxhbmd1YWdlIHN1cHBvcnRzIGJhc2ljIHBvaW50ZXIgYXJpdGhtZXRpYyBhbmQgYml0LW1hc2tpbmcsCisvLy8gYW5kIGhhcyBsaW1pdGVkIGRpc2Fzc2VtYmxlciBpbnRlZ3JhdGlvbiBmb3IgYWNjZXNzaW5nIGluc3RydWN0aW9uCisvLy8gb3BlcmFuZHMgYW5kIHRoZSBuZXh0IFBDIChwcm9ncmFtIGNvdW50ZXIpIGFkZHJlc3MgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBUaGUgbGFuZ3VhZ2Ugc3ludGF4IGlzOgorLy8vCisvLy8gY2hlY2sgPSBleHByICc9JyBleHByCisvLy8KKy8vLyBleHByID0gYmluYXJ5X2V4cHIKKy8vLyAgICAgIHwgc2xpY2VhYmxlX2V4cHIKKy8vLworLy8vIHNsaWNlYWJsZV9leHByID0gJyp7JyBudW1iZXIgJ30nIGxvYWRfYWRkcl9leHByIFtzbGljZV0KKy8vLyAgICAgICAgICAgICAgICB8ICcoJyBleHByICcpJyBbc2xpY2VdCisvLy8gICAgICAgICAgICAgICAgfCBpZGVudF9leHByIFtzbGljZV0KKy8vLyAgICAgICAgICAgICAgICB8IG51bWJlciBbc2xpY2VdCisvLy8KKy8vLyBzbGljZSA9ICdbJyBoaWdoLWJpdC1pbmRleCAnOicgbG93LWJpdC1pbmRleCAnXScKKy8vLworLy8vIGxvYWRfYWRkcl9leHByID0gc3ltYm9sCisvLy8gICAgICAgICAgICAgICAgfCAnKCcgc3ltYm9sICcrJyBudW1iZXIgJyknCisvLy8gICAgICAgICAgICAgICAgfCAnKCcgc3ltYm9sICctJyBudW1iZXIgJyknCisvLy8KKy8vLyBpZGVudF9leHByID0gJ2RlY29kZV9vcGVyYW5kJyAnKCcgc3ltYm9sICcsJyBvcGVyYW5kLWluZGV4ICcpJworLy8vICAgICAgICAgICAgfCAnbmV4dF9wYycgICAgICAgICcoJyBzeW1ib2wgJyknCisvLy8gICAgICAgICAgICB8ICdzdHViX2FkZHInICcoJyBmaWxlLW5hbWUgJywnIHNlY3Rpb24tbmFtZSAnLCcgc3ltYm9sICcpJworLy8vICAgICAgICAgICAgfCBzeW1ib2wKKy8vLworLy8vIGJpbmFyeV9leHByID0gZXhwciAnKycgZXhwcgorLy8vICAgICAgICAgICAgIHwgZXhwciAnLScgZXhwcgorLy8vICAgICAgICAgICAgIHwgZXhwciAnJicgZXhwcgorLy8vICAgICAgICAgICAgIHwgZXhwciAnfCcgZXhwcgorLy8vICAgICAgICAgICAgIHwgZXhwciAnPDwnIGV4cHIKKy8vLyAgICAgICAgICAgICB8IGV4cHIgJz4+JyBleHByCisvLy8KK2NsYXNzIFJ1bnRpbWVEeWxkQ2hlY2tlciB7CitwdWJsaWM6CisgIFJ1bnRpbWVEeWxkQ2hlY2tlcihSdW50aW1lRHlsZCAmUlREeWxkLCBNQ0Rpc2Fzc2VtYmxlciAqRGlzYXNzZW1ibGVyLAorICAgICAgICAgICAgICAgICAgICAgTUNJbnN0UHJpbnRlciAqSW5zdFByaW50ZXIsIHJhd19vc3RyZWFtICZFcnJTdHJlYW0pOworICB+UnVudGltZUR5bGRDaGVja2VyKCk7CisKKyAgLy8gXGJyaWVmIEdldCB0aGUgYXNzb2NpYXRlZCBSVER5bGQgaW5zdGFuY2UuCisgIFJ1bnRpbWVEeWxkJiBnZXRSVER5bGQoKTsKKworICAvLyBcYnJpZWYgR2V0IHRoZSBhc3NvY2lhdGVkIFJURHlsZCBpbnN0YW5jZS4KKyAgY29uc3QgUnVudGltZUR5bGQmIGdldFJURHlsZCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQ2hlY2sgYSBzaW5nbGUgZXhwcmVzc2lvbiBhZ2FpbnN0IHRoZSBhdHRhY2hlZCBSdW50aW1lRHlsZAorICAvLy8gICAgICAgIGluc3RhbmNlLgorICBib29sIGNoZWNrKFN0cmluZ1JlZiBDaGVja0V4cHIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU2NhbiB0aGUgZ2l2ZW4gbWVtb3J5IGJ1ZmZlciBmb3IgbGluZXMgYmVnaW5uaW5nIHdpdGggdGhlIHN0cmluZworICAvLy8gICAgICAgIGluIFJ1bGVQcmVmaXguIFRoZSByZW1haW5kZXIgb2YgdGhlIGxpbmUgaXMgcGFzc2VkIHRvIHRoZSBjaGVjaworICAvLy8gICAgICAgIG1ldGhvZCB0byBiZSBldmFsdWF0ZWQgYXMgYW4gZXhwcmVzc2lvbi4KKyAgYm9vbCBjaGVja0FsbFJ1bGVzSW5CdWZmZXIoU3RyaW5nUmVmIFJ1bGVQcmVmaXgsIE1lbW9yeUJ1ZmZlciAqTWVtQnVmKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlcXVlc3RlZCBzZWN0aW9uIChvciBhbiBlcnJvciBtZXNzYWdlCisgIC8vLyAgICAgICAgaW4gdGhlIHNlY29uZCBlbGVtZW50IG9mIHRoZSBwYWlyIGlmIHRoZSBhZGRyZXNzIGNhbm5vdCBiZSBmb3VuZCkuCisgIC8vLworICAvLy8gaWYgJ0xvY2FsQWRkcmVzcycgaXMgdHJ1ZSwgdGhpcyByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uCisgIC8vLyB3aXRoaW4gdGhlIGxpbmtlcidzIG1lbW9yeS4gSWYgJ0xvY2FsQWRkcmVzcycgaXMgZmFsc2UgaXQgcmV0dXJucyB0aGUKKyAgLy8vIGFkZHJlc3Mgd2l0aGluIHRoZSB0YXJnZXQgcHJvY2VzcyAoaS5lLiB0aGUgbG9hZCBhZGRyZXNzKS4KKyAgc3RkOjpwYWlyPHVpbnQ2NF90LCBzdGQ6OnN0cmluZz4gZ2V0U2VjdGlvbkFkZHIoU3RyaW5nUmVmIEZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VjdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTG9jYWxBZGRyZXNzKTsKKworICAvLy8gXGJyaWVmIElmIHRoZXJlIGlzIGEgc2VjdGlvbiBhdCB0aGUgZ2l2ZW4gbG9jYWwgYWRkcmVzcywgcmV0dXJuIGl0cyBsb2FkCisgIC8vLyAgICAgICAgYWRkcmVzcywgb3RoZXJ3aXNlIHJldHVybiBub25lLgorICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0U2VjdGlvbkxvYWRBZGRyZXNzKHZvaWQgKkxvY2FsQWRkcmVzcykgY29uc3Q7CisKK3ByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxSdW50aW1lRHlsZENoZWNrZXJJbXBsPiBJbXBsOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9TZWN0aW9uTWVtb3J5TWFuYWdlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvU2VjdGlvbk1lbW9yeU1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzZlMzcxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvU2VjdGlvbk1lbW9yeU1hbmFnZXIuaApAQCAtMCwwICsxLDE5MyBAQAorLy89PT0tIFNlY3Rpb25NZW1vcnlNYW5hZ2VyLmggLSBNZW1vcnkgbWFuYWdlciBmb3IgTUNKSVQvUnREeWxkIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgc2VjdGlvbi1iYXNlZCBtZW1vcnkgbWFuYWdlciB1c2VkIGJ5CisvLyB0aGUgTUNKSVQgZXhlY3V0aW9uIGVuZ2luZSBhbmQgUnVudGltZUR5bGQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9TRUNUSU9OTUVNT1JZTUFOQUdFUl9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX1NFQ1RJT05NRU1PUllNQU5BR0VSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvUlREeWxkTWVtb3J5TWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnkuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFRoaXMgaXMgYSBzaW1wbGUgbWVtb3J5IG1hbmFnZXIgd2hpY2ggaW1wbGVtZW50cyB0aGUgbWV0aG9kcyBjYWxsZWQgYnkKKy8vLyB0aGUgUnVudGltZUR5bGQgY2xhc3MgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzZWN0aW9uLWJhc2VkIGxvYWRpbmcgb2YKKy8vLyBvYmplY3RzLCB1c3VhbGx5IHRob3NlIGdlbmVyYXRlZCBieSB0aGUgTUNKSVQgZXhlY3V0aW9uIGVuZ2luZS4KKy8vLworLy8vIFRoaXMgbWVtb3J5IG1hbmFnZXIgYWxsb2NhdGVzIGFsbCBzZWN0aW9uIG1lbW9yeSBhcyByZWFkLXdyaXRlLiAgVGhlCisvLy8gUnVudGltZUR5bGQgd2lsbCBjb3B5IEpJVGVkIHNlY3Rpb24gbWVtb3J5IGludG8gdGhlc2UgYWxsb2NhdGVkIGJsb2NrcworLy8vIGFuZCBwZXJmb3JtIGFueSBuZWNlc3NhcnkgbGlua2luZyBhbmQgcmVsb2NhdGlvbnMuCisvLy8KKy8vLyBBbnkgY2xpZW50IHVzaW5nIHRoaXMgbWVtb3J5IG1hbmFnZXIgTVVTVCBlbnN1cmUgdGhhdCBzZWN0aW9uLXNwZWNpZmljCisvLy8gcGFnZSBwZXJtaXNzaW9ucyBoYXZlIGJlZW4gYXBwbGllZCBiZWZvcmUgYXR0ZW1wdGluZyB0byBleGVjdXRlIGZ1bmN0aW9ucworLy8vIGluIHRoZSBKSVRlZCBvYmplY3QuICBQZXJtaXNzaW9ucyBjYW4gYmUgYXBwbGllZCBlaXRoZXIgYnkgY2FsbGluZworLy8vIE1DSklUOjpmaW5hbGl6ZU9iamVjdCBvciBieSBjYWxsaW5nIFNlY3Rpb25NZW1vcnlNYW5hZ2VyOjpmaW5hbGl6ZU1lbW9yeQorLy8vIGRpcmVjdGx5LiAgQ2xpZW50cyBvZiBNQ0pJVCBzaG91bGQgY2FsbCBNQ0pJVDo6ZmluYWxpemVPYmplY3QuCitjbGFzcyBTZWN0aW9uTWVtb3J5TWFuYWdlciA6IHB1YmxpYyBSVER5bGRNZW1vcnlNYW5hZ2VyIHsKK3B1YmxpYzoKKyAgLy8vIFRoaXMgZW51bSBkZXNjcmliZXMgdGhlIHZhcmlvdXMgcmVhc29ucyB0byBhbGxvY2F0ZSBwYWdlcyBmcm9tCisgIC8vLyBhbGxvY2F0ZU1hcHBlZE1lbW9yeS4KKyAgZW51bSBjbGFzcyBBbGxvY2F0aW9uUHVycG9zZSB7CisgICAgQ29kZSwKKyAgICBST0RhdGEsCisgICAgUldEYXRhLAorICB9OworCisgIC8vLyBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBpbnRlcmZhY2UgYXJlIHVzZWQgYnkgU2VjdGlvbk1lbW9yeU1hbmFnZXIgdG8KKyAgLy8vIHJlcXVlc3QgcGFnZXMgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4KKyAgY2xhc3MgTWVtb3J5TWFwcGVyIHsKKyAgcHVibGljOgorICAgIC8vLyBUaGlzIG1ldGhvZCBhdHRlbXB0cyB0byBhbGxvY2F0ZSBccCBOdW1CeXRlcyBieXRlcyBvZiB2aXJ0dWFsIG1lbW9yeSBmb3IKKyAgICAvLy8gXHAgUHVycG9zZS4gIFxwIE5lYXJCbG9jayBtYXkgcG9pbnQgdG8gYW4gZXhpc3RpbmcgYWxsb2NhdGlvbiwgaW4gd2hpY2gKKyAgICAvLy8gY2FzZSBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYWxsb2NhdGUgbW9yZSBtZW1vcnkgbmVhciB0aGUgZXhpc3RpbmcgYmxvY2suCisgICAgLy8vIFRoZSBhY3R1YWwgYWxsb2NhdGVkIGFkZHJlc3MgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgbmVhciB0aGUgcmVxdWVzdGVkCisgICAgLy8vIGFkZHJlc3MuICBccCBGbGFncyBpcyB1c2VkIHRvIHNldCB0aGUgaW5pdGlhbCBwcm90ZWN0aW9uIGZsYWdzIGZvciB0aGUKKyAgICAvLy8gYmxvY2sgb2YgdGhlIG1lbW9yeS4gIFxwIEVDIFtvdXRdIHJldHVybnMgYW4gb2JqZWN0IGRlc2NyaWJpbmcgYW55IGVycm9yCisgICAgLy8vIHRoYXQgb2NjdXJzLgorICAgIC8vLworICAgIC8vLyBUaGlzIG1ldGhvZCBtYXkgYWxsb2NhdGUgbW9yZSB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkLiAgVGhlCisgICAgLy8vIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGlzIGluZGljYXRlZCBpbiB0aGUgcmV0dXJuZWQKKyAgICAvLy8gTWVtb3J5QmxvY2suCisgICAgLy8vCisgICAgLy8vIFRoZSBzdGFydCBvZiB0aGUgYWxsb2NhdGVkIGJsb2NrIG11c3QgYmUgYWxpZ25lZCB3aXRoIHRoZSBzeXN0ZW0KKyAgICAvLy8gYWxsb2NhdGlvbiBncmFudWxhcml0eSAoNjRLIG9uIFdpbmRvd3MsIHBhZ2Ugc2l6ZSBvbiBMaW51eCkuICBJZiB0aGUKKyAgICAvLy8gYWRkcmVzcyBmb2xsb3dpbmcgXHAgTmVhckJsb2NrIGlzIG5vdCBzbyBhbGlnbmVkLCBpdCB3aWxsIGJlIHJvdW5kZWQgdXAKKyAgICAvLy8gdG8gdGhlIG5leHQgYWxsb2NhdGlvbiBncmFudWxhcml0eSBib3VuZGFyeS4KKyAgICAvLy8KKyAgICAvLy8gXHIgYSBub24tbnVsbCBNZW1vcnlCbG9jayBpZiB0aGUgZnVuY3Rpb24gd2FzIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBhCisgICAgLy8vIG51bGwgTWVtb3J5QmxvY2sgd2l0aCBccCBFQyBkZXNjcmliaW5nIHRoZSBlcnJvci4KKyAgICB2aXJ0dWFsIHN5czo6TWVtb3J5QmxvY2sKKyAgICBhbGxvY2F0ZU1hcHBlZE1lbW9yeShBbGxvY2F0aW9uUHVycG9zZSBQdXJwb3NlLCBzaXplX3QgTnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3lzOjpNZW1vcnlCbG9jayAqY29uc3QgTmVhckJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzLCBzdGQ6OmVycm9yX2NvZGUgJkVDKSA9IDA7CisKKyAgICAvLy8gVGhpcyBtZXRob2Qgc2V0cyB0aGUgcHJvdGVjdGlvbiBmbGFncyBmb3IgYSBibG9jayBvZiBtZW1vcnkgdG8gdGhlIHN0YXRlCisgICAgLy8vIHNwZWNpZmllZCBieSBccCBGbGFncy4gIFRoZSBiZWhhdmlvciBpcyBub3Qgc3BlY2lmaWVkIGlmIHRoZSBtZW1vcnkgd2FzCisgICAgLy8vIG5vdCBhbGxvY2F0ZWQgdXNpbmcgdGhlIGFsbG9jYXRlTWFwcGVkTWVtb3J5IG1ldGhvZC4KKyAgICAvLy8gXHAgQmxvY2sgZGVzY3JpYmVzIHRoZSBtZW1vcnkgYmxvY2sgdG8gYmUgcHJvdGVjdGVkLgorICAgIC8vLyBccCBGbGFncyBzcGVjaWZpZXMgdGhlIG5ldyBwcm90ZWN0aW9uIHN0YXRlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBibG9jay4KKyAgICAvLy8KKyAgICAvLy8gSWYgXHAgRmxhZ3MgaXMgTUZfV1JJVEUsIHRoZSBhY3R1YWwgYmVoYXZpb3IgdmFyaWVzIHdpdGggdGhlIG9wZXJhdGluZworICAgIC8vLyBzeXN0ZW0gKGkuZS4gTUZfUkVBRCB8IE1GX1dSSVRFIG9uIFdpbmRvd3MpIGFuZCB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZQorICAgIC8vLyAoaS5lLiBNRl9XUklURSAtPiBNRl9SRUFEIHwgTUZfV1JJVEUgb24gaTM4NikuCisgICAgLy8vCisgICAgLy8vIFxyIGVycm9yX3N1Y2Nlc3MgaWYgdGhlIGZ1bmN0aW9uIHdhcyBzdWNjZXNzZnVsLCBvciBhbiBlcnJvcl9jb2RlCisgICAgLy8vIGRlc2NyaWJpbmcgdGhlIGZhaWx1cmUgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgICAgdmlydHVhbCBzdGQ6OmVycm9yX2NvZGUgcHJvdGVjdE1hcHBlZE1lbW9yeShjb25zdCBzeXM6Ok1lbW9yeUJsb2NrICZCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzKSA9IDA7CisKKyAgICAvLy8gVGhpcyBtZXRob2QgcmVsZWFzZXMgYSBibG9jayBvZiBtZW1vcnkgdGhhdCB3YXMgYWxsb2NhdGVkIHdpdGggdGhlCisgICAgLy8vIGFsbG9jYXRlTWFwcGVkTWVtb3J5IG1ldGhvZC4gSXQgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIHJlbGVhc2UgYW55IG1lbW9yeQorICAgIC8vLyBibG9jayBhbGxvY2F0ZWQgYW55IG90aGVyIHdheS4KKyAgICAvLy8gXHAgQmxvY2sgZGVzY3JpYmVzIHRoZSBtZW1vcnkgdG8gYmUgcmVsZWFzZWQuCisgICAgLy8vCisgICAgLy8vIFxyIGVycm9yX3N1Y2Nlc3MgaWYgdGhlIGZ1bmN0aW9uIHdhcyBzdWNjZXNzZnVsLCBvciBhbiBlcnJvcl9jb2RlCisgICAgLy8vIGRlc2NyaWJpbmcgdGhlIGZhaWx1cmUgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgICAgdmlydHVhbCBzdGQ6OmVycm9yX2NvZGUgcmVsZWFzZU1hcHBlZE1lbW9yeShzeXM6Ok1lbW9yeUJsb2NrICZNKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5NZW1vcnlNYXBwZXIoKTsKKyAgfTsKKworICAvLy8gQ3JlYXRlcyBhIFNlY3Rpb25NZW1vcnlNYW5hZ2VyIGluc3RhbmNlIHdpdGggXHAgTU0gYXMgdGhlIGFzc29jaWF0ZWQKKyAgLy8vIG1lbW9yeSBtYXBwZXIuICBJZiBccCBNTSBpcyBudWxscHRyIHRoZW4gYSBkZWZhdWx0IG1lbW9yeSBtYXBwZXIgaXMgdXNlZAorICAvLy8gdGhhdCBkaXJlY3RseSBjYWxscyBpbnRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtLgorICBTZWN0aW9uTWVtb3J5TWFuYWdlcihNZW1vcnlNYXBwZXIgKk1NID0gbnVsbHB0cik7CisgIFNlY3Rpb25NZW1vcnlNYW5hZ2VyKGNvbnN0IFNlY3Rpb25NZW1vcnlNYW5hZ2VyICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBTZWN0aW9uTWVtb3J5TWFuYWdlciAmKSA9IGRlbGV0ZTsKKyAgflNlY3Rpb25NZW1vcnlNYW5hZ2VyKCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBBbGxvY2F0ZXMgYSBtZW1vcnkgYmxvY2sgb2YgKGF0IGxlYXN0KSB0aGUgZ2l2ZW4gc2l6ZSBzdWl0YWJsZSBmb3IKKyAgLy8vIGV4ZWN1dGFibGUgY29kZS4KKyAgLy8vCisgIC8vLyBUaGUgdmFsdWUgb2YgXHAgQWxpZ25tZW50IG11c3QgYmUgYSBwb3dlciBvZiB0d28uICBJZiBccCBBbGlnbm1lbnQgaXMgemVybworICAvLy8gYSBkZWZhdWx0IGFsaWdubWVudCBvZiAxNiB3aWxsIGJlIHVzZWQuCisgIHVpbnQ4X3QgKmFsbG9jYXRlQ29kZVNlY3Rpb24odWludHB0cl90IFNpemUsIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTZWN0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNlY3Rpb25OYW1lKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIEFsbG9jYXRlcyBhIG1lbW9yeSBibG9jayBvZiAoYXQgbGVhc3QpIHRoZSBnaXZlbiBzaXplIHN1aXRhYmxlIGZvcgorICAvLy8gZXhlY3V0YWJsZSBjb2RlLgorICAvLy8KKyAgLy8vIFRoZSB2YWx1ZSBvZiBccCBBbGlnbm1lbnQgbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4gIElmIFxwIEFsaWdubWVudCBpcyB6ZXJvCisgIC8vLyBhIGRlZmF1bHQgYWxpZ25tZW50IG9mIDE2IHdpbGwgYmUgdXNlZC4KKyAgdWludDhfdCAqYWxsb2NhdGVEYXRhU2VjdGlvbih1aW50cHRyX3QgU2l6ZSwgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNlY3Rpb25JRCwgU3RyaW5nUmVmIFNlY3Rpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNSZWFkT25seSkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBVcGRhdGUgc2VjdGlvbi1zcGVjaWZpYyBtZW1vcnkgcGVybWlzc2lvbnMgYW5kIG90aGVyIGF0dHJpYnV0ZXMuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gb2JqZWN0IGxvYWRpbmcgaXMgY29tcGxldGUgYW5kIHNlY3Rpb24gcGFnZQorICAvLy8gcGVybWlzc2lvbnMgY2FuIGJlIGFwcGxpZWQuICBJdCBpcyB1cCB0byB0aGUgbWVtb3J5IG1hbmFnZXIgaW1wbGVtZW50YXRpb24KKyAgLy8vIHRvIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCB0byBhY3Qgb24gdGhpcyBtZXRob2QuICBUaGUgbWVtb3J5IG1hbmFnZXIgd2lsbAorICAvLy8gdHlwaWNhbGx5IGFsbG9jYXRlIGFsbCBzZWN0aW9ucyBhcyByZWFkLXdyaXRlIGFuZCB0aGVuIGFwcGx5IHNwZWNpZmljCisgIC8vLyBwZXJtaXNzaW9ucyB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4gIENvZGUgc2VjdGlvbnMgY2Fubm90IGJlIGV4ZWN1dGVkCisgIC8vLyB1bnRpbCB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZC4gIEluIGFkZGl0aW9uLCBhbnkgY2FjaGUgY29oZXJlbmN5CisgIC8vLyBvcGVyYXRpb25zIG5lZWRlZCB0byByZWxpYWJseSB1c2UgdGhlIG1lbW9yeSBhcmUgYWxzbyBwZXJmb3JtZWQuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGZpbmFsaXplTWVtb3J5KHN0ZDo6c3RyaW5nICpFcnJNc2cgPSBudWxscHRyKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIEludmFsaWRhdGUgaW5zdHJ1Y3Rpb24gY2FjaGUgZm9yIGNvZGUgc2VjdGlvbnMuCisgIC8vLworICAvLy8gU29tZSBwbGF0Zm9ybXMgd2l0aCBzZXBhcmF0ZSBkYXRhIGNhY2hlIGFuZCBpbnN0cnVjdGlvbiBjYWNoZSByZXF1aXJlCisgIC8vLyBleHBsaWNpdCBjYWNoZSBmbHVzaCwgb3RoZXJ3aXNlIEpJVCBjb2RlIG1hbmlwdWxhdGlvbnMgKGxpa2UgcmVzb2x2ZWQKKyAgLy8vIHJlbG9jYXRpb25zKSB3aWxsIGdldCB0byB0aGUgZGF0YSBjYWNoZSBidXQgbm90IHRvIHRoZSBpbnN0cnVjdGlvbiBjYWNoZS4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSBmaW5hbGl6ZU1lbW9yeS4KKyAgdmlydHVhbCB2b2lkIGludmFsaWRhdGVJbnN0cnVjdGlvbkNhY2hlKCk7CisKK3ByaXZhdGU6CisgIHN0cnVjdCBGcmVlTWVtQmxvY2sgeworICAgIC8vIFRoZSBhY3R1YWwgYmxvY2sgb2YgZnJlZSBtZW1vcnkKKyAgICBzeXM6Ok1lbW9yeUJsb2NrIEZyZWU7CisgICAgLy8gSWYgdGhlcmUgaXMgYSBwZW5kaW5nIGFsbG9jYXRpb24gZnJvbSB0aGUgc2FtZSByZXNlcnZhdGlvbiByaWdodCBiZWZvcmUKKyAgICAvLyB0aGlzIGJsb2NrLCBzdG9yZSBpdCdzIGluZGV4IGluIFBlbmRpbmdNZW0sIHRvIGJlIGFibGUgdG8gdXBkYXRlIHRoZQorICAgIC8vIHBlbmRpbmcgcmVnaW9uIGlmIHBhcnQgb2YgdGhpcyBibG9jayBpcyBhbGxvY2F0ZWQsIHJhdGhlciB0aGFuIGhhdmluZyB0bworICAgIC8vIGNyZWF0ZSBhIG5ldyBvbmUKKyAgICB1bnNpZ25lZCBQZW5kaW5nUHJlZml4SW5kZXg7CisgIH07CisKKyAgc3RydWN0IE1lbW9yeUdyb3VwIHsKKyAgICAvLyBQZW5kaW5nTWVtIGNvbnRhaW5zIGFsbCBibG9ja3Mgb2YgbWVtb3J5IChzdWJibG9ja3Mgb2YgQWxsb2NhdGVkTWVtKQorICAgIC8vIHdoaWNoIGhhdmUgbm90IHlldCBoYWQgdGhlaXIgcGVybWlzc2lvbnMgYXBwbGllZCwgYnV0IGhhdmUgYmVlbiBnaXZlbgorICAgIC8vIG91dCB0byB0aGUgdXNlci4gRnJlZU1lbSBjb250YWlucyBhbGwgYmxvY2sgb2YgbWVtb3J5LCB3aGljaCBoYXZlCisgICAgLy8gbmVpdGhlciBoYWQgdGhlaXIgcGVybWlzc2lvbnMgYXBwbGllZCwgbm9yIGJlZW4gZ2l2ZW4gb3V0IHRvIHRoZSB1c2VyLgorICAgIFNtYWxsVmVjdG9yPHN5czo6TWVtb3J5QmxvY2ssIDE2PiBQZW5kaW5nTWVtOworICAgIFNtYWxsVmVjdG9yPEZyZWVNZW1CbG9jaywgMTY+IEZyZWVNZW07CisKKyAgICAvLyBBbGwgbWVtb3J5IGJsb2NrcyB0aGF0IGhhdmUgYmVlbiByZXF1ZXN0ZWQgZnJvbSB0aGUgc3lzdGVtCisgICAgU21hbGxWZWN0b3I8c3lzOjpNZW1vcnlCbG9jaywgMTY+IEFsbG9jYXRlZE1lbTsKKworICAgIHN5czo6TWVtb3J5QmxvY2sgTmVhcjsKKyAgfTsKKworICB1aW50OF90ICphbGxvY2F0ZVNlY3Rpb24oQWxsb2NhdGlvblB1cnBvc2UgUHVycG9zZSwgdWludHB0cl90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQpOworCisgIHN0ZDo6ZXJyb3JfY29kZSBhcHBseU1lbW9yeUdyb3VwUGVybWlzc2lvbnMoTWVtb3J5R3JvdXAgJk1lbUdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBlcm1pc3Npb25zKTsKKworICBNZW1vcnlHcm91cCBDb2RlTWVtOworICBNZW1vcnlHcm91cCBSV0RhdGFNZW07CisgIE1lbW9yeUdyb3VwIFJPRGF0YU1lbTsKKyAgTWVtb3J5TWFwcGVyICZNTWFwcGVyOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9OX0VOR0lORV9TRUNUSU9OX01FTU9SWV9NQU5BR0VSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRnV6ek11dGF0ZS9GdXp6ZXJDTEkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRnV6ek11dGF0ZS9GdXp6ZXJDTEkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzMzZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9GdXp6TXV0YXRlL0Z1enplckNMSS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8vPT09LS0gRnV6emVyQ0xJLmggLSBDb21tb24gbG9naWMgZm9yIENMSXMgb2YgZnV6emVycyAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ29tbW9uIGxvZ2ljIG5lZWRlZCB0byBpbXBsZW1lbnQgTExWTSdzIGZ1enogdGFyZ2V0cycgQ0xJcyAtIGluY2x1ZGluZyBMTFZNCisvLyBjb25jZXB0cyBsaWtlIGNsOjpvcHQgYW5kIGxpYkZ1enplciBjb25jZXB0cyBsaWtlIC1pZ25vcmVfcmVtYWluaW5nX2FyZ3M9MS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRlVaWk1VVEFURV9GVVpaRVJfQ0xJX0gKKyNkZWZpbmUgTExWTV9GVVpaTVVUQVRFX0ZVWlpFUl9DTElfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gUGFyc2UgY2w6Om9wdHMgZnJvbSBhIGZ1enogdGFyZ2V0IGNvbW1hbmRsaW5lLgorLy8vCisvLy8gVGhpcyBoYW5kbGVzIGFsbCBhcmd1bWVudHMgYWZ0ZXIgLWlnbm9yZV9yZW1haW5pbmdfYXJncz0xIGFzIGNsOjpvcHRzLgordm9pZCBwYXJzZUZ1enplckNMT3B0cyhpbnQgQXJnQywgY2hhciAqQXJnVltdKTsKKworLy8vIEhhbmRsZSBiYWNrZW5kIG9wdGlvbnMgdGhhdCBhcmUgZW5jb2RlZCBpbiB0aGUgZXhlY3V0YWJsZSBuYW1lLgorLy8vCisvLy8gUGFyc2VzIHNvbWUgY29tbW9uIGJhY2tlbmQgb3B0aW9ucyBvdXQgb2YgYSBzcGVjaWFsbHkgY3JhZnRlZCBleGVjdXRhYmxlCisvLy8gbmFtZSAoYXJndlswXSkuIEZvciBleGFtcGxlLCBhIG5hbWUgbGlrZSBsbHZtLWZvby1mdXp6ZXItLWFhcmNoNjQtZ2lzZWwKKy8vLyBtaWdodCBzZXQgdXAgYW4gQUFyY2g2NCB0cmlwbGUgYW5kIHRoZSBHbG9iYWwgSVNlbCBzZWxlY3Rvci4gVGhpcyBzaG91bGQgYmUKKy8vLyBjYWxsZWQgKmJlZm9yZSogcGFyc2VGdXp6ZXJDTE9wdHMgaWYgY2FsbGluZyBib3RoLgorLy8vCisvLy8gVGhpcyBpcyBtZWFudCB0byBiZSB1c2VkIGZvciBlbnZpcm9ubWVudHMgbGlrZSBPU1MtRnV6eiB0aGF0IGFyZW4ndCBjYXBhYmxlCisvLy8gb2YgcGFzc2luZyBpbiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGluIHRoZSBub3JtYWwgd2F5Lgordm9pZCBoYW5kbGVFeGVjTmFtZUVuY29kZWRCRU9wdHMoU3RyaW5nUmVmIEV4ZWNOYW1lKTsKKworLy8vIEhhbmRsZSBvcHRpbWl6ZXIgb3B0aW9ucyB3aGljaCBhcmUgZW5jb2RlZCBpbiB0aGUgZXhlY3V0YWJsZSBuYW1lLgorLy8vIFNhbWUgc2VtYW50aWNzIGFzIGluICdoYW5kbGVFeGVjTmFtZUVuY29kZWRCRU9wdHMnLgordm9pZCBoYW5kbGVFeGVjTmFtZUVuY29kZWRPcHRpbWl6ZXJPcHRzKFN0cmluZ1JlZiBFeGVjTmFtZSk7CisKK3VzaW5nIEZ1enplclRlc3RGdW4gPSBpbnQgKCopKGNvbnN0IHVpbnQ4X3QgKkRhdGEsIHNpemVfdCBTaXplKTsKK3VzaW5nIEZ1enplckluaXRGdW4gPSBpbnQgKCopKGludCAqYXJnYywgY2hhciAqKiphcmd2KTsKKworLy8vIFJ1bnMgYSBmdXp6IHRhcmdldCBvbiB0aGUgaW5wdXRzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorLy8vCisvLy8gVXNlZnVsIGZvciB0ZXN0aW5nIGZ1enogdGFyZ2V0cyB3aXRob3V0IGxpbmtpbmcgdG8gbGliRnV6emVyLiBGaW5kcyBpbnB1dHMKKy8vLyBpbiB0aGUgYXJndW1lbnQgbGlzdCBpbiBhIGxpYkZ1enplciBjb21wYXRpYmxlIHdheS4KK2ludCBydW5GdXp6ZXJPbklucHV0cyhpbnQgQXJnQywgY2hhciAqQXJnVltdLCBGdXp6ZXJUZXN0RnVuIFRlc3RPbmUsCisgICAgICAgICAgICAgICAgICAgICAgRnV6emVySW5pdEZ1biBJbml0ID0gW10oaW50ICosIGNoYXIgKioqKSB7IHJldHVybiAwOyB9KTsKKworLy8vIEZ1enplciBmcmllbmRseSBpbnRlcmZhY2UgZm9yIHRoZSBsbHZtIGJpdGNvZGUgcGFyc2VyLgorLy8vCisvLy8gXHBhcmFtIERhdGEgQml0Y29kZSB3ZSBhcmUgZ29pbmcgdG8gcGFyc2UKKy8vLyBccGFyYW0gU2l6ZSBTaXplIG9mIHRoZSAnRGF0YScgaW4gYnl0ZXMKKy8vLyBccmV0dXJuIE5ldyBtb2R1bGUgb3IgbnVsbHB0ciBpbiBjYXNlIG9mIGVycm9yCitzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBwYXJzZU1vZHVsZShjb25zdCB1aW50OF90ICpEYXRhLCBzaXplX3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDb250ZXh0KTsKKworLy8vIEZ1enplciBmcmllbmRseSBpbnRlcmZhY2UgZm9yIHRoZSBsbHZtIGJpdGNvZGUgcHJpbnRlci4KKy8vLworLy8vIFxwYXJhbSBNIE1vZHVsZSB0byBwcmludAorLy8vIFxwYXJhbSBEZXN0IExvY2F0aW9uIHRvIHN0b3JlIHNlcmlhbGl6ZWQgbW9kdWxlCisvLy8gXHBhcmFtIE1heFNpemUgU2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisvLy8gXHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIHdyaXR0ZW4uIFdoZW4gbW9kdWxlIHNpemUgZXhjZWVkcyBNYXhTaXplCisvLy8gICAgICAgICByZXR1cm5zIDAgYW5kIGxlYXZlcyBEZXN0IHVuY2hhbmdlZC4KK3NpemVfdCB3cml0ZU1vZHVsZShjb25zdCBNb2R1bGUgJk0sIHVpbnQ4X3QgKkRlc3QsIHNpemVfdCBNYXhTaXplKTsKKworLy8vIFRyeSB0byBwYXJzZSBtb2R1bGUgYW5kIHZlcmlmeSBpdC4gTWF5IG91dHB1dCB2ZXJpZmljYXRpb24gZXJyb3JzIHRvIHRoZQorLy8vIGVycnMoKS4KKy8vLyBccmV0dXJuIE5ldyBtb2R1bGUgb3IgbnVsbHB0ciBpbiBjYXNlIG9mIGVycm9yLgorc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gcGFyc2VBbmRWZXJpZnkoY29uc3QgdWludDhfdCAqRGF0YSwgc2l6ZV90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQ29udGV4dCAmQ29udGV4dCk7CisKK30gLy8gZW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBMTFZNX0ZVWlpNVVRBVEVfRlVaWkVSX0NMSV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0Z1enpNdXRhdGUvSVJNdXRhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0Z1enpNdXRhdGUvSVJNdXRhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFhOWQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRnV6ek11dGF0ZS9JUk11dGF0b3IuaApAQCAtMCwwICsxLDEwOCBAQAorLy89PT0tLSBJUk11dGF0b3IuaCAtIE11dGF0aW9uIGVuZ2luZSBmb3IgZnV6emluZyBJUiAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBQcm92aWRlcyB0aGUgSVJNdXRhdG9yIGNsYXNzLCB3aGljaCBkcml2ZXMgbXV0YXRpb25zIG9uIElSIGJhc2VkIG9uIGEKKy8vIGNvbmZpZ3VyYWJsZSBzZXQgb2Ygc3RyYXRlZ2llcy4gU29tZSBjb21tb24gc3RyYXRlZ2llcyBhcmUgYWxzbyBpbmNsdWRlZAorLy8gaGVyZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRlVaWk1VVEFURV9JUk1VVEFUT1JfSAorI2RlZmluZSBMTFZNX0ZVWlpNVVRBVEVfSVJNVVRBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9GdXp6TXV0YXRlL09wRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTW9kdWxlOworCitzdHJ1Y3QgUmFuZG9tSVJCdWlsZGVyOworCisvLy8gQmFzZSBjbGFzcyBmb3IgZGVzY3JpYmluZyBob3cgdG8gbXV0YXRlIGEgbW9kdWxlLiBtdXRhdGlvbiBmdW5jdGlvbnMgZm9yCisvLy8gZWFjaCBJUiB1bml0IGZvcndhcmQgdG8gdGhlIGNvbnRhaW5lZCB1bml0LgorY2xhc3MgSVJNdXRhdGlvblN0cmF0ZWd5IHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+SVJNdXRhdGlvblN0cmF0ZWd5KCkgPSBkZWZhdWx0OworCisgIC8vLyBQcm92aWRlIGEgd2VpZ2h0IHRvIGJpYXMgdG93YXJkcyBjaG9vc2luZyB0aGlzIHN0cmF0ZWd5IGZvciBhIG11dGF0aW9uLgorICAvLy8KKyAgLy8vIFRoZSB2YWx1ZSBvZiB0aGUgd2VpZ2h0IGlzIGFyYml0cmFyeSwgYnV0IGEgZ29vZCBkZWZhdWx0IGlzICJ0aGUgbnVtYmVyIG9mCisgIC8vLyBkaXN0aW5jdCB3YXlzIGluIHdoaWNoIHRoaXMgc3RyYXRlZ3kgY2FuIG11dGF0ZSBhIHVuaXQiLiBUaGlzIGNhbiBhbHNvIGJlCisgIC8vLyB1c2VkIHRvIHByZWZlciBzdHJhdGVnaWVzIHRoYXQgc2hyaW5rIHRoZSBvdmVyYWxsIHNpemUgb2YgdGhlIHJlc3VsdCB3aGVuCisgIC8vLyB3ZSBzdGFydCBnZXR0aW5nIGNsb3NlIHRvIFxjIE1heFNpemUuCisgIHZpcnR1YWwgdWludDY0X3QgZ2V0V2VpZ2h0KHNpemVfdCBDdXJyZW50U2l6ZSwgc2l6ZV90IE1heFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEN1cnJlbnRXZWlnaHQpID0gMDsKKworICAvLy8gQHsKKyAgLy8vIE11dGF0b3JzIGZvciBlYWNoIElSIHVuaXQuIEJ5IGRlZmF1bHQgdGhlc2UgZm9yd2FyZCB0byBhIGNvbnRhaW5lZAorICAvLy8gaW5zdGFuY2Ugb2YgdGhlIG5leHQgc21hbGxlciB1bml0LgorICB2aXJ0dWFsIHZvaWQgbXV0YXRlKE1vZHVsZSAmTSwgUmFuZG9tSVJCdWlsZGVyICZJQik7CisgIHZpcnR1YWwgdm9pZCBtdXRhdGUoRnVuY3Rpb24gJkYsIFJhbmRvbUlSQnVpbGRlciAmSUIpOworICB2aXJ0dWFsIHZvaWQgbXV0YXRlKEJhc2ljQmxvY2sgJkJCLCBSYW5kb21JUkJ1aWxkZXIgJklCKTsKKyAgdmlydHVhbCB2b2lkIG11dGF0ZShJbnN0cnVjdGlvbiAmSSwgUmFuZG9tSVJCdWlsZGVyICZJQikgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlN0cmF0ZWd5IGRvZXMgbm90IGltcGxlbWVudCBhbnkgbXV0YXRvcnMiKTsKKyAgfQorICAvLy8gQH0KK307CisKK3VzaW5nIFR5cGVHZXR0ZXIgPSBzdGQ6OmZ1bmN0aW9uPFR5cGUgKihMTFZNQ29udGV4dCAmKT47CisKKy8vLyBFbnRyeSBwb2ludCBmb3IgY29uZmlndXJpbmcgYW5kIHJ1bm5pbmcgSVIgbXV0YXRpb25zLgorY2xhc3MgSVJNdXRhdG9yIHsKKyAgc3RkOjp2ZWN0b3I8VHlwZUdldHRlcj4gQWxsb3dlZFR5cGVzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8SVJNdXRhdGlvblN0cmF0ZWd5Pj4gU3RyYXRlZ2llczsKKworcHVibGljOgorICBJUk11dGF0b3Ioc3RkOjp2ZWN0b3I8VHlwZUdldHRlcj4gJiZBbGxvd2VkVHlwZXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8SVJNdXRhdGlvblN0cmF0ZWd5Pj4gJiZTdHJhdGVnaWVzKQorICAgICAgOiBBbGxvd2VkVHlwZXMoc3RkOjptb3ZlKEFsbG93ZWRUeXBlcykpLAorICAgICAgICBTdHJhdGVnaWVzKHN0ZDo6bW92ZShTdHJhdGVnaWVzKSkge30KKworICB2b2lkIG11dGF0ZU1vZHVsZShNb2R1bGUgJk0sIGludCBTZWVkLCBzaXplX3QgQ3VyU2l6ZSwgc2l6ZV90IE1heFNpemUpOworfTsKKworLy8vIFN0cmF0ZWd5IHRoYXQgaW5qZWN0cyBvcGVyYXRpb25zIGludG8gdGhlIGZ1bmN0aW9uLgorY2xhc3MgSW5qZWN0b3JJUlN0cmF0ZWd5IDogcHVibGljIElSTXV0YXRpb25TdHJhdGVneSB7CisgIHN0ZDo6dmVjdG9yPGZ1enplcm9wOjpPcERlc2NyaXB0b3I+IE9wZXJhdGlvbnM7CisKKyAgT3B0aW9uYWw8ZnV6emVyb3A6Ok9wRGVzY3JpcHRvcj4gY2hvb3NlT3BlcmF0aW9uKFZhbHVlICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYW5kb21JUkJ1aWxkZXIgJklCKTsKKworcHVibGljOgorICBJbmplY3RvcklSU3RyYXRlZ3koc3RkOjp2ZWN0b3I8ZnV6emVyb3A6Ok9wRGVzY3JpcHRvcj4gJiZPcGVyYXRpb25zKQorICAgICAgOiBPcGVyYXRpb25zKHN0ZDo6bW92ZShPcGVyYXRpb25zKSkge30KKyAgc3RhdGljIHN0ZDo6dmVjdG9yPGZ1enplcm9wOjpPcERlc2NyaXB0b3I+IGdldERlZmF1bHRPcHMoKTsKKworICB1aW50NjRfdCBnZXRXZWlnaHQoc2l6ZV90IEN1cnJlbnRTaXplLCBzaXplX3QgTWF4U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEN1cnJlbnRXZWlnaHQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gT3BlcmF0aW9ucy5zaXplKCk7CisgIH0KKworICB1c2luZyBJUk11dGF0aW9uU3RyYXRlZ3k6Om11dGF0ZTsKKyAgdm9pZCBtdXRhdGUoRnVuY3Rpb24gJkYsIFJhbmRvbUlSQnVpbGRlciAmSUIpIG92ZXJyaWRlOworICB2b2lkIG11dGF0ZShCYXNpY0Jsb2NrICZCQiwgUmFuZG9tSVJCdWlsZGVyICZJQikgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBJbnN0RGVsZXRlcklSU3RyYXRlZ3kgOiBwdWJsaWMgSVJNdXRhdGlvblN0cmF0ZWd5IHsKK3B1YmxpYzoKKyAgdWludDY0X3QgZ2V0V2VpZ2h0KHNpemVfdCBDdXJyZW50U2l6ZSwgc2l6ZV90IE1heFNpemUsCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBDdXJyZW50V2VpZ2h0KSBvdmVycmlkZTsKKworICB1c2luZyBJUk11dGF0aW9uU3RyYXRlZ3k6Om11dGF0ZTsKKyAgdm9pZCBtdXRhdGUoRnVuY3Rpb24gJkYsIFJhbmRvbUlSQnVpbGRlciAmSUIpIG92ZXJyaWRlOworICB2b2lkIG11dGF0ZShJbnN0cnVjdGlvbiAmSW5zdCwgUmFuZG9tSVJCdWlsZGVyICZJQikgb3ZlcnJpZGU7Cit9OworCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gTExWTV9GVVpaTVVUQVRFX0lSTVVUQVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0Z1enpNdXRhdGUvT3BEZXNjcmlwdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0Z1enpNdXRhdGUvT3BEZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzMGZkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRnV6ek11dGF0ZS9PcERlc2NyaXB0b3IuaApAQCAtMCwwICsxLDIyMyBAQAorLy89PT0tLSBPcERlc2NyaXB0b3IuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBQcm92aWRlcyB0aGUgZnV6emVyb3A6OkRlc2NyaXB0b3IgY2xhc3MgYW5kIHJlbGF0ZWQgdG9vbHMgZm9yIGRlc2NyaWJpbmcKKy8vIG9wZXJhdGlvbnMgYW4gSVIgZnV6emVyIGNhbiB3b3JrIHdpdGguCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0ZVWlpNVVRBVEVfT1BERVNDUklQVE9SX0gKKyNkZWZpbmUgTExWTV9GVVpaTVVUQVRFX09QREVTQ1JJUFRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBmdXp6ZXJvcCB7CisKKy8vLyBAeworLy8vIFBvcHVsYXRlIGEgc21hbGwgbGlzdCBvZiBwb3RlbnRpYWxseSBpbnRlcmVzdGluZyBjb25zdGFudHMgb2YgYSBnaXZlbiB0eXBlLgordm9pZCBtYWtlQ29uc3RhbnRzV2l0aFR5cGUoVHlwZSAqVCwgc3RkOjp2ZWN0b3I8Q29uc3RhbnQgKj4gJkNzKTsKK3N0ZDo6dmVjdG9yPENvbnN0YW50ICo+IG1ha2VDb25zdGFudHNXaXRoVHlwZShUeXBlICpUKTsKKy8vLyBAfQorCisvLy8gQSBtYXRjaGVyL2dlbmVyYXRvciBmb3IgZmluZGluZyBzdWl0YWJsZSB2YWx1ZXMgZm9yIHRoZSBuZXh0IHNvdXJjZSBpbiBhbgorLy8vIG9wZXJhdGlvbidzIHBhcnRpYWxseSBjb21wbGV0ZWQgYXJndW1lbnQgbGlzdC4KKy8vLworLy8vIEdpdmVuIHRoYXQgd2UncmUgYnVpbGRpbmcgc29tZSBvcGVyYXRpb24gWCBhbmQgbWF5IGhhdmUgYWxyZWFkeSBmaWxsZWQgc29tZQorLy8vIHN1YnNldCBvZiBpdHMgb3BlcmFuZHMsIHRoaXMgcHJlZGljYXRlIGRldGVybWluZXMgaWYgc29tZSB2YWx1ZSBOZXcgaXMKKy8vLyBzdWl0YWJsZSBmb3IgdGhlIG5leHQgb3BlcmFuZCBvciBnZW5lcmF0ZXMgYSBzZXQgb2YgdmFsdWVzIHRoYXQgYXJlCisvLy8gc3VpdGFibGUuCitjbGFzcyBTb3VyY2VQcmVkIHsKK3B1YmxpYzoKKyAgLy8vIEdpdmVuIGEgbGlzdCBvZiBhbHJlYWR5IHNlbGVjdGVkIG9wZXJhbmRzLCByZXR1cm5zIHdoZXRoZXIgYSBnaXZlbiBuZXcKKyAgLy8vIG9wZXJhbmQgaXMgc3VpdGFibGUgZm9yIHRoZSBuZXh0IG9wZXJhbmQuCisgIHVzaW5nIFByZWRUID0gc3RkOjpmdW5jdGlvbjxib29sKEFycmF5UmVmPFZhbHVlICo+IEN1ciwgY29uc3QgVmFsdWUgKk5ldyk+OworICAvLy8gR2l2ZW4gYSBsaXN0IG9mIGFscmVhZHkgc2VsZWN0ZWQgb3BlcmFuZHMgYW5kIGEgc2V0IG9mIHZhbGlkIGJhc2UgdHlwZXMKKyAgLy8vIGZvciBhIGZ1enplciwgZ2VuZXJhdGVzIGEgbGlzdCBvZiBjb25zdGFudHMgdGhhdCBjb3VsZCBiZSB1c2VkIGZvciB0aGUKKyAgLy8vIG5leHQgb3BlcmFuZC4KKyAgdXNpbmcgTWFrZVQgPSBzdGQ6OmZ1bmN0aW9uPHN0ZDo6dmVjdG9yPENvbnN0YW50ICo+KAorICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gQ3VyLCBBcnJheVJlZjxUeXBlICo+IEJhc2VUeXBlcyk+OworCitwcml2YXRlOgorICBQcmVkVCBQcmVkOworICBNYWtlVCBNYWtlOworCitwdWJsaWM6CisgIC8vLyBDcmVhdGUgYSBmdWxseSBnZW5lcmFsIHNvdXJjZSBwcmVkaWNhdGUuCisgIFNvdXJjZVByZWQoUHJlZFQgUHJlZCwgTWFrZVQgTWFrZSkgOiBQcmVkKFByZWQpLCBNYWtlKE1ha2UpIHt9CisgIFNvdXJjZVByZWQoUHJlZFQgUHJlZCwgTm9uZVR5cGUpIDogUHJlZChQcmVkKSB7CisgICAgTWFrZSA9IFtQcmVkXShBcnJheVJlZjxWYWx1ZSAqPiBDdXIsIEFycmF5UmVmPFR5cGUgKj4gQmFzZVR5cGVzKSB7CisgICAgICAvLyBEZWZhdWx0IGZpbHRlciBqdXN0IGNhbGxzIFByZWQgb24gZWFjaCBvZiB0aGUgYmFzZSB0eXBlcy4KKyAgICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50ICo+IFJlc3VsdDsKKyAgICAgIGZvciAoVHlwZSAqVCA6IEJhc2VUeXBlcykgeworICAgICAgICBDb25zdGFudCAqViA9IFVuZGVmVmFsdWU6OmdldChUKTsKKyAgICAgICAgaWYgKFByZWQoQ3VyLCBWKSkKKyAgICAgICAgICBtYWtlQ29uc3RhbnRzV2l0aFR5cGUoVCwgUmVzdWx0KTsKKyAgICAgIH0KKyAgICAgIGlmIChSZXN1bHQuZW1wdHkoKSkKKyAgICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJQcmVkaWNhdGUgZG9lcyBub3QgbWF0Y2ggZm9yIGJhc2UgdHlwZXMiKTsKKyAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgXGMgTmV3IGlzIGNvbXBhdGlibGUgZm9yIHRoZSBhcmd1bWVudCBhZnRlciBcYyBDdXIKKyAgYm9vbCBtYXRjaGVzKEFycmF5UmVmPFZhbHVlICo+IEN1ciwgY29uc3QgVmFsdWUgKk5ldykgeworICAgIHJldHVybiBQcmVkKEN1ciwgTmV3KTsKKyAgfQorCisgIC8vLyBHZW5lcmF0ZXMgYSBsaXN0IG9mIHBvdGVudGlhbCB2YWx1ZXMgZm9yIHRoZSBhcmd1bWVudCBhZnRlciBcYyBDdXIuCisgIHN0ZDo6dmVjdG9yPENvbnN0YW50ICo+IGdlbmVyYXRlKEFycmF5UmVmPFZhbHVlICo+IEN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZSAqPiBCYXNlVHlwZXMpIHsKKyAgICByZXR1cm4gTWFrZShDdXIsIEJhc2VUeXBlcyk7CisgIH0KK307CisKKy8vLyBBIGRlc2NyaXB0aW9uIG9mIHNvbWUgb3BlcmF0aW9uIHdlIGNhbiBidWlsZCB3aGlsZSBmdXp6aW5nIElSLgorc3RydWN0IE9wRGVzY3JpcHRvciB7CisgIHVuc2lnbmVkIFdlaWdodDsKKyAgU21hbGxWZWN0b3I8U291cmNlUHJlZCwgMj4gU291cmNlUHJlZHM7CisgIHN0ZDo6ZnVuY3Rpb248VmFsdWUgKihBcnJheVJlZjxWYWx1ZSAqPiwgSW5zdHJ1Y3Rpb24gKik+IEJ1aWxkZXJGdW5jOworfTsKKworc3RhdGljIGlubGluZSBTb3VyY2VQcmVkIG9ubHlUeXBlKFR5cGUgKk9ubHkpIHsKKyAgYXV0byBQcmVkID0gW09ubHldKEFycmF5UmVmPFZhbHVlICo+LCBjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRUeXBlKCkgPT0gT25seTsKKyAgfTsKKyAgYXV0byBNYWtlID0gW09ubHldKEFycmF5UmVmPFZhbHVlICo+LCBBcnJheVJlZjxUeXBlICo+KSB7CisgICAgcmV0dXJuIG1ha2VDb25zdGFudHNXaXRoVHlwZShPbmx5KTsKKyAgfTsKKyAgcmV0dXJuIHtQcmVkLCBNYWtlfTsKK30KKworc3RhdGljIGlubGluZSBTb3VyY2VQcmVkIGFueVR5cGUoKSB7CisgIGF1dG8gUHJlZCA9IFtdKEFycmF5UmVmPFZhbHVlICo+LCBjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiAhVi0+Z2V0VHlwZSgpLT5pc1ZvaWRUeSgpOworICB9OworICBhdXRvIE1ha2UgPSBOb25lOworICByZXR1cm4ge1ByZWQsIE1ha2V9OworfQorCitzdGF0aWMgaW5saW5lIFNvdXJjZVByZWQgYW55SW50VHlwZSgpIHsKKyAgYXV0byBQcmVkID0gW10oQXJyYXlSZWY8VmFsdWUgKj4sIGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFR5cGUoKS0+aXNJbnRlZ2VyVHkoKTsKKyAgfTsKKyAgYXV0byBNYWtlID0gTm9uZTsKKyAgcmV0dXJuIHtQcmVkLCBNYWtlfTsKK30KKworc3RhdGljIGlubGluZSBTb3VyY2VQcmVkIGFueUZsb2F0VHlwZSgpIHsKKyAgYXV0byBQcmVkID0gW10oQXJyYXlSZWY8VmFsdWUgKj4sIGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFR5cGUoKS0+aXNGbG9hdGluZ1BvaW50VHkoKTsKKyAgfTsKKyAgYXV0byBNYWtlID0gTm9uZTsKKyAgcmV0dXJuIHtQcmVkLCBNYWtlfTsKK30KKworc3RhdGljIGlubGluZSBTb3VyY2VQcmVkIGFueVB0clR5cGUoKSB7CisgIGF1dG8gUHJlZCA9IFtdKEFycmF5UmVmPFZhbHVlICo+LCBjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCkgJiYgIVYtPmlzU3dpZnRFcnJvcigpOworICB9OworICBhdXRvIE1ha2UgPSBbXShBcnJheVJlZjxWYWx1ZSAqPiwgQXJyYXlSZWY8VHlwZSAqPiBUcykgeworICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50ICo+IFJlc3VsdDsKKyAgICAvLyBUT0RPOiBTaG91bGQgdGhlc2UgcG9pbnQgYXQgc29tZXRoaW5nPworICAgIGZvciAoVHlwZSAqVCA6IFRzKQorICAgICAgUmVzdWx0LnB1c2hfYmFjayhVbmRlZlZhbHVlOjpnZXQoUG9pbnRlclR5cGU6OmdldFVucXVhbChUKSkpOworICAgIHJldHVybiBSZXN1bHQ7CisgIH07CisgIHJldHVybiB7UHJlZCwgTWFrZX07Cit9CisKK3N0YXRpYyBpbmxpbmUgU291cmNlUHJlZCBzaXplZFB0clR5cGUoKSB7CisgIGF1dG8gUHJlZCA9IFtdKEFycmF5UmVmPFZhbHVlICo+LCBjb25zdCBWYWx1ZSAqVikgeworICAgIGlmIChWLT5pc1N3aWZ0RXJyb3IoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChjb25zdCBhdXRvICpQdHJUID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KFYtPmdldFR5cGUoKSkpCisgICAgICByZXR1cm4gUHRyVC0+Z2V0RWxlbWVudFR5cGUoKS0+aXNTaXplZCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfTsKKyAgYXV0byBNYWtlID0gW10oQXJyYXlSZWY8VmFsdWUgKj4sIEFycmF5UmVmPFR5cGUgKj4gVHMpIHsKKyAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCAqPiBSZXN1bHQ7CisKKyAgICBmb3IgKFR5cGUgKlQgOiBUcykKKyAgICAgIGlmIChULT5pc1NpemVkKCkpCisgICAgICAgIFJlc3VsdC5wdXNoX2JhY2soVW5kZWZWYWx1ZTo6Z2V0KFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVCkpKTsKKworICAgIHJldHVybiBSZXN1bHQ7CisgIH07CisgIHJldHVybiB7UHJlZCwgTWFrZX07Cit9CisKK3N0YXRpYyBpbmxpbmUgU291cmNlUHJlZCBhbnlBZ2dyZWdhdGVUeXBlKCkgeworICBhdXRvIFByZWQgPSBbXShBcnJheVJlZjxWYWx1ZSAqPiwgY29uc3QgVmFsdWUgKlYpIHsKKyAgICAvLyBXZSBjYW4ndCBpbmRleCB6ZXJvIHNpemVkIGFycmF5cy4KKyAgICBpZiAoaXNhPEFycmF5VHlwZT4oVi0+Z2V0VHlwZSgpKSkKKyAgICAgIHJldHVybiBWLT5nZXRUeXBlKCktPmdldEFycmF5TnVtRWxlbWVudHMoKSA+IDA7CisKKyAgICAvLyBTdHJ1Y3RzIGNhbiBhbHNvIGJlIHplcm8gc2l6ZWQuIEkuZSBvcGFxdWUgdHlwZXMuCisgICAgaWYgKGlzYTxTdHJ1Y3RUeXBlPihWLT5nZXRUeXBlKCkpKQorICAgICAgcmV0dXJuIFYtPmdldFR5cGUoKS0+Z2V0U3RydWN0TnVtRWxlbWVudHMoKSA+IDA7CisKKyAgICByZXR1cm4gVi0+Z2V0VHlwZSgpLT5pc0FnZ3JlZ2F0ZVR5cGUoKTsKKyAgfTsKKyAgLy8gVE9ETzogRm9yIG5vdyB3ZSBvbmx5IGZpbmQgYWdncmVnYXRlcyBpbiBCYXNlVHlwZXMuIEl0IG1pZ2h0IGJlIGJldHRlciB0bworICAvLyBtYW51ZmFjdHVyZSB0aGVtIG91dCBvZiB0aGUgYmFzZSB0eXBlcyBpbiBzb21lIGNhc2VzLgorICBhdXRvIEZpbmQgPSBOb25lOworICByZXR1cm4ge1ByZWQsIEZpbmR9OworfQorCitzdGF0aWMgaW5saW5lIFNvdXJjZVByZWQgYW55VmVjdG9yVHlwZSgpIHsKKyAgYXV0byBQcmVkID0gW10oQXJyYXlSZWY8VmFsdWUgKj4sIGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpOworICB9OworICAvLyBUT0RPOiBGb3Igbm93IHdlIG9ubHkgZmluZCB2ZWN0b3JzIGluIEJhc2VUeXBlcy4gSXQgbWlnaHQgYmUgYmV0dGVyIHRvCisgIC8vIG1hbnVmYWN0dXJlIHZlY3RvcnMgb3V0IG9mIHRoZSBiYXNlIHR5cGVzLCBidXQgaXQncyB0cmlja3kgdG8gYmUgc3VyZQorICAvLyB0aGF0J3MgYWN0dWFsbHkgYSByZWFzb25hYmxlIHR5cGUuCisgIGF1dG8gTWFrZSA9IE5vbmU7CisgIHJldHVybiB7UHJlZCwgTWFrZX07Cit9CisKKy8vLyBNYXRjaCB2YWx1ZXMgdGhhdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGZpcnN0IHNvdXJjZS4KK3N0YXRpYyBpbmxpbmUgU291cmNlUHJlZCBtYXRjaEZpcnN0VHlwZSgpIHsKKyAgYXV0byBQcmVkID0gW10oQXJyYXlSZWY8VmFsdWUgKj4gQ3VyLCBjb25zdCBWYWx1ZSAqVikgeworICAgIGFzc2VydCghQ3VyLmVtcHR5KCkgJiYgIk5vIGZpcnN0IHNvdXJjZSB5ZXQiKTsKKyAgICByZXR1cm4gVi0+Z2V0VHlwZSgpID09IEN1clswXS0+Z2V0VHlwZSgpOworICB9OworICBhdXRvIE1ha2UgPSBbXShBcnJheVJlZjxWYWx1ZSAqPiBDdXIsIEFycmF5UmVmPFR5cGUgKj4pIHsKKyAgICBhc3NlcnQoIUN1ci5lbXB0eSgpICYmICJObyBmaXJzdCBzb3VyY2UgeWV0Iik7CisgICAgcmV0dXJuIG1ha2VDb25zdGFudHNXaXRoVHlwZShDdXJbMF0tPmdldFR5cGUoKSk7CisgIH07CisgIHJldHVybiB7UHJlZCwgTWFrZX07Cit9CisKKy8vLyBNYXRjaCB2YWx1ZXMgdGhhdCBoYXZlIHRoZSBmaXJzdCBzb3VyY2UncyBzY2FsYXIgdHlwZS4KK3N0YXRpYyBpbmxpbmUgU291cmNlUHJlZCBtYXRjaFNjYWxhck9mRmlyc3RUeXBlKCkgeworICBhdXRvIFByZWQgPSBbXShBcnJheVJlZjxWYWx1ZSAqPiBDdXIsIGNvbnN0IFZhbHVlICpWKSB7CisgICAgYXNzZXJ0KCFDdXIuZW1wdHkoKSAmJiAiTm8gZmlyc3Qgc291cmNlIHlldCIpOworICAgIHJldHVybiBWLT5nZXRUeXBlKCkgPT0gQ3VyWzBdLT5nZXRUeXBlKCktPmdldFNjYWxhclR5cGUoKTsKKyAgfTsKKyAgYXV0byBNYWtlID0gW10oQXJyYXlSZWY8VmFsdWUgKj4gQ3VyLCBBcnJheVJlZjxUeXBlICo+KSB7CisgICAgYXNzZXJ0KCFDdXIuZW1wdHkoKSAmJiAiTm8gZmlyc3Qgc291cmNlIHlldCIpOworICAgIHJldHVybiBtYWtlQ29uc3RhbnRzV2l0aFR5cGUoQ3VyWzBdLT5nZXRUeXBlKCktPmdldFNjYWxhclR5cGUoKSk7CisgIH07CisgIHJldHVybiB7UHJlZCwgTWFrZX07Cit9CisKK30gLy8gZW5kIGZ1enplcm9wIG5hbWVzcGFjZQorfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmIC8vIExMVk1fRlVaWk1VVEFURV9PUERFU0NSSVBUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9GdXp6TXV0YXRlL09wZXJhdGlvbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRnV6ek11dGF0ZS9PcGVyYXRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4YmQ5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRnV6ek11dGF0ZS9PcGVyYXRpb25zLmgKQEAgLTAsMCArMSw1NCBAQAorLy89PT0tLSBPcGVyYXRpb25zLmggLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gSW1wbGVtZW50YXRpb25zIG9mIGNvbW1vbiBmdXp6ZXIgb3BlcmF0aW9uIGRlc2NyaXB0b3JzIGZvciBidWlsZGluZyBhbiBJUgorLy8gbXV0YXRvci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRlVaWk1VVEFURV9PUEVSQVRJT05TX0gKKyNkZWZpbmUgTExWTV9GVVpaTVVUQVRFX09QRVJBVElPTlNfSAorCisjaW5jbHVkZSAibGx2bS9GdXp6TXV0YXRlL09wRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gR2V0dGVycyBmb3IgdGhlIGRlZmF1bHQgc2V0cyBvZiBvcGVyYXRpb25zLCBwZXIgZ2VuZXJhbCBjYXRlZ29yeS4KKy8vLyBAewordm9pZCBkZXNjcmliZUZ1enplckludE9wcyhzdGQ6OnZlY3RvcjxmdXp6ZXJvcDo6T3BEZXNjcmlwdG9yPiAmT3BzKTsKK3ZvaWQgZGVzY3JpYmVGdXp6ZXJGbG9hdE9wcyhzdGQ6OnZlY3RvcjxmdXp6ZXJvcDo6T3BEZXNjcmlwdG9yPiAmT3BzKTsKK3ZvaWQgZGVzY3JpYmVGdXp6ZXJDb250cm9sRmxvd09wcyhzdGQ6OnZlY3RvcjxmdXp6ZXJvcDo6T3BEZXNjcmlwdG9yPiAmT3BzKTsKK3ZvaWQgZGVzY3JpYmVGdXp6ZXJQb2ludGVyT3BzKHN0ZDo6dmVjdG9yPGZ1enplcm9wOjpPcERlc2NyaXB0b3I+ICZPcHMpOwordm9pZCBkZXNjcmliZUZ1enplckFnZ3JlZ2F0ZU9wcyhzdGQ6OnZlY3RvcjxmdXp6ZXJvcDo6T3BEZXNjcmlwdG9yPiAmT3BzKTsKK3ZvaWQgZGVzY3JpYmVGdXp6ZXJWZWN0b3JPcHMoc3RkOjp2ZWN0b3I8ZnV6emVyb3A6Ok9wRGVzY3JpcHRvcj4gJk9wcyk7CisvLy8gQH0KKworbmFtZXNwYWNlIGZ1enplcm9wIHsKKworLy8vIERlc2NyaXB0b3JzIGZvciBpbmRpdmlkdWFsIG9wZXJhdGlvbnMuCisvLy8gQHsKK09wRGVzY3JpcHRvciBiaW5PcERlc2NyaXB0b3IodW5zaWduZWQgV2VpZ2h0LCBJbnN0cnVjdGlvbjo6QmluYXJ5T3BzIE9wKTsKK09wRGVzY3JpcHRvciBjbXBPcERlc2NyaXB0b3IodW5zaWduZWQgV2VpZ2h0LCBJbnN0cnVjdGlvbjo6T3RoZXJPcHMgQ21wT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3Q6OlByZWRpY2F0ZSBQcmVkKTsKK09wRGVzY3JpcHRvciBzcGxpdEJsb2NrRGVzY3JpcHRvcih1bnNpZ25lZCBXZWlnaHQpOworT3BEZXNjcmlwdG9yIGdlcERlc2NyaXB0b3IodW5zaWduZWQgV2VpZ2h0KTsKK09wRGVzY3JpcHRvciBleHRyYWN0VmFsdWVEZXNjcmlwdG9yKHVuc2lnbmVkIFdlaWdodCk7CitPcERlc2NyaXB0b3IgaW5zZXJ0VmFsdWVEZXNjcmlwdG9yKHVuc2lnbmVkIFdlaWdodCk7CitPcERlc2NyaXB0b3IgZXh0cmFjdEVsZW1lbnREZXNjcmlwdG9yKHVuc2lnbmVkIFdlaWdodCk7CitPcERlc2NyaXB0b3IgaW5zZXJ0RWxlbWVudERlc2NyaXB0b3IodW5zaWduZWQgV2VpZ2h0KTsKK09wRGVzY3JpcHRvciBzaHVmZmxlVmVjdG9yRGVzY3JpcHRvcih1bnNpZ25lZCBXZWlnaHQpOworLy8vIEB9CisKK30gLy8gZW5kIGZ1enplcm9wIG5hbWVzcGFjZQorCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gTExWTV9GVVpaTVVUQVRFX09QRVJBVElPTlNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9GdXp6TXV0YXRlL1JhbmRvbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9GdXp6TXV0YXRlL1JhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNWY0NmEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0Z1enpNdXRhdGUvUmFuZG9tLmgKQEAgLTAsMCArMSw5NyBAQAorLy89PT0tLS0gUmFuZG9tLmggLSBVdGlsaXRpZXMgZm9yIHJhbmRvbSBzYW1wbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBVdGlsaXRpZXMgZm9yIHJhbmRvbSBzYW1wbGluZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRlVaWk1VVEFURV9SQU5ET01fSAorI2RlZmluZSBMTFZNX0ZVWlpNVVRBVEVfUkFORE9NX0gKKworI2luY2x1ZGUgPHJhbmRvbT4KKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFJldHVybiBhIHVuaWZvcm1seSBkaXN0cmlidXRlZCByYW5kb20gdmFsdWUgYmV0d2VlbiBcYyBNaW4gYW5kIFxjIE1heAordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEdlblQ+IFQgdW5pZm9ybShHZW5UICZHZW4sIFQgTWluLCBUIE1heCkgeworICByZXR1cm4gc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248VD4oTWluLCBNYXgpKEdlbik7Cit9CisKKy8vLyBSZXR1cm4gYSB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgcmFuZG9tIHZhbHVlIG9mIHR5cGUgXGMgVAordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEdlblQ+IFQgdW5pZm9ybShHZW5UICZHZW4pIHsKKyAgcmV0dXJuIHVuaWZvcm08VD4oR2VuLCBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCkpOworfQorCisvLy8gUmFuZG9tbHkgc2VsZWN0cyBhbiBpdGVtIGJ5IHNhbXBsaW5nIGludG8gYSBzZXQgd2l0aCBhbiB1bmtub3duIG51bWJlciBvZgorLy8vIGVsZW1lbnRzLCB3aGljaCBtYXkgZWFjaCBiZSB3ZWlnaHRlZCB0byBiZSBtb3JlIGxpa2VseSBjaG9pY2VzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEdlblQ+IGNsYXNzIFJlc2Vydm9pclNhbXBsZXIgeworICBHZW5UICZSYW5kR2VuOworICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDxUPjo6dHlwZSBTZWxlY3Rpb24gPSB7fTsKKyAgdWludDY0X3QgVG90YWxXZWlnaHQgPSAwOworCitwdWJsaWM6CisgIFJlc2Vydm9pclNhbXBsZXIoR2VuVCAmUmFuZEdlbikgOiBSYW5kR2VuKFJhbmRHZW4pIHt9CisKKyAgdWludDY0X3QgdG90YWxXZWlnaHQoKSBjb25zdCB7IHJldHVybiBUb3RhbFdlaWdodDsgfQorICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBUb3RhbFdlaWdodCA9PSAwOyB9CisKKyAgY29uc3QgVCAmZ2V0U2VsZWN0aW9uKCkgY29uc3QgeworICAgIGFzc2VydCghaXNFbXB0eSgpICYmICJOb3RoaW5nIHNlbGVjdGVkIik7CisgICAgcmV0dXJuIFNlbGVjdGlvbjsKKyAgfQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAhaXNFbXB0eSgpO30KKyAgY29uc3QgVCAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gZ2V0U2VsZWN0aW9uKCk7IH0KKworICAvLy8gU2FtcGxlIGVhY2ggaXRlbSBpbiBcYyBJdGVtcyB3aXRoIHVuaXQgd2VpZ2h0CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSYW5nZVQ+IFJlc2Vydm9pclNhbXBsZXIgJnNhbXBsZShSYW5nZVQgJiZJdGVtcykgeworICAgIGZvciAoYXV0byAmSSA6IEl0ZW1zKQorICAgICAgc2FtcGxlKEksIDEpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBTYW1wbGUgYSBzaW5nbGUgaXRlbSB3aXRoIHRoZSBnaXZlbiB3ZWlnaHQuCisgIFJlc2Vydm9pclNhbXBsZXIgJnNhbXBsZShjb25zdCBUICZJdGVtLCB1aW50NjRfdCBXZWlnaHQpIHsKKyAgICBpZiAoIVdlaWdodCkKKyAgICAgIC8vIElmIHRoZSB3ZWlnaHQgaXMgemVybywgZG8gbm90aGluZy4KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICBUb3RhbFdlaWdodCArPSBXZWlnaHQ7CisgICAgLy8gQ29uc2lkZXIgc3dpdGNoaW5nIGZyb20gdGhlIGN1cnJlbnQgZWxlbWVudCB0byB0aGlzIG9uZS4KKyAgICBpZiAodW5pZm9ybTx1aW50NjRfdD4oUmFuZEdlbiwgMSwgVG90YWxXZWlnaHQpIDw9IFdlaWdodCkKKyAgICAgIFNlbGVjdGlvbiA9IEl0ZW07CisgICAgcmV0dXJuICp0aGlzOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuVCwgdHlwZW5hbWUgUmFuZ2VULAorICAgICAgICAgIHR5cGVuYW1lIEVsVCA9IHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTwKKyAgICAgICAgICAgICAgZGVjbHR5cGUoKnN0ZDo6YmVnaW4oc3RkOjpkZWNsdmFsPFJhbmdlVD4oKSkpPjo6dHlwZT4KK1Jlc2Vydm9pclNhbXBsZXI8RWxULCBHZW5UPiBtYWtlU2FtcGxlcihHZW5UICZSYW5kR2VuLCBSYW5nZVQgJiZJdGVtcykgeworICBSZXNlcnZvaXJTYW1wbGVyPEVsVCwgR2VuVD4gUlMoUmFuZEdlbik7CisgIFJTLnNhbXBsZShJdGVtcyk7CisgIHJldHVybiBSUzsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlblQsIHR5cGVuYW1lIFQ+CitSZXNlcnZvaXJTYW1wbGVyPFQsIEdlblQ+IG1ha2VTYW1wbGVyKEdlblQgJlJhbmRHZW4sIGNvbnN0IFQgJkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFdlaWdodCkgeworICBSZXNlcnZvaXJTYW1wbGVyPFQsIEdlblQ+IFJTKFJhbmRHZW4pOworICBSUy5zYW1wbGUoSXRlbSwgV2VpZ2h0KTsKKyAgcmV0dXJuIFJTOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgR2VuVD4KK1Jlc2Vydm9pclNhbXBsZXI8VCwgR2VuVD4gbWFrZVNhbXBsZXIoR2VuVCAmUmFuZEdlbikgeworICByZXR1cm4gUmVzZXJ2b2lyU2FtcGxlcjxULCBHZW5UPihSYW5kR2VuKTsKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmIC8vIExMVk1fRlVaWk1VVEFURV9SQU5ET01fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9GdXp6TXV0YXRlL1JhbmRvbUlSQnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9GdXp6TXV0YXRlL1JhbmRvbUlSQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZjNmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0Z1enpNdXRhdGUvUmFuZG9tSVJCdWlsZGVyLmgKQEAgLTAsMCArMSw2MiBAQAorLy89PT0tLSBNdXRhdG9yLmggLSBVdGlscyBmb3IgcmFuZG9tbHkgbXV0YXRpb24gSVIgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBQcm92aWRlcyB0aGUgTXV0YXRvciBjbGFzcywgd2hpY2ggaXMgdXNlZCB0byBtdXRhdGUgSVIgZm9yIGZ1enppbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0ZVWlpNVVRBVEVfUkFORE9NSVJCVUlMREVSX0gKKyNkZWZpbmUgTExWTV9GVVpaTVVUQVRFX1JBTkRPTUlSQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vRnV6ek11dGF0ZS9JUk11dGF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0Z1enpNdXRhdGUvUmFuZG9tLmgiCisjaW5jbHVkZSA8cmFuZG9tPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3VzaW5nIFJhbmRvbUVuZ2luZSA9IHN0ZDo6bXQxOTkzNzsKKworc3RydWN0IFJhbmRvbUlSQnVpbGRlciB7CisgIFJhbmRvbUVuZ2luZSBSYW5kOworICBTbWFsbFZlY3RvcjxUeXBlICosIDE2PiBLbm93blR5cGVzOworCisgIFJhbmRvbUlSQnVpbGRlcihpbnQgU2VlZCwgQXJyYXlSZWY8VHlwZSAqPiBBbGxvd2VkVHlwZXMpCisgICAgICA6IFJhbmQoU2VlZCksIEtub3duVHlwZXMoQWxsb3dlZFR5cGVzLmJlZ2luKCksIEFsbG93ZWRUeXBlcy5lbmQoKSkge30KKworICAvLyBUT0RPOiBUcnkgdG8gbWFrZSB0aGlzIGEgYml0IGxlc3Mgb2YgYSByYW5kb20gbWlzaG1hc2ggb2YgZnVuY3Rpb25zLgorCisgIC8vLyBGaW5kIGEgInNvdXJjZSIgZm9yIHNvbWUgb3BlcmF0aW9uLCB3aGljaCB3aWxsIGJlIHVzZWQgaW4gb25lIG9mIHRoZQorICAvLy8gb3BlcmF0aW9uJ3Mgb3BlcmFuZHMuIFRoaXMgZWl0aGVyIHNlbGVjdHMgYW4gaW5zdHJ1Y3Rpb24gaW4gXGMgSW5zdHMgb3IKKyAgLy8vIHJldHVybnMgc29tZSBuZXcgYXJiaXRyYXJ5IFZhbHVlLgorICBWYWx1ZSAqZmluZE9yQ3JlYXRlU291cmNlKEJhc2ljQmxvY2sgJkJCLCBBcnJheVJlZjxJbnN0cnVjdGlvbiAqPiBJbnN0cyk7CisgIC8vLyBGaW5kIGEgInNvdXJjZSIgZm9yIHNvbWUgb3BlcmF0aW9uLCB3aGljaCB3aWxsIGJlIHVzZWQgaW4gb25lIG9mIHRoZQorICAvLy8gb3BlcmF0aW9uJ3Mgb3BlcmFuZHMuIFRoaXMgZWl0aGVyIHNlbGVjdHMgYW4gaW5zdHJ1Y3Rpb24gaW4gXGMgSW5zdHMgdGhhdAorICAvLy8gbWF0Y2hlcyBcYyBQcmVkLCBvciByZXR1cm5zIHNvbWUgbmV3IFZhbHVlIHRoYXQgbWF0Y2hlcyBcYyBQcmVkLiBUaGUKKyAgLy8vIHZhbHVlcyBpbiBcYyBTcmNzIHNob3VsZCBiZSBzb3VyY2Ugb3BlcmFuZHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbgorICAvLy8gc2VsZWN0ZWQuCisgIFZhbHVlICpmaW5kT3JDcmVhdGVTb3VyY2UoQmFzaWNCbG9jayAmQkIsIEFycmF5UmVmPEluc3RydWN0aW9uICo+IEluc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IFNyY3MsIGZ1enplcm9wOjpTb3VyY2VQcmVkIFByZWQpOworICAvLy8gQ3JlYXRlIHNvbWUgVmFsdWUgc3VpdGFibGUgYXMgYSBzb3VyY2UgZm9yIHNvbWUgb3BlcmF0aW9uLgorICBWYWx1ZSAqbmV3U291cmNlKEJhc2ljQmxvY2sgJkJCLCBBcnJheVJlZjxJbnN0cnVjdGlvbiAqPiBJbnN0cywKKyAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBTcmNzLCBmdXp6ZXJvcDo6U291cmNlUHJlZCBQcmVkKTsKKyAgLy8vIEZpbmQgYSB2aWFibGUgdXNlciBmb3IgXGMgViBpbiBcYyBJbnN0cywgd2hpY2ggc2hvdWxkIGFsbCBiZSBjb250YWluZWQgaW4KKyAgLy8vIFxjIEJCLiBUaGlzIG1heSBhbHNvIGNyZWF0ZSBzb21lIG5ldyBpbnN0cnVjdGlvbiBpbiBcYyBCQiBhbmQgdXNlIHRoYXQuCisgIHZvaWQgY29ubmVjdFRvU2luayhCYXNpY0Jsb2NrICZCQiwgQXJyYXlSZWY8SW5zdHJ1Y3Rpb24gKj4gSW5zdHMsIFZhbHVlICpWKTsKKyAgLy8vIENyZWF0ZSBhIHVzZXIgZm9yIFxjIFYgaW4gXGMgQkIuCisgIHZvaWQgbmV3U2luayhCYXNpY0Jsb2NrICZCQiwgQXJyYXlSZWY8SW5zdHJ1Y3Rpb24gKj4gSW5zdHMsIFZhbHVlICpWKTsKKyAgVmFsdWUgKmZpbmRQb2ludGVyKEJhc2ljQmxvY2sgJkJCLCBBcnJheVJlZjxJbnN0cnVjdGlvbiAqPiBJbnN0cywKKyAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IFNyY3MsIGZ1enplcm9wOjpTb3VyY2VQcmVkIFByZWQpOworICBUeXBlICpjaG9vc2VUeXBlKExMVk1Db250ZXh0ICZDb250ZXh0LCBBcnJheVJlZjxWYWx1ZSAqPiBTcmNzLAorICAgICAgICAgICAgICAgICAgIGZ1enplcm9wOjpTb3VyY2VQcmVkIFByZWQpOworfTsKKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmIC8vIExMVk1fRlVaWk1VVEFURV9SQU5ET01JUkJVSUxERVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Bcmd1bWVudC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Bcmd1bWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5N2RjYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0FyZ3VtZW50LmgKQEAgLTAsMCArMSwxMzAgQEAKKy8vPT09LS0gbGx2bS9Bcmd1bWVudC5oIC0gRGVmaW5pdGlvbiBvZiB0aGUgQXJndW1lbnQgY2xhc3MgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBBcmd1bWVudCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfQVJHVU1FTlRfSAorI2RlZmluZSBMTFZNX0lSX0FSR1VNRU5UX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGluY29taW5nIGZvcm1hbCBhcmd1bWVudCB0byBhIEZ1bmN0aW9uLiBBIGZvcm1hbAorLy8vIGFyZ3VtZW50LCBzaW5jZSBpdCBpcyBgYGZvcm1hbCcnLCBkb2VzIG5vdCBjb250YWluIGFuIGFjdHVhbCB2YWx1ZSBidXQKKy8vLyBpbnN0ZWFkIHJlcHJlc2VudHMgdGhlIHR5cGUsIGFyZ3VtZW50IG51bWJlciwgYW5kIGF0dHJpYnV0ZXMgb2YgYW4gYXJndW1lbnQKKy8vLyBmb3IgYSBzcGVjaWZpYyBmdW5jdGlvbi4gV2hlbiB1c2VkIGluIHRoZSBib2R5IG9mIHNhaWQgZnVuY3Rpb24sIHRoZQorLy8vIGFyZ3VtZW50IG9mIGNvdXJzZSByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZiB0aGUgYWN0dWFsIGFyZ3VtZW50IHRoYXQgdGhlCisvLy8gZnVuY3Rpb24gd2FzIGNhbGxlZCB3aXRoLgorY2xhc3MgQXJndW1lbnQgZmluYWwgOiBwdWJsaWMgVmFsdWUgeworICBGdW5jdGlvbiAqUGFyZW50OworICB1bnNpZ25lZCBBcmdObzsKKworICBmcmllbmQgY2xhc3MgRnVuY3Rpb247CisgIHZvaWQgc2V0UGFyZW50KEZ1bmN0aW9uICpwYXJlbnQpOworCitwdWJsaWM6CisgIC8vLyBBcmd1bWVudCBjb25zdHJ1Y3Rvci4KKyAgZXhwbGljaXQgQXJndW1lbnQoVHlwZSAqVHksIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsIEZ1bmN0aW9uICpGID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXJnTm8gPSAwKTsKKworICBpbmxpbmUgY29uc3QgRnVuY3Rpb24gKmdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIFBhcmVudDsgfQorICBpbmxpbmUgICAgICAgRnVuY3Rpb24gKmdldFBhcmVudCgpICAgICAgIHsgcmV0dXJuIFBhcmVudDsgfQorCisgIC8vLyBSZXR1cm4gdGhlIGluZGV4IG9mIHRoaXMgZm9ybWFsIGFyZ3VtZW50IGluIGl0cyBjb250YWluaW5nIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlIGluICJ2b2lkIGZvbyhpbnQgYSwgZmxvYXQgYikiIGEgaXMgMCBhbmQgYiBpcyAxLgorICB1bnNpZ25lZCBnZXRBcmdObygpIGNvbnN0IHsKKyAgICBhc3NlcnQoUGFyZW50ICYmICJjYW4ndCBnZXQgbnVtYmVyIG9mIHVucGFyZW50ZWQgYXJnIik7CisgICAgcmV0dXJuIEFyZ05vOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYXJndW1lbnQgaGFzIHRoZSBub25udWxsIGF0dHJpYnV0ZS4gQWxzbyByZXR1cm5zIHRydWUKKyAgLy8vIGlmIGF0IGxlYXN0IG9uZSBieXRlIGlzIGtub3duIHRvIGJlIGRlcmVmZXJlbmNlYWJsZSBhbmQgdGhlIHBvaW50ZXIgaXMgaW4KKyAgLy8vIGFkZHJzcGFjZSgwKS4KKyAgYm9vbCBoYXNOb25OdWxsQXR0cigpIGNvbnN0OworCisgIC8vLyBJZiB0aGlzIGFyZ3VtZW50IGhhcyB0aGUgZGVyZWZlcmVuY2VhYmxlIGF0dHJpYnV0ZSwgcmV0dXJuIHRoZSBudW1iZXIgb2YKKyAgLy8vIGJ5dGVzIGtub3duIHRvIGJlIGRlcmVmZXJlbmNlYWJsZS4gT3RoZXJ3aXNlLCB6ZXJvIGlzIHJldHVybmVkLgorICB1aW50NjRfdCBnZXREZXJlZmVyZW5jZWFibGVCeXRlcygpIGNvbnN0OworCisgIC8vLyBJZiB0aGlzIGFyZ3VtZW50IGhhcyB0aGUgZGVyZWZlcmVuY2VhYmxlX29yX251bGwgYXR0cmlidXRlLCByZXR1cm4gdGhlCisgIC8vLyBudW1iZXIgb2YgYnl0ZXMga25vd24gdG8gYmUgZGVyZWZlcmVuY2VhYmxlLiBPdGhlcndpc2UsIHplcm8gaXMgcmV0dXJuZWQuCisgIHVpbnQ2NF90IGdldERlcmVmZXJlbmNlYWJsZU9yTnVsbEJ5dGVzKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYXJndW1lbnQgaGFzIHRoZSBieXZhbCBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzQnlWYWxBdHRyKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYXJndW1lbnQgaGFzIHRoZSBzd2lmdHNlbGYgYXR0cmlidXRlLgorICBib29sIGhhc1N3aWZ0U2VsZkF0dHIoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBhcmd1bWVudCBoYXMgdGhlIHN3aWZ0ZXJyb3IgYXR0cmlidXRlLgorICBib29sIGhhc1N3aWZ0RXJyb3JBdHRyKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYXJndW1lbnQgaGFzIHRoZSBieXZhbCBhdHRyaWJ1dGUgb3IgaW5hbGxvY2EKKyAgLy8vIGF0dHJpYnV0ZS4gVGhlc2UgYXR0cmlidXRlcyByZXByZXNlbnQgYXJndW1lbnRzIGJlaW5nIHBhc3NlZCBieSB2YWx1ZS4KKyAgYm9vbCBoYXNCeVZhbE9ySW5BbGxvY2FBdHRyKCkgY29uc3Q7CisKKyAgLy8vIElmIHRoaXMgaXMgYSBieXZhbCBvciBpbmFsbG9jYSBhcmd1bWVudCwgcmV0dXJuIGl0cyBhbGlnbm1lbnQuCisgIHVuc2lnbmVkIGdldFBhcmFtQWxpZ25tZW50KCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYXJndW1lbnQgaGFzIHRoZSBuZXN0IGF0dHJpYnV0ZS4KKyAgYm9vbCBoYXNOZXN0QXR0cigpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFyZ3VtZW50IGhhcyB0aGUgbm9hbGlhcyBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzTm9BbGlhc0F0dHIoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBhcmd1bWVudCBoYXMgdGhlIG5vY2FwdHVyZSBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzTm9DYXB0dXJlQXR0cigpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFyZ3VtZW50IGhhcyB0aGUgc3JldCBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzU3RydWN0UmV0QXR0cigpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFyZ3VtZW50IGhhcyB0aGUgcmV0dXJuZWQgYXR0cmlidXRlLgorICBib29sIGhhc1JldHVybmVkQXR0cigpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFyZ3VtZW50IGhhcyB0aGUgcmVhZG9ubHkgb3IgcmVhZG5vbmUgYXR0cmlidXRlLgorICBib29sIG9ubHlSZWFkc01lbW9yeSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFyZ3VtZW50IGhhcyB0aGUgaW5hbGxvY2EgYXR0cmlidXRlLgorICBib29sIGhhc0luQWxsb2NhQXR0cigpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFyZ3VtZW50IGhhcyB0aGUgemV4dCBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzWkV4dEF0dHIoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBhcmd1bWVudCBoYXMgdGhlIHNleHQgYXR0cmlidXRlLgorICBib29sIGhhc1NFeHRBdHRyKCkgY29uc3Q7CisKKyAgLy8vIEFkZCBhdHRyaWJ1dGVzIHRvIGFuIGFyZ3VtZW50LgorICB2b2lkIGFkZEF0dHJzKEF0dHJCdWlsZGVyICZCKTsKKworICB2b2lkIGFkZEF0dHIoQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKTsKKworICB2b2lkIGFkZEF0dHIoQXR0cmlidXRlIEF0dHIpOworCisgIC8vLyBSZW1vdmUgYXR0cmlidXRlcyBmcm9tIGFuIGFyZ3VtZW50LgorICB2b2lkIHJlbW92ZUF0dHIoQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKTsKKworICAvLy8gQ2hlY2sgaWYgYW4gYXJndW1lbnQgaGFzIGEgZ2l2ZW4gYXR0cmlidXRlLgorICBib29sIGhhc0F0dHJpYnV0ZShBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0OworCisgIC8vLyBNZXRob2QgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3QuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IEFyZ3VtZW50VmFsOworICB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQXNzZW1ibHlBbm5vdGF0aW9uV3JpdGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0Fzc2VtYmx5QW5ub3RhdGlvbldyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMWY1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0Fzc2VtYmx5QW5ub3RhdGlvbldyaXRlci5oCkBAIC0wLDAgKzEsNjIgQEAKKy8vPT09LS0gQXNzZW1ibHlBbm5vdGF0aW9uV3JpdGVyLmggLSBBbm5vdGF0aW9uIC5sbCBmaWxlcyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ2xpZW50cyBvZiB0aGUgYXNzZW1ibHkgd3JpdGVyIGNhbiB1c2UgdGhpcyBpbnRlcmZhY2UgdG8gYWRkIHRoZWlyIG93bgorLy8gc3BlY2lhbC1wdXJwb3NlIGFubm90YXRpb25zIHRvIExMVk0gYXNzZW1ibHkgbGFuZ3VhZ2UgcHJpbnRvdXRzLiAgTm90ZSB0aGF0CisvLyB0aGUgYXNzZW1ibHkgcGFyc2VyIHdvbid0IGJlIGFibGUgdG8gcGFyc2UgdGhlc2UsIGluIGdlbmVyYWwsIHNvCisvLyBpbXBsZW1lbnRhdGlvbnMgYXJlIGFkdmlzZWQgdG8gcHJpbnQgc3R1ZmYgYXMgTExWTSBjb21tZW50cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfQVNTRU1CTFlBTk5PVEFUSU9OV1JJVEVSX0gKKyNkZWZpbmUgTExWTV9JUl9BU1NFTUJMWUFOTk9UQVRJT05XUklURVJfSAorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgVmFsdWU7CitjbGFzcyBmb3JtYXR0ZWRfcmF3X29zdHJlYW07CisKK2NsYXNzIEFzc2VtYmx5QW5ub3RhdGlvbldyaXRlciB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkFzc2VtYmx5QW5ub3RhdGlvbldyaXRlcigpOworCisgIC8vLyBlbWl0RnVuY3Rpb25Bbm5vdCAtIFRoaXMgbWF5IGJlIGltcGxlbWVudGVkIHRvIGVtaXQgYSBzdHJpbmcgcmlnaHQgYmVmb3JlCisgIC8vLyB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbi4KKyAgdmlydHVhbCB2b2lkIGVtaXRGdW5jdGlvbkFubm90KGNvbnN0IEZ1bmN0aW9uICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJikge30KKworICAvLy8gZW1pdEJhc2ljQmxvY2tTdGFydEFubm90IC0gVGhpcyBtYXkgYmUgaW1wbGVtZW50ZWQgdG8gZW1pdCBhIHN0cmluZyByaWdodAorICAvLy8gYWZ0ZXIgdGhlIGJhc2ljIGJsb2NrIGxhYmVsLCBidXQgYmVmb3JlIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpbiB0aGUKKyAgLy8vIGJsb2NrLgorICB2aXJ0dWFsIHZvaWQgZW1pdEJhc2ljQmxvY2tTdGFydEFubm90KGNvbnN0IEJhc2ljQmxvY2sgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJikgeworICB9CisKKyAgLy8vIGVtaXRCYXNpY0Jsb2NrRW5kQW5ub3QgLSBUaGlzIG1heSBiZSBpbXBsZW1lbnRlZCB0byBlbWl0IGEgc3RyaW5nIHJpZ2h0CisgIC8vLyBhZnRlciB0aGUgYmFzaWMgYmxvY2suCisgIHZpcnR1YWwgdm9pZCBlbWl0QmFzaWNCbG9ja0VuZEFubm90KGNvbnN0IEJhc2ljQmxvY2sgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkX3Jhd19vc3RyZWFtICYpIHsKKyAgfQorCisgIC8vLyBlbWl0SW5zdHJ1Y3Rpb25Bbm5vdCAtIFRoaXMgbWF5IGJlIGltcGxlbWVudGVkIHRvIGVtaXQgYSBzdHJpbmcgcmlnaHQKKyAgLy8vIGJlZm9yZSBhbiBpbnN0cnVjdGlvbiBpcyBlbWl0dGVkLgorICB2aXJ0dWFsIHZvaWQgZW1pdEluc3RydWN0aW9uQW5ub3QoY29uc3QgSW5zdHJ1Y3Rpb24gKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAmKSB7fQorCisgIC8vLyBwcmludEluZm9Db21tZW50IC0gVGhpcyBtYXkgYmUgaW1wbGVtZW50ZWQgdG8gZW1pdCBhIGNvbW1lbnQgdG8gdGhlCisgIC8vLyByaWdodCBvZiBhbiBpbnN0cnVjdGlvbiBvciBnbG9iYWwgdmFsdWUuCisgIHZpcnR1YWwgdm9pZCBwcmludEluZm9Db21tZW50KGNvbnN0IFZhbHVlICYsIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAmKSB7fQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0F0dHJpYnV0ZXMuZ2VuIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9BdHRyaWJ1dGVzLmdlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWZiODA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9BdHRyaWJ1dGVzLmdlbgpAQCAtMCwwICsxLDUwMiBAQAorI2lmZGVmIEdFVF9BVFRSX0VOVU0KKyN1bmRlZiBHRVRfQVRUUl9FTlVNCitBbGlnbm1lbnQsCitBbGxvY1NpemUsCitBbHdheXNJbmxpbmUsCitBcmdNZW1Pbmx5LAorQnVpbHRpbiwKK0J5VmFsLAorQ29sZCwKK0NvbnZlcmdlbnQsCitEZXJlZmVyZW5jZWFibGUsCitEZXJlZmVyZW5jZWFibGVPck51bGwsCitJbkFsbG9jYSwKK0luUmVnLAorSW5hY2Nlc3NpYmxlTWVtT25seSwKK0luYWNjZXNzaWJsZU1lbU9yQXJnTWVtT25seSwKK0lubGluZUhpbnQsCitKdW1wVGFibGUsCitNaW5TaXplLAorTmFrZWQsCitOZXN0LAorTm9BbGlhcywKK05vQnVpbHRpbiwKK05vQ2FwdHVyZSwKK05vQ2ZDaGVjaywKK05vRHVwbGljYXRlLAorTm9JbXBsaWNpdEZsb2F0LAorTm9JbmxpbmUsCitOb1JlY3Vyc2UsCitOb1JlZFpvbmUsCitOb1JldHVybiwKK05vVW53aW5kLAorTm9uTGF6eUJpbmQsCitOb25OdWxsLAorT3B0Rm9yRnV6emluZywKK09wdGltaXplRm9yU2l6ZSwKK09wdGltaXplTm9uZSwKK1JlYWROb25lLAorUmVhZE9ubHksCitSZXR1cm5lZCwKK1JldHVybnNUd2ljZSwKK1NFeHQsCitTYWZlU3RhY2ssCitTYW5pdGl6ZUFkZHJlc3MsCitTYW5pdGl6ZUhXQWRkcmVzcywKK1Nhbml0aXplTWVtb3J5LAorU2FuaXRpemVUaHJlYWQsCitTcGVjdWxhdGFibGUsCitTdGFja0FsaWdubWVudCwKK1N0YWNrUHJvdGVjdCwKK1N0YWNrUHJvdGVjdFJlcSwKK1N0YWNrUHJvdGVjdFN0cm9uZywKK1N0cmljdEZQLAorU3RydWN0UmV0LAorU3dpZnRFcnJvciwKK1N3aWZ0U2VsZiwKK1VXVGFibGUsCitXcml0ZU9ubHksCitaRXh0LAorI2VuZGlmCisjaWZkZWYgR0VUX0FUVFJfS0lORF9GUk9NX05BTUUKKyN1bmRlZiBHRVRfQVRUUl9LSU5EX0ZST01fTkFNRQorc3RhdGljIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0QXR0cktpbmRGcm9tTmFtZShTdHJpbmdSZWYgQXR0ck5hbWUpIHsKKyAgcmV0dXJuIFN0cmluZ1N3aXRjaDxBdHRyaWJ1dGU6OkF0dHJLaW5kPihBdHRyTmFtZSkKKyAgICAuQ2FzZSgiYWxpZ24iLCBBdHRyaWJ1dGU6OkFsaWdubWVudCkKKyAgICAuQ2FzZSgiYWxsb2NzaXplIiwgQXR0cmlidXRlOjpBbGxvY1NpemUpCisgICAgLkNhc2UoImFsd2F5c2lubGluZSIsIEF0dHJpYnV0ZTo6QWx3YXlzSW5saW5lKQorICAgIC5DYXNlKCJhcmdtZW1vbmx5IiwgQXR0cmlidXRlOjpBcmdNZW1Pbmx5KQorICAgIC5DYXNlKCJidWlsdGluIiwgQXR0cmlidXRlOjpCdWlsdGluKQorICAgIC5DYXNlKCJieXZhbCIsIEF0dHJpYnV0ZTo6QnlWYWwpCisgICAgLkNhc2UoImNvbGQiLCBBdHRyaWJ1dGU6OkNvbGQpCisgICAgLkNhc2UoImNvbnZlcmdlbnQiLCBBdHRyaWJ1dGU6OkNvbnZlcmdlbnQpCisgICAgLkNhc2UoImRlcmVmZXJlbmNlYWJsZSIsIEF0dHJpYnV0ZTo6RGVyZWZlcmVuY2VhYmxlKQorICAgIC5DYXNlKCJkZXJlZmVyZW5jZWFibGVfb3JfbnVsbCIsIEF0dHJpYnV0ZTo6RGVyZWZlcmVuY2VhYmxlT3JOdWxsKQorICAgIC5DYXNlKCJpbmFsbG9jYSIsIEF0dHJpYnV0ZTo6SW5BbGxvY2EpCisgICAgLkNhc2UoImlucmVnIiwgQXR0cmlidXRlOjpJblJlZykKKyAgICAuQ2FzZSgiaW5hY2Nlc3NpYmxlbWVtb25seSIsIEF0dHJpYnV0ZTo6SW5hY2Nlc3NpYmxlTWVtT25seSkKKyAgICAuQ2FzZSgiaW5hY2Nlc3NpYmxlbWVtX29yX2FyZ21lbW9ubHkiLCBBdHRyaWJ1dGU6OkluYWNjZXNzaWJsZU1lbU9yQXJnTWVtT25seSkKKyAgICAuQ2FzZSgiaW5saW5laGludCIsIEF0dHJpYnV0ZTo6SW5saW5lSGludCkKKyAgICAuQ2FzZSgianVtcHRhYmxlIiwgQXR0cmlidXRlOjpKdW1wVGFibGUpCisgICAgLkNhc2UoIm1pbnNpemUiLCBBdHRyaWJ1dGU6Ok1pblNpemUpCisgICAgLkNhc2UoIm5ha2VkIiwgQXR0cmlidXRlOjpOYWtlZCkKKyAgICAuQ2FzZSgibmVzdCIsIEF0dHJpYnV0ZTo6TmVzdCkKKyAgICAuQ2FzZSgibm9hbGlhcyIsIEF0dHJpYnV0ZTo6Tm9BbGlhcykKKyAgICAuQ2FzZSgibm9idWlsdGluIiwgQXR0cmlidXRlOjpOb0J1aWx0aW4pCisgICAgLkNhc2UoIm5vY2FwdHVyZSIsIEF0dHJpYnV0ZTo6Tm9DYXB0dXJlKQorICAgIC5DYXNlKCJub2NmX2NoZWNrIiwgQXR0cmlidXRlOjpOb0NmQ2hlY2spCisgICAgLkNhc2UoIm5vZHVwbGljYXRlIiwgQXR0cmlidXRlOjpOb0R1cGxpY2F0ZSkKKyAgICAuQ2FzZSgibm9pbXBsaWNpdGZsb2F0IiwgQXR0cmlidXRlOjpOb0ltcGxpY2l0RmxvYXQpCisgICAgLkNhc2UoIm5vaW5saW5lIiwgQXR0cmlidXRlOjpOb0lubGluZSkKKyAgICAuQ2FzZSgibm9yZWN1cnNlIiwgQXR0cmlidXRlOjpOb1JlY3Vyc2UpCisgICAgLkNhc2UoIm5vcmVkem9uZSIsIEF0dHJpYnV0ZTo6Tm9SZWRab25lKQorICAgIC5DYXNlKCJub3JldHVybiIsIEF0dHJpYnV0ZTo6Tm9SZXR1cm4pCisgICAgLkNhc2UoIm5vdW53aW5kIiwgQXR0cmlidXRlOjpOb1Vud2luZCkKKyAgICAuQ2FzZSgibm9ubGF6eWJpbmQiLCBBdHRyaWJ1dGU6Ok5vbkxhenlCaW5kKQorICAgIC5DYXNlKCJub25udWxsIiwgQXR0cmlidXRlOjpOb25OdWxsKQorICAgIC5DYXNlKCJvcHRmb3JmdXp6aW5nIiwgQXR0cmlidXRlOjpPcHRGb3JGdXp6aW5nKQorICAgIC5DYXNlKCJvcHRzaXplIiwgQXR0cmlidXRlOjpPcHRpbWl6ZUZvclNpemUpCisgICAgLkNhc2UoIm9wdG5vbmUiLCBBdHRyaWJ1dGU6Ok9wdGltaXplTm9uZSkKKyAgICAuQ2FzZSgicmVhZG5vbmUiLCBBdHRyaWJ1dGU6OlJlYWROb25lKQorICAgIC5DYXNlKCJyZWFkb25seSIsIEF0dHJpYnV0ZTo6UmVhZE9ubHkpCisgICAgLkNhc2UoInJldHVybmVkIiwgQXR0cmlidXRlOjpSZXR1cm5lZCkKKyAgICAuQ2FzZSgicmV0dXJuc190d2ljZSIsIEF0dHJpYnV0ZTo6UmV0dXJuc1R3aWNlKQorICAgIC5DYXNlKCJzaWduZXh0IiwgQXR0cmlidXRlOjpTRXh0KQorICAgIC5DYXNlKCJzYWZlc3RhY2siLCBBdHRyaWJ1dGU6OlNhZmVTdGFjaykKKyAgICAuQ2FzZSgic2FuaXRpemVfYWRkcmVzcyIsIEF0dHJpYnV0ZTo6U2FuaXRpemVBZGRyZXNzKQorICAgIC5DYXNlKCJzYW5pdGl6ZV9od2FkZHJlc3MiLCBBdHRyaWJ1dGU6OlNhbml0aXplSFdBZGRyZXNzKQorICAgIC5DYXNlKCJzYW5pdGl6ZV9tZW1vcnkiLCBBdHRyaWJ1dGU6OlNhbml0aXplTWVtb3J5KQorICAgIC5DYXNlKCJzYW5pdGl6ZV90aHJlYWQiLCBBdHRyaWJ1dGU6OlNhbml0aXplVGhyZWFkKQorICAgIC5DYXNlKCJzcGVjdWxhdGFibGUiLCBBdHRyaWJ1dGU6OlNwZWN1bGF0YWJsZSkKKyAgICAuQ2FzZSgiYWxpZ25zdGFjayIsIEF0dHJpYnV0ZTo6U3RhY2tBbGlnbm1lbnQpCisgICAgLkNhc2UoInNzcCIsIEF0dHJpYnV0ZTo6U3RhY2tQcm90ZWN0KQorICAgIC5DYXNlKCJzc3ByZXEiLCBBdHRyaWJ1dGU6OlN0YWNrUHJvdGVjdFJlcSkKKyAgICAuQ2FzZSgic3Nwc3Ryb25nIiwgQXR0cmlidXRlOjpTdGFja1Byb3RlY3RTdHJvbmcpCisgICAgLkNhc2UoInN0cmljdGZwIiwgQXR0cmlidXRlOjpTdHJpY3RGUCkKKyAgICAuQ2FzZSgic3JldCIsIEF0dHJpYnV0ZTo6U3RydWN0UmV0KQorICAgIC5DYXNlKCJzd2lmdGVycm9yIiwgQXR0cmlidXRlOjpTd2lmdEVycm9yKQorICAgIC5DYXNlKCJzd2lmdHNlbGYiLCBBdHRyaWJ1dGU6OlN3aWZ0U2VsZikKKyAgICAuQ2FzZSgidXd0YWJsZSIsIEF0dHJpYnV0ZTo6VVdUYWJsZSkKKyAgICAuQ2FzZSgid3JpdGVvbmx5IiwgQXR0cmlidXRlOjpXcml0ZU9ubHkpCisgICAgLkNhc2UoInplcm9leHQiLCBBdHRyaWJ1dGU6OlpFeHQpCisgICAgLkRlZmF1bHQoQXR0cmlidXRlOjpOb25lKTsKK30KKworI2VuZGlmCisjaWZkZWYgR0VUX0FUVFJfQ09NUEFUX0ZVTkMKKyN1bmRlZiBHRVRfQVRUUl9DT01QQVRfRlVOQworc3RydWN0IEVudW1BdHRyIHsKKyAgc3RhdGljIGJvb2wgaXNTZXQoY29uc3QgRnVuY3Rpb24gJkZuLAorICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIHsKKyAgICByZXR1cm4gRm4uaGFzRm5BdHRyaWJ1dGUoS2luZCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBzZXQoRnVuY3Rpb24gJkZuLAorICAgICAgICAgICAgICAgICAgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kLCBib29sIFZhbCkgeworICAgIGlmIChWYWwpCisgICAgICBGbi5hZGRGbkF0dHIoS2luZCk7CisgICAgZWxzZQorICAgICAgRm4ucmVtb3ZlRm5BdHRyKEtpbmQpOworICB9Cit9OworCitzdHJ1Y3QgU3RyQm9vbEF0dHIgeworICBzdGF0aWMgYm9vbCBpc1NldChjb25zdCBGdW5jdGlvbiAmRm4sCisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBLaW5kKSB7CisgICAgYXV0byBBID0gRm4uZ2V0Rm5BdHRyaWJ1dGUoS2luZCk7CisgICAgcmV0dXJuIEEuZ2V0VmFsdWVBc1N0cmluZygpLmVxdWFscygidHJ1ZSIpOworICB9CisKKyAgc3RhdGljIHZvaWQgc2V0KEZ1bmN0aW9uICZGbiwKKyAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBLaW5kLCBib29sIFZhbCkgeworICAgIEZuLmFkZEZuQXR0cihLaW5kLCBWYWwgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgfQorfTsKKworLy8gRW51bUF0dHIgY2xhc3Nlcworc3RydWN0IEFsaWdubWVudEF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpBbGlnbm1lbnQ7CisgIH0KK307CitzdHJ1Y3QgQWxsb2NTaXplQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OkFsbG9jU2l6ZTsKKyAgfQorfTsKK3N0cnVjdCBBbHdheXNJbmxpbmVBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6QWx3YXlzSW5saW5lOworICB9Cit9Oworc3RydWN0IEFyZ01lbU9ubHlBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6QXJnTWVtT25seTsKKyAgfQorfTsKK3N0cnVjdCBCdWlsdGluQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OkJ1aWx0aW47CisgIH0KK307CitzdHJ1Y3QgQnlWYWxBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6QnlWYWw7CisgIH0KK307CitzdHJ1Y3QgQ29sZEF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpDb2xkOworICB9Cit9Oworc3RydWN0IENvbnZlcmdlbnRBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6Q29udmVyZ2VudDsKKyAgfQorfTsKK3N0cnVjdCBEZXJlZmVyZW5jZWFibGVBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6RGVyZWZlcmVuY2VhYmxlOworICB9Cit9Oworc3RydWN0IERlcmVmZXJlbmNlYWJsZU9yTnVsbEF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpEZXJlZmVyZW5jZWFibGVPck51bGw7CisgIH0KK307CitzdHJ1Y3QgSW5BbGxvY2FBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6SW5BbGxvY2E7CisgIH0KK307CitzdHJ1Y3QgSW5SZWdBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6SW5SZWc7CisgIH0KK307CitzdHJ1Y3QgSW5hY2Nlc3NpYmxlTWVtT25seUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpJbmFjY2Vzc2libGVNZW1Pbmx5OworICB9Cit9Oworc3RydWN0IEluYWNjZXNzaWJsZU1lbU9yQXJnTWVtT25seUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpJbmFjY2Vzc2libGVNZW1PckFyZ01lbU9ubHk7CisgIH0KK307CitzdHJ1Y3QgSW5saW5lSGludEF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpJbmxpbmVIaW50OworICB9Cit9Oworc3RydWN0IEp1bXBUYWJsZUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpKdW1wVGFibGU7CisgIH0KK307CitzdHJ1Y3QgTWluU2l6ZUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpNaW5TaXplOworICB9Cit9Oworc3RydWN0IE5ha2VkQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6Ok5ha2VkOworICB9Cit9Oworc3RydWN0IE5lc3RBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6TmVzdDsKKyAgfQorfTsKK3N0cnVjdCBOb0FsaWFzQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6Ok5vQWxpYXM7CisgIH0KK307CitzdHJ1Y3QgTm9CdWlsdGluQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6Ok5vQnVpbHRpbjsKKyAgfQorfTsKK3N0cnVjdCBOb0NhcHR1cmVBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6Tm9DYXB0dXJlOworICB9Cit9Oworc3RydWN0IE5vQ2ZDaGVja0F0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpOb0NmQ2hlY2s7CisgIH0KK307CitzdHJ1Y3QgTm9EdXBsaWNhdGVBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6Tm9EdXBsaWNhdGU7CisgIH0KK307CitzdHJ1Y3QgTm9JbXBsaWNpdEZsb2F0QXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6Ok5vSW1wbGljaXRGbG9hdDsKKyAgfQorfTsKK3N0cnVjdCBOb0lubGluZUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpOb0lubGluZTsKKyAgfQorfTsKK3N0cnVjdCBOb1JlY3Vyc2VBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6Tm9SZWN1cnNlOworICB9Cit9Oworc3RydWN0IE5vUmVkWm9uZUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpOb1JlZFpvbmU7CisgIH0KK307CitzdHJ1Y3QgTm9SZXR1cm5BdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6Tm9SZXR1cm47CisgIH0KK307CitzdHJ1Y3QgTm9VbndpbmRBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6Tm9VbndpbmQ7CisgIH0KK307CitzdHJ1Y3QgTm9uTGF6eUJpbmRBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6Tm9uTGF6eUJpbmQ7CisgIH0KK307CitzdHJ1Y3QgTm9uTnVsbEF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpOb25OdWxsOworICB9Cit9Oworc3RydWN0IE9wdEZvckZ1enppbmdBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6T3B0Rm9yRnV6emluZzsKKyAgfQorfTsKK3N0cnVjdCBPcHRpbWl6ZUZvclNpemVBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6T3B0aW1pemVGb3JTaXplOworICB9Cit9Oworc3RydWN0IE9wdGltaXplTm9uZUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpPcHRpbWl6ZU5vbmU7CisgIH0KK307CitzdHJ1Y3QgUmVhZE5vbmVBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6UmVhZE5vbmU7CisgIH0KK307CitzdHJ1Y3QgUmVhZE9ubHlBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6UmVhZE9ubHk7CisgIH0KK307CitzdHJ1Y3QgUmV0dXJuZWRBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6UmV0dXJuZWQ7CisgIH0KK307CitzdHJ1Y3QgUmV0dXJuc1R3aWNlQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OlJldHVybnNUd2ljZTsKKyAgfQorfTsKK3N0cnVjdCBTRXh0QXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OlNFeHQ7CisgIH0KK307CitzdHJ1Y3QgU2FmZVN0YWNrQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OlNhZmVTdGFjazsKKyAgfQorfTsKK3N0cnVjdCBTYW5pdGl6ZUFkZHJlc3NBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6U2FuaXRpemVBZGRyZXNzOworICB9Cit9Oworc3RydWN0IFNhbml0aXplSFdBZGRyZXNzQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OlNhbml0aXplSFdBZGRyZXNzOworICB9Cit9Oworc3RydWN0IFNhbml0aXplTWVtb3J5QXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OlNhbml0aXplTWVtb3J5OworICB9Cit9Oworc3RydWN0IFNhbml0aXplVGhyZWFkQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OlNhbml0aXplVGhyZWFkOworICB9Cit9Oworc3RydWN0IFNwZWN1bGF0YWJsZUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpTcGVjdWxhdGFibGU7CisgIH0KK307CitzdHJ1Y3QgU3RhY2tBbGlnbm1lbnRBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6U3RhY2tBbGlnbm1lbnQ7CisgIH0KK307CitzdHJ1Y3QgU3RhY2tQcm90ZWN0QXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OlN0YWNrUHJvdGVjdDsKKyAgfQorfTsKK3N0cnVjdCBTdGFja1Byb3RlY3RSZXFBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6U3RhY2tQcm90ZWN0UmVxOworICB9Cit9Oworc3RydWN0IFN0YWNrUHJvdGVjdFN0cm9uZ0F0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpTdGFja1Byb3RlY3RTdHJvbmc7CisgIH0KK307CitzdHJ1Y3QgU3RyaWN0RlBBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6U3RyaWN0RlA7CisgIH0KK307CitzdHJ1Y3QgU3RydWN0UmV0QXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OlN0cnVjdFJldDsKKyAgfQorfTsKK3N0cnVjdCBTd2lmdEVycm9yQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OlN3aWZ0RXJyb3I7CisgIH0KK307CitzdHJ1Y3QgU3dpZnRTZWxmQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OlN3aWZ0U2VsZjsKKyAgfQorfTsKK3N0cnVjdCBVV1RhYmxlQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OlVXVGFibGU7CisgIH0KK307CitzdHJ1Y3QgV3JpdGVPbmx5QXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OldyaXRlT25seTsKKyAgfQorfTsKK3N0cnVjdCBaRXh0QXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OlpFeHQ7CisgIH0KK307CisKKy8vIFN0ckJvb2xBdHRyIGNsYXNzZXMKK3N0cnVjdCBMZXNzUHJlY2lzZUZQTUFEQXR0ciA6IFN0ckJvb2xBdHRyIHsKKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRLaW5kKCkgeworICAgIHJldHVybiAibGVzcy1wcmVjaXNlLWZwbWFkIjsKKyAgfQorfTsKK3N0cnVjdCBOb0luZnNGUE1hdGhBdHRyIDogU3RyQm9vbEF0dHIgeworICBzdGF0aWMgU3RyaW5nUmVmIGdldEtpbmQoKSB7CisgICAgcmV0dXJuICJuby1pbmZzLWZwLW1hdGgiOworICB9Cit9Oworc3RydWN0IE5vSnVtcFRhYmxlc0F0dHIgOiBTdHJCb29sQXR0ciB7CisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gIm5vLWp1bXAtdGFibGVzIjsKKyAgfQorfTsKK3N0cnVjdCBOb05hbnNGUE1hdGhBdHRyIDogU3RyQm9vbEF0dHIgeworICBzdGF0aWMgU3RyaW5nUmVmIGdldEtpbmQoKSB7CisgICAgcmV0dXJuICJuby1uYW5zLWZwLW1hdGgiOworICB9Cit9Oworc3RydWN0IFByb2ZpbGVTYW1wbGVBY2N1cmF0ZUF0dHIgOiBTdHJCb29sQXR0ciB7CisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gInByb2ZpbGUtc2FtcGxlLWFjY3VyYXRlIjsKKyAgfQorfTsKK3N0cnVjdCBVbnNhZmVGUE1hdGhBdHRyIDogU3RyQm9vbEF0dHIgeworICBzdGF0aWMgU3RyaW5nUmVmIGdldEtpbmQoKSB7CisgICAgcmV0dXJuICJ1bnNhZmUtZnAtbWF0aCI7CisgIH0KK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBoYXNDb21wYXRpYmxlRm5BdHRycyhjb25zdCBGdW5jdGlvbiAmQ2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uICZDYWxsZWUpIHsKKyAgYm9vbCBSZXQgPSB0cnVlOworCisgIFJldCAmPSBpc0VxdWFsPFNhbml0aXplQWRkcmVzc0F0dHI+KENhbGxlciwgQ2FsbGVlKTsKKyAgUmV0ICY9IGlzRXF1YWw8U2FuaXRpemVUaHJlYWRBdHRyPihDYWxsZXIsIENhbGxlZSk7CisgIFJldCAmPSBpc0VxdWFsPFNhbml0aXplTWVtb3J5QXR0cj4oQ2FsbGVyLCBDYWxsZWUpOworICBSZXQgJj0gaXNFcXVhbDxTYW5pdGl6ZUhXQWRkcmVzc0F0dHI+KENhbGxlciwgQ2FsbGVlKTsKKyAgUmV0ICY9IGlzRXF1YWw8U2FmZVN0YWNrQXR0cj4oQ2FsbGVyLCBDYWxsZWUpOworCisgIHJldHVybiBSZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZXJnZUZuQXR0cnMoRnVuY3Rpb24gJkNhbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb24gJkNhbGxlZSkgeworICBzZXRPUjxOb0p1bXBUYWJsZXNBdHRyPihDYWxsZXIsIENhbGxlZSk7CisgIHNldE9SPFByb2ZpbGVTYW1wbGVBY2N1cmF0ZUF0dHI+KENhbGxlciwgQ2FsbGVlKTsKKyAgYWRqdXN0Q2FsbGVyU1NQTGV2ZWwoQ2FsbGVyLCBDYWxsZWUpOworICBhZGp1c3RDYWxsZXJTdGFja1Byb2JlcyhDYWxsZXIsIENhbGxlZSk7CisgIGFkanVzdENhbGxlclN0YWNrUHJvYmVTaXplKENhbGxlciwgQ2FsbGVlKTsKKyAgc2V0QU5EPExlc3NQcmVjaXNlRlBNQURBdHRyPihDYWxsZXIsIENhbGxlZSk7CisgIHNldEFORDxOb0luZnNGUE1hdGhBdHRyPihDYWxsZXIsIENhbGxlZSk7CisgIHNldEFORDxOb05hbnNGUE1hdGhBdHRyPihDYWxsZXIsIENhbGxlZSk7CisgIHNldEFORDxVbnNhZmVGUE1hdGhBdHRyPihDYWxsZXIsIENhbGxlZSk7CisgIHNldE9SPE5vSW1wbGljaXRGbG9hdEF0dHI+KENhbGxlciwgQ2FsbGVlKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0F0dHJpYnV0ZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQXR0cmlidXRlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MGZjNTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0F0dHJpYnV0ZXMuaApAQCAtMCwwICsxLDgzOSBAQAorLy89PT0tIGxsdm0vQXR0cmlidXRlcy5oIC0gQ29udGFpbmVyIGZvciBBdHRyaWJ1dGVzIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzaW1wbGUgdHlwZXMgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCB0aGUKKy8vLyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBmdW5jdGlvbnMgYW5kIHRoZWlyIGNhbGxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9BVFRSSUJVVEVTX0gKKyNkZWZpbmUgTExWTV9JUl9BVFRSSUJVVEVTX0gKKworI2luY2x1ZGUgImxsdm0tYy9UeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmgiCisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQXR0ckJ1aWxkZXI7CitjbGFzcyBBdHRyaWJ1dGVJbXBsOworY2xhc3MgQXR0cmlidXRlTGlzdEltcGw7CitjbGFzcyBBdHRyaWJ1dGVTZXROb2RlOwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IERlbnNlTWFwSW5mbzsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBUeXBlOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxjbGFzcworLy8vIFxicmllZiBGdW5jdGlvbnMsIGZ1bmN0aW9uIHBhcmFtZXRlcnMsIGFuZCByZXR1cm4gdHlwZXMgY2FuIGhhdmUgYXR0cmlidXRlcworLy8vIHRvIGluZGljYXRlIGhvdyB0aGV5IHNob3VsZCBiZSB0cmVhdGVkIGJ5IG9wdGltaXphdGlvbnMgYW5kIGNvZGUKKy8vLyBnZW5lcmF0aW9uLiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgb25lIG9mIHRob3NlIGF0dHJpYnV0ZXMuIEl0J3MgbGlnaHQtd2VpZ2h0CisvLy8gYW5kIHNob3VsZCBiZSBwYXNzZWQgYXJvdW5kIGJ5LXZhbHVlLgorY2xhc3MgQXR0cmlidXRlIHsKK3B1YmxpYzoKKyAgLy8vIFRoaXMgZW51bWVyYXRpb24gbGlzdHMgdGhlIGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoCisgIC8vLyBwYXJhbWV0ZXJzLCBmdW5jdGlvbiByZXN1bHRzLCBvciB0aGUgZnVuY3Rpb24gaXRzZWxmLgorICAvLy8KKyAgLy8vIE5vdGU6IFRoZSBgdXd0YWJsZScgYXR0cmlidXRlIGlzIGFib3V0IHRoZSBBQkkgb3IgdGhlIHVzZXIgbWFuZGF0aW5nIGFuCisgIC8vLyBlbnRyeSBpbiB0aGUgdW53aW5kIHRhYmxlLiBUaGUgYG5vdW53aW5kJyBhdHRyaWJ1dGUgaXMgYWJvdXQgYW4gZXhjZXB0aW9uCisgIC8vLyBwYXNzaW5nIGJ5IHRoZSBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBJbiBhIHRoZW9yZXRpY2FsIHN5c3RlbSB0aGF0IHVzZXMgdGFibGVzIGZvciBwcm9maWxpbmcgYW5kIFNqTGogZm9yCisgIC8vLyBleGNlcHRpb25zLCB0aGV5IHdvdWxkIGJlIGZ1bGx5IGluZGVwZW5kZW50LiBJbiBhIG5vcm1hbCBzeXN0ZW0gdGhhdCB1c2VzCisgIC8vLyB0YWJsZXMgZm9yIGJvdGgsIHRoZSBzZW1hbnRpY3MgYXJlOgorICAvLy8KKyAgLy8vIG5pbCAgICAgICAgICAgICAgICA9IE5lZWRzIGFuIGVudHJ5IGJlY2F1c2UgYW4gZXhjZXB0aW9uIG1pZ2h0IHBhc3MgYnkuCisgIC8vLyBub3Vud2luZCAgICAgICAgICAgPSBObyBuZWVkIGZvciBhbiBlbnRyeQorICAvLy8gdXd0YWJsZSAgICAgICAgICAgID0gTmVlZHMgYW4gZW50cnkgYmVjYXVzZSB0aGUgQUJJIHNheXMgc28gYW5kIGJlY2F1c2UKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgIGFuIGV4Y2VwdGlvbiBtaWdodCBwYXNzIGJ5LgorICAvLy8gdXd0YWJsZSArIG5vdW53aW5kID0gTmVlZHMgYW4gZW50cnkgYmVjYXVzZSB0aGUgQUJJIHNheXMgc28uCisKKyAgZW51bSBBdHRyS2luZCB7CisgICAgLy8gSVItTGV2ZWwgQXR0cmlidXRlcworICAgIE5vbmUsICAgICAgICAgICAgICAgICAgLy8vPCBObyBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBzZXQKKyAgICAjZGVmaW5lIEdFVF9BVFRSX0VOVU0KKyAgICAjaW5jbHVkZSAibGx2bS9JUi9BdHRyaWJ1dGVzLmdlbiIKKyAgICBFbmRBdHRyS2luZHMgICAgICAgICAgIC8vLzwgU2VudGluYWwgdmFsdWUgdXNlZnVsIGZvciBsb29wcworICB9OworCitwcml2YXRlOgorICBBdHRyaWJ1dGVJbXBsICpwSW1wbCA9IG51bGxwdHI7CisKKyAgQXR0cmlidXRlKEF0dHJpYnV0ZUltcGwgKkEpIDogcEltcGwoQSkge30KKworcHVibGljOgorICBBdHRyaWJ1dGUoKSA9IGRlZmF1bHQ7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEF0dHJpYnV0ZSBDb25zdHJ1Y3Rpb24KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSB1bmlxdWlmaWVkIEF0dHJpYnV0ZSBvYmplY3QuCisgIHN0YXRpYyBBdHRyaWJ1dGUgZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBBdHRyS2luZCBLaW5kLCB1aW50NjRfdCBWYWwgPSAwKTsKKyAgc3RhdGljIEF0dHJpYnV0ZSBnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIFN0cmluZ1JlZiBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVmFsID0gU3RyaW5nUmVmKCkpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgdW5pcXVpZmllZCBBdHRyaWJ1dGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBzcGVjaWZpYworICAvLy8gYWxpZ25tZW50IHNldC4KKyAgc3RhdGljIEF0dHJpYnV0ZSBnZXRXaXRoQWxpZ25tZW50KExMVk1Db250ZXh0ICZDb250ZXh0LCB1aW50NjRfdCBBbGlnbik7CisgIHN0YXRpYyBBdHRyaWJ1dGUgZ2V0V2l0aFN0YWNrQWxpZ25tZW50KExMVk1Db250ZXh0ICZDb250ZXh0LCB1aW50NjRfdCBBbGlnbik7CisgIHN0YXRpYyBBdHRyaWJ1dGUgZ2V0V2l0aERlcmVmZXJlbmNlYWJsZUJ5dGVzKExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEJ5dGVzKTsKKyAgc3RhdGljIEF0dHJpYnV0ZSBnZXRXaXRoRGVyZWZlcmVuY2VhYmxlT3JOdWxsQnl0ZXMoTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEJ5dGVzKTsKKyAgc3RhdGljIEF0dHJpYnV0ZSBnZXRXaXRoQWxsb2NTaXplQXJncyhMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFbGVtU2l6ZUFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25hbDx1bnNpZ25lZD4gJk51bUVsZW1zQXJnKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQXR0cmlidXRlIEFjY2Vzc29ycworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgYW4gQXR0cmlidXRlOjpBdHRyS2luZCB0eXBlLgorICBib29sIGlzRW51bUF0dHJpYnV0ZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyBhbiBpbnRlZ2VyIGF0dHJpYnV0ZS4KKyAgYm9vbCBpc0ludEF0dHJpYnV0ZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyBhIHN0cmluZyAodGFyZ2V0LWRlcGVuZGVudCkKKyAgLy8vIGF0dHJpYnV0ZS4KKyAgYm9vbCBpc1N0cmluZ0F0dHJpYnV0ZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyBwcmVzZW50LgorICBib29sIGhhc0F0dHJpYnV0ZShBdHRyS2luZCBWYWwpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldC1kZXBlbmRlbnQgYXR0cmlidXRlIGlzIHByZXNlbnQuCisgIGJvb2wgaGFzQXR0cmlidXRlKFN0cmluZ1JlZiBWYWwpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBhdHRyaWJ1dGUncyBraW5kIGFzIGFuIGVudW0gKEF0dHJpYnV0ZTo6QXR0cktpbmQpLiBUaGlzCisgIC8vLyByZXF1aXJlcyB0aGUgYXR0cmlidXRlIHRvIGJlIGFuIGVudW0gb3IgaW50ZWdlciBhdHRyaWJ1dGUuCisgIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZEFzRW51bSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZSBhcyBhbiBpbnRlZ2VyLiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlCisgIC8vLyBhdHRyaWJ1dGUgYmUgYW4gaW50ZWdlciBhdHRyaWJ1dGUuCisgIHVpbnQ2NF90IGdldFZhbHVlQXNJbnQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgYXR0cmlidXRlJ3Mga2luZCBhcyBhIHN0cmluZy4gVGhpcyByZXF1aXJlcyB0aGUKKyAgLy8vIGF0dHJpYnV0ZSB0byBiZSBhIHN0cmluZyBhdHRyaWJ1dGUuCisgIFN0cmluZ1JlZiBnZXRLaW5kQXNTdHJpbmcoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgYXR0cmlidXRlJ3MgdmFsdWUgYXMgYSBzdHJpbmcuIFRoaXMgcmVxdWlyZXMgdGhlCisgIC8vLyBhdHRyaWJ1dGUgdG8gYmUgYSBzdHJpbmcgYXR0cmlidXRlLgorICBTdHJpbmdSZWYgZ2V0VmFsdWVBc1N0cmluZygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgYWxpZ25tZW50IGZpZWxkIG9mIGFuIGF0dHJpYnV0ZSBhcyBhIGJ5dGUgYWxpZ25tZW50CisgIC8vLyB2YWx1ZS4KKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBzdGFjayBhbGlnbm1lbnQgZmllbGQgb2YgYW4gYXR0cmlidXRlIGFzIGEgYnl0ZQorICAvLy8gYWxpZ25tZW50IHZhbHVlLgorICB1bnNpZ25lZCBnZXRTdGFja0FsaWdubWVudCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRlcmVmZXJlbmNlYWJsZSBieXRlcyBmcm9tIHRoZQorICAvLy8gZGVyZWZlcmVuY2VhYmxlIGF0dHJpYnV0ZS4KKyAgdWludDY0X3QgZ2V0RGVyZWZlcmVuY2VhYmxlQnl0ZXMoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBkZXJlZmVyZW5jZWFibGVfb3JfbnVsbCBieXRlcyBmcm9tIHRoZQorICAvLy8gZGVyZWZlcmVuY2VhYmxlX29yX251bGwgYXR0cmlidXRlLgorICB1aW50NjRfdCBnZXREZXJlZmVyZW5jZWFibGVPck51bGxCeXRlcygpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBhcmd1bWVudCBudW1iZXJzIGZvciB0aGUgYWxsb2NzaXplIGF0dHJpYnV0ZSAob3IgcGFpcigwLCAwKQorICAvLy8gaWYgbm90IGtub3duKS4KKyAgc3RkOjpwYWlyPHVuc2lnbmVkLCBPcHRpb25hbDx1bnNpZ25lZD4+IGdldEFsbG9jU2l6ZUFyZ3MoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFRoZSBBdHRyaWJ1dGUgaXMgY29udmVydGVkIHRvIGEgc3RyaW5nIG9mIGVxdWl2YWxlbnQgbW5lbW9uaWMuIFRoaXMKKyAgLy8vIGlzLCBwcmVzdW1hYmx5LCBmb3Igd3JpdGluZyBvdXQgdGhlIG1uZW1vbmljcyBmb3IgdGhlIGFzc2VtYmx5IHdyaXRlci4KKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoYm9vbCBJbkF0dHJHcnAgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBFcXVhbGl0eSBhbmQgbm9uLWVxdWFsaXR5IG9wZXJhdG9ycy4KKyAgYm9vbCBvcGVyYXRvcj09KEF0dHJpYnV0ZSBBKSBjb25zdCB7IHJldHVybiBwSW1wbCA9PSBBLnBJbXBsOyB9CisgIGJvb2wgb3BlcmF0b3IhPShBdHRyaWJ1dGUgQSkgY29uc3QgeyByZXR1cm4gcEltcGwgIT0gQS5wSW1wbDsgfQorCisgIC8vLyBcYnJpZWYgTGVzcy10aGFuIG9wZXJhdG9yLiBVc2VmdWwgZm9yIHNvcnRpbmcgdGhlIGF0dHJpYnV0ZXMgbGlzdC4KKyAgYm9vbCBvcGVyYXRvcjwoQXR0cmlidXRlIEEpIGNvbnN0OworCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3QgeworICAgIElELkFkZFBvaW50ZXIocEltcGwpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSByYXcgcG9pbnRlciB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBhdHRyaWJ1dGUuCisgIHZvaWQgKmdldFJhd1BvaW50ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIHBJbXBsOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYW4gYXR0cmlidXRlIGZyb20gYSByYXcgcG9pbnRlciBjcmVhdGVkIGJ5IGdldFJhd1BvaW50ZXIuCisgIHN0YXRpYyBBdHRyaWJ1dGUgZnJvbVJhd1BvaW50ZXIodm9pZCAqUmF3UHRyKSB7CisgICAgcmV0dXJuIEF0dHJpYnV0ZShyZWludGVycHJldF9jYXN0PEF0dHJpYnV0ZUltcGwqPihSYXdQdHIpKTsKKyAgfQorfTsKKworLy8gU3BlY2lhbGl6ZWQgb3BhcXVlIHZhbHVlIGNvbnZlcnNpb25zLgoraW5saW5lIExMVk1BdHRyaWJ1dGVSZWYgd3JhcChBdHRyaWJ1dGUgQXR0cikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxMTFZNQXR0cmlidXRlUmVmPihBdHRyLmdldFJhd1BvaW50ZXIoKSk7Cit9CisKKy8vIFNwZWNpYWxpemVkIG9wYXF1ZSB2YWx1ZSBjb252ZXJzaW9ucy4KK2lubGluZSBBdHRyaWJ1dGUgdW53cmFwKExMVk1BdHRyaWJ1dGVSZWYgQXR0cikgeworICByZXR1cm4gQXR0cmlidXRlOjpmcm9tUmF3UG9pbnRlcihBdHRyKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcY2xhc3MKKy8vLyBUaGlzIGNsYXNzIGhvbGRzIHRoZSBhdHRyaWJ1dGVzIGZvciBhIHBhcnRpY3VsYXIgYXJndW1lbnQsIHBhcmFtZXRlciwKKy8vLyBmdW5jdGlvbiwgb3IgcmV0dXJuIHZhbHVlLiBJdCBpcyBhbiBpbW11dGFibGUgdmFsdWUgdHlwZSB0aGF0IGlzIGNoZWFwIHRvCisvLy8gY29weS4gQWRkaW5nIGFuZCByZW1vdmluZyBlbnVtIGF0dHJpYnV0ZXMgaXMgaW50ZW5kZWQgdG8gYmUgZmFzdCwgYnV0IGFkZGluZworLy8vIGFuZCByZW1vdmluZyBzdHJpbmcgb3IgaW50ZWdlciBhdHRyaWJ1dGVzIGludm9sdmVzIGEgRm9sZGluZ1NldCBsb29rdXAuCitjbGFzcyBBdHRyaWJ1dGVTZXQgeworICBmcmllbmQgQXR0cmlidXRlTGlzdEltcGw7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeT4gZnJpZW5kIHN0cnVjdCBEZW5zZU1hcEluZm87CisKKyAgLy8gVE9ETzogRXh0cmFjdCBBdmFpbGFibGVBdHRycyBmcm9tIEF0dHJpYnV0ZVNldE5vZGUgYW5kIHN0b3JlIHRoZW0gaGVyZS4KKyAgLy8gVGhpcyB3aWxsIGFsbG93IGFuIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBhZGRBdHRyaWJ1dGUgYW5kCisgIC8vIHJlbW92ZUF0dHJpYnV0ZSBmb3IgZW51bSBhdHRycy4KKworICAvLy8gUHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBwb2ludGVyLgorICBBdHRyaWJ1dGVTZXROb2RlICpTZXROb2RlID0gbnVsbHB0cjsKKworcHJpdmF0ZToKKyAgZXhwbGljaXQgQXR0cmlidXRlU2V0KEF0dHJpYnV0ZVNldE5vZGUgKkFTTikgOiBTZXROb2RlKEFTTikge30KKworcHVibGljOgorICAvLy8gQXR0cmlidXRlU2V0IGlzIGEgdHJpdmlhbGx5IGNvcHlhYmxlIHZhbHVlIHR5cGUuCisgIEF0dHJpYnV0ZVNldCgpID0gZGVmYXVsdDsKKyAgQXR0cmlidXRlU2V0KGNvbnN0IEF0dHJpYnV0ZVNldCAmKSA9IGRlZmF1bHQ7CisgIH5BdHRyaWJ1dGVTZXQoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIEF0dHJpYnV0ZVNldCBnZXQoTExWTUNvbnRleHQgJkMsIGNvbnN0IEF0dHJCdWlsZGVyICZCKTsKKyAgc3RhdGljIEF0dHJpYnV0ZVNldCBnZXQoTExWTUNvbnRleHQgJkMsIEFycmF5UmVmPEF0dHJpYnV0ZT4gQXR0cnMpOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBdHRyaWJ1dGVTZXQgJk8pIGNvbnN0IHsgcmV0dXJuIFNldE5vZGUgPT0gTy5TZXROb2RlOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBdHRyaWJ1dGVTZXQgJk8pIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gTyk7IH0KKworICAvLy8gQWRkIGFuIGFyZ3VtZW50IGF0dHJpYnV0ZS4gUmV0dXJucyBhIG5ldyBzZXQgYmVjYXVzZSBhdHRyaWJ1dGUgc2V0cyBhcmUKKyAgLy8vIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlU2V0IGFkZEF0dHJpYnV0ZShMTFZNQ29udGV4dCAmQywgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdDsKKworICAvLy8gQWRkIGEgdGFyZ2V0LWRlcGVuZGVudCBhdHRyaWJ1dGUuIFJldHVybnMgYSBuZXcgc2V0IGJlY2F1c2UgYXR0cmlidXRlIHNldHMKKyAgLy8vIGFyZSBpbW11dGFibGUuCisgIEF0dHJpYnV0ZVNldCBhZGRBdHRyaWJ1dGUoTExWTUNvbnRleHQgJkMsIFN0cmluZ1JlZiBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBWYWx1ZSA9IFN0cmluZ1JlZigpKSBjb25zdDsKKworICAvLy8gQWRkIGF0dHJpYnV0ZXMgdG8gdGhlIGF0dHJpYnV0ZSBzZXQuIFJldHVybnMgYSBuZXcgc2V0IGJlY2F1c2UgYXR0cmlidXRlCisgIC8vLyBzZXRzIGFyZSBpbW11dGFibGUuCisgIEF0dHJpYnV0ZVNldCBhZGRBdHRyaWJ1dGVzKExMVk1Db250ZXh0ICZDLCBBdHRyaWJ1dGVTZXQgQVMpIGNvbnN0OworCisgIC8vLyBSZW1vdmUgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgZnJvbSB0aGlzIHNldC4gUmV0dXJucyBhIG5ldyBzZXQgYmVjYXVzZQorICAvLy8gYXR0cmlidXRlIHNldHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlU2V0IHJlbW92ZUF0dHJpYnV0ZShMTFZNQ29udGV4dCAmQywgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdDsKKworICAvLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGZyb20gdGhpcyBzZXQuIFJldHVybnMgYSBuZXcgc2V0IGJlY2F1c2UKKyAgLy8vIGF0dHJpYnV0ZSBzZXRzIGFyZSBpbW11dGFibGUuCisgIEF0dHJpYnV0ZVNldCByZW1vdmVBdHRyaWJ1dGUoTExWTUNvbnRleHQgJkMsIFN0cmluZ1JlZiBLaW5kKSBjb25zdDsKKworICAvLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlcyBmcm9tIHRoaXMgc2V0LiBSZXR1cm5zIGEgbmV3IHNldCBiZWNhdXNlCisgIC8vLyBhdHRyaWJ1dGUgc2V0cyBhcmUgaW1tdXRhYmxlLgorICBBdHRyaWJ1dGVTZXQgcmVtb3ZlQXR0cmlidXRlcyhMTFZNQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0ckJ1aWxkZXIgJkF0dHJzVG9SZW1vdmUpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIGluIHRoaXMgc2V0LgorICB1bnNpZ25lZCBnZXROdW1BdHRyaWJ1dGVzKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGF0dHJpYnV0ZXMgZXhpc3RzIGluIHRoaXMgc2V0LgorICBib29sIGhhc0F0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBTZXROb2RlICE9IG51bGxwdHI7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGF0dHJpYnV0ZSBleGlzdHMgaW4gdGhpcyBzZXQuCisgIGJvb2wgaGFzQXR0cmlidXRlKEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgZXhpc3RzIGluIHRoaXMgc2V0LgorICBib29sIGhhc0F0dHJpYnV0ZShTdHJpbmdSZWYgS2luZCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgYXR0cmlidXRlIG9iamVjdC4KKyAgQXR0cmlidXRlIGdldEF0dHJpYnV0ZShBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHRhcmdldC1kZXBlbmRlbnQgYXR0cmlidXRlIG9iamVjdC4KKyAgQXR0cmlidXRlIGdldEF0dHJpYnV0ZShTdHJpbmdSZWYgS2luZCkgY29uc3Q7CisKKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KCkgY29uc3Q7CisgIHVuc2lnbmVkIGdldFN0YWNrQWxpZ25tZW50KCkgY29uc3Q7CisgIHVpbnQ2NF90IGdldERlcmVmZXJlbmNlYWJsZUJ5dGVzKCkgY29uc3Q7CisgIHVpbnQ2NF90IGdldERlcmVmZXJlbmNlYWJsZU9yTnVsbEJ5dGVzKCkgY29uc3Q7CisgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgT3B0aW9uYWw8dW5zaWduZWQ+PiBnZXRBbGxvY1NpemVBcmdzKCkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKGJvb2wgSW5BdHRyR3JwID0gZmFsc2UpIGNvbnN0OworCisgIHVzaW5nIGl0ZXJhdG9yID0gY29uc3QgQXR0cmlidXRlICo7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKKyAgaXRlcmF0b3IgZW5kKCkgY29uc3Q7CisjaWYgIWRlZmluZWQoTkRFQlVHKSB8fCBkZWZpbmVkKExMVk1fRU5BQkxFX0RVTVApCisgIHZvaWQgZHVtcCgpIGNvbnN0OworI2VuZGlmCit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxjbGFzcworLy8vIFxicmllZiBQcm92aWRlIERlbnNlTWFwSW5mbyBmb3IgQXR0cmlidXRlU2V0LgordGVtcGxhdGUgPD4gc3RydWN0IERlbnNlTWFwSW5mbzxBdHRyaWJ1dGVTZXQ+IHsKKyAgc3RhdGljIEF0dHJpYnV0ZVNldCBnZXRFbXB0eUtleSgpIHsKKyAgICBhdXRvIFZhbCA9IHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oLTEpOworICAgIFZhbCA8PD0gUG9pbnRlckxpa2VUeXBlVHJhaXRzPHZvaWQgKj46Ok51bUxvd0JpdHNBdmFpbGFibGU7CisgICAgcmV0dXJuIEF0dHJpYnV0ZVNldChyZWludGVycHJldF9jYXN0PEF0dHJpYnV0ZVNldE5vZGUgKj4oVmFsKSk7CisgIH0KKworICBzdGF0aWMgQXR0cmlidXRlU2V0IGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICBhdXRvIFZhbCA9IHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oLTIpOworICAgIFZhbCA8PD0gUG9pbnRlckxpa2VUeXBlVHJhaXRzPHZvaWQgKj46Ok51bUxvd0JpdHNBdmFpbGFibGU7CisgICAgcmV0dXJuIEF0dHJpYnV0ZVNldChyZWludGVycHJldF9jYXN0PEF0dHJpYnV0ZVNldE5vZGUgKj4oVmFsKSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKEF0dHJpYnV0ZVNldCBBUykgeworICAgIHJldHVybiAodW5zaWduZWQoKHVpbnRwdHJfdClBUy5TZXROb2RlKSA+PiA0KSBeCisgICAgICAgICAgICh1bnNpZ25lZCgodWludHB0cl90KUFTLlNldE5vZGUpID4+IDkpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChBdHRyaWJ1dGVTZXQgTEhTLCBBdHRyaWJ1dGVTZXQgUkhTKSB7IHJldHVybiBMSFMgPT0gUkhTOyB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxjbGFzcworLy8vIFxicmllZiBUaGlzIGNsYXNzIGhvbGRzIHRoZSBhdHRyaWJ1dGVzIGZvciBhIGZ1bmN0aW9uLCBpdHMgcmV0dXJuIHZhbHVlLCBhbmQKKy8vLyBpdHMgcGFyYW1ldGVycy4gWW91IGFjY2VzcyB0aGUgYXR0cmlidXRlcyBmb3IgZWFjaCBvZiB0aGVtIHZpYSBhbiBpbmRleCBpbnRvCisvLy8gdGhlIEF0dHJpYnV0ZUxpc3Qgb2JqZWN0LiBUaGUgZnVuY3Rpb24gYXR0cmlidXRlcyBhcmUgYXQgaW5kZXgKKy8vLyBgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCcsIHRoZSByZXR1cm4gdmFsdWUgaXMgYXQgaW5kZXgKKy8vLyBgQXR0cmlidXRlTGlzdDo6UmV0dXJuSW5kZXgnLCBhbmQgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBwYXJhbWV0ZXJzIHN0YXJ0IGF0CisvLy8gaW5kZXggYEF0dHJpYnV0ZUxpc3Q6OkZpcnN0QXJnSW5kZXgnLgorY2xhc3MgQXR0cmlidXRlTGlzdCB7CitwdWJsaWM6CisgIGVudW0gQXR0ckluZGV4IDogdW5zaWduZWQgeworICAgIFJldHVybkluZGV4ID0gMFUsCisgICAgRnVuY3Rpb25JbmRleCA9IH4wVSwKKyAgICBGaXJzdEFyZ0luZGV4ID0gMSwKKyAgfTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEF0dHJCdWlsZGVyOworICBmcmllbmQgY2xhc3MgQXR0cmlidXRlTGlzdEltcGw7CisgIGZyaWVuZCBjbGFzcyBBdHRyaWJ1dGVTZXQ7CisgIGZyaWVuZCBjbGFzcyBBdHRyaWJ1dGVTZXROb2RlOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHk+IGZyaWVuZCBzdHJ1Y3QgRGVuc2VNYXBJbmZvOworCisgIC8vLyBcYnJpZWYgVGhlIGF0dHJpYnV0ZXMgdGhhdCB3ZSBhcmUgbWFuYWdpbmcuIFRoaXMgY2FuIGJlIG51bGwgdG8gcmVwcmVzZW50CisgIC8vLyB0aGUgZW1wdHkgYXR0cmlidXRlcyBsaXN0LgorICBBdHRyaWJ1dGVMaXN0SW1wbCAqcEltcGwgPSBudWxscHRyOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIEF0dHJpYnV0ZUxpc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gaXQuCisgIHN0YXRpYyBBdHRyaWJ1dGVMaXN0IGdldChMTFZNQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHN0ZDo6cGFpcjx1bnNpZ25lZCwgQXR0cmlidXRlPj4gQXR0cnMpOworICBzdGF0aWMgQXR0cmlidXRlTGlzdCBnZXQoTExWTUNvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxzdGQ6OnBhaXI8dW5zaWduZWQsIEF0dHJpYnV0ZVNldD4+IEF0dHJzKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhbiBBdHRyaWJ1dGVMaXN0IGZyb20gYXR0cmlidXRlIHNldHMgZm9yIGEgZnVuY3Rpb24sIGl0cworICAvLy8gcmV0dXJuIHZhbHVlLCBhbmQgYWxsIG9mIGl0cyBhcmd1bWVudHMuCisgIHN0YXRpYyBBdHRyaWJ1dGVMaXN0IGdldChMTFZNQ29udGV4dCAmQywgQXR0cmlidXRlU2V0IEZuQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVTZXQgUmV0QXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxBdHRyaWJ1dGVTZXQ+IEFyZ0F0dHJzKTsKKworcHJpdmF0ZToKKyAgZXhwbGljaXQgQXR0cmlidXRlTGlzdChBdHRyaWJ1dGVMaXN0SW1wbCAqTEkpIDogcEltcGwoTEkpIHt9CisKKyAgc3RhdGljIEF0dHJpYnV0ZUxpc3QgZ2V0SW1wbChMTFZNQ29udGV4dCAmQywgQXJyYXlSZWY8QXR0cmlidXRlU2V0PiBBdHRyU2V0cyk7CisKK3B1YmxpYzoKKyAgQXR0cmlidXRlTGlzdCgpID0gZGVmYXVsdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQXR0cmlidXRlTGlzdCBDb25zdHJ1Y3Rpb24gYW5kIE11dGF0aW9uCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGFuIEF0dHJpYnV0ZUxpc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gaXQuCisgIHN0YXRpYyBBdHRyaWJ1dGVMaXN0IGdldChMTFZNQ29udGV4dCAmQywgQXJyYXlSZWY8QXR0cmlidXRlTGlzdD4gQXR0cnMpOworICBzdGF0aWMgQXR0cmlidXRlTGlzdCBnZXQoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8QXR0cmlidXRlOjpBdHRyS2luZD4gS2luZHMpOworICBzdGF0aWMgQXR0cmlidXRlTGlzdCBnZXQoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U3RyaW5nUmVmPiBLaW5kKTsKKyAgc3RhdGljIEF0dHJpYnV0ZUxpc3QgZ2V0KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJCdWlsZGVyICZCKTsKKworICAvLy8gXGJyaWVmIEFkZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGF0dHJpYnV0ZSBzZXQgYXQgdGhlIGdpdmVuIGluZGV4LgorICAvLy8gUmV0dXJucyBhIG5ldyBsaXN0IGJlY2F1c2UgYXR0cmlidXRlIGxpc3RzIGFyZSBpbW11dGFibGUuCisgIEF0dHJpYnV0ZUxpc3QgYWRkQXR0cmlidXRlKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEFkZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGF0dHJpYnV0ZSBzZXQgYXQgdGhlIGdpdmVuIGluZGV4LgorICAvLy8gUmV0dXJucyBhIG5ldyBsaXN0IGJlY2F1c2UgYXR0cmlidXRlIGxpc3RzIGFyZSBpbW11dGFibGUuCisgIEF0dHJpYnV0ZUxpc3QgYWRkQXR0cmlidXRlKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBJbmRleCwgU3RyaW5nUmVmIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBWYWx1ZSA9IFN0cmluZ1JlZigpKSBjb25zdDsKKworICAvLy8gQWRkIGFuIGF0dHJpYnV0ZSB0byB0aGUgYXR0cmlidXRlIHNldCBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgIC8vLyBSZXR1cm5zIGEgbmV3IGxpc3QgYmVjYXVzZSBhdHRyaWJ1dGUgbGlzdHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlTGlzdCBhZGRBdHRyaWJ1dGUoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEluZGV4LCBBdHRyaWJ1dGUgQSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBBZGQgYXR0cmlidXRlcyB0byB0aGUgYXR0cmlidXRlIHNldCBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgIC8vLyBSZXR1cm5zIGEgbmV3IGxpc3QgYmVjYXVzZSBhdHRyaWJ1dGUgbGlzdHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlTGlzdCBhZGRBdHRyaWJ1dGVzKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJCdWlsZGVyICZCKSBjb25zdDsKKworICAvLy8gQWRkIGFuIGFyZ3VtZW50IGF0dHJpYnV0ZSB0byB0aGUgbGlzdC4gUmV0dXJucyBhIG5ldyBsaXN0IGJlY2F1c2UKKyAgLy8vIGF0dHJpYnV0ZSBsaXN0cyBhcmUgaW1tdXRhYmxlLgorICBBdHRyaWJ1dGVMaXN0IGFkZFBhcmFtQXR0cmlidXRlKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBcmdObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gYWRkQXR0cmlidXRlKEMsIEFyZ05vICsgRmlyc3RBcmdJbmRleCwgS2luZCk7CisgIH0KKworICAvLy8gQWRkIGFuIGFyZ3VtZW50IGF0dHJpYnV0ZSB0byB0aGUgbGlzdC4gUmV0dXJucyBhIG5ldyBsaXN0IGJlY2F1c2UKKyAgLy8vIGF0dHJpYnV0ZSBsaXN0cyBhcmUgaW1tdXRhYmxlLgorICBBdHRyaWJ1dGVMaXN0IGFkZFBhcmFtQXR0cmlidXRlKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBcmdObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVmFsdWUgPSBTdHJpbmdSZWYoKSkgY29uc3QgeworICAgIHJldHVybiBhZGRBdHRyaWJ1dGUoQywgQXJnTm8gKyBGaXJzdEFyZ0luZGV4LCBLaW5kLCBWYWx1ZSk7CisgIH0KKworICAvLy8gQWRkIGFuIGF0dHJpYnV0ZSB0byB0aGUgYXR0cmlidXRlIGxpc3QgYXQgdGhlIGdpdmVuIGFyZyBpbmRpY2VzLiBSZXR1cm5zIGEKKyAgLy8vIG5ldyBsaXN0IGJlY2F1c2UgYXR0cmlidXRlIGxpc3RzIGFyZSBpbW11dGFibGUuCisgIEF0dHJpYnV0ZUxpc3QgYWRkUGFyYW1BdHRyaWJ1dGUoTExWTUNvbnRleHQgJkMsIEFycmF5UmVmPHVuc2lnbmVkPiBBcmdOb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIEEpIGNvbnN0OworCisgIC8vLyBBZGQgYW4gYXJndW1lbnQgYXR0cmlidXRlIHRvIHRoZSBsaXN0LiBSZXR1cm5zIGEgbmV3IGxpc3QgYmVjYXVzZQorICAvLy8gYXR0cmlidXRlIGxpc3RzIGFyZSBpbW11dGFibGUuCisgIEF0dHJpYnV0ZUxpc3QgYWRkUGFyYW1BdHRyaWJ1dGVzKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBcmdObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0ckJ1aWxkZXIgJkIpIGNvbnN0IHsKKyAgICByZXR1cm4gYWRkQXR0cmlidXRlcyhDLCBBcmdObyArIEZpcnN0QXJnSW5kZXgsIEIpOworICB9CisKKyAgLy8vIFxicmllZiBSZW1vdmUgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBmcm9tIHRoaXMKKyAgLy8vIGF0dHJpYnV0ZSBsaXN0LiBSZXR1cm5zIGEgbmV3IGxpc3QgYmVjYXVzZSBhdHRyaWJ1dGUgbGlzdHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlTGlzdCByZW1vdmVBdHRyaWJ1dGUoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGlzCisgIC8vLyBhdHRyaWJ1dGUgbGlzdC4gUmV0dXJucyBhIG5ldyBsaXN0IGJlY2F1c2UgYXR0cmlidXRlIGxpc3RzIGFyZSBpbW11dGFibGUuCisgIEF0dHJpYnV0ZUxpc3QgcmVtb3ZlQXR0cmlidXRlKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEtpbmQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlcyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhpcworICAvLy8gYXR0cmlidXRlIGxpc3QuIFJldHVybnMgYSBuZXcgbGlzdCBiZWNhdXNlIGF0dHJpYnV0ZSBsaXN0cyBhcmUgaW1tdXRhYmxlLgorICBBdHRyaWJ1dGVMaXN0IHJlbW92ZUF0dHJpYnV0ZXMoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0ckJ1aWxkZXIgJkF0dHJzVG9SZW1vdmUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmVtb3ZlIGFsbCBhdHRyaWJ1dGVzIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGlzCisgIC8vLyBhdHRyaWJ1dGUgbGlzdC4gUmV0dXJucyBhIG5ldyBsaXN0IGJlY2F1c2UgYXR0cmlidXRlIGxpc3RzIGFyZSBpbW11dGFibGUuCisgIEF0dHJpYnV0ZUxpc3QgcmVtb3ZlQXR0cmlidXRlcyhMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgSW5kZXgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGF0IHRoZSBzcGVjaWZpZWQgYXJnIGluZGV4IGZyb20gdGhpcworICAvLy8gYXR0cmlidXRlIGxpc3QuIFJldHVybnMgYSBuZXcgbGlzdCBiZWNhdXNlIGF0dHJpYnV0ZSBsaXN0cyBhcmUgaW1tdXRhYmxlLgorICBBdHRyaWJ1dGVMaXN0IHJlbW92ZVBhcmFtQXR0cmlidXRlKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBcmdObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVtb3ZlQXR0cmlidXRlKEMsIEFyZ05vICsgRmlyc3RBcmdJbmRleCwgS2luZCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBhdCB0aGUgc3BlY2lmaWVkIGFyZyBpbmRleCBmcm9tIHRoaXMKKyAgLy8vIGF0dHJpYnV0ZSBsaXN0LiBSZXR1cm5zIGEgbmV3IGxpc3QgYmVjYXVzZSBhdHRyaWJ1dGUgbGlzdHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlTGlzdCByZW1vdmVQYXJhbUF0dHJpYnV0ZShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQXJnTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVtb3ZlQXR0cmlidXRlKEMsIEFyZ05vICsgRmlyc3RBcmdJbmRleCwgS2luZCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBhdCB0aGUgc3BlY2lmaWVkIGFyZyBpbmRleCBmcm9tIHRoaXMKKyAgLy8vIGF0dHJpYnV0ZSBsaXN0LiBSZXR1cm5zIGEgbmV3IGxpc3QgYmVjYXVzZSBhdHRyaWJ1dGUgbGlzdHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlTGlzdCByZW1vdmVQYXJhbUF0dHJpYnV0ZXMoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFyZ05vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyQnVpbGRlciAmQXR0cnNUb1JlbW92ZSkgY29uc3QgeworICAgIHJldHVybiByZW1vdmVBdHRyaWJ1dGVzKEMsIEFyZ05vICsgRmlyc3RBcmdJbmRleCwgQXR0cnNUb1JlbW92ZSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlbW92ZSBhbGwgYXR0cmlidXRlcyBhdCB0aGUgc3BlY2lmaWVkIGFyZyBpbmRleCBmcm9tIHRoaXMKKyAgLy8vIGF0dHJpYnV0ZSBsaXN0LiBSZXR1cm5zIGEgbmV3IGxpc3QgYmVjYXVzZSBhdHRyaWJ1dGUgbGlzdHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlTGlzdCByZW1vdmVQYXJhbUF0dHJpYnV0ZXMoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFyZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIHJlbW92ZUF0dHJpYnV0ZXMoQywgQXJnTm8gKyBGaXJzdEFyZ0luZGV4KTsKKyAgfQorCisgIC8vLyBcQnJpZWYgQWRkIHRoZSBkZXJlZmVyZW5jZWFibGUgYXR0cmlidXRlIHRvIHRoZSBhdHRyaWJ1dGUgc2V0IGF0IHRoZSBnaXZlbgorICAvLy8gaW5kZXguIFJldHVybnMgYSBuZXcgbGlzdCBiZWNhdXNlIGF0dHJpYnV0ZSBsaXN0cyBhcmUgaW1tdXRhYmxlLgorICBBdHRyaWJ1dGVMaXN0IGFkZERlcmVmZXJlbmNlYWJsZUF0dHIoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQnl0ZXMpIGNvbnN0OworCisgIC8vLyBcQnJpZWYgQWRkIHRoZSBkZXJlZmVyZW5jZWFibGUgYXR0cmlidXRlIHRvIHRoZSBhdHRyaWJ1dGUgc2V0IGF0IHRoZSBnaXZlbgorICAvLy8gYXJnIGluZGV4LiBSZXR1cm5zIGEgbmV3IGxpc3QgYmVjYXVzZSBhdHRyaWJ1dGUgbGlzdHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlTGlzdCBhZGREZXJlZmVyZW5jZWFibGVQYXJhbUF0dHIoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFyZ05vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBCeXRlcykgY29uc3QgeworICAgIHJldHVybiBhZGREZXJlZmVyZW5jZWFibGVBdHRyKEMsIEFyZ05vICsgRmlyc3RBcmdJbmRleCwgQnl0ZXMpOworICB9CisKKyAgLy8vIFxicmllZiBBZGQgdGhlIGRlcmVmZXJlbmNlYWJsZV9vcl9udWxsIGF0dHJpYnV0ZSB0byB0aGUgYXR0cmlidXRlIHNldCBhdAorICAvLy8gdGhlIGdpdmVuIGluZGV4LiBSZXR1cm5zIGEgbmV3IGxpc3QgYmVjYXVzZSBhdHRyaWJ1dGUgbGlzdHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlTGlzdCBhZGREZXJlZmVyZW5jZWFibGVPck51bGxBdHRyKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEJ5dGVzKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEFkZCB0aGUgZGVyZWZlcmVuY2VhYmxlX29yX251bGwgYXR0cmlidXRlIHRvIHRoZSBhdHRyaWJ1dGUgc2V0IGF0CisgIC8vLyB0aGUgZ2l2ZW4gYXJnIGluZGV4LiBSZXR1cm5zIGEgbmV3IGxpc3QgYmVjYXVzZSBhdHRyaWJ1dGUgbGlzdHMgYXJlCisgIC8vLyBpbW11dGFibGUuCisgIEF0dHJpYnV0ZUxpc3QgYWRkRGVyZWZlcmVuY2VhYmxlT3JOdWxsUGFyYW1BdHRyKExMVk1Db250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBcmdObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQnl0ZXMpIGNvbnN0IHsKKyAgICByZXR1cm4gYWRkRGVyZWZlcmVuY2VhYmxlT3JOdWxsQXR0cihDLCBBcmdObyArIEZpcnN0QXJnSW5kZXgsIEJ5dGVzKTsKKyAgfQorCisgIC8vLyBBZGQgdGhlIGFsbG9jc2l6ZSBhdHRyaWJ1dGUgdG8gdGhlIGF0dHJpYnV0ZSBzZXQgYXQgdGhlIGdpdmVuIGluZGV4LgorICAvLy8gUmV0dXJucyBhIG5ldyBsaXN0IGJlY2F1c2UgYXR0cmlidXRlIGxpc3RzIGFyZSBpbW11dGFibGUuCisgIEF0dHJpYnV0ZUxpc3QgYWRkQWxsb2NTaXplQXR0cihMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFbGVtU2l6ZUFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbmFsPHVuc2lnbmVkPiAmTnVtRWxlbXNBcmcpOworCisgIC8vLyBBZGQgdGhlIGFsbG9jc2l6ZSBhdHRyaWJ1dGUgdG8gdGhlIGF0dHJpYnV0ZSBzZXQgYXQgdGhlIGdpdmVuIGFyZyBpbmRleC4KKyAgLy8vIFJldHVybnMgYSBuZXcgbGlzdCBiZWNhdXNlIGF0dHJpYnV0ZSBsaXN0cyBhcmUgaW1tdXRhYmxlLgorICBBdHRyaWJ1dGVMaXN0IGFkZEFsbG9jU2l6ZVBhcmFtQXR0cihMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQXJnTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEVsZW1TaXplQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25hbDx1bnNpZ25lZD4gJk51bUVsZW1zQXJnKSB7CisgICAgcmV0dXJuIGFkZEFsbG9jU2l6ZUF0dHIoQywgQXJnTm8gKyBGaXJzdEFyZ0luZGV4LCBFbGVtU2l6ZUFyZywgTnVtRWxlbXNBcmcpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEF0dHJpYnV0ZUxpc3QgQWNjZXNzb3JzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIExMVk0gY29udGV4dC4KKyAgTExWTUNvbnRleHQgJmdldENvbnRleHQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4IGFyZSByZXR1cm5lZC4KKyAgQXR0cmlidXRlU2V0IGdldEF0dHJpYnV0ZXModW5zaWduZWQgSW5kZXgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBhcmd1bWVudCBvciBwYXJhbWV0ZXIgYXQgdGhlIGdpdmVuIGluZGV4IGFyZQorICAvLy8gcmV0dXJuZWQuCisgIEF0dHJpYnV0ZVNldCBnZXRQYXJhbUF0dHJpYnV0ZXModW5zaWduZWQgQXJnTm8pIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSByZXQgdmFsdWUgYXJlIHJldHVybmVkLgorICBBdHRyaWJ1dGVTZXQgZ2V0UmV0QXR0cmlidXRlcygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVGhlIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgYXJlIHJldHVybmVkLgorICBBdHRyaWJ1dGVTZXQgZ2V0Rm5BdHRyaWJ1dGVzKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGV4aXN0cyBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgIGJvb2wgaGFzQXR0cmlidXRlKHVuc2lnbmVkIEluZGV4LCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGF0dHJpYnV0ZSBleGlzdHMgYXQgdGhlIGdpdmVuIGluZGV4LgorICBib29sIGhhc0F0dHJpYnV0ZSh1bnNpZ25lZCBJbmRleCwgU3RyaW5nUmVmIEtpbmQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgYXR0cmlidXRlIGV4aXN0cyBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgIGJvb2wgaGFzQXR0cmlidXRlcyh1bnNpZ25lZCBJbmRleCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGV4aXN0cyBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50CisgIGJvb2wgaGFzUGFyYW1BdHRyKHVuc2lnbmVkIEFyZ05vLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzQXR0cmlidXRlKEFyZ05vICsgRmlyc3RBcmdJbmRleCwgS2luZCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgZXhpc3RzIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnQKKyAgYm9vbCBoYXNQYXJhbUF0dHIodW5zaWduZWQgQXJnTm8sIFN0cmluZ1JlZiBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0F0dHJpYnV0ZShBcmdObyArIEZpcnN0QXJnSW5kZXgsIEtpbmQpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBhdHRyaWJ1dGVzIGV4aXN0cyBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50CisgIGJvb2wgaGFzUGFyYW1BdHRycyh1bnNpZ25lZCBBcmdObykgY29uc3QgeworICAgIHJldHVybiBoYXNBdHRyaWJ1dGVzKEFyZ05vICsgRmlyc3RBcmdJbmRleCk7CisgIH0KKworICAvLy8gXGJyaWVmIEVxdWl2YWxlbnQgdG8gaGFzQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEtpbmQpIGJ1dAorICAvLy8gbWF5IGJlIGZhc3Rlci4KKyAgYm9vbCBoYXNGbkF0dHJpYnV0ZShBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRXF1aXZhbGVudCB0byBoYXNBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgS2luZCkgYnV0CisgIC8vLyBtYXkgYmUgZmFzdGVyLgorICBib29sIGhhc0ZuQXR0cmlidXRlKFN0cmluZ1JlZiBLaW5kKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEVxdWl2YWxlbnQgdG8gaGFzQXR0cmlidXRlKEFyZ05vICsgRmlyc3RBcmdJbmRleCwgS2luZCkuCisgIGJvb2wgaGFzUGFyYW1BdHRyaWJ1dGUodW5zaWduZWQgQXJnTm8sIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBpcyBzZXQgZm9yIGF0IGxlYXN0IG9uZQorICAvLy8gcGFyYW1ldGVyIG9yIGZvciB0aGUgcmV0dXJuIHZhbHVlLiBJZiBJbmRleCBpcyBub3QgbnVsbHB0ciwgdGhlIGluZGV4CisgIC8vLyBvZiBhIHBhcmFtZXRlciB3aXRoIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGlzIHByb3ZpZGVkLgorICBib29sIGhhc0F0dHJTb21ld2hlcmUoQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKkluZGV4ID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBvYmplY3QgdGhhdCBleGlzdHMgYXQgdGhlIGdpdmVuIGluZGV4LgorICBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKHVuc2lnbmVkIEluZGV4LCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBhdHRyaWJ1dGUgb2JqZWN0IHRoYXQgZXhpc3RzIGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgQXR0cmlidXRlIGdldEF0dHJpYnV0ZSh1bnNpZ25lZCBJbmRleCwgU3RyaW5nUmVmIEtpbmQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBhdHRyaWJ1dGUgb2JqZWN0IHRoYXQgZXhpc3RzIGF0IHRoZSBhcmcgaW5kZXguCisgIEF0dHJpYnV0ZSBnZXRQYXJhbUF0dHIodW5zaWduZWQgQXJnTm8sIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3QgeworICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoQXJnTm8gKyBGaXJzdEFyZ0luZGV4LCBLaW5kKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBhdHRyaWJ1dGUgb2JqZWN0IHRoYXQgZXhpc3RzIGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgQXR0cmlidXRlIGdldFBhcmFtQXR0cih1bnNpZ25lZCBBcmdObywgU3RyaW5nUmVmIEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QXR0cmlidXRlKEFyZ05vICsgRmlyc3RBcmdJbmRleCwgS2luZCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgYWxpZ25tZW50IG9mIHRoZSByZXR1cm4gdmFsdWUuCisgIHVuc2lnbmVkIGdldFJldEFsaWdubWVudCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBhbGlnbm1lbnQgZm9yIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gcGFyYW1ldGVyLgorICB1bnNpZ25lZCBnZXRQYXJhbUFsaWdubWVudCh1bnNpZ25lZCBBcmdObykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHN0YWNrIGFsaWdubWVudC4KKyAgdW5zaWduZWQgZ2V0U3RhY2tBbGlnbm1lbnQodW5zaWduZWQgSW5kZXgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgZGVyZWZlcmVuY2VhYmxlIGJ5dGVzIChvciB6ZXJvIGlmIHVua25vd24pLgorICB1aW50NjRfdCBnZXREZXJlZmVyZW5jZWFibGVCeXRlcyh1bnNpZ25lZCBJbmRleCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG51bWJlciBvZiBkZXJlZmVyZW5jZWFibGUgYnl0ZXMgKG9yIHplcm8gaWYgdW5rbm93bikgb2YgYW4KKyAgLy8vIGFyZy4KKyAgdWludDY0X3QgZ2V0UGFyYW1EZXJlZmVyZW5jZWFibGVCeXRlcyh1bnNpZ25lZCBBcmdObykgY29uc3QgeworICAgIHJldHVybiBnZXREZXJlZmVyZW5jZWFibGVCeXRlcyhBcmdObyArIEZpcnN0QXJnSW5kZXgpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG51bWJlciBvZiBkZXJlZmVyZW5jZWFibGVfb3JfbnVsbCBieXRlcyAob3IgemVybyBpZgorICAvLy8gdW5rbm93bikuCisgIHVpbnQ2NF90IGdldERlcmVmZXJlbmNlYWJsZU9yTnVsbEJ5dGVzKHVuc2lnbmVkIEluZGV4KSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgbnVtYmVyIG9mIGRlcmVmZXJlbmNlYWJsZV9vcl9udWxsIGJ5dGVzIChvciB6ZXJvIGlmCisgIC8vLyB1bmtub3duKSBvZiBhbiBhcmcuCisgIHVpbnQ2NF90IGdldFBhcmFtRGVyZWZlcmVuY2VhYmxlT3JOdWxsQnl0ZXModW5zaWduZWQgQXJnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RGVyZWZlcmVuY2VhYmxlT3JOdWxsQnl0ZXMoQXJnTm8gKyBGaXJzdEFyZ0luZGV4KTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGFsbG9jc2l6ZSBhcmd1bWVudCBudW1iZXJzIChvciBwYWlyKDAsIDApIGlmIHVua25vd24pLgorICBzdGQ6OnBhaXI8dW5zaWduZWQsIE9wdGlvbmFsPHVuc2lnbmVkPj4KKyAgZ2V0QWxsb2NTaXplQXJncyh1bnNpZ25lZCBJbmRleCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGF0dHJpYnV0ZXMgYXQgdGhlIGluZGV4IGFzIGEgc3RyaW5nLgorICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZyh1bnNpZ25lZCBJbmRleCwgYm9vbCBJbkF0dHJHcnAgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEF0dHJpYnV0ZUxpc3QgSW50cm9zcGVjdGlvbgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICB1c2luZyBpdGVyYXRvciA9IGNvbnN0IEF0dHJpYnV0ZVNldCAqOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0OworCisgIHVuc2lnbmVkIGdldE51bUF0dHJTZXRzKCkgY29uc3Q7CisKKyAgLy8vIFVzZSB0aGVzZSB0byBpdGVyYXRlIG92ZXIgdGhlIHZhbGlkIGF0dHJpYnV0ZSBpbmRpY2VzLgorICB1bnNpZ25lZCBpbmRleF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXg7IH0KKyAgdW5zaWduZWQgaW5kZXhfZW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtQXR0clNldHMoKSAtIDE7IH0KKworICAvLy8gb3BlcmF0b3I9PS8hPSAtIFByb3ZpZGUgZXF1YWxpdHkgcHJlZGljYXRlcy4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEF0dHJpYnV0ZUxpc3QgJlJIUykgY29uc3QgeyByZXR1cm4gcEltcGwgPT0gUkhTLnBJbXBsOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBdHRyaWJ1dGVMaXN0ICZSSFMpIGNvbnN0IHsgcmV0dXJuIHBJbXBsICE9IFJIUy5wSW1wbDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgcmF3IHBvaW50ZXIgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgYXR0cmlidXRlIGxpc3QuCisgIHZvaWQgKmdldFJhd1BvaW50ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIHBJbXBsOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gYXR0cmlidXRlcy4KKyAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gcEltcGwgPT0gbnVsbHB0cjsgfQorCisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcY2xhc3MKKy8vLyBcYnJpZWYgUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIEF0dHJpYnV0ZUxpc3QuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPEF0dHJpYnV0ZUxpc3Q+IHsKKyAgc3RhdGljIEF0dHJpYnV0ZUxpc3QgZ2V0RW1wdHlLZXkoKSB7CisgICAgYXV0byBWYWwgPSBzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KC0xKTsKKyAgICBWYWwgPDw9IFBvaW50ZXJMaWtlVHlwZVRyYWl0czx2b2lkKj46Ok51bUxvd0JpdHNBdmFpbGFibGU7CisgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3QocmVpbnRlcnByZXRfY2FzdDxBdHRyaWJ1dGVMaXN0SW1wbCAqPihWYWwpKTsKKyAgfQorCisgIHN0YXRpYyBBdHRyaWJ1dGVMaXN0IGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICBhdXRvIFZhbCA9IHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oLTIpOworICAgIFZhbCA8PD0gUG9pbnRlckxpa2VUeXBlVHJhaXRzPHZvaWQqPjo6TnVtTG93Qml0c0F2YWlsYWJsZTsKKyAgICByZXR1cm4gQXR0cmlidXRlTGlzdChyZWludGVycHJldF9jYXN0PEF0dHJpYnV0ZUxpc3RJbXBsICo+KFZhbCkpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShBdHRyaWJ1dGVMaXN0IEFTKSB7CisgICAgcmV0dXJuICh1bnNpZ25lZCgodWludHB0cl90KUFTLnBJbXBsKSA+PiA0KSBeCisgICAgICAgICAgICh1bnNpZ25lZCgodWludHB0cl90KUFTLnBJbXBsKSA+PiA5KTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoQXR0cmlidXRlTGlzdCBMSFMsIEF0dHJpYnV0ZUxpc3QgUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGNsYXNzCisvLy8gXGJyaWVmIFRoaXMgY2xhc3MgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBBdHRyaWJ1dGU6OmdldCBtZXRob2QgdG8KKy8vLyBjcmVhdGUgYW4gQXR0cmlidXRlIG9iamVjdC4gVGhlIG9iamVjdCBpdHNlbGYgaXMgdW5pcXVpZmllZC4gVGhlIEJ1aWxkZXIncworLy8vIHZhbHVlLCBob3dldmVyLCBpcyBub3QuIFNvIHRoaXMgY2FuIGJlIHVzZWQgYXMgYSBxdWljayB3YXkgdG8gdGVzdCBmb3IKKy8vLyBlcXVhbGl0eSwgcHJlc2VuY2Ugb2YgYXR0cmlidXRlcywgZXRjLgorY2xhc3MgQXR0ckJ1aWxkZXIgeworICBzdGQ6OmJpdHNldDxBdHRyaWJ1dGU6OkVuZEF0dHJLaW5kcz4gQXR0cnM7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gVGFyZ2V0RGVwQXR0cnM7CisgIHVpbnQ2NF90IEFsaWdubWVudCA9IDA7CisgIHVpbnQ2NF90IFN0YWNrQWxpZ25tZW50ID0gMDsKKyAgdWludDY0X3QgRGVyZWZCeXRlcyA9IDA7CisgIHVpbnQ2NF90IERlcmVmT3JOdWxsQnl0ZXMgPSAwOworICB1aW50NjRfdCBBbGxvY1NpemVBcmdzID0gMDsKKworcHVibGljOgorICBBdHRyQnVpbGRlcigpID0gZGVmYXVsdDsKKworICBBdHRyQnVpbGRlcihjb25zdCBBdHRyaWJ1dGUgJkEpIHsKKyAgICBhZGRBdHRyaWJ1dGUoQSk7CisgIH0KKworICBBdHRyQnVpbGRlcihBdHRyaWJ1dGVMaXN0IEFTLCB1bnNpZ25lZCBJZHgpOworICBBdHRyQnVpbGRlcihBdHRyaWJ1dGVTZXQgQVMpOworCisgIHZvaWQgY2xlYXIoKTsKKworICAvLy8gXGJyaWVmIEFkZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGJ1aWxkZXIuCisgIEF0dHJCdWlsZGVyICZhZGRBdHRyaWJ1dGUoQXR0cmlidXRlOjpBdHRyS2luZCBWYWwpOworCisgIC8vLyBcYnJpZWYgQWRkIHRoZSBBdHRyaWJ1dGUgb2JqZWN0IHRvIHRoZSBidWlsZGVyLgorICBBdHRyQnVpbGRlciAmYWRkQXR0cmlidXRlKEF0dHJpYnV0ZSBBKTsKKworICAvLy8gXGJyaWVmIEFkZCB0aGUgdGFyZ2V0LWRlcGVuZGVudCBhdHRyaWJ1dGUgdG8gdGhlIGJ1aWxkZXIuCisgIEF0dHJCdWlsZGVyICZhZGRBdHRyaWJ1dGUoU3RyaW5nUmVmIEEsIFN0cmluZ1JlZiBWID0gU3RyaW5nUmVmKCkpOworCisgIC8vLyBcYnJpZWYgUmVtb3ZlIGFuIGF0dHJpYnV0ZSBmcm9tIHRoZSBidWlsZGVyLgorICBBdHRyQnVpbGRlciAmcmVtb3ZlQXR0cmlidXRlKEF0dHJpYnV0ZTo6QXR0cktpbmQgVmFsKTsKKworICAvLy8gXGJyaWVmIFJlbW92ZSB0aGUgYXR0cmlidXRlcyBmcm9tIHRoZSBidWlsZGVyLgorICBBdHRyQnVpbGRlciAmcmVtb3ZlQXR0cmlidXRlcyhBdHRyaWJ1dGVMaXN0IEEsIHVpbnQ2NF90IFdpdGhvdXRJbmRleCk7CisKKyAgLy8vIFxicmllZiBSZW1vdmUgdGhlIHRhcmdldC1kZXBlbmRlbnQgYXR0cmlidXRlIHRvIHRoZSBidWlsZGVyLgorICBBdHRyQnVpbGRlciAmcmVtb3ZlQXR0cmlidXRlKFN0cmluZ1JlZiBBKTsKKworICAvLy8gXGJyaWVmIEFkZCB0aGUgYXR0cmlidXRlcyBmcm9tIHRoZSBidWlsZGVyLgorICBBdHRyQnVpbGRlciAmbWVyZ2UoY29uc3QgQXR0ckJ1aWxkZXIgJkIpOworCisgIC8vLyBcYnJpZWYgUmVtb3ZlIHRoZSBhdHRyaWJ1dGVzIGZyb20gdGhlIGJ1aWxkZXIuCisgIEF0dHJCdWlsZGVyICZyZW1vdmUoY29uc3QgQXR0ckJ1aWxkZXIgJkIpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGJ1aWxkZXIgaGFzIGFueSBhdHRyaWJ1dGUgdGhhdCdzIGluIHRoZQorICAvLy8gc3BlY2lmaWVkIGJ1aWxkZXIuCisgIGJvb2wgb3ZlcmxhcHMoY29uc3QgQXR0ckJ1aWxkZXIgJkIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGJ1aWxkZXIgaGFzIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlLgorICBib29sIGNvbnRhaW5zKEF0dHJpYnV0ZTo6QXR0cktpbmQgQSkgY29uc3QgeworICAgIGFzc2VydCgodW5zaWduZWQpQSA8IEF0dHJpYnV0ZTo6RW5kQXR0cktpbmRzICYmICJBdHRyaWJ1dGUgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBBdHRyc1tBXTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGJ1aWxkZXIgaGFzIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LWRlcGVuZGVudAorICAvLy8gYXR0cmlidXRlLgorICBib29sIGNvbnRhaW5zKFN0cmluZ1JlZiBBKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBidWlsZGVyIGhhcyBJUi1sZXZlbCBhdHRyaWJ1dGVzLgorICBib29sIGhhc0F0dHJpYnV0ZXMoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBidWlsZGVyIGhhcyBhbnkgYXR0cmlidXRlIHRoYXQncyBpbiB0aGUKKyAgLy8vIHNwZWNpZmllZCBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzQXR0cmlidXRlcyhBdHRyaWJ1dGVMaXN0IEEsIHVpbnQ2NF90IEluZGV4KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBidWlsZGVyIGhhcyBhbiBhbGlnbm1lbnQgYXR0cmlidXRlLgorICBib29sIGhhc0FsaWdubWVudEF0dHIoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBhbGlnbm1lbnQgYXR0cmlidXRlLCBpZiBpdCBleGlzdHMuCisgIHVpbnQ2NF90IGdldEFsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIEFsaWdubWVudDsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHN0YWNrIGFsaWdubWVudCBhdHRyaWJ1dGUsIGlmIGl0IGV4aXN0cy4KKyAgdWludDY0X3QgZ2V0U3RhY2tBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBTdGFja0FsaWdubWVudDsgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG51bWJlciBvZiBkZXJlZmVyZW5jZWFibGUgYnl0ZXMsIGlmIHRoZQorICAvLy8gZGVyZWZlcmVuY2VhYmxlIGF0dHJpYnV0ZSBleGlzdHMgKHplcm8gaXMgcmV0dXJuZWQgb3RoZXJ3aXNlKS4KKyAgdWludDY0X3QgZ2V0RGVyZWZlcmVuY2VhYmxlQnl0ZXMoKSBjb25zdCB7IHJldHVybiBEZXJlZkJ5dGVzOyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIGRlcmVmZXJlbmNlYWJsZV9vcl9udWxsIGJ5dGVzLCBpZiB0aGUKKyAgLy8vIGRlcmVmZXJlbmNlYWJsZV9vcl9udWxsIGF0dHJpYnV0ZSBleGlzdHMgKHplcm8gaXMgcmV0dXJuZWQgb3RoZXJ3aXNlKS4KKyAgdWludDY0X3QgZ2V0RGVyZWZlcmVuY2VhYmxlT3JOdWxsQnl0ZXMoKSBjb25zdCB7IHJldHVybiBEZXJlZk9yTnVsbEJ5dGVzOyB9CisKKyAgLy8vIFJldHJpZXZlIHRoZSBhbGxvY3NpemUgYXJncywgaWYgdGhlIGFsbG9jc2l6ZSBhdHRyaWJ1dGUgZXhpc3RzLiAgSWYgaXQKKyAgLy8vIGRvZXNuJ3QgZXhpc3QsIHBhaXIoMCwgMCkgaXMgcmV0dXJuZWQuCisgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgT3B0aW9uYWw8dW5zaWduZWQ+PiBnZXRBbGxvY1NpemVBcmdzKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUaGlzIHR1cm5zIGFuIGludCBhbGlnbm1lbnQgKHdoaWNoIG11c3QgYmUgYSBwb3dlciBvZiAyKSBpbnRvIHRoZQorICAvLy8gZm9ybSB1c2VkIGludGVybmFsbHkgaW4gQXR0cmlidXRlLgorICBBdHRyQnVpbGRlciAmYWRkQWxpZ25tZW50QXR0cih1bnNpZ25lZCBBbGlnbik7CisKKyAgLy8vIFxicmllZiBUaGlzIHR1cm5zIGFuIGludCBzdGFjayBhbGlnbm1lbnQgKHdoaWNoIG11c3QgYmUgYSBwb3dlciBvZiAyKSBpbnRvCisgIC8vLyB0aGUgZm9ybSB1c2VkIGludGVybmFsbHkgaW4gQXR0cmlidXRlLgorICBBdHRyQnVpbGRlciAmYWRkU3RhY2tBbGlnbm1lbnRBdHRyKHVuc2lnbmVkIEFsaWduKTsKKworICAvLy8gXGJyaWVmIFRoaXMgdHVybnMgdGhlIG51bWJlciBvZiBkZXJlZmVyZW5jZWFibGUgYnl0ZXMgaW50byB0aGUgZm9ybSB1c2VkCisgIC8vLyBpbnRlcm5hbGx5IGluIEF0dHJpYnV0ZS4KKyAgQXR0ckJ1aWxkZXIgJmFkZERlcmVmZXJlbmNlYWJsZUF0dHIodWludDY0X3QgQnl0ZXMpOworCisgIC8vLyBcYnJpZWYgVGhpcyB0dXJucyB0aGUgbnVtYmVyIG9mIGRlcmVmZXJlbmNlYWJsZV9vcl9udWxsIGJ5dGVzIGludG8gdGhlCisgIC8vLyBmb3JtIHVzZWQgaW50ZXJuYWxseSBpbiBBdHRyaWJ1dGUuCisgIEF0dHJCdWlsZGVyICZhZGREZXJlZmVyZW5jZWFibGVPck51bGxBdHRyKHVpbnQ2NF90IEJ5dGVzKTsKKworICAvLy8gVGhpcyB0dXJucyBvbmUgKG9yIHR3bykgaW50cyBpbnRvIHRoZSBmb3JtIHVzZWQgaW50ZXJuYWxseSBpbiBBdHRyaWJ1dGUuCisgIEF0dHJCdWlsZGVyICZhZGRBbGxvY1NpemVBdHRyKHVuc2lnbmVkIEVsZW1TaXplQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25hbDx1bnNpZ25lZD4gJk51bUVsZW1zQXJnKTsKKworICAvLy8gQWRkIGFuIGFsbG9jc2l6ZSBhdHRyaWJ1dGUsIHVzaW5nIHRoZSByZXByZXNlbnRhdGlvbiByZXR1cm5lZCBieQorICAvLy8gQXR0cmlidXRlLmdldEludFZhbHVlKCkuCisgIEF0dHJCdWlsZGVyICZhZGRBbGxvY1NpemVBdHRyRnJvbVJhd1JlcHIodWludDY0X3QgUmF3QWxsb2NTaXplUmVwcik7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYnVpbGRlciBjb250YWlucyBubyB0YXJnZXQtaW5kZXBlbmRlbnQKKyAgLy8vIGF0dHJpYnV0ZXMuCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBBdHRycy5ub25lKCk7IH0KKworICAvLyBJdGVyYXRvcnMgZm9yIHRhcmdldC1kZXBlbmRlbnQgYXR0cmlidXRlcy4KKyAgdXNpbmcgdGRfdHlwZSA9IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OworICB1c2luZyB0ZF9pdGVyYXRvciA9IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46Oml0ZXJhdG9yOworICB1c2luZyB0ZF9jb25zdF9pdGVyYXRvciA9IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyB0ZF9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPHRkX2l0ZXJhdG9yPjsKKyAgdXNpbmcgdGRfY29uc3RfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTx0ZF9jb25zdF9pdGVyYXRvcj47CisKKyAgdGRfaXRlcmF0b3IgdGRfYmVnaW4oKSB7IHJldHVybiBUYXJnZXREZXBBdHRycy5iZWdpbigpOyB9CisgIHRkX2l0ZXJhdG9yIHRkX2VuZCgpIHsgcmV0dXJuIFRhcmdldERlcEF0dHJzLmVuZCgpOyB9CisKKyAgdGRfY29uc3RfaXRlcmF0b3IgdGRfYmVnaW4oKSBjb25zdCB7IHJldHVybiBUYXJnZXREZXBBdHRycy5iZWdpbigpOyB9CisgIHRkX2NvbnN0X2l0ZXJhdG9yIHRkX2VuZCgpIGNvbnN0IHsgcmV0dXJuIFRhcmdldERlcEF0dHJzLmVuZCgpOyB9CisKKyAgdGRfcmFuZ2UgdGRfYXR0cnMoKSB7IHJldHVybiB0ZF9yYW5nZSh0ZF9iZWdpbigpLCB0ZF9lbmQoKSk7IH0KKworICB0ZF9jb25zdF9yYW5nZSB0ZF9hdHRycygpIGNvbnN0IHsKKyAgICByZXR1cm4gdGRfY29uc3RfcmFuZ2UodGRfYmVnaW4oKSwgdGRfZW5kKCkpOworICB9CisKKyAgYm9vbCB0ZF9lbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFRhcmdldERlcEF0dHJzLmVtcHR5KCk7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQXR0ckJ1aWxkZXIgJkIpOworICBib29sIG9wZXJhdG9yIT0oY29uc3QgQXR0ckJ1aWxkZXIgJkIpIHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBCKTsKKyAgfQorfTsKKworbmFtZXNwYWNlIEF0dHJpYnV0ZUZ1bmNzIHsKKworLy8vIFxicmllZiBXaGljaCBhdHRyaWJ1dGVzIGNhbm5vdCBiZSBhcHBsaWVkIHRvIGEgdHlwZS4KK0F0dHJCdWlsZGVyIHR5cGVJbmNvbXBhdGlibGUoVHlwZSAqVHkpOworCisvLy8gXHJldHVybnMgUmV0dXJuIHRydWUgaWYgdGhlIHR3byBmdW5jdGlvbnMgaGF2ZSBjb21wYXRpYmxlIHRhcmdldC1pbmRlcGVuZGVudAorLy8vIGF0dHJpYnV0ZXMgZm9yIGlubGluaW5nIHB1cnBvc2VzLgorYm9vbCBhcmVJbmxpbmVDb21wYXRpYmxlKGNvbnN0IEZ1bmN0aW9uICZDYWxsZXIsIGNvbnN0IEZ1bmN0aW9uICZDYWxsZWUpOworCisvLy8gXGJyaWVmIE1lcmdlIGNhbGxlcidzIGFuZCBjYWxsZWUncyBhdHRyaWJ1dGVzLgordm9pZCBtZXJnZUF0dHJpYnV0ZXNGb3JJbmxpbmluZyhGdW5jdGlvbiAmQ2FsbGVyLCBjb25zdCBGdW5jdGlvbiAmQ2FsbGVlKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEF0dHJpYnV0ZUZ1bmNzCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0FUVFJJQlVURVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9BdHRyaWJ1dGVzLnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9BdHRyaWJ1dGVzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NGYwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0F0dHJpYnV0ZXMudGQKQEAgLTAsMCArMSwyMzMgQEAKKy8vLyBBdHRyaWJ1dGUgYmFzZSBjbGFzcy4KK2NsYXNzIEF0dHI8c3RyaW5nIFM+IHsKKyAgLy8gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYXR0cmlidXRlIGluIHRoZSBJUi4KKyAgc3RyaW5nIEF0dHJTdHJpbmcgPSBTOworfQorCisvLy8gRW51bSBhdHRyaWJ1dGUuCitjbGFzcyBFbnVtQXR0cjxzdHJpbmcgUz4gOiBBdHRyPFM+OworCisvLy8gU3RyaW5nQm9vbCBhdHRyaWJ1dGUuCitjbGFzcyBTdHJCb29sQXR0cjxzdHJpbmcgUz4gOiBBdHRyPFM+OworCisvLy8gVGFyZ2V0LWluZGVwZW5kZW50IGVudW0gYXR0cmlidXRlcy4KKworLy8vIEFsaWdubWVudCBvZiBwYXJhbWV0ZXIgKDUgYml0cykgc3RvcmVkIGFzIGxvZzIgb2YgYWxpZ25tZW50IHdpdGggKzEgYmlhcy4KKy8vLyAwIG1lYW5zIHVuYWxpZ25lZCAoZGlmZmVyZW50IGZyb20gYWxpZ24oMSkpLgorZGVmIEFsaWdubWVudCA6IEVudW1BdHRyPCJhbGlnbiI+OworCisvLy8gVGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gaXMgZ3VhcmFudGVlZCB0byBwb2ludCB0byBhIG51bWJlciBvZiBieXRlcyB0aGF0CisvLy8gd2UgY2FuIGRldGVybWluZSBpZiB3ZSBrbm93IHRoZSB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24ncyBhcmd1bWVudHMuCitkZWYgQWxsb2NTaXplIDogRW51bUF0dHI8ImFsbG9jc2l6ZSI+OworCisvLy8gaW5saW5lPWFsd2F5cy4KK2RlZiBBbHdheXNJbmxpbmUgOiBFbnVtQXR0cjwiYWx3YXlzaW5saW5lIj47CisKKy8vLyBGdW5jdGlvbiBjYW4gYWNjZXNzIG1lbW9yeSBvbmx5IHVzaW5nIHBvaW50ZXJzIGJhc2VkIG9uIGl0cyBhcmd1bWVudHMuCitkZWYgQXJnTWVtT25seSA6IEVudW1BdHRyPCJhcmdtZW1vbmx5Ij47CisKKy8vLyBDYWxsZWUgaXMgcmVjb2duaXplZCBhcyBhIGJ1aWx0aW4sIGRlc3BpdGUgbm9idWlsdGluIGF0dHJpYnV0ZSBvbiBpdHMKKy8vLyBkZWNsYXJhdGlvbi4KK2RlZiBCdWlsdGluIDogRW51bUF0dHI8ImJ1aWx0aW4iPjsKKworLy8vIFBhc3Mgc3RydWN0dXJlIGJ5IHZhbHVlLgorZGVmIEJ5VmFsIDogRW51bUF0dHI8ImJ5dmFsIj47CisKKy8vLyBNYXJrcyBmdW5jdGlvbiBhcyBiZWluZyBpbiBhIGNvbGQgcGF0aC4KK2RlZiBDb2xkIDogRW51bUF0dHI8ImNvbGQiPjsKKworLy8vIENhbiBvbmx5IGJlIG1vdmVkIHRvIGNvbnRyb2wtZXF1aXZhbGVudCBibG9ja3MuCitkZWYgQ29udmVyZ2VudCA6IEVudW1BdHRyPCJjb252ZXJnZW50Ij47CisKKy8vLyBQb2ludGVyIGlzIGtub3duIHRvIGJlIGRlcmVmZXJlbmNlYWJsZS4KK2RlZiBEZXJlZmVyZW5jZWFibGUgOiBFbnVtQXR0cjwiZGVyZWZlcmVuY2VhYmxlIj47CisKKy8vLyBQb2ludGVyIGlzIGVpdGhlciBudWxsIG9yIGRlcmVmZXJlbmNlYWJsZS4KK2RlZiBEZXJlZmVyZW5jZWFibGVPck51bGwgOiBFbnVtQXR0cjwiZGVyZWZlcmVuY2VhYmxlX29yX251bGwiPjsKKworLy8vIEZ1bmN0aW9uIG1heSBvbmx5IGFjY2VzcyBtZW1vcnkgdGhhdCBpcyBpbmFjY2Vzc2libGUgZnJvbSBJUi4KK2RlZiBJbmFjY2Vzc2libGVNZW1Pbmx5IDogRW51bUF0dHI8ImluYWNjZXNzaWJsZW1lbW9ubHkiPjsKKworLy8vIEZ1bmN0aW9uIG1heSBvbmx5IGFjY2VzcyBtZW1vcnkgdGhhdCBpcyBlaXRoZXIgaW5hY2Nlc3NpYmxlIGZyb20gdGhlIElSLAorLy8vIG9yIHBvaW50ZWQgdG8gYnkgaXRzIHBvaW50ZXIgYXJndW1lbnRzLgorZGVmIEluYWNjZXNzaWJsZU1lbU9yQXJnTWVtT25seSA6IEVudW1BdHRyPCJpbmFjY2Vzc2libGVtZW1fb3JfYXJnbWVtb25seSI+OworCisvLy8gUGFzcyBzdHJ1Y3R1cmUgaW4gYW4gYWxsb2NhLgorZGVmIEluQWxsb2NhIDogRW51bUF0dHI8ImluYWxsb2NhIj47CisKKy8vLyBTb3VyY2Ugc2FpZCBpbmxpbmluZyB3YXMgZGVzaXJhYmxlLgorZGVmIElubGluZUhpbnQgOiBFbnVtQXR0cjwiaW5saW5laGludCI+OworCisvLy8gRm9yY2UgYXJndW1lbnQgdG8gYmUgcGFzc2VkIGluIHJlZ2lzdGVyLgorZGVmIEluUmVnIDogRW51bUF0dHI8ImlucmVnIj47CisKKy8vLyBCdWlsZCBqdW1wLWluc3RydWN0aW9uIHRhYmxlcyBhbmQgcmVwbGFjZSByZWZzLgorZGVmIEp1bXBUYWJsZSA6IEVudW1BdHRyPCJqdW1wdGFibGUiPjsKKworLy8vIEZ1bmN0aW9uIG11c3QgYmUgb3B0aW1pemVkIGZvciBzaXplIGZpcnN0LgorZGVmIE1pblNpemUgOiBFbnVtQXR0cjwibWluc2l6ZSI+OworCisvLy8gTmFrZWQgZnVuY3Rpb24uCitkZWYgTmFrZWQgOiBFbnVtQXR0cjwibmFrZWQiPjsKKworLy8vIE5lc3RlZCBmdW5jdGlvbiBzdGF0aWMgY2hhaW4uCitkZWYgTmVzdCA6IEVudW1BdHRyPCJuZXN0Ij47CisKKy8vLyBDb25zaWRlcmVkIHRvIG5vdCBhbGlhcyBhZnRlciBjYWxsLgorZGVmIE5vQWxpYXMgOiBFbnVtQXR0cjwibm9hbGlhcyI+OworCisvLy8gQ2FsbGVlIGlzbid0IHJlY29nbml6ZWQgYXMgYSBidWlsdGluLgorZGVmIE5vQnVpbHRpbiA6IEVudW1BdHRyPCJub2J1aWx0aW4iPjsKKworLy8vIEZ1bmN0aW9uIGNyZWF0ZXMgbm8gYWxpYXNlcyBvZiBwb2ludGVyLgorZGVmIE5vQ2FwdHVyZSA6IEVudW1BdHRyPCJub2NhcHR1cmUiPjsKKworLy8vIENhbGwgY2Fubm90IGJlIGR1cGxpY2F0ZWQuCitkZWYgTm9EdXBsaWNhdGUgOiBFbnVtQXR0cjwibm9kdXBsaWNhdGUiPjsKKworLy8vIERpc2FibGUgaW1wbGljaXQgZmxvYXRpbmcgcG9pbnQgaW5zdHMuCitkZWYgTm9JbXBsaWNpdEZsb2F0IDogRW51bUF0dHI8Im5vaW1wbGljaXRmbG9hdCI+OworCisvLy8gaW5saW5lPW5ldmVyLgorZGVmIE5vSW5saW5lIDogRW51bUF0dHI8Im5vaW5saW5lIj47CisKKy8vLyBGdW5jdGlvbiBpcyBjYWxsZWQgZWFybHkgYW5kL29yIG9mdGVuLCBzbyBsYXp5IGJpbmRpbmcgaXNuJ3Qgd29ydGh3aGlsZS4KK2RlZiBOb25MYXp5QmluZCA6IEVudW1BdHRyPCJub25sYXp5YmluZCI+OworCisvLy8gUG9pbnRlciBpcyBrbm93biB0byBiZSBub3QgbnVsbC4KK2RlZiBOb25OdWxsIDogRW51bUF0dHI8Im5vbm51bGwiPjsKKworLy8vIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCByZWN1cnNlLgorZGVmIE5vUmVjdXJzZSA6IEVudW1BdHRyPCJub3JlY3Vyc2UiPjsKKworLy8vIERpc2FibGUgcmVkem9uZS4KK2RlZiBOb1JlZFpvbmUgOiBFbnVtQXR0cjwibm9yZWR6b25lIj47CisKKy8vLyBNYXJrIHRoZSBmdW5jdGlvbiBhcyBub3QgcmV0dXJuaW5nLgorZGVmIE5vUmV0dXJuIDogRW51bUF0dHI8Im5vcmV0dXJuIj47CisKKy8vLyBEaXNhYmxlIEluZGlyZWN0IEJyYW5jaCBUcmFja2luZy4KK2RlZiBOb0NmQ2hlY2sgOiBFbnVtQXR0cjwibm9jZl9jaGVjayI+OworCisvLy8gRnVuY3Rpb24gZG9lc24ndCB1bndpbmQgc3RhY2suCitkZWYgTm9VbndpbmQgOiBFbnVtQXR0cjwibm91bndpbmQiPjsKKworLy8vIFNlbGVjdCBvcHRpbWl6YXRpb25zIGZvciBiZXN0IGZ1enppbmcgc2lnbmFsLgorZGVmIE9wdEZvckZ1enppbmcgOiBFbnVtQXR0cjwib3B0Zm9yZnV6emluZyI+OworCisvLy8gb3B0X3NpemUuCitkZWYgT3B0aW1pemVGb3JTaXplIDogRW51bUF0dHI8Im9wdHNpemUiPjsKKworLy8vIEZ1bmN0aW9uIG11c3Qgbm90IGJlIG9wdGltaXplZC4KK2RlZiBPcHRpbWl6ZU5vbmUgOiBFbnVtQXR0cjwib3B0bm9uZSI+OworCisvLy8gRnVuY3Rpb24gZG9lcyBub3QgYWNjZXNzIG1lbW9yeS4KK2RlZiBSZWFkTm9uZSA6IEVudW1BdHRyPCJyZWFkbm9uZSI+OworCisvLy8gRnVuY3Rpb24gb25seSByZWFkcyBmcm9tIG1lbW9yeS4KK2RlZiBSZWFkT25seSA6IEVudW1BdHRyPCJyZWFkb25seSI+OworCisvLy8gUmV0dXJuIHZhbHVlIGlzIGFsd2F5cyBlcXVhbCB0byB0aGlzIGFyZ3VtZW50LgorZGVmIFJldHVybmVkIDogRW51bUF0dHI8InJldHVybmVkIj47CisKKy8vLyBGdW5jdGlvbiBjYW4gcmV0dXJuIHR3aWNlLgorZGVmIFJldHVybnNUd2ljZSA6IEVudW1BdHRyPCJyZXR1cm5zX3R3aWNlIj47CisKKy8vLyBTYWZlIFN0YWNrIHByb3RlY3Rpb24uCitkZWYgU2FmZVN0YWNrIDogRW51bUF0dHI8InNhZmVzdGFjayI+OworCisvLy8gU2lnbiBleHRlbmRlZCBiZWZvcmUvYWZ0ZXIgY2FsbC4KK2RlZiBTRXh0IDogRW51bUF0dHI8InNpZ25leHQiPjsKKworLy8vIEFsaWdubWVudCBvZiBzdGFjayBmb3IgZnVuY3Rpb24gKDMgYml0cykgIHN0b3JlZCBhcyBsb2cyIG9mIGFsaWdubWVudCB3aXRoCisvLy8gKzEgYmlhcyAwIG1lYW5zIHVuYWxpZ25lZCAoZGlmZmVyZW50IGZyb20gYWxpZ25zdGFjaz0oMSkpLgorZGVmIFN0YWNrQWxpZ25tZW50IDogRW51bUF0dHI8ImFsaWduc3RhY2siPjsKKworLy8vIEZ1bmN0aW9uIGNhbiBiZSBzcGVjdWxhdGVkLgorZGVmIFNwZWN1bGF0YWJsZSA6IEVudW1BdHRyPCJzcGVjdWxhdGFibGUiPjsKKworLy8vIFN0YWNrIHByb3RlY3Rpb24uCitkZWYgU3RhY2tQcm90ZWN0IDogRW51bUF0dHI8InNzcCI+OworCisvLy8gU3RhY2sgcHJvdGVjdGlvbiByZXF1aXJlZC4KK2RlZiBTdGFja1Byb3RlY3RSZXEgOiBFbnVtQXR0cjwic3NwcmVxIj47CisKKy8vLyBTdHJvbmcgU3RhY2sgcHJvdGVjdGlvbi4KK2RlZiBTdGFja1Byb3RlY3RTdHJvbmcgOiBFbnVtQXR0cjwic3Nwc3Ryb25nIj47CisKKy8vLyBGdW5jdGlvbiB3YXMgY2FsbGVkIGluIGEgc2NvcGUgcmVxdWlyaW5nIHN0cmljdCBmbG9hdGluZyBwb2ludCBzZW1hbnRpY3MuCitkZWYgU3RyaWN0RlAgOiBFbnVtQXR0cjwic3RyaWN0ZnAiPjsKKworLy8vIEhpZGRlbiBwb2ludGVyIHRvIHN0cnVjdHVyZSB0byByZXR1cm4uCitkZWYgU3RydWN0UmV0IDogRW51bUF0dHI8InNyZXQiPjsKKworLy8vIEFkZHJlc3NTYW5pdGl6ZXIgaXMgb24uCitkZWYgU2FuaXRpemVBZGRyZXNzIDogRW51bUF0dHI8InNhbml0aXplX2FkZHJlc3MiPjsKKworLy8vIFRocmVhZFNhbml0aXplciBpcyBvbi4KK2RlZiBTYW5pdGl6ZVRocmVhZCA6IEVudW1BdHRyPCJzYW5pdGl6ZV90aHJlYWQiPjsKKworLy8vIE1lbW9yeVNhbml0aXplciBpcyBvbi4KK2RlZiBTYW5pdGl6ZU1lbW9yeSA6IEVudW1BdHRyPCJzYW5pdGl6ZV9tZW1vcnkiPjsKKworLy8vIEhXQWRkcmVzc1Nhbml0aXplciBpcyBvbi4KK2RlZiBTYW5pdGl6ZUhXQWRkcmVzcyA6IEVudW1BdHRyPCJzYW5pdGl6ZV9od2FkZHJlc3MiPjsKKworLy8vIEFyZ3VtZW50IGlzIHN3aWZ0IGVycm9yLgorZGVmIFN3aWZ0RXJyb3IgOiBFbnVtQXR0cjwic3dpZnRlcnJvciI+OworCisvLy8gQXJndW1lbnQgaXMgc3dpZnQgc2VsZi9jb250ZXh0LgorZGVmIFN3aWZ0U2VsZiA6IEVudW1BdHRyPCJzd2lmdHNlbGYiPjsKKworLy8vIEZ1bmN0aW9uIG11c3QgYmUgaW4gYSB1bndpbmQgdGFibGUuCitkZWYgVVdUYWJsZSA6IEVudW1BdHRyPCJ1d3RhYmxlIj47CisKKy8vLyBGdW5jdGlvbiBvbmx5IHdyaXRlcyB0byBtZW1vcnkuCitkZWYgV3JpdGVPbmx5IDogRW51bUF0dHI8IndyaXRlb25seSI+OworCisvLy8gWmVybyBleHRlbmRlZCBiZWZvcmUvYWZ0ZXIgY2FsbC4KK2RlZiBaRXh0IDogRW51bUF0dHI8Inplcm9leHQiPjsKKworLy8vIFRhcmdldC1pbmRlcGVuZGVudCBzdHJpbmcgYXR0cmlidXRlcy4KK2RlZiBMZXNzUHJlY2lzZUZQTUFEIDogU3RyQm9vbEF0dHI8Imxlc3MtcHJlY2lzZS1mcG1hZCI+OworZGVmIE5vSW5mc0ZQTWF0aCA6IFN0ckJvb2xBdHRyPCJuby1pbmZzLWZwLW1hdGgiPjsKK2RlZiBOb05hbnNGUE1hdGggOiBTdHJCb29sQXR0cjwibm8tbmFucy1mcC1tYXRoIj47CitkZWYgVW5zYWZlRlBNYXRoIDogU3RyQm9vbEF0dHI8InVuc2FmZS1mcC1tYXRoIj47CitkZWYgTm9KdW1wVGFibGVzIDogU3RyQm9vbEF0dHI8Im5vLWp1bXAtdGFibGVzIj47CitkZWYgUHJvZmlsZVNhbXBsZUFjY3VyYXRlIDogU3RyQm9vbEF0dHI8InByb2ZpbGUtc2FtcGxlLWFjY3VyYXRlIj47CisKK2NsYXNzIENvbXBhdFJ1bGU8c3RyaW5nIEY+IHsKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGxlZCB0byBjaGVjayB0aGUgYXR0cmlidXRlIG9mIHRoZSBjYWxsZXIgYW5kCisgIC8vIGNhbGxlZSBhbmQgZGVjaWRlIHdoZXRoZXIgaW5saW5pbmcgc2hvdWxkIGJlIGFsbG93ZWQuIFRoZSBmdW5jdGlvbidzCisgIC8vIHNpZ25hdHVyZSBtdXN0IG1hdGNoICJib29sKGNvbnN0IEZ1bmN0aW9uJiwgY29uc3QgRnVuY3Rpb24gJikiLCB3aGVyZSB0aGUKKyAgLy8gZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNhbGxlciBhbmQgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMKKyAgLy8gdGhlIHJlZmVyZW5jZSB0byB0aGUgY2FsbGVlLiBJdCBtdXN0IHJldHVybiBmYWxzZSBpZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUKKyAgLy8gY2FsbGVyIGFuZCBjYWxsZWUgYXJlIGluY29tcGF0aWJsZSwgYW5kIHRydWUgb3RoZXJ3aXNlLgorICBzdHJpbmcgQ29tcGF0RnVuYyA9IEY7Cit9CisKK2RlZiA6IENvbXBhdFJ1bGU8ImlzRXF1YWw8U2FuaXRpemVBZGRyZXNzQXR0cj4iPjsKK2RlZiA6IENvbXBhdFJ1bGU8ImlzRXF1YWw8U2FuaXRpemVUaHJlYWRBdHRyPiI+OworZGVmIDogQ29tcGF0UnVsZTwiaXNFcXVhbDxTYW5pdGl6ZU1lbW9yeUF0dHI+Ij47CitkZWYgOiBDb21wYXRSdWxlPCJpc0VxdWFsPFNhbml0aXplSFdBZGRyZXNzQXR0cj4iPjsKK2RlZiA6IENvbXBhdFJ1bGU8ImlzRXF1YWw8U2FmZVN0YWNrQXR0cj4iPjsKKworY2xhc3MgTWVyZ2VSdWxlPHN0cmluZyBGPiB7CisgIC8vIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBjYWxsZWQgdG8gbWVyZ2UgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGNhbGxlciBhbmQKKyAgLy8gY2FsbGVlLiBUaGUgZnVuY3Rpb24ncyBzaWduYXR1cmUgbXVzdCBtYXRjaAorICAvLyAidm9pZChGdW5jdGlvbiYsIGNvbnN0IEZ1bmN0aW9uICYpIiwgd2hlcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUKKyAgLy8gcmVmZXJlbmNlIHRvIHRoZSBjYWxsZXIgYW5kIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRoZSByZWZlcmVuY2UgdG8gdGhlCisgIC8vIGNhbGxlZS4KKyAgc3RyaW5nIE1lcmdlRnVuYyA9IEY7Cit9CisKK2RlZiA6IE1lcmdlUnVsZTwic2V0QU5EPExlc3NQcmVjaXNlRlBNQURBdHRyPiI+OworZGVmIDogTWVyZ2VSdWxlPCJzZXRBTkQ8Tm9JbmZzRlBNYXRoQXR0cj4iPjsKK2RlZiA6IE1lcmdlUnVsZTwic2V0QU5EPE5vTmFuc0ZQTWF0aEF0dHI+Ij47CitkZWYgOiBNZXJnZVJ1bGU8InNldEFORDxVbnNhZmVGUE1hdGhBdHRyPiI+OworZGVmIDogTWVyZ2VSdWxlPCJzZXRPUjxOb0ltcGxpY2l0RmxvYXRBdHRyPiI+OworZGVmIDogTWVyZ2VSdWxlPCJzZXRPUjxOb0p1bXBUYWJsZXNBdHRyPiI+OworZGVmIDogTWVyZ2VSdWxlPCJzZXRPUjxQcm9maWxlU2FtcGxlQWNjdXJhdGVBdHRyPiI+OworZGVmIDogTWVyZ2VSdWxlPCJhZGp1c3RDYWxsZXJTU1BMZXZlbCI+OworZGVmIDogTWVyZ2VSdWxlPCJhZGp1c3RDYWxsZXJTdGFja1Byb2JlcyI+OworZGVmIDogTWVyZ2VSdWxlPCJhZGp1c3RDYWxsZXJTdGFja1Byb2JlU2l6ZSI+OwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9BdXRvVXBncmFkZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9BdXRvVXBncmFkZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNDA2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0F1dG9VcGdyYWRlLmgKQEAgLTAsMCArMSw4NSBAQAorLy89PT0tIEF1dG9VcGdyYWRlLmggLSBBdXRvVXBncmFkZSBIZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhlc2UgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBieSBsaWIvSVIvQXV0b1VwZ3JhZGUuY3BwLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9BVVRPVVBHUkFERV9ICisjZGVmaW5lIExMVk1fSVJfQVVUT1VQR1JBREVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQ2FsbEluc3Q7CisgIGNsYXNzIENvbnN0YW50OworICBjbGFzcyBGdW5jdGlvbjsKKyAgY2xhc3MgSW5zdHJ1Y3Rpb247CisgIGNsYXNzIE1ETm9kZTsKKyAgY2xhc3MgTW9kdWxlOworICBjbGFzcyBHbG9iYWxWYXJpYWJsZTsKKyAgY2xhc3MgVHlwZTsKKyAgY2xhc3MgVmFsdWU7CisKKyAgLy8vIFRoaXMgaXMgYSBtb3JlIGdyYW51bGFyIGZ1bmN0aW9uIHRoYXQgc2ltcGx5IGNoZWNrcyBhbiBpbnRyaW5zaWMgZnVuY3Rpb24KKyAgLy8vIGZvciB1cGdyYWRpbmcsIGFuZCByZXR1cm5zIHRydWUgaWYgaXQgcmVxdWlyZXMgdXBncmFkaW5nLiBJdCBtYXkgcmV0dXJuCisgIC8vLyBudWxsIGluIE5ld0ZuIGlmIHRoZSBhbGwgY2FsbHMgdG8gdGhlIG9yaWdpbmFsIGludHJpbnNpYyBmdW5jdGlvbgorICAvLy8gc2hvdWxkIGJlIHRyYW5zZm9ybWVkIHRvIG5vbi1mdW5jdGlvbi1jYWxsIGluc3RydWN0aW9ucy4KKyAgYm9vbCBVcGdyYWRlSW50cmluc2ljRnVuY3Rpb24oRnVuY3Rpb24gKkYsIEZ1bmN0aW9uIComTmV3Rm4pOworCisgIC8vLyBUaGlzIGlzIHRoZSBjb21wbGVtZW50IHRvIHRoZSBhYm92ZSwgcmVwbGFjaW5nIGEgc3BlY2lmaWMgY2FsbCB0byBhbgorICAvLy8gaW50cmluc2ljIGZ1bmN0aW9uIHdpdGggYSBjYWxsIHRvIHRoZSBzcGVjaWZpZWQgbmV3IGZ1bmN0aW9uLgorICB2b2lkIFVwZ3JhZGVJbnRyaW5zaWNDYWxsKENhbGxJbnN0ICpDSSwgRnVuY3Rpb24gKk5ld0ZuKTsKKworICAvLy8gVGhpcyBpcyBhbiBhdXRvLXVwZ3JhZGUgaG9vayBmb3IgYW55IG9sZCBpbnRyaW5zaWMgZnVuY3Rpb24gc3ludGF4ZXMKKyAgLy8vIHdoaWNoIG5lZWQgdG8gaGF2ZSBib3RoIHRoZSBmdW5jdGlvbiB1cGRhdGVkIGFzIHdlbGwgYXMgYWxsIGNhbGxzIHVwZGF0ZWQKKyAgLy8vIHRvIHRoZSBuZXcgZnVuY3Rpb24uIFRoaXMgc2hvdWxkIG9ubHkgYmUgcnVuIGluIGEgcG9zdC1wcm9jZXNzaW5nIGZhc2hpb24KKyAgLy8vIHNvIHRoYXQgaXQgY2FuIHVwZGF0ZSBhbGwgY2FsbHMgdG8gdGhlIG9sZCBmdW5jdGlvbi4KKyAgdm9pZCBVcGdyYWRlQ2FsbHNUb0ludHJpbnNpYyhGdW5jdGlvbiogRik7CisKKyAgLy8vIFRoaXMgY2hlY2tzIGZvciBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIHNob3VsZCBiZSB1cGdyYWRlZC4gSXQgcmV0dXJucyB0cnVlCisgIC8vLyBpZiBpdCByZXF1aXJlcyB1cGdyYWRpbmcuCisgIGJvb2wgVXBncmFkZUdsb2JhbFZhcmlhYmxlKEdsb2JhbFZhcmlhYmxlICpHVik7CisKKyAgLy8vIFRoaXMgY2hlY2tzIGZvciBtb2R1bGUgZmxhZ3Mgd2hpY2ggc2hvdWxkIGJlIHVwZ3JhZGVkLiBJdCByZXR1cm5zIHRydWUgaWYKKyAgLy8vIG1vZHVsZSBpcyBtb2RpZmllZC4KKyAgYm9vbCBVcGdyYWRlTW9kdWxlRmxhZ3MoTW9kdWxlICZNKTsKKworICB2b2lkIFVwZ3JhZGVTZWN0aW9uQXR0cmlidXRlcyhNb2R1bGUgJk0pOworCisgIC8vLyBJZiB0aGUgZ2l2ZW4gVEJBQSB0YWcgdXNlcyB0aGUgc2NhbGFyIFRCQUEgZm9ybWF0LCBjcmVhdGUgYSBuZXcgbm9kZQorICAvLy8gY29ycmVzcG9uZGluZyB0byB0aGUgdXBncmFkZSB0byB0aGUgc3RydWN0LXBhdGggYXdhcmUgVEJBQSBmb3JtYXQuCisgIC8vLyBPdGhlcndpc2UgcmV0dXJuIHRoZSBccCBUQkFBTm9kZSBpdHNlbGYuCisgIE1ETm9kZSAqVXBncmFkZVRCQUFOb2RlKE1ETm9kZSAmVEJBQU5vZGUpOworCisgIC8vLyBUaGlzIGlzIGFuIGF1dG8tdXBncmFkZSBmb3IgYml0Y2FzdCBiZXR3ZWVuIHBvaW50ZXJzIHdpdGggZGlmZmVyZW50CisgIC8vLyBhZGRyZXNzIHNwYWNlczogdGhlIGluc3RydWN0aW9uIGlzIHJlcGxhY2VkIGJ5IGEgcGFpciBwdHJ0b2ludCtpbnR0b3B0ci4KKyAgSW5zdHJ1Y3Rpb24gKlVwZ3JhZGVCaXRDYXN0SW5zdCh1bnNpZ25lZCBPcGMsIFZhbHVlICpWLCBUeXBlICpEZXN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKiZUZW1wKTsKKworICAvLy8gVGhpcyBpcyBhbiBhdXRvLXVwZ3JhZGUgZm9yIGJpdGNhc3QgY29uc3RhbnQgZXhwcmVzc2lvbiBiZXR3ZWVuIHBvaW50ZXJzCisgIC8vLyB3aXRoIGRpZmZlcmVudCBhZGRyZXNzIHNwYWNlczogdGhlIGluc3RydWN0aW9uIGlzIHJlcGxhY2VkIGJ5IGEgcGFpcgorICAvLy8gcHRydG9pbnQraW50dG9wdHIuCisgIFZhbHVlICpVcGdyYWRlQml0Q2FzdEV4cHIodW5zaWduZWQgT3BjLCBDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5KTsKKworICAvLy8gQ2hlY2sgdGhlIGRlYnVnIGluZm8gdmVyc2lvbiBudW1iZXIsIGlmIGl0IGlzIG91dC1kYXRlZCwgZHJvcCB0aGUgZGVidWcKKyAgLy8vIGluZm8uIFJldHVybiB0cnVlIGlmIG1vZHVsZSBpcyBtb2RpZmllZC4KKyAgYm9vbCBVcGdyYWRlRGVidWdJbmZvKE1vZHVsZSAmTSk7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgYSBzdHJpbmcgbG9va3MgbGlrZSBhbiBvbGQgbG9vcCBhdHRhY2htZW50IHRhZy4KKyAgaW5saW5lIGJvb2wgbWF5QmVPbGRMb29wQXR0YWNobWVudFRhZyhTdHJpbmdSZWYgTmFtZSkgeworICAgIHJldHVybiBOYW1lLnN0YXJ0c3dpdGgoImxsdm0udmVjdG9yaXplci4iKTsKKyAgfQorCisgIC8vLyBVcGdyYWRlIHRoZSBsb29wIGF0dGFjaG1lbnQgbWV0YWRhdGEgbm9kZS4KKyAgTUROb2RlICp1cGdyYWRlSW5zdHJ1Y3Rpb25Mb29wQXR0YWNobWVudChNRE5vZGUgJk4pOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQmFzaWNCbG9jay5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9CYXNpY0Jsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdjZmM5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQmFzaWNCbG9jay5oCkBAIC0wLDAgKzEsNDI3IEBACisvLz09PS0gbGx2bS9CYXNpY0Jsb2NrLmggLSBSZXByZXNlbnQgYSBiYXNpYyBibG9jayBpbiB0aGUgVk0gLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIEJhc2ljQmxvY2sgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0JBU0lDQkxPQ0tfSAorI2RlZmluZSBMTFZNX0lSX0JBU0lDQkxPQ0tfSAorCisjaW5jbHVkZSAibGx2bS1jL1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvU3ltYm9sVGFibGVMaXN0VHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DQmluZGluZ1dyYXBwaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ2FsbEluc3Q7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIExhbmRpbmdQYWRJbnN0OworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBQSElOb2RlOworY2xhc3MgVGVybWluYXRvckluc3Q7CitjbGFzcyBWYWx1ZVN5bWJvbFRhYmxlOworCisvLy8gXGJyaWVmIExMVk0gQmFzaWMgQmxvY2sgUmVwcmVzZW50YXRpb24KKy8vLworLy8vIFRoaXMgcmVwcmVzZW50cyBhIHNpbmdsZSBiYXNpYyBibG9jayBpbiBMTFZNLiBBIGJhc2ljIGJsb2NrIGlzIHNpbXBseSBhCisvLy8gY29udGFpbmVyIG9mIGluc3RydWN0aW9ucyB0aGF0IGV4ZWN1dGUgc2VxdWVudGlhbGx5LiBCYXNpYyBibG9ja3MgYXJlIFZhbHVlcworLy8vIGJlY2F1c2UgdGhleSBhcmUgcmVmZXJlbmNlZCBieSBpbnN0cnVjdGlvbnMgc3VjaCBhcyBicmFuY2hlcyBhbmQgc3dpdGNoCisvLy8gdGFibGVzLiBUaGUgdHlwZSBvZiBhIEJhc2ljQmxvY2sgaXMgIlR5cGU6OkxhYmVsVHkiIGJlY2F1c2UgdGhlIGJhc2ljIGJsb2NrCisvLy8gcmVwcmVzZW50cyBhIGxhYmVsIHRvIHdoaWNoIGEgYnJhbmNoIGNhbiBqdW1wLgorLy8vCisvLy8gQSB3ZWxsIGZvcm1lZCBiYXNpYyBibG9jayBpcyBmb3JtZWQgb2YgYSBsaXN0IG9mIG5vbi10ZXJtaW5hdGluZworLy8vIGluc3RydWN0aW9ucyBmb2xsb3dlZCBieSBhIHNpbmdsZSBUZXJtaW5hdG9ySW5zdCBpbnN0cnVjdGlvbi4KKy8vLyBUZXJtaW5hdG9ySW5zdCdzIG1heSBub3Qgb2NjdXIgaW4gdGhlIG1pZGRsZSBvZiBiYXNpYyBibG9ja3MsIGFuZCBtdXN0CisvLy8gdGVybWluYXRlIHRoZSBibG9ja3MuIFRoZSBCYXNpY0Jsb2NrIGNsYXNzIGFsbG93cyBtYWxmb3JtZWQgYmFzaWMgYmxvY2tzIHRvCisvLy8gb2NjdXIgYmVjYXVzZSBpdCBtYXkgYmUgdXNlZnVsIGluIHRoZSBpbnRlcm1lZGlhdGUgc3RhZ2Ugb2YgY29uc3RydWN0aW5nIG9yCisvLy8gbW9kaWZ5aW5nIGEgcHJvZ3JhbS4gSG93ZXZlciwgdGhlIHZlcmlmaWVyIHdpbGwgZW5zdXJlIHRoYXQgYmFzaWMgYmxvY2tzCisvLy8gYXJlICJ3ZWxsIGZvcm1lZCIuCitjbGFzcyBCYXNpY0Jsb2NrIGZpbmFsIDogcHVibGljIFZhbHVlLCAvLyBCYXNpYyBibG9ja3MgYXJlIGRhdGEgb2JqZWN0cyBhbHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGlsaXN0X25vZGVfd2l0aF9wYXJlbnQ8QmFzaWNCbG9jaywgRnVuY3Rpb24+IHsKK3B1YmxpYzoKKyAgdXNpbmcgSW5zdExpc3RUeXBlID0gU3ltYm9sVGFibGVMaXN0PEluc3RydWN0aW9uPjsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEJsb2NrQWRkcmVzczsKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbFRhYmxlTGlzdFRyYWl0czxCYXNpY0Jsb2NrPjsKKworICBJbnN0TGlzdFR5cGUgSW5zdExpc3Q7CisgIEZ1bmN0aW9uICpQYXJlbnQ7CisKKyAgdm9pZCBzZXRQYXJlbnQoRnVuY3Rpb24gKnBhcmVudCk7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3Rvci4KKyAgLy8vCisgIC8vLyBJZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgdGhlIGJhc2ljIGJsb2NrIGlzIGF1dG9tYXRpY2FsbHkKKyAgLy8vIGluc2VydGVkIGF0IGVpdGhlciB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiAoaWYgSW5zZXJ0QmVmb3JlIGlzIG51bGwpLCBvcgorICAvLy8gYmVmb3JlIHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2suCisgIGV4cGxpY2l0IEJhc2ljQmxvY2soTExWTUNvbnRleHQgJkMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gKlBhcmVudCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisKK3B1YmxpYzoKKyAgQmFzaWNCbG9jayhjb25zdCBCYXNpY0Jsb2NrICYpID0gZGVsZXRlOworICBCYXNpY0Jsb2NrICZvcGVyYXRvcj0oY29uc3QgQmFzaWNCbG9jayAmKSA9IGRlbGV0ZTsKKyAgfkJhc2ljQmxvY2soKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGlzIGJhc2ljIGJsb2NrIGxpdmVzLgorICBMTFZNQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0OworCisgIC8vLyBJbnN0cnVjdGlvbiBpdGVyYXRvcnMuLi4KKyAgdXNpbmcgaXRlcmF0b3IgPSBJbnN0TGlzdFR5cGU6Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IEluc3RMaXN0VHlwZTo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIHJldmVyc2VfaXRlcmF0b3IgPSBJbnN0TGlzdFR5cGU6OnJldmVyc2VfaXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgPSBJbnN0TGlzdFR5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgLy8vIFxicmllZiBDcmVhdGVzIGEgbmV3IEJhc2ljQmxvY2suCisgIC8vLworICAvLy8gSWYgdGhlIFBhcmVudCBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkLCB0aGUgYmFzaWMgYmxvY2sgaXMgYXV0b21hdGljYWxseQorICAvLy8gaW5zZXJ0ZWQgYXQgZWl0aGVyIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIChpZiBJbnNlcnRCZWZvcmUgaXMgMCksIG9yCisgIC8vLyBiZWZvcmUgdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jay4KKyAgc3RhdGljIEJhc2ljQmxvY2sgKkNyZWF0ZShMTFZNQ29udGV4dCAmQ29udGV4dCwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiAqUGFyZW50ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIG5ldyBCYXNpY0Jsb2NrKENvbnRleHQsIE5hbWUsIFBhcmVudCwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBlbmNsb3NpbmcgbWV0aG9kLCBvciBudWxsIGlmIG5vbmUuCisgIGNvbnN0IEZ1bmN0aW9uICpnZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBQYXJlbnQ7IH0KKyAgICAgICAgRnVuY3Rpb24gKmdldFBhcmVudCgpICAgICAgIHsgcmV0dXJuIFBhcmVudDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBtb2R1bGUgb3duaW5nIHRoZSBmdW5jdGlvbiB0aGlzIGJhc2ljIGJsb2NrIGJlbG9uZ3MgdG8sCisgIC8vLyBvciBudWxscHRyIGl0IHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIGEgbW9kdWxlLgorICAvLy8KKyAgLy8vIE5vdGU6IHRoaXMgaXMgdW5kZWZpbmVkIGJlaGF2aW9yIGlmIHRoZSBibG9jayBkb2VzIG5vdCBoYXZlIGEgcGFyZW50LgorICBjb25zdCBNb2R1bGUgKmdldE1vZHVsZSgpIGNvbnN0OworICBNb2R1bGUgKmdldE1vZHVsZSgpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxNb2R1bGUgKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQmFzaWNCbG9jayAqPih0aGlzKS0+Z2V0TW9kdWxlKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSB0ZXJtaW5hdG9yIGluc3RydWN0aW9uIGlmIHRoZSBibG9jayBpcyB3ZWxsIGZvcm1lZCBvcgorICAvLy8gbnVsbCBpZiB0aGUgYmxvY2sgaXMgbm90IHdlbGwgZm9ybWVkLgorICBjb25zdCBUZXJtaW5hdG9ySW5zdCAqZ2V0VGVybWluYXRvcigpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgIFRlcm1pbmF0b3JJbnN0ICpnZXRUZXJtaW5hdG9yKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PFRlcm1pbmF0b3JJbnN0ICo+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQmFzaWNCbG9jayAqPih0aGlzKS0+Z2V0VGVybWluYXRvcigpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgY2FsbCBpbnN0cnVjdGlvbiBjYWxsaW5nIEBsbHZtLmV4cGVyaW1lbnRhbC5kZW9wdGltaXplCisgIC8vLyBwcmlvciB0byB0aGUgdGVybWluYXRpbmcgcmV0dXJuIGluc3RydWN0aW9uIG9mIHRoaXMgYmFzaWMgYmxvY2ssIGlmIHN1Y2ggYQorICAvLy8gY2FsbCBpcyBwcmVzZW50LiAgT3RoZXJ3aXNlLCByZXR1cm5zIG51bGwuCisgIGNvbnN0IENhbGxJbnN0ICpnZXRUZXJtaW5hdGluZ0Rlb3B0aW1pemVDYWxsKCkgY29uc3Q7CisgIENhbGxJbnN0ICpnZXRUZXJtaW5hdGluZ0Rlb3B0aW1pemVDYWxsKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PENhbGxJbnN0ICo+KAorICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQmFzaWNCbG9jayAqPih0aGlzKS0+Z2V0VGVybWluYXRpbmdEZW9wdGltaXplQ2FsbCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgY2FsbCBpbnN0cnVjdGlvbiBtYXJrZWQgJ211c3R0YWlsJyBwcmlvciB0byB0aGUKKyAgLy8vIHRlcm1pbmF0aW5nIHJldHVybiBpbnN0cnVjdGlvbiBvZiB0aGlzIGJhc2ljIGJsb2NrLCBpZiBzdWNoIGEgY2FsbCBpcworICAvLy8gcHJlc2VudC4gIE90aGVyd2lzZSwgcmV0dXJucyBudWxsLgorICBjb25zdCBDYWxsSW5zdCAqZ2V0VGVybWluYXRpbmdNdXN0VGFpbENhbGwoKSBjb25zdDsKKyAgQ2FsbEluc3QgKmdldFRlcm1pbmF0aW5nTXVzdFRhaWxDYWxsKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PENhbGxJbnN0ICo+KAorICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBCYXNpY0Jsb2NrICo+KHRoaXMpLT5nZXRUZXJtaW5hdGluZ011c3RUYWlsQ2FsbCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGluc3RydWN0aW9uIGluIHRoaXMgYmxvY2sgdGhhdCBpcworICAvLy8gbm90IGEgUEhJTm9kZSBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBXaGVuIGFkZGluZyBpbnN0cnVjdGlvbnMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYmFzaWMgYmxvY2ssIHRoZXkgc2hvdWxkCisgIC8vLyBiZSBhZGRlZCBiZWZvcmUgdGhlIHJldHVybmVkIHZhbHVlLCBub3QgYmVmb3JlIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiwKKyAgLy8vIHdoaWNoIG1pZ2h0IGJlIFBISS4gUmV0dXJucyAwIGlzIHRoZXJlJ3Mgbm8gbm9uLVBISSBpbnN0cnVjdGlvbi4KKyAgY29uc3QgSW5zdHJ1Y3Rpb24qIGdldEZpcnN0Tm9uUEhJKCkgY29uc3Q7CisgIEluc3RydWN0aW9uKiBnZXRGaXJzdE5vblBISSgpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxJbnN0cnVjdGlvbiAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQmFzaWNCbG9jayAqPih0aGlzKS0+Z2V0Rmlyc3ROb25QSEkoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpbiB0aGlzIGJsb2NrIHRoYXQgaXMgbm90CisgIC8vLyBhIFBISU5vZGUgb3IgYSBkZWJ1ZyBpbnRyaW5zaWMuCisgIGNvbnN0IEluc3RydWN0aW9uKiBnZXRGaXJzdE5vblBISU9yRGJnKCkgY29uc3Q7CisgIEluc3RydWN0aW9uKiBnZXRGaXJzdE5vblBISU9yRGJnKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEluc3RydWN0aW9uICo+KAorICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQmFzaWNCbG9jayAqPih0aGlzKS0+Z2V0Rmlyc3ROb25QSElPckRiZygpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGluc3RydWN0aW9uIGluIHRoaXMgYmxvY2sgdGhhdCBpcyBub3QKKyAgLy8vIGEgUEhJTm9kZSwgYSBkZWJ1ZyBpbnRyaW5zaWMsIG9yIGEgbGlmZXRpbWUgaW50cmluc2ljLgorICBjb25zdCBJbnN0cnVjdGlvbiogZ2V0Rmlyc3ROb25QSElPckRiZ09yTGlmZXRpbWUoKSBjb25zdDsKKyAgSW5zdHJ1Y3Rpb24qIGdldEZpcnN0Tm9uUEhJT3JEYmdPckxpZmV0aW1lKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEluc3RydWN0aW9uICo+KAorICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBCYXNpY0Jsb2NrICo+KHRoaXMpLT5nZXRGaXJzdE5vblBISU9yRGJnT3JMaWZldGltZSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gdGhpcyBibG9jayB0aGF0IGlzCisgIC8vLyBzdWl0YWJsZSBmb3IgaW5zZXJ0aW5nIGEgbm9uLVBISSBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBJbiBwYXJ0aWN1bGFyLCBpdCBza2lwcyBhbGwgUEhJcyBhbmQgTGFuZGluZ1BhZCBpbnN0cnVjdGlvbnMuCisgIGNvbnN0X2l0ZXJhdG9yIGdldEZpcnN0SW5zZXJ0aW9uUHQoKSBjb25zdDsKKyAgaXRlcmF0b3IgZ2V0Rmlyc3RJbnNlcnRpb25QdCgpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgQmFzaWNCbG9jayAqPih0aGlzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5nZXRGaXJzdEluc2VydGlvblB0KCkuZ2V0Tm9uQ29uc3QoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVW5saW5rICd0aGlzJyBmcm9tIHRoZSBjb250YWluaW5nIGZ1bmN0aW9uLCBidXQgZG8gbm90IGRlbGV0ZSBpdC4KKyAgdm9pZCByZW1vdmVGcm9tUGFyZW50KCk7CisKKyAgLy8vIFxicmllZiBVbmxpbmsgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgZnVuY3Rpb24gYW5kIGRlbGV0ZSBpdC4KKyAgLy8vCisgIC8vIFxyZXR1cm5zIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBlcmFzZWQgb25lLgorICBTeW1ib2xUYWJsZUxpc3Q8QmFzaWNCbG9jaz46Oml0ZXJhdG9yIGVyYXNlRnJvbVBhcmVudCgpOworCisgIC8vLyBcYnJpZWYgVW5saW5rIHRoaXMgYmFzaWMgYmxvY2sgZnJvbSBpdHMgY3VycmVudCBmdW5jdGlvbiBhbmQgaW5zZXJ0IGl0CisgIC8vLyBpbnRvIHRoZSBmdW5jdGlvbiB0aGF0IFxwIE1vdmVQb3MgbGl2ZXMgaW4sIHJpZ2h0IGJlZm9yZSBccCBNb3ZlUG9zLgorICB2b2lkIG1vdmVCZWZvcmUoQmFzaWNCbG9jayAqTW92ZVBvcyk7CisKKyAgLy8vIFxicmllZiBVbmxpbmsgdGhpcyBiYXNpYyBibG9jayBmcm9tIGl0cyBjdXJyZW50IGZ1bmN0aW9uIGFuZCBpbnNlcnQgaXQKKyAgLy8vIHJpZ2h0IGFmdGVyIFxwIE1vdmVQb3MgaW4gdGhlIGZ1bmN0aW9uIFxwIE1vdmVQb3MgbGl2ZXMgaW4uCisgIHZvaWQgbW92ZUFmdGVyKEJhc2ljQmxvY2sgKk1vdmVQb3MpOworCisgIC8vLyBcYnJpZWYgSW5zZXJ0IHVubGlua2VkIGJhc2ljIGJsb2NrIGludG8gYSBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBJbnNlcnRzIGFuIHVubGlua2VkIGJhc2ljIGJsb2NrIGludG8gXGMgUGFyZW50LiAgSWYgXGMgSW5zZXJ0QmVmb3JlIGlzCisgIC8vLyBwcm92aWRlZCwgaW5zZXJ0cyBiZWZvcmUgdGhhdCBiYXNpYyBibG9jaywgb3RoZXJ3aXNlIGluc2VydHMgYXQgdGhlIGVuZC4KKyAgLy8vCisgIC8vLyBccHJlIFxhIGdldFBhcmVudCgpIGlzIFxjIG51bGxwdHIuCisgIHZvaWQgaW5zZXJ0SW50byhGdW5jdGlvbiAqUGFyZW50LCBCYXNpY0Jsb2NrICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgcHJlZGVjZXNzb3Igb2YgdGhpcyBibG9jayBpZiBpdCBoYXMgYSBzaW5nbGUgcHJlZGVjZXNzb3IKKyAgLy8vIGJsb2NrLiBPdGhlcndpc2UgcmV0dXJuIGEgbnVsbCBwb2ludGVyLgorICBjb25zdCBCYXNpY0Jsb2NrICpnZXRTaW5nbGVQcmVkZWNlc3NvcigpIGNvbnN0OworICBCYXNpY0Jsb2NrICpnZXRTaW5nbGVQcmVkZWNlc3NvcigpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxCYXNpY0Jsb2NrICo+KAorICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBCYXNpY0Jsb2NrICo+KHRoaXMpLT5nZXRTaW5nbGVQcmVkZWNlc3NvcigpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBwcmVkZWNlc3NvciBvZiB0aGlzIGJsb2NrIGlmIGl0IGhhcyBhIHVuaXF1ZSBwcmVkZWNlc3NvcgorICAvLy8gYmxvY2suIE90aGVyd2lzZSByZXR1cm4gYSBudWxsIHBvaW50ZXIuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHVuaXF1ZSBwcmVkZWNlc3NvciBkb2Vzbid0IG1lYW4gc2luZ2xlIGVkZ2UsIHRoZXJlIGNhbiBiZQorICAvLy8gbXVsdGlwbGUgZWRnZXMgZnJvbSB0aGUgdW5pcXVlIHByZWRlY2Vzc29yIHRvIHRoaXMgYmxvY2sgKGZvciBleGFtcGxlIGEKKyAgLy8vIHN3aXRjaCBzdGF0ZW1lbnQgd2l0aCBtdWx0aXBsZSBjYXNlcyBoYXZpbmcgdGhlIHNhbWUgZGVzdGluYXRpb24pLgorICBjb25zdCBCYXNpY0Jsb2NrICpnZXRVbmlxdWVQcmVkZWNlc3NvcigpIGNvbnN0OworICBCYXNpY0Jsb2NrICpnZXRVbmlxdWVQcmVkZWNlc3NvcigpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxCYXNpY0Jsb2NrICo+KAorICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBCYXNpY0Jsb2NrICo+KHRoaXMpLT5nZXRVbmlxdWVQcmVkZWNlc3NvcigpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzdWNjZXNzb3Igb2YgdGhpcyBibG9jayBpZiBpdCBoYXMgYSBzaW5nbGUgc3VjY2Vzc29yLgorICAvLy8gT3RoZXJ3aXNlIHJldHVybiBhIG51bGwgcG9pbnRlci4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBpcyBhbmFsb2dvdXMgdG8gZ2V0U2luZ2xlUHJlZGVjZXNzb3IgYWJvdmUuCisgIGNvbnN0IEJhc2ljQmxvY2sgKmdldFNpbmdsZVN1Y2Nlc3NvcigpIGNvbnN0OworICBCYXNpY0Jsb2NrICpnZXRTaW5nbGVTdWNjZXNzb3IoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QmFzaWNCbG9jayAqPigKKyAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBCYXNpY0Jsb2NrICo+KHRoaXMpLT5nZXRTaW5nbGVTdWNjZXNzb3IoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgc3VjY2Vzc29yIG9mIHRoaXMgYmxvY2sgaWYgaXQgaGFzIGEgdW5pcXVlIHN1Y2Nlc3Nvci4KKyAgLy8vIE90aGVyd2lzZSByZXR1cm4gYSBudWxsIHBvaW50ZXIuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgaXMgYW5hbG9nb3VzIHRvIGdldFVuaXF1ZVByZWRlY2Vzc29yIGFib3ZlLgorICBjb25zdCBCYXNpY0Jsb2NrICpnZXRVbmlxdWVTdWNjZXNzb3IoKSBjb25zdDsKKyAgQmFzaWNCbG9jayAqZ2V0VW5pcXVlU3VjY2Vzc29yKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEJhc2ljQmxvY2sgKj4oCisgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQmFzaWNCbG9jayAqPih0aGlzKS0+Z2V0VW5pcXVlU3VjY2Vzc29yKCkpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBJbnN0cnVjdGlvbiBpdGVyYXRvciBtZXRob2RzCisgIC8vLworICBpbmxpbmUgaXRlcmF0b3IgICAgICAgICAgICAgICAgYmVnaW4oKSAgICAgICB7IHJldHVybiBJbnN0TGlzdC5iZWdpbigpOyB9CisgIGlubGluZSBjb25zdF9pdGVyYXRvciAgICAgICAgICBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEluc3RMaXN0LmJlZ2luKCk7IH0KKyAgaW5saW5lIGl0ZXJhdG9yICAgICAgICAgICAgICAgIGVuZCAgKCkgICAgICAgeyByZXR1cm4gSW5zdExpc3QuZW5kKCk7ICAgfQorICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgICAgICAgICAgZW5kICAoKSBjb25zdCB7IHJldHVybiBJbnN0TGlzdC5lbmQoKTsgICB9CisKKyAgaW5saW5lIHJldmVyc2VfaXRlcmF0b3IgICAgICAgIHJiZWdpbigpICAgICAgIHsgcmV0dXJuIEluc3RMaXN0LnJiZWdpbigpOyB9CisgIGlubGluZSBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yICByYmVnaW4oKSBjb25zdCB7IHJldHVybiBJbnN0TGlzdC5yYmVnaW4oKTsgfQorICBpbmxpbmUgcmV2ZXJzZV9pdGVyYXRvciAgICAgICAgcmVuZCAgKCkgICAgICAgeyByZXR1cm4gSW5zdExpc3QucmVuZCgpOyAgIH0KKyAgaW5saW5lIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgIHJlbmQgICgpIGNvbnN0IHsgcmV0dXJuIEluc3RMaXN0LnJlbmQoKTsgICB9CisKKyAgaW5saW5lIHNpemVfdCAgICAgICAgICAgICAgICAgICBzaXplKCkgY29uc3QgeyByZXR1cm4gSW5zdExpc3Quc2l6ZSgpOyAgfQorICBpbmxpbmUgYm9vbCAgICAgICAgICAgICAgICAgICAgZW1wdHkoKSBjb25zdCB7IHJldHVybiBJbnN0TGlzdC5lbXB0eSgpOyB9CisgIGlubGluZSBjb25zdCBJbnN0cnVjdGlvbiAgICAgICZmcm9udCgpIGNvbnN0IHsgcmV0dXJuIEluc3RMaXN0LmZyb250KCk7IH0KKyAgaW5saW5lICAgICAgIEluc3RydWN0aW9uICAgICAgJmZyb250KCkgICAgICAgeyByZXR1cm4gSW5zdExpc3QuZnJvbnQoKTsgfQorICBpbmxpbmUgY29uc3QgSW5zdHJ1Y3Rpb24gICAgICAgJmJhY2soKSBjb25zdCB7IHJldHVybiBJbnN0TGlzdC5iYWNrKCk7ICB9CisgIGlubGluZSAgICAgICBJbnN0cnVjdGlvbiAgICAgICAmYmFjaygpICAgICAgIHsgcmV0dXJuIEluc3RMaXN0LmJhY2soKTsgIH0KKworICAvLy8gSXRlcmF0b3IgdG8gd2FsayBqdXN0IHRoZSBwaGkgbm9kZXMgaW4gdGhlIGJhc2ljIGJsb2NrLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUEhJTm9kZVQgPSBQSElOb2RlLCB0eXBlbmFtZSBCQkl0ZXJhdG9yVCA9IGl0ZXJhdG9yPgorICBjbGFzcyBwaGlfaXRlcmF0b3JfaW1wbAorICAgICAgOiBwdWJsaWMgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8cGhpX2l0ZXJhdG9yX2ltcGw8UEhJTm9kZVQsIEJCSXRlcmF0b3JUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIFBISU5vZGVUPiB7CisgICAgZnJpZW5kIEJhc2ljQmxvY2s7CisKKyAgICBQSElOb2RlVCAqUE47CisKKyAgICBwaGlfaXRlcmF0b3JfaW1wbChQSElOb2RlVCAqUE4pIDogUE4oUE4pIHt9CisKKyAgcHVibGljOgorICAgIC8vIEFsbG93IGRlZmF1bHQgY29uc3RydWN0aW9uIHRvIGJ1aWxkIHZhcmlhYmxlcywgYnV0IHRoaXMgZG9lc24ndCBidWlsZAorICAgIC8vIGEgdXNlZnVsIGl0ZXJhdG9yLgorICAgIHBoaV9pdGVyYXRvcl9pbXBsKCkgPSBkZWZhdWx0OworCisgICAgLy8gQWxsb3cgY29udmVyc2lvbiBiZXR3ZWVuIGluc3RhbnRpYXRpb25zIHdoZXJlIHZhbGlkLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQSElOb2RlVSwgdHlwZW5hbWUgQkJJdGVyYXRvclU+CisgICAgcGhpX2l0ZXJhdG9yX2ltcGwoY29uc3QgcGhpX2l0ZXJhdG9yX2ltcGw8UEhJTm9kZVUsIEJCSXRlcmF0b3JVPiAmQXJnKQorICAgICAgICA6IFBOKEFyZy5QTikge30KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBwaGlfaXRlcmF0b3JfaW1wbCAmQXJnKSBjb25zdCB7IHJldHVybiBQTiA9PSBBcmcuUE47IH0KKworICAgIFBISU5vZGVUICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqUE47IH0KKworICAgIHVzaW5nIHBoaV9pdGVyYXRvcl9pbXBsOjppdGVyYXRvcl9mYWNhZGVfYmFzZTo6b3BlcmF0b3IrKzsKKyAgICBwaGlfaXRlcmF0b3JfaW1wbCAmb3BlcmF0b3IrKygpIHsKKyAgICAgIGFzc2VydChQTiAmJiAiQ2Fubm90IGluY3JlbWVudCB0aGUgZW5kIGl0ZXJhdG9yISIpOworICAgICAgUE4gPSBkeW5fY2FzdDxQSElOb2RlVD4oc3RkOjpuZXh0KEJCSXRlcmF0b3JUKFBOKSkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgfTsKKyAgdXNpbmcgcGhpX2l0ZXJhdG9yID0gcGhpX2l0ZXJhdG9yX2ltcGw8PjsKKyAgdXNpbmcgY29uc3RfcGhpX2l0ZXJhdG9yID0KKyAgICAgIHBoaV9pdGVyYXRvcl9pbXBsPGNvbnN0IFBISU5vZGUsIEJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yPjsKKworICAvLy8gUmV0dXJucyBhIHJhbmdlIHRoYXQgaXRlcmF0ZXMgb3ZlciB0aGUgcGhpcyBpbiB0aGUgYmFzaWMgYmxvY2suCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgY2Fubm90IGJlIHVzZWQgd2l0aCBiYXNpYyBibG9ja3MgdGhhdCBoYXZlIG5vIHRlcm1pbmF0b3IuCisgIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X3BoaV9pdGVyYXRvcj4gcGhpcygpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxCYXNpY0Jsb2NrICo+KHRoaXMpLT5waGlzKCk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8cGhpX2l0ZXJhdG9yPiBwaGlzKCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHVuZGVybHlpbmcgaW5zdHJ1Y3Rpb24gbGlzdCBjb250YWluZXIuCisgIC8vLworICAvLy8gQ3VycmVudGx5IHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgdW5kZXJseWluZyBpbnN0cnVjdGlvbiBsaXN0IGNvbnRhaW5lcgorICAvLy8gZGlyZWN0bHkgaWYgeW91IHdhbnQgdG8gbW9kaWZ5IGl0LgorICBjb25zdCBJbnN0TGlzdFR5cGUgJmdldEluc3RMaXN0KCkgY29uc3QgeyByZXR1cm4gSW5zdExpc3Q7IH0KKyAgICAgICAgSW5zdExpc3RUeXBlICZnZXRJbnN0TGlzdCgpICAgICAgIHsgcmV0dXJuIEluc3RMaXN0OyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgcG9pbnRlciB0byBhIG1lbWJlciBvZiB0aGUgaW5zdHJ1Y3Rpb24gbGlzdC4KKyAgc3RhdGljIEluc3RMaXN0VHlwZSBCYXNpY0Jsb2NrOjoqZ2V0U3VibGlzdEFjY2VzcyhJbnN0cnVjdGlvbiopIHsKKyAgICByZXR1cm4gJkJhc2ljQmxvY2s6Okluc3RMaXN0OworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3ltYm9sIHRhYmxlIGlmIG9uZSBleGlzdHMuCisgIFZhbHVlU3ltYm9sVGFibGUgKmdldFZhbHVlU3ltYm9sVGFibGUoKTsKKworICAvLy8gXGJyaWVmIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3QuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpCYXNpY0Jsb2NrVmFsOworICB9CisKKyAgLy8vIFxicmllZiBDYXVzZSBhbGwgc3ViaW5zdHJ1Y3Rpb25zIHRvICJsZXQgZ28iIG9mIGFsbCB0aGUgcmVmZXJlbmNlcyB0aGF0CisgIC8vLyBzYWlkIHN1Ymluc3RydWN0aW9ucyBhcmUgbWFpbnRhaW5pbmcuCisgIC8vLworICAvLy8gVGhpcyBhbGxvd3Mgb25lIHRvICdkZWxldGUnIGEgd2hvbGUgY2xhc3MgYXQgYSB0aW1lLCBldmVuIHRob3VnaCB0aGVyZSBtYXkKKyAgLy8vIGJlIGNpcmN1bGFyIHJlZmVyZW5jZXMuLi4gZmlyc3QgYWxsIHJlZmVyZW5jZXMgYXJlIGRyb3BwZWQsIGFuZCBhbGwgdXNlCisgIC8vLyBjb3VudHMgZ28gdG8gemVyby4gIFRoZW4gZXZlcnl0aGluZyBpcyBkZWxldGUnZCBmb3IgcmVhbC4gIE5vdGUgdGhhdCBubworICAvLy8gb3BlcmF0aW9ucyBhcmUgdmFsaWQgb24gYW4gb2JqZWN0IHRoYXQgaGFzICJkcm9wcGVkIGFsbCByZWZlcmVuY2VzIiwKKyAgLy8vIGV4Y2VwdCBvcGVyYXRvciBkZWxldGUuCisgIHZvaWQgZHJvcEFsbFJlZmVyZW5jZXMoKTsKKworICAvLy8gXGJyaWVmIE5vdGlmeSB0aGUgQmFzaWNCbG9jayB0aGF0IHRoZSBwcmVkZWNlc3NvciBccCBQcmVkIGlzIG5vIGxvbmdlcgorICAvLy8gYWJsZSB0byByZWFjaCBpdC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGFjdHVhbGx5IG5vdCB1c2VkIHRvIHVwZGF0ZSB0aGUgUHJlZGVjZXNzb3IgbGlzdCwgYnV0IGlzIGFjdHVhbGx5CisgIC8vLyB1c2VkIHRvIHVwZGF0ZSB0aGUgUEhJIG5vZGVzIHRoYXQgcmVzaWRlIGluIHRoZSBibG9jay4gIE5vdGUgdGhhdCB0aGlzCisgIC8vLyBzaG91bGQgYmUgY2FsbGVkIHdoaWxlIHRoZSBwcmVkZWNlc3NvciBzdGlsbCByZWZlcnMgdG8gdGhpcyBibG9jay4KKyAgdm9pZCByZW1vdmVQcmVkZWNlc3NvcihCYXNpY0Jsb2NrICpQcmVkLCBib29sIERvbnREZWxldGVVc2VsZXNzUEhJcyA9IGZhbHNlKTsKKworICBib29sIGNhblNwbGl0UHJlZGVjZXNzb3JzKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTcGxpdCB0aGUgYmFzaWMgYmxvY2sgaW50byB0d28gYmFzaWMgYmxvY2tzIGF0IHRoZSBzcGVjaWZpZWQKKyAgLy8vIGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBhbGwgaW5zdHJ1Y3Rpb25zIEJFRk9SRSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHN0YXkgYXMgcGFydCBvZgorICAvLy8gdGhlIG9yaWdpbmFsIGJhc2ljIGJsb2NrLCBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCBpcyBhZGRlZCB0byB0aGUgb3JpZ2luYWwKKyAgLy8vIEJCLCBhbmQgdGhlIHJlc3Qgb2YgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgQkIgYXJlIG1vdmVkIHRvIHRoZSBuZXcgQkIsCisgIC8vLyBpbmNsdWRpbmcgdGhlIG9sZCB0ZXJtaW5hdG9yLiAgVGhlIG5ld2x5IGZvcm1lZCBCYXNpY0Jsb2NrIGlzIHJldHVybmVkLgorICAvLy8gVGhpcyBmdW5jdGlvbiBpbnZhbGlkYXRlcyB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3Mgb24gd2VsbCBmb3JtZWQgYmFzaWMgYmxvY2tzIChtdXN0IGhhdmUgYQorICAvLy8gdGVybWluYXRvciksIGFuZCAnSScgbXVzdCBub3QgYmUgdGhlIGVuZCBvZiBpbnN0cnVjdGlvbiBsaXN0ICh3aGljaCB3b3VsZAorICAvLy8gY2F1c2UgYSBkZWdlbmVyYXRlIGJhc2ljIGJsb2NrIHRvIGJlIGZvcm1lZCwgaGF2aW5nIGEgdGVybWluYXRvciBpbnNpZGUgb2YKKyAgLy8vIHRoZSBiYXNpYyBibG9jaykuCisgIC8vLworICAvLy8gQWxzbyBub3RlIHRoYXQgdGhpcyBkb2Vzbid0IHByZXNlcnZlIGFueSBwYXNzZXMuIFRvIHNwbGl0IGJsb2NrcyB3aGlsZQorICAvLy8ga2VlcGluZyBsb29wIGluZm9ybWF0aW9uIGNvbnNpc3RlbnQsIHVzZSB0aGUgU3BsaXRCbG9jayB1dGlsaXR5IGZ1bmN0aW9uLgorICBCYXNpY0Jsb2NrICpzcGxpdEJhc2ljQmxvY2soaXRlcmF0b3IgSSwgY29uc3QgVHdpbmUgJkJCTmFtZSA9ICIiKTsKKyAgQmFzaWNCbG9jayAqc3BsaXRCYXNpY0Jsb2NrKEluc3RydWN0aW9uICpJLCBjb25zdCBUd2luZSAmQkJOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gc3BsaXRCYXNpY0Jsb2NrKEktPmdldEl0ZXJhdG9yKCksIEJCTmFtZSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IHVzZXMgb2YgdGhpcyBiYXNpYyBibG9jayBvdGhlciB0aGFuCisgIC8vLyBkaXJlY3QgYnJhbmNoZXMsIHN3aXRjaGVzLCBldGMuIHRvIGl0LgorICBib29sIGhhc0FkZHJlc3NUYWtlbigpIGNvbnN0IHsgcmV0dXJuIGdldFN1YmNsYXNzRGF0YUZyb21WYWx1ZSgpICE9IDA7IH0KKworICAvLy8gXGJyaWVmIFVwZGF0ZSBhbGwgcGhpIG5vZGVzIGluIHRoaXMgYmFzaWMgYmxvY2sncyBzdWNjZXNzb3JzIHRvIHJlZmVyIHRvCisgIC8vLyBiYXNpYyBibG9jayBccCBOZXcgaW5zdGVhZCBvZiB0byBpdC4KKyAgdm9pZCByZXBsYWNlU3VjY2Vzc29yc1BoaVVzZXNXaXRoKEJhc2ljQmxvY2sgKk5ldyk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGJhc2ljIGJsb2NrIGlzIGFuIGV4Y2VwdGlvbiBoYW5kbGluZyBibG9jay4KKyAgYm9vbCBpc0VIUGFkKCkgY29uc3QgeyByZXR1cm4gZ2V0Rmlyc3ROb25QSEkoKS0+aXNFSFBhZCgpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGJhc2ljIGJsb2NrIGlzIGEgbGFuZGluZyBwYWQuCisgIC8vLworICAvLy8gQmVpbmcgYSBgYGxhbmRpbmcgcGFkJycgbWVhbnMgdGhhdCB0aGUgYmFzaWMgYmxvY2sgaXMgdGhlIGRlc3RpbmF0aW9uIG9mCisgIC8vLyB0aGUgJ3Vud2luZCcgZWRnZSBvZiBhbiBpbnZva2UgaW5zdHJ1Y3Rpb24uCisgIGJvb2wgaXNMYW5kaW5nUGFkKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGxhbmRpbmdwYWQgaW5zdHJ1Y3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBsYW5kaW5nIHBhZC4KKyAgY29uc3QgTGFuZGluZ1BhZEluc3QgKmdldExhbmRpbmdQYWRJbnN0KCkgY29uc3Q7CisgIExhbmRpbmdQYWRJbnN0ICpnZXRMYW5kaW5nUGFkSW5zdCgpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxMYW5kaW5nUGFkSW5zdCAqPigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQmFzaWNCbG9jayAqPih0aGlzKS0+Z2V0TGFuZGluZ1BhZEluc3QoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIGl0IGlzIGxlZ2FsIHRvIGhvaXN0IGluc3RydWN0aW9ucyBpbnRvIHRoaXMgYmxvY2suCisgIGJvb2wgaXNMZWdhbFRvSG9pc3RJbnRvKCkgY29uc3Q7CisKKyAgT3B0aW9uYWw8dWludDY0X3Q+IGdldElyckxvb3BIZWFkZXJXZWlnaHQoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBJbmNyZW1lbnQgdGhlIGludGVybmFsIHJlZmNvdW50IG9mIHRoZSBudW1iZXIgb2YgQmxvY2tBZGRyZXNzZXMKKyAgLy8vIHJlZmVyZW5jaW5nIHRoaXMgQmFzaWNCbG9jayBieSBccCBBbXQuCisgIC8vLworICAvLy8gVGhpcyBpcyBhbG1vc3QgYWx3YXlzIDAsIHNvbWV0aW1lcyBvbmUgcG9zc2libHksIGJ1dCBhbG1vc3QgbmV2ZXIgMiwgYW5kCisgIC8vLyBpbmNvbmNlaXZhYmx5IDMgb3IgbW9yZS4KKyAgdm9pZCBBZGp1c3RCbG9ja0FkZHJlc3NSZWZDb3VudChpbnQgQW10KSB7CisgICAgc2V0VmFsdWVTdWJjbGFzc0RhdGEoZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkrQW10KTsKKyAgICBhc3NlcnQoKGludCkoc2lnbmVkIGNoYXIpZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgPj0gMCAmJgorICAgICAgICAgICAiUmVmY291bnQgd3JhcC1hcm91bmQiKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2hhZG93IFZhbHVlOjpzZXRWYWx1ZVN1YmNsYXNzRGF0YSB3aXRoIGEgcHJpdmF0ZSBmb3J3YXJkaW5nIG1ldGhvZAorICAvLy8gc28gdGhhdCBhbnkgZnV0dXJlIHN1YmNsYXNzZXMgY2Fubm90IGFjY2lkZW50YWxseSB1c2UgaXQuCisgIHZvaWQgc2V0VmFsdWVTdWJjbGFzc0RhdGEodW5zaWduZWQgc2hvcnQgRCkgeworICAgIFZhbHVlOjpzZXRWYWx1ZVN1YmNsYXNzRGF0YShEKTsKKyAgfQorfTsKKworLy8gQ3JlYXRlIHdyYXBwZXJzIGZvciBDIEJpbmRpbmcgdHlwZXMgKHNlZSBDQmluZGluZ1dyYXBwaW5nLmgpLgorREVGSU5FX1NJTVBMRV9DT05WRVJTSU9OX0ZVTkNUSU9OUyhCYXNpY0Jsb2NrLCBMTFZNQmFzaWNCbG9ja1JlZikKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfQkFTSUNCTE9DS19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0NGRy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9DRkcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjU5ZTQyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9DRkcuaApAQCAtMCwwICsxLDI2NiBAQAorLy89PT0tIENGRy5oIC0gUHJvY2VzcyBMTFZNIHN0cnVjdHVyZXMgYXMgZ3JhcGhzIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBzcGVjaWFsaXphdGlvbnMgb2YgR3JhcGhUcmFpdHMgdGhhdCBhbGxvdyBGdW5jdGlvbiBhbmQKKy8vIEJhc2ljQmxvY2sgZ3JhcGhzIHRvIGJlIHRyZWF0ZWQgYXMgcHJvcGVyIGdyYXBocyBmb3IgZ2VuZXJpYyBhbGdvcml0aG1zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9DRkdfSAorI2RlZmluZSBMTFZNX0lSX0NGR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0clR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBCYXNpY0Jsb2NrIHByZWRfaXRlcmF0b3IgZGVmaW5pdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPGNsYXNzIFB0ciwgY2xhc3MgVVNFX2l0ZXJhdG9yPiAvLyBQcmVkZWNlc3NvciBJdGVyYXRvcgorY2xhc3MgUHJlZEl0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0ciwgcHRyZGlmZl90LCBQdHIqLCBQdHIqPiB7CisgIHVzaW5nIHN1cGVyID0KKyAgICAgIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgUHRyLCBwdHJkaWZmX3QsIFB0ciosIFB0cio+OworICB1c2luZyBTZWxmID0gUHJlZEl0ZXJhdG9yPFB0ciwgVVNFX2l0ZXJhdG9yPjsKKyAgVVNFX2l0ZXJhdG9yIEl0OworCisgIGlubGluZSB2b2lkIGFkdmFuY2VQYXN0Tm9uVGVybWluYXRvcnMoKSB7CisgICAgLy8gTG9vcCB0byBpZ25vcmUgbm9uLXRlcm1pbmF0b3IgdXNlcyAoZm9yIGV4YW1wbGUgQmxvY2tBZGRyZXNzZXMpLgorICAgIHdoaWxlICghSXQuYXRFbmQoKSAmJiAhaXNhPFRlcm1pbmF0b3JJbnN0PigqSXQpKQorICAgICAgKytJdDsKKyAgfQorCitwdWJsaWM6CisgIHVzaW5nIHBvaW50ZXIgPSB0eXBlbmFtZSBzdXBlcjo6cG9pbnRlcjsKKyAgdXNpbmcgcmVmZXJlbmNlID0gdHlwZW5hbWUgc3VwZXI6OnJlZmVyZW5jZTsKKworICBQcmVkSXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IGlubGluZSBQcmVkSXRlcmF0b3IoUHRyICpiYikgOiBJdChiYi0+dXNlcl9iZWdpbigpKSB7CisgICAgYWR2YW5jZVBhc3ROb25UZXJtaW5hdG9ycygpOworICB9CisgIGlubGluZSBQcmVkSXRlcmF0b3IoUHRyICpiYiwgYm9vbCkgOiBJdChiYi0+dXNlcl9lbmQoKSkge30KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNlbGYmIHgpIGNvbnN0IHsgcmV0dXJuIEl0ID09IHguSXQ7IH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTZWxmJiB4KSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3I9PSh4KTsgfQorCisgIGlubGluZSByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGFzc2VydCghSXQuYXRFbmQoKSAmJiAicHJlZF9pdGVyYXRvciBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGNhc3Q8VGVybWluYXRvckluc3Q+KCpJdCktPmdldFBhcmVudCgpOworICB9CisgIGlubGluZSBwb2ludGVyICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJm9wZXJhdG9yKigpOyB9CisKKyAgaW5saW5lIFNlbGYmIG9wZXJhdG9yKysoKSB7ICAgLy8gUHJlaW5jcmVtZW50CisgICAgYXNzZXJ0KCFJdC5hdEVuZCgpICYmICJwcmVkX2l0ZXJhdG9yIG91dCBvZiByYW5nZSEiKTsKKyAgICArK0l0OyBhZHZhbmNlUGFzdE5vblRlcm1pbmF0b3JzKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIFNlbGYgb3BlcmF0b3IrKyhpbnQpIHsgLy8gUG9zdGluY3JlbWVudAorICAgIFNlbGYgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgIH0KKworICAvLy8gZ2V0T3BlcmFuZE5vIC0gUmV0dXJuIHRoZSBvcGVyYW5kIG51bWJlciBpbiB0aGUgcHJlZGVjZXNzb3IncworICAvLy8gdGVybWluYXRvciBvZiB0aGUgc3VjY2Vzc29yLgorICB1bnNpZ25lZCBnZXRPcGVyYW5kTm8oKSBjb25zdCB7CisgICAgcmV0dXJuIEl0LmdldE9wZXJhbmRObygpOworICB9CisKKyAgLy8vIGdldFVzZSAtIFJldHVybiB0aGUgb3BlcmFuZCBVc2UgaW4gdGhlIHByZWRlY2Vzc29yJ3MgdGVybWluYXRvcgorICAvLy8gb2YgdGhlIHN1Y2Nlc3Nvci4KKyAgVXNlICZnZXRVc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIEl0LmdldFVzZSgpOworICB9Cit9OworCit1c2luZyBwcmVkX2l0ZXJhdG9yID0gUHJlZEl0ZXJhdG9yPEJhc2ljQmxvY2ssIFZhbHVlOjp1c2VyX2l0ZXJhdG9yPjsKK3VzaW5nIGNvbnN0X3ByZWRfaXRlcmF0b3IgPQorICAgIFByZWRJdGVyYXRvcjxjb25zdCBCYXNpY0Jsb2NrLCBWYWx1ZTo6Y29uc3RfdXNlcl9pdGVyYXRvcj47Cit1c2luZyBwcmVkX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8cHJlZF9pdGVyYXRvcj47Cit1c2luZyBwcmVkX2NvbnN0X3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8Y29uc3RfcHJlZF9pdGVyYXRvcj47CisKK2lubGluZSBwcmVkX2l0ZXJhdG9yIHByZWRfYmVnaW4oQmFzaWNCbG9jayAqQkIpIHsgcmV0dXJuIHByZWRfaXRlcmF0b3IoQkIpOyB9CitpbmxpbmUgY29uc3RfcHJlZF9pdGVyYXRvciBwcmVkX2JlZ2luKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSB7CisgIHJldHVybiBjb25zdF9wcmVkX2l0ZXJhdG9yKEJCKTsKK30KK2lubGluZSBwcmVkX2l0ZXJhdG9yIHByZWRfZW5kKEJhc2ljQmxvY2sgKkJCKSB7IHJldHVybiBwcmVkX2l0ZXJhdG9yKEJCLCB0cnVlKTt9CitpbmxpbmUgY29uc3RfcHJlZF9pdGVyYXRvciBwcmVkX2VuZChjb25zdCBCYXNpY0Jsb2NrICpCQikgeworICByZXR1cm4gY29uc3RfcHJlZF9pdGVyYXRvcihCQiwgdHJ1ZSk7Cit9CitpbmxpbmUgYm9vbCBwcmVkX2VtcHR5KGNvbnN0IEJhc2ljQmxvY2sgKkJCKSB7CisgIHJldHVybiBwcmVkX2JlZ2luKEJCKSA9PSBwcmVkX2VuZChCQik7Cit9CitpbmxpbmUgcHJlZF9yYW5nZSBwcmVkZWNlc3NvcnMoQmFzaWNCbG9jayAqQkIpIHsKKyAgcmV0dXJuIHByZWRfcmFuZ2UocHJlZF9iZWdpbihCQiksIHByZWRfZW5kKEJCKSk7Cit9CitpbmxpbmUgcHJlZF9jb25zdF9yYW5nZSBwcmVkZWNlc3NvcnMoY29uc3QgQmFzaWNCbG9jayAqQkIpIHsKKyAgcmV0dXJuIHByZWRfY29uc3RfcmFuZ2UocHJlZF9iZWdpbihCQiksIHByZWRfZW5kKEJCKSk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBCYXNpY0Jsb2NrIHN1Y2NfaXRlcmF0b3IgaGVscGVycworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordXNpbmcgc3VjY19pdGVyYXRvciA9CisgICAgVGVybWluYXRvckluc3Q6OlN1Y2NJdGVyYXRvcjxUZXJtaW5hdG9ySW5zdCAqLCBCYXNpY0Jsb2NrPjsKK3VzaW5nIHN1Y2NfY29uc3RfaXRlcmF0b3IgPQorICAgIFRlcm1pbmF0b3JJbnN0OjpTdWNjSXRlcmF0b3I8Y29uc3QgVGVybWluYXRvckluc3QgKiwgY29uc3QgQmFzaWNCbG9jaz47Cit1c2luZyBzdWNjX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8c3VjY19pdGVyYXRvcj47Cit1c2luZyBzdWNjX2NvbnN0X3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8c3VjY19jb25zdF9pdGVyYXRvcj47CisKK2lubGluZSBzdWNjX2l0ZXJhdG9yIHN1Y2NfYmVnaW4oQmFzaWNCbG9jayAqQkIpIHsKKyAgcmV0dXJuIHN1Y2NfaXRlcmF0b3IoQkItPmdldFRlcm1pbmF0b3IoKSk7Cit9CitpbmxpbmUgc3VjY19jb25zdF9pdGVyYXRvciBzdWNjX2JlZ2luKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSB7CisgIHJldHVybiBzdWNjX2NvbnN0X2l0ZXJhdG9yKEJCLT5nZXRUZXJtaW5hdG9yKCkpOworfQoraW5saW5lIHN1Y2NfaXRlcmF0b3Igc3VjY19lbmQoQmFzaWNCbG9jayAqQkIpIHsKKyAgcmV0dXJuIHN1Y2NfaXRlcmF0b3IoQkItPmdldFRlcm1pbmF0b3IoKSwgdHJ1ZSk7Cit9CitpbmxpbmUgc3VjY19jb25zdF9pdGVyYXRvciBzdWNjX2VuZChjb25zdCBCYXNpY0Jsb2NrICpCQikgeworICByZXR1cm4gc3VjY19jb25zdF9pdGVyYXRvcihCQi0+Z2V0VGVybWluYXRvcigpLCB0cnVlKTsKK30KK2lubGluZSBib29sIHN1Y2NfZW1wdHkoY29uc3QgQmFzaWNCbG9jayAqQkIpIHsKKyAgcmV0dXJuIHN1Y2NfYmVnaW4oQkIpID09IHN1Y2NfZW5kKEJCKTsKK30KK2lubGluZSBzdWNjX3JhbmdlIHN1Y2Nlc3NvcnMoQmFzaWNCbG9jayAqQkIpIHsKKyAgcmV0dXJuIHN1Y2NfcmFuZ2Uoc3VjY19iZWdpbihCQiksIHN1Y2NfZW5kKEJCKSk7Cit9CitpbmxpbmUgc3VjY19jb25zdF9yYW5nZSBzdWNjZXNzb3JzKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSB7CisgIHJldHVybiBzdWNjX2NvbnN0X3JhbmdlKHN1Y2NfYmVnaW4oQkIpLCBzdWNjX2VuZChCQikpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0cnVjdCBpc1BvZExpa2U8VGVybWluYXRvckluc3Q6OlN1Y2NJdGVyYXRvcjxULCBVPj4geworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGlzUG9kTGlrZTxUPjo6dmFsdWU7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEdyYXBoVHJhaXRzIHNwZWNpYWxpemF0aW9ucyBmb3IgYmFzaWMgYmxvY2sgZ3JhcGhzIChDRkdzKQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFByb3ZpZGUgc3BlY2lhbGl6YXRpb25zIG9mIEdyYXBoVHJhaXRzIHRvIGJlIGFibGUgdG8gdHJlYXQgYSBmdW5jdGlvbiBhcyBhCisvLyBncmFwaCBvZiBiYXNpYyBibG9ja3MuLi4KKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEJhc2ljQmxvY2sqPiB7CisgIHVzaW5nIE5vZGVSZWYgPSBCYXNpY0Jsb2NrICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gc3VjY19pdGVyYXRvcjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoQmFzaWNCbG9jayAqQkIpIHsgcmV0dXJuIEJCOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIHN1Y2NfYmVnaW4oTik7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsgcmV0dXJuIHN1Y2NfZW5kKE4pOyB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8Y29uc3QgQmFzaWNCbG9jayo+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IGNvbnN0IEJhc2ljQmxvY2sgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBzdWNjX2NvbnN0X2l0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShjb25zdCBCYXNpY0Jsb2NrICpCQikgeyByZXR1cm4gQkI7IH0KKworICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7IHJldHVybiBzdWNjX2JlZ2luKE4pOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBzdWNjX2VuZChOKTsgfQorfTsKKworLy8gUHJvdmlkZSBzcGVjaWFsaXphdGlvbnMgb2YgR3JhcGhUcmFpdHMgdG8gYmUgYWJsZSB0byB0cmVhdCBhIGZ1bmN0aW9uIGFzIGEKKy8vIGdyYXBoIG9mIGJhc2ljIGJsb2Nrcy4uLiBhbmQgdG8gd2FsayBpdCBpbiBpbnZlcnNlIG9yZGVyLiAgSW52ZXJzZSBvcmRlciBmb3IKKy8vIGEgZnVuY3Rpb24gaXMgY29uc2lkZXJlZCB0byBiZSB3aGVuIHRyYXZlcnNpbmcgdGhlIHByZWRlY2Vzc29yIGVkZ2VzIG9mIGEgQkIKKy8vIGluc3RlYWQgb2YgdGhlIHN1Y2Nlc3NvciBlZGdlcy4KKy8vCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8SW52ZXJzZTxCYXNpY0Jsb2NrKj4+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IEJhc2ljQmxvY2sgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBwcmVkX2l0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShJbnZlcnNlPEJhc2ljQmxvY2sgKj4gRykgeyByZXR1cm4gRy5HcmFwaDsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7IHJldHVybiBwcmVkX2JlZ2luKE4pOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBwcmVkX2VuZChOKTsgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEludmVyc2U8Y29uc3QgQmFzaWNCbG9jayo+PiB7CisgIHVzaW5nIE5vZGVSZWYgPSBjb25zdCBCYXNpY0Jsb2NrICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gY29uc3RfcHJlZF9pdGVyYXRvcjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoSW52ZXJzZTxjb25zdCBCYXNpY0Jsb2NrICo+IEcpIHsgcmV0dXJuIEcuR3JhcGg7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeyByZXR1cm4gcHJlZF9iZWdpbihOKTsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gcHJlZF9lbmQoTik7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gR3JhcGhUcmFpdHMgc3BlY2lhbGl6YXRpb25zIGZvciBmdW5jdGlvbiBiYXNpYyBibG9jayBncmFwaHMgKENGR3MpCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gUHJvdmlkZSBzcGVjaWFsaXphdGlvbnMgb2YgR3JhcGhUcmFpdHMgdG8gYmUgYWJsZSB0byB0cmVhdCBhIGZ1bmN0aW9uIGFzIGEKKy8vIGdyYXBoIG9mIGJhc2ljIGJsb2Nrcy4uLiB0aGVzZSBhcmUgdGhlIHNhbWUgYXMgdGhlIGJhc2ljIGJsb2NrIGl0ZXJhdG9ycywKKy8vIGV4Y2VwdCB0aGF0IHRoZSByb290IG5vZGUgaXMgaW1wbGljaXRseSB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgZnVuY3Rpb24uCisvLwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEZ1bmN0aW9uKj4gOiBwdWJsaWMgR3JhcGhUcmFpdHM8QmFzaWNCbG9jayo+IHsKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKEZ1bmN0aW9uICpGKSB7IHJldHVybiAmRi0+Z2V0RW50cnlCbG9jaygpOyB9CisKKyAgLy8gbm9kZXNfaXRlcmF0b3IvYmVnaW4vZW5kIC0gQWxsb3cgaXRlcmF0aW9uIG92ZXIgYWxsIG5vZGVzIGluIHRoZSBncmFwaAorICB1c2luZyBub2Rlc19pdGVyYXRvciA9IHBvaW50ZXJfaXRlcmF0b3I8RnVuY3Rpb246Oml0ZXJhdG9yPjsKKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oRnVuY3Rpb24gKkYpIHsKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3IoRi0+YmVnaW4oKSk7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKEZ1bmN0aW9uICpGKSB7CisgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yKEYtPmVuZCgpKTsKKyAgfQorCisgIHN0YXRpYyBzaXplX3Qgc2l6ZShGdW5jdGlvbiAqRikgeyByZXR1cm4gRi0+c2l6ZSgpOyB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPGNvbnN0IEZ1bmN0aW9uKj4gOgorICBwdWJsaWMgR3JhcGhUcmFpdHM8Y29uc3QgQmFzaWNCbG9jayo+IHsKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKGNvbnN0IEZ1bmN0aW9uICpGKSB7IHJldHVybiAmRi0+Z2V0RW50cnlCbG9jaygpOyB9CisKKyAgLy8gbm9kZXNfaXRlcmF0b3IvYmVnaW4vZW5kIC0gQWxsb3cgaXRlcmF0aW9uIG92ZXIgYWxsIG5vZGVzIGluIHRoZSBncmFwaAorICB1c2luZyBub2Rlc19pdGVyYXRvciA9IHBvaW50ZXJfaXRlcmF0b3I8RnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yPjsKKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3IoRi0+YmVnaW4oKSk7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yKEYtPmVuZCgpKTsKKyAgfQorCisgIHN0YXRpYyBzaXplX3Qgc2l6ZShjb25zdCBGdW5jdGlvbiAqRikgeyByZXR1cm4gRi0+c2l6ZSgpOyB9Cit9OworCisvLyBQcm92aWRlIHNwZWNpYWxpemF0aW9ucyBvZiBHcmFwaFRyYWl0cyB0byBiZSBhYmxlIHRvIHRyZWF0IGEgZnVuY3Rpb24gYXMgYQorLy8gZ3JhcGggb2YgYmFzaWMgYmxvY2tzLi4uIGFuZCB0byB3YWxrIGl0IGluIGludmVyc2Ugb3JkZXIuICBJbnZlcnNlIG9yZGVyIGZvcgorLy8gYSBmdW5jdGlvbiBpcyBjb25zaWRlcmVkIHRvIGJlIHdoZW4gdHJhdmVyc2luZyB0aGUgcHJlZGVjZXNzb3IgZWRnZXMgb2YgYSBCQgorLy8gaW5zdGVhZCBvZiB0aGUgc3VjY2Vzc29yIGVkZ2VzLgorLy8KK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxJbnZlcnNlPEZ1bmN0aW9uKj4+IDoKKyAgcHVibGljIEdyYXBoVHJhaXRzPEludmVyc2U8QmFzaWNCbG9jayo+PiB7CisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShJbnZlcnNlPEZ1bmN0aW9uICo+IEcpIHsKKyAgICByZXR1cm4gJkcuR3JhcGgtPmdldEVudHJ5QmxvY2soKTsKKyAgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxJbnZlcnNlPGNvbnN0IEZ1bmN0aW9uKj4+IDoKKyAgcHVibGljIEdyYXBoVHJhaXRzPEludmVyc2U8Y29uc3QgQmFzaWNCbG9jayo+PiB7CisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShJbnZlcnNlPGNvbnN0IEZ1bmN0aW9uICo+IEcpIHsKKyAgICByZXR1cm4gJkcuR3JhcGgtPmdldEVudHJ5QmxvY2soKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfQ0ZHX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQ2FsbFNpdGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQ2FsbFNpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjEwZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9DYWxsU2l0ZS5oCkBAIC0wLDAgKzEsNzI1IEBACisvLz09PS0gQ2FsbFNpdGUuaCAtIEFic3RyYWN0IENhbGwgJiBJbnZva2UgaW5zdHJzIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBDYWxsU2l0ZSBjbGFzcywgd2hpY2ggaXMgYSBoYW5keSB3cmFwcGVyIGZvciBjb2RlIHRoYXQKKy8vIHdhbnRzIHRvIHRyZWF0IENhbGwgYW5kIEludm9rZSBpbnN0cnVjdGlvbnMgaW4gYSBnZW5lcmljIHdheS4gV2hlbiBpbiBub24tCisvLyBtdXRhdGlvbiBjb250ZXh0IChlLmcuIGFuIGFuYWx5c2lzKSBJbW11dGFibGVDYWxsU2l0ZSBzaG91bGQgYmUgdXNlZC4KKy8vIEZpbmFsbHksIHdoZW4gc29tZSBkZWdyZWUgb2YgY3VzdG9taXphdGlvbiBpcyBuZWNlc3NhcnkgYmV0d2VlbiB0aGVzZSB0d28KKy8vIGV4dHJlbWVzLCBDYWxsU2l0ZUJhc2U8PiBjYW4gYmUgc3VwcGxpZWQgd2l0aCBmaW5lLXR1bmVkIHBhcmFtZXRlcnMuCisvLworLy8gTk9URTogVGhlc2UgY2xhc3NlcyBhcmUgc3VwcG9zZWQgdG8gaGF2ZSAidmFsdWUgc2VtYW50aWNzIi4gU28gdGhleSBzaG91bGQgYmUKKy8vIHBhc3NlZCBieSB2YWx1ZSwgbm90IGJ5IHJlZmVyZW5jZTsgdGhleSBzaG91bGQgbm90IGJlICJuZXciZWQgb3IgImRlbGV0ZSJkLgorLy8gVGhleSBhcmUgZWZmaWNpZW50bHkgY29weWFibGUsIGFzc2lnbmFibGUgYW5kIGNvbnN0cnVjdGFibGUsIHdpdGggY29zdAorLy8gZXF1aXZhbGVudCB0byBjb3B5aW5nIGEgcG9pbnRlciAobm90aWNlIHRoYXQgdGhleSBoYXZlIG9ubHkgYSBzaW5nbGUgZGF0YQorLy8gbWVtYmVyKS4gVGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGNhcnJpZXMgYSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGljaCBvZgorLy8gdGhlIHR3byB2YXJpYW50cyBpcyBlbmNsb3NlZC4gVGhpcyBhbGxvd3MgZm9yIGNoZWFwZXIgY2hlY2tzIHdoZW4gdmFyaW91cworLy8gYWNjZXNzb3JzIG9mIENhbGxTaXRlIGFyZSBlbXBsb3llZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfQ0FMTFNJVEVfSAorI2RlZmluZSBMTFZNX0lSX0NBTExTSVRFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0clR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Vc2UuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1VzZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIEludHJpbnNpYyB7CitlbnVtIElEIDogdW5zaWduZWQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGdW5UeSA9IGNvbnN0IEZ1bmN0aW9uLAorICAgICAgICAgIHR5cGVuYW1lIEJCVHkgPSBjb25zdCBCYXNpY0Jsb2NrLAorICAgICAgICAgIHR5cGVuYW1lIFZhbFR5ID0gY29uc3QgVmFsdWUsCisgICAgICAgICAgdHlwZW5hbWUgVXNlclR5ID0gY29uc3QgVXNlciwKKyAgICAgICAgICB0eXBlbmFtZSBVc2VUeSA9IGNvbnN0IFVzZSwKKyAgICAgICAgICB0eXBlbmFtZSBJbnN0clR5ID0gY29uc3QgSW5zdHJ1Y3Rpb24sCisgICAgICAgICAgdHlwZW5hbWUgQ2FsbFR5ID0gY29uc3QgQ2FsbEluc3QsCisgICAgICAgICAgdHlwZW5hbWUgSW52b2tlVHkgPSBjb25zdCBJbnZva2VJbnN0LAorICAgICAgICAgIHR5cGVuYW1lIEl0ZXJUeSA9IFVzZXI6OmNvbnN0X29wX2l0ZXJhdG9yPgorY2xhc3MgQ2FsbFNpdGVCYXNlIHsKK3Byb3RlY3RlZDoKKyAgUG9pbnRlckludFBhaXI8SW5zdHJUeSosIDEsIGJvb2w+IEk7CisKKyAgQ2FsbFNpdGVCYXNlKCkgPSBkZWZhdWx0OworICBDYWxsU2l0ZUJhc2UoQ2FsbFR5ICpDSSkgOiBJKENJLCB0cnVlKSB7IGFzc2VydChDSSk7IH0KKyAgQ2FsbFNpdGVCYXNlKEludm9rZVR5ICpJSSkgOiBJKElJLCBmYWxzZSkgeyBhc3NlcnQoSUkpOyB9CisgIGV4cGxpY2l0IENhbGxTaXRlQmFzZShWYWxUeSAqSUkpIHsgKnRoaXMgPSBnZXQoSUkpOyB9CisKK3ByaXZhdGU6CisgIC8vLyBUaGlzIHN0YXRpYyBtZXRob2QgaXMgbGlrZSBhIGNvbnN0cnVjdG9yLiBJdCB3aWxsIGNyZWF0ZSBhbiBhcHByb3ByaWF0ZQorICAvLy8gY2FsbCBzaXRlIGZvciBhIENhbGwgb3IgSW52b2tlIGluc3RydWN0aW9uLCBidXQgaXQgY2FuIGFsc28gY3JlYXRlIGEgbnVsbAorICAvLy8gaW5pdGlhbGl6ZWQgQ2FsbFNpdGVCYXNlIG9iamVjdCBmb3Igc29tZXRoaW5nIHdoaWNoIGlzIE5PVCBhIGNhbGwgc2l0ZS4KKyAgc3RhdGljIENhbGxTaXRlQmFzZSBnZXQoVmFsVHkgKlYpIHsKKyAgICBpZiAoSW5zdHJUeSAqSUkgPSBkeW5fY2FzdDxJbnN0clR5PihWKSkgeworICAgICAgaWYgKElJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6Q2FsbCkKKyAgICAgICAgcmV0dXJuIENhbGxTaXRlQmFzZShzdGF0aWNfY2FzdDxDYWxsVHkqPihJSSkpOworICAgICAgZWxzZSBpZiAoSUktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpJbnZva2UpCisgICAgICAgIHJldHVybiBDYWxsU2l0ZUJhc2Uoc3RhdGljX2Nhc3Q8SW52b2tlVHkqPihJSSkpOworICAgIH0KKyAgICByZXR1cm4gQ2FsbFNpdGVCYXNlKCk7CisgIH0KKworcHVibGljOgorICAvLy8gUmV0dXJuIHRydWUgaWYgYSBDYWxsSW5zdCBpcyBlbmNsb3NlZC4gTm90ZSB0aGF0ICFpc0NhbGwoKSBkb2VzIG5vdCBtZWFuCisgIC8vLyBhbiBJbnZva2VJbnN0IGlzIGVuY2xvc2VkLiBJdCBtYXkgYWxzbyBzaWduaWZ5IGEgTlVMTCBpbnN0cnVjdGlvbiBwb2ludGVyLgorICBib29sIGlzQ2FsbCgpIGNvbnN0IHsgcmV0dXJuIEkuZ2V0SW50KCk7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYSBJbnZva2VJbnN0IGlzIGVuY2xvc2VkLgorICBib29sIGlzSW52b2tlKCkgY29uc3QgeyByZXR1cm4gZ2V0SW5zdHJ1Y3Rpb24oKSAmJiAhSS5nZXRJbnQoKTsgfQorCisgIEluc3RyVHkgKmdldEluc3RydWN0aW9uKCkgY29uc3QgeyByZXR1cm4gSS5nZXRQb2ludGVyKCk7IH0KKyAgSW5zdHJUeSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIEkuZ2V0UG9pbnRlcigpOyB9CisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBJLmdldFBvaW50ZXIoKTsgfQorCisgIC8vLyBHZXQgdGhlIGJhc2ljIGJsb2NrIGNvbnRhaW5pbmcgdGhlIGNhbGwgc2l0ZS4KKyAgQkJUeSogZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gZ2V0SW5zdHJ1Y3Rpb24oKS0+Z2V0UGFyZW50KCk7IH0KKworICAvLy8gUmV0dXJuIHRoZSBwb2ludGVyIHRvIGZ1bmN0aW9uIHRoYXQgaXMgYmVpbmcgY2FsbGVkLgorICBWYWxUeSAqZ2V0Q2FsbGVkVmFsdWUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEluc3RydWN0aW9uKCkgJiYgIk5vdCBhIGNhbGwgb3IgaW52b2tlIGluc3RydWN0aW9uISIpOworICAgIHJldHVybiAqZ2V0Q2FsbGVlKCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBmdW5jdGlvbiBiZWluZyBjYWxsZWQgaWYgdGhpcyBpcyBhIGRpcmVjdCBjYWxsLCBvdGhlcndpc2UKKyAgLy8vIHJldHVybiBudWxsIChpZiBpdCdzIGFuIGluZGlyZWN0IGNhbGwpLgorICBGdW5UeSAqZ2V0Q2FsbGVkRnVuY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGR5bl9jYXN0PEZ1blR5PihnZXRDYWxsZWRWYWx1ZSgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY2FsbHNpdGUgaXMgYW4gaW5kaXJlY3QgY2FsbC4KKyAgYm9vbCBpc0luZGlyZWN0Q2FsbCgpIGNvbnN0IHsKKyAgICBjb25zdCBWYWx1ZSAqViA9IGdldENhbGxlZFZhbHVlKCk7CisgICAgaWYgKCFWKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChpc2E8RnVuVHk+KFYpIHx8IGlzYTxDb25zdGFudD4oVikpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGNvbnN0IENhbGxJbnN0ICpDSSA9IGR5bl9jYXN0PENhbGxJbnN0PihnZXRJbnN0cnVjdGlvbigpKSkgeworICAgICAgaWYgKENJLT5pc0lubGluZUFzbSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFNldCB0aGUgY2FsbGVlIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgIHZvaWQgc2V0Q2FsbGVkRnVuY3Rpb24oVmFsdWUgKlYpIHsKKyAgICBhc3NlcnQoZ2V0SW5zdHJ1Y3Rpb24oKSAmJiAiTm90IGEgY2FsbCBvciBpbnZva2UgaW5zdHJ1Y3Rpb24hIik7CisgICAgKmdldENhbGxlZSgpID0gVjsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGludHJpbnNpYyBJRCBvZiB0aGUgaW50cmluc2ljIGNhbGxlZCBieSB0aGlzIENhbGxTaXRlLAorICAvLy8gb3IgSW50cmluc2ljOjpub3RfaW50cmluc2ljIGlmIHRoZSBjYWxsZWQgZnVuY3Rpb24gaXMgbm90IGFuCisgIC8vLyBpbnRyaW5zaWMsIG9yIGlmIHRoaXMgQ2FsbFNpdGUgaXMgYW4gaW5kaXJlY3QgY2FsbC4KKyAgSW50cmluc2ljOjpJRCBnZXRJbnRyaW5zaWNJRCgpIGNvbnN0IHsKKyAgICBpZiAoYXV0byAqRiA9IGdldENhbGxlZEZ1bmN0aW9uKCkpCisgICAgICByZXR1cm4gRi0+Z2V0SW50cmluc2ljSUQoKTsKKyAgICAvLyBEb24ndCB1c2UgSW50cmluc2ljOjpub3RfaW50cmluc2ljLCBhcyBpdCB3aWxsIHJlcXVpcmUgcHVsbGluZworICAgIC8vIEludHJpbnNpY3MuaCBpbnRvIGV2ZXJ5IGhlYWRlciB0aGF0IHVzZXMgQ2FsbFNpdGUuCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEludHJpbnNpYzo6SUQ+KDApOworICB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBwYXNzZWQgaXRlcmF0b3IgcG9pbnRzIHRvIHRoZSBjYWxsZWUgb3BlcmFuZCdzIFVzZS4KKyAgYm9vbCBpc0NhbGxlZShWYWx1ZTo6Y29uc3RfdXNlcl9pdGVyYXRvciBVSSkgY29uc3QgeworICAgIHJldHVybiBpc0NhbGxlZSgmVUkuZ2V0VXNlKCkpOworICB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgVXNlIGlzIHRoZSBjYWxsZWUgb3BlcmFuZCdzIFVzZS4KKyAgYm9vbCBpc0NhbGxlZShjb25zdCBVc2UgKlUpIGNvbnN0IHsgcmV0dXJuIGdldENhbGxlZSgpID09IFU7IH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBhc3NlZCBpdGVyYXRvciBwb2ludHMgdG8gYW4gYXJndW1lbnQgb3BlcmFuZC4KKyAgYm9vbCBpc0FyZ09wZXJhbmQoVmFsdWU6OmNvbnN0X3VzZXJfaXRlcmF0b3IgVUkpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNBcmdPcGVyYW5kKCZVSS5nZXRVc2UoKSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBhc3NlZCB1c2UgcG9pbnRzIHRvIGFuIGFyZ3VtZW50IG9wZXJhbmQuCisgIGJvb2wgaXNBcmdPcGVyYW5kKGNvbnN0IFVzZSAqVSkgY29uc3QgeworICAgIGFzc2VydChnZXRJbnN0cnVjdGlvbigpID09IFUtPmdldFVzZXIoKSk7CisgICAgcmV0dXJuIGFyZ19iZWdpbigpIDw9IFUgJiYgVSA8IGFyZ19lbmQoKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgcGFzc2VkIGl0ZXJhdG9yIHBvaW50cyB0byBhIGJ1bmRsZSBvcGVyYW5kLgorICBib29sIGlzQnVuZGxlT3BlcmFuZChWYWx1ZTo6Y29uc3RfdXNlcl9pdGVyYXRvciBVSSkgY29uc3QgeworICAgIHJldHVybiBpc0J1bmRsZU9wZXJhbmQoJlVJLmdldFVzZSgpKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgcGFzc2VkIHVzZSBwb2ludHMgdG8gYSBidW5kbGUgb3BlcmFuZC4KKyAgYm9vbCBpc0J1bmRsZU9wZXJhbmQoY29uc3QgVXNlICpVKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEluc3RydWN0aW9uKCkgPT0gVS0+Z2V0VXNlcigpKTsKKyAgICBpZiAoIWhhc09wZXJhbmRCdW5kbGVzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgdW5zaWduZWQgT3BlcmFuZE5vID0gVSAtICgqdGhpcyktPm9wX2JlZ2luKCk7CisgICAgcmV0dXJuIGdldEJ1bmRsZU9wZXJhbmRzU3RhcnRJbmRleCgpIDw9IE9wZXJhbmRObyAmJgorICAgICAgICAgICBPcGVyYW5kTm8gPCBnZXRCdW5kbGVPcGVyYW5kc0VuZEluZGV4KCk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBhc3NlZCBpdGVyYXRvciBwb2ludHMgdG8gYSBkYXRhIG9wZXJhbmQuCisgIGJvb2wgaXNEYXRhT3BlcmFuZChWYWx1ZTo6Y29uc3RfdXNlcl9pdGVyYXRvciBVSSkgY29uc3QgeworICAgIHJldHVybiBpc0RhdGFPcGVyYW5kKCZVSS5nZXRVc2UoKSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBhc3NlZCB1c2UgcG9pbnRzIHRvIGEgZGF0YSBvcGVyYW5kLgorICBib29sIGlzRGF0YU9wZXJhbmQoY29uc3QgVXNlICpVKSBjb25zdCB7CisgICAgcmV0dXJuIGRhdGFfb3BlcmFuZHNfYmVnaW4oKSA8PSBVICYmIFUgPCBkYXRhX29wZXJhbmRzX2VuZCgpOworICB9CisKKyAgVmFsVHkgKmdldEFyZ3VtZW50KHVuc2lnbmVkIEFyZ05vKSBjb25zdCB7CisgICAgYXNzZXJ0KGFyZ19iZWdpbigpICsgQXJnTm8gPCBhcmdfZW5kKCkgJiYgIkFyZ3VtZW50ICMgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiAqKGFyZ19iZWdpbigpICsgQXJnTm8pOworICB9CisKKyAgdm9pZCBzZXRBcmd1bWVudCh1bnNpZ25lZCBBcmdObywgVmFsdWUqIG5ld1ZhbCkgeworICAgIGFzc2VydChnZXRJbnN0cnVjdGlvbigpICYmICJOb3QgYSBjYWxsIG9yIGludm9rZSBpbnN0cnVjdGlvbiEiKTsKKyAgICBhc3NlcnQoYXJnX2JlZ2luKCkgKyBBcmdObyA8IGFyZ19lbmQoKSAmJiAiQXJndW1lbnQgIyBvdXQgb2YgcmFuZ2UhIik7CisgICAgZ2V0SW5zdHJ1Y3Rpb24oKS0+c2V0T3BlcmFuZChBcmdObywgbmV3VmFsKTsKKyAgfQorCisgIC8vLyBHaXZlbiBhIHZhbHVlIHVzZSBpdGVyYXRvciwgcmV0dXJucyB0aGUgYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBpdC4KKyAgLy8vIEl0ZXJhdG9yIG11c3QgYWN0dWFsbHkgY29ycmVzcG9uZCB0byBhbiBhcmd1bWVudC4KKyAgdW5zaWduZWQgZ2V0QXJndW1lbnRObyhWYWx1ZTo6Y29uc3RfdXNlcl9pdGVyYXRvciBJKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEFyZ3VtZW50Tm8oJkkuZ2V0VXNlKCkpOworICB9CisKKyAgLy8vIEdpdmVuIGEgdXNlIGZvciBhbiBhcmd1bWVudCwgZ2V0IHRoZSBhcmd1bWVudCBudW1iZXIgdGhhdCBjb3JyZXNwb25kcyB0bworICAvLy8gaXQuCisgIHVuc2lnbmVkIGdldEFyZ3VtZW50Tm8oY29uc3QgVXNlICpVKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEluc3RydWN0aW9uKCkgJiYgIk5vdCBhIGNhbGwgb3IgaW52b2tlIGluc3RydWN0aW9uISIpOworICAgIGFzc2VydChpc0FyZ09wZXJhbmQoVSkgJiYgIkFyZ3VtZW50ICMgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBVIC0gYXJnX2JlZ2luKCk7CisgIH0KKworICAvLy8gVGhlIHR5cGUgb2YgaXRlcmF0b3IgdG8gdXNlIHdoZW4gbG9vcGluZyBvdmVyIGFjdHVhbCBhcmd1bWVudHMgYXQgdGhpcworICAvLy8gY2FsbCBzaXRlLgorICB1c2luZyBhcmdfaXRlcmF0b3IgPSBJdGVyVHk7CisKKyAgaXRlcmF0b3JfcmFuZ2U8SXRlclR5PiBhcmdzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGFyZ19iZWdpbigpLCBhcmdfZW5kKCkpOworICB9CisgIGJvb2wgYXJnX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gYXJnX2VuZCgpID09IGFyZ19iZWdpbigpOyB9CisgIHVuc2lnbmVkIGFyZ19zaXplKCkgY29uc3QgeyByZXR1cm4gdW5zaWduZWQoYXJnX2VuZCgpIC0gYXJnX2JlZ2luKCkpOyB9CisKKyAgLy8vIEdpdmVuIGEgdmFsdWUgdXNlIGl0ZXJhdG9yLCByZXR1cm4gdGhlIGRhdGEgb3BlcmFuZCBjb3JyZXNwb25kaW5nIHRvIGl0LgorICAvLy8gSXRlcmF0b3IgbXVzdCBhY3R1YWxseSBjb3JyZXNwb25kIHRvIGEgZGF0YSBvcGVyYW5kLgorICB1bnNpZ25lZCBnZXREYXRhT3BlcmFuZE5vKFZhbHVlOjpjb25zdF91c2VyX2l0ZXJhdG9yIFVJKSBjb25zdCB7CisgICAgcmV0dXJuIGdldERhdGFPcGVyYW5kTm8oJlVJLmdldFVzZSgpKTsKKyAgfQorCisgIC8vLyBHaXZlbiBhIHVzZSBmb3IgYSBkYXRhIG9wZXJhbmQsIGdldCB0aGUgZGF0YSBvcGVyYW5kIG51bWJlciB0aGF0CisgIC8vLyBjb3JyZXNwb25kcyB0byBpdC4KKyAgdW5zaWduZWQgZ2V0RGF0YU9wZXJhbmRObyhjb25zdCBVc2UgKlUpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0SW5zdHJ1Y3Rpb24oKSAmJiAiTm90IGEgY2FsbCBvciBpbnZva2UgaW5zdHJ1Y3Rpb24hIik7CisgICAgYXNzZXJ0KGlzRGF0YU9wZXJhbmQoVSkgJiYgIkRhdGEgb3BlcmFuZCAjIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gVSAtIGRhdGFfb3BlcmFuZHNfYmVnaW4oKTsKKyAgfQorCisgIC8vLyBUeXBlIG9mIGl0ZXJhdG9yIHRvIHVzZSB3aGVuIGxvb3Bpbmcgb3ZlciBkYXRhIG9wZXJhbmRzIGF0IHRoaXMgY2FsbCBzaXRlCisgIC8vLyAoc2VlIGJlbG93KS4KKyAgdXNpbmcgZGF0YV9vcGVyYW5kX2l0ZXJhdG9yID0gSXRlclR5OworCisgIC8vLyBkYXRhX29wZXJhbmRzX2JlZ2luL2RhdGFfb3BlcmFuZHNfZW5kIC0gUmV0dXJuIGl0ZXJhdG9ycyBpdGVyYXRpbmcgb3ZlcgorICAvLy8gdGhlIGNhbGwgLyBpbnZva2UgYXJndW1lbnQgbGlzdCBhbmQgYnVuZGxlIG9wZXJhbmRzLiAgRm9yIGludm9rZXMsIHRoaXMgaXMKKyAgLy8vIHRoZSBzZXQgb2YgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMgZXhjZXB0IHRoZSBpbnZva2UgdGFyZ2V0IGFuZCB0aGUgdHdvCisgIC8vLyBzdWNjZXNzb3IgYmxvY2tzOyBhbmQgZm9yIGNhbGxzIHRoaXMgaXMgdGhlIHNldCBvZiBpbnN0cnVjdGlvbiBvcGVyYW5kcworICAvLy8gZXhjZXB0IHRoZSBjYWxsIHRhcmdldC4KKworICBJdGVyVHkgZGF0YV9vcGVyYW5kc19iZWdpbigpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0SW5zdHJ1Y3Rpb24oKSAmJiAiTm90IGEgY2FsbCBvciBpbnZva2UgaW5zdHJ1Y3Rpb24hIik7CisgICAgcmV0dXJuICgqdGhpcyktPm9wX2JlZ2luKCk7CisgIH0KKyAgSXRlclR5IGRhdGFfb3BlcmFuZHNfZW5kKCkgY29uc3QgeworICAgIGFzc2VydChnZXRJbnN0cnVjdGlvbigpICYmICJOb3QgYSBjYWxsIG9yIGludm9rZSBpbnN0cnVjdGlvbiEiKTsKKyAgICByZXR1cm4gKCp0aGlzKS0+b3BfZW5kKCkgLSAoaXNDYWxsKCkgPyAxIDogMyk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8SXRlclR5PiBkYXRhX29wcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShkYXRhX29wZXJhbmRzX2JlZ2luKCksIGRhdGFfb3BlcmFuZHNfZW5kKCkpOworICB9CisgIGJvb2wgZGF0YV9vcGVyYW5kc19lbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZGF0YV9vcGVyYW5kc19lbmQoKSA9PSBkYXRhX29wZXJhbmRzX2JlZ2luKCk7CisgIH0KKyAgdW5zaWduZWQgZGF0YV9vcGVyYW5kc19zaXplKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OmRpc3RhbmNlKGRhdGFfb3BlcmFuZHNfYmVnaW4oKSwgZGF0YV9vcGVyYW5kc19lbmQoKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGdlbmVyYXRlZCB0aGlzIGNhbGwgc2l0ZS4KKyAgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuICgqdGhpcyktPmdldFR5cGUoKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIGNhbGxlciBmdW5jdGlvbiBmb3IgdGhpcyBjYWxsIHNpdGUuCisgIEZ1blR5ICpnZXRDYWxsZXIoKSBjb25zdCB7IHJldHVybiAoKnRoaXMpLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7IH0KKworICAvLy8gVGVzdHMgaWYgdGhpcyBjYWxsIHNpdGUgbXVzdCBiZSB0YWlsIGNhbGwgb3B0aW1pemVkLiBPbmx5IGEgQ2FsbEluc3QgY2FuCisgIC8vLyBiZSB0YWlsIGNhbGwgb3B0aW1pemVkLgorICBib29sIGlzTXVzdFRhaWxDYWxsKCkgY29uc3QgeworICAgIHJldHVybiBpc0NhbGwoKSAmJiBjYXN0PENhbGxJbnN0PihnZXRJbnN0cnVjdGlvbigpKS0+aXNNdXN0VGFpbENhbGwoKTsKKyAgfQorCisgIC8vLyBUZXN0cyBpZiB0aGlzIGNhbGwgc2l0ZSBpcyBtYXJrZWQgYXMgYSB0YWlsIGNhbGwuCisgIGJvb2wgaXNUYWlsQ2FsbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNDYWxsKCkgJiYgY2FzdDxDYWxsSW5zdD4oZ2V0SW5zdHJ1Y3Rpb24oKSktPmlzVGFpbENhbGwoKTsKKyAgfQorCisjZGVmaW5lIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihNRVRIT0QpIFwKKyAgSW5zdHJUeSAqSUkgPSBnZXRJbnN0cnVjdGlvbigpOyAgICBcCisgIHJldHVybiBpc0NhbGwoKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/IGNhc3Q8Q2FsbEluc3Q+KElJKS0+TUVUSE9EICAgICAgICAgXAorICAgIDogY2FzdDxJbnZva2VJbnN0PihJSSktPk1FVEhPRAorCisjZGVmaW5lIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihNRVRIT0QpIFwKKyAgSW5zdHJUeSAqSUkgPSBnZXRJbnN0cnVjdGlvbigpOyAgICBcCisgIGlmIChpc0NhbGwoKSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXN0PENhbGxJbnN0PihJSSktPk1FVEhPRDsgICAgICAgICAgXAorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzdDxJbnZva2VJbnN0PihJSSktPk1FVEhPRAorCisgIHVuc2lnbmVkIGdldE51bUFyZ09wZXJhbmRzKCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihnZXROdW1BcmdPcGVyYW5kcygpKTsKKyAgfQorCisgIFZhbFR5ICpnZXRBcmdPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoZ2V0QXJnT3BlcmFuZChpKSk7CisgIH0KKworICBWYWxUeSAqZ2V0UmV0dXJuZWRBcmdPcGVyYW5kKCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihnZXRSZXR1cm5lZEFyZ09wZXJhbmQoKSk7CisgIH0KKworICBib29sIGlzSW5saW5lQXNtKCkgY29uc3QgeworICAgIGlmIChpc0NhbGwoKSkKKyAgICAgIHJldHVybiBjYXN0PENhbGxJbnN0PihnZXRJbnN0cnVjdGlvbigpKS0+aXNJbmxpbmVBc20oKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gR2V0IHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gb2YgdGhlIGNhbGwuCisgIENhbGxpbmdDb252OjpJRCBnZXRDYWxsaW5nQ29udigpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoZ2V0Q2FsbGluZ0NvbnYoKSk7CisgIH0KKyAgLy8vIFNldCB0aGUgY2FsbGluZyBjb252ZW50aW9uIG9mIHRoZSBjYWxsLgorICB2b2lkIHNldENhbGxpbmdDb252KENhbGxpbmdDb252OjpJRCBDQykgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihzZXRDYWxsaW5nQ29udihDQykpOworICB9CisKKyAgRnVuY3Rpb25UeXBlICpnZXRGdW5jdGlvblR5cGUoKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGdldEZ1bmN0aW9uVHlwZSgpKTsKKyAgfQorCisgIHZvaWQgbXV0YXRlRnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSAqVHkpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIobXV0YXRlRnVuY3Rpb25UeXBlKFR5KSk7CisgIH0KKworICAvLy8gR2V0IHRoZSBwYXJhbWV0ZXIgYXR0cmlidXRlcyBvZiB0aGUgY2FsbC4KKyAgQXR0cmlidXRlTGlzdCBnZXRBdHRyaWJ1dGVzKCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihnZXRBdHRyaWJ1dGVzKCkpOworICB9CisgIC8vLyBTZXQgdGhlIHBhcmFtZXRlciBhdHRyaWJ1dGVzIG9mIHRoZSBjYWxsLgorICB2b2lkIHNldEF0dHJpYnV0ZXMoQXR0cmlidXRlTGlzdCBQQUwpIHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIoc2V0QXR0cmlidXRlcyhQQUwpKTsKKyAgfQorCisgIHZvaWQgYWRkQXR0cmlidXRlKHVuc2lnbmVkIGksIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihhZGRBdHRyaWJ1dGUoaSwgS2luZCkpOworICB9CisKKyAgdm9pZCBhZGRBdHRyaWJ1dGUodW5zaWduZWQgaSwgQXR0cmlidXRlIEF0dHIpIHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIoYWRkQXR0cmlidXRlKGksIEF0dHIpKTsKKyAgfQorCisgIHZvaWQgYWRkUGFyYW1BdHRyKHVuc2lnbmVkIEFyZ05vLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIoYWRkUGFyYW1BdHRyKEFyZ05vLCBLaW5kKSk7CisgIH0KKworICB2b2lkIHJlbW92ZUF0dHJpYnV0ZSh1bnNpZ25lZCBpLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIocmVtb3ZlQXR0cmlidXRlKGksIEtpbmQpKTsKKyAgfQorCisgIHZvaWQgcmVtb3ZlQXR0cmlidXRlKHVuc2lnbmVkIGksIFN0cmluZ1JlZiBLaW5kKSB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfU0VUVEVSKHJlbW92ZUF0dHJpYnV0ZShpLCBLaW5kKSk7CisgIH0KKworICB2b2lkIHJlbW92ZVBhcmFtQXR0cih1bnNpZ25lZCBBcmdObywgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfU0VUVEVSKHJlbW92ZVBhcmFtQXR0cihBcmdObywgS2luZCkpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgZnVuY3Rpb24gaGFzIHRoZSBnaXZlbiBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzRm5BdHRyKEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihoYXNGbkF0dHIoS2luZCkpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgZnVuY3Rpb24gaGFzIHRoZSBnaXZlbiBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzRm5BdHRyKFN0cmluZ1JlZiBLaW5kKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGhhc0ZuQXR0cihLaW5kKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyByZXR1cm4gdmFsdWUgaGFzIHRoZSBnaXZlbiBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzUmV0QXR0cihBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoaGFzUmV0QXR0cihLaW5kKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNhbGwgb3IgdGhlIGNhbGxlZSBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4KKyAgYm9vbCBwYXJhbUhhc0F0dHIodW5zaWduZWQgQXJnTm8sIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihwYXJhbUhhc0F0dHIoQXJnTm8sIEtpbmQpKTsKKyAgfQorCisgIEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUodW5zaWduZWQgaSwgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGdldEF0dHJpYnV0ZShpLCBLaW5kKSk7CisgIH0KKworICBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKHVuc2lnbmVkIGksIFN0cmluZ1JlZiBLaW5kKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGdldEF0dHJpYnV0ZShpLCBLaW5kKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGRhdGEgb3BlcmFuZCBhdCBpbmRleCBccCBpIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaGFzCisgIC8vLyB0aGUgYXR0cmlidXRlIFxwIEEuCisgIC8vLworICAvLy8gTm9ybWFsIGNhbGwgb3IgaW52b2tlIGFyZ3VtZW50cyBoYXZlIHBlciBvcGVyYW5kIGF0dHJpYnV0ZXMsIGFzIHNwZWNpZmllZAorICAvLy8gaW4gdGhlIGF0dHJpYnV0ZSBzZXQgYXR0YWNoZWQgdG8gdGhpcyBpbnN0cnVjdGlvbiwgd2hpbGUgb3BlcmFuZCBidW5kbGUKKyAgLy8vIG9wZXJhbmRzIG1heSBoYXZlIHNvbWUgYXR0cmlidXRlcyBpbXBsaWVkIGJ5IHRoZSB0eXBlIG9mIGl0cyBjb250YWluaW5nCisgIC8vLyBvcGVyYW5kIGJ1bmRsZS4KKyAgYm9vbCBkYXRhT3BlcmFuZEhhc0ltcGxpZWRBdHRyKHVuc2lnbmVkIGksIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihkYXRhT3BlcmFuZEhhc0ltcGxpZWRBdHRyKGksIEtpbmQpKTsKKyAgfQorCisgIC8vLyBFeHRyYWN0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIHJldHVybiB2YWx1ZS4KKyAgdW5zaWduZWQgZ2V0UmV0QWxpZ25tZW50KCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihnZXRSZXRBbGlnbm1lbnQoKSk7CisgIH0KKworICAvLy8gRXh0cmFjdCB0aGUgYWxpZ25tZW50IGZvciBhIGNhbGwgb3IgcGFyYW1ldGVyICgwPXVua25vd24pLgorICB1bnNpZ25lZCBnZXRQYXJhbUFsaWdubWVudCh1bnNpZ25lZCBBcmdObykgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihnZXRQYXJhbUFsaWdubWVudChBcmdObykpOworICB9CisKKyAgLy8vIEV4dHJhY3QgdGhlIG51bWJlciBvZiBkZXJlZmVyZW5jZWFibGUgYnl0ZXMgZm9yIGEgY2FsbCBvciBwYXJhbWV0ZXIKKyAgLy8vICgwPXVua25vd24pLgorICB1aW50NjRfdCBnZXREZXJlZmVyZW5jZWFibGVCeXRlcyh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGdldERlcmVmZXJlbmNlYWJsZUJ5dGVzKGkpKTsKKyAgfQorCisgIC8vLyBFeHRyYWN0IHRoZSBudW1iZXIgb2YgZGVyZWZlcmVuY2VhYmxlX29yX251bGwgYnl0ZXMgZm9yIGEgY2FsbCBvcgorICAvLy8gcGFyYW1ldGVyICgwPXVua25vd24pLgorICB1aW50NjRfdCBnZXREZXJlZmVyZW5jZWFibGVPck51bGxCeXRlcyh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGdldERlcmVmZXJlbmNlYWJsZU9yTnVsbEJ5dGVzKGkpKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyBtYXJrZWQgd2l0aCBOb0FsaWFzIGF0dHJpYnV0ZS4KKyAgYm9vbCByZXR1cm5Eb2VzTm90QWxpYXMoKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKHJldHVybkRvZXNOb3RBbGlhcygpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY2FsbCBzaG91bGQgbm90IGJlIHRyZWF0ZWQgYXMgYSBjYWxsIHRvIGEgYnVpbHRpbi4KKyAgYm9vbCBpc05vQnVpbHRpbigpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoaXNOb0J1aWx0aW4oKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNhbGwgcmVxdWlyZXMgc3RyaWN0IGZsb2F0aW5nIHBvaW50IHNlbWFudGljcy4KKyAgYm9vbCBpc1N0cmljdEZQKCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihpc1N0cmljdEZQKCkpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBjYWxsIHNob3VsZCBub3QgYmUgaW5saW5lZC4KKyAgYm9vbCBpc05vSW5saW5lKCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihpc05vSW5saW5lKCkpOworICB9CisgIHZvaWQgc2V0SXNOb0lubGluZShib29sIFZhbHVlID0gdHJ1ZSkgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihzZXRJc05vSW5saW5lKFZhbHVlKSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIGRvZXMgbm90IGFjY2VzcyBtZW1vcnkuCisgIGJvb2wgZG9lc05vdEFjY2Vzc01lbW9yeSgpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoZG9lc05vdEFjY2Vzc01lbW9yeSgpKTsKKyAgfQorICB2b2lkIHNldERvZXNOb3RBY2Nlc3NNZW1vcnkoKSB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfU0VUVEVSKHNldERvZXNOb3RBY2Nlc3NNZW1vcnkoKSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIGRvZXMgbm90IGFjY2VzcyBvciBvbmx5IHJlYWRzIG1lbW9yeS4KKyAgYm9vbCBvbmx5UmVhZHNNZW1vcnkoKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKG9ubHlSZWFkc01lbW9yeSgpKTsKKyAgfQorICB2b2lkIHNldE9ubHlSZWFkc01lbW9yeSgpIHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIoc2V0T25seVJlYWRzTWVtb3J5KCkpOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgY2FsbCBkb2VzIG5vdCBhY2Nlc3Mgb3Igb25seSB3cml0ZXMgbWVtb3J5LgorICBib29sIGRvZXNOb3RSZWFkTWVtb3J5KCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihkb2VzTm90UmVhZE1lbW9yeSgpKTsKKyAgfQorICB2b2lkIHNldERvZXNOb3RSZWFkTWVtb3J5KCkgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihzZXREb2VzTm90UmVhZE1lbW9yeSgpKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGNhbGwgY2FuIGFjY2VzcyBtZW1tb3J5IG9ubHkgdXNpbmcgcG9pbnRlcnMgYmFzZWQKKyAgLy8vIG9uIGl0cyBhcmd1bWVudHMuCisgIGJvb2wgb25seUFjY2Vzc2VzQXJnTWVtb3J5KCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihvbmx5QWNjZXNzZXNBcmdNZW1vcnkoKSk7CisgIH0KKyAgdm9pZCBzZXRPbmx5QWNjZXNzZXNBcmdNZW1vcnkoKSB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfU0VUVEVSKHNldE9ubHlBY2Nlc3Nlc0FyZ01lbW9yeSgpKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGZ1bmN0aW9uIG1heSBvbmx5IGFjY2VzcyBtZW1vcnkgdGhhdCBpcworICAvLy8gaW5hY2Nlc3NpYmxlIGZyb20gdGhlIElSLgorICBib29sIG9ubHlBY2Nlc3Nlc0luYWNjZXNzaWJsZU1lbW9yeSgpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIob25seUFjY2Vzc2VzSW5hY2Nlc3NpYmxlTWVtb3J5KCkpOworICB9CisgIHZvaWQgc2V0T25seUFjY2Vzc2VzSW5hY2Nlc3NpYmxlTWVtb3J5KCkgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihzZXRPbmx5QWNjZXNzZXNJbmFjY2Vzc2libGVNZW1vcnkoKSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBmdW5jdGlvbiBtYXkgb25seSBhY2Nlc3MgbWVtb3J5IHRoYXQgaXMKKyAgLy8vIGVpdGhlciBpbmFjY2Vzc2libGUgZnJvbSB0aGUgSVIgb3IgcG9pbnRlZCB0byBieSBpdHMgYXJndW1lbnRzLgorICBib29sIG9ubHlBY2Nlc3Nlc0luYWNjZXNzaWJsZU1lbU9yQXJnTWVtKCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihvbmx5QWNjZXNzZXNJbmFjY2Vzc2libGVNZW1PckFyZ01lbSgpKTsKKyAgfQorICB2b2lkIHNldE9ubHlBY2Nlc3Nlc0luYWNjZXNzaWJsZU1lbU9yQXJnTWVtKCkgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihzZXRPbmx5QWNjZXNzZXNJbmFjY2Vzc2libGVNZW1PckFyZ01lbSgpKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGNhbGwgY2Fubm90IHJldHVybi4KKyAgYm9vbCBkb2VzTm90UmV0dXJuKCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihkb2VzTm90UmV0dXJuKCkpOworICB9CisgIHZvaWQgc2V0RG9lc05vdFJldHVybigpIHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIoc2V0RG9lc05vdFJldHVybigpKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGNhbGwgY2Fubm90IHVud2luZC4KKyAgYm9vbCBkb2VzTm90VGhyb3coKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGRvZXNOb3RUaHJvdygpKTsKKyAgfQorICB2b2lkIHNldERvZXNOb3RUaHJvdygpIHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIoc2V0RG9lc05vdFRocm93KCkpOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgY2FsbCBjYW4gYmUgZHVwbGljYXRlZC4KKyAgYm9vbCBjYW5ub3REdXBsaWNhdGUoKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGNhbm5vdER1cGxpY2F0ZSgpKTsKKyAgfQorICB2b2lkIHNldENhbm5vdER1cGxpY2F0ZSgpIHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIoc2V0Q2Fubm90RHVwbGljYXRlKCkpOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgY2FsbCBpcyBjb252ZXJnZW50LgorICBib29sIGlzQ29udmVyZ2VudCgpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoaXNDb252ZXJnZW50KCkpOworICB9CisgIHZvaWQgc2V0Q29udmVyZ2VudCgpIHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIoc2V0Q29udmVyZ2VudCgpKTsKKyAgfQorICB2b2lkIHNldE5vdENvbnZlcmdlbnQoKSB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfU0VUVEVSKHNldE5vdENvbnZlcmdlbnQoKSk7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kQnVuZGxlcygpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoZ2V0TnVtT3BlcmFuZEJ1bmRsZXMoKSk7CisgIH0KKworICBib29sIGhhc09wZXJhbmRCdW5kbGVzKCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihoYXNPcGVyYW5kQnVuZGxlcygpKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldEJ1bmRsZU9wZXJhbmRzU3RhcnRJbmRleCgpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoZ2V0QnVuZGxlT3BlcmFuZHNTdGFydEluZGV4KCkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0QnVuZGxlT3BlcmFuZHNFbmRJbmRleCgpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoZ2V0QnVuZGxlT3BlcmFuZHNFbmRJbmRleCgpKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bVRvdGFsQnVuZGxlT3BlcmFuZHMoKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGdldE51bVRvdGFsQnVuZGxlT3BlcmFuZHMoKSk7CisgIH0KKworICBPcGVyYW5kQnVuZGxlVXNlIGdldE9wZXJhbmRCdW5kbGVBdCh1bnNpZ25lZCBJbmRleCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihnZXRPcGVyYW5kQnVuZGxlQXQoSW5kZXgpKTsKKyAgfQorCisgIE9wdGlvbmFsPE9wZXJhbmRCdW5kbGVVc2U+IGdldE9wZXJhbmRCdW5kbGUoU3RyaW5nUmVmIE5hbWUpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoZ2V0T3BlcmFuZEJ1bmRsZShOYW1lKSk7CisgIH0KKworICBPcHRpb25hbDxPcGVyYW5kQnVuZGxlVXNlPiBnZXRPcGVyYW5kQnVuZGxlKHVpbnQzMl90IElEKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGdldE9wZXJhbmRCdW5kbGUoSUQpKTsKKyAgfQorCisgIHVuc2lnbmVkIGNvdW50T3BlcmFuZEJ1bmRsZXNPZlR5cGUodWludDMyX3QgSUQpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoY291bnRPcGVyYW5kQnVuZGxlc09mVHlwZShJRCkpOworICB9CisKKyAgYm9vbCBpc0J1bmRsZU9wZXJhbmQodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGlzQnVuZGxlT3BlcmFuZChJZHgpKTsKKyAgfQorCisgIEl0ZXJUeSBhcmdfYmVnaW4oKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGFyZ19iZWdpbigpKTsKKyAgfQorCisgIEl0ZXJUeSBhcmdfZW5kKCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihhcmdfZW5kKCkpOworICB9CisKKyN1bmRlZiBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIKKyN1bmRlZiBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIKKworICB2b2lkIGdldE9wZXJhbmRCdW5kbGVzQXNEZWZzKFNtYWxsVmVjdG9ySW1wbDxPcGVyYW5kQnVuZGxlRGVmPiAmRGVmcykgY29uc3QgeworICAgIGNvbnN0IEluc3RydWN0aW9uICpJSSA9IGdldEluc3RydWN0aW9uKCk7CisgICAgLy8gU2luY2UgdGhpcyBpcyBhY3R1YWxseSBhIGdldHRlciB0aGF0ICJsb29rcyBsaWtlIiBhIHNldHRlciwgZG9uJ3QgdXNlIHRoZQorICAgIC8vIGFib3ZlIG1hY3JvcyB0byBhdm9pZCBjb25mdXNpb24uCisgICAgaWYgKGlzQ2FsbCgpKQorICAgICAgY2FzdDxDYWxsSW5zdD4oSUkpLT5nZXRPcGVyYW5kQnVuZGxlc0FzRGVmcyhEZWZzKTsKKyAgICBlbHNlCisgICAgICBjYXN0PEludm9rZUluc3Q+KElJKS0+Z2V0T3BlcmFuZEJ1bmRsZXNBc0RlZnMoRGVmcyk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBkYXRhIG9wZXJhbmQgaXMgbm90IGNhcHR1cmVkLgorICBib29sIGRvZXNOb3RDYXB0dXJlKHVuc2lnbmVkIE9wTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gZGF0YU9wZXJhbmRIYXNJbXBsaWVkQXR0cihPcE5vICsgMSwgQXR0cmlidXRlOjpOb0NhcHR1cmUpOworICB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgYXJndW1lbnQgaXMgcGFzc2VkIGJ5IHZhbHVlLgorICBib29sIGlzQnlWYWxBcmd1bWVudCh1bnNpZ25lZCBBcmdObykgY29uc3QgeworICAgIHJldHVybiBwYXJhbUhhc0F0dHIoQXJnTm8sIEF0dHJpYnV0ZTo6QnlWYWwpOworICB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgYXJndW1lbnQgaXMgcGFzc2VkIGluIGFuIGFsbG9jYS4KKyAgYm9vbCBpc0luQWxsb2NhQXJndW1lbnQodW5zaWduZWQgQXJnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gcGFyYW1IYXNBdHRyKEFyZ05vLCBBdHRyaWJ1dGU6OkluQWxsb2NhKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGFyZ3VtZW50IGlzIHBhc3NlZCBieSB2YWx1ZSBvciBpbiBhbiBhbGxvY2EuCisgIGJvb2wgaXNCeVZhbE9ySW5BbGxvY2FBcmd1bWVudCh1bnNpZ25lZCBBcmdObykgY29uc3QgeworICAgIHJldHVybiBwYXJhbUhhc0F0dHIoQXJnTm8sIEF0dHJpYnV0ZTo6QnlWYWwpIHx8CisgICAgICAgICAgIHBhcmFtSGFzQXR0cihBcmdObywgQXR0cmlidXRlOjpJbkFsbG9jYSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZXJlIGFyZSBpcyBhbiBpbmFsbG9jYSBhcmd1bWVudC4gT25seSB0aGUgbGFzdCBhcmd1bWVudCBjYW4KKyAgLy8vIGhhdmUgdGhlIGluYWxsb2NhIGF0dHJpYnV0ZS4KKyAgYm9vbCBoYXNJbkFsbG9jYUFyZ3VtZW50KCkgY29uc3QgeworICAgIHJldHVybiAhYXJnX2VtcHR5KCkgJiYgcGFyYW1IYXNBdHRyKGFyZ19zaXplKCkgLSAxLCBBdHRyaWJ1dGU6OkluQWxsb2NhKTsKKyAgfQorCisgIGJvb2wgZG9lc05vdEFjY2Vzc01lbW9yeSh1bnNpZ25lZCBPcE5vKSBjb25zdCB7CisgICAgcmV0dXJuIGRhdGFPcGVyYW5kSGFzSW1wbGllZEF0dHIoT3BObyArIDEsIEF0dHJpYnV0ZTo6UmVhZE5vbmUpOworICB9CisKKyAgYm9vbCBvbmx5UmVhZHNNZW1vcnkodW5zaWduZWQgT3BObykgY29uc3QgeworICAgIHJldHVybiBkYXRhT3BlcmFuZEhhc0ltcGxpZWRBdHRyKE9wTm8gKyAxLCBBdHRyaWJ1dGU6OlJlYWRPbmx5KSB8fAorICAgICAgICAgICBkYXRhT3BlcmFuZEhhc0ltcGxpZWRBdHRyKE9wTm8gKyAxLCBBdHRyaWJ1dGU6OlJlYWROb25lKTsKKyAgfQorCisgIGJvb2wgZG9lc05vdFJlYWRNZW1vcnkodW5zaWduZWQgT3BObykgY29uc3QgeworICAgIHJldHVybiBkYXRhT3BlcmFuZEhhc0ltcGxpZWRBdHRyKE9wTm8gKyAxLCBBdHRyaWJ1dGU6OldyaXRlT25seSkgfHwKKyAgICAgICAgICAgZGF0YU9wZXJhbmRIYXNJbXBsaWVkQXR0cihPcE5vICsgMSwgQXR0cmlidXRlOjpSZWFkTm9uZSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyBrbm93biB0byBiZSBub3QgbnVsbC4KKyAgLy8vIFRoaXMgbWF5IGJlIGJlY2F1c2UgaXQgaGFzIHRoZSBub25udWxsIGF0dHJpYnV0ZSwgb3IgYmVjYXVzZSBhdCBsZWFzdAorICAvLy8gb25lIGJ5dGUgaXMgZGVyZWZlcmVuY2VhYmxlIGFuZCB0aGUgcG9pbnRlciBpcyBpbiBhZGRyc3BhY2UoMCkuCisgIGJvb2wgaXNSZXR1cm5Ob25OdWxsKCkgY29uc3QgeworICAgIGlmIChoYXNSZXRBdHRyKEF0dHJpYnV0ZTo6Tm9uTnVsbCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBlbHNlIGlmIChnZXREZXJlZmVyZW5jZWFibGVCeXRlcyhBdHRyaWJ1dGVMaXN0OjpSZXR1cm5JbmRleCkgPiAwICYmCisgICAgICAgICAgICAgZ2V0VHlwZSgpLT5nZXRQb2ludGVyQWRkcmVzc1NwYWNlKCkgPT0gMCkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIENhbGxTaXRlIHBhc3NlcyB0aGUgZ2l2ZW4gVmFsdWUqIGFzIGFuIGFyZ3VtZW50IHRvCisgIC8vLyB0aGUgY2FsbGVkIGZ1bmN0aW9uLgorICBib29sIGhhc0FyZ3VtZW50KGNvbnN0IFZhbHVlICpBcmcpIGNvbnN0IHsKKyAgICBmb3IgKGFyZ19pdGVyYXRvciBBSSA9IHRoaXMtPmFyZ19iZWdpbigpLCBFID0gdGhpcy0+YXJnX2VuZCgpOyBBSSAhPSBFOworICAgICAgICAgKytBSSkKKyAgICAgIGlmIChBSS0+Z2V0KCkgPT0gQXJnKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworcHJpdmF0ZToKKyAgSXRlclR5IGdldENhbGxlZSgpIGNvbnN0IHsKKyAgICBpZiAoaXNDYWxsKCkpIC8vIFNraXAgQ2FsbGVlCisgICAgICByZXR1cm4gY2FzdDxDYWxsSW5zdD4oZ2V0SW5zdHJ1Y3Rpb24oKSktPm9wX2VuZCgpIC0gMTsKKyAgICBlbHNlIC8vIFNraXAgQkIsIEJCLCBDYWxsZWUKKyAgICAgIHJldHVybiBjYXN0PEludm9rZUluc3Q+KGdldEluc3RydWN0aW9uKCkpLT5vcF9lbmQoKSAtIDM7CisgIH0KK307CisKK2NsYXNzIENhbGxTaXRlIDogcHVibGljIENhbGxTaXRlQmFzZTxGdW5jdGlvbiwgQmFzaWNCbG9jaywgVmFsdWUsIFVzZXIsIFVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiwgQ2FsbEluc3QsIEludm9rZUluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcjo6b3BfaXRlcmF0b3I+IHsKK3B1YmxpYzoKKyAgQ2FsbFNpdGUoKSA9IGRlZmF1bHQ7CisgIENhbGxTaXRlKENhbGxTaXRlQmFzZSBCKSA6IENhbGxTaXRlQmFzZShCKSB7fQorICBDYWxsU2l0ZShDYWxsSW5zdCAqQ0kpIDogQ2FsbFNpdGVCYXNlKENJKSB7fQorICBDYWxsU2l0ZShJbnZva2VJbnN0ICpJSSkgOiBDYWxsU2l0ZUJhc2UoSUkpIHt9CisgIGV4cGxpY2l0IENhbGxTaXRlKEluc3RydWN0aW9uICpJSSkgOiBDYWxsU2l0ZUJhc2UoSUkpIHt9CisgIGV4cGxpY2l0IENhbGxTaXRlKFZhbHVlICpWKSA6IENhbGxTaXRlQmFzZShWKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDYWxsU2l0ZSAmQ1MpIGNvbnN0IHsgcmV0dXJuIEkgPT0gQ1MuSTsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ2FsbFNpdGUgJkNTKSBjb25zdCB7IHJldHVybiBJICE9IENTLkk7IH0KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQ2FsbFNpdGUgJkNTKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEluc3RydWN0aW9uKCkgPCBDUy5nZXRJbnN0cnVjdGlvbigpOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBzdHJ1Y3QgRGVuc2VNYXBJbmZvPENhbGxTaXRlPjsKKworICBVc2VyOjpvcF9pdGVyYXRvciBnZXRDYWxsZWUoKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88Q2FsbFNpdGU+IHsKKyAgdXNpbmcgQmFzZUluZm8gPSBEZW5zZU1hcEluZm88ZGVjbHR5cGUoQ2FsbFNpdGU6OkkpPjsKKworICBzdGF0aWMgQ2FsbFNpdGUgZ2V0RW1wdHlLZXkoKSB7CisgICAgQ2FsbFNpdGUgQ1M7CisgICAgQ1MuSSA9IEJhc2VJbmZvOjpnZXRFbXB0eUtleSgpOworICAgIHJldHVybiBDUzsKKyAgfQorCisgIHN0YXRpYyBDYWxsU2l0ZSBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgQ2FsbFNpdGUgQ1M7CisgICAgQ1MuSSA9IEJhc2VJbmZvOjpnZXRUb21ic3RvbmVLZXkoKTsKKyAgICByZXR1cm4gQ1M7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IENhbGxTaXRlICZDUykgeworICAgIHJldHVybiBCYXNlSW5mbzo6Z2V0SGFzaFZhbHVlKENTLkkpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBDYWxsU2l0ZSAmTEhTLCBjb25zdCBDYWxsU2l0ZSAmUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKKy8vLyBFc3RhYmxpc2ggYSB2aWV3IHRvIGEgY2FsbCBzaXRlIGZvciBleGFtaW5hdGlvbi4KK2NsYXNzIEltbXV0YWJsZUNhbGxTaXRlIDogcHVibGljIENhbGxTaXRlQmFzZTw+IHsKK3B1YmxpYzoKKyAgSW1tdXRhYmxlQ2FsbFNpdGUoKSA9IGRlZmF1bHQ7CisgIEltbXV0YWJsZUNhbGxTaXRlKGNvbnN0IENhbGxJbnN0ICpDSSkgOiBDYWxsU2l0ZUJhc2UoQ0kpIHt9CisgIEltbXV0YWJsZUNhbGxTaXRlKGNvbnN0IEludm9rZUluc3QgKklJKSA6IENhbGxTaXRlQmFzZShJSSkge30KKyAgZXhwbGljaXQgSW1tdXRhYmxlQ2FsbFNpdGUoY29uc3QgSW5zdHJ1Y3Rpb24gKklJKSA6IENhbGxTaXRlQmFzZShJSSkge30KKyAgZXhwbGljaXQgSW1tdXRhYmxlQ2FsbFNpdGUoY29uc3QgVmFsdWUgKlYpIDogQ2FsbFNpdGVCYXNlKFYpIHt9CisgIEltbXV0YWJsZUNhbGxTaXRlKENhbGxTaXRlIENTKSA6IENhbGxTaXRlQmFzZShDUy5nZXRJbnN0cnVjdGlvbigpKSB7fQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfQ0FMTFNJVEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9DYWxsaW5nQ29udi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9DYWxsaW5nQ29udi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZmU4MzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0NhbGxpbmdDb252LmgKQEAgLTAsMCArMSwyMzEgQEAKKy8vPT09LSBsbHZtL0NhbGxpbmdDb252LmggLSBMTFZNIENhbGxpbmcgQ29udmVudGlvbnMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgTExWTSdzIHNldCBvZiBjYWxsaW5nIGNvbnZlbnRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9DQUxMSU5HQ09OVl9ICisjZGVmaW5lIExMVk1fSVJfQ0FMTElOR0NPTlZfSAorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBDYWxsaW5nQ29udiBOYW1lc3BhY2UgLSBUaGlzIG5hbWVzcGFjZSBjb250YWlucyBhbiBlbnVtIHdpdGggYSB2YWx1ZSBmb3IKKy8vLyB0aGUgd2VsbC1rbm93biBjYWxsaW5nIGNvbnZlbnRpb25zLgorLy8vCituYW1lc3BhY2UgQ2FsbGluZ0NvbnYgeworCisgIC8vLyBMTFZNIElSIGFsbG93cyB0byB1c2UgYXJiaXRyYXJ5IG51bWJlcnMgYXMgY2FsbGluZyBjb252ZW50aW9uIGlkZW50aWZpZXJzLgorICB1c2luZyBJRCA9IHVuc2lnbmVkOworCisgIC8vLyBBIHNldCBvZiBlbnVtcyB3aGljaCBzcGVjaWZ5IHRoZSBhc3NpZ25lZCBudW1lcmljIHZhbHVlcyBmb3Iga25vd24gbGx2bQorICAvLy8gY2FsbGluZyBjb252ZW50aW9ucy4KKyAgLy8vIEBicmllZiBMTFZNIENhbGxpbmcgQ29udmVudGlvbiBSZXByZXNlbnRhdGlvbgorICBlbnVtIHsKKyAgICAvLy8gQyAtIFRoZSBkZWZhdWx0IGxsdm0gY2FsbGluZyBjb252ZW50aW9uLCBjb21wYXRpYmxlIHdpdGggQy4gIFRoaXMKKyAgICAvLy8gY29udmVudGlvbiBpcyB0aGUgb25seSBjYWxsaW5nIGNvbnZlbnRpb24gdGhhdCBzdXBwb3J0cyB2YXJhcmdzIGNhbGxzLgorICAgIC8vLyBBcyB3aXRoIHR5cGljYWwgQyBjYWxsaW5nIGNvbnZlbnRpb25zLCB0aGUgY2FsbGVlL2NhbGxlciBoYXZlIHRvCisgICAgLy8vIHRvbGVyYXRlIGNlcnRhaW4gYW1vdW50cyBvZiBwcm90b3R5cGUgbWlzbWF0Y2guCisgICAgQyA9IDAsCisKKyAgICAvLyBHZW5lcmljIExMVk0gY2FsbGluZyBjb252ZW50aW9ucy4gIE5vbmUgb2YgdGhlc2UgY2FsbGluZyBjb252ZW50aW9ucworICAgIC8vIHN1cHBvcnQgdmFyYXJncyBjYWxscywgYW5kIGFsbCBhc3N1bWUgdGhhdCB0aGUgY2FsbGVyIGFuZCBjYWxsZWUKKyAgICAvLyBwcm90b3R5cGUgZXhhY3RseSBtYXRjaC4KKworICAgIC8vLyBGYXN0IC0gVGhpcyBjYWxsaW5nIGNvbnZlbnRpb24gYXR0ZW1wdHMgdG8gbWFrZSBjYWxscyBhcyBmYXN0IGFzCisgICAgLy8vIHBvc3NpYmxlIChlLmcuIGJ5IHBhc3NpbmcgdGhpbmdzIGluIHJlZ2lzdGVycykuCisgICAgRmFzdCA9IDgsCisKKyAgICAvLyBDb2xkIC0gVGhpcyBjYWxsaW5nIGNvbnZlbnRpb24gYXR0ZW1wdHMgdG8gbWFrZSBjb2RlIGluIHRoZSBjYWxsZXIgYXMKKyAgICAvLyBlZmZpY2llbnQgYXMgcG9zc2libGUgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgY2FsbCBpcyBub3QgY29tbW9ubHkKKyAgICAvLyBleGVjdXRlZC4gIEFzIHN1Y2gsIHRoZXNlIGNhbGxzIG9mdGVuIHByZXNlcnZlIGFsbCByZWdpc3RlcnMgc28gdGhhdCB0aGUKKyAgICAvLyBjYWxsIGRvZXMgbm90IGJyZWFrIGFueSBsaXZlIHJhbmdlcyBpbiB0aGUgY2FsbGVyIHNpZGUuCisgICAgQ29sZCA9IDksCisKKyAgICAvLyBHSEMgLSBDYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBieSB0aGUgR2xhc2dvdyBIYXNrZWxsIENvbXBpbGVyIChHSEMpLgorICAgIEdIQyA9IDEwLAorCisgICAgLy8gSGlQRSAtIENhbGxpbmcgY29udmVudGlvbiB1c2VkIGJ5IHRoZSBIaWdoLVBlcmZvcm1hbmNlIEVybGFuZyBDb21waWxlcgorICAgIC8vIChIaVBFKS4KKyAgICBIaVBFID0gMTEsCisKKyAgICAvLyBXZWJLaXQgSlMgLSBDYWxsaW5nIGNvbnZlbnRpb24gZm9yIHN0YWNrIGJhc2VkIEphdmFTY3JpcHQgY2FsbHMKKyAgICBXZWJLaXRfSlMgPSAxMiwKKworICAgIC8vIEFueVJlZyAtIENhbGxpbmcgY29udmVudGlvbiBmb3IgZHluYW1pYyByZWdpc3RlciBiYXNlZCBjYWxscyAoZS5nLgorICAgIC8vIHN0YWNrbWFwIGFuZCBwYXRjaHBvaW50IGludHJpbnNpY3MpLgorICAgIEFueVJlZyA9IDEzLAorCisgICAgLy8gUHJlc2VydmVNb3N0IC0gQ2FsbGluZyBjb252ZW50aW9uIGZvciBydW50aW1lIGNhbGxzIHRoYXQgcHJlc2VydmVzIG1vc3QKKyAgICAvLyByZWdpc3RlcnMuCisgICAgUHJlc2VydmVNb3N0ID0gMTQsCisKKyAgICAvLyBQcmVzZXJ2ZUFsbCAtIENhbGxpbmcgY29udmVudGlvbiBmb3IgcnVudGltZSBjYWxscyB0aGF0IHByZXNlcnZlcworICAgIC8vIChhbG1vc3QpIGFsbCByZWdpc3RlcnMuCisgICAgUHJlc2VydmVBbGwgPSAxNSwKKworICAgIC8vIFN3aWZ0IC0gQ2FsbGluZyBjb252ZW50aW9uIGZvciBTd2lmdC4KKyAgICBTd2lmdCA9IDE2LAorCisgICAgLy8gQ1hYX0ZBU1RfVExTIC0gQ2FsbGluZyBjb252ZW50aW9uIGZvciBhY2Nlc3MgZnVuY3Rpb25zLgorICAgIENYWF9GQVNUX1RMUyA9IDE3LAorCisgICAgLy8gVGFyZ2V0IC0gVGhpcyBpcyB0aGUgc3RhcnQgb2YgdGhlIHRhcmdldC1zcGVjaWZpYyBjYWxsaW5nIGNvbnZlbnRpb25zLAorICAgIC8vIGUuZy4gZmFzdGNhbGwgYW5kIHRoaXNjYWxsIG9uIFg4Ni4KKyAgICBGaXJzdFRhcmdldENDID0gNjQsCisKKyAgICAvLy8gWDg2X1N0ZENhbGwgLSBzdGRjYWxsIGlzIHRoZSBjYWxsaW5nIGNvbnZlbnRpb25zIG1vc3RseSB1c2VkIGJ5IHRoZQorICAgIC8vLyBXaW4zMiBBUEkuIEl0IGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyB0aGUgQyBjb252ZW50aW9uIHdpdGggdGhlCisgICAgLy8vIGRpZmZlcmVuY2UgaW4gdGhhdCB0aGUgY2FsbGVlIGlzIHJlc3BvbnNpYmxlIGZvciBwb3BwaW5nIHRoZSBhcmd1bWVudHMKKyAgICAvLy8gZnJvbSB0aGUgc3RhY2suCisgICAgWDg2X1N0ZENhbGwgPSA2NCwKKworICAgIC8vLyBYODZfRmFzdENhbGwgLSAnZmFzdCcgYW5hbG9nIG9mIFg4Nl9TdGRDYWxsLiBQYXNzZXMgZmlyc3QgdHdvIGFyZ3VtZW50cworICAgIC8vLyBpbiBFQ1g6RURYIHJlZ2lzdGVycywgb3RoZXJzIC0gdmlhIHN0YWNrLiBDYWxsZWUgaXMgcmVzcG9uc2libGUgZm9yCisgICAgLy8vIHN0YWNrIGNsZWFuaW5nLgorICAgIFg4Nl9GYXN0Q2FsbCA9IDY1LAorCisgICAgLy8vIEFSTV9BUENTIC0gQVJNIFByb2NlZHVyZSBDYWxsaW5nIFN0YW5kYXJkIGNhbGxpbmcgY29udmVudGlvbiAob2Jzb2xldGUsCisgICAgLy8vIGJ1dCBzdGlsbCB1c2VkIG9uIHNvbWUgdGFyZ2V0cykuCisgICAgQVJNX0FQQ1MgPSA2NiwKKworICAgIC8vLyBBUk1fQUFQQ1MgLSBBUk0gQXJjaGl0ZWN0dXJlIFByb2NlZHVyZSBDYWxsaW5nIFN0YW5kYXJkIGNhbGxpbmcKKyAgICAvLy8gY29udmVudGlvbiAoYWthIEVBQkkpLiBTb2Z0IGZsb2F0IHZhcmlhbnQuCisgICAgQVJNX0FBUENTID0gNjcsCisKKyAgICAvLy8gQVJNX0FBUENTX1ZGUCAtIFNhbWUgYXMgQVJNX0FBUENTLCBidXQgdXNlcyBoYXJkIGZsb2F0aW5nIHBvaW50IEFCSS4KKyAgICBBUk1fQUFQQ1NfVkZQID0gNjgsCisKKyAgICAvLy8gTVNQNDMwX0lOVFIgLSBDYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBmb3IgTVNQNDMwIGludGVycnVwdCByb3V0aW5lcy4KKyAgICBNU1A0MzBfSU5UUiA9IDY5LAorCisgICAgLy8vIFg4Nl9UaGlzQ2FsbCAtIFNpbWlsYXIgdG8gWDg2X1N0ZENhbGwuIFBhc3NlcyBmaXJzdCBhcmd1bWVudCBpbiBFQ1gsCisgICAgLy8vIG90aGVycyB2aWEgc3RhY2suIENhbGxlZSBpcyByZXNwb25zaWJsZSBmb3Igc3RhY2sgY2xlYW5pbmcuIE1TVkMgdXNlcworICAgIC8vLyB0aGlzIGJ5IGRlZmF1bHQgZm9yIG1ldGhvZHMgaW4gaXRzIEFCSS4KKyAgICBYODZfVGhpc0NhbGwgPSA3MCwKKworICAgIC8vLyBQVFhfS2VybmVsIC0gQ2FsbCB0byBhIFBUWCBrZXJuZWwuCisgICAgLy8vIFBhc3NlcyBhbGwgYXJndW1lbnRzIGluIHBhcmFtZXRlciBzcGFjZS4KKyAgICBQVFhfS2VybmVsID0gNzEsCisKKyAgICAvLy8gUFRYX0RldmljZSAtIENhbGwgdG8gYSBQVFggZGV2aWNlIGZ1bmN0aW9uLgorICAgIC8vLyBQYXNzZXMgYWxsIGFyZ3VtZW50cyBpbiByZWdpc3RlciBvciBwYXJhbWV0ZXIgc3BhY2UuCisgICAgUFRYX0RldmljZSA9IDcyLAorCisgICAgLy8vIFNQSVJfRlVOQyAtIENhbGxpbmcgY29udmVudGlvbiBmb3IgU1BJUiBub24ta2VybmVsIGRldmljZSBmdW5jdGlvbnMuCisgICAgLy8vIE5vIGxvd2VyaW5nIG9yIGV4cGFuc2lvbiBvZiBhcmd1bWVudHMuCisgICAgLy8vIFN0cnVjdHVyZXMgYXJlIHBhc3NlZCBhcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3Qgd2l0aCB0aGUgYnl2YWwgYXR0cmlidXRlLgorICAgIC8vLyBGdW5jdGlvbnMgY2FuIG9ubHkgY2FsbCBTUElSX0ZVTkMgYW5kIFNQSVJfS0VSTkVMIGZ1bmN0aW9ucy4KKyAgICAvLy8gRnVuY3Rpb25zIGNhbiBvbmx5IGhhdmUgemVybyBvciBvbmUgcmV0dXJuIHZhbHVlcy4KKyAgICAvLy8gVmFyaWFibGUgYXJndW1lbnRzIGFyZSBub3QgYWxsb3dlZCwgZXhjZXB0IGZvciBwcmludGYuCisgICAgLy8vIEhvdyBhcmd1bWVudHMvcmV0dXJuIHZhbHVlcyBhcmUgbG93ZXJlZCBhcmUgbm90IHNwZWNpZmllZC4KKyAgICAvLy8gRnVuY3Rpb25zIGFyZSBvbmx5IHZpc2libGUgdG8gdGhlIGRldmljZXMuCisgICAgU1BJUl9GVU5DID0gNzUsCisKKyAgICAvLy8gU1BJUl9LRVJORUwgLSBDYWxsaW5nIGNvbnZlbnRpb24gZm9yIFNQSVIga2VybmVsIGZ1bmN0aW9ucy4KKyAgICAvLy8gSW5oZXJpdHMgdGhlIHJlc3RyaWN0aW9ucyBvZiBTUElSX0ZVTkMsIGV4Y2VwdAorICAgIC8vLyBDYW5ub3QgaGF2ZSBub24tdm9pZCByZXR1cm4gdmFsdWVzLgorICAgIC8vLyBDYW5ub3QgaGF2ZSB2YXJpYWJsZSBhcmd1bWVudHMuCisgICAgLy8vIENhbiBhbHNvIGJlIGNhbGxlZCBieSB0aGUgaG9zdC4KKyAgICAvLy8gSXMgZXh0ZXJuYWxseSB2aXNpYmxlLgorICAgIFNQSVJfS0VSTkVMID0gNzYsCisKKyAgICAvLy8gSW50ZWxfT0NMX0JJIC0gQ2FsbGluZyBjb252ZW50aW9ucyBmb3IgSW50ZWwgT3BlbkNMIGJ1aWx0LWlucworICAgIEludGVsX09DTF9CSSA9IDc3LAorCisgICAgLy8vIFxicmllZiBUaGUgQyBjb252ZW50aW9uIGFzIHNwZWNpZmllZCBpbiB0aGUgeDg2LTY0IHN1cHBsZW1lbnQgdG8gdGhlCisgICAgLy8vIFN5c3RlbSBWIEFCSSwgdXNlZCBvbiBtb3N0IG5vbi1XaW5kb3dzIHN5c3RlbXMuCisgICAgWDg2XzY0X1N5c1YgPSA3OCwKKworICAgIC8vLyBcYnJpZWYgVGhlIEMgY29udmVudGlvbiBhcyBpbXBsZW1lbnRlZCBvbiBXaW5kb3dzL3g4Ni02NCBhbmQKKyAgICAvLy8gQUFyY2g2NC4gVGhpcyBjb252ZW50aW9uIGRpZmZlcnMgZnJvbSB0aGUgbW9yZSBjb21tb24KKyAgICAvLy8gXGMgWDg2XzY0X1N5c1YgY29udmVudGlvbiBpbiBhIG51bWJlciBvZiB3YXlzLCBtb3N0IG5vdGFibHkgaW4KKyAgICAvLy8gdGhhdCBYTU0gcmVnaXN0ZXJzIHVzZWQgdG8gcGFzcyBhcmd1bWVudHMgYXJlIHNoYWRvd2VkIGJ5IEdQUnMsCisgICAgLy8vIGFuZCB2aWNlIHZlcnNhLgorICAgIC8vLyBPbiBBQXJjaDY0LCB0aGlzIGlzIGlkZW50aWNhbCB0byB0aGUgbm9ybWFsIEMgKEFBUENTKSBjYWxsaW5nCisgICAgLy8vIGNvbnZlbnRpb24gZm9yIG5vcm1hbCBmdW5jdGlvbnMsIGJ1dCBmbG9hdHMgYXJlIHBhc3NlZCBpbiBpbnRlZ2VyCisgICAgLy8vIHJlZ2lzdGVycyB0byB2YXJpYWRpYyBmdW5jdGlvbnMuCisgICAgV2luNjQgPSA3OSwKKworICAgIC8vLyBcYnJpZWYgTVNWQyBjYWxsaW5nIGNvbnZlbnRpb24gdGhhdCBwYXNzZXMgdmVjdG9ycyBhbmQgdmVjdG9yIGFnZ3JlZ2F0ZXMKKyAgICAvLy8gaW4gU1NFIHJlZ2lzdGVycy4KKyAgICBYODZfVmVjdG9yQ2FsbCA9IDgwLAorCisgICAgLy8vIFxicmllZiBDYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBieSBIaXBIb3AgVmlydHVhbCBNYWNoaW5lIChISFZNKSB0bworICAgIC8vLyBwZXJmb3JtIGNhbGxzIHRvIGFuZCBmcm9tIHRyYW5zbGF0aW9uIGNhY2hlLCBhbmQgZm9yIGNhbGxpbmcgUEhQCisgICAgLy8vIGZ1bmN0aW9ucy4KKyAgICAvLy8gSEhWTSBjYWxsaW5nIGNvbnZlbnRpb24gc3VwcG9ydHMgdGFpbC9zaWJsaW5nIGNhbGwgZWxpbWluYXRpb24uCisgICAgSEhWTSA9IDgxLAorCisgICAgLy8vIFxicmllZiBISFZNIGNhbGxpbmcgY29udmVudGlvbiBmb3IgaW52b2tpbmcgQy9DKysgaGVscGVycy4KKyAgICBISFZNX0MgPSA4MiwKKworICAgIC8vLyBYODZfSU5UUiAtIHg4NiBoYXJkd2FyZSBpbnRlcnJ1cHQgY29udGV4dC4gQ2FsbGVlIG1heSB0YWtlIG9uZSBvciB0d28KKyAgICAvLy8gcGFyYW1ldGVycywgd2hlcmUgdGhlIDFzdCByZXByZXNlbnRzIGEgcG9pbnRlciB0byBoYXJkd2FyZSBjb250ZXh0IGZyYW1lCisgICAgLy8vIGFuZCB0aGUgMm5kIHJlcHJlc2VudHMgaGFyZHdhcmUgZXJyb3IgY29kZSwgdGhlIHByZXNlbmNlIG9mIHRoZSBsYXRlcgorICAgIC8vLyBkZXBlbmRzIG9uIHRoZSBpbnRlcnJ1cHQgdmVjdG9yIHRha2VuLiBWYWxpZCBmb3IgYm90aCAzMi0gYW5kIDY0LWJpdAorICAgIC8vLyBzdWJ0YXJnZXRzLgorICAgIFg4Nl9JTlRSID0gODMsCisKKyAgICAvLy8gVXNlZCBmb3IgQVZSIGludGVycnVwdCByb3V0aW5lcy4KKyAgICBBVlJfSU5UUiA9IDg0LAorCisgICAgLy8vIENhbGxpbmcgY29udmVudGlvbiB1c2VkIGZvciBBVlIgc2lnbmFsIHJvdXRpbmVzLgorICAgIEFWUl9TSUdOQUwgPSA4NSwKKworICAgIC8vLyBDYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBmb3Igc3BlY2lhbCBBVlIgcnRsaWIgZnVuY3Rpb25zCisgICAgLy8vIHdoaWNoIGhhdmUgYW4gIm9wdGltaXplZCIgY29udmVudGlvbiB0byBwcmVzZXJ2ZSByZWdpc3RlcnMuCisgICAgQVZSX0JVSUxUSU4gPSA4NiwKKworICAgIC8vLyBDYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBmb3IgTWVzYSB2ZXJ0ZXggc2hhZGVycywgb3IgQU1EUEFMIGxhc3Qgc2hhZGVyCisgICAgLy8vIHN0YWdlIGJlZm9yZSByYXN0ZXJpemF0aW9uICh2ZXJ0ZXggc2hhZGVyIGlmIHRlc3NlbGxhdGlvbiBhbmQgZ2VvbWV0cnkKKyAgICAvLy8gYXJlIG5vdCBpbiB1c2UsIG9yIG90aGVyd2lzZSBjb3B5IHNoYWRlciBpZiBvbmUgaXMgbmVlZGVkKS4KKyAgICBBTURHUFVfVlMgPSA4NywKKworICAgIC8vLyBDYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBmb3IgTWVzYS9BTURQQUwgZ2VvbWV0cnkgc2hhZGVycy4KKyAgICBBTURHUFVfR1MgPSA4OCwKKworICAgIC8vLyBDYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBmb3IgTWVzYS9BTURQQUwgcGl4ZWwgc2hhZGVycy4KKyAgICBBTURHUFVfUFMgPSA4OSwKKworICAgIC8vLyBDYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBmb3IgTWVzYS9BTURQQUwgY29tcHV0ZSBzaGFkZXJzLgorICAgIEFNREdQVV9DUyA9IDkwLAorCisgICAgLy8vIENhbGxpbmcgY29udmVudGlvbiBmb3IgQU1ER1BVIGNvZGUgb2JqZWN0IGtlcm5lbHMuCisgICAgQU1ER1BVX0tFUk5FTCA9IDkxLAorCisgICAgLy8vIFJlZ2lzdGVyIGNhbGxpbmcgY29udmVudGlvbiB1c2VkIGZvciBwYXJhbWV0ZXJzIHRyYW5zZmVyIG9wdGltaXphdGlvbgorICAgIFg4Nl9SZWdDYWxsID0gOTIsCisKKyAgICAvLy8gQ2FsbGluZyBjb252ZW50aW9uIHVzZWQgZm9yIE1lc2EvQU1EUEFMIGh1bGwgc2hhZGVycyAoPSB0ZXNzZWxsYXRpb24KKyAgICAvLy8gY29udHJvbCBzaGFkZXJzKS4KKyAgICBBTURHUFVfSFMgPSA5MywKKworICAgIC8vLyBDYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBmb3Igc3BlY2lhbCBNU1A0MzAgcnRsaWIgZnVuY3Rpb25zCisgICAgLy8vIHdoaWNoIGhhdmUgYW4gIm9wdGltaXplZCIgY29udmVudGlvbiB1c2luZyBhZGRpdGlvbmFsIHJlZ2lzdGVycy4KKyAgICBNU1A0MzBfQlVJTFRJTiA9IDk0LAorCisgICAgLy8vIENhbGxpbmcgY29udmVudGlvbiB1c2VkIGZvciBBTURQQUwgdmVydGV4IHNoYWRlciBpZiB0ZXNzZWxsYXRpb24gaXMgaW4KKyAgICAvLy8gdXNlLgorICAgIEFNREdQVV9MUyA9IDk1LAorCisgICAgLy8vIENhbGxpbmcgY29udmVudGlvbiB1c2VkIGZvciBBTURQQUwgc2hhZGVyIHN0YWdlIGJlZm9yZSBnZW9tZXRyeSBzaGFkZXIKKyAgICAvLy8gaWYgZ2VvbWV0cnkgaXMgaW4gdXNlLiBTbyBlaXRoZXIgdGhlIGRvbWFpbiAoPSB0ZXNzZWxsYXRpb24gZXZhbHVhdGlvbikKKyAgICAvLy8gc2hhZGVyIGlmIHRlc3NlbGxhdGlvbiBpcyBpbiB1c2UsIG9yIG90aGVyd2lzZSB0aGUgdmVydGV4IHNoYWRlci4KKyAgICBBTURHUFVfRVMgPSA5NiwKKworICAgIC8vLyBUaGUgaGlnaGVzdCBwb3NzaWJsZSBjYWxsaW5nIGNvbnZlbnRpb24gSUQuIE11c3QgYmUgc29tZSAyXmsgLSAxLgorICAgIE1heElEID0gMTAyMworICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2FsbGluZ0NvbnYKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfQ0FMTElOR0NPTlZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Db21kYXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQ29tZGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1MTIxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQ29tZGF0LmgKQEAgLTAsMCArMSw3MSBAQAorLy89PT0tIGxsdm0vSVIvQ29tZGF0LmggLSBDb21kYXQgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gQGZpbGUKKy8vLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBDb21kYXQgY2xhc3MsIHdoaWNoIHJlcHJlc2VudHMgYQorLy8vIHNpbmdsZSBDT01EQVQgaW4gTExWTS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfQ09NREFUX0gKKyNkZWZpbmUgTExWTV9JUl9DT01EQVRfSAorCisjaW5jbHVkZSAibGx2bS1jL1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NCaW5kaW5nV3JhcHBpbmcuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFN0cmluZ1JlZjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5PiBjbGFzcyBTdHJpbmdNYXBFbnRyeTsKKworLy8gVGhpcyBpcyBhIE5hbWUgWCBTZWxlY3Rpb25LaW5kIHBhaXIuIFRoZSByZWFzb24gZm9yIGhhdmluZyB0aGlzIGJlIGFuCisvLyBpbmRlcGVuZGVudCBvYmplY3QgaW5zdGVhZCBvZiBqdXN0IGFkZGluZyB0aGUgbmFtZSBhbmQgdGhlIFNlbGVjdGlvbktpbmQKKy8vIHRvIGEgR2xvYmFsT2JqZWN0IGlzIHRoYXQgaXQgaXMgaW52YWxpZCB0byBoYXZlIHR3byBDb21kYXRzIHdpdGggdGhlIHNhbWUKKy8vIG5hbWUgYnV0IGRpZmZlcmVudCBTZWxlY3Rpb25LaW5kLiBUaGlzIHN0cnVjdHVyZSBtYWtlcyB0aGF0IHVucmVwcmVzZW50YWJsZS4KK2NsYXNzIENvbWRhdCB7CitwdWJsaWM6CisgIGVudW0gU2VsZWN0aW9uS2luZCB7CisgICAgQW55LCAgICAgICAgICAvLy88IFRoZSBsaW5rZXIgbWF5IGNob29zZSBhbnkgQ09NREFULgorICAgIEV4YWN0TWF0Y2gsICAgLy8vPCBUaGUgZGF0YSByZWZlcmVuY2VkIGJ5IHRoZSBDT01EQVQgbXVzdCBiZSB0aGUgc2FtZS4KKyAgICBMYXJnZXN0LCAgICAgIC8vLzwgVGhlIGxpbmtlciB3aWxsIGNob29zZSB0aGUgbGFyZ2VzdCBDT01EQVQuCisgICAgTm9EdXBsaWNhdGVzLCAvLy88IE5vIG90aGVyIE1vZHVsZSBtYXkgc3BlY2lmeSB0aGlzIENPTURBVC4KKyAgICBTYW1lU2l6ZSwgICAgIC8vLzwgVGhlIGRhdGEgcmVmZXJlbmNlZCBieSB0aGUgQ09NREFUIG11c3QgYmUgdGhlIHNhbWUgc2l6ZS4KKyAgfTsKKworICBDb21kYXQoY29uc3QgQ29tZGF0ICYpID0gZGVsZXRlOworICBDb21kYXQoQ29tZGF0ICYmQyk7CisKKyAgU2VsZWN0aW9uS2luZCBnZXRTZWxlY3Rpb25LaW5kKCkgY29uc3QgeyByZXR1cm4gU0s7IH0KKyAgdm9pZCBzZXRTZWxlY3Rpb25LaW5kKFNlbGVjdGlvbktpbmQgVmFsKSB7IFNLID0gVmFsOyB9CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3Q7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBib29sIElzRm9yRGVidWcgPSBmYWxzZSkgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgTW9kdWxlOworCisgIENvbWRhdCgpOworCisgIC8vIFBvaW50cyB0byB0aGUgbWFwIGluIE1vZHVsZS4KKyAgU3RyaW5nTWFwRW50cnk8Q29tZGF0PiAqTmFtZSA9IG51bGxwdHI7CisgIFNlbGVjdGlvbktpbmQgU0sgPSBBbnk7Cit9OworCisvLyBDcmVhdGUgd3JhcHBlcnMgZm9yIEMgQmluZGluZyB0eXBlcyAoc2VlIENCaW5kaW5nV3JhcHBpbmcuaCkuCitERUZJTkVfU0lNUExFX0NPTlZFUlNJT05fRlVOQ1RJT05TKENvbWRhdCwgTExWTUNvbWRhdFJlZikKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgQ29tZGF0ICZDKSB7CisgIEMucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0NPTURBVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0NvbnN0YW50LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0NvbnN0YW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0ODE2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQ29uc3RhbnQuaApAQCAtMCwwICsxLDE4MSBAQAorLy89PT0tLSBsbHZtL0NvbnN0YW50LmggLSBDb25zdGFudCBjbGFzcyBkZWZpbml0aW9uIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBDb25zdGFudCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfQ09OU1RBTlRfSAorI2RlZmluZSBMTFZNX0lSX0NPTlNUQU5UX0gKKworI2luY2x1ZGUgImxsdm0vSVIvVXNlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFQSW50OworCisvLy8gVGhpcyBpcyBhbiBpbXBvcnRhbnQgYmFzZSBjbGFzcyBpbiBMTFZNLiBJdCBwcm92aWRlcyB0aGUgY29tbW9uIGZhY2lsaXRpZXMKKy8vLyBvZiBhbGwgY29uc3RhbnQgdmFsdWVzIGluIGFuIExMVk0gcHJvZ3JhbS4gQSBjb25zdGFudCBpcyBhIHZhbHVlIHRoYXQgaXMKKy8vLyBpbW11dGFibGUgYXQgcnVudGltZS4gRnVuY3Rpb25zIGFyZSBjb25zdGFudHMgYmVjYXVzZSB0aGVpciBhZGRyZXNzIGlzCisvLy8gaW1tdXRhYmxlLiBTYW1lIHdpdGggZ2xvYmFsIHZhcmlhYmxlcy4KKy8vLworLy8vIEFsbCBjb25zdGFudHMgc2hhcmUgdGhlIGNhcGFiaWxpdGllcyBwcm92aWRlZCBpbiB0aGlzIGNsYXNzLiBBbGwgY29uc3RhbnRzCisvLy8gY2FuIGhhdmUgYSBudWxsIHZhbHVlLiBUaGV5IGNhbiBoYXZlIGFuIG9wZXJhbmQgbGlzdC4gQ29uc3RhbnRzIGNhbiBiZQorLy8vIHNpbXBsZSAoaW50ZWdlciBhbmQgZmxvYXRpbmcgcG9pbnQgdmFsdWVzKSwgY29tcGxleCAoYXJyYXlzIGFuZCBzdHJ1Y3R1cmVzKSwKKy8vLyBvciBleHByZXNzaW9uIGJhc2VkIChjb21wdXRhdGlvbnMgeWllbGRpbmcgYSBjb25zdGFudCB2YWx1ZSBjb21wb3NlZCBvZgorLy8vIG9ubHkgY2VydGFpbiBvcGVyYXRvcnMgYW5kIG90aGVyIGNvbnN0YW50IHZhbHVlcykuCisvLy8KKy8vLyBOb3RlIHRoYXQgQ29uc3RhbnRzIGFyZSBpbW11dGFibGUgKG9uY2UgY3JlYXRlZCB0aGV5IG5ldmVyIGNoYW5nZSkKKy8vLyBhbmQgYXJlIGZ1bGx5IHNoYXJlZCBieSBzdHJ1Y3R1cmFsIGVxdWl2YWxlbmNlLiAgVGhpcyBtZWFucyB0aGF0IHR3bworLy8vIHN0cnVjdHVyYWxseSBlcXVpdmFsZW50IGNvbnN0YW50cyB3aWxsIGFsd2F5cyBoYXZlIHRoZSBzYW1lIGFkZHJlc3MuCisvLy8gQ29uc3RhbnRzIGFyZSBjcmVhdGVkIG9uIGRlbWFuZCBhcyBuZWVkZWQgYW5kIG5ldmVyIGRlbGV0ZWQ6IHRodXMgY2xpZW50cworLy8vIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGxpZmV0aW1lIG9mIHRoZSBvYmplY3RzLgorLy8vIEBicmllZiBMTFZNIENvbnN0YW50IFJlcHJlc2VudGF0aW9uCitjbGFzcyBDb25zdGFudCA6IHB1YmxpYyBVc2VyIHsKK3Byb3RlY3RlZDoKKyAgQ29uc3RhbnQoVHlwZSAqdHksIFZhbHVlVHkgdnR5LCBVc2UgKk9wcywgdW5zaWduZWQgTnVtT3BzKQorICAgIDogVXNlcih0eSwgdnR5LCBPcHMsIE51bU9wcykge30KKworcHVibGljOgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDb25zdGFudCAmKSA9IGRlbGV0ZTsKKyAgQ29uc3RhbnQoY29uc3QgQ29uc3RhbnQgJikgPSBkZWxldGU7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgdGhlIHZhbHVlIHRoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkgZ2V0TnVsbFZhbHVlLgorICBib29sIGlzTnVsbFZhbHVlKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgb25lLgorICBib29sIGlzT25lVmFsdWUoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgdmFsdWUgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBieQorICAvLy8gZ2V0QWxsT25lc1ZhbHVlLgorICBib29sIGlzQWxsT25lc1ZhbHVlKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyB3aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5CisgIC8vLyBnZXRaZXJvVmFsdWVGb3JOZWdhdGlvbi4KKyAgYm9vbCBpc05lZ2F0aXZlWmVyb1ZhbHVlKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZSB6ZXJvIG9yIG51bGwgdmFsdWUuCisgIGJvb2wgaXNaZXJvVmFsdWUoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIG5vdCB0aGUgc21hbGxlc3Qgc2lnbmVkIHZhbHVlLgorICBib29sIGlzTm90TWluU2lnbmVkVmFsdWUoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIHRoZSBzbWFsbGVzdCBzaWduZWQgdmFsdWUuCisgIGJvb2wgaXNNaW5TaWduZWRWYWx1ZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgZmluaXRlIGFuZCBub24temVybyBmbG9hdGluZy1wb2ludCBzY2FsYXIKKyAgLy8vIGNvbnN0YW50IG9yIGEgdmVjdG9yIGNvbnN0YW50IHdpdGggYWxsIGZpbml0ZSBhbmQgbm9uLXplcm8gZWxlbWVudHMuCisgIGJvb2wgaXNGaW5pdGVOb25aZXJvRlAoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIG5vcm1hbCAoYXMgb3Bwb3NlZCB0byBkZW5vcm1hbCkgZmxvYXRpbmctcG9pbnQKKyAgLy8vIHNjYWxhciBjb25zdGFudCBvciBhIHZlY3RvciBjb25zdGFudCB3aXRoIGFsbCBub3JtYWwgZWxlbWVudHMuCisgIGJvb2wgaXNOb3JtYWxGUCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNjYWxhciBoYXMgYW4gZXhhY3QgbXVsdGlwbGljYXRpdmUgaW52ZXJzZSBvciB0aGlzCisgIC8vLyB2ZWN0b3IgaGFzIGFuIGV4YWN0IG11bHRpcGxpY2F0aXZlIGludmVyc2UgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgdmVjdG9yLgorICBib29sIGhhc0V4YWN0SW52ZXJzZUZQKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBmbG9hdGluZy1wb2ludCBOYU4gY29uc3RhbnQgb3IgYSB2ZWN0b3IKKyAgLy8vIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50IHdpdGggYWxsIE5hTiBlbGVtZW50cy4KKyAgYm9vbCBpc05hTigpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBldmFsdWF0aW9uIG9mIHRoaXMgY29uc3RhbnQgY291bGQgdHJhcC4gVGhpcyBpcyB0cnVlIGZvcgorICAvLy8gdGhpbmdzIGxpa2UgY29uc3RhbnQgZXhwcmVzc2lvbnMgdGhhdCBjb3VsZCBkaXZpZGUgYnkgemVyby4KKyAgYm9vbCBjYW5UcmFwKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBjYW4gdmFyeSBiZXR3ZWVuIHRocmVhZHMuCisgIGJvb2wgaXNUaHJlYWREZXBlbmRlbnQoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGRlcGVuZGVudCBvbiBhIGRsbGltcG9ydCB2YXJpYWJsZS4KKyAgYm9vbCBpc0RMTEltcG9ydERlcGVuZGVudCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29uc3RhbnQgaGFzIHVzZXJzIG90aGVyIHRoYW4gY29uc3RhbnQgZXhwcmVzc2lvbnMgYW5kCisgIC8vLyBvdGhlciBkYW5nbGluZyB0aGluZ3MuCisgIGJvb2wgaXNDb25zdGFudFVzZWQoKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgY2xhc3NpZmllcyB0aGUgZW50cnkgYWNjb3JkaW5nIHRvIHdoZXRoZXIgb3Igbm90IGl0IG1heQorICAvLy8gZ2VuZXJhdGUgYSByZWxvY2F0aW9uIGVudHJ5LiAgVGhpcyBtdXN0IGJlIGNvbnNlcnZhdGl2ZSwgc28gaWYgaXQgbWlnaHQKKyAgLy8vIGNvZGVnZW4gdG8gYSByZWxvY2F0YWJsZSBlbnRyeSwgaXQgc2hvdWxkIHNheSBzby4KKyAgLy8vCisgIC8vLyBGSVhNRTogVGhpcyByZWFsbHkgc2hvdWxkIG5vdCBiZSBpbiBJUi4KKyAgYm9vbCBuZWVkc1JlbG9jYXRpb24oKSBjb25zdDsKKworICAvLy8gRm9yIGFnZ3JlZ2F0ZXMgKHN0cnVjdC9hcnJheS92ZWN0b3IpIHJldHVybiB0aGUgY29uc3RhbnQgdGhhdCBjb3JyZXNwb25kcworICAvLy8gdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50IGlmIHBvc3NpYmxlLCBvciBudWxsIGlmIG5vdC4gVGhpcyBjYW4gcmV0dXJuIG51bGwKKyAgLy8vIGlmIHRoZSBlbGVtZW50IGluZGV4IGlzIGEgQ29uc3RhbnRFeHByLCBvciBpZiAndGhpcycgaXMgYSBjb25zdGFudCBleHByLgorICBDb25zdGFudCAqZ2V0QWdncmVnYXRlRWxlbWVudCh1bnNpZ25lZCBFbHQpIGNvbnN0OworICBDb25zdGFudCAqZ2V0QWdncmVnYXRlRWxlbWVudChDb25zdGFudCAqRWx0KSBjb25zdDsKKworICAvLy8gSWYgdGhpcyBpcyBhIHNwbGF0IHZlY3RvciBjb25zdGFudCwgbWVhbmluZyB0aGF0IGFsbCBvZiB0aGUgZWxlbWVudHMgaGF2ZQorICAvLy8gdGhlIHNhbWUgdmFsdWUsIHJldHVybiB0aGF0IHZhbHVlLiBPdGhlcndpc2UgcmV0dXJuIDAuCisgIENvbnN0YW50ICpnZXRTcGxhdFZhbHVlKCkgY29uc3Q7CisKKyAgLy8vIElmIEMgaXMgYSBjb25zdGFudCBpbnRlZ2VyIHRoZW4gcmV0dXJuIGl0cyB2YWx1ZSwgb3RoZXJ3aXNlIEMgbXVzdCBiZSBhCisgIC8vLyB2ZWN0b3Igb2YgY29uc3RhbnQgaW50ZWdlcnMsIGFsbCBlcXVhbCwgYW5kIHRoZSBjb21tb24gdmFsdWUgaXMgcmV0dXJuZWQuCisgIGNvbnN0IEFQSW50ICZnZXRVbmlxdWVJbnRlZ2VyKCkgY29uc3Q7CisKKyAgLy8vIENhbGxlZCBpZiBzb21lIGVsZW1lbnQgb2YgdGhpcyBjb25zdGFudCBpcyBubyBsb25nZXIgdmFsaWQuCisgIC8vLyBBdCB0aGlzIHBvaW50IG9ubHkgb3RoZXIgY29uc3RhbnRzIG1heSBiZSBvbiB0aGUgdXNlX2xpc3QgZm9yIHRoaXMKKyAgLy8vIGNvbnN0YW50LiAgQW55IGNvbnN0YW50cyBvbiBvdXIgVXNlIGxpc3QgbXVzdCBhbHNvIGJlIGRlc3Ryb3knZC4gIFRoZQorICAvLy8gaW1wbGVtZW50YXRpb24gbXVzdCBiZSBzdXJlIHRvIHJlbW92ZSB0aGUgY29uc3RhbnQgZnJvbSB0aGUgbGlzdCBvZgorICAvLy8gYXZhaWxhYmxlIGNhY2hlZCBjb25zdGFudHMuICBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGltcGxlbWVudAorICAvLy8gZGVzdHJveUNvbnN0YW50SW1wbCB0byByZW1vdmUgY29uc3RhbnRzIGZyb20gYW55IHBvb2xzL21hcHMgdGhleSBhcmUKKyAgLy8vIGNvbnRhaW5lZCBpdC4KKyAgdm9pZCBkZXN0cm95Q29uc3RhbnQoKTsKKworICAvLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KENvbnN0YW50Rmlyc3RWYWwgPT0gMCwgIlYtPmdldFZhbHVlSUQoKSA+PSBDb25zdGFudEZpcnN0VmFsIGFsd2F5cyBzdWNjZWVkcyIpOworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPD0gQ29uc3RhbnRMYXN0VmFsOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIGlzIGEgc3BlY2lhbCBmb3JtIG9mIFVzZXI6OnJlcGxhY2VVc2VzT2ZXaXRoCisgIC8vLyAod2hpY2ggZG9lcyBub3Qgd29yayBvbiBjb25zdGFudHMpIHRoYXQgZG9lcyB3b3JrCisgIC8vLyBvbiBjb25zdGFudHMuICBCYXNpY2FsbHkgdGhpcyBtZXRob2QgZ29lcyB0aHJvdWdoIHRoZSB0cm91YmxlIG9mIGJ1aWxkaW5nCisgIC8vLyBhIG5ldyBjb25zdGFudCB0aGF0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGN1cnJlbnQgb25lLCB3aXRoIGFsbCB1c2VzIG9mCisgIC8vLyBGcm9tIHJlcGxhY2VkIHdpdGggdXNlcyBvZiBUby4gIEFmdGVyIHRoaXMgY29uc3RydWN0aW9uIGlzIGNvbXBsZXRlZCwgYWxsCisgIC8vLyBvZiB0aGUgdXNlcnMgb2YgJ3RoaXMnIGFyZSByZXBsYWNlZCB0byB1c2UgdGhlIG5ldyBjb25zdGFudCwgYW5kIHRoZW4KKyAgLy8vICd0aGlzJyBpcyBkZWxldGVkLiAgSW4gZ2VuZXJhbCwgeW91IHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZCwgaW5zdGVhZCwKKyAgLy8vIHVzZSBWYWx1ZTo6cmVwbGFjZUFsbFVzZXNXaXRoLCB3aGljaCBhdXRvbWF0aWNhbGx5IGRpc3BhdGNoZXMgdG8gdGhpcworICAvLy8gbWV0aG9kIGFzIG5lZWRlZC4KKyAgLy8vCisgIHZvaWQgaGFuZGxlT3BlcmFuZENoYW5nZShWYWx1ZSAqLCBWYWx1ZSAqKTsKKworICBzdGF0aWMgQ29uc3RhbnQgKmdldE51bGxWYWx1ZShUeXBlKiBUeSk7CisKKyAgLy8vIEByZXR1cm5zIHRoZSB2YWx1ZSBmb3IgYW4gaW50ZWdlciBvciB2ZWN0b3Igb2YgaW50ZWdlciBjb25zdGFudCBvZiB0aGUKKyAgLy8vIGdpdmVuIHR5cGUgdGhhdCBoYXMgYWxsIGl0cyBiaXRzIHNldCB0byB0cnVlLgorICAvLy8gQGJyaWVmIEdldCB0aGUgYWxsIG9uZXMgdmFsdWUKKyAgc3RhdGljIENvbnN0YW50ICpnZXRBbGxPbmVzVmFsdWUoVHlwZSogVHkpOworCisgIC8vLyBSZXR1cm4gdGhlIHZhbHVlIGZvciBhbiBpbnRlZ2VyIG9yIHBvaW50ZXIgY29uc3RhbnQsIG9yIGEgdmVjdG9yIHRoZXJlb2YsCisgIC8vLyB3aXRoIHRoZSBnaXZlbiBzY2FsYXIgdmFsdWUuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0SW50ZWdlclZhbHVlKFR5cGUgKlR5LCBjb25zdCBBUEludCAmVik7CisKKyAgLy8vIElmIHRoZXJlIGFyZSBhbnkgZGVhZCBjb25zdGFudCB1c2VycyBkYW5nbGluZyBvZmYgb2YgdGhpcyBjb25zdGFudCwgcmVtb3ZlCisgIC8vLyB0aGVtLiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIGNsaWVudHMgdGhhdCB3YW50IHRvIGNoZWNrIHRvIHNlZSBpZiBhCisgIC8vLyBnbG9iYWwgaXMgdW51c2VkLCBidXQgZG9uJ3Qgd2FudCB0byBkZWFsIHdpdGggcG90ZW50aWFsbHkgZGVhZCBjb25zdGFudHMKKyAgLy8vIGhhbmdpbmcgb2ZmIG9mIHRoZSBnbG9iYWxzLgorICB2b2lkIHJlbW92ZURlYWRDb25zdGFudFVzZXJzKCkgY29uc3Q7CisKKyAgY29uc3QgQ29uc3RhbnQgKnN0cmlwUG9pbnRlckNhc3RzKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PENvbnN0YW50PihWYWx1ZTo6c3RyaXBQb2ludGVyQ2FzdHMoKSk7CisgIH0KKworICBDb25zdGFudCAqc3RyaXBQb2ludGVyQ2FzdHMoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q29uc3RhbnQqPigKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBDb25zdGFudCAqPih0aGlzKS0+c3RyaXBQb2ludGVyQ2FzdHMoKSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0NPTlNUQU5UX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQ29uc3RhbnRGb2xkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQ29uc3RhbnRGb2xkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTViYmE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Db25zdGFudEZvbGRlci5oCkBAIC0wLDAgKzEsMjc3IEBACisvLz09PS0gQ29uc3RhbnRGb2xkZXIuaCAtIENvbnN0YW50IGZvbGRpbmcgaGVscGVyIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBDb25zdGFudEZvbGRlciBjbGFzcywgYSBoZWxwZXIgZm9yIElSQnVpbGRlci4KKy8vIEl0IHByb3ZpZGVzIElSQnVpbGRlciB3aXRoIGEgc2V0IG9mIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGNvbnN0YW50cworLy8gd2l0aCBtaW5pbWFsIGZvbGRpbmcuICBGb3IgZ2VuZXJhbCBjb25zdGFudCBjcmVhdGlvbiBhbmQgZm9sZGluZywKKy8vIHVzZSBDb25zdGFudEV4cHIgYW5kIHRoZSByb3V0aW5lcyBpbiBsbHZtL0FuYWx5c2lzL0NvbnN0YW50Rm9sZGluZy5oLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9DT05TVEFOVEZPTERFUl9ICisjZGVmaW5lIExMVk1fSVJfQ09OU1RBTlRGT0xERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQ29uc3RhbnRGb2xkZXIgLSBDcmVhdGUgY29uc3RhbnRzIHdpdGggbWluaW11bSwgdGFyZ2V0IGluZGVwZW5kZW50LCBmb2xkaW5nLgorY2xhc3MgQ29uc3RhbnRGb2xkZXIgeworcHVibGljOgorICBleHBsaWNpdCBDb25zdGFudEZvbGRlcigpID0gZGVmYXVsdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQmluYXJ5IE9wZXJhdG9ycworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBDb25zdGFudCAqQ3JlYXRlQWRkKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcgPSBmYWxzZSwgYm9vbCBIYXNOU1cgPSBmYWxzZSkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEFkZChMSFMsIFJIUywgSGFzTlVXLCBIYXNOU1cpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUZBZGQoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEZBZGQoTEhTLCBSSFMpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZVN1YihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRTdWIoTEhTLCBSSFMsIEhhc05VVywgSGFzTlNXKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVGU3ViKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRGU3ViKExIUywgUkhTKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVNdWwoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0TXVsKExIUywgUkhTLCBIYXNOVVcsIEhhc05TVyk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlRk11bChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0Rk11bChMSFMsIFJIUyk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlVURpdihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRXhhY3QgPSBmYWxzZSkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFVEaXYoTEhTLCBSSFMsIGlzRXhhY3QpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZVNEaXYoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0V4YWN0ID0gZmFsc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRTRGl2KExIUywgUkhTLCBpc0V4YWN0KTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVGRGl2KENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRGRGl2KExIUywgUkhTKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVVUmVtKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRVUmVtKExIUywgUkhTKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVTUmVtKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRTUmVtKExIUywgUkhTKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVGUmVtKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRGUmVtKExIUywgUkhTKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVTaGwoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0U2hsKExIUywgUkhTLCBIYXNOVVcsIEhhc05TVyk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlTFNocihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRXhhY3QgPSBmYWxzZSkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldExTaHIoTEhTLCBSSFMsIGlzRXhhY3QpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUFTaHIoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0V4YWN0ID0gZmFsc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRBU2hyKExIUywgUkhTLCBpc0V4YWN0KTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVBbmQoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEFuZChMSFMsIFJIUyk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlT3IoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldE9yKExIUywgUkhTKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVYb3IoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFhvcihMSFMsIFJIUyk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlQmluT3AoSW5zdHJ1Y3Rpb246OkJpbmFyeU9wcyBPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0KE9wYywgTEhTLCBSSFMpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFVuYXJ5IE9wZXJhdG9ycworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBDb25zdGFudCAqQ3JlYXRlTmVnKENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXROZWcoQywgSGFzTlVXLCBIYXNOU1cpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUZOZWcoQ29uc3RhbnQgKkMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRGTmVnKEMpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZU5vdChDb25zdGFudCAqQykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldE5vdChDKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBNZW1vcnkgSW5zdHJ1Y3Rpb25zCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIENvbnN0YW50ICpDcmVhdGVHZXRFbGVtZW50UHRyKFR5cGUgKlR5LCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q29uc3RhbnQgKj4gSWR4TGlzdCkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEdldEVsZW1lbnRQdHIoVHksIEMsIElkeExpc3QpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUdldEVsZW1lbnRQdHIoVHlwZSAqVHksIENvbnN0YW50ICpDLCBDb25zdGFudCAqSWR4KSBjb25zdCB7CisgICAgLy8gVGhpcyBmb3JtIG9mIHRoZSBmdW5jdGlvbiBvbmx5IGV4aXN0cyB0byBhdm9pZCBhbWJpZ3VvdXMgb3ZlcmxvYWQKKyAgICAvLyB3YXJuaW5ncyBhYm91dCB3aGV0aGVyIHRvIGNvbnZlcnQgSWR4IHRvIEFycmF5UmVmPENvbnN0YW50ICo+IG9yCisgICAgLy8gQXJyYXlSZWY8VmFsdWUgKj4uCisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0R2V0RWxlbWVudFB0cihUeSwgQywgSWR4KTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVHZXRFbGVtZW50UHRyKFR5cGUgKlR5LCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEdldEVsZW1lbnRQdHIoVHksIEMsIElkeExpc3QpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUluQm91bmRzR2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q29uc3RhbnQgKj4gSWR4TGlzdCkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0cihUeSwgQywgSWR4TGlzdCk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlSW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5cGUgKlR5LCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqSWR4KSBjb25zdCB7CisgICAgLy8gVGhpcyBmb3JtIG9mIHRoZSBmdW5jdGlvbiBvbmx5IGV4aXN0cyB0byBhdm9pZCBhbWJpZ3VvdXMgb3ZlcmxvYWQKKyAgICAvLyB3YXJuaW5ncyBhYm91dCB3aGV0aGVyIHRvIGNvbnZlcnQgSWR4IHRvIEFycmF5UmVmPENvbnN0YW50ICo+IG9yCisgICAgLy8gQXJyYXlSZWY8VmFsdWUgKj4uCisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0SW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5LCBDLCBJZHgpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUluQm91bmRzR2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0cihUeSwgQywgSWR4TGlzdCk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQ2FzdC9Db252ZXJzaW9uIE9wZXJhdG9ycworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBDb25zdGFudCAqQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6Q2FzdE9wcyBPcCwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldENhc3QoT3AsIEMsIERlc3RUeSk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlUG9pbnRlckNhc3QoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFBvaW50ZXJDYXN0KEMsIERlc3RUeSk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlUG9pbnRlckJpdENhc3RPckFkZHJTcGFjZUNhc3QoQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRQb2ludGVyQml0Q2FzdE9yQWRkclNwYWNlQ2FzdChDLCBEZXN0VHkpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUludENhc3QoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEludGVnZXJDYXN0KEMsIERlc3RUeSwgaXNTaWduZWQpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUZQQ2FzdChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0RlBDYXN0KEMsIERlc3RUeSk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlQml0Q2FzdChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgcmV0dXJuIENyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OkJpdENhc3QsIEMsIERlc3RUeSk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlSW50VG9QdHIoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpJbnRUb1B0ciwgQywgRGVzdFR5KTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVQdHJUb0ludChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgcmV0dXJuIENyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OlB0clRvSW50LCBDLCBEZXN0VHkpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZVpFeHRPckJpdENhc3QoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFpFeHRPckJpdENhc3QoQywgRGVzdFR5KTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVTRXh0T3JCaXRDYXN0KENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRTRXh0T3JCaXRDYXN0KEMsIERlc3RUeSk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlVHJ1bmNPckJpdENhc3QoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFRydW5jT3JCaXRDYXN0KEMsIERlc3RUeSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQ29tcGFyZSBJbnN0cnVjdGlvbnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgQ29uc3RhbnQgKkNyZWF0ZUlDbXAoQ21wSW5zdDo6UHJlZGljYXRlIFAsIENvbnN0YW50ICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRDb21wYXJlKFAsIExIUywgUkhTKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVGQ21wKENtcEluc3Q6OlByZWRpY2F0ZSBQLCBDb25zdGFudCAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0Q29tcGFyZShQLCBMSFMsIFJIUyk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gT3RoZXIgSW5zdHJ1Y3Rpb25zCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIENvbnN0YW50ICpDcmVhdGVTZWxlY3QoQ29uc3RhbnQgKkMsIENvbnN0YW50ICpUcnVlLCBDb25zdGFudCAqRmFsc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRTZWxlY3QoQywgVHJ1ZSwgRmFsc2UpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUV4dHJhY3RFbGVtZW50KENvbnN0YW50ICpWZWMsIENvbnN0YW50ICpJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRFeHRyYWN0RWxlbWVudChWZWMsIElkeCk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlSW5zZXJ0RWxlbWVudChDb25zdGFudCAqVmVjLCBDb25zdGFudCAqTmV3RWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0SW5zZXJ0RWxlbWVudChWZWMsIE5ld0VsdCwgSWR4KTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVTaHVmZmxlVmVjdG9yKENvbnN0YW50ICpWMSwgQ29uc3RhbnQgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqTWFzaykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFNodWZmbGVWZWN0b3IoVjEsIFYyLCBNYXNrKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVFeHRyYWN0VmFsdWUoQ29uc3RhbnQgKkFnZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gSWR4TGlzdCkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEV4dHJhY3RWYWx1ZShBZ2csIElkeExpc3QpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUluc2VydFZhbHVlKENvbnN0YW50ICpBZ2csIENvbnN0YW50ICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gSWR4TGlzdCkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEluc2VydFZhbHVlKEFnZywgVmFsLCBJZHhMaXN0KTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfQ09OU1RBTlRGT0xERVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Db25zdGFudFJhbmdlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0NvbnN0YW50UmFuZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODg5ZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Db25zdGFudFJhbmdlLmgKQEAgLTAsMCArMSwzNDYgQEAKKy8vPT09LSBDb25zdGFudFJhbmdlLmggLSBSZXByZXNlbnQgYSByYW5nZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gUmVwcmVzZW50IGEgcmFuZ2Ugb2YgcG9zc2libGUgdmFsdWVzIHRoYXQgbWF5IG9jY3VyIHdoZW4gdGhlIHByb2dyYW0gaXMgcnVuCisvLyBmb3IgYW4gaW50ZWdyYWwgdmFsdWUuICBUaGlzIGtlZXBzIHRyYWNrIG9mIGEgbG93ZXIgYW5kIHVwcGVyIGJvdW5kIGZvciB0aGUKKy8vIGNvbnN0YW50LCB3aGljaCBNQVkgd3JhcCBhcm91bmQgdGhlIGVuZCBvZiB0aGUgbnVtZXJpYyByYW5nZS4gIFRvIGRvIHRoaXMsIGl0CisvLyBrZWVwcyB0cmFjayBvZiBhIFtsb3dlciwgdXBwZXIpIGJvdW5kLCB3aGljaCBzcGVjaWZpZXMgYW4gaW50ZXJ2YWwganVzdCBsaWtlCisvLyBTVEwgaXRlcmF0b3JzLiAgV2hlbiB1c2VkIHdpdGggYm9vbGVhbiB2YWx1ZXMsIHRoZSBmb2xsb3dpbmcgYXJlIGltcG9ydGFudAorLy8gcmFuZ2VzOiA6CisvLworLy8gIFtGLCBGKSA9IHt9ICAgICA9IEVtcHR5IHNldAorLy8gIFtULCBGKSA9IHtUfQorLy8gIFtGLCBUKSA9IHtGfQorLy8gIFtULCBUKSA9IHtGLCBUfSA9IEZ1bGwgc2V0CisvLworLy8gVGhlIG90aGVyIGludGVncmFsIHJhbmdlcyB1c2UgbWluL21heCB2YWx1ZXMgZm9yIHNwZWNpYWwgcmFuZ2UgdmFsdWVzLiBGb3IKKy8vIGV4YW1wbGUsIGZvciA4LWJpdCB0eXBlcywgaXQgdXNlczoKKy8vIFswLCAwKSAgICAgPSB7fSAgICAgICA9IEVtcHR5IHNldAorLy8gWzI1NSwgMjU1KSA9IHswLi4yNTV9ID0gRnVsbCBTZXQKKy8vCisvLyBOb3RlIHRoYXQgQ29uc3RhbnRSYW5nZSBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgZWl0aGVyIHNpZ25lZCBvcgorLy8gdW5zaWduZWQgcmFuZ2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9DT05TVEFOVFJBTkdFX0gKKyNkZWZpbmUgTExWTV9JUl9DT05TVEFOVFJBTkdFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FQSW50LmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0clR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUROb2RlOworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSByYW5nZSBvZiB2YWx1ZXMuCitjbGFzcyBMTFZNX05PRElTQ0FSRCBDb25zdGFudFJhbmdlIHsKKyAgQVBJbnQgTG93ZXIsIFVwcGVyOworCitwdWJsaWM6CisgIC8vLyBJbml0aWFsaXplIGEgZnVsbCAodGhlIGRlZmF1bHQpIG9yIGVtcHR5IHNldCBmb3IgdGhlIHNwZWNpZmllZCBiaXQgd2lkdGguCisgIGV4cGxpY2l0IENvbnN0YW50UmFuZ2UodWludDMyX3QgQml0V2lkdGgsIGJvb2wgaXNGdWxsU2V0ID0gdHJ1ZSk7CisKKyAgLy8vIEluaXRpYWxpemUgYSByYW5nZSB0byBob2xkIHRoZSBzaW5nbGUgc3BlY2lmaWVkIHZhbHVlLgorICBDb25zdGFudFJhbmdlKEFQSW50IFZhbHVlKTsKKworICAvLy8gQGJyaWVmIEluaXRpYWxpemUgYSByYW5nZSBvZiB2YWx1ZXMgZXhwbGljaXRseS4gVGhpcyB3aWxsIGFzc2VydCBvdXQgaWYKKyAgLy8vIExvd2VyPT1VcHBlciBhbmQgTG93ZXIgIT0gTWluIG9yIE1heCB2YWx1ZSBmb3IgaXRzIHR5cGUuIEl0IHdpbGwgYWxzbworICAvLy8gYXNzZXJ0IG91dCBpZiB0aGUgdHdvIEFQSW50J3MgYXJlIG5vdCB0aGUgc2FtZSBiaXQgd2lkdGguCisgIENvbnN0YW50UmFuZ2UoQVBJbnQgTG93ZXIsIEFQSW50IFVwcGVyKTsKKworICAvLy8gUHJvZHVjZSB0aGUgc21hbGxlc3QgcmFuZ2Ugc3VjaCB0aGF0IGFsbCB2YWx1ZXMgdGhhdCBtYXkgc2F0aXNmeSB0aGUgZ2l2ZW4KKyAgLy8vIHByZWRpY2F0ZSB3aXRoIGFueSB2YWx1ZSBjb250YWluZWQgd2l0aGluIE90aGVyIGlzIGNvbnRhaW5lZCBpbiB0aGUKKyAgLy8vIHJldHVybmVkIHJhbmdlLiAgRm9ybWFsbHksIHRoaXMgcmV0dXJucyBhIHN1cGVyc2V0IG9mCisgIC8vLyAndW5pb24gb3ZlciBhbGwgeSBpbiBPdGhlciAuIHsgeCA6IGljbXAgb3AgeCB5IGlzIHRydWUgfScuICBJZiB0aGUgZXhhY3QKKyAgLy8vIGFuc3dlciBpcyBub3QgcmVwcmVzZW50YWJsZSBhcyBhIENvbnN0YW50UmFuZ2UsIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBhCisgIC8vLyBwcm9wZXIgc3VwZXJzZXQgb2YgdGhlIGFib3ZlLgorICAvLy8KKyAgLy8vIEV4YW1wbGU6IFByZWQgPSB1bHQgYW5kIE90aGVyID0gaTggWzIsIDUpIHJldHVybnMgUmVzdWx0ID0gWzAsIDQpCisgIHN0YXRpYyBDb25zdGFudFJhbmdlIG1ha2VBbGxvd2VkSUNtcFJlZ2lvbihDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyKTsKKworICAvLy8gUHJvZHVjZSB0aGUgbGFyZ2VzdCByYW5nZSBzdWNoIHRoYXQgYWxsIHZhbHVlcyBpbiB0aGUgcmV0dXJuZWQgcmFuZ2UKKyAgLy8vIHNhdGlzZnkgdGhlIGdpdmVuIHByZWRpY2F0ZSB3aXRoIGFsbCB2YWx1ZXMgY29udGFpbmVkIHdpdGhpbiBPdGhlci4KKyAgLy8vIEZvcm1hbGx5LCB0aGlzIHJldHVybnMgYSBzdWJzZXQgb2YKKyAgLy8vICdpbnRlcnNlY3Rpb24gb3ZlciBhbGwgeSBpbiBPdGhlciAuIHsgeCA6IGljbXAgb3AgeCB5IGlzIHRydWUgfScuICBJZiB0aGUKKyAgLy8vIGV4YWN0IGFuc3dlciBpcyBub3QgcmVwcmVzZW50YWJsZSBhcyBhIENvbnN0YW50UmFuZ2UsIHRoZSByZXR1cm4gdmFsdWUKKyAgLy8vIHdpbGwgYmUgYSBwcm9wZXIgc3Vic2V0IG9mIHRoZSBhYm92ZS4KKyAgLy8vCisgIC8vLyBFeGFtcGxlOiBQcmVkID0gdWx0IGFuZCBPdGhlciA9IGk4IFsyLCA1KSByZXR1cm5zIFswLCAyKQorICBzdGF0aWMgQ29uc3RhbnRSYW5nZSBtYWtlU2F0aXNmeWluZ0lDbXBSZWdpb24oQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25zdGFudFJhbmdlICZPdGhlcik7CisKKyAgLy8vIFByb2R1Y2UgdGhlIGV4YWN0IHJhbmdlIHN1Y2ggdGhhdCBhbGwgdmFsdWVzIGluIHRoZSByZXR1cm5lZCByYW5nZSBzYXRpc2Z5CisgIC8vLyB0aGUgZ2l2ZW4gcHJlZGljYXRlIHdpdGggYW55IHZhbHVlIGNvbnRhaW5lZCB3aXRoaW4gT3RoZXIuIEZvcm1hbGx5LCB0aGlzCisgIC8vLyByZXR1cm5zIHRoZSBleGFjdCBhbnN3ZXIgd2hlbiB0aGUgc3VwZXJzZXQgb2YgJ3VuaW9uIG92ZXIgYWxsIHkgaW4gT3RoZXIKKyAgLy8vIGlzIGV4YWN0bHkgc2FtZSBhcyB0aGUgc3Vic2V0IG9mIGludGVyc2VjdGlvbiBvdmVyIGFsbCB5IGluIE90aGVyLgorICAvLy8geyB4IDogaWNtcCBvcCB4IHkgaXMgdHJ1ZX0nLgorICAvLy8KKyAgLy8vIEV4YW1wbGU6IFByZWQgPSB1bHQgYW5kIE90aGVyID0gaTggMyByZXR1cm5zIFswLCAzKQorICBzdGF0aWMgQ29uc3RhbnRSYW5nZSBtYWtlRXhhY3RJQ21wUmVnaW9uKENtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQSW50ICZPdGhlcik7CisKKyAgLy8vIFJldHVybiB0aGUgbGFyZ2VzdCByYW5nZSBjb250YWluaW5nIGFsbCBYIHN1Y2ggdGhhdCAiWCBCaW5PcEMgWSIgaXMKKyAgLy8vIGd1YXJhbnRlZWQgbm90IHRvIHdyYXAgKG92ZXJmbG93KSBmb3IgYWxsIFkgaW4gT3RoZXIuCisgIC8vLworICAvLy8gTkIhIFRoZSByZXR1cm5lZCBzZXQgZG9lcyAqbm90KiBjb250YWluICoqYWxsKiogcG9zc2libGUgdmFsdWVzIG9mIFggZm9yCisgIC8vLyB3aGljaCAiWCBCaW5PcEMgWSIgZG9lcyBub3Qgd3JhcCAtLSBzb21lIHZpYWJsZSB2YWx1ZXMgb2YgWCBtYXkgYmUKKyAgLy8vIG1pc3NpbmcsIHNvIHlvdSBjYW5ub3QgdXNlIHRoaXMgdG8gY29uc3RyYWluIFgncyByYW5nZS4gIEUuZy4gaW4gdGhlCisgIC8vLyBmb3VydGggZXhhbXBsZSwgIigtMikgKyAxIiBpcyBib3RoIG5zdyBhbmQgbnV3IChzbyB0aGUgIlgiIGNvdWxkIGJlIC0yKSwKKyAgLy8vIGJ1dCAoLTIpIGlzIG5vdCBpbiB0aGUgc2V0IHJldHVybmVkLgorICAvLy8KKyAgLy8vIEV4YW1wbGVzOgorICAvLy8gIHR5cGVkZWYgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvciBPQk87CisgIC8vLyAgI2RlZmluZSBNR05SIG1ha2VHdWFyYW50ZWVkTm9XcmFwUmVnaW9uCisgIC8vLyAgTUdOUihBZGQsIFtpOCAxLCAyKSwgT0JPOjpOb1NpZ25lZFdyYXApID09IFstMTI4LCAxMjcpCisgIC8vLyAgTUdOUihBZGQsIFtpOCAxLCAyKSwgT0JPOjpOb1Vuc2lnbmVkV3JhcCkgPT0gWzAsIC0xKQorICAvLy8gIE1HTlIoQWRkLCBbaTggMCwgMSksIE9CTzo6Tm9VbnNpZ25lZFdyYXApID09IEZ1bGwgU2V0CisgIC8vLyAgTUdOUihBZGQsIFtpOCAxLCAyKSwgT0JPOjpOb1Vuc2lnbmVkV3JhcCB8IE9CTzo6Tm9TaWduZWRXcmFwKQorICAvLy8gICAgPT0gWzAsSU5UX01BWCkKKyAgLy8vICBNR05SKEFkZCwgW2k4IC0xLCA2KSwgT0JPOjpOb1NpZ25lZFdyYXApID09IFtJTlRfTUlOKzEsIElOVF9NQVgtNCkKKyAgLy8vICBNR05SKFN1YiwgW2k4IDEsIDIpLCBPQk86Ok5vU2lnbmVkV3JhcCkgPT0gWy0xMjcsIDEyOCkKKyAgLy8vICBNR05SKFN1YiwgW2k4IDEsIDIpLCBPQk86Ok5vVW5zaWduZWRXcmFwKSA9PSBbMSwgMCkKKyAgLy8vICBNR05SKFN1YiwgW2k4IDEsIDIpLCBPQk86Ok5vVW5zaWduZWRXcmFwIHwgT0JPOjpOb1NpZ25lZFdyYXApCisgIC8vLyAgICA9PSBbMSxJTlRfTUFYKQorICBzdGF0aWMgQ29uc3RhbnRSYW5nZSBtYWtlR3VhcmFudGVlZE5vV3JhcFJlZ2lvbihJbnN0cnVjdGlvbjo6QmluYXJ5T3BzIEJpbk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25zdGFudFJhbmdlICZPdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTm9XcmFwS2luZCk7CisKKyAgLy8vIFNldCB1cCBccCBQcmVkIGFuZCBccCBSSFMgc3VjaCB0aGF0CisgIC8vLyBDb25zdGFudFJhbmdlOjptYWtlRXhhY3RJQ21wUmVnaW9uKFByZWQsIFJIUykgPT0gKnRoaXMuICBSZXR1cm4gdHJ1ZSBpZgorICAvLy8gc3VjY2Vzc2Z1bC4KKyAgYm9vbCBnZXRFcXVpdmFsZW50SUNtcChDbXBJbnN0OjpQcmVkaWNhdGUgJlByZWQsIEFQSW50ICZSSFMpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIGxvd2VyIHZhbHVlIGZvciB0aGlzIHJhbmdlLgorICBjb25zdCBBUEludCAmZ2V0TG93ZXIoKSBjb25zdCB7IHJldHVybiBMb3dlcjsgfQorCisgIC8vLyBSZXR1cm4gdGhlIHVwcGVyIHZhbHVlIGZvciB0aGlzIHJhbmdlLgorICBjb25zdCBBUEludCAmZ2V0VXBwZXIoKSBjb25zdCB7IHJldHVybiBVcHBlcjsgfQorCisgIC8vLyBHZXQgdGhlIGJpdCB3aWR0aCBvZiB0aGlzIENvbnN0YW50UmFuZ2UuCisgIHVpbnQzMl90IGdldEJpdFdpZHRoKCkgY29uc3QgeyByZXR1cm4gTG93ZXIuZ2V0Qml0V2lkdGgoKTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNldCBjb250YWlucyBhbGwgb2YgdGhlIGVsZW1lbnRzIHBvc3NpYmxlCisgIC8vLyBmb3IgdGhpcyBkYXRhLXR5cGUuCisgIGJvb2wgaXNGdWxsU2V0KCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgc2V0IGNvbnRhaW5zIG5vIG1lbWJlcnMuCisgIGJvb2wgaXNFbXB0eVNldCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNldCB3cmFwcyBhcm91bmQgdGhlIHRvcCBvZiB0aGUgcmFuZ2UuCisgIC8vLyBGb3IgZXhhbXBsZTogWzEwMCwgOCkuCisgIGJvb2wgaXNXcmFwcGVkU2V0KCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgc2V0IHdyYXBzIGFyb3VuZCB0aGUgSU5UX01JTiBvZgorICAvLy8gaXRzIGJpdHdpZHRoLiBGb3IgZXhhbXBsZTogaTggWzEyMCwgMTQwKS4KKyAgYm9vbCBpc1NpZ25XcmFwcGVkU2V0KCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgaW4gdGhlIHNldC4KKyAgYm9vbCBjb250YWlucyhjb25zdCBBUEludCAmVmFsKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIG90aGVyIHJhbmdlIGlzIGEgc3Vic2V0IG9mIHRoaXMgb25lLgorICBib29sIGNvbnRhaW5zKGNvbnN0IENvbnN0YW50UmFuZ2UgJkNSKSBjb25zdDsKKworICAvLy8gSWYgdGhpcyBzZXQgY29udGFpbnMgYSBzaW5nbGUgZWxlbWVudCwgcmV0dXJuIGl0LCBvdGhlcndpc2UgcmV0dXJuIG51bGwuCisgIGNvbnN0IEFQSW50ICpnZXRTaW5nbGVFbGVtZW50KCkgY29uc3QgeworICAgIGlmIChVcHBlciA9PSBMb3dlciArIDEpCisgICAgICByZXR1cm4gJkxvd2VyOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIElmIHRoaXMgc2V0IGNvbnRhaW5zIGFsbCBidXQgYSBzaW5nbGUgZWxlbWVudCwgcmV0dXJuIGl0LCBvdGhlcndpc2UgcmV0dXJuCisgIC8vLyBudWxsLgorICBjb25zdCBBUEludCAqZ2V0U2luZ2xlTWlzc2luZ0VsZW1lbnQoKSBjb25zdCB7CisgICAgaWYgKExvd2VyID09IFVwcGVyICsgMSkKKyAgICAgIHJldHVybiAmVXBwZXI7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBzZXQgY29udGFpbnMgZXhhY3RseSBvbmUgbWVtYmVyLgorICBib29sIGlzU2luZ2xlRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIGdldFNpbmdsZUVsZW1lbnQoKSAhPSBudWxscHRyOyB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgc2V0LgorICBBUEludCBnZXRTZXRTaXplKCkgY29uc3Q7CisKKyAgLy8vIENvbXBhcmUgc2V0IHNpemUgb2YgdGhpcyByYW5nZSB3aXRoIHRoZSByYW5nZSBDUi4KKyAgYm9vbCBpc1NpemVTdHJpY3RseVNtYWxsZXJUaGFuKGNvbnN0IENvbnN0YW50UmFuZ2UgJkNSKSBjb25zdDsKKworICAvLyBDb21wYXJlIHNldCBzaXplIG9mIHRoaXMgcmFuZ2Ugd2l0aCBWYWx1ZS4KKyAgYm9vbCBpc1NpemVMYXJnZXJUaGFuKHVpbnQ2NF90IE1heFNpemUpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIGxhcmdlc3QgdW5zaWduZWQgdmFsdWUgY29udGFpbmVkIGluIHRoZSBDb25zdGFudFJhbmdlLgorICBBUEludCBnZXRVbnNpZ25lZE1heCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHNtYWxsZXN0IHVuc2lnbmVkIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgQ29uc3RhbnRSYW5nZS4KKyAgQVBJbnQgZ2V0VW5zaWduZWRNaW4oKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBsYXJnZXN0IHNpZ25lZCB2YWx1ZSBjb250YWluZWQgaW4gdGhlIENvbnN0YW50UmFuZ2UuCisgIEFQSW50IGdldFNpZ25lZE1heCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHNtYWxsZXN0IHNpZ25lZCB2YWx1ZSBjb250YWluZWQgaW4gdGhlIENvbnN0YW50UmFuZ2UuCisgIEFQSW50IGdldFNpZ25lZE1pbigpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJhbmdlIGlzIGVxdWFsIHRvIGFub3RoZXIgcmFuZ2UuCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDb25zdGFudFJhbmdlICZDUikgY29uc3QgeworICAgIHJldHVybiBMb3dlciA9PSBDUi5Mb3dlciAmJiBVcHBlciA9PSBDUi5VcHBlcjsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ29uc3RhbnRSYW5nZSAmQ1IpIGNvbnN0IHsKKyAgICByZXR1cm4gIW9wZXJhdG9yPT0oQ1IpOworICB9CisKKyAgLy8vIFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgY29uc3RhbnQgZnJvbSB0aGUgZW5kcG9pbnRzIG9mIHRoaXMgY29uc3RhbnQgcmFuZ2UuCisgIENvbnN0YW50UmFuZ2Ugc3VidHJhY3QoY29uc3QgQVBJbnQgJkNJKSBjb25zdDsKKworICAvLy8gU3VidHJhY3QgdGhlIHNwZWNpZmllZCByYW5nZSBmcm9tIHRoaXMgcmFuZ2UgKGFrYSByZWxhdGl2ZSBjb21wbGVtZW50IG9mCisgIC8vLyB0aGUgc2V0cykuCisgIENvbnN0YW50UmFuZ2UgZGlmZmVyZW5jZShjb25zdCBDb25zdGFudFJhbmdlICZDUikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgcmFuZ2UgdGhhdCByZXN1bHRzIGZyb20gdGhlIGludGVyc2VjdGlvbiBvZgorICAvLy8gdGhpcyByYW5nZSB3aXRoIGFub3RoZXIgcmFuZ2UuICBUaGUgcmVzdWx0YW50IHJhbmdlIGlzIGd1YXJhbnRlZWQgdG8KKyAgLy8vIGluY2x1ZGUgYWxsIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiBib3RoIGlucHV0IHJhbmdlcywgYW5kIHRvIGhhdmUgdGhlCisgIC8vLyBzbWFsbGVzdCBwb3NzaWJsZSBzZXQgc2l6ZSB0aGF0IGRvZXMgc28uICBCZWNhdXNlIHRoZXJlIG1heSBiZSB0d28KKyAgLy8vIGludGVyc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBzZXQgc2l6ZSwgQS5pbnRlcnNlY3RXaXRoKEIpIG1pZ2h0IG5vdAorICAvLy8gYmUgZXF1YWwgdG8gQi5pbnRlcnNlY3RXaXRoKEEpLgorICBDb25zdGFudFJhbmdlIGludGVyc2VjdFdpdGgoY29uc3QgQ29uc3RhbnRSYW5nZSAmQ1IpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHJhbmdlIHRoYXQgcmVzdWx0cyBmcm9tIHRoZSB1bmlvbiBvZiB0aGlzIHJhbmdlCisgIC8vLyB3aXRoIGFub3RoZXIgcmFuZ2UuICBUaGUgcmVzdWx0YW50IHJhbmdlIGlzIGd1YXJhbnRlZWQgdG8gaW5jbHVkZSB0aGUKKyAgLy8vIGVsZW1lbnRzIG9mIGJvdGggc2V0cywgYnV0IG1heSBjb250YWluIG1vcmUuICBGb3IgZXhhbXBsZSwgWzMsIDkpIHVuaW9uCisgIC8vLyBbMTIsMTUpIGlzIFszLCAxNSksIHdoaWNoIGluY2x1ZGVzIDksIDEwLCBhbmQgMTEsIHdoaWNoIHdlcmUgbm90IGluY2x1ZGVkCisgIC8vLyBpbiBlaXRoZXIgc2V0IGJlZm9yZS4KKyAgQ29uc3RhbnRSYW5nZSB1bmlvbldpdGgoY29uc3QgQ29uc3RhbnRSYW5nZSAmQ1IpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBuZXcgcmFuZ2UgcmVwcmVzZW50aW5nIHRoZSBwb3NzaWJsZSB2YWx1ZXMgcmVzdWx0aW5nCisgIC8vLyBmcm9tIGFuIGFwcGxpY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY2FzdCBvcGVyYXRvciB0byB0aGlzIHJhbmdlLiBccAorICAvLy8gQml0V2lkdGggaXMgdGhlIHRhcmdldCBiaXR3aWR0aCBvZiB0aGUgY2FzdC4gIEZvciBjYXN0cyB3aGljaCBkb24ndAorICAvLy8gY2hhbmdlIGJpdHdpZHRoLCBpdCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBzb3VyY2UgYml0d2lkdGguICBGb3IgY2FzdHMKKyAgLy8vIHdoaWNoIGRvIGNoYW5nZSBiaXR3aWR0aCwgdGhlIGJpdHdpZHRoIG11c3QgYmUgY29uc2lzdGVudCB3aXRoIHRoZQorICAvLy8gcmVxdWVzdGVkIGNhc3QgYW5kIHNvdXJjZSBiaXR3aWR0aC4KKyAgQ29uc3RhbnRSYW5nZSBjYXN0T3AoSW5zdHJ1Y3Rpb246OkNhc3RPcHMgQ2FzdE9wLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCaXRXaWR0aCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhIG5ldyByYW5nZSBpbiB0aGUgc3BlY2lmaWVkIGludGVnZXIgdHlwZSwgd2hpY2ggbXVzdAorICAvLy8gYmUgc3RyaWN0bHkgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgdHlwZS4gIFRoZSByZXR1cm5lZCByYW5nZSB3aWxsCisgIC8vLyBjb3JyZXNwb25kIHRvIHRoZSBwb3NzaWJsZSByYW5nZSBvZiB2YWx1ZXMgaWYgdGhlIHNvdXJjZSByYW5nZSBoYWQgYmVlbgorICAvLy8gemVybyBleHRlbmRlZCB0byBCaXRXaWR0aC4KKyAgQ29uc3RhbnRSYW5nZSB6ZXJvRXh0ZW5kKHVpbnQzMl90IEJpdFdpZHRoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgbmV3IHJhbmdlIGluIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB0eXBlLCB3aGljaCBtdXN0CisgIC8vLyBiZSBzdHJpY3RseSBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCB0eXBlLiAgVGhlIHJldHVybmVkIHJhbmdlIHdpbGwKKyAgLy8vIGNvcnJlc3BvbmQgdG8gdGhlIHBvc3NpYmxlIHJhbmdlIG9mIHZhbHVlcyBpZiB0aGUgc291cmNlIHJhbmdlIGhhZCBiZWVuCisgIC8vLyBzaWduIGV4dGVuZGVkIHRvIEJpdFdpZHRoLgorICBDb25zdGFudFJhbmdlIHNpZ25FeHRlbmQodWludDMyX3QgQml0V2lkdGgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBuZXcgcmFuZ2UgaW4gdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHR5cGUsIHdoaWNoIG11c3QgYmUKKyAgLy8vIHN0cmljdGx5IHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCB0eXBlLiAgVGhlIHJldHVybmVkIHJhbmdlIHdpbGwKKyAgLy8vIGNvcnJlc3BvbmQgdG8gdGhlIHBvc3NpYmxlIHJhbmdlIG9mIHZhbHVlcyBpZiB0aGUgc291cmNlIHJhbmdlIGhhZCBiZWVuCisgIC8vLyB0cnVuY2F0ZWQgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgorICBDb25zdGFudFJhbmdlIHRydW5jYXRlKHVpbnQzMl90IEJpdFdpZHRoKSBjb25zdDsKKworICAvLy8gTWFrZSB0aGlzIHJhbmdlIGhhdmUgdGhlIGJpdCB3aWR0aCBnaXZlbiBieSBccCBCaXRXaWR0aC4gVGhlCisgIC8vLyB2YWx1ZSBpcyB6ZXJvIGV4dGVuZGVkLCB0cnVuY2F0ZWQsIG9yIGxlZnQgYWxvbmUgdG8gbWFrZSBpdCB0aGF0IHdpZHRoLgorICBDb25zdGFudFJhbmdlIHpleHRPclRydW5jKHVpbnQzMl90IEJpdFdpZHRoKSBjb25zdDsKKworICAvLy8gTWFrZSB0aGlzIHJhbmdlIGhhdmUgdGhlIGJpdCB3aWR0aCBnaXZlbiBieSBccCBCaXRXaWR0aC4gVGhlCisgIC8vLyB2YWx1ZSBpcyBzaWduIGV4dGVuZGVkLCB0cnVuY2F0ZWQsIG9yIGxlZnQgYWxvbmUgdG8gbWFrZSBpdCB0aGF0IHdpZHRoLgorICBDb25zdGFudFJhbmdlIHNleHRPclRydW5jKHVpbnQzMl90IEJpdFdpZHRoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgbmV3IHJhbmdlIHJlcHJlc2VudGluZyB0aGUgcG9zc2libGUgdmFsdWVzIHJlc3VsdGluZworICAvLy8gZnJvbSBhbiBhcHBsaWNhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGJpbmFyeSBvcGVyYXRvciB0byBhbiBsZWZ0IGhhbmQgc2lkZQorICAvLy8gb2YgdGhpcyByYW5nZSBhbmQgYSByaWdodCBoYW5kIHNpZGUgb2YgXHAgT3RoZXIuCisgIENvbnN0YW50UmFuZ2UgYmluYXJ5T3AoSW5zdHJ1Y3Rpb246OkJpbmFyeU9wcyBCaW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25zdGFudFJhbmdlICZPdGhlcikgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhIG5ldyByYW5nZSByZXByZXNlbnRpbmcgdGhlIHBvc3NpYmxlIHZhbHVlcyByZXN1bHRpbmcKKyAgLy8vIGZyb20gYW4gYWRkaXRpb24gb2YgYSB2YWx1ZSBpbiB0aGlzIHJhbmdlIGFuZCBhIHZhbHVlIGluIFxwIE90aGVyLgorICBDb25zdGFudFJhbmdlIGFkZChjb25zdCBDb25zdGFudFJhbmdlICZPdGhlcikgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhIG5ldyByYW5nZSByZXByZXNlbnRpbmcgdGhlIHBvc3NpYmxlIHZhbHVlcyByZXN1bHRpbmcgZnJvbSBhCisgIC8vLyBrbm93biBOU1cgYWRkaXRpb24gb2YgYSB2YWx1ZSBpbiB0aGlzIHJhbmdlIGFuZCBccCBPdGhlciBjb25zdGFudC4KKyAgQ29uc3RhbnRSYW5nZSBhZGRXaXRoTm9TaWduZWRXcmFwKGNvbnN0IEFQSW50ICZPdGhlcikgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhIG5ldyByYW5nZSByZXByZXNlbnRpbmcgdGhlIHBvc3NpYmxlIHZhbHVlcyByZXN1bHRpbmcKKyAgLy8vIGZyb20gYSBzdWJ0cmFjdGlvbiBvZiBhIHZhbHVlIGluIHRoaXMgcmFuZ2UgYW5kIGEgdmFsdWUgaW4gXHAgT3RoZXIuCisgIENvbnN0YW50UmFuZ2Ugc3ViKGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgbmV3IHJhbmdlIHJlcHJlc2VudGluZyB0aGUgcG9zc2libGUgdmFsdWVzIHJlc3VsdGluZworICAvLy8gZnJvbSBhIG11bHRpcGxpY2F0aW9uIG9mIGEgdmFsdWUgaW4gdGhpcyByYW5nZSBhbmQgYSB2YWx1ZSBpbiBccCBPdGhlciwKKyAgLy8vIHRyZWF0aW5nIGJvdGggdGhpcyBhbmQgXHAgT3RoZXIgYXMgdW5zaWduZWQgcmFuZ2VzLgorICBDb25zdGFudFJhbmdlIG11bHRpcGx5KGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgbmV3IHJhbmdlIHJlcHJlc2VudGluZyB0aGUgcG9zc2libGUgdmFsdWVzIHJlc3VsdGluZworICAvLy8gZnJvbSBhIHNpZ25lZCBtYXhpbXVtIG9mIGEgdmFsdWUgaW4gdGhpcyByYW5nZSBhbmQgYSB2YWx1ZSBpbiBccCBPdGhlci4KKyAgQ29uc3RhbnRSYW5nZSBzbWF4KGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgbmV3IHJhbmdlIHJlcHJlc2VudGluZyB0aGUgcG9zc2libGUgdmFsdWVzIHJlc3VsdGluZworICAvLy8gZnJvbSBhbiB1bnNpZ25lZCBtYXhpbXVtIG9mIGEgdmFsdWUgaW4gdGhpcyByYW5nZSBhbmQgYSB2YWx1ZSBpbiBccCBPdGhlci4KKyAgQ29uc3RhbnRSYW5nZSB1bWF4KGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgbmV3IHJhbmdlIHJlcHJlc2VudGluZyB0aGUgcG9zc2libGUgdmFsdWVzIHJlc3VsdGluZworICAvLy8gZnJvbSBhIHNpZ25lZCBtaW5pbXVtIG9mIGEgdmFsdWUgaW4gdGhpcyByYW5nZSBhbmQgYSB2YWx1ZSBpbiBccCBPdGhlci4KKyAgQ29uc3RhbnRSYW5nZSBzbWluKGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgbmV3IHJhbmdlIHJlcHJlc2VudGluZyB0aGUgcG9zc2libGUgdmFsdWVzIHJlc3VsdGluZworICAvLy8gZnJvbSBhbiB1bnNpZ25lZCBtaW5pbXVtIG9mIGEgdmFsdWUgaW4gdGhpcyByYW5nZSBhbmQgYSB2YWx1ZSBpbiBccCBPdGhlci4KKyAgQ29uc3RhbnRSYW5nZSB1bWluKGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgbmV3IHJhbmdlIHJlcHJlc2VudGluZyB0aGUgcG9zc2libGUgdmFsdWVzIHJlc3VsdGluZworICAvLy8gZnJvbSBhbiB1bnNpZ25lZCBkaXZpc2lvbiBvZiBhIHZhbHVlIGluIHRoaXMgcmFuZ2UgYW5kIGEgdmFsdWUgaW4KKyAgLy8vIFxwIE90aGVyLgorICBDb25zdGFudFJhbmdlIHVkaXYoY29uc3QgQ29uc3RhbnRSYW5nZSAmT3RoZXIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBuZXcgcmFuZ2UgcmVwcmVzZW50aW5nIHRoZSBwb3NzaWJsZSB2YWx1ZXMgcmVzdWx0aW5nCisgIC8vLyBmcm9tIGEgYmluYXJ5LWFuZCBvZiBhIHZhbHVlIGluIHRoaXMgcmFuZ2UgYnkgYSB2YWx1ZSBpbiBccCBPdGhlci4KKyAgQ29uc3RhbnRSYW5nZSBiaW5hcnlBbmQoY29uc3QgQ29uc3RhbnRSYW5nZSAmT3RoZXIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBuZXcgcmFuZ2UgcmVwcmVzZW50aW5nIHRoZSBwb3NzaWJsZSB2YWx1ZXMgcmVzdWx0aW5nCisgIC8vLyBmcm9tIGEgYmluYXJ5LW9yIG9mIGEgdmFsdWUgaW4gdGhpcyByYW5nZSBieSBhIHZhbHVlIGluIFxwIE90aGVyLgorICBDb25zdGFudFJhbmdlIGJpbmFyeU9yKGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgbmV3IHJhbmdlIHJlcHJlc2VudGluZyB0aGUgcG9zc2libGUgdmFsdWVzIHJlc3VsdGluZworICAvLy8gZnJvbSBhIGxlZnQgc2hpZnQgb2YgYSB2YWx1ZSBpbiB0aGlzIHJhbmdlIGJ5IGEgdmFsdWUgaW4gXHAgT3RoZXIuCisgIC8vLyBUT0RPOiBUaGlzIGlzbid0IGZ1bGx5IGltcGxlbWVudGVkIHlldC4KKyAgQ29uc3RhbnRSYW5nZSBzaGwoY29uc3QgQ29uc3RhbnRSYW5nZSAmT3RoZXIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBuZXcgcmFuZ2UgcmVwcmVzZW50aW5nIHRoZSBwb3NzaWJsZSB2YWx1ZXMgcmVzdWx0aW5nIGZyb20gYQorICAvLy8gbG9naWNhbCByaWdodCBzaGlmdCBvZiBhIHZhbHVlIGluIHRoaXMgcmFuZ2UgYW5kIGEgdmFsdWUgaW4gXHAgT3RoZXIuCisgIENvbnN0YW50UmFuZ2UgbHNocihjb25zdCBDb25zdGFudFJhbmdlICZPdGhlcikgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhIG5ldyByYW5nZSByZXByZXNlbnRpbmcgdGhlIHBvc3NpYmxlIHZhbHVlcyByZXN1bHRpbmcgZnJvbSBhCisgIC8vLyBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IG9mIGEgdmFsdWUgaW4gdGhpcyByYW5nZSBhbmQgYSB2YWx1ZSBpbiBccCBPdGhlci4KKyAgQ29uc3RhbnRSYW5nZSBhc2hyKGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgbmV3IHJhbmdlIHRoYXQgaXMgdGhlIGxvZ2ljYWwgbm90IG9mIHRoZSBjdXJyZW50IHNldC4KKyAgQ29uc3RhbnRSYW5nZSBpbnZlcnNlKCkgY29uc3Q7CisKKyAgLy8vIFByaW50IG91dCB0aGUgYm91bmRzIHRvIGEgc3RyZWFtLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8vIEFsbG93IHByaW50aW5nIGZyb20gYSBkZWJ1Z2dlciBlYXNpbHkuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgQ29uc3RhbnRSYW5nZSAmQ1IpIHsKKyAgQ1IucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKKy8vLyBQYXJzZSBvdXQgYSBjb25zZXJ2YXRpdmUgQ29uc3RhbnRSYW5nZSBmcm9tICFyYW5nZSBtZXRhZGF0YS4KKy8vLworLy8vIEUuZy4gaWYgUmFuZ2VNRCBpcyAhe2kzMiAwLCBpMzIgMTAsIGkzMiAxNSwgaTMyIDIwfSB0aGVuIHJldHVybiBbMCwgMjApLgorQ29uc3RhbnRSYW5nZSBnZXRDb25zdGFudFJhbmdlRnJvbU1ldGFkYXRhKGNvbnN0IE1ETm9kZSAmUmFuZ2VNRCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0NPTlNUQU5UUkFOR0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Db25zdGFudHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQ29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE3NTk2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQ29uc3RhbnRzLmgKQEAgLTAsMCArMSwxMjk5IEBACisvLz09PS0tIGxsdm0vQ29uc3RhbnRzLmggLSBDb25zdGFudCBjbGFzcyBzdWJjbGFzcyBkZWZpbml0aW9ucyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBAZmlsZQorLy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIGZvciB0aGUgc3ViY2xhc3NlcyBvZiBDb25zdGFudCwKKy8vLyB3aGljaCByZXByZXNlbnQgdGhlIGRpZmZlcmVudCBmbGF2b3JzIG9mIGNvbnN0YW50IHZhbHVlcyB0aGF0IGxpdmUgaW4gTExWTS4KKy8vLyBOb3RlIHRoYXQgQ29uc3RhbnRzIGFyZSBpbW11dGFibGUgKG9uY2UgY3JlYXRlZCB0aGV5IG5ldmVyIGNoYW5nZSkgYW5kIGFyZQorLy8vIGZ1bGx5IHNoYXJlZCBieSBzdHJ1Y3R1cmFsIGVxdWl2YWxlbmNlLiAgVGhpcyBtZWFucyB0aGF0IHR3byBzdHJ1Y3R1cmFsbHkKKy8vLyBlcXVpdmFsZW50IGNvbnN0YW50cyB3aWxsIGFsd2F5cyBoYXZlIHRoZSBzYW1lIGFkZHJlc3MuICBDb25zdGFudHMgYXJlCisvLy8gY3JlYXRlZCBvbiBkZW1hbmQgYXMgbmVlZGVkIGFuZCBuZXZlciBkZWxldGVkOiB0aHVzIGNsaWVudHMgZG9uJ3QgaGF2ZSB0bworLy8vIHdvcnJ5IGFib3V0IHRoZSBsaWZldGltZSBvZiB0aGUgb2JqZWN0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfQ09OU1RBTlRTX0gKKyNkZWZpbmUgTExWTV9JUl9DT05TVEFOVFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBGbG9hdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FQSW50LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50LmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL09wZXJhbmRUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1VzZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFycmF5VHlwZTsKK2NsYXNzIEludGVnZXJUeXBlOworY2xhc3MgUG9pbnRlclR5cGU7CitjbGFzcyBTZXF1ZW50aWFsVHlwZTsKK2NsYXNzIFN0cnVjdFR5cGU7CitjbGFzcyBWZWN0b3JUeXBlOwordGVtcGxhdGUgPGNsYXNzIENvbnN0YW50Q2xhc3M+IHN0cnVjdCBDb25zdGFudEFnZ3JLZXlUeXBlOworCisvLy8gQmFzZSBjbGFzcyBmb3IgY29uc3RhbnRzIHdpdGggbm8gb3BlcmFuZHMuCisvLy8KKy8vLyBUaGVzZSBjb25zdGFudHMgaGF2ZSBubyBvcGVyYW5kczsgdGhleSByZXByZXNlbnQgdGhlaXIgZGF0YSBkaXJlY3RseS4KKy8vLyBTaW5jZSB0aGV5IGNhbiBiZSBpbiB1c2UgYnkgdW5yZWxhdGVkIG1vZHVsZXMgKGFuZCBhcmUgbmV2ZXIgYmFzZWQgb24KKy8vLyBHbG9iYWxWYWx1ZXMpLCBpdCBuZXZlciBtYWtlcyBzZW5zZSB0byBSQVVXIHRoZW0uCitjbGFzcyBDb25zdGFudERhdGEgOiBwdWJsaWMgQ29uc3RhbnQgeworICBmcmllbmQgY2xhc3MgQ29uc3RhbnQ7CisKKyAgVmFsdWUgKmhhbmRsZU9wZXJhbmRDaGFuZ2VJbXBsKFZhbHVlICpGcm9tLCBWYWx1ZSAqVG8pIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJDb25zdGFudCBkYXRhIGRvZXMgbm90IGhhdmUgb3BlcmFuZHMhIik7CisgIH0KKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBDb25zdGFudERhdGEoVHlwZSAqVHksIFZhbHVlVHkgVlQpIDogQ29uc3RhbnQoVHksIFZULCBudWxscHRyLCAwKSB7fQorCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeyByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDApOyB9CisKK3B1YmxpYzoKKyAgQ29uc3RhbnREYXRhKGNvbnN0IENvbnN0YW50RGF0YSAmKSA9IGRlbGV0ZTsKKworICAvLy8gTWV0aG9kcyB0byBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0LgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA+PSBDb25zdGFudERhdGFGaXJzdFZhbCAmJgorICAgICAgICAgICBWLT5nZXRWYWx1ZUlEKCkgPD0gQ29uc3RhbnREYXRhTGFzdFZhbDsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBUaGlzIGlzIHRoZSBzaGFyZWQgY2xhc3Mgb2YgYm9vbGVhbiBhbmQgaW50ZWdlciBjb25zdGFudHMuIFRoaXMgY2xhc3MKKy8vLyByZXByZXNlbnRzIGJvdGggYm9vbGVhbiBhbmQgaW50ZWdyYWwgY29uc3RhbnRzLgorLy8vIEBicmllZiBDbGFzcyBmb3IgY29uc3RhbnQgaW50ZWdlcnMuCitjbGFzcyBDb25zdGFudEludCBmaW5hbCA6IHB1YmxpYyBDb25zdGFudERhdGEgeworICBmcmllbmQgY2xhc3MgQ29uc3RhbnQ7CisKKyAgQVBJbnQgVmFsOworCisgIENvbnN0YW50SW50KEludGVnZXJUeXBlICpUeSwgY29uc3QgQVBJbnQmIFYpOworCisgIHZvaWQgZGVzdHJveUNvbnN0YW50SW1wbCgpOworCitwdWJsaWM6CisgIENvbnN0YW50SW50KGNvbnN0IENvbnN0YW50SW50ICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBDb25zdGFudEludCAqZ2V0VHJ1ZShMTFZNQ29udGV4dCAmQ29udGV4dCk7CisgIHN0YXRpYyBDb25zdGFudEludCAqZ2V0RmFsc2UoTExWTUNvbnRleHQgJkNvbnRleHQpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldFRydWUoVHlwZSAqVHkpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEZhbHNlKFR5cGUgKlR5KTsKKworICAvLy8gSWYgVHkgaXMgYSB2ZWN0b3IgdHlwZSwgcmV0dXJuIGEgQ29uc3RhbnQgd2l0aCBhIHNwbGF0IG9mIHRoZSBnaXZlbgorICAvLy8gdmFsdWUuIE90aGVyd2lzZSByZXR1cm4gYSBDb25zdGFudEludCBmb3IgdGhlIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgQ29uc3RhbnQgKmdldChUeXBlICpUeSwgdWludDY0X3QgViwgYm9vbCBpc1NpZ25lZCA9IGZhbHNlKTsKKworICAvLy8gUmV0dXJuIGEgQ29uc3RhbnRJbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHR5cGUuIElmIHRoZSB0eXBlIGlzIHdpZGVyIHRoYW4gNjQgYml0cywgdGhlIHZhbHVlIHdpbGwgYmUgemVyby1leHRlbmRlZAorICAvLy8gdG8gZml0IHRoZSB0eXBlLCB1bmxlc3MgaXNTaWduZWQgaXMgdHJ1ZSwgaW4gd2hpY2ggY2FzZSB0aGUgdmFsdWUgd2lsbAorICAvLy8gYmUgaW50ZXJwcmV0ZWQgYXMgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIgYW5kIHNpZ24tZXh0ZW5kZWQgdG8gZml0CisgIC8vLyB0aGUgdHlwZS4KKyAgLy8vIEBicmllZiBHZXQgYSBDb25zdGFudEludCBmb3IgYSBzcGVjaWZpYyB2YWx1ZS4KKyAgc3RhdGljIENvbnN0YW50SW50ICpnZXQoSW50ZWdlclR5cGUgKlR5LCB1aW50NjRfdCBWLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkID0gZmFsc2UpOworCisgIC8vLyBSZXR1cm4gYSBDb25zdGFudEludCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4gVGhlCisgIC8vLyB2YWx1ZSBWIHdpbGwgYmUgY2Fub25pY2FsaXplZCB0byBhIGFuIHVuc2lnbmVkIEFQSW50LiBBY2Nlc3NpbmcgaXQgd2l0aAorICAvLy8gZWl0aGVyIGdldFNFeHRWYWx1ZSgpIG9yIGdldFpFeHRWYWx1ZSgpIHdpbGwgeWllbGQgYSBjb3JyZWN0bHkgc2l6ZWQgYW5kCisgIC8vLyBzaWduZWQgdmFsdWUgZm9yIHRoZSB0eXBlIFR5LgorICAvLy8gQGJyaWVmIEdldCBhIENvbnN0YW50SW50IGZvciBhIHNwZWNpZmljIHNpZ25lZCB2YWx1ZS4KKyAgc3RhdGljIENvbnN0YW50SW50ICpnZXRTaWduZWQoSW50ZWdlclR5cGUgKlR5LCBpbnQ2NF90IFYpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldFNpZ25lZChUeXBlICpUeSwgaW50NjRfdCBWKTsKKworICAvLy8gUmV0dXJuIGEgQ29uc3RhbnRJbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCBhbiBpbXBsaWVkIFR5cGUuIFRoZQorICAvLy8gdHlwZSBpcyB0aGUgaW50ZWdlciB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGJpdCB3aWR0aCBvZiB0aGUgdmFsdWUuCisgIHN0YXRpYyBDb25zdGFudEludCAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBjb25zdCBBUEludCAmVik7CisKKyAgLy8vIFJldHVybiBhIENvbnN0YW50SW50IGNvbnN0cnVjdGVkIGZyb20gdGhlIHN0cmluZyBzdHJTdGFydCB3aXRoIHRoZSBnaXZlbgorICAvLy8gcmFkaXguCisgIHN0YXRpYyBDb25zdGFudEludCAqZ2V0KEludGVnZXJUeXBlICpUeSwgU3RyaW5nUmVmIFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByYWRpeCk7CisKKyAgLy8vIElmIFR5IGlzIGEgdmVjdG9yIHR5cGUsIHJldHVybiBhIENvbnN0YW50IHdpdGggYSBzcGxhdCBvZiB0aGUgZ2l2ZW4KKyAgLy8vIHZhbHVlLiBPdGhlcndpc2UgcmV0dXJuIGEgQ29uc3RhbnRJbnQgZm9yIHRoZSBnaXZlbiB2YWx1ZS4KKyAgc3RhdGljIENvbnN0YW50ICpnZXQoVHlwZSogVHksIGNvbnN0IEFQSW50JiBWKTsKKworICAvLy8gUmV0dXJuIHRoZSBjb25zdGFudCBhcyBhbiBBUEludCB2YWx1ZSByZWZlcmVuY2UuIFRoaXMgYWxsb3dzIGNsaWVudHMgdG8KKyAgLy8vIG9idGFpbiBhIGZ1bGwtcHJlY2lzaW9uIGNvcHkgb2YgdGhlIHZhbHVlLgorICAvLy8gQGJyaWVmIFJldHVybiB0aGUgY29uc3RhbnQncyB2YWx1ZS4KKyAgaW5saW5lIGNvbnN0IEFQSW50ICZnZXRWYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsOworICB9CisKKyAgLy8vIGdldEJpdFdpZHRoIC0gUmV0dXJuIHRoZSBiaXR3aWR0aCBvZiB0aGlzIGNvbnN0YW50LgorICB1bnNpZ25lZCBnZXRCaXRXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIFZhbC5nZXRCaXRXaWR0aCgpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgY29uc3RhbnQgYXMgYSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciB2YWx1ZSBhZnRlciBpdAorICAvLy8gaGFzIGJlZW4gemVybyBleHRlbmRlZCBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHR5cGUgb2YgdGhpcyBjb25zdGFudC4gTm90ZQorICAvLy8gdGhhdCB0aGlzIG1ldGhvZCBjYW4gYXNzZXJ0IGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBmaXQgaW4gNjQgYml0cy4KKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIHplcm8gZXh0ZW5kZWQgdmFsdWUuCisgIGlubGluZSB1aW50NjRfdCBnZXRaRXh0VmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbC5nZXRaRXh0VmFsdWUoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGNvbnN0YW50IGFzIGEgNjQtYml0IGludGVnZXIgdmFsdWUgYWZ0ZXIgaXQgaGFzIGJlZW4gc2lnbgorICAvLy8gZXh0ZW5kZWQgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSB0eXBlIG9mIHRoaXMgY29uc3RhbnQuIE5vdGUgdGhhdAorICAvLy8gdGhpcyBtZXRob2QgY2FuIGFzc2VydCBpZiB0aGUgdmFsdWUgZG9lcyBub3QgZml0IGluIDY0IGJpdHMuCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBzaWduIGV4dGVuZGVkIHZhbHVlLgorICBpbmxpbmUgaW50NjRfdCBnZXRTRXh0VmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbC5nZXRTRXh0VmFsdWUoKTsKKyAgfQorCisgIC8vLyBBIGhlbHBlciBtZXRob2QgdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbnN0YW50IGNvbnRhaW5lZAorICAvLy8gd2l0aGluIGlzIGVxdWFsIHRvIGEgY29uc3RhbnQuICBUaGlzIG9ubHkgd29ya3MgZm9yIHZlcnkgc21hbGwgdmFsdWVzLAorICAvLy8gYmVjYXVzZSB0aGlzIGlzIGFsbCB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCB3aXRoIGFsbCB0eXBlcy4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBjb25zdGFudCdzIHZhbHVlIGlzIHNhbWUgYXMgYW4gdW5zaWduZWQgY2hhci4KKyAgYm9vbCBlcXVhbHNJbnQodWludDY0X3QgVikgY29uc3QgeworICAgIHJldHVybiBWYWwgPT0gVjsKKyAgfQorCisgIC8vLyBnZXRUeXBlIC0gU3BlY2lhbGl6ZSB0aGUgZ2V0VHlwZSgpIG1ldGhvZCB0byBhbHdheXMgcmV0dXJuIGFuIEludGVnZXJUeXBlLAorICAvLy8gd2hpY2ggcmVkdWNlcyB0aGUgYW1vdW50IG9mIGNhc3RpbmcgbmVlZGVkIGluIHBhcnRzIG9mIHRoZSBjb21waWxlci4KKyAgLy8vCisgIGlubGluZSBJbnRlZ2VyVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxJbnRlZ2VyVHlwZT4oVmFsdWU6OmdldFR5cGUoKSk7CisgIH0KKworICAvLy8gVGhpcyBzdGF0aWMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBUeSBpcyBiaWcgZW5vdWdoIHRvCisgIC8vLyByZXByZXNlbnQgdGhlIHZhbHVlIFYuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXZvaWQgaGF2aW5nIHRoZSBnZXQgbWV0aG9kCisgIC8vLyBhc3NlcnQgd2hlbiBWIGlzIGxhcmdlciB0aGFuIFR5IGNhbiByZXByZXNlbnQuIE5vdGUgdGhhdCB0aGVyZSBhcmUgdHdvCisgIC8vLyB2ZXJzaW9ucyBvZiB0aGlzIG1ldGhvZCwgb25lIGZvciB1bnNpZ25lZCBhbmQgb25lIGZvciBzaWduZWQgaW50ZWdlcnMuCisgIC8vLyBBbHRob3VnaCBDb25zdGFudEludCBjYW5vbmljYWxpemVzIGV2ZXJ5dGhpbmcgdG8gYW4gdW5zaWduZWQgaW50ZWdlciwKKyAgLy8vIHRoZSBzaWduZWQgdmVyc2lvbiBhdm9pZHMgY2FsbGVycyBoYXZpbmcgdG8gY29udmVydCBhIHNpZ25lZCBxdWFudGl0eQorICAvLy8gdG8gdGhlIGFwcHJvcHJpYXRlIHVuc2lnbmVkIHR5cGUgYmVmb3JlIGNhbGxpbmcgdGhlIG1ldGhvZC4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgViBpcyBhIHZhbGlkIHZhbHVlIGZvciB0eXBlIFR5CisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBpcyBpbiByYW5nZSBmb3IgdGhlIGdpdmVuIHR5cGUuCisgIHN0YXRpYyBib29sIGlzVmFsdWVWYWxpZEZvclR5cGUoVHlwZSAqVHksIHVpbnQ2NF90IFYpOworICBzdGF0aWMgYm9vbCBpc1ZhbHVlVmFsaWRGb3JUeXBlKFR5cGUgKlR5LCBpbnQ2NF90IFYpOworCisgIGJvb2wgaXNOZWdhdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbC5pc05lZ2F0aXZlKCk7IH0KKworICAvLy8gVGhpcyBpcyBqdXN0IGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIG1ha2UgY2xpZW50IGNvZGUgc21hbGxlciBmb3IgYQorICAvLy8gY29tbW9uIGNvZGUuIEl0IGFsc28gY29ycmVjdGx5IHBlcmZvcm1zIHRoZSBjb21wYXJpc29uIHdpdGhvdXQgdGhlCisgIC8vLyBwb3RlbnRpYWwgZm9yIGFuIGFzc2VydGlvbiBmcm9tIGdldFpFeHRWYWx1ZSgpLgorICBib29sIGlzWmVybygpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsLmlzTnVsbFZhbHVlKCk7CisgIH0KKworICAvLy8gVGhpcyBpcyBqdXN0IGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIG1ha2UgY2xpZW50IGNvZGUgc21hbGxlciBmb3IgYQorICAvLy8gY29tbW9uIGNhc2UuIEl0IGFsc28gY29ycmVjdGx5IHBlcmZvcm1zIHRoZSBjb21wYXJpc29uIHdpdGhvdXQgdGhlCisgIC8vLyBwb3RlbnRpYWwgZm9yIGFuIGFzc2VydGlvbiBmcm9tIGdldFpFeHRWYWx1ZSgpLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgdmFsdWUgaXMgb25lLgorICBib29sIGlzT25lKCkgY29uc3QgeworICAgIHJldHVybiBWYWwuaXNPbmVWYWx1ZSgpOworICB9CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSBpZmYgZXZlcnkgYml0IGluIHRoaXMgY29uc3RhbnQgaXMgc2V0CisgIC8vLyB0byB0cnVlLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBjb25zdGFudCdzIGJpdHMgYXJlIGFsbCBzZXQgdG8gdHJ1ZS4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIHZhbHVlIGlzIGFsbCBvbmVzLgorICBib29sIGlzTWludXNPbmUoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbC5pc0FsbE9uZXNWYWx1ZSgpOworICB9CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSBpZmYgdGhpcyBjb25zdGFudCByZXByZXNlbnRzIHRoZSBsYXJnZXN0CisgIC8vLyB2YWx1ZSB0aGF0IG1heSBiZSByZXByZXNlbnRlZCBieSB0aGUgY29uc3RhbnQncyB0eXBlLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyB0aGUgbGFyZ2VzdCB2YWx1ZSB0aGF0IG1heSBiZSByZXByZXNlbnRlZAorICAvLy8gYnkgdGhpcyB0eXBlLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgdmFsdWUgaXMgbWF4aW1hbC4KKyAgYm9vbCBpc01heFZhbHVlKGJvb2wgaXNTaWduZWQpIGNvbnN0IHsKKyAgICBpZiAoaXNTaWduZWQpCisgICAgICByZXR1cm4gVmFsLmlzTWF4U2lnbmVkVmFsdWUoKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gVmFsLmlzTWF4VmFsdWUoKTsKKyAgfQorCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRydWUgaWZmIHRoaXMgY29uc3RhbnQgcmVwcmVzZW50cyB0aGUgc21hbGxlc3QKKyAgLy8vIHZhbHVlIHRoYXQgbWF5IGJlIHJlcHJlc2VudGVkIGJ5IHRoaXMgY29uc3RhbnQncyB0eXBlLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBzbWFsbGVzdCB2YWx1ZSB0aGF0IG1heSBiZSByZXByZXNlbnRlZCBieQorICAvLy8gdGhpcyB0eXBlLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgdmFsdWUgaXMgbWluaW1hbC4KKyAgYm9vbCBpc01pblZhbHVlKGJvb2wgaXNTaWduZWQpIGNvbnN0IHsKKyAgICBpZiAoaXNTaWduZWQpCisgICAgICByZXR1cm4gVmFsLmlzTWluU2lnbmVkVmFsdWUoKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gVmFsLmlzTWluVmFsdWUoKTsKKyAgfQorCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRydWUgaWZmIHRoaXMgY29uc3RhbnQgcmVwcmVzZW50cyBhIHZhbHVlIHdpdGgKKyAgLy8vIGFjdGl2ZSBiaXRzIGJpZ2dlciB0aGFuIDY0IGJpdHMgb3IgYSB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIHVpbnQ2NF90CisgIC8vLyB2YWx1ZS4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWZmIHRoaXMgY29uc3RhbnQgaXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyLgorICBib29sIHVnZSh1aW50NjRfdCBOdW0pIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsLnVnZShOdW0pOworICB9CisKKyAgLy8vIGdldExpbWl0ZWRWYWx1ZSAtIElmIHRoZSB2YWx1ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsaW1pdCwKKyAgLy8vIHJldHVybiBpdCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgbGltaXQgdmFsdWUuICBUaGlzIGNhdXNlcyB0aGUgdmFsdWUKKyAgLy8vIHRvIHNhdHVyYXRlIHRvIHRoZSBsaW1pdC4KKyAgLy8vIEByZXR1cm5zIHRoZSBtaW4gb2YgdGhlIHZhbHVlIG9mIHRoZSBjb25zdGFudCBhbmQgdGhlIHNwZWNpZmllZCB2YWx1ZQorICAvLy8gQGJyaWVmIEdldCB0aGUgY29uc3RhbnQncyB2YWx1ZSB3aXRoIGEgc2F0dXJhdGlvbiBsaW1pdAorICB1aW50NjRfdCBnZXRMaW1pdGVkVmFsdWUodWludDY0X3QgTGltaXQgPSB+MFVMTCkgY29uc3QgeworICAgIHJldHVybiBWYWwuZ2V0TGltaXRlZFZhbHVlKExpbWl0KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgTWV0aG9kcyB0byBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0LgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBDb25zdGFudEludFZhbDsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBDb25zdGFudEZQIC0gRmxvYXRpbmcgUG9pbnQgVmFsdWVzIFtmbG9hdCwgZG91YmxlXQorLy8vCitjbGFzcyBDb25zdGFudEZQIGZpbmFsIDogcHVibGljIENvbnN0YW50RGF0YSB7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudDsKKworICBBUEZsb2F0IFZhbDsKKworICBDb25zdGFudEZQKFR5cGUgKlR5LCBjb25zdCBBUEZsb2F0JiBWKTsKKworICB2b2lkIGRlc3Ryb3lDb25zdGFudEltcGwoKTsKKworcHVibGljOgorICBDb25zdGFudEZQKGNvbnN0IENvbnN0YW50RlAgJikgPSBkZWxldGU7CisKKyAgLy8vIEZsb2F0aW5nIHBvaW50IG5lZ2F0aW9uIG11c3QgYmUgaW1wbGVtZW50ZWQgd2l0aCBmKHgpID0gLTAuMCAtIHguIFRoaXMKKyAgLy8vIG1ldGhvZCByZXR1cm5zIHRoZSBuZWdhdGl2ZSB6ZXJvIGNvbnN0YW50IGZvciBmbG9hdGluZyBwb2ludCBvciB2ZWN0b3IKKyAgLy8vIGZsb2F0aW5nIHBvaW50IHR5cGVzOyBmb3IgYWxsIG90aGVyIHR5cGVzLCBpdCByZXR1cm5zIHRoZSBudWxsIHZhbHVlLgorICBzdGF0aWMgQ29uc3RhbnQgKmdldFplcm9WYWx1ZUZvck5lZ2F0aW9uKFR5cGUgKlR5KTsKKworICAvLy8gVGhpcyByZXR1cm5zIGEgQ29uc3RhbnRGUCwgb3IgYSB2ZWN0b3IgY29udGFpbmluZyBhIHNwbGF0IG9mIGEgQ29uc3RhbnRGUCwKKyAgLy8vIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlIGluIHRoZSBzcGVjaWZpZWQgdHlwZS4gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkCisgIC8vLyBmb3Igc2ltcGxlIGNvbnN0YW50IHZhbHVlcyBsaWtlIDIuMC8xLjAgZXRjLCB0aGF0IGFyZSBrbm93bi12YWxpZCBib3RoIGFzCisgIC8vLyBob3N0IGRvdWJsZSBhbmQgYXMgdGhlIHRhcmdldCBmb3JtYXQuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0KFR5cGUqIFR5LCBkb3VibGUgVik7CisKKyAgLy8vIElmIFR5IGlzIGEgdmVjdG9yIHR5cGUsIHJldHVybiBhIENvbnN0YW50IHdpdGggYSBzcGxhdCBvZiB0aGUgZ2l2ZW4KKyAgLy8vIHZhbHVlLiBPdGhlcndpc2UgcmV0dXJuIGEgQ29uc3RhbnRGUCBmb3IgdGhlIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgQ29uc3RhbnQgKmdldChUeXBlICpUeSwgY29uc3QgQVBGbG9hdCAmVik7CisKKyAgc3RhdGljIENvbnN0YW50ICpnZXQoVHlwZSogVHksIFN0cmluZ1JlZiBTdHIpOworICBzdGF0aWMgQ29uc3RhbnRGUCAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBjb25zdCBBUEZsb2F0ICZWKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXROYU4oVHlwZSAqVHksIGJvb2wgTmVnYXRpdmUgPSBmYWxzZSwgdW5zaWduZWQgdHlwZSA9IDApOworICBzdGF0aWMgQ29uc3RhbnQgKmdldE5lZ2F0aXZlWmVybyhUeXBlICpUeSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0SW5maW5pdHkoVHlwZSAqVHksIGJvb2wgTmVnYXRpdmUgPSBmYWxzZSk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIFR5IGlzIGJpZyBlbm91Z2ggdG8gcmVwcmVzZW50IFYuCisgIHN0YXRpYyBib29sIGlzVmFsdWVWYWxpZEZvclR5cGUoVHlwZSAqVHksIGNvbnN0IEFQRmxvYXQgJlYpOworICBpbmxpbmUgY29uc3QgQVBGbG9hdCAmZ2V0VmFsdWVBUEYoKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIHplcm8uCisgIGJvb2wgaXNaZXJvKCkgY29uc3QgeyByZXR1cm4gVmFsLmlzWmVybygpOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzaWduIGJpdCBpcyBzZXQuCisgIGJvb2wgaXNOZWdhdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbC5pc05lZ2F0aXZlKCk7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGluZmluaXR5CisgIGJvb2wgaXNJbmZpbml0eSgpIGNvbnN0IHsgcmV0dXJuIFZhbC5pc0luZmluaXR5KCk7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGEgTmFOLgorICBib29sIGlzTmFOKCkgY29uc3QgeyByZXR1cm4gVmFsLmlzTmFOKCk7IH0KKworICAvLy8gV2UgZG9uJ3QgcmVseSBvbiBvcGVyYXRvcj09IHdvcmtpbmcgb24gZG91YmxlIHZhbHVlcywgYXMgaXQgcmV0dXJucyB0cnVlCisgIC8vLyBmb3IgdGhpbmdzIHRoYXQgYXJlIGNsZWFybHkgbm90IGVxdWFsLCBsaWtlIC0wLjAgYW5kIDAuMC4KKyAgLy8vIEFzIHN1Y2gsIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGRvIGFuIGV4YWN0IGJpdC1mb3ItYml0IGNvbXBhcmlzb24gb2YKKyAgLy8vIHR3byBmbG9hdGluZyBwb2ludCB2YWx1ZXMuICBUaGUgdmVyc2lvbiB3aXRoIGEgZG91YmxlIG9wZXJhbmQgaXMgcmV0YWluZWQKKyAgLy8vIGJlY2F1c2UgaXQncyBzbyBjb252ZW5pZW50IHRvIHdyaXRlIGlzRXhhY3RseVZhbHVlKDIuMCksIGJ1dCBwbGVhc2UgdXNlCisgIC8vLyBpdCBvbmx5IGZvciBzaW1wbGUgY29uc3RhbnRzLgorICBib29sIGlzRXhhY3RseVZhbHVlKGNvbnN0IEFQRmxvYXQgJlYpIGNvbnN0OworCisgIGJvb2wgaXNFeGFjdGx5VmFsdWUoZG91YmxlIFYpIGNvbnN0IHsKKyAgICBib29sIGlnbm9yZWQ7CisgICAgQVBGbG9hdCBGVihWKTsKKyAgICBGVi5jb252ZXJ0KFZhbC5nZXRTZW1hbnRpY3MoKSwgQVBGbG9hdDo6cm1OZWFyZXN0VGllc1RvRXZlbiwgJmlnbm9yZWQpOworICAgIHJldHVybiBpc0V4YWN0bHlWYWx1ZShGVik7CisgIH0KKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gQ29uc3RhbnRGUFZhbDsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBBbGwgemVybyBhZ2dyZWdhdGUgdmFsdWUKKy8vLworY2xhc3MgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvIGZpbmFsIDogcHVibGljIENvbnN0YW50RGF0YSB7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudDsKKworICBleHBsaWNpdCBDb25zdGFudEFnZ3JlZ2F0ZVplcm8oVHlwZSAqVHkpCisgICAgICA6IENvbnN0YW50RGF0YShUeSwgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvVmFsKSB7fQorCisgIHZvaWQgZGVzdHJveUNvbnN0YW50SW1wbCgpOworCitwdWJsaWM6CisgIENvbnN0YW50QWdncmVnYXRlWmVybyhjb25zdCBDb25zdGFudEFnZ3JlZ2F0ZVplcm8gJikgPSBkZWxldGU7CisKKyAgc3RhdGljIENvbnN0YW50QWdncmVnYXRlWmVybyAqZ2V0KFR5cGUgKlR5KTsKKworICAvLy8gSWYgdGhpcyBDQVogaGFzIGFycmF5IG9yIHZlY3RvciB0eXBlLCByZXR1cm4gYSB6ZXJvIHdpdGggdGhlIHJpZ2h0IGVsZW1lbnQKKyAgLy8vIHR5cGUuCisgIENvbnN0YW50ICpnZXRTZXF1ZW50aWFsRWxlbWVudCgpIGNvbnN0OworCisgIC8vLyBJZiB0aGlzIENBWiBoYXMgc3RydWN0IHR5cGUsIHJldHVybiBhIHplcm8gd2l0aCB0aGUgcmlnaHQgZWxlbWVudCB0eXBlIGZvcgorICAvLy8gdGhlIHNwZWNpZmllZCBlbGVtZW50LgorICBDb25zdGFudCAqZ2V0U3RydWN0RWxlbWVudCh1bnNpZ25lZCBFbHQpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSB6ZXJvIG9mIHRoZSByaWdodCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBHRVAgaW5kZXggaWYgd2UgY2FuLAorICAvLy8gb3RoZXJ3aXNlIHJldHVybiBudWxsIChlLmcuIGlmIEMgaXMgYSBDb25zdGFudEV4cHIpLgorICBDb25zdGFudCAqZ2V0RWxlbWVudFZhbHVlKENvbnN0YW50ICpDKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgemVybyBvZiB0aGUgcmlnaHQgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgR0VQIGluZGV4LgorICBDb25zdGFudCAqZ2V0RWxlbWVudFZhbHVlKHVuc2lnbmVkIElkeCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheSwgdmVjdG9yLCBvciBzdHJ1Y3QuCisgIHVuc2lnbmVkIGdldE51bUVsZW1lbnRzKCkgY29uc3Q7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIC8vLworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBDb25zdGFudEFnZ3JlZ2F0ZVplcm9WYWw7CisgIH0KK307CisKKy8vLyBCYXNlIGNsYXNzIGZvciBhZ2dyZWdhdGUgY29uc3RhbnRzICh3aXRoIG9wZXJhbmRzKS4KKy8vLworLy8vIFRoZXNlIGNvbnN0YW50cyBhcmUgYWdncmVnYXRlcyBvZiBvdGhlciBjb25zdGFudHMsIHdoaWNoIGFyZSBzdG9yZWQgYXMKKy8vLyBvcGVyYW5kcy4KKy8vLworLy8vIFN1YmNsYXNzZXMgYXJlIFxhIENvbnN0YW50U3RydWN0LCBcYSBDb25zdGFudEFycmF5LCBhbmQgXGEKKy8vLyBDb25zdGFudFZlY3Rvci4KKy8vLworLy8vIFxub3RlIFNvbWUgc3ViY2xhc3NlcyBvZiBcYSBDb25zdGFudERhdGEgYXJlIHNlbWFudGljYWxseSBhZ2dyZWdhdGVzIC0tCisvLy8gc3VjaCBhcyBcYSBDb25zdGFudERhdGFBcnJheSAtLSBidXQgYXJlIG5vdCBzdWJjbGFzc2VzIG9mIHRoaXMgYmVjYXVzZSB0aGV5CisvLy8gdXNlIG9wZXJhbmRzLgorY2xhc3MgQ29uc3RhbnRBZ2dyZWdhdGUgOiBwdWJsaWMgQ29uc3RhbnQgeworcHJvdGVjdGVkOgorICBDb25zdGFudEFnZ3JlZ2F0ZShDb21wb3NpdGVUeXBlICpULCBWYWx1ZVR5IFZULCBBcnJheVJlZjxDb25zdGFudCAqPiBWKTsKKworcHVibGljOgorICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhDb25zdGFudCk7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID49IENvbnN0YW50QWdncmVnYXRlRmlyc3RWYWwgJiYKKyAgICAgICAgICAgVi0+Z2V0VmFsdWVJRCgpIDw9IENvbnN0YW50QWdncmVnYXRlTGFzdFZhbDsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPENvbnN0YW50QWdncmVnYXRlPgorICAgIDogcHVibGljIFZhcmlhZGljT3BlcmFuZFRyYWl0czxDb25zdGFudEFnZ3JlZ2F0ZT4ge307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhDb25zdGFudEFnZ3JlZ2F0ZSwgQ29uc3RhbnQpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQ29uc3RhbnRBcnJheSAtIENvbnN0YW50IEFycmF5IERlY2xhcmF0aW9ucworLy8vCitjbGFzcyBDb25zdGFudEFycmF5IGZpbmFsIDogcHVibGljIENvbnN0YW50QWdncmVnYXRlIHsKKyAgZnJpZW5kIHN0cnVjdCBDb25zdGFudEFnZ3JLZXlUeXBlPENvbnN0YW50QXJyYXk+OworICBmcmllbmQgY2xhc3MgQ29uc3RhbnQ7CisKKyAgQ29uc3RhbnRBcnJheShBcnJheVR5cGUgKlQsIEFycmF5UmVmPENvbnN0YW50ICo+IFZhbCk7CisKKyAgdm9pZCBkZXN0cm95Q29uc3RhbnRJbXBsKCk7CisgIFZhbHVlICpoYW5kbGVPcGVyYW5kQ2hhbmdlSW1wbChWYWx1ZSAqRnJvbSwgVmFsdWUgKlRvKTsKKworcHVibGljOgorICAvLyBDb25zdGFudEFycmF5IGFjY2Vzc29ycworICBzdGF0aWMgQ29uc3RhbnQgKmdldChBcnJheVR5cGUgKlQsIEFycmF5UmVmPENvbnN0YW50Kj4gVik7CisKK3ByaXZhdGU6CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0SW1wbChBcnJheVR5cGUgKlQsIEFycmF5UmVmPENvbnN0YW50ICo+IFYpOworCitwdWJsaWM6CisgIC8vLyBTcGVjaWFsaXplIHRoZSBnZXRUeXBlKCkgbWV0aG9kIHRvIGFsd2F5cyByZXR1cm4gYW4gQXJyYXlUeXBlLAorICAvLy8gd2hpY2ggcmVkdWNlcyB0aGUgYW1vdW50IG9mIGNhc3RpbmcgbmVlZGVkIGluIHBhcnRzIG9mIHRoZSBjb21waWxlci4KKyAgaW5saW5lIEFycmF5VHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxBcnJheVR5cGU+KFZhbHVlOjpnZXRUeXBlKCkpOworICB9CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IENvbnN0YW50QXJyYXlWYWw7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDb25zdGFudCBTdHJ1Y3QgRGVjbGFyYXRpb25zCisvLworY2xhc3MgQ29uc3RhbnRTdHJ1Y3QgZmluYWwgOiBwdWJsaWMgQ29uc3RhbnRBZ2dyZWdhdGUgeworICBmcmllbmQgc3RydWN0IENvbnN0YW50QWdncktleVR5cGU8Q29uc3RhbnRTdHJ1Y3Q+OworICBmcmllbmQgY2xhc3MgQ29uc3RhbnQ7CisKKyAgQ29uc3RhbnRTdHJ1Y3QoU3RydWN0VHlwZSAqVCwgQXJyYXlSZWY8Q29uc3RhbnQgKj4gVmFsKTsKKworICB2b2lkIGRlc3Ryb3lDb25zdGFudEltcGwoKTsKKyAgVmFsdWUgKmhhbmRsZU9wZXJhbmRDaGFuZ2VJbXBsKFZhbHVlICpGcm9tLCBWYWx1ZSAqVG8pOworCitwdWJsaWM6CisgIC8vIENvbnN0YW50U3RydWN0IGFjY2Vzc29ycworICBzdGF0aWMgQ29uc3RhbnQgKmdldChTdHJ1Y3RUeXBlICpULCBBcnJheVJlZjxDb25zdGFudCo+IFYpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBDc3RzPgorICBzdGF0aWMgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8YXJlX2Jhc2Vfb2Y8Q29uc3RhbnQsIENzdHMuLi4+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICo+Ojp0eXBlCisgIGdldChTdHJ1Y3RUeXBlICpULCBDc3RzICouLi4gVnMpIHsKKyAgICBTbWFsbFZlY3RvcjxDb25zdGFudCAqLCA4PiBWYWx1ZXMoe1ZzLi4ufSk7CisgICAgcmV0dXJuIGdldChULCBWYWx1ZXMpOworICB9CisKKyAgLy8vIFJldHVybiBhbiBhbm9ueW1vdXMgc3RydWN0IHRoYXQgaGFzIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMuCisgIC8vLyBJZiB0aGUgc3RydWN0IGlzIHBvc3NpYmx5IGVtcHR5LCB0aGVuIHlvdSBtdXN0IHNwZWNpZnkgYSBjb250ZXh0LgorICBzdGF0aWMgQ29uc3RhbnQgKmdldEFub24oQXJyYXlSZWY8Q29uc3RhbnQqPiBWLCBib29sIFBhY2tlZCA9IGZhbHNlKSB7CisgICAgcmV0dXJuIGdldChnZXRUeXBlRm9yRWxlbWVudHMoViwgUGFja2VkKSwgVik7CisgIH0KKyAgc3RhdGljIENvbnN0YW50ICpnZXRBbm9uKExMVk1Db250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDb25zdGFudCo+IFYsIGJvb2wgUGFja2VkID0gZmFsc2UpIHsKKyAgICByZXR1cm4gZ2V0KGdldFR5cGVGb3JFbGVtZW50cyhDdHgsIFYsIFBhY2tlZCksIFYpOworICB9CisKKyAgLy8vIFJldHVybiBhbiBhbm9ueW1vdXMgc3RydWN0IHR5cGUgdG8gdXNlIGZvciBhIGNvbnN0YW50IHdpdGggdGhlIHNwZWNpZmllZAorICAvLy8gc2V0IG9mIGVsZW1lbnRzLiBUaGUgbGlzdCBtdXN0IG5vdCBiZSBlbXB0eS4KKyAgc3RhdGljIFN0cnVjdFR5cGUgKmdldFR5cGVGb3JFbGVtZW50cyhBcnJheVJlZjxDb25zdGFudCo+IFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQYWNrZWQgPSBmYWxzZSk7CisgIC8vLyBUaGlzIHZlcnNpb24gb2YgdGhlIG1ldGhvZCBhbGxvd3MgYW4gZW1wdHkgbGlzdC4KKyAgc3RhdGljIFN0cnVjdFR5cGUgKmdldFR5cGVGb3JFbGVtZW50cyhMTFZNQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENvbnN0YW50Kj4gViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFBhY2tlZCA9IGZhbHNlKTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24gLSByZWR1Y2UgYW1vdW50IG9mIGNhc3RpbmcuCisgIGlubGluZSBTdHJ1Y3RUeXBlICpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PFN0cnVjdFR5cGU+KFZhbHVlOjpnZXRUeXBlKCkpOworICB9CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IENvbnN0YW50U3RydWN0VmFsOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIENvbnN0YW50IFZlY3RvciBEZWNsYXJhdGlvbnMKKy8vLworY2xhc3MgQ29uc3RhbnRWZWN0b3IgZmluYWwgOiBwdWJsaWMgQ29uc3RhbnRBZ2dyZWdhdGUgeworICBmcmllbmQgc3RydWN0IENvbnN0YW50QWdncktleVR5cGU8Q29uc3RhbnRWZWN0b3I+OworICBmcmllbmQgY2xhc3MgQ29uc3RhbnQ7CisKKyAgQ29uc3RhbnRWZWN0b3IoVmVjdG9yVHlwZSAqVCwgQXJyYXlSZWY8Q29uc3RhbnQgKj4gVmFsKTsKKworICB2b2lkIGRlc3Ryb3lDb25zdGFudEltcGwoKTsKKyAgVmFsdWUgKmhhbmRsZU9wZXJhbmRDaGFuZ2VJbXBsKFZhbHVlICpGcm9tLCBWYWx1ZSAqVG8pOworCitwdWJsaWM6CisgIC8vIENvbnN0YW50VmVjdG9yIGFjY2Vzc29ycworICBzdGF0aWMgQ29uc3RhbnQgKmdldChBcnJheVJlZjxDb25zdGFudCo+IFYpOworCitwcml2YXRlOgorICBzdGF0aWMgQ29uc3RhbnQgKmdldEltcGwoQXJyYXlSZWY8Q29uc3RhbnQgKj4gVik7CisKK3B1YmxpYzoKKyAgLy8vIFJldHVybiBhIENvbnN0YW50VmVjdG9yIHdpdGggdGhlIHNwZWNpZmllZCBjb25zdGFudCBpbiBlYWNoIGVsZW1lbnQuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0U3BsYXQodW5zaWduZWQgTnVtRWx0cywgQ29uc3RhbnQgKkVsdCk7CisKKyAgLy8vIFNwZWNpYWxpemUgdGhlIGdldFR5cGUoKSBtZXRob2QgdG8gYWx3YXlzIHJldHVybiBhIFZlY3RvclR5cGUsCisgIC8vLyB3aGljaCByZWR1Y2VzIHRoZSBhbW91bnQgb2YgY2FzdGluZyBuZWVkZWQgaW4gcGFydHMgb2YgdGhlIGNvbXBpbGVyLgorICBpbmxpbmUgVmVjdG9yVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxWZWN0b3JUeXBlPihWYWx1ZTo6Z2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBJZiB0aGlzIGlzIGEgc3BsYXQgY29uc3RhbnQsIG1lYW5pbmcgdGhhdCBhbGwgb2YgdGhlIGVsZW1lbnRzIGhhdmUgdGhlCisgIC8vLyBzYW1lIHZhbHVlLCByZXR1cm4gdGhhdCB2YWx1ZS4gT3RoZXJ3aXNlIHJldHVybiBOVUxMLgorICBDb25zdGFudCAqZ2V0U3BsYXRWYWx1ZSgpIGNvbnN0OworCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBDb25zdGFudFZlY3RvclZhbDsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBBIGNvbnN0YW50IHBvaW50ZXIgdmFsdWUgdGhhdCBwb2ludHMgdG8gbnVsbAorLy8vCitjbGFzcyBDb25zdGFudFBvaW50ZXJOdWxsIGZpbmFsIDogcHVibGljIENvbnN0YW50RGF0YSB7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudDsKKworICBleHBsaWNpdCBDb25zdGFudFBvaW50ZXJOdWxsKFBvaW50ZXJUeXBlICpUKQorICAgICAgOiBDb25zdGFudERhdGEoVCwgVmFsdWU6OkNvbnN0YW50UG9pbnRlck51bGxWYWwpIHt9CisKKyAgdm9pZCBkZXN0cm95Q29uc3RhbnRJbXBsKCk7CisKK3B1YmxpYzoKKyAgQ29uc3RhbnRQb2ludGVyTnVsbChjb25zdCBDb25zdGFudFBvaW50ZXJOdWxsICYpID0gZGVsZXRlOworCisgIC8vLyBTdGF0aWMgZmFjdG9yeSBtZXRob2RzIC0gUmV0dXJuIG9iamVjdHMgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZQorICBzdGF0aWMgQ29uc3RhbnRQb2ludGVyTnVsbCAqZ2V0KFBvaW50ZXJUeXBlICpUKTsKKworICAvLy8gU3BlY2lhbGl6ZSB0aGUgZ2V0VHlwZSgpIG1ldGhvZCB0byBhbHdheXMgcmV0dXJuIGFuIFBvaW50ZXJUeXBlLAorICAvLy8gd2hpY2ggcmVkdWNlcyB0aGUgYW1vdW50IG9mIGNhc3RpbmcgbmVlZGVkIGluIHBhcnRzIG9mIHRoZSBjb21waWxlci4KKyAgaW5saW5lIFBvaW50ZXJUeXBlICpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PFBvaW50ZXJUeXBlPihWYWx1ZTo6Z2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBDb25zdGFudFBvaW50ZXJOdWxsVmFsOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIENvbnN0YW50RGF0YVNlcXVlbnRpYWwgLSBBIHZlY3RvciBvciBhcnJheSBjb25zdGFudCB3aG9zZSBlbGVtZW50IHR5cGUgaXMgYQorLy8vIHNpbXBsZSAxLzIvNC84LWJ5dGUgaW50ZWdlciBvciBmbG9hdC9kb3VibGUsIGFuZCB3aG9zZSBlbGVtZW50cyBhcmUganVzdAorLy8vIHNpbXBsZSBkYXRhIHZhbHVlcyAoaS5lLiBDb25zdGFudEludC9Db25zdGFudEZQKS4gIFRoaXMgQ29uc3RhbnQgbm9kZSBoYXMgbm8KKy8vLyBvcGVyYW5kcyBiZWNhdXNlIGl0IHN0b3JlcyBhbGwgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBjb25zdGFudCBhcyBkZW5zZWx5CisvLy8gcGFja2VkIGRhdGEsIGluc3RlYWQgb2YgYXMgVmFsdWUqJ3MuCisvLy8KKy8vLyBUaGlzIGlzIHRoZSBjb21tb24gYmFzZSBjbGFzcyBvZiBDb25zdGFudERhdGFBcnJheSBhbmQgQ29uc3RhbnREYXRhVmVjdG9yLgorLy8vCitjbGFzcyBDb25zdGFudERhdGFTZXF1ZW50aWFsIDogcHVibGljIENvbnN0YW50RGF0YSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudDsKKworICAvLy8gQSBwb2ludGVyIHRvIHRoZSBieXRlcyB1bmRlcmx5aW5nIHRoaXMgY29uc3RhbnQgKHdoaWNoIGlzIG93bmVkIGJ5IHRoZQorICAvLy8gdW5pcXVpbmcgU3RyaW5nTWFwKS4KKyAgY29uc3QgY2hhciAqRGF0YUVsZW1lbnRzOworCisgIC8vLyBUaGlzIGZvcm1zIGEgbGluayBsaXN0IG9mIENvbnN0YW50RGF0YVNlcXVlbnRpYWwgbm9kZXMgdGhhdCBoYXZlCisgIC8vLyB0aGUgc2FtZSB2YWx1ZSBidXQgZGlmZmVyZW50IHR5cGUuICBGb3IgZXhhbXBsZSwgMCwwLDAsMSBjb3VsZCBiZSBhIDQKKyAgLy8vIGVsZW1lbnQgYXJyYXkgb2YgaTgsIG9yIGEgMS1lbGVtZW50IGFycmF5IG9mIGkzMi4gIFRoZXknbGwgYm90aCBlbmQgdXAgaW4KKyAgLy8vIHRoZSBzYW1lIFN0cmluZ01hcCBidWNrZXQsIGxpbmtlZCB1cC4KKyAgQ29uc3RhbnREYXRhU2VxdWVudGlhbCAqTmV4dDsKKworICB2b2lkIGRlc3Ryb3lDb25zdGFudEltcGwoKTsKKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBDb25zdGFudERhdGFTZXF1ZW50aWFsKFR5cGUgKnR5LCBWYWx1ZVR5IFZULCBjb25zdCBjaGFyICpEYXRhKQorICAgICAgOiBDb25zdGFudERhdGEodHksIFZUKSwgRGF0YUVsZW1lbnRzKERhdGEpLCBOZXh0KG51bGxwdHIpIHt9CisgIH5Db25zdGFudERhdGFTZXF1ZW50aWFsKCkgeyBkZWxldGUgTmV4dDsgfQorCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0SW1wbChTdHJpbmdSZWYgQnl0ZXMsIFR5cGUgKlR5KTsKKworcHVibGljOgorICBDb25zdGFudERhdGFTZXF1ZW50aWFsKGNvbnN0IENvbnN0YW50RGF0YVNlcXVlbnRpYWwgJikgPSBkZWxldGU7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGEgQ29uc3RhbnREYXRhU2VxdWVudGlhbCBjYW4gYmUgZm9ybWVkIHdpdGggYSB2ZWN0b3Igb3IKKyAgLy8vIGFycmF5IG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0eXBlLgorICAvLy8gQ29uc3RhbnREYXRhQXJyYXkgb25seSB3b3JrcyB3aXRoIG5vcm1hbCBmbG9hdCBhbmQgaW50IHR5cGVzIHRoYXQgYXJlCisgIC8vLyBzdG9yZWQgZGVuc2VseSBpbiBtZW1vcnksIG5vdCB3aXRoIHRoaW5ncyBsaWtlIGk0MiBvciB4ODZfZjgwLgorICBzdGF0aWMgYm9vbCBpc0VsZW1lbnRUeXBlQ29tcGF0aWJsZShUeXBlICpUeSk7CisKKyAgLy8vIElmIHRoaXMgaXMgYSBzZXF1ZW50aWFsIGNvbnRhaW5lciBvZiBpbnRlZ2VycyAob2YgYW55IHNpemUpLCByZXR1cm4gdGhlCisgIC8vLyBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgbG93IGJpdHMgb2YgYSB1aW50NjRfdC4KKyAgdWludDY0X3QgZ2V0RWxlbWVudEFzSW50ZWdlcih1bnNpZ25lZCBpKSBjb25zdDsKKworICAvLy8gSWYgdGhpcyBpcyBhIHNlcXVlbnRpYWwgY29udGFpbmVyIG9mIGludGVnZXJzIChvZiBhbnkgc2l6ZSksIHJldHVybiB0aGUKKyAgLy8vIHNwZWNpZmllZCBlbGVtZW50IGFzIGFuIEFQSW50LgorICBBUEludCBnZXRFbGVtZW50QXNBUEludCh1bnNpZ25lZCBpKSBjb25zdDsKKworICAvLy8gSWYgdGhpcyBpcyBhIHNlcXVlbnRpYWwgY29udGFpbmVyIG9mIGZsb2F0aW5nIHBvaW50IHR5cGUsIHJldHVybiB0aGUKKyAgLy8vIHNwZWNpZmllZCBlbGVtZW50IGFzIGFuIEFQRmxvYXQuCisgIEFQRmxvYXQgZ2V0RWxlbWVudEFzQVBGbG9hdCh1bnNpZ25lZCBpKSBjb25zdDsKKworICAvLy8gSWYgdGhpcyBpcyBhbiBzZXF1ZW50aWFsIGNvbnRhaW5lciBvZiBmbG9hdHMsIHJldHVybiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKKyAgLy8vIGFzIGEgZmxvYXQuCisgIGZsb2F0IGdldEVsZW1lbnRBc0Zsb2F0KHVuc2lnbmVkIGkpIGNvbnN0OworCisgIC8vLyBJZiB0aGlzIGlzIGFuIHNlcXVlbnRpYWwgY29udGFpbmVyIG9mIGRvdWJsZXMsIHJldHVybiB0aGUgc3BlY2lmaWVkCisgIC8vLyBlbGVtZW50IGFzIGEgZG91YmxlLgorICBkb3VibGUgZ2V0RWxlbWVudEFzRG91YmxlKHVuc2lnbmVkIGkpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBDb25zdGFudCBmb3IgYSBzcGVjaWZpZWQgaW5kZXgncyBlbGVtZW50LgorICAvLy8gTm90ZSB0aGF0IHRoaXMgaGFzIHRvIGNvbXB1dGUgYSBuZXcgY29uc3RhbnQgdG8gcmV0dXJuLCBzbyBpdCBpc24ndCBhcworICAvLy8gZWZmaWNpZW50IGFzIGdldEVsZW1lbnRBc0ludGVnZXIvRmxvYXQvRG91YmxlLgorICBDb25zdGFudCAqZ2V0RWxlbWVudEFzQ29uc3RhbnQodW5zaWduZWQgaSkgY29uc3Q7CisKKyAgLy8vIFNwZWNpYWxpemUgdGhlIGdldFR5cGUoKSBtZXRob2QgdG8gYWx3YXlzIHJldHVybiBhIFNlcXVlbnRpYWxUeXBlLCB3aGljaAorICAvLy8gcmVkdWNlcyB0aGUgYW1vdW50IG9mIGNhc3RpbmcgbmVlZGVkIGluIHBhcnRzIG9mIHRoZSBjb21waWxlci4KKyAgaW5saW5lIFNlcXVlbnRpYWxUeXBlICpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PFNlcXVlbnRpYWxUeXBlPihWYWx1ZTo6Z2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgYXJyYXkvdmVjdG9yLgorICBUeXBlICpnZXRFbGVtZW50VHlwZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkgb3IgdmVjdG9yLgorICB1bnNpZ25lZCBnZXROdW1FbGVtZW50cygpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHNpemUgKGluIGJ5dGVzKSBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5L3ZlY3Rvci4KKyAgLy8vIFRoZSBzaXplIG9mIHRoZSBlbGVtZW50cyBpcyBrbm93biB0byBiZSBhIG11bHRpcGxlIG9mIG9uZSBieXRlLgorICB1aW50NjRfdCBnZXRFbGVtZW50Qnl0ZVNpemUoKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYW4gYXJyYXkgb2YgXHAgQ2hhclNpemUgaW50ZWdlcnMuCisgIGJvb2wgaXNTdHJpbmcodW5zaWduZWQgQ2hhclNpemUgPSA4KSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBhcnJheSAiaXNTdHJpbmciLCBlbmRzIHdpdGggYSBudWxsIGJ5dGUsCisgIC8vLyBhbmQgZG9lcyBub3QgY29udGFpbnMgYW55IG90aGVyIG51bGwgYnl0ZXMuCisgIGJvb2wgaXNDU3RyaW5nKCkgY29uc3Q7CisKKyAgLy8vIElmIHRoaXMgYXJyYXkgaXMgaXNTdHJpbmcoKSwgdGhlbiB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBhcnJheSBhcyBhCisgIC8vLyBTdHJpbmdSZWYuIE90aGVyd2lzZSwgaXQgYXNzZXJ0cyBvdXQuCisgIFN0cmluZ1JlZiBnZXRBc1N0cmluZygpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNTdHJpbmcoKSAmJiAiTm90IGEgc3RyaW5nIik7CisgICAgcmV0dXJuIGdldFJhd0RhdGFWYWx1ZXMoKTsKKyAgfQorCisgIC8vLyBJZiB0aGlzIGFycmF5IGlzIGlzQ1N0cmluZygpLCB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGFycmF5ICh3aXRob3V0CisgIC8vLyB0aGUgdHJhaWxpbmcgbnVsbCBieXRlKSBhcyBhIFN0cmluZ1JlZi4gT3RoZXJ3aXNlLCBpdCBhc3NlcnRzIG91dC4KKyAgU3RyaW5nUmVmIGdldEFzQ1N0cmluZygpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNDU3RyaW5nKCkgJiYgIklzbid0IGEgQyBzdHJpbmciKTsKKyAgICBTdHJpbmdSZWYgU3RyID0gZ2V0QXNTdHJpbmcoKTsKKyAgICByZXR1cm4gU3RyLnN1YnN0cigwLCBTdHIuc2l6ZSgpLTEpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgcmF3LCB1bmRlcmx5aW5nLCBieXRlcyBvZiB0aGlzIGRhdGEuIE5vdGUgdGhhdCB0aGlzIGlzIGFuCisgIC8vLyBleHRyZW1lbHkgdHJpY2t5IHRoaW5nIHRvIHdvcmsgd2l0aCwgYXMgaXQgZXhwb3NlcyB0aGUgaG9zdCBlbmRpYW5uZXNzIG9mCisgIC8vLyB0aGUgZGF0YSBlbGVtZW50cy4KKyAgU3RyaW5nUmVmIGdldFJhd0RhdGFWYWx1ZXMoKSBjb25zdDsKKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gQ29uc3RhbnREYXRhQXJyYXlWYWwgfHwKKyAgICAgICAgICAgVi0+Z2V0VmFsdWVJRCgpID09IENvbnN0YW50RGF0YVZlY3RvclZhbDsKKyAgfQorCitwcml2YXRlOgorICBjb25zdCBjaGFyICpnZXRFbGVtZW50UG9pbnRlcih1bnNpZ25lZCBFbHQpIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBBbiBhcnJheSBjb25zdGFudCB3aG9zZSBlbGVtZW50IHR5cGUgaXMgYSBzaW1wbGUgMS8yLzQvOC1ieXRlIGludGVnZXIgb3IKKy8vLyBmbG9hdC9kb3VibGUsIGFuZCB3aG9zZSBlbGVtZW50cyBhcmUganVzdCBzaW1wbGUgZGF0YSB2YWx1ZXMKKy8vLyAoaS5lLiBDb25zdGFudEludC9Db25zdGFudEZQKS4gVGhpcyBDb25zdGFudCBub2RlIGhhcyBubyBvcGVyYW5kcyBiZWNhdXNlIGl0CisvLy8gc3RvcmVzIGFsbCBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGNvbnN0YW50IGFzIGRlbnNlbHkgcGFja2VkIGRhdGEsIGluc3RlYWQKKy8vLyBvZiBhcyBWYWx1ZSoncy4KK2NsYXNzIENvbnN0YW50RGF0YUFycmF5IGZpbmFsIDogcHVibGljIENvbnN0YW50RGF0YVNlcXVlbnRpYWwgeworICBmcmllbmQgY2xhc3MgQ29uc3RhbnREYXRhU2VxdWVudGlhbDsKKworICBleHBsaWNpdCBDb25zdGFudERhdGFBcnJheShUeXBlICp0eSwgY29uc3QgY2hhciAqRGF0YSkKKyAgICAgIDogQ29uc3RhbnREYXRhU2VxdWVudGlhbCh0eSwgQ29uc3RhbnREYXRhQXJyYXlWYWwsIERhdGEpIHt9CisKK3B1YmxpYzoKKyAgQ29uc3RhbnREYXRhQXJyYXkoY29uc3QgQ29uc3RhbnREYXRhQXJyYXkgJikgPSBkZWxldGU7CisKKyAgLy8vIGdldCgpIGNvbnN0cnVjdG9yIC0gUmV0dXJuIGEgY29uc3RhbnQgd2l0aCBhcnJheSB0eXBlIHdpdGggYW4gZWxlbWVudAorICAvLy8gY291bnQgYW5kIGVsZW1lbnQgdHlwZSBtYXRjaGluZyB0aGUgQXJyYXlSZWYgcGFzc2VkIGluLiAgTm90ZSB0aGF0IHRoaXMKKyAgLy8vIGNhbiByZXR1cm4gYSBDb25zdGFudEFnZ3JlZ2F0ZVplcm8gb2JqZWN0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudFR5PgorICBzdGF0aWMgQ29uc3RhbnQgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8RWxlbWVudFR5PiBFbHRzKSB7CisgICAgY29uc3QgY2hhciAqRGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihFbHRzLmRhdGEoKSk7CisgICAgVHlwZSAqVHkgPQorICAgICAgICBBcnJheVR5cGU6OmdldChUeXBlOjpnZXRTY2FsYXJUeTxFbGVtZW50VHk+KENvbnRleHQpLCBFbHRzLnNpemUoKSk7CisgICAgcmV0dXJuIGdldEltcGwoU3RyaW5nUmVmKERhdGEsIEVsdHMuc2l6ZSgpICogc2l6ZW9mKEVsZW1lbnRUeSkpLCBUeSk7CisgIH0KKworICAvLy8gZ2V0KCkgY29uc3RydWN0b3IgLSBBcnJheVR5IG5lZWRzIHRvIGJlIGNvbXBhdGlibGUgd2l0aAorICAvLy8gQXJyYXlSZWY8RWxlbWVudFR5Pi4gQ2FsbHMgZ2V0KExMVk1Db250ZXh0LCBBcnJheVJlZjxFbGVtZW50VHk+KS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFycmF5VHk+CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBBcnJheVR5ICZFbHRzKSB7CisgICAgcmV0dXJuIENvbnN0YW50RGF0YUFycmF5OjpnZXQoQ29udGV4dCwgbWFrZUFycmF5UmVmKEVsdHMpKTsKKyAgfQorCisgIC8vLyBnZXRGUCgpIGNvbnN0cnVjdG9ycyAtIFJldHVybiBhIGNvbnN0YW50IHdpdGggYXJyYXkgdHlwZSB3aXRoIGFuIGVsZW1lbnQKKyAgLy8vIGNvdW50IGFuZCBlbGVtZW50IHR5cGUgb2YgZmxvYXQgd2l0aCBwcmVjaXNpb24gbWF0Y2hpbmcgdGhlIG51bWJlciBvZgorICAvLy8gYml0cyBpbiB0aGUgQXJyYXlSZWYgcGFzc2VkIGluLiAoaS5lLiBoYWxmIGZvciAxNmJpdHMsIGZsb2F0IGZvciAzMmJpdHMsCisgIC8vLyBkb3VibGUgZm9yIDY0Yml0cykgTm90ZSB0aGF0IHRoaXMgY2FuIHJldHVybiBhIENvbnN0YW50QWdncmVnYXRlWmVybworICAvLy8gb2JqZWN0LgorICBzdGF0aWMgQ29uc3RhbnQgKmdldEZQKExMVk1Db250ZXh0ICZDb250ZXh0LCBBcnJheVJlZjx1aW50MTZfdD4gRWx0cyk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RlAoTExWTUNvbnRleHQgJkNvbnRleHQsIEFycmF5UmVmPHVpbnQzMl90PiBFbHRzKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRGUChMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8dWludDY0X3Q+IEVsdHMpOworCisgIC8vLyBUaGlzIG1ldGhvZCBjb25zdHJ1Y3RzIGEgQ0RTIGFuZCBpbml0aWFsaXplcyBpdCB3aXRoIGEgdGV4dCBzdHJpbmcuCisgIC8vLyBUaGUgZGVmYXVsdCBiZWhhdmlvciAoQWRkTnVsbD09dHJ1ZSkgY2F1c2VzIGEgbnVsbCB0ZXJtaW5hdG9yIHRvCisgIC8vLyBiZSBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkgKGluY3JlYXNpbmcgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGJ5CisgIC8vLyBvbmUgbW9yZSB0aGFuIHRoZSBTdHJpbmdSZWYgd291bGQgbm9ybWFsbHkgaW5kaWNhdGUuICBQYXNzIEFkZE51bGw9ZmFsc2UKKyAgLy8vIHRvIGRpc2FibGUgdGhpcyBiZWhhdmlvci4KKyAgc3RhdGljIENvbnN0YW50ICpnZXRTdHJpbmcoTExWTUNvbnRleHQgJkNvbnRleHQsIFN0cmluZ1JlZiBJbml0aWFsaXplciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBZGROdWxsID0gdHJ1ZSk7CisKKyAgLy8vIFNwZWNpYWxpemUgdGhlIGdldFR5cGUoKSBtZXRob2QgdG8gYWx3YXlzIHJldHVybiBhbiBBcnJheVR5cGUsCisgIC8vLyB3aGljaCByZWR1Y2VzIHRoZSBhbW91bnQgb2YgY2FzdGluZyBuZWVkZWQgaW4gcGFydHMgb2YgdGhlIGNvbXBpbGVyLgorICBpbmxpbmUgQXJyYXlUeXBlICpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PEFycmF5VHlwZT4oVmFsdWU6OmdldFR5cGUoKSk7CisgIH0KKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gQ29uc3RhbnREYXRhQXJyYXlWYWw7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQSB2ZWN0b3IgY29uc3RhbnQgd2hvc2UgZWxlbWVudCB0eXBlIGlzIGEgc2ltcGxlIDEvMi80LzgtYnl0ZSBpbnRlZ2VyIG9yCisvLy8gZmxvYXQvZG91YmxlLCBhbmQgd2hvc2UgZWxlbWVudHMgYXJlIGp1c3Qgc2ltcGxlIGRhdGEgdmFsdWVzCisvLy8gKGkuZS4gQ29uc3RhbnRJbnQvQ29uc3RhbnRGUCkuIFRoaXMgQ29uc3RhbnQgbm9kZSBoYXMgbm8gb3BlcmFuZHMgYmVjYXVzZSBpdAorLy8vIHN0b3JlcyBhbGwgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBjb25zdGFudCBhcyBkZW5zZWx5IHBhY2tlZCBkYXRhLCBpbnN0ZWFkCisvLy8gb2YgYXMgVmFsdWUqJ3MuCitjbGFzcyBDb25zdGFudERhdGFWZWN0b3IgZmluYWwgOiBwdWJsaWMgQ29uc3RhbnREYXRhU2VxdWVudGlhbCB7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudERhdGFTZXF1ZW50aWFsOworCisgIGV4cGxpY2l0IENvbnN0YW50RGF0YVZlY3RvcihUeXBlICp0eSwgY29uc3QgY2hhciAqRGF0YSkKKyAgICAgIDogQ29uc3RhbnREYXRhU2VxdWVudGlhbCh0eSwgQ29uc3RhbnREYXRhVmVjdG9yVmFsLCBEYXRhKSB7fQorCitwdWJsaWM6CisgIENvbnN0YW50RGF0YVZlY3Rvcihjb25zdCBDb25zdGFudERhdGFWZWN0b3IgJikgPSBkZWxldGU7CisKKyAgLy8vIGdldCgpIGNvbnN0cnVjdG9ycyAtIFJldHVybiBhIGNvbnN0YW50IHdpdGggdmVjdG9yIHR5cGUgd2l0aCBhbiBlbGVtZW50CisgIC8vLyBjb3VudCBhbmQgZWxlbWVudCB0eXBlIG1hdGNoaW5nIHRoZSBBcnJheVJlZiBwYXNzZWQgaW4uICBOb3RlIHRoYXQgdGhpcworICAvLy8gY2FuIHJldHVybiBhIENvbnN0YW50QWdncmVnYXRlWmVybyBvYmplY3QuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBBcnJheVJlZjx1aW50OF90PiBFbHRzKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIEFycmF5UmVmPHVpbnQxNl90PiBFbHRzKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIEFycmF5UmVmPHVpbnQzMl90PiBFbHRzKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIEFycmF5UmVmPHVpbnQ2NF90PiBFbHRzKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIEFycmF5UmVmPGZsb2F0PiBFbHRzKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIEFycmF5UmVmPGRvdWJsZT4gRWx0cyk7CisKKyAgLy8vIGdldEZQKCkgY29uc3RydWN0b3JzIC0gUmV0dXJuIGEgY29uc3RhbnQgd2l0aCB2ZWN0b3IgdHlwZSB3aXRoIGFuIGVsZW1lbnQKKyAgLy8vIGNvdW50IGFuZCBlbGVtZW50IHR5cGUgb2YgZmxvYXQgd2l0aCB0aGUgcHJlY2lzaW9uIG1hdGNoaW5nIHRoZSBudW1iZXIgb2YKKyAgLy8vIGJpdHMgaW4gdGhlIEFycmF5UmVmIHBhc3NlZCBpbi4gIChpLmUuIGhhbGYgZm9yIDE2Yml0cywgZmxvYXQgZm9yIDMyYml0cywKKyAgLy8vIGRvdWJsZSBmb3IgNjRiaXRzKSBOb3RlIHRoYXQgdGhpcyBjYW4gcmV0dXJuIGEgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvCisgIC8vLyBvYmplY3QuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RlAoTExWTUNvbnRleHQgJkNvbnRleHQsIEFycmF5UmVmPHVpbnQxNl90PiBFbHRzKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRGUChMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8dWludDMyX3Q+IEVsdHMpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEZQKExMVk1Db250ZXh0ICZDb250ZXh0LCBBcnJheVJlZjx1aW50NjRfdD4gRWx0cyk7CisKKyAgLy8vIFJldHVybiBhIENvbnN0YW50VmVjdG9yIHdpdGggdGhlIHNwZWNpZmllZCBjb25zdGFudCBpbiBlYWNoIGVsZW1lbnQuCisgIC8vLyBUaGUgc3BlY2lmaWVkIGNvbnN0YW50IGhhcyB0byBiZSBhIG9mIGEgY29tcGF0aWJsZSB0eXBlIChpOC9pMTYvCisgIC8vLyBpMzIvaTY0L2Zsb2F0L2RvdWJsZSkgYW5kIG11c3QgYmUgYSBDb25zdGFudEZQIG9yIENvbnN0YW50SW50LgorICBzdGF0aWMgQ29uc3RhbnQgKmdldFNwbGF0KHVuc2lnbmVkIE51bUVsdHMsIENvbnN0YW50ICpFbHQpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHNwbGF0IGNvbnN0YW50LCBtZWFuaW5nIHRoYXQgYWxsIGVsZW1lbnRzIGhhdmUKKyAgLy8vIHRoZSBzYW1lIHZhbHVlLgorICBib29sIGlzU3BsYXQoKSBjb25zdDsKKworICAvLy8gSWYgdGhpcyBpcyBhIHNwbGF0IGNvbnN0YW50LCBtZWFuaW5nIHRoYXQgYWxsIG9mIHRoZSBlbGVtZW50cyBoYXZlIHRoZQorICAvLy8gc2FtZSB2YWx1ZSwgcmV0dXJuIHRoYXQgdmFsdWUuIE90aGVyd2lzZSByZXR1cm4gTlVMTC4KKyAgQ29uc3RhbnQgKmdldFNwbGF0VmFsdWUoKSBjb25zdDsKKworICAvLy8gU3BlY2lhbGl6ZSB0aGUgZ2V0VHlwZSgpIG1ldGhvZCB0byBhbHdheXMgcmV0dXJuIGEgVmVjdG9yVHlwZSwKKyAgLy8vIHdoaWNoIHJlZHVjZXMgdGhlIGFtb3VudCBvZiBjYXN0aW5nIG5lZWRlZCBpbiBwYXJ0cyBvZiB0aGUgY29tcGlsZXIuCisgIGlubGluZSBWZWN0b3JUeXBlICpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PFZlY3RvclR5cGU+KFZhbHVlOjpnZXRUeXBlKCkpOworICB9CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IENvbnN0YW50RGF0YVZlY3RvclZhbDsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBBIGNvbnN0YW50IHRva2VuIHdoaWNoIGlzIGVtcHR5CisvLy8KK2NsYXNzIENvbnN0YW50VG9rZW5Ob25lIGZpbmFsIDogcHVibGljIENvbnN0YW50RGF0YSB7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudDsKKworICBleHBsaWNpdCBDb25zdGFudFRva2VuTm9uZShMTFZNQ29udGV4dCAmQ29udGV4dCkKKyAgICAgIDogQ29uc3RhbnREYXRhKFR5cGU6OmdldFRva2VuVHkoQ29udGV4dCksIENvbnN0YW50VG9rZW5Ob25lVmFsKSB7fQorCisgIHZvaWQgZGVzdHJveUNvbnN0YW50SW1wbCgpOworCitwdWJsaWM6CisgIENvbnN0YW50VG9rZW5Ob25lKGNvbnN0IENvbnN0YW50VG9rZW5Ob25lICYpID0gZGVsZXRlOworCisgIC8vLyBSZXR1cm4gdGhlIENvbnN0YW50VG9rZW5Ob25lLgorICBzdGF0aWMgQ29uc3RhbnRUb2tlbk5vbmUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCk7CisKKyAgLy8vIEBicmllZiBNZXRob2RzIHRvIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3QuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IENvbnN0YW50VG9rZW5Ob25lVmFsOworICB9Cit9OworCisvLy8gVGhlIGFkZHJlc3Mgb2YgYSBiYXNpYyBibG9jay4KKy8vLworY2xhc3MgQmxvY2tBZGRyZXNzIGZpbmFsIDogcHVibGljIENvbnN0YW50IHsKKyAgZnJpZW5kIGNsYXNzIENvbnN0YW50OworCisgIEJsb2NrQWRkcmVzcyhGdW5jdGlvbiAqRiwgQmFzaWNCbG9jayAqQkIpOworCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeyByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDIpOyB9CisKKyAgdm9pZCBkZXN0cm95Q29uc3RhbnRJbXBsKCk7CisgIFZhbHVlICpoYW5kbGVPcGVyYW5kQ2hhbmdlSW1wbChWYWx1ZSAqRnJvbSwgVmFsdWUgKlRvKTsKKworcHVibGljOgorICAvLy8gUmV0dXJuIGEgQmxvY2tBZGRyZXNzIGZvciB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGFuZCBiYXNpYyBibG9jay4KKyAgc3RhdGljIEJsb2NrQWRkcmVzcyAqZ2V0KEZ1bmN0aW9uICpGLCBCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIFJldHVybiBhIEJsb2NrQWRkcmVzcyBmb3IgdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jay4gIFRoZSBiYXNpYworICAvLy8gYmxvY2sgbXVzdCBiZSBlbWJlZGRlZCBpbnRvIGEgZnVuY3Rpb24uCisgIHN0YXRpYyBCbG9ja0FkZHJlc3MgKmdldChCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIExvb2t1cCBhbiBleGlzdGluZyBcYyBCbG9ja0FkZHJlc3MgY29uc3RhbnQgZm9yIHRoZSBnaXZlbiBCYXNpY0Jsb2NrLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIDAgaWYgXGMgIUJCLT5oYXNBZGRyZXNzVGFrZW4oKSwgb3RoZXJ3aXNlIHRoZSBcYyBCbG9ja0FkZHJlc3MuCisgIHN0YXRpYyBCbG9ja0FkZHJlc3MgKmxvb2t1cChjb25zdCBCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIFRyYW5zcGFyZW50bHkgcHJvdmlkZSBtb3JlIGVmZmljaWVudCBnZXRPcGVyYW5kIG1ldGhvZHMuCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIEZ1bmN0aW9uICpnZXRGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIChGdW5jdGlvbiopT3A8MD4oKS5nZXQoKTsgfQorICBCYXNpY0Jsb2NrICpnZXRCYXNpY0Jsb2NrKCkgY29uc3QgeyByZXR1cm4gKEJhc2ljQmxvY2sqKU9wPDE+KCkuZ2V0KCk7IH0KKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gQmxvY2tBZGRyZXNzVmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8QmxvY2tBZGRyZXNzPiA6CisgIHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8QmxvY2tBZGRyZXNzLCAyPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoQmxvY2tBZGRyZXNzLCBWYWx1ZSkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBBIGNvbnN0YW50IHZhbHVlIHRoYXQgaXMgaW5pdGlhbGl6ZWQgd2l0aCBhbiBleHByZXNzaW9uIHVzaW5nCisvLy8gb3RoZXIgY29uc3RhbnQgdmFsdWVzLgorLy8vCisvLy8gVGhpcyBjbGFzcyB1c2VzIHRoZSBzdGFuZGFyZCBJbnN0cnVjdGlvbiBvcGNvZGVzIHRvIGRlZmluZSB0aGUgdmFyaW91cworLy8vIGNvbnN0YW50IGV4cHJlc3Npb25zLiAgVGhlIE9wY29kZSBmaWVsZCBmb3IgdGhlIENvbnN0YW50RXhwciBjbGFzcyBpcworLy8vIG1haW50YWluZWQgaW4gdGhlIFZhbHVlOjpTdWJjbGFzc0RhdGEgZmllbGQuCitjbGFzcyBDb25zdGFudEV4cHIgOiBwdWJsaWMgQ29uc3RhbnQgeworICBmcmllbmQgc3RydWN0IENvbnN0YW50RXhwcktleVR5cGU7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudDsKKworICB2b2lkIGRlc3Ryb3lDb25zdGFudEltcGwoKTsKKyAgVmFsdWUgKmhhbmRsZU9wZXJhbmRDaGFuZ2VJbXBsKFZhbHVlICpGcm9tLCBWYWx1ZSAqVG8pOworCitwcm90ZWN0ZWQ6CisgIENvbnN0YW50RXhwcihUeXBlICp0eSwgdW5zaWduZWQgT3Bjb2RlLCBVc2UgKk9wcywgdW5zaWduZWQgTnVtT3BzKQorICAgICAgOiBDb25zdGFudCh0eSwgQ29uc3RhbnRFeHByVmFsLCBPcHMsIE51bU9wcykgeworICAgIC8vIE9wZXJhdGlvbiB0eXBlIChhbiBJbnN0cnVjdGlvbiBvcGNvZGUpIGlzIHN0b3JlZCBhcyB0aGUgU3ViY2xhc3NEYXRhLgorICAgIHNldFZhbHVlU3ViY2xhc3NEYXRhKE9wY29kZSk7CisgIH0KKworcHVibGljOgorICAvLyBTdGF0aWMgbWV0aG9kcyB0byBjb25zdHJ1Y3QgYSBDb25zdGFudEV4cHIgb2YgZGlmZmVyZW50IGtpbmRzLiAgTm90ZSB0aGF0CisgIC8vIHRoZXNlIG1ldGhvZHMgbWF5IHJldHVybiBhIG9iamVjdCB0aGF0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUKKyAgLy8gQ29uc3RhbnRFeHByIGNsYXNzLCBiZWNhdXNlIHRoZXkgd2lsbCBhdHRlbXB0IHRvIGZvbGQgdGhlIGNvbnN0YW50CisgIC8vIGV4cHJlc3Npb24gaW50byBzb21ldGhpbmcgc2ltcGxlciBpZiBwb3NzaWJsZS4KKworICAvLy8gZ2V0QWxpZ25PZiBjb25zdGFudCBleHByIC0gY29tcHV0ZXMgdGhlIGFsaWdubWVudCBvZiBhIHR5cGUgaW4gYSB0YXJnZXQKKyAgLy8vIGluZGVwZW5kZW50IHdheSAoTm90ZTogdGhlIHJldHVybiB0eXBlIGlzIGFuIGk2NCkuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0QWxpZ25PZihUeXBlICpUeSk7CisKKyAgLy8vIGdldFNpemVPZiBjb25zdGFudCBleHByIC0gY29tcHV0ZXMgdGhlIChhbGxvYykgc2l6ZSBvZiBhIHR5cGUgKGluCisgIC8vLyBhZGRyZXNzLXVuaXRzLCBub3QgYml0cykgaW4gYSB0YXJnZXQgaW5kZXBlbmRlbnQgd2F5IChOb3RlOiB0aGUgcmV0dXJuCisgIC8vLyB0eXBlIGlzIGFuIGk2NCkuCisgIC8vLworICBzdGF0aWMgQ29uc3RhbnQgKmdldFNpemVPZihUeXBlICpUeSk7CisKKyAgLy8vIGdldE9mZnNldE9mIGNvbnN0YW50IGV4cHIgLSBjb21wdXRlcyB0aGUgb2Zmc2V0IG9mIGEgc3RydWN0IGZpZWxkIGluIGEKKyAgLy8vIHRhcmdldCBpbmRlcGVuZGVudCB3YXkgKE5vdGU6IHRoZSByZXR1cm4gdHlwZSBpcyBhbiBpNjQpLgorICAvLy8KKyAgc3RhdGljIENvbnN0YW50ICpnZXRPZmZzZXRPZihTdHJ1Y3RUeXBlICpTVHksIHVuc2lnbmVkIEZpZWxkTm8pOworCisgIC8vLyBnZXRPZmZzZXRPZiBjb25zdGFudCBleHByIC0gVGhpcyBpcyBhIGdlbmVyYWxpemVkIGZvcm0gb2YgZ2V0T2Zmc2V0T2YsCisgIC8vLyB3aGljaCBzdXBwb3J0cyBhbnkgYWdncmVnYXRlIHR5cGUsIGFuZCBhbnkgQ29uc3RhbnQgaW5kZXguCisgIC8vLworICBzdGF0aWMgQ29uc3RhbnQgKmdldE9mZnNldE9mKFR5cGUgKlR5LCBDb25zdGFudCAqRmllbGRObyk7CisKKyAgc3RhdGljIENvbnN0YW50ICpnZXROZWcoQ29uc3RhbnQgKkMsIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID1mYWxzZSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0Rk5lZyhDb25zdGFudCAqQyk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0Tm90KENvbnN0YW50ICpDKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRBZGQoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEZBZGQoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldFN1YihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcgPSBmYWxzZSwgYm9vbCBIYXNOU1cgPSBmYWxzZSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RlN1YihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0TXVsKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRGTXVsKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRVRGl2KENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyLCBib29sIGlzRXhhY3QgPSBmYWxzZSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0U0RpdihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMiwgYm9vbCBpc0V4YWN0ID0gZmFsc2UpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEZEaXYoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldFVSZW0oQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldFNSZW0oQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEZSZW0oQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEFuZChDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0T3IoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldFhvcihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0U2hsKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRMU2hyKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyLCBib29sIGlzRXhhY3QgPSBmYWxzZSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0QVNocihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMiwgYm9vbCBpc0V4YWN0ID0gZmFsc2UpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldFRydW5jKENvbnN0YW50ICpDLCBUeXBlICpUeSwgYm9vbCBPbmx5SWZSZWR1Y2VkID0gZmFsc2UpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldFNFeHQoQ29uc3RhbnQgKkMsIFR5cGUgKlR5LCBib29sIE9ubHlJZlJlZHVjZWQgPSBmYWxzZSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0WkV4dChDb25zdGFudCAqQywgVHlwZSAqVHksIGJvb2wgT25seUlmUmVkdWNlZCA9IGZhbHNlKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRGUFRydW5jKENvbnN0YW50ICpDLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT25seUlmUmVkdWNlZCA9IGZhbHNlKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRGUEV4dGVuZChDb25zdGFudCAqQywgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPbmx5SWZSZWR1Y2VkID0gZmFsc2UpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldFVJVG9GUChDb25zdGFudCAqQywgVHlwZSAqVHksIGJvb2wgT25seUlmUmVkdWNlZCA9IGZhbHNlKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRTSVRvRlAoQ29uc3RhbnQgKkMsIFR5cGUgKlR5LCBib29sIE9ubHlJZlJlZHVjZWQgPSBmYWxzZSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RlBUb1VJKENvbnN0YW50ICpDLCBUeXBlICpUeSwgYm9vbCBPbmx5SWZSZWR1Y2VkID0gZmFsc2UpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEZQVG9TSShDb25zdGFudCAqQywgVHlwZSAqVHksIGJvb2wgT25seUlmUmVkdWNlZCA9IGZhbHNlKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRQdHJUb0ludChDb25zdGFudCAqQywgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPbmx5SWZSZWR1Y2VkID0gZmFsc2UpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEludFRvUHRyKENvbnN0YW50ICpDLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9ubHlJZlJlZHVjZWQgPSBmYWxzZSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0Qml0Q2FzdChDb25zdGFudCAqQywgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9ubHlJZlJlZHVjZWQgPSBmYWxzZSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0QWRkclNwYWNlQ2FzdChDb25zdGFudCAqQywgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9ubHlJZlJlZHVjZWQgPSBmYWxzZSk7CisKKyAgc3RhdGljIENvbnN0YW50ICpnZXROU1dOZWcoQ29uc3RhbnQgKkMpIHsgcmV0dXJuIGdldE5lZyhDLCBmYWxzZSwgdHJ1ZSk7IH0KKyAgc3RhdGljIENvbnN0YW50ICpnZXROVVdOZWcoQ29uc3RhbnQgKkMpIHsgcmV0dXJuIGdldE5lZyhDLCB0cnVlLCBmYWxzZSk7IH0KKworICBzdGF0aWMgQ29uc3RhbnQgKmdldE5TV0FkZChDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMikgeworICAgIHJldHVybiBnZXRBZGQoQzEsIEMyLCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICBzdGF0aWMgQ29uc3RhbnQgKmdldE5VV0FkZChDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMikgeworICAgIHJldHVybiBnZXRBZGQoQzEsIEMyLCB0cnVlLCBmYWxzZSk7CisgIH0KKworICBzdGF0aWMgQ29uc3RhbnQgKmdldE5TV1N1YihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMikgeworICAgIHJldHVybiBnZXRTdWIoQzEsIEMyLCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICBzdGF0aWMgQ29uc3RhbnQgKmdldE5VV1N1YihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMikgeworICAgIHJldHVybiBnZXRTdWIoQzEsIEMyLCB0cnVlLCBmYWxzZSk7CisgIH0KKworICBzdGF0aWMgQ29uc3RhbnQgKmdldE5TV011bChDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMikgeworICAgIHJldHVybiBnZXRNdWwoQzEsIEMyLCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICBzdGF0aWMgQ29uc3RhbnQgKmdldE5VV011bChDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMikgeworICAgIHJldHVybiBnZXRNdWwoQzEsIEMyLCB0cnVlLCBmYWxzZSk7CisgIH0KKworICBzdGF0aWMgQ29uc3RhbnQgKmdldE5TV1NobChDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMikgeworICAgIHJldHVybiBnZXRTaGwoQzEsIEMyLCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICBzdGF0aWMgQ29uc3RhbnQgKmdldE5VV1NobChDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMikgeworICAgIHJldHVybiBnZXRTaGwoQzEsIEMyLCB0cnVlLCBmYWxzZSk7CisgIH0KKworICBzdGF0aWMgQ29uc3RhbnQgKmdldEV4YWN0U0RpdihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMikgeworICAgIHJldHVybiBnZXRTRGl2KEMxLCBDMiwgdHJ1ZSk7CisgIH0KKworICBzdGF0aWMgQ29uc3RhbnQgKmdldEV4YWN0VURpdihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMikgeworICAgIHJldHVybiBnZXRVRGl2KEMxLCBDMiwgdHJ1ZSk7CisgIH0KKworICBzdGF0aWMgQ29uc3RhbnQgKmdldEV4YWN0QVNocihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMikgeworICAgIHJldHVybiBnZXRBU2hyKEMxLCBDMiwgdHJ1ZSk7CisgIH0KKworICBzdGF0aWMgQ29uc3RhbnQgKmdldEV4YWN0TFNocihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMikgeworICAgIHJldHVybiBnZXRMU2hyKEMxLCBDMiwgdHJ1ZSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBpZGVudGl0eSBmb3IgdGhlIGdpdmVuIGJpbmFyeSBvcGVyYXRpb24sCisgIC8vLyBpLmUuIGEgY29uc3RhbnQgQyBzdWNoIHRoYXQgWCBvcCBDID0gWCBhbmQgQyBvcCBYID0gWCBmb3IgZXZlcnkgWC4gIEl0CisgIC8vLyByZXR1cm5zIG51bGwgaWYgdGhlIG9wZXJhdG9yIGRvZXNuJ3QgaGF2ZSBhbiBpZGVudGl0eS4KKyAgc3RhdGljIENvbnN0YW50ICpnZXRCaW5PcElkZW50aXR5KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVHkpOworCisgIC8vLyBSZXR1cm4gdGhlIGFic29yYmluZyBlbGVtZW50IGZvciB0aGUgZ2l2ZW4gYmluYXJ5CisgIC8vLyBvcGVyYXRpb24sIGkuZS4gYSBjb25zdGFudCBDIHN1Y2ggdGhhdCBYIG9wIEMgPSBDIGFuZCBDIG9wIFggPSBDIGZvcgorICAvLy8gZXZlcnkgWC4gIEZvciBleGFtcGxlLCB0aGlzIHJldHVybnMgemVybyBmb3IgaW50ZWdlciBtdWx0aXBsaWNhdGlvbi4KKyAgLy8vIEl0IHJldHVybnMgbnVsbCBpZiB0aGUgb3BlcmF0b3IgZG9lc24ndCBoYXZlIGFuIGFic29yYmluZyBlbGVtZW50LgorICBzdGF0aWMgQ29uc3RhbnQgKmdldEJpbk9wQWJzb3JiZXIodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpUeSk7CisKKyAgLy8vIFRyYW5zcGFyZW50bHkgcHJvdmlkZSBtb3JlIGVmZmljaWVudCBnZXRPcGVyYW5kIG1ldGhvZHMuCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoQ29uc3RhbnQpOworCisgIC8vLyBcYnJpZWYgQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGdldHRpbmcgYSBDYXN0IG9wZXJhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gb3BzIFRoZSBvcGNvZGUgZm9yIHRoZSBjb252ZXJzaW9uCisgIC8vLyBccGFyYW0gQyAgVGhlIGNvbnN0YW50IHRvIGJlIGNvbnZlcnRlZAorICAvLy8gXHBhcmFtIFR5IFRoZSB0eXBlIHRvIHdoaWNoIHRoZSBjb25zdGFudCBpcyBjb252ZXJ0ZWQKKyAgLy8vIFxwYXJhbSBPbmx5SWZSZWR1Y2VkIHNlZSBcYSBnZXRXaXRoT3BlcmFuZHMoKSBkb2NzLgorICBzdGF0aWMgQ29uc3RhbnQgKmdldENhc3QodW5zaWduZWQgb3BzLCBDb25zdGFudCAqQywgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9ubHlJZlJlZHVjZWQgPSBmYWxzZSk7CisKKyAgLy8gQGJyaWVmIENyZWF0ZSBhIFpFeHQgb3IgQml0Q2FzdCBjYXN0IGNvbnN0YW50IGV4cHJlc3Npb24KKyAgc3RhdGljIENvbnN0YW50ICpnZXRaRXh0T3JCaXRDYXN0KAorICAgIENvbnN0YW50ICpDLCAgIC8vLzwgVGhlIGNvbnN0YW50IHRvIHpleHQgb3IgYml0Y2FzdAorICAgIFR5cGUgKlR5IC8vLzwgVGhlIHR5cGUgdG8gemV4dCBvciBiaXRjYXN0IEMgdG8KKyAgKTsKKworICAvLyBAYnJpZWYgQ3JlYXRlIGEgU0V4dCBvciBCaXRDYXN0IGNhc3QgY29uc3RhbnQgZXhwcmVzc2lvbgorICBzdGF0aWMgQ29uc3RhbnQgKmdldFNFeHRPckJpdENhc3QoCisgICAgQ29uc3RhbnQgKkMsICAgLy8vPCBUaGUgY29uc3RhbnQgdG8gc2V4dCBvciBiaXRjYXN0CisgICAgVHlwZSAqVHkgLy8vPCBUaGUgdHlwZSB0byBzZXh0IG9yIGJpdGNhc3QgQyB0bworICApOworCisgIC8vIEBicmllZiBDcmVhdGUgYSBUcnVuYyBvciBCaXRDYXN0IGNhc3QgY29uc3RhbnQgZXhwcmVzc2lvbgorICBzdGF0aWMgQ29uc3RhbnQgKmdldFRydW5jT3JCaXRDYXN0KAorICAgIENvbnN0YW50ICpDLCAgIC8vLzwgVGhlIGNvbnN0YW50IHRvIHRydW5jIG9yIGJpdGNhc3QKKyAgICBUeXBlICpUeSAvLy88IFRoZSB0eXBlIHRvIHRydW5jIG9yIGJpdGNhc3QgQyB0bworICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgQml0Q2FzdCwgQWRkclNwYWNlQ2FzdCwgb3IgYSBQdHJUb0ludCBjYXN0IGNvbnN0YW50CisgIC8vLyBleHByZXNzaW9uLgorICBzdGF0aWMgQ29uc3RhbnQgKmdldFBvaW50ZXJDYXN0KAorICAgIENvbnN0YW50ICpDLCAgIC8vLzwgVGhlIHBvaW50ZXIgdmFsdWUgdG8gYmUgY2FzdGVkIChvcGVyYW5kIDApCisgICAgVHlwZSAqVHkgLy8vPCBUaGUgdHlwZSB0byB3aGljaCBjYXN0IHNob3VsZCBiZSBtYWRlCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBCaXRDYXN0IG9yIEFkZHJTcGFjZUNhc3QgZm9yIGEgcG9pbnRlciB0eXBlIGRlcGVuZGluZyBvbgorICAvLy8gdGhlIGFkZHJlc3Mgc3BhY2UuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0UG9pbnRlckJpdENhc3RPckFkZHJTcGFjZUNhc3QoCisgICAgQ29uc3RhbnQgKkMsICAgLy8vPCBUaGUgY29uc3RhbnQgdG8gYWRkcnNwYWNlY2FzdCBvciBiaXRjYXN0CisgICAgVHlwZSAqVHkgLy8vPCBUaGUgdHlwZSB0byBiaXRjYXN0IG9yIGFkZHJzcGFjZWNhc3QgQyB0bworICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgWkV4dCwgQml0Y2FzdCBvciBUcnVuYyBmb3IgaW50ZWdlciAtPiBpbnRlZ2VyIGNhc3RzCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0SW50ZWdlckNhc3QoCisgICAgQ29uc3RhbnQgKkMsICAgIC8vLzwgVGhlIGludGVnZXIgY29uc3RhbnQgdG8gYmUgY2FzdGVkCisgICAgVHlwZSAqVHksIC8vLzwgVGhlIGludGVnZXIgdHlwZSB0byBjYXN0IHRvCisgICAgYm9vbCBpc1NpZ25lZCAgIC8vLzwgV2hldGhlciBDIHNob3VsZCBiZSB0cmVhdGVkIGFzIHNpZ25lZCBvciBub3QKKyAgKTsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIEZQRXh0LCBCaXRjYXN0IG9yIEZQVHJ1bmMgZm9yIGZwIC0+IGZwIGNhc3RzCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RlBDYXN0KAorICAgIENvbnN0YW50ICpDLCAgICAvLy88IFRoZSBpbnRlZ2VyIGNvbnN0YW50IHRvIGJlIGNhc3RlZAorICAgIFR5cGUgKlR5IC8vLzwgVGhlIGludGVnZXIgdHlwZSB0byBjYXN0IHRvCisgICk7CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgY29udmVydCBjb25zdGFudCBleHByZXNzaW9uCisgIGJvb2wgaXNDYXN0KCkgY29uc3Q7CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgY29tcGFyZSBjb25zdGFudCBleHByZXNzaW9uCisgIGJvb2wgaXNDb21wYXJlKCkgY29uc3Q7CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIGluc2VydHZhbHVlIG9yIGV4dHJhY3R2YWx1ZSBleHByZXNzaW9uLAorICAvLy8gYW5kIHRoZSBnZXRJbmRpY2VzKCkgbWV0aG9kIG1heSBiZSB1c2VkLgorICBib29sIGhhc0luZGljZXMoKSBjb25zdDsKKworICAvLy8gQGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBnZXRlbGVtZW50cHRyIGV4cHJlc3Npb24gYW5kIGFsbAorICAvLy8gdGhlIGluZGV4IG9wZXJhbmRzIGFyZSBjb21waWxlLXRpbWUga25vd24gaW50ZWdlcnMgd2l0aGluIHRoZQorICAvLy8gY29ycmVzcG9uZGluZyBub3Rpb25hbCBzdGF0aWMgYXJyYXkgZXh0ZW50cy4gTm90ZSB0aGF0IHRoaXMgaXMKKyAgLy8vIG5vdCBlcXVpdmFsYW50IHRvLCBhIHN1YnNldCBvZiwgb3IgYSBzdXBlcnNldCBvZiB0aGUgImluYm91bmRzIgorICAvLy8gcHJvcGVydHkuCisgIGJvb2wgaXNHRVBXaXRoTm9Ob3Rpb25hbE92ZXJJbmRleGluZygpIGNvbnN0OworCisgIC8vLyBTZWxlY3QgY29uc3RhbnQgZXhwcgorICAvLy8KKyAgLy8vIFxwYXJhbSBPbmx5SWZSZWR1Y2VkVHkgc2VlIFxhIGdldFdpdGhPcGVyYW5kcygpIGRvY3MuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0U2VsZWN0KENvbnN0YW50ICpDLCBDb25zdGFudCAqVjEsIENvbnN0YW50ICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqT25seUlmUmVkdWNlZFR5ID0gbnVsbHB0cik7CisKKyAgLy8vIGdldCAtIFJldHVybiBhIGJpbmFyeSBvciBzaGlmdCBvcGVyYXRvciBjb25zdGFudCBleHByZXNzaW9uLAorICAvLy8gZm9sZGluZyBpZiBwb3NzaWJsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gT25seUlmUmVkdWNlZFR5IHNlZSBcYSBnZXRXaXRoT3BlcmFuZHMoKSBkb2NzLgorICBzdGF0aWMgQ29uc3RhbnQgKmdldCh1bnNpZ25lZCBPcGNvZGUsIENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGbGFncyA9IDAsIFR5cGUgKk9ubHlJZlJlZHVjZWRUeSA9IG51bGxwdHIpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGFuIElDbXAgb3IgRkNtcCBjb21wYXJpc29uIG9wZXJhdG9yIGNvbnN0YW50IGV4cHJlc3Npb24uCisgIC8vLworICAvLy8gXHBhcmFtIE9ubHlJZlJlZHVjZWQgc2VlIFxhIGdldFdpdGhPcGVyYW5kcygpIGRvY3MuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0Q29tcGFyZSh1bnNpZ25lZCBzaG9ydCBwcmVkLCBDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT25seUlmUmVkdWNlZCA9IGZhbHNlKTsKKworICAvLy8gZ2V0KiAtIFJldHVybiBzb21lIGNvbW1vbiBjb25zdGFudHMgd2l0aG91dCBoYXZpbmcgdG8KKyAgLy8vIHNwZWNpZnkgdGhlIGZ1bGwgSW5zdHJ1Y3Rpb246Ok9QQ09ERSBpZGVudGlmaWVyLgorICAvLy8KKyAgc3RhdGljIENvbnN0YW50ICpnZXRJQ21wKHVuc2lnbmVkIHNob3J0IHByZWQsIENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9ubHlJZlJlZHVjZWQgPSBmYWxzZSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RkNtcCh1bnNpZ25lZCBzaG9ydCBwcmVkLCBDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPbmx5SWZSZWR1Y2VkID0gZmFsc2UpOworCisgIC8vLyBHZXRlbGVtZW50cHRyIGZvcm0uICBWYWx1ZSogaXMgb25seSBhY2NlcHRlZCBmb3IgY29udmVuaWVuY2U7CisgIC8vLyBhbGwgZWxlbWVudHMgbXVzdCBiZSBDb25zdGFudHMuCisgIC8vLworICAvLy8gXHBhcmFtIEluUmFuZ2VJbmRleCB0aGUgaW5yYW5nZSBpbmRleCBpZiBwcmVzZW50IG9yIE5vbmUuCisgIC8vLyBccGFyYW0gT25seUlmUmVkdWNlZFR5IHNlZSBcYSBnZXRXaXRoT3BlcmFuZHMoKSBkb2NzLgorICBzdGF0aWMgQ29uc3RhbnQgKmdldEdldEVsZW1lbnRQdHIoVHlwZSAqVHksIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q29uc3RhbnQgKj4gSWR4TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5Cb3VuZHMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHVuc2lnbmVkPiBJblJhbmdlSW5kZXggPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqT25seUlmUmVkdWNlZFR5ID0gbnVsbHB0cikgeworICAgIHJldHVybiBnZXRHZXRFbGVtZW50UHRyKAorICAgICAgICBUeSwgQywgbWFrZUFycmF5UmVmKChWYWx1ZSAqIGNvbnN0ICopSWR4TGlzdC5kYXRhKCksIElkeExpc3Quc2l6ZSgpKSwKKyAgICAgICAgSW5Cb3VuZHMsIEluUmFuZ2VJbmRleCwgT25seUlmUmVkdWNlZFR5KTsKKyAgfQorICBzdGF0aWMgQ29uc3RhbnQgKmdldEdldEVsZW1lbnRQdHIoVHlwZSAqVHksIENvbnN0YW50ICpDLCBDb25zdGFudCAqSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbkJvdW5kcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8dW5zaWduZWQ+IEluUmFuZ2VJbmRleCA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpPbmx5SWZSZWR1Y2VkVHkgPSBudWxscHRyKSB7CisgICAgLy8gVGhpcyBmb3JtIG9mIHRoZSBmdW5jdGlvbiBvbmx5IGV4aXN0cyB0byBhdm9pZCBhbWJpZ3VvdXMgb3ZlcmxvYWQKKyAgICAvLyB3YXJuaW5ncyBhYm91dCB3aGV0aGVyIHRvIGNvbnZlcnQgSWR4IHRvIEFycmF5UmVmPENvbnN0YW50ICo+IG9yCisgICAgLy8gQXJyYXlSZWY8VmFsdWUgKj4uCisgICAgcmV0dXJuIGdldEdldEVsZW1lbnRQdHIoVHksIEMsIGNhc3Q8VmFsdWU+KElkeCksIEluQm91bmRzLCBJblJhbmdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seUlmUmVkdWNlZFR5KTsKKyAgfQorICBzdGF0aWMgQ29uc3RhbnQgKmdldEdldEVsZW1lbnRQdHIoVHlwZSAqVHksIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5Cb3VuZHMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHVuc2lnbmVkPiBJblJhbmdlSW5kZXggPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqT25seUlmUmVkdWNlZFR5ID0gbnVsbHB0cik7CisKKyAgLy8vIENyZWF0ZSBhbiAiaW5ib3VuZHMiIGdldGVsZW1lbnRwdHIuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlCisgIC8vLyAiaW5ib3VuZHMiIGZsYWcgaW4gTGFuZ1JlZi5odG1sIGZvciBkZXRhaWxzLgorICBzdGF0aWMgQ29uc3RhbnQgKmdldEluQm91bmRzR2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENvbnN0YW50ICo+IElkeExpc3QpIHsKKyAgICByZXR1cm4gZ2V0R2V0RWxlbWVudFB0cihUeSwgQywgSWR4TGlzdCwgdHJ1ZSk7CisgIH0KKyAgc3RhdGljIENvbnN0YW50ICpnZXRJbkJvdW5kc0dldEVsZW1lbnRQdHIoVHlwZSAqVHksIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqSWR4KSB7CisgICAgLy8gVGhpcyBmb3JtIG9mIHRoZSBmdW5jdGlvbiBvbmx5IGV4aXN0cyB0byBhdm9pZCBhbWJpZ3VvdXMgb3ZlcmxvYWQKKyAgICAvLyB3YXJuaW5ncyBhYm91dCB3aGV0aGVyIHRvIGNvbnZlcnQgSWR4IHRvIEFycmF5UmVmPENvbnN0YW50ICo+IG9yCisgICAgLy8gQXJyYXlSZWY8VmFsdWUgKj4uCisgICAgcmV0dXJuIGdldEdldEVsZW1lbnRQdHIoVHksIEMsIElkeCwgdHJ1ZSk7CisgIH0KKyAgc3RhdGljIENvbnN0YW50ICpnZXRJbkJvdW5kc0dldEVsZW1lbnRQdHIoVHlwZSAqVHksIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBJZHhMaXN0KSB7CisgICAgcmV0dXJuIGdldEdldEVsZW1lbnRQdHIoVHksIEMsIElkeExpc3QsIHRydWUpOworICB9CisKKyAgc3RhdGljIENvbnN0YW50ICpnZXRFeHRyYWN0RWxlbWVudChDb25zdGFudCAqVmVjLCBDb25zdGFudCAqSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKk9ubHlJZlJlZHVjZWRUeSA9IG51bGxwdHIpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEluc2VydEVsZW1lbnQoQ29uc3RhbnQgKlZlYywgQ29uc3RhbnQgKkVsdCwgQ29uc3RhbnQgKklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKk9ubHlJZlJlZHVjZWRUeSA9IG51bGxwdHIpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldFNodWZmbGVWZWN0b3IoQ29uc3RhbnQgKlYxLCBDb25zdGFudCAqVjIsIENvbnN0YW50ICpNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqT25seUlmUmVkdWNlZFR5ID0gbnVsbHB0cik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RXh0cmFjdFZhbHVlKENvbnN0YW50ICpBZ2csIEFycmF5UmVmPHVuc2lnbmVkPiBJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpPbmx5SWZSZWR1Y2VkVHkgPSBudWxscHRyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRJbnNlcnRWYWx1ZShDb25zdGFudCAqQWdnLCBDb25zdGFudCAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKk9ubHlJZlJlZHVjZWRUeSA9IG51bGxwdHIpOworCisgIC8vLyBSZXR1cm4gdGhlIG9wY29kZSBhdCB0aGUgcm9vdCBvZiB0aGlzIGNvbnN0YW50IGV4cHJlc3Npb24KKyAgdW5zaWduZWQgZ2V0T3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCk7IH0KKworICAvLy8gUmV0dXJuIHRoZSBJQ01QIG9yIEZDTVAgcHJlZGljYXRlIHZhbHVlLiBBc3NlcnQgaWYgdGhpcyBpcyBub3QgYW4gSUNNUCBvcgorICAvLy8gRkNNUCBjb25zdGFudCBleHByZXNzaW9uLgorICB1bnNpZ25lZCBnZXRQcmVkaWNhdGUoKSBjb25zdDsKKworICAvLy8gQXNzZXJ0IHRoYXQgdGhpcyBpcyBhbiBpbnNlcnR2YWx1ZSBvciBleGFjdHZhbHVlCisgIC8vLyBleHByZXNzaW9uIGFuZCByZXR1cm4gdGhlIGxpc3Qgb2YgaW5kaWNlcy4KKyAgQXJyYXlSZWY8dW5zaWduZWQ+IGdldEluZGljZXMoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciBhbiBvcGNvZGUuCisgIGNvbnN0IGNoYXIgKmdldE9wY29kZU5hbWUoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBpZGVudGljYWwgdG8gdGhpcyBvbmUsIGJ1dCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgLy8vIG9wZXJhbmQgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgIENvbnN0YW50ICpnZXRXaXRoT3BlcmFuZFJlcGxhY2VkKHVuc2lnbmVkIE9wTm8sIENvbnN0YW50ICpPcCkgY29uc3Q7CisKKyAgLy8vIFRoaXMgcmV0dXJucyB0aGUgY3VycmVudCBjb25zdGFudCBleHByZXNzaW9uIHdpdGggdGhlIG9wZXJhbmRzIHJlcGxhY2VkCisgIC8vLyB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLiBUaGUgc3BlY2lmaWVkIGFycmF5IG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIKKyAgLy8vIG9mIG9wZXJhbmRzIGFzIG91ciBjdXJyZW50IG9uZS4KKyAgQ29uc3RhbnQgKmdldFdpdGhPcGVyYW5kcyhBcnJheVJlZjxDb25zdGFudCo+IE9wcykgY29uc3QgeworICAgIHJldHVybiBnZXRXaXRoT3BlcmFuZHMoT3BzLCBnZXRUeXBlKCkpOworICB9CisKKyAgLy8vIEdldCB0aGUgY3VycmVudCBleHByZXNzaW9uIHdpdGggdGhlIG9wZXJhbmRzIHJlcGxhY2VkLgorICAvLy8KKyAgLy8vIFJldHVybiB0aGUgY3VycmVudCBjb25zdGFudCBleHByZXNzaW9uIHdpdGggdGhlIG9wZXJhbmRzIHJlcGxhY2VkIHdpdGggXGMKKyAgLy8vIE9wcyBhbmQgdGhlIHR5cGUgd2l0aCBcYyBUeS4gIFRoZSBuZXcgb3BlcmFuZHMgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlcgorICAvLy8gYXMgdGhlIGN1cnJlbnQgb25lcy4KKyAgLy8vCisgIC8vLyBJZiBcYyBPbmx5SWZSZWR1Y2VkIGlzIFxjIHRydWUsIG51bGxwdHIgd2lsbCBiZSByZXR1cm5lZCB1bmxlc3Mgc29tZXRoaW5nCisgIC8vLyBnZXRzIGNvbnN0YW50LWZvbGRlZCwgdGhlIHR5cGUgY2hhbmdlcywgb3IgdGhlIGV4cHJlc3Npb24gaXMgb3RoZXJ3aXNlCisgIC8vLyBjYW5vbmljYWxpemVkLiAgVGhpcyBwYXJhbWV0ZXIgc2hvdWxkIGFsbW9zdCBhbHdheXMgYmUgXGMgZmFsc2UuCisgIENvbnN0YW50ICpnZXRXaXRoT3BlcmFuZHMoQXJyYXlSZWY8Q29uc3RhbnQgKj4gT3BzLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9ubHlJZlJlZHVjZWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpTcmNUeSA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIGFuIEluc3RydWN0aW9uIHdoaWNoIGltcGxlbWVudHMgdGhlIHNhbWUgb3BlcmF0aW9uIGFzIHRoaXMKKyAgLy8vIENvbnN0YW50RXhwci4gVGhlIGluc3RydWN0aW9uIGlzIG5vdCBsaW5rZWQgdG8gYW55IGJhc2ljIGJsb2NrLgorICAvLy8KKyAgLy8vIEEgYmV0dGVyIGFwcHJvYWNoIHRvIHRoaXMgY291bGQgYmUgdG8gaGF2ZSBhIGNvbnN0cnVjdG9yIGZvciBJbnN0cnVjdGlvbgorICAvLy8gd2hpY2ggd291bGQgdGFrZSBhIENvbnN0YW50RXhwciBwYXJhbWV0ZXIsIGJ1dCB0aGF0IHdvdWxkIGhhdmUgc3ByZWFkCisgIC8vLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIENvbnN0YW50RXhwciBvdXRzaWRlIG9mIENvbnN0YW50cy5jcHAsIHdoaWNoCisgIC8vLyB3b3VsZCBtYWtlIGl0IGhhcmRlciB0byByZW1vdmUgQ29uc3RhbnRFeHBycyBhbHRvZ2V0aGVyLgorICBJbnN0cnVjdGlvbiAqZ2V0QXNJbnN0cnVjdGlvbigpOworCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBDb25zdGFudEV4cHJWYWw7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gU2hhZG93IFZhbHVlOjpzZXRWYWx1ZVN1YmNsYXNzRGF0YSB3aXRoIGEgcHJpdmF0ZSBmb3J3YXJkaW5nIG1ldGhvZCBzbyB0aGF0CisgIC8vIHN1YmNsYXNzZXMgY2Fubm90IGFjY2lkZW50YWxseSB1c2UgaXQuCisgIHZvaWQgc2V0VmFsdWVTdWJjbGFzc0RhdGEodW5zaWduZWQgc2hvcnQgRCkgeworICAgIFZhbHVlOjpzZXRWYWx1ZVN1YmNsYXNzRGF0YShEKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPENvbnN0YW50RXhwcj4gOgorICBwdWJsaWMgVmFyaWFkaWNPcGVyYW5kVHJhaXRzPENvbnN0YW50RXhwciwgMT4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKENvbnN0YW50RXhwciwgQ29uc3RhbnQpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gJ3VuZGVmJyB2YWx1ZXMgYXJlIHRoaW5ncyB0aGF0IGRvIG5vdCBoYXZlIHNwZWNpZmllZCBjb250ZW50cy4KKy8vLyBUaGVzZSBhcmUgdXNlZCBmb3IgYSB2YXJpZXR5IG9mIHB1cnBvc2VzLCBpbmNsdWRpbmcgZ2xvYmFsIHZhcmlhYmxlCisvLy8gaW5pdGlhbGl6ZXJzIGFuZCBvcGVyYW5kcyB0byBpbnN0cnVjdGlvbnMuICAndW5kZWYnIHZhbHVlcyBjYW4gb2NjdXIgd2l0aAorLy8vIGFueSBmaXJzdC1jbGFzcyB0eXBlLgorLy8vCisvLy8gVW5kZWYgdmFsdWVzIGFyZW4ndCBleGFjdGx5IGNvbnN0YW50czsgaWYgdGhleSBoYXZlIG11bHRpcGxlIHVzZXMsIHRoZXkKKy8vLyBjYW4gYXBwZWFyIHRvIGhhdmUgZGlmZmVyZW50IGJpdCBwYXR0ZXJucyBhdCBlYWNoIHVzZS4gU2VlCisvLy8gTGFuZ1JlZi5odG1sI3VuZGVmdmFsdWVzIGZvciBkZXRhaWxzLgorLy8vCitjbGFzcyBVbmRlZlZhbHVlIGZpbmFsIDogcHVibGljIENvbnN0YW50RGF0YSB7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudDsKKworICBleHBsaWNpdCBVbmRlZlZhbHVlKFR5cGUgKlQpIDogQ29uc3RhbnREYXRhKFQsIFVuZGVmVmFsdWVWYWwpIHt9CisKKyAgdm9pZCBkZXN0cm95Q29uc3RhbnRJbXBsKCk7CisKK3B1YmxpYzoKKyAgVW5kZWZWYWx1ZShjb25zdCBVbmRlZlZhbHVlICYpID0gZGVsZXRlOworCisgIC8vLyBTdGF0aWMgZmFjdG9yeSBtZXRob2RzIC0gUmV0dXJuIGFuICd1bmRlZicgb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgc3RhdGljIFVuZGVmVmFsdWUgKmdldChUeXBlICpUKTsKKworICAvLy8gSWYgdGhpcyBVbmRlZiBoYXMgYXJyYXkgb3IgdmVjdG9yIHR5cGUsIHJldHVybiBhIHVuZGVmIHdpdGggdGhlIHJpZ2h0CisgIC8vLyBlbGVtZW50IHR5cGUuCisgIFVuZGVmVmFsdWUgKmdldFNlcXVlbnRpYWxFbGVtZW50KCkgY29uc3Q7CisKKyAgLy8vIElmIHRoaXMgdW5kZWYgaGFzIHN0cnVjdCB0eXBlLCByZXR1cm4gYSB1bmRlZiB3aXRoIHRoZSByaWdodCBlbGVtZW50IHR5cGUKKyAgLy8vIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCisgIFVuZGVmVmFsdWUgKmdldFN0cnVjdEVsZW1lbnQodW5zaWduZWQgRWx0KSBjb25zdDsKKworICAvLy8gUmV0dXJuIGFuIHVuZGVmIG9mIHRoZSByaWdodCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBHRVAgaW5kZXggaWYgd2UgY2FuLAorICAvLy8gb3RoZXJ3aXNlIHJldHVybiBudWxsIChlLmcuIGlmIEMgaXMgYSBDb25zdGFudEV4cHIpLgorICBVbmRlZlZhbHVlICpnZXRFbGVtZW50VmFsdWUoQ29uc3RhbnQgKkMpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYW4gdW5kZWYgb2YgdGhlIHJpZ2h0IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIEdFUCBpbmRleC4KKyAgVW5kZWZWYWx1ZSAqZ2V0RWxlbWVudFZhbHVlKHVuc2lnbmVkIElkeCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheSwgdmVjdG9yLCBvciBzdHJ1Y3QuCisgIHVuc2lnbmVkIGdldE51bUVsZW1lbnRzKCkgY29uc3Q7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IFVuZGVmVmFsdWVWYWw7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0NPTlNUQU5UU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RJQnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9ESUJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYThhOGVjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9ESUJ1aWxkZXIuaApAQCAtMCwwICsxLDg0NyBAQAorLy89PT0tIERJQnVpbGRlci5oIC0gRGVidWcgSW5mb3JtYXRpb24gQnVpbGRlciAtLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIERJQnVpbGRlciB0aGF0IGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgZGVidWdnaW5nCisvLyBpbmZvcm1hdGlvbiBlbnRyaWVzIGluIExMVk0gSVIgZm9ybS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfRElCVUlMREVSX0gKKyNkZWZpbmUgTExWTV9JUl9ESUJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL01hcFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU2V0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RlYnVnSW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVidWdJbmZvTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1RyYWNraW5nTURSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgQmFzaWNCbG9jazsKKyAgY2xhc3MgQ29uc3RhbnQ7CisgIGNsYXNzIEZ1bmN0aW9uOworICBjbGFzcyBJbnN0cnVjdGlvbjsKKyAgY2xhc3MgTExWTUNvbnRleHQ7CisgIGNsYXNzIE1vZHVsZTsKKyAgY2xhc3MgVmFsdWU7CisKKyAgY2xhc3MgRElCdWlsZGVyIHsKKyAgICBNb2R1bGUgJk07CisgICAgTExWTUNvbnRleHQgJlZNQ29udGV4dDsKKworICAgIERJQ29tcGlsZVVuaXQgKkNVTm9kZTsgICAvLy88IFRoZSBvbmUgY29tcGlsZSB1bml0IGNyZWF0ZWQgYnkgdGhpcyBESUJ1aWxlci4KKyAgICBGdW5jdGlvbiAqRGVjbGFyZUZuOyAgICAgLy8vPCBsbHZtLmRiZy5kZWNsYXJlCisgICAgRnVuY3Rpb24gKlZhbHVlRm47ICAgICAgIC8vLzwgbGx2bS5kYmcudmFsdWUKKworICAgIFNtYWxsVmVjdG9yPE1ldGFkYXRhICosIDQ+IEFsbEVudW1UeXBlczsKKyAgICAvLy8gVHJhY2sgdGhlIFJldGFpblR5cGVzLCBzaW5jZSB0aGV5IGNhbiBiZSB1cGRhdGVkIGxhdGVyIG9uLgorICAgIFNtYWxsVmVjdG9yPFRyYWNraW5nTUROb2RlUmVmLCA0PiBBbGxSZXRhaW5UeXBlczsKKyAgICBTbWFsbFZlY3RvcjxNZXRhZGF0YSAqLCA0PiBBbGxTdWJwcm9ncmFtczsKKyAgICBTbWFsbFZlY3RvcjxNZXRhZGF0YSAqLCA0PiBBbGxHVnM7CisgICAgU21hbGxWZWN0b3I8VHJhY2tpbmdNRE5vZGVSZWYsIDQ+IEFsbEltcG9ydGVkTW9kdWxlczsKKyAgICAvLy8gTWFwIE1hY3JvIHBhcmVudCAod2hpY2ggY2FuIGJlIERJTWFjcm9GaWxlIG9yIG51bGxwdHIpIHRvIGEgbGlzdCBvZgorICAgIC8vLyBNZXRhZGF0YSBhbGwgb2YgdHlwZSBESU1hY3JvTm9kZS4KKyAgICAvLy8gRElNYWNyb05vZGUncyB3aXRoIG51bGxwdHIgcGFyZW50IGFyZSBESUNvbXBpbGVVbml0IGRpcmVjdCBjaGlsZHJlbi4KKyAgICBNYXBWZWN0b3I8TUROb2RlICosIFNldFZlY3RvcjxNZXRhZGF0YSAqPj4gQWxsTWFjcm9zUGVyUGFyZW50OworCisgICAgLy8vIFRyYWNrIG5vZGVzIHRoYXQgbWF5IGJlIHVucmVzb2x2ZWQuCisgICAgU21hbGxWZWN0b3I8VHJhY2tpbmdNRE5vZGVSZWYsIDQ+IFVucmVzb2x2ZWROb2RlczsKKyAgICBib29sIEFsbG93VW5yZXNvbHZlZE5vZGVzOworCisgICAgLy8vIEVhY2ggc3VicHJvZ3JhbSdzIHByZXNlcnZlZCBsb2NhbCB2YXJpYWJsZXMuCisgICAgLy8vCisgICAgLy8vIERvIG5vdCB1c2UgYSBzdGQ6OnZlY3Rvci4gIFNvbWUgdmVyc2lvbnMgb2YgbGliYysrIGFwcGFyZW50bHkgY29weQorICAgIC8vLyBpbnN0ZWFkIG9mIG1vdmUgb24gZ3JvdyBvcGVyYXRpb25zLCBhbmQgVHJhY2tpbmdNRFJlZiBpcyBleHBlbnNpdmUgdG8KKyAgICAvLy8gY29weS4KKyAgICBEZW5zZU1hcDxNRE5vZGUgKiwgU21hbGxWZWN0b3I8VHJhY2tpbmdNRE5vZGVSZWYsIDE+PiBQcmVzZXJ2ZWRWYXJpYWJsZXM7CisKKyAgICAvLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5LgorICAgIC8vLworICAgIC8vLyBDcmVhdGUgYW4gXGEgdGVtcG9yYXJ5IG5vZGUgYW5kIHRyYWNrIGl0IGluIFxhIFVucmVzb2x2ZWROb2Rlcy4KKyAgICB2b2lkIHRyYWNrSWZVbnJlc29sdmVkKE1ETm9kZSAqTik7CisKKyAgICAvLy8gSW50ZXJuYWwgaGVscGVyIGZvciBpbnNlcnREZWNsYXJlLgorICAgIEluc3RydWN0aW9uICppbnNlcnREZWNsYXJlKGxsdm06OlZhbHVlICpTdG9yYWdlLCBESUxvY2FsVmFyaWFibGUgKlZhckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElFeHByZXNzaW9uICpFeHByLCBjb25zdCBESUxvY2F0aW9uICpETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRCQiwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisKKyAgICAvLy8gSW50ZXJuYWwgaGVscGVyIGZvciBpbnNlcnREYmdWYWx1ZUludHJpbnNpYy4KKyAgICBJbnN0cnVjdGlvbiAqCisgICAgaW5zZXJ0RGJnVmFsdWVJbnRyaW5zaWMobGx2bTo6VmFsdWUgKlZhbCwgRElMb2NhbFZhcmlhYmxlICpWYXJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRXhwcmVzc2lvbiAqRXhwciwgY29uc3QgRElMb2NhdGlvbiAqREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QkIsIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpOworCisgIHB1YmxpYzoKKyAgICAvLy8gQ29uc3RydWN0IGEgYnVpbGRlciBmb3IgYSBtb2R1bGUuCisgICAgLy8vCisgICAgLy8vIElmIFxjIEFsbG93VW5yZXNvbHZlZCwgY29sbGVjdCB1bnJlc29sdmVkIG5vZGVzIGF0dGFjaGVkIHRvIHRoZSBtb2R1bGUKKyAgICAvLy8gaW4gb3JkZXIgdG8gcmVzb2x2ZSBjeWNsZXMgZHVyaW5nIFxhIGZpbmFsaXplKCkuCisgICAgLy8vCisgICAgLy8vIElmIFxwIENVIGlzIGdpdmVuIGEgdmFsdWUgb3RoZXIgdGhhbiBudWxscHRyLCB0aGVuIHNldCBccCBDVU5vZGUgdG8gQ1UuCisgICAgZXhwbGljaXQgRElCdWlsZGVyKE1vZHVsZSAmTSwgYm9vbCBBbGxvd1VucmVzb2x2ZWQgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICBESUNvbXBpbGVVbml0ICpDVSA9IG51bGxwdHIpOworICAgIERJQnVpbGRlcihjb25zdCBESUJ1aWxkZXIgJikgPSBkZWxldGU7CisgICAgRElCdWlsZGVyICZvcGVyYXRvcj0oY29uc3QgRElCdWlsZGVyICYpID0gZGVsZXRlOworCisgICAgLy8vIENvbnN0cnVjdCBhbnkgZGVmZXJyZWQgZGVidWcgaW5mbyBkZXNjcmlwdG9ycy4KKyAgICB2b2lkIGZpbmFsaXplKCk7CisKKyAgICAvLy8gRmluYWxpemUgYSBzcGVjaWZpYyBzdWJwcm9ncmFtIC0gbm8gbmV3IHZhcmlhYmxlcyBtYXkgYmUgYWRkZWQgdG8gdGhpcworICAgIC8vLyBzdWJwcm9ncmFtIGFmdGVyd2FyZHMuCisgICAgdm9pZCBmaW5hbGl6ZVN1YnByb2dyYW0oRElTdWJwcm9ncmFtICpTUCk7CisKKyAgICAvLy8gQSBDb21waWxlVW5pdCBwcm92aWRlcyBhbiBhbmNob3IgZm9yIGFsbCBkZWJ1Z2dpbmcKKyAgICAvLy8gaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGR1cmluZyB0aGlzIGluc3RhbmNlIG9mIGNvbXBpbGF0aW9uLgorICAgIC8vLyBccGFyYW0gTGFuZyAgICAgICAgICBTb3VyY2UgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIGVnLiBkd2FyZjo6RFdfTEFOR19DOTkKKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgICAgICAgRmlsZSBpbmZvLgorICAgIC8vLyBccGFyYW0gUHJvZHVjZXIgICAgICBJZGVudGlmeSB0aGUgcHJvZHVjZXIgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgIGFuZCBjb2RlLiAgVXN1YWxseSB0aGlzIGlzIGEgY29tcGlsZXIKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiBzdHJpbmcuCisgICAgLy8vIFxwYXJhbSBpc09wdGltaXplZCAgIEEgYm9vbGVhbiBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIG9wdGltaXphdGlvbgorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICBpcyBlbmFibGVkIG9yIG5vdC4KKyAgICAvLy8gXHBhcmFtIEZsYWdzICAgICAgICAgVGhpcyBzdHJpbmcgbGlzdHMgY29tbWFuZCBsaW5lIG9wdGlvbnMuIFRoaXMKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGlzIGRpcmVjdGx5IGVtYmVkZGVkIGluIGRlYnVnIGluZm8KKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHdoaWNoIG1heSBiZSB1c2VkIGJ5IGEgdG9vbAorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICBhbmFseXppbmcgZ2VuZXJhdGVkIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KKyAgICAvLy8gXHBhcmFtIFJWICAgICAgICAgICAgVGhpcyBpbmRpY2F0ZXMgcnVudGltZSB2ZXJzaW9uIGZvciBsYW5ndWFnZXMgbGlrZQorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICBPYmplY3RpdmUtQy4KKyAgICAvLy8gXHBhcmFtIFNwbGl0TmFtZSAgICAgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCB3ZSdsbCBzcGxpdCBkZWJ1ZyBpbmZvCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgIG91dCBpbnRvLgorICAgIC8vLyBccGFyYW0gS2luZCAgICAgICAgICBUaGUga2luZCBvZiBkZWJ1ZyBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZS4KKyAgICAvLy8gXHBhcmFtIERXT0lkICAgICAgICAgVGhlIERXT0lkIGlmIHRoaXMgaXMgYSBzcGxpdCBza2VsZXRvbiBjb21waWxlIHVuaXQuCisgICAgLy8vIFxwYXJhbSBTcGxpdERlYnVnSW5saW5pbmcgICAgV2hldGhlciB0byBlbWl0IGlubGluZSBkZWJ1ZyBpbmZvLgorICAgIC8vLyBccGFyYW0gRGVidWdJbmZvRm9yUHJvZmlsaW5nIFdoZXRoZXIgdG8gZW1pdCBleHRyYSBkZWJ1ZyBpbmZvIGZvcgorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgY29sbGVjdGlvbi4KKyAgICAvLy8gXHBhcmFtIEdudVB1Ym5hbWVzICAgV2hldGhlciB0byBlbWl0IC5kZWJ1Z19nbnVfcHVibmFtZXMgc2VjdGlvbiBpbnN0ZWFkCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgIG9mIC5kZWJ1Z19wdWJuYW1lcy4KKyAgICBESUNvbXBpbGVVbml0ICoKKyAgICBjcmVhdGVDb21waWxlVW5pdCh1bnNpZ25lZCBMYW5nLCBESUZpbGUgKkZpbGUsIFN0cmluZ1JlZiBQcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3B0aW1pemVkLCBTdHJpbmdSZWYgRmxhZ3MsIHVuc2lnbmVkIFJWLAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTcGxpdE5hbWUgPSBTdHJpbmdSZWYoKSwKKyAgICAgICAgICAgICAgICAgICAgICBESUNvbXBpbGVVbml0OjpEZWJ1Z0VtaXNzaW9uS2luZCBLaW5kID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRElDb21waWxlVW5pdDo6RGVidWdFbWlzc2lvbktpbmQ6OkZ1bGxEZWJ1ZywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBEV09JZCA9IDAsIGJvb2wgU3BsaXREZWJ1Z0lubGluaW5nID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIERlYnVnSW5mb0ZvclByb2ZpbGluZyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgR251UHVibmFtZXMgPSBmYWxzZSk7CisKKyAgICAvLy8gQ3JlYXRlIGEgZmlsZSBkZXNjcmlwdG9yIHRvIGhvbGQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBhIGZpbGUuCisgICAgLy8vIFxwYXJhbSBGaWxlbmFtZSAgRmlsZSBuYW1lLgorICAgIC8vLyBccGFyYW0gRGlyZWN0b3J5IERpcmVjdG9yeS4KKyAgICAvLy8gXHBhcmFtIENoZWNrc3VtICBPcHRpb25hbCBjaGVja3N1bSBraW5kIChlLmcuIENTS19NRDUsIENTS19TSEExLCBldGMuKQorICAgIC8vLyAgICAgICAgICAgICAgICAgIGFuZCB2YWx1ZS4KKyAgICAvLy8gXHBhcmFtIFNvdXJjZSAgICBPcHRpb25hbCBzb3VyY2UgdGV4dC4KKyAgICBESUZpbGUgKgorICAgIGNyZWF0ZUZpbGUoU3RyaW5nUmVmIEZpbGVuYW1lLCBTdHJpbmdSZWYgRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgT3B0aW9uYWw8RElGaWxlOjpDaGVja3N1bUluZm88U3RyaW5nUmVmPj4gQ2hlY2tzdW0gPSBOb25lLAorICAgICAgICAgICAgICAgT3B0aW9uYWw8U3RyaW5nUmVmPiBTb3VyY2UgPSBOb25lKTsKKworICAgIC8vLyBDcmVhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGVudHJ5IGZvciBhIG1hY3JvLgorICAgIC8vLyBccGFyYW0gUGFyZW50ICAgICBNYWNybyBwYXJlbnQgKGNvdWxkIGJlIG51bGxwdHIpLgorICAgIC8vLyBccGFyYW0gTGluZSAgICAgICBTb3VyY2UgbGluZSBudW1iZXIgd2hlcmUgdGhlIG1hY3JvIGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBNYWNyb1R5cGUgIERXX01BQ0lORk9fZGVmaW5lIG9yIERXX01BQ0lORk9fdW5kZWYuCisgICAgLy8vIFxwYXJhbSBOYW1lICAgICAgIE1hY3JvIG5hbWUuCisgICAgLy8vIFxwYXJhbSBWYWx1ZSAgICAgIE1hY3JvIHZhbHVlLgorICAgIERJTWFjcm8gKmNyZWF0ZU1hY3JvKERJTWFjcm9GaWxlICpQYXJlbnQsIHVuc2lnbmVkIExpbmUsIHVuc2lnbmVkIE1hY3JvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIFZhbHVlID0gU3RyaW5nUmVmKCkpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdGVtcG9yYXJ5IGVudHJ5IGZvciBhIG1hY3JvIGZpbGUuCisgICAgLy8vIExpc3Qgb2YgbWFjcm8gbm9kZSBkaXJlY3QgY2hpbGRyZW4gd2lsbCBiZSBjYWxjdWxhdGVkIGJ5IERJQnVpbGRlciwKKyAgICAvLy8gdXNpbmcgdGhlIFxwIFBhcmVudCByZWxhdGlvbnNoaXAuCisgICAgLy8vIFxwYXJhbSBQYXJlbnQgICAgIE1hY3JvIGZpbGUgcGFyZW50IChjb3VsZCBiZSBudWxscHRyKS4KKyAgICAvLy8gXHBhcmFtIExpbmUgICAgICAgU291cmNlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBtYWNybyBmaWxlIGlzIGluY2x1ZGVkLgorICAgIC8vLyBccGFyYW0gRmlsZSAgICAgICBGaWxlIGRlc2NyaXB0b3IgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgbWFjcm8gZmlsZS4KKyAgICBESU1hY3JvRmlsZSAqY3JlYXRlVGVtcE1hY3JvRmlsZShESU1hY3JvRmlsZSAqUGFyZW50LCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmlsZSAqRmlsZSk7CisKKyAgICAvLy8gQ3JlYXRlIGEgc2luZ2xlIGVudW1lcmF0b3IgdmFsdWUuCisgICAgRElFbnVtZXJhdG9yICpjcmVhdGVFbnVtZXJhdG9yKFN0cmluZ1JlZiBOYW1lLCBpbnQ2NF90IFZhbCwgYm9vbCBJc1Vuc2lnbmVkID0gZmFsc2UpOworCisgICAgLy8vIENyZWF0ZSBhIERXQVJGIHVuc3BlY2lmaWVkIHR5cGUuCisgICAgRElCYXNpY1R5cGUgKmNyZWF0ZVVuc3BlY2lmaWVkVHlwZShTdHJpbmdSZWYgTmFtZSk7CisKKyAgICAvLy8gQ3JlYXRlIEMrKzExIG51bGxwdHIgdHlwZS4KKyAgICBESUJhc2ljVHlwZSAqY3JlYXRlTnVsbFB0clR5cGUoKTsKKworICAgIC8vLyBDcmVhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGVudHJ5IGZvciBhIGJhc2ljCisgICAgLy8vIHR5cGUuCisgICAgLy8vIFxwYXJhbSBOYW1lICAgICAgICBUeXBlIG5hbWUuCisgICAgLy8vIFxwYXJhbSBTaXplSW5CaXRzICBTaXplIG9mIHRoZSB0eXBlLgorICAgIC8vLyBccGFyYW0gRW5jb2RpbmcgICAgRFdBUkYgZW5jb2RpbmcgY29kZSwgZS5nLiBkd2FyZjo6RFdfQVRFX2Zsb2F0LgorICAgIERJQmFzaWNUeXBlICpjcmVhdGVCYXNpY1R5cGUoU3RyaW5nUmVmIE5hbWUsIHVpbnQ2NF90IFNpemVJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFbmNvZGluZyk7CisKKyAgICAvLy8gQ3JlYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBlbnRyeSBmb3IgYSBxdWFsaWZpZWQKKyAgICAvLy8gdHlwZSwgZS5nLiAnY29uc3QgaW50Jy4KKyAgICAvLy8gXHBhcmFtIFRhZyAgICAgICAgIFRhZyBpZGVudGlmaW5nIHR5cGUsIGUuZy4gZHdhcmY6OlRBR192b2xhdGlsZV90eXBlCisgICAgLy8vIFxwYXJhbSBGcm9tVHkgICAgICBCYXNlIFR5cGUuCisgICAgRElEZXJpdmVkVHlwZSAqY3JlYXRlUXVhbGlmaWVkVHlwZSh1bnNpZ25lZCBUYWcsIERJVHlwZSAqRnJvbVR5KTsKKworICAgIC8vLyBDcmVhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGVudHJ5IGZvciBhIHBvaW50ZXIuCisgICAgLy8vIFxwYXJhbSBQb2ludGVlVHkgICAgICAgICBUeXBlIHBvaW50ZWQgYnkgdGhpcyBwb2ludGVyLgorICAgIC8vLyBccGFyYW0gU2l6ZUluQml0cyAgICAgICAgU2l6ZS4KKyAgICAvLy8gXHBhcmFtIEFsaWduSW5CaXRzICAgICAgIEFsaWdubWVudC4gKG9wdGlvbmFsKQorICAgIC8vLyBccGFyYW0gRFdBUkZBZGRyZXNzU3BhY2UgRFdBUkYgYWRkcmVzcyBzcGFjZS4gKG9wdGlvbmFsKQorICAgIC8vLyBccGFyYW0gTmFtZSAgICAgICAgICAgICAgUG9pbnRlciB0eXBlIG5hbWUuIChvcHRpb25hbCkKKyAgICBESURlcml2ZWRUeXBlICpjcmVhdGVQb2ludGVyVHlwZShESVR5cGUgKlBvaW50ZWVUeSwgdWludDY0X3QgU2l6ZUluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBbGlnbkluQml0cyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8dW5zaWduZWQ+IERXQVJGQWRkcmVzc1NwYWNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSA9ICIiKTsKKworICAgIC8vLyBDcmVhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGVudHJ5IGZvciBhIHBvaW50ZXIgdG8gbWVtYmVyLgorICAgIC8vLyBccGFyYW0gUG9pbnRlZVR5IFR5cGUgcG9pbnRlZCB0byBieSB0aGlzIHBvaW50ZXIuCisgICAgLy8vIFxwYXJhbSBTaXplSW5CaXRzICBTaXplLgorICAgIC8vLyBccGFyYW0gQWxpZ25JbkJpdHMgQWxpZ25tZW50LiAob3B0aW9uYWwpCisgICAgLy8vIFxwYXJhbSBDbGFzcyBUeXBlIGZvciB3aGljaCB0aGlzIHBvaW50ZXIgcG9pbnRzIHRvIG1lbWJlcnMgb2YuCisgICAgRElEZXJpdmVkVHlwZSAqCisgICAgY3JlYXRlTWVtYmVyUG9pbnRlclR5cGUoRElUeXBlICpQb2ludGVlVHksIERJVHlwZSAqQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZUluQml0cywgdWludDMyX3QgQWxpZ25JbkJpdHMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJTm9kZTo6RElGbGFncyBGbGFncyA9IERJTm9kZTo6RmxhZ1plcm8pOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIGEgYysrCisgICAgLy8vIHN0eWxlIHJlZmVyZW5jZSBvciBydmFsdWUgcmVmZXJlbmNlIHR5cGUuCisgICAgRElEZXJpdmVkVHlwZSAqY3JlYXRlUmVmZXJlbmNlVHlwZSh1bnNpZ25lZCBUYWcsIERJVHlwZSAqUlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZUluQml0cyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBbGlnbkluQml0cyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDx1bnNpZ25lZD4gRFdBUkZBZGRyZXNzU3BhY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIGEgdHlwZWRlZi4KKyAgICAvLy8gXHBhcmFtIFR5ICAgICAgICAgIE9yaWdpbmFsIHR5cGUuCisgICAgLy8vIFxwYXJhbSBOYW1lICAgICAgICBUeXBlZGVmIG5hbWUuCisgICAgLy8vIFxwYXJhbSBGaWxlICAgICAgICBGaWxlIHdoZXJlIHRoaXMgdHlwZSBpcyBkZWZpbmVkLgorICAgIC8vLyBccGFyYW0gTGluZU5vICAgICAgTGluZSBudW1iZXIuCisgICAgLy8vIFxwYXJhbSBDb250ZXh0ICAgICBUaGUgc3Vycm91bmRpbmcgY29udGV4dCBmb3IgdGhlIHR5cGVkZWYuCisgICAgRElEZXJpdmVkVHlwZSAqY3JlYXRlVHlwZWRlZihESVR5cGUgKlR5LCBTdHJpbmdSZWYgTmFtZSwgRElGaWxlICpGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZU5vLCBESVNjb3BlICpDb250ZXh0KTsKKworICAgIC8vLyBDcmVhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGVudHJ5IGZvciBhICdmcmllbmQnLgorICAgIERJRGVyaXZlZFR5cGUgKmNyZWF0ZUZyaWVuZChESVR5cGUgKlR5LCBESVR5cGUgKkZyaWVuZFR5KTsKKworICAgIC8vLyBDcmVhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGVudHJ5IHRvIGVzdGFibGlzaAorICAgIC8vLyBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gdHlwZXMuCisgICAgLy8vIFxwYXJhbSBUeSAgICAgICAgICAgT3JpZ2luYWwgdHlwZS4KKyAgICAvLy8gXHBhcmFtIEJhc2VUeSAgICAgICBCYXNlIHR5cGUuIFR5IGlzIGluaGVyaXRzIGZyb20gYmFzZS4KKyAgICAvLy8gXHBhcmFtIEJhc2VPZmZzZXQgICBCYXNlIG9mZnNldC4KKyAgICAvLy8gXHBhcmFtIEZsYWdzICAgICAgICBGbGFncyB0byBkZXNjcmliZSBpbmhlcml0YW5jZSBhdHRyaWJ1dGUsCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgZS5nLiBwcml2YXRlCisgICAgRElEZXJpdmVkVHlwZSAqY3JlYXRlSW5oZXJpdGFuY2UoRElUeXBlICpUeSwgRElUeXBlICpCYXNlVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQmFzZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESU5vZGU6OkRJRmxhZ3MgRmxhZ3MpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIGEgbWVtYmVyLgorICAgIC8vLyBccGFyYW0gU2NvcGUgICAgICAgIE1lbWJlciBzY29wZS4KKyAgICAvLy8gXHBhcmFtIE5hbWUgICAgICAgICBNZW1iZXIgbmFtZS4KKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgICAgICBGaWxlIHdoZXJlIHRoaXMgbWVtYmVyIGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBMaW5lTm8gICAgICAgTGluZSBudW1iZXIuCisgICAgLy8vIFxwYXJhbSBTaXplSW5CaXRzICAgTWVtYmVyIHNpemUuCisgICAgLy8vIFxwYXJhbSBBbGlnbkluQml0cyAgTWVtYmVyIGFsaWdubWVudC4KKyAgICAvLy8gXHBhcmFtIE9mZnNldEluQml0cyBNZW1iZXIgb2Zmc2V0LgorICAgIC8vLyBccGFyYW0gRmxhZ3MgICAgICAgIEZsYWdzIHRvIGVuY29kZSBtZW1iZXIgYXR0cmlidXRlLCBlLmcuIHByaXZhdGUKKyAgICAvLy8gXHBhcmFtIFR5ICAgICAgICAgICBQYXJlbnQgdHlwZS4KKyAgICBESURlcml2ZWRUeXBlICpjcmVhdGVNZW1iZXJUeXBlKERJU2NvcGUgKlNjb3BlLCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZUluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFsaWduSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0SW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElOb2RlOjpESUZsYWdzIEZsYWdzLCBESVR5cGUgKlR5KTsKKworICAgIC8vLyBDcmVhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGVudHJ5IGZvciBhIHZhcmlhbnQuICBBIHZhcmlhbnQKKyAgICAvLy8gbm9ybWFsbHkgc2hvdWxkIGJlIGEgbWVtYmVyIG9mIGEgdmFyaWFudCBwYXJ0LgorICAgIC8vLyBccGFyYW0gU2NvcGUgICAgICAgIE1lbWJlciBzY29wZS4KKyAgICAvLy8gXHBhcmFtIE5hbWUgICAgICAgICBNZW1iZXIgbmFtZS4KKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgICAgICBGaWxlIHdoZXJlIHRoaXMgbWVtYmVyIGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBMaW5lTm8gICAgICAgTGluZSBudW1iZXIuCisgICAgLy8vIFxwYXJhbSBTaXplSW5CaXRzICAgTWVtYmVyIHNpemUuCisgICAgLy8vIFxwYXJhbSBBbGlnbkluQml0cyAgTWVtYmVyIGFsaWdubWVudC4KKyAgICAvLy8gXHBhcmFtIE9mZnNldEluQml0cyBNZW1iZXIgb2Zmc2V0LgorICAgIC8vLyBccGFyYW0gRmxhZ3MgICAgICAgIEZsYWdzIHRvIGVuY29kZSBtZW1iZXIgYXR0cmlidXRlLCBlLmcuIHByaXZhdGUKKyAgICAvLy8gXHBhcmFtIERpc2NyaW1pbmFudCBUaGUgZGlzY3JpbWluYW50IGZvciB0aGlzIGJyYW5jaDsgbnVsbCBmb3IKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBicmFuY2gKKyAgICAvLy8gXHBhcmFtIFR5ICAgICAgICAgICBQYXJlbnQgdHlwZS4KKyAgICBESURlcml2ZWRUeXBlICpjcmVhdGVWYXJpYW50TWVtYmVyVHlwZShESVNjb3BlICpTY29wZSwgU3RyaW5nUmVmIE5hbWUsCisJCQkJCSAgIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZU5vLAorCQkJCQkgICB1aW50NjRfdCBTaXplSW5CaXRzLAorCQkJCQkgICB1aW50MzJfdCBBbGlnbkluQml0cywKKwkJCQkJICAgdWludDY0X3QgT2Zmc2V0SW5CaXRzLAorCQkJCQkgICBDb25zdGFudCAqRGlzY3JpbWluYW50LAorCQkJCQkgICBESU5vZGU6OkRJRmxhZ3MgRmxhZ3MsIERJVHlwZSAqVHkpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIGEgYml0IGZpZWxkIG1lbWJlci4KKyAgICAvLy8gXHBhcmFtIFNjb3BlICAgICAgICAgICAgICAgTWVtYmVyIHNjb3BlLgorICAgIC8vLyBccGFyYW0gTmFtZSAgICAgICAgICAgICAgICBNZW1iZXIgbmFtZS4KKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgICAgICAgICAgICAgRmlsZSB3aGVyZSB0aGlzIG1lbWJlciBpcyBkZWZpbmVkLgorICAgIC8vLyBccGFyYW0gTGluZU5vICAgICAgICAgICAgICBMaW5lIG51bWJlci4KKyAgICAvLy8gXHBhcmFtIFNpemVJbkJpdHMgICAgICAgICAgTWVtYmVyIHNpemUuCisgICAgLy8vIFxwYXJhbSBPZmZzZXRJbkJpdHMgICAgICAgIE1lbWJlciBvZmZzZXQuCisgICAgLy8vIFxwYXJhbSBTdG9yYWdlT2Zmc2V0SW5CaXRzIE1lbWJlciBzdG9yYWdlIG9mZnNldC4KKyAgICAvLy8gXHBhcmFtIEZsYWdzICAgICAgICAgICAgICAgRmxhZ3MgdG8gZW5jb2RlIG1lbWJlciBhdHRyaWJ1dGUuCisgICAgLy8vIFxwYXJhbSBUeSAgICAgICAgICAgICAgICAgIFBhcmVudCB0eXBlLgorICAgIERJRGVyaXZlZFR5cGUgKmNyZWF0ZUJpdEZpZWxkTWVtYmVyVHlwZSgKKyAgICAgICAgRElTY29wZSAqU2NvcGUsIFN0cmluZ1JlZiBOYW1lLCBESUZpbGUgKkZpbGUsIHVuc2lnbmVkIExpbmVObywKKyAgICAgICAgdWludDY0X3QgU2l6ZUluQml0cywgdWludDY0X3QgT2Zmc2V0SW5CaXRzLAorICAgICAgICB1aW50NjRfdCBTdG9yYWdlT2Zmc2V0SW5CaXRzLCBESU5vZGU6OkRJRmxhZ3MgRmxhZ3MsIERJVHlwZSAqVHkpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIGEKKyAgICAvLy8gQysrIHN0YXRpYyBkYXRhIG1lbWJlci4KKyAgICAvLy8gXHBhcmFtIFNjb3BlICAgICAgTWVtYmVyIHNjb3BlLgorICAgIC8vLyBccGFyYW0gTmFtZSAgICAgICBNZW1iZXIgbmFtZS4KKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgICAgRmlsZSB3aGVyZSB0aGlzIG1lbWJlciBpcyBkZWNsYXJlZC4KKyAgICAvLy8gXHBhcmFtIExpbmVObyAgICAgTGluZSBudW1iZXIuCisgICAgLy8vIFxwYXJhbSBUeSAgICAgICAgIFR5cGUgb2YgdGhlIHN0YXRpYyBtZW1iZXIuCisgICAgLy8vIFxwYXJhbSBGbGFncyAgICAgIEZsYWdzIHRvIGVuY29kZSBtZW1iZXIgYXR0cmlidXRlLCBlLmcuIHByaXZhdGUuCisgICAgLy8vIFxwYXJhbSBWYWwgICAgICAgIENvbnN0IGluaXRpYWxpemVyIG9mIHRoZSBtZW1iZXIuCisgICAgLy8vIFxwYXJhbSBBbGlnbkluQml0cyAgTWVtYmVyIGFsaWdubWVudC4KKyAgICBESURlcml2ZWRUeXBlICpjcmVhdGVTdGF0aWNNZW1iZXJUeXBlKERJU2NvcGUgKlNjb3BlLCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElUeXBlICpUeSwgRElOb2RlOjpESUZsYWdzIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFsaWduSW5CaXRzID0gMCk7CisKKyAgICAvLy8gQ3JlYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBlbnRyeSBmb3IgT2JqZWN0aXZlLUMKKyAgICAvLy8gaW5zdGFuY2UgdmFyaWFibGUuCisgICAgLy8vIFxwYXJhbSBOYW1lICAgICAgICAgTWVtYmVyIG5hbWUuCisgICAgLy8vIFxwYXJhbSBGaWxlICAgICAgICAgRmlsZSB3aGVyZSB0aGlzIG1lbWJlciBpcyBkZWZpbmVkLgorICAgIC8vLyBccGFyYW0gTGluZU5vICAgICAgIExpbmUgbnVtYmVyLgorICAgIC8vLyBccGFyYW0gU2l6ZUluQml0cyAgIE1lbWJlciBzaXplLgorICAgIC8vLyBccGFyYW0gQWxpZ25JbkJpdHMgIE1lbWJlciBhbGlnbm1lbnQuCisgICAgLy8vIFxwYXJhbSBPZmZzZXRJbkJpdHMgTWVtYmVyIG9mZnNldC4KKyAgICAvLy8gXHBhcmFtIEZsYWdzICAgICAgICBGbGFncyB0byBlbmNvZGUgbWVtYmVyIGF0dHJpYnV0ZSwgZS5nLiBwcml2YXRlCisgICAgLy8vIFxwYXJhbSBUeSAgICAgICAgICAgUGFyZW50IHR5cGUuCisgICAgLy8vIFxwYXJhbSBQcm9wZXJ0eU5vZGUgUHJvcGVydHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaXZhci4KKyAgICBESURlcml2ZWRUeXBlICpjcmVhdGVPYmpDSVZhcihTdHJpbmdSZWYgTmFtZSwgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZUluQml0cywgdWludDMyX3QgQWxpZ25JbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0SW5CaXRzLCBESU5vZGU6OkRJRmxhZ3MgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElUeXBlICpUeSwgTUROb2RlICpQcm9wZXJ0eU5vZGUpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIE9iamVjdGl2ZS1DCisgICAgLy8vIHByb3BlcnR5LgorICAgIC8vLyBccGFyYW0gTmFtZSAgICAgICAgIFByb3BlcnR5IG5hbWUuCisgICAgLy8vIFxwYXJhbSBGaWxlICAgICAgICAgRmlsZSB3aGVyZSB0aGlzIHByb3BlcnR5IGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBMaW5lTnVtYmVyICAgTGluZSBudW1iZXIuCisgICAgLy8vIFxwYXJhbSBHZXR0ZXJOYW1lICAgTmFtZSBvZiB0aGUgT2JqZWN0aXZlIEMgcHJvcGVydHkgZ2V0dGVyIHNlbGVjdG9yLgorICAgIC8vLyBccGFyYW0gU2V0dGVyTmFtZSAgIE5hbWUgb2YgdGhlIE9iamVjdGl2ZSBDIHByb3BlcnR5IHNldHRlciBzZWxlY3Rvci4KKyAgICAvLy8gXHBhcmFtIFByb3BlcnR5QXR0cmlidXRlcyBPYmplY3RpdmUgQyBwcm9wZXJ0eSBhdHRyaWJ1dGVzLgorICAgIC8vLyBccGFyYW0gVHkgICAgICAgICAgIFR5cGUuCisgICAgRElPYmpDUHJvcGVydHkgKmNyZWF0ZU9iakNQcm9wZXJ0eShTdHJpbmdSZWYgTmFtZSwgRElGaWxlICpGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBHZXR0ZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNldHRlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQcm9wZXJ0eUF0dHJpYnV0ZXMsIERJVHlwZSAqVHkpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIGEgY2xhc3MuCisgICAgLy8vIFxwYXJhbSBTY29wZSAgICAgICAgU2NvcGUgaW4gd2hpY2ggdGhpcyBjbGFzcyBpcyBkZWZpbmVkLgorICAgIC8vLyBccGFyYW0gTmFtZSAgICAgICAgIGNsYXNzIG5hbWUuCisgICAgLy8vIFxwYXJhbSBGaWxlICAgICAgICAgRmlsZSB3aGVyZSB0aGlzIG1lbWJlciBpcyBkZWZpbmVkLgorICAgIC8vLyBccGFyYW0gTGluZU51bWJlciAgIExpbmUgbnVtYmVyLgorICAgIC8vLyBccGFyYW0gU2l6ZUluQml0cyAgIE1lbWJlciBzaXplLgorICAgIC8vLyBccGFyYW0gQWxpZ25JbkJpdHMgIE1lbWJlciBhbGlnbm1lbnQuCisgICAgLy8vIFxwYXJhbSBPZmZzZXRJbkJpdHMgTWVtYmVyIG9mZnNldC4KKyAgICAvLy8gXHBhcmFtIEZsYWdzICAgICAgICBGbGFncyB0byBlbmNvZGUgbWVtYmVyIGF0dHJpYnV0ZSwgZS5nLiBwcml2YXRlCisgICAgLy8vIFxwYXJhbSBFbGVtZW50cyAgICAgY2xhc3MgbWVtYmVycy4KKyAgICAvLy8gXHBhcmFtIFZUYWJsZUhvbGRlciBEZWJ1ZyBpbmZvIG9mIHRoZSBiYXNlIGNsYXNzIHRoYXQgY29udGFpbnMgdnRhYmxlCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgdHlwZS4gVGhpcyBpcyB1c2VkIGluCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgRFdfQVRfY29udGFpbmluZ190eXBlLiBTZWUgRFdBUkYgZG9jdW1lbnRhdGlvbgorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIGZvciBtb3JlIGluZm8uCisgICAgLy8vIFxwYXJhbSBUZW1wbGF0ZVBhcm1zIFRlbXBsYXRlIHR5cGUgcGFyYW1ldGVycy4KKyAgICAvLy8gXHBhcmFtIFVuaXF1ZUlkZW50aWZpZXIgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNsYXNzLgorICAgIERJQ29tcG9zaXRlVHlwZSAqY3JlYXRlQ2xhc3NUeXBlKAorICAgICAgICBESVNjb3BlICpTY29wZSwgU3RyaW5nUmVmIE5hbWUsIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZU51bWJlciwKKyAgICAgICAgdWludDY0X3QgU2l6ZUluQml0cywgdWludDMyX3QgQWxpZ25JbkJpdHMsIHVpbnQ2NF90IE9mZnNldEluQml0cywKKyAgICAgICAgRElOb2RlOjpESUZsYWdzIEZsYWdzLCBESVR5cGUgKkRlcml2ZWRGcm9tLCBESU5vZGVBcnJheSBFbGVtZW50cywKKyAgICAgICAgRElUeXBlICpWVGFibGVIb2xkZXIgPSBudWxscHRyLCBNRE5vZGUgKlRlbXBsYXRlUGFybXMgPSBudWxscHRyLAorICAgICAgICBTdHJpbmdSZWYgVW5pcXVlSWRlbnRpZmllciA9ICIiKTsKKworICAgIC8vLyBDcmVhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGVudHJ5IGZvciBhIHN0cnVjdC4KKyAgICAvLy8gXHBhcmFtIFNjb3BlICAgICAgICBTY29wZSBpbiB3aGljaCB0aGlzIHN0cnVjdCBpcyBkZWZpbmVkLgorICAgIC8vLyBccGFyYW0gTmFtZSAgICAgICAgIFN0cnVjdCBuYW1lLgorICAgIC8vLyBccGFyYW0gRmlsZSAgICAgICAgIEZpbGUgd2hlcmUgdGhpcyBtZW1iZXIgaXMgZGVmaW5lZC4KKyAgICAvLy8gXHBhcmFtIExpbmVOdW1iZXIgICBMaW5lIG51bWJlci4KKyAgICAvLy8gXHBhcmFtIFNpemVJbkJpdHMgICBNZW1iZXIgc2l6ZS4KKyAgICAvLy8gXHBhcmFtIEFsaWduSW5CaXRzICBNZW1iZXIgYWxpZ25tZW50LgorICAgIC8vLyBccGFyYW0gRmxhZ3MgICAgICAgIEZsYWdzIHRvIGVuY29kZSBtZW1iZXIgYXR0cmlidXRlLCBlLmcuIHByaXZhdGUKKyAgICAvLy8gXHBhcmFtIEVsZW1lbnRzICAgICBTdHJ1Y3QgZWxlbWVudHMuCisgICAgLy8vIFxwYXJhbSBSdW5UaW1lTGFuZyAgT3B0aW9uYWwgcGFyYW1ldGVyLCBPYmplY3RpdmUtQyBydW50aW1lIHZlcnNpb24uCisgICAgLy8vIFxwYXJhbSBVbmlxdWVJZGVudGlmaWVyIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzdHJ1Y3QuCisgICAgRElDb21wb3NpdGVUeXBlICpjcmVhdGVTdHJ1Y3RUeXBlKAorICAgICAgICBESVNjb3BlICpTY29wZSwgU3RyaW5nUmVmIE5hbWUsIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZU51bWJlciwKKyAgICAgICAgdWludDY0X3QgU2l6ZUluQml0cywgdWludDMyX3QgQWxpZ25JbkJpdHMsIERJTm9kZTo6RElGbGFncyBGbGFncywKKyAgICAgICAgRElUeXBlICpEZXJpdmVkRnJvbSwgRElOb2RlQXJyYXkgRWxlbWVudHMsIHVuc2lnbmVkIFJ1blRpbWVMYW5nID0gMCwKKyAgICAgICAgRElUeXBlICpWVGFibGVIb2xkZXIgPSBudWxscHRyLCBTdHJpbmdSZWYgVW5pcXVlSWRlbnRpZmllciA9ICIiKTsKKworICAgIC8vLyBDcmVhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGVudHJ5IGZvciBhbiB1bmlvbi4KKyAgICAvLy8gXHBhcmFtIFNjb3BlICAgICAgICBTY29wZSBpbiB3aGljaCB0aGlzIHVuaW9uIGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBOYW1lICAgICAgICAgVW5pb24gbmFtZS4KKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgICAgICBGaWxlIHdoZXJlIHRoaXMgbWVtYmVyIGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBMaW5lTnVtYmVyICAgTGluZSBudW1iZXIuCisgICAgLy8vIFxwYXJhbSBTaXplSW5CaXRzICAgTWVtYmVyIHNpemUuCisgICAgLy8vIFxwYXJhbSBBbGlnbkluQml0cyAgTWVtYmVyIGFsaWdubWVudC4KKyAgICAvLy8gXHBhcmFtIEZsYWdzICAgICAgICBGbGFncyB0byBlbmNvZGUgbWVtYmVyIGF0dHJpYnV0ZSwgZS5nLiBwcml2YXRlCisgICAgLy8vIFxwYXJhbSBFbGVtZW50cyAgICAgVW5pb24gZWxlbWVudHMuCisgICAgLy8vIFxwYXJhbSBSdW5UaW1lTGFuZyAgT3B0aW9uYWwgcGFyYW1ldGVyLCBPYmplY3RpdmUtQyBydW50aW1lIHZlcnNpb24uCisgICAgLy8vIFxwYXJhbSBVbmlxdWVJZGVudGlmaWVyIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB1bmlvbi4KKyAgICBESUNvbXBvc2l0ZVR5cGUgKmNyZWF0ZVVuaW9uVHlwZShESVNjb3BlICpTY29wZSwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemVJbkJpdHMsIHVpbnQzMl90IEFsaWduSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJTm9kZTo6RElGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESU5vZGVBcnJheSBFbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSdW5UaW1lTGFuZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFVuaXF1ZUlkZW50aWZpZXIgPSAiIik7CisKKyAgICAvLy8gQ3JlYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBlbnRyeSBmb3IgYSB2YXJpYW50IHBhcnQuICBBCisgICAgLy8vIHZhcmlhbnQgcGFydCBub3JtYWxseSBoYXMgYSBkaXNjcmltaW5hdG9yICh0aG91Z2ggdGhpcyBpcyBub3QKKyAgICAvLy8gcmVxdWlyZWQpIGFuZCBhIG51bWJlciBvZiB2YXJpYW50IGNoaWxkcmVuLgorICAgIC8vLyBccGFyYW0gU2NvcGUgICAgICAgIFNjb3BlIGluIHdoaWNoIHRoaXMgdW5pb24gaXMgZGVmaW5lZC4KKyAgICAvLy8gXHBhcmFtIE5hbWUgICAgICAgICBVbmlvbiBuYW1lLgorICAgIC8vLyBccGFyYW0gRmlsZSAgICAgICAgIEZpbGUgd2hlcmUgdGhpcyBtZW1iZXIgaXMgZGVmaW5lZC4KKyAgICAvLy8gXHBhcmFtIExpbmVOdW1iZXIgICBMaW5lIG51bWJlci4KKyAgICAvLy8gXHBhcmFtIFNpemVJbkJpdHMgICBNZW1iZXIgc2l6ZS4KKyAgICAvLy8gXHBhcmFtIEFsaWduSW5CaXRzICBNZW1iZXIgYWxpZ25tZW50LgorICAgIC8vLyBccGFyYW0gRmxhZ3MgICAgICAgIEZsYWdzIHRvIGVuY29kZSBtZW1iZXIgYXR0cmlidXRlLCBlLmcuIHByaXZhdGUKKyAgICAvLy8gXHBhcmFtIERpc2NyaW1pbmF0b3IgRGlzY3JpbWluYW50IG1lbWJlcgorICAgIC8vLyBccGFyYW0gRWxlbWVudHMgICAgIFZhcmlhbnQgZWxlbWVudHMuCisgICAgLy8vIFxwYXJhbSBVbmlxdWVJZGVudGlmaWVyIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB1bmlvbi4KKyAgICBESUNvbXBvc2l0ZVR5cGUgKmNyZWF0ZVZhcmlhbnRQYXJ0KERJU2NvcGUgKlNjb3BlLCBTdHJpbmdSZWYgTmFtZSwKKwkJCQkgICAgICAgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lTnVtYmVyLAorCQkJCSAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLCB1aW50MzJfdCBBbGlnbkluQml0cywKKwkJCQkgICAgICAgRElOb2RlOjpESUZsYWdzIEZsYWdzLAorCQkJCSAgICAgICBESURlcml2ZWRUeXBlICpEaXNjcmltaW5hdG9yLAorCQkJCSAgICAgICBESU5vZGVBcnJheSBFbGVtZW50cywKKwkJCQkgICAgICAgU3RyaW5nUmVmIFVuaXF1ZUlkZW50aWZpZXIgPSAiIik7CisKKyAgICAvLy8gQ3JlYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGVtcGxhdGUKKyAgICAvLy8gdHlwZSBwYXJhbWV0ZXIuCisgICAgLy8vIFxwYXJhbSBTY29wZSAgICAgICAgU2NvcGUgaW4gd2hpY2ggdGhpcyB0eXBlIGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBOYW1lICAgICAgICAgVHlwZSBwYXJhbWV0ZXIgbmFtZS4KKyAgICAvLy8gXHBhcmFtIFR5ICAgICAgICAgICBQYXJhbWV0ZXIgdHlwZS4KKyAgICBESVRlbXBsYXRlVHlwZVBhcmFtZXRlciAqCisgICAgY3JlYXRlVGVtcGxhdGVUeXBlUGFyYW1ldGVyKERJU2NvcGUgKlNjb3BlLCBTdHJpbmdSZWYgTmFtZSwgRElUeXBlICpUeSk7CisKKyAgICAvLy8gQ3JlYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGVtcGxhdGUKKyAgICAvLy8gdmFsdWUgcGFyYW1ldGVyLgorICAgIC8vLyBccGFyYW0gU2NvcGUgICAgICAgIFNjb3BlIGluIHdoaWNoIHRoaXMgdHlwZSBpcyBkZWZpbmVkLgorICAgIC8vLyBccGFyYW0gTmFtZSAgICAgICAgIFZhbHVlIHBhcmFtZXRlciBuYW1lLgorICAgIC8vLyBccGFyYW0gVHkgICAgICAgICAgIFBhcmFtZXRlciB0eXBlLgorICAgIC8vLyBccGFyYW0gVmFsICAgICAgICAgIENvbnN0YW50IHBhcmFtZXRlciB2YWx1ZS4KKyAgICBESVRlbXBsYXRlVmFsdWVQYXJhbWV0ZXIgKmNyZWF0ZVRlbXBsYXRlVmFsdWVQYXJhbWV0ZXIoRElTY29wZSAqU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqVmFsKTsKKworICAgIC8vLyBDcmVhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBhIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlci4KKyAgICAvLy8gXHBhcmFtIFNjb3BlICAgICAgICBTY29wZSBpbiB3aGljaCB0aGlzIHR5cGUgaXMgZGVmaW5lZC4KKyAgICAvLy8gXHBhcmFtIE5hbWUgICAgICAgICBWYWx1ZSBwYXJhbWV0ZXIgbmFtZS4KKyAgICAvLy8gXHBhcmFtIFR5ICAgICAgICAgICBQYXJhbWV0ZXIgdHlwZS4KKyAgICAvLy8gXHBhcmFtIFZhbCAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHRlbXBsYXRlLgorICAgIERJVGVtcGxhdGVWYWx1ZVBhcmFtZXRlciAqY3JlYXRlVGVtcGxhdGVUZW1wbGF0ZVBhcmFtZXRlcihESVNjb3BlICpTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBWYWwpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGEgdGVtcGxhdGUgcGFyYW1ldGVyIHBhY2suCisgICAgLy8vIFxwYXJhbSBTY29wZSAgICAgICAgU2NvcGUgaW4gd2hpY2ggdGhpcyB0eXBlIGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBOYW1lICAgICAgICAgVmFsdWUgcGFyYW1ldGVyIG5hbWUuCisgICAgLy8vIFxwYXJhbSBUeSAgICAgICAgICAgUGFyYW1ldGVyIHR5cGUuCisgICAgLy8vIFxwYXJhbSBWYWwgICAgICAgICAgQW4gYXJyYXkgb2YgdHlwZXMgaW4gdGhlIHBhY2suCisgICAgRElUZW1wbGF0ZVZhbHVlUGFyYW1ldGVyICpjcmVhdGVUZW1wbGF0ZVBhcmFtZXRlclBhY2soRElTY29wZSAqU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESU5vZGVBcnJheSBWYWwpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIGFuIGFycmF5LgorICAgIC8vLyBccGFyYW0gU2l6ZSAgICAgICAgIEFycmF5IHNpemUuCisgICAgLy8vIFxwYXJhbSBBbGlnbkluQml0cyAgQWxpZ25tZW50LgorICAgIC8vLyBccGFyYW0gVHkgICAgICAgICAgIEVsZW1lbnQgdHlwZS4KKyAgICAvLy8gXHBhcmFtIFN1YnNjcmlwdHMgICBTdWJzY3JpcHRzLgorICAgIERJQ29tcG9zaXRlVHlwZSAqY3JlYXRlQXJyYXlUeXBlKHVpbnQ2NF90IFNpemUsIHVpbnQzMl90IEFsaWduSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJVHlwZSAqVHksIERJTm9kZUFycmF5IFN1YnNjcmlwdHMpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIGEgdmVjdG9yIHR5cGUuCisgICAgLy8vIFxwYXJhbSBTaXplICAgICAgICAgQXJyYXkgc2l6ZS4KKyAgICAvLy8gXHBhcmFtIEFsaWduSW5CaXRzICBBbGlnbm1lbnQuCisgICAgLy8vIFxwYXJhbSBUeSAgICAgICAgICAgRWxlbWVudCB0eXBlLgorICAgIC8vLyBccGFyYW0gU3Vic2NyaXB0cyAgIFN1YnNjcmlwdHMuCisgICAgRElDb21wb3NpdGVUeXBlICpjcmVhdGVWZWN0b3JUeXBlKHVpbnQ2NF90IFNpemUsIHVpbnQzMl90IEFsaWduSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVR5cGUgKlR5LCBESU5vZGVBcnJheSBTdWJzY3JpcHRzKTsKKworICAgIC8vLyBDcmVhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGVudHJ5IGZvciBhbgorICAgIC8vLyBlbnVtZXJhdGlvbi4KKyAgICAvLy8gXHBhcmFtIFNjb3BlICAgICAgICAgIFNjb3BlIGluIHdoaWNoIHRoaXMgZW51bWVyYXRpb24gaXMgZGVmaW5lZC4KKyAgICAvLy8gXHBhcmFtIE5hbWUgICAgICAgICAgIFVuaW9uIG5hbWUuCisgICAgLy8vIFxwYXJhbSBGaWxlICAgICAgICAgICBGaWxlIHdoZXJlIHRoaXMgbWVtYmVyIGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBMaW5lTnVtYmVyICAgICBMaW5lIG51bWJlci4KKyAgICAvLy8gXHBhcmFtIFNpemVJbkJpdHMgICAgIE1lbWJlciBzaXplLgorICAgIC8vLyBccGFyYW0gQWxpZ25JbkJpdHMgICAgTWVtYmVyIGFsaWdubWVudC4KKyAgICAvLy8gXHBhcmFtIEVsZW1lbnRzICAgICAgIEVudW1lcmF0aW9uIGVsZW1lbnRzLgorICAgIC8vLyBccGFyYW0gVW5kZXJseWluZ1R5cGUgVW5kZXJseWluZyB0eXBlIG9mIGEgQysrMTEvT2JqQyBmaXhlZCBlbnVtLgorICAgIC8vLyBccGFyYW0gVW5pcXVlSWRlbnRpZmllciBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZW51bS4KKyAgICAvLy8gXHBhcmFtIElzRml4ZWQgQm9vbGVhbiBmbGFnIGluZGljYXRlIGlmIHRoaXMgaXMgQysrMTEvT2JqQyBmaXhlZCBlbnVtLgorICAgIERJQ29tcG9zaXRlVHlwZSAqY3JlYXRlRW51bWVyYXRpb25UeXBlKAorICAgICAgICBESVNjb3BlICpTY29wZSwgU3RyaW5nUmVmIE5hbWUsIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZU51bWJlciwKKyAgICAgICAgdWludDY0X3QgU2l6ZUluQml0cywgdWludDMyX3QgQWxpZ25JbkJpdHMsIERJTm9kZUFycmF5IEVsZW1lbnRzLAorICAgICAgICBESVR5cGUgKlVuZGVybHlpbmdUeXBlLCBTdHJpbmdSZWYgVW5pcXVlSWRlbnRpZmllciA9ICIiLCBib29sIElzRml4ZWQgPSBmYWxzZSk7CisKKyAgICAvLy8gQ3JlYXRlIHN1YnJvdXRpbmUgdHlwZS4KKyAgICAvLy8gXHBhcmFtIFBhcmFtZXRlclR5cGVzICBBbiBhcnJheSBvZiBzdWJyb3V0aW5lIHBhcmFtZXRlciB0eXBlcy4gVGhpcworICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzIHJldHVybiB0eXBlIGF0IDB0aCBpbmRleC4KKyAgICAvLy8gXHBhcmFtIEZsYWdzICAgICAgICAgICBFLmcuOiBMVmFsdWVSZWZlcmVuY2UuCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgVGhlc2UgZmxhZ3MgYXJlIHVzZWQgdG8gZW1pdCBkd2FyZiBhdHRyaWJ1dGVzLgorICAgIC8vLyBccGFyYW0gQ0MgICAgICAgICAgICAgIENhbGxpbmcgY29udmVudGlvbiwgZS5nLiBkd2FyZjo6RFdfQ0Nfbm9ybWFsCisgICAgRElTdWJyb3V0aW5lVHlwZSAqCisgICAgY3JlYXRlU3Vicm91dGluZVR5cGUoRElUeXBlUmVmQXJyYXkgUGFyYW1ldGVyVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRElOb2RlOjpESUZsYWdzIEZsYWdzID0gRElOb2RlOjpGbGFnWmVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDQyA9IDApOworCisgICAgLy8vIENyZWF0ZSBhIG5ldyBESVR5cGUqIHdpdGggImFydGlmaWNpYWwiIGZsYWcgc2V0LgorICAgIERJVHlwZSAqY3JlYXRlQXJ0aWZpY2lhbFR5cGUoRElUeXBlICpUeSk7CisKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IERJVHlwZSogd2l0aCB0aGUgIm9iamVjdCBwb2ludGVyIgorICAgIC8vLyBmbGFnIHNldC4KKyAgICBESVR5cGUgKmNyZWF0ZU9iamVjdFBvaW50ZXJUeXBlKERJVHlwZSAqVHkpOworCisgICAgLy8vIENyZWF0ZSBhIHBlcm1hbmVudCBmb3J3YXJkLWRlY2xhcmVkIHR5cGUuCisgICAgRElDb21wb3NpdGVUeXBlICpjcmVhdGVGb3J3YXJkRGVjbCh1bnNpZ25lZCBUYWcsIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTY29wZSAqU2NvcGUsIERJRmlsZSAqRiwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJ1bnRpbWVMYW5nID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemVJbkJpdHMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWxpZ25JbkJpdHMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFVuaXF1ZUlkZW50aWZpZXIgPSAiIik7CisKKyAgICAvLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGZvcndhcmQtZGVjbGFyZWQgdHlwZS4KKyAgICBESUNvbXBvc2l0ZVR5cGUgKmNyZWF0ZVJlcGxhY2VhYmxlQ29tcG9zaXRlVHlwZSgKKyAgICAgICAgdW5zaWduZWQgVGFnLCBTdHJpbmdSZWYgTmFtZSwgRElTY29wZSAqU2NvcGUsIERJRmlsZSAqRiwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgdW5zaWduZWQgUnVudGltZUxhbmcgPSAwLCB1aW50NjRfdCBTaXplSW5CaXRzID0gMCwKKyAgICAgICAgdWludDMyX3QgQWxpZ25JbkJpdHMgPSAwLCBESU5vZGU6OkRJRmxhZ3MgRmxhZ3MgPSBESU5vZGU6OkZsYWdGd2REZWNsLAorICAgICAgICBTdHJpbmdSZWYgVW5pcXVlSWRlbnRpZmllciA9ICIiKTsKKworICAgIC8vLyBSZXRhaW4gRElTY29wZSogaW4gYSBtb2R1bGUgZXZlbiBpZiBpdCBpcyBub3QgcmVmZXJlbmNlZAorICAgIC8vLyB0aHJvdWdoIGRlYnVnIGluZm8gYW5jaG9ycy4KKyAgICB2b2lkIHJldGFpblR5cGUoRElTY29wZSAqVCk7CisKKyAgICAvLy8gQ3JlYXRlIHVuc3BlY2lmaWVkIHBhcmFtZXRlciB0eXBlCisgICAgLy8vIGZvciBhIHN1YnJvdXRpbmUgdHlwZS4KKyAgICBESUJhc2ljVHlwZSAqY3JlYXRlVW5zcGVjaWZpZWRQYXJhbWV0ZXIoKTsKKworICAgIC8vLyBHZXQgYSBESU5vZGVBcnJheSwgY3JlYXRlIG9uZSBpZiByZXF1aXJlZC4KKyAgICBESU5vZGVBcnJheSBnZXRPckNyZWF0ZUFycmF5KEFycmF5UmVmPE1ldGFkYXRhICo+IEVsZW1lbnRzKTsKKworICAgIC8vLyBHZXQgYSBESU1hY3JvTm9kZUFycmF5LCBjcmVhdGUgb25lIGlmIHJlcXVpcmVkLgorICAgIERJTWFjcm9Ob2RlQXJyYXkgZ2V0T3JDcmVhdGVNYWNyb0FycmF5KEFycmF5UmVmPE1ldGFkYXRhICo+IEVsZW1lbnRzKTsKKworICAgIC8vLyBHZXQgYSBESVR5cGVSZWZBcnJheSwgY3JlYXRlIG9uZSBpZiByZXF1aXJlZC4KKyAgICBESVR5cGVSZWZBcnJheSBnZXRPckNyZWF0ZVR5cGVBcnJheShBcnJheVJlZjxNZXRhZGF0YSAqPiBFbGVtZW50cyk7CisKKyAgICAvLy8gQ3JlYXRlIGEgZGVzY3JpcHRvciBmb3IgYSB2YWx1ZSByYW5nZS4gIFRoaXMKKyAgICAvLy8gaW1wbGljaXRseSB1bmlxdWVzIHRoZSB2YWx1ZXMgcmV0dXJuZWQuCisgICAgRElTdWJyYW5nZSAqZ2V0T3JDcmVhdGVTdWJyYW5nZShpbnQ2NF90IExvLCBpbnQ2NF90IENvdW50KTsKKyAgICBESVN1YnJhbmdlICpnZXRPckNyZWF0ZVN1YnJhbmdlKGludDY0X3QgTG8sIE1ldGFkYXRhICpDb3VudE5vZGUpOworCisgICAgLy8vIENyZWF0ZSBhIG5ldyBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIHZhcmlhYmxlLgorICAgIC8vLyBccGFyYW0gQ29udGV4dCAgICAgVmFyaWFibGUgc2NvcGUuCisgICAgLy8vIFxwYXJhbSBOYW1lICAgICAgICBOYW1lIG9mIHRoZSB2YXJpYWJsZS4KKyAgICAvLy8gXHBhcmFtIExpbmthZ2VOYW1lIE1hbmdsZWQgIG5hbWUgb2YgdGhlIHZhcmlhYmxlLgorICAgIC8vLyBccGFyYW0gRmlsZSAgICAgICAgRmlsZSB3aGVyZSB0aGlzIHZhcmlhYmxlIGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBMaW5lTm8gICAgICBMaW5lIG51bWJlci4KKyAgICAvLy8gXHBhcmFtIFR5ICAgICAgICAgIFZhcmlhYmxlIFR5cGUuCisgICAgLy8vIFxwYXJhbSBpc0xvY2FsVG9Vbml0IEJvb2xlYW4gZmxhZyBpbmRpY2F0ZSB3aGV0aGVyIHRoaXMgdmFyaWFibGUgaXMKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxseSB2aXNpYmxlIG9yIG5vdC4KKyAgICAvLy8gXHBhcmFtIEV4cHIgICAgICAgIFRoZSBsb2NhdGlvbiBvZiB0aGUgZ2xvYmFsIHJlbGF0aXZlIHRvIHRoZSBhdHRhY2hlZAorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFyaWFibGUuCisgICAgLy8vIFxwYXJhbSBEZWNsICAgICAgICBSZWZlcmVuY2UgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGVjbGFyYXRpb24uCisgICAgLy8vIFxwYXJhbSBBbGlnbkluQml0cyBWYXJpYWJsZSBhbGlnbm1lbnQob3IgMCBpZiBubyBhbGlnbm1lbnQgYXR0ciB3YXMKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCkKKyAgICBESUdsb2JhbFZhcmlhYmxlRXhwcmVzc2lvbiAqY3JlYXRlR2xvYmFsVmFyaWFibGVFeHByZXNzaW9uKAorICAgICAgICBESVNjb3BlICpDb250ZXh0LCBTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIExpbmthZ2VOYW1lLCBESUZpbGUgKkZpbGUsCisgICAgICAgIHVuc2lnbmVkIExpbmVObywgRElUeXBlICpUeSwgYm9vbCBpc0xvY2FsVG9Vbml0LAorICAgICAgICBESUV4cHJlc3Npb24gKkV4cHIgPSBudWxscHRyLCBNRE5vZGUgKkRlY2wgPSBudWxscHRyLAorICAgICAgICB1aW50MzJfdCBBbGlnbkluQml0cyA9IDApOworCisgICAgLy8vIElkZW50aWNhbCB0byBjcmVhdGVHbG9iYWxWYXJpYWJsZQorICAgIC8vLyBleGNlcHQgdGhhdCB0aGUgcmVzdWx0aW5nIERiZ05vZGUgaXMgdGVtcG9yYXJ5IGFuZCBtZWFudCB0byBiZSBSQVVXZWQuCisgICAgRElHbG9iYWxWYXJpYWJsZSAqY3JlYXRlVGVtcEdsb2JhbFZhcmlhYmxlRndkRGVjbCgKKyAgICAgICAgRElTY29wZSAqQ29udGV4dCwgU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBMaW5rYWdlTmFtZSwgRElGaWxlICpGaWxlLAorICAgICAgICB1bnNpZ25lZCBMaW5lTm8sIERJVHlwZSAqVHksIGJvb2wgaXNMb2NhbFRvVW5pdCwgTUROb2RlICpEZWNsID0gbnVsbHB0ciwKKyAgICAgICAgdWludDMyX3QgQWxpZ25JbkJpdHMgPSAwKTsKKworICAgIC8vLyBDcmVhdGUgYSBuZXcgZGVzY3JpcHRvciBmb3IgYW4gYXV0byB2YXJpYWJsZS4gIFRoaXMgaXMgYSBsb2NhbCB2YXJpYWJsZQorICAgIC8vLyB0aGF0IGlzIG5vdCBhIHN1YnByb2dyYW0gcGFyYW1ldGVyLgorICAgIC8vLworICAgIC8vLyBcYyBTY29wZSBtdXN0IGJlIGEgXGEgRElMb2NhbFNjb3BlLCBhbmQgdGh1cyBpdHMgc2NvcGUgY2hhaW4gZXZlbnR1YWxseQorICAgIC8vLyBsZWFkcyB0byBhIFxhIERJU3VicHJvZ3JhbS4KKyAgICAvLy8KKyAgICAvLy8gSWYgXGMgQWx3YXlzUHJlc2VydmUsIHRoaXMgdmFyaWFibGUgd2lsbCBiZSByZWZlcmVuY2VkIGZyb20gaXRzCisgICAgLy8vIGNvbnRhaW5pbmcgc3VicHJvZ3JhbSwgYW5kIHdpbGwgc3Vydml2ZSBzb21lIG9wdGltaXphdGlvbnMuCisgICAgRElMb2NhbFZhcmlhYmxlICoKKyAgICBjcmVhdGVBdXRvVmFyaWFibGUoRElTY29wZSAqU2NvcGUsIFN0cmluZ1JlZiBOYW1lLCBESUZpbGUgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbmVObywgRElUeXBlICpUeSwgYm9vbCBBbHdheXNQcmVzZXJ2ZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBESU5vZGU6OkRJRmxhZ3MgRmxhZ3MgPSBESU5vZGU6OkZsYWdaZXJvLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBbGlnbkluQml0cyA9IDApOworCisgICAgLy8vIENyZWF0ZSBhIG5ldyBkZXNjcmlwdG9yIGZvciBhIHBhcmFtZXRlciB2YXJpYWJsZS4KKyAgICAvLy8KKyAgICAvLy8gXGMgU2NvcGUgbXVzdCBiZSBhIFxhIERJTG9jYWxTY29wZSwgYW5kIHRodXMgaXRzIHNjb3BlIGNoYWluIGV2ZW50dWFsbHkKKyAgICAvLy8gbGVhZHMgdG8gYSBcYSBESVN1YnByb2dyYW0uCisgICAgLy8vCisgICAgLy8vIFxjIEFyZ05vIGlzIHRoZSBpbmRleCAoc3RhcnRpbmcgZnJvbSBcYyAxKSBvZiB0aGlzIHZhcmlhYmxlIGluIHRoZQorICAgIC8vLyBzdWJwcm9ncmFtIHBhcmFtZXRlcnMuICBcYyBBcmdObyBzaG91bGQgbm90IGNvbmZsaWN0IHdpdGggb3RoZXIKKyAgICAvLy8gcGFyYW1ldGVycyBvZiB0aGUgc2FtZSBzdWJwcm9ncmFtLgorICAgIC8vLworICAgIC8vLyBJZiBcYyBBbHdheXNQcmVzZXJ2ZSwgdGhpcyB2YXJpYWJsZSB3aWxsIGJlIHJlZmVyZW5jZWQgZnJvbSBpdHMKKyAgICAvLy8gY29udGFpbmluZyBzdWJwcm9ncmFtLCBhbmQgd2lsbCBzdXJ2aXZlIHNvbWUgb3B0aW1pemF0aW9ucy4KKyAgICBESUxvY2FsVmFyaWFibGUgKgorICAgIGNyZWF0ZVBhcmFtZXRlclZhcmlhYmxlKERJU2NvcGUgKlNjb3BlLCBTdHJpbmdSZWYgTmFtZSwgdW5zaWduZWQgQXJnTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lTm8sIERJVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbHdheXNQcmVzZXJ2ZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJTm9kZTo6RElGbGFncyBGbGFncyA9IERJTm9kZTo6RmxhZ1plcm8pOworCisgICAgLy8vIENyZWF0ZSBhIG5ldyBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkCisgICAgLy8vIHZhcmlhYmxlIHdoaWNoIGhhcyBhIGNvbXBsZXggYWRkcmVzcyBleHByZXNzaW9uIGZvciBpdHMgYWRkcmVzcy4KKyAgICAvLy8gXHBhcmFtIEFkZHIgICAgICAgIEFuIGFycmF5IG9mIGNvbXBsZXggYWRkcmVzcyBvcGVyYXRpb25zLgorICAgIERJRXhwcmVzc2lvbiAqY3JlYXRlRXhwcmVzc2lvbihBcnJheVJlZjx1aW50NjRfdD4gQWRkciA9IE5vbmUpOworICAgIERJRXhwcmVzc2lvbiAqY3JlYXRlRXhwcmVzc2lvbihBcnJheVJlZjxpbnQ2NF90PiBBZGRyKTsKKworICAgIC8vLyBDcmVhdGUgYW4gZXhwcmVzc2lvbiBmb3IgYSB2YXJpYWJsZSB0aGF0IGRvZXMgbm90IGhhdmUgYW4gYWRkcmVzcywgYnV0CisgICAgLy8vIGRvZXMgaGF2ZSBhIGNvbnN0YW50IHZhbHVlLgorICAgIERJRXhwcmVzc2lvbiAqY3JlYXRlQ29uc3RhbnRWYWx1ZUV4cHJlc3Npb24odWludDY0X3QgVmFsKSB7CisgICAgICByZXR1cm4gRElFeHByZXNzaW9uOjpnZXQoCisgICAgICAgICAgVk1Db250ZXh0LCB7ZHdhcmY6OkRXX09QX2NvbnN0dSwgVmFsLCBkd2FyZjo6RFdfT1Bfc3RhY2tfdmFsdWV9KTsKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgc3VicHJvZ3JhbS4KKyAgICAvLy8gU2VlIGNvbW1lbnRzIGluIERJU3VicHJvZ3JhbSogZm9yIGRlc2NyaXB0aW9ucyBvZiB0aGVzZSBmaWVsZHMuCisgICAgLy8vIFxwYXJhbSBTY29wZSAgICAgICAgIEZ1bmN0aW9uIHNjb3BlLgorICAgIC8vLyBccGFyYW0gTmFtZSAgICAgICAgICBGdW5jdGlvbiBuYW1lLgorICAgIC8vLyBccGFyYW0gTGlua2FnZU5hbWUgICBNYW5nbGVkIGZ1bmN0aW9uIG5hbWUuCisgICAgLy8vIFxwYXJhbSBGaWxlICAgICAgICAgIEZpbGUgd2hlcmUgdGhpcyB2YXJpYWJsZSBpcyBkZWZpbmVkLgorICAgIC8vLyBccGFyYW0gTGluZU5vICAgICAgICBMaW5lIG51bWJlci4KKyAgICAvLy8gXHBhcmFtIFR5ICAgICAgICAgICAgRnVuY3Rpb24gdHlwZS4KKyAgICAvLy8gXHBhcmFtIGlzTG9jYWxUb1VuaXQgVHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBleHRlcm5hbGx5IHZpc2libGUuCisgICAgLy8vIFxwYXJhbSBpc0RlZmluaXRpb24gIFRydWUgaWYgdGhpcyBpcyBhIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgICAgLy8vIFxwYXJhbSBTY29wZUxpbmUgICAgIFNldCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzY29wZSB0aGlzIHN0YXJ0cworICAgIC8vLyBccGFyYW0gRmxhZ3MgICAgICAgICBlLmcuIGlzIHRoaXMgZnVuY3Rpb24gcHJvdG90eXBlZCBvciBub3QuCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgIFRoZXNlIGZsYWdzIGFyZSB1c2VkIHRvIGVtaXQgZHdhcmYgYXR0cmlidXRlcy4KKyAgICAvLy8gXHBhcmFtIGlzT3B0aW1pemVkICAgVHJ1ZSBpZiBvcHRpbWl6YXRpb24gaXMgT04uCisgICAgLy8vIFxwYXJhbSBUUGFyYW1zICAgICAgIEZ1bmN0aW9uIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisgICAgLy8vIFxwYXJhbSBUaHJvd25UeXBlcyAgIEV4Y2VwdGlvbiB0eXBlcyB0aGlzIGZ1bmN0aW9uIG1heSB0aHJvdy4KKyAgICBESVN1YnByb2dyYW0gKmNyZWF0ZUZ1bmN0aW9uKAorICAgICAgICBESVNjb3BlICpTY29wZSwgU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBMaW5rYWdlTmFtZSwgRElGaWxlICpGaWxlLAorICAgICAgICB1bnNpZ25lZCBMaW5lTm8sIERJU3Vicm91dGluZVR5cGUgKlR5LCBib29sIGlzTG9jYWxUb1VuaXQsCisgICAgICAgIGJvb2wgaXNEZWZpbml0aW9uLCB1bnNpZ25lZCBTY29wZUxpbmUsCisgICAgICAgIERJTm9kZTo6RElGbGFncyBGbGFncyA9IERJTm9kZTo6RmxhZ1plcm8sIGJvb2wgaXNPcHRpbWl6ZWQgPSBmYWxzZSwKKyAgICAgICAgRElUZW1wbGF0ZVBhcmFtZXRlckFycmF5IFRQYXJhbXMgPSBudWxscHRyLAorICAgICAgICBESVN1YnByb2dyYW0gKkRlY2wgPSBudWxscHRyLCBESVR5cGVBcnJheSBUaHJvd25UeXBlcyA9IG51bGxwdHIpOworCisgICAgLy8vIElkZW50aWNhbCB0byBjcmVhdGVGdW5jdGlvbiwKKyAgICAvLy8gZXhjZXB0IHRoYXQgdGhlIHJlc3VsdGluZyBEYmdOb2RlIGlzIG1lYW50IHRvIGJlIFJBVVdlZC4KKyAgICBESVN1YnByb2dyYW0gKmNyZWF0ZVRlbXBGdW5jdGlvbkZ3ZERlY2woCisgICAgICAgIERJU2NvcGUgKlNjb3BlLCBTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIExpbmthZ2VOYW1lLCBESUZpbGUgKkZpbGUsCisgICAgICAgIHVuc2lnbmVkIExpbmVObywgRElTdWJyb3V0aW5lVHlwZSAqVHksIGJvb2wgaXNMb2NhbFRvVW5pdCwKKyAgICAgICAgYm9vbCBpc0RlZmluaXRpb24sIHVuc2lnbmVkIFNjb3BlTGluZSwKKyAgICAgICAgRElOb2RlOjpESUZsYWdzIEZsYWdzID0gRElOb2RlOjpGbGFnWmVybywgYm9vbCBpc09wdGltaXplZCA9IGZhbHNlLAorICAgICAgICBESVRlbXBsYXRlUGFyYW1ldGVyQXJyYXkgVFBhcmFtcyA9IG51bGxwdHIsCisgICAgICAgIERJU3VicHJvZ3JhbSAqRGVjbCA9IG51bGxwdHIsIERJVHlwZUFycmF5IFRocm93blR5cGVzID0gbnVsbHB0cik7CisKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgQysrIG1ldGhvZC4KKyAgICAvLy8gU2VlIGNvbW1lbnRzIGluIFxhIERJU3VicHJvZ3JhbSogZm9yIGRlc2NyaXB0aW9ucyBvZiB0aGVzZSBmaWVsZHMuCisgICAgLy8vIFxwYXJhbSBTY29wZSAgICAgICAgIEZ1bmN0aW9uIHNjb3BlLgorICAgIC8vLyBccGFyYW0gTmFtZSAgICAgICAgICBGdW5jdGlvbiBuYW1lLgorICAgIC8vLyBccGFyYW0gTGlua2FnZU5hbWUgICBNYW5nbGVkIGZ1bmN0aW9uIG5hbWUuCisgICAgLy8vIFxwYXJhbSBGaWxlICAgICAgICAgIEZpbGUgd2hlcmUgdGhpcyB2YXJpYWJsZSBpcyBkZWZpbmVkLgorICAgIC8vLyBccGFyYW0gTGluZU5vICAgICAgICBMaW5lIG51bWJlci4KKyAgICAvLy8gXHBhcmFtIFR5ICAgICAgICAgICAgRnVuY3Rpb24gdHlwZS4KKyAgICAvLy8gXHBhcmFtIGlzTG9jYWxUb1VuaXQgVHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBleHRlcm5hbGx5IHZpc2libGUuLgorICAgIC8vLyBccGFyYW0gaXNEZWZpbml0aW9uICBUcnVlIGlmIHRoaXMgaXMgYSBmdW5jdGlvbiBkZWZpbml0aW9uLgorICAgIC8vLyBccGFyYW0gVmlydHVhbGl0eSAgICBBdHRyaWJ1dGVzIGRlc2NyaWJpbmcgdmlydHVhbG5lc3MuIGUuZy4gcHVyZQorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGZ1bmN0aW9uLgorICAgIC8vLyBccGFyYW0gVlRhYmxlSW5kZXggICBJbmRleCBubyBvZiB0aGlzIG1ldGhvZCBpbiB2aXJ0dWFsIHRhYmxlLCBvciAtMXUgaWYKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgdW5yZXByZXNlbnRhYmxlLgorICAgIC8vLyBccGFyYW0gVGhpc0FkanVzdG1lbnQKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgTVMgQUJJLXNwZWNpZmljIGFkanVzdG1lbnQgb2YgJ3RoaXMnIHRoYXQgb2NjdXJzCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBwcm9sb2d1ZS4KKyAgICAvLy8gXHBhcmFtIFZUYWJsZUhvbGRlciAgVHlwZSB0aGF0IGhvbGRzIHZ0YWJsZS4KKyAgICAvLy8gXHBhcmFtIEZsYWdzICAgICAgICAgZS5nLiBpcyB0aGlzIGZ1bmN0aW9uIHByb3RvdHlwZWQgb3Igbm90LgorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZsYWdzIGFyZSB1c2VkIHRvIGVtaXQgZHdhcmYgYXR0cmlidXRlcy4KKyAgICAvLy8gXHBhcmFtIGlzT3B0aW1pemVkICAgVHJ1ZSBpZiBvcHRpbWl6YXRpb24gaXMgT04uCisgICAgLy8vIFxwYXJhbSBUUGFyYW1zICAgICAgIEZ1bmN0aW9uIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisgICAgLy8vIFxwYXJhbSBUaHJvd25UeXBlcyAgIEV4Y2VwdGlvbiB0eXBlcyB0aGlzIGZ1bmN0aW9uIG1heSB0aHJvdy4KKyAgICBESVN1YnByb2dyYW0gKmNyZWF0ZU1ldGhvZCgKKyAgICAgICAgRElTY29wZSAqU2NvcGUsIFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgTGlua2FnZU5hbWUsIERJRmlsZSAqRmlsZSwKKyAgICAgICAgdW5zaWduZWQgTGluZU5vLCBESVN1YnJvdXRpbmVUeXBlICpUeSwgYm9vbCBpc0xvY2FsVG9Vbml0LAorICAgICAgICBib29sIGlzRGVmaW5pdGlvbiwgdW5zaWduZWQgVmlydHVhbGl0eSA9IDAsIHVuc2lnbmVkIFZUYWJsZUluZGV4ID0gMCwKKyAgICAgICAgaW50IFRoaXNBZGp1c3RtZW50ID0gMCwgRElUeXBlICpWVGFibGVIb2xkZXIgPSBudWxscHRyLAorICAgICAgICBESU5vZGU6OkRJRmxhZ3MgRmxhZ3MgPSBESU5vZGU6OkZsYWdaZXJvLCBib29sIGlzT3B0aW1pemVkID0gZmFsc2UsCisgICAgICAgIERJVGVtcGxhdGVQYXJhbWV0ZXJBcnJheSBUUGFyYW1zID0gbnVsbHB0ciwKKyAgICAgICAgRElUeXBlQXJyYXkgVGhyb3duVHlwZXMgPSBudWxscHRyKTsKKworICAgIC8vLyBUaGlzIGNyZWF0ZXMgbmV3IGRlc2NyaXB0b3IgZm9yIGEgbmFtZXNwYWNlIHdpdGggdGhlIHNwZWNpZmllZAorICAgIC8vLyBwYXJlbnQgc2NvcGUuCisgICAgLy8vIFxwYXJhbSBTY29wZSAgICAgICBOYW1lc3BhY2Ugc2NvcGUKKyAgICAvLy8gXHBhcmFtIE5hbWUgICAgICAgIE5hbWUgb2YgdGhpcyBuYW1lc3BhY2UKKyAgICAvLy8gXHBhcmFtIEV4cG9ydFN5bWJvbHMgVHJ1ZSBmb3IgQysrIGlubGluZSBuYW1lc3BhY2VzLgorICAgIERJTmFtZXNwYWNlICpjcmVhdGVOYW1lU3BhY2UoRElTY29wZSAqU2NvcGUsIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHBvcnRTeW1ib2xzKTsKKworICAgIC8vLyBUaGlzIGNyZWF0ZXMgbmV3IGRlc2NyaXB0b3IgZm9yIGEgbW9kdWxlIHdpdGggdGhlIHNwZWNpZmllZAorICAgIC8vLyBwYXJlbnQgc2NvcGUuCisgICAgLy8vIFxwYXJhbSBTY29wZSAgICAgICBQYXJlbnQgc2NvcGUKKyAgICAvLy8gXHBhcmFtIE5hbWUgICAgICAgIE5hbWUgb2YgdGhpcyBtb2R1bGUKKyAgICAvLy8gXHBhcmFtIENvbmZpZ3VyYXRpb25NYWNyb3MKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgIEEgc3BhY2Utc2VwYXJhdGVkIHNoZWxsLXF1b3RlZCBsaXN0IG9mIC1EIG1hY3JvCisgICAgLy8vICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9ucyBhcyB0aGV5IHdvdWxkIGFwcGVhciBvbiBhIGNvbW1hbmQgbGluZS4KKyAgICAvLy8gXHBhcmFtIEluY2x1ZGVQYXRoIFRoZSBwYXRoIHRvIHRoZSBtb2R1bGUgbWFwIGZpbGUuCisgICAgLy8vIFxwYXJhbSBJU3lzUm9vdCAgICBUaGUgY2xhbmcgc3lzdGVtIHJvb3QgKHZhbHVlIG9mIC1pc3lzcm9vdCkuCisgICAgRElNb2R1bGUgKmNyZWF0ZU1vZHVsZShESVNjb3BlICpTY29wZSwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQ29uZmlndXJhdGlvbk1hY3JvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbmNsdWRlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJU3lzUm9vdCk7CisKKyAgICAvLy8gVGhpcyBjcmVhdGVzIGEgZGVzY3JpcHRvciBmb3IgYSBsZXhpY2FsIGJsb2NrIHdpdGggYSBuZXcgZmlsZQorICAgIC8vLyBhdHRhY2hlZC4gVGhpcyBtZXJlbHkgZXh0ZW5kcyB0aGUgZXhpc3RpbmcKKyAgICAvLy8gbGV4aWNhbCBibG9jayBhcyBpdCBjcm9zc2VzIGEgZmlsZS4KKyAgICAvLy8gXHBhcmFtIFNjb3BlICAgICAgIExleGljYWwgYmxvY2suCisgICAgLy8vIFxwYXJhbSBGaWxlICAgICAgICBTb3VyY2UgZmlsZS4KKyAgICAvLy8gXHBhcmFtIERpc2NyaW1pbmF0b3IgRFdBUkYgcGF0aCBkaXNjcmltaW5hdG9yIHZhbHVlLgorICAgIERJTGV4aWNhbEJsb2NrRmlsZSAqY3JlYXRlTGV4aWNhbEJsb2NrRmlsZShESVNjb3BlICpTY29wZSwgRElGaWxlICpGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEaXNjcmltaW5hdG9yID0gMCk7CisKKyAgICAvLy8gVGhpcyBjcmVhdGVzIGEgZGVzY3JpcHRvciBmb3IgYSBsZXhpY2FsIGJsb2NrIHdpdGggdGhlCisgICAgLy8vIHNwZWNpZmllZCBwYXJlbnQgY29udGV4dC4KKyAgICAvLy8gXHBhcmFtIFNjb3BlICAgICAgICAgUGFyZW50IGxleGljYWwgc2NvcGUuCisgICAgLy8vIFxwYXJhbSBGaWxlICAgICAgICAgIFNvdXJjZSBmaWxlLgorICAgIC8vLyBccGFyYW0gTGluZSAgICAgICAgICBMaW5lIG51bWJlci4KKyAgICAvLy8gXHBhcmFtIENvbCAgICAgICAgICAgQ29sdW1uIG51bWJlci4KKyAgICBESUxleGljYWxCbG9jayAqY3JlYXRlTGV4aWNhbEJsb2NrKERJU2NvcGUgKlNjb3BlLCBESUZpbGUgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lLCB1bnNpZ25lZCBDb2wpOworCisgICAgLy8vIENyZWF0ZSBhIGRlc2NyaXB0b3IgZm9yIGFuIGltcG9ydGVkIG1vZHVsZS4KKyAgICAvLy8gXHBhcmFtIENvbnRleHQgVGhlIHNjb3BlIHRoaXMgbW9kdWxlIGlzIGltcG9ydGVkIGludG8KKyAgICAvLy8gXHBhcmFtIE5TICAgICAgVGhlIG5hbWVzcGFjZSBiZWluZyBpbXBvcnRlZCBoZXJlLgorICAgIC8vLyBccGFyYW0gRmlsZSAgICBGaWxlIHdoZXJlIHRoZSBkZWNsYXJhdGlvbiBpcyBsb2NhdGVkLgorICAgIC8vLyBccGFyYW0gTGluZSAgICBMaW5lIG51bWJlciBvZiB0aGUgZGVjbGFyYXRpb24uCisgICAgRElJbXBvcnRlZEVudGl0eSAqY3JlYXRlSW1wb3J0ZWRNb2R1bGUoRElTY29wZSAqQ29udGV4dCwgRElOYW1lc3BhY2UgKk5TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZSk7CisKKyAgICAvLy8gQ3JlYXRlIGEgZGVzY3JpcHRvciBmb3IgYW4gaW1wb3J0ZWQgbW9kdWxlLgorICAgIC8vLyBccGFyYW0gQ29udGV4dCBUaGUgc2NvcGUgdGhpcyBtb2R1bGUgaXMgaW1wb3J0ZWQgaW50by4KKyAgICAvLy8gXHBhcmFtIE5TICAgICAgQW4gYWxpYXNlZCBuYW1lc3BhY2UuCisgICAgLy8vIFxwYXJhbSBGaWxlICAgIEZpbGUgd2hlcmUgdGhlIGRlY2xhcmF0aW9uIGlzIGxvY2F0ZWQuCisgICAgLy8vIFxwYXJhbSBMaW5lICAgIExpbmUgbnVtYmVyIG9mIHRoZSBkZWNsYXJhdGlvbi4KKyAgICBESUltcG9ydGVkRW50aXR5ICpjcmVhdGVJbXBvcnRlZE1vZHVsZShESVNjb3BlICpDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJSW1wb3J0ZWRFbnRpdHkgKk5TLCBESUZpbGUgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZSk7CisKKyAgICAvLy8gQ3JlYXRlIGEgZGVzY3JpcHRvciBmb3IgYW4gaW1wb3J0ZWQgbW9kdWxlLgorICAgIC8vLyBccGFyYW0gQ29udGV4dCBUaGUgc2NvcGUgdGhpcyBtb2R1bGUgaXMgaW1wb3J0ZWQgaW50by4KKyAgICAvLy8gXHBhcmFtIE0gICAgICAgVGhlIG1vZHVsZSBiZWluZyBpbXBvcnRlZCBoZXJlCisgICAgLy8vIFxwYXJhbSBGaWxlICAgIEZpbGUgd2hlcmUgdGhlIGRlY2xhcmF0aW9uIGlzIGxvY2F0ZWQuCisgICAgLy8vIFxwYXJhbSBMaW5lICAgIExpbmUgbnVtYmVyIG9mIHRoZSBkZWNsYXJhdGlvbi4KKyAgICBESUltcG9ydGVkRW50aXR5ICpjcmVhdGVJbXBvcnRlZE1vZHVsZShESVNjb3BlICpDb250ZXh0LCBESU1vZHVsZSAqTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZpbGUgKkZpbGUsIHVuc2lnbmVkIExpbmUpOworCisgICAgLy8vIENyZWF0ZSBhIGRlc2NyaXB0b3IgZm9yIGFuIGltcG9ydGVkIGZ1bmN0aW9uLgorICAgIC8vLyBccGFyYW0gQ29udGV4dCBUaGUgc2NvcGUgdGhpcyBtb2R1bGUgaXMgaW1wb3J0ZWQgaW50by4KKyAgICAvLy8gXHBhcmFtIERlY2wgICAgVGhlIGRlY2xhcmF0aW9uIChvciBkZWZpbml0aW9uKSBvZiBhIGZ1bmN0aW9uLCB0eXBlLCBvcgorICAgIC8vLyAgICAgICAgICAgICAgICB2YXJpYWJsZS4KKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgRmlsZSB3aGVyZSB0aGUgZGVjbGFyYXRpb24gaXMgbG9jYXRlZC4KKyAgICAvLy8gXHBhcmFtIExpbmUgICAgTGluZSBudW1iZXIgb2YgdGhlIGRlY2xhcmF0aW9uLgorICAgIERJSW1wb3J0ZWRFbnRpdHkgKmNyZWF0ZUltcG9ydGVkRGVjbGFyYXRpb24oRElTY29wZSAqQ29udGV4dCwgRElOb2RlICpEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUgPSAiIik7CisKKyAgICAvLy8gSW5zZXJ0IGEgbmV3IGxsdm0uZGJnLmRlY2xhcmUgaW50cmluc2ljIGNhbGwuCisgICAgLy8vIFxwYXJhbSBTdG9yYWdlICAgICBsbHZtOjpWYWx1ZSBvZiB0aGUgdmFyaWFibGUKKyAgICAvLy8gXHBhcmFtIFZhckluZm8gICAgIFZhcmlhYmxlJ3MgZGVidWcgaW5mbyBkZXNjcmlwdG9yLgorICAgIC8vLyBccGFyYW0gRXhwciAgICAgICAgQSBjb21wbGV4IGxvY2F0aW9uIGV4cHJlc3Npb24uCisgICAgLy8vIFxwYXJhbSBETCAgICAgICAgICBEZWJ1ZyBpbmZvIGxvY2F0aW9uLgorICAgIC8vLyBccGFyYW0gSW5zZXJ0QXRFbmQgTG9jYXRpb24gZm9yIHRoZSBuZXcgaW50cmluc2ljLgorICAgIEluc3RydWN0aW9uICppbnNlcnREZWNsYXJlKGxsdm06OlZhbHVlICpTdG9yYWdlLCBESUxvY2FsVmFyaWFibGUgKlZhckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElFeHByZXNzaW9uICpFeHByLCBjb25zdCBESUxvY2F0aW9uICpETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgICAvLy8gSW5zZXJ0IGEgbmV3IGxsdm0uZGJnLmRlY2xhcmUgaW50cmluc2ljIGNhbGwuCisgICAgLy8vIFxwYXJhbSBTdG9yYWdlICAgICAgbGx2bTo6VmFsdWUgb2YgdGhlIHZhcmlhYmxlCisgICAgLy8vIFxwYXJhbSBWYXJJbmZvICAgICAgVmFyaWFibGUncyBkZWJ1ZyBpbmZvIGRlc2NyaXB0b3IuCisgICAgLy8vIFxwYXJhbSBFeHByICAgICAgICAgQSBjb21wbGV4IGxvY2F0aW9uIGV4cHJlc3Npb24uCisgICAgLy8vIFxwYXJhbSBETCAgICAgICAgICAgRGVidWcgaW5mbyBsb2NhdGlvbi4KKyAgICAvLy8gXHBhcmFtIEluc2VydEJlZm9yZSBMb2NhdGlvbiBmb3IgdGhlIG5ldyBpbnRyaW5zaWMuCisgICAgSW5zdHJ1Y3Rpb24gKmluc2VydERlY2xhcmUobGx2bTo6VmFsdWUgKlN0b3JhZ2UsIERJTG9jYWxWYXJpYWJsZSAqVmFySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUV4cHJlc3Npb24gKkV4cHIsIGNvbnN0IERJTG9jYXRpb24gKkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpOworCisgICAgLy8vIEluc2VydCBhIG5ldyBsbHZtLmRiZy52YWx1ZSBpbnRyaW5zaWMgY2FsbC4KKyAgICAvLy8gXHBhcmFtIFZhbCAgICAgICAgICBsbHZtOjpWYWx1ZSBvZiB0aGUgdmFyaWFibGUKKyAgICAvLy8gXHBhcmFtIFZhckluZm8gICAgICBWYXJpYWJsZSdzIGRlYnVnIGluZm8gZGVzY3JpcHRvci4KKyAgICAvLy8gXHBhcmFtIEV4cHIgICAgICAgICBBIGNvbXBsZXggbG9jYXRpb24gZXhwcmVzc2lvbi4KKyAgICAvLy8gXHBhcmFtIERMICAgICAgICAgICBEZWJ1ZyBpbmZvIGxvY2F0aW9uLgorICAgIC8vLyBccGFyYW0gSW5zZXJ0QXRFbmQgTG9jYXRpb24gZm9yIHRoZSBuZXcgaW50cmluc2ljLgorICAgIEluc3RydWN0aW9uICppbnNlcnREYmdWYWx1ZUludHJpbnNpYyhsbHZtOjpWYWx1ZSAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUxvY2FsVmFyaWFibGUgKlZhckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRXhwcmVzc2lvbiAqRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRElMb2NhdGlvbiAqREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICAgIC8vLyBJbnNlcnQgYSBuZXcgbGx2bS5kYmcudmFsdWUgaW50cmluc2ljIGNhbGwuCisgICAgLy8vIFxwYXJhbSBWYWwgICAgICAgICAgbGx2bTo6VmFsdWUgb2YgdGhlIHZhcmlhYmxlCisgICAgLy8vIFxwYXJhbSBWYXJJbmZvICAgICAgVmFyaWFibGUncyBkZWJ1ZyBpbmZvIGRlc2NyaXB0b3IuCisgICAgLy8vIFxwYXJhbSBFeHByICAgICAgICAgQSBjb21wbGV4IGxvY2F0aW9uIGV4cHJlc3Npb24uCisgICAgLy8vIFxwYXJhbSBETCAgICAgICAgICAgRGVidWcgaW5mbyBsb2NhdGlvbi4KKyAgICAvLy8gXHBhcmFtIEluc2VydEJlZm9yZSBMb2NhdGlvbiBmb3IgdGhlIG5ldyBpbnRyaW5zaWMuCisgICAgSW5zdHJ1Y3Rpb24gKmluc2VydERiZ1ZhbHVlSW50cmluc2ljKGxsdm06OlZhbHVlICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJTG9jYWxWYXJpYWJsZSAqVmFySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElFeHByZXNzaW9uICpFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBESUxvY2F0aW9uICpETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisKKyAgICAvLy8gUmVwbGFjZSB0aGUgdnRhYmxlIGhvbGRlciBpbiB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAvLy8KKyAgICAvLy8gSWYgdGhpcyBjcmVhdGVzIGEgc2VsZiByZWZlcmVuY2UsIGl0IG1heSBvcnBoYW4gc29tZSB1bnJlc29sdmVkIGN5Y2xlcworICAgIC8vLyBpbiB0aGUgb3BlcmFuZHMgb2YgXGMgVCwgc28gXGEgRElCdWlsZGVyIG5lZWRzIHRvIHRyYWNrIHRoYXQuCisgICAgdm9pZCByZXBsYWNlVlRhYmxlSG9sZGVyKERJQ29tcG9zaXRlVHlwZSAqJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJVHlwZSAqVlRhYmxlSG9sZGVyKTsKKworICAgIC8vLyBSZXBsYWNlIGFycmF5cyBvbiBhIGNvbXBvc2l0ZSB0eXBlLgorICAgIC8vLworICAgIC8vLyBJZiBcYyBUIGlzIHJlc29sdmVkLCBidXQgdGhlIGFycmF5cyBhcmVuJ3QgLS0gd2hpY2ggY2FuIGhhcHBlbiBpZiBcYyBUCisgICAgLy8vIGhhcyBhIHNlbGYtcmVmZXJlbmNlIC0tIFxhIERJQnVpbGRlciBuZWVkcyB0byB0cmFjayB0aGUgYXJyYXkgdG8KKyAgICAvLy8gcmVzb2x2ZSBjeWNsZXMuCisgICAgdm9pZCByZXBsYWNlQXJyYXlzKERJQ29tcG9zaXRlVHlwZSAqJlQsIERJTm9kZUFycmF5IEVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICBESU5vZGVBcnJheSBUUGFyYW1zID0gRElOb2RlQXJyYXkoKSk7CisKKyAgICAvLy8gUmVwbGFjZSBhIHRlbXBvcmFyeSBub2RlLgorICAgIC8vLworICAgIC8vLyBDYWxsIFxhIE1ETm9kZTo6cmVwbGFjZUFsbFVzZXNXaXRoKCkgb24gXGMgTiwgcmVwbGFjaW5nIGl0IHdpdGggXGMKKyAgICAvLy8gUmVwbGFjZW1lbnQuCisgICAgLy8vCisgICAgLy8vIElmIFxjIFJlcGxhY2VtZW50IGlzIHRoZSBzYW1lIGFzIFxjIE4uZ2V0KCksIGluc3RlYWQgY2FsbCBcYQorICAgIC8vLyBNRE5vZGU6OnJlcGxhY2VXaXRoVW5pcXVlZCgpLiAgSW4gdGhpcyBjYXNlLCB0aGUgdW5pcXVlZCBub2RlIGNvdWxkCisgICAgLy8vIGhhdmUgYSBkaWZmZXJlbnQgYWRkcmVzcywgc28gd2UgcmV0dXJuIHRoZSBmaW5hbCBhZGRyZXNzLgorICAgIHRlbXBsYXRlIDxjbGFzcyBOb2RlVHk+CisgICAgTm9kZVR5ICpyZXBsYWNlVGVtcG9yYXJ5KFRlbXBNRE5vZGUgJiZOLCBOb2RlVHkgKlJlcGxhY2VtZW50KSB7CisgICAgICBpZiAoTi5nZXQoKSA9PSBSZXBsYWNlbWVudCkKKyAgICAgICAgcmV0dXJuIGNhc3Q8Tm9kZVR5PihNRE5vZGU6OnJlcGxhY2VXaXRoVW5pcXVlZChzdGQ6Om1vdmUoTikpKTsKKworICAgICAgTi0+cmVwbGFjZUFsbFVzZXNXaXRoKFJlcGxhY2VtZW50KTsKKyAgICAgIHJldHVybiBSZXBsYWNlbWVudDsKKyAgICB9CisgIH07CisKKyAgLy8gQ3JlYXRlIHdyYXBwZXJzIGZvciBDIEJpbmRpbmcgdHlwZXMgKHNlZSBDQmluZGluZ1dyYXBwaW5nLmgpLgorICBERUZJTkVfSVNBX0NPTlZFUlNJT05fRlVOQ1RJT05TKERJQnVpbGRlciwgTExWTURJQnVpbGRlclJlZikKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfRElCVUlMREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRGF0YUxheW91dC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EYXRhTGF5b3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ4ZTE0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRGF0YUxheW91dC5oCkBAIC0wLDAgKzEsNjAyIEBACisvLz09PS0gbGx2bS9EYXRhTGF5b3V0LmggLSBEYXRhIHNpemUgJiBhbGlnbm1lbnQgaW5mbyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGxheW91dCBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gZGF0YXR5cGUgc2l6ZS9vZmZzZXQvYWxpZ25tZW50CisvLyBpbmZvcm1hdGlvbi4gIEl0IHVzZXMgbGF6eSBhbm5vdGF0aW9ucyB0byBjYWNoZSBpbmZvcm1hdGlvbiBhYm91dCBob3cKKy8vIHN0cnVjdHVyZSB0eXBlcyBhcmUgbGFpZCBvdXQgYW5kIHVzZWQuCisvLworLy8gVGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGNyZWF0ZWQgb25jZSwgZmlsbGVkIGluIGlmIHRoZSBkZWZhdWx0cyBhcmUgbm90CisvLyBjb3JyZWN0IGFuZCB0aGVuIHBhc3NlZCBhcm91bmQgYnkgY29uc3QmLiAgTm9uZSBvZiB0aGUgbWVtYmVycyBmdW5jdGlvbnMKKy8vIHJlcXVpcmUgbW9kaWZpY2F0aW9uIHRvIHRoZSBvYmplY3QuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0RBVEFMQVlPVVRfSAorI2RlZmluZSBMTFZNX0lSX0RBVEFMQVlPVVRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKworLy8gVGhpcyBuZWVkcyB0byBiZSBvdXRzaWRlIG9mIHRoZSBuYW1lc3BhY2UsIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggbGx2bS1jCisvLyBkZWNsLgordXNpbmcgTExWTVRhcmdldERhdGFSZWYgPSBzdHJ1Y3QgTExWTU9wYXF1ZVRhcmdldERhdGEgKjsKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBHbG9iYWxWYXJpYWJsZTsKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgTW9kdWxlOworY2xhc3MgU3RydWN0TGF5b3V0OworY2xhc3MgVHJpcGxlOworY2xhc3MgVmFsdWU7CisKKy8vLyBFbnVtIHVzZWQgdG8gY2F0ZWdvcml6ZSB0aGUgYWxpZ25tZW50IHR5cGVzIHN0b3JlZCBieSBMYXlvdXRBbGlnbkVsZW0KK2VudW0gQWxpZ25UeXBlRW51bSB7CisgIElOVkFMSURfQUxJR04gPSAwLAorICBJTlRFR0VSX0FMSUdOID0gJ2knLAorICBWRUNUT1JfQUxJR04gPSAndicsCisgIEZMT0FUX0FMSUdOID0gJ2YnLAorICBBR0dSRUdBVEVfQUxJR04gPSAnYScKK307CisKKy8vIEZJWE1FOiBDdXJyZW50bHkgdGhlIERhdGFMYXlvdXQgc3RyaW5nIGNhcnJpZXMgYSAicHJlZmVycmVkIGFsaWdubWVudCIKKy8vIGZvciB0eXBlcy4gQXMgdGhlIERhdGFMYXlvdXQgaXMgbW9kdWxlL2dsb2JhbCwgdGhpcyBzaG91bGQgbGlrZWx5IGJlCisvLyBzdW5rIGRvd24gdG8gYW4gRlRUSSBlbGVtZW50IHRoYXQgaXMgcXVlcmllZCByYXRoZXIgdGhhbiBhIGdsb2JhbAorLy8gcHJlZmVyZW5jZS4KKworLy8vIFxicmllZiBMYXlvdXQgYWxpZ25tZW50IGVsZW1lbnQuCisvLy8KKy8vLyBTdG9yZXMgdGhlIGFsaWdubWVudCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGFsaWdubWVudCB0eXBlIChpbnRlZ2VyLAorLy8vIHZlY3RvciwgZmxvYXQpIGFuZCB0eXBlIGJpdCB3aWR0aC4KKy8vLworLy8vIFxub3RlIFRoZSB1bnVzdWFsIG9yZGVyIG9mIGVsZW1lbnRzIGluIHRoZSBzdHJ1Y3R1cmUgYXR0ZW1wdHMgdG8gcmVkdWNlCisvLy8gcGFkZGluZyBhbmQgbWFrZSB0aGUgc3RydWN0dXJlIHNsaWdodGx5IG1vcmUgY2FjaGUgZnJpZW5kbHkuCitzdHJ1Y3QgTGF5b3V0QWxpZ25FbGVtIHsKKyAgLy8vIFxicmllZiBBbGlnbm1lbnQgdHlwZSBmcm9tIFxjIEFsaWduVHlwZUVudW0KKyAgdW5zaWduZWQgQWxpZ25UeXBlIDogODsKKyAgdW5zaWduZWQgVHlwZUJpdFdpZHRoIDogMjQ7CisgIHVuc2lnbmVkIEFCSUFsaWduIDogMTY7CisgIHVuc2lnbmVkIFByZWZBbGlnbiA6IDE2OworCisgIHN0YXRpYyBMYXlvdXRBbGlnbkVsZW0gZ2V0KEFsaWduVHlwZUVudW0gYWxpZ25fdHlwZSwgdW5zaWduZWQgYWJpX2FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBwcmVmX2FsaWduLCB1aW50MzJfdCBiaXRfd2lkdGgpOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBMYXlvdXRBbGlnbkVsZW0gJnJocykgY29uc3Q7Cit9OworCisvLy8gXGJyaWVmIExheW91dCBwb2ludGVyIGFsaWdubWVudCBlbGVtZW50LgorLy8vCisvLy8gU3RvcmVzIHRoZSBhbGlnbm1lbnQgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwb2ludGVyIGFuZCBhZGRyZXNzIHNwYWNlLgorLy8vCisvLy8gXG5vdGUgVGhlIHVudXN1YWwgb3JkZXIgb2YgZWxlbWVudHMgaW4gdGhlIHN0cnVjdHVyZSBhdHRlbXB0cyB0byByZWR1Y2UKKy8vLyBwYWRkaW5nIGFuZCBtYWtlIHRoZSBzdHJ1Y3R1cmUgc2xpZ2h0bHkgbW9yZSBjYWNoZSBmcmllbmRseS4KK3N0cnVjdCBQb2ludGVyQWxpZ25FbGVtIHsKKyAgdW5zaWduZWQgQUJJQWxpZ247CisgIHVuc2lnbmVkIFByZWZBbGlnbjsKKyAgdWludDMyX3QgVHlwZUJ5dGVXaWR0aDsKKyAgdWludDMyX3QgQWRkcmVzc1NwYWNlOworICB1aW50MzJfdCBJbmRleFdpZHRoOworCisgIC8vLyBJbml0aWFsaXplcgorICBzdGF0aWMgUG9pbnRlckFsaWduRWxlbSBnZXQodWludDMyX3QgQWRkcmVzc1NwYWNlLCB1bnNpZ25lZCBBQklBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFByZWZBbGlnbiwgdWludDMyX3QgVHlwZUJ5dGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEluZGV4V2lkdGgpOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQb2ludGVyQWxpZ25FbGVtICZyaHMpIGNvbnN0OworfTsKKworLy8vIFxicmllZiBBIHBhcnNlZCB2ZXJzaW9uIG9mIHRoZSB0YXJnZXQgZGF0YSBsYXlvdXQgc3RyaW5nIGluIGFuZCBtZXRob2RzIGZvcgorLy8vIHF1ZXJ5aW5nIGl0LgorLy8vCisvLy8gVGhlIHRhcmdldCBkYXRhIGxheW91dCBzdHJpbmcgaXMgc3BlY2lmaWVkICpieSB0aGUgdGFyZ2V0KiAtIGEgZnJvbnRlbmQKKy8vLyBnZW5lcmF0aW5nIExMVk0gSVIgaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhlIHJpZ2h0IHRhcmdldCBkYXRhIGZvciB0aGUKKy8vLyB0YXJnZXQgYmVpbmcgY29kZWdlbidkIHRvLgorY2xhc3MgRGF0YUxheW91dCB7Citwcml2YXRlOgorICAvLy8gRGVmYXVsdHMgdG8gZmFsc2UuCisgIGJvb2wgQmlnRW5kaWFuOworCisgIHVuc2lnbmVkIEFsbG9jYUFkZHJTcGFjZTsKKyAgdW5zaWduZWQgU3RhY2tOYXR1cmFsQWxpZ247CisgIHVuc2lnbmVkIFByb2dyYW1BZGRyU3BhY2U7CisKKyAgZW51bSBNYW5nbGluZ01vZGVUIHsKKyAgICBNTV9Ob25lLAorICAgIE1NX0VMRiwKKyAgICBNTV9NYWNoTywKKyAgICBNTV9XaW5DT0ZGLAorICAgIE1NX1dpbkNPRkZYODYsCisgICAgTU1fTWlwcworICB9OworICBNYW5nbGluZ01vZGVUIE1hbmdsaW5nTW9kZTsKKworICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCBjaGFyLCA4PiBMZWdhbEludFdpZHRoczsKKworICAvLy8gXGJyaWVmIFByaW1pdGl2ZSB0eXBlIGFsaWdubWVudCBkYXRhLiBUaGlzIGlzIHNvcnRlZCBieSB0eXBlIGFuZCBiaXQKKyAgLy8vIHdpZHRoIGR1cmluZyBjb25zdHJ1Y3Rpb24uCisgIHVzaW5nIEFsaWdubWVudHNUeSA9IFNtYWxsVmVjdG9yPExheW91dEFsaWduRWxlbSwgMTY+OworICBBbGlnbm1lbnRzVHkgQWxpZ25tZW50czsKKworICBBbGlnbm1lbnRzVHk6OmNvbnN0X2l0ZXJhdG9yCisgIGZpbmRBbGlnbm1lbnRMb3dlckJvdW5kKEFsaWduVHlwZUVudW0gQWxpZ25UeXBlLCB1aW50MzJfdCBCaXRXaWR0aCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PERhdGFMYXlvdXQgKj4odGhpcyktPmZpbmRBbGlnbm1lbnRMb3dlckJvdW5kKEFsaWduVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRXaWR0aCk7CisgIH0KKworICBBbGlnbm1lbnRzVHk6Oml0ZXJhdG9yCisgIGZpbmRBbGlnbm1lbnRMb3dlckJvdW5kKEFsaWduVHlwZUVudW0gQWxpZ25UeXBlLCB1aW50MzJfdCBCaXRXaWR0aCk7CisKKyAgLy8vIFxicmllZiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHVzZWQgdG8gY3JlYXRlIHRoaXMgRGF0YUxheW91dAorICBzdGQ6OnN0cmluZyBTdHJpbmdSZXByZXNlbnRhdGlvbjsKKworICB1c2luZyBQb2ludGVyc1R5ID0gU21hbGxWZWN0b3I8UG9pbnRlckFsaWduRWxlbSwgOD47CisgIFBvaW50ZXJzVHkgUG9pbnRlcnM7CisKKyAgUG9pbnRlcnNUeTo6Y29uc3RfaXRlcmF0b3IKKyAgZmluZFBvaW50ZXJMb3dlckJvdW5kKHVpbnQzMl90IEFkZHJlc3NTcGFjZSkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PERhdGFMYXlvdXQgKj4odGhpcyktPmZpbmRQb2ludGVyTG93ZXJCb3VuZChBZGRyZXNzU3BhY2UpOworICB9CisKKyAgUG9pbnRlcnNUeTo6aXRlcmF0b3IgZmluZFBvaW50ZXJMb3dlckJvdW5kKHVpbnQzMl90IEFkZHJlc3NTcGFjZSk7CisKKyAgLy8gVGhlIFN0cnVjdFR5cGUgLT4gU3RydWN0TGF5b3V0IG1hcC4KKyAgbXV0YWJsZSB2b2lkICpMYXlvdXRNYXAgPSBudWxscHRyOworCisgIC8vLyBQb2ludGVycyBpbiB0aGVzZSBhZGRyZXNzIHNwYWNlcyBhcmUgbm9uLWludGVncmFsLCBhbmQgZG9uJ3QgaGF2ZSBhCisgIC8vLyB3ZWxsLWRlZmluZWQgYml0d2lzZSByZXByZXNlbnRhdGlvbi4KKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDg+IE5vbkludGVncmFsQWRkcmVzc1NwYWNlczsKKworICB2b2lkIHNldEFsaWdubWVudChBbGlnblR5cGVFbnVtIGFsaWduX3R5cGUsIHVuc2lnbmVkIGFiaV9hbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcHJlZl9hbGlnbiwgdWludDMyX3QgYml0X3dpZHRoKTsKKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50SW5mbyhBbGlnblR5cGVFbnVtIGFsaWduX3R5cGUsIHVpbnQzMl90IGJpdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFCSUFsaWduLCBUeXBlICpUeSkgY29uc3Q7CisgIHZvaWQgc2V0UG9pbnRlckFsaWdubWVudCh1aW50MzJfdCBBZGRyU3BhY2UsIHVuc2lnbmVkIEFCSUFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUHJlZkFsaWduLCB1aW50MzJfdCBUeXBlQnl0ZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5kZXhXaWR0aCk7CisKKyAgLy8vIEludGVybmFsIGhlbHBlciBtZXRob2QgdGhhdCByZXR1cm5zIHJlcXVlc3RlZCBhbGlnbm1lbnQgZm9yIHR5cGUuCisgIHVuc2lnbmVkIGdldEFsaWdubWVudChUeXBlICpUeSwgYm9vbCBhYmlfb3JfcHJlZikgY29uc3Q7CisKKyAgLy8vIFBhcnNlcyBhIHRhcmdldCBkYXRhIHNwZWNpZmljYXRpb24gc3RyaW5nLiBBc3NlcnQgaWYgdGhlIHN0cmluZyBpcworICAvLy8gbWFsZm9ybWVkLgorICB2b2lkIHBhcnNlU3BlY2lmaWVyKFN0cmluZ1JlZiBMYXlvdXREZXNjcmlwdGlvbik7CisKKyAgLy8gRnJlZSBhbGwgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLgorICB2b2lkIGNsZWFyKCk7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdHMgYSBEYXRhTGF5b3V0IGZyb20gYSBzcGVjaWZpY2F0aW9uIHN0cmluZy4gU2VlIHJlc2V0KCkuCisgIGV4cGxpY2l0IERhdGFMYXlvdXQoU3RyaW5nUmVmIExheW91dERlc2NyaXB0aW9uKSB7CisgICAgcmVzZXQoTGF5b3V0RGVzY3JpcHRpb24pOworICB9CisKKyAgLy8vIEluaXRpYWxpemUgdGFyZ2V0IGRhdGEgZnJvbSBwcm9wZXJ0aWVzIHN0b3JlZCBpbiB0aGUgbW9kdWxlLgorICBleHBsaWNpdCBEYXRhTGF5b3V0KGNvbnN0IE1vZHVsZSAqTSk7CisKKyAgRGF0YUxheW91dChjb25zdCBEYXRhTGF5b3V0ICZETCkgeyAqdGhpcyA9IERMOyB9CisKKyAgfkRhdGFMYXlvdXQoKTsgLy8gTm90IHZpcnR1YWwsIGRvIG5vdCBzdWJjbGFzcyB0aGlzIGNsYXNzCisKKyAgRGF0YUxheW91dCAmb3BlcmF0b3I9KGNvbnN0IERhdGFMYXlvdXQgJkRMKSB7CisgICAgY2xlYXIoKTsKKyAgICBTdHJpbmdSZXByZXNlbnRhdGlvbiA9IERMLlN0cmluZ1JlcHJlc2VudGF0aW9uOworICAgIEJpZ0VuZGlhbiA9IERMLmlzQmlnRW5kaWFuKCk7CisgICAgQWxsb2NhQWRkclNwYWNlID0gREwuQWxsb2NhQWRkclNwYWNlOworICAgIFN0YWNrTmF0dXJhbEFsaWduID0gREwuU3RhY2tOYXR1cmFsQWxpZ247CisgICAgUHJvZ3JhbUFkZHJTcGFjZSA9IERMLlByb2dyYW1BZGRyU3BhY2U7CisgICAgTWFuZ2xpbmdNb2RlID0gREwuTWFuZ2xpbmdNb2RlOworICAgIExlZ2FsSW50V2lkdGhzID0gREwuTGVnYWxJbnRXaWR0aHM7CisgICAgQWxpZ25tZW50cyA9IERMLkFsaWdubWVudHM7CisgICAgUG9pbnRlcnMgPSBETC5Qb2ludGVyczsKKyAgICBOb25JbnRlZ3JhbEFkZHJlc3NTcGFjZXMgPSBETC5Ob25JbnRlZ3JhbEFkZHJlc3NTcGFjZXM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IERhdGFMYXlvdXQgJk90aGVyKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IERhdGFMYXlvdXQgJk90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IE90aGVyKTsgfQorCisgIHZvaWQgaW5pdChjb25zdCBNb2R1bGUgKk0pOworCisgIC8vLyBQYXJzZSBhIGRhdGEgbGF5b3V0IHN0cmluZyAod2l0aCBmYWxsYmFjayB0byBkZWZhdWx0IHZhbHVlcykuCisgIHZvaWQgcmVzZXQoU3RyaW5nUmVmIExheW91dERlc2NyaXB0aW9uKTsKKworICAvLy8gTGF5b3V0IGVuZGlhbm5lc3MuLi4KKyAgYm9vbCBpc0xpdHRsZUVuZGlhbigpIGNvbnN0IHsgcmV0dXJuICFCaWdFbmRpYW47IH0KKyAgYm9vbCBpc0JpZ0VuZGlhbigpIGNvbnN0IHsgcmV0dXJuIEJpZ0VuZGlhbjsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBEYXRhTGF5b3V0LgorICAvLy8KKyAgLy8vIFRoaXMgcmVwcmVzZW50YXRpb24gaXMgaW4gdGhlIHNhbWUgZm9ybWF0IGFjY2VwdGVkIGJ5IHRoZSBzdHJpbmcKKyAgLy8vIGNvbnN0cnVjdG9yIGFib3ZlLiBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjb21wYXJlIHR3byBEYXRhTGF5b3V0IGFzCisgIC8vLyBkaWZmZXJlbnQgc3RyaW5nIGNhbiByZXByZXNlbnQgdGhlIHNhbWUgbGF5b3V0LgorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0U3RyaW5nUmVwcmVzZW50YXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIFN0cmluZ1JlcHJlc2VudGF0aW9uOworICB9CisKKyAgLy8vIFxicmllZiBUZXN0IGlmIHRoZSBEYXRhTGF5b3V0IHdhcyBjb25zdHJ1Y3RlZCBmcm9tIGFuIGVtcHR5IHN0cmluZy4KKyAgYm9vbCBpc0RlZmF1bHQoKSBjb25zdCB7IHJldHVybiBTdHJpbmdSZXByZXNlbnRhdGlvbi5lbXB0eSgpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB0eXBlIGlzIGtub3duIHRvIGJlIGEgbmF0aXZlIGludGVnZXIKKyAgLy8vIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBDUFUuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsIGk2NCBpcyBub3QgbmF0aXZlIG9uIG1vc3QgMzItYml0IENQVXMgYW5kIGkzNyBpcyBub3QgbmF0aXZlCisgIC8vLyBvbiBhbnkga25vd24gb25lLiBUaGlzIHJldHVybnMgZmFsc2UgaWYgdGhlIGludGVnZXIgd2lkdGggaXMgbm90IGxlZ2FsLgorICAvLy8KKyAgLy8vIFRoZSB3aWR0aCBpcyBzcGVjaWZpZWQgaW4gYml0cy4KKyAgYm9vbCBpc0xlZ2FsSW50ZWdlcih1aW50NjRfdCBXaWR0aCkgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgTGVnYWxJbnRXaWR0aCA6IExlZ2FsSW50V2lkdGhzKQorICAgICAgaWYgKExlZ2FsSW50V2lkdGggPT0gV2lkdGgpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgaXNJbGxlZ2FsSW50ZWdlcih1aW50NjRfdCBXaWR0aCkgY29uc3QgeyByZXR1cm4gIWlzTGVnYWxJbnRlZ2VyKFdpZHRoKTsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGFsaWdubWVudCBleGNlZWRzIHRoZSBuYXR1cmFsIHN0YWNrIGFsaWdubWVudC4KKyAgYm9vbCBleGNlZWRzTmF0dXJhbFN0YWNrQWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKSBjb25zdCB7CisgICAgcmV0dXJuIChTdGFja05hdHVyYWxBbGlnbiAhPSAwKSAmJiAoQWxpZ24gPiBTdGFja05hdHVyYWxBbGlnbik7CisgIH0KKworICB1bnNpZ25lZCBnZXRTdGFja0FsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIFN0YWNrTmF0dXJhbEFsaWduOyB9CisgIHVuc2lnbmVkIGdldEFsbG9jYUFkZHJTcGFjZSgpIGNvbnN0IHsgcmV0dXJuIEFsbG9jYUFkZHJTcGFjZTsgfQorCisgIHVuc2lnbmVkIGdldFByb2dyYW1BZGRyZXNzU3BhY2UoKSBjb25zdCB7IHJldHVybiBQcm9ncmFtQWRkclNwYWNlOyB9CisKKyAgYm9vbCBoYXNNaWNyb3NvZnRGYXN0U3RkQ2FsbE1hbmdsaW5nKCkgY29uc3QgeworICAgIHJldHVybiBNYW5nbGluZ01vZGUgPT0gTU1fV2luQ09GRlg4NjsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgc3ltYm9scyB3aXRoIGxlYWRpbmcgcXVlc3Rpb24gbWFya3Mgc2hvdWxkIG5vdCByZWNlaXZlIElSCisgIC8vLyBtYW5nbGluZy4gVHJ1ZSBmb3IgV2luZG93cyBtYW5nbGluZyBtb2Rlcy4KKyAgYm9vbCBkb05vdE1hbmdsZUxlYWRpbmdRdWVzdGlvbk1hcmsoKSBjb25zdCB7CisgICAgcmV0dXJuIE1hbmdsaW5nTW9kZSA9PSBNTV9XaW5DT0ZGIHx8IE1hbmdsaW5nTW9kZSA9PSBNTV9XaW5DT0ZGWDg2OworICB9CisKKyAgYm9vbCBoYXNMaW5rZXJQcml2YXRlR2xvYmFsUHJlZml4KCkgY29uc3QgeyByZXR1cm4gTWFuZ2xpbmdNb2RlID09IE1NX01hY2hPOyB9CisKKyAgU3RyaW5nUmVmIGdldExpbmtlclByaXZhdGVHbG9iYWxQcmVmaXgoKSBjb25zdCB7CisgICAgaWYgKE1hbmdsaW5nTW9kZSA9PSBNTV9NYWNoTykKKyAgICAgIHJldHVybiAibCI7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgY2hhciBnZXRHbG9iYWxQcmVmaXgoKSBjb25zdCB7CisgICAgc3dpdGNoIChNYW5nbGluZ01vZGUpIHsKKyAgICBjYXNlIE1NX05vbmU6CisgICAgY2FzZSBNTV9FTEY6CisgICAgY2FzZSBNTV9NaXBzOgorICAgIGNhc2UgTU1fV2luQ09GRjoKKyAgICAgIHJldHVybiAnXDAnOworICAgIGNhc2UgTU1fTWFjaE86CisgICAgY2FzZSBNTV9XaW5DT0ZGWDg2OgorICAgICAgcmV0dXJuICdfJzsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiaW52YWxpZCBtYW5nbGluZyBtb2RlIik7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKE1hbmdsaW5nTW9kZSkgeworICAgIGNhc2UgTU1fTm9uZToKKyAgICAgIHJldHVybiAiIjsKKyAgICBjYXNlIE1NX0VMRjoKKyAgICBjYXNlIE1NX1dpbkNPRkY6CisgICAgICByZXR1cm4gIi5MIjsKKyAgICBjYXNlIE1NX01pcHM6CisgICAgICByZXR1cm4gIiQiOworICAgIGNhc2UgTU1fTWFjaE86CisgICAgY2FzZSBNTV9XaW5DT0ZGWDg2OgorICAgICAgcmV0dXJuICJMIjsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiaW52YWxpZCBtYW5nbGluZyBtb2RlIik7CisgIH0KKworICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TWFuZ2xpbmdDb21wb25lbnQoY29uc3QgVHJpcGxlICZUKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgZml0cyBpbiBhIG5hdGl2ZSBpbnRlZ2VyIHR5cGUKKyAgLy8vIHN1cHBvcnRlZCBieSB0aGUgQ1BVLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlLCBpZiB0aGUgQ1BVIG9ubHkgc3VwcG9ydHMgaTMyIGFzIGEgbmF0aXZlIGludGVnZXIgdHlwZSwgdGhlbgorICAvLy8gaTI3IGZpdHMgaW4gYSBsZWdhbCBpbnRlZ2VyIHR5cGUgYnV0IGk0NSBkb2VzIG5vdC4KKyAgYm9vbCBmaXRzSW5MZWdhbEludGVnZXIodW5zaWduZWQgV2lkdGgpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIExlZ2FsSW50V2lkdGggOiBMZWdhbEludFdpZHRocykKKyAgICAgIGlmIChXaWR0aCA8PSBMZWdhbEludFdpZHRoKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gTGF5b3V0IHBvaW50ZXIgYWxpZ25tZW50CisgIHVuc2lnbmVkIGdldFBvaW50ZXJBQklBbGlnbm1lbnQodW5zaWduZWQgQVMpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGFyZ2V0J3MgYWxpZ25tZW50IGZvciBzdGFjay1iYXNlZCBwb2ludGVycworICAvLy8gRklYTUU6IFRoZSBkZWZhdWx0cyBuZWVkIHRvIGJlIHJlbW92ZWQgb25jZSBhbGwgb2YKKyAgLy8vIHRoZSBiYWNrZW5kcy9jbGllbnRzIGFyZSB1cGRhdGVkLgorICB1bnNpZ25lZCBnZXRQb2ludGVyUHJlZkFsaWdubWVudCh1bnNpZ25lZCBBUyA9IDApIGNvbnN0OworCisgIC8vLyBMYXlvdXQgcG9pbnRlciBzaXplCisgIC8vLyBGSVhNRTogVGhlIGRlZmF1bHRzIG5lZWQgdG8gYmUgcmVtb3ZlZCBvbmNlIGFsbCBvZgorICAvLy8gdGhlIGJhY2tlbmRzL2NsaWVudHMgYXJlIHVwZGF0ZWQuCisgIHVuc2lnbmVkIGdldFBvaW50ZXJTaXplKHVuc2lnbmVkIEFTID0gMCkgY29uc3Q7CisKKyAgLy8gSW5kZXggc2l6ZSB1c2VkIGZvciBhZGRyZXNzIGNhbGN1bGF0aW9uLgorICB1bnNpZ25lZCBnZXRJbmRleFNpemUodW5zaWduZWQgQVMpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIGFkZHJlc3Mgc3BhY2VzIGNvbnRhaW5pbmcgbm9uLWludGVncmFsIHBvaW50ZXJzLiAgUG9pbnRlcnMgaW4KKyAgLy8vIHRoaXMgYWRkcmVzcyBzcGFjZSBkb24ndCBoYXZlIGEgd2VsbC1kZWZpbmVkIGJpdHdpc2UgcmVwcmVzZW50YXRpb24uCisgIEFycmF5UmVmPHVuc2lnbmVkPiBnZXROb25JbnRlZ3JhbEFkZHJlc3NTcGFjZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIE5vbkludGVncmFsQWRkcmVzc1NwYWNlczsKKyAgfQorCisgIGJvb2wgaXNOb25JbnRlZ3JhbFBvaW50ZXJUeXBlKFBvaW50ZXJUeXBlICpQVCkgY29uc3QgeworICAgIEFycmF5UmVmPHVuc2lnbmVkPiBOb25JbnRlZ3JhbFNwYWNlcyA9IGdldE5vbkludGVncmFsQWRkcmVzc1NwYWNlcygpOworICAgIHJldHVybiBmaW5kKE5vbkludGVncmFsU3BhY2VzLCBQVC0+Z2V0QWRkcmVzc1NwYWNlKCkpICE9CisgICAgICAgICAgIE5vbkludGVncmFsU3BhY2VzLmVuZCgpOworICB9CisKKyAgYm9vbCBpc05vbkludGVncmFsUG9pbnRlclR5cGUoVHlwZSAqVHkpIGNvbnN0IHsKKyAgICBhdXRvICpQVHkgPSBkeW5fY2FzdDxQb2ludGVyVHlwZT4oVHkpOworICAgIHJldHVybiBQVHkgJiYgaXNOb25JbnRlZ3JhbFBvaW50ZXJUeXBlKFBUeSk7CisgIH0KKworICAvLy8gTGF5b3V0IHBvaW50ZXIgc2l6ZSwgaW4gYml0cworICAvLy8gRklYTUU6IFRoZSBkZWZhdWx0cyBuZWVkIHRvIGJlIHJlbW92ZWQgb25jZSBhbGwgb2YKKyAgLy8vIHRoZSBiYWNrZW5kcy9jbGllbnRzIGFyZSB1cGRhdGVkLgorICB1bnNpZ25lZCBnZXRQb2ludGVyU2l6ZUluQml0cyh1bnNpZ25lZCBBUyA9IDApIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UG9pbnRlclNpemUoQVMpICogODsKKyAgfQorCisgIC8vLyBTaXplIGluIGJpdHMgb2YgaW5kZXggdXNlZCBmb3IgYWRkcmVzcyBjYWxjdWxhdGlvbiBpbiBnZXRlbGVtZW50cHRyLgorICB1bnNpZ25lZCBnZXRJbmRleFNpemVJbkJpdHModW5zaWduZWQgQVMpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW5kZXhTaXplKEFTKSAqIDg7CisgIH0KKworICAvLy8gTGF5b3V0IHBvaW50ZXIgc2l6ZSwgaW4gYml0cywgYmFzZWQgb24gdGhlIHR5cGUuICBJZiB0aGlzIGZ1bmN0aW9uIGlzCisgIC8vLyBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgdHlwZSwgdGhlbiB0aGUgdHlwZSBzaXplIG9mIHRoZSBwb2ludGVyIGlzIHJldHVybmVkLgorICAvLy8gSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhIHZlY3RvciBvZiBwb2ludGVycywgdGhlbiB0aGUgdHlwZSBzaXplCisgIC8vLyBvZiB0aGUgcG9pbnRlciBpcyByZXR1cm5lZC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdpdGggYSBwb2ludGVyIG9yCisgIC8vLyB2ZWN0b3Igb2YgcG9pbnRlcnMuCisgIHVuc2lnbmVkIGdldFBvaW50ZXJUeXBlU2l6ZUluQml0cyhUeXBlICopIGNvbnN0OworCisgIC8vLyBMYXlvdXQgc2l6ZSBvZiB0aGUgaW5kZXggdXNlZCBpbiBHRVAgY2FsY3VsYXRpb24uCisgIC8vLyBUaGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHBvaW50ZXIgb3IgdmVjdG9yIG9mIHBvaW50ZXJzIHR5cGUuCisgIHVuc2lnbmVkIGdldEluZGV4VHlwZVNpemVJbkJpdHMoVHlwZSAqVHkpIGNvbnN0OworCisgIHVuc2lnbmVkIGdldFBvaW50ZXJUeXBlU2l6ZShUeXBlICpUeSkgY29uc3QgeworICAgIHJldHVybiBnZXRQb2ludGVyVHlwZVNpemVJbkJpdHMoVHkpIC8gODsKKyAgfQorCisgIC8vLyBTaXplIGV4YW1wbGVzOgorICAvLy8KKyAgLy8vIFR5cGUgICAgICAgIFNpemVJbkJpdHMgIFN0b3JlU2l6ZUluQml0cyAgQWxsb2NTaXplSW5CaXRzWypdCisgIC8vLyAtLS0tICAgICAgICAtLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLQorICAvLy8gIGkxICAgICAgICAgICAgMSAgICAgICAgICAgOCAgICAgICAgICAgICAgICA4CisgIC8vLyAgaTggICAgICAgICAgICA4ICAgICAgICAgICA4ICAgICAgICAgICAgICAgIDgKKyAgLy8vICBpMTkgICAgICAgICAgMTkgICAgICAgICAgMjQgICAgICAgICAgICAgICAzMgorICAvLy8gIGkzMiAgICAgICAgICAzMiAgICAgICAgICAzMiAgICAgICAgICAgICAgIDMyCisgIC8vLyAgaTEwMCAgICAgICAgMTAwICAgICAgICAgMTA0ICAgICAgICAgICAgICAxMjgKKyAgLy8vICBpMTI4ICAgICAgICAxMjggICAgICAgICAxMjggICAgICAgICAgICAgIDEyOAorICAvLy8gIEZsb2F0ICAgICAgICAzMiAgICAgICAgICAzMiAgICAgICAgICAgICAgIDMyCisgIC8vLyAgRG91YmxlICAgICAgIDY0ICAgICAgICAgIDY0ICAgICAgICAgICAgICAgNjQKKyAgLy8vICBYODZfRlA4MCAgICAgODAgICAgICAgICAgODAgICAgICAgICAgICAgICA5NgorICAvLy8KKyAgLy8vIFsqXSBUaGUgYWxsb2Mgc2l6ZSBkZXBlbmRzIG9uIHRoZSBhbGlnbm1lbnQsIGFuZCB0aHVzIG9uIHRoZSB0YXJnZXQuCisgIC8vLyAgICAgVGhlc2UgdmFsdWVzIGFyZSBmb3IgeDg2LTMyIGxpbnV4LgorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJpdHMgbmVjZXNzYXJ5IHRvIGhvbGQgdGhlIHNwZWNpZmllZCB0eXBlLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlLCByZXR1cm5zIDM2IGZvciBpMzYgYW5kIDgwIGZvciB4ODZfZnA4MC4gVGhlIHR5cGUgcGFzc2VkIG11c3QKKyAgLy8vIGhhdmUgYSBzaXplIChUeXBlOjppc1NpemVkKCkgbXVzdCByZXR1cm4gdHJ1ZSkuCisgIHVpbnQ2NF90IGdldFR5cGVTaXplSW5CaXRzKFR5cGUgKlR5KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWF5IGJlIG92ZXJ3cml0dGVuIGJ5CisgIC8vLyBzdG9yaW5nIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgLy8vCisgIC8vLyBGb3IgZXhhbXBsZSwgcmV0dXJucyA1IGZvciBpMzYgYW5kIDEwIGZvciB4ODZfZnA4MC4KKyAgdWludDY0X3QgZ2V0VHlwZVN0b3JlU2l6ZShUeXBlICpUeSkgY29uc3QgeworICAgIHJldHVybiAoZ2V0VHlwZVNpemVJbkJpdHMoVHkpICsgNykgLyA4OworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBiaXRzIHRoYXQgbWF5IGJlIG92ZXJ3cml0dGVuIGJ5CisgIC8vLyBzdG9yaW5nIHRoZSBzcGVjaWZpZWQgdHlwZTsgYWx3YXlzIGEgbXVsdGlwbGUgb2YgOC4KKyAgLy8vCisgIC8vLyBGb3IgZXhhbXBsZSwgcmV0dXJucyA0MCBmb3IgaTM2IGFuZCA4MCBmb3IgeDg2X2ZwODAuCisgIHVpbnQ2NF90IGdldFR5cGVTdG9yZVNpemVJbkJpdHMoVHlwZSAqVHkpIGNvbnN0IHsKKyAgICByZXR1cm4gOCAqIGdldFR5cGVTdG9yZVNpemUoVHkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBvZmZzZXQgaW4gYnl0ZXMgYmV0d2VlbiBzdWNjZXNzaXZlIG9iamVjdHMgb2YgdGhlCisgIC8vLyBzcGVjaWZpZWQgdHlwZSwgaW5jbHVkaW5nIGFsaWdubWVudCBwYWRkaW5nLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdGhlIGFtb3VudCB0aGF0IGFsbG9jYSByZXNlcnZlcyBmb3IgdGhpcyB0eXBlLiBGb3IgZXhhbXBsZSwKKyAgLy8vIHJldHVybnMgMTIgb3IgMTYgZm9yIHg4Nl9mcDgwLCBkZXBlbmRpbmcgb24gYWxpZ25tZW50LgorICB1aW50NjRfdCBnZXRUeXBlQWxsb2NTaXplKFR5cGUgKlR5KSBjb25zdCB7CisgICAgLy8gUm91bmQgdXAgdG8gdGhlIG5leHQgYWxpZ25tZW50IGJvdW5kYXJ5LgorICAgIHJldHVybiBhbGlnblRvKGdldFR5cGVTdG9yZVNpemUoVHkpLCBnZXRBQklUeXBlQWxpZ25tZW50KFR5KSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG9mZnNldCBpbiBiaXRzIGJldHdlZW4gc3VjY2Vzc2l2ZSBvYmplY3RzIG9mIHRoZQorICAvLy8gc3BlY2lmaWVkIHR5cGUsIGluY2x1ZGluZyBhbGlnbm1lbnQgcGFkZGluZzsgYWx3YXlzIGEgbXVsdGlwbGUgb2YgOC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHRoZSBhbW91bnQgdGhhdCBhbGxvY2EgcmVzZXJ2ZXMgZm9yIHRoaXMgdHlwZS4gRm9yIGV4YW1wbGUsCisgIC8vLyByZXR1cm5zIDk2IG9yIDEyOCBmb3IgeDg2X2ZwODAsIGRlcGVuZGluZyBvbiBhbGlnbm1lbnQuCisgIHVpbnQ2NF90IGdldFR5cGVBbGxvY1NpemVJbkJpdHMoVHlwZSAqVHkpIGNvbnN0IHsKKyAgICByZXR1cm4gOCAqIGdldFR5cGVBbGxvY1NpemUoVHkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBtaW5pbXVtIEFCSS1yZXF1aXJlZCBhbGlnbm1lbnQgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgdW5zaWduZWQgZ2V0QUJJVHlwZUFsaWdubWVudChUeXBlICpUeSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBtaW5pbXVtIEFCSS1yZXF1aXJlZCBhbGlnbm1lbnQgZm9yIGFuIGludGVnZXIgdHlwZSBvZgorICAvLy8gdGhlIHNwZWNpZmllZCBiaXR3aWR0aC4KKyAgdW5zaWduZWQgZ2V0QUJJSW50ZWdlclR5cGVBbGlnbm1lbnQodW5zaWduZWQgQml0V2lkdGgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgcHJlZmVycmVkIHN0YWNrL2dsb2JhbCBhbGlnbm1lbnQgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHR5cGUuCisgIC8vLworICAvLy8gVGhpcyBpcyBhbHdheXMgYXQgbGVhc3QgYXMgZ29vZCBhcyB0aGUgQUJJIGFsaWdubWVudC4KKyAgdW5zaWduZWQgZ2V0UHJlZlR5cGVBbGlnbm1lbnQoVHlwZSAqVHkpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgcHJlZmVycmVkIGFsaWdubWVudCBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLCByZXR1cm5lZCBhcworICAvLy8gbG9nMiBvZiB0aGUgdmFsdWUgKGEgc2hpZnQgYW1vdW50KS4KKyAgdW5zaWduZWQgZ2V0UHJlZmVycmVkVHlwZUFsaWdubWVudFNoaWZ0KFR5cGUgKlR5KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgYW4gaW50ZWdlciB0eXBlIHdpdGggc2l6ZSBhdCBsZWFzdCBhcyBiaWcgYXMgdGhhdCBvZiBhCisgIC8vLyBwb2ludGVyIGluIHRoZSBnaXZlbiBhZGRyZXNzIHNwYWNlLgorICBJbnRlZ2VyVHlwZSAqZ2V0SW50UHRyVHlwZShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQWRkcmVzc1NwYWNlID0gMCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGFuIGludGVnZXIgKHZlY3RvciBvZiBpbnRlZ2VyKSB0eXBlIHdpdGggc2l6ZSBhdCBsZWFzdCBhcworICAvLy8gYmlnIGFzIHRoYXQgb2YgYSBwb2ludGVyIG9mIHRoZSBnaXZlbiBwb2ludGVyICh2ZWN0b3Igb2YgcG9pbnRlcikgdHlwZS4KKyAgVHlwZSAqZ2V0SW50UHRyVHlwZShUeXBlICopIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgc21hbGxlc3QgaW50ZWdlciB0eXBlIHdpdGggc2l6ZSBhdCBsZWFzdCBhcyBiaWcgYXMKKyAgLy8vIFdpZHRoIGJpdHMuCisgIFR5cGUgKmdldFNtYWxsZXN0TGVnYWxJbnRUeXBlKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBXaWR0aCA9IDApIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbGFyZ2VzdCBsZWdhbCBpbnRlZ2VyIHR5cGUsIG9yIG51bGwgaWYgbm9uZSBhcmUgc2V0LgorICBUeXBlICpnZXRMYXJnZXN0TGVnYWxJbnRUeXBlKExMVk1Db250ZXh0ICZDKSBjb25zdCB7CisgICAgdW5zaWduZWQgTGFyZ2VzdFNpemUgPSBnZXRMYXJnZXN0TGVnYWxJbnRUeXBlU2l6ZUluQml0cygpOworICAgIHJldHVybiAoTGFyZ2VzdFNpemUgPT0gMCkgPyBudWxscHRyIDogVHlwZTo6Z2V0SW50TlR5KEMsIExhcmdlc3RTaXplKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgc2l6ZSBvZiBsYXJnZXN0IGxlZ2FsIGludGVnZXIgdHlwZSBzaXplLCBvciAwIGlmIG5vbmUKKyAgLy8vIGFyZSBzZXQuCisgIHVuc2lnbmVkIGdldExhcmdlc3RMZWdhbEludFR5cGVTaXplSW5CaXRzKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSB0eXBlIG9mIGEgR0VQIGluZGV4LgorICAvLy8gSWYgaXQgd2FzIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseSwgaXQgd2lsbCBiZSB0aGUgaW50ZWdlciB0eXBlIG9mIHRoZQorICAvLy8gcG9pbnRlciB3aWR0aCAtIEludFB0clR5cGUuCisgIFR5cGUgKmdldEluZGV4VHlwZShUeXBlICpQdHJUeSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0eXBlIGZvciB0aGUgc3BlY2lmaWVkCisgIC8vLyBpbmRpY2VzLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIHRha2VzIHRoZSBlbGVtZW50IHR5cGUsIG5vdCB0aGUgcG9pbnRlciB0eXBlLgorICAvLy8gVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCBnZXRlbGVtZW50cHRyLgorICBpbnQ2NF90IGdldEluZGV4ZWRPZmZzZXRJblR5cGUoVHlwZSAqRWxlbVR5LCBBcnJheVJlZjxWYWx1ZSAqPiBJbmRpY2VzKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgYSBTdHJ1Y3RMYXlvdXQgb2JqZWN0LCBpbmRpY2F0aW5nIHRoZSBhbGlnbm1lbnQgb2YgdGhlCisgIC8vLyBzdHJ1Y3QsIGl0cyBzaXplLCBhbmQgdGhlIG9mZnNldHMgb2YgaXRzIGZpZWxkcy4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBsYXppbHkgY2FjaGVkLgorICBjb25zdCBTdHJ1Y3RMYXlvdXQgKmdldFN0cnVjdExheW91dChTdHJ1Y3RUeXBlICpUeSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBwcmVmZXJyZWQgYWxpZ25tZW50IG9mIHRoZSBzcGVjaWZpZWQgZ2xvYmFsLgorICAvLy8KKyAgLy8vIFRoaXMgaW5jbHVkZXMgYW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgYWxpZ25tZW50IChpZiB0aGUgZ2xvYmFsIGhhcyBvbmUpLgorICB1bnNpZ25lZCBnZXRQcmVmZXJyZWRBbGlnbm1lbnQoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHByZWZlcnJlZCBhbGlnbm1lbnQgb2YgdGhlIHNwZWNpZmllZCBnbG9iYWwsIHJldHVybmVkCisgIC8vLyBpbiBsb2cgZm9ybS4KKyAgLy8vCisgIC8vLyBUaGlzIGluY2x1ZGVzIGFuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGFsaWdubWVudCAoaWYgdGhlIGdsb2JhbCBoYXMgb25lKS4KKyAgdW5zaWduZWQgZ2V0UHJlZmVycmVkQWxpZ25tZW50TG9nKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHVikgY29uc3Q7Cit9OworCitpbmxpbmUgRGF0YUxheW91dCAqdW53cmFwKExMVk1UYXJnZXREYXRhUmVmIFApIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RGF0YUxheW91dCAqPihQKTsKK30KKworaW5saW5lIExMVk1UYXJnZXREYXRhUmVmIHdyYXAoY29uc3QgRGF0YUxheW91dCAqUCkgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxMTFZNVGFyZ2V0RGF0YVJlZj4oY29uc3RfY2FzdDxEYXRhTGF5b3V0ICo+KFApKTsKK30KKworLy8vIFVzZWQgdG8gbGF6aWx5IGNhbGN1bGF0ZSBzdHJ1Y3R1cmUgbGF5b3V0IGluZm9ybWF0aW9uIGZvciBhIHRhcmdldCBtYWNoaW5lLAorLy8vIGJhc2VkIG9uIHRoZSBEYXRhTGF5b3V0IHN0cnVjdHVyZS4KK2NsYXNzIFN0cnVjdExheW91dCB7CisgIHVpbnQ2NF90IFN0cnVjdFNpemU7CisgIHVuc2lnbmVkIFN0cnVjdEFsaWdubWVudDsKKyAgdW5zaWduZWQgSXNQYWRkZWQgOiAxOworICB1bnNpZ25lZCBOdW1FbGVtZW50cyA6IDMxOworICB1aW50NjRfdCBNZW1iZXJPZmZzZXRzWzFdOyAvLyB2YXJpYWJsZSBzaXplZCBhcnJheSEKKworcHVibGljOgorICB1aW50NjRfdCBnZXRTaXplSW5CeXRlcygpIGNvbnN0IHsgcmV0dXJuIFN0cnVjdFNpemU7IH0KKworICB1aW50NjRfdCBnZXRTaXplSW5CaXRzKCkgY29uc3QgeyByZXR1cm4gOCAqIFN0cnVjdFNpemU7IH0KKworICB1bnNpZ25lZCBnZXRBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBTdHJ1Y3RBbGlnbm1lbnQ7IH0KKworICAvLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBzdHJ1Y3QgaGFzIHBhZGRpbmcgb3Igbm90IGJldHdlZW4gaXRzIGZpZWxkcy4KKyAgLy8vIE5COiBQYWRkaW5nIGluIG5lc3RlZCBlbGVtZW50IGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQuCisgIGJvb2wgaGFzUGFkZGluZygpIGNvbnN0IHsgcmV0dXJuIElzUGFkZGVkOyB9CisKKyAgLy8vIFxicmllZiBHaXZlbiBhIHZhbGlkIGJ5dGUgb2Zmc2V0IGludG8gdGhlIHN0cnVjdHVyZSwgcmV0dXJucyB0aGUgc3RydWN0dXJlCisgIC8vLyBpbmRleCB0aGF0IGNvbnRhaW5zIGl0LgorICB1bnNpZ25lZCBnZXRFbGVtZW50Q29udGFpbmluZ09mZnNldCh1aW50NjRfdCBPZmZzZXQpIGNvbnN0OworCisgIHVpbnQ2NF90IGdldEVsZW1lbnRPZmZzZXQodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KElkeCA8IE51bUVsZW1lbnRzICYmICJJbnZhbGlkIGVsZW1lbnQgaWR4ISIpOworICAgIHJldHVybiBNZW1iZXJPZmZzZXRzW0lkeF07CisgIH0KKworICB1aW50NjRfdCBnZXRFbGVtZW50T2Zmc2V0SW5CaXRzKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIHJldHVybiBnZXRFbGVtZW50T2Zmc2V0KElkeCkgKiA4OworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBEYXRhTGF5b3V0OyAvLyBPbmx5IERhdGFMYXlvdXQgY2FuIGNyZWF0ZSB0aGlzIGNsYXNzCisKKyAgU3RydWN0TGF5b3V0KFN0cnVjdFR5cGUgKlNULCBjb25zdCBEYXRhTGF5b3V0ICZETCk7Cit9OworCisvLyBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgaW5saW5lIGFzIGl0IGlzIHBhcnRpY3VsYXJseQorLy8gd2VsbCBzdWl0ZWQgdG8gY29uc3RhbnQgZm9sZGluZyB3aGVuIGNhbGxlZCBvbiBhIHNwZWNpZmljIFR5cGUgc3ViY2xhc3MuCitpbmxpbmUgdWludDY0X3QgRGF0YUxheW91dDo6Z2V0VHlwZVNpemVJbkJpdHMoVHlwZSAqVHkpIGNvbnN0IHsKKyAgYXNzZXJ0KFR5LT5pc1NpemVkKCkgJiYgIkNhbm5vdCBnZXRUeXBlSW5mbygpIG9uIGEgdHlwZSB0aGF0IGlzIHVuc2l6ZWQhIik7CisgIHN3aXRjaCAoVHktPmdldFR5cGVJRCgpKSB7CisgIGNhc2UgVHlwZTo6TGFiZWxUeUlEOgorICAgIHJldHVybiBnZXRQb2ludGVyU2l6ZUluQml0cygwKTsKKyAgY2FzZSBUeXBlOjpQb2ludGVyVHlJRDoKKyAgICByZXR1cm4gZ2V0UG9pbnRlclNpemVJbkJpdHMoVHktPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKSk7CisgIGNhc2UgVHlwZTo6QXJyYXlUeUlEOiB7CisgICAgQXJyYXlUeXBlICpBVHkgPSBjYXN0PEFycmF5VHlwZT4oVHkpOworICAgIHJldHVybiBBVHktPmdldE51bUVsZW1lbnRzKCkgKgorICAgICAgICAgICBnZXRUeXBlQWxsb2NTaXplSW5CaXRzKEFUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgIH0KKyAgY2FzZSBUeXBlOjpTdHJ1Y3RUeUlEOgorICAgIC8vIEdldCB0aGUgbGF5b3V0IGFubm90YXRpb24uLi4gd2hpY2ggaXMgbGF6aWx5IGNyZWF0ZWQgb24gZGVtYW5kLgorICAgIHJldHVybiBnZXRTdHJ1Y3RMYXlvdXQoY2FzdDxTdHJ1Y3RUeXBlPihUeSkpLT5nZXRTaXplSW5CaXRzKCk7CisgIGNhc2UgVHlwZTo6SW50ZWdlclR5SUQ6CisgICAgcmV0dXJuIFR5LT5nZXRJbnRlZ2VyQml0V2lkdGgoKTsKKyAgY2FzZSBUeXBlOjpIYWxmVHlJRDoKKyAgICByZXR1cm4gMTY7CisgIGNhc2UgVHlwZTo6RmxvYXRUeUlEOgorICAgIHJldHVybiAzMjsKKyAgY2FzZSBUeXBlOjpEb3VibGVUeUlEOgorICBjYXNlIFR5cGU6Olg4Nl9NTVhUeUlEOgorICAgIHJldHVybiA2NDsKKyAgY2FzZSBUeXBlOjpQUENfRlAxMjhUeUlEOgorICBjYXNlIFR5cGU6OkZQMTI4VHlJRDoKKyAgICByZXR1cm4gMTI4OworICAvLyBJbiBtZW1vcnkgb2JqZWN0cyB0aGlzIGlzIGFsd2F5cyBhbGlnbmVkIHRvIGEgaGlnaGVyIGJvdW5kYXJ5LCBidXQKKyAgLy8gb25seSA4MCBiaXRzIGNvbnRhaW4gaW5mb3JtYXRpb24uCisgIGNhc2UgVHlwZTo6WDg2X0ZQODBUeUlEOgorICAgIHJldHVybiA4MDsKKyAgY2FzZSBUeXBlOjpWZWN0b3JUeUlEOiB7CisgICAgVmVjdG9yVHlwZSAqVlR5ID0gY2FzdDxWZWN0b3JUeXBlPihUeSk7CisgICAgcmV0dXJuIFZUeS0+Z2V0TnVtRWxlbWVudHMoKSAqIGdldFR5cGVTaXplSW5CaXRzKFZUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgIH0KKyAgZGVmYXVsdDoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJEYXRhTGF5b3V0OjpnZXRUeXBlU2l6ZUluQml0cygpOiBVbnN1cHBvcnRlZCB0eXBlIik7CisgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfREFUQUxBWU9VVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RlYnVnSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EZWJ1Z0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDhlN2UyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EZWJ1Z0luZm8uaApAQCAtMCwwICsxLDEzOCBAQAorLy89PT0tIERlYnVnSW5mby5oIC0gRGVidWcgSW5mb3JtYXRpb24gSGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIGJ1bmNoIG9mIGRhdGF0eXBlcyB0aGF0IGFyZSB1c2VmdWwgZm9yIGNyZWF0aW5nIGFuZAorLy8gd2Fsa2luZyBkZWJ1ZyBpbmZvIGluIExMVk0gSVIgZm9ybS4gVGhleSBlc3NlbnRpYWxseSBwcm92aWRlIHdyYXBwZXJzIGFyb3VuZAorLy8gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBnbG9iYWwgdmFyaWFibGVzIHRoYXQncyBuZWVkZWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlCisvLyBEV0FSRiBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfREVCVUdJTkZPX0gKKyNkZWZpbmUgTExWTV9JUl9ERUJVR0lORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZWJ1Z0luZm9NZXRhZGF0YS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIERiZ0RlY2xhcmVJbnN0OworY2xhc3MgRGJnVmFsdWVJbnN0OworY2xhc3MgTW9kdWxlOworCisvLy8gXGJyaWVmIEZpbmQgc3VicHJvZ3JhbSB0aGF0IGlzIGVuY2xvc2luZyB0aGlzIHNjb3BlLgorRElTdWJwcm9ncmFtICpnZXRESVN1YnByb2dyYW0oY29uc3QgTUROb2RlICpTY29wZSk7CisKKy8vLyBcYnJpZWYgU3RyaXAgZGVidWcgaW5mbyBpbiB0aGUgbW9kdWxlIGlmIGl0IGV4aXN0cy4KKy8vLworLy8vIFRvIGRvIHRoaXMsIHdlIHJlbW92ZSBhbGwgY2FsbHMgdG8gdGhlIGRlYnVnZ2VyIGludHJpbnNpY3MgYW5kIGFueSBuYW1lZAorLy8vIG1ldGFkYXRhIGZvciBkZWJ1Z2dpbmcuIFdlIGFsc28gcmVtb3ZlIGRlYnVnIGxvY2F0aW9ucyBmb3IgaW5zdHJ1Y3Rpb25zLgorLy8vIFJldHVybiB0cnVlIGlmIG1vZHVsZSBpcyBtb2RpZmllZC4KK2Jvb2wgU3RyaXBEZWJ1Z0luZm8oTW9kdWxlICZNKTsKK2Jvb2wgc3RyaXBEZWJ1Z0luZm8oRnVuY3Rpb24gJkYpOworCisvLy8gRG93bmdyYWRlIHRoZSBkZWJ1ZyBpbmZvIGluIGEgbW9kdWxlIHRvIGNvbnRhaW4gb25seSBsaW5lIHRhYmxlIGluZm9ybWF0aW9uLgorLy8vCisvLy8gSW4gb3JkZXIgdG8gY29udmVydCBkZWJ1ZyBpbmZvIHRvIHdoYXQgLWdsaW5lLXRhYmxlcy1vbmx5IHdvdWxkIGhhdmUKKy8vLyBjcmVhdGVkLCB0aGlzIGRvZXMgdGhlIGZvbGxvd2luZzoKKy8vLyAgIDEpIERlbGV0ZSBhbGwgZGVidWcgaW50cmluc2ljcy4KKy8vLyAgIDIpIERlbGV0ZSBhbGwgbm9uLUNVIG5hbWVkIG1ldGFkYXRhIGRlYnVnIGluZm8gbm9kZXMuCisvLy8gICAzKSBDcmVhdGUgbmV3IERlYnVnTG9jcyBmb3IgZWFjaCBpbnN0cnVjdGlvbi4KKy8vLyAgIDQpIENyZWF0ZSBhIG5ldyBDVSBkZWJ1ZyBpbmZvLCBhbmQgc2ltaWxhcmx5IGZvciBldmVyeSBtZXRhZGF0YSBub2RlCisvLy8gICAgICB0aGF0J3MgcmVhY2hhYmxlIGZyb20gdGhlIENVIGRlYnVnIGluZm8uCisvLy8gICBBbGwgZGVidWcgdHlwZSBtZXRhZGF0YSBub2RlcyBhcmUgdW5yZWFjaGFibGUgYW5kIGdhcmJhZ2UgY29sbGVjdGVkLgorYm9vbCBzdHJpcE5vbkxpbmVUYWJsZURlYnVnSW5mbyhNb2R1bGUgJk0pOworCisvLy8gXGJyaWVmIFJldHVybiBEZWJ1ZyBJbmZvIE1ldGFkYXRhIFZlcnNpb24gYnkgY2hlY2tpbmcgbW9kdWxlIGZsYWdzLgordW5zaWduZWQgZ2V0RGVidWdNZXRhZGF0YVZlcnNpb25Gcm9tTW9kdWxlKGNvbnN0IE1vZHVsZSAmTSk7CisKKy8vLyBcYnJpZWYgVXRpbGl0eSB0byBmaW5kIGFsbCBkZWJ1ZyBpbmZvIGluIGEgbW9kdWxlLgorLy8vCisvLy8gRGVidWdJbmZvRmluZGVyIHRyaWVzIHRvIGxpc3QgYWxsIGRlYnVnIGluZm8gTUROb2RlcyB1c2VkIGluIGEgbW9kdWxlLiBUbworLy8vIGxpc3QgZGVidWcgaW5mbyBNRE5vZGVzIHVzZWQgYnkgYW4gaW5zdHJ1Y3Rpb24sIERlYnVnSW5mb0ZpbmRlciB1c2VzCisvLy8gcHJvY2Vzc0RlY2xhcmUsIHByb2Nlc3NWYWx1ZSBhbmQgcHJvY2Vzc0xvY2F0aW9uIHRvIGhhbmRsZSBEYmdEZWNsYXJlSW5zdCwKKy8vLyBEYmdWYWx1ZUluc3QgYW5kIERiZ0xvYyBhdHRhY2hlZCB0byBpbnN0cnVjdGlvbnMuIHByb2Nlc3NNb2R1bGUgd2lsbCBnbworLy8vIHRocm91Z2ggYWxsIERJQ29tcGlsZVVuaXRzIGluIGxsdm0uZGJnLmN1IGFuZCBsaXN0IGRlYnVnIGluZm8gTUROb2RlcworLy8vIHVzZWQgYnkgdGhlIENVcy4KK2NsYXNzIERlYnVnSW5mb0ZpbmRlciB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgUHJvY2VzcyBlbnRpcmUgbW9kdWxlIGFuZCBjb2xsZWN0IGRlYnVnIGluZm8gYW5jaG9ycy4KKyAgdm9pZCBwcm9jZXNzTW9kdWxlKGNvbnN0IE1vZHVsZSAmTSk7CisKKyAgLy8vIFxicmllZiBQcm9jZXNzIERiZ0RlY2xhcmVJbnN0LgorICB2b2lkIHByb2Nlc3NEZWNsYXJlKGNvbnN0IE1vZHVsZSAmTSwgY29uc3QgRGJnRGVjbGFyZUluc3QgKkRESSk7CisgIC8vLyBcYnJpZWYgUHJvY2VzcyBEYmdWYWx1ZUluc3QuCisgIHZvaWQgcHJvY2Vzc1ZhbHVlKGNvbnN0IE1vZHVsZSAmTSwgY29uc3QgRGJnVmFsdWVJbnN0ICpEVkkpOworICAvLy8gXGJyaWVmIFByb2Nlc3MgZGVidWcgaW5mbyBsb2NhdGlvbi4KKyAgdm9pZCBwcm9jZXNzTG9jYXRpb24oY29uc3QgTW9kdWxlICZNLCBjb25zdCBESUxvY2F0aW9uICpMb2MpOworCisgIC8vLyBcYnJpZWYgQ2xlYXIgYWxsIGxpc3RzLgorICB2b2lkIHJlc2V0KCk7CisKK3ByaXZhdGU6CisgIHZvaWQgSW5pdGlhbGl6ZVR5cGVNYXAoY29uc3QgTW9kdWxlICZNKTsKKworICB2b2lkIHByb2Nlc3NUeXBlKERJVHlwZSAqRFQpOworICB2b2lkIHByb2Nlc3NTdWJwcm9ncmFtKERJU3VicHJvZ3JhbSAqU1ApOworICB2b2lkIHByb2Nlc3NTY29wZShESVNjb3BlICpTY29wZSk7CisgIGJvb2wgYWRkQ29tcGlsZVVuaXQoRElDb21waWxlVW5pdCAqQ1UpOworICBib29sIGFkZEdsb2JhbFZhcmlhYmxlKERJR2xvYmFsVmFyaWFibGVFeHByZXNzaW9uICpESUcpOworICBib29sIGFkZFN1YnByb2dyYW0oRElTdWJwcm9ncmFtICpTUCk7CisgIGJvb2wgYWRkVHlwZShESVR5cGUgKkRUKTsKKyAgYm9vbCBhZGRTY29wZShESVNjb3BlICpTY29wZSk7CisKK3B1YmxpYzoKKyAgdXNpbmcgY29tcGlsZV91bml0X2l0ZXJhdG9yID0KKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxESUNvbXBpbGVVbml0ICo+Ojpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgc3VicHJvZ3JhbV9pdGVyYXRvciA9IFNtYWxsVmVjdG9ySW1wbDxESVN1YnByb2dyYW0gKj46OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBnbG9iYWxfdmFyaWFibGVfZXhwcmVzc2lvbl9pdGVyYXRvciA9CisgICAgICBTbWFsbFZlY3RvckltcGw8RElHbG9iYWxWYXJpYWJsZUV4cHJlc3Npb24gKj46OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyB0eXBlX2l0ZXJhdG9yID0gU21hbGxWZWN0b3JJbXBsPERJVHlwZSAqPjo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIHNjb3BlX2l0ZXJhdG9yID0gU21hbGxWZWN0b3JJbXBsPERJU2NvcGUgKj46OmNvbnN0X2l0ZXJhdG9yOworCisgIGl0ZXJhdG9yX3JhbmdlPGNvbXBpbGVfdW5pdF9pdGVyYXRvcj4gY29tcGlsZV91bml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShDVXMuYmVnaW4oKSwgQ1VzLmVuZCgpKTsKKyAgfQorCisgIGl0ZXJhdG9yX3JhbmdlPHN1YnByb2dyYW1faXRlcmF0b3I+IHN1YnByb2dyYW1zKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKFNQcy5iZWdpbigpLCBTUHMuZW5kKCkpOworICB9CisKKyAgaXRlcmF0b3JfcmFuZ2U8Z2xvYmFsX3ZhcmlhYmxlX2V4cHJlc3Npb25faXRlcmF0b3I+IGdsb2JhbF92YXJpYWJsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoR1ZzLmJlZ2luKCksIEdWcy5lbmQoKSk7CisgIH0KKworICBpdGVyYXRvcl9yYW5nZTx0eXBlX2l0ZXJhdG9yPiB0eXBlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShUWXMuYmVnaW4oKSwgVFlzLmVuZCgpKTsKKyAgfQorCisgIGl0ZXJhdG9yX3JhbmdlPHNjb3BlX2l0ZXJhdG9yPiBzY29wZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoU2NvcGVzLmJlZ2luKCksIFNjb3Blcy5lbmQoKSk7CisgIH0KKworICB1bnNpZ25lZCBjb21waWxlX3VuaXRfY291bnQoKSBjb25zdCB7IHJldHVybiBDVXMuc2l6ZSgpOyB9CisgIHVuc2lnbmVkIGdsb2JhbF92YXJpYWJsZV9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIEdWcy5zaXplKCk7IH0KKyAgdW5zaWduZWQgc3VicHJvZ3JhbV9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIFNQcy5zaXplKCk7IH0KKyAgdW5zaWduZWQgdHlwZV9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIFRZcy5zaXplKCk7IH0KKyAgdW5zaWduZWQgc2NvcGVfY291bnQoKSBjb25zdCB7IHJldHVybiBTY29wZXMuc2l6ZSgpOyB9CisKK3ByaXZhdGU6CisgIFNtYWxsVmVjdG9yPERJQ29tcGlsZVVuaXQgKiwgOD4gQ1VzOworICBTbWFsbFZlY3RvcjxESVN1YnByb2dyYW0gKiwgOD4gU1BzOworICBTbWFsbFZlY3RvcjxESUdsb2JhbFZhcmlhYmxlRXhwcmVzc2lvbiAqLCA4PiBHVnM7CisgIFNtYWxsVmVjdG9yPERJVHlwZSAqLCA4PiBUWXM7CisgIFNtYWxsVmVjdG9yPERJU2NvcGUgKiwgOD4gU2NvcGVzOworICBTbWFsbFB0clNldDxjb25zdCBNRE5vZGUgKiwgMzI+IE5vZGVzU2VlbjsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0RFQlVHSU5GT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RlYnVnSW5mb0ZsYWdzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRGVidWdJbmZvRmxhZ3MuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NmI5NzgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RlYnVnSW5mb0ZsYWdzLmRlZgpAQCAtMCwwICsxLDYyIEBACisvLz09PS0gbGx2bS9JUi9EZWJ1Z0luZm9GbGFncy5kZWYgLSBEZWJ1ZyBpbmZvIGZsYWcgZGVmaW5pdGlvbnMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE1hY3JvcyBmb3IgcnVubmluZyB0aHJvdWdoIGRlYnVnIGluZm8gZmxhZ3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gVE9ETzogQWRkIG90aGVyIERXLWJhc2VkIG1hY3Jvcy4KKyNpZm5kZWYgSEFORExFX0RJX0ZMQUcKKyNlcnJvciAiTWlzc2luZyBtYWNybyBkZWZpbml0aW9uIG9mIEhBTkRMRV9ESV9GTEFHIgorI2VuZGlmCisKK0hBTkRMRV9ESV9GTEFHKDAsIFplcm8pIC8vIFVzZSBpdCBhcyB6ZXJvIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGU6IHZvaWQgZm9vKERJRmxhZ3MgRmxhZ3MgPSBGbGFnWmVybykuCitIQU5ETEVfRElfRkxBRygxLCBQcml2YXRlKQorSEFORExFX0RJX0ZMQUcoMiwgUHJvdGVjdGVkKQorSEFORExFX0RJX0ZMQUcoMywgUHVibGljKQorSEFORExFX0RJX0ZMQUcoKDEgPDwgMiksIEZ3ZERlY2wpCitIQU5ETEVfRElfRkxBRygoMSA8PCAzKSwgQXBwbGVCbG9jaykKK0hBTkRMRV9ESV9GTEFHKCgxIDw8IDQpLCBCbG9ja0J5cmVmU3RydWN0KQorSEFORExFX0RJX0ZMQUcoKDEgPDwgNSksIFZpcnR1YWwpCitIQU5ETEVfRElfRkxBRygoMSA8PCA2KSwgQXJ0aWZpY2lhbCkKK0hBTkRMRV9ESV9GTEFHKCgxIDw8IDcpLCBFeHBsaWNpdCkKK0hBTkRMRV9ESV9GTEFHKCgxIDw8IDgpLCBQcm90b3R5cGVkKQorSEFORExFX0RJX0ZMQUcoKDEgPDwgOSksIE9iamNDbGFzc0NvbXBsZXRlKQorSEFORExFX0RJX0ZMQUcoKDEgPDwgMTApLCBPYmplY3RQb2ludGVyKQorSEFORExFX0RJX0ZMQUcoKDEgPDwgMTEpLCBWZWN0b3IpCitIQU5ETEVfRElfRkxBRygoMSA8PCAxMiksIFN0YXRpY01lbWJlcikKK0hBTkRMRV9ESV9GTEFHKCgxIDw8IDEzKSwgTFZhbHVlUmVmZXJlbmNlKQorSEFORExFX0RJX0ZMQUcoKDEgPDwgMTQpLCBSVmFsdWVSZWZlcmVuY2UpCisvLyAxNSB3YXMgZm9ybWVybHkgRXh0ZXJuYWxUeXBlUmVmLCBidXQgdGhpcyB3YXMgbmV2ZXIgdXNlZC4KK0hBTkRMRV9ESV9GTEFHKCgxIDw8IDE1KSwgUmVzZXJ2ZWQpCitIQU5ETEVfRElfRkxBRygoMSA8PCAxNiksIFNpbmdsZUluaGVyaXRhbmNlKQorSEFORExFX0RJX0ZMQUcoKDIgPDwgMTYpLCBNdWx0aXBsZUluaGVyaXRhbmNlKQorSEFORExFX0RJX0ZMQUcoKDMgPDwgMTYpLCBWaXJ0dWFsSW5oZXJpdGFuY2UpCitIQU5ETEVfRElfRkxBRygoMSA8PCAxOCksIEludHJvZHVjZWRWaXJ0dWFsKQorSEFORExFX0RJX0ZMQUcoKDEgPDwgMTkpLCBCaXRGaWVsZCkKK0hBTkRMRV9ESV9GTEFHKCgxIDw8IDIwKSwgTm9SZXR1cm4pCitIQU5ETEVfRElfRkxBRygoMSA8PCAyMSksIE1haW5TdWJwcm9ncmFtKQorSEFORExFX0RJX0ZMQUcoKDEgPDwgMjIpLCBUeXBlUGFzc0J5VmFsdWUpCitIQU5ETEVfRElfRkxBRygoMSA8PCAyMyksIFR5cGVQYXNzQnlSZWZlcmVuY2UpCitIQU5ETEVfRElfRkxBRygoMSA8PCAyNCksIEZpeGVkRW51bSkKKworLy8gVG8gYXZvaWQgbmVlZGluZyBhIGRlZGljYXRlZCB2YWx1ZSBmb3IgSW5kaXJlY3RWaXJ0dWFsQmFzZSwgd2UgdXNlCisvLyB0aGUgYml0d2lzZSBvciBvZiBWaXJ0dWFsIGFuZCBGd2REZWNsLCB3aGljaCBkb2VzIG5vdCBvdGhlcndpc2UKKy8vIG1ha2Ugc2Vuc2UgZm9yIGluaGVyaXRhbmNlLgorSEFORExFX0RJX0ZMQUcoKDEgPDwgMikgfCAoMSA8PCA1KSwgSW5kaXJlY3RWaXJ0dWFsQmFzZSkKKworI2lmZGVmIERJX0ZMQUdfTEFSR0VTVF9ORUVERUQKKy8vIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBBRFQvQml0bWFza0VudW0uaAorLy8gTk9URTogYWx3YXlzIG11c3QgYmUgZXF1YWwgdG8gbGFyZ2VzdCBmbGFnLCBjaGVjayB0aGlzIHdoZW4gYWRkaW5nIG5ldyBmbGFnCitIQU5ETEVfRElfRkxBRygoMSA8PCAyNCksIExhcmdlc3QpCisjdW5kZWYgRElfRkxBR19MQVJHRVNUX05FRURFRAorI2VuZGlmCisKKyN1bmRlZiBIQU5ETEVfRElfRkxBRwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EZWJ1Z0luZm9NZXRhZGF0YS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EZWJ1Z0luZm9NZXRhZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMjEwYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RlYnVnSW5mb01ldGFkYXRhLmgKQEAgLTAsMCArMSwyOTYxIEBACisvLz09PS0gbGx2bS9JUi9EZWJ1Z0luZm9NZXRhZGF0YS5oIC0gRGVidWcgaW5mbyBtZXRhZGF0YSAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIERlY2xhcmF0aW9ucyBmb3IgbWV0YWRhdGEgc3BlY2lmaWMgdG8gZGVidWcgaW5mby4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfREVCVUdJTkZPTUVUQURBVEFfSAorI2RlZmluZSBMTFZNX0lSX0RFQlVHSU5GT01FVEFEQVRBX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0bWFza0VudW0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBIZWxwZXIgbWFjcm9zIGZvciBkZWZpbmluZyBnZXQoKSBvdmVycmlkZXMuCisjZGVmaW5lIERFRklORV9NRE5PREVfR0VUX1VOUEFDS19JTVBMKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgREVGSU5FX01ETk9ERV9HRVRfVU5QQUNLKEFSR1MpIERFRklORV9NRE5PREVfR0VUX1VOUEFDS19JTVBMIEFSR1MKKyNkZWZpbmUgREVGSU5FX01ETk9ERV9HRVRfRElTVElOQ1RfVEVNUE9SQVJZKENMQVNTLCBGT1JNQUwsIEFSR1MpICAgICAgICAgICAgICBcCisgIHN0YXRpYyBDTEFTUyAqZ2V0RGlzdGluY3QoTExWTUNvbnRleHQgJkNvbnRleHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRklORV9NRE5PREVfR0VUX1VOUEFDSyhGT1JNQUwpKSB7ICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gZ2V0SW1wbChDb250ZXh0LCBERUZJTkVfTUROT0RFX0dFVF9VTlBBQ0soQVJHUyksIERpc3RpbmN0KTsgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgVGVtcCMjQ0xBU1MgZ2V0VGVtcG9yYXJ5KExMVk1Db250ZXh0ICZDb250ZXh0LCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZJTkVfTUROT0RFX0dFVF9VTlBBQ0soRk9STUFMKSkgeyAgICAgICAgICBcCisgICAgcmV0dXJuIFRlbXAjI0NMQVNTKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnZXRJbXBsKENvbnRleHQsIERFRklORV9NRE5PREVfR0VUX1VOUEFDSyhBUkdTKSwgVGVtcG9yYXJ5KSk7ICAgICAgICAgIFwKKyAgfQorI2RlZmluZSBERUZJTkVfTUROT0RFX0dFVChDTEFTUywgRk9STUFMLCBBUkdTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIENMQVNTICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIERFRklORV9NRE5PREVfR0VUX1VOUEFDSyhGT1JNQUwpKSB7ICBcCisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgREVGSU5FX01ETk9ERV9HRVRfVU5QQUNLKEFSR1MpLCBVbmlxdWVkKTsgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIENMQVNTICpnZXRJZkV4aXN0cyhMTFZNQ29udGV4dCAmQ29udGV4dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGSU5FX01ETk9ERV9HRVRfVU5QQUNLKEZPUk1BTCkpIHsgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBnZXRJbXBsKENvbnRleHQsIERFRklORV9NRE5PREVfR0VUX1VOUEFDSyhBUkdTKSwgVW5pcXVlZCwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAvKiBTaG91bGRDcmVhdGUgKi8gZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBERUZJTkVfTUROT0RFX0dFVF9ESVNUSU5DVF9URU1QT1JBUlkoQ0xBU1MsIEZPUk1BTCwgQVJHUykKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gSG9sZHMgYSBzdWJjbGFzcyBvZiBESU5vZGUuCisvLy8KKy8vLyBGSVhNRTogVGhpcyBjbGFzcyBkb2Vzbid0IGN1cnJlbnRseSBtYWtlIG11Y2ggc2Vuc2UuICBQcmV2aW91c2x5IGl0IHdhcyBhCisvLy8gdW5pb24gYmV0ZWVuIE1EU3RyaW5nIChmb3IgT0RSLXVuaXF1ZWQgdHlwZXMpIGFuZCB0aGluZ3MgbGlrZSBESVR5cGUuICBUbworLy8vIHN1cHBvcnQgQ29kZVZpZXcgd29yaywgaXQgd2Fzbid0IGRlbGV0ZWQgb3V0cmlnaHQgd2hlbiBNRFN0cmluZy1iYXNlZCB0eXBlCisvLy8gcmVmZXJlbmNlcyB3ZXJlIGRlbGV0ZWQ7IHdlJ2xsIHNvb24gbmVlZCBhIHNpbWlsYXIgY29uY2VwdCBmb3IgQ29kZVZpZXcKKy8vLyBESVR5cGVJbmRleC4KK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBUeXBlZERJTm9kZVJlZiB7CisgIGNvbnN0IE1ldGFkYXRhICpNRCA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgVHlwZWRESU5vZGVSZWYoKSA9IGRlZmF1bHQ7CisgIFR5cGVkRElOb2RlUmVmKHN0ZDo6bnVsbHB0cl90KSB7fQorICBUeXBlZERJTm9kZVJlZihjb25zdCBUICpNRCkgOiBNRChNRCkge30KKworICBleHBsaWNpdCBUeXBlZERJTm9kZVJlZihjb25zdCBNZXRhZGF0YSAqTUQpIDogTUQoTUQpIHsKKyAgICBhc3NlcnQoKCFNRCB8fCBpc2E8VD4oTUQpKSAmJiAiRXhwZWN0ZWQgdmFsaWQgdHlwZSByZWYiKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBVPgorICBUeXBlZERJTm9kZVJlZigKKyAgICAgIGNvbnN0IFR5cGVkRElOb2RlUmVmPFU+ICZYLAorICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxVICosIFQgKj46OnZhbHVlPjo6dHlwZSAqID0KKyAgICAgICAgICBudWxscHRyKQorICAgICAgOiBNRChYKSB7fQorCisgIG9wZXJhdG9yIE1ldGFkYXRhICooKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PE1ldGFkYXRhICo+KE1EKTsgfQorCisgIFQgKnJlc29sdmUoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PFQgKj4oY2FzdF9vcl9udWxsPFQ+KE1EKSk7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVHlwZWRESU5vZGVSZWY8VD4gJlgpIGNvbnN0IHsgcmV0dXJuIE1EID09IFguTUQ7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFR5cGVkRElOb2RlUmVmPFQ+ICZYKSBjb25zdCB7IHJldHVybiBNRCAhPSBYLk1EOyB9Cit9OworCit1c2luZyBESU5vZGVSZWYgPSBUeXBlZERJTm9kZVJlZjxESU5vZGU+OwordXNpbmcgRElTY29wZVJlZiA9IFR5cGVkRElOb2RlUmVmPERJU2NvcGU+OwordXNpbmcgRElUeXBlUmVmID0gVHlwZWRESU5vZGVSZWY8RElUeXBlPjsKKworY2xhc3MgRElUeXBlUmVmQXJyYXkgeworICBjb25zdCBNRFR1cGxlICpOID0gbnVsbHB0cjsKKworcHVibGljOgorICBESVR5cGVSZWZBcnJheSgpID0gZGVmYXVsdDsKKyAgRElUeXBlUmVmQXJyYXkoY29uc3QgTURUdXBsZSAqTikgOiBOKE4pIHt9CisKKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisgIGV4cGxpY2l0IG9wZXJhdG9yIE1EVHVwbGUgKigpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisKKyAgTURUdXBsZSAqZ2V0KCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxNRFR1cGxlICo+KE4pOyB9CisgIE1EVHVwbGUgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBnZXQoKTsgfQorICBNRFR1cGxlICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqZ2V0KCk7IH0KKworICAvLyBGSVhNRTogRml4IGNhbGxlcnMgYW5kIHJlbW92ZSBjb25kaXRpb24gb24gTi4KKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE4gPyBOLT5nZXROdW1PcGVyYW5kcygpIDogMHU7IH0KKyAgRElUeXBlUmVmIG9wZXJhdG9yW10odW5zaWduZWQgSSkgY29uc3QgeyByZXR1cm4gRElUeXBlUmVmKE4tPmdldE9wZXJhbmQoSSkpOyB9CisKKyAgY2xhc3MgaXRlcmF0b3IgOiBzdGQ6Oml0ZXJhdG9yPHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnLCBESVR5cGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnB0cmRpZmZfdCwgdm9pZCwgRElUeXBlUmVmPiB7CisgICAgTUROb2RlOjpvcF9pdGVyYXRvciBJID0gbnVsbHB0cjsKKworICBwdWJsaWM6CisgICAgaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgICAgZXhwbGljaXQgaXRlcmF0b3IoTUROb2RlOjpvcF9pdGVyYXRvciBJKSA6IEkoSSkge30KKworICAgIERJVHlwZVJlZiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBESVR5cGVSZWYoKkkpOyB9CisKKyAgICBpdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICAgICsrSTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgICAgaXRlcmF0b3IgVGVtcCgqdGhpcyk7CisgICAgICArK0k7CisgICAgICByZXR1cm4gVGVtcDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3IgJlgpIGNvbnN0IHsgcmV0dXJuIEkgPT0gWC5JOyB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yICZYKSBjb25zdCB7IHJldHVybiBJICE9IFguSTsgfQorICB9OworCisgIC8vIEZJWE1FOiBGaXggY2FsbGVycyBhbmQgcmVtb3ZlIGNvbmRpdGlvbiBvbiBOLgorICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIE4gPyBpdGVyYXRvcihOLT5vcF9iZWdpbigpKSA6IGl0ZXJhdG9yKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gTiA/IGl0ZXJhdG9yKE4tPm9wX2VuZCgpKSA6IGl0ZXJhdG9yKCk7IH0KK307CisKKy8vLyBUYWdnZWQgRFdBUkYtbGlrZSBtZXRhZGF0YSBub2RlLgorLy8vCisvLy8gQSBtZXRhZGF0YSBub2RlIHdpdGggYSBEV0FSRiB0YWcgKGkuZS4sIGEgY29uc3RhbnQgbmFtZWQgXGMgRFdfVEFHXyosCisvLy8gZGVmaW5lZCBpbiBsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5oKS4gIENhbGxlZCBcYSBESU5vZGUgYmVjYXVzZSBpdCdzCisvLy8gcG90ZW50aWFsbHkgdXNlZCBmb3Igbm9uLURXQVJGIG91dHB1dC4KK2NsYXNzIERJTm9kZSA6IHB1YmxpYyBNRE5vZGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCitwcm90ZWN0ZWQ6CisgIERJTm9kZShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgSUQsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIHVuc2lnbmVkIFRhZywKKyAgICAgICAgIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wczEsIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wczIgPSBOb25lKQorICAgICAgOiBNRE5vZGUoQywgSUQsIFN0b3JhZ2UsIE9wczEsIE9wczIpIHsKKyAgICBhc3NlcnQoVGFnIDwgMXUgPDwgMTYpOworICAgIFN1YmNsYXNzRGF0YTE2ID0gVGFnOworICB9CisgIH5ESU5vZGUoKSA9IGRlZmF1bHQ7CisKKyAgdGVtcGxhdGUgPGNsYXNzIFR5PiBUeSAqZ2V0T3BlcmFuZEFzKHVuc2lnbmVkIEkpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPFR5PihnZXRPcGVyYW5kKEkpKTsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRTdHJpbmdPcGVyYW5kKHVuc2lnbmVkIEkpIGNvbnN0IHsKKyAgICBpZiAoYXV0byAqUyA9IGdldE9wZXJhbmRBczxNRFN0cmluZz4oSSkpCisgICAgICByZXR1cm4gUy0+Z2V0U3RyaW5nKCk7CisgICAgcmV0dXJuIFN0cmluZ1JlZigpOworICB9CisKKyAgc3RhdGljIE1EU3RyaW5nICpnZXRDYW5vbmljYWxNRFN0cmluZyhMTFZNQ29udGV4dCAmQ29udGV4dCwgU3RyaW5nUmVmIFMpIHsKKyAgICBpZiAoUy5lbXB0eSgpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIE1EU3RyaW5nOjpnZXQoQ29udGV4dCwgUyk7CisgIH0KKworICAvLy8gQWxsb3cgc3ViY2xhc3NlcyB0byBtdXRhdGUgdGhlIHRhZy4KKyAgdm9pZCBzZXRUYWcodW5zaWduZWQgVGFnKSB7IFN1YmNsYXNzRGF0YTE2ID0gVGFnOyB9CisKK3B1YmxpYzoKKyAgdW5zaWduZWQgZ2V0VGFnKCkgY29uc3QgeyByZXR1cm4gU3ViY2xhc3NEYXRhMTY7IH0KKworICAvLy8gRGVidWcgaW5mbyBmbGFncy4KKyAgLy8vCisgIC8vLyBUaGUgdGhyZWUgYWNjZXNzaWJpbGl0eSBmbGFncyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIGFuZCByb2xsZWQgdG9nZXRoZXIKKyAgLy8vIGluIHRoZSBmaXJzdCB0d28gYml0cy4KKyAgZW51bSBESUZsYWdzIDogdWludDMyX3QgeworI2RlZmluZSBIQU5ETEVfRElfRkxBRyhJRCwgTkFNRSkgRmxhZyMjTkFNRSA9IElELAorI2RlZmluZSBESV9GTEFHX0xBUkdFU1RfTkVFREVECisjaW5jbHVkZSAibGx2bS9JUi9EZWJ1Z0luZm9GbGFncy5kZWYiCisgICAgRmxhZ0FjY2Vzc2liaWxpdHkgPSBGbGFnUHJpdmF0ZSB8IEZsYWdQcm90ZWN0ZWQgfCBGbGFnUHVibGljLAorICAgIEZsYWdQdHJUb01lbWJlclJlcCA9IEZsYWdTaW5nbGVJbmhlcml0YW5jZSB8IEZsYWdNdWx0aXBsZUluaGVyaXRhbmNlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnVmlydHVhbEluaGVyaXRhbmNlLAorICAgIExMVk1fTUFSS19BU19CSVRNQVNLX0VOVU0oRmxhZ0xhcmdlc3QpCisgIH07CisKKyAgc3RhdGljIERJRmxhZ3MgZ2V0RmxhZyhTdHJpbmdSZWYgRmxhZyk7CisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0RmxhZ1N0cmluZyhESUZsYWdzIEZsYWcpOworCisgIC8vLyBTcGxpdCB1cCBhIGZsYWdzIGJpdGZpZWxkLgorICAvLy8KKyAgLy8vIFNwbGl0IFxjIEZsYWdzIGludG8gXGMgU3BsaXRGbGFncywgYSB2ZWN0b3Igb2YgaXRzIGNvbXBvbmVudHMuICBSZXR1cm5zCisgIC8vLyBhbnkgcmVtYWluaW5nICh1bnJlY29nbml6ZWQpIGJpdHMuCisgIHN0YXRpYyBESUZsYWdzIHNwbGl0RmxhZ3MoRElGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8RElGbGFncz4gJlNwbGl0RmxhZ3MpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgc3dpdGNoIChNRC0+Z2V0TWV0YWRhdGFJRCgpKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEdlbmVyaWNESU5vZGVLaW5kOgorICAgIGNhc2UgRElTdWJyYW5nZUtpbmQ6CisgICAgY2FzZSBESUVudW1lcmF0b3JLaW5kOgorICAgIGNhc2UgRElCYXNpY1R5cGVLaW5kOgorICAgIGNhc2UgRElEZXJpdmVkVHlwZUtpbmQ6CisgICAgY2FzZSBESUNvbXBvc2l0ZVR5cGVLaW5kOgorICAgIGNhc2UgRElTdWJyb3V0aW5lVHlwZUtpbmQ6CisgICAgY2FzZSBESUZpbGVLaW5kOgorICAgIGNhc2UgRElDb21waWxlVW5pdEtpbmQ6CisgICAgY2FzZSBESVN1YnByb2dyYW1LaW5kOgorICAgIGNhc2UgRElMZXhpY2FsQmxvY2tLaW5kOgorICAgIGNhc2UgRElMZXhpY2FsQmxvY2tGaWxlS2luZDoKKyAgICBjYXNlIERJTmFtZXNwYWNlS2luZDoKKyAgICBjYXNlIERJVGVtcGxhdGVUeXBlUGFyYW1ldGVyS2luZDoKKyAgICBjYXNlIERJVGVtcGxhdGVWYWx1ZVBhcmFtZXRlcktpbmQ6CisgICAgY2FzZSBESUdsb2JhbFZhcmlhYmxlS2luZDoKKyAgICBjYXNlIERJTG9jYWxWYXJpYWJsZUtpbmQ6CisgICAgY2FzZSBESU9iakNQcm9wZXJ0eUtpbmQ6CisgICAgY2FzZSBESUltcG9ydGVkRW50aXR5S2luZDoKKyAgICBjYXNlIERJTW9kdWxlS2luZDoKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBzaW1wbGlmeV90eXBlPGNvbnN0IFR5cGVkRElOb2RlUmVmPFQ+PiB7CisgIHVzaW5nIFNpbXBsZVR5cGUgPSBNZXRhZGF0YSAqOworCisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShjb25zdCBUeXBlZERJTm9kZVJlZjxUPiAmTUQpIHsKKyAgICByZXR1cm4gTUQ7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IHNpbXBsaWZ5X3R5cGU8VHlwZWRESU5vZGVSZWY8VD4+CisgICAgOiBzaW1wbGlmeV90eXBlPGNvbnN0IFR5cGVkRElOb2RlUmVmPFQ+PiB7fTsKKworLy8vIEdlbmVyaWMgdGFnZ2VkIERXQVJGLWxpa2UgbWV0YWRhdGEgbm9kZS4KKy8vLworLy8vIEFuIHVuLXNwZWNpYWxpemVkIERXQVJGLWxpa2UgbWV0YWRhdGEgbm9kZS4gIFRoZSBmaXJzdCBvcGVyYW5kIGlzIGEKKy8vLyAocG9zc2libHkgZW1wdHkpIG51bGwtc2VwYXJhdGVkIFxhIE1EU3RyaW5nIGhlYWRlciB0aGF0IGNvbnRhaW5zIGFyYml0cmFyeQorLy8vIGZpZWxkcy4gIFRoZSByZW1haW5pbmcgb3BlcmFuZHMgYXJlIFxhIGR3YXJmX29wZXJhbmRzKCksIGFuZCBhcmUgcG9pbnRlcnMKKy8vLyB0byBvdGhlciBtZXRhZGF0YS4KK2NsYXNzIEdlbmVyaWNESU5vZGUgOiBwdWJsaWMgRElOb2RlIHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIE1ETm9kZTsKKworICBHZW5lcmljRElOb2RlKExMVk1Db250ZXh0ICZDLCBTdG9yYWdlVHlwZSBTdG9yYWdlLCB1bnNpZ25lZCBIYXNoLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIFRhZywgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzMSwKKyAgICAgICAgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMyKQorICAgICAgOiBESU5vZGUoQywgR2VuZXJpY0RJTm9kZUtpbmQsIFN0b3JhZ2UsIFRhZywgT3BzMSwgT3BzMikgeworICAgIHNldEhhc2goSGFzaCk7CisgIH0KKyAgfkdlbmVyaWNESU5vZGUoKSB7IGRyb3BBbGxSZWZlcmVuY2VzKCk7IH0KKworICB2b2lkIHNldEhhc2godW5zaWduZWQgSGFzaCkgeyBTdWJjbGFzc0RhdGEzMiA9IEhhc2g7IH0KKyAgdm9pZCByZWNhbGN1bGF0ZUhhc2goKTsKKworICBzdGF0aWMgR2VuZXJpY0RJTm9kZSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSGVhZGVyLCBBcnJheVJlZjxNZXRhZGF0YSAqPiBEd2FyZk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKSB7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgVGFnLCBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBIZWFkZXIpLAorICAgICAgICAgICAgICAgICAgIER3YXJmT3BzLCBTdG9yYWdlLCBTaG91bGRDcmVhdGUpOworICB9CisKKyAgc3RhdGljIEdlbmVyaWNESU5vZGUgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTURTdHJpbmcgKkhlYWRlciwgQXJyYXlSZWY8TWV0YWRhdGEgKj4gRHdhcmZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSk7CisKKyAgVGVtcEdlbmVyaWNESU5vZGUgY2xvbmVJbXBsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUZW1wb3JhcnkoCisgICAgICAgIGdldENvbnRleHQoKSwgZ2V0VGFnKCksIGdldEhlYWRlcigpLAorICAgICAgICBTbWFsbFZlY3RvcjxNZXRhZGF0YSAqLCA0Pihkd2FyZl9vcF9iZWdpbigpLCBkd2FyZl9vcF9lbmQoKSkpOworICB9CisKK3B1YmxpYzoKKyAgdW5zaWduZWQgZ2V0SGFzaCgpIGNvbnN0IHsgcmV0dXJuIFN1YmNsYXNzRGF0YTMyOyB9CisKKyAgREVGSU5FX01ETk9ERV9HRVQoR2VuZXJpY0RJTm9kZSwgKHVuc2lnbmVkIFRhZywgU3RyaW5nUmVmIEhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE1ldGFkYXRhICo+IER3YXJmT3BzKSwKKyAgICAgICAgICAgICAgICAgICAgKFRhZywgSGVhZGVyLCBEd2FyZk9wcykpCisgIERFRklORV9NRE5PREVfR0VUKEdlbmVyaWNESU5vZGUsICh1bnNpZ25lZCBUYWcsIE1EU3RyaW5nICpIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBEd2FyZk9wcyksCisgICAgICAgICAgICAgICAgICAgIChUYWcsIEhlYWRlciwgRHdhcmZPcHMpKQorCisgIC8vLyBSZXR1cm4gYSAodGVtcG9yYXJ5KSBjbG9uZSBvZiB0aGlzLgorICBUZW1wR2VuZXJpY0RJTm9kZSBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIGNsb25lSW1wbCgpOyB9CisKKyAgdW5zaWduZWQgZ2V0VGFnKCkgY29uc3QgeyByZXR1cm4gU3ViY2xhc3NEYXRhMTY7IH0KKyAgU3RyaW5nUmVmIGdldEhlYWRlcigpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMCk7IH0KKyAgTURTdHJpbmcgKmdldFJhd0hlYWRlcigpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmRBczxNRFN0cmluZz4oMCk7IH0KKworICBvcF9pdGVyYXRvciBkd2FyZl9vcF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIG9wX2JlZ2luKCkgKyAxOyB9CisgIG9wX2l0ZXJhdG9yIGR3YXJmX29wX2VuZCgpIGNvbnN0IHsgcmV0dXJuIG9wX2VuZCgpOyB9CisgIG9wX3JhbmdlIGR3YXJmX29wZXJhbmRzKCkgY29uc3QgeworICAgIHJldHVybiBvcF9yYW5nZShkd2FyZl9vcF9iZWdpbigpLCBkd2FyZl9vcF9lbmQoKSk7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1Ed2FyZk9wZXJhbmRzKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSAtIDE7IH0KKyAgY29uc3QgTURPcGVyYW5kICZnZXREd2FyZk9wZXJhbmQodW5zaWduZWQgSSkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYW5kKEkgKyAxKTsKKyAgfQorICB2b2lkIHJlcGxhY2VEd2FyZk9wZXJhbmRXaXRoKHVuc2lnbmVkIEksIE1ldGFkYXRhICpOZXcpIHsKKyAgICByZXBsYWNlT3BlcmFuZFdpdGgoSSArIDEsIE5ldyk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IEdlbmVyaWNESU5vZGVLaW5kOworICB9Cit9OworCisvLy8gQXJyYXkgc3VicmFuZ2UuCisvLy8KKy8vLyBUT0RPOiBNZXJnZSBpbnRvIG5vZGUgZm9yIERXX1RBR19hcnJheV90eXBlLCB3aGljaCBzaG91bGQgaGF2ZSBhIGN1c3RvbQorLy8vIHR5cGUuCitjbGFzcyBESVN1YnJhbmdlIDogcHVibGljIERJTm9kZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKKyAgaW50NjRfdCBMb3dlckJvdW5kOworCisgIERJU3VicmFuZ2UoTExWTUNvbnRleHQgJkMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIE1ldGFkYXRhICpOb2RlLAorICAgICAgICAgICAgIGludDY0X3QgTG93ZXJCb3VuZCwgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESU5vZGUoQywgRElTdWJyYW5nZUtpbmQsIFN0b3JhZ2UsIGR3YXJmOjpEV19UQUdfc3VicmFuZ2VfdHlwZSwgT3BzKSwKKyAgICAgICAgTG93ZXJCb3VuZChMb3dlckJvdW5kKSB7fQorCisgIH5ESVN1YnJhbmdlKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBESVN1YnJhbmdlICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCBpbnQ2NF90IENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IExvd2VyQm91bmQsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSk7CisKKyAgc3RhdGljIERJU3VicmFuZ2UgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIE1ldGFkYXRhICpDb3VudE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgTG93ZXJCb3VuZCwgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElTdWJyYW5nZSBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksIGdldFJhd0NvdW50Tm9kZSgpLCBnZXRMb3dlckJvdW5kKCkpOworICB9CisKK3B1YmxpYzoKKyAgREVGSU5FX01ETk9ERV9HRVQoRElTdWJyYW5nZSwgKGludDY0X3QgQ291bnQsIGludDY0X3QgTG93ZXJCb3VuZCA9IDApLAorICAgICAgICAgICAgICAgICAgICAoQ291bnQsIExvd2VyQm91bmQpKQorCisgIERFRklORV9NRE5PREVfR0VUKERJU3VicmFuZ2UsIChNZXRhZGF0YSAqQ291bnROb2RlLCBpbnQ2NF90IExvd2VyQm91bmQgPSAwKSwKKyAgICAgICAgICAgICAgICAgICAgKENvdW50Tm9kZSwgTG93ZXJCb3VuZCkpCisKKyAgVGVtcERJU3VicmFuZ2UgY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIGludDY0X3QgZ2V0TG93ZXJCb3VuZCgpIGNvbnN0IHsgcmV0dXJuIExvd2VyQm91bmQ7IH0KKworICBNZXRhZGF0YSAqZ2V0UmF3Q291bnROb2RlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDApLmdldCgpOworICB9CisKKyAgdHlwZWRlZiBQb2ludGVyVW5pb248Q29uc3RhbnRJbnQqLCBESVZhcmlhYmxlKj4gQ291bnRUeXBlOworCisgIENvdW50VHlwZSBnZXRDb3VudCgpIGNvbnN0IHsKKyAgICBpZiAoYXV0byAqTUQgPSBkeW5fY2FzdDxDb25zdGFudEFzTWV0YWRhdGE+KGdldFJhd0NvdW50Tm9kZSgpKSkKKyAgICAgIHJldHVybiBDb3VudFR5cGUoY2FzdDxDb25zdGFudEludD4oTUQtPmdldFZhbHVlKCkpKTsKKworICAgIGlmIChhdXRvICpEViA9IGR5bl9jYXN0PERJVmFyaWFibGU+KGdldFJhd0NvdW50Tm9kZSgpKSkKKyAgICAgIHJldHVybiBDb3VudFR5cGUoRFYpOworCisgICAgcmV0dXJuIENvdW50VHlwZSgpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESVN1YnJhbmdlS2luZDsKKyAgfQorfTsKKworLy8vIEVudW1lcmF0aW9uIHZhbHVlLgorLy8vCisvLy8gVE9ETzogQWRkIGEgcG9pbnRlciB0byB0aGUgY29udGV4dCAoRFdfVEFHX2VudW1lcmF0aW9uX3R5cGUpIG9uY2UgdGhhdCBubworLy8vIGxvbmdlciBjcmVhdGVzIGEgdHlwZSBjeWNsZS4KK2NsYXNzIERJRW51bWVyYXRvciA6IHB1YmxpYyBESU5vZGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIGludDY0X3QgVmFsdWU7CisgIERJRW51bWVyYXRvcihMTFZNQ29udGV4dCAmQywgU3RvcmFnZVR5cGUgU3RvcmFnZSwgaW50NjRfdCBWYWx1ZSwKKyAgICAgICAgICAgICAgIGJvb2wgSXNVbnNpZ25lZCwgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESU5vZGUoQywgRElFbnVtZXJhdG9yS2luZCwgU3RvcmFnZSwgZHdhcmY6OkRXX1RBR19lbnVtZXJhdG9yLCBPcHMpLAorICAgICAgICBWYWx1ZShWYWx1ZSkgeworICAgIFN1YmNsYXNzRGF0YTMyID0gSXNVbnNpZ25lZDsKKyAgfQorICB+RElFbnVtZXJhdG9yKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBESUVudW1lcmF0b3IgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIGludDY0X3QgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1Vuc2lnbmVkLCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpIHsKKyAgICByZXR1cm4gZ2V0SW1wbChDb250ZXh0LCBWYWx1ZSwgSXNVbnNpZ25lZCwKKyAgICAgICAgICAgICAgICAgICBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBOYW1lKSwgU3RvcmFnZSwgU2hvdWxkQ3JlYXRlKTsKKyAgfQorICBzdGF0aWMgRElFbnVtZXJhdG9yICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCBpbnQ2NF90IFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNVbnNpZ25lZCwgTURTdHJpbmcgKk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElFbnVtZXJhdG9yIGNsb25lSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwgZ2V0VmFsdWUoKSwgaXNVbnNpZ25lZCgpLCBnZXROYW1lKCkpOworICB9CisKK3B1YmxpYzoKKyAgREVGSU5FX01ETk9ERV9HRVQoRElFbnVtZXJhdG9yLCAoaW50NjRfdCBWYWx1ZSwgYm9vbCBJc1Vuc2lnbmVkLCBTdHJpbmdSZWYgTmFtZSksCisgICAgICAgICAgICAgICAgICAgIChWYWx1ZSwgSXNVbnNpZ25lZCwgTmFtZSkpCisgIERFRklORV9NRE5PREVfR0VUKERJRW51bWVyYXRvciwgKGludDY0X3QgVmFsdWUsIGJvb2wgSXNVbnNpZ25lZCwgTURTdHJpbmcgKk5hbWUpLAorICAgICAgICAgICAgICAgICAgICAoVmFsdWUsIElzVW5zaWduZWQsIE5hbWUpKQorCisgIFRlbXBESUVudW1lcmF0b3IgY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIGludDY0X3QgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorICBib29sIGlzVW5zaWduZWQoKSBjb25zdCB7IHJldHVybiBTdWJjbGFzc0RhdGEzMjsgfQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMCk7IH0KKworICBNRFN0cmluZyAqZ2V0UmF3TmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmRBczxNRFN0cmluZz4oMCk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJRW51bWVyYXRvcktpbmQ7CisgIH0KK307CisKKy8vLyBCYXNlIGNsYXNzIGZvciBzY29wZS1saWtlIGNvbnRleHRzLgorLy8vCisvLy8gQmFzZSBjbGFzcyBmb3IgbGV4aWNhbCBzY29wZXMgYW5kIHR5cGVzICh3aGljaCBhcmUgYWxzbyBkZWNsYXJhdGlvbgorLy8vIGNvbnRleHRzKS4KKy8vLworLy8vIFRPRE86IFNlcGFyYXRlIHRoZSBjb25jZXB0cyBvZiBkZWNsYXJhdGlvbiBjb250ZXh0cyBhbmQgbGV4aWNhbCBzY29wZXMuCitjbGFzcyBESVNjb3BlIDogcHVibGljIERJTm9kZSB7Citwcm90ZWN0ZWQ6CisgIERJU2NvcGUoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIElELCBTdG9yYWdlVHlwZSBTdG9yYWdlLCB1bnNpZ25lZCBUYWcsCisgICAgICAgICAgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESU5vZGUoQywgSUQsIFN0b3JhZ2UsIFRhZywgT3BzKSB7fQorICB+RElTY29wZSgpID0gZGVmYXVsdDsKKworcHVibGljOgorICBESUZpbGUgKmdldEZpbGUoKSBjb25zdCB7IHJldHVybiBjYXN0X29yX251bGw8RElGaWxlPihnZXRSYXdGaWxlKCkpOyB9CisKKyAgaW5saW5lIFN0cmluZ1JlZiBnZXRGaWxlbmFtZSgpIGNvbnN0OworICBpbmxpbmUgU3RyaW5nUmVmIGdldERpcmVjdG9yeSgpIGNvbnN0OworICBpbmxpbmUgT3B0aW9uYWw8U3RyaW5nUmVmPiBnZXRTb3VyY2UoKSBjb25zdDsKKworICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0OworICBESVNjb3BlUmVmIGdldFNjb3BlKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgcmF3IHVuZGVybHlpbmcgZmlsZS4KKyAgLy8vCisgIC8vLyBBIFxhIERJRmlsZSBpcyBhIFxhIERJU2NvcGUsIGJ1dCBpdCBkb2Vzbid0IHBvaW50IGF0IGEgc2VwYXJhdGUgZmlsZSAoaXQKKyAgLy8vIFxlbSBpcyB0aGUgZmlsZSkuICBJZiBcYyB0aGlzIGlzIGFuIFxhIERJRmlsZSwgd2UgbmVlZCB0byByZXR1cm4gXGMgdGhpcy4KKyAgLy8vIE90aGVyd2lzZSwgcmV0dXJuIHRoZSBmaXJzdCBvcGVyYW5kLCB3aGljaCBpcyB3aGVyZSBhbGwgb3RoZXIgc3ViY2xhc3NlcworICAvLy8gc3RvcmUgdGhlaXIgZmlsZSBwb2ludGVyLgorICBNZXRhZGF0YSAqZ2V0UmF3RmlsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNhPERJRmlsZT4odGhpcykgPyBjb25zdF9jYXN0PERJU2NvcGUgKj4odGhpcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdGF0aWNfY2FzdDxNZXRhZGF0YSAqPihnZXRPcGVyYW5kKDApKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgc3dpdGNoIChNRC0+Z2V0TWV0YWRhdGFJRCgpKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIERJQmFzaWNUeXBlS2luZDoKKyAgICBjYXNlIERJRGVyaXZlZFR5cGVLaW5kOgorICAgIGNhc2UgRElDb21wb3NpdGVUeXBlS2luZDoKKyAgICBjYXNlIERJU3Vicm91dGluZVR5cGVLaW5kOgorICAgIGNhc2UgRElGaWxlS2luZDoKKyAgICBjYXNlIERJQ29tcGlsZVVuaXRLaW5kOgorICAgIGNhc2UgRElTdWJwcm9ncmFtS2luZDoKKyAgICBjYXNlIERJTGV4aWNhbEJsb2NrS2luZDoKKyAgICBjYXNlIERJTGV4aWNhbEJsb2NrRmlsZUtpbmQ6CisgICAgY2FzZSBESU5hbWVzcGFjZUtpbmQ6CisgICAgY2FzZSBESU1vZHVsZUtpbmQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KK307CisKKy8vLyBGaWxlLgorLy8vCisvLy8gVE9ETzogTWVyZ2Ugd2l0aCBkaXJlY3RvcnkvZmlsZSBub2RlIChpbmNsdWRpbmcgdXNlcnMpLgorLy8vIFRPRE86IENhbm9uaWNhbGl6ZSBwYXRocyBvbiBjcmVhdGlvbi4KK2NsYXNzIERJRmlsZSA6IHB1YmxpYyBESVNjb3BlIHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIE1ETm9kZTsKKworcHVibGljOgorICAvLy8gV2hpY2ggYWxnb3JpdGhtIChlLmcuIE1ENSkgYSBjaGVja3N1bSB3YXMgZ2VuZXJhdGVkIHdpdGguCisgIC8vLworICAvLy8gVGhlIGVuY29kaW5nIGlzIGV4cGxpY2l0IGJlY2F1c2UgaXQgaXMgdXNlZCBkaXJlY3RseSBpbiBCaXRjb2RlLiBUaGUKKyAgLy8vIHZhbHVlIDAgaXMgcmVzZXJ2ZWQgdG8gaW5kaWNhdGUgdGhlIGFic2VuY2Ugb2YgYSBjaGVja3N1bSBpbiBCaXRjb2RlLgorICBlbnVtIENoZWNrc3VtS2luZCB7CisgICAgLy8gVGhlIGZpcnN0IHZhcmlhbnQgd2FzIG9yaWdpbmFsbHkgQ1NLX05vbmUsIGVuY29kZWQgYXMgMC4gVGhlIG5ldworICAgIC8vIGludGVybmFsIHJlcHJlc2VudGF0aW9uIHJlbW92ZXMgdGhlIG5lZWQgZm9yIHRoaXMgYnkgd3JhcHBpbmcgdGhlCisgICAgLy8gQ2hlY2tzdW1JbmZvIGluIGFuIE9wdGlvbmFsLCBidXQgdG8gcHJlc2VydmUgQml0Y29kZSBjb21wYXRpYmlsaXR5IHRoZSAwCisgICAgLy8gZW5jb2RpbmcgaXMgcmVzZXJ2ZWQuCisgICAgQ1NLX01ENSA9IDEsCisgICAgQ1NLX1NIQTEgPSAyLAorICAgIENTS19MYXN0ID0gQ1NLX1NIQTEgLy8gU2hvdWxkIGJlIGxhc3QgZW51bWVyYXRpb24uCisgIH07CisKKyAgLy8vIEEgc2luZ2xlIGNoZWNrc3VtLCByZXByZXNlbnRlZCBieSBhIFxhIEtpbmQgYW5kIGEgXGEgVmFsdWUgKGEgc3RyaW5nKS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBDaGVja3N1bUluZm8geworICAgIC8vLyBUaGUga2luZCBvZiBjaGVja3N1bSB3aGljaCBcYSBWYWx1ZSBlbmNvZGVzLgorICAgIENoZWNrc3VtS2luZCBLaW5kOworICAgIC8vLyBUaGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBjaGVja3N1bS4KKyAgICBUIFZhbHVlOworCisgICAgQ2hlY2tzdW1JbmZvKENoZWNrc3VtS2luZCBLaW5kLCBUIFZhbHVlKSA6IEtpbmQoS2luZCksIFZhbHVlKFZhbHVlKSB7IH0KKyAgICB+Q2hlY2tzdW1JbmZvKCkgPSBkZWZhdWx0OworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDaGVja3N1bUluZm88VD4gJlgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBLaW5kID09IFguS2luZCAmJiBWYWx1ZSA9PSBYLlZhbHVlOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ2hlY2tzdW1JbmZvPFQ+ICZYKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IFgpOyB9CisgICAgU3RyaW5nUmVmIGdldEtpbmRBc1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIGdldENoZWNrc3VtS2luZEFzU3RyaW5nKEtpbmQpOyB9CisgIH07CisKK3ByaXZhdGU6CisgIE9wdGlvbmFsPENoZWNrc3VtSW5mbzxNRFN0cmluZyAqPj4gQ2hlY2tzdW07CisgIE9wdGlvbmFsPE1EU3RyaW5nICo+IFNvdXJjZTsKKworICBESUZpbGUoTExWTUNvbnRleHQgJkMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICBPcHRpb25hbDxDaGVja3N1bUluZm88TURTdHJpbmcgKj4+IENTLCBPcHRpb25hbDxNRFN0cmluZyAqPiBTcmMsCisgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJU2NvcGUoQywgRElGaWxlS2luZCwgU3RvcmFnZSwgZHdhcmY6OkRXX1RBR19maWxlX3R5cGUsIE9wcyksCisgICAgICAgIENoZWNrc3VtKENTKSwgU291cmNlKFNyYykge30KKyAgfkRJRmlsZSgpID0gZGVmYXVsdDsKKworICBzdGF0aWMgRElGaWxlICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCBTdHJpbmdSZWYgRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxDaGVja3N1bUluZm88U3RyaW5nUmVmPj4gQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8U3RyaW5nUmVmPiBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKSB7CisgICAgT3B0aW9uYWw8Q2hlY2tzdW1JbmZvPE1EU3RyaW5nICo+PiBNRENoZWNrc3VtOworICAgIGlmIChDUykKKyAgICAgIE1EQ2hlY2tzdW0uZW1wbGFjZShDUy0+S2luZCwgZ2V0Q2Fub25pY2FsTURTdHJpbmcoQ29udGV4dCwgQ1MtPlZhbHVlKSk7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgZ2V0Q2Fub25pY2FsTURTdHJpbmcoQ29udGV4dCwgRmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIERpcmVjdG9yeSksIE1EQ2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgU291cmNlID8gT3B0aW9uYWw8TURTdHJpbmcgKj4oZ2V0Q2Fub25pY2FsTURTdHJpbmcoQ29udGV4dCwgKlNvdXJjZSkpIDogTm9uZSwKKyAgICAgICAgICAgICAgICAgICBTdG9yYWdlLCBTaG91bGRDcmVhdGUpOworICB9CisgIHN0YXRpYyBESUZpbGUgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIE1EU3RyaW5nICpGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNRFN0cmluZyAqRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPENoZWNrc3VtSW5mbzxNRFN0cmluZyAqPj4gQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8TURTdHJpbmcgKj4gU291cmNlLCBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSk7CisKKyAgVGVtcERJRmlsZSBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksIGdldEZpbGVuYW1lKCksIGdldERpcmVjdG9yeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hlY2tzdW0oKSwgZ2V0U291cmNlKCkpOworICB9CisKK3B1YmxpYzoKKyAgREVGSU5FX01ETk9ERV9HRVQoRElGaWxlLCAoU3RyaW5nUmVmIEZpbGVuYW1lLCBTdHJpbmdSZWYgRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxDaGVja3N1bUluZm88U3RyaW5nUmVmPj4gQ1MgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxTdHJpbmdSZWY+IFNvdXJjZSA9IE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAoRmlsZW5hbWUsIERpcmVjdG9yeSwgQ1MsIFNvdXJjZSkpCisgIERFRklORV9NRE5PREVfR0VUKERJRmlsZSwgKE1EU3RyaW5nICogRmlsZW5hbWUsIE1EU3RyaW5nICpEaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPENoZWNrc3VtSW5mbzxNRFN0cmluZyAqPj4gQ1MgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxNRFN0cmluZyAqPiBTb3VyY2UgPSBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgKEZpbGVuYW1lLCBEaXJlY3RvcnksIENTLCBTb3VyY2UpKQorCisgIFRlbXBESUZpbGUgY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIFN0cmluZ1JlZiBnZXRGaWxlbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMCk7IH0KKyAgU3RyaW5nUmVmIGdldERpcmVjdG9yeSgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMSk7IH0KKyAgT3B0aW9uYWw8Q2hlY2tzdW1JbmZvPFN0cmluZ1JlZj4+IGdldENoZWNrc3VtKCkgY29uc3QgeworICAgIE9wdGlvbmFsPENoZWNrc3VtSW5mbzxTdHJpbmdSZWY+PiBTdHJpbmdSZWZDaGVja3N1bTsKKyAgICBpZiAoQ2hlY2tzdW0pCisgICAgICBTdHJpbmdSZWZDaGVja3N1bS5lbXBsYWNlKENoZWNrc3VtLT5LaW5kLCBDaGVja3N1bS0+VmFsdWUtPmdldFN0cmluZygpKTsKKyAgICByZXR1cm4gU3RyaW5nUmVmQ2hlY2tzdW07CisgIH0KKyAgT3B0aW9uYWw8U3RyaW5nUmVmPiBnZXRTb3VyY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIFNvdXJjZSA/IE9wdGlvbmFsPFN0cmluZ1JlZj4oKCpTb3VyY2UpLT5nZXRTdHJpbmcoKSkgOiBOb25lOworICB9CisKKyAgTURTdHJpbmcgKmdldFJhd0ZpbGVuYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPigwKTsgfQorICBNRFN0cmluZyAqZ2V0UmF3RGlyZWN0b3J5KCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPigxKTsgfQorICBPcHRpb25hbDxDaGVja3N1bUluZm88TURTdHJpbmcgKj4+IGdldFJhd0NoZWNrc3VtKCkgY29uc3QgeyByZXR1cm4gQ2hlY2tzdW07IH0KKyAgT3B0aW9uYWw8TURTdHJpbmcgKj4gZ2V0UmF3U291cmNlKCkgY29uc3QgeyByZXR1cm4gU291cmNlOyB9CisKKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRDaGVja3N1bUtpbmRBc1N0cmluZyhDaGVja3N1bUtpbmQgQ1NLaW5kKTsKKyAgc3RhdGljIE9wdGlvbmFsPENoZWNrc3VtS2luZD4gZ2V0Q2hlY2tzdW1LaW5kKFN0cmluZ1JlZiBDU0tpbmRTdHIpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElGaWxlS2luZDsKKyAgfQorfTsKKworU3RyaW5nUmVmIERJU2NvcGU6OmdldEZpbGVuYW1lKCkgY29uc3QgeworICBpZiAoYXV0byAqRiA9IGdldEZpbGUoKSkKKyAgICByZXR1cm4gRi0+Z2V0RmlsZW5hbWUoKTsKKyAgcmV0dXJuICIiOworfQorCitTdHJpbmdSZWYgRElTY29wZTo6Z2V0RGlyZWN0b3J5KCkgY29uc3QgeworICBpZiAoYXV0byAqRiA9IGdldEZpbGUoKSkKKyAgICByZXR1cm4gRi0+Z2V0RGlyZWN0b3J5KCk7CisgIHJldHVybiAiIjsKK30KKworT3B0aW9uYWw8U3RyaW5nUmVmPiBESVNjb3BlOjpnZXRTb3VyY2UoKSBjb25zdCB7CisgIGlmIChhdXRvICpGID0gZ2V0RmlsZSgpKQorICAgIHJldHVybiBGLT5nZXRTb3VyY2UoKTsKKyAgcmV0dXJuIE5vbmU7Cit9CisKKy8vLyBCYXNlIGNsYXNzIGZvciB0eXBlcy4KKy8vLworLy8vIFRPRE86IFJlbW92ZSB0aGUgaGFyZGNvZGVkIG5hbWUgYW5kIGNvbnRleHQsIHNpbmNlIG1hbnkgdHlwZXMgZG9uJ3QgdXNlCisvLy8gdGhlbS4KKy8vLyBUT0RPOiBTcGxpdCB1cCBmbGFncy4KK2NsYXNzIERJVHlwZSA6IHB1YmxpYyBESVNjb3BlIHsKKyAgdW5zaWduZWQgTGluZTsKKyAgRElGbGFncyBGbGFnczsKKyAgdWludDY0X3QgU2l6ZUluQml0czsKKyAgdWludDY0X3QgT2Zmc2V0SW5CaXRzOworICB1aW50MzJfdCBBbGlnbkluQml0czsKKworcHJvdGVjdGVkOgorICBESVR5cGUoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIElELCBTdG9yYWdlVHlwZSBTdG9yYWdlLCB1bnNpZ25lZCBUYWcsCisgICAgICAgICB1bnNpZ25lZCBMaW5lLCB1aW50NjRfdCBTaXplSW5CaXRzLCB1aW50MzJfdCBBbGlnbkluQml0cywKKyAgICAgICAgIHVpbnQ2NF90IE9mZnNldEluQml0cywgRElGbGFncyBGbGFncywgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESVNjb3BlKEMsIElELCBTdG9yYWdlLCBUYWcsIE9wcykgeworICAgIGluaXQoTGluZSwgU2l6ZUluQml0cywgQWxpZ25JbkJpdHMsIE9mZnNldEluQml0cywgRmxhZ3MpOworICB9CisgIH5ESVR5cGUoKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBpbml0KHVuc2lnbmVkIExpbmUsIHVpbnQ2NF90IFNpemVJbkJpdHMsIHVpbnQzMl90IEFsaWduSW5CaXRzLAorICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0SW5CaXRzLCBESUZsYWdzIEZsYWdzKSB7CisgICAgdGhpcy0+TGluZSA9IExpbmU7CisgICAgdGhpcy0+RmxhZ3MgPSBGbGFnczsKKyAgICB0aGlzLT5TaXplSW5CaXRzID0gU2l6ZUluQml0czsKKyAgICB0aGlzLT5BbGlnbkluQml0cyA9IEFsaWduSW5CaXRzOworICAgIHRoaXMtPk9mZnNldEluQml0cyA9IE9mZnNldEluQml0czsKKyAgfQorCisgIC8vLyBDaGFuZ2UgZmllbGRzIGluIHBsYWNlLgorICB2b2lkIG11dGF0ZSh1bnNpZ25lZCBUYWcsIHVuc2lnbmVkIExpbmUsIHVpbnQ2NF90IFNpemVJbkJpdHMsCisgICAgICAgICAgICAgIHVpbnQzMl90IEFsaWduSW5CaXRzLCB1aW50NjRfdCBPZmZzZXRJbkJpdHMsIERJRmxhZ3MgRmxhZ3MpIHsKKyAgICBhc3NlcnQoaXNEaXN0aW5jdCgpICYmICJPbmx5IGRpc3RpbmN0IG5vZGVzIGNhbiBtdXRhdGUiKTsKKyAgICBzZXRUYWcoVGFnKTsKKyAgICBpbml0KExpbmUsIFNpemVJbkJpdHMsIEFsaWduSW5CaXRzLCBPZmZzZXRJbkJpdHMsIEZsYWdzKTsKKyAgfQorCitwdWJsaWM6CisgIFRlbXBESVR5cGUgY2xvbmUoKSBjb25zdCB7CisgICAgcmV0dXJuIFRlbXBESVR5cGUoY2FzdDxESVR5cGU+KE1ETm9kZTo6Y2xvbmUoKS5yZWxlYXNlKCkpKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldExpbmUoKSBjb25zdCB7IHJldHVybiBMaW5lOyB9CisgIHVpbnQ2NF90IGdldFNpemVJbkJpdHMoKSBjb25zdCB7IHJldHVybiBTaXplSW5CaXRzOyB9CisgIHVpbnQzMl90IGdldEFsaWduSW5CaXRzKCkgY29uc3QgeyByZXR1cm4gQWxpZ25JbkJpdHM7IH0KKyAgdWludDMyX3QgZ2V0QWxpZ25JbkJ5dGVzKCkgY29uc3QgeyByZXR1cm4gZ2V0QWxpZ25JbkJpdHMoKSAvIENIQVJfQklUOyB9CisgIHVpbnQ2NF90IGdldE9mZnNldEluQml0cygpIGNvbnN0IHsgcmV0dXJuIE9mZnNldEluQml0czsgfQorICBESUZsYWdzIGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gRmxhZ3M7IH0KKworICBESVNjb3BlUmVmIGdldFNjb3BlKCkgY29uc3QgeyByZXR1cm4gRElTY29wZVJlZihnZXRSYXdTY29wZSgpKTsgfQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMik7IH0KKworCisgIE1ldGFkYXRhICpnZXRSYXdTY29wZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMSk7IH0KKyAgTURTdHJpbmcgKmdldFJhd05hbWUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KDIpOyB9CisKKyAgdm9pZCBzZXRGbGFncyhESUZsYWdzIE5ld0ZsYWdzKSB7CisgICAgYXNzZXJ0KCFpc1VuaXF1ZWQoKSAmJiAiQ2Fubm90IHNldCBmbGFncyBvbiB1bmlxdWVkIG5vZGVzIik7CisgICAgRmxhZ3MgPSBOZXdGbGFnczsKKyAgfQorCisgIGJvb2wgaXNQcml2YXRlKCkgY29uc3QgeworICAgIHJldHVybiAoZ2V0RmxhZ3MoKSAmIEZsYWdBY2Nlc3NpYmlsaXR5KSA9PSBGbGFnUHJpdmF0ZTsKKyAgfQorICBib29sIGlzUHJvdGVjdGVkKCkgY29uc3QgeworICAgIHJldHVybiAoZ2V0RmxhZ3MoKSAmIEZsYWdBY2Nlc3NpYmlsaXR5KSA9PSBGbGFnUHJvdGVjdGVkOworICB9CisgIGJvb2wgaXNQdWJsaWMoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRGbGFncygpICYgRmxhZ0FjY2Vzc2liaWxpdHkpID09IEZsYWdQdWJsaWM7CisgIH0KKyAgYm9vbCBpc0ZvcndhcmREZWNsKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdGd2REZWNsOyB9CisgIGJvb2wgaXNBcHBsZUJsb2NrRXh0ZW5zaW9uKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdBcHBsZUJsb2NrOyB9CisgIGJvb2wgaXNCbG9ja0J5cmVmU3RydWN0KCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdCbG9ja0J5cmVmU3RydWN0OyB9CisgIGJvb2wgaXNWaXJ0dWFsKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdWaXJ0dWFsOyB9CisgIGJvb2wgaXNBcnRpZmljaWFsKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdBcnRpZmljaWFsOyB9CisgIGJvb2wgaXNPYmplY3RQb2ludGVyKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdPYmplY3RQb2ludGVyOyB9CisgIGJvb2wgaXNPYmpjQ2xhc3NDb21wbGV0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdPYmpjQ2xhc3NDb21wbGV0ZTsKKyAgfQorICBib29sIGlzVmVjdG9yKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdWZWN0b3I7IH0KKyAgYm9vbCBpc0JpdEZpZWxkKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdCaXRGaWVsZDsgfQorICBib29sIGlzU3RhdGljTWVtYmVyKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdTdGF0aWNNZW1iZXI7IH0KKyAgYm9vbCBpc0xWYWx1ZVJlZmVyZW5jZSgpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWdzKCkgJiBGbGFnTFZhbHVlUmVmZXJlbmNlOyB9CisgIGJvb2wgaXNSVmFsdWVSZWZlcmVuY2UoKSBjb25zdCB7IHJldHVybiBnZXRGbGFncygpICYgRmxhZ1JWYWx1ZVJlZmVyZW5jZTsgfQorICBib29sIGlzVHlwZVBhc3NCeVZhbHVlKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdUeXBlUGFzc0J5VmFsdWU7IH0KKyAgYm9vbCBpc1R5cGVQYXNzQnlSZWZlcmVuY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEZsYWdzKCkgJiBGbGFnVHlwZVBhc3NCeVJlZmVyZW5jZTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgc3dpdGNoIChNRC0+Z2V0TWV0YWRhdGFJRCgpKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIERJQmFzaWNUeXBlS2luZDoKKyAgICBjYXNlIERJRGVyaXZlZFR5cGVLaW5kOgorICAgIGNhc2UgRElDb21wb3NpdGVUeXBlS2luZDoKKyAgICBjYXNlIERJU3Vicm91dGluZVR5cGVLaW5kOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9Cit9OworCisvLy8gQmFzaWMgdHlwZSwgbGlrZSAnaW50JyBvciAnZmxvYXQnLgorLy8vCisvLy8gVE9ETzogU3BsaXQgb3V0IERXX1RBR191bnNwZWNpZmllZF90eXBlLgorLy8vIFRPRE86IERyb3AgdW51c2VkIGFjY2Vzc29ycy4KK2NsYXNzIERJQmFzaWNUeXBlIDogcHVibGljIERJVHlwZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKKyAgdW5zaWduZWQgRW5jb2Rpbmc7CisKKyAgRElCYXNpY1R5cGUoTExWTUNvbnRleHQgJkMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIHVuc2lnbmVkIFRhZywKKyAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZUluQml0cywgdWludDMyX3QgQWxpZ25JbkJpdHMsIHVuc2lnbmVkIEVuY29kaW5nLAorICAgICAgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJVHlwZShDLCBESUJhc2ljVHlwZUtpbmQsIFN0b3JhZ2UsIFRhZywgMCwgU2l6ZUluQml0cywgQWxpZ25JbkJpdHMsIDAsCisgICAgICAgICAgICAgICBGbGFnWmVybywgT3BzKSwKKyAgICAgICAgRW5jb2RpbmcoRW5jb2RpbmcpIHt9CisgIH5ESUJhc2ljVHlwZSgpID0gZGVmYXVsdDsKKworICBzdGF0aWMgRElCYXNpY1R5cGUgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLCB1aW50NjRfdCBTaXplSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWxpZ25JbkJpdHMsIHVuc2lnbmVkIEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKSB7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgVGFnLCBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBOYW1lKSwKKyAgICAgICAgICAgICAgICAgICBTaXplSW5CaXRzLCBBbGlnbkluQml0cywgRW5jb2RpbmcsIFN0b3JhZ2UsIFNob3VsZENyZWF0ZSk7CisgIH0KKyAgc3RhdGljIERJQmFzaWNUeXBlICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCB1bnNpZ25lZCBUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRFN0cmluZyAqTmFtZSwgdWludDY0X3QgU2l6ZUluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFsaWduSW5CaXRzLCB1bnNpZ25lZCBFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSk7CisKKyAgVGVtcERJQmFzaWNUeXBlIGNsb25lSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwgZ2V0VGFnKCksIGdldE5hbWUoKSwgZ2V0U2l6ZUluQml0cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWxpZ25JbkJpdHMoKSwgZ2V0RW5jb2RpbmcoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESUJhc2ljVHlwZSwgKHVuc2lnbmVkIFRhZywgU3RyaW5nUmVmIE5hbWUpLAorICAgICAgICAgICAgICAgICAgICAoVGFnLCBOYW1lLCAwLCAwLCAwKSkKKyAgREVGSU5FX01ETk9ERV9HRVQoRElCYXNpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBUYWcsIFN0cmluZ1JlZiBOYW1lLCB1aW50NjRfdCBTaXplSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWxpZ25JbkJpdHMsIHVuc2lnbmVkIEVuY29kaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgKFRhZywgTmFtZSwgU2l6ZUluQml0cywgQWxpZ25JbkJpdHMsIEVuY29kaW5nKSkKKyAgREVGSU5FX01ETk9ERV9HRVQoRElCYXNpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBUYWcsIE1EU3RyaW5nICpOYW1lLCB1aW50NjRfdCBTaXplSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWxpZ25JbkJpdHMsIHVuc2lnbmVkIEVuY29kaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgKFRhZywgTmFtZSwgU2l6ZUluQml0cywgQWxpZ25JbkJpdHMsIEVuY29kaW5nKSkKKworICBUZW1wRElCYXNpY1R5cGUgY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIHVuc2lnbmVkIGdldEVuY29kaW5nKCkgY29uc3QgeyByZXR1cm4gRW5jb2Rpbmc7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJQmFzaWNUeXBlS2luZDsKKyAgfQorfTsKKworLy8vIERlcml2ZWQgdHlwZXMuCisvLy8KKy8vLyBUaGlzIGluY2x1ZGVzIHF1YWxpZmllZCB0eXBlcywgcG9pbnRlcnMsIHJlZmVyZW5jZXMsIGZyaWVuZHMsIHR5cGVkZWZzLCBhbmQKKy8vLyBjbGFzcyBtZW1iZXJzLgorLy8vCisvLy8gVE9ETzogU3BsaXQgb3V0IG1lbWJlcnMgKGluaGVyaXRhbmNlLCBmaWVsZHMsIG1ldGhvZHMsIGV0Yy4pLgorY2xhc3MgRElEZXJpdmVkVHlwZSA6IHB1YmxpYyBESVR5cGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIC8vLyBcYnJpZWYgVGhlIERXQVJGIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIG1lbW9yeSBwb2ludGVkIHRvIG9yIHJlZmVyZW5jZWQgYnkgYQorICAvLy8gcG9pbnRlciBvciByZWZlcmVuY2UgdHlwZSByZXNwZWN0aXZlbHkuCisgIE9wdGlvbmFsPHVuc2lnbmVkPiBEV0FSRkFkZHJlc3NTcGFjZTsKKworICBESURlcml2ZWRUeXBlKExMVk1Db250ZXh0ICZDLCBTdG9yYWdlVHlwZSBTdG9yYWdlLCB1bnNpZ25lZCBUYWcsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZSwgdWludDY0X3QgU2l6ZUluQml0cywgdWludDMyX3QgQWxpZ25JbkJpdHMsCisgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0SW5CaXRzLCBPcHRpb25hbDx1bnNpZ25lZD4gRFdBUkZBZGRyZXNzU3BhY2UsCisgICAgICAgICAgICAgICAgRElGbGFncyBGbGFncywgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESVR5cGUoQywgRElEZXJpdmVkVHlwZUtpbmQsIFN0b3JhZ2UsIFRhZywgTGluZSwgU2l6ZUluQml0cywKKyAgICAgICAgICAgICAgIEFsaWduSW5CaXRzLCBPZmZzZXRJbkJpdHMsIEZsYWdzLCBPcHMpLAorICAgICAgICBEV0FSRkFkZHJlc3NTcGFjZShEV0FSRkFkZHJlc3NTcGFjZSkge30KKyAgfkRJRGVyaXZlZFR5cGUoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIERJRGVyaXZlZFR5cGUgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTY29wZVJlZiBTY29wZSwgRElUeXBlUmVmIEJhc2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLCB1aW50MzJfdCBBbGlnbkluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0SW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDx1bnNpZ25lZD4gRFdBUkZBZGRyZXNzU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmxhZ3MgRmxhZ3MsIE1ldGFkYXRhICpFeHRyYURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSkgeworICAgIHJldHVybiBnZXRJbXBsKENvbnRleHQsIFRhZywgZ2V0Q2Fub25pY2FsTURTdHJpbmcoQ29udGV4dCwgTmFtZSksIEZpbGUsCisgICAgICAgICAgICAgICAgICAgTGluZSwgU2NvcGUsIEJhc2VUeXBlLCBTaXplSW5CaXRzLCBBbGlnbkluQml0cywgT2Zmc2V0SW5CaXRzLAorICAgICAgICAgICAgICAgICAgIERXQVJGQWRkcmVzc1NwYWNlLCBGbGFncywgRXh0cmFEYXRhLCBTdG9yYWdlLCBTaG91bGRDcmVhdGUpOworICB9CisgIHN0YXRpYyBESURlcml2ZWRUeXBlICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCB1bnNpZ25lZCBUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1EU3RyaW5nICpOYW1lLCBNZXRhZGF0YSAqRmlsZSwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgKlNjb3BlLCBNZXRhZGF0YSAqQmFzZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemVJbkJpdHMsIHVpbnQzMl90IEFsaWduSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXRJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHVuc2lnbmVkPiBEV0FSRkFkZHJlc3NTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGbGFncyBGbGFncywgTWV0YWRhdGEgKkV4dHJhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElEZXJpdmVkVHlwZSBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksIGdldFRhZygpLCBnZXROYW1lKCksIGdldEZpbGUoKSwgZ2V0TGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2NvcGUoKSwgZ2V0QmFzZVR5cGUoKSwgZ2V0U2l6ZUluQml0cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWxpZ25JbkJpdHMoKSwgZ2V0T2Zmc2V0SW5CaXRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXREV0FSRkFkZHJlc3NTcGFjZSgpLCBnZXRGbGFncygpLCBnZXRFeHRyYURhdGEoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESURlcml2ZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgVGFnLCBNRFN0cmluZyAqTmFtZSwgTWV0YWRhdGEgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lLCBNZXRhZGF0YSAqU2NvcGUsIE1ldGFkYXRhICpCYXNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemVJbkJpdHMsIHVpbnQzMl90IEFsaWduSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0SW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8dW5zaWduZWQ+IERXQVJGQWRkcmVzc1NwYWNlLCBESUZsYWdzIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgKkV4dHJhRGF0YSA9IG51bGxwdHIpLAorICAgICAgICAgICAgICAgICAgICAoVGFnLCBOYW1lLCBGaWxlLCBMaW5lLCBTY29wZSwgQmFzZVR5cGUsIFNpemVJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICBBbGlnbkluQml0cywgT2Zmc2V0SW5CaXRzLCBEV0FSRkFkZHJlc3NTcGFjZSwgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICBFeHRyYURhdGEpKQorICBERUZJTkVfTUROT0RFX0dFVChESURlcml2ZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgVGFnLCBTdHJpbmdSZWYgTmFtZSwgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgICAgICAgRElTY29wZVJlZiBTY29wZSwgRElUeXBlUmVmIEJhc2VUeXBlLCB1aW50NjRfdCBTaXplSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWxpZ25JbkJpdHMsIHVpbnQ2NF90IE9mZnNldEluQml0cywKKyAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHVuc2lnbmVkPiBEV0FSRkFkZHJlc3NTcGFjZSwgRElGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhICpFeHRyYURhdGEgPSBudWxscHRyKSwKKyAgICAgICAgICAgICAgICAgICAgKFRhZywgTmFtZSwgRmlsZSwgTGluZSwgU2NvcGUsIEJhc2VUeXBlLCBTaXplSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgQWxpZ25JbkJpdHMsIE9mZnNldEluQml0cywgRFdBUkZBZGRyZXNzU3BhY2UsIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgRXh0cmFEYXRhKSkKKworICBUZW1wRElEZXJpdmVkVHlwZSBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIGNsb25lSW1wbCgpOyB9CisKKyAgLy8vIEdldCB0aGUgYmFzZSB0eXBlIHRoaXMgaXMgZGVyaXZlZCBmcm9tLgorICBESVR5cGVSZWYgZ2V0QmFzZVR5cGUoKSBjb25zdCB7IHJldHVybiBESVR5cGVSZWYoZ2V0UmF3QmFzZVR5cGUoKSk7IH0KKyAgTWV0YWRhdGEgKmdldFJhd0Jhc2VUeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgzKTsgfQorCisgIC8vLyBccmV0dXJucyBUaGUgRFdBUkYgYWRkcmVzcyBzcGFjZSBvZiB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gb3IgcmVmZXJlbmNlZCBieQorICAvLy8gYSBwb2ludGVyIG9yIHJlZmVyZW5jZSB0eXBlIHJlc3BlY3RpdmVseS4KKyAgT3B0aW9uYWw8dW5zaWduZWQ+IGdldERXQVJGQWRkcmVzc1NwYWNlKCkgY29uc3QgeyByZXR1cm4gRFdBUkZBZGRyZXNzU3BhY2U7IH0KKworICAvLy8gR2V0IGV4dHJhIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGVyaXZlZCB0eXBlLgorICAvLy8KKyAgLy8vIENsYXNzIHR5cGUgZm9yIHBvaW50ZXItdG8tbWVtYmVycywgb2JqZWN0aXZlLWMgcHJvcGVydHkgbm9kZSBmb3IgaXZhcnMsCisgIC8vLyBvciBnbG9iYWwgY29uc3RhbnQgd3JhcHBlciBmb3Igc3RhdGljIG1lbWJlcnMuCisgIC8vLworICAvLy8gVE9ETzogU2VwYXJhdGUgb3V0IHR5cGVzIHRoYXQgbmVlZCB0aGlzIGV4dHJhIG9wZXJhbmQ6IHBvaW50ZXItdG8tbWVtYmVyCisgIC8vLyB0eXBlcyBhbmQgbWVtYmVyIGZpZWxkcyAoc3RhdGljIG1lbWJlcnMgYW5kIGl2YXJzKS4KKyAgTWV0YWRhdGEgKmdldEV4dHJhRGF0YSgpIGNvbnN0IHsgcmV0dXJuIGdldFJhd0V4dHJhRGF0YSgpOyB9CisgIE1ldGFkYXRhICpnZXRSYXdFeHRyYURhdGEoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDQpOyB9CisKKyAgLy8vIEdldCBjYXN0ZWQgdmVyc2lvbiBvZiBleHRyYSBkYXRhLgorICAvLy8gQHsKKyAgRElUeXBlUmVmIGdldENsYXNzVHlwZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0VGFnKCkgPT0gZHdhcmY6OkRXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGUpOworICAgIHJldHVybiBESVR5cGVSZWYoZ2V0RXh0cmFEYXRhKCkpOworICB9CisKKyAgRElPYmpDUHJvcGVydHkgKmdldE9iakNQcm9wZXJ0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZHluX2Nhc3Rfb3JfbnVsbDxESU9iakNQcm9wZXJ0eT4oZ2V0RXh0cmFEYXRhKCkpOworICB9CisKKyAgQ29uc3RhbnQgKmdldFN0b3JhZ2VPZmZzZXRJbkJpdHMoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldFRhZygpID09IGR3YXJmOjpEV19UQUdfbWVtYmVyICYmIGlzQml0RmllbGQoKSk7CisgICAgaWYgKGF1dG8gKkMgPSBjYXN0X29yX251bGw8Q29uc3RhbnRBc01ldGFkYXRhPihnZXRFeHRyYURhdGEoKSkpCisgICAgICByZXR1cm4gQy0+Z2V0VmFsdWUoKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIENvbnN0YW50ICpnZXRDb25zdGFudCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0VGFnKCkgPT0gZHdhcmY6OkRXX1RBR19tZW1iZXIgJiYgaXNTdGF0aWNNZW1iZXIoKSk7CisgICAgaWYgKGF1dG8gKkMgPSBjYXN0X29yX251bGw8Q29uc3RhbnRBc01ldGFkYXRhPihnZXRFeHRyYURhdGEoKSkpCisgICAgICByZXR1cm4gQy0+Z2V0VmFsdWUoKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBDb25zdGFudCAqZ2V0RGlzY3JpbWluYW50VmFsdWUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldFRhZygpID09IGR3YXJmOjpEV19UQUdfbWVtYmVyICYmICFpc1N0YXRpY01lbWJlcigpKTsKKyAgICBpZiAoYXV0byAqQyA9IGNhc3Rfb3JfbnVsbDxDb25zdGFudEFzTWV0YWRhdGE+KGdldEV4dHJhRGF0YSgpKSkKKyAgICAgIHJldHVybiBDLT5nZXRWYWx1ZSgpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIC8vLyBAfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElEZXJpdmVkVHlwZUtpbmQ7CisgIH0KK307CisKKy8vLyBDb21wb3NpdGUgdHlwZXMuCisvLy8KKy8vLyBUT0RPOiBEZXRhY2ggZnJvbSBEZXJpdmVkVHlwZUJhc2UgKHNwbGl0IG91dCBNREVudW1UeXBlPykuCisvLy8gVE9ETzogQ3JlYXRlIGEgY3VzdG9tLCB1bnJlbGF0ZWQgbm9kZSBmb3IgRFdfVEFHX2FycmF5X3R5cGUuCitjbGFzcyBESUNvbXBvc2l0ZVR5cGUgOiBwdWJsaWMgRElUeXBlIHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIE1ETm9kZTsKKworICB1bnNpZ25lZCBSdW50aW1lTGFuZzsKKworICBESUNvbXBvc2l0ZVR5cGUoTExWTUNvbnRleHQgJkMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIHVuc2lnbmVkIFRhZywKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbmUsIHVuc2lnbmVkIFJ1bnRpbWVMYW5nLCB1aW50NjRfdCBTaXplSW5CaXRzLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWxpZ25JbkJpdHMsIHVpbnQ2NF90IE9mZnNldEluQml0cywgRElGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wcykKKyAgICAgIDogRElUeXBlKEMsIERJQ29tcG9zaXRlVHlwZUtpbmQsIFN0b3JhZ2UsIFRhZywgTGluZSwgU2l6ZUluQml0cywKKyAgICAgICAgICAgICAgIEFsaWduSW5CaXRzLCBPZmZzZXRJbkJpdHMsIEZsYWdzLCBPcHMpLAorICAgICAgICBSdW50aW1lTGFuZyhSdW50aW1lTGFuZykge30KKyAgfkRJQ29tcG9zaXRlVHlwZSgpID0gZGVmYXVsdDsKKworICAvLy8gQ2hhbmdlIGZpZWxkcyBpbiBwbGFjZS4KKyAgdm9pZCBtdXRhdGUodW5zaWduZWQgVGFnLCB1bnNpZ25lZCBMaW5lLCB1bnNpZ25lZCBSdW50aW1lTGFuZywKKyAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZUluQml0cywgdWludDMyX3QgQWxpZ25JbkJpdHMsCisgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldEluQml0cywgRElGbGFncyBGbGFncykgeworICAgIGFzc2VydChpc0Rpc3RpbmN0KCkgJiYgIk9ubHkgZGlzdGluY3Qgbm9kZXMgY2FuIG11dGF0ZSIpOworICAgIGFzc2VydChnZXRSYXdJZGVudGlmaWVyKCkgJiYgIk9ubHkgT0RSLXVuaXF1ZWQgbm9kZXMgc2hvdWxkIG11dGF0ZSIpOworICAgIHRoaXMtPlJ1bnRpbWVMYW5nID0gUnVudGltZUxhbmc7CisgICAgRElUeXBlOjptdXRhdGUoVGFnLCBMaW5lLCBTaXplSW5CaXRzLCBBbGlnbkluQml0cywgT2Zmc2V0SW5CaXRzLCBGbGFncyk7CisgIH0KKworICBzdGF0aWMgRElDb21wb3NpdGVUeXBlICoKKyAgZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgVGFnLCBTdHJpbmdSZWYgTmFtZSwgTWV0YWRhdGEgKkZpbGUsCisgICAgICAgICAgdW5zaWduZWQgTGluZSwgRElTY29wZVJlZiBTY29wZSwgRElUeXBlUmVmIEJhc2VUeXBlLAorICAgICAgICAgIHVpbnQ2NF90IFNpemVJbkJpdHMsIHVpbnQzMl90IEFsaWduSW5CaXRzLCB1aW50NjRfdCBPZmZzZXRJbkJpdHMsCisgICAgICAgICAgRElGbGFncyBGbGFncywgRElOb2RlQXJyYXkgRWxlbWVudHMsIHVuc2lnbmVkIFJ1bnRpbWVMYW5nLAorICAgICAgICAgIERJVHlwZVJlZiBWVGFibGVIb2xkZXIsIERJVGVtcGxhdGVQYXJhbWV0ZXJBcnJheSBUZW1wbGF0ZVBhcmFtcywKKyAgICAgICAgICBTdHJpbmdSZWYgSWRlbnRpZmllciwgRElEZXJpdmVkVHlwZSAqRGlzY3JpbWluYXRvciwKKyAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpIHsKKyAgICByZXR1cm4gZ2V0SW1wbCgKKyAgICAgICAgQ29udGV4dCwgVGFnLCBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBOYW1lKSwgRmlsZSwgTGluZSwgU2NvcGUsCisgICAgICAgIEJhc2VUeXBlLCBTaXplSW5CaXRzLCBBbGlnbkluQml0cywgT2Zmc2V0SW5CaXRzLCBGbGFncywgRWxlbWVudHMuZ2V0KCksCisgICAgICAgIFJ1bnRpbWVMYW5nLCBWVGFibGVIb2xkZXIsIFRlbXBsYXRlUGFyYW1zLmdldCgpLAorICAgICAgICBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBJZGVudGlmaWVyKSwgRGlzY3JpbWluYXRvciwgU3RvcmFnZSwgU2hvdWxkQ3JlYXRlKTsKKyAgfQorICBzdGF0aWMgRElDb21wb3NpdGVUeXBlICoKKyAgZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgVGFnLCBNRFN0cmluZyAqTmFtZSwgTWV0YWRhdGEgKkZpbGUsCisgICAgICAgICAgdW5zaWduZWQgTGluZSwgTWV0YWRhdGEgKlNjb3BlLCBNZXRhZGF0YSAqQmFzZVR5cGUsCisgICAgICAgICAgdWludDY0X3QgU2l6ZUluQml0cywgdWludDMyX3QgQWxpZ25JbkJpdHMsIHVpbnQ2NF90IE9mZnNldEluQml0cywKKyAgICAgICAgICBESUZsYWdzIEZsYWdzLCBNZXRhZGF0YSAqRWxlbWVudHMsIHVuc2lnbmVkIFJ1bnRpbWVMYW5nLAorICAgICAgICAgIE1ldGFkYXRhICpWVGFibGVIb2xkZXIsIE1ldGFkYXRhICpUZW1wbGF0ZVBhcmFtcywKKyAgICAgICAgICBNRFN0cmluZyAqSWRlbnRpZmllciwgTWV0YWRhdGEgKkRpc2NyaW1pbmF0b3IsCisgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElDb21wb3NpdGVUeXBlIGNsb25lSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwgZ2V0VGFnKCksIGdldE5hbWUoKSwgZ2V0RmlsZSgpLCBnZXRMaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRTY29wZSgpLCBnZXRCYXNlVHlwZSgpLCBnZXRTaXplSW5CaXRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBbGlnbkluQml0cygpLCBnZXRPZmZzZXRJbkJpdHMoKSwgZ2V0RmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnRzKCksIGdldFJ1bnRpbWVMYW5nKCksIGdldFZUYWJsZUhvbGRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGVtcGxhdGVQYXJhbXMoKSwgZ2V0SWRlbnRpZmllcigpLCBnZXREaXNjcmltaW5hdG9yKCkpOworICB9CisKK3B1YmxpYzoKKyAgREVGSU5FX01ETk9ERV9HRVQoRElDb21wb3NpdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgVGFnLCBTdHJpbmdSZWYgTmFtZSwgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgICAgICAgRElTY29wZVJlZiBTY29wZSwgRElUeXBlUmVmIEJhc2VUeXBlLCB1aW50NjRfdCBTaXplSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWxpZ25JbkJpdHMsIHVpbnQ2NF90IE9mZnNldEluQml0cywKKyAgICAgICAgICAgICAgICAgICAgIERJRmxhZ3MgRmxhZ3MsIERJTm9kZUFycmF5IEVsZW1lbnRzLCB1bnNpZ25lZCBSdW50aW1lTGFuZywKKyAgICAgICAgICAgICAgICAgICAgIERJVHlwZVJlZiBWVGFibGVIb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICBESVRlbXBsYXRlUGFyYW1ldGVyQXJyYXkgVGVtcGxhdGVQYXJhbXMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIElkZW50aWZpZXIgPSAiIiwgRElEZXJpdmVkVHlwZSAqRGlzY3JpbWluYXRvciA9IG51bGxwdHIpLAorICAgICAgICAgICAgICAgICAgICAoVGFnLCBOYW1lLCBGaWxlLCBMaW5lLCBTY29wZSwgQmFzZVR5cGUsIFNpemVJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICBBbGlnbkluQml0cywgT2Zmc2V0SW5CaXRzLCBGbGFncywgRWxlbWVudHMsIFJ1bnRpbWVMYW5nLAorICAgICAgICAgICAgICAgICAgICAgVlRhYmxlSG9sZGVyLCBUZW1wbGF0ZVBhcmFtcywgSWRlbnRpZmllciwgRGlzY3JpbWluYXRvcikpCisgIERFRklORV9NRE5PREVfR0VUKERJQ29tcG9zaXRlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIFRhZywgTURTdHJpbmcgKk5hbWUsIE1ldGFkYXRhICpGaWxlLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZSwgTWV0YWRhdGEgKlNjb3BlLCBNZXRhZGF0YSAqQmFzZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLCB1aW50MzJfdCBBbGlnbkluQml0cywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldEluQml0cywgRElGbGFncyBGbGFncywgTWV0YWRhdGEgKkVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUnVudGltZUxhbmcsIE1ldGFkYXRhICpWVGFibGVIb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSAqVGVtcGxhdGVQYXJhbXMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgTURTdHJpbmcgKklkZW50aWZpZXIgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgKkRpc2NyaW1pbmF0b3IgPSBudWxscHRyKSwKKyAgICAgICAgICAgICAgICAgICAgKFRhZywgTmFtZSwgRmlsZSwgTGluZSwgU2NvcGUsIEJhc2VUeXBlLCBTaXplSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgQWxpZ25JbkJpdHMsIE9mZnNldEluQml0cywgRmxhZ3MsIEVsZW1lbnRzLCBSdW50aW1lTGFuZywKKyAgICAgICAgICAgICAgICAgICAgIFZUYWJsZUhvbGRlciwgVGVtcGxhdGVQYXJhbXMsIElkZW50aWZpZXIsIERpc2NyaW1pbmF0b3IpKQorCisgIFRlbXBESUNvbXBvc2l0ZVR5cGUgY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIC8vLyBHZXQgYSBESUNvbXBvc2l0ZVR5cGUgd2l0aCB0aGUgZ2l2ZW4gT0RSIGlkZW50aWZpZXIuCisgIC8vLworICAvLy8gSWYgXGEgTExWTUNvbnRleHQ6OmlzT0RSVW5pcXVpbmdEZWJ1Z1R5cGVzKCksIGdldHMgdGhlIG1hcHBlZAorICAvLy8gRElDb21wb3NpdGVUeXBlIGZvciB0aGUgZ2l2ZW4gT0RSIFxjIElkZW50aWZpZXIuICBJZiBub25lIGV4aXN0cywgY3JlYXRlcworICAvLy8gYSBuZXcgbm9kZS4KKyAgLy8vCisgIC8vLyBFbHNlLCByZXR1cm5zIFxjIG51bGxwdHIuCisgIHN0YXRpYyBESUNvbXBvc2l0ZVR5cGUgKgorICBnZXRPRFJUeXBlKExMVk1Db250ZXh0ICZDb250ZXh0LCBNRFN0cmluZyAmSWRlbnRpZmllciwgdW5zaWduZWQgVGFnLAorICAgICAgICAgICAgIE1EU3RyaW5nICpOYW1lLCBNZXRhZGF0YSAqRmlsZSwgdW5zaWduZWQgTGluZSwgTWV0YWRhdGEgKlNjb3BlLAorICAgICAgICAgICAgIE1ldGFkYXRhICpCYXNlVHlwZSwgdWludDY0X3QgU2l6ZUluQml0cywgdWludDMyX3QgQWxpZ25JbkJpdHMsCisgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0SW5CaXRzLCBESUZsYWdzIEZsYWdzLCBNZXRhZGF0YSAqRWxlbWVudHMsCisgICAgICAgICAgICAgdW5zaWduZWQgUnVudGltZUxhbmcsIE1ldGFkYXRhICpWVGFibGVIb2xkZXIsCisgICAgICAgICAgICAgTWV0YWRhdGEgKlRlbXBsYXRlUGFyYW1zLCBNZXRhZGF0YSAqRGlzY3JpbWluYXRvcik7CisgIHN0YXRpYyBESUNvbXBvc2l0ZVR5cGUgKmdldE9EUlR5cGVJZkV4aXN0cyhMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1EU3RyaW5nICZJZGVudGlmaWVyKTsKKworICAvLy8gQnVpbGQgYSBESUNvbXBvc2l0ZVR5cGUgd2l0aCB0aGUgZ2l2ZW4gT0RSIGlkZW50aWZpZXIuCisgIC8vLworICAvLy8gTG9va3MgdXAgdGhlIG1hcHBlZCBESUNvbXBvc2l0ZVR5cGUgZm9yIHRoZSBnaXZlbiBPRFIgXGMgSWRlbnRpZmllci4gIElmCisgIC8vLyBpdCBkb2Vzbid0IGV4aXN0LCBjcmVhdGVzIGEgbmV3IG9uZS4gIElmIGl0IGRvZXMgZXhpc3QgYW5kIFxhCisgIC8vLyBpc0ZvcndhcmREZWNsKCksIGFuZCB0aGUgbmV3IGFyZ3VtZW50cyB3b3VsZCBiZSBhIGRlZmluaXRpb24sIG11dGF0ZXMgdGhlCisgIC8vLyB0aGUgdHlwZSBpbiBwbGFjZS4gIEluIGVpdGhlciBjYXNlLCByZXR1cm5zIHRoZSB0eXBlLgorICAvLy8KKyAgLy8vIElmIG5vdCBcYSBMTFZNQ29udGV4dDo6aXNPRFJVbmlxdWluZ0RlYnVnVHlwZXMoKSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgIC8vLyBudWxscHRyLgorICBzdGF0aWMgRElDb21wb3NpdGVUeXBlICoKKyAgYnVpbGRPRFJUeXBlKExMVk1Db250ZXh0ICZDb250ZXh0LCBNRFN0cmluZyAmSWRlbnRpZmllciwgdW5zaWduZWQgVGFnLAorICAgICAgICAgICAgICAgTURTdHJpbmcgKk5hbWUsIE1ldGFkYXRhICpGaWxlLCB1bnNpZ25lZCBMaW5lLCBNZXRhZGF0YSAqU2NvcGUsCisgICAgICAgICAgICAgICBNZXRhZGF0YSAqQmFzZVR5cGUsIHVpbnQ2NF90IFNpemVJbkJpdHMsIHVpbnQzMl90IEFsaWduSW5CaXRzLAorICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0SW5CaXRzLCBESUZsYWdzIEZsYWdzLCBNZXRhZGF0YSAqRWxlbWVudHMsCisgICAgICAgICAgICAgICB1bnNpZ25lZCBSdW50aW1lTGFuZywgTWV0YWRhdGEgKlZUYWJsZUhvbGRlciwKKyAgICAgICAgICAgICAgIE1ldGFkYXRhICpUZW1wbGF0ZVBhcmFtcywgTWV0YWRhdGEgKkRpc2NyaW1pbmF0b3IpOworCisgIERJVHlwZVJlZiBnZXRCYXNlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIERJVHlwZVJlZihnZXRSYXdCYXNlVHlwZSgpKTsgfQorICBESU5vZGVBcnJheSBnZXRFbGVtZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPE1EVHVwbGU+KGdldFJhd0VsZW1lbnRzKCkpOworICB9CisgIERJVHlwZVJlZiBnZXRWVGFibGVIb2xkZXIoKSBjb25zdCB7IHJldHVybiBESVR5cGVSZWYoZ2V0UmF3VlRhYmxlSG9sZGVyKCkpOyB9CisgIERJVGVtcGxhdGVQYXJhbWV0ZXJBcnJheSBnZXRUZW1wbGF0ZVBhcmFtcygpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPE1EVHVwbGU+KGdldFJhd1RlbXBsYXRlUGFyYW1zKCkpOworICB9CisgIFN0cmluZ1JlZiBnZXRJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCg3KTsgfQorICB1bnNpZ25lZCBnZXRSdW50aW1lTGFuZygpIGNvbnN0IHsgcmV0dXJuIFJ1bnRpbWVMYW5nOyB9CisKKyAgTWV0YWRhdGEgKmdldFJhd0Jhc2VUeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgzKTsgfQorICBNZXRhZGF0YSAqZ2V0UmF3RWxlbWVudHMoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDQpOyB9CisgIE1ldGFkYXRhICpnZXRSYXdWVGFibGVIb2xkZXIoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDUpOyB9CisgIE1ldGFkYXRhICpnZXRSYXdUZW1wbGF0ZVBhcmFtcygpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoNik7IH0KKyAgTURTdHJpbmcgKmdldFJhd0lkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KDcpOyB9CisgIE1ldGFkYXRhICpnZXRSYXdEaXNjcmltaW5hdG9yKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCg4KTsgfQorICBESURlcml2ZWRUeXBlICpnZXREaXNjcmltaW5hdG9yKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZEFzPERJRGVyaXZlZFR5cGU+KDgpOyB9CisKKyAgLy8vIFJlcGxhY2Ugb3BlcmFuZHMuCisgIC8vLworICAvLy8gSWYgdGhpcyBcYSBpc1VuaXF1ZWQoKSBhbmQgbm90IFxhIGlzUmVzb2x2ZWQoKSwgb24gYSB1bmlxdWluZyBjb2xsaXNpb24KKyAgLy8vIHRoaXMgd2lsbCBiZSBSQVVXJ2VkIGFuZCBkZWxldGVkLiAgVXNlIGEgXGEgVHJhY2tpbmdNRFJlZiB0byBrZWVwIHRyYWNrCisgIC8vLyBvZiBpdHMgbW92ZW1lbnQgaWYgbmVjZXNzYXJ5LgorICAvLy8gQHsKKyAgdm9pZCByZXBsYWNlRWxlbWVudHMoRElOb2RlQXJyYXkgRWxlbWVudHMpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgZm9yIChESU5vZGUgKk9wIDogZ2V0RWxlbWVudHMoKSkKKyAgICAgIGFzc2VydChpc19jb250YWluZWQoRWxlbWVudHMtPm9wZXJhbmRzKCksIE9wKSAmJgorICAgICAgICAgICAgICJMb3N0IGEgbWVtYmVyIGR1cmluZyBtZW1iZXIgbGlzdCByZXBsYWNlbWVudCIpOworI2VuZGlmCisgICAgcmVwbGFjZU9wZXJhbmRXaXRoKDQsIEVsZW1lbnRzLmdldCgpKTsKKyAgfQorCisgIHZvaWQgcmVwbGFjZVZUYWJsZUhvbGRlcihESVR5cGVSZWYgVlRhYmxlSG9sZGVyKSB7CisgICAgcmVwbGFjZU9wZXJhbmRXaXRoKDUsIFZUYWJsZUhvbGRlcik7CisgIH0KKworICB2b2lkIHJlcGxhY2VUZW1wbGF0ZVBhcmFtcyhESVRlbXBsYXRlUGFyYW1ldGVyQXJyYXkgVGVtcGxhdGVQYXJhbXMpIHsKKyAgICByZXBsYWNlT3BlcmFuZFdpdGgoNiwgVGVtcGxhdGVQYXJhbXMuZ2V0KCkpOworICB9CisgIC8vLyBAfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElDb21wb3NpdGVUeXBlS2luZDsKKyAgfQorfTsKKworLy8vIFR5cGUgYXJyYXkgZm9yIGEgc3VicHJvZ3JhbS4KKy8vLworLy8vIFRPRE86IEZvbGQgdGhlIGFycmF5IG9mIHR5cGVzIGluIGRpcmVjdGx5IGFzIG9wZXJhbmRzLgorY2xhc3MgRElTdWJyb3V0aW5lVHlwZSA6IHB1YmxpYyBESVR5cGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIC8vLyBUaGUgY2FsbGluZyBjb252ZW50aW9uIHVzZWQgd2l0aCBEV19BVF9jYWxsaW5nX2NvbnZlbnRpb24uIEFjdHVhbGx5IG9mCisgIC8vLyB0eXBlIGR3YXJmOjpDYWxsaW5nQ29udmVudGlvbi4KKyAgdWludDhfdCBDQzsKKworICBESVN1YnJvdXRpbmVUeXBlKExMVk1Db250ZXh0ICZDLCBTdG9yYWdlVHlwZSBTdG9yYWdlLCBESUZsYWdzIEZsYWdzLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgQ0MsIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wcykKKyAgICAgIDogRElUeXBlKEMsIERJU3Vicm91dGluZVR5cGVLaW5kLCBTdG9yYWdlLCBkd2FyZjo6RFdfVEFHX3N1YnJvdXRpbmVfdHlwZSwKKyAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIEZsYWdzLCBPcHMpLAorICAgICAgICBDQyhDQykge30KKyAgfkRJU3Vicm91dGluZVR5cGUoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIERJU3Vicm91dGluZVR5cGUgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIERJRmxhZ3MgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgQ0MsIERJVHlwZVJlZkFycmF5IFR5cGVBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKSB7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgRmxhZ3MsIENDLCBUeXBlQXJyYXkuZ2V0KCksIFN0b3JhZ2UsIFNob3VsZENyZWF0ZSk7CisgIH0KKyAgc3RhdGljIERJU3Vicm91dGluZVR5cGUgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIERJRmxhZ3MgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgQ0MsIE1ldGFkYXRhICpUeXBlQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSk7CisKKyAgVGVtcERJU3Vicm91dGluZVR5cGUgY2xvbmVJbXBsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUZW1wb3JhcnkoZ2V0Q29udGV4dCgpLCBnZXRGbGFncygpLCBnZXRDQygpLCBnZXRUeXBlQXJyYXkoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESVN1YnJvdXRpbmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAoRElGbGFncyBGbGFncywgdWludDhfdCBDQywgRElUeXBlUmVmQXJyYXkgVHlwZUFycmF5KSwKKyAgICAgICAgICAgICAgICAgICAgKEZsYWdzLCBDQywgVHlwZUFycmF5KSkKKyAgREVGSU5FX01ETk9ERV9HRVQoRElTdWJyb3V0aW5lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgKERJRmxhZ3MgRmxhZ3MsIHVpbnQ4X3QgQ0MsIE1ldGFkYXRhICpUeXBlQXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAoRmxhZ3MsIENDLCBUeXBlQXJyYXkpKQorCisgIFRlbXBESVN1YnJvdXRpbmVUeXBlIGNsb25lKCkgY29uc3QgeyByZXR1cm4gY2xvbmVJbXBsKCk7IH0KKworICB1aW50OF90IGdldENDKCkgY29uc3QgeyByZXR1cm4gQ0M7IH0KKworICBESVR5cGVSZWZBcnJheSBnZXRUeXBlQXJyYXkoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxNRFR1cGxlPihnZXRSYXdUeXBlQXJyYXkoKSk7CisgIH0KKworICBNZXRhZGF0YSAqZ2V0UmF3VHlwZUFycmF5KCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgzKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElTdWJyb3V0aW5lVHlwZUtpbmQ7CisgIH0KK307CisKKy8vLyBDb21waWxlIHVuaXQuCitjbGFzcyBESUNvbXBpbGVVbml0IDogcHVibGljIERJU2NvcGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCitwdWJsaWM6CisgIGVudW0gRGVidWdFbWlzc2lvbktpbmQgOiB1bnNpZ25lZCB7CisgICAgTm9EZWJ1ZyA9IDAsCisgICAgRnVsbERlYnVnLAorICAgIExpbmVUYWJsZXNPbmx5LAorICAgIExhc3RFbWlzc2lvbktpbmQgPSBMaW5lVGFibGVzT25seQorICB9OworCisgIHN0YXRpYyBPcHRpb25hbDxEZWJ1Z0VtaXNzaW9uS2luZD4gZ2V0RW1pc3Npb25LaW5kKFN0cmluZ1JlZiBTdHIpOworICBzdGF0aWMgY29uc3QgY2hhciAqRW1pc3Npb25LaW5kU3RyaW5nKERlYnVnRW1pc3Npb25LaW5kIEVLKTsKKworcHJpdmF0ZToKKyAgdW5zaWduZWQgU291cmNlTGFuZ3VhZ2U7CisgIGJvb2wgSXNPcHRpbWl6ZWQ7CisgIHVuc2lnbmVkIFJ1bnRpbWVWZXJzaW9uOworICB1bnNpZ25lZCBFbWlzc2lvbktpbmQ7CisgIHVpbnQ2NF90IERXT0lkOworICBib29sIFNwbGl0RGVidWdJbmxpbmluZzsKKyAgYm9vbCBEZWJ1Z0luZm9Gb3JQcm9maWxpbmc7CisgIGJvb2wgR251UHVibmFtZXM7CisKKyAgRElDb21waWxlVW5pdChMTFZNQ29udGV4dCAmQywgU3RvcmFnZVR5cGUgU3RvcmFnZSwgdW5zaWduZWQgU291cmNlTGFuZ3VhZ2UsCisgICAgICAgICAgICAgICAgYm9vbCBJc09wdGltaXplZCwgdW5zaWduZWQgUnVudGltZVZlcnNpb24sCisgICAgICAgICAgICAgICAgdW5zaWduZWQgRW1pc3Npb25LaW5kLCB1aW50NjRfdCBEV09JZCwgYm9vbCBTcGxpdERlYnVnSW5saW5pbmcsCisgICAgICAgICAgICAgICAgYm9vbCBEZWJ1Z0luZm9Gb3JQcm9maWxpbmcsIGJvb2wgR251UHVibmFtZXMsIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wcykKKyAgICAgIDogRElTY29wZShDLCBESUNvbXBpbGVVbml0S2luZCwgU3RvcmFnZSwgZHdhcmY6OkRXX1RBR19jb21waWxlX3VuaXQsIE9wcyksCisgICAgICAgIFNvdXJjZUxhbmd1YWdlKFNvdXJjZUxhbmd1YWdlKSwgSXNPcHRpbWl6ZWQoSXNPcHRpbWl6ZWQpLAorICAgICAgICBSdW50aW1lVmVyc2lvbihSdW50aW1lVmVyc2lvbiksIEVtaXNzaW9uS2luZChFbWlzc2lvbktpbmQpLAorICAgICAgICBEV09JZChEV09JZCksIFNwbGl0RGVidWdJbmxpbmluZyhTcGxpdERlYnVnSW5saW5pbmcpLAorICAgICAgICBEZWJ1Z0luZm9Gb3JQcm9maWxpbmcoRGVidWdJbmZvRm9yUHJvZmlsaW5nKSwgR251UHVibmFtZXMoR251UHVibmFtZXMpIHsKKyAgICBhc3NlcnQoU3RvcmFnZSAhPSBVbmlxdWVkKTsKKyAgfQorICB+RElDb21waWxlVW5pdCgpID0gZGVmYXVsdDsKKworICBzdGF0aWMgRElDb21waWxlVW5pdCAqCisgIGdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIFNvdXJjZUxhbmd1YWdlLCBESUZpbGUgKkZpbGUsCisgICAgICAgICAgU3RyaW5nUmVmIFByb2R1Y2VyLCBib29sIElzT3B0aW1pemVkLCBTdHJpbmdSZWYgRmxhZ3MsCisgICAgICAgICAgdW5zaWduZWQgUnVudGltZVZlcnNpb24sIFN0cmluZ1JlZiBTcGxpdERlYnVnRmlsZW5hbWUsCisgICAgICAgICAgdW5zaWduZWQgRW1pc3Npb25LaW5kLCBESUNvbXBvc2l0ZVR5cGVBcnJheSBFbnVtVHlwZXMsCisgICAgICAgICAgRElTY29wZUFycmF5IFJldGFpbmVkVHlwZXMsCisgICAgICAgICAgRElHbG9iYWxWYXJpYWJsZUV4cHJlc3Npb25BcnJheSBHbG9iYWxWYXJpYWJsZXMsCisgICAgICAgICAgRElJbXBvcnRlZEVudGl0eUFycmF5IEltcG9ydGVkRW50aXRpZXMsIERJTWFjcm9Ob2RlQXJyYXkgTWFjcm9zLAorICAgICAgICAgIHVpbnQ2NF90IERXT0lkLCBib29sIFNwbGl0RGVidWdJbmxpbmluZywgYm9vbCBEZWJ1Z0luZm9Gb3JQcm9maWxpbmcsCisgICAgICAgICAgYm9vbCBHbnVQdWJuYW1lcywgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKSB7CisgICAgcmV0dXJuIGdldEltcGwoCisgICAgICAgIENvbnRleHQsIFNvdXJjZUxhbmd1YWdlLCBGaWxlLCBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBQcm9kdWNlciksCisgICAgICAgIElzT3B0aW1pemVkLCBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBGbGFncyksIFJ1bnRpbWVWZXJzaW9uLAorICAgICAgICBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBTcGxpdERlYnVnRmlsZW5hbWUpLCBFbWlzc2lvbktpbmQsCisgICAgICAgIEVudW1UeXBlcy5nZXQoKSwgUmV0YWluZWRUeXBlcy5nZXQoKSwgR2xvYmFsVmFyaWFibGVzLmdldCgpLAorICAgICAgICBJbXBvcnRlZEVudGl0aWVzLmdldCgpLCBNYWNyb3MuZ2V0KCksIERXT0lkLCBTcGxpdERlYnVnSW5saW5pbmcsCisgICAgICAgIERlYnVnSW5mb0ZvclByb2ZpbGluZywgR251UHVibmFtZXMsIFN0b3JhZ2UsIFNob3VsZENyZWF0ZSk7CisgIH0KKyAgc3RhdGljIERJQ29tcGlsZVVuaXQgKgorICBnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCB1bnNpZ25lZCBTb3VyY2VMYW5ndWFnZSwgTWV0YWRhdGEgKkZpbGUsCisgICAgICAgICAgTURTdHJpbmcgKlByb2R1Y2VyLCBib29sIElzT3B0aW1pemVkLCBNRFN0cmluZyAqRmxhZ3MsCisgICAgICAgICAgdW5zaWduZWQgUnVudGltZVZlcnNpb24sIE1EU3RyaW5nICpTcGxpdERlYnVnRmlsZW5hbWUsCisgICAgICAgICAgdW5zaWduZWQgRW1pc3Npb25LaW5kLCBNZXRhZGF0YSAqRW51bVR5cGVzLCBNZXRhZGF0YSAqUmV0YWluZWRUeXBlcywKKyAgICAgICAgICBNZXRhZGF0YSAqR2xvYmFsVmFyaWFibGVzLCBNZXRhZGF0YSAqSW1wb3J0ZWRFbnRpdGllcywKKyAgICAgICAgICBNZXRhZGF0YSAqTWFjcm9zLCB1aW50NjRfdCBEV09JZCwgYm9vbCBTcGxpdERlYnVnSW5saW5pbmcsCisgICAgICAgICAgYm9vbCBEZWJ1Z0luZm9Gb3JQcm9maWxpbmcsIGJvb2wgR251UHVibmFtZXMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElDb21waWxlVW5pdCBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksIGdldFNvdXJjZUxhbmd1YWdlKCksIGdldEZpbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb2R1Y2VyKCksIGlzT3B0aW1pemVkKCksIGdldEZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRSdW50aW1lVmVyc2lvbigpLCBnZXRTcGxpdERlYnVnRmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEVtaXNzaW9uS2luZCgpLCBnZXRFbnVtVHlwZXMoKSwgZ2V0UmV0YWluZWRUeXBlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0R2xvYmFsVmFyaWFibGVzKCksIGdldEltcG9ydGVkRW50aXRpZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE1hY3JvcygpLCBEV09JZCwgZ2V0U3BsaXREZWJ1Z0lubGluaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWJ1Z0luZm9Gb3JQcm9maWxpbmcoKSwgZ2V0R251UHVibmFtZXMoKSk7CisgIH0KKworcHVibGljOgorICBzdGF0aWMgdm9pZCBnZXQoKSA9IGRlbGV0ZTsKKyAgc3RhdGljIHZvaWQgZ2V0SWZFeGlzdHMoKSA9IGRlbGV0ZTsKKworICBERUZJTkVfTUROT0RFX0dFVF9ESVNUSU5DVF9URU1QT1JBUlkoCisgICAgICBESUNvbXBpbGVVbml0LAorICAgICAgKHVuc2lnbmVkIFNvdXJjZUxhbmd1YWdlLCBESUZpbGUgKkZpbGUsIFN0cmluZ1JlZiBQcm9kdWNlciwKKyAgICAgICBib29sIElzT3B0aW1pemVkLCBTdHJpbmdSZWYgRmxhZ3MsIHVuc2lnbmVkIFJ1bnRpbWVWZXJzaW9uLAorICAgICAgIFN0cmluZ1JlZiBTcGxpdERlYnVnRmlsZW5hbWUsIERlYnVnRW1pc3Npb25LaW5kIEVtaXNzaW9uS2luZCwKKyAgICAgICBESUNvbXBvc2l0ZVR5cGVBcnJheSBFbnVtVHlwZXMsIERJU2NvcGVBcnJheSBSZXRhaW5lZFR5cGVzLAorICAgICAgIERJR2xvYmFsVmFyaWFibGVFeHByZXNzaW9uQXJyYXkgR2xvYmFsVmFyaWFibGVzLAorICAgICAgIERJSW1wb3J0ZWRFbnRpdHlBcnJheSBJbXBvcnRlZEVudGl0aWVzLCBESU1hY3JvTm9kZUFycmF5IE1hY3JvcywKKyAgICAgICB1aW50NjRfdCBEV09JZCwgYm9vbCBTcGxpdERlYnVnSW5saW5pbmcsIGJvb2wgRGVidWdJbmZvRm9yUHJvZmlsaW5nLAorICAgICAgIGJvb2wgR251UHVibmFtZXMpLAorICAgICAgKFNvdXJjZUxhbmd1YWdlLCBGaWxlLCBQcm9kdWNlciwgSXNPcHRpbWl6ZWQsIEZsYWdzLCBSdW50aW1lVmVyc2lvbiwKKyAgICAgICBTcGxpdERlYnVnRmlsZW5hbWUsIEVtaXNzaW9uS2luZCwgRW51bVR5cGVzLCBSZXRhaW5lZFR5cGVzLAorICAgICAgIEdsb2JhbFZhcmlhYmxlcywgSW1wb3J0ZWRFbnRpdGllcywgTWFjcm9zLCBEV09JZCwgU3BsaXREZWJ1Z0lubGluaW5nLAorICAgICAgIERlYnVnSW5mb0ZvclByb2ZpbGluZywgR251UHVibmFtZXMpKQorICBERUZJTkVfTUROT0RFX0dFVF9ESVNUSU5DVF9URU1QT1JBUlkoCisgICAgICBESUNvbXBpbGVVbml0LAorICAgICAgKHVuc2lnbmVkIFNvdXJjZUxhbmd1YWdlLCBNZXRhZGF0YSAqRmlsZSwgTURTdHJpbmcgKlByb2R1Y2VyLAorICAgICAgIGJvb2wgSXNPcHRpbWl6ZWQsIE1EU3RyaW5nICpGbGFncywgdW5zaWduZWQgUnVudGltZVZlcnNpb24sCisgICAgICAgTURTdHJpbmcgKlNwbGl0RGVidWdGaWxlbmFtZSwgdW5zaWduZWQgRW1pc3Npb25LaW5kLCBNZXRhZGF0YSAqRW51bVR5cGVzLAorICAgICAgIE1ldGFkYXRhICpSZXRhaW5lZFR5cGVzLCBNZXRhZGF0YSAqR2xvYmFsVmFyaWFibGVzLAorICAgICAgIE1ldGFkYXRhICpJbXBvcnRlZEVudGl0aWVzLCBNZXRhZGF0YSAqTWFjcm9zLCB1aW50NjRfdCBEV09JZCwKKyAgICAgICBib29sIFNwbGl0RGVidWdJbmxpbmluZywgYm9vbCBEZWJ1Z0luZm9Gb3JQcm9maWxpbmcsIGJvb2wgR251UHVibmFtZXMpLAorICAgICAgKFNvdXJjZUxhbmd1YWdlLCBGaWxlLCBQcm9kdWNlciwgSXNPcHRpbWl6ZWQsIEZsYWdzLCBSdW50aW1lVmVyc2lvbiwKKyAgICAgICBTcGxpdERlYnVnRmlsZW5hbWUsIEVtaXNzaW9uS2luZCwgRW51bVR5cGVzLCBSZXRhaW5lZFR5cGVzLAorICAgICAgIEdsb2JhbFZhcmlhYmxlcywgSW1wb3J0ZWRFbnRpdGllcywgTWFjcm9zLCBEV09JZCwgU3BsaXREZWJ1Z0lubGluaW5nLAorICAgICAgIERlYnVnSW5mb0ZvclByb2ZpbGluZywgR251UHVibmFtZXMpKQorCisgIFRlbXBESUNvbXBpbGVVbml0IGNsb25lKCkgY29uc3QgeyByZXR1cm4gY2xvbmVJbXBsKCk7IH0KKworICB1bnNpZ25lZCBnZXRTb3VyY2VMYW5ndWFnZSgpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZUxhbmd1YWdlOyB9CisgIGJvb2wgaXNPcHRpbWl6ZWQoKSBjb25zdCB7IHJldHVybiBJc09wdGltaXplZDsgfQorICB1bnNpZ25lZCBnZXRSdW50aW1lVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIFJ1bnRpbWVWZXJzaW9uOyB9CisgIERlYnVnRW1pc3Npb25LaW5kIGdldEVtaXNzaW9uS2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKERlYnVnRW1pc3Npb25LaW5kKUVtaXNzaW9uS2luZDsKKyAgfQorICBib29sIGdldERlYnVnSW5mb0ZvclByb2ZpbGluZygpIGNvbnN0IHsgcmV0dXJuIERlYnVnSW5mb0ZvclByb2ZpbGluZzsgfQorICBib29sIGdldEdudVB1Ym5hbWVzKCkgY29uc3QgeyByZXR1cm4gR251UHVibmFtZXM7IH0KKyAgU3RyaW5nUmVmIGdldFByb2R1Y2VyKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCgxKTsgfQorICBTdHJpbmdSZWYgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmdPcGVyYW5kKDIpOyB9CisgIFN0cmluZ1JlZiBnZXRTcGxpdERlYnVnRmlsZW5hbWUoKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmdPcGVyYW5kKDMpOyB9CisgIERJQ29tcG9zaXRlVHlwZUFycmF5IGdldEVudW1UeXBlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPE1EVHVwbGU+KGdldFJhd0VudW1UeXBlcygpKTsKKyAgfQorICBESVNjb3BlQXJyYXkgZ2V0UmV0YWluZWRUeXBlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPE1EVHVwbGU+KGdldFJhd1JldGFpbmVkVHlwZXMoKSk7CisgIH0KKyAgRElHbG9iYWxWYXJpYWJsZUV4cHJlc3Npb25BcnJheSBnZXRHbG9iYWxWYXJpYWJsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxNRFR1cGxlPihnZXRSYXdHbG9iYWxWYXJpYWJsZXMoKSk7CisgIH0KKyAgRElJbXBvcnRlZEVudGl0eUFycmF5IGdldEltcG9ydGVkRW50aXRpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxNRFR1cGxlPihnZXRSYXdJbXBvcnRlZEVudGl0aWVzKCkpOworICB9CisgIERJTWFjcm9Ob2RlQXJyYXkgZ2V0TWFjcm9zKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8TURUdXBsZT4oZ2V0UmF3TWFjcm9zKCkpOworICB9CisgIHVpbnQ2NF90IGdldERXT0lkKCkgY29uc3QgeyByZXR1cm4gRFdPSWQ7IH0KKyAgdm9pZCBzZXREV09JZCh1aW50NjRfdCBEd29JZCkgeyBEV09JZCA9IER3b0lkOyB9CisgIGJvb2wgZ2V0U3BsaXREZWJ1Z0lubGluaW5nKCkgY29uc3QgeyByZXR1cm4gU3BsaXREZWJ1Z0lubGluaW5nOyB9CisgIHZvaWQgc2V0U3BsaXREZWJ1Z0lubGluaW5nKGJvb2wgU3BsaXREZWJ1Z0lubGluaW5nKSB7CisgICAgdGhpcy0+U3BsaXREZWJ1Z0lubGluaW5nID0gU3BsaXREZWJ1Z0lubGluaW5nOworICB9CisKKyAgTURTdHJpbmcgKmdldFJhd1Byb2R1Y2VyKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPigxKTsgfQorICBNRFN0cmluZyAqZ2V0UmF3RmxhZ3MoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KDIpOyB9CisgIE1EU3RyaW5nICpnZXRSYXdTcGxpdERlYnVnRmlsZW5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wZXJhbmRBczxNRFN0cmluZz4oMyk7CisgIH0KKyAgTWV0YWRhdGEgKmdldFJhd0VudW1UeXBlcygpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoNCk7IH0KKyAgTWV0YWRhdGEgKmdldFJhd1JldGFpbmVkVHlwZXMoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDUpOyB9CisgIE1ldGFkYXRhICpnZXRSYXdHbG9iYWxWYXJpYWJsZXMoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDYpOyB9CisgIE1ldGFkYXRhICpnZXRSYXdJbXBvcnRlZEVudGl0aWVzKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCg3KTsgfQorICBNZXRhZGF0YSAqZ2V0UmF3TWFjcm9zKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCg4KTsgfQorCisgIC8vLyBSZXBsYWNlIGFycmF5cy4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIFxhIGlzVW5pcXVlZCgpIGFuZCBub3QgXGEgaXNSZXNvbHZlZCgpLCBpdCB3aWxsIGJlIFJBVVcnZWQgYW5kCisgIC8vLyBkZWxldGVkIG9uIGEgdW5pcXVpbmcgY29sbGlzaW9uLiAgSW4gcHJhY3RpY2UsIHVuaXF1aW5nIGNvbGxpc2lvbnMgb24gXGEKKyAgLy8vIERJQ29tcGlsZVVuaXQgc2hvdWxkIGJlIGZhaXJseSByYXJlLgorICAvLy8gQHsKKyAgdm9pZCByZXBsYWNlRW51bVR5cGVzKERJQ29tcG9zaXRlVHlwZUFycmF5IE4pIHsKKyAgICByZXBsYWNlT3BlcmFuZFdpdGgoNCwgTi5nZXQoKSk7CisgIH0KKyAgdm9pZCByZXBsYWNlUmV0YWluZWRUeXBlcyhESVR5cGVBcnJheSBOKSB7CisgICAgcmVwbGFjZU9wZXJhbmRXaXRoKDUsIE4uZ2V0KCkpOworICB9CisgIHZvaWQgcmVwbGFjZUdsb2JhbFZhcmlhYmxlcyhESUdsb2JhbFZhcmlhYmxlRXhwcmVzc2lvbkFycmF5IE4pIHsKKyAgICByZXBsYWNlT3BlcmFuZFdpdGgoNiwgTi5nZXQoKSk7CisgIH0KKyAgdm9pZCByZXBsYWNlSW1wb3J0ZWRFbnRpdGllcyhESUltcG9ydGVkRW50aXR5QXJyYXkgTikgeworICAgIHJlcGxhY2VPcGVyYW5kV2l0aCg3LCBOLmdldCgpKTsKKyAgfQorICB2b2lkIHJlcGxhY2VNYWNyb3MoRElNYWNyb05vZGVBcnJheSBOKSB7IHJlcGxhY2VPcGVyYW5kV2l0aCg4LCBOLmdldCgpKTsgfQorICAvLy8gQH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJQ29tcGlsZVVuaXRLaW5kOworICB9Cit9OworCisvLy8gQSBzY29wZSBmb3IgbG9jYWxzLgorLy8vCisvLy8gQSBsZWdhbCBzY29wZSBmb3IgbGV4aWNhbCBibG9ja3MsIGxvY2FsIHZhcmlhYmxlcywgYW5kIGRlYnVnIGluZm8KKy8vLyBsb2NhdGlvbnMuICBTdWJjbGFzc2VzIGFyZSBcYSBESVN1YnByb2dyYW0sIFxhIERJTGV4aWNhbEJsb2NrLCBhbmQgXGEKKy8vLyBESUxleGljYWxCbG9ja0ZpbGUuCitjbGFzcyBESUxvY2FsU2NvcGUgOiBwdWJsaWMgRElTY29wZSB7Citwcm90ZWN0ZWQ6CisgIERJTG9jYWxTY29wZShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgSUQsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIHVuc2lnbmVkIFRhZywKKyAgICAgICAgICAgICAgIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wcykKKyAgICAgIDogRElTY29wZShDLCBJRCwgU3RvcmFnZSwgVGFnLCBPcHMpIHt9CisgIH5ESUxvY2FsU2NvcGUoKSA9IGRlZmF1bHQ7CisKK3B1YmxpYzoKKyAgLy8vIEdldCB0aGUgc3VicHJvZ3JhbSBmb3IgdGhpcyBzY29wZS4KKyAgLy8vCisgIC8vLyBSZXR1cm4gdGhpcyBpZiBpdCdzIGFuIFxhIERJU3VicHJvZ3JhbTsgb3RoZXJ3aXNlLCBsb29rIHVwIHRoZSBzY29wZQorICAvLy8gY2hhaW4uCisgIERJU3VicHJvZ3JhbSAqZ2V0U3VicHJvZ3JhbSgpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIGZpcnN0IG5vbiBESUxleGljYWxCbG9ja0ZpbGUgc2NvcGUgb2YgdGhpcyBzY29wZS4KKyAgLy8vCisgIC8vLyBSZXR1cm4gdGhpcyBpZiBpdCdzIG5vdCBhIFxhIERJTGV4aWNhbEJsb2NrRklsZTsgb3RoZXJ3aXNlLCBsb29rIHVwIHRoZQorICAvLy8gc2NvcGUgY2hhaW4uCisgIERJTG9jYWxTY29wZSAqZ2V0Tm9uTGV4aWNhbEJsb2NrRmlsZVNjb3BlKCkgY29uc3Q7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESVN1YnByb2dyYW1LaW5kIHx8CisgICAgICAgICAgIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElMZXhpY2FsQmxvY2tLaW5kIHx8CisgICAgICAgICAgIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElMZXhpY2FsQmxvY2tGaWxlS2luZDsKKyAgfQorfTsKKworLy8vIERlYnVnIGxvY2F0aW9uLgorLy8vCisvLy8gQSBkZWJ1ZyBsb2NhdGlvbiBpbiBzb3VyY2UgY29kZSwgdXNlZCBmb3IgZGVidWcgaW5mbyBhbmQgb3RoZXJ3aXNlLgorY2xhc3MgRElMb2NhdGlvbiA6IHB1YmxpYyBNRE5vZGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIERJTG9jYXRpb24oTExWTUNvbnRleHQgJkMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgdW5zaWduZWQgQ29sdW1uLCBBcnJheVJlZjxNZXRhZGF0YSAqPiBNRHMpOworICB+RElMb2NhdGlvbigpIHsgZHJvcEFsbFJlZmVyZW5jZXMoKTsgfQorCisgIHN0YXRpYyBESUxvY2F0aW9uICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2x1bW4sIE1ldGFkYXRhICpTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgKklubGluZWRBdCwgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKyAgc3RhdGljIERJTG9jYXRpb24gKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbHVtbiwgRElMb2NhbFNjb3BlICpTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElMb2NhdGlvbiAqSW5saW5lZEF0LCBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpIHsKKyAgICByZXR1cm4gZ2V0SW1wbChDb250ZXh0LCBMaW5lLCBDb2x1bW4sIHN0YXRpY19jYXN0PE1ldGFkYXRhICo+KFNjb3BlKSwKKyAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxNZXRhZGF0YSAqPihJbmxpbmVkQXQpLCBTdG9yYWdlLCBTaG91bGRDcmVhdGUpOworICB9CisKKyAgLy8vIFdpdGggYSBnaXZlbiB1bnNpZ25lZCBpbnQgXHAgVSwgdXNlIHVwIHRvIDEzIGJpdHMgdG8gcmVwcmVzZW50IGl0LgorICAvLy8gb2xkX2JpdCAxfjUgIC0tPiBuZXdfYml0IDF+NQorICAvLy8gb2xkX2JpdCA2fjEyIC0tPiBuZXdfYml0IDd+MTMKKyAgLy8vIG5ld19iaXRfNiBpcyAwIGlmIGhpZ2hlciBiaXRzICg3fjEzKSBhcmUgYWxsIDAKKyAgc3RhdGljIHVuc2lnbmVkIGdldFByZWZpeEVuY29kaW5nRnJvbVVuc2lnbmVkKHVuc2lnbmVkIFUpIHsKKyAgICBVICY9IDB4ZmZmOworICAgIHJldHVybiBVID4gMHgxZiA/ICgoKFUgJiAweGZlMCkgPDwgMSkgfCAoVSAmIDB4MWYpIHwgMHgyMCkgOiBVOworICB9CisKKyAgLy8vIFJldmVyc2UgdHJhbnNmb3JtYXRpb24gYXMgZ2V0UHJlZml4RW5jb2RpbmdGcm9tVW5zaWduZWQuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRVbnNpZ25lZEZyb21QcmVmaXhFbmNvZGluZyh1bnNpZ25lZCBVKSB7CisgICAgcmV0dXJuIChVICYgMHgyMCkgPyAoKChVID4+IDEpICYgMHhmZTApIHwgKFUgJiAweDFmKSkgOiAoVSAmIDB4MWYpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG5leHQgY29tcG9uZW50IHN0b3JlZCBpbiBkaXNjcmltaW5hdG9yLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0TmV4dENvbXBvbmVudEluRGlzY3JpbWluYXRvcih1bnNpZ25lZCBEKSB7CisgICAgaWYgKChEICYgMSkgPT0gMCkKKyAgICAgIHJldHVybiBEID4+ICgoRCAmIDB4NDApID8gMTQgOiA3KTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gRCA+PiAxOworICB9CisKKyAgVGVtcERJTG9jYXRpb24gY2xvbmVJbXBsKCkgY29uc3QgeworICAgIC8vIEdldCB0aGUgcmF3IHNjb3BlL2lubGluZWRBdCBzaW5jZSBpdCBpcyBwb3NzaWJsZSB0byBpbnZva2UgdGhpcyBvbgorICAgIC8vIGEgRElMb2NhdGlvbiBjb250YWluaW5nIHRlbXBvcmFyeSBtZXRhZGF0YS4KKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSwgZ2V0UmF3U2NvcGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFJhd0lubGluZWRBdCgpKTsKKyAgfQorCitwdWJsaWM6CisgIC8vIERpc2FsbG93IHJlcGxhY2luZyBvcGVyYW5kcy4KKyAgdm9pZCByZXBsYWNlT3BlcmFuZFdpdGgodW5zaWduZWQgSSwgTWV0YWRhdGEgKk5ldykgPSBkZWxldGU7CisKKyAgREVGSU5FX01ETk9ERV9HRVQoRElMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIExpbmUsIHVuc2lnbmVkIENvbHVtbiwgTWV0YWRhdGEgKlNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgKklubGluZWRBdCA9IG51bGxwdHIpLAorICAgICAgICAgICAgICAgICAgICAoTGluZSwgQ29sdW1uLCBTY29wZSwgSW5saW5lZEF0KSkKKyAgREVGSU5FX01ETk9ERV9HRVQoRElMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIExpbmUsIHVuc2lnbmVkIENvbHVtbiwgRElMb2NhbFNjb3BlICpTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgIERJTG9jYXRpb24gKklubGluZWRBdCA9IG51bGxwdHIpLAorICAgICAgICAgICAgICAgICAgICAoTGluZSwgQ29sdW1uLCBTY29wZSwgSW5saW5lZEF0KSkKKworICAvLy8gUmV0dXJuIGEgKHRlbXBvcmFyeSkgY2xvbmUgb2YgdGhpcy4KKyAgVGVtcERJTG9jYXRpb24gY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIHVuc2lnbmVkIGdldExpbmUoKSBjb25zdCB7IHJldHVybiBTdWJjbGFzc0RhdGEzMjsgfQorICB1bnNpZ25lZCBnZXRDb2x1bW4oKSBjb25zdCB7IHJldHVybiBTdWJjbGFzc0RhdGExNjsgfQorICBESUxvY2FsU2NvcGUgKmdldFNjb3BlKCkgY29uc3QgeyByZXR1cm4gY2FzdDxESUxvY2FsU2NvcGU+KGdldFJhd1Njb3BlKCkpOyB9CisKKyAgRElMb2NhdGlvbiAqZ2V0SW5saW5lZEF0KCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8RElMb2NhdGlvbj4oZ2V0UmF3SW5saW5lZEF0KCkpOworICB9CisKKyAgRElGaWxlICpnZXRGaWxlKCkgY29uc3QgeyByZXR1cm4gZ2V0U2NvcGUoKS0+Z2V0RmlsZSgpOyB9CisgIFN0cmluZ1JlZiBnZXRGaWxlbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldFNjb3BlKCktPmdldEZpbGVuYW1lKCk7IH0KKyAgU3RyaW5nUmVmIGdldERpcmVjdG9yeSgpIGNvbnN0IHsgcmV0dXJuIGdldFNjb3BlKCktPmdldERpcmVjdG9yeSgpOyB9CisgIE9wdGlvbmFsPFN0cmluZ1JlZj4gZ2V0U291cmNlKCkgY29uc3QgeyByZXR1cm4gZ2V0U2NvcGUoKS0+Z2V0U291cmNlKCk7IH0KKworICAvLy8gR2V0IHRoZSBzY29wZSB3aGVyZSB0aGlzIGlzIGlubGluZWQuCisgIC8vLworICAvLy8gV2FsayB0aHJvdWdoIFxhIGdldElubGluZWRBdCgpIGFuZCByZXR1cm4gXGEgZ2V0U2NvcGUoKSBmcm9tIHRoZSBkZWVwZXN0CisgIC8vLyBsb2NhdGlvbi4KKyAgRElMb2NhbFNjb3BlICpnZXRJbmxpbmVkQXRTY29wZSgpIGNvbnN0IHsKKyAgICBpZiAoYXV0byAqSUEgPSBnZXRJbmxpbmVkQXQoKSkKKyAgICAgIHJldHVybiBJQS0+Z2V0SW5saW5lZEF0U2NvcGUoKTsKKyAgICByZXR1cm4gZ2V0U2NvcGUoKTsKKyAgfQorCisgIC8vLyBDaGVjayB3aGV0aGVyIHRoaXMgY2FuIGJlIGRpc2NyaW1pbmF0ZWQgZnJvbSBhbm90aGVyIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIENoZWNrIFxjIHRoaXMgY2FuIGJlIGRpc2NyaW1pbmF0ZWQgZnJvbSBcYyBSSFMgaW4gYSBsaW5ldGFibGUgZW50cnkuCisgIC8vLyBTY29wZSBhbmQgaW5saW5lZC1hdCBjaGFpbnMgYXJlIG5vdCByZWNvcmRlZCBpbiB0aGUgbGluZXRhYmxlLCBzbyB0aGV5CisgIC8vLyBjYW5ub3QgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBiYXNpYyBibG9ja3MuCisgIGJvb2wgY2FuRGlzY3JpbWluYXRlKGNvbnN0IERJTG9jYXRpb24gJlJIUykgY29uc3QgeworICAgIHJldHVybiBnZXRMaW5lKCkgIT0gUkhTLmdldExpbmUoKSB8fAorICAgICAgICAgICBnZXRDb2x1bW4oKSAhPSBSSFMuZ2V0Q29sdW1uKCkgfHwKKyAgICAgICAgICAgZ2V0RGlzY3JpbWluYXRvcigpICE9IFJIUy5nZXREaXNjcmltaW5hdG9yKCkgfHwKKyAgICAgICAgICAgZ2V0RmlsZW5hbWUoKSAhPSBSSFMuZ2V0RmlsZW5hbWUoKSB8fAorICAgICAgICAgICBnZXREaXJlY3RvcnkoKSAhPSBSSFMuZ2V0RGlyZWN0b3J5KCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBEV0FSRiBkaXNjcmltaW5hdG9yLgorICAvLy8KKyAgLy8vIERXQVJGIGRpc2NyaW1pbmF0b3JzIGRpc3Rpbmd1aXNoIGlkZW50aWNhbCBmaWxlIGxvY2F0aW9ucyBiZXR3ZWVuCisgIC8vLyBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgb24gZGlmZmVyZW50IGJhc2ljIGJsb2Nrcy4KKyAgLy8vCisgIC8vLyBUaGVyZSBhcmUgMyBjb21wb25lbnRzIHN0b3JlZCBpbiBkaXNjcmltaW5hdG9yLCBmcm9tIGxvd2VyIGJpdHM6CisgIC8vLworICAvLy8gQmFzZSBkaXNjcmltaW5hdG9yOiBhc3NpZ25lZCBieSBBZGREaXNjcmltaW5hdG9ycyBwYXNzIHRvIGlkZW50aWZ5IElScworICAvLy8gICAgICAgICAgICAgICAgICAgICB0aGF0IGFyZSBkZWZpbmVkIGJ5IHRoZSBzYW1lIHNvdXJjZSBsaW5lLCBidXQKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGJhc2ljIGJsb2Nrcy4KKyAgLy8vIER1cGxpY2F0aW9uIGZhY3RvcjogYXNzaWduZWQgYnkgb3B0aW1pemF0aW9ucyB0aGF0IHdpbGwgc2NhbGUgZG93bgorICAvLy8gICAgICAgICAgICAgICAgICAgICB0aGUgZXhlY3V0aW9uIGZyZXF1ZW5jeSBvZiB0aGUgb3JpZ2luYWwgSVIuCisgIC8vLyBDb3B5IElkZW50aWZpZXI6IGFzc2lnbmVkIGJ5IG9wdGltaXphdGlvbnMgdGhhdCBjbG9uZXMgdGhlIElSLgorICAvLy8gICAgICAgICAgICAgICAgICBFYWNoIGNvcHkgb2YgdGhlIElSIHdpbGwgYmUgYXNzaWduZWQgYW4gaWRlbnRpZmllci4KKyAgLy8vCisgIC8vLyBFbmNvZGluZzoKKyAgLy8vCisgIC8vLyBUaGUgYWJvdmUgMyBjb21wb25lbnRzIGFyZSBlbmNvZGVkIGludG8gYSAzMmJpdCB1bnNpZ25lZCBpbnRlZ2VyIGluCisgIC8vLyBvcmRlci4gSWYgdGhlIGxvd2VzdCBiaXQgaXMgMSwgdGhlIGN1cnJlbnQgY29tcG9uZW50IGlzIGVtcHR5LCBhbmQgdGhlCisgIC8vLyBuZXh0IGNvbXBvbmVudCB3aWxsIHN0YXJ0IGluIHRoZSBuZXh0IGJpdC4gT3RoZXJ3aXNlLCB0aGUgY3VycmVudAorICAvLy8gY29tcG9uZW50IGlzIG5vbi1lbXB0eSwgYW5kIGl0cyBjb250ZW50IHN0YXJ0cyBpbiB0aGUgbmV4dCBiaXQuIFRoZQorICAvLy8gbGVuZ3RoIG9mIGVhY2ggY29tcG9uZW50cyBpcyBlaXRoZXIgNSBiaXQgb3IgMTIgYml0OiBpZiB0aGUgN3RoIGJpdAorICAvLy8gaXMgMCwgdGhlIGJpdCAyfjYgKDUgYml0cykgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb21wb25lbnQ7IGlmIHRoZQorICAvLy8gN3RoIGJpdCBpcyAxLCB0aGUgYml0IDJ+NiAoNSBiaXRzKSBhbmQgOH4xNCAoNyBiaXRzKSBhcmUgY29tYmluZWQgdG8KKyAgLy8vIHJlcHJlc2VudCB0aGUgY29tcG9uZW50LgorCisgIGlubGluZSB1bnNpZ25lZCBnZXREaXNjcmltaW5hdG9yKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgYSBuZXcgRElMb2NhdGlvbiB3aXRoIHVwZGF0ZWQgXHAgRGlzY3JpbWluYXRvci4KKyAgaW5saW5lIGNvbnN0IERJTG9jYXRpb24gKmNsb25lV2l0aERpc2NyaW1pbmF0b3IodW5zaWduZWQgRGlzY3JpbWluYXRvcikgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgYSBuZXcgRElMb2NhdGlvbiB3aXRoIHVwZGF0ZWQgYmFzZSBkaXNjcmltaW5hdG9yIFxwIEJELgorICBpbmxpbmUgY29uc3QgRElMb2NhdGlvbiAqc2V0QmFzZURpc2NyaW1pbmF0b3IodW5zaWduZWQgQkQpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBkdXBsaWNhdGlvbiBmYWN0b3Igc3RvcmVkIGluIHRoZSBkaXNjcmltaW5hdG9yLgorICBpbmxpbmUgdW5zaWduZWQgZ2V0RHVwbGljYXRpb25GYWN0b3IoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgY29weSBpZGVudGlmaWVyIHN0b3JlZCBpbiB0aGUgZGlzY3JpbWluYXRvci4KKyAgaW5saW5lIHVuc2lnbmVkIGdldENvcHlJZGVudGlmaWVyKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIGJhc2UgZGlzY3JpbWluYXRvciBzdG9yZWQgaW4gdGhlIGRpc2NyaW1pbmF0b3IuCisgIGlubGluZSB1bnNpZ25lZCBnZXRCYXNlRGlzY3JpbWluYXRvcigpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIGEgbmV3IERJTG9jYXRpb24gd2l0aCBkdXBsaWNhdGlvbiBmYWN0b3IgXHAgREYgZW5jb2RlZCBpbiB0aGUKKyAgLy8vIGRpc2NyaW1pbmF0b3IuCisgIGlubGluZSBjb25zdCBESUxvY2F0aW9uICpjbG9uZVdpdGhEdXBsaWNhdGlvbkZhY3Rvcih1bnNpZ25lZCBERikgY29uc3Q7CisKKyAgLy8vIFdoZW4gdHdvIGluc3RydWN0aW9ucyBhcmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBpbnN0cnVjdGlvbiB3ZSBhbHNvCisgIC8vLyBuZWVkIHRvIGNvbWJpbmUgdGhlIG9yaWdpbmFsIGxvY2F0aW9ucyBpbnRvIGEgc2luZ2xlIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFdoZW4gdGhlIGxvY2F0aW9ucyBhcmUgdGhlIHNhbWUgd2UgY2FuIHVzZSBlaXRoZXIgbG9jYXRpb24uIFdoZW4gdGhleQorICAvLy8gZGlmZmVyLCB3ZSBuZWVkIGEgdGhpcmQgbG9jYXRpb24gd2hpY2ggaXMgZGlzdGluY3QgZnJvbSBlaXRoZXIuIElmCisgIC8vLyB0aGV5IGhhdmUgdGhlIHNhbWUgZmlsZS9saW5lIGJ1dCBoYXZlIGEgZGlmZmVyZW50IGRpc2NyaW1pbmF0b3Igd2UKKyAgLy8vIGNvdWxkIGNyZWF0ZSBhIGxvY2F0aW9uIHdpdGggYSBuZXcgZGlzY3JpbWluYXRvci4gSWYgdGhleSBhcmUgZnJvbQorICAvLy8gZGlmZmVyZW50IGZpbGVzL2xpbmVzIHRoZSBsb2NhdGlvbiBpcyBhbWJpZ3VvdXMgYW5kIGNhbid0IGJlCisgIC8vLyByZXByZXNlbnRlZCBpbiBhIHNpbmdsZSBsaW5lIGVudHJ5LiAgSW4gdGhpcyBjYXNlLCBubyBsb2NhdGlvbgorICAvLy8gc2hvdWxkIGJlIHNldCwgdW5sZXNzIHRoZSBtZXJnZWQgaW5zdHJ1Y3Rpb24gaXMgYSBjYWxsLCB3aGljaCB3ZSB3aWxsCisgIC8vLyBzZXQgdGhlIG1lcmdlZCBkZWJ1ZyBsb2NhdGlvbiBhcyBsaW5lIDAgb2YgdGhlIG5lYXJlc3QgY29tbW9uIHNjb3BlCisgIC8vLyB3aGVyZSAyIGxvY2F0aW9ucyBhcmUgaW5saW5lZCBmcm9tLiBUaGlzIG9ubHkgYXBwbGllcyB0byBJbnN0cnVjdGlvbjsKKyAgLy8vIGZvciBNYWNoaW5lSW5zdHJ1Y3Rpb24sIGFzIGl0IGlzIHBvc3QtaW5saW5lLCB3ZSB3aWxsIHRyZWF0IHRoZSBjYWxsCisgIC8vLyBpbnN0cnVjdGlvbiB0aGUgc2FtZSB3YXkgYXMgb3RoZXIgaW5zdHJ1Y3Rpb25zLgorICAvLy8KKyAgLy8vIFxwIEZvckluc3Q6IFRoZSBJbnN0cnVjdGlvbiB0aGUgbWVyZ2VkIERJTG9jYXRpb24gaXMgZm9yLiBJZiB0aGUKKyAgLy8vIEluc3RydWN0aW9uIGlzIHVuYXZhaWxhYmxlIG9yIG5vbi1leGlzdGVudCwgdXNlIG51bGxwdHIuCisgIHN0YXRpYyBjb25zdCBESUxvY2F0aW9uICoKKyAgZ2V0TWVyZ2VkTG9jYXRpb24oY29uc3QgRElMb2NhdGlvbiAqTG9jQSwgY29uc3QgRElMb2NhdGlvbiAqTG9jQiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkZvckluc3QgPSBudWxscHRyKTsKKworICAvLy8gUmV0dXJucyB0aGUgYmFzZSBkaXNjcmltaW5hdG9yIGZvciBhIGdpdmVuIGVuY29kZWQgZGlzY3JpbWluYXRvciBccCBELgorICBzdGF0aWMgdW5zaWduZWQgZ2V0QmFzZURpc2NyaW1pbmF0b3JGcm9tRGlzY3JpbWluYXRvcih1bnNpZ25lZCBEKSB7CisgICAgaWYgKChEICYgMSkgPT0gMCkKKyAgICAgIHJldHVybiBnZXRVbnNpZ25lZEZyb21QcmVmaXhFbmNvZGluZyhEID4+IDEpOworICAgIGVsc2UKKyAgICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGR1cGxpY2F0aW9uIGZhY3RvciBmb3IgYSBnaXZlbiBlbmNvZGVkIGRpc2NyaW1pbmF0b3IgXHAgRC4KKyAgc3RhdGljIHVuc2lnbmVkIGdldER1cGxpY2F0aW9uRmFjdG9yRnJvbURpc2NyaW1pbmF0b3IodW5zaWduZWQgRCkgeworICAgIEQgPSBnZXROZXh0Q29tcG9uZW50SW5EaXNjcmltaW5hdG9yKEQpOworICAgIGlmIChEID09IDAgfHwgKEQgJiAxKSkKKyAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgIHJldHVybiBnZXRVbnNpZ25lZEZyb21QcmVmaXhFbmNvZGluZyhEID4+IDEpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGNvcHkgaWRlbnRpZmllciBmb3IgYSBnaXZlbiBlbmNvZGVkIGRpc2NyaW1pbmF0b3IgXHAgRC4KKyAgc3RhdGljIHVuc2lnbmVkIGdldENvcHlJZGVudGlmaWVyRnJvbURpc2NyaW1pbmF0b3IodW5zaWduZWQgRCkgeworICAgIHJldHVybiBnZXRVbnNpZ25lZEZyb21QcmVmaXhFbmNvZGluZyhnZXROZXh0Q29tcG9uZW50SW5EaXNjcmltaW5hdG9yKAorICAgICAgICBnZXROZXh0Q29tcG9uZW50SW5EaXNjcmltaW5hdG9yKEQpKSk7CisgIH0KKworCisgIE1ldGFkYXRhICpnZXRSYXdTY29wZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKyAgTWV0YWRhdGEgKmdldFJhd0lubGluZWRBdCgpIGNvbnN0IHsKKyAgICBpZiAoZ2V0TnVtT3BlcmFuZHMoKSA9PSAyKQorICAgICAgcmV0dXJuIGdldE9wZXJhbmQoMSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJTG9jYXRpb25LaW5kOworICB9Cit9OworCisvLy8gU3VicHJvZ3JhbSBkZXNjcmlwdGlvbi4KKy8vLworLy8vIFRPRE86IFJlbW92ZSBEaXNwbGF5TmFtZS4gIEl0J3MgYWx3YXlzIGVxdWFsIHRvIE5hbWUuCisvLy8gVE9ETzogU3BsaXQgdXAgZmxhZ3MuCitjbGFzcyBESVN1YnByb2dyYW0gOiBwdWJsaWMgRElMb2NhbFNjb3BlIHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIE1ETm9kZTsKKworICB1bnNpZ25lZCBMaW5lOworICB1bnNpZ25lZCBTY29wZUxpbmU7CisgIHVuc2lnbmVkIFZpcnR1YWxJbmRleDsKKworICAvLy8gSW4gdGhlIE1TIEFCSSwgdGhlIGltcGxpY2l0ICd0aGlzJyBwYXJhbWV0ZXIgaXMgYWRqdXN0ZWQgaW4gdGhlIHByb2xvZ3VlCisgIC8vLyBvZiBtZXRob2Qgb3ZlcnJpZGVzIGZyb20gc2Vjb25kYXJ5IGJhc2VzIGJ5IHRoaXMgYW1vdW50LiBJdCBtYXkgYmUKKyAgLy8vIG5lZ2F0aXZlLgorICBpbnQgVGhpc0FkanVzdG1lbnQ7CisKKyAgLy8gVmlydHVhbGl0eSBjYW4gb25seSBhc3N1bWUgdGhyZWUgdmFsdWVzLCBzbyB3ZSBjYW4gcGFjaworICAvLyBpbiAyIGJpdHMgKG5vbmUvcHVyZS9wdXJlX3ZpcnR1YWwpLgorICB1bnNpZ25lZCBWaXJ0dWFsaXR5IDogMjsKKworICAvLyBUaGVzZSBhcmUgYm9vbGVhbiBmbGFncyBzbyBvbmUgYml0IGlzIGVub3VnaC4KKyAgLy8gTVNWQyBzdGFydHMgYSBuZXcgY29udGFpbmVyIGZpZWxkIGV2ZXJ5IHRpbWUgdGhlIGJhc2UKKyAgLy8gdHlwZSBjaGFuZ2VzIHNvIHdlIGNhbid0IHVzZSAnYm9vbCcgdG8gZW5zdXJlIHRoZXNlIGJpdHMKKyAgLy8gYXJlIHBhY2tlZC4KKyAgdW5zaWduZWQgSXNMb2NhbFRvVW5pdCA6IDE7CisgIHVuc2lnbmVkIElzRGVmaW5pdGlvbiA6IDE7CisgIHVuc2lnbmVkIElzT3B0aW1pemVkIDogMTsKKworICB1bnNpZ25lZCBQYWRkaW5nIDogMzsKKworICBESUZsYWdzIEZsYWdzOworCisgIERJU3VicHJvZ3JhbShMTFZNQ29udGV4dCAmQywgU3RvcmFnZVR5cGUgU3RvcmFnZSwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIFNjb3BlTGluZSwgdW5zaWduZWQgVmlydHVhbGl0eSwgdW5zaWduZWQgVmlydHVhbEluZGV4LAorICAgICAgICAgICAgICAgaW50IFRoaXNBZGp1c3RtZW50LCBESUZsYWdzIEZsYWdzLCBib29sIElzTG9jYWxUb1VuaXQsCisgICAgICAgICAgICAgICBib29sIElzRGVmaW5pdGlvbiwgYm9vbCBJc09wdGltaXplZCwgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESUxvY2FsU2NvcGUoQywgRElTdWJwcm9ncmFtS2luZCwgU3RvcmFnZSwgZHdhcmY6OkRXX1RBR19zdWJwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgT3BzKSwKKyAgICAgICAgTGluZShMaW5lKSwgU2NvcGVMaW5lKFNjb3BlTGluZSksIFZpcnR1YWxJbmRleChWaXJ0dWFsSW5kZXgpLAorICAgICAgICBUaGlzQWRqdXN0bWVudChUaGlzQWRqdXN0bWVudCksIFZpcnR1YWxpdHkoVmlydHVhbGl0eSksCisgICAgICAgIElzTG9jYWxUb1VuaXQoSXNMb2NhbFRvVW5pdCksIElzRGVmaW5pdGlvbihJc0RlZmluaXRpb24pLAorICAgICAgICBJc09wdGltaXplZChJc09wdGltaXplZCksIEZsYWdzKEZsYWdzKSB7CisgICAgc3RhdGljX2Fzc2VydChkd2FyZjo6RFdfVklSVFVBTElUWV9tYXggPCA0LCAiVmlydHVhbGl0eSBvdXQgb2YgcmFuZ2UiKTsKKyAgICBhc3NlcnQoVmlydHVhbGl0eSA8IDQgJiYgIlZpcnR1YWxpdHkgb3V0IG9mIHJhbmdlIik7CisgIH0KKyAgfkRJU3VicHJvZ3JhbSgpID0gZGVmYXVsdDsKKworICBzdGF0aWMgRElTdWJwcm9ncmFtICoKKyAgZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgRElTY29wZVJlZiBTY29wZSwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgU3RyaW5nUmVmIExpbmthZ2VOYW1lLCBESUZpbGUgKkZpbGUsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgRElTdWJyb3V0aW5lVHlwZSAqVHlwZSwgYm9vbCBJc0xvY2FsVG9Vbml0LCBib29sIElzRGVmaW5pdGlvbiwKKyAgICAgICAgICB1bnNpZ25lZCBTY29wZUxpbmUsIERJVHlwZVJlZiBDb250YWluaW5nVHlwZSwgdW5zaWduZWQgVmlydHVhbGl0eSwKKyAgICAgICAgICB1bnNpZ25lZCBWaXJ0dWFsSW5kZXgsIGludCBUaGlzQWRqdXN0bWVudCwgRElGbGFncyBGbGFncywKKyAgICAgICAgICBib29sIElzT3B0aW1pemVkLCBESUNvbXBpbGVVbml0ICpVbml0LAorICAgICAgICAgIERJVGVtcGxhdGVQYXJhbWV0ZXJBcnJheSBUZW1wbGF0ZVBhcmFtcywgRElTdWJwcm9ncmFtICpEZWNsYXJhdGlvbiwKKyAgICAgICAgICBESUxvY2FsVmFyaWFibGVBcnJheSBWYXJpYWJsZXMsIERJVHlwZUFycmF5IFRocm93blR5cGVzLAorICAgICAgICAgIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSkgeworICAgIHJldHVybiBnZXRJbXBsKENvbnRleHQsIFNjb3BlLCBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBOYW1lKSwKKyAgICAgICAgICAgICAgICAgICBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBMaW5rYWdlTmFtZSksIEZpbGUsIExpbmUsIFR5cGUsCisgICAgICAgICAgICAgICAgICAgSXNMb2NhbFRvVW5pdCwgSXNEZWZpbml0aW9uLCBTY29wZUxpbmUsIENvbnRhaW5pbmdUeXBlLAorICAgICAgICAgICAgICAgICAgIFZpcnR1YWxpdHksIFZpcnR1YWxJbmRleCwgVGhpc0FkanVzdG1lbnQsIEZsYWdzLCBJc09wdGltaXplZCwKKyAgICAgICAgICAgICAgICAgICBVbml0LCBUZW1wbGF0ZVBhcmFtcy5nZXQoKSwgRGVjbGFyYXRpb24sIFZhcmlhYmxlcy5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICBUaHJvd25UeXBlcy5nZXQoKSwgU3RvcmFnZSwgU2hvdWxkQ3JlYXRlKTsKKyAgfQorICBzdGF0aWMgRElTdWJwcm9ncmFtICoKKyAgZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgTWV0YWRhdGEgKlNjb3BlLCBNRFN0cmluZyAqTmFtZSwKKyAgICAgICAgICBNRFN0cmluZyAqTGlua2FnZU5hbWUsIE1ldGFkYXRhICpGaWxlLCB1bnNpZ25lZCBMaW5lLCBNZXRhZGF0YSAqVHlwZSwKKyAgICAgICAgICBib29sIElzTG9jYWxUb1VuaXQsIGJvb2wgSXNEZWZpbml0aW9uLCB1bnNpZ25lZCBTY29wZUxpbmUsCisgICAgICAgICAgTWV0YWRhdGEgKkNvbnRhaW5pbmdUeXBlLCB1bnNpZ25lZCBWaXJ0dWFsaXR5LCB1bnNpZ25lZCBWaXJ0dWFsSW5kZXgsCisgICAgICAgICAgaW50IFRoaXNBZGp1c3RtZW50LCBESUZsYWdzIEZsYWdzLCBib29sIElzT3B0aW1pemVkLCBNZXRhZGF0YSAqVW5pdCwKKyAgICAgICAgICBNZXRhZGF0YSAqVGVtcGxhdGVQYXJhbXMsIE1ldGFkYXRhICpEZWNsYXJhdGlvbiwgTWV0YWRhdGEgKlZhcmlhYmxlcywKKyAgICAgICAgICBNZXRhZGF0YSAqVGhyb3duVHlwZXMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSk7CisKKyAgVGVtcERJU3VicHJvZ3JhbSBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksIGdldFNjb3BlKCksIGdldE5hbWUoKSwgZ2V0TGlua2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpbGUoKSwgZ2V0TGluZSgpLCBnZXRUeXBlKCksIGlzTG9jYWxUb1VuaXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzRGVmaW5pdGlvbigpLCBnZXRTY29wZUxpbmUoKSwgZ2V0Q29udGFpbmluZ1R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFZpcnR1YWxpdHkoKSwgZ2V0VmlydHVhbEluZGV4KCksIGdldFRoaXNBZGp1c3RtZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRGbGFncygpLCBpc09wdGltaXplZCgpLCBnZXRVbml0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRUZW1wbGF0ZVBhcmFtcygpLCBnZXREZWNsYXJhdGlvbigpLCBnZXRWYXJpYWJsZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFRocm93blR5cGVzKCkpOworICB9CisKK3B1YmxpYzoKKyAgREVGSU5FX01ETk9ERV9HRVQoRElTdWJwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAoRElTY29wZVJlZiBTY29wZSwgU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBMaW5rYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZSwgRElTdWJyb3V0aW5lVHlwZSAqVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNMb2NhbFRvVW5pdCwgYm9vbCBJc0RlZmluaXRpb24sIHVuc2lnbmVkIFNjb3BlTGluZSwKKyAgICAgICAgICAgICAgICAgICAgIERJVHlwZVJlZiBDb250YWluaW5nVHlwZSwgdW5zaWduZWQgVmlydHVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZpcnR1YWxJbmRleCwgaW50IFRoaXNBZGp1c3RtZW50LCBESUZsYWdzIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc09wdGltaXplZCwgRElDb21waWxlVW5pdCAqVW5pdCwKKyAgICAgICAgICAgICAgICAgICAgIERJVGVtcGxhdGVQYXJhbWV0ZXJBcnJheSBUZW1wbGF0ZVBhcmFtcyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICBESVN1YnByb2dyYW0gKkRlY2xhcmF0aW9uID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgIERJTG9jYWxWYXJpYWJsZUFycmF5IFZhcmlhYmxlcyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICBESVR5cGVBcnJheSBUaHJvd25UeXBlcyA9IG51bGxwdHIpLAorICAgICAgICAgICAgICAgICAgICAoU2NvcGUsIE5hbWUsIExpbmthZ2VOYW1lLCBGaWxlLCBMaW5lLCBUeXBlLCBJc0xvY2FsVG9Vbml0LAorICAgICAgICAgICAgICAgICAgICAgSXNEZWZpbml0aW9uLCBTY29wZUxpbmUsIENvbnRhaW5pbmdUeXBlLCBWaXJ0dWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgVmlydHVhbEluZGV4LCBUaGlzQWRqdXN0bWVudCwgRmxhZ3MsIElzT3B0aW1pemVkLCBVbml0LAorICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbXMsIERlY2xhcmF0aW9uLCBWYXJpYWJsZXMsIFRocm93blR5cGVzKSkKKyAgREVGSU5FX01ETk9ERV9HRVQoCisgICAgICBESVN1YnByb2dyYW0sCisgICAgICAoTWV0YWRhdGEgKiBTY29wZSwgTURTdHJpbmcgKk5hbWUsIE1EU3RyaW5nICpMaW5rYWdlTmFtZSwgTWV0YWRhdGEgKkZpbGUsCisgICAgICAgdW5zaWduZWQgTGluZSwgTWV0YWRhdGEgKlR5cGUsIGJvb2wgSXNMb2NhbFRvVW5pdCwgYm9vbCBJc0RlZmluaXRpb24sCisgICAgICAgdW5zaWduZWQgU2NvcGVMaW5lLCBNZXRhZGF0YSAqQ29udGFpbmluZ1R5cGUsIHVuc2lnbmVkIFZpcnR1YWxpdHksCisgICAgICAgdW5zaWduZWQgVmlydHVhbEluZGV4LCBpbnQgVGhpc0FkanVzdG1lbnQsIERJRmxhZ3MgRmxhZ3MsCisgICAgICAgYm9vbCBJc09wdGltaXplZCwgTWV0YWRhdGEgKlVuaXQsIE1ldGFkYXRhICpUZW1wbGF0ZVBhcmFtcyA9IG51bGxwdHIsCisgICAgICAgTWV0YWRhdGEgKkRlY2xhcmF0aW9uID0gbnVsbHB0ciwgTWV0YWRhdGEgKlZhcmlhYmxlcyA9IG51bGxwdHIsCisgICAgICAgTWV0YWRhdGEgKlRocm93blR5cGVzID0gbnVsbHB0ciksCisgICAgICAoU2NvcGUsIE5hbWUsIExpbmthZ2VOYW1lLCBGaWxlLCBMaW5lLCBUeXBlLCBJc0xvY2FsVG9Vbml0LCBJc0RlZmluaXRpb24sCisgICAgICAgU2NvcGVMaW5lLCBDb250YWluaW5nVHlwZSwgVmlydHVhbGl0eSwgVmlydHVhbEluZGV4LCBUaGlzQWRqdXN0bWVudCwKKyAgICAgICBGbGFncywgSXNPcHRpbWl6ZWQsIFVuaXQsIFRlbXBsYXRlUGFyYW1zLCBEZWNsYXJhdGlvbiwgVmFyaWFibGVzLAorICAgICAgIFRocm93blR5cGVzKSkKKworICBUZW1wRElTdWJwcm9ncmFtIGNsb25lKCkgY29uc3QgeyByZXR1cm4gY2xvbmVJbXBsKCk7IH0KKworcHVibGljOgorICB1bnNpZ25lZCBnZXRMaW5lKCkgY29uc3QgeyByZXR1cm4gTGluZTsgfQorICB1bnNpZ25lZCBnZXRWaXJ0dWFsaXR5KCkgY29uc3QgeyByZXR1cm4gVmlydHVhbGl0eTsgfQorICB1bnNpZ25lZCBnZXRWaXJ0dWFsSW5kZXgoKSBjb25zdCB7IHJldHVybiBWaXJ0dWFsSW5kZXg7IH0KKyAgaW50IGdldFRoaXNBZGp1c3RtZW50KCkgY29uc3QgeyByZXR1cm4gVGhpc0FkanVzdG1lbnQ7IH0KKyAgdW5zaWduZWQgZ2V0U2NvcGVMaW5lKCkgY29uc3QgeyByZXR1cm4gU2NvcGVMaW5lOyB9CisgIERJRmxhZ3MgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBGbGFnczsgfQorICBib29sIGlzTG9jYWxUb1VuaXQoKSBjb25zdCB7IHJldHVybiBJc0xvY2FsVG9Vbml0OyB9CisgIGJvb2wgaXNEZWZpbml0aW9uKCkgY29uc3QgeyByZXR1cm4gSXNEZWZpbml0aW9uOyB9CisgIGJvb2wgaXNPcHRpbWl6ZWQoKSBjb25zdCB7IHJldHVybiBJc09wdGltaXplZDsgfQorCisgIGJvb2wgaXNBcnRpZmljaWFsKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdBcnRpZmljaWFsOyB9CisgIGJvb2wgaXNQcml2YXRlKCkgY29uc3QgeworICAgIHJldHVybiAoZ2V0RmxhZ3MoKSAmIEZsYWdBY2Nlc3NpYmlsaXR5KSA9PSBGbGFnUHJpdmF0ZTsKKyAgfQorICBib29sIGlzUHJvdGVjdGVkKCkgY29uc3QgeworICAgIHJldHVybiAoZ2V0RmxhZ3MoKSAmIEZsYWdBY2Nlc3NpYmlsaXR5KSA9PSBGbGFnUHJvdGVjdGVkOworICB9CisgIGJvb2wgaXNQdWJsaWMoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRGbGFncygpICYgRmxhZ0FjY2Vzc2liaWxpdHkpID09IEZsYWdQdWJsaWM7CisgIH0KKyAgYm9vbCBpc0V4cGxpY2l0KCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdFeHBsaWNpdDsgfQorICBib29sIGlzUHJvdG90eXBlZCgpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWdzKCkgJiBGbGFnUHJvdG90eXBlZDsgfQorICBib29sIGlzTWFpblN1YnByb2dyYW0oKSBjb25zdCB7IHJldHVybiBnZXRGbGFncygpICYgRmxhZ01haW5TdWJwcm9ncmFtOyB9CisKKyAgLy8vIENoZWNrIGlmIHRoaXMgaXMgcmVmZXJlbmNlLXF1YWxpZmllZC4KKyAgLy8vCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHN1YnByb2dyYW0gaXMgYSBDKysxMSByZWZlcmVuY2UtcXVhbGlmaWVkIG5vbi1zdGF0aWMKKyAgLy8vIG1lbWJlciBmdW5jdGlvbiAodm9pZCBmb28oKSAmKS4KKyAgYm9vbCBpc0xWYWx1ZVJlZmVyZW5jZSgpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWdzKCkgJiBGbGFnTFZhbHVlUmVmZXJlbmNlOyB9CisKKyAgLy8vIENoZWNrIGlmIHRoaXMgaXMgcnZhbHVlLXJlZmVyZW5jZS1xdWFsaWZpZWQuCisgIC8vLworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBzdWJwcm9ncmFtIGlzIGEgQysrMTEgcnZhbHVlLXJlZmVyZW5jZS1xdWFsaWZpZWQKKyAgLy8vIG5vbi1zdGF0aWMgbWVtYmVyIGZ1bmN0aW9uICh2b2lkIGZvbygpICYmKS4KKyAgYm9vbCBpc1JWYWx1ZVJlZmVyZW5jZSgpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWdzKCkgJiBGbGFnUlZhbHVlUmVmZXJlbmNlOyB9CisKKyAgLy8vIENoZWNrIGlmIHRoaXMgaXMgbWFya2VkIGFzIG5vcmV0dXJuLgorICAvLy8KKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgc3VicHJvZ3JhbSBpcyBDKysxMSBub3JldHVybiBvciBDMTEgX05vcmV0dXJuCisgIGJvb2wgaXNOb1JldHVybigpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWdzKCkgJiBGbGFnTm9SZXR1cm47IH0KKworICBESVNjb3BlUmVmIGdldFNjb3BlKCkgY29uc3QgeyByZXR1cm4gRElTY29wZVJlZihnZXRSYXdTY29wZSgpKTsgfQorCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCgyKTsgfQorICBTdHJpbmdSZWYgZ2V0TGlua2FnZU5hbWUoKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmdPcGVyYW5kKDMpOyB9CisKKyAgRElTdWJyb3V0aW5lVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPERJU3Vicm91dGluZVR5cGU+KGdldFJhd1R5cGUoKSk7CisgIH0KKyAgRElUeXBlUmVmIGdldENvbnRhaW5pbmdUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBESVR5cGVSZWYoZ2V0UmF3Q29udGFpbmluZ1R5cGUoKSk7CisgIH0KKworICBESUNvbXBpbGVVbml0ICpnZXRVbml0KCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8RElDb21waWxlVW5pdD4oZ2V0UmF3VW5pdCgpKTsKKyAgfQorICB2b2lkIHJlcGxhY2VVbml0KERJQ29tcGlsZVVuaXQgKkNVKSB7IHJlcGxhY2VPcGVyYW5kV2l0aCg1LCBDVSk7IH0KKyAgRElUZW1wbGF0ZVBhcmFtZXRlckFycmF5IGdldFRlbXBsYXRlUGFyYW1zKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8TURUdXBsZT4oZ2V0UmF3VGVtcGxhdGVQYXJhbXMoKSk7CisgIH0KKyAgRElTdWJwcm9ncmFtICpnZXREZWNsYXJhdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPERJU3VicHJvZ3JhbT4oZ2V0UmF3RGVjbGFyYXRpb24oKSk7CisgIH0KKyAgRElMb2NhbFZhcmlhYmxlQXJyYXkgZ2V0VmFyaWFibGVzKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8TURUdXBsZT4oZ2V0UmF3VmFyaWFibGVzKCkpOworICB9CisgIERJVHlwZUFycmF5IGdldFRocm93blR5cGVzKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8TURUdXBsZT4oZ2V0UmF3VGhyb3duVHlwZXMoKSk7CisgIH0KKworICBNZXRhZGF0YSAqZ2V0UmF3U2NvcGUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDEpOyB9CisgIE1EU3RyaW5nICpnZXRSYXdOYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPigyKTsgfQorICBNRFN0cmluZyAqZ2V0UmF3TGlua2FnZU5hbWUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KDMpOyB9CisgIE1ldGFkYXRhICpnZXRSYXdUeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCg0KTsgfQorICBNZXRhZGF0YSAqZ2V0UmF3VW5pdCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoNSk7IH0KKyAgTWV0YWRhdGEgKmdldFJhd0RlY2xhcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCg2KTsgfQorICBNZXRhZGF0YSAqZ2V0UmF3VmFyaWFibGVzKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCg3KTsgfQorICBNZXRhZGF0YSAqZ2V0UmF3Q29udGFpbmluZ1R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE51bU9wZXJhbmRzKCkgPiA4ID8gZ2V0T3BlcmFuZEFzPE1ldGFkYXRhPig4KSA6IG51bGxwdHI7CisgIH0KKyAgTWV0YWRhdGEgKmdldFJhd1RlbXBsYXRlUGFyYW1zKCkgY29uc3QgeworICAgIHJldHVybiBnZXROdW1PcGVyYW5kcygpID4gOSA/IGdldE9wZXJhbmRBczxNZXRhZGF0YT4oOSkgOiBudWxscHRyOworICB9CisgIE1ldGFkYXRhICpnZXRSYXdUaHJvd25UeXBlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSA+IDEwID8gZ2V0T3BlcmFuZEFzPE1ldGFkYXRhPigxMCkgOiBudWxscHRyOworICB9CisKKyAgLy8vIENoZWNrIGlmIHRoaXMgc3VicHJvZ3JhbSBkZXNjcmliZXMgdGhlIGdpdmVuIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIEZJWE1FOiBTaG91bGQgdGhpcyBiZSBsb29raW5nIHRocm91Z2ggYml0Y2FzdHM/CisgIGJvb2wgZGVzY3JpYmVzKGNvbnN0IEZ1bmN0aW9uICpGKSBjb25zdDsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJU3VicHJvZ3JhbUtpbmQ7CisgIH0KK307CisKK2NsYXNzIERJTGV4aWNhbEJsb2NrQmFzZSA6IHB1YmxpYyBESUxvY2FsU2NvcGUgeworcHJvdGVjdGVkOgorICBESUxleGljYWxCbG9ja0Jhc2UoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIElELCBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESUxvY2FsU2NvcGUoQywgSUQsIFN0b3JhZ2UsIGR3YXJmOjpEV19UQUdfbGV4aWNhbF9ibG9jaywgT3BzKSB7fQorICB+RElMZXhpY2FsQmxvY2tCYXNlKCkgPSBkZWZhdWx0OworCitwdWJsaWM6CisgIERJTG9jYWxTY29wZSAqZ2V0U2NvcGUoKSBjb25zdCB7IHJldHVybiBjYXN0PERJTG9jYWxTY29wZT4oZ2V0UmF3U2NvcGUoKSk7IH0KKworICBNZXRhZGF0YSAqZ2V0UmF3U2NvcGUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDEpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESUxleGljYWxCbG9ja0tpbmQgfHwKKyAgICAgICAgICAgTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESUxleGljYWxCbG9ja0ZpbGVLaW5kOworICB9Cit9OworCitjbGFzcyBESUxleGljYWxCbG9jayA6IHB1YmxpYyBESUxleGljYWxCbG9ja0Jhc2UgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIHVuc2lnbmVkIExpbmU7CisgIHVpbnQxNl90IENvbHVtbjsKKworICBESUxleGljYWxCbG9jayhMTFZNQ29udGV4dCAmQywgU3RvcmFnZVR5cGUgU3RvcmFnZSwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sdW1uLCBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJTGV4aWNhbEJsb2NrQmFzZShDLCBESUxleGljYWxCbG9ja0tpbmQsIFN0b3JhZ2UsIE9wcyksIExpbmUoTGluZSksCisgICAgICAgIENvbHVtbihDb2x1bW4pIHsKKyAgICBhc3NlcnQoQ29sdW1uIDwgKDF1IDw8IDE2KSAmJiAiRXhwZWN0ZWQgMTYtYml0IGNvbHVtbiIpOworICB9CisgIH5ESUxleGljYWxCbG9jaygpID0gZGVmYXVsdDsKKworICBzdGF0aWMgRElMZXhpY2FsQmxvY2sgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIERJTG9jYWxTY29wZSAqU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZpbGUgKkZpbGUsIHVuc2lnbmVkIExpbmUsIHVuc2lnbmVkIENvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpIHsKKyAgICByZXR1cm4gZ2V0SW1wbChDb250ZXh0LCBzdGF0aWNfY2FzdDxNZXRhZGF0YSAqPihTY29wZSksCisgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWV0YWRhdGEgKj4oRmlsZSksIExpbmUsIENvbHVtbiwgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICBTaG91bGRDcmVhdGUpOworICB9CisKKyAgc3RhdGljIERJTGV4aWNhbEJsb2NrICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCBNZXRhZGF0YSAqU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSAqRmlsZSwgdW5zaWduZWQgTGluZSwgdW5zaWduZWQgQ29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElMZXhpY2FsQmxvY2sgY2xvbmVJbXBsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUZW1wb3JhcnkoZ2V0Q29udGV4dCgpLCBnZXRTY29wZSgpLCBnZXRGaWxlKCksIGdldExpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbHVtbigpKTsKKyAgfQorCitwdWJsaWM6CisgIERFRklORV9NRE5PREVfR0VUKERJTGV4aWNhbEJsb2NrLCAoRElMb2NhbFNjb3BlICogU2NvcGUsIERJRmlsZSAqRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lLCB1bnNpZ25lZCBDb2x1bW4pLAorICAgICAgICAgICAgICAgICAgICAoU2NvcGUsIEZpbGUsIExpbmUsIENvbHVtbikpCisgIERFRklORV9NRE5PREVfR0VUKERJTGV4aWNhbEJsb2NrLCAoTWV0YWRhdGEgKiBTY29wZSwgTWV0YWRhdGEgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZSwgdW5zaWduZWQgQ29sdW1uKSwKKyAgICAgICAgICAgICAgICAgICAgKFNjb3BlLCBGaWxlLCBMaW5lLCBDb2x1bW4pKQorCisgIFRlbXBESUxleGljYWxCbG9jayBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIGNsb25lSW1wbCgpOyB9CisKKyAgdW5zaWduZWQgZ2V0TGluZSgpIGNvbnN0IHsgcmV0dXJuIExpbmU7IH0KKyAgdW5zaWduZWQgZ2V0Q29sdW1uKCkgY29uc3QgeyByZXR1cm4gQ29sdW1uOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESUxleGljYWxCbG9ja0tpbmQ7CisgIH0KK307CisKK2NsYXNzIERJTGV4aWNhbEJsb2NrRmlsZSA6IHB1YmxpYyBESUxleGljYWxCbG9ja0Jhc2UgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIHVuc2lnbmVkIERpc2NyaW1pbmF0b3I7CisKKyAgRElMZXhpY2FsQmxvY2tGaWxlKExMVk1Db250ZXh0ICZDLCBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGlzY3JpbWluYXRvciwgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESUxleGljYWxCbG9ja0Jhc2UoQywgRElMZXhpY2FsQmxvY2tGaWxlS2luZCwgU3RvcmFnZSwgT3BzKSwKKyAgICAgICAgRGlzY3JpbWluYXRvcihEaXNjcmltaW5hdG9yKSB7fQorICB+RElMZXhpY2FsQmxvY2tGaWxlKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBESUxleGljYWxCbG9ja0ZpbGUgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIERJTG9jYWxTY29wZSAqU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBEaXNjcmltaW5hdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKSB7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgc3RhdGljX2Nhc3Q8TWV0YWRhdGEgKj4oU2NvcGUpLAorICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE1ldGFkYXRhICo+KEZpbGUpLCBEaXNjcmltaW5hdG9yLCBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgIFNob3VsZENyZWF0ZSk7CisgIH0KKworICBzdGF0aWMgRElMZXhpY2FsQmxvY2tGaWxlICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCBNZXRhZGF0YSAqU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgKkZpbGUsIHVuc2lnbmVkIERpc2NyaW1pbmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworCisgIFRlbXBESUxleGljYWxCbG9ja0ZpbGUgY2xvbmVJbXBsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUZW1wb3JhcnkoZ2V0Q29udGV4dCgpLCBnZXRTY29wZSgpLCBnZXRGaWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXREaXNjcmltaW5hdG9yKCkpOworICB9CisKK3B1YmxpYzoKKyAgREVGSU5FX01ETk9ERV9HRVQoRElMZXhpY2FsQmxvY2tGaWxlLCAoRElMb2NhbFNjb3BlICogU2NvcGUsIERJRmlsZSAqRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGlzY3JpbWluYXRvciksCisgICAgICAgICAgICAgICAgICAgIChTY29wZSwgRmlsZSwgRGlzY3JpbWluYXRvcikpCisgIERFRklORV9NRE5PREVfR0VUKERJTGV4aWNhbEJsb2NrRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgKE1ldGFkYXRhICogU2NvcGUsIE1ldGFkYXRhICpGaWxlLCB1bnNpZ25lZCBEaXNjcmltaW5hdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgKFNjb3BlLCBGaWxlLCBEaXNjcmltaW5hdG9yKSkKKworICBUZW1wRElMZXhpY2FsQmxvY2tGaWxlIGNsb25lKCkgY29uc3QgeyByZXR1cm4gY2xvbmVJbXBsKCk7IH0KKworICAvLyBUT0RPOiBSZW1vdmUgdGhlc2Ugb25jZSB0aGV5J3JlIGdvbmUgZnJvbSBESUxleGljYWxCbG9ja0Jhc2UuCisgIHVuc2lnbmVkIGdldExpbmUoKSBjb25zdCA9IGRlbGV0ZTsKKyAgdW5zaWduZWQgZ2V0Q29sdW1uKCkgY29uc3QgPSBkZWxldGU7CisKKyAgdW5zaWduZWQgZ2V0RGlzY3JpbWluYXRvcigpIGNvbnN0IHsgcmV0dXJuIERpc2NyaW1pbmF0b3I7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJTGV4aWNhbEJsb2NrRmlsZUtpbmQ7CisgIH0KK307CisKK3Vuc2lnbmVkIERJTG9jYXRpb246OmdldERpc2NyaW1pbmF0b3IoKSBjb25zdCB7CisgIGlmIChhdXRvICpGID0gZHluX2Nhc3Q8RElMZXhpY2FsQmxvY2tGaWxlPihnZXRTY29wZSgpKSkKKyAgICByZXR1cm4gRi0+Z2V0RGlzY3JpbWluYXRvcigpOworICByZXR1cm4gMDsKK30KKworY29uc3QgRElMb2NhdGlvbiAqCitESUxvY2F0aW9uOjpjbG9uZVdpdGhEaXNjcmltaW5hdG9yKHVuc2lnbmVkIERpc2NyaW1pbmF0b3IpIGNvbnN0IHsKKyAgRElTY29wZSAqU2NvcGUgPSBnZXRTY29wZSgpOworICAvLyBTa2lwIGFsbCBwYXJlbnQgRElMZXhpY2FsQmxvY2tGaWxlIHRoYXQgYWxyZWFkeSBoYXZlIGEgZGlzY3JpbWluYXRvcgorICAvLyBhc3NpZ25lZC4gV2UgZG8gbm90IHdhbnQgdG8gaGF2ZSBuZXN0ZWQgRElMZXhpY2FsQmxvY2tGaWxlcyB0aGF0IGhhdmUKKyAgLy8gbXV0bGlwbGUgZGlzY3JpbWluYXRvcnMgYmVjYXVzZSBvbmx5IHRoZSBsZWFmIERJTGV4aWNhbEJsb2NrRmlsZSdzCisgIC8vIGRvbWluYXRvciB3aWxsIGJlIHVzZWQuCisgIGZvciAoYXV0byAqTEJGID0gZHluX2Nhc3Q8RElMZXhpY2FsQmxvY2tGaWxlPihTY29wZSk7CisgICAgICAgTEJGICYmIExCRi0+Z2V0RGlzY3JpbWluYXRvcigpICE9IDA7CisgICAgICAgTEJGID0gZHluX2Nhc3Q8RElMZXhpY2FsQmxvY2tGaWxlPihTY29wZSkpCisgICAgU2NvcGUgPSBMQkYtPmdldFNjb3BlKCk7CisgIERJTGV4aWNhbEJsb2NrRmlsZSAqTmV3U2NvcGUgPQorICAgICAgRElMZXhpY2FsQmxvY2tGaWxlOjpnZXQoZ2V0Q29udGV4dCgpLCBTY29wZSwgZ2V0RmlsZSgpLCBEaXNjcmltaW5hdG9yKTsKKyAgcmV0dXJuIERJTG9jYXRpb246OmdldChnZXRDb250ZXh0KCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCksIE5ld1Njb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldElubGluZWRBdCgpKTsKK30KKwordW5zaWduZWQgRElMb2NhdGlvbjo6Z2V0QmFzZURpc2NyaW1pbmF0b3IoKSBjb25zdCB7CisgIHJldHVybiBnZXRCYXNlRGlzY3JpbWluYXRvckZyb21EaXNjcmltaW5hdG9yKGdldERpc2NyaW1pbmF0b3IoKSk7Cit9CisKK3Vuc2lnbmVkIERJTG9jYXRpb246OmdldER1cGxpY2F0aW9uRmFjdG9yKCkgY29uc3QgeworICByZXR1cm4gZ2V0RHVwbGljYXRpb25GYWN0b3JGcm9tRGlzY3JpbWluYXRvcihnZXREaXNjcmltaW5hdG9yKCkpOworfQorCit1bnNpZ25lZCBESUxvY2F0aW9uOjpnZXRDb3B5SWRlbnRpZmllcigpIGNvbnN0IHsKKyAgcmV0dXJuIGdldENvcHlJZGVudGlmaWVyRnJvbURpc2NyaW1pbmF0b3IoZ2V0RGlzY3JpbWluYXRvcigpKTsKK30KKworY29uc3QgRElMb2NhdGlvbiAqRElMb2NhdGlvbjo6c2V0QmFzZURpc2NyaW1pbmF0b3IodW5zaWduZWQgRCkgY29uc3QgeworICBpZiAoRCA9PSAwKQorICAgIHJldHVybiB0aGlzOworICBlbHNlCisgICAgcmV0dXJuIGNsb25lV2l0aERpc2NyaW1pbmF0b3IoZ2V0UHJlZml4RW5jb2RpbmdGcm9tVW5zaWduZWQoRCkgPDwgMSk7Cit9CisKK2NvbnN0IERJTG9jYXRpb24gKkRJTG9jYXRpb246OmNsb25lV2l0aER1cGxpY2F0aW9uRmFjdG9yKHVuc2lnbmVkIERGKSBjb25zdCB7CisgIERGICo9IGdldER1cGxpY2F0aW9uRmFjdG9yKCk7CisgIGlmIChERiA8PSAxKQorICAgIHJldHVybiB0aGlzOworCisgIHVuc2lnbmVkIEJEID0gZ2V0QmFzZURpc2NyaW1pbmF0b3IoKTsKKyAgdW5zaWduZWQgQ0kgPSBnZXRDb3B5SWRlbnRpZmllcigpIDw8IChERiA+IDB4MWYgPyAxNCA6IDcpOworICB1bnNpZ25lZCBEID0gQ0kgfCAoZ2V0UHJlZml4RW5jb2RpbmdGcm9tVW5zaWduZWQoREYpIDw8IDEpOworCisgIGlmIChCRCA9PSAwKQorICAgIEQgPSAoRCA8PCAxKSB8IDE7CisgIGVsc2UKKyAgICBEID0gKEQgPDwgKEJEID4gMHgxZiA/IDE0IDogNykpIHwgKGdldFByZWZpeEVuY29kaW5nRnJvbVVuc2lnbmVkKEJEKSA8PCAxKTsKKworICByZXR1cm4gY2xvbmVXaXRoRGlzY3JpbWluYXRvcihEKTsKK30KKworY2xhc3MgRElOYW1lc3BhY2UgOiBwdWJsaWMgRElTY29wZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKKyAgdW5zaWduZWQgRXhwb3J0U3ltYm9scyA6IDE7CisKKyAgRElOYW1lc3BhY2UoTExWTUNvbnRleHQgJkNvbnRleHQsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIGJvb2wgRXhwb3J0U3ltYm9scywKKyAgICAgICAgICAgICAgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESVNjb3BlKENvbnRleHQsIERJTmFtZXNwYWNlS2luZCwgU3RvcmFnZSwgZHdhcmY6OkRXX1RBR19uYW1lc3BhY2UsCisgICAgICAgICAgICAgICAgT3BzKSwKKyAgICAgICAgRXhwb3J0U3ltYm9scyhFeHBvcnRTeW1ib2xzKSB7fQorICB+RElOYW1lc3BhY2UoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIERJTmFtZXNwYWNlICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCBESVNjb3BlICpTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLCBib29sIEV4cG9ydFN5bWJvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpIHsKKyAgICByZXR1cm4gZ2V0SW1wbChDb250ZXh0LCBTY29wZSwgZ2V0Q2Fub25pY2FsTURTdHJpbmcoQ29udGV4dCwgTmFtZSksCisgICAgICAgICAgICAgICAgICAgRXhwb3J0U3ltYm9scywgU3RvcmFnZSwgU2hvdWxkQ3JlYXRlKTsKKyAgfQorICBzdGF0aWMgRElOYW1lc3BhY2UgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIE1ldGFkYXRhICpTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1EU3RyaW5nICpOYW1lLCBib29sIEV4cG9ydFN5bWJvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworCisgIFRlbXBESU5hbWVzcGFjZSBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksIGdldFNjb3BlKCksIGdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEV4cG9ydFN5bWJvbHMoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESU5hbWVzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgKERJU2NvcGUgKlNjb3BlLCBTdHJpbmdSZWYgTmFtZSwgYm9vbCBFeHBvcnRTeW1ib2xzKSwKKyAgICAgICAgICAgICAgICAgICAgKFNjb3BlLCBOYW1lLCBFeHBvcnRTeW1ib2xzKSkKKyAgREVGSU5FX01ETk9ERV9HRVQoRElOYW1lc3BhY2UsCisgICAgICAgICAgICAgICAgICAgIChNZXRhZGF0YSAqU2NvcGUsIE1EU3RyaW5nICpOYW1lLCBib29sIEV4cG9ydFN5bWJvbHMpLAorICAgICAgICAgICAgICAgICAgICAoU2NvcGUsIE5hbWUsIEV4cG9ydFN5bWJvbHMpKQorCisgIFRlbXBESU5hbWVzcGFjZSBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIGNsb25lSW1wbCgpOyB9CisKKyAgYm9vbCBnZXRFeHBvcnRTeW1ib2xzKCkgY29uc3QgeyByZXR1cm4gRXhwb3J0U3ltYm9sczsgfQorICBESVNjb3BlICpnZXRTY29wZSgpIGNvbnN0IHsgcmV0dXJuIGNhc3Rfb3JfbnVsbDxESVNjb3BlPihnZXRSYXdTY29wZSgpKTsgfQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMik7IH0KKworICBNZXRhZGF0YSAqZ2V0UmF3U2NvcGUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDEpOyB9CisgIE1EU3RyaW5nICpnZXRSYXdOYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPigyKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElOYW1lc3BhY2VLaW5kOworICB9Cit9OworCisvLy8gQSAoY2xhbmcpIG1vZHVsZSB0aGF0IGhhcyBiZWVuIGltcG9ydGVkIGJ5IHRoZSBjb21waWxlIHVuaXQuCisvLy8KK2NsYXNzIERJTW9kdWxlIDogcHVibGljIERJU2NvcGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIERJTW9kdWxlKExMVk1Db250ZXh0ICZDb250ZXh0LCBTdG9yYWdlVHlwZSBTdG9yYWdlLCBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJU2NvcGUoQ29udGV4dCwgRElNb2R1bGVLaW5kLCBTdG9yYWdlLCBkd2FyZjo6RFdfVEFHX21vZHVsZSwgT3BzKSB7fQorICB+RElNb2R1bGUoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIERJTW9kdWxlICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCBESVNjb3BlICpTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgQ29uZmlndXJhdGlvbk1hY3JvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbmNsdWRlUGF0aCwgU3RyaW5nUmVmIElTeXNSb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKSB7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgU2NvcGUsIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIE5hbWUpLAorICAgICAgICAgICAgICAgICAgIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIENvbmZpZ3VyYXRpb25NYWNyb3MpLAorICAgICAgICAgICAgICAgICAgIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIEluY2x1ZGVQYXRoKSwKKyAgICAgICAgICAgICAgICAgICBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBJU3lzUm9vdCksCisgICAgICAgICAgICAgICAgICAgU3RvcmFnZSwgU2hvdWxkQ3JlYXRlKTsKKyAgfQorICBzdGF0aWMgRElNb2R1bGUgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIE1ldGFkYXRhICpTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1EU3RyaW5nICpOYW1lLCBNRFN0cmluZyAqQ29uZmlndXJhdGlvbk1hY3JvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1EU3RyaW5nICpJbmNsdWRlUGF0aCwgTURTdHJpbmcgKklTeXNSb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElNb2R1bGUgY2xvbmVJbXBsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUZW1wb3JhcnkoZ2V0Q29udGV4dCgpLCBnZXRTY29wZSgpLCBnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb25maWd1cmF0aW9uTWFjcm9zKCksIGdldEluY2x1ZGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRJU3lzUm9vdCgpKTsKKyAgfQorCitwdWJsaWM6CisgIERFRklORV9NRE5PREVfR0VUKERJTW9kdWxlLCAoRElTY29wZSAqU2NvcGUsIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDb25maWd1cmF0aW9uTWFjcm9zLCBTdHJpbmdSZWYgSW5jbHVkZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIElTeXNSb290KSwKKyAgICAgICAgICAgICAgICAgICAgKFNjb3BlLCBOYW1lLCBDb25maWd1cmF0aW9uTWFjcm9zLCBJbmNsdWRlUGF0aCwgSVN5c1Jvb3QpKQorICBERUZJTkVfTUROT0RFX0dFVChESU1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgKE1ldGFkYXRhICpTY29wZSwgTURTdHJpbmcgKk5hbWUsIE1EU3RyaW5nICpDb25maWd1cmF0aW9uTWFjcm9zLAorICAgICAgICAgICAgICAgICAgICAgTURTdHJpbmcgKkluY2x1ZGVQYXRoLCBNRFN0cmluZyAqSVN5c1Jvb3QpLAorICAgICAgICAgICAgICAgICAgICAoU2NvcGUsIE5hbWUsIENvbmZpZ3VyYXRpb25NYWNyb3MsIEluY2x1ZGVQYXRoLCBJU3lzUm9vdCkpCisKKyAgVGVtcERJTW9kdWxlIGNsb25lKCkgY29uc3QgeyByZXR1cm4gY2xvbmVJbXBsKCk7IH0KKworICBESVNjb3BlICpnZXRTY29wZSgpIGNvbnN0IHsgcmV0dXJuIGNhc3Rfb3JfbnVsbDxESVNjb3BlPihnZXRSYXdTY29wZSgpKTsgfQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMSk7IH0KKyAgU3RyaW5nUmVmIGdldENvbmZpZ3VyYXRpb25NYWNyb3MoKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmdPcGVyYW5kKDIpOyB9CisgIFN0cmluZ1JlZiBnZXRJbmNsdWRlUGF0aCgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMyk7IH0KKyAgU3RyaW5nUmVmIGdldElTeXNSb290KCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCg0KTsgfQorCisgIE1ldGFkYXRhICpnZXRSYXdTY29wZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKyAgTURTdHJpbmcgKmdldFJhd05hbWUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KDEpOyB9CisgIE1EU3RyaW5nICpnZXRSYXdDb25maWd1cmF0aW9uTWFjcm9zKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPigyKTsgfQorICBNRFN0cmluZyAqZ2V0UmF3SW5jbHVkZVBhdGgoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KDMpOyB9CisgIE1EU3RyaW5nICpnZXRSYXdJU3lzUm9vdCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmRBczxNRFN0cmluZz4oNCk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJTW9kdWxlS2luZDsKKyAgfQorfTsKKworLy8vIEJhc2UgY2xhc3MgZm9yIHRlbXBsYXRlIHBhcmFtZXRlcnMuCitjbGFzcyBESVRlbXBsYXRlUGFyYW1ldGVyIDogcHVibGljIERJTm9kZSB7Citwcm90ZWN0ZWQ6CisgIERJVGVtcGxhdGVQYXJhbWV0ZXIoTExWTUNvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIElELCBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFRhZywgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESU5vZGUoQ29udGV4dCwgSUQsIFN0b3JhZ2UsIFRhZywgT3BzKSB7fQorICB+RElUZW1wbGF0ZVBhcmFtZXRlcigpID0gZGVmYXVsdDsKKworcHVibGljOgorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMCk7IH0KKyAgRElUeXBlUmVmIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBESVR5cGVSZWYoZ2V0UmF3VHlwZSgpKTsgfQorCisgIE1EU3RyaW5nICpnZXRSYXdOYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPigwKTsgfQorICBNZXRhZGF0YSAqZ2V0UmF3VHlwZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMSk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJVGVtcGxhdGVUeXBlUGFyYW1ldGVyS2luZCB8fAorICAgICAgICAgICBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJVGVtcGxhdGVWYWx1ZVBhcmFtZXRlcktpbmQ7CisgIH0KK307CisKK2NsYXNzIERJVGVtcGxhdGVUeXBlUGFyYW1ldGVyIDogcHVibGljIERJVGVtcGxhdGVQYXJhbWV0ZXIgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIERJVGVtcGxhdGVUeXBlUGFyYW1ldGVyKExMVk1Db250ZXh0ICZDb250ZXh0LCBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJVGVtcGxhdGVQYXJhbWV0ZXIoQ29udGV4dCwgRElUZW1wbGF0ZVR5cGVQYXJhbWV0ZXJLaW5kLCBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3YXJmOjpEV19UQUdfdGVtcGxhdGVfdHlwZV9wYXJhbWV0ZXIsIE9wcykge30KKyAgfkRJVGVtcGxhdGVUeXBlUGFyYW1ldGVyKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBESVRlbXBsYXRlVHlwZVBhcmFtZXRlciAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVR5cGVSZWYgVHlwZSwgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSkgeworICAgIHJldHVybiBnZXRJbXBsKENvbnRleHQsIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIE5hbWUpLCBUeXBlLCBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgIFNob3VsZENyZWF0ZSk7CisgIH0KKyAgc3RhdGljIERJVGVtcGxhdGVUeXBlUGFyYW1ldGVyICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCBNRFN0cmluZyAqTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhICpUeXBlLCBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElUZW1wbGF0ZVR5cGVQYXJhbWV0ZXIgY2xvbmVJbXBsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUZW1wb3JhcnkoZ2V0Q29udGV4dCgpLCBnZXROYW1lKCksIGdldFR5cGUoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESVRlbXBsYXRlVHlwZVBhcmFtZXRlciwgKFN0cmluZ1JlZiBOYW1lLCBESVR5cGVSZWYgVHlwZSksCisgICAgICAgICAgICAgICAgICAgIChOYW1lLCBUeXBlKSkKKyAgREVGSU5FX01ETk9ERV9HRVQoRElUZW1wbGF0ZVR5cGVQYXJhbWV0ZXIsIChNRFN0cmluZyAqIE5hbWUsIE1ldGFkYXRhICpUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgKE5hbWUsIFR5cGUpKQorCisgIFRlbXBESVRlbXBsYXRlVHlwZVBhcmFtZXRlciBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIGNsb25lSW1wbCgpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESVRlbXBsYXRlVHlwZVBhcmFtZXRlcktpbmQ7CisgIH0KK307CisKK2NsYXNzIERJVGVtcGxhdGVWYWx1ZVBhcmFtZXRlciA6IHB1YmxpYyBESVRlbXBsYXRlUGFyYW1ldGVyIHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIE1ETm9kZTsKKworICBESVRlbXBsYXRlVmFsdWVQYXJhbWV0ZXIoTExWTUNvbnRleHQgJkNvbnRleHQsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUYWcsIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wcykKKyAgICAgIDogRElUZW1wbGF0ZVBhcmFtZXRlcihDb250ZXh0LCBESVRlbXBsYXRlVmFsdWVQYXJhbWV0ZXJLaW5kLCBTdG9yYWdlLCBUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BzKSB7fQorICB+RElUZW1wbGF0ZVZhbHVlUGFyYW1ldGVyKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBESVRlbXBsYXRlVmFsdWVQYXJhbWV0ZXIgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSwgRElUeXBlUmVmIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgKlZhbHVlLCBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSkgeworICAgIHJldHVybiBnZXRJbXBsKENvbnRleHQsIFRhZywgZ2V0Q2Fub25pY2FsTURTdHJpbmcoQ29udGV4dCwgTmFtZSksIFR5cGUsCisgICAgICAgICAgICAgICAgICAgVmFsdWUsIFN0b3JhZ2UsIFNob3VsZENyZWF0ZSk7CisgIH0KKyAgc3RhdGljIERJVGVtcGxhdGVWYWx1ZVBhcmFtZXRlciAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1EU3RyaW5nICpOYW1lLCBNZXRhZGF0YSAqVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSAqVmFsdWUsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElUZW1wbGF0ZVZhbHVlUGFyYW1ldGVyIGNsb25lSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwgZ2V0VGFnKCksIGdldE5hbWUoKSwgZ2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESVRlbXBsYXRlVmFsdWVQYXJhbWV0ZXIsICh1bnNpZ25lZCBUYWcsIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVR5cGVSZWYgVHlwZSwgTWV0YWRhdGEgKlZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgKFRhZywgTmFtZSwgVHlwZSwgVmFsdWUpKQorICBERUZJTkVfTUROT0RFX0dFVChESVRlbXBsYXRlVmFsdWVQYXJhbWV0ZXIsICh1bnNpZ25lZCBUYWcsIE1EU3RyaW5nICpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSAqVHlwZSwgTWV0YWRhdGEgKlZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgKFRhZywgTmFtZSwgVHlwZSwgVmFsdWUpKQorCisgIFRlbXBESVRlbXBsYXRlVmFsdWVQYXJhbWV0ZXIgY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIE1ldGFkYXRhICpnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMik7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJVGVtcGxhdGVWYWx1ZVBhcmFtZXRlcktpbmQ7CisgIH0KK307CisKKy8vLyBCYXNlIGNsYXNzIGZvciB2YXJpYWJsZXMuCitjbGFzcyBESVZhcmlhYmxlIDogcHVibGljIERJTm9kZSB7CisgIHVuc2lnbmVkIExpbmU7CisgIHVpbnQzMl90IEFsaWduSW5CaXRzOworCitwcm90ZWN0ZWQ6CisgIERJVmFyaWFibGUoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIElELCBTdG9yYWdlVHlwZSBTdG9yYWdlLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wcywgdWludDMyX3QgQWxpZ25JbkJpdHMgPSAwKQorICAgICAgOiBESU5vZGUoQywgSUQsIFN0b3JhZ2UsIGR3YXJmOjpEV19UQUdfdmFyaWFibGUsIE9wcyksIExpbmUoTGluZSksCisgICAgICAgIEFsaWduSW5CaXRzKEFsaWduSW5CaXRzKSB7fQorICB+RElWYXJpYWJsZSgpID0gZGVmYXVsdDsKKworcHVibGljOgorICB1bnNpZ25lZCBnZXRMaW5lKCkgY29uc3QgeyByZXR1cm4gTGluZTsgfQorICBESVNjb3BlICpnZXRTY29wZSgpIGNvbnN0IHsgcmV0dXJuIGNhc3Rfb3JfbnVsbDxESVNjb3BlPihnZXRSYXdTY29wZSgpKTsgfQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMSk7IH0KKyAgRElGaWxlICpnZXRGaWxlKCkgY29uc3QgeyByZXR1cm4gY2FzdF9vcl9udWxsPERJRmlsZT4oZ2V0UmF3RmlsZSgpKTsgfQorICBESVR5cGVSZWYgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIERJVHlwZVJlZihnZXRSYXdUeXBlKCkpOyB9CisgIHVpbnQzMl90IGdldEFsaWduSW5CaXRzKCkgY29uc3QgeyByZXR1cm4gQWxpZ25JbkJpdHM7IH0KKyAgdWludDMyX3QgZ2V0QWxpZ25JbkJ5dGVzKCkgY29uc3QgeyByZXR1cm4gZ2V0QWxpZ25JbkJpdHMoKSAvIENIQVJfQklUOyB9CisgIC8vLyBEZXRlcm1pbmVzIHRoZSBzaXplIG9mIHRoZSB2YXJpYWJsZSdzIHR5cGUuCisgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRTaXplSW5CaXRzKCkgY29uc3Q7CisKKyAgU3RyaW5nUmVmIGdldEZpbGVuYW1lKCkgY29uc3QgeworICAgIGlmIChhdXRvICpGID0gZ2V0RmlsZSgpKQorICAgICAgcmV0dXJuIEYtPmdldEZpbGVuYW1lKCk7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgU3RyaW5nUmVmIGdldERpcmVjdG9yeSgpIGNvbnN0IHsKKyAgICBpZiAoYXV0byAqRiA9IGdldEZpbGUoKSkKKyAgICAgIHJldHVybiBGLT5nZXREaXJlY3RvcnkoKTsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBPcHRpb25hbDxTdHJpbmdSZWY+IGdldFNvdXJjZSgpIGNvbnN0IHsKKyAgICBpZiAoYXV0byAqRiA9IGdldEZpbGUoKSkKKyAgICAgIHJldHVybiBGLT5nZXRTb3VyY2UoKTsKKyAgICByZXR1cm4gTm9uZTsKKyAgfQorCisgIE1ldGFkYXRhICpnZXRSYXdTY29wZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKyAgTURTdHJpbmcgKmdldFJhd05hbWUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KDEpOyB9CisgIE1ldGFkYXRhICpnZXRSYXdGaWxlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgyKTsgfQorICBNZXRhZGF0YSAqZ2V0UmF3VHlwZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMyk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJTG9jYWxWYXJpYWJsZUtpbmQgfHwKKyAgICAgICAgICAgTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESUdsb2JhbFZhcmlhYmxlS2luZDsKKyAgfQorfTsKKworLy8vIERXQVJGIGV4cHJlc3Npb24uCisvLy8KKy8vLyBUaGlzIGlzIChhbG1vc3QpIGEgRFdBUkYgZXhwcmVzc2lvbiB0aGF0IG1vZGlmaWVzIHRoZSBsb2NhdGlvbiBvZiBhCisvLy8gdmFyaWFibGUsIG9yIHRoZSBsb2NhdGlvbiBvZiBhIHNpbmdsZSBwaWVjZSBvZiBhIHZhcmlhYmxlLCBvciAod2hlbiB1c2luZworLy8vIERXX09QX3N0YWNrX3ZhbHVlKSBpcyB0aGUgY29uc3RhbnQgdmFyaWFibGUgdmFsdWUuCisvLy8KKy8vLyBUT0RPOiBDby1hbGxvY2F0ZSB0aGUgZXhwcmVzc2lvbiBlbGVtZW50cy4KKy8vLyBUT0RPOiBTZXBhcmF0ZSBmcm9tIE1ETm9kZSwgb3Igb3RoZXJ3aXNlIGRyb3AgRGlzdGluY3QgYW5kIFRlbXBvcmFyeQorLy8vIHN0b3JhZ2UgdHlwZXMuCitjbGFzcyBESUV4cHJlc3Npb24gOiBwdWJsaWMgTUROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIE1ETm9kZTsKKworICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gRWxlbWVudHM7CisKKyAgRElFeHByZXNzaW9uKExMVk1Db250ZXh0ICZDLCBTdG9yYWdlVHlwZSBTdG9yYWdlLCBBcnJheVJlZjx1aW50NjRfdD4gRWxlbWVudHMpCisgICAgICA6IE1ETm9kZShDLCBESUV4cHJlc3Npb25LaW5kLCBTdG9yYWdlLCBOb25lKSwKKyAgICAgICAgRWxlbWVudHMoRWxlbWVudHMuYmVnaW4oKSwgRWxlbWVudHMuZW5kKCkpIHt9CisgIH5ESUV4cHJlc3Npb24oKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIERJRXhwcmVzc2lvbiAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50NjRfdD4gRWxlbWVudHMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElFeHByZXNzaW9uIGNsb25lSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwgZ2V0RWxlbWVudHMoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESUV4cHJlc3Npb24sIChBcnJheVJlZjx1aW50NjRfdD4gRWxlbWVudHMpLCAoRWxlbWVudHMpKQorCisgIFRlbXBESUV4cHJlc3Npb24gY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIEFycmF5UmVmPHVpbnQ2NF90PiBnZXRFbGVtZW50cygpIGNvbnN0IHsgcmV0dXJuIEVsZW1lbnRzOyB9CisKKyAgdW5zaWduZWQgZ2V0TnVtRWxlbWVudHMoKSBjb25zdCB7IHJldHVybiBFbGVtZW50cy5zaXplKCk7IH0KKworICB1aW50NjRfdCBnZXRFbGVtZW50KHVuc2lnbmVkIEkpIGNvbnN0IHsKKyAgICBhc3NlcnQoSSA8IEVsZW1lbnRzLnNpemUoKSAmJiAiSW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgcmV0dXJuIEVsZW1lbnRzW0ldOworICB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgcmVwcmVzZW50cyBhIHN0YW5kYWxvbmUgY29uc3RhbnQgdmFsdWUuCisgIGJvb2wgaXNDb25zdGFudCgpIGNvbnN0OworCisgIHVzaW5nIGVsZW1lbnRfaXRlcmF0b3IgPSBBcnJheVJlZjx1aW50NjRfdD46Oml0ZXJhdG9yOworCisgIGVsZW1lbnRfaXRlcmF0b3IgZWxlbWVudHNfYmVnaW4oKSBjb25zdCB7IHJldHVybiBnZXRFbGVtZW50cygpLmJlZ2luKCk7IH0KKyAgZWxlbWVudF9pdGVyYXRvciBlbGVtZW50c19lbmQoKSBjb25zdCB7IHJldHVybiBnZXRFbGVtZW50cygpLmVuZCgpOyB9CisKKyAgLy8vIEEgbGlnaHR3ZWlnaHQgd3JhcHBlciBhcm91bmQgYW4gZXhwcmVzc2lvbiBvcGVyYW5kLgorICAvLy8KKyAgLy8vIFRPRE86IFN0b3JlIGFyZ3VtZW50cyBkaXJlY3RseSBhbmQgY2hhbmdlIFxhIERJRXhwcmVzc2lvbiB0byBzdG9yZSBhCisgIC8vLyByYW5nZSBvZiB0aGVzZS4KKyAgY2xhc3MgRXhwck9wZXJhbmQgeworICAgIGNvbnN0IHVpbnQ2NF90ICpPcCA9IG51bGxwdHI7CisKKyAgcHVibGljOgorICAgIEV4cHJPcGVyYW5kKCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IEV4cHJPcGVyYW5kKGNvbnN0IHVpbnQ2NF90ICpPcCkgOiBPcChPcCkge30KKworICAgIGNvbnN0IHVpbnQ2NF90ICpnZXQoKSBjb25zdCB7IHJldHVybiBPcDsgfQorCisgICAgLy8vIEdldCB0aGUgb3BlcmFuZCBjb2RlLgorICAgIHVpbnQ2NF90IGdldE9wKCkgY29uc3QgeyByZXR1cm4gKk9wOyB9CisKKyAgICAvLy8gR2V0IGFuIGFyZ3VtZW50IHRvIHRoZSBvcGVyYW5kLgorICAgIC8vLworICAgIC8vLyBOZXZlciByZXR1cm5zIHRoZSBvcGVyYW5kIGl0c2VsZi4KKyAgICB1aW50NjRfdCBnZXRBcmcodW5zaWduZWQgSSkgY29uc3QgeyByZXR1cm4gT3BbSSArIDFdOyB9CisKKyAgICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3QgeyByZXR1cm4gZ2V0U2l6ZSgpIC0gMTsgfQorCisgICAgLy8vIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgb3BlcmFuZC4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG9wZXJhbmQgKDEgKyBhcmdzKS4KKyAgICB1bnNpZ25lZCBnZXRTaXplKCkgY29uc3Q7CisgIH07CisKKyAgLy8vIEFuIGl0ZXJhdG9yIGZvciBleHByZXNzaW9uIG9wZXJhbmRzLgorICBjbGFzcyBleHByX29wX2l0ZXJhdG9yCisgICAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnLCBFeHByT3BlcmFuZD4geworICAgIEV4cHJPcGVyYW5kIE9wOworCisgIHB1YmxpYzoKKyAgICBleHByX29wX2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IGV4cHJfb3BfaXRlcmF0b3IoZWxlbWVudF9pdGVyYXRvciBJKSA6IE9wKEkpIHt9CisKKyAgICBlbGVtZW50X2l0ZXJhdG9yIGdldEJhc2UoKSBjb25zdCB7IHJldHVybiBPcC5nZXQoKTsgfQorICAgIGNvbnN0IEV4cHJPcGVyYW5kICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBPcDsgfQorICAgIGNvbnN0IEV4cHJPcGVyYW5kICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJk9wOyB9CisKKyAgICBleHByX29wX2l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgICAgaW5jcmVtZW50KCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIGV4cHJfb3BfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKKyAgICAgIGV4cHJfb3BfaXRlcmF0b3IgVCgqdGhpcyk7CisgICAgICBpbmNyZW1lbnQoKTsKKyAgICAgIHJldHVybiBUOworICAgIH0KKworICAgIC8vLyBHZXQgdGhlIG5leHQgaXRlcmF0b3IuCisgICAgLy8vCisgICAgLy8vIFxhIHN0ZDo6bmV4dCgpIGRvZXNuJ3Qgd29yayBiZWNhdXNlIHRoaXMgaXMgdGVjaG5pY2FsbHkgYW4KKyAgICAvLy8gaW5wdXRfaXRlcmF0b3IsIGJ1dCBpdCdzIGEgcGVyZmVjdGx5IHZhbGlkIG9wZXJhdGlvbi4gIFRoaXMgaXMgYW4KKyAgICAvLy8gYWNjZXNzb3IgdG8gcHJvdmlkZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5LgorICAgIGV4cHJfb3BfaXRlcmF0b3IgZ2V0TmV4dCgpIGNvbnN0IHsgcmV0dXJuICsrZXhwcl9vcF9pdGVyYXRvcigqdGhpcyk7IH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBleHByX29wX2l0ZXJhdG9yICZYKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0QmFzZSgpID09IFguZ2V0QmFzZSgpOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgZXhwcl9vcF9pdGVyYXRvciAmWCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldEJhc2UoKSAhPSBYLmdldEJhc2UoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIGluY3JlbWVudCgpIHsgT3AgPSBFeHByT3BlcmFuZChnZXRCYXNlKCkgKyBPcC5nZXRTaXplKCkpOyB9CisgIH07CisKKyAgLy8vIFZpc2l0IHRoZSBlbGVtZW50cyB2aWEgRXhwck9wZXJhbmQgd3JhcHBlcnMuCisgIC8vLworICAvLy8gVGhlc2UgcmFuZ2UgaXRlcmF0b3JzIHZpc2l0IGVsZW1lbnRzIHRocm91Z2ggXGEgRXhwck9wZXJhbmQgd3JhcHBlcnMuCisgIC8vLyBUaGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGEgdmFsaWQgcmFuZ2UgdW5sZXNzIFxhIGlzVmFsaWQoKSBnaXZlcyBcYworICAvLy8gdHJ1ZS4KKyAgLy8vCisgIC8vLyBccHJlIFxhIGlzVmFsaWQoKSBnaXZlcyBcYyB0cnVlLgorICAvLy8gQHsKKyAgZXhwcl9vcF9pdGVyYXRvciBleHByX29wX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBleHByX29wX2l0ZXJhdG9yKGVsZW1lbnRzX2JlZ2luKCkpOworICB9CisgIGV4cHJfb3BfaXRlcmF0b3IgZXhwcl9vcF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGV4cHJfb3BfaXRlcmF0b3IoZWxlbWVudHNfZW5kKCkpOworICB9CisgIGl0ZXJhdG9yX3JhbmdlPGV4cHJfb3BfaXRlcmF0b3I+IGV4cHJfb3BzKCkgY29uc3QgeworICAgIHJldHVybiB7ZXhwcl9vcF9iZWdpbigpLCBleHByX29wX2VuZCgpfTsKKyAgfQorICAvLy8gQH0KKworICBib29sIGlzVmFsaWQoKSBjb25zdDsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJRXhwcmVzc2lvbktpbmQ7CisgIH0KKworICAvLy8gUmV0dXJuIHdoZXRoZXIgdGhlIGZpcnN0IGVsZW1lbnQgYSBEV19PUF9kZXJlZi4KKyAgYm9vbCBzdGFydHNXaXRoRGVyZWYoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE51bUVsZW1lbnRzKCkgPiAwICYmIGdldEVsZW1lbnQoMCkgPT0gZHdhcmY6OkRXX09QX2RlcmVmOworICB9CisKKyAgLy8vIEhvbGRzIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2Ygb25lIGZyYWdtZW50IG9mIGEgbGFyZ2VyIHZhcmlhYmxlLgorICBzdHJ1Y3QgRnJhZ21lbnRJbmZvIHsKKyAgICB1aW50NjRfdCBTaXplSW5CaXRzOworICAgIHVpbnQ2NF90IE9mZnNldEluQml0czsKKyAgfTsKKworICAvLy8gUmV0cmlldmUgdGhlIGRldGFpbHMgb2YgdGhpcyBmcmFnbWVudCBleHByZXNzaW9uLgorICBzdGF0aWMgT3B0aW9uYWw8RnJhZ21lbnRJbmZvPiBnZXRGcmFnbWVudEluZm8oZXhwcl9vcF9pdGVyYXRvciBTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfb3BfaXRlcmF0b3IgRW5kKTsKKworICAvLy8gUmV0cmlldmUgdGhlIGRldGFpbHMgb2YgdGhpcyBmcmFnbWVudCBleHByZXNzaW9uLgorICBPcHRpb25hbDxGcmFnbWVudEluZm8+IGdldEZyYWdtZW50SW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RnJhZ21lbnRJbmZvKGV4cHJfb3BfYmVnaW4oKSwgZXhwcl9vcF9lbmQoKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIHBpZWNlIG9mIGFuIGFnZ3JlZ2F0ZSB2YXJpYWJsZS4KKyAgYm9vbCBpc0ZyYWdtZW50KCkgY29uc3QgeyByZXR1cm4gZ2V0RnJhZ21lbnRJbmZvKCkuaGFzVmFsdWUoKTsgfQorCisgIC8vLyBBcHBlbmQgXHAgT3BzIHdpdGggb3BlcmF0aW9ucyB0byBhcHBseSB0aGUgXHAgT2Zmc2V0LgorICBzdGF0aWMgdm9pZCBhcHBlbmRPZmZzZXQoU21hbGxWZWN0b3JJbXBsPHVpbnQ2NF90PiAmT3BzLCBpbnQ2NF90IE9mZnNldCk7CisKKyAgLy8vIElmIHRoaXMgaXMgYSBjb25zdGFudCBvZmZzZXQsIGV4dHJhY3QgaXQuIElmIHRoZXJlIGlzIG5vIGV4cHJlc3Npb24sCisgIC8vLyByZXR1cm4gdHJ1ZSB3aXRoIGFuIG9mZnNldCBvZiB6ZXJvLgorICBib29sIGV4dHJhY3RJZk9mZnNldChpbnQ2NF90ICZPZmZzZXQpIGNvbnN0OworCisgIC8vLyBDb25zdGFudHMgZm9yIERJRXhwcmVzc2lvbjo6cHJlcGVuZC4KKyAgZW51bSB7IE5vRGVyZWYgPSBmYWxzZSwgV2l0aERlcmVmID0gdHJ1ZSwgV2l0aFN0YWNrVmFsdWUgPSB0cnVlIH07CisKKyAgLy8vIFByZXBlbmQgXHAgRElFeHByIHdpdGggYSBkZXJlZiBhbmQgb2Zmc2V0IG9wZXJhdGlvbiBhbmQgb3B0aW9uYWxseSB0dXJuIGl0CisgIC8vLyBpbnRvIGEgc3RhY2sgdmFsdWUuCisgIHN0YXRpYyBESUV4cHJlc3Npb24gKnByZXBlbmQoY29uc3QgRElFeHByZXNzaW9uICpESUV4cHIsIGJvb2wgRGVyZWZCZWZvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBPZmZzZXQgPSAwLCBib29sIERlcmVmQWZ0ZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFN0YWNrVmFsdWUgPSBmYWxzZSk7CisKKyAgLy8vIFByZXBlbmQgXHAgRElFeHByIHdpdGggdGhlIGdpdmVuIG9wY29kZXMgYW5kIG9wdGlvbmFsbHkgdHVybiBpdCBpbnRvIGEKKyAgLy8vIHN0YWNrIHZhbHVlLgorICBzdGF0aWMgRElFeHByZXNzaW9uICpkb1ByZXBlbmQoY29uc3QgRElFeHByZXNzaW9uICpESUV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8dWludDY0X3Q+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFN0YWNrVmFsdWUgPSBmYWxzZSk7CisKKyAgLy8vIENyZWF0ZSBhIERJRXhwcmVzc2lvbiB0byBkZXNjcmliZSBvbmUgcGFydCBvZiBhbiBhZ2dyZWdhdGUgdmFyaWFibGUgdGhhdAorICAvLy8gaXMgZnJhZ21lbnRlZCBhY3Jvc3MgbXVsdGlwbGUgVmFsdWVzLiBUaGUgRFdfT1BfTExWTV9mcmFnbWVudCBvcGVyYXRpb24KKyAgLy8vIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGVsZW1lbnRzIG9mIFxjIEV4cHIuIElmIFxjIEV4cHIgYWxyZWFkeSBjb250YWlucworICAvLy8gYSBcYyBEV19PUF9MTFZNX2ZyYWdtZW50IFxjIE9mZnNldEluQml0cyBpcyBpbnRlcnByZXRlZCBhcyBhbiBvZmZzZXQKKyAgLy8vIGludG8gdGhlIGV4aXN0aW5nIGZyYWdtZW50LgorICAvLy8KKyAgLy8vIFxwYXJhbSBPZmZzZXRJbkJpdHMgT2Zmc2V0IG9mIHRoZSBwaWVjZSBpbiBiaXRzLgorICAvLy8gXHBhcmFtIFNpemVJbkJpdHMgICBTaXplIG9mIHRoZSBwaWVjZSBpbiBiaXRzLgorICAvLy8gXHJldHVybiAgICAgICAgICAgICBDcmVhdGluZyBhIGZyYWdtZW50IGV4cHJlc3Npb24gbWF5IGZhaWwgaWYgXGMgRXhwcgorICAvLy8gICAgICAgICAgICAgICAgICAgICBjb250YWlucyBhcml0aG1ldGljIG9wZXJhdGlvbnMgdGhhdCB3b3VsZCBiZSB0cnVuY2F0ZWQuCisgIHN0YXRpYyBPcHRpb25hbDxESUV4cHJlc3Npb24gKj4KKyAgY3JlYXRlRnJhZ21lbnRFeHByZXNzaW9uKGNvbnN0IERJRXhwcmVzc2lvbiAqRXhwciwgdW5zaWduZWQgT2Zmc2V0SW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZUluQml0cyk7CisKKyAgLy8vIERldGVybWluZSB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIGZyYWdtZW50cyBkZXNjcmliZWQgYnkgdGhpcworICAvLy8gRElFeHByZXNzaW9uIGFuZCBccCBPdGhlci4KKyAgLy8vIFJldHVybnMgLTEgaWYgdGhpcyBpcyBlbnRpcmVseSBiZWZvcmUgT3RoZXIsIDAgaWYgdGhpcyBhbmQgT3RoZXIgb3ZlcmxhcCwKKyAgLy8vIDEgaWYgdGhpcyBpcyBlbnRpcmVseSBhZnRlciBPdGhlci4KKyAgaW50IGZyYWdtZW50Q21wKGNvbnN0IERJRXhwcmVzc2lvbiAqT3RoZXIpIGNvbnN0IHsKKyAgICBhdXRvIEZyYWdtZW50MSA9ICpnZXRGcmFnbWVudEluZm8oKTsKKyAgICBhdXRvIEZyYWdtZW50MiA9ICpPdGhlci0+Z2V0RnJhZ21lbnRJbmZvKCk7CisgICAgdW5zaWduZWQgbDEgPSBGcmFnbWVudDEuT2Zmc2V0SW5CaXRzOworICAgIHVuc2lnbmVkIGwyID0gRnJhZ21lbnQyLk9mZnNldEluQml0czsKKyAgICB1bnNpZ25lZCByMSA9IGwxICsgRnJhZ21lbnQxLlNpemVJbkJpdHM7CisgICAgdW5zaWduZWQgcjIgPSBsMiArIEZyYWdtZW50Mi5TaXplSW5CaXRzOworICAgIGlmIChyMSA8PSBsMikKKyAgICAgIHJldHVybiAtMTsKKyAgICBlbHNlIGlmIChyMiA8PSBsMSkKKyAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIENoZWNrIGlmIGZyYWdtZW50cyBvdmVybGFwIGJldHdlZW4gdGhpcyBESUV4cHJlc3Npb24gYW5kIFxwIE90aGVyLgorICBib29sIGZyYWdtZW50c092ZXJsYXAoY29uc3QgRElFeHByZXNzaW9uICpPdGhlcikgY29uc3QgeworICAgIGlmICghaXNGcmFnbWVudCgpIHx8ICFPdGhlci0+aXNGcmFnbWVudCgpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZyYWdtZW50Q21wKE90aGVyKSA9PSAwOworICB9Cit9OworCisvLy8gR2xvYmFsIHZhcmlhYmxlcy4KKy8vLworLy8vIFRPRE86IFJlbW92ZSBEaXNwbGF5TmFtZS4gIEl0J3MgYWx3YXlzIGVxdWFsIHRvIE5hbWUuCitjbGFzcyBESUdsb2JhbFZhcmlhYmxlIDogcHVibGljIERJVmFyaWFibGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIGJvb2wgSXNMb2NhbFRvVW5pdDsKKyAgYm9vbCBJc0RlZmluaXRpb247CisKKyAgRElHbG9iYWxWYXJpYWJsZShMTFZNQ29udGV4dCAmQywgU3RvcmFnZVR5cGUgU3RvcmFnZSwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICAgICAgICBib29sIElzTG9jYWxUb1VuaXQsIGJvb2wgSXNEZWZpbml0aW9uLCB1aW50MzJfdCBBbGlnbkluQml0cywKKyAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJVmFyaWFibGUoQywgRElHbG9iYWxWYXJpYWJsZUtpbmQsIFN0b3JhZ2UsIExpbmUsIE9wcywgQWxpZ25JbkJpdHMpLAorICAgICAgICBJc0xvY2FsVG9Vbml0KElzTG9jYWxUb1VuaXQpLCBJc0RlZmluaXRpb24oSXNEZWZpbml0aW9uKSB7fQorICB+RElHbG9iYWxWYXJpYWJsZSgpID0gZGVmYXVsdDsKKworICBzdGF0aWMgRElHbG9iYWxWYXJpYWJsZSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgRElTY29wZSAqU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgTGlua2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZSwgRElUeXBlUmVmIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNMb2NhbFRvVW5pdCwgYm9vbCBJc0RlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRGVyaXZlZFR5cGUgKlN0YXRpY0RhdGFNZW1iZXJEZWNsYXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWxpZ25JbkJpdHMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSkgeworICAgIHJldHVybiBnZXRJbXBsKENvbnRleHQsIFNjb3BlLCBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBOYW1lKSwKKyAgICAgICAgICAgICAgICAgICBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBMaW5rYWdlTmFtZSksIEZpbGUsIExpbmUsIFR5cGUsCisgICAgICAgICAgICAgICAgICAgSXNMb2NhbFRvVW5pdCwgSXNEZWZpbml0aW9uLCBTdGF0aWNEYXRhTWVtYmVyRGVjbGFyYXRpb24sCisgICAgICAgICAgICAgICAgICAgQWxpZ25JbkJpdHMsIFN0b3JhZ2UsIFNob3VsZENyZWF0ZSk7CisgIH0KKyAgc3RhdGljIERJR2xvYmFsVmFyaWFibGUgKgorICBnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCBNZXRhZGF0YSAqU2NvcGUsIE1EU3RyaW5nICpOYW1lLAorICAgICAgICAgIE1EU3RyaW5nICpMaW5rYWdlTmFtZSwgTWV0YWRhdGEgKkZpbGUsIHVuc2lnbmVkIExpbmUsIE1ldGFkYXRhICpUeXBlLAorICAgICAgICAgIGJvb2wgSXNMb2NhbFRvVW5pdCwgYm9vbCBJc0RlZmluaXRpb24sCisgICAgICAgICAgTWV0YWRhdGEgKlN0YXRpY0RhdGFNZW1iZXJEZWNsYXJhdGlvbiwgdWludDMyX3QgQWxpZ25JbkJpdHMsCisgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElHbG9iYWxWYXJpYWJsZSBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksIGdldFNjb3BlKCksIGdldE5hbWUoKSwgZ2V0TGlua2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpbGUoKSwgZ2V0TGluZSgpLCBnZXRUeXBlKCksIGlzTG9jYWxUb1VuaXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzRGVmaW5pdGlvbigpLCBnZXRTdGF0aWNEYXRhTWVtYmVyRGVjbGFyYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEFsaWduSW5CaXRzKCkpOworICB9CisKK3B1YmxpYzoKKyAgREVGSU5FX01ETk9ERV9HRVQoRElHbG9iYWxWYXJpYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgKERJU2NvcGUgKiBTY29wZSwgU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBMaW5rYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZSwgRElUeXBlUmVmIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICBib29sIElzTG9jYWxUb1VuaXQsIGJvb2wgSXNEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgRElEZXJpdmVkVHlwZSAqU3RhdGljRGF0YU1lbWJlckRlY2xhcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWxpZ25JbkJpdHMpLAorICAgICAgICAgICAgICAgICAgICAoU2NvcGUsIE5hbWUsIExpbmthZ2VOYW1lLCBGaWxlLCBMaW5lLCBUeXBlLCBJc0xvY2FsVG9Vbml0LAorICAgICAgICAgICAgICAgICAgICAgSXNEZWZpbml0aW9uLCBTdGF0aWNEYXRhTWVtYmVyRGVjbGFyYXRpb24sIEFsaWduSW5CaXRzKSkKKyAgREVGSU5FX01ETk9ERV9HRVQoRElHbG9iYWxWYXJpYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgKE1ldGFkYXRhICogU2NvcGUsIE1EU3RyaW5nICpOYW1lLCBNRFN0cmluZyAqTGlua2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSAqRmlsZSwgdW5zaWduZWQgTGluZSwgTWV0YWRhdGEgKlR5cGUsCisgICAgICAgICAgICAgICAgICAgICBib29sIElzTG9jYWxUb1VuaXQsIGJvb2wgSXNEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgKlN0YXRpY0RhdGFNZW1iZXJEZWNsYXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFsaWduSW5CaXRzKSwKKyAgICAgICAgICAgICAgICAgICAgKFNjb3BlLCBOYW1lLCBMaW5rYWdlTmFtZSwgRmlsZSwgTGluZSwgVHlwZSwgSXNMb2NhbFRvVW5pdCwKKyAgICAgICAgICAgICAgICAgICAgIElzRGVmaW5pdGlvbiwgU3RhdGljRGF0YU1lbWJlckRlY2xhcmF0aW9uLCBBbGlnbkluQml0cykpCisKKyAgVGVtcERJR2xvYmFsVmFyaWFibGUgY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIGJvb2wgaXNMb2NhbFRvVW5pdCgpIGNvbnN0IHsgcmV0dXJuIElzTG9jYWxUb1VuaXQ7IH0KKyAgYm9vbCBpc0RlZmluaXRpb24oKSBjb25zdCB7IHJldHVybiBJc0RlZmluaXRpb247IH0KKyAgU3RyaW5nUmVmIGdldERpc3BsYXlOYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCg0KTsgfQorICBTdHJpbmdSZWYgZ2V0TGlua2FnZU5hbWUoKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmdPcGVyYW5kKDUpOyB9CisgIERJRGVyaXZlZFR5cGUgKmdldFN0YXRpY0RhdGFNZW1iZXJEZWNsYXJhdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPERJRGVyaXZlZFR5cGU+KGdldFJhd1N0YXRpY0RhdGFNZW1iZXJEZWNsYXJhdGlvbigpKTsKKyAgfQorCisgIE1EU3RyaW5nICpnZXRSYXdMaW5rYWdlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmRBczxNRFN0cmluZz4oNSk7IH0KKyAgTWV0YWRhdGEgKmdldFJhd1N0YXRpY0RhdGFNZW1iZXJEZWNsYXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoNik7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJR2xvYmFsVmFyaWFibGVLaW5kOworICB9Cit9OworCisvLy8gTG9jYWwgdmFyaWFibGUuCisvLy8KKy8vLyBUT0RPOiBTcGxpdCB1cCBmbGFncy4KK2NsYXNzIERJTG9jYWxWYXJpYWJsZSA6IHB1YmxpYyBESVZhcmlhYmxlIHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIE1ETm9kZTsKKworICB1bnNpZ25lZCBBcmcgOiAxNjsKKyAgRElGbGFncyBGbGFnczsKKworICBESUxvY2FsVmFyaWFibGUoTExWTUNvbnRleHQgJkMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBcmcsIERJRmxhZ3MgRmxhZ3MsIHVpbnQzMl90IEFsaWduSW5CaXRzLAorICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESVZhcmlhYmxlKEMsIERJTG9jYWxWYXJpYWJsZUtpbmQsIFN0b3JhZ2UsIExpbmUsIE9wcywgQWxpZ25JbkJpdHMpLAorICAgICAgICBBcmcoQXJnKSwgRmxhZ3MoRmxhZ3MpIHsKKyAgICBhc3NlcnQoQXJnIDwgKDEgPDwgMTYpICYmICJESUxvY2FsVmFyaWFibGU6IEFyZyBvdXQgb2YgcmFuZ2UiKTsKKyAgfQorICB+RElMb2NhbFZhcmlhYmxlKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBESUxvY2FsVmFyaWFibGUgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIERJU2NvcGUgKlNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLCBESUZpbGUgKkZpbGUsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElUeXBlUmVmIFR5cGUsIHVuc2lnbmVkIEFyZywgRElGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBbGlnbkluQml0cywgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpIHsKKyAgICByZXR1cm4gZ2V0SW1wbChDb250ZXh0LCBTY29wZSwgZ2V0Q2Fub25pY2FsTURTdHJpbmcoQ29udGV4dCwgTmFtZSksIEZpbGUsCisgICAgICAgICAgICAgICAgICAgTGluZSwgVHlwZSwgQXJnLCBGbGFncywgQWxpZ25JbkJpdHMsIFN0b3JhZ2UsIFNob3VsZENyZWF0ZSk7CisgIH0KKyAgc3RhdGljIERJTG9jYWxWYXJpYWJsZSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgTWV0YWRhdGEgKlNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1EU3RyaW5nICpOYW1lLCBNZXRhZGF0YSAqRmlsZSwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSAqVHlwZSwgdW5zaWduZWQgQXJnLCBESUZsYWdzIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFsaWduSW5CaXRzLCBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSk7CisKKyAgVGVtcERJTG9jYWxWYXJpYWJsZSBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksIGdldFNjb3BlKCksIGdldE5hbWUoKSwgZ2V0RmlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGluZSgpLCBnZXRUeXBlKCksIGdldEFyZygpLCBnZXRGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWxpZ25JbkJpdHMoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESUxvY2FsVmFyaWFibGUsCisgICAgICAgICAgICAgICAgICAgIChESUxvY2FsU2NvcGUgKiBTY29wZSwgU3RyaW5nUmVmIE5hbWUsIERJRmlsZSAqRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbmUsIERJVHlwZVJlZiBUeXBlLCB1bnNpZ25lZCBBcmcsCisgICAgICAgICAgICAgICAgICAgICBESUZsYWdzIEZsYWdzLCB1aW50MzJfdCBBbGlnbkluQml0cyksCisgICAgICAgICAgICAgICAgICAgIChTY29wZSwgTmFtZSwgRmlsZSwgTGluZSwgVHlwZSwgQXJnLCBGbGFncywgQWxpZ25JbkJpdHMpKQorICBERUZJTkVfTUROT0RFX0dFVChESUxvY2FsVmFyaWFibGUsCisgICAgICAgICAgICAgICAgICAgIChNZXRhZGF0YSAqIFNjb3BlLCBNRFN0cmluZyAqTmFtZSwgTWV0YWRhdGEgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lLCBNZXRhZGF0YSAqVHlwZSwgdW5zaWduZWQgQXJnLAorICAgICAgICAgICAgICAgICAgICAgRElGbGFncyBGbGFncywgdWludDMyX3QgQWxpZ25JbkJpdHMpLAorICAgICAgICAgICAgICAgICAgICAoU2NvcGUsIE5hbWUsIEZpbGUsIExpbmUsIFR5cGUsIEFyZywgRmxhZ3MsIEFsaWduSW5CaXRzKSkKKworICBUZW1wRElMb2NhbFZhcmlhYmxlIGNsb25lKCkgY29uc3QgeyByZXR1cm4gY2xvbmVJbXBsKCk7IH0KKworICAvLy8gR2V0IHRoZSBsb2NhbCBzY29wZSBmb3IgdGhpcyB2YXJpYWJsZS4KKyAgLy8vCisgIC8vLyBWYXJpYWJsZXMgbXVzdCBiZSBkZWZpbmVkIGluIGEgbG9jYWwgc2NvcGUuCisgIERJTG9jYWxTY29wZSAqZ2V0U2NvcGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8RElMb2NhbFNjb3BlPihESVZhcmlhYmxlOjpnZXRTY29wZSgpKTsKKyAgfQorCisgIGJvb2wgaXNQYXJhbWV0ZXIoKSBjb25zdCB7IHJldHVybiBBcmc7IH0KKyAgdW5zaWduZWQgZ2V0QXJnKCkgY29uc3QgeyByZXR1cm4gQXJnOyB9CisgIERJRmxhZ3MgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBGbGFnczsgfQorCisgIGJvb2wgaXNBcnRpZmljaWFsKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdBcnRpZmljaWFsOyB9CisgIGJvb2wgaXNPYmplY3RQb2ludGVyKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdPYmplY3RQb2ludGVyOyB9CisKKyAgLy8vIENoZWNrIHRoYXQgYSBsb2NhdGlvbiBpcyB2YWxpZCBmb3IgdGhpcyB2YXJpYWJsZS4KKyAgLy8vCisgIC8vLyBDaGVjayB0aGF0IFxjIERMIGV4aXN0cywgaXMgaW4gdGhlIHNhbWUgc3VicHJvZ3JhbSwgYW5kIGhhcyB0aGUgc2FtZQorICAvLy8gaW5saW5lZC1hdCBsb2NhdGlvbiBhcyBcYyB0aGlzLiAgKE90aGVyd2lzZSwgaXQncyBub3QgYSB2YWxpZCBhdHRhY2htZW50CisgIC8vLyB0byBhIFxhIERiZ0luZm9JbnRyaW5zaWMuKQorICBib29sIGlzVmFsaWRMb2NhdGlvbkZvckludHJpbnNpYyhjb25zdCBESUxvY2F0aW9uICpETCkgY29uc3QgeworICAgIHJldHVybiBETCAmJiBnZXRTY29wZSgpLT5nZXRTdWJwcm9ncmFtKCkgPT0gREwtPmdldFNjb3BlKCktPmdldFN1YnByb2dyYW0oKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElMb2NhbFZhcmlhYmxlS2luZDsKKyAgfQorfTsKKworY2xhc3MgRElPYmpDUHJvcGVydHkgOiBwdWJsaWMgRElOb2RlIHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIE1ETm9kZTsKKworICB1bnNpZ25lZCBMaW5lOworICB1bnNpZ25lZCBBdHRyaWJ1dGVzOworCisgIERJT2JqQ1Byb3BlcnR5KExMVk1Db250ZXh0ICZDLCBTdG9yYWdlVHlwZSBTdG9yYWdlLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBdHRyaWJ1dGVzLCBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJTm9kZShDLCBESU9iakNQcm9wZXJ0eUtpbmQsIFN0b3JhZ2UsIGR3YXJmOjpEV19UQUdfQVBQTEVfcHJvcGVydHksCisgICAgICAgICAgICAgICBPcHMpLAorICAgICAgICBMaW5lKExpbmUpLCBBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMpIHt9CisgIH5ESU9iakNQcm9wZXJ0eSgpID0gZGVmYXVsdDsKKworICBzdGF0aWMgRElPYmpDUHJvcGVydHkgKgorICBnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCBTdHJpbmdSZWYgTmFtZSwgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgIFN0cmluZ1JlZiBHZXR0ZXJOYW1lLCBTdHJpbmdSZWYgU2V0dGVyTmFtZSwgdW5zaWduZWQgQXR0cmlidXRlcywKKyAgICAgICAgICBESVR5cGVSZWYgVHlwZSwgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKSB7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgZ2V0Q2Fub25pY2FsTURTdHJpbmcoQ29udGV4dCwgTmFtZSksIEZpbGUsIExpbmUsCisgICAgICAgICAgICAgICAgICAgZ2V0Q2Fub25pY2FsTURTdHJpbmcoQ29udGV4dCwgR2V0dGVyTmFtZSksCisgICAgICAgICAgICAgICAgICAgZ2V0Q2Fub25pY2FsTURTdHJpbmcoQ29udGV4dCwgU2V0dGVyTmFtZSksIEF0dHJpYnV0ZXMsIFR5cGUsCisgICAgICAgICAgICAgICAgICAgU3RvcmFnZSwgU2hvdWxkQ3JlYXRlKTsKKyAgfQorICBzdGF0aWMgRElPYmpDUHJvcGVydHkgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIE1EU3RyaW5nICpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgKkZpbGUsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRFN0cmluZyAqR2V0dGVyTmFtZSwgTURTdHJpbmcgKlNldHRlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBdHRyaWJ1dGVzLCBNZXRhZGF0YSAqVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSk7CisKKyAgVGVtcERJT2JqQ1Byb3BlcnR5IGNsb25lSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwgZ2V0TmFtZSgpLCBnZXRGaWxlKCksIGdldExpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEdldHRlck5hbWUoKSwgZ2V0U2V0dGVyTmFtZSgpLCBnZXRBdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRUeXBlKCkpOworICB9CisKK3B1YmxpYzoKKyAgREVGSU5FX01ETk9ERV9HRVQoRElPYmpDUHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgIChTdHJpbmdSZWYgTmFtZSwgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEdldHRlck5hbWUsIFN0cmluZ1JlZiBTZXR0ZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXR0cmlidXRlcywgRElUeXBlUmVmIFR5cGUpLAorICAgICAgICAgICAgICAgICAgICAoTmFtZSwgRmlsZSwgTGluZSwgR2V0dGVyTmFtZSwgU2V0dGVyTmFtZSwgQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgIFR5cGUpKQorICBERUZJTkVfTUROT0RFX0dFVChESU9iakNQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgKE1EU3RyaW5nICogTmFtZSwgTWV0YWRhdGEgKkZpbGUsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICBNRFN0cmluZyAqR2V0dGVyTmFtZSwgTURTdHJpbmcgKlNldHRlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBdHRyaWJ1dGVzLCBNZXRhZGF0YSAqVHlwZSksCisgICAgICAgICAgICAgICAgICAgIChOYW1lLCBGaWxlLCBMaW5lLCBHZXR0ZXJOYW1lLCBTZXR0ZXJOYW1lLCBBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgVHlwZSkpCisKKyAgVGVtcERJT2JqQ1Byb3BlcnR5IGNsb25lKCkgY29uc3QgeyByZXR1cm4gY2xvbmVJbXBsKCk7IH0KKworICB1bnNpZ25lZCBnZXRMaW5lKCkgY29uc3QgeyByZXR1cm4gTGluZTsgfQorICB1bnNpZ25lZCBnZXRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gQXR0cmlidXRlczsgfQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMCk7IH0KKyAgRElGaWxlICpnZXRGaWxlKCkgY29uc3QgeyByZXR1cm4gY2FzdF9vcl9udWxsPERJRmlsZT4oZ2V0UmF3RmlsZSgpKTsgfQorICBTdHJpbmdSZWYgZ2V0R2V0dGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMik7IH0KKyAgU3RyaW5nUmVmIGdldFNldHRlck5hbWUoKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmdPcGVyYW5kKDMpOyB9CisgIERJVHlwZVJlZiBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gRElUeXBlUmVmKGdldFJhd1R5cGUoKSk7IH0KKworICBTdHJpbmdSZWYgZ2V0RmlsZW5hbWUoKSBjb25zdCB7CisgICAgaWYgKGF1dG8gKkYgPSBnZXRGaWxlKCkpCisgICAgICByZXR1cm4gRi0+Z2V0RmlsZW5hbWUoKTsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0RGlyZWN0b3J5KCkgY29uc3QgeworICAgIGlmIChhdXRvICpGID0gZ2V0RmlsZSgpKQorICAgICAgcmV0dXJuIEYtPmdldERpcmVjdG9yeSgpOworICAgIHJldHVybiAiIjsKKyAgfQorCisgIE9wdGlvbmFsPFN0cmluZ1JlZj4gZ2V0U291cmNlKCkgY29uc3QgeworICAgIGlmIChhdXRvICpGID0gZ2V0RmlsZSgpKQorICAgICAgcmV0dXJuIEYtPmdldFNvdXJjZSgpOworICAgIHJldHVybiBOb25lOworICB9CisKKyAgTURTdHJpbmcgKmdldFJhd05hbWUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KDApOyB9CisgIE1ldGFkYXRhICpnZXRSYXdGaWxlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgxKTsgfQorICBNRFN0cmluZyAqZ2V0UmF3R2V0dGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmRBczxNRFN0cmluZz4oMik7IH0KKyAgTURTdHJpbmcgKmdldFJhd1NldHRlck5hbWUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KDMpOyB9CisgIE1ldGFkYXRhICpnZXRSYXdUeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCg0KTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElPYmpDUHJvcGVydHlLaW5kOworICB9Cit9OworCisvLy8gQW4gaW1wb3J0ZWQgbW9kdWxlIChDKysgdXNpbmcgZGlyZWN0aXZlIG9yIHNpbWlsYXIpLgorY2xhc3MgRElJbXBvcnRlZEVudGl0eSA6IHB1YmxpYyBESU5vZGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIHVuc2lnbmVkIExpbmU7CisKKyAgRElJbXBvcnRlZEVudGl0eShMTFZNQ29udGV4dCAmQywgU3RvcmFnZVR5cGUgU3RvcmFnZSwgdW5zaWduZWQgVGFnLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbmUsIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wcykKKyAgICAgIDogRElOb2RlKEMsIERJSW1wb3J0ZWRFbnRpdHlLaW5kLCBTdG9yYWdlLCBUYWcsIE9wcyksIExpbmUoTGluZSkge30KKyAgfkRJSW1wb3J0ZWRFbnRpdHkoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIERJSW1wb3J0ZWRFbnRpdHkgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTY29wZSAqU2NvcGUsIERJTm9kZVJlZiBFbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZSwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSkgeworICAgIHJldHVybiBnZXRJbXBsKENvbnRleHQsIFRhZywgU2NvcGUsIEVudGl0eSwgRmlsZSwgTGluZSwKKyAgICAgICAgICAgICAgICAgICBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBOYW1lKSwgU3RvcmFnZSwgU2hvdWxkQ3JlYXRlKTsKKyAgfQorICBzdGF0aWMgRElJbXBvcnRlZEVudGl0eSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSAqU2NvcGUsIE1ldGFkYXRhICpFbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhICpGaWxlLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRFN0cmluZyAqTmFtZSwgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElJbXBvcnRlZEVudGl0eSBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksIGdldFRhZygpLCBnZXRTY29wZSgpLCBnZXRFbnRpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpbGUoKSwgZ2V0TGluZSgpLCBnZXROYW1lKCkpOworICB9CisKK3B1YmxpYzoKKyAgREVGSU5FX01ETk9ERV9HRVQoRElJbXBvcnRlZEVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIFRhZywgRElTY29wZSAqU2NvcGUsIERJTm9kZVJlZiBFbnRpdHksCisgICAgICAgICAgICAgICAgICAgICBESUZpbGUgKkZpbGUsIHVuc2lnbmVkIExpbmUsIFN0cmluZ1JlZiBOYW1lID0gIiIpLAorICAgICAgICAgICAgICAgICAgICAoVGFnLCBTY29wZSwgRW50aXR5LCBGaWxlLCBMaW5lLCBOYW1lKSkKKyAgREVGSU5FX01ETk9ERV9HRVQoRElJbXBvcnRlZEVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIFRhZywgTWV0YWRhdGEgKlNjb3BlLCBNZXRhZGF0YSAqRW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgKkZpbGUsIHVuc2lnbmVkIExpbmUsIE1EU3RyaW5nICpOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgKFRhZywgU2NvcGUsIEVudGl0eSwgRmlsZSwgTGluZSwgTmFtZSkpCisKKyAgVGVtcERJSW1wb3J0ZWRFbnRpdHkgY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIHVuc2lnbmVkIGdldExpbmUoKSBjb25zdCB7IHJldHVybiBMaW5lOyB9CisgIERJU2NvcGUgKmdldFNjb3BlKCkgY29uc3QgeyByZXR1cm4gY2FzdF9vcl9udWxsPERJU2NvcGU+KGdldFJhd1Njb3BlKCkpOyB9CisgIERJTm9kZVJlZiBnZXRFbnRpdHkoKSBjb25zdCB7IHJldHVybiBESU5vZGVSZWYoZ2V0UmF3RW50aXR5KCkpOyB9CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCgyKTsgfQorICBESUZpbGUgKmdldEZpbGUoKSBjb25zdCB7IHJldHVybiBjYXN0X29yX251bGw8RElGaWxlPihnZXRSYXdGaWxlKCkpOyB9CisKKyAgTWV0YWRhdGEgKmdldFJhd1Njb3BlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICBNZXRhZGF0YSAqZ2V0UmF3RW50aXR5KCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgxKTsgfQorICBNRFN0cmluZyAqZ2V0UmF3TmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmRBczxNRFN0cmluZz4oMik7IH0KKyAgTWV0YWRhdGEgKmdldFJhd0ZpbGUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDMpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESUltcG9ydGVkRW50aXR5S2luZDsKKyAgfQorfTsKKworLy8vIEEgcGFpciBvZiBESUdsb2JhbFZhcmlhYmxlIGFuZCBESUV4cHJlc3Npb24uCitjbGFzcyBESUdsb2JhbFZhcmlhYmxlRXhwcmVzc2lvbiA6IHB1YmxpYyBNRE5vZGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIERJR2xvYmFsVmFyaWFibGVFeHByZXNzaW9uKExMVk1Db250ZXh0ICZDLCBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IE1ETm9kZShDLCBESUdsb2JhbFZhcmlhYmxlRXhwcmVzc2lvbktpbmQsIFN0b3JhZ2UsIE9wcykge30KKyAgfkRJR2xvYmFsVmFyaWFibGVFeHByZXNzaW9uKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBESUdsb2JhbFZhcmlhYmxlRXhwcmVzc2lvbiAqCisgIGdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIE1ldGFkYXRhICpWYXJpYWJsZSwgTWV0YWRhdGEgKkV4cHJlc3Npb24sCisgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElHbG9iYWxWYXJpYWJsZUV4cHJlc3Npb24gY2xvbmVJbXBsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUZW1wb3JhcnkoZ2V0Q29udGV4dCgpLCBnZXRWYXJpYWJsZSgpLCBnZXRFeHByZXNzaW9uKCkpOworICB9CisKK3B1YmxpYzoKKyAgREVGSU5FX01ETk9ERV9HRVQoRElHbG9iYWxWYXJpYWJsZUV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgIChNZXRhZGF0YSAqIFZhcmlhYmxlLCBNZXRhZGF0YSAqRXhwcmVzc2lvbiksCisgICAgICAgICAgICAgICAgICAgIChWYXJpYWJsZSwgRXhwcmVzc2lvbikpCisKKyAgVGVtcERJR2xvYmFsVmFyaWFibGVFeHByZXNzaW9uIGNsb25lKCkgY29uc3QgeyByZXR1cm4gY2xvbmVJbXBsKCk7IH0KKworICBNZXRhZGF0YSAqZ2V0UmF3VmFyaWFibGUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisKKyAgRElHbG9iYWxWYXJpYWJsZSAqZ2V0VmFyaWFibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxESUdsb2JhbFZhcmlhYmxlPihnZXRSYXdWYXJpYWJsZSgpKTsKKyAgfQorCisgIE1ldGFkYXRhICpnZXRSYXdFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgxKTsgfQorCisgIERJRXhwcmVzc2lvbiAqZ2V0RXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxESUV4cHJlc3Npb24+KGdldFJhd0V4cHJlc3Npb24oKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJR2xvYmFsVmFyaWFibGVFeHByZXNzaW9uS2luZDsKKyAgfQorfTsKKworLy8vIE1hY3JvIEluZm8gRFdBUkYtbGlrZSBtZXRhZGF0YSBub2RlLgorLy8vCisvLy8gQSBtZXRhZGF0YSBub2RlIHdpdGggYSBEV0FSRiBtYWNybyBpbmZvIChpLmUuLCBhIGNvbnN0YW50IG5hbWVkCisvLy8gXGMgRFdfTUFDSU5GT18qLCBkZWZpbmVkIGluIGxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmgpLiAgQ2FsbGVkIFxhCisvLy8gRElNYWNyb05vZGUKKy8vLyBiZWNhdXNlIGl0J3MgcG90ZW50aWFsbHkgdXNlZCBmb3Igbm9uLURXQVJGIG91dHB1dC4KK2NsYXNzIERJTWFjcm9Ob2RlIDogcHVibGljIE1ETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKK3Byb3RlY3RlZDoKKyAgRElNYWNyb05vZGUoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIElELCBTdG9yYWdlVHlwZSBTdG9yYWdlLCB1bnNpZ25lZCBNSVR5cGUsCisgICAgICAgICAgICAgIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wczEsIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wczIgPSBOb25lKQorICAgICAgOiBNRE5vZGUoQywgSUQsIFN0b3JhZ2UsIE9wczEsIE9wczIpIHsKKyAgICBhc3NlcnQoTUlUeXBlIDwgMXUgPDwgMTYpOworICAgIFN1YmNsYXNzRGF0YTE2ID0gTUlUeXBlOworICB9CisgIH5ESU1hY3JvTm9kZSgpID0gZGVmYXVsdDsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHk+IFR5ICpnZXRPcGVyYW5kQXModW5zaWduZWQgSSkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8VHk+KGdldE9wZXJhbmQoSSkpOworICB9CisKKyAgU3RyaW5nUmVmIGdldFN0cmluZ09wZXJhbmQodW5zaWduZWQgSSkgY29uc3QgeworICAgIGlmIChhdXRvICpTID0gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPihJKSkKKyAgICAgIHJldHVybiBTLT5nZXRTdHJpbmcoKTsKKyAgICByZXR1cm4gU3RyaW5nUmVmKCk7CisgIH0KKworICBzdGF0aWMgTURTdHJpbmcgKmdldENhbm9uaWNhbE1EU3RyaW5nKExMVk1Db250ZXh0ICZDb250ZXh0LCBTdHJpbmdSZWYgUykgeworICAgIGlmIChTLmVtcHR5KCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gTURTdHJpbmc6OmdldChDb250ZXh0LCBTKTsKKyAgfQorCitwdWJsaWM6CisgIHVuc2lnbmVkIGdldE1hY2luZm9UeXBlKCkgY29uc3QgeyByZXR1cm4gU3ViY2xhc3NEYXRhMTY7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHN3aXRjaCAoTUQtPmdldE1ldGFkYXRhSUQoKSkgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBESU1hY3JvS2luZDoKKyAgICBjYXNlIERJTWFjcm9GaWxlS2luZDoKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorfTsKKworY2xhc3MgRElNYWNybyA6IHB1YmxpYyBESU1hY3JvTm9kZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKKyAgdW5zaWduZWQgTGluZTsKKworICBESU1hY3JvKExMVk1Db250ZXh0ICZDLCBTdG9yYWdlVHlwZSBTdG9yYWdlLCB1bnNpZ25lZCBNSVR5cGUsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESU1hY3JvTm9kZShDLCBESU1hY3JvS2luZCwgU3RvcmFnZSwgTUlUeXBlLCBPcHMpLCBMaW5lKExpbmUpIHt9CisgIH5ESU1hY3JvKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBESU1hY3JvICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCB1bnNpZ25lZCBNSVR5cGUsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgVmFsdWUsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSkgeworICAgIHJldHVybiBnZXRJbXBsKENvbnRleHQsIE1JVHlwZSwgTGluZSwgZ2V0Q2Fub25pY2FsTURTdHJpbmcoQ29udGV4dCwgTmFtZSksCisgICAgICAgICAgICAgICAgICAgZ2V0Q2Fub25pY2FsTURTdHJpbmcoQ29udGV4dCwgVmFsdWUpLCBTdG9yYWdlLCBTaG91bGRDcmVhdGUpOworICB9CisgIHN0YXRpYyBESU1hY3JvICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCB1bnNpZ25lZCBNSVR5cGUsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1EU3RyaW5nICpOYW1lLCBNRFN0cmluZyAqVmFsdWUsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSk7CisKKyAgVGVtcERJTWFjcm8gY2xvbmVJbXBsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUZW1wb3JhcnkoZ2V0Q29udGV4dCgpLCBnZXRNYWNpbmZvVHlwZSgpLCBnZXRMaW5lKCksIGdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlKCkpOworICB9CisKK3B1YmxpYzoKKyAgREVGSU5FX01ETk9ERV9HRVQoRElNYWNybywgKHVuc2lnbmVkIE1JVHlwZSwgdW5zaWduZWQgTGluZSwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVmFsdWUgPSAiIiksCisgICAgICAgICAgICAgICAgICAgIChNSVR5cGUsIExpbmUsIE5hbWUsIFZhbHVlKSkKKyAgREVGSU5FX01ETk9ERV9HRVQoRElNYWNybywgKHVuc2lnbmVkIE1JVHlwZSwgdW5zaWduZWQgTGluZSwgTURTdHJpbmcgKk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRFN0cmluZyAqVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAoTUlUeXBlLCBMaW5lLCBOYW1lLCBWYWx1ZSkpCisKKyAgVGVtcERJTWFjcm8gY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIHVuc2lnbmVkIGdldExpbmUoKSBjb25zdCB7IHJldHVybiBMaW5lOyB9CisKKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmdPcGVyYW5kKDApOyB9CisgIFN0cmluZ1JlZiBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMSk7IH0KKworICBNRFN0cmluZyAqZ2V0UmF3TmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmRBczxNRFN0cmluZz4oMCk7IH0KKyAgTURTdHJpbmcgKmdldFJhd1ZhbHVlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPigxKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElNYWNyb0tpbmQ7CisgIH0KK307CisKK2NsYXNzIERJTWFjcm9GaWxlIDogcHVibGljIERJTWFjcm9Ob2RlIHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIE1ETm9kZTsKKworICB1bnNpZ25lZCBMaW5lOworCisgIERJTWFjcm9GaWxlKExMVk1Db250ZXh0ICZDLCBTdG9yYWdlVHlwZSBTdG9yYWdlLCB1bnNpZ25lZCBNSVR5cGUsCisgICAgICAgICAgICAgIHVuc2lnbmVkIExpbmUsIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wcykKKyAgICAgIDogRElNYWNyb05vZGUoQywgRElNYWNyb0ZpbGVLaW5kLCBTdG9yYWdlLCBNSVR5cGUsIE9wcyksIExpbmUoTGluZSkge30KKyAgfkRJTWFjcm9GaWxlKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBESU1hY3JvRmlsZSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgTUlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZSwgRElGaWxlICpGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElNYWNyb05vZGVBcnJheSBFbGVtZW50cywgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSkgeworICAgIHJldHVybiBnZXRJbXBsKENvbnRleHQsIE1JVHlwZSwgTGluZSwgc3RhdGljX2Nhc3Q8TWV0YWRhdGEgKj4oRmlsZSksCisgICAgICAgICAgICAgICAgICAgRWxlbWVudHMuZ2V0KCksIFN0b3JhZ2UsIFNob3VsZENyZWF0ZSk7CisgIH0KKworICBzdGF0aWMgRElNYWNyb0ZpbGUgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIE1JVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbmUsIE1ldGFkYXRhICpGaWxlLCBNZXRhZGF0YSAqRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworCisgIFRlbXBESU1hY3JvRmlsZSBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksIGdldE1hY2luZm9UeXBlKCksIGdldExpbmUoKSwgZ2V0RmlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RWxlbWVudHMoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESU1hY3JvRmlsZSwgKHVuc2lnbmVkIE1JVHlwZSwgdW5zaWduZWQgTGluZSwgRElGaWxlICpGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJTWFjcm9Ob2RlQXJyYXkgRWxlbWVudHMpLAorICAgICAgICAgICAgICAgICAgICAoTUlUeXBlLCBMaW5lLCBGaWxlLCBFbGVtZW50cykpCisgIERFRklORV9NRE5PREVfR0VUKERJTWFjcm9GaWxlLCAodW5zaWduZWQgTUlUeXBlLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhICpGaWxlLCBNZXRhZGF0YSAqRWxlbWVudHMpLAorICAgICAgICAgICAgICAgICAgICAoTUlUeXBlLCBMaW5lLCBGaWxlLCBFbGVtZW50cykpCisKKyAgVGVtcERJTWFjcm9GaWxlIGNsb25lKCkgY29uc3QgeyByZXR1cm4gY2xvbmVJbXBsKCk7IH0KKworICB2b2lkIHJlcGxhY2VFbGVtZW50cyhESU1hY3JvTm9kZUFycmF5IEVsZW1lbnRzKSB7CisjaWZuZGVmIE5ERUJVRworICAgIGZvciAoRElNYWNyb05vZGUgKk9wIDogZ2V0RWxlbWVudHMoKSkKKyAgICAgIGFzc2VydChpc19jb250YWluZWQoRWxlbWVudHMtPm9wZXJhbmRzKCksIE9wKSAmJgorICAgICAgICAgICAgICJMb3N0IGEgbWFjcm8gbm9kZSBkdXJpbmcgbWFjcm8gbm9kZSBsaXN0IHJlcGxhY2VtZW50Iik7CisjZW5kaWYKKyAgICByZXBsYWNlT3BlcmFuZFdpdGgoMSwgRWxlbWVudHMuZ2V0KCkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TGluZSgpIGNvbnN0IHsgcmV0dXJuIExpbmU7IH0KKyAgRElGaWxlICpnZXRGaWxlKCkgY29uc3QgeyByZXR1cm4gY2FzdF9vcl9udWxsPERJRmlsZT4oZ2V0UmF3RmlsZSgpKTsgfQorCisgIERJTWFjcm9Ob2RlQXJyYXkgZ2V0RWxlbWVudHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxNRFR1cGxlPihnZXRSYXdFbGVtZW50cygpKTsKKyAgfQorCisgIE1ldGFkYXRhICpnZXRSYXdGaWxlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICBNZXRhZGF0YSAqZ2V0UmF3RWxlbWVudHMoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDEpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESU1hY3JvRmlsZUtpbmQ7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyN1bmRlZiBERUZJTkVfTUROT0RFX0dFVF9VTlBBQ0tfSU1QTAorI3VuZGVmIERFRklORV9NRE5PREVfR0VUX1VOUEFDSworI3VuZGVmIERFRklORV9NRE5PREVfR0VUCisKKyNlbmRpZiAvLyBMTFZNX0lSX0RFQlVHSU5GT01FVEFEQVRBX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRGVidWdMb2MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRGVidWdMb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWYxMjEyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EZWJ1Z0xvYy5oCkBAIC0wLDAgKzEsMTI2IEBACisvLz09PS0gRGVidWdMb2MuaCAtIERlYnVnIExvY2F0aW9uIEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgbnVtYmVyIG9mIGxpZ2h0IHdlaWdodCBkYXRhIHN0cnVjdHVyZXMgdXNlZAorLy8gdG8gZGVzY3JpYmUgYW5kIHRyYWNrIGRlYnVnIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9ERUJVR0xPQ19ICisjZGVmaW5lIExMVk1fSVJfREVCVUdMT0NfSAorCisjaW5jbHVkZSAibGx2bS9JUi9UcmFja2luZ01EUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgTExWTUNvbnRleHQ7CisgIGNsYXNzIHJhd19vc3RyZWFtOworICBjbGFzcyBESUxvY2F0aW9uOworCisgIC8vLyBcYnJpZWYgQSBkZWJ1ZyBpbmZvIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgY2xhc3MgaXMgYSB3cmFwcGVyIGFyb3VuZCBhIHRyYWNraW5nIHJlZmVyZW5jZSB0byBhbiBcYSBESUxvY2F0aW9uCisgIC8vLyBwb2ludGVyLgorICAvLy8KKyAgLy8vIFRvIGF2b2lkIGV4dHJhIGluY2x1ZGVzLCBcYSBEZWJ1Z0xvYyBkb3VibGVzIHRoZSBcYSBESUxvY2F0aW9uIEFQSSB3aXRoIGEKKyAgLy8vIG9uZSBiYXNlZCBvbiByZWxhdGl2ZWx5IG9wYXF1ZSBcYSBNRE5vZGUgcG9pbnRlcnMuCisgIGNsYXNzIERlYnVnTG9jIHsKKyAgICBUcmFja2luZ01ETm9kZVJlZiBMb2M7CisKKyAgcHVibGljOgorICAgIERlYnVnTG9jKCkgPSBkZWZhdWx0OworCisgICAgLy8vIFxicmllZiBDb25zdHJ1Y3QgZnJvbSBhbiBcYSBESUxvY2F0aW9uLgorICAgIERlYnVnTG9jKGNvbnN0IERJTG9jYXRpb24gKkwpOworCisgICAgLy8vIFxicmllZiBDb25zdHJ1Y3QgZnJvbSBhbiBcYSBNRE5vZGUuCisgICAgLy8vCisgICAgLy8vIE5vdGU6IGlmIFxjIE4gaXMgbm90IGFuIFxhIERJTG9jYXRpb24sIGEgdmVyaWZpZXIgY2hlY2sgd2lsbCBmYWlsLCBhbmQKKyAgICAvLy8gYWNjZXNzb3JzIHdpbGwgY3Jhc2guICBIb3dldmVyLCBjb25zdHJ1Y3Rpb24gZnJvbSBvdGhlciBub2RlcyBpcworICAgIC8vLyBzdXBwb3J0ZWQgaW4gb3JkZXIgdG8gaGFuZGxlIGZvcndhcmQgcmVmZXJlbmNlcyB3aGVuIHJlYWRpbmcgdGV4dHVhbAorICAgIC8vLyBJUi4KKyAgICBleHBsaWNpdCBEZWJ1Z0xvYyhjb25zdCBNRE5vZGUgKk4pOworCisgICAgLy8vIFxicmllZiBHZXQgdGhlIHVuZGVybHlpbmcgXGEgRElMb2NhdGlvbi4KKyAgICAvLy8KKyAgICAvLy8gXHByZSAhKnRoaXMgb3IgXGMgaXNhPERJTG9jYXRpb24+KGdldEFzTUROb2RlKCkpLgorICAgIC8vLyBAeworICAgIERJTG9jYXRpb24gKmdldCgpIGNvbnN0OworICAgIG9wZXJhdG9yIERJTG9jYXRpb24gKigpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisgICAgRElMb2NhdGlvbiAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisgICAgRElMb2NhdGlvbiAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKmdldCgpOyB9CisgICAgLy8vIEB9CisKKyAgICAvLy8gXGJyaWVmIENoZWNrIGZvciBudWxsLgorICAgIC8vLworICAgIC8vLyBDaGVjayBmb3IgbnVsbCBpbiBhIHdheSB0aGF0IGlzIHNhZmUgd2l0aCBicm9rZW4gZGVidWcgaW5mby4gIFVubGlrZQorICAgIC8vLyB0aGUgY29udmVyc2lvbiB0byBcYyBESUxvY2F0aW9uLCB0aGlzIGRvZXNuJ3QgcmVxdWlyZSB0aGF0IFxjIExvYyBpcyBvZgorICAgIC8vLyB0aGUgcmlnaHQgdHlwZS4gIEltcG9ydGFudCBmb3IgY2FzZXMgbGlrZSBcYSBsbHZtOjpTdHJpcERlYnVnSW5mbygpIGFuZAorICAgIC8vLyBcYSBJbnN0cnVjdGlvbjo6aGFzTWV0YWRhdGEoKS4KKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9CisKKyAgICAvLy8gXGJyaWVmIENoZWNrIHdoZXRoZXIgdGhpcyBoYXMgYSB0cml2aWFsIGRlc3RydWN0b3IuCisgICAgYm9vbCBoYXNUcml2aWFsRGVzdHJ1Y3RvcigpIGNvbnN0IHsgcmV0dXJuIExvYy5oYXNUcml2aWFsRGVzdHJ1Y3RvcigpOyB9CisKKyAgICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyBEZWJ1Z0xvYy4KKyAgICAvLy8KKyAgICAvLy8gQ3JlYXRlIGEgbmV3IERlYnVnTG9jIGF0IHRoZSBzcGVjaWZpZWQgbGluZS9jb2wgYW5kIHNjb3BlL2lubGluZS4gIFRoaXMKKyAgICAvLy8gZm9yd2FyZHMgdG8gXGEgRElMb2NhdGlvbjo6Z2V0KCkuCisgICAgLy8vCisgICAgLy8vIElmIFxjICFTY29wZSwgcmV0dXJucyBhIGRlZmF1bHQtY29uc3RydWN0ZWQgXGEgRGVidWdMb2MuCisgICAgLy8vCisgICAgLy8vIEZJWE1FOiBSZW1vdmUgdGhpcy4gIFVzZXJzIHNob3VsZCB1c2UgRElMb2NhdGlvbjo6Z2V0KCkuCisgICAgc3RhdGljIERlYnVnTG9jIGdldCh1bnNpZ25lZCBMaW5lLCB1bnNpZ25lZCBDb2wsIGNvbnN0IE1ETm9kZSAqU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKklubGluZWRBdCA9IG51bGxwdHIpOworCisgICAgZW51bSB7IFJlcGxhY2VMYXN0SW5saW5lZEF0ID0gdHJ1ZSB9OworICAgIC8vLyBSZWJ1aWxkIHRoZSBlbnRpcmUgaW5saW5lZC1hdCBjaGFpbiBmb3IgdGhpcyBpbnN0cnVjdGlvbiBzbyB0aGF0IHRoZSB0b3Agb2YKKyAgICAvLy8gdGhlIGNoYWluIG5vdyBpcyBpbmxpbmVkLWF0IHRoZSBuZXcgY2FsbCBzaXRlLgorICAgIC8vLyBccGFyYW0gICBJbmxpbmVkQXQgICAgVGhlIG5ldyBvdXRlcm1vc3QgaW5saW5lZC1hdCBpbiB0aGUgY2hhaW4uCisgICAgLy8vIFxwYXJhbSAgIFJlcGxhY2VMYXN0ICBSZXBsYWNlIHRoZSBsYXN0IGxvY2F0aW9uIGluIHRoZSBpbmxpbmVkLWF0IGNoYWluLgorICAgIHN0YXRpYyBEZWJ1Z0xvYyBhcHBlbmRJbmxpbmVkQXQoRGVidWdMb2MgREwsIERJTG9jYXRpb24gKklubGluZWRBdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxjb25zdCBNRE5vZGUgKiwgTUROb2RlICo+ICZDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVwbGFjZUxhc3QgPSBmYWxzZSk7CisKKyAgICB1bnNpZ25lZCBnZXRMaW5lKCkgY29uc3Q7CisgICAgdW5zaWduZWQgZ2V0Q29sKCkgY29uc3Q7CisgICAgTUROb2RlICpnZXRTY29wZSgpIGNvbnN0OworICAgIERJTG9jYXRpb24gKmdldElubGluZWRBdCgpIGNvbnN0OworCisgICAgLy8vIFxicmllZiBHZXQgdGhlIGZ1bGx5IGlubGluZWQtYXQgc2NvcGUgZm9yIGEgRGVidWdMb2MuCisgICAgLy8vCisgICAgLy8vIEdldHMgdGhlIGlubGluZWQtYXQgc2NvcGUgZm9yIGEgRGVidWdMb2MuCisgICAgTUROb2RlICpnZXRJbmxpbmVkQXRTY29wZSgpIGNvbnN0OworCisgICAgLy8vIFxicmllZiBGaW5kIHRoZSBkZWJ1ZyBpbmZvIGxvY2F0aW9uIGZvciB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLgorICAgIC8vLworICAgIC8vLyBXYWxrIHVwIHRoZSBzY29wZSBjaGFpbiBvZiBnaXZlbiBkZWJ1ZyBsb2MgYW5kIGZpbmQgbGluZSBudW1iZXIgaW5mbworICAgIC8vLyBmb3IgdGhlIGZ1bmN0aW9uLgorICAgIC8vLworICAgIC8vLyBGSVhNRTogUmVtb3ZlIHRoaXMuICBVc2VycyBzaG91bGQgdXNlIERJTG9jYXRpb24vRElMb2NhbFNjb3BlIEFQSSB0bworICAgIC8vLyBmaW5kIHRoZSBzdWJwcm9ncmFtLCBhbmQgdGhlbiBESUxvY2F0aW9uOjpnZXQoKS4KKyAgICBEZWJ1Z0xvYyBnZXRGbkRlYnVnTG9jKCkgY29uc3Q7CisKKyAgICAvLy8gXGJyaWVmIFJldHVybiBcYyB0aGlzIGFzIGEgYmFyIFxhIE1ETm9kZS4KKyAgICBNRE5vZGUgKmdldEFzTUROb2RlKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRGVidWdMb2MgJkRMKSBjb25zdCB7IHJldHVybiBMb2MgPT0gREwuTG9jOyB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IERlYnVnTG9jICZETCkgY29uc3QgeyByZXR1cm4gTG9jICE9IERMLkxvYzsgfQorCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgICAvLy8gXGJyaWVmIHByaW50cyBzb3VyY2UgbG9jYXRpb24gL3BhdGgvdG8vZmlsZS5leGU6bGluZTpjb2wgQFtpbmxpbmVkIGF0XQorICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8qIExMVk1fU1VQUE9SVF9ERUJVR0xPQ19IICovCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0Rlcml2ZWRUeXBlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EZXJpdmVkVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTVlMDg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EZXJpdmVkVHlwZXMuaApAQCAtMCwwICsxLDUwOSBAQAorLy89PT0tIGxsdm0vRGVyaXZlZFR5cGVzLmggLSBDbGFzc2VzIGZvciBoYW5kbGluZyBkYXRhIHR5cGVzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBvZiBjbGFzc2VzIHRoYXQgcmVwcmVzZW50ICJkZXJpdmVkCisvLyB0eXBlcyIuICBUaGVzZSBhcmUgdGhpbmdzIGxpa2UgImFycmF5cyBvZiB4IiBvciAic3RydWN0dXJlIG9mIHgsIHksIHoiIG9yCisvLyAiZnVuY3Rpb24gcmV0dXJuaW5nIHggdGFraW5nICh5LHopIGFzIHBhcmFtZXRlcnMiLCBldGMuLi4KKy8vCisvLyBUaGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZXNlIGNsYXNzZXMgbGl2ZSBpbiB0aGUgVHlwZS5jcHAgZmlsZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfREVSSVZFRFRZUEVTX0gKKyNkZWZpbmUgTExWTV9JUl9ERVJJVkVEVFlQRVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBWYWx1ZTsKK2NsYXNzIEFQSW50OworY2xhc3MgTExWTUNvbnRleHQ7CisKKy8vLyBDbGFzcyB0byByZXByZXNlbnQgaW50ZWdlciB0eXBlcy4gTm90ZSB0aGF0IHRoaXMgY2xhc3MgaXMgYWxzbyB1c2VkIHRvCisvLy8gcmVwcmVzZW50IHRoZSBidWlsdC1pbiBpbnRlZ2VyIHR5cGVzOiBJbnQxVHksIEludDhUeSwgSW50MTZUeSwgSW50MzJUeSBhbmQKKy8vLyBJbnQ2NFR5LgorLy8vIEBicmllZiBJbnRlZ2VyIHJlcHJlc2VudGF0aW9uIHR5cGUKK2NsYXNzIEludGVnZXJUeXBlIDogcHVibGljIFR5cGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEludGVnZXJUeXBlKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBOdW1CaXRzKSA6IFR5cGUoQywgSW50ZWdlclR5SUQpeworICAgIHNldFN1YmNsYXNzRGF0YShOdW1CaXRzKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBUaGlzIGVudW0gaXMganVzdCB1c2VkIHRvIGhvbGQgY29uc3RhbnRzIHdlIG5lZWQgZm9yIEludGVnZXJUeXBlLgorICBlbnVtIHsKKyAgICBNSU5fSU5UX0JJVFMgPSAxLCAgICAgICAgLy8vPCBNaW5pbXVtIG51bWJlciBvZiBiaXRzIHRoYXQgY2FuIGJlIHNwZWNpZmllZAorICAgIE1BWF9JTlRfQklUUyA9ICgxPDwyNCktMSAvLy88IE1heGltdW0gbnVtYmVyIG9mIGJpdHMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkCisgICAgICAvLy88IE5vdGUgdGhhdCBiaXQgd2lkdGggaXMgc3RvcmVkIGluIHRoZSBUeXBlIGNsYXNzZXMgU3ViY2xhc3NEYXRhIGZpZWxkCisgICAgICAvLy88IHdoaWNoIGhhcyAyNCBiaXRzLiBUaGlzIHlpZWxkcyBhIG1heGltdW0gYml0IHdpZHRoIG9mIDE2LDc3NywyMTUKKyAgICAgIC8vLzwgYml0cy4KKyAgfTsKKworICAvLy8gVGhpcyBzdGF0aWMgbWV0aG9kIGlzIHRoZSBwcmltYXJ5IHdheSBvZiBjb25zdHJ1Y3RpbmcgYW4gSW50ZWdlclR5cGUuCisgIC8vLyBJZiBhbiBJbnRlZ2VyVHlwZSB3aXRoIHRoZSBzYW1lIE51bUJpdHMgdmFsdWUgd2FzIHByZXZpb3VzbHkgaW5zdGFudGlhdGVkLAorICAvLy8gdGhhdCBpbnN0YW5jZSB3aWxsIGJlIHJldHVybmVkLiBPdGhlcndpc2UgYSBuZXcgb25lIHdpbGwgYmUgY3JlYXRlZC4gT25seQorICAvLy8gb25lIGluc3RhbmNlIHdpdGggYSBnaXZlbiBOdW1CaXRzIHZhbHVlIGlzIGV2ZXIgY3JlYXRlZC4KKyAgLy8vIEBicmllZiBHZXQgb3IgY3JlYXRlIGFuIEludGVnZXJUeXBlIGluc3RhbmNlLgorICBzdGF0aWMgSW50ZWdlclR5cGUgKmdldChMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgTnVtQml0cyk7CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoaXMgSW50ZWdlclR5cGUKKyAgdW5zaWduZWQgZ2V0Qml0V2lkdGgoKSBjb25zdCB7IHJldHVybiBnZXRTdWJjbGFzc0RhdGEoKTsgfQorCisgIC8vLyBSZXR1cm4gYSBiaXRtYXNrIHdpdGggb25lcyBzZXQgZm9yIGFsbCBvZiB0aGUgYml0cyB0aGF0IGNhbiBiZSBzZXQgYnkgYW4KKyAgLy8vIHVuc2lnbmVkIHZlcnNpb24gb2YgdGhpcyB0eXBlLiBUaGlzIGlzIDB4RkYgZm9yIGk4LCAweEZGRkYgZm9yIGkxNiwgZXRjLgorICB1aW50NjRfdCBnZXRCaXRNYXNrKCkgY29uc3QgeworICAgIHJldHVybiB+dWludDY0X3QoMFVMKSA+PiAoNjQtZ2V0Qml0V2lkdGgoKSk7CisgIH0KKworICAvLy8gUmV0dXJuIGEgdWludDY0X3Qgd2l0aCBqdXN0IHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBzZXQgKHRoZSBzaWduIGJpdCwgaWYKKyAgLy8vIHRoZSB2YWx1ZSBpcyB0cmVhdGVkIGFzIGEgc2lnbmVkIG51bWJlcikuCisgIHVpbnQ2NF90IGdldFNpZ25CaXQoKSBjb25zdCB7CisgICAgcmV0dXJuIDFVTEwgPDwgKGdldEJpdFdpZHRoKCktMSk7CisgIH0KKworICAvLy8gRm9yIGV4YW1wbGUsIHRoaXMgaXMgMHhGRiBmb3IgYW4gOCBiaXQgaW50ZWdlciwgMHhGRkZGIGZvciBpMTYsIGV0Yy4KKyAgLy8vIEByZXR1cm5zIGEgYml0IG1hc2sgd2l0aCBvbmVzIHNldCBmb3IgYWxsIHRoZSBiaXRzIG9mIHRoaXMgdHlwZS4KKyAgLy8vIEBicmllZiBHZXQgYSBiaXQgbWFzayBmb3IgdGhpcyB0eXBlLgorICBBUEludCBnZXRNYXNrKCkgY29uc3Q7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGRldGVybWluZXMgaWYgdGhlIHdpZHRoIG9mIHRoaXMgSW50ZWdlclR5cGUgaXMgYSBwb3dlci1vZi0yCisgIC8vLyBpbiB0ZXJtcyBvZiA4IGJpdCBieXRlcy4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHBvd2VyLW9mLTIgYnl0ZSB3aWR0aC4KKyAgLy8vIEBicmllZiBJcyB0aGlzIGEgcG93ZXItb2YtMiBieXRlLXdpZHRoIEludGVnZXJUeXBlID8KKyAgYm9vbCBpc1Bvd2VyT2YyQnl0ZVdpZHRoKCkgY29uc3Q7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3QuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlSUQoKSA9PSBJbnRlZ2VyVHlJRDsKKyAgfQorfTsKKwordW5zaWduZWQgVHlwZTo6Z2V0SW50ZWdlckJpdFdpZHRoKCkgY29uc3QgeworICByZXR1cm4gY2FzdDxJbnRlZ2VyVHlwZT4odGhpcyktPmdldEJpdFdpZHRoKCk7Cit9CisKKy8vLyBDbGFzcyB0byByZXByZXNlbnQgZnVuY3Rpb24gdHlwZXMKKy8vLworY2xhc3MgRnVuY3Rpb25UeXBlIDogcHVibGljIFR5cGUgeworICBGdW5jdGlvblR5cGUoVHlwZSAqUmVzdWx0LCBBcnJheVJlZjxUeXBlKj4gUGFyYW1zLCBib29sIElzVmFyQXJncyk7CisKK3B1YmxpYzoKKyAgRnVuY3Rpb25UeXBlKGNvbnN0IEZ1bmN0aW9uVHlwZSAmKSA9IGRlbGV0ZTsKKyAgRnVuY3Rpb25UeXBlICZvcGVyYXRvcj0oY29uc3QgRnVuY3Rpb25UeXBlICYpID0gZGVsZXRlOworCisgIC8vLyBUaGlzIHN0YXRpYyBtZXRob2QgaXMgdGhlIHByaW1hcnkgd2F5IG9mIGNvbnN0cnVjdGluZyBhIEZ1bmN0aW9uVHlwZS4KKyAgc3RhdGljIEZ1bmN0aW9uVHlwZSAqZ2V0KFR5cGUgKlJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFR5cGUqPiBQYXJhbXMsIGJvb2wgaXNWYXJBcmcpOworCisgIC8vLyBDcmVhdGUgYSBGdW5jdGlvblR5cGUgdGFraW5nIG5vIHBhcmFtZXRlcnMuCisgIHN0YXRpYyBGdW5jdGlvblR5cGUgKmdldChUeXBlICpSZXN1bHQsIGJvb2wgaXNWYXJBcmcpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgdmFsaWQgYXMgYSByZXR1cm4gdHlwZS4KKyAgc3RhdGljIGJvb2wgaXNWYWxpZFJldHVyblR5cGUoVHlwZSAqUmV0VHkpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgdmFsaWQgYXMgYW4gYXJndW1lbnQgdHlwZS4KKyAgc3RhdGljIGJvb2wgaXNWYWxpZEFyZ3VtZW50VHlwZShUeXBlICpBcmdUeSk7CisKKyAgYm9vbCBpc1ZhckFyZygpIGNvbnN0IHsgcmV0dXJuIGdldFN1YmNsYXNzRGF0YSgpIT0wOyB9CisgIFR5cGUgKmdldFJldHVyblR5cGUoKSBjb25zdCB7IHJldHVybiBDb250YWluZWRUeXNbMF07IH0KKworICB1c2luZyBwYXJhbV9pdGVyYXRvciA9IFR5cGU6OnN1YnR5cGVfaXRlcmF0b3I7CisKKyAgcGFyYW1faXRlcmF0b3IgcGFyYW1fYmVnaW4oKSBjb25zdCB7IHJldHVybiBDb250YWluZWRUeXMgKyAxOyB9CisgIHBhcmFtX2l0ZXJhdG9yIHBhcmFtX2VuZCgpIGNvbnN0IHsgcmV0dXJuICZDb250YWluZWRUeXNbTnVtQ29udGFpbmVkVHlzXTsgfQorICBBcnJheVJlZjxUeXBlICo+IHBhcmFtcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZUFycmF5UmVmKHBhcmFtX2JlZ2luKCksIHBhcmFtX2VuZCgpKTsKKyAgfQorCisgIC8vLyBQYXJhbWV0ZXIgdHlwZSBhY2Nlc3NvcnMuCisgIFR5cGUgKmdldFBhcmFtVHlwZSh1bnNpZ25lZCBpKSBjb25zdCB7IHJldHVybiBDb250YWluZWRUeXNbaSsxXTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBmaXhlZCBwYXJhbWV0ZXJzIHRoaXMgZnVuY3Rpb24gdHlwZSByZXF1aXJlcy4KKyAgLy8vIFRoaXMgZG9lcyBub3QgY29uc2lkZXIgdmFyYXJncy4KKyAgdW5zaWduZWQgZ2V0TnVtUGFyYW1zKCkgY29uc3QgeyByZXR1cm4gTnVtQ29udGFpbmVkVHlzIC0gMTsgfQorCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0LgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUlEKCkgPT0gRnVuY3Rpb25UeUlEOworICB9Cit9Oworc3RhdGljX2Fzc2VydChhbGlnbm9mKEZ1bmN0aW9uVHlwZSkgPj0gYWxpZ25vZihUeXBlICopLAorICAgICAgICAgICAgICAiQWxpZ25tZW50IHN1ZmZpY2llbnQgZm9yIG9iamVjdHMgYXBwZW5kZWQgdG8gRnVuY3Rpb25UeXBlIik7CisKK2Jvb2wgVHlwZTo6aXNGdW5jdGlvblZhckFyZygpIGNvbnN0IHsKKyAgcmV0dXJuIGNhc3Q8RnVuY3Rpb25UeXBlPih0aGlzKS0+aXNWYXJBcmcoKTsKK30KKworVHlwZSAqVHlwZTo6Z2V0RnVuY3Rpb25QYXJhbVR5cGUodW5zaWduZWQgaSkgY29uc3QgeworICByZXR1cm4gY2FzdDxGdW5jdGlvblR5cGU+KHRoaXMpLT5nZXRQYXJhbVR5cGUoaSk7Cit9CisKK3Vuc2lnbmVkIFR5cGU6OmdldEZ1bmN0aW9uTnVtUGFyYW1zKCkgY29uc3QgeworICByZXR1cm4gY2FzdDxGdW5jdGlvblR5cGU+KHRoaXMpLT5nZXROdW1QYXJhbXMoKTsKK30KKworLy8vIENvbW1vbiBzdXBlciBjbGFzcyBvZiBBcnJheVR5cGUsIFN0cnVjdFR5cGUgYW5kIFZlY3RvclR5cGUuCitjbGFzcyBDb21wb3NpdGVUeXBlIDogcHVibGljIFR5cGUgeworcHJvdGVjdGVkOgorICBleHBsaWNpdCBDb21wb3NpdGVUeXBlKExMVk1Db250ZXh0ICZDLCBUeXBlSUQgdGlkKSA6IFR5cGUoQywgdGlkKSB7fQorCitwdWJsaWM6CisgIC8vLyBHaXZlbiBhbiBpbmRleCB2YWx1ZSBpbnRvIHRoZSB0eXBlLCByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQuCisgIFR5cGUgKmdldFR5cGVBdEluZGV4KGNvbnN0IFZhbHVlICpWKSBjb25zdDsKKyAgVHlwZSAqZ2V0VHlwZUF0SW5kZXgodW5zaWduZWQgSWR4KSBjb25zdDsKKyAgYm9vbCBpbmRleFZhbGlkKGNvbnN0IFZhbHVlICpWKSBjb25zdDsKKyAgYm9vbCBpbmRleFZhbGlkKHVuc2lnbmVkIElkeCkgY29uc3Q7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3QuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlSUQoKSA9PSBBcnJheVR5SUQgfHwKKyAgICAgICAgICAgVC0+Z2V0VHlwZUlEKCkgPT0gU3RydWN0VHlJRCB8fAorICAgICAgICAgICBULT5nZXRUeXBlSUQoKSA9PSBWZWN0b3JUeUlEOworICB9Cit9OworCisvLy8gQ2xhc3MgdG8gcmVwcmVzZW50IHN0cnVjdCB0eXBlcy4gVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQga2luZHMgb2Ygc3RydWN0CisvLy8gdHlwZXM6IExpdGVyYWwgc3RydWN0cyBhbmQgSWRlbnRpZmllZCBzdHJ1Y3RzLgorLy8vCisvLy8gTGl0ZXJhbCBzdHJ1Y3QgdHlwZXMgKGUuZy4geyBpMzIsIGkzMiB9KSBhcmUgdW5pcXVlZCBzdHJ1Y3R1cmFsbHksIGFuZCBtdXN0CisvLy8gYWx3YXlzIGhhdmUgYSBib2R5IHdoZW4gY3JlYXRlZC4gIFlvdSBjYW4gZ2V0IG9uZSBvZiB0aGVzZSBieSB1c2luZyBvbmUgb2YKKy8vLyB0aGUgU3RydWN0VHlwZTo6Z2V0KCkgZm9ybXMuCisvLy8KKy8vLyBJZGVudGlmaWVkIHN0cnVjdHMgKGUuZy4gJWZvbyBvciAlNDIpIG1heSBvcHRpb25hbGx5IGhhdmUgYSBuYW1lIGFuZCBhcmUgbm90CisvLy8gdW5pcXVlZC4gIFRoZSBuYW1lcyBmb3IgaWRlbnRpZmllZCBzdHJ1Y3RzIGFyZSBtYW5hZ2VkIGF0IHRoZSBMTFZNQ29udGV4dAorLy8vIGxldmVsLCBzbyB0aGVyZSBjYW4gb25seSBiZSBhIHNpbmdsZSBpZGVudGlmaWVkIHN0cnVjdCB3aXRoIGEgZ2l2ZW4gbmFtZSBpbgorLy8vIGEgcGFydGljdWxhciBMTFZNQ29udGV4dC4gIElkZW50aWZpZWQgc3RydWN0cyBtYXkgYWxzbyBvcHRpb25hbGx5IGJlIG9wYXF1ZQorLy8vIChoYXZlIG5vIGJvZHkgc3BlY2lmaWVkKS4gIFlvdSBnZXQgb25lIG9mIHRoZXNlIGJ5IHVzaW5nIG9uZSBvZiB0aGUKKy8vLyBTdHJ1Y3RUeXBlOjpjcmVhdGUoKSBmb3Jtcy4KKy8vLworLy8vIEluZGVwZW5kZW50IG9mIHdoYXQga2luZCBvZiBzdHJ1Y3QgeW91IGhhdmUsIHRoZSBib2R5IG9mIGEgc3RydWN0IHR5cGUgYXJlCisvLy8gbGFpZCBvdXQgaW4gbWVtb3J5IGNvbnNlcXV0aXZlbHkgd2l0aCB0aGUgZWxlbWVudHMgZGlyZWN0bHkgb25lIGFmdGVyIHRoZQorLy8vIG90aGVyIChpZiB0aGUgc3RydWN0IGlzIHBhY2tlZCkgb3IgKGlmIG5vdCBwYWNrZWQpIHdpdGggcGFkZGluZyBiZXR3ZWVuIHRoZQorLy8vIGVsZW1lbnRzIGFzIGRlZmluZWQgYnkgRGF0YUxheW91dCAod2hpY2ggaXMgcmVxdWlyZWQgdG8gbWF0Y2ggd2hhdCB0aGUgY29kZQorLy8vIGdlbmVyYXRvciBmb3IgYSB0YXJnZXQgZXhwZWN0cykuCisvLy8KK2NsYXNzIFN0cnVjdFR5cGUgOiBwdWJsaWMgQ29tcG9zaXRlVHlwZSB7CisgIFN0cnVjdFR5cGUoTExWTUNvbnRleHQgJkMpIDogQ29tcG9zaXRlVHlwZShDLCBTdHJ1Y3RUeUlEKSB7fQorCisgIGVudW0geworICAgIC8vLyBUaGlzIGlzIHRoZSBjb250ZW50cyBvZiB0aGUgU3ViQ2xhc3NEYXRhIGZpZWxkLgorICAgIFNDREJfSGFzQm9keSA9IDEsCisgICAgU0NEQl9QYWNrZWQgPSAyLAorICAgIFNDREJfSXNMaXRlcmFsID0gNCwKKyAgICBTQ0RCX0lzU2l6ZWQgPSA4CisgIH07CisKKyAgLy8vIEZvciBhIG5hbWVkIHN0cnVjdCB0aGF0IGFjdHVhbGx5IGhhcyBhIG5hbWUsIHRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZQorICAvLy8gc3ltYm9sIHRhYmxlIGVudHJ5IChtYWludGFpbmVkIGJ5IExMVk1Db250ZXh0KSBmb3IgdGhlIHN0cnVjdC4KKyAgLy8vIFRoaXMgaXMgbnVsbCBpZiB0aGUgdHlwZSBpcyBhbiBsaXRlcmFsIHN0cnVjdCBvciBpZiBpdCBpcyBhIGlkZW50aWZpZWQKKyAgLy8vIHR5cGUgdGhhdCBoYXMgYW4gZW1wdHkgbmFtZS4KKyAgdm9pZCAqU3ltYm9sVGFibGVFbnRyeSA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgU3RydWN0VHlwZShjb25zdCBTdHJ1Y3RUeXBlICYpID0gZGVsZXRlOworICBTdHJ1Y3RUeXBlICZvcGVyYXRvcj0oY29uc3QgU3RydWN0VHlwZSAmKSA9IGRlbGV0ZTsKKworICAvLy8gVGhpcyBjcmVhdGVzIGFuIGlkZW50aWZpZWQgc3RydWN0LgorICBzdGF0aWMgU3RydWN0VHlwZSAqY3JlYXRlKExMVk1Db250ZXh0ICZDb250ZXh0LCBTdHJpbmdSZWYgTmFtZSk7CisgIHN0YXRpYyBTdHJ1Y3RUeXBlICpjcmVhdGUoTExWTUNvbnRleHQgJkNvbnRleHQpOworCisgIHN0YXRpYyBTdHJ1Y3RUeXBlICpjcmVhdGUoQXJyYXlSZWY8VHlwZSAqPiBFbGVtZW50cywgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1BhY2tlZCA9IGZhbHNlKTsKKyAgc3RhdGljIFN0cnVjdFR5cGUgKmNyZWF0ZShBcnJheVJlZjxUeXBlICo+IEVsZW1lbnRzKTsKKyAgc3RhdGljIFN0cnVjdFR5cGUgKmNyZWF0ZShMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8VHlwZSAqPiBFbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSwgYm9vbCBpc1BhY2tlZCA9IGZhbHNlKTsKKyAgc3RhdGljIFN0cnVjdFR5cGUgKmNyZWF0ZShMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8VHlwZSAqPiBFbGVtZW50cyk7CisgIHRlbXBsYXRlIDxjbGFzcy4uLiBUeXM+CisgIHN0YXRpYyB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxhcmVfYmFzZV9vZjxUeXBlLCBUeXMuLi4+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdFR5cGUgKj46OnR5cGUKKyAgY3JlYXRlKFN0cmluZ1JlZiBOYW1lLCBUeXBlICplbHQxLCBUeXMgKi4uLiBlbHRzKSB7CisgICAgYXNzZXJ0KGVsdDEgJiYgIkNhbm5vdCBjcmVhdGUgYSBzdHJ1Y3QgdHlwZSB3aXRoIG5vIGVsZW1lbnRzIHdpdGggdGhpcyIpOworICAgIFNtYWxsVmVjdG9yPGxsdm06OlR5cGUgKiwgOD4gU3RydWN0RmllbGRzKHtlbHQxLCBlbHRzLi4ufSk7CisgICAgcmV0dXJuIGNyZWF0ZShTdHJ1Y3RGaWVsZHMsIE5hbWUpOworICB9CisKKyAgLy8vIFRoaXMgc3RhdGljIG1ldGhvZCBpcyB0aGUgcHJpbWFyeSB3YXkgdG8gY3JlYXRlIGEgbGl0ZXJhbCBTdHJ1Y3RUeXBlLgorICBzdGF0aWMgU3RydWN0VHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBBcnJheVJlZjxUeXBlKj4gRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1BhY2tlZCA9IGZhbHNlKTsKKworICAvLy8gQ3JlYXRlIGFuIGVtcHR5IHN0cnVjdHVyZSB0eXBlLgorICBzdGF0aWMgU3RydWN0VHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBib29sIGlzUGFja2VkID0gZmFsc2UpOworCisgIC8vLyBUaGlzIHN0YXRpYyBtZXRob2QgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIHN0cnVjdHVyZSB0eXBlcyBieQorICAvLy8gc3BlY2lmeWluZyB0aGUgZWxlbWVudHMgYXMgYXJndW1lbnRzLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMKKyAgLy8vIGEgbm9uLXBhY2tlZCBzdHJ1Y3QsIGFuZCByZXF1aXJlcyBhdCBsZWFzdCBvbmUgZWxlbWVudCB0eXBlLgorICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gVHlzPgorICBzdGF0aWMgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8YXJlX2Jhc2Vfb2Y8VHlwZSwgVHlzLi4uPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3RUeXBlICo+Ojp0eXBlCisgIGdldChUeXBlICplbHQxLCBUeXMgKi4uLiBlbHRzKSB7CisgICAgYXNzZXJ0KGVsdDEgJiYgIkNhbm5vdCBjcmVhdGUgYSBzdHJ1Y3QgdHlwZSB3aXRoIG5vIGVsZW1lbnRzIHdpdGggdGhpcyIpOworICAgIExMVk1Db250ZXh0ICZDdHggPSBlbHQxLT5nZXRDb250ZXh0KCk7CisgICAgU21hbGxWZWN0b3I8bGx2bTo6VHlwZSAqLCA4PiBTdHJ1Y3RGaWVsZHMoe2VsdDEsIGVsdHMuLi59KTsKKyAgICByZXR1cm4gbGx2bTo6U3RydWN0VHlwZTo6Z2V0KEN0eCwgU3RydWN0RmllbGRzKTsKKyAgfQorCisgIGJvb2wgaXNQYWNrZWQoKSBjb25zdCB7IHJldHVybiAoZ2V0U3ViY2xhc3NEYXRhKCkgJiBTQ0RCX1BhY2tlZCkgIT0gMDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHR5cGUgaXMgdW5pcXVlZCBieSBzdHJ1Y3R1cmFsIGVxdWl2YWxlbmNlLCBmYWxzZSBpZiBpdAorICAvLy8gaXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbi4KKyAgYm9vbCBpc0xpdGVyYWwoKSBjb25zdCB7IHJldHVybiAoZ2V0U3ViY2xhc3NEYXRhKCkgJiBTQ0RCX0lzTGl0ZXJhbCkgIT0gMDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgdHlwZSB3aXRoIGFuIGlkZW50aXR5IHRoYXQgaGFzIG5vIGJvZHkgc3BlY2lmaWVkCisgIC8vLyB5ZXQuIFRoZXNlIHByaW50cyBhcyAnb3BhcXVlJyBpbiAubGwgZmlsZXMuCisgIGJvb2wgaXNPcGFxdWUoKSBjb25zdCB7IHJldHVybiAoZ2V0U3ViY2xhc3NEYXRhKCkgJiBTQ0RCX0hhc0JvZHkpID09IDA7IH0KKworICAvLy8gaXNTaXplZCAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBzaXplZCB0eXBlLgorICBib29sIGlzU2l6ZWQoU21hbGxQdHJTZXRJbXBsPFR5cGUgKj4gKlZpc2l0ZWQgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIG5hbWVkIHN0cnVjdCB0aGF0IGhhcyBhIG5vbi1lbXB0eSBuYW1lLgorICBib29sIGhhc05hbWUoKSBjb25zdCB7IHJldHVybiBTeW1ib2xUYWJsZUVudHJ5ICE9IG51bGxwdHI7IH0KKworICAvLy8gUmV0dXJuIHRoZSBuYW1lIGZvciB0aGlzIHN0cnVjdCB0eXBlIGlmIGl0IGhhcyBhbiBpZGVudGl0eS4KKyAgLy8vIFRoaXMgbWF5IHJldHVybiBhbiBlbXB0eSBzdHJpbmcgZm9yIGFuIHVubmFtZWQgc3RydWN0IHR5cGUuICBEbyBub3QgY2FsbAorICAvLy8gdGhpcyBvbiBhbiBsaXRlcmFsIHR5cGUuCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3Q7CisKKyAgLy8vIENoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIHR5cGUgdG8gdGhlIHNwZWNpZmllZCBuYW1lLCBvciB0byBhIG5hbWUgd2l0aCBhCisgIC8vLyBzdWZmaXggaWYgdGhlcmUgaXMgYSBjb2xsaXNpb24uIERvIG5vdCBjYWxsIHRoaXMgb24gYW4gbGl0ZXJhbCB0eXBlLgorICB2b2lkIHNldE5hbWUoU3RyaW5nUmVmIE5hbWUpOworCisgIC8vLyBTcGVjaWZ5IGEgYm9keSBmb3IgYW4gb3BhcXVlIGlkZW50aWZpZWQgdHlwZS4KKyAgdm9pZCBzZXRCb2R5KEFycmF5UmVmPFR5cGUqPiBFbGVtZW50cywgYm9vbCBpc1BhY2tlZCA9IGZhbHNlKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHlzPgorICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxhcmVfYmFzZV9vZjxUeXBlLCBUeXMuLi4+Ojp2YWx1ZSwgdm9pZD46OnR5cGUKKyAgc2V0Qm9keShUeXBlICplbHQxLCBUeXMgKi4uLiBlbHRzKSB7CisgICAgYXNzZXJ0KGVsdDEgJiYgIkNhbm5vdCBjcmVhdGUgYSBzdHJ1Y3QgdHlwZSB3aXRoIG5vIGVsZW1lbnRzIHdpdGggdGhpcyIpOworICAgIFNtYWxsVmVjdG9yPGxsdm06OlR5cGUgKiwgOD4gU3RydWN0RmllbGRzKHtlbHQxLCBlbHRzLi4ufSk7CisgICAgc2V0Qm9keShTdHJ1Y3RGaWVsZHMpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyB2YWxpZCBhcyBhIGVsZW1lbnQgdHlwZS4KKyAgc3RhdGljIGJvb2wgaXNWYWxpZEVsZW1lbnRUeXBlKFR5cGUgKkVsZW1UeSk7CisKKyAgLy8gSXRlcmF0b3IgYWNjZXNzIHRvIHRoZSBlbGVtZW50cy4KKyAgdXNpbmcgZWxlbWVudF9pdGVyYXRvciA9IFR5cGU6OnN1YnR5cGVfaXRlcmF0b3I7CisKKyAgZWxlbWVudF9pdGVyYXRvciBlbGVtZW50X2JlZ2luKCkgY29uc3QgeyByZXR1cm4gQ29udGFpbmVkVHlzOyB9CisgIGVsZW1lbnRfaXRlcmF0b3IgZWxlbWVudF9lbmQoKSBjb25zdCB7IHJldHVybiAmQ29udGFpbmVkVHlzW051bUNvbnRhaW5lZFR5c107fQorICBBcnJheVJlZjxUeXBlICo+IGNvbnN0IGVsZW1lbnRzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlQXJyYXlSZWYoZWxlbWVudF9iZWdpbigpLCBlbGVtZW50X2VuZCgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGxheW91dCBpZGVudGljYWwgdG8gdGhlIHNwZWNpZmllZCBzdHJ1Y3QuCisgIGJvb2wgaXNMYXlvdXRJZGVudGljYWwoU3RydWN0VHlwZSAqT3RoZXIpIGNvbnN0OworCisgIC8vLyBSYW5kb20gYWNjZXNzIHRvIHRoZSBlbGVtZW50cworICB1bnNpZ25lZCBnZXROdW1FbGVtZW50cygpIGNvbnN0IHsgcmV0dXJuIE51bUNvbnRhaW5lZFR5czsgfQorICBUeXBlICpnZXRFbGVtZW50VHlwZSh1bnNpZ25lZCBOKSBjb25zdCB7CisgICAgYXNzZXJ0KE4gPCBOdW1Db250YWluZWRUeXMgJiYgIkVsZW1lbnQgbnVtYmVyIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gQ29udGFpbmVkVHlzW05dOworICB9CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3QuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlSUQoKSA9PSBTdHJ1Y3RUeUlEOworICB9Cit9OworCitTdHJpbmdSZWYgVHlwZTo6Z2V0U3RydWN0TmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGNhc3Q8U3RydWN0VHlwZT4odGhpcyktPmdldE5hbWUoKTsKK30KKwordW5zaWduZWQgVHlwZTo6Z2V0U3RydWN0TnVtRWxlbWVudHMoKSBjb25zdCB7CisgIHJldHVybiBjYXN0PFN0cnVjdFR5cGU+KHRoaXMpLT5nZXROdW1FbGVtZW50cygpOworfQorCitUeXBlICpUeXBlOjpnZXRTdHJ1Y3RFbGVtZW50VHlwZSh1bnNpZ25lZCBOKSBjb25zdCB7CisgIHJldHVybiBjYXN0PFN0cnVjdFR5cGU+KHRoaXMpLT5nZXRFbGVtZW50VHlwZShOKTsKK30KKworLy8vIFRoaXMgaXMgdGhlIHN1cGVyY2xhc3Mgb2YgdGhlIGFycmF5IGFuZCB2ZWN0b3IgdHlwZSBjbGFzc2VzLiBCb3RoIG9mIHRoZXNlCisvLy8gcmVwcmVzZW50ICJhcnJheXMiIGluIG1lbW9yeS4gVGhlIGFycmF5IHR5cGUgcmVwcmVzZW50cyBhIHNwZWNpZmljYWxseSBzaXplZAorLy8vIGFycmF5LCBhbmQgdGhlIHZlY3RvciB0eXBlIHJlcHJlc2VudHMgYSBzcGVjaWZpY2FsbHkgc2l6ZWQgYXJyYXkgdGhhdCBhbGxvd3MKKy8vLyBmb3IgdXNlIG9mIFNJTUQgaW5zdHJ1Y3Rpb25zLiBTZXF1ZW50aWFsVHlwZSBob2xkcyB0aGUgY29tbW9uIGZlYXR1cmVzIG9mCisvLy8gYm90aCwgd2hpY2ggc3RlbSBmcm9tIHRoZSBmYWN0IHRoYXQgYm90aCBsYXkgdGhlaXIgY29tcG9uZW50cyBvdXQgaW4gbWVtb3J5CisvLy8gaWRlbnRpY2FsbHkuCitjbGFzcyBTZXF1ZW50aWFsVHlwZSA6IHB1YmxpYyBDb21wb3NpdGVUeXBlIHsKKyAgVHlwZSAqQ29udGFpbmVkVHlwZTsgICAgICAgICAgICAgICAvLy88IFN0b3JhZ2UgZm9yIHRoZSBzaW5nbGUgY29udGFpbmVkIHR5cGUuCisgIHVpbnQ2NF90IE51bUVsZW1lbnRzOworCitwcm90ZWN0ZWQ6CisgIFNlcXVlbnRpYWxUeXBlKFR5cGVJRCBUSUQsIFR5cGUgKkVsVHlwZSwgdWludDY0X3QgTnVtRWxlbWVudHMpCisgICAgOiBDb21wb3NpdGVUeXBlKEVsVHlwZS0+Z2V0Q29udGV4dCgpLCBUSUQpLCBDb250YWluZWRUeXBlKEVsVHlwZSksCisgICAgICBOdW1FbGVtZW50cyhOdW1FbGVtZW50cykgeworICAgIENvbnRhaW5lZFR5cyA9ICZDb250YWluZWRUeXBlOworICAgIE51bUNvbnRhaW5lZFR5cyA9IDE7CisgIH0KKworcHVibGljOgorICBTZXF1ZW50aWFsVHlwZShjb25zdCBTZXF1ZW50aWFsVHlwZSAmKSA9IGRlbGV0ZTsKKyAgU2VxdWVudGlhbFR5cGUgJm9wZXJhdG9yPShjb25zdCBTZXF1ZW50aWFsVHlwZSAmKSA9IGRlbGV0ZTsKKworICB1aW50NjRfdCBnZXROdW1FbGVtZW50cygpIGNvbnN0IHsgcmV0dXJuIE51bUVsZW1lbnRzOyB9CisgIFR5cGUgKmdldEVsZW1lbnRUeXBlKCkgY29uc3QgeyByZXR1cm4gQ29udGFpbmVkVHlwZTsgfQorCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0LgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUlEKCkgPT0gQXJyYXlUeUlEIHx8IFQtPmdldFR5cGVJRCgpID09IFZlY3RvclR5SUQ7CisgIH0KK307CisKKy8vLyBDbGFzcyB0byByZXByZXNlbnQgYXJyYXkgdHlwZXMuCitjbGFzcyBBcnJheVR5cGUgOiBwdWJsaWMgU2VxdWVudGlhbFR5cGUgeworICBBcnJheVR5cGUoVHlwZSAqRWxUeXBlLCB1aW50NjRfdCBOdW1FbCk7CisKK3B1YmxpYzoKKyAgQXJyYXlUeXBlKGNvbnN0IEFycmF5VHlwZSAmKSA9IGRlbGV0ZTsKKyAgQXJyYXlUeXBlICZvcGVyYXRvcj0oY29uc3QgQXJyYXlUeXBlICYpID0gZGVsZXRlOworCisgIC8vLyBUaGlzIHN0YXRpYyBtZXRob2QgaXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnN0cnVjdCBhbiBBcnJheVR5cGUKKyAgc3RhdGljIEFycmF5VHlwZSAqZ2V0KFR5cGUgKkVsZW1lbnRUeXBlLCB1aW50NjRfdCBOdW1FbGVtZW50cyk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyB2YWxpZCBhcyBhIGVsZW1lbnQgdHlwZS4KKyAgc3RhdGljIGJvb2wgaXNWYWxpZEVsZW1lbnRUeXBlKFR5cGUgKkVsZW1UeSk7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3QuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlSUQoKSA9PSBBcnJheVR5SUQ7CisgIH0KK307CisKK3VpbnQ2NF90IFR5cGU6OmdldEFycmF5TnVtRWxlbWVudHMoKSBjb25zdCB7CisgIHJldHVybiBjYXN0PEFycmF5VHlwZT4odGhpcyktPmdldE51bUVsZW1lbnRzKCk7Cit9CisKKy8vLyBDbGFzcyB0byByZXByZXNlbnQgdmVjdG9yIHR5cGVzLgorY2xhc3MgVmVjdG9yVHlwZSA6IHB1YmxpYyBTZXF1ZW50aWFsVHlwZSB7CisgIFZlY3RvclR5cGUoVHlwZSAqRWxUeXBlLCB1bnNpZ25lZCBOdW1FbCk7CisKK3B1YmxpYzoKKyAgVmVjdG9yVHlwZShjb25zdCBWZWN0b3JUeXBlICYpID0gZGVsZXRlOworICBWZWN0b3JUeXBlICZvcGVyYXRvcj0oY29uc3QgVmVjdG9yVHlwZSAmKSA9IGRlbGV0ZTsKKworICAvLy8gVGhpcyBzdGF0aWMgbWV0aG9kIGlzIHRoZSBwcmltYXJ5IHdheSB0byBjb25zdHJ1Y3QgYW4gVmVjdG9yVHlwZS4KKyAgc3RhdGljIFZlY3RvclR5cGUgKmdldChUeXBlICpFbGVtZW50VHlwZSwgdW5zaWduZWQgTnVtRWxlbWVudHMpOworCisgIC8vLyBUaGlzIHN0YXRpYyBtZXRob2QgZ2V0cyBhIFZlY3RvclR5cGUgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMgYXMKKyAgLy8vIHRoZSBpbnB1dCB0eXBlLCBhbmQgdGhlIGVsZW1lbnQgdHlwZSBpcyBhbiBpbnRlZ2VyIHR5cGUgb2YgdGhlIHNhbWUgd2lkdGgKKyAgLy8vIGFzIHRoZSBpbnB1dCBlbGVtZW50IHR5cGUuCisgIHN0YXRpYyBWZWN0b3JUeXBlICpnZXRJbnRlZ2VyKFZlY3RvclR5cGUgKlZUeSkgeworICAgIHVuc2lnbmVkIEVsdEJpdHMgPSBWVHktPmdldEVsZW1lbnRUeXBlKCktPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKTsKKyAgICBhc3NlcnQoRWx0Qml0cyAmJiAiRWxlbWVudCBzaXplIG11c3QgYmUgb2YgYSBub24temVybyBzaXplIik7CisgICAgVHlwZSAqRWx0VHkgPSBJbnRlZ2VyVHlwZTo6Z2V0KFZUeS0+Z2V0Q29udGV4dCgpLCBFbHRCaXRzKTsKKyAgICByZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KEVsdFR5LCBWVHktPmdldE51bUVsZW1lbnRzKCkpOworICB9CisKKyAgLy8vIFRoaXMgc3RhdGljIG1ldGhvZCBpcyBsaWtlIGdldEludGVnZXIgZXhjZXB0IHRoYXQgdGhlIGVsZW1lbnQgdHlwZXMgYXJlCisgIC8vLyB0d2ljZSBhcyB3aWRlIGFzIHRoZSBlbGVtZW50cyBpbiB0aGUgaW5wdXQgdHlwZS4KKyAgc3RhdGljIFZlY3RvclR5cGUgKmdldEV4dGVuZGVkRWxlbWVudFZlY3RvclR5cGUoVmVjdG9yVHlwZSAqVlR5KSB7CisgICAgdW5zaWduZWQgRWx0Qml0cyA9IFZUeS0+Z2V0RWxlbWVudFR5cGUoKS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpOworICAgIFR5cGUgKkVsdFR5ID0gSW50ZWdlclR5cGU6OmdldChWVHktPmdldENvbnRleHQoKSwgRWx0Qml0cyAqIDIpOworICAgIHJldHVybiBWZWN0b3JUeXBlOjpnZXQoRWx0VHksIFZUeS0+Z2V0TnVtRWxlbWVudHMoKSk7CisgIH0KKworICAvLy8gVGhpcyBzdGF0aWMgbWV0aG9kIGlzIGxpa2UgZ2V0SW50ZWdlciBleGNlcHQgdGhhdCB0aGUgZWxlbWVudCB0eXBlcyBhcmUKKyAgLy8vIGhhbGYgYXMgd2lkZSBhcyB0aGUgZWxlbWVudHMgaW4gdGhlIGlucHV0IHR5cGUuCisgIHN0YXRpYyBWZWN0b3JUeXBlICpnZXRUcnVuY2F0ZWRFbGVtZW50VmVjdG9yVHlwZShWZWN0b3JUeXBlICpWVHkpIHsKKyAgICB1bnNpZ25lZCBFbHRCaXRzID0gVlR5LT5nZXRFbGVtZW50VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7CisgICAgYXNzZXJ0KChFbHRCaXRzICYgMSkgPT0gMCAmJgorICAgICAgICAgICAiQ2Fubm90IHRydW5jYXRlIHZlY3RvciBlbGVtZW50IHdpdGggb2RkIGJpdC13aWR0aCIpOworICAgIFR5cGUgKkVsdFR5ID0gSW50ZWdlclR5cGU6OmdldChWVHktPmdldENvbnRleHQoKSwgRWx0Qml0cyAvIDIpOworICAgIHJldHVybiBWZWN0b3JUeXBlOjpnZXQoRWx0VHksIFZUeS0+Z2V0TnVtRWxlbWVudHMoKSk7CisgIH0KKworICAvLy8gVGhpcyBzdGF0aWMgbWV0aG9kIHJldHVybnMgYSBWZWN0b3JUeXBlIHdpdGggaGFsZiBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZQorICAvLy8gaW5wdXQgdHlwZSBhbmQgdGhlIHNhbWUgZWxlbWVudCB0eXBlLgorICBzdGF0aWMgVmVjdG9yVHlwZSAqZ2V0SGFsZkVsZW1lbnRzVmVjdG9yVHlwZShWZWN0b3JUeXBlICpWVHkpIHsKKyAgICB1bnNpZ25lZCBOdW1FbHRzID0gVlR5LT5nZXROdW1FbGVtZW50cygpOworICAgIGFzc2VydCAoKE51bUVsdHMgJiAxKSA9PSAwICYmCisgICAgICAgICAgICAiQ2Fubm90IGhhbHZlIHZlY3RvciB3aXRoIG9kZCBudW1iZXIgb2YgZWxlbWVudHMuIik7CisgICAgcmV0dXJuIFZlY3RvclR5cGU6OmdldChWVHktPmdldEVsZW1lbnRUeXBlKCksIE51bUVsdHMvMik7CisgIH0KKworICAvLy8gVGhpcyBzdGF0aWMgbWV0aG9kIHJldHVybnMgYSBWZWN0b3JUeXBlIHdpdGggdHdpY2UgYXMgbWFueSBlbGVtZW50cyBhcyB0aGUKKyAgLy8vIGlucHV0IHR5cGUgYW5kIHRoZSBzYW1lIGVsZW1lbnQgdHlwZS4KKyAgc3RhdGljIFZlY3RvclR5cGUgKmdldERvdWJsZUVsZW1lbnRzVmVjdG9yVHlwZShWZWN0b3JUeXBlICpWVHkpIHsKKyAgICB1bnNpZ25lZCBOdW1FbHRzID0gVlR5LT5nZXROdW1FbGVtZW50cygpOworICAgIHJldHVybiBWZWN0b3JUeXBlOjpnZXQoVlR5LT5nZXRFbGVtZW50VHlwZSgpLCBOdW1FbHRzKjIpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyB2YWxpZCBhcyBhIGVsZW1lbnQgdHlwZS4KKyAgc3RhdGljIGJvb2wgaXNWYWxpZEVsZW1lbnRUeXBlKFR5cGUgKkVsZW1UeSk7CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIFZlY3RvciB0eXBlLgorICAvLy8gUmV0dXJucyB6ZXJvIHdoZW4gdGhlIHZlY3RvciBpcyBhIHZlY3RvciBvZiBwb2ludGVycy4KKyAgdW5zaWduZWQgZ2V0Qml0V2lkdGgoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE51bUVsZW1lbnRzKCkgKiBnZXRFbGVtZW50VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7CisgIH0KKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdC4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFR5cGVJRCgpID09IFZlY3RvclR5SUQ7CisgIH0KK307CisKK3Vuc2lnbmVkIFR5cGU6OmdldFZlY3Rvck51bUVsZW1lbnRzKCkgY29uc3QgeworICByZXR1cm4gY2FzdDxWZWN0b3JUeXBlPih0aGlzKS0+Z2V0TnVtRWxlbWVudHMoKTsKK30KKworLy8vIENsYXNzIHRvIHJlcHJlc2VudCBwb2ludGVycy4KK2NsYXNzIFBvaW50ZXJUeXBlIDogcHVibGljIFR5cGUgeworICBleHBsaWNpdCBQb2ludGVyVHlwZShUeXBlICpFbFR5cGUsIHVuc2lnbmVkIEFkZHJTcGFjZSk7CisKKyAgVHlwZSAqUG9pbnRlZVR5OworCitwdWJsaWM6CisgIFBvaW50ZXJUeXBlKGNvbnN0IFBvaW50ZXJUeXBlICYpID0gZGVsZXRlOworICBQb2ludGVyVHlwZSAmb3BlcmF0b3I9KGNvbnN0IFBvaW50ZXJUeXBlICYpID0gZGVsZXRlOworCisgIC8vLyBUaGlzIGNvbnN0cnVjdHMgYSBwb2ludGVyIHRvIGFuIG9iamVjdCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW4gYSBudW1iZXJlZAorICAvLy8gYWRkcmVzcyBzcGFjZS4KKyAgc3RhdGljIFBvaW50ZXJUeXBlICpnZXQoVHlwZSAqRWxlbWVudFR5cGUsIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSk7CisKKyAgLy8vIFRoaXMgY29uc3RydWN0cyBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBpbiB0aGUKKyAgLy8vIGdlbmVyaWMgYWRkcmVzcyBzcGFjZSAoYWRkcmVzcyBzcGFjZSB6ZXJvKS4KKyAgc3RhdGljIFBvaW50ZXJUeXBlICpnZXRVbnF1YWwoVHlwZSAqRWxlbWVudFR5cGUpIHsKKyAgICByZXR1cm4gUG9pbnRlclR5cGU6OmdldChFbGVtZW50VHlwZSwgMCk7CisgIH0KKworICBUeXBlICpnZXRFbGVtZW50VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFBvaW50ZWVUeTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgdmFsaWQgYXMgYSBlbGVtZW50IHR5cGUuCisgIHN0YXRpYyBib29sIGlzVmFsaWRFbGVtZW50VHlwZShUeXBlICpFbGVtVHkpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB3ZSBjYW4gbG9hZCBvciBzdG9yZSBmcm9tIGEgcG9pbnRlciB0byB0aGlzIHR5cGUuCisgIHN0YXRpYyBib29sIGlzTG9hZGFibGVPclN0b3JhYmxlVHlwZShUeXBlICpFbGVtVHkpOworCisgIC8vLyBSZXR1cm4gdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIFBvaW50ZXIgdHlwZS4KKyAgaW5saW5lIHVuc2lnbmVkIGdldEFkZHJlc3NTcGFjZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN1YmNsYXNzRGF0YSgpOyB9CisKKyAgLy8vIEltcGxlbWVudCBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0LgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUlEKCkgPT0gUG9pbnRlclR5SUQ7CisgIH0KK307CisKK3Vuc2lnbmVkIFR5cGU6OmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKSBjb25zdCB7CisgIHJldHVybiBjYXN0PFBvaW50ZXJUeXBlPihnZXRTY2FsYXJUeXBlKCkpLT5nZXRBZGRyZXNzU3BhY2UoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfREVSSVZFRFRZUEVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRGVyaXZlZFVzZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRGVyaXZlZFVzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2M0ODNkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EZXJpdmVkVXNlci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vPT09LSBEZXJpdmVkVXNlci5oIC0gQmFzZSBmb3Igbm9uLUlSIFVzZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9ERVJJVkVEVVNFUl9ICisjZGVmaW5lIExMVk1fSVJfREVSSVZFRFVTRVJfSAorCisjaW5jbHVkZSAibGx2bS9JUi9Vc2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVHlwZTsKK2NsYXNzIFVzZTsKKworLy8vIEV4dGVuc2lvbiBwb2ludCBmb3IgdGhlIFZhbHVlIGhpZXJhcmNoeS4gQWxsIGNsYXNzZXMgb3V0c2lkZSBvZiBsaWIvSVIKKy8vLyB0aGF0IHdpc2ggdG8gaW5oZXJpdCBmcm9tIFVzZXIgc2hvdWxkIGluc3RlYWQgaW5oZXJpdCBmcm9tIERlcml2ZWRVc2VyCisvLy8gaW5zdGVhZC4gSW5oZXJpdGluZyBmcm9tIHRoaXMgY2xhc3MgaXMgZGlzY291cmFnZWQuCisvLy8KKy8vLyBHZW5lcmFsbHkgc3BlYWtpbmcsIFZhbHVlIGlzIHRoZSBiYXNlIG9mIGEgY2xvc2VkIGNsYXNzIGhpZXJhcmNoeQorLy8vIHRoYXQgY2FuJ3QgYmUgZXh0ZW5kZWQgYnkgY29kZSBvdXRzaWRlIG9mIGxpYi9JUi4gVGhpcyBjbGFzcyBjcmVhdGVzIGEKKy8vLyBsb29waG9sZSB0aGF0IGFsbG93cyBjbGFzc2VzIG91dHNpZGUgb2YgbGliL0lSIHRvIGV4dGVuZCBVc2VyIHRvIGxldmVyYWdlCisvLy8gaXRzIHVzZS9kZWYgbGlzdCBtYWNoaW5lcnkuCitjbGFzcyBEZXJpdmVkVXNlciA6IHB1YmxpYyBVc2VyIHsKK3Byb3RlY3RlZDoKKyAgdXNpbmcgIERlbGV0ZVZhbHVlVHkgPSB2b2lkICgqKShEZXJpdmVkVXNlciAqKTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFZhbHVlOworCisgIERlbGV0ZVZhbHVlVHkgRGVsZXRlVmFsdWU7CisKK3B1YmxpYzoKKyAgRGVyaXZlZFVzZXIoVHlwZSAqVHksIHVuc2lnbmVkIFZLLCBVc2UgKlUsIHVuc2lnbmVkIE51bU9wcywKKyAgICAgICAgICAgICAgRGVsZXRlVmFsdWVUeSBEZWxldGVWYWx1ZSkKKyAgICAgIDogVXNlcihUeSwgVkssIFUsIE51bU9wcyksIERlbGV0ZVZhbHVlKERlbGV0ZVZhbHVlKSB7fQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfREVSSVZFRFVTRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EaWFnbm9zdGljSGFuZGxlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EaWFnbm9zdGljSGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNTZkNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RpYWdub3N0aWNIYW5kbGVyLmgKQEAgLTAsMCArMSw3NSBAQAorLy89PT0tIERpYWdub3N0aWNIYW5kbGVyLmggLSBEaWFnbm9zdGljSGFuZGxlciBjbGFzcyBmb3IgTExWTSAtKi0gQysrIC0tLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEJhc2UgRGlhZ25vc3RpY0hhbmRsZXIgY2xhc3MgZGVjbGFyYXRpb24uIERlcml2ZSBmcm9tIHRoaXMgY2xhc3MgdG8gcHJvdmlkZQorLy8gY3VzdG9tIGRpYWdub3N0aWMgcmVwb3J0aW5nLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0RJQUdOT1NUSUNIQU5ETEVSX0gKKyNkZWZpbmUgTExWTV9JUl9ESUFHTk9TVElDSEFORExFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgRGlhZ25vc3RpY0luZm87CisKKy8vLyBcYnJpZWYgVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgZGlhZ25vc3RpYyBoYW5kbGluZyBpbiBMTFZNLgorLy8vIFRoZSBoYW5kbGVEaWFnbm9zdGljcyBtZXRob2QgbXVzdCBiZSBvdmVycmlkZW4gYnkgdGhlIHN1YmNsYXNzZXMgdG8gaGFuZGxlCisvLy8gZGlhZ25vc3RpYy4gVGhlICpSZW1hcmtFbmFibGVkIG1ldGhvZHMgY2FuIGJlIG92ZXJyaWRlbiB0byBjb250cm9sCisvLy8gd2hpY2ggcmVtYXJrcyBhcmUgZW5hYmxlZC4KK3N0cnVjdCBEaWFnbm9zdGljSGFuZGxlciB7CisgIHZvaWQgKkRpYWdub3N0aWNDb250ZXh0ID0gbnVsbHB0cjsKKyAgRGlhZ25vc3RpY0hhbmRsZXIodm9pZCAqRGlhZ0NvbnRleHQgPSBudWxscHRyKQorICAgICAgOiBEaWFnbm9zdGljQ29udGV4dChEaWFnQ29udGV4dCkge30KKyAgdmlydHVhbCB+RGlhZ25vc3RpY0hhbmRsZXIoKSA9IGRlZmF1bHQ7CisKKyAgdXNpbmcgRGlhZ25vc3RpY0hhbmRsZXJUeSA9IHZvaWQgKCopKGNvbnN0IERpYWdub3N0aWNJbmZvICZESSwgdm9pZCAqQ29udGV4dCk7CisKKyAgLy8vIERpYWdIYW5kbGVyQ2FsbGJhY2sgaXMgc2V0dGFibGUgZnJvbSB0aGUgQyBBUEkgYW5kIGJhc2UgaW1wbGVtZW50YXRpb24KKyAgLy8vIG9mIERpYWdub3N0aWNIYW5kbGVyIHdpbGwgY2FsbCBpdCBmcm9tIGhhbmRsZURpYWdub3N0aWNzKCkuIEFueSBkZXJpdmVkCisgIC8vLyBjbGFzcyBvZiBEaWFnbm9zdGljSGFuZGxlciBzaG91bGQgbm90IHVzZSBjYWxsYmFjayBidXQKKyAgLy8vIGltcGxlbWVudCBoYW5kbGVEaWFnbm9zdGljcygpLgorICBEaWFnbm9zdGljSGFuZGxlclR5IERpYWdIYW5kbGVyQ2FsbGJhY2sgPSBudWxscHRyOworCisgIC8vLyBPdmVycmlkZSBoYW5kbGVEaWFnbm9zdGljcyB0byBwcm92aWRlIGN1c3RvbSBpbXBsZW1lbnRhdGlvbi4KKyAgLy8vIFJldHVybiB0cnVlIGlmIGl0IGhhbmRsZXMgZGlhZ25vc3RpY3MgcmVwb3J0aW5nIHByb3Blcmx5IG90aGVyd2lzZQorICAvLy8gcmV0dXJuIGZhbHNlIHRvIG1ha2UgTExWTUNvbnRleHQ6OmRpYWdub3NlKCkgdG8gcHJpbnQgdGhlIG1lc3NhZ2UKKyAgLy8vIHdpdGggYSBwcmVmaXggYmFzZWQgb24gdGhlIHNldmVyaXR5LgorICB2aXJ0dWFsIGJvb2wgaGFuZGxlRGlhZ25vc3RpY3MoY29uc3QgRGlhZ25vc3RpY0luZm8gJkRJKSB7CisgICAgaWYgKERpYWdIYW5kbGVyQ2FsbGJhY2spIHsKKyAgICAgIERpYWdIYW5kbGVyQ2FsbGJhY2soREksIERpYWdub3N0aWNDb250ZXh0KTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYW5hbHlzaXMgcmVtYXJrcyBhcmUgZW5hYmxlZCwgb3ZlcnJpZGUKKyAgLy8vIHRvIHByb3ZpZGUgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uLgorICB2aXJ0dWFsIGJvb2wgaXNBbmFseXNpc1JlbWFya0VuYWJsZWQoU3RyaW5nUmVmIFBhc3NOYW1lKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgbWlzc2VkIG9wdGltaXphdGlvbiByZW1hcmtzIGFyZSBlbmFibGVkLCBvdmVycmlkZQorICAvLy8gdG8gcHJvdmlkZSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uCisgIHZpcnR1YWwgYm9vbCBpc01pc3NlZE9wdFJlbWFya0VuYWJsZWQoU3RyaW5nUmVmIFBhc3NOYW1lKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgcGFzc2VkIG9wdGltaXphdGlvbiByZW1hcmtzIGFyZSBlbmFibGVkLCBvdmVycmlkZQorICAvLy8gdG8gcHJvdmlkZSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uCisgIHZpcnR1YWwgYm9vbCBpc1Bhc3NlZE9wdFJlbWFya0VuYWJsZWQoU3RyaW5nUmVmIFBhc3NOYW1lKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgYW55IHR5cGUgb2YgcmVtYXJrcyBhcmUgZW5hYmxlZCBmb3IgdGhpcyBwYXNzLgorICBib29sIGlzQW55UmVtYXJrRW5hYmxlZChTdHJpbmdSZWYgUGFzc05hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gKGlzTWlzc2VkT3B0UmVtYXJrRW5hYmxlZChQYXNzTmFtZSkgfHwKKyAgICAgICAgICAgIGlzUGFzc2VkT3B0UmVtYXJrRW5hYmxlZChQYXNzTmFtZSkgfHwKKyAgICAgICAgICAgIGlzQW5hbHlzaXNSZW1hcmtFbmFibGVkKFBhc3NOYW1lKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYW55IHR5cGUgb2YgcmVtYXJrcyBhcmUgZW5hYmxlZCBmb3IgYW55IHBhc3MuCisgIHZpcnR1YWwgYm9vbCBpc0FueVJlbWFya0VuYWJsZWQoKSBjb25zdDsKK307Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0RJQUdOT1NUSUNIQU5ETEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRGlhZ25vc3RpY0luZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRGlhZ25vc3RpY0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmVjMmJlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EaWFnbm9zdGljSW5mby5oCkBAIC0wLDAgKzEsOTk5IEBACisvLz09PS0gbGx2bS9JUi9EaWFnbm9zdGljSW5mby5oIC0gRGlhZ25vc3RpYyBEZWNsYXJhdGlvbiAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgZGlmZmVyZW50IGNsYXNzZXMgaW52b2x2ZWQgaW4gbG93IGxldmVsIGRpYWdub3N0aWNzLgorLy8KKy8vIERpYWdub3N0aWNzIHJlcG9ydGluZyBpcyBzdGlsbCBkb25lIGFzIHBhcnQgb2YgdGhlIExMVk1Db250ZXh0LgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0RJQUdOT1NUSUNJTkZPX0gKKyNkZWZpbmUgTExWTV9JUl9ESUFHTk9TVElDSU5GT19ICisKKyNpbmNsdWRlICJsbHZtLWMvVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RlYnVnTG9jLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NCaW5kaW5nV3JhcHBpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvWUFNTFRyYWl0cy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zLgorY2xhc3MgRGlhZ25vc3RpY1ByaW50ZXI7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBTTURpYWdub3N0aWM7CisKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgZGlmZmVyZW50IHN1cHBvcnRlZCBzZXZlcml0eSBvZiBhIGRpYWdub3N0aWMuCitlbnVtIERpYWdub3N0aWNTZXZlcml0eSA6IGNoYXIgeworICBEU19FcnJvciwKKyAgRFNfV2FybmluZywKKyAgRFNfUmVtYXJrLAorICAvLyBBIG5vdGUgYXR0YWNoZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBvbmUgb2YgdGhlIHByZXZpb3VzIGRpYWdub3N0aWMKKyAgLy8gdHlwZXMuCisgIERTX05vdGUKK307CisKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgZGlmZmVyZW50IHN1cHBvcnRlZCBraW5kIG9mIGEgZGlhZ25vc3RpYy4KKy8vLyBUaGlzIGVudW0gc2hvdWxkIGJlIGV4dGVuZGVkIHdpdGggYSBuZXcgSUQgZm9yIGVhY2ggYWRkZWQgY29uY3JldGUgc3ViY2xhc3MuCitlbnVtIERpYWdub3N0aWNLaW5kIHsKKyAgREtfSW5saW5lQXNtLAorICBES19SZXNvdXJjZUxpbWl0LAorICBES19TdGFja1NpemUsCisgIERLX0xpbmtlciwKKyAgREtfRGVidWdNZXRhZGF0YVZlcnNpb24sCisgIERLX0RlYnVnTWV0YWRhdGFJbnZhbGlkLAorICBES19JU2VsRmFsbGJhY2ssCisgIERLX1NhbXBsZVByb2ZpbGUsCisgIERLX09wdGltaXphdGlvblJlbWFyaywKKyAgREtfT3B0aW1pemF0aW9uUmVtYXJrTWlzc2VkLAorICBES19PcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcywKKyAgREtfT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXNGUENvbW11dGUsCisgIERLX09wdGltaXphdGlvblJlbWFya0FuYWx5c2lzQWxpYXNpbmcsCisgIERLX09wdGltaXphdGlvbkZhaWx1cmUsCisgIERLX0ZpcnN0UmVtYXJrID0gREtfT3B0aW1pemF0aW9uUmVtYXJrLAorICBES19MYXN0UmVtYXJrID0gREtfT3B0aW1pemF0aW9uRmFpbHVyZSwKKyAgREtfTWFjaGluZU9wdGltaXphdGlvblJlbWFyaywKKyAgREtfTWFjaGluZU9wdGltaXphdGlvblJlbWFya01pc3NlZCwKKyAgREtfTWFjaGluZU9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzLAorICBES19GaXJzdE1hY2hpbmVSZW1hcmsgPSBES19NYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrLAorICBES19MYXN0TWFjaGluZVJlbWFyayA9IERLX01hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcywKKyAgREtfTUlSUGFyc2VyLAorICBES19QR09Qcm9maWxlLAorICBES19VbnN1cHBvcnRlZCwKKyAgREtfRmlyc3RQbHVnaW5LaW5kCit9OworCisvLy8gXGJyaWVmIEdldCB0aGUgbmV4dCBhdmFpbGFibGUga2luZCBJRCBmb3IgYSBwbHVnaW4gZGlhZ25vc3RpYy4KKy8vLyBFYWNoIHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIGl0IHJldHVybnMgYSBkaWZmZXJlbnQgbnVtYmVyLgorLy8vIFRoZXJlZm9yZSwgYSBwbHVnaW4gdGhhdCB3YW50cyB0byAiaWRlbnRpZnkiIGl0cyBvd24gY2xhc3NlcworLy8vIHdpdGggYSBkeW5hbWljIGlkZW50aWZpZXIsIGp1c3QgaGF2ZSB0byB1c2UgdGhpcyBtZXRob2QgdG8gZ2V0IGEgbmV3IElECisvLy8gYW5kIGFzc2lnbiBpdCB0byBlYWNoIG9mIGl0cyBjbGFzc2VzLgorLy8vIFRoZSByZXR1cm5lZCBJRCB3aWxsIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBES19GaXJzdFBsdWdpbktpbmQuCisvLy8gVGh1cywgdGhlIHBsdWdpbiBpZGVudGlmaWVycyB3aWxsIG5vdCBjb25mbGljdCB3aXRoIHRoZQorLy8vIERpYWdub3N0aWNLaW5kIHZhbHVlcy4KK2ludCBnZXROZXh0QXZhaWxhYmxlUGx1Z2luRGlhZ25vc3RpY0tpbmQoKTsKKworLy8vIFxicmllZiBUaGlzIGlzIHRoZSBiYXNlIGFic3RyYWN0IGNsYXNzIGZvciBkaWFnbm9zdGljIHJlcG9ydGluZyBpbgorLy8vIHRoZSBiYWNrZW5kLgorLy8vIFRoZSBwcmludCBtZXRob2QgbXVzdCBiZSBvdmVybG9hZGVkIGJ5IHRoZSBzdWJjbGFzc2VzIHRvIHByaW50IGEKKy8vLyB1c2VyLWZyaWVuZGx5IG1lc3NhZ2UgaW4gdGhlIGNsaWVudCBvZiB0aGUgYmFja2VuZCAobGV0IHVzIGNhbGwgaXQgYQorLy8vIGZyb250ZW5kKS4KK2NsYXNzIERpYWdub3N0aWNJbmZvIHsKK3ByaXZhdGU6CisgIC8vLyBLaW5kIGRlZmluZXMgdGhlIGtpbmQgb2YgcmVwb3J0IHRoaXMgaXMgYWJvdXQuCisgIGNvbnN0IC8qIERpYWdub3N0aWNLaW5kICovIGludCBLaW5kOworICAvLy8gU2V2ZXJpdHkgZ2l2ZXMgdGhlIHNldmVyaXR5IG9mIHRoZSBkaWFnbm9zdGljLgorICBjb25zdCBEaWFnbm9zdGljU2V2ZXJpdHkgU2V2ZXJpdHk7CisKK3B1YmxpYzoKKyAgRGlhZ25vc3RpY0luZm8oLyogRGlhZ25vc3RpY0tpbmQgKi8gaW50IEtpbmQsIERpYWdub3N0aWNTZXZlcml0eSBTZXZlcml0eSkKKyAgICAgIDogS2luZChLaW5kKSwgU2V2ZXJpdHkoU2V2ZXJpdHkpIHt9CisKKyAgdmlydHVhbCB+RGlhZ25vc3RpY0luZm8oKSA9IGRlZmF1bHQ7CisKKyAgLyogRGlhZ25vc3RpY0tpbmQgKi8gaW50IGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisgIERpYWdub3N0aWNTZXZlcml0eSBnZXRTZXZlcml0eSgpIGNvbnN0IHsgcmV0dXJuIFNldmVyaXR5OyB9CisKKyAgLy8vIFByaW50IHVzaW5nIHRoZSBnaXZlbiBccCBEUCBhIHVzZXItZnJpZW5kbHkgbWVzc2FnZS4KKyAgLy8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgbWVzc2FnZSB0aGF0IHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgdXNlci4KKyAgLy8vIEl0IGlzIHVzZWQgd2hlbiB0aGUgZnJvbnRlbmQgZG9lcyBub3QgZGlyZWN0bHkgdGFrZSBhZHZhbnRhZ2UKKyAgLy8vIG9mIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gZmllbGRzIG9mIHRoZSBzdWJjbGFzc2VzLgorICAvLy8gVGhlIHByaW50ZWQgbWVzc2FnZSBtdXN0IG5vdCBlbmQgd2l0aCAnLicgbm9yIHN0YXJ0IHdpdGggYSBzZXZlcml0eQorICAvLy8ga2V5d29yZC4KKyAgdmlydHVhbCB2b2lkIHByaW50KERpYWdub3N0aWNQcmludGVyICZEUCkgY29uc3QgPSAwOworfTsKKwordXNpbmcgRGlhZ25vc3RpY0hhbmRsZXJGdW5jdGlvbiA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBEaWFnbm9zdGljSW5mbyAmKT47CisKKy8vLyBEaWFnbm9zdGljIGluZm9ybWF0aW9uIGZvciBpbmxpbmUgYXNtIHJlcG9ydGluZy4KKy8vLyBUaGlzIGlzIGJhc2ljYWxseSBhIG1lc3NhZ2UgYW5kIGFuIG9wdGlvbmFsIGxvY2F0aW9uLgorY2xhc3MgRGlhZ25vc3RpY0luZm9JbmxpbmVBc20gOiBwdWJsaWMgRGlhZ25vc3RpY0luZm8geworcHJpdmF0ZToKKyAgLy8vIE9wdGlvbmFsIGxpbmUgaW5mb3JtYXRpb24uIDAgaWYgbm90IHNldC4KKyAgdW5zaWduZWQgTG9jQ29va2llID0gMDsKKyAgLy8vIE1lc3NhZ2UgdG8gYmUgcmVwb3J0ZWQuCisgIGNvbnN0IFR3aW5lICZNc2dTdHI7CisgIC8vLyBPcHRpb25hbCBvcmlnaW4gb2YgdGhlIHByb2JsZW0uCisgIGNvbnN0IEluc3RydWN0aW9uICpJbnN0ciA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgLy8vIFxwIE1zZ1N0ciBpcyB0aGUgbWVzc2FnZSB0byBiZSByZXBvcnRlZCB0byB0aGUgZnJvbnRlbmQuCisgIC8vLyBUaGlzIGNsYXNzIGRvZXMgbm90IGNvcHkgXHAgTXNnU3RyLCB0aGVyZWZvcmUgdGhlIHJlZmVyZW5jZSBtdXN0IGJlIHZhbGlkCisgIC8vLyBmb3IgdGhlIHdob2xlIGxpZmUgdGltZSBvZiB0aGUgRGlhZ25vc3RpYy4KKyAgRGlhZ25vc3RpY0luZm9JbmxpbmVBc20oY29uc3QgVHdpbmUgJk1zZ1N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY1NldmVyaXR5IFNldmVyaXR5ID0gRFNfRXJyb3IpCisgICAgICA6IERpYWdub3N0aWNJbmZvKERLX0lubGluZUFzbSwgU2V2ZXJpdHkpLCBNc2dTdHIoTXNnU3RyKSB7fQorCisgIC8vLyBccCBMb2NDb29raWUgaWYgbm9uLXplcm8gZ2l2ZXMgdGhlIGxpbmUgbnVtYmVyIGZvciB0aGlzIHJlcG9ydC4KKyAgLy8vIFxwIE1zZ1N0ciBnaXZlcyB0aGUgbWVzc2FnZS4KKyAgLy8vIFRoaXMgY2xhc3MgZG9lcyBub3QgY29weSBccCBNc2dTdHIsIHRoZXJlZm9yZSB0aGUgcmVmZXJlbmNlIG11c3QgYmUgdmFsaWQKKyAgLy8vIGZvciB0aGUgd2hvbGUgbGlmZSB0aW1lIG9mIHRoZSBEaWFnbm9zdGljLgorICBEaWFnbm9zdGljSW5mb0lubGluZUFzbSh1bnNpZ25lZCBMb2NDb29raWUsIGNvbnN0IFR3aW5lICZNc2dTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNTZXZlcml0eSBTZXZlcml0eSA9IERTX0Vycm9yKQorICAgICAgOiBEaWFnbm9zdGljSW5mbyhES19JbmxpbmVBc20sIFNldmVyaXR5KSwgTG9jQ29va2llKExvY0Nvb2tpZSksCisgICAgICAgIE1zZ1N0cihNc2dTdHIpIHt9CisKKyAgLy8vIFxwIEluc3RyIGdpdmVzIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbiB0aGF0IHRyaWdnZXJlZCB0aGUgZGlhZ25vc3RpYy4KKyAgLy8vIFxwIE1zZ1N0ciBnaXZlcyB0aGUgbWVzc2FnZS4KKyAgLy8vIFRoaXMgY2xhc3MgZG9lcyBub3QgY29weSBccCBNc2dTdHIsIHRoZXJlZm9yZSB0aGUgcmVmZXJlbmNlIG11c3QgYmUgdmFsaWQKKyAgLy8vIGZvciB0aGUgd2hvbGUgbGlmZSB0aW1lIG9mIHRoZSBEaWFnbm9zdGljLgorICAvLy8gU2FtZSBmb3IgXHAgSS4KKyAgRGlhZ25vc3RpY0luZm9JbmxpbmVBc20oY29uc3QgSW5zdHJ1Y3Rpb24gJkksIGNvbnN0IFR3aW5lICZNc2dTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNTZXZlcml0eSBTZXZlcml0eSA9IERTX0Vycm9yKTsKKworICB1bnNpZ25lZCBnZXRMb2NDb29raWUoKSBjb25zdCB7IHJldHVybiBMb2NDb29raWU7IH0KKyAgY29uc3QgVHdpbmUgJmdldE1zZ1N0cigpIGNvbnN0IHsgcmV0dXJuIE1zZ1N0cjsgfQorICBjb25zdCBJbnN0cnVjdGlvbiAqZ2V0SW5zdHJ1Y3Rpb24oKSBjb25zdCB7IHJldHVybiBJbnN0cjsgfQorCisgIC8vLyBcc2VlIERpYWdub3N0aWNJbmZvOjpwcmludC4KKyAgdm9pZCBwcmludChEaWFnbm9zdGljUHJpbnRlciAmRFApIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGlhZ25vc3RpY0luZm8gKkRJKSB7CisgICAgcmV0dXJuIERJLT5nZXRLaW5kKCkgPT0gREtfSW5saW5lQXNtOworICB9Cit9OworCisvLy8gRGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmb3Igc3RhY2sgc2l6ZSBldGMuIHJlcG9ydGluZy4KKy8vLyBUaGlzIGlzIGJhc2ljYWxseSBhIGZ1bmN0aW9uIGFuZCBhIHNpemUuCitjbGFzcyBEaWFnbm9zdGljSW5mb1Jlc291cmNlTGltaXQgOiBwdWJsaWMgRGlhZ25vc3RpY0luZm8geworcHJpdmF0ZToKKyAgLy8vIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNvbmNlcm5lZCBieSB0aGlzIHJlc291cmNlIGxpbWl0IGRpYWdub3N0aWMuCisgIGNvbnN0IEZ1bmN0aW9uICZGbjsKKworICAvLy8gRGVzY3JpcHRpb24gb2YgdGhlIHJlc291cmNlIHR5cGUgKGUuZy4gc3RhY2sgc2l6ZSkKKyAgY29uc3QgY2hhciAqUmVzb3VyY2VOYW1lOworCisgIC8vLyBUaGUgY29tcHV0ZWQgc2l6ZSB1c2FnZQorICB1aW50NjRfdCBSZXNvdXJjZVNpemU7CisKKyAgLy8gVGhyZXNob3VsZCBwYXNzZWQKKyAgdWludDY0X3QgUmVzb3VyY2VMaW1pdDsKKworcHVibGljOgorICAvLy8gXHAgVGhlIGZ1bmN0aW9uIHRoYXQgaXMgY29uY2VybmVkIGJ5IHRoaXMgc3RhY2sgc2l6ZSBkaWFnbm9zdGljLgorICAvLy8gXHAgVGhlIGNvbXB1dGVkIHN0YWNrIHNpemUuCisgIERpYWdub3N0aWNJbmZvUmVzb3VyY2VMaW1pdChjb25zdCBGdW5jdGlvbiAmRm4sIGNvbnN0IGNoYXIgKlJlc291cmNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFJlc291cmNlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNTZXZlcml0eSBTZXZlcml0eSA9IERTX1dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljS2luZCBLaW5kID0gREtfUmVzb3VyY2VMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFJlc291cmNlTGltaXQgPSAwKQorICAgICAgOiBEaWFnbm9zdGljSW5mbyhLaW5kLCBTZXZlcml0eSksIEZuKEZuKSwgUmVzb3VyY2VOYW1lKFJlc291cmNlTmFtZSksCisgICAgICAgIFJlc291cmNlU2l6ZShSZXNvdXJjZVNpemUpLCBSZXNvdXJjZUxpbWl0KFJlc291cmNlTGltaXQpIHt9CisKKyAgY29uc3QgRnVuY3Rpb24gJmdldEZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gRm47IH0KKyAgY29uc3QgY2hhciAqZ2V0UmVzb3VyY2VOYW1lKCkgY29uc3QgeyByZXR1cm4gUmVzb3VyY2VOYW1lOyB9CisgIHVpbnQ2NF90IGdldFJlc291cmNlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFJlc291cmNlU2l6ZTsgfQorICB1aW50NjRfdCBnZXRSZXNvdXJjZUxpbWl0KCkgY29uc3QgeyByZXR1cm4gUmVzb3VyY2VMaW1pdDsgfQorCisgIC8vLyBcc2VlIERpYWdub3N0aWNJbmZvOjpwcmludC4KKyAgdm9pZCBwcmludChEaWFnbm9zdGljUHJpbnRlciAmRFApIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGlhZ25vc3RpY0luZm8gKkRJKSB7CisgICAgcmV0dXJuIERJLT5nZXRLaW5kKCkgPT0gREtfUmVzb3VyY2VMaW1pdCB8fCBESS0+Z2V0S2luZCgpID09IERLX1N0YWNrU2l6ZTsKKyAgfQorfTsKKworY2xhc3MgRGlhZ25vc3RpY0luZm9TdGFja1NpemUgOiBwdWJsaWMgRGlhZ25vc3RpY0luZm9SZXNvdXJjZUxpbWl0IHsKK3B1YmxpYzoKKyAgRGlhZ25vc3RpY0luZm9TdGFja1NpemUoY29uc3QgRnVuY3Rpb24gJkZuLCB1aW50NjRfdCBTdGFja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNTZXZlcml0eSBTZXZlcml0eSA9IERTX1dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFN0YWNrTGltaXQgPSAwKQorICAgICAgOiBEaWFnbm9zdGljSW5mb1Jlc291cmNlTGltaXQoRm4sICJzdGFjayBzaXplIiwgU3RhY2tTaXplLCBTZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERLX1N0YWNrU2l6ZSwgU3RhY2tMaW1pdCkge30KKworICB1aW50NjRfdCBnZXRTdGFja1NpemUoKSBjb25zdCB7IHJldHVybiBnZXRSZXNvdXJjZVNpemUoKTsgfQorICB1aW50NjRfdCBnZXRTdGFja0xpbWl0KCkgY29uc3QgeyByZXR1cm4gZ2V0UmVzb3VyY2VMaW1pdCgpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEaWFnbm9zdGljSW5mbyAqREkpIHsKKyAgICByZXR1cm4gREktPmdldEtpbmQoKSA9PSBES19TdGFja1NpemU7CisgIH0KK307CisKKy8vLyBEaWFnbm9zdGljIGluZm9ybWF0aW9uIGZvciBkZWJ1ZyBtZXRhZGF0YSB2ZXJzaW9uIHJlcG9ydGluZy4KKy8vLyBUaGlzIGlzIGJhc2ljYWxseSBhIG1vZHVsZSBhbmQgYSB2ZXJzaW9uLgorY2xhc3MgRGlhZ25vc3RpY0luZm9EZWJ1Z01ldGFkYXRhVmVyc2lvbiA6IHB1YmxpYyBEaWFnbm9zdGljSW5mbyB7Citwcml2YXRlOgorICAvLy8gVGhlIG1vZHVsZSB0aGF0IGlzIGNvbmNlcm5lZCBieSB0aGlzIGRlYnVnIG1ldGFkYXRhIHZlcnNpb24gZGlhZ25vc3RpYy4KKyAgY29uc3QgTW9kdWxlICZNOworICAvLy8gVGhlIGFjdHVhbCBtZXRhZGF0YSB2ZXJzaW9uLgorICB1bnNpZ25lZCBNZXRhZGF0YVZlcnNpb247CisKK3B1YmxpYzoKKyAgLy8vIFxwIFRoZSBtb2R1bGUgdGhhdCBpcyBjb25jZXJuZWQgYnkgdGhpcyBkZWJ1ZyBtZXRhZGF0YSB2ZXJzaW9uIGRpYWdub3N0aWMuCisgIC8vLyBccCBUaGUgYWN0dWFsIG1ldGFkYXRhIHZlcnNpb24uCisgIERpYWdub3N0aWNJbmZvRGVidWdNZXRhZGF0YVZlcnNpb24oY29uc3QgTW9kdWxlICZNLCB1bnNpZ25lZCBNZXRhZGF0YVZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY1NldmVyaXR5IFNldmVyaXR5ID0gRFNfV2FybmluZykKKyAgICAgIDogRGlhZ25vc3RpY0luZm8oREtfRGVidWdNZXRhZGF0YVZlcnNpb24sIFNldmVyaXR5KSwgTShNKSwKKyAgICAgICAgTWV0YWRhdGFWZXJzaW9uKE1ldGFkYXRhVmVyc2lvbikge30KKworICBjb25zdCBNb2R1bGUgJmdldE1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIE07IH0KKyAgdW5zaWduZWQgZ2V0TWV0YWRhdGFWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gTWV0YWRhdGFWZXJzaW9uOyB9CisKKyAgLy8vIFxzZWUgRGlhZ25vc3RpY0luZm86OnByaW50LgorICB2b2lkIHByaW50KERpYWdub3N0aWNQcmludGVyICZEUCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEaWFnbm9zdGljSW5mbyAqREkpIHsKKyAgICByZXR1cm4gREktPmdldEtpbmQoKSA9PSBES19EZWJ1Z01ldGFkYXRhVmVyc2lvbjsKKyAgfQorfTsKKworLy8vIERpYWdub3N0aWMgaW5mb3JtYXRpb24gZm9yIHN0cmlwcGluZyBpbnZhbGlkIGRlYnVnIG1ldGFkYXRhLgorY2xhc3MgRGlhZ25vc3RpY0luZm9JZ25vcmluZ0ludmFsaWREZWJ1Z01ldGFkYXRhIDogcHVibGljIERpYWdub3N0aWNJbmZvIHsKK3ByaXZhdGU6CisgIC8vLyBUaGUgbW9kdWxlIHRoYXQgaXMgY29uY2VybmVkIGJ5IHRoaXMgZGVidWcgbWV0YWRhdGEgdmVyc2lvbiBkaWFnbm9zdGljLgorICBjb25zdCBNb2R1bGUgJk07CisKK3B1YmxpYzoKKyAgLy8vIFxwIFRoZSBtb2R1bGUgdGhhdCBpcyBjb25jZXJuZWQgYnkgdGhpcyBkZWJ1ZyBtZXRhZGF0YSB2ZXJzaW9uIGRpYWdub3N0aWMuCisgIERpYWdub3N0aWNJbmZvSWdub3JpbmdJbnZhbGlkRGVidWdNZXRhZGF0YSgKKyAgICAgIGNvbnN0IE1vZHVsZSAmTSwgRGlhZ25vc3RpY1NldmVyaXR5IFNldmVyaXR5ID0gRFNfV2FybmluZykKKyAgICAgIDogRGlhZ25vc3RpY0luZm8oREtfRGVidWdNZXRhZGF0YVZlcnNpb24sIFNldmVyaXR5KSwgTShNKSB7fQorCisgIGNvbnN0IE1vZHVsZSAmZ2V0TW9kdWxlKCkgY29uc3QgeyByZXR1cm4gTTsgfQorCisgIC8vLyBcc2VlIERpYWdub3N0aWNJbmZvOjpwcmludC4KKyAgdm9pZCBwcmludChEaWFnbm9zdGljUHJpbnRlciAmRFApIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGlhZ25vc3RpY0luZm8gKkRJKSB7CisgICAgcmV0dXJuIERJLT5nZXRLaW5kKCkgPT0gREtfRGVidWdNZXRhZGF0YUludmFsaWQ7CisgIH0KK307CisKKy8vLyBEaWFnbm9zdGljIGluZm9ybWF0aW9uIGZvciB0aGUgc2FtcGxlIHByb2ZpbGVyLgorY2xhc3MgRGlhZ25vc3RpY0luZm9TYW1wbGVQcm9maWxlIDogcHVibGljIERpYWdub3N0aWNJbmZvIHsKK3B1YmxpYzoKKyAgRGlhZ25vc3RpY0luZm9TYW1wbGVQcm9maWxlKFN0cmluZ1JlZiBGaWxlTmFtZSwgdW5zaWduZWQgTGluZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljU2V2ZXJpdHkgU2V2ZXJpdHkgPSBEU19FcnJvcikKKyAgICAgIDogRGlhZ25vc3RpY0luZm8oREtfU2FtcGxlUHJvZmlsZSwgU2V2ZXJpdHkpLCBGaWxlTmFtZShGaWxlTmFtZSksCisgICAgICAgIExpbmVOdW0oTGluZU51bSksIE1zZyhNc2cpIHt9CisgIERpYWdub3N0aWNJbmZvU2FtcGxlUHJvZmlsZShTdHJpbmdSZWYgRmlsZU5hbWUsIGNvbnN0IFR3aW5lICZNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljU2V2ZXJpdHkgU2V2ZXJpdHkgPSBEU19FcnJvcikKKyAgICAgIDogRGlhZ25vc3RpY0luZm8oREtfU2FtcGxlUHJvZmlsZSwgU2V2ZXJpdHkpLCBGaWxlTmFtZShGaWxlTmFtZSksCisgICAgICAgIE1zZyhNc2cpIHt9CisgIERpYWdub3N0aWNJbmZvU2FtcGxlUHJvZmlsZShjb25zdCBUd2luZSAmTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY1NldmVyaXR5IFNldmVyaXR5ID0gRFNfRXJyb3IpCisgICAgICA6IERpYWdub3N0aWNJbmZvKERLX1NhbXBsZVByb2ZpbGUsIFNldmVyaXR5KSwgTXNnKE1zZykge30KKworICAvLy8gXHNlZSBEaWFnbm9zdGljSW5mbzo6cHJpbnQuCisgIHZvaWQgcHJpbnQoRGlhZ25vc3RpY1ByaW50ZXIgJkRQKSBjb25zdCBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERpYWdub3N0aWNJbmZvICpESSkgeworICAgIHJldHVybiBESS0+Z2V0S2luZCgpID09IERLX1NhbXBsZVByb2ZpbGU7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0RmlsZU5hbWUoKSBjb25zdCB7IHJldHVybiBGaWxlTmFtZTsgfQorICB1bnNpZ25lZCBnZXRMaW5lTnVtKCkgY29uc3QgeyByZXR1cm4gTGluZU51bTsgfQorICBjb25zdCBUd2luZSAmZ2V0TXNnKCkgY29uc3QgeyByZXR1cm4gTXNnOyB9CisKK3ByaXZhdGU6CisgIC8vLyBOYW1lIG9mIHRoZSBpbnB1dCBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRpYWdub3N0aWMuCisgIFN0cmluZ1JlZiBGaWxlTmFtZTsKKworICAvLy8gTGluZSBudW1iZXIgd2hlcmUgdGhlIGRpYWdub3N0aWMgb2NjdXJyZWQuIElmIDAsIG5vIGxpbmUgbnVtYmVyIHdpbGwKKyAgLy8vIGJlIGVtaXR0ZWQgaW4gdGhlIG1lc3NhZ2UuCisgIHVuc2lnbmVkIExpbmVOdW0gPSAwOworCisgIC8vLyBNZXNzYWdlIHRvIHJlcG9ydC4KKyAgY29uc3QgVHdpbmUgJk1zZzsKK307CisKKy8vLyBEaWFnbm9zdGljIGluZm9ybWF0aW9uIGZvciB0aGUgUEdPIHByb2ZpbGVyLgorY2xhc3MgRGlhZ25vc3RpY0luZm9QR09Qcm9maWxlIDogcHVibGljIERpYWdub3N0aWNJbmZvIHsKK3B1YmxpYzoKKyAgRGlhZ25vc3RpY0luZm9QR09Qcm9maWxlKGNvbnN0IGNoYXIgKkZpbGVOYW1lLCBjb25zdCBUd2luZSAmTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY1NldmVyaXR5IFNldmVyaXR5ID0gRFNfRXJyb3IpCisgICAgICA6IERpYWdub3N0aWNJbmZvKERLX1BHT1Byb2ZpbGUsIFNldmVyaXR5KSwgRmlsZU5hbWUoRmlsZU5hbWUpLCBNc2coTXNnKSB7fQorCisgIC8vLyBcc2VlIERpYWdub3N0aWNJbmZvOjpwcmludC4KKyAgdm9pZCBwcmludChEaWFnbm9zdGljUHJpbnRlciAmRFApIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGlhZ25vc3RpY0luZm8gKkRJKSB7CisgICAgcmV0dXJuIERJLT5nZXRLaW5kKCkgPT0gREtfUEdPUHJvZmlsZTsKKyAgfQorCisgIGNvbnN0IGNoYXIgKmdldEZpbGVOYW1lKCkgY29uc3QgeyByZXR1cm4gRmlsZU5hbWU7IH0KKyAgY29uc3QgVHdpbmUgJmdldE1zZygpIGNvbnN0IHsgcmV0dXJuIE1zZzsgfQorCitwcml2YXRlOgorICAvLy8gTmFtZSBvZiB0aGUgaW5wdXQgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBkaWFnbm9zdGljLgorICBjb25zdCBjaGFyICpGaWxlTmFtZTsKKworICAvLy8gTWVzc2FnZSB0byByZXBvcnQuCisgIGNvbnN0IFR3aW5lICZNc2c7Cit9OworCitjbGFzcyBEaWFnbm9zdGljTG9jYXRpb24geworICBTdHJpbmdSZWYgRmlsZW5hbWU7CisgIHVuc2lnbmVkIExpbmUgPSAwOworICB1bnNpZ25lZCBDb2x1bW4gPSAwOworCitwdWJsaWM6CisgIERpYWdub3N0aWNMb2NhdGlvbigpID0gZGVmYXVsdDsKKyAgRGlhZ25vc3RpY0xvY2F0aW9uKGNvbnN0IERlYnVnTG9jICZETCk7CisgIERpYWdub3N0aWNMb2NhdGlvbihjb25zdCBESVN1YnByb2dyYW0gKlNQKTsKKworICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiAhRmlsZW5hbWUuZW1wdHkoKTsgfQorICBTdHJpbmdSZWYgZ2V0RmlsZW5hbWUoKSBjb25zdCB7IHJldHVybiBGaWxlbmFtZTsgfQorICB1bnNpZ25lZCBnZXRMaW5lKCkgY29uc3QgeyByZXR1cm4gTGluZTsgfQorICB1bnNpZ25lZCBnZXRDb2x1bW4oKSBjb25zdCB7IHJldHVybiBDb2x1bW47IH0KK307CisKKy8vLyBDb21tb24gZmVhdHVyZXMgZm9yIGRpYWdub3N0aWNzIHdpdGggYW4gYXNzb2NpYXRlZCBsb2NhdGlvbi4KK2NsYXNzIERpYWdub3N0aWNJbmZvV2l0aExvY2F0aW9uQmFzZSA6IHB1YmxpYyBEaWFnbm9zdGljSW5mbyB7CitwdWJsaWM6CisgIC8vLyBccCBGbiBpcyB0aGUgZnVuY3Rpb24gd2hlcmUgdGhlIGRpYWdub3N0aWMgaXMgYmVpbmcgZW1pdHRlZC4gXHAgTG9jIGlzCisgIC8vLyB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gdXNlIGluIHRoZSBkaWFnbm9zdGljLgorICBEaWFnbm9zdGljSW5mb1dpdGhMb2NhdGlvbkJhc2UoZW51bSBEaWFnbm9zdGljS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBEaWFnbm9zdGljU2V2ZXJpdHkgU2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiAmRm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljTG9jYXRpb24gJkxvYykKKyAgICAgIDogRGlhZ25vc3RpY0luZm8oS2luZCwgU2V2ZXJpdHkpLCBGbihGbiksIExvYyhMb2MpIHt9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGxvY2F0aW9uIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBmb3IgdGhpcyBkaWFnbm9zdGljLgorICBib29sIGlzTG9jYXRpb25BdmFpbGFibGUoKSBjb25zdCB7IHJldHVybiBMb2MuaXNWYWxpZCgpOyB9CisKKyAgLy8vIFJldHVybiBhIHN0cmluZyB3aXRoIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBkaWFnbm9zdGljCisgIC8vLyBpbiB0aGUgZm9ybWF0ICJmaWxlOmxpbmU6Y29sIi4gSWYgbG9jYXRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSwKKyAgLy8vIGl0IHJldHVybnMgIjx1bmtub3duPjowOjAiLgorICBjb25zdCBzdGQ6OnN0cmluZyBnZXRMb2NhdGlvblN0cigpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoaXMgZGlhZ25vc3RpYyBpbiB0aHJlZSBwYXJ0czoKKyAgLy8vIHRoZSBzb3VyY2UgZmlsZSBuYW1lLCBsaW5lIG51bWJlciBhbmQgY29sdW1uLgorICB2b2lkIGdldExvY2F0aW9uKFN0cmluZ1JlZiAqRmlsZW5hbWUsIHVuc2lnbmVkICpMaW5lLCB1bnNpZ25lZCAqQ29sdW1uKSBjb25zdDsKKworICBjb25zdCBGdW5jdGlvbiAmZ2V0RnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBGbjsgfQorICBEaWFnbm9zdGljTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKworcHJpdmF0ZToKKyAgLy8vIEZ1bmN0aW9uIHdoZXJlIHRoaXMgZGlhZ25vc3RpYyBpcyB0cmlnZ2VyZWQuCisgIGNvbnN0IEZ1bmN0aW9uICZGbjsKKworICAvLy8gRGVidWcgbG9jYXRpb24gd2hlcmUgdGhpcyBkaWFnbm9zdGljIGlzIHRyaWdnZXJlZC4KKyAgRGlhZ25vc3RpY0xvY2F0aW9uIExvYzsKK307CisKKy8vLyBcYnJpZWYgQ29tbW9uIGZlYXR1cmVzIGZvciBkaWFnbm9zdGljcyBkZWFsaW5nIHdpdGggb3B0aW1pemF0aW9uIHJlbWFya3MKKy8vLyB0aGF0IGFyZSB1c2VkIGJ5IGJvdGggSVIgYW5kIE1JUiBwYXNzZXMuCitjbGFzcyBEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2UgOiBwdWJsaWMgRGlhZ25vc3RpY0luZm9XaXRoTG9jYXRpb25CYXNlIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBVc2VkIHRvIHNldCBJc1ZlcmJvc2UgdmlhIHRoZSBzdHJlYW0gaW50ZXJmYWNlLgorICBzdHJ1Y3Qgc2V0SXNWZXJib3NlIHt9OworCisgIC8vLyBcYnJpZWYgV2hlbiBhbiBpbnN0YW5jZSBvZiB0aGlzIGlzIGluc2VydGVkIGludG8gdGhlIHN0cmVhbSwgdGhlIGFyZ3VtZW50cworICAvLy8gZm9sbG93aW5nIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgcmVtYXJrIHByaW50ZWQgaW4gdGhlIGNvbXBpbGVyIG91dHB1dAorICAvLy8gKC1ScGFzcykgYnV0IG9ubHkgaW4gdGhlIG9wdGltaXphdGlvbiByZWNvcmQgZmlsZQorICAvLy8gKC1mc2F2ZS1vcHRpbWl6YXRpb24tcmVjb3JkKS4KKyAgc3RydWN0IHNldEV4dHJhQXJncyB7fTsKKworICAvLy8gXGJyaWVmIFVzZWQgaW4gdGhlIHN0cmVhbWluZyBpbnRlcmZhY2UgYXMgdGhlIGdlbmVyYWwgYXJndW1lbnQgdHlwZS4gIEl0CisgIC8vLyBpbnRlcm5hbGx5IGNvbnZlcnRzIGV2ZXJ5dGhpbmcgaW50byBhIGtleS12YWx1ZSBwYWlyLgorICBzdHJ1Y3QgQXJndW1lbnQgeworICAgIHN0ZDo6c3RyaW5nIEtleTsKKyAgICBzdGQ6OnN0cmluZyBWYWw7CisgICAgLy8gSWYgc2V0LCB0aGUgZGVidWcgbG9jYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgdmFsdWUuCisgICAgRGlhZ25vc3RpY0xvY2F0aW9uIExvYzsKKworICAgIGV4cGxpY2l0IEFyZ3VtZW50KFN0cmluZ1JlZiBTdHIgPSAiIikgOiBLZXkoIlN0cmluZyIpLCBWYWwoU3RyKSB7fQorICAgIEFyZ3VtZW50KFN0cmluZ1JlZiBLZXksIGNvbnN0IFZhbHVlICpWKTsKKyAgICBBcmd1bWVudChTdHJpbmdSZWYgS2V5LCBjb25zdCBUeXBlICpUKTsKKyAgICBBcmd1bWVudChTdHJpbmdSZWYgS2V5LCBTdHJpbmdSZWYgUyk7CisgICAgQXJndW1lbnQoU3RyaW5nUmVmIEtleSwgaW50IE4pOworICAgIEFyZ3VtZW50KFN0cmluZ1JlZiBLZXksIGZsb2F0IE4pOworICAgIEFyZ3VtZW50KFN0cmluZ1JlZiBLZXksIGxvbmcgTik7CisgICAgQXJndW1lbnQoU3RyaW5nUmVmIEtleSwgbG9uZyBsb25nIE4pOworICAgIEFyZ3VtZW50KFN0cmluZ1JlZiBLZXksIHVuc2lnbmVkIE4pOworICAgIEFyZ3VtZW50KFN0cmluZ1JlZiBLZXksIHVuc2lnbmVkIGxvbmcgTik7CisgICAgQXJndW1lbnQoU3RyaW5nUmVmIEtleSwgdW5zaWduZWQgbG9uZyBsb25nIE4pOworICAgIEFyZ3VtZW50KFN0cmluZ1JlZiBLZXksIGJvb2wgQikgOiBLZXkoS2V5KSwgVmFsKEIgPyAidHJ1ZSIgOiAiZmFsc2UiKSB7fQorICAgIEFyZ3VtZW50KFN0cmluZ1JlZiBLZXksIERlYnVnTG9jIGRsKTsKKyAgfTsKKworICAvLy8gXHAgUGFzc05hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhc3MgZW1pdHRpbmcgdGhpcyBkaWFnbm9zdGljLiBccAorICAvLy8gUmVtYXJrTmFtZSBpcyBhIHRleHR1YWwgaWRlbnRpZmllciBmb3IgdGhlIHJlbWFyayAoc2luZ2xlLXdvcmQsCisgIC8vLyBjYW1lbC1jYXNlKS4gXHAgRm4gaXMgdGhlIGZ1bmN0aW9uIHdoZXJlIHRoZSBkaWFnbm9zdGljIGlzIGJlaW5nIGVtaXR0ZWQuCisgIC8vLyBccCBMb2MgaXMgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIHVzZSBpbiB0aGUgZGlhZ25vc3RpYy4gSWYgbGluZSB0YWJsZQorICAvLy8gaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLCB0aGUgZGlhZ25vc3RpYyB3aWxsIGluY2x1ZGUgdGhlIHNvdXJjZSBjb2RlCisgIC8vLyBsb2NhdGlvbi4KKyAgRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlKGVudW0gRGlhZ25vc3RpY0tpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gRGlhZ25vc3RpY1NldmVyaXR5IFNldmVyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqUGFzc05hbWUsIFN0cmluZ1JlZiBSZW1hcmtOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb24gJkZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY0xvY2F0aW9uICZMb2MpCisgICAgICA6IERpYWdub3N0aWNJbmZvV2l0aExvY2F0aW9uQmFzZShLaW5kLCBTZXZlcml0eSwgRm4sIExvYyksCisgICAgICAgIFBhc3NOYW1lKFBhc3NOYW1lKSwgUmVtYXJrTmFtZShSZW1hcmtOYW1lKSB7fQorCisgIHZvaWQgaW5zZXJ0KFN0cmluZ1JlZiBTKTsKKyAgdm9pZCBpbnNlcnQoQXJndW1lbnQgQSk7CisgIHZvaWQgaW5zZXJ0KHNldElzVmVyYm9zZSBWKTsKKyAgdm9pZCBpbnNlcnQoc2V0RXh0cmFBcmdzIEVBKTsKKworICAvLy8gXHNlZSBEaWFnbm9zdGljSW5mbzo6cHJpbnQuCisgIHZvaWQgcHJpbnQoRGlhZ25vc3RpY1ByaW50ZXIgJkRQKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBvcHRpbWl6YXRpb24gcmVtYXJrIGlzIGVuYWJsZWQgYnkgb25lIG9mCisgIC8vLyBvZiB0aGUgTExWTSBjb21tYW5kIGxpbmUgZmxhZ3MgKC1wYXNzLXJlbWFya3MsIC1wYXNzLXJlbWFya3MtbWlzc2VkLAorICAvLy8gb3IgLXBhc3MtcmVtYXJrcy1hbmFseXNpcykuIE5vdGUgdGhhdCB0aGlzIG9ubHkgaGFuZGxlcyB0aGUgTExWTQorICAvLy8gZmxhZ3MuIFdlIGNhbm5vdCBhY2Nlc3MgQ2xhbmcgZmxhZ3MgZnJvbSBoZXJlICh0aGV5IGFyZSBoYW5kbGVkCisgIC8vLyBpbiBCYWNrZW5kQ29uc3VtZXI6Ok9wdGltaXphdGlvblJlbWFya0hhbmRsZXIpLgorICB2aXJ0dWFsIGJvb2wgaXNFbmFibGVkKCkgY29uc3QgPSAwOworCisgIFN0cmluZ1JlZiBnZXRQYXNzTmFtZSgpIGNvbnN0IHsgcmV0dXJuIFBhc3NOYW1lOyB9CisgIHN0ZDo6c3RyaW5nIGdldE1zZygpIGNvbnN0OworICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0SG90bmVzcygpIGNvbnN0IHsgcmV0dXJuIEhvdG5lc3M7IH0KKyAgdm9pZCBzZXRIb3RuZXNzKE9wdGlvbmFsPHVpbnQ2NF90PiBIKSB7IEhvdG5lc3MgPSBIOyB9CisKKyAgYm9vbCBpc1ZlcmJvc2UoKSBjb25zdCB7IHJldHVybiBJc1ZlcmJvc2U7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERpYWdub3N0aWNJbmZvICpESSkgeworICAgIHJldHVybiAoREktPmdldEtpbmQoKSA+PSBES19GaXJzdFJlbWFyayAmJgorICAgICAgICAgICAgREktPmdldEtpbmQoKSA8PSBES19MYXN0UmVtYXJrKSB8fAorICAgICAgICAgICAoREktPmdldEtpbmQoKSA+PSBES19GaXJzdE1hY2hpbmVSZW1hcmsgJiYKKyAgICAgICAgICAgIERJLT5nZXRLaW5kKCkgPD0gREtfTGFzdE1hY2hpbmVSZW1hcmspOworICB9CisKKyAgYm9vbCBpc1Bhc3NlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldEtpbmQoKSA9PSBES19PcHRpbWl6YXRpb25SZW1hcmsgfHwKKyAgICAgICAgICAgIGdldEtpbmQoKSA9PSBES19NYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrKTsKKyAgfQorCisgIGJvb2wgaXNNaXNzZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRLaW5kKCkgPT0gREtfT3B0aW1pemF0aW9uUmVtYXJrTWlzc2VkIHx8CisgICAgICAgICAgICBnZXRLaW5kKCkgPT0gREtfTWFjaGluZU9wdGltaXphdGlvblJlbWFya01pc3NlZCk7CisgIH0KKworICBib29sIGlzQW5hbHlzaXMoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRLaW5kKCkgPT0gREtfT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMgfHwKKyAgICAgICAgICAgIGdldEtpbmQoKSA9PSBES19NYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMpOworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8vIE5hbWUgb2YgdGhlIHBhc3MgdGhhdCB0cmlnZ2VycyB0aGlzIHJlcG9ydC4gSWYgdGhpcyBtYXRjaGVzIHRoZQorICAvLy8gcmVndWxhciBleHByZXNzaW9uIGdpdmVuIGluIC1ScGFzcz1yZWdleHAsIHRoZW4gdGhlIHJlbWFyayB3aWxsCisgIC8vLyBiZSBlbWl0dGVkLgorICBjb25zdCBjaGFyICpQYXNzTmFtZTsKKworICAvLy8gVGV4dHVhbCBpZGVudGlmaWVyIGZvciB0aGUgcmVtYXJrIChzaW5nbGUtd29yZCwgY2FtZWwtY2FzZSkuIENhbiBiZSB1c2VkCisgIC8vLyBieSBleHRlcm5hbCB0b29scyByZWFkaW5nIHRoZSBZQU1MIG91dHB1dCBmaWxlIGZvciBvcHRpbWl6YXRpb24gcmVtYXJrcyB0bworICAvLy8gaWRlbnRpZnkgdGhlIHJlbWFyay4KKyAgU3RyaW5nUmVmIFJlbWFya05hbWU7CisKKyAgLy8vIElmIHByb2ZpbGUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLCB0aGlzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlCisgIC8vLyBjb3JyZXNwb25kaW5nIGNvZGUgd2FzIGV4ZWN1dGVkIGluIGEgcHJvZmlsZSBpbnN0cnVtZW50YXRpb24gcnVuLgorICBPcHRpb25hbDx1aW50NjRfdD4gSG90bmVzczsKKworICAvLy8gQXJndW1lbnRzIGNvbGxlY3RlZCB2aWEgdGhlIHN0cmVhbWluZyBpbnRlcmZhY2UuCisgIFNtYWxsVmVjdG9yPEFyZ3VtZW50LCA0PiBBcmdzOworCisgIC8vLyBUaGUgcmVtYXJrIGlzIGV4cGVjdGVkIHRvIGJlIG5vaXN5LgorICBib29sIElzVmVyYm9zZSA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgSWYgcG9zaXRpdmUsIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYXJndW1lbnQgdGhhdCBvbmx5IGFwcGVhciBpbgorICAvLy8gdGhlIG9wdGltaXphdGlvbiByZWNvcmRzIGFuZCBub3QgaW4gdGhlIHJlbWFyayBwcmludGVkIGluIHRoZSBjb21waWxlcgorICAvLy8gb3V0cHV0LgorICBpbnQgRmlyc3RFeHRyYUFyZ0luZGV4ID0gLTE7CisKKyAgZnJpZW5kIHN0cnVjdCB5YW1sOjpNYXBwaW5nVHJhaXRzPERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZSAqPjsKK307CisKKy8vLyBBbGxvdyB0aGUgaW5zZXJ0aW9uIG9wZXJhdG9yIHRvIHJldHVybiB0aGUgYWN0dWFsIHJlbWFyayB0eXBlIHJhdGhlciB0aGFuIGEKKy8vLyBjb21tb24gYmFzZSBjbGFzcy4gIFRoaXMgYWxsb3dzIHJldHVybmluZyB0aGUgcmVzdWx0IG9mIHRoZSBpbnNlcnRpb24KKy8vLyBkaXJlY3RseSBieSB2YWx1ZSwgZS5nLiByZXR1cm4gT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMoLi4uKSA8PCAiYmxhaCIuCit0ZW1wbGF0ZSA8Y2xhc3MgUmVtYXJrVD4KK1JlbWFya1QgJgorb3BlcmF0b3I8PChSZW1hcmtUICZSLAorICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2UsIFJlbWFya1Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgIFN0cmluZ1JlZj46OnR5cGUgUykgeworICBSLmluc2VydChTKTsKKyAgcmV0dXJuIFI7Cit9CisKKy8vLyBBbHNvIGFsbG93IHItdmFsdWUgZm9yIHRoZSByZW1hcmsgdG8gYWxsb3cgaW5zZXJ0aW9uIGludG8gYQorLy8vIHRlbXBvcmFyaWx5LWNvbnN0cnVjdGVkIHJlbWFyay4KK3RlbXBsYXRlIDxjbGFzcyBSZW1hcmtUPgorUmVtYXJrVCAmCitvcGVyYXRvcjw8KFJlbWFya1QgJiZSLAorICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2UsIFJlbWFya1Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgIFN0cmluZ1JlZj46OnR5cGUgUykgeworICBSLmluc2VydChTKTsKKyAgcmV0dXJuIFI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBSZW1hcmtUPgorUmVtYXJrVCAmCitvcGVyYXRvcjw8KFJlbWFya1QgJlIsCisgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mPERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZSwgUmVtYXJrVD46OnZhbHVlLAorICAgICAgICAgICAgICAgRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlOjpBcmd1bWVudD46OnR5cGUgQSkgeworICBSLmluc2VydChBKTsKKyAgcmV0dXJuIFI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBSZW1hcmtUPgorUmVtYXJrVCAmCitvcGVyYXRvcjw8KFJlbWFya1QgJiZSLAorICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2UsIFJlbWFya1Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgIERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZTo6QXJndW1lbnQ+Ojp0eXBlIEEpIHsKKyAgUi5pbnNlcnQoQSk7CisgIHJldHVybiBSOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgUmVtYXJrVD4KK1JlbWFya1QgJgorb3BlcmF0b3I8PChSZW1hcmtUICZSLAorICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2UsIFJlbWFya1Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgIERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZTo6c2V0SXNWZXJib3NlPjo6dHlwZSBWKSB7CisgIFIuaW5zZXJ0KFYpOworICByZXR1cm4gUjsKK30KKwordGVtcGxhdGUgPGNsYXNzIFJlbWFya1Q+CitSZW1hcmtUICYKK29wZXJhdG9yPDwoUmVtYXJrVCAmJlIsCisgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mPERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZSwgUmVtYXJrVD46OnZhbHVlLAorICAgICAgICAgICAgICAgRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlOjpzZXRJc1ZlcmJvc2U+Ojp0eXBlIFYpIHsKKyAgUi5pbnNlcnQoVik7CisgIHJldHVybiBSOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgUmVtYXJrVD4KK1JlbWFya1QgJgorb3BlcmF0b3I8PChSZW1hcmtUICZSLAorICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2UsIFJlbWFya1Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgIERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZTo6c2V0RXh0cmFBcmdzPjo6dHlwZSBFQSkgeworICBSLmluc2VydChFQSk7CisgIHJldHVybiBSOworfQorCisvLy8gXGJyaWVmIENvbW1vbiBmZWF0dXJlcyBmb3IgZGlhZ25vc3RpY3MgZGVhbGluZyB3aXRoIG9wdGltaXphdGlvbiByZW1hcmtzCisvLy8gdGhhdCBhcmUgdXNlZCBieSBJUiBwYXNzZXMuCitjbGFzcyBEaWFnbm9zdGljSW5mb0lST3B0aW1pemF0aW9uIDogcHVibGljIERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZSB7CitwdWJsaWM6CisgIC8vLyBccCBQYXNzTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFzcyBlbWl0dGluZyB0aGlzIGRpYWdub3N0aWMuIFxwCisgIC8vLyBSZW1hcmtOYW1lIGlzIGEgdGV4dHVhbCBpZGVudGlmaWVyIGZvciB0aGUgcmVtYXJrIChzaW5nbGUtd29yZCwKKyAgLy8vIGNhbWVsLWNhc2UpLiBccCBGbiBpcyB0aGUgZnVuY3Rpb24gd2hlcmUgdGhlIGRpYWdub3N0aWMgaXMgYmVpbmcgZW1pdHRlZC4KKyAgLy8vIFxwIExvYyBpcyB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gdXNlIGluIHRoZSBkaWFnbm9zdGljLiBJZiBsaW5lIHRhYmxlCisgIC8vLyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUsIHRoZSBkaWFnbm9zdGljIHdpbGwgaW5jbHVkZSB0aGUgc291cmNlIGNvZGUKKyAgLy8vIGxvY2F0aW9uLiBccCBDb2RlUmVnaW9uIGlzIElSIHZhbHVlIChjdXJyZW50bHkgYmFzaWMgYmxvY2spIHRoYXQgdGhlCisgIC8vLyBvcHRpbWl6YXRpb24gb3BlcmF0ZXMgb24uIFRoaXMgaXMgY3VycmVudGx5IHVzZWQgdG8gcHJvdmlkZSBydW4tdGltZQorICAvLy8gaG90bmVzcyBpbmZvcm1hdGlvbiB3aXRoIFBHTy4KKyAgRGlhZ25vc3RpY0luZm9JUk9wdGltaXphdGlvbihlbnVtIERpYWdub3N0aWNLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBEaWFnbm9zdGljU2V2ZXJpdHkgU2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqUGFzc05hbWUsIFN0cmluZ1JlZiBSZW1hcmtOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uICZGbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljTG9jYXRpb24gJkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqQ29kZVJlZ2lvbiA9IG51bGxwdHIpCisgICAgICA6IERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZShLaW5kLCBTZXZlcml0eSwgUGFzc05hbWUsIFJlbWFya05hbWUsIEZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jKSwKKyAgICAgICAgQ29kZVJlZ2lvbihDb2RlUmVnaW9uKSB7fQorCisgIC8vLyBcYnJpZWYgVGhpcyBpcyBjdG9yIHZhcmlhbnQgYWxsb3dzIGEgcGFzcyB0byBidWlsZCBhbiBvcHRpbWl6YXRpb24gcmVtYXJrCisgIC8vLyBmcm9tIGFuIGV4aXN0aW5nIHJlbWFyay4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgdHJhbnNmb3JtYXRpb24gcGFzcyAoZS5nIExWKSB3YW50cyB0byBlbWl0IGEgcmVtYXJrCisgIC8vLyAoXHAgT3JpZykgZ2VuZXJhdGVkIGJ5IG9uZSBvZiBpdHMgYW5hbHlzZXMgKGUuZy4gTEFBKSBhcyBpdHMgb3duIGFuYWx5c2lzCisgIC8vLyByZW1hcmsuICBUaGUgc3RyaW5nIFxwIFByZXBlbmQgd2lsbCBiZSBlbWl0dGVkIGJlZm9yZSB0aGUgb3JpZ2luYWwKKyAgLy8vIG1lc3NhZ2UuCisgIERpYWdub3N0aWNJbmZvSVJPcHRpbWl6YXRpb24oY29uc3QgY2hhciAqUGFzc05hbWUsIFN0cmluZ1JlZiBQcmVwZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNJbmZvSVJPcHRpbWl6YXRpb24gJk9yaWcpCisgICAgICA6IERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZSgKKyAgICAgICAgICAgIChEaWFnbm9zdGljS2luZClPcmlnLmdldEtpbmQoKSwgT3JpZy5nZXRTZXZlcml0eSgpLCBQYXNzTmFtZSwKKyAgICAgICAgICAgIE9yaWcuUmVtYXJrTmFtZSwgT3JpZy5nZXRGdW5jdGlvbigpLCBPcmlnLmdldExvY2F0aW9uKCkpLAorICAgICAgICBDb2RlUmVnaW9uKE9yaWcuZ2V0Q29kZVJlZ2lvbigpKSB7CisgICAgKnRoaXMgPDwgUHJlcGVuZDsKKyAgICBzdGQ6OmNvcHkoT3JpZy5BcmdzLmJlZ2luKCksIE9yaWcuQXJncy5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKEFyZ3MpKTsKKyAgfQorCisgIC8vLyBMZWdhY3kgaW50ZXJmYWNlLgorICAvLy8gXHAgUGFzc05hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhc3MgZW1pdHRpbmcgdGhpcyBkaWFnbm9zdGljLgorICAvLy8gXHAgRm4gaXMgdGhlIGZ1bmN0aW9uIHdoZXJlIHRoZSBkaWFnbm9zdGljIGlzIGJlaW5nIGVtaXR0ZWQuIFxwIExvYyBpcworICAvLy8gdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIHVzZSBpbiB0aGUgZGlhZ25vc3RpYy4gSWYgbGluZSB0YWJsZQorICAvLy8gaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLCB0aGUgZGlhZ25vc3RpYyB3aWxsIGluY2x1ZGUgdGhlIHNvdXJjZSBjb2RlCisgIC8vLyBsb2NhdGlvbi4gXHAgTXNnIGlzIHRoZSBtZXNzYWdlIHRvIHNob3cuIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGRvZXMgbm90CisgIC8vLyBjb3B5IHRoaXMgbWVzc2FnZSwgc28gdGhpcyByZWZlcmVuY2UgbXVzdCBiZSB2YWxpZCBmb3IgdGhlIHdob2xlIGxpZmUgdGltZQorICAvLy8gb2YgdGhlIGRpYWdub3N0aWMuCisgIERpYWdub3N0aWNJbmZvSVJPcHRpbWl6YXRpb24oZW51bSBEaWFnbm9zdGljS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gRGlhZ25vc3RpY1NldmVyaXR5IFNldmVyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlBhc3NOYW1lLCBjb25zdCBGdW5jdGlvbiAmRm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY0xvY2F0aW9uICZMb2MsIGNvbnN0IFR3aW5lICZNc2cpCisgICAgICA6IERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZShLaW5kLCBTZXZlcml0eSwgUGFzc05hbWUsICIiLCBGbiwgTG9jKSB7CisgICAgKnRoaXMgPDwgTXNnLnN0cigpOworICB9CisKKyAgY29uc3QgVmFsdWUgKmdldENvZGVSZWdpb24oKSBjb25zdCB7IHJldHVybiBDb2RlUmVnaW9uOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEaWFnbm9zdGljSW5mbyAqREkpIHsKKyAgICByZXR1cm4gREktPmdldEtpbmQoKSA+PSBES19GaXJzdFJlbWFyayAmJiBESS0+Z2V0S2luZCgpIDw9IERLX0xhc3RSZW1hcms7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIFRoZSBJUiB2YWx1ZSAoY3VycmVudGx5IGJhc2ljIGJsb2NrKSB0aGF0IHRoZSBvcHRpbWl6YXRpb24gb3BlcmF0ZXMgb24uCisgIC8vLyBUaGlzIGlzIGN1cnJlbnRseSB1c2VkIHRvIHByb3ZpZGUgcnVuLXRpbWUgaG90bmVzcyBpbmZvcm1hdGlvbiB3aXRoIFBHTy4KKyAgY29uc3QgVmFsdWUgKkNvZGVSZWdpb247Cit9OworCisvLy8gRGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmb3IgYXBwbGllZCBvcHRpbWl6YXRpb24gcmVtYXJrcy4KK2NsYXNzIE9wdGltaXphdGlvblJlbWFyayA6IHB1YmxpYyBEaWFnbm9zdGljSW5mb0lST3B0aW1pemF0aW9uIHsKK3B1YmxpYzoKKyAgLy8vIFxwIFBhc3NOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXNzIGVtaXR0aW5nIHRoaXMgZGlhZ25vc3RpYy4gSWYgdGhpcyBuYW1lCisgIC8vLyBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gaW4gLVJwYXNzPSwgdGhlbiB0aGUgZGlhZ25vc3RpYyB3aWxsCisgIC8vLyBiZSBlbWl0dGVkLiBccCBSZW1hcmtOYW1lIGlzIGEgdGV4dHVhbCBpZGVudGlmaWVyIGZvciB0aGUgcmVtYXJrIChzaW5nbGUtCisgIC8vLyB3b3JkLCBjYW1lbC1jYXNlKS4gXHAgTG9jIGlzIHRoZSBkZWJ1ZyBsb2NhdGlvbiBhbmQgXHAgQ29kZVJlZ2lvbiBpcyB0aGUKKyAgLy8vIHJlZ2lvbiB0aGF0IHRoZSBvcHRpbWl6YXRpb24gb3BlcmF0ZXMgb24gKGN1cnJlbnRseSBvbmx5IGJsb2NrIGlzCisgIC8vLyBzdXBwb3J0ZWQpLgorICBPcHRpbWl6YXRpb25SZW1hcmsoY29uc3QgY2hhciAqUGFzc05hbWUsIFN0cmluZ1JlZiBSZW1hcmtOYW1lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY0xvY2F0aW9uICZMb2MsIGNvbnN0IFZhbHVlICpDb2RlUmVnaW9uKTsKKworICAvLy8gU2FtZSBhcyBhYm92ZSwgYnV0IHRoZSBkZWJ1ZyBsb2NhdGlvbiBhbmQgY29kZSByZWdpb24gYXJlIGRlcml2ZWQgZnJvbSBccAorICAvLy8gSW5zdHIuCisgIE9wdGltaXphdGlvblJlbWFyayhjb25zdCBjaGFyICpQYXNzTmFtZSwgU3RyaW5nUmVmIFJlbWFya05hbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqSW5zdCk7CisKKyAgLy8vIFNhbWUgYXMgYWJvdmUsIGJ1dCB0aGUgZGVidWcgbG9jYXRpb24gYW5kIGNvZGUgcmVnaW9uIGFyZSBkZXJpdmVkIGZyb20gXHAKKyAgLy8vIEZ1bmMuCisgIE9wdGltaXphdGlvblJlbWFyayhjb25zdCBjaGFyICpQYXNzTmFtZSwgU3RyaW5nUmVmIFJlbWFya05hbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiAqRnVuYyk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEaWFnbm9zdGljSW5mbyAqREkpIHsKKyAgICByZXR1cm4gREktPmdldEtpbmQoKSA9PSBES19PcHRpbWl6YXRpb25SZW1hcms7CisgIH0KKworICAvLy8gXHNlZSBEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2U6OmlzRW5hYmxlZC4KKyAgYm9vbCBpc0VuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgLy8vIFRoaXMgaXMgZGVwcmVjYXRlZCBub3cgYW5kIG9ubHkgdXNlZCBieSB0aGUgZnVuY3Rpb24gQVBJIGJlbG93LgorICAvLy8gXHAgUGFzc05hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhc3MgZW1pdHRpbmcgdGhpcyBkaWFnbm9zdGljLiBJZgorICAvLy8gdGhpcyBuYW1lIG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiAtUnBhc3M9LCB0aGVuIHRoZQorICAvLy8gZGlhZ25vc3RpYyB3aWxsIGJlIGVtaXR0ZWQuIFxwIEZuIGlzIHRoZSBmdW5jdGlvbiB3aGVyZSB0aGUgZGlhZ25vc3RpYworICAvLy8gaXMgYmVpbmcgZW1pdHRlZC4gXHAgTG9jIGlzIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byB1c2UgaW4gdGhlCisgIC8vLyBkaWFnbm9zdGljLiBJZiBsaW5lIHRhYmxlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSwgdGhlIGRpYWdub3N0aWMKKyAgLy8vIHdpbGwgaW5jbHVkZSB0aGUgc291cmNlIGNvZGUgbG9jYXRpb24uIFxwIE1zZyBpcyB0aGUgbWVzc2FnZSB0byBzaG93LgorICAvLy8gTm90ZSB0aGF0IHRoaXMgY2xhc3MgZG9lcyBub3QgY29weSB0aGlzIG1lc3NhZ2UsIHNvIHRoaXMgcmVmZXJlbmNlCisgIC8vLyBtdXN0IGJlIHZhbGlkIGZvciB0aGUgd2hvbGUgbGlmZSB0aW1lIG9mIHRoZSBkaWFnbm9zdGljLgorICBPcHRpbWl6YXRpb25SZW1hcmsoY29uc3QgY2hhciAqUGFzc05hbWUsIGNvbnN0IEZ1bmN0aW9uICZGbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNMb2NhdGlvbiAmTG9jLCBjb25zdCBUd2luZSAmTXNnKQorICAgICAgOiBEaWFnbm9zdGljSW5mb0lST3B0aW1pemF0aW9uKERLX09wdGltaXphdGlvblJlbWFyaywgRFNfUmVtYXJrLCBQYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbiwgTG9jLCBNc2cpIHt9Cit9OworCisvLy8gRGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmb3IgbWlzc2VkLW9wdGltaXphdGlvbiByZW1hcmtzLgorY2xhc3MgT3B0aW1pemF0aW9uUmVtYXJrTWlzc2VkIDogcHVibGljIERpYWdub3N0aWNJbmZvSVJPcHRpbWl6YXRpb24geworcHVibGljOgorICAvLy8gXHAgUGFzc05hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhc3MgZW1pdHRpbmcgdGhpcyBkaWFnbm9zdGljLiBJZiB0aGlzIG5hbWUKKyAgLy8vIG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiAtUnBhc3MtbWlzc2VkPSwgdGhlbiB0aGUKKyAgLy8vIGRpYWdub3N0aWMgd2lsbCBiZSBlbWl0dGVkLiBccCBSZW1hcmtOYW1lIGlzIGEgdGV4dHVhbCBpZGVudGlmaWVyIGZvciB0aGUKKyAgLy8vIHJlbWFyayAoc2luZ2xlLXdvcmQsIGNhbWVsLWNhc2UpLiBccCBMb2MgaXMgdGhlIGRlYnVnIGxvY2F0aW9uIGFuZCBccAorICAvLy8gQ29kZVJlZ2lvbiBpcyB0aGUgcmVnaW9uIHRoYXQgdGhlIG9wdGltaXphdGlvbiBvcGVyYXRlcyBvbiAoY3VycmVudGx5IG9ubHkKKyAgLy8vIGJsb2NrIGlzIHN1cHBvcnRlZCkuCisgIE9wdGltaXphdGlvblJlbWFya01pc3NlZChjb25zdCBjaGFyICpQYXNzTmFtZSwgU3RyaW5nUmVmIFJlbWFya05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljTG9jYXRpb24gJkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpDb2RlUmVnaW9uKTsKKworICAvLy8gXGJyaWVmIFNhbWUgYXMgYWJvdmUgYnV0IFxwIEluc3QgaXMgdXNlZCB0byBkZXJpdmUgY29kZSByZWdpb24gYW5kIGRlYnVnCisgIC8vLyBsb2NhdGlvbi4KKyAgT3B0aW1pemF0aW9uUmVtYXJrTWlzc2VkKGNvbnN0IGNoYXIgKlBhc3NOYW1lLCBTdHJpbmdSZWYgUmVtYXJrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpJbnN0KTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERpYWdub3N0aWNJbmZvICpESSkgeworICAgIHJldHVybiBESS0+Z2V0S2luZCgpID09IERLX09wdGltaXphdGlvblJlbWFya01pc3NlZDsKKyAgfQorCisgIC8vLyBcc2VlIERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZTo6aXNFbmFibGVkLgorICBib29sIGlzRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAvLy8gVGhpcyBpcyBkZXByZWNhdGVkIG5vdyBhbmQgb25seSB1c2VkIGJ5IHRoZSBmdW5jdGlvbiBBUEkgYmVsb3cuCisgIC8vLyBccCBQYXNzTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFzcyBlbWl0dGluZyB0aGlzIGRpYWdub3N0aWMuIElmCisgIC8vLyB0aGlzIG5hbWUgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uIGdpdmVuIGluIC1ScGFzcy1taXNzZWQ9LCB0aGVuIHRoZQorICAvLy8gZGlhZ25vc3RpYyB3aWxsIGJlIGVtaXR0ZWQuIFxwIEZuIGlzIHRoZSBmdW5jdGlvbiB3aGVyZSB0aGUgZGlhZ25vc3RpYworICAvLy8gaXMgYmVpbmcgZW1pdHRlZC4gXHAgTG9jIGlzIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byB1c2UgaW4gdGhlCisgIC8vLyBkaWFnbm9zdGljLiBJZiBsaW5lIHRhYmxlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSwgdGhlIGRpYWdub3N0aWMKKyAgLy8vIHdpbGwgaW5jbHVkZSB0aGUgc291cmNlIGNvZGUgbG9jYXRpb24uIFxwIE1zZyBpcyB0aGUgbWVzc2FnZSB0byBzaG93LgorICAvLy8gTm90ZSB0aGF0IHRoaXMgY2xhc3MgZG9lcyBub3QgY29weSB0aGlzIG1lc3NhZ2UsIHNvIHRoaXMgcmVmZXJlbmNlCisgIC8vLyBtdXN0IGJlIHZhbGlkIGZvciB0aGUgd2hvbGUgbGlmZSB0aW1lIG9mIHRoZSBkaWFnbm9zdGljLgorICBPcHRpbWl6YXRpb25SZW1hcmtNaXNzZWQoY29uc3QgY2hhciAqUGFzc05hbWUsIGNvbnN0IEZ1bmN0aW9uICZGbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNMb2NhdGlvbiAmTG9jLCBjb25zdCBUd2luZSAmTXNnKQorICAgICAgOiBEaWFnbm9zdGljSW5mb0lST3B0aW1pemF0aW9uKERLX09wdGltaXphdGlvblJlbWFya01pc3NlZCwgRFNfUmVtYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NOYW1lLCBGbiwgTG9jLCBNc2cpIHt9Cit9OworCisvLy8gRGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmb3Igb3B0aW1pemF0aW9uIGFuYWx5c2lzIHJlbWFya3MuCitjbGFzcyBPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcyA6IHB1YmxpYyBEaWFnbm9zdGljSW5mb0lST3B0aW1pemF0aW9uIHsKK3B1YmxpYzoKKyAgLy8vIFxwIFBhc3NOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXNzIGVtaXR0aW5nIHRoaXMgZGlhZ25vc3RpYy4gSWYgdGhpcyBuYW1lCisgIC8vLyBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gaW4gLVJwYXNzLWFuYWx5c2lzPSwgdGhlbiB0aGUKKyAgLy8vIGRpYWdub3N0aWMgd2lsbCBiZSBlbWl0dGVkLiBccCBSZW1hcmtOYW1lIGlzIGEgdGV4dHVhbCBpZGVudGlmaWVyIGZvciB0aGUKKyAgLy8vIHJlbWFyayAoc2luZ2xlLXdvcmQsIGNhbWVsLWNhc2UpLiBccCBMb2MgaXMgdGhlIGRlYnVnIGxvY2F0aW9uIGFuZCBccAorICAvLy8gQ29kZVJlZ2lvbiBpcyB0aGUgcmVnaW9uIHRoYXQgdGhlIG9wdGltaXphdGlvbiBvcGVyYXRlcyBvbiAoY3VycmVudGx5IG9ubHkKKyAgLy8vIGJsb2NrIGlzIHN1cHBvcnRlZCkuCisgIE9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzKGNvbnN0IGNoYXIgKlBhc3NOYW1lLCBTdHJpbmdSZWYgUmVtYXJrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY0xvY2F0aW9uICZMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpDb2RlUmVnaW9uKTsKKworICAvLy8gXGJyaWVmIFRoaXMgaXMgY3RvciB2YXJpYW50IGFsbG93cyBhIHBhc3MgdG8gYnVpbGQgYW4gb3B0aW1pemF0aW9uIHJlbWFyaworICAvLy8gZnJvbSBhbiBleGlzdGluZyByZW1hcmsuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VmdWwgd2hlbiBhIHRyYW5zZm9ybWF0aW9uIHBhc3MgKGUuZyBMVikgd2FudHMgdG8gZW1pdCBhIHJlbWFyaworICAvLy8gKFxwIE9yaWcpIGdlbmVyYXRlZCBieSBvbmUgb2YgaXRzIGFuYWx5c2VzIChlLmcuIExBQSkgYXMgaXRzIG93biBhbmFseXNpcworICAvLy8gcmVtYXJrLiAgVGhlIHN0cmluZyBccCBQcmVwZW5kIHdpbGwgYmUgZW1pdHRlZCBiZWZvcmUgdGhlIG9yaWdpbmFsCisgIC8vLyBtZXNzYWdlLgorICBPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcyhjb25zdCBjaGFyICpQYXNzTmFtZSwgU3RyaW5nUmVmIFByZXBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzICZPcmlnKQorICAgICAgOiBEaWFnbm9zdGljSW5mb0lST3B0aW1pemF0aW9uKFBhc3NOYW1lLCBQcmVwZW5kLCBPcmlnKSB7fQorCisgIC8vLyBcYnJpZWYgU2FtZSBhcyBhYm92ZSBidXQgXHAgSW5zdCBpcyB1c2VkIHRvIGRlcml2ZSBjb2RlIHJlZ2lvbiBhbmQgZGVidWcKKyAgLy8vIGxvY2F0aW9uLgorICBPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcyhjb25zdCBjaGFyICpQYXNzTmFtZSwgU3RyaW5nUmVmIFJlbWFya05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpJbnN0KTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERpYWdub3N0aWNJbmZvICpESSkgeworICAgIHJldHVybiBESS0+Z2V0S2luZCgpID09IERLX09wdGltaXphdGlvblJlbWFya0FuYWx5c2lzOworICB9CisKKyAgLy8vIFxzZWUgRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlOjppc0VuYWJsZWQuCisgIGJvb2wgaXNFbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGNvbnN0IGNoYXIgKkFsd2F5c1ByaW50OworCisgIGJvb2wgc2hvdWxkQWx3YXlzUHJpbnQoKSBjb25zdCB7IHJldHVybiBnZXRQYXNzTmFtZSgpID09IEFsd2F5c1ByaW50OyB9CisKK3Byb3RlY3RlZDoKKyAgT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMoZW51bSBEaWFnbm9zdGljS2luZCBLaW5kLCBjb25zdCBjaGFyICpQYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb24gJkZuLCBjb25zdCBEaWFnbm9zdGljTG9jYXRpb24gJkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk1zZykKKyAgICAgIDogRGlhZ25vc3RpY0luZm9JUk9wdGltaXphdGlvbihLaW5kLCBEU19SZW1hcmssIFBhc3NOYW1lLCBGbiwgTG9jLCBNc2cpIHt9CisKKyAgT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMoZW51bSBEaWFnbm9zdGljS2luZCBLaW5kLCBjb25zdCBjaGFyICpQYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlbWFya05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNMb2NhdGlvbiAmTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqQ29kZVJlZ2lvbik7CisKK3ByaXZhdGU6CisgIC8vLyBUaGlzIGlzIGRlcHJlY2F0ZWQgbm93IGFuZCBvbmx5IHVzZWQgYnkgdGhlIGZ1bmN0aW9uIEFQSSBiZWxvdy4KKyAgLy8vIFxwIFBhc3NOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXNzIGVtaXR0aW5nIHRoaXMgZGlhZ25vc3RpYy4gSWYKKyAgLy8vIHRoaXMgbmFtZSBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gaW4gLVJwYXNzLWFuYWx5c2lzPSwgdGhlbgorICAvLy8gdGhlIGRpYWdub3N0aWMgd2lsbCBiZSBlbWl0dGVkLiBccCBGbiBpcyB0aGUgZnVuY3Rpb24gd2hlcmUgdGhlIGRpYWdub3N0aWMKKyAgLy8vIGlzIGJlaW5nIGVtaXR0ZWQuIFxwIExvYyBpcyB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gdXNlIGluIHRoZQorICAvLy8gZGlhZ25vc3RpYy4gSWYgbGluZSB0YWJsZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUsIHRoZSBkaWFnbm9zdGljIHdpbGwKKyAgLy8vIGluY2x1ZGUgdGhlIHNvdXJjZSBjb2RlIGxvY2F0aW9uLiBccCBNc2cgaXMgdGhlIG1lc3NhZ2UgdG8gc2hvdy4gTm90ZSB0aGF0CisgIC8vLyB0aGlzIGNsYXNzIGRvZXMgbm90IGNvcHkgdGhpcyBtZXNzYWdlLCBzbyB0aGlzIHJlZmVyZW5jZSBtdXN0IGJlIHZhbGlkIGZvcgorICAvLy8gdGhlIHdob2xlIGxpZmUgdGltZSBvZiB0aGUgZGlhZ25vc3RpYy4KKyAgT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMoY29uc3QgY2hhciAqUGFzc05hbWUsIGNvbnN0IEZ1bmN0aW9uICZGbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY0xvY2F0aW9uICZMb2MsIGNvbnN0IFR3aW5lICZNc2cpCisgICAgICA6IERpYWdub3N0aWNJbmZvSVJPcHRpbWl6YXRpb24oREtfT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMsIERTX1JlbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzTmFtZSwgRm4sIExvYywgTXNnKSB7fQorfTsKKworLy8vIERpYWdub3N0aWMgaW5mb3JtYXRpb24gZm9yIG9wdGltaXphdGlvbiBhbmFseXNpcyByZW1hcmtzIHJlbGF0ZWQgdG8KKy8vLyBmbG9hdGluZy1wb2ludCBub24tY29tbXV0YXRpdml0eS4KK2NsYXNzIE9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzRlBDb21tdXRlIDogcHVibGljIE9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzIHsKK3B1YmxpYzoKKyAgLy8vIFxwIFBhc3NOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXNzIGVtaXR0aW5nIHRoaXMgZGlhZ25vc3RpYy4gSWYgdGhpcyBuYW1lCisgIC8vLyBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gaW4gLVJwYXNzLWFuYWx5c2lzPSwgdGhlbiB0aGUKKyAgLy8vIGRpYWdub3N0aWMgd2lsbCBiZSBlbWl0dGVkLiBccCBSZW1hcmtOYW1lIGlzIGEgdGV4dHVhbCBpZGVudGlmaWVyIGZvciB0aGUKKyAgLy8vIHJlbWFyayAoc2luZ2xlLXdvcmQsIGNhbWVsLWNhc2UpLiBccCBMb2MgaXMgdGhlIGRlYnVnIGxvY2F0aW9uIGFuZCBccAorICAvLy8gQ29kZVJlZ2lvbiBpcyB0aGUgcmVnaW9uIHRoYXQgdGhlIG9wdGltaXphdGlvbiBvcGVyYXRlcyBvbiAoY3VycmVudGx5IG9ubHkKKyAgLy8vIGJsb2NrIGlzIHN1cHBvcnRlZCkuIFRoZSBmcm9udC1lbmQgd2lsbCBhcHBlbmQgaXRzIG93biBtZXNzYWdlIHJlbGF0ZWQgdG8KKyAgLy8vIG9wdGlvbnMgdGhhdCBhZGRyZXNzIGZsb2F0aW5nLXBvaW50IG5vbi1jb21tdXRhdGl2aXR5LgorICBPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpc0ZQQ29tbXV0ZShjb25zdCBjaGFyICpQYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlbWFya05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNMb2NhdGlvbiAmTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqQ29kZVJlZ2lvbikKKyAgICAgIDogT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMoREtfT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXNGUENvbW11dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NOYW1lLCBSZW1hcmtOYW1lLCBMb2MsIENvZGVSZWdpb24pIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEaWFnbm9zdGljSW5mbyAqREkpIHsKKyAgICByZXR1cm4gREktPmdldEtpbmQoKSA9PSBES19PcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpc0ZQQ29tbXV0ZTsKKyAgfQorCitwcml2YXRlOgorICAvLy8gVGhpcyBpcyBkZXByZWNhdGVkIG5vdyBhbmQgb25seSB1c2VkIGJ5IHRoZSBmdW5jdGlvbiBBUEkgYmVsb3cuCisgIC8vLyBccCBQYXNzTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFzcyBlbWl0dGluZyB0aGlzIGRpYWdub3N0aWMuIElmCisgIC8vLyB0aGlzIG5hbWUgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uIGdpdmVuIGluIC1ScGFzcy1hbmFseXNpcz0sIHRoZW4KKyAgLy8vIHRoZSBkaWFnbm9zdGljIHdpbGwgYmUgZW1pdHRlZC4gXHAgRm4gaXMgdGhlIGZ1bmN0aW9uIHdoZXJlIHRoZSBkaWFnbm9zdGljCisgIC8vLyBpcyBiZWluZyBlbWl0dGVkLiBccCBMb2MgaXMgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIHVzZSBpbiB0aGUKKyAgLy8vIGRpYWdub3N0aWMuIElmIGxpbmUgdGFibGUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLCB0aGUgZGlhZ25vc3RpYyB3aWxsCisgIC8vLyBpbmNsdWRlIHRoZSBzb3VyY2UgY29kZSBsb2NhdGlvbi4gXHAgTXNnIGlzIHRoZSBtZXNzYWdlIHRvIHNob3cuIFRoZQorICAvLy8gZnJvbnQtZW5kIHdpbGwgYXBwZW5kIGl0cyBvd24gbWVzc2FnZSByZWxhdGVkIHRvIG9wdGlvbnMgdGhhdCBhZGRyZXNzCisgIC8vLyBmbG9hdGluZy1wb2ludCBub24tY29tbXV0YXRpdml0eS4gTm90ZSB0aGF0IHRoaXMgY2xhc3MgZG9lcyBub3QgY29weSB0aGlzCisgIC8vLyBtZXNzYWdlLCBzbyB0aGlzIHJlZmVyZW5jZSBtdXN0IGJlIHZhbGlkIGZvciB0aGUgd2hvbGUgbGlmZSB0aW1lIG9mIHRoZQorICAvLy8gZGlhZ25vc3RpYy4KKyAgT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXNGUENvbW11dGUoY29uc3QgY2hhciAqUGFzc05hbWUsIGNvbnN0IEZ1bmN0aW9uICZGbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY0xvY2F0aW9uICZMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZNc2cpCisgICAgICA6IE9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzKERLX09wdGltaXphdGlvblJlbWFya0FuYWx5c2lzRlBDb21tdXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzTmFtZSwgRm4sIExvYywgTXNnKSB7fQorfTsKKworLy8vIERpYWdub3N0aWMgaW5mb3JtYXRpb24gZm9yIG9wdGltaXphdGlvbiBhbmFseXNpcyByZW1hcmtzIHJlbGF0ZWQgdG8KKy8vLyBwb2ludGVyIGFsaWFzaW5nLgorY2xhc3MgT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXNBbGlhc2luZyA6IHB1YmxpYyBPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcyB7CitwdWJsaWM6CisgIC8vLyBccCBQYXNzTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFzcyBlbWl0dGluZyB0aGlzIGRpYWdub3N0aWMuIElmIHRoaXMgbmFtZQorICAvLy8gbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uIGdpdmVuIGluIC1ScGFzcy1hbmFseXNpcz0sIHRoZW4gdGhlCisgIC8vLyBkaWFnbm9zdGljIHdpbGwgYmUgZW1pdHRlZC4gXHAgUmVtYXJrTmFtZSBpcyBhIHRleHR1YWwgaWRlbnRpZmllciBmb3IgdGhlCisgIC8vLyByZW1hcmsgKHNpbmdsZS13b3JkLCBjYW1lbC1jYXNlKS4gXHAgTG9jIGlzIHRoZSBkZWJ1ZyBsb2NhdGlvbiBhbmQgXHAKKyAgLy8vIENvZGVSZWdpb24gaXMgdGhlIHJlZ2lvbiB0aGF0IHRoZSBvcHRpbWl6YXRpb24gb3BlcmF0ZXMgb24gKGN1cnJlbnRseSBvbmx5CisgIC8vLyBibG9jayBpcyBzdXBwb3J0ZWQpLiBUaGUgZnJvbnQtZW5kIHdpbGwgYXBwZW5kIGl0cyBvd24gbWVzc2FnZSByZWxhdGVkIHRvCisgIC8vLyBvcHRpb25zIHRoYXQgYWRkcmVzcyBwb2ludGVyIGFsaWFzaW5nIGxlZ2FsaXR5LgorICBPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpc0FsaWFzaW5nKGNvbnN0IGNoYXIgKlBhc3NOYW1lLCBTdHJpbmdSZWYgUmVtYXJrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljTG9jYXRpb24gJkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqQ29kZVJlZ2lvbikKKyAgICAgIDogT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMoREtfT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXNBbGlhc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc05hbWUsIFJlbWFya05hbWUsIExvYywgQ29kZVJlZ2lvbikge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERpYWdub3N0aWNJbmZvICpESSkgeworICAgIHJldHVybiBESS0+Z2V0S2luZCgpID09IERLX09wdGltaXphdGlvblJlbWFya0FuYWx5c2lzQWxpYXNpbmc7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIFRoaXMgaXMgZGVwcmVjYXRlZCBub3cgYW5kIG9ubHkgdXNlZCBieSB0aGUgZnVuY3Rpb24gQVBJIGJlbG93LgorICAvLy8gXHAgUGFzc05hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhc3MgZW1pdHRpbmcgdGhpcyBkaWFnbm9zdGljLiBJZgorICAvLy8gdGhpcyBuYW1lIG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiAtUnBhc3MtYW5hbHlzaXM9LCB0aGVuCisgIC8vLyB0aGUgZGlhZ25vc3RpYyB3aWxsIGJlIGVtaXR0ZWQuIFxwIEZuIGlzIHRoZSBmdW5jdGlvbiB3aGVyZSB0aGUgZGlhZ25vc3RpYworICAvLy8gaXMgYmVpbmcgZW1pdHRlZC4gXHAgTG9jIGlzIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byB1c2UgaW4gdGhlCisgIC8vLyBkaWFnbm9zdGljLiBJZiBsaW5lIHRhYmxlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSwgdGhlIGRpYWdub3N0aWMgd2lsbAorICAvLy8gaW5jbHVkZSB0aGUgc291cmNlIGNvZGUgbG9jYXRpb24uIFxwIE1zZyBpcyB0aGUgbWVzc2FnZSB0byBzaG93LiBUaGUKKyAgLy8vIGZyb250LWVuZCB3aWxsIGFwcGVuZCBpdHMgb3duIG1lc3NhZ2UgcmVsYXRlZCB0byBvcHRpb25zIHRoYXQgYWRkcmVzcworICAvLy8gcG9pbnRlciBhbGlhc2luZyBsZWdhbGl0eS4gTm90ZSB0aGF0IHRoaXMgY2xhc3MgZG9lcyBub3QgY29weSB0aGlzCisgIC8vLyBtZXNzYWdlLCBzbyB0aGlzIHJlZmVyZW5jZSBtdXN0IGJlIHZhbGlkIGZvciB0aGUgd2hvbGUgbGlmZSB0aW1lIG9mIHRoZQorICAvLy8gZGlhZ25vc3RpYy4KKyAgT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXNBbGlhc2luZyhjb25zdCBjaGFyICpQYXNzTmFtZSwgY29uc3QgRnVuY3Rpb24gJkZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNMb2NhdGlvbiAmTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZNc2cpCisgICAgICA6IE9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzKERLX09wdGltaXphdGlvblJlbWFya0FuYWx5c2lzQWxpYXNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NOYW1lLCBGbiwgTG9jLCBNc2cpIHt9Cit9OworCisvLy8gRGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmb3IgbWFjaGluZSBJUiBwYXJzZXIuCitjbGFzcyBEaWFnbm9zdGljSW5mb01JUlBhcnNlciA6IHB1YmxpYyBEaWFnbm9zdGljSW5mbyB7CisgIGNvbnN0IFNNRGlhZ25vc3RpYyAmRGlhZ25vc3RpYzsKKworcHVibGljOgorICBEaWFnbm9zdGljSW5mb01JUlBhcnNlcihEaWFnbm9zdGljU2V2ZXJpdHkgU2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNNRGlhZ25vc3RpYyAmRGlhZ25vc3RpYykKKyAgICAgIDogRGlhZ25vc3RpY0luZm8oREtfTUlSUGFyc2VyLCBTZXZlcml0eSksIERpYWdub3N0aWMoRGlhZ25vc3RpYykge30KKworICBjb25zdCBTTURpYWdub3N0aWMgJmdldERpYWdub3N0aWMoKSBjb25zdCB7IHJldHVybiBEaWFnbm9zdGljOyB9CisKKyAgdm9pZCBwcmludChEaWFnbm9zdGljUHJpbnRlciAmRFApIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGlhZ25vc3RpY0luZm8gKkRJKSB7CisgICAgcmV0dXJuIERJLT5nZXRLaW5kKCkgPT0gREtfTUlSUGFyc2VyOworICB9Cit9OworCisvLy8gRGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmb3IgSVNlbCBmYWxsYmFjayBwYXRoLgorY2xhc3MgRGlhZ25vc3RpY0luZm9JU2VsRmFsbGJhY2sgOiBwdWJsaWMgRGlhZ25vc3RpY0luZm8geworICAvLy8gVGhlIGZ1bmN0aW9uIHRoYXQgaXMgY29uY2VybmVkIGJ5IHRoaXMgZGlhZ25vc3RpYy4KKyAgY29uc3QgRnVuY3Rpb24gJkZuOworCitwdWJsaWM6CisgIERpYWdub3N0aWNJbmZvSVNlbEZhbGxiYWNrKGNvbnN0IEZ1bmN0aW9uICZGbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY1NldmVyaXR5IFNldmVyaXR5ID0gRFNfV2FybmluZykKKyAgICAgIDogRGlhZ25vc3RpY0luZm8oREtfSVNlbEZhbGxiYWNrLCBTZXZlcml0eSksIEZuKEZuKSB7fQorCisgIGNvbnN0IEZ1bmN0aW9uICZnZXRGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIEZuOyB9CisKKyAgdm9pZCBwcmludChEaWFnbm9zdGljUHJpbnRlciAmRFApIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGlhZ25vc3RpY0luZm8gKkRJKSB7CisgICAgcmV0dXJuIERJLT5nZXRLaW5kKCkgPT0gREtfSVNlbEZhbGxiYWNrOworICB9Cit9OworCisvLyBDcmVhdGUgd3JhcHBlcnMgZm9yIEMgQmluZGluZyB0eXBlcyAoc2VlIENCaW5kaW5nV3JhcHBpbmcuaCkuCitERUZJTkVfU0lNUExFX0NPTlZFUlNJT05fRlVOQ1RJT05TKERpYWdub3N0aWNJbmZvLCBMTFZNRGlhZ25vc3RpY0luZm9SZWYpCisKKy8vLyBEaWFnbm9zdGljIGluZm9ybWF0aW9uIGZvciBvcHRpbWl6YXRpb24gZmFpbHVyZXMuCitjbGFzcyBEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkZhaWx1cmUgOiBwdWJsaWMgRGlhZ25vc3RpY0luZm9JUk9wdGltaXphdGlvbiB7CitwdWJsaWM6CisgIC8vLyBccCBGbiBpcyB0aGUgZnVuY3Rpb24gd2hlcmUgdGhlIGRpYWdub3N0aWMgaXMgYmVpbmcgZW1pdHRlZC4gXHAgTG9jIGlzCisgIC8vLyB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gdXNlIGluIHRoZSBkaWFnbm9zdGljLiBJZiBsaW5lIHRhYmxlCisgIC8vLyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUsIHRoZSBkaWFnbm9zdGljIHdpbGwgaW5jbHVkZSB0aGUgc291cmNlIGNvZGUKKyAgLy8vIGxvY2F0aW9uLiBccCBNc2cgaXMgdGhlIG1lc3NhZ2UgdG8gc2hvdy4gTm90ZSB0aGF0IHRoaXMgY2xhc3MgZG9lcyBub3QKKyAgLy8vIGNvcHkgdGhpcyBtZXNzYWdlLCBzbyB0aGlzIHJlZmVyZW5jZSBtdXN0IGJlIHZhbGlkIGZvciB0aGUgd2hvbGUgbGlmZSB0aW1lCisgIC8vLyBvZiB0aGUgZGlhZ25vc3RpYy4KKyAgRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25GYWlsdXJlKGNvbnN0IEZ1bmN0aW9uICZGbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNMb2NhdGlvbiAmTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk1zZykKKyAgICAgIDogRGlhZ25vc3RpY0luZm9JUk9wdGltaXphdGlvbihES19PcHRpbWl6YXRpb25GYWlsdXJlLCBEU19XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIEZuLCBMb2MsIE1zZykge30KKworICAvLy8gXHAgUGFzc05hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhc3MgZW1pdHRpbmcgdGhpcyBkaWFnbm9zdGljLiAgXHAKKyAgLy8vIFJlbWFya05hbWUgaXMgYSB0ZXh0dWFsIGlkZW50aWZpZXIgZm9yIHRoZSByZW1hcmsgKHNpbmdsZS13b3JkLAorICAvLy8gY2FtZWwtY2FzZSkuICBccCBMb2MgaXMgdGhlIGRlYnVnIGxvY2F0aW9uIGFuZCBccCBDb2RlUmVnaW9uIGlzIHRoZQorICAvLy8gcmVnaW9uIHRoYXQgdGhlIG9wdGltaXphdGlvbiBvcGVyYXRlcyBvbiAoY3VycmVudGx5IGJhc2ljIGJsb2NrIGlzCisgIC8vLyBzdXBwb3J0ZWQpLgorICBEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkZhaWx1cmUoY29uc3QgY2hhciAqUGFzc05hbWUsIFN0cmluZ1JlZiBSZW1hcmtOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY0xvY2F0aW9uICZMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqQ29kZVJlZ2lvbik7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEaWFnbm9zdGljSW5mbyAqREkpIHsKKyAgICByZXR1cm4gREktPmdldEtpbmQoKSA9PSBES19PcHRpbWl6YXRpb25GYWlsdXJlOworICB9CisKKyAgLy8vIFxzZWUgRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlOjppc0VuYWJsZWQuCisgIGJvb2wgaXNFbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gRGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmb3IgdW5zdXBwb3J0ZWQgZmVhdHVyZSBpbiBiYWNrZW5kLgorY2xhc3MgRGlhZ25vc3RpY0luZm9VbnN1cHBvcnRlZCA6IHB1YmxpYyBEaWFnbm9zdGljSW5mb1dpdGhMb2NhdGlvbkJhc2UgeworcHJpdmF0ZToKKyAgVHdpbmUgTXNnOworCitwdWJsaWM6CisgIC8vLyBccCBGbiBpcyB0aGUgZnVuY3Rpb24gd2hlcmUgdGhlIGRpYWdub3N0aWMgaXMgYmVpbmcgZW1pdHRlZC4gXHAgTG9jIGlzCisgIC8vLyB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gdXNlIGluIHRoZSBkaWFnbm9zdGljLiBJZiBsaW5lIHRhYmxlCisgIC8vLyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUsIHRoZSBkaWFnbm9zdGljIHdpbGwgaW5jbHVkZSB0aGUgc291cmNlIGNvZGUKKyAgLy8vIGxvY2F0aW9uLiBccCBNc2cgaXMgdGhlIG1lc3NhZ2UgdG8gc2hvdy4gTm90ZSB0aGF0IHRoaXMgY2xhc3MgZG9lcyBub3QKKyAgLy8vIGNvcHkgdGhpcyBtZXNzYWdlLCBzbyB0aGlzIHJlZmVyZW5jZSBtdXN0IGJlIHZhbGlkIGZvciB0aGUgd2hvbGUgbGlmZSB0aW1lCisgIC8vLyBvZiB0aGUgZGlhZ25vc3RpYy4KKyAgRGlhZ25vc3RpY0luZm9VbnN1cHBvcnRlZCgKKyAgICAgIGNvbnN0IEZ1bmN0aW9uICZGbiwgY29uc3QgVHdpbmUgJk1zZywKKyAgICAgIGNvbnN0IERpYWdub3N0aWNMb2NhdGlvbiAmTG9jID0gRGlhZ25vc3RpY0xvY2F0aW9uKCksCisgICAgICBEaWFnbm9zdGljU2V2ZXJpdHkgU2V2ZXJpdHkgPSBEU19FcnJvcikKKyAgICAgIDogRGlhZ25vc3RpY0luZm9XaXRoTG9jYXRpb25CYXNlKERLX1Vuc3VwcG9ydGVkLCBTZXZlcml0eSwgRm4sIExvYyksCisgICAgICAgIE1zZyhNc2cpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEaWFnbm9zdGljSW5mbyAqREkpIHsKKyAgICByZXR1cm4gREktPmdldEtpbmQoKSA9PSBES19VbnN1cHBvcnRlZDsKKyAgfQorCisgIGNvbnN0IFR3aW5lICZnZXRNZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gTXNnOyB9CisKKyAgdm9pZCBwcmludChEaWFnbm9zdGljUHJpbnRlciAmRFApIGNvbnN0IG92ZXJyaWRlOworfTsKKworbmFtZXNwYWNlIHlhbWwgewordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8RGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlICo+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmaW8sIERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZSAqJk9wdERpYWcpOworfTsKK30gLy8gbmFtZXNwYWNlIHlhbWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfRElBR05PU1RJQ0lORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EaWFnbm9zdGljUHJpbnRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EaWFnbm9zdGljUHJpbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YzgzMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RpYWdub3N0aWNQcmludGVyLmgKQEAgLTAsMCArMSw5NiBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9EaWFnbm9zdGljUHJpbnRlci5oIC0gRGlhZ25vc3RpYyBQcmludGVyIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIG1haW4gaW50ZXJmYWNlIGZvciBwcmludGVyIGJhY2tlbmQgZGlhZ25vc3RpYy4KKy8vCisvLyBDbGllbnRzIG9mIHRoZSBiYWNrZW5kIGRpYWdub3N0aWNzIHNob3VsZCBvdmVybG9hZCB0aGlzIGludGVyZmFjZSBiYXNlZAorLy8gb24gdGhlaXIgbmVlZHMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfRElBR05PU1RJQ1BSSU5URVJfSAorI2RlZmluZSBMTFZNX0lSX0RJQUdOT1NUSUNQUklOVEVSX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KK2NsYXNzIE1vZHVsZTsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgU01EaWFnbm9zdGljOworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgVHdpbmU7CitjbGFzcyBWYWx1ZTsKKworLy8vIFxicmllZiBJbnRlcmZhY2UgZm9yIGN1c3RvbSBkaWFnbm9zdGljIHByaW50aW5nLgorY2xhc3MgRGlhZ25vc3RpY1ByaW50ZXIgeworcHVibGljOgorICB2aXJ0dWFsIH5EaWFnbm9zdGljUHJpbnRlcigpID0gZGVmYXVsdDsKKworICAvLyBTaW1wbGUgdHlwZXMuCisgIHZpcnR1YWwgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwoY2hhciBDKSA9IDA7CisgIHZpcnR1YWwgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwodW5zaWduZWQgY2hhciBDKSA9IDA7CisgIHZpcnR1YWwgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwoc2lnbmVkIGNoYXIgQykgPSAwOworICB2aXJ0dWFsIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KFN0cmluZ1JlZiBTdHIpID0gMDsKKyAgdmlydHVhbCBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChjb25zdCBjaGFyICpTdHIpID0gMDsKKyAgdmlydHVhbCBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChjb25zdCBzdGQ6OnN0cmluZyAmU3RyKSA9IDA7CisgIHZpcnR1YWwgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBOKSA9IDA7CisgIHZpcnR1YWwgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwobG9uZyBOKSA9IDA7CisgIHZpcnR1YWwgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBsb25nIE4pID0gMDsKKyAgdmlydHVhbCBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChsb25nIGxvbmcgTikgPSAwOworICB2aXJ0dWFsIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KGNvbnN0IHZvaWQgKlApID0gMDsKKyAgdmlydHVhbCBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PCh1bnNpZ25lZCBpbnQgTikgPSAwOworICB2aXJ0dWFsIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KGludCBOKSA9IDA7CisgIHZpcnR1YWwgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwoZG91YmxlIE4pID0gMDsKKyAgdmlydHVhbCBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChjb25zdCBUd2luZSAmU3RyKSA9IDA7CisKKyAgLy8gSVIgcmVsYXRlZCB0eXBlcy4KKyAgdmlydHVhbCBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChjb25zdCBWYWx1ZSAmVikgPSAwOworICB2aXJ0dWFsIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KGNvbnN0IE1vZHVsZSAmTSkgPSAwOworCisgIC8vIE90aGVyIHR5cGVzLgorICB2aXJ0dWFsIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KGNvbnN0IFNNRGlhZ25vc3RpYyAmRGlhZykgPSAwOworfTsKKworLy8vIFxicmllZiBCYXNpYyBkaWFnbm9zdGljIHByaW50ZXIgdGhhdCB1c2VzIGFuIHVuZGVybHlpbmcgcmF3X29zdHJlYW0uCitjbGFzcyBEaWFnbm9zdGljUHJpbnRlclJhd09TdHJlYW0gOiBwdWJsaWMgRGlhZ25vc3RpY1ByaW50ZXIgeworcHJvdGVjdGVkOgorICByYXdfb3N0cmVhbSAmU3RyZWFtOworCitwdWJsaWM6CisgIERpYWdub3N0aWNQcmludGVyUmF3T1N0cmVhbShyYXdfb3N0cmVhbSAmU3RyZWFtKSA6IFN0cmVhbShTdHJlYW0pIHt9CisKKyAgLy8gU2ltcGxlIHR5cGVzLgorICBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChjaGFyIEMpIG92ZXJyaWRlOworICBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PCh1bnNpZ25lZCBjaGFyIEMpIG92ZXJyaWRlOworICBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChzaWduZWQgY2hhciBDKSBvdmVycmlkZTsKKyAgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwoU3RyaW5nUmVmIFN0cikgb3ZlcnJpZGU7CisgIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KGNvbnN0IGNoYXIgKlN0cikgb3ZlcnJpZGU7CisgIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KGNvbnN0IHN0ZDo6c3RyaW5nICZTdHIpIG92ZXJyaWRlOworICBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIE4pIG92ZXJyaWRlOworICBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChsb25nIE4pIG92ZXJyaWRlOworICBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIGxvbmcgTikgb3ZlcnJpZGU7CisgIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KGxvbmcgbG9uZyBOKSBvdmVycmlkZTsKKyAgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwoY29uc3Qgdm9pZCAqUCkgb3ZlcnJpZGU7CisgIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KHVuc2lnbmVkIGludCBOKSBvdmVycmlkZTsKKyAgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwoaW50IE4pIG92ZXJyaWRlOworICBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChkb3VibGUgTikgb3ZlcnJpZGU7CisgIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KGNvbnN0IFR3aW5lICZTdHIpIG92ZXJyaWRlOworCisgIC8vIElSIHJlbGF0ZWQgdHlwZXMuCisgIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KGNvbnN0IFZhbHVlICZWKSBvdmVycmlkZTsKKyAgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwoY29uc3QgTW9kdWxlICZNKSBvdmVycmlkZTsKKworICAvLyBPdGhlciB0eXBlcy4KKyAgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwoY29uc3QgU01EaWFnbm9zdGljICZEaWFnKSBvdmVycmlkZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0RJQUdOT1NUSUNQUklOVEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRG9taW5hdG9ycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Eb21pbmF0b3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4MTFiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRG9taW5hdG9ycy5oCkBAIC0wLDAgKzEsMzY5IEBACisvLz09PS0gRG9taW5hdG9ycy5oIC0gRG9taW5hdG9yIEluZm8gQ2FsY3VsYXRpb24gLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBEb21pbmF0b3JUcmVlIGNsYXNzLCB3aGljaCBwcm92aWRlcyBmYXN0IGFuZCBlZmZpY2llbnQKKy8vIGRvbWluYW5jZSBxdWVyaWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9ET01JTkFUT1JTX0gKKyNkZWZpbmUgTExWTV9JUl9ET01JTkFUT1JTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSGFzaGluZy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9HZW5lcmljRG9tVHJlZS5oIgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIHJhd19vc3RyZWFtOworCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgRG9tVHJlZU5vZGVCYXNlPEJhc2ljQmxvY2s+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIERvbWluYXRvclRyZWVCYXNlPEJhc2ljQmxvY2ssIGZhbHNlPjsgLy8gRG9tVHJlZQorZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIERvbWluYXRvclRyZWVCYXNlPEJhc2ljQmxvY2ssIHRydWU+OyAvLyBQb3N0RG9tVHJlZQorCituYW1lc3BhY2UgRG9tVHJlZUJ1aWxkZXIgewordXNpbmcgQkJEb21UcmVlID0gRG9tVHJlZUJhc2U8QmFzaWNCbG9jaz47Cit1c2luZyBCQlBvc3REb21UcmVlID0gUG9zdERvbVRyZWVCYXNlPEJhc2ljQmxvY2s+OworCitleHRlcm4gdGVtcGxhdGUgc3RydWN0IFVwZGF0ZTxCYXNpY0Jsb2NrICo+OworCit1c2luZyBCQlVwZGF0ZXMgPSBBcnJheVJlZjxVcGRhdGU8QmFzaWNCbG9jayAqPj47CisKK2V4dGVybiB0ZW1wbGF0ZSB2b2lkIENhbGN1bGF0ZTxCQkRvbVRyZWU+KEJCRG9tVHJlZSAmRFQpOworZXh0ZXJuIHRlbXBsYXRlIHZvaWQgQ2FsY3VsYXRlPEJCUG9zdERvbVRyZWU+KEJCUG9zdERvbVRyZWUgJkRUKTsKKworZXh0ZXJuIHRlbXBsYXRlIHZvaWQgSW5zZXJ0RWRnZTxCQkRvbVRyZWU+KEJCRG9tVHJlZSAmRFQsIEJhc2ljQmxvY2sgKkZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqVG8pOworZXh0ZXJuIHRlbXBsYXRlIHZvaWQgSW5zZXJ0RWRnZTxCQlBvc3REb21UcmVlPihCQlBvc3REb21UcmVlICZEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqVG8pOworCitleHRlcm4gdGVtcGxhdGUgdm9pZCBEZWxldGVFZGdlPEJCRG9tVHJlZT4oQkJEb21UcmVlICZEVCwgQmFzaWNCbG9jayAqRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpUbyk7CitleHRlcm4gdGVtcGxhdGUgdm9pZCBEZWxldGVFZGdlPEJCUG9zdERvbVRyZWU+KEJCUG9zdERvbVRyZWUgJkRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpUbyk7CisKK2V4dGVybiB0ZW1wbGF0ZSB2b2lkIEFwcGx5VXBkYXRlczxCQkRvbVRyZWU+KEJCRG9tVHJlZSAmRFQsIEJCVXBkYXRlcyk7CitleHRlcm4gdGVtcGxhdGUgdm9pZCBBcHBseVVwZGF0ZXM8QkJQb3N0RG9tVHJlZT4oQkJQb3N0RG9tVHJlZSAmRFQsIEJCVXBkYXRlcyk7CisKK2V4dGVybiB0ZW1wbGF0ZSBib29sIFZlcmlmeTxCQkRvbVRyZWU+KGNvbnN0IEJCRG9tVHJlZSAmRFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQkRvbVRyZWU6OlZlcmlmaWNhdGlvbkxldmVsIFZMKTsKK2V4dGVybiB0ZW1wbGF0ZSBib29sIFZlcmlmeTxCQlBvc3REb21UcmVlPihjb25zdCBCQlBvc3REb21UcmVlICZEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQlBvc3REb21UcmVlOjpWZXJpZmljYXRpb25MZXZlbCBWTCk7Cit9ICAvLyBuYW1lc3BhY2UgRG9tVHJlZUJ1aWxkZXIKKwordXNpbmcgRG9tVHJlZU5vZGUgPSBEb21UcmVlTm9kZUJhc2U8QmFzaWNCbG9jaz47CisKK2NsYXNzIEJhc2ljQmxvY2tFZGdlIHsKKyAgY29uc3QgQmFzaWNCbG9jayAqU3RhcnQ7CisgIGNvbnN0IEJhc2ljQmxvY2sgKkVuZDsKKworcHVibGljOgorICBCYXNpY0Jsb2NrRWRnZShjb25zdCBCYXNpY0Jsb2NrICpTdGFydF8sIGNvbnN0IEJhc2ljQmxvY2sgKkVuZF8pIDoKKyAgICBTdGFydChTdGFydF8pLCBFbmQoRW5kXykge30KKworICBCYXNpY0Jsb2NrRWRnZShjb25zdCBzdGQ6OnBhaXI8QmFzaWNCbG9jayAqLCBCYXNpY0Jsb2NrICo+ICZQYWlyKQorICAgICAgOiBTdGFydChQYWlyLmZpcnN0KSwgRW5kKFBhaXIuc2Vjb25kKSB7fQorCisgIEJhc2ljQmxvY2tFZGdlKGNvbnN0IHN0ZDo6cGFpcjxjb25zdCBCYXNpY0Jsb2NrICosIGNvbnN0IEJhc2ljQmxvY2sgKj4gJlBhaXIpCisgICAgICA6IFN0YXJ0KFBhaXIuZmlyc3QpLCBFbmQoUGFpci5zZWNvbmQpIHt9CisKKyAgY29uc3QgQmFzaWNCbG9jayAqZ2V0U3RhcnQoKSBjb25zdCB7CisgICAgcmV0dXJuIFN0YXJ0OworICB9CisKKyAgY29uc3QgQmFzaWNCbG9jayAqZ2V0RW5kKCkgY29uc3QgeworICAgIHJldHVybiBFbmQ7CisgIH0KKworICAvLy8gQ2hlY2sgaWYgdGhpcyBpcyB0aGUgb25seSBlZGdlIGJldHdlZW4gU3RhcnQgYW5kIEVuZC4KKyAgYm9vbCBpc1NpbmdsZUVkZ2UoKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88QmFzaWNCbG9ja0VkZ2U+IHsKKyAgdXNpbmcgQkJJbmZvID0gRGVuc2VNYXBJbmZvPGNvbnN0IEJhc2ljQmxvY2sgKj47CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBCYXNpY0Jsb2NrRWRnZSAqVik7CisKKyAgc3RhdGljIGlubGluZSBCYXNpY0Jsb2NrRWRnZSBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gQmFzaWNCbG9ja0VkZ2UoQkJJbmZvOjpnZXRFbXB0eUtleSgpLCBCQkluZm86OmdldEVtcHR5S2V5KCkpOworICB9CisKKyAgc3RhdGljIGlubGluZSBCYXNpY0Jsb2NrRWRnZSBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgcmV0dXJuIEJhc2ljQmxvY2tFZGdlKEJCSW5mbzo6Z2V0VG9tYnN0b25lS2V5KCksIEJCSW5mbzo6Z2V0VG9tYnN0b25lS2V5KCkpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBCYXNpY0Jsb2NrRWRnZSAmRWRnZSkgeworICAgIHJldHVybiBoYXNoX2NvbWJpbmUoQkJJbmZvOjpnZXRIYXNoVmFsdWUoRWRnZS5nZXRTdGFydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJCSW5mbzo6Z2V0SGFzaFZhbHVlKEVkZ2UuZ2V0RW5kKCkpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgQmFzaWNCbG9ja0VkZ2UgJkxIUywgY29uc3QgQmFzaWNCbG9ja0VkZ2UgJlJIUykgeworICAgIHJldHVybiBCQkluZm86OmlzRXF1YWwoTEhTLmdldFN0YXJ0KCksIFJIUy5nZXRTdGFydCgpKSAmJgorICAgICAgICAgICBCQkluZm86OmlzRXF1YWwoTEhTLmdldEVuZCgpLCBSSFMuZ2V0RW5kKCkpOworICB9Cit9OworCisvLy8gXGJyaWVmIENvbmNyZXRlIHN1YmNsYXNzIG9mIERvbWluYXRvclRyZWVCYXNlIHRoYXQgaXMgdXNlZCB0byBjb21wdXRlIGEKKy8vLyBub3JtYWwgZG9taW5hdG9yIHRyZWUuCisvLy8KKy8vLyBEZWZpbml0aW9uOiBBIGJsb2NrIGlzIHNhaWQgdG8gYmUgZm9yd2FyZCBzdGF0aWNhbGx5IHJlYWNoYWJsZSBpZiB0aGVyZSBpcworLy8vIGEgcGF0aCBmcm9tIHRoZSBlbnRyeSBvZiB0aGUgZnVuY3Rpb24gdG8gdGhlIGJsb2NrLiAgQSBzdGF0aWNhbGx5IHJlYWNoYWJsZQorLy8vIGJsb2NrIG1heSBiZWNvbWUgc3RhdGljYWxseSB1bnJlYWNoYWJsZSBkdXJpbmcgb3B0aW1pemF0aW9uLgorLy8vCisvLy8gQSBmb3J3YXJkIHVucmVhY2hhYmxlIGJsb2NrIG1heSBhcHBlYXIgaW4gdGhlIGRvbWluYXRvciB0cmVlLCBvciBpdCBtYXkKKy8vLyBub3QuICBJZiBpdCBkb2VzLCBkb21pbmFuY2UgcXVlcmllcyB3aWxsIHJldHVybiByZXN1bHRzIGFzIGlmIGFsbCByZWFjaGFibGUKKy8vLyBibG9ja3MgZG9taW5hdGUgaXQuICBXaGVuIGFza2luZyBmb3IgYSBOb2RlIGNvcnJlc3BvbmRpbmcgdG8gYSBwb3RlbnRpYWxseQorLy8vIHVucmVhY2hhYmxlIGJsb2NrLCBjYWxsaW5nIGNvZGUgbXVzdCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGJsb2NrIHdhcworLy8vIHVucmVhY2hhYmxlIGFuZCB0aGUgcmVzdWx0IG9mIGdldE5vZGUoKSBpcyBudWxscHRyLgorLy8vCisvLy8gR2VuZXJhbGx5LCBhIGJsb2NrIGtub3duIHRvIGJlIHVucmVhY2hhYmxlIHdoZW4gdGhlIGRvbWluYXRvciB0cmVlIGlzCisvLy8gY29uc3RydWN0ZWQgd2lsbCBub3QgYmUgaW4gdGhlIHRyZWUuICBPbmUgd2hpY2ggYmVjb21lcyB1bnJlYWNoYWJsZSBhZnRlcgorLy8vIHRoZSBkb21pbmF0b3IgdHJlZSBpcyBpbml0aWFsbHkgY29uc3RydWN0ZWQgbWF5IHN0aWxsIGV4aXN0IGluIHRoZSB0cmVlLAorLy8vIGV2ZW4gaWYgdGhlIHRyZWUgaXMgcHJvcGVybHkgdXBkYXRlZC4gQ2FsbGluZyBjb2RlIHNob3VsZCBub3QgcmVseSBvbiB0aGUKKy8vLyBwcmVjZWRpbmcgc3RhdGVtZW50czsgdGhpcyBpcyBzdGF0ZWQgb25seSB0byBhc3Npc3QgaHVtYW4gdW5kZXJzdGFuZGluZy4KK2NsYXNzIERvbWluYXRvclRyZWUgOiBwdWJsaWMgRG9taW5hdG9yVHJlZUJhc2U8QmFzaWNCbG9jaywgZmFsc2U+IHsKKyBwdWJsaWM6CisgIHVzaW5nIEJhc2UgPSBEb21pbmF0b3JUcmVlQmFzZTxCYXNpY0Jsb2NrLCBmYWxzZT47CisKKyAgRG9taW5hdG9yVHJlZSgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgRG9taW5hdG9yVHJlZShGdW5jdGlvbiAmRikgeyByZWNhbGN1bGF0ZShGKTsgfQorCisgIC8vLyBIYW5kbGUgaW52YWxpZGF0aW9uIGV4cGxpY2l0bHkuCisgIGJvb2wgaW52YWxpZGF0ZShGdW5jdGlvbiAmRiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJlBBLAorICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BbmFseXNpc01hbmFnZXI6OkludmFsaWRhdG9yICYpOworCisgIC8vIEVuc3VyZSBiYXNlLWNsYXNzIG92ZXJsb2FkcyBhcmUgdmlzaWJsZS4KKyAgdXNpbmcgQmFzZTo6ZG9taW5hdGVzOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgRGVmIGRvbWluYXRlcyBhIHVzZSBpbiBVc2VyLgorICAvLy8KKyAgLy8vIFRoaXMgcGVyZm9ybXMgdGhlIHNwZWNpYWwgY2hlY2tzIG5lY2Vzc2FyeSBpZiBEZWYgYW5kIFVzZXIgYXJlIGluIHRoZSBzYW1lCisgIC8vLyBiYXNpYyBibG9jay4gTm90ZSB0aGF0IERlZiBkb2Vzbid0IGRvbWluYXRlIGEgdXNlIGluIERlZiBpdHNlbGYhCisgIGJvb2wgZG9taW5hdGVzKGNvbnN0IEluc3RydWN0aW9uICpEZWYsIGNvbnN0IFVzZSAmVSkgY29uc3Q7CisgIGJvb2wgZG9taW5hdGVzKGNvbnN0IEluc3RydWN0aW9uICpEZWYsIGNvbnN0IEluc3RydWN0aW9uICpVc2VyKSBjb25zdDsKKyAgYm9vbCBkb21pbmF0ZXMoY29uc3QgSW5zdHJ1Y3Rpb24gKkRlZiwgY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbiBlZGdlIGRvbWluYXRlcyBhIHVzZS4KKyAgLy8vCisgIC8vLyBJZiBCQkUgaXMgbm90IGEgdW5pcXVlIGVkZ2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kIG9mIHRoZSBlZGdlLCBpdCBjYW4KKyAgLy8vIG5ldmVyIGRvbWluYXRlIHRoZSB1c2UuCisgIGJvb2wgZG9taW5hdGVzKGNvbnN0IEJhc2ljQmxvY2tFZGdlICZCQkUsIGNvbnN0IFVzZSAmVSkgY29uc3Q7CisgIGJvb2wgZG9taW5hdGVzKGNvbnN0IEJhc2ljQmxvY2tFZGdlICZCQkUsIGNvbnN0IEJhc2ljQmxvY2sgKkJCKSBjb25zdDsKKworICAvLyBFbnN1cmUgYmFzZSBjbGFzcyBvdmVybG9hZHMgYXJlIHZpc2libGUuCisgIHVzaW5nIEJhc2U6OmlzUmVhY2hhYmxlRnJvbUVudHJ5OworCisgIC8vLyBcYnJpZWYgUHJvdmlkZSBhbiBvdmVybG9hZCBmb3IgYSBVc2UuCisgIGJvb2wgaXNSZWFjaGFibGVGcm9tRW50cnkoY29uc3QgVXNlICZVKSBjb25zdDsKKworICAvLyBQb3AgdXAgYSBHcmFwaFZpei9ndiB3aW5kb3cgd2l0aCB0aGUgRG9taW5hdG9yIFRyZWUgcmVuZGVyZWQgdXNpbmcgYGRvdGAuCisgIHZvaWQgdmlld0dyYXBoKGNvbnN0IFR3aW5lICZOYW1lLCBjb25zdCBUd2luZSAmVGl0bGUpOworICB2b2lkIHZpZXdHcmFwaCgpOworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEb21pbmF0b3JUcmVlIEdyYXBoVHJhaXRzIHNwZWNpYWxpemF0aW9ucyBzbyB0aGUgRG9taW5hdG9yVHJlZSBjYW4gYmUKKy8vIGl0ZXJhYmxlIGJ5IGdlbmVyaWMgZ3JhcGggaXRlcmF0b3JzLgorCit0ZW1wbGF0ZSA8Y2xhc3MgTm9kZSwgY2xhc3MgQ2hpbGRJdGVyYXRvcj4gc3RydWN0IERvbVRyZWVHcmFwaFRyYWl0c0Jhc2UgeworICB1c2luZyBOb2RlUmVmID0gTm9kZSAqOworICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9IENoaWxkSXRlcmF0b3I7CisgIHVzaW5nIG5vZGVzX2l0ZXJhdG9yID0gZGZfaXRlcmF0b3I8Tm9kZSAqLCBkZl9pdGVyYXRvcl9kZWZhdWx0X3NldDxOb2RlKj4+OworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShOb2RlUmVmIE4pIHsgcmV0dXJuIE47IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+YmVnaW4oKTsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+ZW5kKCk7IH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oTm9kZVJlZiBOKSB7CisgICAgcmV0dXJuIGRmX2JlZ2luKGdldEVudHJ5Tm9kZShOKSk7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gZGZfZW5kKGdldEVudHJ5Tm9kZShOKSk7IH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgR3JhcGhUcmFpdHM8RG9tVHJlZU5vZGUgKj4KKyAgICA6IHB1YmxpYyBEb21UcmVlR3JhcGhUcmFpdHNCYXNlPERvbVRyZWVOb2RlLCBEb21UcmVlTm9kZTo6aXRlcmF0b3I+IHt9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IEdyYXBoVHJhaXRzPGNvbnN0IERvbVRyZWVOb2RlICo+CisgICAgOiBwdWJsaWMgRG9tVHJlZUdyYXBoVHJhaXRzQmFzZTxjb25zdCBEb21UcmVlTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbVRyZWVOb2RlOjpjb25zdF9pdGVyYXRvcj4ge307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxEb21pbmF0b3JUcmVlKj4KKyAgOiBwdWJsaWMgR3JhcGhUcmFpdHM8RG9tVHJlZU5vZGUqPiB7CisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShEb21pbmF0b3JUcmVlICpEVCkgeyByZXR1cm4gRFQtPmdldFJvb3ROb2RlKCk7IH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oRG9taW5hdG9yVHJlZSAqTikgeworICAgIHJldHVybiBkZl9iZWdpbihnZXRFbnRyeU5vZGUoTikpOworICB9CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2VuZChEb21pbmF0b3JUcmVlICpOKSB7CisgICAgcmV0dXJuIGRmX2VuZChnZXRFbnRyeU5vZGUoTikpOworICB9Cit9OworCisvLy8gXGJyaWVmIEFuYWx5c2lzIHBhc3Mgd2hpY2ggY29tcHV0ZXMgYSBcYyBEb21pbmF0b3JUcmVlLgorY2xhc3MgRG9taW5hdG9yVHJlZUFuYWx5c2lzIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPERvbWluYXRvclRyZWVBbmFseXNpcz4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48RG9taW5hdG9yVHJlZUFuYWx5c2lzPjsKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIFByb3ZpZGUgdGhlIHJlc3VsdCB0eXBlZGVmIGZvciB0aGlzIGFuYWx5c2lzIHBhc3MuCisgIHVzaW5nIFJlc3VsdCA9IERvbWluYXRvclRyZWU7CisKKyAgLy8vIFxicmllZiBSdW4gdGhlIGFuYWx5c2lzIHBhc3Mgb3ZlciBhIGZ1bmN0aW9uIGFuZCBwcm9kdWNlIGEgZG9taW5hdG9yIHRyZWUuCisgIERvbWluYXRvclRyZWUgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmKTsKK307CisKKy8vLyBcYnJpZWYgUHJpbnRlciBwYXNzIGZvciB0aGUgXGMgRG9taW5hdG9yVHJlZS4KK2NsYXNzIERvbWluYXRvclRyZWVQcmludGVyUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48RG9taW5hdG9yVHJlZVByaW50ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKworcHVibGljOgorICBleHBsaWNpdCBEb21pbmF0b3JUcmVlUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TKTsKKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIFZlcmlmaWVyIHBhc3MgZm9yIHRoZSBcYyBEb21pbmF0b3JUcmVlLgorc3RydWN0IERvbWluYXRvclRyZWVWZXJpZmllclBhc3MgOiBQYXNzSW5mb01peGluPERvbWluYXRvclRyZWVWZXJpZmllclBhc3M+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIFxicmllZiBMZWdhY3kgYW5hbHlzaXMgcGFzcyB3aGljaCBjb21wdXRlcyBhIFxjIERvbWluYXRvclRyZWUuCitjbGFzcyBEb21pbmF0b3JUcmVlV3JhcHBlclBhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgRG9taW5hdG9yVHJlZSBEVDsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBEb21pbmF0b3JUcmVlV3JhcHBlclBhc3MoKSA6IEZ1bmN0aW9uUGFzcyhJRCkgeworICAgIGluaXRpYWxpemVEb21pbmF0b3JUcmVlV3JhcHBlclBhc3NQYXNzKCpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpKTsKKyAgfQorCisgIERvbWluYXRvclRyZWUgJmdldERvbVRyZWUoKSB7IHJldHVybiBEVDsgfQorICBjb25zdCBEb21pbmF0b3JUcmVlICZnZXREb21UcmVlKCkgY29uc3QgeyByZXR1cm4gRFQ7IH0KKworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworCisgIHZvaWQgdmVyaWZ5QW5hbHlzaXMoKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgfQorCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlIHsgRFQucmVsZWFzZU1lbW9yeSgpOyB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSAqTSA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gXGJyaWVmIENsYXNzIHRvIGRlZmVyIHVwZGF0ZXMgdG8gYSBEb21pbmF0b3JUcmVlLgorLy8vCisvLy8gRGVmaW5pdGlvbjogQXBwbHlpbmcgdXBkYXRlcyB0byBldmVyeSBlZGdlIGluc2VydGlvbiBhbmQgZGVsZXRpb24gaXMKKy8vLyBleHBlbnNpdmUgYW5kIG5vdCBuZWNlc3NhcnkuIFdoZW4gb25lIG5lZWRzIHRoZSBEb21pbmF0b3JUcmVlIGZvciBhbmFseXNpcworLy8vIHRoZXkgY2FuIHJlcXVlc3QgYSBmbHVzaCgpIHRvIHBlcmZvcm0gYSBsYXJnZXIgYmF0Y2ggdXBkYXRlLiBUaGlzIGhhcyB0aGUKKy8vLyBhZHZhbnRhZ2Ugb2YgdGhlIERvbWluYXRvclRyZWUgaW5zcGVjdGluZyB0aGUgc2V0IG9mIHVwZGF0ZXMgdG8gZmluZAorLy8vIGR1cGxpY2F0ZXMgb3IgdW5uZWNlc3Nhcnkgc3VidHJlZSB1cGRhdGVzLgorLy8vCisvLy8gVGhlIHNjb3BlIG9mIERlZmVycmVkRG9taW5hbmNlIG9wZXJhdGVzIGF0IGEgRnVuY3Rpb24gbGV2ZWwuCisvLy8KKy8vLyBJdCBpcyBub3QgbmVjZXNzYXJ5IGZvciB0aGUgdXNlciB0byBzY3J1YiB0aGUgdXBkYXRlcyBmb3IgZHVwbGljYXRlcyBvcgorLy8vIHVwZGF0ZXMgdGhhdCBwb2ludCB0byB0aGUgc2FtZSBibG9jayAoRGVsZXRlLCBCQl9BLCBCQl9BKS4gUGVyZm9ybWFuY2UKKy8vLyBjYW4gYmUgZ2FpbmVkIGlmIHRoZSBjYWxsZXIgYXR0ZW1wdHMgdG8gYmF0Y2ggdXBkYXRlcyBiZWZvcmUgc3VibWl0dGluZworLy8vIHRvIGFwcGx5VXBkYXRlcyhBcnJheVJlZikgaW4gY2FzZXMgd2hlcmUgZHVwbGljYXRlIGVkZ2UgcmVxdWVzdHMgd2lsbAorLy8vIG9jY3VyLgorLy8vCisvLy8gSXQgaXMgcmVxdWlyZWQgZm9yIHRoZSBzdGF0ZSBvZiB0aGUgTExWTSBJUiB0byBiZSBhcHBsaWVkICpiZWZvcmUqCisvLy8gc3VibWl0dGluZyB1cGRhdGVzLiBUaGUgdXBkYXRlIHJvdXRpbmVzIG11c3QgYW5hbHl6ZSB0aGUgY3VycmVudCBzdGF0ZQorLy8vIGJldHdlZW4gYSBwYWlyIG9mIChGcm9tLCBUbykgYmFzaWMgYmxvY2tzIHRvIGRldGVybWluZSBpZiB0aGUgdXBkYXRlCisvLy8gbmVlZHMgdG8gYmUgcXVldWVkLgorLy8vIEV4YW1wbGUgKGdvb2QpOgorLy8vICAgICBUZXJtaW5hdG9ySW5zdHJ1Y3Rpb25CQi0+cmVtb3ZlRnJvbVBhcmVudCgpOworLy8vICAgICBERFQtPmRlbGV0ZUVkZ2UoQkIsIFN1Y2Nlc3Nvcik7CisvLy8gRXhhbXBsZSAoYmFkKToKKy8vLyAgICAgRERULT5kZWxldGVFZGdlKEJCLCBTdWNjZXNzb3IpOworLy8vICAgICBUZXJtaW5hdG9ySW5zdHJ1Y3Rpb25CQi0+cmVtb3ZlRnJvbVBhcmVudCgpOworY2xhc3MgRGVmZXJyZWREb21pbmFuY2UgeworcHVibGljOgorICBEZWZlcnJlZERvbWluYW5jZShEb21pbmF0b3JUcmVlICZEVF8pIDogRFQoRFRfKSB7fQorCisgIC8vLyBcYnJpZWYgUXVldWVzIG11bHRpcGxlIHVwZGF0ZXMgYW5kIGRpc2NhcmRzIGR1cGxpY2F0ZXMuCisgIHZvaWQgYXBwbHlVcGRhdGVzKEFycmF5UmVmPERvbWluYXRvclRyZWU6OlVwZGF0ZVR5cGU+IFVwZGF0ZXMpOworCisgIC8vLyBcYnJpZWYgSGVscGVyIG1ldGhvZCBmb3IgYSBzaW5nbGUgZWRnZSBpbnNlcnRpb24uIEl0J3MgYWxtb3N0IGFsd2F5cworICAvLy8gYmV0dGVyIHRvIGJhdGNoIHVwZGF0ZXMgYW5kIGNhbGwgYXBwbHlVcGRhdGVzIHRvIHF1aWNrbHkgcmVtb3ZlIGR1cGxpY2F0ZQorICAvLy8gZWRnZXMuIFRoaXMgaXMgYmVzdCB1c2VkIHdoZW4gdGhlcmUgaXMgb25seSBhIHNpbmdsZSBpbnNlcnRpb24gbmVlZGVkIHRvCisgIC8vLyB1cGRhdGUgRG9taW5hdG9ycy4KKyAgdm9pZCBpbnNlcnRFZGdlKEJhc2ljQmxvY2sgKkZyb20sIEJhc2ljQmxvY2sgKlRvKTsKKworICAvLy8gXGJyaWVmIEhlbHBlciBtZXRob2QgZm9yIGEgc2luZ2xlIGVkZ2UgZGVsZXRpb24uIEl0J3MgYWxtb3N0IGFsd2F5cyBiZXR0ZXIKKyAgLy8vIHRvIGJhdGNoIHVwZGF0ZXMgYW5kIGNhbGwgYXBwbHlVcGRhdGVzIHRvIHF1aWNrbHkgcmVtb3ZlIGR1cGxpY2F0ZSBlZGdlcy4KKyAgLy8vIFRoaXMgaXMgYmVzdCB1c2VkIHdoZW4gdGhlcmUgaXMgb25seSBhIHNpbmdsZSBkZWxldGlvbiBuZWVkZWQgdG8gdXBkYXRlCisgIC8vLyBEb21pbmF0b3JzLgorICB2b2lkIGRlbGV0ZUVkZ2UoQmFzaWNCbG9jayAqRnJvbSwgQmFzaWNCbG9jayAqVG8pOworCisgIC8vLyBcYnJpZWYgRGVsYXlzIHRoZSBkZWxldGlvbiBvZiBhIGJhc2ljIGJsb2NrIHVudGlsIGEgZmx1c2goKSBldmVudC4KKyAgdm9pZCBkZWxldGVCQihCYXNpY0Jsb2NrICpEZWxCQik7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgRGVsQkIgaXMgYXdhaXRpbmcgZGVsZXRpb24gYXQgYSBmbHVzaCgpIGV2ZW50LgorICBib29sIHBlbmRpbmdEZWxldGVkQkIoQmFzaWNCbG9jayAqRGVsQkIpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHBlbmRpbmcgRFQgdXBkYXRlcyBhcmUgcXVldWVkIGZvciBhIGZsdXNoKCkgZXZlbnQuCisgIGJvb2wgcGVuZGluZygpOworCisgIC8vLyBcYnJpZWYgRmx1c2hlcyBhbGwgcGVuZGluZyB1cGRhdGVzIGFuZCBibG9jayBkZWxldGlvbnMuIFJldHVybnMgYQorICAvLy8gY29ycmVjdCBEb21pbmF0b3JUcmVlIHJlZmVyZW5jZSB0byBiZSB1c2VkIGJ5IHRoZSBjYWxsZXIgZm9yIGFuYWx5c2lzLgorICBEb21pbmF0b3JUcmVlICZmbHVzaCgpOworCisgIC8vLyBcYnJpZWYgRHJvcHMgYWxsIGludGVybmFsIHN0YXRlIGFuZCBmb3JjZXMgYSAoc2xvdykgcmVjYWxjdWxhdGlvbiBvZiB0aGUKKyAgLy8vIERvbWluYXRvclRyZWUgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIExMVk0gSVIgaW4gRi4gVGhpcyBzaG91bGQKKyAgLy8vIG9ubHkgYmUgdXNlZCBpbiBjb3JuZXIgY2FzZXMgc3VjaCBhcyB0aGUgRW50cnkgYmxvY2sgb2YgRiBiZWluZyBkZWxldGVkLgorICB2b2lkIHJlY2FsY3VsYXRlKEZ1bmN0aW9uICZGKTsKKworICAvLy8gXGJyaWVmIERlYnVnIG1ldGhvZCB0byBoZWxwIHZpZXcgdGhlIHN0YXRlIG9mIHBlbmRpbmcgdXBkYXRlcy4KKyAgTExWTV9EVU1QX01FVEhPRCB2b2lkIGR1bXAoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgRG9taW5hdG9yVHJlZSAmRFQ7CisgIFNtYWxsVmVjdG9yPERvbWluYXRvclRyZWU6OlVwZGF0ZVR5cGUsIDE2PiBQZW5kVXBkYXRlczsKKyAgU21hbGxQdHJTZXQ8QmFzaWNCbG9jayAqLCA4PiBEZWxldGVkQkJzOworCisgIC8vLyBBcHBseSBhbiB1cGRhdGUgKEtpbmQsIEZyb20sIFRvKSB0byB0aGUgaW50ZXJuYWwgcXVldWVkIHVwZGF0ZXMuIFRoZQorICAvLy8gdXBkYXRlIGlzIG9ubHkgYWRkZWQgd2hlbiBkZXRlcm1pbmVkIHRvIGJlIG5lY2Vzc2FyeS4gQ2hlY2tzIGZvcgorICAvLy8gc2VsZi1kb21pbmF0aW9uLCB1bm5lY2Vzc2FyeSB1cGRhdGVzLCBkdXBsaWNhdGUgcmVxdWVzdHMsIGFuZCBiYWxhbmNlZAorICAvLy8gcGFpcnMgb2YgcmVxdWVzdHMgYXJlIGFsbCBwZXJmb3JtZWQuIFJldHVybnMgdHJ1ZSBpZiB0aGUgdXBkYXRlIGlzCisgIC8vLyBxdWV1ZWQgYW5kIGZhbHNlIGlmIGl0IGlzIGRpc2NhcmRlZC4KKyAgYm9vbCBhcHBseVVwZGF0ZShEb21pbmF0b3JUcmVlOjpVcGRhdGVLaW5kIEtpbmQsIEJhc2ljQmxvY2sgKkZyb20sCisgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqVG8pOworCisgIC8vLyBQZXJmb3JtcyBhbGwgcGVuZGluZyBiYXNpYyBibG9jayBkZWxldGlvbnMuIFdlIGhhdmUgdG8gZGVmZXIgdGhlIGRlbGV0aW9uCisgIC8vLyBvZiB0aGVzZSBibG9ja3MgdW50aWwgYWZ0ZXIgdGhlIERvbWluYXRvclRyZWUgdXBkYXRlcyBhcmUgYXBwbGllZC4gVGhlCisgIC8vLyBpbnRlcm5hbCB3b3JraW5ncyBvZiB0aGUgRG9taW5hdG9yVHJlZSBjb2RlIGV4cGVjdCBldmVyeSB1cGRhdGUncyBGcm9tCisgIC8vLyBhbmQgVG8gYmxvY2tzIHRvIGV4aXN0IGFuZCB0byBiZSBhIG1lbWJlciBvZiB0aGUgc2FtZSBGdW5jdGlvbi4KKyAgYm9vbCBmbHVzaERlbEJCKCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9ET01JTkFUT1JTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRnVuY3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRnVuY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzlkMzcwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9GdW5jdGlvbi5oCkBAIC0wLDAgKzEsNzk4IEBACisvLz09PS0gbGx2bS9GdW5jdGlvbi5oIC0gQ2xhc3MgdG8gcmVwcmVzZW50IGEgc2luZ2xlIGZ1bmN0aW9uIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIEZ1bmN0aW9uIGNsYXNzLCB3aGljaCByZXByZXNlbnRzIGEKKy8vIHNpbmdsZSBmdW5jdGlvbi9wcm9jZWR1cmUgaW4gTExWTS4KKy8vCisvLyBBIGZ1bmN0aW9uIGJhc2ljYWxseSBjb25zaXN0cyBvZiBhIGxpc3Qgb2YgYmFzaWMgYmxvY2tzLCBhIGxpc3Qgb2YgYXJndW1lbnRzLAorLy8gYW5kIGEgc3ltYm9sIHRhYmxlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9GVU5DVElPTl9ICisjZGVmaW5lIExMVk1fSVJfRlVOQ1RJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQXJndW1lbnQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbE9iamVjdC5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL09wZXJhbmRUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1N5bWJvbFRhYmxlTGlzdFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIEludHJpbnNpYyB7CitlbnVtIElEIDogdW5zaWduZWQ7Cit9CisKK2NsYXNzIEFzc2VtYmx5QW5ub3RhdGlvbldyaXRlcjsKK2NsYXNzIENvbnN0YW50OworY2xhc3MgRElTdWJwcm9ncmFtOworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBNb2R1bGU7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgT3B0aW9uYWw7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFR5cGU7CitjbGFzcyBVc2VyOworCitjbGFzcyBGdW5jdGlvbiA6IHB1YmxpYyBHbG9iYWxPYmplY3QsIHB1YmxpYyBpbGlzdF9ub2RlPEZ1bmN0aW9uPiB7CitwdWJsaWM6CisgIHVzaW5nIEJhc2ljQmxvY2tMaXN0VHlwZSA9IFN5bWJvbFRhYmxlTGlzdDxCYXNpY0Jsb2NrPjsKKworICAvLyBCYXNpY0Jsb2NrIGl0ZXJhdG9ycy4uLgorICB1c2luZyBpdGVyYXRvciA9IEJhc2ljQmxvY2tMaXN0VHlwZTo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gQmFzaWNCbG9ja0xpc3RUeXBlOjpjb25zdF9pdGVyYXRvcjsKKworICB1c2luZyBhcmdfaXRlcmF0b3IgPSBBcmd1bWVudCAqOworICB1c2luZyBjb25zdF9hcmdfaXRlcmF0b3IgPSBjb25zdCBBcmd1bWVudCAqOworCitwcml2YXRlOgorICAvLyBJbXBvcnRhbnQgdGhpbmdzIHRoYXQgbWFrZSB1cCBhIGZ1bmN0aW9uIQorICBCYXNpY0Jsb2NrTGlzdFR5cGUgQmFzaWNCbG9ja3M7ICAgICAgICAgLy8vPCBUaGUgYmFzaWMgYmxvY2tzCisgIG11dGFibGUgQXJndW1lbnQgKkFyZ3VtZW50cyA9IG51bGxwdHI7ICAvLy88IFRoZSBmb3JtYWwgYXJndW1lbnRzCisgIHNpemVfdCBOdW1BcmdzOworICBzdGQ6OnVuaXF1ZV9wdHI8VmFsdWVTeW1ib2xUYWJsZT4KKyAgICAgIFN5bVRhYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgU3ltYm9sIHRhYmxlIG9mIGFyZ3MvaW5zdHJ1Y3Rpb25zCisgIEF0dHJpYnV0ZUxpc3QgQXR0cmlidXRlU2V0czsgICAgICAgICAgICAvLy88IFBhcmFtZXRlciBhdHRyaWJ1dGVzCisKKyAgLyoKKyAgICogVmFsdWU6OlN1YmNsYXNzRGF0YQorICAgKgorICAgKiBiaXQgMCAgICAgIDogSGFzTGF6eUFyZ3VtZW50cworICAgKiBiaXQgMSAgICAgIDogSGFzUHJlZml4RGF0YQorICAgKiBiaXQgMiAgICAgIDogSGFzUHJvbG9ndWVEYXRhCisgICAqIGJpdCAzICAgICAgOiBIYXNQZXJzb25hbGl0eUZuCisgICAqIGJpdHMgNC0xMyAgOiBDYWxsaW5nQ29udmVudGlvbgorICAgKiBiaXRzIDE0ICAgIDogSGFzR0MKKyAgICogYml0cyAxNSA6IFtyZXNlcnZlZF0KKyAgICovCisKKyAgLy8vIEJpdHMgZnJvbSBHbG9iYWxPYmplY3Q6Okdsb2JhbE9iamVjdFN1YmNsYXNzRGF0YS4KKyAgZW51bSB7CisgICAgLy8vIFdoZXRoZXIgdGhpcyBmdW5jdGlvbiBpcyBtYXRlcmlhbGl6YWJsZS4KKyAgICBJc01hdGVyaWFsaXphYmxlQml0ID0gMCwKKyAgfTsKKworICBmcmllbmQgY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzPEZ1bmN0aW9uPjsKKworICAvLy8gaGFzTGF6eUFyZ3VtZW50cy9DaGVja0xhenlBcmd1bWVudHMgLSBUaGUgYXJndW1lbnQgbGlzdCBvZiBhIGZ1bmN0aW9uIGlzCisgIC8vLyBidWlsdCBvbiBkZW1hbmQsIHNvIHRoYXQgdGhlIGxpc3QgaXNuJ3QgYWxsb2NhdGVkIHVudGlsIHRoZSBmaXJzdCBjbGllbnQKKyAgLy8vIG5lZWRzIGl0LiAgVGhlIGhhc0xhenlBcmd1bWVudHMgcHJlZGljYXRlIHJldHVybnMgdHJ1ZSBpZiB0aGUgYXJnIGxpc3QKKyAgLy8vIGhhc24ndCBiZWVuIHNldCB1cCB5ZXQuCitwdWJsaWM6CisgIGJvb2wgaGFzTGF6eUFyZ3VtZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgJiAoMTw8MCk7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBDaGVja0xhenlBcmd1bWVudHMoKSBjb25zdCB7CisgICAgaWYgKGhhc0xhenlBcmd1bWVudHMoKSkKKyAgICAgIEJ1aWxkTGF6eUFyZ3VtZW50cygpOworICB9CisKKyAgdm9pZCBCdWlsZExhenlBcmd1bWVudHMoKSBjb25zdDsKKworICB2b2lkIGNsZWFyQXJndW1lbnRzKCk7CisKKyAgLy8vIEZ1bmN0aW9uIGN0b3IgLSBJZiB0aGUgKG9wdGlvbmFsKSBNb2R1bGUgYXJndW1lbnQgaXMgc3BlY2lmaWVkLCB0aGUKKyAgLy8vIGZ1bmN0aW9uIGlzIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgaW50byB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiBsaXN0IGZvcgorICAvLy8gdGhlIG1vZHVsZS4KKyAgLy8vCisgIEZ1bmN0aW9uKEZ1bmN0aW9uVHlwZSAqVHksIExpbmthZ2VUeXBlcyBMaW5rYWdlLAorICAgICAgICAgICBjb25zdCBUd2luZSAmTiA9ICIiLCBNb2R1bGUgKk0gPSBudWxscHRyKTsKKworcHVibGljOgorICBGdW5jdGlvbihjb25zdCBGdW5jdGlvbiYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBGdW5jdGlvbiYpID0gZGVsZXRlOworICB+RnVuY3Rpb24oKTsKKworICAvLyBUaGlzIGlzIGhlcmUgdG8gaGVscCBlYXNpbHkgY29udmVydCBmcm9tIEZ1bmN0aW9uVCAqIChGdW5jdGlvbiAqIG9yCisgIC8vIE1hY2hpbmVGdW5jdGlvbiAqKSBpbiBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsIHRvIEZ1bmN0aW9uICogYnkgY2FsbGluZworICAvLyBGdW5jdGlvblQtPmdldEZ1bmN0aW9uKCkuCisgIGNvbnN0IEZ1bmN0aW9uICZnZXRGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgc3RhdGljIEZ1bmN0aW9uICpDcmVhdGUoRnVuY3Rpb25UeXBlICpUeSwgTGlua2FnZVR5cGVzIExpbmthZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOID0gIiIsIE1vZHVsZSAqTSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKFR5LCBMaW5rYWdlLCBOLCBNKTsKKyAgfQorCisgIC8vIFByb3ZpZGUgZmFzdCBvcGVyYW5kIGFjY2Vzc29ycy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8vIFJldHVybnMgdGhlIEZ1bmN0aW9uVHlwZSBmb3IgbWUuCisgIEZ1bmN0aW9uVHlwZSAqZ2V0RnVuY3Rpb25UeXBlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PEZ1bmN0aW9uVHlwZT4oZ2V0VmFsdWVUeXBlKCkpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHJldCB2YWwuCisgIFR5cGUgKmdldFJldHVyblR5cGUoKSBjb25zdCB7IHJldHVybiBnZXRGdW5jdGlvblR5cGUoKS0+Z2V0UmV0dXJuVHlwZSgpOyB9CisKKyAgLy8vIGdldENvbnRleHQgLSBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIExMVk1Db250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgIC8vLyBmdW5jdGlvbi4KKyAgTExWTUNvbnRleHQgJmdldENvbnRleHQoKSBjb25zdDsKKworICAvLy8gaXNWYXJBcmcgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mCisgIC8vLyBhcmd1bWVudHMuCisgIGJvb2wgaXNWYXJBcmcoKSBjb25zdCB7IHJldHVybiBnZXRGdW5jdGlvblR5cGUoKS0+aXNWYXJBcmcoKTsgfQorCisgIGJvb2wgaXNNYXRlcmlhbGl6YWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0R2xvYmFsT2JqZWN0U3ViQ2xhc3NEYXRhKCkgJiAoMSA8PCBJc01hdGVyaWFsaXphYmxlQml0KTsKKyAgfQorICB2b2lkIHNldElzTWF0ZXJpYWxpemFibGUoYm9vbCBWKSB7CisgICAgdW5zaWduZWQgTWFzayA9IDEgPDwgSXNNYXRlcmlhbGl6YWJsZUJpdDsKKyAgICBzZXRHbG9iYWxPYmplY3RTdWJDbGFzc0RhdGEoKH5NYXNrICYgZ2V0R2xvYmFsT2JqZWN0U3ViQ2xhc3NEYXRhKCkpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFYgPyBNYXNrIDogMHUpKTsKKyAgfQorCisgIC8vLyBnZXRJbnRyaW5zaWNJRCAtIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIElEIG51bWJlciBvZiB0aGUgc3BlY2lmaWVkCisgIC8vLyBmdW5jdGlvbiwgb3IgSW50cmluc2ljOjpub3RfaW50cmluc2ljIGlmIHRoZSBmdW5jdGlvbiBpcyBub3QgYW4KKyAgLy8vIGludHJpbnNpYywgb3IgaWYgdGhlIHBvaW50ZXIgaXMgbnVsbC4gIFRoaXMgdmFsdWUgaXMgYWx3YXlzIGRlZmluZWQgdG8gYmUKKyAgLy8vIHplcm8gdG8gYWxsb3cgZWFzeSBjaGVja2luZyBmb3Igd2hldGhlciBhIGZ1bmN0aW9uIGlzIGludHJpbnNpYyBvciBub3QuCisgIC8vLyBUaGUgcGFydGljdWxhciBpbnRyaW5zaWMgZnVuY3Rpb25zIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhpcyB2YWx1ZSBhcmUKKyAgLy8vIGRlZmluZWQgaW4gbGx2bS9JbnRyaW5zaWNzLmguCisgIEludHJpbnNpYzo6SUQgZ2V0SW50cmluc2ljSUQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIEludElEOyB9CisKKyAgLy8vIGlzSW50cmluc2ljIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBmdW5jdGlvbidzIG5hbWUgc3RhcnRzIHdpdGggImxsdm0uIi4KKyAgLy8vIEl0J3MgcG9zc2libGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIHRydWUgd2hpbGUgZ2V0SW50cmluc2ljSUQoKQorICAvLy8gcmV0dXJucyBJbnRyaW5zaWM6Om5vdF9pbnRyaW5zaWMhCisgIGJvb2wgaXNJbnRyaW5zaWMoKSBjb25zdCB7IHJldHVybiBIYXNMTFZNUmVzZXJ2ZWROYW1lOyB9CisKKyAgc3RhdGljIEludHJpbnNpYzo6SUQgbG9va3VwSW50cmluc2ljSUQoU3RyaW5nUmVmIE5hbWUpOworCisgIC8vLyBcYnJpZWYgUmVjYWxjdWxhdGUgdGhlIElEIGZvciB0aGlzIGZ1bmN0aW9uIGlmIGl0IGlzIGFuIEludHJpbnNpYyBkZWZpbmVkCisgIC8vLyBpbiBsbHZtL0ludHJpbnNpY3MuaC4gIFNldHMgdGhlIGludHJpbnNpYyBJRCB0byBJbnRyaW5zaWM6Om5vdF9pbnRyaW5zaWMKKyAgLy8vIGlmIHRoZSBuYW1lIG9mIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgbWF0Y2ggYW4gaW50cmluc2ljIGluIHRoYXQgaGVhZGVyLgorICAvLy8gTm90ZSwgdGhpcyBtZXRob2QgZG9lcyBub3QgbmVlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHksIGFzIGl0IGlzIGNhbGxlZAorICAvLy8gZnJvbSBWYWx1ZTo6c2V0TmFtZSgpIHdoZW5ldmVyIHRoZSBuYW1lIG9mIHRoaXMgZnVuY3Rpb24gY2hhbmdlcy4KKyAgdm9pZCByZWNhbGN1bGF0ZUludHJpbnNpY0lEKCk7CisKKyAgLy8vIGdldENhbGxpbmdDb252KCkvc2V0Q2FsbGluZ0NvbnYoQ0MpIC0gVGhlc2UgbWV0aG9kIGdldCBhbmQgc2V0IHRoZQorICAvLy8gY2FsbGluZyBjb252ZW50aW9uIG9mIHRoaXMgZnVuY3Rpb24uICBUaGUgZW51bSB2YWx1ZXMgZm9yIHRoZSBrbm93bgorICAvLy8gY2FsbGluZyBjb252ZW50aW9ucyBhcmUgZGVmaW5lZCBpbiBDYWxsaW5nQ29udi5oLgorICBDYWxsaW5nQ29udjo6SUQgZ2V0Q2FsbGluZ0NvbnYoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PENhbGxpbmdDb252OjpJRD4oKGdldFN1YmNsYXNzRGF0YUZyb21WYWx1ZSgpID4+IDQpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6TWF4SUQpOworICB9CisgIHZvaWQgc2V0Q2FsbGluZ0NvbnYoQ2FsbGluZ0NvbnY6OklEIENDKSB7CisgICAgYXV0byBJRCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihDQyk7CisgICAgYXNzZXJ0KCEoSUQgJiB+Q2FsbGluZ0NvbnY6Ok1heElEKSAmJiAiVW5zdXBwb3J0ZWQgY2FsbGluZyBjb252ZW50aW9uIik7CisgICAgc2V0VmFsdWVTdWJjbGFzc0RhdGEoKGdldFN1YmNsYXNzRGF0YUZyb21WYWx1ZSgpICYgMHhjMDBmKSB8IChJRCA8PCA0KSk7CisgIH0KKworICAvLy8gQGJyaWVmIFJldHVybiB0aGUgYXR0cmlidXRlIGxpc3QgZm9yIHRoaXMgRnVuY3Rpb24uCisgIEF0dHJpYnV0ZUxpc3QgZ2V0QXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIEF0dHJpYnV0ZVNldHM7IH0KKworICAvLy8gQGJyaWVmIFNldCB0aGUgYXR0cmlidXRlIGxpc3QgZm9yIHRoaXMgRnVuY3Rpb24uCisgIHZvaWQgc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVMaXN0IEF0dHJzKSB7IEF0dHJpYnV0ZVNldHMgPSBBdHRyczsgfQorCisgIC8vLyBAYnJpZWYgQWRkIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgdG8gdGhpcyBmdW5jdGlvbi4KKyAgdm9pZCBhZGRGbkF0dHIoQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSB7CisgICAgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEtpbmQpOworICB9CisKKyAgLy8vIEBicmllZiBBZGQgZnVuY3Rpb24gYXR0cmlidXRlcyB0byB0aGlzIGZ1bmN0aW9uLgorICB2b2lkIGFkZEZuQXR0cihTdHJpbmdSZWYgS2luZCwgU3RyaW5nUmVmIFZhbCA9IFN0cmluZ1JlZigpKSB7CisgICAgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsCisgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZTo6Z2V0KGdldENvbnRleHQoKSwgS2luZCwgVmFsKSk7CisgIH0KKworICAvLy8gQGJyaWVmIEFkZCBmdW5jdGlvbiBhdHRyaWJ1dGVzIHRvIHRoaXMgZnVuY3Rpb24uCisgIHZvaWQgYWRkRm5BdHRyKEF0dHJpYnV0ZSBBdHRyKSB7CisgICAgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHIpOworICB9CisKKyAgLy8vIEBicmllZiBSZW1vdmUgZnVuY3Rpb24gYXR0cmlidXRlcyBmcm9tIHRoaXMgZnVuY3Rpb24uCisgIHZvaWQgcmVtb3ZlRm5BdHRyKEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgeworICAgIHJlbW92ZUF0dHJpYnV0ZShBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBLaW5kKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgUmVtb3ZlIGZ1bmN0aW9uIGF0dHJpYnV0ZSBmcm9tIHRoaXMgZnVuY3Rpb24uCisgIHZvaWQgcmVtb3ZlRm5BdHRyKFN0cmluZ1JlZiBLaW5kKSB7CisgICAgc2V0QXR0cmlidXRlcyhnZXRBdHRyaWJ1dGVzKCkucmVtb3ZlQXR0cmlidXRlKAorICAgICAgICBnZXRDb250ZXh0KCksIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEtpbmQpKTsKKyAgfQorCisgIGVudW0gUHJvZmlsZUNvdW50VHlwZSB7IFBDVF9JbnZhbGlkLCBQQ1RfUmVhbCwgUENUX1N5bnRoZXRpYyB9OworCisgIC8vLyBDbGFzcyB0byByZXByZXNlbnQgcHJvZmlsZSBjb3VudHMuCisgIC8vLworICAvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGJvdGggcmVhbCBhbmQgc3ludGhldGljIHByb2ZpbGUgY291bnRzLgorICBjbGFzcyBQcm9maWxlQ291bnQgeworICBwcml2YXRlOgorICAgIHVpbnQ2NF90IENvdW50OworICAgIFByb2ZpbGVDb3VudFR5cGUgUENUOworICAgIHN0YXRpYyBQcm9maWxlQ291bnQgSW52YWxpZDsKKworICBwdWJsaWM6CisgICAgUHJvZmlsZUNvdW50KCkgOiBDb3VudCgtMSksIFBDVChQQ1RfSW52YWxpZCkge30KKyAgICBQcm9maWxlQ291bnQodWludDY0X3QgQ291bnQsIFByb2ZpbGVDb3VudFR5cGUgUENUKQorICAgICAgICA6IENvdW50KENvdW50KSwgUENUKFBDVCkge30KKyAgICBib29sIGhhc1ZhbHVlKCkgY29uc3QgeyByZXR1cm4gUENUICE9IFBDVF9JbnZhbGlkOyB9CisgICAgdWludDY0X3QgZ2V0Q291bnQoKSBjb25zdCB7IHJldHVybiBDb3VudDsgfQorICAgIFByb2ZpbGVDb3VudFR5cGUgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFBDVDsgfQorICAgIGJvb2wgaXNTeW50aGV0aWMoKSBjb25zdCB7IHJldHVybiBQQ1QgPT0gUENUX1N5bnRoZXRpYzsgfQorICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSB7IHJldHVybiBoYXNWYWx1ZSgpOyB9CisgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7IHJldHVybiAhaGFzVmFsdWUoKTsgfQorICAgIC8vIFVwZGF0ZSB0aGUgY291bnQgcmV0YWluaW5nIHRoZSBzYW1lIHByb2ZpbGUgY291bnQgdHlwZS4KKyAgICBQcm9maWxlQ291bnQgJnNldENvdW50KHVpbnQ2NF90IEMpIHsKKyAgICAgIENvdW50ID0gQzsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgc3RhdGljIFByb2ZpbGVDb3VudCBnZXRJbnZhbGlkKCkgeyByZXR1cm4gUHJvZmlsZUNvdW50KC0xLCBQQ1RfSW52YWxpZCk7IH0KKyAgfTsKKworICAvLy8gXGJyaWVmIFNldCB0aGUgZW50cnkgY291bnQgZm9yIHRoaXMgZnVuY3Rpb24uCisgIC8vLworICAvLy8gRW50cnkgY291bnQgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGZ1bmN0aW9uIHdhcyBleGVjdXRlZCBiYXNlZCBvbgorICAvLy8gcGdvIGRhdGEuIFxwIEltcG9ydHMgcG9pbnRzIHRvIGEgc2V0IG9mIEdVSURzIHRoYXQgbmVlZHMgdG8KKyAgLy8vIGJlIGltcG9ydGVkIGJ5IHRoZSBmdW5jdGlvbiBmb3Igc2FtcGxlIFBHTywgdG8gZW5hYmxlIHRoZSBzYW1lIGlubGluZXMgYXMKKyAgLy8vIHRoZSBwcm9maWxlZCBvcHRpbWl6ZWQgYmluYXJ5LgorICB2b2lkIHNldEVudHJ5Q291bnQoUHJvZmlsZUNvdW50IENvdW50LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVuc2VTZXQ8R2xvYmFsVmFsdWU6OkdVSUQ+ICpJbXBvcnRzID0gbnVsbHB0cik7CisKKyAgLy8vIEEgY29udmVuaWVuY2Ugd3JhcHBlciBmb3Igc2V0dGluZyBlbnRyeSBjb3VudAorICB2b2lkIHNldEVudHJ5Q291bnQodWludDY0X3QgQ291bnQsIFByb2ZpbGVDb3VudFR5cGUgVHlwZSA9IFBDVF9SZWFsLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVuc2VTZXQ8R2xvYmFsVmFsdWU6OkdVSUQ+ICpJbXBvcnRzID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGVudHJ5IGNvdW50IGZvciB0aGlzIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIEVudHJ5IGNvdW50IGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZ1bmN0aW9uIHdhcyBleGVjdXRlZCBiYXNlZCBvbgorICAvLy8gcGdvIGRhdGEuCisgIFByb2ZpbGVDb3VudCBnZXRFbnRyeUNvdW50KCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBmdW5jdGlvbiBpcyBhbm5vdGF0ZWQgd2l0aCBwcm9maWxlIGRhdGEuCisgIC8vLworICAvLy8gUHJlc2VuY2Ugb2YgZW50cnkgY291bnRzIGZyb20gYSBwcm9maWxlIHJ1biBpbXBsaWVzIHRoZSBmdW5jdGlvbiBoYXMKKyAgLy8vIHByb2ZpbGUgYW5ub3RhdGlvbnMuCisgIGJvb2wgaGFzUHJvZmlsZURhdGEoKSBjb25zdCB7IHJldHVybiBnZXRFbnRyeUNvdW50KCkuaGFzVmFsdWUoKTsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBzZXQgb2YgR1VJRHMgdGhhdCBuZWVkcyB0byBiZSBpbXBvcnRlZCB0byB0aGUgZnVuY3Rpb24gZm9yCisgIC8vLyBzYW1wbGUgUEdPLCB0byBlbmFibGUgdGhlIHNhbWUgaW5saW5lcyBhcyB0aGUgcHJvZmlsZWQgb3B0aW1pemVkIGJpbmFyeS4KKyAgRGVuc2VTZXQ8R2xvYmFsVmFsdWU6OkdVSUQ+IGdldEltcG9ydEdVSURzKCkgY29uc3Q7CisKKyAgLy8vIFNldCB0aGUgc2VjdGlvbiBwcmVmaXggZm9yIHRoaXMgZnVuY3Rpb24uCisgIHZvaWQgc2V0U2VjdGlvblByZWZpeChTdHJpbmdSZWYgUHJlZml4KTsKKworICAvLy8gR2V0IHRoZSBzZWN0aW9uIHByZWZpeCBmb3IgdGhpcyBmdW5jdGlvbi4KKyAgT3B0aW9uYWw8U3RyaW5nUmVmPiBnZXRTZWN0aW9uUHJlZml4KCkgY29uc3Q7CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gaGFzIHRoZSBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzRm5BdHRyaWJ1dGUoQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJpYnV0ZVNldHMuaGFzRm5BdHRyaWJ1dGUoS2luZCk7CisgIH0KKworICAvLy8gQGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBmdW5jdGlvbiBoYXMgdGhlIGF0dHJpYnV0ZS4KKyAgYm9vbCBoYXNGbkF0dHJpYnV0ZShTdHJpbmdSZWYgS2luZCkgY29uc3QgeworICAgIHJldHVybiBBdHRyaWJ1dGVTZXRzLmhhc0ZuQXR0cmlidXRlKEtpbmQpOworICB9CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSBraW5kLgorICBBdHRyaWJ1dGUgZ2V0Rm5BdHRyaWJ1dGUoQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEF0dHJpYnV0ZShBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBLaW5kKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUga2luZC4KKyAgQXR0cmlidXRlIGdldEZuQXR0cmlidXRlKFN0cmluZ1JlZiBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEF0dHJpYnV0ZShBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBLaW5kKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzdGFjayBhbGlnbm1lbnQgZm9yIHRoZSBmdW5jdGlvbi4KKyAgdW5zaWduZWQgZ2V0Rm5TdGFja0FsaWdubWVudCgpIGNvbnN0IHsKKyAgICBpZiAoIWhhc0ZuQXR0cmlidXRlKEF0dHJpYnV0ZTo6U3RhY2tBbGlnbm1lbnQpKQorICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIEF0dHJpYnV0ZVNldHMuZ2V0U3RhY2tBbGlnbm1lbnQoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCk7CisgIH0KKworICAvLy8gaGFzR0MvZ2V0R0Mvc2V0R0MvY2xlYXJHQyAtIFRoZSBuYW1lIG9mIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gYWxnb3JpdGhtCisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdXNlIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCisgIGJvb2wgaGFzR0MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN1YmNsYXNzRGF0YUZyb21WYWx1ZSgpICYgKDE8PDE0KTsKKyAgfQorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0R0MoKSBjb25zdDsKKyAgdm9pZCBzZXRHQyhzdGQ6OnN0cmluZyBTdHIpOworICB2b2lkIGNsZWFyR0MoKTsKKworICAvLy8gQGJyaWVmIGFkZHMgdGhlIGF0dHJpYnV0ZSB0byB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzLgorICB2b2lkIGFkZEF0dHJpYnV0ZSh1bnNpZ25lZCBpLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpOworCisgIC8vLyBAYnJpZWYgYWRkcyB0aGUgYXR0cmlidXRlIHRvIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMuCisgIHZvaWQgYWRkQXR0cmlidXRlKHVuc2lnbmVkIGksIEF0dHJpYnV0ZSBBdHRyKTsKKworICAvLy8gQGJyaWVmIGFkZHMgdGhlIGF0dHJpYnV0ZXMgdG8gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcy4KKyAgdm9pZCBhZGRBdHRyaWJ1dGVzKHVuc2lnbmVkIGksIGNvbnN0IEF0dHJCdWlsZGVyICZBdHRycyk7CisKKyAgLy8vIEBicmllZiBhZGRzIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuIGFyZy4KKyAgdm9pZCBhZGRQYXJhbUF0dHIodW5zaWduZWQgQXJnTm8sIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCk7CisKKyAgLy8vIEBicmllZiBhZGRzIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuIGFyZy4KKyAgdm9pZCBhZGRQYXJhbUF0dHIodW5zaWduZWQgQXJnTm8sIEF0dHJpYnV0ZSBBdHRyKTsKKworICAvLy8gQGJyaWVmIGFkZHMgdGhlIGF0dHJpYnV0ZXMgdG8gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuIGFyZy4KKyAgdm9pZCBhZGRQYXJhbUF0dHJzKHVuc2lnbmVkIEFyZ05vLCBjb25zdCBBdHRyQnVpbGRlciAmQXR0cnMpOworCisgIC8vLyBAYnJpZWYgcmVtb3ZlcyB0aGUgYXR0cmlidXRlIGZyb20gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcy4KKyAgdm9pZCByZW1vdmVBdHRyaWJ1dGUodW5zaWduZWQgaSwgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKTsKKworICAvLy8gQGJyaWVmIHJlbW92ZXMgdGhlIGF0dHJpYnV0ZSBmcm9tIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMuCisgIHZvaWQgcmVtb3ZlQXR0cmlidXRlKHVuc2lnbmVkIGksIFN0cmluZ1JlZiBLaW5kKTsKKworICAvLy8gQGJyaWVmIHJlbW92ZXMgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzLgorICB2b2lkIHJlbW92ZUF0dHJpYnV0ZXModW5zaWduZWQgaSwgY29uc3QgQXR0ckJ1aWxkZXIgJkF0dHJzKTsKKworICAvLy8gQGJyaWVmIHJlbW92ZXMgdGhlIGF0dHJpYnV0ZSBmcm9tIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMuCisgIHZvaWQgcmVtb3ZlUGFyYW1BdHRyKHVuc2lnbmVkIEFyZ05vLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpOworCisgIC8vLyBAYnJpZWYgcmVtb3ZlcyB0aGUgYXR0cmlidXRlIGZyb20gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcy4KKyAgdm9pZCByZW1vdmVQYXJhbUF0dHIodW5zaWduZWQgQXJnTm8sIFN0cmluZ1JlZiBLaW5kKTsKKworICAvLy8gQGJyaWVmIHJlbW92ZXMgdGhlIGF0dHJpYnV0ZSBmcm9tIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMuCisgIHZvaWQgcmVtb3ZlUGFyYW1BdHRycyh1bnNpZ25lZCBBcmdObywgY29uc3QgQXR0ckJ1aWxkZXIgJkF0dHJzKTsKKworICAvLy8gQGJyaWVmIGNoZWNrIGlmIGFuIGF0dHJpYnV0ZXMgaXMgaW4gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcy4KKyAgYm9vbCBoYXNBdHRyaWJ1dGUodW5zaWduZWQgaSwgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEF0dHJpYnV0ZXMoKS5oYXNBdHRyaWJ1dGUoaSwgS2luZCk7CisgIH0KKworICAvLy8gQGJyaWVmIGNoZWNrIGlmIGFuIGF0dHJpYnV0ZXMgaXMgaW4gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcy4KKyAgYm9vbCBoYXNQYXJhbUF0dHJpYnV0ZSh1bnNpZ25lZCBBcmdObywgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEF0dHJpYnV0ZXMoKS5oYXNQYXJhbUF0dHJpYnV0ZShBcmdObywgS2luZCk7CisgIH0KKworICAvLy8gQGJyaWVmIGdldHMgdGhlIGF0dHJpYnV0ZSBmcm9tIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMuCisgIEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUodW5zaWduZWQgaSwgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJpYnV0ZVNldHMuZ2V0QXR0cmlidXRlKGksIEtpbmQpOworICB9CisKKyAgLy8vIEBicmllZiBnZXRzIHRoZSBhdHRyaWJ1dGUgZnJvbSB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzLgorICBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKHVuc2lnbmVkIGksIFN0cmluZ1JlZiBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJpYnV0ZVNldHMuZ2V0QXR0cmlidXRlKGksIEtpbmQpOworICB9CisKKyAgLy8vIEBicmllZiBhZGRzIHRoZSBkZXJlZmVyZW5jZWFibGUgYXR0cmlidXRlIHRvIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMuCisgIHZvaWQgYWRkRGVyZWZlcmVuY2VhYmxlQXR0cih1bnNpZ25lZCBpLCB1aW50NjRfdCBCeXRlcyk7CisKKyAgLy8vIEBicmllZiBhZGRzIHRoZSBkZXJlZmVyZW5jZWFibGUgYXR0cmlidXRlIHRvIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgZm9yCisgIC8vLyB0aGUgZ2l2ZW4gYXJnLgorICB2b2lkIGFkZERlcmVmZXJlbmNlYWJsZVBhcmFtQXR0cih1bnNpZ25lZCBBcmdObywgdWludDY0X3QgQnl0ZXMpOworCisgIC8vLyBAYnJpZWYgYWRkcyB0aGUgZGVyZWZlcmVuY2VhYmxlX29yX251bGwgYXR0cmlidXRlIHRvIHRoZSBsaXN0IG9mCisgIC8vLyBhdHRyaWJ1dGVzLgorICB2b2lkIGFkZERlcmVmZXJlbmNlYWJsZU9yTnVsbEF0dHIodW5zaWduZWQgaSwgdWludDY0X3QgQnl0ZXMpOworCisgIC8vLyBAYnJpZWYgYWRkcyB0aGUgZGVyZWZlcmVuY2VhYmxlX29yX251bGwgYXR0cmlidXRlIHRvIHRoZSBsaXN0IG9mCisgIC8vLyBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gYXJnLgorICB2b2lkIGFkZERlcmVmZXJlbmNlYWJsZU9yTnVsbFBhcmFtQXR0cih1bnNpZ25lZCBBcmdObywgdWludDY0X3QgQnl0ZXMpOworCisgIC8vLyBAYnJpZWYgRXh0cmFjdCB0aGUgYWxpZ25tZW50IGZvciBhIGNhbGwgb3IgcGFyYW1ldGVyICgwPXVua25vd24pLgorICB1bnNpZ25lZCBnZXRQYXJhbUFsaWdubWVudCh1bnNpZ25lZCBBcmdObykgY29uc3QgeworICAgIHJldHVybiBBdHRyaWJ1dGVTZXRzLmdldFBhcmFtQWxpZ25tZW50KEFyZ05vKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRXh0cmFjdCB0aGUgbnVtYmVyIG9mIGRlcmVmZXJlbmNlYWJsZSBieXRlcyBmb3IgYSBjYWxsIG9yCisgIC8vLyBwYXJhbWV0ZXIgKDA9dW5rbm93bikuCisgIC8vLyBAcGFyYW0gaSBBdHRyaWJ1dGVMaXN0IGluZGV4LCByZWZlcnJpbmcgdG8gYSByZXR1cm4gdmFsdWUgb3IgYXJndW1lbnQuCisgIHVpbnQ2NF90IGdldERlcmVmZXJlbmNlYWJsZUJ5dGVzKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0cmlidXRlU2V0cy5nZXREZXJlZmVyZW5jZWFibGVCeXRlcyhpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRXh0cmFjdCB0aGUgbnVtYmVyIG9mIGRlcmVmZXJlbmNlYWJsZSBieXRlcyBmb3IgYSBwYXJhbWV0ZXIuCisgIC8vLyBAcGFyYW0gQXJnTm8gSW5kZXggb2YgYW4gYXJndW1lbnQsIHdpdGggMCBiZWluZyB0aGUgZmlyc3QgZnVuY3Rpb24gYXJnLgorICB1aW50NjRfdCBnZXRQYXJhbURlcmVmZXJlbmNlYWJsZUJ5dGVzKHVuc2lnbmVkIEFyZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJpYnV0ZVNldHMuZ2V0UGFyYW1EZXJlZmVyZW5jZWFibGVCeXRlcyhBcmdObyk7CisgIH0KKworICAvLy8gQGJyaWVmIEV4dHJhY3QgdGhlIG51bWJlciBvZiBkZXJlZmVyZW5jZWFibGVfb3JfbnVsbCBieXRlcyBmb3IgYSBjYWxsIG9yCisgIC8vLyBwYXJhbWV0ZXIgKDA9dW5rbm93bikuCisgIC8vLyBAcGFyYW0gaSBBdHRyaWJ1dGVMaXN0IGluZGV4LCByZWZlcnJpbmcgdG8gYSByZXR1cm4gdmFsdWUgb3IgYXJndW1lbnQuCisgIHVpbnQ2NF90IGdldERlcmVmZXJlbmNlYWJsZU9yTnVsbEJ5dGVzKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0cmlidXRlU2V0cy5nZXREZXJlZmVyZW5jZWFibGVPck51bGxCeXRlcyhpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRXh0cmFjdCB0aGUgbnVtYmVyIG9mIGRlcmVmZXJlbmNlYWJsZV9vcl9udWxsIGJ5dGVzIGZvciBhCisgIC8vLyBwYXJhbWV0ZXIuCisgIC8vLyBAcGFyYW0gQXJnTm8gQXR0cmlidXRlTGlzdCBBcmdObywgcmVmZXJyaW5nIHRvIGFuIGFyZ3VtZW50LgorICB1aW50NjRfdCBnZXRQYXJhbURlcmVmZXJlbmNlYWJsZU9yTnVsbEJ5dGVzKHVuc2lnbmVkIEFyZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJpYnV0ZVNldHMuZ2V0UGFyYW1EZXJlZmVyZW5jZWFibGVPck51bGxCeXRlcyhBcmdObyk7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXNzIG1lbW9yeS4KKyAgYm9vbCBkb2VzTm90QWNjZXNzTWVtb3J5KCkgY29uc3QgeworICAgIHJldHVybiBoYXNGbkF0dHJpYnV0ZShBdHRyaWJ1dGU6OlJlYWROb25lKTsKKyAgfQorICB2b2lkIHNldERvZXNOb3RBY2Nlc3NNZW1vcnkoKSB7CisgICAgYWRkRm5BdHRyKEF0dHJpYnV0ZTo6UmVhZE5vbmUpOworICB9CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIGZ1bmN0aW9uIGRvZXMgbm90IGFjY2VzcyBvciBvbmx5IHJlYWRzIG1lbW9yeS4KKyAgYm9vbCBvbmx5UmVhZHNNZW1vcnkoKSBjb25zdCB7CisgICAgcmV0dXJuIGRvZXNOb3RBY2Nlc3NNZW1vcnkoKSB8fCBoYXNGbkF0dHJpYnV0ZShBdHRyaWJ1dGU6OlJlYWRPbmx5KTsKKyAgfQorICB2b2lkIHNldE9ubHlSZWFkc01lbW9yeSgpIHsKKyAgICBhZGRGbkF0dHIoQXR0cmlidXRlOjpSZWFkT25seSk7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXNzIG9yIG9ubHkgd3JpdGVzIG1lbW9yeS4KKyAgYm9vbCBkb2VzTm90UmVhZE1lbW9yeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9lc05vdEFjY2Vzc01lbW9yeSgpIHx8IGhhc0ZuQXR0cmlidXRlKEF0dHJpYnV0ZTo6V3JpdGVPbmx5KTsKKyAgfQorICB2b2lkIHNldERvZXNOb3RSZWFkTWVtb3J5KCkgeworICAgIGFkZEZuQXR0cihBdHRyaWJ1dGU6OldyaXRlT25seSk7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgY2FsbCBjYW4gYWNjZXNzIG1lbW1vcnkgb25seSB1c2luZyBwb2ludGVycyBiYXNlZAorICAvLy8gb24gaXRzIGFyZ3VtZW50cy4KKyAgYm9vbCBvbmx5QWNjZXNzZXNBcmdNZW1vcnkoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0ZuQXR0cmlidXRlKEF0dHJpYnV0ZTo6QXJnTWVtT25seSk7CisgIH0KKyAgdm9pZCBzZXRPbmx5QWNjZXNzZXNBcmdNZW1vcnkoKSB7IGFkZEZuQXR0cihBdHRyaWJ1dGU6OkFyZ01lbU9ubHkpOyB9CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIGZ1bmN0aW9uIG1heSBvbmx5IGFjY2VzcyBtZW1vcnkgdGhhdCBpcworICAvLy8gIGluYWNjZXNzaWJsZSBmcm9tIHRoZSBJUi4KKyAgYm9vbCBvbmx5QWNjZXNzZXNJbmFjY2Vzc2libGVNZW1vcnkoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0ZuQXR0cmlidXRlKEF0dHJpYnV0ZTo6SW5hY2Nlc3NpYmxlTWVtT25seSk7CisgIH0KKyAgdm9pZCBzZXRPbmx5QWNjZXNzZXNJbmFjY2Vzc2libGVNZW1vcnkoKSB7CisgICAgYWRkRm5BdHRyKEF0dHJpYnV0ZTo6SW5hY2Nlc3NpYmxlTWVtT25seSk7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgZnVuY3Rpb24gbWF5IG9ubHkgYWNjZXNzIG1lbW9yeSB0aGF0IGlzCisgIC8vLyAgZWl0aGVyIGluYWNjZXNzaWJsZSBmcm9tIHRoZSBJUiBvciBwb2ludGVkIHRvIGJ5IGl0cyBhcmd1bWVudHMuCisgIGJvb2wgb25seUFjY2Vzc2VzSW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW0oKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0ZuQXR0cmlidXRlKEF0dHJpYnV0ZTo6SW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW1Pbmx5KTsKKyAgfQorICB2b2lkIHNldE9ubHlBY2Nlc3Nlc0luYWNjZXNzaWJsZU1lbU9yQXJnTWVtKCkgeworICAgIGFkZEZuQXR0cihBdHRyaWJ1dGU6OkluYWNjZXNzaWJsZU1lbU9yQXJnTWVtT25seSk7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgZnVuY3Rpb24gY2Fubm90IHJldHVybi4KKyAgYm9vbCBkb2VzTm90UmV0dXJuKCkgY29uc3QgeworICAgIHJldHVybiBoYXNGbkF0dHJpYnV0ZShBdHRyaWJ1dGU6Ok5vUmV0dXJuKTsKKyAgfQorICB2b2lkIHNldERvZXNOb3RSZXR1cm4oKSB7CisgICAgYWRkRm5BdHRyKEF0dHJpYnV0ZTo6Tm9SZXR1cm4pOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgZnVuY3Rpb24gc2hvdWxkIG5vdCBwZXJmb3JtIGluZGlyZWN0IGJyYW5jaCB0cmFja2luZy4KKyAgYm9vbCBkb2VzTm9DZkNoZWNrKCkgY29uc3QgeyByZXR1cm4gaGFzRm5BdHRyaWJ1dGUoQXR0cmlidXRlOjpOb0NmQ2hlY2spOyB9CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIGZ1bmN0aW9uIGNhbm5vdCB1bndpbmQuCisgIGJvb2wgZG9lc05vdFRocm93KCkgY29uc3QgeworICAgIHJldHVybiBoYXNGbkF0dHJpYnV0ZShBdHRyaWJ1dGU6Ok5vVW53aW5kKTsKKyAgfQorICB2b2lkIHNldERvZXNOb3RUaHJvdygpIHsKKyAgICBhZGRGbkF0dHIoQXR0cmlidXRlOjpOb1Vud2luZCk7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgY2FsbCBjYW5ub3QgYmUgZHVwbGljYXRlZC4KKyAgYm9vbCBjYW5ub3REdXBsaWNhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0ZuQXR0cmlidXRlKEF0dHJpYnV0ZTo6Tm9EdXBsaWNhdGUpOworICB9CisgIHZvaWQgc2V0Q2Fubm90RHVwbGljYXRlKCkgeworICAgIGFkZEZuQXR0cihBdHRyaWJ1dGU6Ok5vRHVwbGljYXRlKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIGlzIGNvbnZlcmdlbnQuCisgIGJvb2wgaXNDb252ZXJnZW50KCkgY29uc3QgeworICAgIHJldHVybiBoYXNGbkF0dHJpYnV0ZShBdHRyaWJ1dGU6OkNvbnZlcmdlbnQpOworICB9CisgIHZvaWQgc2V0Q29udmVyZ2VudCgpIHsKKyAgICBhZGRGbkF0dHIoQXR0cmlidXRlOjpDb252ZXJnZW50KTsKKyAgfQorICB2b2lkIHNldE5vdENvbnZlcmdlbnQoKSB7CisgICAgcmVtb3ZlRm5BdHRyKEF0dHJpYnV0ZTo6Q29udmVyZ2VudCk7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgY2FsbCBoYXMgc2lkZWVmZmVjdHMuCisgIGJvb2wgaXNTcGVjdWxhdGFibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0ZuQXR0cmlidXRlKEF0dHJpYnV0ZTo6U3BlY3VsYXRhYmxlKTsKKyAgfQorICB2b2lkIHNldFNwZWN1bGF0YWJsZSgpIHsKKyAgICBhZGRGbkF0dHIoQXR0cmlidXRlOjpTcGVjdWxhdGFibGUpOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgZnVuY3Rpb24gaXMga25vd24gbm90IHRvIHJlY3Vyc2UsIGRpcmVjdGx5IG9yCisgIC8vLyBpbmRpcmVjdGx5LgorICBib29sIGRvZXNOb3RSZWN1cnNlKCkgY29uc3QgeworICAgIHJldHVybiBoYXNGbkF0dHJpYnV0ZShBdHRyaWJ1dGU6Ok5vUmVjdXJzZSk7CisgIH0KKyAgdm9pZCBzZXREb2VzTm90UmVjdXJzZSgpIHsKKyAgICBhZGRGbkF0dHIoQXR0cmlidXRlOjpOb1JlY3Vyc2UpOworICB9CisKKyAgLy8vIEBicmllZiBUcnVlIGlmIHRoZSBBQkkgbWFuZGF0ZXMgKG9yIHRoZSB1c2VyIHJlcXVlc3RlZCkgdGhhdCB0aGlzCisgIC8vLyBmdW5jdGlvbiBiZSBpbiBhIHVud2luZCB0YWJsZS4KKyAgYm9vbCBoYXNVV1RhYmxlKCkgY29uc3QgeworICAgIHJldHVybiBoYXNGbkF0dHJpYnV0ZShBdHRyaWJ1dGU6OlVXVGFibGUpOworICB9CisgIHZvaWQgc2V0SGFzVVdUYWJsZSgpIHsKKyAgICBhZGRGbkF0dHIoQXR0cmlidXRlOjpVV1RhYmxlKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgVHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIG5lZWRzIGFuIHVud2luZCB0YWJsZS4KKyAgYm9vbCBuZWVkc1Vud2luZFRhYmxlRW50cnkoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1VXVGFibGUoKSB8fCAhZG9lc05vdFRocm93KCk7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIHN0cnVjdHVyZSB0aHJvdWdoIGZpcnN0CisgIC8vLyBvciBzZWNvbmQgcG9pbnRlciBhcmd1bWVudC4KKyAgYm9vbCBoYXNTdHJ1Y3RSZXRBdHRyKCkgY29uc3QgeworICAgIHJldHVybiBBdHRyaWJ1dGVTZXRzLmhhc1BhcmFtQXR0cmlidXRlKDAsIEF0dHJpYnV0ZTo6U3RydWN0UmV0KSB8fAorICAgICAgICAgICBBdHRyaWJ1dGVTZXRzLmhhc1BhcmFtQXR0cmlidXRlKDEsIEF0dHJpYnV0ZTo6U3RydWN0UmV0KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBwYXJhbWV0ZXIgb3IgcmV0dXJuIHZhbHVlIGlzIG1hcmtlZCB3aXRoIE5vQWxpYXMKKyAgLy8vIGF0dHJpYnV0ZS4KKyAgYm9vbCByZXR1cm5Eb2VzTm90QWxpYXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJpYnV0ZVNldHMuaGFzQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OlJldHVybkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGU6Ok5vQWxpYXMpOworICB9CisgIHZvaWQgc2V0UmV0dXJuRG9lc05vdEFsaWFzKCkgeworICAgIGFkZEF0dHJpYnV0ZShBdHRyaWJ1dGVMaXN0OjpSZXR1cm5JbmRleCwgQXR0cmlidXRlOjpOb0FsaWFzKTsKKyAgfQorCisgIC8vLyBPcHRpbWl6ZSB0aGlzIGZ1bmN0aW9uIGZvciBtaW5pbXVtIHNpemUgKC1PeikuCisgIGJvb2wgb3B0Rm9yTWluU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGhhc0ZuQXR0cmlidXRlKEF0dHJpYnV0ZTo6TWluU2l6ZSk7IH0KKworICAvLy8gT3B0aW1pemUgdGhpcyBmdW5jdGlvbiBmb3Igc2l6ZSAoLU9zKSBvciBtaW5pbXVtIHNpemUgKC1PeikuCisgIGJvb2wgb3B0Rm9yU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzRm5BdHRyaWJ1dGUoQXR0cmlidXRlOjpPcHRpbWl6ZUZvclNpemUpIHx8IG9wdEZvck1pblNpemUoKTsKKyAgfQorCisgIC8vLyBjb3B5QXR0cmlidXRlc0Zyb20gLSBjb3B5IGFsbCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgKHRob3NlIG5vdCBuZWVkZWQgdG8KKyAgLy8vIGNyZWF0ZSBhIEZ1bmN0aW9uKSBmcm9tIHRoZSBGdW5jdGlvbiBTcmMgdG8gdGhpcyBvbmUuCisgIHZvaWQgY29weUF0dHJpYnV0ZXNGcm9tKGNvbnN0IEZ1bmN0aW9uICpTcmMpOworCisgIC8vLyBkZWxldGVCb2R5IC0gVGhpcyBtZXRob2QgZGVsZXRlcyB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24sIGFuZCBjb252ZXJ0cworICAvLy8gdGhlIGxpbmthZ2UgdG8gZXh0ZXJuYWwuCisgIC8vLworICB2b2lkIGRlbGV0ZUJvZHkoKSB7CisgICAgZHJvcEFsbFJlZmVyZW5jZXMoKTsKKyAgICBzZXRMaW5rYWdlKEV4dGVybmFsTGlua2FnZSk7CisgIH0KKworICAvLy8gcmVtb3ZlRnJvbVBhcmVudCAtIFRoaXMgbWV0aG9kIHVubGlua3MgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgbW9kdWxlLAorICAvLy8gYnV0IGRvZXMgbm90IGRlbGV0ZSBpdC4KKyAgLy8vCisgIHZvaWQgcmVtb3ZlRnJvbVBhcmVudCgpOworCisgIC8vLyBlcmFzZUZyb21QYXJlbnQgLSBUaGlzIG1ldGhvZCB1bmxpbmtzICd0aGlzJyBmcm9tIHRoZSBjb250YWluaW5nIG1vZHVsZQorICAvLy8gYW5kIGRlbGV0ZXMgaXQuCisgIC8vLworICB2b2lkIGVyYXNlRnJvbVBhcmVudCgpOworCisgIC8vLyBTdGVhbCBhcmd1bWVudHMgZnJvbSBhbm90aGVyIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIERyb3AgdGhpcyBmdW5jdGlvbidzIGFyZ3VtZW50cyBhbmQgc3BsaWNlIGluIHRoZSBvbmVzIGZyb20gXGMgU3JjLgorICAvLy8gUmVxdWlyZXMgdGhhdCB0aGlzIGhhcyBubyBmdW5jdGlvbiBib2R5LgorICB2b2lkIHN0ZWFsQXJndW1lbnRMaXN0RnJvbShGdW5jdGlvbiAmU3JjKTsKKworICAvLy8gR2V0IHRoZSB1bmRlcmx5aW5nIGVsZW1lbnRzIG9mIHRoZSBGdW5jdGlvbi4uLiB0aGUgYmFzaWMgYmxvY2sgbGlzdCBpcworICAvLy8gZW1wdHkgZm9yIGV4dGVybmFsIGZ1bmN0aW9ucy4KKyAgLy8vCisgIGNvbnN0IEJhc2ljQmxvY2tMaXN0VHlwZSAmZ2V0QmFzaWNCbG9ja0xpc3QoKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2NrczsgfQorICAgICAgICBCYXNpY0Jsb2NrTGlzdFR5cGUgJmdldEJhc2ljQmxvY2tMaXN0KCkgICAgICAgeyByZXR1cm4gQmFzaWNCbG9ja3M7IH0KKworICBzdGF0aWMgQmFzaWNCbG9ja0xpc3RUeXBlIEZ1bmN0aW9uOjoqZ2V0U3VibGlzdEFjY2VzcyhCYXNpY0Jsb2NrKikgeworICAgIHJldHVybiAmRnVuY3Rpb246OkJhc2ljQmxvY2tzOworICB9CisKKyAgY29uc3QgQmFzaWNCbG9jayAgICAgICAmZ2V0RW50cnlCbG9jaygpIGNvbnN0ICAgeyByZXR1cm4gZnJvbnQoKTsgfQorICAgICAgICBCYXNpY0Jsb2NrICAgICAgICZnZXRFbnRyeUJsb2NrKCkgICAgICAgICB7IHJldHVybiBmcm9udCgpOyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFN5bWJvbCBUYWJsZSBBY2Nlc3NpbmcgZnVuY3Rpb25zLi4uCisKKyAgLy8vIGdldFN5bWJvbFRhYmxlKCkgLSBSZXR1cm4gdGhlIHN5bWJvbCB0YWJsZSBpZiBhbnksIG90aGVyd2lzZSBudWxscHRyLgorICAvLy8KKyAgaW5saW5lIFZhbHVlU3ltYm9sVGFibGUgKmdldFZhbHVlU3ltYm9sVGFibGUoKSB7IHJldHVybiBTeW1UYWIuZ2V0KCk7IH0KKyAgaW5saW5lIGNvbnN0IFZhbHVlU3ltYm9sVGFibGUgKmdldFZhbHVlU3ltYm9sVGFibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIFN5bVRhYi5nZXQoKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBCYXNpY0Jsb2NrIGl0ZXJhdG9yIGZvcndhcmRpbmcgZnVuY3Rpb25zCisgIC8vCisgIGl0ZXJhdG9yICAgICAgICAgICAgICAgIGJlZ2luKCkgICAgICAgeyByZXR1cm4gQmFzaWNCbG9ja3MuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciAgICAgICAgICBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgICAgICAgICAgICAgICAgZW5kICAoKSAgICAgICB7IHJldHVybiBCYXNpY0Jsb2Nrcy5lbmQoKTsgICB9CisgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgIGVuZCAgKCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MuZW5kKCk7ICAgfQorCisgIHNpemVfdCAgICAgICAgICAgICAgICAgICBzaXplKCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3Muc2l6ZSgpOyAgfQorICBib29sICAgICAgICAgICAgICAgICAgICBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLmVtcHR5KCk7IH0KKyAgY29uc3QgQmFzaWNCbG9jayAgICAgICAmZnJvbnQoKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrcy5mcm9udCgpOyB9CisgICAgICAgIEJhc2ljQmxvY2sgICAgICAgJmZyb250KCkgICAgICAgeyByZXR1cm4gQmFzaWNCbG9ja3MuZnJvbnQoKTsgfQorICBjb25zdCBCYXNpY0Jsb2NrICAgICAgICAmYmFjaygpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLmJhY2soKTsgIH0KKyAgICAgICAgQmFzaWNCbG9jayAgICAgICAgJmJhY2soKSAgICAgICB7IHJldHVybiBCYXNpY0Jsb2Nrcy5iYWNrKCk7ICB9CisKKy8vLyBAbmFtZSBGdW5jdGlvbiBBcmd1bWVudCBJdGVyYXRpb24KKy8vLyBAeworCisgIGFyZ19pdGVyYXRvciBhcmdfYmVnaW4oKSB7CisgICAgQ2hlY2tMYXp5QXJndW1lbnRzKCk7CisgICAgcmV0dXJuIEFyZ3VtZW50czsKKyAgfQorICBjb25zdF9hcmdfaXRlcmF0b3IgYXJnX2JlZ2luKCkgY29uc3QgeworICAgIENoZWNrTGF6eUFyZ3VtZW50cygpOworICAgIHJldHVybiBBcmd1bWVudHM7CisgIH0KKworICBhcmdfaXRlcmF0b3IgYXJnX2VuZCgpIHsKKyAgICBDaGVja0xhenlBcmd1bWVudHMoKTsKKyAgICByZXR1cm4gQXJndW1lbnRzICsgTnVtQXJnczsKKyAgfQorICBjb25zdF9hcmdfaXRlcmF0b3IgYXJnX2VuZCgpIGNvbnN0IHsKKyAgICBDaGVja0xhenlBcmd1bWVudHMoKTsKKyAgICByZXR1cm4gQXJndW1lbnRzICsgTnVtQXJnczsKKyAgfQorCisgIGl0ZXJhdG9yX3JhbmdlPGFyZ19pdGVyYXRvcj4gYXJncygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShhcmdfYmVnaW4oKSwgYXJnX2VuZCgpKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxjb25zdF9hcmdfaXRlcmF0b3I+IGFyZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoYXJnX2JlZ2luKCksIGFyZ19lbmQoKSk7CisgIH0KKworLy8vIEB9CisKKyAgc2l6ZV90IGFyZ19zaXplKCkgY29uc3QgeyByZXR1cm4gTnVtQXJnczsgfQorICBib29sIGFyZ19lbXB0eSgpIGNvbnN0IHsgcmV0dXJuIGFyZ19zaXplKCkgPT0gMDsgfQorCisgIC8vLyBcYnJpZWYgQ2hlY2sgd2hldGhlciB0aGlzIGZ1bmN0aW9uIGhhcyBhIHBlcnNvbmFsaXR5IGZ1bmN0aW9uLgorICBib29sIGhhc1BlcnNvbmFsaXR5Rm4oKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN1YmNsYXNzRGF0YUZyb21WYWx1ZSgpICYgKDE8PDMpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHBlcnNvbmFsaXR5IGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uLgorICBDb25zdGFudCAqZ2V0UGVyc29uYWxpdHlGbigpIGNvbnN0OworICB2b2lkIHNldFBlcnNvbmFsaXR5Rm4oQ29uc3RhbnQgKkZuKTsKKworICAvLy8gXGJyaWVmIENoZWNrIHdoZXRoZXIgdGhpcyBmdW5jdGlvbiBoYXMgcHJlZml4IGRhdGEuCisgIGJvb2wgaGFzUHJlZml4RGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgJiAoMTw8MSk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgcHJlZml4IGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24uCisgIENvbnN0YW50ICpnZXRQcmVmaXhEYXRhKCkgY29uc3Q7CisgIHZvaWQgc2V0UHJlZml4RGF0YShDb25zdGFudCAqUHJlZml4RGF0YSk7CisKKyAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIHRoaXMgZnVuY3Rpb24gaGFzIHByb2xvZ3VlIGRhdGEuCisgIGJvb2wgaGFzUHJvbG9ndWVEYXRhKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKSAmICgxPDwyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBwcm9sb2d1ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uLgorICBDb25zdGFudCAqZ2V0UHJvbG9ndWVEYXRhKCkgY29uc3Q7CisgIHZvaWQgc2V0UHJvbG9ndWVEYXRhKENvbnN0YW50ICpQcm9sb2d1ZURhdGEpOworCisgIC8vLyBQcmludCB0aGUgZnVuY3Rpb24gdG8gYW4gb3V0cHV0IHN0cmVhbSB3aXRoIGFuIG9wdGlvbmFsCisgIC8vLyBBc3NlbWJseUFubm90YXRpb25Xcml0ZXIuCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBBc3NlbWJseUFubm90YXRpb25Xcml0ZXIgKkFBVyA9IG51bGxwdHIsCisgICAgICAgICAgICAgYm9vbCBTaG91bGRQcmVzZXJ2ZVVzZUxpc3RPcmRlciA9IGZhbHNlLAorICAgICAgICAgICAgIGJvb2wgSXNGb3JEZWJ1ZyA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gdmlld0NGRyAtIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgZm9yIHVzZSBmcm9tIHRoZSBkZWJ1Z2dlci4gIFlvdSBjYW4ganVzdAorICAvLy8gc2F5ICdjYWxsIEYtPnZpZXdDRkcoKScgYW5kIGEgZ2hvc3R2aWV3IHdpbmRvdyBzaG91bGQgcG9wIHVwIGZyb20gdGhlCisgIC8vLyBwcm9ncmFtLCBkaXNwbGF5aW5nIHRoZSBDRkcgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24gd2l0aCB0aGUgY29kZSBmb3IgZWFjaAorICAvLy8gYmFzaWMgYmxvY2sgaW5zaWRlLiAgVGhpcyBkZXBlbmRzIG9uIHRoZXJlIGJlaW5nIGEgJ2RvdCcgYW5kICdndicgcHJvZ3JhbQorICAvLy8gaW4geW91ciBwYXRoLgorICAvLy8KKyAgdm9pZCB2aWV3Q0ZHKCkgY29uc3Q7CisKKyAgLy8vIHZpZXdDRkdPbmx5IC0gVGhpcyBmdW5jdGlvbiBpcyBtZWFudCBmb3IgdXNlIGZyb20gdGhlIGRlYnVnZ2VyLiAgSXQgd29ya3MKKyAgLy8vIGp1c3QgbGlrZSB2aWV3Q0ZHLCBidXQgaXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgY29udGVudHMgb2YgYmFzaWMgYmxvY2tzCisgIC8vLyBpbnRvIHRoZSBub2RlcywganVzdCB0aGUgbGFiZWwuICBJZiB5b3UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgQ0ZHCisgIC8vLyB0aGlzIGNhbiBtYWtlIHRoZSBncmFwaCBzbWFsbGVyLgorICAvLy8KKyAgdm9pZCB2aWV3Q0ZHT25seSgpIGNvbnN0OworCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6RnVuY3Rpb25WYWw7CisgIH0KKworICAvLy8gZHJvcEFsbFJlZmVyZW5jZXMoKSAtIFRoaXMgbWV0aG9kIGNhdXNlcyBhbGwgdGhlIHN1Ymluc3RydWN0aW9ucyB0byAibGV0CisgIC8vLyBnbyIgb2YgYWxsIHJlZmVyZW5jZXMgdGhhdCB0aGV5IGFyZSBtYWludGFpbmluZy4gIFRoaXMgYWxsb3dzIG9uZSB0bworICAvLy8gJ2RlbGV0ZScgYSB3aG9sZSBtb2R1bGUgYXQgYSB0aW1lLCBldmVuIHRob3VnaCB0aGVyZSBtYXkgYmUgY2lyY3VsYXIKKyAgLy8vIHJlZmVyZW5jZXMuLi4gZmlyc3QgYWxsIHJlZmVyZW5jZXMgYXJlIGRyb3BwZWQsIGFuZCBhbGwgdXNlIGNvdW50cyBnbyB0bworICAvLy8gemVyby4gIFRoZW4gZXZlcnl0aGluZyBpcyBkZWxldGVkIGZvciByZWFsLiAgTm90ZSB0aGF0IG5vIG9wZXJhdGlvbnMgYXJlCisgIC8vLyB2YWxpZCBvbiBhbiBvYmplY3QgdGhhdCBoYXMgImRyb3BwZWQgYWxsIHJlZmVyZW5jZXMiLCBleGNlcHQgb3BlcmF0b3IKKyAgLy8vIGRlbGV0ZS4KKyAgLy8vCisgIC8vLyBTaW5jZSBubyBvdGhlciBvYmplY3QgaW4gdGhlIG1vZHVsZSBjYW4gaGF2ZSByZWZlcmVuY2VzIGludG8gdGhlIGJvZHkgb2YgYQorICAvLy8gZnVuY3Rpb24sIGRyb3BwaW5nIGFsbCByZWZlcmVuY2VzIGRlbGV0ZXMgdGhlIGVudGlyZSBib2R5IG9mIHRoZSBmdW5jdGlvbiwKKyAgLy8vIGluY2x1ZGluZyBhbnkgY29udGFpbmVkIGJhc2ljIGJsb2Nrcy4KKyAgLy8vCisgIHZvaWQgZHJvcEFsbFJlZmVyZW5jZXMoKTsKKworICAvLy8gaGFzQWRkcmVzc1Rha2VuIC0gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgdXNlcyBvZiB0aGlzIGZ1bmN0aW9uCisgIC8vLyBvdGhlciB0aGFuIGRpcmVjdCBjYWxscyBvciBpbnZva2VzIHRvIGl0LCBvciBibG9ja2FkZHJlc3MgZXhwcmVzc2lvbnMuCisgIC8vLyBPcHRpb25hbGx5IHBhc3NlcyBiYWNrIGFuIG9mZmVuZGluZyB1c2VyIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzLgorICAvLy8KKyAgYm9vbCBoYXNBZGRyZXNzVGFrZW4oY29uc3QgVXNlcioqID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIGlzRGVmVHJpdmlhbGx5RGVhZCAtIFJldHVybiB0cnVlIGlmIGl0IGlzIHRyaXZpYWxseSBzYWZlIHRvIHJlbW92ZQorICAvLy8gdGhpcyBmdW5jdGlvbiBkZWZpbml0aW9uIGZyb20gdGhlIG1vZHVsZSAoYmVjYXVzZSBpdCBpc24ndCBleHRlcm5hbGx5CisgIC8vLyB2aXNpYmxlLCBkb2VzIG5vdCBoYXZlIGl0cyBhZGRyZXNzIHRha2VuLCBhbmQgaGFzIG5vIGNhbGxlcnMpLiAgVG8gbWFrZQorICAvLy8gdGhpcyBtb3JlIGFjY3VyYXRlLCBjYWxsIHJlbW92ZURlYWRDb25zdGFudFVzZXJzIGZpcnN0LgorICBib29sIGlzRGVmVHJpdmlhbGx5RGVhZCgpIGNvbnN0OworCisgIC8vLyBjYWxsc0Z1bmN0aW9uVGhhdFJldHVybnNUd2ljZSAtIFJldHVybiB0cnVlIGlmIHRoZSBmdW5jdGlvbiBoYXMgYSBjYWxsIHRvCisgIC8vLyBzZXRqbXAgb3Igb3RoZXIgZnVuY3Rpb24gdGhhdCBnY2MgcmVjb2duaXplcyBhcyAicmV0dXJuaW5nIHR3aWNlIi4KKyAgYm9vbCBjYWxsc0Z1bmN0aW9uVGhhdFJldHVybnNUd2ljZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBhdHRhY2hlZCBzdWJwcm9ncmFtLgorICAvLy8KKyAgLy8vIENhbGxzIFxhIHNldE1ldGFkYXRhKCkgd2l0aCBcYSBMTFZNQ29udGV4dDo6TURfZGJnLgorICB2b2lkIHNldFN1YnByb2dyYW0oRElTdWJwcm9ncmFtICpTUCk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGF0dGFjaGVkIHN1YnByb2dyYW0uCisgIC8vLworICAvLy8gQ2FsbHMgXGEgZ2V0TWV0YWRhdGEoKSB3aXRoIFxhIExMVk1Db250ZXh0OjpNRF9kYmcgYW5kIGNhc3RzIHRoZSByZXN1bHQKKyAgLy8vIHRvIFxhIERJU3VicHJvZ3JhbS4KKyAgRElTdWJwcm9ncmFtICpnZXRTdWJwcm9ncmFtKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB3ZSBzaG91bGQgZW1pdCBkZWJ1ZyBpbmZvIGZvciBwcm9maWxpbmcuCisgIGJvb2wgaXNEZWJ1Z0luZm9Gb3JQcm9maWxpbmcoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgdm9pZCBhbGxvY0h1bmdvZmZVc2VsaXN0KCk7CisgIHRlbXBsYXRlPGludCBJZHg+IHZvaWQgc2V0SHVuZ29mZk9wZXJhbmQoQ29uc3RhbnQgKkMpOworCisgIC8vLyBTaGFkb3cgVmFsdWU6OnNldFZhbHVlU3ViY2xhc3NEYXRhIHdpdGggYSBwcml2YXRlIGZvcndhcmRpbmcgbWV0aG9kIHNvCisgIC8vLyB0aGF0IHN1YmNsYXNzZXMgY2Fubm90IGFjY2lkZW50YWxseSB1c2UgaXQuCisgIHZvaWQgc2V0VmFsdWVTdWJjbGFzc0RhdGEodW5zaWduZWQgc2hvcnQgRCkgeworICAgIFZhbHVlOjpzZXRWYWx1ZVN1YmNsYXNzRGF0YShEKTsKKyAgfQorICB2b2lkIHNldFZhbHVlU3ViY2xhc3NEYXRhQml0KHVuc2lnbmVkIEJpdCwgYm9vbCBPbik7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8RnVuY3Rpb24+IDogcHVibGljIEh1bmdvZmZPcGVyYW5kVHJhaXRzPDM+IHt9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoRnVuY3Rpb24sIFZhbHVlKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9GVU5DVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0dWTWF0ZXJpYWxpemVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0dWTWF0ZXJpYWxpemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1YWJlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvR1ZNYXRlcmlhbGl6ZXIuaApAQCAtMCwwICsxLDUyIEBACisvLz09PS0gR1ZNYXRlcmlhbGl6ZXIuaCAtIEludGVyZmFjZSBmb3IgR1YgbWF0ZXJpYWxpemVycyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyBhbiBhYnN0cmFjdCBpbnRlcmZhY2UgZm9yIGxvYWRpbmcgYSBtb2R1bGUgZnJvbSBzb21lCisvLyBwbGFjZS4gIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBpbmNyZW1lbnRhbCBvciByYW5kb20gYWNjZXNzIGxvYWRpbmcgb2YKKy8vIGZ1bmN0aW9ucyBmcm9tIHRoZSBmaWxlLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGFwcGxpY2F0aW9ucyBsaWtlIEpJVCBjb21waWxlcnMKKy8vIG9yIGludGVycHJvY2VkdXJhbCBvcHRpbWl6ZXJzIHRoYXQgZG8gbm90IG5lZWQgdGhlIGVudGlyZSBwcm9ncmFtIGluIG1lbW9yeQorLy8gYXQgdGhlIHNhbWUgdGltZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfR1ZNQVRFUklBTElaRVJfSAorI2RlZmluZSBMTFZNX0lSX0dWTUFURVJJQUxJWkVSX0gKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBFcnJvcjsKK2NsYXNzIEdsb2JhbFZhbHVlOworY2xhc3MgU3RydWN0VHlwZTsKKworY2xhc3MgR1ZNYXRlcmlhbGl6ZXIgeworcHJvdGVjdGVkOgorICBHVk1hdGVyaWFsaXplcigpID0gZGVmYXVsdDsKKworcHVibGljOgorICB2aXJ0dWFsIH5HVk1hdGVyaWFsaXplcigpOworCisgIC8vLyBNYWtlIHN1cmUgdGhlIGdpdmVuIEdsb2JhbFZhbHVlIGlzIGZ1bGx5IHJlYWQuCisgIC8vLworICB2aXJ0dWFsIEVycm9yIG1hdGVyaWFsaXplKEdsb2JhbFZhbHVlICpHVikgPSAwOworCisgIC8vLyBNYWtlIHN1cmUgdGhlIGVudGlyZSBNb2R1bGUgaGFzIGJlZW4gY29tcGxldGVseSByZWFkLgorICAvLy8KKyAgdmlydHVhbCBFcnJvciBtYXRlcmlhbGl6ZU1vZHVsZSgpID0gMDsKKworICB2aXJ0dWFsIEVycm9yIG1hdGVyaWFsaXplTWV0YWRhdGEoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBzZXRTdHJpcERlYnVnSW5mbygpID0gMDsKKworICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPFN0cnVjdFR5cGUgKj4gZ2V0SWRlbnRpZmllZFN0cnVjdFR5cGVzKCkgY29uc3QgPSAwOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfR1ZNQVRFUklBTElaRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9HZXRFbGVtZW50UHRyVHlwZUl0ZXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0dldEVsZW1lbnRQdHJUeXBlSXRlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzE0M2VhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9HZXRFbGVtZW50UHRyVHlwZUl0ZXJhdG9yLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8vPT09LSBHZXRFbGVtZW50UHRyVHlwZUl0ZXJhdG9yLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYW4gaXRlcmF0b3IgZm9yIHdhbGtpbmcgdGhyb3VnaCB0aGUgdHlwZXMgaW5kZXhlZCBieQorLy8gZ2V0ZWxlbWVudHB0ciBpbnN0cnVjdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0dFVEVMRU1FTlRQVFJUWVBFSVRFUkFUT1JfSAorI2RlZmluZSBMTFZNX0lSX0dFVEVMRU1FTlRQVFJUWVBFSVRFUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvT3BlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1VzZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSXRUeSA9IFVzZXI6OmNvbnN0X29wX2l0ZXJhdG9yPgorICBjbGFzcyBnZW5lcmljX2dlcF90eXBlX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBUeXBlICosIHB0cmRpZmZfdD4geworICAgIHVzaW5nIHN1cGVyID0gc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBUeXBlICosIHB0cmRpZmZfdD47CisKKyAgICBJdFR5IE9wSXQ7CisgICAgUG9pbnRlclVuaW9uPFN0cnVjdFR5cGUgKiwgVHlwZSAqPiBDdXJUeTsKKyAgICBlbnVtIDogdWludDY0X3QgeyBVbmJvdW5kZWQgPSAtMXVsbCB9OworICAgIHVpbnQ2NF90IE51bUVsZW1lbnRzID0gVW5ib3VuZGVkOworCisgICAgZ2VuZXJpY19nZXBfdHlwZV9pdGVyYXRvcigpID0gZGVmYXVsdDsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3IgYmVnaW4oVHlwZSAqVHksIEl0VHkgSXQpIHsKKyAgICAgIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3IgSTsKKyAgICAgIEkuQ3VyVHkgPSBUeTsKKyAgICAgIEkuT3BJdCA9IEl0OworICAgICAgcmV0dXJuIEk7CisgICAgfQorCisgICAgc3RhdGljIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3IgZW5kKEl0VHkgSXQpIHsKKyAgICAgIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3IgSTsKKyAgICAgIEkuT3BJdCA9IEl0OworICAgICAgcmV0dXJuIEk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3ImIHgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBPcEl0ID09IHguT3BJdDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgZ2VuZXJpY19nZXBfdHlwZV9pdGVyYXRvciYgeCkgY29uc3QgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KHgpOworICAgIH0KKworICAgIC8vIEZJWE1FOiBNYWtlIHRoaXMgdGhlIGl0ZXJhdG9yJ3Mgb3BlcmF0b3IqKCkgYWZ0ZXIgdGhlIDQuMCByZWxlYXNlLgorICAgIC8vIG9wZXJhdG9yKigpIGhhZCBhIGRpZmZlcmVudCBtZWFuaW5nIGluIGVhcmxpZXIgcmVsZWFzZXMsIHNvIHdlJ3JlCisgICAgLy8gdGVtcG9yYXJpbHkgbm90IGdpdmluZyB0aGlzIGl0ZXJhdG9yIGFuIG9wZXJhdG9yKigpIHRvIGF2b2lkIGEgc3VidGxlCisgICAgLy8gc2VtYW50aWNzIGJyZWFrLgorICAgIFR5cGUgKmdldEluZGV4ZWRUeXBlKCkgY29uc3QgeworICAgICAgaWYgKGF1dG8gKlQgPSBDdXJUeS5keW5fY2FzdDxUeXBlICo+KCkpCisgICAgICAgIHJldHVybiBUOworICAgICAgcmV0dXJuIEN1clR5LmdldDxTdHJ1Y3RUeXBlICo+KCktPmdldFR5cGVBdEluZGV4KGdldE9wZXJhbmQoKSk7CisgICAgfQorCisgICAgVmFsdWUgKmdldE9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PFZhbHVlICo+KCYqKk9wSXQpOyB9CisKKyAgICBnZW5lcmljX2dlcF90eXBlX2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyAgIC8vIFByZWluY3JlbWVudAorICAgICAgVHlwZSAqVHkgPSBnZXRJbmRleGVkVHlwZSgpOworICAgICAgaWYgKGF1dG8gKlNUeSA9IGR5bl9jYXN0PFNlcXVlbnRpYWxUeXBlPihUeSkpIHsKKyAgICAgICAgQ3VyVHkgPSBTVHktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgICAgIE51bUVsZW1lbnRzID0gU1R5LT5nZXROdW1FbGVtZW50cygpOworICAgICAgfSBlbHNlCisgICAgICAgIEN1clR5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oVHkpOworICAgICAgKytPcEl0OworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgLy8gUG9zdGluY3JlbWVudAorICAgICAgZ2VuZXJpY19nZXBfdHlwZV9pdGVyYXRvciB0bXAgPSAqdGhpczsgKysqdGhpczsgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICAvLyBBbGwgb2YgdGhlIGJlbG93IEFQSSBpcyBmb3IgcXVlcnlpbmcgcHJvcGVydGllcyBvZiB0aGUgIm91dGVyIHR5cGUiLCBpLmUuCisgICAgLy8gdGhlIHR5cGUgdGhhdCBjb250YWlucyB0aGUgaW5kZXhlZCB0eXBlLiBNb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMganVzdAorICAgIC8vIHRoZSB0eXBlIHRoYXQgd2FzIHZpc2l0ZWQgaW1tZWRpYXRlbHkgcHJpb3IgdG8gdGhlIGluZGV4ZWQgdHlwZSwgYnV0IGZvcgorICAgIC8vIHRoZSBmaXJzdCBlbGVtZW50IHRoaXMgaXMgYW4gdW5ib3VuZGVkIGFycmF5IG9mIHRoZSBHRVAncyBzb3VyY2UgZWxlbWVudAorICAgIC8vIHR5cGUsIGZvciB3aGljaCB0aGVyZSBpcyBubyBjbGVhcmx5IGNvcnJlc3BvbmRpbmcgSVIgdHlwZSAod2UndmUKKyAgICAvLyBoaXN0b3JpY2FsbHkgdXNlZCBhIHBvaW50ZXIgdHlwZSBhcyB0aGUgb3V0ZXIgdHlwZSBpbiB0aGlzIGNhc2UsIGJ1dAorICAgIC8vIHBvaW50ZXJzIHdpbGwgc29vbiBsb3NlIHRoZWlyIGVsZW1lbnQgdHlwZSkuCisgICAgLy8KKyAgICAvLyBGSVhNRTogTW9zdCBjdXJyZW50IHVzZXJzIG9mIHRoaXMgY2xhc3MgYXJlIGp1c3QgaW50ZXJlc3RlZCBpbiBieXRlCisgICAgLy8gb2Zmc2V0cyAoYSBmZXcgbmVlZCB0byBrbm93IHdoZXRoZXIgdGhlIG91dGVyIHR5cGUgaXMgYSBzdHJ1Y3QgYmVjYXVzZQorICAgIC8vIHRoZXkgYXJlIHRyeWluZyB0byByZXBsYWNlIGEgY29uc3RhbnQgd2l0aCBhIHZhcmlhYmxlLCB3aGljaCBpcyBvbmx5CisgICAgLy8gbGVnYWwgZm9yIGFycmF5cywgZS5nLiBjYW5SZXBsYWNlT3BlcmFuZFdpdGhWYXJpYWJsZSBpbiBTaW1wbGlmeUNGRy5jcHApOworICAgIC8vIHdlIHNob3VsZCBwcm92aWRlIGEgbW9yZSBtaW5pbWFsIEFQSSBoZXJlIHRoYXQgZXhwb3NlcyBub3QgbXVjaCBtb3JlIHRoYW4KKyAgICAvLyB0aGF0LgorCisgICAgYm9vbCBpc1N0cnVjdCgpIGNvbnN0IHsgcmV0dXJuIEN1clR5LmlzPFN0cnVjdFR5cGUgKj4oKTsgfQorICAgIGJvb2wgaXNTZXF1ZW50aWFsKCkgY29uc3QgeyByZXR1cm4gQ3VyVHkuaXM8VHlwZSAqPigpOyB9CisKKyAgICBTdHJ1Y3RUeXBlICpnZXRTdHJ1Y3RUeXBlKCkgY29uc3QgeyByZXR1cm4gQ3VyVHkuZ2V0PFN0cnVjdFR5cGUgKj4oKTsgfQorCisgICAgU3RydWN0VHlwZSAqZ2V0U3RydWN0VHlwZU9yTnVsbCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBDdXJUeS5keW5fY2FzdDxTdHJ1Y3RUeXBlICo+KCk7CisgICAgfQorCisgICAgYm9vbCBpc0JvdW5kZWRTZXF1ZW50aWFsKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzU2VxdWVudGlhbCgpICYmIE51bUVsZW1lbnRzICE9IFVuYm91bmRlZDsKKyAgICB9CisKKyAgICB1aW50NjRfdCBnZXRTZXF1ZW50aWFsTnVtRWxlbWVudHMoKSBjb25zdCB7CisgICAgICBhc3NlcnQoaXNCb3VuZGVkU2VxdWVudGlhbCgpKTsKKyAgICAgIHJldHVybiBOdW1FbGVtZW50czsKKyAgICB9CisgIH07CisKKyAgdXNpbmcgZ2VwX3R5cGVfaXRlcmF0b3IgPSBnZW5lcmljX2dlcF90eXBlX2l0ZXJhdG9yPD47CisKKyAgaW5saW5lIGdlcF90eXBlX2l0ZXJhdG9yIGdlcF90eXBlX2JlZ2luKGNvbnN0IFVzZXIgKkdFUCkgeworICAgIGF1dG8gKkdFUE9wID0gY2FzdDxHRVBPcGVyYXRvcj4oR0VQKTsKKyAgICByZXR1cm4gZ2VwX3R5cGVfaXRlcmF0b3I6OmJlZ2luKAorICAgICAgICBHRVBPcC0+Z2V0U291cmNlRWxlbWVudFR5cGUoKSwKKyAgICAgICAgR0VQLT5vcF9iZWdpbigpICsgMSk7CisgIH0KKworICBpbmxpbmUgZ2VwX3R5cGVfaXRlcmF0b3IgZ2VwX3R5cGVfZW5kKGNvbnN0IFVzZXIgKkdFUCkgeworICAgIHJldHVybiBnZXBfdHlwZV9pdGVyYXRvcjo6ZW5kKEdFUC0+b3BfZW5kKCkpOworICB9CisKKyAgaW5saW5lIGdlcF90eXBlX2l0ZXJhdG9yIGdlcF90eXBlX2JlZ2luKGNvbnN0IFVzZXIgJkdFUCkgeworICAgIGF1dG8gJkdFUE9wID0gY2FzdDxHRVBPcGVyYXRvcj4oR0VQKTsKKyAgICByZXR1cm4gZ2VwX3R5cGVfaXRlcmF0b3I6OmJlZ2luKAorICAgICAgICBHRVBPcC5nZXRTb3VyY2VFbGVtZW50VHlwZSgpLAorICAgICAgICBHRVAub3BfYmVnaW4oKSArIDEpOworICB9CisKKyAgaW5saW5lIGdlcF90eXBlX2l0ZXJhdG9yIGdlcF90eXBlX2VuZChjb25zdCBVc2VyICZHRVApIHsKKyAgICByZXR1cm4gZ2VwX3R5cGVfaXRlcmF0b3I6OmVuZChHRVAub3BfZW5kKCkpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgaW5saW5lIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3I8Y29uc3QgVCAqPgorICBnZXBfdHlwZV9iZWdpbihUeXBlICpPcDAsIEFycmF5UmVmPFQ+IEEpIHsKKyAgICByZXR1cm4gZ2VuZXJpY19nZXBfdHlwZV9pdGVyYXRvcjxjb25zdCBUICo+OjpiZWdpbihPcDAsIEEuYmVnaW4oKSk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBpbmxpbmUgZ2VuZXJpY19nZXBfdHlwZV9pdGVyYXRvcjxjb25zdCBUICo+CisgIGdlcF90eXBlX2VuZChUeXBlICogLypPcDAqLywgQXJyYXlSZWY8VD4gQSkgeworICAgIHJldHVybiBnZW5lcmljX2dlcF90eXBlX2l0ZXJhdG9yPGNvbnN0IFQgKj46OmVuZChBLmVuZCgpKTsKKyAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9HRVRFTEVNRU5UUFRSVFlQRUlURVJBVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvR2xvYmFsQWxpYXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvR2xvYmFsQWxpYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTA1ODNiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9HbG9iYWxBbGlhcy5oCkBAIC0wLDAgKzEsOTggQEAKKy8vPT09LS0tLS0tLS0gbGx2bS9HbG9iYWxBbGlhcy5oIC0gR2xvYmFsQWxpYXMgY2xhc3MgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgR2xvYmFsQWxpYXMgY2xhc3MsIHdoaWNoCisvLyByZXByZXNlbnRzIGEgc2luZ2xlIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIGFsaWFzIGluIHRoZSBJUi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfR0xPQkFMQUxJQVNfSAorI2RlZmluZSBMTFZNX0lSX0dMT0JBTEFMSUFTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbEluZGlyZWN0U3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFR3aW5lOworY2xhc3MgTW9kdWxlOwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlU3ViQ2xhc3M+IGNsYXNzIFN5bWJvbFRhYmxlTGlzdFRyYWl0czsKKworY2xhc3MgR2xvYmFsQWxpYXMgOiBwdWJsaWMgR2xvYmFsSW5kaXJlY3RTeW1ib2wsCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbGlzdF9ub2RlPEdsb2JhbEFsaWFzPiB7CisgIGZyaWVuZCBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8R2xvYmFsQWxpYXM+OworCisgIEdsb2JhbEFsaWFzKFR5cGUgKlR5LCB1bnNpZ25lZCBBZGRyZXNzU3BhY2UsIExpbmthZ2VUeXBlcyBMaW5rYWdlLAorICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSwgQ29uc3RhbnQgKkFsaWFzZWUsIE1vZHVsZSAqUGFyZW50KTsKKworcHVibGljOgorICBHbG9iYWxBbGlhcyhjb25zdCBHbG9iYWxBbGlhcyAmKSA9IGRlbGV0ZTsKKyAgR2xvYmFsQWxpYXMgJm9wZXJhdG9yPShjb25zdCBHbG9iYWxBbGlhcyAmKSA9IGRlbGV0ZTsKKworICAvLy8gSWYgYSBwYXJlbnQgbW9kdWxlIGlzIHNwZWNpZmllZCwgdGhlIGFsaWFzIGlzIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgaW50bworICAvLy8gdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIG1vZHVsZSdzIGFsaWFzIGxpc3QuCisgIHN0YXRpYyBHbG9iYWxBbGlhcyAqY3JlYXRlKFR5cGUgKlR5LCB1bnNpZ25lZCBBZGRyZXNzU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmthZ2VUeXBlcyBMaW5rYWdlLCBjb25zdCBUd2luZSAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKkFsaWFzZWUsIE1vZHVsZSAqUGFyZW50KTsKKworICAvLyBXaXRob3V0IHRoZSBBbGlhc2VlLgorICBzdGF0aWMgR2xvYmFsQWxpYXMgKmNyZWF0ZShUeXBlICpUeSwgdW5zaWduZWQgQWRkcmVzc1NwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rYWdlVHlwZXMgTGlua2FnZSwgY29uc3QgVHdpbmUgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqUGFyZW50KTsKKworICAvLyBUaGUgbW9kdWxlIGlzIHRha2VuIGZyb20gdGhlIEFsaWFzZWUuCisgIHN0YXRpYyBHbG9iYWxBbGlhcyAqY3JlYXRlKFR5cGUgKlR5LCB1bnNpZ25lZCBBZGRyZXNzU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmthZ2VUeXBlcyBMaW5rYWdlLCBjb25zdCBUd2luZSAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWUgKkFsaWFzZWUpOworCisgIC8vIFR5cGUsIFBhcmVudCBhbmQgQWRkcmVzc1NwYWNlIHRha2VuIGZyb20gdGhlIEFsaWFzZWUuCisgIHN0YXRpYyBHbG9iYWxBbGlhcyAqY3JlYXRlKExpbmthZ2VUeXBlcyBMaW5rYWdlLCBjb25zdCBUd2luZSAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWUgKkFsaWFzZWUpOworCisgIC8vIExpbmthZ2UsIFR5cGUsIFBhcmVudCBhbmQgQWRkcmVzc1NwYWNlIHRha2VuIGZyb20gdGhlIEFsaWFzZWUuCisgIHN0YXRpYyBHbG9iYWxBbGlhcyAqY3JlYXRlKGNvbnN0IFR3aW5lICZOYW1lLCBHbG9iYWxWYWx1ZSAqQWxpYXNlZSk7CisKKyAgdm9pZCBjb3B5QXR0cmlidXRlc0Zyb20oY29uc3QgR2xvYmFsVmFsdWUgKlNyYykgeworICAgIEdsb2JhbFZhbHVlOjpjb3B5QXR0cmlidXRlc0Zyb20oU3JjKTsKKyAgfQorCisgIC8vLyByZW1vdmVGcm9tUGFyZW50IC0gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBtb2R1bGUsCisgIC8vLyBidXQgZG9lcyBub3QgZGVsZXRlIGl0LgorICAvLy8KKyAgdm9pZCByZW1vdmVGcm9tUGFyZW50KCk7CisKKyAgLy8vIGVyYXNlRnJvbVBhcmVudCAtIFRoaXMgbWV0aG9kIHVubGlua3MgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgbW9kdWxlCisgIC8vLyBhbmQgZGVsZXRlcyBpdC4KKyAgLy8vCisgIHZvaWQgZXJhc2VGcm9tUGFyZW50KCk7CisKKyAgLy8vIFRoZXNlIG1ldGhvZHMgcmV0cmlldmUgYW5kIHNldCBhbGlhcyB0YXJnZXQuCisgIHZvaWQgc2V0QWxpYXNlZShDb25zdGFudCAqQWxpYXNlZSk7CisgIGNvbnN0IENvbnN0YW50ICpnZXRBbGlhc2VlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRJbmRpcmVjdFN5bWJvbCgpOworICB9CisgIENvbnN0YW50ICpnZXRBbGlhc2VlKCkgeworICAgIHJldHVybiBnZXRJbmRpcmVjdFN5bWJvbCgpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNWYWxpZExpbmthZ2UoTGlua2FnZVR5cGVzIEwpIHsKKyAgICByZXR1cm4gaXNFeHRlcm5hbExpbmthZ2UoTCkgfHwgaXNMb2NhbExpbmthZ2UoTCkgfHwKKyAgICAgIGlzV2Vha0xpbmthZ2UoTCkgfHwgaXNMaW5rT25jZUxpbmthZ2UoTCk7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6R2xvYmFsQWxpYXNWYWw7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0dMT0JBTEFMSUFTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvR2xvYmFsSUZ1bmMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvR2xvYmFsSUZ1bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjUxMzE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9HbG9iYWxJRnVuYy5oCkBAIC0wLDAgKzEsODAgQEAKKy8vPT09LS0tLS0tLS0gbGx2bS9HbG9iYWxJRnVuYy5oIC0gR2xvYmFsSUZ1bmMgY2xhc3MgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcYnJpZWYKKy8vLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBHbG9iYWxJRnVuYyBjbGFzcywgd2hpY2gKKy8vLyByZXByZXNlbnRzIGEgc2luZ2xlIGluZGlyZWN0IGZ1bmN0aW9uIGluIHRoZSBJUi4gSW5kaXJlY3QgZnVuY3Rpb24gdXNlcworLy8vIEVMRiBzeW1ib2wgdHlwZSBleHRlbnNpb24gdG8gbWFyayB0aGF0IHRoZSBhZGRyZXNzIG9mIGEgZGVjbGFyYXRpb24gc2hvdWxkCisvLy8gYmUgcmVzb2x2ZWQgYXQgcnVudGltZSBieSBjYWxsaW5nIGEgcmVzb2x2ZXIgZnVuY3Rpb24uCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9HTE9CQUxJRlVOQ19ICisjZGVmaW5lIExMVk1fSVJfR0xPQkFMSUZVTkNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsSW5kaXJlY3RTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVHdpbmU7CitjbGFzcyBNb2R1bGU7CisKKy8vIFRyYWl0cyBjbGFzcyBmb3IgdXNpbmcgR2xvYmFsSUZ1bmMgaW4gc3ltYm9sIHRhYmxlIGluIE1vZHVsZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVN1YkNsYXNzPiBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM7CisKK2NsYXNzIEdsb2JhbElGdW5jIGZpbmFsIDogcHVibGljIEdsb2JhbEluZGlyZWN0U3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaWxpc3Rfbm9kZTxHbG9iYWxJRnVuYz4geworICBmcmllbmQgY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzPEdsb2JhbElGdW5jPjsKKworICBHbG9iYWxJRnVuYyhUeXBlICpUeSwgdW5zaWduZWQgQWRkcmVzc1NwYWNlLCBMaW5rYWdlVHlwZXMgTGlua2FnZSwKKyAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUsIENvbnN0YW50ICpSZXNvbHZlciwgTW9kdWxlICpQYXJlbnQpOworCitwdWJsaWM6CisgIEdsb2JhbElGdW5jKGNvbnN0IEdsb2JhbElGdW5jICYpID0gZGVsZXRlOworICBHbG9iYWxJRnVuYyAmb3BlcmF0b3I9KGNvbnN0IEdsb2JhbElGdW5jICYpID0gZGVsZXRlOworCisgIC8vLyBJZiBhIHBhcmVudCBtb2R1bGUgaXMgc3BlY2lmaWVkLCB0aGUgaWZ1bmMgaXMgYXV0b21hdGljYWxseSBpbnNlcnRlZCBpbnRvCisgIC8vLyB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgbW9kdWxlJ3MgaWZ1bmMgbGlzdC4KKyAgc3RhdGljIEdsb2JhbElGdW5jICpjcmVhdGUoVHlwZSAqVHksIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua2FnZVR5cGVzIExpbmthZ2UsIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqUmVzb2x2ZXIsIE1vZHVsZSAqUGFyZW50KTsKKworICB2b2lkIGNvcHlBdHRyaWJ1dGVzRnJvbShjb25zdCBHbG9iYWxJRnVuYyAqU3JjKSB7CisgICAgR2xvYmFsVmFsdWU6OmNvcHlBdHRyaWJ1dGVzRnJvbShTcmMpOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIHVubGlua3MgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgbW9kdWxlLCBidXQgZG9lcyBub3QKKyAgLy8vIGRlbGV0ZSBpdC4KKyAgdm9pZCByZW1vdmVGcm9tUGFyZW50KCk7CisKKyAgLy8vIFRoaXMgbWV0aG9kIHVubGlua3MgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgbW9kdWxlIGFuZCBkZWxldGVzIGl0LgorICB2b2lkIGVyYXNlRnJvbVBhcmVudCgpOworCisgIC8vLyBUaGVzZSBtZXRob2RzIHJldHJpZXZlIGFuZCBzZXQgaWZ1bmMgcmVzb2x2ZXIgZnVuY3Rpb24uCisgIHZvaWQgc2V0UmVzb2x2ZXIoQ29uc3RhbnQgKlJlc29sdmVyKSB7CisgICAgc2V0SW5kaXJlY3RTeW1ib2woUmVzb2x2ZXIpOworICB9CisgIGNvbnN0IENvbnN0YW50ICpnZXRSZXNvbHZlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW5kaXJlY3RTeW1ib2woKTsKKyAgfQorICBDb25zdGFudCAqZ2V0UmVzb2x2ZXIoKSB7CisgICAgcmV0dXJuIGdldEluZGlyZWN0U3ltYm9sKCk7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6R2xvYmFsSUZ1bmNWYWw7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0dMT0JBTElGVU5DX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvR2xvYmFsSW5kaXJlY3RTeW1ib2wuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvR2xvYmFsSW5kaXJlY3RTeW1ib2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmMwMDY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9HbG9iYWxJbmRpcmVjdFN5bWJvbC5oCkBAIC0wLDAgKzEsOTMgQEAKKy8vPT09LSBsbHZtL0dsb2JhbEluZGlyZWN0U3ltYm9sLmggLSBHbG9iYWxJbmRpcmVjdFN5bWJvbCBjbGFzcyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgR2xvYmFsSW5kaXJlY3RTeW1ib2wgY2xhc3MsIHdoaWNoCisvLyBpcyBhIGJhc2UgY2xhc3MgZm9yIEdsb2JhbEFsaWFzIGFuZCBHbG9iYWxJRnVuYy4gSXQgY29udGFpbnMgYWxsIGNvbW1vbiBjb2RlCisvLyBmb3IgYWxpYXNlcyBhbmQgaWZ1bmNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9HTE9CQUxJTkRJUkVDVFNZTUJPTF9ICisjZGVmaW5lIExMVk1fSVJfR0xPQkFMSU5ESVJFQ1RTWU1CT0xfSAorCisjaW5jbHVkZSAibGx2bS9JUi9HbG9iYWxPYmplY3QuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9PcGVyYW5kVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Vc2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBHbG9iYWxJbmRpcmVjdFN5bWJvbCA6IHB1YmxpYyBHbG9iYWxWYWx1ZSB7Citwcm90ZWN0ZWQ6CisgIEdsb2JhbEluZGlyZWN0U3ltYm9sKFR5cGUgKlR5LCBWYWx1ZVR5IFZUeSwgdW5zaWduZWQgQWRkcmVzc1NwYWNlLAorICAgICAgTGlua2FnZVR5cGVzIExpbmthZ2UsIGNvbnN0IFR3aW5lICZOYW1lLCBDb25zdGFudCAqU3ltYm9sKTsKKworcHVibGljOgorICBHbG9iYWxJbmRpcmVjdFN5bWJvbChjb25zdCBHbG9iYWxJbmRpcmVjdFN5bWJvbCAmKSA9IGRlbGV0ZTsKKyAgR2xvYmFsSW5kaXJlY3RTeW1ib2wgJm9wZXJhdG9yPShjb25zdCBHbG9iYWxJbmRpcmVjdFN5bWJvbCAmKSA9IGRlbGV0ZTsKKworICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSBvbmUgb3BlcmFuZAorICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDEpOworICB9CisKKyAgLy8vIFByb3ZpZGUgZmFzdCBvcGVyYW5kIGFjY2Vzc29ycworICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKENvbnN0YW50KTsKKworICAvLy8gVGhlc2UgbWV0aG9kcyBzZXQgYW5kIHJldHJpZXZlIGluZGlyZWN0IHN5bWJvbC4KKyAgdm9pZCBzZXRJbmRpcmVjdFN5bWJvbChDb25zdGFudCAqU3ltYm9sKSB7CisgICAgc2V0T3BlcmFuZCgwLCBTeW1ib2wpOworICB9CisgIGNvbnN0IENvbnN0YW50ICpnZXRJbmRpcmVjdFN5bWJvbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZCgwKTsKKyAgfQorICBDb25zdGFudCAqZ2V0SW5kaXJlY3RTeW1ib2woKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q29uc3RhbnQgKj4oCisgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR2xvYmFsSW5kaXJlY3RTeW1ib2wgKj4odGhpcyktPmdldEluZGlyZWN0U3ltYm9sKCkpOworICB9CisKKyAgY29uc3QgR2xvYmFsT2JqZWN0ICpnZXRCYXNlT2JqZWN0KCkgY29uc3QgeworICAgIHJldHVybiBkeW5fY2FzdDxHbG9iYWxPYmplY3Q+KGdldEluZGlyZWN0U3ltYm9sKCktPnN0cmlwSW5Cb3VuZHNPZmZzZXRzKCkpOworICB9CisgIEdsb2JhbE9iamVjdCAqZ2V0QmFzZU9iamVjdCgpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxHbG9iYWxPYmplY3QgKj4oCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdsb2JhbEluZGlyZWN0U3ltYm9sICo+KHRoaXMpLT5nZXRCYXNlT2JqZWN0KCkpOworICB9CisKKyAgY29uc3QgR2xvYmFsT2JqZWN0ICpnZXRCYXNlT2JqZWN0KGNvbnN0IERhdGFMYXlvdXQgJkRMLCBBUEludCAmT2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuIGR5bl9jYXN0PEdsb2JhbE9iamVjdD4oCisgICAgICAgIGdldEluZGlyZWN0U3ltYm9sKCktPnN0cmlwQW5kQWNjdW11bGF0ZUluQm91bmRzQ29uc3RhbnRPZmZzZXRzKERMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQpKTsKKyAgfQorICBHbG9iYWxPYmplY3QgKmdldEJhc2VPYmplY3QoY29uc3QgRGF0YUxheW91dCAmREwsIEFQSW50ICZPZmZzZXQpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxHbG9iYWxPYmplY3QgKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHbG9iYWxJbmRpcmVjdFN5bWJvbCAqPih0aGlzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmdldEJhc2VPYmplY3QoREwsIE9mZnNldCkpOworICB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6Okdsb2JhbEFsaWFzVmFsIHx8CisgICAgICAgICAgIFYtPmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6R2xvYmFsSUZ1bmNWYWw7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxHbG9iYWxJbmRpcmVjdFN5bWJvbD4gOgorICBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPEdsb2JhbEluZGlyZWN0U3ltYm9sLCAxPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoR2xvYmFsSW5kaXJlY3RTeW1ib2wsIENvbnN0YW50KQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9HTE9CQUxJTkRJUkVDVFNZTUJPTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0dsb2JhbE9iamVjdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9HbG9iYWxPYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzhiMTkzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9HbG9iYWxPYmplY3QuaApAQCAtMCwwICsxLDE4NCBAQAorLy89PT0tLSBsbHZtL0dsb2JhbE9iamVjdC5oIC0gQ2xhc3MgdG8gcmVwcmVzZW50IGdsb2JhbCBvYmplY3RzIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgb2JqZWN0LiBUaGF0IGlzLCBhIGZ1bmN0aW9uIG9yIGEgZ2xvYmFsCisvLyB2YXJpYWJsZSwgYnV0IG5vdCBhbiBhbGlhcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfR0xPQkFMT0JKRUNUX0gKKyNkZWZpbmUgTExWTV9JUl9HTE9CQUxPQkpFQ1RfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9HbG9iYWxWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBDb21kYXQ7CitjbGFzcyBNRE5vZGU7CitjbGFzcyBNZXRhZGF0YTsKKworY2xhc3MgR2xvYmFsT2JqZWN0IDogcHVibGljIEdsb2JhbFZhbHVlIHsKK3Byb3RlY3RlZDoKKyAgR2xvYmFsT2JqZWN0KFR5cGUgKlR5LCBWYWx1ZVR5IFZUeSwgVXNlICpPcHMsIHVuc2lnbmVkIE51bU9wcywKKyAgICAgICAgICAgICAgIExpbmthZ2VUeXBlcyBMaW5rYWdlLCBjb25zdCBUd2luZSAmTmFtZSwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSA9IDApCisgICAgICA6IEdsb2JhbFZhbHVlKFR5LCBWVHksIE9wcywgTnVtT3BzLCBMaW5rYWdlLCBOYW1lLCBBZGRyZXNzU3BhY2UpLAorICAgICAgICBPYmpDb21kYXQobnVsbHB0cikgeworICAgIHNldEdsb2JhbFZhbHVlU3ViQ2xhc3NEYXRhKDApOworICB9CisKKyAgQ29tZGF0ICpPYmpDb21kYXQ7CisgIGVudW0geworICAgIExhc3RBbGlnbm1lbnRCaXQgPSA0LAorICAgIEhhc01ldGFkYXRhSGFzaEVudHJ5Qml0LAorICAgIEhhc1NlY3Rpb25IYXNoRW50cnlCaXQsCisKKyAgICBHbG9iYWxPYmplY3RCaXRzLAorICB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgR2xvYmFsT2JqZWN0U3ViQ2xhc3NEYXRhQml0cyA9CisgICAgICBHbG9iYWxWYWx1ZVN1YkNsYXNzRGF0YUJpdHMgLSBHbG9iYWxPYmplY3RCaXRzOworCitwcml2YXRlOgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQWxpZ25tZW50Qml0cyA9IExhc3RBbGlnbm1lbnRCaXQgKyAxOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQWxpZ25tZW50TWFzayA9ICgxIDw8IEFsaWdubWVudEJpdHMpIC0gMTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEdsb2JhbE9iamVjdE1hc2sgPSAoMSA8PCBHbG9iYWxPYmplY3RCaXRzKSAtIDE7CisKK3B1YmxpYzoKKyAgR2xvYmFsT2JqZWN0KGNvbnN0IEdsb2JhbE9iamVjdCAmKSA9IGRlbGV0ZTsKKworICB1bnNpZ25lZCBnZXRBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgdW5zaWduZWQgRGF0YSA9IGdldEdsb2JhbFZhbHVlU3ViQ2xhc3NEYXRhKCk7CisgICAgdW5zaWduZWQgQWxpZ25tZW50RGF0YSA9IERhdGEgJiBBbGlnbm1lbnRNYXNrOworICAgIHJldHVybiAoMXUgPDwgQWxpZ25tZW50RGF0YSkgPj4gMTsKKyAgfQorICB2b2lkIHNldEFsaWdubWVudCh1bnNpZ25lZCBBbGlnbik7CisKKyAgdW5zaWduZWQgZ2V0R2xvYmFsT2JqZWN0U3ViQ2xhc3NEYXRhKCkgY29uc3QgeworICAgIHVuc2lnbmVkIFZhbHVlRGF0YSA9IGdldEdsb2JhbFZhbHVlU3ViQ2xhc3NEYXRhKCk7CisgICAgcmV0dXJuIFZhbHVlRGF0YSA+PiBHbG9iYWxPYmplY3RCaXRzOworICB9CisKKyAgdm9pZCBzZXRHbG9iYWxPYmplY3RTdWJDbGFzc0RhdGEodW5zaWduZWQgVmFsKSB7CisgICAgdW5zaWduZWQgT2xkRGF0YSA9IGdldEdsb2JhbFZhbHVlU3ViQ2xhc3NEYXRhKCk7CisgICAgc2V0R2xvYmFsVmFsdWVTdWJDbGFzc0RhdGEoKE9sZERhdGEgJiBHbG9iYWxPYmplY3RNYXNrKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZhbCA8PCBHbG9iYWxPYmplY3RCaXRzKSk7CisgICAgYXNzZXJ0KGdldEdsb2JhbE9iamVjdFN1YkNsYXNzRGF0YSgpID09IFZhbCAmJiAicmVwcmVzZW50YXRpb24gZXJyb3IiKTsKKyAgfQorCisgIC8vLyBDaGVjayBpZiB0aGlzIGdsb2JhbCBoYXMgYSBjdXN0b20gb2JqZWN0IGZpbGUgc2VjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gY2FsbGluZyBnZXRTZWN0aW9uKCkgYW5kIGNoZWNraW5nIGZvciBhbiBlbXB0eQorICAvLy8gc3RyaW5nLgorICBib29sIGhhc1NlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEdsb2JhbFZhbHVlU3ViQ2xhc3NEYXRhKCkgJiAoMSA8PCBIYXNTZWN0aW9uSGFzaEVudHJ5Qml0KTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGN1c3RvbSBzZWN0aW9uIG9mIHRoaXMgZ2xvYmFsIGlmIGl0IGhhcyBvbmUuCisgIC8vLworICAvLy8gSWYgdGhpcyBnbG9iYWwgZG9lcyBub3QgaGF2ZSBhIGN1c3RvbSBzZWN0aW9uLCB0aGlzIHdpbGwgYmUgZW1wdHkgYW5kIHRoZQorICAvLy8gZGVmYXVsdCBvYmplY3QgZmlsZSBzZWN0aW9uICgudGV4dCwgLmRhdGEsIGV0Yykgd2lsbCBiZSB1c2VkLgorICBTdHJpbmdSZWYgZ2V0U2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzU2VjdGlvbigpID8gZ2V0U2VjdGlvbkltcGwoKSA6IFN0cmluZ1JlZigpOworICB9CisKKyAgLy8vIENoYW5nZSB0aGUgc2VjdGlvbiBmb3IgdGhpcyBnbG9iYWwuCisgIC8vLworICAvLy8gU2V0dGluZyB0aGUgc2VjdGlvbiB0byB0aGUgZW1wdHkgc3RyaW5nIHRlbGxzIExMVk0gdG8gY2hvb3NlIGFuCisgIC8vLyBhcHByb3ByaWF0ZSBkZWZhdWx0IG9iamVjdCBmaWxlIHNlY3Rpb24uCisgIHZvaWQgc2V0U2VjdGlvbihTdHJpbmdSZWYgUyk7CisKKyAgYm9vbCBoYXNDb21kYXQoKSBjb25zdCB7IHJldHVybiBnZXRDb21kYXQoKSAhPSBudWxscHRyOyB9CisgIGNvbnN0IENvbWRhdCAqZ2V0Q29tZGF0KCkgY29uc3QgeyByZXR1cm4gT2JqQ29tZGF0OyB9CisgIENvbWRhdCAqZ2V0Q29tZGF0KCkgeyByZXR1cm4gT2JqQ29tZGF0OyB9CisgIHZvaWQgc2V0Q29tZGF0KENvbWRhdCAqQykgeyBPYmpDb21kYXQgPSBDOyB9CisKKyAgLy8vIENoZWNrIGlmIHRoaXMgaGFzIGFueSBtZXRhZGF0YS4KKyAgYm9vbCBoYXNNZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGhhc01ldGFkYXRhSGFzaEVudHJ5KCk7IH0KKworICAvLy8gR2V0IHRoZSBjdXJyZW50IG1ldGFkYXRhIGF0dGFjaG1lbnRzIGZvciB0aGUgZ2l2ZW4ga2luZCwgaWYgYW55LgorICAvLy8KKyAgLy8vIFRoZXNlIGZ1bmN0aW9ucyByZXF1aXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGhhdmUgYXQgbW9zdCBhIHNpbmdsZSBhdHRhY2htZW50CisgIC8vLyBvZiB0aGUgZ2l2ZW4ga2luZCwgYW5kIHJldHVybiBcYyBudWxscHRyIGlmIHN1Y2ggYW4gYXR0YWNobWVudCBpcyBtaXNzaW5nLgorICAvLy8gQHsKKyAgTUROb2RlICpnZXRNZXRhZGF0YSh1bnNpZ25lZCBLaW5kSUQpIGNvbnN0OworICBNRE5vZGUgKmdldE1ldGFkYXRhKFN0cmluZ1JlZiBLaW5kKSBjb25zdDsKKyAgLy8vIEB9CisKKyAgLy8vIEFwcGVuZHMgYWxsIGF0dGFjaG1lbnRzIHdpdGggdGhlIGdpdmVuIElEIHRvIFxjIE1EcyBpbiBpbnNlcnRpb24gb3JkZXIuCisgIC8vLyBJZiB0aGUgZ2xvYmFsIGhhcyBubyBhdHRhY2htZW50cyB3aXRoIHRoZSBnaXZlbiBJRCwgb3IgaWYgSUQgaXMgaW52YWxpZCwKKyAgLy8vIGxlYXZlcyBNRHMgdW5jaGFuZ2VkLgorICAvLy8gQHsKKyAgdm9pZCBnZXRNZXRhZGF0YSh1bnNpZ25lZCBLaW5kSUQsIFNtYWxsVmVjdG9ySW1wbDxNRE5vZGUgKj4gJk1EcykgY29uc3Q7CisgIHZvaWQgZ2V0TWV0YWRhdGEoU3RyaW5nUmVmIEtpbmQsIFNtYWxsVmVjdG9ySW1wbDxNRE5vZGUgKj4gJk1EcykgY29uc3Q7CisgIC8vLyBAfQorCisgIC8vLyBTZXQgYSBwYXJ0aWN1bGFyIGtpbmQgb2YgbWV0YWRhdGEgYXR0YWNobWVudC4KKyAgLy8vCisgIC8vLyBTZXRzIHRoZSBnaXZlbiBhdHRhY2htZW50IHRvIFxjIE1ELCBlcmFzaW5nIGl0IGlmIFxjIE1EIGlzIFxjIG51bGxwdHIgb3IKKyAgLy8vIHJlcGxhY2luZyBpdCBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KKyAgLy8vIEB7CisgIHZvaWQgc2V0TWV0YWRhdGEodW5zaWduZWQgS2luZElELCBNRE5vZGUgKk1EKTsKKyAgdm9pZCBzZXRNZXRhZGF0YShTdHJpbmdSZWYgS2luZCwgTUROb2RlICpNRCk7CisgIC8vLyBAfQorCisgIC8vLyBBZGQgYSBtZXRhZGF0YSBhdHRhY2htZW50LgorICAvLy8gQHsKKyAgdm9pZCBhZGRNZXRhZGF0YSh1bnNpZ25lZCBLaW5kSUQsIE1ETm9kZSAmTUQpOworICB2b2lkIGFkZE1ldGFkYXRhKFN0cmluZ1JlZiBLaW5kLCBNRE5vZGUgJk1EKTsKKyAgLy8vIEB9CisKKyAgLy8vIEFwcGVuZHMgYWxsIGF0dGFjaG1lbnRzIGZvciB0aGUgZ2xvYmFsIHRvIFxjIE1Ecywgc29ydGluZyBieSBhdHRhY2htZW50CisgIC8vLyBJRC4gQXR0YWNobWVudHMgd2l0aCB0aGUgc2FtZSBJRCBhcHBlYXIgaW4gaW5zZXJ0aW9uIG9yZGVyLgorICB2b2lkCisgIGdldEFsbE1ldGFkYXRhKFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8dW5zaWduZWQsIE1ETm9kZSAqPj4gJk1EcykgY29uc3Q7CisKKyAgLy8vIEVyYXNlIGFsbCBtZXRhZGF0YSBhdHRhY2htZW50cyB3aXRoIHRoZSBnaXZlbiBraW5kLgorICB2b2lkIGVyYXNlTWV0YWRhdGEodW5zaWduZWQgS2luZElEKTsKKworICAvLy8gQ29weSBtZXRhZGF0YSBmcm9tIFNyYywgYWRqdXN0aW5nIG9mZnNldHMgYnkgT2Zmc2V0LgorICB2b2lkIGNvcHlNZXRhZGF0YShjb25zdCBHbG9iYWxPYmplY3QgKlNyYywgdW5zaWduZWQgT2Zmc2V0KTsKKworICB2b2lkIGFkZFR5cGVNZXRhZGF0YSh1bnNpZ25lZCBPZmZzZXQsIE1ldGFkYXRhICpUeXBlSUQpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgY29weUF0dHJpYnV0ZXNGcm9tKGNvbnN0IEdsb2JhbE9iamVjdCAqU3JjKTsKKworcHVibGljOgorICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6RnVuY3Rpb25WYWwgfHwKKyAgICAgICAgICAgVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpHbG9iYWxWYXJpYWJsZVZhbDsKKyAgfQorCisgIHZvaWQgY2xlYXJNZXRhZGF0YSgpOworCitwcml2YXRlOgorICB2b2lkIHNldEdsb2JhbE9iamVjdEZsYWcodW5zaWduZWQgQml0LCBib29sIFZhbCkgeworICAgIHVuc2lnbmVkIE1hc2sgPSAxIDw8IEJpdDsKKyAgICBzZXRHbG9iYWxWYWx1ZVN1YkNsYXNzRGF0YSgofk1hc2sgJiBnZXRHbG9iYWxWYWx1ZVN1YkNsYXNzRGF0YSgpKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZhbCA/IE1hc2sgOiAwdSkpOworICB9CisKKyAgYm9vbCBoYXNNZXRhZGF0YUhhc2hFbnRyeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0R2xvYmFsVmFsdWVTdWJDbGFzc0RhdGEoKSAmICgxIDw8IEhhc01ldGFkYXRhSGFzaEVudHJ5Qml0KTsKKyAgfQorICB2b2lkIHNldEhhc01ldGFkYXRhSGFzaEVudHJ5KGJvb2wgSGFzRW50cnkpIHsKKyAgICBzZXRHbG9iYWxPYmplY3RGbGFnKEhhc01ldGFkYXRhSGFzaEVudHJ5Qml0LCBIYXNFbnRyeSk7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0U2VjdGlvbkltcGwoKSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0dMT0JBTE9CSkVDVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0dsb2JhbFZhbHVlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0dsb2JhbFZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzViMGI2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvR2xvYmFsVmFsdWUuaApAQCAtMCwwICsxLDU4NiBAQAorLy89PT0tLSBsbHZtL0dsb2JhbFZhbHVlLmggLSBDbGFzcyB0byByZXByZXNlbnQgYSBnbG9iYWwgdmFsdWUgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaXMgYSBjb21tb24gYmFzZSBjbGFzcyBvZiBhbGwgZ2xvYmFsbHkgZGVmaW5hYmxlIG9iamVjdHMuICBBcyBzdWNoLAorLy8gaXQgaXMgc3ViY2xhc3NlZCBieSBHbG9iYWxWYXJpYWJsZSwgR2xvYmFsQWxpYXMgYW5kIGJ5IEZ1bmN0aW9uLiAgVGhpcyBpcworLy8gdXNlZCBiZWNhdXNlIHlvdSBjYW4gZG8gY2VydGFpbiB0aGluZ3Mgd2l0aCB0aGVzZSBnbG9iYWwgb2JqZWN0cyB0aGF0IHlvdQorLy8gY2FuJ3QgZG8gdG8gYW55dGhpbmcgZWxzZS4gIEZvciBleGFtcGxlLCB1c2UgdGhlIGFkZHJlc3Mgb2Ygb25lIGFzIGEKKy8vIGNvbnN0YW50LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9HTE9CQUxWQUxVRV9ICisjZGVmaW5lIExMVk1fSVJfR0xPQkFMVkFMVUVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50LmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NRDUuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIENvbWRhdDsKK2NsYXNzIENvbnN0YW50UmFuZ2U7CitjbGFzcyBFcnJvcjsKK2NsYXNzIEdsb2JhbE9iamVjdDsKK2NsYXNzIE1vZHVsZTsKKworbmFtZXNwYWNlIEludHJpbnNpYyB7CisgIGVudW0gSUQgOiB1bnNpZ25lZDsKK30gLy8gZW5kIG5hbWVzcGFjZSBJbnRyaW5zaWMKKworY2xhc3MgR2xvYmFsVmFsdWUgOiBwdWJsaWMgQ29uc3RhbnQgeworcHVibGljOgorICAvLy8gQGJyaWVmIEFuIGVudW1lcmF0aW9uIGZvciB0aGUga2luZHMgb2YgbGlua2FnZSBmb3IgZ2xvYmFsIHZhbHVlcy4KKyAgZW51bSBMaW5rYWdlVHlwZXMgeworICAgIEV4dGVybmFsTGlua2FnZSA9IDAsLy8vPCBFeHRlcm5hbGx5IHZpc2libGUgZnVuY3Rpb24KKyAgICBBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZSwgLy8vPCBBdmFpbGFibGUgZm9yIGluc3BlY3Rpb24sIG5vdCBlbWlzc2lvbi4KKyAgICBMaW5rT25jZUFueUxpbmthZ2UsIC8vLzwgS2VlcCBvbmUgY29weSBvZiBmdW5jdGlvbiB3aGVuIGxpbmtpbmcgKGlubGluZSkKKyAgICBMaW5rT25jZU9EUkxpbmthZ2UsIC8vLzwgU2FtZSwgYnV0IG9ubHkgcmVwbGFjZWQgYnkgc29tZXRoaW5nIGVxdWl2YWxlbnQuCisgICAgV2Vha0FueUxpbmthZ2UsICAgICAvLy88IEtlZXAgb25lIGNvcHkgb2YgbmFtZWQgZnVuY3Rpb24gd2hlbiBsaW5raW5nICh3ZWFrKQorICAgIFdlYWtPRFJMaW5rYWdlLCAgICAgLy8vPCBTYW1lLCBidXQgb25seSByZXBsYWNlZCBieSBzb21ldGhpbmcgZXF1aXZhbGVudC4KKyAgICBBcHBlbmRpbmdMaW5rYWdlLCAgIC8vLzwgU3BlY2lhbCBwdXJwb3NlLCBvbmx5IGFwcGxpZXMgdG8gZ2xvYmFsIGFycmF5cworICAgIEludGVybmFsTGlua2FnZSwgICAgLy8vPCBSZW5hbWUgY29sbGlzaW9ucyB3aGVuIGxpbmtpbmcgKHN0YXRpYyBmdW5jdGlvbnMpLgorICAgIFByaXZhdGVMaW5rYWdlLCAgICAgLy8vPCBMaWtlIEludGVybmFsLCBidXQgb21pdCBmcm9tIHN5bWJvbCB0YWJsZS4KKyAgICBFeHRlcm5hbFdlYWtMaW5rYWdlLC8vLzwgRXh0ZXJuYWxXZWFrIGxpbmthZ2UgZGVzY3JpcHRpb24uCisgICAgQ29tbW9uTGlua2FnZSAgICAgICAvLy88IFRlbnRhdGl2ZSBkZWZpbml0aW9ucy4KKyAgfTsKKworICAvLy8gQGJyaWVmIEFuIGVudW1lcmF0aW9uIGZvciB0aGUga2luZHMgb2YgdmlzaWJpbGl0eSBvZiBnbG9iYWwgdmFsdWVzLgorICBlbnVtIFZpc2liaWxpdHlUeXBlcyB7CisgICAgRGVmYXVsdFZpc2liaWxpdHkgPSAwLCAgLy8vPCBUaGUgR1YgaXMgdmlzaWJsZQorICAgIEhpZGRlblZpc2liaWxpdHksICAgICAgIC8vLzwgVGhlIEdWIGlzIGhpZGRlbgorICAgIFByb3RlY3RlZFZpc2liaWxpdHkgICAgIC8vLzwgVGhlIEdWIGlzIHByb3RlY3RlZAorICB9OworCisgIC8vLyBAYnJpZWYgU3RvcmFnZSBjbGFzc2VzIG9mIGdsb2JhbCB2YWx1ZXMgZm9yIFBFIHRhcmdldHMuCisgIGVudW0gRExMU3RvcmFnZUNsYXNzVHlwZXMgeworICAgIERlZmF1bHRTdG9yYWdlQ2xhc3MgICA9IDAsCisgICAgRExMSW1wb3J0U3RvcmFnZUNsYXNzID0gMSwgLy8vPCBGdW5jdGlvbiB0byBiZSBpbXBvcnRlZCBmcm9tIERMTAorICAgIERMTEV4cG9ydFN0b3JhZ2VDbGFzcyA9IDIgIC8vLzwgRnVuY3Rpb24gdG8gYmUgYWNjZXNzaWJsZSBmcm9tIERMTC4KKyAgfTsKKworcHJvdGVjdGVkOgorICBHbG9iYWxWYWx1ZShUeXBlICpUeSwgVmFsdWVUeSBWVHksIFVzZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMsCisgICAgICAgICAgICAgIExpbmthZ2VUeXBlcyBMaW5rYWdlLCBjb25zdCBUd2luZSAmTmFtZSwgdW5zaWduZWQgQWRkcmVzc1NwYWNlKQorICAgICAgOiBDb25zdGFudChQb2ludGVyVHlwZTo6Z2V0KFR5LCBBZGRyZXNzU3BhY2UpLCBWVHksIE9wcywgTnVtT3BzKSwKKyAgICAgICAgVmFsdWVUeXBlKFR5KSwgVmlzaWJpbGl0eShEZWZhdWx0VmlzaWJpbGl0eSksCisgICAgICAgIFVubmFtZWRBZGRyVmFsKHVuc2lnbmVkKFVubmFtZWRBZGRyOjpOb25lKSksCisgICAgICAgIERsbFN0b3JhZ2VDbGFzcyhEZWZhdWx0U3RvcmFnZUNsYXNzKSwgVGhyZWFkTG9jYWwoTm90VGhyZWFkTG9jYWwpLAorICAgICAgICBIYXNMTFZNUmVzZXJ2ZWROYW1lKGZhbHNlKSwgSXNEU09Mb2NhbChmYWxzZSksIEludElEKChJbnRyaW5zaWM6OklEKTBVKSwKKyAgICAgICAgUGFyZW50KG51bGxwdHIpIHsKKyAgICBzZXRMaW5rYWdlKExpbmthZ2UpOworICAgIHNldE5hbWUoTmFtZSk7CisgIH0KKworICBUeXBlICpWYWx1ZVR5cGU7CisKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEdsb2JhbFZhbHVlU3ViQ2xhc3NEYXRhQml0cyA9IDE3OworCisgIC8vIEFsbCBiaXRmaWVsZHMgdXNlIHVuc2lnbmVkIGFzIHRoZSB1bmRlcmx5aW5nIHR5cGUgc28gdGhhdCBNU1ZDIHdpbGwgcGFjaworICAvLyB0aGVtLgorICB1bnNpZ25lZCBMaW5rYWdlIDogNDsgICAgICAgLy8gVGhlIGxpbmthZ2Ugb2YgdGhpcyBnbG9iYWwKKyAgdW5zaWduZWQgVmlzaWJpbGl0eSA6IDI7ICAgIC8vIFRoZSB2aXNpYmlsaXR5IHN0eWxlIG9mIHRoaXMgZ2xvYmFsCisgIHVuc2lnbmVkIFVubmFtZWRBZGRyVmFsIDogMjsgLy8gVGhpcyB2YWx1ZSdzIGFkZHJlc3MgaXMgbm90IHNpZ25pZmljYW50CisgIHVuc2lnbmVkIERsbFN0b3JhZ2VDbGFzcyA6IDI7IC8vIERMTCBzdG9yYWdlIGNsYXNzCisKKyAgdW5zaWduZWQgVGhyZWFkTG9jYWwgOiAzOyAvLyBJcyB0aGlzIHN5bWJvbCAiVGhyZWFkIExvY2FsIiwgaWYgc28sIHdoYXQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVzaXJlZCBtb2RlbD8KKworICAvLy8gVHJ1ZSBpZiB0aGUgZnVuY3Rpb24ncyBuYW1lIHN0YXJ0cyB3aXRoICJsbHZtLiIuICBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZQorICAvLy8gdmFsdWUgb2YgRnVuY3Rpb246OmlzSW50cmluc2ljKCksIHdoaWNoIG1heSBiZSB0cnVlIGV2ZW4gaWYKKyAgLy8vIEZ1bmN0aW9uOjppbnRyaW5zaWNJRCgpIHJldHVybnMgSW50cmluc2ljOjpub3RfaW50cmluc2ljLgorICB1bnNpZ25lZCBIYXNMTFZNUmVzZXJ2ZWROYW1lIDogMTsKKworICAvLy8gSWYgdHJ1ZSB0aGVuIHRoZXJlIGlzIGEgZGVmaW5pdGlvbiB3aXRoaW4gdGhlIHNhbWUgbGlua2FnZSB1bml0IGFuZCB0aGF0CisgIC8vLyBkZWZpbml0aW9uIGNhbm5vdCBiZSBydW50aW1lIHByZWVtcHRlZC4KKyAgdW5zaWduZWQgSXNEU09Mb2NhbCA6IDE7CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudDsKKworICB2b2lkIG1heWJlU2V0RHNvTG9jYWwoKSB7CisgICAgaWYgKGhhc0xvY2FsTGlua2FnZSgpIHx8CisgICAgICAgICghaGFzRGVmYXVsdFZpc2liaWxpdHkoKSAmJiAhaGFzRXh0ZXJuYWxXZWFrTGlua2FnZSgpKSkKKyAgICAgIHNldERTT0xvY2FsKHRydWUpOworICB9CisKKyAgLy8gR2l2ZSBzdWJjbGFzc2VzIGFjY2VzcyB0byB3aGF0IG90aGVyd2lzZSB3b3VsZCBiZSB3YXN0ZWQgcGFkZGluZy4KKyAgLy8gKDE3ICsgNCArIDIgKyAyICsgMiArIDMgKyAxICsgMSkgPT0gMzIuCisgIHVuc2lnbmVkIFN1YkNsYXNzRGF0YSA6IEdsb2JhbFZhbHVlU3ViQ2xhc3NEYXRhQml0czsKKworICB2b2lkIGRlc3Ryb3lDb25zdGFudEltcGwoKTsKKyAgVmFsdWUgKmhhbmRsZU9wZXJhbmRDaGFuZ2VJbXBsKFZhbHVlICpGcm9tLCBWYWx1ZSAqVG8pOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBnbG9iYWwgbWF5IGJlIHJlcGxhY2VkIGJ5IGEKKyAgLy8vIGRpZmZlcmVudGx5IG9wdGltaXplZCB2YXJpYW50IG9mIHRoZSBzYW1lIHNvdXJjZSBsZXZlbCBmdW5jdGlvbiBhdCBsaW5rCisgIC8vLyB0aW1lLgorICBib29sIG1heUJlRGVyZWZpbmVkKCkgY29uc3QgeworICAgIHN3aXRjaCAoZ2V0TGlua2FnZSgpKSB7CisgICAgY2FzZSBXZWFrT0RSTGlua2FnZToKKyAgICBjYXNlIExpbmtPbmNlT0RSTGlua2FnZToKKyAgICBjYXNlIEF2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlOgorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIFdlYWtBbnlMaW5rYWdlOgorICAgIGNhc2UgTGlua09uY2VBbnlMaW5rYWdlOgorICAgIGNhc2UgQ29tbW9uTGlua2FnZToKKyAgICBjYXNlIEV4dGVybmFsV2Vha0xpbmthZ2U6CisgICAgY2FzZSBFeHRlcm5hbExpbmthZ2U6CisgICAgY2FzZSBBcHBlbmRpbmdMaW5rYWdlOgorICAgIGNhc2UgSW50ZXJuYWxMaW5rYWdlOgorICAgIGNhc2UgUHJpdmF0ZUxpbmthZ2U6CisgICAgICByZXR1cm4gaXNJbnRlcnBvc2FibGUoKTsKKyAgICB9CisKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJGdWxseSBjb3ZlcmVkIHN3aXRjaCBhYm92ZSEiKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8vLyBcYnJpZWYgVGhlIGludHJpbnNpYyBJRCBmb3IgdGhpcyBzdWJjbGFzcyAod2hpY2ggbXVzdCBiZSBhIEZ1bmN0aW9uKS4KKyAgLy8vCisgIC8vLyBUaGlzIG1lbWJlciBpcyBkZWZpbmVkIGJ5IHRoaXMgY2xhc3MsIGJ1dCBub3QgdXNlZCBmb3IgYW55dGhpbmcuCisgIC8vLyBTdWJjbGFzc2VzIGNhbiB1c2UgaXQgdG8gc3RvcmUgdGhlaXIgaW50cmluc2ljIElELCBpZiB0aGV5IGhhdmUgb25lLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgc3RvcmVkIGhlcmUgdG8gc2F2ZSBzcGFjZSBpbiBGdW5jdGlvbiBvbiA2NC1iaXQgaG9zdHMuCisgIEludHJpbnNpYzo6SUQgSW50SUQ7CisKKyAgdW5zaWduZWQgZ2V0R2xvYmFsVmFsdWVTdWJDbGFzc0RhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIFN1YkNsYXNzRGF0YTsKKyAgfQorICB2b2lkIHNldEdsb2JhbFZhbHVlU3ViQ2xhc3NEYXRhKHVuc2lnbmVkIFYpIHsKKyAgICBhc3NlcnQoViA8ICgxIDw8IEdsb2JhbFZhbHVlU3ViQ2xhc3NEYXRhQml0cykgJiYgIkl0IHdpbGwgbm90IGZpdCIpOworICAgIFN1YkNsYXNzRGF0YSA9IFY7CisgIH0KKworICBNb2R1bGUgKlBhcmVudDsgICAgICAgICAgICAgLy8gVGhlIGNvbnRhaW5pbmcgbW9kdWxlLgorCisgIC8vIFVzZWQgYnkgU3ltYm9sVGFibGVMaXN0VHJhaXRzLgorICB2b2lkIHNldFBhcmVudChNb2R1bGUgKnBhcmVudCkgeworICAgIFBhcmVudCA9IHBhcmVudDsKKyAgfQorCisgIH5HbG9iYWxWYWx1ZSgpIHsKKyAgICByZW1vdmVEZWFkQ29uc3RhbnRVc2VycygpOyAgIC8vIHJlbW92ZSBhbnkgZGVhZCBjb25zdGFudHMgdXNpbmcgdGhpcy4KKyAgfQorCitwdWJsaWM6CisgIGVudW0gVGhyZWFkTG9jYWxNb2RlIHsKKyAgICBOb3RUaHJlYWRMb2NhbCA9IDAsCisgICAgR2VuZXJhbER5bmFtaWNUTFNNb2RlbCwKKyAgICBMb2NhbER5bmFtaWNUTFNNb2RlbCwKKyAgICBJbml0aWFsRXhlY1RMU01vZGVsLAorICAgIExvY2FsRXhlY1RMU01vZGVsCisgIH07CisKKyAgR2xvYmFsVmFsdWUoY29uc3QgR2xvYmFsVmFsdWUgJikgPSBkZWxldGU7CisKKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KCkgY29uc3Q7CisKKyAgZW51bSBjbGFzcyBVbm5hbWVkQWRkciB7CisgICAgTm9uZSwKKyAgICBMb2NhbCwKKyAgICBHbG9iYWwsCisgIH07CisKKyAgYm9vbCBoYXNHbG9iYWxVbm5hbWVkQWRkcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VW5uYW1lZEFkZHIoKSA9PSBVbm5hbWVkQWRkcjo6R2xvYmFsOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlJ3MgYWRkcmVzcyBpcyBub3Qgc2lnbmlmaWNhbnQgaW4gdGhpcyBtb2R1bGUuCisgIC8vLyBUaGlzIGF0dHJpYnV0ZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yIGFuZCBMVE8KKyAgLy8vIHRvIGFsbG93IHRoZSBsaW5rZXIgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIGdsb2JhbCBuZWVkcyB0byBiZSBpbiB0aGUgc3ltYm9sCisgIC8vLyB0YWJsZS4gSXQgc2hvdWxkIHByb2JhYmx5IG5vdCBiZSB1c2VkIGluIG9wdGltaXphdGlvbnMsIGFzIHRoZSB2YWx1ZSBtYXkKKyAgLy8vIGhhdmUgdXNlcyBvdXRzaWRlIHRoZSBtb2R1bGU7IHVzZSBoYXNHbG9iYWxVbm5hbWVkQWRkcigpIGluc3RlYWQuCisgIGJvb2wgaGFzQXRMZWFzdExvY2FsVW5uYW1lZEFkZHIoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFVubmFtZWRBZGRyKCkgIT0gVW5uYW1lZEFkZHI6Ok5vbmU7CisgIH0KKworICBVbm5hbWVkQWRkciBnZXRVbm5hbWVkQWRkcigpIGNvbnN0IHsKKyAgICByZXR1cm4gVW5uYW1lZEFkZHIoVW5uYW1lZEFkZHJWYWwpOworICB9CisgIHZvaWQgc2V0VW5uYW1lZEFkZHIoVW5uYW1lZEFkZHIgVmFsKSB7IFVubmFtZWRBZGRyVmFsID0gdW5zaWduZWQoVmFsKTsgfQorCisgIHN0YXRpYyBVbm5hbWVkQWRkciBnZXRNaW5Vbm5hbWVkQWRkcihVbm5hbWVkQWRkciBBLCBVbm5hbWVkQWRkciBCKSB7CisgICAgaWYgKEEgPT0gVW5uYW1lZEFkZHI6Ok5vbmUgfHwgQiA9PSBVbm5hbWVkQWRkcjo6Tm9uZSkKKyAgICAgIHJldHVybiBVbm5hbWVkQWRkcjo6Tm9uZTsKKyAgICBpZiAoQSA9PSBVbm5hbWVkQWRkcjo6TG9jYWwgfHwgQiA9PSBVbm5hbWVkQWRkcjo6TG9jYWwpCisgICAgICByZXR1cm4gVW5uYW1lZEFkZHI6OkxvY2FsOworICAgIHJldHVybiBVbm5hbWVkQWRkcjo6R2xvYmFsOworICB9CisKKyAgYm9vbCBoYXNDb21kYXQoKSBjb25zdCB7IHJldHVybiBnZXRDb21kYXQoKSAhPSBudWxscHRyOyB9CisgIGNvbnN0IENvbWRhdCAqZ2V0Q29tZGF0KCkgY29uc3Q7CisgIENvbWRhdCAqZ2V0Q29tZGF0KCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PENvbWRhdCAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdsb2JhbFZhbHVlICo+KHRoaXMpLT5nZXRDb21kYXQoKSk7CisgIH0KKworICBWaXNpYmlsaXR5VHlwZXMgZ2V0VmlzaWJpbGl0eSgpIGNvbnN0IHsgcmV0dXJuIFZpc2liaWxpdHlUeXBlcyhWaXNpYmlsaXR5KTsgfQorICBib29sIGhhc0RlZmF1bHRWaXNpYmlsaXR5KCkgY29uc3QgeyByZXR1cm4gVmlzaWJpbGl0eSA9PSBEZWZhdWx0VmlzaWJpbGl0eTsgfQorICBib29sIGhhc0hpZGRlblZpc2liaWxpdHkoKSBjb25zdCB7IHJldHVybiBWaXNpYmlsaXR5ID09IEhpZGRlblZpc2liaWxpdHk7IH0KKyAgYm9vbCBoYXNQcm90ZWN0ZWRWaXNpYmlsaXR5KCkgY29uc3QgeworICAgIHJldHVybiBWaXNpYmlsaXR5ID09IFByb3RlY3RlZFZpc2liaWxpdHk7CisgIH0KKyAgdm9pZCBzZXRWaXNpYmlsaXR5KFZpc2liaWxpdHlUeXBlcyBWKSB7CisgICAgYXNzZXJ0KCghaGFzTG9jYWxMaW5rYWdlKCkgfHwgViA9PSBEZWZhdWx0VmlzaWJpbGl0eSkgJiYKKyAgICAgICAgICAgImxvY2FsIGxpbmthZ2UgcmVxdWlyZXMgZGVmYXVsdCB2aXNpYmlsaXR5Iik7CisgICAgVmlzaWJpbGl0eSA9IFY7CisgICAgbWF5YmVTZXREc29Mb2NhbCgpOworICB9CisKKyAgLy8vIElmIHRoZSB2YWx1ZSBpcyAiVGhyZWFkIExvY2FsIiwgaXRzIHZhbHVlIGlzbid0IHNoYXJlZCBieSB0aGUgdGhyZWFkcy4KKyAgYm9vbCBpc1RocmVhZExvY2FsKCkgY29uc3QgeyByZXR1cm4gZ2V0VGhyZWFkTG9jYWxNb2RlKCkgIT0gTm90VGhyZWFkTG9jYWw7IH0KKyAgdm9pZCBzZXRUaHJlYWRMb2NhbChib29sIFZhbCkgeworICAgIHNldFRocmVhZExvY2FsTW9kZShWYWwgPyBHZW5lcmFsRHluYW1pY1RMU01vZGVsIDogTm90VGhyZWFkTG9jYWwpOworICB9CisgIHZvaWQgc2V0VGhyZWFkTG9jYWxNb2RlKFRocmVhZExvY2FsTW9kZSBWYWwpIHsKKyAgICBhc3NlcnQoVmFsID09IE5vdFRocmVhZExvY2FsIHx8IGdldFZhbHVlSUQoKSAhPSBWYWx1ZTo6RnVuY3Rpb25WYWwpOworICAgIFRocmVhZExvY2FsID0gVmFsOworICB9CisgIFRocmVhZExvY2FsTW9kZSBnZXRUaHJlYWRMb2NhbE1vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRocmVhZExvY2FsTW9kZT4oVGhyZWFkTG9jYWwpOworICB9CisKKyAgRExMU3RvcmFnZUNsYXNzVHlwZXMgZ2V0RExMU3RvcmFnZUNsYXNzKCkgY29uc3QgeworICAgIHJldHVybiBETExTdG9yYWdlQ2xhc3NUeXBlcyhEbGxTdG9yYWdlQ2xhc3MpOworICB9CisgIGJvb2wgaGFzRExMSW1wb3J0U3RvcmFnZUNsYXNzKCkgY29uc3QgeworICAgIHJldHVybiBEbGxTdG9yYWdlQ2xhc3MgPT0gRExMSW1wb3J0U3RvcmFnZUNsYXNzOworICB9CisgIGJvb2wgaGFzRExMRXhwb3J0U3RvcmFnZUNsYXNzKCkgY29uc3QgeworICAgIHJldHVybiBEbGxTdG9yYWdlQ2xhc3MgPT0gRExMRXhwb3J0U3RvcmFnZUNsYXNzOworICB9CisgIHZvaWQgc2V0RExMU3RvcmFnZUNsYXNzKERMTFN0b3JhZ2VDbGFzc1R5cGVzIEMpIHsgRGxsU3RvcmFnZUNsYXNzID0gQzsgfQorCisgIGJvb2wgaGFzU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuICFnZXRTZWN0aW9uKCkuZW1wdHkoKTsgfQorICBTdHJpbmdSZWYgZ2V0U2VjdGlvbigpIGNvbnN0OworCisgIC8vLyBHbG9iYWwgdmFsdWVzIGFyZSBhbHdheXMgcG9pbnRlcnMuCisgIFBvaW50ZXJUeXBlICpnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gY2FzdDxQb2ludGVyVHlwZT4oVXNlcjo6Z2V0VHlwZSgpKTsgfQorCisgIFR5cGUgKmdldFZhbHVlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlVHlwZTsgfQorCisgIHZvaWQgc2V0RFNPTG9jYWwoYm9vbCBMb2NhbCkgeyBJc0RTT0xvY2FsID0gTG9jYWw7IH0KKworICBib29sIGlzRFNPTG9jYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIElzRFNPTG9jYWw7CisgIH0KKworICBzdGF0aWMgTGlua2FnZVR5cGVzIGdldExpbmtPbmNlTGlua2FnZShib29sIE9EUikgeworICAgIHJldHVybiBPRFIgPyBMaW5rT25jZU9EUkxpbmthZ2UgOiBMaW5rT25jZUFueUxpbmthZ2U7CisgIH0KKyAgc3RhdGljIExpbmthZ2VUeXBlcyBnZXRXZWFrTGlua2FnZShib29sIE9EUikgeworICAgIHJldHVybiBPRFIgPyBXZWFrT0RSTGlua2FnZSA6IFdlYWtBbnlMaW5rYWdlOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFeHRlcm5hbExpbmthZ2UoTGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICByZXR1cm4gTGlua2FnZSA9PSBFeHRlcm5hbExpbmthZ2U7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZShMaW5rYWdlVHlwZXMgTGlua2FnZSkgeworICAgIHJldHVybiBMaW5rYWdlID09IEF2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlOworICB9CisgIHN0YXRpYyBib29sIGlzTGlua09uY2VPRFJMaW5rYWdlKExpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CisgICAgcmV0dXJuIExpbmthZ2UgPT0gTGlua09uY2VPRFJMaW5rYWdlOworICB9CisgIHN0YXRpYyBib29sIGlzTGlua09uY2VMaW5rYWdlKExpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CisgICAgcmV0dXJuIExpbmthZ2UgPT0gTGlua09uY2VBbnlMaW5rYWdlIHx8IExpbmthZ2UgPT0gTGlua09uY2VPRFJMaW5rYWdlOworICB9CisgIHN0YXRpYyBib29sIGlzV2Vha0FueUxpbmthZ2UoTGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICByZXR1cm4gTGlua2FnZSA9PSBXZWFrQW55TGlua2FnZTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc1dlYWtPRFJMaW5rYWdlKExpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CisgICAgcmV0dXJuIExpbmthZ2UgPT0gV2Vha09EUkxpbmthZ2U7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNXZWFrTGlua2FnZShMaW5rYWdlVHlwZXMgTGlua2FnZSkgeworICAgIHJldHVybiBpc1dlYWtBbnlMaW5rYWdlKExpbmthZ2UpIHx8IGlzV2Vha09EUkxpbmthZ2UoTGlua2FnZSk7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNBcHBlbmRpbmdMaW5rYWdlKExpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CisgICAgcmV0dXJuIExpbmthZ2UgPT0gQXBwZW5kaW5nTGlua2FnZTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0ludGVybmFsTGlua2FnZShMaW5rYWdlVHlwZXMgTGlua2FnZSkgeworICAgIHJldHVybiBMaW5rYWdlID09IEludGVybmFsTGlua2FnZTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc1ByaXZhdGVMaW5rYWdlKExpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CisgICAgcmV0dXJuIExpbmthZ2UgPT0gUHJpdmF0ZUxpbmthZ2U7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNMb2NhbExpbmthZ2UoTGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICByZXR1cm4gaXNJbnRlcm5hbExpbmthZ2UoTGlua2FnZSkgfHwgaXNQcml2YXRlTGlua2FnZShMaW5rYWdlKTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0V4dGVybmFsV2Vha0xpbmthZ2UoTGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICByZXR1cm4gTGlua2FnZSA9PSBFeHRlcm5hbFdlYWtMaW5rYWdlOworICB9CisgIHN0YXRpYyBib29sIGlzQ29tbW9uTGlua2FnZShMaW5rYWdlVHlwZXMgTGlua2FnZSkgeworICAgIHJldHVybiBMaW5rYWdlID09IENvbW1vbkxpbmthZ2U7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNWYWxpZERlY2xhcmF0aW9uTGlua2FnZShMaW5rYWdlVHlwZXMgTGlua2FnZSkgeworICAgIHJldHVybiBpc0V4dGVybmFsV2Vha0xpbmthZ2UoTGlua2FnZSkgfHwgaXNFeHRlcm5hbExpbmthZ2UoTGlua2FnZSk7CisgIH0KKworICAvLy8gV2hldGhlciB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIGdsb2JhbCBtYXkgYmUgcmVwbGFjZWQgYnkgc29tZXRoaW5nCisgIC8vLyBub24tZXF1aXZhbGVudCBhdCBsaW5rIHRpbWUuIEZvciBleGFtcGxlLCBpZiBhIGZ1bmN0aW9uIGhhcyB3ZWFrIGxpbmthZ2UKKyAgLy8vIHRoZW4gdGhlIGNvZGUgZGVmaW5pbmcgaXQgbWF5IGJlIHJlcGxhY2VkIGJ5IGRpZmZlcmVudCBjb2RlLgorICBzdGF0aWMgYm9vbCBpc0ludGVycG9zYWJsZUxpbmthZ2UoTGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICBzd2l0Y2ggKExpbmthZ2UpIHsKKyAgICBjYXNlIFdlYWtBbnlMaW5rYWdlOgorICAgIGNhc2UgTGlua09uY2VBbnlMaW5rYWdlOgorICAgIGNhc2UgQ29tbW9uTGlua2FnZToKKyAgICBjYXNlIEV4dGVybmFsV2Vha0xpbmthZ2U6CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgQXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2U6CisgICAgY2FzZSBMaW5rT25jZU9EUkxpbmthZ2U6CisgICAgY2FzZSBXZWFrT0RSTGlua2FnZToKKyAgICAvLyBUaGUgYWJvdmUgdGhyZWUgY2Fubm90IGJlIG92ZXJyaWRkZW4gYnV0IGNhbiBiZSBkZS1yZWZpbmVkLgorCisgICAgY2FzZSBFeHRlcm5hbExpbmthZ2U6CisgICAgY2FzZSBBcHBlbmRpbmdMaW5rYWdlOgorICAgIGNhc2UgSW50ZXJuYWxMaW5rYWdlOgorICAgIGNhc2UgUHJpdmF0ZUxpbmthZ2U6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIkZ1bGx5IGNvdmVyZWQgc3dpdGNoIGFib3ZlISIpOworICB9CisKKyAgLy8vIFdoZXRoZXIgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBnbG9iYWwgbWF5IGJlIGRpc2NhcmRlZCBpZiBpdCBpcyBub3QgdXNlZAorICAvLy8gaW4gaXRzIGNvbXBpbGF0aW9uIHVuaXQuCisgIHN0YXRpYyBib29sIGlzRGlzY2FyZGFibGVJZlVudXNlZChMaW5rYWdlVHlwZXMgTGlua2FnZSkgeworICAgIHJldHVybiBpc0xpbmtPbmNlTGlua2FnZShMaW5rYWdlKSB8fCBpc0xvY2FsTGlua2FnZShMaW5rYWdlKSB8fAorICAgICAgICAgICBpc0F2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlKExpbmthZ2UpOworICB9CisKKyAgLy8vIFdoZXRoZXIgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBnbG9iYWwgbWF5IGJlIHJlcGxhY2VkIGF0IGxpbmsgdGltZS4gIE5COgorICAvLy8gVXNpbmcgdGhpcyBtZXRob2Qgb3V0c2lkZSBvZiB0aGUgY29kZSBnZW5lcmF0b3JzIGlzIGFsbW9zdCBhbHdheXMgYQorICAvLy8gbWlzdGFrZTogd2hlbiB3b3JraW5nIGF0IHRoZSBJUiBsZXZlbCB1c2UgaXNJbnRlcnBvc2FibGUgaW5zdGVhZCBhcyBpdAorICAvLy8ga25vd3MgYWJvdXQgT0RSIHNlbWFudGljcy4KKyAgc3RhdGljIGJvb2wgaXNXZWFrRm9yTGlua2VyKExpbmthZ2VUeXBlcyBMaW5rYWdlKSAgeworICAgIHJldHVybiBMaW5rYWdlID09IFdlYWtBbnlMaW5rYWdlIHx8IExpbmthZ2UgPT0gV2Vha09EUkxpbmthZ2UgfHwKKyAgICAgICAgICAgTGlua2FnZSA9PSBMaW5rT25jZUFueUxpbmthZ2UgfHwgTGlua2FnZSA9PSBMaW5rT25jZU9EUkxpbmthZ2UgfHwKKyAgICAgICAgICAgTGlua2FnZSA9PSBDb21tb25MaW5rYWdlIHx8IExpbmthZ2UgPT0gRXh0ZXJuYWxXZWFrTGlua2FnZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY3VycmVudGx5IHZpc2libGUgZGVmaW5pdGlvbiBvZiB0aGlzIGdsb2JhbCAoaWYgYW55KSBpcworICAvLy8gZXhhY3RseSB0aGUgZGVmaW5pdGlvbiB3ZSB3aWxsIHNlZSBhdCBydW50aW1lLgorICAvLy8KKyAgLy8vIE5vbi1leGFjdCBsaW5rYWdlIHR5cGVzIGluaGliaXRzIG1vc3Qgbm9uLWlubGluaW5nIElQTywgc2luY2UgYQorICAvLy8gZGlmZmVyZW50bHkgb3B0aW1pemVkIHZhcmlhbnQgb2YgdGhlIHNhbWUgZnVuY3Rpb24gY2FuIGhhdmUgZGlmZmVyZW50CisgIC8vLyBvYnNlcnZhYmxlIG9yIHVuZGVmaW5lZCBiZWhhdmlvciB0aGFuIGluIHRoZSB2YXJpYW50IGN1cnJlbnRseSB2aXNpYmxlLgorICAvLy8gRm9yIGluc3RhbmNlLCB3ZSBjb3VsZCBoYXZlIHN0YXJ0ZWQgd2l0aAorICAvLy8KKyAgLy8vICAgdm9pZCBmb28oaW50ICp2KSB7CisgIC8vLyAgICAgaW50IHQgPSA1IC8gdlswXTsKKyAgLy8vICAgICAodm9pZCkgdDsKKyAgLy8vICAgfQorICAvLy8KKyAgLy8vIGFuZCAicmVmaW5lZCIgaXQgdG8KKyAgLy8vCisgIC8vLyAgIHZvaWQgZm9vKGludCAqdikgeyB9CisgIC8vLworICAvLy8gSG93ZXZlciwgd2UgY2Fubm90IGluZmVyIHJlYWRub25lIGZvciBgZm9vYCwgc2luY2UgdGhhdCB3b3VsZCBqdXN0aWZ5CisgIC8vLyBEU0UnaW5nIGEgc3RvcmUgdG8gYHZbMF1gIGFjcm9zcyBhIGNhbGwgdG8gYGZvb2AsIHdoaWNoIGNhbiBjYXVzZQorICAvLy8gdW5kZWZpbmVkIGJlaGF2aW9yIGlmIHRoZSBsaW5rZXIgcmVwbGFjZXMgdGhlIGFjdHVhbCBjYWxsIGRlc3RpbmF0aW9uIHdpdGgKKyAgLy8vIHRoZSB1bm9wdGltaXplZCBgZm9vYC4KKyAgLy8vCisgIC8vLyBJbmxpbmluZyBpcyBva2F5IGFjcm9zcyBub24tZXhhY3QgbGlua2FnZSB0eXBlcyBhcyBsb25nIGFzIHRoZXkncmUgbm90CisgIC8vLyBpbnRlcnBvc2FibGUgKHNlZSBcYyBpc0ludGVycG9zYWJsZSksIHNpbmNlIGluIHN1Y2ggY2FzZXMgdGhlIGN1cnJlbnRseQorICAvLy8gdmlzaWJsZSB2YXJpYW50IGlzICphKiBjb3JyZWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAgLy8vIGZ1bmN0aW9uOyBpdCBqdXN0IGlzbid0IHRoZSAqb25seSogY29ycmVjdCBpbXBsZW1lbnRhdGlvbi4KKyAgYm9vbCBpc0RlZmluaXRpb25FeGFjdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gIW1heUJlRGVyZWZpbmVkKCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBnbG9iYWwgaGFzIGFuIGV4YWN0IGRlZmludGlvbi4KKyAgYm9vbCBoYXNFeGFjdERlZmluaXRpb24oKSBjb25zdCB7CisgICAgLy8gV2hpbGUgdGhpcyBjb21wdXRlcyBleGFjdGx5IHRoZSBzYW1lIHRoaW5nIGFzCisgICAgLy8gaXNTdHJvbmdEZWZpbml0aW9uRm9yTGlua2VyLCB0aGUgaW50ZW5kZWQgdXNlcyBhcmUgZGlmZmVyZW50LiAgVGhpcworICAgIC8vIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGhlbHAgZGVjaWRlIGlmIHNwZWNpZmljIGludGVyLXByb2NlZHVyYWwKKyAgICAvLyB0cmFuc2Zvcm1zIGFyZSBjb3JyZWN0LCB3aGlsZSBpc1N0cm9uZ0RlZmluaXRpb25Gb3JMaW5rZXIncyBpbnRlbmRlZCB1c2UKKyAgICAvLyBpcyBpbiBsb3cgbGV2ZWwgY29kZSBnZW5lcmF0aW9uLgorICAgIHJldHVybiAhaXNEZWNsYXJhdGlvbigpICYmIGlzRGVmaW5pdGlvbkV4YWN0KCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBnbG9iYWwncyBkZWZpbml0aW9uIGNhbiBiZSBzdWJzdGl0dXRlZCB3aXRoIGFuCisgIC8vLyAqYXJiaXRyYXJ5KiBkZWZpbml0aW9uIGF0IGxpbmsgdGltZS4gIFdlIGNhbm5vdCBkbyBhbnkgSVBPIG9yIGlubGluaW5pbmcKKyAgLy8vIGFjcm9zcyBpbnRlcnBvc2FibGUgY2FsbCBlZGdlcywgc2luY2UgdGhlIGNhbGxlZSBjYW4gYmUgcmVwbGFjZWQgd2l0aAorICAvLy8gc29tZXRoaW5nIGFyYml0cmFyeSBhdCBsaW5rIHRpbWUuCisgIGJvb2wgaXNJbnRlcnBvc2FibGUoKSBjb25zdCB7IHJldHVybiBpc0ludGVycG9zYWJsZUxpbmthZ2UoZ2V0TGlua2FnZSgpKTsgfQorCisgIGJvb2wgaGFzRXh0ZXJuYWxMaW5rYWdlKCkgY29uc3QgeyByZXR1cm4gaXNFeHRlcm5hbExpbmthZ2UoZ2V0TGlua2FnZSgpKTsgfQorICBib29sIGhhc0F2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlKCkgY29uc3QgeworICAgIHJldHVybiBpc0F2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlKGdldExpbmthZ2UoKSk7CisgIH0KKyAgYm9vbCBoYXNMaW5rT25jZUxpbmthZ2UoKSBjb25zdCB7IHJldHVybiBpc0xpbmtPbmNlTGlua2FnZShnZXRMaW5rYWdlKCkpOyB9CisgIGJvb2wgaGFzTGlua09uY2VPRFJMaW5rYWdlKCkgY29uc3QgeworICAgIHJldHVybiBpc0xpbmtPbmNlT0RSTGlua2FnZShnZXRMaW5rYWdlKCkpOworICB9CisgIGJvb2wgaGFzV2Vha0xpbmthZ2UoKSBjb25zdCB7IHJldHVybiBpc1dlYWtMaW5rYWdlKGdldExpbmthZ2UoKSk7IH0KKyAgYm9vbCBoYXNXZWFrQW55TGlua2FnZSgpIGNvbnN0IHsgcmV0dXJuIGlzV2Vha0FueUxpbmthZ2UoZ2V0TGlua2FnZSgpKTsgfQorICBib29sIGhhc1dlYWtPRFJMaW5rYWdlKCkgY29uc3QgeyByZXR1cm4gaXNXZWFrT0RSTGlua2FnZShnZXRMaW5rYWdlKCkpOyB9CisgIGJvb2wgaGFzQXBwZW5kaW5nTGlua2FnZSgpIGNvbnN0IHsgcmV0dXJuIGlzQXBwZW5kaW5nTGlua2FnZShnZXRMaW5rYWdlKCkpOyB9CisgIGJvb2wgaGFzSW50ZXJuYWxMaW5rYWdlKCkgY29uc3QgeyByZXR1cm4gaXNJbnRlcm5hbExpbmthZ2UoZ2V0TGlua2FnZSgpKTsgfQorICBib29sIGhhc1ByaXZhdGVMaW5rYWdlKCkgY29uc3QgeyByZXR1cm4gaXNQcml2YXRlTGlua2FnZShnZXRMaW5rYWdlKCkpOyB9CisgIGJvb2wgaGFzTG9jYWxMaW5rYWdlKCkgY29uc3QgeyByZXR1cm4gaXNMb2NhbExpbmthZ2UoZ2V0TGlua2FnZSgpKTsgfQorICBib29sIGhhc0V4dGVybmFsV2Vha0xpbmthZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRXh0ZXJuYWxXZWFrTGlua2FnZShnZXRMaW5rYWdlKCkpOworICB9CisgIGJvb2wgaGFzQ29tbW9uTGlua2FnZSgpIGNvbnN0IHsgcmV0dXJuIGlzQ29tbW9uTGlua2FnZShnZXRMaW5rYWdlKCkpOyB9CisgIGJvb2wgaGFzVmFsaWREZWNsYXJhdGlvbkxpbmthZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzVmFsaWREZWNsYXJhdGlvbkxpbmthZ2UoZ2V0TGlua2FnZSgpKTsKKyAgfQorCisgIHZvaWQgc2V0TGlua2FnZShMaW5rYWdlVHlwZXMgTFQpIHsKKyAgICBpZiAoaXNMb2NhbExpbmthZ2UoTFQpKQorICAgICAgVmlzaWJpbGl0eSA9IERlZmF1bHRWaXNpYmlsaXR5OworICAgIExpbmthZ2UgPSBMVDsKKyAgICBtYXliZVNldERzb0xvY2FsKCk7CisgIH0KKyAgTGlua2FnZVR5cGVzIGdldExpbmthZ2UoKSBjb25zdCB7IHJldHVybiBMaW5rYWdlVHlwZXMoTGlua2FnZSk7IH0KKworICBib29sIGlzRGlzY2FyZGFibGVJZlVudXNlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNEaXNjYXJkYWJsZUlmVW51c2VkKGdldExpbmthZ2UoKSk7CisgIH0KKworICBib29sIGlzV2Vha0ZvckxpbmtlcigpIGNvbnN0IHsgcmV0dXJuIGlzV2Vha0ZvckxpbmtlcihnZXRMaW5rYWdlKCkpOyB9CisKK3Byb3RlY3RlZDoKKyAgLy8vIENvcHkgYWxsIGFkZGl0aW9uYWwgYXR0cmlidXRlcyAodGhvc2Ugbm90IG5lZWRlZCB0byBjcmVhdGUgYSBHbG9iYWxWYWx1ZSkKKyAgLy8vIGZyb20gdGhlIEdsb2JhbFZhbHVlIFNyYyB0byB0aGlzIG9uZS4KKyAgdm9pZCBjb3B5QXR0cmlidXRlc0Zyb20oY29uc3QgR2xvYmFsVmFsdWUgKlNyYyk7CisKK3B1YmxpYzoKKyAgLy8vIElmIHRoZSBnaXZlbiBzdHJpbmcgYmVnaW5zIHdpdGggdGhlIEdsb2JhbFZhbHVlIG5hbWUgbWFuZ2xpbmcgZXNjYXBlCisgIC8vLyBjaGFyYWN0ZXIgJ1wxJywgZHJvcCBpdC4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGFwcGxpZXMgYSBzcGVjaWZpYyBtYW5nbGluZyB0aGF0IGlzIHVzZWQgaW4gUEdPIHByb2ZpbGVzLAorICAvLy8gYW1vbmcgb3RoZXIgdGhpbmdzLiBJZiB5b3UncmUgdHJ5aW5nIHRvIGdldCBhIHN5bWJvbCBuYW1lIGZvciBhbgorICAvLy8gYXJiaXRyYXJ5IEdsb2JhbFZhbHVlLCB0aGlzIGlzIG5vdCB0aGUgZnVuY3Rpb24geW91J3JlIGxvb2tpbmcgZm9yOyBzZWUKKyAgLy8vIE1hbmdsZXIuaC4KKyAgc3RhdGljIFN0cmluZ1JlZiBkcm9wTExWTU1hbmdsaW5nRXNjYXBlKFN0cmluZ1JlZiBOYW1lKSB7CisgICAgaWYgKCFOYW1lLmVtcHR5KCkgJiYgTmFtZVswXSA9PSAnXDEnKQorICAgICAgcmV0dXJuIE5hbWUuc3Vic3RyKDEpOworICAgIHJldHVybiBOYW1lOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbW9kaWZpZWQgbmFtZSBmb3IgYSBnbG9iYWwgdmFsdWUgc3VpdGFibGUgdG8gYmUKKyAgLy8vIHVzZWQgYXMgdGhlIGtleSBmb3IgYSBnbG9iYWwgbG9va3VwIChlLmcuIHByb2ZpbGUgb3IgVGhpbkxUTykuCisgIC8vLyBUaGUgdmFsdWUncyBvcmlnaW5hbCBuYW1lIGlzIFxjIE5hbWUgYW5kIGhhcyBsaW5rYWdlIG9mIHR5cGUKKyAgLy8vIFxjIExpbmthZ2UuIFRoZSB2YWx1ZSBpcyBkZWZpbmVkIGluIG1vZHVsZSBcYyBGaWxlTmFtZS4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldEdsb2JhbElkZW50aWZpZXIoU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXMgTGlua2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVOYW1lKTsKKworICAvLy8gUmV0dXJuIHRoZSBtb2RpZmllZCBuYW1lIGZvciB0aGlzIGdsb2JhbCB2YWx1ZSBzdWl0YWJsZSB0byBiZQorICAvLy8gdXNlZCBhcyB0aGUga2V5IGZvciBhIGdsb2JhbCBsb29rdXAgKGUuZy4gcHJvZmlsZSBvciBUaGluTFRPKS4KKyAgc3RkOjpzdHJpbmcgZ2V0R2xvYmFsSWRlbnRpZmllcigpIGNvbnN0OworCisgIC8vLyBEZWNsYXJlIGEgdHlwZSB0byByZXByZXNlbnQgYSBnbG9iYWwgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgZ2xvYmFsIHZhbHVlLgorICAvLy8gVGhpcyBpcyBhIDY0IGJpdHMgaGFzaCB0aGF0IGlzIHVzZWQgYnkgUEdPIGFuZCBUaGluTFRPIHRvIGhhdmUgYSBjb21wYWN0CisgIC8vLyB1bmlxdWUgd2F5IHRvIGlkZW50aWZ5IGEgc3ltYm9sLgorICB1c2luZyBHVUlEID0gdWludDY0X3Q7CisKKyAgLy8vIFJldHVybiBhIDY0LWJpdCBnbG9iYWwgdW5pcXVlIElEIGNvbnN0cnVjdGVkIGZyb20gZ2xvYmFsIHZhbHVlIG5hbWUKKyAgLy8vIChpLmUuIHJldHVybmVkIGJ5IGdldEdsb2JhbElkZW50aWZpZXIoKSkuCisgIHN0YXRpYyBHVUlEIGdldEdVSUQoU3RyaW5nUmVmIEdsb2JhbE5hbWUpIHsgcmV0dXJuIE1ENUhhc2goR2xvYmFsTmFtZSk7IH0KKworICAvLy8gUmV0dXJuIGEgNjQtYml0IGdsb2JhbCB1bmlxdWUgSUQgY29uc3RydWN0ZWQgZnJvbSBnbG9iYWwgdmFsdWUgbmFtZQorICAvLy8gKGkuZS4gcmV0dXJuZWQgYnkgZ2V0R2xvYmFsSWRlbnRpZmllcigpKS4KKyAgR1VJRCBnZXRHVUlEKCkgY29uc3QgeyByZXR1cm4gZ2V0R1VJRChnZXRHbG9iYWxJZGVudGlmaWVyKCkpOyB9CisKKyAgLy8vIEBuYW1lIE1hdGVyaWFsaXphdGlvbgorICAvLy8gTWF0ZXJpYWxpemF0aW9uIGlzIHVzZWQgdG8gY29uc3RydWN0IGZ1bmN0aW9ucyBvbmx5IGFzIHRoZXkncmUgbmVlZGVkLgorICAvLy8gVGhpcworICAvLy8gaXMgdXNlZnVsIHRvIHJlZHVjZSBtZW1vcnkgdXNhZ2UgaW4gTExWTSBvciBwYXJzaW5nIHdvcmsgZG9uZSBieSB0aGUKKyAgLy8vIEJpdGNvZGVSZWFkZXIgdG8gbG9hZCB0aGUgTW9kdWxlLgorICAvLy8gQHsKKworICAvLy8gSWYgdGhpcyBmdW5jdGlvbidzIE1vZHVsZSBpcyBiZWluZyBsYXppbHkgc3RyZWFtZWQgaW4gZnVuY3Rpb25zIGZyb20gZGlzaworICAvLy8gb3Igc29tZSBvdGhlciBzb3VyY2UsIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRvIHNlZSBpZiB0aGUKKyAgLy8vIGZ1bmN0aW9uIGhhcyBiZWVuIHJlYWQgaW4geWV0IG9yIG5vdC4KKyAgYm9vbCBpc01hdGVyaWFsaXphYmxlKCkgY29uc3Q7CisKKyAgLy8vIE1ha2Ugc3VyZSB0aGlzIEdsb2JhbFZhbHVlIGlzIGZ1bGx5IHJlYWQuCisgIEVycm9yIG1hdGVyaWFsaXplKCk7CisKKy8vLyBAfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgcHJpbWFyeSBkZWZpbml0aW9uIG9mIHRoaXMgZ2xvYmFsIHZhbHVlIGlzIG91dHNpZGUgb2YKKyAgLy8vIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uIHVuaXQuCisgIGJvb2wgaXNEZWNsYXJhdGlvbigpIGNvbnN0OworCisgIGJvb2wgaXNEZWNsYXJhdGlvbkZvckxpbmtlcigpIGNvbnN0IHsKKyAgICBpZiAoaGFzQXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2UoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGlzRGVjbGFyYXRpb24oKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBnbG9iYWwncyBkZWZpbml0aW9uIHdpbGwgYmUgdGhlIG9uZSBjaG9zZW4gYnkgdGhlCisgIC8vLyBsaW5rZXIuCisgIC8vLworICAvLy8gTkIhIElkZWFsbHkgdGhpcyBzaG91bGQgbm90IGJlIHVzZWQgYXQgdGhlIElSIGxldmVsIGF0IGFsbC4gIElmIHlvdSdyZQorICAvLy8gaW50ZXJlc3RlZCBpbiBvcHRpbWl6YXRpb24gY29uc3RyYWludHMgaW1wbGllZCBieSB0aGUgbGlua2VyJ3MgYWJpbGl0eSB0bworICAvLy8gY2hvb3NlIGFuIGltcGxlbWVudGF0aW9uLCBwcmVmZXIgdXNpbmcgXGMgaGFzRXhhY3REZWZpbml0aW9uLgorICBib29sIGlzU3Ryb25nRGVmaW5pdGlvbkZvckxpbmtlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gIShpc0RlY2xhcmF0aW9uRm9yTGlua2VyKCkgfHwgaXNXZWFrRm9yTGlua2VyKCkpOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBhbGlnbm1lbnQgb2YgdGhlIHZhbHVlIGNhbiBiZSB1bmlsYXRlcmFsbHkKKyAgLy8gaW5jcmVhc2VkLgorICBib29sIGNhbkluY3JlYXNlQWxpZ25tZW50KCkgY29uc3Q7CisKKyAgY29uc3QgR2xvYmFsT2JqZWN0ICpnZXRCYXNlT2JqZWN0KCkgY29uc3Q7CisgIEdsb2JhbE9iamVjdCAqZ2V0QmFzZU9iamVjdCgpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxHbG9iYWxPYmplY3QgKj4oCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdsb2JhbFZhbHVlICo+KHRoaXMpLT5nZXRCYXNlT2JqZWN0KCkpOworICB9CisKKyAgLy8vIFJldHVybnMgd2hldGhlciB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGFic29sdXRlIHN5bWJvbC4KKyAgYm9vbCBpc0Fic29sdXRlU3ltYm9sUmVmKCkgY29uc3Q7CisKKyAgLy8vIElmIHRoaXMgaXMgYW4gYWJzb2x1dGUgc3ltYm9sIHJlZmVyZW5jZSwgcmV0dXJucyB0aGUgcmFuZ2Ugb2YgdGhlIHN5bWJvbCwKKyAgLy8vIG90aGVyd2lzZSByZXR1cm5zIE5vbmUuCisgIE9wdGlvbmFsPENvbnN0YW50UmFuZ2U+IGdldEFic29sdXRlU3ltYm9sUmFuZ2UoKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBtb2R1bGUsIGJ1dCBkb2VzIG5vdCBkZWxldGUKKyAgLy8vIGl0LgorICB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsKKworICAvLy8gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBtb2R1bGUgYW5kIGRlbGV0ZXMgaXQuCisgIHZvaWQgZXJhc2VGcm9tUGFyZW50KCk7CisKKyAgLy8vIEdldCB0aGUgbW9kdWxlIHRoYXQgdGhpcyBnbG9iYWwgdmFsdWUgaXMgY29udGFpbmVkIGluc2lkZSBvZi4uLgorICBNb2R1bGUgKmdldFBhcmVudCgpIHsgcmV0dXJuIFBhcmVudDsgfQorICBjb25zdCBNb2R1bGUgKmdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIFBhcmVudDsgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpGdW5jdGlvblZhbCB8fAorICAgICAgICAgICBWLT5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6Okdsb2JhbFZhcmlhYmxlVmFsIHx8CisgICAgICAgICAgIFYtPmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6R2xvYmFsQWxpYXNWYWwgfHwKKyAgICAgICAgICAgVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpHbG9iYWxJRnVuY1ZhbDsKKyAgfQorCisgIC8vLyBUcnVlIGlmIEdWIGNhbiBiZSBsZWZ0IG91dCBvZiB0aGUgb2JqZWN0IHN5bWJvbCB0YWJsZS4gVGhpcyBpcyB0aGUgY2FzZQorICAvLy8gZm9yIGxpbmtvbmNlX29kciB2YWx1ZXMgd2hvc2UgYWRkcmVzcyBpcyBub3Qgc2lnbmlmaWNhbnQuIFdoaWxlIGxlZ2FsLCBpdAorICAvLy8gaXMgbm90IG5vcm1hbGx5IHByb2ZpdGFibGUgdG8gb21pdCB0aGVtIGZyb20gdGhlIC5vIHN5bWJvbCB0YWJsZS4gVXNpbmcKKyAgLy8vIHRoaXMgYW5hbHlzaXMgbWFrZXMgc2Vuc2Ugd2hlbiB0aGUgaW5mb3JtYXRpb24gY2FuIGJlIHBhc3NlZCBkb3duIHRvIHRoZQorICAvLy8gbGlua2VyIG9yIHdlIGFyZSBpbiBMVE8uCisgIGJvb2wgY2FuQmVPbWl0dGVkRnJvbVN5bWJvbFRhYmxlKCkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9HTE9CQUxWQUxVRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0dsb2JhbFZhcmlhYmxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0dsb2JhbFZhcmlhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiOWVjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvR2xvYmFsVmFyaWFibGUuaApAQCAtMCwwICsxLDI2NSBAQAorLy89PT0tLSBsbHZtL0dsb2JhbFZhcmlhYmxlLmggLSBHbG9iYWxWYXJpYWJsZSBjbGFzcyAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBHbG9iYWxWYXJpYWJsZSBjbGFzcywgd2hpY2gKKy8vIHJlcHJlc2VudHMgYSBzaW5nbGUgZ2xvYmFsIHZhcmlhYmxlIChvciBjb25zdGFudCkgaW4gdGhlIFZNLgorLy8KKy8vIEdsb2JhbCB2YXJpYWJsZXMgYXJlIGNvbnN0YW50IHBvaW50ZXJzIHRoYXQgcmVmZXIgdG8gaHVua3Mgb2Ygc3BhY2UgdGhhdCBhcmUKKy8vIGFsbG9jYXRlZCBieSBlaXRoZXIgdGhlIFZNLCBvciBieSB0aGUgbGlua2VyIGluIGEgc3RhdGljIGNvbXBpbGVyLiAgQSBnbG9iYWwKKy8vIHZhcmlhYmxlIG1heSBoYXZlIGFuIGluaXRpYWwgdmFsdWUsIHdoaWNoIGlzIGNvcGllZCBpbnRvIHRoZSBleGVjdXRhYmxlcyAuZGF0YQorLy8gYXJlYS4gIEdsb2JhbCBDb25zdGFudHMgYXJlIHJlcXVpcmVkIHRvIGhhdmUgaW5pdGlhbGl6ZXJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9HTE9CQUxWQVJJQUJMRV9ICisjZGVmaW5lIExMVk1fSVJfR0xPQkFMVkFSSUFCTEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlclVuaW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9ub2RlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9HbG9iYWxPYmplY3QuaCIKKyNpbmNsdWRlICJsbHZtL0lSL09wZXJhbmRUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIENvbnN0YW50OworY2xhc3MgTW9kdWxlOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVTdWJDbGFzcz4gY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzOworY2xhc3MgRElHbG9iYWxWYXJpYWJsZTsKK2NsYXNzIERJR2xvYmFsVmFyaWFibGVFeHByZXNzaW9uOworCitjbGFzcyBHbG9iYWxWYXJpYWJsZSA6IHB1YmxpYyBHbG9iYWxPYmplY3QsIHB1YmxpYyBpbGlzdF9ub2RlPEdsb2JhbFZhcmlhYmxlPiB7CisgIGZyaWVuZCBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8R2xvYmFsVmFyaWFibGU+OworCisgIEF0dHJpYnV0ZVNldCBBdHRyczsKKyAgYm9vbCBpc0NvbnN0YW50R2xvYmFsIDogMTsgICAgICAgICAgICAgICAgICAgLy8gSXMgdGhpcyBhIGdsb2JhbCBjb25zdGFudD8KKyAgYm9vbCBpc0V4dGVybmFsbHlJbml0aWFsaXplZENvbnN0YW50IDogMTsgICAgLy8gSXMgdGhpcyBhIGdsb2JhbCB3aG9zZSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gY2hhbmdlIGZyb20gaXRzIGluaXRpYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgYmVmb3JlIGdsb2JhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplcnMgYXJlIHJ1bj8KKworcHVibGljOgorICAvLy8gR2xvYmFsVmFyaWFibGUgY3RvciAtIElmIGEgcGFyZW50IG1vZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBnbG9iYWwgaXMKKyAgLy8vIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgaW50byB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgbW9kdWxlcyBnbG9iYWwgbGlzdC4KKyAgR2xvYmFsVmFyaWFibGUoVHlwZSAqVHksIGJvb2wgaXNDb25zdGFudCwgTGlua2FnZVR5cGVzIExpbmthZ2UsCisgICAgICAgICAgICAgICAgIENvbnN0YW50ICpJbml0aWFsaXplciA9IG51bGxwdHIsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgIFRocmVhZExvY2FsTW9kZSA9IE5vdFRocmVhZExvY2FsLCB1bnNpZ25lZCBBZGRyZXNzU3BhY2UgPSAwLAorICAgICAgICAgICAgICAgICBib29sIGlzRXh0ZXJuYWxseUluaXRpYWxpemVkID0gZmFsc2UpOworICAvLy8gR2xvYmFsVmFyaWFibGUgY3RvciAtIFRoaXMgY3JlYXRlcyBhIGdsb2JhbCBhbmQgaW5zZXJ0cyBpdCBiZWZvcmUgdGhlCisgIC8vLyBzcGVjaWZpZWQgb3RoZXIgZ2xvYmFsLgorICBHbG9iYWxWYXJpYWJsZShNb2R1bGUgJk0sIFR5cGUgKlR5LCBib29sIGlzQ29uc3RhbnQsCisgICAgICAgICAgICAgICAgIExpbmthZ2VUeXBlcyBMaW5rYWdlLCBDb25zdGFudCAqSW5pdGlhbGl6ZXIsCisgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsIEdsb2JhbFZhcmlhYmxlICpJbnNlcnRCZWZvcmUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICBUaHJlYWRMb2NhbE1vZGUgPSBOb3RUaHJlYWRMb2NhbCwgdW5zaWduZWQgQWRkcmVzc1NwYWNlID0gMCwKKyAgICAgICAgICAgICAgICAgYm9vbCBpc0V4dGVybmFsbHlJbml0aWFsaXplZCA9IGZhbHNlKTsKKyAgR2xvYmFsVmFyaWFibGUoY29uc3QgR2xvYmFsVmFyaWFibGUgJikgPSBkZWxldGU7CisgIEdsb2JhbFZhcmlhYmxlICZvcGVyYXRvcj0oY29uc3QgR2xvYmFsVmFyaWFibGUgJikgPSBkZWxldGU7CisKKyAgfkdsb2JhbFZhcmlhYmxlKCkgeworICAgIGRyb3BBbGxSZWZlcmVuY2VzKCk7CisgIH0KKworICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSBvbmUgb3BlcmFuZAorICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDEpOworICB9CisKKyAgLy8gZGVsZXRlIHNwYWNlIGZvciBleGFjdGx5IG9uZSBvcGVyYW5kIGFzIGNyZWF0ZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgbmV3IG9wZXJhdG9yCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKnB0cil7CisgICAgYXNzZXJ0KHB0ciAhPSBudWxscHRyICYmICJtdXN0IG5vdCBiZSBudWxscHRyIik7CisgICAgVXNlciAqT2JqID0gc3RhdGljX2Nhc3Q8VXNlciAqPihwdHIpOworICAgIC8vIE51bWJlciBvZiBvcGVyYW5kcyBjYW4gYmUgc2V0IHRvIDAgYWZ0ZXIgY29uc3RydWN0aW9uIGFuZCBpbml0aWFsaXphdGlvbi4gTWFrZSBzdXJlCisgICAgLy8gdGhhdCBudW1iZXIgb2Ygb3BlcmFuZHMgaXMgcmVzZXQgdG8gMSwgYXMgdGhpcyBpcyBuZWVkZWQgaW4gVXNlcjo6b3BlcmF0b3IgZGVsZXRlCisgICAgT2JqLT5zZXRHbG9iYWxWYXJpYWJsZU51bU9wZXJhbmRzKDEpOworICAgIFVzZXI6Om9wZXJhdG9yIGRlbGV0ZShPYmopOworICB9CisKKyAgLy8vIFByb3ZpZGUgZmFzdCBvcGVyYW5kIGFjY2Vzc29ycworICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLy8gRGVmaW5pdGlvbnMgaGF2ZSBpbml0aWFsaXplcnMsIGRlY2xhcmF0aW9ucyBkb24ndC4KKyAgLy8vCisgIGlubGluZSBib29sIGhhc0luaXRpYWxpemVyKCkgY29uc3QgeyByZXR1cm4gIWlzRGVjbGFyYXRpb24oKTsgfQorCisgIC8vLyBoYXNEZWZpbml0aXZlSW5pdGlhbGl6ZXIgLSBXaGV0aGVyIHRoZSBnbG9iYWwgdmFyaWFibGUgaGFzIGFuIGluaXRpYWxpemVyLAorICAvLy8gYW5kIGFueSBvdGhlciBpbnN0YW5jZXMgb2YgdGhlIGdsb2JhbCAodGhpcyBjYW4gaGFwcGVuIGR1ZSB0byB3ZWFrCisgIC8vLyBsaW5rYWdlKSBhcmUgZ3VhcmFudGVlZCB0byBoYXZlIHRoZSBzYW1lIGluaXRpYWxpemVyLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBpZiB5b3Ugd2FudCB0byB0cmFuc2Zvcm0gYSBnbG9iYWwsIHlvdSBtdXN0IHVzZQorICAvLy8gaGFzVW5pcXVlSW5pdGlhbGl6ZXIoKSBpbnN0ZWFkLCBiZWNhdXNlIG9mIHRoZSAqX29kciBsaW5rYWdlIHR5cGUuCisgIC8vLworICAvLy8gRXhhbXBsZToKKyAgLy8vCisgIC8vLyBAYSA9IGdsb2JhbCBTb21lVHlwZSogbnVsbCAtIEluaXRpYWxpemVyIGlzIGJvdGggZGVmaW5pdGl2ZSBhbmQgdW5pcXVlLgorICAvLy8KKyAgLy8vIEBiID0gZ2xvYmFsIHdlYWsgU29tZVR5cGUqIG51bGwgLSBJbml0aWFsaXplciBpcyBuZWl0aGVyIGRlZmluaXRpdmUgbm9yCisgIC8vLyB1bmlxdWUuCisgIC8vLworICAvLy8gQGMgPSBnbG9iYWwgd2Vha19vZHIgU29tZVR5cGUqIG51bGwgLSBJbml0aWFsaXplciBpcyBkZWZpbml0aXZlLCBidXQgbm90CisgIC8vLyB1bmlxdWUuCisgIGlubGluZSBib29sIGhhc0RlZmluaXRpdmVJbml0aWFsaXplcigpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzSW5pdGlhbGl6ZXIoKSAmJgorICAgICAgLy8gVGhlIGluaXRpYWxpemVyIG9mIGEgZ2xvYmFsIHZhcmlhYmxlIG1heSBjaGFuZ2UgdG8gc29tZXRoaW5nIGFyYml0cmFyeQorICAgICAgLy8gYXQgbGluayB0aW1lLgorICAgICAgIWlzSW50ZXJwb3NhYmxlKCkgJiYKKyAgICAgIC8vIFRoZSBpbml0aWFsaXplciBvZiBhIGdsb2JhbCB2YXJpYWJsZSB3aXRoIHRoZSBleHRlcm5hbGx5X2luaXRpYWxpemVkCisgICAgICAvLyBtYXJrZXIgbWF5IGNoYW5nZSBhdCBydW50aW1lIGJlZm9yZSBDKysgaW5pdGlhbGl6ZXJzIGFyZSBldmFsdWF0ZWQuCisgICAgICAhaXNFeHRlcm5hbGx5SW5pdGlhbGl6ZWQoKTsKKyAgfQorCisgIC8vLyBoYXNVbmlxdWVJbml0aWFsaXplciAtIFdoZXRoZXIgdGhlIGdsb2JhbCB2YXJpYWJsZSBoYXMgYW4gaW5pdGlhbGl6ZXIsIGFuZAorICAvLy8gYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgaW5pdGlhbGl6ZXIgd2lsbCB0dXJuIHVwIGluIHRoZSBmaW5hbCBleGVjdXRhYmxlLgorICBpbmxpbmUgYm9vbCBoYXNVbmlxdWVJbml0aWFsaXplcigpIGNvbnN0IHsKKyAgICByZXR1cm4KKyAgICAgICAgLy8gV2UgbmVlZCB0byBiZSBzdXJlIHRoaXMgaXMgdGhlIGRlZmluaXRpb24gdGhhdCB3aWxsIGFjdHVhbGx5IGJlIHVzZWQKKyAgICAgICAgaXNTdHJvbmdEZWZpbml0aW9uRm9yTGlua2VyKCkgJiYKKyAgICAgICAgLy8gSXQgaXMgbm90IHNhZmUgdG8gbW9kaWZ5IGluaXRpYWxpemVycyBvZiBnbG9iYWwgdmFyaWFibGVzIHdpdGggdGhlCisgICAgICAgIC8vIGV4dGVybmFsX2luaXRpYWxpemVyIG1hcmtlciBzaW5jZSB0aGUgdmFsdWUgbWF5IGJlIGNoYW5nZWQgYXQgcnVudGltZQorICAgICAgICAvLyBiZWZvcmUgQysrIGluaXRpYWxpemVycyBhcmUgZXZhbHVhdGVkLgorICAgICAgICAhaXNFeHRlcm5hbGx5SW5pdGlhbGl6ZWQoKTsKKyAgfQorCisgIC8vLyBnZXRJbml0aWFsaXplciAtIFJldHVybiB0aGUgaW5pdGlhbGl6ZXIgZm9yIHRoaXMgZ2xvYmFsIHZhcmlhYmxlLiAgSXQgaXMKKyAgLy8vIGlsbGVnYWwgdG8gY2FsbCB0aGlzIG1ldGhvZCBpZiB0aGUgZ2xvYmFsIGlzIGV4dGVybmFsLCBiZWNhdXNlIHdlIGNhbm5vdAorICAvLy8gdGVsbCB3aGF0IHRoZSB2YWx1ZSBpcyBpbml0aWFsaXplZCB0byEKKyAgLy8vCisgIGlubGluZSBjb25zdCBDb25zdGFudCAqZ2V0SW5pdGlhbGl6ZXIoKSBjb25zdCB7CisgICAgYXNzZXJ0KGhhc0luaXRpYWxpemVyKCkgJiYgIkdWIGRvZXNuJ3QgaGF2ZSBpbml0aWFsaXplciEiKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q29uc3RhbnQqPihPcDwwPigpLmdldCgpKTsKKyAgfQorICBpbmxpbmUgQ29uc3RhbnQgKmdldEluaXRpYWxpemVyKCkgeworICAgIGFzc2VydChoYXNJbml0aWFsaXplcigpICYmICJHViBkb2Vzbid0IGhhdmUgaW5pdGlhbGl6ZXIhIik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PENvbnN0YW50Kj4oT3A8MD4oKS5nZXQoKSk7CisgIH0KKyAgLy8vIHNldEluaXRpYWxpemVyIC0gU2V0cyB0aGUgaW5pdGlhbGl6ZXIgZm9yIHRoaXMgZ2xvYmFsIHZhcmlhYmxlLCByZW1vdmluZworICAvLy8gYW55IGV4aXN0aW5nIGluaXRpYWxpemVyIGlmIEluaXRWYWw9PU5VTEwuICBJZiB0aGlzIEdWIGhhcyB0eXBlIFQqLCB0aGUKKyAgLy8vIGluaXRpYWxpemVyIG11c3QgaGF2ZSB0eXBlIFQuCisgIHZvaWQgc2V0SW5pdGlhbGl6ZXIoQ29uc3RhbnQgKkluaXRWYWwpOworCisgIC8vLyBJZiB0aGUgdmFsdWUgaXMgYSBnbG9iYWwgY29uc3RhbnQsIGl0cyB2YWx1ZSBpcyBpbW11dGFibGUgdGhyb3VnaG91dCB0aGUKKyAgLy8vIHJ1bnRpbWUgZXhlY3V0aW9uIG9mIHRoZSBwcm9ncmFtLiAgQXNzaWduaW5nIGEgdmFsdWUgaW50byB0aGUgY29uc3RhbnQKKyAgLy8vIGxlYWRzIHRvIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgLy8vCisgIGJvb2wgaXNDb25zdGFudCgpIGNvbnN0IHsgcmV0dXJuIGlzQ29uc3RhbnRHbG9iYWw7IH0KKyAgdm9pZCBzZXRDb25zdGFudChib29sIFZhbCkgeyBpc0NvbnN0YW50R2xvYmFsID0gVmFsOyB9CisKKyAgYm9vbCBpc0V4dGVybmFsbHlJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNFeHRlcm5hbGx5SW5pdGlhbGl6ZWRDb25zdGFudDsKKyAgfQorICB2b2lkIHNldEV4dGVybmFsbHlJbml0aWFsaXplZChib29sIFZhbCkgeworICAgIGlzRXh0ZXJuYWxseUluaXRpYWxpemVkQ29uc3RhbnQgPSBWYWw7CisgIH0KKworICAvLy8gY29weUF0dHJpYnV0ZXNGcm9tIC0gY29weSBhbGwgYWRkaXRpb25hbCBhdHRyaWJ1dGVzICh0aG9zZSBub3QgbmVlZGVkIHRvCisgIC8vLyBjcmVhdGUgYSBHbG9iYWxWYXJpYWJsZSkgZnJvbSB0aGUgR2xvYmFsVmFyaWFibGUgU3JjIHRvIHRoaXMgb25lLgorICB2b2lkIGNvcHlBdHRyaWJ1dGVzRnJvbShjb25zdCBHbG9iYWxWYXJpYWJsZSAqU3JjKTsKKworICAvLy8gcmVtb3ZlRnJvbVBhcmVudCAtIFRoaXMgbWV0aG9kIHVubGlua3MgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgbW9kdWxlLAorICAvLy8gYnV0IGRvZXMgbm90IGRlbGV0ZSBpdC4KKyAgLy8vCisgIHZvaWQgcmVtb3ZlRnJvbVBhcmVudCgpOworCisgIC8vLyBlcmFzZUZyb21QYXJlbnQgLSBUaGlzIG1ldGhvZCB1bmxpbmtzICd0aGlzJyBmcm9tIHRoZSBjb250YWluaW5nIG1vZHVsZQorICAvLy8gYW5kIGRlbGV0ZXMgaXQuCisgIC8vLworICB2b2lkIGVyYXNlRnJvbVBhcmVudCgpOworCisgIC8vLyBEcm9wIGFsbCByZWZlcmVuY2VzIGluIHByZXBhcmF0aW9uIHRvIGRlc3Ryb3kgdGhlIEdsb2JhbFZhcmlhYmxlLiBUaGlzCisgIC8vLyBkcm9wcyBub3Qgb25seSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBpbml0aWFsaXplciBidXQgYWxzbyB0byBhbnkgbWV0YWRhdGEuCisgIHZvaWQgZHJvcEFsbFJlZmVyZW5jZXMoKTsKKworICAvLy8gQXR0YWNoIGEgRElHbG9iYWxWYXJpYWJsZUV4cHJlc3Npb24uCisgIHZvaWQgYWRkRGVidWdJbmZvKERJR2xvYmFsVmFyaWFibGVFeHByZXNzaW9uICpHVik7CisKKyAgLy8vIEZpbGwgdGhlIHZlY3RvciB3aXRoIGFsbCBkZWJ1ZyBpbmZvIGF0dGFjaGVtZW50cy4KKyAgdm9pZCBnZXREZWJ1Z0luZm8oU21hbGxWZWN0b3JJbXBsPERJR2xvYmFsVmFyaWFibGVFeHByZXNzaW9uICo+ICZHVnMpIGNvbnN0OworCisgIC8vLyBBZGQgYXR0cmlidXRlIHRvIHRoaXMgZ2xvYmFsLgorICB2b2lkIGFkZEF0dHJpYnV0ZShBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIHsKKyAgICBBdHRycyA9IEF0dHJzLmFkZEF0dHJpYnV0ZShnZXRDb250ZXh0KCksIEtpbmQpOworICB9CisKKyAgLy8vIEFkZCBhdHRyaWJ1dGUgdG8gdGhpcyBnbG9iYWwuCisgIHZvaWQgYWRkQXR0cmlidXRlKFN0cmluZ1JlZiBLaW5kLCBTdHJpbmdSZWYgVmFsID0gU3RyaW5nUmVmKCkpIHsKKyAgICBBdHRycyA9IEF0dHJzLmFkZEF0dHJpYnV0ZShnZXRDb250ZXh0KCksIEtpbmQsIFZhbCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGF0dHJpYnV0ZSBleGlzdHMuCisgIGJvb2wgaGFzQXR0cmlidXRlKEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3QgeworICAgIHJldHVybiBBdHRycy5oYXNBdHRyaWJ1dGUoS2luZCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGF0dHJpYnV0ZSBleGlzdHMuCisgIGJvb2wgaGFzQXR0cmlidXRlKFN0cmluZ1JlZiBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJzLmhhc0F0dHJpYnV0ZShLaW5kKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbnkgYXR0cmlidXRlcyBleGlzdC4KKyAgYm9vbCBoYXNBdHRyaWJ1dGVzKCkgY29uc3QgeworICAgIHJldHVybiBBdHRycy5oYXNBdHRyaWJ1dGVzKCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBhdHRyaWJ1dGUgb2JqZWN0LgorICBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3QgeworICAgIHJldHVybiBBdHRycy5nZXRBdHRyaWJ1dGUoS2luZCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBhdHRyaWJ1dGUgb2JqZWN0LgorICBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKFN0cmluZ1JlZiBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJzLmdldEF0dHJpYnV0ZShLaW5kKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBzZXQgZm9yIHRoaXMgZ2xvYmFsCisgIEF0dHJpYnV0ZVNldCBnZXRBdHRyaWJ1dGVzKCkgY29uc3QgeworICAgIHJldHVybiBBdHRyczsKKyAgfQorCisgIC8vLyBSZXR1cm4gYXR0cmlidXRlIHNldCBhcyBsaXN0IHdpdGggaW5kZXguCisgIC8vLyBGSVhNRTogVGhpcyBtYXkgbm90IGJlIHJlcXVpcmVkIG9uY2UgVmFsdWVFbnVtZXJhdG9ycworICAvLy8gaW4gYml0Y29kZS13cml0ZXIgY2FuIGVudW1lcmF0ZSBhdHRyaWJ1dGUtc2V0LgorICBBdHRyaWJ1dGVMaXN0IGdldEF0dHJpYnV0ZXNBc0xpc3QodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsKKyAgICBpZiAoIWhhc0F0dHJpYnV0ZXMoKSkKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0KCk7CisgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCBBdHRyaWJ1dGVTZXQ+IEFTWzFdID0ge3tpbmRleCwgQXR0cnN9fTsKKyAgICByZXR1cm4gQXR0cmlidXRlTGlzdDo6Z2V0KGdldENvbnRleHQoKSwgQVMpOworICB9CisKKyAgLy8vIFNldCBhdHRyaWJ1dGUgbGlzdCBmb3IgdGhpcyBnbG9iYWwKKyAgdm9pZCBzZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZVNldCBBKSB7CisgICAgQXR0cnMgPSBBOworICB9CisKKyAgLy8vIENoZWNrIGlmIHNlY3Rpb24gbmFtZSBpcyBwcmVzZW50CisgIGJvb2wgaGFzSW1wbGljaXRTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBnZXRBdHRyaWJ1dGVzKCkuaGFzQXR0cmlidXRlKCJic3Mtc2VjdGlvbiIpIHx8CisgICAgICAgICAgIGdldEF0dHJpYnV0ZXMoKS5oYXNBdHRyaWJ1dGUoImRhdGEtc2VjdGlvbiIpIHx8CisgICAgICAgICAgIGdldEF0dHJpYnV0ZXMoKS5oYXNBdHRyaWJ1dGUoInJvZGF0YS1zZWN0aW9uIik7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6R2xvYmFsVmFyaWFibGVWYWw7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxHbG9iYWxWYXJpYWJsZT4gOgorICBwdWJsaWMgT3B0aW9uYWxPcGVyYW5kVHJhaXRzPEdsb2JhbFZhcmlhYmxlPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoR2xvYmFsVmFyaWFibGUsIFZhbHVlKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9HTE9CQUxWQVJJQUJMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0lSQnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JUkJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDY1NDRhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JUkJ1aWxkZXIuaApAQCAtMCwwICsxLDIxMTUgQEAKKy8vPT09LSBsbHZtL0lSQnVpbGRlci5oIC0gQnVpbGRlciBmb3IgTExWTSBJbnN0cnVjdGlvbnMgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIElSQnVpbGRlciBjbGFzcywgd2hpY2ggaXMgdXNlZCBhcyBhIGNvbnZlbmllbnQgd2F5CisvLyB0byBjcmVhdGUgTExWTSBpbnN0cnVjdGlvbnMgd2l0aCBhIGNvbnNpc3RlbnQgYW5kIHNpbXBsaWZpZWQgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9JUkJVSUxERVJfSAorI2RlZmluZSBMTFZNX0lSX0lSQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtLWMvVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50Rm9sZGVyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RhdGFMYXlvdXQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RlYnVnTG9jLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvT3BlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BdG9taWNPcmRlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DQmluZGluZ1dyYXBwaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQVBJbnQ7CitjbGFzcyBNRE5vZGU7CitjbGFzcyBVc2U7CisKKy8vLyBcYnJpZWYgVGhpcyBwcm92aWRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSVJCdWlsZGVyCisvLy8gJ0luc2VydEhlbHBlcicgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyIGFuIGluc3RydWN0aW9uIGlzIGNyZWF0ZWQgYnkKKy8vLyBJUkJ1aWxkZXIgYW5kIG5lZWRzIHRvIGJlIGluc2VydGVkLgorLy8vCisvLy8gQnkgZGVmYXVsdCwgdGhpcyBpbnNlcnRzIHRoZSBpbnN0cnVjdGlvbiBhdCB0aGUgaW5zZXJ0aW9uIHBvaW50LgorY2xhc3MgSVJCdWlsZGVyRGVmYXVsdEluc2VydGVyIHsKK3Byb3RlY3RlZDoKKyAgdm9pZCBJbnNlcnRIZWxwZXIoSW5zdHJ1Y3Rpb24gKkksIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpCQiwgQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UHQpIGNvbnN0IHsKKyAgICBpZiAoQkIpIEJCLT5nZXRJbnN0TGlzdCgpLmluc2VydChJbnNlcnRQdCwgSSk7CisgICAgSS0+c2V0TmFtZShOYW1lKTsKKyAgfQorfTsKKworLy8vIFByb3ZpZGVzIGFuICdJbnNlcnRIZWxwZXInIHRoYXQgY2FsbHMgYSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrIGFmdGVyCisvLy8gcGVyZm9ybWluZyB0aGUgZGVmYXVsdCBpbnNlcnRpb24uCitjbGFzcyBJUkJ1aWxkZXJDYWxsYmFja0luc2VydGVyIDogSVJCdWlsZGVyRGVmYXVsdEluc2VydGVyIHsKKyAgc3RkOjpmdW5jdGlvbjx2b2lkKEluc3RydWN0aW9uICopPiBDYWxsYmFjazsKKworcHVibGljOgorICBJUkJ1aWxkZXJDYWxsYmFja0luc2VydGVyKHN0ZDo6ZnVuY3Rpb248dm9pZChJbnN0cnVjdGlvbiAqKT4gQ2FsbGJhY2spCisgICAgICA6IENhbGxiYWNrKHN0ZDo6bW92ZShDYWxsYmFjaykpIHt9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBJbnNlcnRIZWxwZXIoSW5zdHJ1Y3Rpb24gKkksIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpCQiwgQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UHQpIGNvbnN0IHsKKyAgICBJUkJ1aWxkZXJEZWZhdWx0SW5zZXJ0ZXI6Okluc2VydEhlbHBlcihJLCBOYW1lLCBCQiwgSW5zZXJ0UHQpOworICAgIENhbGxiYWNrKEkpOworICB9Cit9OworCisvLy8gXGJyaWVmIENvbW1vbiBiYXNlIGNsYXNzIHNoYXJlZCBhbW9uZyB2YXJpb3VzIElSQnVpbGRlcnMuCitjbGFzcyBJUkJ1aWxkZXJCYXNlIHsKKyAgRGVidWdMb2MgQ3VyRGJnTG9jYXRpb247CisKK3Byb3RlY3RlZDoKKyAgQmFzaWNCbG9jayAqQkI7CisgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEluc2VydFB0OworICBMTFZNQ29udGV4dCAmQ29udGV4dDsKKworICBNRE5vZGUgKkRlZmF1bHRGUE1hdGhUYWc7CisgIEZhc3RNYXRoRmxhZ3MgRk1GOworCisgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IERlZmF1bHRPcGVyYW5kQnVuZGxlczsKKworcHVibGljOgorICBJUkJ1aWxkZXJCYXNlKExMVk1Db250ZXh0ICZjb250ZXh0LCBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gT3BCdW5kbGVzID0gTm9uZSkKKyAgICAgIDogQ29udGV4dChjb250ZXh0KSwgRGVmYXVsdEZQTWF0aFRhZyhGUE1hdGhUYWcpLAorICAgICAgICBEZWZhdWx0T3BlcmFuZEJ1bmRsZXMoT3BCdW5kbGVzKSB7CisgICAgQ2xlYXJJbnNlcnRpb25Qb2ludCgpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEJ1aWxkZXIgY29uZmlndXJhdGlvbiBtZXRob2RzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgQ2xlYXIgdGhlIGluc2VydGlvbiBwb2ludDogY3JlYXRlZCBpbnN0cnVjdGlvbnMgd2lsbCBub3QgYmUKKyAgLy8vIGluc2VydGVkIGludG8gYSBibG9jay4KKyAgdm9pZCBDbGVhckluc2VydGlvblBvaW50KCkgeworICAgIEJCID0gbnVsbHB0cjsKKyAgICBJbnNlcnRQdCA9IEJhc2ljQmxvY2s6Oml0ZXJhdG9yKCk7CisgIH0KKworICBCYXNpY0Jsb2NrICpHZXRJbnNlcnRCbG9jaygpIGNvbnN0IHsgcmV0dXJuIEJCOyB9CisgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEdldEluc2VydFBvaW50KCkgY29uc3QgeyByZXR1cm4gSW5zZXJ0UHQ7IH0KKyAgTExWTUNvbnRleHQgJmdldENvbnRleHQoKSBjb25zdCB7IHJldHVybiBDb250ZXh0OyB9CisKKyAgLy8vIFxicmllZiBUaGlzIHNwZWNpZmllcyB0aGF0IGNyZWF0ZWQgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBhcHBlbmRlZCB0byB0aGUKKyAgLy8vIGVuZCBvZiB0aGUgc3BlY2lmaWVkIGJsb2NrLgorICB2b2lkIFNldEluc2VydFBvaW50KEJhc2ljQmxvY2sgKlRoZUJCKSB7CisgICAgQkIgPSBUaGVCQjsKKyAgICBJbnNlcnRQdCA9IEJCLT5lbmQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGhpcyBzcGVjaWZpZXMgdGhhdCBjcmVhdGVkIGluc3RydWN0aW9ucyBzaG91bGQgYmUgaW5zZXJ0ZWQgYmVmb3JlCisgIC8vLyB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLgorICB2b2lkIFNldEluc2VydFBvaW50KEluc3RydWN0aW9uICpJKSB7CisgICAgQkIgPSBJLT5nZXRQYXJlbnQoKTsKKyAgICBJbnNlcnRQdCA9IEktPmdldEl0ZXJhdG9yKCk7CisgICAgYXNzZXJ0KEluc2VydFB0ICE9IEJCLT5lbmQoKSAmJiAiQ2FuJ3QgcmVhZCBkZWJ1ZyBsb2MgZnJvbSBlbmQoKSIpOworICAgIFNldEN1cnJlbnREZWJ1Z0xvY2F0aW9uKEktPmdldERlYnVnTG9jKCkpOworICB9CisKKyAgLy8vIFxicmllZiBUaGlzIHNwZWNpZmllcyB0aGF0IGNyZWF0ZWQgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBpbnNlcnRlZCBhdCB0aGUKKyAgLy8vIHNwZWNpZmllZCBwb2ludC4KKyAgdm9pZCBTZXRJbnNlcnRQb2ludChCYXNpY0Jsb2NrICpUaGVCQiwgQmFzaWNCbG9jazo6aXRlcmF0b3IgSVApIHsKKyAgICBCQiA9IFRoZUJCOworICAgIEluc2VydFB0ID0gSVA7CisgICAgaWYgKElQICE9IFRoZUJCLT5lbmQoKSkKKyAgICAgIFNldEN1cnJlbnREZWJ1Z0xvY2F0aW9uKElQLT5nZXREZWJ1Z0xvYygpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IGxvY2F0aW9uIGluZm9ybWF0aW9uIHVzZWQgYnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLgorICB2b2lkIFNldEN1cnJlbnREZWJ1Z0xvY2F0aW9uKERlYnVnTG9jIEwpIHsgQ3VyRGJnTG9jYXRpb24gPSBzdGQ6Om1vdmUoTCk7IH0KKworICAvLy8gXGJyaWVmIEdldCBsb2NhdGlvbiBpbmZvcm1hdGlvbiB1c2VkIGJ5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KKyAgY29uc3QgRGVidWdMb2MgJmdldEN1cnJlbnREZWJ1Z0xvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gQ3VyRGJnTG9jYXRpb247IH0KKworICAvLy8gXGJyaWVmIElmIHRoaXMgYnVpbGRlciBoYXMgYSBjdXJyZW50IGRlYnVnIGxvY2F0aW9uLCBzZXQgaXQgb24gdGhlCisgIC8vLyBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgU2V0SW5zdERlYnVnTG9jYXRpb24oSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0IHsKKyAgICBpZiAoQ3VyRGJnTG9jYXRpb24pCisgICAgICBJLT5zZXREZWJ1Z0xvYyhDdXJEYmdMb2NhdGlvbik7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24gdGhhdCB3ZSdyZSBlbWl0dGluZworICAvLy8gaW50by4KKyAgVHlwZSAqZ2V0Q3VycmVudEZ1bmN0aW9uUmV0dXJuVHlwZSgpIGNvbnN0OworCisgIC8vLyBJbnNlcnRQb2ludCAtIEEgc2F2ZWQgaW5zZXJ0aW9uIHBvaW50LgorICBjbGFzcyBJbnNlcnRQb2ludCB7CisgICAgQmFzaWNCbG9jayAqQmxvY2sgPSBudWxscHRyOworICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIFBvaW50OworCisgIHB1YmxpYzoKKyAgICAvLy8gXGJyaWVmIENyZWF0ZXMgYSBuZXcgaW5zZXJ0aW9uIHBvaW50IHdoaWNoIGRvZXNuJ3QgcG9pbnQgdG8gYW55dGhpbmcuCisgICAgSW5zZXJ0UG9pbnQoKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gXGJyaWVmIENyZWF0ZXMgYSBuZXcgaW5zZXJ0aW9uIHBvaW50IGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4KKyAgICBJbnNlcnRQb2ludChCYXNpY0Jsb2NrICpJbnNlcnRCbG9jaywgQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UG9pbnQpCisgICAgICAgIDogQmxvY2soSW5zZXJ0QmxvY2spLCBQb2ludChJbnNlcnRQb2ludCkge30KKworICAgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoaXMgaW5zZXJ0IHBvaW50IGlzIHNldC4KKyAgICBib29sIGlzU2V0KCkgY29uc3QgeyByZXR1cm4gKEJsb2NrICE9IG51bGxwdHIpOyB9CisKKyAgICBCYXNpY0Jsb2NrICpnZXRCbG9jaygpIGNvbnN0IHsgcmV0dXJuIEJsb2NrOyB9CisgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgZ2V0UG9pbnQoKSBjb25zdCB7IHJldHVybiBQb2ludDsgfQorICB9OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgY3VycmVudCBpbnNlcnQgcG9pbnQuCisgIEluc2VydFBvaW50IHNhdmVJUCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5zZXJ0UG9pbnQoR2V0SW5zZXJ0QmxvY2soKSwgR2V0SW5zZXJ0UG9pbnQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGN1cnJlbnQgaW5zZXJ0IHBvaW50LCBjbGVhcmluZyBpdCBpbiB0aGUgcHJvY2Vzcy4KKyAgSW5zZXJ0UG9pbnQgc2F2ZUFuZENsZWFySVAoKSB7CisgICAgSW5zZXJ0UG9pbnQgSVAoR2V0SW5zZXJ0QmxvY2soKSwgR2V0SW5zZXJ0UG9pbnQoKSk7CisgICAgQ2xlYXJJbnNlcnRpb25Qb2ludCgpOworICAgIHJldHVybiBJUDsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgY3VycmVudCBpbnNlcnQgcG9pbnQgdG8gYSBwcmV2aW91c2x5LXNhdmVkIGxvY2F0aW9uLgorICB2b2lkIHJlc3RvcmVJUChJbnNlcnRQb2ludCBJUCkgeworICAgIGlmIChJUC5pc1NldCgpKQorICAgICAgU2V0SW5zZXJ0UG9pbnQoSVAuZ2V0QmxvY2soKSwgSVAuZ2V0UG9pbnQoKSk7CisgICAgZWxzZQorICAgICAgQ2xlYXJJbnNlcnRpb25Qb2ludCgpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGZsb2F0aW5nIHBvaW50IG1hdGggbWV0YWRhdGEgYmVpbmcgdXNlZC4KKyAgTUROb2RlICpnZXREZWZhdWx0RlBNYXRoVGFnKCkgY29uc3QgeyByZXR1cm4gRGVmYXVsdEZQTWF0aFRhZzsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBmbGFncyB0byBiZSBhcHBsaWVkIHRvIGNyZWF0ZWQgZmxvYXRpbmcgcG9pbnQgb3BzCisgIEZhc3RNYXRoRmxhZ3MgZ2V0RmFzdE1hdGhGbGFncygpIGNvbnN0IHsgcmV0dXJuIEZNRjsgfQorCisgIC8vLyBcYnJpZWYgQ2xlYXIgdGhlIGZhc3QtbWF0aCBmbGFncy4KKyAgdm9pZCBjbGVhckZhc3RNYXRoRmxhZ3MoKSB7IEZNRi5jbGVhcigpOyB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGZsb2F0aW5nIHBvaW50IG1hdGggbWV0YWRhdGEgdG8gYmUgdXNlZC4KKyAgdm9pZCBzZXREZWZhdWx0RlBNYXRoVGFnKE1ETm9kZSAqRlBNYXRoVGFnKSB7IERlZmF1bHRGUE1hdGhUYWcgPSBGUE1hdGhUYWc7IH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgZmFzdC1tYXRoIGZsYWdzIHRvIGJlIHVzZWQgd2l0aCBnZW5lcmF0ZWQgZnAtbWF0aCBvcGVyYXRvcnMKKyAgdm9pZCBzZXRGYXN0TWF0aEZsYWdzKEZhc3RNYXRoRmxhZ3MgTmV3Rk1GKSB7IEZNRiA9IE5ld0ZNRjsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBSQUlJIGhlbHBlcnMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vIFxicmllZiBSQUlJIG9iamVjdCB0aGF0IHN0b3JlcyB0aGUgY3VycmVudCBpbnNlcnRpb24gcG9pbnQgYW5kIHJlc3RvcmVzIGl0CisgIC8vIHdoZW4gdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQuIFRoaXMgaW5jbHVkZXMgdGhlIGRlYnVnIGxvY2F0aW9uLgorICBjbGFzcyBJbnNlcnRQb2ludEd1YXJkIHsKKyAgICBJUkJ1aWxkZXJCYXNlICZCdWlsZGVyOworICAgIEFzc2VydGluZ1ZIPEJhc2ljQmxvY2s+IEJsb2NrOworICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIFBvaW50OworICAgIERlYnVnTG9jIERiZ0xvYzsKKworICBwdWJsaWM6CisgICAgSW5zZXJ0UG9pbnRHdWFyZChJUkJ1aWxkZXJCYXNlICZCKQorICAgICAgICA6IEJ1aWxkZXIoQiksIEJsb2NrKEIuR2V0SW5zZXJ0QmxvY2soKSksIFBvaW50KEIuR2V0SW5zZXJ0UG9pbnQoKSksCisgICAgICAgICAgRGJnTG9jKEIuZ2V0Q3VycmVudERlYnVnTG9jYXRpb24oKSkge30KKworICAgIEluc2VydFBvaW50R3VhcmQoY29uc3QgSW5zZXJ0UG9pbnRHdWFyZCAmKSA9IGRlbGV0ZTsKKyAgICBJbnNlcnRQb2ludEd1YXJkICZvcGVyYXRvcj0oY29uc3QgSW5zZXJ0UG9pbnRHdWFyZCAmKSA9IGRlbGV0ZTsKKworICAgIH5JbnNlcnRQb2ludEd1YXJkKCkgeworICAgICAgQnVpbGRlci5yZXN0b3JlSVAoSW5zZXJ0UG9pbnQoQmxvY2ssIFBvaW50KSk7CisgICAgICBCdWlsZGVyLlNldEN1cnJlbnREZWJ1Z0xvY2F0aW9uKERiZ0xvYyk7CisgICAgfQorICB9OworCisgIC8vIFxicmllZiBSQUlJIG9iamVjdCB0aGF0IHN0b3JlcyB0aGUgY3VycmVudCBmYXN0IG1hdGggc2V0dGluZ3MgYW5kIHJlc3RvcmVzCisgIC8vIHRoZW0gd2hlbiB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZC4KKyAgY2xhc3MgRmFzdE1hdGhGbGFnR3VhcmQgeworICAgIElSQnVpbGRlckJhc2UgJkJ1aWxkZXI7CisgICAgRmFzdE1hdGhGbGFncyBGTUY7CisgICAgTUROb2RlICpGUE1hdGhUYWc7CisKKyAgcHVibGljOgorICAgIEZhc3RNYXRoRmxhZ0d1YXJkKElSQnVpbGRlckJhc2UgJkIpCisgICAgICAgIDogQnVpbGRlcihCKSwgRk1GKEIuRk1GKSwgRlBNYXRoVGFnKEIuRGVmYXVsdEZQTWF0aFRhZykge30KKworICAgIEZhc3RNYXRoRmxhZ0d1YXJkKGNvbnN0IEZhc3RNYXRoRmxhZ0d1YXJkICYpID0gZGVsZXRlOworICAgIEZhc3RNYXRoRmxhZ0d1YXJkICZvcGVyYXRvcj0oY29uc3QgRmFzdE1hdGhGbGFnR3VhcmQgJikgPSBkZWxldGU7CisKKyAgICB+RmFzdE1hdGhGbGFnR3VhcmQoKSB7CisgICAgICBCdWlsZGVyLkZNRiA9IEZNRjsKKyAgICAgIEJ1aWxkZXIuRGVmYXVsdEZQTWF0aFRhZyA9IEZQTWF0aFRhZzsKKyAgICB9CisgIH07CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE1pc2NlbGxhbmVvdXMgY3JlYXRpb24gbWV0aG9kcy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFxicmllZiBNYWtlIGEgbmV3IGdsb2JhbCB2YXJpYWJsZSB3aXRoIGluaXRpYWxpemVyIHR5cGUgaTgqCisgIC8vLworICAvLy8gTWFrZSBhIG5ldyBnbG9iYWwgdmFyaWFibGUgd2l0aCBhbiBpbml0aWFsaXplciB0aGF0IGhhcyBhcnJheSBvZiBpOCB0eXBlCisgIC8vLyBmaWxsZWQgaW4gd2l0aCB0aGUgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyB2YWx1ZSBzcGVjaWZpZWQuICBUaGUgbmV3IGdsb2JhbAorICAvLy8gdmFyaWFibGUgd2lsbCBiZSBtYXJrZWQgbWVyZ2FibGUgd2l0aCBhbnkgb3RoZXJzIG9mIHRoZSBzYW1lIGNvbnRlbnRzLiAgSWYKKyAgLy8vIE5hbWUgaXMgc3BlY2lmaWVkLCBpdCBpcyB0aGUgbmFtZSBvZiB0aGUgZ2xvYmFsIHZhcmlhYmxlIGNyZWF0ZWQuCisgIEdsb2JhbFZhcmlhYmxlICpDcmVhdGVHbG9iYWxTdHJpbmcoU3RyaW5nUmVmIFN0ciwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyZXNzU3BhY2UgPSAwKTsKKworICAvLy8gXGJyaWVmIEdldCBhIGNvbnN0YW50IHZhbHVlIHJlcHJlc2VudGluZyBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4KKyAgQ29uc3RhbnRJbnQgKmdldEludDEoYm9vbCBWKSB7CisgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoZ2V0SW50MVR5KCksIFYpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGNvbnN0YW50IHZhbHVlIGZvciBpMSB0cnVlLgorICBDb25zdGFudEludCAqZ2V0VHJ1ZSgpIHsKKyAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldFRydWUoQ29udGV4dCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgY29uc3RhbnQgdmFsdWUgZm9yIGkxIGZhbHNlLgorICBDb25zdGFudEludCAqZ2V0RmFsc2UoKSB7CisgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXRGYWxzZShDb250ZXh0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGEgY29uc3RhbnQgOC1iaXQgdmFsdWUuCisgIENvbnN0YW50SW50ICpnZXRJbnQ4KHVpbnQ4X3QgQykgeworICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KGdldEludDhUeSgpLCBDKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGEgY29uc3RhbnQgMTYtYml0IHZhbHVlLgorICBDb25zdGFudEludCAqZ2V0SW50MTYodWludDE2X3QgQykgeworICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KGdldEludDE2VHkoKSwgQyk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBhIGNvbnN0YW50IDMyLWJpdCB2YWx1ZS4KKyAgQ29uc3RhbnRJbnQgKmdldEludDMyKHVpbnQzMl90IEMpIHsKKyAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChnZXRJbnQzMlR5KCksIEMpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYSBjb25zdGFudCA2NC1iaXQgdmFsdWUuCisgIENvbnN0YW50SW50ICpnZXRJbnQ2NCh1aW50NjRfdCBDKSB7CisgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoZ2V0SW50NjRUeSgpLCBDKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGEgY29uc3RhbnQgTi1iaXQgdmFsdWUsIHplcm8gZXh0ZW5kZWQgb3IgdHJ1bmNhdGVkIGZyb20KKyAgLy8vIGEgNjQtYml0IHZhbHVlLgorICBDb25zdGFudEludCAqZ2V0SW50Tih1bnNpZ25lZCBOLCB1aW50NjRfdCBDKSB7CisgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoZ2V0SW50TlR5KE4pLCBDKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGEgY29uc3RhbnQgaW50ZWdlciB2YWx1ZS4KKyAgQ29uc3RhbnRJbnQgKmdldEludChjb25zdCBBUEludCAmQUkpIHsKKyAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChDb250ZXh0LCBBSSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVHlwZSBjcmVhdGlvbiBtZXRob2RzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgRmV0Y2ggdGhlIHR5cGUgcmVwcmVzZW50aW5nIGEgc2luZ2xlIGJpdAorICBJbnRlZ2VyVHlwZSAqZ2V0SW50MVR5KCkgeworICAgIHJldHVybiBUeXBlOjpnZXRJbnQxVHkoQ29udGV4dCk7CisgIH0KKworICAvLy8gXGJyaWVmIEZldGNoIHRoZSB0eXBlIHJlcHJlc2VudGluZyBhbiA4LWJpdCBpbnRlZ2VyLgorICBJbnRlZ2VyVHlwZSAqZ2V0SW50OFR5KCkgeworICAgIHJldHVybiBUeXBlOjpnZXRJbnQ4VHkoQ29udGV4dCk7CisgIH0KKworICAvLy8gXGJyaWVmIEZldGNoIHRoZSB0eXBlIHJlcHJlc2VudGluZyBhIDE2LWJpdCBpbnRlZ2VyLgorICBJbnRlZ2VyVHlwZSAqZ2V0SW50MTZUeSgpIHsKKyAgICByZXR1cm4gVHlwZTo6Z2V0SW50MTZUeShDb250ZXh0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRmV0Y2ggdGhlIHR5cGUgcmVwcmVzZW50aW5nIGEgMzItYml0IGludGVnZXIuCisgIEludGVnZXJUeXBlICpnZXRJbnQzMlR5KCkgeworICAgIHJldHVybiBUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpOworICB9CisKKyAgLy8vIFxicmllZiBGZXRjaCB0aGUgdHlwZSByZXByZXNlbnRpbmcgYSA2NC1iaXQgaW50ZWdlci4KKyAgSW50ZWdlclR5cGUgKmdldEludDY0VHkoKSB7CisgICAgcmV0dXJuIFR5cGU6OmdldEludDY0VHkoQ29udGV4dCk7CisgIH0KKworICAvLy8gXGJyaWVmIEZldGNoIHRoZSB0eXBlIHJlcHJlc2VudGluZyBhIDEyOC1iaXQgaW50ZWdlci4KKyAgSW50ZWdlclR5cGUgKmdldEludDEyOFR5KCkgeyByZXR1cm4gVHlwZTo6Z2V0SW50MTI4VHkoQ29udGV4dCk7IH0KKworICAvLy8gXGJyaWVmIEZldGNoIHRoZSB0eXBlIHJlcHJlc2VudGluZyBhbiBOLWJpdCBpbnRlZ2VyLgorICBJbnRlZ2VyVHlwZSAqZ2V0SW50TlR5KHVuc2lnbmVkIE4pIHsKKyAgICByZXR1cm4gVHlwZTo6Z2V0SW50TlR5KENvbnRleHQsIE4pOworICB9CisKKyAgLy8vIFxicmllZiBGZXRjaCB0aGUgdHlwZSByZXByZXNlbnRpbmcgYSAxNi1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUuCisgIFR5cGUgKmdldEhhbGZUeSgpIHsKKyAgICByZXR1cm4gVHlwZTo6Z2V0SGFsZlR5KENvbnRleHQpOworICB9CisKKyAgLy8vIFxicmllZiBGZXRjaCB0aGUgdHlwZSByZXByZXNlbnRpbmcgYSAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUuCisgIFR5cGUgKmdldEZsb2F0VHkoKSB7CisgICAgcmV0dXJuIFR5cGU6OmdldEZsb2F0VHkoQ29udGV4dCk7CisgIH0KKworICAvLy8gXGJyaWVmIEZldGNoIHRoZSB0eXBlIHJlcHJlc2VudGluZyBhIDY0LWJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZS4KKyAgVHlwZSAqZ2V0RG91YmxlVHkoKSB7CisgICAgcmV0dXJuIFR5cGU6OmdldERvdWJsZVR5KENvbnRleHQpOworICB9CisKKyAgLy8vIFxicmllZiBGZXRjaCB0aGUgdHlwZSByZXByZXNlbnRpbmcgdm9pZC4KKyAgVHlwZSAqZ2V0Vm9pZFR5KCkgeworICAgIHJldHVybiBUeXBlOjpnZXRWb2lkVHkoQ29udGV4dCk7CisgIH0KKworICAvLy8gXGJyaWVmIEZldGNoIHRoZSB0eXBlIHJlcHJlc2VudGluZyBhIHBvaW50ZXIgdG8gYW4gOC1iaXQgaW50ZWdlciB2YWx1ZS4KKyAgUG9pbnRlclR5cGUgKmdldEludDhQdHJUeSh1bnNpZ25lZCBBZGRyU3BhY2UgPSAwKSB7CisgICAgcmV0dXJuIFR5cGU6OmdldEludDhQdHJUeShDb250ZXh0LCBBZGRyU3BhY2UpOworICB9CisKKyAgLy8vIFxicmllZiBGZXRjaCB0aGUgdHlwZSByZXByZXNlbnRpbmcgYSBwb2ludGVyIHRvIGFuIGludGVnZXIgdmFsdWUuCisgIEludGVnZXJUeXBlICpnZXRJbnRQdHJUeShjb25zdCBEYXRhTGF5b3V0ICZETCwgdW5zaWduZWQgQWRkclNwYWNlID0gMCkgeworICAgIHJldHVybiBETC5nZXRJbnRQdHJUeXBlKENvbnRleHQsIEFkZHJTcGFjZSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSW50cmluc2ljIGNyZWF0aW9uIG1ldGhvZHMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW5kIGluc2VydCBhIG1lbXNldCB0byB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgYW5kIHRoZQorICAvLy8gc3BlY2lmaWVkIHZhbHVlLgorICAvLy8KKyAgLy8vIElmIHRoZSBwb2ludGVyIGlzbid0IGFuIGk4KiwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQuIElmIGEgVEJBQSB0YWcgaXMKKyAgLy8vIHNwZWNpZmllZCwgaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgaW5zdHJ1Y3Rpb24uIExpa2V3aXNlIHdpdGggYWxpYXMuc2NvcGUKKyAgLy8vIGFuZCBub2FsaWFzIHRhZ3MuCisgIENhbGxJbnN0ICpDcmVhdGVNZW1TZXQoVmFsdWUgKlB0ciwgVmFsdWUgKlZhbCwgdWludDY0X3QgU2l6ZSwgdW5zaWduZWQgQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZvbGF0aWxlID0gZmFsc2UsIE1ETm9kZSAqVEJBQVRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpTY29wZVRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpOb0FsaWFzVGFnID0gbnVsbHB0cikgeworICAgIHJldHVybiBDcmVhdGVNZW1TZXQoUHRyLCBWYWwsIGdldEludDY0KFNpemUpLCBBbGlnbiwgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRCQUFUYWcsIFNjb3BlVGFnLCBOb0FsaWFzVGFnKTsKKyAgfQorCisgIENhbGxJbnN0ICpDcmVhdGVNZW1TZXQoVmFsdWUgKlB0ciwgVmFsdWUgKlZhbCwgVmFsdWUgKlNpemUsIHVuc2lnbmVkIEFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWb2xhdGlsZSA9IGZhbHNlLCBNRE5vZGUgKlRCQUFUYWcgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqU2NvcGVUYWcgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqTm9BbGlhc1RhZyA9IG51bGxwdHIpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuZCBpbnNlcnQgYSBtZW1jcHkgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHBvaW50ZXJzLgorICAvLy8KKyAgLy8vIElmIHRoZSBwb2ludGVycyBhcmVuJ3QgaTgqLCB0aGV5IHdpbGwgYmUgY29udmVydGVkLiAgSWYgYSBUQkFBIHRhZyBpcworICAvLy8gc3BlY2lmaWVkLCBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBpbnN0cnVjdGlvbi4gTGlrZXdpc2Ugd2l0aCBhbGlhcy5zY29wZQorICAvLy8gYW5kIG5vYWxpYXMgdGFncy4KKyAgQ2FsbEluc3QgKkNyZWF0ZU1lbUNweShWYWx1ZSAqRHN0LCB1bnNpZ25lZCBEc3RBbGlnbiwgVmFsdWUgKlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNBbGlnbiwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVm9sYXRpbGUgPSBmYWxzZSwgTUROb2RlICpUQkFBVGFnID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKlRCQUFTdHJ1Y3RUYWcgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqU2NvcGVUYWcgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqTm9BbGlhc1RhZyA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gQ3JlYXRlTWVtQ3B5KERzdCwgRHN0QWxpZ24sIFNyYywgU3JjQWxpZ24sIGdldEludDY0KFNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNWb2xhdGlsZSwgVEJBQVRhZywgVEJBQVN0cnVjdFRhZywgU2NvcGVUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICBOb0FsaWFzVGFnKTsKKyAgfQorCisgIENhbGxJbnN0ICpDcmVhdGVNZW1DcHkoVmFsdWUgKkRzdCwgdW5zaWduZWQgRHN0QWxpZ24sIFZhbHVlICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjQWxpZ24sIFZhbHVlICpTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWb2xhdGlsZSA9IGZhbHNlLCBNRE5vZGUgKlRCQUFUYWcgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqVEJBQVN0cnVjdFRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpTY29wZVRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpOb0FsaWFzVGFnID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW5kIGluc2VydCBhbiBlbGVtZW50IHVub3JkZXJlZC1hdG9taWMgbWVtY3B5IGJldHdlZW4gdGhlCisgIC8vLyBzcGVjaWZpZWQgcG9pbnRlcnMuCisgIC8vLworICAvLy8gRHN0QWxpZ24vU3JjQWxpZ24gYXJlIHRoZSBhbGlnbm1lbnRzIG9mIHRoZSBEc3QvU3JjIHBvaW50ZXJzLCByZXNwZWN0aXZlbHkuCisgIC8vLworICAvLy8gSWYgdGhlIHBvaW50ZXJzIGFyZW4ndCBpOCosIHRoZXkgd2lsbCBiZSBjb252ZXJ0ZWQuICBJZiBhIFRCQUEgdGFnIGlzCisgIC8vLyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGluc3RydWN0aW9uLiBMaWtld2lzZSB3aXRoIGFsaWFzLnNjb3BlCisgIC8vLyBhbmQgbm9hbGlhcyB0YWdzLgorICBDYWxsSW5zdCAqQ3JlYXRlRWxlbWVudFVub3JkZXJlZEF0b21pY01lbUNweSgKKyAgICAgIFZhbHVlICpEc3QsIHVuc2lnbmVkIERzdEFsaWduLCBWYWx1ZSAqU3JjLCB1bnNpZ25lZCBTcmNBbGlnbiwKKyAgICAgIHVpbnQ2NF90IFNpemUsIHVpbnQzMl90IEVsZW1lbnRTaXplLCBNRE5vZGUgKlRCQUFUYWcgPSBudWxscHRyLAorICAgICAgTUROb2RlICpUQkFBU3RydWN0VGFnID0gbnVsbHB0ciwgTUROb2RlICpTY29wZVRhZyA9IG51bGxwdHIsCisgICAgICBNRE5vZGUgKk5vQWxpYXNUYWcgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIENyZWF0ZUVsZW1lbnRVbm9yZGVyZWRBdG9taWNNZW1DcHkoCisgICAgICAgIERzdCwgRHN0QWxpZ24sIFNyYywgU3JjQWxpZ24sIGdldEludDY0KFNpemUpLCBFbGVtZW50U2l6ZSwgVEJBQVRhZywKKyAgICAgICAgVEJBQVN0cnVjdFRhZywgU2NvcGVUYWcsIE5vQWxpYXNUYWcpOworICB9CisKKyAgQ2FsbEluc3QgKkNyZWF0ZUVsZW1lbnRVbm9yZGVyZWRBdG9taWNNZW1DcHkoCisgICAgICBWYWx1ZSAqRHN0LCB1bnNpZ25lZCBEc3RBbGlnbiwgVmFsdWUgKlNyYywgdW5zaWduZWQgU3JjQWxpZ24sIFZhbHVlICpTaXplLAorICAgICAgdWludDMyX3QgRWxlbWVudFNpemUsIE1ETm9kZSAqVEJBQVRhZyA9IG51bGxwdHIsCisgICAgICBNRE5vZGUgKlRCQUFTdHJ1Y3RUYWcgPSBudWxscHRyLCBNRE5vZGUgKlNjb3BlVGFnID0gbnVsbHB0ciwKKyAgICAgIE1ETm9kZSAqTm9BbGlhc1RhZyA9IG51bGxwdHIpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuZCBpbnNlcnQgYSBtZW1tb3ZlIGJldHdlZW4gdGhlIHNwZWNpZmllZAorICAvLy8gcG9pbnRlcnMuCisgIC8vLworICAvLy8gSWYgdGhlIHBvaW50ZXJzIGFyZW4ndCBpOCosIHRoZXkgd2lsbCBiZSBjb252ZXJ0ZWQuICBJZiBhIFRCQUEgdGFnIGlzCisgIC8vLyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGluc3RydWN0aW9uLiBMaWtld2lzZSB3aXRoIGFsaWFzLnNjb3BlCisgIC8vLyBhbmQgbm9hbGlhcyB0YWdzLgorICBDYWxsSW5zdCAqQ3JlYXRlTWVtTW92ZShWYWx1ZSAqRHN0LCB1bnNpZ25lZCBEc3RBbGlnbiwgVmFsdWUgKlNyYywgdW5zaWduZWQgU3JjQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUsIGJvb2wgaXNWb2xhdGlsZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKlRCQUFUYWcgPSBudWxscHRyLCBNRE5vZGUgKlNjb3BlVGFnID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpOb0FsaWFzVGFnID0gbnVsbHB0cikgeworICAgIHJldHVybiBDcmVhdGVNZW1Nb3ZlKERzdCwgRHN0QWxpZ24sIFNyYywgU3JjQWxpZ24sIGdldEludDY0KFNpemUpLCBpc1ZvbGF0aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRCQUFUYWcsIFNjb3BlVGFnLCBOb0FsaWFzVGFnKTsKKyAgfQorCisgIENhbGxJbnN0ICpDcmVhdGVNZW1Nb3ZlKFZhbHVlICpEc3QsIHVuc2lnbmVkIERzdEFsaWduLCBWYWx1ZSAqU3JjLCB1bnNpZ25lZCBTcmNBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKlNpemUsIGJvb2wgaXNWb2xhdGlsZSA9IGZhbHNlLCBNRE5vZGUgKlRCQUFUYWcgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKlNjb3BlVGFnID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpOb0FsaWFzVGFnID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSB2ZWN0b3IgZmFkZCByZWR1Y3Rpb24gaW50cmluc2ljIG9mIHRoZSBzb3VyY2UgdmVjdG9yLgorICAvLy8gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHNjYWxhciBhY2N1bXVsYXRvciB2YWx1ZSBmb3Igb3JkZXJlZCByZWR1Y3Rpb25zLgorICBDYWxsSW5zdCAqQ3JlYXRlRkFkZFJlZHVjZShWYWx1ZSAqQWNjLCBWYWx1ZSAqU3JjKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIHZlY3RvciBmbXVsIHJlZHVjdGlvbiBpbnRyaW5zaWMgb2YgdGhlIHNvdXJjZSB2ZWN0b3IuCisgIC8vLyBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIGEgc2NhbGFyIGFjY3VtdWxhdG9yIHZhbHVlIGZvciBvcmRlcmVkIHJlZHVjdGlvbnMuCisgIENhbGxJbnN0ICpDcmVhdGVGTXVsUmVkdWNlKFZhbHVlICpBY2MsIFZhbHVlICpTcmMpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgdmVjdG9yIGludCBhZGQgcmVkdWN0aW9uIGludHJpbnNpYyBvZiB0aGUgc291cmNlIHZlY3Rvci4KKyAgQ2FsbEluc3QgKkNyZWF0ZUFkZFJlZHVjZShWYWx1ZSAqU3JjKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIHZlY3RvciBpbnQgbXVsIHJlZHVjdGlvbiBpbnRyaW5zaWMgb2YgdGhlIHNvdXJjZSB2ZWN0b3IuCisgIENhbGxJbnN0ICpDcmVhdGVNdWxSZWR1Y2UoVmFsdWUgKlNyYyk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSB2ZWN0b3IgaW50IEFORCByZWR1Y3Rpb24gaW50cmluc2ljIG9mIHRoZSBzb3VyY2UgdmVjdG9yLgorICBDYWxsSW5zdCAqQ3JlYXRlQW5kUmVkdWNlKFZhbHVlICpTcmMpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgdmVjdG9yIGludCBPUiByZWR1Y3Rpb24gaW50cmluc2ljIG9mIHRoZSBzb3VyY2UgdmVjdG9yLgorICBDYWxsSW5zdCAqQ3JlYXRlT3JSZWR1Y2UoVmFsdWUgKlNyYyk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSB2ZWN0b3IgaW50IFhPUiByZWR1Y3Rpb24gaW50cmluc2ljIG9mIHRoZSBzb3VyY2UgdmVjdG9yLgorICBDYWxsSW5zdCAqQ3JlYXRlWG9yUmVkdWNlKFZhbHVlICpTcmMpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgdmVjdG9yIGludGVnZXIgbWF4IHJlZHVjdGlvbiBpbnRyaW5zaWMgb2YgdGhlIHNvdXJjZQorICAvLy8gdmVjdG9yLgorICBDYWxsSW5zdCAqQ3JlYXRlSW50TWF4UmVkdWNlKFZhbHVlICpTcmMsIGJvb2wgSXNTaWduZWQgPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSB2ZWN0b3IgaW50ZWdlciBtaW4gcmVkdWN0aW9uIGludHJpbnNpYyBvZiB0aGUgc291cmNlCisgIC8vLyB2ZWN0b3IuCisgIENhbGxJbnN0ICpDcmVhdGVJbnRNaW5SZWR1Y2UoVmFsdWUgKlNyYywgYm9vbCBJc1NpZ25lZCA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIHZlY3RvciBmbG9hdCBtYXggcmVkdWN0aW9uIGludHJpbnNpYyBvZiB0aGUgc291cmNlCisgIC8vLyB2ZWN0b3IuCisgIENhbGxJbnN0ICpDcmVhdGVGUE1heFJlZHVjZShWYWx1ZSAqU3JjLCBib29sIE5vTmFOID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgdmVjdG9yIGZsb2F0IG1pbiByZWR1Y3Rpb24gaW50cmluc2ljIG9mIHRoZSBzb3VyY2UKKyAgLy8vIHZlY3Rvci4KKyAgQ2FsbEluc3QgKkNyZWF0ZUZQTWluUmVkdWNlKFZhbHVlICpTcmMsIGJvb2wgTm9OYU4gPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBsaWZldGltZS5zdGFydCBpbnRyaW5zaWMuCisgIC8vLworICAvLy8gSWYgdGhlIHBvaW50ZXIgaXNuJ3QgaTgqIGl0IHdpbGwgYmUgY29udmVydGVkLgorICBDYWxsSW5zdCAqQ3JlYXRlTGlmZXRpbWVTdGFydChWYWx1ZSAqUHRyLCBDb25zdGFudEludCAqU2l6ZSA9IG51bGxwdHIpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbGlmZXRpbWUuZW5kIGludHJpbnNpYy4KKyAgLy8vCisgIC8vLyBJZiB0aGUgcG9pbnRlciBpc24ndCBpOCogaXQgd2lsbCBiZSBjb252ZXJ0ZWQuCisgIENhbGxJbnN0ICpDcmVhdGVMaWZldGltZUVuZChWYWx1ZSAqUHRyLCBDb25zdGFudEludCAqU2l6ZSA9IG51bGxwdHIpOworCisgIC8vLyBDcmVhdGUgYSBjYWxsIHRvIGludmFyaWFudC5zdGFydCBpbnRyaW5zaWMuCisgIC8vLworICAvLy8gSWYgdGhlIHBvaW50ZXIgaXNuJ3QgaTgqIGl0IHdpbGwgYmUgY29udmVydGVkLgorICBDYWxsSW5zdCAqQ3JlYXRlSW52YXJpYW50U3RhcnQoVmFsdWUgKlB0ciwgQ29uc3RhbnRJbnQgKlNpemUgPSBudWxscHRyKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIGNhbGwgdG8gTWFza2VkIExvYWQgaW50cmluc2ljCisgIENhbGxJbnN0ICpDcmVhdGVNYXNrZWRMb2FkKFZhbHVlICpQdHIsIHVuc2lnbmVkIEFsaWduLCBWYWx1ZSAqTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKlBhc3NUaHJ1ID0gbnVsbHB0ciwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIik7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBjYWxsIHRvIE1hc2tlZCBTdG9yZSBpbnRyaW5zaWMKKyAgQ2FsbEluc3QgKkNyZWF0ZU1hc2tlZFN0b3JlKFZhbHVlICpWYWwsIFZhbHVlICpQdHIsIHVuc2lnbmVkIEFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKk1hc2spOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgY2FsbCB0byBNYXNrZWQgR2F0aGVyIGludHJpbnNpYworICBDYWxsSW5zdCAqQ3JlYXRlTWFza2VkR2F0aGVyKFZhbHVlICpQdHJzLCB1bnNpZ25lZCBBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqTWFzayA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKlBhc3NUaHJ1ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSYgTmFtZSA9ICIiKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIGNhbGwgdG8gTWFza2VkIFNjYXR0ZXIgaW50cmluc2ljCisgIENhbGxJbnN0ICpDcmVhdGVNYXNrZWRTY2F0dGVyKFZhbHVlICpWYWwsIFZhbHVlICpQdHJzLCB1bnNpZ25lZCBBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKk1hc2sgPSBudWxscHRyKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhbiBhc3N1bWUgaW50cmluc2ljIGNhbGwgdGhhdCBhbGxvd3MgdGhlIG9wdGltaXplciB0bworICAvLy8gYXNzdW1lIHRoYXQgdGhlIHByb3ZpZGVkIGNvbmRpdGlvbiB3aWxsIGJlIHRydWUuCisgIENhbGxJbnN0ICpDcmVhdGVBc3N1bXB0aW9uKFZhbHVlICpDb25kKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIGNhbGwgdG8gdGhlIGV4cGVyaW1lbnRhbC5nYy5zdGF0ZXBvaW50IGludHJpbnNpYyB0bworICAvLy8gc3RhcnQgYSBuZXcgc3RhdGVwb2ludCBzZXF1ZW5jZS4KKyAgQ2FsbEluc3QgKkNyZWF0ZUdDU3RhdGVwb2ludENhbGwodWludDY0X3QgSUQsIHVpbnQzMl90IE51bVBhdGNoQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpBY3R1YWxDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IENhbGxBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBEZW9wdEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IEdDQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIik7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBjYWxsIHRvIHRoZSBleHBlcmltZW50YWwuZ2Muc3RhdGVwb2ludCBpbnRyaW5zaWMgdG8KKyAgLy8vIHN0YXJ0IGEgbmV3IHN0YXRlcG9pbnQgc2VxdWVuY2UuCisgIENhbGxJbnN0ICpDcmVhdGVHQ1N0YXRlcG9pbnRDYWxsKHVpbnQ2NF90IElELCB1aW50MzJfdCBOdW1QYXRjaEJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQWN0dWFsQ2FsbGVlLCB1aW50MzJfdCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VXNlPiBDYWxsQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VXNlPiBUcmFuc2l0aW9uQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VXNlPiBEZW9wdEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IEdDQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIik7CisKKyAgLy8vIFxicmllZiBDb252ZW5pbmVuY2UgZnVuY3Rpb24gZm9yIHRoZSBjb21tb24gY2FzZSB3aGVuIENhbGxBcmdzIGFyZSBmaWxsZWQKKyAgLy8vIGluIHVzaW5nIG1ha2VBcnJheVJlZihDUy5hcmdfYmVnaW4oKSwgQ1MuYXJnX2VuZCgpKTsgVXNlIG5lZWRzIHRvIGJlCisgIC8vLyAuZ2V0KCknZWQgdG8gZ2V0IHRoZSBWYWx1ZSBwb2ludGVyLgorICBDYWxsSW5zdCAqQ3JlYXRlR0NTdGF0ZXBvaW50Q2FsbCh1aW50NjRfdCBJRCwgdWludDMyX3QgTnVtUGF0Y2hCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKkFjdHVhbENhbGxlZSwgQXJyYXlSZWY8VXNlPiBDYWxsQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gRGVvcHRBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBHQ0FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIGludm9rZSB0byB0aGUgZXhwZXJpbWVudGFsLmdjLnN0YXRlcG9pbnQgaW50cmluc2ljIHRvCisgIC8vLyBzdGFydCBhIG5ldyBzdGF0ZXBvaW50IHNlcXVlbmNlLgorICBJbnZva2VJbnN0ICoKKyAgQ3JlYXRlR0NTdGF0ZXBvaW50SW52b2tlKHVpbnQ2NF90IElELCB1aW50MzJfdCBOdW1QYXRjaEJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKkFjdHVhbEludm9rZWUsIEJhc2ljQmxvY2sgKk5vcm1hbERlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpVbndpbmREZXN0LCBBcnJheVJlZjxWYWx1ZSAqPiBJbnZva2VBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gRGVvcHRBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gR0NBcmdzLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhbiBpbnZva2UgdG8gdGhlIGV4cGVyaW1lbnRhbC5nYy5zdGF0ZXBvaW50IGludHJpbnNpYyB0bworICAvLy8gc3RhcnQgYSBuZXcgc3RhdGVwb2ludCBzZXF1ZW5jZS4KKyAgSW52b2tlSW5zdCAqQ3JlYXRlR0NTdGF0ZXBvaW50SW52b2tlKAorICAgICAgdWludDY0X3QgSUQsIHVpbnQzMl90IE51bVBhdGNoQnl0ZXMsIFZhbHVlICpBY3R1YWxJbnZva2VlLAorICAgICAgQmFzaWNCbG9jayAqTm9ybWFsRGVzdCwgQmFzaWNCbG9jayAqVW53aW5kRGVzdCwgdWludDMyX3QgRmxhZ3MsCisgICAgICBBcnJheVJlZjxVc2U+IEludm9rZUFyZ3MsIEFycmF5UmVmPFVzZT4gVHJhbnNpdGlvbkFyZ3MsCisgICAgICBBcnJheVJlZjxVc2U+IERlb3B0QXJncywgQXJyYXlSZWY8VmFsdWUgKj4gR0NBcmdzLAorICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIik7CisKKyAgLy8gQ29udmVuaW5lbmNlIGZ1bmN0aW9uIGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlbiBDYWxsQXJncyBhcmUgZmlsbGVkIGluIHVzaW5nCisgIC8vIG1ha2VBcnJheVJlZihDUy5hcmdfYmVnaW4oKSwgQ1MuYXJnX2VuZCgpKTsgVXNlIG5lZWRzIHRvIGJlIC5nZXQoKSdlZCB0bworICAvLyBnZXQgdGhlIFZhbHVlICouCisgIEludm9rZUluc3QgKgorICBDcmVhdGVHQ1N0YXRlcG9pbnRJbnZva2UodWludDY0X3QgSUQsIHVpbnQzMl90IE51bVBhdGNoQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQWN0dWFsSW52b2tlZSwgQmFzaWNCbG9jayAqTm9ybWFsRGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKlVud2luZERlc3QsIEFycmF5UmVmPFVzZT4gSW52b2tlQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IERlb3B0QXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IEdDQXJncywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIik7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBjYWxsIHRvIHRoZSBleHBlcmltZW50YWwuZ2MucmVzdWx0IGludHJpbnNpYyB0byBleHRyYWN0CisgIC8vLyB0aGUgcmVzdWx0IGZyb20gYSBjYWxsIHdyYXBwZWQgaW4gYSBzdGF0ZXBvaW50LgorICBDYWxsSW5zdCAqQ3JlYXRlR0NSZXN1bHQoSW5zdHJ1Y3Rpb24gKlN0YXRlcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpSZXN1bHRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIik7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBjYWxsIHRvIHRoZSBleHBlcmltZW50YWwuZ2MucmVsb2NhdGUgaW50cmluc2ljcyB0bworICAvLy8gcHJvamVjdCB0aGUgcmVsb2NhdGVkIHZhbHVlIG9mIG9uZSBwb2ludGVyIGZyb20gdGhlIHN0YXRlcG9pbnQuCisgIENhbGxJbnN0ICpDcmVhdGVHQ1JlbG9jYXRlKEluc3RydWN0aW9uICpTdGF0ZXBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQmFzZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IERlcml2ZWRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKlJlc3VsdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpOworCisgIC8vLyBDcmVhdGUgYSBjYWxsIHRvIGludHJpbnNpYyBccCBJRCB3aXRoIDIgb3BlcmFuZHMgd2hpY2ggaXMgbWFuZ2xlZCBvbiB0aGUKKyAgLy8vIGZpcnN0IHR5cGUuCisgIENhbGxJbnN0ICpDcmVhdGVCaW5hcnlJbnRyaW5zaWMoSW50cmluc2ljOjpJRCBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpOworCisgIC8vLyBDcmVhdGUgYSBjYWxsIHRvIGludHJpbnNpYyBccCBJRCB3aXRoIDEgb3IgbW9yZSBvcGVyYW5kcyBhc3N1bWluZyB0aGUKKyAgLy8vIGludHJpbnNpYyBhbmQgYWxsIG9wZXJhbmRzIGhhdmUgdGhlIHNhbWUgdHlwZS4gSWYgXHAgRk1GU291cmNlIGlzCisgIC8vLyBwcm92aWRlZCwgY29weSBmYXN0LW1hdGgtZmxhZ3MgZnJvbSB0aGF0IGluc3RydWN0aW9uIHRvIHRoZSBpbnRyaW5zaWMuCisgIENhbGxJbnN0ICpDcmVhdGVJbnRyaW5zaWMoSW50cmluc2ljOjpJRCBJRCwgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqRk1GU291cmNlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKTsKKworICAvLy8gQ3JlYXRlIGNhbGwgdG8gdGhlIG1pbm51bSBpbnRyaW5zaWMuCisgIENhbGxJbnN0ICpDcmVhdGVNaW5OdW0oVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVCaW5hcnlJbnRyaW5zaWMoSW50cmluc2ljOjptaW5udW0sIExIUywgUkhTLCBOYW1lKTsKKyAgfQorCisgIC8vLyBDcmVhdGUgY2FsbCB0byB0aGUgbWF4bnVtIGludHJpbnNpYy4KKyAgQ2FsbEluc3QgKkNyZWF0ZU1heE51bShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUJpbmFyeUludHJpbnNpYyhJbnRyaW5zaWM6Om1heG51bSwgTEhTLCBSSFMsIE5hbWUpOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgY2FsbCB0byBhIG1hc2tlZCBpbnRyaW5zaWMgd2l0aCBnaXZlbiBJZC4KKyAgQ2FsbEluc3QgKkNyZWF0ZU1hc2tlZEludHJpbnNpYyhJbnRyaW5zaWM6OklEIElkLCBBcnJheVJlZjxWYWx1ZSAqPiBPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZSAqPiBPdmVybG9hZGVkVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIik7CisKKyAgVmFsdWUgKmdldENhc3RlZEludDhQdHJWYWx1ZShWYWx1ZSAqUHRyKTsKK307CisKKy8vLyBcYnJpZWYgVGhpcyBwcm92aWRlcyBhIHVuaWZvcm0gQVBJIGZvciBjcmVhdGluZyBpbnN0cnVjdGlvbnMgYW5kIGluc2VydGluZworLy8vIHRoZW0gaW50byBhIGJhc2ljIGJsb2NrOiBlaXRoZXIgYXQgdGhlIGVuZCBvZiBhIEJhc2ljQmxvY2ssIG9yIGF0IGEgc3BlY2lmaWMKKy8vLyBpdGVyYXRvciBsb2NhdGlvbiBpbiBhIGJsb2NrLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoZSBidWlsZGVyIGRvZXMgbm90IGV4cG9zZSB0aGUgZnVsbCBnZW5lcmFsaXR5IG9mIExMVk0KKy8vLyBpbnN0cnVjdGlvbnMuICBGb3IgYWNjZXNzIHRvIGV4dHJhIGluc3RydWN0aW9uIHByb3BlcnRpZXMsIHVzZSB0aGUgbXV0YXRvcnMKKy8vLyAoZS5nLiBzZXRWb2xhdGlsZSkgb24gdGhlIGluc3RydWN0aW9ucyBhZnRlciB0aGV5IGhhdmUgYmVlbgorLy8vIGNyZWF0ZWQuIENvbnZlbmllbmNlIHN0YXRlIGV4aXN0cyB0byBzcGVjaWZ5IGZhc3QtbWF0aCBmbGFncyBhbmQgZnAtbWF0aAorLy8vIHRhZ3MuCisvLy8KKy8vLyBUaGUgZmlyc3QgdGVtcGxhdGUgYXJndW1lbnQgc3BlY2lmaWVzIGEgY2xhc3MgdG8gdXNlIGZvciBjcmVhdGluZyBjb25zdGFudHMuCisvLy8gVGhpcyBkZWZhdWx0cyB0byBjcmVhdGluZyBtaW5pbWFsbHkgZm9sZGVkIGNvbnN0YW50cy4gIFRoZSBzZWNvbmQgdGVtcGxhdGUKKy8vLyBhcmd1bWVudCBhbGxvd3MgY2xpZW50cyB0byBzcGVjaWZ5IGN1c3RvbSBpbnNlcnRpb24gaG9va3MgdGhhdCBhcmUgY2FsbGVkIG9uCisvLy8gZXZlcnkgbmV3bHkgY3JlYXRlZCBpbnNlcnRpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IENvbnN0YW50Rm9sZGVyLAorICAgICAgICAgIHR5cGVuYW1lIEluc2VydGVyID0gSVJCdWlsZGVyRGVmYXVsdEluc2VydGVyPgorY2xhc3MgSVJCdWlsZGVyIDogcHVibGljIElSQnVpbGRlckJhc2UsIHB1YmxpYyBJbnNlcnRlciB7CisgIFQgRm9sZGVyOworCitwdWJsaWM6CisgIElSQnVpbGRlcihMTFZNQ29udGV4dCAmQywgY29uc3QgVCAmRiwgSW5zZXJ0ZXIgSSA9IEluc2VydGVyKCksCisgICAgICAgICAgICBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBPcEJ1bmRsZXMgPSBOb25lKQorICAgICAgOiBJUkJ1aWxkZXJCYXNlKEMsIEZQTWF0aFRhZywgT3BCdW5kbGVzKSwgSW5zZXJ0ZXIoc3RkOjptb3ZlKEkpKSwKKyAgICAgICAgRm9sZGVyKEYpIHt9CisKKyAgZXhwbGljaXQgSVJCdWlsZGVyKExMVk1Db250ZXh0ICZDLCBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBPcEJ1bmRsZXMgPSBOb25lKQorICAgICAgOiBJUkJ1aWxkZXJCYXNlKEMsIEZQTWF0aFRhZywgT3BCdW5kbGVzKSB7fQorCisgIGV4cGxpY2l0IElSQnVpbGRlcihCYXNpY0Jsb2NrICpUaGVCQiwgY29uc3QgVCAmRiwgTUROb2RlICpGUE1hdGhUYWcgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gT3BCdW5kbGVzID0gTm9uZSkKKyAgICAgIDogSVJCdWlsZGVyQmFzZShUaGVCQi0+Z2V0Q29udGV4dCgpLCBGUE1hdGhUYWcsIE9wQnVuZGxlcyksIEZvbGRlcihGKSB7CisgICAgU2V0SW5zZXJ0UG9pbnQoVGhlQkIpOworICB9CisKKyAgZXhwbGljaXQgSVJCdWlsZGVyKEJhc2ljQmxvY2sgKlRoZUJCLCBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBPcEJ1bmRsZXMgPSBOb25lKQorICAgICAgOiBJUkJ1aWxkZXJCYXNlKFRoZUJCLT5nZXRDb250ZXh0KCksIEZQTWF0aFRhZywgT3BCdW5kbGVzKSB7CisgICAgU2V0SW5zZXJ0UG9pbnQoVGhlQkIpOworICB9CisKKyAgZXhwbGljaXQgSVJCdWlsZGVyKEluc3RydWN0aW9uICpJUCwgTUROb2RlICpGUE1hdGhUYWcgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gT3BCdW5kbGVzID0gTm9uZSkKKyAgICAgIDogSVJCdWlsZGVyQmFzZShJUC0+Z2V0Q29udGV4dCgpLCBGUE1hdGhUYWcsIE9wQnVuZGxlcykgeworICAgIFNldEluc2VydFBvaW50KElQKTsKKyAgfQorCisgIElSQnVpbGRlcihCYXNpY0Jsb2NrICpUaGVCQiwgQmFzaWNCbG9jazo6aXRlcmF0b3IgSVAsIGNvbnN0IFQgJkYsCisgICAgICAgICAgICBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBPcEJ1bmRsZXMgPSBOb25lKQorICAgICAgOiBJUkJ1aWxkZXJCYXNlKFRoZUJCLT5nZXRDb250ZXh0KCksIEZQTWF0aFRhZywgT3BCdW5kbGVzKSwgRm9sZGVyKEYpIHsKKyAgICBTZXRJbnNlcnRQb2ludChUaGVCQiwgSVApOworICB9CisKKyAgSVJCdWlsZGVyKEJhc2ljQmxvY2sgKlRoZUJCLCBCYXNpY0Jsb2NrOjppdGVyYXRvciBJUCwKKyAgICAgICAgICAgIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0ciwKKyAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IE9wQnVuZGxlcyA9IE5vbmUpCisgICAgICA6IElSQnVpbGRlckJhc2UoVGhlQkItPmdldENvbnRleHQoKSwgRlBNYXRoVGFnLCBPcEJ1bmRsZXMpIHsKKyAgICBTZXRJbnNlcnRQb2ludChUaGVCQiwgSVApOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGNvbnN0YW50IGZvbGRlciBiZWluZyB1c2VkLgorICBjb25zdCBUICZnZXRGb2xkZXIoKSB7IHJldHVybiBGb2xkZXI7IH0KKworICAvLy8gXGJyaWVmIEluc2VydCBhbmQgcmV0dXJuIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIEluc3RUeT4KKyAgSW5zdFR5ICpJbnNlcnQoSW5zdFR5ICpJLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSBjb25zdCB7CisgICAgdGhpcy0+SW5zZXJ0SGVscGVyKEksIE5hbWUsIEJCLCBJbnNlcnRQdCk7CisgICAgdGhpcy0+U2V0SW5zdERlYnVnTG9jYXRpb24oSSk7CisgICAgcmV0dXJuIEk7CisgIH0KKworICAvLy8gXGJyaWVmIE5vLW9wIG92ZXJsb2FkIHRvIGhhbmRsZSBjb25zdGFudHMuCisgIENvbnN0YW50ICpJbnNlcnQoQ29uc3RhbnQgKkMsIGNvbnN0IFR3aW5lJiA9ICIiKSBjb25zdCB7CisgICAgcmV0dXJuIEM7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSW5zdHJ1Y3Rpb24gY3JlYXRpb24gbWV0aG9kczogVGVybWluYXRvcnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgSGVscGVyIHRvIGFkZCBicmFuY2ggd2VpZ2h0IGFuZCB1bnByZWRpY3RhYmxlIG1ldGFkYXRhIG9udG8gYW4KKyAgLy8vIGluc3RydWN0aW9uLgorICAvLy8gXHJldHVybnMgVGhlIGFubm90YXRlZCBpbnN0cnVjdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEluc3RUeT4KKyAgSW5zdFR5ICphZGRCcmFuY2hNZXRhZGF0YShJbnN0VHkgKkksIE1ETm9kZSAqV2VpZ2h0cywgTUROb2RlICpVbnByZWRpY3RhYmxlKSB7CisgICAgaWYgKFdlaWdodHMpCisgICAgICBJLT5zZXRNZXRhZGF0YShMTFZNQ29udGV4dDo6TURfcHJvZiwgV2VpZ2h0cyk7CisgICAgaWYgKFVucHJlZGljdGFibGUpCisgICAgICBJLT5zZXRNZXRhZGF0YShMTFZNQ29udGV4dDo6TURfdW5wcmVkaWN0YWJsZSwgVW5wcmVkaWN0YWJsZSk7CisgICAgcmV0dXJuIEk7CisgIH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIENyZWF0ZSBhICdyZXQgdm9pZCcgaW5zdHJ1Y3Rpb24uCisgIFJldHVybkluc3QgKkNyZWF0ZVJldFZvaWQoKSB7CisgICAgcmV0dXJuIEluc2VydChSZXR1cm5JbnN0OjpDcmVhdGUoQ29udGV4dCkpOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSAncmV0IDx2YWw+JyBpbnN0cnVjdGlvbi4KKyAgUmV0dXJuSW5zdCAqQ3JlYXRlUmV0KFZhbHVlICpWKSB7CisgICAgcmV0dXJuIEluc2VydChSZXR1cm5JbnN0OjpDcmVhdGUoQ29udGV4dCwgVikpOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBzZXF1ZW5jZSBvZiBOIGluc2VydHZhbHVlIGluc3RydWN0aW9ucywKKyAgLy8vIHdpdGggb25lIFZhbHVlIGZyb20gdGhlIHJldFZhbHMgYXJyYXkgZWFjaCwgdGhhdCBidWlsZCBhIGFnZ3JlZ2F0ZQorICAvLy8gcmV0dXJuIHZhbHVlIG9uZSB2YWx1ZSBhdCBhIHRpbWUsIGFuZCBhIHJldCBpbnN0cnVjdGlvbiB0byByZXR1cm4KKyAgLy8vIHRoZSByZXN1bHRpbmcgYWdncmVnYXRlIHZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgY29kZSB0aGF0IHVzZXMgYWdncmVnYXRlIHJldHVybiB2YWx1ZXMKKyAgLy8vIGFzIGEgdmVoaWNsZSBmb3IgaGF2aW5nIG11bHRpcGxlIHJldHVybiB2YWx1ZXMuCisgIFJldHVybkluc3QgKkNyZWF0ZUFnZ3JlZ2F0ZVJldChWYWx1ZSAqY29uc3QgKnJldFZhbHMsIHVuc2lnbmVkIE4pIHsKKyAgICBWYWx1ZSAqViA9IFVuZGVmVmFsdWU6OmdldChnZXRDdXJyZW50RnVuY3Rpb25SZXR1cm5UeXBlKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTjsgKytpKQorICAgICAgViA9IENyZWF0ZUluc2VydFZhbHVlKFYsIHJldFZhbHNbaV0sIGksICJtcnYiKTsKKyAgICByZXR1cm4gSW5zZXJ0KFJldHVybkluc3Q6OkNyZWF0ZShDb250ZXh0LCBWKSk7CisgIH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhbiB1bmNvbmRpdGlvbmFsICdiciBsYWJlbCBYJyBpbnN0cnVjdGlvbi4KKyAgQnJhbmNoSW5zdCAqQ3JlYXRlQnIoQmFzaWNCbG9jayAqRGVzdCkgeworICAgIHJldHVybiBJbnNlcnQoQnJhbmNoSW5zdDo6Q3JlYXRlKERlc3QpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgY29uZGl0aW9uYWwgJ2JyIENvbmQsIFRydWVEZXN0LCBGYWxzZURlc3QnCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgQnJhbmNoSW5zdCAqQ3JlYXRlQ29uZEJyKFZhbHVlICpDb25kLCBCYXNpY0Jsb2NrICpUcnVlLCBCYXNpY0Jsb2NrICpGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqQnJhbmNoV2VpZ2h0cyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKlVucHJlZGljdGFibGUgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIEluc2VydChhZGRCcmFuY2hNZXRhZGF0YShCcmFuY2hJbnN0OjpDcmVhdGUoVHJ1ZSwgRmFsc2UsIENvbmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnJhbmNoV2VpZ2h0cywgVW5wcmVkaWN0YWJsZSkpOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBjb25kaXRpb25hbCAnYnIgQ29uZCwgVHJ1ZURlc3QsIEZhbHNlRGVzdCcKKyAgLy8vIGluc3RydWN0aW9uLiBDb3B5IGJyYW5jaCBtZXRhIGRhdGEgaWYgYXZhaWxhYmxlLgorICBCcmFuY2hJbnN0ICpDcmVhdGVDb25kQnIoVmFsdWUgKkNvbmQsIEJhc2ljQmxvY2sgKlRydWUsIEJhc2ljQmxvY2sgKkZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKk1EU3JjKSB7CisgICAgQnJhbmNoSW5zdCAqQnIgPSBCcmFuY2hJbnN0OjpDcmVhdGUoVHJ1ZSwgRmFsc2UsIENvbmQpOworICAgIGlmIChNRFNyYykgeworICAgICAgdW5zaWduZWQgV0xbNF0gPSB7TExWTUNvbnRleHQ6Ok1EX3Byb2YsIExMVk1Db250ZXh0OjpNRF91bnByZWRpY3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQ6Ok1EX21ha2VfaW1wbGljaXQsIExMVk1Db250ZXh0OjpNRF9kYmd9OworICAgICAgQnItPmNvcHlNZXRhZGF0YSgqTURTcmMsIG1ha2VBcnJheVJlZigmV0xbMF0sIDQpKTsKKyAgICB9CisgICAgcmV0dXJuIEluc2VydChCcik7CisgIH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIHN3aXRjaCBpbnN0cnVjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUsIGRlZmF1bHQgZGVzdCwKKyAgLy8vIGFuZCB3aXRoIGEgaGludCBmb3IgdGhlIG51bWJlciBvZiBjYXNlcyB0aGF0IHdpbGwgYmUgYWRkZWQgKGZvciBlZmZpY2llbnQKKyAgLy8vIGFsbG9jYXRpb24pLgorICBTd2l0Y2hJbnN0ICpDcmVhdGVTd2l0Y2goVmFsdWUgKlYsIEJhc2ljQmxvY2sgKkRlc3QsIHVuc2lnbmVkIE51bUNhc2VzID0gMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkJyYW5jaFdlaWdodHMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpVbnByZWRpY3RhYmxlID0gbnVsbHB0cikgeworICAgIHJldHVybiBJbnNlcnQoYWRkQnJhbmNoTWV0YWRhdGEoU3dpdGNoSW5zdDo6Q3JlYXRlKFYsIERlc3QsIE51bUNhc2VzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyYW5jaFdlaWdodHMsIFVucHJlZGljdGFibGUpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIGluZGlyZWN0IGJyYW5jaCBpbnN0cnVjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgYWRkcmVzcworICAvLy8gb3BlcmFuZCwgd2l0aCBhbiBvcHRpb25hbCBoaW50IGZvciB0aGUgbnVtYmVyIG9mIGRlc3RpbmF0aW9ucyB0aGF0IHdpbGwgYmUKKyAgLy8vIGFkZGVkIChmb3IgZWZmaWNpZW50IGFsbG9jYXRpb24pLgorICBJbmRpcmVjdEJySW5zdCAqQ3JlYXRlSW5kaXJlY3RCcihWYWx1ZSAqQWRkciwgdW5zaWduZWQgTnVtRGVzdHMgPSAxMCkgeworICAgIHJldHVybiBJbnNlcnQoSW5kaXJlY3RCckluc3Q6OkNyZWF0ZShBZGRyLCBOdW1EZXN0cykpOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gaW52b2tlIGluc3RydWN0aW9uLgorICBJbnZva2VJbnN0ICpDcmVhdGVJbnZva2UoVmFsdWUgKkNhbGxlZSwgQmFzaWNCbG9jayAqTm9ybWFsRGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKlVud2luZERlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gSW5zZXJ0KEludm9rZUluc3Q6OkNyZWF0ZShDYWxsZWUsIE5vcm1hbERlc3QsIFVud2luZERlc3QsIEFyZ3MpLAorICAgICAgICAgICAgICAgICAgTmFtZSk7CisgIH0KKyAgSW52b2tlSW5zdCAqQ3JlYXRlSW52b2tlKFZhbHVlICpDYWxsZWUsIEJhc2ljQmxvY2sgKk5vcm1hbERlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpVbndpbmREZXN0LCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gT3BCdW5kbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBJbnNlcnQoSW52b2tlSW5zdDo6Q3JlYXRlKENhbGxlZSwgTm9ybWFsRGVzdCwgVW53aW5kRGVzdCwgQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcEJ1bmRsZXMpLCBOYW1lKTsKKyAgfQorCisgIFJlc3VtZUluc3QgKkNyZWF0ZVJlc3VtZShWYWx1ZSAqRXhuKSB7CisgICAgcmV0dXJuIEluc2VydChSZXN1bWVJbnN0OjpDcmVhdGUoRXhuKSk7CisgIH0KKworICBDbGVhbnVwUmV0dXJuSW5zdCAqQ3JlYXRlQ2xlYW51cFJldChDbGVhbnVwUGFkSW5zdCAqQ2xlYW51cFBhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqVW53aW5kQkIgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIEluc2VydChDbGVhbnVwUmV0dXJuSW5zdDo6Q3JlYXRlKENsZWFudXBQYWQsIFVud2luZEJCKSk7CisgIH0KKworICBDYXRjaFN3aXRjaEluc3QgKkNyZWF0ZUNhdGNoU3dpdGNoKFZhbHVlICpQYXJlbnRQYWQsIEJhc2ljQmxvY2sgKlVud2luZEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUhhbmRsZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gSW5zZXJ0KENhdGNoU3dpdGNoSW5zdDo6Q3JlYXRlKFBhcmVudFBhZCwgVW53aW5kQkIsIE51bUhhbmRsZXJzKSwKKyAgICAgICAgICAgICAgICAgIE5hbWUpOworICB9CisKKyAgQ2F0Y2hQYWRJbnN0ICpDcmVhdGVDYXRjaFBhZChWYWx1ZSAqUGFyZW50UGFkLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gSW5zZXJ0KENhdGNoUGFkSW5zdDo6Q3JlYXRlKFBhcmVudFBhZCwgQXJncyksIE5hbWUpOworICB9CisKKyAgQ2xlYW51cFBhZEluc3QgKkNyZWF0ZUNsZWFudXBQYWQoVmFsdWUgKlBhcmVudFBhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gQXJncyA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gSW5zZXJ0KENsZWFudXBQYWRJbnN0OjpDcmVhdGUoUGFyZW50UGFkLCBBcmdzKSwgTmFtZSk7CisgIH0KKworICBDYXRjaFJldHVybkluc3QgKkNyZWF0ZUNhdGNoUmV0KENhdGNoUGFkSW5zdCAqQ2F0Y2hQYWQsIEJhc2ljQmxvY2sgKkJCKSB7CisgICAgcmV0dXJuIEluc2VydChDYXRjaFJldHVybkluc3Q6OkNyZWF0ZShDYXRjaFBhZCwgQkIpKTsKKyAgfQorCisgIFVucmVhY2hhYmxlSW5zdCAqQ3JlYXRlVW5yZWFjaGFibGUoKSB7CisgICAgcmV0dXJuIEluc2VydChuZXcgVW5yZWFjaGFibGVJbnN0KENvbnRleHQpKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnN0cnVjdGlvbiBjcmVhdGlvbiBtZXRob2RzOiBCaW5hcnkgT3BlcmF0b3JzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworcHJpdmF0ZToKKyAgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZUluc2VydE5VV05TV0Jpbk9wKEJpbmFyeU9wZXJhdG9yOjpCaW5hcnlPcHMgT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKkxIUywgVmFsdWUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcsIGJvb2wgSGFzTlNXKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGUoT3BjLCBMSFMsIFJIUyksIE5hbWUpOworICAgIGlmIChIYXNOVVcpIEJPLT5zZXRIYXNOb1Vuc2lnbmVkV3JhcCgpOworICAgIGlmIChIYXNOU1cpIEJPLT5zZXRIYXNOb1NpZ25lZFdyYXAoKTsKKyAgICByZXR1cm4gQk87CisgIH0KKworICBJbnN0cnVjdGlvbiAqc2V0RlBBdHRycyhJbnN0cnVjdGlvbiAqSSwgTUROb2RlICpGUE1ELAorICAgICAgICAgICAgICAgICAgICAgICAgICBGYXN0TWF0aEZsYWdzIEZNRikgY29uc3QgeworICAgIGlmICghRlBNRCkKKyAgICAgIEZQTUQgPSBEZWZhdWx0RlBNYXRoVGFnOworICAgIGlmIChGUE1EKQorICAgICAgSS0+c2V0TWV0YWRhdGEoTExWTUNvbnRleHQ6Ok1EX2ZwbWF0aCwgRlBNRCk7CisgICAgSS0+c2V0RmFzdE1hdGhGbGFncyhGTUYpOworICAgIHJldHVybiBJOworICB9CisKKyAgVmFsdWUgKmZvbGRDb25zdGFudChJbnN0cnVjdGlvbjo6QmluYXJ5T3BzIE9wYywgVmFsdWUgKkwsCisgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKlIsIGNvbnN0IFR3aW5lICZOYW1lID0gbnVsbHB0cikgY29uc3QgeworICAgIGF1dG8gKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KEwpOworICAgIGF1dG8gKlJDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFIpOworICAgIHJldHVybiAoTEMgJiYgUkMpID8gSW5zZXJ0KEZvbGRlci5DcmVhdGVCaW5PcChPcGMsIExDLCBSQyksIE5hbWUpIDogbnVsbHB0cjsKKyAgfQorCitwdWJsaWM6CisgIFZhbHVlICpDcmVhdGVBZGQoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKSB7CisgICAgaWYgKGF1dG8gKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICBpZiAoYXV0byAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlQWRkKExDLCBSQywgSGFzTlVXLCBIYXNOU1cpLCBOYW1lKTsKKyAgICByZXR1cm4gQ3JlYXRlSW5zZXJ0TlVXTlNXQmluT3AoSW5zdHJ1Y3Rpb246OkFkZCwgTEhTLCBSSFMsIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc05VVywgSGFzTlNXKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVOU1dBZGQoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVBZGQoTEhTLCBSSFMsIE5hbWUsIGZhbHNlLCB0cnVlKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVOVVdBZGQoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVBZGQoTEhTLCBSSFMsIE5hbWUsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVTdWIoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKSB7CisgICAgaWYgKGF1dG8gKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICBpZiAoYXV0byAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlU3ViKExDLCBSQywgSGFzTlVXLCBIYXNOU1cpLCBOYW1lKTsKKyAgICByZXR1cm4gQ3JlYXRlSW5zZXJ0TlVXTlNXQmluT3AoSW5zdHJ1Y3Rpb246OlN1YiwgTEhTLCBSSFMsIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc05VVywgSGFzTlNXKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVOU1dTdWIoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVTdWIoTEhTLCBSSFMsIE5hbWUsIGZhbHNlLCB0cnVlKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVOVVdTdWIoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVTdWIoTEhTLCBSSFMsIE5hbWUsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVNdWwoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKSB7CisgICAgaWYgKGF1dG8gKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICBpZiAoYXV0byAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlTXVsKExDLCBSQywgSGFzTlVXLCBIYXNOU1cpLCBOYW1lKTsKKyAgICByZXR1cm4gQ3JlYXRlSW5zZXJ0TlVXTlNXQmluT3AoSW5zdHJ1Y3Rpb246Ok11bCwgTEhTLCBSSFMsIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc05VVywgSGFzTlNXKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVOU1dNdWwoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVNdWwoTEhTLCBSSFMsIE5hbWUsIGZhbHNlLCB0cnVlKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVOVVdNdWwoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVNdWwoTEhTLCBSSFMsIE5hbWUsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVVRGl2KFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFeGFjdCA9IGZhbHNlKSB7CisgICAgaWYgKGF1dG8gKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICBpZiAoYXV0byAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlVURpdihMQywgUkMsIGlzRXhhY3QpLCBOYW1lKTsKKyAgICBpZiAoIWlzRXhhY3QpCisgICAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVVRGl2KExIUywgUkhTKSwgTmFtZSk7CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRXhhY3RVRGl2KExIUywgUkhTKSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRXhhY3RVRGl2KFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlVURpdihMSFMsIFJIUywgTmFtZSwgdHJ1ZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlU0RpdihWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICBib29sIGlzRXhhY3QgPSBmYWxzZSkgeworICAgIGlmIChhdXRvICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgaWYgKGF1dG8gKlJDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFJIUykpCisgICAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZVNEaXYoTEMsIFJDLCBpc0V4YWN0KSwgTmFtZSk7CisgICAgaWYgKCFpc0V4YWN0KQorICAgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU0RpdihMSFMsIFJIUyksIE5hbWUpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUV4YWN0U0RpdihMSFMsIFJIUyksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUV4YWN0U0RpdihWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZVNEaXYoTEhTLCBSSFMsIE5hbWUsIHRydWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZVVSZW0oVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChWYWx1ZSAqViA9IGZvbGRDb25zdGFudChJbnN0cnVjdGlvbjo6VVJlbSwgTEhTLCBSSFMsIE5hbWUpKSByZXR1cm4gVjsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVVUmVtKExIUywgUkhTKSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlU1JlbShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKFZhbHVlICpWID0gZm9sZENvbnN0YW50KEluc3RydWN0aW9uOjpTUmVtLCBMSFMsIFJIUywgTmFtZSkpIHJldHVybiBWOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVNSZW0oTEhTLCBSSFMpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVTaGwoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKSB7CisgICAgaWYgKGF1dG8gKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICBpZiAoYXV0byAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlU2hsKExDLCBSQywgSGFzTlVXLCBIYXNOU1cpLCBOYW1lKTsKKyAgICByZXR1cm4gQ3JlYXRlSW5zZXJ0TlVXTlNXQmluT3AoSW5zdHJ1Y3Rpb246OlNobCwgTEhTLCBSSFMsIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc05VVywgSGFzTlNXKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVTaGwoVmFsdWUgKkxIUywgY29uc3QgQVBJbnQgJlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKSB7CisgICAgcmV0dXJuIENyZWF0ZVNobChMSFMsIENvbnN0YW50SW50OjpnZXQoTEhTLT5nZXRUeXBlKCksIFJIUyksIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICBIYXNOVVcsIEhhc05TVyk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlU2hsKFZhbHVlICpMSFMsIHVpbnQ2NF90IFJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKSB7CisgICAgcmV0dXJuIENyZWF0ZVNobChMSFMsIENvbnN0YW50SW50OjpnZXQoTEhTLT5nZXRUeXBlKCksIFJIUyksIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICBIYXNOVVcsIEhhc05TVyk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlTFNocihWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICBib29sIGlzRXhhY3QgPSBmYWxzZSkgeworICAgIGlmIChhdXRvICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgaWYgKGF1dG8gKlJDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFJIUykpCisgICAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUxTaHIoTEMsIFJDLCBpc0V4YWN0KSwgTmFtZSk7CisgICAgaWYgKCFpc0V4YWN0KQorICAgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTFNocihMSFMsIFJIUyksIE5hbWUpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUV4YWN0TFNocihMSFMsIFJIUyksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUxTaHIoVmFsdWUgKkxIUywgY29uc3QgQVBJbnQgJlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0V4YWN0ID0gZmFsc2UpIHsKKyAgICByZXR1cm4gQ3JlYXRlTFNocihMSFMsIENvbnN0YW50SW50OjpnZXQoTEhTLT5nZXRUeXBlKCksIFJIUyksIE5hbWUsaXNFeGFjdCk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlTFNocihWYWx1ZSAqTEhTLCB1aW50NjRfdCBSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFeGFjdCA9IGZhbHNlKSB7CisgICAgcmV0dXJuIENyZWF0ZUxTaHIoTEhTLCBDb25zdGFudEludDo6Z2V0KExIUy0+Z2V0VHlwZSgpLCBSSFMpLCBOYW1lLGlzRXhhY3QpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUFTaHIoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0V4YWN0ID0gZmFsc2UpIHsKKyAgICBpZiAoYXV0byAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIGlmIChhdXRvICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVBU2hyKExDLCBSQywgaXNFeGFjdCksIE5hbWUpOworICAgIGlmICghaXNFeGFjdCkKKyAgICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFTaHIoTEhTLCBSSFMpLCBOYW1lKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVFeGFjdEFTaHIoTEhTLCBSSFMpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVBU2hyKFZhbHVlICpMSFMsIGNvbnN0IEFQSW50ICZSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFeGFjdCA9IGZhbHNlKSB7CisgICAgcmV0dXJuIENyZWF0ZUFTaHIoTEhTLCBDb25zdGFudEludDo6Z2V0KExIUy0+Z2V0VHlwZSgpLCBSSFMpLCBOYW1lLGlzRXhhY3QpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUFTaHIoVmFsdWUgKkxIUywgdWludDY0X3QgUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICBib29sIGlzRXhhY3QgPSBmYWxzZSkgeworICAgIHJldHVybiBDcmVhdGVBU2hyKExIUywgQ29uc3RhbnRJbnQ6OmdldChMSFMtPmdldFR5cGUoKSwgUkhTKSwgTmFtZSxpc0V4YWN0KTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVBbmQoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChhdXRvICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKSB7CisgICAgICBpZiAoaXNhPENvbnN0YW50SW50PihSQykgJiYgY2FzdDxDb25zdGFudEludD4oUkMpLT5pc01pbnVzT25lKCkpCisgICAgICAgIHJldHVybiBMSFM7ICAvLyBMSFMgJiAtMSAtPiBMSFMKKyAgICAgIGlmIChhdXRvICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVBbmQoTEMsIFJDKSwgTmFtZSk7CisgICAgfQorICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChMSFMsIFJIUyksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUFuZChWYWx1ZSAqTEhTLCBjb25zdCBBUEludCAmUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUFuZChMSFMsIENvbnN0YW50SW50OjpnZXQoTEhTLT5nZXRUeXBlKCksIFJIUyksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUFuZChWYWx1ZSAqTEhTLCB1aW50NjRfdCBSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlQW5kKExIUywgQ29uc3RhbnRJbnQ6OmdldChMSFMtPmdldFR5cGUoKSwgUkhTKSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlT3IoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChhdXRvICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKSB7CisgICAgICBpZiAoUkMtPmlzTnVsbFZhbHVlKCkpCisgICAgICAgIHJldHVybiBMSFM7ICAvLyBMSFMgfCAwIC0+IExIUworICAgICAgaWYgKGF1dG8gKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZU9yKExDLCBSQyksIE5hbWUpOworICAgIH0KKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVPcihMSFMsIFJIUyksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZU9yKFZhbHVlICpMSFMsIGNvbnN0IEFQSW50ICZSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlT3IoTEhTLCBDb25zdGFudEludDo6Z2V0KExIUy0+Z2V0VHlwZSgpLCBSSFMpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVPcihWYWx1ZSAqTEhTLCB1aW50NjRfdCBSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlT3IoTEhTLCBDb25zdGFudEludDo6Z2V0KExIUy0+Z2V0VHlwZSgpLCBSSFMpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVYb3IoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChWYWx1ZSAqViA9IGZvbGRDb25zdGFudChJbnN0cnVjdGlvbjo6WG9yLCBMSFMsIFJIUywgTmFtZSkpIHJldHVybiBWOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVhvcihMSFMsIFJIUyksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZVhvcihWYWx1ZSAqTEhTLCBjb25zdCBBUEludCAmUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZVhvcihMSFMsIENvbnN0YW50SW50OjpnZXQoTEhTLT5nZXRUeXBlKCksIFJIUyksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZVhvcihWYWx1ZSAqTEhTLCB1aW50NjRfdCBSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlWG9yKExIUywgQ29uc3RhbnRJbnQ6OmdldChMSFMtPmdldFR5cGUoKSwgUkhTKSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRkFkZChWYWx1ZSAqTCwgVmFsdWUgKlIsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqRlBNRCA9IG51bGxwdHIpIHsKKyAgICBpZiAoVmFsdWUgKlYgPSBmb2xkQ29uc3RhbnQoSW5zdHJ1Y3Rpb246OkZBZGQsIEwsIFIsIE5hbWUpKSByZXR1cm4gVjsKKyAgICBJbnN0cnVjdGlvbiAqSSA9IHNldEZQQXR0cnMoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZBZGQoTCwgUiksIEZQTUQsIEZNRik7CisgICAgcmV0dXJuIEluc2VydChJLCBOYW1lKTsKKyAgfQorCisgIC8vLyBDb3B5IGZhc3QtbWF0aC1mbGFncyBmcm9tIGFuIGluc3RydWN0aW9uIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBidWlsZGVyJ3MKKyAgLy8vIGRlZmF1bHQgRk1GLgorICBWYWx1ZSAqQ3JlYXRlRkFkZEZNRihWYWx1ZSAqTCwgVmFsdWUgKlIsIEluc3RydWN0aW9uICpGTUZTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoVmFsdWUgKlYgPSBmb2xkQ29uc3RhbnQoSW5zdHJ1Y3Rpb246OkZBZGQsIEwsIFIsIE5hbWUpKSByZXR1cm4gVjsKKyAgICBJbnN0cnVjdGlvbiAqSSA9IHNldEZQQXR0cnMoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZBZGQoTCwgUiksIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZNRlNvdXJjZS0+Z2V0RmFzdE1hdGhGbGFncygpKTsKKyAgICByZXR1cm4gSW5zZXJ0KEksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZTdWIoVmFsdWUgKkwsIFZhbHVlICpSLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkZQTUQgPSBudWxscHRyKSB7CisgICAgaWYgKFZhbHVlICpWID0gZm9sZENvbnN0YW50KEluc3RydWN0aW9uOjpGU3ViLCBMLCBSLCBOYW1lKSkgcmV0dXJuIFY7CisgICAgSW5zdHJ1Y3Rpb24gKkkgPSBzZXRGUEF0dHJzKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGU3ViKEwsIFIpLCBGUE1ELCBGTUYpOworICAgIHJldHVybiBJbnNlcnQoSSwgTmFtZSk7CisgIH0KKworICAvLy8gQ29weSBmYXN0LW1hdGgtZmxhZ3MgZnJvbSBhbiBpbnN0cnVjdGlvbiByYXRoZXIgdGhhbiB1c2luZyB0aGUgYnVpbGRlcidzCisgIC8vLyBkZWZhdWx0IEZNRi4KKyAgVmFsdWUgKkNyZWF0ZUZTdWJGTUYoVmFsdWUgKkwsIFZhbHVlICpSLCBJbnN0cnVjdGlvbiAqRk1GU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKFZhbHVlICpWID0gZm9sZENvbnN0YW50KEluc3RydWN0aW9uOjpGU3ViLCBMLCBSLCBOYW1lKSkgcmV0dXJuIFY7CisgICAgSW5zdHJ1Y3Rpb24gKkkgPSBzZXRGUEF0dHJzKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGU3ViKEwsIFIpLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTUZTb3VyY2UtPmdldEZhc3RNYXRoRmxhZ3MoKSk7CisgICAgcmV0dXJuIEluc2VydChJLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVGTXVsKFZhbHVlICpMLCBWYWx1ZSAqUiwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgTUROb2RlICpGUE1EID0gbnVsbHB0cikgeworICAgIGlmIChWYWx1ZSAqViA9IGZvbGRDb25zdGFudChJbnN0cnVjdGlvbjo6Rk11bCwgTCwgUiwgTmFtZSkpIHJldHVybiBWOworICAgIEluc3RydWN0aW9uICpJID0gc2V0RlBBdHRycyhCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRk11bChMLCBSKSwgRlBNRCwgRk1GKTsKKyAgICByZXR1cm4gSW5zZXJ0KEksIE5hbWUpOworICB9CisKKyAgLy8vIENvcHkgZmFzdC1tYXRoLWZsYWdzIGZyb20gYW4gaW5zdHJ1Y3Rpb24gcmF0aGVyIHRoYW4gdXNpbmcgdGhlIGJ1aWxkZXIncworICAvLy8gZGVmYXVsdCBGTUYuCisgIFZhbHVlICpDcmVhdGVGTXVsRk1GKFZhbHVlICpMLCBWYWx1ZSAqUiwgSW5zdHJ1Y3Rpb24gKkZNRlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChWYWx1ZSAqViA9IGZvbGRDb25zdGFudChJbnN0cnVjdGlvbjo6Rk11bCwgTCwgUiwgTmFtZSkpIHJldHVybiBWOworICAgIEluc3RydWN0aW9uICpJID0gc2V0RlBBdHRycyhCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRk11bChMLCBSKSwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk1GU291cmNlLT5nZXRGYXN0TWF0aEZsYWdzKCkpOworICAgIHJldHVybiBJbnNlcnQoSSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRkRpdihWYWx1ZSAqTCwgVmFsdWUgKlIsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqRlBNRCA9IG51bGxwdHIpIHsKKyAgICBpZiAoVmFsdWUgKlYgPSBmb2xkQ29uc3RhbnQoSW5zdHJ1Y3Rpb246OkZEaXYsIEwsIFIsIE5hbWUpKSByZXR1cm4gVjsKKyAgICBJbnN0cnVjdGlvbiAqSSA9IHNldEZQQXR0cnMoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZEaXYoTCwgUiksIEZQTUQsIEZNRik7CisgICAgcmV0dXJuIEluc2VydChJLCBOYW1lKTsKKyAgfQorCisgIC8vLyBDb3B5IGZhc3QtbWF0aC1mbGFncyBmcm9tIGFuIGluc3RydWN0aW9uIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBidWlsZGVyJ3MKKyAgLy8vIGRlZmF1bHQgRk1GLgorICBWYWx1ZSAqQ3JlYXRlRkRpdkZNRihWYWx1ZSAqTCwgVmFsdWUgKlIsIEluc3RydWN0aW9uICpGTUZTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoVmFsdWUgKlYgPSBmb2xkQ29uc3RhbnQoSW5zdHJ1Y3Rpb246OkZEaXYsIEwsIFIsIE5hbWUpKSByZXR1cm4gVjsKKyAgICBJbnN0cnVjdGlvbiAqSSA9IHNldEZQQXR0cnMoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZEaXYoTCwgUiksIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZNRlNvdXJjZS0+Z2V0RmFzdE1hdGhGbGFncygpKTsKKyAgICByZXR1cm4gSW5zZXJ0KEksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZSZW0oVmFsdWUgKkwsIFZhbHVlICpSLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkZQTUQgPSBudWxscHRyKSB7CisgICAgaWYgKFZhbHVlICpWID0gZm9sZENvbnN0YW50KEluc3RydWN0aW9uOjpGUmVtLCBMLCBSLCBOYW1lKSkgcmV0dXJuIFY7CisgICAgSW5zdHJ1Y3Rpb24gKkkgPSBzZXRGUEF0dHJzKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGUmVtKEwsIFIpLCBGUE1ELCBGTUYpOworICAgIHJldHVybiBJbnNlcnQoSSwgTmFtZSk7CisgIH0KKworICAvLy8gQ29weSBmYXN0LW1hdGgtZmxhZ3MgZnJvbSBhbiBpbnN0cnVjdGlvbiByYXRoZXIgdGhhbiB1c2luZyB0aGUgYnVpbGRlcidzCisgIC8vLyBkZWZhdWx0IEZNRi4KKyAgVmFsdWUgKkNyZWF0ZUZSZW1GTUYoVmFsdWUgKkwsIFZhbHVlICpSLCBJbnN0cnVjdGlvbiAqRk1GU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKFZhbHVlICpWID0gZm9sZENvbnN0YW50KEluc3RydWN0aW9uOjpGUmVtLCBMLCBSLCBOYW1lKSkgcmV0dXJuIFY7CisgICAgSW5zdHJ1Y3Rpb24gKkkgPSBzZXRGUEF0dHJzKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGUmVtKEwsIFIpLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTUZTb3VyY2UtPmdldEZhc3RNYXRoRmxhZ3MoKSk7CisgICAgcmV0dXJuIEluc2VydChJLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVCaW5PcChJbnN0cnVjdGlvbjo6QmluYXJ5T3BzIE9wYywKKyAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIpIHsKKyAgICBpZiAoVmFsdWUgKlYgPSBmb2xkQ29uc3RhbnQoT3BjLCBMSFMsIFJIUywgTmFtZSkpIHJldHVybiBWOworICAgIEluc3RydWN0aW9uICpCaW5PcCA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGUoT3BjLCBMSFMsIFJIUyk7CisgICAgaWYgKGlzYTxGUE1hdGhPcGVyYXRvcj4oQmluT3ApKQorICAgICAgQmluT3AgPSBzZXRGUEF0dHJzKEJpbk9wLCBGUE1hdGhUYWcsIEZNRik7CisgICAgcmV0dXJuIEluc2VydChCaW5PcCwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlTmVnKFZhbHVlICpWLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpIHsKKyAgICBpZiAoYXV0byAqVkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVOZWcoVkMsIEhhc05VVywgSGFzTlNXKSwgTmFtZSk7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOZWcoViksIE5hbWUpOworICAgIGlmIChIYXNOVVcpIEJPLT5zZXRIYXNOb1Vuc2lnbmVkV3JhcCgpOworICAgIGlmIChIYXNOU1cpIEJPLT5zZXRIYXNOb1NpZ25lZFdyYXAoKTsKKyAgICByZXR1cm4gQk87CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlTlNXTmVnKFZhbHVlICpWLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZU5lZyhWLCBOYW1lLCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlTlVXTmVnKFZhbHVlICpWLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZU5lZyhWLCBOYW1lLCB0cnVlLCBmYWxzZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRk5lZyhWYWx1ZSAqViwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgTUROb2RlICpGUE1hdGhUYWcgPSBudWxscHRyKSB7CisgICAgaWYgKGF1dG8gKlZDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlRk5lZyhWQyksIE5hbWUpOworICAgIHJldHVybiBJbnNlcnQoc2V0RlBBdHRycyhCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRk5lZyhWKSwgRlBNYXRoVGFnLCBGTUYpLAorICAgICAgICAgICAgICAgICAgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlTm90KFZhbHVlICpWLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKGF1dG8gKlZDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlTm90KFZDKSwgTmFtZSk7CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTm90KFYpLCBOYW1lKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnN0cnVjdGlvbiBjcmVhdGlvbiBtZXRob2RzOiBNZW1vcnkgSW5zdHJ1Y3Rpb25zCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIEFsbG9jYUluc3QgKkNyZWF0ZUFsbG9jYShUeXBlICpUeSwgdW5zaWduZWQgQWRkclNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKkFycmF5U2l6ZSA9IG51bGxwdHIsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gSW5zZXJ0KG5ldyBBbGxvY2FJbnN0KFR5LCBBZGRyU3BhY2UsIEFycmF5U2l6ZSksIE5hbWUpOworICB9CisKKyAgQWxsb2NhSW5zdCAqQ3JlYXRlQWxsb2NhKFR5cGUgKlR5LCBWYWx1ZSAqQXJyYXlTaXplID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBjb25zdCBEYXRhTGF5b3V0ICZETCA9IEJCLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCktPmdldERhdGFMYXlvdXQoKTsKKyAgICByZXR1cm4gSW5zZXJ0KG5ldyBBbGxvY2FJbnN0KFR5LCBETC5nZXRBbGxvY2FBZGRyU3BhY2UoKSwgQXJyYXlTaXplKSwgTmFtZSk7CisgIH0KKworICAvLy8gXGJyaWVmIFByb3ZpZGVkIHRvIHJlc29sdmUgJ0NyZWF0ZUxvYWQoUHRyLCAiLi4uIiknIGNvcnJlY3RseSwgaW5zdGVhZCBvZgorICAvLy8gY29udmVydGluZyB0aGUgc3RyaW5nIHRvICdib29sJyBmb3IgdGhlIGlzVm9sYXRpbGUgcGFyYW1ldGVyLgorICBMb2FkSW5zdCAqQ3JlYXRlTG9hZChWYWx1ZSAqUHRyLCBjb25zdCBjaGFyICpOYW1lKSB7CisgICAgcmV0dXJuIEluc2VydChuZXcgTG9hZEluc3QoUHRyKSwgTmFtZSk7CisgIH0KKworICBMb2FkSW5zdCAqQ3JlYXRlTG9hZChWYWx1ZSAqUHRyLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIEluc2VydChuZXcgTG9hZEluc3QoUHRyKSwgTmFtZSk7CisgIH0KKworICBMb2FkSW5zdCAqQ3JlYXRlTG9hZChUeXBlICpUeSwgVmFsdWUgKlB0ciwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBJbnNlcnQobmV3IExvYWRJbnN0KFR5LCBQdHIpLCBOYW1lKTsKKyAgfQorCisgIExvYWRJbnN0ICpDcmVhdGVMb2FkKFZhbHVlICpQdHIsIGJvb2wgaXNWb2xhdGlsZSwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBJbnNlcnQobmV3IExvYWRJbnN0KFB0ciwgbnVsbHB0ciwgaXNWb2xhdGlsZSksIE5hbWUpOworICB9CisKKyAgU3RvcmVJbnN0ICpDcmVhdGVTdG9yZShWYWx1ZSAqVmFsLCBWYWx1ZSAqUHRyLCBib29sIGlzVm9sYXRpbGUgPSBmYWxzZSkgeworICAgIHJldHVybiBJbnNlcnQobmV3IFN0b3JlSW5zdChWYWwsIFB0ciwgaXNWb2xhdGlsZSkpOworICB9CisKKyAgLy8vIFxicmllZiBQcm92aWRlZCB0byByZXNvbHZlICdDcmVhdGVBbGlnbmVkTG9hZChQdHIsIEFsaWduLCAiLi4uIiknCisgIC8vLyBjb3JyZWN0bHksIGluc3RlYWQgb2YgY29udmVydGluZyB0aGUgc3RyaW5nIHRvICdib29sJyBmb3IgdGhlIGlzVm9sYXRpbGUKKyAgLy8vIHBhcmFtZXRlci4KKyAgTG9hZEluc3QgKkNyZWF0ZUFsaWduZWRMb2FkKFZhbHVlICpQdHIsIHVuc2lnbmVkIEFsaWduLCBjb25zdCBjaGFyICpOYW1lKSB7CisgICAgTG9hZEluc3QgKkxJID0gQ3JlYXRlTG9hZChQdHIsIE5hbWUpOworICAgIExJLT5zZXRBbGlnbm1lbnQoQWxpZ24pOworICAgIHJldHVybiBMSTsKKyAgfQorICBMb2FkSW5zdCAqQ3JlYXRlQWxpZ25lZExvYWQoVmFsdWUgKlB0ciwgdW5zaWduZWQgQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgTG9hZEluc3QgKkxJID0gQ3JlYXRlTG9hZChQdHIsIE5hbWUpOworICAgIExJLT5zZXRBbGlnbm1lbnQoQWxpZ24pOworICAgIHJldHVybiBMSTsKKyAgfQorICBMb2FkSW5zdCAqQ3JlYXRlQWxpZ25lZExvYWQoVmFsdWUgKlB0ciwgdW5zaWduZWQgQWxpZ24sIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBMb2FkSW5zdCAqTEkgPSBDcmVhdGVMb2FkKFB0ciwgaXNWb2xhdGlsZSwgTmFtZSk7CisgICAgTEktPnNldEFsaWdubWVudChBbGlnbik7CisgICAgcmV0dXJuIExJOworICB9CisKKyAgU3RvcmVJbnN0ICpDcmVhdGVBbGlnbmVkU3RvcmUoVmFsdWUgKlZhbCwgVmFsdWUgKlB0ciwgdW5zaWduZWQgQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWb2xhdGlsZSA9IGZhbHNlKSB7CisgICAgU3RvcmVJbnN0ICpTSSA9IENyZWF0ZVN0b3JlKFZhbCwgUHRyLCBpc1ZvbGF0aWxlKTsKKyAgICBTSS0+c2V0QWxpZ25tZW50KEFsaWduKTsKKyAgICByZXR1cm4gU0k7CisgIH0KKworICBGZW5jZUluc3QgKkNyZWF0ZUZlbmNlKEF0b21pY09yZGVyaW5nIE9yZGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN5bmNTY29wZTo6SUQgU1NJRCA9IFN5bmNTY29wZTo6U3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gSW5zZXJ0KG5ldyBGZW5jZUluc3QoQ29udGV4dCwgT3JkZXJpbmcsIFNTSUQpLCBOYW1lKTsKKyAgfQorCisgIEF0b21pY0NtcFhjaGdJbnN0ICoKKyAgQ3JlYXRlQXRvbWljQ21wWGNoZyhWYWx1ZSAqUHRyLCBWYWx1ZSAqQ21wLCBWYWx1ZSAqTmV3LAorICAgICAgICAgICAgICAgICAgICAgIEF0b21pY09yZGVyaW5nIFN1Y2Nlc3NPcmRlcmluZywKKyAgICAgICAgICAgICAgICAgICAgICBBdG9taWNPcmRlcmluZyBGYWlsdXJlT3JkZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgU3luY1Njb3BlOjpJRCBTU0lEID0gU3luY1Njb3BlOjpTeXN0ZW0pIHsKKyAgICByZXR1cm4gSW5zZXJ0KG5ldyBBdG9taWNDbXBYY2hnSW5zdChQdHIsIENtcCwgTmV3LCBTdWNjZXNzT3JkZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFpbHVyZU9yZGVyaW5nLCBTU0lEKSk7CisgIH0KKworICBBdG9taWNSTVdJbnN0ICpDcmVhdGVBdG9taWNSTVcoQXRvbWljUk1XSW5zdDo6QmluT3AgT3AsIFZhbHVlICpQdHIsIFZhbHVlICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNPcmRlcmluZyBPcmRlcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bmNTY29wZTo6SUQgU1NJRCA9IFN5bmNTY29wZTo6U3lzdGVtKSB7CisgICAgcmV0dXJuIEluc2VydChuZXcgQXRvbWljUk1XSW5zdChPcCwgUHRyLCBWYWwsIE9yZGVyaW5nLCBTU0lEKSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlR0VQKFZhbHVlICpQdHIsIEFycmF5UmVmPFZhbHVlICo+IElkeExpc3QsCisgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVHRVAobnVsbHB0ciwgUHRyLCBJZHhMaXN0LCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVHRVAoVHlwZSAqVHksIFZhbHVlICpQdHIsIEFycmF5UmVmPFZhbHVlICo+IElkeExpc3QsCisgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChhdXRvICpQQyA9IGR5bl9jYXN0PENvbnN0YW50PihQdHIpKSB7CisgICAgICAvLyBFdmVyeSBpbmRleCBtdXN0IGJlIGNvbnN0YW50LgorICAgICAgc2l6ZV90IGksIGU7CisgICAgICBmb3IgKGkgPSAwLCBlID0gSWR4TGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBpZiAoIWlzYTxDb25zdGFudD4oSWR4TGlzdFtpXSkpCisgICAgICAgICAgYnJlYWs7CisgICAgICBpZiAoaSA9PSBlKQorICAgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVHZXRFbGVtZW50UHRyKFR5LCBQQywgSWR4TGlzdCksIE5hbWUpOworICAgIH0KKyAgICByZXR1cm4gSW5zZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoVHksIFB0ciwgSWR4TGlzdCksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUluQm91bmRzR0VQKFZhbHVlICpQdHIsIEFycmF5UmVmPFZhbHVlICo+IElkeExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUluQm91bmRzR0VQKG51bGxwdHIsIFB0ciwgSWR4TGlzdCwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlSW5Cb3VuZHNHRVAoVHlwZSAqVHksIFZhbHVlICpQdHIsIEFycmF5UmVmPFZhbHVlICo+IElkeExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKGF1dG8gKlBDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFB0cikpIHsKKyAgICAgIC8vIEV2ZXJ5IGluZGV4IG11c3QgYmUgY29uc3RhbnQuCisgICAgICBzaXplX3QgaSwgZTsKKyAgICAgIGZvciAoaSA9IDAsIGUgPSBJZHhMaXN0LnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIGlmICghaXNhPENvbnN0YW50PihJZHhMaXN0W2ldKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIGlmIChpID09IGUpCisgICAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUluQm91bmRzR2V0RWxlbWVudFB0cihUeSwgUEMsIElkeExpc3QpLAorICAgICAgICAgICAgICAgICAgICAgIE5hbWUpOworICAgIH0KKyAgICByZXR1cm4gSW5zZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGVJbkJvdW5kcyhUeSwgUHRyLCBJZHhMaXN0KSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlR0VQKFZhbHVlICpQdHIsIFZhbHVlICpJZHgsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlR0VQKG51bGxwdHIsIFB0ciwgSWR4LCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVHRVAoVHlwZSAqVHksIFZhbHVlICpQdHIsIFZhbHVlICpJZHgsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoYXV0byAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkKKyAgICAgIGlmIChhdXRvICpJQyA9IGR5bl9jYXN0PENvbnN0YW50PihJZHgpKQorICAgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVHZXRFbGVtZW50UHRyKFR5LCBQQywgSUMpLCBOYW1lKTsKKyAgICByZXR1cm4gSW5zZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoVHksIFB0ciwgSWR4KSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlSW5Cb3VuZHNHRVAoVHlwZSAqVHksIFZhbHVlICpQdHIsIFZhbHVlICpJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKGF1dG8gKlBDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFB0cikpCisgICAgICBpZiAoYXV0byAqSUMgPSBkeW5fY2FzdDxDb25zdGFudD4oSWR4KSkKKyAgICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlSW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5LCBQQywgSUMpLCBOYW1lKTsKKyAgICByZXR1cm4gSW5zZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGVJbkJvdW5kcyhUeSwgUHRyLCBJZHgpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVDb25zdEdFUDFfMzIoVmFsdWUgKlB0ciwgdW5zaWduZWQgSWR4MCwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVDb25zdEdFUDFfMzIobnVsbHB0ciwgUHRyLCBJZHgwLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVDb25zdEdFUDFfMzIoVHlwZSAqVHksIFZhbHVlICpQdHIsIHVuc2lnbmVkIElkeDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIFZhbHVlICpJZHggPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksIElkeDApOworCisgICAgaWYgKGF1dG8gKlBDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFB0cikpCisgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVHZXRFbGVtZW50UHRyKFR5LCBQQywgSWR4KSwgTmFtZSk7CisKKyAgICByZXR1cm4gSW5zZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoVHksIFB0ciwgSWR4KSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlQ29uc3RJbkJvdW5kc0dFUDFfMzIoVHlwZSAqVHksIFZhbHVlICpQdHIsIHVuc2lnbmVkIElkeDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgVmFsdWUgKklkeCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgSWR4MCk7CisKKyAgICBpZiAoYXV0byAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkKKyAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUluQm91bmRzR2V0RWxlbWVudFB0cihUeSwgUEMsIElkeCksIE5hbWUpOworCisgICAgcmV0dXJuIEluc2VydChHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlSW5Cb3VuZHMoVHksIFB0ciwgSWR4KSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlQ29uc3RHRVAyXzMyKFR5cGUgKlR5LCBWYWx1ZSAqUHRyLCB1bnNpZ25lZCBJZHgwLCB1bnNpZ25lZCBJZHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBWYWx1ZSAqSWR4c1tdID0geworICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCBJZHgwKSwKKyAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgSWR4MSkKKyAgICB9OworCisgICAgaWYgKGF1dG8gKlBDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFB0cikpCisgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVHZXRFbGVtZW50UHRyKFR5LCBQQywgSWR4cyksIE5hbWUpOworCisgICAgcmV0dXJuIEluc2VydChHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKFR5LCBQdHIsIElkeHMpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVDb25zdEluQm91bmRzR0VQMl8zMihUeXBlICpUeSwgVmFsdWUgKlB0ciwgdW5zaWduZWQgSWR4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElkeDEsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBWYWx1ZSAqSWR4c1tdID0geworICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCBJZHgwKSwKKyAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgSWR4MSkKKyAgICB9OworCisgICAgaWYgKGF1dG8gKlBDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFB0cikpCisgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVJbkJvdW5kc0dldEVsZW1lbnRQdHIoVHksIFBDLCBJZHhzKSwgTmFtZSk7CisKKyAgICByZXR1cm4gSW5zZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGVJbkJvdW5kcyhUeSwgUHRyLCBJZHhzKSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlQ29uc3RHRVAxXzY0KFZhbHVlICpQdHIsIHVpbnQ2NF90IElkeDAsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBWYWx1ZSAqSWR4ID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KENvbnRleHQpLCBJZHgwKTsKKworICAgIGlmIChhdXRvICpQQyA9IGR5bl9jYXN0PENvbnN0YW50PihQdHIpKQorICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlR2V0RWxlbWVudFB0cihudWxscHRyLCBQQywgSWR4KSwgTmFtZSk7CisKKyAgICByZXR1cm4gSW5zZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUobnVsbHB0ciwgUHRyLCBJZHgpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVDb25zdEluQm91bmRzR0VQMV82NChWYWx1ZSAqUHRyLCB1aW50NjRfdCBJZHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIFZhbHVlICpJZHggPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoQ29udGV4dCksIElkeDApOworCisgICAgaWYgKGF1dG8gKlBDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFB0cikpCisgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVJbkJvdW5kc0dldEVsZW1lbnRQdHIobnVsbHB0ciwgUEMsIElkeCksIE5hbWUpOworCisgICAgcmV0dXJuIEluc2VydChHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlSW5Cb3VuZHMobnVsbHB0ciwgUHRyLCBJZHgpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVDb25zdEdFUDJfNjQoVmFsdWUgKlB0ciwgdWludDY0X3QgSWR4MCwgdWludDY0X3QgSWR4MSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIFZhbHVlICpJZHhzW10gPSB7CisgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoQ29udGV4dCksIElkeDApLAorICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KENvbnRleHQpLCBJZHgxKQorICAgIH07CisKKyAgICBpZiAoYXV0byAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkKKyAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUdldEVsZW1lbnRQdHIobnVsbHB0ciwgUEMsIElkeHMpLCBOYW1lKTsKKworICAgIHJldHVybiBJbnNlcnQoR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShudWxscHRyLCBQdHIsIElkeHMpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVDb25zdEluQm91bmRzR0VQMl82NChWYWx1ZSAqUHRyLCB1aW50NjRfdCBJZHgwLCB1aW50NjRfdCBJZHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIFZhbHVlICpJZHhzW10gPSB7CisgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoQ29udGV4dCksIElkeDApLAorICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KENvbnRleHQpLCBJZHgxKQorICAgIH07CisKKyAgICBpZiAoYXV0byAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkKKyAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUluQm91bmRzR2V0RWxlbWVudFB0cihudWxscHRyLCBQQywgSWR4cyksCisgICAgICAgICAgICAgICAgICAgIE5hbWUpOworCisgICAgcmV0dXJuIEluc2VydChHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlSW5Cb3VuZHMobnVsbHB0ciwgUHRyLCBJZHhzKSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlU3RydWN0R0VQKFR5cGUgKlR5LCBWYWx1ZSAqUHRyLCB1bnNpZ25lZCBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVDb25zdEluQm91bmRzR0VQMl8zMihUeSwgUHRyLCAwLCBJZHgsIE5hbWUpOworICB9CisKKyAgLy8vIFxicmllZiBTYW1lIGFzIENyZWF0ZUdsb2JhbFN0cmluZywgYnV0IHJldHVybiBhIHBvaW50ZXIgd2l0aCAiaTgqIiB0eXBlCisgIC8vLyBpbnN0ZWFkIG9mIGEgcG9pbnRlciB0byBhcnJheSBvZiBpOC4KKyAgVmFsdWUgKkNyZWF0ZUdsb2JhbFN0cmluZ1B0cihTdHJpbmdSZWYgU3RyLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSA9IDApIHsKKyAgICBHbG9iYWxWYXJpYWJsZSAqZ3YgPSBDcmVhdGVHbG9iYWxTdHJpbmcoU3RyLCBOYW1lLCBBZGRyZXNzU3BhY2UpOworICAgIFZhbHVlICp6ZXJvID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCAwKTsKKyAgICBWYWx1ZSAqQXJnc1tdID0geyB6ZXJvLCB6ZXJvIH07CisgICAgcmV0dXJuIENyZWF0ZUluQm91bmRzR0VQKGd2LT5nZXRWYWx1ZVR5cGUoKSwgZ3YsIEFyZ3MsIE5hbWUpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEluc3RydWN0aW9uIGNyZWF0aW9uIG1ldGhvZHM6IENhc3QvQ29udmVyc2lvbiBPcGVyYXRvcnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgVmFsdWUgKkNyZWF0ZVRydW5jKFZhbHVlICpWLCBUeXBlICpEZXN0VHksIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6VHJ1bmMsIFYsIERlc3RUeSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlWkV4dChWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OlpFeHQsIFYsIERlc3RUeSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlU0V4dChWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OlNFeHQsIFYsIERlc3RUeSwgTmFtZSk7CisgIH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIFpFeHQgb3IgVHJ1bmMgZnJvbSB0aGUgaW50ZWdlciB2YWx1ZSBWIHRvIERlc3RUeS4gUmV0dXJuCisgIC8vLyB0aGUgdmFsdWUgdW50b3VjaGVkIGlmIHRoZSB0eXBlIG9mIFYgaXMgYWxyZWFkeSBEZXN0VHkuCisgIFZhbHVlICpDcmVhdGVaRXh0T3JUcnVuYyhWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGFzc2VydChWLT5nZXRUeXBlKCktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmCisgICAgICAgICAgIERlc3RUeS0+aXNJbnRPckludFZlY3RvclR5KCkgJiYKKyAgICAgICAgICAgIkNhbiBvbmx5IHplcm8gZXh0ZW5kL3RydW5jYXRlIGludGVnZXJzISIpOworICAgIFR5cGUgKlZUeSA9IFYtPmdldFR5cGUoKTsKKyAgICBpZiAoVlR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgPCBEZXN0VHktPmdldFNjYWxhclNpemVJbkJpdHMoKSkKKyAgICAgIHJldHVybiBDcmVhdGVaRXh0KFYsIERlc3RUeSwgTmFtZSk7CisgICAgaWYgKFZUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpID4gRGVzdFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCkpCisgICAgICByZXR1cm4gQ3JlYXRlVHJ1bmMoViwgRGVzdFR5LCBOYW1lKTsKKyAgICByZXR1cm4gVjsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgU0V4dCBvciBUcnVuYyBmcm9tIHRoZSBpbnRlZ2VyIHZhbHVlIFYgdG8gRGVzdFR5LiBSZXR1cm4KKyAgLy8vIHRoZSB2YWx1ZSB1bnRvdWNoZWQgaWYgdGhlIHR5cGUgb2YgViBpcyBhbHJlYWR5IERlc3RUeS4KKyAgVmFsdWUgKkNyZWF0ZVNFeHRPclRydW5jKFZhbHVlICpWLCBUeXBlICpEZXN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgYXNzZXJ0KFYtPmdldFR5cGUoKS0+aXNJbnRPckludFZlY3RvclR5KCkgJiYKKyAgICAgICAgICAgRGVzdFR5LT5pc0ludE9ySW50VmVjdG9yVHkoKSAmJgorICAgICAgICAgICAiQ2FuIG9ubHkgc2lnbiBleHRlbmQvdHJ1bmNhdGUgaW50ZWdlcnMhIik7CisgICAgVHlwZSAqVlR5ID0gVi0+Z2V0VHlwZSgpOworICAgIGlmIChWVHktPmdldFNjYWxhclNpemVJbkJpdHMoKSA8IERlc3RUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpKQorICAgICAgcmV0dXJuIENyZWF0ZVNFeHQoViwgRGVzdFR5LCBOYW1lKTsKKyAgICBpZiAoVlR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgPiBEZXN0VHktPmdldFNjYWxhclNpemVJbkJpdHMoKSkKKyAgICAgIHJldHVybiBDcmVhdGVUcnVuYyhWLCBEZXN0VHksIE5hbWUpOworICAgIHJldHVybiBWOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZQVG9VSShWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKXsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6RlBUb1VJLCBWLCBEZXN0VHksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZQVG9TSShWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKXsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6RlBUb1NJLCBWLCBEZXN0VHksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZVVJVG9GUChWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKXsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6VUlUb0ZQLCBWLCBEZXN0VHksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZVNJVG9GUChWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKXsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6U0lUb0ZQLCBWLCBEZXN0VHksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZQVHJ1bmMoVmFsdWUgKlYsIFR5cGUgKkRlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpGUFRydW5jLCBWLCBEZXN0VHksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZQRXh0KFZhbHVlICpWLCBUeXBlICpEZXN0VHksIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6RlBFeHQsIFYsIERlc3RUeSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlUHRyVG9JbnQoVmFsdWUgKlYsIFR5cGUgKkRlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6UHRyVG9JbnQsIFYsIERlc3RUeSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlSW50VG9QdHIoVmFsdWUgKlYsIFR5cGUgKkRlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6SW50VG9QdHIsIFYsIERlc3RUeSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlQml0Q2FzdChWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OkJpdENhc3QsIFYsIERlc3RUeSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlQWRkclNwYWNlQ2FzdChWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OkFkZHJTcGFjZUNhc3QsIFYsIERlc3RUeSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlWkV4dE9yQml0Q2FzdChWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKFYtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gVjsKKyAgICBpZiAoYXV0byAqVkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVaRXh0T3JCaXRDYXN0KFZDLCBEZXN0VHkpLCBOYW1lKTsKKyAgICByZXR1cm4gSW5zZXJ0KENhc3RJbnN0OjpDcmVhdGVaRXh0T3JCaXRDYXN0KFYsIERlc3RUeSksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZVNFeHRPckJpdENhc3QoVmFsdWUgKlYsIFR5cGUgKkRlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChWLT5nZXRUeXBlKCkgPT0gRGVzdFR5KQorICAgICAgcmV0dXJuIFY7CisgICAgaWYgKGF1dG8gKlZDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlU0V4dE9yQml0Q2FzdChWQywgRGVzdFR5KSwgTmFtZSk7CisgICAgcmV0dXJuIEluc2VydChDYXN0SW5zdDo6Q3JlYXRlU0V4dE9yQml0Q2FzdChWLCBEZXN0VHkpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVUcnVuY09yQml0Q2FzdChWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChWLT5nZXRUeXBlKCkgPT0gRGVzdFR5KQorICAgICAgcmV0dXJuIFY7CisgICAgaWYgKGF1dG8gKlZDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlVHJ1bmNPckJpdENhc3QoVkMsIERlc3RUeSksIE5hbWUpOworICAgIHJldHVybiBJbnNlcnQoQ2FzdEluc3Q6OkNyZWF0ZVRydW5jT3JCaXRDYXN0KFYsIERlc3RUeSksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OkNhc3RPcHMgT3AsIFZhbHVlICpWLCBUeXBlICpEZXN0VHksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoVi0+Z2V0VHlwZSgpID09IERlc3RUeSkKKyAgICAgIHJldHVybiBWOworICAgIGlmIChhdXRvICpWQyA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkKKyAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUNhc3QoT3AsIFZDLCBEZXN0VHkpLCBOYW1lKTsKKyAgICByZXR1cm4gSW5zZXJ0KENhc3RJbnN0OjpDcmVhdGUoT3AsIFYsIERlc3RUeSksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZVBvaW50ZXJDYXN0KFZhbHVlICpWLCBUeXBlICpEZXN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKFYtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gVjsKKyAgICBpZiAoYXV0byAqVkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVQb2ludGVyQ2FzdChWQywgRGVzdFR5KSwgTmFtZSk7CisgICAgcmV0dXJuIEluc2VydChDYXN0SW5zdDo6Q3JlYXRlUG9pbnRlckNhc3QoViwgRGVzdFR5KSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlUG9pbnRlckJpdENhc3RPckFkZHJTcGFjZUNhc3QoVmFsdWUgKlYsIFR5cGUgKkRlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoVi0+Z2V0VHlwZSgpID09IERlc3RUeSkKKyAgICAgIHJldHVybiBWOworCisgICAgaWYgKGF1dG8gKlZDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKSB7CisgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVQb2ludGVyQml0Q2FzdE9yQWRkclNwYWNlQ2FzdChWQywgRGVzdFR5KSwKKyAgICAgICAgICAgICAgICAgICAgTmFtZSk7CisgICAgfQorCisgICAgcmV0dXJuIEluc2VydChDYXN0SW5zdDo6Q3JlYXRlUG9pbnRlckJpdENhc3RPckFkZHJTcGFjZUNhc3QoViwgRGVzdFR5KSwKKyAgICAgICAgICAgICAgICAgIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUludENhc3QoVmFsdWUgKlYsIFR5cGUgKkRlc3RUeSwgYm9vbCBpc1NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChWLT5nZXRUeXBlKCkgPT0gRGVzdFR5KQorICAgICAgcmV0dXJuIFY7CisgICAgaWYgKGF1dG8gKlZDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlSW50Q2FzdChWQywgRGVzdFR5LCBpc1NpZ25lZCksIE5hbWUpOworICAgIHJldHVybiBJbnNlcnQoQ2FzdEluc3Q6OkNyZWF0ZUludGVnZXJDYXN0KFYsIERlc3RUeSwgaXNTaWduZWQpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVCaXRPclBvaW50ZXJDYXN0KFZhbHVlICpWLCBUeXBlICpEZXN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoVi0+Z2V0VHlwZSgpID09IERlc3RUeSkKKyAgICAgIHJldHVybiBWOworICAgIGlmIChWLT5nZXRUeXBlKCktPmlzUHRyT3JQdHJWZWN0b3JUeSgpICYmIERlc3RUeS0+aXNJbnRPckludFZlY3RvclR5KCkpCisgICAgICByZXR1cm4gQ3JlYXRlUHRyVG9JbnQoViwgRGVzdFR5LCBOYW1lKTsKKyAgICBpZiAoVi0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSAmJiBEZXN0VHktPmlzUHRyT3JQdHJWZWN0b3JUeSgpKQorICAgICAgcmV0dXJuIENyZWF0ZUludFRvUHRyKFYsIERlc3RUeSwgTmFtZSk7CisKKyAgICByZXR1cm4gQ3JlYXRlQml0Q2FzdChWLCBEZXN0VHksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZQQ2FzdChWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKFYtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gVjsKKyAgICBpZiAoYXV0byAqVkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVGUENhc3QoVkMsIERlc3RUeSksIE5hbWUpOworICAgIHJldHVybiBJbnNlcnQoQ2FzdEluc3Q6OkNyZWF0ZUZQQ2FzdChWLCBEZXN0VHkpLCBOYW1lKTsKKyAgfQorCisgIC8vIFxicmllZiBQcm92aWRlZCB0byByZXNvbHZlICdDcmVhdGVJbnRDYXN0KFB0ciwgUHRyLCAiLi4uIiknLCBnaXZpbmcgYQorICAvLyBjb21waWxlIHRpbWUgZXJyb3IsIGluc3RlYWQgb2YgY29udmVydGluZyB0aGUgc3RyaW5nIHRvIGJvb2wgZm9yIHRoZQorICAvLyBpc1NpZ25lZCBwYXJhbWV0ZXIuCisgIFZhbHVlICpDcmVhdGVJbnRDYXN0KFZhbHVlICosIFR5cGUgKiwgY29uc3QgY2hhciAqKSA9IGRlbGV0ZTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSW5zdHJ1Y3Rpb24gY3JlYXRpb24gbWV0aG9kczogQ29tcGFyZSBJbnN0cnVjdGlvbnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgVmFsdWUgKkNyZWF0ZUlDbXBFUShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUlDbXAoSUNtcEluc3Q6OklDTVBfRVEsIExIUywgUkhTLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJQ21wTkUoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVJQ21wKElDbXBJbnN0OjpJQ01QX05FLCBMSFMsIFJIUywgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlSUNtcFVHVChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUlDbXAoSUNtcEluc3Q6OklDTVBfVUdULCBMSFMsIFJIUywgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlSUNtcFVHRShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUlDbXAoSUNtcEluc3Q6OklDTVBfVUdFLCBMSFMsIFJIUywgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlSUNtcFVMVChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUlDbXAoSUNtcEluc3Q6OklDTVBfVUxULCBMSFMsIFJIUywgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlSUNtcFVMRShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUlDbXAoSUNtcEluc3Q6OklDTVBfVUxFLCBMSFMsIFJIUywgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlSUNtcFNHVChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUlDbXAoSUNtcEluc3Q6OklDTVBfU0dULCBMSFMsIFJIUywgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlSUNtcFNHRShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUlDbXAoSUNtcEluc3Q6OklDTVBfU0dFLCBMSFMsIFJIUywgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlSUNtcFNMVChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUlDbXAoSUNtcEluc3Q6OklDTVBfU0xULCBMSFMsIFJIUywgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlSUNtcFNMRShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUlDbXAoSUNtcEluc3Q6OklDTVBfU0xFLCBMSFMsIFJIUywgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRkNtcE9FUShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gQ3JlYXRlRkNtcChGQ21wSW5zdDo6RkNNUF9PRVEsIExIUywgUkhTLCBOYW1lLCBGUE1hdGhUYWcpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZDbXBPR1QoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpGUE1hdGhUYWcgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIENyZWF0ZUZDbXAoRkNtcEluc3Q6OkZDTVBfT0dULCBMSFMsIFJIUywgTmFtZSwgRlBNYXRoVGFnKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVGQ21wT0dFKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0cikgeworICAgIHJldHVybiBDcmVhdGVGQ21wKEZDbXBJbnN0OjpGQ01QX09HRSwgTEhTLCBSSFMsIE5hbWUsIEZQTWF0aFRhZyk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRkNtcE9MVChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gQ3JlYXRlRkNtcChGQ21wSW5zdDo6RkNNUF9PTFQsIExIUywgUkhTLCBOYW1lLCBGUE1hdGhUYWcpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZDbXBPTEUoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpGUE1hdGhUYWcgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIENyZWF0ZUZDbXAoRkNtcEluc3Q6OkZDTVBfT0xFLCBMSFMsIFJIUywgTmFtZSwgRlBNYXRoVGFnKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVGQ21wT05FKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0cikgeworICAgIHJldHVybiBDcmVhdGVGQ21wKEZDbXBJbnN0OjpGQ01QX09ORSwgTEhTLCBSSFMsIE5hbWUsIEZQTWF0aFRhZyk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRkNtcE9SRChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gQ3JlYXRlRkNtcChGQ21wSW5zdDo6RkNNUF9PUkQsIExIUywgUkhTLCBOYW1lLCBGUE1hdGhUYWcpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZDbXBVTk8oVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpGUE1hdGhUYWcgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIENyZWF0ZUZDbXAoRkNtcEluc3Q6OkZDTVBfVU5PLCBMSFMsIFJIUywgTmFtZSwgRlBNYXRoVGFnKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVGQ21wVUVRKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0cikgeworICAgIHJldHVybiBDcmVhdGVGQ21wKEZDbXBJbnN0OjpGQ01QX1VFUSwgTEhTLCBSSFMsIE5hbWUsIEZQTWF0aFRhZyk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRkNtcFVHVChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gQ3JlYXRlRkNtcChGQ21wSW5zdDo6RkNNUF9VR1QsIExIUywgUkhTLCBOYW1lLCBGUE1hdGhUYWcpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZDbXBVR0UoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpGUE1hdGhUYWcgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIENyZWF0ZUZDbXAoRkNtcEluc3Q6OkZDTVBfVUdFLCBMSFMsIFJIUywgTmFtZSwgRlBNYXRoVGFnKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVGQ21wVUxUKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0cikgeworICAgIHJldHVybiBDcmVhdGVGQ21wKEZDbXBJbnN0OjpGQ01QX1VMVCwgTEhTLCBSSFMsIE5hbWUsIEZQTWF0aFRhZyk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRkNtcFVMRShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gQ3JlYXRlRkNtcChGQ21wSW5zdDo6RkNNUF9VTEUsIExIUywgUkhTLCBOYW1lLCBGUE1hdGhUYWcpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZDbXBVTkUoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpGUE1hdGhUYWcgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIENyZWF0ZUZDbXAoRkNtcEluc3Q6OkZDTVBfVU5FLCBMSFMsIFJIUywgTmFtZSwgRlBNYXRoVGFnKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJQ21wKENtcEluc3Q6OlByZWRpY2F0ZSBQLCBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKGF1dG8gKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICBpZiAoYXV0byAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlSUNtcChQLCBMQywgUkMpLCBOYW1lKTsKKyAgICByZXR1cm4gSW5zZXJ0KG5ldyBJQ21wSW5zdChQLCBMSFMsIFJIUyksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZDbXAoQ21wSW5zdDo6UHJlZGljYXRlIFAsIFZhbHVlICpMSFMsIFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0cikgeworICAgIGlmIChhdXRvICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgaWYgKGF1dG8gKlJDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFJIUykpCisgICAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUZDbXAoUCwgTEMsIFJDKSwgTmFtZSk7CisgICAgcmV0dXJuIEluc2VydChzZXRGUEF0dHJzKG5ldyBGQ21wSW5zdChQLCBMSFMsIFJIUyksIEZQTWF0aFRhZywgRk1GKSwgTmFtZSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSW5zdHJ1Y3Rpb24gY3JlYXRpb24gbWV0aG9kczogT3RoZXIgSW5zdHJ1Y3Rpb25zCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIFBISU5vZGUgKkNyZWF0ZVBISShUeXBlICpUeSwgdW5zaWduZWQgTnVtUmVzZXJ2ZWRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIEluc2VydChQSElOb2RlOjpDcmVhdGUoVHksIE51bVJlc2VydmVkVmFsdWVzKSwgTmFtZSk7CisgIH0KKworICBDYWxsSW5zdCAqQ3JlYXRlQ2FsbChWYWx1ZSAqQ2FsbGVlLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwgTUROb2RlICpGUE1hdGhUYWcgPSBudWxscHRyKSB7CisgICAgYXV0byAqUFR5ID0gY2FzdDxQb2ludGVyVHlwZT4oQ2FsbGVlLT5nZXRUeXBlKCkpOworICAgIGF1dG8gKkZUeSA9IGNhc3Q8RnVuY3Rpb25UeXBlPihQVHktPmdldEVsZW1lbnRUeXBlKCkpOworICAgIHJldHVybiBDcmVhdGVDYWxsKEZUeSwgQ2FsbGVlLCBBcmdzLCBOYW1lLCBGUE1hdGhUYWcpOworICB9CisKKyAgQ2FsbEluc3QgKkNyZWF0ZUNhbGwoRnVuY3Rpb25UeXBlICpGVHksIFZhbHVlICpDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0cikgeworICAgIENhbGxJbnN0ICpDSSA9IENhbGxJbnN0OjpDcmVhdGUoRlR5LCBDYWxsZWUsIEFyZ3MsIERlZmF1bHRPcGVyYW5kQnVuZGxlcyk7CisgICAgaWYgKGlzYTxGUE1hdGhPcGVyYXRvcj4oQ0kpKQorICAgICAgQ0kgPSBjYXN0PENhbGxJbnN0PihzZXRGUEF0dHJzKENJLCBGUE1hdGhUYWcsIEZNRikpOworICAgIHJldHVybiBJbnNlcnQoQ0ksIE5hbWUpOworICB9CisKKyAgQ2FsbEluc3QgKkNyZWF0ZUNhbGwoVmFsdWUgKkNhbGxlZSwgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gT3BCdW5kbGVzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiLCBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIpIHsKKyAgICBDYWxsSW5zdCAqQ0kgPSBDYWxsSW5zdDo6Q3JlYXRlKENhbGxlZSwgQXJncywgT3BCdW5kbGVzKTsKKyAgICBpZiAoaXNhPEZQTWF0aE9wZXJhdG9yPihDSSkpCisgICAgICBDSSA9IGNhc3Q8Q2FsbEluc3Q+KHNldEZQQXR0cnMoQ0ksIEZQTWF0aFRhZywgRk1GKSk7CisgICAgcmV0dXJuIEluc2VydChDSSwgTmFtZSk7CisgIH0KKworICBDYWxsSW5zdCAqQ3JlYXRlQ2FsbChGdW5jdGlvbiAqQ2FsbGVlLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiLCBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FsbChDYWxsZWUtPmdldEZ1bmN0aW9uVHlwZSgpLCBDYWxsZWUsIEFyZ3MsIE5hbWUsIEZQTWF0aFRhZyk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlU2VsZWN0KFZhbHVlICpDLCBWYWx1ZSAqVHJ1ZSwgVmFsdWUgKkZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsIEluc3RydWN0aW9uICpNREZyb20gPSBudWxscHRyKSB7CisgICAgaWYgKGF1dG8gKkNDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KEMpKQorICAgICAgaWYgKGF1dG8gKlRDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFRydWUpKQorICAgICAgICBpZiAoYXV0byAqRkMgPSBkeW5fY2FzdDxDb25zdGFudD4oRmFsc2UpKQorICAgICAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZVNlbGVjdChDQywgVEMsIEZDKSwgTmFtZSk7CisKKyAgICBTZWxlY3RJbnN0ICpTZWwgPSBTZWxlY3RJbnN0OjpDcmVhdGUoQywgVHJ1ZSwgRmFsc2UpOworICAgIGlmIChNREZyb20pIHsKKyAgICAgIE1ETm9kZSAqUHJvZiA9IE1ERnJvbS0+Z2V0TWV0YWRhdGEoTExWTUNvbnRleHQ6Ok1EX3Byb2YpOworICAgICAgTUROb2RlICpVbnByZWQgPSBNREZyb20tPmdldE1ldGFkYXRhKExMVk1Db250ZXh0OjpNRF91bnByZWRpY3RhYmxlKTsKKyAgICAgIFNlbCA9IGFkZEJyYW5jaE1ldGFkYXRhKFNlbCwgUHJvZiwgVW5wcmVkKTsKKyAgICB9CisgICAgcmV0dXJuIEluc2VydChTZWwsIE5hbWUpOworICB9CisKKyAgVkFBcmdJbnN0ICpDcmVhdGVWQUFyZyhWYWx1ZSAqTGlzdCwgVHlwZSAqVHksIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gSW5zZXJ0KG5ldyBWQUFyZ0luc3QoTGlzdCwgVHkpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVFeHRyYWN0RWxlbWVudChWYWx1ZSAqVmVjLCBWYWx1ZSAqSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChhdXRvICpWQyA9IGR5bl9jYXN0PENvbnN0YW50PihWZWMpKQorICAgICAgaWYgKGF1dG8gKklDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KElkeCkpCisgICAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUV4dHJhY3RFbGVtZW50KFZDLCBJQyksIE5hbWUpOworICAgIHJldHVybiBJbnNlcnQoRXh0cmFjdEVsZW1lbnRJbnN0OjpDcmVhdGUoVmVjLCBJZHgpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVFeHRyYWN0RWxlbWVudChWYWx1ZSAqVmVjLCB1aW50NjRfdCBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RFbGVtZW50KFZlYywgZ2V0SW50NjQoSWR4KSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlSW5zZXJ0RWxlbWVudChWYWx1ZSAqVmVjLCBWYWx1ZSAqTmV3RWx0LCBWYWx1ZSAqSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKGF1dG8gKlZDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFZlYykpCisgICAgICBpZiAoYXV0byAqTkMgPSBkeW5fY2FzdDxDb25zdGFudD4oTmV3RWx0KSkKKyAgICAgICAgaWYgKGF1dG8gKklDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KElkeCkpCisgICAgICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlSW5zZXJ0RWxlbWVudChWQywgTkMsIElDKSwgTmFtZSk7CisgICAgcmV0dXJuIEluc2VydChJbnNlcnRFbGVtZW50SW5zdDo6Q3JlYXRlKFZlYywgTmV3RWx0LCBJZHgpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJbnNlcnRFbGVtZW50KFZhbHVlICpWZWMsIFZhbHVlICpOZXdFbHQsIHVpbnQ2NF90IElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVJbnNlcnRFbGVtZW50KFZlYywgTmV3RWx0LCBnZXRJbnQ2NChJZHgpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVTaHVmZmxlVmVjdG9yKFZhbHVlICpWMSwgVmFsdWUgKlYyLCBWYWx1ZSAqTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChhdXRvICpWMUMgPSBkeW5fY2FzdDxDb25zdGFudD4oVjEpKQorICAgICAgaWYgKGF1dG8gKlYyQyA9IGR5bl9jYXN0PENvbnN0YW50PihWMikpCisgICAgICAgIGlmIChhdXRvICpNQyA9IGR5bl9jYXN0PENvbnN0YW50PihNYXNrKSkKKyAgICAgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVTaHVmZmxlVmVjdG9yKFYxQywgVjJDLCBNQyksIE5hbWUpOworICAgIHJldHVybiBJbnNlcnQobmV3IFNodWZmbGVWZWN0b3JJbnN0KFYxLCBWMiwgTWFzayksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZVNodWZmbGVWZWN0b3IoVmFsdWUgKlYxLCBWYWx1ZSAqVjIsIEFycmF5UmVmPHVpbnQzMl90PiBJbnRNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgVmFsdWUgKk1hc2sgPSBDb25zdGFudERhdGFWZWN0b3I6OmdldChDb250ZXh0LCBJbnRNYXNrKTsKKyAgICByZXR1cm4gQ3JlYXRlU2h1ZmZsZVZlY3RvcihWMSwgVjIsIE1hc2ssIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUV4dHJhY3RWYWx1ZShWYWx1ZSAqQWdnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoYXV0byAqQWdnQyA9IGR5bl9jYXN0PENvbnN0YW50PihBZ2cpKQorICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlRXh0cmFjdFZhbHVlKEFnZ0MsIElkeHMpLCBOYW1lKTsKKyAgICByZXR1cm4gSW5zZXJ0KEV4dHJhY3RWYWx1ZUluc3Q6OkNyZWF0ZShBZ2csIElkeHMpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJbnNlcnRWYWx1ZShWYWx1ZSAqQWdnLCBWYWx1ZSAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKGF1dG8gKkFnZ0MgPSBkeW5fY2FzdDxDb25zdGFudD4oQWdnKSkKKyAgICAgIGlmIChhdXRvICpWYWxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFZhbCkpCisgICAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUluc2VydFZhbHVlKEFnZ0MsIFZhbEMsIElkeHMpLCBOYW1lKTsKKyAgICByZXR1cm4gSW5zZXJ0KEluc2VydFZhbHVlSW5zdDo6Q3JlYXRlKEFnZywgVmFsLCBJZHhzKSwgTmFtZSk7CisgIH0KKworICBMYW5kaW5nUGFkSW5zdCAqQ3JlYXRlTGFuZGluZ1BhZChUeXBlICpUeSwgdW5zaWduZWQgTnVtQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBJbnNlcnQoTGFuZGluZ1BhZEluc3Q6OkNyZWF0ZShUeSwgTnVtQ2xhdXNlcyksIE5hbWUpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFV0aWxpdHkgY3JlYXRpb24gbWV0aG9kcworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIFJldHVybiBhbiBpMSB2YWx1ZSB0ZXN0aW5nIGlmIFxwIEFyZyBpcyBudWxsLgorICBWYWx1ZSAqQ3JlYXRlSXNOdWxsKFZhbHVlICpBcmcsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlSUNtcEVRKEFyZywgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShBcmctPmdldFR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBOYW1lKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGFuIGkxIHZhbHVlIHRlc3RpbmcgaWYgXHAgQXJnIGlzIG5vdCBudWxsLgorICBWYWx1ZSAqQ3JlYXRlSXNOb3ROdWxsKFZhbHVlICpBcmcsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlSUNtcE5FKEFyZywgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShBcmctPmdldFR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBOYW1lKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBpNjQgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBwb2ludGVyIHZhbHVlcywgZGl2aWRpbmcgb3V0CisgIC8vLyB0aGUgc2l6ZSBvZiB0aGUgcG9pbnRlZC10byBvYmplY3RzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgaW50ZW5kZWQgdG8gaW1wbGVtZW50IEMtc3R5bGUgcG9pbnRlciBzdWJ0cmFjdGlvbi4gQXMgc3VjaCwgdGhlCisgIC8vLyBwb2ludGVycyBtdXN0IGJlIGFwcHJvcHJpYXRlbHkgYWxpZ25lZCBmb3IgdGhlaXIgZWxlbWVudCB0eXBlcyBhbmQKKyAgLy8vIHBvaW50aW5nIGludG8gdGhlIHNhbWUgb2JqZWN0LgorICBWYWx1ZSAqQ3JlYXRlUHRyRGlmZihWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgYXNzZXJ0KExIUy0+Z2V0VHlwZSgpID09IFJIUy0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICJQb2ludGVyIHN1YnRyYWN0aW9uIG9wZXJhbmQgdHlwZXMgbXVzdCBtYXRjaCEiKTsKKyAgICBhdXRvICpBcmdUeXBlID0gY2FzdDxQb2ludGVyVHlwZT4oTEhTLT5nZXRUeXBlKCkpOworICAgIFZhbHVlICpMSFNfaW50ID0gQ3JlYXRlUHRyVG9JbnQoTEhTLCBUeXBlOjpnZXRJbnQ2NFR5KENvbnRleHQpKTsKKyAgICBWYWx1ZSAqUkhTX2ludCA9IENyZWF0ZVB0clRvSW50KFJIUywgVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KSk7CisgICAgVmFsdWUgKkRpZmZlcmVuY2UgPSBDcmVhdGVTdWIoTEhTX2ludCwgUkhTX2ludCk7CisgICAgcmV0dXJuIENyZWF0ZUV4YWN0U0RpdihEaWZmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRFeHByOjpnZXRTaXplT2YoQXJnVHlwZS0+Z2V0RWxlbWVudFR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIGludmFyaWFudC5ncm91cC5iYXJyaWVyIGludHJpbnNpYyBjYWxsLCB0aGF0IHN0b3BzCisgIC8vLyBvcHRpbWl6ZXIgdG8gcHJvcGFnYXRlIGVxdWFsaXR5IHVzaW5nIGludmFyaWFudC5ncm91cCBtZXRhZGF0YS4KKyAgLy8vIElmIFB0ciB0eXBlIGlzIGRpZmZlcmVudCBmcm9tIHBvaW50ZXIgdG8gaTgsIGl0J3MgY2FzdGVkIHRvIHBvaW50ZXIgdG8gaTgKKyAgLy8vIGluIHRoZSBzYW1lIGFkZHJlc3Mgc3BhY2UgYmVmb3JlIGNhbGwgYW5kIGNhc3RlZCBiYWNrIHRvIFB0ciB0eXBlIGFmdGVyCisgIC8vLyBjYWxsLgorICBWYWx1ZSAqQ3JlYXRlSW52YXJpYW50R3JvdXBCYXJyaWVyKFZhbHVlICpQdHIpIHsKKyAgICBhc3NlcnQoaXNhPFBvaW50ZXJUeXBlPihQdHItPmdldFR5cGUoKSkgJiYKKyAgICAgICAgICAgImludmFyaWFudC5ncm91cC5iYXJyaWVyIG9ubHkgYXBwbGllcyB0byBwb2ludGVycy4iKTsKKyAgICBhdXRvICpQdHJUeXBlID0gUHRyLT5nZXRUeXBlKCk7CisgICAgYXV0byAqSW50OFB0clR5ID0gZ2V0SW50OFB0clR5KFB0clR5cGUtPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKSk7CisgICAgaWYgKFB0clR5cGUgIT0gSW50OFB0clR5KQorICAgICAgUHRyID0gQ3JlYXRlQml0Q2FzdChQdHIsIEludDhQdHJUeSk7CisgICAgTW9kdWxlICpNID0gQkItPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsKKyAgICBGdW5jdGlvbiAqRm5JbnZhcmlhbnRHcm91cEJhcnJpZXIgPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKAorICAgICAgICBNLCBJbnRyaW5zaWM6OmludmFyaWFudF9ncm91cF9iYXJyaWVyLCB7SW50OFB0clR5fSk7CisKKyAgICBhc3NlcnQoRm5JbnZhcmlhbnRHcm91cEJhcnJpZXItPmdldFJldHVyblR5cGUoKSA9PSBJbnQ4UHRyVHkgJiYKKyAgICAgICAgICAgRm5JbnZhcmlhbnRHcm91cEJhcnJpZXItPmdldEZ1bmN0aW9uVHlwZSgpLT5nZXRQYXJhbVR5cGUoMCkgPT0KKyAgICAgICAgICAgICAgIEludDhQdHJUeSAmJgorICAgICAgICAgICAiSW52YXJpYW50R3JvdXBCYXJyaWVyIHNob3VsZCB0YWtlIGFuZCByZXR1cm4gdGhlIHNhbWUgdHlwZSIpOworCisgICAgQ2FsbEluc3QgKkZuID0gQ3JlYXRlQ2FsbChGbkludmFyaWFudEdyb3VwQmFycmllciwge1B0cn0pOworCisgICAgaWYgKFB0clR5cGUgIT0gSW50OFB0clR5KQorICAgICAgcmV0dXJuIENyZWF0ZUJpdENhc3QoRm4sIFB0clR5cGUpOworICAgIHJldHVybiBGbjsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgdmVjdG9yIHZhbHVlIHRoYXQgY29udGFpbnMgXGFyZyBWIGJyb2FkY2FzdGVkIHRvIFxwCisgIC8vLyBOdW1FbHRzIGVsZW1lbnRzLgorICBWYWx1ZSAqQ3JlYXRlVmVjdG9yU3BsYXQodW5zaWduZWQgTnVtRWx0cywgVmFsdWUgKlYsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBhc3NlcnQoTnVtRWx0cyA+IDAgJiYgIkNhbm5vdCBzcGxhdCB0byBhbiBlbXB0eSB2ZWN0b3IhIik7CisKKyAgICAvLyBGaXJzdCBpbnNlcnQgaXQgaW50byBhbiB1bmRlZiB2ZWN0b3Igc28gd2UgY2FuIHNodWZmbGUgaXQuCisgICAgVHlwZSAqSTMyVHkgPSBnZXRJbnQzMlR5KCk7CisgICAgVmFsdWUgKlVuZGVmID0gVW5kZWZWYWx1ZTo6Z2V0KFZlY3RvclR5cGU6OmdldChWLT5nZXRUeXBlKCksIE51bUVsdHMpKTsKKyAgICBWID0gQ3JlYXRlSW5zZXJ0RWxlbWVudChVbmRlZiwgViwgQ29uc3RhbnRJbnQ6OmdldChJMzJUeSwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSArICIuc3BsYXRpbnNlcnQiKTsKKworICAgIC8vIFNodWZmbGUgdGhlIHZhbHVlIGFjcm9zcyB0aGUgZGVzaXJlZCBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgVmFsdWUgKlplcm9zID0gQ29uc3RhbnRBZ2dyZWdhdGVaZXJvOjpnZXQoVmVjdG9yVHlwZTo6Z2V0KEkzMlR5LCBOdW1FbHRzKSk7CisgICAgcmV0dXJuIENyZWF0ZVNodWZmbGVWZWN0b3IoViwgVW5kZWYsIFplcm9zLCBOYW1lICsgIi5zcGxhdCIpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSB2YWx1ZSB0aGF0IGhhcyBiZWVuIGV4dHJhY3RlZCBmcm9tIGEgbGFyZ2VyIGludGVnZXIgdHlwZS4KKyAgVmFsdWUgKkNyZWF0ZUV4dHJhY3RJbnRlZ2VyKGNvbnN0IERhdGFMYXlvdXQgJkRMLCBWYWx1ZSAqRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXJUeXBlICpFeHRyYWN0ZWRUeSwgdWludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUpIHsKKyAgICBhdXRvICpJbnRUeSA9IGNhc3Q8SW50ZWdlclR5cGU+KEZyb20tPmdldFR5cGUoKSk7CisgICAgYXNzZXJ0KERMLmdldFR5cGVTdG9yZVNpemUoRXh0cmFjdGVkVHkpICsgT2Zmc2V0IDw9CisgICAgICAgICAgICAgICBETC5nZXRUeXBlU3RvcmVTaXplKEludFR5KSAmJgorICAgICAgICAgICAiRWxlbWVudCBleHRlbmRzIHBhc3QgZnVsbCB2YWx1ZSIpOworICAgIHVpbnQ2NF90IFNoQW10ID0gOCAqIE9mZnNldDsKKyAgICBWYWx1ZSAqViA9IEZyb207CisgICAgaWYgKERMLmlzQmlnRW5kaWFuKCkpCisgICAgICBTaEFtdCA9IDggKiAoREwuZ2V0VHlwZVN0b3JlU2l6ZShJbnRUeSkgLQorICAgICAgICAgICAgICAgICAgIERMLmdldFR5cGVTdG9yZVNpemUoRXh0cmFjdGVkVHkpIC0gT2Zmc2V0KTsKKyAgICBpZiAoU2hBbXQpIHsKKyAgICAgIFYgPSBDcmVhdGVMU2hyKFYsIFNoQW10LCBOYW1lICsgIi5zaGlmdCIpOworICAgIH0KKyAgICBhc3NlcnQoRXh0cmFjdGVkVHktPmdldEJpdFdpZHRoKCkgPD0gSW50VHktPmdldEJpdFdpZHRoKCkgJiYKKyAgICAgICAgICAgIkNhbm5vdCBleHRyYWN0IHRvIGEgbGFyZ2VyIGludGVnZXIhIik7CisgICAgaWYgKEV4dHJhY3RlZFR5ICE9IEludFR5KSB7CisgICAgICBWID0gQ3JlYXRlVHJ1bmMoViwgRXh0cmFjdGVkVHksIE5hbWUgKyAiLnRydW5jIik7CisgICAgfQorICAgIHJldHVybiBWOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgSGVscGVyIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhbiBhc3N1bWUgaW50cmluc2ljIGNhbGwgdGhhdAorICAvLy8gcmVwcmVzZW50cyBhbiBhbGlnbm1lbnQgYXNzdW1wdGlvbiBvbiB0aGUgcHJvdmlkZWQgUHRyLCBNYXNrLCBUeXBlCisgIC8vLyBhbmQgT2Zmc2V0LgorICBDYWxsSW5zdCAqQ3JlYXRlQWxpZ25tZW50QXNzdW1wdGlvbkhlbHBlcihjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKlB0clZhbHVlLCBWYWx1ZSAqTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqSW50UHRyVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpPZmZzZXRWYWx1ZSkgeworICAgIFZhbHVlICpQdHJJbnRWYWx1ZSA9IENyZWF0ZVB0clRvSW50KFB0clZhbHVlLCBJbnRQdHJUeSwgInB0cmludCIpOworCisgICAgaWYgKE9mZnNldFZhbHVlKSB7CisgICAgICBib29sIElzT2Zmc2V0WmVybyA9IGZhbHNlOworICAgICAgaWYgKGNvbnN0IGF1dG8gKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KE9mZnNldFZhbHVlKSkKKyAgICAgICAgSXNPZmZzZXRaZXJvID0gQ0ktPmlzWmVybygpOworCisgICAgICBpZiAoIUlzT2Zmc2V0WmVybykgeworICAgICAgICBpZiAoT2Zmc2V0VmFsdWUtPmdldFR5cGUoKSAhPSBJbnRQdHJUeSkKKyAgICAgICAgICBPZmZzZXRWYWx1ZSA9IENyZWF0ZUludENhc3QoT2Zmc2V0VmFsdWUsIEludFB0clR5LCAvKmlzU2lnbmVkKi8gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldGNhc3QiKTsKKyAgICAgICAgUHRySW50VmFsdWUgPSBDcmVhdGVTdWIoUHRySW50VmFsdWUsIE9mZnNldFZhbHVlLCAib2Zmc2V0cHRyIik7CisgICAgICB9CisgICAgfQorCisgICAgVmFsdWUgKlplcm8gPSBDb25zdGFudEludDo6Z2V0KEludFB0clR5LCAwKTsKKyAgICBWYWx1ZSAqTWFza2VkUHRyID0gQ3JlYXRlQW5kKFB0ckludFZhbHVlLCBNYXNrLCAibWFza2VkcHRyIik7CisgICAgVmFsdWUgKkludkNvbmQgPSBDcmVhdGVJQ21wRVEoTWFza2VkUHRyLCBaZXJvLCAibWFza2NvbmQiKTsKKyAgICByZXR1cm4gQ3JlYXRlQXNzdW1wdGlvbihJbnZDb25kKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIGFzc3VtZSBpbnRyaW5zaWMgY2FsbCB0aGF0IHJlcHJlc2VudHMgYW4gYWxpZ25tZW50CisgIC8vLyBhc3N1bXB0aW9uIG9uIHRoZSBwcm92aWRlZCBwb2ludGVyLgorICAvLy8KKyAgLy8vIEFuIG9wdGlvbmFsIG9mZnNldCBjYW4gYmUgcHJvdmlkZWQsIGFuZCBpZiBpdCBpcyBwcm92aWRlZCwgdGhlIG9mZnNldAorICAvLy8gbXVzdCBiZSBzdWJ0cmFjdGVkIGZyb20gdGhlIHByb3ZpZGVkIHBvaW50ZXIgdG8gZ2V0IHRoZSBwb2ludGVyIHdpdGggdGhlCisgIC8vLyBzcGVjaWZpZWQgYWxpZ25tZW50LgorICBDYWxsSW5zdCAqQ3JlYXRlQWxpZ25tZW50QXNzdW1wdGlvbihjb25zdCBEYXRhTGF5b3V0ICZETCwgVmFsdWUgKlB0clZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpPZmZzZXRWYWx1ZSA9IG51bGxwdHIpIHsKKyAgICBhc3NlcnQoaXNhPFBvaW50ZXJUeXBlPihQdHJWYWx1ZS0+Z2V0VHlwZSgpKSAmJgorICAgICAgICAgICAidHJ5aW5nIHRvIGNyZWF0ZSBhbiBhbGlnbm1lbnQgYXNzdW1wdGlvbiBvbiBhIG5vbi1wb2ludGVyPyIpOworICAgIGF1dG8gKlB0clR5ID0gY2FzdDxQb2ludGVyVHlwZT4oUHRyVmFsdWUtPmdldFR5cGUoKSk7CisgICAgVHlwZSAqSW50UHRyVHkgPSBnZXRJbnRQdHJUeShETCwgUHRyVHktPmdldEFkZHJlc3NTcGFjZSgpKTsKKworICAgIFZhbHVlICpNYXNrID0gQ29uc3RhbnRJbnQ6OmdldChJbnRQdHJUeSwgQWxpZ25tZW50ID4gMCA/IEFsaWdubWVudCAtIDEgOiAwKTsKKyAgICByZXR1cm4gQ3JlYXRlQWxpZ25tZW50QXNzdW1wdGlvbkhlbHBlcihETCwgUHRyVmFsdWUsIE1hc2ssIEludFB0clR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldFZhbHVlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIGFzc3VtZSBpbnRyaW5zaWMgY2FsbCB0aGF0IHJlcHJlc2VudHMgYW4gYWxpZ25tZW50CisgIC8vLyBhc3N1bXB0aW9uIG9uIHRoZSBwcm92aWRlZCBwb2ludGVyLgorICAvLy8KKyAgLy8vIEFuIG9wdGlvbmFsIG9mZnNldCBjYW4gYmUgcHJvdmlkZWQsIGFuZCBpZiBpdCBpcyBwcm92aWRlZCwgdGhlIG9mZnNldAorICAvLy8gbXVzdCBiZSBzdWJ0cmFjdGVkIGZyb20gdGhlIHByb3ZpZGVkIHBvaW50ZXIgdG8gZ2V0IHRoZSBwb2ludGVyIHdpdGggdGhlCisgIC8vLyBzcGVjaWZpZWQgYWxpZ25tZW50LgorICAvLy8KKyAgLy8vIFRoaXMgb3ZlcmxvYWQgaGFuZGxlcyB0aGUgY29uZGl0aW9uIHdoZXJlIHRoZSBBbGlnbm1lbnQgaXMgZGVwZW5kZW50CisgIC8vLyBvbiBhbiBleGlzdGluZyB2YWx1ZSByYXRoZXIgdGhhbiBhIHN0YXRpYyB2YWx1ZS4KKyAgQ2FsbEluc3QgKkNyZWF0ZUFsaWdubWVudEFzc3VtcHRpb24oY29uc3QgRGF0YUxheW91dCAmREwsIFZhbHVlICpQdHJWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKkFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKk9mZnNldFZhbHVlID0gbnVsbHB0cikgeworICAgIGFzc2VydChpc2E8UG9pbnRlclR5cGU+KFB0clZhbHVlLT5nZXRUeXBlKCkpICYmCisgICAgICAgICAgICJ0cnlpbmcgdG8gY3JlYXRlIGFuIGFsaWdubWVudCBhc3N1bXB0aW9uIG9uIGEgbm9uLXBvaW50ZXI/Iik7CisgICAgYXV0byAqUHRyVHkgPSBjYXN0PFBvaW50ZXJUeXBlPihQdHJWYWx1ZS0+Z2V0VHlwZSgpKTsKKyAgICBUeXBlICpJbnRQdHJUeSA9IGdldEludFB0clR5KERMLCBQdHJUeS0+Z2V0QWRkcmVzc1NwYWNlKCkpOworCisgICAgaWYgKEFsaWdubWVudC0+Z2V0VHlwZSgpICE9IEludFB0clR5KQorICAgICAgQWxpZ25tZW50ID0gQ3JlYXRlSW50Q2FzdChBbGlnbm1lbnQsIEludFB0clR5LCAvKmlzU2lnbmVkKi8gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsaWdubWVudGNhc3QiKTsKKyAgICBWYWx1ZSAqSXNQb3NpdGl2ZSA9CisgICAgICAgIENyZWF0ZUlDbXAoQ21wSW5zdDo6SUNNUF9TR1QsIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KEFsaWdubWVudC0+Z2V0VHlwZSgpLCAwKSwgImlzcG9zaXRpdmUiKTsKKyAgICBWYWx1ZSAqUG9zaXRpdmVNYXNrID0KKyAgICAgICAgQ3JlYXRlU3ViKEFsaWdubWVudCwgQ29uc3RhbnRJbnQ6OmdldChJbnRQdHJUeSwgMSksICJwb3NpdGl2ZW1hc2siKTsKKyAgICBWYWx1ZSAqTWFzayA9IENyZWF0ZVNlbGVjdChJc1Bvc2l0aXZlLCBQb3NpdGl2ZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChJbnRQdHJUeSwgMCksICJtYXNrIik7CisKKyAgICByZXR1cm4gQ3JlYXRlQWxpZ25tZW50QXNzdW1wdGlvbkhlbHBlcihETCwgUHRyVmFsdWUsIE1hc2ssIEludFB0clR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldFZhbHVlKTsKKyAgfQorfTsKKworLy8gQ3JlYXRlIHdyYXBwZXJzIGZvciBDIEJpbmRpbmcgdHlwZXMgKHNlZSBDQmluZGluZ1dyYXBwaW5nLmgpLgorREVGSU5FX1NJTVBMRV9DT05WRVJTSU9OX0ZVTkNUSU9OUyhJUkJ1aWxkZXI8PiwgTExWTUJ1aWxkZXJSZWYpCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0lSQlVJTERFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0lSUHJpbnRpbmdQYXNzZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSVJQcmludGluZ1Bhc3Nlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MjVlMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0lSUHJpbnRpbmdQYXNzZXMuaApAQCAtMCwwICsxLDk1IEBACisvLz09PS0gSVJQcmludGluZ1Bhc3Nlcy5oIC0gUGFzc2VzIHRvIHByaW50IG91dCBJUiBjb25zdHJ1Y3RzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8KKy8vLyBUaGlzIGZpbGUgZGVmaW5lcyBwYXNzZXMgdG8gcHJpbnQgb3V0IElSIGluIHZhcmlvdXMgZ3JhbnVsYXJpdGllcy4gVGhlCisvLy8gUHJpbnRNb2R1bGVQYXNzIHBhc3Mgc2ltcGx5IHByaW50cyBvdXQgdGhlIGVudGlyZSBtb2R1bGUgd2hlbiBpdCBpcworLy8vIGV4ZWN1dGVkLiBUaGUgUHJpbnRGdW5jdGlvblBhc3MgY2xhc3MgaXMgZGVzaWduZWQgdG8gYmUgcGlwZWxpbmVkIHdpdGgKKy8vLyBvdGhlciBGdW5jdGlvblBhc3MncywgYW5kIHByaW50cyBvdXQgdGhlIGZ1bmN0aW9ucyBvZiB0aGUgbW9kdWxlIGFzIHRoZXkKKy8vLyBhcmUgcHJvY2Vzc2VkLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfSVJQUklOVElOR1BBU1NFU19ICisjZGVmaW5lIExMVk1fSVJfSVJQUklOVElOR1BBU1NFU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEJhc2ljQmxvY2tQYXNzOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBGdW5jdGlvblBhc3M7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBNb2R1bGVQYXNzOworY2xhc3MgUHJlc2VydmVkQW5hbHlzZXM7CitjbGFzcyByYXdfb3N0cmVhbTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBJUlVuaXRULCB0eXBlbmFtZS4uLiBFeHRyYUFyZ1RzPiBjbGFzcyBBbmFseXNpc01hbmFnZXI7CisKKy8vLyBcYnJpZWYgQ3JlYXRlIGFuZCByZXR1cm4gYSBwYXNzIHRoYXQgd3JpdGVzIHRoZSBtb2R1bGUgdG8gdGhlIHNwZWNpZmllZAorLy8vIFxjIHJhd19vc3RyZWFtLgorTW9kdWxlUGFzcyAqY3JlYXRlUHJpbnRNb2R1bGVQYXNzKHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQmFubmVyID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRQcmVzZXJ2ZVVzZUxpc3RPcmRlciA9IGZhbHNlKTsKKworLy8vIFxicmllZiBDcmVhdGUgYW5kIHJldHVybiBhIHBhc3MgdGhhdCBwcmludHMgZnVuY3Rpb25zIHRvIHRoZSBzcGVjaWZpZWQKKy8vLyBcYyByYXdfb3N0cmVhbSBhcyB0aGV5IGFyZSBwcm9jZXNzZWQuCitGdW5jdGlvblBhc3MgKmNyZWF0ZVByaW50RnVuY3Rpb25QYXNzKHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lciA9ICIiKTsKKworLy8vIFxicmllZiBDcmVhdGUgYW5kIHJldHVybiBhIHBhc3MgdGhhdCB3cml0ZXMgdGhlIEJCIHRvIHRoZSBzcGVjaWZpZWQKKy8vLyBcYyByYXdfb3N0cmVhbS4KK0Jhc2ljQmxvY2tQYXNzICpjcmVhdGVQcmludEJhc2ljQmxvY2tQYXNzKHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIgPSAiIik7CisKKy8vLyBQcmludCBvdXQgYSBuYW1lIG9mIGFuIExMVk0gdmFsdWUgd2l0aG91dCBhbnkgcHJlZml4ZXMuCisvLy8KKy8vLyBUaGUgbmFtZSBpcyBzdXJyb3VuZGVkIHdpdGggIiIncyBhbmQgZXNjYXBlZCBpZiBpdCBoYXMgYW55IHNwZWNpYWwgb3IKKy8vLyBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gaXQuCit2b2lkIHByaW50TExWTU5hbWVXaXRob3V0UHJlZml4KHJhd19vc3RyZWFtICZPUywgU3RyaW5nUmVmIE5hbWUpOworCisvLy8gXGJyaWVmIFBhc3MgZm9yIHByaW50aW5nIGEgTW9kdWxlIGFzIExMVk0ncyB0ZXh0IElSIGFzc2VtYmx5LgorLy8vCisvLy8gTm90ZTogVGhpcyBwYXNzIGlzIGZvciB1c2Ugd2l0aCB0aGUgbmV3IHBhc3MgbWFuYWdlci4gVXNlIHRoZSBjcmVhdGUuLi5QYXNzCisvLy8gZnVuY3Rpb25zIGFib3ZlIHRvIGNyZWF0ZSBwYXNzZXMgZm9yIHVzZSB3aXRoIHRoZSBsZWdhY3kgcGFzcyBtYW5hZ2VyLgorY2xhc3MgUHJpbnRNb2R1bGVQYXNzIHsKKyAgcmF3X29zdHJlYW0gJk9TOworICBzdGQ6OnN0cmluZyBCYW5uZXI7CisgIGJvb2wgU2hvdWxkUHJlc2VydmVVc2VMaXN0T3JkZXI7CisKK3B1YmxpYzoKKyAgUHJpbnRNb2R1bGVQYXNzKCk7CisgIFByaW50TW9kdWxlUGFzcyhyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIgPSAiIiwKKyAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkUHJlc2VydmVVc2VMaXN0T3JkZXIgPSBmYWxzZSk7CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgQW5hbHlzaXNNYW5hZ2VyPE1vZHVsZT4gJik7CisKKyAgc3RhdGljIFN0cmluZ1JlZiBuYW1lKCkgeyByZXR1cm4gIlByaW50TW9kdWxlUGFzcyI7IH0KK307CisKKy8vLyBcYnJpZWYgUGFzcyBmb3IgcHJpbnRpbmcgYSBGdW5jdGlvbiBhcyBMTFZNJ3MgdGV4dCBJUiBhc3NlbWJseS4KKy8vLworLy8vIE5vdGU6IFRoaXMgcGFzcyBpcyBmb3IgdXNlIHdpdGggdGhlIG5ldyBwYXNzIG1hbmFnZXIuIFVzZSB0aGUgY3JlYXRlLi4uUGFzcworLy8vIGZ1bmN0aW9ucyBhYm92ZSB0byBjcmVhdGUgcGFzc2VzIGZvciB1c2Ugd2l0aCB0aGUgbGVnYWN5IHBhc3MgbWFuYWdlci4KK2NsYXNzIFByaW50RnVuY3Rpb25QYXNzIHsKKyAgcmF3X29zdHJlYW0gJk9TOworICBzdGQ6OnN0cmluZyBCYW5uZXI7CisKK3B1YmxpYzoKKyAgUHJpbnRGdW5jdGlvblBhc3MoKTsKKyAgUHJpbnRGdW5jdGlvblBhc3MocmF3X29zdHJlYW0gJk9TLCBjb25zdCBzdGQ6OnN0cmluZyAmQmFubmVyID0gIiIpOworCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgQW5hbHlzaXNNYW5hZ2VyPEZ1bmN0aW9uPiAmKTsKKworICBzdGF0aWMgU3RyaW5nUmVmIG5hbWUoKSB7IHJldHVybiAiUHJpbnRGdW5jdGlvblBhc3MiOyB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW5saW5lQXNtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0lubGluZUFzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MTlhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0lubGluZUFzbS5oCkBAIC0wLDAgKzEsMzY2IEBACisvLz09PS0gbGx2bS9JbmxpbmVBc20uaCAtIENsYXNzIHRvIHJlcHJlc2VudCBpbmxpbmUgYXNtIHN0cmluZ3MgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgaW5saW5lIGFzbSBzdHJpbmdzLCB3aGljaCBhcmUgVmFsdWUqJ3MgdGhhdCBhcmUKKy8vIHVzZWQgYXMgdGhlIGNhbGxlZSBvcGVyYW5kIG9mIGNhbGwgaW5zdHJ1Y3Rpb25zLiAgSW5saW5lQXNtJ3MgYXJlIHVuaXF1ZWQKKy8vIGxpa2UgY29uc3RhbnRzLCBhbmQgY3JlYXRlZCB2aWEgSW5saW5lQXNtOjpnZXQoLi4uKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfSU5MSU5FQVNNX0gKKyNkZWZpbmUgTExWTV9JUl9JTkxJTkVBU01fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvblR5cGU7CitjbGFzcyBQb2ludGVyVHlwZTsKK3RlbXBsYXRlIDxjbGFzcyBDb25zdGFudENsYXNzPiBjbGFzcyBDb25zdGFudFVuaXF1ZU1hcDsKKworY2xhc3MgSW5saW5lQXNtIGZpbmFsIDogcHVibGljIFZhbHVlIHsKK3B1YmxpYzoKKyAgZW51bSBBc21EaWFsZWN0IHsKKyAgICBBRF9BVFQsCisgICAgQURfSW50ZWwKKyAgfTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIHN0cnVjdCBJbmxpbmVBc21LZXlUeXBlOworICBmcmllbmQgY2xhc3MgQ29uc3RhbnRVbmlxdWVNYXA8SW5saW5lQXNtPjsKKworICBzdGQ6OnN0cmluZyBBc21TdHJpbmcsIENvbnN0cmFpbnRzOworICBGdW5jdGlvblR5cGUgKkZUeTsKKyAgYm9vbCBIYXNTaWRlRWZmZWN0czsKKyAgYm9vbCBJc0FsaWduU3RhY2s7CisgIEFzbURpYWxlY3QgRGlhbGVjdDsKKworICBJbmxpbmVBc20oRnVuY3Rpb25UeXBlICpUeSwgY29uc3Qgc3RkOjpzdHJpbmcgJkFzbVN0cmluZywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZDb25zdHJhaW50cywgYm9vbCBoYXNTaWRlRWZmZWN0cywKKyAgICAgICAgICAgIGJvb2wgaXNBbGlnblN0YWNrLCBBc21EaWFsZWN0IGFzbURpYWxlY3QpOworCisgIC8vLyBXaGVuIHRoZSBDb25zdGFudFVuaXF1ZU1hcCBtZXJnZXMgdHdvIHR5cGVzIGFuZCBtYWtlcyB0d28gSW5saW5lQXNtcworICAvLy8gaWRlbnRpY2FsLCBpdCBkZXN0cm95cyBvbmUgb2YgdGhlbSB3aXRoIHRoaXMgbWV0aG9kLgorICB2b2lkIGRlc3Ryb3lDb25zdGFudCgpOworCitwdWJsaWM6CisgIElubGluZUFzbShjb25zdCBJbmxpbmVBc20gJikgPSBkZWxldGU7CisgIElubGluZUFzbSAmb3BlcmF0b3I9KGNvbnN0IElubGluZUFzbSAmKSA9IGRlbGV0ZTsKKworICAvLy8gSW5saW5lQXNtOjpnZXQgLSBSZXR1cm4gdGhlIHNwZWNpZmllZCB1bmlxdWVkIGlubGluZSBhc20gc3RyaW5nLgorICAvLy8KKyAgc3RhdGljIElubGluZUFzbSAqZ2V0KEZ1bmN0aW9uVHlwZSAqVHksIFN0cmluZ1JlZiBBc21TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQ29uc3RyYWludHMsIGJvb2wgaGFzU2lkZUVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQWxpZ25TdGFjayA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgQXNtRGlhbGVjdCBhc21EaWFsZWN0ID0gQURfQVRUKTsKKworICBib29sIGhhc1NpZGVFZmZlY3RzKCkgY29uc3QgeyByZXR1cm4gSGFzU2lkZUVmZmVjdHM7IH0KKyAgYm9vbCBpc0FsaWduU3RhY2soKSBjb25zdCB7IHJldHVybiBJc0FsaWduU3RhY2s7IH0KKyAgQXNtRGlhbGVjdCBnZXREaWFsZWN0KCkgY29uc3QgeyByZXR1cm4gRGlhbGVjdDsgfQorCisgIC8vLyBnZXRUeXBlIC0gSW5saW5lQXNtJ3MgYXJlIGFsd2F5cyBwb2ludGVycy4KKyAgLy8vCisgIFBvaW50ZXJUeXBlICpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFBvaW50ZXJUeXBlKj4oVmFsdWU6OmdldFR5cGUoKSk7CisgIH0KKworICAvLy8gZ2V0RnVuY3Rpb25UeXBlIC0gSW5saW5lQXNtJ3MgYXJlIGFsd2F5cyBwb2ludGVycyB0byBmdW5jdGlvbnMuCisgIC8vLworICBGdW5jdGlvblR5cGUgKmdldEZ1bmN0aW9uVHlwZSgpIGNvbnN0OworCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRBc21TdHJpbmcoKSBjb25zdCB7IHJldHVybiBBc21TdHJpbmc7IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldENvbnN0cmFpbnRTdHJpbmcoKSBjb25zdCB7IHJldHVybiBDb25zdHJhaW50czsgfQorCisgIC8vLyBWZXJpZnkgLSBUaGlzIHN0YXRpYyBtZXRob2QgY2FuIGJlIHVzZWQgYnkgdGhlIHBhcnNlciB0byBjaGVjayB0byBzZWUgaWYKKyAgLy8vIHRoZSBzcGVjaWZpZWQgY29uc3RyYWludCBzdHJpbmcgaXMgbGVnYWwgZm9yIHRoZSB0eXBlLiAgVGhpcyByZXR1cm5zIHRydWUKKyAgLy8vIGlmIGxlZ2FsLCBmYWxzZSBpZiBub3QuCisgIC8vLworICBzdGF0aWMgYm9vbCBWZXJpZnkoRnVuY3Rpb25UeXBlICpUeSwgU3RyaW5nUmVmIENvbnN0cmFpbnRzKTsKKworICAvLyBDb25zdHJhaW50IFN0cmluZyBQYXJzaW5nCisgIGVudW0gQ29uc3RyYWludFByZWZpeCB7CisgICAgaXNJbnB1dCwgICAgICAgICAgICAvLyAneCcKKyAgICBpc091dHB1dCwgICAgICAgICAgIC8vICc9eCcKKyAgICBpc0Nsb2JiZXIgICAgICAgICAgIC8vICd+eCcKKyAgfTsKKworICB1c2luZyBDb25zdHJhaW50Q29kZVZlY3RvciA9IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjsKKworICBzdHJ1Y3QgU3ViQ29uc3RyYWludEluZm8geworICAgIC8vLyBNYXRjaGluZ0lucHV0IC0gSWYgdGhpcyBpcyBub3QgLTEsIHRoaXMgaXMgYW4gb3V0cHV0IGNvbnN0cmFpbnQgd2hlcmUgYW4KKyAgICAvLy8gaW5wdXQgY29uc3RyYWludCBpcyByZXF1aXJlZCB0byBtYXRjaCBpdCAoZS5nLiAiMCIpLiAgVGhlIHZhbHVlIGlzIHRoZQorICAgIC8vLyBjb25zdHJhaW50IG51bWJlciB0aGF0IG1hdGNoZXMgdGhpcyBvbmUgKGZvciBleGFtcGxlLCBpZiB0aGlzIGlzCisgICAgLy8vIGNvbnN0cmFpbnQgIzAgYW5kIGNvbnN0cmFpbnQgIzQgaGFzIHRoZSB2YWx1ZSAiMCIsIHRoaXMgd2lsbCBiZSA0KS4KKyAgICBpbnQgTWF0Y2hpbmdJbnB1dCA9IC0xOworCisgICAgLy8vIENvZGUgLSBUaGUgY29uc3RyYWludCBjb2RlLCBlaXRoZXIgdGhlIHJlZ2lzdGVyIG5hbWUgKGluIGJyYWNlcykgb3IgdGhlCisgICAgLy8vIGNvbnN0cmFpbnQgbGV0dGVyL251bWJlci4KKyAgICBDb25zdHJhaW50Q29kZVZlY3RvciBDb2RlczsKKworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIFN1YkNvbnN0cmFpbnRJbmZvKCkgPSBkZWZhdWx0OworICB9OworCisgIHVzaW5nIFN1YkNvbnN0cmFpbnRJbmZvVmVjdG9yID0gc3RkOjp2ZWN0b3I8U3ViQ29uc3RyYWludEluZm8+OworICBzdHJ1Y3QgQ29uc3RyYWludEluZm87CisgIHVzaW5nIENvbnN0cmFpbnRJbmZvVmVjdG9yID0gc3RkOjp2ZWN0b3I8Q29uc3RyYWludEluZm8+OworCisgIHN0cnVjdCBDb25zdHJhaW50SW5mbyB7CisgICAgLy8vIFR5cGUgLSBUaGUgYmFzaWMgdHlwZSBvZiB0aGUgY29uc3RyYWludDogaW5wdXQvb3V0cHV0L2Nsb2JiZXIKKyAgICAvLy8KKyAgICBDb25zdHJhaW50UHJlZml4IFR5cGUgPSBpc0lucHV0OworCisgICAgLy8vIGlzRWFybHlDbG9iYmVyIC0gIiYiOiBvdXRwdXQgb3BlcmFuZCB3cml0ZXMgcmVzdWx0IGJlZm9yZSBpbnB1dHMgYXJlIGFsbAorICAgIC8vLyByZWFkLiAgVGhpcyBpcyBvbmx5IGV2ZXIgc2V0IGZvciBhbiBvdXRwdXQgb3BlcmFuZC4KKyAgICBib29sIGlzRWFybHlDbG9iYmVyID0gZmFsc2U7CisKKyAgICAvLy8gTWF0Y2hpbmdJbnB1dCAtIElmIHRoaXMgaXMgbm90IC0xLCB0aGlzIGlzIGFuIG91dHB1dCBjb25zdHJhaW50IHdoZXJlIGFuCisgICAgLy8vIGlucHV0IGNvbnN0cmFpbnQgaXMgcmVxdWlyZWQgdG8gbWF0Y2ggaXQgKGUuZy4gIjAiKS4gIFRoZSB2YWx1ZSBpcyB0aGUKKyAgICAvLy8gY29uc3RyYWludCBudW1iZXIgdGhhdCBtYXRjaGVzIHRoaXMgb25lIChmb3IgZXhhbXBsZSwgaWYgdGhpcyBpcworICAgIC8vLyBjb25zdHJhaW50ICMwIGFuZCBjb25zdHJhaW50ICM0IGhhcyB0aGUgdmFsdWUgIjAiLCB0aGlzIHdpbGwgYmUgNCkuCisgICAgaW50IE1hdGNoaW5nSW5wdXQgPSAtMTsKKworICAgIC8vLyBoYXNNYXRjaGluZ0lucHV0IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBvdXRwdXQgY29uc3RyYWludCB0aGF0IGhhcworICAgIC8vLyBhIG1hdGNoaW5nIGlucHV0IGNvbnN0cmFpbnQuCisgICAgYm9vbCBoYXNNYXRjaGluZ0lucHV0KCkgY29uc3QgeyByZXR1cm4gTWF0Y2hpbmdJbnB1dCAhPSAtMTsgfQorCisgICAgLy8vIGlzQ29tbXV0YXRpdmUgLSBUaGlzIGlzIHNldCB0byB0cnVlIGZvciBhIGNvbnN0cmFpbnQgdGhhdCBpcyBjb21tdXRhdGl2ZQorICAgIC8vLyB3aXRoIHRoZSBuZXh0IG9wZXJhbmQuCisgICAgYm9vbCBpc0NvbW11dGF0aXZlID0gZmFsc2U7CisKKyAgICAvLy8gaXNJbmRpcmVjdCAtIFRydWUgaWYgdGhpcyBvcGVyYW5kIGlzIGFuIGluZGlyZWN0IG9wZXJhbmQuICBUaGlzIG1lYW5zCisgICAgLy8vIHRoYXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBpcyBwcmVzZW50IGluIHRoZSBjYWxsCisgICAgLy8vIGluc3RydWN0aW9uLCBpbnN0ZWFkIG9mIGl0IGJlaW5nIHJldHVybmVkIG9yIHBhc3NlZCBpbiBleHBsaWNpdGx5LiAgVGhpcworICAgIC8vLyBpcyByZXByZXNlbnRlZCB3aXRoIGEgJyonIGluIHRoZSBhc20gc3RyaW5nLgorICAgIGJvb2wgaXNJbmRpcmVjdCA9IGZhbHNlOworCisgICAgLy8vIENvZGUgLSBUaGUgY29uc3RyYWludCBjb2RlLCBlaXRoZXIgdGhlIHJlZ2lzdGVyIG5hbWUgKGluIGJyYWNlcykgb3IgdGhlCisgICAgLy8vIGNvbnN0cmFpbnQgbGV0dGVyL251bWJlci4KKyAgICBDb25zdHJhaW50Q29kZVZlY3RvciBDb2RlczsKKworICAgIC8vLyBpc011bHRpcGxlQWx0ZXJuYXRpdmUgLSAnfCc6IGhhcyBtdWx0aXBsZS1hbHRlcm5hdGl2ZSBjb25zdHJhaW50cy4KKyAgICBib29sIGlzTXVsdGlwbGVBbHRlcm5hdGl2ZSA9IGZhbHNlOworCisgICAgLy8vIG11bHRpcGxlQWx0ZXJuYXRpdmVzIC0gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGFsdGVybmF0aXZlIGNvbnN0cmFpbnRzLAorICAgIC8vLyB0aGlzIGFycmF5IHdpbGwgY29udGFpbiB0aGVtLiAgT3RoZXJ3aXNlIGl0IHdpbGwgYmUgZW1wdHkuCisgICAgU3ViQ29uc3RyYWludEluZm9WZWN0b3IgbXVsdGlwbGVBbHRlcm5hdGl2ZXM7CisKKyAgICAvLy8gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBhbHRlcm5hdGl2ZSBjb25zdHJhaW50IGluZGV4LgorICAgIHVuc2lnbmVkIGN1cnJlbnRBbHRlcm5hdGl2ZUluZGV4ID0gMDsKKworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIENvbnN0cmFpbnRJbmZvKCkgPSBkZWZhdWx0OworCisgICAgLy8vIFBhcnNlIC0gQW5hbHl6ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyAoZS5nLiAiPSome2VheH0iKSBhbmQgZmlsbCBpbiB0aGUKKyAgICAvLy8gZmllbGRzIGluIHRoaXMgc3RydWN0dXJlLiAgSWYgdGhlIGNvbnN0cmFpbnQgc3RyaW5nIGlzIG5vdCB1bmRlcnN0b29kLAorICAgIC8vLyByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KKyAgICBib29sIFBhcnNlKFN0cmluZ1JlZiBTdHIsIENvbnN0cmFpbnRJbmZvVmVjdG9yICZDb25zdHJhaW50c1NvRmFyKTsKKworICAgIC8vLyBzZWxlY3RBbHRlcm5hdGl2ZSAtIFBvaW50IHRoaXMgY29uc3RyYWludCB0byB0aGUgYWx0ZXJuYXRpdmUgY29uc3RyYWludAorICAgIC8vLyBpbmRpY2F0ZWQgYnkgdGhlIGluZGV4LgorICAgIHZvaWQgc2VsZWN0QWx0ZXJuYXRpdmUodW5zaWduZWQgaW5kZXgpOworICB9OworCisgIC8vLyBQYXJzZUNvbnN0cmFpbnRzIC0gU3BsaXQgdXAgdGhlIGNvbnN0cmFpbnQgc3RyaW5nIGludG8gdGhlIHNwZWNpZmljCisgIC8vLyBjb25zdHJhaW50cyBhbmQgdGhlaXIgcHJlZml4ZXMuICBJZiB0aGlzIHJldHVybnMgYW4gZW1wdHkgdmVjdG9yLCBhbmQgaWYKKyAgLy8vIHRoZSBjb25zdHJhaW50IHN0cmluZyBpdHNlbGYgaXNuJ3QgZW1wdHksIHRoZXJlIHdhcyBhbiBlcnJvciBwYXJzaW5nLgorICBzdGF0aWMgQ29uc3RyYWludEluZm9WZWN0b3IgUGFyc2VDb25zdHJhaW50cyhTdHJpbmdSZWYgQ29uc3RyYWludFN0cmluZyk7CisKKyAgLy8vIFBhcnNlQ29uc3RyYWludHMgLSBQYXJzZSB0aGUgY29uc3RyYWludHMgb2YgdGhpcyBpbmxpbmVhc20gb2JqZWN0LAorICAvLy8gcmV0dXJuaW5nIHRoZW0gdGhlIHNhbWUgd2F5IHRoYXQgUGFyc2VDb25zdHJhaW50cyhzdHIpIGRvZXMuCisgIENvbnN0cmFpbnRJbmZvVmVjdG9yIFBhcnNlQ29uc3RyYWludHMoKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcnNlQ29uc3RyYWludHMoQ29uc3RyYWludHMpOworICB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6OklubGluZUFzbVZhbDsKKyAgfQorCisgIC8vIFRoZXNlIGFyZSBoZWxwZXIgbWV0aG9kcyBmb3IgZGVhbGluZyB3aXRoIGZsYWdzIGluIHRoZSBJTkxJTkVBU00gU0ROb2RlCisgIC8vIGluIHRoZSBiYWNrZW5kLgorICAvLworICAvLyBUaGUgZW5jb2Rpbmcgb2YgdGhlIGZsYWcgd29yZCBpcyBjdXJyZW50bHk6CisgIC8vICAgQml0cyAyLTAgLSBBIEtpbmRfKiB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBraW5kIG9mIHRoZSBvcGVyYW5kLgorICAvLyAgIEJpdHMgMTUtMyAtIFRoZSBudW1iZXIgb2YgU0ROb2RlIG9wZXJhbmRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlubGluZQorICAvLyAgICAgICAgICAgICAgIGFzc2VtYmx5IG9wZXJhbmQuCisgIC8vICAgSWYgYml0IDMxIGlzIHNldDoKKyAgLy8gICAgIEJpdCAzMC0xNiAtIFRoZSBvcGVyYW5kIG51bWJlciB0aGF0IHRoaXMgb3BlcmFuZCBtdXN0IG1hdGNoLgorICAvLyAgICAgICAgICAgICAgICAgV2hlbiBiaXRzIDItMCBhcmUgS2luZF9NZW0sIHRoZSBDb25zdHJhaW50XyogdmFsdWUgbXVzdCBiZQorICAvLyAgICAgICAgICAgICAgICAgb2J0YWluZWQgZnJvbSB0aGUgZmxhZ3MgZm9yIHRoaXMgb3BlcmFuZCBudW1iZXIuCisgIC8vICAgRWxzZSBpZiBiaXRzIDItMCBhcmUgS2luZF9NZW06CisgIC8vICAgICBCaXQgMzAtMTYgLSBBIENvbnN0cmFpbnRfKiB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBvcmlnaW5hbCBjb25zdHJhaW50CisgIC8vICAgICAgICAgICAgICAgICBjb2RlLgorICAvLyAgIEVsc2U6CisgIC8vICAgICBCaXQgMzAtMTYgLSBUaGUgcmVnaXN0ZXIgY2xhc3MgSUQgdG8gdXNlIGZvciB0aGUgb3BlcmFuZC4KKworICBlbnVtIDogdWludDMyX3QgeworICAgIC8vIEZpeGVkIG9wZXJhbmRzIG9uIGFuIElOTElORUFTTSBTRE5vZGUuCisgICAgT3BfSW5wdXRDaGFpbiA9IDAsCisgICAgT3BfQXNtU3RyaW5nID0gMSwKKyAgICBPcF9NRE5vZGUgPSAyLAorICAgIE9wX0V4dHJhSW5mbyA9IDMsICAgIC8vIEhhc1NpZGVFZmZlY3RzLCBJc0FsaWduU3RhY2ssIEFzbURpYWxlY3QuCisgICAgT3BfRmlyc3RPcGVyYW5kID0gNCwKKworICAgIC8vIEZpeGVkIG9wZXJhbmRzIG9uIGFuIElOTElORUFTTSBNYWNoaW5lSW5zdHIuCisgICAgTUlPcF9Bc21TdHJpbmcgPSAwLAorICAgIE1JT3BfRXh0cmFJbmZvID0gMSwgICAgLy8gSGFzU2lkZUVmZmVjdHMsIElzQWxpZ25TdGFjaywgQXNtRGlhbGVjdC4KKyAgICBNSU9wX0ZpcnN0T3BlcmFuZCA9IDIsCisKKyAgICAvLyBJbnRlcnByZXRhdGlvbiBvZiB0aGUgTUlPcF9FeHRyYUluZm8gYml0IGZpZWxkLgorICAgIEV4dHJhX0hhc1NpZGVFZmZlY3RzID0gMSwKKyAgICBFeHRyYV9Jc0FsaWduU3RhY2sgPSAyLAorICAgIEV4dHJhX0FzbURpYWxlY3QgPSA0LAorICAgIEV4dHJhX01heUxvYWQgPSA4LAorICAgIEV4dHJhX01heVN0b3JlID0gMTYsCisgICAgRXh0cmFfSXNDb252ZXJnZW50ID0gMzIsCisKKyAgICAvLyBJbmxpbmUgYXNtIG9wZXJhbmRzIG1hcCB0byBtdWx0aXBsZSBTRE5vZGUgLyBNYWNoaW5lSW5zdHIgb3BlcmFuZHMuCisgICAgLy8gVGhlIGZpcnN0IG9wZXJhbmQgaXMgYW4gaW1tZWRpYXRlIGRlc2NyaWJpbmcgdGhlIGFzbSBvcGVyYW5kLCB0aGUgbG93CisgICAgLy8gYml0cyBpcyB0aGUga2luZDoKKyAgICBLaW5kX1JlZ1VzZSA9IDEsICAgICAgICAgICAgIC8vIElucHV0IHJlZ2lzdGVyLCAiciIuCisgICAgS2luZF9SZWdEZWYgPSAyLCAgICAgICAgICAgICAvLyBPdXRwdXQgcmVnaXN0ZXIsICI9ciIuCisgICAgS2luZF9SZWdEZWZFYXJseUNsb2JiZXIgPSAzLCAvLyBFYXJseS1jbG9iYmVyIG91dHB1dCByZWdpc3RlciwgIj0mciIuCisgICAgS2luZF9DbG9iYmVyID0gNCwgICAgICAgICAgICAvLyBDbG9iYmVyZWQgcmVnaXN0ZXIsICJ+ciIuCisgICAgS2luZF9JbW0gPSA1LCAgICAgICAgICAgICAgICAvLyBJbW1lZGlhdGUuCisgICAgS2luZF9NZW0gPSA2LCAgICAgICAgICAgICAgICAvLyBNZW1vcnkgb3BlcmFuZCwgIm0iLgorCisgICAgLy8gTWVtb3J5IGNvbnN0cmFpbnQgY29kZXMuCisgICAgLy8gVGhlc2UgY291bGQgYmUgdGFibGVnZW5lcmF0ZWQgYnV0IHRoZXJlJ3MgbGl0dGxlIG5lZWQgdG8gZG8gdGhhdCBzaW5jZQorICAgIC8vIHRoZXJlJ3MgcGxlbnR5IG9mIHNwYWNlIGluIHRoZSBlbmNvZGluZyB0byBzdXBwb3J0IHRoZSB1bmlvbiBvZiBhbGwKKyAgICAvLyBjb25zdHJhaW50IGNvZGVzIGZvciBhbGwgdGFyZ2V0cy4KKyAgICBDb25zdHJhaW50X1Vua25vd24gPSAwLAorICAgIENvbnN0cmFpbnRfZXMsCisgICAgQ29uc3RyYWludF9pLAorICAgIENvbnN0cmFpbnRfbSwKKyAgICBDb25zdHJhaW50X28sCisgICAgQ29uc3RyYWludF92LAorICAgIENvbnN0cmFpbnRfUSwKKyAgICBDb25zdHJhaW50X1IsCisgICAgQ29uc3RyYWludF9TLAorICAgIENvbnN0cmFpbnRfVCwKKyAgICBDb25zdHJhaW50X1VtLAorICAgIENvbnN0cmFpbnRfVW4sCisgICAgQ29uc3RyYWludF9VcSwKKyAgICBDb25zdHJhaW50X1VzLAorICAgIENvbnN0cmFpbnRfVXQsCisgICAgQ29uc3RyYWludF9VdiwKKyAgICBDb25zdHJhaW50X1V5LAorICAgIENvbnN0cmFpbnRfWCwKKyAgICBDb25zdHJhaW50X1osCisgICAgQ29uc3RyYWludF9aQywKKyAgICBDb25zdHJhaW50X1p5LAorICAgIENvbnN0cmFpbnRzX01heCA9IENvbnN0cmFpbnRfWnksCisgICAgQ29uc3RyYWludHNfU2hpZnRBbW91bnQgPSAxNiwKKworICAgIEZsYWdfTWF0Y2hpbmdPcGVyYW5kID0gMHg4MDAwMDAwMAorICB9OworCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRGbGFnV29yZCh1bnNpZ25lZCBLaW5kLCB1bnNpZ25lZCBOdW1PcHMpIHsKKyAgICBhc3NlcnQoKChOdW1PcHMgPDwgMykgJiB+MHhmZmZmKSA9PSAwICYmICJUb28gbWFueSBpbmxpbmUgYXNtIG9wZXJhbmRzISIpOworICAgIGFzc2VydChLaW5kID49IEtpbmRfUmVnVXNlICYmIEtpbmQgPD0gS2luZF9NZW0gJiYgIkludmFsaWQgS2luZCIpOworICAgIHJldHVybiBLaW5kIHwgKE51bU9wcyA8PCAzKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzUmVnRGVmS2luZCh1bnNpZ25lZCBGbGFnKXsgcmV0dXJuIGdldEtpbmQoRmxhZykgPT0gS2luZF9SZWdEZWY7fQorICBzdGF0aWMgYm9vbCBpc0ltbUtpbmQodW5zaWduZWQgRmxhZykgeyByZXR1cm4gZ2V0S2luZChGbGFnKSA9PSBLaW5kX0ltbTsgfQorICBzdGF0aWMgYm9vbCBpc01lbUtpbmQodW5zaWduZWQgRmxhZykgeyByZXR1cm4gZ2V0S2luZChGbGFnKSA9PSBLaW5kX01lbTsgfQorICBzdGF0aWMgYm9vbCBpc1JlZ0RlZkVhcmx5Q2xvYmJlcktpbmQodW5zaWduZWQgRmxhZykgeworICAgIHJldHVybiBnZXRLaW5kKEZsYWcpID09IEtpbmRfUmVnRGVmRWFybHlDbG9iYmVyOworICB9CisgIHN0YXRpYyBib29sIGlzQ2xvYmJlcktpbmQodW5zaWduZWQgRmxhZykgeworICAgIHJldHVybiBnZXRLaW5kKEZsYWcpID09IEtpbmRfQ2xvYmJlcjsKKyAgfQorCisgIC8vLyBnZXRGbGFnV29yZEZvck1hdGNoaW5nT3AgLSBBdWdtZW50IGFuIGV4aXN0aW5nIGZsYWcgd29yZCByZXR1cm5lZCBieQorICAvLy8gZ2V0RmxhZ1dvcmQgd2l0aCBpbmZvcm1hdGlvbiBpbmRpY2F0aW5nIHRoYXQgdGhpcyBpbnB1dCBvcGVyYW5kIGlzIHRpZWQKKyAgLy8vIHRvIGEgcHJldmlvdXMgb3V0cHV0IG9wZXJhbmQuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRGbGFnV29yZEZvck1hdGNoaW5nT3AodW5zaWduZWQgSW5wdXRGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1hdGNoZWRPcGVyYW5kTm8pIHsKKyAgICBhc3NlcnQoTWF0Y2hlZE9wZXJhbmRObyA8PSAweDdmZmYgJiYgIlRvbyBiaWcgbWF0Y2hlZCBvcGVyYW5kIik7CisgICAgYXNzZXJ0KChJbnB1dEZsYWcgJiB+MHhmZmZmKSA9PSAwICYmICJIaWdoIGJpdHMgYWxyZWFkeSBjb250YWluIGRhdGEiKTsKKyAgICByZXR1cm4gSW5wdXRGbGFnIHwgRmxhZ19NYXRjaGluZ09wZXJhbmQgfCAoTWF0Y2hlZE9wZXJhbmRObyA8PCAxNik7CisgIH0KKworICAvLy8gZ2V0RmxhZ1dvcmRGb3JSZWdDbGFzcyAtIEF1Z21lbnQgYW4gZXhpc3RpbmcgZmxhZyB3b3JkIHJldHVybmVkIGJ5CisgIC8vLyBnZXRGbGFnV29yZCB3aXRoIHRoZSByZXF1aXJlZCByZWdpc3RlciBjbGFzcyBmb3IgdGhlIGZvbGxvd2luZyByZWdpc3RlcgorICAvLy8gb3BlcmFuZHMuCisgIC8vLyBBIHRpZWQgdXNlIG9wZXJhbmQgY2Fubm90IGhhdmUgYSByZWdpc3RlciBjbGFzcywgdXNlIHRoZSByZWdpc3RlciBjbGFzcworICAvLy8gZnJvbSB0aGUgZGVmIG9wZXJhbmQgaW5zdGVhZC4KKyAgc3RhdGljIHVuc2lnbmVkIGdldEZsYWdXb3JkRm9yUmVnQ2xhc3ModW5zaWduZWQgSW5wdXRGbGFnLCB1bnNpZ25lZCBSQykgeworICAgIC8vIFN0b3JlIFJDICsgMSwgcmVzZXJ2ZSB0aGUgdmFsdWUgMCB0byBtZWFuICdubyByZWdpc3RlciBjbGFzcycuCisgICAgKytSQzsKKyAgICBhc3NlcnQoIWlzSW1tS2luZChJbnB1dEZsYWcpICYmICJJbW1lZGlhdGVzIGNhbm5vdCBoYXZlIGEgcmVnaXN0ZXIgY2xhc3MiKTsKKyAgICBhc3NlcnQoIWlzTWVtS2luZChJbnB1dEZsYWcpICYmICJNZW1vcnkgb3BlcmFuZCBjYW5ub3QgaGF2ZSBhIHJlZ2lzdGVyIGNsYXNzIik7CisgICAgYXNzZXJ0KFJDIDw9IDB4N2ZmZiAmJiAiVG9vIGxhcmdlIHJlZ2lzdGVyIGNsYXNzIElEIik7CisgICAgYXNzZXJ0KChJbnB1dEZsYWcgJiB+MHhmZmZmKSA9PSAwICYmICJIaWdoIGJpdHMgYWxyZWFkeSBjb250YWluIGRhdGEiKTsKKyAgICByZXR1cm4gSW5wdXRGbGFnIHwgKFJDIDw8IDE2KTsKKyAgfQorCisgIC8vLyBBdWdtZW50IGFuIGV4aXN0aW5nIGZsYWcgd29yZCByZXR1cm5lZCBieSBnZXRGbGFnV29yZCB3aXRoIHRoZSBjb25zdHJhaW50CisgIC8vLyBjb2RlIGZvciBhIG1lbW9yeSBjb25zdHJhaW50LgorICBzdGF0aWMgdW5zaWduZWQgZ2V0RmxhZ1dvcmRGb3JNZW0odW5zaWduZWQgSW5wdXRGbGFnLCB1bnNpZ25lZCBDb25zdHJhaW50KSB7CisgICAgYXNzZXJ0KGlzTWVtS2luZChJbnB1dEZsYWcpICYmICJJbnB1dEZsYWcgaXMgbm90IGEgbWVtb3J5IGNvbnN0cmFpbnQhIik7CisgICAgYXNzZXJ0KENvbnN0cmFpbnQgPD0gMHg3ZmZmICYmICJUb28gbGFyZ2UgYSBtZW1vcnkgY29uc3RyYWludCBJRCIpOworICAgIGFzc2VydChDb25zdHJhaW50IDw9IENvbnN0cmFpbnRzX01heCAmJiAiVW5rbm93biBjb25zdHJhaW50IElEIik7CisgICAgYXNzZXJ0KChJbnB1dEZsYWcgJiB+MHhmZmZmKSA9PSAwICYmICJIaWdoIGJpdHMgYWxyZWFkeSBjb250YWluIGRhdGEiKTsKKyAgICByZXR1cm4gSW5wdXRGbGFnIHwgKENvbnN0cmFpbnQgPDwgQ29uc3RyYWludHNfU2hpZnRBbW91bnQpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGNvbnZlcnRNZW1GbGFnV29yZFRvTWF0Y2hpbmdGbGFnV29yZCh1bnNpZ25lZCBJbnB1dEZsYWcpIHsKKyAgICBhc3NlcnQoaXNNZW1LaW5kKElucHV0RmxhZykpOworICAgIHJldHVybiBJbnB1dEZsYWcgJiB+KDB4N2ZmZiA8PCBDb25zdHJhaW50c19TaGlmdEFtb3VudCk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0S2luZCh1bnNpZ25lZCBGbGFncykgeworICAgIHJldHVybiBGbGFncyAmIDc7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0TWVtb3J5Q29uc3RyYWludElEKHVuc2lnbmVkIEZsYWcpIHsKKyAgICBhc3NlcnQoaXNNZW1LaW5kKEZsYWcpKTsKKyAgICByZXR1cm4gKEZsYWcgPj4gQ29uc3RyYWludHNfU2hpZnRBbW91bnQpICYgMHg3ZmZmOworICB9CisKKyAgLy8vIGdldE51bU9wZXJhbmRSZWdpc3RlcnMgLSBFeHRyYWN0IHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIGZpZWxkIGZyb20gdGhlCisgIC8vLyBpbmxpbmUgYXNtIG9wZXJhbmQgZmxhZy4KKyAgc3RhdGljIHVuc2lnbmVkIGdldE51bU9wZXJhbmRSZWdpc3RlcnModW5zaWduZWQgRmxhZykgeworICAgIHJldHVybiAoRmxhZyAmIDB4ZmZmZikgPj4gMzsKKyAgfQorCisgIC8vLyBpc1VzZU9wZXJhbmRUaWVkVG9EZWYgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmxhZyBvZiB0aGUgaW5saW5lIGFzbQorICAvLy8gb3BlcmFuZCBpbmRpY2F0ZXMgaXQgaXMgYW4gdXNlIG9wZXJhbmQgdGhhdCdzIG1hdGNoZWQgdG8gYSBkZWYgb3BlcmFuZC4KKyAgc3RhdGljIGJvb2wgaXNVc2VPcGVyYW5kVGllZFRvRGVmKHVuc2lnbmVkIEZsYWcsIHVuc2lnbmVkICZJZHgpIHsKKyAgICBpZiAoKEZsYWcgJiBGbGFnX01hdGNoaW5nT3BlcmFuZCkgPT0gMCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBJZHggPSAoRmxhZyAmIH5GbGFnX01hdGNoaW5nT3BlcmFuZCkgPj4gMTY7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gaGFzUmVnQ2xhc3NDb25zdHJhaW50IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBmbGFnIGNvbnRhaW5zIGEgcmVnaXN0ZXIKKyAgLy8vIGNsYXNzIGNvbnN0cmFpbnQuICBTZXRzIFJDIHRvIHRoZSByZWdpc3RlciBjbGFzcyBJRC4KKyAgc3RhdGljIGJvb2wgaGFzUmVnQ2xhc3NDb25zdHJhaW50KHVuc2lnbmVkIEZsYWcsIHVuc2lnbmVkICZSQykgeworICAgIGlmIChGbGFnICYgRmxhZ19NYXRjaGluZ09wZXJhbmQpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgdW5zaWduZWQgSGlnaCA9IEZsYWcgPj4gMTY7CisgICAgLy8gZ2V0RmxhZ1dvcmRGb3JSZWdDbGFzcygpIHVzZXMgMCB0byBtZWFuIG5vIHJlZ2lzdGVyIGNsYXNzLCBhbmQgb3RoZXJ3aXNlCisgICAgLy8gc3RvcmVzIFJDICsgMS4KKyAgICBpZiAoIUhpZ2gpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgUkMgPSBIaWdoIC0gMTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfSU5MSU5FQVNNX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW5zdEl0ZXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0luc3RJdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ODhmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0luc3RJdGVyYXRvci5oCkBAIC0wLDAgKzEsMTYzIEBACisvLz09PS0gSW5zdEl0ZXJhdG9yLmggLSBDbGFzc2VzIGZvciBpbnN0IGl0ZXJhdGlvbiAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBvZiB0d28gaXRlcmF0b3JzIGZvciBpdGVyYXRpbmcgb3ZlciB0aGUKKy8vIGluc3RydWN0aW9ucyBpbiBhIGZ1bmN0aW9uLiAgVGhpcyBpcyBlZmZlY3RpdmVseSBhIHdyYXBwZXIgYXJvdW5kIGEgdHdvIGxldmVsCisvLyBpdGVyYXRvciB0aGF0IGNhbiBwcm9iYWJseSBiZSBnZW5lcmljaXplZCBsYXRlci4KKy8vCisvLyBOb3RlIHRoYXQgdGhpcyBpdGVyYXRvciBnZXRzIGludmFsaWRhdGVkIGFueSB0aW1lIHRoYXQgYmFzaWMgYmxvY2tzIG9yCisvLyBpbnN0cnVjdGlvbnMgYXJlIG1vdmVkIGFyb3VuZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfSU5TVElURVJBVE9SX0gKKyNkZWZpbmUgTExWTV9JUl9JTlNUSVRFUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9TeW1ib2xUYWJsZUxpc3RUcmFpdHMuaCIKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgaW5zdF9iZWdpbigpICYgaW5zdF9lbmQoKSBmb3IKKy8vIGluc3RfaXRlcmF0b3IgYW5kIGNvbnN0X2luc3RfaXRlcmF0b3Incy4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgQkJfdCwgY2xhc3MgQkJfaV90LCBjbGFzcyBCSV90LCBjbGFzcyBJSV90PiBjbGFzcyBJbnN0SXRlcmF0b3IgeworICB1c2luZyBCQnR5ID0gQkJfdDsKKyAgdXNpbmcgQkJJdHkgPSBCQl9pX3Q7CisgIHVzaW5nIEJJdHkgPSBCSV90OworICB1c2luZyBJSXR5ID0gSUlfdDsKKyAgQkJfdCAqQkJzOyAvLyBCYXNpY0Jsb2Nrc1R5cGUKKyAgQkJfaV90IEJCOyAvLyBCYXNpY0Jsb2Nrc1R5cGU6Oml0ZXJhdG9yCisgIEJJX3QgQkk7ICAgLy8gQmFzaWNCbG9jazo6aXRlcmF0b3IKKworcHVibGljOgorICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWc7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBJSXR5OworICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBzaWduZWQ7CisgIHVzaW5nIHBvaW50ZXIgPSBJSXR5ICo7CisgIHVzaW5nIHJlZmVyZW5jZSA9IElJdHkgJjsKKworICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgIEluc3RJdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAvLyBDb3B5IGNvbnN0cnVjdG9yLi4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEIsIHR5cGVuYW1lIEMsIHR5cGVuYW1lIEQ+CisgIEluc3RJdGVyYXRvcihjb25zdCBJbnN0SXRlcmF0b3I8QSxCLEMsRD4gJklJKQorICAgIDogQkJzKElJLkJCcyksIEJCKElJLkJCKSwgQkkoSUkuQkkpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQiwgdHlwZW5hbWUgQywgdHlwZW5hbWUgRD4KKyAgSW5zdEl0ZXJhdG9yKEluc3RJdGVyYXRvcjxBLEIsQyxEPiAmSUkpCisgICAgOiBCQnMoSUkuQkJzKSwgQkIoSUkuQkIpLCBCSShJSS5CSSkge30KKworICB0ZW1wbGF0ZTxjbGFzcyBNPiBJbnN0SXRlcmF0b3IoTSAmbSkKKyAgICA6IEJCcygmbS5nZXRCYXNpY0Jsb2NrTGlzdCgpKSwgQkIoQkJzLT5iZWdpbigpKSB7ICAgIC8vIGJlZ2luIGN0b3IKKyAgICBpZiAoQkIgIT0gQkJzLT5lbmQoKSkgeworICAgICAgQkkgPSBCQi0+YmVnaW4oKTsKKyAgICAgIGFkdmFuY2VUb05leHRCQigpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlPGNsYXNzIE0+IEluc3RJdGVyYXRvcihNICZtLCBib29sKQorICAgIDogQkJzKCZtLmdldEJhc2ljQmxvY2tMaXN0KCkpLCBCQihCQnMtPmVuZCgpKSB7ICAgIC8vIGVuZCBjdG9yCisgIH0KKworICAvLyBBY2Nlc3NvcnMgdG8gZ2V0IGF0IHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9ycy4uLgorICBpbmxpbmUgQkJJdHkgJmdldEJhc2ljQmxvY2tJdGVyYXRvcigpICB7IHJldHVybiBCQjsgfQorICBpbmxpbmUgQkl0eSAgJmdldEluc3RydWN0aW9uSXRlcmF0b3IoKSB7IHJldHVybiBCSTsgfQorCisgIGlubGluZSByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgIGNvbnN0IHsgcmV0dXJuICpCSTsgfQorICBpbmxpbmUgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJm9wZXJhdG9yKigpOyB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbnN0SXRlcmF0b3IgJnkpIGNvbnN0IHsKKyAgICByZXR1cm4gQkIgPT0geS5CQiAmJiAoQkIgPT0gQkJzLT5lbmQoKSB8fCBCSSA9PSB5LkJJKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEluc3RJdGVyYXRvciYgeSkgY29uc3QgeworICAgIHJldHVybiAhb3BlcmF0b3I9PSh5KTsKKyAgfQorCisgIEluc3RJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKKyAgICArK0JJOworICAgIGFkdmFuY2VUb05leHRCQigpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgSW5zdEl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CisgICAgSW5zdEl0ZXJhdG9yIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICB9CisKKyAgSW5zdEl0ZXJhdG9yJiBvcGVyYXRvci0tKCkgeworICAgIHdoaWxlIChCQiA9PSBCQnMtPmVuZCgpIHx8IEJJID09IEJCLT5iZWdpbigpKSB7CisgICAgICAtLUJCOworICAgICAgQkkgPSBCQi0+ZW5kKCk7CisgICAgfQorICAgIC0tQkk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBJbnN0SXRlcmF0b3Igb3BlcmF0b3ItLShpbnQpIHsKKyAgICBJbnN0SXRlcmF0b3IgdG1wID0gKnRoaXM7IC0tKnRoaXM7IHJldHVybiB0bXA7CisgIH0KKworICBpbmxpbmUgYm9vbCBhdEVuZCgpIGNvbnN0IHsgcmV0dXJuIEJCID09IEJCcy0+ZW5kKCk7IH0KKworcHJpdmF0ZToKKyAgaW5saW5lIHZvaWQgYWR2YW5jZVRvTmV4dEJCKCkgeworICAgIC8vIFRoZSBvbmx5IHdheSB0aGF0IHRoZSBJSSBjb3VsZCBiZSBicm9rZW4gaXMgaWYgaXQgaXMgbm93IHBvaW50aW5nIHRvCisgICAgLy8gdGhlIGVuZCgpIG9mIHRoZSBjdXJyZW50IEJhc2ljQmxvY2sgYW5kIHRoZXJlIGFyZSBzdWNjZXNzb3IgQkJzLgorICAgIHdoaWxlIChCSSA9PSBCQi0+ZW5kKCkpIHsKKyAgICAgICsrQkI7CisgICAgICBpZiAoQkIgPT0gQkJzLT5lbmQoKSkgYnJlYWs7CisgICAgICBCSSA9IEJCLT5iZWdpbigpOworICAgIH0KKyAgfQorfTsKKwordXNpbmcgaW5zdF9pdGVyYXRvciA9CisgICAgSW5zdEl0ZXJhdG9yPFN5bWJvbFRhYmxlTGlzdDxCYXNpY0Jsb2NrPiwgRnVuY3Rpb246Oml0ZXJhdG9yLAorICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciwgSW5zdHJ1Y3Rpb24+OwordXNpbmcgY29uc3RfaW5zdF9pdGVyYXRvciA9CisgICAgSW5zdEl0ZXJhdG9yPGNvbnN0IFN5bWJvbFRhYmxlTGlzdDxCYXNpY0Jsb2NrPiwKKyAgICAgICAgICAgICAgICAgRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yLCBCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24+OwordXNpbmcgaW5zdF9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPGluc3RfaXRlcmF0b3I+OwordXNpbmcgY29uc3RfaW5zdF9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPGNvbnN0X2luc3RfaXRlcmF0b3I+OworCitpbmxpbmUgaW5zdF9pdGVyYXRvciBpbnN0X2JlZ2luKEZ1bmN0aW9uICpGKSB7IHJldHVybiBpbnN0X2l0ZXJhdG9yKCpGKTsgfQoraW5saW5lIGluc3RfaXRlcmF0b3IgaW5zdF9lbmQoRnVuY3Rpb24gKkYpICAgeyByZXR1cm4gaW5zdF9pdGVyYXRvcigqRiwgdHJ1ZSk7IH0KK2lubGluZSBpbnN0X3JhbmdlIGluc3RydWN0aW9ucyhGdW5jdGlvbiAqRikgeworICByZXR1cm4gaW5zdF9yYW5nZShpbnN0X2JlZ2luKEYpLCBpbnN0X2VuZChGKSk7Cit9CitpbmxpbmUgY29uc3RfaW5zdF9pdGVyYXRvciBpbnN0X2JlZ2luKGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgIHJldHVybiBjb25zdF9pbnN0X2l0ZXJhdG9yKCpGKTsKK30KK2lubGluZSBjb25zdF9pbnN0X2l0ZXJhdG9yIGluc3RfZW5kKGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgIHJldHVybiBjb25zdF9pbnN0X2l0ZXJhdG9yKCpGLCB0cnVlKTsKK30KK2lubGluZSBjb25zdF9pbnN0X3JhbmdlIGluc3RydWN0aW9ucyhjb25zdCBGdW5jdGlvbiAqRikgeworICByZXR1cm4gY29uc3RfaW5zdF9yYW5nZShpbnN0X2JlZ2luKEYpLCBpbnN0X2VuZChGKSk7Cit9CitpbmxpbmUgaW5zdF9pdGVyYXRvciBpbnN0X2JlZ2luKEZ1bmN0aW9uICZGKSB7IHJldHVybiBpbnN0X2l0ZXJhdG9yKEYpOyB9CitpbmxpbmUgaW5zdF9pdGVyYXRvciBpbnN0X2VuZChGdW5jdGlvbiAmRikgICB7IHJldHVybiBpbnN0X2l0ZXJhdG9yKEYsIHRydWUpOyB9CitpbmxpbmUgaW5zdF9yYW5nZSBpbnN0cnVjdGlvbnMoRnVuY3Rpb24gJkYpIHsKKyAgcmV0dXJuIGluc3RfcmFuZ2UoaW5zdF9iZWdpbihGKSwgaW5zdF9lbmQoRikpOworfQoraW5saW5lIGNvbnN0X2luc3RfaXRlcmF0b3IgaW5zdF9iZWdpbihjb25zdCBGdW5jdGlvbiAmRikgeworICByZXR1cm4gY29uc3RfaW5zdF9pdGVyYXRvcihGKTsKK30KK2lubGluZSBjb25zdF9pbnN0X2l0ZXJhdG9yIGluc3RfZW5kKGNvbnN0IEZ1bmN0aW9uICZGKSB7CisgIHJldHVybiBjb25zdF9pbnN0X2l0ZXJhdG9yKEYsIHRydWUpOworfQoraW5saW5lIGNvbnN0X2luc3RfcmFuZ2UgaW5zdHJ1Y3Rpb25zKGNvbnN0IEZ1bmN0aW9uICZGKSB7CisgIHJldHVybiBjb25zdF9pbnN0X3JhbmdlKGluc3RfYmVnaW4oRiksIGluc3RfZW5kKEYpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfSU5TVElURVJBVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW5zdFZpc2l0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW5zdFZpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTU3OTgxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnN0VmlzaXRvci5oCkBAIC0wLDAgKzEsMjk4IEBACisvLz09PS0gSW5zdFZpc2l0b3IuaCAtIEluc3RydWN0aW9uIHZpc2l0b3IgdGVtcGxhdGVzIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgTExWTV9JUl9JTlNUVklTSVRPUl9ICisjZGVmaW5lIExMVk1fSVJfSU5TVFZJU0lUT1JfSAorCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLyBXZSBvcGVyYXRlIG9uIG9wYXF1ZSBpbnN0cnVjdGlvbiBjbGFzc2VzLCBzbyBmb3J3YXJkIGRlY2xhcmUgYWxsIGluc3RydWN0aW9uCisvLyB0eXBlcyBub3cuLi4KKy8vCisjZGVmaW5lIEhBTkRMRV9JTlNUKE5VTSwgT1BDT0RFLCBDTEFTUykgICBjbGFzcyBDTEFTUzsKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmRlZiIKKworI2RlZmluZSBERUxFR0FURShDTEFTU19UT19WSVNJVCkgXAorICByZXR1cm4gc3RhdGljX2Nhc3Q8U3ViQ2xhc3MqPih0aGlzKS0+IFwKKyAgICAgICAgICAgICAgIHZpc2l0IyNDTEFTU19UT19WSVNJVChzdGF0aWNfY2FzdDxDTEFTU19UT19WSVNJVCY+KEkpKQorCisKKy8vLyBAYnJpZWYgQmFzZSBjbGFzcyBmb3IgaW5zdHJ1Y3Rpb24gdmlzaXRvcnMKKy8vLworLy8vIEluc3RydWN0aW9uIHZpc2l0b3JzIGFyZSB1c2VkIHdoZW4geW91IHdhbnQgdG8gcGVyZm9ybSBkaWZmZXJlbnQgYWN0aW9ucworLy8vIGZvciBkaWZmZXJlbnQga2luZHMgb2YgaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgaGF2aW5nIHRvIHVzZSBsb3RzIG9mIGNhc3RzCisvLy8gYW5kIGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQgKGluIHlvdXIgY29kZSwgdGhhdCBpcykuCisvLy8KKy8vLyBUbyBkZWZpbmUgeW91ciBvd24gdmlzaXRvciwgaW5oZXJpdCBmcm9tIHRoaXMgY2xhc3MsIHNwZWNpZnlpbmcgeW91cgorLy8vIG5ldyB0eXBlIGZvciB0aGUgJ1N1YkNsYXNzJyB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIGFuZCAib3ZlcnJpZGUiIHZpc2l0WFhYCisvLy8gZnVuY3Rpb25zIGluIHlvdXIgY2xhc3MuIEkgc2F5ICJvdmVycmlkZSIgYmVjYXVzZSB0aGlzIGNsYXNzIGlzIGRlZmluZWQKKy8vLyBpbiB0ZXJtcyBvZiBzdGF0aWNhbGx5IHJlc29sdmVkIG92ZXJsb2FkaW5nLCBub3QgdmlydHVhbCBmdW5jdGlvbnMuCisvLy8KKy8vLyBGb3IgZXhhbXBsZSwgaGVyZSBpcyBhIHZpc2l0b3IgdGhhdCBjb3VudHMgdGhlIG51bWJlciBvZiBtYWxsb2MKKy8vLyBpbnN0cnVjdGlvbnMgcHJvY2Vzc2VkOgorLy8vCisvLy8gIC8vLyBEZWNsYXJlIHRoZSBjbGFzcy4gIE5vdGUgdGhhdCB3ZSBkZXJpdmUgZnJvbSBJbnN0VmlzaXRvciBpbnN0YW50aWF0ZWQKKy8vLyAgLy8vIHdpdGggX291ciBuZXcgc3ViY2xhc3Nlc18gdHlwZS4KKy8vLyAgLy8vCisvLy8gIHN0cnVjdCBDb3VudEFsbG9jYVZpc2l0b3IgOiBwdWJsaWMgSW5zdFZpc2l0b3I8Q291bnRBbGxvY2FWaXNpdG9yPiB7CisvLy8gICAgdW5zaWduZWQgQ291bnQ7CisvLy8gICAgQ291bnRBbGxvY2FWaXNpdG9yKCkgOiBDb3VudCgwKSB7fQorLy8vCisvLy8gICAgdm9pZCB2aXNpdEFsbG9jYUluc3QoQWxsb2NhSW5zdCAmQUkpIHsgKytDb3VudDsgfQorLy8vICB9OworLy8vCisvLy8gIEFuZCB0aGlzIGNsYXNzIHdvdWxkIGJlIHVzZWQgbGlrZSB0aGlzOgorLy8vICAgIENvdW50QWxsb2NhVmlzaXRvciBDQVY7CisvLy8gICAgQ0FWLnZpc2l0KGZ1bmN0aW9uKTsKKy8vLyAgICBOdW1BbGxvY2FzID0gQ0FWLkNvdW50OworLy8vCisvLy8gVGhlIGRlZmluZWQgaGFzICd2aXNpdCcgbWV0aG9kcyBmb3IgSW5zdHJ1Y3Rpb24sIGFuZCBhbHNvIGZvciBCYXNpY0Jsb2NrLAorLy8vIEZ1bmN0aW9uLCBhbmQgTW9kdWxlLCB3aGljaCByZWN1cnNpdmVseSBwcm9jZXNzIGFsbCBjb250YWluZWQgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gTm90ZSB0aGF0IGlmIHlvdSBkb24ndCBpbXBsZW1lbnQgdmlzaXRYWFggZm9yIHNvbWUgaW5zdHJ1Y3Rpb24gdHlwZSwKKy8vLyB0aGUgdmlzaXRYWFggbWV0aG9kIGZvciBpbnN0cnVjdGlvbiBzdXBlcmNsYXNzIHdpbGwgYmUgaW52b2tlZC4gU28KKy8vLyBpZiBpbnN0cnVjdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBmdXR1cmUsIHRoZXkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5CisvLy8gc3VwcG9ydGVkLCBpZiB5b3UgaGFuZGxlIG9uZSBvZiB0aGVpciBzdXBlcmNsYXNzZXMuCisvLy8KKy8vLyBUaGUgb3B0aW9uYWwgc2Vjb25kIHRlbXBsYXRlIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgdHlwZSB0aGF0IGluc3RydWN0aW9uCisvLy8gdmlzaXRhdGlvbiBmdW5jdGlvbnMgc2hvdWxkIHJldHVybi4gSWYgeW91IHNwZWNpZnkgdGhpcywgeW91ICpNVVNUKiBwcm92aWRlCisvLy8gYW4gaW1wbGVtZW50YXRpb24gb2YgdmlzaXRJbnN0cnVjdGlvbiB0aG91Z2ghLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgY2xhc3MgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIGFzIGEgdGVtcGxhdGUgdG8gYXZvaWQKKy8vLyB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuICBEZWZpbmluZyBhbmQgdXNpbmcgYW4gSW5zdFZpc2l0b3IgaXMganVzdAorLy8vIGFzIGVmZmljaWVudCBhcyBoYXZpbmcgeW91ciBvd24gc3dpdGNoIHN0YXRlbWVudCBvdmVyIHRoZSBpbnN0cnVjdGlvbgorLy8vIG9wY29kZS4KK3RlbXBsYXRlPHR5cGVuYW1lIFN1YkNsYXNzLCB0eXBlbmFtZSBSZXRUeT12b2lkPgorY2xhc3MgSW5zdFZpc2l0b3IgeworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSW50ZXJmYWNlIGNvZGUgLSBUaGlzIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIG9mIHRoZSBJbnN0VmlzaXRvciB0aGF0IHlvdQorICAvLyB1c2UgdG8gdmlzaXQgaW5zdHJ1Y3Rpb25zLi4uCisgIC8vCisKK3B1YmxpYzoKKyAgLy8gR2VuZXJpYyB2aXNpdCBtZXRob2QgLSBBbGxvdyB2aXNpdGF0aW9uIHRvIGFsbCBpbnN0cnVjdGlvbnMgaW4gYSByYW5nZQorICB0ZW1wbGF0ZTxjbGFzcyBJdGVyYXRvcj4KKyAgdm9pZCB2aXNpdChJdGVyYXRvciBTdGFydCwgSXRlcmF0b3IgRW5kKSB7CisgICAgd2hpbGUgKFN0YXJ0ICE9IEVuZCkKKyAgICAgIHN0YXRpY19jYXN0PFN1YkNsYXNzKj4odGhpcyktPnZpc2l0KCpTdGFydCsrKTsKKyAgfQorCisgIC8vIERlZmluZSB2aXNpdG9ycyBmb3IgZnVuY3Rpb25zIGFuZCBiYXNpYyBibG9ja3MuLi4KKyAgLy8KKyAgdm9pZCB2aXNpdChNb2R1bGUgJk0pIHsKKyAgICBzdGF0aWNfY2FzdDxTdWJDbGFzcyo+KHRoaXMpLT52aXNpdE1vZHVsZShNKTsKKyAgICB2aXNpdChNLmJlZ2luKCksIE0uZW5kKCkpOworICB9CisgIHZvaWQgdmlzaXQoRnVuY3Rpb24gJkYpIHsKKyAgICBzdGF0aWNfY2FzdDxTdWJDbGFzcyo+KHRoaXMpLT52aXNpdEZ1bmN0aW9uKEYpOworICAgIHZpc2l0KEYuYmVnaW4oKSwgRi5lbmQoKSk7CisgIH0KKyAgdm9pZCB2aXNpdChCYXNpY0Jsb2NrICZCQikgeworICAgIHN0YXRpY19jYXN0PFN1YkNsYXNzKj4odGhpcyktPnZpc2l0QmFzaWNCbG9jayhCQik7CisgICAgdmlzaXQoQkIuYmVnaW4oKSwgQkIuZW5kKCkpOworICB9CisKKyAgLy8gRm9yd2FyZGluZyBmdW5jdGlvbnMgc28gdGhhdCB0aGUgdXNlciBjYW4gdmlzaXQgd2l0aCBwb2ludGVycyBBTkQgcmVmcy4KKyAgdm9pZCB2aXNpdChNb2R1bGUgICAgICAgKk0pICB7IHZpc2l0KCpNKTsgfQorICB2b2lkIHZpc2l0KEZ1bmN0aW9uICAgICAqRikgIHsgdmlzaXQoKkYpOyB9CisgIHZvaWQgdmlzaXQoQmFzaWNCbG9jayAgICpCQikgeyB2aXNpdCgqQkIpOyB9CisgIFJldFR5IHZpc2l0KEluc3RydWN0aW9uICpJKSAgeyByZXR1cm4gdmlzaXQoKkkpOyB9CisKKyAgLy8gdmlzaXQgLSBGaW5hbGx5LCBjb2RlIHRvIHZpc2l0IGFuIGluc3RydWN0aW9uLi4uCisgIC8vCisgIFJldFR5IHZpc2l0KEluc3RydWN0aW9uICZJKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Jhc2Vfb2Y8SW5zdFZpc2l0b3IsIFN1YkNsYXNzPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiTXVzdCBwYXNzIHRoZSBkZXJpdmVkIHR5cGUgdG8gdGhpcyB0ZW1wbGF0ZSEiKTsKKworICAgIHN3aXRjaCAoSS5nZXRPcGNvZGUoKSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gaW5zdHJ1Y3Rpb24gdHlwZSBlbmNvdW50ZXJlZCEiKTsKKyAgICAgIC8vIEJ1aWxkIHRoZSBzd2l0Y2ggc3RhdGVtZW50IHVzaW5nIHRoZSBJbnN0cnVjdGlvbi5kZWYgZmlsZS4uLgorI2RlZmluZSBIQU5ETEVfSU5TVChOVU0sIE9QQ09ERSwgQ0xBU1MpIFwKKyAgICBjYXNlIEluc3RydWN0aW9uOjpPUENPREU6IHJldHVybiBcCisgICAgICAgICAgIHN0YXRpY19jYXN0PFN1YkNsYXNzKj4odGhpcyktPiBcCisgICAgICAgICAgICAgICAgICAgICAgdmlzaXQjI09QQ09ERShzdGF0aWNfY2FzdDxDTEFTUyY+KEkpKTsKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmRlZiIKKyAgICB9CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVmlzaXRhdGlvbiBmdW5jdGlvbnMuLi4gdGhlc2UgZnVuY3Rpb25zIHByb3ZpZGUgZGVmYXVsdCBmYWxsYmFja3MgaW4gY2FzZQorICAvLyB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IHdoYXQgdG8gZG8gZm9yIGEgcGFydGljdWxhciBpbnN0cnVjdGlvbiB0eXBlLgorICAvLyBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBnZW5lcmFsaXplIHRoZSBpbnN0cnVjdGlvbiB0eXBlIHRvIGl0cyBzdWJ0eXBlCisgIC8vIGFuZCB0cnkgdmlzaXRpbmcgdGhlIHN1YnR5cGUuICBBbGwgb2YgdGhpcyBzaG91bGQgYmUgaW5saW5lZCBwZXJmZWN0bHksCisgIC8vIGJlY2F1c2UgdGhlcmUgYXJlIG5vIHZpcnR1YWwgZnVuY3Rpb25zIHRvIGdldCBpbiB0aGUgd2F5LgorICAvLworCisgIC8vIFdoZW4gdmlzaXRpbmcgYSBtb2R1bGUsIGZ1bmN0aW9uIG9yIGJhc2ljIGJsb2NrIGRpcmVjdGx5LCB0aGVzZSBtZXRob2RzIGdldAorICAvLyBjYWxsZWQgdG8gaW5kaWNhdGUgd2hlbiB0cmFuc2l0aW9uaW5nIGludG8gYSBuZXcgdW5pdC4KKyAgLy8KKyAgdm9pZCB2aXNpdE1vZHVsZSAgICAoTW9kdWxlICZNKSB7fQorICB2b2lkIHZpc2l0RnVuY3Rpb24gIChGdW5jdGlvbiAmRikge30KKyAgdm9pZCB2aXNpdEJhc2ljQmxvY2soQmFzaWNCbG9jayAmQkIpIHt9CisKKyAgLy8gRGVmaW5lIGluc3RydWN0aW9uIHNwZWNpZmljIHZpc2l0b3IgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gdG8KKyAgLy8gaGFuZGxlIFNQRUNJRklDIGluc3RydWN0aW9ucy4gIFRoZXNlIGZ1bmN0aW9ucyBhdXRvbWF0aWNhbGx5IGRlZmluZQorICAvLyB2aXNpdE11bCB0byBwcm94eSB0byB2aXNpdEJpbmFyeU9wZXJhdG9yIGZvciBpbnN0YW5jZSBpbiBjYXNlIHRoZSB1c2VyIGRvZXMKKyAgLy8gbm90IG5lZWQgdGhpcyBnZW5lcmFsaXR5LgorICAvLworICAvLyBUaGVzZSBmdW5jdGlvbnMgY2FuIGFsc28gaW1wbGVtZW50IGZhbi1vdXQsIHdoZW4gYSBzaW5nbGUgb3Bjb2RlIGFuZAorICAvLyBpbnN0cnVjdGlvbiBoYXZlIG11bHRpcGxlIG1vcmUgc3BlY2lmaWMgSW5zdHJ1Y3Rpb24gc3ViY2xhc3Nlcy4gVGhlIENhbGwKKyAgLy8gaW5zdHJ1Y3Rpb24gY3VycmVudGx5IHN1cHBvcnRzIHRoaXMuIFdlIGltcGxlbWVudCB0aGF0IGJ5IHJlZGlyZWN0aW5nIHRoYXQKKyAgLy8gaW5zdHJ1Y3Rpb24gdG8gYSBzcGVjaWFsIGRlbGVnYXRpb24gaGVscGVyLgorI2RlZmluZSBIQU5ETEVfSU5TVChOVU0sIE9QQ09ERSwgQ0xBU1MpIFwKKyAgICBSZXRUeSB2aXNpdCMjT1BDT0RFKENMQVNTICZJKSB7IFwKKyAgICAgIGlmIChOVU0gPT0gSW5zdHJ1Y3Rpb246OkNhbGwpIFwKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlQ2FsbEluc3QoSSk7IFwKKyAgICAgIGVsc2UgXAorICAgICAgICBERUxFR0FURShDTEFTUyk7IFwKKyAgICB9CisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5kZWYiCisKKyAgLy8gU3BlY2lmaWMgSW5zdHJ1Y3Rpb24gdHlwZSBjbGFzc2VzLi4uIG5vdGUgdGhhdCBhbGwgb2YgdGhlIGNhc3RzIGFyZQorICAvLyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSB1c2UgdGhlIGluc3RydWN0aW9uIGNsYXNzZXMgYXMgb3BhcXVlIHR5cGVzLi4uCisgIC8vCisgIFJldFR5IHZpc2l0UmV0dXJuSW5zdChSZXR1cm5JbnN0ICZJKSAgICAgICAgICAgIHsgREVMRUdBVEUoVGVybWluYXRvckluc3QpO30KKyAgUmV0VHkgdmlzaXRCcmFuY2hJbnN0KEJyYW5jaEluc3QgJkkpICAgICAgICAgICAgeyBERUxFR0FURShUZXJtaW5hdG9ySW5zdCk7fQorICBSZXRUeSB2aXNpdFN3aXRjaEluc3QoU3dpdGNoSW5zdCAmSSkgICAgICAgICAgICB7IERFTEVHQVRFKFRlcm1pbmF0b3JJbnN0KTt9CisgIFJldFR5IHZpc2l0SW5kaXJlY3RCckluc3QoSW5kaXJlY3RCckluc3QgJkkpICAgIHsgREVMRUdBVEUoVGVybWluYXRvckluc3QpO30KKyAgUmV0VHkgdmlzaXRSZXN1bWVJbnN0KFJlc3VtZUluc3QgJkkpICAgICAgICAgICAgeyBERUxFR0FURShUZXJtaW5hdG9ySW5zdCk7fQorICBSZXRUeSB2aXNpdFVucmVhY2hhYmxlSW5zdChVbnJlYWNoYWJsZUluc3QgJkkpICB7IERFTEVHQVRFKFRlcm1pbmF0b3JJbnN0KTt9CisgIFJldFR5IHZpc2l0Q2xlYW51cFJldHVybkluc3QoQ2xlYW51cFJldHVybkluc3QgJkkpIHsgREVMRUdBVEUoVGVybWluYXRvckluc3QpO30KKyAgUmV0VHkgdmlzaXRDYXRjaFJldHVybkluc3QoQ2F0Y2hSZXR1cm5JbnN0ICZJKSAgeyBERUxFR0FURShUZXJtaW5hdG9ySW5zdCk7IH0KKyAgUmV0VHkgdmlzaXRDYXRjaFN3aXRjaEluc3QoQ2F0Y2hTd2l0Y2hJbnN0ICZJKSAgeyBERUxFR0FURShUZXJtaW5hdG9ySW5zdCk7fQorICBSZXRUeSB2aXNpdElDbXBJbnN0KElDbXBJbnN0ICZJKSAgICAgICAgICAgICAgICB7IERFTEVHQVRFKENtcEluc3QpO30KKyAgUmV0VHkgdmlzaXRGQ21wSW5zdChGQ21wSW5zdCAmSSkgICAgICAgICAgICAgICAgeyBERUxFR0FURShDbXBJbnN0KTt9CisgIFJldFR5IHZpc2l0QWxsb2NhSW5zdChBbGxvY2FJbnN0ICZJKSAgICAgICAgICAgIHsgREVMRUdBVEUoVW5hcnlJbnN0cnVjdGlvbik7fQorICBSZXRUeSB2aXNpdExvYWRJbnN0KExvYWRJbnN0ICAgICAmSSkgICAgICAgICAgICB7IERFTEVHQVRFKFVuYXJ5SW5zdHJ1Y3Rpb24pO30KKyAgUmV0VHkgdmlzaXRTdG9yZUluc3QoU3RvcmVJbnN0ICAgJkkpICAgICAgICAgICAgeyBERUxFR0FURShJbnN0cnVjdGlvbik7fQorICBSZXRUeSB2aXNpdEF0b21pY0NtcFhjaGdJbnN0KEF0b21pY0NtcFhjaGdJbnN0ICZJKSB7IERFTEVHQVRFKEluc3RydWN0aW9uKTt9CisgIFJldFR5IHZpc2l0QXRvbWljUk1XSW5zdChBdG9taWNSTVdJbnN0ICZJKSAgICAgIHsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pO30KKyAgUmV0VHkgdmlzaXRGZW5jZUluc3QoRmVuY2VJbnN0ICAgJkkpICAgICAgICAgICAgeyBERUxFR0FURShJbnN0cnVjdGlvbik7fQorICBSZXRUeSB2aXNpdEdldEVsZW1lbnRQdHJJbnN0KEdldEVsZW1lbnRQdHJJbnN0ICZJKXsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pO30KKyAgUmV0VHkgdmlzaXRQSElOb2RlKFBISU5vZGUgICAgICAgJkkpICAgICAgICAgICAgeyBERUxFR0FURShJbnN0cnVjdGlvbik7fQorICBSZXRUeSB2aXNpdFRydW5jSW5zdChUcnVuY0luc3QgJkkpICAgICAgICAgICAgICB7IERFTEVHQVRFKENhc3RJbnN0KTt9CisgIFJldFR5IHZpc2l0WkV4dEluc3QoWkV4dEluc3QgJkkpICAgICAgICAgICAgICAgIHsgREVMRUdBVEUoQ2FzdEluc3QpO30KKyAgUmV0VHkgdmlzaXRTRXh0SW5zdChTRXh0SW5zdCAmSSkgICAgICAgICAgICAgICAgeyBERUxFR0FURShDYXN0SW5zdCk7fQorICBSZXRUeSB2aXNpdEZQVHJ1bmNJbnN0KEZQVHJ1bmNJbnN0ICZJKSAgICAgICAgICB7IERFTEVHQVRFKENhc3RJbnN0KTt9CisgIFJldFR5IHZpc2l0RlBFeHRJbnN0KEZQRXh0SW5zdCAmSSkgICAgICAgICAgICAgIHsgREVMRUdBVEUoQ2FzdEluc3QpO30KKyAgUmV0VHkgdmlzaXRGUFRvVUlJbnN0KEZQVG9VSUluc3QgJkkpICAgICAgICAgICAgeyBERUxFR0FURShDYXN0SW5zdCk7fQorICBSZXRUeSB2aXNpdEZQVG9TSUluc3QoRlBUb1NJSW5zdCAmSSkgICAgICAgICAgICB7IERFTEVHQVRFKENhc3RJbnN0KTt9CisgIFJldFR5IHZpc2l0VUlUb0ZQSW5zdChVSVRvRlBJbnN0ICZJKSAgICAgICAgICAgIHsgREVMRUdBVEUoQ2FzdEluc3QpO30KKyAgUmV0VHkgdmlzaXRTSVRvRlBJbnN0KFNJVG9GUEluc3QgJkkpICAgICAgICAgICAgeyBERUxFR0FURShDYXN0SW5zdCk7fQorICBSZXRUeSB2aXNpdFB0clRvSW50SW5zdChQdHJUb0ludEluc3QgJkkpICAgICAgICB7IERFTEVHQVRFKENhc3RJbnN0KTt9CisgIFJldFR5IHZpc2l0SW50VG9QdHJJbnN0KEludFRvUHRySW5zdCAmSSkgICAgICAgIHsgREVMRUdBVEUoQ2FzdEluc3QpO30KKyAgUmV0VHkgdmlzaXRCaXRDYXN0SW5zdChCaXRDYXN0SW5zdCAmSSkgICAgICAgICAgeyBERUxFR0FURShDYXN0SW5zdCk7fQorICBSZXRUeSB2aXNpdEFkZHJTcGFjZUNhc3RJbnN0KEFkZHJTcGFjZUNhc3RJbnN0ICZJKSB7IERFTEVHQVRFKENhc3RJbnN0KTt9CisgIFJldFR5IHZpc2l0U2VsZWN0SW5zdChTZWxlY3RJbnN0ICZJKSAgICAgICAgICAgIHsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pO30KKyAgUmV0VHkgdmlzaXRWQUFyZ0luc3QoVkFBcmdJbnN0ICAgJkkpICAgICAgICAgICAgeyBERUxFR0FURShVbmFyeUluc3RydWN0aW9uKTt9CisgIFJldFR5IHZpc2l0RXh0cmFjdEVsZW1lbnRJbnN0KEV4dHJhY3RFbGVtZW50SW5zdCAmSSkgeyBERUxFR0FURShJbnN0cnVjdGlvbik7fQorICBSZXRUeSB2aXNpdEluc2VydEVsZW1lbnRJbnN0KEluc2VydEVsZW1lbnRJbnN0ICZJKSB7IERFTEVHQVRFKEluc3RydWN0aW9uKTt9CisgIFJldFR5IHZpc2l0U2h1ZmZsZVZlY3Rvckluc3QoU2h1ZmZsZVZlY3Rvckluc3QgJkkpIHsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pO30KKyAgUmV0VHkgdmlzaXRFeHRyYWN0VmFsdWVJbnN0KEV4dHJhY3RWYWx1ZUluc3QgJkkpeyBERUxFR0FURShVbmFyeUluc3RydWN0aW9uKTt9CisgIFJldFR5IHZpc2l0SW5zZXJ0VmFsdWVJbnN0KEluc2VydFZhbHVlSW5zdCAmSSkgIHsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pOyB9CisgIFJldFR5IHZpc2l0TGFuZGluZ1BhZEluc3QoTGFuZGluZ1BhZEluc3QgJkkpICAgIHsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pOyB9CisgIFJldFR5IHZpc2l0RnVuY2xldFBhZEluc3QoRnVuY2xldFBhZEluc3QgJkkpIHsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pOyB9CisgIFJldFR5IHZpc2l0Q2xlYW51cFBhZEluc3QoQ2xlYW51cFBhZEluc3QgJkkpIHsgREVMRUdBVEUoRnVuY2xldFBhZEluc3QpOyB9CisgIFJldFR5IHZpc2l0Q2F0Y2hQYWRJbnN0KENhdGNoUGFkSW5zdCAmSSkgICAgIHsgREVMRUdBVEUoRnVuY2xldFBhZEluc3QpOyB9CisKKyAgLy8gSGFuZGxlIHRoZSBzcGVjaWFsIGluc3RyaW5zaWMgaW5zdHJ1Y3Rpb24gY2xhc3Nlcy4KKyAgUmV0VHkgdmlzaXREYmdEZWNsYXJlSW5zdChEYmdEZWNsYXJlSW5zdCAmSSkgICAgeyBERUxFR0FURShEYmdJbmZvSW50cmluc2ljKTt9CisgIFJldFR5IHZpc2l0RGJnVmFsdWVJbnN0KERiZ1ZhbHVlSW5zdCAmSSkgICAgICAgIHsgREVMRUdBVEUoRGJnSW5mb0ludHJpbnNpYyk7fQorICBSZXRUeSB2aXNpdERiZ0luZm9JbnRyaW5zaWMoRGJnSW5mb0ludHJpbnNpYyAmSSkgeyBERUxFR0FURShJbnRyaW5zaWNJbnN0KTsgfQorICBSZXRUeSB2aXNpdE1lbVNldEluc3QoTWVtU2V0SW5zdCAmSSkgICAgICAgICAgICB7IERFTEVHQVRFKE1lbUludHJpbnNpYyk7IH0KKyAgUmV0VHkgdmlzaXRNZW1DcHlJbnN0KE1lbUNweUluc3QgJkkpICAgICAgICAgICAgeyBERUxFR0FURShNZW1UcmFuc2Zlckluc3QpOyB9CisgIFJldFR5IHZpc2l0TWVtTW92ZUluc3QoTWVtTW92ZUluc3QgJkkpICAgICAgICAgIHsgREVMRUdBVEUoTWVtVHJhbnNmZXJJbnN0KTsgfQorICBSZXRUeSB2aXNpdE1lbVRyYW5zZmVySW5zdChNZW1UcmFuc2Zlckluc3QgJkkpICB7IERFTEVHQVRFKE1lbUludHJpbnNpYyk7IH0KKyAgUmV0VHkgdmlzaXRNZW1JbnRyaW5zaWMoTWVtSW50cmluc2ljICZJKSAgICAgICAgeyBERUxFR0FURShJbnRyaW5zaWNJbnN0KTsgfQorICBSZXRUeSB2aXNpdFZBU3RhcnRJbnN0KFZBU3RhcnRJbnN0ICZJKSAgICAgICAgICB7IERFTEVHQVRFKEludHJpbnNpY0luc3QpOyB9CisgIFJldFR5IHZpc2l0VkFFbmRJbnN0KFZBRW5kSW5zdCAmSSkgICAgICAgICAgICAgIHsgREVMRUdBVEUoSW50cmluc2ljSW5zdCk7IH0KKyAgUmV0VHkgdmlzaXRWQUNvcHlJbnN0KFZBQ29weUluc3QgJkkpICAgICAgICAgICAgeyBERUxFR0FURShJbnRyaW5zaWNJbnN0KTsgfQorICBSZXRUeSB2aXNpdEludHJpbnNpY0luc3QoSW50cmluc2ljSW5zdCAmSSkgICAgICB7IERFTEVHQVRFKENhbGxJbnN0KTsgfQorCisgIC8vIENhbGwgYW5kIEludm9rZSBhcmUgc2xpZ2h0bHkgZGlmZmVyZW50IGFzIHRoZXkgZGVsZWdhdGUgZmlyc3QgdGhyb3VnaAorICAvLyBhIGdlbmVyaWMgQ2FsbFNpdGUgdmlzaXRvci4KKyAgUmV0VHkgdmlzaXRDYWxsSW5zdChDYWxsSW5zdCAmSSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdWJDbGFzcyo+KHRoaXMpLT52aXNpdENhbGxTaXRlKCZJKTsKKyAgfQorICBSZXRUeSB2aXNpdEludm9rZUluc3QoSW52b2tlSW5zdCAmSSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdWJDbGFzcyo+KHRoaXMpLT52aXNpdENhbGxTaXRlKCZJKTsKKyAgfQorCisgIC8vIE5leHQgbGV2ZWwgcHJvcGFnYXRvcnM6IElmIHRoZSB1c2VyIGRvZXMgbm90IG92ZXJsb2FkIGEgc3BlY2lmaWMKKyAgLy8gaW5zdHJ1Y3Rpb24gdHlwZSwgdGhleSBjYW4gb3ZlcmxvYWQgb25lIG9mIHRoZXNlIHRvIGdldCB0aGUgd2hvbGUgY2xhc3MKKyAgLy8gb2YgaW5zdHJ1Y3Rpb25zLi4uCisgIC8vCisgIFJldFR5IHZpc2l0Q2FzdEluc3QoQ2FzdEluc3QgJkkpICAgICAgICAgICAgICAgIHsgREVMRUdBVEUoVW5hcnlJbnN0cnVjdGlvbik7fQorICBSZXRUeSB2aXNpdEJpbmFyeU9wZXJhdG9yKEJpbmFyeU9wZXJhdG9yICZJKSAgICB7IERFTEVHQVRFKEluc3RydWN0aW9uKTt9CisgIFJldFR5IHZpc2l0Q21wSW5zdChDbXBJbnN0ICZJKSAgICAgICAgICAgICAgICAgIHsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pO30KKyAgUmV0VHkgdmlzaXRUZXJtaW5hdG9ySW5zdChUZXJtaW5hdG9ySW5zdCAmSSkgICAgeyBERUxFR0FURShJbnN0cnVjdGlvbik7fQorICBSZXRUeSB2aXNpdFVuYXJ5SW5zdHJ1Y3Rpb24oVW5hcnlJbnN0cnVjdGlvbiAmSSl7IERFTEVHQVRFKEluc3RydWN0aW9uKTt9CisKKyAgLy8gUHJvdmlkZSBhIHNwZWNpYWwgdmlzaXRvciBmb3IgYSAnY2FsbHNpdGUnIHRoYXQgdmlzaXRzIGJvdGggY2FsbHMgYW5kCisgIC8vIGludm9rZXMuIFdoZW4gdW5pbXBsZW1lbnRlZCwgcHJvcGVybHkgZGVsZWdhdGVzIHRvIGVpdGhlciB0aGUgdGVybWluYXRvciBvcgorICAvLyByZWd1bGFyIGluc3RydWN0aW9uIHZpc2l0b3IuCisgIFJldFR5IHZpc2l0Q2FsbFNpdGUoQ2FsbFNpdGUgQ1MpIHsKKyAgICBhc3NlcnQoQ1MpOworICAgIEluc3RydWN0aW9uICZJID0gKkNTLmdldEluc3RydWN0aW9uKCk7CisgICAgaWYgKENTLmlzQ2FsbCgpKQorICAgICAgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pOworCisgICAgYXNzZXJ0KENTLmlzSW52b2tlKCkpOworICAgIERFTEVHQVRFKFRlcm1pbmF0b3JJbnN0KTsKKyAgfQorCisgIC8vIElmIHRoZSB1c2VyIHdhbnRzIGEgJ2RlZmF1bHQnIGNhc2UsIHRoZXkgY2FuIGNob29zZSB0byBvdmVycmlkZSB0aGlzCisgIC8vIGZ1bmN0aW9uLiAgSWYgdGhpcyBmdW5jdGlvbiBpcyBub3Qgb3ZlcmxvYWRlZCBpbiB0aGUgdXNlcidzIHN1YmNsYXNzLCB0aGVuCisgIC8vIHRoaXMgaW5zdHJ1Y3Rpb24ganVzdCBnZXRzIGlnbm9yZWQuCisgIC8vCisgIC8vIE5vdGUgdGhhdCB5b3UgTVVTVCBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdXIgcmV0dXJuIHR5cGUgaXMgbm90IHZvaWQuCisgIC8vCisgIHZvaWQgdmlzaXRJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAmSSkge30gIC8vIElnbm9yZSB1bmhhbmRsZWQgaW5zdHJ1Y3Rpb25zCisKK3ByaXZhdGU6CisgIC8vIFNwZWNpYWwgaGVscGVyIGZ1bmN0aW9uIHRvIGRlbGVnYXRlIHRvIENhbGxJbnN0IHN1YmNsYXNzIHZpc2l0b3JzLgorICBSZXRUeSBkZWxlZ2F0ZUNhbGxJbnN0KENhbGxJbnN0ICZJKSB7CisgICAgaWYgKGNvbnN0IEZ1bmN0aW9uICpGID0gSS5nZXRDYWxsZWRGdW5jdGlvbigpKSB7CisgICAgICBzd2l0Y2ggKEYtPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgREVMRUdBVEUoSW50cmluc2ljSW5zdCk7CisgICAgICBjYXNlIEludHJpbnNpYzo6ZGJnX2RlY2xhcmU6IERFTEVHQVRFKERiZ0RlY2xhcmVJbnN0KTsKKyAgICAgIGNhc2UgSW50cmluc2ljOjpkYmdfdmFsdWU6ICAgREVMRUdBVEUoRGJnVmFsdWVJbnN0KTsKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1jcHk6ICAgICAgREVMRUdBVEUoTWVtQ3B5SW5zdCk7CisgICAgICBjYXNlIEludHJpbnNpYzo6bWVtbW92ZTogICAgIERFTEVHQVRFKE1lbU1vdmVJbnN0KTsKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1zZXQ6ICAgICAgREVMRUdBVEUoTWVtU2V0SW5zdCk7CisgICAgICBjYXNlIEludHJpbnNpYzo6dmFzdGFydDogICAgIERFTEVHQVRFKFZBU3RhcnRJbnN0KTsKKyAgICAgIGNhc2UgSW50cmluc2ljOjp2YWVuZDogICAgICAgREVMRUdBVEUoVkFFbmRJbnN0KTsKKyAgICAgIGNhc2UgSW50cmluc2ljOjp2YWNvcHk6ICAgICAgREVMRUdBVEUoVkFDb3B5SW5zdCk7CisgICAgICBjYXNlIEludHJpbnNpYzo6bm90X2ludHJpbnNpYzogYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIERFTEVHQVRFKENhbGxJbnN0KTsKKyAgfQorCisgIC8vIEFuIG92ZXJsb2FkIHRoYXQgd2lsbCBuZXZlciBhY3R1YWxseSBiZSBjYWxsZWQsIGl0IGlzIHVzZWQgb25seSBmcm9tIGRlYWQKKyAgLy8gY29kZSBpbiB0aGUgZGlzcGF0Y2hpbmcgZnJvbSBvcGNvZGVzIHRvIGluc3RydWN0aW9uIHN1YmNsYXNzZXMuCisgIFJldFR5IGRlbGVnYXRlQ2FsbEluc3QoSW5zdHJ1Y3Rpb24gJkkpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJkZWxlZ2F0ZUNhbGxJbnN0IGNhbGxlZCBmb3Igbm9uLUNhbGxJbnN0Iik7CisgIH0KK307CisKKyN1bmRlZiBERUxFR0FURQorCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW5zdHJUeXBlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnN0clR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0M2M0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW5zdHJUeXBlcy5oCkBAIC0wLDAgKzEsMTY5NCBAQAorLy89PT0tIGxsdm0vSW5zdHJUeXBlcy5oIC0gSW1wb3J0YW50IEluc3RydWN0aW9uIHN1YmNsYXNzZXMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB2YXJpb3VzIG1ldGEgY2xhc3NlcyBvZiBpbnN0cnVjdGlvbnMgdGhhdCBleGlzdCBpbiB0aGUgVk0KKy8vIHJlcHJlc2VudGF0aW9uLiAgU3BlY2lmaWMgY29uY3JldGUgc3ViY2xhc3NlcyBvZiB0aGVzZSBtYXkgYmUgZm91bmQgaW4gdGhlCisvLyBpKi5oIGZpbGVzLi4uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0lOU1RSVFlQRVNfSAorI2RlZmluZSBMTFZNX0lSX0lOU1RSVFlQRVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9PcGVyYW5kVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Vc2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVybWluYXRvckluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBTdWJjbGFzc2VzIG9mIHRoaXMgY2xhc3MgYXJlIGFsbCBhYmxlIHRvIHRlcm1pbmF0ZSBhIGJhc2ljCisvLy8gYmxvY2suIFRodXMsIHRoZXNlIGFyZSBhbGwgdGhlIGZsb3cgY29udHJvbCB0eXBlIG9mIG9wZXJhdGlvbnMuCisvLy8KK2NsYXNzIFRlcm1pbmF0b3JJbnN0IDogcHVibGljIEluc3RydWN0aW9uIHsKK3Byb3RlY3RlZDoKKyAgVGVybWluYXRvckluc3QoVHlwZSAqVHksIEluc3RydWN0aW9uOjpUZXJtT3BzIGlUeXBlLAorICAgICAgICAgICAgICAgICBVc2UgKk9wcywgdW5zaWduZWQgTnVtT3BzLAorICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikKKyAgICA6IEluc3RydWN0aW9uKFR5LCBpVHlwZSwgT3BzLCBOdW1PcHMsIEluc2VydEJlZm9yZSkge30KKworICBUZXJtaW5hdG9ySW5zdChUeXBlICpUeSwgSW5zdHJ1Y3Rpb246OlRlcm1PcHMgaVR5cGUsCisgICAgICAgICAgICAgICAgIFVzZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorICAgIDogSW5zdHJ1Y3Rpb24oVHksIGlUeXBlLCBPcHMsIE51bU9wcywgSW5zZXJ0QXRFbmQpIHt9CisKK3B1YmxpYzoKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NvcnMgdGhhdCB0aGlzIHRlcm1pbmF0b3IgaGFzLgorICB1bnNpZ25lZCBnZXROdW1TdWNjZXNzb3JzKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgc3BlY2lmaWVkIHN1Y2Nlc3Nvci4KKyAgQmFzaWNCbG9jayAqZ2V0U3VjY2Vzc29yKHVuc2lnbmVkIGlkeCkgY29uc3Q7CisKKyAgLy8vIFVwZGF0ZSB0aGUgc3BlY2lmaWVkIHN1Y2Nlc3NvciB0byBwb2ludCBhdCB0aGUgcHJvdmlkZWQgYmxvY2suCisgIHZvaWQgc2V0U3VjY2Vzc29yKHVuc2lnbmVkIGlkeCwgQmFzaWNCbG9jayAqQik7CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5pc1Rlcm1pbmF0b3IoKTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KKworICAvLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoaXMgdGVybWluYXRvciByZWxhdGVzIHRvIGV4Y2VwdGlvbiBoYW5kbGluZy4KKyAgYm9vbCBpc0V4Y2VwdGlvbmFsKCkgY29uc3QgeworICAgIHN3aXRjaCAoZ2V0T3Bjb2RlKCkpIHsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpDYXRjaFN3aXRjaDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpDYXRjaFJldDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpDbGVhbnVwUmV0OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246Okludm9rZToKKyAgICBjYXNlIEluc3RydWN0aW9uOjpSZXN1bWU6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBzdWNjX2l0ZXJhdG9yIGRlZmluaXRpb24KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgdGVtcGxhdGUgPGNsYXNzIFRlcm0sIGNsYXNzIEJCPiAvLyBTdWNjZXNzb3IgSXRlcmF0b3IKKyAgY2xhc3MgU3VjY0l0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgQkIgKiwgQkIgKj4geworICAgIHVzaW5nIHN1cGVyID0KKyAgICAgICAgc3RkOjppdGVyYXRvcjxzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBCQiwgaW50LCBCQiAqLCBCQiAqPjsKKworICBwdWJsaWM6CisgICAgdXNpbmcgcG9pbnRlciA9IHR5cGVuYW1lIHN1cGVyOjpwb2ludGVyOworICAgIHVzaW5nIHJlZmVyZW5jZSA9IHR5cGVuYW1lIHN1cGVyOjpyZWZlcmVuY2U7CisKKyAgcHJpdmF0ZToKKyAgICBUZXJtIFRlcm1JbnN0OworICAgIHVuc2lnbmVkIGlkeDsKKyAgICB1c2luZyBTZWxmID0gU3VjY0l0ZXJhdG9yPFRlcm0sIEJCPjsKKworICAgIGlubGluZSBib29sIGluZGV4X2lzX3ZhbGlkKHVuc2lnbmVkIGlkeCkgeworICAgICAgcmV0dXJuIGlkeCA8IFRlcm1JbnN0LT5nZXROdW1TdWNjZXNzb3JzKCk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBQcm94eSBvYmplY3QgdG8gYWxsb3cgd3JpdGUgYWNjZXNzIGluIG9wZXJhdG9yW10KKyAgICBjbGFzcyBTdWNjZXNzb3JQcm94eSB7CisgICAgICBTZWxmIGl0OworCisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQgU3VjY2Vzc29yUHJveHkoY29uc3QgU2VsZiAmaXQpIDogaXQoaXQpIHt9CisKKyAgICAgIFN1Y2Nlc3NvclByb3h5KGNvbnN0IFN1Y2Nlc3NvclByb3h5ICYpID0gZGVmYXVsdDsKKworICAgICAgU3VjY2Vzc29yUHJveHkgJm9wZXJhdG9yPShTdWNjZXNzb3JQcm94eSByKSB7CisgICAgICAgICp0aGlzID0gcmVmZXJlbmNlKHIpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIFN1Y2Nlc3NvclByb3h5ICZvcGVyYXRvcj0ocmVmZXJlbmNlIHIpIHsKKyAgICAgICAgaXQuVGVybUluc3QtPnNldFN1Y2Nlc3NvcihpdC5pZHgsIHIpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIG9wZXJhdG9yIHJlZmVyZW5jZSgpIGNvbnN0IHsgcmV0dXJuICppdDsgfQorICAgIH07CisKKyAgcHVibGljOgorICAgIC8vIGJlZ2luIGl0ZXJhdG9yCisgICAgZXhwbGljaXQgaW5saW5lIFN1Y2NJdGVyYXRvcihUZXJtIFQpIDogVGVybUluc3QoVCksIGlkeCgwKSB7fQorICAgIC8vIGVuZCBpdGVyYXRvcgorICAgIGlubGluZSBTdWNjSXRlcmF0b3IoVGVybSBULCBib29sKSA6IFRlcm1JbnN0KFQpIHsKKyAgICAgIGlmIChUZXJtSW5zdCkKKyAgICAgICAgaWR4ID0gVGVybUluc3QtPmdldE51bVN1Y2Nlc3NvcnMoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgLy8gVGVybSA9PSBOVUxMIGhhcHBlbnMsIGlmIGEgYmFzaWMgYmxvY2sgaXMgbm90IGZ1bGx5IGNvbnN0cnVjdGVkIGFuZAorICAgICAgICAvLyBjb25zZXF1ZW50bHkgZ2V0VGVybWluYXRvcigpIHJldHVybnMgTlVMTC4gSW4gdGhpcyBjYXNlIHdlIGNvbnN0cnVjdAorICAgICAgICAvLyBhIFN1Y2NJdGVyYXRvciB3aGljaCBkZXNjcmliZXMgYSBiYXNpYyBibG9jayB0aGF0IGhhcyB6ZXJvCisgICAgICAgIC8vIHN1Y2Nlc3NvcnMuCisgICAgICAgIC8vIERlZmluaW5nIFN1Y2NJdGVyYXRvciBmb3IgaW5jb21wbGV0ZSBhbmQgbWFsZm9ybWVkIENGR3MgaXMgZXNwZWNpYWxseQorICAgICAgICAvLyB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KKyAgICAgICAgaWR4ID0gMDsKKyAgICB9CisKKyAgICAvLy8gVGhpcyBpcyB1c2VkIHRvIGludGVyZmFjZSBiZXR3ZWVuIGNvZGUgdGhhdCB3YW50cyB0bworICAgIC8vLyBvcGVyYXRlIG9uIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb25zIGRpcmVjdGx5LgorICAgIHVuc2lnbmVkIGdldFN1Y2Nlc3NvckluZGV4KCkgY29uc3QgeyByZXR1cm4gaWR4OyB9CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNlbGYgJngpIGNvbnN0IHsgcmV0dXJuIGlkeCA9PSB4LmlkeDsgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgU2VsZiAmeCkgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0oeCk7IH0KKworICAgIGlubGluZSByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gVGVybUluc3QtPmdldFN1Y2Nlc3NvcihpZHgpOyB9CisgICAgaW5saW5lIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG9wZXJhdG9yKigpOyB9CisKKyAgICBpbmxpbmUgU2VsZiAmb3BlcmF0b3IrKygpIHsKKyAgICAgICsraWR4OworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0gLy8gUHJlaW5jcmVtZW50CisKKyAgICBpbmxpbmUgU2VsZiBvcGVyYXRvcisrKGludCkgeyAvLyBQb3N0aW5jcmVtZW50CisgICAgICBTZWxmIHRtcCA9ICp0aGlzOworICAgICAgKysqdGhpczsKKyAgICAgIHJldHVybiB0bXA7CisgICAgfQorCisgICAgaW5saW5lIFNlbGYgJm9wZXJhdG9yLS0oKSB7CisgICAgICAtLWlkeDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVkZWNyZW1lbnQKKyAgICBpbmxpbmUgU2VsZiBvcGVyYXRvci0tKGludCkgeyAvLyBQb3N0ZGVjcmVtZW50CisgICAgICBTZWxmIHRtcCA9ICp0aGlzOworICAgICAgLS0qdGhpczsKKyAgICAgIHJldHVybiB0bXA7CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFNlbGYgJngpIGNvbnN0IHsKKyAgICAgIGFzc2VydChUZXJtSW5zdCA9PSB4LlRlcm1JbnN0ICYmCisgICAgICAgICAgICAgIkNhbm5vdCBjb21wYXJlIGl0ZXJhdG9ycyBvZiBkaWZmZXJlbnQgYmxvY2tzISIpOworICAgICAgcmV0dXJuIGlkeCA8IHguaWR4OworICAgIH0KKworICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgU2VsZiAmeCkgY29uc3QgeworICAgICAgYXNzZXJ0KFRlcm1JbnN0ID09IHguVGVybUluc3QgJiYKKyAgICAgICAgICAgICAiQ2Fubm90IGNvbXBhcmUgaXRlcmF0b3JzIG9mIGRpZmZlcmVudCBibG9ja3MhIik7CisgICAgICByZXR1cm4gaWR4IDw9IHguaWR4OworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFNlbGYgJngpIGNvbnN0IHsKKyAgICAgIGFzc2VydChUZXJtSW5zdCA9PSB4LlRlcm1JbnN0ICYmCisgICAgICAgICAgICAgIkNhbm5vdCBjb21wYXJlIGl0ZXJhdG9ycyBvZiBkaWZmZXJlbnQgYmxvY2tzISIpOworICAgICAgcmV0dXJuIGlkeCA+PSB4LmlkeDsKKyAgICB9CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgU2VsZiAmeCkgY29uc3QgeworICAgICAgYXNzZXJ0KFRlcm1JbnN0ID09IHguVGVybUluc3QgJiYKKyAgICAgICAgICAgICAiQ2Fubm90IGNvbXBhcmUgaXRlcmF0b3JzIG9mIGRpZmZlcmVudCBibG9ja3MhIik7CisgICAgICByZXR1cm4gaWR4ID4geC5pZHg7CisgICAgfQorCisgICAgaW5saW5lIFNlbGYgJm9wZXJhdG9yKz0oaW50IFJpZ2h0KSB7CisgICAgICB1bnNpZ25lZCBuZXdfaWR4ID0gaWR4ICsgUmlnaHQ7CisgICAgICBhc3NlcnQoaW5kZXhfaXNfdmFsaWQobmV3X2lkeCkgJiYgIkl0ZXJhdG9yIGluZGV4IG91dCBvZiBib3VuZCIpOworICAgICAgaWR4ID0gbmV3X2lkeDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpbmxpbmUgU2VsZiBvcGVyYXRvcisoaW50IFJpZ2h0KSBjb25zdCB7CisgICAgICBTZWxmIHRtcCA9ICp0aGlzOworICAgICAgdG1wICs9IFJpZ2h0OworICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICBpbmxpbmUgU2VsZiAmb3BlcmF0b3ItPShpbnQgUmlnaHQpIHsgcmV0dXJuIG9wZXJhdG9yKz0oLVJpZ2h0KTsgfQorCisgICAgaW5saW5lIFNlbGYgb3BlcmF0b3ItKGludCBSaWdodCkgY29uc3QgeyByZXR1cm4gb3BlcmF0b3IrKC1SaWdodCk7IH0KKworICAgIGlubGluZSBpbnQgb3BlcmF0b3ItKGNvbnN0IFNlbGYgJngpIGNvbnN0IHsKKyAgICAgIGFzc2VydChUZXJtSW5zdCA9PSB4LlRlcm1JbnN0ICYmCisgICAgICAgICAgICAgIkNhbm5vdCB3b3JrIG9uIGl0ZXJhdG9ycyBvZiBkaWZmZXJlbnQgYmxvY2tzISIpOworICAgICAgaW50IGRpc3RhbmNlID0gaWR4IC0geC5pZHg7CisgICAgICByZXR1cm4gZGlzdGFuY2U7CisgICAgfQorCisgICAgaW5saW5lIFN1Y2Nlc3NvclByb3h5IG9wZXJhdG9yW10oaW50IG9mZnNldCkgeworICAgICAgU2VsZiB0bXAgPSAqdGhpczsKKyAgICAgIHRtcCArPSBvZmZzZXQ7CisgICAgICByZXR1cm4gU3VjY2Vzc29yUHJveHkodG1wKTsKKyAgICB9CisKKyAgICAvLy8gR2V0IHRoZSBzb3VyY2UgQkIgb2YgdGhpcyBpdGVyYXRvci4KKyAgICBpbmxpbmUgQkIgKmdldFNvdXJjZSgpIHsKKyAgICAgIGFzc2VydChUZXJtSW5zdCAmJiAiU291cmNlIG5vdCBhdmFpbGFibGUsIGlmIGJhc2ljIGJsb2NrIHdhcyBtYWxmb3JtZWQiKTsKKyAgICAgIHJldHVybiBUZXJtSW5zdC0+Z2V0UGFyZW50KCk7CisgICAgfQorICB9OworCisgIHVzaW5nIHN1Y2NfaXRlcmF0b3IgPSBTdWNjSXRlcmF0b3I8VGVybWluYXRvckluc3QgKiwgQmFzaWNCbG9jaz47CisgIHVzaW5nIHN1Y2NfY29uc3RfaXRlcmF0b3IgPQorICAgICAgU3VjY0l0ZXJhdG9yPGNvbnN0IFRlcm1pbmF0b3JJbnN0ICosIGNvbnN0IEJhc2ljQmxvY2s+OworICB1c2luZyBzdWNjX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8c3VjY19pdGVyYXRvcj47CisgIHVzaW5nIHN1Y2NfY29uc3RfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxzdWNjX2NvbnN0X2l0ZXJhdG9yPjsKKworcHJpdmF0ZToKKyAgaW5saW5lIHN1Y2NfaXRlcmF0b3Igc3VjY19iZWdpbigpIHsgcmV0dXJuIHN1Y2NfaXRlcmF0b3IodGhpcyk7IH0KKyAgaW5saW5lIHN1Y2NfY29uc3RfaXRlcmF0b3Igc3VjY19iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3VjY19jb25zdF9pdGVyYXRvcih0aGlzKTsKKyAgfQorICBpbmxpbmUgc3VjY19pdGVyYXRvciBzdWNjX2VuZCgpIHsgcmV0dXJuIHN1Y2NfaXRlcmF0b3IodGhpcywgdHJ1ZSk7IH0KKyAgaW5saW5lIHN1Y2NfY29uc3RfaXRlcmF0b3Igc3VjY19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN1Y2NfY29uc3RfaXRlcmF0b3IodGhpcywgdHJ1ZSk7CisgIH0KKworcHVibGljOgorICBpbmxpbmUgc3VjY19yYW5nZSBzdWNjZXNzb3JzKCkgeworICAgIHJldHVybiBzdWNjX3JhbmdlKHN1Y2NfYmVnaW4oKSwgc3VjY19lbmQoKSk7CisgIH0KKyAgaW5saW5lIHN1Y2NfY29uc3RfcmFuZ2Ugc3VjY2Vzc29ycygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3VjY19jb25zdF9yYW5nZShzdWNjX2JlZ2luKCksIHN1Y2NfZW5kKCkpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFVuYXJ5SW5zdHJ1Y3Rpb24gQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIFVuYXJ5SW5zdHJ1Y3Rpb24gOiBwdWJsaWMgSW5zdHJ1Y3Rpb24geworcHJvdGVjdGVkOgorICBVbmFyeUluc3RydWN0aW9uKFR5cGUgKlR5LCB1bnNpZ25lZCBpVHlwZSwgVmFsdWUgKlYsCisgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKklCID0gbnVsbHB0cikKKyAgICA6IEluc3RydWN0aW9uKFR5LCBpVHlwZSwgJk9wPDA+KCksIDEsIElCKSB7CisgICAgT3A8MD4oKSA9IFY7CisgIH0KKyAgVW5hcnlJbnN0cnVjdGlvbihUeXBlICpUeSwgdW5zaWduZWQgaVR5cGUsIFZhbHVlICpWLCBCYXNpY0Jsb2NrICpJQUUpCisgICAgOiBJbnN0cnVjdGlvbihUeSwgaVR5cGUsICZPcDwwPigpLCAxLCBJQUUpIHsKKyAgICBPcDwwPigpID0gVjsKKyAgfQorCitwdWJsaWM6CisgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IG9uZSBvcGVyYW5kCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMSk7CisgIH0KKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QWxsb2NhIHx8CisgICAgICAgICAgIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpMb2FkIHx8CisgICAgICAgICAgIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpWQUFyZyB8fAorICAgICAgICAgICBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RXh0cmFjdFZhbHVlIHx8CisgICAgICAgICAgIChJLT5nZXRPcGNvZGUoKSA+PSBDYXN0T3BzQmVnaW4gJiYgSS0+Z2V0T3Bjb2RlKCkgPCBDYXN0T3BzRW5kKTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxVbmFyeUluc3RydWN0aW9uPiA6CisgIHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8VW5hcnlJbnN0cnVjdGlvbiwgMT4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFVuYXJ5SW5zdHJ1Y3Rpb24sIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvciBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgQmluYXJ5T3BlcmF0b3IgOiBwdWJsaWMgSW5zdHJ1Y3Rpb24geworICB2b2lkIEFzc2VydE9LKCk7CisKK3Byb3RlY3RlZDoKKyAgQmluYXJ5T3BlcmF0b3IoQmluYXJ5T3BzIGlUeXBlLCBWYWx1ZSAqUzEsIFZhbHVlICpTMiwgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKyAgQmluYXJ5T3BlcmF0b3IoQmluYXJ5T3BzIGlUeXBlLCBWYWx1ZSAqUzEsIFZhbHVlICpTMiwgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIEJpbmFyeU9wZXJhdG9yICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB0d28gb3BlcmFuZHMKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7CisgICAgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzLCAyKTsKKyAgfQorCisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLy8gQ29uc3RydWN0IGEgYmluYXJ5IGluc3RydWN0aW9uLCBnaXZlbiB0aGUgb3Bjb2RlIGFuZCB0aGUgdHdvCisgIC8vLyBvcGVyYW5kcy4gIE9wdGlvbmFsbHkgKGlmIEluc3RCZWZvcmUgaXMgc3BlY2lmaWVkKSBpbnNlcnQgdGhlIGluc3RydWN0aW9uCisgIC8vLyBpbnRvIGEgQmFzaWNCbG9jayByaWdodCBiZWZvcmUgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4gIFRoZSBzcGVjaWZpZWQKKyAgLy8vIEluc3RydWN0aW9uIGlzIGFsbG93ZWQgdG8gYmUgYSBkZXJlZmVyZW5jZWQgZW5kIGl0ZXJhdG9yLgorICAvLy8KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGUoQmluYXJ5T3BzIE9wLCBWYWx1ZSAqUzEsIFZhbHVlICpTMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSBUd2luZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisKKyAgLy8vIENvbnN0cnVjdCBhIGJpbmFyeSBpbnN0cnVjdGlvbiwgZ2l2ZW4gdGhlIG9wY29kZSBhbmQgdGhlIHR3bworICAvLy8gb3BlcmFuZHMuICBBbHNvIGF1dG9tYXRpY2FsbHkgaW5zZXJ0IHRoaXMgaW5zdHJ1Y3Rpb24gdG8gdGhlIGVuZCBvZiB0aGUKKyAgLy8vIEJhc2ljQmxvY2sgc3BlY2lmaWVkLgorICAvLy8KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGUoQmluYXJ5T3BzIE9wLCBWYWx1ZSAqUzEsIFZhbHVlICpTMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICAvLy8gVGhlc2UgbWV0aG9kcyBqdXN0IGZvcndhcmQgdG8gQ3JlYXRlLCBhbmQgYXJlIHVzZWZ1bCB3aGVuIHlvdQorICAvLy8gc3RhdGljYWxseSBrbm93IHdoYXQgdHlwZSBvZiBpbnN0cnVjdGlvbiB5b3UncmUgZ29pbmcgdG8gY3JlYXRlLiAgVGhlc2UKKyAgLy8vIGhlbHBlcnMganVzdCBzYXZlIHNvbWUgdHlwaW5nLgorI2RlZmluZSBIQU5ETEVfQklOQVJZX0lOU1QoTiwgT1BDLCBDTEFTUykgXAorICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZSMjT1BDKFZhbHVlICpWMSwgVmFsdWUgKlYyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikge1wKKyAgICByZXR1cm4gQ3JlYXRlKEluc3RydWN0aW9uOjpPUEMsIFYxLCBWMiwgTmFtZSk7XAorICB9CisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5kZWYiCisjZGVmaW5lIEhBTkRMRV9CSU5BUllfSU5TVChOLCBPUEMsIENMQVNTKSBcCisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlIyNPUEMoVmFsdWUgKlYxLCBWYWx1ZSAqVjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSwgQmFzaWNCbG9jayAqQkIpIHtcCisgICAgcmV0dXJuIENyZWF0ZShJbnN0cnVjdGlvbjo6T1BDLCBWMSwgVjIsIE5hbWUsIEJCKTtcCisgIH0KKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmRlZiIKKyNkZWZpbmUgSEFORExFX0JJTkFSWV9JTlNUKE4sIE9QQywgQ0xBU1MpIFwKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGUjI09QQyhWYWx1ZSAqVjEsIFZhbHVlICpWMiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lLCBJbnN0cnVjdGlvbiAqSSkge1wKKyAgICByZXR1cm4gQ3JlYXRlKEluc3RydWN0aW9uOjpPUEMsIFYxLCBWMiwgTmFtZSwgSSk7XAorICB9CisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5kZWYiCisKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVXaXRoQ29waWVkRmxhZ3MoQmluYXJ5T3BzIE9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKlYxLCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yICpDb3B5Qk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBCaW5hcnlPcGVyYXRvciAqQk8gPSBDcmVhdGUoT3BjLCBWMSwgVjIsIE5hbWUpOworICAgIEJPLT5jb3B5SVJGbGFncyhDb3B5Qk8pOworICAgIHJldHVybiBCTzsKKyAgfQorCisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlRkFkZEZNRihWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yICpGTUZTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZVdpdGhDb3BpZWRGbGFncyhJbnN0cnVjdGlvbjo6RkFkZCwgVjEsIFYyLCBGTUZTb3VyY2UsIE5hbWUpOworICB9CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlRlN1YkZNRihWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yICpGTUZTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZVdpdGhDb3BpZWRGbGFncyhJbnN0cnVjdGlvbjo6RlN1YiwgVjEsIFYyLCBGTUZTb3VyY2UsIE5hbWUpOworICB9CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlRk11bEZNRihWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yICpGTUZTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZVdpdGhDb3BpZWRGbGFncyhJbnN0cnVjdGlvbjo6Rk11bCwgVjEsIFYyLCBGTUZTb3VyY2UsIE5hbWUpOworICB9CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlRkRpdkZNRihWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yICpGTUZTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZVdpdGhDb3BpZWRGbGFncyhJbnN0cnVjdGlvbjo6RkRpdiwgVjEsIFYyLCBGTUZTb3VyY2UsIE5hbWUpOworICB9CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlRlJlbUZNRihWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yICpGTUZTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZVdpdGhDb3BpZWRGbGFncyhJbnN0cnVjdGlvbjo6RlJlbSwgVjEsIFYyLCBGTUZTb3VyY2UsIE5hbWUpOworICB9CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlRk5lZ0ZNRihWYWx1ZSAqT3AsIEJpbmFyeU9wZXJhdG9yICpGTUZTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgVmFsdWUgKlplcm8gPSBDb25zdGFudEZQOjpnZXROZWdhdGl2ZVplcm8oT3AtPmdldFR5cGUoKSk7CisgICAgcmV0dXJuIENyZWF0ZVdpdGhDb3BpZWRGbGFncyhJbnN0cnVjdGlvbjo6RlN1YiwgWmVybywgT3AsIEZNRlNvdXJjZSk7CisgIH0KKworICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZU5TVyhCaW5hcnlPcHMgT3BjLCBWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IENyZWF0ZShPcGMsIFYxLCBWMiwgTmFtZSk7CisgICAgQk8tPnNldEhhc05vU2lnbmVkV3JhcCh0cnVlKTsKKyAgICByZXR1cm4gQk87CisgIH0KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOU1coQmluYXJ5T3BzIE9wYywgVmFsdWUgKlYxLCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lLCBCYXNpY0Jsb2NrICpCQikgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IENyZWF0ZShPcGMsIFYxLCBWMiwgTmFtZSwgQkIpOworICAgIEJPLT5zZXRIYXNOb1NpZ25lZFdyYXAodHJ1ZSk7CisgICAgcmV0dXJuIEJPOworICB9CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTlNXKEJpbmFyeU9wcyBPcGMsIFZhbHVlICpWMSwgVmFsdWUgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSwgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICBCaW5hcnlPcGVyYXRvciAqQk8gPSBDcmVhdGUoT3BjLCBWMSwgVjIsIE5hbWUsIEkpOworICAgIEJPLT5zZXRIYXNOb1NpZ25lZFdyYXAodHJ1ZSk7CisgICAgcmV0dXJuIEJPOworICB9CisKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOVVcoQmluYXJ5T3BzIE9wYywgVmFsdWUgKlYxLCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBCaW5hcnlPcGVyYXRvciAqQk8gPSBDcmVhdGUoT3BjLCBWMSwgVjIsIE5hbWUpOworICAgIEJPLT5zZXRIYXNOb1Vuc2lnbmVkV3JhcCh0cnVlKTsKKyAgICByZXR1cm4gQk87CisgIH0KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOVVcoQmluYXJ5T3BzIE9wYywgVmFsdWUgKlYxLCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lLCBCYXNpY0Jsb2NrICpCQikgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IENyZWF0ZShPcGMsIFYxLCBWMiwgTmFtZSwgQkIpOworICAgIEJPLT5zZXRIYXNOb1Vuc2lnbmVkV3JhcCh0cnVlKTsKKyAgICByZXR1cm4gQk87CisgIH0KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOVVcoQmluYXJ5T3BzIE9wYywgVmFsdWUgKlYxLCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lLCBJbnN0cnVjdGlvbiAqSSkgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IENyZWF0ZShPcGMsIFYxLCBWMiwgTmFtZSwgSSk7CisgICAgQk8tPnNldEhhc05vVW5zaWduZWRXcmFwKHRydWUpOworICAgIHJldHVybiBCTzsKKyAgfQorCisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlRXhhY3QoQmluYXJ5T3BzIE9wYywgVmFsdWUgKlYxLCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IENyZWF0ZShPcGMsIFYxLCBWMiwgTmFtZSk7CisgICAgQk8tPnNldElzRXhhY3QodHJ1ZSk7CisgICAgcmV0dXJuIEJPOworICB9CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlRXhhY3QoQmluYXJ5T3BzIE9wYywgVmFsdWUgKlYxLCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUsIEJhc2ljQmxvY2sgKkJCKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQ3JlYXRlKE9wYywgVjEsIFYyLCBOYW1lLCBCQik7CisgICAgQk8tPnNldElzRXhhY3QodHJ1ZSk7CisgICAgcmV0dXJuIEJPOworICB9CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlRXhhY3QoQmluYXJ5T3BzIE9wYywgVmFsdWUgKlYxLCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUsIEluc3RydWN0aW9uICpJKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQ3JlYXRlKE9wYywgVjEsIFYyLCBOYW1lLCBJKTsKKyAgICBCTy0+c2V0SXNFeGFjdCh0cnVlKTsKKyAgICByZXR1cm4gQk87CisgIH0KKworI2RlZmluZSBERUZJTkVfSEVMUEVSUyhPUEMsIE5VV05TV0VYQUNUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGUjI05VV05TV0VYQUNUIyNPUEMoVmFsdWUgKlYxLCBWYWx1ZSAqVjIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsgICAgXAorICAgIHJldHVybiBDcmVhdGUjI05VV05TV0VYQUNUKEluc3RydWN0aW9uOjpPUEMsIFYxLCBWMiwgTmFtZSk7ICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlIyNOVVdOU1dFWEFDVCMjT1BDKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVmFsdWUgKlYxLCBWYWx1ZSAqVjIsIGNvbnN0IFR3aW5lICZOYW1lLCBCYXNpY0Jsb2NrICpCQikgeyAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ3JlYXRlIyNOVVdOU1dFWEFDVChJbnN0cnVjdGlvbjo6T1BDLCBWMSwgVjIsIE5hbWUsIEJCKTsgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZSMjTlVXTlNXRVhBQ1QjI09QQyggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFZhbHVlICpWMSwgVmFsdWUgKlYyLCBjb25zdCBUd2luZSAmTmFtZSwgSW5zdHJ1Y3Rpb24gKkkpIHsgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENyZWF0ZSMjTlVXTlNXRVhBQ1QoSW5zdHJ1Y3Rpb246Ok9QQywgVjEsIFYyLCBOYW1lLCBJKTsgICAgICAgICAgICAgXAorICB9CisKKyAgREVGSU5FX0hFTFBFUlMoQWRkLCBOU1cpIC8vIENyZWF0ZU5TV0FkZAorICBERUZJTkVfSEVMUEVSUyhBZGQsIE5VVykgLy8gQ3JlYXRlTlVXQWRkCisgIERFRklORV9IRUxQRVJTKFN1YiwgTlNXKSAvLyBDcmVhdGVOU1dTdWIKKyAgREVGSU5FX0hFTFBFUlMoU3ViLCBOVVcpIC8vIENyZWF0ZU5VV1N1YgorICBERUZJTkVfSEVMUEVSUyhNdWwsIE5TVykgLy8gQ3JlYXRlTlNXTXVsCisgIERFRklORV9IRUxQRVJTKE11bCwgTlVXKSAvLyBDcmVhdGVOVVdNdWwKKyAgREVGSU5FX0hFTFBFUlMoU2hsLCBOU1cpIC8vIENyZWF0ZU5TV1NobAorICBERUZJTkVfSEVMUEVSUyhTaGwsIE5VVykgLy8gQ3JlYXRlTlVXU2hsCisKKyAgREVGSU5FX0hFTFBFUlMoU0RpdiwgRXhhY3QpICAvLyBDcmVhdGVFeGFjdFNEaXYKKyAgREVGSU5FX0hFTFBFUlMoVURpdiwgRXhhY3QpICAvLyBDcmVhdGVFeGFjdFVEaXYKKyAgREVGSU5FX0hFTFBFUlMoQVNociwgRXhhY3QpICAvLyBDcmVhdGVFeGFjdEFTaHIKKyAgREVGSU5FX0hFTFBFUlMoTFNociwgRXhhY3QpICAvLyBDcmVhdGVFeGFjdExTaHIKKworI3VuZGVmIERFRklORV9IRUxQRVJTCisKKyAgLy8vIEhlbHBlciBmdW5jdGlvbnMgdG8gY29uc3RydWN0IGFuZCBpbnNwZWN0IHVuYXJ5IG9wZXJhdGlvbnMgKE5FRyBhbmQgTk9UKQorICAvLy8gdmlhIGJpbmFyeSBvcGVyYXRvcnMgU1VCIGFuZCBYT1I6CisgIC8vLworICAvLy8gQ3JlYXRlIHRoZSBORUcgYW5kIE5PVCBpbnN0cnVjdGlvbnMgb3V0IG9mIFNVQiBhbmQgWE9SIGluc3RydWN0aW9ucy4KKyAgLy8vCisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTmVnKFZhbHVlICpPcCwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZU5lZyhWYWx1ZSAqT3AsIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTlNXTmVnKFZhbHVlICpPcCwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZU5TV05lZyhWYWx1ZSAqT3AsIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTlVXTmVnKFZhbHVlICpPcCwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZU5VV05lZyhWYWx1ZSAqT3AsIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlRk5lZyhWYWx1ZSAqT3AsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlRk5lZyhWYWx1ZSAqT3AsIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZU5vdChWYWx1ZSAqT3AsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOb3QoVmFsdWUgKk9wLCBjb25zdCBUd2luZSAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIC8vLyBDaGVjayBpZiB0aGUgZ2l2ZW4gVmFsdWUgaXMgYSBORUcsIEZOZWcsIG9yIE5PVCBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIHN0YXRpYyBib29sIGlzTmVnKGNvbnN0IFZhbHVlICpWKTsKKyAgc3RhdGljIGJvb2wgaXNGTmVnKGNvbnN0IFZhbHVlICpWLCBib29sIElnbm9yZVplcm9TaWduPWZhbHNlKTsKKyAgc3RhdGljIGJvb2wgaXNOb3QoY29uc3QgVmFsdWUgKlYpOworCisgIC8vLyBIZWxwZXIgZnVuY3Rpb25zIHRvIGV4dHJhY3QgdGhlIHVuYXJ5IGFyZ3VtZW50IG9mIGEgTkVHLCBGTkVHIG9yIE5PVAorICAvLy8gb3BlcmF0aW9uIGltcGxlbWVudGVkIHZpYSBTdWIsIEZTdWIsIG9yIFhvci4KKyAgLy8vCisgIHN0YXRpYyBjb25zdCBWYWx1ZSAqZ2V0TmVnQXJndW1lbnQoY29uc3QgVmFsdWUgKkJpbk9wKTsKKyAgc3RhdGljICAgICAgIFZhbHVlICpnZXROZWdBcmd1bWVudCggICAgICBWYWx1ZSAqQmluT3ApOworICBzdGF0aWMgY29uc3QgVmFsdWUgKmdldEZOZWdBcmd1bWVudChjb25zdCBWYWx1ZSAqQmluT3ApOworICBzdGF0aWMgICAgICAgVmFsdWUgKmdldEZOZWdBcmd1bWVudCggICAgICBWYWx1ZSAqQmluT3ApOworICBzdGF0aWMgY29uc3QgVmFsdWUgKmdldE5vdEFyZ3VtZW50KGNvbnN0IFZhbHVlICpCaW5PcCk7CisgIHN0YXRpYyAgICAgICBWYWx1ZSAqZ2V0Tm90QXJndW1lbnQoICAgICAgVmFsdWUgKkJpbk9wKTsKKworICBCaW5hcnlPcHMgZ2V0T3Bjb2RlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxCaW5hcnlPcHM+KEluc3RydWN0aW9uOjpnZXRPcGNvZGUoKSk7CisgIH0KKworICAvLy8gRXhjaGFuZ2UgdGhlIHR3byBvcGVyYW5kcyB0byB0aGlzIGluc3RydWN0aW9uLgorICAvLy8gVGhpcyBpbnN0cnVjdGlvbiBpcyBzYWZlIHRvIHVzZSBvbiBhbnkgYmluYXJ5IGluc3RydWN0aW9uIGFuZAorICAvLy8gZG9lcyBub3QgbW9kaWZ5IHRoZSBzZW1hbnRpY3Mgb2YgdGhlIGluc3RydWN0aW9uLiAgSWYgdGhlIGluc3RydWN0aW9uCisgIC8vLyBjYW5ub3QgYmUgcmV2ZXJzZWQgKGllLCBpdCdzIGEgRGl2KSwgdGhlbiByZXR1cm4gdHJ1ZS4KKyAgLy8vCisgIGJvb2wgc3dhcE9wZXJhbmRzKCk7CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5pc0JpbmFyeU9wKCk7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8QmluYXJ5T3BlcmF0b3I+IDoKKyAgcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czxCaW5hcnlPcGVyYXRvciwgMj4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKEJpbmFyeU9wZXJhdG9yLCBWYWx1ZSkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3RJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIGluc3RydWN0aW9ucyB0aGF0IHBlcmZvcm0gZGF0YQorLy8vIGNhc3RzLiBJdCBpcyBzaW1wbHkgcHJvdmlkZWQgc28gdGhhdCBpbnN0cnVjdGlvbiBjYXRlZ29yeSB0ZXN0aW5nCisvLy8gY2FuIGJlIHBlcmZvcm1lZCB3aXRoIGNvZGUgbGlrZToKKy8vLworLy8vIGlmIChpc2E8Q2FzdEluc3Q+KEluc3RyKSkgeyAuLi4gfQorLy8vIEBicmllZiBCYXNlIGNsYXNzIG9mIGNhc3RpbmcgaW5zdHJ1Y3Rpb25zLgorY2xhc3MgQ2FzdEluc3QgOiBwdWJsaWMgVW5hcnlJbnN0cnVjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIC8vLyBAYnJpZWYgQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYmVmb3JlLWluc3RydWN0aW9uIHNlbWFudGljcyBmb3Igc3ViY2xhc3NlcworICBDYXN0SW5zdChUeXBlICpUeSwgdW5zaWduZWQgaVR5cGUsIFZhbHVlICpTLAorICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikKKyAgICA6IFVuYXJ5SW5zdHJ1Y3Rpb24oVHksIGlUeXBlLCBTLCBJbnNlcnRCZWZvcmUpIHsKKyAgICBzZXROYW1lKE5hbWVTdHIpOworICB9CisgIC8vLyBAYnJpZWYgQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYXQtZW5kLW9mLWJsb2NrIHNlbWFudGljcyBmb3Igc3ViY2xhc3NlcworICBDYXN0SW5zdChUeXBlICpUeSwgdW5zaWduZWQgaVR5cGUsIFZhbHVlICpTLAorICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpCisgICAgOiBVbmFyeUluc3RydWN0aW9uKFR5LCBpVHlwZSwgUywgSW5zZXJ0QXRFbmQpIHsKKyAgICBzZXROYW1lKE5hbWVTdHIpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFByb3ZpZGVzIGEgd2F5IHRvIGNvbnN0cnVjdCBhbnkgb2YgdGhlIENhc3RJbnN0IHN1YmNsYXNzZXMgdXNpbmcgYW4KKyAgLy8vIG9wY29kZSBpbnN0ZWFkIG9mIHRoZSBzdWJjbGFzcydzIGNvbnN0cnVjdG9yLiBUaGUgb3Bjb2RlIG11c3QgYmUgaW4gdGhlCisgIC8vLyBDYXN0T3BzIGNhdGVnb3J5IChJbnN0cnVjdGlvbjo6aXNDYXN0KG9wY29kZSkgcmV0dXJucyB0cnVlKS4gVGhpcworICAvLy8gY29uc3RydWN0b3IgaGFzIGluc2VydC1iZWZvcmUtaW5zdHJ1Y3Rpb24gc2VtYW50aWNzIHRvIGF1dG9tYXRpY2FsbHkKKyAgLy8vIGluc2VydCB0aGUgbmV3IENhc3RJbnN0IGJlZm9yZSBJbnNlcnRCZWZvcmUgKGlmIGl0IGlzIG5vbi1udWxsKS4KKyAgLy8vIEBicmllZiBDb25zdHJ1Y3QgYW55IG9mIHRoZSBDYXN0SW5zdCBzdWJjbGFzc2VzCisgIHN0YXRpYyBDYXN0SW5zdCAqQ3JlYXRlKAorICAgIEluc3RydWN0aW9uOjpDYXN0T3BzLCAgICAvLy88IFRoZSBvcGNvZGUgb2YgdGhlIGNhc3QgaW5zdHJ1Y3Rpb24KKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY2FzdGVkIChvcGVyYW5kIDApCisgICAgVHlwZSAqVHksICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gd2hpY2ggY2FzdCBzaG91bGQgYmUgbWFkZQorICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsIC8vLzwgTmFtZSBmb3IgdGhlIGluc3RydWN0aW9uCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIgLy8vPCBQbGFjZSB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uCisgICk7CisgIC8vLyBQcm92aWRlcyBhIHdheSB0byBjb25zdHJ1Y3QgYW55IG9mIHRoZSBDYXN0SW5zdCBzdWJjbGFzc2VzIHVzaW5nIGFuCisgIC8vLyBvcGNvZGUgaW5zdGVhZCBvZiB0aGUgc3ViY2xhc3MncyBjb25zdHJ1Y3Rvci4gVGhlIG9wY29kZSBtdXN0IGJlIGluIHRoZQorICAvLy8gQ2FzdE9wcyBjYXRlZ29yeS4gVGhpcyBjb25zdHJ1Y3RvciBoYXMgaW5zZXJ0LWF0LWVuZC1vZi1ibG9jayBzZW1hbnRpY3MKKyAgLy8vIHRvIGF1dG9tYXRpY2FsbHkgaW5zZXJ0IHRoZSBuZXcgQ2FzdEluc3QgYXQgdGhlIGVuZCBvZiBJbnNlcnRBdEVuZCAoaWYKKyAgLy8vIGl0cyBub24tbnVsbCkuCisgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGFueSBvZiB0aGUgQ2FzdEluc3Qgc3ViY2xhc3NlcworICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZSgKKyAgICBJbnN0cnVjdGlvbjo6Q2FzdE9wcywgICAgLy8vPCBUaGUgb3Bjb2RlIGZvciB0aGUgY2FzdCBpbnN0cnVjdGlvbgorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjYXN0ZWQgKG9wZXJhbmQgMCkKKyAgICBUeXBlICpUeSwgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byB3aGljaCBvcGVyYW5kIGlzIGNhc3RlZAorICAgIGNvbnN0IFR3aW5lICZOYW1lLCAvLy88IFRoZSBuYW1lIGZvciB0aGUgaW5zdHJ1Y3Rpb24KKyAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBaRXh0IG9yIEJpdENhc3QgY2FzdCBpbnN0cnVjdGlvbgorICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZVpFeHRPckJpdENhc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNhc3RlZCAob3BlcmFuZCAwKQorICAgIFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHdoaWNoIGNhc3Qgc2hvdWxkIGJlIG1hZGUKKyAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiLCAvLy88IE5hbWUgZm9yIHRoZSBpbnN0cnVjdGlvbgorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyIC8vLzwgUGxhY2UgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgWkV4dCBvciBCaXRDYXN0IGNhc3QgaW5zdHJ1Y3Rpb24KKyAgc3RhdGljIENhc3RJbnN0ICpDcmVhdGVaRXh0T3JCaXRDYXN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjYXN0ZWQgKG9wZXJhbmQgMCkKKyAgICBUeXBlICpUeSwgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byB3aGljaCBvcGVyYW5kIGlzIGNhc3RlZAorICAgIGNvbnN0IFR3aW5lICZOYW1lLCAvLy88IFRoZSBuYW1lIGZvciB0aGUgaW5zdHJ1Y3Rpb24KKyAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBTRXh0IG9yIEJpdENhc3QgY2FzdCBpbnN0cnVjdGlvbgorICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZVNFeHRPckJpdENhc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNhc3RlZCAob3BlcmFuZCAwKQorICAgIFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHdoaWNoIGNhc3Qgc2hvdWxkIGJlIG1hZGUKKyAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiLCAvLy88IE5hbWUgZm9yIHRoZSBpbnN0cnVjdGlvbgorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyIC8vLzwgUGxhY2UgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgU0V4dCBvciBCaXRDYXN0IGNhc3QgaW5zdHJ1Y3Rpb24KKyAgc3RhdGljIENhc3RJbnN0ICpDcmVhdGVTRXh0T3JCaXRDYXN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjYXN0ZWQgKG9wZXJhbmQgMCkKKyAgICBUeXBlICpUeSwgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byB3aGljaCBvcGVyYW5kIGlzIGNhc3RlZAorICAgIGNvbnN0IFR3aW5lICZOYW1lLCAvLy88IFRoZSBuYW1lIGZvciB0aGUgaW5zdHJ1Y3Rpb24KKyAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBCaXRDYXN0IEFkZHJTcGFjZUNhc3QsIG9yIGEgUHRyVG9JbnQgY2FzdCBpbnN0cnVjdGlvbi4KKyAgc3RhdGljIENhc3RJbnN0ICpDcmVhdGVQb2ludGVyQ2FzdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgLy8vPCBUaGUgcG9pbnRlciB2YWx1ZSB0byBiZSBjYXN0ZWQgKG9wZXJhbmQgMCkKKyAgICBUeXBlICpUeSwgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byB3aGljaCBvcGVyYW5kIGlzIGNhc3RlZAorICAgIGNvbnN0IFR3aW5lICZOYW1lLCAvLy88IFRoZSBuYW1lIGZvciB0aGUgaW5zdHJ1Y3Rpb24KKyAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBCaXRDYXN0LCBBZGRyU3BhY2VDYXN0IG9yIGEgUHRyVG9JbnQgY2FzdCBpbnN0cnVjdGlvbi4KKyAgc3RhdGljIENhc3RJbnN0ICpDcmVhdGVQb2ludGVyQ2FzdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgLy8vPCBUaGUgcG9pbnRlciB2YWx1ZSB0byBiZSBjYXN0ZWQgKG9wZXJhbmQgMCkKKyAgICBUeXBlICpUeSwgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byB3aGljaCBjYXN0IHNob3VsZCBiZSBtYWRlCisgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwgLy8vPCBOYW1lIGZvciB0aGUgaW5zdHJ1Y3Rpb24KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0ciAvLy88IFBsYWNlIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24KKyAgKTsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIEJpdENhc3Qgb3IgYW4gQWRkclNwYWNlQ2FzdCBjYXN0IGluc3RydWN0aW9uLgorICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZVBvaW50ZXJCaXRDYXN0T3JBZGRyU3BhY2VDYXN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAvLy88IFRoZSBwb2ludGVyIHZhbHVlIHRvIGJlIGNhc3RlZCAob3BlcmFuZCAwKQorICAgIFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHdoaWNoIG9wZXJhbmQgaXMgY2FzdGVkCisgICAgY29uc3QgVHdpbmUgJk5hbWUsIC8vLzwgVGhlIG5hbWUgZm9yIHRoZSBpbnN0cnVjdGlvbgorICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAvLy88IFRoZSBibG9jayB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uIGludG8KKyAgKTsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIEJpdENhc3Qgb3IgYW4gQWRkclNwYWNlQ2FzdCBjYXN0IGluc3RydWN0aW9uLgorICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZVBvaW50ZXJCaXRDYXN0T3JBZGRyU3BhY2VDYXN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAvLy88IFRoZSBwb2ludGVyIHZhbHVlIHRvIGJlIGNhc3RlZCAob3BlcmFuZCAwKQorICAgIFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHdoaWNoIGNhc3Qgc2hvdWxkIGJlIG1hZGUKKyAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiLCAvLy88IE5hbWUgZm9yIHRoZSBpbnN0cnVjdGlvbgorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyIC8vLzwgUGxhY2UgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgQml0Q2FzdCwgYSBQdHJUb0ludCwgb3IgYW4gSW50VG9QVHIgY2FzdCBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBJZiB0aGUgdmFsdWUgaXMgYSBwb2ludGVyIHR5cGUgYW5kIHRoZSBkZXN0aW5hdGlvbiBhbiBpbnRlZ2VyIHR5cGUsCisgIC8vLyBjcmVhdGVzIGEgUHRyVG9JbnQgY2FzdC4gSWYgdGhlIHZhbHVlIGlzIGFuIGludGVnZXIgdHlwZSBhbmQgdGhlCisgIC8vLyBkZXN0aW5hdGlvbiBhIHBvaW50ZXIgdHlwZSwgY3JlYXRlcyBhbiBJbnRUb1B0ciBjYXN0LiBPdGhlcndpc2UsIGNyZWF0ZXMKKyAgLy8vIGEgYml0Y2FzdC4KKyAgc3RhdGljIENhc3RJbnN0ICpDcmVhdGVCaXRPclBvaW50ZXJDYXN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAvLy88IFRoZSBwb2ludGVyIHZhbHVlIHRvIGJlIGNhc3RlZCAob3BlcmFuZCAwKQorICAgIFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHdoaWNoIGNhc3Qgc2hvdWxkIGJlIG1hZGUKKyAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiLCAvLy88IE5hbWUgZm9yIHRoZSBpbnN0cnVjdGlvbgorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyIC8vLzwgUGxhY2UgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgWkV4dCwgQml0Q2FzdCwgb3IgVHJ1bmMgZm9yIGludCAtPiBpbnQgY2FzdHMuCisgIHN0YXRpYyBDYXN0SW5zdCAqQ3JlYXRlSW50ZWdlckNhc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIHBvaW50ZXIgdmFsdWUgdG8gYmUgY2FzdGVkIChvcGVyYW5kIDApCisgICAgVHlwZSAqVHksICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gd2hpY2ggY2FzdCBzaG91bGQgYmUgbWFkZQorICAgIGJvb2wgaXNTaWduZWQsICAgICAgICAgICAvLy88IFdoZXRoZXIgdG8gcmVnYXJkIFMgYXMgc2lnbmVkIG9yIG5vdAorICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsIC8vLzwgTmFtZSBmb3IgdGhlIGluc3RydWN0aW9uCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIgLy8vPCBQbGFjZSB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBaRXh0LCBCaXRDYXN0LCBvciBUcnVuYyBmb3IgaW50IC0+IGludCBjYXN0cy4KKyAgc3RhdGljIENhc3RJbnN0ICpDcmVhdGVJbnRlZ2VyQ2FzdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgLy8vPCBUaGUgaW50ZWdlciB2YWx1ZSB0byBiZSBjYXN0ZWQgKG9wZXJhbmQgMCkKKyAgICBUeXBlICpUeSwgICAgICAgICAgLy8vPCBUaGUgaW50ZWdlciB0eXBlIHRvIHdoaWNoIG9wZXJhbmQgaXMgY2FzdGVkCisgICAgYm9vbCBpc1NpZ25lZCwgICAgICAgICAgIC8vLzwgV2hldGhlciB0byByZWdhcmQgUyBhcyBzaWduZWQgb3Igbm90CisgICAgY29uc3QgVHdpbmUgJk5hbWUsIC8vLzwgVGhlIG5hbWUgZm9yIHRoZSBpbnN0cnVjdGlvbgorICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAvLy88IFRoZSBibG9jayB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uIGludG8KKyAgKTsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhbiBGUEV4dCwgQml0Q2FzdCwgb3IgRlBUcnVuYyBmb3IgZnAgLT4gZnAgY2FzdHMKKyAgc3RhdGljIENhc3RJbnN0ICpDcmVhdGVGUENhc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIGZsb2F0aW5nIHBvaW50IHZhbHVlIHRvIGJlIGNhc3RlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSBmbG9hdGluZyBwb2ludCB0eXBlIHRvIGNhc3QgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiLCAvLy88IE5hbWUgZm9yIHRoZSBpbnN0cnVjdGlvbgorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyIC8vLzwgUGxhY2UgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGFuIEZQRXh0LCBCaXRDYXN0LCBvciBGUFRydW5jIGZvciBmcCAtPiBmcCBjYXN0cworICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZUZQQ2FzdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgLy8vPCBUaGUgZmxvYXRpbmcgcG9pbnQgdmFsdWUgdG8gYmUgY2FzdGVkCisgICAgVHlwZSAqVHksICAgICAgICAgIC8vLzwgVGhlIGZsb2F0aW5nIHBvaW50IHR5cGUgdG8gY2FzdCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lLCAvLy88IFRoZSBuYW1lIGZvciB0aGUgaW5zdHJ1Y3Rpb24KKyAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBUcnVuYyBvciBCaXRDYXN0IGNhc3QgaW5zdHJ1Y3Rpb24KKyAgc3RhdGljIENhc3RJbnN0ICpDcmVhdGVUcnVuY09yQml0Q2FzdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY2FzdGVkIChvcGVyYW5kIDApCisgICAgVHlwZSAqVHksICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gd2hpY2ggY2FzdCBzaG91bGQgYmUgbWFkZQorICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsIC8vLzwgTmFtZSBmb3IgdGhlIGluc3RydWN0aW9uCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIgLy8vPCBQbGFjZSB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBUcnVuYyBvciBCaXRDYXN0IGNhc3QgaW5zdHJ1Y3Rpb24KKyAgc3RhdGljIENhc3RJbnN0ICpDcmVhdGVUcnVuY09yQml0Q2FzdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY2FzdGVkIChvcGVyYW5kIDApCisgICAgVHlwZSAqVHksICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gd2hpY2ggb3BlcmFuZCBpcyBjYXN0ZWQKKyAgICBjb25zdCBUd2luZSAmTmFtZSwgLy8vPCBUaGUgbmFtZSBmb3IgdGhlIGluc3RydWN0aW9uCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgIC8vLzwgVGhlIGJsb2NrIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50bworICApOworCisgIC8vLyBAYnJpZWYgQ2hlY2sgd2hldGhlciBpdCBpcyB2YWxpZCB0byBjYWxsIGdldENhc3RPcGNvZGUgZm9yIHRoZXNlIHR5cGVzLgorICBzdGF0aWMgYm9vbCBpc0Nhc3RhYmxlKAorICAgIFR5cGUgKlNyY1R5LCAvLy88IFRoZSBUeXBlIGZyb20gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSBjYXN0LgorICAgIFR5cGUgKkRlc3RUeSAvLy88IFRoZSBUeXBlIHRvIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgY2FzdC4KKyAgKTsKKworICAvLy8gQGJyaWVmIENoZWNrIHdoZXRoZXIgYSBiaXRjYXN0IGJldHdlZW4gdGhlc2UgdHlwZXMgaXMgdmFsaWQKKyAgc3RhdGljIGJvb2wgaXNCaXRDYXN0YWJsZSgKKyAgICBUeXBlICpTcmNUeSwgLy8vPCBUaGUgVHlwZSBmcm9tIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgY2FzdC4KKyAgICBUeXBlICpEZXN0VHkgLy8vPCBUaGUgVHlwZSB0byB3aGljaCB0aGUgdmFsdWUgc2hvdWxkIGJlIGNhc3QuCisgICk7CisKKyAgLy8vIEBicmllZiBDaGVjayB3aGV0aGVyIGEgYml0Y2FzdCwgaW50dG9wdHIsIG9yIHB0cnRvaW50IGNhc3QgYmV0d2VlbiB0aGVzZQorICAvLy8gdHlwZXMgaXMgdmFsaWQgYW5kIGEgbm8tb3AuCisgIC8vLworICAvLy8gVGhpcyBlbnN1cmVzIHRoYXQgYW55IHBvaW50ZXI8LT5pbnRlZ2VyIGNhc3QgaGFzIGVub3VnaCBiaXRzIGluIHRoZQorICAvLy8gaW50ZWdlciBhbmQgYW55IG90aGVyIGNhc3QgaXMgYSBiaXRjYXN0LgorICBzdGF0aWMgYm9vbCBpc0JpdE9yTm9vcFBvaW50ZXJDYXN0YWJsZSgKKyAgICAgIFR5cGUgKlNyY1R5LCAgLy8vPCBUaGUgVHlwZSBmcm9tIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgY2FzdC4KKyAgICAgIFR5cGUgKkRlc3RUeSwgLy8vPCBUaGUgVHlwZSB0byB3aGljaCB0aGUgdmFsdWUgc2hvdWxkIGJlIGNhc3QuCisgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisKKyAgLy8vIFJldHVybnMgdGhlIG9wY29kZSBuZWNlc3NhcnkgdG8gY2FzdCBWYWwgaW50byBUeSB1c2luZyB1c3VhbCBjYXN0aW5nCisgIC8vLyBydWxlcy4KKyAgLy8vIEBicmllZiBJbmZlciB0aGUgb3Bjb2RlIGZvciBjYXN0IG9wZXJhbmQgYW5kIHR5cGUKKyAgc3RhdGljIEluc3RydWN0aW9uOjpDYXN0T3BzIGdldENhc3RPcGNvZGUoCisgICAgY29uc3QgVmFsdWUgKlZhbCwgLy8vPCBUaGUgdmFsdWUgdG8gY2FzdAorICAgIGJvb2wgU3JjSXNTaWduZWQsIC8vLzwgV2hldGhlciB0byB0cmVhdCB0aGUgc291cmNlIGFzIHNpZ25lZAorICAgIFR5cGUgKlR5LCAgIC8vLzwgVGhlIFR5cGUgdG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSBjYXN0ZWQKKyAgICBib29sIERzdElzU2lnbmVkICAvLy88IFdoZXRoZXIgdG8gdHJlYXRlIHRoZSBkZXN0LiBhcyBzaWduZWQKKyAgKTsKKworICAvLy8gVGhlcmUgYXJlIHNldmVyYWwgcGxhY2VzIHdoZXJlIHdlIG5lZWQgdG8ga25vdyBpZiBhIGNhc3QgaW5zdHJ1Y3Rpb24KKyAgLy8vIG9ubHkgZGVhbHMgd2l0aCBpbnRlZ2VyIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gdHlwZXMuIFRvIHNpbXBsaWZ5IHRoYXQKKyAgLy8vIGxvZ2ljLCB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZC4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWZmIHRoZSBjYXN0IGhhcyBvbmx5IGludGVncmFsIHR5cGVkIG9wZXJhbmQgYW5kIGRlc3QgdHlwZS4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhbiBpbnRlZ2VyLW9ubHkgY2FzdC4KKyAgYm9vbCBpc0ludGVnZXJDYXN0KCkgY29uc3Q7CisKKyAgLy8vIEEgbG9zc2xlc3MgY2FzdCBpcyBvbmUgdGhhdCBkb2VzIG5vdCBhbHRlciB0aGUgYmFzaWMgdmFsdWUuIEl0IGltcGxpZXMKKyAgLy8vIGEgbm8tb3AgY2FzdCBidXQgaXMgbW9yZSBzdHJpbmdlbnQsIHByZXZlbnRpbmcgdGhpbmdzIGxpa2UgaW50LT5mbG9hdCwKKyAgLy8vIGxvbmctPmRvdWJsZSwgb3IgaW50LT5wdHIuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmZiB0aGUgY2FzdCBpcyBsb3NzbGVzcy4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhIGxvc3NsZXNzIGNhc3QuCisgIGJvb2wgaXNMb3NzbGVzc0Nhc3QoKSBjb25zdDsKKworICAvLy8gQSBuby1vcCBjYXN0IGlzIG9uZSB0aGF0IGNhbiBiZSBlZmZlY3RlZCB3aXRob3V0IGNoYW5naW5nIGFueSBiaXRzLgorICAvLy8gSXQgaW1wbGllcyB0aGF0IHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHR5cGVzIGFyZSB0aGUgc2FtZSBzaXplLiBUaGUKKyAgLy8vIERhdGFMYXlvdXQgYXJndW1lbnQgaXMgdG8gZGV0ZXJtaW5lIHRoZSBwb2ludGVyIHNpemUgd2hlbiBleGFtaW5pbmcgY2FzdHMKKyAgLy8vIGludm9sdmluZyBJbnRlZ2VyIGFuZCBQb2ludGVyIHR5cGVzLiBUaGV5IGFyZSBuby1vcCBjYXN0cyBpZiB0aGUgaW50ZWdlcgorICAvLy8gaXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgcG9pbnRlci4gSG93ZXZlciwgcG9pbnRlciBzaXplIHZhcmllcyB3aXRoCisgIC8vLyBwbGF0Zm9ybS4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIGRlc2NyaWJlZCBjYXN0IGlzIGEgbm8tb3AgY2FzdC4KKyAgc3RhdGljIGJvb2wgaXNOb29wQ2FzdCgKKyAgICBJbnN0cnVjdGlvbjo6Q2FzdE9wcyBPcGNvZGUsIC8vLzwgT3Bjb2RlIG9mIGNhc3QKKyAgICBUeXBlICpTcmNUeSwgICAgICAgICAvLy88IFNyY1R5IG9mIGNhc3QKKyAgICBUeXBlICpEc3RUeSwgICAgICAgICAvLy88IERzdFR5IG9mIGNhc3QKKyAgICBjb25zdCBEYXRhTGF5b3V0ICZETCAvLy88IERhdGFMYXlvdXQgdG8gZ2V0IHRoZSBJbnQgUHRyIHR5cGUgZnJvbS4KKyAgKTsKKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIGNhc3QgaXMgYSBuby1vcCBjYXN0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBETCBpcyB0aGUgRGF0YUxheW91dCB0byBkZXRlcm1pbmUgcG9pbnRlciBzaXplLgorICBib29sIGlzTm9vcENhc3QoY29uc3QgRGF0YUxheW91dCAmREwpIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgaG93IGEgcGFpciBvZiBjYXN0cyBjYW4gYmUgZWxpbWluYXRlZCwgaWYgdGhleSBjYW4gYmUgYXQgYWxsLgorICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgYm90aCBDYXN0SW5zdCBhbmQgQ29uc3RhbnRFeHByLgorICAvLy8gQHJldHVybnMgMCBpZiB0aGUgQ2FzdEluc3QgcGFpciBjYW4ndCBiZSBlbGltaW5hdGVkLCBvdGhlcndpc2UKKyAgLy8vIHJldHVybnMgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgdmFsdWUgZm9yIGEgY2FzdCB0aGF0IGNhbiByZXBsYWNlCisgIC8vLyB0aGUgcGFpciwgY2FzdGluZyBTcmNUeSB0byBEc3RUeS4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgYSBjYXN0IHBhaXIgaXMgZWxpbWluYWJsZQorICBzdGF0aWMgdW5zaWduZWQgaXNFbGltaW5hYmxlQ2FzdFBhaXIoCisgICAgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgZmlyc3RPcGNvZGUsICAvLy88IE9wY29kZSBvZiBmaXJzdCBjYXN0CisgICAgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgc2Vjb25kT3Bjb2RlLCAvLy88IE9wY29kZSBvZiBzZWNvbmQgY2FzdAorICAgIFR5cGUgKlNyY1R5LCAvLy88IFNyY1R5IG9mIDFzdCBjYXN0CisgICAgVHlwZSAqTWlkVHksIC8vLzwgRHN0VHkgb2YgMXN0IGNhc3QgJiBTcmNUeSBvZiAybmQgY2FzdAorICAgIFR5cGUgKkRzdFR5LCAvLy88IERzdFR5IG9mIDJuZCBjYXN0CisgICAgVHlwZSAqU3JjSW50UHRyVHksIC8vLzwgSW50ZWdlciB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gUHRyIFNyY1R5LCBvciBudWxsCisgICAgVHlwZSAqTWlkSW50UHRyVHksIC8vLzwgSW50ZWdlciB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gUHRyIE1pZFR5LCBvciBudWxsCisgICAgVHlwZSAqRHN0SW50UHRyVHkgIC8vLzwgSW50ZWdlciB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gUHRyIERzdFR5LCBvciBudWxsCisgICk7CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIG9wY29kZSBvZiB0aGlzIENhc3RJbnN0CisgIEluc3RydWN0aW9uOjpDYXN0T3BzIGdldE9wY29kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5zdHJ1Y3Rpb246OkNhc3RPcHMoSW5zdHJ1Y3Rpb246OmdldE9wY29kZSgpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBzb3VyY2UgdHlwZSwgYXMgYSBjb252ZW5pZW5jZQorICBUeXBlKiBnZXRTcmNUeSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMCktPmdldFR5cGUoKTsgfQorICAvLy8gQGJyaWVmIFJldHVybiB0aGUgZGVzdGluYXRpb24gdHlwZSwgYXMgYSBjb252ZW5pZW5jZQorICBUeXBlKiBnZXREZXN0VHkoKSBjb25zdCB7IHJldHVybiBnZXRUeXBlKCk7IH0KKworICAvLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgY2FzdCBmcm9tIFMgdG8gRHN0VHkgdXNpbmcKKyAgLy8vIE9wY29kZSBvcCBpcyB2YWxpZCBvciBub3QuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmZiB0aGUgcHJvcG9zZWQgY2FzdCBpcyB2YWxpZC4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgYSBjYXN0IGlzIHZhbGlkIHdpdGhvdXQgY3JlYXRpbmcgb25lLgorICBzdGF0aWMgYm9vbCBjYXN0SXNWYWxpZChJbnN0cnVjdGlvbjo6Q2FzdE9wcyBvcCwgVmFsdWUgKlMsIFR5cGUgKkRzdFR5KTsKKworICAvLy8gQGJyaWVmIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+aXNDYXN0KCk7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgY2xhc3MgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIHRoZSBjb21wYXJpc29uIGluc3RydWN0aW9ucy4KKy8vLyBAYnJpZWYgQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBjb21wYXJpc29uIGluc3RydWN0aW9ucy4KK2NsYXNzIENtcEluc3QgOiBwdWJsaWMgSW5zdHJ1Y3Rpb24geworcHVibGljOgorICAvLy8gVGhpcyBlbnVtZXJhdGlvbiBsaXN0cyB0aGUgcG9zc2libGUgcHJlZGljYXRlcyBmb3IgQ21wSW5zdCBzdWJjbGFzc2VzLgorICAvLy8gVmFsdWVzIGluIHRoZSByYW5nZSAwLTMxIGFyZSByZXNlcnZlZCBmb3IgRkNtcEluc3QsIHdoaWxlIHZhbHVlcyBpbiB0aGUKKyAgLy8vIHJhbmdlIDMyLTY0IGFyZSByZXNlcnZlZCBmb3IgSUNtcEluc3QuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUKKyAgLy8vIHByZWRpY2F0ZSB2YWx1ZXMgYXJlIG5vdCBvdmVybGFwcGluZyBiZXR3ZWVuIHRoZSBjbGFzc2VzLgorICAvLy8KKyAgLy8vIFNvbWUgcGFzc2VzIChlLmcuIEluc3RDb21iaW5lKSBkZXBlbmQgb24gdGhlIGJpdC13aXNlIGNoYXJhY3RlcmlzdGljcyBvZgorICAvLy8gRkNNUF8qIHZhbHVlcy4gQ2hhbmdpbmcgdGhlIGJpdCBwYXR0ZXJucyByZXF1aXJlcyBhIHBvdGVudGlhbCBjaGFuZ2UgdG8KKyAgLy8vIHRob3NlIHBhc3Nlcy4KKyAgZW51bSBQcmVkaWNhdGUgeworICAgIC8vIE9wY29kZSAgICAgICAgICAgICAgVSBMIEcgRSAgICBJbnR1aXRpdmUgb3BlcmF0aW9uCisgICAgRkNNUF9GQUxTRSA9ICAwLCAgLy8vPCAwIDAgMCAwICAgIEFsd2F5cyBmYWxzZSAoYWx3YXlzIGZvbGRlZCkKKyAgICBGQ01QX09FUSAgID0gIDEsICAvLy88IDAgMCAwIDEgICAgVHJ1ZSBpZiBvcmRlcmVkIGFuZCBlcXVhbAorICAgIEZDTVBfT0dUICAgPSAgMiwgIC8vLzwgMCAwIDEgMCAgICBUcnVlIGlmIG9yZGVyZWQgYW5kIGdyZWF0ZXIgdGhhbgorICAgIEZDTVBfT0dFICAgPSAgMywgIC8vLzwgMCAwIDEgMSAgICBUcnVlIGlmIG9yZGVyZWQgYW5kIGdyZWF0ZXIgdGhhbiBvciBlcXVhbAorICAgIEZDTVBfT0xUICAgPSAgNCwgIC8vLzwgMCAxIDAgMCAgICBUcnVlIGlmIG9yZGVyZWQgYW5kIGxlc3MgdGhhbgorICAgIEZDTVBfT0xFICAgPSAgNSwgIC8vLzwgMCAxIDAgMSAgICBUcnVlIGlmIG9yZGVyZWQgYW5kIGxlc3MgdGhhbiBvciBlcXVhbAorICAgIEZDTVBfT05FICAgPSAgNiwgIC8vLzwgMCAxIDEgMCAgICBUcnVlIGlmIG9yZGVyZWQgYW5kIG9wZXJhbmRzIGFyZSB1bmVxdWFsCisgICAgRkNNUF9PUkQgICA9ICA3LCAgLy8vPCAwIDEgMSAxICAgIFRydWUgaWYgb3JkZXJlZCAobm8gbmFucykKKyAgICBGQ01QX1VOTyAgID0gIDgsICAvLy88IDEgMCAwIDAgICAgVHJ1ZSBpZiB1bm9yZGVyZWQ6IGlzbmFuKFgpIHwgaXNuYW4oWSkKKyAgICBGQ01QX1VFUSAgID0gIDksICAvLy88IDEgMCAwIDEgICAgVHJ1ZSBpZiB1bm9yZGVyZWQgb3IgZXF1YWwKKyAgICBGQ01QX1VHVCAgID0gMTAsICAvLy88IDEgMCAxIDAgICAgVHJ1ZSBpZiB1bm9yZGVyZWQgb3IgZ3JlYXRlciB0aGFuCisgICAgRkNNUF9VR0UgICA9IDExLCAgLy8vPCAxIDAgMSAxICAgIFRydWUgaWYgdW5vcmRlcmVkLCBncmVhdGVyIHRoYW4sIG9yIGVxdWFsCisgICAgRkNNUF9VTFQgICA9IDEyLCAgLy8vPCAxIDEgMCAwICAgIFRydWUgaWYgdW5vcmRlcmVkIG9yIGxlc3MgdGhhbgorICAgIEZDTVBfVUxFICAgPSAxMywgIC8vLzwgMSAxIDAgMSAgICBUcnVlIGlmIHVub3JkZXJlZCwgbGVzcyB0aGFuLCBvciBlcXVhbAorICAgIEZDTVBfVU5FICAgPSAxNCwgIC8vLzwgMSAxIDEgMCAgICBUcnVlIGlmIHVub3JkZXJlZCBvciBub3QgZXF1YWwKKyAgICBGQ01QX1RSVUUgID0gMTUsICAvLy88IDEgMSAxIDEgICAgQWx3YXlzIHRydWUgKGFsd2F5cyBmb2xkZWQpCisgICAgRklSU1RfRkNNUF9QUkVESUNBVEUgPSBGQ01QX0ZBTFNFLAorICAgIExBU1RfRkNNUF9QUkVESUNBVEUgPSBGQ01QX1RSVUUsCisgICAgQkFEX0ZDTVBfUFJFRElDQVRFID0gRkNNUF9UUlVFICsgMSwKKyAgICBJQ01QX0VRICAgID0gMzIsICAvLy88IGVxdWFsCisgICAgSUNNUF9ORSAgICA9IDMzLCAgLy8vPCBub3QgZXF1YWwKKyAgICBJQ01QX1VHVCAgID0gMzQsICAvLy88IHVuc2lnbmVkIGdyZWF0ZXIgdGhhbgorICAgIElDTVBfVUdFICAgPSAzNSwgIC8vLzwgdW5zaWduZWQgZ3JlYXRlciBvciBlcXVhbAorICAgIElDTVBfVUxUICAgPSAzNiwgIC8vLzwgdW5zaWduZWQgbGVzcyB0aGFuCisgICAgSUNNUF9VTEUgICA9IDM3LCAgLy8vPCB1bnNpZ25lZCBsZXNzIG9yIGVxdWFsCisgICAgSUNNUF9TR1QgICA9IDM4LCAgLy8vPCBzaWduZWQgZ3JlYXRlciB0aGFuCisgICAgSUNNUF9TR0UgICA9IDM5LCAgLy8vPCBzaWduZWQgZ3JlYXRlciBvciBlcXVhbAorICAgIElDTVBfU0xUICAgPSA0MCwgIC8vLzwgc2lnbmVkIGxlc3MgdGhhbgorICAgIElDTVBfU0xFICAgPSA0MSwgIC8vLzwgc2lnbmVkIGxlc3Mgb3IgZXF1YWwKKyAgICBGSVJTVF9JQ01QX1BSRURJQ0FURSA9IElDTVBfRVEsCisgICAgTEFTVF9JQ01QX1BSRURJQ0FURSA9IElDTVBfU0xFLAorICAgIEJBRF9JQ01QX1BSRURJQ0FURSA9IElDTVBfU0xFICsgMQorICB9OworCitwcm90ZWN0ZWQ6CisgIENtcEluc3QoVHlwZSAqdHksIEluc3RydWN0aW9uOjpPdGhlck9wcyBvcCwgUHJlZGljYXRlIHByZWQsCisgICAgICAgICAgVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisKKyAgQ21wSW5zdChUeXBlICp0eSwgSW5zdHJ1Y3Rpb246Ok90aGVyT3BzIG9wLCBQcmVkaWNhdGUgcHJlZCwKKyAgICAgICAgICBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSwKKyAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKK3B1YmxpYzoKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgdHdvIG9wZXJhbmRzCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMik7CisgIH0KKworICAvLy8gQ29uc3RydWN0IGEgY29tcGFyZSBpbnN0cnVjdGlvbiwgZ2l2ZW4gdGhlIG9wY29kZSwgdGhlIHByZWRpY2F0ZSBhbmQKKyAgLy8vIHRoZSB0d28gb3BlcmFuZHMuICBPcHRpb25hbGx5IChpZiBJbnN0QmVmb3JlIGlzIHNwZWNpZmllZCkgaW5zZXJ0IHRoZQorICAvLy8gaW5zdHJ1Y3Rpb24gaW50byBhIEJhc2ljQmxvY2sgcmlnaHQgYmVmb3JlIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCisgIC8vLyBUaGUgc3BlY2lmaWVkIEluc3RydWN0aW9uIGlzIGFsbG93ZWQgdG8gYmUgYSBkZXJlZmVyZW5jZWQgZW5kIGl0ZXJhdG9yLgorICAvLy8gQGJyaWVmIENyZWF0ZSBhIENtcEluc3QKKyAgc3RhdGljIENtcEluc3QgKkNyZWF0ZShPdGhlck9wcyBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkaWNhdGUgcHJlZGljYXRlLCBWYWx1ZSAqUzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKlMyLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKworICAvLy8gQ29uc3RydWN0IGEgY29tcGFyZSBpbnN0cnVjdGlvbiwgZ2l2ZW4gdGhlIG9wY29kZSwgdGhlIHByZWRpY2F0ZSBhbmQgdGhlCisgIC8vLyB0d28gb3BlcmFuZHMuICBBbHNvIGF1dG9tYXRpY2FsbHkgaW5zZXJ0IHRoaXMgaW5zdHJ1Y3Rpb24gdG8gdGhlIGVuZCBvZgorICAvLy8gdGhlIEJhc2ljQmxvY2sgc3BlY2lmaWVkLgorICAvLy8gQGJyaWVmIENyZWF0ZSBhIENtcEluc3QKKyAgc3RhdGljIENtcEluc3QgKkNyZWF0ZShPdGhlck9wcyBPcCwgUHJlZGljYXRlIHByZWRpY2F0ZSwgVmFsdWUgKlMxLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpTMiwgY29uc3QgVHdpbmUgJk5hbWUsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICAvLy8gQGJyaWVmIEdldCB0aGUgb3Bjb2RlIGNhc3RlZCB0byB0aGUgcmlnaHQgdHlwZQorICBPdGhlck9wcyBnZXRPcGNvZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE90aGVyT3BzPihJbnN0cnVjdGlvbjo6Z2V0T3Bjb2RlKCkpOworICB9CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIHByZWRpY2F0ZSBmb3IgdGhpcyBpbnN0cnVjdGlvbi4KKyAgUHJlZGljYXRlIGdldFByZWRpY2F0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZGljYXRlKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgU2V0IHRoZSBwcmVkaWNhdGUgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24gdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgdm9pZCBzZXRQcmVkaWNhdGUoUHJlZGljYXRlIFApIHsgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoUCk7IH0KKworICBzdGF0aWMgYm9vbCBpc0ZQUHJlZGljYXRlKFByZWRpY2F0ZSBQKSB7CisgICAgcmV0dXJuIFAgPj0gRklSU1RfRkNNUF9QUkVESUNBVEUgJiYgUCA8PSBMQVNUX0ZDTVBfUFJFRElDQVRFOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNJbnRQcmVkaWNhdGUoUHJlZGljYXRlIFApIHsKKyAgICByZXR1cm4gUCA+PSBGSVJTVF9JQ01QX1BSRURJQ0FURSAmJiBQIDw9IExBU1RfSUNNUF9QUkVESUNBVEU7CisgIH0KKworICBzdGF0aWMgU3RyaW5nUmVmIGdldFByZWRpY2F0ZU5hbWUoUHJlZGljYXRlIFApOworCisgIGJvb2wgaXNGUFByZWRpY2F0ZSgpIGNvbnN0IHsgcmV0dXJuIGlzRlBQcmVkaWNhdGUoZ2V0UHJlZGljYXRlKCkpOyB9CisgIGJvb2wgaXNJbnRQcmVkaWNhdGUoKSBjb25zdCB7IHJldHVybiBpc0ludFByZWRpY2F0ZShnZXRQcmVkaWNhdGUoKSk7IH0KKworICAvLy8gRm9yIGV4YW1wbGUsIEVRIC0+IE5FLCBVR1QgLT4gVUxFLCBTTFQgLT4gU0dFLAorICAvLy8gICAgICAgICAgICAgIE9FUSAtPiBVTkUsIFVHVCAtPiBPTEUsIE9MVCAtPiBVR0UsIGV0Yy4KKyAgLy8vIEByZXR1cm5zIHRoZSBpbnZlcnNlIHByZWRpY2F0ZSBmb3IgdGhlIGluc3RydWN0aW9uJ3MgY3VycmVudCBwcmVkaWNhdGUuCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBpbnZlcnNlIG9mIHRoZSBpbnN0cnVjdGlvbidzIHByZWRpY2F0ZS4KKyAgUHJlZGljYXRlIGdldEludmVyc2VQcmVkaWNhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEludmVyc2VQcmVkaWNhdGUoZ2V0UHJlZGljYXRlKCkpOworICB9CisKKyAgLy8vIEZvciBleGFtcGxlLCBFUSAtPiBORSwgVUdUIC0+IFVMRSwgU0xUIC0+IFNHRSwKKyAgLy8vICAgICAgICAgICAgICBPRVEgLT4gVU5FLCBVR1QgLT4gT0xFLCBPTFQgLT4gVUdFLCBldGMuCisgIC8vLyBAcmV0dXJucyB0aGUgaW52ZXJzZSBwcmVkaWNhdGUgZm9yIHByZWRpY2F0ZSBwcm92aWRlZCBpbiBccCBwcmVkLgorICAvLy8gQGJyaWVmIFJldHVybiB0aGUgaW52ZXJzZSBvZiBhIGdpdmVuIHByZWRpY2F0ZQorICBzdGF0aWMgUHJlZGljYXRlIGdldEludmVyc2VQcmVkaWNhdGUoUHJlZGljYXRlIHByZWQpOworCisgIC8vLyBGb3IgZXhhbXBsZSwgRVEtPkVRLCBTTEUtPlNHRSwgVUxULT5VR1QsCisgIC8vLyAgICAgICAgICAgICAgT0VRLT5PRVEsIFVMRS0+VUdFLCBPTFQtPk9HVCwgZXRjLgorICAvLy8gQHJldHVybnMgdGhlIHByZWRpY2F0ZSB0aGF0IHdvdWxkIGJlIHRoZSByZXN1bHQgb2YgZXhjaGFuZ2luZyB0aGUgdHdvCisgIC8vLyBvcGVyYW5kcyBvZiB0aGUgQ21wSW5zdCBpbnN0cnVjdGlvbiB3aXRob3V0IGNoYW5naW5nIHRoZSByZXN1bHQKKyAgLy8vIHByb2R1Y2VkLgorICAvLy8gQGJyaWVmIFJldHVybiB0aGUgcHJlZGljYXRlIGFzIGlmIHRoZSBvcGVyYW5kcyB3ZXJlIHN3YXBwZWQKKyAgUHJlZGljYXRlIGdldFN3YXBwZWRQcmVkaWNhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN3YXBwZWRQcmVkaWNhdGUoZ2V0UHJlZGljYXRlKCkpOworICB9CisKKyAgLy8vIFRoaXMgaXMgYSBzdGF0aWMgdmVyc2lvbiB0aGF0IHlvdSBjYW4gdXNlIHdpdGhvdXQgYW4gaW5zdHJ1Y3Rpb24KKyAgLy8vIGF2YWlsYWJsZS4KKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIHByZWRpY2F0ZSBhcyBpZiB0aGUgb3BlcmFuZHMgd2VyZSBzd2FwcGVkLgorICBzdGF0aWMgUHJlZGljYXRlIGdldFN3YXBwZWRQcmVkaWNhdGUoUHJlZGljYXRlIHByZWQpOworCisgIC8vLyBGb3IgcHJlZGljYXRlIG9mIGtpbmQgImlzIFggb3IgZXF1YWwgdG8gMCIgcmV0dXJucyB0aGUgcHJlZGljYXRlICJpcyBYIi4KKyAgLy8vIEZvciBwcmVkaWNhdGUgb2Yga2luZCAiaXMgWCIgcmV0dXJucyB0aGUgcHJlZGljYXRlICJpcyBYIG9yIGVxdWFsIHRvIDAiLgorICAvLy8gZG9lcyBub3Qgc3VwcG9ydCBvdGhlciBraW5kIG9mIHByZWRpY2F0ZXMuCisgIC8vLyBAcmV0dXJucyB0aGUgcHJlZGljYXRlIHRoYXQgZG9lcyBub3QgY29udGFpbnMgaXMgZXF1YWwgdG8gemVybyBpZgorICAvLy8gaXQgaGFkIGFuZCB2aWNlIHZlcnNhLgorICAvLy8gQGJyaWVmIFJldHVybiB0aGUgZmxpcHBlZCBzdHJpY3RuZXNzIG9mIHByZWRpY2F0ZQorICBQcmVkaWNhdGUgZ2V0RmxpcHBlZFN0cmljdG5lc3NQcmVkaWNhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEZsaXBwZWRTdHJpY3RuZXNzUHJlZGljYXRlKGdldFByZWRpY2F0ZSgpKTsKKyAgfQorCisgIC8vLyBUaGlzIGlzIGEgc3RhdGljIHZlcnNpb24gdGhhdCB5b3UgY2FuIHVzZSB3aXRob3V0IGFuIGluc3RydWN0aW9uCisgIC8vLyBhdmFpbGFibGUuCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBmbGlwcGVkIHN0cmljdG5lc3Mgb2YgcHJlZGljYXRlCisgIHN0YXRpYyBQcmVkaWNhdGUgZ2V0RmxpcHBlZFN0cmljdG5lc3NQcmVkaWNhdGUoUHJlZGljYXRlIHByZWQpOworCisgIC8vLyBGb3IgZXhhbXBsZSwgU0dUIC0+IFNHRSwgU0xUIC0+IFNMRSwgVUxUIC0+IFVMRSwgVUdUIC0+IFVHRS4KKyAgLy8vIEBicmllZiBSZXR1cm5zIHRoZSBub24tc3RyaWN0IHZlcnNpb24gb2Ygc3RyaWN0IGNvbXBhcmlzb25zLgorICBQcmVkaWNhdGUgZ2V0Tm9uU3RyaWN0UHJlZGljYXRlKCkgY29uc3QgeworICAgIHJldHVybiBnZXROb25TdHJpY3RQcmVkaWNhdGUoZ2V0UHJlZGljYXRlKCkpOworICB9CisKKyAgLy8vIFRoaXMgaXMgYSBzdGF0aWMgdmVyc2lvbiB0aGF0IHlvdSBjYW4gdXNlIHdpdGhvdXQgYW4gaW5zdHJ1Y3Rpb24KKyAgLy8vIGF2YWlsYWJsZS4KKyAgLy8vIEByZXR1cm5zIHRoZSBub24tc3RyaWN0IHZlcnNpb24gb2YgY29tcGFyaXNvbiBwcm92aWRlZCBpbiBccCBwcmVkLgorICAvLy8gSWYgXHAgcHJlZCBpcyBub3QgYSBzdHJpY3QgY29tcGFyaXNvbiBwcmVkaWNhdGUsIHJldHVybnMgXHAgcHJlZC4KKyAgLy8vIEBicmllZiBSZXR1cm5zIHRoZSBub24tc3RyaWN0IHZlcnNpb24gb2Ygc3RyaWN0IGNvbXBhcmlzb25zLgorICBzdGF0aWMgUHJlZGljYXRlIGdldE5vblN0cmljdFByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZCk7CisKKyAgLy8vIEBicmllZiBQcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8vIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIHRoYXQgZGlzcGF0Y2hlcyB0byB0aGUgc3ViY2xhc3Nlcy4KKyAgLy8vIEBicmllZiBTd2FwIHRoZSBvcGVyYW5kcyBhbmQgYWRqdXN0IHByZWRpY2F0ZSBhY2NvcmRpbmdseSB0byByZXRhaW4KKyAgLy8vIHRoZSBzYW1lIGNvbXBhcmlzb24uCisgIHZvaWQgc3dhcE9wZXJhbmRzKCk7CisKKyAgLy8vIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIHRoYXQgZGlzcGF0Y2hlcyB0byB0aGUgc3ViY2xhc3Nlcy4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBDbXBJbnN0IGlzIGNvbW11dGF0aXZlLgorICBib29sIGlzQ29tbXV0YXRpdmUoKSBjb25zdDsKKworICAvLy8gVGhpcyBpcyBqdXN0IGEgY29udmVuaWVuY2UgdGhhdCBkaXNwYXRjaGVzIHRvIHRoZSBzdWJjbGFzc2VzLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIGlzIGFuIGVxdWFscy9ub3QgZXF1YWxzIHByZWRpY2F0ZS4KKyAgYm9vbCBpc0VxdWFsaXR5KCkgY29uc3Q7CisKKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgdGhlIGNvbXBhcmlzb24gaXMgc2lnbmVkLCBmYWxzZSBvdGhlcndpc2UuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgdXNpbmcgYSBzaWduZWQgY29tcGFyaXNvbi4KKyAgYm9vbCBpc1NpZ25lZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNTaWduZWQoZ2V0UHJlZGljYXRlKCkpOworICB9CisKKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgdGhlIGNvbXBhcmlzb24gaXMgdW5zaWduZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBpbnN0cnVjdGlvbiBpcyB1c2luZyBhbiB1bnNpZ25lZCBjb21wYXJpc29uLgorICBib29sIGlzVW5zaWduZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzVW5zaWduZWQoZ2V0UHJlZGljYXRlKCkpOworICB9CisKKyAgLy8vIEZvciBleGFtcGxlLCBVTFQtPlNMVCwgVUxFLT5TTEUsIFVHVC0+U0dULCBVR0UtPlNHRSwgU0xULT5GYWlsZWQgYXNzZXJ0CisgIC8vLyBAcmV0dXJucyB0aGUgc2lnbmVkIHZlcnNpb24gb2YgdGhlIHVuc2lnbmVkIHByZWRpY2F0ZSBwcmVkLgorICAvLy8gQGJyaWVmIHJldHVybiB0aGUgc2lnbmVkIHZlcnNpb24gb2YgYSBwcmVkaWNhdGUKKyAgc3RhdGljIFByZWRpY2F0ZSBnZXRTaWduZWRQcmVkaWNhdGUoUHJlZGljYXRlIHByZWQpOworCisgIC8vLyBGb3IgZXhhbXBsZSwgVUxULT5TTFQsIFVMRS0+U0xFLCBVR1QtPlNHVCwgVUdFLT5TR0UsIFNMVC0+RmFpbGVkIGFzc2VydAorICAvLy8gQHJldHVybnMgdGhlIHNpZ25lZCB2ZXJzaW9uIG9mIHRoZSBwcmVkaWNhdGUgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24gKHdoaWNoCisgIC8vLyBoYXMgdG8gYmUgYW4gdW5zaWduZWQgcHJlZGljYXRlKS4KKyAgLy8vIEBicmllZiByZXR1cm4gdGhlIHNpZ25lZCB2ZXJzaW9uIG9mIGEgcHJlZGljYXRlCisgIFByZWRpY2F0ZSBnZXRTaWduZWRQcmVkaWNhdGUoKSB7CisgICAgcmV0dXJuIGdldFNpZ25lZFByZWRpY2F0ZShnZXRQcmVkaWNhdGUoKSk7CisgIH0KKworICAvLy8gVGhpcyBpcyBqdXN0IGEgY29udmVuaWVuY2UuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoaXMgaXMgdHJ1ZSB3aGVuIGJvdGggb3BlcmFuZHMgYXJlIHRoZSBzYW1lLgorICBib29sIGlzVHJ1ZVdoZW5FcXVhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNUcnVlV2hlbkVxdWFsKGdldFByZWRpY2F0ZSgpKTsKKyAgfQorCisgIC8vLyBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZS4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBmYWxzZSB3aGVuIGJvdGggb3BlcmFuZHMgYXJlIHRoZSBzYW1lLgorICBib29sIGlzRmFsc2VXaGVuRXF1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRmFsc2VXaGVuRXF1YWwoZ2V0UHJlZGljYXRlKCkpOworICB9CisKKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgdGhlIHByZWRpY2F0ZSBpcyB1bnNpZ25lZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgcHJlZGljYXRlIGlzIGFuIHVuc2lnbmVkIG9wZXJhdGlvbi4KKyAgc3RhdGljIGJvb2wgaXNVbnNpZ25lZChQcmVkaWNhdGUgcHJlZGljYXRlKTsKKworICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJlZGljYXRlIGlzIHNpZ25lZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgcHJlZGljYXRlIGlzIGFuIHNpZ25lZCBvcGVyYXRpb24uCisgIHN0YXRpYyBib29sIGlzU2lnbmVkKFByZWRpY2F0ZSBwcmVkaWNhdGUpOworCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBwcmVkaWNhdGUgaXMgYW4gb3JkZXJlZCBvcGVyYXRpb24uCisgIHN0YXRpYyBib29sIGlzT3JkZXJlZChQcmVkaWNhdGUgcHJlZGljYXRlKTsKKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgcHJlZGljYXRlIGlzIGFuIHVub3JkZXJlZCBvcGVyYXRpb24uCisgIHN0YXRpYyBib29sIGlzVW5vcmRlcmVkKFByZWRpY2F0ZSBwcmVkaWNhdGUpOworCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIHByZWRpY2F0ZSBpcyB0cnVlIHdoZW4gY29tcGFyaW5nIGEgdmFsdWUgd2l0aCBpdHNlbGYuCisgIHN0YXRpYyBib29sIGlzVHJ1ZVdoZW5FcXVhbChQcmVkaWNhdGUgcHJlZGljYXRlKTsKKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBwcmVkaWNhdGUgaXMgZmFsc2Ugd2hlbiBjb21wYXJpbmcgYSB2YWx1ZSB3aXRoIGl0c2VsZi4KKyAgc3RhdGljIGJvb2wgaXNGYWxzZVdoZW5FcXVhbChQcmVkaWNhdGUgcHJlZGljYXRlKTsKKworICAvLy8gRGV0ZXJtaW5lIGlmIFByZWQxIGltcGxpZXMgUHJlZDIgaXMgdHJ1ZSB3aGVuIHR3byBjb21wYXJlcyBoYXZlIG1hdGNoaW5nCisgIC8vLyBvcGVyYW5kcy4KKyAgc3RhdGljIGJvb2wgaXNJbXBsaWVkVHJ1ZUJ5TWF0Y2hpbmdDbXAoUHJlZGljYXRlIFByZWQxLCBQcmVkaWNhdGUgUHJlZDIpOworCisgIC8vLyBEZXRlcm1pbmUgaWYgUHJlZDEgaW1wbGllcyBQcmVkMiBpcyBmYWxzZSB3aGVuIHR3byBjb21wYXJlcyBoYXZlIG1hdGNoaW5nCisgIC8vLyBvcGVyYW5kcy4KKyAgc3RhdGljIGJvb2wgaXNJbXBsaWVkRmFsc2VCeU1hdGNoaW5nQ21wKFByZWRpY2F0ZSBQcmVkMSwgUHJlZGljYXRlIFByZWQyKTsKKworICAvLy8gQGJyaWVmIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OklDbXAgfHwKKyAgICAgICAgICAgSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkZDbXA7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSByZXN1bHQgdHlwZSBmb3IgZmNtcC9pY21wCisgIHN0YXRpYyBUeXBlKiBtYWtlQ21wUmVzdWx0VHlwZShUeXBlKiBvcG5kX3R5cGUpIHsKKyAgICBpZiAoVmVjdG9yVHlwZSogdnQgPSBkeW5fY2FzdDxWZWN0b3JUeXBlPihvcG5kX3R5cGUpKSB7CisgICAgICByZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KFR5cGU6OmdldEludDFUeShvcG5kX3R5cGUtPmdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0LT5nZXROdW1FbGVtZW50cygpKTsKKyAgICB9CisgICAgcmV0dXJuIFR5cGU6OmdldEludDFUeShvcG5kX3R5cGUtPmdldENvbnRleHQoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gU2hhZG93IFZhbHVlOjpzZXRWYWx1ZVN1YmNsYXNzRGF0YSB3aXRoIGEgcHJpdmF0ZSBmb3J3YXJkaW5nIG1ldGhvZCBzbyB0aGF0CisgIC8vIHN1YmNsYXNzZXMgY2Fubm90IGFjY2lkZW50YWxseSB1c2UgaXQuCisgIHZvaWQgc2V0VmFsdWVTdWJjbGFzc0RhdGEodW5zaWduZWQgc2hvcnQgRCkgeworICAgIFZhbHVlOjpzZXRWYWx1ZVN1YmNsYXNzRGF0YShEKTsKKyAgfQorfTsKKworLy8gRklYTUU6IHRoZXNlIGFyZSByZWR1bmRhbnQgaWYgQ21wSW5zdCA8IEJpbmFyeU9wZXJhdG9yCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8Q21wSW5zdD4gOiBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPENtcEluc3QsIDI+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhDbXBJbnN0LCBWYWx1ZSkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY2xldFBhZEluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitjbGFzcyBGdW5jbGV0UGFkSW5zdCA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7Citwcml2YXRlOgorICBGdW5jbGV0UGFkSW5zdChjb25zdCBGdW5jbGV0UGFkSW5zdCAmQ1BJKTsKKworICBleHBsaWNpdCBGdW5jbGV0UGFkSW5zdChJbnN0cnVjdGlvbjo6RnVuY2xldFBhZE9wcyBPcCwgVmFsdWUgKlBhcmVudFBhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywgdW5zaWduZWQgVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisgIGV4cGxpY2l0IEZ1bmNsZXRQYWRJbnN0KEluc3RydWN0aW9uOjpGdW5jbGV0UGFkT3BzIE9wLCBWYWx1ZSAqUGFyZW50UGFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLCB1bnNpZ25lZCBWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgdm9pZCBpbml0KFZhbHVlICpQYXJlbnRQYWQsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsIGNvbnN0IFR3aW5lICZOYW1lU3RyKTsKKworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisgIGZyaWVuZCBjbGFzcyBDYXRjaFBhZEluc3Q7CisgIGZyaWVuZCBjbGFzcyBDbGVhbnVwUGFkSW5zdDsKKworICBGdW5jbGV0UGFkSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIFByb3ZpZGUgZmFzdCBvcGVyYW5kIGFjY2Vzc29ycworICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLy8gZ2V0TnVtQXJnT3BlcmFuZHMgLSBSZXR1cm4gdGhlIG51bWJlciBvZiBmdW5jbGV0cGFkIGFyZ3VtZW50cy4KKyAgLy8vCisgIHVuc2lnbmVkIGdldE51bUFyZ09wZXJhbmRzKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSAtIDE7IH0KKworICAvLy8gQ29udmVuaWVuY2UgYWNjZXNzb3JzCisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG91dGVyIEVILXBhZCB0aGlzIGZ1bmNsZXQgaXMgbmVzdGVkIHdpdGhpbi4KKyAgLy8vCisgIC8vLyBOb3RlOiBUaGlzIHJldHVybnMgdGhlIGFzc29jaWF0ZWQgQ2F0Y2hTd2l0Y2hJbnN0IGlmIHRoaXMgRnVuY2xldFBhZEluc3QKKyAgLy8vIGlzIGEgQ2F0Y2hQYWRJbnN0LgorICBWYWx1ZSAqZ2V0UGFyZW50UGFkKCkgY29uc3QgeyByZXR1cm4gT3A8LTE+KCk7IH0KKyAgdm9pZCBzZXRQYXJlbnRQYWQoVmFsdWUgKlBhcmVudFBhZCkgeworICAgIGFzc2VydChQYXJlbnRQYWQpOworICAgIE9wPC0xPigpID0gUGFyZW50UGFkOworICB9CisKKyAgLy8vIGdldEFyZ09wZXJhbmQvc2V0QXJnT3BlcmFuZCAtIFJldHVybi9zZXQgdGhlIGktdGggZnVuY2xldHBhZCBhcmd1bWVudC4KKyAgLy8vCisgIFZhbHVlICpnZXRBcmdPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoaSk7IH0KKyAgdm9pZCBzZXRBcmdPcGVyYW5kKHVuc2lnbmVkIGksIFZhbHVlICp2KSB7IHNldE9wZXJhbmQoaSwgdik7IH0KKworICAvLy8gYXJnX29wZXJhbmRzIC0gaXRlcmF0aW9uIGFkYXB0ZXIgZm9yIHJhbmdlLWZvciBsb29wcy4KKyAgb3BfcmFuZ2UgYXJnX29wZXJhbmRzKCkgeyByZXR1cm4gb3BfcmFuZ2Uob3BfYmVnaW4oKSwgb3BfZW5kKCkgLSAxKTsgfQorCisgIC8vLyBhcmdfb3BlcmFuZHMgLSBpdGVyYXRpb24gYWRhcHRlciBmb3IgcmFuZ2UtZm9yIGxvb3BzLgorICBjb25zdF9vcF9yYW5nZSBhcmdfb3BlcmFuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X29wX3JhbmdlKG9wX2JlZ2luKCksIG9wX2VuZCgpIC0gMSk7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7IHJldHVybiBJLT5pc0Z1bmNsZXRQYWQoKTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxGdW5jbGV0UGFkSW5zdD4KKyAgICA6IHB1YmxpYyBWYXJpYWRpY09wZXJhbmRUcmFpdHM8RnVuY2xldFBhZEluc3QsIC8qTUlOQVJJVFk9Ki8xPiB7fTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKEZ1bmNsZXRQYWRJbnN0LCBWYWx1ZSkKKworLy8vIFxicmllZiBBIGxpZ2h0d2VpZ2h0IGFjY2Vzc29yIGZvciBhbiBvcGVyYW5kIGJ1bmRsZSBtZWFudCB0byBiZSBwYXNzZWQKKy8vLyBhcm91bmQgYnkgdmFsdWUuCitzdHJ1Y3QgT3BlcmFuZEJ1bmRsZVVzZSB7CisgIEFycmF5UmVmPFVzZT4gSW5wdXRzOworCisgIE9wZXJhbmRCdW5kbGVVc2UoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IE9wZXJhbmRCdW5kbGVVc2UoU3RyaW5nTWFwRW50cnk8dWludDMyX3Q+ICpUYWcsIEFycmF5UmVmPFVzZT4gSW5wdXRzKQorICAgICAgOiBJbnB1dHMoSW5wdXRzKSwgVGFnKFRhZykge30KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBvcGVyYW5kIGF0IGluZGV4IFxwIElkeCBpbiB0aGlzIG9wZXJhbmQgYnVuZGxlCisgIC8vLyBoYXMgdGhlIGF0dHJpYnV0ZSBBLgorICBib29sIG9wZXJhbmRIYXNBdHRyKHVuc2lnbmVkIElkeCwgQXR0cmlidXRlOjpBdHRyS2luZCBBKSBjb25zdCB7CisgICAgaWYgKGlzRGVvcHRPcGVyYW5kQnVuZGxlKCkpCisgICAgICBpZiAoQSA9PSBBdHRyaWJ1dGU6OlJlYWRPbmx5IHx8IEEgPT0gQXR0cmlidXRlOjpOb0NhcHR1cmUpCisgICAgICAgIHJldHVybiBJbnB1dHNbSWR4XS0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpOworCisgICAgLy8gQ29uc2VydmF0aXZlIGFuc3dlcjogIG5vIG9wZXJhbmRzIGhhdmUgYW55IGF0dHJpYnV0ZXMuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHRhZyBvZiB0aGlzIG9wZXJhbmQgYnVuZGxlIGFzIGEgc3RyaW5nLgorICBTdHJpbmdSZWYgZ2V0VGFnTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVGFnLT5nZXRLZXkoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB0YWcgb2YgdGhpcyBvcGVyYW5kIGJ1bmRsZSBhcyBhbiBpbnRlZ2VyLgorICAvLy8KKyAgLy8vIE9wZXJhbmQgYnVuZGxlIHRhZ3MgYXJlIGludGVybmVkIGJ5IExMVk1Db250ZXh0SW1wbDo6Z2V0T3JJbnNlcnRCdW5kbGVUYWcsCisgIC8vLyBhbmQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB1bmlxdWUgaW50ZWdlciBnZXRPckluc2VydEJ1bmRsZVRhZworICAvLy8gYXNzb2NpYXRlZCB0aGUgdGFnIG9mIHRoaXMgb3BlcmFuZCBidW5kbGUgdG8uCisgIHVpbnQzMl90IGdldFRhZ0lEKCkgY29uc3QgeworICAgIHJldHVybiBUYWctPmdldFZhbHVlKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSAiZGVvcHQiIG9wZXJhbmQgYnVuZGxlLgorICBib29sIGlzRGVvcHRPcGVyYW5kQnVuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUYWdJRCgpID09IExMVk1Db250ZXh0OjpPQl9kZW9wdDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhICJmdW5jbGV0IiBvcGVyYW5kIGJ1bmRsZS4KKyAgYm9vbCBpc0Z1bmNsZXRPcGVyYW5kQnVuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUYWdJRCgpID09IExMVk1Db250ZXh0OjpPQl9mdW5jbGV0OworICB9CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgUG9pbnRlciB0byBhbiBlbnRyeSBpbiBMTFZNQ29udGV4dEltcGw6OmdldE9ySW5zZXJ0QnVuZGxlVGFnLgorICBTdHJpbmdNYXBFbnRyeTx1aW50MzJfdD4gKlRhZzsKK307CisKKy8vLyBcYnJpZWYgQSBjb250YWluZXIgZm9yIGFuIG9wZXJhbmQgYnVuZGxlIGJlaW5nIHZpZXdlZCBhcyBhIHNldCBvZiB2YWx1ZXMKKy8vLyByYXRoZXIgdGhhbiBhIHNldCBvZiB1c2VzLgorLy8vCisvLy8gVW5saWtlIE9wZXJhbmRCdW5kbGVVc2UsIE9wZXJhbmRCdW5kbGVEZWZUIG93bnMgdGhlIG1lbW9yeSBpdCBjYXJyaWVzLCBhbmQKKy8vLyBzbyBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgYW5kIHBhc3MgYXJvdW5kICJzZWxmLWNvbnRhaW5lZCIgaW5zdGFuY2VzIG9mCisvLy8gT3BlcmFuZEJ1bmRsZURlZiBhbmQgQ29uc3RPcGVyYW5kQnVuZGxlRGVmLgordGVtcGxhdGUgPHR5cGVuYW1lIElucHV0VHk+IGNsYXNzIE9wZXJhbmRCdW5kbGVEZWZUIHsKKyAgc3RkOjpzdHJpbmcgVGFnOworICBzdGQ6OnZlY3RvcjxJbnB1dFR5PiBJbnB1dHM7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgT3BlcmFuZEJ1bmRsZURlZlQoc3RkOjpzdHJpbmcgVGFnLCBzdGQ6OnZlY3RvcjxJbnB1dFR5PiBJbnB1dHMpCisgICAgICA6IFRhZyhzdGQ6Om1vdmUoVGFnKSksIElucHV0cyhzdGQ6Om1vdmUoSW5wdXRzKSkge30KKyAgZXhwbGljaXQgT3BlcmFuZEJ1bmRsZURlZlQoc3RkOjpzdHJpbmcgVGFnLCBBcnJheVJlZjxJbnB1dFR5PiBJbnB1dHMpCisgICAgICA6IFRhZyhzdGQ6Om1vdmUoVGFnKSksIElucHV0cyhJbnB1dHMpIHt9CisKKyAgZXhwbGljaXQgT3BlcmFuZEJ1bmRsZURlZlQoY29uc3QgT3BlcmFuZEJ1bmRsZVVzZSAmT0JVKSB7CisgICAgVGFnID0gT0JVLmdldFRhZ05hbWUoKTsKKyAgICBJbnB1dHMuaW5zZXJ0KElucHV0cy5lbmQoKSwgT0JVLklucHV0cy5iZWdpbigpLCBPQlUuSW5wdXRzLmVuZCgpKTsKKyAgfQorCisgIEFycmF5UmVmPElucHV0VHk+IGlucHV0cygpIGNvbnN0IHsgcmV0dXJuIElucHV0czsgfQorCisgIHVzaW5nIGlucHV0X2l0ZXJhdG9yID0gdHlwZW5hbWUgc3RkOjp2ZWN0b3I8SW5wdXRUeT46OmNvbnN0X2l0ZXJhdG9yOworCisgIHNpemVfdCBpbnB1dF9zaXplKCkgY29uc3QgeyByZXR1cm4gSW5wdXRzLnNpemUoKTsgfQorICBpbnB1dF9pdGVyYXRvciBpbnB1dF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIElucHV0cy5iZWdpbigpOyB9CisgIGlucHV0X2l0ZXJhdG9yIGlucHV0X2VuZCgpIGNvbnN0IHsgcmV0dXJuIElucHV0cy5lbmQoKTsgfQorCisgIFN0cmluZ1JlZiBnZXRUYWcoKSBjb25zdCB7IHJldHVybiBUYWc7IH0KK307CisKK3VzaW5nIE9wZXJhbmRCdW5kbGVEZWYgPSBPcGVyYW5kQnVuZGxlRGVmVDxWYWx1ZSAqPjsKK3VzaW5nIENvbnN0T3BlcmFuZEJ1bmRsZURlZiA9IE9wZXJhbmRCdW5kbGVEZWZUPGNvbnN0IFZhbHVlICo+OworCisvLy8gXGJyaWVmIEEgbWl4aW4gdG8gYWRkIG9wZXJhbmQgYnVuZGxlIGZ1bmN0aW9uYWxpdHkgdG8gbGx2bSBpbnN0cnVjdGlvbgorLy8vIGNsYXNzZXMuCisvLy8KKy8vLyBPcGVyYW5kQnVuZGxlVXNlciB1c2VzIHRoZSBkZXNjcmlwdG9yIGFyZWEgY28tYWxsb2NhdGVkIHdpdGggdGhlIGhvc3QgVXNlcgorLy8vIHRvIHN0b3JlIHNvbWUgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBvcGVyYW5kcyBhcmUgIm5vcm1hbCIgb3BlcmFuZHMsCisvLy8gYW5kIHdoaWNoIG9uZXMgYmVsb25nIHRvIHNvbWUgb3BlcmFuZCBidW5kbGUuCisvLy8KKy8vLyBUaGUgbGF5b3V0IG9mIGFuIG9wZXJhbmQgYnVuZGxlIHVzZXIgaXMKKy8vLworLy8vICAgICAgICAgICstLS0tLS0tLS0tLXVpbnQzMl90IEVuZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLy8gICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vLyAgICAgICAgICB8ICArLS0tLS0tLS11aW50MzJfdCBCZWdpbi0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgfAorLy8vICAgICAgICAgIHwgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CisvLy8gICAgICAgICAgXiAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgICAgICAgICAgICAgIHYKKy8vLyAgfC0tLS0tLXwtLS0tLS18LS0tLXwtLS0tfC0tLS18LS0tLXwtLS0tfC0tLS0tLS0tLXwtLS0tfC0tLS0tLS0tLXwtLS0tfC0tLS0tCisvLy8gIHwgQk9JMCB8IEJPSTEgfCAuLiB8IERVIHwgVTAgfCBVMSB8IC4uIHwgQk9JMF9VMCB8IC4uIHwgQk9JMV9VMCB8IC4uIHwgVW4KKy8vLyAgfC0tLS0tLXwtLS0tLS18LS0tLXwtLS0tfC0tLS18LS0tLXwtLS0tfC0tLS0tLS0tLXwtLS0tfC0tLS0tLS0tLXwtLS0tfC0tLS0tCisvLy8gICB2ICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgIF4KKy8vLyAgIHwgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAorLy8vICAgfCAgKy0tLS0tLS0tdWludDMyX3QgQmVnaW4tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICB8CisvLy8gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vLyAgICstLS0tLS0tLS0tLXVpbnQzMl90IEVuZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8vCisvLy8KKy8vLyBCT0kwLCBCT0kxIC4uLiBhcmUgZGVzY3JpcHRpb25zIG9mIG9wZXJhbmQgYnVuZGxlcyBpbiB0aGlzIFVzZXIncyB1c2UgbGlzdC4KKy8vLyBUaGVzZSBkZXNjcmlwdGlvbnMgYXJlIGluc3RhbGxlZCBhbmQgbWFuYWdlZCBieSB0aGlzIGNsYXNzLCBhbmQgdGhleSdyZSBhbGwKKy8vLyBpbnN0YW5jZXMgb2YgT3BlcmFuZEJ1bmRsZVVzZXI8VD46OkJ1bmRsZU9wSW5mby4KKy8vLworLy8vIERVIGlzIGFuIGFkZGl0aW9uYWwgZGVzY3JpcHRvciBpbnN0YWxsZWQgYnkgVXNlcidzICdvcGVyYXRvciBuZXcnIHRvIGtlZXAKKy8vLyB0cmFjayBvZiB0aGUgJ0JPSTAgLi4uIEJPSU4nIGNvLWFsbG9jYXRpb24uICBPcGVyYW5kQnVuZGxlVXNlciBkb2VzIG5vdAorLy8vIGFjY2VzcyBvciBtb2RpZnkgRFUgaW4gYW55IHdheSwgaXQncyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgcHJpdmF0ZSB0bworLy8vIFVzZXIuCisvLy8KKy8vLyBUaGUgcmVndWxhciBVc2UmIHZlY3RvciBmb3IgdGhlIFVzZXIgc3RhcnRzIGF0IFUwLiAgVGhlIG9wZXJhbmQgYnVuZGxlIHVzZXMKKy8vLyBhcmUgcGFydCBvZiB0aGUgVXNlJiB2ZWN0b3IsIGp1c3QgbGlrZSBub3JtYWwgdXNlcy4gIEluIHRoZSBkaWFncmFtIGFib3ZlLAorLy8vIHRoZSBvcGVyYW5kIGJ1bmRsZSB1c2VzIHN0YXJ0IGF0IEJPSTBfVTAuICBFYWNoIGluc3RhbmNlIG9mIEJ1bmRsZU9wSW5mbyBoYXMKKy8vLyBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbnRpZ3VvdXMgc2V0IG9mIHVzZXMgY29uc3RpdHV0aW5nIGFuIG9wZXJhbmQgYnVuZGxlLAorLy8vIGFuZCB0aGUgdG90YWwgc2V0IG9mIG9wZXJhbmQgYnVuZGxlIHVzZXMgdGhlbXNlbHZlcyBmb3JtIGEgY29udGlndW91cyBzZXQgb2YKKy8vLyB1c2VzIChpLmUuIHRoZXJlIGFyZSBubyBnYXBzIGJldHdlZW4gdXNlcyBjb3JyZXNwb25kaW5nIHRvIGluZGl2aWR1YWwKKy8vLyBvcGVyYW5kIGJ1bmRsZXMpLgorLy8vCisvLy8gVGhpcyBjbGFzcyBkb2VzIG5vdCBrbm93IHRoZSBsb2NhdGlvbiBvZiB0aGUgc2V0IG9mIG9wZXJhbmQgYnVuZGxlIHVzZXMKKy8vLyB3aXRoaW4gdGhlIHVzZSBsaXN0IC0tIHRoYXQgaXMgZGVjaWRlZCBieSB0aGUgVXNlciB1c2luZyB0aGlzIGNsYXNzIHZpYSB0aGUKKy8vLyBCZWdpbklkeCBhcmd1bWVudCBpbiBwb3B1bGF0ZUJ1bmRsZU9wZXJhbmRJbmZvcy4KKy8vLworLy8vIEN1cnJlbnRseSBvcGVyYW5kIGJ1bmRsZSB1c2VycyB3aXRoIGh1bmctb2ZmIG9wZXJhbmRzIGFyZSBub3Qgc3VwcG9ydGVkLgordGVtcGxhdGUgPHR5cGVuYW1lIEluc3RyVHksIHR5cGVuYW1lIE9wSXRlcmF0b3JUeT4gY2xhc3MgT3BlcmFuZEJ1bmRsZVVzZXIgeworcHVibGljOgorICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIG9wZXJhbmQgYnVuZGxlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBVc2VyLgorICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kQnVuZGxlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpkaXN0YW5jZShidW5kbGVfb3BfaW5mb19iZWdpbigpLCBidW5kbGVfb3BfaW5mb19lbmQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgVXNlciBoYXMgYW55IG9wZXJhbmQgYnVuZGxlcy4KKyAgYm9vbCBoYXNPcGVyYW5kQnVuZGxlcygpIGNvbnN0IHsgcmV0dXJuIGdldE51bU9wZXJhbmRCdW5kbGVzKCkgIT0gMDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnVuZGxlIG9wZXJhbmQgaW4gdGhlIFVzZSBhcnJheS4KKyAgdW5zaWduZWQgZ2V0QnVuZGxlT3BlcmFuZHNTdGFydEluZGV4KCkgY29uc3QgeworICAgIGFzc2VydChoYXNPcGVyYW5kQnVuZGxlcygpICYmICJEb24ndCBjYWxsIG90aGVyd2lzZSEiKTsKKyAgICByZXR1cm4gYnVuZGxlX29wX2luZm9fYmVnaW4oKS0+QmVnaW47CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3QgYnVuZGxlIG9wZXJhbmQgaW4gdGhlIFVzZSBhcnJheS4KKyAgdW5zaWduZWQgZ2V0QnVuZGxlT3BlcmFuZHNFbmRJbmRleCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaGFzT3BlcmFuZEJ1bmRsZXMoKSAmJiAiRG9uJ3QgY2FsbCBvdGhlcndpc2UhIik7CisgICAgcmV0dXJuIGJ1bmRsZV9vcF9pbmZvX2VuZCgpWy0xXS5FbmQ7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhbmQgYXQgaW5kZXggXHAgSWR4IGlzIGEgYnVuZGxlIG9wZXJhbmQuCisgIGJvb2wgaXNCdW5kbGVPcGVyYW5kKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIHJldHVybiBoYXNPcGVyYW5kQnVuZGxlcygpICYmIElkeCA+PSBnZXRCdW5kbGVPcGVyYW5kc1N0YXJ0SW5kZXgoKSAmJgorICAgICAgICAgICBJZHggPCBnZXRCdW5kbGVPcGVyYW5kc0VuZEluZGV4KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9wZXJhbmRzIChub3Qgb3BlcmFuZCBidW5kbGVzKSB1c2VkIGJ5CisgIC8vLyBldmVyeSBvcGVyYW5kIGJ1bmRsZSBpbiB0aGlzIE9wZXJhbmRCdW5kbGVVc2VyLgorICB1bnNpZ25lZCBnZXROdW1Ub3RhbEJ1bmRsZU9wZXJhbmRzKCkgY29uc3QgeworICAgIGlmICghaGFzT3BlcmFuZEJ1bmRsZXMoKSkKKyAgICAgIHJldHVybiAwOworCisgICAgdW5zaWduZWQgQmVnaW4gPSBnZXRCdW5kbGVPcGVyYW5kc1N0YXJ0SW5kZXgoKTsKKyAgICB1bnNpZ25lZCBFbmQgPSBnZXRCdW5kbGVPcGVyYW5kc0VuZEluZGV4KCk7CisKKyAgICBhc3NlcnQoQmVnaW4gPD0gRW5kICYmICJTaG91bGQgYmUhIik7CisgICAgcmV0dXJuIEVuZCAtIEJlZ2luOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG9wZXJhbmQgYnVuZGxlIGF0IGEgc3BlY2lmaWMgaW5kZXguCisgIE9wZXJhbmRCdW5kbGVVc2UgZ2V0T3BlcmFuZEJ1bmRsZUF0KHVuc2lnbmVkIEluZGV4KSBjb25zdCB7CisgICAgYXNzZXJ0KEluZGV4IDwgZ2V0TnVtT3BlcmFuZEJ1bmRsZXMoKSAmJiAiSW5kZXggb3V0IG9mIGJvdW5kcyEiKTsKKyAgICByZXR1cm4gb3BlcmFuZEJ1bmRsZUZyb21CdW5kbGVPcEluZm8oKihidW5kbGVfb3BfaW5mb19iZWdpbigpICsgSW5kZXgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2Ygb3BlcmFuZCBidW5kbGVzIHdpdGggdGhlIHRhZyBOYW1lIGF0dGFjaGVkIHRvCisgIC8vLyB0aGlzIGluc3RydWN0aW9uLgorICB1bnNpZ25lZCBjb3VudE9wZXJhbmRCdW5kbGVzT2ZUeXBlKFN0cmluZ1JlZiBOYW1lKSBjb25zdCB7CisgICAgdW5zaWduZWQgQ291bnQgPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kQnVuZGxlcygpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChnZXRPcGVyYW5kQnVuZGxlQXQoaSkuZ2V0VGFnTmFtZSgpID09IE5hbWUpCisgICAgICAgIENvdW50Kys7CisKKyAgICByZXR1cm4gQ291bnQ7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIG9wZXJhbmQgYnVuZGxlcyB3aXRoIHRoZSB0YWcgSUQgYXR0YWNoZWQgdG8KKyAgLy8vIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIHVuc2lnbmVkIGNvdW50T3BlcmFuZEJ1bmRsZXNPZlR5cGUodWludDMyX3QgSUQpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBDb3VudCA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wZXJhbmRCdW5kbGVzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKGdldE9wZXJhbmRCdW5kbGVBdChpKS5nZXRUYWdJRCgpID09IElEKQorICAgICAgICBDb3VudCsrOworCisgICAgcmV0dXJuIENvdW50OworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYW4gb3BlcmFuZCBidW5kbGUgYnkgbmFtZSwgaWYgcHJlc2VudC4KKyAgLy8vCisgIC8vLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgZm9yIG9wZXJhbmQgYnVuZGxlIHR5cGVzIHRoYXQgbWF5IGhhdmUKKyAgLy8vIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGVtIG9uIHRoZSBzYW1lIGluc3RydWN0aW9uLgorICBPcHRpb25hbDxPcGVyYW5kQnVuZGxlVXNlPiBnZXRPcGVyYW5kQnVuZGxlKFN0cmluZ1JlZiBOYW1lKSBjb25zdCB7CisgICAgYXNzZXJ0KGNvdW50T3BlcmFuZEJ1bmRsZXNPZlR5cGUoTmFtZSkgPCAyICYmICJQcmVjb25kaXRpb24gdmlvbGF0ZWQhIik7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZEJ1bmRsZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE9wZXJhbmRCdW5kbGVVc2UgVSA9IGdldE9wZXJhbmRCdW5kbGVBdChpKTsKKyAgICAgIGlmIChVLmdldFRhZ05hbWUoKSA9PSBOYW1lKQorICAgICAgICByZXR1cm4gVTsKKyAgICB9CisKKyAgICByZXR1cm4gTm9uZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGFuIG9wZXJhbmQgYnVuZGxlIGJ5IHRhZyBJRCwgaWYgcHJlc2VudC4KKyAgLy8vCisgIC8vLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgZm9yIG9wZXJhbmQgYnVuZGxlIHR5cGVzIHRoYXQgbWF5IGhhdmUKKyAgLy8vIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGVtIG9uIHRoZSBzYW1lIGluc3RydWN0aW9uLgorICBPcHRpb25hbDxPcGVyYW5kQnVuZGxlVXNlPiBnZXRPcGVyYW5kQnVuZGxlKHVpbnQzMl90IElEKSBjb25zdCB7CisgICAgYXNzZXJ0KGNvdW50T3BlcmFuZEJ1bmRsZXNPZlR5cGUoSUQpIDwgMiAmJiAiUHJlY29uZGl0aW9uIHZpb2xhdGVkISIpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wZXJhbmRCdW5kbGVzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBPcGVyYW5kQnVuZGxlVXNlIFUgPSBnZXRPcGVyYW5kQnVuZGxlQXQoaSk7CisgICAgICBpZiAoVS5nZXRUYWdJRCgpID09IElEKQorICAgICAgICByZXR1cm4gVTsKKyAgICB9CisKKyAgICByZXR1cm4gTm9uZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBsaXN0IG9mIG9wZXJhbmQgYnVuZGxlcyBhdHRhY2hlZCB0byB0aGlzIGluc3RydWN0aW9uIGFzCisgIC8vLyBhIHZlY3RvciBvZiBPcGVyYW5kQnVuZGxlRGVmcy4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGNvcGllcyB0aGUgT3BlcmFuZEJ1bmRlVXNlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcworICAvLy8gT3BlcmFuZEJ1bmRsZVVzZXIgdG8gYSB2ZWN0b3Igb2YgT3BlcmFuZEJ1bmRsZURlZnMuICBOb3RlOgorICAvLy8gT3BlcmFuZEJ1bmRlVXNlcyBhbmQgT3BlcmFuZEJ1bmRsZURlZnMgYXJlIG5vbi10cml2aWFsbHkgKmRpZmZlcmVudCoKKyAgLy8vIHJlcHJlc2VudGF0aW9ucyBvZiBvcGVyYW5kIGJ1bmRsZXMgKHNlZSBkb2N1bWVudGF0aW9uIGFib3ZlKS4KKyAgdm9pZCBnZXRPcGVyYW5kQnVuZGxlc0FzRGVmcyhTbWFsbFZlY3RvckltcGw8T3BlcmFuZEJ1bmRsZURlZj4gJkRlZnMpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZEJ1bmRsZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICBEZWZzLmVtcGxhY2VfYmFjayhnZXRPcGVyYW5kQnVuZGxlQXQoaSkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG9wZXJhbmQgYnVuZGxlIGZvciB0aGUgb3BlcmFuZCBhdCBpbmRleCBPcElkeC4KKyAgLy8vCisgIC8vLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgd2l0aCBhbiBPcElkeCB0aGF0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW4KKyAgLy8vIGJ1bmRsZSBvcGVyYW5kLgorICBPcGVyYW5kQnVuZGxlVXNlIGdldE9wZXJhbmRCdW5kbGVGb3JPcGVyYW5kKHVuc2lnbmVkIE9wSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIG9wZXJhbmRCdW5kbGVGcm9tQnVuZGxlT3BJbmZvKGdldEJ1bmRsZU9wSW5mb0Zvck9wZXJhbmQoT3BJZHgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBvcGVyYW5kIGJ1bmRsZSB1c2VyIGhhcyBvcGVyYW5kIGJ1bmRsZXMgdGhhdAorICAvLy8gbWF5IHJlYWQgZnJvbSB0aGUgaGVhcC4KKyAgYm9vbCBoYXNSZWFkaW5nT3BlcmFuZEJ1bmRsZXMoKSBjb25zdCB7CisgICAgLy8gSW1wbGVtZW50YXRpb24gbm90ZTogdGhpcyBpcyBhIGNvbnNlcnZhdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBvcGVyYW5kCisgICAgLy8gYnVuZGxlIHNlbWFudGljcywgd2hlcmUgKmFueSogb3BlcmFuZCBidW5kbGUgZm9yY2VzIGEgY2FsbHNpdGUgdG8gYmUgYXQKKyAgICAvLyBsZWFzdCByZWFkb25seS4KKyAgICByZXR1cm4gaGFzT3BlcmFuZEJ1bmRsZXMoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBvcGVyYW5kIGJ1bmRsZSB1c2VyIGhhcyBvcGVyYW5kIGJ1bmRsZXMgdGhhdAorICAvLy8gbWF5IHdyaXRlIHRvIHRoZSBoZWFwLgorICBib29sIGhhc0Nsb2JiZXJpbmdPcGVyYW5kQnVuZGxlcygpIGNvbnN0IHsKKyAgICBmb3IgKGF1dG8gJkJPSSA6IGJ1bmRsZV9vcF9pbmZvcygpKSB7CisgICAgICBpZiAoQk9JLlRhZy0+c2Vjb25kID09IExMVk1Db250ZXh0OjpPQl9kZW9wdCB8fAorICAgICAgICAgIEJPSS5UYWctPnNlY29uZCA9PSBMTFZNQ29udGV4dDo6T0JfZnVuY2xldCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIFRoaXMgaW5zdHJ1Y3Rpb24gaGFzIGFuIG9wZXJhbmQgYnVuZGxlIHRoYXQgaXMgbm90IGtub3duIHRvIHVzLgorICAgICAgLy8gQXNzdW1lIHRoZSB3b3JzdC4KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGJ1bmRsZSBvcGVyYW5kIGF0IGluZGV4IFxwIE9wSWR4IGhhcyB0aGUKKyAgLy8vIGF0dHJpYnV0ZSBccCBBLgorICBib29sIGJ1bmRsZU9wZXJhbmRIYXNBdHRyKHVuc2lnbmVkIE9wSWR4LCAgQXR0cmlidXRlOjpBdHRyS2luZCBBKSBjb25zdCB7CisgICAgYXV0byAmQk9JID0gZ2V0QnVuZGxlT3BJbmZvRm9yT3BlcmFuZChPcElkeCk7CisgICAgYXV0byBPQlUgPSBvcGVyYW5kQnVuZGxlRnJvbUJ1bmRsZU9wSW5mbyhCT0kpOworICAgIHJldHVybiBPQlUub3BlcmFuZEhhc0F0dHIoT3BJZHggLSBCT0kuQmVnaW4sIEEpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBccCBPdGhlciBoYXMgdGhlIHNhbWUgc2VxdWVuY2Ugb2Ygb3BlcmFuZCBidW5kbGUKKyAgLy8vIHRhZ3Mgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygb3BlcmFuZHMgb24gZWFjaCBvbmUgb2YgdGhlbSBhcyB0aGlzCisgIC8vLyBPcGVyYW5kQnVuZGxlVXNlci4KKyAgYm9vbCBoYXNJZGVudGljYWxPcGVyYW5kQnVuZGxlU2NoZW1hKAorICAgICAgY29uc3QgT3BlcmFuZEJ1bmRsZVVzZXI8SW5zdHJUeSwgT3BJdGVyYXRvclR5PiAmT3RoZXIpIGNvbnN0IHsKKyAgICBpZiAoZ2V0TnVtT3BlcmFuZEJ1bmRsZXMoKSAhPSBPdGhlci5nZXROdW1PcGVyYW5kQnVuZGxlcygpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHN0ZDo6ZXF1YWwoYnVuZGxlX29wX2luZm9fYmVnaW4oKSwgYnVuZGxlX29wX2luZm9fZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgT3RoZXIuYnVuZGxlX29wX2luZm9fYmVnaW4oKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgb3BlcmFuZCBidW5kbGUgdXNlciBjb250YWlucyBvcGVyYW5kIGJ1bmRsZXMKKyAgLy8vIHdpdGggdGFncyBvdGhlciB0aGFuIHRob3NlIHNwZWNpZmllZCBpbiBccCBJRHMuCisgIGJvb2wgaGFzT3BlcmFuZEJ1bmRsZXNPdGhlclRoYW4oQXJyYXlSZWY8dWludDMyX3Q+IElEcykgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kQnVuZGxlcygpOyBpICE9IGU7ICsraSkgeworICAgICAgdWludDMyX3QgSUQgPSBnZXRPcGVyYW5kQnVuZGxlQXQoaSkuZ2V0VGFnSUQoKTsKKyAgICAgIGlmICghaXNfY29udGFpbmVkKElEcywgSUQpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8vIFxicmllZiBJcyB0aGUgZnVuY3Rpb24gYXR0cmlidXRlIFMgZGlzYWxsb3dlZCBieSBzb21lIG9wZXJhbmQgYnVuZGxlIG9uCisgIC8vLyB0aGlzIG9wZXJhbmQgYnVuZGxlIHVzZXI/CisgIGJvb2wgaXNGbkF0dHJEaXNhbGxvd2VkQnlPcEJ1bmRsZShTdHJpbmdSZWYgUykgY29uc3QgeworICAgIC8vIE9wZXJhbmQgYnVuZGxlcyBvbmx5IHBvc3NpYmx5IGRpc2FsbG93IHJlYWRub25lLCByZWFkb25seSBhbmQgYXJnbWVub25seQorICAgIC8vIGF0dHJpYnV0ZXMuICBBbGwgU3RyaW5nIGF0dHJpYnV0ZXMgYXJlIGZpbmUuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBJcyB0aGUgZnVuY3Rpb24gYXR0cmlidXRlIEEgZGlzYWxsb3dlZCBieSBzb21lIG9wZXJhbmQgYnVuZGxlIG9uCisgIC8vLyB0aGlzIG9wZXJhbmQgYnVuZGxlIHVzZXI/CisgIGJvb2wgaXNGbkF0dHJEaXNhbGxvd2VkQnlPcEJ1bmRsZShBdHRyaWJ1dGU6OkF0dHJLaW5kIEEpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKEEpIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY2FzZSBBdHRyaWJ1dGU6OkluYWNjZXNzaWJsZU1lbU9yQXJnTWVtT25seToKKyAgICAgIHJldHVybiBoYXNSZWFkaW5nT3BlcmFuZEJ1bmRsZXMoKTsKKworICAgIGNhc2UgQXR0cmlidXRlOjpJbmFjY2Vzc2libGVNZW1Pbmx5OgorICAgICAgcmV0dXJuIGhhc1JlYWRpbmdPcGVyYW5kQnVuZGxlcygpOworCisgICAgY2FzZSBBdHRyaWJ1dGU6OkFyZ01lbU9ubHk6CisgICAgICByZXR1cm4gaGFzUmVhZGluZ09wZXJhbmRCdW5kbGVzKCk7CisKKyAgICBjYXNlIEF0dHJpYnV0ZTo6UmVhZE5vbmU6CisgICAgICByZXR1cm4gaGFzUmVhZGluZ09wZXJhbmRCdW5kbGVzKCk7CisKKyAgICBjYXNlIEF0dHJpYnV0ZTo6UmVhZE9ubHk6CisgICAgICByZXR1cm4gaGFzQ2xvYmJlcmluZ09wZXJhbmRCdW5kbGVzKCk7CisgICAgfQorCisgICAgbGx2bV91bnJlYWNoYWJsZSgic3dpdGNoIGhhcyBhIGRlZmF1bHQgY2FzZSEiKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVXNlZCB0byBrZWVwIHRyYWNrIG9mIGFuIG9wZXJhbmQgYnVuZGxlLiAgU2VlIHRoZSBtYWluIGNvbW1lbnQgb24KKyAgLy8vIE9wZXJhbmRCdW5kbGVVc2VyIGFib3ZlLgorICBzdHJ1Y3QgQnVuZGxlT3BJbmZvIHsKKyAgICAvLy8gXGJyaWVmIFRoZSBvcGVyYW5kIGJ1bmRsZSB0YWcsIGludGVybmVkIGJ5CisgICAgLy8vIExMVk1Db250ZXh0SW1wbDo6Z2V0T3JJbnNlcnRCdW5kbGVUYWcuCisgICAgU3RyaW5nTWFwRW50cnk8dWludDMyX3Q+ICpUYWc7CisKKyAgICAvLy8gXGJyaWVmIFRoZSBpbmRleCBpbiB0aGUgVXNlJiB2ZWN0b3Igd2hlcmUgb3BlcmFuZHMgZm9yIHRoaXMgb3BlcmFuZAorICAgIC8vLyBidW5kbGUgc3RhcnRzLgorICAgIHVpbnQzMl90IEJlZ2luOworCisgICAgLy8vIFxicmllZiBUaGUgaW5kZXggaW4gdGhlIFVzZSYgdmVjdG9yIHdoZXJlIG9wZXJhbmRzIGZvciB0aGlzIG9wZXJhbmQKKyAgICAvLy8gYnVuZGxlIGVuZHMuCisgICAgdWludDMyX3QgRW5kOworCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEJ1bmRsZU9wSW5mbyAmT3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBUYWcgPT0gT3RoZXIuVGFnICYmIEJlZ2luID09IE90aGVyLkJlZ2luICYmIEVuZCA9PSBPdGhlci5FbmQ7CisgICAgfQorICB9OworCisgIC8vLyBcYnJpZWYgU2ltcGxlIGhlbHBlciBmdW5jdGlvbiB0byBtYXAgYSBCdW5kbGVPcEluZm8gdG8gYW4KKyAgLy8vIE9wZXJhbmRCdW5kbGVVc2UuCisgIE9wZXJhbmRCdW5kbGVVc2UKKyAgb3BlcmFuZEJ1bmRsZUZyb21CdW5kbGVPcEluZm8oY29uc3QgQnVuZGxlT3BJbmZvICZCT0kpIGNvbnN0IHsKKyAgICBhdXRvIG9wX2JlZ2luID0gc3RhdGljX2Nhc3Q8Y29uc3QgSW5zdHJUeSAqPih0aGlzKS0+b3BfYmVnaW4oKTsKKyAgICBBcnJheVJlZjxVc2U+IElucHV0cyhvcF9iZWdpbiArIEJPSS5CZWdpbiwgb3BfYmVnaW4gKyBCT0kuRW5kKTsKKyAgICByZXR1cm4gT3BlcmFuZEJ1bmRsZVVzZShCT0kuVGFnLCBJbnB1dHMpOworICB9CisKKyAgdXNpbmcgYnVuZGxlX29wX2l0ZXJhdG9yID0gQnVuZGxlT3BJbmZvICo7CisgIHVzaW5nIGNvbnN0X2J1bmRsZV9vcF9pdGVyYXRvciA9IGNvbnN0IEJ1bmRsZU9wSW5mbyAqOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzdGFydCBvZiB0aGUgbGlzdCBvZiBCdW5kbGVPcEluZm8gaW5zdGFuY2VzIGFzc29jaWF0ZWQKKyAgLy8vIHdpdGggdGhpcyBPcGVyYW5kQnVuZGxlVXNlci4KKyAgYnVuZGxlX29wX2l0ZXJhdG9yIGJ1bmRsZV9vcF9pbmZvX2JlZ2luKCkgeworICAgIGlmICghc3RhdGljX2Nhc3Q8SW5zdHJUeSAqPih0aGlzKS0+aGFzRGVzY3JpcHRvcigpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICB1aW50OF90ICpCeXRlc0JlZ2luID0gc3RhdGljX2Nhc3Q8SW5zdHJUeSAqPih0aGlzKS0+Z2V0RGVzY3JpcHRvcigpLmJlZ2luKCk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8YnVuZGxlX29wX2l0ZXJhdG9yPihCeXRlc0JlZ2luKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzdGFydCBvZiB0aGUgbGlzdCBvZiBCdW5kbGVPcEluZm8gaW5zdGFuY2VzIGFzc29jaWF0ZWQKKyAgLy8vIHdpdGggdGhpcyBPcGVyYW5kQnVuZGxlVXNlci4KKyAgY29uc3RfYnVuZGxlX29wX2l0ZXJhdG9yIGJ1bmRsZV9vcF9pbmZvX2JlZ2luKCkgY29uc3QgeworICAgIGF1dG8gKk5vbkNvbnN0VGhpcyA9CisgICAgICAgIGNvbnN0X2Nhc3Q8T3BlcmFuZEJ1bmRsZVVzZXI8SW5zdHJUeSwgT3BJdGVyYXRvclR5PiAqPih0aGlzKTsKKyAgICByZXR1cm4gTm9uQ29uc3RUaGlzLT5idW5kbGVfb3BfaW5mb19iZWdpbigpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiBCdW5kbGVPcEluZm8gaW5zdGFuY2VzIGFzc29jaWF0ZWQKKyAgLy8vIHdpdGggdGhpcyBPcGVyYW5kQnVuZGxlVXNlci4KKyAgYnVuZGxlX29wX2l0ZXJhdG9yIGJ1bmRsZV9vcF9pbmZvX2VuZCgpIHsKKyAgICBpZiAoIXN0YXRpY19jYXN0PEluc3RyVHkgKj4odGhpcyktPmhhc0Rlc2NyaXB0b3IoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgdWludDhfdCAqQnl0ZXNFbmQgPSBzdGF0aWNfY2FzdDxJbnN0clR5ICo+KHRoaXMpLT5nZXREZXNjcmlwdG9yKCkuZW5kKCk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8YnVuZGxlX29wX2l0ZXJhdG9yPihCeXRlc0VuZCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIEJ1bmRsZU9wSW5mbyBpbnN0YW5jZXMgYXNzb2NpYXRlZAorICAvLy8gd2l0aCB0aGlzIE9wZXJhbmRCdW5kbGVVc2VyLgorICBjb25zdF9idW5kbGVfb3BfaXRlcmF0b3IgYnVuZGxlX29wX2luZm9fZW5kKCkgY29uc3QgeworICAgIGF1dG8gKk5vbkNvbnN0VGhpcyA9CisgICAgICAgIGNvbnN0X2Nhc3Q8T3BlcmFuZEJ1bmRsZVVzZXI8SW5zdHJUeSwgT3BJdGVyYXRvclR5PiAqPih0aGlzKTsKKyAgICByZXR1cm4gTm9uQ29uc3RUaGlzLT5idW5kbGVfb3BfaW5mb19lbmQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSByYW5nZSBbXHAgYnVuZGxlX29wX2luZm9fYmVnaW4sIFxwIGJ1bmRsZV9vcF9pbmZvX2VuZCkuCisgIGl0ZXJhdG9yX3JhbmdlPGJ1bmRsZV9vcF9pdGVyYXRvcj4gYnVuZGxlX29wX2luZm9zKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGJ1bmRsZV9vcF9pbmZvX2JlZ2luKCksIGJ1bmRsZV9vcF9pbmZvX2VuZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSByYW5nZSBbXHAgYnVuZGxlX29wX2luZm9fYmVnaW4sIFxwIGJ1bmRsZV9vcF9pbmZvX2VuZCkuCisgIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X2J1bmRsZV9vcF9pdGVyYXRvcj4gYnVuZGxlX29wX2luZm9zKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGJ1bmRsZV9vcF9pbmZvX2JlZ2luKCksIGJ1bmRsZV9vcF9pbmZvX2VuZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUG9wdWxhdGUgdGhlIEJ1bmRsZU9wSW5mbyBpbnN0YW5jZXMgYW5kIHRoZSBVc2UmIHZlY3RvciBmcm9tIFxwCisgIC8vLyBCdW5kbGVzLiAgUmV0dXJuIHRoZSBvcF9pdGVyYXRvciBwb2ludGluZyB0byB0aGUgVXNlJiBvbmUgcGFzdCB0aGUgbGFzdAorICAvLy8gbGFzdCBidW5kbGUgb3BlcmFuZCB1c2UuCisgIC8vLworICAvLy8gRWFjaCBccCBPcGVyYW5kQnVuZGxlRGVmIGluc3RhbmNlIGlzIHRyYWNrZWQgYnkgYSBPcGVyYW5kQnVuZGxlSW5mbworICAvLy8gaW5zdGFuY2UgYWxsb2NhdGVkIGluIHRoaXMgVXNlcidzIGRlc2NyaXB0b3IuCisgIE9wSXRlcmF0b3JUeSBwb3B1bGF0ZUJ1bmRsZU9wZXJhbmRJbmZvcyhBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgQmVnaW5JbmRleCkgeworICAgIGF1dG8gSXQgPSBzdGF0aWNfY2FzdDxJbnN0clR5ICo+KHRoaXMpLT5vcF9iZWdpbigpICsgQmVnaW5JbmRleDsKKyAgICBmb3IgKGF1dG8gJkIgOiBCdW5kbGVzKQorICAgICAgSXQgPSBzdGQ6OmNvcHkoQi5pbnB1dF9iZWdpbigpLCBCLmlucHV0X2VuZCgpLCBJdCk7CisKKyAgICBhdXRvICpDb250ZXh0SW1wbCA9IHN0YXRpY19jYXN0PEluc3RyVHkgKj4odGhpcyktPmdldENvbnRleHQoKS5wSW1wbDsKKyAgICBhdXRvIEJJID0gQnVuZGxlcy5iZWdpbigpOworICAgIHVuc2lnbmVkIEN1cnJlbnRJbmRleCA9IEJlZ2luSW5kZXg7CisKKyAgICBmb3IgKGF1dG8gJkJPSSA6IGJ1bmRsZV9vcF9pbmZvcygpKSB7CisgICAgICBhc3NlcnQoQkkgIT0gQnVuZGxlcy5lbmQoKSAmJiAiSW5jb3JyZWN0IGFsbG9jYXRpb24/Iik7CisKKyAgICAgIEJPSS5UYWcgPSBDb250ZXh0SW1wbC0+Z2V0T3JJbnNlcnRCdW5kbGVUYWcoQkktPmdldFRhZygpKTsKKyAgICAgIEJPSS5CZWdpbiA9IEN1cnJlbnRJbmRleDsKKyAgICAgIEJPSS5FbmQgPSBDdXJyZW50SW5kZXggKyBCSS0+aW5wdXRfc2l6ZSgpOworICAgICAgQ3VycmVudEluZGV4ID0gQk9JLkVuZDsKKyAgICAgIEJJKys7CisgICAgfQorCisgICAgYXNzZXJ0KEJJID09IEJ1bmRsZXMuZW5kKCkgJiYgIkluY29ycmVjdCBhbGxvY2F0aW9uPyIpOworCisgICAgcmV0dXJuIEl0OworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIEJ1bmRsZU9wSW5mbyBmb3IgdGhlIG9wZXJhbmQgYXQgaW5kZXggT3BJZHguCisgIC8vLworICAvLy8gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIHdpdGggYW4gT3BJZHggdGhhdCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFuCisgIC8vLyBidW5kbGUgb3BlcmFuZC4KKyAgY29uc3QgQnVuZGxlT3BJbmZvICZnZXRCdW5kbGVPcEluZm9Gb3JPcGVyYW5kKHVuc2lnbmVkIE9wSWR4KSBjb25zdCB7CisgICAgZm9yIChhdXRvICZCT0kgOiBidW5kbGVfb3BfaW5mb3MoKSkKKyAgICAgIGlmIChCT0kuQmVnaW4gPD0gT3BJZHggJiYgT3BJZHggPCBCT0kuRW5kKQorICAgICAgICByZXR1cm4gQk9JOworCisgICAgbGx2bV91bnJlYWNoYWJsZSgiRGlkIG5vdCBmaW5kIG9wZXJhbmQgYnVuZGxlIGZvciBvcGVyYW5kISIpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiB2YWx1ZXMgdXNlZCBpbiBccCBCdW5kbGVzLgorICBzdGF0aWMgdW5zaWduZWQgQ291bnRCdW5kbGVJbnB1dHMoQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcykgeworICAgIHVuc2lnbmVkIFRvdGFsID0gMDsKKyAgICBmb3IgKGF1dG8gJkIgOiBCdW5kbGVzKQorICAgICAgVG90YWwgKz0gQi5pbnB1dF9zaXplKCk7CisgICAgcmV0dXJuIFRvdGFsOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9JTlNUUlRZUEVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW5zdHJ1Y3Rpb24uZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnN0cnVjdGlvbi5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY2MTcyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW5zdHJ1Y3Rpb24uZGVmCkBAIC0wLDAgKzEsMjMxIEBACisvLz09PS0tIGxsdm0vSW5zdHJ1Y3Rpb24uZGVmIC0gRmlsZSB0aGF0IGRlc2NyaWJlcyBJbnN0cnVjdGlvbnMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBkZXNjcmlwdGlvbnMgb2YgdGhlIHZhcmlvdXMgTExWTSBpbnN0cnVjdGlvbnMuICBUaGlzIGlzCisvLyB1c2VkIGFzIGEgY2VudHJhbCBwbGFjZSBmb3IgZW51bWVyYXRpbmcgdGhlIGRpZmZlcmVudCBpbnN0cnVjdGlvbnMgYW5kCisvLyBzaG91bGQgZXZlbnR1YWxseSBiZSB0aGUgcGxhY2UgdG8gcHV0IGNvbW1lbnRzIGFib3V0IHRoZSBpbnN0cnVjdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gTk9URTogTk8gSU5DTFVERSBHVUFSRCBERVNJUkVEIQorCisvLyBQcm92aWRlIGRlZmluaXRpb25zIG9mIG1hY3JvcyBzbyB0aGF0IHVzZXJzIG9mIHRoaXMgZmlsZSBkbyBub3QgaGF2ZSB0bworLy8gZGVmaW5lIGV2ZXJ5dGhpbmcgdG8gdXNlIGl0Li4uCisvLworI2lmbmRlZiBGSVJTVF9URVJNX0lOU1QKKyNkZWZpbmUgRklSU1RfVEVSTV9JTlNUKG51bSkKKyNlbmRpZgorI2lmbmRlZiBIQU5ETEVfVEVSTV9JTlNUCisjaWZuZGVmIEhBTkRMRV9JTlNUCisjZGVmaW5lIEhBTkRMRV9URVJNX0lOU1QobnVtLCBvcGNvZGUsIENsYXNzKQorI2Vsc2UKKyNkZWZpbmUgSEFORExFX1RFUk1fSU5TVChudW0sIG9wY29kZSwgQ2xhc3MpIEhBTkRMRV9JTlNUKG51bSwgb3Bjb2RlLCBDbGFzcykKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIExBU1RfVEVSTV9JTlNUCisjZGVmaW5lIExBU1RfVEVSTV9JTlNUKG51bSkKKyNlbmRpZgorCisjaWZuZGVmIEZJUlNUX0JJTkFSWV9JTlNUCisjZGVmaW5lIEZJUlNUX0JJTkFSWV9JTlNUKG51bSkKKyNlbmRpZgorI2lmbmRlZiBIQU5ETEVfQklOQVJZX0lOU1QKKyNpZm5kZWYgSEFORExFX0lOU1QKKyNkZWZpbmUgSEFORExFX0JJTkFSWV9JTlNUKG51bSwgb3Bjb2RlLCBpbnN0Y2xhc3MpCisjZWxzZQorI2RlZmluZSBIQU5ETEVfQklOQVJZX0lOU1QobnVtLCBvcGNvZGUsIENsYXNzKSBIQU5ETEVfSU5TVChudW0sIG9wY29kZSwgQ2xhc3MpCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMQVNUX0JJTkFSWV9JTlNUCisjZGVmaW5lIExBU1RfQklOQVJZX0lOU1QobnVtKQorI2VuZGlmCisKKyNpZm5kZWYgRklSU1RfTUVNT1JZX0lOU1QKKyNkZWZpbmUgRklSU1RfTUVNT1JZX0lOU1QobnVtKQorI2VuZGlmCisjaWZuZGVmIEhBTkRMRV9NRU1PUllfSU5TVAorI2lmbmRlZiBIQU5ETEVfSU5TVAorI2RlZmluZSBIQU5ETEVfTUVNT1JZX0lOU1QobnVtLCBvcGNvZGUsIENsYXNzKQorI2Vsc2UKKyNkZWZpbmUgSEFORExFX01FTU9SWV9JTlNUKG51bSwgb3Bjb2RlLCBDbGFzcykgSEFORExFX0lOU1QobnVtLCBvcGNvZGUsIENsYXNzKQorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgTEFTVF9NRU1PUllfSU5TVAorI2RlZmluZSBMQVNUX01FTU9SWV9JTlNUKG51bSkKKyNlbmRpZgorCisjaWZuZGVmIEZJUlNUX0NBU1RfSU5TVAorI2RlZmluZSBGSVJTVF9DQVNUX0lOU1QobnVtKQorI2VuZGlmCisjaWZuZGVmIEhBTkRMRV9DQVNUX0lOU1QKKyNpZm5kZWYgSEFORExFX0lOU1QKKyNkZWZpbmUgSEFORExFX0NBU1RfSU5TVChudW0sIG9wY29kZSwgQ2xhc3MpCisjZWxzZQorI2RlZmluZSBIQU5ETEVfQ0FTVF9JTlNUKG51bSwgb3Bjb2RlLCBDbGFzcykgSEFORExFX0lOU1QobnVtLCBvcGNvZGUsIENsYXNzKQorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgTEFTVF9DQVNUX0lOU1QKKyNkZWZpbmUgTEFTVF9DQVNUX0lOU1QobnVtKQorI2VuZGlmCisKKyNpZm5kZWYgRklSU1RfRlVOQ0xFVFBBRF9JTlNUCisjZGVmaW5lIEZJUlNUX0ZVTkNMRVRQQURfSU5TVChudW0pCisjZW5kaWYKKyNpZm5kZWYgSEFORExFX0ZVTkNMRVRQQURfSU5TVAorI2lmbmRlZiBIQU5ETEVfSU5TVAorI2RlZmluZSBIQU5ETEVfRlVOQ0xFVFBBRF9JTlNUKG51bSwgb3Bjb2RlLCBDbGFzcykKKyNlbHNlCisjZGVmaW5lIEhBTkRMRV9GVU5DTEVUUEFEX0lOU1QobnVtLCBvcGNvZGUsIENsYXNzKSBIQU5ETEVfSU5TVChudW0sIG9wY29kZSwgQ2xhc3MpCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMQVNUX0ZVTkNMRVRQQURfSU5TVAorI2RlZmluZSBMQVNUX0ZVTkNMRVRQQURfSU5TVChudW0pCisjZW5kaWYKKworI2lmbmRlZiBGSVJTVF9PVEhFUl9JTlNUCisjZGVmaW5lIEZJUlNUX09USEVSX0lOU1QobnVtKQorI2VuZGlmCisjaWZuZGVmIEhBTkRMRV9PVEhFUl9JTlNUCisjaWZuZGVmIEhBTkRMRV9JTlNUCisjZGVmaW5lIEhBTkRMRV9PVEhFUl9JTlNUKG51bSwgb3Bjb2RlLCBDbGFzcykKKyNlbHNlCisjZGVmaW5lIEhBTkRMRV9PVEhFUl9JTlNUKG51bSwgb3Bjb2RlLCBDbGFzcykgSEFORExFX0lOU1QobnVtLCBvcGNvZGUsIENsYXNzKQorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgTEFTVF9PVEhFUl9JTlNUCisjZGVmaW5lIExBU1RfT1RIRVJfSU5TVChudW0pCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfVVNFUl9JTlNUCisjZGVmaW5lIEhBTkRMRV9VU0VSX0lOU1QobnVtLCBvcGMsIENsYXNzKSBIQU5ETEVfT1RIRVJfSU5TVChudW0sIG9wYywgQ2xhc3MpCisjZW5kaWYKKworLy8gVGVybWluYXRvciBJbnN0cnVjdGlvbnMgLSBUaGVzZSBpbnN0cnVjdGlvbnMgYXJlIHVzZWQgdG8gdGVybWluYXRlIGEgYmFzaWMKKy8vIGJsb2NrIG9mIHRoZSBwcm9ncmFtLiAgIEV2ZXJ5IGJhc2ljIGJsb2NrIG11c3QgZW5kIHdpdGggb25lIG9mIHRoZXNlCisvLyBpbnN0cnVjdGlvbnMgZm9yIGl0IHRvIGJlIGEgd2VsbCBmb3JtZWQgYmFzaWMgYmxvY2suCisvLworIEZJUlNUX1RFUk1fSU5TVCAgKCAxKQorSEFORExFX1RFUk1fSU5TVCAgKCAxLCBSZXQgICAgICAgICAgICwgUmV0dXJuSW5zdCkKK0hBTkRMRV9URVJNX0lOU1QgICggMiwgQnIgICAgICAgICAgICAsIEJyYW5jaEluc3QpCitIQU5ETEVfVEVSTV9JTlNUICAoIDMsIFN3aXRjaCAgICAgICAgLCBTd2l0Y2hJbnN0KQorSEFORExFX1RFUk1fSU5TVCAgKCA0LCBJbmRpcmVjdEJyICAgICwgSW5kaXJlY3RCckluc3QpCitIQU5ETEVfVEVSTV9JTlNUICAoIDUsIEludm9rZSAgICAgICAgLCBJbnZva2VJbnN0KQorSEFORExFX1RFUk1fSU5TVCAgKCA2LCBSZXN1bWUgICAgICAgICwgUmVzdW1lSW5zdCkKK0hBTkRMRV9URVJNX0lOU1QgICggNywgVW5yZWFjaGFibGUgICAsIFVucmVhY2hhYmxlSW5zdCkKK0hBTkRMRV9URVJNX0lOU1QgICggOCwgQ2xlYW51cFJldCAgICAsIENsZWFudXBSZXR1cm5JbnN0KQorSEFORExFX1RFUk1fSU5TVCAgKCA5LCBDYXRjaFJldCAgICAgICwgQ2F0Y2hSZXR1cm5JbnN0KQorSEFORExFX1RFUk1fSU5TVCAgKDEwLCBDYXRjaFN3aXRjaCAgICwgQ2F0Y2hTd2l0Y2hJbnN0KQorICBMQVNUX1RFUk1fSU5TVCAgKDEwKQorCisvLyBTdGFuZGFyZCBiaW5hcnkgb3BlcmF0b3JzLi4uCisgRklSU1RfQklOQVJZX0lOU1QoMTEpCitIQU5ETEVfQklOQVJZX0lOU1QoMTEsIEFkZCAgLCBCaW5hcnlPcGVyYXRvcikKK0hBTkRMRV9CSU5BUllfSU5TVCgxMiwgRkFkZCAsIEJpbmFyeU9wZXJhdG9yKQorSEFORExFX0JJTkFSWV9JTlNUKDEzLCBTdWIgICwgQmluYXJ5T3BlcmF0b3IpCitIQU5ETEVfQklOQVJZX0lOU1QoMTQsIEZTdWIgLCBCaW5hcnlPcGVyYXRvcikKK0hBTkRMRV9CSU5BUllfSU5TVCgxNSwgTXVsICAsIEJpbmFyeU9wZXJhdG9yKQorSEFORExFX0JJTkFSWV9JTlNUKDE2LCBGTXVsICwgQmluYXJ5T3BlcmF0b3IpCitIQU5ETEVfQklOQVJZX0lOU1QoMTcsIFVEaXYgLCBCaW5hcnlPcGVyYXRvcikKK0hBTkRMRV9CSU5BUllfSU5TVCgxOCwgU0RpdiAsIEJpbmFyeU9wZXJhdG9yKQorSEFORExFX0JJTkFSWV9JTlNUKDE5LCBGRGl2ICwgQmluYXJ5T3BlcmF0b3IpCitIQU5ETEVfQklOQVJZX0lOU1QoMjAsIFVSZW0gLCBCaW5hcnlPcGVyYXRvcikKK0hBTkRMRV9CSU5BUllfSU5TVCgyMSwgU1JlbSAsIEJpbmFyeU9wZXJhdG9yKQorSEFORExFX0JJTkFSWV9JTlNUKDIyLCBGUmVtICwgQmluYXJ5T3BlcmF0b3IpCisKKy8vIExvZ2ljYWwgb3BlcmF0b3JzIChpbnRlZ2VyIG9wZXJhbmRzKQorSEFORExFX0JJTkFSWV9JTlNUKDIzLCBTaGwgICwgQmluYXJ5T3BlcmF0b3IpIC8vIFNoaWZ0IGxlZnQgIChsb2dpY2FsKQorSEFORExFX0JJTkFSWV9JTlNUKDI0LCBMU2hyICwgQmluYXJ5T3BlcmF0b3IpIC8vIFNoaWZ0IHJpZ2h0IChsb2dpY2FsKQorSEFORExFX0JJTkFSWV9JTlNUKDI1LCBBU2hyICwgQmluYXJ5T3BlcmF0b3IpIC8vIFNoaWZ0IHJpZ2h0IChhcml0aG1ldGljKQorSEFORExFX0JJTkFSWV9JTlNUKDI2LCBBbmQgICwgQmluYXJ5T3BlcmF0b3IpCitIQU5ETEVfQklOQVJZX0lOU1QoMjcsIE9yICAgLCBCaW5hcnlPcGVyYXRvcikKK0hBTkRMRV9CSU5BUllfSU5TVCgyOCwgWG9yICAsIEJpbmFyeU9wZXJhdG9yKQorICBMQVNUX0JJTkFSWV9JTlNUKDI4KQorCisvLyBNZW1vcnkgb3BlcmF0b3JzLi4uCisgRklSU1RfTUVNT1JZX0lOU1QoMjkpCitIQU5ETEVfTUVNT1JZX0lOU1QoMjksIEFsbG9jYSwgQWxsb2NhSW5zdCkgIC8vIFN0YWNrIG1hbmFnZW1lbnQKK0hBTkRMRV9NRU1PUllfSU5TVCgzMCwgTG9hZCAgLCBMb2FkSW5zdCAgKSAgLy8gTWVtb3J5IG1hbmlwdWxhdGlvbiBpbnN0cnMKK0hBTkRMRV9NRU1PUllfSU5TVCgzMSwgU3RvcmUgLCBTdG9yZUluc3QgKQorSEFORExFX01FTU9SWV9JTlNUKDMyLCBHZXRFbGVtZW50UHRyLCBHZXRFbGVtZW50UHRySW5zdCkKK0hBTkRMRV9NRU1PUllfSU5TVCgzMywgRmVuY2UgLCBGZW5jZUluc3QgKQorSEFORExFX01FTU9SWV9JTlNUKDM0LCBBdG9taWNDbXBYY2hnICwgQXRvbWljQ21wWGNoZ0luc3QgKQorSEFORExFX01FTU9SWV9JTlNUKDM1LCBBdG9taWNSTVcgLCBBdG9taWNSTVdJbnN0ICkKKyAgTEFTVF9NRU1PUllfSU5TVCgzNSkKKworLy8gQ2FzdCBvcGVyYXRvcnMgLi4uCisvLyBOT1RFOiBUaGUgb3JkZXIgbWF0dGVycyBoZXJlIGJlY2F1c2UgQ2FzdEluc3Q6OmlzRWxpbWluYWJsZUNhc3RQYWlyCisvLyBOT1RFOiAoc2VlIEluc3RydWN0aW9ucy5jcHApIGVuY29kZXMgYSB0YWJsZSBiYXNlZCBvbiB0aGlzIG9yZGVyaW5nLgorIEZJUlNUX0NBU1RfSU5TVCgzNikKK0hBTkRMRV9DQVNUX0lOU1QoMzYsIFRydW5jICAgLCBUcnVuY0luc3QgICApICAvLyBUcnVuY2F0ZSBpbnRlZ2VycworSEFORExFX0NBU1RfSU5TVCgzNywgWkV4dCAgICAsIFpFeHRJbnN0ICAgICkgIC8vIFplcm8gZXh0ZW5kIGludGVnZXJzCitIQU5ETEVfQ0FTVF9JTlNUKDM4LCBTRXh0ICAgICwgU0V4dEluc3QgICAgKSAgLy8gU2lnbiBleHRlbmQgaW50ZWdlcnMKK0hBTkRMRV9DQVNUX0lOU1QoMzksIEZQVG9VSSAgLCBGUFRvVUlJbnN0ICApICAvLyBmbG9hdGluZyBwb2ludCAtPiBVSW50CitIQU5ETEVfQ0FTVF9JTlNUKDQwLCBGUFRvU0kgICwgRlBUb1NJSW5zdCAgKSAgLy8gZmxvYXRpbmcgcG9pbnQgLT4gU0ludAorSEFORExFX0NBU1RfSU5TVCg0MSwgVUlUb0ZQICAsIFVJVG9GUEluc3QgICkgIC8vIFVJbnQgLT4gZmxvYXRpbmcgcG9pbnQKK0hBTkRMRV9DQVNUX0lOU1QoNDIsIFNJVG9GUCAgLCBTSVRvRlBJbnN0ICApICAvLyBTSW50IC0+IGZsb2F0aW5nIHBvaW50CitIQU5ETEVfQ0FTVF9JTlNUKDQzLCBGUFRydW5jICwgRlBUcnVuY0luc3QgKSAgLy8gVHJ1bmNhdGUgZmxvYXRpbmcgcG9pbnQKK0hBTkRMRV9DQVNUX0lOU1QoNDQsIEZQRXh0ICAgLCBGUEV4dEluc3QgICApICAvLyBFeHRlbmQgZmxvYXRpbmcgcG9pbnQKK0hBTkRMRV9DQVNUX0lOU1QoNDUsIFB0clRvSW50LCBQdHJUb0ludEluc3QpICAvLyBQb2ludGVyIC0+IEludGVnZXIKK0hBTkRMRV9DQVNUX0lOU1QoNDYsIEludFRvUHRyLCBJbnRUb1B0ckluc3QpICAvLyBJbnRlZ2VyIC0+IFBvaW50ZXIKK0hBTkRMRV9DQVNUX0lOU1QoNDcsIEJpdENhc3QgLCBCaXRDYXN0SW5zdCApICAvLyBUeXBlIGNhc3QKK0hBTkRMRV9DQVNUX0lOU1QoNDgsIEFkZHJTcGFjZUNhc3QsIEFkZHJTcGFjZUNhc3RJbnN0KSAgLy8gYWRkcnNwYWNlIGNhc3QKKyAgTEFTVF9DQVNUX0lOU1QoNDgpCisKKyBGSVJTVF9GVU5DTEVUUEFEX0lOU1QoNDkpCitIQU5ETEVfRlVOQ0xFVFBBRF9JTlNUKDQ5LCBDbGVhbnVwUGFkLCBDbGVhbnVwUGFkSW5zdCkKK0hBTkRMRV9GVU5DTEVUUEFEX0lOU1QoNTAsIENhdGNoUGFkICAsIENhdGNoUGFkSW5zdCkKKyAgTEFTVF9GVU5DTEVUUEFEX0lOU1QoNTApCisKKy8vIE90aGVyIG9wZXJhdG9ycy4uLgorIEZJUlNUX09USEVSX0lOU1QoNTEpCitIQU5ETEVfT1RIRVJfSU5TVCg1MSwgSUNtcCAgICwgSUNtcEluc3QgICApICAvLyBJbnRlZ2VyIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb24KK0hBTkRMRV9PVEhFUl9JTlNUKDUyLCBGQ21wICAgLCBGQ21wSW5zdCAgICkgIC8vIEZsb2F0aW5nIHBvaW50IGNvbXBhcmlzb24gaW5zdHIuCitIQU5ETEVfT1RIRVJfSU5TVCg1MywgUEhJICAgICwgUEhJTm9kZSAgICApICAvLyBQSEkgbm9kZSBpbnN0cnVjdGlvbgorSEFORExFX09USEVSX0lOU1QoNTQsIENhbGwgICAsIENhbGxJbnN0ICAgKSAgLy8gQ2FsbCBhIGZ1bmN0aW9uCitIQU5ETEVfT1RIRVJfSU5TVCg1NSwgU2VsZWN0ICwgU2VsZWN0SW5zdCApICAvLyBzZWxlY3QgaW5zdHJ1Y3Rpb24KK0hBTkRMRV9VU0VSX0lOU1QgKDU2LCBVc2VyT3AxLCBJbnN0cnVjdGlvbikgIC8vIE1heSBiZSB1c2VkIGludGVybmFsbHkgaW4gYSBwYXNzCitIQU5ETEVfVVNFUl9JTlNUICg1NywgVXNlck9wMiwgSW5zdHJ1Y3Rpb24pICAvLyBJbnRlcm5hbCB0byBwYXNzZXMgb25seQorSEFORExFX09USEVSX0lOU1QoNTgsIFZBQXJnICAsIFZBQXJnSW5zdCAgKSAgLy8gdmFhcmcgaW5zdHJ1Y3Rpb24KK0hBTkRMRV9PVEhFUl9JTlNUKDU5LCBFeHRyYWN0RWxlbWVudCwgRXh0cmFjdEVsZW1lbnRJbnN0KS8vIGV4dHJhY3QgZnJvbSB2ZWN0b3IKK0hBTkRMRV9PVEhFUl9JTlNUKDYwLCBJbnNlcnRFbGVtZW50LCBJbnNlcnRFbGVtZW50SW5zdCkgIC8vIGluc2VydCBpbnRvIHZlY3RvcgorSEFORExFX09USEVSX0lOU1QoNjEsIFNodWZmbGVWZWN0b3IsIFNodWZmbGVWZWN0b3JJbnN0KSAgLy8gc2h1ZmZsZSB0d28gdmVjdG9ycy4KK0hBTkRMRV9PVEhFUl9JTlNUKDYyLCBFeHRyYWN0VmFsdWUsIEV4dHJhY3RWYWx1ZUluc3QpLy8gZXh0cmFjdCBmcm9tIGFnZ3JlZ2F0ZQorSEFORExFX09USEVSX0lOU1QoNjMsIEluc2VydFZhbHVlLCBJbnNlcnRWYWx1ZUluc3QpICAvLyBpbnNlcnQgaW50byBhZ2dyZWdhdGUKK0hBTkRMRV9PVEhFUl9JTlNUKDY0LCBMYW5kaW5nUGFkLCBMYW5kaW5nUGFkSW5zdCkgIC8vIExhbmRpbmcgcGFkIGluc3RydWN0aW9uLgorICBMQVNUX09USEVSX0lOU1QoNjQpCisKKyN1bmRlZiAgRklSU1RfVEVSTV9JTlNUCisjdW5kZWYgSEFORExFX1RFUk1fSU5TVAorI3VuZGVmICAgTEFTVF9URVJNX0lOU1QKKworI3VuZGVmICBGSVJTVF9CSU5BUllfSU5TVAorI3VuZGVmIEhBTkRMRV9CSU5BUllfSU5TVAorI3VuZGVmICAgTEFTVF9CSU5BUllfSU5TVAorCisjdW5kZWYgIEZJUlNUX01FTU9SWV9JTlNUCisjdW5kZWYgSEFORExFX01FTU9SWV9JTlNUCisjdW5kZWYgICBMQVNUX01FTU9SWV9JTlNUCisKKyN1bmRlZiAgRklSU1RfQ0FTVF9JTlNUCisjdW5kZWYgSEFORExFX0NBU1RfSU5TVAorI3VuZGVmICAgTEFTVF9DQVNUX0lOU1QKKworI3VuZGVmICBGSVJTVF9GVU5DTEVUUEFEX0lOU1QKKyN1bmRlZiBIQU5ETEVfRlVOQ0xFVFBBRF9JTlNUCisjdW5kZWYgICBMQVNUX0ZVTkNMRVRQQURfSU5TVAorCisjdW5kZWYgIEZJUlNUX09USEVSX0lOU1QKKyN1bmRlZiBIQU5ETEVfT1RIRVJfSU5TVAorI3VuZGVmICAgTEFTVF9PVEhFUl9JTlNUCisKKyN1bmRlZiBIQU5ETEVfVVNFUl9JTlNUCisKKyNpZmRlZiBIQU5ETEVfSU5TVAorI3VuZGVmIEhBTkRMRV9JTlNUCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW5zdHJ1Y3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW5zdHJ1Y3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmJjNDAxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnN0cnVjdGlvbi5oCkBAIC0wLDAgKzEsNzAyIEBACisvLz09PS0tIGxsdm0vSW5zdHJ1Y3Rpb24uaCAtIEluc3RydWN0aW9uIGNsYXNzIGRlZmluaXRpb24gLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIEluc3RydWN0aW9uIGNsYXNzLCB3aGljaCBpcyB0aGUKKy8vIGJhc2UgY2xhc3MgZm9yIGFsbCBvZiB0aGUgTExWTSBpbnN0cnVjdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0lOU1RSVUNUSU9OX0gKKyNkZWZpbmUgTExWTV9JUl9JTlNUUlVDVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9ub2RlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZWJ1Z0xvYy5oIgorI2luY2x1ZGUgImxsdm0vSVIvU3ltYm9sVGFibGVMaXN0VHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Vc2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBGYXN0TWF0aEZsYWdzOworY2xhc3MgTUROb2RlOworY2xhc3MgTW9kdWxlOworc3RydWN0IEFBTUROb2RlczsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlsaXN0X2FsbG9jX3RyYWl0czxJbnN0cnVjdGlvbj4geworICBzdGF0aWMgaW5saW5lIHZvaWQgZGVsZXRlTm9kZShJbnN0cnVjdGlvbiAqVik7Cit9OworCitjbGFzcyBJbnN0cnVjdGlvbiA6IHB1YmxpYyBVc2VyLAorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaWxpc3Rfbm9kZV93aXRoX3BhcmVudDxJbnN0cnVjdGlvbiwgQmFzaWNCbG9jaz4geworICBCYXNpY0Jsb2NrICpQYXJlbnQ7CisgIERlYnVnTG9jIERiZ0xvYzsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ2RiZycgTWV0YWRhdGEgY2FjaGUuCisKKyAgZW51bSB7CisgICAgLy8vIFRoaXMgaXMgYSBiaXQgc3RvcmVkIGluIHRoZSBTdWJDbGFzc0RhdGEgZmllbGQgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIKKyAgICAvLy8gdGhpcyBpbnN0cnVjdGlvbiBoYXMgbWV0YWRhdGEgYXR0YWNoZWQgdG8gaXQgb3Igbm90LgorICAgIEhhc01ldGFkYXRhQml0ID0gMSA8PCAxNQorICB9OworCitwcm90ZWN0ZWQ6CisgIH5JbnN0cnVjdGlvbigpOyAvLyBVc2UgZGVsZXRlVmFsdWUoKSB0byBkZWxldGUgYSBnZW5lcmljIEluc3RydWN0aW9uLgorCitwdWJsaWM6CisgIEluc3RydWN0aW9uKGNvbnN0IEluc3RydWN0aW9uICYpID0gZGVsZXRlOworICBJbnN0cnVjdGlvbiAmb3BlcmF0b3I9KGNvbnN0IEluc3RydWN0aW9uICYpID0gZGVsZXRlOworCisgIC8vLyBTcGVjaWFsaXplIHRoZSBtZXRob2RzIGRlZmluZWQgaW4gVmFsdWUsIGFzIHdlIGtub3cgdGhhdCBhbiBpbnN0cnVjdGlvbgorICAvLy8gY2FuIG9ubHkgYmUgdXNlZCBieSBvdGhlciBpbnN0cnVjdGlvbnMuCisgIEluc3RydWN0aW9uICAgICAgICp1c2VyX2JhY2soKSAgICAgICB7IHJldHVybiBjYXN0PEluc3RydWN0aW9uPigqdXNlcl9iZWdpbigpKTt9CisgIGNvbnN0IEluc3RydWN0aW9uICp1c2VyX2JhY2soKSBjb25zdCB7IHJldHVybiBjYXN0PEluc3RydWN0aW9uPigqdXNlcl9iZWdpbigpKTt9CisKKyAgaW5saW5lIGNvbnN0IEJhc2ljQmxvY2sgKmdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIFBhcmVudDsgfQorICBpbmxpbmUgICAgICAgQmFzaWNCbG9jayAqZ2V0UGFyZW50KCkgICAgICAgeyByZXR1cm4gUGFyZW50OyB9CisKKyAgLy8vIFJldHVybiB0aGUgbW9kdWxlIG93bmluZyB0aGUgZnVuY3Rpb24gdGhpcyBpbnN0cnVjdGlvbiBiZWxvbmdzIHRvCisgIC8vLyBvciBudWxscHRyIGl0IHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIGEgbW9kdWxlLgorICAvLy8KKyAgLy8vIE5vdGU6IHRoaXMgaXMgdW5kZWZpbmVkIGJlaGF2aW9yIGlmIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBoYXZlIGEKKyAgLy8vIHBhcmVudCwgb3IgdGhlIHBhcmVudCBiYXNpYyBibG9jayBkb2VzIG5vdCBoYXZlIGEgcGFyZW50IGZ1bmN0aW9uLgorICBjb25zdCBNb2R1bGUgKmdldE1vZHVsZSgpIGNvbnN0OworICBNb2R1bGUgKmdldE1vZHVsZSgpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxNb2R1bGUgKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBJbnN0cnVjdGlvbiAqPih0aGlzKS0+Z2V0TW9kdWxlKCkpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgZnVuY3Rpb24gdGhpcyBpbnN0cnVjdGlvbiBiZWxvbmdzIHRvLgorICAvLy8KKyAgLy8vIE5vdGU6IGl0IGlzIHVuZGVmaW5lZCBiZWhhdmlvciB0byBjYWxsIHRoaXMgb24gYW4gaW5zdHJ1Y3Rpb24gbm90CisgIC8vLyBjdXJyZW50bHkgaW5zZXJ0ZWQgaW50byBhIGZ1bmN0aW9uLgorICBjb25zdCBGdW5jdGlvbiAqZ2V0RnVuY3Rpb24oKSBjb25zdDsKKyAgRnVuY3Rpb24gKmdldEZ1bmN0aW9uKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEZ1bmN0aW9uICo+KAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEluc3RydWN0aW9uICo+KHRoaXMpLT5nZXRGdW5jdGlvbigpKTsKKyAgfQorCisgIC8vLyBUaGlzIG1ldGhvZCB1bmxpbmtzICd0aGlzJyBmcm9tIHRoZSBjb250YWluaW5nIGJhc2ljIGJsb2NrLCBidXQgZG9lcyBub3QKKyAgLy8vIGRlbGV0ZSBpdC4KKyAgdm9pZCByZW1vdmVGcm9tUGFyZW50KCk7CisKKyAgLy8vIFRoaXMgbWV0aG9kIHVubGlua3MgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgYmFzaWMgYmxvY2sgYW5kIGRlbGV0ZXMgaXQuCisgIC8vLworICAvLy8gXHJldHVybnMgYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGVyYXNlZCBvbmUKKyAgU3ltYm9sVGFibGVMaXN0PEluc3RydWN0aW9uPjo6aXRlcmF0b3IgZXJhc2VGcm9tUGFyZW50KCk7CisKKyAgLy8vIEluc2VydCBhbiB1bmxpbmtlZCBpbnN0cnVjdGlvbiBpbnRvIGEgYmFzaWMgYmxvY2sgaW1tZWRpYXRlbHkgYmVmb3JlCisgIC8vLyB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLgorICB2b2lkIGluc2VydEJlZm9yZShJbnN0cnVjdGlvbiAqSW5zZXJ0UG9zKTsKKworICAvLy8gSW5zZXJ0IGFuIHVubGlua2VkIGluc3RydWN0aW9uIGludG8gYSBiYXNpYyBibG9jayBpbW1lZGlhdGVseSBhZnRlciB0aGUKKyAgLy8vIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4KKyAgdm9pZCBpbnNlcnRBZnRlcihJbnN0cnVjdGlvbiAqSW5zZXJ0UG9zKTsKKworICAvLy8gVW5saW5rIHRoaXMgaW5zdHJ1Y3Rpb24gZnJvbSBpdHMgY3VycmVudCBiYXNpYyBibG9jayBhbmQgaW5zZXJ0IGl0IGludG8KKyAgLy8vIHRoZSBiYXNpYyBibG9jayB0aGF0IE1vdmVQb3MgbGl2ZXMgaW4sIHJpZ2h0IGJlZm9yZSBNb3ZlUG9zLgorICB2b2lkIG1vdmVCZWZvcmUoSW5zdHJ1Y3Rpb24gKk1vdmVQb3MpOworCisgIC8vLyBVbmxpbmsgdGhpcyBpbnN0cnVjdGlvbiBhbmQgaW5zZXJ0IGludG8gQkIgYmVmb3JlIEkuCisgIC8vLworICAvLy8gXHByZSBJIGlzIGEgdmFsaWQgaXRlcmF0b3IgaW50byBCQi4KKyAgdm9pZCBtb3ZlQmVmb3JlKEJhc2ljQmxvY2sgJkJCLCBTeW1ib2xUYWJsZUxpc3Q8SW5zdHJ1Y3Rpb24+OjppdGVyYXRvciBJKTsKKworICAvLy8gVW5saW5rIHRoaXMgaW5zdHJ1Y3Rpb24gZnJvbSBpdHMgY3VycmVudCBiYXNpYyBibG9jayBhbmQgaW5zZXJ0IGl0IGludG8KKyAgLy8vIHRoZSBiYXNpYyBibG9jayB0aGF0IE1vdmVQb3MgbGl2ZXMgaW4sIHJpZ2h0IGFmdGVyIE1vdmVQb3MuCisgIHZvaWQgbW92ZUFmdGVyKEluc3RydWN0aW9uICpNb3ZlUG9zKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gU3ViY2xhc3MgY2xhc3NpZmljYXRpb24uCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBSZXR1cm5zIGEgbWVtYmVyIG9mIG9uZSBvZiB0aGUgZW51bXMgbGlrZSBJbnN0cnVjdGlvbjo6QWRkLgorICB1bnNpZ25lZCBnZXRPcGNvZGUoKSBjb25zdCB7IHJldHVybiBnZXRWYWx1ZUlEKCkgLSBJbnN0cnVjdGlvblZhbDsgfQorCisgIGNvbnN0IGNoYXIgKmdldE9wY29kZU5hbWUoKSBjb25zdCB7IHJldHVybiBnZXRPcGNvZGVOYW1lKGdldE9wY29kZSgpKTsgfQorICBib29sIGlzVGVybWluYXRvcigpIGNvbnN0IHsgcmV0dXJuIGlzVGVybWluYXRvcihnZXRPcGNvZGUoKSk7IH0KKyAgYm9vbCBpc0JpbmFyeU9wKCkgY29uc3QgeyByZXR1cm4gaXNCaW5hcnlPcChnZXRPcGNvZGUoKSk7IH0KKyAgYm9vbCBpc1NoaWZ0KCkgeyByZXR1cm4gaXNTaGlmdChnZXRPcGNvZGUoKSk7IH0KKyAgYm9vbCBpc0Nhc3QoKSBjb25zdCB7IHJldHVybiBpc0Nhc3QoZ2V0T3Bjb2RlKCkpOyB9CisgIGJvb2wgaXNGdW5jbGV0UGFkKCkgY29uc3QgeyByZXR1cm4gaXNGdW5jbGV0UGFkKGdldE9wY29kZSgpKTsgfQorCisgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRPcGNvZGVOYW1lKHVuc2lnbmVkIE9wQ29kZSk7CisKKyAgc3RhdGljIGlubGluZSBib29sIGlzVGVybWluYXRvcih1bnNpZ25lZCBPcENvZGUpIHsKKyAgICByZXR1cm4gT3BDb2RlID49IFRlcm1PcHNCZWdpbiAmJiBPcENvZGUgPCBUZXJtT3BzRW5kOworICB9CisKKyAgc3RhdGljIGlubGluZSBib29sIGlzQmluYXJ5T3AodW5zaWduZWQgT3Bjb2RlKSB7CisgICAgcmV0dXJuIE9wY29kZSA+PSBCaW5hcnlPcHNCZWdpbiAmJiBPcGNvZGUgPCBCaW5hcnlPcHNFbmQ7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBPcGNvZGUgaXMgb25lIG9mIHRoZSBzaGlmdCBpbnN0cnVjdGlvbnMuCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1NoaWZ0KHVuc2lnbmVkIE9wY29kZSkgeworICAgIHJldHVybiBPcGNvZGUgPj0gU2hsICYmIE9wY29kZSA8PSBBU2hyOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBsb2dpY2FsIHNoaWZ0IGxlZnQgb3IgYSBsb2dpY2FsIHNoaWZ0IHJpZ2h0LgorICBpbmxpbmUgYm9vbCBpc0xvZ2ljYWxTaGlmdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3Bjb2RlKCkgPT0gU2hsIHx8IGdldE9wY29kZSgpID09IExTaHI7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0LgorICBpbmxpbmUgYm9vbCBpc0FyaXRobWV0aWNTaGlmdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3Bjb2RlKCkgPT0gQVNocjsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIE9wY29kZSBpcyBhbmQvb3IveG9yLgorICBzdGF0aWMgaW5saW5lIGJvb2wgaXNCaXR3aXNlTG9naWNPcCh1bnNpZ25lZCBPcGNvZGUpIHsKKyAgICByZXR1cm4gT3Bjb2RlID09IEFuZCB8fCBPcGNvZGUgPT0gT3IgfHwgT3Bjb2RlID09IFhvcjsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuZC9vci94b3IuCisgIGlubGluZSBib29sIGlzQml0d2lzZUxvZ2ljT3AoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQml0d2lzZUxvZ2ljT3AoZ2V0T3Bjb2RlKCkpOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgT3BDb2RlIGlzIG9uZSBvZiB0aGUgQ2FzdEluc3QgaW5zdHJ1Y3Rpb25zLgorICBzdGF0aWMgaW5saW5lIGJvb2wgaXNDYXN0KHVuc2lnbmVkIE9wQ29kZSkgeworICAgIHJldHVybiBPcENvZGUgPj0gQ2FzdE9wc0JlZ2luICYmIE9wQ29kZSA8IENhc3RPcHNFbmQ7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBPcENvZGUgaXMgb25lIG9mIHRoZSBGdW5jbGV0UGFkSW5zdCBpbnN0cnVjdGlvbnMuCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0Z1bmNsZXRQYWQodW5zaWduZWQgT3BDb2RlKSB7CisgICAgcmV0dXJuIE9wQ29kZSA+PSBGdW5jbGV0UGFkT3BzQmVnaW4gJiYgT3BDb2RlIDwgRnVuY2xldFBhZE9wc0VuZDsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBNZXRhZGF0YSBtYW5pcHVsYXRpb24uCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGhhcyBhbnkgbWV0YWRhdGEgYXR0YWNoZWQgdG8gaXQuCisgIGJvb2wgaGFzTWV0YWRhdGEoKSBjb25zdCB7IHJldHVybiBEYmdMb2MgfHwgaGFzTWV0YWRhdGFIYXNoRW50cnkoKTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGhhcyBtZXRhZGF0YSBhdHRhY2hlZCB0byBpdCBvdGhlciB0aGFuIGEKKyAgLy8vIGRlYnVnIGxvY2F0aW9uLgorICBib29sIGhhc01ldGFkYXRhT3RoZXJUaGFuRGVidWdMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc01ldGFkYXRhSGFzaEVudHJ5KCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBtZXRhZGF0YSBvZiBnaXZlbiBraW5kIGF0dGFjaGVkIHRvIHRoaXMgSW5zdHJ1Y3Rpb24uCisgIC8vLyBJZiB0aGUgbWV0YWRhdGEgaXMgbm90IGZvdW5kIHRoZW4gcmV0dXJuIG51bGwuCisgIE1ETm9kZSAqZ2V0TWV0YWRhdGEodW5zaWduZWQgS2luZElEKSBjb25zdCB7CisgICAgaWYgKCFoYXNNZXRhZGF0YSgpKSByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gZ2V0TWV0YWRhdGFJbXBsKEtpbmRJRCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBtZXRhZGF0YSBvZiBnaXZlbiBraW5kIGF0dGFjaGVkIHRvIHRoaXMgSW5zdHJ1Y3Rpb24uCisgIC8vLyBJZiB0aGUgbWV0YWRhdGEgaXMgbm90IGZvdW5kIHRoZW4gcmV0dXJuIG51bGwuCisgIE1ETm9kZSAqZ2V0TWV0YWRhdGEoU3RyaW5nUmVmIEtpbmQpIGNvbnN0IHsKKyAgICBpZiAoIWhhc01ldGFkYXRhKCkpIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBnZXRNZXRhZGF0YUltcGwoS2luZCk7CisgIH0KKworICAvLy8gR2V0IGFsbCBtZXRhZGF0YSBhdHRhY2hlZCB0byB0aGlzIEluc3RydWN0aW9uLiBUaGUgZmlyc3QgZWxlbWVudCBvZiBlYWNoCisgIC8vLyBwYWlyIHJldHVybmVkIGlzIHRoZSBLaW5kSUQsIHRoZSBzZWNvbmQgZWxlbWVudCBpcyB0aGUgbWV0YWRhdGEgdmFsdWUuCisgIC8vLyBUaGlzIGxpc3QgaXMgcmV0dXJuZWQgc29ydGVkIGJ5IHRoZSBLaW5kSUQuCisgIHZvaWQKKyAgZ2V0QWxsTWV0YWRhdGEoU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjx1bnNpZ25lZCwgTUROb2RlICo+PiAmTURzKSBjb25zdCB7CisgICAgaWYgKGhhc01ldGFkYXRhKCkpCisgICAgICBnZXRBbGxNZXRhZGF0YUltcGwoTURzKTsKKyAgfQorCisgIC8vLyBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgZ2V0QWxsTWV0YWRhdGEsIGV4Y2VwdCB0aGF0IGl0IGZpbHRlcnMgb3V0IHRoZQorICAvLy8gZGVidWcgbG9jYXRpb24uCisgIHZvaWQgZ2V0QWxsTWV0YWRhdGFPdGhlclRoYW5EZWJ1Z0xvYygKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8dW5zaWduZWQsIE1ETm9kZSAqPj4gJk1EcykgY29uc3QgeworICAgIGlmIChoYXNNZXRhZGF0YU90aGVyVGhhbkRlYnVnTG9jKCkpCisgICAgICBnZXRBbGxNZXRhZGF0YU90aGVyVGhhbkRlYnVnTG9jSW1wbChNRHMpOworICB9CisKKyAgLy8vIEZpbGxzIHRoZSBBQU1ETm9kZXMgc3RydWN0dXJlIHdpdGggQUEgbWV0YWRhdGEgZnJvbSB0aGlzIGluc3RydWN0aW9uLgorICAvLy8gV2hlbiBNZXJnZSBpcyB0cnVlLCB0aGUgZXhpc3RpbmcgQUEgbWV0YWRhdGEgaXMgbWVyZ2VkIHdpdGggdGhhdCBmcm9tIHRoaXMKKyAgLy8vIGluc3RydWN0aW9uIHByb3ZpZGluZyB0aGUgbW9zdC1nZW5lcmFsIHJlc3VsdC4KKyAgdm9pZCBnZXRBQU1ldGFkYXRhKEFBTUROb2RlcyAmTiwgYm9vbCBNZXJnZSA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gU2V0IHRoZSBtZXRhZGF0YSBvZiB0aGUgc3BlY2lmaWVkIGtpbmQgdG8gdGhlIHNwZWNpZmllZCBub2RlLiBUaGlzIHVwZGF0ZXMKKyAgLy8vIG9yIHJlcGxhY2VzIG1ldGFkYXRhIGlmIGFscmVhZHkgcHJlc2VudCwgb3IgcmVtb3ZlcyBpdCBpZiBOb2RlIGlzIG51bGwuCisgIHZvaWQgc2V0TWV0YWRhdGEodW5zaWduZWQgS2luZElELCBNRE5vZGUgKk5vZGUpOworICB2b2lkIHNldE1ldGFkYXRhKFN0cmluZ1JlZiBLaW5kLCBNRE5vZGUgKk5vZGUpOworCisgIC8vLyBDb3B5IG1ldGFkYXRhIGZyb20gXHAgU3JjSW5zdCB0byB0aGlzIGluc3RydWN0aW9uLiBccCBXTCwgaWYgbm90IGVtcHR5LAorICAvLy8gc3BlY2lmaWVzIHRoZSBsaXN0IG9mIG1ldGEgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGNvcGllZC4gSWYgXHAgV0wgaXMKKyAgLy8vIGVtcHR5LCBhbGwgbWV0YSBkYXRhIHdpbGwgYmUgY29waWVkLgorICB2b2lkIGNvcHlNZXRhZGF0YShjb25zdCBJbnN0cnVjdGlvbiAmU3JjSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IFdMID0gQXJyYXlSZWY8dW5zaWduZWQ+KCkpOworCisgIC8vLyBJZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzICJicmFuY2hfd2VpZ2h0cyIgTURfcHJvZiBtZXRhZGF0YSBhbmQgdGhlIE1ETm9kZQorICAvLy8gaGFzIHRocmVlIG9wZXJhbmRzIChpbmNsdWRpbmcgbmFtZSBzdHJpbmcpLCBzd2FwIHRoZSBvcmRlciBvZiB0aGUKKyAgLy8vIG1ldGFkYXRhLgorICB2b2lkIHN3YXBQcm9mTWV0YWRhdGEoKTsKKworICAvLy8gRHJvcCBhbGwgdW5rbm93biBtZXRhZGF0YSBleGNlcHQgZm9yIGRlYnVnIGxvY2F0aW9ucy4KKyAgLy8vIEB7CisgIC8vLyBQYXNzZXMgYXJlIHJlcXVpcmVkIHRvIGRyb3AgbWV0YWRhdGEgdGhleSBkb24ndCB1bmRlcnN0YW5kLiBUaGlzIGlzIGEKKyAgLy8vIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgcGFzc2VzIHRvIGRvIHNvLgorICB2b2lkIGRyb3BVbmtub3duTm9uRGVidWdNZXRhZGF0YShBcnJheVJlZjx1bnNpZ25lZD4gS25vd25JRHMpOworICB2b2lkIGRyb3BVbmtub3duTm9uRGVidWdNZXRhZGF0YSgpIHsKKyAgICByZXR1cm4gZHJvcFVua25vd25Ob25EZWJ1Z01ldGFkYXRhKE5vbmUpOworICB9CisgIHZvaWQgZHJvcFVua25vd25Ob25EZWJ1Z01ldGFkYXRhKHVuc2lnbmVkIElEMSkgeworICAgIHJldHVybiBkcm9wVW5rbm93bk5vbkRlYnVnTWV0YWRhdGEobWFrZUFycmF5UmVmKElEMSkpOworICB9CisgIHZvaWQgZHJvcFVua25vd25Ob25EZWJ1Z01ldGFkYXRhKHVuc2lnbmVkIElEMSwgdW5zaWduZWQgSUQyKSB7CisgICAgdW5zaWduZWQgSURzW10gPSB7SUQxLCBJRDJ9OworICAgIHJldHVybiBkcm9wVW5rbm93bk5vbkRlYnVnTWV0YWRhdGEoSURzKTsKKyAgfQorICAvLy8gQH0KKworICAvLy8gU2V0cyB0aGUgbWV0YWRhdGEgb24gdGhpcyBpbnN0cnVjdGlvbiBmcm9tIHRoZSBBQU1ETm9kZXMgc3RydWN0dXJlLgorICB2b2lkIHNldEFBTWV0YWRhdGEoY29uc3QgQUFNRE5vZGVzICZOKTsKKworICAvLy8gUmV0cmlldmUgdGhlIHJhdyB3ZWlnaHQgdmFsdWVzIG9mIGEgY29uZGl0aW9uYWwgYnJhbmNoIG9yIHNlbGVjdC4KKyAgLy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzIHdpdGggcHJvZmlsZSB3ZWlnaHRzIGZpbGxlZCBpbi4KKyAgLy8vIFJldHVybnMgZmFsc2UgaWYgbm8gbWV0YWRhdGEgb3IgaW52YWxpZCBtZXRhZGF0YSB3YXMgZm91bmQuCisgIGJvb2wgZXh0cmFjdFByb2ZNZXRhZGF0YSh1aW50NjRfdCAmVHJ1ZVZhbCwgdWludDY0X3QgJkZhbHNlVmFsKSBjb25zdDsKKworICAvLy8gUmV0cmlldmUgdG90YWwgcmF3IHdlaWdodCB2YWx1ZXMgb2YgYSBicmFuY2guCisgIC8vLyBSZXR1cm5zIHRydWUgb24gc3VjY2VzcyB3aXRoIHByb2ZpbGUgdG90YWwgd2VpZ2h0cyBmaWxsZWQgaW4uCisgIC8vLyBSZXR1cm5zIGZhbHNlIGlmIG5vIG1ldGFkYXRhIHdhcyBmb3VuZC4KKyAgYm9vbCBleHRyYWN0UHJvZlRvdGFsV2VpZ2h0KHVpbnQ2NF90ICZUb3RhbFZhbCkgY29uc3Q7CisKKyAgLy8vIFVwZGF0ZXMgYnJhbmNoX3dlaWdodHMgbWV0YWRhdGEgYnkgc2NhbGluZyBpdCBieSBccCBTIC8gXHAgVC4KKyAgdm9pZCB1cGRhdGVQcm9mV2VpZ2h0KHVpbnQ2NF90IFMsIHVpbnQ2NF90IFQpOworCisgIC8vLyBTZXRzIHRoZSBicmFuY2hfd2VpZ2h0cyBtZXRhZGF0YSB0byBccCBXIGZvciBDYWxsSW5zdC4KKyAgdm9pZCBzZXRQcm9mV2VpZ2h0KHVpbnQ2NF90IFcpOworCisgIC8vLyBTZXQgdGhlIGRlYnVnIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGlzIGluc3RydWN0aW9uLgorICB2b2lkIHNldERlYnVnTG9jKERlYnVnTG9jIExvYykgeyBEYmdMb2MgPSBzdGQ6Om1vdmUoTG9jKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIGRlYnVnIGxvY2F0aW9uIGZvciB0aGlzIG5vZGUgYXMgYSBEZWJ1Z0xvYy4KKyAgY29uc3QgRGVidWdMb2MgJmdldERlYnVnTG9jKCkgY29uc3QgeyByZXR1cm4gRGJnTG9jOyB9CisKKyAgLy8vIFNldCBvciBjbGVhciB0aGUgbnN3IGZsYWcgb24gdGhpcyBpbnN0cnVjdGlvbiwgd2hpY2ggbXVzdCBiZSBhbiBvcGVyYXRvcgorICAvLy8gd2hpY2ggc3VwcG9ydHMgdGhpcyBmbGFnLiBTZWUgTGFuZ1JlZi5odG1sIGZvciB0aGUgbWVhbmluZyBvZiB0aGlzIGZsYWcuCisgIHZvaWQgc2V0SGFzTm9VbnNpZ25lZFdyYXAoYm9vbCBiID0gdHJ1ZSk7CisKKyAgLy8vIFNldCBvciBjbGVhciB0aGUgbnN3IGZsYWcgb24gdGhpcyBpbnN0cnVjdGlvbiwgd2hpY2ggbXVzdCBiZSBhbiBvcGVyYXRvcgorICAvLy8gd2hpY2ggc3VwcG9ydHMgdGhpcyBmbGFnLiBTZWUgTGFuZ1JlZi5odG1sIGZvciB0aGUgbWVhbmluZyBvZiB0aGlzIGZsYWcuCisgIHZvaWQgc2V0SGFzTm9TaWduZWRXcmFwKGJvb2wgYiA9IHRydWUpOworCisgIC8vLyBTZXQgb3IgY2xlYXIgdGhlIGV4YWN0IGZsYWcgb24gdGhpcyBpbnN0cnVjdGlvbiwgd2hpY2ggbXVzdCBiZSBhbiBvcGVyYXRvcgorICAvLy8gd2hpY2ggc3VwcG9ydHMgdGhpcyBmbGFnLiBTZWUgTGFuZ1JlZi5odG1sIGZvciB0aGUgbWVhbmluZyBvZiB0aGlzIGZsYWcuCisgIHZvaWQgc2V0SXNFeGFjdChib29sIGIgPSB0cnVlKTsKKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG5vIHVuc2lnbmVkIHdyYXAgZmxhZyBpcyBzZXQuCisgIGJvb2wgaGFzTm9VbnNpZ25lZFdyYXAoKSBjb25zdDsKKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG5vIHNpZ25lZCB3cmFwIGZsYWcgaXMgc2V0LgorICBib29sIGhhc05vU2lnbmVkV3JhcCgpIGNvbnN0OworCisgIC8vLyBEcm9wcyBmbGFncyB0aGF0IG1heSBjYXVzZSB0aGlzIGluc3RydWN0aW9uIHRvIGV2YWx1YXRlIHRvIHBvaXNvbiBkZXNwaXRlCisgIC8vLyBoYXZpbmcgbm9uLXBvaXNvbiBpbnB1dHMuCisgIHZvaWQgZHJvcFBvaXNvbkdlbmVyYXRpbmdGbGFncygpOworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZXhhY3QgZmxhZyBpcyBzZXQuCisgIGJvb2wgaXNFeGFjdCgpIGNvbnN0OworCisgIC8vLyBTZXQgb3IgY2xlYXIgYWxsIGZhc3QtbWF0aC1mbGFncyBvbiB0aGlzIGluc3RydWN0aW9uLCB3aGljaCBtdXN0IGJlIGFuCisgIC8vLyBvcGVyYXRvciB3aGljaCBzdXBwb3J0cyB0aGlzIGZsYWcuIFNlZSBMYW5nUmVmLmh0bWwgZm9yIHRoZSBtZWFuaW5nIG9mCisgIC8vLyB0aGlzIGZsYWcuCisgIHZvaWQgc2V0RmFzdChib29sIEIpOworCisgIC8vLyBTZXQgb3IgY2xlYXIgdGhlIHJlYXNzb2NpYXRpb24gZmxhZyBvbiB0aGlzIGluc3RydWN0aW9uLCB3aGljaCBtdXN0IGJlCisgIC8vLyBhbiBvcGVyYXRvciB3aGljaCBzdXBwb3J0cyB0aGlzIGZsYWcuIFNlZSBMYW5nUmVmLmh0bWwgZm9yIHRoZSBtZWFuaW5nIG9mCisgIC8vLyB0aGlzIGZsYWcuCisgIHZvaWQgc2V0SGFzQWxsb3dSZWFzc29jKGJvb2wgQik7CisKKyAgLy8vIFNldCBvciBjbGVhciB0aGUgbm8tbmFucyBmbGFnIG9uIHRoaXMgaW5zdHJ1Y3Rpb24sIHdoaWNoIG11c3QgYmUgYW4KKyAgLy8vIG9wZXJhdG9yIHdoaWNoIHN1cHBvcnRzIHRoaXMgZmxhZy4gU2VlIExhbmdSZWYuaHRtbCBmb3IgdGhlIG1lYW5pbmcgb2YKKyAgLy8vIHRoaXMgZmxhZy4KKyAgdm9pZCBzZXRIYXNOb05hTnMoYm9vbCBCKTsKKworICAvLy8gU2V0IG9yIGNsZWFyIHRoZSBuby1pbmZzIGZsYWcgb24gdGhpcyBpbnN0cnVjdGlvbiwgd2hpY2ggbXVzdCBiZSBhbgorICAvLy8gb3BlcmF0b3Igd2hpY2ggc3VwcG9ydHMgdGhpcyBmbGFnLiBTZWUgTGFuZ1JlZi5odG1sIGZvciB0aGUgbWVhbmluZyBvZgorICAvLy8gdGhpcyBmbGFnLgorICB2b2lkIHNldEhhc05vSW5mcyhib29sIEIpOworCisgIC8vLyBTZXQgb3IgY2xlYXIgdGhlIG5vLXNpZ25lZC16ZXJvcyBmbGFnIG9uIHRoaXMgaW5zdHJ1Y3Rpb24sIHdoaWNoIG11c3QgYmUKKyAgLy8vIGFuIG9wZXJhdG9yIHdoaWNoIHN1cHBvcnRzIHRoaXMgZmxhZy4gU2VlIExhbmdSZWYuaHRtbCBmb3IgdGhlIG1lYW5pbmcgb2YKKyAgLy8vIHRoaXMgZmxhZy4KKyAgdm9pZCBzZXRIYXNOb1NpZ25lZFplcm9zKGJvb2wgQik7CisKKyAgLy8vIFNldCBvciBjbGVhciB0aGUgYWxsb3ctcmVjaXByb2NhbCBmbGFnIG9uIHRoaXMgaW5zdHJ1Y3Rpb24sIHdoaWNoIG11c3QgYmUKKyAgLy8vIGFuIG9wZXJhdG9yIHdoaWNoIHN1cHBvcnRzIHRoaXMgZmxhZy4gU2VlIExhbmdSZWYuaHRtbCBmb3IgdGhlIG1lYW5pbmcgb2YKKyAgLy8vIHRoaXMgZmxhZy4KKyAgdm9pZCBzZXRIYXNBbGxvd1JlY2lwcm9jYWwoYm9vbCBCKTsKKworICAvLy8gU2V0IG9yIGNsZWFyIHRoZSBhcHByb3hpbWF0ZS1tYXRoLWZ1bmN0aW9ucyBmbGFnIG9uIHRoaXMgaW5zdHJ1Y3Rpb24sCisgIC8vLyB3aGljaCBtdXN0IGJlIGFuIG9wZXJhdG9yIHdoaWNoIHN1cHBvcnRzIHRoaXMgZmxhZy4gU2VlIExhbmdSZWYuaHRtbCBmb3IKKyAgLy8vIHRoZSBtZWFuaW5nIG9mIHRoaXMgZmxhZy4KKyAgdm9pZCBzZXRIYXNBcHByb3hGdW5jKGJvb2wgQik7CisKKyAgLy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBzZXR0aW5nIG11bHRpcGxlIGZhc3QtbWF0aCBmbGFncyBvbiB0aGlzCisgIC8vLyBpbnN0cnVjdGlvbiwgd2hpY2ggbXVzdCBiZSBhbiBvcGVyYXRvciB3aGljaCBzdXBwb3J0cyB0aGVzZSBmbGFncy4gU2VlCisgIC8vLyBMYW5nUmVmLmh0bWwgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZXNlIGZsYWdzLgorICB2b2lkIHNldEZhc3RNYXRoRmxhZ3MoRmFzdE1hdGhGbGFncyBGTUYpOworCisgIC8vLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgdHJhbnNmZXJyaW5nIGFsbCBmYXN0LW1hdGggZmxhZyB2YWx1ZXMgdG8gdGhpcworICAvLy8gaW5zdHJ1Y3Rpb24sIHdoaWNoIG11c3QgYmUgYW4gb3BlcmF0b3Igd2hpY2ggc3VwcG9ydHMgdGhlc2UgZmxhZ3MuIFNlZQorICAvLy8gTGFuZ1JlZi5odG1sIGZvciB0aGUgbWVhbmluZyBvZiB0aGVzZSBmbGFncy4KKyAgdm9pZCBjb3B5RmFzdE1hdGhGbGFncyhGYXN0TWF0aEZsYWdzIEZNRik7CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIGFsbCBmYXN0LW1hdGgtZmxhZ3MgYXJlIHNldC4KKyAgYm9vbCBpc0Zhc3QoKSBjb25zdDsKKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFsbG93LXJlYXNzb2NpYXRpb24gZmxhZyBpcyBzZXQuCisgIGJvb2wgaGFzQWxsb3dSZWFzc29jKCkgY29uc3Q7CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBuby1OYU5zIGZsYWcgaXMgc2V0LgorICBib29sIGhhc05vTmFOcygpIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgbm8taW5mcyBmbGFnIGlzIHNldC4KKyAgYm9vbCBoYXNOb0luZnMoKSBjb25zdDsKKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG5vLXNpZ25lZC16ZXJvcyBmbGFnIGlzIHNldC4KKyAgYm9vbCBoYXNOb1NpZ25lZFplcm9zKCkgY29uc3Q7CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBhbGxvdy1yZWNpcHJvY2FsIGZsYWcgaXMgc2V0LgorICBib29sIGhhc0FsbG93UmVjaXByb2NhbCgpIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgYWxsb3ctY29udHJhY3QgZmxhZyBpcyBzZXQuCisgIGJvb2wgaGFzQWxsb3dDb250cmFjdCgpIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgYXBwcm94aW1hdGUtbWF0aC1mdW5jdGlvbnMgZmxhZyBpcyBzZXQuCisgIGJvb2wgaGFzQXBwcm94RnVuYygpIGNvbnN0OworCisgIC8vLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgZ2V0dGluZyBhbGwgdGhlIGZhc3QtbWF0aCBmbGFncywgd2hpY2ggbXVzdCBiZSBhbgorICAvLy8gb3BlcmF0b3Igd2hpY2ggc3VwcG9ydHMgdGhlc2UgZmxhZ3MuIFNlZSBMYW5nUmVmLmh0bWwgZm9yIHRoZSBtZWFuaW5nIG9mCisgIC8vLyB0aGVzZSBmbGFncy4KKyAgRmFzdE1hdGhGbGFncyBnZXRGYXN0TWF0aEZsYWdzKCkgY29uc3Q7CisKKyAgLy8vIENvcHkgSSdzIGZhc3QtbWF0aCBmbGFncworICB2b2lkIGNvcHlGYXN0TWF0aEZsYWdzKGNvbnN0IEluc3RydWN0aW9uICpJKTsKKworICAvLy8gQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvcHkgc3VwcG9ydGVkIGV4YWN0LCBmYXN0LW1hdGgsIGFuZCAob3B0aW9uYWxseSkKKyAgLy8vIHdyYXBwaW5nIGZsYWdzIGZyb20gViB0byB0aGlzIGluc3RydWN0aW9uLgorICB2b2lkIGNvcHlJUkZsYWdzKGNvbnN0IFZhbHVlICpWLCBib29sIEluY2x1ZGVXcmFwRmxhZ3MgPSB0cnVlKTsKKworICAvLy8gTG9naWNhbCAnYW5kJyBvZiBhbnkgc3VwcG9ydGVkIHdyYXBwaW5nLCBleGFjdCwgYW5kIGZhc3QtbWF0aCBmbGFncyBvZgorICAvLy8gViBhbmQgdGhpcyBpbnN0cnVjdGlvbi4KKyAgdm9pZCBhbmRJUkZsYWdzKGNvbnN0IFZhbHVlICpWKTsKKworICAvLy8gTWVyZ2UgMiBkZWJ1ZyBsb2NhdGlvbnMgYW5kIGFwcGx5IGl0IHRvIHRoZSBJbnN0cnVjdGlvbi4gSWYgdGhlCisgIC8vLyBpbnN0cnVjdGlvbiBpcyBhIENhbGxJbnMsIHdlIG5lZWQgdG8gdHJhdmVyc2UgdGhlIGlubGluZSBjaGFpbiB0byBmaW5kCisgIC8vLyB0aGUgY29tbW9uIHNjb3BlLiBUaGlzIGlzIG5vdCBlZmZpY2llbnQgZm9yIE4td2F5IG1lcmdpbmcgYXMgZWFjaCB0aW1lCisgIC8vLyB5b3UgbWVyZ2UgMiBpdGVyYXRpb25zLCB5b3UgbmVlZCB0byByZWJ1aWxkIHRoZSBoYXNobWFwIHRvIGZpbmQgdGhlCisgIC8vLyBjb21tb24gc2NvcGUuIEhvd2V2ZXIsIHdlIHN0aWxsIGNob29zZSB0aGlzIEFQSSBiZWNhdXNlOgorICAvLy8gIDEpIFNpbXBsaWNpdHk6IGl0IHRha2VzIDIgbG9jYXRpb25zIGluc3RlYWQgb2YgYSBsaXN0IG9mIGxvY2F0aW9ucy4KKyAgLy8vICAyKSBJbiB3b3JzdCBjYXNlLCBpdCBpbmNyZWFzZXMgdGhlIGNvbXBsZXhpdHkgZnJvbSBPKE4qSSkgdG8KKyAgLy8vICAgICBPKDIqTipJKSwgd2hlcmUgTiBpcyAjIG9mIEluc3RydWN0aW9ucyB0byBtZXJnZSwgYW5kIEkgaXMgdGhlCisgIC8vLyAgICAgbWF4aW11bSBsZXZlbCBvZiBpbmxpbmUgc3RhY2suIFNvIGl0IGlzIHN0aWxsIGxpbmVhci4KKyAgLy8vICAzKSBNZXJnaW5nIG9mIGNhbGwgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBleHRyZW1lbHkgcmFyZSBpbiByZWFsCisgIC8vLyAgICAgYXBwbGljYXRpb25zLCB0aHVzIHRoZSBOLXdheSBtZXJnaW5nIHNob3VsZCBiZSBpbiBjb2RlIHBhdGguCisgIC8vLyBUaGUgRGVidWdMb2MgYXR0YWNoZWQgdG8gdGhpcyBpbnN0cnVjdGlvbiB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZQorICAvLy8gbWVyZ2VkIERlYnVnTG9jLgorICB2b2lkIGFwcGx5TWVyZ2VkTG9jYXRpb24oY29uc3QgRElMb2NhdGlvbiAqTG9jQSwgY29uc3QgRElMb2NhdGlvbiAqTG9jQik7CisKK3ByaXZhdGU6CisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIGFuIGVudHJ5IGluIHRoZSBvbi10aGUtc2lkZSBtZXRhZGF0YSBoYXNoLgorICBib29sIGhhc01ldGFkYXRhSGFzaEVudHJ5KCkgY29uc3QgeworICAgIHJldHVybiAoZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgJiBIYXNNZXRhZGF0YUJpdCkgIT0gMDsKKyAgfQorCisgIC8vIFRoZXNlIGFyZSBhbGwgaW1wbGVtZW50ZWQgaW4gTWV0YWRhdGEuY3BwLgorICBNRE5vZGUgKmdldE1ldGFkYXRhSW1wbCh1bnNpZ25lZCBLaW5kSUQpIGNvbnN0OworICBNRE5vZGUgKmdldE1ldGFkYXRhSW1wbChTdHJpbmdSZWYgS2luZCkgY29uc3Q7CisgIHZvaWQKKyAgZ2V0QWxsTWV0YWRhdGFJbXBsKFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8dW5zaWduZWQsIE1ETm9kZSAqPj4gJikgY29uc3Q7CisgIHZvaWQgZ2V0QWxsTWV0YWRhdGFPdGhlclRoYW5EZWJ1Z0xvY0ltcGwoCisgICAgICBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPHVuc2lnbmVkLCBNRE5vZGUgKj4+ICYpIGNvbnN0OworICAvLy8gQ2xlYXIgYWxsIGhhc2h0YWJsZS1iYXNlZCBtZXRhZGF0YSBmcm9tIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgY2xlYXJNZXRhZGF0YUhhc2hFbnRyaWVzKCk7CisKK3B1YmxpYzoKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFByZWRpY2F0ZXMgYW5kIGhlbHBlciBtZXRob2RzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGFzc29jaWF0aXZlOgorICAvLy8KKyAgLy8vICAgQXNzb2NpYXRpdmUgb3BlcmF0b3JzIHNhdGlzZnk6ICB4IG9wICh5IG9wIHopID09PSAoeCBvcCB5KSBvcCB6CisgIC8vLworICAvLy8gSW4gTExWTSwgdGhlIEFkZCwgTXVsLCBBbmQsIE9yLCBhbmQgWG9yIG9wZXJhdG9ycyBhcmUgYXNzb2NpYXRpdmUuCisgIC8vLworICBib29sIGlzQXNzb2NpYXRpdmUoKSBjb25zdCBMTFZNX1JFQURPTkxZOworICBzdGF0aWMgYm9vbCBpc0Fzc29jaWF0aXZlKHVuc2lnbmVkIE9wY29kZSkgeworICAgIHJldHVybiBPcGNvZGUgPT0gQW5kIHx8IE9wY29kZSA9PSBPciB8fCBPcGNvZGUgPT0gWG9yIHx8CisgICAgICAgICAgIE9wY29kZSA9PSBBZGQgfHwgT3Bjb2RlID09IE11bDsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgY29tbXV0YXRpdmU6CisgIC8vLworICAvLy8gICBDb21tdXRhdGl2ZSBvcGVyYXRvcnMgc2F0aXNmeTogKHggb3AgeSkgPT09ICh5IG9wIHgpCisgIC8vLworICAvLy8gSW4gTExWTSwgdGhlc2UgYXJlIHRoZSBjb21tdXRhdGl2ZSBvcGVyYXRvcnMsIHBsdXMgU2V0RVEgYW5kIFNldE5FLCB3aGVuCisgIC8vLyBhcHBsaWVkIHRvIGFueSB0eXBlLgorICAvLy8KKyAgYm9vbCBpc0NvbW11dGF0aXZlKCkgY29uc3QgeyByZXR1cm4gaXNDb21tdXRhdGl2ZShnZXRPcGNvZGUoKSk7IH0KKyAgc3RhdGljIGJvb2wgaXNDb21tdXRhdGl2ZSh1bnNpZ25lZCBPcGNvZGUpIHsKKyAgICBzd2l0Y2ggKE9wY29kZSkgeworICAgIGNhc2UgQWRkOiBjYXNlIEZBZGQ6CisgICAgY2FzZSBNdWw6IGNhc2UgRk11bDoKKyAgICBjYXNlIEFuZDogY2FzZSBPcjogY2FzZSBYb3I6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGlkZW1wb3RlbnQ6CisgIC8vLworICAvLy8gICBJZGVtcG90ZW50IG9wZXJhdG9ycyBzYXRpc2Z5OiAgeCBvcCB4ID09PSB4CisgIC8vLworICAvLy8gSW4gTExWTSwgdGhlIEFuZCBhbmQgT3Igb3BlcmF0b3JzIGFyZSBpZGVtcG90ZW50LgorICAvLy8KKyAgYm9vbCBpc0lkZW1wb3RlbnQoKSBjb25zdCB7IHJldHVybiBpc0lkZW1wb3RlbnQoZ2V0T3Bjb2RlKCkpOyB9CisgIHN0YXRpYyBib29sIGlzSWRlbXBvdGVudCh1bnNpZ25lZCBPcGNvZGUpIHsKKyAgICByZXR1cm4gT3Bjb2RlID09IEFuZCB8fCBPcGNvZGUgPT0gT3I7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIG5pbHBvdGVudDoKKyAgLy8vCisgIC8vLyAgIE5pbHBvdGVudCBvcGVyYXRvcnMgc2F0aXNmeTogIHggb3AgeCA9PT0gSWQsCisgIC8vLworICAvLy8gICB3aGVyZSBJZCBpcyB0aGUgaWRlbnRpdHkgZm9yIHRoZSBvcGVyYXRvciwgaS5lLiBhIGNvbnN0YW50IHN1Y2ggdGhhdAorICAvLy8gICAgIHggb3AgSWQgPT09IHggYW5kIElkIG9wIHggPT09IHggZm9yIGFsbCB4LgorICAvLy8KKyAgLy8vIEluIExMVk0sIHRoZSBYb3Igb3BlcmF0b3IgaXMgbmlscG90ZW50LgorICAvLy8KKyAgYm9vbCBpc05pbHBvdGVudCgpIGNvbnN0IHsgcmV0dXJuIGlzTmlscG90ZW50KGdldE9wY29kZSgpKTsgfQorICBzdGF0aWMgYm9vbCBpc05pbHBvdGVudCh1bnNpZ25lZCBPcGNvZGUpIHsKKyAgICByZXR1cm4gT3Bjb2RlID09IFhvcjsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIG1heSBtb2RpZnkgbWVtb3J5LgorICBib29sIG1heVdyaXRlVG9NZW1vcnkoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBtYXkgcmVhZCBtZW1vcnkuCisgIGJvb2wgbWF5UmVhZEZyb21NZW1vcnkoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBtYXkgcmVhZCBvciB3cml0ZSBtZW1vcnkuCisgIGJvb2wgbWF5UmVhZE9yV3JpdGVNZW1vcnkoKSBjb25zdCB7CisgICAgcmV0dXJuIG1heVJlYWRGcm9tTWVtb3J5KCkgfHwgbWF5V3JpdGVUb01lbW9yeSgpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIGFuIEF0b21pY09yZGVyaW5nIG9mIHVub3JkZXJlZCBvcgorICAvLy8gaGlnaGVyLgorICBib29sIGlzQXRvbWljKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYXRvbWljIGluc3RydWN0aW9uIGxvYWRzIGZyb20gbWVtb3J5LgorICBib29sIGhhc0F0b21pY0xvYWQoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBhdG9taWMgaW5zdHJ1Y3Rpb24gc3RvcmVzIHRvIG1lbW9yeS4KKyAgYm9vbCBoYXNBdG9taWNTdG9yZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIG1heSB0aHJvdyBhbiBleGNlcHRpb24uCisgIGJvb2wgbWF5VGhyb3coKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBiZWhhdmVzIGxpa2UgYSBtZW1vcnkgZmVuY2U6IGl0IGNhbiBsb2FkCisgIC8vLyBvciBzdG9yZSB0byBtZW1vcnkgbG9jYXRpb24gd2l0aG91dCBiZWluZyBnaXZlbiBhIG1lbW9yeSBsb2NhdGlvbi4KKyAgYm9vbCBpc0ZlbmNlTGlrZSgpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKGdldE9wY29kZSgpKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBUaGlzIGxpc3Qgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBsaXN0IGluIG1heVdyaXRlVG9NZW1vcnkgZm9yCisgICAgLy8gYWxsIG9wY29kZXMgd2hpY2ggZG9uJ3QgaGF2ZSBhIG1lbW9yeSBsb2NhdGlvbi4KKyAgICBjYXNlIEluc3RydWN0aW9uOjpGZW5jZToKKyAgICBjYXNlIEluc3RydWN0aW9uOjpDYXRjaFBhZDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpDYXRjaFJldDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpDYWxsOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246Okludm9rZToKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gbWF5IGhhdmUgc2lkZSBlZmZlY3RzLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGNvbnNpZGVyIG1hbGxvYyBhbmQgYWxsb2NhIHRvIGhhdmUgc2lkZQorICAvLy8gZWZmZWN0cyBiZWNhdXNlIHRoZSBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5IGlzIGNvbXBsZXRlbHkgaW52aXNpYmxlIHRvCisgIC8vLyBpbnN0cnVjdGlvbnMgd2hpY2ggZG9uJ3QgdXNlIHRoZSByZXR1cm5lZCB2YWx1ZS4gIEZvciBjYXNlcyB3aGVyZSB0aGlzCisgIC8vLyBtYXR0ZXJzLCBpc1NhZmVUb1NwZWN1bGF0aXZlbHlFeGVjdXRlIG1heSBiZSBtb3JlIGFwcHJvcHJpYXRlLgorICBib29sIG1heUhhdmVTaWRlRWZmZWN0cygpIGNvbnN0IHsgcmV0dXJuIG1heVdyaXRlVG9NZW1vcnkoKSB8fCBtYXlUaHJvdygpOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBjYW4gYmUgcmVtb3ZlZCBpZiB0aGUgcmVzdWx0IGlzIHVudXNlZC4KKyAgLy8vCisgIC8vLyBXaGVuIGNvbnN0YW50IGZvbGRpbmcgc29tZSBpbnN0cnVjdGlvbnMgY2Fubm90IGJlIHJlbW92ZWQgZXZlbiBpZiB0aGVpcgorICAvLy8gcmVzdWx0cyBhcmUgdW51c2VkLiBTcGVjaWZpY2FsbHkgdGVybWluYXRvciBpbnN0cnVjdGlvbnMgYW5kIGNhbGxzIHRoYXQKKyAgLy8vIG1heSBoYXZlIHNpZGUgZWZmZWN0cyBjYW5ub3QgYmUgcmVtb3ZlZCB3aXRob3V0IHNlbWFudGljYWxseSBjaGFuZ2luZyB0aGUKKyAgLy8vIGdlbmVyYXRlZCBwcm9ncmFtLgorICBib29sIGlzU2FmZVRvUmVtb3ZlKCkgY29uc3Q7CisgIAorICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGEgdmFyaWV0eSBvZiBFSC1ibG9jay4KKyAgYm9vbCBpc0VIUGFkKCkgY29uc3QgeworICAgIHN3aXRjaCAoZ2V0T3Bjb2RlKCkpIHsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpDYXRjaFN3aXRjaDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpDYXRjaFBhZDoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpDbGVhbnVwUGFkOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkxhbmRpbmdQYWQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vLyBDcmVhdGUgYSBjb3B5IG9mICd0aGlzJyBpbnN0cnVjdGlvbiB0aGF0IGlzIGlkZW50aWNhbCBpbiBhbGwgd2F5cyBleGNlcHQKKyAgLy8vIHRoZSBmb2xsb3dpbmc6CisgIC8vLyAgICogVGhlIGluc3RydWN0aW9uIGhhcyBubyBwYXJlbnQKKyAgLy8vICAgKiBUaGUgaW5zdHJ1Y3Rpb24gaGFzIG5vIG5hbWUKKyAgLy8vCisgIEluc3RydWN0aW9uICpjbG9uZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIGlzIGV4YWN0bHkgaWRlbnRpY2FsIHRvIHRoZQorICAvLy8gY3VycmVudCBvbmUuIFRoaXMgbWVhbnMgdGhhdCBhbGwgb3BlcmFuZHMgbWF0Y2ggYW5kIGFueSBleHRyYSBpbmZvcm1hdGlvbgorICAvLy8gKGUuZy4gbG9hZCBpcyB2b2xhdGlsZSkgYWdyZWUuCisgIGJvb2wgaXNJZGVudGljYWxUbyhjb25zdCBJbnN0cnVjdGlvbiAqSSkgY29uc3Q7CisKKyAgLy8vIFRoaXMgaXMgbGlrZSBpc0lkZW50aWNhbFRvLCBleGNlcHQgdGhhdCBpdCBpZ25vcmVzIHRoZQorICAvLy8gU3ViY2xhc3NPcHRpb25hbERhdGEgZmxhZ3MsIHdoaWNoIG1heSBzcGVjaWZ5IGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlCisgIC8vLyBpbnN0cnVjdGlvbidzIHJlc3VsdCBpcyB1bmRlZmluZWQuCisgIGJvb2wgaXNJZGVudGljYWxUb1doZW5EZWZpbmVkKGNvbnN0IEluc3RydWN0aW9uICpJKSBjb25zdDsKKworICAvLy8gV2hlbiBjaGVja2luZyBmb3Igb3BlcmF0aW9uIGVxdWl2YWxlbmNlICh1c2luZyBpc1NhbWVPcGVyYXRpb25BcykgaXQgaXMKKyAgLy8vIHNvbWV0aW1lcyB1c2VmdWwgdG8gaWdub3JlIGNlcnRhaW4gYXR0cmlidXRlcy4KKyAgZW51bSBPcGVyYXRpb25FcXVpdmFsZW5jZUZsYWdzIHsKKyAgICAvLy8gQ2hlY2sgZm9yIGVxdWl2YWxlbmNlIGlnbm9yaW5nIGxvYWQvc3RvcmUgYWxpZ25tZW50LgorICAgIENvbXBhcmVJZ25vcmluZ0FsaWdubWVudCA9IDE8PDAsCisgICAgLy8vIENoZWNrIGZvciBlcXVpdmFsZW5jZSB0cmVhdGluZyBhIHR5cGUgYW5kIGEgdmVjdG9yIG9mIHRoYXQgdHlwZQorICAgIC8vLyBhcyBlcXVpdmFsZW50LgorICAgIENvbXBhcmVVc2luZ1NjYWxhclR5cGVzID0gMTw8MQorICB9OworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBleGVjdXRlcyB0aGUgc2FtZQorICAvLy8gb3BlcmF0aW9uIGFzIHRoZSBjdXJyZW50IG9uZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBvcGNvZGVzLCB0eXBlLCBvcGVyYW5kCisgIC8vLyB0eXBlcyBhbmQgYW55IG90aGVyIGZhY3RvcnMgYWZmZWN0aW5nIHRoZSBvcGVyYXRpb24gbXVzdCBiZSB0aGUgc2FtZS4gVGhpcworICAvLy8gaXMgc2ltaWxhciB0byBpc0lkZW50aWNhbFRvIGV4Y2VwdCB0aGUgb3BlcmFuZHMgdGhlbXNlbHZlcyBkb24ndCBoYXZlIHRvCisgIC8vLyBiZSBpZGVudGljYWwuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gaXMgdGhlIHNhbWUgb3BlcmF0aW9uIGFzCisgIC8vLyB0aGUgY3VycmVudCBvbmUuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIG9uZSBpbnN0cnVjdGlvbiBpcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgYW5vdGhlci4KKyAgYm9vbCBpc1NhbWVPcGVyYXRpb25Bcyhjb25zdCBJbnN0cnVjdGlvbiAqSSwgdW5zaWduZWQgZmxhZ3MgPSAwKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGFueSB1c2VzIG9mIHRoaXMgaW5zdHJ1Y3Rpb24gaW4gYmxvY2tzIG90aGVyIHRoYW4KKyAgLy8vIHRoZSBzcGVjaWZpZWQgYmxvY2suIE5vdGUgdGhhdCBQSEkgbm9kZXMgYXJlIGNvbnNpZGVyZWQgdG8gZXZhbHVhdGUgdGhlaXIKKyAgLy8vIG9wZXJhbmRzIGluIHRoZSBjb3JyZXNwb25kaW5nIHByZWRlY2Vzc29yIGJsb2NrLgorICBib29sIGlzVXNlZE91dHNpZGVPZkJsb2NrKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSBjb25zdDsKKworCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA+PSBWYWx1ZTo6SW5zdHJ1Y3Rpb25WYWw7CisgIH0KKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gRXhwb3J0ZWQgZW51bWVyYXRpb25zLgorICAvLworICBlbnVtIFRlcm1PcHMgeyAgICAgICAvLyBUaGVzZSB0ZXJtaW5hdGUgYmFzaWMgYmxvY2tzCisjZGVmaW5lICBGSVJTVF9URVJNX0lOU1QoTikgICAgICAgICAgICAgVGVybU9wc0JlZ2luID0gTiwKKyNkZWZpbmUgSEFORExFX1RFUk1fSU5TVChOLCBPUEMsIENMQVNTKSBPUEMgPSBOLAorI2RlZmluZSAgIExBU1RfVEVSTV9JTlNUKE4pICAgICAgICAgICAgIFRlcm1PcHNFbmQgPSBOKzEKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmRlZiIKKyAgfTsKKworICBlbnVtIEJpbmFyeU9wcyB7CisjZGVmaW5lICBGSVJTVF9CSU5BUllfSU5TVChOKSAgICAgICAgICAgICBCaW5hcnlPcHNCZWdpbiA9IE4sCisjZGVmaW5lIEhBTkRMRV9CSU5BUllfSU5TVChOLCBPUEMsIENMQVNTKSBPUEMgPSBOLAorI2RlZmluZSAgIExBU1RfQklOQVJZX0lOU1QoTikgICAgICAgICAgICAgQmluYXJ5T3BzRW5kID0gTisxCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5kZWYiCisgIH07CisKKyAgZW51bSBNZW1vcnlPcHMgeworI2RlZmluZSAgRklSU1RfTUVNT1JZX0lOU1QoTikgICAgICAgICAgICAgTWVtb3J5T3BzQmVnaW4gPSBOLAorI2RlZmluZSBIQU5ETEVfTUVNT1JZX0lOU1QoTiwgT1BDLCBDTEFTUykgT1BDID0gTiwKKyNkZWZpbmUgICBMQVNUX01FTU9SWV9JTlNUKE4pICAgICAgICAgICAgIE1lbW9yeU9wc0VuZCA9IE4rMQorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uZGVmIgorICB9OworCisgIGVudW0gQ2FzdE9wcyB7CisjZGVmaW5lICBGSVJTVF9DQVNUX0lOU1QoTikgICAgICAgICAgICAgQ2FzdE9wc0JlZ2luID0gTiwKKyNkZWZpbmUgSEFORExFX0NBU1RfSU5TVChOLCBPUEMsIENMQVNTKSBPUEMgPSBOLAorI2RlZmluZSAgIExBU1RfQ0FTVF9JTlNUKE4pICAgICAgICAgICAgIENhc3RPcHNFbmQgPSBOKzEKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmRlZiIKKyAgfTsKKworICBlbnVtIEZ1bmNsZXRQYWRPcHMgeworI2RlZmluZSAgRklSU1RfRlVOQ0xFVFBBRF9JTlNUKE4pICAgICAgICAgICAgIEZ1bmNsZXRQYWRPcHNCZWdpbiA9IE4sCisjZGVmaW5lIEhBTkRMRV9GVU5DTEVUUEFEX0lOU1QoTiwgT1BDLCBDTEFTUykgT1BDID0gTiwKKyNkZWZpbmUgICBMQVNUX0ZVTkNMRVRQQURfSU5TVChOKSAgICAgICAgICAgICBGdW5jbGV0UGFkT3BzRW5kID0gTisxCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5kZWYiCisgIH07CisKKyAgZW51bSBPdGhlck9wcyB7CisjZGVmaW5lICBGSVJTVF9PVEhFUl9JTlNUKE4pICAgICAgICAgICAgIE90aGVyT3BzQmVnaW4gPSBOLAorI2RlZmluZSBIQU5ETEVfT1RIRVJfSU5TVChOLCBPUEMsIENMQVNTKSBPUEMgPSBOLAorI2RlZmluZSAgIExBU1RfT1RIRVJfSU5TVChOKSAgICAgICAgICAgICBPdGhlck9wc0VuZCA9IE4rMQorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uZGVmIgorICB9OworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzPEluc3RydWN0aW9uPjsKKworICAvLyBTaGFkb3cgVmFsdWU6OnNldFZhbHVlU3ViY2xhc3NEYXRhIHdpdGggYSBwcml2YXRlIGZvcndhcmRpbmcgbWV0aG9kIHNvIHRoYXQKKyAgLy8gc3ViY2xhc3NlcyBjYW5ub3QgYWNjaWRlbnRhbGx5IHVzZSBpdC4KKyAgdm9pZCBzZXRWYWx1ZVN1YmNsYXNzRGF0YSh1bnNpZ25lZCBzaG9ydCBEKSB7CisgICAgVmFsdWU6OnNldFZhbHVlU3ViY2xhc3NEYXRhKEQpOworICB9CisKKyAgdW5zaWduZWQgc2hvcnQgZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBWYWx1ZTo6Z2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCk7CisgIH0KKworICB2b2lkIHNldEhhc01ldGFkYXRhSGFzaEVudHJ5KGJvb2wgVikgeworICAgIHNldFZhbHVlU3ViY2xhc3NEYXRhKChnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKSAmIH5IYXNNZXRhZGF0YUJpdCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgIChWID8gSGFzTWV0YWRhdGFCaXQgOiAwKSk7CisgIH0KKworICB2b2lkIHNldFBhcmVudChCYXNpY0Jsb2NrICpQKTsKKworcHJvdGVjdGVkOgorICAvLyBJbnN0cnVjdGlvbiBzdWJjbGFzc2VzIGNhbiBzdGljayB1cCB0byAxNSBiaXRzIG9mIHN0dWZmIGludG8gdGhlCisgIC8vIFN1YmNsYXNzRGF0YSBmaWVsZCBvZiBpbnN0cnVjdGlvbiB3aXRoIHRoZXNlIG1lbWJlcnMuCisKKyAgLy8gVmVyaWZ5IHRoYXQgb25seSB0aGUgbG93IDE1IGJpdHMgYXJlIHVzZWQuCisgIHZvaWQgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEodW5zaWduZWQgc2hvcnQgRCkgeworICAgIGFzc2VydCgoRCAmIEhhc01ldGFkYXRhQml0KSA9PSAwICYmICJPdXQgb2YgcmFuZ2UgdmFsdWUgcHV0IGludG8gZmllbGQiKTsKKyAgICBzZXRWYWx1ZVN1YmNsYXNzRGF0YSgoZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgJiBIYXNNZXRhZGF0YUJpdCkgfCBEKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgJiB+SGFzTWV0YWRhdGFCaXQ7CisgIH0KKworICBJbnN0cnVjdGlvbihUeXBlICpUeSwgdW5zaWduZWQgaVR5cGUsIFVzZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMsCisgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKyAgSW5zdHJ1Y3Rpb24oVHlwZSAqVHksIHVuc2lnbmVkIGlUeXBlLCBVc2UgKk9wcywgdW5zaWduZWQgTnVtT3BzLAorICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKK3ByaXZhdGU6CisgIC8vLyBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIEluc3RydWN0aW9uICpjbG9uZUltcGwoKSBjb25zdDsKK307CisKK2lubGluZSB2b2lkIGlsaXN0X2FsbG9jX3RyYWl0czxJbnN0cnVjdGlvbj46OmRlbGV0ZU5vZGUoSW5zdHJ1Y3Rpb24gKlYpIHsKKyAgVi0+ZGVsZXRlVmFsdWUoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfSU5TVFJVQ1RJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnN0cnVjdGlvbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMxNWQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgKQEAgLTAsMCArMSw1MDc4IEBACisvLz09PS0gbGx2bS9JbnN0cnVjdGlvbnMuaCAtIEluc3RydWN0aW9uIHN1YmNsYXNzIGRlZmluaXRpb25zIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBleHBvc2VzIHRoZSBjbGFzcyBkZWZpbml0aW9ucyBvZiBhbGwgb2YgdGhlIHN1YmNsYXNzZXMgb2YgdGhlCisvLyBJbnN0cnVjdGlvbiBjbGFzcy4gIFRoaXMgaXMgbWVhbnQgdG8gYmUgYW4gZWFzeSB3YXkgdG8gZ2V0IGFjY2VzcyB0byBhbGwKKy8vIGluc3RydWN0aW9uIHN1YmNsYXNzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0lOU1RSVUNUSU9OU19ICisjZGVmaW5lIExMVk1fSVJfSU5TVFJVQ1RJT05TX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RyVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9PcGVyYW5kVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Vc2UuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1VzZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0F0b21pY09yZGVyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFQSW50OworY2xhc3MgQ29uc3RhbnRJbnQ7CitjbGFzcyBEYXRhTGF5b3V0OworY2xhc3MgTExWTUNvbnRleHQ7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIGFuIGluc3RydWN0aW9uIHRvIGFsbG9jYXRlIG1lbW9yeSBvbiB0aGUgc3RhY2sKK2NsYXNzIEFsbG9jYUluc3QgOiBwdWJsaWMgVW5hcnlJbnN0cnVjdGlvbiB7CisgIFR5cGUgKkFsbG9jYXRlZFR5cGU7CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIEFsbG9jYUluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIGV4cGxpY2l0IEFsbG9jYUluc3QoVHlwZSAqVHksIHVuc2lnbmVkIEFkZHJTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQXJyYXlTaXplID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKyAgQWxsb2NhSW5zdChUeXBlICpUeSwgdW5zaWduZWQgQWRkclNwYWNlLCBWYWx1ZSAqQXJyYXlTaXplLAorICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgQWxsb2NhSW5zdChUeXBlICpUeSwgdW5zaWduZWQgQWRkclNwYWNlLAorICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIEFsbG9jYUluc3QoVHlwZSAqVHksIHVuc2lnbmVkIEFkZHJTcGFjZSwKKyAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIEFsbG9jYUluc3QoVHlwZSAqVHksIHVuc2lnbmVkIEFkZHJTcGFjZSwgVmFsdWUgKkFycmF5U2l6ZSwgdW5zaWduZWQgQWxpZ24sCisgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBBbGxvY2FJbnN0KFR5cGUgKlR5LCB1bnNpZ25lZCBBZGRyU3BhY2UsIFZhbHVlICpBcnJheVNpemUsIHVuc2lnbmVkIEFsaWduLAorICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGFuIGFsbG9jYXRpb24gc2l6ZSBwYXJhbWV0ZXIgdG8gdGhlIGFsbG9jYXRpb24KKyAgLy8vIGluc3RydWN0aW9uIHRoYXQgaXMgbm90IDEuCisgIGJvb2wgaXNBcnJheUFsbG9jYXRpb24oKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWxsb2NhdGVkLiBGb3IgYSBzaW1wbGUgYWxsb2NhdGlvbiBvZiBhIHNpbmdsZQorICAvLy8gZWxlbWVudCwgdGhpcyB3aWxsIHJldHVybiBhIGNvbnN0YW50IDEgdmFsdWUuCisgIGNvbnN0IFZhbHVlICpnZXRBcnJheVNpemUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisgIFZhbHVlICpnZXRBcnJheVNpemUoKSB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisKKyAgLy8vIE92ZXJsb2FkIHRvIHJldHVybiBtb3N0IHNwZWNpZmljIHBvaW50ZXIgdHlwZS4KKyAgUG9pbnRlclR5cGUgKmdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8UG9pbnRlclR5cGU+KEluc3RydWN0aW9uOjpnZXRUeXBlKCkpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgdHlwZSB0aGF0IGlzIGJlaW5nIGFsbG9jYXRlZCBieSB0aGUgaW5zdHJ1Y3Rpb24uCisgIFR5cGUgKmdldEFsbG9jYXRlZFR5cGUoKSBjb25zdCB7IHJldHVybiBBbGxvY2F0ZWRUeXBlOyB9CisgIC8vLyBmb3IgdXNlIG9ubHkgaW4gc3BlY2lhbCBjaXJjdW1zdGFuY2VzIHRoYXQgbmVlZCB0byBnZW5lcmljYWxseQorICAvLy8gdHJhbnNmb3JtIGEgd2hvbGUgaW5zdHJ1Y3Rpb24gKGVnOiBJUiBsaW5raW5nIGFuZCB2ZWN0b3JpemF0aW9uKS4KKyAgdm9pZCBzZXRBbGxvY2F0ZWRUeXBlKFR5cGUgKlR5KSB7IEFsbG9jYXRlZFR5cGUgPSBUeTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIGFsaWdubWVudCBvZiB0aGUgbWVtb3J5IHRoYXQgaXMgYmVpbmcgYWxsb2NhdGVkIGJ5IHRoZQorICAvLy8gaW5zdHJ1Y3Rpb24uCisgIHVuc2lnbmVkIGdldEFsaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKDF1IDw8IChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIDMxKSkgPj4gMTsKKyAgfQorICB2b2lkIHNldEFsaWdubWVudCh1bnNpZ25lZCBBbGlnbik7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYWxsb2NhIGlzIGluIHRoZSBlbnRyeSBibG9jayBvZiB0aGUgZnVuY3Rpb24gYW5kIGlzIGEKKyAgLy8vIGNvbnN0YW50IHNpemUuIElmIHNvLCB0aGUgY29kZSBnZW5lcmF0b3Igd2lsbCBmb2xkIGl0IGludG8gdGhlCisgIC8vLyBwcm9sb2cvZXBpbG9nIGNvZGUsIHNvIGl0IGlzIGJhc2ljYWxseSBmcmVlLgorICBib29sIGlzU3RhdGljQWxsb2NhKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYWxsb2NhIGlzIHVzZWQgYXMgYW4gaW5hbGxvY2EgYXJndW1lbnQgdG8gYSBjYWxsLiBTdWNoCisgIC8vLyBhbGxvY2FzIGFyZSBuZXZlciBjb25zaWRlcmVkIHN0YXRpYyBldmVuIGlmIHRoZXkgYXJlIGluIHRoZSBlbnRyeSBibG9jay4KKyAgYm9vbCBpc1VzZWRXaXRoSW5BbGxvY2EoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgMzI7CisgIH0KKworICAvLy8gU3BlY2lmeSB3aGV0aGVyIHRoaXMgYWxsb2NhIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBhcmd1bWVudHMgdG8gYSBjYWxsLgorICB2b2lkIHNldFVzZWRXaXRoSW5BbGxvY2EoYm9vbCBWKSB7CisgICAgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgfjMyKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFYgPyAzMiA6IDApKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFsbG9jYSBpcyB1c2VkIGFzIGEgc3dpZnRlcnJvciBhcmd1bWVudCB0byBhIGNhbGwuCisgIGJvb2wgaXNTd2lmdEVycm9yKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIDY0OworICB9CisKKyAgLy8vIFNwZWNpZnkgd2hldGhlciB0aGlzIGFsbG9jYSBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHN3aWZ0ZXJyb3IuCisgIHZvaWQgc2V0U3dpZnRFcnJvcihib29sIFYpIHsKKyAgICBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSgoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiB+NjQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoViA/IDY0IDogMCkpOworICB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiAoSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFsbG9jYSk7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9CisKK3ByaXZhdGU6CisgIC8vIFNoYWRvdyBJbnN0cnVjdGlvbjo6c2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEgd2l0aCBhIHByaXZhdGUgZm9yd2FyZGluZworICAvLyBtZXRob2Qgc28gdGhhdCBzdWJjbGFzc2VzIGNhbm5vdCBhY2NpZGVudGFsbHkgdXNlIGl0LgorICB2b2lkIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKHVuc2lnbmVkIHNob3J0IEQpIHsKKyAgICBJbnN0cnVjdGlvbjo6c2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoRCk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZEluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBBbiBpbnN0cnVjdGlvbiBmb3IgcmVhZGluZyBmcm9tIG1lbW9yeS4gVGhpcyB1c2VzIHRoZSBTdWJjbGFzc0RhdGEgZmllbGQgaW4KKy8vLyBWYWx1ZSB0byBzdG9yZSB3aGV0aGVyIG9yIG5vdCB0aGUgbG9hZCBpcyB2b2xhdGlsZS4KK2NsYXNzIExvYWRJbnN0IDogcHVibGljIFVuYXJ5SW5zdHJ1Y3Rpb24geworICB2b2lkIEFzc2VydE9LKCk7CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIExvYWRJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICBMb2FkSW5zdChWYWx1ZSAqUHRyLCBjb25zdCBUd2luZSAmTmFtZVN0ciwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisgIExvYWRJbnN0KFZhbHVlICpQdHIsIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisgIExvYWRJbnN0KFR5cGUgKlR5LCBWYWx1ZSAqUHRyLCBjb25zdCBUd2luZSAmTmFtZVN0ciwgYm9vbCBpc1ZvbGF0aWxlID0gZmFsc2UsCisgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKyAgTG9hZEluc3QoVmFsdWUgKlB0ciwgY29uc3QgVHdpbmUgJk5hbWVTdHIsIGJvb2wgaXNWb2xhdGlsZSA9IGZhbHNlLAorICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikKKyAgICAgIDogTG9hZEluc3QoY2FzdDxQb2ludGVyVHlwZT4oUHRyLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpLCBQdHIsCisgICAgICAgICAgICAgICAgIE5hbWVTdHIsIGlzVm9sYXRpbGUsIEluc2VydEJlZm9yZSkge30KKyAgTG9hZEluc3QoVmFsdWUgKlB0ciwgY29uc3QgVHdpbmUgJk5hbWVTdHIsIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworICBMb2FkSW5zdChWYWx1ZSAqUHRyLCBjb25zdCBUd2luZSAmTmFtZVN0ciwgYm9vbCBpc1ZvbGF0aWxlLCB1bnNpZ25lZCBBbGlnbiwKKyAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpCisgICAgICA6IExvYWRJbnN0KGNhc3Q8UG9pbnRlclR5cGU+KFB0ci0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSwgUHRyLAorICAgICAgICAgICAgICAgICBOYW1lU3RyLCBpc1ZvbGF0aWxlLCBBbGlnbiwgSW5zZXJ0QmVmb3JlKSB7fQorICBMb2FkSW5zdChUeXBlICpUeSwgVmFsdWUgKlB0ciwgY29uc3QgVHdpbmUgJk5hbWVTdHIsIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgdW5zaWduZWQgQWxpZ24sIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKyAgTG9hZEluc3QoVmFsdWUgKlB0ciwgY29uc3QgVHdpbmUgJk5hbWVTdHIsIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgdW5zaWduZWQgQWxpZ24sIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKyAgTG9hZEluc3QoVmFsdWUgKlB0ciwgY29uc3QgVHdpbmUgJk5hbWVTdHIsIGJvb2wgaXNWb2xhdGlsZSwgdW5zaWduZWQgQWxpZ24sCisgICAgICAgICAgIEF0b21pY09yZGVyaW5nIE9yZGVyLCBTeW5jU2NvcGU6OklEIFNTSUQgPSBTeW5jU2NvcGU6OlN5c3RlbSwKKyAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpCisgICAgICA6IExvYWRJbnN0KGNhc3Q8UG9pbnRlclR5cGU+KFB0ci0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSwgUHRyLAorICAgICAgICAgICAgICAgICBOYW1lU3RyLCBpc1ZvbGF0aWxlLCBBbGlnbiwgT3JkZXIsIFNTSUQsIEluc2VydEJlZm9yZSkge30KKyAgTG9hZEluc3QoVHlwZSAqVHksIFZhbHVlICpQdHIsIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBib29sIGlzVm9sYXRpbGUsCisgICAgICAgICAgIHVuc2lnbmVkIEFsaWduLCBBdG9taWNPcmRlcmluZyBPcmRlciwKKyAgICAgICAgICAgU3luY1Njb3BlOjpJRCBTU0lEID0gU3luY1Njb3BlOjpTeXN0ZW0sCisgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKyAgTG9hZEluc3QoVmFsdWUgKlB0ciwgY29uc3QgVHdpbmUgJk5hbWVTdHIsIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgdW5zaWduZWQgQWxpZ24sIEF0b21pY09yZGVyaW5nIE9yZGVyLCBTeW5jU2NvcGU6OklEIFNTSUQsCisgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKyAgTG9hZEluc3QoVmFsdWUgKlB0ciwgY29uc3QgY2hhciAqTmFtZVN0ciwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisgIExvYWRJbnN0KFZhbHVlICpQdHIsIGNvbnN0IGNoYXIgKk5hbWVTdHIsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKyAgTG9hZEluc3QoVHlwZSAqVHksIFZhbHVlICpQdHIsIGNvbnN0IGNoYXIgKk5hbWVTdHIgPSBudWxscHRyLAorICAgICAgICAgICBib29sIGlzVm9sYXRpbGUgPSBmYWxzZSwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBleHBsaWNpdCBMb2FkSW5zdChWYWx1ZSAqUHRyLCBjb25zdCBjaGFyICpOYW1lU3RyID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZvbGF0aWxlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKQorICAgICAgOiBMb2FkSW5zdChjYXN0PFBvaW50ZXJUeXBlPihQdHItPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCksIFB0ciwKKyAgICAgICAgICAgICAgICAgTmFtZVN0ciwgaXNWb2xhdGlsZSwgSW5zZXJ0QmVmb3JlKSB7fQorICBMb2FkSW5zdChWYWx1ZSAqUHRyLCBjb25zdCBjaGFyICpOYW1lU3RyLCBib29sIGlzVm9sYXRpbGUsCisgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGxvYWQgZnJvbSBhIHZvbGF0aWxlIG1lbW9yeSBsb2NhdGlvbi4KKyAgYm9vbCBpc1ZvbGF0aWxlKCkgY29uc3QgeyByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiAxOyB9CisKKyAgLy8vIFNwZWNpZnkgd2hldGhlciB0aGlzIGlzIGEgdm9sYXRpbGUgbG9hZCBvciBub3QuCisgIHZvaWQgc2V0Vm9sYXRpbGUoYm9vbCBWKSB7CisgICAgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgfjEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoViA/IDEgOiAwKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBhbGlnbm1lbnQgb2YgdGhlIGFjY2VzcyB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZC4KKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiAoMSA8PCAoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpID4+IDEpICYgMzEpKSA+PiAxOworICB9CisKKyAgdm9pZCBzZXRBbGlnbm1lbnQodW5zaWduZWQgQWxpZ24pOworCisgIC8vLyBSZXR1cm5zIHRoZSBvcmRlcmluZyBjb25zdHJhaW50IG9mIHRoaXMgbG9hZCBpbnN0cnVjdGlvbi4KKyAgQXRvbWljT3JkZXJpbmcgZ2V0T3JkZXJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIEF0b21pY09yZGVyaW5nKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSA+PiA3KSAmIDcpOworICB9CisKKyAgLy8vIFNldHMgdGhlIG9yZGVyaW5nIGNvbnN0cmFpbnQgb2YgdGhpcyBsb2FkIGluc3RydWN0aW9uLiAgTWF5IG5vdCBiZSBSZWxlYXNlCisgIC8vLyBvciBBY3F1aXJlUmVsZWFzZS4KKyAgdm9pZCBzZXRPcmRlcmluZyhBdG9taWNPcmRlcmluZyBPcmRlcmluZykgeworICAgIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIH4oNyA8PCA3KSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQpT3JkZXJpbmcgPDwgNykpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRCBvZiB0aGlzIGxvYWQgaW5zdHJ1Y3Rpb24uCisgIFN5bmNTY29wZTo6SUQgZ2V0U3luY1Njb3BlSUQoKSBjb25zdCB7CisgICAgcmV0dXJuIFNTSUQ7CisgIH0KKworICAvLy8gU2V0cyB0aGUgc3luY2hyb25pemF0aW9uIHNjb3BlIElEIG9mIHRoaXMgbG9hZCBpbnN0cnVjdGlvbi4KKyAgdm9pZCBzZXRTeW5jU2NvcGVJRChTeW5jU2NvcGU6OklEIFNTSUQpIHsKKyAgICB0aGlzLT5TU0lEID0gU1NJRDsKKyAgfQorCisgIC8vLyBTZXRzIHRoZSBvcmRlcmluZyBjb25zdHJhaW50IGFuZCB0aGUgc3luY2hyb25pemF0aW9uIHNjb3BlIElEIG9mIHRoaXMgbG9hZAorICAvLy8gaW5zdHJ1Y3Rpb24uCisgIHZvaWQgc2V0QXRvbWljKEF0b21pY09yZGVyaW5nIE9yZGVyaW5nLAorICAgICAgICAgICAgICAgICBTeW5jU2NvcGU6OklEIFNTSUQgPSBTeW5jU2NvcGU6OlN5c3RlbSkgeworICAgIHNldE9yZGVyaW5nKE9yZGVyaW5nKTsKKyAgICBzZXRTeW5jU2NvcGVJRChTU0lEKTsKKyAgfQorCisgIGJvb2wgaXNTaW1wbGUoKSBjb25zdCB7IHJldHVybiAhaXNBdG9taWMoKSAmJiAhaXNWb2xhdGlsZSgpOyB9CisKKyAgYm9vbCBpc1Vub3JkZXJlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldE9yZGVyaW5nKCkgPT0gQXRvbWljT3JkZXJpbmc6Ok5vdEF0b21pYyB8fAorICAgICAgICAgICAgZ2V0T3JkZXJpbmcoKSA9PSBBdG9taWNPcmRlcmluZzo6VW5vcmRlcmVkKSAmJgorICAgICAgICAgICAhaXNWb2xhdGlsZSgpOworICB9CisKKyAgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKCkgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICBjb25zdCBWYWx1ZSAqZ2V0UG9pbnRlck9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRQb2ludGVyT3BlcmFuZEluZGV4KCkgeyByZXR1cm4gMFU7IH0KKyAgVHlwZSAqZ2V0UG9pbnRlck9wZXJhbmRUeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0UG9pbnRlck9wZXJhbmQoKS0+Z2V0VHlwZSgpOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIHBvaW50ZXIgb3BlcmFuZC4KKyAgdW5zaWduZWQgZ2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UG9pbnRlck9wZXJhbmRUeXBlKCktPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKTsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkxvYWQ7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9CisKK3ByaXZhdGU6CisgIC8vIFNoYWRvdyBJbnN0cnVjdGlvbjo6c2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEgd2l0aCBhIHByaXZhdGUgZm9yd2FyZGluZworICAvLyBtZXRob2Qgc28gdGhhdCBzdWJjbGFzc2VzIGNhbm5vdCBhY2NpZGVudGFsbHkgdXNlIGl0LgorICB2b2lkIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKHVuc2lnbmVkIHNob3J0IEQpIHsKKyAgICBJbnN0cnVjdGlvbjo6c2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoRCk7CisgIH0KKworICAvLy8gVGhlIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRCBvZiB0aGlzIGxvYWQgaW5zdHJ1Y3Rpb24uICBOb3QgcXVpdGUgZW5vdWdoCisgIC8vLyByb29tIGluIFN1YkNsYXNzRGF0YSBmb3IgZXZlcnl0aGluZywgc28gc3luY2hyb25pemF0aW9uIHNjb3BlIElEIGdldHMgaXRzCisgIC8vLyBvd24gZmllbGQuCisgIFN5bmNTY29wZTo6SUQgU1NJRDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmVJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQW4gaW5zdHJ1Y3Rpb24gZm9yIHN0b3JpbmcgdG8gbWVtb3J5LgorY2xhc3MgU3RvcmVJbnN0IDogcHVibGljIEluc3RydWN0aW9uIHsKKyAgdm9pZCBBc3NlcnRPSygpOworCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBTdG9yZUluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIFN0b3JlSW5zdChWYWx1ZSAqVmFsLCBWYWx1ZSAqUHRyLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKyAgU3RvcmVJbnN0KFZhbHVlICpWYWwsIFZhbHVlICpQdHIsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKyAgU3RvcmVJbnN0KFZhbHVlICpWYWwsIFZhbHVlICpQdHIsIGJvb2wgaXNWb2xhdGlsZSA9IGZhbHNlLAorICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBTdG9yZUluc3QoVmFsdWUgKlZhbCwgVmFsdWUgKlB0ciwgYm9vbCBpc1ZvbGF0aWxlLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisgIFN0b3JlSW5zdChWYWx1ZSAqVmFsLCBWYWx1ZSAqUHRyLCBib29sIGlzVm9sYXRpbGUsCisgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBTdG9yZUluc3QoVmFsdWUgKlZhbCwgVmFsdWUgKlB0ciwgYm9vbCBpc1ZvbGF0aWxlLAorICAgICAgICAgICAgdW5zaWduZWQgQWxpZ24sIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKyAgU3RvcmVJbnN0KFZhbHVlICpWYWwsIFZhbHVlICpQdHIsIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduLCBBdG9taWNPcmRlcmluZyBPcmRlciwKKyAgICAgICAgICAgIFN5bmNTY29wZTo6SUQgU1NJRCA9IFN5bmNTY29wZTo6U3lzdGVtLAorICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBTdG9yZUluc3QoVmFsdWUgKlZhbCwgVmFsdWUgKlB0ciwgYm9vbCBpc1ZvbGF0aWxlLAorICAgICAgICAgICAgdW5zaWduZWQgQWxpZ24sIEF0b21pY09yZGVyaW5nIE9yZGVyLCBTeW5jU2NvcGU6OklEIFNTSUQsCisgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgdHdvIG9wZXJhbmRzCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMik7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHN0b3JlIHRvIGEgdm9sYXRpbGUgbWVtb3J5IGxvY2F0aW9uLgorICBib29sIGlzVm9sYXRpbGUoKSBjb25zdCB7IHJldHVybiBnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIDE7IH0KKworICAvLy8gU3BlY2lmeSB3aGV0aGVyIHRoaXMgaXMgYSB2b2xhdGlsZSBzdG9yZSBvciBub3QuCisgIHZvaWQgc2V0Vm9sYXRpbGUoYm9vbCBWKSB7CisgICAgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgfjEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoViA/IDEgOiAwKSk7CisgIH0KKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8vIFJldHVybiB0aGUgYWxpZ25tZW50IG9mIHRoZSBhY2Nlc3MgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQKKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiAoMSA8PCAoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpID4+IDEpICYgMzEpKSA+PiAxOworICB9CisKKyAgdm9pZCBzZXRBbGlnbm1lbnQodW5zaWduZWQgQWxpZ24pOworCisgIC8vLyBSZXR1cm5zIHRoZSBvcmRlcmluZyBjb25zdHJhaW50IG9mIHRoaXMgc3RvcmUgaW5zdHJ1Y3Rpb24uCisgIEF0b21pY09yZGVyaW5nIGdldE9yZGVyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBBdG9taWNPcmRlcmluZygoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgPj4gNykgJiA3KTsKKyAgfQorCisgIC8vLyBTZXRzIHRoZSBvcmRlcmluZyBjb25zdHJhaW50IG9mIHRoaXMgc3RvcmUgaW5zdHJ1Y3Rpb24uICBNYXkgbm90IGJlCisgIC8vLyBBY3F1aXJlIG9yIEFjcXVpcmVSZWxlYXNlLgorICB2b2lkIHNldE9yZGVyaW5nKEF0b21pY09yZGVyaW5nIE9yZGVyaW5nKSB7CisgICAgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgfig3IDw8IDcpKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClPcmRlcmluZyA8PCA3KSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgc3luY2hyb25pemF0aW9uIHNjb3BlIElEIG9mIHRoaXMgc3RvcmUgaW5zdHJ1Y3Rpb24uCisgIFN5bmNTY29wZTo6SUQgZ2V0U3luY1Njb3BlSUQoKSBjb25zdCB7CisgICAgcmV0dXJuIFNTSUQ7CisgIH0KKworICAvLy8gU2V0cyB0aGUgc3luY2hyb25pemF0aW9uIHNjb3BlIElEIG9mIHRoaXMgc3RvcmUgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgc2V0U3luY1Njb3BlSUQoU3luY1Njb3BlOjpJRCBTU0lEKSB7CisgICAgdGhpcy0+U1NJRCA9IFNTSUQ7CisgIH0KKworICAvLy8gU2V0cyB0aGUgb3JkZXJpbmcgY29uc3RyYWludCBhbmQgdGhlIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRCBvZiB0aGlzCisgIC8vLyBzdG9yZSBpbnN0cnVjdGlvbi4KKyAgdm9pZCBzZXRBdG9taWMoQXRvbWljT3JkZXJpbmcgT3JkZXJpbmcsCisgICAgICAgICAgICAgICAgIFN5bmNTY29wZTo6SUQgU1NJRCA9IFN5bmNTY29wZTo6U3lzdGVtKSB7CisgICAgc2V0T3JkZXJpbmcoT3JkZXJpbmcpOworICAgIHNldFN5bmNTY29wZUlEKFNTSUQpOworICB9CisKKyAgYm9vbCBpc1NpbXBsZSgpIGNvbnN0IHsgcmV0dXJuICFpc0F0b21pYygpICYmICFpc1ZvbGF0aWxlKCk7IH0KKworICBib29sIGlzVW5vcmRlcmVkKCkgY29uc3QgeworICAgIHJldHVybiAoZ2V0T3JkZXJpbmcoKSA9PSBBdG9taWNPcmRlcmluZzo6Tm90QXRvbWljIHx8CisgICAgICAgICAgICBnZXRPcmRlcmluZygpID09IEF0b21pY09yZGVyaW5nOjpVbm9yZGVyZWQpICYmCisgICAgICAgICAgICFpc1ZvbGF0aWxlKCk7CisgIH0KKworICBWYWx1ZSAqZ2V0VmFsdWVPcGVyYW5kKCkgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICBjb25zdCBWYWx1ZSAqZ2V0VmFsdWVPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorCisgIFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZCgpIHsgcmV0dXJuIGdldE9wZXJhbmQoMSk7IH0KKyAgY29uc3QgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgxKTsgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0UG9pbnRlck9wZXJhbmRJbmRleCgpIHsgcmV0dXJuIDFVOyB9CisgIFR5cGUgKmdldFBvaW50ZXJPcGVyYW5kVHlwZSgpIGNvbnN0IHsgcmV0dXJuIGdldFBvaW50ZXJPcGVyYW5kKCktPmdldFR5cGUoKTsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBwb2ludGVyIG9wZXJhbmQuCisgIHVuc2lnbmVkIGdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFBvaW50ZXJPcGVyYW5kVHlwZSgpLT5nZXRQb2ludGVyQWRkcmVzc1NwYWNlKCk7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTdG9yZTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gU2hhZG93IEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSB3aXRoIGEgcHJpdmF0ZSBmb3J3YXJkaW5nCisgIC8vIG1ldGhvZCBzbyB0aGF0IHN1YmNsYXNzZXMgY2Fubm90IGFjY2lkZW50YWxseSB1c2UgaXQuCisgIHZvaWQgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEodW5zaWduZWQgc2hvcnQgRCkgeworICAgIEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YShEKTsKKyAgfQorCisgIC8vLyBUaGUgc3luY2hyb25pemF0aW9uIHNjb3BlIElEIG9mIHRoaXMgc3RvcmUgaW5zdHJ1Y3Rpb24uICBOb3QgcXVpdGUgZW5vdWdoCisgIC8vLyByb29tIGluIFN1YkNsYXNzRGF0YSBmb3IgZXZlcnl0aGluZywgc28gc3luY2hyb25pemF0aW9uIHNjb3BlIElEIGdldHMgaXRzCisgIC8vLyBvd24gZmllbGQuCisgIFN5bmNTY29wZTo6SUQgU1NJRDsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxTdG9yZUluc3Q+IDogcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czxTdG9yZUluc3QsIDI+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhTdG9yZUluc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbmNlSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEFuIGluc3RydWN0aW9uIGZvciBvcmRlcmluZyBvdGhlciBtZW1vcnkgb3BlcmF0aW9ucy4KK2NsYXNzIEZlbmNlSW5zdCA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7CisgIHZvaWQgSW5pdChBdG9taWNPcmRlcmluZyBPcmRlcmluZywgU3luY1Njb3BlOjpJRCBTU0lEKTsKKworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgRmVuY2VJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLyBPcmRlcmluZyBtYXkgb25seSBiZSBBY3F1aXJlLCBSZWxlYXNlLCBBY3F1aXJlUmVsZWFzZSwgb3IKKyAgLy8gU2VxdWVudGlhbGx5Q29uc2lzdGVudC4KKyAgRmVuY2VJbnN0KExMVk1Db250ZXh0ICZDLCBBdG9taWNPcmRlcmluZyBPcmRlcmluZywKKyAgICAgICAgICAgIFN5bmNTY29wZTo6SUQgU1NJRCA9IFN5bmNTY29wZTo6U3lzdGVtLAorICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBGZW5jZUluc3QoTExWTUNvbnRleHQgJkMsIEF0b21pY09yZGVyaW5nIE9yZGVyaW5nLCBTeW5jU2NvcGU6OklEIFNTSUQsCisgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgemVybyBvcGVyYW5kcworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDApOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG9yZGVyaW5nIGNvbnN0cmFpbnQgb2YgdGhpcyBmZW5jZSBpbnN0cnVjdGlvbi4KKyAgQXRvbWljT3JkZXJpbmcgZ2V0T3JkZXJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIEF0b21pY09yZGVyaW5nKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpID4+IDEpOworICB9CisKKyAgLy8vIFNldHMgdGhlIG9yZGVyaW5nIGNvbnN0cmFpbnQgb2YgdGhpcyBmZW5jZSBpbnN0cnVjdGlvbi4gIE1heSBvbmx5IGJlCisgIC8vLyBBY3F1aXJlLCBSZWxlYXNlLCBBY3F1aXJlUmVsZWFzZSwgb3IgU2VxdWVudGlhbGx5Q29uc2lzdGVudC4KKyAgdm9pZCBzZXRPcmRlcmluZyhBdG9taWNPcmRlcmluZyBPcmRlcmluZykgeworICAgIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIDEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKU9yZGVyaW5nIDw8IDEpKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQgb2YgdGhpcyBmZW5jZSBpbnN0cnVjdGlvbi4KKyAgU3luY1Njb3BlOjpJRCBnZXRTeW5jU2NvcGVJRCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU1NJRDsKKyAgfQorCisgIC8vLyBTZXRzIHRoZSBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQgb2YgdGhpcyBmZW5jZSBpbnN0cnVjdGlvbi4KKyAgdm9pZCBzZXRTeW5jU2NvcGVJRChTeW5jU2NvcGU6OklEIFNTSUQpIHsKKyAgICB0aGlzLT5TU0lEID0gU1NJRDsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkZlbmNlOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorCitwcml2YXRlOgorICAvLyBTaGFkb3cgSW5zdHJ1Y3Rpb246OnNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhIHdpdGggYSBwcml2YXRlIGZvcndhcmRpbmcKKyAgLy8gbWV0aG9kIHNvIHRoYXQgc3ViY2xhc3NlcyBjYW5ub3QgYWNjaWRlbnRhbGx5IHVzZSBpdC4KKyAgdm9pZCBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSh1bnNpZ25lZCBzaG9ydCBEKSB7CisgICAgSW5zdHJ1Y3Rpb246OnNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKEQpOworICB9CisKKyAgLy8vIFRoZSBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQgb2YgdGhpcyBmZW5jZSBpbnN0cnVjdGlvbi4gIE5vdCBxdWl0ZSBlbm91Z2gKKyAgLy8vIHJvb20gaW4gU3ViQ2xhc3NEYXRhIGZvciBldmVyeXRoaW5nLCBzbyBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQgZ2V0cyBpdHMKKyAgLy8vIG93biBmaWVsZC4KKyAgU3luY1Njb3BlOjpJRCBTU0lEOworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNDbXBYY2hnSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIGFuIGluc3RydWN0aW9uIHRoYXQgYXRvbWljYWxseSBjaGVja3Mgd2hldGhlciBhCisvLy8gc3BlY2lmaWVkIHZhbHVlIGlzIGluIGEgbWVtb3J5IGxvY2F0aW9uLCBhbmQsIGlmIGl0IGlzLCBzdG9yZXMgYSBuZXcgdmFsdWUKKy8vLyB0aGVyZS4gIFJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIGxvYWRlZC4KKy8vLworY2xhc3MgQXRvbWljQ21wWGNoZ0luc3QgOiBwdWJsaWMgSW5zdHJ1Y3Rpb24geworICB2b2lkIEluaXQoVmFsdWUgKlB0ciwgVmFsdWUgKkNtcCwgVmFsdWUgKk5ld1ZhbCwKKyAgICAgICAgICAgIEF0b21pY09yZGVyaW5nIFN1Y2Nlc3NPcmRlcmluZywgQXRvbWljT3JkZXJpbmcgRmFpbHVyZU9yZGVyaW5nLAorICAgICAgICAgICAgU3luY1Njb3BlOjpJRCBTU0lEKTsKKworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgQXRvbWljQ21wWGNoZ0luc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIEF0b21pY0NtcFhjaGdJbnN0KFZhbHVlICpQdHIsIFZhbHVlICpDbXAsIFZhbHVlICpOZXdWYWwsCisgICAgICAgICAgICAgICAgICAgIEF0b21pY09yZGVyaW5nIFN1Y2Nlc3NPcmRlcmluZywKKyAgICAgICAgICAgICAgICAgICAgQXRvbWljT3JkZXJpbmcgRmFpbHVyZU9yZGVyaW5nLAorICAgICAgICAgICAgICAgICAgICBTeW5jU2NvcGU6OklEIFNTSUQsIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKyAgQXRvbWljQ21wWGNoZ0luc3QoVmFsdWUgKlB0ciwgVmFsdWUgKkNtcCwgVmFsdWUgKk5ld1ZhbCwKKyAgICAgICAgICAgICAgICAgICAgQXRvbWljT3JkZXJpbmcgU3VjY2Vzc09yZGVyaW5nLAorICAgICAgICAgICAgICAgICAgICBBdG9taWNPcmRlcmluZyBGYWlsdXJlT3JkZXJpbmcsCisgICAgICAgICAgICAgICAgICAgIFN5bmNTY29wZTo6SUQgU1NJRCwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IHRocmVlIG9wZXJhbmRzCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMyk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGNtcHhjaGcgZnJvbSBhIHZvbGF0aWxlIG1lbW9yeQorICAvLy8gbG9jYXRpb24uCisgIC8vLworICBib29sIGlzVm9sYXRpbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgMTsKKyAgfQorCisgIC8vLyBTcGVjaWZ5IHdoZXRoZXIgdGhpcyBpcyBhIHZvbGF0aWxlIGNtcHhjaGcuCisgIC8vLworICB2b2lkIHNldFZvbGF0aWxlKGJvb2wgVikgeworICAgICBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSgoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiB+MSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpVik7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBjbXB4Y2hnIG1heSBzcHVyaW91c2x5IGZhaWwuCisgIGJvb2wgaXNXZWFrKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIDB4MTAwOworICB9CisKKyAgdm9pZCBzZXRXZWFrKGJvb2wgSXNXZWFrKSB7CisgICAgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgfjB4MTAwKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElzV2VhayA8PCA4KSk7CisgIH0KKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8vIFJldHVybnMgdGhlIHN1Y2Nlc3Mgb3JkZXJpbmcgY29uc3RyYWludCBvZiB0aGlzIGNtcHhjaGcgaW5zdHJ1Y3Rpb24uCisgIEF0b21pY09yZGVyaW5nIGdldFN1Y2Nlc3NPcmRlcmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gQXRvbWljT3JkZXJpbmcoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpID4+IDIpICYgNyk7CisgIH0KKworICAvLy8gU2V0cyB0aGUgc3VjY2VzcyBvcmRlcmluZyBjb25zdHJhaW50IG9mIHRoaXMgY21weGNoZyBpbnN0cnVjdGlvbi4KKyAgdm9pZCBzZXRTdWNjZXNzT3JkZXJpbmcoQXRvbWljT3JkZXJpbmcgT3JkZXJpbmcpIHsKKyAgICBhc3NlcnQoT3JkZXJpbmcgIT0gQXRvbWljT3JkZXJpbmc6Ok5vdEF0b21pYyAmJgorICAgICAgICAgICAiQ21wWGNoZyBpbnN0cnVjdGlvbnMgY2FuIG9ubHkgYmUgYXRvbWljLiIpOworICAgIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIH4weDFjKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClPcmRlcmluZyA8PCAyKSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgZmFpbHVyZSBvcmRlcmluZyBjb25zdHJhaW50IG9mIHRoaXMgY21weGNoZyBpbnN0cnVjdGlvbi4KKyAgQXRvbWljT3JkZXJpbmcgZ2V0RmFpbHVyZU9yZGVyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBBdG9taWNPcmRlcmluZygoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgPj4gNSkgJiA3KTsKKyAgfQorCisgIC8vLyBTZXRzIHRoZSBmYWlsdXJlIG9yZGVyaW5nIGNvbnN0cmFpbnQgb2YgdGhpcyBjbXB4Y2hnIGluc3RydWN0aW9uLgorICB2b2lkIHNldEZhaWx1cmVPcmRlcmluZyhBdG9taWNPcmRlcmluZyBPcmRlcmluZykgeworICAgIGFzc2VydChPcmRlcmluZyAhPSBBdG9taWNPcmRlcmluZzo6Tm90QXRvbWljICYmCisgICAgICAgICAgICJDbXBYY2hnIGluc3RydWN0aW9ucyBjYW4gb25seSBiZSBhdG9taWMuIik7CisgICAgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgfjB4ZTApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKU9yZGVyaW5nIDw8IDUpKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQgb2YgdGhpcyBjbXB4Y2hnIGluc3RydWN0aW9uLgorICBTeW5jU2NvcGU6OklEIGdldFN5bmNTY29wZUlEKCkgY29uc3QgeworICAgIHJldHVybiBTU0lEOworICB9CisKKyAgLy8vIFNldHMgdGhlIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRCBvZiB0aGlzIGNtcHhjaGcgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgc2V0U3luY1Njb3BlSUQoU3luY1Njb3BlOjpJRCBTU0lEKSB7CisgICAgdGhpcy0+U1NJRCA9IFNTSUQ7CisgIH0KKworICBWYWx1ZSAqZ2V0UG9pbnRlck9wZXJhbmQoKSB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisgIGNvbnN0IFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldFBvaW50ZXJPcGVyYW5kSW5kZXgoKSB7IHJldHVybiAwVTsgfQorCisgIFZhbHVlICpnZXRDb21wYXJlT3BlcmFuZCgpIHsgcmV0dXJuIGdldE9wZXJhbmQoMSk7IH0KKyAgY29uc3QgVmFsdWUgKmdldENvbXBhcmVPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgxKTsgfQorCisgIFZhbHVlICpnZXROZXdWYWxPcGVyYW5kKCkgeyByZXR1cm4gZ2V0T3BlcmFuZCgyKTsgfQorICBjb25zdCBWYWx1ZSAqZ2V0TmV3VmFsT3BlcmFuZCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMik7IH0KKworICAvLy8gUmV0dXJucyB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgcG9pbnRlciBvcGVyYW5kLgorICB1bnNpZ25lZCBnZXRQb2ludGVyQWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQb2ludGVyT3BlcmFuZCgpLT5nZXRUeXBlKCktPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBzdHJvbmdlc3QgcGVybWl0dGVkIG9yZGVyaW5nIG9uIGZhaWx1cmUsIGdpdmVuIHRoZQorICAvLy8gZGVzaXJlZCBvcmRlcmluZyBvbiBzdWNjZXNzLgorICAvLy8KKyAgLy8vIElmIHRoZSBjb21wYXJpc29uIGluIGEgY21weGNoZyBvcGVyYXRpb24gZmFpbHMsIHRoZXJlIGlzIG5vIGF0b21pYyBzdG9yZQorICAvLy8gc28gcmVsZWFzZSBzZW1hbnRpY3MgY2Fubm90IGJlIHByb3ZpZGVkLiBTbyB0aGlzIGZ1bmN0aW9uIGRyb3BzIGV4cGxpY2l0CisgIC8vLyBSZWxlYXNlIHJlcXVlc3RzIGZyb20gdGhlIEF0b21pY09yZGVyaW5nLiBBIFNlcXVlbnRpYWxseUNvbnNpc3RlbnQKKyAgLy8vIG9wZXJhdGlvbiB3b3VsZCByZW1haW4gU2VxdWVudGlhbGx5Q29uc2lzdGVudC4KKyAgc3RhdGljIEF0b21pY09yZGVyaW5nCisgIGdldFN0cm9uZ2VzdEZhaWx1cmVPcmRlcmluZyhBdG9taWNPcmRlcmluZyBTdWNjZXNzT3JkZXJpbmcpIHsKKyAgICBzd2l0Y2ggKFN1Y2Nlc3NPcmRlcmluZykgeworICAgIGRlZmF1bHQ6CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJpbnZhbGlkIGNtcHhjaGcgc3VjY2VzcyBvcmRlcmluZyIpOworICAgIGNhc2UgQXRvbWljT3JkZXJpbmc6OlJlbGVhc2U6CisgICAgY2FzZSBBdG9taWNPcmRlcmluZzo6TW9ub3RvbmljOgorICAgICAgcmV0dXJuIEF0b21pY09yZGVyaW5nOjpNb25vdG9uaWM7CisgICAgY2FzZSBBdG9taWNPcmRlcmluZzo6QWNxdWlyZVJlbGVhc2U6CisgICAgY2FzZSBBdG9taWNPcmRlcmluZzo6QWNxdWlyZToKKyAgICAgIHJldHVybiBBdG9taWNPcmRlcmluZzo6QWNxdWlyZTsKKyAgICBjYXNlIEF0b21pY09yZGVyaW5nOjpTZXF1ZW50aWFsbHlDb25zaXN0ZW50OgorICAgICAgcmV0dXJuIEF0b21pY09yZGVyaW5nOjpTZXF1ZW50aWFsbHlDb25zaXN0ZW50OworICAgIH0KKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkF0b21pY0NtcFhjaGc7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9CisKK3ByaXZhdGU6CisgIC8vIFNoYWRvdyBJbnN0cnVjdGlvbjo6c2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEgd2l0aCBhIHByaXZhdGUgZm9yd2FyZGluZworICAvLyBtZXRob2Qgc28gdGhhdCBzdWJjbGFzc2VzIGNhbm5vdCBhY2NpZGVudGFsbHkgdXNlIGl0LgorICB2b2lkIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKHVuc2lnbmVkIHNob3J0IEQpIHsKKyAgICBJbnN0cnVjdGlvbjo6c2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoRCk7CisgIH0KKworICAvLy8gVGhlIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRCBvZiB0aGlzIGNtcHhjaGcgaW5zdHJ1Y3Rpb24uICBOb3QgcXVpdGUKKyAgLy8vIGVub3VnaCByb29tIGluIFN1YkNsYXNzRGF0YSBmb3IgZXZlcnl0aGluZywgc28gc3luY2hyb25pemF0aW9uIHNjb3BlIElECisgIC8vLyBnZXRzIGl0cyBvd24gZmllbGQuCisgIFN5bmNTY29wZTo6SUQgU1NJRDsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxBdG9taWNDbXBYY2hnSW5zdD4gOgorICAgIHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8QXRvbWljQ21wWGNoZ0luc3QsIDM+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhBdG9taWNDbXBYY2hnSW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljUk1XSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIGFuIGluc3RydWN0aW9uIHRoYXQgYXRvbWljYWxseSByZWFkcyBhIG1lbW9yeSBsb2NhdGlvbiwKKy8vLyBjb21iaW5lcyBpdCB3aXRoIGFub3RoZXIgdmFsdWUsIGFuZCB0aGVuIHN0b3JlcyB0aGUgcmVzdWx0IGJhY2suICBSZXR1cm5zCisvLy8gdGhlIG9sZCB2YWx1ZS4KKy8vLworY2xhc3MgQXRvbWljUk1XSW5zdCA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBBdG9taWNSTVdJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gVGhpcyBlbnVtZXJhdGlvbiBsaXN0cyB0aGUgcG9zc2libGUgbW9kaWZpY2F0aW9ucyBhdG9taWNybXcgY2FuIG1ha2UuICBJbgorICAvLy8gdGhlIGRlc2NyaXB0aW9ucywgJ3AnIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBpbnN0cnVjdGlvbidzIG1lbW9yeSBsb2NhdGlvbiwKKyAgLy8vICdvbGQnIGlzIHRoZSBpbml0aWFsIHZhbHVlIG9mICpwLCBhbmQgJ3YnIGlzIHRoZSBvdGhlciB2YWx1ZSBwYXNzZWQgdG8gdGhlCisgIC8vLyBpbnN0cnVjdGlvbi4gIFRoZXNlIGluc3RydWN0aW9ucyBhbHdheXMgcmV0dXJuICdvbGQnLgorICBlbnVtIEJpbk9wIHsKKyAgICAvLy8gKnAgPSB2CisgICAgWGNoZywKKyAgICAvLy8gKnAgPSBvbGQgKyB2CisgICAgQWRkLAorICAgIC8vLyAqcCA9IG9sZCAtIHYKKyAgICBTdWIsCisgICAgLy8vICpwID0gb2xkICYgdgorICAgIEFuZCwKKyAgICAvLy8gKnAgPSB+KG9sZCAmIHYpCisgICAgTmFuZCwKKyAgICAvLy8gKnAgPSBvbGQgfCB2CisgICAgT3IsCisgICAgLy8vICpwID0gb2xkIF4gdgorICAgIFhvciwKKyAgICAvLy8gKnAgPSBvbGQgPnNpZ25lZCB2ID8gb2xkIDogdgorICAgIE1heCwKKyAgICAvLy8gKnAgPSBvbGQgPHNpZ25lZCB2ID8gb2xkIDogdgorICAgIE1pbiwKKyAgICAvLy8gKnAgPSBvbGQgPnVuc2lnbmVkIHYgPyBvbGQgOiB2CisgICAgVU1heCwKKyAgICAvLy8gKnAgPSBvbGQgPHVuc2lnbmVkIHYgPyBvbGQgOiB2CisgICAgVU1pbiwKKworICAgIEZJUlNUX0JJTk9QID0gWGNoZywKKyAgICBMQVNUX0JJTk9QID0gVU1pbiwKKyAgICBCQURfQklOT1AKKyAgfTsKKworICBBdG9taWNSTVdJbnN0KEJpbk9wIE9wZXJhdGlvbiwgVmFsdWUgKlB0ciwgVmFsdWUgKlZhbCwKKyAgICAgICAgICAgICAgICBBdG9taWNPcmRlcmluZyBPcmRlcmluZywgU3luY1Njb3BlOjpJRCBTU0lELAorICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKyAgQXRvbWljUk1XSW5zdChCaW5PcCBPcGVyYXRpb24sIFZhbHVlICpQdHIsIFZhbHVlICpWYWwsCisgICAgICAgICAgICAgICAgQXRvbWljT3JkZXJpbmcgT3JkZXJpbmcsIFN5bmNTY29wZTo6SUQgU1NJRCwKKyAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgdHdvIG9wZXJhbmRzCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMik7CisgIH0KKworICBCaW5PcCBnZXRPcGVyYXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEJpbk9wPihnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSA+PiA1KTsKKyAgfQorCisgIHZvaWQgc2V0T3BlcmF0aW9uKEJpbk9wIE9wZXJhdGlvbikgeworICAgIHVuc2lnbmVkIHNob3J0IFN1YmNsYXNzRGF0YSA9IGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpOworICAgIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKChTdWJjbGFzc0RhdGEgJiAzMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPcGVyYXRpb24gPDwgNSkpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBSTVcgb24gYSB2b2xhdGlsZSBtZW1vcnkgbG9jYXRpb24uCisgIC8vLworICBib29sIGlzVm9sYXRpbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgMTsKKyAgfQorCisgIC8vLyBTcGVjaWZ5IHdoZXRoZXIgdGhpcyBpcyBhIHZvbGF0aWxlIFJNVyBvciBub3QuCisgIC8vLworICB2b2lkIHNldFZvbGF0aWxlKGJvb2wgVikgeworICAgICBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSgoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiB+MSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpVik7CisgIH0KKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8vIFJldHVybnMgdGhlIG9yZGVyaW5nIGNvbnN0cmFpbnQgb2YgdGhpcyBybXcgaW5zdHJ1Y3Rpb24uCisgIEF0b21pY09yZGVyaW5nIGdldE9yZGVyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBBdG9taWNPcmRlcmluZygoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgPj4gMikgJiA3KTsKKyAgfQorCisgIC8vLyBTZXRzIHRoZSBvcmRlcmluZyBjb25zdHJhaW50IG9mIHRoaXMgcm13IGluc3RydWN0aW9uLgorICB2b2lkIHNldE9yZGVyaW5nKEF0b21pY09yZGVyaW5nIE9yZGVyaW5nKSB7CisgICAgYXNzZXJ0KE9yZGVyaW5nICE9IEF0b21pY09yZGVyaW5nOjpOb3RBdG9taWMgJiYKKyAgICAgICAgICAgImF0b21pY3JtdyBpbnN0cnVjdGlvbnMgY2FuIG9ubHkgYmUgYXRvbWljLiIpOworICAgIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIH4oNyA8PCAyKSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQpT3JkZXJpbmcgPDwgMikpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRCBvZiB0aGlzIHJtdyBpbnN0cnVjdGlvbi4KKyAgU3luY1Njb3BlOjpJRCBnZXRTeW5jU2NvcGVJRCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU1NJRDsKKyAgfQorCisgIC8vLyBTZXRzIHRoZSBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQgb2YgdGhpcyBybXcgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgc2V0U3luY1Njb3BlSUQoU3luY1Njb3BlOjpJRCBTU0lEKSB7CisgICAgdGhpcy0+U1NJRCA9IFNTSUQ7CisgIH0KKworICBWYWx1ZSAqZ2V0UG9pbnRlck9wZXJhbmQoKSB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisgIGNvbnN0IFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldFBvaW50ZXJPcGVyYW5kSW5kZXgoKSB7IHJldHVybiAwVTsgfQorCisgIFZhbHVlICpnZXRWYWxPcGVyYW5kKCkgeyByZXR1cm4gZ2V0T3BlcmFuZCgxKTsgfQorICBjb25zdCBWYWx1ZSAqZ2V0VmFsT3BlcmFuZCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMSk7IH0KKworICAvLy8gUmV0dXJucyB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgcG9pbnRlciBvcGVyYW5kLgorICB1bnNpZ25lZCBnZXRQb2ludGVyQWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQb2ludGVyT3BlcmFuZCgpLT5nZXRUeXBlKCktPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKTsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkF0b21pY1JNVzsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBJbml0KEJpbk9wIE9wZXJhdGlvbiwgVmFsdWUgKlB0ciwgVmFsdWUgKlZhbCwKKyAgICAgICAgICAgIEF0b21pY09yZGVyaW5nIE9yZGVyaW5nLCBTeW5jU2NvcGU6OklEIFNTSUQpOworCisgIC8vIFNoYWRvdyBJbnN0cnVjdGlvbjo6c2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEgd2l0aCBhIHByaXZhdGUgZm9yd2FyZGluZworICAvLyBtZXRob2Qgc28gdGhhdCBzdWJjbGFzc2VzIGNhbm5vdCBhY2NpZGVudGFsbHkgdXNlIGl0LgorICB2b2lkIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKHVuc2lnbmVkIHNob3J0IEQpIHsKKyAgICBJbnN0cnVjdGlvbjo6c2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoRCk7CisgIH0KKworICAvLy8gVGhlIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRCBvZiB0aGlzIHJtdyBpbnN0cnVjdGlvbi4gIE5vdCBxdWl0ZSBlbm91Z2gKKyAgLy8vIHJvb20gaW4gU3ViQ2xhc3NEYXRhIGZvciBldmVyeXRoaW5nLCBzbyBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQgZ2V0cyBpdHMKKyAgLy8vIG93biBmaWVsZC4KKyAgU3luY1Njb3BlOjpJRCBTU0lEOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPEF0b21pY1JNV0luc3Q+CisgICAgOiBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPEF0b21pY1JNV0luc3QsMj4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKEF0b21pY1JNV0luc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEVsZW1lbnRQdHJJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBjaGVja0dFUFR5cGUgLSBTaW1wbGUgd3JhcHBlciBmdW5jdGlvbiB0byBnaXZlIGEgYmV0dGVyIGFzc2VydGlvbiBmYWlsdXJlCisvLyBtZXNzYWdlIG9uIGJhZCBpbmRleGVzIGZvciBhIGdlcCBpbnN0cnVjdGlvbi4KKy8vCitpbmxpbmUgVHlwZSAqY2hlY2tHRVBUeXBlKFR5cGUgKlR5KSB7CisgIGFzc2VydChUeSAmJiAiSW52YWxpZCBHZXRFbGVtZW50UHRySW5zdCBpbmRpY2VzIGZvciB0eXBlISIpOworICByZXR1cm4gVHk7Cit9CisKKy8vLyBhbiBpbnN0cnVjdGlvbiBmb3IgdHlwZS1zYWZlIHBvaW50ZXIgYXJpdGhtZXRpYyB0bworLy8vIGFjY2VzcyBlbGVtZW50cyBvZiBhcnJheXMgYW5kIHN0cnVjdHMKKy8vLworY2xhc3MgR2V0RWxlbWVudFB0ckluc3QgOiBwdWJsaWMgSW5zdHJ1Y3Rpb24geworICBUeXBlICpTb3VyY2VFbGVtZW50VHlwZTsKKyAgVHlwZSAqUmVzdWx0RWxlbWVudFR5cGU7CisKKyAgR2V0RWxlbWVudFB0ckluc3QoY29uc3QgR2V0RWxlbWVudFB0ckluc3QgJkdFUEkpOworCisgIC8vLyBDb25zdHJ1Y3RvcnMgLSBDcmVhdGUgYSBnZXRlbGVtZW50cHRyIGluc3RydWN0aW9uIHdpdGggYSBiYXNlIHBvaW50ZXIgYW4KKyAgLy8vIGxpc3Qgb2YgaW5kaWNlcy4gVGhlIGZpcnN0IGN0b3IgY2FuIG9wdGlvbmFsbHkgaW5zZXJ0IGJlZm9yZSBhbiBleGlzdGluZworICAvLy8gaW5zdHJ1Y3Rpb24sIHRoZSBzZWNvbmQgYXBwZW5kcyB0aGUgbmV3IGluc3RydWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQKKyAgLy8vIEJhc2ljQmxvY2suCisgIGlubGluZSBHZXRFbGVtZW50UHRySW5zdChUeXBlICpQb2ludGVlVHlwZSwgVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IElkeExpc3QsIHVuc2lnbmVkIFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKyAgaW5saW5lIEdldEVsZW1lbnRQdHJJbnN0KFR5cGUgKlBvaW50ZWVUeXBlLCBWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCwgdW5zaWduZWQgVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICB2b2lkIGluaXQoVmFsdWUgKlB0ciwgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCwgY29uc3QgVHdpbmUgJk5hbWVTdHIpOworCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBHZXRFbGVtZW50UHRySW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgc3RhdGljIEdldEVsZW1lbnRQdHJJbnN0ICpDcmVhdGUoVHlwZSAqUG9pbnRlZVR5cGUsIFZhbHVlICpQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IElkeExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKSB7CisgICAgdW5zaWduZWQgVmFsdWVzID0gMSArIHVuc2lnbmVkKElkeExpc3Quc2l6ZSgpKTsKKyAgICBpZiAoIVBvaW50ZWVUeXBlKQorICAgICAgUG9pbnRlZVR5cGUgPQorICAgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KFB0ci0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpOworICAgIGVsc2UKKyAgICAgIGFzc2VydCgKKyAgICAgICAgICBQb2ludGVlVHlwZSA9PQorICAgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KFB0ci0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICByZXR1cm4gbmV3IChWYWx1ZXMpIEdldEVsZW1lbnRQdHJJbnN0KFBvaW50ZWVUeXBlLCBQdHIsIElkeExpc3QsIFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVTdHIsIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgR2V0RWxlbWVudFB0ckluc3QgKkNyZWF0ZShUeXBlICpQb2ludGVlVHlwZSwgVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgdW5zaWduZWQgVmFsdWVzID0gMSArIHVuc2lnbmVkKElkeExpc3Quc2l6ZSgpKTsKKyAgICBpZiAoIVBvaW50ZWVUeXBlKQorICAgICAgUG9pbnRlZVR5cGUgPQorICAgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KFB0ci0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpOworICAgIGVsc2UKKyAgICAgIGFzc2VydCgKKyAgICAgICAgICBQb2ludGVlVHlwZSA9PQorICAgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KFB0ci0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICByZXR1cm4gbmV3IChWYWx1ZXMpIEdldEVsZW1lbnRQdHJJbnN0KFBvaW50ZWVUeXBlLCBQdHIsIElkeExpc3QsIFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVTdHIsIEluc2VydEF0RW5kKTsKKyAgfQorCisgIC8vLyBDcmVhdGUgYW4gImluYm91bmRzIiBnZXRlbGVtZW50cHRyLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZQorICAvLy8gImluYm91bmRzIiBmbGFnIGluIExhbmdSZWYuaHRtbCBmb3IgZGV0YWlscy4KKyAgc3RhdGljIEdldEVsZW1lbnRQdHJJbnN0ICpDcmVhdGVJbkJvdW5kcyhWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IElkeExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cil7CisgICAgcmV0dXJuIENyZWF0ZUluQm91bmRzKG51bGxwdHIsIFB0ciwgSWR4TGlzdCwgTmFtZVN0ciwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBHZXRFbGVtZW50UHRySW5zdCAqCisgIENyZWF0ZUluQm91bmRzKFR5cGUgKlBvaW50ZWVUeXBlLCBWYWx1ZSAqUHRyLCBBcnJheVJlZjxWYWx1ZSAqPiBJZHhMaXN0LAorICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLAorICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIEdldEVsZW1lbnRQdHJJbnN0ICpHRVAgPQorICAgICAgICBDcmVhdGUoUG9pbnRlZVR5cGUsIFB0ciwgSWR4TGlzdCwgTmFtZVN0ciwgSW5zZXJ0QmVmb3JlKTsKKyAgICBHRVAtPnNldElzSW5Cb3VuZHModHJ1ZSk7CisgICAgcmV0dXJuIEdFUDsKKyAgfQorCisgIHN0YXRpYyBHZXRFbGVtZW50UHRySW5zdCAqQ3JlYXRlSW5Cb3VuZHMoVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBJZHhMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgcmV0dXJuIENyZWF0ZUluQm91bmRzKG51bGxwdHIsIFB0ciwgSWR4TGlzdCwgTmFtZVN0ciwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgc3RhdGljIEdldEVsZW1lbnRQdHJJbnN0ICpDcmVhdGVJbkJvdW5kcyhUeXBlICpQb2ludGVlVHlwZSwgVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBJZHhMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgR2V0RWxlbWVudFB0ckluc3QgKkdFUCA9CisgICAgICAgIENyZWF0ZShQb2ludGVlVHlwZSwgUHRyLCBJZHhMaXN0LCBOYW1lU3RyLCBJbnNlcnRBdEVuZCk7CisgICAgR0VQLT5zZXRJc0luQm91bmRzKHRydWUpOworICAgIHJldHVybiBHRVA7CisgIH0KKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgVHlwZSAqZ2V0U291cmNlRWxlbWVudFR5cGUoKSBjb25zdCB7IHJldHVybiBTb3VyY2VFbGVtZW50VHlwZTsgfQorCisgIHZvaWQgc2V0U291cmNlRWxlbWVudFR5cGUoVHlwZSAqVHkpIHsgU291cmNlRWxlbWVudFR5cGUgPSBUeTsgfQorICB2b2lkIHNldFJlc3VsdEVsZW1lbnRUeXBlKFR5cGUgKlR5KSB7IFJlc3VsdEVsZW1lbnRUeXBlID0gVHk7IH0KKworICBUeXBlICpnZXRSZXN1bHRFbGVtZW50VHlwZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoUmVzdWx0RWxlbWVudFR5cGUgPT0KKyAgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oZ2V0VHlwZSgpLT5nZXRTY2FsYXJUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICByZXR1cm4gUmVzdWx0RWxlbWVudFR5cGU7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGlzIGluc3RydWN0aW9uJ3MgcG9pbnRlciB0eXBlLgorICB1bnNpZ25lZCBnZXRBZGRyZXNzU3BhY2UoKSBjb25zdCB7CisgICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBwb2ludGVyIG9wZXJhbmQncyBhZGRyZXNzIHNwYWNlCisgICAgLy8gYW5kIHRoYXQgaXMgY2hlYXBlciB0byBjb21wdXRlLCBzbyBjaGVhdCBoZXJlLgorICAgIHJldHVybiBnZXRQb2ludGVyQWRkcmVzc1NwYWNlKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudCB0aGF0IHdvdWxkIGJlIGxvYWRlZCB3aXRoCisgIC8vLyBhIGxvYWQgaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisgIC8vLworICAvLy8gTnVsbCBpcyByZXR1cm5lZCBpZiB0aGUgaW5kaWNlcyBhcmUgaW52YWxpZCBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gcG9pbnRlciB0eXBlLgorICAvLy8KKyAgc3RhdGljIFR5cGUgKmdldEluZGV4ZWRUeXBlKFR5cGUgKlR5LCBBcnJheVJlZjxWYWx1ZSAqPiBJZHhMaXN0KTsKKyAgc3RhdGljIFR5cGUgKmdldEluZGV4ZWRUeXBlKFR5cGUgKlR5LCBBcnJheVJlZjxDb25zdGFudCAqPiBJZHhMaXN0KTsKKyAgc3RhdGljIFR5cGUgKmdldEluZGV4ZWRUeXBlKFR5cGUgKlR5LCBBcnJheVJlZjx1aW50NjRfdD4gSWR4TGlzdCk7CisKKyAgaW5saW5lIG9wX2l0ZXJhdG9yICAgICAgIGlkeF9iZWdpbigpICAgICAgIHsgcmV0dXJuIG9wX2JlZ2luKCkrMTsgfQorICBpbmxpbmUgY29uc3Rfb3BfaXRlcmF0b3IgaWR4X2JlZ2luKCkgY29uc3QgeyByZXR1cm4gb3BfYmVnaW4oKSsxOyB9CisgIGlubGluZSBvcF9pdGVyYXRvciAgICAgICBpZHhfZW5kKCkgICAgICAgICB7IHJldHVybiBvcF9lbmQoKTsgfQorICBpbmxpbmUgY29uc3Rfb3BfaXRlcmF0b3IgaWR4X2VuZCgpICAgY29uc3QgeyByZXR1cm4gb3BfZW5kKCk7IH0KKworICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8b3BfaXRlcmF0b3I+IGluZGljZXMoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoaWR4X2JlZ2luKCksIGlkeF9lbmQoKSk7CisgIH0KKworICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8Y29uc3Rfb3BfaXRlcmF0b3I+IGluZGljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoaWR4X2JlZ2luKCksIGlkeF9lbmQoKSk7CisgIH0KKworICBWYWx1ZSAqZ2V0UG9pbnRlck9wZXJhbmQoKSB7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoMCk7CisgIH0KKyAgY29uc3QgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDApOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRQb2ludGVyT3BlcmFuZEluZGV4KCkgeworICAgIHJldHVybiAwVTsgICAgLy8gZ2V0IGluZGV4IGZvciBtb2RpZnlpbmcgY29ycmVjdCBvcGVyYW5kLgorICB9CisKKyAgLy8vIE1ldGhvZCB0byByZXR1cm4gdGhlIHBvaW50ZXIgb3BlcmFuZCBhcyBhCisgIC8vLyBQb2ludGVyVHlwZS4KKyAgVHlwZSAqZ2V0UG9pbnRlck9wZXJhbmRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQb2ludGVyT3BlcmFuZCgpLT5nZXRUeXBlKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgcG9pbnRlciBvcGVyYW5kLgorICB1bnNpZ25lZCBnZXRQb2ludGVyQWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQb2ludGVyT3BlcmFuZFR5cGUoKS0+Z2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHBvaW50ZXIgdHlwZSByZXR1cm5lZCBieSB0aGUgR0VQCisgIC8vLyBpbnN0cnVjdGlvbiwgd2hpY2ggbWF5IGJlIGEgdmVjdG9yIG9mIHBvaW50ZXJzLgorICBzdGF0aWMgVHlwZSAqZ2V0R0VQUmV0dXJuVHlwZShWYWx1ZSAqUHRyLCBBcnJheVJlZjxWYWx1ZSAqPiBJZHhMaXN0KSB7CisgICAgcmV0dXJuIGdldEdFUFJldHVyblR5cGUoCisgICAgICBjYXN0PFBvaW50ZXJUeXBlPihQdHItPmdldFR5cGUoKS0+Z2V0U2NhbGFyVHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSwKKyAgICAgIFB0ciwgSWR4TGlzdCk7CisgIH0KKyAgc3RhdGljIFR5cGUgKmdldEdFUFJldHVyblR5cGUoVHlwZSAqRWxUeSwgVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCkgeworICAgIFR5cGUgKlB0clR5ID0gUG9pbnRlclR5cGU6OmdldChjaGVja0dFUFR5cGUoZ2V0SW5kZXhlZFR5cGUoRWxUeSwgSWR4TGlzdCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHItPmdldFR5cGUoKS0+Z2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpKTsKKyAgICAvLyBWZWN0b3IgR0VQCisgICAgaWYgKFB0ci0+Z2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkpIHsKKyAgICAgIHVuc2lnbmVkIE51bUVsZW0gPSBQdHItPmdldFR5cGUoKS0+Z2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICAgIHJldHVybiBWZWN0b3JUeXBlOjpnZXQoUHRyVHksIE51bUVsZW0pOworICAgIH0KKyAgICBmb3IgKFZhbHVlICpJbmRleCA6IElkeExpc3QpCisgICAgICBpZiAoSW5kZXgtPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpKSB7CisgICAgICAgIHVuc2lnbmVkIE51bUVsZW0gPSBJbmRleC0+Z2V0VHlwZSgpLT5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgICAgICByZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KFB0clR5LCBOdW1FbGVtKTsKKyAgICAgIH0KKyAgICAvLyBTY2FsYXIgR0VQCisgICAgcmV0dXJuIFB0clR5OworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtSW5kaWNlcygpIGNvbnN0IHsgIC8vIE5vdGU6IGFsd2F5cyBub24tbmVnYXRpdmUKKyAgICByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSAtIDE7CisgIH0KKworICBib29sIGhhc0luZGljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE51bU9wZXJhbmRzKCkgPiAxOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGFsbCBvZiB0aGUgaW5kaWNlcyBvZiB0aGlzIEdFUCBhcmUKKyAgLy8vIHplcm9zLiAgSWYgc28sIHRoZSByZXN1bHQgcG9pbnRlciBhbmQgdGhlIGZpcnN0IG9wZXJhbmQgaGF2ZSB0aGUgc2FtZQorICAvLy8gdmFsdWUsIGp1c3QgcG90ZW50aWFsbHkgZGlmZmVyZW50IHR5cGVzLgorICBib29sIGhhc0FsbFplcm9JbmRpY2VzKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGFsbCBvZiB0aGUgaW5kaWNlcyBvZiB0aGlzIEdFUCBhcmUKKyAgLy8vIGNvbnN0YW50IGludGVnZXJzLiAgSWYgc28sIHRoZSByZXN1bHQgcG9pbnRlciBhbmQgdGhlIGZpcnN0IG9wZXJhbmQgaGF2ZQorICAvLy8gYSBjb25zdGFudCBvZmZzZXQgYmV0d2VlbiB0aGVtLgorICBib29sIGhhc0FsbENvbnN0YW50SW5kaWNlcygpIGNvbnN0OworCisgIC8vLyBTZXQgb3IgY2xlYXIgdGhlIGluYm91bmRzIGZsYWcgb24gdGhpcyBHRVAgaW5zdHJ1Y3Rpb24uCisgIC8vLyBTZWUgTGFuZ1JlZi5odG1sIGZvciB0aGUgbWVhbmluZyBvZiBpbmJvdW5kcyBvbiBhIGdldGVsZW1lbnRwdHIuCisgIHZvaWQgc2V0SXNJbkJvdW5kcyhib29sIGIgPSB0cnVlKTsKKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIEdFUCBoYXMgdGhlIGluYm91bmRzIGZsYWcuCisgIGJvb2wgaXNJbkJvdW5kcygpIGNvbnN0OworCisgIC8vLyBBY2N1bXVsYXRlIHRoZSBjb25zdGFudCBhZGRyZXNzIG9mZnNldCBvZiB0aGlzIEdFUCBpZiBwb3NzaWJsZS4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgYWNjZXB0cyBhbiBBUEludCBpbnRvIHdoaWNoIGl0IHdpbGwgYWNjdW11bGF0ZSB0aGUgY29uc3RhbnQKKyAgLy8vIG9mZnNldCBvZiB0aGlzIEdFUCBpZiB0aGUgR0VQIGlzIGluIGZhY3QgY29uc3RhbnQuIElmIHRoZSBHRVAgaXMgbm90CisgIC8vLyBhbGwtY29uc3RhbnQsIGl0IHJldHVybnMgZmFsc2UgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgb2Zmc2V0IEFQSW50IGlzCisgIC8vLyB1bmRlZmluZWQgKGl0IGlzICpub3QqIHByZXNlcnZlZCEpLiBUaGUgQVBJbnQgcGFzc2VkIGludG8gdGhpcyByb3V0aW5lCisgIC8vLyBtdXN0IGJlIGF0IGxlYXN0IGFzIHdpZGUgYXMgdGhlIEludFB0ciB0eXBlIGZvciB0aGUgYWRkcmVzcyBzcGFjZSBvZgorICAvLy8gdGhlIGJhc2UgR0VQIHBvaW50ZXIuCisgIGJvb2wgYWNjdW11bGF0ZUNvbnN0YW50T2Zmc2V0KGNvbnN0IERhdGFMYXlvdXQgJkRMLCBBUEludCAmT2Zmc2V0KSBjb25zdDsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIChJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cik7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8R2V0RWxlbWVudFB0ckluc3Q+IDoKKyAgcHVibGljIFZhcmlhZGljT3BlcmFuZFRyYWl0czxHZXRFbGVtZW50UHRySW5zdCwgMT4geworfTsKKworR2V0RWxlbWVudFB0ckluc3Q6OkdldEVsZW1lbnRQdHJJbnN0KFR5cGUgKlBvaW50ZWVUeXBlLCBWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IElkeExpc3QsIHVuc2lnbmVkIFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKQorICAgIDogSW5zdHJ1Y3Rpb24oZ2V0R0VQUmV0dXJuVHlwZShQb2ludGVlVHlwZSwgUHRyLCBJZHhMaXN0KSwgR2V0RWxlbWVudFB0ciwKKyAgICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8R2V0RWxlbWVudFB0ckluc3Q+OjpvcF9lbmQodGhpcykgLSBWYWx1ZXMsCisgICAgICAgICAgICAgICAgICBWYWx1ZXMsIEluc2VydEJlZm9yZSksCisgICAgICBTb3VyY2VFbGVtZW50VHlwZShQb2ludGVlVHlwZSksCisgICAgICBSZXN1bHRFbGVtZW50VHlwZShnZXRJbmRleGVkVHlwZShQb2ludGVlVHlwZSwgSWR4TGlzdCkpIHsKKyAgYXNzZXJ0KFJlc3VsdEVsZW1lbnRUeXBlID09CisgICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihnZXRUeXBlKCktPmdldFNjYWxhclR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpOworICBpbml0KFB0ciwgSWR4TGlzdCwgTmFtZVN0cik7Cit9CisKK0dldEVsZW1lbnRQdHJJbnN0OjpHZXRFbGVtZW50UHRySW5zdChUeXBlICpQb2ludGVlVHlwZSwgVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBJZHhMaXN0LCB1bnNpZ25lZCBWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpCisgICAgOiBJbnN0cnVjdGlvbihnZXRHRVBSZXR1cm5UeXBlKFBvaW50ZWVUeXBlLCBQdHIsIElkeExpc3QpLCBHZXRFbGVtZW50UHRyLAorICAgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxHZXRFbGVtZW50UHRySW5zdD46Om9wX2VuZCh0aGlzKSAtIFZhbHVlcywKKyAgICAgICAgICAgICAgICAgIFZhbHVlcywgSW5zZXJ0QXRFbmQpLAorICAgICAgU291cmNlRWxlbWVudFR5cGUoUG9pbnRlZVR5cGUpLAorICAgICAgUmVzdWx0RWxlbWVudFR5cGUoZ2V0SW5kZXhlZFR5cGUoUG9pbnRlZVR5cGUsIElkeExpc3QpKSB7CisgIGFzc2VydChSZXN1bHRFbGVtZW50VHlwZSA9PQorICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oZ2V0VHlwZSgpLT5nZXRTY2FsYXJUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgaW5pdChQdHIsIElkeExpc3QsIE5hbWVTdHIpOworfQorCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoR2V0RWxlbWVudFB0ckluc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBUaGlzIGluc3RydWN0aW9uIGNvbXBhcmVzIGl0cyBvcGVyYW5kcyBhY2NvcmRpbmcgdG8gdGhlIHByZWRpY2F0ZSBnaXZlbgorLy8vIHRvIHRoZSBjb25zdHJ1Y3Rvci4gSXQgb25seSBvcGVyYXRlcyBvbiBpbnRlZ2VycyBvciBwb2ludGVycy4gVGhlIG9wZXJhbmRzCisvLy8gbXVzdCBiZSBpZGVudGljYWwgdHlwZXMuCisvLy8gUmVwcmVzZW50IGFuIGludGVnZXIgY29tcGFyaXNvbiBvcGVyYXRvci4KK2NsYXNzIElDbXBJbnN0OiBwdWJsaWMgQ21wSW5zdCB7CisgIHZvaWQgQXNzZXJ0T0soKSB7CisgICAgYXNzZXJ0KGlzSW50UHJlZGljYXRlKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgSUNtcCBwcmVkaWNhdGUgdmFsdWUiKTsKKyAgICBhc3NlcnQoZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpID09IGdldE9wZXJhbmQoMSktPmdldFR5cGUoKSAmJgorICAgICAgICAgICJCb3RoIG9wZXJhbmRzIHRvIElDbXAgaW5zdHJ1Y3Rpb24gYXJlIG5vdCBvZiB0aGUgc2FtZSB0eXBlISIpOworICAgIC8vIENoZWNrIHRoYXQgdGhlIG9wZXJhbmRzIGFyZSB0aGUgcmlnaHQgdHlwZQorICAgIGFzc2VydCgoZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSB8fAorICAgICAgICAgICAgZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5pc1B0ck9yUHRyVmVjdG9yVHkoKSkgJiYKKyAgICAgICAgICAgIkludmFsaWQgb3BlcmFuZCB0eXBlcyBmb3IgSUNtcCBpbnN0cnVjdGlvbiIpOworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIC8vLyBDbG9uZSBhbiBpZGVudGljYWwgSUNtcEluc3QKKyAgSUNtcEluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1iZWZvcmUtaW5zdHJ1Y3Rpb24gc2VtYW50aWNzLgorICBJQ21wSW5zdCgKKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlLCAgLy8vPCBXaGVyZSB0byBpbnNlcnQKKyAgICBQcmVkaWNhdGUgcHJlZCwgIC8vLzwgVGhlIHByZWRpY2F0ZSB0byB1c2UgZm9yIHRoZSBjb21wYXJpc29uCisgICAgVmFsdWUgKkxIUywgICAgICAvLy88IFRoZSBsZWZ0LWhhbmQtc2lkZSBvZiB0aGUgZXhwcmVzc2lvbgorICAgIFZhbHVlICpSSFMsICAgICAgLy8vPCBUaGUgcmlnaHQtaGFuZC1zaWRlIG9mIHRoZSBleHByZXNzaW9uCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiAgLy8vPCBOYW1lIG9mIHRoZSBpbnN0cnVjdGlvbgorICApIDogQ21wSW5zdChtYWtlQ21wUmVzdWx0VHlwZShMSFMtPmdldFR5cGUoKSksCisgICAgICAgICAgICAgIEluc3RydWN0aW9uOjpJQ21wLCBwcmVkLCBMSFMsIFJIUywgTmFtZVN0ciwKKyAgICAgICAgICAgICAgSW5zZXJ0QmVmb3JlKSB7CisjaWZuZGVmIE5ERUJVRworICBBc3NlcnRPSygpOworI2VuZGlmCisgIH0KKworICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYXQtZW5kIHNlbWFudGljcy4KKyAgSUNtcEluc3QoCisgICAgQmFzaWNCbG9jayAmSW5zZXJ0QXRFbmQsIC8vLzwgQmxvY2sgdG8gaW5zZXJ0IGludG8uCisgICAgUHJlZGljYXRlIHByZWQsICAvLy88IFRoZSBwcmVkaWNhdGUgdG8gdXNlIGZvciB0aGUgY29tcGFyaXNvbgorICAgIFZhbHVlICpMSFMsICAgICAgLy8vPCBUaGUgbGVmdC1oYW5kLXNpZGUgb2YgdGhlIGV4cHJlc3Npb24KKyAgICBWYWx1ZSAqUkhTLCAgICAgIC8vLzwgVGhlIHJpZ2h0LWhhbmQtc2lkZSBvZiB0aGUgZXhwcmVzc2lvbgorICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIgIC8vLzwgTmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24KKyAgKSA6IENtcEluc3QobWFrZUNtcFJlc3VsdFR5cGUoTEhTLT5nZXRUeXBlKCkpLAorICAgICAgICAgICAgICBJbnN0cnVjdGlvbjo6SUNtcCwgcHJlZCwgTEhTLCBSSFMsIE5hbWVTdHIsCisgICAgICAgICAgICAgICZJbnNlcnRBdEVuZCkgeworI2lmbmRlZiBOREVCVUcKKyAgQXNzZXJ0T0soKTsKKyNlbmRpZgorICB9CisKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggbm8taW5zZXJ0aW9uIHNlbWFudGljcworICBJQ21wSW5zdCgKKyAgICBQcmVkaWNhdGUgcHJlZCwgLy8vPCBUaGUgcHJlZGljYXRlIHRvIHVzZSBmb3IgdGhlIGNvbXBhcmlzb24KKyAgICBWYWx1ZSAqTEhTLCAgICAgLy8vPCBUaGUgbGVmdC1oYW5kLXNpZGUgb2YgdGhlIGV4cHJlc3Npb24KKyAgICBWYWx1ZSAqUkhTLCAgICAgLy8vPCBUaGUgcmlnaHQtaGFuZC1zaWRlIG9mIHRoZSBleHByZXNzaW9uCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiAvLy88IE5hbWUgb2YgdGhlIGluc3RydWN0aW9uCisgICkgOiBDbXBJbnN0KG1ha2VDbXBSZXN1bHRUeXBlKExIUy0+Z2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb246OklDbXAsIHByZWQsIExIUywgUkhTLCBOYW1lU3RyKSB7CisjaWZuZGVmIE5ERUJVRworICBBc3NlcnRPSygpOworI2VuZGlmCisgIH0KKworICAvLy8gRm9yIGV4YW1wbGUsIEVRLT5FUSwgU0xFLT5TTEUsIFVHVC0+U0dULCBldGMuCisgIC8vLyBAcmV0dXJucyB0aGUgcHJlZGljYXRlIHRoYXQgd291bGQgYmUgdGhlIHJlc3VsdCBpZiB0aGUgb3BlcmFuZCB3ZXJlCisgIC8vLyByZWdhcmRlZCBhcyBzaWduZWQuCisgIC8vLyBSZXR1cm4gdGhlIHNpZ25lZCB2ZXJzaW9uIG9mIHRoZSBwcmVkaWNhdGUKKyAgUHJlZGljYXRlIGdldFNpZ25lZFByZWRpY2F0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U2lnbmVkUHJlZGljYXRlKGdldFByZWRpY2F0ZSgpKTsKKyAgfQorCisgIC8vLyBUaGlzIGlzIGEgc3RhdGljIHZlcnNpb24gdGhhdCB5b3UgY2FuIHVzZSB3aXRob3V0IGFuIGluc3RydWN0aW9uLgorICAvLy8gUmV0dXJuIHRoZSBzaWduZWQgdmVyc2lvbiBvZiB0aGUgcHJlZGljYXRlLgorICBzdGF0aWMgUHJlZGljYXRlIGdldFNpZ25lZFByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZCk7CisKKyAgLy8vIEZvciBleGFtcGxlLCBFUS0+RVEsIFNMRS0+VUxFLCBVR1QtPlVHVCwgZXRjLgorICAvLy8gQHJldHVybnMgdGhlIHByZWRpY2F0ZSB0aGF0IHdvdWxkIGJlIHRoZSByZXN1bHQgaWYgdGhlIG9wZXJhbmQgd2VyZQorICAvLy8gcmVnYXJkZWQgYXMgdW5zaWduZWQuCisgIC8vLyBSZXR1cm4gdGhlIHVuc2lnbmVkIHZlcnNpb24gb2YgdGhlIHByZWRpY2F0ZQorICBQcmVkaWNhdGUgZ2V0VW5zaWduZWRQcmVkaWNhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFVuc2lnbmVkUHJlZGljYXRlKGdldFByZWRpY2F0ZSgpKTsKKyAgfQorCisgIC8vLyBUaGlzIGlzIGEgc3RhdGljIHZlcnNpb24gdGhhdCB5b3UgY2FuIHVzZSB3aXRob3V0IGFuIGluc3RydWN0aW9uLgorICAvLy8gUmV0dXJuIHRoZSB1bnNpZ25lZCB2ZXJzaW9uIG9mIHRoZSBwcmVkaWNhdGUuCisgIHN0YXRpYyBQcmVkaWNhdGUgZ2V0VW5zaWduZWRQcmVkaWNhdGUoUHJlZGljYXRlIHByZWQpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHByZWRpY2F0ZSBpcyBlaXRoZXIgRVEgb3IgTkUuICBUaGlzIGFsc28KKyAgLy8vIHRlc3RzIGZvciBjb21tdXRhdGl2aXR5LgorICBzdGF0aWMgYm9vbCBpc0VxdWFsaXR5KFByZWRpY2F0ZSBQKSB7CisgICAgcmV0dXJuIFAgPT0gSUNNUF9FUSB8fCBQID09IElDTVBfTkU7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBwcmVkaWNhdGUgaXMgZWl0aGVyIEVRIG9yIE5FLiAgVGhpcyBhbHNvCisgIC8vLyB0ZXN0cyBmb3IgY29tbXV0YXRpdml0eS4KKyAgYm9vbCBpc0VxdWFsaXR5KCkgY29uc3QgeworICAgIHJldHVybiBpc0VxdWFsaXR5KGdldFByZWRpY2F0ZSgpKTsKKyAgfQorCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoZSBwcmVkaWNhdGUgb2YgdGhpcyBJQ21wSW5zdCBpcyBjb21tdXRhdGl2ZQorICAvLy8gRGV0ZXJtaW5lIGlmIHRoaXMgcmVsYXRpb24gaXMgY29tbXV0YXRpdmUuCisgIGJvb2wgaXNDb21tdXRhdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIGlzRXF1YWxpdHkoKTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgcHJlZGljYXRlIGlzIHJlbGF0aW9uYWwgKG5vdCBFUSBvciBORSkuCisgIC8vLworICBib29sIGlzUmVsYXRpb25hbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gIWlzRXF1YWxpdHkoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgcHJlZGljYXRlIGlzIHJlbGF0aW9uYWwgKG5vdCBFUSBvciBORSkuCisgIC8vLworICBzdGF0aWMgYm9vbCBpc1JlbGF0aW9uYWwoUHJlZGljYXRlIFApIHsKKyAgICByZXR1cm4gIWlzRXF1YWxpdHkoUCk7CisgIH0KKworICAvLy8gRXhjaGFuZ2UgdGhlIHR3byBvcGVyYW5kcyB0byB0aGlzIGluc3RydWN0aW9uIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBkb2VzCisgIC8vLyBub3QgbW9kaWZ5IHRoZSBzZW1hbnRpY3Mgb2YgdGhlIGluc3RydWN0aW9uLiBUaGUgcHJlZGljYXRlIHZhbHVlIG1heSBiZQorICAvLy8gY2hhbmdlZCB0byByZXRhaW4gdGhlIHNhbWUgcmVzdWx0IGlmIHRoZSBwcmVkaWNhdGUgaXMgb3JkZXIgZGVwZW5kZW50CisgIC8vLyAoZS5nLiB1bHQpLgorICAvLy8gU3dhcCBvcGVyYW5kcyBhbmQgYWRqdXN0IHByZWRpY2F0ZS4KKyAgdm9pZCBzd2FwT3BlcmFuZHMoKSB7CisgICAgc2V0UHJlZGljYXRlKGdldFN3YXBwZWRQcmVkaWNhdGUoKSk7CisgICAgT3A8MD4oKS5zd2FwKE9wPDE+KCkpOworICB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6SUNtcDsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQ21wSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgaW5zdHJ1Y3Rpb24gY29tcGFyZXMgaXRzIG9wZXJhbmRzIGFjY29yZGluZyB0byB0aGUgcHJlZGljYXRlIGdpdmVuCisvLy8gdG8gdGhlIGNvbnN0cnVjdG9yLiBJdCBvbmx5IG9wZXJhdGVzIG9uIGZsb2F0aW5nIHBvaW50IHZhbHVlcyBvciBwYWNrZWQKKy8vLyB2ZWN0b3JzIG9mIGZsb2F0aW5nIHBvaW50IHZhbHVlcy4gVGhlIG9wZXJhbmRzIG11c3QgYmUgaWRlbnRpY2FsIHR5cGVzLgorLy8vIFJlcHJlc2VudHMgYSBmbG9hdGluZyBwb2ludCBjb21wYXJpc29uIG9wZXJhdG9yLgorY2xhc3MgRkNtcEluc3Q6IHB1YmxpYyBDbXBJbnN0IHsKKyAgdm9pZCBBc3NlcnRPSygpIHsKKyAgICBhc3NlcnQoaXNGUFByZWRpY2F0ZSgpICYmICJJbnZhbGlkIEZDbXAgcHJlZGljYXRlIHZhbHVlIik7CisgICAgYXNzZXJ0KGdldE9wZXJhbmQoMCktPmdldFR5cGUoKSA9PSBnZXRPcGVyYW5kKDEpLT5nZXRUeXBlKCkgJiYKKyAgICAgICAgICAgIkJvdGggb3BlcmFuZHMgdG8gRkNtcCBpbnN0cnVjdGlvbiBhcmUgbm90IG9mIHRoZSBzYW1lIHR5cGUhIik7CisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgb3BlcmFuZHMgYXJlIHRoZSByaWdodCB0eXBlCisgICAgYXNzZXJ0KGdldE9wZXJhbmQoMCktPmdldFR5cGUoKS0+aXNGUE9yRlBWZWN0b3JUeSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIG9wZXJhbmQgdHlwZXMgZm9yIEZDbXAgaW5zdHJ1Y3Rpb24iKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICAvLy8gQ2xvbmUgYW4gaWRlbnRpY2FsIEZDbXBJbnN0CisgIEZDbXBJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYmVmb3JlLWluc3RydWN0aW9uIHNlbWFudGljcy4KKyAgRkNtcEluc3QoCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSwgLy8vPCBXaGVyZSB0byBpbnNlcnQKKyAgICBQcmVkaWNhdGUgcHJlZCwgIC8vLzwgVGhlIHByZWRpY2F0ZSB0byB1c2UgZm9yIHRoZSBjb21wYXJpc29uCisgICAgVmFsdWUgKkxIUywgICAgICAvLy88IFRoZSBsZWZ0LWhhbmQtc2lkZSBvZiB0aGUgZXhwcmVzc2lvbgorICAgIFZhbHVlICpSSFMsICAgICAgLy8vPCBUaGUgcmlnaHQtaGFuZC1zaWRlIG9mIHRoZSBleHByZXNzaW9uCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiAgLy8vPCBOYW1lIG9mIHRoZSBpbnN0cnVjdGlvbgorICApIDogQ21wSW5zdChtYWtlQ21wUmVzdWx0VHlwZShMSFMtPmdldFR5cGUoKSksCisgICAgICAgICAgICAgIEluc3RydWN0aW9uOjpGQ21wLCBwcmVkLCBMSFMsIFJIUywgTmFtZVN0ciwKKyAgICAgICAgICAgICAgSW5zZXJ0QmVmb3JlKSB7CisgICAgQXNzZXJ0T0soKTsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1hdC1lbmQgc2VtYW50aWNzLgorICBGQ21wSW5zdCgKKyAgICBCYXNpY0Jsb2NrICZJbnNlcnRBdEVuZCwgLy8vPCBCbG9jayB0byBpbnNlcnQgaW50by4KKyAgICBQcmVkaWNhdGUgcHJlZCwgIC8vLzwgVGhlIHByZWRpY2F0ZSB0byB1c2UgZm9yIHRoZSBjb21wYXJpc29uCisgICAgVmFsdWUgKkxIUywgICAgICAvLy88IFRoZSBsZWZ0LWhhbmQtc2lkZSBvZiB0aGUgZXhwcmVzc2lvbgorICAgIFZhbHVlICpSSFMsICAgICAgLy8vPCBUaGUgcmlnaHQtaGFuZC1zaWRlIG9mIHRoZSBleHByZXNzaW9uCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiAgLy8vPCBOYW1lIG9mIHRoZSBpbnN0cnVjdGlvbgorICApIDogQ21wSW5zdChtYWtlQ21wUmVzdWx0VHlwZShMSFMtPmdldFR5cGUoKSksCisgICAgICAgICAgICAgIEluc3RydWN0aW9uOjpGQ21wLCBwcmVkLCBMSFMsIFJIUywgTmFtZVN0ciwKKyAgICAgICAgICAgICAgJkluc2VydEF0RW5kKSB7CisgICAgQXNzZXJ0T0soKTsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIG5vLWluc2VydGlvbiBzZW1hbnRpY3MKKyAgRkNtcEluc3QoCisgICAgUHJlZGljYXRlIHByZWQsIC8vLzwgVGhlIHByZWRpY2F0ZSB0byB1c2UgZm9yIHRoZSBjb21wYXJpc29uCisgICAgVmFsdWUgKkxIUywgICAgIC8vLzwgVGhlIGxlZnQtaGFuZC1zaWRlIG9mIHRoZSBleHByZXNzaW9uCisgICAgVmFsdWUgKlJIUywgICAgIC8vLzwgVGhlIHJpZ2h0LWhhbmQtc2lkZSBvZiB0aGUgZXhwcmVzc2lvbgorICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIgLy8vPCBOYW1lIG9mIHRoZSBpbnN0cnVjdGlvbgorICApIDogQ21wSW5zdChtYWtlQ21wUmVzdWx0VHlwZShMSFMtPmdldFR5cGUoKSksCisgICAgICAgICAgICAgIEluc3RydWN0aW9uOjpGQ21wLCBwcmVkLCBMSFMsIFJIUywgTmFtZVN0cikgeworICAgIEFzc2VydE9LKCk7CisgIH0KKworICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJlZGljYXRlIG9mIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgRVEgb3IgTkUuCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhbiBlcXVhbGl0eSBwcmVkaWNhdGUuCisgIHN0YXRpYyBib29sIGlzRXF1YWxpdHkoUHJlZGljYXRlIFByZWQpIHsKKyAgICByZXR1cm4gUHJlZCA9PSBGQ01QX09FUSB8fCBQcmVkID09IEZDTVBfT05FIHx8IFByZWQgPT0gRkNNUF9VRVEgfHwKKyAgICAgICAgICAgUHJlZCA9PSBGQ01QX1VORTsKKyAgfQorCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoZSBwcmVkaWNhdGUgb2YgdGhpcyBpbnN0cnVjdGlvbiBpcyBFUSBvciBORS4KKyAgLy8vIERldGVybWluZSBpZiB0aGlzIGlzIGFuIGVxdWFsaXR5IHByZWRpY2F0ZS4KKyAgYm9vbCBpc0VxdWFsaXR5KCkgY29uc3QgeyByZXR1cm4gaXNFcXVhbGl0eShnZXRQcmVkaWNhdGUoKSk7IH0KKworICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJlZGljYXRlIG9mIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgY29tbXV0YXRpdmUuCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhIGNvbW11dGF0aXZlIHByZWRpY2F0ZS4KKyAgYm9vbCBpc0NvbW11dGF0aXZlKCkgY29uc3QgeworICAgIHJldHVybiBpc0VxdWFsaXR5KCkgfHwKKyAgICAgICAgICAgZ2V0UHJlZGljYXRlKCkgPT0gRkNNUF9GQUxTRSB8fAorICAgICAgICAgICBnZXRQcmVkaWNhdGUoKSA9PSBGQ01QX1RSVUUgfHwKKyAgICAgICAgICAgZ2V0UHJlZGljYXRlKCkgPT0gRkNNUF9PUkQgfHwKKyAgICAgICAgICAgZ2V0UHJlZGljYXRlKCkgPT0gRkNNUF9VTk87CisgIH0KKworICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJlZGljYXRlIGlzIHJlbGF0aW9uYWwgKG5vdCBFUSBvciBORSkuCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhpcyBhIHJlbGF0aW9uYWwgcHJlZGljYXRlLgorICBib29sIGlzUmVsYXRpb25hbCgpIGNvbnN0IHsgcmV0dXJuICFpc0VxdWFsaXR5KCk7IH0KKworICAvLy8gRXhjaGFuZ2UgdGhlIHR3byBvcGVyYW5kcyB0byB0aGlzIGluc3RydWN0aW9uIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBkb2VzCisgIC8vLyBub3QgbW9kaWZ5IHRoZSBzZW1hbnRpY3Mgb2YgdGhlIGluc3RydWN0aW9uLiBUaGUgcHJlZGljYXRlIHZhbHVlIG1heSBiZQorICAvLy8gY2hhbmdlZCB0byByZXRhaW4gdGhlIHNhbWUgcmVzdWx0IGlmIHRoZSBwcmVkaWNhdGUgaXMgb3JkZXIgZGVwZW5kZW50CisgIC8vLyAoZS5nLiB1bHQpLgorICAvLy8gU3dhcCBvcGVyYW5kcyBhbmQgYWRqdXN0IHByZWRpY2F0ZS4KKyAgdm9pZCBzd2FwT3BlcmFuZHMoKSB7CisgICAgc2V0UHJlZGljYXRlKGdldFN3YXBwZWRQcmVkaWNhdGUoKSk7CisgICAgT3A8MD4oKS5zd2FwKE9wPDE+KCkpOworICB9CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkZDbXA7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCitjbGFzcyBDYWxsSW5zdDsKK2NsYXNzIEludm9rZUluc3Q7CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgQ2FsbEJhc2VQYXJlbnQgeyB1c2luZyB0eXBlID0gSW5zdHJ1Y3Rpb247IH07CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBDYWxsQmFzZVBhcmVudDxJbnZva2VJbnN0PiB7IHVzaW5nIHR5cGUgPSBUZXJtaW5hdG9ySW5zdDsgfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBCYXNlIGNsYXNzIGZvciBhbGwgY2FsbGFibGUgaW5zdHJ1Y3Rpb25zIChJbnZva2VJbnN0IGFuZCBDYWxsSW5zdCkKKy8vLyBIb2xkcyBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gY2FsbGluZyBhIGZ1bmN0aW9uLCBhYnN0cmFjdGluZyBmcm9tIHRoZSBiYXNlCisvLy8gdHlwZSBAcCBCYXNlSW5zdFR5IGFuZCB0aGUgY29uY3JldGUgaW5zdHJ1Y3Rpb24gQHAgSW5zdFR5CisvLy8KK3RlbXBsYXRlIDxjbGFzcyBJbnN0VHk+CitjbGFzcyBDYWxsQmFzZSA6IHB1YmxpYyBDYWxsQmFzZVBhcmVudDxJbnN0VHk+Ojp0eXBlLAorICAgICAgICAgICAgICAgICBwdWJsaWMgT3BlcmFuZEJ1bmRsZVVzZXI8SW5zdFR5LCBVc2VyOjpvcF9pdGVyYXRvcj4geworcHJvdGVjdGVkOgorICBBdHRyaWJ1dGVMaXN0IEF0dHJzOyAvLy88IHBhcmFtZXRlciBhdHRyaWJ1dGVzIGZvciBjYWxsYWJsZQorICBGdW5jdGlvblR5cGUgKkZUeTsKKyAgdXNpbmcgQmFzZUluc3RUeSA9IHR5cGVuYW1lIENhbGxCYXNlUGFyZW50PEluc3RUeT46OnR5cGU7CisKKyAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3NUeT4KKyAgQ2FsbEJhc2UoQXR0cmlidXRlTGlzdCBjb25zdCAmQSwgRnVuY3Rpb25UeXBlICpGVCwgQXJnc1R5ICYmLi4uIEFyZ3MpCisgICAgICA6IEJhc2VJbnN0VHkoc3RkOjpmb3J3YXJkPEFyZ3NUeT4oQXJncykuLi4pLCBBdHRycyhBKSwgRlR5KEZUKSB7fQorICBib29sIGhhc0Rlc2NyaXB0b3IoKSBjb25zdCB7IHJldHVybiBWYWx1ZTo6SGFzRGVzY3JpcHRvcjsgfQorCisgIHVzaW5nIEJhc2VJbnN0VHk6OkJhc2VJbnN0VHk7CisKKyAgdXNpbmcgT3BlcmFuZEJ1bmRsZVVzZXI8SW5zdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyOjpvcF9pdGVyYXRvcj46OmlzRm5BdHRyRGlzYWxsb3dlZEJ5T3BCdW5kbGU7CisgIHVzaW5nIE9wZXJhbmRCdW5kbGVVc2VyPEluc3RUeSwgVXNlcjo6b3BfaXRlcmF0b3I+OjpnZXROdW1Ub3RhbEJ1bmRsZU9wZXJhbmRzOworICB1c2luZyBPcGVyYW5kQnVuZGxlVXNlcjxJbnN0VHksIFVzZXI6Om9wX2l0ZXJhdG9yPjo6YnVuZGxlT3BlcmFuZEhhc0F0dHI7CisgIHVzaW5nIEluc3RydWN0aW9uOjpnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb247CisgIHVzaW5nIEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YTsKKworcHVibGljOgorICB1c2luZyBJbnN0cnVjdGlvbjo6Z2V0Q29udGV4dDsKKyAgdXNpbmcgT3BlcmFuZEJ1bmRsZVVzZXI8SW5zdFR5LCBVc2VyOjpvcF9pdGVyYXRvcj46Omhhc09wZXJhbmRCdW5kbGVzOworICB1c2luZyBPcGVyYW5kQnVuZGxlVXNlcjxJbnN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXI6Om9wX2l0ZXJhdG9yPjo6Z2V0QnVuZGxlT3BlcmFuZHNTdGFydEluZGV4OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKAorICAgICAgICAiQ2FsbEJhc2UgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgY2xhc3NvZiBoaWVyYXJjaHkiKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBSZXR1cm4gdGhlIHBhcmFtZXRlciBhdHRyaWJ1dGVzIGZvciB0aGlzIGNhbGwuCisgIC8vLworICBBdHRyaWJ1dGVMaXN0IGdldEF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBBdHRyczsgfQorCisgIC8vLyBTZXQgdGhlIHBhcmFtZXRlciBhdHRyaWJ1dGVzIGZvciB0aGlzIGNhbGwuCisgIC8vLworICB2b2lkIHNldEF0dHJpYnV0ZXMoQXR0cmlidXRlTGlzdCBBKSB7IEF0dHJzID0gQTsgfQorCisgIEZ1bmN0aW9uVHlwZSAqZ2V0RnVuY3Rpb25UeXBlKCkgY29uc3QgeyByZXR1cm4gRlR5OyB9CisKKyAgdm9pZCBtdXRhdGVGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlICpGVHkpIHsKKyAgICBWYWx1ZTo6bXV0YXRlVHlwZShGVHktPmdldFJldHVyblR5cGUoKSk7CisgICAgdGhpcy0+RlR5ID0gRlR5OworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGNhbGwgYXJndW1lbnRzLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0TnVtQXJnT3BlcmFuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE51bU9wZXJhbmRzKCkgLSBnZXROdW1Ub3RhbEJ1bmRsZU9wZXJhbmRzKCkgLSBJbnN0VHk6OkFyZ09mZnNldDsKKyAgfQorCisgIC8vLyBnZXRBcmdPcGVyYW5kL3NldEFyZ09wZXJhbmQgLSBSZXR1cm4vc2V0IHRoZSBpLXRoIGNhbGwgYXJndW1lbnQuCisgIC8vLworICBWYWx1ZSAqZ2V0QXJnT3BlcmFuZCh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBnZXROdW1BcmdPcGVyYW5kcygpICYmICJPdXQgb2YgYm91bmRzISIpOworICAgIHJldHVybiBnZXRPcGVyYW5kKGkpOworICB9CisgIHZvaWQgc2V0QXJnT3BlcmFuZCh1bnNpZ25lZCBpLCBWYWx1ZSAqdikgeworICAgIGFzc2VydChpIDwgZ2V0TnVtQXJnT3BlcmFuZHMoKSAmJiAiT3V0IG9mIGJvdW5kcyEiKTsKKyAgICBzZXRPcGVyYW5kKGksIHYpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJndW1lbnQgbGlzdC4KKyAgVXNlcjo6b3BfaXRlcmF0b3IgYXJnX2JlZ2luKCkgeyByZXR1cm4gb3BfYmVnaW4oKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIGFyZ3VtZW50IGxpc3QuCisgIFVzZXI6Om9wX2l0ZXJhdG9yIGFyZ19lbmQoKSB7CisgICAgLy8gWyBjYWxsIGFyZ3MgXSwgWyBvcGVyYW5kIGJ1bmRsZXMgXSwgY2FsbGVlCisgICAgcmV0dXJuIG9wX2VuZCgpIC0gZ2V0TnVtVG90YWxCdW5kbGVPcGVyYW5kcygpIC0gSW5zdFR5OjpBcmdPZmZzZXQ7CisgIH0KKworICAvLy8gSXRlcmF0aW9uIGFkYXB0ZXIgZm9yIHJhbmdlLWZvciBsb29wcy4KKyAgaXRlcmF0b3JfcmFuZ2U8VXNlcjo6b3BfaXRlcmF0b3I+IGFyZ19vcGVyYW5kcygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShhcmdfYmVnaW4oKSwgYXJnX2VuZCgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFyZ3VtZW50IGxpc3QuCisgIFVzZXI6OmNvbnN0X29wX2l0ZXJhdG9yIGFyZ19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIG9wX2JlZ2luKCk7IH0KKworICAvLy8gUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSBhcmd1bWVudCBsaXN0LgorICBVc2VyOjpjb25zdF9vcF9pdGVyYXRvciBhcmdfZW5kKCkgY29uc3QgeworICAgIC8vIFsgY2FsbCBhcmdzIF0sIFsgb3BlcmFuZCBidW5kbGVzIF0sIGNhbGxlZQorICAgIHJldHVybiBvcF9lbmQoKSAtIGdldE51bVRvdGFsQnVuZGxlT3BlcmFuZHMoKSAtIEluc3RUeTo6QXJnT2Zmc2V0OworICB9CisKKyAgLy8vIEl0ZXJhdGlvbiBhZGFwdGVyIGZvciByYW5nZS1mb3IgbG9vcHMuCisgIGl0ZXJhdG9yX3JhbmdlPFVzZXI6OmNvbnN0X29wX2l0ZXJhdG9yPiBhcmdfb3BlcmFuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoYXJnX2JlZ2luKCksIGFyZ19lbmQoKSk7CisgIH0KKworICAvLy8gV3JhcHBlcnMgZm9yIGdldHRpbmcgdGhlIFxjIFVzZSBvZiBhIGNhbGwgYXJndW1lbnQuCisgIGNvbnN0IFVzZSAmZ2V0QXJnT3BlcmFuZFVzZSh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBnZXROdW1BcmdPcGVyYW5kcygpICYmICJPdXQgb2YgYm91bmRzISIpOworICAgIHJldHVybiBVc2VyOjpnZXRPcGVyYW5kVXNlKGkpOworICB9CisgIFVzZSAmZ2V0QXJnT3BlcmFuZFVzZSh1bnNpZ25lZCBpKSB7CisgICAgYXNzZXJ0KGkgPCBnZXROdW1BcmdPcGVyYW5kcygpICYmICJPdXQgb2YgYm91bmRzISIpOworICAgIHJldHVybiBVc2VyOjpnZXRPcGVyYW5kVXNlKGkpOworICB9CisKKyAgLy8vIElmIG9uZSBvZiB0aGUgYXJndW1lbnRzIGhhcyB0aGUgJ3JldHVybmVkJyBhdHRyaWJ1dGUsIHJldHVybiBpdHMKKyAgLy8vIG9wZXJhbmQgdmFsdWUuIE90aGVyd2lzZSwgcmV0dXJuIG51bGxwdHIuCisgIFZhbHVlICpnZXRSZXR1cm5lZEFyZ09wZXJhbmQoKSBjb25zdCB7CisgICAgdW5zaWduZWQgSW5kZXg7CisKKyAgICBpZiAoQXR0cnMuaGFzQXR0clNvbWV3aGVyZShBdHRyaWJ1dGU6OlJldHVybmVkLCAmSW5kZXgpICYmIEluZGV4KQorICAgICAgcmV0dXJuIGdldEFyZ09wZXJhbmQoSW5kZXggLSBBdHRyaWJ1dGVMaXN0OjpGaXJzdEFyZ0luZGV4KTsKKyAgICBpZiAoY29uc3QgRnVuY3Rpb24gKkYgPSBnZXRDYWxsZWRGdW5jdGlvbigpKQorICAgICAgaWYgKEYtPmdldEF0dHJpYnV0ZXMoKS5oYXNBdHRyU29tZXdoZXJlKEF0dHJpYnV0ZTo6UmV0dXJuZWQsICZJbmRleCkgJiYKKyAgICAgICAgICBJbmRleCkKKyAgICAgICAgcmV0dXJuIGdldEFyZ09wZXJhbmQoSW5kZXggLSBBdHRyaWJ1dGVMaXN0OjpGaXJzdEFyZ0luZGV4KTsKKworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgVXNlcjo6b3BfaXRlcmF0b3Igb3BfYmVnaW4oKSB7CisgICAgcmV0dXJuIE9wZXJhbmRUcmFpdHM8Q2FsbEJhc2U+OjpvcF9iZWdpbih0aGlzKTsKKyAgfQorCisgIFVzZXI6OmNvbnN0X29wX2l0ZXJhdG9yIG9wX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBPcGVyYW5kVHJhaXRzPENhbGxCYXNlPjo6b3BfYmVnaW4oY29uc3RfY2FzdDxDYWxsQmFzZSAqPih0aGlzKSk7CisgIH0KKworICBVc2VyOjpvcF9pdGVyYXRvciBvcF9lbmQoKSB7IHJldHVybiBPcGVyYW5kVHJhaXRzPENhbGxCYXNlPjo6b3BfZW5kKHRoaXMpOyB9CisKKyAgVXNlcjo6Y29uc3Rfb3BfaXRlcmF0b3Igb3BfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBPcGVyYW5kVHJhaXRzPENhbGxCYXNlPjo6b3BfZW5kKGNvbnN0X2Nhc3Q8Q2FsbEJhc2UgKj4odGhpcykpOworICB9CisKKyAgVmFsdWUgKmdldE9wZXJhbmQodW5zaWduZWQgaV9ub2NhcHR1cmUpIGNvbnN0IHsKKyAgICBhc3NlcnQoaV9ub2NhcHR1cmUgPCBPcGVyYW5kVHJhaXRzPENhbGxCYXNlPjo6b3BlcmFuZHModGhpcykgJiYKKyAgICAgICAgICAgImdldE9wZXJhbmQoKSBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxWYWx1ZT4oT3BlcmFuZFRyYWl0czxDYWxsQmFzZT46Om9wX2JlZ2luKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PENhbGxCYXNlICo+KHRoaXMpKVtpX25vY2FwdHVyZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldCgpKTsKKyAgfQorCisgIHZvaWQgc2V0T3BlcmFuZCh1bnNpZ25lZCBpX25vY2FwdHVyZSwgVmFsdWUgKlZhbF9ub2NhcHR1cmUpIHsKKyAgICBhc3NlcnQoaV9ub2NhcHR1cmUgPCBPcGVyYW5kVHJhaXRzPENhbGxCYXNlPjo6b3BlcmFuZHModGhpcykgJiYKKyAgICAgICAgICAgInNldE9wZXJhbmQoKSBvdXQgb2YgcmFuZ2UhIik7CisgICAgT3BlcmFuZFRyYWl0czxDYWxsQmFzZT46Om9wX2JlZ2luKHRoaXMpW2lfbm9jYXB0dXJlXSA9IFZhbF9ub2NhcHR1cmU7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gT3BlcmFuZFRyYWl0czxDYWxsQmFzZT46Om9wZXJhbmRzKHRoaXMpOworICB9CisgIHRlbXBsYXRlIDxpbnQgSWR4X25vY2FwdHVyZT4gVXNlICZPcCgpIHsKKyAgICByZXR1cm4gVXNlcjo6T3BGcm9tPElkeF9ub2NhcHR1cmU+KHRoaXMpOworICB9CisgIHRlbXBsYXRlIDxpbnQgSWR4X25vY2FwdHVyZT4gY29uc3QgVXNlICZPcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVXNlcjo6T3BGcm9tPElkeF9ub2NhcHR1cmU+KHRoaXMpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgZnVuY3Rpb24gY2FsbGVkLCBvciBudWxsIGlmIHRoaXMgaXMgYW4KKyAgLy8vIGluZGlyZWN0IGZ1bmN0aW9uIGludm9jYXRpb24uCisgIC8vLworICBGdW5jdGlvbiAqZ2V0Q2FsbGVkRnVuY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGR5bl9jYXN0PEZ1bmN0aW9uPihPcDwtSW5zdFR5OjpBcmdPZmZzZXQ+KCkpOworICB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2FsbCBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4KKyAgYm9vbCBoYXNGbkF0dHIoQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgYXNzZXJ0KEtpbmQgIT0gQXR0cmlidXRlOjpOb0J1aWx0aW4gJiYKKyAgICAgICAgICAgIlVzZSBDYWxsQmFzZTo6aXNOb0J1aWx0aW4oKSB0byBjaGVjayBmb3IgQXR0cmlidXRlOjpOb0J1aWx0aW4iKTsKKyAgICByZXR1cm4gaGFzRm5BdHRySW1wbChLaW5kKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNhbGwgaGFzIHRoZSBnaXZlbiBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzRm5BdHRyKFN0cmluZ1JlZiBLaW5kKSBjb25zdCB7IHJldHVybiBoYXNGbkF0dHJJbXBsKEtpbmQpOyB9CisKKyAgLy8vIGdldENhbGxpbmdDb252L3NldENhbGxpbmdDb252IC0gR2V0IG9yIHNldCB0aGUgY2FsbGluZyBjb252ZW50aW9uIG9mIHRoaXMKKyAgLy8vIGZ1bmN0aW9uIGNhbGwuCisgIENhbGxpbmdDb252OjpJRCBnZXRDYWxsaW5nQ29udigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2FsbGluZ0NvbnY6OklEPihnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSA+PiAyKTsKKyAgfQorICB2b2lkIHNldENhbGxpbmdDb252KENhbGxpbmdDb252OjpJRCBDQykgeworICAgIGF1dG8gSUQgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oQ0MpOworICAgIGFzc2VydCghKElEICYgfkNhbGxpbmdDb252OjpNYXhJRCkgJiYgIlVuc3VwcG9ydGVkIGNhbGxpbmcgY29udmVudGlvbiIpOworICAgIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIDMpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSUQgPDwgMikpOworICB9CisKKworICAvLy8gYWRkcyB0aGUgYXR0cmlidXRlIHRvIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMuCisgIHZvaWQgYWRkQXR0cmlidXRlKHVuc2lnbmVkIGksIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgeworICAgIEF0dHJpYnV0ZUxpc3QgUEFMID0gZ2V0QXR0cmlidXRlcygpOworICAgIFBBTCA9IFBBTC5hZGRBdHRyaWJ1dGUoZ2V0Q29udGV4dCgpLCBpLCBLaW5kKTsKKyAgICBzZXRBdHRyaWJ1dGVzKFBBTCk7CisgIH0KKworICAvLy8gYWRkcyB0aGUgYXR0cmlidXRlIHRvIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMuCisgIHZvaWQgYWRkQXR0cmlidXRlKHVuc2lnbmVkIGksIEF0dHJpYnV0ZSBBdHRyKSB7CisgICAgQXR0cmlidXRlTGlzdCBQQUwgPSBnZXRBdHRyaWJ1dGVzKCk7CisgICAgUEFMID0gUEFMLmFkZEF0dHJpYnV0ZShnZXRDb250ZXh0KCksIGksIEF0dHIpOworICAgIHNldEF0dHJpYnV0ZXMoUEFMKTsKKyAgfQorCisgIC8vLyBBZGRzIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIGluZGljYXRlZCBhcmd1bWVudAorICB2b2lkIGFkZFBhcmFtQXR0cih1bnNpZ25lZCBBcmdObywgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSB7CisgICAgYXNzZXJ0KEFyZ05vIDwgZ2V0TnVtQXJnT3BlcmFuZHMoKSAmJiAiT3V0IG9mIGJvdW5kcyIpOworICAgIEF0dHJpYnV0ZUxpc3QgUEFMID0gZ2V0QXR0cmlidXRlcygpOworICAgIFBBTCA9IFBBTC5hZGRQYXJhbUF0dHJpYnV0ZShnZXRDb250ZXh0KCksIEFyZ05vLCBLaW5kKTsKKyAgICBzZXRBdHRyaWJ1dGVzKFBBTCk7CisgIH0KKworICAvLy8gQWRkcyB0aGUgYXR0cmlidXRlIHRvIHRoZSBpbmRpY2F0ZWQgYXJndW1lbnQKKyAgdm9pZCBhZGRQYXJhbUF0dHIodW5zaWduZWQgQXJnTm8sIEF0dHJpYnV0ZSBBdHRyKSB7CisgICAgYXNzZXJ0KEFyZ05vIDwgZ2V0TnVtQXJnT3BlcmFuZHMoKSAmJiAiT3V0IG9mIGJvdW5kcyIpOworICAgIEF0dHJpYnV0ZUxpc3QgUEFMID0gZ2V0QXR0cmlidXRlcygpOworICAgIFBBTCA9IFBBTC5hZGRQYXJhbUF0dHJpYnV0ZShnZXRDb250ZXh0KCksIEFyZ05vLCBBdHRyKTsKKyAgICBzZXRBdHRyaWJ1dGVzKFBBTCk7CisgIH0KKworICAvLy8gcmVtb3ZlcyB0aGUgYXR0cmlidXRlIGZyb20gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcy4KKyAgdm9pZCByZW1vdmVBdHRyaWJ1dGUodW5zaWduZWQgaSwgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSB7CisgICAgQXR0cmlidXRlTGlzdCBQQUwgPSBnZXRBdHRyaWJ1dGVzKCk7CisgICAgUEFMID0gUEFMLnJlbW92ZUF0dHJpYnV0ZShnZXRDb250ZXh0KCksIGksIEtpbmQpOworICAgIHNldEF0dHJpYnV0ZXMoUEFMKTsKKyAgfQorCisgIC8vLyByZW1vdmVzIHRoZSBhdHRyaWJ1dGUgZnJvbSB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzLgorICB2b2lkIHJlbW92ZUF0dHJpYnV0ZSh1bnNpZ25lZCBpLCBTdHJpbmdSZWYgS2luZCkgeworICAgIEF0dHJpYnV0ZUxpc3QgUEFMID0gZ2V0QXR0cmlidXRlcygpOworICAgIFBBTCA9IFBBTC5yZW1vdmVBdHRyaWJ1dGUoZ2V0Q29udGV4dCgpLCBpLCBLaW5kKTsKKyAgICBzZXRBdHRyaWJ1dGVzKFBBTCk7CisgIH0KKworICAvLy8gUmVtb3ZlcyB0aGUgYXR0cmlidXRlIGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50CisgIHZvaWQgcmVtb3ZlUGFyYW1BdHRyKHVuc2lnbmVkIEFyZ05vLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIHsKKyAgICBhc3NlcnQoQXJnTm8gPCBnZXROdW1BcmdPcGVyYW5kcygpICYmICJPdXQgb2YgYm91bmRzIik7CisgICAgQXR0cmlidXRlTGlzdCBQQUwgPSBnZXRBdHRyaWJ1dGVzKCk7CisgICAgUEFMID0gUEFMLnJlbW92ZVBhcmFtQXR0cmlidXRlKGdldENvbnRleHQoKSwgQXJnTm8sIEtpbmQpOworICAgIHNldEF0dHJpYnV0ZXMoUEFMKTsKKyAgfQorCisgIC8vLyBSZW1vdmVzIHRoZSBhdHRyaWJ1dGUgZnJvbSB0aGUgZ2l2ZW4gYXJndW1lbnQKKyAgdm9pZCByZW1vdmVQYXJhbUF0dHIodW5zaWduZWQgQXJnTm8sIFN0cmluZ1JlZiBLaW5kKSB7CisgICAgYXNzZXJ0KEFyZ05vIDwgZ2V0TnVtQXJnT3BlcmFuZHMoKSAmJiAiT3V0IG9mIGJvdW5kcyIpOworICAgIEF0dHJpYnV0ZUxpc3QgUEFMID0gZ2V0QXR0cmlidXRlcygpOworICAgIFBBTCA9IFBBTC5yZW1vdmVQYXJhbUF0dHJpYnV0ZShnZXRDb250ZXh0KCksIEFyZ05vLCBLaW5kKTsKKyAgICBzZXRBdHRyaWJ1dGVzKFBBTCk7CisgIH0KKworICAvLy8gYWRkcyB0aGUgZGVyZWZlcmVuY2VhYmxlIGF0dHJpYnV0ZSB0byB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzLgorICB2b2lkIGFkZERlcmVmZXJlbmNlYWJsZUF0dHIodW5zaWduZWQgaSwgdWludDY0X3QgQnl0ZXMpIHsKKyAgICBBdHRyaWJ1dGVMaXN0IFBBTCA9IGdldEF0dHJpYnV0ZXMoKTsKKyAgICBQQUwgPSBQQUwuYWRkRGVyZWZlcmVuY2VhYmxlQXR0cihnZXRDb250ZXh0KCksIGksIEJ5dGVzKTsKKyAgICBzZXRBdHRyaWJ1dGVzKFBBTCk7CisgIH0KKworICAvLy8gYWRkcyB0aGUgZGVyZWZlcmVuY2VhYmxlX29yX251bGwgYXR0cmlidXRlIHRvIHRoZSBsaXN0IG9mCisgIC8vLyBhdHRyaWJ1dGVzLgorICB2b2lkIGFkZERlcmVmZXJlbmNlYWJsZU9yTnVsbEF0dHIodW5zaWduZWQgaSwgdWludDY0X3QgQnl0ZXMpIHsKKyAgICBBdHRyaWJ1dGVMaXN0IFBBTCA9IGdldEF0dHJpYnV0ZXMoKTsKKyAgICBQQUwgPSBQQUwuYWRkRGVyZWZlcmVuY2VhYmxlT3JOdWxsQXR0cihnZXRDb250ZXh0KCksIGksIEJ5dGVzKTsKKyAgICBzZXRBdHRyaWJ1dGVzKFBBTCk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJldHVybiB2YWx1ZSBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4KKyAgYm9vbCBoYXNSZXRBdHRyKEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3QgeworICAgIGlmIChBdHRycy5oYXNBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6UmV0dXJuSW5kZXgsIEtpbmQpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBMb29rIGF0IHRoZSBjYWxsZWUsIGlmIGF2YWlsYWJsZS4KKyAgICBpZiAoY29uc3QgRnVuY3Rpb24gKkYgPSBnZXRDYWxsZWRGdW5jdGlvbigpKQorICAgICAgcmV0dXJuIEYtPmdldEF0dHJpYnV0ZXMoKS5oYXNBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6UmV0dXJuSW5kZXgsIEtpbmQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgYXJndW1lbnQgb3IgcGFyYW1ldGVyIGhhcyB0aGUgZ2l2ZW4gYXR0cmlidXRlLgorICBib29sIHBhcmFtSGFzQXR0cih1bnNpZ25lZCBBcmdObywgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgYXNzZXJ0KEFyZ05vIDwgZ2V0TnVtQXJnT3BlcmFuZHMoKSAmJiAiUGFyYW0gaW5kZXggb3V0IG9mIGJvdW5kcyEiKTsKKworICAgIGlmIChBdHRycy5oYXNQYXJhbUF0dHJpYnV0ZShBcmdObywgS2luZCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoY29uc3QgRnVuY3Rpb24gKkYgPSBnZXRDYWxsZWRGdW5jdGlvbigpKQorICAgICAgcmV0dXJuIEYtPmdldEF0dHJpYnV0ZXMoKS5oYXNQYXJhbUF0dHJpYnV0ZShBcmdObywgS2luZCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIEdldCB0aGUgYXR0cmlidXRlIG9mIGEgZ2l2ZW4ga2luZCBhdCBhIHBvc2l0aW9uLgorICBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKHVuc2lnbmVkIGksIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3QgeworICAgIHJldHVybiBnZXRBdHRyaWJ1dGVzKCkuZ2V0QXR0cmlidXRlKGksIEtpbmQpOworICB9CisKKyAgLy8vIEdldCB0aGUgYXR0cmlidXRlIG9mIGEgZ2l2ZW4ga2luZCBhdCBhIHBvc2l0aW9uLgorICBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKHVuc2lnbmVkIGksIFN0cmluZ1JlZiBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEF0dHJpYnV0ZXMoKS5nZXRBdHRyaWJ1dGUoaSwgS2luZCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBhdHRyaWJ1dGUgb2YgYSBnaXZlbiBraW5kIGZyb20gYSBnaXZlbiBhcmcKKyAgQXR0cmlidXRlIGdldFBhcmFtQXR0cih1bnNpZ25lZCBBcmdObywgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgYXNzZXJ0KEFyZ05vIDwgZ2V0TnVtQXJnT3BlcmFuZHMoKSAmJiAiT3V0IG9mIGJvdW5kcyIpOworICAgIHJldHVybiBnZXRBdHRyaWJ1dGVzKCkuZ2V0UGFyYW1BdHRyKEFyZ05vLCBLaW5kKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGF0dHJpYnV0ZSBvZiBhIGdpdmVuIGtpbmQgZnJvbSBhIGdpdmVuIGFyZworICBBdHRyaWJ1dGUgZ2V0UGFyYW1BdHRyKHVuc2lnbmVkIEFyZ05vLCBTdHJpbmdSZWYgS2luZCkgY29uc3QgeworICAgIGFzc2VydChBcmdObyA8IGdldE51bUFyZ09wZXJhbmRzKCkgJiYgIk91dCBvZiBib3VuZHMiKTsKKyAgICByZXR1cm4gZ2V0QXR0cmlidXRlcygpLmdldFBhcmFtQXR0cihBcmdObywgS2luZCk7CisgIH0KKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBkYXRhIG9wZXJhbmQgYXQgaW5kZXggXHAgaSBoYXMgdGhlIGF0dHJpYnV0ZSBccAorICAvLy8gQS4KKyAgLy8vCisgIC8vLyBEYXRhIG9wZXJhbmRzIGluY2x1ZGUgY2FsbCBhcmd1bWVudHMgYW5kIHZhbHVlcyB1c2VkIGluIG9wZXJhbmQgYnVuZGxlcywKKyAgLy8vIGJ1dCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBjYWxsZWUgb3BlcmFuZC4gIFRoaXMgcm91dGluZSBkaXNwYXRjaGVzIHRvIHRoZQorICAvLy8gdW5kZXJseWluZyBBdHRyaWJ1dGVMaXN0IG9yIHRoZSBPcGVyYW5kQnVuZGxlVXNlciBhcyBhcHByb3ByaWF0ZS4KKyAgLy8vCisgIC8vLyBUaGUgaW5kZXggXHAgaSBpcyBpbnRlcnByZXRlZCBhcworICAvLy8KKyAgLy8vICBccCBpID09IEF0dHJpYnV0ZTo6UmV0dXJuSW5kZXggIC0+IHRoZSByZXR1cm4gdmFsdWUKKyAgLy8vICBccCBpIGluIFsxLCBhcmdfc2l6ZSArIDEpICAtPiBhcmd1bWVudCBudW1iZXIgKFxwIGkgLSAxKQorICAvLy8gIFxwIGkgaW4gW2FyZ19zaXplICsgMSwgZGF0YV9vcGVyYW5kX3NpemUgKyAxKSAtPiBidW5kbGUgb3BlcmFuZCBhdCBpbmRleAorICAvLy8gICAgIChccCBpIC0gMSkgaW4gdGhlIG9wZXJhbmQgbGlzdC4KKyAgYm9vbCBkYXRhT3BlcmFuZEhhc0ltcGxpZWRBdHRyKHVuc2lnbmVkIGksIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3QgeworICAgIC8vIFRoZXJlIGFyZSBnZXROdW1PcGVyYW5kcygpIC0gKEluc3RUeTo6QXJnT2Zmc2V0IC0gMSkgZGF0YSBvcGVyYW5kcy4KKyAgICAvLyBUaGUgbGFzdCBvcGVyYW5kIGlzIHRoZSBjYWxsZWUuCisgICAgYXNzZXJ0KGkgPCAoZ2V0TnVtT3BlcmFuZHMoKSAtIEluc3RUeTo6QXJnT2Zmc2V0ICsgMSkgJiYKKyAgICAgICAgICAgIkRhdGEgb3BlcmFuZCBpbmRleCBvdXQgb2YgYm91bmRzISIpOworCisgICAgLy8gVGhlIGF0dHJpYnV0ZSBBIGNhbiBlaXRoZXIgYmUgZGlyZWN0bHkgc3BlY2lmaWVkLCBpZiB0aGUgb3BlcmFuZCBpbgorICAgIC8vIHF1ZXN0aW9uIGlzIGEgY2FsbCBhcmd1bWVudDsgb3IgYmUgaW5kaXJlY3RseSBpbXBsaWVkIGJ5IHRoZSBraW5kIG9mIGl0cworICAgIC8vIGNvbnRhaW5pbmcgb3BlcmFuZCBidW5kbGUsIGlmIHRoZSBvcGVyYW5kIGlzIGEgYnVuZGxlIG9wZXJhbmQuCisKKyAgICBpZiAoaSA9PSBBdHRyaWJ1dGVMaXN0OjpSZXR1cm5JbmRleCkKKyAgICAgIHJldHVybiBoYXNSZXRBdHRyKEtpbmQpOworCisgICAgLy8gRklYTUU6IEF2b2lkIHRoZXNlIGkgLSAxIGNhbGN1bGF0aW9ucyBhbmQgdXBkYXRlIHRoZSBBUEkgdG8gdXNlCisgICAgLy8gemVyby1iYXNlZCBpbmRpY2VzLgorICAgIGlmIChpIDwgKGdldE51bUFyZ09wZXJhbmRzKCkgKyAxKSkKKyAgICAgIHJldHVybiBwYXJhbUhhc0F0dHIoaSAtIDEsIEtpbmQpOworCisgICAgYXNzZXJ0KGhhc09wZXJhbmRCdW5kbGVzKCkgJiYgaSA+PSAoZ2V0QnVuZGxlT3BlcmFuZHNTdGFydEluZGV4KCkgKyAxKSAmJgorICAgICAgICAgICAiTXVzdCBiZSBlaXRoZXIgYSBjYWxsIGFyZ3VtZW50IG9yIGFuIG9wZXJhbmQgYnVuZGxlISIpOworICAgIHJldHVybiBidW5kbGVPcGVyYW5kSGFzQXR0cihpIC0gMSwgS2luZCk7CisgIH0KKworICAvLy8gRXh0cmFjdCB0aGUgYWxpZ25tZW50IG9mIHRoZSByZXR1cm4gdmFsdWUuCisgIHVuc2lnbmVkIGdldFJldEFsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIEF0dHJzLmdldFJldEFsaWdubWVudCgpOyB9CisKKyAgLy8vIEV4dHJhY3QgdGhlIGFsaWdubWVudCBmb3IgYSBjYWxsIG9yIHBhcmFtZXRlciAoMD11bmtub3duKS4KKyAgdW5zaWduZWQgZ2V0UGFyYW1BbGlnbm1lbnQodW5zaWduZWQgQXJnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0cnMuZ2V0UGFyYW1BbGlnbm1lbnQoQXJnTm8pOworICB9CisKKyAgLy8vIEV4dHJhY3QgdGhlIG51bWJlciBvZiBkZXJlZmVyZW5jZWFibGUgYnl0ZXMgZm9yIGEgY2FsbCBvcgorICAvLy8gcGFyYW1ldGVyICgwPXVua25vd24pLgorICB1aW50NjRfdCBnZXREZXJlZmVyZW5jZWFibGVCeXRlcyh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJzLmdldERlcmVmZXJlbmNlYWJsZUJ5dGVzKGkpOworICB9CisKKyAgLy8vIEV4dHJhY3QgdGhlIG51bWJlciBvZiBkZXJlZmVyZW5jZWFibGVfb3JfbnVsbCBieXRlcyBmb3IgYSBjYWxsIG9yCisgIC8vLyBwYXJhbWV0ZXIgKDA9dW5rbm93bikuCisgIHVpbnQ2NF90IGdldERlcmVmZXJlbmNlYWJsZU9yTnVsbEJ5dGVzKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0cnMuZ2V0RGVyZWZlcmVuY2VhYmxlT3JOdWxsQnl0ZXMoaSk7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG1hcmtlZCB3aXRoIE5vQWxpYXMgYXR0cmlidXRlLgorICBib29sIHJldHVybkRvZXNOb3RBbGlhcygpIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0cnMuaGFzQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OlJldHVybkluZGV4LCBBdHRyaWJ1dGU6Ok5vQWxpYXMpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBjYWxsIHNob3VsZCBub3QgYmUgdHJlYXRlZCBhcyBhIGNhbGwgdG8gYQorICAvLy8gYnVpbHRpbi4KKyAgYm9vbCBpc05vQnVpbHRpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzRm5BdHRySW1wbChBdHRyaWJ1dGU6Ok5vQnVpbHRpbikgJiYKKyAgICAgICFoYXNGbkF0dHJJbXBsKEF0dHJpYnV0ZTo6QnVpbHRpbik7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIHJlcXVpcmVzIHN0cmljdCBmbG9hdGluZyBwb2ludCBzZW1hbnRpY3MuCisgIGJvb2wgaXNTdHJpY3RGUCgpIGNvbnN0IHsgcmV0dXJuIGhhc0ZuQXR0cihBdHRyaWJ1dGU6OlN0cmljdEZQKTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY2FsbCBzaG91bGQgbm90IGJlIGlubGluZWQuCisgIGJvb2wgaXNOb0lubGluZSgpIGNvbnN0IHsgcmV0dXJuIGhhc0ZuQXR0cihBdHRyaWJ1dGU6Ok5vSW5saW5lKTsgfQorICB2b2lkIHNldElzTm9JbmxpbmUoKSB7CisgICAgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHJpYnV0ZTo6Tm9JbmxpbmUpOworICB9CisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGNhbGwgZG9lcyBub3QgYWNjZXNzIG1lbW9yeS4KKyAgYm9vbCBkb2VzTm90QWNjZXNzTWVtb3J5KCkgY29uc3QgeworICAgIHJldHVybiBoYXNGbkF0dHIoQXR0cmlidXRlOjpSZWFkTm9uZSk7CisgIH0KKyAgdm9pZCBzZXREb2VzTm90QWNjZXNzTWVtb3J5KCkgeworICAgIGFkZEF0dHJpYnV0ZShBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRyaWJ1dGU6OlJlYWROb25lKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGNhbGwgZG9lcyBub3QgYWNjZXNzIG9yIG9ubHkgcmVhZHMgbWVtb3J5LgorICBib29sIG9ubHlSZWFkc01lbW9yeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9lc05vdEFjY2Vzc01lbW9yeSgpIHx8IGhhc0ZuQXR0cihBdHRyaWJ1dGU6OlJlYWRPbmx5KTsKKyAgfQorICB2b2lkIHNldE9ubHlSZWFkc01lbW9yeSgpIHsKKyAgICBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cmlidXRlOjpSZWFkT25seSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIGRvZXMgbm90IGFjY2VzcyBvciBvbmx5IHdyaXRlcyBtZW1vcnkuCisgIGJvb2wgZG9lc05vdFJlYWRNZW1vcnkoKSBjb25zdCB7CisgICAgcmV0dXJuIGRvZXNOb3RBY2Nlc3NNZW1vcnkoKSB8fCBoYXNGbkF0dHIoQXR0cmlidXRlOjpXcml0ZU9ubHkpOworICB9CisgIHZvaWQgc2V0RG9lc05vdFJlYWRNZW1vcnkoKSB7CisgICAgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHJpYnV0ZTo6V3JpdGVPbmx5KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIGNhbiBhY2Nlc3MgbWVtbW9yeSBvbmx5IHVzaW5nIHBvaW50ZXJzIGJhc2VkCisgIC8vLyBvbiBpdHMgYXJndW1lbnRzLgorICBib29sIG9ubHlBY2Nlc3Nlc0FyZ01lbW9yeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzRm5BdHRyKEF0dHJpYnV0ZTo6QXJnTWVtT25seSk7CisgIH0KKyAgdm9pZCBzZXRPbmx5QWNjZXNzZXNBcmdNZW1vcnkoKSB7CisgICAgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHJpYnV0ZTo6QXJnTWVtT25seSk7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgZnVuY3Rpb24gbWF5IG9ubHkgYWNjZXNzIG1lbW9yeSB0aGF0IGlzCisgIC8vLyBpbmFjY2Vzc2libGUgZnJvbSB0aGUgSVIuCisgIGJvb2wgb25seUFjY2Vzc2VzSW5hY2Nlc3NpYmxlTWVtb3J5KCkgY29uc3QgeworICAgIHJldHVybiBoYXNGbkF0dHIoQXR0cmlidXRlOjpJbmFjY2Vzc2libGVNZW1Pbmx5KTsKKyAgfQorICB2b2lkIHNldE9ubHlBY2Nlc3Nlc0luYWNjZXNzaWJsZU1lbW9yeSgpIHsKKyAgICBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cmlidXRlOjpJbmFjY2Vzc2libGVNZW1Pbmx5KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBmdW5jdGlvbiBtYXkgb25seSBhY2Nlc3MgbWVtb3J5IHRoYXQgaXMKKyAgLy8vIGVpdGhlciBpbmFjY2Vzc2libGUgZnJvbSB0aGUgSVIgb3IgcG9pbnRlZCB0byBieSBpdHMgYXJndW1lbnRzLgorICBib29sIG9ubHlBY2Nlc3Nlc0luYWNjZXNzaWJsZU1lbU9yQXJnTWVtKCkgY29uc3QgeworICAgIHJldHVybiBoYXNGbkF0dHIoQXR0cmlidXRlOjpJbmFjY2Vzc2libGVNZW1PckFyZ01lbU9ubHkpOworICB9CisgIHZvaWQgc2V0T25seUFjY2Vzc2VzSW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW0oKSB7CisgICAgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHJpYnV0ZTo6SW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW1Pbmx5KTsKKyAgfQorICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIGNhbm5vdCByZXR1cm4uCisgIGJvb2wgZG9lc05vdFJldHVybigpIGNvbnN0IHsgcmV0dXJuIGhhc0ZuQXR0cihBdHRyaWJ1dGU6Ok5vUmV0dXJuKTsgfQorICB2b2lkIHNldERvZXNOb3RSZXR1cm4oKSB7CisgICAgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHJpYnV0ZTo6Tm9SZXR1cm4pOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgY2FsbCBzaG91bGQgbm90IHBlcmZvcm0gaW5kaXJlY3QgYnJhbmNoIHRyYWNraW5nLgorICBib29sIGRvZXNOb0NmQ2hlY2soKSBjb25zdCB7IHJldHVybiBoYXNGbkF0dHIoQXR0cmlidXRlOjpOb0NmQ2hlY2spOyB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgY2FsbCBjYW5ub3QgdW53aW5kLgorICBib29sIGRvZXNOb3RUaHJvdygpIGNvbnN0IHsgcmV0dXJuIGhhc0ZuQXR0cihBdHRyaWJ1dGU6Ok5vVW53aW5kKTsgfQorICB2b2lkIHNldERvZXNOb3RUaHJvdygpIHsKKyAgICBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cmlidXRlOjpOb1Vud2luZCk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBpbnZva2UgY2Fubm90IGJlIGR1cGxpY2F0ZWQuCisgIGJvb2wgY2Fubm90RHVwbGljYXRlKCkgY29uc3Qge3JldHVybiBoYXNGbkF0dHIoQXR0cmlidXRlOjpOb0R1cGxpY2F0ZSk7IH0KKyAgdm9pZCBzZXRDYW5ub3REdXBsaWNhdGUoKSB7CisgICAgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHJpYnV0ZTo6Tm9EdXBsaWNhdGUpOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgaW52b2tlIGlzIGNvbnZlcmdlbnQKKyAgYm9vbCBpc0NvbnZlcmdlbnQoKSBjb25zdCB7IHJldHVybiBoYXNGbkF0dHIoQXR0cmlidXRlOjpDb252ZXJnZW50KTsgfQorICB2b2lkIHNldENvbnZlcmdlbnQoKSB7CisgICAgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHJpYnV0ZTo6Q29udmVyZ2VudCk7CisgIH0KKyAgdm9pZCBzZXROb3RDb252ZXJnZW50KCkgeworICAgIHJlbW92ZUF0dHJpYnV0ZShBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRyaWJ1dGU6OkNvbnZlcmdlbnQpOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgY2FsbCByZXR1cm5zIGEgc3RydWN0dXJlIHRocm91Z2ggZmlyc3QKKyAgLy8vIHBvaW50ZXIgYXJndW1lbnQuCisgIGJvb2wgaGFzU3RydWN0UmV0QXR0cigpIGNvbnN0IHsKKyAgICBpZiAoZ2V0TnVtQXJnT3BlcmFuZHMoKSA9PSAwKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gQmUgZnJpZW5kbHkgYW5kIGFsc28gY2hlY2sgdGhlIGNhbGxlZS4KKyAgICByZXR1cm4gcGFyYW1IYXNBdHRyKDAsIEF0dHJpYnV0ZTo6U3RydWN0UmV0KTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgYW55IGNhbGwgYXJndW1lbnQgaXMgYW4gYWdncmVnYXRlIHBhc3NlZCBieSB2YWx1ZS4KKyAgYm9vbCBoYXNCeVZhbEFyZ3VtZW50KCkgY29uc3QgeworICAgIHJldHVybiBBdHRycy5oYXNBdHRyU29tZXdoZXJlKEF0dHJpYnV0ZTo6QnlWYWwpOworICB9CisgIC8vLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgYnkgdGhpcworICAvLy8gaW5zdHJ1Y3Rpb24uCisgIGNvbnN0IFZhbHVlICpnZXRDYWxsZWRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIE9wPC1JbnN0VHk6OkFyZ09mZnNldD4oKTsgfQorICBWYWx1ZSAqZ2V0Q2FsbGVkVmFsdWUoKSB7IHJldHVybiBPcDwtSW5zdFR5OjpBcmdPZmZzZXQ+KCk7IH0KKworICAvLy8gU2V0IHRoZSBmdW5jdGlvbiBjYWxsZWQuCisgIHZvaWQgc2V0Q2FsbGVkRnVuY3Rpb24oVmFsdWUqIEZuKSB7CisgICAgc2V0Q2FsbGVkRnVuY3Rpb24oCisgICAgICAgIGNhc3Q8RnVuY3Rpb25UeXBlPihjYXN0PFBvaW50ZXJUeXBlPihGbi0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSksCisgICAgICAgIEZuKTsKKyAgfQorICB2b2lkIHNldENhbGxlZEZ1bmN0aW9uKEZ1bmN0aW9uVHlwZSAqRlR5LCBWYWx1ZSAqRm4pIHsKKyAgICB0aGlzLT5GVHkgPSBGVHk7CisgICAgYXNzZXJ0KEZUeSA9PSBjYXN0PEZ1bmN0aW9uVHlwZT4oCisgICAgICAgICAgICAgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oRm4tPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpKTsKKyAgICBPcDwtSW5zdFR5OjpBcmdPZmZzZXQ+KCkgPSBGbjsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBdHRyS2luZD4gYm9vbCBoYXNGbkF0dHJJbXBsKEF0dHJLaW5kIEtpbmQpIGNvbnN0IHsKKyAgICBpZiAoQXR0cnMuaGFzQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEtpbmQpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBPcGVyYW5kIGJ1bmRsZXMgb3ZlcnJpZGUgYXR0cmlidXRlcyBvbiB0aGUgY2FsbGVkIGZ1bmN0aW9uLCBidXQgZG9uJ3QKKyAgICAvLyBvdmVycmlkZSBhdHRyaWJ1dGVzIGRpcmVjdGx5IHByZXNlbnQgb24gdGhlIGNhbGwgaW5zdHJ1Y3Rpb24uCisgICAgaWYgKGlzRm5BdHRyRGlzYWxsb3dlZEJ5T3BCdW5kbGUoS2luZCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoY29uc3QgRnVuY3Rpb24gKkYgPSBnZXRDYWxsZWRGdW5jdGlvbigpKQorICAgICAgcmV0dXJuIEYtPmdldEF0dHJpYnV0ZXMoKS5oYXNBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtpbmQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBmdW5jdGlvbiBjYWxsLCBhYnN0cmFjdGluZyBhIHRhcmdldAorLy8vIG1hY2hpbmUncyBjYWxsaW5nIGNvbnZlbnRpb24uICBUaGlzIGNsYXNzIHVzZXMgbG93IGJpdCBvZiB0aGUgU3ViQ2xhc3NEYXRhCisvLy8gZmllbGQgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBpcyBhIHRhaWwgY2FsbC4gIFRoZSByZXN0IG9mIHRoZSBiaXRzCisvLy8gaG9sZCB0aGUgY2FsbGluZyBjb252ZW50aW9uIG9mIHRoZSBjYWxsLgorLy8vCitjbGFzcyBDYWxsSW5zdCA6IHB1YmxpYyBDYWxsQmFzZTxDYWxsSW5zdD4geworICBmcmllbmQgY2xhc3MgT3BlcmFuZEJ1bmRsZVVzZXI8Q2FsbEluc3QsIFVzZXI6Om9wX2l0ZXJhdG9yPjsKKworICBDYWxsSW5zdChjb25zdCBDYWxsSW5zdCAmQ0kpOworCisgIC8vLyBDb25zdHJ1Y3QgYSBDYWxsSW5zdCBnaXZlbiBhIHJhbmdlIG9mIGFyZ3VtZW50cy4KKyAgLy8vIENvbnN0cnVjdCBhIENhbGxJbnN0IGZyb20gYSByYW5nZSBvZiBhcmd1bWVudHMKKyAgaW5saW5lIENhbGxJbnN0KEZ1bmN0aW9uVHlwZSAqVHksIFZhbHVlICpGdW5jLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcywgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKworICBpbmxpbmUgQ2FsbEluc3QoVmFsdWUgKkZ1bmMsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzLCBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpCisgICAgICA6IENhbGxJbnN0KGNhc3Q8RnVuY3Rpb25UeXBlPigKKyAgICAgICAgICAgICAgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KEZ1bmMtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpLAorICAgICAgICAgICAgICAgICBGdW5jLCBBcmdzLCBCdW5kbGVzLCBOYW1lU3RyLCBJbnNlcnRCZWZvcmUpIHt9CisKKyAgaW5saW5lIENhbGxJbnN0KFZhbHVlICpGdW5jLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLCBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpCisgICAgICA6IENhbGxJbnN0KEZ1bmMsIEFyZ3MsIE5vbmUsIE5hbWVTdHIsIEluc2VydEJlZm9yZSkge30KKworICAvLy8gQ29uc3RydWN0IGEgQ2FsbEluc3QgZ2l2ZW4gYSByYW5nZSBvZiBhcmd1bWVudHMuCisgIC8vLyBDb25zdHJ1Y3QgYSBDYWxsSW5zdCBmcm9tIGEgcmFuZ2Ugb2YgYXJndW1lbnRzCisgIGlubGluZSBDYWxsSW5zdChWYWx1ZSAqRnVuYywgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIGV4cGxpY2l0IENhbGxJbnN0KFZhbHVlICpGLCBjb25zdCBUd2luZSAmTmFtZVN0ciwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisKKyAgQ2FsbEluc3QoVmFsdWUgKkYsIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgdm9pZCBpbml0KFZhbHVlICpGdW5jLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcywgY29uc3QgVHdpbmUgJk5hbWVTdHIpIHsKKyAgICBpbml0KGNhc3Q8RnVuY3Rpb25UeXBlPigKKyAgICAgICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihGdW5jLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKSwKKyAgICAgICAgIEZ1bmMsIEFyZ3MsIEJ1bmRsZXMsIE5hbWVTdHIpOworICB9CisgIHZvaWQgaW5pdChGdW5jdGlvblR5cGUgKkZUeSwgVmFsdWUgKkZ1bmMsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzLCBjb25zdCBUd2luZSAmTmFtZVN0cik7CisgIHZvaWQgaW5pdChWYWx1ZSAqRnVuYywgY29uc3QgVHdpbmUgJk5hbWVTdHIpOworCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBDYWxsSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQgQXJnT2Zmc2V0ID0gMTsKKworICBzdGF0aWMgQ2FsbEluc3QgKkNyZWF0ZShWYWx1ZSAqRnVuYywgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcyA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIENyZWF0ZShjYXN0PEZ1bmN0aW9uVHlwZT4oCisgICAgICAgICAgICAgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oRnVuYy0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSksCisgICAgICAgICAgICAgICAgICBGdW5jLCBBcmdzLCBCdW5kbGVzLCBOYW1lU3RyLCBJbnNlcnRCZWZvcmUpOworICB9CisKKyAgc3RhdGljIENhbGxJbnN0ICpDcmVhdGUoVmFsdWUgKkZ1bmMsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIHJldHVybiBDcmVhdGUoY2FzdDxGdW5jdGlvblR5cGU+KAorICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KEZ1bmMtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgRnVuYywgQXJncywgTm9uZSwgTmFtZVN0ciwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBDYWxsSW5zdCAqQ3JlYXRlKEZ1bmN0aW9uVHlwZSAqVHksIFZhbHVlICpGdW5jLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbmV3ICh1bnNpZ25lZChBcmdzLnNpemUoKSArIDEpKQorICAgICAgICBDYWxsSW5zdChUeSwgRnVuYywgQXJncywgTm9uZSwgTmFtZVN0ciwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBDYWxsSW5zdCAqQ3JlYXRlKEZ1bmN0aW9uVHlwZSAqVHksIFZhbHVlICpGdW5jLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICBjb25zdCB1bnNpZ25lZCBUb3RhbE9wcyA9CisgICAgICAgIHVuc2lnbmVkKEFyZ3Muc2l6ZSgpKSArIENvdW50QnVuZGxlSW5wdXRzKEJ1bmRsZXMpICsgMTsKKyAgICBjb25zdCB1bnNpZ25lZCBEZXNjcmlwdG9yQnl0ZXMgPSBCdW5kbGVzLnNpemUoKSAqIHNpemVvZihCdW5kbGVPcEluZm8pOworCisgICAgcmV0dXJuIG5ldyAoVG90YWxPcHMsIERlc2NyaXB0b3JCeXRlcykKKyAgICAgICAgQ2FsbEluc3QoVHksIEZ1bmMsIEFyZ3MsIEJ1bmRsZXMsIE5hbWVTdHIsIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgQ2FsbEluc3QgKkNyZWF0ZShWYWx1ZSAqRnVuYywgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgY29uc3QgdW5zaWduZWQgVG90YWxPcHMgPQorICAgICAgICB1bnNpZ25lZChBcmdzLnNpemUoKSkgKyBDb3VudEJ1bmRsZUlucHV0cyhCdW5kbGVzKSArIDE7CisgICAgY29uc3QgdW5zaWduZWQgRGVzY3JpcHRvckJ5dGVzID0gQnVuZGxlcy5zaXplKCkgKiBzaXplb2YoQnVuZGxlT3BJbmZvKTsKKworICAgIHJldHVybiBuZXcgKFRvdGFsT3BzLCBEZXNjcmlwdG9yQnl0ZXMpCisgICAgICAgIENhbGxJbnN0KEZ1bmMsIEFyZ3MsIEJ1bmRsZXMsIE5hbWVTdHIsIEluc2VydEF0RW5kKTsKKyAgfQorCisgIHN0YXRpYyBDYWxsSW5zdCAqQ3JlYXRlKFZhbHVlICpGdW5jLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3ICh1bnNpZ25lZChBcmdzLnNpemUoKSArIDEpKQorICAgICAgICBDYWxsSW5zdChGdW5jLCBBcmdzLCBOb25lLCBOYW1lU3RyLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICBzdGF0aWMgQ2FsbEluc3QgKkNyZWF0ZShWYWx1ZSAqRiwgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbmV3ICgxKSBDYWxsSW5zdChGLCBOYW1lU3RyLCBJbnNlcnRCZWZvcmUpOworICB9CisKKyAgc3RhdGljIENhbGxJbnN0ICpDcmVhdGUoVmFsdWUgKkYsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIHJldHVybiBuZXcgKDEpIENhbGxJbnN0KEYsIE5hbWVTdHIsIEluc2VydEF0RW5kKTsKKyAgfQorCisgIC8vLyBDcmVhdGUgYSBjbG9uZSBvZiBccCBDSSB3aXRoIGEgZGlmZmVyZW50IHNldCBvZiBvcGVyYW5kIGJ1bmRsZXMgYW5kCisgIC8vLyBpbnNlcnQgaXQgYmVmb3JlIFxwIEluc2VydFB0LgorICAvLy8KKyAgLy8vIFRoZSByZXR1cm5lZCBjYWxsIGluc3RydWN0aW9uIGlzIGlkZW50aWNhbCBccCBDSSBpbiBldmVyeSB3YXkgZXhjZXB0IHRoYXQKKyAgLy8vIHRoZSBvcGVyYW5kIGJ1bmRsZXMgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb24gYXJlIHNldCB0byB0aGUgb3BlcmFuZCBidW5kbGVzCisgIC8vLyBpbiBccCBCdW5kbGVzLgorICBzdGF0aWMgQ2FsbEluc3QgKkNyZWF0ZShDYWxsSW5zdCAqQ0ksIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRQdCA9IG51bGxwdHIpOworCisgIC8vLyBHZW5lcmF0ZSB0aGUgSVIgZm9yIGEgY2FsbCB0byBtYWxsb2M6CisgIC8vLyAxLiBDb21wdXRlIHRoZSBtYWxsb2MgY2FsbCdzIGFyZ3VtZW50IGFzIHRoZSBzcGVjaWZpZWQgdHlwZSdzIHNpemUsCisgIC8vLyAgICBwb3NzaWJseSBtdWx0aXBsaWVkIGJ5IHRoZSBhcnJheSBzaXplIGlmIHRoZSBhcnJheSBzaXplIGlzIG5vdAorICAvLy8gICAgY29uc3RhbnQgMS4KKyAgLy8vIDIuIENhbGwgbWFsbG9jIHdpdGggdGhhdCBhcmd1bWVudC4KKyAgLy8vIDMuIEJpdGNhc3QgdGhlIHJlc3VsdCBvZiB0aGUgbWFsbG9jIGNhbGwgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgorICBzdGF0aWMgSW5zdHJ1Y3Rpb24gKkNyZWF0ZU1hbGxvYyhJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlLCBUeXBlICpJbnRQdHJUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqQWxsb2NUeSwgVmFsdWUgKkFsbG9jU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKkFycmF5U2l6ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uICpNYWxsb2NGID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIik7CisgIHN0YXRpYyBJbnN0cnVjdGlvbiAqQ3JlYXRlTWFsbG9jKEJhc2ljQmxvY2sgKkluc2VydEF0RW5kLCBUeXBlICpJbnRQdHJUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqQWxsb2NUeSwgVmFsdWUgKkFsbG9jU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKkFycmF5U2l6ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uICpNYWxsb2NGID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIik7CisgIHN0YXRpYyBJbnN0cnVjdGlvbiAqQ3JlYXRlTWFsbG9jKEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUsIFR5cGUgKkludFB0clR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpBbGxvY1R5LCBWYWx1ZSAqQWxsb2NTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQXJyYXlTaXplID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcyA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uICpNYWxsb2NGID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIik7CisgIHN0YXRpYyBJbnN0cnVjdGlvbiAqQ3JlYXRlTWFsbG9jKEJhc2ljQmxvY2sgKkluc2VydEF0RW5kLCBUeXBlICpJbnRQdHJUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqQWxsb2NUeSwgVmFsdWUgKkFsbG9jU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKkFycmF5U2l6ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiAqTWFsbG9jRiA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpOworICAvLy8gR2VuZXJhdGUgdGhlIElSIGZvciBhIGNhbGwgdG8gdGhlIGJ1aWx0aW4gZnJlZSBmdW5jdGlvbi4KKyAgc3RhdGljIEluc3RydWN0aW9uICpDcmVhdGVGcmVlKFZhbHVlICpTb3VyY2UsIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpOworICBzdGF0aWMgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUZyZWUoVmFsdWUgKlNvdXJjZSwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworICBzdGF0aWMgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUZyZWUoVmFsdWUgKlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKyAgc3RhdGljIEluc3RydWN0aW9uICpDcmVhdGVGcmVlKFZhbHVlICpTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIC8vIE5vdGUgdGhhdCAnbXVzdHRhaWwnIGltcGxpZXMgJ3RhaWwnLgorICBlbnVtIFRhaWxDYWxsS2luZCB7CisgICAgVENLX05vbmUgPSAwLAorICAgIFRDS19UYWlsID0gMSwKKyAgICBUQ0tfTXVzdFRhaWwgPSAyLAorICAgIFRDS19Ob1RhaWwgPSAzCisgIH07CisgIFRhaWxDYWxsS2luZCBnZXRUYWlsQ2FsbEtpbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIFRhaWxDYWxsS2luZChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIDMpOworICB9CisKKyAgYm9vbCBpc1RhaWxDYWxsKCkgY29uc3QgeworICAgIHVuc2lnbmVkIEtpbmQgPSBnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIDM7CisgICAgcmV0dXJuIEtpbmQgPT0gVENLX1RhaWwgfHwgS2luZCA9PSBUQ0tfTXVzdFRhaWw7CisgIH0KKworICBib29sIGlzTXVzdFRhaWxDYWxsKCkgY29uc3QgeworICAgIHJldHVybiAoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiAzKSA9PSBUQ0tfTXVzdFRhaWw7CisgIH0KKworICBib29sIGlzTm9UYWlsQ2FsbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgMykgPT0gVENLX05vVGFpbDsKKyAgfQorCisgIHZvaWQgc2V0VGFpbENhbGwoYm9vbCBpc1RDID0gdHJ1ZSkgeworICAgIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIH4zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQoaXNUQyA/IFRDS19UYWlsIDogVENLX05vbmUpKTsKKyAgfQorCisgIHZvaWQgc2V0VGFpbENhbGxLaW5kKFRhaWxDYWxsS2luZCBUQ0spIHsKKyAgICBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSgoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiB+MykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkKFRDSykpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBjYWxsIGNhbiByZXR1cm4gdHdpY2UKKyAgYm9vbCBjYW5SZXR1cm5Ud2ljZSgpIGNvbnN0IHsgcmV0dXJuIGhhc0ZuQXR0cihBdHRyaWJ1dGU6OlJldHVybnNUd2ljZSk7IH0KKyAgdm9pZCBzZXRDYW5SZXR1cm5Ud2ljZSgpIHsKKyAgICBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cmlidXRlOjpSZXR1cm5zVHdpY2UpOworICB9CisKKyAgLy8vIENoZWNrIGlmIHRoaXMgY2FsbCBpcyBhbiBpbmxpbmUgYXNtIHN0YXRlbWVudC4KKyAgYm9vbCBpc0lubGluZUFzbSgpIGNvbnN0IHsgcmV0dXJuIGlzYTxJbmxpbmVBc20+KE9wPC0xPigpKTsgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkNhbGw7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9CisKK3ByaXZhdGU6CisgIC8vIFNoYWRvdyBJbnN0cnVjdGlvbjo6c2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEgd2l0aCBhIHByaXZhdGUgZm9yd2FyZGluZworICAvLyBtZXRob2Qgc28gdGhhdCBzdWJjbGFzc2VzIGNhbm5vdCBhY2NpZGVudGFsbHkgdXNlIGl0LgorICB2b2lkIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKHVuc2lnbmVkIHNob3J0IEQpIHsKKyAgICBJbnN0cnVjdGlvbjo6c2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoRCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxDYWxsQmFzZTxDYWxsSW5zdD4+CisgICAgOiBwdWJsaWMgVmFyaWFkaWNPcGVyYW5kVHJhaXRzPENhbGxCYXNlPENhbGxJbnN0PiwgMT4ge307CisKK0NhbGxJbnN0OjpDYWxsSW5zdChWYWx1ZSAqRnVuYywgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzLCBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkKKyAgICA6IENhbGxCYXNlPENhbGxJbnN0PigKKyAgICAgICAgICBjYXN0PEZ1bmN0aW9uVHlwZT4oCisgICAgICAgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KEZ1bmMtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpCisgICAgICAgICAgICAgIC0+Z2V0UmV0dXJuVHlwZSgpLAorICAgICAgICAgIEluc3RydWN0aW9uOjpDYWxsLAorICAgICAgICAgIE9wZXJhbmRUcmFpdHM8Q2FsbEJhc2U8Q2FsbEluc3Q+Pjo6b3BfZW5kKHRoaXMpIC0KKyAgICAgICAgICAgICAgKEFyZ3Muc2l6ZSgpICsgQ291bnRCdW5kbGVJbnB1dHMoQnVuZGxlcykgKyAxKSwKKyAgICAgICAgICB1bnNpZ25lZChBcmdzLnNpemUoKSArIENvdW50QnVuZGxlSW5wdXRzKEJ1bmRsZXMpICsgMSksIEluc2VydEF0RW5kKSB7CisgIGluaXQoRnVuYywgQXJncywgQnVuZGxlcywgTmFtZVN0cik7Cit9CisKK0NhbGxJbnN0OjpDYWxsSW5zdChGdW5jdGlvblR5cGUgKlR5LCBWYWx1ZSAqRnVuYywgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzLCBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKQorICAgIDogQ2FsbEJhc2U8Q2FsbEluc3Q+KFR5LT5nZXRSZXR1cm5UeXBlKCksIEluc3RydWN0aW9uOjpDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8Q2FsbEJhc2U8Q2FsbEluc3Q+Pjo6b3BfZW5kKHRoaXMpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFyZ3Muc2l6ZSgpICsgQ291bnRCdW5kbGVJbnB1dHMoQnVuZGxlcykgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZChBcmdzLnNpemUoKSArIENvdW50QnVuZGxlSW5wdXRzKEJ1bmRsZXMpICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0QmVmb3JlKSB7CisgIGluaXQoVHksIEZ1bmMsIEFyZ3MsIEJ1bmRsZXMsIE5hbWVTdHIpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0SW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgTExWTSAnc2VsZWN0JyBpbnN0cnVjdGlvbi4KKy8vLworY2xhc3MgU2VsZWN0SW5zdCA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7CisgIFNlbGVjdEluc3QoVmFsdWUgKkMsIFZhbHVlICpTMSwgVmFsdWUgKlMyLCBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKQorICAgIDogSW5zdHJ1Y3Rpb24oUzEtPmdldFR5cGUoKSwgSW5zdHJ1Y3Rpb246OlNlbGVjdCwKKyAgICAgICAgICAgICAgICAgICZPcDwwPigpLCAzLCBJbnNlcnRCZWZvcmUpIHsKKyAgICBpbml0KEMsIFMxLCBTMik7CisgICAgc2V0TmFtZShOYW1lU3RyKTsKKyAgfQorCisgIFNlbGVjdEluc3QoVmFsdWUgKkMsIFZhbHVlICpTMSwgVmFsdWUgKlMyLCBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkKKyAgICA6IEluc3RydWN0aW9uKFMxLT5nZXRUeXBlKCksIEluc3RydWN0aW9uOjpTZWxlY3QsCisgICAgICAgICAgICAgICAgICAmT3A8MD4oKSwgMywgSW5zZXJ0QXRFbmQpIHsKKyAgICBpbml0KEMsIFMxLCBTMik7CisgICAgc2V0TmFtZShOYW1lU3RyKTsKKyAgfQorCisgIHZvaWQgaW5pdChWYWx1ZSAqQywgVmFsdWUgKlMxLCBWYWx1ZSAqUzIpIHsKKyAgICBhc3NlcnQoIWFyZUludmFsaWRPcGVyYW5kcyhDLCBTMSwgUzIpICYmICJJbnZhbGlkIG9wZXJhbmRzIGZvciBzZWxlY3QiKTsKKyAgICBPcDwwPigpID0gQzsKKyAgICBPcDwxPigpID0gUzE7CisgICAgT3A8Mj4oKSA9IFMyOworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIFNlbGVjdEluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIHN0YXRpYyBTZWxlY3RJbnN0ICpDcmVhdGUoVmFsdWUgKkMsIFZhbHVlICpTMSwgVmFsdWUgKlMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKk1ERnJvbSA9IG51bGxwdHIpIHsKKyAgICBTZWxlY3RJbnN0ICpTZWwgPSBuZXcoMykgU2VsZWN0SW5zdChDLCBTMSwgUzIsIE5hbWVTdHIsIEluc2VydEJlZm9yZSk7CisgICAgaWYgKE1ERnJvbSkKKyAgICAgIFNlbC0+Y29weU1ldGFkYXRhKCpNREZyb20pOworICAgIHJldHVybiBTZWw7CisgIH0KKworICBzdGF0aWMgU2VsZWN0SW5zdCAqQ3JlYXRlKFZhbHVlICpDLCBWYWx1ZSAqUzEsIFZhbHVlICpTMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIHJldHVybiBuZXcoMykgU2VsZWN0SW5zdChDLCBTMSwgUzIsIE5hbWVTdHIsIEluc2VydEF0RW5kKTsKKyAgfQorCisgIGNvbnN0IFZhbHVlICpnZXRDb25kaXRpb24oKSBjb25zdCB7IHJldHVybiBPcDwwPigpOyB9CisgIGNvbnN0IFZhbHVlICpnZXRUcnVlVmFsdWUoKSBjb25zdCB7IHJldHVybiBPcDwxPigpOyB9CisgIGNvbnN0IFZhbHVlICpnZXRGYWxzZVZhbHVlKCkgY29uc3QgeyByZXR1cm4gT3A8Mj4oKTsgfQorICBWYWx1ZSAqZ2V0Q29uZGl0aW9uKCkgeyByZXR1cm4gT3A8MD4oKTsgfQorICBWYWx1ZSAqZ2V0VHJ1ZVZhbHVlKCkgeyByZXR1cm4gT3A8MT4oKTsgfQorICBWYWx1ZSAqZ2V0RmFsc2VWYWx1ZSgpIHsgcmV0dXJuIE9wPDI+KCk7IH0KKworICB2b2lkIHNldENvbmRpdGlvbihWYWx1ZSAqVikgeyBPcDwwPigpID0gVjsgfQorICB2b2lkIHNldFRydWVWYWx1ZShWYWx1ZSAqVikgeyBPcDwxPigpID0gVjsgfQorICB2b2lkIHNldEZhbHNlVmFsdWUoVmFsdWUgKlYpIHsgT3A8Mj4oKSA9IFY7IH0KKworICAvLy8gUmV0dXJuIGEgc3RyaW5nIGlmIHRoZSBzcGVjaWZpZWQgb3BlcmFuZHMgYXJlIGludmFsaWQKKyAgLy8vIGZvciBhIHNlbGVjdCBvcGVyYXRpb24sIG90aGVyd2lzZSByZXR1cm4gbnVsbC4KKyAgc3RhdGljIGNvbnN0IGNoYXIgKmFyZUludmFsaWRPcGVyYW5kcyhWYWx1ZSAqQ29uZCwgVmFsdWUgKlRydWUsIFZhbHVlICpGYWxzZSk7CisKKyAgLy8vIFRyYW5zcGFyZW50bHkgcHJvdmlkZSBtb3JlIGVmZmljaWVudCBnZXRPcGVyYW5kIG1ldGhvZHMuCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIE90aGVyT3BzIGdldE9wY29kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8T3RoZXJPcHM+KEluc3RydWN0aW9uOjpnZXRPcGNvZGUoKSk7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTZWxlY3Q7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8U2VsZWN0SW5zdD4gOiBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPFNlbGVjdEluc3QsIDM+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhTZWxlY3RJbnN0LCBWYWx1ZSkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFyZ0luc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHZhX2FyZyBsbHZtIGluc3RydWN0aW9uLCB3aGljaCByZXR1cm5zCisvLy8gYW4gYXJndW1lbnQgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGdpdmVuIGEgdmFfbGlzdCBhbmQgaW5jcmVtZW50cyB0aGF0IGxpc3QKKy8vLworY2xhc3MgVkFBcmdJbnN0IDogcHVibGljIFVuYXJ5SW5zdHJ1Y3Rpb24geworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgVkFBcmdJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICBWQUFyZ0luc3QoVmFsdWUgKkxpc3QsIFR5cGUgKlR5LCBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLAorICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKQorICAgIDogVW5hcnlJbnN0cnVjdGlvbihUeSwgVkFBcmcsIExpc3QsIEluc2VydEJlZm9yZSkgeworICAgIHNldE5hbWUoTmFtZVN0cik7CisgIH0KKworICBWQUFyZ0luc3QoVmFsdWUgKkxpc3QsIFR5cGUgKlR5LCBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorICAgIDogVW5hcnlJbnN0cnVjdGlvbihUeSwgVkFBcmcsIExpc3QsIEluc2VydEF0RW5kKSB7CisgICAgc2V0TmFtZShOYW1lU3RyKTsKKyAgfQorCisgIFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZCgpIHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKyAgY29uc3QgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0UG9pbnRlck9wZXJhbmRJbmRleCgpIHsgcmV0dXJuIDBVOyB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBWQUFyZzsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFjdEVsZW1lbnRJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGhpcyBpbnN0cnVjdGlvbiBleHRyYWN0cyBhIHNpbmdsZSAoc2NhbGFyKQorLy8vIGVsZW1lbnQgZnJvbSBhIFZlY3RvclR5cGUgdmFsdWUKKy8vLworY2xhc3MgRXh0cmFjdEVsZW1lbnRJbnN0IDogcHVibGljIEluc3RydWN0aW9uIHsKKyAgRXh0cmFjdEVsZW1lbnRJbnN0KFZhbHVlICpWZWMsIFZhbHVlICpJZHgsIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIEV4dHJhY3RFbGVtZW50SW5zdChWYWx1ZSAqVmVjLCBWYWx1ZSAqSWR4LCBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgRXh0cmFjdEVsZW1lbnRJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICBzdGF0aWMgRXh0cmFjdEVsZW1lbnRJbnN0ICpDcmVhdGUoVmFsdWUgKlZlYywgVmFsdWUgKklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbmV3KDIpIEV4dHJhY3RFbGVtZW50SW5zdChWZWMsIElkeCwgTmFtZVN0ciwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBFeHRyYWN0RWxlbWVudEluc3QgKkNyZWF0ZShWYWx1ZSAqVmVjLCBWYWx1ZSAqSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3KDIpIEV4dHJhY3RFbGVtZW50SW5zdChWZWMsIElkeCwgTmFtZVN0ciwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGFuIGV4dHJhY3RlbGVtZW50IGluc3RydWN0aW9uIGNhbiBiZQorICAvLy8gZm9ybWVkIHdpdGggdGhlIHNwZWNpZmllZCBvcGVyYW5kcy4KKyAgc3RhdGljIGJvb2wgaXNWYWxpZE9wZXJhbmRzKGNvbnN0IFZhbHVlICpWZWMsIGNvbnN0IFZhbHVlICpJZHgpOworCisgIFZhbHVlICpnZXRWZWN0b3JPcGVyYW5kKCkgeyByZXR1cm4gT3A8MD4oKTsgfQorICBWYWx1ZSAqZ2V0SW5kZXhPcGVyYW5kKCkgeyByZXR1cm4gT3A8MT4oKTsgfQorICBjb25zdCBWYWx1ZSAqZ2V0VmVjdG9yT3BlcmFuZCgpIGNvbnN0IHsgcmV0dXJuIE9wPDA+KCk7IH0KKyAgY29uc3QgVmFsdWUgKmdldEluZGV4T3BlcmFuZCgpIGNvbnN0IHsgcmV0dXJuIE9wPDE+KCk7IH0KKworICBWZWN0b3JUeXBlICpnZXRWZWN0b3JPcGVyYW5kVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxWZWN0b3JUeXBlPihnZXRWZWN0b3JPcGVyYW5kKCktPmdldFR5cGUoKSk7CisgIH0KKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RXh0cmFjdEVsZW1lbnQ7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8RXh0cmFjdEVsZW1lbnRJbnN0PiA6CisgIHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8RXh0cmFjdEVsZW1lbnRJbnN0LCAyPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoRXh0cmFjdEVsZW1lbnRJbnN0LCBWYWx1ZSkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRFbGVtZW50SW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgaW5zdHJ1Y3Rpb24gaW5zZXJ0cyBhIHNpbmdsZSAoc2NhbGFyKQorLy8vIGVsZW1lbnQgaW50byBhIFZlY3RvclR5cGUgdmFsdWUKKy8vLworY2xhc3MgSW5zZXJ0RWxlbWVudEluc3QgOiBwdWJsaWMgSW5zdHJ1Y3Rpb24geworICBJbnNlcnRFbGVtZW50SW5zdChWYWx1ZSAqVmVjLCBWYWx1ZSAqTmV3RWx0LCBWYWx1ZSAqSWR4LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLAorICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIEluc2VydEVsZW1lbnRJbnN0KFZhbHVlICpWZWMsIFZhbHVlICpOZXdFbHQsIFZhbHVlICpJZHgsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIEluc2VydEVsZW1lbnRJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICBzdGF0aWMgSW5zZXJ0RWxlbWVudEluc3QgKkNyZWF0ZShWYWx1ZSAqVmVjLCBWYWx1ZSAqTmV3RWx0LCBWYWx1ZSAqSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIHJldHVybiBuZXcoMykgSW5zZXJ0RWxlbWVudEluc3QoVmVjLCBOZXdFbHQsIElkeCwgTmFtZVN0ciwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBJbnNlcnRFbGVtZW50SW5zdCAqQ3JlYXRlKFZhbHVlICpWZWMsIFZhbHVlICpOZXdFbHQsIFZhbHVlICpJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIHJldHVybiBuZXcoMykgSW5zZXJ0RWxlbWVudEluc3QoVmVjLCBOZXdFbHQsIElkeCwgTmFtZVN0ciwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGFuIGluc2VydGVsZW1lbnQgaW5zdHJ1Y3Rpb24gY2FuIGJlCisgIC8vLyBmb3JtZWQgd2l0aCB0aGUgc3BlY2lmaWVkIG9wZXJhbmRzLgorICBzdGF0aWMgYm9vbCBpc1ZhbGlkT3BlcmFuZHMoY29uc3QgVmFsdWUgKlZlYywgY29uc3QgVmFsdWUgKk5ld0VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpJZHgpOworCisgIC8vLyBPdmVybG9hZCB0byByZXR1cm4gbW9zdCBzcGVjaWZpYyB2ZWN0b3IgdHlwZS4KKyAgLy8vCisgIFZlY3RvclR5cGUgKmdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8VmVjdG9yVHlwZT4oSW5zdHJ1Y3Rpb246OmdldFR5cGUoKSk7CisgIH0KKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6SW5zZXJ0RWxlbWVudDsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxJbnNlcnRFbGVtZW50SW5zdD4gOgorICBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPEluc2VydEVsZW1lbnRJbnN0LCAzPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoSW5zZXJ0RWxlbWVudEluc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBTaHVmZmxlVmVjdG9ySW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgaW5zdHJ1Y3Rpb24gY29uc3RydWN0cyBhIGZpeGVkIHBlcm11dGF0aW9uIG9mIHR3bworLy8vIGlucHV0IHZlY3RvcnMuCisvLy8KK2NsYXNzIFNodWZmbGVWZWN0b3JJbnN0IDogcHVibGljIEluc3RydWN0aW9uIHsKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIFNodWZmbGVWZWN0b3JJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICBTaHVmZmxlVmVjdG9ySW5zdChWYWx1ZSAqVjEsIFZhbHVlICpWMiwgVmFsdWUgKk1hc2ssCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvciA9IG51bGxwdHIpOworICBTaHVmZmxlVmVjdG9ySW5zdChWYWx1ZSAqVjEsIFZhbHVlICpWMiwgVmFsdWUgKk1hc2ssCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgdGhyZWUgb3BlcmFuZHMKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7CisgICAgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzLCAzKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhIHNodWZmbGV2ZWN0b3IgaW5zdHJ1Y3Rpb24gY2FuIGJlCisgIC8vLyBmb3JtZWQgd2l0aCB0aGUgc3BlY2lmaWVkIG9wZXJhbmRzLgorICBzdGF0aWMgYm9vbCBpc1ZhbGlkT3BlcmFuZHMoY29uc3QgVmFsdWUgKlYxLCBjb25zdCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqTWFzayk7CisKKyAgLy8vIE92ZXJsb2FkIHRvIHJldHVybiBtb3N0IHNwZWNpZmljIHZlY3RvciB0eXBlLgorICAvLy8KKyAgVmVjdG9yVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxWZWN0b3JUeXBlPihJbnN0cnVjdGlvbjo6Z2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICBDb25zdGFudCAqZ2V0TWFzaygpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxDb25zdGFudD4oZ2V0T3BlcmFuZCgyKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBzaHVmZmxlIG1hc2sgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBvZiB0aGUgbWFzay4KKyAgLy8vIFJldHVybiAtMSBpZiB0aGUgZWxlbWVudCBpcyB1bmRlZi4KKyAgc3RhdGljIGludCBnZXRNYXNrVmFsdWUoQ29uc3RhbnQgKk1hc2ssIHVuc2lnbmVkIEVsdCk7CisKKyAgLy8vIFJldHVybiB0aGUgc2h1ZmZsZSBtYXNrIHZhbHVlIG9mIHRoaXMgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBnaXZlbiBlbGVtZW50CisgIC8vLyBpbmRleC4gUmV0dXJuIC0xIGlmIHRoZSBlbGVtZW50IGlzIHVuZGVmLgorICBpbnQgZ2V0TWFza1ZhbHVlKHVuc2lnbmVkIEVsdCkgY29uc3QgeworICAgIHJldHVybiBnZXRNYXNrVmFsdWUoZ2V0TWFzaygpLCBFbHQpOworICB9CisKKyAgLy8vIENvbnZlcnQgdGhlIGlucHV0IHNodWZmbGUgbWFzayBvcGVyYW5kIHRvIGEgdmVjdG9yIG9mIGludGVnZXJzLiBVbmRlZmluZWQKKyAgLy8vIGVsZW1lbnRzIG9mIHRoZSBtYXNrIGFyZSByZXR1cm5lZCBhcyAtMS4KKyAgc3RhdGljIHZvaWQgZ2V0U2h1ZmZsZU1hc2soQ29uc3RhbnQgKk1hc2ssIFNtYWxsVmVjdG9ySW1wbDxpbnQ+ICZSZXN1bHQpOworCisgIC8vLyBSZXR1cm4gdGhlIG1hc2sgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24gYXMgYSB2ZWN0b3Igb2YgaW50ZWdlcnMuIFVuZGVmaW5lZAorICAvLy8gZWxlbWVudHMgb2YgdGhlIG1hc2sgYXJlIHJldHVybmVkIGFzIC0xLgorICB2b2lkIGdldFNodWZmbGVNYXNrKFNtYWxsVmVjdG9ySW1wbDxpbnQ+ICZSZXN1bHQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U2h1ZmZsZU1hc2soZ2V0TWFzaygpLCBSZXN1bHQpOworICB9CisKKyAgU21hbGxWZWN0b3I8aW50LCAxNj4gZ2V0U2h1ZmZsZU1hc2soKSBjb25zdCB7CisgICAgU21hbGxWZWN0b3I8aW50LCAxNj4gTWFzazsKKyAgICBnZXRTaHVmZmxlTWFzayhNYXNrKTsKKyAgICByZXR1cm4gTWFzazsKKyAgfQorCisgIC8vLyBDaGFuZ2UgdmFsdWVzIGluIGEgc2h1ZmZsZSBwZXJtdXRlIG1hc2sgYXNzdW1pbmcgdGhlIHR3byB2ZWN0b3Igb3BlcmFuZHMKKyAgLy8vIG9mIGxlbmd0aCBJblZlY051bUVsdHMgaGF2ZSBzd2FwcGVkIHBvc2l0aW9uLgorICBzdGF0aWMgdm9pZCBjb21tdXRlU2h1ZmZsZU1hc2soTXV0YWJsZUFycmF5UmVmPGludD4gTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluVmVjTnVtRWx0cykgeworICAgIGZvciAoaW50ICZJZHggOiBNYXNrKSB7CisgICAgICBpZiAoSWR4ID09IC0xKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIElkeCA9IElkeCA8IChpbnQpSW5WZWNOdW1FbHRzID8gSWR4ICsgSW5WZWNOdW1FbHRzIDogSWR4IC0gSW5WZWNOdW1FbHRzOworICAgICAgYXNzZXJ0KElkeCA+PSAwICYmIElkeCA8IChpbnQpSW5WZWNOdW1FbHRzICogMiAmJgorICAgICAgICAgICAgICJzaHVmZmxldmVjdG9yIG1hc2sgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgfQorICB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U2h1ZmZsZVZlY3RvcjsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxTaHVmZmxlVmVjdG9ySW5zdD4gOgorICBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPFNodWZmbGVWZWN0b3JJbnN0LCAzPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoU2h1ZmZsZVZlY3Rvckluc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RWYWx1ZUluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBUaGlzIGluc3RydWN0aW9uIGV4dHJhY3RzIGEgc3RydWN0IG1lbWJlciBvciBhcnJheQorLy8vIGVsZW1lbnQgdmFsdWUgZnJvbSBhbiBhZ2dyZWdhdGUgdmFsdWUuCisvLy8KK2NsYXNzIEV4dHJhY3RWYWx1ZUluc3QgOiBwdWJsaWMgVW5hcnlJbnN0cnVjdGlvbiB7CisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBJbmRpY2VzOworCisgIEV4dHJhY3RWYWx1ZUluc3QoY29uc3QgRXh0cmFjdFZhbHVlSW5zdCAmRVZJKTsKKworICAvLy8gQ29uc3RydWN0b3JzIC0gQ3JlYXRlIGEgZXh0cmFjdHZhbHVlIGluc3RydWN0aW9uIHdpdGggYSBiYXNlIGFnZ3JlZ2F0ZQorICAvLy8gdmFsdWUgYW5kIGEgbGlzdCBvZiBpbmRpY2VzLiAgVGhlIGZpcnN0IGN0b3IgY2FuIG9wdGlvbmFsbHkgaW5zZXJ0IGJlZm9yZQorICAvLy8gYW4gZXhpc3RpbmcgaW5zdHJ1Y3Rpb24sIHRoZSBzZWNvbmQgYXBwZW5kcyB0aGUgbmV3IGluc3RydWN0aW9uIHRvIHRoZQorICAvLy8gc3BlY2lmaWVkIEJhc2ljQmxvY2suCisgIGlubGluZSBFeHRyYWN0VmFsdWVJbnN0KFZhbHVlICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisgIGlubGluZSBFeHRyYWN0VmFsdWVJbnN0KFZhbHVlICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIHZvaWQgaW5pdChBcnJheVJlZjx1bnNpZ25lZD4gSWR4cywgY29uc3QgVHdpbmUgJk5hbWVTdHIpOworCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBFeHRyYWN0VmFsdWVJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICBzdGF0aWMgRXh0cmFjdFZhbHVlSW5zdCAqQ3JlYXRlKFZhbHVlICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIHJldHVybiBuZXcKKyAgICAgIEV4dHJhY3RWYWx1ZUluc3QoQWdnLCBJZHhzLCBOYW1lU3RyLCBJbnNlcnRCZWZvcmUpOworICB9CisKKyAgc3RhdGljIEV4dHJhY3RWYWx1ZUluc3QgKkNyZWF0ZShWYWx1ZSAqQWdnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgcmV0dXJuIG5ldyBFeHRyYWN0VmFsdWVJbnN0KEFnZywgSWR4cywgTmFtZVN0ciwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQgdGhhdCB3b3VsZCBiZSBleHRyYWN0ZWQKKyAgLy8vIHdpdGggYW4gZXh0cmFjdHZhbHVlIGluc3RydWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAvLy8KKyAgLy8vIE51bGwgaXMgcmV0dXJuZWQgaWYgdGhlIGluZGljZXMgYXJlIGludmFsaWQgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgc3RhdGljIFR5cGUgKmdldEluZGV4ZWRUeXBlKFR5cGUgKkFnZywgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMpOworCisgIHVzaW5nIGlkeF9pdGVyYXRvciA9IGNvbnN0IHVuc2lnbmVkKjsKKworICBpbmxpbmUgaWR4X2l0ZXJhdG9yIGlkeF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIEluZGljZXMuYmVnaW4oKTsgfQorICBpbmxpbmUgaWR4X2l0ZXJhdG9yIGlkeF9lbmQoKSAgIGNvbnN0IHsgcmV0dXJuIEluZGljZXMuZW5kKCk7IH0KKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPGlkeF9pdGVyYXRvcj4gaW5kaWNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShpZHhfYmVnaW4oKSwgaWR4X2VuZCgpKTsKKyAgfQorCisgIFZhbHVlICpnZXRBZ2dyZWdhdGVPcGVyYW5kKCkgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDApOworICB9CisgIGNvbnN0IFZhbHVlICpnZXRBZ2dyZWdhdGVPcGVyYW5kKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDApOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRBZ2dyZWdhdGVPcGVyYW5kSW5kZXgoKSB7CisgICAgcmV0dXJuIDBVOyAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgaW5kZXggZm9yIG1vZGlmeWluZyBjb3JyZWN0IG9wZXJhbmQKKyAgfQorCisgIEFycmF5UmVmPHVuc2lnbmVkPiBnZXRJbmRpY2VzKCkgY29uc3QgeworICAgIHJldHVybiBJbmRpY2VzOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtSW5kaWNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKHVuc2lnbmVkKUluZGljZXMuc2l6ZSgpOworICB9CisKKyAgYm9vbCBoYXNJbmRpY2VzKCkgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RXh0cmFjdFZhbHVlOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKworRXh0cmFjdFZhbHVlSW5zdDo6RXh0cmFjdFZhbHVlSW5zdChWYWx1ZSAqQWdnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gSWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpCisgIDogVW5hcnlJbnN0cnVjdGlvbihjaGVja0dFUFR5cGUoZ2V0SW5kZXhlZFR5cGUoQWdnLT5nZXRUeXBlKCksIElkeHMpKSwKKyAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RWYWx1ZSwgQWdnLCBJbnNlcnRCZWZvcmUpIHsKKyAgaW5pdChJZHhzLCBOYW1lU3RyKTsKK30KKworRXh0cmFjdFZhbHVlSW5zdDo6RXh0cmFjdFZhbHVlSW5zdChWYWx1ZSAqQWdnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gSWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorICA6IFVuYXJ5SW5zdHJ1Y3Rpb24oY2hlY2tHRVBUeXBlKGdldEluZGV4ZWRUeXBlKEFnZy0+Z2V0VHlwZSgpLCBJZHhzKSksCisgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0VmFsdWUsIEFnZywgSW5zZXJ0QXRFbmQpIHsKKyAgaW5pdChJZHhzLCBOYW1lU3RyKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRWYWx1ZUluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBUaGlzIGluc3RydWN0aW9uIGluc2VydHMgYSBzdHJ1Y3QgZmllbGQgb2YgYXJyYXkgZWxlbWVudAorLy8vIHZhbHVlIGludG8gYW4gYWdncmVnYXRlIHZhbHVlLgorLy8vCitjbGFzcyBJbnNlcnRWYWx1ZUluc3QgOiBwdWJsaWMgSW5zdHJ1Y3Rpb24geworICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4gSW5kaWNlczsKKworICBJbnNlcnRWYWx1ZUluc3QoY29uc3QgSW5zZXJ0VmFsdWVJbnN0ICZJVkkpOworCisgIC8vLyBDb25zdHJ1Y3RvcnMgLSBDcmVhdGUgYSBpbnNlcnR2YWx1ZSBpbnN0cnVjdGlvbiB3aXRoIGEgYmFzZSBhZ2dyZWdhdGUKKyAgLy8vIHZhbHVlLCBhIHZhbHVlIHRvIGluc2VydCwgYW5kIGEgbGlzdCBvZiBpbmRpY2VzLiAgVGhlIGZpcnN0IGN0b3IgY2FuCisgIC8vLyBvcHRpb25hbGx5IGluc2VydCBiZWZvcmUgYW4gZXhpc3RpbmcgaW5zdHJ1Y3Rpb24sIHRoZSBzZWNvbmQgYXBwZW5kcworICAvLy8gdGhlIG5ldyBpbnN0cnVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIEJhc2ljQmxvY2suCisgIGlubGluZSBJbnNlcnRWYWx1ZUluc3QoVmFsdWUgKkFnZywgVmFsdWUgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gSWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKyAgaW5saW5lIEluc2VydFZhbHVlSW5zdChWYWx1ZSAqQWdnLCBWYWx1ZSAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgLy8vIENvbnN0cnVjdG9ycyAtIFRoZXNlIHR3byBjb25zdHJ1Y3RvcnMgYXJlIGNvbnZlbmllbmNlIG1ldGhvZHMgYmVjYXVzZSBvbmUKKyAgLy8vIGFuZCB0d28gaW5kZXggaW5zZXJ0dmFsdWUgaW5zdHJ1Y3Rpb25zIGFyZSBzbyBjb21tb24uCisgIEluc2VydFZhbHVlSW5zdChWYWx1ZSAqQWdnLCBWYWx1ZSAqVmFsLCB1bnNpZ25lZCBJZHgsCisgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLAorICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBJbnNlcnRWYWx1ZUluc3QoVmFsdWUgKkFnZywgVmFsdWUgKlZhbCwgdW5zaWduZWQgSWR4LCBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICB2b2lkIGluaXQoVmFsdWUgKkFnZywgVmFsdWUgKlZhbCwgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMsCisgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0cik7CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIEluc2VydFZhbHVlSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgdHdvIG9wZXJhbmRzCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMik7CisgIH0KKworICBzdGF0aWMgSW5zZXJ0VmFsdWVJbnN0ICpDcmVhdGUoVmFsdWUgKkFnZywgVmFsdWUgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIG5ldyBJbnNlcnRWYWx1ZUluc3QoQWdnLCBWYWwsIElkeHMsIE5hbWVTdHIsIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgSW5zZXJ0VmFsdWVJbnN0ICpDcmVhdGUoVmFsdWUgKkFnZywgVmFsdWUgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIHJldHVybiBuZXcgSW5zZXJ0VmFsdWVJbnN0KEFnZywgVmFsLCBJZHhzLCBOYW1lU3RyLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgdXNpbmcgaWR4X2l0ZXJhdG9yID0gY29uc3QgdW5zaWduZWQqOworCisgIGlubGluZSBpZHhfaXRlcmF0b3IgaWR4X2JlZ2luKCkgY29uc3QgeyByZXR1cm4gSW5kaWNlcy5iZWdpbigpOyB9CisgIGlubGluZSBpZHhfaXRlcmF0b3IgaWR4X2VuZCgpICAgY29uc3QgeyByZXR1cm4gSW5kaWNlcy5lbmQoKTsgfQorICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8aWR4X2l0ZXJhdG9yPiBpbmRpY2VzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGlkeF9iZWdpbigpLCBpZHhfZW5kKCkpOworICB9CisKKyAgVmFsdWUgKmdldEFnZ3JlZ2F0ZU9wZXJhbmQoKSB7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoMCk7CisgIH0KKyAgY29uc3QgVmFsdWUgKmdldEFnZ3JlZ2F0ZU9wZXJhbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoMCk7CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEFnZ3JlZ2F0ZU9wZXJhbmRJbmRleCgpIHsKKyAgICByZXR1cm4gMFU7ICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbmRleCBmb3IgbW9kaWZ5aW5nIGNvcnJlY3Qgb3BlcmFuZAorICB9CisKKyAgVmFsdWUgKmdldEluc2VydGVkVmFsdWVPcGVyYW5kKCkgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDEpOworICB9CisgIGNvbnN0IFZhbHVlICpnZXRJbnNlcnRlZFZhbHVlT3BlcmFuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZCgxKTsKKyAgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0SW5zZXJ0ZWRWYWx1ZU9wZXJhbmRJbmRleCgpIHsKKyAgICByZXR1cm4gMVU7ICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbmRleCBmb3IgbW9kaWZ5aW5nIGNvcnJlY3Qgb3BlcmFuZAorICB9CisKKyAgQXJyYXlSZWY8dW5zaWduZWQ+IGdldEluZGljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEluZGljZXM7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1JbmRpY2VzKCkgY29uc3QgeworICAgIHJldHVybiAodW5zaWduZWQpSW5kaWNlcy5zaXplKCk7CisgIH0KKworICBib29sIGhhc0luZGljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpJbnNlcnRWYWx1ZTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxJbnNlcnRWYWx1ZUluc3Q+IDoKKyAgcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czxJbnNlcnRWYWx1ZUluc3QsIDI+IHsKK307CisKK0luc2VydFZhbHVlSW5zdDo6SW5zZXJ0VmFsdWVJbnN0KFZhbHVlICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpCisgIDogSW5zdHJ1Y3Rpb24oQWdnLT5nZXRUeXBlKCksIEluc2VydFZhbHVlLAorICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8SW5zZXJ0VmFsdWVJbnN0Pjo6b3BfYmVnaW4odGhpcyksCisgICAgICAgICAgICAgICAgMiwgSW5zZXJ0QmVmb3JlKSB7CisgIGluaXQoQWdnLCBWYWwsIElkeHMsIE5hbWVTdHIpOworfQorCitJbnNlcnRWYWx1ZUluc3Q6Okluc2VydFZhbHVlSW5zdChWYWx1ZSAqQWdnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkKKyAgOiBJbnN0cnVjdGlvbihBZ2ctPmdldFR5cGUoKSwgSW5zZXJ0VmFsdWUsCisgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxJbnNlcnRWYWx1ZUluc3Q+OjpvcF9iZWdpbih0aGlzKSwKKyAgICAgICAgICAgICAgICAyLCBJbnNlcnRBdEVuZCkgeworICBpbml0KEFnZywgVmFsLCBJZHhzLCBOYW1lU3RyKTsKK30KKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKEluc2VydFZhbHVlSW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSElOb2RlIENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBQSElOb2RlIC0gVGhlIFBISU5vZGUgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIG1hZ2ljYWwgbXlzdGljYWwgUEhJCisvLyBub2RlLCB0aGF0IGNhbiBub3QgZXhpc3QgaW4gbmF0dXJlLCBidXQgY2FuIGJlIHN5bnRoZXNpemVkIGluIGEgY29tcHV0ZXIKKy8vIHNjaWVudGlzdCdzIG92ZXJhY3RpdmUgaW1hZ2luYXRpb24uCisvLworY2xhc3MgUEhJTm9kZSA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7CisgIC8vLyBUaGUgbnVtYmVyIG9mIG9wZXJhbmRzIGFjdHVhbGx5IGFsbG9jYXRlZC4gIE51bU9wZXJhbmRzIGlzCisgIC8vLyB0aGUgbnVtYmVyIGFjdHVhbGx5IGluIHVzZS4KKyAgdW5zaWduZWQgUmVzZXJ2ZWRTcGFjZTsKKworICBQSElOb2RlKGNvbnN0IFBISU5vZGUgJlBOKTsKKworICBleHBsaWNpdCBQSElOb2RlKFR5cGUgKlR5LCB1bnNpZ25lZCBOdW1SZXNlcnZlZFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLAorICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKQorICAgIDogSW5zdHJ1Y3Rpb24oVHksIEluc3RydWN0aW9uOjpQSEksIG51bGxwdHIsIDAsIEluc2VydEJlZm9yZSksCisgICAgICBSZXNlcnZlZFNwYWNlKE51bVJlc2VydmVkVmFsdWVzKSB7CisgICAgc2V0TmFtZShOYW1lU3RyKTsKKyAgICBhbGxvY0h1bmdvZmZVc2VzKFJlc2VydmVkU3BhY2UpOworICB9CisKKyAgUEhJTm9kZShUeXBlICpUeSwgdW5zaWduZWQgTnVtUmVzZXJ2ZWRWYWx1ZXMsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorICAgIDogSW5zdHJ1Y3Rpb24oVHksIEluc3RydWN0aW9uOjpQSEksIG51bGxwdHIsIDAsIEluc2VydEF0RW5kKSwKKyAgICAgIFJlc2VydmVkU3BhY2UoTnVtUmVzZXJ2ZWRWYWx1ZXMpIHsKKyAgICBzZXROYW1lKE5hbWVTdHIpOworICAgIGFsbG9jSHVuZ29mZlVzZXMoUmVzZXJ2ZWRTcGFjZSk7CisgIH0KKworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgUEhJTm9kZSAqY2xvbmVJbXBsKCkgY29uc3Q7CisKKyAgLy8gYWxsb2NIdW5nb2ZmVXNlcyAtIHRoaXMgaXMgbW9yZSBjb21wbGljYXRlZCB0aGFuIHRoZSBnZW5lcmljCisgIC8vIFVzZXI6OmFsbG9jSHVuZ29mZlVzZXMsIGJlY2F1c2Ugd2UgaGF2ZSB0byBhbGxvY2F0ZSBVc2VzIGZvciB0aGUgaW5jb21pbmcKKyAgLy8gdmFsdWVzIGFuZCBwb2ludGVycyB0byB0aGUgaW5jb21pbmcgYmxvY2tzLCBhbGwgaW4gb25lIGFsbG9jYXRpb24uCisgIHZvaWQgYWxsb2NIdW5nb2ZmVXNlcyh1bnNpZ25lZCBOKSB7CisgICAgVXNlcjo6YWxsb2NIdW5nb2ZmVXNlcyhOLCAvKiBJc1BoaSAqLyB0cnVlKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3RvcnMgLSBOdW1SZXNlcnZlZFZhbHVlcyBpcyBhIGhpbnQgZm9yIHRoZSBudW1iZXIgb2YgaW5jb21pbmcKKyAgLy8vIGVkZ2VzIHRoYXQgdGhpcyBwaGkgbm9kZSB3aWxsIGhhdmUgKHVzZSAwIGlmIHlvdSByZWFsbHkgaGF2ZSBubyBpZGVhKS4KKyAgc3RhdGljIFBISU5vZGUgKkNyZWF0ZShUeXBlICpUeSwgdW5zaWduZWQgTnVtUmVzZXJ2ZWRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIHJldHVybiBuZXcgUEhJTm9kZShUeSwgTnVtUmVzZXJ2ZWRWYWx1ZXMsIE5hbWVTdHIsIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgUEhJTm9kZSAqQ3JlYXRlKFR5cGUgKlR5LCB1bnNpZ25lZCBOdW1SZXNlcnZlZFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3IFBISU5vZGUoVHksIE51bVJlc2VydmVkVmFsdWVzLCBOYW1lU3RyLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gUHJvdmlkZSBmYXN0IG9wZXJhbmQgYWNjZXNzb3JzCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIC8vIEJsb2NrIGl0ZXJhdG9yIGludGVyZmFjZS4gVGhpcyBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGxpc3Qgb2YgaW5jb21pbmcKKyAgLy8gYmFzaWMgYmxvY2tzLCB3aGljaCBwYXJhbGxlbHMgdGhlIGxpc3Qgb2YgaW5jb21pbmcgdmFsdWVzLgorCisgIHVzaW5nIGJsb2NrX2l0ZXJhdG9yID0gQmFzaWNCbG9jayAqKjsKKyAgdXNpbmcgY29uc3RfYmxvY2tfaXRlcmF0b3IgPSBCYXNpY0Jsb2NrICogY29uc3QgKjsKKworICBibG9ja19pdGVyYXRvciBibG9ja19iZWdpbigpIHsKKyAgICBVc2U6OlVzZXJSZWYgKnJlZiA9CisgICAgICByZWludGVycHJldF9jYXN0PFVzZTo6VXNlclJlZio+KG9wX2JlZ2luKCkgKyBSZXNlcnZlZFNwYWNlKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxibG9ja19pdGVyYXRvcj4ocmVmICsgMSk7CisgIH0KKworICBjb25zdF9ibG9ja19pdGVyYXRvciBibG9ja19iZWdpbigpIGNvbnN0IHsKKyAgICBjb25zdCBVc2U6OlVzZXJSZWYgKnJlZiA9CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFVzZTo6VXNlclJlZio+KG9wX2JlZ2luKCkgKyBSZXNlcnZlZFNwYWNlKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdF9ibG9ja19pdGVyYXRvcj4ocmVmICsgMSk7CisgIH0KKworICBibG9ja19pdGVyYXRvciBibG9ja19lbmQoKSB7CisgICAgcmV0dXJuIGJsb2NrX2JlZ2luKCkgKyBnZXROdW1PcGVyYW5kcygpOworICB9CisKKyAgY29uc3RfYmxvY2tfaXRlcmF0b3IgYmxvY2tfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBibG9ja19iZWdpbigpICsgZ2V0TnVtT3BlcmFuZHMoKTsKKyAgfQorCisgIGl0ZXJhdG9yX3JhbmdlPGJsb2NrX2l0ZXJhdG9yPiBibG9ja3MoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoYmxvY2tfYmVnaW4oKSwgYmxvY2tfZW5kKCkpOworICB9CisKKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfYmxvY2tfaXRlcmF0b3I+IGJsb2NrcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShibG9ja19iZWdpbigpLCBibG9ja19lbmQoKSk7CisgIH0KKworICBvcF9yYW5nZSBpbmNvbWluZ192YWx1ZXMoKSB7IHJldHVybiBvcGVyYW5kcygpOyB9CisKKyAgY29uc3Rfb3BfcmFuZ2UgaW5jb21pbmdfdmFsdWVzKCkgY29uc3QgeyByZXR1cm4gb3BlcmFuZHMoKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBpbmNvbWluZyBlZGdlcworICAvLy8KKyAgdW5zaWduZWQgZ2V0TnVtSW5jb21pbmdWYWx1ZXMoKSBjb25zdCB7IHJldHVybiBnZXROdW1PcGVyYW5kcygpOyB9CisKKyAgLy8vIFJldHVybiBpbmNvbWluZyB2YWx1ZSBudW1iZXIgeAorICAvLy8KKyAgVmFsdWUgKmdldEluY29taW5nVmFsdWUodW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYW5kKGkpOworICB9CisgIHZvaWQgc2V0SW5jb21pbmdWYWx1ZSh1bnNpZ25lZCBpLCBWYWx1ZSAqVikgeworICAgIGFzc2VydChWICYmICJQSEkgbm9kZSBnb3QgYSBudWxsIHZhbHVlISIpOworICAgIGFzc2VydChnZXRUeXBlKCkgPT0gVi0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICJBbGwgb3BlcmFuZHMgdG8gUEhJIG5vZGUgbXVzdCBiZSB0aGUgc2FtZSB0eXBlIGFzIHRoZSBQSEkgbm9kZSEiKTsKKyAgICBzZXRPcGVyYW5kKGksIFYpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldE9wZXJhbmROdW1Gb3JJbmNvbWluZ1ZhbHVlKHVuc2lnbmVkIGkpIHsKKyAgICByZXR1cm4gaTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRJbmNvbWluZ1ZhbHVlTnVtRm9yT3BlcmFuZCh1bnNpZ25lZCBpKSB7CisgICAgcmV0dXJuIGk7CisgIH0KKworICAvLy8gUmV0dXJuIGluY29taW5nIGJhc2ljIGJsb2NrIG51bWJlciBAcCBpLgorICAvLy8KKyAgQmFzaWNCbG9jayAqZ2V0SW5jb21pbmdCbG9jayh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgcmV0dXJuIGJsb2NrX2JlZ2luKClbaV07CisgIH0KKworICAvLy8gUmV0dXJuIGluY29taW5nIGJhc2ljIGJsb2NrIGNvcnJlc3BvbmRpbmcKKyAgLy8vIHRvIGFuIG9wZXJhbmQgb2YgdGhlIFBISS4KKyAgLy8vCisgIEJhc2ljQmxvY2sgKmdldEluY29taW5nQmxvY2soY29uc3QgVXNlICZVKSBjb25zdCB7CisgICAgYXNzZXJ0KHRoaXMgPT0gVS5nZXRVc2VyKCkgJiYgIkl0ZXJhdG9yIGRvZXNuJ3QgcG9pbnQgdG8gUEhJJ3MgVXNlcz8iKTsKKyAgICByZXR1cm4gZ2V0SW5jb21pbmdCbG9jayh1bnNpZ25lZCgmVSAtIG9wX2JlZ2luKCkpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gaW5jb21pbmcgYmFzaWMgYmxvY2sgY29ycmVzcG9uZGluZworICAvLy8gdG8gdmFsdWUgdXNlIGl0ZXJhdG9yLgorICAvLy8KKyAgQmFzaWNCbG9jayAqZ2V0SW5jb21pbmdCbG9jayhWYWx1ZTo6Y29uc3RfdXNlcl9pdGVyYXRvciBJKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEluY29taW5nQmxvY2soSS5nZXRVc2UoKSk7CisgIH0KKworICB2b2lkIHNldEluY29taW5nQmxvY2sodW5zaWduZWQgaSwgQmFzaWNCbG9jayAqQkIpIHsKKyAgICBhc3NlcnQoQkIgJiYgIlBISSBub2RlIGdvdCBhIG51bGwgYmFzaWMgYmxvY2shIik7CisgICAgYmxvY2tfYmVnaW4oKVtpXSA9IEJCOworICB9CisKKyAgLy8vIEFkZCBhbiBpbmNvbWluZyB2YWx1ZSB0byB0aGUgZW5kIG9mIHRoZSBQSEkgbGlzdAorICAvLy8KKyAgdm9pZCBhZGRJbmNvbWluZyhWYWx1ZSAqViwgQmFzaWNCbG9jayAqQkIpIHsKKyAgICBpZiAoZ2V0TnVtT3BlcmFuZHMoKSA9PSBSZXNlcnZlZFNwYWNlKQorICAgICAgZ3Jvd09wZXJhbmRzKCk7ICAvLyBHZXQgbW9yZSBzcGFjZSEKKyAgICAvLyBJbml0aWFsaXplIHNvbWUgbmV3IG9wZXJhbmRzLgorICAgIHNldE51bUh1bmdPZmZVc2VPcGVyYW5kcyhnZXROdW1PcGVyYW5kcygpICsgMSk7CisgICAgc2V0SW5jb21pbmdWYWx1ZShnZXROdW1PcGVyYW5kcygpIC0gMSwgVik7CisgICAgc2V0SW5jb21pbmdCbG9jayhnZXROdW1PcGVyYW5kcygpIC0gMSwgQkIpOworICB9CisKKyAgLy8vIFJlbW92ZSBhbiBpbmNvbWluZyB2YWx1ZS4gIFRoaXMgaXMgdXNlZnVsIGlmIGEKKyAgLy8vIHByZWRlY2Vzc29yIGJhc2ljIGJsb2NrIGlzIGRlbGV0ZWQuICBUaGUgdmFsdWUgcmVtb3ZlZCBpcyByZXR1cm5lZC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgbGFzdCBpbmNvbWluZyB2YWx1ZSBmb3IgYSBQSEkgbm9kZSBpcyByZW1vdmVkIChhbmQgRGVsZXRlUEhJSWZFbXB0eQorICAvLy8gaXMgdHJ1ZSksIHRoZSBQSEkgbm9kZSBpcyBkZXN0cm95ZWQgYW5kIGFueSB1c2VzIG9mIGl0IGFyZSByZXBsYWNlZCB3aXRoCisgIC8vLyBkdW1teSB2YWx1ZXMuICBUaGUgb25seSB0aW1lIHRoZXJlIHNob3VsZCBiZSB6ZXJvIGluY29taW5nIHZhbHVlcyB0byBhIFBISQorICAvLy8gbm9kZSBpcyB3aGVuIHRoZSBibG9jayBpcyBkZWFkLCBzbyB0aGlzIHN0cmF0ZWd5IGlzIHNvdW5kLgorICAvLy8KKyAgVmFsdWUgKnJlbW92ZUluY29taW5nVmFsdWUodW5zaWduZWQgSWR4LCBib29sIERlbGV0ZVBISUlmRW1wdHkgPSB0cnVlKTsKKworICBWYWx1ZSAqcmVtb3ZlSW5jb21pbmdWYWx1ZShjb25zdCBCYXNpY0Jsb2NrICpCQiwgYm9vbCBEZWxldGVQSElJZkVtcHR5PXRydWUpIHsKKyAgICBpbnQgSWR4ID0gZ2V0QmFzaWNCbG9ja0luZGV4KEJCKTsKKyAgICBhc3NlcnQoSWR4ID49IDAgJiYgIkludmFsaWQgYmFzaWMgYmxvY2sgYXJndW1lbnQgdG8gcmVtb3ZlISIpOworICAgIHJldHVybiByZW1vdmVJbmNvbWluZ1ZhbHVlKElkeCwgRGVsZXRlUEhJSWZFbXB0eSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBmaXJzdCBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGJhc2ljCisgIC8vLyBibG9jayBpbiB0aGUgdmFsdWUgbGlzdCBmb3IgdGhpcyBQSEkuICBSZXR1cm5zIC0xIGlmIG5vIGluc3RhbmNlLgorICAvLy8KKyAgaW50IGdldEJhc2ljQmxvY2tJbmRleChjb25zdCBCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChibG9ja19iZWdpbigpW2ldID09IEJCKQorICAgICAgICByZXR1cm4gaTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBWYWx1ZSAqZ2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgaW50IElkeCA9IGdldEJhc2ljQmxvY2tJbmRleChCQik7CisgICAgYXNzZXJ0KElkeCA+PSAwICYmICJJbnZhbGlkIGJhc2ljIGJsb2NrIGFyZ3VtZW50ISIpOworICAgIHJldHVybiBnZXRJbmNvbWluZ1ZhbHVlKElkeCk7CisgIH0KKworICAvLy8gSWYgdGhlIHNwZWNpZmllZCBQSEkgbm9kZSBhbHdheXMgbWVyZ2VzIHRvZ2V0aGVyIHRoZQorICAvLy8gc2FtZSB2YWx1ZSwgcmV0dXJuIHRoZSB2YWx1ZSwgb3RoZXJ3aXNlIHJldHVybiBudWxsLgorICBWYWx1ZSAqaGFzQ29uc3RhbnRWYWx1ZSgpIGNvbnN0OworCisgIC8vLyBXaGV0aGVyIHRoZSBzcGVjaWZpZWQgUEhJIG5vZGUgYWx3YXlzIG1lcmdlcworICAvLy8gdG9nZXRoZXIgdGhlIHNhbWUgdmFsdWUsIGFzc3VtaW5nIHVuZGVmcyBhcmUgZXF1YWwgdG8gYSB1bmlxdWUKKyAgLy8vIG5vbi11bmRlZiB2YWx1ZS4KKyAgYm9vbCBoYXNDb25zdGFudE9yVW5kZWZWYWx1ZSgpIGNvbnN0OworCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpQSEk7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgZ3Jvd09wZXJhbmRzKCk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8UEhJTm9kZT4gOiBwdWJsaWMgSHVuZ29mZk9wZXJhbmRUcmFpdHM8Mj4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFBISU5vZGUsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBMYW5kaW5nUGFkSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLyBUaGUgbGFuZGluZ3BhZCBpbnN0cnVjdGlvbiBob2xkcyBhbGwgb2YgdGhlIGluZm9ybWF0aW9uCisvLy8gbmVjZXNzYXJ5IHRvIGdlbmVyYXRlIGNvcnJlY3QgZXhjZXB0aW9uIGhhbmRsaW5nLiBUaGUgbGFuZGluZ3BhZCBpbnN0cnVjdGlvbgorLy8vIGNhbm5vdCBiZSBtb3ZlZCBmcm9tIHRoZSB0b3Agb2YgYSBsYW5kaW5nIHBhZCBibG9jaywgd2hpY2ggaXRzZWxmIGlzCisvLy8gYWNjZXNzaWJsZSBvbmx5IGZyb20gdGhlICd1bndpbmQnIGVkZ2Ugb2YgYW4gaW52b2tlLiBUaGlzIHVzZXMgdGhlCisvLy8gU3ViY2xhc3NEYXRhIGZpZWxkIGluIFZhbHVlIHRvIHN0b3JlIHdoZXRoZXIgb3Igbm90IHRoZSBsYW5kaW5ncGFkIGlzIGEKKy8vLyBjbGVhbnVwLgorLy8vCitjbGFzcyBMYW5kaW5nUGFkSW5zdCA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7CisgIC8vLyBUaGUgbnVtYmVyIG9mIG9wZXJhbmRzIGFjdHVhbGx5IGFsbG9jYXRlZC4gIE51bU9wZXJhbmRzIGlzCisgIC8vLyB0aGUgbnVtYmVyIGFjdHVhbGx5IGluIHVzZS4KKyAgdW5zaWduZWQgUmVzZXJ2ZWRTcGFjZTsKKworICBMYW5kaW5nUGFkSW5zdChjb25zdCBMYW5kaW5nUGFkSW5zdCAmTFApOworCitwdWJsaWM6CisgIGVudW0gQ2xhdXNlVHlwZSB7IENhdGNoLCBGaWx0ZXIgfTsKKworcHJpdmF0ZToKKyAgZXhwbGljaXQgTGFuZGluZ1BhZEluc3QoVHlwZSAqUmV0VHksIHVuc2lnbmVkIE51bVJlc2VydmVkVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisgIGV4cGxpY2l0IExhbmRpbmdQYWRJbnN0KFR5cGUgKlJldFR5LCB1bnNpZ25lZCBOdW1SZXNlcnZlZFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICAvLyBBbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB6ZXJvIG9wZXJhbmRzLgorICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMpOworICB9CisKKyAgdm9pZCBncm93T3BlcmFuZHModW5zaWduZWQgU2l6ZSk7CisgIHZvaWQgaW5pdCh1bnNpZ25lZCBOdW1SZXNlcnZlZFZhbHVlcywgY29uc3QgVHdpbmUgJk5hbWVTdHIpOworCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBMYW5kaW5nUGFkSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9ycyAtIE51bVJlc2VydmVkQ2xhdXNlcyBpcyBhIGhpbnQgZm9yIHRoZSBudW1iZXIgb2YgaW5jb21pbmcKKyAgLy8vIGNsYXVzZXMgdGhhdCB0aGlzIGxhbmRpbmdwYWQgd2lsbCBoYXZlICh1c2UgMCBpZiB5b3UgcmVhbGx5IGhhdmUgbm8gaWRlYSkuCisgIHN0YXRpYyBMYW5kaW5nUGFkSW5zdCAqQ3JlYXRlKFR5cGUgKlJldFR5LCB1bnNpZ25lZCBOdW1SZXNlcnZlZENsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKyAgc3RhdGljIExhbmRpbmdQYWRJbnN0ICpDcmVhdGUoVHlwZSAqUmV0VHksIHVuc2lnbmVkIE51bVJlc2VydmVkQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICAvLy8gUHJvdmlkZSBmYXN0IG9wZXJhbmQgYWNjZXNzb3JzCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIC8vLyBSZXR1cm4gJ3RydWUnIGlmIHRoaXMgbGFuZGluZ3BhZCBpbnN0cnVjdGlvbiBpcyBhCisgIC8vLyBjbGVhbnVwLiBJLmUuLCBpdCBzaG91bGQgYmUgcnVuIHdoZW4gdW53aW5kaW5nIGV2ZW4gaWYgaXRzIGxhbmRpbmcgcGFkCisgIC8vLyBkb2Vzbid0IGNhdGNoIHRoZSBleGNlcHRpb24uCisgIGJvb2wgaXNDbGVhbnVwKCkgY29uc3QgeyByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiAxOyB9CisKKyAgLy8vIEluZGljYXRlIHRoYXQgdGhpcyBsYW5kaW5ncGFkIGluc3RydWN0aW9uIGlzIGEgY2xlYW51cC4KKyAgdm9pZCBzZXRDbGVhbnVwKGJvb2wgVikgeworICAgIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIH4xKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFYgPyAxIDogMCkpOworICB9CisKKyAgLy8vIEFkZCBhIGNhdGNoIG9yIGZpbHRlciBjbGF1c2UgdG8gdGhlIGxhbmRpbmcgcGFkLgorICB2b2lkIGFkZENsYXVzZShDb25zdGFudCAqQ2xhdXNlVmFsKTsKKworICAvLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgY2xhdXNlIGF0IGluZGV4IElkeC4gVXNlIGlzQ2F0Y2gvaXNGaWx0ZXIgdG8KKyAgLy8vIGRldGVybWluZSB3aGF0IHR5cGUgb2YgY2xhdXNlIHRoaXMgaXMuCisgIENvbnN0YW50ICpnZXRDbGF1c2UodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnQ+KGdldE9wZXJhbmRMaXN0KClbSWR4XSk7CisgIH0KKworICAvLy8gUmV0dXJuICd0cnVlJyBpZiB0aGUgY2xhdXNlIGFuZCBpbmRleCBJZHggaXMgYSBjYXRjaCBjbGF1c2UuCisgIGJvb2wgaXNDYXRjaCh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gIWlzYTxBcnJheVR5cGU+KGdldE9wZXJhbmRMaXN0KClbSWR4XS0+Z2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gJ3RydWUnIGlmIHRoZSBjbGF1c2UgYW5kIGluZGV4IElkeCBpcyBhIGZpbHRlciBjbGF1c2UuCisgIGJvb2wgaXNGaWx0ZXIodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIGlzYTxBcnJheVR5cGU+KGdldE9wZXJhbmRMaXN0KClbSWR4XS0+Z2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIG51bWJlciBvZiBjbGF1c2VzIGZvciB0aGlzIGxhbmRpbmcgcGFkLgorICB1bnNpZ25lZCBnZXROdW1DbGF1c2VzKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKTsgfQorCisgIC8vLyBHcm93IHRoZSBzaXplIG9mIHRoZSBvcGVyYW5kIGxpc3QgdG8gYWNjb21tb2RhdGUgdGhlIG5ldworICAvLy8gbnVtYmVyIG9mIGNsYXVzZXMuCisgIHZvaWQgcmVzZXJ2ZUNsYXVzZXModW5zaWduZWQgU2l6ZSkgeyBncm93T3BlcmFuZHMoU2l6ZSk7IH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpMYW5kaW5nUGFkOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPExhbmRpbmdQYWRJbnN0PiA6IHB1YmxpYyBIdW5nb2ZmT3BlcmFuZFRyYWl0czwxPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoTGFuZGluZ1BhZEluc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLyBSZXR1cm4gYSB2YWx1ZSAocG9zc2libHkgdm9pZCksIGZyb20gYSBmdW5jdGlvbi4gIEV4ZWN1dGlvbgorLy8vIGRvZXMgbm90IGNvbnRpbnVlIGluIHRoaXMgZnVuY3Rpb24gYW55IGxvbmdlci4KKy8vLworY2xhc3MgUmV0dXJuSW5zdCA6IHB1YmxpYyBUZXJtaW5hdG9ySW5zdCB7CisgIFJldHVybkluc3QoY29uc3QgUmV0dXJuSW5zdCAmUkkpOworCitwcml2YXRlOgorICAvLyBSZXR1cm5JbnN0IGNvbnN0cnVjdG9yczoKKyAgLy8gUmV0dXJuSW5zdCgpICAgICAgICAgICAgICAgICAgLSAncmV0IHZvaWQnIGluc3RydWN0aW9uCisgIC8vIFJldHVybkluc3QoICAgIG51bGwpICAgICAgICAgIC0gJ3JldCB2b2lkJyBpbnN0cnVjdGlvbgorICAvLyBSZXR1cm5JbnN0KFZhbHVlKiBYKSAgICAgICAgICAtICdyZXQgWCcgICAgaW5zdHJ1Y3Rpb24KKyAgLy8gUmV0dXJuSW5zdCggICAgbnVsbCwgSW5zdCAqSSkgLSAncmV0IHZvaWQnIGluc3RydWN0aW9uLCBpbnNlcnQgYmVmb3JlIEkKKyAgLy8gUmV0dXJuSW5zdChWYWx1ZSogWCwgSW5zdCAqSSkgLSAncmV0IFgnICAgIGluc3RydWN0aW9uLCBpbnNlcnQgYmVmb3JlIEkKKyAgLy8gUmV0dXJuSW5zdCggICAgbnVsbCwgQkIgKkIpICAgLSAncmV0IHZvaWQnIGluc3RydWN0aW9uLCBpbnNlcnQgQCBlbmQgb2YgQgorICAvLyBSZXR1cm5JbnN0KFZhbHVlKiBYLCBCQiAqQikgICAtICdyZXQgWCcgICAgaW5zdHJ1Y3Rpb24sIGluc2VydCBAIGVuZCBvZiBCCisgIC8vCisgIC8vIE5PVEU6IElmIHRoZSBWYWx1ZSogcGFzc2VkIGlzIG9mIHR5cGUgdm9pZCB0aGVuIHRoZSBjb25zdHJ1Y3RvciBiZWhhdmVzIGFzCisgIC8vIGlmIGl0IHdhcyBwYXNzZWQgTlVMTC4KKyAgZXhwbGljaXQgUmV0dXJuSW5zdChMTFZNQ29udGV4dCAmQywgVmFsdWUgKnJldFZhbCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBSZXR1cm5JbnN0KExMVk1Db250ZXh0ICZDLCBWYWx1ZSAqcmV0VmFsLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisgIGV4cGxpY2l0IFJldHVybkluc3QoTExWTUNvbnRleHQgJkMsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgUmV0dXJuSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgc3RhdGljIFJldHVybkluc3QqIENyZWF0ZShMTFZNQ29udGV4dCAmQywgVmFsdWUgKnJldFZhbCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbmV3KCEhcmV0VmFsKSBSZXR1cm5JbnN0KEMsIHJldFZhbCwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBSZXR1cm5JbnN0KiBDcmVhdGUoTExWTUNvbnRleHQgJkMsIFZhbHVlICpyZXRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3KCEhcmV0VmFsKSBSZXR1cm5JbnN0KEMsIHJldFZhbCwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgc3RhdGljIFJldHVybkluc3QqIENyZWF0ZShMTFZNQ29udGV4dCAmQywgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3KDApIFJldHVybkluc3QoQywgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgLy8vIFByb3ZpZGUgZmFzdCBvcGVyYW5kIGFjY2Vzc29ycworICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLy8gQ29udmVuaWVuY2UgYWNjZXNzb3IuIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyByZXR1cm4gdmFsdWUuCisgIFZhbHVlICpnZXRSZXR1cm5WYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSAhPSAwID8gZ2V0T3BlcmFuZCgwKSA6IG51bGxwdHI7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1TdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gMDsgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gKEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpSZXQpOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgVGVybWluYXRvckluc3Q7CisKKyAgQmFzaWNCbG9jayAqZ2V0U3VjY2Vzc29yKHVuc2lnbmVkIGlkeCkgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlJldHVybkluc3QgaGFzIG5vIHN1Y2Nlc3NvcnMhIik7CisgIH0KKworICB2b2lkIHNldFN1Y2Nlc3Nvcih1bnNpZ25lZCBpZHgsIEJhc2ljQmxvY2sgKkIpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJSZXR1cm5JbnN0IGhhcyBubyBzdWNjZXNzb3JzISIpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8UmV0dXJuSW5zdD4gOiBwdWJsaWMgVmFyaWFkaWNPcGVyYW5kVHJhaXRzPFJldHVybkluc3Q+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhSZXR1cm5JbnN0LCBWYWx1ZSkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyYW5jaEluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gQ29uZGl0aW9uYWwgb3IgVW5jb25kaXRpb25hbCBCcmFuY2ggaW5zdHJ1Y3Rpb24uCisvLy8KK2NsYXNzIEJyYW5jaEluc3QgOiBwdWJsaWMgVGVybWluYXRvckluc3QgeworICAvLy8gT3BzIGxpc3QgLSBCcmFuY2hlcyBhcmUgc3RyYW5nZS4gIFRoZSBvcGVyYW5kcyBhcmUgb3JkZXJlZDoKKyAgLy8vICBbQ29uZCwgRmFsc2VEZXN0LF0gVHJ1ZURlc3QuICBUaGlzIG1ha2VzIHNvbWUgYWNjZXNzb3JzIGZhc3RlciBiZWNhdXNlCisgIC8vLyB0aGV5IGRvbid0IGhhdmUgdG8gY2hlY2sgZm9yIGNvbmQvdW5jb25kIGJyYW5jaG5lc3MuIFRoZXNlIGFyZSBtb3N0bHkKKyAgLy8vIGFjY2Vzc2VkIHJlbGF0aXZlIGZyb20gb3BfZW5kKCkuCisgIEJyYW5jaEluc3QoY29uc3QgQnJhbmNoSW5zdCAmQkkpOworICAvLyBCcmFuY2hJbnN0IGNvbnN0cnVjdG9ycyAod2hlcmUge0IsIFQsIEZ9IGFyZSBibG9ja3MsIGFuZCBDIGlzIGEgY29uZGl0aW9uKToKKyAgLy8gQnJhbmNoSW5zdChCQiAqQikgICAgICAgICAgICAgICAgICAgICAgICAgICAtICdiciBCJworICAvLyBCcmFuY2hJbnN0KEJCKiBULCBCQiAqRiwgVmFsdWUgKkMpICAgICAgICAgIC0gJ2JyIEMsIFQsIEYnCisgIC8vIEJyYW5jaEluc3QoQkIqIEIsIEluc3QgKkkpICAgICAgICAgICAgICAgICAgLSAnYnIgQicgICAgICAgIGluc2VydCBiZWZvcmUgSQorICAvLyBCcmFuY2hJbnN0KEJCKiBULCBCQiAqRiwgVmFsdWUgKkMsIEluc3QgKkkpIC0gJ2JyIEMsIFQsIEYnLCBpbnNlcnQgYmVmb3JlIEkKKyAgLy8gQnJhbmNoSW5zdChCQiogQiwgQkIgKkkpICAgICAgICAgICAgICAgICAgICAtICdiciBCJyAgICAgICAgaW5zZXJ0IGF0IGVuZAorICAvLyBCcmFuY2hJbnN0KEJCKiBULCBCQiAqRiwgVmFsdWUgKkMsIEJCICpJKSAgIC0gJ2JyIEMsIFQsIEYnLCBpbnNlcnQgYXQgZW5kCisgIGV4cGxpY2l0IEJyYW5jaEluc3QoQmFzaWNCbG9jayAqSWZUcnVlLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIEJyYW5jaEluc3QoQmFzaWNCbG9jayAqSWZUcnVlLCBCYXNpY0Jsb2NrICpJZkZhbHNlLCBWYWx1ZSAqQ29uZCwKKyAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIEJyYW5jaEluc3QoQmFzaWNCbG9jayAqSWZUcnVlLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisgIEJyYW5jaEluc3QoQmFzaWNCbG9jayAqSWZUcnVlLCBCYXNpY0Jsb2NrICpJZkZhbHNlLCBWYWx1ZSAqQ29uZCwKKyAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgdm9pZCBBc3NlcnRPSygpOworCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBCcmFuY2hJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICBzdGF0aWMgQnJhbmNoSW5zdCAqQ3JlYXRlKEJhc2ljQmxvY2sgKklmVHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIHJldHVybiBuZXcoMSkgQnJhbmNoSW5zdChJZlRydWUsIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgQnJhbmNoSW5zdCAqQ3JlYXRlKEJhc2ljQmxvY2sgKklmVHJ1ZSwgQmFzaWNCbG9jayAqSWZGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQ29uZCwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbmV3KDMpIEJyYW5jaEluc3QoSWZUcnVlLCBJZkZhbHNlLCBDb25kLCBJbnNlcnRCZWZvcmUpOworICB9CisKKyAgc3RhdGljIEJyYW5jaEluc3QgKkNyZWF0ZShCYXNpY0Jsb2NrICpJZlRydWUsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgcmV0dXJuIG5ldygxKSBCcmFuY2hJbnN0KElmVHJ1ZSwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgc3RhdGljIEJyYW5jaEluc3QgKkNyZWF0ZShCYXNpY0Jsb2NrICpJZlRydWUsIEJhc2ljQmxvY2sgKklmRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKkNvbmQsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgcmV0dXJuIG5ldygzKSBCcmFuY2hJbnN0KElmVHJ1ZSwgSWZGYWxzZSwgQ29uZCwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgLy8vIFRyYW5zcGFyZW50bHkgcHJvdmlkZSBtb3JlIGVmZmljaWVudCBnZXRPcGVyYW5kIG1ldGhvZHMuCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIGJvb2wgaXNVbmNvbmRpdGlvbmFsKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSA9PSAxOyB9CisgIGJvb2wgaXNDb25kaXRpb25hbCgpICAgY29uc3QgeyByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSA9PSAzOyB9CisKKyAgVmFsdWUgKmdldENvbmRpdGlvbigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNDb25kaXRpb25hbCgpICYmICJDYW5ub3QgZ2V0IGNvbmRpdGlvbiBvZiBhbiB1bmNvbmQgYnJhbmNoISIpOworICAgIHJldHVybiBPcDwtMz4oKTsKKyAgfQorCisgIHZvaWQgc2V0Q29uZGl0aW9uKFZhbHVlICpWKSB7CisgICAgYXNzZXJ0KGlzQ29uZGl0aW9uYWwoKSAmJiAiQ2Fubm90IHNldCBjb25kaXRpb24gb2YgdW5jb25kaXRpb25hbCBicmFuY2ghIik7CisgICAgT3A8LTM+KCkgPSBWOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtU3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIDEraXNDb25kaXRpb25hbCgpOyB9CisKKyAgQmFzaWNCbG9jayAqZ2V0U3VjY2Vzc29yKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IGdldE51bVN1Y2Nlc3NvcnMoKSAmJiAiU3VjY2Vzc29yICMgb3V0IG9mIHJhbmdlIGZvciBCcmFuY2ghIik7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxCYXNpY0Jsb2NrPigoJk9wPC0xPigpIC0gaSktPmdldCgpKTsKKyAgfQorCisgIHZvaWQgc2V0U3VjY2Vzc29yKHVuc2lnbmVkIGlkeCwgQmFzaWNCbG9jayAqTmV3U3VjYykgeworICAgIGFzc2VydChpZHggPCBnZXROdW1TdWNjZXNzb3JzKCkgJiYgIlN1Y2Nlc3NvciAjIG91dCBvZiByYW5nZSBmb3IgQnJhbmNoISIpOworICAgICooJk9wPC0xPigpIC0gaWR4KSA9IE5ld1N1Y2M7CisgIH0KKworICAvLy8gU3dhcCB0aGUgc3VjY2Vzc29ycyBvZiB0aGlzIGJyYW5jaCBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBTd2FwcyB0aGUgc3VjY2Vzc29ycyBvZiB0aGUgYnJhbmNoIGluc3RydWN0aW9uLiBUaGlzIGFsc28gc3dhcHMgYW55CisgIC8vLyBicmFuY2ggd2VpZ2h0IG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdHJ1Y3Rpb24gc28gdGhhdCBpdAorICAvLy8gY29udGludWVzIHRvIG1hcCBjb3JyZWN0bHkgdG8gZWFjaCBvcGVyYW5kLgorICB2b2lkIHN3YXBTdWNjZXNzb3JzKCk7CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiAoSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkJyKTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxCcmFuY2hJbnN0PiA6IHB1YmxpYyBWYXJpYWRpY09wZXJhbmRUcmFpdHM8QnJhbmNoSW5zdCwgMT4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKEJyYW5jaEluc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLyBNdWx0aXdheSBzd2l0Y2gKKy8vLworY2xhc3MgU3dpdGNoSW5zdCA6IHB1YmxpYyBUZXJtaW5hdG9ySW5zdCB7CisgIHVuc2lnbmVkIFJlc2VydmVkU3BhY2U7CisKKyAgLy8gT3BlcmFuZFswXSAgICA9IFZhbHVlIHRvIHN3aXRjaCBvbgorICAvLyBPcGVyYW5kWzFdICAgID0gRGVmYXVsdCBiYXNpYyBibG9jayBkZXN0aW5hdGlvbgorICAvLyBPcGVyYW5kWzJuICBdID0gVmFsdWUgdG8gbWF0Y2gKKyAgLy8gT3BlcmFuZFsybisxXSA9IEJhc2ljQmxvY2sgdG8gZ28gdG8gb24gbWF0Y2gKKyAgU3dpdGNoSW5zdChjb25zdCBTd2l0Y2hJbnN0ICZTSSk7CisKKyAgLy8vIENyZWF0ZSBhIG5ldyBzd2l0Y2ggaW5zdHJ1Y3Rpb24sIHNwZWNpZnlpbmcgYSB2YWx1ZSB0byBzd2l0Y2ggb24gYW5kIGEKKyAgLy8vIGRlZmF1bHQgZGVzdGluYXRpb24uIFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBjYXNlcyBjYW4gYmUgc3BlY2lmaWVkIGhlcmUKKyAgLy8vIHRvIG1ha2UgbWVtb3J5IGFsbG9jYXRpb24gbW9yZSBlZmZpY2llbnQuIFRoaXMgY29uc3RydWN0b3IgY2FuIGFsc28KKyAgLy8vIGF1dG8taW5zZXJ0IGJlZm9yZSBhbm90aGVyIGluc3RydWN0aW9uLgorICBTd2l0Y2hJbnN0KFZhbHVlICpWYWx1ZSwgQmFzaWNCbG9jayAqRGVmYXVsdCwgdW5zaWduZWQgTnVtQ2FzZXMsCisgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisKKyAgLy8vIENyZWF0ZSBhIG5ldyBzd2l0Y2ggaW5zdHJ1Y3Rpb24sIHNwZWNpZnlpbmcgYSB2YWx1ZSB0byBzd2l0Y2ggb24gYW5kIGEKKyAgLy8vIGRlZmF1bHQgZGVzdGluYXRpb24uIFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBjYXNlcyBjYW4gYmUgc3BlY2lmaWVkIGhlcmUKKyAgLy8vIHRvIG1ha2UgbWVtb3J5IGFsbG9jYXRpb24gbW9yZSBlZmZpY2llbnQuIFRoaXMgY29uc3RydWN0b3IgYWxzbworICAvLy8gYXV0by1pbnNlcnRzIGF0IHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBCYXNpY0Jsb2NrLgorICBTd2l0Y2hJbnN0KFZhbHVlICpWYWx1ZSwgQmFzaWNCbG9jayAqRGVmYXVsdCwgdW5zaWduZWQgTnVtQ2FzZXMsCisgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IHplcm8gb3BlcmFuZHMKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7CisgICAgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzKTsKKyAgfQorCisgIHZvaWQgaW5pdChWYWx1ZSAqVmFsdWUsIEJhc2ljQmxvY2sgKkRlZmF1bHQsIHVuc2lnbmVkIE51bVJlc2VydmVkKTsKKyAgdm9pZCBncm93T3BlcmFuZHMoKTsKKworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgU3dpdGNoSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8gLTIKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIERlZmF1bHRQc2V1ZG9JbmRleCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih+MEwtMSk7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENhc2VIYW5kbGVUPiBjbGFzcyBDYXNlSXRlcmF0b3JJbXBsOworCisgIC8vLyBBIGhhbmRsZSB0byBhIHBhcnRpY3VsYXIgc3dpdGNoIGNhc2UuIEl0IGV4cG9zZXMgYSBjb252ZW5pZW50IGludGVyZmFjZQorICAvLy8gdG8gYm90aCB0aGUgY2FzZSB2YWx1ZSBhbmQgdGhlIHN1Y2Nlc3NvciBibG9jay4KKyAgLy8vCisgIC8vLyBXZSBkZWZpbmUgdGhpcyBhcyBhIHRlbXBsYXRlIGFuZCBpbnN0YW50aWF0ZSBpdCB0byBmb3JtIGJvdGggYSBjb25zdCBhbmQKKyAgLy8vIG5vbi1jb25zdCBoYW5kbGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTd2l0Y2hJbnN0VCwgdHlwZW5hbWUgQ29uc3RhbnRJbnRULCB0eXBlbmFtZSBCYXNpY0Jsb2NrVD4KKyAgY2xhc3MgQ2FzZUhhbmRsZUltcGwgeworICAgIC8vIERpcmVjdGx5IGJlZnJpZW5kIGJvdGggY29uc3QgYW5kIG5vbi1jb25zdCBpdGVyYXRvcnMuCisgICAgZnJpZW5kIGNsYXNzIFN3aXRjaEluc3Q6OkNhc2VJdGVyYXRvckltcGw8CisgICAgICAgIENhc2VIYW5kbGVJbXBsPFN3aXRjaEluc3RULCBDb25zdGFudEludFQsIEJhc2ljQmxvY2tUPj47CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIEV4cG9zZSB0aGUgc3dpdGNoIHR5cGUgd2UncmUgcGFyYW1ldGVyaXplZCB3aXRoIHRvIHRoZSBpdGVyYXRvci4KKyAgICB1c2luZyBTd2l0Y2hJbnN0VHlwZSA9IFN3aXRjaEluc3RUOworCisgICAgU3dpdGNoSW5zdFQgKlNJOworICAgIHB0cmRpZmZfdCBJbmRleDsKKworICAgIENhc2VIYW5kbGVJbXBsKCkgPSBkZWZhdWx0OworICAgIENhc2VIYW5kbGVJbXBsKFN3aXRjaEluc3RUICpTSSwgcHRyZGlmZl90IEluZGV4KSA6IFNJKFNJKSwgSW5kZXgoSW5kZXgpIHt9CisKKyAgcHVibGljOgorICAgIC8vLyBSZXNvbHZlcyBjYXNlIHZhbHVlIGZvciBjdXJyZW50IGNhc2UuCisgICAgQ29uc3RhbnRJbnRUICpnZXRDYXNlVmFsdWUoKSBjb25zdCB7CisgICAgICBhc3NlcnQoKHVuc2lnbmVkKUluZGV4IDwgU0ktPmdldE51bUNhc2VzKCkgJiYKKyAgICAgICAgICAgICAiSW5kZXggb3V0IHRoZSBudW1iZXIgb2YgY2FzZXMuIik7CisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDb25zdGFudEludFQgKj4oU0ktPmdldE9wZXJhbmQoMiArIEluZGV4ICogMikpOworICAgIH0KKworICAgIC8vLyBSZXNvbHZlcyBzdWNjZXNzb3IgZm9yIGN1cnJlbnQgY2FzZS4KKyAgICBCYXNpY0Jsb2NrVCAqZ2V0Q2FzZVN1Y2Nlc3NvcigpIGNvbnN0IHsKKyAgICAgIGFzc2VydCgoKHVuc2lnbmVkKUluZGV4IDwgU0ktPmdldE51bUNhc2VzKCkgfHwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkKUluZGV4ID09IERlZmF1bHRQc2V1ZG9JbmRleCkgJiYKKyAgICAgICAgICAgICAiSW5kZXggb3V0IHRoZSBudW1iZXIgb2YgY2FzZXMuIik7CisgICAgICByZXR1cm4gU0ktPmdldFN1Y2Nlc3NvcihnZXRTdWNjZXNzb3JJbmRleCgpKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyBudW1iZXIgb2YgY3VycmVudCBjYXNlLgorICAgIHVuc2lnbmVkIGdldENhc2VJbmRleCgpIGNvbnN0IHsgcmV0dXJuIEluZGV4OyB9CisKKyAgICAvLy8gUmV0dXJucyBUZXJtaW5hdG9ySW5zdCdzIHN1Y2Nlc3NvciBpbmRleCBmb3IgY3VycmVudCBjYXNlIHN1Y2Nlc3Nvci4KKyAgICB1bnNpZ25lZCBnZXRTdWNjZXNzb3JJbmRleCgpIGNvbnN0IHsKKyAgICAgIGFzc2VydCgoKHVuc2lnbmVkKUluZGV4ID09IERlZmF1bHRQc2V1ZG9JbmRleCB8fAorICAgICAgICAgICAgICAodW5zaWduZWQpSW5kZXggPCBTSS0+Z2V0TnVtQ2FzZXMoKSkgJiYKKyAgICAgICAgICAgICAiSW5kZXggb3V0IHRoZSBudW1iZXIgb2YgY2FzZXMuIik7CisgICAgICByZXR1cm4gKHVuc2lnbmVkKUluZGV4ICE9IERlZmF1bHRQc2V1ZG9JbmRleCA/IEluZGV4ICsgMSA6IDA7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENhc2VIYW5kbGVJbXBsICZSSFMpIGNvbnN0IHsKKyAgICAgIGFzc2VydChTSSA9PSBSSFMuU0kgJiYgIkluY29tcGF0aWJsZSBvcGVyYXRvcnMuIik7CisgICAgICByZXR1cm4gSW5kZXggPT0gUkhTLkluZGV4OworICAgIH0KKyAgfTsKKworICB1c2luZyBDb25zdENhc2VIYW5kbGUgPQorICAgICAgQ2FzZUhhbmRsZUltcGw8Y29uc3QgU3dpdGNoSW5zdCwgY29uc3QgQ29uc3RhbnRJbnQsIGNvbnN0IEJhc2ljQmxvY2s+OworCisgIGNsYXNzIENhc2VIYW5kbGUKKyAgICAgIDogcHVibGljIENhc2VIYW5kbGVJbXBsPFN3aXRjaEluc3QsIENvbnN0YW50SW50LCBCYXNpY0Jsb2NrPiB7CisgICAgZnJpZW5kIGNsYXNzIFN3aXRjaEluc3Q6OkNhc2VJdGVyYXRvckltcGw8Q2FzZUhhbmRsZT47CisKKyAgcHVibGljOgorICAgIENhc2VIYW5kbGUoU3dpdGNoSW5zdCAqU0ksIHB0cmRpZmZfdCBJbmRleCkgOiBDYXNlSGFuZGxlSW1wbChTSSwgSW5kZXgpIHt9CisKKyAgICAvLy8gU2V0cyB0aGUgbmV3IHZhbHVlIGZvciBjdXJyZW50IGNhc2UuCisgICAgdm9pZCBzZXRWYWx1ZShDb25zdGFudEludCAqVikgeworICAgICAgYXNzZXJ0KCh1bnNpZ25lZClJbmRleCA8IFNJLT5nZXROdW1DYXNlcygpICYmCisgICAgICAgICAgICAgIkluZGV4IG91dCB0aGUgbnVtYmVyIG9mIGNhc2VzLiIpOworICAgICAgU0ktPnNldE9wZXJhbmQoMiArIEluZGV4KjIsIHJlaW50ZXJwcmV0X2Nhc3Q8VmFsdWUqPihWKSk7CisgICAgfQorCisgICAgLy8vIFNldHMgdGhlIG5ldyBzdWNjZXNzb3IgZm9yIGN1cnJlbnQgY2FzZS4KKyAgICB2b2lkIHNldFN1Y2Nlc3NvcihCYXNpY0Jsb2NrICpTKSB7CisgICAgICBTSS0+c2V0U3VjY2Vzc29yKGdldFN1Y2Nlc3NvckluZGV4KCksIFMpOworICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FzZUhhbmRsZVQ+CisgIGNsYXNzIENhc2VJdGVyYXRvckltcGwKKyAgICAgIDogcHVibGljIGl0ZXJhdG9yX2ZhY2FkZV9iYXNlPENhc2VJdGVyYXRvckltcGw8Q2FzZUhhbmRsZVQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc2VIYW5kbGVUPiB7CisgICAgdXNpbmcgU3dpdGNoSW5zdFQgPSB0eXBlbmFtZSBDYXNlSGFuZGxlVDo6U3dpdGNoSW5zdFR5cGU7CisKKyAgICBDYXNlSGFuZGxlVCBDYXNlOworCisgIHB1YmxpYzoKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RlZCBpdGVyYXRvciBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlIHVudGlsIGFzc2lnbmVkIHRvCisgICAgLy8vIGEgY2FzZSBmb3IgYSBwYXJ0aWN1bGFyIHN3aXRjaC4KKyAgICBDYXNlSXRlcmF0b3JJbXBsKCkgPSBkZWZhdWx0OworCisgICAgLy8vIEluaXRpYWxpemVzIGNhc2UgaXRlcmF0b3IgZm9yIGdpdmVuIFN3aXRjaEluc3QgYW5kIGZvciBnaXZlbgorICAgIC8vLyBjYXNlIG51bWJlci4KKyAgICBDYXNlSXRlcmF0b3JJbXBsKFN3aXRjaEluc3RUICpTSSwgdW5zaWduZWQgQ2FzZU51bSkgOiBDYXNlKFNJLCBDYXNlTnVtKSB7fQorCisgICAgLy8vIEluaXRpYWxpemVzIGNhc2UgaXRlcmF0b3IgZm9yIGdpdmVuIFN3aXRjaEluc3QgYW5kIGZvciBnaXZlbgorICAgIC8vLyBUZXJtaW5hdG9ySW5zdCdzIHN1Y2Nlc3NvciBpbmRleC4KKyAgICBzdGF0aWMgQ2FzZUl0ZXJhdG9ySW1wbCBmcm9tU3VjY2Vzc29ySW5kZXgoU3dpdGNoSW5zdFQgKlNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdWNjZXNzb3JJbmRleCkgeworICAgICAgYXNzZXJ0KFN1Y2Nlc3NvckluZGV4IDwgU0ktPmdldE51bVN1Y2Nlc3NvcnMoKSAmJgorICAgICAgICAgICAgICJTdWNjZXNzb3IgaW5kZXggIyBvdXQgb2YgcmFuZ2UhIik7CisgICAgICByZXR1cm4gU3VjY2Vzc29ySW5kZXggIT0gMCA/IENhc2VJdGVyYXRvckltcGwoU0ksIFN1Y2Nlc3NvckluZGV4IC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ2FzZUl0ZXJhdG9ySW1wbChTSSwgRGVmYXVsdFBzZXVkb0luZGV4KTsKKyAgICB9CisKKyAgICAvLy8gU3VwcG9ydCBjb252ZXJ0aW5nIHRvIHRoZSBjb25zdCB2YXJpYW50LiBUaGlzIHdpbGwgYmUgYSBuby1vcCBmb3IgY29uc3QKKyAgICAvLy8gdmFyaWFudC4KKyAgICBvcGVyYXRvciBDYXNlSXRlcmF0b3JJbXBsPENvbnN0Q2FzZUhhbmRsZT4oKSBjb25zdCB7CisgICAgICByZXR1cm4gQ2FzZUl0ZXJhdG9ySW1wbDxDb25zdENhc2VIYW5kbGU+KENhc2UuU0ksIENhc2UuSW5kZXgpOworICAgIH0KKworICAgIENhc2VJdGVyYXRvckltcGwgJm9wZXJhdG9yKz0ocHRyZGlmZl90IE4pIHsKKyAgICAgIC8vIENoZWNrIGluZGV4IGNvcnJlY3RuZXNzIGFmdGVyIGFkZGl0aW9uLgorICAgICAgLy8gTm90ZTogSW5kZXggPT0gZ2V0TnVtQ2FzZXMoKSBtZWFucyBlbmQoKS4KKyAgICAgIGFzc2VydChDYXNlLkluZGV4ICsgTiA+PSAwICYmCisgICAgICAgICAgICAgKHVuc2lnbmVkKShDYXNlLkluZGV4ICsgTikgPD0gQ2FzZS5TSS0+Z2V0TnVtQ2FzZXMoKSAmJgorICAgICAgICAgICAgICJDYXNlLkluZGV4IG91dCB0aGUgbnVtYmVyIG9mIGNhc2VzLiIpOworICAgICAgQ2FzZS5JbmRleCArPSBOOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBDYXNlSXRlcmF0b3JJbXBsICZvcGVyYXRvci09KHB0cmRpZmZfdCBOKSB7CisgICAgICAvLyBDaGVjayBpbmRleCBjb3JyZWN0bmVzcyBhZnRlciBzdWJ0cmFjdGlvbi4KKyAgICAgIC8vIE5vdGU6IENhc2UuSW5kZXggPT0gZ2V0TnVtQ2FzZXMoKSBtZWFucyBlbmQoKS4KKyAgICAgIGFzc2VydChDYXNlLkluZGV4IC0gTiA+PSAwICYmCisgICAgICAgICAgICAgKHVuc2lnbmVkKShDYXNlLkluZGV4IC0gTikgPD0gQ2FzZS5TSS0+Z2V0TnVtQ2FzZXMoKSAmJgorICAgICAgICAgICAgICJDYXNlLkluZGV4IG91dCB0aGUgbnVtYmVyIG9mIGNhc2VzLiIpOworICAgICAgQ2FzZS5JbmRleCAtPSBOOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBwdHJkaWZmX3Qgb3BlcmF0b3ItKGNvbnN0IENhc2VJdGVyYXRvckltcGwgJlJIUykgY29uc3QgeworICAgICAgYXNzZXJ0KENhc2UuU0kgPT0gUkhTLkNhc2UuU0kgJiYgIkluY29tcGF0aWJsZSBvcGVyYXRvcnMuIik7CisgICAgICByZXR1cm4gQ2FzZS5JbmRleCAtIFJIUy5DYXNlLkluZGV4OworICAgIH0KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ2FzZUl0ZXJhdG9ySW1wbCAmUkhTKSBjb25zdCB7CisgICAgICByZXR1cm4gQ2FzZSA9PSBSSFMuQ2FzZTsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQ2FzZUl0ZXJhdG9ySW1wbCAmUkhTKSBjb25zdCB7CisgICAgICBhc3NlcnQoQ2FzZS5TSSA9PSBSSFMuQ2FzZS5TSSAmJiAiSW5jb21wYXRpYmxlIG9wZXJhdG9ycy4iKTsKKyAgICAgIHJldHVybiBDYXNlLkluZGV4IDwgUkhTLkNhc2UuSW5kZXg7CisgICAgfQorICAgIENhc2VIYW5kbGVUICZvcGVyYXRvciooKSB7IHJldHVybiBDYXNlOyB9CisgICAgY29uc3QgQ2FzZUhhbmRsZVQgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIENhc2U7IH0KKyAgfTsKKworICB1c2luZyBDYXNlSXQgPSBDYXNlSXRlcmF0b3JJbXBsPENhc2VIYW5kbGU+OworICB1c2luZyBDb25zdENhc2VJdCA9IENhc2VJdGVyYXRvckltcGw8Q29uc3RDYXNlSGFuZGxlPjsKKworICBzdGF0aWMgU3dpdGNoSW5zdCAqQ3JlYXRlKFZhbHVlICpWYWx1ZSwgQmFzaWNCbG9jayAqRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DYXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIHJldHVybiBuZXcgU3dpdGNoSW5zdChWYWx1ZSwgRGVmYXVsdCwgTnVtQ2FzZXMsIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgU3dpdGNoSW5zdCAqQ3JlYXRlKFZhbHVlICpWYWx1ZSwgQmFzaWNCbG9jayAqRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DYXNlcywgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3IFN3aXRjaEluc3QoVmFsdWUsIERlZmF1bHQsIE51bUNhc2VzLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gUHJvdmlkZSBmYXN0IG9wZXJhbmQgYWNjZXNzb3JzCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIC8vIEFjY2Vzc29yIE1ldGhvZHMgZm9yIFN3aXRjaCBzdG10CisgIFZhbHVlICpnZXRDb25kaXRpb24oKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisgIHZvaWQgc2V0Q29uZGl0aW9uKFZhbHVlICpWKSB7IHNldE9wZXJhbmQoMCwgVik7IH0KKworICBCYXNpY0Jsb2NrICpnZXREZWZhdWx0RGVzdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxCYXNpY0Jsb2NrPihnZXRPcGVyYW5kKDEpKTsKKyAgfQorCisgIHZvaWQgc2V0RGVmYXVsdERlc3QoQmFzaWNCbG9jayAqRGVmYXVsdENhc2UpIHsKKyAgICBzZXRPcGVyYW5kKDEsIHJlaW50ZXJwcmV0X2Nhc3Q8VmFsdWUqPihEZWZhdWx0Q2FzZSkpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mICdjYXNlcycgaW4gdGhpcyBzd2l0Y2ggaW5zdHJ1Y3Rpb24sIGV4Y2x1ZGluZyB0aGUKKyAgLy8vIGRlZmF1bHQgY2FzZS4KKyAgdW5zaWduZWQgZ2V0TnVtQ2FzZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE51bU9wZXJhbmRzKCkvMiAtIDE7CisgIH0KKworICAvLy8gUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IGNhc2UgaW4gdGhlCisgIC8vLyBTd2l0Y2hJbnN0LgorICBDYXNlSXQgY2FzZV9iZWdpbigpIHsKKyAgICByZXR1cm4gQ2FzZUl0KHRoaXMsIDApOworICB9CisKKyAgLy8vIFJldHVybnMgYSByZWFkLW9ubHkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IGNhc2UgaW4gdGhlCisgIC8vLyBTd2l0Y2hJbnN0LgorICBDb25zdENhc2VJdCBjYXNlX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBDb25zdENhc2VJdCh0aGlzLCAwKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdCBpbiB0aGUKKyAgLy8vIFN3aXRjaEluc3QuCisgIENhc2VJdCBjYXNlX2VuZCgpIHsKKyAgICByZXR1cm4gQ2FzZUl0KHRoaXMsIGdldE51bUNhc2VzKCkpOworICB9CisKKyAgLy8vIFJldHVybnMgYSByZWFkLW9ubHkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QgaW4gdGhlCisgIC8vLyBTd2l0Y2hJbnN0LgorICBDb25zdENhc2VJdCBjYXNlX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RDYXNlSXQodGhpcywgZ2V0TnVtQ2FzZXMoKSk7CisgIH0KKworICAvLy8gSXRlcmF0aW9uIGFkYXB0ZXIgZm9yIHJhbmdlLWZvciBsb29wcy4KKyAgaXRlcmF0b3JfcmFuZ2U8Q2FzZUl0PiBjYXNlcygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShjYXNlX2JlZ2luKCksIGNhc2VfZW5kKCkpOworICB9CisKKyAgLy8vIENvbnN0YW50IGl0ZXJhdGlvbiBhZGFwdGVyIGZvciByYW5nZS1mb3IgbG9vcHMuCisgIGl0ZXJhdG9yX3JhbmdlPENvbnN0Q2FzZUl0PiBjYXNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShjYXNlX2JlZ2luKCksIGNhc2VfZW5kKCkpOworICB9CisKKyAgLy8vIFJldHVybnMgYW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGRlZmF1bHQgY2FzZS4KKyAgLy8vIE5vdGU6IHRoaXMgaXRlcmF0b3IgYWxsb3dzIHRvIHJlc29sdmUgc3VjY2Vzc29yIG9ubHkuIEF0dGVtcHQKKyAgLy8vIHRvIHJlc29sdmUgY2FzZSB2YWx1ZSBjYXVzZXMgYW4gYXNzZXJ0aW9uLgorICAvLy8gQWxzbyBub3RlLCB0aGF0IGluY3JlbWVudCBhbmQgZGVjcmVtZW50IGFsc28gY2F1c2VzIGFuIGFzc2VydGlvbiBhbmQKKyAgLy8vIG1ha2VzIGl0ZXJhdG9yIGludmFsaWQuCisgIENhc2VJdCBjYXNlX2RlZmF1bHQoKSB7CisgICAgcmV0dXJuIENhc2VJdCh0aGlzLCBEZWZhdWx0UHNldWRvSW5kZXgpOworICB9CisgIENvbnN0Q2FzZUl0IGNhc2VfZGVmYXVsdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RDYXNlSXQodGhpcywgRGVmYXVsdFBzZXVkb0luZGV4KTsKKyAgfQorCisgIC8vLyBTZWFyY2ggYWxsIG9mIHRoZSBjYXNlIHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBjb25zdGFudC4gSWYgaXQgaXMKKyAgLy8vIGV4cGxpY2l0bHkgaGFuZGxlZCwgcmV0dXJuIHRoZSBjYXNlIGl0ZXJhdG9yIG9mIGl0LCBvdGhlcndpc2UgcmV0dXJuCisgIC8vLyBkZWZhdWx0IGNhc2UgaXRlcmF0b3IgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBoYW5kbGVkIGJ5IHRoZSBkZWZhdWx0CisgIC8vLyBoYW5kbGVyLgorICBDYXNlSXQgZmluZENhc2VWYWx1ZShjb25zdCBDb25zdGFudEludCAqQykgeworICAgIENhc2VJdCBJID0gbGx2bTo6ZmluZF9pZigKKyAgICAgICAgY2FzZXMoKSwgW0NdKENhc2VIYW5kbGUgJkNhc2UpIHsgcmV0dXJuIENhc2UuZ2V0Q2FzZVZhbHVlKCkgPT0gQzsgfSk7CisgICAgaWYgKEkgIT0gY2FzZV9lbmQoKSkKKyAgICAgIHJldHVybiBJOworCisgICAgcmV0dXJuIGNhc2VfZGVmYXVsdCgpOworICB9CisgIENvbnN0Q2FzZUl0IGZpbmRDYXNlVmFsdWUoY29uc3QgQ29uc3RhbnRJbnQgKkMpIGNvbnN0IHsKKyAgICBDb25zdENhc2VJdCBJID0gbGx2bTo6ZmluZF9pZihjYXNlcygpLCBbQ10oQ29uc3RDYXNlSGFuZGxlICZDYXNlKSB7CisgICAgICByZXR1cm4gQ2FzZS5nZXRDYXNlVmFsdWUoKSA9PSBDOworICAgIH0pOworICAgIGlmIChJICE9IGNhc2VfZW5kKCkpCisgICAgICByZXR1cm4gSTsKKworICAgIHJldHVybiBjYXNlX2RlZmF1bHQoKTsKKyAgfQorCisgIC8vLyBGaW5kcyB0aGUgdW5pcXVlIGNhc2UgdmFsdWUgZm9yIGEgZ2l2ZW4gc3VjY2Vzc29yLiBSZXR1cm5zIG51bGwgaWYgdGhlCisgIC8vLyBzdWNjZXNzb3IgaXMgbm90IGZvdW5kLCBub3QgdW5pcXVlLCBvciBpcyB0aGUgZGVmYXVsdCBjYXNlLgorICBDb25zdGFudEludCAqZmluZENhc2VEZXN0KEJhc2ljQmxvY2sgKkJCKSB7CisgICAgaWYgKEJCID09IGdldERlZmF1bHREZXN0KCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIENvbnN0YW50SW50ICpDSSA9IG51bGxwdHI7CisgICAgZm9yIChhdXRvIENhc2UgOiBjYXNlcygpKSB7CisgICAgICBpZiAoQ2FzZS5nZXRDYXNlU3VjY2Vzc29yKCkgIT0gQkIpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoQ0kpCisgICAgICAgIHJldHVybiBudWxscHRyOyAvLyBNdWx0aXBsZSBjYXNlcyBsZWFkIHRvIEJCLgorCisgICAgICBDSSA9IENhc2UuZ2V0Q2FzZVZhbHVlKCk7CisgICAgfQorCisgICAgcmV0dXJuIENJOworICB9CisKKyAgLy8vIEFkZCBhbiBlbnRyeSB0byB0aGUgc3dpdGNoIGluc3RydWN0aW9uLgorICAvLy8gTm90ZToKKyAgLy8vIFRoaXMgYWN0aW9uIGludmFsaWRhdGVzIGNhc2VfZW5kKCkuIE9sZCBjYXNlX2VuZCgpIGl0ZXJhdG9yIHdpbGwKKyAgLy8vIHBvaW50IHRvIHRoZSBhZGRlZCBjYXNlLgorICB2b2lkIGFkZENhc2UoQ29uc3RhbnRJbnQgKk9uVmFsLCBCYXNpY0Jsb2NrICpEZXN0KTsKKworICAvLy8gVGhpcyBtZXRob2QgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGNhc2UgYW5kIGl0cyBzdWNjZXNzb3IgZnJvbSB0aGUgc3dpdGNoCisgIC8vLyBpbnN0cnVjdGlvbi4gTm90ZSB0aGF0IHRoaXMgb3BlcmF0aW9uIG1heSByZW9yZGVyIHRoZSByZW1haW5pbmcgY2FzZXMgYXQKKyAgLy8vIGluZGV4IGlkeCBhbmQgYWJvdmUuCisgIC8vLyBOb3RlOgorICAvLy8gVGhpcyBhY3Rpb24gaW52YWxpZGF0ZXMgaXRlcmF0b3JzIGZvciBhbGwgY2FzZXMgZm9sbG93aW5nIHRoZSBvbmUgcmVtb3ZlZCwKKyAgLy8vIGluY2x1ZGluZyB0aGUgY2FzZV9lbmQoKSBpdGVyYXRvci4gSXQgcmV0dXJucyBhbiBpdGVyYXRvciBmb3IgdGhlIG5leHQKKyAgLy8vIGNhc2UuCisgIENhc2VJdCByZW1vdmVDYXNlKENhc2VJdCBJKTsKKworICB1bnNpZ25lZCBnZXROdW1TdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKS8yOyB9CisgIEJhc2ljQmxvY2sgKmdldFN1Y2Nlc3Nvcih1bnNpZ25lZCBpZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaWR4IDwgZ2V0TnVtU3VjY2Vzc29ycygpICYmIlN1Y2Nlc3NvciBpZHggb3V0IG9mIHJhbmdlIGZvciBzd2l0Y2ghIik7CisgICAgcmV0dXJuIGNhc3Q8QmFzaWNCbG9jaz4oZ2V0T3BlcmFuZChpZHgqMisxKSk7CisgIH0KKyAgdm9pZCBzZXRTdWNjZXNzb3IodW5zaWduZWQgaWR4LCBCYXNpY0Jsb2NrICpOZXdTdWNjKSB7CisgICAgYXNzZXJ0KGlkeCA8IGdldE51bVN1Y2Nlc3NvcnMoKSAmJiAiU3VjY2Vzc29yICMgb3V0IG9mIHJhbmdlIGZvciBzd2l0Y2ghIik7CisgICAgc2V0T3BlcmFuZChpZHggKiAyICsgMSwgTmV3U3VjYyk7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTd2l0Y2g7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8U3dpdGNoSW5zdD4gOiBwdWJsaWMgSHVuZ29mZk9wZXJhbmRUcmFpdHM8Mj4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFN3aXRjaEluc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGlyZWN0QnJJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vIEluZGlyZWN0IEJyYW5jaCBJbnN0cnVjdGlvbi4KKy8vLworY2xhc3MgSW5kaXJlY3RCckluc3QgOiBwdWJsaWMgVGVybWluYXRvckluc3QgeworICB1bnNpZ25lZCBSZXNlcnZlZFNwYWNlOworCisgIC8vIE9wZXJhbmRbMF0gICA9IEFkZHJlc3MgdG8ganVtcCB0bworICAvLyBPcGVyYW5kW24rMV0gPSBuLXRoIGRlc3RpbmF0aW9uCisgIEluZGlyZWN0QnJJbnN0KGNvbnN0IEluZGlyZWN0QnJJbnN0ICZJQkkpOworCisgIC8vLyBDcmVhdGUgYSBuZXcgaW5kaXJlY3RiciBpbnN0cnVjdGlvbiwgc3BlY2lmeWluZyBhbgorICAvLy8gQWRkcmVzcyB0byBqdW1wIHRvLiAgVGhlIG51bWJlciBvZiBleHBlY3RlZCBkZXN0aW5hdGlvbnMgY2FuIGJlIHNwZWNpZmllZAorICAvLy8gaGVyZSB0byBtYWtlIG1lbW9yeSBhbGxvY2F0aW9uIG1vcmUgZWZmaWNpZW50LiAgVGhpcyBjb25zdHJ1Y3RvciBjYW4gYWxzbworICAvLy8gYXV0b2luc2VydCBiZWZvcmUgYW5vdGhlciBpbnN0cnVjdGlvbi4KKyAgSW5kaXJlY3RCckluc3QoVmFsdWUgKkFkZHJlc3MsIHVuc2lnbmVkIE51bURlc3RzLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKworICAvLy8gQ3JlYXRlIGEgbmV3IGluZGlyZWN0YnIgaW5zdHJ1Y3Rpb24sIHNwZWNpZnlpbmcgYW4KKyAgLy8vIEFkZHJlc3MgdG8ganVtcCB0by4gIFRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZGVzdGluYXRpb25zIGNhbiBiZSBzcGVjaWZpZWQKKyAgLy8vIGhlcmUgdG8gbWFrZSBtZW1vcnkgYWxsb2NhdGlvbiBtb3JlIGVmZmljaWVudC4gIFRoaXMgY29uc3RydWN0b3IgYWxzbworICAvLy8gYXV0b2luc2VydHMgYXQgdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIEJhc2ljQmxvY2suCisgIEluZGlyZWN0QnJJbnN0KFZhbHVlICpBZGRyZXNzLCB1bnNpZ25lZCBOdW1EZXN0cywgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IHplcm8gb3BlcmFuZHMKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7CisgICAgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzKTsKKyAgfQorCisgIHZvaWQgaW5pdChWYWx1ZSAqQWRkcmVzcywgdW5zaWduZWQgTnVtRGVzdHMpOworICB2b2lkIGdyb3dPcGVyYW5kcygpOworCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBJbmRpcmVjdEJySW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgc3RhdGljIEluZGlyZWN0QnJJbnN0ICpDcmVhdGUoVmFsdWUgKkFkZHJlc3MsIHVuc2lnbmVkIE51bURlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIHJldHVybiBuZXcgSW5kaXJlY3RCckluc3QoQWRkcmVzcywgTnVtRGVzdHMsIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgSW5kaXJlY3RCckluc3QgKkNyZWF0ZShWYWx1ZSAqQWRkcmVzcywgdW5zaWduZWQgTnVtRGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgcmV0dXJuIG5ldyBJbmRpcmVjdEJySW5zdChBZGRyZXNzLCBOdW1EZXN0cywgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgLy8vIFByb3ZpZGUgZmFzdCBvcGVyYW5kIGFjY2Vzc29ycy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8gQWNjZXNzb3IgTWV0aG9kcyBmb3IgSW5kaXJlY3RCckluc3QgaW5zdHJ1Y3Rpb24uCisgIFZhbHVlICpnZXRBZGRyZXNzKCkgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICBjb25zdCBWYWx1ZSAqZ2V0QWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKyAgdm9pZCBzZXRBZGRyZXNzKFZhbHVlICpWKSB7IHNldE9wZXJhbmQoMCwgVik7IH0KKworICAvLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgcG9zc2libGUgZGVzdGluYXRpb25zIGluIHRoaXMKKyAgLy8vIGluZGlyZWN0YnIgaW5zdHJ1Y3Rpb24uCisgIHVuc2lnbmVkIGdldE51bURlc3RpbmF0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGdldE51bU9wZXJhbmRzKCktMTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbi4KKyAgQmFzaWNCbG9jayAqZ2V0RGVzdGluYXRpb24odW5zaWduZWQgaSkgeyByZXR1cm4gZ2V0U3VjY2Vzc29yKGkpOyB9CisgIGNvbnN0IEJhc2ljQmxvY2sgKmdldERlc3RpbmF0aW9uKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIGdldFN1Y2Nlc3NvcihpKTsgfQorCisgIC8vLyBBZGQgYSBkZXN0aW5hdGlvbi4KKyAgLy8vCisgIHZvaWQgYWRkRGVzdGluYXRpb24oQmFzaWNCbG9jayAqRGVzdCk7CisKKyAgLy8vIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIHNwZWNpZmllZCBzdWNjZXNzb3IgZnJvbSB0aGUKKyAgLy8vIGluZGlyZWN0YnIgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgcmVtb3ZlRGVzdGluYXRpb24odW5zaWduZWQgaSk7CisKKyAgdW5zaWduZWQgZ2V0TnVtU3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIGdldE51bU9wZXJhbmRzKCktMTsgfQorICBCYXNpY0Jsb2NrICpnZXRTdWNjZXNzb3IodW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBjYXN0PEJhc2ljQmxvY2s+KGdldE9wZXJhbmQoaSsxKSk7CisgIH0KKyAgdm9pZCBzZXRTdWNjZXNzb3IodW5zaWduZWQgaSwgQmFzaWNCbG9jayAqTmV3U3VjYykgeworICAgIHNldE9wZXJhbmQoaSArIDEsIE5ld1N1Y2MpOworICB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6SW5kaXJlY3RCcjsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxJbmRpcmVjdEJySW5zdD4gOiBwdWJsaWMgSHVuZ29mZk9wZXJhbmRUcmFpdHM8MT4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKEluZGlyZWN0QnJJbnN0LCBWYWx1ZSkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludm9rZUluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBJbnZva2UgaW5zdHJ1Y3Rpb24uICBUaGUgU3ViY2xhc3NEYXRhIGZpZWxkIGlzIHVzZWQgdG8gaG9sZCB0aGUKKy8vLyBjYWxsaW5nIGNvbnZlbnRpb24gb2YgdGhlIGNhbGwuCisvLy8KK2NsYXNzIEludm9rZUluc3QgOiBwdWJsaWMgQ2FsbEJhc2U8SW52b2tlSW5zdD4geworICBmcmllbmQgY2xhc3MgT3BlcmFuZEJ1bmRsZVVzZXI8SW52b2tlSW5zdCwgVXNlcjo6b3BfaXRlcmF0b3I+OworCisgIEludm9rZUluc3QoY29uc3QgSW52b2tlSW5zdCAmQkkpOworCisgIC8vLyBDb25zdHJ1Y3QgYW4gSW52b2tlSW5zdCBnaXZlbiBhIHJhbmdlIG9mIGFyZ3VtZW50cy4KKyAgLy8vCisgIC8vLyBDb25zdHJ1Y3QgYW4gSW52b2tlSW5zdCBmcm9tIGEgcmFuZ2Ugb2YgYXJndW1lbnRzCisgIGlubGluZSBJbnZva2VJbnN0KFZhbHVlICpGdW5jLCBCYXNpY0Jsb2NrICpJZk5vcm1hbCwgQmFzaWNCbG9jayAqSWZFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZhbHVlcywgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpCisgICAgICA6IEludm9rZUluc3QoY2FzdDxGdW5jdGlvblR5cGU+KAorICAgICAgICAgICAgICAgICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihGdW5jLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICBGdW5jLCBJZk5vcm1hbCwgSWZFeGNlcHRpb24sIEFyZ3MsIEJ1bmRsZXMsIFZhbHVlcywgTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICBJbnNlcnRCZWZvcmUpIHt9CisKKyAgaW5saW5lIEludm9rZUluc3QoRnVuY3Rpb25UeXBlICpUeSwgVmFsdWUgKkZ1bmMsIEJhc2ljQmxvY2sgKklmTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJZkV4Y2VwdGlvbiwgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcywgdW5zaWduZWQgVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisgIC8vLyBDb25zdHJ1Y3QgYW4gSW52b2tlSW5zdCBnaXZlbiBhIHJhbmdlIG9mIGFyZ3VtZW50cy4KKyAgLy8vCisgIC8vLyBDb25zdHJ1Y3QgYW4gSW52b2tlSW5zdCBmcm9tIGEgcmFuZ2Ugb2YgYXJndW1lbnRzCisgIGlubGluZSBJbnZva2VJbnN0KFZhbHVlICpGdW5jLCBCYXNpY0Jsb2NrICpJZk5vcm1hbCwgQmFzaWNCbG9jayAqSWZFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZhbHVlcywgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworCisgIHZvaWQgaW5pdChWYWx1ZSAqRnVuYywgQmFzaWNCbG9jayAqSWZOb3JtYWwsIEJhc2ljQmxvY2sgKklmRXhjZXB0aW9uLAorICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcywKKyAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyKSB7CisgICAgaW5pdChjYXN0PEZ1bmN0aW9uVHlwZT4oCisgICAgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oRnVuYy0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSksCisgICAgICAgICBGdW5jLCBJZk5vcm1hbCwgSWZFeGNlcHRpb24sIEFyZ3MsIEJ1bmRsZXMsIE5hbWVTdHIpOworICB9CisKKyAgdm9pZCBpbml0KEZ1bmN0aW9uVHlwZSAqRlR5LCBWYWx1ZSAqRnVuYywgQmFzaWNCbG9jayAqSWZOb3JtYWwsCisgICAgICAgICAgICBCYXNpY0Jsb2NrICpJZkV4Y2VwdGlvbiwgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMsIGNvbnN0IFR3aW5lICZOYW1lU3RyKTsKKworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgSW52b2tlSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQgQXJnT2Zmc2V0ID0gMzsKKyAgc3RhdGljIEludm9rZUluc3QgKkNyZWF0ZShWYWx1ZSAqRnVuYywgQmFzaWNCbG9jayAqSWZOb3JtYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSWZFeGNlcHRpb24sIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gQ3JlYXRlKGNhc3Q8RnVuY3Rpb25UeXBlPigKKyAgICAgICAgICAgICAgICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihGdW5jLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgIEZ1bmMsIElmTm9ybWFsLCBJZkV4Y2VwdGlvbiwgQXJncywgTm9uZSwgTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgSW52b2tlSW5zdCAqQ3JlYXRlKFZhbHVlICpGdW5jLCBCYXNpY0Jsb2NrICpJZk5vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJZkV4Y2VwdGlvbiwgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIENyZWF0ZShjYXN0PEZ1bmN0aW9uVHlwZT4oCisgICAgICAgICAgICAgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oRnVuYy0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSksCisgICAgICAgICAgICAgICAgICBGdW5jLCBJZk5vcm1hbCwgSWZFeGNlcHRpb24sIEFyZ3MsIEJ1bmRsZXMsIE5hbWVTdHIsCisgICAgICAgICAgICAgICAgICBJbnNlcnRCZWZvcmUpOworICB9CisKKyAgc3RhdGljIEludm9rZUluc3QgKkNyZWF0ZShGdW5jdGlvblR5cGUgKlR5LCBWYWx1ZSAqRnVuYywgQmFzaWNCbG9jayAqSWZOb3JtYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSWZFeGNlcHRpb24sIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICB1bnNpZ25lZCBWYWx1ZXMgPSB1bnNpZ25lZChBcmdzLnNpemUoKSkgKyAzOworICAgIHJldHVybiBuZXcgKFZhbHVlcykgSW52b2tlSW5zdChUeSwgRnVuYywgSWZOb3JtYWwsIElmRXhjZXB0aW9uLCBBcmdzLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMsIE5hbWVTdHIsIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgSW52b2tlSW5zdCAqQ3JlYXRlKEZ1bmN0aW9uVHlwZSAqVHksIFZhbHVlICpGdW5jLCBCYXNpY0Jsb2NrICpJZk5vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJZkV4Y2VwdGlvbiwgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKSB7CisgICAgdW5zaWduZWQgVmFsdWVzID0gdW5zaWduZWQoQXJncy5zaXplKCkpICsgQ291bnRCdW5kbGVJbnB1dHMoQnVuZGxlcykgKyAzOworICAgIHVuc2lnbmVkIERlc2NyaXB0b3JCeXRlcyA9IEJ1bmRsZXMuc2l6ZSgpICogc2l6ZW9mKEJ1bmRsZU9wSW5mbyk7CisKKyAgICByZXR1cm4gbmV3IChWYWx1ZXMsIERlc2NyaXB0b3JCeXRlcykKKyAgICAgICAgSW52b2tlSW5zdChUeSwgRnVuYywgSWZOb3JtYWwsIElmRXhjZXB0aW9uLCBBcmdzLCBCdW5kbGVzLCBWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgTmFtZVN0ciwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBJbnZva2VJbnN0ICpDcmVhdGUoVmFsdWUgKkZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSWZOb3JtYWwsIEJhc2ljQmxvY2sgKklmRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgdW5zaWduZWQgVmFsdWVzID0gdW5zaWduZWQoQXJncy5zaXplKCkpICsgMzsKKyAgICByZXR1cm4gbmV3IChWYWx1ZXMpIEludm9rZUluc3QoRnVuYywgSWZOb3JtYWwsIElmRXhjZXB0aW9uLCBBcmdzLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMsIE5hbWVTdHIsIEluc2VydEF0RW5kKTsKKyAgfQorCisgIHN0YXRpYyBJbnZva2VJbnN0ICpDcmVhdGUoVmFsdWUgKkZ1bmMsIEJhc2ljQmxvY2sgKklmTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKklmRXhjZXB0aW9uLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgdW5zaWduZWQgVmFsdWVzID0gdW5zaWduZWQoQXJncy5zaXplKCkpICsgQ291bnRCdW5kbGVJbnB1dHMoQnVuZGxlcykgKyAzOworICAgIHVuc2lnbmVkIERlc2NyaXB0b3JCeXRlcyA9IEJ1bmRsZXMuc2l6ZSgpICogc2l6ZW9mKEJ1bmRsZU9wSW5mbyk7CisKKyAgICByZXR1cm4gbmV3IChWYWx1ZXMsIERlc2NyaXB0b3JCeXRlcykKKyAgICAgICAgSW52b2tlSW5zdChGdW5jLCBJZk5vcm1hbCwgSWZFeGNlcHRpb24sIEFyZ3MsIEJ1bmRsZXMsIFZhbHVlcywgTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gQ3JlYXRlIGEgY2xvbmUgb2YgXHAgSUkgd2l0aCBhIGRpZmZlcmVudCBzZXQgb2Ygb3BlcmFuZCBidW5kbGVzIGFuZAorICAvLy8gaW5zZXJ0IGl0IGJlZm9yZSBccCBJbnNlcnRQdC4KKyAgLy8vCisgIC8vLyBUaGUgcmV0dXJuZWQgaW52b2tlIGluc3RydWN0aW9uIGlzIGlkZW50aWNhbCB0byBccCBJSSBpbiBldmVyeSB3YXkgZXhjZXB0CisgIC8vLyB0aGF0IHRoZSBvcGVyYW5kIGJ1bmRsZXMgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb24gYXJlIHNldCB0byB0aGUgb3BlcmFuZAorICAvLy8gYnVuZGxlcyBpbiBccCBCdW5kbGVzLgorICBzdGF0aWMgSW52b2tlSW5zdCAqQ3JlYXRlKEludm9rZUluc3QgKklJLCBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRQdCA9IG51bGxwdHIpOworCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGNhbGwgc2hvdWxkIG5vdCBwZXJmb3JtIGluZGlyZWN0IGJyYW5jaCB0cmFja2luZy4KKyAgYm9vbCBkb2VzTm9DZkNoZWNrKCkgY29uc3QgeyByZXR1cm4gaGFzRm5BdHRyKEF0dHJpYnV0ZTo6Tm9DZkNoZWNrKTsgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGNhbGwgY2Fubm90IHVud2luZC4KKyAgYm9vbCBkb2VzTm90VGhyb3coKSBjb25zdCB7IHJldHVybiBoYXNGbkF0dHIoQXR0cmlidXRlOjpOb1Vud2luZCk7IH0KKyAgdm9pZCBzZXREb2VzTm90VGhyb3coKSB7CisgICAgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHJpYnV0ZTo6Tm9VbndpbmQpOworICB9CisgIAorICAvLy8gUmV0dXJuIHRoZSBmdW5jdGlvbiBjYWxsZWQsIG9yIG51bGwgaWYgdGhpcyBpcyBhbgorICAvLy8gaW5kaXJlY3QgZnVuY3Rpb24gaW52b2NhdGlvbi4KKyAgLy8vCisgIEZ1bmN0aW9uICpnZXRDYWxsZWRGdW5jdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZHluX2Nhc3Q8RnVuY3Rpb24+KE9wPC0zPigpKTsKKyAgfQorCisgIC8vLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgYnkgdGhpcworICAvLy8gaW5zdHJ1Y3Rpb24KKyAgY29uc3QgVmFsdWUgKmdldENhbGxlZFZhbHVlKCkgY29uc3QgeyByZXR1cm4gT3A8LTM+KCk7IH0KKyAgICAgICAgVmFsdWUgKmdldENhbGxlZFZhbHVlKCkgICAgICAgeyByZXR1cm4gT3A8LTM+KCk7IH0KKworICAvLy8gU2V0IHRoZSBmdW5jdGlvbiBjYWxsZWQuCisgIHZvaWQgc2V0Q2FsbGVkRnVuY3Rpb24oVmFsdWUqIEZuKSB7CisgICAgc2V0Q2FsbGVkRnVuY3Rpb24oCisgICAgICAgIGNhc3Q8RnVuY3Rpb25UeXBlPihjYXN0PFBvaW50ZXJUeXBlPihGbi0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSksCisgICAgICAgIEZuKTsKKyAgfQorICB2b2lkIHNldENhbGxlZEZ1bmN0aW9uKEZ1bmN0aW9uVHlwZSAqRlR5LCBWYWx1ZSAqRm4pIHsKKyAgICB0aGlzLT5GVHkgPSBGVHk7CisgICAgYXNzZXJ0KEZUeSA9PSBjYXN0PEZ1bmN0aW9uVHlwZT4oCisgICAgICAgICAgICAgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oRm4tPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpKTsKKyAgICBPcDwtMz4oKSA9IEZuOworICB9CisKKyAgLy8gZ2V0KkRlc3QgLSBSZXR1cm4gdGhlIGRlc3RpbmF0aW9uIGJhc2ljIGJsb2Nrcy4uLgorICBCYXNpY0Jsb2NrICpnZXROb3JtYWxEZXN0KCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PEJhc2ljQmxvY2s+KE9wPC0yPigpKTsKKyAgfQorICBCYXNpY0Jsb2NrICpnZXRVbndpbmREZXN0KCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PEJhc2ljQmxvY2s+KE9wPC0xPigpKTsKKyAgfQorICB2b2lkIHNldE5vcm1hbERlc3QoQmFzaWNCbG9jayAqQikgeworICAgIE9wPC0yPigpID0gcmVpbnRlcnByZXRfY2FzdDxWYWx1ZSo+KEIpOworICB9CisgIHZvaWQgc2V0VW53aW5kRGVzdChCYXNpY0Jsb2NrICpCKSB7CisgICAgT3A8LTE+KCkgPSByZWludGVycHJldF9jYXN0PFZhbHVlKj4oQik7CisgIH0KKworICAvLy8gR2V0IHRoZSBsYW5kaW5ncGFkIGluc3RydWN0aW9uIGZyb20gdGhlIGxhbmRpbmcgcGFkCisgIC8vLyBibG9jayAodGhlIHVud2luZCBkZXN0aW5hdGlvbikuCisgIExhbmRpbmdQYWRJbnN0ICpnZXRMYW5kaW5nUGFkSW5zdCgpIGNvbnN0OworCisgIEJhc2ljQmxvY2sgKmdldFN1Y2Nlc3Nvcih1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCAyICYmICJTdWNjZXNzb3IgIyBvdXQgb2YgcmFuZ2UgZm9yIGludm9rZSEiKTsKKyAgICByZXR1cm4gaSA9PSAwID8gZ2V0Tm9ybWFsRGVzdCgpIDogZ2V0VW53aW5kRGVzdCgpOworICB9CisKKyAgdm9pZCBzZXRTdWNjZXNzb3IodW5zaWduZWQgaWR4LCBCYXNpY0Jsb2NrICpOZXdTdWNjKSB7CisgICAgYXNzZXJ0KGlkeCA8IDIgJiYgIlN1Y2Nlc3NvciAjIG91dCBvZiByYW5nZSBmb3IgaW52b2tlISIpOworICAgICooJk9wPC0yPigpICsgaWR4KSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VmFsdWUqPihOZXdTdWNjKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bVN1Y2Nlc3NvcnMoKSBjb25zdCB7IHJldHVybiAyOyB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiAoSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246Okludm9rZSk7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9CisKK3ByaXZhdGU6CisKKyAgLy8gU2hhZG93IEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSB3aXRoIGEgcHJpdmF0ZSBmb3J3YXJkaW5nCisgIC8vIG1ldGhvZCBzbyB0aGF0IHN1YmNsYXNzZXMgY2Fubm90IGFjY2lkZW50YWxseSB1c2UgaXQuCisgIHZvaWQgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEodW5zaWduZWQgc2hvcnQgRCkgeworICAgIEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YShEKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPENhbGxCYXNlPEludm9rZUluc3Q+PgorICAgIDogcHVibGljIFZhcmlhZGljT3BlcmFuZFRyYWl0czxDYWxsQmFzZTxJbnZva2VJbnN0PiwgMz4ge307CisKK0ludm9rZUluc3Q6Okludm9rZUluc3QoRnVuY3Rpb25UeXBlICpUeSwgVmFsdWUgKkZ1bmMsIEJhc2ljQmxvY2sgKklmTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJZkV4Y2VwdGlvbiwgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcywgdW5zaWduZWQgVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkKKyAgICA6IENhbGxCYXNlPEludm9rZUluc3Q+KFR5LT5nZXRSZXR1cm5UeXBlKCksIEluc3RydWN0aW9uOjpJbnZva2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPENhbGxCYXNlPEludm9rZUluc3Q+Pjo6b3BfZW5kKHRoaXMpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMsIEluc2VydEJlZm9yZSkgeworICBpbml0KFR5LCBGdW5jLCBJZk5vcm1hbCwgSWZFeGNlcHRpb24sIEFyZ3MsIEJ1bmRsZXMsIE5hbWVTdHIpOworfQorCitJbnZva2VJbnN0OjpJbnZva2VJbnN0KFZhbHVlICpGdW5jLCBCYXNpY0Jsb2NrICpJZk5vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSWZFeGNlcHRpb24sIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMsIHVuc2lnbmVkIFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorICAgIDogQ2FsbEJhc2U8SW52b2tlSW5zdD4oCisgICAgICAgICAgY2FzdDxGdW5jdGlvblR5cGU+KAorICAgICAgICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihGdW5jLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKQorICAgICAgICAgICAgICAtPmdldFJldHVyblR5cGUoKSwKKyAgICAgICAgICBJbnN0cnVjdGlvbjo6SW52b2tlLAorICAgICAgICAgIE9wZXJhbmRUcmFpdHM8Q2FsbEJhc2U8SW52b2tlSW5zdD4+OjpvcF9lbmQodGhpcykgLSBWYWx1ZXMsIFZhbHVlcywKKyAgICAgICAgICBJbnNlcnRBdEVuZCkgeworICBpbml0KEZ1bmMsIElmTm9ybWFsLCBJZkV4Y2VwdGlvbiwgQXJncywgQnVuZGxlcywgTmFtZVN0cik7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdW1lSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLyBSZXN1bWUgdGhlIHByb3BhZ2F0aW9uIG9mIGFuIGV4Y2VwdGlvbi4KKy8vLworY2xhc3MgUmVzdW1lSW5zdCA6IHB1YmxpYyBUZXJtaW5hdG9ySW5zdCB7CisgIFJlc3VtZUluc3QoY29uc3QgUmVzdW1lSW5zdCAmUkkpOworCisgIGV4cGxpY2l0IFJlc3VtZUluc3QoVmFsdWUgKkV4biwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZT1udWxscHRyKTsKKyAgUmVzdW1lSW5zdChWYWx1ZSAqRXhuLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIFJlc3VtZUluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIHN0YXRpYyBSZXN1bWVJbnN0ICpDcmVhdGUoVmFsdWUgKkV4biwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbmV3KDEpIFJlc3VtZUluc3QoRXhuLCBJbnNlcnRCZWZvcmUpOworICB9CisKKyAgc3RhdGljIFJlc3VtZUluc3QgKkNyZWF0ZShWYWx1ZSAqRXhuLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIHJldHVybiBuZXcoMSkgUmVzdW1lSW5zdChFeG4sIEluc2VydEF0RW5kKTsKKyAgfQorCisgIC8vLyBQcm92aWRlIGZhc3Qgb3BlcmFuZCBhY2Nlc3NvcnMKKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8vIENvbnZlbmllbmNlIGFjY2Vzc29yLgorICBWYWx1ZSAqZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBPcDwwPigpOyB9CisKKyAgdW5zaWduZWQgZ2V0TnVtU3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpSZXN1bWU7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBUZXJtaW5hdG9ySW5zdDsKKworICBCYXNpY0Jsb2NrICpnZXRTdWNjZXNzb3IodW5zaWduZWQgaWR4KSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiUmVzdW1lSW5zdCBoYXMgbm8gc3VjY2Vzc29ycyEiKTsKKyAgfQorCisgIHZvaWQgc2V0U3VjY2Vzc29yKHVuc2lnbmVkIGlkeCwgQmFzaWNCbG9jayAqTmV3U3VjYykgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlJlc3VtZUluc3QgaGFzIG5vIHN1Y2Nlc3NvcnMhIik7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxSZXN1bWVJbnN0PiA6CisgICAgcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czxSZXN1bWVJbnN0LCAxPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoUmVzdW1lSW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBDYXRjaFN3aXRjaEluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitjbGFzcyBDYXRjaFN3aXRjaEluc3QgOiBwdWJsaWMgVGVybWluYXRvckluc3QgeworICAvLy8gVGhlIG51bWJlciBvZiBvcGVyYW5kcyBhY3R1YWxseSBhbGxvY2F0ZWQuICBOdW1PcGVyYW5kcyBpcworICAvLy8gdGhlIG51bWJlciBhY3R1YWxseSBpbiB1c2UuCisgIHVuc2lnbmVkIFJlc2VydmVkU3BhY2U7CisKKyAgLy8gT3BlcmFuZFswXSA9IE91dGVyIHNjb3BlCisgIC8vIE9wZXJhbmRbMV0gPSBVbndpbmQgYmxvY2sgZGVzdGluYXRpb24KKyAgLy8gT3BlcmFuZFtuXSA9IEJhc2ljQmxvY2sgdG8gZ28gdG8gb24gbWF0Y2gKKyAgQ2F0Y2hTd2l0Y2hJbnN0KGNvbnN0IENhdGNoU3dpdGNoSW5zdCAmQ1NJKTsKKworICAvLy8gQ3JlYXRlIGEgbmV3IHN3aXRjaCBpbnN0cnVjdGlvbiwgc3BlY2lmeWluZyBhCisgIC8vLyBkZWZhdWx0IGRlc3RpbmF0aW9uLiAgVGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGhhbmRsZXJzIGNhbiBiZSBzcGVjaWZpZWQKKyAgLy8vIGhlcmUgdG8gbWFrZSBtZW1vcnkgYWxsb2NhdGlvbiBtb3JlIGVmZmljaWVudC4KKyAgLy8vIFRoaXMgY29uc3RydWN0b3IgY2FuIGFsc28gYXV0b2luc2VydCBiZWZvcmUgYW5vdGhlciBpbnN0cnVjdGlvbi4KKyAgQ2F0Y2hTd2l0Y2hJbnN0KFZhbHVlICpQYXJlbnRQYWQsIEJhc2ljQmxvY2sgKlVud2luZERlc3QsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1IYW5kbGVycywgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKworICAvLy8gQ3JlYXRlIGEgbmV3IHN3aXRjaCBpbnN0cnVjdGlvbiwgc3BlY2lmeWluZyBhCisgIC8vLyBkZWZhdWx0IGRlc3RpbmF0aW9uLiAgVGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGhhbmRsZXJzIGNhbiBiZSBzcGVjaWZpZWQKKyAgLy8vIGhlcmUgdG8gbWFrZSBtZW1vcnkgYWxsb2NhdGlvbiBtb3JlIGVmZmljaWVudC4KKyAgLy8vIFRoaXMgY29uc3RydWN0b3IgYWxzbyBhdXRvaW5zZXJ0cyBhdCB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgQmFzaWNCbG9jay4KKyAgQ2F0Y2hTd2l0Y2hJbnN0KFZhbHVlICpQYXJlbnRQYWQsIEJhc2ljQmxvY2sgKlVud2luZERlc3QsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1IYW5kbGVycywgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgemVybyBvcGVyYW5kcworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzKTsgfQorCisgIHZvaWQgaW5pdChWYWx1ZSAqUGFyZW50UGFkLCBCYXNpY0Jsb2NrICpVbndpbmREZXN0LCB1bnNpZ25lZCBOdW1SZXNlcnZlZCk7CisgIHZvaWQgZ3Jvd09wZXJhbmRzKHVuc2lnbmVkIFNpemUpOworCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBDYXRjaFN3aXRjaEluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIHN0YXRpYyBDYXRjaFN3aXRjaEluc3QgKkNyZWF0ZShWYWx1ZSAqUGFyZW50UGFkLCBCYXNpY0Jsb2NrICpVbndpbmREZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSGFuZGxlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbmV3IENhdGNoU3dpdGNoSW5zdChQYXJlbnRQYWQsIFVud2luZERlc3QsIE51bUhhbmRsZXJzLCBOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgQ2F0Y2hTd2l0Y2hJbnN0ICpDcmVhdGUoVmFsdWUgKlBhcmVudFBhZCwgQmFzaWNCbG9jayAqVW53aW5kRGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUhhbmRsZXJzLCBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgcmV0dXJuIG5ldyBDYXRjaFN3aXRjaEluc3QoUGFyZW50UGFkLCBVbndpbmREZXN0LCBOdW1IYW5kbGVycywgTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gUHJvdmlkZSBmYXN0IG9wZXJhbmQgYWNjZXNzb3JzCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIC8vIEFjY2Vzc29yIE1ldGhvZHMgZm9yIENhdGNoU3dpdGNoIHN0bXQKKyAgVmFsdWUgKmdldFBhcmVudFBhZCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKyAgdm9pZCBzZXRQYXJlbnRQYWQoVmFsdWUgKlBhcmVudFBhZCkgeyBzZXRPcGVyYW5kKDAsIFBhcmVudFBhZCk7IH0KKworICAvLyBBY2Nlc3NvciBNZXRob2RzIGZvciBDYXRjaFN3aXRjaCBzdG10CisgIGJvb2wgaGFzVW53aW5kRGVzdCgpIGNvbnN0IHsgcmV0dXJuIGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgMTsgfQorICBib29sIHVud2luZHNUb0NhbGxlcigpIGNvbnN0IHsgcmV0dXJuICFoYXNVbndpbmREZXN0KCk7IH0KKyAgQmFzaWNCbG9jayAqZ2V0VW53aW5kRGVzdCgpIGNvbnN0IHsKKyAgICBpZiAoaGFzVW53aW5kRGVzdCgpKQorICAgICAgcmV0dXJuIGNhc3Q8QmFzaWNCbG9jaz4oZ2V0T3BlcmFuZCgxKSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgdm9pZCBzZXRVbndpbmREZXN0KEJhc2ljQmxvY2sgKlVud2luZERlc3QpIHsKKyAgICBhc3NlcnQoVW53aW5kRGVzdCk7CisgICAgYXNzZXJ0KGhhc1Vud2luZERlc3QoKSk7CisgICAgc2V0T3BlcmFuZCgxLCBVbndpbmREZXN0KTsKKyAgfQorCisgIC8vLyByZXR1cm4gdGhlIG51bWJlciBvZiAnaGFuZGxlcnMnIGluIHRoaXMgY2F0Y2hzd2l0Y2gKKyAgLy8vIGluc3RydWN0aW9uLCBleGNlcHQgdGhlIGRlZmF1bHQgaGFuZGxlcgorICB1bnNpZ25lZCBnZXROdW1IYW5kbGVycygpIGNvbnN0IHsKKyAgICBpZiAoaGFzVW53aW5kRGVzdCgpKQorICAgICAgcmV0dXJuIGdldE51bU9wZXJhbmRzKCkgLSAyOworICAgIHJldHVybiBnZXROdW1PcGVyYW5kcygpIC0gMTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgQmFzaWNCbG9jayAqaGFuZGxlcl9oZWxwZXIoVmFsdWUgKlYpIHsgcmV0dXJuIGNhc3Q8QmFzaWNCbG9jaz4oVik7IH0KKyAgc3RhdGljIGNvbnN0IEJhc2ljQmxvY2sgKmhhbmRsZXJfaGVscGVyKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGNhc3Q8QmFzaWNCbG9jaz4oVik7CisgIH0KKworcHVibGljOgorICB1c2luZyBEZXJlZkZuVHkgPSBCYXNpY0Jsb2NrICooKikoVmFsdWUgKik7CisgIHVzaW5nIGhhbmRsZXJfaXRlcmF0b3IgPSBtYXBwZWRfaXRlcmF0b3I8b3BfaXRlcmF0b3IsIERlcmVmRm5UeT47CisgIHVzaW5nIGhhbmRsZXJfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxoYW5kbGVyX2l0ZXJhdG9yPjsKKyAgdXNpbmcgQ29uc3REZXJlZkZuVHkgPSBjb25zdCBCYXNpY0Jsb2NrICooKikoY29uc3QgVmFsdWUgKik7CisgIHVzaW5nIGNvbnN0X2hhbmRsZXJfaXRlcmF0b3IgPQorICAgICAgbWFwcGVkX2l0ZXJhdG9yPGNvbnN0X29wX2l0ZXJhdG9yLCBDb25zdERlcmVmRm5UeT47CisgIHVzaW5nIGNvbnN0X2hhbmRsZXJfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxjb25zdF9oYW5kbGVyX2l0ZXJhdG9yPjsKKworICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgaGFuZGxlciBpbiBDYXRjaFN3aXRjaEluc3QuCisgIGhhbmRsZXJfaXRlcmF0b3IgaGFuZGxlcl9iZWdpbigpIHsKKyAgICBvcF9pdGVyYXRvciBJdCA9IG9wX2JlZ2luKCkgKyAxOworICAgIGlmIChoYXNVbndpbmREZXN0KCkpCisgICAgICArK0l0OworICAgIHJldHVybiBoYW5kbGVyX2l0ZXJhdG9yKEl0LCBEZXJlZkZuVHkoaGFuZGxlcl9oZWxwZXIpKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdCBoYW5kbGVyIGluIHRoZQorICAvLy8gQ2F0Y2hTd2l0Y2hJbnN0LgorICBjb25zdF9oYW5kbGVyX2l0ZXJhdG9yIGhhbmRsZXJfYmVnaW4oKSBjb25zdCB7CisgICAgY29uc3Rfb3BfaXRlcmF0b3IgSXQgPSBvcF9iZWdpbigpICsgMTsKKyAgICBpZiAoaGFzVW53aW5kRGVzdCgpKQorICAgICAgKytJdDsKKyAgICByZXR1cm4gY29uc3RfaGFuZGxlcl9pdGVyYXRvcihJdCwgQ29uc3REZXJlZkZuVHkoaGFuZGxlcl9oZWxwZXIpKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGEgcmVhZC1vbmx5IGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgIC8vLyBoYW5kbGVyIGluIHRoZSBDYXRjaFN3aXRjaEluc3QuCisgIGhhbmRsZXJfaXRlcmF0b3IgaGFuZGxlcl9lbmQoKSB7CisgICAgcmV0dXJuIGhhbmRsZXJfaXRlcmF0b3Iob3BfZW5kKCksIERlcmVmRm5UeShoYW5kbGVyX2hlbHBlcikpOworICB9CisKKyAgLy8vIFJldHVybnMgYW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QgaGFuZGxlciBpbiB0aGUKKyAgLy8vIENhdGNoU3dpdGNoSW5zdC4KKyAgY29uc3RfaGFuZGxlcl9pdGVyYXRvciBoYW5kbGVyX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfaGFuZGxlcl9pdGVyYXRvcihvcF9lbmQoKSwgQ29uc3REZXJlZkZuVHkoaGFuZGxlcl9oZWxwZXIpKTsKKyAgfQorCisgIC8vLyBpdGVyYXRpb24gYWRhcHRlciBmb3IgcmFuZ2UtZm9yIGxvb3BzLgorICBoYW5kbGVyX3JhbmdlIGhhbmRsZXJzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGhhbmRsZXJfYmVnaW4oKSwgaGFuZGxlcl9lbmQoKSk7CisgIH0KKworICAvLy8gaXRlcmF0aW9uIGFkYXB0ZXIgZm9yIHJhbmdlLWZvciBsb29wcy4KKyAgY29uc3RfaGFuZGxlcl9yYW5nZSBoYW5kbGVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShoYW5kbGVyX2JlZ2luKCksIGhhbmRsZXJfZW5kKCkpOworICB9CisKKyAgLy8vIEFkZCBhbiBlbnRyeSB0byB0aGUgc3dpdGNoIGluc3RydWN0aW9uLi4uCisgIC8vLyBOb3RlOgorICAvLy8gVGhpcyBhY3Rpb24gaW52YWxpZGF0ZXMgaGFuZGxlcl9lbmQoKS4gT2xkIGhhbmRsZXJfZW5kKCkgaXRlcmF0b3Igd2lsbAorICAvLy8gcG9pbnQgdG8gdGhlIGFkZGVkIGhhbmRsZXIuCisgIHZvaWQgYWRkSGFuZGxlcihCYXNpY0Jsb2NrICpEZXN0KTsKKworICB2b2lkIHJlbW92ZUhhbmRsZXIoaGFuZGxlcl9pdGVyYXRvciBISSk7CisKKyAgdW5zaWduZWQgZ2V0TnVtU3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIGdldE51bU9wZXJhbmRzKCkgLSAxOyB9CisgIEJhc2ljQmxvY2sgKmdldFN1Y2Nlc3Nvcih1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSWR4IDwgZ2V0TnVtU3VjY2Vzc29ycygpICYmCisgICAgICAgICAgICJTdWNjZXNzb3IgIyBvdXQgb2YgcmFuZ2UgZm9yIGNhdGNoc3dpdGNoISIpOworICAgIHJldHVybiBjYXN0PEJhc2ljQmxvY2s+KGdldE9wZXJhbmQoSWR4ICsgMSkpOworICB9CisgIHZvaWQgc2V0U3VjY2Vzc29yKHVuc2lnbmVkIElkeCwgQmFzaWNCbG9jayAqTmV3U3VjYykgeworICAgIGFzc2VydChJZHggPCBnZXROdW1TdWNjZXNzb3JzKCkgJiYKKyAgICAgICAgICAgIlN1Y2Nlc3NvciAjIG91dCBvZiByYW5nZSBmb3IgY2F0Y2hzd2l0Y2ghIik7CisgICAgc2V0T3BlcmFuZChJZHggKyAxLCBOZXdTdWNjKTsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkNhdGNoU3dpdGNoOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPENhdGNoU3dpdGNoSW5zdD4gOiBwdWJsaWMgSHVuZ29mZk9wZXJhbmRUcmFpdHM8Mj4ge307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhDYXRjaFN3aXRjaEluc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xlYW51cFBhZEluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitjbGFzcyBDbGVhbnVwUGFkSW5zdCA6IHB1YmxpYyBGdW5jbGV0UGFkSW5zdCB7Citwcml2YXRlOgorICBleHBsaWNpdCBDbGVhbnVwUGFkSW5zdChWYWx1ZSAqUGFyZW50UGFkLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWYWx1ZXMsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKQorICAgICAgOiBGdW5jbGV0UGFkSW5zdChJbnN0cnVjdGlvbjo6Q2xlYW51cFBhZCwgUGFyZW50UGFkLCBBcmdzLCBWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgIE5hbWVTdHIsIEluc2VydEJlZm9yZSkge30KKyAgZXhwbGljaXQgQ2xlYW51cFBhZEluc3QoVmFsdWUgKlBhcmVudFBhZCwgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmFsdWVzLCBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpCisgICAgICA6IEZ1bmNsZXRQYWRJbnN0KEluc3RydWN0aW9uOjpDbGVhbnVwUGFkLCBQYXJlbnRQYWQsIEFyZ3MsIFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgTmFtZVN0ciwgSW5zZXJ0QXRFbmQpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIENsZWFudXBQYWRJbnN0ICpDcmVhdGUoVmFsdWUgKlBhcmVudFBhZCwgQXJyYXlSZWY8VmFsdWUgKj4gQXJncyA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKSB7CisgICAgdW5zaWduZWQgVmFsdWVzID0gMSArIEFyZ3Muc2l6ZSgpOworICAgIHJldHVybiBuZXcgKFZhbHVlcykKKyAgICAgICAgQ2xlYW51cFBhZEluc3QoUGFyZW50UGFkLCBBcmdzLCBWYWx1ZXMsIE5hbWVTdHIsIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgQ2xlYW51cFBhZEluc3QgKkNyZWF0ZShWYWx1ZSAqUGFyZW50UGFkLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICB1bnNpZ25lZCBWYWx1ZXMgPSAxICsgQXJncy5zaXplKCk7CisgICAgcmV0dXJuIG5ldyAoVmFsdWVzKQorICAgICAgICBDbGVhbnVwUGFkSW5zdChQYXJlbnRQYWQsIEFyZ3MsIFZhbHVlcywgTmFtZVN0ciwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkNsZWFudXBQYWQ7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0Y2hQYWRJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworY2xhc3MgQ2F0Y2hQYWRJbnN0IDogcHVibGljIEZ1bmNsZXRQYWRJbnN0IHsKK3ByaXZhdGU6CisgIGV4cGxpY2l0IENhdGNoUGFkSW5zdChWYWx1ZSAqQ2F0Y2hTd2l0Y2gsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWYWx1ZXMsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkKKyAgICAgIDogRnVuY2xldFBhZEluc3QoSW5zdHJ1Y3Rpb246OkNhdGNoUGFkLCBDYXRjaFN3aXRjaCwgQXJncywgVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICBOYW1lU3RyLCBJbnNlcnRCZWZvcmUpIHt9CisgIGV4cGxpY2l0IENhdGNoUGFkSW5zdChWYWx1ZSAqQ2F0Y2hTd2l0Y2gsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWYWx1ZXMsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpCisgICAgICA6IEZ1bmNsZXRQYWRJbnN0KEluc3RydWN0aW9uOjpDYXRjaFBhZCwgQ2F0Y2hTd2l0Y2gsIEFyZ3MsIFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgTmFtZVN0ciwgSW5zZXJ0QXRFbmQpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIENhdGNoUGFkSW5zdCAqQ3JlYXRlKFZhbHVlICpDYXRjaFN3aXRjaCwgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIHVuc2lnbmVkIFZhbHVlcyA9IDEgKyBBcmdzLnNpemUoKTsKKyAgICByZXR1cm4gbmV3IChWYWx1ZXMpCisgICAgICAgIENhdGNoUGFkSW5zdChDYXRjaFN3aXRjaCwgQXJncywgVmFsdWVzLCBOYW1lU3RyLCBJbnNlcnRCZWZvcmUpOworICB9CisKKyAgc3RhdGljIENhdGNoUGFkSW5zdCAqQ3JlYXRlKFZhbHVlICpDYXRjaFN3aXRjaCwgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIHVuc2lnbmVkIFZhbHVlcyA9IDEgKyBBcmdzLnNpemUoKTsKKyAgICByZXR1cm4gbmV3IChWYWx1ZXMpCisgICAgICAgIENhdGNoUGFkSW5zdChDYXRjaFN3aXRjaCwgQXJncywgVmFsdWVzLCBOYW1lU3RyLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gQ29udmVuaWVuY2UgYWNjZXNzb3JzCisgIENhdGNoU3dpdGNoSW5zdCAqZ2V0Q2F0Y2hTd2l0Y2goKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8Q2F0Y2hTd2l0Y2hJbnN0PihPcDwtMT4oKSk7CisgIH0KKyAgdm9pZCBzZXRDYXRjaFN3aXRjaChWYWx1ZSAqQ2F0Y2hTd2l0Y2gpIHsKKyAgICBhc3NlcnQoQ2F0Y2hTd2l0Y2gpOworICAgIE9wPC0xPigpID0gQ2F0Y2hTd2l0Y2g7CisgIH0KKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6Q2F0Y2hQYWQ7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0Y2hSZXR1cm5JbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBDYXRjaFJldHVybkluc3QgOiBwdWJsaWMgVGVybWluYXRvckluc3QgeworICBDYXRjaFJldHVybkluc3QoY29uc3QgQ2F0Y2hSZXR1cm5JbnN0ICZSSSk7CisgIENhdGNoUmV0dXJuSW5zdChWYWx1ZSAqQ2F0Y2hQYWQsIEJhc2ljQmxvY2sgKkJCLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKyAgQ2F0Y2hSZXR1cm5JbnN0KFZhbHVlICpDYXRjaFBhZCwgQmFzaWNCbG9jayAqQkIsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICB2b2lkIGluaXQoVmFsdWUgKkNhdGNoUGFkLCBCYXNpY0Jsb2NrICpCQik7CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIENhdGNoUmV0dXJuSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgc3RhdGljIENhdGNoUmV0dXJuSW5zdCAqQ3JlYXRlKFZhbHVlICpDYXRjaFBhZCwgQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIGFzc2VydChDYXRjaFBhZCk7CisgICAgYXNzZXJ0KEJCKTsKKyAgICByZXR1cm4gbmV3ICgyKSBDYXRjaFJldHVybkluc3QoQ2F0Y2hQYWQsIEJCLCBJbnNlcnRCZWZvcmUpOworICB9CisKKyAgc3RhdGljIENhdGNoUmV0dXJuSW5zdCAqQ3JlYXRlKFZhbHVlICpDYXRjaFBhZCwgQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIGFzc2VydChDYXRjaFBhZCk7CisgICAgYXNzZXJ0KEJCKTsKKyAgICByZXR1cm4gbmV3ICgyKSBDYXRjaFJldHVybkluc3QoQ2F0Y2hQYWQsIEJCLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gUHJvdmlkZSBmYXN0IG9wZXJhbmQgYWNjZXNzb3JzCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIC8vLyBDb252ZW5pZW5jZSBhY2Nlc3NvcnMuCisgIENhdGNoUGFkSW5zdCAqZ2V0Q2F0Y2hQYWQoKSBjb25zdCB7IHJldHVybiBjYXN0PENhdGNoUGFkSW5zdD4oT3A8MD4oKSk7IH0KKyAgdm9pZCBzZXRDYXRjaFBhZChDYXRjaFBhZEluc3QgKkNhdGNoUGFkKSB7CisgICAgYXNzZXJ0KENhdGNoUGFkKTsKKyAgICBPcDwwPigpID0gQ2F0Y2hQYWQ7CisgIH0KKworICBCYXNpY0Jsb2NrICpnZXRTdWNjZXNzb3IoKSBjb25zdCB7IHJldHVybiBjYXN0PEJhc2ljQmxvY2s+KE9wPDE+KCkpOyB9CisgIHZvaWQgc2V0U3VjY2Vzc29yKEJhc2ljQmxvY2sgKk5ld1N1Y2MpIHsKKyAgICBhc3NlcnQoTmV3U3VjYyk7CisgICAgT3A8MT4oKSA9IE5ld1N1Y2M7CisgIH0KKyAgdW5zaWduZWQgZ2V0TnVtU3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIDE7IH0KKworICAvLy8gR2V0IHRoZSBwYXJlbnRQYWQgb2YgdGhpcyBjYXRjaHJldCdzIGNhdGNocGFkJ3MgY2F0Y2hzd2l0Y2guCisgIC8vLyBUaGUgc3VjY2Vzc29yIGJsb2NrIGlzIGltcGxpY2l0bHkgYSBtZW1iZXIgb2YgdGhpcyBmdW5jbGV0LgorICBWYWx1ZSAqZ2V0Q2F0Y2hTd2l0Y2hQYXJlbnRQYWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldENhdGNoUGFkKCktPmdldENhdGNoU3dpdGNoKCktPmdldFBhcmVudFBhZCgpOworICB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiAoSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkNhdGNoUmV0KTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIFRlcm1pbmF0b3JJbnN0OworCisgIEJhc2ljQmxvY2sgKmdldFN1Y2Nlc3Nvcih1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSWR4IDwgZ2V0TnVtU3VjY2Vzc29ycygpICYmICJTdWNjZXNzb3IgIyBvdXQgb2YgcmFuZ2UgZm9yIGNhdGNocmV0ISIpOworICAgIHJldHVybiBnZXRTdWNjZXNzb3IoKTsKKyAgfQorCisgIHZvaWQgc2V0U3VjY2Vzc29yKHVuc2lnbmVkIElkeCwgQmFzaWNCbG9jayAqQikgeworICAgIGFzc2VydChJZHggPCBnZXROdW1TdWNjZXNzb3JzKCkgJiYgIlN1Y2Nlc3NvciAjIG91dCBvZiByYW5nZSBmb3IgY2F0Y2hyZXQhIik7CisgICAgc2V0U3VjY2Vzc29yKEIpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8Q2F0Y2hSZXR1cm5JbnN0PgorICAgIDogcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czxDYXRjaFJldHVybkluc3QsIDI+IHt9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoQ2F0Y2hSZXR1cm5JbnN0LCBWYWx1ZSkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsZWFudXBSZXR1cm5JbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBDbGVhbnVwUmV0dXJuSW5zdCA6IHB1YmxpYyBUZXJtaW5hdG9ySW5zdCB7Citwcml2YXRlOgorICBDbGVhbnVwUmV0dXJuSW5zdChjb25zdCBDbGVhbnVwUmV0dXJuSW5zdCAmUkkpOworICBDbGVhbnVwUmV0dXJuSW5zdChWYWx1ZSAqQ2xlYW51cFBhZCwgQmFzaWNCbG9jayAqVW53aW5kQkIsIHVuc2lnbmVkIFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBDbGVhbnVwUmV0dXJuSW5zdChWYWx1ZSAqQ2xlYW51cFBhZCwgQmFzaWNCbG9jayAqVW53aW5kQkIsIHVuc2lnbmVkIFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIHZvaWQgaW5pdChWYWx1ZSAqQ2xlYW51cFBhZCwgQmFzaWNCbG9jayAqVW53aW5kQkIpOworCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBDbGVhbnVwUmV0dXJuSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgc3RhdGljIENsZWFudXBSZXR1cm5JbnN0ICpDcmVhdGUoVmFsdWUgKkNsZWFudXBQYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKlVud2luZEJCID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICBhc3NlcnQoQ2xlYW51cFBhZCk7CisgICAgdW5zaWduZWQgVmFsdWVzID0gMTsKKyAgICBpZiAoVW53aW5kQkIpCisgICAgICArK1ZhbHVlczsKKyAgICByZXR1cm4gbmV3IChWYWx1ZXMpCisgICAgICAgIENsZWFudXBSZXR1cm5JbnN0KENsZWFudXBQYWQsIFVud2luZEJCLCBWYWx1ZXMsIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgQ2xlYW51cFJldHVybkluc3QgKkNyZWF0ZShWYWx1ZSAqQ2xlYW51cFBhZCwgQmFzaWNCbG9jayAqVW53aW5kQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgYXNzZXJ0KENsZWFudXBQYWQpOworICAgIHVuc2lnbmVkIFZhbHVlcyA9IDE7CisgICAgaWYgKFVud2luZEJCKQorICAgICAgKytWYWx1ZXM7CisgICAgcmV0dXJuIG5ldyAoVmFsdWVzKQorICAgICAgICBDbGVhbnVwUmV0dXJuSW5zdChDbGVhbnVwUGFkLCBVbndpbmRCQiwgVmFsdWVzLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gUHJvdmlkZSBmYXN0IG9wZXJhbmQgYWNjZXNzb3JzCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIGJvb2wgaGFzVW53aW5kRGVzdCgpIGNvbnN0IHsgcmV0dXJuIGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgMTsgfQorICBib29sIHVud2luZHNUb0NhbGxlcigpIGNvbnN0IHsgcmV0dXJuICFoYXNVbndpbmREZXN0KCk7IH0KKworICAvLy8gQ29udmVuaWVuY2UgYWNjZXNzb3IuCisgIENsZWFudXBQYWRJbnN0ICpnZXRDbGVhbnVwUGFkKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PENsZWFudXBQYWRJbnN0PihPcDwwPigpKTsKKyAgfQorICB2b2lkIHNldENsZWFudXBQYWQoQ2xlYW51cFBhZEluc3QgKkNsZWFudXBQYWQpIHsKKyAgICBhc3NlcnQoQ2xlYW51cFBhZCk7CisgICAgT3A8MD4oKSA9IENsZWFudXBQYWQ7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1TdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gaGFzVW53aW5kRGVzdCgpID8gMSA6IDA7IH0KKworICBCYXNpY0Jsb2NrICpnZXRVbndpbmREZXN0KCkgY29uc3QgeworICAgIHJldHVybiBoYXNVbndpbmREZXN0KCkgPyBjYXN0PEJhc2ljQmxvY2s+KE9wPDE+KCkpIDogbnVsbHB0cjsKKyAgfQorICB2b2lkIHNldFVud2luZERlc3QoQmFzaWNCbG9jayAqTmV3RGVzdCkgeworICAgIGFzc2VydChOZXdEZXN0KTsKKyAgICBhc3NlcnQoaGFzVW53aW5kRGVzdCgpKTsKKyAgICBPcDwxPigpID0gTmV3RGVzdDsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gKEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpDbGVhbnVwUmV0KTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIFRlcm1pbmF0b3JJbnN0OworCisgIEJhc2ljQmxvY2sgKmdldFN1Y2Nlc3Nvcih1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSWR4ID09IDApOworICAgIHJldHVybiBnZXRVbndpbmREZXN0KCk7CisgIH0KKworICB2b2lkIHNldFN1Y2Nlc3Nvcih1bnNpZ25lZCBJZHgsIEJhc2ljQmxvY2sgKkIpIHsKKyAgICBhc3NlcnQoSWR4ID09IDApOworICAgIHNldFVud2luZERlc3QoQik7CisgIH0KKworICAvLyBTaGFkb3cgSW5zdHJ1Y3Rpb246OnNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhIHdpdGggYSBwcml2YXRlIGZvcndhcmRpbmcKKyAgLy8gbWV0aG9kIHNvIHRoYXQgc3ViY2xhc3NlcyBjYW5ub3QgYWNjaWRlbnRhbGx5IHVzZSBpdC4KKyAgdm9pZCBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSh1bnNpZ25lZCBzaG9ydCBEKSB7CisgICAgSW5zdHJ1Y3Rpb246OnNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKEQpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8Q2xlYW51cFJldHVybkluc3Q+CisgICAgOiBwdWJsaWMgVmFyaWFkaWNPcGVyYW5kVHJhaXRzPENsZWFudXBSZXR1cm5JbnN0LCAvKk1JTkFSSVRZPSovMT4ge307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhDbGVhbnVwUmV0dXJuSW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmVhY2hhYmxlSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLyBUaGlzIGZ1bmN0aW9uIGhhcyB1bmRlZmluZWQgYmVoYXZpb3IuICBJbiBwYXJ0aWN1bGFyLCB0aGUKKy8vLyBwcmVzZW5jZSBvZiB0aGlzIGluc3RydWN0aW9uIGluZGljYXRlcyBzb21lIGhpZ2hlciBsZXZlbCBrbm93bGVkZ2UgdGhhdCB0aGUKKy8vLyBlbmQgb2YgdGhlIGJsb2NrIGNhbm5vdCBiZSByZWFjaGVkLgorLy8vCitjbGFzcyBVbnJlYWNoYWJsZUluc3QgOiBwdWJsaWMgVGVybWluYXRvckluc3QgeworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgVW5yZWFjaGFibGVJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICBleHBsaWNpdCBVbnJlYWNoYWJsZUluc3QoTExWTUNvbnRleHQgJkMsIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKyAgZXhwbGljaXQgVW5yZWFjaGFibGVJbnN0KExMVk1Db250ZXh0ICZDLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgemVybyBvcGVyYW5kcworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDApOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtU3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpVbnJlYWNoYWJsZTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIFRlcm1pbmF0b3JJbnN0OworCisgIEJhc2ljQmxvY2sgKmdldFN1Y2Nlc3Nvcih1bnNpZ25lZCBpZHgpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbnJlYWNoYWJsZUluc3QgaGFzIG5vIHN1Y2Nlc3NvcnMhIik7CisgIH0KKworICB2b2lkIHNldFN1Y2Nlc3Nvcih1bnNpZ25lZCBpZHgsIEJhc2ljQmxvY2sgKkIpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbnJlYWNoYWJsZUluc3QgaGFzIG5vIHN1Y2Nlc3NvcnMhIik7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydW5jSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHRydW5jYXRpb24gb2YgaW50ZWdlciB0eXBlcy4KK2NsYXNzIFRydW5jSW5zdCA6IHB1YmxpYyBDYXN0SW5zdCB7Citwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICAvLy8gQ2xvbmUgYW4gaWRlbnRpY2FsIFRydW5jSW5zdAorICBUcnVuY0luc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1iZWZvcmUtaW5zdHJ1Y3Rpb24gc2VtYW50aWNzCisgIFRydW5jSW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSB0cnVuY2F0ZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSAoc21hbGxlcikgdHlwZSB0byB0cnVuY2F0ZSB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsICAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIgLy8vPCBXaGVyZSB0byBpbnNlcnQgdGhlIG5ldyBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1hdC1lbmQtb2YtYmxvY2sgc2VtYW50aWNzCisgIFRydW5jSW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSB0cnVuY2F0ZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSAoc21hbGxlcikgdHlwZSB0byB0cnVuY2F0ZSB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gVHJ1bmM7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRXh0SW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB6ZXJvIGV4dGVuc2lvbiBvZiBpbnRlZ2VyIHR5cGVzLgorY2xhc3MgWkV4dEluc3QgOiBwdWJsaWMgQ2FzdEluc3QgeworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgLy8vIENsb25lIGFuIGlkZW50aWNhbCBaRXh0SW5zdAorICBaRXh0SW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgWkV4dEluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgemVybyBleHRlbmRlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gemVybyBleHRlbmQgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLCAgICAgICAgICAvLy88IEEgbmFtZSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbgorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyIC8vLzwgV2hlcmUgdG8gaW5zZXJ0IHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgKTsKKworICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYXQtZW5kIHNlbWFudGljcy4KKyAgWkV4dEluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgemVybyBleHRlbmRlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gemVybyBleHRlbmQgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgICAgICAgICAvLy88IEEgbmFtZSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbgorICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAgICAgIC8vLzwgVGhlIGJsb2NrIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50bworICApOworCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IFpFeHQ7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRXh0SW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNpZ24gZXh0ZW5zaW9uIG9mIGludGVnZXIgdHlwZXMuCitjbGFzcyBTRXh0SW5zdCA6IHB1YmxpYyBDYXN0SW5zdCB7Citwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICAvLy8gQ2xvbmUgYW4gaWRlbnRpY2FsIFNFeHRJbnN0CisgIFNFeHRJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYmVmb3JlLWluc3RydWN0aW9uIHNlbWFudGljcworICBTRXh0SW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBzaWduIGV4dGVuZGVkCisgICAgVHlwZSAqVHksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBzaWduIGV4dGVuZCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsICAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIgLy8vPCBXaGVyZSB0byBpbnNlcnQgdGhlIG5ldyBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1hdC1lbmQtb2YtYmxvY2sgc2VtYW50aWNzCisgIFNFeHRJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIHNpZ24gZXh0ZW5kZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHNpZ24gZXh0ZW5kIHRvCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsICAgICAgICAgLy8vPCBBIG5hbWUgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCAgICAgICAvLy88IFRoZSBibG9jayB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uIGludG8KKyAgKTsKKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBTRXh0OworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBUcnVuY0luc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSB0cnVuY2F0aW9uIG9mIGZsb2F0aW5nIHBvaW50IHR5cGVzLgorY2xhc3MgRlBUcnVuY0luc3QgOiBwdWJsaWMgQ2FzdEluc3QgeworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgLy8vIENsb25lIGFuIGlkZW50aWNhbCBGUFRydW5jSW5zdAorICBGUFRydW5jSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgRlBUcnVuY0luc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgdHJ1bmNhdGVkCisgICAgVHlwZSAqVHksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byB0cnVuY2F0ZSB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsICAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIgLy8vPCBXaGVyZSB0byBpbnNlcnQgdGhlIG5ldyBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1iZWZvcmUtaW5zdHJ1Y3Rpb24gc2VtYW50aWNzCisgIEZQVHJ1bmNJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIHRydW5jYXRlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gdHJ1bmNhdGUgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgICAgICAgICAvLy88IEEgbmFtZSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbgorICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAgICAgIC8vLzwgVGhlIGJsb2NrIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50bworICApOworCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEZQVHJ1bmM7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUEV4dEluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZXh0ZW5zaW9uIG9mIGZsb2F0aW5nIHBvaW50IHR5cGVzLgorY2xhc3MgRlBFeHRJbnN0IDogcHVibGljIENhc3RJbnN0IHsKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIC8vLyBDbG9uZSBhbiBpZGVudGljYWwgRlBFeHRJbnN0CisgIEZQRXh0SW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgRlBFeHRJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGV4dGVuZGVkCisgICAgVHlwZSAqVHksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBleHRlbmQgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLCAgICAgICAgICAvLy88IEEgbmFtZSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbgorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyIC8vLzwgV2hlcmUgdG8gaW5zZXJ0IHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgKTsKKworICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYXQtZW5kLW9mLWJsb2NrIHNlbWFudGljcworICBGUEV4dEluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgZXh0ZW5kZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGV4dGVuZCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gRlBFeHQ7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSVRvRlBJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY2FzdCB1bnNpZ25lZCBpbnRlZ2VyIHRvIGZsb2F0aW5nIHBvaW50LgorY2xhc3MgVUlUb0ZQSW5zdCA6IHB1YmxpYyBDYXN0SW5zdCB7Citwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICAvLy8gQ2xvbmUgYW4gaWRlbnRpY2FsIFVJVG9GUEluc3QKKyAgVUlUb0ZQSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgVUlUb0ZQSW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGNvbnZlcnQgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLCAgICAgICAgICAvLy88IEEgbmFtZSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbgorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyIC8vLzwgV2hlcmUgdG8gaW5zZXJ0IHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgKTsKKworICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYXQtZW5kLW9mLWJsb2NrIHNlbWFudGljcworICBVSVRvRlBJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gY29udmVydCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gVUlUb0ZQOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lUb0ZQSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNhc3QgZnJvbSBzaWduZWQgaW50ZWdlciB0byBmbG9hdGluZyBwb2ludC4KK2NsYXNzIFNJVG9GUEluc3QgOiBwdWJsaWMgQ2FzdEluc3QgeworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgLy8vIENsb25lIGFuIGlkZW50aWNhbCBTSVRvRlBJbnN0CisgIFNJVG9GUEluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1iZWZvcmUtaW5zdHJ1Y3Rpb24gc2VtYW50aWNzCisgIFNJVG9GUEluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgVHlwZSAqVHksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBjb252ZXJ0IHRvCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwgICAgICAgICAgLy8vPCBBIG5hbWUgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0ciAvLy88IFdoZXJlIHRvIGluc2VydCB0aGUgbmV3IGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWF0LWVuZC1vZi1ibG9jayBzZW1hbnRpY3MKKyAgU0lUb0ZQSW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGNvbnZlcnQgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgICAgICAgICAvLy88IEEgbmFtZSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbgorICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAgICAgIC8vLzwgVGhlIGJsb2NrIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50bworICApOworCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IFNJVG9GUDsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQVG9VSUluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjYXN0IGZyb20gZmxvYXRpbmcgcG9pbnQgdG8gdW5zaWduZWQgaW50ZWdlcgorY2xhc3MgRlBUb1VJSW5zdCAgOiBwdWJsaWMgQ2FzdEluc3QgeworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgLy8vIENsb25lIGFuIGlkZW50aWNhbCBGUFRvVUlJbnN0CisgIEZQVG9VSUluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1iZWZvcmUtaW5zdHJ1Y3Rpb24gc2VtYW50aWNzCisgIEZQVG9VSUluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgVHlwZSAqVHksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBjb252ZXJ0IHRvCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwgICAgICAgICAgLy8vPCBBIG5hbWUgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0ciAvLy88IFdoZXJlIHRvIGluc2VydCB0aGUgbmV3IGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWF0LWVuZC1vZi1ibG9jayBzZW1hbnRpY3MKKyAgRlBUb1VJSW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGNvbnZlcnQgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgICAgICAgICAvLy88IEEgbmFtZSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbgorICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAgICAgIC8vLzwgV2hlcmUgdG8gaW5zZXJ0IHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgKTsKKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBGUFRvVUk7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUFRvU0lJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY2FzdCBmcm9tIGZsb2F0aW5nIHBvaW50IHRvIHNpZ25lZCBpbnRlZ2VyLgorY2xhc3MgRlBUb1NJSW5zdCAgOiBwdWJsaWMgQ2FzdEluc3QgeworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgLy8vIENsb25lIGFuIGlkZW50aWNhbCBGUFRvU0lJbnN0CisgIEZQVG9TSUluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1iZWZvcmUtaW5zdHJ1Y3Rpb24gc2VtYW50aWNzCisgIEZQVG9TSUluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgVHlwZSAqVHksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBjb252ZXJ0IHRvCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwgICAgICAgICAgLy8vPCBBIG5hbWUgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0ciAvLy88IFdoZXJlIHRvIGluc2VydCB0aGUgbmV3IGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWF0LWVuZC1vZi1ibG9jayBzZW1hbnRpY3MKKyAgRlBUb1NJSW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGNvbnZlcnQgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgICAgICAgICAvLy88IEEgbmFtZSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbgorICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAgICAgIC8vLzwgVGhlIGJsb2NrIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50bworICApOworCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEZQVG9TSTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFRvUHRySW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNhc3QgZnJvbSBhbiBpbnRlZ2VyIHRvIGEgcG9pbnRlci4KK2NsYXNzIEludFRvUHRySW5zdCA6IHB1YmxpYyBDYXN0SW5zdCB7CitwdWJsaWM6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYmVmb3JlLWluc3RydWN0aW9uIHNlbWFudGljcworICBJbnRUb1B0ckluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgVHlwZSAqVHksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBjb252ZXJ0IHRvCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwgICAgICAgICAgLy8vPCBBIG5hbWUgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0ciAvLy88IFdoZXJlIHRvIGluc2VydCB0aGUgbmV3IGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWF0LWVuZC1vZi1ibG9jayBzZW1hbnRpY3MKKyAgSW50VG9QdHJJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gY29udmVydCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIENsb25lIGFuIGlkZW50aWNhbCBJbnRUb1B0ckluc3QuCisgIEludFRvUHRySW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhpcyBpbnN0cnVjdGlvbidzIHBvaW50ZXIgdHlwZS4KKyAgdW5zaWduZWQgZ2V0QWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUeXBlKCktPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKTsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW50VG9QdHI7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJUb0ludEluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjYXN0IGZyb20gYSBwb2ludGVyIHRvIGFuIGludGVnZXIuCitjbGFzcyBQdHJUb0ludEluc3QgOiBwdWJsaWMgQ2FzdEluc3QgeworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgLy8vIENsb25lIGFuIGlkZW50aWNhbCBQdHJUb0ludEluc3QuCisgIFB0clRvSW50SW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgUHRyVG9JbnRJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gY29udmVydCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsICAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIgLy8vPCBXaGVyZSB0byBpbnNlcnQgdGhlIG5ldyBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1hdC1lbmQtb2YtYmxvY2sgc2VtYW50aWNzCisgIFB0clRvSW50SW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGNvbnZlcnQgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgICAgICAgICAvLy88IEEgbmFtZSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbgorICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAgICAgIC8vLzwgVGhlIGJsb2NrIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50bworICApOworCisgIC8vLyBHZXRzIHRoZSBwb2ludGVyIG9wZXJhbmQuCisgIFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZCgpIHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKyAgLy8vIEdldHMgdGhlIHBvaW50ZXIgb3BlcmFuZC4KKyAgY29uc3QgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICAvLy8gR2V0cyB0aGUgb3BlcmFuZCBpbmRleCBvZiB0aGUgcG9pbnRlciBvcGVyYW5kLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0UG9pbnRlck9wZXJhbmRJbmRleCgpIHsgcmV0dXJuIDBVOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIHBvaW50ZXIgb3BlcmFuZC4KKyAgdW5zaWduZWQgZ2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UG9pbnRlck9wZXJhbmQoKS0+Z2V0VHlwZSgpLT5nZXRQb2ludGVyQWRkcmVzc1NwYWNlKCk7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IFB0clRvSW50OworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRDYXN0SW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5vLW9wIGNhc3QgZnJvbSBvbmUgdHlwZSB0byBhbm90aGVyLgorY2xhc3MgQml0Q2FzdEluc3QgOiBwdWJsaWMgQ2FzdEluc3QgeworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgLy8vIENsb25lIGFuIGlkZW50aWNhbCBCaXRDYXN0SW5zdC4KKyAgQml0Q2FzdEluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1iZWZvcmUtaW5zdHJ1Y3Rpb24gc2VtYW50aWNzCisgIEJpdENhc3RJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNhc3RlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gY2FzdGVkIHRvCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwgICAgICAgICAgLy8vPCBBIG5hbWUgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0ciAvLy88IFdoZXJlIHRvIGluc2VydCB0aGUgbmV3IGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWF0LWVuZC1vZi1ibG9jayBzZW1hbnRpY3MKKyAgQml0Q2FzdEluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY2FzdGVkCisgICAgVHlwZSAqVHksICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBjYXN0ZWQgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgICAgICAgICAvLy88IEEgbmFtZSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbgorICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAgICAgIC8vLzwgVGhlIGJsb2NrIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50bworICApOworCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gQml0Q2FzdDsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkclNwYWNlQ2FzdEluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjb252ZXJzaW9uIGJldHdlZW4gcG9pbnRlcnMgZnJvbSBvbmUgYWRkcmVzcyBzcGFjZQorLy8vIHRvIGFub3RoZXIuCitjbGFzcyBBZGRyU3BhY2VDYXN0SW5zdCA6IHB1YmxpYyBDYXN0SW5zdCB7Citwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICAvLy8gQ2xvbmUgYW4gaWRlbnRpY2FsIEFkZHJTcGFjZUNhc3RJbnN0LgorICBBZGRyU3BhY2VDYXN0SW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgQWRkclNwYWNlQ2FzdEluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY2FzdGVkCisgICAgVHlwZSAqVHksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBjYXN0ZWQgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLCAgICAgICAgICAvLy88IEEgbmFtZSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbgorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyIC8vLzwgV2hlcmUgdG8gaW5zZXJ0IHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgKTsKKworICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYXQtZW5kLW9mLWJsb2NrIHNlbWFudGljcworICBBZGRyU3BhY2VDYXN0SW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjYXN0ZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGNhc3RlZCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBBZGRyU3BhY2VDYXN0OworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorCisgIC8vLyBHZXRzIHRoZSBwb2ludGVyIG9wZXJhbmQuCisgIFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZCgpIHsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZCgwKTsKKyAgfQorCisgIC8vLyBHZXRzIHRoZSBwb2ludGVyIG9wZXJhbmQuCisgIGNvbnN0IFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZCgwKTsKKyAgfQorCisgIC8vLyBHZXRzIHRoZSBvcGVyYW5kIGluZGV4IG9mIHRoZSBwb2ludGVyIG9wZXJhbmQuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRQb2ludGVyT3BlcmFuZEluZGV4KCkgeworICAgIHJldHVybiAwVTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBwb2ludGVyIG9wZXJhbmQuCisgIHVuc2lnbmVkIGdldFNyY0FkZHJlc3NTcGFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UG9pbnRlck9wZXJhbmQoKS0+Z2V0VHlwZSgpLT5nZXRQb2ludGVyQWRkcmVzc1NwYWNlKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgcmVzdWx0LgorICB1bnNpZ25lZCBnZXREZXN0QWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUeXBlKCktPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKTsKKyAgfQorfTsKKworLy8vIEEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcG9pbnRlciBvcGVyYW5kIG9mIGEgbG9hZCBvciBzdG9yZQorLy8vIGluc3RydWN0aW9uLiBSZXR1cm5zIG51bGxwdHIgaWYgbm90IGxvYWQgb3Igc3RvcmUuCitpbmxpbmUgVmFsdWUgKmdldExvYWRTdG9yZVBvaW50ZXJPcGVyYW5kKFZhbHVlICpWKSB7CisgIGlmIChhdXRvICpMb2FkID0gZHluX2Nhc3Q8TG9hZEluc3Q+KFYpKQorICAgIHJldHVybiBMb2FkLT5nZXRQb2ludGVyT3BlcmFuZCgpOworICBpZiAoYXV0byAqU3RvcmUgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KFYpKQorICAgIHJldHVybiBTdG9yZS0+Z2V0UG9pbnRlck9wZXJhbmQoKTsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vLyBBIGhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHBvaW50ZXIgb3BlcmFuZCBvZiBhIGxvYWQsIHN0b3JlCisvLy8gb3IgR0VQIGluc3RydWN0aW9uLiBSZXR1cm5zIG51bGxwdHIgaWYgbm90IGxvYWQsIHN0b3JlLCBvciBHRVAuCitpbmxpbmUgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKFZhbHVlICpWKSB7CisgIGlmIChhdXRvICpQdHIgPSBnZXRMb2FkU3RvcmVQb2ludGVyT3BlcmFuZChWKSkKKyAgICByZXR1cm4gUHRyOworICBpZiAoYXV0byAqR2VwID0gZHluX2Nhc3Q8R2V0RWxlbWVudFB0ckluc3Q+KFYpKQorICAgIHJldHVybiBHZXAtPmdldFBvaW50ZXJPcGVyYW5kKCk7CisgIHJldHVybiBudWxscHRyOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9JTlNUUlVDVElPTlNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNJbnN0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY0luc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQ0MjhjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNJbnN0LmgKQEAgLTAsMCArMSw4MTUgQEAKKy8vPT09LS0gbGx2bS9JbnRyaW5zaWNJbnN0LmggLSBJbnRyaW5zaWMgSW5zdHJ1Y3Rpb24gV3JhcHBlcnMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgY2xhc3NlcyB0aGF0IG1ha2UgaXQgcmVhbGx5IGVhc3kgdG8gZGVhbCB3aXRoIGludHJpbnNpYworLy8gZnVuY3Rpb25zIHdpdGggdGhlIGlzYS9keW5jYXN0IGZhbWlseSBvZiBmdW5jdGlvbnMuICBJbiBwYXJ0aWN1bGFyLCB0aGlzCisvLyBhbGxvd3MgeW91IHRvIGRvIHRoaW5ncyBsaWtlOgorLy8KKy8vICAgICBpZiAoTWVtQ3B5SW5zdCAqTUNJID0gZHluX2Nhc3Q8TWVtQ3B5SW5zdD4oSW5zdCkpCisvLyAgICAgICAgLi4uIE1DSS0+Z2V0RGVzdCgpIC4uLiBNQ0ktPmdldFNvdXJjZSgpIC4uLgorLy8KKy8vIEFsbCBpbnRyaW5zaWMgZnVuY3Rpb24gY2FsbHMgYXJlIGluc3RhbmNlcyBvZiB0aGUgY2FsbCBpbnN0cnVjdGlvbiwgc28gdGhlc2UKKy8vIGFyZSBhbGwgc3ViY2xhc3NlcyBvZiB0aGUgQ2FsbEluc3QgY2xhc3MuICBOb3RlIHRoYXQgbm9uZSBvZiB0aGVzZSBjbGFzc2VzCisvLyBoYXMgc3RhdGUgb3IgdmlydHVhbCBtZXRob2RzLCB3aGljaCBpcyBhbiBpbXBvcnRhbnQgcGFydCBvZiB0aGlzIGdyb3NzL25lYXQKKy8vIGhhY2sgd29ya2luZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfSU5UUklOU0lDSU5TVF9ICisjZGVmaW5lIExMVk1fSVJfSU5UUklOU0lDSU5TVF9ICisKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFyaWFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICAvLy8gQSB3cmFwcGVyIGNsYXNzIGZvciBpbnNwZWN0aW5nIGNhbGxzIHRvIGludHJpbnNpYyBmdW5jdGlvbnMuCisgIC8vLyBUaGlzIGFsbG93cyB0aGUgc3RhbmRhcmQgaXNhL2R5bmNhc3QvY2FzdCBmdW5jdGlvbmFsaXR5IHRvIHdvcmsgd2l0aCBjYWxscworICAvLy8gdG8gaW50cmluc2ljIGZ1bmN0aW9ucy4KKyAgY2xhc3MgSW50cmluc2ljSW5zdCA6IHB1YmxpYyBDYWxsSW5zdCB7CisgIHB1YmxpYzoKKyAgICBJbnRyaW5zaWNJbnN0KCkgPSBkZWxldGU7CisgICAgSW50cmluc2ljSW5zdChjb25zdCBJbnRyaW5zaWNJbnN0ICYpID0gZGVsZXRlOworICAgIEludHJpbnNpY0luc3QgJm9wZXJhdG9yPShjb25zdCBJbnRyaW5zaWNJbnN0ICYpID0gZGVsZXRlOworCisgICAgLy8vIFJldHVybiB0aGUgaW50cmluc2ljIElEIG9mIHRoaXMgaW50cmluc2ljLgorICAgIEludHJpbnNpYzo6SUQgZ2V0SW50cmluc2ljSUQoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0Q2FsbGVkRnVuY3Rpb24oKS0+Z2V0SW50cmluc2ljSUQoKTsKKyAgICB9CisKKyAgICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ2FsbEluc3QgKkkpIHsKKyAgICAgIGlmIChjb25zdCBGdW5jdGlvbiAqQ0YgPSBJLT5nZXRDYWxsZWRGdW5jdGlvbigpKQorICAgICAgICByZXR1cm4gQ0YtPmlzSW50cmluc2ljKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIHJldHVybiBpc2E8Q2FsbEluc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxDYWxsSW5zdD4oVikpOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3MgZm9yIGRlYnVnIGluZm8gaW50cmluc2ljcy4KKyAgY2xhc3MgRGJnSW5mb0ludHJpbnNpYyA6IHB1YmxpYyBJbnRyaW5zaWNJbnN0IHsKKyAgcHVibGljOgorICAgIC8vLyBHZXQgdGhlIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZhcmlhYmxlIHJlZmVyZW5jZWQgYnkgdGhlIGRlYnVnCisgICAgLy8vIGluZm8gaW50cmluc2ljLiAgRGVwZW5kaW5nIG9uIHRoZSBpbnRyaW5zaWMsIHRoaXMgY291bGQgYmUgdGhlCisgICAgLy8vIHZhcmlhYmxlJ3MgdmFsdWUgb3IgaXRzIGFkZHJlc3MuCisgICAgVmFsdWUgKmdldFZhcmlhYmxlTG9jYXRpb24oYm9vbCBBbGxvd051bGxPcCA9IHRydWUpIGNvbnN0OworCisgICAgLy8vIERvZXMgdGhpcyBkZXNjcmliZSB0aGUgYWRkcmVzcyBvZiBhIGxvY2FsIHZhcmlhYmxlLiBUcnVlIGZvciBkYmcuYWRkcgorICAgIC8vLyBhbmQgZGJnLmRlY2xhcmUsIGJ1dCBub3QgZGJnLnZhbHVlLCB3aGljaCBkZXNjcmliZXMgaXRzIHZhbHVlLgorICAgIGJvb2wgaXNBZGRyZXNzT2ZWYXJpYWJsZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRJbnRyaW5zaWNJRCgpICE9IEludHJpbnNpYzo6ZGJnX3ZhbHVlOworICAgIH0KKworICAgIERJTG9jYWxWYXJpYWJsZSAqZ2V0VmFyaWFibGUoKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxESUxvY2FsVmFyaWFibGU+KGdldFJhd1ZhcmlhYmxlKCkpOworICAgIH0KKworICAgIERJRXhwcmVzc2lvbiAqZ2V0RXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjYXN0PERJRXhwcmVzc2lvbj4oZ2V0UmF3RXhwcmVzc2lvbigpKTsKKyAgICB9CisKKyAgICBNZXRhZGF0YSAqZ2V0UmF3VmFyaWFibGUoKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxNZXRhZGF0YUFzVmFsdWU+KGdldEFyZ09wZXJhbmQoMSkpLT5nZXRNZXRhZGF0YSgpOworICAgIH0KKworICAgIE1ldGFkYXRhICpnZXRSYXdFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8TWV0YWRhdGFBc1ZhbHVlPihnZXRBcmdPcGVyYW5kKDIpKS0+Z2V0TWV0YWRhdGEoKTsKKyAgICB9CisKKyAgICAvLy8gXG5hbWUgQ2FzdGluZyBtZXRob2RzCisgICAgLy8vIEB7CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICBzd2l0Y2ggKEktPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICAgIGNhc2UgSW50cmluc2ljOjpkYmdfZGVjbGFyZToKKyAgICAgIGNhc2UgSW50cmluc2ljOjpkYmdfdmFsdWU6CisgICAgICBjYXNlIEludHJpbnNpYzo6ZGJnX2FkZHI6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICAgIC8vLyBAfQorICB9OworCisgIC8vLyBUaGlzIHJlcHJlc2VudHMgdGhlIGxsdm0uZGJnLmRlY2xhcmUgaW5zdHJ1Y3Rpb24uCisgIGNsYXNzIERiZ0RlY2xhcmVJbnN0IDogcHVibGljIERiZ0luZm9JbnRyaW5zaWMgeworICBwdWJsaWM6CisgICAgVmFsdWUgKmdldEFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBnZXRWYXJpYWJsZUxvY2F0aW9uKCk7IH0KKworICAgIC8vLyBcbmFtZSBDYXN0aW5nIG1ldGhvZHMKKyAgICAvLy8gQHsKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHJldHVybiBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6ZGJnX2RlY2xhcmU7CisgICAgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIHJldHVybiBpc2E8SW50cmluc2ljSW5zdD4oVikgJiYgY2xhc3NvZihjYXN0PEludHJpbnNpY0luc3Q+KFYpKTsKKyAgICB9CisgICAgLy8vIEB9CisgIH07CisKKyAgLy8vIFRoaXMgcmVwcmVzZW50cyB0aGUgbGx2bS5kYmcuYWRkciBpbnN0cnVjdGlvbi4KKyAgY2xhc3MgRGJnQWRkckludHJpbnNpYyA6IHB1YmxpYyBEYmdJbmZvSW50cmluc2ljIHsKKyAgcHVibGljOgorICAgIFZhbHVlICpnZXRBZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gZ2V0VmFyaWFibGVMb2NhdGlvbigpOyB9CisKKyAgICAvLy8gXG5hbWUgQ2FzdGluZyBtZXRob2RzCisgICAgLy8vIEB7CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICByZXR1cm4gSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6OmRiZ19hZGRyOworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIHJlcHJlc2VudHMgdGhlIGxsdm0uZGJnLnZhbHVlIGluc3RydWN0aW9uLgorICBjbGFzcyBEYmdWYWx1ZUluc3QgOiBwdWJsaWMgRGJnSW5mb0ludHJpbnNpYyB7CisgIHB1YmxpYzoKKyAgICBWYWx1ZSAqZ2V0VmFsdWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0VmFyaWFibGVMb2NhdGlvbigvKiBBbGxvd051bGxPcCA9ICovIGZhbHNlKTsKKyAgICB9CisKKyAgICAvLy8gXG5hbWUgQ2FzdGluZyBtZXRob2RzCisgICAgLy8vIEB7CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICByZXR1cm4gSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6OmRiZ192YWx1ZTsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKyAgICAvLy8gQH0KKyAgfTsKKworICAvLy8gVGhpcyBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3MgZm9yIGNvbnN0cmFpbmVkIGZsb2F0aW5nIHBvaW50IGludHJpbnNpY3MuCisgIGNsYXNzIENvbnN0cmFpbmVkRlBJbnRyaW5zaWMgOiBwdWJsaWMgSW50cmluc2ljSW5zdCB7CisgIHB1YmxpYzoKKyAgICBlbnVtIFJvdW5kaW5nTW9kZSB7CisgICAgICBybUludmFsaWQsCisgICAgICBybUR5bmFtaWMsCisgICAgICBybVRvTmVhcmVzdCwKKyAgICAgIHJtRG93bndhcmQsCisgICAgICBybVVwd2FyZCwKKyAgICAgIHJtVG93YXJkWmVybworICAgIH07CisKKyAgICBlbnVtIEV4Y2VwdGlvbkJlaGF2aW9yIHsKKyAgICAgIGViSW52YWxpZCwKKyAgICAgIGViSWdub3JlLAorICAgICAgZWJNYXlUcmFwLAorICAgICAgZWJTdHJpY3QKKyAgICB9OworCisgICAgYm9vbCBpc1VuYXJ5T3AoKSBjb25zdDsKKyAgICBib29sIGlzVGVybmFyeU9wKCkgY29uc3Q7CisgICAgUm91bmRpbmdNb2RlIGdldFJvdW5kaW5nTW9kZSgpIGNvbnN0OworICAgIEV4Y2VwdGlvbkJlaGF2aW9yIGdldEV4Y2VwdGlvbkJlaGF2aW9yKCkgY29uc3Q7CisKKyAgICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgICAgc3dpdGNoIChJLT5nZXRJbnRyaW5zaWNJRCgpKSB7CisgICAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2ZhZGQ6CisgICAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2ZzdWI6CisgICAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2ZtdWw6CisgICAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2ZkaXY6CisgICAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2ZyZW06CisgICAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2ZtYToKKyAgICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfY29uc3RyYWluZWRfc3FydDoKKyAgICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfY29uc3RyYWluZWRfcG93OgorICAgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9wb3dpOgorICAgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9zaW46CisgICAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2NvczoKKyAgICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfY29uc3RyYWluZWRfZXhwOgorICAgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9leHAyOgorICAgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9sb2c6CisgICAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2xvZzEwOgorICAgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9sb2cyOgorICAgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9yaW50OgorICAgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9uZWFyYnlpbnQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICB9OworCisgIC8vLyBDb21tb24gYmFzZSBjbGFzcyBmb3IgYWxsIG1lbW9yeSBpbnRyaW5zaWNzLiBTaW1wbHkgcHJvdmlkZXMKKyAgLy8vIGNvbW1vbiBtZXRob2RzLgorICAvLy8gV3JpdHRlbiBhcyBDUlRQIHRvIGF2b2lkIGEgY29tbW9uIGJhc2UgY2xhc3MgYW1vbmdzdCB0aGUKKyAgLy8vIHRocmVlIGF0b21pY2l0eSBoaWVyYXJjaGllcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIE1lbUludHJpbnNpY0Jhc2UgOiBwdWJsaWMgSW50cmluc2ljSW5zdCB7CisgIHByaXZhdGU6CisgICAgZW51bSB7IEFSR19ERVNUID0gMCwgQVJHX0xFTkdUSCA9IDIgfTsKKworICBwdWJsaWM6CisgICAgVmFsdWUgKmdldFJhd0Rlc3QoKSBjb25zdCB7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSAqPihnZXRBcmdPcGVyYW5kKEFSR19ERVNUKSk7CisgICAgfQorICAgIGNvbnN0IFVzZSAmZ2V0UmF3RGVzdFVzZSgpIGNvbnN0IHsgcmV0dXJuIGdldEFyZ09wZXJhbmRVc2UoQVJHX0RFU1QpOyB9CisgICAgVXNlICZnZXRSYXdEZXN0VXNlKCkgeyByZXR1cm4gZ2V0QXJnT3BlcmFuZFVzZShBUkdfREVTVCk7IH0KKworICAgIFZhbHVlICpnZXRMZW5ndGgoKSBjb25zdCB7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSAqPihnZXRBcmdPcGVyYW5kKEFSR19MRU5HVEgpKTsKKyAgICB9CisgICAgY29uc3QgVXNlICZnZXRMZW5ndGhVc2UoKSBjb25zdCB7IHJldHVybiBnZXRBcmdPcGVyYW5kVXNlKEFSR19MRU5HVEgpOyB9CisgICAgVXNlICZnZXRMZW5ndGhVc2UoKSB7IHJldHVybiBnZXRBcmdPcGVyYW5kVXNlKEFSR19MRU5HVEgpOyB9CisKKyAgICAvLy8gVGhpcyBpcyBqdXN0IGxpa2UgZ2V0UmF3RGVzdCwgYnV0IGl0IHN0cmlwcyBvZmYgYW55IGNhc3QKKyAgICAvLy8gaW5zdHJ1Y3Rpb25zIChpbmNsdWRpbmcgYWRkcnNwYWNlY2FzdCkgdGhhdCBmZWVkIGl0LCBnaXZpbmcgdGhlCisgICAgLy8vIG9yaWdpbmFsIGlucHV0LiAgVGhlIHJldHVybmVkIHZhbHVlIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBwb2ludGVyLgorICAgIFZhbHVlICpnZXREZXN0KCkgY29uc3QgeyByZXR1cm4gZ2V0UmF3RGVzdCgpLT5zdHJpcFBvaW50ZXJDYXN0cygpOyB9CisKKyAgICB1bnNpZ25lZCBnZXREZXN0QWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8UG9pbnRlclR5cGU+KGdldFJhd0Rlc3QoKS0+Z2V0VHlwZSgpKS0+Z2V0QWRkcmVzc1NwYWNlKCk7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0RGVzdEFsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIGdldFBhcmFtQWxpZ25tZW50KEFSR19ERVNUKTsgfQorCisgICAgLy8vIFNldCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgdm9pZCBzZXREZXN0KFZhbHVlICpQdHIpIHsKKyAgICAgIGFzc2VydChnZXRSYXdEZXN0KCktPmdldFR5cGUoKSA9PSBQdHItPmdldFR5cGUoKSAmJgorICAgICAgICAgICAgICJzZXREZXN0IGNhbGxlZCB3aXRoIHBvaW50ZXIgb2Ygd3JvbmcgdHlwZSEiKTsKKyAgICAgIHNldEFyZ09wZXJhbmQoQVJHX0RFU1QsIFB0cik7CisgICAgfQorCisgICAgdm9pZCBzZXREZXN0QWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKSB7CisgICAgICByZW1vdmVQYXJhbUF0dHIoQVJHX0RFU1QsIEF0dHJpYnV0ZTo6QWxpZ25tZW50KTsKKyAgICAgIGlmIChBbGlnbiA+IDApCisgICAgICAgIGFkZFBhcmFtQXR0cihBUkdfREVTVCwKKyAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZTo6Z2V0V2l0aEFsaWdubWVudChnZXRDb250ZXh0KCksIEFsaWduKSk7CisgICAgfQorCisgICAgdm9pZCBzZXRMZW5ndGgoVmFsdWUgKkwpIHsKKyAgICAgIGFzc2VydChnZXRMZW5ndGgoKS0+Z2V0VHlwZSgpID09IEwtPmdldFR5cGUoKSAmJgorICAgICAgICAgICAgICJzZXRMZW5ndGggY2FsbGVkIHdpdGggdmFsdWUgb2Ygd3JvbmcgdHlwZSEiKTsKKyAgICAgIHNldEFyZ09wZXJhbmQoQVJHX0xFTkdUSCwgTCk7CisgICAgfQorICB9OworCisgIC8vIFRoZSBjb21tb24gYmFzZSBjbGFzcyBmb3IgdGhlIGF0b21pYyBtZW1zZXQvbWVtbW92ZS9tZW1jcHkgaW50cmluc2ljcworICAvLyBpLmUuIGxsdm0uZWxlbWVudC51bm9yZGVyZWQuYXRvbWljLm1lbXNldC9tZW1jcHkvbWVtbW92ZQorICBjbGFzcyBBdG9taWNNZW1JbnRyaW5zaWMgOiBwdWJsaWMgTWVtSW50cmluc2ljQmFzZTxBdG9taWNNZW1JbnRyaW5zaWM+IHsKKyAgcHJpdmF0ZToKKyAgICBlbnVtIHsgQVJHX0VMRU1FTlRTSVpFID0gMyB9OworCisgIHB1YmxpYzoKKyAgICBWYWx1ZSAqZ2V0UmF3RWxlbWVudFNpemVJbkJ5dGVzKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUgKj4oZ2V0QXJnT3BlcmFuZChBUkdfRUxFTUVOVFNJWkUpKTsKKyAgICB9CisKKyAgICBDb25zdGFudEludCAqZ2V0RWxlbWVudFNpemVJbkJ5dGVzQ3N0KCkgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnRJbnQ+KGdldFJhd0VsZW1lbnRTaXplSW5CeXRlcygpKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRFbGVtZW50U2l6ZUluQnl0ZXMoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0RWxlbWVudFNpemVJbkJ5dGVzQ3N0KCktPmdldFpFeHRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgc2V0RWxlbWVudFNpemVJbkJ5dGVzKENvbnN0YW50ICpWKSB7CisgICAgICBhc3NlcnQoVi0+Z2V0VHlwZSgpID09IFR5cGU6OmdldEludDhUeShnZXRDb250ZXh0KCkpICYmCisgICAgICAgICAgICAgInNldEVsZW1lbnRTaXplSW5CeXRlcyBjYWxsZWQgd2l0aCB2YWx1ZSBvZiB3cm9uZyB0eXBlISIpOworICAgICAgc2V0QXJnT3BlcmFuZChBUkdfRUxFTUVOVFNJWkUsIFYpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgICAgc3dpdGNoIChJLT5nZXRJbnRyaW5zaWNJRCgpKSB7CisgICAgICBjYXNlIEludHJpbnNpYzo6bWVtY3B5X2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pYzoKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1tb3ZlX2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pYzoKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1zZXRfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGF0b21pYyBtZW1zZXQgaW50cmluc2ljCisgIC8vIGkuZS4gbGx2bS5lbGVtZW50LnVub3JkZXJlZC5hdG9taWMubWVtc2V0CisgIGNsYXNzIEF0b21pY01lbVNldEluc3QgOiBwdWJsaWMgQXRvbWljTWVtSW50cmluc2ljIHsKKyAgcHJpdmF0ZToKKyAgICBlbnVtIHsgQVJHX1ZBTFVFID0gMSB9OworCisgIHB1YmxpYzoKKyAgICBWYWx1ZSAqZ2V0VmFsdWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSAqPihnZXRBcmdPcGVyYW5kKEFSR19WQUxVRSkpOworICAgIH0KKyAgICBjb25zdCBVc2UgJmdldFZhbHVlVXNlKCkgY29uc3QgeyByZXR1cm4gZ2V0QXJnT3BlcmFuZFVzZShBUkdfVkFMVUUpOyB9CisgICAgVXNlICZnZXRWYWx1ZVVzZSgpIHsgcmV0dXJuIGdldEFyZ09wZXJhbmRVc2UoQVJHX1ZBTFVFKTsgfQorCisgICAgdm9pZCBzZXRWYWx1ZShWYWx1ZSAqVmFsKSB7CisgICAgICBhc3NlcnQoZ2V0VmFsdWUoKS0+Z2V0VHlwZSgpID09IFZhbC0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICAgInNldFZhbHVlIGNhbGxlZCB3aXRoIHZhbHVlIG9mIHdyb25nIHR5cGUhIik7CisgICAgICBzZXRBcmdPcGVyYW5kKEFSR19WQUxVRSwgVmFsKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHJldHVybiBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6bWVtc2V0X2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pYzsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKyAgfTsKKworICAvLyBUaGlzIGNsYXNzIHdyYXBzIHRoZSBhdG9taWMgbWVtY3B5L21lbW1vdmUgaW50cmluc2ljcworICAvLyBpLmUuIGxsdm0uZWxlbWVudC51bm9yZGVyZWQuYXRvbWljLm1lbWNweS9tZW1tb3ZlCisgIGNsYXNzIEF0b21pY01lbVRyYW5zZmVySW5zdCA6IHB1YmxpYyBBdG9taWNNZW1JbnRyaW5zaWMgeworICBwcml2YXRlOgorICAgIGVudW0geyBBUkdfU09VUkNFID0gMSB9OworCisgIHB1YmxpYzoKKyAgICAvLy8gUmV0dXJuIHRoZSBhcmd1bWVudHMgdG8gdGhlIGluc3RydWN0aW9uLgorICAgIFZhbHVlICpnZXRSYXdTb3VyY2UoKSBjb25zdCB7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSAqPihnZXRBcmdPcGVyYW5kKEFSR19TT1VSQ0UpKTsKKyAgICB9CisgICAgY29uc3QgVXNlICZnZXRSYXdTb3VyY2VVc2UoKSBjb25zdCB7IHJldHVybiBnZXRBcmdPcGVyYW5kVXNlKEFSR19TT1VSQ0UpOyB9CisgICAgVXNlICZnZXRSYXdTb3VyY2VVc2UoKSB7IHJldHVybiBnZXRBcmdPcGVyYW5kVXNlKEFSR19TT1VSQ0UpOyB9CisKKyAgICAvLy8gVGhpcyBpcyBqdXN0IGxpa2UgZ2V0UmF3U291cmNlLCBidXQgaXQgc3RyaXBzIG9mZiBhbnkgY2FzdAorICAgIC8vLyBpbnN0cnVjdGlvbnMgdGhhdCBmZWVkIGl0LCBnaXZpbmcgdGhlIG9yaWdpbmFsIGlucHV0LiAgVGhlIHJldHVybmVkCisgICAgLy8vIHZhbHVlIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBwb2ludGVyLgorICAgIFZhbHVlICpnZXRTb3VyY2UoKSBjb25zdCB7IHJldHVybiBnZXRSYXdTb3VyY2UoKS0+c3RyaXBQb2ludGVyQ2FzdHMoKTsgfQorCisgICAgdW5zaWduZWQgZ2V0U291cmNlQWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8UG9pbnRlclR5cGU+KGdldFJhd1NvdXJjZSgpLT5nZXRUeXBlKCkpLT5nZXRBZGRyZXNzU3BhY2UoKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXRTb3VyY2VBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0UGFyYW1BbGlnbm1lbnQoQVJHX1NPVVJDRSk7CisgICAgfQorCisgICAgdm9pZCBzZXRTb3VyY2UoVmFsdWUgKlB0cikgeworICAgICAgYXNzZXJ0KGdldFJhd1NvdXJjZSgpLT5nZXRUeXBlKCkgPT0gUHRyLT5nZXRUeXBlKCkgJiYKKyAgICAgICAgICAgICAic2V0U291cmNlIGNhbGxlZCB3aXRoIHBvaW50ZXIgb2Ygd3JvbmcgdHlwZSEiKTsKKyAgICAgIHNldEFyZ09wZXJhbmQoQVJHX1NPVVJDRSwgUHRyKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFNvdXJjZUFsaWdubWVudCh1bnNpZ25lZCBBbGlnbikgeworICAgICAgcmVtb3ZlUGFyYW1BdHRyKEFSR19TT1VSQ0UsIEF0dHJpYnV0ZTo6QWxpZ25tZW50KTsKKyAgICAgIGlmIChBbGlnbiA+IDApCisgICAgICAgIGFkZFBhcmFtQXR0cihBUkdfU09VUkNFLAorICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlOjpnZXRXaXRoQWxpZ25tZW50KGdldENvbnRleHQoKSwgQWxpZ24pKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHN3aXRjaCAoSS0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbWNweV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWM6CisgICAgICBjYXNlIEludHJpbnNpYzo6bWVtbW92ZV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWM6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGF0b21pYyBtZW1jcHkgaW50cmluc2ljCisgIC8vLyBpLmUuIGxsdm0uZWxlbWVudC51bm9yZGVyZWQuYXRvbWljLm1lbWNweQorICBjbGFzcyBBdG9taWNNZW1DcHlJbnN0IDogcHVibGljIEF0b21pY01lbVRyYW5zZmVySW5zdCB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHJldHVybiBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6bWVtY3B5X2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pYzsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBhdG9taWMgbWVtbW92ZSBpbnRyaW5zaWMKKyAgLy8vIGkuZS4gbGx2bS5lbGVtZW50LnVub3JkZXJlZC5hdG9taWMubWVtbW92ZQorICBjbGFzcyBBdG9taWNNZW1Nb3ZlSW5zdCA6IHB1YmxpYyBBdG9taWNNZW1UcmFuc2Zlckluc3QgeworICBwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICByZXR1cm4gSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6Om1lbW1vdmVfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljOworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGlzIHRoZSBjb21tb24gYmFzZSBjbGFzcyBmb3IgbWVtc2V0L21lbWNweS9tZW1tb3ZlLgorICBjbGFzcyBNZW1JbnRyaW5zaWMgOiBwdWJsaWMgTWVtSW50cmluc2ljQmFzZTxNZW1JbnRyaW5zaWM+IHsKKyAgcHJpdmF0ZToKKyAgICBlbnVtIHsgQVJHX1ZPTEFUSUxFID0gMyB9OworCisgIHB1YmxpYzoKKyAgICBDb25zdGFudEludCAqZ2V0Vm9sYXRpbGVDc3QoKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxDb25zdGFudEludD4oCisgICAgICAgICAgY29uc3RfY2FzdDxWYWx1ZSAqPihnZXRBcmdPcGVyYW5kKEFSR19WT0xBVElMRSkpKTsKKyAgICB9CisKKyAgICBib29sIGlzVm9sYXRpbGUoKSBjb25zdCB7CisgICAgICByZXR1cm4gIWdldFZvbGF0aWxlQ3N0KCktPmlzWmVybygpOworICAgIH0KKworICAgIHZvaWQgc2V0Vm9sYXRpbGUoQ29uc3RhbnQgKlYpIHsgc2V0QXJnT3BlcmFuZChBUkdfVk9MQVRJTEUsIFYpOyB9CisKKyAgICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgICAgc3dpdGNoIChJLT5nZXRJbnRyaW5zaWNJRCgpKSB7CisgICAgICBjYXNlIEludHJpbnNpYzo6bWVtY3B5OgorICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbW1vdmU6CisgICAgICBjYXNlIEludHJpbnNpYzo6bWVtc2V0OgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBjbGFzcyB3cmFwcyB0aGUgbGx2bS5tZW1zZXQgaW50cmluc2ljLgorICBjbGFzcyBNZW1TZXRJbnN0IDogcHVibGljIE1lbUludHJpbnNpYyB7CisgIHB1YmxpYzoKKyAgICAvLy8gUmV0dXJuIHRoZSBhcmd1bWVudHMgdG8gdGhlIGluc3RydWN0aW9uLgorICAgIFZhbHVlICpnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUqPihnZXRBcmdPcGVyYW5kKDEpKTsgfQorICAgIGNvbnN0IFVzZSAmZ2V0VmFsdWVVc2UoKSBjb25zdCB7IHJldHVybiBnZXRBcmdPcGVyYW5kVXNlKDEpOyB9CisgICAgVXNlICZnZXRWYWx1ZVVzZSgpIHsgcmV0dXJuIGdldEFyZ09wZXJhbmRVc2UoMSk7IH0KKworICAgIHZvaWQgc2V0VmFsdWUoVmFsdWUgKlZhbCkgeworICAgICAgYXNzZXJ0KGdldFZhbHVlKCktPmdldFR5cGUoKSA9PSBWYWwtPmdldFR5cGUoKSAmJgorICAgICAgICAgICAgICJzZXRWYWx1ZSBjYWxsZWQgd2l0aCB2YWx1ZSBvZiB3cm9uZyB0eXBlISIpOworICAgICAgc2V0QXJnT3BlcmFuZCgxLCBWYWwpOworICAgIH0KKworICAgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICByZXR1cm4gSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6Om1lbXNldDsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBjbGFzcyB3cmFwcyB0aGUgbGx2bS5tZW1jcHkvbWVtbW92ZSBpbnRyaW5zaWNzLgorICBjbGFzcyBNZW1UcmFuc2Zlckluc3QgOiBwdWJsaWMgTWVtSW50cmluc2ljIHsKKyAgcHJpdmF0ZToKKyAgICBlbnVtIHsgQVJHX1NPVVJDRSA9IDEgfTsKKworICBwdWJsaWM6CisgICAgLy8vIFJldHVybiB0aGUgYXJndW1lbnRzIHRvIHRoZSBpbnN0cnVjdGlvbi4KKyAgICBWYWx1ZSAqZ2V0UmF3U291cmNlKCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSo+KGdldEFyZ09wZXJhbmQoQVJHX1NPVVJDRSkpOyB9CisgICAgY29uc3QgVXNlICZnZXRSYXdTb3VyY2VVc2UoKSBjb25zdCB7IHJldHVybiBnZXRBcmdPcGVyYW5kVXNlKEFSR19TT1VSQ0UpOyB9CisgICAgVXNlICZnZXRSYXdTb3VyY2VVc2UoKSB7IHJldHVybiBnZXRBcmdPcGVyYW5kVXNlKEFSR19TT1VSQ0UpOyB9CisKKyAgICAvLy8gVGhpcyBpcyBqdXN0IGxpa2UgZ2V0UmF3U291cmNlLCBidXQgaXQgc3RyaXBzIG9mZiBhbnkgY2FzdAorICAgIC8vLyBpbnN0cnVjdGlvbnMgdGhhdCBmZWVkIGl0LCBnaXZpbmcgdGhlIG9yaWdpbmFsIGlucHV0LiAgVGhlIHJldHVybmVkCisgICAgLy8vIHZhbHVlIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBwb2ludGVyLgorICAgIFZhbHVlICpnZXRTb3VyY2UoKSBjb25zdCB7IHJldHVybiBnZXRSYXdTb3VyY2UoKS0+c3RyaXBQb2ludGVyQ2FzdHMoKTsgfQorCisgICAgdW5zaWduZWQgZ2V0U291cmNlQWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8UG9pbnRlclR5cGU+KGdldFJhd1NvdXJjZSgpLT5nZXRUeXBlKCkpLT5nZXRBZGRyZXNzU3BhY2UoKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXRTb3VyY2VBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0UGFyYW1BbGlnbm1lbnQoQVJHX1NPVVJDRSk7CisgICAgfQorCisgICAgdm9pZCBzZXRTb3VyY2UoVmFsdWUgKlB0cikgeworICAgICAgYXNzZXJ0KGdldFJhd1NvdXJjZSgpLT5nZXRUeXBlKCkgPT0gUHRyLT5nZXRUeXBlKCkgJiYKKyAgICAgICAgICAgICAic2V0U291cmNlIGNhbGxlZCB3aXRoIHBvaW50ZXIgb2Ygd3JvbmcgdHlwZSEiKTsKKyAgICAgIHNldEFyZ09wZXJhbmQoQVJHX1NPVVJDRSwgUHRyKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFNvdXJjZUFsaWdubWVudCh1bnNpZ25lZCBBbGlnbikgeworICAgICAgcmVtb3ZlUGFyYW1BdHRyKEFSR19TT1VSQ0UsIEF0dHJpYnV0ZTo6QWxpZ25tZW50KTsKKyAgICAgIGlmIChBbGlnbiA+IDApCisgICAgICAgIGFkZFBhcmFtQXR0cihBUkdfU09VUkNFLAorICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlOjpnZXRXaXRoQWxpZ25tZW50KGdldENvbnRleHQoKSwgQWxpZ24pKTsKKyAgICB9CisKKyAgICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgICAgcmV0dXJuIEktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjptZW1jcHkgfHwKKyAgICAgICAgICAgICBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6bWVtbW92ZTsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBjbGFzcyB3cmFwcyB0aGUgbGx2bS5tZW1jcHkgaW50cmluc2ljLgorICBjbGFzcyBNZW1DcHlJbnN0IDogcHVibGljIE1lbVRyYW5zZmVySW5zdCB7CisgIHB1YmxpYzoKKyAgICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgICAgcmV0dXJuIEktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjptZW1jcHk7CisgICAgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIHJldHVybiBpc2E8SW50cmluc2ljSW5zdD4oVikgJiYgY2xhc3NvZihjYXN0PEludHJpbnNpY0luc3Q+KFYpKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFRoaXMgY2xhc3Mgd3JhcHMgdGhlIGxsdm0ubWVtbW92ZSBpbnRyaW5zaWMuCisgIGNsYXNzIE1lbU1vdmVJbnN0IDogcHVibGljIE1lbVRyYW5zZmVySW5zdCB7CisgIHB1YmxpYzoKKyAgICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgICAgcmV0dXJuIEktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjptZW1tb3ZlOworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICB9OworCisgIC8vIFRoZSBjb21tb24gYmFzZSBjbGFzcyBmb3IgYW55IG1lbXNldC9tZW1tb3ZlL21lbWNweSBpbnRyaW5zaWNzOworICAvLyB3aGV0aGVyIHRoZXkgYmUgYXRvbWljIG9yIG5vbi1hdG9taWMuCisgIC8vIGkuZS4gbGx2bS5lbGVtZW50LnVub3JkZXJlZC5hdG9taWMubWVtc2V0L21lbWNweS9tZW1tb3ZlCisgIC8vICBhbmQgbGx2bS5tZW1zZXQvbWVtY3B5L21lbW1vdmUKKyAgY2xhc3MgQW55TWVtSW50cmluc2ljIDogcHVibGljIE1lbUludHJpbnNpY0Jhc2U8QW55TWVtSW50cmluc2ljPiB7CisgIHB1YmxpYzoKKyAgICBib29sIGlzVm9sYXRpbGUoKSBjb25zdCB7CisgICAgICAvLyBPbmx5IHRoZSBub24tYXRvbWljIGludHJpbnNpY3MgY2FuIGJlIHZvbGF0aWxlCisgICAgICBpZiAoYXV0byAqTUkgPSBkeW5fY2FzdDxNZW1JbnRyaW5zaWM+KHRoaXMpKQorICAgICAgICByZXR1cm4gTUktPmlzVm9sYXRpbGUoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHN3aXRjaCAoSS0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbWNweToKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1tb3ZlOgorICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbXNldDoKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1jcHlfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljOgorICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbW1vdmVfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljOgorICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbXNldF9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWM6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW55IG1lbXNldCBpbnRyaW5zaWMKKyAgLy8gaS5lLiBsbHZtLmVsZW1lbnQudW5vcmRlcmVkLmF0b21pYy5tZW1zZXQKKyAgLy8gYW5kICBsbHZtLm1lbXNldAorICBjbGFzcyBBbnlNZW1TZXRJbnN0IDogcHVibGljIEFueU1lbUludHJpbnNpYyB7CisgIHByaXZhdGU6CisgICAgZW51bSB7IEFSR19WQUxVRSA9IDEgfTsKKworICBwdWJsaWM6CisgICAgVmFsdWUgKmdldFZhbHVlKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUgKj4oZ2V0QXJnT3BlcmFuZChBUkdfVkFMVUUpKTsKKyAgICB9CisgICAgY29uc3QgVXNlICZnZXRWYWx1ZVVzZSgpIGNvbnN0IHsgcmV0dXJuIGdldEFyZ09wZXJhbmRVc2UoQVJHX1ZBTFVFKTsgfQorICAgIFVzZSAmZ2V0VmFsdWVVc2UoKSB7IHJldHVybiBnZXRBcmdPcGVyYW5kVXNlKEFSR19WQUxVRSk7IH0KKworICAgIHZvaWQgc2V0VmFsdWUoVmFsdWUgKlZhbCkgeworICAgICAgYXNzZXJ0KGdldFZhbHVlKCktPmdldFR5cGUoKSA9PSBWYWwtPmdldFR5cGUoKSAmJgorICAgICAgICAgICAgICJzZXRWYWx1ZSBjYWxsZWQgd2l0aCB2YWx1ZSBvZiB3cm9uZyB0eXBlISIpOworICAgICAgc2V0QXJnT3BlcmFuZChBUkdfVkFMVUUsIFZhbCk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICBzd2l0Y2ggKEktPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1zZXQ6CisgICAgICBjYXNlIEludHJpbnNpYzo6bWVtc2V0X2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pYzoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIHJldHVybiBpc2E8SW50cmluc2ljSW5zdD4oVikgJiYgY2xhc3NvZihjYXN0PEludHJpbnNpY0luc3Q+KFYpKTsKKyAgICB9CisgIH07CisKKyAgLy8gVGhpcyBjbGFzcyB3cmFwcyBhbnkgbWVtY3B5L21lbW1vdmUgaW50cmluc2ljcworICAvLyBpLmUuIGxsdm0uZWxlbWVudC51bm9yZGVyZWQuYXRvbWljLm1lbWNweS9tZW1tb3ZlCisgIC8vIGFuZCAgbGx2bS5tZW1jcHkvbWVtbW92ZQorICBjbGFzcyBBbnlNZW1UcmFuc2Zlckluc3QgOiBwdWJsaWMgQW55TWVtSW50cmluc2ljIHsKKyAgcHJpdmF0ZToKKyAgICBlbnVtIHsgQVJHX1NPVVJDRSA9IDEgfTsKKworICBwdWJsaWM6CisgICAgLy8vIFJldHVybiB0aGUgYXJndW1lbnRzIHRvIHRoZSBpbnN0cnVjdGlvbi4KKyAgICBWYWx1ZSAqZ2V0UmF3U291cmNlKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUgKj4oZ2V0QXJnT3BlcmFuZChBUkdfU09VUkNFKSk7CisgICAgfQorICAgIGNvbnN0IFVzZSAmZ2V0UmF3U291cmNlVXNlKCkgY29uc3QgeyByZXR1cm4gZ2V0QXJnT3BlcmFuZFVzZShBUkdfU09VUkNFKTsgfQorICAgIFVzZSAmZ2V0UmF3U291cmNlVXNlKCkgeyByZXR1cm4gZ2V0QXJnT3BlcmFuZFVzZShBUkdfU09VUkNFKTsgfQorCisgICAgLy8vIFRoaXMgaXMganVzdCBsaWtlIGdldFJhd1NvdXJjZSwgYnV0IGl0IHN0cmlwcyBvZmYgYW55IGNhc3QKKyAgICAvLy8gaW5zdHJ1Y3Rpb25zIHRoYXQgZmVlZCBpdCwgZ2l2aW5nIHRoZSBvcmlnaW5hbCBpbnB1dC4gIFRoZSByZXR1cm5lZAorICAgIC8vLyB2YWx1ZSBpcyBndWFyYW50ZWVkIHRvIGJlIGEgcG9pbnRlci4KKyAgICBWYWx1ZSAqZ2V0U291cmNlKCkgY29uc3QgeyByZXR1cm4gZ2V0UmF3U291cmNlKCktPnN0cmlwUG9pbnRlckNhc3RzKCk7IH0KKworICAgIHVuc2lnbmVkIGdldFNvdXJjZUFkZHJlc3NTcGFjZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjYXN0PFBvaW50ZXJUeXBlPihnZXRSYXdTb3VyY2UoKS0+Z2V0VHlwZSgpKS0+Z2V0QWRkcmVzc1NwYWNlKCk7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0U291cmNlQWxpZ25tZW50KCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFBhcmFtQWxpZ25tZW50KEFSR19TT1VSQ0UpOworICAgIH0KKworICAgIHZvaWQgc2V0U291cmNlKFZhbHVlICpQdHIpIHsKKyAgICAgIGFzc2VydChnZXRSYXdTb3VyY2UoKS0+Z2V0VHlwZSgpID09IFB0ci0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICAgInNldFNvdXJjZSBjYWxsZWQgd2l0aCBwb2ludGVyIG9mIHdyb25nIHR5cGUhIik7CisgICAgICBzZXRBcmdPcGVyYW5kKEFSR19TT1VSQ0UsIFB0cik7CisgICAgfQorCisgICAgdm9pZCBzZXRTb3VyY2VBbGlnbm1lbnQodW5zaWduZWQgQWxpZ24pIHsKKyAgICAgIHJlbW92ZVBhcmFtQXR0cihBUkdfU09VUkNFLCBBdHRyaWJ1dGU6OkFsaWdubWVudCk7CisgICAgICBpZiAoQWxpZ24gPiAwKQorICAgICAgICBhZGRQYXJhbUF0dHIoQVJHX1NPVVJDRSwKKyAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZTo6Z2V0V2l0aEFsaWdubWVudChnZXRDb250ZXh0KCksIEFsaWduKSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICBzd2l0Y2ggKEktPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1jcHk6CisgICAgICBjYXNlIEludHJpbnNpYzo6bWVtbW92ZToKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1jcHlfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljOgorICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbW1vdmVfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGFueSBtZW1jcHkgaW50cmluc2ljCisgIC8vLyBpLmUuIGxsdm0uZWxlbWVudC51bm9yZGVyZWQuYXRvbWljLm1lbWNweQorICAvLy8gIGFuZCBsbHZtLm1lbWNweQorICBjbGFzcyBBbnlNZW1DcHlJbnN0IDogcHVibGljIEFueU1lbVRyYW5zZmVySW5zdCB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHN3aXRjaCAoSS0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbWNweToKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1jcHlfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGFueSBtZW1tb3ZlIGludHJpbnNpYworICAvLy8gaS5lLiBsbHZtLmVsZW1lbnQudW5vcmRlcmVkLmF0b21pYy5tZW1tb3ZlCisgIC8vLyAgYW5kIGxsdm0ubWVtbW92ZQorICBjbGFzcyBBbnlNZW1Nb3ZlSW5zdCA6IHB1YmxpYyBBbnlNZW1UcmFuc2Zlckluc3QgeworICBwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICBzd2l0Y2ggKEktPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1tb3ZlOgorICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbW1vdmVfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyByZXByZXNlbnRzIHRoZSBsbHZtLnZhX3N0YXJ0IGludHJpbnNpYy4KKyAgY2xhc3MgVkFTdGFydEluc3QgOiBwdWJsaWMgSW50cmluc2ljSW5zdCB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHJldHVybiBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6dmFzdGFydDsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKworICAgIFZhbHVlICpnZXRBcmdMaXN0KCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSo+KGdldEFyZ09wZXJhbmQoMCkpOyB9CisgIH07CisKKyAgLy8vIFRoaXMgcmVwcmVzZW50cyB0aGUgbGx2bS52YV9lbmQgaW50cmluc2ljLgorICBjbGFzcyBWQUVuZEluc3QgOiBwdWJsaWMgSW50cmluc2ljSW5zdCB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHJldHVybiBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6dmFlbmQ7CisgICAgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIHJldHVybiBpc2E8SW50cmluc2ljSW5zdD4oVikgJiYgY2xhc3NvZihjYXN0PEludHJpbnNpY0luc3Q+KFYpKTsKKyAgICB9CisKKyAgICBWYWx1ZSAqZ2V0QXJnTGlzdCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUqPihnZXRBcmdPcGVyYW5kKDApKTsgfQorICB9OworCisgIC8vLyBUaGlzIHJlcHJlc2VudHMgdGhlIGxsdm0udmFfY29weSBpbnRyaW5zaWMuCisgIGNsYXNzIFZBQ29weUluc3QgOiBwdWJsaWMgSW50cmluc2ljSW5zdCB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHJldHVybiBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6dmFjb3B5OworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorCisgICAgVmFsdWUgKmdldERlc3QoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PFZhbHVlKj4oZ2V0QXJnT3BlcmFuZCgwKSk7IH0KKyAgICBWYWx1ZSAqZ2V0U3JjKCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSo+KGdldEFyZ09wZXJhbmQoMSkpOyB9CisgIH07CisKKyAgLy8vIFRoaXMgcmVwcmVzZW50cyB0aGUgbGx2bS5pbnN0cnByb2ZfaW5jcmVtZW50IGludHJpbnNpYy4KKyAgY2xhc3MgSW5zdHJQcm9mSW5jcmVtZW50SW5zdCA6IHB1YmxpYyBJbnRyaW5zaWNJbnN0IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgICAgcmV0dXJuIEktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjppbnN0cnByb2ZfaW5jcmVtZW50OworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorCisgICAgR2xvYmFsVmFyaWFibGUgKmdldE5hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxHbG9iYWxWYXJpYWJsZT4oCisgICAgICAgICAgY29uc3RfY2FzdDxWYWx1ZSAqPihnZXRBcmdPcGVyYW5kKDApKS0+c3RyaXBQb2ludGVyQ2FzdHMoKSk7CisgICAgfQorCisgICAgQ29uc3RhbnRJbnQgKmdldEhhc2goKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxDb25zdGFudEludD4oY29uc3RfY2FzdDxWYWx1ZSAqPihnZXRBcmdPcGVyYW5kKDEpKSk7CisgICAgfQorCisgICAgQ29uc3RhbnRJbnQgKmdldE51bUNvdW50ZXJzKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnRJbnQ+KGNvbnN0X2Nhc3Q8VmFsdWUgKj4oZ2V0QXJnT3BlcmFuZCgyKSkpOworICAgIH0KKworICAgIENvbnN0YW50SW50ICpnZXRJbmRleCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjYXN0PENvbnN0YW50SW50Pihjb25zdF9jYXN0PFZhbHVlICo+KGdldEFyZ09wZXJhbmQoMykpKTsKKyAgICB9CisKKyAgICBWYWx1ZSAqZ2V0U3RlcCgpIGNvbnN0OworICB9OworCisgIGNsYXNzIEluc3RyUHJvZkluY3JlbWVudEluc3RTdGVwIDogcHVibGljIEluc3RyUHJvZkluY3JlbWVudEluc3QgeworICBwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICByZXR1cm4gSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6Omluc3RycHJvZl9pbmNyZW1lbnRfc3RlcDsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyByZXByZXNlbnRzIHRoZSBsbHZtLmluc3RycHJvZl92YWx1ZV9wcm9maWxlIGludHJpbnNpYy4KKyAgY2xhc3MgSW5zdHJQcm9mVmFsdWVQcm9maWxlSW5zdCA6IHB1YmxpYyBJbnRyaW5zaWNJbnN0IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgICAgcmV0dXJuIEktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjppbnN0cnByb2ZfdmFsdWVfcHJvZmlsZTsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKworICAgIEdsb2JhbFZhcmlhYmxlICpnZXROYW1lKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8R2xvYmFsVmFyaWFibGU+KAorICAgICAgICAgIGNvbnN0X2Nhc3Q8VmFsdWUgKj4oZ2V0QXJnT3BlcmFuZCgwKSktPnN0cmlwUG9pbnRlckNhc3RzKCkpOworICAgIH0KKworICAgIENvbnN0YW50SW50ICpnZXRIYXNoKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnRJbnQ+KGNvbnN0X2Nhc3Q8VmFsdWUgKj4oZ2V0QXJnT3BlcmFuZCgxKSkpOworICAgIH0KKworICAgIFZhbHVlICpnZXRUYXJnZXRWYWx1ZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjYXN0PFZhbHVlPihjb25zdF9jYXN0PFZhbHVlICo+KGdldEFyZ09wZXJhbmQoMikpKTsKKyAgICB9CisKKyAgICBDb25zdGFudEludCAqZ2V0VmFsdWVLaW5kKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnRJbnQ+KGNvbnN0X2Nhc3Q8VmFsdWUgKj4oZ2V0QXJnT3BlcmFuZCgzKSkpOworICAgIH0KKworICAgIC8vIFJldHVybnMgdGhlIHZhbHVlIHNpdGUgaW5kZXguCisgICAgQ29uc3RhbnRJbnQgKmdldEluZGV4KCkgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnRJbnQ+KGNvbnN0X2Nhc3Q8VmFsdWUgKj4oZ2V0QXJnT3BlcmFuZCg0KSkpOworICAgIH0KKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfSU5UUklOU0lDSU5TVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3MuZ2VuIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzLmdlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTE5ZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzLmdlbgpAQCAtMCwwICsxLDM2MTY5IEBACisvKj09PS0gVGFibGVHZW4nZXJhdGVkIGZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIEludHJpbnNpYyBGdW5jdGlvbiBTb3VyY2UgRnJhZ21lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZSwgZG8gbm90IGVkaXQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisvLyBWaXN1YWxTdHVkaW8gZGVmaW5lcyBzZXRqbXAgYXMgX3NldGptcAorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoc2V0am1wKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIWRlZmluZWQoc2V0am1wX3VuZGVmaW5lZF9mb3JfbXN2YykKKyMgIHByYWdtYSBwdXNoX21hY3JvKCJzZXRqbXAiKQorIyAgdW5kZWYgc2V0am1wCisjICBkZWZpbmUgc2V0am1wX3VuZGVmaW5lZF9mb3JfbXN2YworI2VuZGlmCisKKy8vIEVudW0gdmFsdWVzIGZvciBJbnRyaW5zaWNzLmgKKyNpZmRlZiBHRVRfSU5UUklOU0lDX0VOVU1fVkFMVUVTCisgICAgYWRkcmVzc29mcmV0dXJuYWRkcmVzcywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWRkcmVzc29mcmV0dXJuYWRkcmVzcworICAgIGFkanVzdF90cmFtcG9saW5lLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFkanVzdC50cmFtcG9saW5lCisgICAgYW5ub3RhdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW5ub3RhdGlvbgorICAgIGFzc3VtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFzc3VtZQorICAgIGJpdHJldmVyc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmJpdHJldmVyc2UKKyAgICBic3dhcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5ic3dhcAorICAgIGNhbm9uaWNhbGl6ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmNhbm9uaWNhbGl6ZQorICAgIGNlaWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmNlaWwKKyAgICBjbGVhcl9jYWNoZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5jbGVhcl9jYWNoZQorICAgIGNvZGV2aWV3X2Fubm90YXRpb24sICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmNvZGV2aWV3LmFubm90YXRpb24KKyAgICBjb252ZXJ0X2Zyb21fZnAxNiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5jb252ZXJ0LmZyb20uZnAxNgorICAgIGNvbnZlcnRfdG9fZnAxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmNvbnZlcnQudG8uZnAxNgorICAgIGNvcHlzaWduLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmNvcHlzaWduCisgICAgY29yb19hbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY29yby5hbGxvYworICAgIGNvcm9fYmVnaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmNvcm8uYmVnaW4KKyAgICBjb3JvX2Rlc3Ryb3ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5jb3JvLmRlc3Ryb3kKKyAgICBjb3JvX2RvbmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5jb3JvLmRvbmUKKyAgICBjb3JvX2VuZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5jb3JvLmVuZAorICAgIGNvcm9fZnJhbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmNvcm8uZnJhbWUKKyAgICBjb3JvX2ZyZWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5jb3JvLmZyZWUKKyAgICBjb3JvX2lkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5jb3JvLmlkCisgICAgY29yb19wYXJhbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY29yby5wYXJhbQorICAgIGNvcm9fcHJvbWlzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmNvcm8ucHJvbWlzZQorICAgIGNvcm9fcmVzdW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmNvcm8ucmVzdW1lCisgICAgY29yb19zYXZlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY29yby5zYXZlCisgICAgY29yb19zaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY29yby5zaXplCisgICAgY29yb19zdWJmbl9hZGRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY29yby5zdWJmbi5hZGRyCisgICAgY29yb19zdXNwZW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY29yby5zdXNwZW5kCisgICAgY29zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY29zCisgICAgY3RseiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY3RsegorICAgIGN0cG9wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmN0cG9wCisgICAgY3R0eiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY3R0egorICAgIGRiZ19hZGRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmRiZy5hZGRyCisgICAgZGJnX2RlY2xhcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZGJnLmRlY2xhcmUKKyAgICBkYmdfdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5kYmcudmFsdWUKKyAgICBkZWJ1Z3RyYXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5kZWJ1Z3RyYXAKKyAgICBkb25vdGhpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5kb25vdGhpbmcKKyAgICBlaF9kd2FyZl9jZmEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5laC5kd2FyZi5jZmEKKyAgICBlaF9leGNlcHRpb25jb2RlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5laC5leGNlcHRpb25jb2RlCisgICAgZWhfZXhjZXB0aW9ucG9pbnRlciwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZWguZXhjZXB0aW9ucG9pbnRlcgorICAgIGVoX3JldHVybl9pMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmVoLnJldHVybi5pMzIKKyAgICBlaF9yZXR1cm5faTY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5laC5yZXR1cm4uaTY0CisgICAgZWhfc2psal9jYWxsc2l0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZWguc2psai5jYWxsc2l0ZQorICAgIGVoX3NqbGpfZnVuY3Rpb25jb250ZXh0LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmVoLnNqbGouZnVuY3Rpb25jb250ZXh0CisgICAgZWhfc2psal9sb25nam1wLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZWguc2psai5sb25nam1wCisgICAgZWhfc2psal9sc2RhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZWguc2psai5sc2RhCisgICAgZWhfc2psal9zZXRqbXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZWguc2psai5zZXRqbXAKKyAgICBlaF9zamxqX3NldHVwX2Rpc3BhdGNoLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5laC5zamxqLnNldHVwLmRpc3BhdGNoCisgICAgZWhfdHlwZWlkX2ZvciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZWgudHlwZWlkLmZvcgorICAgIGVoX3Vud2luZF9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmVoLnVud2luZC5pbml0CisgICAgZXhwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZXhwCisgICAgZXhwMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZXhwMgorICAgIGV4cGVjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmV4cGVjdAorICAgIGV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9jb3MsICAgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5jb3MKKyAgICBleHBlcmltZW50YWxfY29uc3RyYWluZWRfZXhwLCAgICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuZXhwCisgICAgZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2V4cDIsICAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmV4cDIKKyAgICBleHBlcmltZW50YWxfY29uc3RyYWluZWRfZmFkZCwgICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuZmFkZAorICAgIGV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9mZGl2LCAgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5mZGl2CisgICAgZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2ZtYSwgICAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmZtYQorICAgIGV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9mbXVsLCAgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5mbXVsCisgICAgZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2ZyZW0sICAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmZyZW0KKyAgICBleHBlcmltZW50YWxfY29uc3RyYWluZWRfZnN1YiwgICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuZnN1YgorICAgIGV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9sb2csICAgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5sb2cKKyAgICBleHBlcmltZW50YWxfY29uc3RyYWluZWRfbG9nMTAsICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQubG9nMTAKKyAgICBleHBlcmltZW50YWxfY29uc3RyYWluZWRfbG9nMiwgICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQubG9nMgorICAgIGV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9uZWFyYnlpbnQsICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5uZWFyYnlpbnQKKyAgICBleHBlcmltZW50YWxfY29uc3RyYWluZWRfcG93LCAgICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQucG93CisgICAgZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX3Bvd2ksICAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLnBvd2kKKyAgICBleHBlcmltZW50YWxfY29uc3RyYWluZWRfcmludCwgICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQucmludAorICAgIGV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9zaW4sICAgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5zaW4KKyAgICBleHBlcmltZW50YWxfY29uc3RyYWluZWRfc3FydCwgICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuc3FydAorICAgIGV4cGVyaW1lbnRhbF9kZW9wdGltaXplLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC5kZW9wdGltaXplCisgICAgZXhwZXJpbWVudGFsX2djX3JlbG9jYXRlLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLmdjLnJlbG9jYXRlCisgICAgZXhwZXJpbWVudGFsX2djX3Jlc3VsdCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLmdjLnJlc3VsdAorICAgIGV4cGVyaW1lbnRhbF9nY19zdGF0ZXBvaW50LCAgICAgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC5nYy5zdGF0ZXBvaW50CisgICAgZXhwZXJpbWVudGFsX2d1YXJkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLmd1YXJkCisgICAgZXhwZXJpbWVudGFsX3BhdGNocG9pbnRfaTY0LCAgICAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLnBhdGNocG9pbnQuaTY0CisgICAgZXhwZXJpbWVudGFsX3BhdGNocG9pbnRfdm9pZCwgICAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLnBhdGNocG9pbnQudm9pZAorICAgIGV4cGVyaW1lbnRhbF9zdGFja21hcCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC5zdGFja21hcAorICAgIGV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX2FkZCwgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLmFkZAorICAgIGV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX2FuZCwgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLmFuZAorICAgIGV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX2ZhZGQsICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLmZhZGQKKyAgICBleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9mbWF4LCAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5mbWF4CisgICAgZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfZm1pbiwgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UuZm1pbgorICAgIGV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX2ZtdWwsICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLmZtdWwKKyAgICBleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9tdWwsICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5tdWwKKyAgICBleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9vciwgICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5vcgorICAgIGV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX3NtYXgsICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLnNtYXgKKyAgICBleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9zbWluLCAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5zbWluCisgICAgZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfdW1heCwgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UudW1heAorICAgIGV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX3VtaW4sICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLnVtaW4KKyAgICBleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV94b3IsICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS54b3IKKyAgICBmYWJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5mYWJzCisgICAgZmxvb3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZmxvb3IKKyAgICBmbHRfcm91bmRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5mbHQucm91bmRzCisgICAgZm1hLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZm1hCisgICAgZm11bGFkZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZm11bGFkZAorICAgIGZyYW1lYWRkcmVzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmZyYW1lYWRkcmVzcworICAgIGdjcmVhZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmdjcmVhZAorICAgIGdjcm9vdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmdjcm9vdAorICAgIGdjd3JpdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmdjd3JpdGUKKyAgICBnZXRfZHluYW1pY19hcmVhX29mZnNldCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5nZXQuZHluYW1pYy5hcmVhLm9mZnNldAorICAgIGljYWxsX2JyYW5jaF9mdW5uZWwsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmljYWxsLmJyYW5jaC5mdW5uZWwKKyAgICBpbml0X3RyYW1wb2xpbmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5pbml0LnRyYW1wb2xpbmUKKyAgICBpbnN0cnByb2ZfaW5jcmVtZW50LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5pbnN0cnByb2YuaW5jcmVtZW50CisgICAgaW5zdHJwcm9mX2luY3JlbWVudF9zdGVwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaW5zdHJwcm9mLmluY3JlbWVudC5zdGVwCisgICAgaW5zdHJwcm9mX3ZhbHVlX3Byb2ZpbGUsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaW5zdHJwcm9mLnZhbHVlLnByb2ZpbGUKKyAgICBpbnZhcmlhbnRfZW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5pbnZhcmlhbnQuZW5kCisgICAgaW52YXJpYW50X2dyb3VwX2JhcnJpZXIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaW52YXJpYW50Lmdyb3VwLmJhcnJpZXIKKyAgICBpbnZhcmlhbnRfc3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5pbnZhcmlhbnQuc3RhcnQKKyAgICBsaWZldGltZV9lbmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5saWZldGltZS5lbmQKKyAgICBsaWZldGltZV9zdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5saWZldGltZS5zdGFydAorICAgIGxvYWRfcmVsYXRpdmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmxvYWQucmVsYXRpdmUKKyAgICBsb2NhbGFkZHJlc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5sb2NhbGFkZHJlc3MKKyAgICBsb2NhbGVzY2FwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5sb2NhbGVzY2FwZQorICAgIGxvY2FscmVjb3ZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmxvY2FscmVjb3ZlcgorICAgIGxvZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmxvZworICAgIGxvZzEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmxvZzEwCisgICAgbG9nMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubG9nMgorICAgIGxvbmdqbXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmxvbmdqbXAKKyAgICBtYXNrZWRfY29tcHJlc3NzdG9yZSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5tYXNrZWQuY29tcHJlc3NzdG9yZQorICAgIG1hc2tlZF9leHBhbmRsb2FkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1hc2tlZC5leHBhbmRsb2FkCisgICAgbWFza2VkX2dhdGhlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWFza2VkLmdhdGhlcgorICAgIG1hc2tlZF9sb2FkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1hc2tlZC5sb2FkCisgICAgbWFza2VkX3NjYXR0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWFza2VkLnNjYXR0ZXIKKyAgICBtYXNrZWRfc3RvcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5tYXNrZWQuc3RvcmUKKyAgICBtYXhudW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5tYXhudW0KKyAgICBtZW1jcHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5tZW1jcHkKKyAgICBtZW1jcHlfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljLCAgICAgICAgICAgLy8gbGx2bS5tZW1jcHkuZWxlbWVudC51bm9yZGVyZWQuYXRvbWljCisgICAgbWVtbW92ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWVtbW92ZQorICAgIG1lbW1vdmVfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljLCAgICAgICAgICAvLyBsbHZtLm1lbW1vdmUuZWxlbWVudC51bm9yZGVyZWQuYXRvbWljCisgICAgbWVtc2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWVtc2V0CisgICAgbWVtc2V0X2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pYywgICAgICAgICAgIC8vIGxsdm0ubWVtc2V0LmVsZW1lbnQudW5vcmRlcmVkLmF0b21pYworICAgIG1pbm51bSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pbm51bQorICAgIG5lYXJieWludCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm5lYXJieWludAorICAgIG9iamVjdHNpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm9iamVjdHNpemUKKyAgICBwY21hcmtlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wY21hcmtlcgorICAgIHBvdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBvdworICAgIHBvd2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBvd2kKKyAgICBwcmVmZXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcmVmZXRjaAorICAgIHB0cl9hbm5vdGF0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnB0ci5hbm5vdGF0aW9uCisgICAgcmVhZF9yZWdpc3RlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucmVhZF9yZWdpc3RlcgorICAgIHJlYWRjeWNsZWNvdW50ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnJlYWRjeWNsZWNvdW50ZXIKKyAgICByZXR1cm5hZGRyZXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5yZXR1cm5hZGRyZXNzCisgICAgcmludCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucmludAorICAgIHJvdW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnJvdW5kCisgICAgc2FkZF93aXRoX292ZXJmbG93LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uc2FkZC53aXRoLm92ZXJmbG93CisgICAgc2V0am1wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uc2V0am1wCisgICAgc2lkZWVmZmVjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uc2lkZWVmZmVjdAorICAgIHNpZ2xvbmdqbXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnNpZ2xvbmdqbXAKKyAgICBzaWdzZXRqbXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zaWdzZXRqbXAKKyAgICBzaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zaW4KKyAgICBzbXVsX3dpdGhfb3ZlcmZsb3csICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zbXVsLndpdGgub3ZlcmZsb3cKKyAgICBzcXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zcXJ0CisgICAgc3NhX2NvcHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uc3NhLmNvcHkKKyAgICBzc3ViX3dpdGhfb3ZlcmZsb3csICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zc3ViLndpdGgub3ZlcmZsb3cKKyAgICBzdGFja2d1YXJkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zdGFja2d1YXJkCisgICAgc3RhY2twcm90ZWN0b3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uc3RhY2twcm90ZWN0b3IKKyAgICBzdGFja3Jlc3RvcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zdGFja3Jlc3RvcmUKKyAgICBzdGFja3NhdmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zdGFja3NhdmUKKyAgICB0aHJlYWRfcG9pbnRlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS50aHJlYWQucG9pbnRlcgorICAgIHRyYXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnRyYXAKKyAgICB0cnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS50cnVuYworICAgIHR5cGVfY2hlY2tlZF9sb2FkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnR5cGUuY2hlY2tlZC5sb2FkCisgICAgdHlwZV90ZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0udHlwZS50ZXN0CisgICAgdWFkZF93aXRoX292ZXJmbG93LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0udWFkZC53aXRoLm92ZXJmbG93CisgICAgdW11bF93aXRoX292ZXJmbG93LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0udW11bC53aXRoLm92ZXJmbG93CisgICAgdXN1Yl93aXRoX292ZXJmbG93LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0udXN1Yi53aXRoLm92ZXJmbG93CisgICAgdmFjb3B5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0udmFfY29weQorICAgIHZhZW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnZhX2VuZAorICAgIHZhc3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnZhX3N0YXJ0CisgICAgdmFyX2Fubm90YXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0udmFyLmFubm90YXRpb24KKyAgICB3cml0ZV9yZWdpc3RlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS53cml0ZV9yZWdpc3RlcgorICAgIHhyYXlfY3VzdG9tZXZlbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhyYXkuY3VzdG9tZXZlbnQKKyAgICBhYXJjaDY0X2NscmV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmNscmV4CisgICAgYWFyY2g2NF9jcmMzMmIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5jcmMzMmIKKyAgICBhYXJjaDY0X2NyYzMyY2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmNyYzMyY2IKKyAgICBhYXJjaDY0X2NyYzMyY2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmNyYzMyY2gKKyAgICBhYXJjaDY0X2NyYzMyY3csICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmNyYzMyY3cKKyAgICBhYXJjaDY0X2NyYzMyY3gsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmNyYzMyY3gKKyAgICBhYXJjaDY0X2NyYzMyaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmNyYzMyaAorICAgIGFhcmNoNjRfY3JjMzJ3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuY3JjMzJ3CisgICAgYWFyY2g2NF9jcmMzMngsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5jcmMzMngKKyAgICBhYXJjaDY0X2NyeXB0b19hZXNkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmNyeXB0by5hZXNkCisgICAgYWFyY2g2NF9jcnlwdG9fYWVzZSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uYWVzZQorICAgIGFhcmNoNjRfY3J5cHRvX2Flc2ltYywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLmFlc2ltYworICAgIGFhcmNoNjRfY3J5cHRvX2Flc21jLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLmFlc21jCisgICAgYWFyY2g2NF9jcnlwdG9fc2hhMWMsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uc2hhMWMKKyAgICBhYXJjaDY0X2NyeXB0b19zaGExaCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmNyeXB0by5zaGExaAorICAgIGFhcmNoNjRfY3J5cHRvX3NoYTFtLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTFtCisgICAgYWFyY2g2NF9jcnlwdG9fc2hhMXAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uc2hhMXAKKyAgICBhYXJjaDY0X2NyeXB0b19zaGExc3UwLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmNyeXB0by5zaGExc3UwCisgICAgYWFyY2g2NF9jcnlwdG9fc2hhMXN1MSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uc2hhMXN1MQorICAgIGFhcmNoNjRfY3J5cHRvX3NoYTI1NmgsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTI1NmgKKyAgICBhYXJjaDY0X2NyeXB0b19zaGEyNTZoMiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmNyeXB0by5zaGEyNTZoMgorICAgIGFhcmNoNjRfY3J5cHRvX3NoYTI1NnN1MCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTI1NnN1MAorICAgIGFhcmNoNjRfY3J5cHRvX3NoYTI1NnN1MSwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTI1NnN1MQorICAgIGFhcmNoNjRfZG1iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuZG1iCisgICAgYWFyY2g2NF9kc2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5kc2IKKyAgICBhYXJjaDY0X2hpbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmhpbnQKKyAgICBhYXJjaDY0X2lzYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmlzYgorICAgIGFhcmNoNjRfbGRheHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubGRheHAKKyAgICBhYXJjaDY0X2xkYXhyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmxkYXhyCisgICAgYWFyY2g2NF9sZHhwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5sZHhwCisgICAgYWFyY2g2NF9sZHhyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5sZHhyCisgICAgYWFyY2g2NF9uZW9uX2FicywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmFicworICAgIGFhcmNoNjRfbmVvbl9hZGRobiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5hZGRobgorICAgIGFhcmNoNjRfbmVvbl9hZGRwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5hZGRwCisgICAgYWFyY2g2NF9uZW9uX2NscywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmNscworICAgIGFhcmNoNjRfbmVvbl9mYWJkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mYWJkCisgICAgYWFyY2g2NF9uZW9uX2ZhY2dlLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZhY2dlCisgICAgYWFyY2g2NF9uZW9uX2ZhY2d0LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZhY2d0CisgICAgYWFyY2g2NF9uZW9uX2ZhZGR2LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZhZGR2CisgICAgYWFyY2g2NF9uZW9uX2ZjdnRhcywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZjdnRhcworICAgIGFhcmNoNjRfbmVvbl9mY3Z0YXUsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0YXUKKyAgICBhYXJjaDY0X25lb25fZmN2dG1zLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dG1zCisgICAgYWFyY2g2NF9uZW9uX2ZjdnRtdSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZjdnRtdQorICAgIGFhcmNoNjRfbmVvbl9mY3Z0bnMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0bnMKKyAgICBhYXJjaDY0X25lb25fZmN2dG51LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dG51CisgICAgYWFyY2g2NF9uZW9uX2ZjdnRwcywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZjdnRwcworICAgIGFhcmNoNjRfbmVvbl9mY3Z0cHUsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0cHUKKyAgICBhYXJjaDY0X25lb25fZmN2dHhuLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dHhuCisgICAgYWFyY2g2NF9uZW9uX2ZjdnR6cywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZjdnR6cworICAgIGFhcmNoNjRfbmVvbl9mY3Z0enUsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0enUKKyAgICBhYXJjaDY0X25lb25fZm1heCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZm1heAorICAgIGFhcmNoNjRfbmVvbl9mbWF4bm0sICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbWF4bm0KKyAgICBhYXJjaDY0X25lb25fZm1heG5tcCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZm1heG5tcAorICAgIGFhcmNoNjRfbmVvbl9mbWF4bm12LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbWF4bm12CisgICAgYWFyY2g2NF9uZW9uX2ZtYXhwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtYXhwCisgICAgYWFyY2g2NF9uZW9uX2ZtYXh2LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtYXh2CisgICAgYWFyY2g2NF9uZW9uX2ZtaW4sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtaW4KKyAgICBhYXJjaDY0X25lb25fZm1pbm5tLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZm1pbm5tCisgICAgYWFyY2g2NF9uZW9uX2ZtaW5ubXAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtaW5ubXAKKyAgICBhYXJjaDY0X25lb25fZm1pbm5tdiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZm1pbm5tdgorICAgIGFhcmNoNjRfbmVvbl9mbWlucCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbWlucAorICAgIGFhcmNoNjRfbmVvbl9mbWludiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbWludgorICAgIGFhcmNoNjRfbmVvbl9mbXVseCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbXVseAorICAgIGFhcmNoNjRfbmVvbl9mcmVjcGUsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mcmVjcGUKKyAgICBhYXJjaDY0X25lb25fZnJlY3BzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZnJlY3BzCisgICAgYWFyY2g2NF9uZW9uX2ZyZWNweCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZyZWNweAorICAgIGFhcmNoNjRfbmVvbl9mcmludG4sICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mcmludG4KKyAgICBhYXJjaDY0X25lb25fZnJzcXJ0ZSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZnJzcXJ0ZQorICAgIGFhcmNoNjRfbmVvbl9mcnNxcnRzLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mcnNxcnRzCisgICAgYWFyY2g2NF9uZW9uX2xkMXgyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmxkMXgyCisgICAgYWFyY2g2NF9uZW9uX2xkMXgzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmxkMXgzCisgICAgYWFyY2g2NF9uZW9uX2xkMXg0LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmxkMXg0CisgICAgYWFyY2g2NF9uZW9uX2xkMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmxkMgorICAgIGFhcmNoNjRfbmVvbl9sZDJsYW5lLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5sZDJsYW5lCisgICAgYWFyY2g2NF9uZW9uX2xkMnIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmxkMnIKKyAgICBhYXJjaDY0X25lb25fbGQzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24ubGQzCisgICAgYWFyY2g2NF9uZW9uX2xkM2xhbmUsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmxkM2xhbmUKKyAgICBhYXJjaDY0X25lb25fbGQzciwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24ubGQzcgorICAgIGFhcmNoNjRfbmVvbl9sZDQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5sZDQKKyAgICBhYXJjaDY0X25lb25fbGQ0bGFuZSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24ubGQ0bGFuZQorICAgIGFhcmNoNjRfbmVvbl9sZDRyLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5sZDRyCisgICAgYWFyY2g2NF9uZW9uX3BtdWwsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnBtdWwKKyAgICBhYXJjaDY0X25lb25fcG11bGwsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24ucG11bGwKKyAgICBhYXJjaDY0X25lb25fcG11bGw2NCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24ucG11bGw2NAorICAgIGFhcmNoNjRfbmVvbl9yYWRkaG4sICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5yYWRkaG4KKyAgICBhYXJjaDY0X25lb25fcmJpdCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24ucmJpdAorICAgIGFhcmNoNjRfbmVvbl9yc2hybiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5yc2hybgorICAgIGFhcmNoNjRfbmVvbl9yc3ViaG4sICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5yc3ViaG4KKyAgICBhYXJjaDY0X25lb25fc2FiZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc2FiZAorICAgIGFhcmNoNjRfbmVvbl9zYWRkbHAsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zYWRkbHAKKyAgICBhYXJjaDY0X25lb25fc2FkZGx2LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc2FkZGx2CisgICAgYWFyY2g2NF9uZW9uX3NhZGR2LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNhZGR2CisgICAgYWFyY2g2NF9uZW9uX3NjYWxhcl9zcXh0biwgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNjYWxhci5zcXh0bgorICAgIGFhcmNoNjRfbmVvbl9zY2FsYXJfc3F4dHVuLCAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zY2FsYXIuc3F4dHVuCisgICAgYWFyY2g2NF9uZW9uX3NjYWxhcl91cXh0biwgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNjYWxhci51cXh0bgorICAgIGFhcmNoNjRfbmVvbl9zaGFkZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zaGFkZAorICAgIGFhcmNoNjRfbmVvbl9zaGxsLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zaGxsCisgICAgYWFyY2g2NF9uZW9uX3Noc3ViLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNoc3ViCisgICAgYWFyY2g2NF9uZW9uX3NtYXgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNtYXgKKyAgICBhYXJjaDY0X25lb25fc21heHAsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc21heHAKKyAgICBhYXJjaDY0X25lb25fc21heHYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc21heHYKKyAgICBhYXJjaDY0X25lb25fc21pbiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc21pbgorICAgIGFhcmNoNjRfbmVvbl9zbWlucCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zbWlucAorICAgIGFhcmNoNjRfbmVvbl9zbWludiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zbWludgorICAgIGFhcmNoNjRfbmVvbl9zbXVsbCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zbXVsbAorICAgIGFhcmNoNjRfbmVvbl9zcWFicywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcWFicworICAgIGFhcmNoNjRfbmVvbl9zcWFkZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcWFkZAorICAgIGFhcmNoNjRfbmVvbl9zcWRtdWxoLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcWRtdWxoCisgICAgYWFyY2g2NF9uZW9uX3NxZG11bGwsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxZG11bGwKKyAgICBhYXJjaDY0X25lb25fc3FkbXVsbHNfc2NhbGFyLCAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3FkbXVsbHMuc2NhbGFyCisgICAgYWFyY2g2NF9uZW9uX3NxbmVnLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxbmVnCisgICAgYWFyY2g2NF9uZW9uX3NxcmRtdWxoLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxcmRtdWxoCisgICAgYWFyY2g2NF9uZW9uX3NxcnNobCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxcnNobAorICAgIGFhcmNoNjRfbmVvbl9zcXJzaHJuLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcXJzaHJuCisgICAgYWFyY2g2NF9uZW9uX3NxcnNocnVuLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxcnNocnVuCisgICAgYWFyY2g2NF9uZW9uX3Nxc2hsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxc2hsCisgICAgYWFyY2g2NF9uZW9uX3Nxc2hsdSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxc2hsdQorICAgIGFhcmNoNjRfbmVvbl9zcXNocm4sICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcXNocm4KKyAgICBhYXJjaDY0X25lb25fc3FzaHJ1biwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3FzaHJ1bgorICAgIGFhcmNoNjRfbmVvbl9zcXN1YiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcXN1YgorICAgIGFhcmNoNjRfbmVvbl9zcXh0biwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcXh0bgorICAgIGFhcmNoNjRfbmVvbl9zcXh0dW4sICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcXh0dW4KKyAgICBhYXJjaDY0X25lb25fc3JoYWRkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3JoYWRkCisgICAgYWFyY2g2NF9uZW9uX3Nyc2hsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNyc2hsCisgICAgYWFyY2g2NF9uZW9uX3NzaGwsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNzaGwKKyAgICBhYXJjaDY0X25lb25fc3NobGwsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3NobGwKKyAgICBhYXJjaDY0X25lb25fc3QxeDIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3QxeDIKKyAgICBhYXJjaDY0X25lb25fc3QxeDMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3QxeDMKKyAgICBhYXJjaDY0X25lb25fc3QxeDQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3QxeDQKKyAgICBhYXJjaDY0X25lb25fc3QyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3QyCisgICAgYWFyY2g2NF9uZW9uX3N0MmxhbmUsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnN0MmxhbmUKKyAgICBhYXJjaDY0X25lb25fc3QzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3QzCisgICAgYWFyY2g2NF9uZW9uX3N0M2xhbmUsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnN0M2xhbmUKKyAgICBhYXJjaDY0X25lb25fc3Q0LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3Q0CisgICAgYWFyY2g2NF9uZW9uX3N0NGxhbmUsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnN0NGxhbmUKKyAgICBhYXJjaDY0X25lb25fc3ViaG4sICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3ViaG4KKyAgICBhYXJjaDY0X25lb25fc3VxYWRkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3VxYWRkCisgICAgYWFyY2g2NF9uZW9uX3RibDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnRibDEKKyAgICBhYXJjaDY0X25lb25fdGJsMiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udGJsMgorICAgIGFhcmNoNjRfbmVvbl90YmwzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi50YmwzCisgICAgYWFyY2g2NF9uZW9uX3RibDQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnRibDQKKyAgICBhYXJjaDY0X25lb25fdGJ4MSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udGJ4MQorICAgIGFhcmNoNjRfbmVvbl90YngyLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi50YngyCisgICAgYWFyY2g2NF9uZW9uX3RieDMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnRieDMKKyAgICBhYXJjaDY0X25lb25fdGJ4NCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udGJ4NAorICAgIGFhcmNoNjRfbmVvbl91YWJkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi51YWJkCisgICAgYWFyY2g2NF9uZW9uX3VhZGRscCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVhZGRscAorICAgIGFhcmNoNjRfbmVvbl91YWRkbHYsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi51YWRkbHYKKyAgICBhYXJjaDY0X25lb25fdWFkZHYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udWFkZHYKKyAgICBhYXJjaDY0X25lb25fdWhhZGQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udWhhZGQKKyAgICBhYXJjaDY0X25lb25fdWhzdWIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udWhzdWIKKyAgICBhYXJjaDY0X25lb25fdW1heCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udW1heAorICAgIGFhcmNoNjRfbmVvbl91bWF4cCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi51bWF4cAorICAgIGFhcmNoNjRfbmVvbl91bWF4diwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi51bWF4dgorICAgIGFhcmNoNjRfbmVvbl91bWluLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi51bWluCisgICAgYWFyY2g2NF9uZW9uX3VtaW5wLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVtaW5wCisgICAgYWFyY2g2NF9uZW9uX3VtaW52LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVtaW52CisgICAgYWFyY2g2NF9uZW9uX3VtdWxsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVtdWxsCisgICAgYWFyY2g2NF9uZW9uX3VxYWRkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVxYWRkCisgICAgYWFyY2g2NF9uZW9uX3VxcnNobCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVxcnNobAorICAgIGFhcmNoNjRfbmVvbl91cXJzaHJuLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi51cXJzaHJuCisgICAgYWFyY2g2NF9uZW9uX3Vxc2hsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVxc2hsCisgICAgYWFyY2g2NF9uZW9uX3Vxc2hybiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVxc2hybgorICAgIGFhcmNoNjRfbmVvbl91cXN1YiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi51cXN1YgorICAgIGFhcmNoNjRfbmVvbl91cXh0biwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi51cXh0bgorICAgIGFhcmNoNjRfbmVvbl91cmVjcGUsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi51cmVjcGUKKyAgICBhYXJjaDY0X25lb25fdXJoYWRkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXJoYWRkCisgICAgYWFyY2g2NF9uZW9uX3Vyc2hsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVyc2hsCisgICAgYWFyY2g2NF9uZW9uX3Vyc3FydGUsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVyc3FydGUKKyAgICBhYXJjaDY0X25lb25fdXNobCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXNobAorICAgIGFhcmNoNjRfbmVvbl91c2hsbCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi51c2hsbAorICAgIGFhcmNoNjRfbmVvbl91c3FhZGQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi51c3FhZGQKKyAgICBhYXJjaDY0X25lb25fdmNvcHlfbGFuZSwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udmNvcHkubGFuZQorICAgIGFhcmNoNjRfbmVvbl92Y3Z0ZnAyZnhzLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi52Y3Z0ZnAyZnhzCisgICAgYWFyY2g2NF9uZW9uX3ZjdnRmcDJmeHUsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnZjdnRmcDJmeHUKKyAgICBhYXJjaDY0X25lb25fdmN2dGZwMmhmLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udmN2dGZwMmhmCisgICAgYWFyY2g2NF9uZW9uX3ZjdnRmeHMyZnAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnZjdnRmeHMyZnAKKyAgICBhYXJjaDY0X25lb25fdmN2dGZ4dTJmcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udmN2dGZ4dTJmcAorICAgIGFhcmNoNjRfbmVvbl92Y3Z0aGYyZnAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi52Y3Z0aGYyZnAKKyAgICBhYXJjaDY0X25lb25fdnNsaSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udnNsaQorICAgIGFhcmNoNjRfbmVvbl92c3JpLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi52c3JpCisgICAgYWFyY2g2NF9zZGl2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5zZGl2CisgICAgYWFyY2g2NF9zaXNkX2ZhYmQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5zaXNkLmZhYmQKKyAgICBhYXJjaDY0X3Npc2RfZmN2dHhuLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LnNpc2QuZmN2dHhuCisgICAgYWFyY2g2NF9zdGx4cCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5zdGx4cAorICAgIGFhcmNoNjRfc3RseHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuc3RseHIKKyAgICBhYXJjaDY0X3N0eHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LnN0eHAKKyAgICBhYXJjaDY0X3N0eHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LnN0eHIKKyAgICBhYXJjaDY0X3VkaXYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LnVkaXYKKyAgICBhbWRnY25fYWxpZ25iaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uYWxpZ25iaXQKKyAgICBhbWRnY25fYWxpZ25ieXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uYWxpZ25ieXRlCisgICAgYW1kZ2NuX2F0b21pY19kZWMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmF0b21pYy5kZWMKKyAgICBhbWRnY25fYXRvbWljX2luYywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uYXRvbWljLmluYworICAgIGFtZGdjbl9icmVhaywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5icmVhaworICAgIGFtZGdjbl9idWZmZXJfYXRvbWljX2FkZCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLmFkZAorICAgIGFtZGdjbl9idWZmZXJfYXRvbWljX2FuZCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLmFuZAorICAgIGFtZGdjbl9idWZmZXJfYXRvbWljX2NtcHN3YXAsICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLmNtcHN3YXAKKyAgICBhbWRnY25fYnVmZmVyX2F0b21pY19vciwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy5vcgorICAgIGFtZGdjbl9idWZmZXJfYXRvbWljX3NtYXgsICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLnNtYXgKKyAgICBhbWRnY25fYnVmZmVyX2F0b21pY19zbWluLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy5zbWluCisgICAgYW1kZ2NuX2J1ZmZlcl9hdG9taWNfc3ViLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMuc3ViCisgICAgYW1kZ2NuX2J1ZmZlcl9hdG9taWNfc3dhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMuc3dhcAorICAgIGFtZGdjbl9idWZmZXJfYXRvbWljX3VtYXgsICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLnVtYXgKKyAgICBhbWRnY25fYnVmZmVyX2F0b21pY191bWluLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy51bWluCisgICAgYW1kZ2NuX2J1ZmZlcl9hdG9taWNfeG9yLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMueG9yCisgICAgYW1kZ2NuX2J1ZmZlcl9sb2FkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5sb2FkCisgICAgYW1kZ2NuX2J1ZmZlcl9sb2FkX2Zvcm1hdCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5sb2FkLmZvcm1hdAorICAgIGFtZGdjbl9idWZmZXJfc3RvcmUsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5idWZmZXIuc3RvcmUKKyAgICBhbWRnY25fYnVmZmVyX3N0b3JlX2Zvcm1hdCwgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uYnVmZmVyLnN0b3JlLmZvcm1hdAorICAgIGFtZGdjbl9idWZmZXJfd2JpbnZsMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5idWZmZXIud2JpbnZsMQorICAgIGFtZGdjbl9idWZmZXJfd2JpbnZsMV9zYywgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5idWZmZXIud2JpbnZsMS5zYworICAgIGFtZGdjbl9idWZmZXJfd2JpbnZsMV92b2wsICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5idWZmZXIud2JpbnZsMS52b2wKKyAgICBhbWRnY25fY2xhc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uY2xhc3MKKyAgICBhbWRnY25fY29zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uY29zCisgICAgYW1kZ2NuX2N1YmVpZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmN1YmVpZAorICAgIGFtZGdjbl9jdWJlbWEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5jdWJlbWEKKyAgICBhbWRnY25fY3ViZXNjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uY3ViZXNjCisgICAgYW1kZ2NuX2N1YmV0YywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmN1YmV0YworICAgIGFtZGdjbl9jdnRfcGtfaTE2LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5jdnQucGsuaTE2CisgICAgYW1kZ2NuX2N2dF9wa191MTYsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmN2dC5way51MTYKKyAgICBhbWRnY25fY3Z0X3BrX3U4X2YzMiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uY3Z0LnBrLnU4LmYzMgorICAgIGFtZGdjbl9jdnRfcGtub3JtX2kxNiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5jdnQucGtub3JtLmkxNgorICAgIGFtZGdjbl9jdnRfcGtub3JtX3UxNiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5jdnQucGtub3JtLnUxNgorICAgIGFtZGdjbl9jdnRfcGtydHosICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5jdnQucGtydHoKKyAgICBhbWRnY25fZGlzcGF0Y2hfaWQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uZGlzcGF0Y2guaWQKKyAgICBhbWRnY25fZGlzcGF0Y2hfcHRyLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uZGlzcGF0Y2gucHRyCisgICAgYW1kZ2NuX2Rpdl9maXh1cCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmRpdi5maXh1cAorICAgIGFtZGdjbl9kaXZfZm1hcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5kaXYuZm1hcworICAgIGFtZGdjbl9kaXZfc2NhbGUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5kaXYuc2NhbGUKKyAgICBhbWRnY25fZHNfYnBlcm11dGUsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uZHMuYnBlcm11dGUKKyAgICBhbWRnY25fZHNfZmFkZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uZHMuZmFkZAorICAgIGFtZGdjbl9kc19mbWF4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5kcy5mbWF4CisgICAgYW1kZ2NuX2RzX2ZtaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmRzLmZtaW4KKyAgICBhbWRnY25fZHNfcGVybXV0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uZHMucGVybXV0ZQorICAgIGFtZGdjbl9kc19zd2l6emxlLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5kcy5zd2l6emxlCisgICAgYW1kZ2NuX2Vsc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmVsc2UKKyAgICBhbWRnY25fZWxzZV9icmVhaywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uZWxzZS5icmVhaworICAgIGFtZGdjbl9lbmRfY2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5lbmQuY2YKKyAgICBhbWRnY25fZXhwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uZXhwCisgICAgYW1kZ2NuX2V4cF9jb21wciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmV4cC5jb21wcgorICAgIGFtZGdjbl9mY21wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5mY21wCisgICAgYW1kZ2NuX2ZkaXZfZmFzdCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmZkaXYuZmFzdAorICAgIGFtZGdjbl9mbWVkMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5mbWVkMworICAgIGFtZGdjbl9mbXVsX2xlZ2FjeSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5mbXVsLmxlZ2FjeQorICAgIGFtZGdjbl9mcmFjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5mcmFjdAorICAgIGFtZGdjbl9mcmV4cF9leHAsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5mcmV4cC5leHAKKyAgICBhbWRnY25fZnJleHBfbWFudCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uZnJleHAubWFudAorICAgIGFtZGdjbl9ncm91cHN0YXRpY3NpemUsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5ncm91cHN0YXRpY3NpemUKKyAgICBhbWRnY25faWNtcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaWNtcAorICAgIGFtZGdjbl9pZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pZgorICAgIGFtZGdjbl9pZl9icmVhaywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pZi5icmVhaworICAgIGFtZGdjbl9pbWFnZV9hdG9taWNfYWRkLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuYWRkCisgICAgYW1kZ2NuX2ltYWdlX2F0b21pY19hbmQsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5hbmQKKyAgICBhbWRnY25faW1hZ2VfYXRvbWljX2NtcHN3YXAsICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLmNtcHN3YXAKKyAgICBhbWRnY25faW1hZ2VfYXRvbWljX2RlYywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLmRlYworICAgIGFtZGdjbl9pbWFnZV9hdG9taWNfaW5jLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuaW5jCisgICAgYW1kZ2NuX2ltYWdlX2F0b21pY19vciwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5vcgorICAgIGFtZGdjbl9pbWFnZV9hdG9taWNfc21heCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuc21heAorICAgIGFtZGdjbl9pbWFnZV9hdG9taWNfc21pbiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuc21pbgorICAgIGFtZGdjbl9pbWFnZV9hdG9taWNfc3ViLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuc3ViCisgICAgYW1kZ2NuX2ltYWdlX2F0b21pY19zd2FwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5zd2FwCisgICAgYW1kZ2NuX2ltYWdlX2F0b21pY191bWF4LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy51bWF4CisgICAgYW1kZ2NuX2ltYWdlX2F0b21pY191bWluLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy51bWluCisgICAgYW1kZ2NuX2ltYWdlX2F0b21pY194b3IsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy54b3IKKyAgICBhbWRnY25faW1hZ2VfZ2F0aGVyNCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNAorICAgIGFtZGdjbl9pbWFnZV9nYXRoZXI0X2IsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmIKKyAgICBhbWRnY25faW1hZ2VfZ2F0aGVyNF9iX2NsLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5iLmNsCisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfYl9jbF9vLCAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYi5jbC5vCisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfYl9vLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYi5vCisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYworICAgIGFtZGdjbl9pbWFnZV9nYXRoZXI0X2NfYiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMuYgorICAgIGFtZGdjbl9pbWFnZV9nYXRoZXI0X2NfYl9jbCwgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMuYi5jbAorICAgIGFtZGdjbl9pbWFnZV9nYXRoZXI0X2NfYl9jbF9vLCAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMuYi5jbC5vCisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY19iX28sICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5iLm8KKyAgICBhbWRnY25faW1hZ2VfZ2F0aGVyNF9jX2NsLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmNsCisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY19jbF9vLCAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5jbC5vCisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY19sLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5sCisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY19sX28sICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5sLm8KKyAgICBhbWRnY25faW1hZ2VfZ2F0aGVyNF9jX2x6LCAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmx6CisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY19sel9vLCAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5sei5vCisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY19vLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5vCisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY2wsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuY2wKKyAgICBhbWRnY25faW1hZ2VfZ2F0aGVyNF9jbF9vLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jbC5vCisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfbCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQubAorICAgIGFtZGdjbl9pbWFnZV9nYXRoZXI0X2xfbywgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmwubworICAgIGFtZGdjbl9pbWFnZV9nYXRoZXI0X2x6LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0Lmx6CisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfbHpfbywgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQubHoubworICAgIGFtZGdjbl9pbWFnZV9nYXRoZXI0X28sICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0Lm8KKyAgICBhbWRnY25faW1hZ2VfZ2V0bG9kLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2V0bG9kCisgICAgYW1kZ2NuX2ltYWdlX2dldHJlc2luZm8sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdldHJlc2luZm8KKyAgICBhbWRnY25faW1hZ2VfbG9hZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UubG9hZAorICAgIGFtZGdjbl9pbWFnZV9sb2FkX21pcCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5sb2FkLm1pcAorICAgIGFtZGdjbl9pbWFnZV9zYW1wbGUsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUKKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2IsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmIKKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2JfY2wsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmIuY2wKKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2JfY2xfbywgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmIuY2wubworICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfYl9vLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYi5vCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2IsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmIKKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NfYl9jbCwgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuYi5jbAorICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfY19iX2NsX28sICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5iLmNsLm8KKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NfYl9vLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuYi5vCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2NkLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmNkCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2NkX2NsLCAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmNkLmNsCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2NkX2NsX28sICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmNkLmNsLm8KKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NfY2RfbywgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuY2QubworICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfY19jbCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5jbAorICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfY19jbF9vLCAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5jbC5vCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2QsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmQKKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NfZF9jbCwgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuZC5jbAorICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfY19kX2NsX28sICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5kLmNsLm8KKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NfZF9vLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuZC5vCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2wsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmwKKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NfbF9vLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMubC5vCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2x6LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmx6CisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2x6X28sICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmx6Lm8KKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NfbywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMubworICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfY2QsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuY2QKKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NkX2NsLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmNkLmNsCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jZF9jbF9vLCAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jZC5jbC5vCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jZF9vLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jZC5vCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jbCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jbAorICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfY2xfbywgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuY2wubworICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfZCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuZAorICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfZF9jbCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuZC5jbAorICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfZF9jbF9vLCAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuZC5jbC5vCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9kX28sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5kLm8KKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2wsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmwKKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2xfbywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmwubworICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfbHosICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUubHoKKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2x6X28sICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmx6Lm8KKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX28sICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLm8KKyAgICBhbWRnY25faW1hZ2Vfc3RvcmUsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc3RvcmUKKyAgICBhbWRnY25faW1hZ2Vfc3RvcmVfbWlwLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc3RvcmUubWlwCisgICAgYW1kZ2NuX2ltcGxpY2l0X2J1ZmZlcl9wdHIsICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltcGxpY2l0LmJ1ZmZlci5wdHIKKyAgICBhbWRnY25faW1wbGljaXRhcmdfcHRyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1wbGljaXRhcmcucHRyCisgICAgYW1kZ2NuX2luaXRfZXhlYywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmluaXQuZXhlYworICAgIGFtZGdjbl9pbml0X2V4ZWNfZnJvbV9pbnB1dCwgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbml0LmV4ZWMuZnJvbS5pbnB1dAorICAgIGFtZGdjbl9pbnRlcnBfbW92LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbnRlcnAubW92CisgICAgYW1kZ2NuX2ludGVycF9wMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmludGVycC5wMQorICAgIGFtZGdjbl9pbnRlcnBfcDIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbnRlcnAucDIKKyAgICBhbWRnY25fa2VybmFyZ19zZWdtZW50X3B0ciwgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ua2VybmFyZy5zZWdtZW50LnB0cgorICAgIGFtZGdjbl9raWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5raWxsCisgICAgYW1kZ2NuX2xkZXhwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmxkZXhwCisgICAgYW1kZ2NuX2xlcnAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmxlcnAKKyAgICBhbWRnY25fbG9nX2NsYW1wLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ubG9nLmNsYW1wCisgICAgYW1kZ2NuX2xvb3AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmxvb3AKKyAgICBhbWRnY25fbWJjbnRfaGksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ubWJjbnQuaGkKKyAgICBhbWRnY25fbWJjbnRfbG8sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ubWJjbnQubG8KKyAgICBhbWRnY25fbW92X2RwcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ubW92LmRwcAorICAgIGFtZGdjbl9tcXNhZF9wa191MTZfdTgsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5tcXNhZC5way51MTYudTgKKyAgICBhbWRnY25fbXFzYWRfdTMyX3U4LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ubXFzYWQudTMyLnU4CisgICAgYW1kZ2NuX21zYWRfdTgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLm1zYWQudTgKKyAgICBhbWRnY25fcHNfbGl2ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ucHMubGl2ZQorICAgIGFtZGdjbl9xc2FkX3BrX3UxNl91OCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5xc2FkLnBrLnUxNi51OAorICAgIGFtZGdjbl9xdWV1ZV9wdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5xdWV1ZS5wdHIKKyAgICBhbWRnY25fcmNwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ucmNwCisgICAgYW1kZ2NuX3JjcF9sZWdhY3ksICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnJjcC5sZWdhY3kKKyAgICBhbWRnY25fcmVhZGZpcnN0bGFuZSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ucmVhZGZpcnN0bGFuZQorICAgIGFtZGdjbl9yZWFkbGFuZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5yZWFkbGFuZQorICAgIGFtZGdjbl9yc3EsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5yc3EKKyAgICBhbWRnY25fcnNxX2NsYW1wLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ucnNxLmNsYW1wCisgICAgYW1kZ2NuX3JzcV9sZWdhY3ksICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnJzcS5sZWdhY3kKKyAgICBhbWRnY25fc19iYXJyaWVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ucy5iYXJyaWVyCisgICAgYW1kZ2NuX3NfZGNhY2hlX2ludiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnMuZGNhY2hlLmludgorICAgIGFtZGdjbl9zX2RjYWNoZV9pbnZfdm9sLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5zLmRjYWNoZS5pbnYudm9sCisgICAgYW1kZ2NuX3NfZGNhY2hlX3diLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnMuZGNhY2hlLndiCisgICAgYW1kZ2NuX3NfZGNhY2hlX3diX3ZvbCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnMuZGNhY2hlLndiLnZvbAorICAgIGFtZGdjbl9zX2RlY3BlcmZsZXZlbCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5zLmRlY3BlcmZsZXZlbAorICAgIGFtZGdjbl9zX2dldHBjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5zLmdldHBjCisgICAgYW1kZ2NuX3NfZ2V0cmVnLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnMuZ2V0cmVnCisgICAgYW1kZ2NuX3NfaW5jcGVyZmxldmVsLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnMuaW5jcGVyZmxldmVsCisgICAgYW1kZ2NuX3NfbWVtcmVhbHRpbWUsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnMubWVtcmVhbHRpbWUKKyAgICBhbWRnY25fc19tZW10aW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ucy5tZW10aW1lCisgICAgYW1kZ2NuX3Nfc2VuZG1zZywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnMuc2VuZG1zZworICAgIGFtZGdjbl9zX3NlbmRtc2doYWx0LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5zLnNlbmRtc2doYWx0CisgICAgYW1kZ2NuX3Nfc2xlZXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnMuc2xlZXAKKyAgICBhbWRnY25fc193YWl0Y250LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ucy53YWl0Y250CisgICAgYW1kZ2NuX3NhZF9oaV91OCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnNhZC5oaS51OAorICAgIGFtZGdjbl9zYWRfdTE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5zYWQudTE2CisgICAgYW1kZ2NuX3NhZF91OCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnNhZC51OAorICAgIGFtZGdjbl9zYmZlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5zYmZlCisgICAgYW1kZ2NuX3NldF9pbmFjdGl2ZSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnNldC5pbmFjdGl2ZQorICAgIGFtZGdjbl9zZmZiaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5zZmZiaAorICAgIGFtZGdjbl9zaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5zaW4KKyAgICBhbWRnY25fdGJ1ZmZlcl9sb2FkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24udGJ1ZmZlci5sb2FkCisgICAgYW1kZ2NuX3RidWZmZXJfc3RvcmUsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnRidWZmZXIuc3RvcmUKKyAgICBhbWRnY25fdHJpZ19wcmVvcCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24udHJpZy5wcmVvcAorICAgIGFtZGdjbl91YmZlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi51YmZlCisgICAgYW1kZ2NuX3VucmVhY2hhYmxlLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnVucmVhY2hhYmxlCisgICAgYW1kZ2NuX3VwZGF0ZV9kcHAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnVwZGF0ZS5kcHAKKyAgICBhbWRnY25fd2F2ZV9iYXJyaWVyLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ud2F2ZS5iYXJyaWVyCisgICAgYW1kZ2NuX3dvcmtncm91cF9pZF94LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLndvcmtncm91cC5pZC54CisgICAgYW1kZ2NuX3dvcmtncm91cF9pZF95LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLndvcmtncm91cC5pZC55CisgICAgYW1kZ2NuX3dvcmtncm91cF9pZF96LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLndvcmtncm91cC5pZC56CisgICAgYW1kZ2NuX3dvcmtpdGVtX2lkX3gsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLndvcmtpdGVtLmlkLngKKyAgICBhbWRnY25fd29ya2l0ZW1faWRfeSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ud29ya2l0ZW0uaWQueQorICAgIGFtZGdjbl93b3JraXRlbV9pZF96LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi53b3JraXRlbS5pZC56CisgICAgYW1kZ2NuX3dxbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLndxbQorICAgIGFtZGdjbl93cW1fdm90ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi53cW0udm90ZQorICAgIGFtZGdjbl93cml0ZWxhbmUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi53cml0ZWxhbmUKKyAgICBhbWRnY25fd3dtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ud3dtCisgICAgYXJtX2NkcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLmNkcAorICAgIGFybV9jZHAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5jZHAyCisgICAgYXJtX2NscmV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLmNscmV4CisgICAgYXJtX2NyYzMyYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLmNyYzMyYgorICAgIGFybV9jcmMzMmNiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5jcmMzMmNiCisgICAgYXJtX2NyYzMyY2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLmNyYzMyY2gKKyAgICBhcm1fY3JjMzJjdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uY3JjMzJjdworICAgIGFybV9jcmMzMmgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5jcmMzMmgKKyAgICBhcm1fY3JjMzJ3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uY3JjMzJ3CisgICAgYXJtX2RiZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLmRiZworICAgIGFybV9kbWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5kbWIKKyAgICBhcm1fZHNiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uZHNiCisgICAgYXJtX2dldF9mcHNjciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLmdldC5mcHNjcgorICAgIGFybV9oaW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5oaW50CisgICAgYXJtX2lzYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLmlzYgorICAgIGFybV9sZGFleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5sZGFleAorICAgIGFybV9sZGFleGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5sZGFleGQKKyAgICBhcm1fbGRjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubGRjCisgICAgYXJtX2xkYzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLmxkYzIKKyAgICBhcm1fbGRjMmwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubGRjMmwKKyAgICBhcm1fbGRjbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubGRjbAorICAgIGFybV9sZHJleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5sZHJleAorICAgIGFybV9sZHJleGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5sZHJleGQKKyAgICBhcm1fbWNyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubWNyCisgICAgYXJtX21jcjIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm1jcjIKKyAgICBhcm1fbWNyciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubWNycgorICAgIGFybV9tY3JyMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5tY3JyMgorICAgIGFybV9tcmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5tcmMKKyAgICBhcm1fbXJjMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubXJjMgorICAgIGFybV9tcnJjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5tcnJjCisgICAgYXJtX21ycmMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm1ycmMyCisgICAgYXJtX25lb25fYWVzZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24uYWVzZAorICAgIGFybV9uZW9uX2Flc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLmFlc2UKKyAgICBhcm1fbmVvbl9hZXNpbWMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi5hZXNpbWMKKyAgICBhcm1fbmVvbl9hZXNtYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi5hZXNtYworICAgIGFybV9uZW9uX3NoYTFjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnNoYTFjCisgICAgYXJtX25lb25fc2hhMWgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24uc2hhMWgKKyAgICBhcm1fbmVvbl9zaGExbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi5zaGExbQorICAgIGFybV9uZW9uX3NoYTFwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnNoYTFwCisgICAgYXJtX25lb25fc2hhMXN1MCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24uc2hhMXN1MAorICAgIGFybV9uZW9uX3NoYTFzdTEsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnNoYTFzdTEKKyAgICBhcm1fbmVvbl9zaGEyNTZoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi5zaGEyNTZoCisgICAgYXJtX25lb25fc2hhMjU2aDIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24uc2hhMjU2aDIKKyAgICBhcm1fbmVvbl9zaGEyNTZzdTAsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi5zaGEyNTZzdTAKKyAgICBhcm1fbmVvbl9zaGEyNTZzdTEsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi5zaGEyNTZzdTEKKyAgICBhcm1fbmVvbl92YWJkcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52YWJkcworICAgIGFybV9uZW9uX3ZhYmR1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZhYmR1CisgICAgYXJtX25lb25fdmFicywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udmFicworICAgIGFybV9uZW9uX3ZhY2dlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZhY2dlCisgICAgYXJtX25lb25fdmFjZ3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udmFjZ3QKKyAgICBhcm1fbmVvbl92YnNsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52YnNsCisgICAgYXJtX25lb25fdmNscywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udmNscworICAgIGFybV9uZW9uX3ZjdnRhcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZjdnRhcworICAgIGFybV9uZW9uX3ZjdnRhdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZjdnRhdQorICAgIGFybV9uZW9uX3ZjdnRmcDJmeHMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZjdnRmcDJmeHMKKyAgICBhcm1fbmVvbl92Y3Z0ZnAyZnh1LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0ZnAyZnh1CisgICAgYXJtX25lb25fdmN2dGZwMmhmLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udmN2dGZwMmhmCisgICAgYXJtX25lb25fdmN2dGZ4czJmcCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udmN2dGZ4czJmcAorICAgIGFybV9uZW9uX3ZjdnRmeHUyZnAsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZjdnRmeHUyZnAKKyAgICBhcm1fbmVvbl92Y3Z0aGYyZnAsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0aGYyZnAKKyAgICBhcm1fbmVvbl92Y3Z0bXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0bXMKKyAgICBhcm1fbmVvbl92Y3Z0bXUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0bXUKKyAgICBhcm1fbmVvbl92Y3Z0bnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0bnMKKyAgICBhcm1fbmVvbl92Y3Z0bnUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0bnUKKyAgICBhcm1fbmVvbl92Y3Z0cHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0cHMKKyAgICBhcm1fbmVvbl92Y3Z0cHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0cHUKKyAgICBhcm1fbmVvbl92aGFkZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52aGFkZHMKKyAgICBhcm1fbmVvbl92aGFkZHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52aGFkZHUKKyAgICBhcm1fbmVvbl92aHN1YnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52aHN1YnMKKyAgICBhcm1fbmVvbl92aHN1YnUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52aHN1YnUKKyAgICBhcm1fbmVvbl92bGQxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52bGQxCisgICAgYXJtX25lb25fdmxkMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udmxkMgorICAgIGFybV9uZW9uX3ZsZDJsYW5lLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZsZDJsYW5lCisgICAgYXJtX25lb25fdmxkMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udmxkMworICAgIGFybV9uZW9uX3ZsZDNsYW5lLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZsZDNsYW5lCisgICAgYXJtX25lb25fdmxkNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udmxkNAorICAgIGFybV9uZW9uX3ZsZDRsYW5lLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZsZDRsYW5lCisgICAgYXJtX25lb25fdm1heG5tLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udm1heG5tCisgICAgYXJtX25lb25fdm1heHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udm1heHMKKyAgICBhcm1fbmVvbl92bWF4dSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52bWF4dQorICAgIGFybV9uZW9uX3ZtaW5ubSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZtaW5ubQorICAgIGFybV9uZW9uX3ZtaW5zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZtaW5zCisgICAgYXJtX25lb25fdm1pbnUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udm1pbnUKKyAgICBhcm1fbmVvbl92bXVsbHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52bXVsbHAKKyAgICBhcm1fbmVvbl92bXVsbHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52bXVsbHMKKyAgICBhcm1fbmVvbl92bXVsbHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52bXVsbHUKKyAgICBhcm1fbmVvbl92bXVscCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52bXVscAorICAgIGFybV9uZW9uX3ZwYWRhbHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZwYWRhbHMKKyAgICBhcm1fbmVvbl92cGFkYWx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cGFkYWx1CisgICAgYXJtX25lb25fdnBhZGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnBhZGQKKyAgICBhcm1fbmVvbl92cGFkZGxzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cGFkZGxzCisgICAgYXJtX25lb25fdnBhZGRsdSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnBhZGRsdQorICAgIGFybV9uZW9uX3ZwbWF4cywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZwbWF4cworICAgIGFybV9uZW9uX3ZwbWF4dSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZwbWF4dQorICAgIGFybV9uZW9uX3ZwbWlucywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZwbWlucworICAgIGFybV9uZW9uX3ZwbWludSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZwbWludQorICAgIGFybV9uZW9uX3ZxYWJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZxYWJzCisgICAgYXJtX25lb25fdnFhZGRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnFhZGRzCisgICAgYXJtX25lb25fdnFhZGR1LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnFhZGR1CisgICAgYXJtX25lb25fdnFkbXVsaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnFkbXVsaAorICAgIGFybV9uZW9uX3ZxZG11bGwsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZxZG11bGwKKyAgICBhcm1fbmVvbl92cW1vdm5zLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cW1vdm5zCisgICAgYXJtX25lb25fdnFtb3Zuc3UsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnFtb3Zuc3UKKyAgICBhcm1fbmVvbl92cW1vdm51LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cW1vdm51CisgICAgYXJtX25lb25fdnFuZWcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnFuZWcKKyAgICBhcm1fbmVvbl92cXJkbXVsaCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cXJkbXVsaAorICAgIGFybV9uZW9uX3ZxcnNoaWZ0bnMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZxcnNoaWZ0bnMKKyAgICBhcm1fbmVvbl92cXJzaGlmdG5zdSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cXJzaGlmdG5zdQorICAgIGFybV9uZW9uX3ZxcnNoaWZ0bnUsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZxcnNoaWZ0bnUKKyAgICBhcm1fbmVvbl92cXJzaGlmdHMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cXJzaGlmdHMKKyAgICBhcm1fbmVvbl92cXJzaGlmdHUsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cXJzaGlmdHUKKyAgICBhcm1fbmVvbl92cXNoaWZ0bnMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cXNoaWZ0bnMKKyAgICBhcm1fbmVvbl92cXNoaWZ0bnN1LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cXNoaWZ0bnN1CisgICAgYXJtX25lb25fdnFzaGlmdG51LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnFzaGlmdG51CisgICAgYXJtX25lb25fdnFzaGlmdHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnFzaGlmdHMKKyAgICBhcm1fbmVvbl92cXNoaWZ0c3UsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cXNoaWZ0c3UKKyAgICBhcm1fbmVvbl92cXNoaWZ0dSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cXNoaWZ0dQorICAgIGFybV9uZW9uX3Zxc3VicywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZxc3VicworICAgIGFybV9uZW9uX3Zxc3VidSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZxc3VidQorICAgIGFybV9uZW9uX3ZyYWRkaG4sICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZyYWRkaG4KKyAgICBhcm1fbmVvbl92cmVjcGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cmVjcGUKKyAgICBhcm1fbmVvbl92cmVjcHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cmVjcHMKKyAgICBhcm1fbmVvbl92cmhhZGRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cmhhZGRzCisgICAgYXJtX25lb25fdnJoYWRkdSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnJoYWRkdQorICAgIGFybV9uZW9uX3ZyaW50YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZyaW50YQorICAgIGFybV9uZW9uX3ZyaW50bSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZyaW50bQorICAgIGFybV9uZW9uX3ZyaW50biwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZyaW50bgorICAgIGFybV9uZW9uX3ZyaW50cCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZyaW50cAorICAgIGFybV9uZW9uX3ZyaW50eCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZyaW50eAorICAgIGFybV9uZW9uX3ZyaW50eiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZyaW50egorICAgIGFybV9uZW9uX3Zyc2hpZnRuLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZyc2hpZnRuCisgICAgYXJtX25lb25fdnJzaGlmdHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnJzaGlmdHMKKyAgICBhcm1fbmVvbl92cnNoaWZ0dSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cnNoaWZ0dQorICAgIGFybV9uZW9uX3Zyc3FydGUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZyc3FydGUKKyAgICBhcm1fbmVvbl92cnNxcnRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cnNxcnRzCisgICAgYXJtX25lb25fdnJzdWJobiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnJzdWJobgorICAgIGFybV9uZW9uX3ZzaGlmdGlucywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZzaGlmdGlucworICAgIGFybV9uZW9uX3ZzaGlmdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZzaGlmdHMKKyAgICBhcm1fbmVvbl92c2hpZnR1LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52c2hpZnR1CisgICAgYXJtX25lb25fdnN0MSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnN0MQorICAgIGFybV9uZW9uX3ZzdDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZzdDIKKyAgICBhcm1fbmVvbl92c3QybGFuZSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52c3QybGFuZQorICAgIGFybV9uZW9uX3ZzdDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZzdDMKKyAgICBhcm1fbmVvbl92c3QzbGFuZSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52c3QzbGFuZQorICAgIGFybV9uZW9uX3ZzdDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZzdDQKKyAgICBhcm1fbmVvbl92c3Q0bGFuZSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52c3Q0bGFuZQorICAgIGFybV9uZW9uX3Z0YmwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZ0YmwxCisgICAgYXJtX25lb25fdnRibDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnRibDIKKyAgICBhcm1fbmVvbl92dGJsMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52dGJsMworICAgIGFybV9uZW9uX3Z0Ymw0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZ0Ymw0CisgICAgYXJtX25lb25fdnRieDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnRieDEKKyAgICBhcm1fbmVvbl92dGJ4MiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52dGJ4MgorICAgIGFybV9uZW9uX3Z0YngzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZ0YngzCisgICAgYXJtX25lb25fdnRieDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnRieDQKKyAgICBhcm1fcWFkZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ucWFkZAorICAgIGFybV9xYWRkMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5xYWRkMTYKKyAgICBhcm1fcWFkZDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ucWFkZDgKKyAgICBhcm1fcWFzeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ucWFzeAorICAgIGFybV9xc2F4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5xc2F4CisgICAgYXJtX3FzdWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnFzdWIKKyAgICBhcm1fcXN1YjE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ucXN1YjE2CisgICAgYXJtX3FzdWI4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnFzdWI4CisgICAgYXJtX3NhZGQxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNhZGQxNgorICAgIGFybV9zYWRkOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zYWRkOAorICAgIGFybV9zYXN4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zYXN4CisgICAgYXJtX3NlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNlbAorICAgIGFybV9zZXRfZnBzY3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zZXQuZnBzY3IKKyAgICBhcm1fc2hhZGQxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc2hhZGQxNgorICAgIGFybV9zaGFkZDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zaGFkZDgKKyAgICBhcm1fc2hhc3gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc2hhc3gKKyAgICBhcm1fc2hzYXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc2hzYXgKKyAgICBhcm1fc2hzdWIxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc2hzdWIxNgorICAgIGFybV9zaHN1YjgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zaHN1YjgKKyAgICBhcm1fc21sYWJiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc21sYWJiCisgICAgYXJtX3NtbGFidCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNtbGFidAorICAgIGFybV9zbWxhZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zbWxhZAorICAgIGFybV9zbWxhZHgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zbWxhZHgKKyAgICBhcm1fc21sYWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc21sYWxkCisgICAgYXJtX3NtbGFsZHgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNtbGFsZHgKKyAgICBhcm1fc21sYXRiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc21sYXRiCisgICAgYXJtX3NtbGF0dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNtbGF0dAorICAgIGFybV9zbWxhd2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zbWxhd2IKKyAgICBhcm1fc21sYXd0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc21sYXd0CisgICAgYXJtX3NtbHNkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNtbHNkCisgICAgYXJtX3NtbHNkeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNtbHNkeAorICAgIGFybV9zbWxzbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zbWxzbGQKKyAgICBhcm1fc21sc2xkeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc21sc2xkeAorICAgIGFybV9zbXVhZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zbXVhZAorICAgIGFybV9zbXVhZHgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zbXVhZHgKKyAgICBhcm1fc211bGJiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc211bGJiCisgICAgYXJtX3NtdWxidCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNtdWxidAorICAgIGFybV9zbXVsdGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zbXVsdGIKKyAgICBhcm1fc211bHR0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc211bHR0CisgICAgYXJtX3NtdWx3YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNtdWx3YgorICAgIGFybV9zbXVsd3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zbXVsd3QKKyAgICBhcm1fc211c2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc211c2QKKyAgICBhcm1fc211c2R4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc211c2R4CisgICAgYXJtX3NwYWNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNwYWNlCisgICAgYXJtX3NzYXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNzYXQKKyAgICBhcm1fc3NhdDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc3NhdDE2CisgICAgYXJtX3NzYXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNzYXgKKyAgICBhcm1fc3N1YjE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc3N1YjE2CisgICAgYXJtX3NzdWI4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNzdWI4CisgICAgYXJtX3N0YywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnN0YworICAgIGFybV9zdGMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zdGMyCisgICAgYXJtX3N0YzJsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnN0YzJsCisgICAgYXJtX3N0Y2wsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnN0Y2wKKyAgICBhcm1fc3RsZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc3RsZXgKKyAgICBhcm1fc3RsZXhkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc3RsZXhkCisgICAgYXJtX3N0cmV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnN0cmV4CisgICAgYXJtX3N0cmV4ZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnN0cmV4ZAorICAgIGFybV9zeHRhYjE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zeHRhYjE2CisgICAgYXJtX3N4dGIxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnN4dGIxNgorICAgIGFybV91YWRkMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51YWRkMTYKKyAgICBhcm1fdWFkZDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udWFkZDgKKyAgICBhcm1fdWFzeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udWFzeAorICAgIGFybV91aGFkZDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51aGFkZDE2CisgICAgYXJtX3VoYWRkOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnVoYWRkOAorICAgIGFybV91aGFzeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51aGFzeAorICAgIGFybV91aHNheCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51aHNheAorICAgIGFybV91aHN1YjE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51aHN1YjE2CisgICAgYXJtX3Voc3ViOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnVoc3ViOAorICAgIGFybV91bmRlZmluZWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51bmRlZmluZWQKKyAgICBhcm1fdXFhZGQxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udXFhZGQxNgorICAgIGFybV91cWFkZDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51cWFkZDgKKyAgICBhcm1fdXFhc3gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udXFhc3gKKyAgICBhcm1fdXFzYXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udXFzYXgKKyAgICBhcm1fdXFzdWIxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udXFzdWIxNgorICAgIGFybV91cXN1YjgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51cXN1YjgKKyAgICBhcm1fdXNhZDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udXNhZDgKKyAgICBhcm1fdXNhZGE4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udXNhZGE4CisgICAgYXJtX3VzYXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnVzYXQKKyAgICBhcm1fdXNhdDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udXNhdDE2CisgICAgYXJtX3VzYXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnVzYXgKKyAgICBhcm1fdXN1YjE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udXN1YjE2CisgICAgYXJtX3VzdWI4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnVzdWI4CisgICAgYXJtX3V4dGFiMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnV4dGFiMTYKKyAgICBhcm1fdXh0YjE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udXh0YjE2CisgICAgYXJtX3ZjdnRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnZjdnRyCisgICAgYXJtX3ZjdnRydSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnZjdnRydQorICAgIGJwZl9sb2FkX2J5dGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmJwZi5sb2FkLmJ5dGUKKyAgICBicGZfbG9hZF9oYWxmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5icGYubG9hZC5oYWxmCisgICAgYnBmX2xvYWRfd29yZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYnBmLmxvYWQud29yZAorICAgIGJwZl9wc2V1ZG8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmJwZi5wc2V1ZG8KKyAgICBoZXhhZ29uX0EyX2FicywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFicworICAgIGhleGFnb25fQTJfYWJzcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYWJzcAorICAgIGhleGFnb25fQTJfYWJzc2F0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYWJzc2F0CisgICAgaGV4YWdvbl9BMl9hZGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGQKKyAgICBoZXhhZ29uX0EyX2FkZGhfaDE2X2hoLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LmhoCisgICAgaGV4YWdvbl9BMl9hZGRoX2gxNl9obCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRoLmgxNi5obAorICAgIGhleGFnb25fQTJfYWRkaF9oMTZfbGgsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYWRkaC5oMTYubGgKKyAgICBoZXhhZ29uX0EyX2FkZGhfaDE2X2xsLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LmxsCisgICAgaGV4YWdvbl9BMl9hZGRoX2gxNl9zYXRfaGgsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRoLmgxNi5zYXQuaGgKKyAgICBoZXhhZ29uX0EyX2FkZGhfaDE2X3NhdF9obCwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LnNhdC5obAorICAgIGhleGFnb25fQTJfYWRkaF9oMTZfc2F0X2xoLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYWRkaC5oMTYuc2F0LmxoCisgICAgaGV4YWdvbl9BMl9hZGRoX2gxNl9zYXRfbGwsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRoLmgxNi5zYXQubGwKKyAgICBoZXhhZ29uX0EyX2FkZGhfbDE2X2hsLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGgubDE2LmhsCisgICAgaGV4YWdvbl9BMl9hZGRoX2wxNl9sbCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRoLmwxNi5sbAorICAgIGhleGFnb25fQTJfYWRkaF9sMTZfc2F0X2hsLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYWRkaC5sMTYuc2F0LmhsCisgICAgaGV4YWdvbl9BMl9hZGRoX2wxNl9zYXRfbGwsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRoLmwxNi5zYXQubGwKKyAgICBoZXhhZ29uX0EyX2FkZGksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGkKKyAgICBoZXhhZ29uX0EyX2FkZHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZHAKKyAgICBoZXhhZ29uX0EyX2FkZHBzYXQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZHBzYXQKKyAgICBoZXhhZ29uX0EyX2FkZHNhdCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZHNhdAorICAgIGhleGFnb25fQTJfYWRkc3AsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYWRkc3AKKyAgICBoZXhhZ29uX0EyX2FuZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFuZAorICAgIGhleGFnb25fQTJfYW5kaXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYW5kaXIKKyAgICBoZXhhZ29uX0EyX2FuZHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFuZHAKKyAgICBoZXhhZ29uX0EyX2FzbGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFzbGgKKyAgICBoZXhhZ29uX0EyX2FzcmgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFzcmgKKyAgICBoZXhhZ29uX0EyX2NvbWJpbmVfaGgsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmNvbWJpbmUuaGgKKyAgICBoZXhhZ29uX0EyX2NvbWJpbmVfaGwsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmNvbWJpbmUuaGwKKyAgICBoZXhhZ29uX0EyX2NvbWJpbmVfbGgsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmNvbWJpbmUubGgKKyAgICBoZXhhZ29uX0EyX2NvbWJpbmVfbGwsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmNvbWJpbmUubGwKKyAgICBoZXhhZ29uX0EyX2NvbWJpbmVpaSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmNvbWJpbmVpaQorICAgIGhleGFnb25fQTJfY29tYmluZXcsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuY29tYmluZXcKKyAgICBoZXhhZ29uX0EyX21heCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLm1heAorICAgIGhleGFnb25fQTJfbWF4cCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIubWF4cAorICAgIGhleGFnb25fQTJfbWF4dSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIubWF4dQorICAgIGhleGFnb25fQTJfbWF4dXAsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIubWF4dXAKKyAgICBoZXhhZ29uX0EyX21pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLm1pbgorICAgIGhleGFnb25fQTJfbWlucCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIubWlucAorICAgIGhleGFnb25fQTJfbWludSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIubWludQorICAgIGhleGFnb25fQTJfbWludXAsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIubWludXAKKyAgICBoZXhhZ29uX0EyX25lZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLm5lZworICAgIGhleGFnb25fQTJfbmVncCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIubmVncAorICAgIGhleGFnb25fQTJfbmVnc2F0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIubmVnc2F0CisgICAgaGV4YWdvbl9BMl9ub3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5ub3QKKyAgICBoZXhhZ29uX0EyX25vdHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLm5vdHAKKyAgICBoZXhhZ29uX0EyX29yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLm9yCisgICAgaGV4YWdvbl9BMl9vcmlyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5vcmlyCisgICAgaGV4YWdvbl9BMl9vcnAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5vcnAKKyAgICBoZXhhZ29uX0EyX3JvdW5kc2F0LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnJvdW5kc2F0CisgICAgaGV4YWdvbl9BMl9zYXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zYXQKKyAgICBoZXhhZ29uX0EyX3NhdGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnNhdGIKKyAgICBoZXhhZ29uX0EyX3NhdGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnNhdGgKKyAgICBoZXhhZ29uX0EyX3NhdHViLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnNhdHViCisgICAgaGV4YWdvbl9BMl9zYXR1aCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zYXR1aAorICAgIGhleGFnb25fQTJfc3ViLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3ViCisgICAgaGV4YWdvbl9BMl9zdWJoX2gxNl9oaCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5oaAorICAgIGhleGFnb25fQTJfc3ViaF9oMTZfaGwsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3ViaC5oMTYuaGwKKyAgICBoZXhhZ29uX0EyX3N1YmhfaDE2X2xoLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YmguaDE2LmxoCisgICAgaGV4YWdvbl9BMl9zdWJoX2gxNl9sbCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5sbAorICAgIGhleGFnb25fQTJfc3ViaF9oMTZfc2F0X2hoLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3ViaC5oMTYuc2F0LmhoCisgICAgaGV4YWdvbl9BMl9zdWJoX2gxNl9zYXRfaGwsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5zYXQuaGwKKyAgICBoZXhhZ29uX0EyX3N1YmhfaDE2X3NhdF9saCwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YmguaDE2LnNhdC5saAorICAgIGhleGFnb25fQTJfc3ViaF9oMTZfc2F0X2xsLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3ViaC5oMTYuc2F0LmxsCisgICAgaGV4YWdvbl9BMl9zdWJoX2wxNl9obCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmwxNi5obAorICAgIGhleGFnb25fQTJfc3ViaF9sMTZfbGwsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3ViaC5sMTYubGwKKyAgICBoZXhhZ29uX0EyX3N1YmhfbDE2X3NhdF9obCwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YmgubDE2LnNhdC5obAorICAgIGhleGFnb25fQTJfc3ViaF9sMTZfc2F0X2xsLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3ViaC5sMTYuc2F0LmxsCisgICAgaGV4YWdvbl9BMl9zdWJwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJwCisgICAgaGV4YWdvbl9BMl9zdWJyaSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJyaQorICAgIGhleGFnb25fQTJfc3Vic2F0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3Vic2F0CisgICAgaGV4YWdvbl9BMl9zdmFkZGgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zdmFkZGgKKyAgICBoZXhhZ29uX0EyX3N2YWRkaHMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN2YWRkaHMKKyAgICBoZXhhZ29uX0EyX3N2YWRkdWhzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN2YWRkdWhzCisgICAgaGV4YWdvbl9BMl9zdmF2Z2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zdmF2Z2gKKyAgICBoZXhhZ29uX0EyX3N2YXZnaHMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN2YXZnaHMKKyAgICBoZXhhZ29uX0EyX3N2bmF2Z2gsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN2bmF2Z2gKKyAgICBoZXhhZ29uX0EyX3N2c3ViaCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN2c3ViaAorICAgIGhleGFnb25fQTJfc3ZzdWJocywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3ZzdWJocworICAgIGhleGFnb25fQTJfc3ZzdWJ1aHMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3ZzdWJ1aHMKKyAgICBoZXhhZ29uX0EyX3N3aXosICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN3aXoKKyAgICBoZXhhZ29uX0EyX3N4dGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN4dGIKKyAgICBoZXhhZ29uX0EyX3N4dGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN4dGgKKyAgICBoZXhhZ29uX0EyX3N4dHcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN4dHcKKyAgICBoZXhhZ29uX0EyX3RmciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnRmcgorICAgIGhleGFnb25fQTJfdGZyaWgsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudGZyaWgKKyAgICBoZXhhZ29uX0EyX3RmcmlsLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnRmcmlsCisgICAgaGV4YWdvbl9BMl90ZnJwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi50ZnJwCisgICAgaGV4YWdvbl9BMl90ZnJwaSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi50ZnJwaQorICAgIGhleGFnb25fQTJfdGZyc2ksICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudGZyc2kKKyAgICBoZXhhZ29uX0EyX3ZhYnNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZhYnNoCisgICAgaGV4YWdvbl9BMl92YWJzaHNhdCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52YWJzaHNhdAorICAgIGhleGFnb25fQTJfdmFic3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmFic3cKKyAgICBoZXhhZ29uX0EyX3ZhYnN3c2F0LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZhYnN3c2F0CisgICAgaGV4YWdvbl9BMl92YWRkYl9tYXAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52YWRkYi5tYXAKKyAgICBoZXhhZ29uX0EyX3ZhZGRoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZhZGRoCisgICAgaGV4YWdvbl9BMl92YWRkaHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52YWRkaHMKKyAgICBoZXhhZ29uX0EyX3ZhZGR1YiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZhZGR1YgorICAgIGhleGFnb25fQTJfdmFkZHVicywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmFkZHVicworICAgIGhleGFnb25fQTJfdmFkZHVocywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmFkZHVocworICAgIGhleGFnb25fQTJfdmFkZHcsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmFkZHcKKyAgICBoZXhhZ29uX0EyX3ZhZGR3cywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZhZGR3cworICAgIGhleGFnb25fQTJfdmF2Z2gsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmF2Z2gKKyAgICBoZXhhZ29uX0EyX3ZhdmdoY3IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZhdmdoY3IKKyAgICBoZXhhZ29uX0EyX3ZhdmdociwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZhdmdocgorICAgIGhleGFnb25fQTJfdmF2Z3ViLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmF2Z3ViCisgICAgaGV4YWdvbl9BMl92YXZndWJyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52YXZndWJyCisgICAgaGV4YWdvbl9BMl92YXZndWgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52YXZndWgKKyAgICBoZXhhZ29uX0EyX3Zhdmd1aHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZhdmd1aHIKKyAgICBoZXhhZ29uX0EyX3Zhdmd1dywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZhdmd1dworICAgIGhleGFnb25fQTJfdmF2Z3V3ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmF2Z3V3cgorICAgIGhleGFnb25fQTJfdmF2Z3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmF2Z3cKKyAgICBoZXhhZ29uX0EyX3Zhdmd3Y3IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZhdmd3Y3IKKyAgICBoZXhhZ29uX0EyX3Zhdmd3ciwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZhdmd3cgorICAgIGhleGFnb25fQTJfdmNtcGJlcSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmNtcGJlcQorICAgIGhleGFnb25fQTJfdmNtcGJndHUsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmNtcGJndHUKKyAgICBoZXhhZ29uX0EyX3ZjbXBoZXEsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZjbXBoZXEKKyAgICBoZXhhZ29uX0EyX3ZjbXBoZ3QsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZjbXBoZ3QKKyAgICBoZXhhZ29uX0EyX3ZjbXBoZ3R1LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZjbXBoZ3R1CisgICAgaGV4YWdvbl9BMl92Y21wd2VxLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52Y21wd2VxCisgICAgaGV4YWdvbl9BMl92Y21wd2d0LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52Y21wd2d0CisgICAgaGV4YWdvbl9BMl92Y21wd2d0dSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52Y21wd2d0dQorICAgIGhleGFnb25fQTJfdmNvbmosICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmNvbmoKKyAgICBoZXhhZ29uX0EyX3ZtYXhiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZtYXhiCisgICAgaGV4YWdvbl9BMl92bWF4aCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52bWF4aAorICAgIGhleGFnb25fQTJfdm1heHViLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudm1heHViCisgICAgaGV4YWdvbl9BMl92bWF4dWgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52bWF4dWgKKyAgICBoZXhhZ29uX0EyX3ZtYXh1dywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZtYXh1dworICAgIGhleGFnb25fQTJfdm1heHcsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudm1heHcKKyAgICBoZXhhZ29uX0EyX3ZtaW5iLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZtaW5iCisgICAgaGV4YWdvbl9BMl92bWluaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52bWluaAorICAgIGhleGFnb25fQTJfdm1pbnViLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudm1pbnViCisgICAgaGV4YWdvbl9BMl92bWludWgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52bWludWgKKyAgICBoZXhhZ29uX0EyX3ZtaW51dywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZtaW51dworICAgIGhleGFnb25fQTJfdm1pbncsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudm1pbncKKyAgICBoZXhhZ29uX0EyX3ZuYXZnaCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZuYXZnaAorICAgIGhleGFnb25fQTJfdm5hdmdoY3IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudm5hdmdoY3IKKyAgICBoZXhhZ29uX0EyX3ZuYXZnaHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZuYXZnaHIKKyAgICBoZXhhZ29uX0EyX3ZuYXZndywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZuYXZndworICAgIGhleGFnb25fQTJfdm5hdmd3Y3IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudm5hdmd3Y3IKKyAgICBoZXhhZ29uX0EyX3ZuYXZnd3IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZuYXZnd3IKKyAgICBoZXhhZ29uX0EyX3ZyYWRkdWIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZyYWRkdWIKKyAgICBoZXhhZ29uX0EyX3ZyYWRkdWJfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZyYWRkdWIuYWNjCisgICAgaGV4YWdvbl9BMl92cnNhZHViLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52cnNhZHViCisgICAgaGV4YWdvbl9BMl92cnNhZHViX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52cnNhZHViLmFjYworICAgIGhleGFnb25fQTJfdnN1YmJfbWFwLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudnN1YmIubWFwCisgICAgaGV4YWdvbl9BMl92c3ViaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52c3ViaAorICAgIGhleGFnb25fQTJfdnN1YmhzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudnN1YmhzCisgICAgaGV4YWdvbl9BMl92c3VidWIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52c3VidWIKKyAgICBoZXhhZ29uX0EyX3ZzdWJ1YnMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZzdWJ1YnMKKyAgICBoZXhhZ29uX0EyX3ZzdWJ1aHMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZzdWJ1aHMKKyAgICBoZXhhZ29uX0EyX3ZzdWJ3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZzdWJ3CisgICAgaGV4YWdvbl9BMl92c3Vid3MsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52c3Vid3MKKyAgICBoZXhhZ29uX0EyX3hvciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnhvcgorICAgIGhleGFnb25fQTJfeG9ycCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIueG9ycAorICAgIGhleGFnb25fQTJfenh0YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuenh0YgorICAgIGhleGFnb25fQTJfenh0aCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuenh0aAorICAgIGhleGFnb25fQTRfYW5kbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQuYW5kbgorICAgIGhleGFnb25fQTRfYW5kbnAsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQuYW5kbnAKKyAgICBoZXhhZ29uX0E0X2JpdHNwbGl0LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LmJpdHNwbGl0CisgICAgaGV4YWdvbl9BNF9iaXRzcGxpdGksICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5iaXRzcGxpdGkKKyAgICBoZXhhZ29uX0E0X2JvdW5kc2NoZWNrLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LmJvdW5kc2NoZWNrCisgICAgaGV4YWdvbl9BNF9jbXBiZXEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5jbXBiZXEKKyAgICBoZXhhZ29uX0E0X2NtcGJlcWksICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LmNtcGJlcWkKKyAgICBoZXhhZ29uX0E0X2NtcGJndCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LmNtcGJndAorICAgIGhleGFnb25fQTRfY21wYmd0aSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQuY21wYmd0aQorICAgIGhleGFnb25fQTRfY21wYmd0dSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQuY21wYmd0dQorICAgIGhleGFnb25fQTRfY21wYmd0dWksICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQuY21wYmd0dWkKKyAgICBoZXhhZ29uX0E0X2NtcGhlcSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LmNtcGhlcQorICAgIGhleGFnb25fQTRfY21waGVxaSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQuY21waGVxaQorICAgIGhleGFnb25fQTRfY21waGd0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQuY21waGd0CisgICAgaGV4YWdvbl9BNF9jbXBoZ3RpLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5jbXBoZ3RpCisgICAgaGV4YWdvbl9BNF9jbXBoZ3R1LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5jbXBoZ3R1CisgICAgaGV4YWdvbl9BNF9jbXBoZ3R1aSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5jbXBoZ3R1aQorICAgIGhleGFnb25fQTRfY29tYmluZWlyLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQuY29tYmluZWlyCisgICAgaGV4YWdvbl9BNF9jb21iaW5lcmksICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5jb21iaW5lcmkKKyAgICBoZXhhZ29uX0E0X2Nyb3VuZF9yaSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LmNyb3VuZC5yaQorICAgIGhleGFnb25fQTRfY3JvdW5kX3JyLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQuY3JvdW5kLnJyCisgICAgaGV4YWdvbl9BNF9tb2R3cmFwdSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5tb2R3cmFwdQorICAgIGhleGFnb25fQTRfb3JuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQub3JuCisgICAgaGV4YWdvbl9BNF9vcm5wLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5vcm5wCisgICAgaGV4YWdvbl9BNF9yY21wZXEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5yY21wZXEKKyAgICBoZXhhZ29uX0E0X3JjbXBlcWksICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnJjbXBlcWkKKyAgICBoZXhhZ29uX0E0X3JjbXBuZXEsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnJjbXBuZXEKKyAgICBoZXhhZ29uX0E0X3JjbXBuZXFpLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnJjbXBuZXFpCisgICAgaGV4YWdvbl9BNF9yb3VuZF9yaSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5yb3VuZC5yaQorICAgIGhleGFnb25fQTRfcm91bmRfcmlfc2F0LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQucm91bmQucmkuc2F0CisgICAgaGV4YWdvbl9BNF9yb3VuZF9yciwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5yb3VuZC5ycgorICAgIGhleGFnb25fQTRfcm91bmRfcnJfc2F0LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQucm91bmQucnIuc2F0CisgICAgaGV4YWdvbl9BNF90bGJtYXRjaCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC50bGJtYXRjaAorICAgIGhleGFnb25fQTRfdmNtcGJlcV9hbnksICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQudmNtcGJlcS5hbnkKKyAgICBoZXhhZ29uX0E0X3ZjbXBiZXFpLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnZjbXBiZXFpCisgICAgaGV4YWdvbl9BNF92Y21wYmd0LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC52Y21wYmd0CisgICAgaGV4YWdvbl9BNF92Y21wYmd0aSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC52Y21wYmd0aQorICAgIGhleGFnb25fQTRfdmNtcGJndHVpLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQudmNtcGJndHVpCisgICAgaGV4YWdvbl9BNF92Y21waGVxaSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC52Y21waGVxaQorICAgIGhleGFnb25fQTRfdmNtcGhndGksICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQudmNtcGhndGkKKyAgICBoZXhhZ29uX0E0X3ZjbXBoZ3R1aSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnZjbXBoZ3R1aQorICAgIGhleGFnb25fQTRfdmNtcHdlcWksICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQudmNtcHdlcWkKKyAgICBoZXhhZ29uX0E0X3ZjbXB3Z3RpLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnZjbXB3Z3RpCisgICAgaGV4YWdvbl9BNF92Y21wd2d0dWksICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC52Y21wd2d0dWkKKyAgICBoZXhhZ29uX0E0X3ZybWF4aCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnZybWF4aAorICAgIGhleGFnb25fQTRfdnJtYXh1aCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQudnJtYXh1aAorICAgIGhleGFnb25fQTRfdnJtYXh1dywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQudnJtYXh1dworICAgIGhleGFnb25fQTRfdnJtYXh3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQudnJtYXh3CisgICAgaGV4YWdvbl9BNF92cm1pbmgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC52cm1pbmgKKyAgICBoZXhhZ29uX0E0X3ZybWludWgsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnZybWludWgKKyAgICBoZXhhZ29uX0E0X3ZybWludXcsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnZybWludXcKKyAgICBoZXhhZ29uX0E0X3ZybWludywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnZybWludworICAgIGhleGFnb25fQTVfdmFkZGh1YnMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTUudmFkZGh1YnMKKyAgICBoZXhhZ29uX0E2X3ZjbXBiZXFfbm90YW55LCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE2LnZjbXBiZXEubm90YW55CisgICAgaGV4YWdvbl9BNl92Y21wYmVxX25vdGFueV8xMjhCLCAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNi52Y21wYmVxLm5vdGFueS4xMjhCCisgICAgaGV4YWdvbl9DMl9hbGw4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi5hbGw4CisgICAgaGV4YWdvbl9DMl9hbmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi5hbmQKKyAgICBoZXhhZ29uX0MyX2FuZG4sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLmFuZG4KKyAgICBoZXhhZ29uX0MyX2FueTgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLmFueTgKKyAgICBoZXhhZ29uX0MyX2JpdHNjbHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLmJpdHNjbHIKKyAgICBoZXhhZ29uX0MyX2JpdHNjbHJpLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLmJpdHNjbHJpCisgICAgaGV4YWdvbl9DMl9iaXRzc2V0LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi5iaXRzc2V0CisgICAgaGV4YWdvbl9DMl9jbXBlcSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi5jbXBlcQorICAgIGhleGFnb25fQzJfY21wZXFpLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIuY21wZXFpCisgICAgaGV4YWdvbl9DMl9jbXBlcXAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi5jbXBlcXAKKyAgICBoZXhhZ29uX0MyX2NtcGdlaSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGdlaQorICAgIGhleGFnb25fQzJfY21wZ2V1aSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIuY21wZ2V1aQorICAgIGhleGFnb25fQzJfY21wZ3QsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIuY21wZ3QKKyAgICBoZXhhZ29uX0MyX2NtcGd0aSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGd0aQorICAgIGhleGFnb25fQzJfY21wZ3RwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIuY21wZ3RwCisgICAgaGV4YWdvbl9DMl9jbXBndHUsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi5jbXBndHUKKyAgICBoZXhhZ29uX0MyX2NtcGd0dWksICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGd0dWkKKyAgICBoZXhhZ29uX0MyX2NtcGd0dXAsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGd0dXAKKyAgICBoZXhhZ29uX0MyX2NtcGx0LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGx0CisgICAgaGV4YWdvbl9DMl9jbXBsdHUsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi5jbXBsdHUKKyAgICBoZXhhZ29uX0MyX21hc2ssICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLm1hc2sKKyAgICBoZXhhZ29uX0MyX211eCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLm11eAorICAgIGhleGFnb25fQzJfbXV4aWksICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIubXV4aWkKKyAgICBoZXhhZ29uX0MyX211eGlyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLm11eGlyCisgICAgaGV4YWdvbl9DMl9tdXhyaSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi5tdXhyaQorICAgIGhleGFnb25fQzJfbm90LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIubm90CisgICAgaGV4YWdvbl9DMl9vciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi5vcgorICAgIGhleGFnb25fQzJfb3JuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIub3JuCisgICAgaGV4YWdvbl9DMl9weGZlcl9tYXAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi5weGZlci5tYXAKKyAgICBoZXhhZ29uX0MyX3RmcnByLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLnRmcnByCisgICAgaGV4YWdvbl9DMl90ZnJycCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi50ZnJycAorICAgIGhleGFnb25fQzJfdml0cGFjaywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIudml0cGFjaworICAgIGhleGFnb25fQzJfdm11eCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIudm11eAorICAgIGhleGFnb25fQzJfeG9yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIueG9yCisgICAgaGV4YWdvbl9DNF9hbmRfYW5kLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DNC5hbmQuYW5kCisgICAgaGV4YWdvbl9DNF9hbmRfYW5kbiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DNC5hbmQuYW5kbgorICAgIGhleGFnb25fQzRfYW5kX29yLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzQuYW5kLm9yCisgICAgaGV4YWdvbl9DNF9hbmRfb3JuLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DNC5hbmQub3JuCisgICAgaGV4YWdvbl9DNF9jbXBsdGUsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DNC5jbXBsdGUKKyAgICBoZXhhZ29uX0M0X2NtcGx0ZWksICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0LmNtcGx0ZWkKKyAgICBoZXhhZ29uX0M0X2NtcGx0ZXUsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0LmNtcGx0ZXUKKyAgICBoZXhhZ29uX0M0X2NtcGx0ZXVpLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0LmNtcGx0ZXVpCisgICAgaGV4YWdvbl9DNF9jbXBuZXEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DNC5jbXBuZXEKKyAgICBoZXhhZ29uX0M0X2NtcG5lcWksICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0LmNtcG5lcWkKKyAgICBoZXhhZ29uX0M0X2Zhc3Rjb3JuZXI5LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0LmZhc3Rjb3JuZXI5CisgICAgaGV4YWdvbl9DNF9mYXN0Y29ybmVyOV9ub3QsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DNC5mYXN0Y29ybmVyOS5ub3QKKyAgICBoZXhhZ29uX0M0X25iaXRzY2xyLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0Lm5iaXRzY2xyCisgICAgaGV4YWdvbl9DNF9uYml0c2NscmksICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DNC5uYml0c2NscmkKKyAgICBoZXhhZ29uX0M0X25iaXRzc2V0LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0Lm5iaXRzc2V0CisgICAgaGV4YWdvbl9DNF9vcl9hbmQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DNC5vci5hbmQKKyAgICBoZXhhZ29uX0M0X29yX2FuZG4sICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0Lm9yLmFuZG4KKyAgICBoZXhhZ29uX0M0X29yX29yLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0Lm9yLm9yCisgICAgaGV4YWdvbl9DNF9vcl9vcm4sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DNC5vci5vcm4KKyAgICBoZXhhZ29uX0YyX2NvbnZfZDJkZiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuZDJkZgorICAgIGhleGFnb25fRjJfY29udl9kMnNmLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi5kMnNmCisgICAgaGV4YWdvbl9GMl9jb252X2RmMmQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LmRmMmQKKyAgICBoZXhhZ29uX0YyX2NvbnZfZGYyZF9jaG9wLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYyZC5jaG9wCisgICAgaGV4YWdvbl9GMl9jb252X2RmMnNmLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LmRmMnNmCisgICAgaGV4YWdvbl9GMl9jb252X2RmMnVkLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LmRmMnVkCisgICAgaGV4YWdvbl9GMl9jb252X2RmMnVkX2Nob3AsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LmRmMnVkLmNob3AKKyAgICBoZXhhZ29uX0YyX2NvbnZfZGYydXcsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYydXcKKyAgICBoZXhhZ29uX0YyX2NvbnZfZGYydXdfY2hvcCwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYydXcuY2hvcAorICAgIGhleGFnb25fRjJfY29udl9kZjJ3LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi5kZjJ3CisgICAgaGV4YWdvbl9GMl9jb252X2RmMndfY2hvcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LmRmMncuY2hvcAorICAgIGhleGFnb25fRjJfY29udl9zZjJkLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi5zZjJkCisgICAgaGV4YWdvbl9GMl9jb252X3NmMmRfY2hvcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnNmMmQuY2hvcAorICAgIGhleGFnb25fRjJfY29udl9zZjJkZiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi5zZjJkZgorICAgIGhleGFnb25fRjJfY29udl9zZjJ1ZCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi5zZjJ1ZAorICAgIGhleGFnb25fRjJfY29udl9zZjJ1ZF9jaG9wLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi5zZjJ1ZC5jaG9wCisgICAgaGV4YWdvbl9GMl9jb252X3NmMnV3LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnNmMnV3CisgICAgaGV4YWdvbl9GMl9jb252X3NmMnV3X2Nob3AsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnNmMnV3LmNob3AKKyAgICBoZXhhZ29uX0YyX2NvbnZfc2YydywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuc2YydworICAgIGhleGFnb25fRjJfY29udl9zZjJ3X2Nob3AsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi5zZjJ3LmNob3AKKyAgICBoZXhhZ29uX0YyX2NvbnZfdWQyZGYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYudWQyZGYKKyAgICBoZXhhZ29uX0YyX2NvbnZfdWQyc2YsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYudWQyc2YKKyAgICBoZXhhZ29uX0YyX2NvbnZfdXcyZGYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYudXcyZGYKKyAgICBoZXhhZ29uX0YyX2NvbnZfdXcyc2YsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYudXcyc2YKKyAgICBoZXhhZ29uX0YyX2NvbnZfdzJkZiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYudzJkZgorICAgIGhleGFnb25fRjJfY29udl93MnNmLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi53MnNmCisgICAgaGV4YWdvbl9GMl9kZmNsYXNzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5kZmNsYXNzCisgICAgaGV4YWdvbl9GMl9kZmNtcGVxLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5kZmNtcGVxCisgICAgaGV4YWdvbl9GMl9kZmNtcGdlLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5kZmNtcGdlCisgICAgaGV4YWdvbl9GMl9kZmNtcGd0LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5kZmNtcGd0CisgICAgaGV4YWdvbl9GMl9kZmNtcHVvLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5kZmNtcHVvCisgICAgaGV4YWdvbl9GMl9kZmltbV9uLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5kZmltbS5uCisgICAgaGV4YWdvbl9GMl9kZmltbV9wLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5kZmltbS5wCisgICAgaGV4YWdvbl9GMl9zZmFkZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5zZmFkZAorICAgIGhleGFnb25fRjJfc2ZjbGFzcywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuc2ZjbGFzcworICAgIGhleGFnb25fRjJfc2ZjbXBlcSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuc2ZjbXBlcQorICAgIGhleGFnb25fRjJfc2ZjbXBnZSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuc2ZjbXBnZQorICAgIGhleGFnb25fRjJfc2ZjbXBndCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuc2ZjbXBndAorICAgIGhleGFnb25fRjJfc2ZjbXB1bywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuc2ZjbXB1bworICAgIGhleGFnb25fRjJfc2ZmaXh1cGQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuc2ZmaXh1cGQKKyAgICBoZXhhZ29uX0YyX3NmZml4dXBuLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLnNmZml4dXBuCisgICAgaGV4YWdvbl9GMl9zZmZpeHVwciwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5zZmZpeHVwcgorICAgIGhleGFnb25fRjJfc2ZmbWEsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuc2ZmbWEKKyAgICBoZXhhZ29uX0YyX3NmZm1hX2xpYiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLnNmZm1hLmxpYgorICAgIGhleGFnb25fRjJfc2ZmbWFfc2MsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuc2ZmbWEuc2MKKyAgICBoZXhhZ29uX0YyX3NmZm1zLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLnNmZm1zCisgICAgaGV4YWdvbl9GMl9zZmZtc19saWIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5zZmZtcy5saWIKKyAgICBoZXhhZ29uX0YyX3NmaW1tX24sICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLnNmaW1tLm4KKyAgICBoZXhhZ29uX0YyX3NmaW1tX3AsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLnNmaW1tLnAKKyAgICBoZXhhZ29uX0YyX3NmbWF4LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLnNmbWF4CisgICAgaGV4YWdvbl9GMl9zZm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5zZm1pbgorICAgIGhleGFnb25fRjJfc2ZtcHksICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuc2ZtcHkKKyAgICBoZXhhZ29uX0YyX3Nmc3ViLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLnNmc3ViCisgICAgaGV4YWdvbl9MMl9sb2FkcmJfcGJyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmIucGJyCisgICAgaGV4YWdvbl9MMl9sb2FkcmJfcGNpLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmIucGNpCisgICAgaGV4YWdvbl9MMl9sb2FkcmJfcGNyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmIucGNyCisgICAgaGV4YWdvbl9MMl9sb2FkcmRfcGJyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmQucGJyCisgICAgaGV4YWdvbl9MMl9sb2FkcmRfcGNpLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmQucGNpCisgICAgaGV4YWdvbl9MMl9sb2FkcmRfcGNyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmQucGNyCisgICAgaGV4YWdvbl9MMl9sb2FkcmhfcGJyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmgucGJyCisgICAgaGV4YWdvbl9MMl9sb2FkcmhfcGNpLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmgucGNpCisgICAgaGV4YWdvbl9MMl9sb2FkcmhfcGNyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmgucGNyCisgICAgaGV4YWdvbl9MMl9sb2FkcmlfcGJyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmkucGJyCisgICAgaGV4YWdvbl9MMl9sb2FkcmlfcGNpLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmkucGNpCisgICAgaGV4YWdvbl9MMl9sb2FkcmlfcGNyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmkucGNyCisgICAgaGV4YWdvbl9MMl9sb2FkcnViX3BiciwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcnViLnBicgorICAgIGhleGFnb25fTDJfbG9hZHJ1Yl9wY2ksICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTDIubG9hZHJ1Yi5wY2kKKyAgICBoZXhhZ29uX0wyX2xvYWRydWJfcGNyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRydWIucGNyCisgICAgaGV4YWdvbl9MMl9sb2FkcnVoX3BiciwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcnVoLnBicgorICAgIGhleGFnb25fTDJfbG9hZHJ1aF9wY2ksICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTDIubG9hZHJ1aC5wY2kKKyAgICBoZXhhZ29uX0wyX2xvYWRydWhfcGNyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRydWgucGNyCisgICAgaGV4YWdvbl9MMl9sb2Fkd19sb2NrZWQsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2Fkdy5sb2NrZWQKKyAgICBoZXhhZ29uX0w0X2xvYWRkX2xvY2tlZCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkw0LmxvYWRkLmxvY2tlZAorICAgIGhleGFnb25fTTJfYWNjaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuYWNjaQorICAgIGhleGFnb25fTTJfYWNjaWksICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuYWNjaWkKKyAgICBoZXhhZ29uX00yX2NtYWNpX3MwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmNtYWNpLnMwCisgICAgaGV4YWdvbl9NMl9jbWFjcl9zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5jbWFjci5zMAorICAgIGhleGFnb25fTTJfY21hY3NfczAsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuY21hY3MuczAKKyAgICBoZXhhZ29uX00yX2NtYWNzX3MxLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmNtYWNzLnMxCisgICAgaGV4YWdvbl9NMl9jbWFjc2NfczAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5jbWFjc2MuczAKKyAgICBoZXhhZ29uX00yX2NtYWNzY19zMSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmNtYWNzYy5zMQorICAgIGhleGFnb25fTTJfY21weWlfczAsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuY21weWkuczAKKyAgICBoZXhhZ29uX00yX2NtcHlyX3MwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmNtcHlyLnMwCisgICAgaGV4YWdvbl9NMl9jbXB5cnNfczAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5jbXB5cnMuczAKKyAgICBoZXhhZ29uX00yX2NtcHlyc19zMSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmNtcHlycy5zMQorICAgIGhleGFnb25fTTJfY21weXJzY19zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuY21weXJzYy5zMAorICAgIGhleGFnb25fTTJfY21weXJzY19zMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuY21weXJzYy5zMQorICAgIGhleGFnb25fTTJfY21weXNfczAsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuY21weXMuczAKKyAgICBoZXhhZ29uX00yX2NtcHlzX3MxLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmNtcHlzLnMxCisgICAgaGV4YWdvbl9NMl9jbXB5c2NfczAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5jbXB5c2MuczAKKyAgICBoZXhhZ29uX00yX2NtcHlzY19zMSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmNtcHlzYy5zMQorICAgIGhleGFnb25fTTJfY25hY3NfczAsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuY25hY3MuczAKKyAgICBoZXhhZ29uX00yX2NuYWNzX3MxLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmNuYWNzLnMxCisgICAgaGV4YWdvbl9NMl9jbmFjc2NfczAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5jbmFjc2MuczAKKyAgICBoZXhhZ29uX00yX2NuYWNzY19zMSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmNuYWNzYy5zMQorICAgIGhleGFnb25fTTJfZHBtcHlzc19hY2NfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuZHBtcHlzcy5hY2MuczAKKyAgICBoZXhhZ29uX00yX2RwbXB5c3NfbmFjX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmRwbXB5c3MubmFjLnMwCisgICAgaGV4YWdvbl9NMl9kcG1weXNzX3JuZF9zMCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5kcG1weXNzLnJuZC5zMAorICAgIGhleGFnb25fTTJfZHBtcHlzc19zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuZHBtcHlzcy5zMAorICAgIGhleGFnb25fTTJfZHBtcHl1dV9hY2NfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuZHBtcHl1dS5hY2MuczAKKyAgICBoZXhhZ29uX00yX2RwbXB5dXVfbmFjX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmRwbXB5dXUubmFjLnMwCisgICAgaGV4YWdvbl9NMl9kcG1weXV1X3MwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5kcG1weXV1LnMwCisgICAgaGV4YWdvbl9NMl9obW1weWhfcnMxLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5obW1weWgucnMxCisgICAgaGV4YWdvbl9NMl9obW1weWhfczEsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5obW1weWguczEKKyAgICBoZXhhZ29uX00yX2htbXB5bF9yczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmhtbXB5bC5yczEKKyAgICBoZXhhZ29uX00yX2htbXB5bF9zMSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmhtbXB5bC5zMQorICAgIGhleGFnb25fTTJfbWFjaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubWFjaQorICAgIGhleGFnb25fTTJfbWFjc2luLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubWFjc2luCisgICAgaGV4YWdvbl9NMl9tYWNzaXAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tYWNzaXAKKyAgICBoZXhhZ29uX00yX21tYWNoc19yczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWNocy5yczAKKyAgICBoZXhhZ29uX00yX21tYWNoc19yczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWNocy5yczEKKyAgICBoZXhhZ29uX00yX21tYWNoc19zMCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWNocy5zMAorICAgIGhleGFnb25fTTJfbW1hY2hzX3MxLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1hY2hzLnMxCisgICAgaGV4YWdvbl9NMl9tbWFjbHNfcnMwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjbHMucnMwCisgICAgaGV4YWdvbl9NMl9tbWFjbHNfcnMxLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjbHMucnMxCisgICAgaGV4YWdvbl9NMl9tbWFjbHNfczAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjbHMuczAKKyAgICBoZXhhZ29uX00yX21tYWNsc19zMSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWNscy5zMQorICAgIGhleGFnb25fTTJfbW1hY3Voc19yczAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1hY3Vocy5yczAKKyAgICBoZXhhZ29uX00yX21tYWN1aHNfcnMxLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWN1aHMucnMxCisgICAgaGV4YWdvbl9NMl9tbWFjdWhzX3MwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjdWhzLnMwCisgICAgaGV4YWdvbl9NMl9tbWFjdWhzX3MxLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjdWhzLnMxCisgICAgaGV4YWdvbl9NMl9tbWFjdWxzX3JzMCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjdWxzLnJzMAorICAgIGhleGFnb25fTTJfbW1hY3Vsc19yczEsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1hY3Vscy5yczEKKyAgICBoZXhhZ29uX00yX21tYWN1bHNfczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWN1bHMuczAKKyAgICBoZXhhZ29uX00yX21tYWN1bHNfczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWN1bHMuczEKKyAgICBoZXhhZ29uX00yX21tcHloX3JzMCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHloLnJzMAorICAgIGhleGFnb25fTTJfbW1weWhfcnMxLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1weWgucnMxCisgICAgaGV4YWdvbl9NMl9tbXB5aF9zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5aC5zMAorICAgIGhleGFnb25fTTJfbW1weWhfczEsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1weWguczEKKyAgICBoZXhhZ29uX00yX21tcHlsX3JzMCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHlsLnJzMAorICAgIGhleGFnb25fTTJfbW1weWxfcnMxLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1weWwucnMxCisgICAgaGV4YWdvbl9NMl9tbXB5bF9zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5bC5zMAorICAgIGhleGFnb25fTTJfbW1weWxfczEsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1weWwuczEKKyAgICBoZXhhZ29uX00yX21tcHl1aF9yczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHl1aC5yczAKKyAgICBoZXhhZ29uX00yX21tcHl1aF9yczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHl1aC5yczEKKyAgICBoZXhhZ29uX00yX21tcHl1aF9zMCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHl1aC5zMAorICAgIGhleGFnb25fTTJfbW1weXVoX3MxLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1weXVoLnMxCisgICAgaGV4YWdvbl9NMl9tbXB5dWxfcnMwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5dWwucnMwCisgICAgaGV4YWdvbl9NMl9tbXB5dWxfcnMxLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5dWwucnMxCisgICAgaGV4YWdvbl9NMl9tbXB5dWxfczAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5dWwuczAKKyAgICBoZXhhZ29uX00yX21tcHl1bF9zMSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHl1bC5zMQorICAgIGhleGFnb25fTTJfbXB5X2FjY19oaF9zMCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5oaC5zMAorICAgIGhleGFnb25fTTJfbXB5X2FjY19oaF9zMSwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5oaC5zMQorICAgIGhleGFnb25fTTJfbXB5X2FjY19obF9zMCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5obC5zMAorICAgIGhleGFnb25fTTJfbXB5X2FjY19obF9zMSwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5obC5zMQorICAgIGhleGFnb25fTTJfbXB5X2FjY19saF9zMCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5saC5zMAorICAgIGhleGFnb25fTTJfbXB5X2FjY19saF9zMSwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5saC5zMQorICAgIGhleGFnb25fTTJfbXB5X2FjY19sbF9zMCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5sbC5zMAorICAgIGhleGFnb25fTTJfbXB5X2FjY19sbF9zMSwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5sbC5zMQorICAgIGhleGFnb25fTTJfbXB5X2FjY19zYXRfaGhfczAsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQuaGguczAKKyAgICBoZXhhZ29uX00yX21weV9hY2Nfc2F0X2hoX3MxLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmhoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfYWNjX3NhdF9obF9zMCwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLnNhdC5obC5zMAorICAgIGhleGFnb25fTTJfbXB5X2FjY19zYXRfaGxfczEsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQuaGwuczEKKyAgICBoZXhhZ29uX00yX21weV9hY2Nfc2F0X2xoX3MwLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmxoLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfYWNjX3NhdF9saF9zMSwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLnNhdC5saC5zMQorICAgIGhleGFnb25fTTJfbXB5X2FjY19zYXRfbGxfczAsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQubGwuczAKKyAgICBoZXhhZ29uX00yX21weV9hY2Nfc2F0X2xsX3MxLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmxsLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfaGhfczAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuaGguczAKKyAgICBoZXhhZ29uX00yX21weV9oaF9zMSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5oaC5zMQorICAgIGhleGFnb25fTTJfbXB5X2hsX3MwLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmhsLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfaGxfczEsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuaGwuczEKKyAgICBoZXhhZ29uX00yX21weV9saF9zMCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5saC5zMAorICAgIGhleGFnb25fTTJfbXB5X2xoX3MxLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmxoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfbGxfczAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubGwuczAKKyAgICBoZXhhZ29uX00yX21weV9sbF9zMSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5sbC5zMQorICAgIGhleGFnb25fTTJfbXB5X25hY19oaF9zMCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5oaC5zMAorICAgIGhleGFnb25fTTJfbXB5X25hY19oaF9zMSwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5oaC5zMQorICAgIGhleGFnb25fTTJfbXB5X25hY19obF9zMCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5obC5zMAorICAgIGhleGFnb25fTTJfbXB5X25hY19obF9zMSwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5obC5zMQorICAgIGhleGFnb25fTTJfbXB5X25hY19saF9zMCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5saC5zMAorICAgIGhleGFnb25fTTJfbXB5X25hY19saF9zMSwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5saC5zMQorICAgIGhleGFnb25fTTJfbXB5X25hY19sbF9zMCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5sbC5zMAorICAgIGhleGFnb25fTTJfbXB5X25hY19sbF9zMSwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5sbC5zMQorICAgIGhleGFnb25fTTJfbXB5X25hY19zYXRfaGhfczAsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQuaGguczAKKyAgICBoZXhhZ29uX00yX21weV9uYWNfc2F0X2hoX3MxLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmhoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfbmFjX3NhdF9obF9zMCwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLnNhdC5obC5zMAorICAgIGhleGFnb25fTTJfbXB5X25hY19zYXRfaGxfczEsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQuaGwuczEKKyAgICBoZXhhZ29uX00yX21weV9uYWNfc2F0X2xoX3MwLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmxoLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfbmFjX3NhdF9saF9zMSwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLnNhdC5saC5zMQorICAgIGhleGFnb25fTTJfbXB5X25hY19zYXRfbGxfczAsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQubGwuczAKKyAgICBoZXhhZ29uX00yX21weV9uYWNfc2F0X2xsX3MxLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmxsLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfcm5kX2hoX3MwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmhoLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfcm5kX2hoX3MxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmhoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfcm5kX2hsX3MwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmhsLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfcm5kX2hsX3MxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmhsLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfcm5kX2xoX3MwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmxoLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfcm5kX2xoX3MxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmxoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfcm5kX2xsX3MwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmxsLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfcm5kX2xsX3MxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmxsLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfc2F0X2hoX3MwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmhoLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfc2F0X2hoX3MxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmhoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfc2F0X2hsX3MwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmhsLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfc2F0X2hsX3MxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmhsLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfc2F0X2xoX3MwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmxoLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfc2F0X2xoX3MxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmxoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfc2F0X2xsX3MwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmxsLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfc2F0X2xsX3MxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmxsLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9oaF9zMCwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5oaC5zMAorICAgIGhleGFnb25fTTJfbXB5X3NhdF9ybmRfaGhfczEsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQuaGguczEKKyAgICBoZXhhZ29uX00yX21weV9zYXRfcm5kX2hsX3MwLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQucm5kLmhsLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9obF9zMSwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5obC5zMQorICAgIGhleGFnb25fTTJfbXB5X3NhdF9ybmRfbGhfczAsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQubGguczAKKyAgICBoZXhhZ29uX00yX21weV9zYXRfcm5kX2xoX3MxLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQucm5kLmxoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9sbF9zMCwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5sbC5zMAorICAgIGhleGFnb25fTTJfbXB5X3NhdF9ybmRfbGxfczEsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQubGwuczEKKyAgICBoZXhhZ29uX00yX21weV91cCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS51cAorICAgIGhleGFnb25fTTJfbXB5X3VwX3MxLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LnVwLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfdXBfczFfc2F0LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkudXAuczEuc2F0CisgICAgaGV4YWdvbl9NMl9tcHlkX2FjY19oaF9zMCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLmFjYy5oaC5zMAorICAgIGhleGFnb25fTTJfbXB5ZF9hY2NfaGhfczEsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MuaGguczEKKyAgICBoZXhhZ29uX00yX21weWRfYWNjX2hsX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmhsLnMwCisgICAgaGV4YWdvbl9NMl9tcHlkX2FjY19obF9zMSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLmFjYy5obC5zMQorICAgIGhleGFnb25fTTJfbXB5ZF9hY2NfbGhfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MubGguczAKKyAgICBoZXhhZ29uX00yX21weWRfYWNjX2xoX3MxLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmxoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlkX2FjY19sbF9zMCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLmFjYy5sbC5zMAorICAgIGhleGFnb25fTTJfbXB5ZF9hY2NfbGxfczEsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MubGwuczEKKyAgICBoZXhhZ29uX00yX21weWRfaGhfczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuaGguczAKKyAgICBoZXhhZ29uX00yX21weWRfaGhfczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuaGguczEKKyAgICBoZXhhZ29uX00yX21weWRfaGxfczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuaGwuczAKKyAgICBoZXhhZ29uX00yX21weWRfaGxfczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuaGwuczEKKyAgICBoZXhhZ29uX00yX21weWRfbGhfczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubGguczAKKyAgICBoZXhhZ29uX00yX21weWRfbGhfczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubGguczEKKyAgICBoZXhhZ29uX00yX21weWRfbGxfczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubGwuczAKKyAgICBoZXhhZ29uX00yX21weWRfbGxfczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubGwuczEKKyAgICBoZXhhZ29uX00yX21weWRfbmFjX2hoX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmhoLnMwCisgICAgaGV4YWdvbl9NMl9tcHlkX25hY19oaF9zMSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5oaC5zMQorICAgIGhleGFnb25fTTJfbXB5ZF9uYWNfaGxfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5uYWMuaGwuczAKKyAgICBoZXhhZ29uX00yX21weWRfbmFjX2hsX3MxLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmhsLnMxCisgICAgaGV4YWdvbl9NMl9tcHlkX25hY19saF9zMCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5saC5zMAorICAgIGhleGFnb25fTTJfbXB5ZF9uYWNfbGhfczEsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5uYWMubGguczEKKyAgICBoZXhhZ29uX00yX21weWRfbmFjX2xsX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmxsLnMwCisgICAgaGV4YWdvbl9NMl9tcHlkX25hY19sbF9zMSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5sbC5zMQorICAgIGhleGFnb25fTTJfbXB5ZF9ybmRfaGhfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5ybmQuaGguczAKKyAgICBoZXhhZ29uX00yX21weWRfcm5kX2hoX3MxLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmhoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlkX3JuZF9obF9zMCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5obC5zMAorICAgIGhleGFnb25fTTJfbXB5ZF9ybmRfaGxfczEsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5ybmQuaGwuczEKKyAgICBoZXhhZ29uX00yX21weWRfcm5kX2xoX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmxoLnMwCisgICAgaGV4YWdvbl9NMl9tcHlkX3JuZF9saF9zMSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5saC5zMQorICAgIGhleGFnb25fTTJfbXB5ZF9ybmRfbGxfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5ybmQubGwuczAKKyAgICBoZXhhZ29uX00yX21weWRfcm5kX2xsX3MxLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmxsLnMxCisgICAgaGV4YWdvbl9NMl9tcHlpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlpCisgICAgaGV4YWdvbl9NMl9tcHlzbWksICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlzbWkKKyAgICBoZXhhZ29uX00yX21weXN1X3VwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXN1LnVwCisgICAgaGV4YWdvbl9NMl9tcHl1X2FjY19oaF9zMCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5oaC5zMAorICAgIGhleGFnb25fTTJfbXB5dV9hY2NfaGhfczEsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5hY2MuaGguczEKKyAgICBoZXhhZ29uX00yX21weXVfYWNjX2hsX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmhsLnMwCisgICAgaGV4YWdvbl9NMl9tcHl1X2FjY19obF9zMSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5obC5zMQorICAgIGhleGFnb25fTTJfbXB5dV9hY2NfbGhfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5hY2MubGguczAKKyAgICBoZXhhZ29uX00yX21weXVfYWNjX2xoX3MxLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmxoLnMxCisgICAgaGV4YWdvbl9NMl9tcHl1X2FjY19sbF9zMCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5sbC5zMAorICAgIGhleGFnb25fTTJfbXB5dV9hY2NfbGxfczEsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5hY2MubGwuczEKKyAgICBoZXhhZ29uX00yX21weXVfaGhfczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuaGguczAKKyAgICBoZXhhZ29uX00yX21weXVfaGhfczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuaGguczEKKyAgICBoZXhhZ29uX00yX21weXVfaGxfczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuaGwuczAKKyAgICBoZXhhZ29uX00yX21weXVfaGxfczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuaGwuczEKKyAgICBoZXhhZ29uX00yX21weXVfbGhfczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUubGguczAKKyAgICBoZXhhZ29uX00yX21weXVfbGhfczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUubGguczEKKyAgICBoZXhhZ29uX00yX21weXVfbGxfczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUubGwuczAKKyAgICBoZXhhZ29uX00yX21weXVfbGxfczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUubGwuczEKKyAgICBoZXhhZ29uX00yX21weXVfbmFjX2hoX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUubmFjLmhoLnMwCisgICAgaGV4YWdvbl9NMl9tcHl1X25hY19oaF9zMSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5oaC5zMQorICAgIGhleGFnb25fTTJfbXB5dV9uYWNfaGxfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5uYWMuaGwuczAKKyAgICBoZXhhZ29uX00yX21weXVfbmFjX2hsX3MxLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUubmFjLmhsLnMxCisgICAgaGV4YWdvbl9NMl9tcHl1X25hY19saF9zMCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5saC5zMAorICAgIGhleGFnb25fTTJfbXB5dV9uYWNfbGhfczEsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5uYWMubGguczEKKyAgICBoZXhhZ29uX00yX21weXVfbmFjX2xsX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUubmFjLmxsLnMwCisgICAgaGV4YWdvbl9NMl9tcHl1X25hY19sbF9zMSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5sbC5zMQorICAgIGhleGFnb25fTTJfbXB5dV91cCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS51cAorICAgIGhleGFnb25fTTJfbXB5dWRfYWNjX2hoX3MwLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQuYWNjLmhoLnMwCisgICAgaGV4YWdvbl9NMl9tcHl1ZF9hY2NfaGhfczEsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5hY2MuaGguczEKKyAgICBoZXhhZ29uX00yX21weXVkX2FjY19obF9zMCwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmFjYy5obC5zMAorICAgIGhleGFnb25fTTJfbXB5dWRfYWNjX2hsX3MxLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQuYWNjLmhsLnMxCisgICAgaGV4YWdvbl9NMl9tcHl1ZF9hY2NfbGhfczAsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5hY2MubGguczAKKyAgICBoZXhhZ29uX00yX21weXVkX2FjY19saF9zMSwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmFjYy5saC5zMQorICAgIGhleGFnb25fTTJfbXB5dWRfYWNjX2xsX3MwLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQuYWNjLmxsLnMwCisgICAgaGV4YWdvbl9NMl9tcHl1ZF9hY2NfbGxfczEsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5hY2MubGwuczEKKyAgICBoZXhhZ29uX00yX21weXVkX2hoX3MwLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmhoLnMwCisgICAgaGV4YWdvbl9NMl9tcHl1ZF9oaF9zMSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5oaC5zMQorICAgIGhleGFnb25fTTJfbXB5dWRfaGxfczAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQuaGwuczAKKyAgICBoZXhhZ29uX00yX21weXVkX2hsX3MxLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmhsLnMxCisgICAgaGV4YWdvbl9NMl9tcHl1ZF9saF9zMCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5saC5zMAorICAgIGhleGFnb25fTTJfbXB5dWRfbGhfczEsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQubGguczEKKyAgICBoZXhhZ29uX00yX21weXVkX2xsX3MwLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmxsLnMwCisgICAgaGV4YWdvbl9NMl9tcHl1ZF9sbF9zMSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5sbC5zMQorICAgIGhleGFnb25fTTJfbXB5dWRfbmFjX2hoX3MwLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQubmFjLmhoLnMwCisgICAgaGV4YWdvbl9NMl9tcHl1ZF9uYWNfaGhfczEsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5uYWMuaGguczEKKyAgICBoZXhhZ29uX00yX21weXVkX25hY19obF9zMCwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLm5hYy5obC5zMAorICAgIGhleGFnb25fTTJfbXB5dWRfbmFjX2hsX3MxLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQubmFjLmhsLnMxCisgICAgaGV4YWdvbl9NMl9tcHl1ZF9uYWNfbGhfczAsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5uYWMubGguczAKKyAgICBoZXhhZ29uX00yX21weXVkX25hY19saF9zMSwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLm5hYy5saC5zMQorICAgIGhleGFnb25fTTJfbXB5dWRfbmFjX2xsX3MwLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQubmFjLmxsLnMwCisgICAgaGV4YWdvbl9NMl9tcHl1ZF9uYWNfbGxfczEsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5uYWMubGwuczEKKyAgICBoZXhhZ29uX00yX21weXVpLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVpCisgICAgaGV4YWdvbl9NMl9uYWNjaSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5uYWNjaQorICAgIGhleGFnb25fTTJfbmFjY2lpLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubmFjY2lpCisgICAgaGV4YWdvbl9NMl9zdWJhY2MsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5zdWJhY2MKKyAgICBoZXhhZ29uX00yX3ZhYnNkaWZmaCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZhYnNkaWZmaAorICAgIGhleGFnb25fTTJfdmFic2RpZmZ3LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudmFic2RpZmZ3CisgICAgaGV4YWdvbl9NMl92Y21hY19zMF9zYXRfaSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52Y21hYy5zMC5zYXQuaQorICAgIGhleGFnb25fTTJfdmNtYWNfczBfc2F0X3IsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudmNtYWMuczAuc2F0LnIKKyAgICBoZXhhZ29uX00yX3ZjbXB5X3MwX3NhdF9pLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZjbXB5LnMwLnNhdC5pCisgICAgaGV4YWdvbl9NMl92Y21weV9zMF9zYXRfciwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52Y21weS5zMC5zYXQucgorICAgIGhleGFnb25fTTJfdmNtcHlfczFfc2F0X2ksICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudmNtcHkuczEuc2F0LmkKKyAgICBoZXhhZ29uX00yX3ZjbXB5X3MxX3NhdF9yLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZjbXB5LnMxLnNhdC5yCisgICAgaGV4YWdvbl9NMl92ZG1hY3NfczAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52ZG1hY3MuczAKKyAgICBoZXhhZ29uX00yX3ZkbWFjc19zMSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZkbWFjcy5zMQorICAgIGhleGFnb25fTTJfdmRtcHlyc19zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudmRtcHlycy5zMAorICAgIGhleGFnb25fTTJfdmRtcHlyc19zMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudmRtcHlycy5zMQorICAgIGhleGFnb25fTTJfdmRtcHlzX3MwLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudmRtcHlzLnMwCisgICAgaGV4YWdvbl9NMl92ZG1weXNfczEsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52ZG1weXMuczEKKyAgICBoZXhhZ29uX00yX3ZtYWMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZtYWMyCisgICAgaGV4YWdvbl9NMl92bWFjMmVzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52bWFjMmVzCisgICAgaGV4YWdvbl9NMl92bWFjMmVzX3MwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52bWFjMmVzLnMwCisgICAgaGV4YWdvbl9NMl92bWFjMmVzX3MxLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52bWFjMmVzLnMxCisgICAgaGV4YWdvbl9NMl92bWFjMnNfczAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52bWFjMnMuczAKKyAgICBoZXhhZ29uX00yX3ZtYWMyc19zMSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZtYWMycy5zMQorICAgIGhleGFnb25fTTJfdm1hYzJzdV9zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudm1hYzJzdS5zMAorICAgIGhleGFnb25fTTJfdm1hYzJzdV9zMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudm1hYzJzdS5zMQorICAgIGhleGFnb25fTTJfdm1weTJlc19zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudm1weTJlcy5zMAorICAgIGhleGFnb25fTTJfdm1weTJlc19zMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudm1weTJlcy5zMQorICAgIGhleGFnb25fTTJfdm1weTJzX3MwLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudm1weTJzLnMwCisgICAgaGV4YWdvbl9NMl92bXB5MnNfczBwYWNrLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52bXB5MnMuczBwYWNrCisgICAgaGV4YWdvbl9NMl92bXB5MnNfczEsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52bXB5MnMuczEKKyAgICBoZXhhZ29uX00yX3ZtcHkyc19zMXBhY2ssICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZtcHkycy5zMXBhY2sKKyAgICBoZXhhZ29uX00yX3ZtcHkyc3VfczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZtcHkyc3UuczAKKyAgICBoZXhhZ29uX00yX3ZtcHkyc3VfczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZtcHkyc3UuczEKKyAgICBoZXhhZ29uX00yX3ZyYWRkaCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZyYWRkaAorICAgIGhleGFnb25fTTJfdnJhZGR1aCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudnJhZGR1aAorICAgIGhleGFnb25fTTJfdnJjbWFjaV9zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudnJjbWFjaS5zMAorICAgIGhleGFnb25fTTJfdnJjbWFjaV9zMGMsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudnJjbWFjaS5zMGMKKyAgICBoZXhhZ29uX00yX3ZyY21hY3JfczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZyY21hY3IuczAKKyAgICBoZXhhZ29uX00yX3ZyY21hY3JfczBjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZyY21hY3IuczBjCisgICAgaGV4YWdvbl9NMl92cmNtcHlpX3MwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52cmNtcHlpLnMwCisgICAgaGV4YWdvbl9NMl92cmNtcHlpX3MwYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52cmNtcHlpLnMwYworICAgIGhleGFnb25fTTJfdnJjbXB5cl9zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudnJjbXB5ci5zMAorICAgIGhleGFnb25fTTJfdnJjbXB5cl9zMGMsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudnJjbXB5ci5zMGMKKyAgICBoZXhhZ29uX00yX3ZyY21weXNfYWNjX3MxLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZyY21weXMuYWNjLnMxCisgICAgaGV4YWdvbl9NMl92cmNtcHlzX3MxLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52cmNtcHlzLnMxCisgICAgaGV4YWdvbl9NMl92cmNtcHlzX3MxcnAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52cmNtcHlzLnMxcnAKKyAgICBoZXhhZ29uX00yX3ZybWFjX3MwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZybWFjLnMwCisgICAgaGV4YWdvbl9NMl92cm1weV9zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52cm1weS5zMAorICAgIGhleGFnb25fTTJfeG9yX3hhY2MsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIueG9yLnhhY2MKKyAgICBoZXhhZ29uX000X2FuZF9hbmQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00LmFuZC5hbmQKKyAgICBoZXhhZ29uX000X2FuZF9hbmRuLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00LmFuZC5hbmRuCisgICAgaGV4YWdvbl9NNF9hbmRfb3IsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNC5hbmQub3IKKyAgICBoZXhhZ29uX000X2FuZF94b3IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00LmFuZC54b3IKKyAgICBoZXhhZ29uX000X2NtcHlpX3doLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00LmNtcHlpLndoCisgICAgaGV4YWdvbl9NNF9jbXB5aV93aGMsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNC5jbXB5aS53aGMKKyAgICBoZXhhZ29uX000X2NtcHlyX3doLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00LmNtcHlyLndoCisgICAgaGV4YWdvbl9NNF9jbXB5cl93aGMsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNC5jbXB5ci53aGMKKyAgICBoZXhhZ29uX000X21hY191cF9zMV9zYXQsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00Lm1hYy51cC5zMS5zYXQKKyAgICBoZXhhZ29uX000X21weXJpX2FkZGksICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00Lm1weXJpLmFkZGkKKyAgICBoZXhhZ29uX000X21weXJpX2FkZHIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00Lm1weXJpLmFkZHIKKyAgICBoZXhhZ29uX000X21weXJpX2FkZHJfdTIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00Lm1weXJpLmFkZHIudTIKKyAgICBoZXhhZ29uX000X21weXJyX2FkZGksICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00Lm1weXJyLmFkZGkKKyAgICBoZXhhZ29uX000X21weXJyX2FkZHIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00Lm1weXJyLmFkZHIKKyAgICBoZXhhZ29uX000X25hY191cF9zMV9zYXQsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00Lm5hYy51cC5zMS5zYXQKKyAgICBoZXhhZ29uX000X29yX2FuZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00Lm9yLmFuZAorICAgIGhleGFnb25fTTRfb3JfYW5kbiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQub3IuYW5kbgorICAgIGhleGFnb25fTTRfb3Jfb3IsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQub3Iub3IKKyAgICBoZXhhZ29uX000X29yX3hvciwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00Lm9yLnhvcgorICAgIGhleGFnb25fTTRfcG1weXcsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQucG1weXcKKyAgICBoZXhhZ29uX000X3BtcHl3X2FjYywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00LnBtcHl3LmFjYworICAgIGhleGFnb25fTTRfdnBtcHloLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQudnBtcHloCisgICAgaGV4YWdvbl9NNF92cG1weWhfYWNjLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNC52cG1weWguYWNjCisgICAgaGV4YWdvbl9NNF92cm1weWVoX2FjY19zMCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNC52cm1weWVoLmFjYy5zMAorICAgIGhleGFnb25fTTRfdnJtcHllaF9hY2NfczEsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQudnJtcHllaC5hY2MuczEKKyAgICBoZXhhZ29uX000X3ZybXB5ZWhfczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00LnZybXB5ZWguczAKKyAgICBoZXhhZ29uX000X3ZybXB5ZWhfczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00LnZybXB5ZWguczEKKyAgICBoZXhhZ29uX000X3ZybXB5b2hfYWNjX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00LnZybXB5b2guYWNjLnMwCisgICAgaGV4YWdvbl9NNF92cm1weW9oX2FjY19zMSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNC52cm1weW9oLmFjYy5zMQorICAgIGhleGFnb25fTTRfdnJtcHlvaF9zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQudnJtcHlvaC5zMAorICAgIGhleGFnb25fTTRfdnJtcHlvaF9zMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQudnJtcHlvaC5zMQorICAgIGhleGFnb25fTTRfeG9yX2FuZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQueG9yLmFuZAorICAgIGhleGFnb25fTTRfeG9yX2FuZG4sICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQueG9yLmFuZG4KKyAgICBoZXhhZ29uX000X3hvcl9vciwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00Lnhvci5vcgorICAgIGhleGFnb25fTTRfeG9yX3hhY2MsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQueG9yLnhhY2MKKyAgICBoZXhhZ29uX001X3ZkbWFjYnN1LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk01LnZkbWFjYnN1CisgICAgaGV4YWdvbl9NNV92ZG1weWJzdSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNS52ZG1weWJzdQorICAgIGhleGFnb25fTTVfdm1hY2JzdSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTUudm1hY2JzdQorICAgIGhleGFnb25fTTVfdm1hY2J1dSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTUudm1hY2J1dQorICAgIGhleGFnb25fTTVfdm1weWJzdSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTUudm1weWJzdQorICAgIGhleGFnb25fTTVfdm1weWJ1dSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTUudm1weWJ1dQorICAgIGhleGFnb25fTTVfdnJtYWNic3UsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTUudnJtYWNic3UKKyAgICBoZXhhZ29uX001X3ZybWFjYnV1LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk01LnZybWFjYnV1CisgICAgaGV4YWdvbl9NNV92cm1weWJzdSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNS52cm1weWJzdQorICAgIGhleGFnb25fTTVfdnJtcHlidXUsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTUudnJtcHlidXUKKyAgICBoZXhhZ29uX002X3ZhYnNkaWZmYiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk02LnZhYnNkaWZmYgorICAgIGhleGFnb25fTTZfdmFic2RpZmZ1YiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTYudmFic2RpZmZ1YgorICAgIGhleGFnb25fUzJfYWRkYXNsX3JycmksICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYWRkYXNsLnJycmkKKyAgICBoZXhhZ29uX1MyX2FzbF9pX3AsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnAKKyAgICBoZXhhZ29uX1MyX2FzbF9pX3BfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnAuYWNjCisgICAgaGV4YWdvbl9TMl9hc2xfaV9wX2FuZCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS5wLmFuZAorICAgIGhleGFnb25fUzJfYXNsX2lfcF9uYWMsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkucC5uYWMKKyAgICBoZXhhZ29uX1MyX2FzbF9pX3Bfb3IsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnAub3IKKyAgICBoZXhhZ29uX1MyX2FzbF9pX3BfeGFjYywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnAueGFjYworICAgIGhleGFnb25fUzJfYXNsX2lfciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkucgorICAgIGhleGFnb25fUzJfYXNsX2lfcl9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkuci5hY2MKKyAgICBoZXhhZ29uX1MyX2FzbF9pX3JfYW5kLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnIuYW5kCisgICAgaGV4YWdvbl9TMl9hc2xfaV9yX25hYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS5yLm5hYworICAgIGhleGFnb25fUzJfYXNsX2lfcl9vciwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkuci5vcgorICAgIGhleGFnb25fUzJfYXNsX2lfcl9zYXQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkuci5zYXQKKyAgICBoZXhhZ29uX1MyX2FzbF9pX3JfeGFjYywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnIueGFjYworICAgIGhleGFnb25fUzJfYXNsX2lfdmgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkudmgKKyAgICBoZXhhZ29uX1MyX2FzbF9pX3Z3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnZ3CisgICAgaGV4YWdvbl9TMl9hc2xfcl9wLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci5wCisgICAgaGV4YWdvbl9TMl9hc2xfcl9wX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci5wLmFjYworICAgIGhleGFnb25fUzJfYXNsX3JfcF9hbmQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLnIucC5hbmQKKyAgICBoZXhhZ29uX1MyX2FzbF9yX3BfbmFjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnAubmFjCisgICAgaGV4YWdvbl9TMl9hc2xfcl9wX29yLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci5wLm9yCisgICAgaGV4YWdvbl9TMl9hc2xfcl9wX3hvciwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci5wLnhvcgorICAgIGhleGFnb25fUzJfYXNsX3JfciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLnIucgorICAgIGhleGFnb25fUzJfYXNsX3Jfcl9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLnIuci5hY2MKKyAgICBoZXhhZ29uX1MyX2FzbF9yX3JfYW5kLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnIuYW5kCisgICAgaGV4YWdvbl9TMl9hc2xfcl9yX25hYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci5yLm5hYworICAgIGhleGFnb25fUzJfYXNsX3Jfcl9vciwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLnIuci5vcgorICAgIGhleGFnb25fUzJfYXNsX3Jfcl9zYXQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLnIuci5zYXQKKyAgICBoZXhhZ29uX1MyX2FzbF9yX3ZoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnZoCisgICAgaGV4YWdvbl9TMl9hc2xfcl92dywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci52dworICAgIGhleGFnb25fUzJfYXNyX2lfcCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkucAorICAgIGhleGFnb25fUzJfYXNyX2lfcF9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkucC5hY2MKKyAgICBoZXhhZ29uX1MyX2Fzcl9pX3BfYW5kLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnAuYW5kCisgICAgaGV4YWdvbl9TMl9hc3JfaV9wX25hYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5wLm5hYworICAgIGhleGFnb25fUzJfYXNyX2lfcF9vciwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkucC5vcgorICAgIGhleGFnb25fUzJfYXNyX2lfcF9ybmQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkucC5ybmQKKyAgICBoZXhhZ29uX1MyX2Fzcl9pX3Bfcm5kX2dvb2RzeW50YXgsICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnAucm5kLmdvb2RzeW50YXgKKyAgICBoZXhhZ29uX1MyX2Fzcl9pX3IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnIKKyAgICBoZXhhZ29uX1MyX2Fzcl9pX3JfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnIuYWNjCisgICAgaGV4YWdvbl9TMl9hc3JfaV9yX2FuZCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5yLmFuZAorICAgIGhleGFnb25fUzJfYXNyX2lfcl9uYWMsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkuci5uYWMKKyAgICBoZXhhZ29uX1MyX2Fzcl9pX3Jfb3IsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnIub3IKKyAgICBoZXhhZ29uX1MyX2Fzcl9pX3Jfcm5kLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnIucm5kCisgICAgaGV4YWdvbl9TMl9hc3JfaV9yX3JuZF9nb29kc3ludGF4LCAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5yLnJuZC5nb29kc3ludGF4CisgICAgaGV4YWdvbl9TMl9hc3JfaV9zdndfdHJ1biwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5zdncudHJ1bgorICAgIGhleGFnb25fUzJfYXNyX2lfdmgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkudmgKKyAgICBoZXhhZ29uX1MyX2Fzcl9pX3Z3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnZ3CisgICAgaGV4YWdvbl9TMl9hc3Jfcl9wLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5wCisgICAgaGV4YWdvbl9TMl9hc3Jfcl9wX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5wLmFjYworICAgIGhleGFnb25fUzJfYXNyX3JfcF9hbmQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIucC5hbmQKKyAgICBoZXhhZ29uX1MyX2Fzcl9yX3BfbmFjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5yLnAubmFjCisgICAgaGV4YWdvbl9TMl9hc3Jfcl9wX29yLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5wLm9yCisgICAgaGV4YWdvbl9TMl9hc3Jfcl9wX3hvciwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5wLnhvcgorICAgIGhleGFnb25fUzJfYXNyX3JfciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIucgorICAgIGhleGFnb25fUzJfYXNyX3Jfcl9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIuci5hY2MKKyAgICBoZXhhZ29uX1MyX2Fzcl9yX3JfYW5kLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5yLnIuYW5kCisgICAgaGV4YWdvbl9TMl9hc3Jfcl9yX25hYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5yLm5hYworICAgIGhleGFnb25fUzJfYXNyX3Jfcl9vciwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIuci5vcgorICAgIGhleGFnb25fUzJfYXNyX3Jfcl9zYXQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIuci5zYXQKKyAgICBoZXhhZ29uX1MyX2Fzcl9yX3N2d190cnVuLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5yLnN2dy50cnVuCisgICAgaGV4YWdvbl9TMl9hc3Jfcl92aCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci52aAorICAgIGhleGFnb25fUzJfYXNyX3JfdncsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIudncKKyAgICBoZXhhZ29uX1MyX2JyZXYsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmJyZXYKKyAgICBoZXhhZ29uX1MyX2JyZXZwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmJyZXZwCisgICAgaGV4YWdvbl9TMl9jYWJhY2VuY2JpbiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5jYWJhY2VuY2JpbgorICAgIGhleGFnb25fUzJfY2wwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuY2wwCisgICAgaGV4YWdvbl9TMl9jbDBwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5jbDBwCisgICAgaGV4YWdvbl9TMl9jbDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5jbDEKKyAgICBoZXhhZ29uX1MyX2NsMXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmNsMXAKKyAgICBoZXhhZ29uX1MyX2NsYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmNsYgorICAgIGhleGFnb25fUzJfY2xibm9ybSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuY2xibm9ybQorICAgIGhleGFnb25fUzJfY2xicCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuY2xicAorICAgIGhleGFnb25fUzJfY2xyYml0X2ksICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuY2xyYml0LmkKKyAgICBoZXhhZ29uX1MyX2NscmJpdF9yLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmNscmJpdC5yCisgICAgaGV4YWdvbl9TMl9jdDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5jdDAKKyAgICBoZXhhZ29uX1MyX2N0MHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmN0MHAKKyAgICBoZXhhZ29uX1MyX2N0MSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmN0MQorICAgIGhleGFnb25fUzJfY3QxcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuY3QxcAorICAgIGhleGFnb25fUzJfZGVpbnRlcmxlYXZlLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuZGVpbnRlcmxlYXZlCisgICAgaGV4YWdvbl9TMl9leHRyYWN0dSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5leHRyYWN0dQorICAgIGhleGFnb25fUzJfZXh0cmFjdHVfcnAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuZXh0cmFjdHUucnAKKyAgICBoZXhhZ29uX1MyX2V4dHJhY3R1cCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmV4dHJhY3R1cAorICAgIGhleGFnb25fUzJfZXh0cmFjdHVwX3JwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuZXh0cmFjdHVwLnJwCisgICAgaGV4YWdvbl9TMl9pbnNlcnQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5pbnNlcnQKKyAgICBoZXhhZ29uX1MyX2luc2VydF9ycCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmluc2VydC5ycAorICAgIGhleGFnb25fUzJfaW5zZXJ0cCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuaW5zZXJ0cAorICAgIGhleGFnb25fUzJfaW5zZXJ0cF9ycCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuaW5zZXJ0cC5ycAorICAgIGhleGFnb25fUzJfaW50ZXJsZWF2ZSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuaW50ZXJsZWF2ZQorICAgIGhleGFnb25fUzJfbGZzcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubGZzcAorICAgIGhleGFnb25fUzJfbHNsX3JfcCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIucAorICAgIGhleGFnb25fUzJfbHNsX3JfcF9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIucC5hY2MKKyAgICBoZXhhZ29uX1MyX2xzbF9yX3BfYW5kLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnAuYW5kCisgICAgaGV4YWdvbl9TMl9sc2xfcl9wX25hYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc2wuci5wLm5hYworICAgIGhleGFnb25fUzJfbHNsX3JfcF9vciwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIucC5vcgorICAgIGhleGFnb25fUzJfbHNsX3JfcF94b3IsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIucC54b3IKKyAgICBoZXhhZ29uX1MyX2xzbF9yX3IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnIKKyAgICBoZXhhZ29uX1MyX2xzbF9yX3JfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnIuYWNjCisgICAgaGV4YWdvbl9TMl9sc2xfcl9yX2FuZCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc2wuci5yLmFuZAorICAgIGhleGFnb25fUzJfbHNsX3Jfcl9uYWMsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIuci5uYWMKKyAgICBoZXhhZ29uX1MyX2xzbF9yX3Jfb3IsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnIub3IKKyAgICBoZXhhZ29uX1MyX2xzbF9yX3ZoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnZoCisgICAgaGV4YWdvbl9TMl9sc2xfcl92dywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc2wuci52dworICAgIGhleGFnb25fUzJfbHNyX2lfcCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLmkucAorICAgIGhleGFnb25fUzJfbHNyX2lfcF9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLmkucC5hY2MKKyAgICBoZXhhZ29uX1MyX2xzcl9pX3BfYW5kLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnAuYW5kCisgICAgaGV4YWdvbl9TMl9sc3JfaV9wX25hYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5wLm5hYworICAgIGhleGFnb25fUzJfbHNyX2lfcF9vciwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLmkucC5vcgorICAgIGhleGFnb25fUzJfbHNyX2lfcF94YWNjLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLmkucC54YWNjCisgICAgaGV4YWdvbl9TMl9sc3JfaV9yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5yCisgICAgaGV4YWdvbl9TMl9sc3JfaV9yX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5yLmFjYworICAgIGhleGFnb25fUzJfbHNyX2lfcl9hbmQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLmkuci5hbmQKKyAgICBoZXhhZ29uX1MyX2xzcl9pX3JfbmFjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnIubmFjCisgICAgaGV4YWdvbl9TMl9sc3JfaV9yX29yLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5yLm9yCisgICAgaGV4YWdvbl9TMl9sc3JfaV9yX3hhY2MsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5yLnhhY2MKKyAgICBoZXhhZ29uX1MyX2xzcl9pX3ZoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnZoCisgICAgaGV4YWdvbl9TMl9sc3JfaV92dywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS52dworICAgIGhleGFnb25fUzJfbHNyX3JfcCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIucAorICAgIGhleGFnb25fUzJfbHNyX3JfcF9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIucC5hY2MKKyAgICBoZXhhZ29uX1MyX2xzcl9yX3BfYW5kLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnAuYW5kCisgICAgaGV4YWdvbl9TMl9sc3Jfcl9wX25hYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3Iuci5wLm5hYworICAgIGhleGFnb25fUzJfbHNyX3JfcF9vciwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIucC5vcgorICAgIGhleGFnb25fUzJfbHNyX3JfcF94b3IsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIucC54b3IKKyAgICBoZXhhZ29uX1MyX2xzcl9yX3IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnIKKyAgICBoZXhhZ29uX1MyX2xzcl9yX3JfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnIuYWNjCisgICAgaGV4YWdvbl9TMl9sc3Jfcl9yX2FuZCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3Iuci5yLmFuZAorICAgIGhleGFnb25fUzJfbHNyX3Jfcl9uYWMsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIuci5uYWMKKyAgICBoZXhhZ29uX1MyX2xzcl9yX3Jfb3IsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnIub3IKKyAgICBoZXhhZ29uX1MyX2xzcl9yX3ZoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnZoCisgICAgaGV4YWdvbl9TMl9sc3Jfcl92dywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3Iuci52dworICAgIGhleGFnb25fUzJfcGFja2hsLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIucGFja2hsCisgICAgaGV4YWdvbl9TMl9wYXJpdHlwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5wYXJpdHlwCisgICAgaGV4YWdvbl9TMl9zZXRiaXRfaSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5zZXRiaXQuaQorICAgIGhleGFnb25fUzJfc2V0Yml0X3IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc2V0Yml0LnIKKyAgICBoZXhhZ29uX1MyX3NodWZmZWIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnNodWZmZWIKKyAgICBoZXhhZ29uX1MyX3NodWZmZWgsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnNodWZmZWgKKyAgICBoZXhhZ29uX1MyX3NodWZmb2IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnNodWZmb2IKKyAgICBoZXhhZ29uX1MyX3NodWZmb2gsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnNodWZmb2gKKyAgICBoZXhhZ29uX1MyX3N0b3JlcmJfcGJyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmIucGJyCisgICAgaGV4YWdvbl9TMl9zdG9yZXJiX3BjaSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJiLnBjaQorICAgIGhleGFnb25fUzJfc3RvcmVyYl9wY3IsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyYi5wY3IKKyAgICBoZXhhZ29uX1MyX3N0b3JlcmRfcGJyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmQucGJyCisgICAgaGV4YWdvbl9TMl9zdG9yZXJkX3BjaSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJkLnBjaQorICAgIGhleGFnb25fUzJfc3RvcmVyZF9wY3IsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyZC5wY3IKKyAgICBoZXhhZ29uX1MyX3N0b3JlcmZfcGJyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmYucGJyCisgICAgaGV4YWdvbl9TMl9zdG9yZXJmX3BjaSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJmLnBjaQorICAgIGhleGFnb25fUzJfc3RvcmVyZl9wY3IsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyZi5wY3IKKyAgICBoZXhhZ29uX1MyX3N0b3JlcmhfcGJyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmgucGJyCisgICAgaGV4YWdvbl9TMl9zdG9yZXJoX3BjaSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJoLnBjaQorICAgIGhleGFnb25fUzJfc3RvcmVyaF9wY3IsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyaC5wY3IKKyAgICBoZXhhZ29uX1MyX3N0b3JlcmlfcGJyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmkucGJyCisgICAgaGV4YWdvbl9TMl9zdG9yZXJpX3BjaSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJpLnBjaQorICAgIGhleGFnb25fUzJfc3RvcmVyaV9wY3IsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyaS5wY3IKKyAgICBoZXhhZ29uX1MyX3N0b3Jld19sb2NrZWQsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3Jldy5sb2NrZWQKKyAgICBoZXhhZ29uX1MyX3N2c2F0aGIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnN2c2F0aGIKKyAgICBoZXhhZ29uX1MyX3N2c2F0aHViLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnN2c2F0aHViCisgICAgaGV4YWdvbl9TMl90YWJsZWlkeGJfZ29vZHN5bnRheCwgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi50YWJsZWlkeGIuZ29vZHN5bnRheAorICAgIGhleGFnb25fUzJfdGFibGVpZHhkX2dvb2RzeW50YXgsICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudGFibGVpZHhkLmdvb2RzeW50YXgKKyAgICBoZXhhZ29uX1MyX3RhYmxlaWR4aF9nb29kc3ludGF4LCAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnRhYmxlaWR4aC5nb29kc3ludGF4CisgICAgaGV4YWdvbl9TMl90YWJsZWlkeHdfZ29vZHN5bnRheCwgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi50YWJsZWlkeHcuZ29vZHN5bnRheAorICAgIGhleGFnb25fUzJfdG9nZ2xlYml0X2ksICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudG9nZ2xlYml0LmkKKyAgICBoZXhhZ29uX1MyX3RvZ2dsZWJpdF9yLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnRvZ2dsZWJpdC5yCisgICAgaGV4YWdvbl9TMl90c3RiaXRfaSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi50c3RiaXQuaQorICAgIGhleGFnb25fUzJfdHN0Yml0X3IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudHN0Yml0LnIKKyAgICBoZXhhZ29uX1MyX3ZhbGlnbmliLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnZhbGlnbmliCisgICAgaGV4YWdvbl9TMl92YWxpZ25yYiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52YWxpZ25yYgorICAgIGhleGFnb25fUzJfdmNuZWdoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudmNuZWdoCisgICAgaGV4YWdvbl9TMl92Y3JvdGF0ZSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52Y3JvdGF0ZQorICAgIGhleGFnb25fUzJfdnJjbmVnaCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnJjbmVnaAorICAgIGhleGFnb25fUzJfdnJuZHBhY2t3aCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnJuZHBhY2t3aAorICAgIGhleGFnb25fUzJfdnJuZHBhY2t3aHMsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnJuZHBhY2t3aHMKKyAgICBoZXhhZ29uX1MyX3ZzYXRoYiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnZzYXRoYgorICAgIGhleGFnb25fUzJfdnNhdGhiX25vcGFjaywgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnNhdGhiLm5vcGFjaworICAgIGhleGFnb25fUzJfdnNhdGh1YiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnNhdGh1YgorICAgIGhleGFnb25fUzJfdnNhdGh1Yl9ub3BhY2ssICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnNhdGh1Yi5ub3BhY2sKKyAgICBoZXhhZ29uX1MyX3ZzYXR3aCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnZzYXR3aAorICAgIGhleGFnb25fUzJfdnNhdHdoX25vcGFjaywgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnNhdHdoLm5vcGFjaworICAgIGhleGFnb25fUzJfdnNhdHd1aCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnNhdHd1aAorICAgIGhleGFnb25fUzJfdnNhdHd1aF9ub3BhY2ssICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnNhdHd1aC5ub3BhY2sKKyAgICBoZXhhZ29uX1MyX3ZzcGxhdHJiLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnZzcGxhdHJiCisgICAgaGV4YWdvbl9TMl92c3BsYXRyaCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52c3BsYXRyaAorICAgIGhleGFnb25fUzJfdnNwbGljZWliLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnNwbGljZWliCisgICAgaGV4YWdvbl9TMl92c3BsaWNlcmIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52c3BsaWNlcmIKKyAgICBoZXhhZ29uX1MyX3ZzeHRiaCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnZzeHRiaAorICAgIGhleGFnb25fUzJfdnN4dGh3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnN4dGh3CisgICAgaGV4YWdvbl9TMl92dHJ1bmVoYiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52dHJ1bmVoYgorICAgIGhleGFnb25fUzJfdnRydW5ld2gsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnRydW5ld2gKKyAgICBoZXhhZ29uX1MyX3Z0cnVub2hiLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnZ0cnVub2hiCisgICAgaGV4YWdvbl9TMl92dHJ1bm93aCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52dHJ1bm93aAorICAgIGhleGFnb25fUzJfdnp4dGJoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnp4dGJoCisgICAgaGV4YWdvbl9TMl92enh0aHcsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52enh0aHcKKyAgICBoZXhhZ29uX1M0X2FkZGFkZGksICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LmFkZGFkZGkKKyAgICBoZXhhZ29uX1M0X2FkZGlfYXNsX3JpLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LmFkZGkuYXNsLnJpCisgICAgaGV4YWdvbl9TNF9hZGRpX2xzcl9yaSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNC5hZGRpLmxzci5yaQorICAgIGhleGFnb25fUzRfYW5kaV9hc2xfcmksICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQuYW5kaS5hc2wucmkKKyAgICBoZXhhZ29uX1M0X2FuZGlfbHNyX3JpLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LmFuZGkubHNyLnJpCisgICAgaGV4YWdvbl9TNF9jbGJhZGRpLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNC5jbGJhZGRpCisgICAgaGV4YWdvbl9TNF9jbGJwYWRkaSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNC5jbGJwYWRkaQorICAgIGhleGFnb25fUzRfY2xicG5vcm0sICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQuY2xicG5vcm0KKyAgICBoZXhhZ29uX1M0X2V4dHJhY3QsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LmV4dHJhY3QKKyAgICBoZXhhZ29uX1M0X2V4dHJhY3RfcnAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LmV4dHJhY3QucnAKKyAgICBoZXhhZ29uX1M0X2V4dHJhY3RwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LmV4dHJhY3RwCisgICAgaGV4YWdvbl9TNF9leHRyYWN0cF9ycCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNC5leHRyYWN0cC5ycAorICAgIGhleGFnb25fUzRfbHNsaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQubHNsaQorICAgIGhleGFnb25fUzRfbnRzdGJpdF9pLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQubnRzdGJpdC5pCisgICAgaGV4YWdvbl9TNF9udHN0Yml0X3IsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNC5udHN0Yml0LnIKKyAgICBoZXhhZ29uX1M0X29yX2FuZGksICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0Lm9yLmFuZGkKKyAgICBoZXhhZ29uX1M0X29yX2FuZGl4LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0Lm9yLmFuZGl4CisgICAgaGV4YWdvbl9TNF9vcl9vcmksICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNC5vci5vcmkKKyAgICBoZXhhZ29uX1M0X29yaV9hc2xfcmksICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0Lm9yaS5hc2wucmkKKyAgICBoZXhhZ29uX1M0X29yaV9sc3JfcmksICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0Lm9yaS5sc3IucmkKKyAgICBoZXhhZ29uX1M0X3Bhcml0eSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LnBhcml0eQorICAgIGhleGFnb25fUzRfc3RvcmVkX2xvY2tlZCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQuc3RvcmVkLmxvY2tlZAorICAgIGhleGFnb25fUzRfc3ViYWRkaSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQuc3ViYWRkaQorICAgIGhleGFnb25fUzRfc3ViaV9hc2xfcmksICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQuc3ViaS5hc2wucmkKKyAgICBoZXhhZ29uX1M0X3N1YmlfbHNyX3JpLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LnN1YmkubHNyLnJpCisgICAgaGV4YWdvbl9TNF92cmNyb3RhdGUsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNC52cmNyb3RhdGUKKyAgICBoZXhhZ29uX1M0X3ZyY3JvdGF0ZV9hY2MsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LnZyY3JvdGF0ZS5hY2MKKyAgICBoZXhhZ29uX1M0X3Z4YWRkc3ViaCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LnZ4YWRkc3ViaAorICAgIGhleGFnb25fUzRfdnhhZGRzdWJociwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQudnhhZGRzdWJocgorICAgIGhleGFnb25fUzRfdnhhZGRzdWJ3LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQudnhhZGRzdWJ3CisgICAgaGV4YWdvbl9TNF92eHN1YmFkZGgsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNC52eHN1YmFkZGgKKyAgICBoZXhhZ29uX1M0X3Z4c3ViYWRkaHIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LnZ4c3ViYWRkaHIKKyAgICBoZXhhZ29uX1M0X3Z4c3ViYWRkdywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LnZ4c3ViYWRkdworICAgIGhleGFnb25fUzVfYXNyaHViX3JuZF9zYXRfZ29vZHN5bnRheCwgICAgICAvLyBsbHZtLmhleGFnb24uUzUuYXNyaHViLnJuZC5zYXQuZ29vZHN5bnRheAorICAgIGhleGFnb25fUzVfYXNyaHViX3NhdCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzUuYXNyaHViLnNhdAorICAgIGhleGFnb25fUzVfcG9wY291bnRwLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzUucG9wY291bnRwCisgICAgaGV4YWdvbl9TNV92YXNyaHJuZF9nb29kc3ludGF4LCAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNS52YXNyaHJuZC5nb29kc3ludGF4CisgICAgaGV4YWdvbl9TNl9yb2xfaV9wLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNi5yb2wuaS5wCisgICAgaGV4YWdvbl9TNl9yb2xfaV9wX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNi5yb2wuaS5wLmFjYworICAgIGhleGFnb25fUzZfcm9sX2lfcF9hbmQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzYucm9sLmkucC5hbmQKKyAgICBoZXhhZ29uX1M2X3JvbF9pX3BfbmFjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnAubmFjCisgICAgaGV4YWdvbl9TNl9yb2xfaV9wX29yLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNi5yb2wuaS5wLm9yCisgICAgaGV4YWdvbl9TNl9yb2xfaV9wX3hhY2MsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNi5yb2wuaS5wLnhhY2MKKyAgICBoZXhhZ29uX1M2X3JvbF9pX3IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnIKKyAgICBoZXhhZ29uX1M2X3JvbF9pX3JfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnIuYWNjCisgICAgaGV4YWdvbl9TNl9yb2xfaV9yX2FuZCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNi5yb2wuaS5yLmFuZAorICAgIGhleGFnb25fUzZfcm9sX2lfcl9uYWMsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzYucm9sLmkuci5uYWMKKyAgICBoZXhhZ29uX1M2X3JvbF9pX3Jfb3IsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnIub3IKKyAgICBoZXhhZ29uX1M2X3JvbF9pX3JfeGFjYywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnIueGFjYworICAgIGhleGFnb25fUzZfdnNwbGF0cmJwLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzYudnNwbGF0cmJwCisgICAgaGV4YWdvbl9TNl92dHJ1bmVoYl9wcHAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNi52dHJ1bmVoYi5wcHAKKyAgICBoZXhhZ29uX1M2X3Z0cnVub2hiX3BwcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM2LnZ0cnVub2hiLnBwcAorICAgIGhleGFnb25fVjZfZXh0cmFjdHcsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYuZXh0cmFjdHcKKyAgICBoZXhhZ29uX1Y2X2V4dHJhY3R3XzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LmV4dHJhY3R3LjEyOEIKKyAgICBoZXhhZ29uX1Y2X2hpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LmhpCisgICAgaGV4YWdvbl9WNl9oaV8xMjhCLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5oaS4xMjhCCisgICAgaGV4YWdvbl9WNl9sbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5sbworICAgIGhleGFnb25fVjZfbG9fMTI4QiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYubG8uMTI4QgorICAgIGhleGFnb25fVjZfbHZzcGxhdGIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYubHZzcGxhdGIKKyAgICBoZXhhZ29uX1Y2X2x2c3BsYXRiXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2Lmx2c3BsYXRiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X2x2c3BsYXRoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2Lmx2c3BsYXRoCisgICAgaGV4YWdvbl9WNl9sdnNwbGF0aF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5sdnNwbGF0aC4xMjhCCisgICAgaGV4YWdvbl9WNl9sdnNwbGF0dywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5sdnNwbGF0dworICAgIGhleGFnb25fVjZfbHZzcGxhdHdfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYubHZzcGxhdHcuMTI4QgorICAgIGhleGFnb25fVjZfcHJlZF9hbmQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5hbmQKKyAgICBoZXhhZ29uX1Y2X3ByZWRfYW5kXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQuYW5kLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ByZWRfYW5kX24sICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQuYW5kLm4KKyAgICBoZXhhZ29uX1Y2X3ByZWRfYW5kX25fMTI4QiwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQuYW5kLm4uMTI4QgorICAgIGhleGFnb25fVjZfcHJlZF9ub3QsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5ub3QKKyAgICBoZXhhZ29uX1Y2X3ByZWRfbm90XzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQubm90LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ByZWRfb3IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQub3IKKyAgICBoZXhhZ29uX1Y2X3ByZWRfb3JfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQub3IuMTI4QgorICAgIGhleGFnb25fVjZfcHJlZF9vcl9uLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5vci5uCisgICAgaGV4YWdvbl9WNl9wcmVkX29yX25fMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLm9yLm4uMTI4QgorICAgIGhleGFnb25fVjZfcHJlZF9zY2FsYXIyLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5zY2FsYXIyCisgICAgaGV4YWdvbl9WNl9wcmVkX3NjYWxhcjJfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLnNjYWxhcjIuMTI4QgorICAgIGhleGFnb25fVjZfcHJlZF9zY2FsYXIydjIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5zY2FsYXIydjIKKyAgICBoZXhhZ29uX1Y2X3ByZWRfc2NhbGFyMnYyXzEyOEIsICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQuc2NhbGFyMnYyLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ByZWRfeG9yLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQueG9yCisgICAgaGV4YWdvbl9WNl9wcmVkX3hvcl8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLnhvci4xMjhCCisgICAgaGV4YWdvbl9WNl9zaHVmZmVxaCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5zaHVmZmVxaAorICAgIGhleGFnb25fVjZfc2h1ZmZlcWhfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYuc2h1ZmZlcWguMTI4QgorICAgIGhleGFnb25fVjZfc2h1ZmZlcXcsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYuc2h1ZmZlcXcKKyAgICBoZXhhZ29uX1Y2X3NodWZmZXF3XzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnNodWZmZXF3LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZTMzJiX25xcHJlZF9haSwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZTMzJiLm5xcHJlZC5haQorICAgIGhleGFnb25fVjZfdlMzMmJfbnFwcmVkX2FpXzEyOEIsICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudlMzMmIubnFwcmVkLmFpLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZTMzJiX250X25xcHJlZF9haSwgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZTMzJiLm50Lm5xcHJlZC5haQorICAgIGhleGFnb25fVjZfdlMzMmJfbnRfbnFwcmVkX2FpXzEyOEIsICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudlMzMmIubnQubnFwcmVkLmFpLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZTMzJiX250X3FwcmVkX2FpLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZTMzJiLm50LnFwcmVkLmFpCisgICAgaGV4YWdvbl9WNl92UzMyYl9udF9xcHJlZF9haV8xMjhCLCAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52UzMyYi5udC5xcHJlZC5haS4xMjhCCisgICAgaGV4YWdvbl9WNl92UzMyYl9xcHJlZF9haSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52UzMyYi5xcHJlZC5haQorICAgIGhleGFnb25fVjZfdlMzMmJfcXByZWRfYWlfMTI4QiwgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudlMzMmIucXByZWQuYWkuMTI4QgorICAgIGhleGFnb25fVjZfdmFic2IsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFic2IKKyAgICBoZXhhZ29uX1Y2X3ZhYnNiXzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhYnNiX3NhdCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNiLnNhdAorICAgIGhleGFnb25fVjZfdmFic2Jfc2F0XzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFic2Iuc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhYnNkaWZmaCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNkaWZmaAorICAgIGhleGFnb25fVjZfdmFic2RpZmZoXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFic2RpZmZoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhYnNkaWZmdWIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNkaWZmdWIKKyAgICBoZXhhZ29uX1Y2X3ZhYnNkaWZmdWJfMTI4QiwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNkaWZmdWIuMTI4QgorICAgIGhleGFnb25fVjZfdmFic2RpZmZ1aCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFic2RpZmZ1aAorICAgIGhleGFnb25fVjZfdmFic2RpZmZ1aF8xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFic2RpZmZ1aC4xMjhCCisgICAgaGV4YWdvbl9WNl92YWJzZGlmZncsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzZGlmZncKKyAgICBoZXhhZ29uX1Y2X3ZhYnNkaWZmd18xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNkaWZmdy4xMjhCCisgICAgaGV4YWdvbl9WNl92YWJzaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzaAorICAgIGhleGFnb25fVjZfdmFic2hfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFic2guMTI4QgorICAgIGhleGFnb25fVjZfdmFic2hfc2F0LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFic2guc2F0CisgICAgaGV4YWdvbl9WNl92YWJzaF9zYXRfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzaC5zYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmFic3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFic3cKKyAgICBoZXhhZ29uX1Y2X3ZhYnN3XzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnN3LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhYnN3X3NhdCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnN3LnNhdAorICAgIGhleGFnb25fVjZfdmFic3dfc2F0XzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFic3cuc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGRiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRiCisgICAgaGV4YWdvbl9WNl92YWRkYl8xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYi4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkYl9kdiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYi5kdgorICAgIGhleGFnb25fVjZfdmFkZGJfZHZfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGIuZHYuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZGJucSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGJucQorICAgIGhleGFnb25fVjZfdmFkZGJucV8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGJucS4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkYnEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYnEKKyAgICBoZXhhZ29uX1Y2X3ZhZGRicV8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRicS4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkYnNhdCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYnNhdAorICAgIGhleGFnb25fVjZfdmFkZGJzYXRfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGJzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZGJzYXRfZHYsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGJzYXQuZHYKKyAgICBoZXhhZ29uX1Y2X3ZhZGRic2F0X2R2XzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRic2F0LmR2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGRjYXJyeSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRjYXJyeQorICAgIGhleGFnb25fVjZfdmFkZGNhcnJ5XzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGNhcnJ5LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGRjbGJoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRjbGJoCisgICAgaGV4YWdvbl9WNl92YWRkY2xiaF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkY2xiaC4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkY2xidywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkY2xidworICAgIGhleGFnb25fVjZfdmFkZGNsYndfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGNsYncuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZGgsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGgKKyAgICBoZXhhZ29uX1Y2X3ZhZGRoXzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGRoX2R2LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRoLmR2CisgICAgaGV4YWdvbl9WNl92YWRkaF9kdl8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaC5kdi4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkaG5xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaG5xCisgICAgaGV4YWdvbl9WNl92YWRkaG5xXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaG5xLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGRocSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRocQorICAgIGhleGFnb25fVjZfdmFkZGhxXzEyOEIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGhxLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGRoc2F0LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRoc2F0CisgICAgaGV4YWdvbl9WNl92YWRkaHNhdF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaHNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkaHNhdF9kdiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaHNhdC5kdgorICAgIGhleGFnb25fVjZfdmFkZGhzYXRfZHZfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGhzYXQuZHYuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZGh3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGh3CisgICAgaGV4YWdvbl9WNl92YWRkaHdfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaHcuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZGh3X2FjYywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGh3LmFjYworICAgIGhleGFnb25fVjZfdmFkZGh3X2FjY18xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGh3LmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkdWJoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWJoCisgICAgaGV4YWdvbl9WNl92YWRkdWJoXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWJoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGR1YmhfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YmguYWNjCisgICAgaGV4YWdvbl9WNl92YWRkdWJoX2FjY18xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWJoLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkdWJzYXQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWJzYXQKKyAgICBoZXhhZ29uX1Y2X3ZhZGR1YnNhdF8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YnNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkdWJzYXRfZHYsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWJzYXQuZHYKKyAgICBoZXhhZ29uX1Y2X3ZhZGR1YnNhdF9kdl8xMjhCLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YnNhdC5kdi4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkdWJ1YmJfc2F0LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWJ1YmIuc2F0CisgICAgaGV4YWdvbl9WNl92YWRkdWJ1YmJfc2F0XzEyOEIsICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWJ1YmIuc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGR1aHNhdCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1aHNhdAorICAgIGhleGFnb25fVjZfdmFkZHVoc2F0XzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVoc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGR1aHNhdF9kdiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1aHNhdC5kdgorICAgIGhleGFnb25fVjZfdmFkZHVoc2F0X2R2XzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVoc2F0LmR2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGR1aHcsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1aHcKKyAgICBoZXhhZ29uX1Y2X3ZhZGR1aHdfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1aHcuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZHVod19hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVody5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZhZGR1aHdfYWNjXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1aHcuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGR1d3NhdCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1d3NhdAorICAgIGhleGFnb25fVjZfdmFkZHV3c2F0XzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHV3c2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGR1d3NhdF9kdiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1d3NhdC5kdgorICAgIGhleGFnb25fVjZfdmFkZHV3c2F0X2R2XzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHV3c2F0LmR2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGR3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR3CisgICAgaGV4YWdvbl9WNl92YWRkd18xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdy4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkd19kdiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdy5kdgorICAgIGhleGFnb25fVjZfdmFkZHdfZHZfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHcuZHYuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZHducSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHducQorICAgIGhleGFnb25fVjZfdmFkZHducV8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHducS4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkd3EsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkd3EKKyAgICBoZXhhZ29uX1Y2X3ZhZGR3cV8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR3cS4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkd3NhdCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkd3NhdAorICAgIGhleGFnb25fVjZfdmFkZHdzYXRfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHdzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZHdzYXRfZHYsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHdzYXQuZHYKKyAgICBoZXhhZ29uX1Y2X3ZhZGR3c2F0X2R2XzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR3c2F0LmR2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhbGlnbmIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbGlnbmIKKyAgICBoZXhhZ29uX1Y2X3ZhbGlnbmJfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbGlnbmIuMTI4QgorICAgIGhleGFnb25fVjZfdmFsaWduYmksICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFsaWduYmkKKyAgICBoZXhhZ29uX1Y2X3ZhbGlnbmJpXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbGlnbmJpLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhbmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmQKKyAgICBoZXhhZ29uX1Y2X3ZhbmRfMTI4QiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmQuMTI4QgorICAgIGhleGFnb25fVjZfdmFuZG5xcnQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFuZG5xcnQKKyAgICBoZXhhZ29uX1Y2X3ZhbmRucXJ0XzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmRucXJ0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhbmRucXJ0X2FjYywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmRucXJ0LmFjYworICAgIGhleGFnb25fVjZfdmFuZG5xcnRfYWNjXzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFuZG5xcnQuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhbmRxcnQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmRxcnQKKyAgICBoZXhhZ29uX1Y2X3ZhbmRxcnRfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmRxcnQuMTI4QgorICAgIGhleGFnb25fVjZfdmFuZHFydF9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFuZHFydC5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZhbmRxcnRfYWNjXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmRxcnQuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhbmR2bnF2LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmR2bnF2CisgICAgaGV4YWdvbl9WNl92YW5kdm5xdl8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YW5kdm5xdi4xMjhCCisgICAgaGV4YWdvbl9WNl92YW5kdnF2LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YW5kdnF2CisgICAgaGV4YWdvbl9WNl92YW5kdnF2XzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YW5kdnF2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhbmR2cnQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmR2cnQKKyAgICBoZXhhZ29uX1Y2X3ZhbmR2cnRfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmR2cnQuMTI4QgorICAgIGhleGFnb25fVjZfdmFuZHZydF9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFuZHZydC5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZhbmR2cnRfYWNjXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmR2cnQuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc2xoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2xoCisgICAgaGV4YWdvbl9WNl92YXNsaF8xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNsaC4xMjhCCisgICAgaGV4YWdvbl9WNl92YXNsaF9hY2MsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNsaC5hY2MKKyAgICBoZXhhZ29uX1Y2X3Zhc2xoX2FjY18xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2xoLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92YXNsaHYsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNsaHYKKyAgICBoZXhhZ29uX1Y2X3Zhc2xodl8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2xodi4xMjhCCisgICAgaGV4YWdvbl9WNl92YXNsdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNsdworICAgIGhleGFnb25fVjZfdmFzbHdfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzbHcuMTI4QgorICAgIGhleGFnb25fVjZfdmFzbHdfYWNjLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzbHcuYWNjCisgICAgaGV4YWdvbl9WNl92YXNsd19hY2NfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNsdy5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdmFzbHd2LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzbHd2CisgICAgaGV4YWdvbl9WNl92YXNsd3ZfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNsd3YuMTI4QgorICAgIGhleGFnb25fVjZfdmFzcmgsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcmgKKyAgICBoZXhhZ29uX1Y2X3Zhc3JoXzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3JoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc3JoX2FjYywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3JoLmFjYworICAgIGhleGFnb25fVjZfdmFzcmhfYWNjXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcmguYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc3JoYnJuZHNhdCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3JoYnJuZHNhdAorICAgIGhleGFnb25fVjZfdmFzcmhicm5kc2F0XzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcmhicm5kc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc3JoYnNhdCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3JoYnNhdAorICAgIGhleGFnb25fVjZfdmFzcmhic2F0XzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcmhic2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc3JodWJybmRzYXQsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3JodWJybmRzYXQKKyAgICBoZXhhZ29uX1Y2X3Zhc3JodWJybmRzYXRfMTI4QiwgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3JodWJybmRzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmFzcmh1YnNhdCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcmh1YnNhdAorICAgIGhleGFnb25fVjZfdmFzcmh1YnNhdF8xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcmh1YnNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92YXNyaHYsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyaHYKKyAgICBoZXhhZ29uX1Y2X3Zhc3Jodl8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3Jodi4xMjhCCisgICAgaGV4YWdvbl9WNl92YXNydWh1YnJuZHNhdCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNydWh1YnJuZHNhdAorICAgIGhleGFnb25fVjZfdmFzcnVodWJybmRzYXRfMTI4QiwgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcnVodWJybmRzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmFzcnVodWJzYXQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcnVodWJzYXQKKyAgICBoZXhhZ29uX1Y2X3Zhc3J1aHVic2F0XzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J1aHVic2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc3J1d3Vocm5kc2F0LCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J1d3Vocm5kc2F0CisgICAgaGV4YWdvbl9WNl92YXNydXd1aHJuZHNhdF8xMjhCLCAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNydXd1aHJuZHNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92YXNydXd1aHNhdCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNydXd1aHNhdAorICAgIGhleGFnb25fVjZfdmFzcnV3dWhzYXRfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcnV3dWhzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmFzcncsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcncKKyAgICBoZXhhZ29uX1Y2X3Zhc3J3XzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc3J3X2FjYywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3LmFjYworICAgIGhleGFnb25fVjZfdmFzcndfYWNjXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcncuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc3J3aCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3aAorICAgIGhleGFnb25fVjZfdmFzcndoXzEyOEIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcndoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc3J3aHJuZHNhdCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3aHJuZHNhdAorICAgIGhleGFnb25fVjZfdmFzcndocm5kc2F0XzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcndocm5kc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc3J3aHNhdCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3aHNhdAorICAgIGhleGFnb25fVjZfdmFzcndoc2F0XzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcndoc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc3J3dWhybmRzYXQsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3dWhybmRzYXQKKyAgICBoZXhhZ29uX1Y2X3Zhc3J3dWhybmRzYXRfMTI4QiwgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3dWhybmRzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmFzcnd1aHNhdCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcnd1aHNhdAorICAgIGhleGFnb25fVjZfdmFzcnd1aHNhdF8xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcnd1aHNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92YXNyd3YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyd3YKKyAgICBoZXhhZ29uX1Y2X3Zhc3J3dl8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3di4xMjhCCisgICAgaGV4YWdvbl9WNl92YXNzaWduLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNzaWduCisgICAgaGV4YWdvbl9WNl92YXNzaWduXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNzaWduLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc3NpZ25wLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3NpZ25wCisgICAgaGV4YWdvbl9WNl92YXNzaWducF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNzaWducC4xMjhCCisgICAgaGV4YWdvbl9WNl92YXZnYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZnYgorICAgIGhleGFnb25fVjZfdmF2Z2JfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmF2Z2IuMTI4QgorICAgIGhleGFnb25fVjZfdmF2Z2JybmQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmF2Z2JybmQKKyAgICBoZXhhZ29uX1Y2X3Zhdmdicm5kXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmdicm5kLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhdmdoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmdoCisgICAgaGV4YWdvbl9WNl92YXZnaF8xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZnaC4xMjhCCisgICAgaGV4YWdvbl9WNl92YXZnaHJuZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZnaHJuZAorICAgIGhleGFnb25fVjZfdmF2Z2hybmRfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmF2Z2hybmQuMTI4QgorICAgIGhleGFnb25fVjZfdmF2Z3ViLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3ViCisgICAgaGV4YWdvbl9WNl92YXZndWJfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndWIuMTI4QgorICAgIGhleGFnb25fVjZfdmF2Z3Vicm5kLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3Vicm5kCisgICAgaGV4YWdvbl9WNl92YXZndWJybmRfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndWJybmQuMTI4QgorICAgIGhleGFnb25fVjZfdmF2Z3VoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3VoCisgICAgaGV4YWdvbl9WNl92YXZndWhfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndWguMTI4QgorICAgIGhleGFnb25fVjZfdmF2Z3Vocm5kLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3Vocm5kCisgICAgaGV4YWdvbl9WNl92YXZndWhybmRfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndWhybmQuMTI4QgorICAgIGhleGFnb25fVjZfdmF2Z3V3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3V3CisgICAgaGV4YWdvbl9WNl92YXZndXdfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndXcuMTI4QgorICAgIGhleGFnb25fVjZfdmF2Z3V3cm5kLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3V3cm5kCisgICAgaGV4YWdvbl9WNl92YXZndXdybmRfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndXdybmQuMTI4QgorICAgIGhleGFnb25fVjZfdmF2Z3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3cKKyAgICBoZXhhZ29uX1Y2X3Zhdmd3XzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd3LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhdmd3cm5kLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd3cm5kCisgICAgaGV4YWdvbl9WNl92YXZnd3JuZF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZnd3JuZC4xMjhCCisgICAgaGV4YWdvbl9WNl92Y2wwaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Y2wwaAorICAgIGhleGFnb25fVjZfdmNsMGhfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmNsMGguMTI4QgorICAgIGhleGFnb25fVjZfdmNsMHcsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmNsMHcKKyAgICBoZXhhZ29uX1Y2X3ZjbDB3XzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZjbDB3LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zjb21iaW5lLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZjb21iaW5lCisgICAgaGV4YWdvbl9WNl92Y29tYmluZV8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Y29tYmluZS4xMjhCCisgICAgaGV4YWdvbl9WNl92ZDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZDAKKyAgICBoZXhhZ29uX1Y2X3ZkMF8xMjhCLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkMC4xMjhCCisgICAgaGV4YWdvbl9WNl92ZGQwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZGQwCisgICAgaGV4YWdvbl9WNl92ZGQwXzEyOEIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZGQwLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkZWFsYiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkZWFsYgorICAgIGhleGFnb25fVjZfdmRlYWxiXzEyOEIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRlYWxiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkZWFsYjR3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkZWFsYjR3CisgICAgaGV4YWdvbl9WNl92ZGVhbGI0d18xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZGVhbGI0dy4xMjhCCisgICAgaGV4YWdvbl9WNl92ZGVhbGgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZGVhbGgKKyAgICBoZXhhZ29uX1Y2X3ZkZWFsaF8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkZWFsaC4xMjhCCisgICAgaGV4YWdvbl9WNl92ZGVhbHZkZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZGVhbHZkZAorICAgIGhleGFnb25fVjZfdmRlYWx2ZGRfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRlYWx2ZGQuMTI4QgorICAgIGhleGFnb25fVjZfdmRlbHRhLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRlbHRhCisgICAgaGV4YWdvbl9WNl92ZGVsdGFfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZGVsdGEuMTI4QgorICAgIGhleGFnb25fVjZfdmRtcHlidXMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlidXMKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5YnVzXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5YnVzX2FjYywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzLmFjYworICAgIGhleGFnb25fVjZfdmRtcHlidXNfYWNjXzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlidXMuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5YnVzX2R2LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzLmR2CisgICAgaGV4YWdvbl9WNl92ZG1weWJ1c19kdl8xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWJ1cy5kdi4xMjhCCisgICAgaGV4YWdvbl9WNl92ZG1weWJ1c19kdl9hY2MsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWJ1cy5kdi5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5YnVzX2R2X2FjY18xMjhCLCAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzLmR2LmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92ZG1weWhiLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhiCisgICAgaGV4YWdvbl9WNl92ZG1weWhiXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aGJfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGIuYWNjCisgICAgaGV4YWdvbl9WNl92ZG1weWhiX2FjY18xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhiLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92ZG1weWhiX2R2LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhiLmR2CisgICAgaGV4YWdvbl9WNl92ZG1weWhiX2R2XzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhiLmR2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aGJfZHZfYWNjLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGIuZHYuYWNjCisgICAgaGV4YWdvbl9WNl92ZG1weWhiX2R2X2FjY18xMjhCLCAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhiLmR2LmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92ZG1weWhpc2F0LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhpc2F0CisgICAgaGV4YWdvbl9WNl92ZG1weWhpc2F0XzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhpc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aGlzYXRfYWNjLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGlzYXQuYWNjCisgICAgaGV4YWdvbl9WNl92ZG1weWhpc2F0X2FjY18xMjhCLCAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhpc2F0LmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92ZG1weWhzYXQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhzYXQKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aHNhdF8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92ZG1weWhzYXRfYWNjLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhzYXQuYWNjCisgICAgaGV4YWdvbl9WNl92ZG1weWhzYXRfYWNjXzEyOEIsICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhzYXQuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aHN1aXNhdCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHN1aXNhdAorICAgIGhleGFnb25fVjZfdmRtcHloc3Vpc2F0XzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloc3Vpc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aHN1aXNhdF9hY2MsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHN1aXNhdC5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aHN1aXNhdF9hY2NfMTI4QiwgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHN1aXNhdC5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdmRtcHloc3VzYXQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloc3VzYXQKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aHN1c2F0XzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHN1c2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aHN1c2F0X2FjYywgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHN1c2F0LmFjYworICAgIGhleGFnb25fVjZfdmRtcHloc3VzYXRfYWNjXzEyOEIsICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloc3VzYXQuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aHZzYXQsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHZzYXQKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aHZzYXRfMTI4QiwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHZzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmRtcHlodnNhdF9hY2MsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlodnNhdC5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aHZzYXRfYWNjXzEyOEIsICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHZzYXQuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zkc2FkdWgsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkc2FkdWgKKyAgICBoZXhhZ29uX1Y2X3Zkc2FkdWhfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkc2FkdWguMTI4QgorICAgIGhleGFnb25fVjZfdmRzYWR1aF9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRzYWR1aC5hY2MKKyAgICBoZXhhZ29uX1Y2X3Zkc2FkdWhfYWNjXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkc2FkdWguYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZlcWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWIKKyAgICBoZXhhZ29uX1Y2X3ZlcWJfMTI4QiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWIuMTI4QgorICAgIGhleGFnb25fVjZfdmVxYl9hbmQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxYi5hbmQKKyAgICBoZXhhZ29uX1Y2X3ZlcWJfYW5kXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWIuYW5kLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZlcWJfb3IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWIub3IKKyAgICBoZXhhZ29uX1Y2X3ZlcWJfb3JfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWIub3IuMTI4QgorICAgIGhleGFnb25fVjZfdmVxYl94b3IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxYi54b3IKKyAgICBoZXhhZ29uX1Y2X3ZlcWJfeG9yXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWIueG9yLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZlcWgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWgKKyAgICBoZXhhZ29uX1Y2X3ZlcWhfMTI4QiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWguMTI4QgorICAgIGhleGFnb25fVjZfdmVxaF9hbmQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxaC5hbmQKKyAgICBoZXhhZ29uX1Y2X3ZlcWhfYW5kXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWguYW5kLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZlcWhfb3IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWgub3IKKyAgICBoZXhhZ29uX1Y2X3ZlcWhfb3JfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWgub3IuMTI4QgorICAgIGhleGFnb25fVjZfdmVxaF94b3IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxaC54b3IKKyAgICBoZXhhZ29uX1Y2X3ZlcWhfeG9yXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWgueG9yLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZlcXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcXcKKyAgICBoZXhhZ29uX1Y2X3ZlcXdfMTI4QiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcXcuMTI4QgorICAgIGhleGFnb25fVjZfdmVxd19hbmQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxdy5hbmQKKyAgICBoZXhhZ29uX1Y2X3ZlcXdfYW5kXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcXcuYW5kLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZlcXdfb3IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcXcub3IKKyAgICBoZXhhZ29uX1Y2X3ZlcXdfb3JfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcXcub3IuMTI4QgorICAgIGhleGFnb25fVjZfdmVxd194b3IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxdy54b3IKKyAgICBoZXhhZ29uX1Y2X3ZlcXdfeG9yXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcXcueG9yLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZnYXRoZXJtaCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaAorICAgIGhleGFnb25fVjZfdmdhdGhlcm1oXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm1oLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZnYXRoZXJtaHEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaHEKKyAgICBoZXhhZ29uX1Y2X3ZnYXRoZXJtaHFfMTI4QiwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaHEuMTI4QgorICAgIGhleGFnb25fVjZfdmdhdGhlcm1odywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm1odworICAgIGhleGFnb25fVjZfdmdhdGhlcm1od18xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm1ody4xMjhCCisgICAgaGV4YWdvbl9WNl92Z2F0aGVybWh3cSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybWh3cQorICAgIGhleGFnb25fVjZfdmdhdGhlcm1od3FfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm1od3EuMTI4QgorICAgIGhleGFnb25fVjZfdmdhdGhlcm13LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm13CisgICAgaGV4YWdvbl9WNl92Z2F0aGVybXdfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybXcuMTI4QgorICAgIGhleGFnb25fVjZfdmdhdGhlcm13cSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm13cQorICAgIGhleGFnb25fVjZfdmdhdGhlcm13cV8xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm13cS4xMjhCCisgICAgaGV4YWdvbl9WNl92Z3RiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RiCisgICAgaGV4YWdvbl9WNl92Z3RiXzEyOEIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndGJfYW5kLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGIuYW5kCisgICAgaGV4YWdvbl9WNl92Z3RiX2FuZF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RiLmFuZC4xMjhCCisgICAgaGV4YWdvbl9WNl92Z3RiX29yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RiLm9yCisgICAgaGV4YWdvbl9WNl92Z3RiX29yXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RiLm9yLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndGJfeG9yLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGIueG9yCisgICAgaGV4YWdvbl9WNl92Z3RiX3hvcl8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RiLnhvci4xMjhCCisgICAgaGV4YWdvbl9WNl92Z3RoLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RoCisgICAgaGV4YWdvbl9WNl92Z3RoXzEyOEIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndGhfYW5kLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGguYW5kCisgICAgaGV4YWdvbl9WNl92Z3RoX2FuZF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RoLmFuZC4xMjhCCisgICAgaGV4YWdvbl9WNl92Z3RoX29yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RoLm9yCisgICAgaGV4YWdvbl9WNl92Z3RoX29yXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RoLm9yLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndGhfeG9yLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGgueG9yCisgICAgaGV4YWdvbl9WNl92Z3RoX3hvcl8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RoLnhvci4xMjhCCisgICAgaGV4YWdvbl9WNl92Z3R1YiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1YgorICAgIGhleGFnb25fVjZfdmd0dWJfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dWIuMTI4QgorICAgIGhleGFnb25fVjZfdmd0dWJfYW5kLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dWIuYW5kCisgICAgaGV4YWdvbl9WNl92Z3R1Yl9hbmRfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1Yi5hbmQuMTI4QgorICAgIGhleGFnb25fVjZfdmd0dWJfb3IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dWIub3IKKyAgICBoZXhhZ29uX1Y2X3ZndHViX29yXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHViLm9yLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndHViX3hvciwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHViLnhvcgorICAgIGhleGFnb25fVjZfdmd0dWJfeG9yXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dWIueG9yLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndHVoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHVoCisgICAgaGV4YWdvbl9WNl92Z3R1aF8xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1aC4xMjhCCisgICAgaGV4YWdvbl9WNl92Z3R1aF9hbmQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1aC5hbmQKKyAgICBoZXhhZ29uX1Y2X3ZndHVoX2FuZF8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHVoLmFuZC4xMjhCCisgICAgaGV4YWdvbl9WNl92Z3R1aF9vciwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1aC5vcgorICAgIGhleGFnb25fVjZfdmd0dWhfb3JfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dWgub3IuMTI4QgorICAgIGhleGFnb25fVjZfdmd0dWhfeG9yLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dWgueG9yCisgICAgaGV4YWdvbl9WNl92Z3R1aF94b3JfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1aC54b3IuMTI4QgorICAgIGhleGFnb25fVjZfdmd0dXcsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dXcKKyAgICBoZXhhZ29uX1Y2X3ZndHV3XzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHV3LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndHV3X2FuZCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHV3LmFuZAorICAgIGhleGFnb25fVjZfdmd0dXdfYW5kXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dXcuYW5kLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndHV3X29yLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHV3Lm9yCisgICAgaGV4YWdvbl9WNl92Z3R1d19vcl8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1dy5vci4xMjhCCisgICAgaGV4YWdvbl9WNl92Z3R1d194b3IsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1dy54b3IKKyAgICBoZXhhZ29uX1Y2X3ZndHV3X3hvcl8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHV3Lnhvci4xMjhCCisgICAgaGV4YWdvbl9WNl92Z3R3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R3CisgICAgaGV4YWdvbl9WNl92Z3R3XzEyOEIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R3LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndHdfYW5kLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHcuYW5kCisgICAgaGV4YWdvbl9WNl92Z3R3X2FuZF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R3LmFuZC4xMjhCCisgICAgaGV4YWdvbl9WNl92Z3R3X29yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R3Lm9yCisgICAgaGV4YWdvbl9WNl92Z3R3X29yXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R3Lm9yLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndHdfeG9yLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHcueG9yCisgICAgaGV4YWdvbl9WNl92Z3R3X3hvcl8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R3Lnhvci4xMjhCCisgICAgaGV4YWdvbl9WNl92aW5zZXJ0d3IsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52aW5zZXJ0d3IKKyAgICBoZXhhZ29uX1Y2X3ZpbnNlcnR3cl8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZpbnNlcnR3ci4xMjhCCisgICAgaGV4YWdvbl9WNl92bGFsaWduYiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bGFsaWduYgorICAgIGhleGFnb25fVjZfdmxhbGlnbmJfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmxhbGlnbmIuMTI4QgorICAgIGhleGFnb25fVjZfdmxhbGlnbmJpLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmxhbGlnbmJpCisgICAgaGV4YWdvbl9WNl92bGFsaWduYmlfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bGFsaWduYmkuMTI4QgorICAgIGhleGFnb25fVjZfdmxzcmIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmxzcmIKKyAgICBoZXhhZ29uX1Y2X3Zsc3JiXzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsc3JiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zsc3JoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsc3JoCisgICAgaGV4YWdvbl9WNl92bHNyaF8xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHNyaC4xMjhCCisgICAgaGV4YWdvbl9WNl92bHNyaHYsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHNyaHYKKyAgICBoZXhhZ29uX1Y2X3Zsc3Jodl8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsc3Jodi4xMjhCCisgICAgaGV4YWdvbl9WNl92bHNydywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHNydworICAgIGhleGFnb25fVjZfdmxzcndfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmxzcncuMTI4QgorICAgIGhleGFnb25fVjZfdmxzcnd2LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmxzcnd2CisgICAgaGV4YWdvbl9WNl92bHNyd3ZfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHNyd3YuMTI4QgorICAgIGhleGFnb25fVjZfdmx1dDQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmx1dDQKKyAgICBoZXhhZ29uX1Y2X3ZsdXQ0XzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXQ0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZsdXR2dmIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2dmIKKyAgICBoZXhhZ29uX1Y2X3ZsdXR2dmJfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2dmIuMTI4QgorICAgIGhleGFnb25fVjZfdmx1dHZ2Yl9ubSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ2Yi5ubQorICAgIGhleGFnb25fVjZfdmx1dHZ2Yl9ubV8xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ2Yi5ubS4xMjhCCisgICAgaGV4YWdvbl9WNl92bHV0dnZiX29yYWNjLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dnZiLm9yYWNjCisgICAgaGV4YWdvbl9WNl92bHV0dnZiX29yYWNjXzEyOEIsICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dnZiLm9yYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZsdXR2dmJfb3JhY2NpLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2dmIub3JhY2NpCisgICAgaGV4YWdvbl9WNl92bHV0dnZiX29yYWNjaV8xMjhCLCAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dnZiLm9yYWNjaS4xMjhCCisgICAgaGV4YWdvbl9WNl92bHV0dnZiaSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dnZiaQorICAgIGhleGFnb25fVjZfdmx1dHZ2YmlfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ2YmkuMTI4QgorICAgIGhleGFnb25fVjZfdmx1dHZ3aCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ3aAorICAgIGhleGFnb25fVjZfdmx1dHZ3aF8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ3aC4xMjhCCisgICAgaGV4YWdvbl9WNl92bHV0dndoX25tLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dndoLm5tCisgICAgaGV4YWdvbl9WNl92bHV0dndoX25tXzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dndoLm5tLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZsdXR2d2hfb3JhY2MsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2d2gub3JhY2MKKyAgICBoZXhhZ29uX1Y2X3ZsdXR2d2hfb3JhY2NfMTI4QiwgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2d2gub3JhY2MuMTI4QgorICAgIGhleGFnb25fVjZfdmx1dHZ3aF9vcmFjY2ksICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ3aC5vcmFjY2kKKyAgICBoZXhhZ29uX1Y2X3ZsdXR2d2hfb3JhY2NpXzEyOEIsICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2d2gub3JhY2NpLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZsdXR2d2hpLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2d2hpCisgICAgaGV4YWdvbl9WNl92bHV0dndoaV8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dndoaS4xMjhCCisgICAgaGV4YWdvbl9WNl92bWFza2Vkc3RvcmVucSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWFza2Vkc3RvcmVucQorICAgIGhleGFnb25fVjZfdm1hc2tlZHN0b3JlbnFfMTI4QiwgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1hc2tlZHN0b3JlbnEuMTI4QgorICAgIGhleGFnb25fVjZfdm1hc2tlZHN0b3JlbnRucSwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1hc2tlZHN0b3JlbnRucQorICAgIGhleGFnb25fVjZfdm1hc2tlZHN0b3JlbnRucV8xMjhCLCAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1hc2tlZHN0b3JlbnRucS4xMjhCCisgICAgaGV4YWdvbl9WNl92bWFza2Vkc3RvcmVudHEsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWFza2Vkc3RvcmVudHEKKyAgICBoZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZW50cV8xMjhCLCAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXNrZWRzdG9yZW50cS4xMjhCCisgICAgaGV4YWdvbl9WNl92bWFza2Vkc3RvcmVxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWFza2Vkc3RvcmVxCisgICAgaGV4YWdvbl9WNl92bWFza2Vkc3RvcmVxXzEyOEIsICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWFza2Vkc3RvcmVxLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtYXhiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXhiCisgICAgaGV4YWdvbl9WNl92bWF4Yl8xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWF4Yi4xMjhCCisgICAgaGV4YWdvbl9WNl92bWF4aCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWF4aAorICAgIGhleGFnb25fVjZfdm1heGhfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1heGguMTI4QgorICAgIGhleGFnb25fVjZfdm1heHViLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1heHViCisgICAgaGV4YWdvbl9WNl92bWF4dWJfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWF4dWIuMTI4QgorICAgIGhleGFnb25fVjZfdm1heHVoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1heHVoCisgICAgaGV4YWdvbl9WNl92bWF4dWhfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWF4dWguMTI4QgorICAgIGhleGFnb25fVjZfdm1heHcsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1heHcKKyAgICBoZXhhZ29uX1Y2X3ZtYXh3XzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXh3LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtaW5iLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtaW5iCisgICAgaGV4YWdvbl9WNl92bWluYl8xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWluYi4xMjhCCisgICAgaGV4YWdvbl9WNl92bWluaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWluaAorICAgIGhleGFnb25fVjZfdm1pbmhfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1pbmguMTI4QgorICAgIGhleGFnb25fVjZfdm1pbnViLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1pbnViCisgICAgaGV4YWdvbl9WNl92bWludWJfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWludWIuMTI4QgorICAgIGhleGFnb25fVjZfdm1pbnVoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1pbnVoCisgICAgaGV4YWdvbl9WNl92bWludWhfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWludWguMTI4QgorICAgIGhleGFnb25fVjZfdm1pbncsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1pbncKKyAgICBoZXhhZ29uX1Y2X3ZtaW53XzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtaW53LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcGFidXMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFidXMKKyAgICBoZXhhZ29uX1Y2X3ZtcGFidXNfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFidXMuMTI4QgorICAgIGhleGFnb25fVjZfdm1wYWJ1c19hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1wYWJ1cy5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZtcGFidXNfYWNjXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFidXMuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcGFidXN2LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFidXN2CisgICAgaGV4YWdvbl9WNl92bXBhYnVzdl8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhYnVzdi4xMjhCCisgICAgaGV4YWdvbl9WNl92bXBhYnV1LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhYnV1CisgICAgaGV4YWdvbl9WNl92bXBhYnV1XzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhYnV1LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcGFidXVfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFidXUuYWNjCisgICAgaGV4YWdvbl9WNl92bXBhYnV1X2FjY18xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhYnV1LmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXBhYnV1diwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhYnV1dgorICAgIGhleGFnb25fVjZfdm1wYWJ1dXZfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1wYWJ1dXYuMTI4QgorICAgIGhleGFnb25fVjZfdm1wYWhiLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1wYWhiCisgICAgaGV4YWdvbl9WNl92bXBhaGJfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhaGIuMTI4QgorICAgIGhleGFnb25fVjZfdm1wYWhiX2FjYywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1wYWhiLmFjYworICAgIGhleGFnb25fVjZfdm1wYWhiX2FjY18xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1wYWhiLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXBhaGhzYXQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhaGhzYXQKKyAgICBoZXhhZ29uX1Y2X3ZtcGFoaHNhdF8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFoaHNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92bXBhdWhiLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhdWhiCisgICAgaGV4YWdvbl9WNl92bXBhdWhiXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhdWhiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcGF1aGJfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGF1aGIuYWNjCisgICAgaGV4YWdvbl9WNl92bXBhdWhiX2FjY18xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhdWhiLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXBhdWh1aHNhdCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhdWh1aHNhdAorICAgIGhleGFnb25fVjZfdm1wYXVodWhzYXRfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1wYXVodWhzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdm1wc3VodWhzYXQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1wc3VodWhzYXQKKyAgICBoZXhhZ29uX1Y2X3ZtcHN1aHVoc2F0XzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHN1aHVoc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlidXMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlidXMKKyAgICBoZXhhZ29uX1Y2X3ZtcHlidXNfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlidXMuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWJ1c19hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ1cy5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZtcHlidXNfYWNjXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlidXMuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlidXN2LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlidXN2CisgICAgaGV4YWdvbl9WNl92bXB5YnVzdl8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5YnVzdi4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5YnVzdl9hY2MsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5YnVzdi5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZtcHlidXN2X2FjY18xMjhCLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlidXN2LmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5YnYsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5YnYKKyAgICBoZXhhZ29uX1Y2X3ZtcHlidl8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlidi4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5YnZfYWNjLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5YnYuYWNjCisgICAgaGV4YWdvbl9WNl92bXB5YnZfYWNjXzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5YnYuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlld3VoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlld3VoCisgICAgaGV4YWdvbl9WNl92bXB5ZXd1aF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5ZXd1aC4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5ZXd1aF82NCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5ZXd1aC42NAorICAgIGhleGFnb25fVjZfdm1weWV3dWhfNjRfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWV3dWguNjQuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWgsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWgKKyAgICBoZXhhZ29uX1Y2X3ZtcHloXzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHloLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHloX2FjYywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHloLmFjYworICAgIGhleGFnb25fVjZfdm1weWhfYWNjXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWguYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHloc2F0X2FjYywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHloc2F0LmFjYworICAgIGhleGFnb25fVjZfdm1weWhzYXRfYWNjXzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWhzYXQuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHloc3JzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHloc3JzCisgICAgaGV4YWdvbl9WNl92bXB5aHNyc18xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHNycy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5aHNzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHNzCisgICAgaGV4YWdvbl9WNl92bXB5aHNzXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHNzLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlodXMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlodXMKKyAgICBoZXhhZ29uX1Y2X3ZtcHlodXNfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlodXMuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWh1c19hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWh1cy5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZtcHlodXNfYWNjXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlodXMuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlodiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlodgorICAgIGhleGFnb25fVjZfdm1weWh2XzEyOEIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWh2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlodl9hY2MsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlodi5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZtcHlodl9hY2NfMTI4QiwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlodi5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWh2c3JzLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWh2c3JzCisgICAgaGV4YWdvbl9WNl92bXB5aHZzcnNfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHZzcnMuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWllb2gsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWllb2gKKyAgICBoZXhhZ29uX1Y2X3ZtcHlpZW9oXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpZW9oLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlpZXdoX2FjYywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpZXdoLmFjYworICAgIGhleGFnb25fVjZfdm1weWlld2hfYWNjXzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWlld2guYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlpZXd1aCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpZXd1aAorICAgIGhleGFnb25fVjZfdm1weWlld3VoXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWlld3VoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlpZXd1aF9hY2MsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpZXd1aC5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZtcHlpZXd1aF9hY2NfMTI4QiwgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpZXd1aC5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWloLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWloCisgICAgaGV4YWdvbl9WNl92bXB5aWhfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWguMTI4QgorICAgIGhleGFnb25fVjZfdm1weWloX2FjYywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWloLmFjYworICAgIGhleGFnb25fVjZfdm1weWloX2FjY18xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWloLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5aWhiLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWhiCisgICAgaGV4YWdvbl9WNl92bXB5aWhiXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWhiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlpaGJfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpaGIuYWNjCisgICAgaGV4YWdvbl9WNl92bXB5aWhiX2FjY18xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWhiLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5aW93aCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aW93aAorICAgIGhleGFnb25fVjZfdm1weWlvd2hfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWlvd2guMTI4QgorICAgIGhleGFnb25fVjZfdm1weWl3YiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3YgorICAgIGhleGFnb25fVjZfdm1weWl3Yl8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3Yi4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5aXdiX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXdiLmFjYworICAgIGhleGFnb25fVjZfdm1weWl3Yl9hY2NfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3Yi5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWl3aCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3aAorICAgIGhleGFnb25fVjZfdm1weWl3aF8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3aC4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5aXdoX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXdoLmFjYworICAgIGhleGFnb25fVjZfdm1weWl3aF9hY2NfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3aC5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWl3dWIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3dWIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlpd3ViXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpd3ViLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlpd3ViX2FjYywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpd3ViLmFjYworICAgIGhleGFnb25fVjZfdm1weWl3dWJfYWNjXzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3dWIuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlvd2gsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlvd2gKKyAgICBoZXhhZ29uX1Y2X3ZtcHlvd2hfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlvd2guMTI4QgorICAgIGhleGFnb25fVjZfdm1weW93aF82NF9hY2MsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weW93aC42NC5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZtcHlvd2hfNjRfYWNjXzEyOEIsICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlvd2guNjQuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlvd2hfcm5kLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlvd2gucm5kCisgICAgaGV4YWdvbl9WNl92bXB5b3doX3JuZF8xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5b3doLnJuZC4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5b3doX3JuZF9zYWNjLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5b3doLnJuZC5zYWNjCisgICAgaGV4YWdvbl9WNl92bXB5b3doX3JuZF9zYWNjXzEyOEIsICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5b3doLnJuZC5zYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlvd2hfc2FjYywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlvd2guc2FjYworICAgIGhleGFnb25fVjZfdm1weW93aF9zYWNjXzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weW93aC5zYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHl1YiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1YgorICAgIGhleGFnb25fVjZfdm1weXViXzEyOEIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weXViLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHl1Yl9hY2MsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1Yi5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZtcHl1Yl9hY2NfMTI4QiwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1Yi5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdm1weXVidiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weXVidgorICAgIGhleGFnb25fVjZfdm1weXVidl8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weXVidi4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5dWJ2X2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWJ2LmFjYworICAgIGhleGFnb25fVjZfdm1weXVidl9hY2NfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weXVidi5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdm1weXVoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weXVoCisgICAgaGV4YWdvbl9WNl92bXB5dWhfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWguMTI4QgorICAgIGhleGFnb25fVjZfdm1weXVoX2FjYywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weXVoLmFjYworICAgIGhleGFnb25fVjZfdm1weXVoX2FjY18xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weXVoLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5dWhlLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWhlCisgICAgaGV4YWdvbl9WNl92bXB5dWhlXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWhlLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHl1aGVfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1aGUuYWNjCisgICAgaGV4YWdvbl9WNl92bXB5dWhlX2FjY18xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWhlLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5dWh2LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWh2CisgICAgaGV4YWdvbl9WNl92bXB5dWh2XzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWh2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHl1aHZfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1aHYuYWNjCisgICAgaGV4YWdvbl9WNl92bXB5dWh2X2FjY18xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWh2LmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXV4CisgICAgaGV4YWdvbl9WNl92bXV4XzEyOEIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXV4LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZuYXZnYiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZuYXZnYgorICAgIGhleGFnb25fVjZfdm5hdmdiXzEyOEIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm5hdmdiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZuYXZnaCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZuYXZnaAorICAgIGhleGFnb25fVjZfdm5hdmdoXzEyOEIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm5hdmdoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZuYXZndWIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZuYXZndWIKKyAgICBoZXhhZ29uX1Y2X3ZuYXZndWJfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZuYXZndWIuMTI4QgorICAgIGhleGFnb25fVjZfdm5hdmd3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm5hdmd3CisgICAgaGV4YWdvbl9WNl92bmF2Z3dfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bmF2Z3cuMTI4QgorICAgIGhleGFnb25fVjZfdm5vcm1hbXRoLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm5vcm1hbXRoCisgICAgaGV4YWdvbl9WNl92bm9ybWFtdGhfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bm9ybWFtdGguMTI4QgorICAgIGhleGFnb25fVjZfdm5vcm1hbXR3LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm5vcm1hbXR3CisgICAgaGV4YWdvbl9WNl92bm9ybWFtdHdfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bm9ybWFtdHcuMTI4QgorICAgIGhleGFnb25fVjZfdm5vdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm5vdAorICAgIGhleGFnb25fVjZfdm5vdF8xMjhCLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm5vdC4xMjhCCisgICAgaGV4YWdvbl9WNl92b3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52b3IKKyAgICBoZXhhZ29uX1Y2X3Zvcl8xMjhCLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZvci4xMjhCCisgICAgaGV4YWdvbl9WNl92cGFja2ViLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja2ViCisgICAgaGV4YWdvbl9WNl92cGFja2ViXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja2ViLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZwYWNrZWgsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrZWgKKyAgICBoZXhhZ29uX1Y2X3ZwYWNrZWhfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrZWguMTI4QgorICAgIGhleGFnb25fVjZfdnBhY2toYl9zYXQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnBhY2toYi5zYXQKKyAgICBoZXhhZ29uX1Y2X3ZwYWNraGJfc2F0XzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNraGIuc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZwYWNraHViX3NhdCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNraHViLnNhdAorICAgIGhleGFnb25fVjZfdnBhY2todWJfc2F0XzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnBhY2todWIuc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZwYWNrb2IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrb2IKKyAgICBoZXhhZ29uX1Y2X3ZwYWNrb2JfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrb2IuMTI4QgorICAgIGhleGFnb25fVjZfdnBhY2tvaCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnBhY2tvaAorICAgIGhleGFnb25fVjZfdnBhY2tvaF8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnBhY2tvaC4xMjhCCisgICAgaGV4YWdvbl9WNl92cGFja3doX3NhdCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja3doLnNhdAorICAgIGhleGFnb25fVjZfdnBhY2t3aF9zYXRfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnBhY2t3aC5zYXQuMTI4QgorICAgIGhleGFnb25fVjZfdnBhY2t3dWhfc2F0LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnBhY2t3dWguc2F0CisgICAgaGV4YWdvbl9WNl92cGFja3d1aF9zYXRfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja3d1aC5zYXQuMTI4QgorICAgIGhleGFnb25fVjZfdnBvcGNvdW50aCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnBvcGNvdW50aAorICAgIGhleGFnb25fVjZfdnBvcGNvdW50aF8xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnBvcGNvdW50aC4xMjhCCisgICAgaGV4YWdvbl9WNl92cHJlZml4cWIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cHJlZml4cWIKKyAgICBoZXhhZ29uX1Y2X3ZwcmVmaXhxYl8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZwcmVmaXhxYi4xMjhCCisgICAgaGV4YWdvbl9WNl92cHJlZml4cWgsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cHJlZml4cWgKKyAgICBoZXhhZ29uX1Y2X3ZwcmVmaXhxaF8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZwcmVmaXhxaC4xMjhCCisgICAgaGV4YWdvbl9WNl92cHJlZml4cXcsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cHJlZml4cXcKKyAgICBoZXhhZ29uX1Y2X3ZwcmVmaXhxd18xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZwcmVmaXhxdy4xMjhCCisgICAgaGV4YWdvbl9WNl92cmRlbHRhLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cmRlbHRhCisgICAgaGV4YWdvbl9WNl92cmRlbHRhXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cmRlbHRhLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZybXB5YnViX3J0dCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnViLnJ0dAorICAgIGhleGFnb25fVjZfdnJtcHlidWJfcnR0XzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidWIucnR0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZybXB5YnViX3J0dF9hY2MsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnViLnJ0dC5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZybXB5YnViX3J0dF9hY2NfMTI4QiwgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnViLnJ0dC5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdnJtcHlidXMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXMKKyAgICBoZXhhZ29uX1Y2X3ZybXB5YnVzXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZybXB5YnVzX2FjYywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzLmFjYworICAgIGhleGFnb25fVjZfdnJtcHlidXNfYWNjXzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXMuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZybXB5YnVzaSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzaQorICAgIGhleGFnb25fVjZfdnJtcHlidXNpXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXNpLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZybXB5YnVzaV9hY2MsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzaS5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZybXB5YnVzaV9hY2NfMTI4QiwgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzaS5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdnJtcHlidXN2LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXN2CisgICAgaGV4YWdvbl9WNl92cm1weWJ1c3ZfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1c3YuMTI4QgorICAgIGhleGFnb25fVjZfdnJtcHlidXN2X2FjYywgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXN2LmFjYworICAgIGhleGFnb25fVjZfdnJtcHlidXN2X2FjY18xMjhCLCAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXN2LmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92cm1weWJ2LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ2CisgICAgaGV4YWdvbl9WNl92cm1weWJ2XzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZybXB5YnZfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnYuYWNjCisgICAgaGV4YWdvbl9WNl92cm1weWJ2X2FjY18xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ2LmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92cm1weXViLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViCisgICAgaGV4YWdvbl9WNl92cm1weXViXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZybXB5dWJfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWIuYWNjCisgICAgaGV4YWdvbl9WNl92cm1weXViX2FjY18xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92cm1weXViX3J0dCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViLnJ0dAorICAgIGhleGFnb25fVjZfdnJtcHl1Yl9ydHRfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1Yi5ydHQuMTI4QgorICAgIGhleGFnb25fVjZfdnJtcHl1Yl9ydHRfYWNjLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1Yi5ydHQuYWNjCisgICAgaGV4YWdvbl9WNl92cm1weXViX3J0dF9hY2NfMTI4QiwgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViLnJ0dC5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdnJtcHl1YmksICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1YmkKKyAgICBoZXhhZ29uX1Y2X3ZybXB5dWJpXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWJpLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZybXB5dWJpX2FjYywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWJpLmFjYworICAgIGhleGFnb25fVjZfdnJtcHl1YmlfYWNjXzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1YmkuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZybXB5dWJ2LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWJ2CisgICAgaGV4YWdvbl9WNl92cm1weXVidl8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXVidi4xMjhCCisgICAgaGV4YWdvbl9WNl92cm1weXVidl9hY2MsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXVidi5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZybXB5dWJ2X2FjY18xMjhCLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWJ2LmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92cm9yLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm9yCisgICAgaGV4YWdvbl9WNl92cm9yXzEyOEIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm9yLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zyb3VuZGhiLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyb3VuZGhiCisgICAgaGV4YWdvbl9WNl92cm91bmRoYl8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmRoYi4xMjhCCisgICAgaGV4YWdvbl9WNl92cm91bmRodWIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmRodWIKKyAgICBoZXhhZ29uX1Y2X3Zyb3VuZGh1Yl8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyb3VuZGh1Yi4xMjhCCisgICAgaGV4YWdvbl9WNl92cm91bmR1aHViLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmR1aHViCisgICAgaGV4YWdvbl9WNl92cm91bmR1aHViXzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmR1aHViLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zyb3VuZHV3dWgsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyb3VuZHV3dWgKKyAgICBoZXhhZ29uX1Y2X3Zyb3VuZHV3dWhfMTI4QiwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyb3VuZHV3dWguMTI4QgorICAgIGhleGFnb25fVjZfdnJvdW5kd2gsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJvdW5kd2gKKyAgICBoZXhhZ29uX1Y2X3Zyb3VuZHdoXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyb3VuZHdoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zyb3VuZHd1aCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyb3VuZHd1aAorICAgIGhleGFnb25fVjZfdnJvdW5kd3VoXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJvdW5kd3VoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zyc2FkdWJpLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyc2FkdWJpCisgICAgaGV4YWdvbl9WNl92cnNhZHViaV8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cnNhZHViaS4xMjhCCisgICAgaGV4YWdvbl9WNl92cnNhZHViaV9hY2MsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cnNhZHViaS5hY2MKKyAgICBoZXhhZ29uX1Y2X3Zyc2FkdWJpX2FjY18xMjhCLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyc2FkdWJpLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92c2F0aHViLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2F0aHViCisgICAgaGV4YWdvbl9WNl92c2F0aHViXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2F0aHViLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzYXR1d3VoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzYXR1d3VoCisgICAgaGV4YWdvbl9WNl92c2F0dXd1aF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2F0dXd1aC4xMjhCCisgICAgaGV4YWdvbl9WNl92c2F0d2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2F0d2gKKyAgICBoZXhhZ29uX1Y2X3ZzYXR3aF8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzYXR3aC4xMjhCCisgICAgaGV4YWdvbl9WNl92c2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2IKKyAgICBoZXhhZ29uX1Y2X3ZzYl8xMjhCLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzYi4xMjhCCisgICAgaGV4YWdvbl9WNl92c2NhdHRlcm1oLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1oCisgICAgaGV4YWdvbl9WNl92c2NhdHRlcm1oXzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1oLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzY2F0dGVybWhfYWRkLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWguYWRkCisgICAgaGV4YWdvbl9WNl92c2NhdHRlcm1oX2FkZF8xMjhCLCAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1oLmFkZC4xMjhCCisgICAgaGV4YWdvbl9WNl92c2NhdHRlcm1ocSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1ocQorICAgIGhleGFnb25fVjZfdnNjYXR0ZXJtaHFfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHEuMTI4QgorICAgIGhleGFnb25fVjZfdnNjYXR0ZXJtaHcsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHcKKyAgICBoZXhhZ29uX1Y2X3ZzY2F0dGVybWh3XzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWh3LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzY2F0dGVybWh3X2FkZCwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWh3LmFkZAorICAgIGhleGFnb25fVjZfdnNjYXR0ZXJtaHdfYWRkXzEyOEIsICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHcuYWRkLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzY2F0dGVybWh3cSwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWh3cQorICAgIGhleGFnb25fVjZfdnNjYXR0ZXJtaHdxXzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHdxLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzY2F0dGVybXcsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybXcKKyAgICBoZXhhZ29uX1Y2X3ZzY2F0dGVybXdfMTI4QiwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybXcuMTI4QgorICAgIGhleGFnb25fVjZfdnNjYXR0ZXJtd19hZGQsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtdy5hZGQKKyAgICBoZXhhZ29uX1Y2X3ZzY2F0dGVybXdfYWRkXzEyOEIsICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybXcuYWRkLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzY2F0dGVybXdxLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybXdxCisgICAgaGV4YWdvbl9WNl92c2NhdHRlcm13cV8xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm13cS4xMjhCCisgICAgaGV4YWdvbl9WNl92c2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2gKKyAgICBoZXhhZ29uX1Y2X3ZzaF8xMjhCLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaC4xMjhCCisgICAgaGV4YWdvbl9WNl92c2h1ZmVoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1ZmVoCisgICAgaGV4YWdvbl9WNl92c2h1ZmVoXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1ZmVoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzaHVmZmIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZmIKKyAgICBoZXhhZ29uX1Y2X3ZzaHVmZmJfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZmIuMTI4QgorICAgIGhleGFnb25fVjZfdnNodWZmZWIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNodWZmZWIKKyAgICBoZXhhZ29uX1Y2X3ZzaHVmZmViXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZmViLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzaHVmZmgsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZmgKKyAgICBoZXhhZ29uX1Y2X3ZzaHVmZmhfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZmguMTI4QgorICAgIGhleGFnb25fVjZfdnNodWZmb2IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNodWZmb2IKKyAgICBoZXhhZ29uX1Y2X3ZzaHVmZm9iXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZm9iLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzaHVmZnZkZCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZnZkZAorICAgIGhleGFnb25fVjZfdnNodWZmdmRkXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNodWZmdmRkLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzaHVmb2ViLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmb2ViCisgICAgaGV4YWdvbl9WNl92c2h1Zm9lYl8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1Zm9lYi4xMjhCCisgICAgaGV4YWdvbl9WNl92c2h1Zm9laCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1Zm9laAorICAgIGhleGFnb25fVjZfdnNodWZvZWhfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNodWZvZWguMTI4QgorICAgIGhleGFnb25fVjZfdnNodWZvaCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNodWZvaAorICAgIGhleGFnb25fVjZfdnNodWZvaF8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNodWZvaC4xMjhCCisgICAgaGV4YWdvbl9WNl92c3ViYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViYgorICAgIGhleGFnb25fVjZfdnN1YmJfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmIuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YmJfZHYsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmIuZHYKKyAgICBoZXhhZ29uX1Y2X3ZzdWJiX2R2XzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJiLmR2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzdWJibnEsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJibnEKKyAgICBoZXhhZ29uX1Y2X3ZzdWJibnFfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJibnEuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YmJxLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmJxCisgICAgaGV4YWdvbl9WNl92c3ViYnFfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViYnEuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YmJzYXQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmJzYXQKKyAgICBoZXhhZ29uX1Y2X3ZzdWJic2F0XzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJic2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzdWJic2F0X2R2LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJic2F0LmR2CisgICAgaGV4YWdvbl9WNl92c3ViYnNhdF9kdl8xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViYnNhdC5kdi4xMjhCCisgICAgaGV4YWdvbl9WNl92c3ViY2FycnksICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViY2FycnkKKyAgICBoZXhhZ29uX1Y2X3ZzdWJjYXJyeV8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJjYXJyeS4xMjhCCisgICAgaGV4YWdvbl9WNl92c3ViaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViaAorICAgIGhleGFnb25fVjZfdnN1YmhfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmguMTI4QgorICAgIGhleGFnb25fVjZfdnN1YmhfZHYsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmguZHYKKyAgICBoZXhhZ29uX1Y2X3ZzdWJoX2R2XzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJoLmR2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzdWJobnEsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJobnEKKyAgICBoZXhhZ29uX1Y2X3ZzdWJobnFfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJobnEuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YmhxLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmhxCisgICAgaGV4YWdvbl9WNl92c3ViaHFfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViaHEuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YmhzYXQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmhzYXQKKyAgICBoZXhhZ29uX1Y2X3ZzdWJoc2F0XzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJoc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzdWJoc2F0X2R2LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJoc2F0LmR2CisgICAgaGV4YWdvbl9WNl92c3ViaHNhdF9kdl8xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViaHNhdC5kdi4xMjhCCisgICAgaGV4YWdvbl9WNl92c3ViaHcsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViaHcKKyAgICBoZXhhZ29uX1Y2X3ZzdWJod18xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJody4xMjhCCisgICAgaGV4YWdvbl9WNl92c3VidWJoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWJoCisgICAgaGV4YWdvbl9WNl92c3VidWJoXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWJoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ1YnNhdCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1YnNhdAorICAgIGhleGFnb25fVjZfdnN1YnVic2F0XzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YnVic2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ1YnNhdF9kdiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1YnNhdC5kdgorICAgIGhleGFnb25fVjZfdnN1YnVic2F0X2R2XzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YnVic2F0LmR2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ1YnViYl9zYXQsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1YnViYi5zYXQKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ1YnViYl9zYXRfMTI4QiwgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1YnViYi5zYXQuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YnVoc2F0LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YnVoc2F0CisgICAgaGV4YWdvbl9WNl92c3VidWhzYXRfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWhzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YnVoc2F0X2R2LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YnVoc2F0LmR2CisgICAgaGV4YWdvbl9WNl92c3VidWhzYXRfZHZfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWhzYXQuZHYuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YnVodywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YnVodworICAgIGhleGFnb25fVjZfdnN1YnVod18xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YnVody4xMjhCCisgICAgaGV4YWdvbl9WNl92c3VidXdzYXQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidXdzYXQKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ1d3NhdF8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1d3NhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92c3VidXdzYXRfZHYsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidXdzYXQuZHYKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ1d3NhdF9kdl8xMjhCLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1d3NhdC5kdi4xMjhCCisgICAgaGV4YWdvbl9WNl92c3VidywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidworICAgIGhleGFnb25fVjZfdnN1YndfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YncuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YndfZHYsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YncuZHYKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ3X2R2XzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ3LmR2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ3bnEsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ3bnEKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ3bnFfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ3bnEuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YndxLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YndxCisgICAgaGV4YWdvbl9WNl92c3Vid3FfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3Vid3EuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YndzYXQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YndzYXQKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ3c2F0XzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ3c2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ3c2F0X2R2LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ3c2F0LmR2CisgICAgaGV4YWdvbl9WNl92c3Vid3NhdF9kdl8xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3Vid3NhdC5kdi4xMjhCCisgICAgaGV4YWdvbl9WNl92c3dhcCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3dhcAorICAgIGhleGFnb25fVjZfdnN3YXBfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN3YXAuMTI4QgorICAgIGhleGFnb25fVjZfdnRtcHliLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnRtcHliCisgICAgaGV4YWdvbl9WNl92dG1weWJfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dG1weWIuMTI4QgorICAgIGhleGFnb25fVjZfdnRtcHliX2FjYywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnRtcHliLmFjYworICAgIGhleGFnb25fVjZfdnRtcHliX2FjY18xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnRtcHliLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92dG1weWJ1cywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dG1weWJ1cworICAgIGhleGFnb25fVjZfdnRtcHlidXNfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnRtcHlidXMuMTI4QgorICAgIGhleGFnb25fVjZfdnRtcHlidXNfYWNjLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnRtcHlidXMuYWNjCisgICAgaGV4YWdvbl9WNl92dG1weWJ1c19hY2NfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dG1weWJ1cy5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdnRtcHloYiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnRtcHloYgorICAgIGhleGFnb25fVjZfdnRtcHloYl8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnRtcHloYi4xMjhCCisgICAgaGV4YWdvbl9WNl92dG1weWhiX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dG1weWhiLmFjYworICAgIGhleGFnb25fVjZfdnRtcHloYl9hY2NfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnRtcHloYi5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdnVucGFja2IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnVucGFja2IKKyAgICBoZXhhZ29uX1Y2X3Z1bnBhY2tiXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2tiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Z1bnBhY2toLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2toCisgICAgaGV4YWdvbl9WNl92dW5wYWNraF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dW5wYWNraC4xMjhCCisgICAgaGV4YWdvbl9WNl92dW5wYWNrb2IsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dW5wYWNrb2IKKyAgICBoZXhhZ29uX1Y2X3Z1bnBhY2tvYl8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2tvYi4xMjhCCisgICAgaGV4YWdvbl9WNl92dW5wYWNrb2gsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dW5wYWNrb2gKKyAgICBoZXhhZ29uX1Y2X3Z1bnBhY2tvaF8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2tvaC4xMjhCCisgICAgaGV4YWdvbl9WNl92dW5wYWNrdWIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dW5wYWNrdWIKKyAgICBoZXhhZ29uX1Y2X3Z1bnBhY2t1Yl8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2t1Yi4xMjhCCisgICAgaGV4YWdvbl9WNl92dW5wYWNrdWgsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dW5wYWNrdWgKKyAgICBoZXhhZ29uX1Y2X3Z1bnBhY2t1aF8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2t1aC4xMjhCCisgICAgaGV4YWdvbl9WNl92eG9yLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52eG9yCisgICAgaGV4YWdvbl9WNl92eG9yXzEyOEIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52eG9yLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Z6YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ6YgorICAgIGhleGFnb25fVjZfdnpiXzEyOEIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnpiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Z6aCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ6aAorICAgIGhleGFnb25fVjZfdnpoXzEyOEIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnpoLjEyOEIKKyAgICBoZXhhZ29uX1kyX2RjY2xlYW5hLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlkyLmRjY2xlYW5hCisgICAgaGV4YWdvbl9ZMl9kY2NsZWFuaW52YSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5ZMi5kY2NsZWFuaW52YQorICAgIGhleGFnb25fWTJfZGNpbnZhLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uWTIuZGNpbnZhCisgICAgaGV4YWdvbl9ZMl9kY3plcm9hLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5ZMi5kY3plcm9hCisgICAgaGV4YWdvbl9ZNF9sMmZldGNoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5ZNC5sMmZldGNoCisgICAgaGV4YWdvbl9ZNV9sMmZldGNoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5ZNS5sMmZldGNoCisgICAgaGV4YWdvbl9jaXJjX2xkYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5jaXJjLmxkYgorICAgIGhleGFnb25fY2lyY19sZGQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uY2lyYy5sZGQKKyAgICBoZXhhZ29uX2NpcmNfbGRoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLmNpcmMubGRoCisgICAgaGV4YWdvbl9jaXJjX2xkdWIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5jaXJjLmxkdWIKKyAgICBoZXhhZ29uX2NpcmNfbGR1aCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLmNpcmMubGR1aAorICAgIGhleGFnb25fY2lyY19sZHcsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uY2lyYy5sZHcKKyAgICBoZXhhZ29uX2NpcmNfc3RiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLmNpcmMuc3RiCisgICAgaGV4YWdvbl9jaXJjX3N0ZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5jaXJjLnN0ZAorICAgIGhleGFnb25fY2lyY19zdGgsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uY2lyYy5zdGgKKyAgICBoZXhhZ29uX2NpcmNfc3RoaGksICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLmNpcmMuc3RoaGkKKyAgICBoZXhhZ29uX2NpcmNfc3R3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLmNpcmMuc3R3CisgICAgaGV4YWdvbl9tbTI1NmlfdmFkZHcsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5tbTI1NmkudmFkZHcKKyAgICBoZXhhZ29uX3ByZWZldGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLnByZWZldGNoCisgICAgbWlwc19hYnNxX3NfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hYnNxLnMucGgKKyAgICBtaXBzX2Fic3Ffc19xYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFic3Eucy5xYgorICAgIG1pcHNfYWJzcV9zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWJzcS5zLncKKyAgICBtaXBzX2FkZF9hX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZC5hLmIKKyAgICBtaXBzX2FkZF9hX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZC5hLmQKKyAgICBtaXBzX2FkZF9hX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZC5hLmgKKyAgICBtaXBzX2FkZF9hX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZC5hLncKKyAgICBtaXBzX2FkZHFfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHEucGgKKyAgICBtaXBzX2FkZHFfc19waCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHEucy5waAorICAgIG1pcHNfYWRkcV9zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkcS5zLncKKyAgICBtaXBzX2FkZHFoX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHFoLnBoCisgICAgbWlwc19hZGRxaF9yX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGRxaC5yLnBoCisgICAgbWlwc19hZGRxaF9yX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGRxaC5yLncKKyAgICBtaXBzX2FkZHFoX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHFoLncKKyAgICBtaXBzX2FkZHNfYV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHMuYS5iCisgICAgbWlwc19hZGRzX2FfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGRzLmEuZAorICAgIG1pcHNfYWRkc19hX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkcy5hLmgKKyAgICBtaXBzX2FkZHNfYV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHMuYS53CisgICAgbWlwc19hZGRzX3NfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGRzLnMuYgorICAgIG1pcHNfYWRkc19zX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkcy5zLmQKKyAgICBtaXBzX2FkZHNfc19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHMucy5oCisgICAgbWlwc19hZGRzX3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGRzLnMudworICAgIG1pcHNfYWRkc191X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkcy51LmIKKyAgICBtaXBzX2FkZHNfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHMudS5kCisgICAgbWlwc19hZGRzX3VfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGRzLnUuaAorICAgIG1pcHNfYWRkc191X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkcy51LncKKyAgICBtaXBzX2FkZHNjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHNjCisgICAgbWlwc19hZGR1X3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGR1LnBoCisgICAgbWlwc19hZGR1X3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGR1LnFiCisgICAgbWlwc19hZGR1X3NfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGR1LnMucGgKKyAgICBtaXBzX2FkZHVfc19xYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHUucy5xYgorICAgIG1pcHNfYWRkdWhfcWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkdWgucWIKKyAgICBtaXBzX2FkZHVoX3JfcWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHVoLnIucWIKKyAgICBtaXBzX2FkZHZfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHYuYgorICAgIG1pcHNfYWRkdl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkdi5kCisgICAgbWlwc19hZGR2X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGR2LmgKKyAgICBtaXBzX2FkZHZfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHYudworICAgIG1pcHNfYWRkdmlfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkdmkuYgorICAgIG1pcHNfYWRkdmlfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkdmkuZAorICAgIG1pcHNfYWRkdmlfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkdmkuaAorICAgIG1pcHNfYWRkdmlfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkdmkudworICAgIG1pcHNfYWRkd2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkd2MKKyAgICBtaXBzX2FuZF92LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFuZC52CisgICAgbWlwc19hbmRpX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hbmRpLmIKKyAgICBtaXBzX2FwcGVuZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFwcGVuZAorICAgIG1pcHNfYXN1Yl9zX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYXN1Yi5zLmIKKyAgICBtaXBzX2FzdWJfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFzdWIucy5kCisgICAgbWlwc19hc3ViX3NfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hc3ViLnMuaAorICAgIG1pcHNfYXN1Yl9zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYXN1Yi5zLncKKyAgICBtaXBzX2FzdWJfdV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFzdWIudS5iCisgICAgbWlwc19hc3ViX3VfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hc3ViLnUuZAorICAgIG1pcHNfYXN1Yl91X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYXN1Yi51LmgKKyAgICBtaXBzX2FzdWJfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFzdWIudS53CisgICAgbWlwc19hdmVfc19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hdmUucy5iCisgICAgbWlwc19hdmVfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hdmUucy5kCisgICAgbWlwc19hdmVfc19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hdmUucy5oCisgICAgbWlwc19hdmVfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hdmUucy53CisgICAgbWlwc19hdmVfdV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hdmUudS5iCisgICAgbWlwc19hdmVfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hdmUudS5kCisgICAgbWlwc19hdmVfdV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hdmUudS5oCisgICAgbWlwc19hdmVfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hdmUudS53CisgICAgbWlwc19hdmVyX3NfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hdmVyLnMuYgorICAgIG1pcHNfYXZlcl9zX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYXZlci5zLmQKKyAgICBtaXBzX2F2ZXJfc19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmF2ZXIucy5oCisgICAgbWlwc19hdmVyX3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hdmVyLnMudworICAgIG1pcHNfYXZlcl91X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYXZlci51LmIKKyAgICBtaXBzX2F2ZXJfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmF2ZXIudS5kCisgICAgbWlwc19hdmVyX3VfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hdmVyLnUuaAorICAgIG1pcHNfYXZlcl91X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYXZlci51LncKKyAgICBtaXBzX2JhbGlnbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJhbGlnbgorICAgIG1pcHNfYmNscl9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYmNsci5iCisgICAgbWlwc19iY2xyX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iY2xyLmQKKyAgICBtaXBzX2JjbHJfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJjbHIuaAorICAgIG1pcHNfYmNscl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYmNsci53CisgICAgbWlwc19iY2xyaV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iY2xyaS5iCisgICAgbWlwc19iY2xyaV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iY2xyaS5kCisgICAgbWlwc19iY2xyaV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iY2xyaS5oCisgICAgbWlwc19iY2xyaV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iY2xyaS53CisgICAgbWlwc19iaW5zbF9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iaW5zbC5iCisgICAgbWlwc19iaW5zbF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iaW5zbC5kCisgICAgbWlwc19iaW5zbF9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iaW5zbC5oCisgICAgbWlwc19iaW5zbF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iaW5zbC53CisgICAgbWlwc19iaW5zbGlfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iaW5zbGkuYgorICAgIG1pcHNfYmluc2xpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYmluc2xpLmQKKyAgICBtaXBzX2JpbnNsaV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJpbnNsaS5oCisgICAgbWlwc19iaW5zbGlfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iaW5zbGkudworICAgIG1pcHNfYmluc3JfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYmluc3IuYgorICAgIG1pcHNfYmluc3JfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYmluc3IuZAorICAgIG1pcHNfYmluc3JfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYmluc3IuaAorICAgIG1pcHNfYmluc3JfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYmluc3IudworICAgIG1pcHNfYmluc3JpX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYmluc3JpLmIKKyAgICBtaXBzX2JpbnNyaV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJpbnNyaS5kCisgICAgbWlwc19iaW5zcmlfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iaW5zcmkuaAorICAgIG1pcHNfYmluc3JpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYmluc3JpLncKKyAgICBtaXBzX2JpdHJldiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJpdHJldgorICAgIG1pcHNfYm1uel92LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYm1uei52CisgICAgbWlwc19ibW56aV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ibW56aS5iCisgICAgbWlwc19ibXpfdiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ibXoudgorICAgIG1pcHNfYm16aV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYm16aS5iCisgICAgbWlwc19ibmVnX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ibmVnLmIKKyAgICBtaXBzX2JuZWdfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJuZWcuZAorICAgIG1pcHNfYm5lZ19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYm5lZy5oCisgICAgbWlwc19ibmVnX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ibmVnLncKKyAgICBtaXBzX2JuZWdpX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJuZWdpLmIKKyAgICBtaXBzX2JuZWdpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJuZWdpLmQKKyAgICBtaXBzX2JuZWdpX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJuZWdpLmgKKyAgICBtaXBzX2JuZWdpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJuZWdpLncKKyAgICBtaXBzX2Juel9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJuei5iCisgICAgbWlwc19ibnpfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ibnouZAorICAgIG1pcHNfYm56X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYm56LmgKKyAgICBtaXBzX2Juel92LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJuei52CisgICAgbWlwc19ibnpfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ibnoudworICAgIG1pcHNfYnBvc2dlMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYnBvc2dlMzIKKyAgICBtaXBzX2JzZWxfdiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJzZWwudgorICAgIG1pcHNfYnNlbGlfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYnNlbGkuYgorICAgIG1pcHNfYnNldF9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYnNldC5iCisgICAgbWlwc19ic2V0X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ic2V0LmQKKyAgICBtaXBzX2JzZXRfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJzZXQuaAorICAgIG1pcHNfYnNldF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYnNldC53CisgICAgbWlwc19ic2V0aV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ic2V0aS5iCisgICAgbWlwc19ic2V0aV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ic2V0aS5kCisgICAgbWlwc19ic2V0aV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ic2V0aS5oCisgICAgbWlwc19ic2V0aV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ic2V0aS53CisgICAgbWlwc19iel9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iei5iCisgICAgbWlwc19iel9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iei5kCisgICAgbWlwc19iel9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iei5oCisgICAgbWlwc19iel92LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iei52CisgICAgbWlwc19iel93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iei53CisgICAgbWlwc19jZXFfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jZXEuYgorICAgIG1pcHNfY2VxX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2VxLmQKKyAgICBtaXBzX2NlcV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNlcS5oCisgICAgbWlwc19jZXFfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jZXEudworICAgIG1pcHNfY2VxaV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2VxaS5iCisgICAgbWlwc19jZXFpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jZXFpLmQKKyAgICBtaXBzX2NlcWlfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNlcWkuaAorICAgIG1pcHNfY2VxaV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2VxaS53CisgICAgbWlwc19jZmNtc2EsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jZmNtc2EKKyAgICBtaXBzX2NsZV9zX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsZS5zLmIKKyAgICBtaXBzX2NsZV9zX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsZS5zLmQKKyAgICBtaXBzX2NsZV9zX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsZS5zLmgKKyAgICBtaXBzX2NsZV9zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsZS5zLncKKyAgICBtaXBzX2NsZV91X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsZS51LmIKKyAgICBtaXBzX2NsZV91X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsZS51LmQKKyAgICBtaXBzX2NsZV91X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsZS51LmgKKyAgICBtaXBzX2NsZV91X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsZS51LncKKyAgICBtaXBzX2NsZWlfc19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsZWkucy5iCisgICAgbWlwc19jbGVpX3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbGVpLnMuZAorICAgIG1pcHNfY2xlaV9zX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2xlaS5zLmgKKyAgICBtaXBzX2NsZWlfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsZWkucy53CisgICAgbWlwc19jbGVpX3VfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbGVpLnUuYgorICAgIG1pcHNfY2xlaV91X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2xlaS51LmQKKyAgICBtaXBzX2NsZWlfdV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsZWkudS5oCisgICAgbWlwc19jbGVpX3VfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbGVpLnUudworICAgIG1pcHNfY2x0X3NfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2x0LnMuYgorICAgIG1pcHNfY2x0X3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2x0LnMuZAorICAgIG1pcHNfY2x0X3NfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2x0LnMuaAorICAgIG1pcHNfY2x0X3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2x0LnMudworICAgIG1pcHNfY2x0X3VfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2x0LnUuYgorICAgIG1pcHNfY2x0X3VfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2x0LnUuZAorICAgIG1pcHNfY2x0X3VfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2x0LnUuaAorICAgIG1pcHNfY2x0X3VfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2x0LnUudworICAgIG1pcHNfY2x0aV9zX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2x0aS5zLmIKKyAgICBtaXBzX2NsdGlfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsdGkucy5kCisgICAgbWlwc19jbHRpX3NfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbHRpLnMuaAorICAgIG1pcHNfY2x0aV9zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2x0aS5zLncKKyAgICBtaXBzX2NsdGlfdV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsdGkudS5iCisgICAgbWlwc19jbHRpX3VfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbHRpLnUuZAorICAgIG1pcHNfY2x0aV91X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2x0aS51LmgKKyAgICBtaXBzX2NsdGlfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsdGkudS53CisgICAgbWlwc19jbXBfZXFfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbXAuZXEucGgKKyAgICBtaXBzX2NtcF9sZV9waCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNtcC5sZS5waAorICAgIG1pcHNfY21wX2x0X3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY21wLmx0LnBoCisgICAgbWlwc19jbXBnZHVfZXFfcWIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbXBnZHUuZXEucWIKKyAgICBtaXBzX2NtcGdkdV9sZV9xYiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNtcGdkdS5sZS5xYgorICAgIG1pcHNfY21wZ2R1X2x0X3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY21wZ2R1Lmx0LnFiCisgICAgbWlwc19jbXBndV9lcV9xYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbXBndS5lcS5xYgorICAgIG1pcHNfY21wZ3VfbGVfcWIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY21wZ3UubGUucWIKKyAgICBtaXBzX2NtcGd1X2x0X3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNtcGd1Lmx0LnFiCisgICAgbWlwc19jbXB1X2VxX3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbXB1LmVxLnFiCisgICAgbWlwc19jbXB1X2xlX3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbXB1LmxlLnFiCisgICAgbWlwc19jbXB1X2x0X3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbXB1Lmx0LnFiCisgICAgbWlwc19jb3B5X3NfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jb3B5LnMuYgorICAgIG1pcHNfY29weV9zX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY29weS5zLmQKKyAgICBtaXBzX2NvcHlfc19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNvcHkucy5oCisgICAgbWlwc19jb3B5X3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jb3B5LnMudworICAgIG1pcHNfY29weV91X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY29weS51LmIKKyAgICBtaXBzX2NvcHlfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNvcHkudS5kCisgICAgbWlwc19jb3B5X3VfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jb3B5LnUuaAorICAgIG1pcHNfY29weV91X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY29weS51LncKKyAgICBtaXBzX2N0Y21zYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmN0Y21zYQorICAgIG1pcHNfZGl2X3NfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZGl2LnMuYgorICAgIG1pcHNfZGl2X3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZGl2LnMuZAorICAgIG1pcHNfZGl2X3NfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZGl2LnMuaAorICAgIG1pcHNfZGl2X3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZGl2LnMudworICAgIG1pcHNfZGl2X3VfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZGl2LnUuYgorICAgIG1pcHNfZGl2X3VfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZGl2LnUuZAorICAgIG1pcHNfZGl2X3VfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZGl2LnUuaAorICAgIG1pcHNfZGl2X3VfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZGl2LnUudworICAgIG1pcHNfZGxzYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZGxzYQorICAgIG1pcHNfZG90cF9zX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZG90cC5zLmQKKyAgICBtaXBzX2RvdHBfc19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRvdHAucy5oCisgICAgbWlwc19kb3RwX3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kb3RwLnMudworICAgIG1pcHNfZG90cF91X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZG90cC51LmQKKyAgICBtaXBzX2RvdHBfdV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRvdHAudS5oCisgICAgbWlwc19kb3RwX3VfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kb3RwLnUudworICAgIG1pcHNfZHBhX3dfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBhLncucGgKKyAgICBtaXBzX2RwYWRkX3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRwYWRkLnMuZAorICAgIG1pcHNfZHBhZGRfc19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBhZGQucy5oCisgICAgbWlwc19kcGFkZF9zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcGFkZC5zLncKKyAgICBtaXBzX2RwYWRkX3VfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRwYWRkLnUuZAorICAgIG1pcHNfZHBhZGRfdV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBhZGQudS5oCisgICAgbWlwc19kcGFkZF91X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcGFkZC51LncKKyAgICBtaXBzX2RwYXFfc193X3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRwYXEucy53LnBoCisgICAgbWlwc19kcGFxX3NhX2xfdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcGFxLnNhLmwudworICAgIG1pcHNfZHBhcXhfc193X3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBhcXgucy53LnBoCisgICAgbWlwc19kcGFxeF9zYV93X3BoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcGFxeC5zYS53LnBoCisgICAgbWlwc19kcGF1X2hfcWJsLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcGF1LmgucWJsCisgICAgbWlwc19kcGF1X2hfcWJyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcGF1LmgucWJyCisgICAgbWlwc19kcGF4X3dfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcGF4LncucGgKKyAgICBtaXBzX2Rwc193X3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRwcy53LnBoCisgICAgbWlwc19kcHNxX3Nfd19waCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcHNxLnMudy5waAorICAgIG1pcHNfZHBzcV9zYV9sX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBzcS5zYS5sLncKKyAgICBtaXBzX2Rwc3F4X3Nfd19waCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRwc3F4LnMudy5waAorICAgIG1pcHNfZHBzcXhfc2Ffd19waCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBzcXguc2Eudy5waAorICAgIG1pcHNfZHBzdV9oX3FibCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBzdS5oLnFibAorICAgIG1pcHNfZHBzdV9oX3FiciwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBzdS5oLnFicgorICAgIG1pcHNfZHBzdWJfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBzdWIucy5kCisgICAgbWlwc19kcHN1Yl9zX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcHN1Yi5zLmgKKyAgICBtaXBzX2Rwc3ViX3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRwc3ViLnMudworICAgIG1pcHNfZHBzdWJfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBzdWIudS5kCisgICAgbWlwc19kcHN1Yl91X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcHN1Yi51LmgKKyAgICBtaXBzX2Rwc3ViX3VfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRwc3ViLnUudworICAgIG1pcHNfZHBzeF93X3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBzeC53LnBoCisgICAgbWlwc19leHRwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5leHRwCisgICAgbWlwc19leHRwZHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5leHRwZHAKKyAgICBtaXBzX2V4dHJfcl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmV4dHIuci53CisgICAgbWlwc19leHRyX3JzX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5leHRyLnJzLncKKyAgICBtaXBzX2V4dHJfc19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmV4dHIucy5oCisgICAgbWlwc19leHRyX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5leHRyLncKKyAgICBtaXBzX2ZhZGRfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZhZGQuZAorICAgIG1pcHNfZmFkZF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmFkZC53CisgICAgbWlwc19mY2FmX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mY2FmLmQKKyAgICBtaXBzX2ZjYWZfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjYWYudworICAgIG1pcHNfZmNlcV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmNlcS5kCisgICAgbWlwc19mY2VxX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mY2VxLncKKyAgICBtaXBzX2ZjbGFzc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjbGFzcy5kCisgICAgbWlwc19mY2xhc3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mY2xhc3MudworICAgIG1pcHNfZmNsZV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmNsZS5kCisgICAgbWlwc19mY2xlX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mY2xlLncKKyAgICBtaXBzX2ZjbHRfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjbHQuZAorICAgIG1pcHNfZmNsdF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmNsdC53CisgICAgbWlwc19mY25lX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mY25lLmQKKyAgICBtaXBzX2ZjbmVfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjbmUudworICAgIG1pcHNfZmNvcl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmNvci5kCisgICAgbWlwc19mY29yX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mY29yLncKKyAgICBtaXBzX2ZjdWVxX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjdWVxLmQKKyAgICBtaXBzX2ZjdWVxX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjdWVxLncKKyAgICBtaXBzX2ZjdWxlX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjdWxlLmQKKyAgICBtaXBzX2ZjdWxlX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjdWxlLncKKyAgICBtaXBzX2ZjdWx0X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjdWx0LmQKKyAgICBtaXBzX2ZjdWx0X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjdWx0LncKKyAgICBtaXBzX2ZjdW5fZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjdW4uZAorICAgIG1pcHNfZmN1bl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmN1bi53CisgICAgbWlwc19mY3VuZV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mY3VuZS5kCisgICAgbWlwc19mY3VuZV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mY3VuZS53CisgICAgbWlwc19mZGl2X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mZGl2LmQKKyAgICBtaXBzX2ZkaXZfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZkaXYudworICAgIG1pcHNfZmV4ZG9faCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmV4ZG8uaAorICAgIG1pcHNfZmV4ZG9fdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmV4ZG8udworICAgIG1pcHNfZmV4cDJfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmV4cDIuZAorICAgIG1pcHNfZmV4cDJfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmV4cDIudworICAgIG1pcHNfZmV4dXBsX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmV4dXBsLmQKKyAgICBtaXBzX2ZleHVwbF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZleHVwbC53CisgICAgbWlwc19mZXh1cHJfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mZXh1cHIuZAorICAgIG1pcHNfZmV4dXByX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmV4dXByLncKKyAgICBtaXBzX2ZmaW50X3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZmaW50LnMuZAorICAgIG1pcHNfZmZpbnRfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmZpbnQucy53CisgICAgbWlwc19mZmludF91X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mZmludC51LmQKKyAgICBtaXBzX2ZmaW50X3VfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZmaW50LnUudworICAgIG1pcHNfZmZxbF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmZxbC5kCisgICAgbWlwc19mZnFsX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mZnFsLncKKyAgICBtaXBzX2ZmcXJfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZmcXIuZAorICAgIG1pcHNfZmZxcl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmZxci53CisgICAgbWlwc19maWxsX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5maWxsLmIKKyAgICBtaXBzX2ZpbGxfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZpbGwuZAorICAgIG1pcHNfZmlsbF9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmlsbC5oCisgICAgbWlwc19maWxsX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5maWxsLncKKyAgICBtaXBzX2Zsb2cyX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZsb2cyLmQKKyAgICBtaXBzX2Zsb2cyX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZsb2cyLncKKyAgICBtaXBzX2ZtYWRkX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZtYWRkLmQKKyAgICBtaXBzX2ZtYWRkX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZtYWRkLncKKyAgICBtaXBzX2ZtYXhfYV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZtYXguYS5kCisgICAgbWlwc19mbWF4X2FfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mbWF4LmEudworICAgIG1pcHNfZm1heF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZm1heC5kCisgICAgbWlwc19mbWF4X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mbWF4LncKKyAgICBtaXBzX2ZtaW5fYV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZtaW4uYS5kCisgICAgbWlwc19mbWluX2FfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mbWluLmEudworICAgIG1pcHNfZm1pbl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZm1pbi5kCisgICAgbWlwc19mbWluX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mbWluLncKKyAgICBtaXBzX2Ztc3ViX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZtc3ViLmQKKyAgICBtaXBzX2Ztc3ViX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZtc3ViLncKKyAgICBtaXBzX2ZtdWxfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZtdWwuZAorICAgIG1pcHNfZm11bF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZm11bC53CisgICAgbWlwc19mcmNwX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mcmNwLmQKKyAgICBtaXBzX2ZyY3BfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZyY3AudworICAgIG1pcHNfZnJpbnRfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnJpbnQuZAorICAgIG1pcHNfZnJpbnRfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnJpbnQudworICAgIG1pcHNfZnJzcXJ0X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnJzcXJ0LmQKKyAgICBtaXBzX2Zyc3FydF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZyc3FydC53CisgICAgbWlwc19mc2FmX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc2FmLmQKKyAgICBtaXBzX2ZzYWZfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZzYWYudworICAgIG1pcHNfZnNlcV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnNlcS5kCisgICAgbWlwc19mc2VxX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc2VxLncKKyAgICBtaXBzX2ZzbGVfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZzbGUuZAorICAgIG1pcHNfZnNsZV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnNsZS53CisgICAgbWlwc19mc2x0X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc2x0LmQKKyAgICBtaXBzX2ZzbHRfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZzbHQudworICAgIG1pcHNfZnNuZV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnNuZS5kCisgICAgbWlwc19mc25lX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc25lLncKKyAgICBtaXBzX2Zzb3JfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZzb3IuZAorICAgIG1pcHNfZnNvcl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnNvci53CisgICAgbWlwc19mc3FydF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc3FydC5kCisgICAgbWlwc19mc3FydF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc3FydC53CisgICAgbWlwc19mc3ViX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc3ViLmQKKyAgICBtaXBzX2ZzdWJfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZzdWIudworICAgIG1pcHNfZnN1ZXFfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnN1ZXEuZAorICAgIG1pcHNfZnN1ZXFfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnN1ZXEudworICAgIG1pcHNfZnN1bGVfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnN1bGUuZAorICAgIG1pcHNfZnN1bGVfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnN1bGUudworICAgIG1pcHNfZnN1bHRfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnN1bHQuZAorICAgIG1pcHNfZnN1bHRfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnN1bHQudworICAgIG1pcHNfZnN1bl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnN1bi5kCisgICAgbWlwc19mc3VuX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc3VuLncKKyAgICBtaXBzX2ZzdW5lX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZzdW5lLmQKKyAgICBtaXBzX2ZzdW5lX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZzdW5lLncKKyAgICBtaXBzX2Z0aW50X3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZ0aW50LnMuZAorICAgIG1pcHNfZnRpbnRfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnRpbnQucy53CisgICAgbWlwc19mdGludF91X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mdGludC51LmQKKyAgICBtaXBzX2Z0aW50X3VfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZ0aW50LnUudworICAgIG1pcHNfZnRxX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnRxLmgKKyAgICBtaXBzX2Z0cV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZ0cS53CisgICAgbWlwc19mdHJ1bmNfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mdHJ1bmMucy5kCisgICAgbWlwc19mdHJ1bmNfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mdHJ1bmMucy53CisgICAgbWlwc19mdHJ1bmNfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mdHJ1bmMudS5kCisgICAgbWlwc19mdHJ1bmNfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mdHJ1bmMudS53CisgICAgbWlwc19oYWRkX3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5oYWRkLnMuZAorICAgIG1pcHNfaGFkZF9zX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaGFkZC5zLmgKKyAgICBtaXBzX2hhZGRfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmhhZGQucy53CisgICAgbWlwc19oYWRkX3VfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5oYWRkLnUuZAorICAgIG1pcHNfaGFkZF91X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaGFkZC51LmgKKyAgICBtaXBzX2hhZGRfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmhhZGQudS53CisgICAgbWlwc19oc3ViX3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5oc3ViLnMuZAorICAgIG1pcHNfaHN1Yl9zX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaHN1Yi5zLmgKKyAgICBtaXBzX2hzdWJfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmhzdWIucy53CisgICAgbWlwc19oc3ViX3VfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5oc3ViLnUuZAorICAgIG1pcHNfaHN1Yl91X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaHN1Yi51LmgKKyAgICBtaXBzX2hzdWJfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmhzdWIudS53CisgICAgbWlwc19pbHZldl9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5pbHZldi5iCisgICAgbWlwc19pbHZldl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5pbHZldi5kCisgICAgbWlwc19pbHZldl9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5pbHZldi5oCisgICAgbWlwc19pbHZldl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5pbHZldi53CisgICAgbWlwc19pbHZsX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5pbHZsLmIKKyAgICBtaXBzX2lsdmxfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmlsdmwuZAorICAgIG1pcHNfaWx2bF9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaWx2bC5oCisgICAgbWlwc19pbHZsX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5pbHZsLncKKyAgICBtaXBzX2lsdm9kX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmlsdm9kLmIKKyAgICBtaXBzX2lsdm9kX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmlsdm9kLmQKKyAgICBtaXBzX2lsdm9kX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmlsdm9kLmgKKyAgICBtaXBzX2lsdm9kX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmlsdm9kLncKKyAgICBtaXBzX2lsdnJfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmlsdnIuYgorICAgIG1pcHNfaWx2cl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaWx2ci5kCisgICAgbWlwc19pbHZyX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5pbHZyLmgKKyAgICBtaXBzX2lsdnJfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmlsdnIudworICAgIG1pcHNfaW5zZXJ0X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaW5zZXJ0LmIKKyAgICBtaXBzX2luc2VydF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmluc2VydC5kCisgICAgbWlwc19pbnNlcnRfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5pbnNlcnQuaAorICAgIG1pcHNfaW5zZXJ0X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaW5zZXJ0LncKKyAgICBtaXBzX2luc3YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmluc3YKKyAgICBtaXBzX2luc3ZlX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmluc3ZlLmIKKyAgICBtaXBzX2luc3ZlX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmluc3ZlLmQKKyAgICBtaXBzX2luc3ZlX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmluc3ZlLmgKKyAgICBtaXBzX2luc3ZlX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmluc3ZlLncKKyAgICBtaXBzX2xidXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmxidXgKKyAgICBtaXBzX2xkX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmxkLmIKKyAgICBtaXBzX2xkX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmxkLmQKKyAgICBtaXBzX2xkX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmxkLmgKKyAgICBtaXBzX2xkX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmxkLncKKyAgICBtaXBzX2xkaV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmxkaS5iCisgICAgbWlwc19sZGlfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5sZGkuZAorICAgIG1pcHNfbGRpX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubGRpLmgKKyAgICBtaXBzX2xkaV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmxkaS53CisgICAgbWlwc19saHgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5saHgKKyAgICBtaXBzX2xzYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmxzYQorICAgIG1pcHNfbHd4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubHd4CisgICAgbWlwc19tYWRkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYWRkCisgICAgbWlwc19tYWRkX3FfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYWRkLnEuaAorICAgIG1pcHNfbWFkZF9xX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWFkZC5xLncKKyAgICBtaXBzX21hZGRyX3FfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1hZGRyLnEuaAorICAgIG1pcHNfbWFkZHJfcV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWFkZHIucS53CisgICAgbWlwc19tYWRkdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYWRkdQorICAgIG1pcHNfbWFkZHZfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWFkZHYuYgorICAgIG1pcHNfbWFkZHZfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWFkZHYuZAorICAgIG1pcHNfbWFkZHZfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWFkZHYuaAorICAgIG1pcHNfbWFkZHZfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWFkZHYudworICAgIG1pcHNfbWFxX3Nfd19waGwsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWFxLnMudy5waGwKKyAgICBtaXBzX21hcV9zX3dfcGhyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1hcS5zLncucGhyCisgICAgbWlwc19tYXFfc2Ffd19waGwsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXEuc2Eudy5waGwKKyAgICBtaXBzX21hcV9zYV93X3BociwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1hcS5zYS53LnBocgorICAgIG1pcHNfbWF4X2FfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4LmEuYgorICAgIG1pcHNfbWF4X2FfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4LmEuZAorICAgIG1pcHNfbWF4X2FfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4LmEuaAorICAgIG1pcHNfbWF4X2FfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4LmEudworICAgIG1pcHNfbWF4X3NfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4LnMuYgorICAgIG1pcHNfbWF4X3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4LnMuZAorICAgIG1pcHNfbWF4X3NfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4LnMuaAorICAgIG1pcHNfbWF4X3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4LnMudworICAgIG1pcHNfbWF4X3VfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4LnUuYgorICAgIG1pcHNfbWF4X3VfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4LnUuZAorICAgIG1pcHNfbWF4X3VfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4LnUuaAorICAgIG1pcHNfbWF4X3VfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4LnUudworICAgIG1pcHNfbWF4aV9zX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4aS5zLmIKKyAgICBtaXBzX21heGlfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1heGkucy5kCisgICAgbWlwc19tYXhpX3NfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXhpLnMuaAorICAgIG1pcHNfbWF4aV9zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4aS5zLncKKyAgICBtaXBzX21heGlfdV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1heGkudS5iCisgICAgbWlwc19tYXhpX3VfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXhpLnUuZAorICAgIG1pcHNfbWF4aV91X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4aS51LmgKKyAgICBtaXBzX21heGlfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1heGkudS53CisgICAgbWlwc19taW5fYV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW4uYS5iCisgICAgbWlwc19taW5fYV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW4uYS5kCisgICAgbWlwc19taW5fYV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW4uYS5oCisgICAgbWlwc19taW5fYV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW4uYS53CisgICAgbWlwc19taW5fc19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW4ucy5iCisgICAgbWlwc19taW5fc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW4ucy5kCisgICAgbWlwc19taW5fc19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW4ucy5oCisgICAgbWlwc19taW5fc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW4ucy53CisgICAgbWlwc19taW5fdV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW4udS5iCisgICAgbWlwc19taW5fdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW4udS5kCisgICAgbWlwc19taW5fdV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW4udS5oCisgICAgbWlwc19taW5fdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW4udS53CisgICAgbWlwc19taW5pX3NfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW5pLnMuYgorICAgIG1pcHNfbWluaV9zX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWluaS5zLmQKKyAgICBtaXBzX21pbmlfc19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1pbmkucy5oCisgICAgbWlwc19taW5pX3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW5pLnMudworICAgIG1pcHNfbWluaV91X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWluaS51LmIKKyAgICBtaXBzX21pbmlfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1pbmkudS5kCisgICAgbWlwc19taW5pX3VfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW5pLnUuaAorICAgIG1pcHNfbWluaV91X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWluaS51LncKKyAgICBtaXBzX21vZF9zX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1vZC5zLmIKKyAgICBtaXBzX21vZF9zX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1vZC5zLmQKKyAgICBtaXBzX21vZF9zX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1vZC5zLmgKKyAgICBtaXBzX21vZF9zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1vZC5zLncKKyAgICBtaXBzX21vZF91X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1vZC51LmIKKyAgICBtaXBzX21vZF91X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1vZC51LmQKKyAgICBtaXBzX21vZF91X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1vZC51LmgKKyAgICBtaXBzX21vZF91X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1vZC51LncKKyAgICBtaXBzX21vZHN1YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1vZHN1YgorICAgIG1pcHNfbW92ZV92LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubW92ZS52CisgICAgbWlwc19tc3ViLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tc3ViCisgICAgbWlwc19tc3ViX3FfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tc3ViLnEuaAorICAgIG1pcHNfbXN1Yl9xX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXN1Yi5xLncKKyAgICBtaXBzX21zdWJyX3FfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1zdWJyLnEuaAorICAgIG1pcHNfbXN1YnJfcV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXN1YnIucS53CisgICAgbWlwc19tc3VidSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tc3VidQorICAgIG1pcHNfbXN1YnZfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXN1YnYuYgorICAgIG1pcHNfbXN1YnZfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXN1YnYuZAorICAgIG1pcHNfbXN1YnZfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXN1YnYuaAorICAgIG1pcHNfbXN1YnZfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXN1YnYudworICAgIG1pcHNfbXRobGlwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXRobGlwCisgICAgbWlwc19tdWxfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tdWwucGgKKyAgICBtaXBzX211bF9xX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm11bC5xLmgKKyAgICBtaXBzX211bF9xX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm11bC5xLncKKyAgICBtaXBzX211bF9zX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm11bC5zLnBoCisgICAgbWlwc19tdWxlcV9zX3dfcGhsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tdWxlcS5zLncucGhsCisgICAgbWlwc19tdWxlcV9zX3dfcGhyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tdWxlcS5zLncucGhyCisgICAgbWlwc19tdWxldV9zX3BoX3FibCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tdWxldS5zLnBoLnFibAorICAgIG1pcHNfbXVsZXVfc19waF9xYnIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXVsZXUucy5waC5xYnIKKyAgICBtaXBzX211bHFfcnNfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm11bHEucnMucGgKKyAgICBtaXBzX211bHFfcnNfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm11bHEucnMudworICAgIG1pcHNfbXVscV9zX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXVscS5zLnBoCisgICAgbWlwc19tdWxxX3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tdWxxLnMudworICAgIG1pcHNfbXVscl9xX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXVsci5xLmgKKyAgICBtaXBzX211bHJfcV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm11bHIucS53CisgICAgbWlwc19tdWxzYV93X3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tdWxzYS53LnBoCisgICAgbWlwc19tdWxzYXFfc193X3BoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tdWxzYXEucy53LnBoCisgICAgbWlwc19tdWx0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tdWx0CisgICAgbWlwc19tdWx0dSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tdWx0dQorICAgIG1pcHNfbXVsdl9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXVsdi5iCisgICAgbWlwc19tdWx2X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tdWx2LmQKKyAgICBtaXBzX211bHZfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm11bHYuaAorICAgIG1pcHNfbXVsdl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXVsdi53CisgICAgbWlwc19ubG9jX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ubG9jLmIKKyAgICBtaXBzX25sb2NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm5sb2MuZAorICAgIG1pcHNfbmxvY19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubmxvYy5oCisgICAgbWlwc19ubG9jX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ubG9jLncKKyAgICBtaXBzX25semNfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm5semMuYgorICAgIG1pcHNfbmx6Y19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubmx6Yy5kCisgICAgbWlwc19ubHpjX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ubHpjLmgKKyAgICBtaXBzX25semNfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm5semMudworICAgIG1pcHNfbm9yX3YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubm9yLnYKKyAgICBtaXBzX25vcmlfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm5vcmkuYgorICAgIG1pcHNfb3JfdiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMub3IudgorICAgIG1pcHNfb3JpX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMub3JpLmIKKyAgICBtaXBzX3BhY2tybF9waCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnBhY2tybC5waAorICAgIG1pcHNfcGNrZXZfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucGNrZXYuYgorICAgIG1pcHNfcGNrZXZfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucGNrZXYuZAorICAgIG1pcHNfcGNrZXZfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucGNrZXYuaAorICAgIG1pcHNfcGNrZXZfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucGNrZXYudworICAgIG1pcHNfcGNrb2RfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucGNrb2QuYgorICAgIG1pcHNfcGNrb2RfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucGNrb2QuZAorICAgIG1pcHNfcGNrb2RfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucGNrb2QuaAorICAgIG1pcHNfcGNrb2RfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucGNrb2QudworICAgIG1pcHNfcGNudF9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucGNudC5iCisgICAgbWlwc19wY250X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wY250LmQKKyAgICBtaXBzX3BjbnRfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnBjbnQuaAorICAgIG1pcHNfcGNudF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucGNudC53CisgICAgbWlwc19waWNrX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5waWNrLnBoCisgICAgbWlwc19waWNrX3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5waWNrLnFiCisgICAgbWlwc19wcmVjZXFfd19waGwsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wcmVjZXEudy5waGwKKyAgICBtaXBzX3ByZWNlcV93X3BociwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnByZWNlcS53LnBocgorICAgIG1pcHNfcHJlY2VxdV9waF9xYmwsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucHJlY2VxdS5waC5xYmwKKyAgICBtaXBzX3ByZWNlcXVfcGhfcWJsYSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnByZWNlcXUucGgucWJsYQorICAgIG1pcHNfcHJlY2VxdV9waF9xYnIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucHJlY2VxdS5waC5xYnIKKyAgICBtaXBzX3ByZWNlcXVfcGhfcWJyYSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnByZWNlcXUucGgucWJyYQorICAgIG1pcHNfcHJlY2V1X3BoX3FibCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucHJlY2V1LnBoLnFibAorICAgIG1pcHNfcHJlY2V1X3BoX3FibGEsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucHJlY2V1LnBoLnFibGEKKyAgICBtaXBzX3ByZWNldV9waF9xYnIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnByZWNldS5waC5xYnIKKyAgICBtaXBzX3ByZWNldV9waF9xYnJhLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnByZWNldS5waC5xYnJhCisgICAgbWlwc19wcmVjcl9xYl9waCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wcmVjci5xYi5waAorICAgIG1pcHNfcHJlY3Jfc3JhX3BoX3csICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucHJlY3Iuc3JhLnBoLncKKyAgICBtaXBzX3ByZWNyX3NyYV9yX3BoX3csICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnByZWNyLnNyYS5yLnBoLncKKyAgICBtaXBzX3ByZWNycV9waF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnByZWNycS5waC53CisgICAgbWlwc19wcmVjcnFfcWJfcGgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wcmVjcnEucWIucGgKKyAgICBtaXBzX3ByZWNycV9yc19waF93LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnByZWNycS5ycy5waC53CisgICAgbWlwc19wcmVjcnF1X3NfcWJfcGgsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wcmVjcnF1LnMucWIucGgKKyAgICBtaXBzX3ByZXBlbmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnByZXBlbmQKKyAgICBtaXBzX3JhZGR1X3dfcWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnJhZGR1LncucWIKKyAgICBtaXBzX3JkZHNwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnJkZHNwCisgICAgbWlwc19yZXBsX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5yZXBsLnBoCisgICAgbWlwc19yZXBsX3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5yZXBsLnFiCisgICAgbWlwc19zYXRfc19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zYXQucy5iCisgICAgbWlwc19zYXRfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zYXQucy5kCisgICAgbWlwc19zYXRfc19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zYXQucy5oCisgICAgbWlwc19zYXRfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zYXQucy53CisgICAgbWlwc19zYXRfdV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zYXQudS5iCisgICAgbWlwc19zYXRfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zYXQudS5kCisgICAgbWlwc19zYXRfdV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zYXQudS5oCisgICAgbWlwc19zYXRfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zYXQudS53CisgICAgbWlwc19zaGZfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zaGYuYgorICAgIG1pcHNfc2hmX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2hmLmgKKyAgICBtaXBzX3NoZl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNoZi53CisgICAgbWlwc19zaGlsbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zaGlsbworICAgIG1pcHNfc2hsbF9waCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2hsbC5waAorICAgIG1pcHNfc2hsbF9xYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2hsbC5xYgorICAgIG1pcHNfc2hsbF9zX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2hsbC5zLnBoCisgICAgbWlwc19zaGxsX3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zaGxsLnMudworICAgIG1pcHNfc2hyYV9waCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2hyYS5waAorICAgIG1pcHNfc2hyYV9xYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2hyYS5xYgorICAgIG1pcHNfc2hyYV9yX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2hyYS5yLnBoCisgICAgbWlwc19zaHJhX3JfcWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zaHJhLnIucWIKKyAgICBtaXBzX3NocmFfcl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNocmEuci53CisgICAgbWlwc19zaHJsX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zaHJsLnBoCisgICAgbWlwc19zaHJsX3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zaHJsLnFiCisgICAgbWlwc19zbGRfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zbGQuYgorICAgIG1pcHNfc2xkX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2xkLmQKKyAgICBtaXBzX3NsZF9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNsZC5oCisgICAgbWlwc19zbGRfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zbGQudworICAgIG1pcHNfc2xkaV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2xkaS5iCisgICAgbWlwc19zbGRpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zbGRpLmQKKyAgICBtaXBzX3NsZGlfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNsZGkuaAorICAgIG1pcHNfc2xkaV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2xkaS53CisgICAgbWlwc19zbGxfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zbGwuYgorICAgIG1pcHNfc2xsX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2xsLmQKKyAgICBtaXBzX3NsbF9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNsbC5oCisgICAgbWlwc19zbGxfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zbGwudworICAgIG1pcHNfc2xsaV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2xsaS5iCisgICAgbWlwc19zbGxpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zbGxpLmQKKyAgICBtaXBzX3NsbGlfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNsbGkuaAorICAgIG1pcHNfc2xsaV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2xsaS53CisgICAgbWlwc19zcGxhdF9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcGxhdC5iCisgICAgbWlwc19zcGxhdF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcGxhdC5kCisgICAgbWlwc19zcGxhdF9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcGxhdC5oCisgICAgbWlwc19zcGxhdF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcGxhdC53CisgICAgbWlwc19zcGxhdGlfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcGxhdGkuYgorICAgIG1pcHNfc3BsYXRpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3BsYXRpLmQKKyAgICBtaXBzX3NwbGF0aV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNwbGF0aS5oCisgICAgbWlwc19zcGxhdGlfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcGxhdGkudworICAgIG1pcHNfc3JhX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3JhLmIKKyAgICBtaXBzX3NyYV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNyYS5kCisgICAgbWlwc19zcmFfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmEuaAorICAgIG1pcHNfc3JhX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3JhLncKKyAgICBtaXBzX3NyYWlfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNyYWkuYgorICAgIG1pcHNfc3JhaV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3JhaS5kCisgICAgbWlwc19zcmFpX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmFpLmgKKyAgICBtaXBzX3NyYWlfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNyYWkudworICAgIG1pcHNfc3Jhcl9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Jhci5iCisgICAgbWlwc19zcmFyX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmFyLmQKKyAgICBtaXBzX3NyYXJfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNyYXIuaAorICAgIG1pcHNfc3Jhcl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Jhci53CisgICAgbWlwc19zcmFyaV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmFyaS5iCisgICAgbWlwc19zcmFyaV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmFyaS5kCisgICAgbWlwc19zcmFyaV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmFyaS5oCisgICAgbWlwc19zcmFyaV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmFyaS53CisgICAgbWlwc19zcmxfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmwuYgorICAgIG1pcHNfc3JsX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3JsLmQKKyAgICBtaXBzX3NybF9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNybC5oCisgICAgbWlwc19zcmxfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmwudworICAgIG1pcHNfc3JsaV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3JsaS5iCisgICAgbWlwc19zcmxpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmxpLmQKKyAgICBtaXBzX3NybGlfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNybGkuaAorICAgIG1pcHNfc3JsaV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3JsaS53CisgICAgbWlwc19zcmxyX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmxyLmIKKyAgICBtaXBzX3NybHJfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNybHIuZAorICAgIG1pcHNfc3Jscl9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Jsci5oCisgICAgbWlwc19zcmxyX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmxyLncKKyAgICBtaXBzX3NybHJpX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNybHJpLmIKKyAgICBtaXBzX3NybHJpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNybHJpLmQKKyAgICBtaXBzX3NybHJpX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNybHJpLmgKKyAgICBtaXBzX3NybHJpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNybHJpLncKKyAgICBtaXBzX3N0X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN0LmIKKyAgICBtaXBzX3N0X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN0LmQKKyAgICBtaXBzX3N0X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN0LmgKKyAgICBtaXBzX3N0X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN0LncKKyAgICBtaXBzX3N1YnFfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnEucGgKKyAgICBtaXBzX3N1YnFfc19waCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnEucy5waAorICAgIG1pcHNfc3VicV9zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3VicS5zLncKKyAgICBtaXBzX3N1YnFoX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnFoLnBoCisgICAgbWlwc19zdWJxaF9yX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJxaC5yLnBoCisgICAgbWlwc19zdWJxaF9yX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJxaC5yLncKKyAgICBtaXBzX3N1YnFoX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnFoLncKKyAgICBtaXBzX3N1YnNfc19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnMucy5iCisgICAgbWlwc19zdWJzX3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJzLnMuZAorICAgIG1pcHNfc3Vic19zX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Vicy5zLmgKKyAgICBtaXBzX3N1YnNfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnMucy53CisgICAgbWlwc19zdWJzX3VfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJzLnUuYgorICAgIG1pcHNfc3Vic191X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Vicy51LmQKKyAgICBtaXBzX3N1YnNfdV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnMudS5oCisgICAgbWlwc19zdWJzX3VfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJzLnUudworICAgIG1pcHNfc3Vic3VzX3VfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Vic3VzLnUuYgorICAgIG1pcHNfc3Vic3VzX3VfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Vic3VzLnUuZAorICAgIG1pcHNfc3Vic3VzX3VfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Vic3VzLnUuaAorICAgIG1pcHNfc3Vic3VzX3VfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Vic3VzLnUudworICAgIG1pcHNfc3Vic3V1X3NfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Vic3V1LnMuYgorICAgIG1pcHNfc3Vic3V1X3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Vic3V1LnMuZAorICAgIG1pcHNfc3Vic3V1X3NfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Vic3V1LnMuaAorICAgIG1pcHNfc3Vic3V1X3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Vic3V1LnMudworICAgIG1pcHNfc3VidV9waCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3VidS5waAorICAgIG1pcHNfc3VidV9xYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3VidS5xYgorICAgIG1pcHNfc3VidV9zX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3VidS5zLnBoCisgICAgbWlwc19zdWJ1X3NfcWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJ1LnMucWIKKyAgICBtaXBzX3N1YnVoX3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnVoLnFiCisgICAgbWlwc19zdWJ1aF9yX3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJ1aC5yLnFiCisgICAgbWlwc19zdWJ2X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJ2LmIKKyAgICBtaXBzX3N1YnZfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnYuZAorICAgIG1pcHNfc3Vidl9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Vidi5oCisgICAgbWlwc19zdWJ2X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJ2LncKKyAgICBtaXBzX3N1YnZpX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnZpLmIKKyAgICBtaXBzX3N1YnZpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnZpLmQKKyAgICBtaXBzX3N1YnZpX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnZpLmgKKyAgICBtaXBzX3N1YnZpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnZpLncKKyAgICBtaXBzX3ZzaGZfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnZzaGYuYgorICAgIG1pcHNfdnNoZl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMudnNoZi5kCisgICAgbWlwc192c2hmX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy52c2hmLmgKKyAgICBtaXBzX3ZzaGZfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnZzaGYudworICAgIG1pcHNfd3Jkc3AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMud3Jkc3AKKyAgICBtaXBzX3hvcl92LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnhvci52CisgICAgbWlwc194b3JpX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy54b3JpLmIKKyAgICBudnZtX2FkZF9ybV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmFkZC5ybS5kCisgICAgbnZ2bV9hZGRfcm1fZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hZGQucm0uZgorICAgIG52dm1fYWRkX3JtX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYWRkLnJtLmZ0ei5mCisgICAgbnZ2bV9hZGRfcm5fZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hZGQucm4uZAorICAgIG52dm1fYWRkX3JuX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYWRkLnJuLmYKKyAgICBudnZtX2FkZF9ybl9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmFkZC5ybi5mdHouZgorICAgIG52dm1fYWRkX3JwX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYWRkLnJwLmQKKyAgICBudnZtX2FkZF9ycF9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmFkZC5ycC5mCisgICAgbnZ2bV9hZGRfcnBfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hZGQucnAuZnR6LmYKKyAgICBudnZtX2FkZF9yel9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmFkZC5yei5kCisgICAgbnZ2bV9hZGRfcnpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hZGQucnouZgorICAgIG52dm1fYWRkX3J6X2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYWRkLnJ6LmZ0ei5mCisgICAgbnZ2bV9hdG9taWNfYWRkX2dlbl9mX2N0YSwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMuYWRkLmdlbi5mLmN0YQorICAgIG52dm1fYXRvbWljX2FkZF9nZW5fZl9zeXMsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYXRvbWljLmFkZC5nZW4uZi5zeXMKKyAgICBudnZtX2F0b21pY19hZGRfZ2VuX2lfY3RhLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmF0b21pYy5hZGQuZ2VuLmkuY3RhCisgICAgbnZ2bV9hdG9taWNfYWRkX2dlbl9pX3N5cywgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMuYWRkLmdlbi5pLnN5cworICAgIG52dm1fYXRvbWljX2FuZF9nZW5faV9jdGEsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYXRvbWljLmFuZC5nZW4uaS5jdGEKKyAgICBudnZtX2F0b21pY19hbmRfZ2VuX2lfc3lzLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmF0b21pYy5hbmQuZ2VuLmkuc3lzCisgICAgbnZ2bV9hdG9taWNfY2FzX2dlbl9pX2N0YSwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMuY2FzLmdlbi5pLmN0YQorICAgIG52dm1fYXRvbWljX2Nhc19nZW5faV9zeXMsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYXRvbWljLmNhcy5nZW4uaS5zeXMKKyAgICBudnZtX2F0b21pY19kZWNfZ2VuX2lfY3RhLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmF0b21pYy5kZWMuZ2VuLmkuY3RhCisgICAgbnZ2bV9hdG9taWNfZGVjX2dlbl9pX3N5cywgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMuZGVjLmdlbi5pLnN5cworICAgIG52dm1fYXRvbWljX2V4Y2hfZ2VuX2lfY3RhLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYXRvbWljLmV4Y2guZ2VuLmkuY3RhCisgICAgbnZ2bV9hdG9taWNfZXhjaF9nZW5faV9zeXMsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMuZXhjaC5nZW4uaS5zeXMKKyAgICBudnZtX2F0b21pY19pbmNfZ2VuX2lfY3RhLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmF0b21pYy5pbmMuZ2VuLmkuY3RhCisgICAgbnZ2bV9hdG9taWNfaW5jX2dlbl9pX3N5cywgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMuaW5jLmdlbi5pLnN5cworICAgIG52dm1fYXRvbWljX2xvYWRfYWRkX2YzMiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYXRvbWljLmxvYWQuYWRkLmYzMgorICAgIG52dm1fYXRvbWljX2xvYWRfYWRkX2Y2NCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYXRvbWljLmxvYWQuYWRkLmY2NAorICAgIG52dm1fYXRvbWljX2xvYWRfZGVjXzMyLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYXRvbWljLmxvYWQuZGVjLjMyCisgICAgbnZ2bV9hdG9taWNfbG9hZF9pbmNfMzIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMubG9hZC5pbmMuMzIKKyAgICBudnZtX2F0b21pY19tYXhfZ2VuX2lfY3RhLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmF0b21pYy5tYXguZ2VuLmkuY3RhCisgICAgbnZ2bV9hdG9taWNfbWF4X2dlbl9pX3N5cywgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMubWF4Lmdlbi5pLnN5cworICAgIG52dm1fYXRvbWljX21pbl9nZW5faV9jdGEsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYXRvbWljLm1pbi5nZW4uaS5jdGEKKyAgICBudnZtX2F0b21pY19taW5fZ2VuX2lfc3lzLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmF0b21pYy5taW4uZ2VuLmkuc3lzCisgICAgbnZ2bV9hdG9taWNfb3JfZ2VuX2lfY3RhLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMub3IuZ2VuLmkuY3RhCisgICAgbnZ2bV9hdG9taWNfb3JfZ2VuX2lfc3lzLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMub3IuZ2VuLmkuc3lzCisgICAgbnZ2bV9hdG9taWNfeG9yX2dlbl9pX2N0YSwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMueG9yLmdlbi5pLmN0YQorICAgIG52dm1fYXRvbWljX3hvcl9nZW5faV9zeXMsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYXRvbWljLnhvci5nZW4uaS5zeXMKKyAgICBudnZtX2Jhcl9zeW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmJhci5zeW5jCisgICAgbnZ2bV9iYXJfd2FycF9zeW5jLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5iYXIud2FycC5zeW5jCisgICAgbnZ2bV9iYXJyaWVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5iYXJyaWVyCisgICAgbnZ2bV9iYXJyaWVyX24sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5iYXJyaWVyLm4KKyAgICBudnZtX2JhcnJpZXJfc3luYywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmJhcnJpZXIuc3luYworICAgIG52dm1fYmFycmllcl9zeW5jX2NudCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYmFycmllci5zeW5jLmNudAorICAgIG52dm1fYmFycmllcjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYmFycmllcjAKKyAgICBudnZtX2JhcnJpZXIwX2FuZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmJhcnJpZXIwLmFuZAorICAgIG52dm1fYmFycmllcjBfb3IsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYmFycmllcjAub3IKKyAgICBudnZtX2JhcnJpZXIwX3BvcGMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmJhcnJpZXIwLnBvcGMKKyAgICBudnZtX2JpdGNhc3RfZDJsbCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmJpdGNhc3QuZDJsbAorICAgIG52dm1fYml0Y2FzdF9mMmksICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYml0Y2FzdC5mMmkKKyAgICBudnZtX2JpdGNhc3RfaTJmLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmJpdGNhc3QuaTJmCisgICAgbnZ2bV9iaXRjYXN0X2xsMmQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5iaXRjYXN0LmxsMmQKKyAgICBudnZtX2NlaWxfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmNlaWwuZAorICAgIG52dm1fY2VpbF9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uY2VpbC5mCisgICAgbnZ2bV9jZWlsX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5jZWlsLmZ0ei5mCisgICAgbnZ2bV9jb21waWxlcl9lcnJvciwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5jb21waWxlci5lcnJvcgorICAgIG52dm1fY29tcGlsZXJfd2FybiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uY29tcGlsZXIud2FybgorICAgIG52dm1fY29zX2FwcHJveF9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uY29zLmFwcHJveC5mCisgICAgbnZ2bV9jb3NfYXBwcm94X2Z0el9mLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5jb3MuYXBwcm94LmZ0ei5mCisgICAgbnZ2bV9kMmZfcm0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kMmYucm0KKyAgICBudnZtX2QyZl9ybV9mdHosICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQyZi5ybS5mdHoKKyAgICBudnZtX2QyZl9ybiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQyZi5ybgorICAgIG52dm1fZDJmX3JuX2Z0eiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJmLnJuLmZ0egorICAgIG52dm1fZDJmX3JwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJmLnJwCisgICAgbnZ2bV9kMmZfcnBfZnR6LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kMmYucnAuZnR6CisgICAgbnZ2bV9kMmZfcnosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kMmYucnoKKyAgICBudnZtX2QyZl9yel9mdHosICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQyZi5yei5mdHoKKyAgICBudnZtX2QyaV9oaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQyaS5oaQorICAgIG52dm1fZDJpX2xvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJpLmxvCisgICAgbnZ2bV9kMmlfcm0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kMmkucm0KKyAgICBudnZtX2QyaV9ybiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQyaS5ybgorICAgIG52dm1fZDJpX3JwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJpLnJwCisgICAgbnZ2bV9kMmlfcnosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kMmkucnoKKyAgICBudnZtX2QybGxfcm0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQybGwucm0KKyAgICBudnZtX2QybGxfcm4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQybGwucm4KKyAgICBudnZtX2QybGxfcnAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQybGwucnAKKyAgICBudnZtX2QybGxfcnosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQybGwucnoKKyAgICBudnZtX2QydWlfcm0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQydWkucm0KKyAgICBudnZtX2QydWlfcm4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQydWkucm4KKyAgICBudnZtX2QydWlfcnAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQydWkucnAKKyAgICBudnZtX2QydWlfcnosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQydWkucnoKKyAgICBudnZtX2QydWxsX3JtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQydWxsLnJtCisgICAgbnZ2bV9kMnVsbF9ybiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kMnVsbC5ybgorICAgIG52dm1fZDJ1bGxfcnAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJ1bGwucnAKKyAgICBudnZtX2QydWxsX3J6LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQydWxsLnJ6CisgICAgbnZ2bV9kaXZfYXBwcm94X2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kaXYuYXBwcm94LmYKKyAgICBudnZtX2Rpdl9hcHByb3hfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmRpdi5hcHByb3guZnR6LmYKKyAgICBudnZtX2Rpdl9ybV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmRpdi5ybS5kCisgICAgbnZ2bV9kaXZfcm1fZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kaXYucm0uZgorICAgIG52dm1fZGl2X3JtX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZGl2LnJtLmZ0ei5mCisgICAgbnZ2bV9kaXZfcm5fZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kaXYucm4uZAorICAgIG52dm1fZGl2X3JuX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZGl2LnJuLmYKKyAgICBudnZtX2Rpdl9ybl9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmRpdi5ybi5mdHouZgorICAgIG52dm1fZGl2X3JwX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZGl2LnJwLmQKKyAgICBudnZtX2Rpdl9ycF9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmRpdi5ycC5mCisgICAgbnZ2bV9kaXZfcnBfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kaXYucnAuZnR6LmYKKyAgICBudnZtX2Rpdl9yel9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmRpdi5yei5kCisgICAgbnZ2bV9kaXZfcnpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kaXYucnouZgorICAgIG52dm1fZGl2X3J6X2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZGl2LnJ6LmZ0ei5mCisgICAgbnZ2bV9leDJfYXBwcm94X2QsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5leDIuYXBwcm94LmQKKyAgICBudnZtX2V4Ml9hcHByb3hfZiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmV4Mi5hcHByb3guZgorICAgIG52dm1fZXgyX2FwcHJveF9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZXgyLmFwcHJveC5mdHouZgorICAgIG52dm1fZjJoX3JuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJoLnJuCisgICAgbnZ2bV9mMmhfcm5fZnR6LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMmgucm4uZnR6CisgICAgbnZ2bV9mMmlfcm0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMmkucm0KKyAgICBudnZtX2YyaV9ybV9mdHosICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYyaS5ybS5mdHoKKyAgICBudnZtX2YyaV9ybiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYyaS5ybgorICAgIG52dm1fZjJpX3JuX2Z0eiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJpLnJuLmZ0egorICAgIG52dm1fZjJpX3JwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJpLnJwCisgICAgbnZ2bV9mMmlfcnBfZnR6LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMmkucnAuZnR6CisgICAgbnZ2bV9mMmlfcnosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMmkucnoKKyAgICBudnZtX2YyaV9yel9mdHosICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYyaS5yei5mdHoKKyAgICBudnZtX2YybGxfcm0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYybGwucm0KKyAgICBudnZtX2YybGxfcm1fZnR6LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYybGwucm0uZnR6CisgICAgbnZ2bV9mMmxsX3JuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMmxsLnJuCisgICAgbnZ2bV9mMmxsX3JuX2Z0eiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMmxsLnJuLmZ0egorICAgIG52dm1fZjJsbF9ycCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJsbC5ycAorICAgIG52dm1fZjJsbF9ycF9mdHosICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJsbC5ycC5mdHoKKyAgICBudnZtX2YybGxfcnosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYybGwucnoKKyAgICBudnZtX2YybGxfcnpfZnR6LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYybGwucnouZnR6CisgICAgbnZ2bV9mMnVpX3JtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMnVpLnJtCisgICAgbnZ2bV9mMnVpX3JtX2Z0eiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMnVpLnJtLmZ0egorICAgIG52dm1fZjJ1aV9ybiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJ1aS5ybgorICAgIG52dm1fZjJ1aV9ybl9mdHosICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJ1aS5ybi5mdHoKKyAgICBudnZtX2YydWlfcnAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYydWkucnAKKyAgICBudnZtX2YydWlfcnBfZnR6LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYydWkucnAuZnR6CisgICAgbnZ2bV9mMnVpX3J6LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMnVpLnJ6CisgICAgbnZ2bV9mMnVpX3J6X2Z0eiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMnVpLnJ6LmZ0egorICAgIG52dm1fZjJ1bGxfcm0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJ1bGwucm0KKyAgICBudnZtX2YydWxsX3JtX2Z0eiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYydWxsLnJtLmZ0egorICAgIG52dm1fZjJ1bGxfcm4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJ1bGwucm4KKyAgICBudnZtX2YydWxsX3JuX2Z0eiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYydWxsLnJuLmZ0egorICAgIG52dm1fZjJ1bGxfcnAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJ1bGwucnAKKyAgICBudnZtX2YydWxsX3JwX2Z0eiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYydWxsLnJwLmZ0egorICAgIG52dm1fZjJ1bGxfcnosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJ1bGwucnoKKyAgICBudnZtX2YydWxsX3J6X2Z0eiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYydWxsLnJ6LmZ0egorICAgIG52dm1fZmFic19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZmFicy5kCisgICAgbnZ2bV9mYWJzX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mYWJzLmYKKyAgICBudnZtX2ZhYnNfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZhYnMuZnR6LmYKKyAgICBudnZtX2Zsb29yX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZsb29yLmQKKyAgICBudnZtX2Zsb29yX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZsb29yLmYKKyAgICBudnZtX2Zsb29yX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZsb29yLmZ0ei5mCisgICAgbnZ2bV9mbWFfcm1fZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mbWEucm0uZAorICAgIG52dm1fZm1hX3JtX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZm1hLnJtLmYKKyAgICBudnZtX2ZtYV9ybV9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZtYS5ybS5mdHouZgorICAgIG52dm1fZm1hX3JuX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZm1hLnJuLmQKKyAgICBudnZtX2ZtYV9ybl9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZtYS5ybi5mCisgICAgbnZ2bV9mbWFfcm5fZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mbWEucm4uZnR6LmYKKyAgICBudnZtX2ZtYV9ycF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZtYS5ycC5kCisgICAgbnZ2bV9mbWFfcnBfZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mbWEucnAuZgorICAgIG52dm1fZm1hX3JwX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZm1hLnJwLmZ0ei5mCisgICAgbnZ2bV9mbWFfcnpfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mbWEucnouZAorICAgIG52dm1fZm1hX3J6X2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZm1hLnJ6LmYKKyAgICBudnZtX2ZtYV9yel9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZtYS5yei5mdHouZgorICAgIG52dm1fZm1heF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZm1heC5kCisgICAgbnZ2bV9mbWF4X2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mbWF4LmYKKyAgICBudnZtX2ZtYXhfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZtYXguZnR6LmYKKyAgICBudnZtX2ZtaW5fZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZtaW4uZAorICAgIG52dm1fZm1pbl9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZm1pbi5mCisgICAgbnZ2bV9mbWluX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mbWluLmZ0ei5mCisgICAgbnZ2bV9mbnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mbnMKKyAgICBudnZtX2kyZF9ybSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmkyZC5ybQorICAgIG52dm1faTJkX3JuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uaTJkLnJuCisgICAgbnZ2bV9pMmRfcnAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5pMmQucnAKKyAgICBudnZtX2kyZF9yeiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmkyZC5yegorICAgIG52dm1faTJmX3JtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uaTJmLnJtCisgICAgbnZ2bV9pMmZfcm4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5pMmYucm4KKyAgICBudnZtX2kyZl9ycCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmkyZi5ycAorICAgIG52dm1faTJmX3J6LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uaTJmLnJ6CisgICAgbnZ2bV9pc3NwYWNlcF9jb25zdCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5pc3NwYWNlcC5jb25zdAorICAgIG52dm1faXNzcGFjZXBfZ2xvYmFsLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uaXNzcGFjZXAuZ2xvYmFsCisgICAgbnZ2bV9pc3NwYWNlcF9sb2NhbCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5pc3NwYWNlcC5sb2NhbAorICAgIG52dm1faXNzcGFjZXBfc2hhcmVkLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uaXNzcGFjZXAuc2hhcmVkCisgICAgbnZ2bV9pc3R5cGVwX3NhbXBsZXIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5pc3R5cGVwLnNhbXBsZXIKKyAgICBudnZtX2lzdHlwZXBfc3VyZmFjZSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmlzdHlwZXAuc3VyZmFjZQorICAgIG52dm1faXN0eXBlcF90ZXh0dXJlLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uaXN0eXBlcC50ZXh0dXJlCisgICAgbnZ2bV9sZGdfZ2xvYmFsX2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5sZGcuZ2xvYmFsLmYKKyAgICBudnZtX2xkZ19nbG9iYWxfaSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmxkZy5nbG9iYWwuaQorICAgIG52dm1fbGRnX2dsb2JhbF9wLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubGRnLmdsb2JhbC5wCisgICAgbnZ2bV9sZHVfZ2xvYmFsX2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5sZHUuZ2xvYmFsLmYKKyAgICBudnZtX2xkdV9nbG9iYWxfaSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmxkdS5nbG9iYWwuaQorICAgIG52dm1fbGR1X2dsb2JhbF9wLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubGR1Lmdsb2JhbC5wCisgICAgbnZ2bV9sZzJfYXBwcm94X2QsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5sZzIuYXBwcm94LmQKKyAgICBudnZtX2xnMl9hcHByb3hfZiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmxnMi5hcHByb3guZgorICAgIG52dm1fbGcyX2FwcHJveF9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubGcyLmFwcHJveC5mdHouZgorICAgIG52dm1fbGwyZF9ybSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubGwyZC5ybQorICAgIG52dm1fbGwyZF9ybiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubGwyZC5ybgorICAgIG52dm1fbGwyZF9ycCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubGwyZC5ycAorICAgIG52dm1fbGwyZF9yeiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubGwyZC5yegorICAgIG52dm1fbGwyZl9ybSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubGwyZi5ybQorICAgIG52dm1fbGwyZl9ybiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubGwyZi5ybgorICAgIG52dm1fbGwyZl9ycCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubGwyZi5ycAorICAgIG52dm1fbGwyZl9yeiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubGwyZi5yegorICAgIG52dm1fbG9oaV9pMmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubG9oaS5pMmQKKyAgICBudnZtX21hdGNoX2FsbF9zeW5jX2kzMnAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm1hdGNoLmFsbC5zeW5jLmkzMnAKKyAgICBudnZtX21hdGNoX2FsbF9zeW5jX2k2NHAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm1hdGNoLmFsbC5zeW5jLmk2NHAKKyAgICBudnZtX21hdGNoX2FueV9zeW5jX2kzMiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm1hdGNoLmFueS5zeW5jLmkzMgorICAgIG52dm1fbWF0Y2hfYW55X3N5bmNfaTY0LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubWF0Y2guYW55LnN5bmMuaTY0CisgICAgbnZ2bV9tZW1iYXJfY3RhLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tZW1iYXIuY3RhCisgICAgbnZ2bV9tZW1iYXJfZ2wsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tZW1iYXIuZ2wKKyAgICBudnZtX21lbWJhcl9zeXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm1lbWJhci5zeXMKKyAgICBudnZtX21vdmVfZG91YmxlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm1vdmUuZG91YmxlCisgICAgbnZ2bV9tb3ZlX2Zsb2F0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tb3ZlLmZsb2F0CisgICAgbnZ2bV9tb3ZlX2kxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tb3ZlLmkxNgorICAgIG52dm1fbW92ZV9pMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubW92ZS5pMzIKKyAgICBudnZtX21vdmVfaTY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm1vdmUuaTY0CisgICAgbnZ2bV9tb3ZlX3B0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tb3ZlLnB0cgorICAgIG52dm1fbXVsX3JtX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubXVsLnJtLmQKKyAgICBudnZtX211bF9ybV9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm11bC5ybS5mCisgICAgbnZ2bV9tdWxfcm1fZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tdWwucm0uZnR6LmYKKyAgICBudnZtX211bF9ybl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm11bC5ybi5kCisgICAgbnZ2bV9tdWxfcm5fZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tdWwucm4uZgorICAgIG52dm1fbXVsX3JuX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubXVsLnJuLmZ0ei5mCisgICAgbnZ2bV9tdWxfcnBfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tdWwucnAuZAorICAgIG52dm1fbXVsX3JwX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubXVsLnJwLmYKKyAgICBudnZtX211bF9ycF9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm11bC5ycC5mdHouZgorICAgIG52dm1fbXVsX3J6X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubXVsLnJ6LmQKKyAgICBudnZtX211bF9yel9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm11bC5yei5mCisgICAgbnZ2bV9tdWxfcnpfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tdWwucnouZnR6LmYKKyAgICBudnZtX211bDI0X2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm11bDI0LmkKKyAgICBudnZtX211bDI0X3VpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm11bDI0LnVpCisgICAgbnZ2bV9tdWxoaV9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tdWxoaS5pCisgICAgbnZ2bV9tdWxoaV9sbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tdWxoaS5sbAorICAgIG52dm1fbXVsaGlfdWksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubXVsaGkudWkKKyAgICBudnZtX211bGhpX3VsbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm11bGhpLnVsbAorICAgIG52dm1fcHJtdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucHJtdAorICAgIG52dm1fcHRyX2NvbnN0YW50X3RvX2dlbiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucHRyLmNvbnN0YW50LnRvLmdlbgorICAgIG52dm1fcHRyX2dlbl90b19jb25zdGFudCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucHRyLmdlbi50by5jb25zdGFudAorICAgIG52dm1fcHRyX2dlbl90b19nbG9iYWwsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucHRyLmdlbi50by5nbG9iYWwKKyAgICBudnZtX3B0cl9nZW5fdG9fbG9jYWwsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnB0ci5nZW4udG8ubG9jYWwKKyAgICBudnZtX3B0cl9nZW5fdG9fcGFyYW0sICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnB0ci5nZW4udG8ucGFyYW0KKyAgICBudnZtX3B0cl9nZW5fdG9fc2hhcmVkLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnB0ci5nZW4udG8uc2hhcmVkCisgICAgbnZ2bV9wdHJfZ2xvYmFsX3RvX2dlbiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5wdHIuZ2xvYmFsLnRvLmdlbgorICAgIG52dm1fcHRyX2xvY2FsX3RvX2dlbiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucHRyLmxvY2FsLnRvLmdlbgorICAgIG52dm1fcHRyX3NoYXJlZF90b19nZW4sICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucHRyLnNoYXJlZC50by5nZW4KKyAgICBudnZtX3JjcF9hcHByb3hfZnR6X2QsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJjcC5hcHByb3guZnR6LmQKKyAgICBudnZtX3JjcF9ybV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJjcC5ybS5kCisgICAgbnZ2bV9yY3Bfcm1fZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yY3Aucm0uZgorICAgIG52dm1fcmNwX3JtX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmNwLnJtLmZ0ei5mCisgICAgbnZ2bV9yY3Bfcm5fZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yY3Aucm4uZAorICAgIG52dm1fcmNwX3JuX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmNwLnJuLmYKKyAgICBudnZtX3JjcF9ybl9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJjcC5ybi5mdHouZgorICAgIG52dm1fcmNwX3JwX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmNwLnJwLmQKKyAgICBudnZtX3JjcF9ycF9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJjcC5ycC5mCisgICAgbnZ2bV9yY3BfcnBfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yY3AucnAuZnR6LmYKKyAgICBudnZtX3JjcF9yel9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJjcC5yei5kCisgICAgbnZ2bV9yY3BfcnpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yY3AucnouZgorICAgIG52dm1fcmNwX3J6X2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmNwLnJ6LmZ0ei5mCisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2Nsb2NrLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmNsb2NrCisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2Nsb2NrNjQsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmNsb2NrNjQKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfY3RhaWRfdywgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuY3RhaWQudworICAgIG52dm1fcmVhZF9wdHhfc3JlZ19jdGFpZF94LCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5jdGFpZC54CisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2N0YWlkX3ksICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmN0YWlkLnkKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfY3RhaWRfeiwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuY3RhaWQuegorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcwLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcwCisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzEsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzEKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTAsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTAKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTEsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTEKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTIKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTMsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTMKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTQsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTQKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTUsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTUKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTYsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTYKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTcsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTcKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTgsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTgKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTksICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTkKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMiwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMgorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMCwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyMAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMSwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyMQorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMiwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyMgorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMywgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyMworICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyNCwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyNAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyNSwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyNQorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyNiwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyNgorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyNywgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyNworICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyOCwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyOAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyOSwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyOQorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWczLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWczCisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzMwLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzMwCisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzMxLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzMxCisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzQsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzQKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnNSwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnNQorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc2LCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc2CisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzcsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzcKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnOCwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnOAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc5LCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc5CisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2dyaWRpZCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmdyaWRpZAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19sYW5laWQsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5sYW5laWQKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfbGFuZW1hc2tfZXEsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubGFuZW1hc2suZXEKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfbGFuZW1hc2tfZ2UsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubGFuZW1hc2suZ2UKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfbGFuZW1hc2tfZ3QsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubGFuZW1hc2suZ3QKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfbGFuZW1hc2tfbGUsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubGFuZW1hc2subGUKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfbGFuZW1hc2tfbHQsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubGFuZW1hc2subHQKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfbmN0YWlkX3csICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubmN0YWlkLncKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfbmN0YWlkX3gsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubmN0YWlkLngKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfbmN0YWlkX3ksICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubmN0YWlkLnkKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfbmN0YWlkX3osICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubmN0YWlkLnoKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfbnNtaWQsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubnNtaWQKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfbnRpZF93LCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubnRpZC53CisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX250aWRfeCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLm50aWQueAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19udGlkX3ksICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5udGlkLnkKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfbnRpZF96LCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubnRpZC56CisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX253YXJwaWQsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLm53YXJwaWQKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfcG0wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcucG0wCisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX3BtMSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnBtMQorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19wbTIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5wbTIKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfcG0zLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcucG0zCisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX3NtaWQsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnNtaWQKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfdGlkX3csICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcudGlkLncKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfdGlkX3gsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcudGlkLngKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfdGlkX3ksICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcudGlkLnkKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfdGlkX3osICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcudGlkLnoKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfd2FycGlkLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcud2FycGlkCisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX3dhcnBzaXplLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLndhcnBzaXplCisgICAgbnZ2bV9yZWZsZWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWZsZWN0CisgICAgbnZ2bV9yb3RhdGVfYjMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yb3RhdGUuYjMyCisgICAgbnZ2bV9yb3RhdGVfYjY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yb3RhdGUuYjY0CisgICAgbnZ2bV9yb3RhdGVfcmlnaHRfYjY0LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yb3RhdGUucmlnaHQuYjY0CisgICAgbnZ2bV9yb3VuZF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yb3VuZC5kCisgICAgbnZ2bV9yb3VuZF9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yb3VuZC5mCisgICAgbnZ2bV9yb3VuZF9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yb3VuZC5mdHouZgorICAgIG52dm1fcnNxcnRfYXBwcm94X2QsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucnNxcnQuYXBwcm94LmQKKyAgICBudnZtX3JzcXJ0X2FwcHJveF9mLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJzcXJ0LmFwcHJveC5mCisgICAgbnZ2bV9yc3FydF9hcHByb3hfZnR6X2YsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yc3FydC5hcHByb3guZnR6LmYKKyAgICBudnZtX3NhZF9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNhZC5pCisgICAgbnZ2bV9zYWRfdWksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zYWQudWkKKyAgICBudnZtX3NhdHVyYXRlX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNhdHVyYXRlLmQKKyAgICBudnZtX3NhdHVyYXRlX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNhdHVyYXRlLmYKKyAgICBudnZtX3NhdHVyYXRlX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNhdHVyYXRlLmZ0ei5mCisgICAgbnZ2bV9zaGZsX2JmbHlfZjMyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zaGZsLmJmbHkuZjMyCisgICAgbnZ2bV9zaGZsX2JmbHlfaTMyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zaGZsLmJmbHkuaTMyCisgICAgbnZ2bV9zaGZsX2Rvd25fZjMyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zaGZsLmRvd24uZjMyCisgICAgbnZ2bV9zaGZsX2Rvd25faTMyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zaGZsLmRvd24uaTMyCisgICAgbnZ2bV9zaGZsX2lkeF9mMzIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zaGZsLmlkeC5mMzIKKyAgICBudnZtX3NoZmxfaWR4X2kzMiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNoZmwuaWR4LmkzMgorICAgIG52dm1fc2hmbF9zeW5jX2JmbHlfZjMyLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc2hmbC5zeW5jLmJmbHkuZjMyCisgICAgbnZ2bV9zaGZsX3N5bmNfYmZseV9pMzIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zaGZsLnN5bmMuYmZseS5pMzIKKyAgICBudnZtX3NoZmxfc3luY19kb3duX2YzMiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNoZmwuc3luYy5kb3duLmYzMgorICAgIG52dm1fc2hmbF9zeW5jX2Rvd25faTMyLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc2hmbC5zeW5jLmRvd24uaTMyCisgICAgbnZ2bV9zaGZsX3N5bmNfaWR4X2YzMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zaGZsLnN5bmMuaWR4LmYzMgorICAgIG52dm1fc2hmbF9zeW5jX2lkeF9pMzIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc2hmbC5zeW5jLmlkeC5pMzIKKyAgICBudnZtX3NoZmxfc3luY191cF9mMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNoZmwuc3luYy51cC5mMzIKKyAgICBudnZtX3NoZmxfc3luY191cF9pMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNoZmwuc3luYy51cC5pMzIKKyAgICBudnZtX3NoZmxfdXBfZjMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNoZmwudXAuZjMyCisgICAgbnZ2bV9zaGZsX3VwX2kzMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zaGZsLnVwLmkzMgorICAgIG52dm1fc2luX2FwcHJveF9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc2luLmFwcHJveC5mCisgICAgbnZ2bV9zaW5fYXBwcm94X2Z0el9mLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zaW4uYXBwcm94LmZ0ei5mCisgICAgbnZ2bV9zcXJ0X2FwcHJveF9mLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zcXJ0LmFwcHJveC5mCisgICAgbnZ2bV9zcXJ0X2FwcHJveF9mdHpfZiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zcXJ0LmFwcHJveC5mdHouZgorICAgIG52dm1fc3FydF9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3FydC5mCisgICAgbnZ2bV9zcXJ0X3JtX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zcXJ0LnJtLmQKKyAgICBudnZtX3NxcnRfcm1fZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNxcnQucm0uZgorICAgIG52dm1fc3FydF9ybV9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3FydC5ybS5mdHouZgorICAgIG52dm1fc3FydF9ybl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3FydC5ybi5kCisgICAgbnZ2bV9zcXJ0X3JuX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zcXJ0LnJuLmYKKyAgICBudnZtX3NxcnRfcm5fZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNxcnQucm4uZnR6LmYKKyAgICBudnZtX3NxcnRfcnBfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNxcnQucnAuZAorICAgIG52dm1fc3FydF9ycF9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3FydC5ycC5mCisgICAgbnZ2bV9zcXJ0X3JwX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zcXJ0LnJwLmZ0ei5mCisgICAgbnZ2bV9zcXJ0X3J6X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zcXJ0LnJ6LmQKKyAgICBudnZtX3NxcnRfcnpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNxcnQucnouZgorICAgIG52dm1fc3FydF9yel9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3FydC5yei5mdHouZgorICAgIG52dm1fc3VsZF8xZF9hcnJheV9pMTZfY2xhbXAsICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pMTYuY2xhbXAKKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfaTE2X3RyYXAsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTE2LnRyYXAKKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfaTE2X3plcm8sICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTE2Lnplcm8KKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfaTMyX2NsYW1wLCAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTMyLmNsYW1wCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X2kzMl90cmFwLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LmkzMi50cmFwCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X2kzMl96ZXJvLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LmkzMi56ZXJvCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X2k2NF9jbGFtcCwgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5Lmk2NC5jbGFtcAorICAgIG52dm1fc3VsZF8xZF9hcnJheV9pNjRfdHJhcCwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pNjQudHJhcAorICAgIG52dm1fc3VsZF8xZF9hcnJheV9pNjRfemVybywgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pNjQuemVybworICAgIG52dm1fc3VsZF8xZF9hcnJheV9pOF9jbGFtcCwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pOC5jbGFtcAorICAgIG52dm1fc3VsZF8xZF9hcnJheV9pOF90cmFwLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pOC50cmFwCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X2k4X3plcm8sICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5Lmk4Lnplcm8KKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfdjJpMTZfY2xhbXAsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpMTYuY2xhbXAKKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfdjJpMTZfdHJhcCwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpMTYudHJhcAorICAgIG52dm1fc3VsZF8xZF9hcnJheV92MmkxNl96ZXJvLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52MmkxNi56ZXJvCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X3YyaTMyX2NsYW1wLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTMyLmNsYW1wCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X3YyaTMyX3RyYXAsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTMyLnRyYXAKKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfdjJpMzJfemVybywgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpMzIuemVybworICAgIG52dm1fc3VsZF8xZF9hcnJheV92Mmk2NF9jbGFtcCwgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52Mmk2NC5jbGFtcAorICAgIG52dm1fc3VsZF8xZF9hcnJheV92Mmk2NF90cmFwLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52Mmk2NC50cmFwCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X3YyaTY0X3plcm8sICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTY0Lnplcm8KKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfdjJpOF9jbGFtcCwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpOC5jbGFtcAorICAgIG52dm1fc3VsZF8xZF9hcnJheV92Mmk4X3RyYXAsICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52Mmk4LnRyYXAKKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfdjJpOF96ZXJvLCAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpOC56ZXJvCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X3Y0aTE2X2NsYW1wLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTE2LmNsYW1wCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X3Y0aTE2X3RyYXAsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTE2LnRyYXAKKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfdjRpMTZfemVybywgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpMTYuemVybworICAgIG52dm1fc3VsZF8xZF9hcnJheV92NGkzMl9jbGFtcCwgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGkzMi5jbGFtcAorICAgIG52dm1fc3VsZF8xZF9hcnJheV92NGkzMl90cmFwLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGkzMi50cmFwCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X3Y0aTMyX3plcm8sICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTMyLnplcm8KKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfdjRpOF9jbGFtcCwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpOC5jbGFtcAorICAgIG52dm1fc3VsZF8xZF9hcnJheV92NGk4X3RyYXAsICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGk4LnRyYXAKKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfdjRpOF96ZXJvLCAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpOC56ZXJvCisgICAgbnZ2bV9zdWxkXzFkX2kxNl9jbGFtcCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmkxNi5jbGFtcAorICAgIG52dm1fc3VsZF8xZF9pMTZfdHJhcCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5pMTYudHJhcAorICAgIG52dm1fc3VsZF8xZF9pMTZfemVybywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5pMTYuemVybworICAgIG52dm1fc3VsZF8xZF9pMzJfY2xhbXAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5pMzIuY2xhbXAKKyAgICBudnZtX3N1bGRfMWRfaTMyX3RyYXAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTMyLnRyYXAKKyAgICBudnZtX3N1bGRfMWRfaTMyX3plcm8sICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTMyLnplcm8KKyAgICBudnZtX3N1bGRfMWRfaTY0X2NsYW1wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTY0LmNsYW1wCisgICAgbnZ2bV9zdWxkXzFkX2k2NF90cmFwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmk2NC50cmFwCisgICAgbnZ2bV9zdWxkXzFkX2k2NF96ZXJvLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmk2NC56ZXJvCisgICAgbnZ2bV9zdWxkXzFkX2k4X2NsYW1wLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmk4LmNsYW1wCisgICAgbnZ2bV9zdWxkXzFkX2k4X3RyYXAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmk4LnRyYXAKKyAgICBudnZtX3N1bGRfMWRfaThfemVybywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTguemVybworICAgIG52dm1fc3VsZF8xZF92MmkxNl9jbGFtcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC52MmkxNi5jbGFtcAorICAgIG52dm1fc3VsZF8xZF92MmkxNl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC52MmkxNi50cmFwCisgICAgbnZ2bV9zdWxkXzFkX3YyaTE2X3plcm8sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnYyaTE2Lnplcm8KKyAgICBudnZtX3N1bGRfMWRfdjJpMzJfY2xhbXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQudjJpMzIuY2xhbXAKKyAgICBudnZtX3N1bGRfMWRfdjJpMzJfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQudjJpMzIudHJhcAorICAgIG52dm1fc3VsZF8xZF92MmkzMl96ZXJvLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC52MmkzMi56ZXJvCisgICAgbnZ2bV9zdWxkXzFkX3YyaTY0X2NsYW1wLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnYyaTY0LmNsYW1wCisgICAgbnZ2bV9zdWxkXzFkX3YyaTY0X3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnYyaTY0LnRyYXAKKyAgICBudnZtX3N1bGRfMWRfdjJpNjRfemVybywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQudjJpNjQuemVybworICAgIG52dm1fc3VsZF8xZF92Mmk4X2NsYW1wLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC52Mmk4LmNsYW1wCisgICAgbnZ2bV9zdWxkXzFkX3YyaThfdHJhcCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnYyaTgudHJhcAorICAgIG52dm1fc3VsZF8xZF92Mmk4X3plcm8sICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC52Mmk4Lnplcm8KKyAgICBudnZtX3N1bGRfMWRfdjRpMTZfY2xhbXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQudjRpMTYuY2xhbXAKKyAgICBudnZtX3N1bGRfMWRfdjRpMTZfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQudjRpMTYudHJhcAorICAgIG52dm1fc3VsZF8xZF92NGkxNl96ZXJvLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC52NGkxNi56ZXJvCisgICAgbnZ2bV9zdWxkXzFkX3Y0aTMyX2NsYW1wLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnY0aTMyLmNsYW1wCisgICAgbnZ2bV9zdWxkXzFkX3Y0aTMyX3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnY0aTMyLnRyYXAKKyAgICBudnZtX3N1bGRfMWRfdjRpMzJfemVybywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQudjRpMzIuemVybworICAgIG52dm1fc3VsZF8xZF92NGk4X2NsYW1wLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC52NGk4LmNsYW1wCisgICAgbnZ2bV9zdWxkXzFkX3Y0aThfdHJhcCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnY0aTgudHJhcAorICAgIG52dm1fc3VsZF8xZF92NGk4X3plcm8sICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC52NGk4Lnplcm8KKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfaTE2X2NsYW1wLCAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTE2LmNsYW1wCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X2kxNl90cmFwLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LmkxNi50cmFwCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X2kxNl96ZXJvLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LmkxNi56ZXJvCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X2kzMl9jbGFtcCwgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LmkzMi5jbGFtcAorICAgIG52dm1fc3VsZF8yZF9hcnJheV9pMzJfdHJhcCwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pMzIudHJhcAorICAgIG52dm1fc3VsZF8yZF9hcnJheV9pMzJfemVybywgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pMzIuemVybworICAgIG52dm1fc3VsZF8yZF9hcnJheV9pNjRfY2xhbXAsICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pNjQuY2xhbXAKKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfaTY0X3RyYXAsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTY0LnRyYXAKKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfaTY0X3plcm8sICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTY0Lnplcm8KKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfaThfY2xhbXAsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTguY2xhbXAKKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfaThfdHJhcCwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTgudHJhcAorICAgIG52dm1fc3VsZF8yZF9hcnJheV9pOF96ZXJvLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pOC56ZXJvCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X3YyaTE2X2NsYW1wLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTE2LmNsYW1wCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X3YyaTE2X3RyYXAsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTE2LnRyYXAKKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfdjJpMTZfemVybywgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpMTYuemVybworICAgIG52dm1fc3VsZF8yZF9hcnJheV92MmkzMl9jbGFtcCwgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52MmkzMi5jbGFtcAorICAgIG52dm1fc3VsZF8yZF9hcnJheV92MmkzMl90cmFwLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52MmkzMi50cmFwCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X3YyaTMyX3plcm8sICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTMyLnplcm8KKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfdjJpNjRfY2xhbXAsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpNjQuY2xhbXAKKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfdjJpNjRfdHJhcCwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpNjQudHJhcAorICAgIG52dm1fc3VsZF8yZF9hcnJheV92Mmk2NF96ZXJvLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52Mmk2NC56ZXJvCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X3YyaThfY2xhbXAsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTguY2xhbXAKKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfdjJpOF90cmFwLCAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpOC50cmFwCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X3YyaThfemVybywgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTguemVybworICAgIG52dm1fc3VsZF8yZF9hcnJheV92NGkxNl9jbGFtcCwgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkxNi5jbGFtcAorICAgIG52dm1fc3VsZF8yZF9hcnJheV92NGkxNl90cmFwLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkxNi50cmFwCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X3Y0aTE2X3plcm8sICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTE2Lnplcm8KKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfdjRpMzJfY2xhbXAsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpMzIuY2xhbXAKKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfdjRpMzJfdHJhcCwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpMzIudHJhcAorICAgIG52dm1fc3VsZF8yZF9hcnJheV92NGkzMl96ZXJvLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkzMi56ZXJvCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X3Y0aThfY2xhbXAsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTguY2xhbXAKKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfdjRpOF90cmFwLCAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpOC50cmFwCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X3Y0aThfemVybywgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTguemVybworICAgIG52dm1fc3VsZF8yZF9pMTZfY2xhbXAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5pMTYuY2xhbXAKKyAgICBudnZtX3N1bGRfMmRfaTE2X3RyYXAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuaTE2LnRyYXAKKyAgICBudnZtX3N1bGRfMmRfaTE2X3plcm8sICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuaTE2Lnplcm8KKyAgICBudnZtX3N1bGRfMmRfaTMyX2NsYW1wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuaTMyLmNsYW1wCisgICAgbnZ2bV9zdWxkXzJkX2kzMl90cmFwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmkzMi50cmFwCisgICAgbnZ2bV9zdWxkXzJkX2kzMl96ZXJvLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmkzMi56ZXJvCisgICAgbnZ2bV9zdWxkXzJkX2k2NF9jbGFtcCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmk2NC5jbGFtcAorICAgIG52dm1fc3VsZF8yZF9pNjRfdHJhcCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5pNjQudHJhcAorICAgIG52dm1fc3VsZF8yZF9pNjRfemVybywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5pNjQuemVybworICAgIG52dm1fc3VsZF8yZF9pOF9jbGFtcCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5pOC5jbGFtcAorICAgIG52dm1fc3VsZF8yZF9pOF90cmFwLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5pOC50cmFwCisgICAgbnZ2bV9zdWxkXzJkX2k4X3plcm8sICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmk4Lnplcm8KKyAgICBudnZtX3N1bGRfMmRfdjJpMTZfY2xhbXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQudjJpMTYuY2xhbXAKKyAgICBudnZtX3N1bGRfMmRfdjJpMTZfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQudjJpMTYudHJhcAorICAgIG52dm1fc3VsZF8yZF92MmkxNl96ZXJvLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC52MmkxNi56ZXJvCisgICAgbnZ2bV9zdWxkXzJkX3YyaTMyX2NsYW1wLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnYyaTMyLmNsYW1wCisgICAgbnZ2bV9zdWxkXzJkX3YyaTMyX3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnYyaTMyLnRyYXAKKyAgICBudnZtX3N1bGRfMmRfdjJpMzJfemVybywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQudjJpMzIuemVybworICAgIG52dm1fc3VsZF8yZF92Mmk2NF9jbGFtcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC52Mmk2NC5jbGFtcAorICAgIG52dm1fc3VsZF8yZF92Mmk2NF90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC52Mmk2NC50cmFwCisgICAgbnZ2bV9zdWxkXzJkX3YyaTY0X3plcm8sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnYyaTY0Lnplcm8KKyAgICBudnZtX3N1bGRfMmRfdjJpOF9jbGFtcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQudjJpOC5jbGFtcAorICAgIG52dm1fc3VsZF8yZF92Mmk4X3RyYXAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC52Mmk4LnRyYXAKKyAgICBudnZtX3N1bGRfMmRfdjJpOF96ZXJvLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQudjJpOC56ZXJvCisgICAgbnZ2bV9zdWxkXzJkX3Y0aTE2X2NsYW1wLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnY0aTE2LmNsYW1wCisgICAgbnZ2bV9zdWxkXzJkX3Y0aTE2X3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnY0aTE2LnRyYXAKKyAgICBudnZtX3N1bGRfMmRfdjRpMTZfemVybywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQudjRpMTYuemVybworICAgIG52dm1fc3VsZF8yZF92NGkzMl9jbGFtcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC52NGkzMi5jbGFtcAorICAgIG52dm1fc3VsZF8yZF92NGkzMl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC52NGkzMi50cmFwCisgICAgbnZ2bV9zdWxkXzJkX3Y0aTMyX3plcm8sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnY0aTMyLnplcm8KKyAgICBudnZtX3N1bGRfMmRfdjRpOF9jbGFtcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQudjRpOC5jbGFtcAorICAgIG52dm1fc3VsZF8yZF92NGk4X3RyYXAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC52NGk4LnRyYXAKKyAgICBudnZtX3N1bGRfMmRfdjRpOF96ZXJvLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQudjRpOC56ZXJvCisgICAgbnZ2bV9zdWxkXzNkX2kxNl9jbGFtcCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLmkxNi5jbGFtcAorICAgIG52dm1fc3VsZF8zZF9pMTZfdHJhcCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC5pMTYudHJhcAorICAgIG52dm1fc3VsZF8zZF9pMTZfemVybywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC5pMTYuemVybworICAgIG52dm1fc3VsZF8zZF9pMzJfY2xhbXAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC5pMzIuY2xhbXAKKyAgICBudnZtX3N1bGRfM2RfaTMyX3RyYXAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTMyLnRyYXAKKyAgICBudnZtX3N1bGRfM2RfaTMyX3plcm8sICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTMyLnplcm8KKyAgICBudnZtX3N1bGRfM2RfaTY0X2NsYW1wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTY0LmNsYW1wCisgICAgbnZ2bV9zdWxkXzNkX2k2NF90cmFwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLmk2NC50cmFwCisgICAgbnZ2bV9zdWxkXzNkX2k2NF96ZXJvLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLmk2NC56ZXJvCisgICAgbnZ2bV9zdWxkXzNkX2k4X2NsYW1wLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLmk4LmNsYW1wCisgICAgbnZ2bV9zdWxkXzNkX2k4X3RyYXAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLmk4LnRyYXAKKyAgICBudnZtX3N1bGRfM2RfaThfemVybywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTguemVybworICAgIG52dm1fc3VsZF8zZF92MmkxNl9jbGFtcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC52MmkxNi5jbGFtcAorICAgIG52dm1fc3VsZF8zZF92MmkxNl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC52MmkxNi50cmFwCisgICAgbnZ2bV9zdWxkXzNkX3YyaTE2X3plcm8sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnYyaTE2Lnplcm8KKyAgICBudnZtX3N1bGRfM2RfdjJpMzJfY2xhbXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QudjJpMzIuY2xhbXAKKyAgICBudnZtX3N1bGRfM2RfdjJpMzJfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QudjJpMzIudHJhcAorICAgIG52dm1fc3VsZF8zZF92MmkzMl96ZXJvLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC52MmkzMi56ZXJvCisgICAgbnZ2bV9zdWxkXzNkX3YyaTY0X2NsYW1wLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnYyaTY0LmNsYW1wCisgICAgbnZ2bV9zdWxkXzNkX3YyaTY0X3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnYyaTY0LnRyYXAKKyAgICBudnZtX3N1bGRfM2RfdjJpNjRfemVybywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QudjJpNjQuemVybworICAgIG52dm1fc3VsZF8zZF92Mmk4X2NsYW1wLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC52Mmk4LmNsYW1wCisgICAgbnZ2bV9zdWxkXzNkX3YyaThfdHJhcCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnYyaTgudHJhcAorICAgIG52dm1fc3VsZF8zZF92Mmk4X3plcm8sICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC52Mmk4Lnplcm8KKyAgICBudnZtX3N1bGRfM2RfdjRpMTZfY2xhbXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QudjRpMTYuY2xhbXAKKyAgICBudnZtX3N1bGRfM2RfdjRpMTZfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QudjRpMTYudHJhcAorICAgIG52dm1fc3VsZF8zZF92NGkxNl96ZXJvLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC52NGkxNi56ZXJvCisgICAgbnZ2bV9zdWxkXzNkX3Y0aTMyX2NsYW1wLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnY0aTMyLmNsYW1wCisgICAgbnZ2bV9zdWxkXzNkX3Y0aTMyX3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnY0aTMyLnRyYXAKKyAgICBudnZtX3N1bGRfM2RfdjRpMzJfemVybywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QudjRpMzIuemVybworICAgIG52dm1fc3VsZF8zZF92NGk4X2NsYW1wLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC52NGk4LmNsYW1wCisgICAgbnZ2bV9zdWxkXzNkX3Y0aThfdHJhcCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnY0aTgudHJhcAorICAgIG52dm1fc3VsZF8zZF92NGk4X3plcm8sICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC52NGk4Lnplcm8KKyAgICBudnZtX3N1cV9hcnJheV9zaXplLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1cS5hcnJheS5zaXplCisgICAgbnZ2bV9zdXFfY2hhbm5lbF9kYXRhX3R5cGUsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXEuY2hhbm5lbC5kYXRhLnR5cGUKKyAgICBudnZtX3N1cV9jaGFubmVsX29yZGVyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1cS5jaGFubmVsLm9yZGVyCisgICAgbnZ2bV9zdXFfZGVwdGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXEuZGVwdGgKKyAgICBudnZtX3N1cV9oZWlnaHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1cS5oZWlnaHQKKyAgICBudnZtX3N1cV93aWR0aCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1cS53aWR0aAorICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X2kxNl9jbGFtcCwgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkxNi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X2kxNl90cmFwLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkxNi50cmFwCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTE2X3plcm8sICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTE2Lnplcm8KKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV9pMzJfY2xhbXAsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pMzIuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV9pMzJfdHJhcCwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pMzIudHJhcAorICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X2kzMl96ZXJvLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkzMi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTY0X2NsYW1wLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTY0LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTY0X3RyYXAsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTY0LnRyYXAKKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV9pNjRfemVybywgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pNjQuemVybworICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X2k4X2NsYW1wLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5Lmk4LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaThfdHJhcCwgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTgudHJhcAorICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X2k4X3plcm8sICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5Lmk4Lnplcm8KKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV92MmkxNl9jbGFtcCwgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52MmkxNi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X3YyaTE2X3RyYXAsICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTE2LnRyYXAKKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV92MmkxNl96ZXJvLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52MmkxNi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpMzJfY2xhbXAsICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMzIuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV92MmkzMl90cmFwLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52MmkzMi50cmFwCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpMzJfemVybywgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMzIuemVybworICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X3YyaTY0X2NsYW1wLCAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTY0LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpNjRfdHJhcCwgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpNjQudHJhcAorICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X3YyaTY0X3plcm8sICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTY0Lnplcm8KKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV92Mmk4X2NsYW1wLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52Mmk4LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpOF90cmFwLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpOC50cmFwCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpOF96ZXJvLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpOC56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMTZfY2xhbXAsICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMTYuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV92NGkxNl90cmFwLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGkxNi50cmFwCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMTZfemVybywgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMTYuemVybworICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X3Y0aTMyX2NsYW1wLCAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTMyLmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMzJfdHJhcCwgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMzIudHJhcAorICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X3Y0aTMyX3plcm8sICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTMyLnplcm8KKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV92NGk4X2NsYW1wLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGk4LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpOF90cmFwLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpOC50cmFwCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpOF96ZXJvLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpOC56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMWRfaTE2X2NsYW1wLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuaTE2LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMWRfaTE2X3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuaTE2LnRyYXAKKyAgICBudnZtX3N1c3RfYl8xZF9pMTZfemVybywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5pMTYuemVybworICAgIG52dm1fc3VzdF9iXzFkX2kzMl9jbGFtcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmkzMi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzFkX2kzMl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmkzMi50cmFwCisgICAgbnZ2bV9zdXN0X2JfMWRfaTMyX3plcm8sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuaTMyLnplcm8KKyAgICBudnZtX3N1c3RfYl8xZF9pNjRfY2xhbXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5pNjQuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8xZF9pNjRfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5pNjQudHJhcAorICAgIG52dm1fc3VzdF9iXzFkX2k2NF96ZXJvLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmk2NC56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMWRfaThfY2xhbXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuaTguY2xhbXAKKyAgICBudnZtX3N1c3RfYl8xZF9pOF90cmFwLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5pOC50cmFwCisgICAgbnZ2bV9zdXN0X2JfMWRfaThfemVybywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuaTguemVybworICAgIG52dm1fc3VzdF9iXzFkX3YyaTE2X2NsYW1wLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTE2LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMWRfdjJpMTZfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpMTYudHJhcAorICAgIG52dm1fc3VzdF9iXzFkX3YyaTE2X3plcm8sICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTE2Lnplcm8KKyAgICBudnZtX3N1c3RfYl8xZF92MmkzMl9jbGFtcCwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52MmkzMi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzFkX3YyaTMyX3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTMyLnRyYXAKKyAgICBudnZtX3N1c3RfYl8xZF92MmkzMl96ZXJvLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52MmkzMi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMWRfdjJpNjRfY2xhbXAsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpNjQuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8xZF92Mmk2NF90cmFwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52Mmk2NC50cmFwCisgICAgbnZ2bV9zdXN0X2JfMWRfdjJpNjRfemVybywgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpNjQuemVybworICAgIG52dm1fc3VzdF9iXzFkX3YyaThfY2xhbXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTguY2xhbXAKKyAgICBudnZtX3N1c3RfYl8xZF92Mmk4X3RyYXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52Mmk4LnRyYXAKKyAgICBudnZtX3N1c3RfYl8xZF92Mmk4X3plcm8sICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52Mmk4Lnplcm8KKyAgICBudnZtX3N1c3RfYl8xZF92NGkxNl9jbGFtcCwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52NGkxNi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzFkX3Y0aTE2X3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTE2LnRyYXAKKyAgICBudnZtX3N1c3RfYl8xZF92NGkxNl96ZXJvLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52NGkxNi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMWRfdjRpMzJfY2xhbXAsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpMzIuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8xZF92NGkzMl90cmFwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52NGkzMi50cmFwCisgICAgbnZ2bV9zdXN0X2JfMWRfdjRpMzJfemVybywgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpMzIuemVybworICAgIG52dm1fc3VzdF9iXzFkX3Y0aThfY2xhbXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTguY2xhbXAKKyAgICBudnZtX3N1c3RfYl8xZF92NGk4X3RyYXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52NGk4LnRyYXAKKyAgICBudnZtX3N1c3RfYl8xZF92NGk4X3plcm8sICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52NGk4Lnplcm8KKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV9pMTZfY2xhbXAsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMTYuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV9pMTZfdHJhcCwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMTYudHJhcAorICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X2kxNl96ZXJvLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LmkxNi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTMyX2NsYW1wLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTMyLmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTMyX3RyYXAsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTMyLnRyYXAKKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV9pMzJfemVybywgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMzIuemVybworICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X2k2NF9jbGFtcCwgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5Lmk2NC5jbGFtcAorICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X2k2NF90cmFwLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5Lmk2NC50cmFwCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTY0X3plcm8sICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTY0Lnplcm8KKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV9pOF9jbGFtcCwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pOC5jbGFtcAorICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X2k4X3RyYXAsICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5Lmk4LnRyYXAKKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV9pOF96ZXJvLCAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pOC56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMTZfY2xhbXAsICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpMTYuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV92MmkxNl90cmFwLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52MmkxNi50cmFwCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMTZfemVybywgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpMTYuemVybworICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X3YyaTMyX2NsYW1wLCAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTMyLmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMzJfdHJhcCwgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpMzIudHJhcAorICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X3YyaTMyX3plcm8sICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTMyLnplcm8KKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV92Mmk2NF9jbGFtcCwgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk2NC5jbGFtcAorICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X3YyaTY0X3RyYXAsICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTY0LnRyYXAKKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV92Mmk2NF96ZXJvLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk2NC56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpOF9jbGFtcCwgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpOC5jbGFtcAorICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X3YyaThfdHJhcCwgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTgudHJhcAorICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X3YyaThfemVybywgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTguemVybworICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTE2X2NsYW1wLCAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTE2LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpMTZfdHJhcCwgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpMTYudHJhcAorICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTE2X3plcm8sICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTE2Lnplcm8KKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV92NGkzMl9jbGFtcCwgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGkzMi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTMyX3RyYXAsICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTMyLnRyYXAKKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV92NGkzMl96ZXJvLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGkzMi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpOF9jbGFtcCwgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpOC5jbGFtcAorICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X3Y0aThfdHJhcCwgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTgudHJhcAorICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X3Y0aThfemVybywgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTguemVybworICAgIG52dm1fc3VzdF9iXzJkX2kxNl9jbGFtcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmkxNi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzJkX2kxNl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmkxNi50cmFwCisgICAgbnZ2bV9zdXN0X2JfMmRfaTE2X3plcm8sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuaTE2Lnplcm8KKyAgICBudnZtX3N1c3RfYl8yZF9pMzJfY2xhbXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5pMzIuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8yZF9pMzJfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5pMzIudHJhcAorICAgIG52dm1fc3VzdF9iXzJkX2kzMl96ZXJvLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmkzMi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMmRfaTY0X2NsYW1wLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuaTY0LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMmRfaTY0X3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuaTY0LnRyYXAKKyAgICBudnZtX3N1c3RfYl8yZF9pNjRfemVybywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5pNjQuemVybworICAgIG52dm1fc3VzdF9iXzJkX2k4X2NsYW1wLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmk4LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMmRfaThfdHJhcCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuaTgudHJhcAorICAgIG52dm1fc3VzdF9iXzJkX2k4X3plcm8sICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmk4Lnplcm8KKyAgICBudnZtX3N1c3RfYl8yZF92MmkxNl9jbGFtcCwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52MmkxNi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzJkX3YyaTE2X3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTE2LnRyYXAKKyAgICBudnZtX3N1c3RfYl8yZF92MmkxNl96ZXJvLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52MmkxNi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMmRfdjJpMzJfY2xhbXAsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpMzIuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8yZF92MmkzMl90cmFwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52MmkzMi50cmFwCisgICAgbnZ2bV9zdXN0X2JfMmRfdjJpMzJfemVybywgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpMzIuemVybworICAgIG52dm1fc3VzdF9iXzJkX3YyaTY0X2NsYW1wLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTY0LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMmRfdjJpNjRfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpNjQudHJhcAorICAgIG52dm1fc3VzdF9iXzJkX3YyaTY0X3plcm8sICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTY0Lnplcm8KKyAgICBudnZtX3N1c3RfYl8yZF92Mmk4X2NsYW1wLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52Mmk4LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMmRfdjJpOF90cmFwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpOC50cmFwCisgICAgbnZ2bV9zdXN0X2JfMmRfdjJpOF96ZXJvLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpOC56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMmRfdjRpMTZfY2xhbXAsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpMTYuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8yZF92NGkxNl90cmFwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52NGkxNi50cmFwCisgICAgbnZ2bV9zdXN0X2JfMmRfdjRpMTZfemVybywgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpMTYuemVybworICAgIG52dm1fc3VzdF9iXzJkX3Y0aTMyX2NsYW1wLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTMyLmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMmRfdjRpMzJfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpMzIudHJhcAorICAgIG52dm1fc3VzdF9iXzJkX3Y0aTMyX3plcm8sICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTMyLnplcm8KKyAgICBudnZtX3N1c3RfYl8yZF92NGk4X2NsYW1wLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52NGk4LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMmRfdjRpOF90cmFwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpOC50cmFwCisgICAgbnZ2bV9zdXN0X2JfMmRfdjRpOF96ZXJvLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpOC56ZXJvCisgICAgbnZ2bV9zdXN0X2JfM2RfaTE2X2NsYW1wLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QuaTE2LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfM2RfaTE2X3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QuaTE2LnRyYXAKKyAgICBudnZtX3N1c3RfYl8zZF9pMTZfemVybywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC5pMTYuemVybworICAgIG52dm1fc3VzdF9iXzNkX2kzMl9jbGFtcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLmkzMi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzNkX2kzMl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLmkzMi50cmFwCisgICAgbnZ2bV9zdXN0X2JfM2RfaTMyX3plcm8sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QuaTMyLnplcm8KKyAgICBudnZtX3N1c3RfYl8zZF9pNjRfY2xhbXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC5pNjQuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8zZF9pNjRfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC5pNjQudHJhcAorICAgIG52dm1fc3VzdF9iXzNkX2k2NF96ZXJvLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLmk2NC56ZXJvCisgICAgbnZ2bV9zdXN0X2JfM2RfaThfY2xhbXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QuaTguY2xhbXAKKyAgICBudnZtX3N1c3RfYl8zZF9pOF90cmFwLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC5pOC50cmFwCisgICAgbnZ2bV9zdXN0X2JfM2RfaThfemVybywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QuaTguemVybworICAgIG52dm1fc3VzdF9iXzNkX3YyaTE2X2NsYW1wLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTE2LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfM2RfdjJpMTZfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpMTYudHJhcAorICAgIG52dm1fc3VzdF9iXzNkX3YyaTE2X3plcm8sICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTE2Lnplcm8KKyAgICBudnZtX3N1c3RfYl8zZF92MmkzMl9jbGFtcCwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52MmkzMi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzNkX3YyaTMyX3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTMyLnRyYXAKKyAgICBudnZtX3N1c3RfYl8zZF92MmkzMl96ZXJvLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52MmkzMi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfM2RfdjJpNjRfY2xhbXAsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpNjQuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8zZF92Mmk2NF90cmFwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52Mmk2NC50cmFwCisgICAgbnZ2bV9zdXN0X2JfM2RfdjJpNjRfemVybywgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpNjQuemVybworICAgIG52dm1fc3VzdF9iXzNkX3YyaThfY2xhbXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTguY2xhbXAKKyAgICBudnZtX3N1c3RfYl8zZF92Mmk4X3RyYXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52Mmk4LnRyYXAKKyAgICBudnZtX3N1c3RfYl8zZF92Mmk4X3plcm8sICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52Mmk4Lnplcm8KKyAgICBudnZtX3N1c3RfYl8zZF92NGkxNl9jbGFtcCwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52NGkxNi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzNkX3Y0aTE2X3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTE2LnRyYXAKKyAgICBudnZtX3N1c3RfYl8zZF92NGkxNl96ZXJvLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52NGkxNi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfM2RfdjRpMzJfY2xhbXAsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpMzIuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8zZF92NGkzMl90cmFwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52NGkzMi50cmFwCisgICAgbnZ2bV9zdXN0X2JfM2RfdjRpMzJfemVybywgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpMzIuemVybworICAgIG52dm1fc3VzdF9iXzNkX3Y0aThfY2xhbXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTguY2xhbXAKKyAgICBudnZtX3N1c3RfYl8zZF92NGk4X3RyYXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52NGk4LnRyYXAKKyAgICBudnZtX3N1c3RfYl8zZF92NGk4X3plcm8sICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52NGk4Lnplcm8KKyAgICBudnZtX3N1c3RfcF8xZF9hcnJheV9pMTZfdHJhcCwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS5pMTYudHJhcAorICAgIG52dm1fc3VzdF9wXzFkX2FycmF5X2kzMl90cmFwLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LmkzMi50cmFwCisgICAgbnZ2bV9zdXN0X3BfMWRfYXJyYXlfaThfdHJhcCwgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkuaTgudHJhcAorICAgIG52dm1fc3VzdF9wXzFkX2FycmF5X3YyaTE2X3RyYXAsICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LnYyaTE2LnRyYXAKKyAgICBudnZtX3N1c3RfcF8xZF9hcnJheV92MmkzMl90cmFwLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS52MmkzMi50cmFwCisgICAgbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjJpOF90cmFwLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjJpOC50cmFwCisgICAgbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjRpMTZfdHJhcCwgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjRpMTYudHJhcAorICAgIG52dm1fc3VzdF9wXzFkX2FycmF5X3Y0aTMyX3RyYXAsICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LnY0aTMyLnRyYXAKKyAgICBudnZtX3N1c3RfcF8xZF9hcnJheV92NGk4X3RyYXAsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS52NGk4LnRyYXAKKyAgICBudnZtX3N1c3RfcF8xZF9pMTZfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4xZC5pMTYudHJhcAorICAgIG52dm1fc3VzdF9wXzFkX2kzMl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLmkzMi50cmFwCisgICAgbnZ2bV9zdXN0X3BfMWRfaThfdHJhcCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuaTgudHJhcAorICAgIG52dm1fc3VzdF9wXzFkX3YyaTE2X3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLnYyaTE2LnRyYXAKKyAgICBudnZtX3N1c3RfcF8xZF92MmkzMl90cmFwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4xZC52MmkzMi50cmFwCisgICAgbnZ2bV9zdXN0X3BfMWRfdjJpOF90cmFwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQudjJpOC50cmFwCisgICAgbnZ2bV9zdXN0X3BfMWRfdjRpMTZfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQudjRpMTYudHJhcAorICAgIG52dm1fc3VzdF9wXzFkX3Y0aTMyX3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLnY0aTMyLnRyYXAKKyAgICBudnZtX3N1c3RfcF8xZF92NGk4X3RyYXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4xZC52NGk4LnRyYXAKKyAgICBudnZtX3N1c3RfcF8yZF9hcnJheV9pMTZfdHJhcCwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS5pMTYudHJhcAorICAgIG52dm1fc3VzdF9wXzJkX2FycmF5X2kzMl90cmFwLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LmkzMi50cmFwCisgICAgbnZ2bV9zdXN0X3BfMmRfYXJyYXlfaThfdHJhcCwgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkuaTgudHJhcAorICAgIG52dm1fc3VzdF9wXzJkX2FycmF5X3YyaTE2X3RyYXAsICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LnYyaTE2LnRyYXAKKyAgICBudnZtX3N1c3RfcF8yZF9hcnJheV92MmkzMl90cmFwLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS52MmkzMi50cmFwCisgICAgbnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjJpOF90cmFwLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjJpOC50cmFwCisgICAgbnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjRpMTZfdHJhcCwgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjRpMTYudHJhcAorICAgIG52dm1fc3VzdF9wXzJkX2FycmF5X3Y0aTMyX3RyYXAsICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LnY0aTMyLnRyYXAKKyAgICBudnZtX3N1c3RfcF8yZF9hcnJheV92NGk4X3RyYXAsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS52NGk4LnRyYXAKKyAgICBudnZtX3N1c3RfcF8yZF9pMTZfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4yZC5pMTYudHJhcAorICAgIG52dm1fc3VzdF9wXzJkX2kzMl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLmkzMi50cmFwCisgICAgbnZ2bV9zdXN0X3BfMmRfaThfdHJhcCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuaTgudHJhcAorICAgIG52dm1fc3VzdF9wXzJkX3YyaTE2X3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLnYyaTE2LnRyYXAKKyAgICBudnZtX3N1c3RfcF8yZF92MmkzMl90cmFwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4yZC52MmkzMi50cmFwCisgICAgbnZ2bV9zdXN0X3BfMmRfdjJpOF90cmFwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQudjJpOC50cmFwCisgICAgbnZ2bV9zdXN0X3BfMmRfdjRpMTZfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQudjRpMTYudHJhcAorICAgIG52dm1fc3VzdF9wXzJkX3Y0aTMyX3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLnY0aTMyLnRyYXAKKyAgICBudnZtX3N1c3RfcF8yZF92NGk4X3RyYXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4yZC52NGk4LnRyYXAKKyAgICBudnZtX3N1c3RfcF8zZF9pMTZfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4zZC5pMTYudHJhcAorICAgIG52dm1fc3VzdF9wXzNkX2kzMl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjNkLmkzMi50cmFwCisgICAgbnZ2bV9zdXN0X3BfM2RfaThfdHJhcCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuM2QuaTgudHJhcAorICAgIG52dm1fc3VzdF9wXzNkX3YyaTE2X3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjNkLnYyaTE2LnRyYXAKKyAgICBudnZtX3N1c3RfcF8zZF92MmkzMl90cmFwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4zZC52MmkzMi50cmFwCisgICAgbnZ2bV9zdXN0X3BfM2RfdjJpOF90cmFwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuM2QudjJpOC50cmFwCisgICAgbnZ2bV9zdXN0X3BfM2RfdjRpMTZfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuM2QudjRpMTYudHJhcAorICAgIG52dm1fc3VzdF9wXzNkX3Y0aTMyX3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjNkLnY0aTMyLnRyYXAKKyAgICBudnZtX3N1c3RfcF8zZF92NGk4X3RyYXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4zZC52NGk4LnRyYXAKKyAgICBudnZtX3N3YXBfbG9faGlfYjY0LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN3YXAubG8uaGkuYjY0CisgICAgbnZ2bV90ZXhfMWRfYXJyYXlfZ3JhZF92NGYzMl9mMzIsICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkuZ3JhZC52NGYzMi5mMzIKKyAgICBudnZtX3RleF8xZF9hcnJheV9ncmFkX3Y0czMyX2YzMiwgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS5ncmFkLnY0czMyLmYzMgorICAgIG52dm1fdGV4XzFkX2FycmF5X2dyYWRfdjR1MzJfZjMyLCAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LjFkLmFycmF5LmdyYWQudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfMWRfYXJyYXlfbGV2ZWxfdjRmMzJfZjMyLCAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkubGV2ZWwudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfMWRfYXJyYXlfbGV2ZWxfdjRzMzJfZjMyLCAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkubGV2ZWwudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfMWRfYXJyYXlfbGV2ZWxfdjR1MzJfZjMyLCAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkubGV2ZWwudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfMWRfYXJyYXlfdjRmMzJfZjMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfMWRfYXJyYXlfdjRmMzJfczMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjRmMzIuczMyCisgICAgbnZ2bV90ZXhfMWRfYXJyYXlfdjRzMzJfZjMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfMWRfYXJyYXlfdjRzMzJfczMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjRzMzIuczMyCisgICAgbnZ2bV90ZXhfMWRfYXJyYXlfdjR1MzJfZjMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfMWRfYXJyYXlfdjR1MzJfczMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjR1MzIuczMyCisgICAgbnZ2bV90ZXhfMWRfZ3JhZF92NGYzMl9mMzIsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQuZ3JhZC52NGYzMi5mMzIKKyAgICBudnZtX3RleF8xZF9ncmFkX3Y0czMyX2YzMiwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC5ncmFkLnY0czMyLmYzMgorICAgIG52dm1fdGV4XzFkX2dyYWRfdjR1MzJfZjMyLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LjFkLmdyYWQudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfMWRfbGV2ZWxfdjRmMzJfZjMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQubGV2ZWwudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfMWRfbGV2ZWxfdjRzMzJfZjMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQubGV2ZWwudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfMWRfbGV2ZWxfdjR1MzJfZjMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQubGV2ZWwudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfMWRfdjRmMzJfZjMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfMWRfdjRmMzJfczMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQudjRmMzIuczMyCisgICAgbnZ2bV90ZXhfMWRfdjRzMzJfZjMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfMWRfdjRzMzJfczMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQudjRzMzIuczMyCisgICAgbnZ2bV90ZXhfMWRfdjR1MzJfZjMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfMWRfdjR1MzJfczMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQudjR1MzIuczMyCisgICAgbnZ2bV90ZXhfMmRfYXJyYXlfZ3JhZF92NGYzMl9mMzIsICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkuZ3JhZC52NGYzMi5mMzIKKyAgICBudnZtX3RleF8yZF9hcnJheV9ncmFkX3Y0czMyX2YzMiwgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS5ncmFkLnY0czMyLmYzMgorICAgIG52dm1fdGV4XzJkX2FycmF5X2dyYWRfdjR1MzJfZjMyLCAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LjJkLmFycmF5LmdyYWQudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfMmRfYXJyYXlfbGV2ZWxfdjRmMzJfZjMyLCAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkubGV2ZWwudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfMmRfYXJyYXlfbGV2ZWxfdjRzMzJfZjMyLCAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkubGV2ZWwudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfMmRfYXJyYXlfbGV2ZWxfdjR1MzJfZjMyLCAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkubGV2ZWwudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfMmRfYXJyYXlfdjRmMzJfZjMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfMmRfYXJyYXlfdjRmMzJfczMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjRmMzIuczMyCisgICAgbnZ2bV90ZXhfMmRfYXJyYXlfdjRzMzJfZjMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfMmRfYXJyYXlfdjRzMzJfczMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjRzMzIuczMyCisgICAgbnZ2bV90ZXhfMmRfYXJyYXlfdjR1MzJfZjMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfMmRfYXJyYXlfdjR1MzJfczMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjR1MzIuczMyCisgICAgbnZ2bV90ZXhfMmRfZ3JhZF92NGYzMl9mMzIsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQuZ3JhZC52NGYzMi5mMzIKKyAgICBudnZtX3RleF8yZF9ncmFkX3Y0czMyX2YzMiwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC5ncmFkLnY0czMyLmYzMgorICAgIG52dm1fdGV4XzJkX2dyYWRfdjR1MzJfZjMyLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LjJkLmdyYWQudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfMmRfbGV2ZWxfdjRmMzJfZjMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQubGV2ZWwudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfMmRfbGV2ZWxfdjRzMzJfZjMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQubGV2ZWwudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfMmRfbGV2ZWxfdjR1MzJfZjMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQubGV2ZWwudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfMmRfdjRmMzJfZjMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfMmRfdjRmMzJfczMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQudjRmMzIuczMyCisgICAgbnZ2bV90ZXhfMmRfdjRzMzJfZjMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfMmRfdjRzMzJfczMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQudjRzMzIuczMyCisgICAgbnZ2bV90ZXhfMmRfdjR1MzJfZjMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfMmRfdjR1MzJfczMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQudjR1MzIuczMyCisgICAgbnZ2bV90ZXhfM2RfZ3JhZF92NGYzMl9mMzIsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguM2QuZ3JhZC52NGYzMi5mMzIKKyAgICBudnZtX3RleF8zZF9ncmFkX3Y0czMyX2YzMiwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4zZC5ncmFkLnY0czMyLmYzMgorICAgIG52dm1fdGV4XzNkX2dyYWRfdjR1MzJfZjMyLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LjNkLmdyYWQudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfM2RfbGV2ZWxfdjRmMzJfZjMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguM2QubGV2ZWwudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfM2RfbGV2ZWxfdjRzMzJfZjMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguM2QubGV2ZWwudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfM2RfbGV2ZWxfdjR1MzJfZjMyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguM2QubGV2ZWwudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfM2RfdjRmMzJfZjMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguM2QudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfM2RfdjRmMzJfczMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguM2QudjRmMzIuczMyCisgICAgbnZ2bV90ZXhfM2RfdjRzMzJfZjMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguM2QudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfM2RfdjRzMzJfczMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguM2QudjRzMzIuczMyCisgICAgbnZ2bV90ZXhfM2RfdjR1MzJfZjMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguM2QudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfM2RfdjR1MzJfczMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguM2QudjR1MzIuczMyCisgICAgbnZ2bV90ZXhfY3ViZV9hcnJheV9sZXZlbF92NGYzMl9mMzIsICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguY3ViZS5hcnJheS5sZXZlbC52NGYzMi5mMzIKKyAgICBudnZtX3RleF9jdWJlX2FycmF5X2xldmVsX3Y0czMyX2YzMiwgICAgICAgLy8gbGx2bS5udnZtLnRleC5jdWJlLmFycmF5LmxldmVsLnY0czMyLmYzMgorICAgIG52dm1fdGV4X2N1YmVfYXJyYXlfbGV2ZWxfdjR1MzJfZjMyLCAgICAgICAvLyBsbHZtLm52dm0udGV4LmN1YmUuYXJyYXkubGV2ZWwudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfY3ViZV9hcnJheV92NGYzMl9mMzIsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguY3ViZS5hcnJheS52NGYzMi5mMzIKKyAgICBudnZtX3RleF9jdWJlX2FycmF5X3Y0czMyX2YzMiwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC5jdWJlLmFycmF5LnY0czMyLmYzMgorICAgIG52dm1fdGV4X2N1YmVfYXJyYXlfdjR1MzJfZjMyLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LmN1YmUuYXJyYXkudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfY3ViZV9sZXZlbF92NGYzMl9mMzIsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguY3ViZS5sZXZlbC52NGYzMi5mMzIKKyAgICBudnZtX3RleF9jdWJlX2xldmVsX3Y0czMyX2YzMiwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC5jdWJlLmxldmVsLnY0czMyLmYzMgorICAgIG52dm1fdGV4X2N1YmVfbGV2ZWxfdjR1MzJfZjMyLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LmN1YmUubGV2ZWwudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfY3ViZV92NGYzMl9mMzIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguY3ViZS52NGYzMi5mMzIKKyAgICBudnZtX3RleF9jdWJlX3Y0czMyX2YzMiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC5jdWJlLnY0czMyLmYzMgorICAgIG52dm1fdGV4X2N1YmVfdjR1MzJfZjMyLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LmN1YmUudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV9ncmFkX3Y0ZjMyX2YzMiwgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS5ncmFkLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMWRfYXJyYXlfZ3JhZF92NHMzMl9mMzIsICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkuZ3JhZC52NHMzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzFkX2FycmF5X2dyYWRfdjR1MzJfZjMyLCAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LmdyYWQudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV9sZXZlbF92NGYzMl9mMzIsICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkubGV2ZWwudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV9sZXZlbF92NHMzMl9mMzIsICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkubGV2ZWwudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV9sZXZlbF92NHUzMl9mMzIsICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkubGV2ZWwudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV92NGYzMl9mMzIsICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS52NGYzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzFkX2FycmF5X3Y0ZjMyX3MzMiwgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LnY0ZjMyLnMzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMWRfYXJyYXlfdjRzMzJfZjMyLCAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV92NHMzMl9zMzIsICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS52NHMzMi5zMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzFkX2FycmF5X3Y0dTMyX2YzMiwgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LnY0dTMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMWRfYXJyYXlfdjR1MzJfczMyLCAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkudjR1MzIuczMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8xZF9ncmFkX3Y0ZjMyX2YzMiwgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5ncmFkLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMWRfZ3JhZF92NHMzMl9mMzIsICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuZ3JhZC52NHMzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzFkX2dyYWRfdjR1MzJfZjMyLCAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmdyYWQudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8xZF9sZXZlbF92NGYzMl9mMzIsICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5sZXZlbC52NGYzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzFkX2xldmVsX3Y0czMyX2YzMiwgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmxldmVsLnY0czMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMWRfbGV2ZWxfdjR1MzJfZjMyLCAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQubGV2ZWwudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8xZF92NGYzMl9mMzIsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC52NGYzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzFkX3Y0ZjMyX3MzMiwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLnY0ZjMyLnMzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMWRfdjRzMzJfZjMyLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8xZF92NHMzMl9zMzIsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC52NHMzMi5zMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzFkX3Y0dTMyX2YzMiwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLnY0dTMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMWRfdjR1MzJfczMyLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQudjR1MzIuczMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV9ncmFkX3Y0ZjMyX2YzMiwgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS5ncmFkLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMmRfYXJyYXlfZ3JhZF92NHMzMl9mMzIsICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkuZ3JhZC52NHMzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzJkX2FycmF5X2dyYWRfdjR1MzJfZjMyLCAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LmdyYWQudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV9sZXZlbF92NGYzMl9mMzIsICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkubGV2ZWwudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV9sZXZlbF92NHMzMl9mMzIsICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkubGV2ZWwudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV9sZXZlbF92NHUzMl9mMzIsICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkubGV2ZWwudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV92NGYzMl9mMzIsICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS52NGYzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzJkX2FycmF5X3Y0ZjMyX3MzMiwgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LnY0ZjMyLnMzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMmRfYXJyYXlfdjRzMzJfZjMyLCAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV92NHMzMl9zMzIsICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS52NHMzMi5zMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzJkX2FycmF5X3Y0dTMyX2YzMiwgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LnY0dTMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMmRfYXJyYXlfdjR1MzJfczMyLCAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkudjR1MzIuczMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8yZF9ncmFkX3Y0ZjMyX2YzMiwgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5ncmFkLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMmRfZ3JhZF92NHMzMl9mMzIsICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuZ3JhZC52NHMzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzJkX2dyYWRfdjR1MzJfZjMyLCAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmdyYWQudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8yZF9sZXZlbF92NGYzMl9mMzIsICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5sZXZlbC52NGYzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzJkX2xldmVsX3Y0czMyX2YzMiwgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmxldmVsLnY0czMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMmRfbGV2ZWxfdjR1MzJfZjMyLCAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQubGV2ZWwudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8yZF92NGYzMl9mMzIsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC52NGYzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzJkX3Y0ZjMyX3MzMiwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0ZjMyLnMzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMmRfdjRzMzJfZjMyLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8yZF92NHMzMl9zMzIsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC52NHMzMi5zMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzJkX3Y0dTMyX2YzMiwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0dTMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMmRfdjR1MzJfczMyLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQudjR1MzIuczMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8zZF9ncmFkX3Y0ZjMyX2YzMiwgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC5ncmFkLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfM2RfZ3JhZF92NHMzMl9mMzIsICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QuZ3JhZC52NHMzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzNkX2dyYWRfdjR1MzJfZjMyLCAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmdyYWQudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8zZF9sZXZlbF92NGYzMl9mMzIsICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC5sZXZlbC52NGYzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzNkX2xldmVsX3Y0czMyX2YzMiwgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmxldmVsLnY0czMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfM2RfbGV2ZWxfdjR1MzJfZjMyLCAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QubGV2ZWwudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8zZF92NGYzMl9mMzIsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC52NGYzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzNkX3Y0ZjMyX3MzMiwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjNkLnY0ZjMyLnMzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfM2RfdjRzMzJfZjMyLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8zZF92NHMzMl9zMzIsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC52NHMzMi5zMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzNkX3Y0dTMyX2YzMiwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjNkLnY0dTMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfM2RfdjR1MzJfczMyLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QudjR1MzIuczMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF9jdWJlX2FycmF5X2xldmVsX3Y0ZjMyX2YzMiwgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLmFycmF5LmxldmVsLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfY3ViZV9hcnJheV9sZXZlbF92NHMzMl9mMzIsICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS5sZXZlbC52NHMzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkX2N1YmVfYXJyYXlfbGV2ZWxfdjR1MzJfZjMyLCAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUuYXJyYXkubGV2ZWwudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF9jdWJlX2FycmF5X3Y0ZjMyX2YzMiwgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLmFycmF5LnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfY3ViZV9hcnJheV92NHMzMl9mMzIsICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS52NHMzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkX2N1YmVfYXJyYXlfdjR1MzJfZjMyLCAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUuYXJyYXkudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF9jdWJlX2xldmVsX3Y0ZjMyX2YzMiwgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLmxldmVsLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfY3ViZV9sZXZlbF92NHMzMl9mMzIsICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5sZXZlbC52NHMzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkX2N1YmVfbGV2ZWxfdjR1MzJfZjMyLCAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUubGV2ZWwudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF9jdWJlX3Y0ZjMyX2YzMiwgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfY3ViZV92NHMzMl9mMzIsICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS52NHMzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkX2N1YmVfdjR1MzJfZjMyLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhzdXJmX2hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXhzdXJmLmhhbmRsZQorICAgIG52dm1fdGV4c3VyZl9oYW5kbGVfaW50ZXJuYWwsICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4c3VyZi5oYW5kbGUuaW50ZXJuYWwKKyAgICBudnZtX3RsZDRfYV8yZF92NGYzMl9mMzIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQuYS4yZC52NGYzMi5mMzIKKyAgICBudnZtX3RsZDRfYV8yZF92NHMzMl9mMzIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQuYS4yZC52NHMzMi5mMzIKKyAgICBudnZtX3RsZDRfYV8yZF92NHUzMl9mMzIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQuYS4yZC52NHUzMi5mMzIKKyAgICBudnZtX3RsZDRfYl8yZF92NGYzMl9mMzIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQuYi4yZC52NGYzMi5mMzIKKyAgICBudnZtX3RsZDRfYl8yZF92NHMzMl9mMzIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQuYi4yZC52NHMzMi5mMzIKKyAgICBudnZtX3RsZDRfYl8yZF92NHUzMl9mMzIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQuYi4yZC52NHUzMi5mMzIKKyAgICBudnZtX3RsZDRfZ18yZF92NGYzMl9mMzIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQuZy4yZC52NGYzMi5mMzIKKyAgICBudnZtX3RsZDRfZ18yZF92NHMzMl9mMzIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQuZy4yZC52NHMzMi5mMzIKKyAgICBudnZtX3RsZDRfZ18yZF92NHUzMl9mMzIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQuZy4yZC52NHUzMi5mMzIKKyAgICBudnZtX3RsZDRfcl8yZF92NGYzMl9mMzIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQuci4yZC52NGYzMi5mMzIKKyAgICBudnZtX3RsZDRfcl8yZF92NHMzMl9mMzIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQuci4yZC52NHMzMi5mMzIKKyAgICBudnZtX3RsZDRfcl8yZF92NHUzMl9mMzIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQuci4yZC52NHUzMi5mMzIKKyAgICBudnZtX3RsZDRfdW5pZmllZF9hXzJkX3Y0ZjMyX2YzMiwgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQudW5pZmllZC5hLjJkLnY0ZjMyLmYzMgorICAgIG52dm1fdGxkNF91bmlmaWVkX2FfMmRfdjRzMzJfZjMyLCAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC51bmlmaWVkLmEuMmQudjRzMzIuZjMyCisgICAgbnZ2bV90bGQ0X3VuaWZpZWRfYV8yZF92NHUzMl9mMzIsICAgICAgICAgIC8vIGxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuYS4yZC52NHUzMi5mMzIKKyAgICBudnZtX3RsZDRfdW5pZmllZF9iXzJkX3Y0ZjMyX2YzMiwgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQudW5pZmllZC5iLjJkLnY0ZjMyLmYzMgorICAgIG52dm1fdGxkNF91bmlmaWVkX2JfMmRfdjRzMzJfZjMyLCAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC51bmlmaWVkLmIuMmQudjRzMzIuZjMyCisgICAgbnZ2bV90bGQ0X3VuaWZpZWRfYl8yZF92NHUzMl9mMzIsICAgICAgICAgIC8vIGxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuYi4yZC52NHUzMi5mMzIKKyAgICBudnZtX3RsZDRfdW5pZmllZF9nXzJkX3Y0ZjMyX2YzMiwgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQudW5pZmllZC5nLjJkLnY0ZjMyLmYzMgorICAgIG52dm1fdGxkNF91bmlmaWVkX2dfMmRfdjRzMzJfZjMyLCAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC51bmlmaWVkLmcuMmQudjRzMzIuZjMyCisgICAgbnZ2bV90bGQ0X3VuaWZpZWRfZ18yZF92NHUzMl9mMzIsICAgICAgICAgIC8vIGxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuZy4yZC52NHUzMi5mMzIKKyAgICBudnZtX3RsZDRfdW5pZmllZF9yXzJkX3Y0ZjMyX2YzMiwgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQudW5pZmllZC5yLjJkLnY0ZjMyLmYzMgorICAgIG52dm1fdGxkNF91bmlmaWVkX3JfMmRfdjRzMzJfZjMyLCAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC51bmlmaWVkLnIuMmQudjRzMzIuZjMyCisgICAgbnZ2bV90bGQ0X3VuaWZpZWRfcl8yZF92NHUzMl9mMzIsICAgICAgICAgIC8vIGxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuci4yZC52NHUzMi5mMzIKKyAgICBudnZtX3RydW5jX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRydW5jLmQKKyAgICBudnZtX3RydW5jX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRydW5jLmYKKyAgICBudnZtX3RydW5jX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRydW5jLmZ0ei5mCisgICAgbnZ2bV90eHFfYXJyYXlfc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50eHEuYXJyYXkuc2l6ZQorICAgIG52dm1fdHhxX2NoYW5uZWxfZGF0YV90eXBlLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udHhxLmNoYW5uZWwuZGF0YS50eXBlCisgICAgbnZ2bV90eHFfY2hhbm5lbF9vcmRlciwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50eHEuY2hhbm5lbC5vcmRlcgorICAgIG52dm1fdHhxX2RlcHRoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udHhxLmRlcHRoCisgICAgbnZ2bV90eHFfaGVpZ2h0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50eHEuaGVpZ2h0CisgICAgbnZ2bV90eHFfbnVtX21pcG1hcF9sZXZlbHMsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50eHEubnVtLm1pcG1hcC5sZXZlbHMKKyAgICBudnZtX3R4cV9udW1fc2FtcGxlcywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnR4cS5udW0uc2FtcGxlcworICAgIG52dm1fdHhxX3dpZHRoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udHhxLndpZHRoCisgICAgbnZ2bV91aTJkX3JtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS51aTJkLnJtCisgICAgbnZ2bV91aTJkX3JuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS51aTJkLnJuCisgICAgbnZ2bV91aTJkX3JwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS51aTJkLnJwCisgICAgbnZ2bV91aTJkX3J6LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS51aTJkLnJ6CisgICAgbnZ2bV91aTJmX3JtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS51aTJmLnJtCisgICAgbnZ2bV91aTJmX3JuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS51aTJmLnJuCisgICAgbnZ2bV91aTJmX3JwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS51aTJmLnJwCisgICAgbnZ2bV91aTJmX3J6LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS51aTJmLnJ6CisgICAgbnZ2bV91bGwyZF9ybSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS51bGwyZC5ybQorICAgIG52dm1fdWxsMmRfcm4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udWxsMmQucm4KKyAgICBudnZtX3VsbDJkX3JwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnVsbDJkLnJwCisgICAgbnZ2bV91bGwyZF9yeiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS51bGwyZC5yegorICAgIG52dm1fdWxsMmZfcm0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udWxsMmYucm0KKyAgICBudnZtX3VsbDJmX3JuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnVsbDJmLnJuCisgICAgbnZ2bV91bGwyZl9ycCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS51bGwyZi5ycAorICAgIG52dm1fdWxsMmZfcnosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udWxsMmYucnoKKyAgICBudnZtX3ZvdGVfYWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnZvdGUuYWxsCisgICAgbnZ2bV92b3RlX2FsbF9zeW5jLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS52b3RlLmFsbC5zeW5jCisgICAgbnZ2bV92b3RlX2FueSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS52b3RlLmFueQorICAgIG52dm1fdm90ZV9hbnlfc3luYywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udm90ZS5hbnkuc3luYworICAgIG52dm1fdm90ZV9iYWxsb3QsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udm90ZS5iYWxsb3QKKyAgICBudnZtX3ZvdGVfYmFsbG90X3N5bmMsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnZvdGUuYmFsbG90LnN5bmMKKyAgICBudnZtX3ZvdGVfdW5pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnZvdGUudW5pCisgICAgbnZ2bV92b3RlX3VuaV9zeW5jLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS52b3RlLnVuaS5zeW5jCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9sb2FkX2FfZjE2X2NvbCwgICAgICAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmEuY29sLmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbG9hZF9hX2YxNl9jb2xfc3RyaWRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYS5jb2wuc3RyaWRlLmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbG9hZF9hX2YxNl9yb3csICAgICAgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5hLnJvdy5mMTYKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X2xvYWRfYV9mMTZfcm93X3N0cmlkZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmEucm93LnN0cmlkZS5mMTYKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X2xvYWRfYl9mMTZfY29sLCAgICAgICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYi5jb2wuZjE2CisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9sb2FkX2JfZjE2X2NvbF9zdHJpZGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5iLmNvbC5zdHJpZGUuZjE2CisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9sb2FkX2JfZjE2X3JvdywgICAgICAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmIucm93LmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbG9hZF9iX2YxNl9yb3dfc3RyaWRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYi5yb3cuc3RyaWRlLmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbG9hZF9jX2YxNl9jb2wsICAgICAgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5jLmNvbC5mMTYKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X2xvYWRfY19mMzJfY29sLCAgICAgICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYy5jb2wuZjMyCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9sb2FkX2NfZjE2X2NvbF9zdHJpZGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5jLmNvbC5zdHJpZGUuZjE2CisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9sb2FkX2NfZjMyX2NvbF9zdHJpZGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5jLmNvbC5zdHJpZGUuZjMyCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9sb2FkX2NfZjE2X3JvdywgICAgICAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmMucm93LmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbG9hZF9jX2YzMl9yb3csICAgICAgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5jLnJvdy5mMzIKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X2xvYWRfY19mMTZfcm93X3N0cmlkZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmMucm93LnN0cmlkZS5mMTYKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X2xvYWRfY19mMzJfcm93X3N0cmlkZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmMucm93LnN0cmlkZS5mMzIKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9jb2xfY29sX2YxNl9mMTYsICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wuY29sLmYxNi5mMTYKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9jb2xfY29sX2YxNl9mMTZfc2F0ZmluaXRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wuY29sLmYxNi5mMTYuc2F0ZmluaXRlCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfY29sX2NvbF9mMTZfZjMyLCAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLmNvbC5mMTYuZjMyCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfY29sX2NvbF9mMTZfZjMyX3NhdGZpbml0ZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLmNvbC5mMTYuZjMyLnNhdGZpbml0ZQorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX2NvbF9jb2xfZjMyX2YxNiwgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5jb2wuZjMyLmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX2NvbF9jb2xfZjMyX2YxNl9zYXRmaW5pdGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5jb2wuZjMyLmYxNi5zYXRmaW5pdGUKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9jb2xfY29sX2YzMl9mMzIsICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wuY29sLmYzMi5mMzIKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9jb2xfY29sX2YzMl9mMzJfc2F0ZmluaXRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wuY29sLmYzMi5mMzIuc2F0ZmluaXRlCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfY29sX3Jvd19mMTZfZjE2LCAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLnJvdy5mMTYuZjE2CisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfY29sX3Jvd19mMTZfZjE2X3NhdGZpbml0ZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLnJvdy5mMTYuZjE2LnNhdGZpbml0ZQorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX2NvbF9yb3dfZjE2X2YzMiwgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5yb3cuZjE2LmYzMgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX2NvbF9yb3dfZjE2X2YzMl9zYXRmaW5pdGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5yb3cuZjE2LmYzMi5zYXRmaW5pdGUKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9jb2xfcm93X2YzMl9mMTYsICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wucm93LmYzMi5mMTYKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9jb2xfcm93X2YzMl9mMTZfc2F0ZmluaXRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wucm93LmYzMi5mMTYuc2F0ZmluaXRlCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfY29sX3Jvd19mMzJfZjMyLCAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLnJvdy5mMzIuZjMyCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfY29sX3Jvd19mMzJfZjMyX3NhdGZpbml0ZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLnJvdy5mMzIuZjMyLnNhdGZpbml0ZQorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX3Jvd19jb2xfZjE2X2YxNiwgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5jb2wuZjE2LmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX3Jvd19jb2xfZjE2X2YxNl9zYXRmaW5pdGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5jb2wuZjE2LmYxNi5zYXRmaW5pdGUKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9yb3dfY29sX2YxNl9mMzIsICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cuY29sLmYxNi5mMzIKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9yb3dfY29sX2YxNl9mMzJfc2F0ZmluaXRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cuY29sLmYxNi5mMzIuc2F0ZmluaXRlCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfcm93X2NvbF9mMzJfZjE2LCAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMzIuZjE2CisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfcm93X2NvbF9mMzJfZjE2X3NhdGZpbml0ZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMzIuZjE2LnNhdGZpbml0ZQorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX3Jvd19jb2xfZjMyX2YzMiwgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5jb2wuZjMyLmYzMgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX3Jvd19jb2xfZjMyX2YzMl9zYXRmaW5pdGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5jb2wuZjMyLmYzMi5zYXRmaW5pdGUKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9yb3dfcm93X2YxNl9mMTYsICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cucm93LmYxNi5mMTYKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9yb3dfcm93X2YxNl9mMTZfc2F0ZmluaXRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cucm93LmYxNi5mMTYuc2F0ZmluaXRlCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfcm93X3Jvd19mMTZfZjMyLCAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LnJvdy5mMTYuZjMyCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfcm93X3Jvd19mMTZfZjMyX3NhdGZpbml0ZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LnJvdy5mMTYuZjMyLnNhdGZpbml0ZQorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX3Jvd19yb3dfZjMyX2YxNiwgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5yb3cuZjMyLmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX3Jvd19yb3dfZjMyX2YxNl9zYXRmaW5pdGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5yb3cuZjMyLmYxNi5zYXRmaW5pdGUKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9yb3dfcm93X2YzMl9mMzIsICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cucm93LmYzMi5mMzIKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9yb3dfcm93X2YzMl9mMzJfc2F0ZmluaXRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cucm93LmYzMi5mMzIuc2F0ZmluaXRlCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9zdG9yZV9kX2YxNl9jb2wsICAgICAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5zdG9yZS5kLmNvbC5mMTYKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X3N0b3JlX2RfZjMyX2NvbCwgICAgICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LnN0b3JlLmQuY29sLmYzMgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfc3RvcmVfZF9mMTZfY29sX3N0cmlkZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5zdG9yZS5kLmNvbC5zdHJpZGUuZjE2CisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9zdG9yZV9kX2YzMl9jb2xfc3RyaWRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LnN0b3JlLmQuY29sLnN0cmlkZS5mMzIKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X3N0b3JlX2RfZjE2X3JvdywgICAgICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LnN0b3JlLmQucm93LmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfc3RvcmVfZF9mMzJfcm93LCAgICAgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYuc3RvcmUuZC5yb3cuZjMyCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9zdG9yZV9kX2YxNl9yb3dfc3RyaWRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LnN0b3JlLmQucm93LnN0cmlkZS5mMTYKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X3N0b3JlX2RfZjMyX3Jvd19zdHJpZGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYuc3RvcmUuZC5yb3cuc3RyaWRlLmYzMgorICAgIHBwY19hbHRpdmVjX2NyeXB0b192Y2lwaGVyLCAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52Y2lwaGVyCisgICAgcHBjX2FsdGl2ZWNfY3J5cHRvX3ZjaXBoZXJsYXN0LCAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZjaXBoZXJsYXN0CisgICAgcHBjX2FsdGl2ZWNfY3J5cHRvX3ZuY2lwaGVyLCAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZuY2lwaGVyCisgICAgcHBjX2FsdGl2ZWNfY3J5cHRvX3ZuY2lwaGVybGFzdCwgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZuY2lwaGVybGFzdAorICAgIHBwY19hbHRpdmVjX2NyeXB0b192cGVybXhvciwgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52cGVybXhvcgorICAgIHBwY19hbHRpdmVjX2NyeXB0b192cG1zdW1iLCAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52cG1zdW1iCisgICAgcHBjX2FsdGl2ZWNfY3J5cHRvX3ZwbXN1bWQsICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZwbXN1bWQKKyAgICBwcGNfYWx0aXZlY19jcnlwdG9fdnBtc3VtaCwgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udnBtc3VtaAorICAgIHBwY19hbHRpdmVjX2NyeXB0b192cG1zdW13LCAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52cG1zdW13CisgICAgcHBjX2FsdGl2ZWNfY3J5cHRvX3ZzYm94LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZzYm94CisgICAgcHBjX2FsdGl2ZWNfY3J5cHRvX3ZzaGFzaWdtYWQsICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZzaGFzaWdtYWQKKyAgICBwcGNfYWx0aXZlY19jcnlwdG9fdnNoYXNpZ21hdywgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udnNoYXNpZ21hdworICAgIHBwY19hbHRpdmVjX2RzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLmRzcworICAgIHBwY19hbHRpdmVjX2Rzc2FsbCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLmRzc2FsbAorICAgIHBwY19hbHRpdmVjX2RzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLmRzdAorICAgIHBwY19hbHRpdmVjX2RzdHN0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLmRzdHN0CisgICAgcHBjX2FsdGl2ZWNfZHN0c3R0LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuZHN0c3R0CisgICAgcHBjX2FsdGl2ZWNfZHN0dCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuZHN0dAorICAgIHBwY19hbHRpdmVjX2x2ZWJ4LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLmx2ZWJ4CisgICAgcHBjX2FsdGl2ZWNfbHZlaHgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMubHZlaHgKKyAgICBwcGNfYWx0aXZlY19sdmV3eCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy5sdmV3eAorICAgIHBwY19hbHRpdmVjX2x2c2wsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLmx2c2wKKyAgICBwcGNfYWx0aXZlY19sdnNyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy5sdnNyCisgICAgcHBjX2FsdGl2ZWNfbHZ4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMubHZ4CisgICAgcHBjX2FsdGl2ZWNfbHZ4bCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMubHZ4bAorICAgIHBwY19hbHRpdmVjX21mdnNjciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLm1mdnNjcgorICAgIHBwY19hbHRpdmVjX210dnNjciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLm10dnNjcgorICAgIHBwY19hbHRpdmVjX3N0dmVieCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnN0dmVieAorICAgIHBwY19hbHRpdmVjX3N0dmVoeCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnN0dmVoeAorICAgIHBwY19hbHRpdmVjX3N0dmV3eCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnN0dmV3eAorICAgIHBwY19hbHRpdmVjX3N0dngsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnN0dngKKyAgICBwcGNfYWx0aXZlY19zdHZ4bCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy5zdHZ4bAorICAgIHBwY19hbHRpdmVjX3ZhYnNkdWIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhYnNkdWIKKyAgICBwcGNfYWx0aXZlY192YWJzZHVoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52YWJzZHVoCisgICAgcHBjX2FsdGl2ZWNfdmFic2R1dywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmFic2R1dworICAgIHBwY19hbHRpdmVjX3ZhZGRjdXEsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhZGRjdXEKKyAgICBwcGNfYWx0aXZlY192YWRkY3V3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52YWRkY3V3CisgICAgcHBjX2FsdGl2ZWNfdmFkZGVjdXEsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmFkZGVjdXEKKyAgICBwcGNfYWx0aXZlY192YWRkZXVxbSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52YWRkZXVxbQorICAgIHBwY19hbHRpdmVjX3ZhZGRzYnMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhZGRzYnMKKyAgICBwcGNfYWx0aXZlY192YWRkc2hzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52YWRkc2hzCisgICAgcHBjX2FsdGl2ZWNfdmFkZHN3cywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmFkZHN3cworICAgIHBwY19hbHRpdmVjX3ZhZGR1YnMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhZGR1YnMKKyAgICBwcGNfYWx0aXZlY192YWRkdWhzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52YWRkdWhzCisgICAgcHBjX2FsdGl2ZWNfdmFkZHV3cywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmFkZHV3cworICAgIHBwY19hbHRpdmVjX3ZhdmdzYiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhdmdzYgorICAgIHBwY19hbHRpdmVjX3ZhdmdzaCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhdmdzaAorICAgIHBwY19hbHRpdmVjX3ZhdmdzdywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhdmdzdworICAgIHBwY19hbHRpdmVjX3Zhdmd1YiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhdmd1YgorICAgIHBwY19hbHRpdmVjX3Zhdmd1aCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhdmd1aAorICAgIHBwY19hbHRpdmVjX3Zhdmd1dywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhdmd1dworICAgIHBwY19hbHRpdmVjX3ZicGVybXEsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZicGVybXEKKyAgICBwcGNfYWx0aXZlY192Y2ZzeCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y2ZzeAorICAgIHBwY19hbHRpdmVjX3ZjZnV4LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjZnV4CisgICAgcHBjX2FsdGl2ZWNfdmNsemxzYmIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNsemxzYmIKKyAgICBwcGNfYWx0aXZlY192Y21wYmZwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wYmZwCisgICAgcHBjX2FsdGl2ZWNfdmNtcGJmcF9wLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGJmcC5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcGVxZnAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGVxZnAKKyAgICBwcGNfYWx0aXZlY192Y21wZXFmcF9wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZXFmcC5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcGVxdWIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGVxdWIKKyAgICBwcGNfYWx0aXZlY192Y21wZXF1Yl9wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1Yi5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcGVxdWQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGVxdWQKKyAgICBwcGNfYWx0aXZlY192Y21wZXF1ZF9wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1ZC5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcGVxdWgsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGVxdWgKKyAgICBwcGNfYWx0aXZlY192Y21wZXF1aF9wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1aC5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcGVxdXcsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGVxdXcKKyAgICBwcGNfYWx0aXZlY192Y21wZXF1d19wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1dy5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcGdlZnAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGdlZnAKKyAgICBwcGNfYWx0aXZlY192Y21wZ2VmcF9wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ2VmcC5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcGd0ZnAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0ZnAKKyAgICBwcGNfYWx0aXZlY192Y21wZ3RmcF9wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RmcC5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcGd0c2IsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0c2IKKyAgICBwcGNfYWx0aXZlY192Y21wZ3RzYl9wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzYi5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcGd0c2QsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0c2QKKyAgICBwcGNfYWx0aXZlY192Y21wZ3RzZF9wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzZC5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcGd0c2gsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0c2gKKyAgICBwcGNfYWx0aXZlY192Y21wZ3RzaF9wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzaC5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcGd0c3csICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0c3cKKyAgICBwcGNfYWx0aXZlY192Y21wZ3Rzd19wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3Rzdy5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcGd0dWIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0dWIKKyAgICBwcGNfYWx0aXZlY192Y21wZ3R1Yl9wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1Yi5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcGd0dWQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0dWQKKyAgICBwcGNfYWx0aXZlY192Y21wZ3R1ZF9wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1ZC5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcGd0dWgsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0dWgKKyAgICBwcGNfYWx0aXZlY192Y21wZ3R1aF9wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1aC5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcGd0dXcsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0dXcKKyAgICBwcGNfYWx0aXZlY192Y21wZ3R1d19wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1dy5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcG5lYiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcG5lYgorICAgIHBwY19hbHRpdmVjX3ZjbXBuZWJfcCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZWIucAorICAgIHBwY19hbHRpdmVjX3ZjbXBuZWgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZWgKKyAgICBwcGNfYWx0aXZlY192Y21wbmVoX3AsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmVoLnAKKyAgICBwcGNfYWx0aXZlY192Y21wbmV3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmV3CisgICAgcHBjX2FsdGl2ZWNfdmNtcG5ld19wLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcG5ldy5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcG5lemIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcG5lemIKKyAgICBwcGNfYWx0aXZlY192Y21wbmV6Yl9wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmV6Yi5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcG5lemgsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcG5lemgKKyAgICBwcGNfYWx0aXZlY192Y21wbmV6aF9wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmV6aC5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcG5lencsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcG5lencKKyAgICBwcGNfYWx0aXZlY192Y21wbmV6d19wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmV6dy5wCisgICAgcHBjX2FsdGl2ZWNfdmN0c3hzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmN0c3hzCisgICAgcHBjX2FsdGl2ZWNfdmN0dXhzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmN0dXhzCisgICAgcHBjX2FsdGl2ZWNfdmN0emxzYmIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmN0emxzYmIKKyAgICBwcGNfYWx0aXZlY192ZXhwdGVmcCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52ZXhwdGVmcAorICAgIHBwY19hbHRpdmVjX3ZnYmJkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZnYmJkCisgICAgcHBjX2FsdGl2ZWNfdmxvZ2VmcCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmxvZ2VmcAorICAgIHBwY19hbHRpdmVjX3ZtYWRkZnAsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtYWRkZnAKKyAgICBwcGNfYWx0aXZlY192bWF4ZnAsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWF4ZnAKKyAgICBwcGNfYWx0aXZlY192bWF4c2IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWF4c2IKKyAgICBwcGNfYWx0aXZlY192bWF4c2QsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWF4c2QKKyAgICBwcGNfYWx0aXZlY192bWF4c2gsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWF4c2gKKyAgICBwcGNfYWx0aXZlY192bWF4c3csICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWF4c3cKKyAgICBwcGNfYWx0aXZlY192bWF4dWIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWF4dWIKKyAgICBwcGNfYWx0aXZlY192bWF4dWQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWF4dWQKKyAgICBwcGNfYWx0aXZlY192bWF4dWgsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWF4dWgKKyAgICBwcGNfYWx0aXZlY192bWF4dXcsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWF4dXcKKyAgICBwcGNfYWx0aXZlY192bWhhZGRzaHMsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWhhZGRzaHMKKyAgICBwcGNfYWx0aXZlY192bWhyYWRkc2hzLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWhyYWRkc2hzCisgICAgcHBjX2FsdGl2ZWNfdm1pbmZwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1pbmZwCisgICAgcHBjX2FsdGl2ZWNfdm1pbnNiLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1pbnNiCisgICAgcHBjX2FsdGl2ZWNfdm1pbnNkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1pbnNkCisgICAgcHBjX2FsdGl2ZWNfdm1pbnNoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1pbnNoCisgICAgcHBjX2FsdGl2ZWNfdm1pbnN3LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1pbnN3CisgICAgcHBjX2FsdGl2ZWNfdm1pbnViLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1pbnViCisgICAgcHBjX2FsdGl2ZWNfdm1pbnVkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1pbnVkCisgICAgcHBjX2FsdGl2ZWNfdm1pbnVoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1pbnVoCisgICAgcHBjX2FsdGl2ZWNfdm1pbnV3LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1pbnV3CisgICAgcHBjX2FsdGl2ZWNfdm1sYWRkdWhtLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1sYWRkdWhtCisgICAgcHBjX2FsdGl2ZWNfdm1zdW1tYm0sICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1zdW1tYm0KKyAgICBwcGNfYWx0aXZlY192bXN1bXNobSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXN1bXNobQorICAgIHBwY19hbHRpdmVjX3Ztc3Vtc2hzLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtc3Vtc2hzCisgICAgcHBjX2FsdGl2ZWNfdm1zdW11Ym0sICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1zdW11Ym0KKyAgICBwcGNfYWx0aXZlY192bXN1bXVobSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXN1bXVobQorICAgIHBwY19hbHRpdmVjX3Ztc3VtdWhzLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtc3VtdWhzCisgICAgcHBjX2FsdGl2ZWNfdm11bGVzYiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm11bGVzYgorICAgIHBwY19hbHRpdmVjX3ZtdWxlc2gsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxlc2gKKyAgICBwcGNfYWx0aXZlY192bXVsZXN3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsZXN3CisgICAgcHBjX2FsdGl2ZWNfdm11bGV1YiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm11bGV1YgorICAgIHBwY19hbHRpdmVjX3ZtdWxldWgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxldWgKKyAgICBwcGNfYWx0aXZlY192bXVsZXV3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsZXV3CisgICAgcHBjX2FsdGl2ZWNfdm11bG9zYiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm11bG9zYgorICAgIHBwY19hbHRpdmVjX3ZtdWxvc2gsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxvc2gKKyAgICBwcGNfYWx0aXZlY192bXVsb3N3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsb3N3CisgICAgcHBjX2FsdGl2ZWNfdm11bG91YiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm11bG91YgorICAgIHBwY19hbHRpdmVjX3ZtdWxvdWgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxvdWgKKyAgICBwcGNfYWx0aXZlY192bXVsb3V3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsb3V3CisgICAgcHBjX2FsdGl2ZWNfdm5tc3ViZnAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm5tc3ViZnAKKyAgICBwcGNfYWx0aXZlY192cGVybSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cGVybQorICAgIHBwY19hbHRpdmVjX3Zwa3B4LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwa3B4CisgICAgcHBjX2FsdGl2ZWNfdnBrc2RzcywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnBrc2RzcworICAgIHBwY19hbHRpdmVjX3Zwa3NkdXMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwa3NkdXMKKyAgICBwcGNfYWx0aXZlY192cGtzaHNzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cGtzaHNzCisgICAgcHBjX2FsdGl2ZWNfdnBrc2h1cywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnBrc2h1cworICAgIHBwY19hbHRpdmVjX3Zwa3N3c3MsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwa3N3c3MKKyAgICBwcGNfYWx0aXZlY192cGtzd3VzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cGtzd3VzCisgICAgcHBjX2FsdGl2ZWNfdnBrdWR1cywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnBrdWR1cworICAgIHBwY19hbHRpdmVjX3Zwa3VodXMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwa3VodXMKKyAgICBwcGNfYWx0aXZlY192cGt1d3VzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cGt1d3VzCisgICAgcHBjX2FsdGl2ZWNfdnBydHliZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnBydHliZAorICAgIHBwY19hbHRpdmVjX3ZwcnR5YnEsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwcnR5YnEKKyAgICBwcGNfYWx0aXZlY192cHJ0eWJ3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cHJ0eWJ3CisgICAgcHBjX2FsdGl2ZWNfdnJlZnAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnJlZnAKKyAgICBwcGNfYWx0aXZlY192cmZpbSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmZpbQorICAgIHBwY19hbHRpdmVjX3ZyZmluLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZyZmluCisgICAgcHBjX2FsdGl2ZWNfdnJmaXAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnJmaXAKKyAgICBwcGNfYWx0aXZlY192cmZpeiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmZpegorICAgIHBwY19hbHRpdmVjX3ZybGIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZybGIKKyAgICBwcGNfYWx0aXZlY192cmxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmxkCisgICAgcHBjX2FsdGl2ZWNfdnJsZG1pLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnJsZG1pCisgICAgcHBjX2FsdGl2ZWNfdnJsZG5tLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnJsZG5tCisgICAgcHBjX2FsdGl2ZWNfdnJsaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnJsaAorICAgIHBwY19hbHRpdmVjX3ZybHcsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZybHcKKyAgICBwcGNfYWx0aXZlY192cmx3bWksICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmx3bWkKKyAgICBwcGNfYWx0aXZlY192cmx3bm0sICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmx3bm0KKyAgICBwcGNfYWx0aXZlY192cnNxcnRlZnAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cnNxcnRlZnAKKyAgICBwcGNfYWx0aXZlY192c2VsLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c2VsCisgICAgcHBjX2FsdGl2ZWNfdnNsLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNsCisgICAgcHBjX2FsdGl2ZWNfdnNsYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNsYgorICAgIHBwY19hbHRpdmVjX3ZzbGgsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzbGgKKyAgICBwcGNfYWx0aXZlY192c2xvLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c2xvCisgICAgcHBjX2FsdGl2ZWNfdnNsdiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNsdgorICAgIHBwY19hbHRpdmVjX3ZzbHcsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzbHcKKyAgICBwcGNfYWx0aXZlY192c3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3IKKyAgICBwcGNfYWx0aXZlY192c3JhYiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3JhYgorICAgIHBwY19hbHRpdmVjX3ZzcmFoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzcmFoCisgICAgcHBjX2FsdGl2ZWNfdnNyYXcsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNyYXcKKyAgICBwcGNfYWx0aXZlY192c3JiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3JiCisgICAgcHBjX2FsdGl2ZWNfdnNyaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNyaAorICAgIHBwY19hbHRpdmVjX3Zzcm8sICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzcm8KKyAgICBwcGNfYWx0aXZlY192c3J2LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3J2CisgICAgcHBjX2FsdGl2ZWNfdnNydywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNydworICAgIHBwY19hbHRpdmVjX3ZzdWJjdXEsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdWJjdXEKKyAgICBwcGNfYWx0aXZlY192c3ViY3V3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3ViY3V3CisgICAgcHBjX2FsdGl2ZWNfdnN1YmVjdXEsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnN1YmVjdXEKKyAgICBwcGNfYWx0aXZlY192c3ViZXVxbSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3ViZXVxbQorICAgIHBwY19hbHRpdmVjX3ZzdWJzYnMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdWJzYnMKKyAgICBwcGNfYWx0aXZlY192c3Vic2hzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3Vic2hzCisgICAgcHBjX2FsdGl2ZWNfdnN1YnN3cywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnN1YnN3cworICAgIHBwY19hbHRpdmVjX3ZzdWJ1YnMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdWJ1YnMKKyAgICBwcGNfYWx0aXZlY192c3VidWhzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3VidWhzCisgICAgcHBjX2FsdGl2ZWNfdnN1YnV3cywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnN1YnV3cworICAgIHBwY19hbHRpdmVjX3ZzdW0yc3dzLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdW0yc3dzCisgICAgcHBjX2FsdGl2ZWNfdnN1bTRzYnMsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnN1bTRzYnMKKyAgICBwcGNfYWx0aXZlY192c3VtNHNocywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3VtNHNocworICAgIHBwY19hbHRpdmVjX3ZzdW00dWJzLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdW00dWJzCisgICAgcHBjX2FsdGl2ZWNfdnN1bXN3cywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnN1bXN3cworICAgIHBwY19hbHRpdmVjX3Z1cGtocHgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZ1cGtocHgKKyAgICBwcGNfYWx0aXZlY192dXBraHNiLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52dXBraHNiCisgICAgcHBjX2FsdGl2ZWNfdnVwa2hzaCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnVwa2hzaAorICAgIHBwY19hbHRpdmVjX3Z1cGtoc3csICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZ1cGtoc3cKKyAgICBwcGNfYWx0aXZlY192dXBrbHB4LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52dXBrbHB4CisgICAgcHBjX2FsdGl2ZWNfdnVwa2xzYiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnVwa2xzYgorICAgIHBwY19hbHRpdmVjX3Z1cGtsc2gsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZ1cGtsc2gKKyAgICBwcGNfYWx0aXZlY192dXBrbHN3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52dXBrbHN3CisgICAgcHBjX2JwZXJtZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmJwZXJtZAorICAgIHBwY19jZmVuY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5jZmVuY2UKKyAgICBwcGNfZGNiYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuZGNiYQorICAgIHBwY19kY2JmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5kY2JmCisgICAgcHBjX2RjYmksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmRjYmkKKyAgICBwcGNfZGNic3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuZGNic3QKKyAgICBwcGNfZGNidCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuZGNidAorICAgIHBwY19kY2J0c3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5kY2J0c3QKKyAgICBwcGNfZGNieiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuZGNiegorICAgIHBwY19kY2J6bCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5kY2J6bAorICAgIHBwY19kaXZkZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5kaXZkZQorICAgIHBwY19kaXZkZXUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5kaXZkZXUKKyAgICBwcGNfZGl2d2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuZGl2d2UKKyAgICBwcGNfZGl2d2V1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuZGl2d2V1CisgICAgcHBjX2dldF90ZXhhc3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmdldC50ZXhhc3IKKyAgICBwcGNfZ2V0X3RleGFzcnUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuZ2V0LnRleGFzcnUKKyAgICBwcGNfZ2V0X3RmaGFyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuZ2V0LnRmaGFyCisgICAgcHBjX2dldF90ZmlhciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmdldC50ZmlhcgorICAgIHBwY19pc19kZWNyZW1lbnRlZF9jdHJfbm9uemVybywgICAgICAgICAgICAvLyBsbHZtLnBwYy5pcy5kZWNyZW1lbnRlZC5jdHIubm9uemVybworICAgIHBwY19sd3N5bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5sd3N5bmMKKyAgICBwcGNfbXRjdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMubXRjdHIKKyAgICBwcGNfcXB4X3F2ZmFicywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZmFicworICAgIHBwY19xcHhfcXZmYWRkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmYWRkCisgICAgcHBjX3FweF9xdmZhZGRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZhZGRzCisgICAgcHBjX3FweF9xdmZjZmlkLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZjZmlkCisgICAgcHBjX3FweF9xdmZjZmlkcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZjZmlkcworICAgIHBwY19xcHhfcXZmY2ZpZHUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmY2ZpZHUKKyAgICBwcGNfcXB4X3F2ZmNmaWR1cywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZmNmaWR1cworICAgIHBwY19xcHhfcXZmY21wZXEsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmY21wZXEKKyAgICBwcGNfcXB4X3F2ZmNtcGd0LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZmNtcGd0CisgICAgcHBjX3FweF9xdmZjbXBsdCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZjbXBsdAorICAgIHBwY19xcHhfcXZmY3BzZ24sICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmY3BzZ24KKyAgICBwcGNfcXB4X3F2ZmN0aWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZmN0aWQKKyAgICBwcGNfcXB4X3F2ZmN0aWR1LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZmN0aWR1CisgICAgcHBjX3FweF9xdmZjdGlkdXosICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZjdGlkdXoKKyAgICBwcGNfcXB4X3F2ZmN0aWR6LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZmN0aWR6CisgICAgcHBjX3FweF9xdmZjdGl3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZjdGl3CisgICAgcHBjX3FweF9xdmZjdGl3dSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZjdGl3dQorICAgIHBwY19xcHhfcXZmY3Rpd3V6LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmY3Rpd3V6CisgICAgcHBjX3FweF9xdmZjdGl3eiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZjdGl3egorICAgIHBwY19xcHhfcXZmbG9naWNhbCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmbG9naWNhbAorICAgIHBwY19xcHhfcXZmbWFkZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmbWFkZAorICAgIHBwY19xcHhfcXZmbWFkZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmbWFkZHMKKyAgICBwcGNfcXB4X3F2Zm1zdWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2Zm1zdWIKKyAgICBwcGNfcXB4X3F2Zm1zdWJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2Zm1zdWJzCisgICAgcHBjX3FweF9xdmZtdWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZtdWwKKyAgICBwcGNfcXB4X3F2Zm11bHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2Zm11bHMKKyAgICBwcGNfcXB4X3F2Zm5hYnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2Zm5hYnMKKyAgICBwcGNfcXB4X3F2Zm5lZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2Zm5lZworICAgIHBwY19xcHhfcXZmbm1hZGQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmbm1hZGQKKyAgICBwcGNfcXB4X3F2Zm5tYWRkcywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2Zm5tYWRkcworICAgIHBwY19xcHhfcXZmbm1zdWIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmbm1zdWIKKyAgICBwcGNfcXB4X3F2Zm5tc3VicywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2Zm5tc3VicworICAgIHBwY19xcHhfcXZmcGVybSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmcGVybQorICAgIHBwY19xcHhfcXZmcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmcmUKKyAgICBwcGNfcXB4X3F2ZnJlcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZnJlcworICAgIHBwY19xcHhfcXZmcmltLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmcmltCisgICAgcHBjX3FweF9xdmZyaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZyaW4KKyAgICBwcGNfcXB4X3F2ZnJpcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZnJpcAorICAgIHBwY19xcHhfcXZmcml6LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmcml6CisgICAgcHBjX3FweF9xdmZyc3AsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZyc3AKKyAgICBwcGNfcXB4X3F2ZnJzcXJ0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZnJzcXJ0ZQorICAgIHBwY19xcHhfcXZmcnNxcnRlcywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmcnNxcnRlcworICAgIHBwY19xcHhfcXZmc2VsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmc2VsCisgICAgcHBjX3FweF9xdmZzdWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZzdWIKKyAgICBwcGNfcXB4X3F2ZnN1YnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZnN1YnMKKyAgICBwcGNfcXB4X3F2ZnRzdG5hbiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZnRzdG5hbgorICAgIHBwY19xcHhfcXZmeG1hZGQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmeG1hZGQKKyAgICBwcGNfcXB4X3F2ZnhtYWRkcywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZnhtYWRkcworICAgIHBwY19xcHhfcXZmeG11bCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmeG11bAorICAgIHBwY19xcHhfcXZmeG11bHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmeG11bHMKKyAgICBwcGNfcXB4X3F2Znh4Y3BubWFkZCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2Znh4Y3BubWFkZAorICAgIHBwY19xcHhfcXZmeHhjcG5tYWRkcywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmeHhjcG5tYWRkcworICAgIHBwY19xcHhfcXZmeHhtYWRkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmeHhtYWRkCisgICAgcHBjX3FweF9xdmZ4eG1hZGRzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZ4eG1hZGRzCisgICAgcHBjX3FweF9xdmZ4eG5wbWFkZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZ4eG5wbWFkZAorICAgIHBwY19xcHhfcXZmeHhucG1hZGRzLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmeHhucG1hZGRzCisgICAgcHBjX3FweF9xdmdwY2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmdwY2kKKyAgICBwcGNfcXB4X3F2bGZjZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2bGZjZAorICAgIHBwY19xcHhfcXZsZmNkYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZsZmNkYQorICAgIHBwY19xcHhfcXZsZmNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZsZmNzCisgICAgcHBjX3FweF9xdmxmY3NhLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmxmY3NhCisgICAgcHBjX3FweF9xdmxmZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmxmZAorICAgIHBwY19xcHhfcXZsZmRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZsZmRhCisgICAgcHBjX3FweF9xdmxmaXdhLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmxmaXdhCisgICAgcHBjX3FweF9xdmxmaXdhYSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmxmaXdhYQorICAgIHBwY19xcHhfcXZsZml3eiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZsZml3egorICAgIHBwY19xcHhfcXZsZml3emEsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZsZml3emEKKyAgICBwcGNfcXB4X3F2bGZzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2bGZzCisgICAgcHBjX3FweF9xdmxmc2EsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmxmc2EKKyAgICBwcGNfcXB4X3F2bHBjbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2bHBjbGQKKyAgICBwcGNfcXB4X3F2bHBjbHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2bHBjbHMKKyAgICBwcGNfcXB4X3F2bHBjcmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2bHBjcmQKKyAgICBwcGNfcXB4X3F2bHBjcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2bHBjcnMKKyAgICBwcGNfcXB4X3F2c3RmY2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2c3RmY2QKKyAgICBwcGNfcXB4X3F2c3RmY2RhLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2c3RmY2RhCisgICAgcHBjX3FweF9xdnN0ZmNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdnN0ZmNzCisgICAgcHBjX3FweF9xdnN0ZmNzYSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdnN0ZmNzYQorICAgIHBwY19xcHhfcXZzdGZkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZzdGZkCisgICAgcHBjX3FweF9xdnN0ZmRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdnN0ZmRhCisgICAgcHBjX3FweF9xdnN0Zml3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdnN0Zml3CisgICAgcHBjX3FweF9xdnN0Zml3YSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdnN0Zml3YQorICAgIHBwY19xcHhfcXZzdGZzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZzdGZzCisgICAgcHBjX3FweF9xdnN0ZnNhLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdnN0ZnNhCisgICAgcHBjX3NldF90ZXhhc3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnNldC50ZXhhc3IKKyAgICBwcGNfc2V0X3RleGFzcnUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuc2V0LnRleGFzcnUKKyAgICBwcGNfc2V0X3RmaGFyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuc2V0LnRmaGFyCisgICAgcHBjX3NldF90ZmlhciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnNldC50ZmlhcgorICAgIHBwY19zeW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5zeW5jCisgICAgcHBjX3RhYm9ydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnRhYm9ydAorICAgIHBwY190YWJvcnRkYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy50YWJvcnRkYworICAgIHBwY190YWJvcnRkY2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy50YWJvcnRkY2kKKyAgICBwcGNfdGFib3J0d2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudGFib3J0d2MKKyAgICBwcGNfdGFib3J0d2NpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudGFib3J0d2NpCisgICAgcHBjX3RiZWdpbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnRiZWdpbgorICAgIHBwY190Y2hlY2ssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy50Y2hlY2sKKyAgICBwcGNfdGVuZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudGVuZAorICAgIHBwY190ZW5kYWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy50ZW5kYWxsCisgICAgcHBjX3RyZWNoa3B0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnRyZWNoa3B0CisgICAgcHBjX3RyZWNsYWltLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnRyZWNsYWltCisgICAgcHBjX3RyZXN1bWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnRyZXN1bWUKKyAgICBwcGNfdHNyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudHNyCisgICAgcHBjX3RzdXNwZW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnRzdXNwZW5kCisgICAgcHBjX3R0ZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnR0ZXN0CisgICAgcHBjX3ZzeF9seHZkMngsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC5seHZkMngKKyAgICBwcGNfdnN4X2x4dmQyeF9iZSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lmx4dmQyeC5iZQorICAgIHBwY192c3hfbHh2bCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gubHh2bAorICAgIHBwY192c3hfbHh2bGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gubHh2bGwKKyAgICBwcGNfdnN4X2x4dnc0eCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lmx4dnc0eAorICAgIHBwY192c3hfbHh2dzR4X2JlLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gubHh2dzR4LmJlCisgICAgcHBjX3ZzeF9zdHh2ZDJ4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC5zdHh2ZDJ4CisgICAgcHBjX3ZzeF9zdHh2ZDJ4X2JlLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC5zdHh2ZDJ4LmJlCisgICAgcHBjX3ZzeF9zdHh2bCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC5zdHh2bAorICAgIHBwY192c3hfc3R4dmxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3guc3R4dmxsCisgICAgcHBjX3ZzeF9zdHh2dzR4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC5zdHh2dzR4CisgICAgcHBjX3ZzeF9zdHh2dzR4X2JlLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC5zdHh2dzR4LmJlCisgICAgcHBjX3ZzeF94c21heGRwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54c21heGRwCisgICAgcHBjX3ZzeF94c21pbmRwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54c21pbmRwCisgICAgcHBjX3ZzeF94dmNtcGVxZHAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmNtcGVxZHAKKyAgICBwcGNfdnN4X3h2Y21wZXFkcF9wLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZXFkcC5wCisgICAgcHBjX3ZzeF94dmNtcGVxc3AsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmNtcGVxc3AKKyAgICBwcGNfdnN4X3h2Y21wZXFzcF9wLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZXFzcC5wCisgICAgcHBjX3ZzeF94dmNtcGdlZHAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmNtcGdlZHAKKyAgICBwcGNfdnN4X3h2Y21wZ2VkcF9wLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZ2VkcC5wCisgICAgcHBjX3ZzeF94dmNtcGdlc3AsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmNtcGdlc3AKKyAgICBwcGNfdnN4X3h2Y21wZ2VzcF9wLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZ2VzcC5wCisgICAgcHBjX3ZzeF94dmNtcGd0ZHAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmNtcGd0ZHAKKyAgICBwcGNfdnN4X3h2Y21wZ3RkcF9wLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZ3RkcC5wCisgICAgcHBjX3ZzeF94dmNtcGd0c3AsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmNtcGd0c3AKKyAgICBwcGNfdnN4X3h2Y21wZ3RzcF9wLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZ3RzcC5wCisgICAgcHBjX3ZzeF94dmN2ZHBzcCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmN2ZHBzcAorICAgIHBwY192c3hfeHZjdmRwc3h3cywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZjdmRwc3h3cworICAgIHBwY192c3hfeHZjdmRwdXh3cywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZjdmRwdXh3cworICAgIHBwY192c3hfeHZjdmhwc3AsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZjdmhwc3AKKyAgICBwcGNfdnN4X3h2Y3ZzcGRwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2Y3ZzcGRwCisgICAgcHBjX3ZzeF94dmN2c3BocCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmN2c3BocAorICAgIHBwY192c3hfeHZjdnN4ZHNwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZjdnN4ZHNwCisgICAgcHBjX3ZzeF94dmN2c3h3ZHAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmN2c3h3ZHAKKyAgICBwcGNfdnN4X3h2Y3Z1eGRzcCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2Y3Z1eGRzcAorICAgIHBwY192c3hfeHZjdnV4d2RwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZjdnV4d2RwCisgICAgcHBjX3ZzeF94dmRpdmRwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmRpdmRwCisgICAgcHBjX3ZzeF94dmRpdnNwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmRpdnNwCisgICAgcHBjX3ZzeF94dmlleHBkcCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmlleHBkcAorICAgIHBwY192c3hfeHZpZXhwc3AsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZpZXhwc3AKKyAgICBwcGNfdnN4X3h2bWF4ZHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2bWF4ZHAKKyAgICBwcGNfdnN4X3h2bWF4c3AsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2bWF4c3AKKyAgICBwcGNfdnN4X3h2bWluZHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2bWluZHAKKyAgICBwcGNfdnN4X3h2bWluc3AsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2bWluc3AKKyAgICBwcGNfdnN4X3h2cmRwaXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2cmRwaXAKKyAgICBwcGNfdnN4X3h2cmVkcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2cmVkcAorICAgIHBwY192c3hfeHZyZXNwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZyZXNwCisgICAgcHBjX3ZzeF94dnJzcGlwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dnJzcGlwCisgICAgcHBjX3ZzeF94dnJzcXJ0ZWRwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dnJzcXJ0ZWRwCisgICAgcHBjX3ZzeF94dnJzcXJ0ZXNwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dnJzcXJ0ZXNwCisgICAgcHBjX3ZzeF94dnRzdGRjZHAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dnRzdGRjZHAKKyAgICBwcGNfdnN4X3h2dHN0ZGNzcCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2dHN0ZGNzcAorICAgIHBwY192c3hfeHZ4ZXhwZHAsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZ4ZXhwZHAKKyAgICBwcGNfdnN4X3h2eGV4cHNwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2eGV4cHNwCisgICAgcHBjX3ZzeF94dnhzaWdkcCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dnhzaWdkcAorICAgIHBwY192c3hfeHZ4c2lnc3AsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZ4c2lnc3AKKyAgICBwcGNfdnN4X3h4ZXh0cmFjdHV3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh4ZXh0cmFjdHV3CisgICAgcHBjX3ZzeF94eGluc2VydHcsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54eGluc2VydHcKKyAgICBwcGNfdnN4X3h4bGVxdiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh4bGVxdgorICAgIHI2MDBfY3ViZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnI2MDAuY3ViZQorICAgIHI2MDBfZ3JvdXBfYmFycmllciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnI2MDAuZ3JvdXAuYmFycmllcgorICAgIHI2MDBfaW1wbGljaXRhcmdfcHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnI2MDAuaW1wbGljaXRhcmcucHRyCisgICAgcjYwMF9yYXRfc3RvcmVfdHlwZWQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucjYwMC5yYXQuc3RvcmUudHlwZWQKKyAgICByNjAwX3JlYWRfZ2xvYmFsX3NpemVfeCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5yNjAwLnJlYWQuZ2xvYmFsLnNpemUueAorICAgIHI2MDBfcmVhZF9nbG9iYWxfc2l6ZV95LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnI2MDAucmVhZC5nbG9iYWwuc2l6ZS55CisgICAgcjYwMF9yZWFkX2dsb2JhbF9zaXplX3osICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucjYwMC5yZWFkLmdsb2JhbC5zaXplLnoKKyAgICByNjAwX3JlYWRfbG9jYWxfc2l6ZV94LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5yNjAwLnJlYWQubG9jYWwuc2l6ZS54CisgICAgcjYwMF9yZWFkX2xvY2FsX3NpemVfeSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucjYwMC5yZWFkLmxvY2FsLnNpemUueQorICAgIHI2MDBfcmVhZF9sb2NhbF9zaXplX3osICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnI2MDAucmVhZC5sb2NhbC5zaXplLnoKKyAgICByNjAwX3JlYWRfbmdyb3Vwc194LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5yNjAwLnJlYWQubmdyb3Vwcy54CisgICAgcjYwMF9yZWFkX25ncm91cHNfeSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucjYwMC5yZWFkLm5ncm91cHMueQorICAgIHI2MDBfcmVhZF9uZ3JvdXBzX3osICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnI2MDAucmVhZC5uZ3JvdXBzLnoKKyAgICByNjAwX3JlYWRfdGdpZF94LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5yNjAwLnJlYWQudGdpZC54CisgICAgcjYwMF9yZWFkX3RnaWRfeSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucjYwMC5yZWFkLnRnaWQueQorICAgIHI2MDBfcmVhZF90Z2lkX3osICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnI2MDAucmVhZC50Z2lkLnoKKyAgICByNjAwX3JlYWRfdGlkaWdfeCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5yNjAwLnJlYWQudGlkaWcueAorICAgIHI2MDBfcmVhZF90aWRpZ195LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnI2MDAucmVhZC50aWRpZy55CisgICAgcjYwMF9yZWFkX3RpZGlnX3osICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucjYwMC5yZWFkLnRpZGlnLnoKKyAgICByNjAwX3JlY2lwc3FydF9jbGFtcGVkLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5yNjAwLnJlY2lwc3FydC5jbGFtcGVkCisgICAgcjYwMF9yZWNpcHNxcnRfaWVlZSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucjYwMC5yZWNpcHNxcnQuaWVlZQorICAgIHMzOTBfZWZwYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAuZWZwYworICAgIHMzOTBfZXRuZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAuZXRuZAorICAgIHMzOTBfbGNiYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAubGNiYgorICAgIHMzOTBfbnRzdGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAubnRzdGcKKyAgICBzMzkwX3BwYV90eGFzc2lzdCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnBwYS50eGFzc2lzdAorICAgIHMzOTBfc2ZwYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAuc2ZwYworICAgIHMzOTBfdGFib3J0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudGFib3J0CisgICAgczM5MF90YmVnaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC50YmVnaW4KKyAgICBzMzkwX3RiZWdpbl9ub2Zsb2F0LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnRiZWdpbi5ub2Zsb2F0CisgICAgczM5MF90YmVnaW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC50YmVnaW5jCisgICAgczM5MF90ZGMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC50ZGMKKyAgICBzMzkwX3RlbmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnRlbmQKKyAgICBzMzkwX3ZhY2NiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZhY2NiCisgICAgczM5MF92YWNjY3EsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52YWNjY3EKKyAgICBzMzkwX3ZhY2NmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZhY2NmCisgICAgczM5MF92YWNjZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52YWNjZworICAgIHMzOTBfdmFjY2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmFjY2gKKyAgICBzMzkwX3ZhY2NxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZhY2NxCisgICAgczM5MF92YWNxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52YWNxCisgICAgczM5MF92YXEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52YXEKKyAgICBzMzkwX3ZhdmdiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZhdmdiCisgICAgczM5MF92YXZnZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52YXZnZgorICAgIHMzOTBfdmF2Z2csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmF2Z2cKKyAgICBzMzkwX3ZhdmdoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZhdmdoCisgICAgczM5MF92YXZnbGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52YXZnbGIKKyAgICBzMzkwX3ZhdmdsZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZhdmdsZgorICAgIHMzOTBfdmF2Z2xnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmF2Z2xnCisgICAgczM5MF92YXZnbGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52YXZnbGgKKyAgICBzMzkwX3ZicGVybSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZicGVybQorICAgIHMzOTBfdmNlcWJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmNlcWJzCisgICAgczM5MF92Y2VxZnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Y2VxZnMKKyAgICBzMzkwX3ZjZXFncywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZjZXFncworICAgIHMzOTBfdmNlcWhzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmNlcWhzCisgICAgczM5MF92Y2hicywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Y2hicworICAgIHMzOTBfdmNoZnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmNoZnMKKyAgICBzMzkwX3ZjaGdzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZjaGdzCisgICAgczM5MF92Y2hocywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Y2hocworICAgIHMzOTBfdmNobGJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmNobGJzCisgICAgczM5MF92Y2hsZnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Y2hsZnMKKyAgICBzMzkwX3ZjaGxncywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZjaGxncworICAgIHMzOTBfdmNobGhzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmNobGhzCisgICAgczM5MF92Y2tzbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Y2tzbQorICAgIHMzOTBfdmVyaW1iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmVyaW1iCisgICAgczM5MF92ZXJpbWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZXJpbWYKKyAgICBzMzkwX3ZlcmltZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZlcmltZworICAgIHMzOTBfdmVyaW1oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmVyaW1oCisgICAgczM5MF92ZXJsbGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZXJsbGIKKyAgICBzMzkwX3ZlcmxsZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZlcmxsZgorICAgIHMzOTBfdmVybGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmVybGxnCisgICAgczM5MF92ZXJsbGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZXJsbGgKKyAgICBzMzkwX3ZlcmxsdmIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZlcmxsdmIKKyAgICBzMzkwX3ZlcmxsdmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZlcmxsdmYKKyAgICBzMzkwX3ZlcmxsdmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZlcmxsdmcKKyAgICBzMzkwX3ZlcmxsdmgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZlcmxsdmgKKyAgICBzMzkwX3ZmYWViLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmYWViCisgICAgczM5MF92ZmFlYnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmFlYnMKKyAgICBzMzkwX3ZmYWVmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmYWVmCisgICAgczM5MF92ZmFlZnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmFlZnMKKyAgICBzMzkwX3ZmYWVoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmYWVoCisgICAgczM5MF92ZmFlaHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmFlaHMKKyAgICBzMzkwX3ZmYWV6YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmYWV6YgorICAgIHMzOTBfdmZhZXpicywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZhZXpicworICAgIHMzOTBfdmZhZXpmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZhZXpmCisgICAgczM5MF92ZmFlemZzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmFlemZzCisgICAgczM5MF92ZmFlemgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmFlemgKKyAgICBzMzkwX3ZmYWV6aHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmYWV6aHMKKyAgICBzMzkwX3ZmY2VkYnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmY2VkYnMKKyAgICBzMzkwX3ZmY2VzYnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmY2VzYnMKKyAgICBzMzkwX3ZmY2hkYnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmY2hkYnMKKyAgICBzMzkwX3ZmY2hlZGJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmY2hlZGJzCisgICAgczM5MF92ZmNoZXNicywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmNoZXNicworICAgIHMzOTBfdmZjaHNicywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZjaHNicworICAgIHMzOTBfdmZlZWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlZWIKKyAgICBzMzkwX3ZmZWVicywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmZWVicworICAgIHMzOTBfdmZlZWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlZWYKKyAgICBzMzkwX3ZmZWVmcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmZWVmcworICAgIHMzOTBfdmZlZWgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlZWgKKyAgICBzMzkwX3ZmZWVocywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmZWVocworICAgIHMzOTBfdmZlZXpiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlZXpiCisgICAgczM5MF92ZmVlemJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmVlemJzCisgICAgczM5MF92ZmVlemYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmVlemYKKyAgICBzMzkwX3ZmZWV6ZnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmZWV6ZnMKKyAgICBzMzkwX3ZmZWV6aCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmZWV6aAorICAgIHMzOTBfdmZlZXpocywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlZXpocworICAgIHMzOTBfdmZlbmViLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlbmViCisgICAgczM5MF92ZmVuZWJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmVuZWJzCisgICAgczM5MF92ZmVuZWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmVuZWYKKyAgICBzMzkwX3ZmZW5lZnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmZW5lZnMKKyAgICBzMzkwX3ZmZW5laCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmZW5laAorICAgIHMzOTBfdmZlbmVocywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlbmVocworICAgIHMzOTBfdmZlbmV6YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlbmV6YgorICAgIHMzOTBfdmZlbmV6YnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlbmV6YnMKKyAgICBzMzkwX3ZmZW5lemYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmZW5lemYKKyAgICBzMzkwX3ZmZW5lemZzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmZW5lemZzCisgICAgczM5MF92ZmVuZXpoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmVuZXpoCisgICAgczM5MF92ZmVuZXpocywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmVuZXpocworICAgIHMzOTBfdmZpZGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZpZGIKKyAgICBzMzkwX3ZmaXNiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmaXNiCisgICAgczM5MF92Zm1heGRiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Zm1heGRiCisgICAgczM5MF92Zm1heHNiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Zm1heHNiCisgICAgczM5MF92Zm1pbmRiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Zm1pbmRiCisgICAgczM5MF92Zm1pbnNiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Zm1pbnNiCisgICAgczM5MF92ZnRjaWRiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZnRjaWRiCisgICAgczM5MF92ZnRjaXNiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZnRjaXNiCisgICAgczM5MF92Z2ZtYWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Z2ZtYWIKKyAgICBzMzkwX3ZnZm1hZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZnZm1hZgorICAgIHMzOTBfdmdmbWFnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmdmbWFnCisgICAgczM5MF92Z2ZtYWgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Z2ZtYWgKKyAgICBzMzkwX3ZnZm1iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZnZm1iCisgICAgczM5MF92Z2ZtZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Z2ZtZgorICAgIHMzOTBfdmdmbWcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmdmbWcKKyAgICBzMzkwX3ZnZm1oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZnZm1oCisgICAgczM5MF92aXN0cmIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52aXN0cmIKKyAgICBzMzkwX3Zpc3RyYnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZpc3RyYnMKKyAgICBzMzkwX3Zpc3RyZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZpc3RyZgorICAgIHMzOTBfdmlzdHJmcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmlzdHJmcworICAgIHMzOTBfdmlzdHJoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmlzdHJoCisgICAgczM5MF92aXN0cmhzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52aXN0cmhzCisgICAgczM5MF92bGJiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bGJiCisgICAgczM5MF92bGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bGwKKyAgICBzMzkwX3ZscmwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZscmwKKyAgICBzMzkwX3ZtYWViLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtYWViCisgICAgczM5MF92bWFlZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWFlZgorICAgIHMzOTBfdm1hZWgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1hZWgKKyAgICBzMzkwX3ZtYWhiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtYWhiCisgICAgczM5MF92bWFoZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWFoZgorICAgIHMzOTBfdm1haGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1haGgKKyAgICBzMzkwX3ZtYWxlYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtYWxlYgorICAgIHMzOTBfdm1hbGVmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1hbGVmCisgICAgczM5MF92bWFsZWgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWFsZWgKKyAgICBzMzkwX3ZtYWxoYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtYWxoYgorICAgIHMzOTBfdm1hbGhmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1hbGhmCisgICAgczM5MF92bWFsaGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWFsaGgKKyAgICBzMzkwX3ZtYWxvYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtYWxvYgorICAgIHMzOTBfdm1hbG9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1hbG9mCisgICAgczM5MF92bWFsb2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWFsb2gKKyAgICBzMzkwX3ZtYW9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtYW9iCisgICAgczM5MF92bWFvZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWFvZgorICAgIHMzOTBfdm1hb2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1hb2gKKyAgICBzMzkwX3ZtZWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtZWIKKyAgICBzMzkwX3ZtZWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtZWYKKyAgICBzMzkwX3ZtZWgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtZWgKKyAgICBzMzkwX3ZtaGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtaGIKKyAgICBzMzkwX3ZtaGYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtaGYKKyAgICBzMzkwX3ZtaGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtaGgKKyAgICBzMzkwX3ZtbGViLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtbGViCisgICAgczM5MF92bWxlZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWxlZgorICAgIHMzOTBfdm1sZWgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1sZWgKKyAgICBzMzkwX3ZtbGhiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtbGhiCisgICAgczM5MF92bWxoZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWxoZgorICAgIHMzOTBfdm1saGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1saGgKKyAgICBzMzkwX3ZtbG9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtbG9iCisgICAgczM5MF92bWxvZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWxvZgorICAgIHMzOTBfdm1sb2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1sb2gKKyAgICBzMzkwX3Ztb2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtb2IKKyAgICBzMzkwX3Ztb2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtb2YKKyAgICBzMzkwX3Ztb2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtb2gKKyAgICBzMzkwX3Ztc2xnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtc2xnCisgICAgczM5MF92cGRpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52cGRpCisgICAgczM5MF92cGVybSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52cGVybQorICAgIHMzOTBfdnBrbHNmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnBrbHNmCisgICAgczM5MF92cGtsc2ZzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52cGtsc2ZzCisgICAgczM5MF92cGtsc2csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52cGtsc2cKKyAgICBzMzkwX3Zwa2xzZ3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZwa2xzZ3MKKyAgICBzMzkwX3Zwa2xzaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZwa2xzaAorICAgIHMzOTBfdnBrbHNocywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnBrbHNocworICAgIHMzOTBfdnBrc2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnBrc2YKKyAgICBzMzkwX3Zwa3NmcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZwa3NmcworICAgIHMzOTBfdnBrc2csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnBrc2cKKyAgICBzMzkwX3Zwa3NncywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZwa3NncworICAgIHMzOTBfdnBrc2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnBrc2gKKyAgICBzMzkwX3Zwa3NocywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZwa3NocworICAgIHMzOTBfdnNiY2JpcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnNiY2JpcQorICAgIHMzOTBfdnNiaXEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnNiaXEKKyAgICBzMzkwX3ZzY2JpYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzY2JpYgorICAgIHMzOTBfdnNjYmlmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnNjYmlmCisgICAgczM5MF92c2NiaWcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c2NiaWcKKyAgICBzMzkwX3ZzY2JpaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzY2JpaAorICAgIHMzOTBfdnNjYmlxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnNjYmlxCisgICAgczM5MF92c2wsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c2wKKyAgICBzMzkwX3ZzbGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzbGIKKyAgICBzMzkwX3ZzbGRiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzbGRiCisgICAgczM5MF92c3EsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c3EKKyAgICBzMzkwX3ZzcmEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzcmEKKyAgICBzMzkwX3ZzcmFiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzcmFiCisgICAgczM5MF92c3JsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c3JsCisgICAgczM5MF92c3JsYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c3JsYgorICAgIHMzOTBfdnN0bCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnN0bAorICAgIHMzOTBfdnN0cmNiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnN0cmNiCisgICAgczM5MF92c3RyY2JzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c3RyY2JzCisgICAgczM5MF92c3RyY2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c3RyY2YKKyAgICBzMzkwX3ZzdHJjZnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzdHJjZnMKKyAgICBzMzkwX3ZzdHJjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzdHJjaAorICAgIHMzOTBfdnN0cmNocywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnN0cmNocworICAgIHMzOTBfdnN0cmN6YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnN0cmN6YgorICAgIHMzOTBfdnN0cmN6YnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnN0cmN6YnMKKyAgICBzMzkwX3ZzdHJjemYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzdHJjemYKKyAgICBzMzkwX3ZzdHJjemZzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzdHJjemZzCisgICAgczM5MF92c3RyY3poLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c3RyY3poCisgICAgczM5MF92c3RyY3pocywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c3RyY3pocworICAgIHMzOTBfdnN0cmwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnN0cmwKKyAgICBzMzkwX3ZzdW1iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzdW1iCisgICAgczM5MF92c3VtZ2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c3VtZ2YKKyAgICBzMzkwX3ZzdW1naCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzdW1naAorICAgIHMzOTBfdnN1bWgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnN1bWgKKyAgICBzMzkwX3ZzdW1xZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzdW1xZgorICAgIHMzOTBfdnN1bXFnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnN1bXFnCisgICAgczM5MF92dG0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52dG0KKyAgICBzMzkwX3Z1cGhiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZ1cGhiCisgICAgczM5MF92dXBoZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52dXBoZgorICAgIHMzOTBfdnVwaGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnVwaGgKKyAgICBzMzkwX3Z1cGxiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZ1cGxiCisgICAgczM5MF92dXBsZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52dXBsZgorICAgIHMzOTBfdnVwbGhiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnVwbGhiCisgICAgczM5MF92dXBsaGYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52dXBsaGYKKyAgICBzMzkwX3Z1cGxoaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZ1cGxoaAorICAgIHMzOTBfdnVwbGh3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnVwbGh3CisgICAgczM5MF92dXBsbGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52dXBsbGIKKyAgICBzMzkwX3Z1cGxsZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZ1cGxsZgorICAgIHMzOTBfdnVwbGxoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnVwbGxoCisgICAgd2FzbV9jdXJyZW50X21lbW9yeSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ud2FzbS5jdXJyZW50Lm1lbW9yeQorICAgIHdhc21fZ2V0X2Voc2VsZWN0b3IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLndhc20uZ2V0LmVoc2VsZWN0b3IKKyAgICB3YXNtX2dldF9leGNlcHRpb24sICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS53YXNtLmdldC5leGNlcHRpb24KKyAgICB3YXNtX2dyb3dfbWVtb3J5LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS53YXNtLmdyb3cubWVtb3J5CisgICAgd2FzbV9tZW1fZ3JvdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ud2FzbS5tZW0uZ3JvdworICAgIHdhc21fbWVtX3NpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLndhc20ubWVtLnNpemUKKyAgICB3YXNtX3JldGhyb3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS53YXNtLnJldGhyb3cKKyAgICB3YXNtX3Rocm93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS53YXNtLnRocm93CisgICAgeDg2XzNkbm93X3Bhdmd1c2IsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LjNkbm93LnBhdmd1c2IKKyAgICB4ODZfM2Rub3dfcGYyaWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3cucGYyaWQKKyAgICB4ODZfM2Rub3dfcGZhY2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3cucGZhY2MKKyAgICB4ODZfM2Rub3dfcGZhZGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3cucGZhZGQKKyAgICB4ODZfM2Rub3dfcGZjbXBlcSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3cucGZjbXBlcQorICAgIHg4Nl8zZG5vd19wZmNtcGdlLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vdy5wZmNtcGdlCisgICAgeDg2XzNkbm93X3BmY21wZ3QsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LjNkbm93LnBmY21wZ3QKKyAgICB4ODZfM2Rub3dfcGZtYXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3cucGZtYXgKKyAgICB4ODZfM2Rub3dfcGZtaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3cucGZtaW4KKyAgICB4ODZfM2Rub3dfcGZtdWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3cucGZtdWwKKyAgICB4ODZfM2Rub3dfcGZyY3AsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3cucGZyY3AKKyAgICB4ODZfM2Rub3dfcGZyY3BpdDEsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3cucGZyY3BpdDEKKyAgICB4ODZfM2Rub3dfcGZyY3BpdDIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3cucGZyY3BpdDIKKyAgICB4ODZfM2Rub3dfcGZyc3FpdDEsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3cucGZyc3FpdDEKKyAgICB4ODZfM2Rub3dfcGZyc3FydCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3cucGZyc3FydAorICAgIHg4Nl8zZG5vd19wZnN1YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vdy5wZnN1YgorICAgIHg4Nl8zZG5vd19wZnN1YnIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vdy5wZnN1YnIKKyAgICB4ODZfM2Rub3dfcGkyZmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3cucGkyZmQKKyAgICB4ODZfM2Rub3dfcG11bGhydywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3cucG11bGhydworICAgIHg4Nl8zZG5vd2FfcGYyaXcsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vd2EucGYyaXcKKyAgICB4ODZfM2Rub3dhX3BmbmFjYywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3dhLnBmbmFjYworICAgIHg4Nl8zZG5vd2FfcGZwbmFjYywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vd2EucGZwbmFjYworICAgIHg4Nl8zZG5vd2FfcGkyZncsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vd2EucGkyZncKKyAgICB4ODZfM2Rub3dhX3Bzd2FwZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3dhLnBzd2FwZAorICAgIHg4Nl9hZGRjYXJyeV91MzIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hZGRjYXJyeS51MzIKKyAgICB4ODZfYWRkY2FycnlfdTY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYWRkY2FycnkudTY0CisgICAgeDg2X2FkZGNhcnJ5eF91MzIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmFkZGNhcnJ5eC51MzIKKyAgICB4ODZfYWRkY2Fycnl4X3U2NCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYWRkY2Fycnl4LnU2NAorICAgIHg4Nl9hZXNuaV9hZXNkZWMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hZXNuaS5hZXNkZWMKKyAgICB4ODZfYWVzbmlfYWVzZGVjXzI1NiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYWVzbmkuYWVzZGVjLjI1NgorICAgIHg4Nl9hZXNuaV9hZXNkZWNfNTEyLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hZXNuaS5hZXNkZWMuNTEyCisgICAgeDg2X2Flc25pX2Flc2RlY2xhc3QsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmFlc25pLmFlc2RlY2xhc3QKKyAgICB4ODZfYWVzbmlfYWVzZGVjbGFzdF8yNTYsICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYWVzbmkuYWVzZGVjbGFzdC4yNTYKKyAgICB4ODZfYWVzbmlfYWVzZGVjbGFzdF81MTIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYWVzbmkuYWVzZGVjbGFzdC41MTIKKyAgICB4ODZfYWVzbmlfYWVzZW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYWVzbmkuYWVzZW5jCisgICAgeDg2X2Flc25pX2Flc2VuY18yNTYsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmFlc25pLmFlc2VuYy4yNTYKKyAgICB4ODZfYWVzbmlfYWVzZW5jXzUxMiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYWVzbmkuYWVzZW5jLjUxMgorICAgIHg4Nl9hZXNuaV9hZXNlbmNsYXN0LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hZXNuaS5hZXNlbmNsYXN0CisgICAgeDg2X2Flc25pX2Flc2VuY2xhc3RfMjU2LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmFlc25pLmFlc2VuY2xhc3QuMjU2CisgICAgeDg2X2Flc25pX2Flc2VuY2xhc3RfNTEyLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmFlc25pLmFlc2VuY2xhc3QuNTEyCisgICAgeDg2X2Flc25pX2Flc2ltYywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmFlc25pLmFlc2ltYworICAgIHg4Nl9hZXNuaV9hZXNrZXlnZW5hc3Npc3QsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hZXNuaS5hZXNrZXlnZW5hc3Npc3QKKyAgICB4ODZfYXZ4X2FkZHN1Yl9wZF8yNTYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LmFkZHN1Yi5wZC4yNTYKKyAgICB4ODZfYXZ4X2FkZHN1Yl9wc18yNTYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LmFkZHN1Yi5wcy4yNTYKKyAgICB4ODZfYXZ4X2JsZW5kdl9wZF8yNTYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LmJsZW5kdi5wZC4yNTYKKyAgICB4ODZfYXZ4X2JsZW5kdl9wc18yNTYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LmJsZW5kdi5wcy4yNTYKKyAgICB4ODZfYXZ4X2NtcF9wZF8yNTYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LmNtcC5wZC4yNTYKKyAgICB4ODZfYXZ4X2NtcF9wc18yNTYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LmNtcC5wcy4yNTYKKyAgICB4ODZfYXZ4X2N2dF9wZDJfcHNfMjU2LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LmN2dC5wZDIucHMuMjU2CisgICAgeDg2X2F2eF9jdnRfcGQyZHFfMjU2LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5jdnQucGQyZHEuMjU2CisgICAgeDg2X2F2eF9jdnRfcHMyZHFfMjU2LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5jdnQucHMyZHEuMjU2CisgICAgeDg2X2F2eF9jdnRkcTJfcHNfMjU2LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5jdnRkcTIucHMuMjU2CisgICAgeDg2X2F2eF9jdnR0X3BkMmRxXzI1NiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5jdnR0LnBkMmRxLjI1NgorICAgIHg4Nl9hdnhfY3Z0dF9wczJkcV8yNTYsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdnguY3Z0dC5wczJkcS4yNTYKKyAgICB4ODZfYXZ4X2RwX3BzXzI1NiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LmRwLnBzLjI1NgorICAgIHg4Nl9hdnhfaGFkZF9wZF8yNTYsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdnguaGFkZC5wZC4yNTYKKyAgICB4ODZfYXZ4X2hhZGRfcHNfMjU2LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LmhhZGQucHMuMjU2CisgICAgeDg2X2F2eF9oc3ViX3BkXzI1NiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5oc3ViLnBkLjI1NgorICAgIHg4Nl9hdnhfaHN1Yl9wc18yNTYsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdnguaHN1Yi5wcy4yNTYKKyAgICB4ODZfYXZ4X2xkdV9kcV8yNTYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LmxkdS5kcS4yNTYKKyAgICB4ODZfYXZ4X21hc2tsb2FkX3BkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Lm1hc2tsb2FkLnBkCisgICAgeDg2X2F2eF9tYXNrbG9hZF9wZF8yNTYsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5tYXNrbG9hZC5wZC4yNTYKKyAgICB4ODZfYXZ4X21hc2tsb2FkX3BzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Lm1hc2tsb2FkLnBzCisgICAgeDg2X2F2eF9tYXNrbG9hZF9wc18yNTYsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5tYXNrbG9hZC5wcy4yNTYKKyAgICB4ODZfYXZ4X21hc2tzdG9yZV9wZCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Lm1hc2tzdG9yZS5wZAorICAgIHg4Nl9hdnhfbWFza3N0b3JlX3BkXzI1NiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngubWFza3N0b3JlLnBkLjI1NgorICAgIHg4Nl9hdnhfbWFza3N0b3JlX3BzLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngubWFza3N0b3JlLnBzCisgICAgeDg2X2F2eF9tYXNrc3RvcmVfcHNfMjU2LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5tYXNrc3RvcmUucHMuMjU2CisgICAgeDg2X2F2eF9tYXhfcGRfMjU2LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5tYXgucGQuMjU2CisgICAgeDg2X2F2eF9tYXhfcHNfMjU2LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5tYXgucHMuMjU2CisgICAgeDg2X2F2eF9taW5fcGRfMjU2LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5taW4ucGQuMjU2CisgICAgeDg2X2F2eF9taW5fcHNfMjU2LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5taW4ucHMuMjU2CisgICAgeDg2X2F2eF9tb3Ztc2tfcGRfMjU2LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5tb3Ztc2sucGQuMjU2CisgICAgeDg2X2F2eF9tb3Ztc2tfcHNfMjU2LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5tb3Ztc2sucHMuMjU2CisgICAgeDg2X2F2eF9wdGVzdGNfMjU2LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5wdGVzdGMuMjU2CisgICAgeDg2X2F2eF9wdGVzdG56Y18yNTYsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5wdGVzdG56Yy4yNTYKKyAgICB4ODZfYXZ4X3B0ZXN0el8yNTYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnB0ZXN0ei4yNTYKKyAgICB4ODZfYXZ4X3JjcF9wc18yNTYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnJjcC5wcy4yNTYKKyAgICB4ODZfYXZ4X3JvdW5kX3BkXzI1NiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnJvdW5kLnBkLjI1NgorICAgIHg4Nl9hdnhfcm91bmRfcHNfMjU2LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngucm91bmQucHMuMjU2CisgICAgeDg2X2F2eF9yc3FydF9wc18yNTYsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5yc3FydC5wcy4yNTYKKyAgICB4ODZfYXZ4X3NxcnRfcGRfMjU2LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnNxcnQucGQuMjU2CisgICAgeDg2X2F2eF9zcXJ0X3BzXzI1NiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5zcXJ0LnBzLjI1NgorICAgIHg4Nl9hdnhfdnBlcm1pbHZhcl9wZCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngudnBlcm1pbHZhci5wZAorICAgIHg4Nl9hdnhfdnBlcm1pbHZhcl9wZF8yNTYsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngudnBlcm1pbHZhci5wZC4yNTYKKyAgICB4ODZfYXZ4X3ZwZXJtaWx2YXJfcHMsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnZwZXJtaWx2YXIucHMKKyAgICB4ODZfYXZ4X3ZwZXJtaWx2YXJfcHNfMjU2LCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnZwZXJtaWx2YXIucHMuMjU2CisgICAgeDg2X2F2eF92dGVzdGNfcGQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC52dGVzdGMucGQKKyAgICB4ODZfYXZ4X3Z0ZXN0Y19wZF8yNTYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0Yy5wZC4yNTYKKyAgICB4ODZfYXZ4X3Z0ZXN0Y19wcywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0Yy5wcworICAgIHg4Nl9hdnhfdnRlc3RjX3BzXzI1NiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngudnRlc3RjLnBzLjI1NgorICAgIHg4Nl9hdnhfdnRlc3RuemNfcGQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngudnRlc3RuemMucGQKKyAgICB4ODZfYXZ4X3Z0ZXN0bnpjX3BkXzI1NiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0bnpjLnBkLjI1NgorICAgIHg4Nl9hdnhfdnRlc3RuemNfcHMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngudnRlc3RuemMucHMKKyAgICB4ODZfYXZ4X3Z0ZXN0bnpjX3BzXzI1NiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0bnpjLnBzLjI1NgorICAgIHg4Nl9hdnhfdnRlc3R6X3BkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngudnRlc3R6LnBkCisgICAgeDg2X2F2eF92dGVzdHpfcGRfMjU2LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC52dGVzdHoucGQuMjU2CisgICAgeDg2X2F2eF92dGVzdHpfcHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC52dGVzdHoucHMKKyAgICB4ODZfYXZ4X3Z0ZXN0el9wc18yNTYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0ei5wcy4yNTYKKyAgICB4ODZfYXZ4X3Z6ZXJvYWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnZ6ZXJvYWxsCisgICAgeDg2X2F2eF92emVyb3VwcGVyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC52emVyb3VwcGVyCisgICAgeDg2X2F2eDJfZ2F0aGVyX2RfZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLmQuZAorICAgIHg4Nl9hdngyX2dhdGhlcl9kX2RfMjU2LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5kLmQuMjU2CisgICAgeDg2X2F2eDJfZ2F0aGVyX2RfcGQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLmQucGQKKyAgICB4ODZfYXZ4Ml9nYXRoZXJfZF9wZF8yNTYsICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIuZC5wZC4yNTYKKyAgICB4ODZfYXZ4Ml9nYXRoZXJfZF9wcywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIuZC5wcworICAgIHg4Nl9hdngyX2dhdGhlcl9kX3BzXzI1NiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5kLnBzLjI1NgorICAgIHg4Nl9hdngyX2dhdGhlcl9kX3EsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5kLnEKKyAgICB4ODZfYXZ4Ml9nYXRoZXJfZF9xXzI1NiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIuZC5xLjI1NgorICAgIHg4Nl9hdngyX2dhdGhlcl9xX2QsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5xLmQKKyAgICB4ODZfYXZ4Ml9nYXRoZXJfcV9kXzI1NiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5kLjI1NgorICAgIHg4Nl9hdngyX2dhdGhlcl9xX3BkLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5xLnBkCisgICAgeDg2X2F2eDJfZ2F0aGVyX3FfcGRfMjU2LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLnEucGQuMjU2CisgICAgeDg2X2F2eDJfZ2F0aGVyX3FfcHMsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLnEucHMKKyAgICB4ODZfYXZ4Ml9nYXRoZXJfcV9wc18yNTYsICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5wcy4yNTYKKyAgICB4ODZfYXZ4Ml9nYXRoZXJfcV9xLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5xCisgICAgeDg2X2F2eDJfZ2F0aGVyX3FfcV8yNTYsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLnEucS4yNTYKKyAgICB4ODZfYXZ4Ml9tYXNrbG9hZF9kLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5tYXNrbG9hZC5kCisgICAgeDg2X2F2eDJfbWFza2xvYWRfZF8yNTYsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIubWFza2xvYWQuZC4yNTYKKyAgICB4ODZfYXZ4Ml9tYXNrbG9hZF9xLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5tYXNrbG9hZC5xCisgICAgeDg2X2F2eDJfbWFza2xvYWRfcV8yNTYsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIubWFza2xvYWQucS4yNTYKKyAgICB4ODZfYXZ4Ml9tYXNrc3RvcmVfZCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5tYXNrc3RvcmUuZAorICAgIHg4Nl9hdngyX21hc2tzdG9yZV9kXzI1NiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLm1hc2tzdG9yZS5kLjI1NgorICAgIHg4Nl9hdngyX21hc2tzdG9yZV9xLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLm1hc2tzdG9yZS5xCisgICAgeDg2X2F2eDJfbWFza3N0b3JlX3FfMjU2LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIubWFza3N0b3JlLnEuMjU2CisgICAgeDg2X2F2eDJfbXBzYWRidywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIubXBzYWRidworICAgIHg4Nl9hdngyX3BhY2tzc2R3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBhY2tzc2R3CisgICAgeDg2X2F2eDJfcGFja3Nzd2IsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucGFja3Nzd2IKKyAgICB4ODZfYXZ4Ml9wYWNrdXNkdywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wYWNrdXNkdworICAgIHg4Nl9hdngyX3BhY2t1c3diLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBhY2t1c3diCisgICAgeDg2X2F2eDJfcGFkZHNfYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucGFkZHMuYgorICAgIHg4Nl9hdngyX3BhZGRzX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBhZGRzLncKKyAgICB4ODZfYXZ4Ml9wYWRkdXNfYiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wYWRkdXMuYgorICAgIHg4Nl9hdngyX3BhZGR1c193LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBhZGR1cy53CisgICAgeDg2X2F2eDJfcGJsZW5kdmIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucGJsZW5kdmIKKyAgICB4ODZfYXZ4Ml9wZXJtZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wZXJtZAorICAgIHg4Nl9hdngyX3Blcm1wcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBlcm1wcworICAgIHg4Nl9hdngyX3BoYWRkX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBoYWRkLmQKKyAgICB4ODZfYXZ4Ml9waGFkZF9zdywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5waGFkZC5zdworICAgIHg4Nl9hdngyX3BoYWRkX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBoYWRkLncKKyAgICB4ODZfYXZ4Ml9waHN1Yl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5waHN1Yi5kCisgICAgeDg2X2F2eDJfcGhzdWJfc3csICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucGhzdWIuc3cKKyAgICB4ODZfYXZ4Ml9waHN1Yl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5waHN1Yi53CisgICAgeDg2X2F2eDJfcG1hZGRfdWJfc3csICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucG1hZGQudWIuc3cKKyAgICB4ODZfYXZ4Ml9wbWFkZF93ZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wbWFkZC53ZAorICAgIHg4Nl9hdngyX3Btb3Ztc2tiLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBtb3Ztc2tiCisgICAgeDg2X2F2eDJfcG11bF9kcSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucG11bC5kcQorICAgIHg4Nl9hdngyX3BtdWxfaHJfc3csICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBtdWwuaHIuc3cKKyAgICB4ODZfYXZ4Ml9wbXVsaF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wbXVsaC53CisgICAgeDg2X2F2eDJfcG11bGh1X3csICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucG11bGh1LncKKyAgICB4ODZfYXZ4Ml9wbXVsdV9kcSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wbXVsdS5kcQorICAgIHg4Nl9hdngyX3BzYWRfYncsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzYWQuYncKKyAgICB4ODZfYXZ4Ml9wc2h1Zl9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc2h1Zi5iCisgICAgeDg2X2F2eDJfcHNpZ25fYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNpZ24uYgorICAgIHg4Nl9hdngyX3BzaWduX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzaWduLmQKKyAgICB4ODZfYXZ4Ml9wc2lnbl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc2lnbi53CisgICAgeDg2X2F2eDJfcHNsbF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNsbC5kCisgICAgeDg2X2F2eDJfcHNsbF9xLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNsbC5xCisgICAgeDg2X2F2eDJfcHNsbF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNsbC53CisgICAgeDg2X2F2eDJfcHNsbGlfZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNsbGkuZAorICAgIHg4Nl9hdngyX3BzbGxpX3EsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzbGxpLnEKKyAgICB4ODZfYXZ4Ml9wc2xsaV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc2xsaS53CisgICAgeDg2X2F2eDJfcHNsbHZfZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNsbHYuZAorICAgIHg4Nl9hdngyX3BzbGx2X2RfMjU2LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzbGx2LmQuMjU2CisgICAgeDg2X2F2eDJfcHNsbHZfcSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNsbHYucQorICAgIHg4Nl9hdngyX3BzbGx2X3FfMjU2LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzbGx2LnEuMjU2CisgICAgeDg2X2F2eDJfcHNyYV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNyYS5kCisgICAgeDg2X2F2eDJfcHNyYV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNyYS53CisgICAgeDg2X2F2eDJfcHNyYWlfZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNyYWkuZAorICAgIHg4Nl9hdngyX3BzcmFpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzcmFpLncKKyAgICB4ODZfYXZ4Ml9wc3Jhdl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc3Jhdi5kCisgICAgeDg2X2F2eDJfcHNyYXZfZF8yNTYsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNyYXYuZC4yNTYKKyAgICB4ODZfYXZ4Ml9wc3JsX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc3JsLmQKKyAgICB4ODZfYXZ4Ml9wc3JsX3EsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc3JsLnEKKyAgICB4ODZfYXZ4Ml9wc3JsX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc3JsLncKKyAgICB4ODZfYXZ4Ml9wc3JsaV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc3JsaS5kCisgICAgeDg2X2F2eDJfcHNybGlfcSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNybGkucQorICAgIHg4Nl9hdngyX3BzcmxpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzcmxpLncKKyAgICB4ODZfYXZ4Ml9wc3Jsdl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc3Jsdi5kCisgICAgeDg2X2F2eDJfcHNybHZfZF8yNTYsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNybHYuZC4yNTYKKyAgICB4ODZfYXZ4Ml9wc3Jsdl9xLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc3Jsdi5xCisgICAgeDg2X2F2eDJfcHNybHZfcV8yNTYsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNybHYucS4yNTYKKyAgICB4ODZfYXZ4Ml9wc3Vic19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc3Vicy5iCisgICAgeDg2X2F2eDJfcHN1YnNfdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHN1YnMudworICAgIHg4Nl9hdngyX3BzdWJ1c19iLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzdWJ1cy5iCisgICAgeDg2X2F2eDJfcHN1YnVzX3csICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHN1YnVzLncKKyAgICB4ODZfYXZ4NTEyX2Jyb2FkY2FzdG1iXzEyOCwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmJyb2FkY2FzdG1iLjEyOAorICAgIHg4Nl9hdng1MTJfYnJvYWRjYXN0bWJfMjU2LCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuYnJvYWRjYXN0bWIuMjU2CisgICAgeDg2X2F2eDUxMl9icm9hZGNhc3RtYl81MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5icm9hZGNhc3RtYi41MTIKKyAgICB4ODZfYXZ4NTEyX2Jyb2FkY2FzdG13XzEyOCwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmJyb2FkY2FzdG13LjEyOAorICAgIHg4Nl9hdng1MTJfYnJvYWRjYXN0bXdfMjU2LCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuYnJvYWRjYXN0bXcuMjU2CisgICAgeDg2X2F2eDUxMl9icm9hZGNhc3Rtd181MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5icm9hZGNhc3Rtdy41MTIKKyAgICB4ODZfYXZ4NTEyX2N2dHNpMnNkNjQsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHNpMnNkNjQKKyAgICB4ODZfYXZ4NTEyX2N2dHNpMnNzMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHNpMnNzMzIKKyAgICB4ODZfYXZ4NTEyX2N2dHNpMnNzNjQsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHNpMnNzNjQKKyAgICB4ODZfYXZ4NTEyX2N2dHRzZDJzaSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHRzZDJzaQorICAgIHg4Nl9hdng1MTJfY3Z0dHNkMnNpNjQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0dHNkMnNpNjQKKyAgICB4ODZfYXZ4NTEyX2N2dHRzZDJ1c2ksICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHRzZDJ1c2kKKyAgICB4ODZfYXZ4NTEyX2N2dHRzZDJ1c2k2NCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHRzZDJ1c2k2NAorICAgIHg4Nl9hdng1MTJfY3Z0dHNzMnNpLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0dHNzMnNpCisgICAgeDg2X2F2eDUxMl9jdnR0c3Myc2k2NCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnR0c3Myc2k2NAorICAgIHg4Nl9hdng1MTJfY3Z0dHNzMnVzaSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0dHNzMnVzaQorICAgIHg4Nl9hdng1MTJfY3Z0dHNzMnVzaTY0LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0dHNzMnVzaTY0CisgICAgeDg2X2F2eDUxMl9jdnR1c2kyc2QsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnR1c2kyc2QKKyAgICB4ODZfYXZ4NTEyX2N2dHVzaTJzcywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHVzaTJzcworICAgIHg4Nl9hdng1MTJfY3Z0dXNpNjQyc2QsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0dXNpNjQyc2QKKyAgICB4ODZfYXZ4NTEyX2N2dHVzaTY0MnNzLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHVzaTY0MnNzCisgICAgeDg2X2F2eDUxMl9leHAyX3BkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5leHAyLnBkCisgICAgeDg2X2F2eDUxMl9leHAyX3BzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5leHAyLnBzCisgICAgeDg2X2F2eDUxMl9nYXRoZXJfZHBkXzUxMiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIuZHBkLjUxMgorICAgIHg4Nl9hdng1MTJfZ2F0aGVyX2RwaV81MTIsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLmRwaS41MTIKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcl9kcHFfNTEyLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlci5kcHEuNTEyCisgICAgeDg2X2F2eDUxMl9nYXRoZXJfZHBzXzUxMiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIuZHBzLjUxMgorICAgIHg4Nl9hdng1MTJfZ2F0aGVyX3FwZF81MTIsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLnFwZC41MTIKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcl9xcGlfNTEyLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlci5xcGkuNTEyCisgICAgeDg2X2F2eDUxMl9nYXRoZXJfcXBxXzUxMiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIucXBxLjUxMgorICAgIHg4Nl9hdng1MTJfZ2F0aGVyX3Fwc181MTIsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLnFwcy41MTIKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcjNkaXYyX2RmLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNkaXYyLmRmCisgICAgeDg2X2F2eDUxMl9nYXRoZXIzZGl2Ml9kaSwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2Mi5kaQorICAgIHg4Nl9hdng1MTJfZ2F0aGVyM2RpdjRfZGYsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2RpdjQuZGYKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcjNkaXY0X2RpLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNkaXY0LmRpCisgICAgeDg2X2F2eDUxMl9nYXRoZXIzZGl2NF9zZiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2NC5zZgorICAgIHg4Nl9hdng1MTJfZ2F0aGVyM2RpdjRfc2ksICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2RpdjQuc2kKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcjNkaXY4X3NmLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNkaXY4LnNmCisgICAgeDg2X2F2eDUxMl9nYXRoZXIzZGl2OF9zaSwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2OC5zaQorICAgIHg4Nl9hdng1MTJfZ2F0aGVyM3NpdjJfZGYsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3NpdjIuZGYKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcjNzaXYyX2RpLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNzaXYyLmRpCisgICAgeDg2X2F2eDUxMl9nYXRoZXIzc2l2NF9kZiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2NC5kZgorICAgIHg4Nl9hdng1MTJfZ2F0aGVyM3NpdjRfZGksICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3NpdjQuZGkKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcjNzaXY0X3NmLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNzaXY0LnNmCisgICAgeDg2X2F2eDUxMl9nYXRoZXIzc2l2NF9zaSwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2NC5zaQorICAgIHg4Nl9hdng1MTJfZ2F0aGVyM3Npdjhfc2YsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3Npdjguc2YKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcjNzaXY4X3NpLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNzaXY4LnNpCisgICAgeDg2X2F2eDUxMl9nYXRoZXJwZl9kcGRfNTEyLCAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXJwZi5kcGQuNTEyCisgICAgeDg2X2F2eDUxMl9nYXRoZXJwZl9kcHNfNTEyLCAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXJwZi5kcHMuNTEyCisgICAgeDg2X2F2eDUxMl9nYXRoZXJwZl9xcGRfNTEyLCAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXJwZi5xcGQuNTEyCisgICAgeDg2X2F2eDUxMl9nYXRoZXJwZl9xcHNfNTEyLCAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXJwZi5xcHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2FkZF9wZF81MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmFkZC5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfYWRkX3BzXzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suYWRkLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19hZGRfc2Rfcm91bmQsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5hZGQuc2Qucm91bmQKKyAgICB4ODZfYXZ4NTEyX21hc2tfYWRkX3NzX3JvdW5kLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suYWRkLnNzLnJvdW5kCisgICAgeDg2X2F2eDUxMl9tYXNrX2NtcF9wZF8xMjgsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY21wX3BkXzI1NiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY21wLnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jbXBfcGRfNTEyLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jbXAucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2NtcF9wc18xMjgsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY21wX3BzXzI1NiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY21wLnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jbXBfcHNfNTEyLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jbXAucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2NtcF9zZCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5zZAorICAgIHg4Nl9hdng1MTJfbWFza19jbXBfc3MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jbXAuc3MKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfYl8xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MuYi4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfYl8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MuYi4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfYl81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MuYi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfZF8xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MuZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfZF8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MuZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfZF81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfcGRfMTI4LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3BkXzI1NiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19wZF81MTIsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfcHNfMTI4LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3BzXzI1NiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19wc181MTIsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfcV8xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfcV8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfcV81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfYl8xMjgsICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUuYi4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfYl8yNTYsICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUuYi4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfYl81MTIsICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUuYi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfZF8xMjgsICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUuZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfZF8yNTYsICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUuZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfZF81MTIsICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcGRfMTI4LCAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3N0b3JlX3BkXzI1NiwgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9wZF81MTIsICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcHNfMTI4LCAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3N0b3JlX3BzXzI1NiwgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9wc181MTIsICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcV8xMjgsICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcV8yNTYsICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcV81MTIsICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfd18xMjgsICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUudy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfd18yNTYsICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUudy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfd181MTIsICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUudy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfd18xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Mudy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfd18yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Mudy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfd181MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Mudy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29uZmxpY3RfZF8xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29uZmxpY3QuZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29uZmxpY3RfZF8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29uZmxpY3QuZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29uZmxpY3RfZF81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29uZmxpY3QuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29uZmxpY3RfcV8xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29uZmxpY3QucS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29uZmxpY3RfcV8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29uZmxpY3QucS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29uZmxpY3RfcV81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29uZmxpY3QucS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0ZHEycHNfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0ZHEycHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dGRxMnBzXzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dGRxMnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRkcTJwc181MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRkcTJwcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cGQyZHFfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQyZHEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBkMmRxXzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMmRxLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwZDJkcV81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJkcS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cGQycHMsICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQycHMKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cGQycHNfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQycHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBkMnBzXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwZDJxcV8xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJxcS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cGQycXFfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQycXEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBkMnFxXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnFxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwZDJ1ZHFfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJ1ZHEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBkMnVkcV8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnVkcS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cGQydWRxXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQydWRxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwZDJ1cXFfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJ1cXEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBkMnVxcV8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnVxcS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cGQydXFxXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQydXFxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwczJkcV8xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJkcS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cHMyZHFfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMyZHEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBzMmRxXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMmRxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwczJwZF8xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJwZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cHMycGRfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMycGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBzMnBkXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwczJxcV8xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJxcS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cHMycXFfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMycXEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBzMnFxXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnFxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwczJ1ZHFfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJ1ZHEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBzMnVkcV8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnVkcS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cHMydWRxXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMydWRxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwczJ1cXFfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJ1cXEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBzMnVxcV8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnVxcS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cHMydXFxXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMydXFxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRxcTJwZF8xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRxcTJwZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cXEycGRfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cXEycGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHFxMnBkXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHFxMnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRxcTJwc18xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRxcTJwcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cXEycHNfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cXEycHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHFxMnBzXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHFxMnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRzZDJzc19yb3VuZCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRzZDJzcy5yb3VuZAorICAgIHg4Nl9hdng1MTJfbWFza19jdnRzczJzZF9yb3VuZCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRzczJzZC5yb3VuZAorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cGQyZHFfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQyZHEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJkcV8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJkcS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMmRxXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBkMmRxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cGQycXFfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQycXEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJxcV8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJxcS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMnFxXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBkMnFxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cGQydWRxXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQydWRxLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cGQydWRxXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQydWRxLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cGQydWRxXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQydWRxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cGQydXFxXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQydXFxLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cGQydXFxXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQydXFxLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cGQydXFxXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQydXFxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cHMyZHFfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMyZHEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJkcV8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJkcS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMmRxXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBzMmRxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cHMycXFfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMycXEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJxcV8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJxcS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMnFxXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBzMnFxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cHMydWRxXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMydWRxLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cHMydWRxXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMydWRxLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cHMydWRxXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMydWRxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cHMydXFxXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMydXFxLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cHMydXFxXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMydXFxLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cHMydXFxXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMydXFxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR1ZHEycHNfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1ZHEycHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHVkcTJwc18yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVkcTJwcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0dWRxMnBzXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dWRxMnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR1cXEycGRfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1cXEycGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHVxcTJwZF8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVxcTJwZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0dXFxMnBkXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dXFxMnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR1cXEycHNfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1cXEycHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHVxcTJwc18yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVxcTJwcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0dXFxMnBzXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dXFxMnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19kYnBzYWRid18xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5kYnBzYWRidy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfZGJwc2FkYndfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZGJwc2FkYncuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2RicHNhZGJ3XzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmRicHNhZGJ3LjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19kaXZfcGRfNTEyLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5kaXYucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2Rpdl9wc181MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmRpdi5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfZGl2X3NkX3JvdW5kLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZGl2LnNkLnJvdW5kCisgICAgeDg2X2F2eDUxMl9tYXNrX2Rpdl9zc19yb3VuZCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmRpdi5zcy5yb3VuZAorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfYl8xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQuYi4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2JfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmIuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9iXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5iLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfZF8xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQuZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2RfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9kXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5kLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9iXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5iLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9iXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5iLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9iXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5iLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9kXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9kXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5kLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9kXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5kLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9wZF8xMjgsICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfcGRfMjU2LCAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3BkXzUxMiwgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9wc18xMjgsICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfcHNfMjU2LCAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3BzXzUxMiwgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9xXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9xXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5xLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9xXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5xLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF93XzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC53LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF93XzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC53LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF93XzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC53LjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfcGRfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9wZF8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3BkXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfcHNfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9wc18yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3BzXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfcV8xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3FfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9xXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5xLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfd18xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQudy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3dfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLncuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF93XzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC53LjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19maXh1cGltbV9wZF8xMjgsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfZml4dXBpbW1fcGRfMjU2LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZml4dXBpbW0ucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3BkXzUxMiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZpeHVwaW1tLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19maXh1cGltbV9wc18xMjgsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfZml4dXBpbW1fcHNfMjU2LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZml4dXBpbW0ucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3BzXzUxMiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZpeHVwaW1tLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19maXh1cGltbV9zZCwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5zZAorICAgIHg4Nl9hdng1MTJfbWFza19maXh1cGltbV9zcywgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5zcworICAgIHg4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BkXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnBkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BkXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BkXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BzXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnBzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BzXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BzXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19mcGNsYXNzX3NkLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnNkCisgICAgeDg2X2F2eDUxMl9tYXNrX2ZwY2xhc3Nfc3MsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3Muc3MKKyAgICB4ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3BkXzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnBkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19nZXRleHBfcGRfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRleHAucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2dldGV4cF9wZF81MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldGV4cC5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3BzXzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnBzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19nZXRleHBfcHNfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRleHAucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2dldGV4cF9wc181MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldGV4cC5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3NkLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnNkCisgICAgeDg2X2F2eDUxMl9tYXNrX2dldGV4cF9zcywgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldGV4cC5zcworICAgIHg4Nl9hdng1MTJfbWFza19nZXRtYW50X3BkXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnBkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19nZXRtYW50X3BkXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19nZXRtYW50X3BkXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19nZXRtYW50X3BzXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnBzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19nZXRtYW50X3BzXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19nZXRtYW50X3BzXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19nZXRtYW50X3NkLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnNkCisgICAgeDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfc3MsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQuc3MKKyAgICB4ODZfYXZ4NTEyX21hc2tfbWF4X3BkXzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2subWF4LnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19tYXhfcHNfNTEyLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5tYXgucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX21heF9zZF9yb3VuZCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLm1heC5zZC5yb3VuZAorICAgIHg4Nl9hdng1MTJfbWFza19tYXhfc3Nfcm91bmQsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5tYXguc3Mucm91bmQKKyAgICB4ODZfYXZ4NTEyX21hc2tfbWluX3BkXzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2subWluLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19taW5fcHNfNTEyLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5taW4ucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX21pbl9zZF9yb3VuZCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLm1pbi5zZC5yb3VuZAorICAgIHg4Nl9hdng1MTJfbWFza19taW5fc3Nfcm91bmQsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5taW4uc3Mucm91bmQKKyAgICB4ODZfYXZ4NTEyX21hc2tfbXVsX3BkXzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2subXVsLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19tdWxfcHNfNTEyLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5tdWwucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX211bF9zZF9yb3VuZCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLm11bC5zZC5yb3VuZAorICAgIHg4Nl9hdng1MTJfbWFza19tdWxfc3Nfcm91bmQsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5tdWwuc3Mucm91bmQKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGFkZHNfYl8xMjgsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHMuYi4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGFkZHNfYl8yNTYsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHMuYi4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGFkZHNfYl81MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHMuYi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGFkZHNfd18xMjgsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHMudy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGFkZHNfd18yNTYsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHMudy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGFkZHNfd181MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHMudy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGFkZHVzX2JfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHVzLmIuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3BhZGR1c19iXzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGR1cy5iLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wYWRkdXNfYl81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkdXMuYi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGFkZHVzX3dfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHVzLncuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3BhZGR1c193XzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGR1cy53LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wYWRkdXNfd181MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkdXMudy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9kZl8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5kZi4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9kZl81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5kZi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9kaV8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5kaS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9kaV81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5kaS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9oaV8xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5oaS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9oaV8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5oaS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9oaV81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5oaS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9xaV8xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5xaS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9xaV8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5xaS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9xaV81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5xaS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9zZl8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5zZi4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9zZl81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5zZi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9zaV8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5zaS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9zaV81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5zaS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1hZGR1YnNfd18xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1hZGR1YnMudy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1hZGR1YnNfd18yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1hZGR1YnMudy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1hZGR1YnNfd181MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1hZGR1YnMudy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1hZGR3X2RfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1hZGR3LmQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3BtYWRkd19kXzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtYWRkdy5kLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbWFkZHdfZF81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbWFkZHcuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9kYl8xMjgsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kYi4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9kYl8yNTYsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kYi4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9kYl81MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kYi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9kYl9tZW1fMTI4LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kYi5tZW0uMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZfZGJfbWVtXzI1NiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YuZGIubWVtLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X2RiX21lbV81MTIsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmRiLm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9kd18xMjgsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kdy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9kd18yNTYsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kdy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9kd181MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kdy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9kd19tZW1fMTI4LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kdy5tZW0uMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZfZHdfbWVtXzI1NiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YuZHcubWVtLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X2R3X21lbV81MTIsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmR3Lm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9xYl8xMjgsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xYi4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9xYl8yNTYsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xYi4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9xYl81MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xYi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9xYl9tZW1fMTI4LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xYi5tZW0uMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWJfbWVtXzI1NiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucWIubWVtLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3FiX21lbV81MTIsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFiLm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9xZF8xMjgsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9xZF8yNTYsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9xZF81MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9xZF9tZW1fMTI4LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xZC5tZW0uMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWRfbWVtXzI1NiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucWQubWVtLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3FkX21lbV81MTIsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFkLm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9xd18xMjgsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xdy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9xd18yNTYsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xdy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9xd181MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xdy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9xd19tZW1fMTI4LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xdy5tZW0uMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZfcXdfbWVtXzI1NiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucXcubWVtLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3F3X21lbV81MTIsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnF3Lm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl93Yl8xMjgsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi53Yi4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl93Yl8yNTYsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi53Yi4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl93Yl81MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi53Yi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl93Yl9tZW1fMTI4LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi53Yi5tZW0uMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3Zfd2JfbWVtXzI1NiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Yud2IubWVtLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3diX21lbV81MTIsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LndiLm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfZGJfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZGIuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2RiXzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmRiLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19kYl81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kYi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfZGJfbWVtXzEyOCwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZGIubWVtLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19kYl9tZW1fMjU2LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kYi5tZW0uMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2RiX21lbV81MTIsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmRiLm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfZHdfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZHcuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2R3XzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmR3LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19kd181MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kdy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfZHdfbWVtXzEyOCwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZHcubWVtLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19kd19tZW1fMjU2LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kdy5tZW0uMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2R3X21lbV81MTIsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmR3Lm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWJfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWIuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FiXzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFiLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19xYl81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xYi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWJfbWVtXzEyOCwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWIubWVtLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19xYl9tZW1fMjU2LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xYi5tZW0uMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FiX21lbV81MTIsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFiLm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWRfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FkXzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19xZF81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWRfbWVtXzEyOCwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWQubWVtLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19xZF9tZW1fMjU2LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xZC5tZW0uMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FkX21lbV81MTIsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFkLm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcXdfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucXcuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3F3XzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnF3LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19xd181MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xdy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcXdfbWVtXzEyOCwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucXcubWVtLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19xd19tZW1fMjU2LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xdy5tZW0uMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3F3X21lbV81MTIsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnF3Lm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfd2JfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMud2IuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3diXzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLndiLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c193Yl81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy53Yi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfd2JfbWVtXzEyOCwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMud2IubWVtLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c193Yl9tZW1fMjU2LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy53Yi5tZW0uMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3diX21lbV81MTIsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLndiLm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2RiXzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmRiLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfZGJfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZGIuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kYl81MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kYi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2RiX21lbV8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmRiLm1lbS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2RiX21lbV8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmRiLm1lbS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2RiX21lbV81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmRiLm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2R3XzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmR3LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfZHdfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZHcuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kd181MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kdy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2R3X21lbV8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmR3Lm1lbS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2R3X21lbV8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmR3Lm1lbS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2R3X21lbV81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmR3Lm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FiXzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFiLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfcWJfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWIuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xYl81MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xYi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FiX21lbV8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFiLm1lbS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FiX21lbV8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFiLm1lbS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FiX21lbV81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFiLm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FkXzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfcWRfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xZF81MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FkX21lbV8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFkLm1lbS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FkX21lbV8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFkLm1lbS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FkX21lbV81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFkLm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3F3XzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnF3LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfcXdfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucXcuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xd181MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xdy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3F3X21lbV8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnF3Lm1lbS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3F3X21lbV8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnF3Lm1lbS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3F3X21lbV81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnF3Lm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3diXzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLndiLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfd2JfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMud2IuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c193Yl81MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy53Yi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3diX21lbV8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLndiLm1lbS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3diX21lbV8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLndiLm1lbS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3diX21lbV81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLndiLm1lbS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG11bHRpc2hpZnRfcWJfMTI4LCAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG11bHRpc2hpZnQucWIuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3BtdWx0aXNoaWZ0X3FiXzI1NiwgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtdWx0aXNoaWZ0LnFiLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbXVsdGlzaGlmdF9xYl81MTIsICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbXVsdGlzaGlmdC5xYi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvbF9kXzEyOCwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbC5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wcm9sX2RfMjU2LCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sLmQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Byb2xfZF81MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb2wuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvbF9xXzEyOCwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbC5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wcm9sX3FfMjU2LCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sLnEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Byb2xfcV81MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb2wucS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvbHZfZF8xMjgsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbHYuZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvbHZfZF8yNTYsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbHYuZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvbHZfZF81MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbHYuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvbHZfcV8xMjgsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbHYucS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvbHZfcV8yNTYsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbHYucS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvbHZfcV81MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbHYucS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvcl9kXzEyOCwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvci5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wcm9yX2RfMjU2LCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9yLmQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Byb3JfZF81MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb3IuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvcl9xXzEyOCwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvci5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wcm9yX3FfMjU2LCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9yLnEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Byb3JfcV81MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb3IucS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvcnZfZF8xMjgsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvcnYuZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvcnZfZF8yNTYsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvcnYuZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvcnZfZF81MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvcnYuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvcnZfcV8xMjgsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvcnYucS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvcnZfcV8yNTYsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvcnYucS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvcnZfcV81MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvcnYucS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHN1YnNfYl8xMjgsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnMuYi4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHN1YnNfYl8yNTYsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnMuYi4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHN1YnNfYl81MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnMuYi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHN1YnNfd18xMjgsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnMudy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHN1YnNfd18yNTYsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnMudy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHN1YnNfd181MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnMudy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHN1YnVzX2JfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnVzLmIuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3BzdWJ1c19iXzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBzdWJ1cy5iLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wc3VidXNfYl81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3VidXMuYi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHN1YnVzX3dfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnVzLncuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3BzdWJ1c193XzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBzdWJ1cy53LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wc3VidXNfd181MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3VidXMudy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHRlcm5sb2dfZF8xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHRlcm5sb2cuZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHRlcm5sb2dfZF8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHRlcm5sb2cuZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHRlcm5sb2dfZF81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHRlcm5sb2cuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHRlcm5sb2dfcV8xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHRlcm5sb2cucS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHRlcm5sb2dfcV8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHRlcm5sb2cucS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHRlcm5sb2dfcV81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHRlcm5sb2cucS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcmFuZ2VfcGRfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2UucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3JhbmdlX3BkXzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJhbmdlLnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19yYW5nZV9wZF81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcmFuZ2VfcHNfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2UucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3JhbmdlX3BzXzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJhbmdlLnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19yYW5nZV9wc181MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcmFuZ2Vfc2QsICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2Uuc2QKKyAgICB4ODZfYXZ4NTEyX21hc2tfcmFuZ2Vfc3MsICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2Uuc3MKKyAgICB4ODZfYXZ4NTEyX21hc2tfcmVkdWNlX3BkXzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnBkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19yZWR1Y2VfcGRfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yZWR1Y2UucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3JlZHVjZV9wZF81MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJlZHVjZS5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcmVkdWNlX3BzXzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnBzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19yZWR1Y2VfcHNfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yZWR1Y2UucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3JlZHVjZV9wc181MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJlZHVjZS5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfcmVkdWNlX3NkLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnNkCisgICAgeDg2X2F2eDUxMl9tYXNrX3JlZHVjZV9zcywgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJlZHVjZS5zcworICAgIHg4Nl9hdng1MTJfbWFza19ybmRzY2FsZV9wZF8xMjgsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5ybmRzY2FsZS5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcm5kc2NhbGVfcGRfMjU2LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucm5kc2NhbGUucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3JuZHNjYWxlX3BkXzUxMiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19ybmRzY2FsZV9wc18xMjgsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5ybmRzY2FsZS5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcm5kc2NhbGVfcHNfMjU2LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucm5kc2NhbGUucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3JuZHNjYWxlX3BzXzUxMiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19ybmRzY2FsZV9zZCwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5ybmRzY2FsZS5zZAorICAgIHg4Nl9hdng1MTJfbWFza19ybmRzY2FsZV9zcywgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5ybmRzY2FsZS5zcworICAgIHg4Nl9hdng1MTJfbWFza19zY2FsZWZfcGRfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3NjYWxlZl9wZF8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNjYWxlZi5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfc2NhbGVmX3BkXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc2NhbGVmLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19zY2FsZWZfcHNfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3NjYWxlZl9wc18yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNjYWxlZi5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfc2NhbGVmX3BzXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc2NhbGVmLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19zY2FsZWZfc2QsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYuc2QKKyAgICB4ODZfYXZ4NTEyX21hc2tfc2NhbGVmX3NzLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc2NhbGVmLnNzCisgICAgeDg2X2F2eDUxMl9tYXNrX3NxcnRfcGRfMTI4LCAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3NxcnRfcGRfMjU2LCAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3NxcnRfcGRfNTEyLCAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3NxcnRfcHNfMTI4LCAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3NxcnRfcHNfMjU2LCAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3NxcnRfcHNfNTEyLCAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3NxcnRfc2QsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQuc2QKKyAgICB4ODZfYXZ4NTEyX21hc2tfc3FydF9zcywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5zcworICAgIHg4Nl9hdng1MTJfbWFza19zdG9yZV9zcywgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zdG9yZS5zcworICAgIHg4Nl9hdng1MTJfbWFza19zdWJfcGRfNTEyLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zdWIucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3N1Yl9wc181MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnN1Yi5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfc3ViX3NkX3JvdW5kLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3ViLnNkLnJvdW5kCisgICAgeDg2X2F2eDUxMl9tYXNrX3N1Yl9zc19yb3VuZCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnN1Yi5zcy5yb3VuZAorICAgIHg4Nl9hdng1MTJfbWFza192Y3Z0cGgycHNfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Y3Z0cGgycHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZjdnRwaDJwc18yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZjdnRwaDJwcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmN2dHBoMnBzXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmN2dHBoMnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza192Y3Z0cHMycGhfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Y3Z0cHMycGguMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZjdnRwczJwaF8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZjdnRwczJwaC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmN2dHBzMnBoXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmN2dHBzMnBoLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza192Zm1hZGRfcGRfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZmbWFkZF9wZF8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZC5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZtYWRkX3BkXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza192Zm1hZGRfcHNfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZmbWFkZF9wc18yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZC5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZtYWRkX3BzXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza192Zm1hZGRfc2QsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQuc2QKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZtYWRkX3NzLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkLnNzCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZmbWFkZHN1Yl9wZF8xMjgsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZHN1Yi5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZtYWRkc3ViX3BkXzI1NiwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkc3ViLnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192Zm1hZGRzdWJfcGRfNTEyLCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGRzdWIucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZmbWFkZHN1Yl9wc18xMjgsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZHN1Yi5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZtYWRkc3ViX3BzXzI1NiwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkc3ViLnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192Zm1hZGRzdWJfcHNfNTEyLCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGRzdWIucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3Zmbm1hZGRfcGRfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1hZGQucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zmbm1hZGRfcGRfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1hZGQucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zmbm1hZGRfcGRfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1hZGQucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3Zmbm1hZGRfcHNfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1hZGQucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zmbm1hZGRfcHNfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1hZGQucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zmbm1hZGRfcHNfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1hZGQucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3Zmbm1zdWJfcGRfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1zdWIucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zmbm1zdWJfcGRfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1zdWIucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zmbm1zdWJfcGRfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1zdWIucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3Zmbm1zdWJfcHNfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1zdWIucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zmbm1zdWJfcHNfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1zdWIucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zmbm1zdWJfcHNfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1zdWIucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZHBidXNkXzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHBidXNkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cGRwYnVzZF8yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwYnVzZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBkcGJ1c2RfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcGJ1c2QuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZHBidXNkc18xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHBidXNkcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBkcGJ1c2RzXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcGJ1c2RzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cGRwYnVzZHNfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwYnVzZHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZHB3c3NkXzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHB3c3NkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cGRwd3NzZF8yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwd3NzZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBkcHdzc2RfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcHdzc2QuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZHB3c3Nkc18xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHB3c3Nkcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBkcHdzc2RzXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcHdzc2RzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cGRwd3NzZHNfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwd3NzZHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfZF8xMjgsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIuZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9kXzI1NiwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5kLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cGVybWkydmFyX2RfNTEyLCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLmQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfaGlfMTI4LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIuaGkuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfaGlfMjU2LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIuaGkuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfaGlfNTEyLCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIuaGkuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcGRfMTI4LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcGRfMjU2LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcGRfNTEyLCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcHNfMTI4LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcHNfMjU2LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcHNfNTEyLCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcV8xMjgsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9xXzI1NiwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5xLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cGVybWkydmFyX3FfNTEyLCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLnEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcWlfMTI4LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucWkuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcWlfMjU2LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucWkuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcWlfNTEyLCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucWkuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfZF8xMjgsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIuZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9kXzI1NiwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5kLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cGVybXQydmFyX2RfNTEyLCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLmQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfaGlfMTI4LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIuaGkuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfaGlfMjU2LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIuaGkuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfaGlfNTEyLCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIuaGkuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcGRfMTI4LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcGRfMjU2LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcGRfNTEyLCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcHNfMTI4LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcHNfMjU2LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcHNfNTEyLCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcV8xMjgsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9xXzI1NiwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5xLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3FfNTEyLCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLnEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcWlfMTI4LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucWkuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcWlfMjU2LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucWkuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcWlfNTEyLCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucWkuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwbWFkZDUyaF91cV8xMjgsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwbWFkZDUyaC51cS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBtYWRkNTJoX3VxXzI1NiwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBtYWRkNTJoLnVxLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cG1hZGQ1MmhfdXFfNTEyLCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cG1hZGQ1MmgudXEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwbWFkZDUybF91cV8xMjgsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwbWFkZDUybC51cS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBtYWRkNTJsX3VxXzI1NiwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBtYWRkNTJsLnVxLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cG1hZGQ1MmxfdXFfNTEyLCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cG1hZGQ1MmwudXEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZF9kXzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZC5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cHNobGRfZF8yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQuZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaGxkX2RfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLmQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZF9xXzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZC5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cHNobGRfcV8yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQucS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaGxkX3FfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLnEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZF93XzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZC53LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cHNobGRfd18yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQudy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaGxkX3dfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLncuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfZF8xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYuZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaGxkdl9kXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi5kLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cHNobGR2X2RfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LmQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfcV8xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYucS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaGxkdl9xXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi5xLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cHNobGR2X3FfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LnEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfd18xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYudy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaGxkdl93XzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi53LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cHNobGR2X3dfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LncuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZF9kXzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZC5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cHNocmRfZF8yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQuZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaHJkX2RfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLmQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZF9xXzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZC5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cHNocmRfcV8yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQucS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaHJkX3FfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLnEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZF93XzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZC53LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cHNocmRfd18yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQudy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaHJkX3dfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLncuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfZF8xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYuZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaHJkdl9kXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi5kLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cHNocmR2X2RfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LmQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfcV8xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYucS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaHJkdl9xXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi5xLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cHNocmR2X3FfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LnEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfd18xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYudy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaHJkdl93XzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi53LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cHNocmR2X3dfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LncuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2h1ZmJpdHFtYl8xMjgsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2h1ZmJpdHFtYi4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaHVmYml0cW1iXzI1NiwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHVmYml0cW1iLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cHNodWZiaXRxbWJfNTEyLCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNodWZiaXRxbWIuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRfcGRfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRfcGRfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRfcGRfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRfcHNfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRfcHNfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRfcHNfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRfc2QsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQuc2QKKyAgICB4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9zcywgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5zcworICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtYWRkc3ViX3BkXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkc3ViLnBkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtYWRkc3ViX3BkXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkc3ViLnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtYWRkc3ViX3BkXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkc3ViLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtYWRkc3ViX3BzXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkc3ViLnBzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtYWRkc3ViX3BzXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkc3ViLnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtYWRkc3ViX3BzXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkc3ViLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3BkXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnBkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3BkXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3BkXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3BzXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnBzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3BzXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3BzXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3NkLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnNkCisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfc3MsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIuc3MKKyAgICB4ODZfYXZ4NTEyX21hc2szX3ZmbXN1YmFkZF9wZF8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1YmFkZC5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2szX3ZmbXN1YmFkZF9wZF8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1YmFkZC5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2szX3ZmbXN1YmFkZF9wZF81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1YmFkZC5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2szX3ZmbXN1YmFkZF9wc18xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1YmFkZC5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2szX3ZmbXN1YmFkZF9wc18yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1YmFkZC5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2szX3ZmbXN1YmFkZF9wc181MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1YmFkZC5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfcGRfMTI4LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm5tc3ViX3BkXzI1NiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm5tc3ViLnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZubXN1Yl9wZF81MTIsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZubXN1Yi5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfcHNfMTI4LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm5tc3ViX3BzXzI1NiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm5tc3ViLnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZubXN1Yl9wc181MTIsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZubXN1Yi5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfc2QsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIuc2QKKyAgICB4ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfc3MsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIuc3MKKyAgICB4ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3BkXzEyOCwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LmZpeHVwaW1tLnBkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fcGRfMjU2LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3ouZml4dXBpbW0ucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrel9maXh1cGltbV9wZF81MTIsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5maXh1cGltbS5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3BzXzEyOCwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LmZpeHVwaW1tLnBzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fcHNfMjU2LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3ouZml4dXBpbW0ucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrel9maXh1cGltbV9wc181MTIsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5maXh1cGltbS5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3NkLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LmZpeHVwaW1tLnNkCisgICAgeDg2X2F2eDUxMl9tYXNrel9maXh1cGltbV9zcywgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5maXh1cGltbS5zcworICAgIHg4Nl9hdng1MTJfbWFza3pfcHRlcm5sb2dfZF8xMjgsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oucHRlcm5sb2cuZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3B0ZXJubG9nX2RfMjU2LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnB0ZXJubG9nLmQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrel9wdGVybmxvZ19kXzUxMiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5wdGVybmxvZy5kLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfcHRlcm5sb2dfcV8xMjgsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oucHRlcm5sb2cucS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3B0ZXJubG9nX3FfMjU2LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnB0ZXJubG9nLnEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrel9wdGVybmxvZ19xXzUxMiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5wdGVybmxvZy5xLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3BkXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnBkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3BkXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3BkXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3BzXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnBzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3BzXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3BzXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3NkLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnNkCisgICAgeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfc3MsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQuc3MKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZHN1Yl9wZF8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZHN1Yi5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZHN1Yl9wZF8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZHN1Yi5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZHN1Yl9wZF81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZHN1Yi5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZHN1Yl9wc18xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZHN1Yi5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZHN1Yl9wc18yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZHN1Yi5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZHN1Yl9wc181MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZHN1Yi5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZHBidXNkXzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHBidXNkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBkcGJ1c2RfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcGJ1c2QuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrel92cGRwYnVzZF81MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGRwYnVzZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZHBidXNkc18xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHBidXNkcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZHBidXNkc18yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHBidXNkcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZHBidXNkc181MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHBidXNkcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZHB3c3NkXzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHB3c3NkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBkcHdzc2RfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcHdzc2QuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrel92cGRwd3NzZF81MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGRwd3NzZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZHB3c3Nkc18xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHB3c3Nkcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZHB3c3Nkc18yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHB3c3Nkcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZHB3c3Nkc181MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHB3c3Nkcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfZF8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIuZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfZF8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIuZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfZF81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfaGlfMTI4LCAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIuaGkuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX2hpXzI1NiwgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLmhpLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9oaV81MTIsICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5oaS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcGRfMTI4LCAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3BkXzI1NiwgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9wZF81MTIsICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcHNfMTI4LCAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3BzXzI1NiwgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9wc181MTIsICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcV8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcV8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcV81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcWlfMTI4LCAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucWkuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3FpXzI1NiwgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnFpLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9xaV81MTIsICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5xaS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwbWFkZDUyaF91cV8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwbWFkZDUyaC51cS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwbWFkZDUyaF91cV8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwbWFkZDUyaC51cS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwbWFkZDUyaF91cV81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwbWFkZDUyaC51cS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwbWFkZDUybF91cV8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwbWFkZDUybC51cS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwbWFkZDUybF91cV8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwbWFkZDUybC51cS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwbWFkZDUybF91cV81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwbWFkZDUybC51cS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfZF8xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYuZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfZF8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYuZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfZF81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfcV8xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYucS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfcV8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYucS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfcV81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYucS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfd18xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYudy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfd18yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYudy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfd181MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYudy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfZF8xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYuZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfZF8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYuZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfZF81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfcV8xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYucS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfcV8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYucS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfcV81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYucS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfd18xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYudy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfd18yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYudy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfd181MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYudy41MTIKKyAgICB4ODZfYXZ4NTEyX3BhY2tzc2R3XzUxMiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBhY2tzc2R3LjUxMgorICAgIHg4Nl9hdng1MTJfcGFja3Nzd2JfNTEyLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucGFja3Nzd2IuNTEyCisgICAgeDg2X2F2eDUxMl9wYWNrdXNkd181MTIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wYWNrdXNkdy41MTIKKyAgICB4ODZfYXZ4NTEyX3BhY2t1c3diXzUxMiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBhY2t1c3diLjUxMgorICAgIHg4Nl9hdng1MTJfcG11bF9kcV81MTIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucG11bC5kcS41MTIKKyAgICB4ODZfYXZ4NTEyX3BtdWxfaHJfc3dfNTEyLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBtdWwuaHIuc3cuNTEyCisgICAgeDg2X2F2eDUxMl9wbXVsaF93XzUxMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wbXVsaC53LjUxMgorICAgIHg4Nl9hdng1MTJfcG11bGh1X3dfNTEyLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucG11bGh1LncuNTEyCisgICAgeDg2X2F2eDUxMl9wbXVsdV9kcV81MTIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wbXVsdS5kcS41MTIKKyAgICB4ODZfYXZ4NTEyX3BzYWRfYndfNTEyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzYWQuYncuNTEyCisgICAgeDg2X2F2eDUxMl9wc2h1Zl9iXzUxMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2h1Zi5iLjUxMgorICAgIHg4Nl9hdng1MTJfcHNsbF9kXzUxMiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNsbC5kLjUxMgorICAgIHg4Nl9hdng1MTJfcHNsbF9xXzUxMiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNsbC5xLjUxMgorICAgIHg4Nl9hdng1MTJfcHNsbF93XzUxMiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNsbC53LjUxMgorICAgIHg4Nl9hdng1MTJfcHNsbGlfZF81MTIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNsbGkuZC41MTIKKyAgICB4ODZfYXZ4NTEyX3BzbGxpX3FfNTEyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzbGxpLnEuNTEyCisgICAgeDg2X2F2eDUxMl9wc2xsaV93XzUxMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsaS53LjUxMgorICAgIHg4Nl9hdng1MTJfcHNsbHZfZF81MTIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNsbHYuZC41MTIKKyAgICB4ODZfYXZ4NTEyX3BzbGx2X3FfNTEyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzbGx2LnEuNTEyCisgICAgeDg2X2F2eDUxMl9wc2xsdl93XzEyOCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsdi53LjEyOAorICAgIHg4Nl9hdng1MTJfcHNsbHZfd18yNTYsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNsbHYudy4yNTYKKyAgICB4ODZfYXZ4NTEyX3BzbGx2X3dfNTEyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzbGx2LncuNTEyCisgICAgeDg2X2F2eDUxMl9wc3JhX2RfNTEyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JhLmQuNTEyCisgICAgeDg2X2F2eDUxMl9wc3JhX3FfMTI4LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JhLnEuMTI4CisgICAgeDg2X2F2eDUxMl9wc3JhX3FfMjU2LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JhLnEuMjU2CisgICAgeDg2X2F2eDUxMl9wc3JhX3FfNTEyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JhLnEuNTEyCisgICAgeDg2X2F2eDUxMl9wc3JhX3dfNTEyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JhLncuNTEyCisgICAgeDg2X2F2eDUxMl9wc3JhaV9kXzUxMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JhaS5kLjUxMgorICAgIHg4Nl9hdng1MTJfcHNyYWlfcV8xMjgsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNyYWkucS4xMjgKKyAgICB4ODZfYXZ4NTEyX3BzcmFpX3FfMjU2LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmFpLnEuMjU2CisgICAgeDg2X2F2eDUxMl9wc3JhaV9xXzUxMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JhaS5xLjUxMgorICAgIHg4Nl9hdng1MTJfcHNyYWlfd181MTIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNyYWkudy41MTIKKyAgICB4ODZfYXZ4NTEyX3BzcmF2X2RfNTEyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmF2LmQuNTEyCisgICAgeDg2X2F2eDUxMl9wc3Jhdl9xXzEyOCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jhdi5xLjEyOAorICAgIHg4Nl9hdng1MTJfcHNyYXZfcV8yNTYsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNyYXYucS4yNTYKKyAgICB4ODZfYXZ4NTEyX3BzcmF2X3FfNTEyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmF2LnEuNTEyCisgICAgeDg2X2F2eDUxMl9wc3Jhdl93XzEyOCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jhdi53LjEyOAorICAgIHg4Nl9hdng1MTJfcHNyYXZfd18yNTYsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNyYXYudy4yNTYKKyAgICB4ODZfYXZ4NTEyX3BzcmF2X3dfNTEyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmF2LncuNTEyCisgICAgeDg2X2F2eDUxMl9wc3JsX2RfNTEyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JsLmQuNTEyCisgICAgeDg2X2F2eDUxMl9wc3JsX3FfNTEyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JsLnEuNTEyCisgICAgeDg2X2F2eDUxMl9wc3JsX3dfNTEyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JsLncuNTEyCisgICAgeDg2X2F2eDUxMl9wc3JsaV9kXzUxMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JsaS5kLjUxMgorICAgIHg4Nl9hdng1MTJfcHNybGlfcV81MTIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNybGkucS41MTIKKyAgICB4ODZfYXZ4NTEyX3BzcmxpX3dfNTEyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmxpLncuNTEyCisgICAgeDg2X2F2eDUxMl9wc3Jsdl9kXzUxMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jsdi5kLjUxMgorICAgIHg4Nl9hdng1MTJfcHNybHZfcV81MTIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNybHYucS41MTIKKyAgICB4ODZfYXZ4NTEyX3Bzcmx2X3dfMTI4LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmx2LncuMTI4CisgICAgeDg2X2F2eDUxMl9wc3Jsdl93XzI1NiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jsdi53LjI1NgorICAgIHg4Nl9hdng1MTJfcHNybHZfd181MTIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNybHYudy41MTIKKyAgICB4ODZfYXZ4NTEyX3JjcDE0X3BkXzEyOCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJjcDE0LnBkLjEyOAorICAgIHg4Nl9hdng1MTJfcmNwMTRfcGRfMjU2LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucmNwMTQucGQuMjU2CisgICAgeDg2X2F2eDUxMl9yY3AxNF9wZF81MTIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AxNC5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX3JjcDE0X3BzXzEyOCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJjcDE0LnBzLjEyOAorICAgIHg4Nl9hdng1MTJfcmNwMTRfcHNfMjU2LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucmNwMTQucHMuMjU2CisgICAgeDg2X2F2eDUxMl9yY3AxNF9wc181MTIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AxNC5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX3JjcDE0X3NkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJjcDE0LnNkCisgICAgeDg2X2F2eDUxMl9yY3AxNF9zcywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AxNC5zcworICAgIHg4Nl9hdng1MTJfcmNwMjhfcGQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucmNwMjgucGQKKyAgICB4ODZfYXZ4NTEyX3JjcDI4X3BzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJjcDI4LnBzCisgICAgeDg2X2F2eDUxMl9yY3AyOF9zZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AyOC5zZAorICAgIHg4Nl9hdng1MTJfcmNwMjhfc3MsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucmNwMjguc3MKKyAgICB4ODZfYXZ4NTEyX3JzcXJ0MTRfcGRfMTI4LCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJzcXJ0MTQucGQuMTI4CisgICAgeDg2X2F2eDUxMl9yc3FydDE0X3BkXzI1NiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5yc3FydDE0LnBkLjI1NgorICAgIHg4Nl9hdng1MTJfcnNxcnQxNF9wZF81MTIsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX3JzcXJ0MTRfcHNfMTI4LCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJzcXJ0MTQucHMuMTI4CisgICAgeDg2X2F2eDUxMl9yc3FydDE0X3BzXzI1NiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5yc3FydDE0LnBzLjI1NgorICAgIHg4Nl9hdng1MTJfcnNxcnQxNF9wc181MTIsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX3JzcXJ0MTRfc2QsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJzcXJ0MTQuc2QKKyAgICB4ODZfYXZ4NTEyX3JzcXJ0MTRfc3MsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJzcXJ0MTQuc3MKKyAgICB4ODZfYXZ4NTEyX3JzcXJ0MjhfcGQsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJzcXJ0MjgucGQKKyAgICB4ODZfYXZ4NTEyX3JzcXJ0MjhfcHMsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJzcXJ0MjgucHMKKyAgICB4ODZfYXZ4NTEyX3JzcXJ0Mjhfc2QsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJzcXJ0Mjguc2QKKyAgICB4ODZfYXZ4NTEyX3JzcXJ0Mjhfc3MsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJzcXJ0Mjguc3MKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJfZHBkXzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXIuZHBkLjUxMgorICAgIHg4Nl9hdng1MTJfc2NhdHRlcl9kcGlfNTEyLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5kcGkuNTEyCisgICAgeDg2X2F2eDUxMl9zY2F0dGVyX2RwcV81MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyLmRwcS41MTIKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJfZHBzXzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXIuZHBzLjUxMgorICAgIHg4Nl9hdng1MTJfc2NhdHRlcl9xcGRfNTEyLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5xcGQuNTEyCisgICAgeDg2X2F2eDUxMl9zY2F0dGVyX3FwaV81MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyLnFwaS41MTIKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJfcXBxXzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXIucXBxLjUxMgorICAgIHg4Nl9hdng1MTJfc2NhdHRlcl9xcHNfNTEyLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5xcHMuNTEyCisgICAgeDg2X2F2eDUxMl9zY2F0dGVyZGl2Ml9kZiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2Mi5kZgorICAgIHg4Nl9hdng1MTJfc2NhdHRlcmRpdjJfZGksICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcmRpdjIuZGkKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJkaXY0X2RmLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJkaXY0LmRmCisgICAgeDg2X2F2eDUxMl9zY2F0dGVyZGl2NF9kaSwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2NC5kaQorICAgIHg4Nl9hdng1MTJfc2NhdHRlcmRpdjRfc2YsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcmRpdjQuc2YKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJkaXY0X3NpLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJkaXY0LnNpCisgICAgeDg2X2F2eDUxMl9zY2F0dGVyZGl2OF9zZiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2OC5zZgorICAgIHg4Nl9hdng1MTJfc2NhdHRlcmRpdjhfc2ksICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcmRpdjguc2kKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJwZl9kcGRfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJwZi5kcGQuNTEyCisgICAgeDg2X2F2eDUxMl9zY2F0dGVycGZfZHBzXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVycGYuZHBzLjUxMgorICAgIHg4Nl9hdng1MTJfc2NhdHRlcnBmX3FwZF81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnBmLnFwZC41MTIKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJwZl9xcHNfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJwZi5xcHMuNTEyCisgICAgeDg2X2F2eDUxMl9zY2F0dGVyc2l2Ml9kZiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2Mi5kZgorICAgIHg4Nl9hdng1MTJfc2NhdHRlcnNpdjJfZGksICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnNpdjIuZGkKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJzaXY0X2RmLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJzaXY0LmRmCisgICAgeDg2X2F2eDUxMl9zY2F0dGVyc2l2NF9kaSwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2NC5kaQorICAgIHg4Nl9hdng1MTJfc2NhdHRlcnNpdjRfc2YsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnNpdjQuc2YKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJzaXY0X3NpLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJzaXY0LnNpCisgICAgeDg2X2F2eDUxMl9zY2F0dGVyc2l2OF9zZiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2OC5zZgorICAgIHg4Nl9hdng1MTJfc2NhdHRlcnNpdjhfc2ksICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnNpdjguc2kKKyAgICB4ODZfYXZ4NTEyX3Zicm9hZGNhc3Rfc2RfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnZicm9hZGNhc3Quc2QuNTEyCisgICAgeDg2X2F2eDUxMl92YnJvYWRjYXN0X3NzXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi52YnJvYWRjYXN0LnNzLjUxMgorICAgIHg4Nl9hdng1MTJfdmNvbWlfc2QsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIudmNvbWkuc2QKKyAgICB4ODZfYXZ4NTEyX3Zjb21pX3NzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnZjb21pLnNzCisgICAgeDg2X2F2eDUxMl92Y3Z0c2Qyc2kzMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi52Y3Z0c2Qyc2kzMgorICAgIHg4Nl9hdng1MTJfdmN2dHNkMnNpNjQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIudmN2dHNkMnNpNjQKKyAgICB4ODZfYXZ4NTEyX3ZjdnRzZDJ1c2kzMiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnZjdnRzZDJ1c2kzMgorICAgIHg4Nl9hdng1MTJfdmN2dHNkMnVzaTY0LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIudmN2dHNkMnVzaTY0CisgICAgeDg2X2F2eDUxMl92Y3Z0c3Myc2kzMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi52Y3Z0c3Myc2kzMgorICAgIHg4Nl9hdng1MTJfdmN2dHNzMnNpNjQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIudmN2dHNzMnNpNjQKKyAgICB4ODZfYXZ4NTEyX3ZjdnRzczJ1c2kzMiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnZjdnRzczJ1c2kzMgorICAgIHg4Nl9hdng1MTJfdmN2dHNzMnVzaTY0LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIudmN2dHNzMnVzaTY0CisgICAgeDg2X2F2eDUxMl92cGVybWlsdmFyX3BkXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi52cGVybWlsdmFyLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfdnBlcm1pbHZhcl9wc181MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIudnBlcm1pbHZhci5wcy41MTIKKyAgICB4ODZfYm1pX2JleHRyXzMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYm1pLmJleHRyLjMyCisgICAgeDg2X2JtaV9iZXh0cl82NCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmJtaS5iZXh0ci42NAorICAgIHg4Nl9ibWlfYnpoaV8zMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5ibWkuYnpoaS4zMgorICAgIHg4Nl9ibWlfYnpoaV82NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5ibWkuYnpoaS42NAorICAgIHg4Nl9ibWlfcGRlcF8zMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5ibWkucGRlcC4zMgorICAgIHg4Nl9ibWlfcGRlcF82NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5ibWkucGRlcC42NAorICAgIHg4Nl9ibWlfcGV4dF8zMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5ibWkucGV4dC4zMgorICAgIHg4Nl9ibWlfcGV4dF82NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5ibWkucGV4dC42NAorICAgIHg4Nl9jbGZsdXNob3B0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5jbGZsdXNob3B0CisgICAgeDg2X2NscnNzYnN5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmNscnNzYnN5CisgICAgeDg2X2Nsd2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmNsd2IKKyAgICB4ODZfY2x6ZXJvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuY2x6ZXJvCisgICAgeDg2X2ZsYWdzX3JlYWRfdTMyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZsYWdzLnJlYWQudTMyCisgICAgeDg2X2ZsYWdzX3JlYWRfdTY0LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZsYWdzLnJlYWQudTY0CisgICAgeDg2X2ZsYWdzX3dyaXRlX3UzMiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZsYWdzLndyaXRlLnUzMgorICAgIHg4Nl9mbGFnc193cml0ZV91NjQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbGFncy53cml0ZS51NjQKKyAgICB4ODZfZm1hX3ZmbWFkZF9wZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbWFkZC5wZAorICAgIHg4Nl9mbWFfdmZtYWRkX3BkXzI1NiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZtYWRkLnBkLjI1NgorICAgIHg4Nl9mbWFfdmZtYWRkX3BzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZtYWRkLnBzCisgICAgeDg2X2ZtYV92Zm1hZGRfcHNfMjU2LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm1hZGQucHMuMjU2CisgICAgeDg2X2ZtYV92Zm1hZGRfc2QsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm1hZGQuc2QKKyAgICB4ODZfZm1hX3ZmbWFkZF9zcywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbWFkZC5zcworICAgIHg4Nl9mbWFfdmZtYWRkc3ViX3BkLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZtYWRkc3ViLnBkCisgICAgeDg2X2ZtYV92Zm1hZGRzdWJfcGRfMjU2LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm1hZGRzdWIucGQuMjU2CisgICAgeDg2X2ZtYV92Zm1hZGRzdWJfcHMsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm1hZGRzdWIucHMKKyAgICB4ODZfZm1hX3ZmbWFkZHN1Yl9wc18yNTYsICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbWFkZHN1Yi5wcy4yNTYKKyAgICB4ODZfZm1hX3ZmbXN1Yl9wZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbXN1Yi5wZAorICAgIHg4Nl9mbWFfdmZtc3ViX3BkXzI1NiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZtc3ViLnBkLjI1NgorICAgIHg4Nl9mbWFfdmZtc3ViX3BzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZtc3ViLnBzCisgICAgeDg2X2ZtYV92Zm1zdWJfcHNfMjU2LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm1zdWIucHMuMjU2CisgICAgeDg2X2ZtYV92Zm1zdWJfc2QsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm1zdWIuc2QKKyAgICB4ODZfZm1hX3ZmbXN1Yl9zcywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbXN1Yi5zcworICAgIHg4Nl9mbWFfdmZtc3ViYWRkX3BkLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZtc3ViYWRkLnBkCisgICAgeDg2X2ZtYV92Zm1zdWJhZGRfcGRfMjU2LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm1zdWJhZGQucGQuMjU2CisgICAgeDg2X2ZtYV92Zm1zdWJhZGRfcHMsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm1zdWJhZGQucHMKKyAgICB4ODZfZm1hX3ZmbXN1YmFkZF9wc18yNTYsICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbXN1YmFkZC5wcy4yNTYKKyAgICB4ODZfZm1hX3Zmbm1hZGRfcGQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbm1hZGQucGQKKyAgICB4ODZfZm1hX3Zmbm1hZGRfcGRfMjU2LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbm1hZGQucGQuMjU2CisgICAgeDg2X2ZtYV92Zm5tYWRkX3BzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm5tYWRkLnBzCisgICAgeDg2X2ZtYV92Zm5tYWRkX3BzXzI1NiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm5tYWRkLnBzLjI1NgorICAgIHg4Nl9mbWFfdmZubWFkZF9zZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZubWFkZC5zZAorICAgIHg4Nl9mbWFfdmZubWFkZF9zcywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZubWFkZC5zcworICAgIHg4Nl9mbWFfdmZubXN1Yl9wZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZubXN1Yi5wZAorICAgIHg4Nl9mbWFfdmZubXN1Yl9wZF8yNTYsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZubXN1Yi5wZC4yNTYKKyAgICB4ODZfZm1hX3Zmbm1zdWJfcHMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbm1zdWIucHMKKyAgICB4ODZfZm1hX3Zmbm1zdWJfcHNfMjU2LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbm1zdWIucHMuMjU2CisgICAgeDg2X2ZtYV92Zm5tc3ViX3NkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm5tc3ViLnNkCisgICAgeDg2X2ZtYV92Zm5tc3ViX3NzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm5tc3ViLnNzCisgICAgeDg2X2ZtYTRfdmZtYWRkX3NkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYTQudmZtYWRkLnNkCisgICAgeDg2X2ZtYTRfdmZtYWRkX3NzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYTQudmZtYWRkLnNzCisgICAgeDg2X2Z4cnN0b3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZ4cnN0b3IKKyAgICB4ODZfZnhyc3RvcjY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZnhyc3RvcjY0CisgICAgeDg2X2Z4c2F2ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZ4c2F2ZQorICAgIHg4Nl9meHNhdmU2NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5meHNhdmU2NAorICAgIHg4Nl9pbmNzc3BkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5pbmNzc3BkCisgICAgeDg2X2luY3NzcHEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmluY3NzcHEKKyAgICB4ODZfaW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuaW50CisgICAgeDg2X2xsd3BjYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lmxsd3BjYgorICAgIHg4Nl9sd3BpbnMzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5sd3BpbnMzMgorICAgIHg4Nl9sd3BpbnM2NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5sd3BpbnM2NAorICAgIHg4Nl9sd3B2YWwzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5sd3B2YWwzMgorICAgIHg4Nl9sd3B2YWw2NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5sd3B2YWw2NAorICAgIHg4Nl9tbXhfZW1tcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXguZW1tcworICAgIHg4Nl9tbXhfZmVtbXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXguZmVtbXMKKyAgICB4ODZfbW14X21hc2ttb3ZxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14Lm1hc2ttb3ZxCisgICAgeDg2X21teF9tb3ZudF9kcSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5tb3ZudC5kcQorICAgIHg4Nl9tbXhfcGFja3NzZHcsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucGFja3NzZHcKKyAgICB4ODZfbW14X3BhY2tzc3diLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBhY2tzc3diCisgICAgeDg2X21teF9wYWNrdXN3YiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wYWNrdXN3YgorICAgIHg4Nl9tbXhfcGFkZF9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucGFkZC5iCisgICAgeDg2X21teF9wYWRkX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wYWRkLmQKKyAgICB4ODZfbW14X3BhZGRfcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBhZGQucQorICAgIHg4Nl9tbXhfcGFkZF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucGFkZC53CisgICAgeDg2X21teF9wYWRkc19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wYWRkcy5iCisgICAgeDg2X21teF9wYWRkc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wYWRkcy53CisgICAgeDg2X21teF9wYWRkdXNfYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wYWRkdXMuYgorICAgIHg4Nl9tbXhfcGFkZHVzX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucGFkZHVzLncKKyAgICB4ODZfbW14X3BhbGlnbnJfYiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBhbGlnbnIuYgorICAgIHg4Nl9tbXhfcGFuZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucGFuZAorICAgIHg4Nl9tbXhfcGFuZG4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucGFuZG4KKyAgICB4ODZfbW14X3BhdmdfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBhdmcuYgorICAgIHg4Nl9tbXhfcGF2Z193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucGF2Zy53CisgICAgeDg2X21teF9wY21wZXFfYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wY21wZXEuYgorICAgIHg4Nl9tbXhfcGNtcGVxX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucGNtcGVxLmQKKyAgICB4ODZfbW14X3BjbXBlcV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBjbXBlcS53CisgICAgeDg2X21teF9wY21wZ3RfYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wY21wZ3QuYgorICAgIHg4Nl9tbXhfcGNtcGd0X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucGNtcGd0LmQKKyAgICB4ODZfbW14X3BjbXBndF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBjbXBndC53CisgICAgeDg2X21teF9wZXh0cl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wZXh0ci53CisgICAgeDg2X21teF9waW5zcl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5waW5zci53CisgICAgeDg2X21teF9wbWFkZF93ZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wbWFkZC53ZAorICAgIHg4Nl9tbXhfcG1heHNfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucG1heHMudworICAgIHg4Nl9tbXhfcG1heHVfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucG1heHUuYgorICAgIHg4Nl9tbXhfcG1pbnNfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucG1pbnMudworICAgIHg4Nl9tbXhfcG1pbnVfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucG1pbnUuYgorICAgIHg4Nl9tbXhfcG1vdm1za2IsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucG1vdm1za2IKKyAgICB4ODZfbW14X3BtdWxoX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBtdWxoLncKKyAgICB4ODZfbW14X3BtdWxodV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBtdWxodS53CisgICAgeDg2X21teF9wbXVsbF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wbXVsbC53CisgICAgeDg2X21teF9wbXVsdV9kcSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wbXVsdS5kcQorICAgIHg4Nl9tbXhfcG9yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucG9yCisgICAgeDg2X21teF9wc2FkX2J3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc2FkLmJ3CisgICAgeDg2X21teF9wc2xsX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc2xsLmQKKyAgICB4ODZfbW14X3BzbGxfcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBzbGwucQorICAgIHg4Nl9tbXhfcHNsbF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHNsbC53CisgICAgeDg2X21teF9wc2xsaV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc2xsaS5kCisgICAgeDg2X21teF9wc2xsaV9xLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc2xsaS5xCisgICAgeDg2X21teF9wc2xsaV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc2xsaS53CisgICAgeDg2X21teF9wc3JhX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc3JhLmQKKyAgICB4ODZfbW14X3BzcmFfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBzcmEudworICAgIHg4Nl9tbXhfcHNyYWlfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHNyYWkuZAorICAgIHg4Nl9tbXhfcHNyYWlfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHNyYWkudworICAgIHg4Nl9tbXhfcHNybF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHNybC5kCisgICAgeDg2X21teF9wc3JsX3EsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc3JsLnEKKyAgICB4ODZfbW14X3BzcmxfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBzcmwudworICAgIHg4Nl9tbXhfcHNybGlfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHNybGkuZAorICAgIHg4Nl9tbXhfcHNybGlfcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHNybGkucQorICAgIHg4Nl9tbXhfcHNybGlfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHNybGkudworICAgIHg4Nl9tbXhfcHN1Yl9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHN1Yi5iCisgICAgeDg2X21teF9wc3ViX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc3ViLmQKKyAgICB4ODZfbW14X3BzdWJfcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBzdWIucQorICAgIHg4Nl9tbXhfcHN1Yl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHN1Yi53CisgICAgeDg2X21teF9wc3Vic19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc3Vicy5iCisgICAgeDg2X21teF9wc3Vic193LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc3Vicy53CisgICAgeDg2X21teF9wc3VidXNfYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc3VidXMuYgorICAgIHg4Nl9tbXhfcHN1YnVzX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHN1YnVzLncKKyAgICB4ODZfbW14X3B1bnBja2hidywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnB1bnBja2hidworICAgIHg4Nl9tbXhfcHVucGNraGRxLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHVucGNraGRxCisgICAgeDg2X21teF9wdW5wY2tod2QsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wdW5wY2tod2QKKyAgICB4ODZfbW14X3B1bnBja2xidywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnB1bnBja2xidworICAgIHg4Nl9tbXhfcHVucGNrbGRxLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHVucGNrbGRxCisgICAgeDg2X21teF9wdW5wY2tsd2QsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wdW5wY2tsd2QKKyAgICB4ODZfbW14X3B4b3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnB4b3IKKyAgICB4ODZfbW9uaXRvcngsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW9uaXRvcngKKyAgICB4ODZfbXdhaXR4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubXdhaXR4CisgICAgeDg2X3BjbG11bHFkcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnBjbG11bHFkcQorICAgIHg4Nl9wY2xtdWxxZHFfMjU2LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5wY2xtdWxxZHEuMjU2CisgICAgeDg2X3BjbG11bHFkcV81MTIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnBjbG11bHFkcS41MTIKKyAgICB4ODZfcmRmc2Jhc2VfMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYucmRmc2Jhc2UuMzIKKyAgICB4ODZfcmRmc2Jhc2VfNjQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYucmRmc2Jhc2UuNjQKKyAgICB4ODZfcmRnc2Jhc2VfMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYucmRnc2Jhc2UuMzIKKyAgICB4ODZfcmRnc2Jhc2VfNjQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYucmRnc2Jhc2UuNjQKKyAgICB4ODZfcmRwaWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYucmRwaWQKKyAgICB4ODZfcmRwa3J1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYucmRwa3J1CisgICAgeDg2X3JkcG1jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnJkcG1jCisgICAgeDg2X3JkcmFuZF8xNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnJkcmFuZC4xNgorICAgIHg4Nl9yZHJhbmRfMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5yZHJhbmQuMzIKKyAgICB4ODZfcmRyYW5kXzY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYucmRyYW5kLjY0CisgICAgeDg2X3Jkc2VlZF8xNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnJkc2VlZC4xNgorICAgIHg4Nl9yZHNlZWRfMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5yZHNlZWQuMzIKKyAgICB4ODZfcmRzZWVkXzY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYucmRzZWVkLjY0CisgICAgeDg2X3Jkc3NwZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnJkc3NwZAorICAgIHg4Nl9yZHNzcHEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5yZHNzcHEKKyAgICB4ODZfcmR0c2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYucmR0c2MKKyAgICB4ODZfcmR0c2NwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYucmR0c2NwCisgICAgeDg2X3JzdG9yc3NwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnJzdG9yc3NwCisgICAgeDg2X3NhdmVwcmV2c3NwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNhdmVwcmV2c3NwCisgICAgeDg2X3NlaF9laGd1YXJkLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNlaC5laGd1YXJkCisgICAgeDg2X3NlaF9laHJlZ25vZGUsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNlaC5laHJlZ25vZGUKKyAgICB4ODZfc2VoX2xzZGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc2VoLmxzZGEKKyAgICB4ODZfc2VoX3JlY292ZXJmcCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc2VoLnJlY292ZXJmcAorICAgIHg4Nl9zZXRzc2JzeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zZXRzc2JzeQorICAgIHg4Nl9zaGExbXNnMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zaGExbXNnMQorICAgIHg4Nl9zaGExbXNnMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zaGExbXNnMgorICAgIHg4Nl9zaGExbmV4dGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zaGExbmV4dGUKKyAgICB4ODZfc2hhMXJuZHM0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc2hhMXJuZHM0CisgICAgeDg2X3NoYTI1Nm1zZzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNoYTI1Nm1zZzEKKyAgICB4ODZfc2hhMjU2bXNnMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc2hhMjU2bXNnMgorICAgIHg4Nl9zaGEyNTZybmRzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zaGEyNTZybmRzMgorICAgIHg4Nl9zbHdwY2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zbHdwY2IKKyAgICB4ODZfc3NlX2NtcF9wcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLmNtcC5wcworICAgIHg4Nl9zc2VfY21wX3NzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UuY21wLnNzCisgICAgeDg2X3NzZV9jb21pZXFfc3MsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5jb21pZXEuc3MKKyAgICB4ODZfc3NlX2NvbWlnZV9zcywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLmNvbWlnZS5zcworICAgIHg4Nl9zc2VfY29taWd0X3NzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UuY29taWd0LnNzCisgICAgeDg2X3NzZV9jb21pbGVfc3MsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5jb21pbGUuc3MKKyAgICB4ODZfc3NlX2NvbWlsdF9zcywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLmNvbWlsdC5zcworICAgIHg4Nl9zc2VfY29taW5lcV9zcywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UuY29taW5lcS5zcworICAgIHg4Nl9zc2VfY3Z0cGQycGksICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UuY3Z0cGQycGkKKyAgICB4ODZfc3NlX2N2dHBpMnBkLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLmN2dHBpMnBkCisgICAgeDg2X3NzZV9jdnRwaTJwcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5jdnRwaTJwcworICAgIHg4Nl9zc2VfY3Z0cHMycGksICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UuY3Z0cHMycGkKKyAgICB4ODZfc3NlX2N2dHNpMnNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLmN2dHNpMnNzCisgICAgeDg2X3NzZV9jdnRzaTY0MnNzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5jdnRzaTY0MnNzCisgICAgeDg2X3NzZV9jdnRzczJzaSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5jdnRzczJzaQorICAgIHg4Nl9zc2VfY3Z0c3Myc2k2NCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UuY3Z0c3Myc2k2NAorICAgIHg4Nl9zc2VfY3Z0dHBkMnBpLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UuY3Z0dHBkMnBpCisgICAgeDg2X3NzZV9jdnR0cHMycGksICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5jdnR0cHMycGkKKyAgICB4ODZfc3NlX2N2dHRzczJzaSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLmN2dHRzczJzaQorICAgIHg4Nl9zc2VfY3Z0dHNzMnNpNjQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UuY3Z0dHNzMnNpNjQKKyAgICB4ODZfc3NlX2xkbXhjc3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLmxkbXhjc3IKKyAgICB4ODZfc3NlX21heF9wcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLm1heC5wcworICAgIHg4Nl9zc2VfbWF4X3NzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UubWF4LnNzCisgICAgeDg2X3NzZV9taW5fcHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5taW4ucHMKKyAgICB4ODZfc3NlX21pbl9zcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLm1pbi5zcworICAgIHg4Nl9zc2VfbW92bXNrX3BzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UubW92bXNrLnBzCisgICAgeDg2X3NzZV9wc2h1Zl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5wc2h1Zi53CisgICAgeDg2X3NzZV9yY3BfcHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5yY3AucHMKKyAgICB4ODZfc3NlX3JjcF9zcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLnJjcC5zcworICAgIHg4Nl9zc2VfcnNxcnRfcHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UucnNxcnQucHMKKyAgICB4ODZfc3NlX3JzcXJ0X3NzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLnJzcXJ0LnNzCisgICAgeDg2X3NzZV9zZmVuY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5zZmVuY2UKKyAgICB4ODZfc3NlX3NxcnRfcHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLnNxcnQucHMKKyAgICB4ODZfc3NlX3NxcnRfc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLnNxcnQuc3MKKyAgICB4ODZfc3NlX3N0bXhjc3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLnN0bXhjc3IKKyAgICB4ODZfc3NlX3Vjb21pZXFfc3MsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLnVjb21pZXEuc3MKKyAgICB4ODZfc3NlX3Vjb21pZ2Vfc3MsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLnVjb21pZ2Uuc3MKKyAgICB4ODZfc3NlX3Vjb21pZ3Rfc3MsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLnVjb21pZ3Quc3MKKyAgICB4ODZfc3NlX3Vjb21pbGVfc3MsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLnVjb21pbGUuc3MKKyAgICB4ODZfc3NlX3Vjb21pbHRfc3MsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLnVjb21pbHQuc3MKKyAgICB4ODZfc3NlX3Vjb21pbmVxX3NzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLnVjb21pbmVxLnNzCisgICAgeDg2X3NzZTJfY2xmbHVzaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuY2xmbHVzaAorICAgIHg4Nl9zc2UyX2NtcF9wZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmNtcC5wZAorICAgIHg4Nl9zc2UyX2NtcF9zZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmNtcC5zZAorICAgIHg4Nl9zc2UyX2NvbWllcV9zZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmNvbWllcS5zZAorICAgIHg4Nl9zc2UyX2NvbWlnZV9zZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmNvbWlnZS5zZAorICAgIHg4Nl9zc2UyX2NvbWlndF9zZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmNvbWlndC5zZAorICAgIHg4Nl9zc2UyX2NvbWlsZV9zZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmNvbWlsZS5zZAorICAgIHg4Nl9zc2UyX2NvbWlsdF9zZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmNvbWlsdC5zZAorICAgIHg4Nl9zc2UyX2NvbWluZXFfc2QsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmNvbWluZXEuc2QKKyAgICB4ODZfc3NlMl9jdnRkcTJwcywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5jdnRkcTJwcworICAgIHg4Nl9zc2UyX2N2dHBkMmRxLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmN2dHBkMmRxCisgICAgeDg2X3NzZTJfY3Z0cGQycHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuY3Z0cGQycHMKKyAgICB4ODZfc3NlMl9jdnRwczJkcSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5jdnRwczJkcQorICAgIHg4Nl9zc2UyX2N2dHNkMnNpLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmN2dHNkMnNpCisgICAgeDg2X3NzZTJfY3Z0c2Qyc2k2NCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuY3Z0c2Qyc2k2NAorICAgIHg4Nl9zc2UyX2N2dHNkMnNzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmN2dHNkMnNzCisgICAgeDg2X3NzZTJfY3Z0c2kyc2QsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuY3Z0c2kyc2QKKyAgICB4ODZfc3NlMl9jdnRzaTY0MnNkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5jdnRzaTY0MnNkCisgICAgeDg2X3NzZTJfY3Z0c3Myc2QsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuY3Z0c3Myc2QKKyAgICB4ODZfc3NlMl9jdnR0cGQyZHEsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5jdnR0cGQyZHEKKyAgICB4ODZfc3NlMl9jdnR0cHMyZHEsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5jdnR0cHMyZHEKKyAgICB4ODZfc3NlMl9jdnR0c2Qyc2ksICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5jdnR0c2Qyc2kKKyAgICB4ODZfc3NlMl9jdnR0c2Qyc2k2NCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5jdnR0c2Qyc2k2NAorICAgIHg4Nl9zc2UyX2xmZW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmxmZW5jZQorICAgIHg4Nl9zc2UyX21hc2ttb3ZfZHF1LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLm1hc2ttb3YuZHF1CisgICAgeDg2X3NzZTJfbWF4X3BkLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIubWF4LnBkCisgICAgeDg2X3NzZTJfbWF4X3NkLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIubWF4LnNkCisgICAgeDg2X3NzZTJfbWZlbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIubWZlbmNlCisgICAgeDg2X3NzZTJfbWluX3BkLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIubWluLnBkCisgICAgeDg2X3NzZTJfbWluX3NkLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIubWluLnNkCisgICAgeDg2X3NzZTJfbW92bXNrX3BkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIubW92bXNrLnBkCisgICAgeDg2X3NzZTJfcGFja3NzZHdfMTI4LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucGFja3NzZHcuMTI4CisgICAgeDg2X3NzZTJfcGFja3Nzd2JfMTI4LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucGFja3Nzd2IuMTI4CisgICAgeDg2X3NzZTJfcGFja3Vzd2JfMTI4LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucGFja3Vzd2IuMTI4CisgICAgeDg2X3NzZTJfcGFkZHNfYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucGFkZHMuYgorICAgIHg4Nl9zc2UyX3BhZGRzX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBhZGRzLncKKyAgICB4ODZfc3NlMl9wYWRkdXNfYiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wYWRkdXMuYgorICAgIHg4Nl9zc2UyX3BhZGR1c193LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBhZGR1cy53CisgICAgeDg2X3NzZTJfcGF1c2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucGF1c2UKKyAgICB4ODZfc3NlMl9wbWFkZF93ZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wbWFkZC53ZAorICAgIHg4Nl9zc2UyX3Btb3Ztc2tiXzEyOCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBtb3Ztc2tiLjEyOAorICAgIHg4Nl9zc2UyX3BtdWxoX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBtdWxoLncKKyAgICB4ODZfc3NlMl9wbXVsaHVfdywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wbXVsaHUudworICAgIHg4Nl9zc2UyX3BtdWx1X2RxLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBtdWx1LmRxCisgICAgeDg2X3NzZTJfcHNhZF9idywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucHNhZC5idworICAgIHg4Nl9zc2UyX3BzbGxfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBzbGwuZAorICAgIHg4Nl9zc2UyX3BzbGxfcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBzbGwucQorICAgIHg4Nl9zc2UyX3BzbGxfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBzbGwudworICAgIHg4Nl9zc2UyX3BzbGxpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBzbGxpLmQKKyAgICB4ODZfc3NlMl9wc2xsaV9xLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wc2xsaS5xCisgICAgeDg2X3NzZTJfcHNsbGlfdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucHNsbGkudworICAgIHg4Nl9zc2UyX3BzcmFfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBzcmEuZAorICAgIHg4Nl9zc2UyX3BzcmFfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBzcmEudworICAgIHg4Nl9zc2UyX3BzcmFpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBzcmFpLmQKKyAgICB4ODZfc3NlMl9wc3JhaV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wc3JhaS53CisgICAgeDg2X3NzZTJfcHNybF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucHNybC5kCisgICAgeDg2X3NzZTJfcHNybF9xLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucHNybC5xCisgICAgeDg2X3NzZTJfcHNybF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucHNybC53CisgICAgeDg2X3NzZTJfcHNybGlfZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucHNybGkuZAorICAgIHg4Nl9zc2UyX3BzcmxpX3EsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBzcmxpLnEKKyAgICB4ODZfc3NlMl9wc3JsaV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wc3JsaS53CisgICAgeDg2X3NzZTJfcHN1YnNfYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucHN1YnMuYgorICAgIHg4Nl9zc2UyX3BzdWJzX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBzdWJzLncKKyAgICB4ODZfc3NlMl9wc3VidXNfYiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wc3VidXMuYgorICAgIHg4Nl9zc2UyX3BzdWJ1c193LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBzdWJ1cy53CisgICAgeDg2X3NzZTJfc3FydF9wZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuc3FydC5wZAorICAgIHg4Nl9zc2UyX3NxcnRfc2QsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnNxcnQuc2QKKyAgICB4ODZfc3NlMl91Y29taWVxX3NkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi51Y29taWVxLnNkCisgICAgeDg2X3NzZTJfdWNvbWlnZV9zZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIudWNvbWlnZS5zZAorICAgIHg4Nl9zc2UyX3Vjb21pZ3Rfc2QsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnVjb21pZ3Quc2QKKyAgICB4ODZfc3NlMl91Y29taWxlX3NkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi51Y29taWxlLnNkCisgICAgeDg2X3NzZTJfdWNvbWlsdF9zZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIudWNvbWlsdC5zZAorICAgIHg4Nl9zc2UyX3Vjb21pbmVxX3NkLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnVjb21pbmVxLnNkCisgICAgeDg2X3NzZTNfYWRkc3ViX3BkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTMuYWRkc3ViLnBkCisgICAgeDg2X3NzZTNfYWRkc3ViX3BzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTMuYWRkc3ViLnBzCisgICAgeDg2X3NzZTNfaGFkZF9wZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTMuaGFkZC5wZAorICAgIHg4Nl9zc2UzX2hhZGRfcHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UzLmhhZGQucHMKKyAgICB4ODZfc3NlM19oc3ViX3BkLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMy5oc3ViLnBkCisgICAgeDg2X3NzZTNfaHN1Yl9wcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTMuaHN1Yi5wcworICAgIHg4Nl9zc2UzX2xkdV9kcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UzLmxkdS5kcQorICAgIHg4Nl9zc2UzX21vbml0b3IsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UzLm1vbml0b3IKKyAgICB4ODZfc3NlM19td2FpdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMy5td2FpdAorICAgIHg4Nl9zc2U0MV9ibGVuZHZwZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0MS5ibGVuZHZwZAorICAgIHg4Nl9zc2U0MV9ibGVuZHZwcywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0MS5ibGVuZHZwcworICAgIHg4Nl9zc2U0MV9kcHBkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0MS5kcHBkCisgICAgeDg2X3NzZTQxX2RwcHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQxLmRwcHMKKyAgICB4ODZfc3NlNDFfaW5zZXJ0cHMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDEuaW5zZXJ0cHMKKyAgICB4ODZfc3NlNDFfbXBzYWRidywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDEubXBzYWRidworICAgIHg4Nl9zc2U0MV9wYWNrdXNkdywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0MS5wYWNrdXNkdworICAgIHg4Nl9zc2U0MV9wYmxlbmR2YiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0MS5wYmxlbmR2YgorICAgIHg4Nl9zc2U0MV9waG1pbnBvc3V3LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0MS5waG1pbnBvc3V3CisgICAgeDg2X3NzZTQxX3BtdWxkcSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQxLnBtdWxkcQorICAgIHg4Nl9zc2U0MV9wdGVzdGMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0MS5wdGVzdGMKKyAgICB4ODZfc3NlNDFfcHRlc3RuemMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDEucHRlc3RuemMKKyAgICB4ODZfc3NlNDFfcHRlc3R6LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDEucHRlc3R6CisgICAgeDg2X3NzZTQxX3JvdW5kX3BkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQxLnJvdW5kLnBkCisgICAgeDg2X3NzZTQxX3JvdW5kX3BzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQxLnJvdW5kLnBzCisgICAgeDg2X3NzZTQxX3JvdW5kX3NkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQxLnJvdW5kLnNkCisgICAgeDg2X3NzZTQxX3JvdW5kX3NzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQxLnJvdW5kLnNzCisgICAgeDg2X3NzZTQyX2NyYzMyXzMyXzE2LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQyLmNyYzMyLjMyLjE2CisgICAgeDg2X3NzZTQyX2NyYzMyXzMyXzMyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQyLmNyYzMyLjMyLjMyCisgICAgeDg2X3NzZTQyX2NyYzMyXzMyXzgsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQyLmNyYzMyLjMyLjgKKyAgICB4ODZfc3NlNDJfY3JjMzJfNjRfNjQsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDIuY3JjMzIuNjQuNjQKKyAgICB4ODZfc3NlNDJfcGNtcGVzdHJpMTI4LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDIucGNtcGVzdHJpMTI4CisgICAgeDg2X3NzZTQyX3BjbXBlc3RyaWExMjgsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQyLnBjbXBlc3RyaWExMjgKKyAgICB4ODZfc3NlNDJfcGNtcGVzdHJpYzEyOCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDIucGNtcGVzdHJpYzEyOAorICAgIHg4Nl9zc2U0Ml9wY21wZXN0cmlvMTI4LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0Mi5wY21wZXN0cmlvMTI4CisgICAgeDg2X3NzZTQyX3BjbXBlc3RyaXMxMjgsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQyLnBjbXBlc3RyaXMxMjgKKyAgICB4ODZfc3NlNDJfcGNtcGVzdHJpejEyOCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDIucGNtcGVzdHJpejEyOAorICAgIHg4Nl9zc2U0Ml9wY21wZXN0cm0xMjgsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0Mi5wY21wZXN0cm0xMjgKKyAgICB4ODZfc3NlNDJfcGNtcGlzdHJpMTI4LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDIucGNtcGlzdHJpMTI4CisgICAgeDg2X3NzZTQyX3BjbXBpc3RyaWExMjgsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQyLnBjbXBpc3RyaWExMjgKKyAgICB4ODZfc3NlNDJfcGNtcGlzdHJpYzEyOCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDIucGNtcGlzdHJpYzEyOAorICAgIHg4Nl9zc2U0Ml9wY21waXN0cmlvMTI4LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0Mi5wY21waXN0cmlvMTI4CisgICAgeDg2X3NzZTQyX3BjbXBpc3RyaXMxMjgsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQyLnBjbXBpc3RyaXMxMjgKKyAgICB4ODZfc3NlNDJfcGNtcGlzdHJpejEyOCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDIucGNtcGlzdHJpejEyOAorICAgIHg4Nl9zc2U0Ml9wY21waXN0cm0xMjgsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0Mi5wY21waXN0cm0xMjgKKyAgICB4ODZfc3NlNGFfZXh0cnEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNGEuZXh0cnEKKyAgICB4ODZfc3NlNGFfZXh0cnFpLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNGEuZXh0cnFpCisgICAgeDg2X3NzZTRhX2luc2VydHEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTRhLmluc2VydHEKKyAgICB4ODZfc3NlNGFfaW5zZXJ0cWksICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNGEuaW5zZXJ0cWkKKyAgICB4ODZfc3NzZTNfcGFic19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NzZTMucGFicy5iCisgICAgeDg2X3Nzc2UzX3BhYnNfZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBhYnMuZAorICAgIHg4Nl9zc3NlM19wYWJzX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc3NlMy5wYWJzLncKKyAgICB4ODZfc3NzZTNfcGhhZGRfZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NzZTMucGhhZGQuZAorICAgIHg4Nl9zc3NlM19waGFkZF9kXzEyOCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc3NlMy5waGFkZC5kLjEyOAorICAgIHg4Nl9zc3NlM19waGFkZF9zdywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc3NlMy5waGFkZC5zdworICAgIHg4Nl9zc3NlM19waGFkZF9zd18xMjgsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc3NlMy5waGFkZC5zdy4xMjgKKyAgICB4ODZfc3NzZTNfcGhhZGRfdywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NzZTMucGhhZGQudworICAgIHg4Nl9zc3NlM19waGFkZF93XzEyOCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc3NlMy5waGFkZC53LjEyOAorICAgIHg4Nl9zc3NlM19waHN1Yl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc3NlMy5waHN1Yi5kCisgICAgeDg2X3Nzc2UzX3Boc3ViX2RfMTI4LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBoc3ViLmQuMTI4CisgICAgeDg2X3Nzc2UzX3Boc3ViX3N3LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBoc3ViLnN3CisgICAgeDg2X3Nzc2UzX3Boc3ViX3N3XzEyOCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBoc3ViLnN3LjEyOAorICAgIHg4Nl9zc3NlM19waHN1Yl93LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc3NlMy5waHN1Yi53CisgICAgeDg2X3Nzc2UzX3Boc3ViX3dfMTI4LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBoc3ViLncuMTI4CisgICAgeDg2X3Nzc2UzX3BtYWRkX3ViX3N3LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBtYWRkLnViLnN3CisgICAgeDg2X3Nzc2UzX3BtYWRkX3ViX3N3XzEyOCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBtYWRkLnViLnN3LjEyOAorICAgIHg4Nl9zc3NlM19wbXVsX2hyX3N3LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc3NlMy5wbXVsLmhyLnN3CisgICAgeDg2X3Nzc2UzX3BtdWxfaHJfc3dfMTI4LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBtdWwuaHIuc3cuMTI4CisgICAgeDg2X3Nzc2UzX3BzaHVmX2IsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBzaHVmLmIKKyAgICB4ODZfc3NzZTNfcHNodWZfYl8xMjgsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NzZTMucHNodWYuYi4xMjgKKyAgICB4ODZfc3NzZTNfcHNpZ25fYiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NzZTMucHNpZ24uYgorICAgIHg4Nl9zc3NlM19wc2lnbl9iXzEyOCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc3NlMy5wc2lnbi5iLjEyOAorICAgIHg4Nl9zc3NlM19wc2lnbl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc3NlMy5wc2lnbi5kCisgICAgeDg2X3Nzc2UzX3BzaWduX2RfMTI4LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBzaWduLmQuMTI4CisgICAgeDg2X3Nzc2UzX3BzaWduX3csICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBzaWduLncKKyAgICB4ODZfc3NzZTNfcHNpZ25fd18xMjgsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NzZTMucHNpZ24udy4xMjgKKyAgICB4ODZfc3ViYm9ycm93X3UzMiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3ViYm9ycm93LnUzMgorICAgIHg4Nl9zdWJib3Jyb3dfdTY0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zdWJib3Jyb3cudTY0CisgICAgeDg2X3RibV9iZXh0cmlfdTMyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnRibS5iZXh0cmkudTMyCisgICAgeDg2X3RibV9iZXh0cmlfdTY0LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnRibS5iZXh0cmkudTY0CisgICAgeDg2X3ZjdnRwaDJwc18xMjgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnZjdnRwaDJwcy4xMjgKKyAgICB4ODZfdmN2dHBoMnBzXzI1NiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYudmN2dHBoMnBzLjI1NgorICAgIHg4Nl92Y3Z0cHMycGhfMTI4LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni52Y3Z0cHMycGguMTI4CisgICAgeDg2X3ZjdnRwczJwaF8yNTYsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnZjdnRwczJwaC4yNTYKKyAgICB4ODZfdmdmMnA4YWZmaW5laW52cWJfMTI4LCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYudmdmMnA4YWZmaW5laW52cWIuMTI4CisgICAgeDg2X3ZnZjJwOGFmZmluZWludnFiXzI1NiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnZnZjJwOGFmZmluZWludnFiLjI1NgorICAgIHg4Nl92Z2YycDhhZmZpbmVpbnZxYl81MTIsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni52Z2YycDhhZmZpbmVpbnZxYi41MTIKKyAgICB4ODZfdmdmMnA4YWZmaW5lcWJfMTI4LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYudmdmMnA4YWZmaW5lcWIuMTI4CisgICAgeDg2X3ZnZjJwOGFmZmluZXFiXzI1NiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnZnZjJwOGFmZmluZXFiLjI1NgorICAgIHg4Nl92Z2YycDhhZmZpbmVxYl81MTIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni52Z2YycDhhZmZpbmVxYi41MTIKKyAgICB4ODZfdmdmMnA4bXVsYl8xMjgsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYudmdmMnA4bXVsYi4xMjgKKyAgICB4ODZfdmdmMnA4bXVsYl8yNTYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYudmdmMnA4bXVsYi4yNTYKKyAgICB4ODZfdmdmMnA4bXVsYl81MTIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYudmdmMnA4bXVsYi41MTIKKyAgICB4ODZfd3Jmc2Jhc2VfMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYud3Jmc2Jhc2UuMzIKKyAgICB4ODZfd3Jmc2Jhc2VfNjQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYud3Jmc2Jhc2UuNjQKKyAgICB4ODZfd3Jnc2Jhc2VfMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYud3Jnc2Jhc2UuMzIKKyAgICB4ODZfd3Jnc2Jhc2VfNjQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYud3Jnc2Jhc2UuNjQKKyAgICB4ODZfd3Jwa3J1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYud3Jwa3J1CisgICAgeDg2X3dyc3NkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lndyc3NkCisgICAgeDg2X3dyc3NxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lndyc3NxCisgICAgeDg2X3dydXNzZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LndydXNzZAorICAgIHg4Nl93cnVzc3EsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni53cnVzc3EKKyAgICB4ODZfeGFib3J0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueGFib3J0CisgICAgeDg2X3hiZWdpbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhiZWdpbgorICAgIHg4Nl94ZW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54ZW5kCisgICAgeDg2X3hnZXRidiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhnZXRidgorICAgIHg4Nl94b3BfdmZyY3pfcGQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudmZyY3oucGQKKyAgICB4ODZfeG9wX3ZmcmN6X3BkXzI1NiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZmcmN6LnBkLjI1NgorICAgIHg4Nl94b3BfdmZyY3pfcHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudmZyY3oucHMKKyAgICB4ODZfeG9wX3ZmcmN6X3BzXzI1NiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZmcmN6LnBzLjI1NgorICAgIHg4Nl94b3BfdmZyY3pfc2QsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudmZyY3ouc2QKKyAgICB4ODZfeG9wX3ZmcmN6X3NzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZmcmN6LnNzCisgICAgeDg2X3hvcF92cGNvbWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGNvbWIKKyAgICB4ODZfeG9wX3ZwY29tZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwY29tZAorICAgIHg4Nl94b3BfdnBjb21xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBjb21xCisgICAgeDg2X3hvcF92cGNvbXViLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGNvbXViCisgICAgeDg2X3hvcF92cGNvbXVkLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGNvbXVkCisgICAgeDg2X3hvcF92cGNvbXVxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGNvbXVxCisgICAgeDg2X3hvcF92cGNvbXV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGNvbXV3CisgICAgeDg2X3hvcF92cGNvbXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGNvbXcKKyAgICB4ODZfeG9wX3ZwZXJtaWwycGQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwZXJtaWwycGQKKyAgICB4ODZfeG9wX3ZwZXJtaWwycGRfMjU2LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwZXJtaWwycGQuMjU2CisgICAgeDg2X3hvcF92cGVybWlsMnBzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGVybWlsMnBzCisgICAgeDg2X3hvcF92cGVybWlsMnBzXzI1NiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGVybWlsMnBzLjI1NgorICAgIHg4Nl94b3BfdnBoYWRkYmQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBoYWRkYmQKKyAgICB4ODZfeG9wX3ZwaGFkZGJxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwaGFkZGJxCisgICAgeDg2X3hvcF92cGhhZGRidywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGhhZGRidworICAgIHg4Nl94b3BfdnBoYWRkZHEsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBoYWRkZHEKKyAgICB4ODZfeG9wX3ZwaGFkZHViZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwaGFkZHViZAorICAgIHg4Nl94b3BfdnBoYWRkdWJxLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBoYWRkdWJxCisgICAgeDg2X3hvcF92cGhhZGR1YncsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGhhZGR1YncKKyAgICB4ODZfeG9wX3ZwaGFkZHVkcSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwaGFkZHVkcQorICAgIHg4Nl94b3BfdnBoYWRkdXdkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBoYWRkdXdkCisgICAgeDg2X3hvcF92cGhhZGR1d3EsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGhhZGR1d3EKKyAgICB4ODZfeG9wX3ZwaGFkZHdkLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwaGFkZHdkCisgICAgeDg2X3hvcF92cGhhZGR3cSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGhhZGR3cQorICAgIHg4Nl94b3BfdnBoc3ViYncsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBoc3ViYncKKyAgICB4ODZfeG9wX3ZwaHN1YmRxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwaHN1YmRxCisgICAgeDg2X3hvcF92cGhzdWJ3ZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGhzdWJ3ZAorICAgIHg4Nl94b3BfdnBtYWNzZGQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBtYWNzZGQKKyAgICB4ODZfeG9wX3ZwbWFjc2RxaCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwbWFjc2RxaAorICAgIHg4Nl94b3BfdnBtYWNzZHFsLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBtYWNzZHFsCisgICAgeDg2X3hvcF92cG1hY3NzZGQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cG1hY3NzZGQKKyAgICB4ODZfeG9wX3ZwbWFjc3NkcWgsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwbWFjc3NkcWgKKyAgICB4ODZfeG9wX3ZwbWFjc3NkcWwsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwbWFjc3NkcWwKKyAgICB4ODZfeG9wX3ZwbWFjc3N3ZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwbWFjc3N3ZAorICAgIHg4Nl94b3BfdnBtYWNzc3d3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBtYWNzc3d3CisgICAgeDg2X3hvcF92cG1hY3N3ZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cG1hY3N3ZAorICAgIHg4Nl94b3BfdnBtYWNzd3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBtYWNzd3cKKyAgICB4ODZfeG9wX3ZwbWFkY3Nzd2QsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwbWFkY3Nzd2QKKyAgICB4ODZfeG9wX3ZwbWFkY3N3ZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwbWFkY3N3ZAorICAgIHg4Nl94b3BfdnBwZXJtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBwZXJtCisgICAgeDg2X3hvcF92cHJvdGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cHJvdGIKKyAgICB4ODZfeG9wX3Zwcm90YmksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwcm90YmkKKyAgICB4ODZfeG9wX3Zwcm90ZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwcm90ZAorICAgIHg4Nl94b3BfdnByb3RkaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnByb3RkaQorICAgIHg4Nl94b3BfdnByb3RxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnByb3RxCisgICAgeDg2X3hvcF92cHJvdHFpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cHJvdHFpCisgICAgeDg2X3hvcF92cHJvdHcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cHJvdHcKKyAgICB4ODZfeG9wX3Zwcm90d2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwcm90d2kKKyAgICB4ODZfeG9wX3Zwc2hhYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwc2hhYgorICAgIHg4Nl94b3BfdnBzaGFkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBzaGFkCisgICAgeDg2X3hvcF92cHNoYXEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cHNoYXEKKyAgICB4ODZfeG9wX3Zwc2hhdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwc2hhdworICAgIHg4Nl94b3BfdnBzaGxiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBzaGxiCisgICAgeDg2X3hvcF92cHNobGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cHNobGQKKyAgICB4ODZfeG9wX3Zwc2hscSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwc2hscQorICAgIHg4Nl94b3BfdnBzaGx3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBzaGx3CisgICAgeDg2X3hyc3RvciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lnhyc3RvcgorICAgIHg4Nl94cnN0b3I2NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54cnN0b3I2NAorICAgIHg4Nl94cnN0b3JzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54cnN0b3JzCisgICAgeDg2X3hyc3RvcnM2NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lnhyc3RvcnM2NAorICAgIHg4Nl94c2F2ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54c2F2ZQorICAgIHg4Nl94c2F2ZTY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54c2F2ZTY0CisgICAgeDg2X3hzYXZlYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhzYXZlYworICAgIHg4Nl94c2F2ZWM2NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54c2F2ZWM2NAorICAgIHg4Nl94c2F2ZW9wdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54c2F2ZW9wdAorICAgIHg4Nl94c2F2ZW9wdDY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54c2F2ZW9wdDY0CisgICAgeDg2X3hzYXZlcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhzYXZlcworICAgIHg4Nl94c2F2ZXM2NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54c2F2ZXM2NAorICAgIHg4Nl94c2V0YnYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54c2V0YnYKKyAgICB4ODZfeHRlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueHRlc3QKKyAgICB4Y29yZV9iaXRyZXYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5iaXRyZXYKKyAgICB4Y29yZV9jaGVja2V2ZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5jaGVja2V2ZW50CisgICAgeGNvcmVfY2hrY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuY2hrY3QKKyAgICB4Y29yZV9jbHJlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5jbHJlCisgICAgeGNvcmVfY2xycHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuY2xycHQKKyAgICB4Y29yZV9jbHJzciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5jbHJzcgorICAgIHhjb3JlX2NyYzMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLmNyYzMyCisgICAgeGNvcmVfY3JjOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuY3JjOAorICAgIHhjb3JlX2VkdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLmVkdQorICAgIHhjb3JlX2VldSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLmVldQorICAgIHhjb3JlX2VuZGluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLmVuZGluCisgICAgeGNvcmVfZnJlZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuZnJlZXIKKyAgICB4Y29yZV9nZXRlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5nZXRlZAorICAgIHhjb3JlX2dldGV0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLmdldGV0CisgICAgeGNvcmVfZ2V0aWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuZ2V0aWQKKyAgICB4Y29yZV9nZXRwcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5nZXRwcworICAgIHhjb3JlX2dldHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLmdldHIKKyAgICB4Y29yZV9nZXRzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5nZXRzdAorICAgIHhjb3JlX2dldHRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLmdldHRzCisgICAgeGNvcmVfaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuaW4KKyAgICB4Y29yZV9pbmN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5pbmN0CisgICAgeGNvcmVfaW5pdGNwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuaW5pdGNwCisgICAgeGNvcmVfaW5pdGRwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuaW5pdGRwCisgICAgeGNvcmVfaW5pdGxyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuaW5pdGxyCisgICAgeGNvcmVfaW5pdHBjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuaW5pdHBjCisgICAgeGNvcmVfaW5pdHNwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuaW5pdHNwCisgICAgeGNvcmVfaW5zaHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuaW5zaHIKKyAgICB4Y29yZV9pbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5pbnQKKyAgICB4Y29yZV9tam9pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5tam9pbgorICAgIHhjb3JlX21zeW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLm1zeW5jCisgICAgeGNvcmVfb3V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUub3V0CisgICAgeGNvcmVfb3V0Y3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUub3V0Y3QKKyAgICB4Y29yZV9vdXRzaHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5vdXRzaHIKKyAgICB4Y29yZV9vdXR0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5vdXR0CisgICAgeGNvcmVfcGVlaywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUucGVlaworICAgIHhjb3JlX3NldGMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLnNldGMKKyAgICB4Y29yZV9zZXRjbGssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5zZXRjbGsKKyAgICB4Y29yZV9zZXRkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5zZXRkCisgICAgeGNvcmVfc2V0ZXYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuc2V0ZXYKKyAgICB4Y29yZV9zZXRwcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5zZXRwcworICAgIHhjb3JlX3NldHBzYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLnNldHBzYworICAgIHhjb3JlX3NldHB0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLnNldHB0CisgICAgeGNvcmVfc2V0cmR5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuc2V0cmR5CisgICAgeGNvcmVfc2V0c3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuc2V0c3IKKyAgICB4Y29yZV9zZXR0dywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5zZXR0dworICAgIHhjb3JlX3NldHYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLnNldHYKKyAgICB4Y29yZV9zZXh0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5zZXh0CisgICAgeGNvcmVfc3N5bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuc3N5bmMKKyAgICB4Y29yZV9zeW5jciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5zeW5jcgorICAgIHhjb3JlX3Rlc3RjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLnRlc3RjdAorICAgIHhjb3JlX3Rlc3R3Y3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLnRlc3R3Y3QKKyAgICB4Y29yZV93YWl0ZXZlbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS53YWl0ZXZlbnQKKyAgICB4Y29yZV96ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS56ZXh0CisjZW5kaWYKKworLy8gVGFyZ2V0IG1hcHBpbmcKKyNpZmRlZiBHRVRfSU5UUklOU0lDX1RBUkdFVF9EQVRBCitzdHJ1Y3QgSW50cmluc2ljVGFyZ2V0SW5mbyB7CisgIGxsdm06OlN0cmluZ0xpdGVyYWwgTmFtZTsKKyAgc2l6ZV90IE9mZnNldDsKKyAgc2l6ZV90IENvdW50OworfTsKK3N0YXRpYyBjb25zdGV4cHIgSW50cmluc2ljVGFyZ2V0SW5mbyBUYXJnZXRJbmZvc1tdID0geworICB7bGx2bTo6U3RyaW5nTGl0ZXJhbCgiIiksIDAsIDE3NH0sCisgIHtsbHZtOjpTdHJpbmdMaXRlcmFsKCJhYXJjaDY0IiksIDE3NCwgMTg5fSwKKyAge2xsdm06OlN0cmluZ0xpdGVyYWwoImFtZGdjbiIpLCAzNjMsIDIxM30sCisgIHtsbHZtOjpTdHJpbmdMaXRlcmFsKCJhcm0iKSwgNTc2LCAyNDB9LAorICB7bGx2bTo6U3RyaW5nTGl0ZXJhbCgiYnBmIiksIDgxNiwgNH0sCisgIHtsbHZtOjpTdHJpbmdMaXRlcmFsKCJoZXhhZ29uIiksIDgyMCwgMTcwOH0sCisgIHtsbHZtOjpTdHJpbmdMaXRlcmFsKCJtaXBzIiksIDI1MjgsIDY2N30sCisgIHtsbHZtOjpTdHJpbmdMaXRlcmFsKCJudnZtIiksIDMxOTUsIDEwMDV9LAorICB7bGx2bTo6U3RyaW5nTGl0ZXJhbCgicHBjIiksIDQyMDAsIDM5Nn0sCisgIHtsbHZtOjpTdHJpbmdMaXRlcmFsKCJyNjAwIiksIDQ1OTYsIDIxfSwKKyAge2xsdm06OlN0cmluZ0xpdGVyYWwoInMzOTAiKSwgNDYxNywgMjIwfSwKKyAge2xsdm06OlN0cmluZ0xpdGVyYWwoIndhc20iKSwgNDgzNywgOH0sCisgIHtsbHZtOjpTdHJpbmdMaXRlcmFsKCJ4ODYiKSwgNDg0NSwgMTUwNn0sCisgIHtsbHZtOjpTdHJpbmdMaXRlcmFsKCJ4Y29yZSIpLCA2MzUxLCA1M30sCit9OworI2VuZGlmCisKKy8vIEludHJpbnNpYyBJRCB0byBuYW1lIHRhYmxlCisjaWZkZWYgR0VUX0lOVFJJTlNJQ19OQU1FX1RBQkxFCisgIC8vIE5vdGUgdGhhdCBlbnRyeSAjMCBpcyB0aGUgaW52YWxpZCBpbnRyaW5zaWMhCisgICJsbHZtLmFkZHJlc3NvZnJldHVybmFkZHJlc3MiLAorICAibGx2bS5hZGp1c3QudHJhbXBvbGluZSIsCisgICJsbHZtLmFubm90YXRpb24iLAorICAibGx2bS5hc3N1bWUiLAorICAibGx2bS5iaXRyZXZlcnNlIiwKKyAgImxsdm0uYnN3YXAiLAorICAibGx2bS5jYW5vbmljYWxpemUiLAorICAibGx2bS5jZWlsIiwKKyAgImxsdm0uY2xlYXJfY2FjaGUiLAorICAibGx2bS5jb2Rldmlldy5hbm5vdGF0aW9uIiwKKyAgImxsdm0uY29udmVydC5mcm9tLmZwMTYiLAorICAibGx2bS5jb252ZXJ0LnRvLmZwMTYiLAorICAibGx2bS5jb3B5c2lnbiIsCisgICJsbHZtLmNvcm8uYWxsb2MiLAorICAibGx2bS5jb3JvLmJlZ2luIiwKKyAgImxsdm0uY29yby5kZXN0cm95IiwKKyAgImxsdm0uY29yby5kb25lIiwKKyAgImxsdm0uY29yby5lbmQiLAorICAibGx2bS5jb3JvLmZyYW1lIiwKKyAgImxsdm0uY29yby5mcmVlIiwKKyAgImxsdm0uY29yby5pZCIsCisgICJsbHZtLmNvcm8ucGFyYW0iLAorICAibGx2bS5jb3JvLnByb21pc2UiLAorICAibGx2bS5jb3JvLnJlc3VtZSIsCisgICJsbHZtLmNvcm8uc2F2ZSIsCisgICJsbHZtLmNvcm8uc2l6ZSIsCisgICJsbHZtLmNvcm8uc3ViZm4uYWRkciIsCisgICJsbHZtLmNvcm8uc3VzcGVuZCIsCisgICJsbHZtLmNvcyIsCisgICJsbHZtLmN0bHoiLAorICAibGx2bS5jdHBvcCIsCisgICJsbHZtLmN0dHoiLAorICAibGx2bS5kYmcuYWRkciIsCisgICJsbHZtLmRiZy5kZWNsYXJlIiwKKyAgImxsdm0uZGJnLnZhbHVlIiwKKyAgImxsdm0uZGVidWd0cmFwIiwKKyAgImxsdm0uZG9ub3RoaW5nIiwKKyAgImxsdm0uZWguZHdhcmYuY2ZhIiwKKyAgImxsdm0uZWguZXhjZXB0aW9uY29kZSIsCisgICJsbHZtLmVoLmV4Y2VwdGlvbnBvaW50ZXIiLAorICAibGx2bS5laC5yZXR1cm4uaTMyIiwKKyAgImxsdm0uZWgucmV0dXJuLmk2NCIsCisgICJsbHZtLmVoLnNqbGouY2FsbHNpdGUiLAorICAibGx2bS5laC5zamxqLmZ1bmN0aW9uY29udGV4dCIsCisgICJsbHZtLmVoLnNqbGoubG9uZ2ptcCIsCisgICJsbHZtLmVoLnNqbGoubHNkYSIsCisgICJsbHZtLmVoLnNqbGouc2V0am1wIiwKKyAgImxsdm0uZWguc2psai5zZXR1cC5kaXNwYXRjaCIsCisgICJsbHZtLmVoLnR5cGVpZC5mb3IiLAorICAibGx2bS5laC51bndpbmQuaW5pdCIsCisgICJsbHZtLmV4cCIsCisgICJsbHZtLmV4cDIiLAorICAibGx2bS5leHBlY3QiLAorICAibGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuY29zIiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmV4cCIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5leHAyIiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmZhZGQiLAorICAibGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuZmRpdiIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5mbWEiLAorICAibGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuZm11bCIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5mcmVtIiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmZzdWIiLAorICAibGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQubG9nIiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmxvZzEwIiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmxvZzIiLAorICAibGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQubmVhcmJ5aW50IiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLnBvdyIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5wb3dpIiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLnJpbnQiLAorICAibGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuc2luIiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLnNxcnQiLAorICAibGx2bS5leHBlcmltZW50YWwuZGVvcHRpbWl6ZSIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5nYy5yZWxvY2F0ZSIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5nYy5yZXN1bHQiLAorICAibGx2bS5leHBlcmltZW50YWwuZ2Muc3RhdGVwb2ludCIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5ndWFyZCIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5wYXRjaHBvaW50Lmk2NCIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5wYXRjaHBvaW50LnZvaWQiLAorICAibGx2bS5leHBlcmltZW50YWwuc3RhY2ttYXAiLAorICAibGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5hZGQiLAorICAibGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5hbmQiLAorICAibGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5mYWRkIiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UuZm1heCIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLmZtaW4iLAorICAibGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5mbXVsIiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UubXVsIiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2Uub3IiLAorICAibGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5zbWF4IiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2Uuc21pbiIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLnVtYXgiLAorICAibGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS51bWluIiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UueG9yIiwKKyAgImxsdm0uZmFicyIsCisgICJsbHZtLmZsb29yIiwKKyAgImxsdm0uZmx0LnJvdW5kcyIsCisgICJsbHZtLmZtYSIsCisgICJsbHZtLmZtdWxhZGQiLAorICAibGx2bS5mcmFtZWFkZHJlc3MiLAorICAibGx2bS5nY3JlYWQiLAorICAibGx2bS5nY3Jvb3QiLAorICAibGx2bS5nY3dyaXRlIiwKKyAgImxsdm0uZ2V0LmR5bmFtaWMuYXJlYS5vZmZzZXQiLAorICAibGx2bS5pY2FsbC5icmFuY2guZnVubmVsIiwKKyAgImxsdm0uaW5pdC50cmFtcG9saW5lIiwKKyAgImxsdm0uaW5zdHJwcm9mLmluY3JlbWVudCIsCisgICJsbHZtLmluc3RycHJvZi5pbmNyZW1lbnQuc3RlcCIsCisgICJsbHZtLmluc3RycHJvZi52YWx1ZS5wcm9maWxlIiwKKyAgImxsdm0uaW52YXJpYW50LmVuZCIsCisgICJsbHZtLmludmFyaWFudC5ncm91cC5iYXJyaWVyIiwKKyAgImxsdm0uaW52YXJpYW50LnN0YXJ0IiwKKyAgImxsdm0ubGlmZXRpbWUuZW5kIiwKKyAgImxsdm0ubGlmZXRpbWUuc3RhcnQiLAorICAibGx2bS5sb2FkLnJlbGF0aXZlIiwKKyAgImxsdm0ubG9jYWxhZGRyZXNzIiwKKyAgImxsdm0ubG9jYWxlc2NhcGUiLAorICAibGx2bS5sb2NhbHJlY292ZXIiLAorICAibGx2bS5sb2ciLAorICAibGx2bS5sb2cxMCIsCisgICJsbHZtLmxvZzIiLAorICAibGx2bS5sb25nam1wIiwKKyAgImxsdm0ubWFza2VkLmNvbXByZXNzc3RvcmUiLAorICAibGx2bS5tYXNrZWQuZXhwYW5kbG9hZCIsCisgICJsbHZtLm1hc2tlZC5nYXRoZXIiLAorICAibGx2bS5tYXNrZWQubG9hZCIsCisgICJsbHZtLm1hc2tlZC5zY2F0dGVyIiwKKyAgImxsdm0ubWFza2VkLnN0b3JlIiwKKyAgImxsdm0ubWF4bnVtIiwKKyAgImxsdm0ubWVtY3B5IiwKKyAgImxsdm0ubWVtY3B5LmVsZW1lbnQudW5vcmRlcmVkLmF0b21pYyIsCisgICJsbHZtLm1lbW1vdmUiLAorICAibGx2bS5tZW1tb3ZlLmVsZW1lbnQudW5vcmRlcmVkLmF0b21pYyIsCisgICJsbHZtLm1lbXNldCIsCisgICJsbHZtLm1lbXNldC5lbGVtZW50LnVub3JkZXJlZC5hdG9taWMiLAorICAibGx2bS5taW5udW0iLAorICAibGx2bS5uZWFyYnlpbnQiLAorICAibGx2bS5vYmplY3RzaXplIiwKKyAgImxsdm0ucGNtYXJrZXIiLAorICAibGx2bS5wb3ciLAorICAibGx2bS5wb3dpIiwKKyAgImxsdm0ucHJlZmV0Y2giLAorICAibGx2bS5wdHIuYW5ub3RhdGlvbiIsCisgICJsbHZtLnJlYWRfcmVnaXN0ZXIiLAorICAibGx2bS5yZWFkY3ljbGVjb3VudGVyIiwKKyAgImxsdm0ucmV0dXJuYWRkcmVzcyIsCisgICJsbHZtLnJpbnQiLAorICAibGx2bS5yb3VuZCIsCisgICJsbHZtLnNhZGQud2l0aC5vdmVyZmxvdyIsCisgICJsbHZtLnNldGptcCIsCisgICJsbHZtLnNpZGVlZmZlY3QiLAorICAibGx2bS5zaWdsb25nam1wIiwKKyAgImxsdm0uc2lnc2V0am1wIiwKKyAgImxsdm0uc2luIiwKKyAgImxsdm0uc211bC53aXRoLm92ZXJmbG93IiwKKyAgImxsdm0uc3FydCIsCisgICJsbHZtLnNzYS5jb3B5IiwKKyAgImxsdm0uc3N1Yi53aXRoLm92ZXJmbG93IiwKKyAgImxsdm0uc3RhY2tndWFyZCIsCisgICJsbHZtLnN0YWNrcHJvdGVjdG9yIiwKKyAgImxsdm0uc3RhY2tyZXN0b3JlIiwKKyAgImxsdm0uc3RhY2tzYXZlIiwKKyAgImxsdm0udGhyZWFkLnBvaW50ZXIiLAorICAibGx2bS50cmFwIiwKKyAgImxsdm0udHJ1bmMiLAorICAibGx2bS50eXBlLmNoZWNrZWQubG9hZCIsCisgICJsbHZtLnR5cGUudGVzdCIsCisgICJsbHZtLnVhZGQud2l0aC5vdmVyZmxvdyIsCisgICJsbHZtLnVtdWwud2l0aC5vdmVyZmxvdyIsCisgICJsbHZtLnVzdWIud2l0aC5vdmVyZmxvdyIsCisgICJsbHZtLnZhX2NvcHkiLAorICAibGx2bS52YV9lbmQiLAorICAibGx2bS52YV9zdGFydCIsCisgICJsbHZtLnZhci5hbm5vdGF0aW9uIiwKKyAgImxsdm0ud3JpdGVfcmVnaXN0ZXIiLAorICAibGx2bS54cmF5LmN1c3RvbWV2ZW50IiwKKyAgImxsdm0uYWFyY2g2NC5jbHJleCIsCisgICJsbHZtLmFhcmNoNjQuY3JjMzJiIiwKKyAgImxsdm0uYWFyY2g2NC5jcmMzMmNiIiwKKyAgImxsdm0uYWFyY2g2NC5jcmMzMmNoIiwKKyAgImxsdm0uYWFyY2g2NC5jcmMzMmN3IiwKKyAgImxsdm0uYWFyY2g2NC5jcmMzMmN4IiwKKyAgImxsdm0uYWFyY2g2NC5jcmMzMmgiLAorICAibGx2bS5hYXJjaDY0LmNyYzMydyIsCisgICJsbHZtLmFhcmNoNjQuY3JjMzJ4IiwKKyAgImxsdm0uYWFyY2g2NC5jcnlwdG8uYWVzZCIsCisgICJsbHZtLmFhcmNoNjQuY3J5cHRvLmFlc2UiLAorICAibGx2bS5hYXJjaDY0LmNyeXB0by5hZXNpbWMiLAorICAibGx2bS5hYXJjaDY0LmNyeXB0by5hZXNtYyIsCisgICJsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTFjIiwKKyAgImxsdm0uYWFyY2g2NC5jcnlwdG8uc2hhMWgiLAorICAibGx2bS5hYXJjaDY0LmNyeXB0by5zaGExbSIsCisgICJsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTFwIiwKKyAgImxsdm0uYWFyY2g2NC5jcnlwdG8uc2hhMXN1MCIsCisgICJsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTFzdTEiLAorICAibGx2bS5hYXJjaDY0LmNyeXB0by5zaGEyNTZoIiwKKyAgImxsdm0uYWFyY2g2NC5jcnlwdG8uc2hhMjU2aDIiLAorICAibGx2bS5hYXJjaDY0LmNyeXB0by5zaGEyNTZzdTAiLAorICAibGx2bS5hYXJjaDY0LmNyeXB0by5zaGEyNTZzdTEiLAorICAibGx2bS5hYXJjaDY0LmRtYiIsCisgICJsbHZtLmFhcmNoNjQuZHNiIiwKKyAgImxsdm0uYWFyY2g2NC5oaW50IiwKKyAgImxsdm0uYWFyY2g2NC5pc2IiLAorICAibGx2bS5hYXJjaDY0LmxkYXhwIiwKKyAgImxsdm0uYWFyY2g2NC5sZGF4ciIsCisgICJsbHZtLmFhcmNoNjQubGR4cCIsCisgICJsbHZtLmFhcmNoNjQubGR4ciIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5hYnMiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uYWRkaG4iLAorICAibGx2bS5hYXJjaDY0Lm5lb24uYWRkcCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5jbHMiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZmFiZCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mYWNnZSIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mYWNndCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mYWRkdiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mY3Z0YXMiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZmN2dGF1IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZjdnRtcyIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mY3Z0bXUiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZmN2dG5zIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZjdnRudSIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mY3Z0cHMiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZmN2dHB1IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZjdnR4biIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mY3Z0enMiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZmN2dHp1IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZtYXgiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZm1heG5tIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZtYXhubXAiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZm1heG5tdiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mbWF4cCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mbWF4diIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mbWluIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZtaW5ubSIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mbWlubm1wIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZtaW5ubXYiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZm1pbnAiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZm1pbnYiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZm11bHgiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZnJlY3BlIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZyZWNwcyIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mcmVjcHgiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZnJpbnRuIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZyc3FydGUiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZnJzcXJ0cyIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5sZDF4MiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5sZDF4MyIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5sZDF4NCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5sZDIiLAorICAibGx2bS5hYXJjaDY0Lm5lb24ubGQybGFuZSIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5sZDJyIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmxkMyIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5sZDNsYW5lIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmxkM3IiLAorICAibGx2bS5hYXJjaDY0Lm5lb24ubGQ0IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmxkNGxhbmUiLAorICAibGx2bS5hYXJjaDY0Lm5lb24ubGQ0ciIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5wbXVsIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnBtdWxsIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnBtdWxsNjQiLAorICAibGx2bS5hYXJjaDY0Lm5lb24ucmFkZGhuIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnJiaXQiLAorICAibGx2bS5hYXJjaDY0Lm5lb24ucnNocm4iLAorICAibGx2bS5hYXJjaDY0Lm5lb24ucnN1YmhuIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNhYmQiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc2FkZGxwIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNhZGRsdiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zYWRkdiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zY2FsYXIuc3F4dG4iLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc2NhbGFyLnNxeHR1biIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zY2FsYXIudXF4dG4iLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc2hhZGQiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc2hsbCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zaHN1YiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zbWF4IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNtYXhwIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNtYXh2IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNtaW4iLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc21pbnAiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc21pbnYiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc211bGwiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3FhYnMiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3FhZGQiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3FkbXVsaCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zcWRtdWxsIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNxZG11bGxzLnNjYWxhciIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zcW5lZyIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zcXJkbXVsaCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zcXJzaGwiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3Fyc2hybiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zcXJzaHJ1biIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zcXNobCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zcXNobHUiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3FzaHJuIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNxc2hydW4iLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3FzdWIiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3F4dG4iLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3F4dHVuIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNyaGFkZCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zcnNobCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zc2hsIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNzaGxsIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnN0MXgyIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnN0MXgzIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnN0MXg0IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnN0MiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zdDJsYW5lIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnN0MyIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zdDNsYW5lIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnN0NCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zdDRsYW5lIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnN1YmhuIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnN1cWFkZCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi50YmwxIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnRibDIiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udGJsMyIsCisgICJsbHZtLmFhcmNoNjQubmVvbi50Ymw0IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnRieDEiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udGJ4MiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi50YngzIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnRieDQiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udWFiZCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51YWRkbHAiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udWFkZGx2IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnVhZGR2IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnVoYWRkIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnVoc3ViIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnVtYXgiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udW1heHAiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udW1heHYiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udW1pbiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51bWlucCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51bWludiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51bXVsbCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51cWFkZCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51cXJzaGwiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udXFyc2hybiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51cXNobCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51cXNocm4iLAorICAibGx2bS5hYXJjaDY0Lm5lb24udXFzdWIiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udXF4dG4iLAorICAibGx2bS5hYXJjaDY0Lm5lb24udXJlY3BlIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnVyaGFkZCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51cnNobCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51cnNxcnRlIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnVzaGwiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udXNobGwiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udXNxYWRkIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnZjb3B5LmxhbmUiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udmN2dGZwMmZ4cyIsCisgICJsbHZtLmFhcmNoNjQubmVvbi52Y3Z0ZnAyZnh1IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnZjdnRmcDJoZiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi52Y3Z0ZnhzMmZwIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnZjdnRmeHUyZnAiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udmN2dGhmMmZwIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnZzbGkiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udnNyaSIsCisgICJsbHZtLmFhcmNoNjQuc2RpdiIsCisgICJsbHZtLmFhcmNoNjQuc2lzZC5mYWJkIiwKKyAgImxsdm0uYWFyY2g2NC5zaXNkLmZjdnR4biIsCisgICJsbHZtLmFhcmNoNjQuc3RseHAiLAorICAibGx2bS5hYXJjaDY0LnN0bHhyIiwKKyAgImxsdm0uYWFyY2g2NC5zdHhwIiwKKyAgImxsdm0uYWFyY2g2NC5zdHhyIiwKKyAgImxsdm0uYWFyY2g2NC51ZGl2IiwKKyAgImxsdm0uYW1kZ2NuLmFsaWduYml0IiwKKyAgImxsdm0uYW1kZ2NuLmFsaWduYnl0ZSIsCisgICJsbHZtLmFtZGdjbi5hdG9taWMuZGVjIiwKKyAgImxsdm0uYW1kZ2NuLmF0b21pYy5pbmMiLAorICAibGx2bS5hbWRnY24uYnJlYWsiLAorICAibGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy5hZGQiLAorICAibGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy5hbmQiLAorICAibGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy5jbXBzd2FwIiwKKyAgImxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMub3IiLAorICAibGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy5zbWF4IiwKKyAgImxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMuc21pbiIsCisgICJsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLnN1YiIsCisgICJsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLnN3YXAiLAorICAibGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy51bWF4IiwKKyAgImxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMudW1pbiIsCisgICJsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLnhvciIsCisgICJsbHZtLmFtZGdjbi5idWZmZXIubG9hZCIsCisgICJsbHZtLmFtZGdjbi5idWZmZXIubG9hZC5mb3JtYXQiLAorICAibGx2bS5hbWRnY24uYnVmZmVyLnN0b3JlIiwKKyAgImxsdm0uYW1kZ2NuLmJ1ZmZlci5zdG9yZS5mb3JtYXQiLAorICAibGx2bS5hbWRnY24uYnVmZmVyLndiaW52bDEiLAorICAibGx2bS5hbWRnY24uYnVmZmVyLndiaW52bDEuc2MiLAorICAibGx2bS5hbWRnY24uYnVmZmVyLndiaW52bDEudm9sIiwKKyAgImxsdm0uYW1kZ2NuLmNsYXNzIiwKKyAgImxsdm0uYW1kZ2NuLmNvcyIsCisgICJsbHZtLmFtZGdjbi5jdWJlaWQiLAorICAibGx2bS5hbWRnY24uY3ViZW1hIiwKKyAgImxsdm0uYW1kZ2NuLmN1YmVzYyIsCisgICJsbHZtLmFtZGdjbi5jdWJldGMiLAorICAibGx2bS5hbWRnY24uY3Z0LnBrLmkxNiIsCisgICJsbHZtLmFtZGdjbi5jdnQucGsudTE2IiwKKyAgImxsdm0uYW1kZ2NuLmN2dC5way51OC5mMzIiLAorICAibGx2bS5hbWRnY24uY3Z0LnBrbm9ybS5pMTYiLAorICAibGx2bS5hbWRnY24uY3Z0LnBrbm9ybS51MTYiLAorICAibGx2bS5hbWRnY24uY3Z0LnBrcnR6IiwKKyAgImxsdm0uYW1kZ2NuLmRpc3BhdGNoLmlkIiwKKyAgImxsdm0uYW1kZ2NuLmRpc3BhdGNoLnB0ciIsCisgICJsbHZtLmFtZGdjbi5kaXYuZml4dXAiLAorICAibGx2bS5hbWRnY24uZGl2LmZtYXMiLAorICAibGx2bS5hbWRnY24uZGl2LnNjYWxlIiwKKyAgImxsdm0uYW1kZ2NuLmRzLmJwZXJtdXRlIiwKKyAgImxsdm0uYW1kZ2NuLmRzLmZhZGQiLAorICAibGx2bS5hbWRnY24uZHMuZm1heCIsCisgICJsbHZtLmFtZGdjbi5kcy5mbWluIiwKKyAgImxsdm0uYW1kZ2NuLmRzLnBlcm11dGUiLAorICAibGx2bS5hbWRnY24uZHMuc3dpenpsZSIsCisgICJsbHZtLmFtZGdjbi5lbHNlIiwKKyAgImxsdm0uYW1kZ2NuLmVsc2UuYnJlYWsiLAorICAibGx2bS5hbWRnY24uZW5kLmNmIiwKKyAgImxsdm0uYW1kZ2NuLmV4cCIsCisgICJsbHZtLmFtZGdjbi5leHAuY29tcHIiLAorICAibGx2bS5hbWRnY24uZmNtcCIsCisgICJsbHZtLmFtZGdjbi5mZGl2LmZhc3QiLAorICAibGx2bS5hbWRnY24uZm1lZDMiLAorICAibGx2bS5hbWRnY24uZm11bC5sZWdhY3kiLAorICAibGx2bS5hbWRnY24uZnJhY3QiLAorICAibGx2bS5hbWRnY24uZnJleHAuZXhwIiwKKyAgImxsdm0uYW1kZ2NuLmZyZXhwLm1hbnQiLAorICAibGx2bS5hbWRnY24uZ3JvdXBzdGF0aWNzaXplIiwKKyAgImxsdm0uYW1kZ2NuLmljbXAiLAorICAibGx2bS5hbWRnY24uaWYiLAorICAibGx2bS5hbWRnY24uaWYuYnJlYWsiLAorICAibGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLmFkZCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuYW5kIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5jbXBzd2FwIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5kZWMiLAorICAibGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLmluYyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMub3IiLAorICAibGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLnNtYXgiLAorICAibGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLnNtaW4iLAorICAibGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLnN1YiIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuc3dhcCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMudW1heCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMudW1pbiIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMueG9yIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQiLAorICAibGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5iIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYi5jbCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmIuY2wubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmIubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMiLAorICAibGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmIiLAorICAibGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmIuY2wiLAorICAibGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmIuY2wubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMuYi5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5jbCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMuY2wubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMubCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMubC5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5seiIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMubHoubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmNsIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuY2wubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmwiLAorICAibGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5sLm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5seiIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0Lmx6Lm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdldGxvZCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nZXRyZXNpbmZvIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmxvYWQiLAorICAibGx2bS5hbWRnY24uaW1hZ2UubG9hZC5taXAiLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5iIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5iLmNsIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5iLmNsLm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmIubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5iIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmIuY2wiLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuYi5jbC5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmIubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5jZCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5jZC5jbCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5jZC5jbC5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmNkLm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuY2wiLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuY2wubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5kIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmQuY2wiLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuZC5jbC5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmQubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5sIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmwubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5seiIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5sei5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmNkIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jZC5jbCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuY2QuY2wubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuY2QubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuY2wiLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmNsLm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmQiLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmQuY2wiLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmQuY2wubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuZC5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5sIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5sLm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmx6IiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5sei5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnN0b3JlIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnN0b3JlLm1pcCIsCisgICJsbHZtLmFtZGdjbi5pbXBsaWNpdC5idWZmZXIucHRyIiwKKyAgImxsdm0uYW1kZ2NuLmltcGxpY2l0YXJnLnB0ciIsCisgICJsbHZtLmFtZGdjbi5pbml0LmV4ZWMiLAorICAibGx2bS5hbWRnY24uaW5pdC5leGVjLmZyb20uaW5wdXQiLAorICAibGx2bS5hbWRnY24uaW50ZXJwLm1vdiIsCisgICJsbHZtLmFtZGdjbi5pbnRlcnAucDEiLAorICAibGx2bS5hbWRnY24uaW50ZXJwLnAyIiwKKyAgImxsdm0uYW1kZ2NuLmtlcm5hcmcuc2VnbWVudC5wdHIiLAorICAibGx2bS5hbWRnY24ua2lsbCIsCisgICJsbHZtLmFtZGdjbi5sZGV4cCIsCisgICJsbHZtLmFtZGdjbi5sZXJwIiwKKyAgImxsdm0uYW1kZ2NuLmxvZy5jbGFtcCIsCisgICJsbHZtLmFtZGdjbi5sb29wIiwKKyAgImxsdm0uYW1kZ2NuLm1iY250LmhpIiwKKyAgImxsdm0uYW1kZ2NuLm1iY250LmxvIiwKKyAgImxsdm0uYW1kZ2NuLm1vdi5kcHAiLAorICAibGx2bS5hbWRnY24ubXFzYWQucGsudTE2LnU4IiwKKyAgImxsdm0uYW1kZ2NuLm1xc2FkLnUzMi51OCIsCisgICJsbHZtLmFtZGdjbi5tc2FkLnU4IiwKKyAgImxsdm0uYW1kZ2NuLnBzLmxpdmUiLAorICAibGx2bS5hbWRnY24ucXNhZC5way51MTYudTgiLAorICAibGx2bS5hbWRnY24ucXVldWUucHRyIiwKKyAgImxsdm0uYW1kZ2NuLnJjcCIsCisgICJsbHZtLmFtZGdjbi5yY3AubGVnYWN5IiwKKyAgImxsdm0uYW1kZ2NuLnJlYWRmaXJzdGxhbmUiLAorICAibGx2bS5hbWRnY24ucmVhZGxhbmUiLAorICAibGx2bS5hbWRnY24ucnNxIiwKKyAgImxsdm0uYW1kZ2NuLnJzcS5jbGFtcCIsCisgICJsbHZtLmFtZGdjbi5yc3EubGVnYWN5IiwKKyAgImxsdm0uYW1kZ2NuLnMuYmFycmllciIsCisgICJsbHZtLmFtZGdjbi5zLmRjYWNoZS5pbnYiLAorICAibGx2bS5hbWRnY24ucy5kY2FjaGUuaW52LnZvbCIsCisgICJsbHZtLmFtZGdjbi5zLmRjYWNoZS53YiIsCisgICJsbHZtLmFtZGdjbi5zLmRjYWNoZS53Yi52b2wiLAorICAibGx2bS5hbWRnY24ucy5kZWNwZXJmbGV2ZWwiLAorICAibGx2bS5hbWRnY24ucy5nZXRwYyIsCisgICJsbHZtLmFtZGdjbi5zLmdldHJlZyIsCisgICJsbHZtLmFtZGdjbi5zLmluY3BlcmZsZXZlbCIsCisgICJsbHZtLmFtZGdjbi5zLm1lbXJlYWx0aW1lIiwKKyAgImxsdm0uYW1kZ2NuLnMubWVtdGltZSIsCisgICJsbHZtLmFtZGdjbi5zLnNlbmRtc2ciLAorICAibGx2bS5hbWRnY24ucy5zZW5kbXNnaGFsdCIsCisgICJsbHZtLmFtZGdjbi5zLnNsZWVwIiwKKyAgImxsdm0uYW1kZ2NuLnMud2FpdGNudCIsCisgICJsbHZtLmFtZGdjbi5zYWQuaGkudTgiLAorICAibGx2bS5hbWRnY24uc2FkLnUxNiIsCisgICJsbHZtLmFtZGdjbi5zYWQudTgiLAorICAibGx2bS5hbWRnY24uc2JmZSIsCisgICJsbHZtLmFtZGdjbi5zZXQuaW5hY3RpdmUiLAorICAibGx2bS5hbWRnY24uc2ZmYmgiLAorICAibGx2bS5hbWRnY24uc2luIiwKKyAgImxsdm0uYW1kZ2NuLnRidWZmZXIubG9hZCIsCisgICJsbHZtLmFtZGdjbi50YnVmZmVyLnN0b3JlIiwKKyAgImxsdm0uYW1kZ2NuLnRyaWcucHJlb3AiLAorICAibGx2bS5hbWRnY24udWJmZSIsCisgICJsbHZtLmFtZGdjbi51bnJlYWNoYWJsZSIsCisgICJsbHZtLmFtZGdjbi51cGRhdGUuZHBwIiwKKyAgImxsdm0uYW1kZ2NuLndhdmUuYmFycmllciIsCisgICJsbHZtLmFtZGdjbi53b3JrZ3JvdXAuaWQueCIsCisgICJsbHZtLmFtZGdjbi53b3JrZ3JvdXAuaWQueSIsCisgICJsbHZtLmFtZGdjbi53b3JrZ3JvdXAuaWQueiIsCisgICJsbHZtLmFtZGdjbi53b3JraXRlbS5pZC54IiwKKyAgImxsdm0uYW1kZ2NuLndvcmtpdGVtLmlkLnkiLAorICAibGx2bS5hbWRnY24ud29ya2l0ZW0uaWQueiIsCisgICJsbHZtLmFtZGdjbi53cW0iLAorICAibGx2bS5hbWRnY24ud3FtLnZvdGUiLAorICAibGx2bS5hbWRnY24ud3JpdGVsYW5lIiwKKyAgImxsdm0uYW1kZ2NuLnd3bSIsCisgICJsbHZtLmFybS5jZHAiLAorICAibGx2bS5hcm0uY2RwMiIsCisgICJsbHZtLmFybS5jbHJleCIsCisgICJsbHZtLmFybS5jcmMzMmIiLAorICAibGx2bS5hcm0uY3JjMzJjYiIsCisgICJsbHZtLmFybS5jcmMzMmNoIiwKKyAgImxsdm0uYXJtLmNyYzMyY3ciLAorICAibGx2bS5hcm0uY3JjMzJoIiwKKyAgImxsdm0uYXJtLmNyYzMydyIsCisgICJsbHZtLmFybS5kYmciLAorICAibGx2bS5hcm0uZG1iIiwKKyAgImxsdm0uYXJtLmRzYiIsCisgICJsbHZtLmFybS5nZXQuZnBzY3IiLAorICAibGx2bS5hcm0uaGludCIsCisgICJsbHZtLmFybS5pc2IiLAorICAibGx2bS5hcm0ubGRhZXgiLAorICAibGx2bS5hcm0ubGRhZXhkIiwKKyAgImxsdm0uYXJtLmxkYyIsCisgICJsbHZtLmFybS5sZGMyIiwKKyAgImxsdm0uYXJtLmxkYzJsIiwKKyAgImxsdm0uYXJtLmxkY2wiLAorICAibGx2bS5hcm0ubGRyZXgiLAorICAibGx2bS5hcm0ubGRyZXhkIiwKKyAgImxsdm0uYXJtLm1jciIsCisgICJsbHZtLmFybS5tY3IyIiwKKyAgImxsdm0uYXJtLm1jcnIiLAorICAibGx2bS5hcm0ubWNycjIiLAorICAibGx2bS5hcm0ubXJjIiwKKyAgImxsdm0uYXJtLm1yYzIiLAorICAibGx2bS5hcm0ubXJyYyIsCisgICJsbHZtLmFybS5tcnJjMiIsCisgICJsbHZtLmFybS5uZW9uLmFlc2QiLAorICAibGx2bS5hcm0ubmVvbi5hZXNlIiwKKyAgImxsdm0uYXJtLm5lb24uYWVzaW1jIiwKKyAgImxsdm0uYXJtLm5lb24uYWVzbWMiLAorICAibGx2bS5hcm0ubmVvbi5zaGExYyIsCisgICJsbHZtLmFybS5uZW9uLnNoYTFoIiwKKyAgImxsdm0uYXJtLm5lb24uc2hhMW0iLAorICAibGx2bS5hcm0ubmVvbi5zaGExcCIsCisgICJsbHZtLmFybS5uZW9uLnNoYTFzdTAiLAorICAibGx2bS5hcm0ubmVvbi5zaGExc3UxIiwKKyAgImxsdm0uYXJtLm5lb24uc2hhMjU2aCIsCisgICJsbHZtLmFybS5uZW9uLnNoYTI1NmgyIiwKKyAgImxsdm0uYXJtLm5lb24uc2hhMjU2c3UwIiwKKyAgImxsdm0uYXJtLm5lb24uc2hhMjU2c3UxIiwKKyAgImxsdm0uYXJtLm5lb24udmFiZHMiLAorICAibGx2bS5hcm0ubmVvbi52YWJkdSIsCisgICJsbHZtLmFybS5uZW9uLnZhYnMiLAorICAibGx2bS5hcm0ubmVvbi52YWNnZSIsCisgICJsbHZtLmFybS5uZW9uLnZhY2d0IiwKKyAgImxsdm0uYXJtLm5lb24udmJzbCIsCisgICJsbHZtLmFybS5uZW9uLnZjbHMiLAorICAibGx2bS5hcm0ubmVvbi52Y3Z0YXMiLAorICAibGx2bS5hcm0ubmVvbi52Y3Z0YXUiLAorICAibGx2bS5hcm0ubmVvbi52Y3Z0ZnAyZnhzIiwKKyAgImxsdm0uYXJtLm5lb24udmN2dGZwMmZ4dSIsCisgICJsbHZtLmFybS5uZW9uLnZjdnRmcDJoZiIsCisgICJsbHZtLmFybS5uZW9uLnZjdnRmeHMyZnAiLAorICAibGx2bS5hcm0ubmVvbi52Y3Z0Znh1MmZwIiwKKyAgImxsdm0uYXJtLm5lb24udmN2dGhmMmZwIiwKKyAgImxsdm0uYXJtLm5lb24udmN2dG1zIiwKKyAgImxsdm0uYXJtLm5lb24udmN2dG11IiwKKyAgImxsdm0uYXJtLm5lb24udmN2dG5zIiwKKyAgImxsdm0uYXJtLm5lb24udmN2dG51IiwKKyAgImxsdm0uYXJtLm5lb24udmN2dHBzIiwKKyAgImxsdm0uYXJtLm5lb24udmN2dHB1IiwKKyAgImxsdm0uYXJtLm5lb24udmhhZGRzIiwKKyAgImxsdm0uYXJtLm5lb24udmhhZGR1IiwKKyAgImxsdm0uYXJtLm5lb24udmhzdWJzIiwKKyAgImxsdm0uYXJtLm5lb24udmhzdWJ1IiwKKyAgImxsdm0uYXJtLm5lb24udmxkMSIsCisgICJsbHZtLmFybS5uZW9uLnZsZDIiLAorICAibGx2bS5hcm0ubmVvbi52bGQybGFuZSIsCisgICJsbHZtLmFybS5uZW9uLnZsZDMiLAorICAibGx2bS5hcm0ubmVvbi52bGQzbGFuZSIsCisgICJsbHZtLmFybS5uZW9uLnZsZDQiLAorICAibGx2bS5hcm0ubmVvbi52bGQ0bGFuZSIsCisgICJsbHZtLmFybS5uZW9uLnZtYXhubSIsCisgICJsbHZtLmFybS5uZW9uLnZtYXhzIiwKKyAgImxsdm0uYXJtLm5lb24udm1heHUiLAorICAibGx2bS5hcm0ubmVvbi52bWlubm0iLAorICAibGx2bS5hcm0ubmVvbi52bWlucyIsCisgICJsbHZtLmFybS5uZW9uLnZtaW51IiwKKyAgImxsdm0uYXJtLm5lb24udm11bGxwIiwKKyAgImxsdm0uYXJtLm5lb24udm11bGxzIiwKKyAgImxsdm0uYXJtLm5lb24udm11bGx1IiwKKyAgImxsdm0uYXJtLm5lb24udm11bHAiLAorICAibGx2bS5hcm0ubmVvbi52cGFkYWxzIiwKKyAgImxsdm0uYXJtLm5lb24udnBhZGFsdSIsCisgICJsbHZtLmFybS5uZW9uLnZwYWRkIiwKKyAgImxsdm0uYXJtLm5lb24udnBhZGRscyIsCisgICJsbHZtLmFybS5uZW9uLnZwYWRkbHUiLAorICAibGx2bS5hcm0ubmVvbi52cG1heHMiLAorICAibGx2bS5hcm0ubmVvbi52cG1heHUiLAorICAibGx2bS5hcm0ubmVvbi52cG1pbnMiLAorICAibGx2bS5hcm0ubmVvbi52cG1pbnUiLAorICAibGx2bS5hcm0ubmVvbi52cWFicyIsCisgICJsbHZtLmFybS5uZW9uLnZxYWRkcyIsCisgICJsbHZtLmFybS5uZW9uLnZxYWRkdSIsCisgICJsbHZtLmFybS5uZW9uLnZxZG11bGgiLAorICAibGx2bS5hcm0ubmVvbi52cWRtdWxsIiwKKyAgImxsdm0uYXJtLm5lb24udnFtb3ZucyIsCisgICJsbHZtLmFybS5uZW9uLnZxbW92bnN1IiwKKyAgImxsdm0uYXJtLm5lb24udnFtb3ZudSIsCisgICJsbHZtLmFybS5uZW9uLnZxbmVnIiwKKyAgImxsdm0uYXJtLm5lb24udnFyZG11bGgiLAorICAibGx2bS5hcm0ubmVvbi52cXJzaGlmdG5zIiwKKyAgImxsdm0uYXJtLm5lb24udnFyc2hpZnRuc3UiLAorICAibGx2bS5hcm0ubmVvbi52cXJzaGlmdG51IiwKKyAgImxsdm0uYXJtLm5lb24udnFyc2hpZnRzIiwKKyAgImxsdm0uYXJtLm5lb24udnFyc2hpZnR1IiwKKyAgImxsdm0uYXJtLm5lb24udnFzaGlmdG5zIiwKKyAgImxsdm0uYXJtLm5lb24udnFzaGlmdG5zdSIsCisgICJsbHZtLmFybS5uZW9uLnZxc2hpZnRudSIsCisgICJsbHZtLmFybS5uZW9uLnZxc2hpZnRzIiwKKyAgImxsdm0uYXJtLm5lb24udnFzaGlmdHN1IiwKKyAgImxsdm0uYXJtLm5lb24udnFzaGlmdHUiLAorICAibGx2bS5hcm0ubmVvbi52cXN1YnMiLAorICAibGx2bS5hcm0ubmVvbi52cXN1YnUiLAorICAibGx2bS5hcm0ubmVvbi52cmFkZGhuIiwKKyAgImxsdm0uYXJtLm5lb24udnJlY3BlIiwKKyAgImxsdm0uYXJtLm5lb24udnJlY3BzIiwKKyAgImxsdm0uYXJtLm5lb24udnJoYWRkcyIsCisgICJsbHZtLmFybS5uZW9uLnZyaGFkZHUiLAorICAibGx2bS5hcm0ubmVvbi52cmludGEiLAorICAibGx2bS5hcm0ubmVvbi52cmludG0iLAorICAibGx2bS5hcm0ubmVvbi52cmludG4iLAorICAibGx2bS5hcm0ubmVvbi52cmludHAiLAorICAibGx2bS5hcm0ubmVvbi52cmludHgiLAorICAibGx2bS5hcm0ubmVvbi52cmludHoiLAorICAibGx2bS5hcm0ubmVvbi52cnNoaWZ0biIsCisgICJsbHZtLmFybS5uZW9uLnZyc2hpZnRzIiwKKyAgImxsdm0uYXJtLm5lb24udnJzaGlmdHUiLAorICAibGx2bS5hcm0ubmVvbi52cnNxcnRlIiwKKyAgImxsdm0uYXJtLm5lb24udnJzcXJ0cyIsCisgICJsbHZtLmFybS5uZW9uLnZyc3ViaG4iLAorICAibGx2bS5hcm0ubmVvbi52c2hpZnRpbnMiLAorICAibGx2bS5hcm0ubmVvbi52c2hpZnRzIiwKKyAgImxsdm0uYXJtLm5lb24udnNoaWZ0dSIsCisgICJsbHZtLmFybS5uZW9uLnZzdDEiLAorICAibGx2bS5hcm0ubmVvbi52c3QyIiwKKyAgImxsdm0uYXJtLm5lb24udnN0MmxhbmUiLAorICAibGx2bS5hcm0ubmVvbi52c3QzIiwKKyAgImxsdm0uYXJtLm5lb24udnN0M2xhbmUiLAorICAibGx2bS5hcm0ubmVvbi52c3Q0IiwKKyAgImxsdm0uYXJtLm5lb24udnN0NGxhbmUiLAorICAibGx2bS5hcm0ubmVvbi52dGJsMSIsCisgICJsbHZtLmFybS5uZW9uLnZ0YmwyIiwKKyAgImxsdm0uYXJtLm5lb24udnRibDMiLAorICAibGx2bS5hcm0ubmVvbi52dGJsNCIsCisgICJsbHZtLmFybS5uZW9uLnZ0YngxIiwKKyAgImxsdm0uYXJtLm5lb24udnRieDIiLAorICAibGx2bS5hcm0ubmVvbi52dGJ4MyIsCisgICJsbHZtLmFybS5uZW9uLnZ0Yng0IiwKKyAgImxsdm0uYXJtLnFhZGQiLAorICAibGx2bS5hcm0ucWFkZDE2IiwKKyAgImxsdm0uYXJtLnFhZGQ4IiwKKyAgImxsdm0uYXJtLnFhc3giLAorICAibGx2bS5hcm0ucXNheCIsCisgICJsbHZtLmFybS5xc3ViIiwKKyAgImxsdm0uYXJtLnFzdWIxNiIsCisgICJsbHZtLmFybS5xc3ViOCIsCisgICJsbHZtLmFybS5zYWRkMTYiLAorICAibGx2bS5hcm0uc2FkZDgiLAorICAibGx2bS5hcm0uc2FzeCIsCisgICJsbHZtLmFybS5zZWwiLAorICAibGx2bS5hcm0uc2V0LmZwc2NyIiwKKyAgImxsdm0uYXJtLnNoYWRkMTYiLAorICAibGx2bS5hcm0uc2hhZGQ4IiwKKyAgImxsdm0uYXJtLnNoYXN4IiwKKyAgImxsdm0uYXJtLnNoc2F4IiwKKyAgImxsdm0uYXJtLnNoc3ViMTYiLAorICAibGx2bS5hcm0uc2hzdWI4IiwKKyAgImxsdm0uYXJtLnNtbGFiYiIsCisgICJsbHZtLmFybS5zbWxhYnQiLAorICAibGx2bS5hcm0uc21sYWQiLAorICAibGx2bS5hcm0uc21sYWR4IiwKKyAgImxsdm0uYXJtLnNtbGFsZCIsCisgICJsbHZtLmFybS5zbWxhbGR4IiwKKyAgImxsdm0uYXJtLnNtbGF0YiIsCisgICJsbHZtLmFybS5zbWxhdHQiLAorICAibGx2bS5hcm0uc21sYXdiIiwKKyAgImxsdm0uYXJtLnNtbGF3dCIsCisgICJsbHZtLmFybS5zbWxzZCIsCisgICJsbHZtLmFybS5zbWxzZHgiLAorICAibGx2bS5hcm0uc21sc2xkIiwKKyAgImxsdm0uYXJtLnNtbHNsZHgiLAorICAibGx2bS5hcm0uc211YWQiLAorICAibGx2bS5hcm0uc211YWR4IiwKKyAgImxsdm0uYXJtLnNtdWxiYiIsCisgICJsbHZtLmFybS5zbXVsYnQiLAorICAibGx2bS5hcm0uc211bHRiIiwKKyAgImxsdm0uYXJtLnNtdWx0dCIsCisgICJsbHZtLmFybS5zbXVsd2IiLAorICAibGx2bS5hcm0uc211bHd0IiwKKyAgImxsdm0uYXJtLnNtdXNkIiwKKyAgImxsdm0uYXJtLnNtdXNkeCIsCisgICJsbHZtLmFybS5zcGFjZSIsCisgICJsbHZtLmFybS5zc2F0IiwKKyAgImxsdm0uYXJtLnNzYXQxNiIsCisgICJsbHZtLmFybS5zc2F4IiwKKyAgImxsdm0uYXJtLnNzdWIxNiIsCisgICJsbHZtLmFybS5zc3ViOCIsCisgICJsbHZtLmFybS5zdGMiLAorICAibGx2bS5hcm0uc3RjMiIsCisgICJsbHZtLmFybS5zdGMybCIsCisgICJsbHZtLmFybS5zdGNsIiwKKyAgImxsdm0uYXJtLnN0bGV4IiwKKyAgImxsdm0uYXJtLnN0bGV4ZCIsCisgICJsbHZtLmFybS5zdHJleCIsCisgICJsbHZtLmFybS5zdHJleGQiLAorICAibGx2bS5hcm0uc3h0YWIxNiIsCisgICJsbHZtLmFybS5zeHRiMTYiLAorICAibGx2bS5hcm0udWFkZDE2IiwKKyAgImxsdm0uYXJtLnVhZGQ4IiwKKyAgImxsdm0uYXJtLnVhc3giLAorICAibGx2bS5hcm0udWhhZGQxNiIsCisgICJsbHZtLmFybS51aGFkZDgiLAorICAibGx2bS5hcm0udWhhc3giLAorICAibGx2bS5hcm0udWhzYXgiLAorICAibGx2bS5hcm0udWhzdWIxNiIsCisgICJsbHZtLmFybS51aHN1YjgiLAorICAibGx2bS5hcm0udW5kZWZpbmVkIiwKKyAgImxsdm0uYXJtLnVxYWRkMTYiLAorICAibGx2bS5hcm0udXFhZGQ4IiwKKyAgImxsdm0uYXJtLnVxYXN4IiwKKyAgImxsdm0uYXJtLnVxc2F4IiwKKyAgImxsdm0uYXJtLnVxc3ViMTYiLAorICAibGx2bS5hcm0udXFzdWI4IiwKKyAgImxsdm0uYXJtLnVzYWQ4IiwKKyAgImxsdm0uYXJtLnVzYWRhOCIsCisgICJsbHZtLmFybS51c2F0IiwKKyAgImxsdm0uYXJtLnVzYXQxNiIsCisgICJsbHZtLmFybS51c2F4IiwKKyAgImxsdm0uYXJtLnVzdWIxNiIsCisgICJsbHZtLmFybS51c3ViOCIsCisgICJsbHZtLmFybS51eHRhYjE2IiwKKyAgImxsdm0uYXJtLnV4dGIxNiIsCisgICJsbHZtLmFybS52Y3Z0ciIsCisgICJsbHZtLmFybS52Y3Z0cnUiLAorICAibGx2bS5icGYubG9hZC5ieXRlIiwKKyAgImxsdm0uYnBmLmxvYWQuaGFsZiIsCisgICJsbHZtLmJwZi5sb2FkLndvcmQiLAorICAibGx2bS5icGYucHNldWRvIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hYnMiLAorICAibGx2bS5oZXhhZ29uLkEyLmFic3AiLAorICAibGx2bS5oZXhhZ29uLkEyLmFic3NhdCIsCisgICJsbHZtLmhleGFnb24uQTIuYWRkIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hZGRoLmgxNi5oaCIsCisgICJsbHZtLmhleGFnb24uQTIuYWRkaC5oMTYuaGwiLAorICAibGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LmxoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hZGRoLmgxNi5sbCIsCisgICJsbHZtLmhleGFnb24uQTIuYWRkaC5oMTYuc2F0LmhoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hZGRoLmgxNi5zYXQuaGwiLAorICAibGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LnNhdC5saCIsCisgICJsbHZtLmhleGFnb24uQTIuYWRkaC5oMTYuc2F0LmxsIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hZGRoLmwxNi5obCIsCisgICJsbHZtLmhleGFnb24uQTIuYWRkaC5sMTYubGwiLAorICAibGx2bS5oZXhhZ29uLkEyLmFkZGgubDE2LnNhdC5obCIsCisgICJsbHZtLmhleGFnb24uQTIuYWRkaC5sMTYuc2F0LmxsIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hZGRpIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hZGRwIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hZGRwc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hZGRzYXQiLAorICAibGx2bS5oZXhhZ29uLkEyLmFkZHNwIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hbmQiLAorICAibGx2bS5oZXhhZ29uLkEyLmFuZGlyIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hbmRwIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hc2xoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hc3JoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5jb21iaW5lLmhoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5jb21iaW5lLmhsIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5jb21iaW5lLmxoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5jb21iaW5lLmxsIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5jb21iaW5laWkiLAorICAibGx2bS5oZXhhZ29uLkEyLmNvbWJpbmV3IiwKKyAgImxsdm0uaGV4YWdvbi5BMi5tYXgiLAorICAibGx2bS5oZXhhZ29uLkEyLm1heHAiLAorICAibGx2bS5oZXhhZ29uLkEyLm1heHUiLAorICAibGx2bS5oZXhhZ29uLkEyLm1heHVwIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5taW4iLAorICAibGx2bS5oZXhhZ29uLkEyLm1pbnAiLAorICAibGx2bS5oZXhhZ29uLkEyLm1pbnUiLAorICAibGx2bS5oZXhhZ29uLkEyLm1pbnVwIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5uZWciLAorICAibGx2bS5oZXhhZ29uLkEyLm5lZ3AiLAorICAibGx2bS5oZXhhZ29uLkEyLm5lZ3NhdCIsCisgICJsbHZtLmhleGFnb24uQTIubm90IiwKKyAgImxsdm0uaGV4YWdvbi5BMi5ub3RwIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5vciIsCisgICJsbHZtLmhleGFnb24uQTIub3JpciIsCisgICJsbHZtLmhleGFnb24uQTIub3JwIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5yb3VuZHNhdCIsCisgICJsbHZtLmhleGFnb24uQTIuc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zYXRiIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zYXRoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zYXR1YiIsCisgICJsbHZtLmhleGFnb24uQTIuc2F0dWgiLAorICAibGx2bS5oZXhhZ29uLkEyLnN1YiIsCisgICJsbHZtLmhleGFnb24uQTIuc3ViaC5oMTYuaGgiLAorICAibGx2bS5oZXhhZ29uLkEyLnN1YmguaDE2LmhsIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5saCIsCisgICJsbHZtLmhleGFnb24uQTIuc3ViaC5oMTYubGwiLAorICAibGx2bS5oZXhhZ29uLkEyLnN1YmguaDE2LnNhdC5oaCIsCisgICJsbHZtLmhleGFnb24uQTIuc3ViaC5oMTYuc2F0LmhsIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5zYXQubGgiLAorICAibGx2bS5oZXhhZ29uLkEyLnN1YmguaDE2LnNhdC5sbCIsCisgICJsbHZtLmhleGFnb24uQTIuc3ViaC5sMTYuaGwiLAorICAibGx2bS5oZXhhZ29uLkEyLnN1YmgubDE2LmxsIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zdWJoLmwxNi5zYXQuaGwiLAorICAibGx2bS5oZXhhZ29uLkEyLnN1YmgubDE2LnNhdC5sbCIsCisgICJsbHZtLmhleGFnb24uQTIuc3VicCIsCisgICJsbHZtLmhleGFnb24uQTIuc3VicmkiLAorICAibGx2bS5oZXhhZ29uLkEyLnN1YnNhdCIsCisgICJsbHZtLmhleGFnb24uQTIuc3ZhZGRoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zdmFkZGhzIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zdmFkZHVocyIsCisgICJsbHZtLmhleGFnb24uQTIuc3ZhdmdoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zdmF2Z2hzIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zdm5hdmdoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zdnN1YmgiLAorICAibGx2bS5oZXhhZ29uLkEyLnN2c3ViaHMiLAorICAibGx2bS5oZXhhZ29uLkEyLnN2c3VidWhzIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zd2l6IiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zeHRiIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zeHRoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zeHR3IiwKKyAgImxsdm0uaGV4YWdvbi5BMi50ZnIiLAorICAibGx2bS5oZXhhZ29uLkEyLnRmcmloIiwKKyAgImxsdm0uaGV4YWdvbi5BMi50ZnJpbCIsCisgICJsbHZtLmhleGFnb24uQTIudGZycCIsCisgICJsbHZtLmhleGFnb24uQTIudGZycGkiLAorICAibGx2bS5oZXhhZ29uLkEyLnRmcnNpIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52YWJzaCIsCisgICJsbHZtLmhleGFnb24uQTIudmFic2hzYXQiLAorICAibGx2bS5oZXhhZ29uLkEyLnZhYnN3IiwKKyAgImxsdm0uaGV4YWdvbi5BMi52YWJzd3NhdCIsCisgICJsbHZtLmhleGFnb24uQTIudmFkZGIubWFwIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52YWRkaCIsCisgICJsbHZtLmhleGFnb24uQTIudmFkZGhzIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52YWRkdWIiLAorICAibGx2bS5oZXhhZ29uLkEyLnZhZGR1YnMiLAorICAibGx2bS5oZXhhZ29uLkEyLnZhZGR1aHMiLAorICAibGx2bS5oZXhhZ29uLkEyLnZhZGR3IiwKKyAgImxsdm0uaGV4YWdvbi5BMi52YWRkd3MiLAorICAibGx2bS5oZXhhZ29uLkEyLnZhdmdoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52YXZnaGNyIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52YXZnaHIiLAorICAibGx2bS5oZXhhZ29uLkEyLnZhdmd1YiIsCisgICJsbHZtLmhleGFnb24uQTIudmF2Z3ViciIsCisgICJsbHZtLmhleGFnb24uQTIudmF2Z3VoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52YXZndWhyIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52YXZndXciLAorICAibGx2bS5oZXhhZ29uLkEyLnZhdmd1d3IiLAorICAibGx2bS5oZXhhZ29uLkEyLnZhdmd3IiwKKyAgImxsdm0uaGV4YWdvbi5BMi52YXZnd2NyIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52YXZnd3IiLAorICAibGx2bS5oZXhhZ29uLkEyLnZjbXBiZXEiLAorICAibGx2bS5oZXhhZ29uLkEyLnZjbXBiZ3R1IiwKKyAgImxsdm0uaGV4YWdvbi5BMi52Y21waGVxIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52Y21waGd0IiwKKyAgImxsdm0uaGV4YWdvbi5BMi52Y21waGd0dSIsCisgICJsbHZtLmhleGFnb24uQTIudmNtcHdlcSIsCisgICJsbHZtLmhleGFnb24uQTIudmNtcHdndCIsCisgICJsbHZtLmhleGFnb24uQTIudmNtcHdndHUiLAorICAibGx2bS5oZXhhZ29uLkEyLnZjb25qIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52bWF4YiIsCisgICJsbHZtLmhleGFnb24uQTIudm1heGgiLAorICAibGx2bS5oZXhhZ29uLkEyLnZtYXh1YiIsCisgICJsbHZtLmhleGFnb24uQTIudm1heHVoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52bWF4dXciLAorICAibGx2bS5oZXhhZ29uLkEyLnZtYXh3IiwKKyAgImxsdm0uaGV4YWdvbi5BMi52bWluYiIsCisgICJsbHZtLmhleGFnb24uQTIudm1pbmgiLAorICAibGx2bS5oZXhhZ29uLkEyLnZtaW51YiIsCisgICJsbHZtLmhleGFnb24uQTIudm1pbnVoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52bWludXciLAorICAibGx2bS5oZXhhZ29uLkEyLnZtaW53IiwKKyAgImxsdm0uaGV4YWdvbi5BMi52bmF2Z2giLAorICAibGx2bS5oZXhhZ29uLkEyLnZuYXZnaGNyIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52bmF2Z2hyIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52bmF2Z3ciLAorICAibGx2bS5oZXhhZ29uLkEyLnZuYXZnd2NyIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52bmF2Z3dyIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52cmFkZHViIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52cmFkZHViLmFjYyIsCisgICJsbHZtLmhleGFnb24uQTIudnJzYWR1YiIsCisgICJsbHZtLmhleGFnb24uQTIudnJzYWR1Yi5hY2MiLAorICAibGx2bS5oZXhhZ29uLkEyLnZzdWJiLm1hcCIsCisgICJsbHZtLmhleGFnb24uQTIudnN1YmgiLAorICAibGx2bS5oZXhhZ29uLkEyLnZzdWJocyIsCisgICJsbHZtLmhleGFnb24uQTIudnN1YnViIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52c3VidWJzIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52c3VidWhzIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52c3VidyIsCisgICJsbHZtLmhleGFnb24uQTIudnN1YndzIiwKKyAgImxsdm0uaGV4YWdvbi5BMi54b3IiLAorICAibGx2bS5oZXhhZ29uLkEyLnhvcnAiLAorICAibGx2bS5oZXhhZ29uLkEyLnp4dGIiLAorICAibGx2bS5oZXhhZ29uLkEyLnp4dGgiLAorICAibGx2bS5oZXhhZ29uLkE0LmFuZG4iLAorICAibGx2bS5oZXhhZ29uLkE0LmFuZG5wIiwKKyAgImxsdm0uaGV4YWdvbi5BNC5iaXRzcGxpdCIsCisgICJsbHZtLmhleGFnb24uQTQuYml0c3BsaXRpIiwKKyAgImxsdm0uaGV4YWdvbi5BNC5ib3VuZHNjaGVjayIsCisgICJsbHZtLmhleGFnb24uQTQuY21wYmVxIiwKKyAgImxsdm0uaGV4YWdvbi5BNC5jbXBiZXFpIiwKKyAgImxsdm0uaGV4YWdvbi5BNC5jbXBiZ3QiLAorICAibGx2bS5oZXhhZ29uLkE0LmNtcGJndGkiLAorICAibGx2bS5oZXhhZ29uLkE0LmNtcGJndHUiLAorICAibGx2bS5oZXhhZ29uLkE0LmNtcGJndHVpIiwKKyAgImxsdm0uaGV4YWdvbi5BNC5jbXBoZXEiLAorICAibGx2bS5oZXhhZ29uLkE0LmNtcGhlcWkiLAorICAibGx2bS5oZXhhZ29uLkE0LmNtcGhndCIsCisgICJsbHZtLmhleGFnb24uQTQuY21waGd0aSIsCisgICJsbHZtLmhleGFnb24uQTQuY21waGd0dSIsCisgICJsbHZtLmhleGFnb24uQTQuY21waGd0dWkiLAorICAibGx2bS5oZXhhZ29uLkE0LmNvbWJpbmVpciIsCisgICJsbHZtLmhleGFnb24uQTQuY29tYmluZXJpIiwKKyAgImxsdm0uaGV4YWdvbi5BNC5jcm91bmQucmkiLAorICAibGx2bS5oZXhhZ29uLkE0LmNyb3VuZC5yciIsCisgICJsbHZtLmhleGFnb24uQTQubW9kd3JhcHUiLAorICAibGx2bS5oZXhhZ29uLkE0Lm9ybiIsCisgICJsbHZtLmhleGFnb24uQTQub3JucCIsCisgICJsbHZtLmhleGFnb24uQTQucmNtcGVxIiwKKyAgImxsdm0uaGV4YWdvbi5BNC5yY21wZXFpIiwKKyAgImxsdm0uaGV4YWdvbi5BNC5yY21wbmVxIiwKKyAgImxsdm0uaGV4YWdvbi5BNC5yY21wbmVxaSIsCisgICJsbHZtLmhleGFnb24uQTQucm91bmQucmkiLAorICAibGx2bS5oZXhhZ29uLkE0LnJvdW5kLnJpLnNhdCIsCisgICJsbHZtLmhleGFnb24uQTQucm91bmQucnIiLAorICAibGx2bS5oZXhhZ29uLkE0LnJvdW5kLnJyLnNhdCIsCisgICJsbHZtLmhleGFnb24uQTQudGxibWF0Y2giLAorICAibGx2bS5oZXhhZ29uLkE0LnZjbXBiZXEuYW55IiwKKyAgImxsdm0uaGV4YWdvbi5BNC52Y21wYmVxaSIsCisgICJsbHZtLmhleGFnb24uQTQudmNtcGJndCIsCisgICJsbHZtLmhleGFnb24uQTQudmNtcGJndGkiLAorICAibGx2bS5oZXhhZ29uLkE0LnZjbXBiZ3R1aSIsCisgICJsbHZtLmhleGFnb24uQTQudmNtcGhlcWkiLAorICAibGx2bS5oZXhhZ29uLkE0LnZjbXBoZ3RpIiwKKyAgImxsdm0uaGV4YWdvbi5BNC52Y21waGd0dWkiLAorICAibGx2bS5oZXhhZ29uLkE0LnZjbXB3ZXFpIiwKKyAgImxsdm0uaGV4YWdvbi5BNC52Y21wd2d0aSIsCisgICJsbHZtLmhleGFnb24uQTQudmNtcHdndHVpIiwKKyAgImxsdm0uaGV4YWdvbi5BNC52cm1heGgiLAorICAibGx2bS5oZXhhZ29uLkE0LnZybWF4dWgiLAorICAibGx2bS5oZXhhZ29uLkE0LnZybWF4dXciLAorICAibGx2bS5oZXhhZ29uLkE0LnZybWF4dyIsCisgICJsbHZtLmhleGFnb24uQTQudnJtaW5oIiwKKyAgImxsdm0uaGV4YWdvbi5BNC52cm1pbnVoIiwKKyAgImxsdm0uaGV4YWdvbi5BNC52cm1pbnV3IiwKKyAgImxsdm0uaGV4YWdvbi5BNC52cm1pbnciLAorICAibGx2bS5oZXhhZ29uLkE1LnZhZGRodWJzIiwKKyAgImxsdm0uaGV4YWdvbi5BNi52Y21wYmVxLm5vdGFueSIsCisgICJsbHZtLmhleGFnb24uQTYudmNtcGJlcS5ub3RhbnkuMTI4QiIsCisgICJsbHZtLmhleGFnb24uQzIuYWxsOCIsCisgICJsbHZtLmhleGFnb24uQzIuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5DMi5hbmRuIiwKKyAgImxsdm0uaGV4YWdvbi5DMi5hbnk4IiwKKyAgImxsdm0uaGV4YWdvbi5DMi5iaXRzY2xyIiwKKyAgImxsdm0uaGV4YWdvbi5DMi5iaXRzY2xyaSIsCisgICJsbHZtLmhleGFnb24uQzIuYml0c3NldCIsCisgICJsbHZtLmhleGFnb24uQzIuY21wZXEiLAorICAibGx2bS5oZXhhZ29uLkMyLmNtcGVxaSIsCisgICJsbHZtLmhleGFnb24uQzIuY21wZXFwIiwKKyAgImxsdm0uaGV4YWdvbi5DMi5jbXBnZWkiLAorICAibGx2bS5oZXhhZ29uLkMyLmNtcGdldWkiLAorICAibGx2bS5oZXhhZ29uLkMyLmNtcGd0IiwKKyAgImxsdm0uaGV4YWdvbi5DMi5jbXBndGkiLAorICAibGx2bS5oZXhhZ29uLkMyLmNtcGd0cCIsCisgICJsbHZtLmhleGFnb24uQzIuY21wZ3R1IiwKKyAgImxsdm0uaGV4YWdvbi5DMi5jbXBndHVpIiwKKyAgImxsdm0uaGV4YWdvbi5DMi5jbXBndHVwIiwKKyAgImxsdm0uaGV4YWdvbi5DMi5jbXBsdCIsCisgICJsbHZtLmhleGFnb24uQzIuY21wbHR1IiwKKyAgImxsdm0uaGV4YWdvbi5DMi5tYXNrIiwKKyAgImxsdm0uaGV4YWdvbi5DMi5tdXgiLAorICAibGx2bS5oZXhhZ29uLkMyLm11eGlpIiwKKyAgImxsdm0uaGV4YWdvbi5DMi5tdXhpciIsCisgICJsbHZtLmhleGFnb24uQzIubXV4cmkiLAorICAibGx2bS5oZXhhZ29uLkMyLm5vdCIsCisgICJsbHZtLmhleGFnb24uQzIub3IiLAorICAibGx2bS5oZXhhZ29uLkMyLm9ybiIsCisgICJsbHZtLmhleGFnb24uQzIucHhmZXIubWFwIiwKKyAgImxsdm0uaGV4YWdvbi5DMi50ZnJwciIsCisgICJsbHZtLmhleGFnb24uQzIudGZycnAiLAorICAibGx2bS5oZXhhZ29uLkMyLnZpdHBhY2siLAorICAibGx2bS5oZXhhZ29uLkMyLnZtdXgiLAorICAibGx2bS5oZXhhZ29uLkMyLnhvciIsCisgICJsbHZtLmhleGFnb24uQzQuYW5kLmFuZCIsCisgICJsbHZtLmhleGFnb24uQzQuYW5kLmFuZG4iLAorICAibGx2bS5oZXhhZ29uLkM0LmFuZC5vciIsCisgICJsbHZtLmhleGFnb24uQzQuYW5kLm9ybiIsCisgICJsbHZtLmhleGFnb24uQzQuY21wbHRlIiwKKyAgImxsdm0uaGV4YWdvbi5DNC5jbXBsdGVpIiwKKyAgImxsdm0uaGV4YWdvbi5DNC5jbXBsdGV1IiwKKyAgImxsdm0uaGV4YWdvbi5DNC5jbXBsdGV1aSIsCisgICJsbHZtLmhleGFnb24uQzQuY21wbmVxIiwKKyAgImxsdm0uaGV4YWdvbi5DNC5jbXBuZXFpIiwKKyAgImxsdm0uaGV4YWdvbi5DNC5mYXN0Y29ybmVyOSIsCisgICJsbHZtLmhleGFnb24uQzQuZmFzdGNvcm5lcjkubm90IiwKKyAgImxsdm0uaGV4YWdvbi5DNC5uYml0c2NsciIsCisgICJsbHZtLmhleGFnb24uQzQubmJpdHNjbHJpIiwKKyAgImxsdm0uaGV4YWdvbi5DNC5uYml0c3NldCIsCisgICJsbHZtLmhleGFnb24uQzQub3IuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5DNC5vci5hbmRuIiwKKyAgImxsdm0uaGV4YWdvbi5DNC5vci5vciIsCisgICJsbHZtLmhleGFnb24uQzQub3Iub3JuIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LmQyZGYiLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYuZDJzZiIsCisgICJsbHZtLmhleGFnb24uRjIuY29udi5kZjJkIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LmRmMmQuY2hvcCIsCisgICJsbHZtLmhleGFnb24uRjIuY29udi5kZjJzZiIsCisgICJsbHZtLmhleGFnb24uRjIuY29udi5kZjJ1ZCIsCisgICJsbHZtLmhleGFnb24uRjIuY29udi5kZjJ1ZC5jaG9wIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LmRmMnV3IiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LmRmMnV3LmNob3AiLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYydyIsCisgICJsbHZtLmhleGFnb24uRjIuY29udi5kZjJ3LmNob3AiLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYuc2YyZCIsCisgICJsbHZtLmhleGFnb24uRjIuY29udi5zZjJkLmNob3AiLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYuc2YyZGYiLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYuc2YydWQiLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYuc2YydWQuY2hvcCIsCisgICJsbHZtLmhleGFnb24uRjIuY29udi5zZjJ1dyIsCisgICJsbHZtLmhleGFnb24uRjIuY29udi5zZjJ1dy5jaG9wIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LnNmMnciLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYuc2Yydy5jaG9wIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LnVkMmRmIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LnVkMnNmIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LnV3MmRmIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LnV3MnNmIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LncyZGYiLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYudzJzZiIsCisgICJsbHZtLmhleGFnb24uRjIuZGZjbGFzcyIsCisgICJsbHZtLmhleGFnb24uRjIuZGZjbXBlcSIsCisgICJsbHZtLmhleGFnb24uRjIuZGZjbXBnZSIsCisgICJsbHZtLmhleGFnb24uRjIuZGZjbXBndCIsCisgICJsbHZtLmhleGFnb24uRjIuZGZjbXB1byIsCisgICJsbHZtLmhleGFnb24uRjIuZGZpbW0ubiIsCisgICJsbHZtLmhleGFnb24uRjIuZGZpbW0ucCIsCisgICJsbHZtLmhleGFnb24uRjIuc2ZhZGQiLAorICAibGx2bS5oZXhhZ29uLkYyLnNmY2xhc3MiLAorICAibGx2bS5oZXhhZ29uLkYyLnNmY21wZXEiLAorICAibGx2bS5oZXhhZ29uLkYyLnNmY21wZ2UiLAorICAibGx2bS5oZXhhZ29uLkYyLnNmY21wZ3QiLAorICAibGx2bS5oZXhhZ29uLkYyLnNmY21wdW8iLAorICAibGx2bS5oZXhhZ29uLkYyLnNmZml4dXBkIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5zZmZpeHVwbiIsCisgICJsbHZtLmhleGFnb24uRjIuc2ZmaXh1cHIiLAorICAibGx2bS5oZXhhZ29uLkYyLnNmZm1hIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5zZmZtYS5saWIiLAorICAibGx2bS5oZXhhZ29uLkYyLnNmZm1hLnNjIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5zZmZtcyIsCisgICJsbHZtLmhleGFnb24uRjIuc2ZmbXMubGliIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5zZmltbS5uIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5zZmltbS5wIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5zZm1heCIsCisgICJsbHZtLmhleGFnb24uRjIuc2ZtaW4iLAorICAibGx2bS5oZXhhZ29uLkYyLnNmbXB5IiwKKyAgImxsdm0uaGV4YWdvbi5GMi5zZnN1YiIsCisgICJsbHZtLmhleGFnb24uTDIubG9hZHJiLnBiciIsCisgICJsbHZtLmhleGFnb24uTDIubG9hZHJiLnBjaSIsCisgICJsbHZtLmhleGFnb24uTDIubG9hZHJiLnBjciIsCisgICJsbHZtLmhleGFnb24uTDIubG9hZHJkLnBiciIsCisgICJsbHZtLmhleGFnb24uTDIubG9hZHJkLnBjaSIsCisgICJsbHZtLmhleGFnb24uTDIubG9hZHJkLnBjciIsCisgICJsbHZtLmhleGFnb24uTDIubG9hZHJoLnBiciIsCisgICJsbHZtLmhleGFnb24uTDIubG9hZHJoLnBjaSIsCisgICJsbHZtLmhleGFnb24uTDIubG9hZHJoLnBjciIsCisgICJsbHZtLmhleGFnb24uTDIubG9hZHJpLnBiciIsCisgICJsbHZtLmhleGFnb24uTDIubG9hZHJpLnBjaSIsCisgICJsbHZtLmhleGFnb24uTDIubG9hZHJpLnBjciIsCisgICJsbHZtLmhleGFnb24uTDIubG9hZHJ1Yi5wYnIiLAorICAibGx2bS5oZXhhZ29uLkwyLmxvYWRydWIucGNpIiwKKyAgImxsdm0uaGV4YWdvbi5MMi5sb2FkcnViLnBjciIsCisgICJsbHZtLmhleGFnb24uTDIubG9hZHJ1aC5wYnIiLAorICAibGx2bS5oZXhhZ29uLkwyLmxvYWRydWgucGNpIiwKKyAgImxsdm0uaGV4YWdvbi5MMi5sb2FkcnVoLnBjciIsCisgICJsbHZtLmhleGFnb24uTDIubG9hZHcubG9ja2VkIiwKKyAgImxsdm0uaGV4YWdvbi5MNC5sb2FkZC5sb2NrZWQiLAorICAibGx2bS5oZXhhZ29uLk0yLmFjY2kiLAorICAibGx2bS5oZXhhZ29uLk0yLmFjY2lpIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5jbWFjaS5zMCIsCisgICJsbHZtLmhleGFnb24uTTIuY21hY3IuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLmNtYWNzLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5jbWFjcy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIuY21hY3NjLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5jbWFjc2MuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLmNtcHlpLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5jbXB5ci5zMCIsCisgICJsbHZtLmhleGFnb24uTTIuY21weXJzLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5jbXB5cnMuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLmNtcHlyc2MuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLmNtcHlyc2MuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLmNtcHlzLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5jbXB5cy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIuY21weXNjLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5jbXB5c2MuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLmNuYWNzLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5jbmFjcy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIuY25hY3NjLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5jbmFjc2MuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLmRwbXB5c3MuYWNjLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5kcG1weXNzLm5hYy5zMCIsCisgICJsbHZtLmhleGFnb24uTTIuZHBtcHlzcy5ybmQuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLmRwbXB5c3MuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLmRwbXB5dXUuYWNjLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5kcG1weXV1Lm5hYy5zMCIsCisgICJsbHZtLmhleGFnb24uTTIuZHBtcHl1dS5zMCIsCisgICJsbHZtLmhleGFnb24uTTIuaG1tcHloLnJzMSIsCisgICJsbHZtLmhleGFnb24uTTIuaG1tcHloLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5obW1weWwucnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5obW1weWwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1hY2kiLAorICAibGx2bS5oZXhhZ29uLk0yLm1hY3NpbiIsCisgICJsbHZtLmhleGFnb24uTTIubWFjc2lwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbWFjaHMucnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbWFjaHMucnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbWFjaHMuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tYWNocy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubW1hY2xzLnJzMCIsCisgICJsbHZtLmhleGFnb24uTTIubW1hY2xzLnJzMSIsCisgICJsbHZtLmhleGFnb24uTTIubW1hY2xzLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbWFjbHMuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tYWN1aHMucnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbWFjdWhzLnJzMSIsCisgICJsbHZtLmhleGFnb24uTTIubW1hY3Vocy5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubW1hY3Vocy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubW1hY3Vscy5yczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tYWN1bHMucnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbWFjdWxzLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbWFjdWxzLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbXB5aC5yczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tcHloLnJzMSIsCisgICJsbHZtLmhleGFnb24uTTIubW1weWguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tcHloLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbXB5bC5yczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tcHlsLnJzMSIsCisgICJsbHZtLmhleGFnb24uTTIubW1weWwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tcHlsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbXB5dWgucnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbXB5dWgucnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbXB5dWguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tcHl1aC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubW1weXVsLnJzMCIsCisgICJsbHZtLmhleGFnb24uTTIubW1weXVsLnJzMSIsCisgICJsbHZtLmhleGFnb24uTTIubW1weXVsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbXB5dWwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5hY2MuaGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5hY2MuaGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5hY2MuaGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5hY2MuaGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5hY2MubGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5hY2MubGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5hY2MubGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5hY2MubGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmhoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLnNhdC5oaC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQuaGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmhsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLnNhdC5saC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQubGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmxsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLnNhdC5sbC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmhoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuaGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5obC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmhsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkubGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5saC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmxsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkubGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuaGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuaGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuaGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuaGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5uYWMubGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5uYWMubGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5uYWMubGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5uYWMubGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmhoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLnNhdC5oaC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQuaGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmhsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLnNhdC5saC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQubGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmxsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLnNhdC5sbC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnJuZC5oaC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnJuZC5oaC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnJuZC5obC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnJuZC5obC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnJuZC5saC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnJuZC5saC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnJuZC5sbC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnJuZC5sbC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnNhdC5oaC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnNhdC5oaC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnNhdC5obC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnNhdC5obC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnNhdC5saC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnNhdC5saC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnNhdC5sbC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnNhdC5sbC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQuaGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5zYXQucm5kLmhoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5obC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQuaGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5zYXQucm5kLmxoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5saC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQubGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5zYXQucm5kLmxsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkudXAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS51cC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnVwLnMxLnNhdCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MuaGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmhoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLmFjYy5obC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MuaGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmxoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLmFjYy5saC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MubGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmxsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLmhoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLmhoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLmhsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLmhsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLmxoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLmxoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLmxsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLmxsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5oaC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5ZC5uYWMuaGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmhsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5obC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5ZC5uYWMubGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmxoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5sbC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5ZC5uYWMubGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmhoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5oaC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5ZC5ybmQuaGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmhsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5saC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5ZC5ybmQubGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmxsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5sbC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5aSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5c21pIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlzdS51cCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dS5hY2MuaGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmhoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5obC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dS5hY2MuaGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmxoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5saC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dS5hY2MubGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmxsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1LmhoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1LmhoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1LmhsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1LmhsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1LmxoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1LmxoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1LmxsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1LmxsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5oaC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dS5uYWMuaGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUubmFjLmhsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5obC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dS5uYWMubGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUubmFjLmxoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5sbC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dS5uYWMubGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUudXAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXVkLmFjYy5oaC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dWQuYWNjLmhoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5hY2MuaGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXVkLmFjYy5obC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dWQuYWNjLmxoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5hY2MubGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXVkLmFjYy5sbC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dWQuYWNjLmxsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5oaC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dWQuaGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXVkLmhsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5obC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dWQubGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXVkLmxoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5sbC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dWQubGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXVkLm5hYy5oaC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dWQubmFjLmhoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5uYWMuaGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXVkLm5hYy5obC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dWQubmFjLmxoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5uYWMubGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXVkLm5hYy5sbC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dWQubmFjLmxsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1aSIsCisgICJsbHZtLmhleGFnb24uTTIubmFjY2kiLAorICAibGx2bS5oZXhhZ29uLk0yLm5hY2NpaSIsCisgICJsbHZtLmhleGFnb24uTTIuc3ViYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52YWJzZGlmZmgiLAorICAibGx2bS5oZXhhZ29uLk0yLnZhYnNkaWZmdyIsCisgICJsbHZtLmhleGFnb24uTTIudmNtYWMuczAuc2F0LmkiLAorICAibGx2bS5oZXhhZ29uLk0yLnZjbWFjLnMwLnNhdC5yIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52Y21weS5zMC5zYXQuaSIsCisgICJsbHZtLmhleGFnb24uTTIudmNtcHkuczAuc2F0LnIiLAorICAibGx2bS5oZXhhZ29uLk0yLnZjbXB5LnMxLnNhdC5pIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52Y21weS5zMS5zYXQuciIsCisgICJsbHZtLmhleGFnb24uTTIudmRtYWNzLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52ZG1hY3MuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLnZkbXB5cnMuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLnZkbXB5cnMuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLnZkbXB5cy5zMCIsCisgICJsbHZtLmhleGFnb24uTTIudmRtcHlzLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52bWFjMiIsCisgICJsbHZtLmhleGFnb24uTTIudm1hYzJlcyIsCisgICJsbHZtLmhleGFnb24uTTIudm1hYzJlcy5zMCIsCisgICJsbHZtLmhleGFnb24uTTIudm1hYzJlcy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIudm1hYzJzLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52bWFjMnMuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLnZtYWMyc3UuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLnZtYWMyc3UuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLnZtcHkyZXMuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLnZtcHkyZXMuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLnZtcHkycy5zMCIsCisgICJsbHZtLmhleGFnb24uTTIudm1weTJzLnMwcGFjayIsCisgICJsbHZtLmhleGFnb24uTTIudm1weTJzLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52bXB5MnMuczFwYWNrIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52bXB5MnN1LnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52bXB5MnN1LnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52cmFkZGgiLAorICAibGx2bS5oZXhhZ29uLk0yLnZyYWRkdWgiLAorICAibGx2bS5oZXhhZ29uLk0yLnZyY21hY2kuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLnZyY21hY2kuczBjIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52cmNtYWNyLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52cmNtYWNyLnMwYyIsCisgICJsbHZtLmhleGFnb24uTTIudnJjbXB5aS5zMCIsCisgICJsbHZtLmhleGFnb24uTTIudnJjbXB5aS5zMGMiLAorICAibGx2bS5oZXhhZ29uLk0yLnZyY21weXIuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLnZyY21weXIuczBjIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52cmNtcHlzLmFjYy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIudnJjbXB5cy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIudnJjbXB5cy5zMXJwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52cm1hYy5zMCIsCisgICJsbHZtLmhleGFnb24uTTIudnJtcHkuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLnhvci54YWNjIiwKKyAgImxsdm0uaGV4YWdvbi5NNC5hbmQuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5NNC5hbmQuYW5kbiIsCisgICJsbHZtLmhleGFnb24uTTQuYW5kLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5NNC5hbmQueG9yIiwKKyAgImxsdm0uaGV4YWdvbi5NNC5jbXB5aS53aCIsCisgICJsbHZtLmhleGFnb24uTTQuY21weWkud2hjIiwKKyAgImxsdm0uaGV4YWdvbi5NNC5jbXB5ci53aCIsCisgICJsbHZtLmhleGFnb24uTTQuY21weXIud2hjIiwKKyAgImxsdm0uaGV4YWdvbi5NNC5tYWMudXAuczEuc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5NNC5tcHlyaS5hZGRpIiwKKyAgImxsdm0uaGV4YWdvbi5NNC5tcHlyaS5hZGRyIiwKKyAgImxsdm0uaGV4YWdvbi5NNC5tcHlyaS5hZGRyLnUyIiwKKyAgImxsdm0uaGV4YWdvbi5NNC5tcHlyci5hZGRpIiwKKyAgImxsdm0uaGV4YWdvbi5NNC5tcHlyci5hZGRyIiwKKyAgImxsdm0uaGV4YWdvbi5NNC5uYWMudXAuczEuc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5NNC5vci5hbmQiLAorICAibGx2bS5oZXhhZ29uLk00Lm9yLmFuZG4iLAorICAibGx2bS5oZXhhZ29uLk00Lm9yLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5NNC5vci54b3IiLAorICAibGx2bS5oZXhhZ29uLk00LnBtcHl3IiwKKyAgImxsdm0uaGV4YWdvbi5NNC5wbXB5dy5hY2MiLAorICAibGx2bS5oZXhhZ29uLk00LnZwbXB5aCIsCisgICJsbHZtLmhleGFnb24uTTQudnBtcHloLmFjYyIsCisgICJsbHZtLmhleGFnb24uTTQudnJtcHllaC5hY2MuczAiLAorICAibGx2bS5oZXhhZ29uLk00LnZybXB5ZWguYWNjLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NNC52cm1weWVoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NNC52cm1weWVoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NNC52cm1weW9oLmFjYy5zMCIsCisgICJsbHZtLmhleGFnb24uTTQudnJtcHlvaC5hY2MuczEiLAorICAibGx2bS5oZXhhZ29uLk00LnZybXB5b2guczAiLAorICAibGx2bS5oZXhhZ29uLk00LnZybXB5b2guczEiLAorICAibGx2bS5oZXhhZ29uLk00Lnhvci5hbmQiLAorICAibGx2bS5oZXhhZ29uLk00Lnhvci5hbmRuIiwKKyAgImxsdm0uaGV4YWdvbi5NNC54b3Iub3IiLAorICAibGx2bS5oZXhhZ29uLk00Lnhvci54YWNjIiwKKyAgImxsdm0uaGV4YWdvbi5NNS52ZG1hY2JzdSIsCisgICJsbHZtLmhleGFnb24uTTUudmRtcHlic3UiLAorICAibGx2bS5oZXhhZ29uLk01LnZtYWNic3UiLAorICAibGx2bS5oZXhhZ29uLk01LnZtYWNidXUiLAorICAibGx2bS5oZXhhZ29uLk01LnZtcHlic3UiLAorICAibGx2bS5oZXhhZ29uLk01LnZtcHlidXUiLAorICAibGx2bS5oZXhhZ29uLk01LnZybWFjYnN1IiwKKyAgImxsdm0uaGV4YWdvbi5NNS52cm1hY2J1dSIsCisgICJsbHZtLmhleGFnb24uTTUudnJtcHlic3UiLAorICAibGx2bS5oZXhhZ29uLk01LnZybXB5YnV1IiwKKyAgImxsdm0uaGV4YWdvbi5NNi52YWJzZGlmZmIiLAorICAibGx2bS5oZXhhZ29uLk02LnZhYnNkaWZmdWIiLAorICAibGx2bS5oZXhhZ29uLlMyLmFkZGFzbC5ycnJpIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuaS5wIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuaS5wLmFjYyIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLmkucC5hbmQiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5pLnAubmFjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuaS5wLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuaS5wLnhhY2MiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5pLnIiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5pLnIuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuaS5yLmFuZCIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLmkuci5uYWMiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5pLnIub3IiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5pLnIuc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuaS5yLnhhY2MiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5pLnZoIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuaS52dyIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLnIucCIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLnIucC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5yLnAuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuci5wLm5hYyIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLnIucC5vciIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLnIucC54b3IiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5yLnIiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5yLnIuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuci5yLmFuZCIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLnIuci5uYWMiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5yLnIub3IiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5yLnIuc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuci52aCIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLnIudnciLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5pLnAiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5pLnAuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3IuaS5wLmFuZCIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLmkucC5uYWMiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5pLnAub3IiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5pLnAucm5kIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3IuaS5wLnJuZC5nb29kc3ludGF4IiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3IuaS5yIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3IuaS5yLmFjYyIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLmkuci5hbmQiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5pLnIubmFjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3IuaS5yLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3IuaS5yLnJuZCIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLmkuci5ybmQuZ29vZHN5bnRheCIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLmkuc3Z3LnRydW4iLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5pLnZoIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3IuaS52dyIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLnIucCIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLnIucC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5yLnAuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3Iuci5wLm5hYyIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLnIucC5vciIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLnIucC54b3IiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5yLnIiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5yLnIuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3Iuci5yLmFuZCIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLnIuci5uYWMiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5yLnIub3IiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5yLnIuc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3Iuci5zdncudHJ1biIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLnIudmgiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5yLnZ3IiwKKyAgImxsdm0uaGV4YWdvbi5TMi5icmV2IiwKKyAgImxsdm0uaGV4YWdvbi5TMi5icmV2cCIsCisgICJsbHZtLmhleGFnb24uUzIuY2FiYWNlbmNiaW4iLAorICAibGx2bS5oZXhhZ29uLlMyLmNsMCIsCisgICJsbHZtLmhleGFnb24uUzIuY2wwcCIsCisgICJsbHZtLmhleGFnb24uUzIuY2wxIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5jbDFwIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5jbGIiLAorICAibGx2bS5oZXhhZ29uLlMyLmNsYm5vcm0iLAorICAibGx2bS5oZXhhZ29uLlMyLmNsYnAiLAorICAibGx2bS5oZXhhZ29uLlMyLmNscmJpdC5pIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5jbHJiaXQuciIsCisgICJsbHZtLmhleGFnb24uUzIuY3QwIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5jdDBwIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5jdDEiLAorICAibGx2bS5oZXhhZ29uLlMyLmN0MXAiLAorICAibGx2bS5oZXhhZ29uLlMyLmRlaW50ZXJsZWF2ZSIsCisgICJsbHZtLmhleGFnb24uUzIuZXh0cmFjdHUiLAorICAibGx2bS5oZXhhZ29uLlMyLmV4dHJhY3R1LnJwIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5leHRyYWN0dXAiLAorICAibGx2bS5oZXhhZ29uLlMyLmV4dHJhY3R1cC5ycCIsCisgICJsbHZtLmhleGFnb24uUzIuaW5zZXJ0IiwKKyAgImxsdm0uaGV4YWdvbi5TMi5pbnNlcnQucnAiLAorICAibGx2bS5oZXhhZ29uLlMyLmluc2VydHAiLAorICAibGx2bS5oZXhhZ29uLlMyLmluc2VydHAucnAiLAorICAibGx2bS5oZXhhZ29uLlMyLmludGVybGVhdmUiLAorICAibGx2bS5oZXhhZ29uLlMyLmxmc3AiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzbC5yLnAiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzbC5yLnAuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc2wuci5wLmFuZCIsCisgICJsbHZtLmhleGFnb24uUzIubHNsLnIucC5uYWMiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzbC5yLnAub3IiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzbC5yLnAueG9yIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc2wuci5yIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc2wuci5yLmFjYyIsCisgICJsbHZtLmhleGFnb24uUzIubHNsLnIuci5hbmQiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzbC5yLnIubmFjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc2wuci5yLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc2wuci52aCIsCisgICJsbHZtLmhleGFnb24uUzIubHNsLnIudnciLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5pLnAiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5pLnAuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc3IuaS5wLmFuZCIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLmkucC5uYWMiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5pLnAub3IiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5pLnAueGFjYyIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLmkuciIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLmkuci5hY2MiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5pLnIuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc3IuaS5yLm5hYyIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLmkuci5vciIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLmkuci54YWNjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc3IuaS52aCIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLmkudnciLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5yLnAiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5yLnAuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc3Iuci5wLmFuZCIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLnIucC5uYWMiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5yLnAub3IiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5yLnAueG9yIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc3Iuci5yIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc3Iuci5yLmFjYyIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLnIuci5hbmQiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5yLnIubmFjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc3Iuci5yLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc3Iuci52aCIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLnIudnciLAorICAibGx2bS5oZXhhZ29uLlMyLnBhY2tobCIsCisgICJsbHZtLmhleGFnb24uUzIucGFyaXR5cCIsCisgICJsbHZtLmhleGFnb24uUzIuc2V0Yml0LmkiLAorICAibGx2bS5oZXhhZ29uLlMyLnNldGJpdC5yIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zaHVmZmViIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zaHVmZmVoIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zaHVmZm9iIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zaHVmZm9oIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zdG9yZXJiLnBiciIsCisgICJsbHZtLmhleGFnb24uUzIuc3RvcmVyYi5wY2kiLAorICAibGx2bS5oZXhhZ29uLlMyLnN0b3JlcmIucGNyIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zdG9yZXJkLnBiciIsCisgICJsbHZtLmhleGFnb24uUzIuc3RvcmVyZC5wY2kiLAorICAibGx2bS5oZXhhZ29uLlMyLnN0b3JlcmQucGNyIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zdG9yZXJmLnBiciIsCisgICJsbHZtLmhleGFnb24uUzIuc3RvcmVyZi5wY2kiLAorICAibGx2bS5oZXhhZ29uLlMyLnN0b3JlcmYucGNyIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zdG9yZXJoLnBiciIsCisgICJsbHZtLmhleGFnb24uUzIuc3RvcmVyaC5wY2kiLAorICAibGx2bS5oZXhhZ29uLlMyLnN0b3JlcmgucGNyIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zdG9yZXJpLnBiciIsCisgICJsbHZtLmhleGFnb24uUzIuc3RvcmVyaS5wY2kiLAorICAibGx2bS5oZXhhZ29uLlMyLnN0b3JlcmkucGNyIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zdG9yZXcubG9ja2VkIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zdnNhdGhiIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zdnNhdGh1YiIsCisgICJsbHZtLmhleGFnb24uUzIudGFibGVpZHhiLmdvb2RzeW50YXgiLAorICAibGx2bS5oZXhhZ29uLlMyLnRhYmxlaWR4ZC5nb29kc3ludGF4IiwKKyAgImxsdm0uaGV4YWdvbi5TMi50YWJsZWlkeGguZ29vZHN5bnRheCIsCisgICJsbHZtLmhleGFnb24uUzIudGFibGVpZHh3Lmdvb2RzeW50YXgiLAorICAibGx2bS5oZXhhZ29uLlMyLnRvZ2dsZWJpdC5pIiwKKyAgImxsdm0uaGV4YWdvbi5TMi50b2dnbGViaXQuciIsCisgICJsbHZtLmhleGFnb24uUzIudHN0Yml0LmkiLAorICAibGx2bS5oZXhhZ29uLlMyLnRzdGJpdC5yIiwKKyAgImxsdm0uaGV4YWdvbi5TMi52YWxpZ25pYiIsCisgICJsbHZtLmhleGFnb24uUzIudmFsaWducmIiLAorICAibGx2bS5oZXhhZ29uLlMyLnZjbmVnaCIsCisgICJsbHZtLmhleGFnb24uUzIudmNyb3RhdGUiLAorICAibGx2bS5oZXhhZ29uLlMyLnZyY25lZ2giLAorICAibGx2bS5oZXhhZ29uLlMyLnZybmRwYWNrd2giLAorICAibGx2bS5oZXhhZ29uLlMyLnZybmRwYWNrd2hzIiwKKyAgImxsdm0uaGV4YWdvbi5TMi52c2F0aGIiLAorICAibGx2bS5oZXhhZ29uLlMyLnZzYXRoYi5ub3BhY2siLAorICAibGx2bS5oZXhhZ29uLlMyLnZzYXRodWIiLAorICAibGx2bS5oZXhhZ29uLlMyLnZzYXRodWIubm9wYWNrIiwKKyAgImxsdm0uaGV4YWdvbi5TMi52c2F0d2giLAorICAibGx2bS5oZXhhZ29uLlMyLnZzYXR3aC5ub3BhY2siLAorICAibGx2bS5oZXhhZ29uLlMyLnZzYXR3dWgiLAorICAibGx2bS5oZXhhZ29uLlMyLnZzYXR3dWgubm9wYWNrIiwKKyAgImxsdm0uaGV4YWdvbi5TMi52c3BsYXRyYiIsCisgICJsbHZtLmhleGFnb24uUzIudnNwbGF0cmgiLAorICAibGx2bS5oZXhhZ29uLlMyLnZzcGxpY2VpYiIsCisgICJsbHZtLmhleGFnb24uUzIudnNwbGljZXJiIiwKKyAgImxsdm0uaGV4YWdvbi5TMi52c3h0YmgiLAorICAibGx2bS5oZXhhZ29uLlMyLnZzeHRodyIsCisgICJsbHZtLmhleGFnb24uUzIudnRydW5laGIiLAorICAibGx2bS5oZXhhZ29uLlMyLnZ0cnVuZXdoIiwKKyAgImxsdm0uaGV4YWdvbi5TMi52dHJ1bm9oYiIsCisgICJsbHZtLmhleGFnb24uUzIudnRydW5vd2giLAorICAibGx2bS5oZXhhZ29uLlMyLnZ6eHRiaCIsCisgICJsbHZtLmhleGFnb24uUzIudnp4dGh3IiwKKyAgImxsdm0uaGV4YWdvbi5TNC5hZGRhZGRpIiwKKyAgImxsdm0uaGV4YWdvbi5TNC5hZGRpLmFzbC5yaSIsCisgICJsbHZtLmhleGFnb24uUzQuYWRkaS5sc3IucmkiLAorICAibGx2bS5oZXhhZ29uLlM0LmFuZGkuYXNsLnJpIiwKKyAgImxsdm0uaGV4YWdvbi5TNC5hbmRpLmxzci5yaSIsCisgICJsbHZtLmhleGFnb24uUzQuY2xiYWRkaSIsCisgICJsbHZtLmhleGFnb24uUzQuY2xicGFkZGkiLAorICAibGx2bS5oZXhhZ29uLlM0LmNsYnBub3JtIiwKKyAgImxsdm0uaGV4YWdvbi5TNC5leHRyYWN0IiwKKyAgImxsdm0uaGV4YWdvbi5TNC5leHRyYWN0LnJwIiwKKyAgImxsdm0uaGV4YWdvbi5TNC5leHRyYWN0cCIsCisgICJsbHZtLmhleGFnb24uUzQuZXh0cmFjdHAucnAiLAorICAibGx2bS5oZXhhZ29uLlM0LmxzbGkiLAorICAibGx2bS5oZXhhZ29uLlM0Lm50c3RiaXQuaSIsCisgICJsbHZtLmhleGFnb24uUzQubnRzdGJpdC5yIiwKKyAgImxsdm0uaGV4YWdvbi5TNC5vci5hbmRpIiwKKyAgImxsdm0uaGV4YWdvbi5TNC5vci5hbmRpeCIsCisgICJsbHZtLmhleGFnb24uUzQub3Iub3JpIiwKKyAgImxsdm0uaGV4YWdvbi5TNC5vcmkuYXNsLnJpIiwKKyAgImxsdm0uaGV4YWdvbi5TNC5vcmkubHNyLnJpIiwKKyAgImxsdm0uaGV4YWdvbi5TNC5wYXJpdHkiLAorICAibGx2bS5oZXhhZ29uLlM0LnN0b3JlZC5sb2NrZWQiLAorICAibGx2bS5oZXhhZ29uLlM0LnN1YmFkZGkiLAorICAibGx2bS5oZXhhZ29uLlM0LnN1YmkuYXNsLnJpIiwKKyAgImxsdm0uaGV4YWdvbi5TNC5zdWJpLmxzci5yaSIsCisgICJsbHZtLmhleGFnb24uUzQudnJjcm90YXRlIiwKKyAgImxsdm0uaGV4YWdvbi5TNC52cmNyb3RhdGUuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5TNC52eGFkZHN1YmgiLAorICAibGx2bS5oZXhhZ29uLlM0LnZ4YWRkc3ViaHIiLAorICAibGx2bS5oZXhhZ29uLlM0LnZ4YWRkc3VidyIsCisgICJsbHZtLmhleGFnb24uUzQudnhzdWJhZGRoIiwKKyAgImxsdm0uaGV4YWdvbi5TNC52eHN1YmFkZGhyIiwKKyAgImxsdm0uaGV4YWdvbi5TNC52eHN1YmFkZHciLAorICAibGx2bS5oZXhhZ29uLlM1LmFzcmh1Yi5ybmQuc2F0Lmdvb2RzeW50YXgiLAorICAibGx2bS5oZXhhZ29uLlM1LmFzcmh1Yi5zYXQiLAorICAibGx2bS5oZXhhZ29uLlM1LnBvcGNvdW50cCIsCisgICJsbHZtLmhleGFnb24uUzUudmFzcmhybmQuZ29vZHN5bnRheCIsCisgICJsbHZtLmhleGFnb24uUzYucm9sLmkucCIsCisgICJsbHZtLmhleGFnb24uUzYucm9sLmkucC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlM2LnJvbC5pLnAuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5TNi5yb2wuaS5wLm5hYyIsCisgICJsbHZtLmhleGFnb24uUzYucm9sLmkucC5vciIsCisgICJsbHZtLmhleGFnb24uUzYucm9sLmkucC54YWNjIiwKKyAgImxsdm0uaGV4YWdvbi5TNi5yb2wuaS5yIiwKKyAgImxsdm0uaGV4YWdvbi5TNi5yb2wuaS5yLmFjYyIsCisgICJsbHZtLmhleGFnb24uUzYucm9sLmkuci5hbmQiLAorICAibGx2bS5oZXhhZ29uLlM2LnJvbC5pLnIubmFjIiwKKyAgImxsdm0uaGV4YWdvbi5TNi5yb2wuaS5yLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5TNi5yb2wuaS5yLnhhY2MiLAorICAibGx2bS5oZXhhZ29uLlM2LnZzcGxhdHJicCIsCisgICJsbHZtLmhleGFnb24uUzYudnRydW5laGIucHBwIiwKKyAgImxsdm0uaGV4YWdvbi5TNi52dHJ1bm9oYi5wcHAiLAorICAibGx2bS5oZXhhZ29uLlY2LmV4dHJhY3R3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi5leHRyYWN0dy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5oaSIsCisgICJsbHZtLmhleGFnb24uVjYuaGkuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYubG8iLAorICAibGx2bS5oZXhhZ29uLlY2LmxvLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2Lmx2c3BsYXRiIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5sdnNwbGF0Yi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5sdnNwbGF0aCIsCisgICJsbHZtLmhleGFnb24uVjYubHZzcGxhdGguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYubHZzcGxhdHciLAorICAibGx2bS5oZXhhZ29uLlY2Lmx2c3BsYXR3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnByZWQuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5wcmVkLmFuZC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5wcmVkLmFuZC5uIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5wcmVkLmFuZC5uLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnByZWQubm90IiwKKyAgImxsdm0uaGV4YWdvbi5WNi5wcmVkLm5vdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5wcmVkLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5wcmVkLm9yLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnByZWQub3IubiIsCisgICJsbHZtLmhleGFnb24uVjYucHJlZC5vci5uLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnByZWQuc2NhbGFyMiIsCisgICJsbHZtLmhleGFnb24uVjYucHJlZC5zY2FsYXIyLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnByZWQuc2NhbGFyMnYyIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5wcmVkLnNjYWxhcjJ2Mi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5wcmVkLnhvciIsCisgICJsbHZtLmhleGFnb24uVjYucHJlZC54b3IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYuc2h1ZmZlcWgiLAorICAibGx2bS5oZXhhZ29uLlY2LnNodWZmZXFoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnNodWZmZXF3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi5zaHVmZmVxdy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52UzMyYi5ucXByZWQuYWkiLAorICAibGx2bS5oZXhhZ29uLlY2LnZTMzJiLm5xcHJlZC5haS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52UzMyYi5udC5ucXByZWQuYWkiLAorICAibGx2bS5oZXhhZ29uLlY2LnZTMzJiLm50Lm5xcHJlZC5haS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52UzMyYi5udC5xcHJlZC5haSIsCisgICJsbHZtLmhleGFnb24uVjYudlMzMmIubnQucXByZWQuYWkuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudlMzMmIucXByZWQuYWkiLAorICAibGx2bS5oZXhhZ29uLlY2LnZTMzJiLnFwcmVkLmFpLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhYnNiIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWJzYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWJzYi5zYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhYnNiLnNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWJzZGlmZmgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhYnNkaWZmaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWJzZGlmZnViIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWJzZGlmZnViLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhYnNkaWZmdWgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhYnNkaWZmdWguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFic2RpZmZ3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWJzZGlmZncuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFic2giLAorICAibGx2bS5oZXhhZ29uLlY2LnZhYnNoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhYnNoLnNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFic2guc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhYnN3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWJzdy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWJzdy5zYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhYnN3LnNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkYiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGIuZHYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRiLmR2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRibnEiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRibnEuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGJxIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkYnEuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGJzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRic2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRic2F0LmR2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkYnNhdC5kdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkY2FycnkiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRjYXJyeS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkY2xiaCIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGNsYmguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGNsYnciLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRjbGJ3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkaC5kdiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGguZHYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGhucSIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGhucS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkaHEiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRocS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkaHNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGhzYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGhzYXQuZHYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRoc2F0LmR2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRodyIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGh3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRody5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRody5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHViaCIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHViaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdWJoLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHViaC5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHVic2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdWJzYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHVic2F0LmR2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdWJzYXQuZHYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHVidWJiLnNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHVidWJiLnNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdWhzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR1aHNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdWhzYXQuZHYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR1aHNhdC5kdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdWh3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdWh3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR1aHcuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdWh3LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdXdzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR1d3NhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdXdzYXQuZHYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR1d3NhdC5kdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdyIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHcuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHcuZHYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR3LmR2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR3bnEiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR3bnEuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHdxIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkd3EuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHdzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR3c2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR3c2F0LmR2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkd3NhdC5kdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWxpZ25iIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWxpZ25iLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbGlnbmJpIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWxpZ25iaS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YW5kIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YW5kLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbmRucXJ0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YW5kbnFydC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YW5kbnFydC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbmRucXJ0LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YW5kcXJ0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YW5kcXJ0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbmRxcnQuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YW5kcXJ0LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YW5kdm5xdiIsCisgICJsbHZtLmhleGFnb24uVjYudmFuZHZucXYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFuZHZxdiIsCisgICJsbHZtLmhleGFnb24uVjYudmFuZHZxdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YW5kdnJ0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YW5kdnJ0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbmR2cnQuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YW5kdnJ0LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNsaCIsCisgICJsbHZtLmhleGFnb24uVjYudmFzbGguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFzbGguYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNsaC5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFzbGh2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNsaHYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFzbHciLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc2x3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc2x3LmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudmFzbHcuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc2x3diIsCisgICJsbHZtLmhleGFnb24uVjYudmFzbHd2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3JoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNyaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNyaC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3JoLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNyaGJybmRzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3JoYnJuZHNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNyaGJzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3JoYnNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNyaHVicm5kc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNyaHVicm5kc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3JodWJzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3JodWJzYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcmh2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNyaHYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcnVodWJybmRzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J1aHVicm5kc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J1aHVic2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNydWh1YnNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNydXd1aHJuZHNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcnV3dWhybmRzYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcnV3dWhzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J1d3Voc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNydy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNydy5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J3LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNyd2giLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J3aC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNyd2hybmRzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J3aHJuZHNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNyd2hzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J3aHNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNyd3Vocm5kc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNyd3Vocm5kc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J3dWhzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J3dWhzYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcnd2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNyd3YuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFzc2lnbiIsCisgICJsbHZtLmhleGFnb24uVjYudmFzc2lnbi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNzaWducCIsCisgICJsbHZtLmhleGFnb24uVjYudmFzc2lnbnAuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z2IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhdmdiLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhdmdicm5kIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXZnYnJuZC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXZnaCIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z2guMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z2hybmQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhdmdocm5kLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhdmd1YiIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z3ViLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhdmd1YnJuZCIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z3Vicm5kLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhdmd1aCIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z3VoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhdmd1aHJuZCIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z3Vocm5kLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhdmd1dyIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z3V3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhdmd1d3JuZCIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z3V3cm5kLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhdmd3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXZndy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXZnd3JuZCIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z3dybmQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmNsMGgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZjbDBoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZjbDB3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Y2wwdy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Y29tYmluZSIsCisgICJsbHZtLmhleGFnb24uVjYudmNvbWJpbmUuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmQwIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZDAuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmRkMCIsCisgICJsbHZtLmhleGFnb24uVjYudmRkMC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZGVhbGIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkZWFsYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZGVhbGI0dyIsCisgICJsbHZtLmhleGFnb24uVjYudmRlYWxiNHcuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmRlYWxoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZGVhbGguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmRlYWx2ZGQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkZWFsdmRkLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkZWx0YSIsCisgICJsbHZtLmhleGFnb24uVjYudmRlbHRhLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWJ1cy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWJ1cy5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWJ1cy5kdiIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHlidXMuZHYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHlidXMuZHYuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWJ1cy5kdi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHloYiIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHloYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhiLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHloYi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHloYi5kdiIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHloYi5kdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhiLmR2LmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHloYi5kdi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHloaXNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHloaXNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhpc2F0LmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHloaXNhdC5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHloc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhzYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHloc2F0LmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHloc2F0LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhzdWlzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5aHN1aXNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhzdWlzYXQuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhzdWlzYXQuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5aHN1c2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhzdXNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhzdXNhdC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5aHN1c2F0LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWh2c2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWh2c2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5aHZzYXQuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWh2c2F0LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZHNhZHVoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZHNhZHVoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkc2FkdWguYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZHNhZHVoLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXFiIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXFiLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcWIuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXFiLmFuZC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXFiLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXFiLm9yLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcWIueG9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXFiLnhvci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXFoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXFoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcWguYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXFoLmFuZC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXFoLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXFoLm9yLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcWgueG9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXFoLnhvci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXF3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXF3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcXcuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXF3LmFuZC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXF3Lm9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXF3Lm9yLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcXcueG9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZXF3Lnhvci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybWgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybWhxIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybWhxLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaHciLAorICAibGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaHcuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmdhdGhlcm1od3EiLAorICAibGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaHdxLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtdyIsCisgICJsbHZtLmhleGFnb24uVjYudmdhdGhlcm13LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtd3EiLAorICAibGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtd3EuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmd0YiIsCisgICJsbHZtLmhleGFnb24uVjYudmd0Yi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3RiLmFuZCIsCisgICJsbHZtLmhleGFnb24uVjYudmd0Yi5hbmQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmd0Yi5vciIsCisgICJsbHZtLmhleGFnb24uVjYudmd0Yi5vci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3RiLnhvciIsCisgICJsbHZtLmhleGFnb24uVjYudmd0Yi54b3IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmd0aCIsCisgICJsbHZtLmhleGFnb24uVjYudmd0aC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3RoLmFuZCIsCisgICJsbHZtLmhleGFnb24uVjYudmd0aC5hbmQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmd0aC5vciIsCisgICJsbHZtLmhleGFnb24uVjYudmd0aC5vci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3RoLnhvciIsCisgICJsbHZtLmhleGFnb24uVjYudmd0aC54b3IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dWIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHViLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHViLmFuZCIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dWIuYW5kLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHViLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R1Yi5vci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R1Yi54b3IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHViLnhvci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R1aCIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dWguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dWguYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R1aC5hbmQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dWgub3IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHVoLm9yLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHVoLnhvciIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dWgueG9yLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHV3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R1dy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R1dy5hbmQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHV3LmFuZC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R1dy5vciIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dXcub3IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dXcueG9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R1dy54b3IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dyIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R3LmFuZCIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dy5hbmQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dy5vciIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dy5vci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R3LnhvciIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dy54b3IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmluc2VydHdyIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52aW5zZXJ0d3IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmxhbGlnbmIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsYWxpZ25iLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsYWxpZ25iaSIsCisgICJsbHZtLmhleGFnb24uVjYudmxhbGlnbmJpLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsc3JiIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHNyYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHNyaCIsCisgICJsbHZtLmhleGFnb24uVjYudmxzcmguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmxzcmh2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHNyaHYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmxzcnciLAorICAibGx2bS5oZXhhZ29uLlY2LnZsc3J3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsc3J3diIsCisgICJsbHZtLmhleGFnb24uVjYudmxzcnd2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsdXQ0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHV0NC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHV0dnZiIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHV0dnZiLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsdXR2dmIubm0iLAorICAibGx2bS5oZXhhZ29uLlY2LnZsdXR2dmIubm0uMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmx1dHZ2Yi5vcmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudmx1dHZ2Yi5vcmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHV0dnZiLm9yYWNjaSIsCisgICJsbHZtLmhleGFnb24uVjYudmx1dHZ2Yi5vcmFjY2kuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmx1dHZ2YmkiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsdXR2dmJpLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsdXR2d2giLAorICAibGx2bS5oZXhhZ29uLlY2LnZsdXR2d2guMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmx1dHZ3aC5ubSIsCisgICJsbHZtLmhleGFnb24uVjYudmx1dHZ3aC5ubS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHV0dndoLm9yYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHV0dndoLm9yYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsdXR2d2gub3JhY2NpIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHV0dndoLm9yYWNjaS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHV0dndoaSIsCisgICJsbHZtLmhleGFnb24uVjYudmx1dHZ3aGkuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1hc2tlZHN0b3JlbnEiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtYXNrZWRzdG9yZW5xLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtYXNrZWRzdG9yZW50bnEiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtYXNrZWRzdG9yZW50bnEuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1hc2tlZHN0b3JlbnRxIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bWFza2Vkc3RvcmVudHEuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1hc2tlZHN0b3JlcSIsCisgICJsbHZtLmhleGFnb24uVjYudm1hc2tlZHN0b3JlcS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bWF4YiIsCisgICJsbHZtLmhleGFnb24uVjYudm1heGIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1heGgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtYXhoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtYXh1YiIsCisgICJsbHZtLmhleGFnb24uVjYudm1heHViLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtYXh1aCIsCisgICJsbHZtLmhleGFnb24uVjYudm1heHVoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtYXh3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bWF4dy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bWluYiIsCisgICJsbHZtLmhleGFnb24uVjYudm1pbmIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1pbmgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtaW5oLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtaW51YiIsCisgICJsbHZtLmhleGFnb24uVjYudm1pbnViLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtaW51aCIsCisgICJsbHZtLmhleGFnb24uVjYudm1pbnVoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtaW53IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bWludy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhYnVzIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhYnVzLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcGFidXMuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhYnVzLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhYnVzdiIsCisgICJsbHZtLmhleGFnb24uVjYudm1wYWJ1c3YuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1wYWJ1dSIsCisgICJsbHZtLmhleGFnb24uVjYudm1wYWJ1dS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhYnV1LmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1wYWJ1dS5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1wYWJ1dXYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcGFidXV2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcGFoYiIsCisgICJsbHZtLmhleGFnb24uVjYudm1wYWhiLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcGFoYi5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcGFoYi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1wYWhoc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhaGhzYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1wYXVoYiIsCisgICJsbHZtLmhleGFnb24uVjYudm1wYXVoYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhdWhiLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1wYXVoYi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1wYXVodWhzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcGF1aHVoc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHN1aHVoc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBzdWh1aHNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5YnVzIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5YnVzLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlidXMuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5YnVzLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5YnVzdiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWJ1c3YuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWJ1c3YuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5YnVzdi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWJ2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5YnYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWJ2LmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWJ2LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5ZXd1aCIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWV3dWguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWV3dWguNjQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlld3VoLjY0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHloIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHloLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aHNhdC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHloc2F0LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aHNycyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWhzcnMuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWhzcyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWhzcy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aHVzIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aHVzLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlodXMuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aHVzLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aHYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlodi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aHYuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aHYuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlodnNycyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWh2c3JzLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpZW9oIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aWVvaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aWV3aC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpZXdoLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aWV3dWgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpZXd1aC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aWV3dWguYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aWV3dWguYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpaCIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWloLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpaC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpaC5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWloYiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWloYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aWhiLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWloYi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWlvd2giLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpb3doLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpd2IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpd2IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWl3Yi5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpd2IuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpd2giLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpd2guMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWl3aC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpd2guYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpd3ViIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aXd1Yi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aXd1Yi5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpd3ViLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5b3doIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5b3doLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlvd2guNjQuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5b3doLjY0LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5b3doLnJuZCIsCisgICJsbHZtLmhleGFnb24uVjYudm1weW93aC5ybmQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weW93aC5ybmQuc2FjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weW93aC5ybmQuc2FjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5b3doLnNhY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlvd2guc2FjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5dWIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHl1Yi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5dWIuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5dWIuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHl1YnYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHl1YnYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weXVidi5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHl1YnYuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHl1aCIsCisgICJsbHZtLmhleGFnb24uVjYudm1weXVoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHl1aC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHl1aC5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weXVoZSIsCisgICJsbHZtLmhleGFnb24uVjYudm1weXVoZS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5dWhlLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weXVoZS5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weXVodiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weXVodi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5dWh2LmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weXVodi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm11eCIsCisgICJsbHZtLmhleGFnb24uVjYudm11eC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bmF2Z2IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZuYXZnYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bmF2Z2giLAorICAibGx2bS5oZXhhZ29uLlY2LnZuYXZnaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bmF2Z3ViIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bmF2Z3ViLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZuYXZndyIsCisgICJsbHZtLmhleGFnb24uVjYudm5hdmd3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZub3JtYW10aCIsCisgICJsbHZtLmhleGFnb24uVjYudm5vcm1hbXRoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZub3JtYW10dyIsCisgICJsbHZtLmhleGFnb24uVjYudm5vcm1hbXR3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZub3QiLAorICAibGx2bS5oZXhhZ29uLlY2LnZub3QuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52b3IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnBhY2tlYiIsCisgICJsbHZtLmhleGFnb24uVjYudnBhY2tlYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cGFja2VoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cGFja2VoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZwYWNraGIuc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cGFja2hiLnNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cGFja2h1Yi5zYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZwYWNraHViLnNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cGFja29iIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cGFja29iLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZwYWNrb2giLAorICAibGx2bS5oZXhhZ29uLlY2LnZwYWNrb2guMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnBhY2t3aC5zYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZwYWNrd2guc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZwYWNrd3VoLnNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudnBhY2t3dWguc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZwb3Bjb3VudGgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZwb3Bjb3VudGguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnByZWZpeHFiIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cHJlZml4cWIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnByZWZpeHFoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cHJlZml4cWguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnByZWZpeHF3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cHJlZml4cXcuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnJkZWx0YSIsCisgICJsbHZtLmhleGFnb24uVjYudnJkZWx0YS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weWJ1Yi5ydHQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5YnViLnJ0dC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weWJ1Yi5ydHQuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weWJ1Yi5ydHQuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weWJ1cy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weWJ1cy5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weWJ1c2kiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzaS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weWJ1c2kuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weWJ1c2kuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzdiIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHlidXN2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzdi5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzdi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHlidiIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHlidi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weWJ2LmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHlidi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHl1YiIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHl1Yi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weXViLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHl1Yi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHl1Yi5ydHQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5dWIucnR0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5dWIucnR0LmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHl1Yi5ydHQuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5dWJpIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weXViaS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weXViaS5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5dWJpLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weXVidiIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHl1YnYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHl1YnYuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weXVidi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnJvciIsCisgICJsbHZtLmhleGFnb24uVjYudnJvci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm91bmRoYiIsCisgICJsbHZtLmhleGFnb24uVjYudnJvdW5kaGIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnJvdW5kaHViIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm91bmRodWIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnJvdW5kdWh1YiIsCisgICJsbHZtLmhleGFnb24uVjYudnJvdW5kdWh1Yi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm91bmR1d3VoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm91bmR1d3VoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZyb3VuZHdoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm91bmR3aC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm91bmR3dWgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZyb3VuZHd1aC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cnNhZHViaSIsCisgICJsbHZtLmhleGFnb24uVjYudnJzYWR1YmkuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnJzYWR1YmkuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cnNhZHViaS5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnNhdGh1YiIsCisgICJsbHZtLmhleGFnb24uVjYudnNhdGh1Yi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2F0dXd1aCIsCisgICJsbHZtLmhleGFnb24uVjYudnNhdHV3dWguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnNhdHdoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2F0d2guMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnNiIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaCIsCisgICJsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1oLmFkZCIsCisgICJsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaC5hZGQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHEiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWhxLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWh3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1ody4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1ody5hZGQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWh3LmFkZC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1od3EiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWh3cS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm13IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm13LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybXcuYWRkIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm13LmFkZC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm13cSIsCisgICJsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtd3EuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnNoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2guMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnNodWZlaCIsCisgICJsbHZtLmhleGFnb24uVjYudnNodWZlaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2h1ZmZiIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2h1ZmZiLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzaHVmZmViIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2h1ZmZlYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2h1ZmZoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2h1ZmZoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzaHVmZm9iIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2h1ZmZvYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2h1ZmZ2ZGQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzaHVmZnZkZC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2h1Zm9lYiIsCisgICJsbHZtLmhleGFnb24uVjYudnNodWZvZWIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnNodWZvZWgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzaHVmb2VoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzaHVmb2giLAorICAibGx2bS5oZXhhZ29uLlY2LnZzaHVmb2guMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YmIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJiLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJiLmR2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViYi5kdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViYm5xIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViYm5xLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJicSIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YmJxLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJic2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViYnNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViYnNhdC5kdiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YmJzYXQuZHYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YmNhcnJ5IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViY2FycnkuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YmgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJoLmR2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViaC5kdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViaG5xIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViaG5xLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJocSIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YmhxLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJoc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViaHNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViaHNhdC5kdiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YmhzYXQuZHYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1Ymh3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViaHcuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YnViaCIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YnViaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3VidWJzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ1YnNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3VidWJzYXQuZHYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ1YnNhdC5kdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3VidWJ1YmIuc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3VidWJ1YmIuc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ1aHNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YnVoc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ1aHNhdC5kdiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YnVoc2F0LmR2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ1aHciLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ1aHcuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YnV3c2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3VidXdzYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YnV3c2F0LmR2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3VidXdzYXQuZHYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YnciLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ3LmR2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3Vidy5kdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3Vid25xIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3Vid25xLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ3cSIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YndxLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ3c2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3Vid3NhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3Vid3NhdC5kdiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YndzYXQuZHYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN3YXAiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzd2FwLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ0bXB5YiIsCisgICJsbHZtLmhleGFnb24uVjYudnRtcHliLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ0bXB5Yi5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ0bXB5Yi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnRtcHlidXMiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ0bXB5YnVzLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ0bXB5YnVzLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudnRtcHlidXMuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ0bXB5aGIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ0bXB5aGIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnRtcHloYi5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ0bXB5aGIuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2tiIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52dW5wYWNrYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52dW5wYWNraCIsCisgICJsbHZtLmhleGFnb24uVjYudnVucGFja2guMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnVucGFja29iIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52dW5wYWNrb2IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnVucGFja29oIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52dW5wYWNrb2guMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnVucGFja3ViIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52dW5wYWNrdWIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnVucGFja3VoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52dW5wYWNrdWguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnhvciIsCisgICJsbHZtLmhleGFnb24uVjYudnhvci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52emIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ6Yi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52emgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ6aC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5ZMi5kY2NsZWFuYSIsCisgICJsbHZtLmhleGFnb24uWTIuZGNjbGVhbmludmEiLAorICAibGx2bS5oZXhhZ29uLlkyLmRjaW52YSIsCisgICJsbHZtLmhleGFnb24uWTIuZGN6ZXJvYSIsCisgICJsbHZtLmhleGFnb24uWTQubDJmZXRjaCIsCisgICJsbHZtLmhleGFnb24uWTUubDJmZXRjaCIsCisgICJsbHZtLmhleGFnb24uY2lyYy5sZGIiLAorICAibGx2bS5oZXhhZ29uLmNpcmMubGRkIiwKKyAgImxsdm0uaGV4YWdvbi5jaXJjLmxkaCIsCisgICJsbHZtLmhleGFnb24uY2lyYy5sZHViIiwKKyAgImxsdm0uaGV4YWdvbi5jaXJjLmxkdWgiLAorICAibGx2bS5oZXhhZ29uLmNpcmMubGR3IiwKKyAgImxsdm0uaGV4YWdvbi5jaXJjLnN0YiIsCisgICJsbHZtLmhleGFnb24uY2lyYy5zdGQiLAorICAibGx2bS5oZXhhZ29uLmNpcmMuc3RoIiwKKyAgImxsdm0uaGV4YWdvbi5jaXJjLnN0aGhpIiwKKyAgImxsdm0uaGV4YWdvbi5jaXJjLnN0dyIsCisgICJsbHZtLmhleGFnb24ubW0yNTZpLnZhZGR3IiwKKyAgImxsdm0uaGV4YWdvbi5wcmVmZXRjaCIsCisgICJsbHZtLm1pcHMuYWJzcS5zLnBoIiwKKyAgImxsdm0ubWlwcy5hYnNxLnMucWIiLAorICAibGx2bS5taXBzLmFic3Eucy53IiwKKyAgImxsdm0ubWlwcy5hZGQuYS5iIiwKKyAgImxsdm0ubWlwcy5hZGQuYS5kIiwKKyAgImxsdm0ubWlwcy5hZGQuYS5oIiwKKyAgImxsdm0ubWlwcy5hZGQuYS53IiwKKyAgImxsdm0ubWlwcy5hZGRxLnBoIiwKKyAgImxsdm0ubWlwcy5hZGRxLnMucGgiLAorICAibGx2bS5taXBzLmFkZHEucy53IiwKKyAgImxsdm0ubWlwcy5hZGRxaC5waCIsCisgICJsbHZtLm1pcHMuYWRkcWguci5waCIsCisgICJsbHZtLm1pcHMuYWRkcWguci53IiwKKyAgImxsdm0ubWlwcy5hZGRxaC53IiwKKyAgImxsdm0ubWlwcy5hZGRzLmEuYiIsCisgICJsbHZtLm1pcHMuYWRkcy5hLmQiLAorICAibGx2bS5taXBzLmFkZHMuYS5oIiwKKyAgImxsdm0ubWlwcy5hZGRzLmEudyIsCisgICJsbHZtLm1pcHMuYWRkcy5zLmIiLAorICAibGx2bS5taXBzLmFkZHMucy5kIiwKKyAgImxsdm0ubWlwcy5hZGRzLnMuaCIsCisgICJsbHZtLm1pcHMuYWRkcy5zLnciLAorICAibGx2bS5taXBzLmFkZHMudS5iIiwKKyAgImxsdm0ubWlwcy5hZGRzLnUuZCIsCisgICJsbHZtLm1pcHMuYWRkcy51LmgiLAorICAibGx2bS5taXBzLmFkZHMudS53IiwKKyAgImxsdm0ubWlwcy5hZGRzYyIsCisgICJsbHZtLm1pcHMuYWRkdS5waCIsCisgICJsbHZtLm1pcHMuYWRkdS5xYiIsCisgICJsbHZtLm1pcHMuYWRkdS5zLnBoIiwKKyAgImxsdm0ubWlwcy5hZGR1LnMucWIiLAorICAibGx2bS5taXBzLmFkZHVoLnFiIiwKKyAgImxsdm0ubWlwcy5hZGR1aC5yLnFiIiwKKyAgImxsdm0ubWlwcy5hZGR2LmIiLAorICAibGx2bS5taXBzLmFkZHYuZCIsCisgICJsbHZtLm1pcHMuYWRkdi5oIiwKKyAgImxsdm0ubWlwcy5hZGR2LnciLAorICAibGx2bS5taXBzLmFkZHZpLmIiLAorICAibGx2bS5taXBzLmFkZHZpLmQiLAorICAibGx2bS5taXBzLmFkZHZpLmgiLAorICAibGx2bS5taXBzLmFkZHZpLnciLAorICAibGx2bS5taXBzLmFkZHdjIiwKKyAgImxsdm0ubWlwcy5hbmQudiIsCisgICJsbHZtLm1pcHMuYW5kaS5iIiwKKyAgImxsdm0ubWlwcy5hcHBlbmQiLAorICAibGx2bS5taXBzLmFzdWIucy5iIiwKKyAgImxsdm0ubWlwcy5hc3ViLnMuZCIsCisgICJsbHZtLm1pcHMuYXN1Yi5zLmgiLAorICAibGx2bS5taXBzLmFzdWIucy53IiwKKyAgImxsdm0ubWlwcy5hc3ViLnUuYiIsCisgICJsbHZtLm1pcHMuYXN1Yi51LmQiLAorICAibGx2bS5taXBzLmFzdWIudS5oIiwKKyAgImxsdm0ubWlwcy5hc3ViLnUudyIsCisgICJsbHZtLm1pcHMuYXZlLnMuYiIsCisgICJsbHZtLm1pcHMuYXZlLnMuZCIsCisgICJsbHZtLm1pcHMuYXZlLnMuaCIsCisgICJsbHZtLm1pcHMuYXZlLnMudyIsCisgICJsbHZtLm1pcHMuYXZlLnUuYiIsCisgICJsbHZtLm1pcHMuYXZlLnUuZCIsCisgICJsbHZtLm1pcHMuYXZlLnUuaCIsCisgICJsbHZtLm1pcHMuYXZlLnUudyIsCisgICJsbHZtLm1pcHMuYXZlci5zLmIiLAorICAibGx2bS5taXBzLmF2ZXIucy5kIiwKKyAgImxsdm0ubWlwcy5hdmVyLnMuaCIsCisgICJsbHZtLm1pcHMuYXZlci5zLnciLAorICAibGx2bS5taXBzLmF2ZXIudS5iIiwKKyAgImxsdm0ubWlwcy5hdmVyLnUuZCIsCisgICJsbHZtLm1pcHMuYXZlci51LmgiLAorICAibGx2bS5taXBzLmF2ZXIudS53IiwKKyAgImxsdm0ubWlwcy5iYWxpZ24iLAorICAibGx2bS5taXBzLmJjbHIuYiIsCisgICJsbHZtLm1pcHMuYmNsci5kIiwKKyAgImxsdm0ubWlwcy5iY2xyLmgiLAorICAibGx2bS5taXBzLmJjbHIudyIsCisgICJsbHZtLm1pcHMuYmNscmkuYiIsCisgICJsbHZtLm1pcHMuYmNscmkuZCIsCisgICJsbHZtLm1pcHMuYmNscmkuaCIsCisgICJsbHZtLm1pcHMuYmNscmkudyIsCisgICJsbHZtLm1pcHMuYmluc2wuYiIsCisgICJsbHZtLm1pcHMuYmluc2wuZCIsCisgICJsbHZtLm1pcHMuYmluc2wuaCIsCisgICJsbHZtLm1pcHMuYmluc2wudyIsCisgICJsbHZtLm1pcHMuYmluc2xpLmIiLAorICAibGx2bS5taXBzLmJpbnNsaS5kIiwKKyAgImxsdm0ubWlwcy5iaW5zbGkuaCIsCisgICJsbHZtLm1pcHMuYmluc2xpLnciLAorICAibGx2bS5taXBzLmJpbnNyLmIiLAorICAibGx2bS5taXBzLmJpbnNyLmQiLAorICAibGx2bS5taXBzLmJpbnNyLmgiLAorICAibGx2bS5taXBzLmJpbnNyLnciLAorICAibGx2bS5taXBzLmJpbnNyaS5iIiwKKyAgImxsdm0ubWlwcy5iaW5zcmkuZCIsCisgICJsbHZtLm1pcHMuYmluc3JpLmgiLAorICAibGx2bS5taXBzLmJpbnNyaS53IiwKKyAgImxsdm0ubWlwcy5iaXRyZXYiLAorICAibGx2bS5taXBzLmJtbnoudiIsCisgICJsbHZtLm1pcHMuYm1uemkuYiIsCisgICJsbHZtLm1pcHMuYm16LnYiLAorICAibGx2bS5taXBzLmJtemkuYiIsCisgICJsbHZtLm1pcHMuYm5lZy5iIiwKKyAgImxsdm0ubWlwcy5ibmVnLmQiLAorICAibGx2bS5taXBzLmJuZWcuaCIsCisgICJsbHZtLm1pcHMuYm5lZy53IiwKKyAgImxsdm0ubWlwcy5ibmVnaS5iIiwKKyAgImxsdm0ubWlwcy5ibmVnaS5kIiwKKyAgImxsdm0ubWlwcy5ibmVnaS5oIiwKKyAgImxsdm0ubWlwcy5ibmVnaS53IiwKKyAgImxsdm0ubWlwcy5ibnouYiIsCisgICJsbHZtLm1pcHMuYm56LmQiLAorICAibGx2bS5taXBzLmJuei5oIiwKKyAgImxsdm0ubWlwcy5ibnoudiIsCisgICJsbHZtLm1pcHMuYm56LnciLAorICAibGx2bS5taXBzLmJwb3NnZTMyIiwKKyAgImxsdm0ubWlwcy5ic2VsLnYiLAorICAibGx2bS5taXBzLmJzZWxpLmIiLAorICAibGx2bS5taXBzLmJzZXQuYiIsCisgICJsbHZtLm1pcHMuYnNldC5kIiwKKyAgImxsdm0ubWlwcy5ic2V0LmgiLAorICAibGx2bS5taXBzLmJzZXQudyIsCisgICJsbHZtLm1pcHMuYnNldGkuYiIsCisgICJsbHZtLm1pcHMuYnNldGkuZCIsCisgICJsbHZtLm1pcHMuYnNldGkuaCIsCisgICJsbHZtLm1pcHMuYnNldGkudyIsCisgICJsbHZtLm1pcHMuYnouYiIsCisgICJsbHZtLm1pcHMuYnouZCIsCisgICJsbHZtLm1pcHMuYnouaCIsCisgICJsbHZtLm1pcHMuYnoudiIsCisgICJsbHZtLm1pcHMuYnoudyIsCisgICJsbHZtLm1pcHMuY2VxLmIiLAorICAibGx2bS5taXBzLmNlcS5kIiwKKyAgImxsdm0ubWlwcy5jZXEuaCIsCisgICJsbHZtLm1pcHMuY2VxLnciLAorICAibGx2bS5taXBzLmNlcWkuYiIsCisgICJsbHZtLm1pcHMuY2VxaS5kIiwKKyAgImxsdm0ubWlwcy5jZXFpLmgiLAorICAibGx2bS5taXBzLmNlcWkudyIsCisgICJsbHZtLm1pcHMuY2ZjbXNhIiwKKyAgImxsdm0ubWlwcy5jbGUucy5iIiwKKyAgImxsdm0ubWlwcy5jbGUucy5kIiwKKyAgImxsdm0ubWlwcy5jbGUucy5oIiwKKyAgImxsdm0ubWlwcy5jbGUucy53IiwKKyAgImxsdm0ubWlwcy5jbGUudS5iIiwKKyAgImxsdm0ubWlwcy5jbGUudS5kIiwKKyAgImxsdm0ubWlwcy5jbGUudS5oIiwKKyAgImxsdm0ubWlwcy5jbGUudS53IiwKKyAgImxsdm0ubWlwcy5jbGVpLnMuYiIsCisgICJsbHZtLm1pcHMuY2xlaS5zLmQiLAorICAibGx2bS5taXBzLmNsZWkucy5oIiwKKyAgImxsdm0ubWlwcy5jbGVpLnMudyIsCisgICJsbHZtLm1pcHMuY2xlaS51LmIiLAorICAibGx2bS5taXBzLmNsZWkudS5kIiwKKyAgImxsdm0ubWlwcy5jbGVpLnUuaCIsCisgICJsbHZtLm1pcHMuY2xlaS51LnciLAorICAibGx2bS5taXBzLmNsdC5zLmIiLAorICAibGx2bS5taXBzLmNsdC5zLmQiLAorICAibGx2bS5taXBzLmNsdC5zLmgiLAorICAibGx2bS5taXBzLmNsdC5zLnciLAorICAibGx2bS5taXBzLmNsdC51LmIiLAorICAibGx2bS5taXBzLmNsdC51LmQiLAorICAibGx2bS5taXBzLmNsdC51LmgiLAorICAibGx2bS5taXBzLmNsdC51LnciLAorICAibGx2bS5taXBzLmNsdGkucy5iIiwKKyAgImxsdm0ubWlwcy5jbHRpLnMuZCIsCisgICJsbHZtLm1pcHMuY2x0aS5zLmgiLAorICAibGx2bS5taXBzLmNsdGkucy53IiwKKyAgImxsdm0ubWlwcy5jbHRpLnUuYiIsCisgICJsbHZtLm1pcHMuY2x0aS51LmQiLAorICAibGx2bS5taXBzLmNsdGkudS5oIiwKKyAgImxsdm0ubWlwcy5jbHRpLnUudyIsCisgICJsbHZtLm1pcHMuY21wLmVxLnBoIiwKKyAgImxsdm0ubWlwcy5jbXAubGUucGgiLAorICAibGx2bS5taXBzLmNtcC5sdC5waCIsCisgICJsbHZtLm1pcHMuY21wZ2R1LmVxLnFiIiwKKyAgImxsdm0ubWlwcy5jbXBnZHUubGUucWIiLAorICAibGx2bS5taXBzLmNtcGdkdS5sdC5xYiIsCisgICJsbHZtLm1pcHMuY21wZ3UuZXEucWIiLAorICAibGx2bS5taXBzLmNtcGd1LmxlLnFiIiwKKyAgImxsdm0ubWlwcy5jbXBndS5sdC5xYiIsCisgICJsbHZtLm1pcHMuY21wdS5lcS5xYiIsCisgICJsbHZtLm1pcHMuY21wdS5sZS5xYiIsCisgICJsbHZtLm1pcHMuY21wdS5sdC5xYiIsCisgICJsbHZtLm1pcHMuY29weS5zLmIiLAorICAibGx2bS5taXBzLmNvcHkucy5kIiwKKyAgImxsdm0ubWlwcy5jb3B5LnMuaCIsCisgICJsbHZtLm1pcHMuY29weS5zLnciLAorICAibGx2bS5taXBzLmNvcHkudS5iIiwKKyAgImxsdm0ubWlwcy5jb3B5LnUuZCIsCisgICJsbHZtLm1pcHMuY29weS51LmgiLAorICAibGx2bS5taXBzLmNvcHkudS53IiwKKyAgImxsdm0ubWlwcy5jdGNtc2EiLAorICAibGx2bS5taXBzLmRpdi5zLmIiLAorICAibGx2bS5taXBzLmRpdi5zLmQiLAorICAibGx2bS5taXBzLmRpdi5zLmgiLAorICAibGx2bS5taXBzLmRpdi5zLnciLAorICAibGx2bS5taXBzLmRpdi51LmIiLAorICAibGx2bS5taXBzLmRpdi51LmQiLAorICAibGx2bS5taXBzLmRpdi51LmgiLAorICAibGx2bS5taXBzLmRpdi51LnciLAorICAibGx2bS5taXBzLmRsc2EiLAorICAibGx2bS5taXBzLmRvdHAucy5kIiwKKyAgImxsdm0ubWlwcy5kb3RwLnMuaCIsCisgICJsbHZtLm1pcHMuZG90cC5zLnciLAorICAibGx2bS5taXBzLmRvdHAudS5kIiwKKyAgImxsdm0ubWlwcy5kb3RwLnUuaCIsCisgICJsbHZtLm1pcHMuZG90cC51LnciLAorICAibGx2bS5taXBzLmRwYS53LnBoIiwKKyAgImxsdm0ubWlwcy5kcGFkZC5zLmQiLAorICAibGx2bS5taXBzLmRwYWRkLnMuaCIsCisgICJsbHZtLm1pcHMuZHBhZGQucy53IiwKKyAgImxsdm0ubWlwcy5kcGFkZC51LmQiLAorICAibGx2bS5taXBzLmRwYWRkLnUuaCIsCisgICJsbHZtLm1pcHMuZHBhZGQudS53IiwKKyAgImxsdm0ubWlwcy5kcGFxLnMudy5waCIsCisgICJsbHZtLm1pcHMuZHBhcS5zYS5sLnciLAorICAibGx2bS5taXBzLmRwYXF4LnMudy5waCIsCisgICJsbHZtLm1pcHMuZHBhcXguc2Eudy5waCIsCisgICJsbHZtLm1pcHMuZHBhdS5oLnFibCIsCisgICJsbHZtLm1pcHMuZHBhdS5oLnFiciIsCisgICJsbHZtLm1pcHMuZHBheC53LnBoIiwKKyAgImxsdm0ubWlwcy5kcHMudy5waCIsCisgICJsbHZtLm1pcHMuZHBzcS5zLncucGgiLAorICAibGx2bS5taXBzLmRwc3Euc2EubC53IiwKKyAgImxsdm0ubWlwcy5kcHNxeC5zLncucGgiLAorICAibGx2bS5taXBzLmRwc3F4LnNhLncucGgiLAorICAibGx2bS5taXBzLmRwc3UuaC5xYmwiLAorICAibGx2bS5taXBzLmRwc3UuaC5xYnIiLAorICAibGx2bS5taXBzLmRwc3ViLnMuZCIsCisgICJsbHZtLm1pcHMuZHBzdWIucy5oIiwKKyAgImxsdm0ubWlwcy5kcHN1Yi5zLnciLAorICAibGx2bS5taXBzLmRwc3ViLnUuZCIsCisgICJsbHZtLm1pcHMuZHBzdWIudS5oIiwKKyAgImxsdm0ubWlwcy5kcHN1Yi51LnciLAorICAibGx2bS5taXBzLmRwc3gudy5waCIsCisgICJsbHZtLm1pcHMuZXh0cCIsCisgICJsbHZtLm1pcHMuZXh0cGRwIiwKKyAgImxsdm0ubWlwcy5leHRyLnIudyIsCisgICJsbHZtLm1pcHMuZXh0ci5ycy53IiwKKyAgImxsdm0ubWlwcy5leHRyLnMuaCIsCisgICJsbHZtLm1pcHMuZXh0ci53IiwKKyAgImxsdm0ubWlwcy5mYWRkLmQiLAorICAibGx2bS5taXBzLmZhZGQudyIsCisgICJsbHZtLm1pcHMuZmNhZi5kIiwKKyAgImxsdm0ubWlwcy5mY2FmLnciLAorICAibGx2bS5taXBzLmZjZXEuZCIsCisgICJsbHZtLm1pcHMuZmNlcS53IiwKKyAgImxsdm0ubWlwcy5mY2xhc3MuZCIsCisgICJsbHZtLm1pcHMuZmNsYXNzLnciLAorICAibGx2bS5taXBzLmZjbGUuZCIsCisgICJsbHZtLm1pcHMuZmNsZS53IiwKKyAgImxsdm0ubWlwcy5mY2x0LmQiLAorICAibGx2bS5taXBzLmZjbHQudyIsCisgICJsbHZtLm1pcHMuZmNuZS5kIiwKKyAgImxsdm0ubWlwcy5mY25lLnciLAorICAibGx2bS5taXBzLmZjb3IuZCIsCisgICJsbHZtLm1pcHMuZmNvci53IiwKKyAgImxsdm0ubWlwcy5mY3VlcS5kIiwKKyAgImxsdm0ubWlwcy5mY3VlcS53IiwKKyAgImxsdm0ubWlwcy5mY3VsZS5kIiwKKyAgImxsdm0ubWlwcy5mY3VsZS53IiwKKyAgImxsdm0ubWlwcy5mY3VsdC5kIiwKKyAgImxsdm0ubWlwcy5mY3VsdC53IiwKKyAgImxsdm0ubWlwcy5mY3VuLmQiLAorICAibGx2bS5taXBzLmZjdW4udyIsCisgICJsbHZtLm1pcHMuZmN1bmUuZCIsCisgICJsbHZtLm1pcHMuZmN1bmUudyIsCisgICJsbHZtLm1pcHMuZmRpdi5kIiwKKyAgImxsdm0ubWlwcy5mZGl2LnciLAorICAibGx2bS5taXBzLmZleGRvLmgiLAorICAibGx2bS5taXBzLmZleGRvLnciLAorICAibGx2bS5taXBzLmZleHAyLmQiLAorICAibGx2bS5taXBzLmZleHAyLnciLAorICAibGx2bS5taXBzLmZleHVwbC5kIiwKKyAgImxsdm0ubWlwcy5mZXh1cGwudyIsCisgICJsbHZtLm1pcHMuZmV4dXByLmQiLAorICAibGx2bS5taXBzLmZleHVwci53IiwKKyAgImxsdm0ubWlwcy5mZmludC5zLmQiLAorICAibGx2bS5taXBzLmZmaW50LnMudyIsCisgICJsbHZtLm1pcHMuZmZpbnQudS5kIiwKKyAgImxsdm0ubWlwcy5mZmludC51LnciLAorICAibGx2bS5taXBzLmZmcWwuZCIsCisgICJsbHZtLm1pcHMuZmZxbC53IiwKKyAgImxsdm0ubWlwcy5mZnFyLmQiLAorICAibGx2bS5taXBzLmZmcXIudyIsCisgICJsbHZtLm1pcHMuZmlsbC5iIiwKKyAgImxsdm0ubWlwcy5maWxsLmQiLAorICAibGx2bS5taXBzLmZpbGwuaCIsCisgICJsbHZtLm1pcHMuZmlsbC53IiwKKyAgImxsdm0ubWlwcy5mbG9nMi5kIiwKKyAgImxsdm0ubWlwcy5mbG9nMi53IiwKKyAgImxsdm0ubWlwcy5mbWFkZC5kIiwKKyAgImxsdm0ubWlwcy5mbWFkZC53IiwKKyAgImxsdm0ubWlwcy5mbWF4LmEuZCIsCisgICJsbHZtLm1pcHMuZm1heC5hLnciLAorICAibGx2bS5taXBzLmZtYXguZCIsCisgICJsbHZtLm1pcHMuZm1heC53IiwKKyAgImxsdm0ubWlwcy5mbWluLmEuZCIsCisgICJsbHZtLm1pcHMuZm1pbi5hLnciLAorICAibGx2bS5taXBzLmZtaW4uZCIsCisgICJsbHZtLm1pcHMuZm1pbi53IiwKKyAgImxsdm0ubWlwcy5mbXN1Yi5kIiwKKyAgImxsdm0ubWlwcy5mbXN1Yi53IiwKKyAgImxsdm0ubWlwcy5mbXVsLmQiLAorICAibGx2bS5taXBzLmZtdWwudyIsCisgICJsbHZtLm1pcHMuZnJjcC5kIiwKKyAgImxsdm0ubWlwcy5mcmNwLnciLAorICAibGx2bS5taXBzLmZyaW50LmQiLAorICAibGx2bS5taXBzLmZyaW50LnciLAorICAibGx2bS5taXBzLmZyc3FydC5kIiwKKyAgImxsdm0ubWlwcy5mcnNxcnQudyIsCisgICJsbHZtLm1pcHMuZnNhZi5kIiwKKyAgImxsdm0ubWlwcy5mc2FmLnciLAorICAibGx2bS5taXBzLmZzZXEuZCIsCisgICJsbHZtLm1pcHMuZnNlcS53IiwKKyAgImxsdm0ubWlwcy5mc2xlLmQiLAorICAibGx2bS5taXBzLmZzbGUudyIsCisgICJsbHZtLm1pcHMuZnNsdC5kIiwKKyAgImxsdm0ubWlwcy5mc2x0LnciLAorICAibGx2bS5taXBzLmZzbmUuZCIsCisgICJsbHZtLm1pcHMuZnNuZS53IiwKKyAgImxsdm0ubWlwcy5mc29yLmQiLAorICAibGx2bS5taXBzLmZzb3IudyIsCisgICJsbHZtLm1pcHMuZnNxcnQuZCIsCisgICJsbHZtLm1pcHMuZnNxcnQudyIsCisgICJsbHZtLm1pcHMuZnN1Yi5kIiwKKyAgImxsdm0ubWlwcy5mc3ViLnciLAorICAibGx2bS5taXBzLmZzdWVxLmQiLAorICAibGx2bS5taXBzLmZzdWVxLnciLAorICAibGx2bS5taXBzLmZzdWxlLmQiLAorICAibGx2bS5taXBzLmZzdWxlLnciLAorICAibGx2bS5taXBzLmZzdWx0LmQiLAorICAibGx2bS5taXBzLmZzdWx0LnciLAorICAibGx2bS5taXBzLmZzdW4uZCIsCisgICJsbHZtLm1pcHMuZnN1bi53IiwKKyAgImxsdm0ubWlwcy5mc3VuZS5kIiwKKyAgImxsdm0ubWlwcy5mc3VuZS53IiwKKyAgImxsdm0ubWlwcy5mdGludC5zLmQiLAorICAibGx2bS5taXBzLmZ0aW50LnMudyIsCisgICJsbHZtLm1pcHMuZnRpbnQudS5kIiwKKyAgImxsdm0ubWlwcy5mdGludC51LnciLAorICAibGx2bS5taXBzLmZ0cS5oIiwKKyAgImxsdm0ubWlwcy5mdHEudyIsCisgICJsbHZtLm1pcHMuZnRydW5jLnMuZCIsCisgICJsbHZtLm1pcHMuZnRydW5jLnMudyIsCisgICJsbHZtLm1pcHMuZnRydW5jLnUuZCIsCisgICJsbHZtLm1pcHMuZnRydW5jLnUudyIsCisgICJsbHZtLm1pcHMuaGFkZC5zLmQiLAorICAibGx2bS5taXBzLmhhZGQucy5oIiwKKyAgImxsdm0ubWlwcy5oYWRkLnMudyIsCisgICJsbHZtLm1pcHMuaGFkZC51LmQiLAorICAibGx2bS5taXBzLmhhZGQudS5oIiwKKyAgImxsdm0ubWlwcy5oYWRkLnUudyIsCisgICJsbHZtLm1pcHMuaHN1Yi5zLmQiLAorICAibGx2bS5taXBzLmhzdWIucy5oIiwKKyAgImxsdm0ubWlwcy5oc3ViLnMudyIsCisgICJsbHZtLm1pcHMuaHN1Yi51LmQiLAorICAibGx2bS5taXBzLmhzdWIudS5oIiwKKyAgImxsdm0ubWlwcy5oc3ViLnUudyIsCisgICJsbHZtLm1pcHMuaWx2ZXYuYiIsCisgICJsbHZtLm1pcHMuaWx2ZXYuZCIsCisgICJsbHZtLm1pcHMuaWx2ZXYuaCIsCisgICJsbHZtLm1pcHMuaWx2ZXYudyIsCisgICJsbHZtLm1pcHMuaWx2bC5iIiwKKyAgImxsdm0ubWlwcy5pbHZsLmQiLAorICAibGx2bS5taXBzLmlsdmwuaCIsCisgICJsbHZtLm1pcHMuaWx2bC53IiwKKyAgImxsdm0ubWlwcy5pbHZvZC5iIiwKKyAgImxsdm0ubWlwcy5pbHZvZC5kIiwKKyAgImxsdm0ubWlwcy5pbHZvZC5oIiwKKyAgImxsdm0ubWlwcy5pbHZvZC53IiwKKyAgImxsdm0ubWlwcy5pbHZyLmIiLAorICAibGx2bS5taXBzLmlsdnIuZCIsCisgICJsbHZtLm1pcHMuaWx2ci5oIiwKKyAgImxsdm0ubWlwcy5pbHZyLnciLAorICAibGx2bS5taXBzLmluc2VydC5iIiwKKyAgImxsdm0ubWlwcy5pbnNlcnQuZCIsCisgICJsbHZtLm1pcHMuaW5zZXJ0LmgiLAorICAibGx2bS5taXBzLmluc2VydC53IiwKKyAgImxsdm0ubWlwcy5pbnN2IiwKKyAgImxsdm0ubWlwcy5pbnN2ZS5iIiwKKyAgImxsdm0ubWlwcy5pbnN2ZS5kIiwKKyAgImxsdm0ubWlwcy5pbnN2ZS5oIiwKKyAgImxsdm0ubWlwcy5pbnN2ZS53IiwKKyAgImxsdm0ubWlwcy5sYnV4IiwKKyAgImxsdm0ubWlwcy5sZC5iIiwKKyAgImxsdm0ubWlwcy5sZC5kIiwKKyAgImxsdm0ubWlwcy5sZC5oIiwKKyAgImxsdm0ubWlwcy5sZC53IiwKKyAgImxsdm0ubWlwcy5sZGkuYiIsCisgICJsbHZtLm1pcHMubGRpLmQiLAorICAibGx2bS5taXBzLmxkaS5oIiwKKyAgImxsdm0ubWlwcy5sZGkudyIsCisgICJsbHZtLm1pcHMubGh4IiwKKyAgImxsdm0ubWlwcy5sc2EiLAorICAibGx2bS5taXBzLmx3eCIsCisgICJsbHZtLm1pcHMubWFkZCIsCisgICJsbHZtLm1pcHMubWFkZC5xLmgiLAorICAibGx2bS5taXBzLm1hZGQucS53IiwKKyAgImxsdm0ubWlwcy5tYWRkci5xLmgiLAorICAibGx2bS5taXBzLm1hZGRyLnEudyIsCisgICJsbHZtLm1pcHMubWFkZHUiLAorICAibGx2bS5taXBzLm1hZGR2LmIiLAorICAibGx2bS5taXBzLm1hZGR2LmQiLAorICAibGx2bS5taXBzLm1hZGR2LmgiLAorICAibGx2bS5taXBzLm1hZGR2LnciLAorICAibGx2bS5taXBzLm1hcS5zLncucGhsIiwKKyAgImxsdm0ubWlwcy5tYXEucy53LnBociIsCisgICJsbHZtLm1pcHMubWFxLnNhLncucGhsIiwKKyAgImxsdm0ubWlwcy5tYXEuc2Eudy5waHIiLAorICAibGx2bS5taXBzLm1heC5hLmIiLAorICAibGx2bS5taXBzLm1heC5hLmQiLAorICAibGx2bS5taXBzLm1heC5hLmgiLAorICAibGx2bS5taXBzLm1heC5hLnciLAorICAibGx2bS5taXBzLm1heC5zLmIiLAorICAibGx2bS5taXBzLm1heC5zLmQiLAorICAibGx2bS5taXBzLm1heC5zLmgiLAorICAibGx2bS5taXBzLm1heC5zLnciLAorICAibGx2bS5taXBzLm1heC51LmIiLAorICAibGx2bS5taXBzLm1heC51LmQiLAorICAibGx2bS5taXBzLm1heC51LmgiLAorICAibGx2bS5taXBzLm1heC51LnciLAorICAibGx2bS5taXBzLm1heGkucy5iIiwKKyAgImxsdm0ubWlwcy5tYXhpLnMuZCIsCisgICJsbHZtLm1pcHMubWF4aS5zLmgiLAorICAibGx2bS5taXBzLm1heGkucy53IiwKKyAgImxsdm0ubWlwcy5tYXhpLnUuYiIsCisgICJsbHZtLm1pcHMubWF4aS51LmQiLAorICAibGx2bS5taXBzLm1heGkudS5oIiwKKyAgImxsdm0ubWlwcy5tYXhpLnUudyIsCisgICJsbHZtLm1pcHMubWluLmEuYiIsCisgICJsbHZtLm1pcHMubWluLmEuZCIsCisgICJsbHZtLm1pcHMubWluLmEuaCIsCisgICJsbHZtLm1pcHMubWluLmEudyIsCisgICJsbHZtLm1pcHMubWluLnMuYiIsCisgICJsbHZtLm1pcHMubWluLnMuZCIsCisgICJsbHZtLm1pcHMubWluLnMuaCIsCisgICJsbHZtLm1pcHMubWluLnMudyIsCisgICJsbHZtLm1pcHMubWluLnUuYiIsCisgICJsbHZtLm1pcHMubWluLnUuZCIsCisgICJsbHZtLm1pcHMubWluLnUuaCIsCisgICJsbHZtLm1pcHMubWluLnUudyIsCisgICJsbHZtLm1pcHMubWluaS5zLmIiLAorICAibGx2bS5taXBzLm1pbmkucy5kIiwKKyAgImxsdm0ubWlwcy5taW5pLnMuaCIsCisgICJsbHZtLm1pcHMubWluaS5zLnciLAorICAibGx2bS5taXBzLm1pbmkudS5iIiwKKyAgImxsdm0ubWlwcy5taW5pLnUuZCIsCisgICJsbHZtLm1pcHMubWluaS51LmgiLAorICAibGx2bS5taXBzLm1pbmkudS53IiwKKyAgImxsdm0ubWlwcy5tb2Qucy5iIiwKKyAgImxsdm0ubWlwcy5tb2Qucy5kIiwKKyAgImxsdm0ubWlwcy5tb2Qucy5oIiwKKyAgImxsdm0ubWlwcy5tb2Qucy53IiwKKyAgImxsdm0ubWlwcy5tb2QudS5iIiwKKyAgImxsdm0ubWlwcy5tb2QudS5kIiwKKyAgImxsdm0ubWlwcy5tb2QudS5oIiwKKyAgImxsdm0ubWlwcy5tb2QudS53IiwKKyAgImxsdm0ubWlwcy5tb2RzdWIiLAorICAibGx2bS5taXBzLm1vdmUudiIsCisgICJsbHZtLm1pcHMubXN1YiIsCisgICJsbHZtLm1pcHMubXN1Yi5xLmgiLAorICAibGx2bS5taXBzLm1zdWIucS53IiwKKyAgImxsdm0ubWlwcy5tc3Vici5xLmgiLAorICAibGx2bS5taXBzLm1zdWJyLnEudyIsCisgICJsbHZtLm1pcHMubXN1YnUiLAorICAibGx2bS5taXBzLm1zdWJ2LmIiLAorICAibGx2bS5taXBzLm1zdWJ2LmQiLAorICAibGx2bS5taXBzLm1zdWJ2LmgiLAorICAibGx2bS5taXBzLm1zdWJ2LnciLAorICAibGx2bS5taXBzLm10aGxpcCIsCisgICJsbHZtLm1pcHMubXVsLnBoIiwKKyAgImxsdm0ubWlwcy5tdWwucS5oIiwKKyAgImxsdm0ubWlwcy5tdWwucS53IiwKKyAgImxsdm0ubWlwcy5tdWwucy5waCIsCisgICJsbHZtLm1pcHMubXVsZXEucy53LnBobCIsCisgICJsbHZtLm1pcHMubXVsZXEucy53LnBociIsCisgICJsbHZtLm1pcHMubXVsZXUucy5waC5xYmwiLAorICAibGx2bS5taXBzLm11bGV1LnMucGgucWJyIiwKKyAgImxsdm0ubWlwcy5tdWxxLnJzLnBoIiwKKyAgImxsdm0ubWlwcy5tdWxxLnJzLnciLAorICAibGx2bS5taXBzLm11bHEucy5waCIsCisgICJsbHZtLm1pcHMubXVscS5zLnciLAorICAibGx2bS5taXBzLm11bHIucS5oIiwKKyAgImxsdm0ubWlwcy5tdWxyLnEudyIsCisgICJsbHZtLm1pcHMubXVsc2Eudy5waCIsCisgICJsbHZtLm1pcHMubXVsc2FxLnMudy5waCIsCisgICJsbHZtLm1pcHMubXVsdCIsCisgICJsbHZtLm1pcHMubXVsdHUiLAorICAibGx2bS5taXBzLm11bHYuYiIsCisgICJsbHZtLm1pcHMubXVsdi5kIiwKKyAgImxsdm0ubWlwcy5tdWx2LmgiLAorICAibGx2bS5taXBzLm11bHYudyIsCisgICJsbHZtLm1pcHMubmxvYy5iIiwKKyAgImxsdm0ubWlwcy5ubG9jLmQiLAorICAibGx2bS5taXBzLm5sb2MuaCIsCisgICJsbHZtLm1pcHMubmxvYy53IiwKKyAgImxsdm0ubWlwcy5ubHpjLmIiLAorICAibGx2bS5taXBzLm5semMuZCIsCisgICJsbHZtLm1pcHMubmx6Yy5oIiwKKyAgImxsdm0ubWlwcy5ubHpjLnciLAorICAibGx2bS5taXBzLm5vci52IiwKKyAgImxsdm0ubWlwcy5ub3JpLmIiLAorICAibGx2bS5taXBzLm9yLnYiLAorICAibGx2bS5taXBzLm9yaS5iIiwKKyAgImxsdm0ubWlwcy5wYWNrcmwucGgiLAorICAibGx2bS5taXBzLnBja2V2LmIiLAorICAibGx2bS5taXBzLnBja2V2LmQiLAorICAibGx2bS5taXBzLnBja2V2LmgiLAorICAibGx2bS5taXBzLnBja2V2LnciLAorICAibGx2bS5taXBzLnBja29kLmIiLAorICAibGx2bS5taXBzLnBja29kLmQiLAorICAibGx2bS5taXBzLnBja29kLmgiLAorICAibGx2bS5taXBzLnBja29kLnciLAorICAibGx2bS5taXBzLnBjbnQuYiIsCisgICJsbHZtLm1pcHMucGNudC5kIiwKKyAgImxsdm0ubWlwcy5wY250LmgiLAorICAibGx2bS5taXBzLnBjbnQudyIsCisgICJsbHZtLm1pcHMucGljay5waCIsCisgICJsbHZtLm1pcHMucGljay5xYiIsCisgICJsbHZtLm1pcHMucHJlY2VxLncucGhsIiwKKyAgImxsdm0ubWlwcy5wcmVjZXEudy5waHIiLAorICAibGx2bS5taXBzLnByZWNlcXUucGgucWJsIiwKKyAgImxsdm0ubWlwcy5wcmVjZXF1LnBoLnFibGEiLAorICAibGx2bS5taXBzLnByZWNlcXUucGgucWJyIiwKKyAgImxsdm0ubWlwcy5wcmVjZXF1LnBoLnFicmEiLAorICAibGx2bS5taXBzLnByZWNldS5waC5xYmwiLAorICAibGx2bS5taXBzLnByZWNldS5waC5xYmxhIiwKKyAgImxsdm0ubWlwcy5wcmVjZXUucGgucWJyIiwKKyAgImxsdm0ubWlwcy5wcmVjZXUucGgucWJyYSIsCisgICJsbHZtLm1pcHMucHJlY3IucWIucGgiLAorICAibGx2bS5taXBzLnByZWNyLnNyYS5waC53IiwKKyAgImxsdm0ubWlwcy5wcmVjci5zcmEuci5waC53IiwKKyAgImxsdm0ubWlwcy5wcmVjcnEucGgudyIsCisgICJsbHZtLm1pcHMucHJlY3JxLnFiLnBoIiwKKyAgImxsdm0ubWlwcy5wcmVjcnEucnMucGgudyIsCisgICJsbHZtLm1pcHMucHJlY3JxdS5zLnFiLnBoIiwKKyAgImxsdm0ubWlwcy5wcmVwZW5kIiwKKyAgImxsdm0ubWlwcy5yYWRkdS53LnFiIiwKKyAgImxsdm0ubWlwcy5yZGRzcCIsCisgICJsbHZtLm1pcHMucmVwbC5waCIsCisgICJsbHZtLm1pcHMucmVwbC5xYiIsCisgICJsbHZtLm1pcHMuc2F0LnMuYiIsCisgICJsbHZtLm1pcHMuc2F0LnMuZCIsCisgICJsbHZtLm1pcHMuc2F0LnMuaCIsCisgICJsbHZtLm1pcHMuc2F0LnMudyIsCisgICJsbHZtLm1pcHMuc2F0LnUuYiIsCisgICJsbHZtLm1pcHMuc2F0LnUuZCIsCisgICJsbHZtLm1pcHMuc2F0LnUuaCIsCisgICJsbHZtLm1pcHMuc2F0LnUudyIsCisgICJsbHZtLm1pcHMuc2hmLmIiLAorICAibGx2bS5taXBzLnNoZi5oIiwKKyAgImxsdm0ubWlwcy5zaGYudyIsCisgICJsbHZtLm1pcHMuc2hpbG8iLAorICAibGx2bS5taXBzLnNobGwucGgiLAorICAibGx2bS5taXBzLnNobGwucWIiLAorICAibGx2bS5taXBzLnNobGwucy5waCIsCisgICJsbHZtLm1pcHMuc2hsbC5zLnciLAorICAibGx2bS5taXBzLnNocmEucGgiLAorICAibGx2bS5taXBzLnNocmEucWIiLAorICAibGx2bS5taXBzLnNocmEuci5waCIsCisgICJsbHZtLm1pcHMuc2hyYS5yLnFiIiwKKyAgImxsdm0ubWlwcy5zaHJhLnIudyIsCisgICJsbHZtLm1pcHMuc2hybC5waCIsCisgICJsbHZtLm1pcHMuc2hybC5xYiIsCisgICJsbHZtLm1pcHMuc2xkLmIiLAorICAibGx2bS5taXBzLnNsZC5kIiwKKyAgImxsdm0ubWlwcy5zbGQuaCIsCisgICJsbHZtLm1pcHMuc2xkLnciLAorICAibGx2bS5taXBzLnNsZGkuYiIsCisgICJsbHZtLm1pcHMuc2xkaS5kIiwKKyAgImxsdm0ubWlwcy5zbGRpLmgiLAorICAibGx2bS5taXBzLnNsZGkudyIsCisgICJsbHZtLm1pcHMuc2xsLmIiLAorICAibGx2bS5taXBzLnNsbC5kIiwKKyAgImxsdm0ubWlwcy5zbGwuaCIsCisgICJsbHZtLm1pcHMuc2xsLnciLAorICAibGx2bS5taXBzLnNsbGkuYiIsCisgICJsbHZtLm1pcHMuc2xsaS5kIiwKKyAgImxsdm0ubWlwcy5zbGxpLmgiLAorICAibGx2bS5taXBzLnNsbGkudyIsCisgICJsbHZtLm1pcHMuc3BsYXQuYiIsCisgICJsbHZtLm1pcHMuc3BsYXQuZCIsCisgICJsbHZtLm1pcHMuc3BsYXQuaCIsCisgICJsbHZtLm1pcHMuc3BsYXQudyIsCisgICJsbHZtLm1pcHMuc3BsYXRpLmIiLAorICAibGx2bS5taXBzLnNwbGF0aS5kIiwKKyAgImxsdm0ubWlwcy5zcGxhdGkuaCIsCisgICJsbHZtLm1pcHMuc3BsYXRpLnciLAorICAibGx2bS5taXBzLnNyYS5iIiwKKyAgImxsdm0ubWlwcy5zcmEuZCIsCisgICJsbHZtLm1pcHMuc3JhLmgiLAorICAibGx2bS5taXBzLnNyYS53IiwKKyAgImxsdm0ubWlwcy5zcmFpLmIiLAorICAibGx2bS5taXBzLnNyYWkuZCIsCisgICJsbHZtLm1pcHMuc3JhaS5oIiwKKyAgImxsdm0ubWlwcy5zcmFpLnciLAorICAibGx2bS5taXBzLnNyYXIuYiIsCisgICJsbHZtLm1pcHMuc3Jhci5kIiwKKyAgImxsdm0ubWlwcy5zcmFyLmgiLAorICAibGx2bS5taXBzLnNyYXIudyIsCisgICJsbHZtLm1pcHMuc3JhcmkuYiIsCisgICJsbHZtLm1pcHMuc3JhcmkuZCIsCisgICJsbHZtLm1pcHMuc3JhcmkuaCIsCisgICJsbHZtLm1pcHMuc3JhcmkudyIsCisgICJsbHZtLm1pcHMuc3JsLmIiLAorICAibGx2bS5taXBzLnNybC5kIiwKKyAgImxsdm0ubWlwcy5zcmwuaCIsCisgICJsbHZtLm1pcHMuc3JsLnciLAorICAibGx2bS5taXBzLnNybGkuYiIsCisgICJsbHZtLm1pcHMuc3JsaS5kIiwKKyAgImxsdm0ubWlwcy5zcmxpLmgiLAorICAibGx2bS5taXBzLnNybGkudyIsCisgICJsbHZtLm1pcHMuc3Jsci5iIiwKKyAgImxsdm0ubWlwcy5zcmxyLmQiLAorICAibGx2bS5taXBzLnNybHIuaCIsCisgICJsbHZtLm1pcHMuc3Jsci53IiwKKyAgImxsdm0ubWlwcy5zcmxyaS5iIiwKKyAgImxsdm0ubWlwcy5zcmxyaS5kIiwKKyAgImxsdm0ubWlwcy5zcmxyaS5oIiwKKyAgImxsdm0ubWlwcy5zcmxyaS53IiwKKyAgImxsdm0ubWlwcy5zdC5iIiwKKyAgImxsdm0ubWlwcy5zdC5kIiwKKyAgImxsdm0ubWlwcy5zdC5oIiwKKyAgImxsdm0ubWlwcy5zdC53IiwKKyAgImxsdm0ubWlwcy5zdWJxLnBoIiwKKyAgImxsdm0ubWlwcy5zdWJxLnMucGgiLAorICAibGx2bS5taXBzLnN1YnEucy53IiwKKyAgImxsdm0ubWlwcy5zdWJxaC5waCIsCisgICJsbHZtLm1pcHMuc3VicWguci5waCIsCisgICJsbHZtLm1pcHMuc3VicWguci53IiwKKyAgImxsdm0ubWlwcy5zdWJxaC53IiwKKyAgImxsdm0ubWlwcy5zdWJzLnMuYiIsCisgICJsbHZtLm1pcHMuc3Vicy5zLmQiLAorICAibGx2bS5taXBzLnN1YnMucy5oIiwKKyAgImxsdm0ubWlwcy5zdWJzLnMudyIsCisgICJsbHZtLm1pcHMuc3Vicy51LmIiLAorICAibGx2bS5taXBzLnN1YnMudS5kIiwKKyAgImxsdm0ubWlwcy5zdWJzLnUuaCIsCisgICJsbHZtLm1pcHMuc3Vicy51LnciLAorICAibGx2bS5taXBzLnN1YnN1cy51LmIiLAorICAibGx2bS5taXBzLnN1YnN1cy51LmQiLAorICAibGx2bS5taXBzLnN1YnN1cy51LmgiLAorICAibGx2bS5taXBzLnN1YnN1cy51LnciLAorICAibGx2bS5taXBzLnN1YnN1dS5zLmIiLAorICAibGx2bS5taXBzLnN1YnN1dS5zLmQiLAorICAibGx2bS5taXBzLnN1YnN1dS5zLmgiLAorICAibGx2bS5taXBzLnN1YnN1dS5zLnciLAorICAibGx2bS5taXBzLnN1YnUucGgiLAorICAibGx2bS5taXBzLnN1YnUucWIiLAorICAibGx2bS5taXBzLnN1YnUucy5waCIsCisgICJsbHZtLm1pcHMuc3VidS5zLnFiIiwKKyAgImxsdm0ubWlwcy5zdWJ1aC5xYiIsCisgICJsbHZtLm1pcHMuc3VidWguci5xYiIsCisgICJsbHZtLm1pcHMuc3Vidi5iIiwKKyAgImxsdm0ubWlwcy5zdWJ2LmQiLAorICAibGx2bS5taXBzLnN1YnYuaCIsCisgICJsbHZtLm1pcHMuc3Vidi53IiwKKyAgImxsdm0ubWlwcy5zdWJ2aS5iIiwKKyAgImxsdm0ubWlwcy5zdWJ2aS5kIiwKKyAgImxsdm0ubWlwcy5zdWJ2aS5oIiwKKyAgImxsdm0ubWlwcy5zdWJ2aS53IiwKKyAgImxsdm0ubWlwcy52c2hmLmIiLAorICAibGx2bS5taXBzLnZzaGYuZCIsCisgICJsbHZtLm1pcHMudnNoZi5oIiwKKyAgImxsdm0ubWlwcy52c2hmLnciLAorICAibGx2bS5taXBzLndyZHNwIiwKKyAgImxsdm0ubWlwcy54b3IudiIsCisgICJsbHZtLm1pcHMueG9yaS5iIiwKKyAgImxsdm0ubnZ2bS5hZGQucm0uZCIsCisgICJsbHZtLm52dm0uYWRkLnJtLmYiLAorICAibGx2bS5udnZtLmFkZC5ybS5mdHouZiIsCisgICJsbHZtLm52dm0uYWRkLnJuLmQiLAorICAibGx2bS5udnZtLmFkZC5ybi5mIiwKKyAgImxsdm0ubnZ2bS5hZGQucm4uZnR6LmYiLAorICAibGx2bS5udnZtLmFkZC5ycC5kIiwKKyAgImxsdm0ubnZ2bS5hZGQucnAuZiIsCisgICJsbHZtLm52dm0uYWRkLnJwLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5hZGQucnouZCIsCisgICJsbHZtLm52dm0uYWRkLnJ6LmYiLAorICAibGx2bS5udnZtLmFkZC5yei5mdHouZiIsCisgICJsbHZtLm52dm0uYXRvbWljLmFkZC5nZW4uZi5jdGEiLAorICAibGx2bS5udnZtLmF0b21pYy5hZGQuZ2VuLmYuc3lzIiwKKyAgImxsdm0ubnZ2bS5hdG9taWMuYWRkLmdlbi5pLmN0YSIsCisgICJsbHZtLm52dm0uYXRvbWljLmFkZC5nZW4uaS5zeXMiLAorICAibGx2bS5udnZtLmF0b21pYy5hbmQuZ2VuLmkuY3RhIiwKKyAgImxsdm0ubnZ2bS5hdG9taWMuYW5kLmdlbi5pLnN5cyIsCisgICJsbHZtLm52dm0uYXRvbWljLmNhcy5nZW4uaS5jdGEiLAorICAibGx2bS5udnZtLmF0b21pYy5jYXMuZ2VuLmkuc3lzIiwKKyAgImxsdm0ubnZ2bS5hdG9taWMuZGVjLmdlbi5pLmN0YSIsCisgICJsbHZtLm52dm0uYXRvbWljLmRlYy5nZW4uaS5zeXMiLAorICAibGx2bS5udnZtLmF0b21pYy5leGNoLmdlbi5pLmN0YSIsCisgICJsbHZtLm52dm0uYXRvbWljLmV4Y2guZ2VuLmkuc3lzIiwKKyAgImxsdm0ubnZ2bS5hdG9taWMuaW5jLmdlbi5pLmN0YSIsCisgICJsbHZtLm52dm0uYXRvbWljLmluYy5nZW4uaS5zeXMiLAorICAibGx2bS5udnZtLmF0b21pYy5sb2FkLmFkZC5mMzIiLAorICAibGx2bS5udnZtLmF0b21pYy5sb2FkLmFkZC5mNjQiLAorICAibGx2bS5udnZtLmF0b21pYy5sb2FkLmRlYy4zMiIsCisgICJsbHZtLm52dm0uYXRvbWljLmxvYWQuaW5jLjMyIiwKKyAgImxsdm0ubnZ2bS5hdG9taWMubWF4Lmdlbi5pLmN0YSIsCisgICJsbHZtLm52dm0uYXRvbWljLm1heC5nZW4uaS5zeXMiLAorICAibGx2bS5udnZtLmF0b21pYy5taW4uZ2VuLmkuY3RhIiwKKyAgImxsdm0ubnZ2bS5hdG9taWMubWluLmdlbi5pLnN5cyIsCisgICJsbHZtLm52dm0uYXRvbWljLm9yLmdlbi5pLmN0YSIsCisgICJsbHZtLm52dm0uYXRvbWljLm9yLmdlbi5pLnN5cyIsCisgICJsbHZtLm52dm0uYXRvbWljLnhvci5nZW4uaS5jdGEiLAorICAibGx2bS5udnZtLmF0b21pYy54b3IuZ2VuLmkuc3lzIiwKKyAgImxsdm0ubnZ2bS5iYXIuc3luYyIsCisgICJsbHZtLm52dm0uYmFyLndhcnAuc3luYyIsCisgICJsbHZtLm52dm0uYmFycmllciIsCisgICJsbHZtLm52dm0uYmFycmllci5uIiwKKyAgImxsdm0ubnZ2bS5iYXJyaWVyLnN5bmMiLAorICAibGx2bS5udnZtLmJhcnJpZXIuc3luYy5jbnQiLAorICAibGx2bS5udnZtLmJhcnJpZXIwIiwKKyAgImxsdm0ubnZ2bS5iYXJyaWVyMC5hbmQiLAorICAibGx2bS5udnZtLmJhcnJpZXIwLm9yIiwKKyAgImxsdm0ubnZ2bS5iYXJyaWVyMC5wb3BjIiwKKyAgImxsdm0ubnZ2bS5iaXRjYXN0LmQybGwiLAorICAibGx2bS5udnZtLmJpdGNhc3QuZjJpIiwKKyAgImxsdm0ubnZ2bS5iaXRjYXN0LmkyZiIsCisgICJsbHZtLm52dm0uYml0Y2FzdC5sbDJkIiwKKyAgImxsdm0ubnZ2bS5jZWlsLmQiLAorICAibGx2bS5udnZtLmNlaWwuZiIsCisgICJsbHZtLm52dm0uY2VpbC5mdHouZiIsCisgICJsbHZtLm52dm0uY29tcGlsZXIuZXJyb3IiLAorICAibGx2bS5udnZtLmNvbXBpbGVyLndhcm4iLAorICAibGx2bS5udnZtLmNvcy5hcHByb3guZiIsCisgICJsbHZtLm52dm0uY29zLmFwcHJveC5mdHouZiIsCisgICJsbHZtLm52dm0uZDJmLnJtIiwKKyAgImxsdm0ubnZ2bS5kMmYucm0uZnR6IiwKKyAgImxsdm0ubnZ2bS5kMmYucm4iLAorICAibGx2bS5udnZtLmQyZi5ybi5mdHoiLAorICAibGx2bS5udnZtLmQyZi5ycCIsCisgICJsbHZtLm52dm0uZDJmLnJwLmZ0eiIsCisgICJsbHZtLm52dm0uZDJmLnJ6IiwKKyAgImxsdm0ubnZ2bS5kMmYucnouZnR6IiwKKyAgImxsdm0ubnZ2bS5kMmkuaGkiLAorICAibGx2bS5udnZtLmQyaS5sbyIsCisgICJsbHZtLm52dm0uZDJpLnJtIiwKKyAgImxsdm0ubnZ2bS5kMmkucm4iLAorICAibGx2bS5udnZtLmQyaS5ycCIsCisgICJsbHZtLm52dm0uZDJpLnJ6IiwKKyAgImxsdm0ubnZ2bS5kMmxsLnJtIiwKKyAgImxsdm0ubnZ2bS5kMmxsLnJuIiwKKyAgImxsdm0ubnZ2bS5kMmxsLnJwIiwKKyAgImxsdm0ubnZ2bS5kMmxsLnJ6IiwKKyAgImxsdm0ubnZ2bS5kMnVpLnJtIiwKKyAgImxsdm0ubnZ2bS5kMnVpLnJuIiwKKyAgImxsdm0ubnZ2bS5kMnVpLnJwIiwKKyAgImxsdm0ubnZ2bS5kMnVpLnJ6IiwKKyAgImxsdm0ubnZ2bS5kMnVsbC5ybSIsCisgICJsbHZtLm52dm0uZDJ1bGwucm4iLAorICAibGx2bS5udnZtLmQydWxsLnJwIiwKKyAgImxsdm0ubnZ2bS5kMnVsbC5yeiIsCisgICJsbHZtLm52dm0uZGl2LmFwcHJveC5mIiwKKyAgImxsdm0ubnZ2bS5kaXYuYXBwcm94LmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5kaXYucm0uZCIsCisgICJsbHZtLm52dm0uZGl2LnJtLmYiLAorICAibGx2bS5udnZtLmRpdi5ybS5mdHouZiIsCisgICJsbHZtLm52dm0uZGl2LnJuLmQiLAorICAibGx2bS5udnZtLmRpdi5ybi5mIiwKKyAgImxsdm0ubnZ2bS5kaXYucm4uZnR6LmYiLAorICAibGx2bS5udnZtLmRpdi5ycC5kIiwKKyAgImxsdm0ubnZ2bS5kaXYucnAuZiIsCisgICJsbHZtLm52dm0uZGl2LnJwLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5kaXYucnouZCIsCisgICJsbHZtLm52dm0uZGl2LnJ6LmYiLAorICAibGx2bS5udnZtLmRpdi5yei5mdHouZiIsCisgICJsbHZtLm52dm0uZXgyLmFwcHJveC5kIiwKKyAgImxsdm0ubnZ2bS5leDIuYXBwcm94LmYiLAorICAibGx2bS5udnZtLmV4Mi5hcHByb3guZnR6LmYiLAorICAibGx2bS5udnZtLmYyaC5ybiIsCisgICJsbHZtLm52dm0uZjJoLnJuLmZ0eiIsCisgICJsbHZtLm52dm0uZjJpLnJtIiwKKyAgImxsdm0ubnZ2bS5mMmkucm0uZnR6IiwKKyAgImxsdm0ubnZ2bS5mMmkucm4iLAorICAibGx2bS5udnZtLmYyaS5ybi5mdHoiLAorICAibGx2bS5udnZtLmYyaS5ycCIsCisgICJsbHZtLm52dm0uZjJpLnJwLmZ0eiIsCisgICJsbHZtLm52dm0uZjJpLnJ6IiwKKyAgImxsdm0ubnZ2bS5mMmkucnouZnR6IiwKKyAgImxsdm0ubnZ2bS5mMmxsLnJtIiwKKyAgImxsdm0ubnZ2bS5mMmxsLnJtLmZ0eiIsCisgICJsbHZtLm52dm0uZjJsbC5ybiIsCisgICJsbHZtLm52dm0uZjJsbC5ybi5mdHoiLAorICAibGx2bS5udnZtLmYybGwucnAiLAorICAibGx2bS5udnZtLmYybGwucnAuZnR6IiwKKyAgImxsdm0ubnZ2bS5mMmxsLnJ6IiwKKyAgImxsdm0ubnZ2bS5mMmxsLnJ6LmZ0eiIsCisgICJsbHZtLm52dm0uZjJ1aS5ybSIsCisgICJsbHZtLm52dm0uZjJ1aS5ybS5mdHoiLAorICAibGx2bS5udnZtLmYydWkucm4iLAorICAibGx2bS5udnZtLmYydWkucm4uZnR6IiwKKyAgImxsdm0ubnZ2bS5mMnVpLnJwIiwKKyAgImxsdm0ubnZ2bS5mMnVpLnJwLmZ0eiIsCisgICJsbHZtLm52dm0uZjJ1aS5yeiIsCisgICJsbHZtLm52dm0uZjJ1aS5yei5mdHoiLAorICAibGx2bS5udnZtLmYydWxsLnJtIiwKKyAgImxsdm0ubnZ2bS5mMnVsbC5ybS5mdHoiLAorICAibGx2bS5udnZtLmYydWxsLnJuIiwKKyAgImxsdm0ubnZ2bS5mMnVsbC5ybi5mdHoiLAorICAibGx2bS5udnZtLmYydWxsLnJwIiwKKyAgImxsdm0ubnZ2bS5mMnVsbC5ycC5mdHoiLAorICAibGx2bS5udnZtLmYydWxsLnJ6IiwKKyAgImxsdm0ubnZ2bS5mMnVsbC5yei5mdHoiLAorICAibGx2bS5udnZtLmZhYnMuZCIsCisgICJsbHZtLm52dm0uZmFicy5mIiwKKyAgImxsdm0ubnZ2bS5mYWJzLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5mbG9vci5kIiwKKyAgImxsdm0ubnZ2bS5mbG9vci5mIiwKKyAgImxsdm0ubnZ2bS5mbG9vci5mdHouZiIsCisgICJsbHZtLm52dm0uZm1hLnJtLmQiLAorICAibGx2bS5udnZtLmZtYS5ybS5mIiwKKyAgImxsdm0ubnZ2bS5mbWEucm0uZnR6LmYiLAorICAibGx2bS5udnZtLmZtYS5ybi5kIiwKKyAgImxsdm0ubnZ2bS5mbWEucm4uZiIsCisgICJsbHZtLm52dm0uZm1hLnJuLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5mbWEucnAuZCIsCisgICJsbHZtLm52dm0uZm1hLnJwLmYiLAorICAibGx2bS5udnZtLmZtYS5ycC5mdHouZiIsCisgICJsbHZtLm52dm0uZm1hLnJ6LmQiLAorICAibGx2bS5udnZtLmZtYS5yei5mIiwKKyAgImxsdm0ubnZ2bS5mbWEucnouZnR6LmYiLAorICAibGx2bS5udnZtLmZtYXguZCIsCisgICJsbHZtLm52dm0uZm1heC5mIiwKKyAgImxsdm0ubnZ2bS5mbWF4LmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5mbWluLmQiLAorICAibGx2bS5udnZtLmZtaW4uZiIsCisgICJsbHZtLm52dm0uZm1pbi5mdHouZiIsCisgICJsbHZtLm52dm0uZm5zIiwKKyAgImxsdm0ubnZ2bS5pMmQucm0iLAorICAibGx2bS5udnZtLmkyZC5ybiIsCisgICJsbHZtLm52dm0uaTJkLnJwIiwKKyAgImxsdm0ubnZ2bS5pMmQucnoiLAorICAibGx2bS5udnZtLmkyZi5ybSIsCisgICJsbHZtLm52dm0uaTJmLnJuIiwKKyAgImxsdm0ubnZ2bS5pMmYucnAiLAorICAibGx2bS5udnZtLmkyZi5yeiIsCisgICJsbHZtLm52dm0uaXNzcGFjZXAuY29uc3QiLAorICAibGx2bS5udnZtLmlzc3BhY2VwLmdsb2JhbCIsCisgICJsbHZtLm52dm0uaXNzcGFjZXAubG9jYWwiLAorICAibGx2bS5udnZtLmlzc3BhY2VwLnNoYXJlZCIsCisgICJsbHZtLm52dm0uaXN0eXBlcC5zYW1wbGVyIiwKKyAgImxsdm0ubnZ2bS5pc3R5cGVwLnN1cmZhY2UiLAorICAibGx2bS5udnZtLmlzdHlwZXAudGV4dHVyZSIsCisgICJsbHZtLm52dm0ubGRnLmdsb2JhbC5mIiwKKyAgImxsdm0ubnZ2bS5sZGcuZ2xvYmFsLmkiLAorICAibGx2bS5udnZtLmxkZy5nbG9iYWwucCIsCisgICJsbHZtLm52dm0ubGR1Lmdsb2JhbC5mIiwKKyAgImxsdm0ubnZ2bS5sZHUuZ2xvYmFsLmkiLAorICAibGx2bS5udnZtLmxkdS5nbG9iYWwucCIsCisgICJsbHZtLm52dm0ubGcyLmFwcHJveC5kIiwKKyAgImxsdm0ubnZ2bS5sZzIuYXBwcm94LmYiLAorICAibGx2bS5udnZtLmxnMi5hcHByb3guZnR6LmYiLAorICAibGx2bS5udnZtLmxsMmQucm0iLAorICAibGx2bS5udnZtLmxsMmQucm4iLAorICAibGx2bS5udnZtLmxsMmQucnAiLAorICAibGx2bS5udnZtLmxsMmQucnoiLAorICAibGx2bS5udnZtLmxsMmYucm0iLAorICAibGx2bS5udnZtLmxsMmYucm4iLAorICAibGx2bS5udnZtLmxsMmYucnAiLAorICAibGx2bS5udnZtLmxsMmYucnoiLAorICAibGx2bS5udnZtLmxvaGkuaTJkIiwKKyAgImxsdm0ubnZ2bS5tYXRjaC5hbGwuc3luYy5pMzJwIiwKKyAgImxsdm0ubnZ2bS5tYXRjaC5hbGwuc3luYy5pNjRwIiwKKyAgImxsdm0ubnZ2bS5tYXRjaC5hbnkuc3luYy5pMzIiLAorICAibGx2bS5udnZtLm1hdGNoLmFueS5zeW5jLmk2NCIsCisgICJsbHZtLm52dm0ubWVtYmFyLmN0YSIsCisgICJsbHZtLm52dm0ubWVtYmFyLmdsIiwKKyAgImxsdm0ubnZ2bS5tZW1iYXIuc3lzIiwKKyAgImxsdm0ubnZ2bS5tb3ZlLmRvdWJsZSIsCisgICJsbHZtLm52dm0ubW92ZS5mbG9hdCIsCisgICJsbHZtLm52dm0ubW92ZS5pMTYiLAorICAibGx2bS5udnZtLm1vdmUuaTMyIiwKKyAgImxsdm0ubnZ2bS5tb3ZlLmk2NCIsCisgICJsbHZtLm52dm0ubW92ZS5wdHIiLAorICAibGx2bS5udnZtLm11bC5ybS5kIiwKKyAgImxsdm0ubnZ2bS5tdWwucm0uZiIsCisgICJsbHZtLm52dm0ubXVsLnJtLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5tdWwucm4uZCIsCisgICJsbHZtLm52dm0ubXVsLnJuLmYiLAorICAibGx2bS5udnZtLm11bC5ybi5mdHouZiIsCisgICJsbHZtLm52dm0ubXVsLnJwLmQiLAorICAibGx2bS5udnZtLm11bC5ycC5mIiwKKyAgImxsdm0ubnZ2bS5tdWwucnAuZnR6LmYiLAorICAibGx2bS5udnZtLm11bC5yei5kIiwKKyAgImxsdm0ubnZ2bS5tdWwucnouZiIsCisgICJsbHZtLm52dm0ubXVsLnJ6LmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5tdWwyNC5pIiwKKyAgImxsdm0ubnZ2bS5tdWwyNC51aSIsCisgICJsbHZtLm52dm0ubXVsaGkuaSIsCisgICJsbHZtLm52dm0ubXVsaGkubGwiLAorICAibGx2bS5udnZtLm11bGhpLnVpIiwKKyAgImxsdm0ubnZ2bS5tdWxoaS51bGwiLAorICAibGx2bS5udnZtLnBybXQiLAorICAibGx2bS5udnZtLnB0ci5jb25zdGFudC50by5nZW4iLAorICAibGx2bS5udnZtLnB0ci5nZW4udG8uY29uc3RhbnQiLAorICAibGx2bS5udnZtLnB0ci5nZW4udG8uZ2xvYmFsIiwKKyAgImxsdm0ubnZ2bS5wdHIuZ2VuLnRvLmxvY2FsIiwKKyAgImxsdm0ubnZ2bS5wdHIuZ2VuLnRvLnBhcmFtIiwKKyAgImxsdm0ubnZ2bS5wdHIuZ2VuLnRvLnNoYXJlZCIsCisgICJsbHZtLm52dm0ucHRyLmdsb2JhbC50by5nZW4iLAorICAibGx2bS5udnZtLnB0ci5sb2NhbC50by5nZW4iLAorICAibGx2bS5udnZtLnB0ci5zaGFyZWQudG8uZ2VuIiwKKyAgImxsdm0ubnZ2bS5yY3AuYXBwcm94LmZ0ei5kIiwKKyAgImxsdm0ubnZ2bS5yY3Aucm0uZCIsCisgICJsbHZtLm52dm0ucmNwLnJtLmYiLAorICAibGx2bS5udnZtLnJjcC5ybS5mdHouZiIsCisgICJsbHZtLm52dm0ucmNwLnJuLmQiLAorICAibGx2bS5udnZtLnJjcC5ybi5mIiwKKyAgImxsdm0ubnZ2bS5yY3Aucm4uZnR6LmYiLAorICAibGx2bS5udnZtLnJjcC5ycC5kIiwKKyAgImxsdm0ubnZ2bS5yY3AucnAuZiIsCisgICJsbHZtLm52dm0ucmNwLnJwLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5yY3AucnouZCIsCisgICJsbHZtLm52dm0ucmNwLnJ6LmYiLAorICAibGx2bS5udnZtLnJjcC5yei5mdHouZiIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5jbG9jayIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5jbG9jazY0IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmN0YWlkLnciLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuY3RhaWQueCIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5jdGFpZC55IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmN0YWlkLnoiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMCIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzEwIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzExIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzEyIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzEzIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzE0IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzE1IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzE2IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzE3IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzE4IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzE5IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzIiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjAiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjEiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjIiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjMiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjQiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjUiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjYiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjciLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjgiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjkiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMyIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWczMCIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWczMSIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc0IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzUiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnNiIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc3IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzgiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnOSIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5ncmlkaWQiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcubGFuZWlkIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmxhbmVtYXNrLmVxIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmxhbmVtYXNrLmdlIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmxhbmVtYXNrLmd0IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmxhbmVtYXNrLmxlIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmxhbmVtYXNrLmx0IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLm5jdGFpZC53IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLm5jdGFpZC54IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLm5jdGFpZC55IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLm5jdGFpZC56IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLm5zbWlkIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLm50aWQudyIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5udGlkLngiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcubnRpZC55IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLm50aWQueiIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5ud2FycGlkIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnBtMCIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5wbTEiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcucG0yIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnBtMyIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5zbWlkIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnRpZC53IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnRpZC54IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnRpZC55IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnRpZC56IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLndhcnBpZCIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy53YXJwc2l6ZSIsCisgICJsbHZtLm52dm0ucmVmbGVjdCIsCisgICJsbHZtLm52dm0ucm90YXRlLmIzMiIsCisgICJsbHZtLm52dm0ucm90YXRlLmI2NCIsCisgICJsbHZtLm52dm0ucm90YXRlLnJpZ2h0LmI2NCIsCisgICJsbHZtLm52dm0ucm91bmQuZCIsCisgICJsbHZtLm52dm0ucm91bmQuZiIsCisgICJsbHZtLm52dm0ucm91bmQuZnR6LmYiLAorICAibGx2bS5udnZtLnJzcXJ0LmFwcHJveC5kIiwKKyAgImxsdm0ubnZ2bS5yc3FydC5hcHByb3guZiIsCisgICJsbHZtLm52dm0ucnNxcnQuYXBwcm94LmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5zYWQuaSIsCisgICJsbHZtLm52dm0uc2FkLnVpIiwKKyAgImxsdm0ubnZ2bS5zYXR1cmF0ZS5kIiwKKyAgImxsdm0ubnZ2bS5zYXR1cmF0ZS5mIiwKKyAgImxsdm0ubnZ2bS5zYXR1cmF0ZS5mdHouZiIsCisgICJsbHZtLm52dm0uc2hmbC5iZmx5LmYzMiIsCisgICJsbHZtLm52dm0uc2hmbC5iZmx5LmkzMiIsCisgICJsbHZtLm52dm0uc2hmbC5kb3duLmYzMiIsCisgICJsbHZtLm52dm0uc2hmbC5kb3duLmkzMiIsCisgICJsbHZtLm52dm0uc2hmbC5pZHguZjMyIiwKKyAgImxsdm0ubnZ2bS5zaGZsLmlkeC5pMzIiLAorICAibGx2bS5udnZtLnNoZmwuc3luYy5iZmx5LmYzMiIsCisgICJsbHZtLm52dm0uc2hmbC5zeW5jLmJmbHkuaTMyIiwKKyAgImxsdm0ubnZ2bS5zaGZsLnN5bmMuZG93bi5mMzIiLAorICAibGx2bS5udnZtLnNoZmwuc3luYy5kb3duLmkzMiIsCisgICJsbHZtLm52dm0uc2hmbC5zeW5jLmlkeC5mMzIiLAorICAibGx2bS5udnZtLnNoZmwuc3luYy5pZHguaTMyIiwKKyAgImxsdm0ubnZ2bS5zaGZsLnN5bmMudXAuZjMyIiwKKyAgImxsdm0ubnZ2bS5zaGZsLnN5bmMudXAuaTMyIiwKKyAgImxsdm0ubnZ2bS5zaGZsLnVwLmYzMiIsCisgICJsbHZtLm52dm0uc2hmbC51cC5pMzIiLAorICAibGx2bS5udnZtLnNpbi5hcHByb3guZiIsCisgICJsbHZtLm52dm0uc2luLmFwcHJveC5mdHouZiIsCisgICJsbHZtLm52dm0uc3FydC5hcHByb3guZiIsCisgICJsbHZtLm52dm0uc3FydC5hcHByb3guZnR6LmYiLAorICAibGx2bS5udnZtLnNxcnQuZiIsCisgICJsbHZtLm52dm0uc3FydC5ybS5kIiwKKyAgImxsdm0ubnZ2bS5zcXJ0LnJtLmYiLAorICAibGx2bS5udnZtLnNxcnQucm0uZnR6LmYiLAorICAibGx2bS5udnZtLnNxcnQucm4uZCIsCisgICJsbHZtLm52dm0uc3FydC5ybi5mIiwKKyAgImxsdm0ubnZ2bS5zcXJ0LnJuLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5zcXJ0LnJwLmQiLAorICAibGx2bS5udnZtLnNxcnQucnAuZiIsCisgICJsbHZtLm52dm0uc3FydC5ycC5mdHouZiIsCisgICJsbHZtLm52dm0uc3FydC5yei5kIiwKKyAgImxsdm0ubnZ2bS5zcXJ0LnJ6LmYiLAorICAibGx2bS5udnZtLnNxcnQucnouZnR6LmYiLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LmkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LmkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pNjQuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTY0LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTY0Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52MmkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52MmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpNjQuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpNjQudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52Mmk2NC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTguemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTguemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5pMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuaTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMWQuaTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmk2NC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5pNjQudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5pNjQuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5pOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5pOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMWQudjJpMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQudjJpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC52MmkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLnYyaTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLnYyaTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQudjJpMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4xZC52Mmk2NC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC52Mmk2NC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLnYyaTY0Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMWQudjJpOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC52Mmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQudjJpOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLnY0aTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLnY0aTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQudjRpMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4xZC52NGkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC52NGkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLnY0aTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMWQudjRpOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC52NGk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQudjRpOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LmkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTY0LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5Lmk2NC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5Lmk2NC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5Lmk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5Lmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTguemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52MmkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52MmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52MmkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTY0LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTY0LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpNjQuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52Mmk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52Mmk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMmQuaTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5pMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5pMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5pNjQuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuaTY0LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuaTY0Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMmQuaTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5pOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLnYyaTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLnYyaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQudjJpMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4yZC52MmkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC52MmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLnYyaTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMmQudjJpNjQuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQudjJpNjQudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC52Mmk2NC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLnYyaTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQudjJpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLnYyaTguemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4yZC52NGkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC52NGkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLnY0aTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMmQudjRpMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQudjRpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC52NGkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLnY0aTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQudjRpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLnY0aTguemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4zZC5pMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuM2QuaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuM2QuaTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuM2QuaTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLmkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLmk2NC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4zZC5pNjQudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4zZC5pNjQuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4zZC5pOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4zZC5pOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLmk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuM2QudjJpMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuM2QudjJpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4zZC52MmkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLnYyaTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLnYyaTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuM2QudjJpMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4zZC52Mmk2NC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4zZC52Mmk2NC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLnYyaTY0Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuM2QudjJpOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4zZC52Mmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuM2QudjJpOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLnY0aTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLnY0aTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuM2QudjRpMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4zZC52NGkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4zZC52NGkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLnY0aTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuM2QudjRpOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4zZC52NGk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuM2QudjRpOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXEuYXJyYXkuc2l6ZSIsCisgICJsbHZtLm52dm0uc3VxLmNoYW5uZWwuZGF0YS50eXBlIiwKKyAgImxsdm0ubnZ2bS5zdXEuY2hhbm5lbC5vcmRlciIsCisgICJsbHZtLm52dm0uc3VxLmRlcHRoIiwKKyAgImxsdm0ubnZ2bS5zdXEuaGVpZ2h0IiwKKyAgImxsdm0ubnZ2bS5zdXEud2lkdGgiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5Lmk2NC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5Lmk2NC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTY0Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5Lmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52MmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52Mmk2NC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTY0LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52Mmk2NC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTguemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTguemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuaTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5pMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5pMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuaTY0LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuaTY0LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5pNjQuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC52MmkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC52MmkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC52MmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTY0LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpNjQudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTY0Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC52Mmk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC52NGkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC52NGk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LmkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pNjQuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pNjQudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5Lmk2NC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTguemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52MmkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52MmkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpNjQuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk2NC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpNjQuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5pMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5pMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuaTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuaTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5pMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmk2NC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmk2NC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuaTY0Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5pOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5pOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC52MmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC52Mmk2NC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTY0LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC52Mmk2NC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTguemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC52NGkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC52NGkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTguemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLmkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QuaTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC5pMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC5pMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLmkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QuaTY0LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QuaTY0LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC5pNjQuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLmk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QuaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLmk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC52MmkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC52MmkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC52MmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTY0LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpNjQudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTY0Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC52Mmk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC52NGkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC52NGk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkuaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS5pMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5Lmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS52MmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjJpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LnYyaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LnY0aTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS52NGkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjRpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMWQuaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4xZC5pMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjFkLmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4xZC52MmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMWQudjJpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjFkLnYyaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjFkLnY0aTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4xZC52NGkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMWQudjRpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkuaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS5pMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5Lmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS52MmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjJpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LnYyaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LnY0aTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS52NGkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjRpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMmQuaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4yZC5pMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjJkLmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4yZC52MmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMmQudjJpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjJkLnYyaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjJkLnY0aTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4yZC52NGkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMmQudjRpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuM2QuaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4zZC5pMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjNkLmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4zZC52MmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuM2QudjJpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjNkLnYyaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjNkLnY0aTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4zZC52NGkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuM2QudjRpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zd2FwLmxvLmhpLmI2NCIsCisgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LmdyYWQudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkuZ3JhZC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC4xZC5hcnJheS5ncmFkLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LmxldmVsLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LmxldmVsLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LmxldmVsLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LnY0ZjMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LnY0czMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LnY0dTMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLmdyYWQudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQuZ3JhZC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC4xZC5ncmFkLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLmxldmVsLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLmxldmVsLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLmxldmVsLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLnY0ZjMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLnY0czMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLnY0dTMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LmdyYWQudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkuZ3JhZC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC4yZC5hcnJheS5ncmFkLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LmxldmVsLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LmxldmVsLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LmxldmVsLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LnY0ZjMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LnY0czMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LnY0dTMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLmdyYWQudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQuZ3JhZC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC4yZC5ncmFkLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLmxldmVsLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLmxldmVsLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLmxldmVsLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLnY0ZjMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLnY0czMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLnY0dTMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LjNkLmdyYWQudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguM2QuZ3JhZC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC4zZC5ncmFkLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjNkLmxldmVsLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjNkLmxldmVsLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjNkLmxldmVsLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjNkLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjNkLnY0ZjMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LjNkLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjNkLnY0czMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LjNkLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjNkLnY0dTMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LmN1YmUuYXJyYXkubGV2ZWwudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguY3ViZS5hcnJheS5sZXZlbC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC5jdWJlLmFycmF5LmxldmVsLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LmN1YmUuYXJyYXkudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguY3ViZS5hcnJheS52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC5jdWJlLmFycmF5LnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LmN1YmUubGV2ZWwudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguY3ViZS5sZXZlbC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC5jdWJlLmxldmVsLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LmN1YmUudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguY3ViZS52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC5jdWJlLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkuZ3JhZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LmdyYWQudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS5ncmFkLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkubGV2ZWwudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS5sZXZlbC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LmxldmVsLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS52NGYzMi5zMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkudjRzMzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS52NHUzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LnY0dTMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuZ3JhZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmdyYWQudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5ncmFkLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQubGV2ZWwudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5sZXZlbC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmxldmVsLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC52NGYzMi5zMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQudjRzMzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC52NHUzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLnY0dTMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkuZ3JhZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LmdyYWQudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS5ncmFkLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkubGV2ZWwudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS5sZXZlbC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LmxldmVsLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS52NGYzMi5zMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkudjRzMzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS52NHUzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LnY0dTMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuZ3JhZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmdyYWQudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5ncmFkLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQubGV2ZWwudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5sZXZlbC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmxldmVsLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC52NGYzMi5zMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQudjRzMzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC52NHUzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0dTMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QuZ3JhZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmdyYWQudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC5ncmFkLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QubGV2ZWwudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC5sZXZlbC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmxldmVsLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC52NGYzMi5zMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjNkLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QudjRzMzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC52NHUzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjNkLnY0dTMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS5sZXZlbC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUuYXJyYXkubGV2ZWwudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLmFycmF5LmxldmVsLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUuYXJyYXkudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLmFycmF5LnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5sZXZlbC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUubGV2ZWwudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLmxldmVsLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4c3VyZi5oYW5kbGUiLAorICAibGx2bS5udnZtLnRleHN1cmYuaGFuZGxlLmludGVybmFsIiwKKyAgImxsdm0ubnZ2bS50bGQ0LmEuMmQudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LmEuMmQudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LmEuMmQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LmIuMmQudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LmIuMmQudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LmIuMmQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LmcuMmQudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LmcuMmQudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LmcuMmQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LnIuMmQudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LnIuMmQudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LnIuMmQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuYS4yZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQudW5pZmllZC5hLjJkLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGxkNC51bmlmaWVkLmEuMmQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuYi4yZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQudW5pZmllZC5iLjJkLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGxkNC51bmlmaWVkLmIuMmQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuZy4yZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQudW5pZmllZC5nLjJkLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGxkNC51bmlmaWVkLmcuMmQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuci4yZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQudW5pZmllZC5yLjJkLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGxkNC51bmlmaWVkLnIuMmQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50cnVuYy5kIiwKKyAgImxsdm0ubnZ2bS50cnVuYy5mIiwKKyAgImxsdm0ubnZ2bS50cnVuYy5mdHouZiIsCisgICJsbHZtLm52dm0udHhxLmFycmF5LnNpemUiLAorICAibGx2bS5udnZtLnR4cS5jaGFubmVsLmRhdGEudHlwZSIsCisgICJsbHZtLm52dm0udHhxLmNoYW5uZWwub3JkZXIiLAorICAibGx2bS5udnZtLnR4cS5kZXB0aCIsCisgICJsbHZtLm52dm0udHhxLmhlaWdodCIsCisgICJsbHZtLm52dm0udHhxLm51bS5taXBtYXAubGV2ZWxzIiwKKyAgImxsdm0ubnZ2bS50eHEubnVtLnNhbXBsZXMiLAorICAibGx2bS5udnZtLnR4cS53aWR0aCIsCisgICJsbHZtLm52dm0udWkyZC5ybSIsCisgICJsbHZtLm52dm0udWkyZC5ybiIsCisgICJsbHZtLm52dm0udWkyZC5ycCIsCisgICJsbHZtLm52dm0udWkyZC5yeiIsCisgICJsbHZtLm52dm0udWkyZi5ybSIsCisgICJsbHZtLm52dm0udWkyZi5ybiIsCisgICJsbHZtLm52dm0udWkyZi5ycCIsCisgICJsbHZtLm52dm0udWkyZi5yeiIsCisgICJsbHZtLm52dm0udWxsMmQucm0iLAorICAibGx2bS5udnZtLnVsbDJkLnJuIiwKKyAgImxsdm0ubnZ2bS51bGwyZC5ycCIsCisgICJsbHZtLm52dm0udWxsMmQucnoiLAorICAibGx2bS5udnZtLnVsbDJmLnJtIiwKKyAgImxsdm0ubnZ2bS51bGwyZi5ybiIsCisgICJsbHZtLm52dm0udWxsMmYucnAiLAorICAibGx2bS5udnZtLnVsbDJmLnJ6IiwKKyAgImxsdm0ubnZ2bS52b3RlLmFsbCIsCisgICJsbHZtLm52dm0udm90ZS5hbGwuc3luYyIsCisgICJsbHZtLm52dm0udm90ZS5hbnkiLAorICAibGx2bS5udnZtLnZvdGUuYW55LnN5bmMiLAorICAibGx2bS5udnZtLnZvdGUuYmFsbG90IiwKKyAgImxsdm0ubnZ2bS52b3RlLmJhbGxvdC5zeW5jIiwKKyAgImxsdm0ubnZ2bS52b3RlLnVuaSIsCisgICJsbHZtLm52dm0udm90ZS51bmkuc3luYyIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5hLmNvbC5mMTYiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYS5jb2wuc3RyaWRlLmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5hLnJvdy5mMTYiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYS5yb3cuc3RyaWRlLmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5iLmNvbC5mMTYiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYi5jb2wuc3RyaWRlLmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5iLnJvdy5mMTYiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYi5yb3cuc3RyaWRlLmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5jLmNvbC5mMTYiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYy5jb2wuZjMyIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmMuY29sLnN0cmlkZS5mMTYiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYy5jb2wuc3RyaWRlLmYzMiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5jLnJvdy5mMTYiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYy5yb3cuZjMyIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmMucm93LnN0cmlkZS5mMTYiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYy5yb3cuc3RyaWRlLmYzMiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5jb2wuZjE2LmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5jb2wuZjE2LmYxNi5zYXRmaW5pdGUiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wuY29sLmYxNi5mMzIiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wuY29sLmYxNi5mMzIuc2F0ZmluaXRlIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLmNvbC5mMzIuZjE2IiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLmNvbC5mMzIuZjE2LnNhdGZpbml0ZSIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5jb2wuZjMyLmYzMiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5jb2wuZjMyLmYzMi5zYXRmaW5pdGUiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wucm93LmYxNi5mMTYiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wucm93LmYxNi5mMTYuc2F0ZmluaXRlIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLnJvdy5mMTYuZjMyIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLnJvdy5mMTYuZjMyLnNhdGZpbml0ZSIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5yb3cuZjMyLmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5yb3cuZjMyLmYxNi5zYXRmaW5pdGUiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wucm93LmYzMi5mMzIiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wucm93LmYzMi5mMzIuc2F0ZmluaXRlIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMTYuZjE2IiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMTYuZjE2LnNhdGZpbml0ZSIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5jb2wuZjE2LmYzMiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5jb2wuZjE2LmYzMi5zYXRmaW5pdGUiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cuY29sLmYzMi5mMTYiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cuY29sLmYzMi5mMTYuc2F0ZmluaXRlIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMzIuZjMyLnNhdGZpbml0ZSIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5yb3cuZjE2LmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5yb3cuZjE2LmYxNi5zYXRmaW5pdGUiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cucm93LmYxNi5mMzIiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cucm93LmYxNi5mMzIuc2F0ZmluaXRlIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LnJvdy5mMzIuZjE2IiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LnJvdy5mMzIuZjE2LnNhdGZpbml0ZSIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5yb3cuZjMyLmYzMiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5yb3cuZjMyLmYzMi5zYXRmaW5pdGUiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2LnN0b3JlLmQuY29sLmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYuc3RvcmUuZC5jb2wuZjMyIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5zdG9yZS5kLmNvbC5zdHJpZGUuZjE2IiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5zdG9yZS5kLmNvbC5zdHJpZGUuZjMyIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5zdG9yZS5kLnJvdy5mMTYiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2LnN0b3JlLmQucm93LmYzMiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYuc3RvcmUuZC5yb3cuc3RyaWRlLmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYuc3RvcmUuZC5yb3cuc3RyaWRlLmYzMiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52Y2lwaGVyIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZjaXBoZXJsYXN0IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZuY2lwaGVyIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZuY2lwaGVybGFzdCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52cGVybXhvciIsCisgICJsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52cG1zdW1iIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZwbXN1bWQiLAorICAibGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udnBtc3VtaCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52cG1zdW13IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZzYm94IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZzaGFzaWdtYWQiLAorICAibGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udnNoYXNpZ21hdyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLmRzcyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLmRzc2FsbCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLmRzdCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLmRzdHN0IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuZHN0c3R0IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuZHN0dCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLmx2ZWJ4IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMubHZlaHgiLAorICAibGx2bS5wcGMuYWx0aXZlYy5sdmV3eCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLmx2c2wiLAorICAibGx2bS5wcGMuYWx0aXZlYy5sdnNyIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMubHZ4IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMubHZ4bCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLm1mdnNjciIsCisgICJsbHZtLnBwYy5hbHRpdmVjLm10dnNjciIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnN0dmVieCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnN0dmVoeCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnN0dmV3eCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnN0dngiLAorICAibGx2bS5wcGMuYWx0aXZlYy5zdHZ4bCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZhYnNkdWIiLAorICAibGx2bS5wcGMuYWx0aXZlYy52YWJzZHVoIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmFic2R1dyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZhZGRjdXEiLAorICAibGx2bS5wcGMuYWx0aXZlYy52YWRkY3V3IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmFkZGVjdXEiLAorICAibGx2bS5wcGMuYWx0aXZlYy52YWRkZXVxbSIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZhZGRzYnMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52YWRkc2hzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmFkZHN3cyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZhZGR1YnMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52YWRkdWhzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmFkZHV3cyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZhdmdzYiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZhdmdzaCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZhdmdzdyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZhdmd1YiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZhdmd1aCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZhdmd1dyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZicGVybXEiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y2ZzeCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjZnV4IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNsemxzYmIiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wYmZwIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcGJmcC5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcGVxZnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZXFmcC5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcGVxdWIiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1Yi5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcGVxdWQiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1ZC5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcGVxdWgiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1aC5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcGVxdXciLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1dy5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcGdlZnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ2VmcC5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0ZnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RmcC5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0c2IiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzYi5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0c2QiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzZC5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0c2giLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzaC5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0c3ciLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3Rzdy5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0dWIiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1Yi5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0dWQiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1ZC5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0dWgiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1aC5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0dXciLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1dy5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcG5lYiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZWIucCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZWgiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wbmVoLnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wbmV3IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcG5ldy5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcG5lemIiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wbmV6Yi5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcG5lemgiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wbmV6aC5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcG5lenciLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wbmV6dy5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmN0c3hzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmN0dXhzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmN0emxzYmIiLAorICAibGx2bS5wcGMuYWx0aXZlYy52ZXhwdGVmcCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZnYmJkIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmxvZ2VmcCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtYWRkZnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWF4ZnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWF4c2IiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWF4c2QiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWF4c2giLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWF4c3ciLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWF4dWIiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWF4dWQiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWF4dWgiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWF4dXciLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWhhZGRzaHMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWhyYWRkc2hzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm1pbmZwIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm1pbnNiIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm1pbnNkIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm1pbnNoIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm1pbnN3IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm1pbnViIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm1pbnVkIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm1pbnVoIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm1pbnV3IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm1sYWRkdWhtIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm1zdW1tYm0iLAorICAibGx2bS5wcGMuYWx0aXZlYy52bXN1bXNobSIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtc3Vtc2hzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm1zdW11Ym0iLAorICAibGx2bS5wcGMuYWx0aXZlYy52bXN1bXVobSIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtc3VtdWhzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm11bGVzYiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtdWxlc2giLAorICAibGx2bS5wcGMuYWx0aXZlYy52bXVsZXN3IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm11bGV1YiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtdWxldWgiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bXVsZXV3IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm11bG9zYiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtdWxvc2giLAorICAibGx2bS5wcGMuYWx0aXZlYy52bXVsb3N3IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm11bG91YiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtdWxvdWgiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bXVsb3V3IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm5tc3ViZnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52cGVybSIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZwa3B4IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnBrc2RzcyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZwa3NkdXMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52cGtzaHNzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnBrc2h1cyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZwa3N3c3MiLAorICAibGx2bS5wcGMuYWx0aXZlYy52cGtzd3VzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnBrdWR1cyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZwa3VodXMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52cGt1d3VzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnBydHliZCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZwcnR5YnEiLAorICAibGx2bS5wcGMuYWx0aXZlYy52cHJ0eWJ3IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnJlZnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52cmZpbSIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZyZmluIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnJmaXAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52cmZpeiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZybGIiLAorICAibGx2bS5wcGMuYWx0aXZlYy52cmxkIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnJsZG1pIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnJsZG5tIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnJsaCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZybHciLAorICAibGx2bS5wcGMuYWx0aXZlYy52cmx3bWkiLAorICAibGx2bS5wcGMuYWx0aXZlYy52cmx3bm0iLAorICAibGx2bS5wcGMuYWx0aXZlYy52cnNxcnRlZnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52c2VsIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnNsIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnNsYiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzbGgiLAorICAibGx2bS5wcGMuYWx0aXZlYy52c2xvIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnNsdiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzbHciLAorICAibGx2bS5wcGMuYWx0aXZlYy52c3IiLAorICAibGx2bS5wcGMuYWx0aXZlYy52c3JhYiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzcmFoIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnNyYXciLAorICAibGx2bS5wcGMuYWx0aXZlYy52c3JiIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnNyaCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzcm8iLAorICAibGx2bS5wcGMuYWx0aXZlYy52c3J2IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnNydyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzdWJjdXEiLAorICAibGx2bS5wcGMuYWx0aXZlYy52c3ViY3V3IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnN1YmVjdXEiLAorICAibGx2bS5wcGMuYWx0aXZlYy52c3ViZXVxbSIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzdWJzYnMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52c3Vic2hzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnN1YnN3cyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzdWJ1YnMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52c3VidWhzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnN1YnV3cyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzdW0yc3dzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnN1bTRzYnMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52c3VtNHNocyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzdW00dWJzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnN1bXN3cyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZ1cGtocHgiLAorICAibGx2bS5wcGMuYWx0aXZlYy52dXBraHNiIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnVwa2hzaCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZ1cGtoc3ciLAorICAibGx2bS5wcGMuYWx0aXZlYy52dXBrbHB4IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnVwa2xzYiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZ1cGtsc2giLAorICAibGx2bS5wcGMuYWx0aXZlYy52dXBrbHN3IiwKKyAgImxsdm0ucHBjLmJwZXJtZCIsCisgICJsbHZtLnBwYy5jZmVuY2UiLAorICAibGx2bS5wcGMuZGNiYSIsCisgICJsbHZtLnBwYy5kY2JmIiwKKyAgImxsdm0ucHBjLmRjYmkiLAorICAibGx2bS5wcGMuZGNic3QiLAorICAibGx2bS5wcGMuZGNidCIsCisgICJsbHZtLnBwYy5kY2J0c3QiLAorICAibGx2bS5wcGMuZGNieiIsCisgICJsbHZtLnBwYy5kY2J6bCIsCisgICJsbHZtLnBwYy5kaXZkZSIsCisgICJsbHZtLnBwYy5kaXZkZXUiLAorICAibGx2bS5wcGMuZGl2d2UiLAorICAibGx2bS5wcGMuZGl2d2V1IiwKKyAgImxsdm0ucHBjLmdldC50ZXhhc3IiLAorICAibGx2bS5wcGMuZ2V0LnRleGFzcnUiLAorICAibGx2bS5wcGMuZ2V0LnRmaGFyIiwKKyAgImxsdm0ucHBjLmdldC50ZmlhciIsCisgICJsbHZtLnBwYy5pcy5kZWNyZW1lbnRlZC5jdHIubm9uemVybyIsCisgICJsbHZtLnBwYy5sd3N5bmMiLAorICAibGx2bS5wcGMubXRjdHIiLAorICAibGx2bS5wcGMucXB4LnF2ZmFicyIsCisgICJsbHZtLnBwYy5xcHgucXZmYWRkIiwKKyAgImxsdm0ucHBjLnFweC5xdmZhZGRzIiwKKyAgImxsdm0ucHBjLnFweC5xdmZjZmlkIiwKKyAgImxsdm0ucHBjLnFweC5xdmZjZmlkcyIsCisgICJsbHZtLnBwYy5xcHgucXZmY2ZpZHUiLAorICAibGx2bS5wcGMucXB4LnF2ZmNmaWR1cyIsCisgICJsbHZtLnBwYy5xcHgucXZmY21wZXEiLAorICAibGx2bS5wcGMucXB4LnF2ZmNtcGd0IiwKKyAgImxsdm0ucHBjLnFweC5xdmZjbXBsdCIsCisgICJsbHZtLnBwYy5xcHgucXZmY3BzZ24iLAorICAibGx2bS5wcGMucXB4LnF2ZmN0aWQiLAorICAibGx2bS5wcGMucXB4LnF2ZmN0aWR1IiwKKyAgImxsdm0ucHBjLnFweC5xdmZjdGlkdXoiLAorICAibGx2bS5wcGMucXB4LnF2ZmN0aWR6IiwKKyAgImxsdm0ucHBjLnFweC5xdmZjdGl3IiwKKyAgImxsdm0ucHBjLnFweC5xdmZjdGl3dSIsCisgICJsbHZtLnBwYy5xcHgucXZmY3Rpd3V6IiwKKyAgImxsdm0ucHBjLnFweC5xdmZjdGl3eiIsCisgICJsbHZtLnBwYy5xcHgucXZmbG9naWNhbCIsCisgICJsbHZtLnBwYy5xcHgucXZmbWFkZCIsCisgICJsbHZtLnBwYy5xcHgucXZmbWFkZHMiLAorICAibGx2bS5wcGMucXB4LnF2Zm1zdWIiLAorICAibGx2bS5wcGMucXB4LnF2Zm1zdWJzIiwKKyAgImxsdm0ucHBjLnFweC5xdmZtdWwiLAorICAibGx2bS5wcGMucXB4LnF2Zm11bHMiLAorICAibGx2bS5wcGMucXB4LnF2Zm5hYnMiLAorICAibGx2bS5wcGMucXB4LnF2Zm5lZyIsCisgICJsbHZtLnBwYy5xcHgucXZmbm1hZGQiLAorICAibGx2bS5wcGMucXB4LnF2Zm5tYWRkcyIsCisgICJsbHZtLnBwYy5xcHgucXZmbm1zdWIiLAorICAibGx2bS5wcGMucXB4LnF2Zm5tc3VicyIsCisgICJsbHZtLnBwYy5xcHgucXZmcGVybSIsCisgICJsbHZtLnBwYy5xcHgucXZmcmUiLAorICAibGx2bS5wcGMucXB4LnF2ZnJlcyIsCisgICJsbHZtLnBwYy5xcHgucXZmcmltIiwKKyAgImxsdm0ucHBjLnFweC5xdmZyaW4iLAorICAibGx2bS5wcGMucXB4LnF2ZnJpcCIsCisgICJsbHZtLnBwYy5xcHgucXZmcml6IiwKKyAgImxsdm0ucHBjLnFweC5xdmZyc3AiLAorICAibGx2bS5wcGMucXB4LnF2ZnJzcXJ0ZSIsCisgICJsbHZtLnBwYy5xcHgucXZmcnNxcnRlcyIsCisgICJsbHZtLnBwYy5xcHgucXZmc2VsIiwKKyAgImxsdm0ucHBjLnFweC5xdmZzdWIiLAorICAibGx2bS5wcGMucXB4LnF2ZnN1YnMiLAorICAibGx2bS5wcGMucXB4LnF2ZnRzdG5hbiIsCisgICJsbHZtLnBwYy5xcHgucXZmeG1hZGQiLAorICAibGx2bS5wcGMucXB4LnF2ZnhtYWRkcyIsCisgICJsbHZtLnBwYy5xcHgucXZmeG11bCIsCisgICJsbHZtLnBwYy5xcHgucXZmeG11bHMiLAorICAibGx2bS5wcGMucXB4LnF2Znh4Y3BubWFkZCIsCisgICJsbHZtLnBwYy5xcHgucXZmeHhjcG5tYWRkcyIsCisgICJsbHZtLnBwYy5xcHgucXZmeHhtYWRkIiwKKyAgImxsdm0ucHBjLnFweC5xdmZ4eG1hZGRzIiwKKyAgImxsdm0ucHBjLnFweC5xdmZ4eG5wbWFkZCIsCisgICJsbHZtLnBwYy5xcHgucXZmeHhucG1hZGRzIiwKKyAgImxsdm0ucHBjLnFweC5xdmdwY2kiLAorICAibGx2bS5wcGMucXB4LnF2bGZjZCIsCisgICJsbHZtLnBwYy5xcHgucXZsZmNkYSIsCisgICJsbHZtLnBwYy5xcHgucXZsZmNzIiwKKyAgImxsdm0ucHBjLnFweC5xdmxmY3NhIiwKKyAgImxsdm0ucHBjLnFweC5xdmxmZCIsCisgICJsbHZtLnBwYy5xcHgucXZsZmRhIiwKKyAgImxsdm0ucHBjLnFweC5xdmxmaXdhIiwKKyAgImxsdm0ucHBjLnFweC5xdmxmaXdhYSIsCisgICJsbHZtLnBwYy5xcHgucXZsZml3eiIsCisgICJsbHZtLnBwYy5xcHgucXZsZml3emEiLAorICAibGx2bS5wcGMucXB4LnF2bGZzIiwKKyAgImxsdm0ucHBjLnFweC5xdmxmc2EiLAorICAibGx2bS5wcGMucXB4LnF2bHBjbGQiLAorICAibGx2bS5wcGMucXB4LnF2bHBjbHMiLAorICAibGx2bS5wcGMucXB4LnF2bHBjcmQiLAorICAibGx2bS5wcGMucXB4LnF2bHBjcnMiLAorICAibGx2bS5wcGMucXB4LnF2c3RmY2QiLAorICAibGx2bS5wcGMucXB4LnF2c3RmY2RhIiwKKyAgImxsdm0ucHBjLnFweC5xdnN0ZmNzIiwKKyAgImxsdm0ucHBjLnFweC5xdnN0ZmNzYSIsCisgICJsbHZtLnBwYy5xcHgucXZzdGZkIiwKKyAgImxsdm0ucHBjLnFweC5xdnN0ZmRhIiwKKyAgImxsdm0ucHBjLnFweC5xdnN0Zml3IiwKKyAgImxsdm0ucHBjLnFweC5xdnN0Zml3YSIsCisgICJsbHZtLnBwYy5xcHgucXZzdGZzIiwKKyAgImxsdm0ucHBjLnFweC5xdnN0ZnNhIiwKKyAgImxsdm0ucHBjLnNldC50ZXhhc3IiLAorICAibGx2bS5wcGMuc2V0LnRleGFzcnUiLAorICAibGx2bS5wcGMuc2V0LnRmaGFyIiwKKyAgImxsdm0ucHBjLnNldC50ZmlhciIsCisgICJsbHZtLnBwYy5zeW5jIiwKKyAgImxsdm0ucHBjLnRhYm9ydCIsCisgICJsbHZtLnBwYy50YWJvcnRkYyIsCisgICJsbHZtLnBwYy50YWJvcnRkY2kiLAorICAibGx2bS5wcGMudGFib3J0d2MiLAorICAibGx2bS5wcGMudGFib3J0d2NpIiwKKyAgImxsdm0ucHBjLnRiZWdpbiIsCisgICJsbHZtLnBwYy50Y2hlY2siLAorICAibGx2bS5wcGMudGVuZCIsCisgICJsbHZtLnBwYy50ZW5kYWxsIiwKKyAgImxsdm0ucHBjLnRyZWNoa3B0IiwKKyAgImxsdm0ucHBjLnRyZWNsYWltIiwKKyAgImxsdm0ucHBjLnRyZXN1bWUiLAorICAibGx2bS5wcGMudHNyIiwKKyAgImxsdm0ucHBjLnRzdXNwZW5kIiwKKyAgImxsdm0ucHBjLnR0ZXN0IiwKKyAgImxsdm0ucHBjLnZzeC5seHZkMngiLAorICAibGx2bS5wcGMudnN4Lmx4dmQyeC5iZSIsCisgICJsbHZtLnBwYy52c3gubHh2bCIsCisgICJsbHZtLnBwYy52c3gubHh2bGwiLAorICAibGx2bS5wcGMudnN4Lmx4dnc0eCIsCisgICJsbHZtLnBwYy52c3gubHh2dzR4LmJlIiwKKyAgImxsdm0ucHBjLnZzeC5zdHh2ZDJ4IiwKKyAgImxsdm0ucHBjLnZzeC5zdHh2ZDJ4LmJlIiwKKyAgImxsdm0ucHBjLnZzeC5zdHh2bCIsCisgICJsbHZtLnBwYy52c3guc3R4dmxsIiwKKyAgImxsdm0ucHBjLnZzeC5zdHh2dzR4IiwKKyAgImxsdm0ucHBjLnZzeC5zdHh2dzR4LmJlIiwKKyAgImxsdm0ucHBjLnZzeC54c21heGRwIiwKKyAgImxsdm0ucHBjLnZzeC54c21pbmRwIiwKKyAgImxsdm0ucHBjLnZzeC54dmNtcGVxZHAiLAorICAibGx2bS5wcGMudnN4Lnh2Y21wZXFkcC5wIiwKKyAgImxsdm0ucHBjLnZzeC54dmNtcGVxc3AiLAorICAibGx2bS5wcGMudnN4Lnh2Y21wZXFzcC5wIiwKKyAgImxsdm0ucHBjLnZzeC54dmNtcGdlZHAiLAorICAibGx2bS5wcGMudnN4Lnh2Y21wZ2VkcC5wIiwKKyAgImxsdm0ucHBjLnZzeC54dmNtcGdlc3AiLAorICAibGx2bS5wcGMudnN4Lnh2Y21wZ2VzcC5wIiwKKyAgImxsdm0ucHBjLnZzeC54dmNtcGd0ZHAiLAorICAibGx2bS5wcGMudnN4Lnh2Y21wZ3RkcC5wIiwKKyAgImxsdm0ucHBjLnZzeC54dmNtcGd0c3AiLAorICAibGx2bS5wcGMudnN4Lnh2Y21wZ3RzcC5wIiwKKyAgImxsdm0ucHBjLnZzeC54dmN2ZHBzcCIsCisgICJsbHZtLnBwYy52c3gueHZjdmRwc3h3cyIsCisgICJsbHZtLnBwYy52c3gueHZjdmRwdXh3cyIsCisgICJsbHZtLnBwYy52c3gueHZjdmhwc3AiLAorICAibGx2bS5wcGMudnN4Lnh2Y3ZzcGRwIiwKKyAgImxsdm0ucHBjLnZzeC54dmN2c3BocCIsCisgICJsbHZtLnBwYy52c3gueHZjdnN4ZHNwIiwKKyAgImxsdm0ucHBjLnZzeC54dmN2c3h3ZHAiLAorICAibGx2bS5wcGMudnN4Lnh2Y3Z1eGRzcCIsCisgICJsbHZtLnBwYy52c3gueHZjdnV4d2RwIiwKKyAgImxsdm0ucHBjLnZzeC54dmRpdmRwIiwKKyAgImxsdm0ucHBjLnZzeC54dmRpdnNwIiwKKyAgImxsdm0ucHBjLnZzeC54dmlleHBkcCIsCisgICJsbHZtLnBwYy52c3gueHZpZXhwc3AiLAorICAibGx2bS5wcGMudnN4Lnh2bWF4ZHAiLAorICAibGx2bS5wcGMudnN4Lnh2bWF4c3AiLAorICAibGx2bS5wcGMudnN4Lnh2bWluZHAiLAorICAibGx2bS5wcGMudnN4Lnh2bWluc3AiLAorICAibGx2bS5wcGMudnN4Lnh2cmRwaXAiLAorICAibGx2bS5wcGMudnN4Lnh2cmVkcCIsCisgICJsbHZtLnBwYy52c3gueHZyZXNwIiwKKyAgImxsdm0ucHBjLnZzeC54dnJzcGlwIiwKKyAgImxsdm0ucHBjLnZzeC54dnJzcXJ0ZWRwIiwKKyAgImxsdm0ucHBjLnZzeC54dnJzcXJ0ZXNwIiwKKyAgImxsdm0ucHBjLnZzeC54dnRzdGRjZHAiLAorICAibGx2bS5wcGMudnN4Lnh2dHN0ZGNzcCIsCisgICJsbHZtLnBwYy52c3gueHZ4ZXhwZHAiLAorICAibGx2bS5wcGMudnN4Lnh2eGV4cHNwIiwKKyAgImxsdm0ucHBjLnZzeC54dnhzaWdkcCIsCisgICJsbHZtLnBwYy52c3gueHZ4c2lnc3AiLAorICAibGx2bS5wcGMudnN4Lnh4ZXh0cmFjdHV3IiwKKyAgImxsdm0ucHBjLnZzeC54eGluc2VydHciLAorICAibGx2bS5wcGMudnN4Lnh4bGVxdiIsCisgICJsbHZtLnI2MDAuY3ViZSIsCisgICJsbHZtLnI2MDAuZ3JvdXAuYmFycmllciIsCisgICJsbHZtLnI2MDAuaW1wbGljaXRhcmcucHRyIiwKKyAgImxsdm0ucjYwMC5yYXQuc3RvcmUudHlwZWQiLAorICAibGx2bS5yNjAwLnJlYWQuZ2xvYmFsLnNpemUueCIsCisgICJsbHZtLnI2MDAucmVhZC5nbG9iYWwuc2l6ZS55IiwKKyAgImxsdm0ucjYwMC5yZWFkLmdsb2JhbC5zaXplLnoiLAorICAibGx2bS5yNjAwLnJlYWQubG9jYWwuc2l6ZS54IiwKKyAgImxsdm0ucjYwMC5yZWFkLmxvY2FsLnNpemUueSIsCisgICJsbHZtLnI2MDAucmVhZC5sb2NhbC5zaXplLnoiLAorICAibGx2bS5yNjAwLnJlYWQubmdyb3Vwcy54IiwKKyAgImxsdm0ucjYwMC5yZWFkLm5ncm91cHMueSIsCisgICJsbHZtLnI2MDAucmVhZC5uZ3JvdXBzLnoiLAorICAibGx2bS5yNjAwLnJlYWQudGdpZC54IiwKKyAgImxsdm0ucjYwMC5yZWFkLnRnaWQueSIsCisgICJsbHZtLnI2MDAucmVhZC50Z2lkLnoiLAorICAibGx2bS5yNjAwLnJlYWQudGlkaWcueCIsCisgICJsbHZtLnI2MDAucmVhZC50aWRpZy55IiwKKyAgImxsdm0ucjYwMC5yZWFkLnRpZGlnLnoiLAorICAibGx2bS5yNjAwLnJlY2lwc3FydC5jbGFtcGVkIiwKKyAgImxsdm0ucjYwMC5yZWNpcHNxcnQuaWVlZSIsCisgICJsbHZtLnMzOTAuZWZwYyIsCisgICJsbHZtLnMzOTAuZXRuZCIsCisgICJsbHZtLnMzOTAubGNiYiIsCisgICJsbHZtLnMzOTAubnRzdGciLAorICAibGx2bS5zMzkwLnBwYS50eGFzc2lzdCIsCisgICJsbHZtLnMzOTAuc2ZwYyIsCisgICJsbHZtLnMzOTAudGFib3J0IiwKKyAgImxsdm0uczM5MC50YmVnaW4iLAorICAibGx2bS5zMzkwLnRiZWdpbi5ub2Zsb2F0IiwKKyAgImxsdm0uczM5MC50YmVnaW5jIiwKKyAgImxsdm0uczM5MC50ZGMiLAorICAibGx2bS5zMzkwLnRlbmQiLAorICAibGx2bS5zMzkwLnZhY2NiIiwKKyAgImxsdm0uczM5MC52YWNjY3EiLAorICAibGx2bS5zMzkwLnZhY2NmIiwKKyAgImxsdm0uczM5MC52YWNjZyIsCisgICJsbHZtLnMzOTAudmFjY2giLAorICAibGx2bS5zMzkwLnZhY2NxIiwKKyAgImxsdm0uczM5MC52YWNxIiwKKyAgImxsdm0uczM5MC52YXEiLAorICAibGx2bS5zMzkwLnZhdmdiIiwKKyAgImxsdm0uczM5MC52YXZnZiIsCisgICJsbHZtLnMzOTAudmF2Z2ciLAorICAibGx2bS5zMzkwLnZhdmdoIiwKKyAgImxsdm0uczM5MC52YXZnbGIiLAorICAibGx2bS5zMzkwLnZhdmdsZiIsCisgICJsbHZtLnMzOTAudmF2Z2xnIiwKKyAgImxsdm0uczM5MC52YXZnbGgiLAorICAibGx2bS5zMzkwLnZicGVybSIsCisgICJsbHZtLnMzOTAudmNlcWJzIiwKKyAgImxsdm0uczM5MC52Y2VxZnMiLAorICAibGx2bS5zMzkwLnZjZXFncyIsCisgICJsbHZtLnMzOTAudmNlcWhzIiwKKyAgImxsdm0uczM5MC52Y2hicyIsCisgICJsbHZtLnMzOTAudmNoZnMiLAorICAibGx2bS5zMzkwLnZjaGdzIiwKKyAgImxsdm0uczM5MC52Y2hocyIsCisgICJsbHZtLnMzOTAudmNobGJzIiwKKyAgImxsdm0uczM5MC52Y2hsZnMiLAorICAibGx2bS5zMzkwLnZjaGxncyIsCisgICJsbHZtLnMzOTAudmNobGhzIiwKKyAgImxsdm0uczM5MC52Y2tzbSIsCisgICJsbHZtLnMzOTAudmVyaW1iIiwKKyAgImxsdm0uczM5MC52ZXJpbWYiLAorICAibGx2bS5zMzkwLnZlcmltZyIsCisgICJsbHZtLnMzOTAudmVyaW1oIiwKKyAgImxsdm0uczM5MC52ZXJsbGIiLAorICAibGx2bS5zMzkwLnZlcmxsZiIsCisgICJsbHZtLnMzOTAudmVybGxnIiwKKyAgImxsdm0uczM5MC52ZXJsbGgiLAorICAibGx2bS5zMzkwLnZlcmxsdmIiLAorICAibGx2bS5zMzkwLnZlcmxsdmYiLAorICAibGx2bS5zMzkwLnZlcmxsdmciLAorICAibGx2bS5zMzkwLnZlcmxsdmgiLAorICAibGx2bS5zMzkwLnZmYWViIiwKKyAgImxsdm0uczM5MC52ZmFlYnMiLAorICAibGx2bS5zMzkwLnZmYWVmIiwKKyAgImxsdm0uczM5MC52ZmFlZnMiLAorICAibGx2bS5zMzkwLnZmYWVoIiwKKyAgImxsdm0uczM5MC52ZmFlaHMiLAorICAibGx2bS5zMzkwLnZmYWV6YiIsCisgICJsbHZtLnMzOTAudmZhZXpicyIsCisgICJsbHZtLnMzOTAudmZhZXpmIiwKKyAgImxsdm0uczM5MC52ZmFlemZzIiwKKyAgImxsdm0uczM5MC52ZmFlemgiLAorICAibGx2bS5zMzkwLnZmYWV6aHMiLAorICAibGx2bS5zMzkwLnZmY2VkYnMiLAorICAibGx2bS5zMzkwLnZmY2VzYnMiLAorICAibGx2bS5zMzkwLnZmY2hkYnMiLAorICAibGx2bS5zMzkwLnZmY2hlZGJzIiwKKyAgImxsdm0uczM5MC52ZmNoZXNicyIsCisgICJsbHZtLnMzOTAudmZjaHNicyIsCisgICJsbHZtLnMzOTAudmZlZWIiLAorICAibGx2bS5zMzkwLnZmZWVicyIsCisgICJsbHZtLnMzOTAudmZlZWYiLAorICAibGx2bS5zMzkwLnZmZWVmcyIsCisgICJsbHZtLnMzOTAudmZlZWgiLAorICAibGx2bS5zMzkwLnZmZWVocyIsCisgICJsbHZtLnMzOTAudmZlZXpiIiwKKyAgImxsdm0uczM5MC52ZmVlemJzIiwKKyAgImxsdm0uczM5MC52ZmVlemYiLAorICAibGx2bS5zMzkwLnZmZWV6ZnMiLAorICAibGx2bS5zMzkwLnZmZWV6aCIsCisgICJsbHZtLnMzOTAudmZlZXpocyIsCisgICJsbHZtLnMzOTAudmZlbmViIiwKKyAgImxsdm0uczM5MC52ZmVuZWJzIiwKKyAgImxsdm0uczM5MC52ZmVuZWYiLAorICAibGx2bS5zMzkwLnZmZW5lZnMiLAorICAibGx2bS5zMzkwLnZmZW5laCIsCisgICJsbHZtLnMzOTAudmZlbmVocyIsCisgICJsbHZtLnMzOTAudmZlbmV6YiIsCisgICJsbHZtLnMzOTAudmZlbmV6YnMiLAorICAibGx2bS5zMzkwLnZmZW5lemYiLAorICAibGx2bS5zMzkwLnZmZW5lemZzIiwKKyAgImxsdm0uczM5MC52ZmVuZXpoIiwKKyAgImxsdm0uczM5MC52ZmVuZXpocyIsCisgICJsbHZtLnMzOTAudmZpZGIiLAorICAibGx2bS5zMzkwLnZmaXNiIiwKKyAgImxsdm0uczM5MC52Zm1heGRiIiwKKyAgImxsdm0uczM5MC52Zm1heHNiIiwKKyAgImxsdm0uczM5MC52Zm1pbmRiIiwKKyAgImxsdm0uczM5MC52Zm1pbnNiIiwKKyAgImxsdm0uczM5MC52ZnRjaWRiIiwKKyAgImxsdm0uczM5MC52ZnRjaXNiIiwKKyAgImxsdm0uczM5MC52Z2ZtYWIiLAorICAibGx2bS5zMzkwLnZnZm1hZiIsCisgICJsbHZtLnMzOTAudmdmbWFnIiwKKyAgImxsdm0uczM5MC52Z2ZtYWgiLAorICAibGx2bS5zMzkwLnZnZm1iIiwKKyAgImxsdm0uczM5MC52Z2ZtZiIsCisgICJsbHZtLnMzOTAudmdmbWciLAorICAibGx2bS5zMzkwLnZnZm1oIiwKKyAgImxsdm0uczM5MC52aXN0cmIiLAorICAibGx2bS5zMzkwLnZpc3RyYnMiLAorICAibGx2bS5zMzkwLnZpc3RyZiIsCisgICJsbHZtLnMzOTAudmlzdHJmcyIsCisgICJsbHZtLnMzOTAudmlzdHJoIiwKKyAgImxsdm0uczM5MC52aXN0cmhzIiwKKyAgImxsdm0uczM5MC52bGJiIiwKKyAgImxsdm0uczM5MC52bGwiLAorICAibGx2bS5zMzkwLnZscmwiLAorICAibGx2bS5zMzkwLnZtYWViIiwKKyAgImxsdm0uczM5MC52bWFlZiIsCisgICJsbHZtLnMzOTAudm1hZWgiLAorICAibGx2bS5zMzkwLnZtYWhiIiwKKyAgImxsdm0uczM5MC52bWFoZiIsCisgICJsbHZtLnMzOTAudm1haGgiLAorICAibGx2bS5zMzkwLnZtYWxlYiIsCisgICJsbHZtLnMzOTAudm1hbGVmIiwKKyAgImxsdm0uczM5MC52bWFsZWgiLAorICAibGx2bS5zMzkwLnZtYWxoYiIsCisgICJsbHZtLnMzOTAudm1hbGhmIiwKKyAgImxsdm0uczM5MC52bWFsaGgiLAorICAibGx2bS5zMzkwLnZtYWxvYiIsCisgICJsbHZtLnMzOTAudm1hbG9mIiwKKyAgImxsdm0uczM5MC52bWFsb2giLAorICAibGx2bS5zMzkwLnZtYW9iIiwKKyAgImxsdm0uczM5MC52bWFvZiIsCisgICJsbHZtLnMzOTAudm1hb2giLAorICAibGx2bS5zMzkwLnZtZWIiLAorICAibGx2bS5zMzkwLnZtZWYiLAorICAibGx2bS5zMzkwLnZtZWgiLAorICAibGx2bS5zMzkwLnZtaGIiLAorICAibGx2bS5zMzkwLnZtaGYiLAorICAibGx2bS5zMzkwLnZtaGgiLAorICAibGx2bS5zMzkwLnZtbGViIiwKKyAgImxsdm0uczM5MC52bWxlZiIsCisgICJsbHZtLnMzOTAudm1sZWgiLAorICAibGx2bS5zMzkwLnZtbGhiIiwKKyAgImxsdm0uczM5MC52bWxoZiIsCisgICJsbHZtLnMzOTAudm1saGgiLAorICAibGx2bS5zMzkwLnZtbG9iIiwKKyAgImxsdm0uczM5MC52bWxvZiIsCisgICJsbHZtLnMzOTAudm1sb2giLAorICAibGx2bS5zMzkwLnZtb2IiLAorICAibGx2bS5zMzkwLnZtb2YiLAorICAibGx2bS5zMzkwLnZtb2giLAorICAibGx2bS5zMzkwLnZtc2xnIiwKKyAgImxsdm0uczM5MC52cGRpIiwKKyAgImxsdm0uczM5MC52cGVybSIsCisgICJsbHZtLnMzOTAudnBrbHNmIiwKKyAgImxsdm0uczM5MC52cGtsc2ZzIiwKKyAgImxsdm0uczM5MC52cGtsc2ciLAorICAibGx2bS5zMzkwLnZwa2xzZ3MiLAorICAibGx2bS5zMzkwLnZwa2xzaCIsCisgICJsbHZtLnMzOTAudnBrbHNocyIsCisgICJsbHZtLnMzOTAudnBrc2YiLAorICAibGx2bS5zMzkwLnZwa3NmcyIsCisgICJsbHZtLnMzOTAudnBrc2ciLAorICAibGx2bS5zMzkwLnZwa3NncyIsCisgICJsbHZtLnMzOTAudnBrc2giLAorICAibGx2bS5zMzkwLnZwa3NocyIsCisgICJsbHZtLnMzOTAudnNiY2JpcSIsCisgICJsbHZtLnMzOTAudnNiaXEiLAorICAibGx2bS5zMzkwLnZzY2JpYiIsCisgICJsbHZtLnMzOTAudnNjYmlmIiwKKyAgImxsdm0uczM5MC52c2NiaWciLAorICAibGx2bS5zMzkwLnZzY2JpaCIsCisgICJsbHZtLnMzOTAudnNjYmlxIiwKKyAgImxsdm0uczM5MC52c2wiLAorICAibGx2bS5zMzkwLnZzbGIiLAorICAibGx2bS5zMzkwLnZzbGRiIiwKKyAgImxsdm0uczM5MC52c3EiLAorICAibGx2bS5zMzkwLnZzcmEiLAorICAibGx2bS5zMzkwLnZzcmFiIiwKKyAgImxsdm0uczM5MC52c3JsIiwKKyAgImxsdm0uczM5MC52c3JsYiIsCisgICJsbHZtLnMzOTAudnN0bCIsCisgICJsbHZtLnMzOTAudnN0cmNiIiwKKyAgImxsdm0uczM5MC52c3RyY2JzIiwKKyAgImxsdm0uczM5MC52c3RyY2YiLAorICAibGx2bS5zMzkwLnZzdHJjZnMiLAorICAibGx2bS5zMzkwLnZzdHJjaCIsCisgICJsbHZtLnMzOTAudnN0cmNocyIsCisgICJsbHZtLnMzOTAudnN0cmN6YiIsCisgICJsbHZtLnMzOTAudnN0cmN6YnMiLAorICAibGx2bS5zMzkwLnZzdHJjemYiLAorICAibGx2bS5zMzkwLnZzdHJjemZzIiwKKyAgImxsdm0uczM5MC52c3RyY3poIiwKKyAgImxsdm0uczM5MC52c3RyY3pocyIsCisgICJsbHZtLnMzOTAudnN0cmwiLAorICAibGx2bS5zMzkwLnZzdW1iIiwKKyAgImxsdm0uczM5MC52c3VtZ2YiLAorICAibGx2bS5zMzkwLnZzdW1naCIsCisgICJsbHZtLnMzOTAudnN1bWgiLAorICAibGx2bS5zMzkwLnZzdW1xZiIsCisgICJsbHZtLnMzOTAudnN1bXFnIiwKKyAgImxsdm0uczM5MC52dG0iLAorICAibGx2bS5zMzkwLnZ1cGhiIiwKKyAgImxsdm0uczM5MC52dXBoZiIsCisgICJsbHZtLnMzOTAudnVwaGgiLAorICAibGx2bS5zMzkwLnZ1cGxiIiwKKyAgImxsdm0uczM5MC52dXBsZiIsCisgICJsbHZtLnMzOTAudnVwbGhiIiwKKyAgImxsdm0uczM5MC52dXBsaGYiLAorICAibGx2bS5zMzkwLnZ1cGxoaCIsCisgICJsbHZtLnMzOTAudnVwbGh3IiwKKyAgImxsdm0uczM5MC52dXBsbGIiLAorICAibGx2bS5zMzkwLnZ1cGxsZiIsCisgICJsbHZtLnMzOTAudnVwbGxoIiwKKyAgImxsdm0ud2FzbS5jdXJyZW50Lm1lbW9yeSIsCisgICJsbHZtLndhc20uZ2V0LmVoc2VsZWN0b3IiLAorICAibGx2bS53YXNtLmdldC5leGNlcHRpb24iLAorICAibGx2bS53YXNtLmdyb3cubWVtb3J5IiwKKyAgImxsdm0ud2FzbS5tZW0uZ3JvdyIsCisgICJsbHZtLndhc20ubWVtLnNpemUiLAorICAibGx2bS53YXNtLnJldGhyb3ciLAorICAibGx2bS53YXNtLnRocm93IiwKKyAgImxsdm0ueDg2LjNkbm93LnBhdmd1c2IiLAorICAibGx2bS54ODYuM2Rub3cucGYyaWQiLAorICAibGx2bS54ODYuM2Rub3cucGZhY2MiLAorICAibGx2bS54ODYuM2Rub3cucGZhZGQiLAorICAibGx2bS54ODYuM2Rub3cucGZjbXBlcSIsCisgICJsbHZtLng4Ni4zZG5vdy5wZmNtcGdlIiwKKyAgImxsdm0ueDg2LjNkbm93LnBmY21wZ3QiLAorICAibGx2bS54ODYuM2Rub3cucGZtYXgiLAorICAibGx2bS54ODYuM2Rub3cucGZtaW4iLAorICAibGx2bS54ODYuM2Rub3cucGZtdWwiLAorICAibGx2bS54ODYuM2Rub3cucGZyY3AiLAorICAibGx2bS54ODYuM2Rub3cucGZyY3BpdDEiLAorICAibGx2bS54ODYuM2Rub3cucGZyY3BpdDIiLAorICAibGx2bS54ODYuM2Rub3cucGZyc3FpdDEiLAorICAibGx2bS54ODYuM2Rub3cucGZyc3FydCIsCisgICJsbHZtLng4Ni4zZG5vdy5wZnN1YiIsCisgICJsbHZtLng4Ni4zZG5vdy5wZnN1YnIiLAorICAibGx2bS54ODYuM2Rub3cucGkyZmQiLAorICAibGx2bS54ODYuM2Rub3cucG11bGhydyIsCisgICJsbHZtLng4Ni4zZG5vd2EucGYyaXciLAorICAibGx2bS54ODYuM2Rub3dhLnBmbmFjYyIsCisgICJsbHZtLng4Ni4zZG5vd2EucGZwbmFjYyIsCisgICJsbHZtLng4Ni4zZG5vd2EucGkyZnciLAorICAibGx2bS54ODYuM2Rub3dhLnBzd2FwZCIsCisgICJsbHZtLng4Ni5hZGRjYXJyeS51MzIiLAorICAibGx2bS54ODYuYWRkY2FycnkudTY0IiwKKyAgImxsdm0ueDg2LmFkZGNhcnJ5eC51MzIiLAorICAibGx2bS54ODYuYWRkY2Fycnl4LnU2NCIsCisgICJsbHZtLng4Ni5hZXNuaS5hZXNkZWMiLAorICAibGx2bS54ODYuYWVzbmkuYWVzZGVjLjI1NiIsCisgICJsbHZtLng4Ni5hZXNuaS5hZXNkZWMuNTEyIiwKKyAgImxsdm0ueDg2LmFlc25pLmFlc2RlY2xhc3QiLAorICAibGx2bS54ODYuYWVzbmkuYWVzZGVjbGFzdC4yNTYiLAorICAibGx2bS54ODYuYWVzbmkuYWVzZGVjbGFzdC41MTIiLAorICAibGx2bS54ODYuYWVzbmkuYWVzZW5jIiwKKyAgImxsdm0ueDg2LmFlc25pLmFlc2VuYy4yNTYiLAorICAibGx2bS54ODYuYWVzbmkuYWVzZW5jLjUxMiIsCisgICJsbHZtLng4Ni5hZXNuaS5hZXNlbmNsYXN0IiwKKyAgImxsdm0ueDg2LmFlc25pLmFlc2VuY2xhc3QuMjU2IiwKKyAgImxsdm0ueDg2LmFlc25pLmFlc2VuY2xhc3QuNTEyIiwKKyAgImxsdm0ueDg2LmFlc25pLmFlc2ltYyIsCisgICJsbHZtLng4Ni5hZXNuaS5hZXNrZXlnZW5hc3Npc3QiLAorICAibGx2bS54ODYuYXZ4LmFkZHN1Yi5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4LmFkZHN1Yi5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4LmJsZW5kdi5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4LmJsZW5kdi5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4LmNtcC5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4LmNtcC5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4LmN2dC5wZDIucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5jdnQucGQyZHEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5jdnQucHMyZHEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5jdnRkcTIucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5jdnR0LnBkMmRxLjI1NiIsCisgICJsbHZtLng4Ni5hdnguY3Z0dC5wczJkcS4yNTYiLAorICAibGx2bS54ODYuYXZ4LmRwLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdnguaGFkZC5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4LmhhZGQucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5oc3ViLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdnguaHN1Yi5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4LmxkdS5kcS4yNTYiLAorICAibGx2bS54ODYuYXZ4Lm1hc2tsb2FkLnBkIiwKKyAgImxsdm0ueDg2LmF2eC5tYXNrbG9hZC5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4Lm1hc2tsb2FkLnBzIiwKKyAgImxsdm0ueDg2LmF2eC5tYXNrbG9hZC5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4Lm1hc2tzdG9yZS5wZCIsCisgICJsbHZtLng4Ni5hdngubWFza3N0b3JlLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdngubWFza3N0b3JlLnBzIiwKKyAgImxsdm0ueDg2LmF2eC5tYXNrc3RvcmUucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5tYXgucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5tYXgucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5taW4ucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5taW4ucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5tb3Ztc2sucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5tb3Ztc2sucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5wdGVzdGMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5wdGVzdG56Yy4yNTYiLAorICAibGx2bS54ODYuYXZ4LnB0ZXN0ei4yNTYiLAorICAibGx2bS54ODYuYXZ4LnJjcC5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4LnJvdW5kLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdngucm91bmQucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5yc3FydC5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4LnNxcnQucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5zcXJ0LnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdngudnBlcm1pbHZhci5wZCIsCisgICJsbHZtLng4Ni5hdngudnBlcm1pbHZhci5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4LnZwZXJtaWx2YXIucHMiLAorICAibGx2bS54ODYuYXZ4LnZwZXJtaWx2YXIucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC52dGVzdGMucGQiLAorICAibGx2bS54ODYuYXZ4LnZ0ZXN0Yy5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4LnZ0ZXN0Yy5wcyIsCisgICJsbHZtLng4Ni5hdngudnRlc3RjLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdngudnRlc3RuemMucGQiLAorICAibGx2bS54ODYuYXZ4LnZ0ZXN0bnpjLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdngudnRlc3RuemMucHMiLAorICAibGx2bS54ODYuYXZ4LnZ0ZXN0bnpjLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdngudnRlc3R6LnBkIiwKKyAgImxsdm0ueDg2LmF2eC52dGVzdHoucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC52dGVzdHoucHMiLAorICAibGx2bS54ODYuYXZ4LnZ0ZXN0ei5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4LnZ6ZXJvYWxsIiwKKyAgImxsdm0ueDg2LmF2eC52emVyb3VwcGVyIiwKKyAgImxsdm0ueDg2LmF2eDIuZ2F0aGVyLmQuZCIsCisgICJsbHZtLng4Ni5hdngyLmdhdGhlci5kLmQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDIuZ2F0aGVyLmQucGQiLAorICAibGx2bS54ODYuYXZ4Mi5nYXRoZXIuZC5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4Mi5nYXRoZXIuZC5wcyIsCisgICJsbHZtLng4Ni5hdngyLmdhdGhlci5kLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdngyLmdhdGhlci5kLnEiLAorICAibGx2bS54ODYuYXZ4Mi5nYXRoZXIuZC5xLjI1NiIsCisgICJsbHZtLng4Ni5hdngyLmdhdGhlci5xLmQiLAorICAibGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5kLjI1NiIsCisgICJsbHZtLng4Ni5hdngyLmdhdGhlci5xLnBkIiwKKyAgImxsdm0ueDg2LmF2eDIuZ2F0aGVyLnEucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDIuZ2F0aGVyLnEucHMiLAorICAibGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5xIiwKKyAgImxsdm0ueDg2LmF2eDIuZ2F0aGVyLnEucS4yNTYiLAorICAibGx2bS54ODYuYXZ4Mi5tYXNrbG9hZC5kIiwKKyAgImxsdm0ueDg2LmF2eDIubWFza2xvYWQuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4Mi5tYXNrbG9hZC5xIiwKKyAgImxsdm0ueDg2LmF2eDIubWFza2xvYWQucS4yNTYiLAorICAibGx2bS54ODYuYXZ4Mi5tYXNrc3RvcmUuZCIsCisgICJsbHZtLng4Ni5hdngyLm1hc2tzdG9yZS5kLjI1NiIsCisgICJsbHZtLng4Ni5hdngyLm1hc2tzdG9yZS5xIiwKKyAgImxsdm0ueDg2LmF2eDIubWFza3N0b3JlLnEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDIubXBzYWRidyIsCisgICJsbHZtLng4Ni5hdngyLnBhY2tzc2R3IiwKKyAgImxsdm0ueDg2LmF2eDIucGFja3Nzd2IiLAorICAibGx2bS54ODYuYXZ4Mi5wYWNrdXNkdyIsCisgICJsbHZtLng4Ni5hdngyLnBhY2t1c3diIiwKKyAgImxsdm0ueDg2LmF2eDIucGFkZHMuYiIsCisgICJsbHZtLng4Ni5hdngyLnBhZGRzLnciLAorICAibGx2bS54ODYuYXZ4Mi5wYWRkdXMuYiIsCisgICJsbHZtLng4Ni5hdngyLnBhZGR1cy53IiwKKyAgImxsdm0ueDg2LmF2eDIucGJsZW5kdmIiLAorICAibGx2bS54ODYuYXZ4Mi5wZXJtZCIsCisgICJsbHZtLng4Ni5hdngyLnBlcm1wcyIsCisgICJsbHZtLng4Ni5hdngyLnBoYWRkLmQiLAorICAibGx2bS54ODYuYXZ4Mi5waGFkZC5zdyIsCisgICJsbHZtLng4Ni5hdngyLnBoYWRkLnciLAorICAibGx2bS54ODYuYXZ4Mi5waHN1Yi5kIiwKKyAgImxsdm0ueDg2LmF2eDIucGhzdWIuc3ciLAorICAibGx2bS54ODYuYXZ4Mi5waHN1Yi53IiwKKyAgImxsdm0ueDg2LmF2eDIucG1hZGQudWIuc3ciLAorICAibGx2bS54ODYuYXZ4Mi5wbWFkZC53ZCIsCisgICJsbHZtLng4Ni5hdngyLnBtb3Ztc2tiIiwKKyAgImxsdm0ueDg2LmF2eDIucG11bC5kcSIsCisgICJsbHZtLng4Ni5hdngyLnBtdWwuaHIuc3ciLAorICAibGx2bS54ODYuYXZ4Mi5wbXVsaC53IiwKKyAgImxsdm0ueDg2LmF2eDIucG11bGh1LnciLAorICAibGx2bS54ODYuYXZ4Mi5wbXVsdS5kcSIsCisgICJsbHZtLng4Ni5hdngyLnBzYWQuYnciLAorICAibGx2bS54ODYuYXZ4Mi5wc2h1Zi5iIiwKKyAgImxsdm0ueDg2LmF2eDIucHNpZ24uYiIsCisgICJsbHZtLng4Ni5hdngyLnBzaWduLmQiLAorICAibGx2bS54ODYuYXZ4Mi5wc2lnbi53IiwKKyAgImxsdm0ueDg2LmF2eDIucHNsbC5kIiwKKyAgImxsdm0ueDg2LmF2eDIucHNsbC5xIiwKKyAgImxsdm0ueDg2LmF2eDIucHNsbC53IiwKKyAgImxsdm0ueDg2LmF2eDIucHNsbGkuZCIsCisgICJsbHZtLng4Ni5hdngyLnBzbGxpLnEiLAorICAibGx2bS54ODYuYXZ4Mi5wc2xsaS53IiwKKyAgImxsdm0ueDg2LmF2eDIucHNsbHYuZCIsCisgICJsbHZtLng4Ni5hdngyLnBzbGx2LmQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDIucHNsbHYucSIsCisgICJsbHZtLng4Ni5hdngyLnBzbGx2LnEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDIucHNyYS5kIiwKKyAgImxsdm0ueDg2LmF2eDIucHNyYS53IiwKKyAgImxsdm0ueDg2LmF2eDIucHNyYWkuZCIsCisgICJsbHZtLng4Ni5hdngyLnBzcmFpLnciLAorICAibGx2bS54ODYuYXZ4Mi5wc3Jhdi5kIiwKKyAgImxsdm0ueDg2LmF2eDIucHNyYXYuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4Mi5wc3JsLmQiLAorICAibGx2bS54ODYuYXZ4Mi5wc3JsLnEiLAorICAibGx2bS54ODYuYXZ4Mi5wc3JsLnciLAorICAibGx2bS54ODYuYXZ4Mi5wc3JsaS5kIiwKKyAgImxsdm0ueDg2LmF2eDIucHNybGkucSIsCisgICJsbHZtLng4Ni5hdngyLnBzcmxpLnciLAorICAibGx2bS54ODYuYXZ4Mi5wc3Jsdi5kIiwKKyAgImxsdm0ueDg2LmF2eDIucHNybHYuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4Mi5wc3Jsdi5xIiwKKyAgImxsdm0ueDg2LmF2eDIucHNybHYucS4yNTYiLAorICAibGx2bS54ODYuYXZ4Mi5wc3Vicy5iIiwKKyAgImxsdm0ueDg2LmF2eDIucHN1YnMudyIsCisgICJsbHZtLng4Ni5hdngyLnBzdWJ1cy5iIiwKKyAgImxsdm0ueDg2LmF2eDIucHN1YnVzLnciLAorICAibGx2bS54ODYuYXZ4NTEyLmJyb2FkY2FzdG1iLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIuYnJvYWRjYXN0bWIuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5icm9hZGNhc3RtYi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLmJyb2FkY2FzdG13LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIuYnJvYWRjYXN0bXcuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5icm9hZGNhc3Rtdy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLmN2dHNpMnNkNjQiLAorICAibGx2bS54ODYuYXZ4NTEyLmN2dHNpMnNzMzIiLAorICAibGx2bS54ODYuYXZ4NTEyLmN2dHNpMnNzNjQiLAorICAibGx2bS54ODYuYXZ4NTEyLmN2dHRzZDJzaSIsCisgICJsbHZtLng4Ni5hdng1MTIuY3Z0dHNkMnNpNjQiLAorICAibGx2bS54ODYuYXZ4NTEyLmN2dHRzZDJ1c2kiLAorICAibGx2bS54ODYuYXZ4NTEyLmN2dHRzZDJ1c2k2NCIsCisgICJsbHZtLng4Ni5hdng1MTIuY3Z0dHNzMnNpIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5jdnR0c3Myc2k2NCIsCisgICJsbHZtLng4Ni5hdng1MTIuY3Z0dHNzMnVzaSIsCisgICJsbHZtLng4Ni5hdng1MTIuY3Z0dHNzMnVzaTY0IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5jdnR1c2kyc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLmN2dHVzaTJzcyIsCisgICJsbHZtLng4Ni5hdng1MTIuY3Z0dXNpNjQyc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLmN2dHVzaTY0MnNzIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5leHAyLnBkIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5leHAyLnBzIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXIuZHBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLmRwaS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlci5kcHEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXIuZHBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLnFwZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlci5xcGkuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXIucXBxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLnFwcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNkaXYyLmRmIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2Mi5kaSIsCisgICJsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2RpdjQuZGYiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNkaXY0LmRpIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2NC5zZiIsCisgICJsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2RpdjQuc2kiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNkaXY4LnNmIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2OC5zaSIsCisgICJsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3NpdjIuZGYiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNzaXYyLmRpIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2NC5kZiIsCisgICJsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3NpdjQuZGkiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNzaXY0LnNmIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2NC5zaSIsCisgICJsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3Npdjguc2YiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNzaXY4LnNpIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXJwZi5kcGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXJwZi5kcHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXJwZi5xcGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXJwZi5xcHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmFkZC5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suYWRkLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5hZGQuc2Qucm91bmQiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suYWRkLnNzLnJvdW5kIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY21wLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jbXAucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY21wLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jbXAucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5zZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jbXAuc3MiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MuYi4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MuYi4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MuYi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MuZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUuYi4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUuYi4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUuYi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUuZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUudy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUudy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Mudy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Mudy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Mudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29uZmxpY3QuZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29uZmxpY3QuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29uZmxpY3QuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29uZmxpY3QucS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29uZmxpY3QucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29uZmxpY3QucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0ZHEycHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dGRxMnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRkcTJwcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQyZHEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMmRxLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJkcS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQycHMiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQycHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJxcS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQycXEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnFxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJ1ZHEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnVkcS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQydWRxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJ1cXEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnVxcS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQydXFxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJkcS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMyZHEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMmRxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJwZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMycGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJxcS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMycXEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnFxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJ1ZHEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnVkcS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMydWRxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJ1cXEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnVxcS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMydXFxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRxcTJwZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cXEycGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHFxMnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRxcTJwcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cXEycHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHFxMnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRzZDJzcy5yb3VuZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRzczJzZC5yb3VuZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQyZHEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJkcS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBkMmRxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQycXEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJxcS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBkMnFxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQydWRxLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQydWRxLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQydWRxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQydXFxLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQydXFxLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQydXFxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMyZHEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJkcS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBzMmRxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMycXEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJxcS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBzMnFxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMydWRxLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMydWRxLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMydWRxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMydXFxLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMydXFxLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMydXFxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1ZHEycHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVkcTJwcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dWRxMnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1cXEycGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVxcTJwZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dXFxMnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1cXEycHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVxcTJwcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dXFxMnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5kYnBzYWRidy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZGJwc2FkYncuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmRicHNhZGJ3LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5kaXYucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmRpdi5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZGl2LnNkLnJvdW5kIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmRpdi5zcy5yb3VuZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQuYi4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmIuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5iLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQuZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5iLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5iLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5iLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5kLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5xLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC53LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC53LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC53LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQudy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLncuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC53LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZml4dXBpbW0ucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmZpeHVwaW1tLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZml4dXBpbW0ucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmZpeHVwaW1tLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5zZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnBzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnNkIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3Muc3MiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5nZXRleHAucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldGV4cC5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnBzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5nZXRleHAucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldGV4cC5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnNkIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldGV4cC5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnBzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnNkIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQuc3MiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2subWF4LnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5tYXgucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLm1heC5zZC5yb3VuZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5tYXguc3Mucm91bmQiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2subWluLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5taW4ucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLm1pbi5zZC5yb3VuZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5taW4uc3Mucm91bmQiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2subXVsLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5tdWwucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLm11bC5zZC5yb3VuZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5tdWwuc3Mucm91bmQiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHMuYi4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHMuYi4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHMuYi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHMudy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHMudy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHMudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHVzLmIuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGR1cy5iLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkdXMuYi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHVzLncuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGR1cy53LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkdXMudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5kZi4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5kZi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5kaS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5kaS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5oaS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5oaS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5oaS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5xaS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5xaS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5xaS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5zZi4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5zZi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5zaS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5zaS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1hZGR1YnMudy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1hZGR1YnMudy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1hZGR1YnMudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1hZGR3LmQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtYWRkdy5kLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbWFkZHcuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kYi4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kYi4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kYi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kYi5tZW0uMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YuZGIubWVtLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmRiLm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kdy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kdy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kdy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kdy5tZW0uMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YuZHcubWVtLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmR3Lm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xYi4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xYi4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xYi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xYi5tZW0uMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucWIubWVtLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFiLm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xZC5tZW0uMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucWQubWVtLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFkLm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xdy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xdy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xdy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xdy5tZW0uMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucXcubWVtLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnF3Lm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi53Yi4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi53Yi4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi53Yi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi53Yi5tZW0uMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Yud2IubWVtLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LndiLm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZGIuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmRiLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kYi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZGIubWVtLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kYi5tZW0uMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmRiLm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZHcuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmR3LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kdy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZHcubWVtLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kdy5tZW0uMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmR3Lm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWIuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFiLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xYi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWIubWVtLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xYi5tZW0uMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFiLm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWQubWVtLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xZC5tZW0uMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFkLm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucXcuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnF3LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xdy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucXcubWVtLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xdy5tZW0uMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnF3Lm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMud2IuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLndiLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy53Yi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMud2IubWVtLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy53Yi5tZW0uMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLndiLm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmRiLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZGIuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kYi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmRiLm1lbS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmRiLm1lbS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmRiLm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmR3LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZHcuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kdy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmR3Lm1lbS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmR3Lm1lbS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmR3Lm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFiLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWIuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xYi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFiLm1lbS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFiLm1lbS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFiLm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFkLm1lbS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFkLm1lbS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFkLm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnF3LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucXcuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xdy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnF3Lm1lbS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnF3Lm1lbS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnF3Lm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLndiLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMud2IuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy53Yi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLndiLm1lbS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLndiLm1lbS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLndiLm1lbS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG11bHRpc2hpZnQucWIuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtdWx0aXNoaWZ0LnFiLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbXVsdGlzaGlmdC5xYi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbC5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sLmQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb2wuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbC5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sLnEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb2wucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbHYuZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbHYuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbHYuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbHYucS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbHYucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbHYucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvci5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9yLmQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb3IuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvci5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9yLnEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb3IucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvcnYuZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvcnYuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvcnYuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvcnYucS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvcnYucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvcnYucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnMuYi4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnMuYi4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnMuYi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnMudy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnMudy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnMudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnVzLmIuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBzdWJ1cy5iLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wc3VidXMuYi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnVzLncuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBzdWJ1cy53LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wc3VidXMudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHRlcm5sb2cuZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHRlcm5sb2cuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHRlcm5sb2cuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHRlcm5sb2cucS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHRlcm5sb2cucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHRlcm5sb2cucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2UucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnJhbmdlLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2UucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnJhbmdlLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2Uuc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2Uuc3MiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5yZWR1Y2UucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnJlZHVjZS5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnBzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5yZWR1Y2UucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnJlZHVjZS5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnNkIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnJlZHVjZS5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5ybmRzY2FsZS5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucm5kc2NhbGUucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5ybmRzY2FsZS5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucm5kc2NhbGUucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5ybmRzY2FsZS5zZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5ybmRzY2FsZS5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnNjYWxlZi5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suc2NhbGVmLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnNjYWxlZi5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suc2NhbGVmLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYuc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suc2NhbGVmLnNzIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQuc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5zdG9yZS5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5zdWIucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnN1Yi5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suc3ViLnNkLnJvdW5kIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnN1Yi5zcy5yb3VuZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52Y3Z0cGgycHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZjdnRwaDJwcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmN2dHBoMnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52Y3Z0cHMycGguMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZjdnRwczJwaC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmN2dHBzMnBoLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZC5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZC5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQuc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkLnNzIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZHN1Yi5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkc3ViLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGRzdWIucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZHN1Yi5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkc3ViLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGRzdWIucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1hZGQucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1hZGQucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1hZGQucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1hZGQucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1hZGQucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1hZGQucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1zdWIucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1zdWIucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1zdWIucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1zdWIucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1zdWIucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1zdWIucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHBidXNkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cGRwYnVzZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcGJ1c2QuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHBidXNkcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcGJ1c2RzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cGRwYnVzZHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHB3c3NkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cGRwd3NzZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcHdzc2QuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHB3c3Nkcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcHdzc2RzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cGRwd3NzZHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIuZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5kLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLmQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIuaGkuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIuaGkuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIuaGkuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5xLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLnEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucWkuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucWkuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucWkuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIuZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5kLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLmQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIuaGkuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIuaGkuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIuaGkuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5xLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLnEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucWkuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucWkuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucWkuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwbWFkZDUyaC51cS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBtYWRkNTJoLnVxLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cG1hZGQ1MmgudXEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwbWFkZDUybC51cS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBtYWRkNTJsLnVxLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cG1hZGQ1MmwudXEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZC5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLmQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZC5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLnEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZC53LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQudy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLncuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYuZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi5kLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LmQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYucS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi5xLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LnEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYudy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi53LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LncuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZC5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLmQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZC5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLnEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZC53LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQudy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLncuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYuZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi5kLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LmQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYucS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi5xLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LnEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYudy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi53LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LncuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2h1ZmJpdHFtYi4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHVmYml0cW1iLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNodWZiaXRxbWIuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQuc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkc3ViLnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkc3ViLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkc3ViLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkc3ViLnBzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkc3ViLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkc3ViLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnBzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnNkIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIuc3MiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1YmFkZC5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1YmFkZC5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1YmFkZC5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1YmFkZC5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1YmFkZC5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1YmFkZC5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm5tc3ViLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZubXN1Yi5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm5tc3ViLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZubXN1Yi5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIuc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIuc3MiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LmZpeHVwaW1tLnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3ouZml4dXBpbW0ucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei5maXh1cGltbS5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LmZpeHVwaW1tLnBzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3ouZml4dXBpbW0ucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei5maXh1cGltbS5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LmZpeHVwaW1tLnNkIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei5maXh1cGltbS5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oucHRlcm5sb2cuZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnB0ZXJubG9nLmQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei5wdGVybmxvZy5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oucHRlcm5sb2cucS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnB0ZXJubG9nLnEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei5wdGVybmxvZy5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnBzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnNkIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQuc3MiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZHN1Yi5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZHN1Yi5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZHN1Yi5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZHN1Yi5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZHN1Yi5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZHN1Yi5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHBidXNkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcGJ1c2QuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGRwYnVzZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHBidXNkcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHBidXNkcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHBidXNkcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHB3c3NkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcHdzc2QuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGRwd3NzZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHB3c3Nkcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHB3c3Nkcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHB3c3Nkcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIuZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIuaGkuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLmhpLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5oaS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucWkuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnFpLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5xaS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwbWFkZDUyaC51cS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwbWFkZDUyaC51cS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwbWFkZDUyaC51cS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwbWFkZDUybC51cS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwbWFkZDUybC51cS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwbWFkZDUybC51cS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYuZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYucS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYudy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYudy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYuZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYucS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYudy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYudy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBhY2tzc2R3LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucGFja3Nzd2IuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wYWNrdXNkdy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBhY2t1c3diLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucG11bC5kcS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBtdWwuaHIuc3cuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wbXVsaC53LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucG11bGh1LncuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wbXVsdS5kcS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzYWQuYncuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc2h1Zi5iLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNsbC5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNsbC5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNsbC53LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNsbGkuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzbGxpLnEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc2xsaS53LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNsbHYuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzbGx2LnEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc2xsdi53LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIucHNsbHYudy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzbGx2LncuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3JhLmQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3JhLnEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3JhLnEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3JhLnEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3JhLncuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3JhaS5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNyYWkucS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmFpLnEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3JhaS5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNyYWkudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmF2LmQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3Jhdi5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIucHNyYXYucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmF2LnEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3Jhdi53LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIucHNyYXYudy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmF2LncuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3JsLmQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3JsLnEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3JsLncuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3JsaS5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNybGkucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmxpLncuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3Jsdi5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNybHYucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmx2LncuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3Jsdi53LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNybHYudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnJjcDE0LnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIucmNwMTQucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5yY3AxNC5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnJjcDE0LnBzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIucmNwMTQucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5yY3AxNC5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnJjcDE0LnNkIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5yY3AxNC5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIucmNwMjgucGQiLAorICAibGx2bS54ODYuYXZ4NTEyLnJjcDI4LnBzIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5yY3AyOC5zZCIsCisgICJsbHZtLng4Ni5hdng1MTIucmNwMjguc3MiLAorICAibGx2bS54ODYuYXZ4NTEyLnJzcXJ0MTQucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5yc3FydDE0LnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnJzcXJ0MTQucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5yc3FydDE0LnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnJzcXJ0MTQuc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLnJzcXJ0MTQuc3MiLAorICAibGx2bS54ODYuYXZ4NTEyLnJzcXJ0MjgucGQiLAorICAibGx2bS54ODYuYXZ4NTEyLnJzcXJ0MjgucHMiLAorICAibGx2bS54ODYuYXZ4NTEyLnJzcXJ0Mjguc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLnJzcXJ0Mjguc3MiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXIuZHBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5kcGkuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyLmRwcS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXIuZHBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5xcGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyLnFwaS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXIucXBxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5xcHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2Mi5kZiIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlcmRpdjIuZGkiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJkaXY0LmRmIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2NC5kaSIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlcmRpdjQuc2YiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJkaXY0LnNpIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2OC5zZiIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlcmRpdjguc2kiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJwZi5kcGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVycGYuZHBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnBmLnFwZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJwZi5xcHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2Mi5kZiIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnNpdjIuZGkiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJzaXY0LmRmIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2NC5kaSIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnNpdjQuc2YiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJzaXY0LnNpIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2OC5zZiIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnNpdjguc2kiLAorICAibGx2bS54ODYuYXZ4NTEyLnZicm9hZGNhc3Quc2QuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi52YnJvYWRjYXN0LnNzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIudmNvbWkuc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLnZjb21pLnNzIiwKKyAgImxsdm0ueDg2LmF2eDUxMi52Y3Z0c2Qyc2kzMiIsCisgICJsbHZtLng4Ni5hdng1MTIudmN2dHNkMnNpNjQiLAorICAibGx2bS54ODYuYXZ4NTEyLnZjdnRzZDJ1c2kzMiIsCisgICJsbHZtLng4Ni5hdng1MTIudmN2dHNkMnVzaTY0IiwKKyAgImxsdm0ueDg2LmF2eDUxMi52Y3Z0c3Myc2kzMiIsCisgICJsbHZtLng4Ni5hdng1MTIudmN2dHNzMnNpNjQiLAorICAibGx2bS54ODYuYXZ4NTEyLnZjdnRzczJ1c2kzMiIsCisgICJsbHZtLng4Ni5hdng1MTIudmN2dHNzMnVzaTY0IiwKKyAgImxsdm0ueDg2LmF2eDUxMi52cGVybWlsdmFyLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIudnBlcm1pbHZhci5wcy41MTIiLAorICAibGx2bS54ODYuYm1pLmJleHRyLjMyIiwKKyAgImxsdm0ueDg2LmJtaS5iZXh0ci42NCIsCisgICJsbHZtLng4Ni5ibWkuYnpoaS4zMiIsCisgICJsbHZtLng4Ni5ibWkuYnpoaS42NCIsCisgICJsbHZtLng4Ni5ibWkucGRlcC4zMiIsCisgICJsbHZtLng4Ni5ibWkucGRlcC42NCIsCisgICJsbHZtLng4Ni5ibWkucGV4dC4zMiIsCisgICJsbHZtLng4Ni5ibWkucGV4dC42NCIsCisgICJsbHZtLng4Ni5jbGZsdXNob3B0IiwKKyAgImxsdm0ueDg2LmNscnNzYnN5IiwKKyAgImxsdm0ueDg2LmNsd2IiLAorICAibGx2bS54ODYuY2x6ZXJvIiwKKyAgImxsdm0ueDg2LmZsYWdzLnJlYWQudTMyIiwKKyAgImxsdm0ueDg2LmZsYWdzLnJlYWQudTY0IiwKKyAgImxsdm0ueDg2LmZsYWdzLndyaXRlLnUzMiIsCisgICJsbHZtLng4Ni5mbGFncy53cml0ZS51NjQiLAorICAibGx2bS54ODYuZm1hLnZmbWFkZC5wZCIsCisgICJsbHZtLng4Ni5mbWEudmZtYWRkLnBkLjI1NiIsCisgICJsbHZtLng4Ni5mbWEudmZtYWRkLnBzIiwKKyAgImxsdm0ueDg2LmZtYS52Zm1hZGQucHMuMjU2IiwKKyAgImxsdm0ueDg2LmZtYS52Zm1hZGQuc2QiLAorICAibGx2bS54ODYuZm1hLnZmbWFkZC5zcyIsCisgICJsbHZtLng4Ni5mbWEudmZtYWRkc3ViLnBkIiwKKyAgImxsdm0ueDg2LmZtYS52Zm1hZGRzdWIucGQuMjU2IiwKKyAgImxsdm0ueDg2LmZtYS52Zm1hZGRzdWIucHMiLAorICAibGx2bS54ODYuZm1hLnZmbWFkZHN1Yi5wcy4yNTYiLAorICAibGx2bS54ODYuZm1hLnZmbXN1Yi5wZCIsCisgICJsbHZtLng4Ni5mbWEudmZtc3ViLnBkLjI1NiIsCisgICJsbHZtLng4Ni5mbWEudmZtc3ViLnBzIiwKKyAgImxsdm0ueDg2LmZtYS52Zm1zdWIucHMuMjU2IiwKKyAgImxsdm0ueDg2LmZtYS52Zm1zdWIuc2QiLAorICAibGx2bS54ODYuZm1hLnZmbXN1Yi5zcyIsCisgICJsbHZtLng4Ni5mbWEudmZtc3ViYWRkLnBkIiwKKyAgImxsdm0ueDg2LmZtYS52Zm1zdWJhZGQucGQuMjU2IiwKKyAgImxsdm0ueDg2LmZtYS52Zm1zdWJhZGQucHMiLAorICAibGx2bS54ODYuZm1hLnZmbXN1YmFkZC5wcy4yNTYiLAorICAibGx2bS54ODYuZm1hLnZmbm1hZGQucGQiLAorICAibGx2bS54ODYuZm1hLnZmbm1hZGQucGQuMjU2IiwKKyAgImxsdm0ueDg2LmZtYS52Zm5tYWRkLnBzIiwKKyAgImxsdm0ueDg2LmZtYS52Zm5tYWRkLnBzLjI1NiIsCisgICJsbHZtLng4Ni5mbWEudmZubWFkZC5zZCIsCisgICJsbHZtLng4Ni5mbWEudmZubWFkZC5zcyIsCisgICJsbHZtLng4Ni5mbWEudmZubXN1Yi5wZCIsCisgICJsbHZtLng4Ni5mbWEudmZubXN1Yi5wZC4yNTYiLAorICAibGx2bS54ODYuZm1hLnZmbm1zdWIucHMiLAorICAibGx2bS54ODYuZm1hLnZmbm1zdWIucHMuMjU2IiwKKyAgImxsdm0ueDg2LmZtYS52Zm5tc3ViLnNkIiwKKyAgImxsdm0ueDg2LmZtYS52Zm5tc3ViLnNzIiwKKyAgImxsdm0ueDg2LmZtYTQudmZtYWRkLnNkIiwKKyAgImxsdm0ueDg2LmZtYTQudmZtYWRkLnNzIiwKKyAgImxsdm0ueDg2LmZ4cnN0b3IiLAorICAibGx2bS54ODYuZnhyc3RvcjY0IiwKKyAgImxsdm0ueDg2LmZ4c2F2ZSIsCisgICJsbHZtLng4Ni5meHNhdmU2NCIsCisgICJsbHZtLng4Ni5pbmNzc3BkIiwKKyAgImxsdm0ueDg2LmluY3NzcHEiLAorICAibGx2bS54ODYuaW50IiwKKyAgImxsdm0ueDg2Lmxsd3BjYiIsCisgICJsbHZtLng4Ni5sd3BpbnMzMiIsCisgICJsbHZtLng4Ni5sd3BpbnM2NCIsCisgICJsbHZtLng4Ni5sd3B2YWwzMiIsCisgICJsbHZtLng4Ni5sd3B2YWw2NCIsCisgICJsbHZtLng4Ni5tbXguZW1tcyIsCisgICJsbHZtLng4Ni5tbXguZmVtbXMiLAorICAibGx2bS54ODYubW14Lm1hc2ttb3ZxIiwKKyAgImxsdm0ueDg2Lm1teC5tb3ZudC5kcSIsCisgICJsbHZtLng4Ni5tbXgucGFja3NzZHciLAorICAibGx2bS54ODYubW14LnBhY2tzc3diIiwKKyAgImxsdm0ueDg2Lm1teC5wYWNrdXN3YiIsCisgICJsbHZtLng4Ni5tbXgucGFkZC5iIiwKKyAgImxsdm0ueDg2Lm1teC5wYWRkLmQiLAorICAibGx2bS54ODYubW14LnBhZGQucSIsCisgICJsbHZtLng4Ni5tbXgucGFkZC53IiwKKyAgImxsdm0ueDg2Lm1teC5wYWRkcy5iIiwKKyAgImxsdm0ueDg2Lm1teC5wYWRkcy53IiwKKyAgImxsdm0ueDg2Lm1teC5wYWRkdXMuYiIsCisgICJsbHZtLng4Ni5tbXgucGFkZHVzLnciLAorICAibGx2bS54ODYubW14LnBhbGlnbnIuYiIsCisgICJsbHZtLng4Ni5tbXgucGFuZCIsCisgICJsbHZtLng4Ni5tbXgucGFuZG4iLAorICAibGx2bS54ODYubW14LnBhdmcuYiIsCisgICJsbHZtLng4Ni5tbXgucGF2Zy53IiwKKyAgImxsdm0ueDg2Lm1teC5wY21wZXEuYiIsCisgICJsbHZtLng4Ni5tbXgucGNtcGVxLmQiLAorICAibGx2bS54ODYubW14LnBjbXBlcS53IiwKKyAgImxsdm0ueDg2Lm1teC5wY21wZ3QuYiIsCisgICJsbHZtLng4Ni5tbXgucGNtcGd0LmQiLAorICAibGx2bS54ODYubW14LnBjbXBndC53IiwKKyAgImxsdm0ueDg2Lm1teC5wZXh0ci53IiwKKyAgImxsdm0ueDg2Lm1teC5waW5zci53IiwKKyAgImxsdm0ueDg2Lm1teC5wbWFkZC53ZCIsCisgICJsbHZtLng4Ni5tbXgucG1heHMudyIsCisgICJsbHZtLng4Ni5tbXgucG1heHUuYiIsCisgICJsbHZtLng4Ni5tbXgucG1pbnMudyIsCisgICJsbHZtLng4Ni5tbXgucG1pbnUuYiIsCisgICJsbHZtLng4Ni5tbXgucG1vdm1za2IiLAorICAibGx2bS54ODYubW14LnBtdWxoLnciLAorICAibGx2bS54ODYubW14LnBtdWxodS53IiwKKyAgImxsdm0ueDg2Lm1teC5wbXVsbC53IiwKKyAgImxsdm0ueDg2Lm1teC5wbXVsdS5kcSIsCisgICJsbHZtLng4Ni5tbXgucG9yIiwKKyAgImxsdm0ueDg2Lm1teC5wc2FkLmJ3IiwKKyAgImxsdm0ueDg2Lm1teC5wc2xsLmQiLAorICAibGx2bS54ODYubW14LnBzbGwucSIsCisgICJsbHZtLng4Ni5tbXgucHNsbC53IiwKKyAgImxsdm0ueDg2Lm1teC5wc2xsaS5kIiwKKyAgImxsdm0ueDg2Lm1teC5wc2xsaS5xIiwKKyAgImxsdm0ueDg2Lm1teC5wc2xsaS53IiwKKyAgImxsdm0ueDg2Lm1teC5wc3JhLmQiLAorICAibGx2bS54ODYubW14LnBzcmEudyIsCisgICJsbHZtLng4Ni5tbXgucHNyYWkuZCIsCisgICJsbHZtLng4Ni5tbXgucHNyYWkudyIsCisgICJsbHZtLng4Ni5tbXgucHNybC5kIiwKKyAgImxsdm0ueDg2Lm1teC5wc3JsLnEiLAorICAibGx2bS54ODYubW14LnBzcmwudyIsCisgICJsbHZtLng4Ni5tbXgucHNybGkuZCIsCisgICJsbHZtLng4Ni5tbXgucHNybGkucSIsCisgICJsbHZtLng4Ni5tbXgucHNybGkudyIsCisgICJsbHZtLng4Ni5tbXgucHN1Yi5iIiwKKyAgImxsdm0ueDg2Lm1teC5wc3ViLmQiLAorICAibGx2bS54ODYubW14LnBzdWIucSIsCisgICJsbHZtLng4Ni5tbXgucHN1Yi53IiwKKyAgImxsdm0ueDg2Lm1teC5wc3Vicy5iIiwKKyAgImxsdm0ueDg2Lm1teC5wc3Vicy53IiwKKyAgImxsdm0ueDg2Lm1teC5wc3VidXMuYiIsCisgICJsbHZtLng4Ni5tbXgucHN1YnVzLnciLAorICAibGx2bS54ODYubW14LnB1bnBja2hidyIsCisgICJsbHZtLng4Ni5tbXgucHVucGNraGRxIiwKKyAgImxsdm0ueDg2Lm1teC5wdW5wY2tod2QiLAorICAibGx2bS54ODYubW14LnB1bnBja2xidyIsCisgICJsbHZtLng4Ni5tbXgucHVucGNrbGRxIiwKKyAgImxsdm0ueDg2Lm1teC5wdW5wY2tsd2QiLAorICAibGx2bS54ODYubW14LnB4b3IiLAorICAibGx2bS54ODYubW9uaXRvcngiLAorICAibGx2bS54ODYubXdhaXR4IiwKKyAgImxsdm0ueDg2LnBjbG11bHFkcSIsCisgICJsbHZtLng4Ni5wY2xtdWxxZHEuMjU2IiwKKyAgImxsdm0ueDg2LnBjbG11bHFkcS41MTIiLAorICAibGx2bS54ODYucmRmc2Jhc2UuMzIiLAorICAibGx2bS54ODYucmRmc2Jhc2UuNjQiLAorICAibGx2bS54ODYucmRnc2Jhc2UuMzIiLAorICAibGx2bS54ODYucmRnc2Jhc2UuNjQiLAorICAibGx2bS54ODYucmRwaWQiLAorICAibGx2bS54ODYucmRwa3J1IiwKKyAgImxsdm0ueDg2LnJkcG1jIiwKKyAgImxsdm0ueDg2LnJkcmFuZC4xNiIsCisgICJsbHZtLng4Ni5yZHJhbmQuMzIiLAorICAibGx2bS54ODYucmRyYW5kLjY0IiwKKyAgImxsdm0ueDg2LnJkc2VlZC4xNiIsCisgICJsbHZtLng4Ni5yZHNlZWQuMzIiLAorICAibGx2bS54ODYucmRzZWVkLjY0IiwKKyAgImxsdm0ueDg2LnJkc3NwZCIsCisgICJsbHZtLng4Ni5yZHNzcHEiLAorICAibGx2bS54ODYucmR0c2MiLAorICAibGx2bS54ODYucmR0c2NwIiwKKyAgImxsdm0ueDg2LnJzdG9yc3NwIiwKKyAgImxsdm0ueDg2LnNhdmVwcmV2c3NwIiwKKyAgImxsdm0ueDg2LnNlaC5laGd1YXJkIiwKKyAgImxsdm0ueDg2LnNlaC5laHJlZ25vZGUiLAorICAibGx2bS54ODYuc2VoLmxzZGEiLAorICAibGx2bS54ODYuc2VoLnJlY292ZXJmcCIsCisgICJsbHZtLng4Ni5zZXRzc2JzeSIsCisgICJsbHZtLng4Ni5zaGExbXNnMSIsCisgICJsbHZtLng4Ni5zaGExbXNnMiIsCisgICJsbHZtLng4Ni5zaGExbmV4dGUiLAorICAibGx2bS54ODYuc2hhMXJuZHM0IiwKKyAgImxsdm0ueDg2LnNoYTI1Nm1zZzEiLAorICAibGx2bS54ODYuc2hhMjU2bXNnMiIsCisgICJsbHZtLng4Ni5zaGEyNTZybmRzMiIsCisgICJsbHZtLng4Ni5zbHdwY2IiLAorICAibGx2bS54ODYuc3NlLmNtcC5wcyIsCisgICJsbHZtLng4Ni5zc2UuY21wLnNzIiwKKyAgImxsdm0ueDg2LnNzZS5jb21pZXEuc3MiLAorICAibGx2bS54ODYuc3NlLmNvbWlnZS5zcyIsCisgICJsbHZtLng4Ni5zc2UuY29taWd0LnNzIiwKKyAgImxsdm0ueDg2LnNzZS5jb21pbGUuc3MiLAorICAibGx2bS54ODYuc3NlLmNvbWlsdC5zcyIsCisgICJsbHZtLng4Ni5zc2UuY29taW5lcS5zcyIsCisgICJsbHZtLng4Ni5zc2UuY3Z0cGQycGkiLAorICAibGx2bS54ODYuc3NlLmN2dHBpMnBkIiwKKyAgImxsdm0ueDg2LnNzZS5jdnRwaTJwcyIsCisgICJsbHZtLng4Ni5zc2UuY3Z0cHMycGkiLAorICAibGx2bS54ODYuc3NlLmN2dHNpMnNzIiwKKyAgImxsdm0ueDg2LnNzZS5jdnRzaTY0MnNzIiwKKyAgImxsdm0ueDg2LnNzZS5jdnRzczJzaSIsCisgICJsbHZtLng4Ni5zc2UuY3Z0c3Myc2k2NCIsCisgICJsbHZtLng4Ni5zc2UuY3Z0dHBkMnBpIiwKKyAgImxsdm0ueDg2LnNzZS5jdnR0cHMycGkiLAorICAibGx2bS54ODYuc3NlLmN2dHRzczJzaSIsCisgICJsbHZtLng4Ni5zc2UuY3Z0dHNzMnNpNjQiLAorICAibGx2bS54ODYuc3NlLmxkbXhjc3IiLAorICAibGx2bS54ODYuc3NlLm1heC5wcyIsCisgICJsbHZtLng4Ni5zc2UubWF4LnNzIiwKKyAgImxsdm0ueDg2LnNzZS5taW4ucHMiLAorICAibGx2bS54ODYuc3NlLm1pbi5zcyIsCisgICJsbHZtLng4Ni5zc2UubW92bXNrLnBzIiwKKyAgImxsdm0ueDg2LnNzZS5wc2h1Zi53IiwKKyAgImxsdm0ueDg2LnNzZS5yY3AucHMiLAorICAibGx2bS54ODYuc3NlLnJjcC5zcyIsCisgICJsbHZtLng4Ni5zc2UucnNxcnQucHMiLAorICAibGx2bS54ODYuc3NlLnJzcXJ0LnNzIiwKKyAgImxsdm0ueDg2LnNzZS5zZmVuY2UiLAorICAibGx2bS54ODYuc3NlLnNxcnQucHMiLAorICAibGx2bS54ODYuc3NlLnNxcnQuc3MiLAorICAibGx2bS54ODYuc3NlLnN0bXhjc3IiLAorICAibGx2bS54ODYuc3NlLnVjb21pZXEuc3MiLAorICAibGx2bS54ODYuc3NlLnVjb21pZ2Uuc3MiLAorICAibGx2bS54ODYuc3NlLnVjb21pZ3Quc3MiLAorICAibGx2bS54ODYuc3NlLnVjb21pbGUuc3MiLAorICAibGx2bS54ODYuc3NlLnVjb21pbHQuc3MiLAorICAibGx2bS54ODYuc3NlLnVjb21pbmVxLnNzIiwKKyAgImxsdm0ueDg2LnNzZTIuY2xmbHVzaCIsCisgICJsbHZtLng4Ni5zc2UyLmNtcC5wZCIsCisgICJsbHZtLng4Ni5zc2UyLmNtcC5zZCIsCisgICJsbHZtLng4Ni5zc2UyLmNvbWllcS5zZCIsCisgICJsbHZtLng4Ni5zc2UyLmNvbWlnZS5zZCIsCisgICJsbHZtLng4Ni5zc2UyLmNvbWlndC5zZCIsCisgICJsbHZtLng4Ni5zc2UyLmNvbWlsZS5zZCIsCisgICJsbHZtLng4Ni5zc2UyLmNvbWlsdC5zZCIsCisgICJsbHZtLng4Ni5zc2UyLmNvbWluZXEuc2QiLAorICAibGx2bS54ODYuc3NlMi5jdnRkcTJwcyIsCisgICJsbHZtLng4Ni5zc2UyLmN2dHBkMmRxIiwKKyAgImxsdm0ueDg2LnNzZTIuY3Z0cGQycHMiLAorICAibGx2bS54ODYuc3NlMi5jdnRwczJkcSIsCisgICJsbHZtLng4Ni5zc2UyLmN2dHNkMnNpIiwKKyAgImxsdm0ueDg2LnNzZTIuY3Z0c2Qyc2k2NCIsCisgICJsbHZtLng4Ni5zc2UyLmN2dHNkMnNzIiwKKyAgImxsdm0ueDg2LnNzZTIuY3Z0c2kyc2QiLAorICAibGx2bS54ODYuc3NlMi5jdnRzaTY0MnNkIiwKKyAgImxsdm0ueDg2LnNzZTIuY3Z0c3Myc2QiLAorICAibGx2bS54ODYuc3NlMi5jdnR0cGQyZHEiLAorICAibGx2bS54ODYuc3NlMi5jdnR0cHMyZHEiLAorICAibGx2bS54ODYuc3NlMi5jdnR0c2Qyc2kiLAorICAibGx2bS54ODYuc3NlMi5jdnR0c2Qyc2k2NCIsCisgICJsbHZtLng4Ni5zc2UyLmxmZW5jZSIsCisgICJsbHZtLng4Ni5zc2UyLm1hc2ttb3YuZHF1IiwKKyAgImxsdm0ueDg2LnNzZTIubWF4LnBkIiwKKyAgImxsdm0ueDg2LnNzZTIubWF4LnNkIiwKKyAgImxsdm0ueDg2LnNzZTIubWZlbmNlIiwKKyAgImxsdm0ueDg2LnNzZTIubWluLnBkIiwKKyAgImxsdm0ueDg2LnNzZTIubWluLnNkIiwKKyAgImxsdm0ueDg2LnNzZTIubW92bXNrLnBkIiwKKyAgImxsdm0ueDg2LnNzZTIucGFja3NzZHcuMTI4IiwKKyAgImxsdm0ueDg2LnNzZTIucGFja3Nzd2IuMTI4IiwKKyAgImxsdm0ueDg2LnNzZTIucGFja3Vzd2IuMTI4IiwKKyAgImxsdm0ueDg2LnNzZTIucGFkZHMuYiIsCisgICJsbHZtLng4Ni5zc2UyLnBhZGRzLnciLAorICAibGx2bS54ODYuc3NlMi5wYWRkdXMuYiIsCisgICJsbHZtLng4Ni5zc2UyLnBhZGR1cy53IiwKKyAgImxsdm0ueDg2LnNzZTIucGF1c2UiLAorICAibGx2bS54ODYuc3NlMi5wbWFkZC53ZCIsCisgICJsbHZtLng4Ni5zc2UyLnBtb3Ztc2tiLjEyOCIsCisgICJsbHZtLng4Ni5zc2UyLnBtdWxoLnciLAorICAibGx2bS54ODYuc3NlMi5wbXVsaHUudyIsCisgICJsbHZtLng4Ni5zc2UyLnBtdWx1LmRxIiwKKyAgImxsdm0ueDg2LnNzZTIucHNhZC5idyIsCisgICJsbHZtLng4Ni5zc2UyLnBzbGwuZCIsCisgICJsbHZtLng4Ni5zc2UyLnBzbGwucSIsCisgICJsbHZtLng4Ni5zc2UyLnBzbGwudyIsCisgICJsbHZtLng4Ni5zc2UyLnBzbGxpLmQiLAorICAibGx2bS54ODYuc3NlMi5wc2xsaS5xIiwKKyAgImxsdm0ueDg2LnNzZTIucHNsbGkudyIsCisgICJsbHZtLng4Ni5zc2UyLnBzcmEuZCIsCisgICJsbHZtLng4Ni5zc2UyLnBzcmEudyIsCisgICJsbHZtLng4Ni5zc2UyLnBzcmFpLmQiLAorICAibGx2bS54ODYuc3NlMi5wc3JhaS53IiwKKyAgImxsdm0ueDg2LnNzZTIucHNybC5kIiwKKyAgImxsdm0ueDg2LnNzZTIucHNybC5xIiwKKyAgImxsdm0ueDg2LnNzZTIucHNybC53IiwKKyAgImxsdm0ueDg2LnNzZTIucHNybGkuZCIsCisgICJsbHZtLng4Ni5zc2UyLnBzcmxpLnEiLAorICAibGx2bS54ODYuc3NlMi5wc3JsaS53IiwKKyAgImxsdm0ueDg2LnNzZTIucHN1YnMuYiIsCisgICJsbHZtLng4Ni5zc2UyLnBzdWJzLnciLAorICAibGx2bS54ODYuc3NlMi5wc3VidXMuYiIsCisgICJsbHZtLng4Ni5zc2UyLnBzdWJ1cy53IiwKKyAgImxsdm0ueDg2LnNzZTIuc3FydC5wZCIsCisgICJsbHZtLng4Ni5zc2UyLnNxcnQuc2QiLAorICAibGx2bS54ODYuc3NlMi51Y29taWVxLnNkIiwKKyAgImxsdm0ueDg2LnNzZTIudWNvbWlnZS5zZCIsCisgICJsbHZtLng4Ni5zc2UyLnVjb21pZ3Quc2QiLAorICAibGx2bS54ODYuc3NlMi51Y29taWxlLnNkIiwKKyAgImxsdm0ueDg2LnNzZTIudWNvbWlsdC5zZCIsCisgICJsbHZtLng4Ni5zc2UyLnVjb21pbmVxLnNkIiwKKyAgImxsdm0ueDg2LnNzZTMuYWRkc3ViLnBkIiwKKyAgImxsdm0ueDg2LnNzZTMuYWRkc3ViLnBzIiwKKyAgImxsdm0ueDg2LnNzZTMuaGFkZC5wZCIsCisgICJsbHZtLng4Ni5zc2UzLmhhZGQucHMiLAorICAibGx2bS54ODYuc3NlMy5oc3ViLnBkIiwKKyAgImxsdm0ueDg2LnNzZTMuaHN1Yi5wcyIsCisgICJsbHZtLng4Ni5zc2UzLmxkdS5kcSIsCisgICJsbHZtLng4Ni5zc2UzLm1vbml0b3IiLAorICAibGx2bS54ODYuc3NlMy5td2FpdCIsCisgICJsbHZtLng4Ni5zc2U0MS5ibGVuZHZwZCIsCisgICJsbHZtLng4Ni5zc2U0MS5ibGVuZHZwcyIsCisgICJsbHZtLng4Ni5zc2U0MS5kcHBkIiwKKyAgImxsdm0ueDg2LnNzZTQxLmRwcHMiLAorICAibGx2bS54ODYuc3NlNDEuaW5zZXJ0cHMiLAorICAibGx2bS54ODYuc3NlNDEubXBzYWRidyIsCisgICJsbHZtLng4Ni5zc2U0MS5wYWNrdXNkdyIsCisgICJsbHZtLng4Ni5zc2U0MS5wYmxlbmR2YiIsCisgICJsbHZtLng4Ni5zc2U0MS5waG1pbnBvc3V3IiwKKyAgImxsdm0ueDg2LnNzZTQxLnBtdWxkcSIsCisgICJsbHZtLng4Ni5zc2U0MS5wdGVzdGMiLAorICAibGx2bS54ODYuc3NlNDEucHRlc3RuemMiLAorICAibGx2bS54ODYuc3NlNDEucHRlc3R6IiwKKyAgImxsdm0ueDg2LnNzZTQxLnJvdW5kLnBkIiwKKyAgImxsdm0ueDg2LnNzZTQxLnJvdW5kLnBzIiwKKyAgImxsdm0ueDg2LnNzZTQxLnJvdW5kLnNkIiwKKyAgImxsdm0ueDg2LnNzZTQxLnJvdW5kLnNzIiwKKyAgImxsdm0ueDg2LnNzZTQyLmNyYzMyLjMyLjE2IiwKKyAgImxsdm0ueDg2LnNzZTQyLmNyYzMyLjMyLjMyIiwKKyAgImxsdm0ueDg2LnNzZTQyLmNyYzMyLjMyLjgiLAorICAibGx2bS54ODYuc3NlNDIuY3JjMzIuNjQuNjQiLAorICAibGx2bS54ODYuc3NlNDIucGNtcGVzdHJpMTI4IiwKKyAgImxsdm0ueDg2LnNzZTQyLnBjbXBlc3RyaWExMjgiLAorICAibGx2bS54ODYuc3NlNDIucGNtcGVzdHJpYzEyOCIsCisgICJsbHZtLng4Ni5zc2U0Mi5wY21wZXN0cmlvMTI4IiwKKyAgImxsdm0ueDg2LnNzZTQyLnBjbXBlc3RyaXMxMjgiLAorICAibGx2bS54ODYuc3NlNDIucGNtcGVzdHJpejEyOCIsCisgICJsbHZtLng4Ni5zc2U0Mi5wY21wZXN0cm0xMjgiLAorICAibGx2bS54ODYuc3NlNDIucGNtcGlzdHJpMTI4IiwKKyAgImxsdm0ueDg2LnNzZTQyLnBjbXBpc3RyaWExMjgiLAorICAibGx2bS54ODYuc3NlNDIucGNtcGlzdHJpYzEyOCIsCisgICJsbHZtLng4Ni5zc2U0Mi5wY21waXN0cmlvMTI4IiwKKyAgImxsdm0ueDg2LnNzZTQyLnBjbXBpc3RyaXMxMjgiLAorICAibGx2bS54ODYuc3NlNDIucGNtcGlzdHJpejEyOCIsCisgICJsbHZtLng4Ni5zc2U0Mi5wY21waXN0cm0xMjgiLAorICAibGx2bS54ODYuc3NlNGEuZXh0cnEiLAorICAibGx2bS54ODYuc3NlNGEuZXh0cnFpIiwKKyAgImxsdm0ueDg2LnNzZTRhLmluc2VydHEiLAorICAibGx2bS54ODYuc3NlNGEuaW5zZXJ0cWkiLAorICAibGx2bS54ODYuc3NzZTMucGFicy5iIiwKKyAgImxsdm0ueDg2LnNzc2UzLnBhYnMuZCIsCisgICJsbHZtLng4Ni5zc3NlMy5wYWJzLnciLAorICAibGx2bS54ODYuc3NzZTMucGhhZGQuZCIsCisgICJsbHZtLng4Ni5zc3NlMy5waGFkZC5kLjEyOCIsCisgICJsbHZtLng4Ni5zc3NlMy5waGFkZC5zdyIsCisgICJsbHZtLng4Ni5zc3NlMy5waGFkZC5zdy4xMjgiLAorICAibGx2bS54ODYuc3NzZTMucGhhZGQudyIsCisgICJsbHZtLng4Ni5zc3NlMy5waGFkZC53LjEyOCIsCisgICJsbHZtLng4Ni5zc3NlMy5waHN1Yi5kIiwKKyAgImxsdm0ueDg2LnNzc2UzLnBoc3ViLmQuMTI4IiwKKyAgImxsdm0ueDg2LnNzc2UzLnBoc3ViLnN3IiwKKyAgImxsdm0ueDg2LnNzc2UzLnBoc3ViLnN3LjEyOCIsCisgICJsbHZtLng4Ni5zc3NlMy5waHN1Yi53IiwKKyAgImxsdm0ueDg2LnNzc2UzLnBoc3ViLncuMTI4IiwKKyAgImxsdm0ueDg2LnNzc2UzLnBtYWRkLnViLnN3IiwKKyAgImxsdm0ueDg2LnNzc2UzLnBtYWRkLnViLnN3LjEyOCIsCisgICJsbHZtLng4Ni5zc3NlMy5wbXVsLmhyLnN3IiwKKyAgImxsdm0ueDg2LnNzc2UzLnBtdWwuaHIuc3cuMTI4IiwKKyAgImxsdm0ueDg2LnNzc2UzLnBzaHVmLmIiLAorICAibGx2bS54ODYuc3NzZTMucHNodWYuYi4xMjgiLAorICAibGx2bS54ODYuc3NzZTMucHNpZ24uYiIsCisgICJsbHZtLng4Ni5zc3NlMy5wc2lnbi5iLjEyOCIsCisgICJsbHZtLng4Ni5zc3NlMy5wc2lnbi5kIiwKKyAgImxsdm0ueDg2LnNzc2UzLnBzaWduLmQuMTI4IiwKKyAgImxsdm0ueDg2LnNzc2UzLnBzaWduLnciLAorICAibGx2bS54ODYuc3NzZTMucHNpZ24udy4xMjgiLAorICAibGx2bS54ODYuc3ViYm9ycm93LnUzMiIsCisgICJsbHZtLng4Ni5zdWJib3Jyb3cudTY0IiwKKyAgImxsdm0ueDg2LnRibS5iZXh0cmkudTMyIiwKKyAgImxsdm0ueDg2LnRibS5iZXh0cmkudTY0IiwKKyAgImxsdm0ueDg2LnZjdnRwaDJwcy4xMjgiLAorICAibGx2bS54ODYudmN2dHBoMnBzLjI1NiIsCisgICJsbHZtLng4Ni52Y3Z0cHMycGguMTI4IiwKKyAgImxsdm0ueDg2LnZjdnRwczJwaC4yNTYiLAorICAibGx2bS54ODYudmdmMnA4YWZmaW5laW52cWIuMTI4IiwKKyAgImxsdm0ueDg2LnZnZjJwOGFmZmluZWludnFiLjI1NiIsCisgICJsbHZtLng4Ni52Z2YycDhhZmZpbmVpbnZxYi41MTIiLAorICAibGx2bS54ODYudmdmMnA4YWZmaW5lcWIuMTI4IiwKKyAgImxsdm0ueDg2LnZnZjJwOGFmZmluZXFiLjI1NiIsCisgICJsbHZtLng4Ni52Z2YycDhhZmZpbmVxYi41MTIiLAorICAibGx2bS54ODYudmdmMnA4bXVsYi4xMjgiLAorICAibGx2bS54ODYudmdmMnA4bXVsYi4yNTYiLAorICAibGx2bS54ODYudmdmMnA4bXVsYi41MTIiLAorICAibGx2bS54ODYud3Jmc2Jhc2UuMzIiLAorICAibGx2bS54ODYud3Jmc2Jhc2UuNjQiLAorICAibGx2bS54ODYud3Jnc2Jhc2UuMzIiLAorICAibGx2bS54ODYud3Jnc2Jhc2UuNjQiLAorICAibGx2bS54ODYud3Jwa3J1IiwKKyAgImxsdm0ueDg2Lndyc3NkIiwKKyAgImxsdm0ueDg2Lndyc3NxIiwKKyAgImxsdm0ueDg2LndydXNzZCIsCisgICJsbHZtLng4Ni53cnVzc3EiLAorICAibGx2bS54ODYueGFib3J0IiwKKyAgImxsdm0ueDg2LnhiZWdpbiIsCisgICJsbHZtLng4Ni54ZW5kIiwKKyAgImxsdm0ueDg2LnhnZXRidiIsCisgICJsbHZtLng4Ni54b3AudmZyY3oucGQiLAorICAibGx2bS54ODYueG9wLnZmcmN6LnBkLjI1NiIsCisgICJsbHZtLng4Ni54b3AudmZyY3oucHMiLAorICAibGx2bS54ODYueG9wLnZmcmN6LnBzLjI1NiIsCisgICJsbHZtLng4Ni54b3AudmZyY3ouc2QiLAorICAibGx2bS54ODYueG9wLnZmcmN6LnNzIiwKKyAgImxsdm0ueDg2LnhvcC52cGNvbWIiLAorICAibGx2bS54ODYueG9wLnZwY29tZCIsCisgICJsbHZtLng4Ni54b3AudnBjb21xIiwKKyAgImxsdm0ueDg2LnhvcC52cGNvbXViIiwKKyAgImxsdm0ueDg2LnhvcC52cGNvbXVkIiwKKyAgImxsdm0ueDg2LnhvcC52cGNvbXVxIiwKKyAgImxsdm0ueDg2LnhvcC52cGNvbXV3IiwKKyAgImxsdm0ueDg2LnhvcC52cGNvbXciLAorICAibGx2bS54ODYueG9wLnZwZXJtaWwycGQiLAorICAibGx2bS54ODYueG9wLnZwZXJtaWwycGQuMjU2IiwKKyAgImxsdm0ueDg2LnhvcC52cGVybWlsMnBzIiwKKyAgImxsdm0ueDg2LnhvcC52cGVybWlsMnBzLjI1NiIsCisgICJsbHZtLng4Ni54b3AudnBoYWRkYmQiLAorICAibGx2bS54ODYueG9wLnZwaGFkZGJxIiwKKyAgImxsdm0ueDg2LnhvcC52cGhhZGRidyIsCisgICJsbHZtLng4Ni54b3AudnBoYWRkZHEiLAorICAibGx2bS54ODYueG9wLnZwaGFkZHViZCIsCisgICJsbHZtLng4Ni54b3AudnBoYWRkdWJxIiwKKyAgImxsdm0ueDg2LnhvcC52cGhhZGR1YnciLAorICAibGx2bS54ODYueG9wLnZwaGFkZHVkcSIsCisgICJsbHZtLng4Ni54b3AudnBoYWRkdXdkIiwKKyAgImxsdm0ueDg2LnhvcC52cGhhZGR1d3EiLAorICAibGx2bS54ODYueG9wLnZwaGFkZHdkIiwKKyAgImxsdm0ueDg2LnhvcC52cGhhZGR3cSIsCisgICJsbHZtLng4Ni54b3AudnBoc3ViYnciLAorICAibGx2bS54ODYueG9wLnZwaHN1YmRxIiwKKyAgImxsdm0ueDg2LnhvcC52cGhzdWJ3ZCIsCisgICJsbHZtLng4Ni54b3AudnBtYWNzZGQiLAorICAibGx2bS54ODYueG9wLnZwbWFjc2RxaCIsCisgICJsbHZtLng4Ni54b3AudnBtYWNzZHFsIiwKKyAgImxsdm0ueDg2LnhvcC52cG1hY3NzZGQiLAorICAibGx2bS54ODYueG9wLnZwbWFjc3NkcWgiLAorICAibGx2bS54ODYueG9wLnZwbWFjc3NkcWwiLAorICAibGx2bS54ODYueG9wLnZwbWFjc3N3ZCIsCisgICJsbHZtLng4Ni54b3AudnBtYWNzc3d3IiwKKyAgImxsdm0ueDg2LnhvcC52cG1hY3N3ZCIsCisgICJsbHZtLng4Ni54b3AudnBtYWNzd3ciLAorICAibGx2bS54ODYueG9wLnZwbWFkY3Nzd2QiLAorICAibGx2bS54ODYueG9wLnZwbWFkY3N3ZCIsCisgICJsbHZtLng4Ni54b3AudnBwZXJtIiwKKyAgImxsdm0ueDg2LnhvcC52cHJvdGIiLAorICAibGx2bS54ODYueG9wLnZwcm90YmkiLAorICAibGx2bS54ODYueG9wLnZwcm90ZCIsCisgICJsbHZtLng4Ni54b3AudnByb3RkaSIsCisgICJsbHZtLng4Ni54b3AudnByb3RxIiwKKyAgImxsdm0ueDg2LnhvcC52cHJvdHFpIiwKKyAgImxsdm0ueDg2LnhvcC52cHJvdHciLAorICAibGx2bS54ODYueG9wLnZwcm90d2kiLAorICAibGx2bS54ODYueG9wLnZwc2hhYiIsCisgICJsbHZtLng4Ni54b3AudnBzaGFkIiwKKyAgImxsdm0ueDg2LnhvcC52cHNoYXEiLAorICAibGx2bS54ODYueG9wLnZwc2hhdyIsCisgICJsbHZtLng4Ni54b3AudnBzaGxiIiwKKyAgImxsdm0ueDg2LnhvcC52cHNobGQiLAorICAibGx2bS54ODYueG9wLnZwc2hscSIsCisgICJsbHZtLng4Ni54b3AudnBzaGx3IiwKKyAgImxsdm0ueDg2Lnhyc3RvciIsCisgICJsbHZtLng4Ni54cnN0b3I2NCIsCisgICJsbHZtLng4Ni54cnN0b3JzIiwKKyAgImxsdm0ueDg2Lnhyc3RvcnM2NCIsCisgICJsbHZtLng4Ni54c2F2ZSIsCisgICJsbHZtLng4Ni54c2F2ZTY0IiwKKyAgImxsdm0ueDg2LnhzYXZlYyIsCisgICJsbHZtLng4Ni54c2F2ZWM2NCIsCisgICJsbHZtLng4Ni54c2F2ZW9wdCIsCisgICJsbHZtLng4Ni54c2F2ZW9wdDY0IiwKKyAgImxsdm0ueDg2LnhzYXZlcyIsCisgICJsbHZtLng4Ni54c2F2ZXM2NCIsCisgICJsbHZtLng4Ni54c2V0YnYiLAorICAibGx2bS54ODYueHRlc3QiLAorICAibGx2bS54Y29yZS5iaXRyZXYiLAorICAibGx2bS54Y29yZS5jaGVja2V2ZW50IiwKKyAgImxsdm0ueGNvcmUuY2hrY3QiLAorICAibGx2bS54Y29yZS5jbHJlIiwKKyAgImxsdm0ueGNvcmUuY2xycHQiLAorICAibGx2bS54Y29yZS5jbHJzciIsCisgICJsbHZtLnhjb3JlLmNyYzMyIiwKKyAgImxsdm0ueGNvcmUuY3JjOCIsCisgICJsbHZtLnhjb3JlLmVkdSIsCisgICJsbHZtLnhjb3JlLmVldSIsCisgICJsbHZtLnhjb3JlLmVuZGluIiwKKyAgImxsdm0ueGNvcmUuZnJlZXIiLAorICAibGx2bS54Y29yZS5nZXRlZCIsCisgICJsbHZtLnhjb3JlLmdldGV0IiwKKyAgImxsdm0ueGNvcmUuZ2V0aWQiLAorICAibGx2bS54Y29yZS5nZXRwcyIsCisgICJsbHZtLnhjb3JlLmdldHIiLAorICAibGx2bS54Y29yZS5nZXRzdCIsCisgICJsbHZtLnhjb3JlLmdldHRzIiwKKyAgImxsdm0ueGNvcmUuaW4iLAorICAibGx2bS54Y29yZS5pbmN0IiwKKyAgImxsdm0ueGNvcmUuaW5pdGNwIiwKKyAgImxsdm0ueGNvcmUuaW5pdGRwIiwKKyAgImxsdm0ueGNvcmUuaW5pdGxyIiwKKyAgImxsdm0ueGNvcmUuaW5pdHBjIiwKKyAgImxsdm0ueGNvcmUuaW5pdHNwIiwKKyAgImxsdm0ueGNvcmUuaW5zaHIiLAorICAibGx2bS54Y29yZS5pbnQiLAorICAibGx2bS54Y29yZS5tam9pbiIsCisgICJsbHZtLnhjb3JlLm1zeW5jIiwKKyAgImxsdm0ueGNvcmUub3V0IiwKKyAgImxsdm0ueGNvcmUub3V0Y3QiLAorICAibGx2bS54Y29yZS5vdXRzaHIiLAorICAibGx2bS54Y29yZS5vdXR0IiwKKyAgImxsdm0ueGNvcmUucGVlayIsCisgICJsbHZtLnhjb3JlLnNldGMiLAorICAibGx2bS54Y29yZS5zZXRjbGsiLAorICAibGx2bS54Y29yZS5zZXRkIiwKKyAgImxsdm0ueGNvcmUuc2V0ZXYiLAorICAibGx2bS54Y29yZS5zZXRwcyIsCisgICJsbHZtLnhjb3JlLnNldHBzYyIsCisgICJsbHZtLnhjb3JlLnNldHB0IiwKKyAgImxsdm0ueGNvcmUuc2V0cmR5IiwKKyAgImxsdm0ueGNvcmUuc2V0c3IiLAorICAibGx2bS54Y29yZS5zZXR0dyIsCisgICJsbHZtLnhjb3JlLnNldHYiLAorICAibGx2bS54Y29yZS5zZXh0IiwKKyAgImxsdm0ueGNvcmUuc3N5bmMiLAorICAibGx2bS54Y29yZS5zeW5jciIsCisgICJsbHZtLnhjb3JlLnRlc3RjdCIsCisgICJsbHZtLnhjb3JlLnRlc3R3Y3QiLAorICAibGx2bS54Y29yZS53YWl0ZXZlbnQiLAorICAibGx2bS54Y29yZS56ZXh0IiwKKyNlbmRpZgorCisvLyBJbnRyaW5zaWMgSUQgdG8gb3ZlcmxvYWQgYml0c2V0CisjaWZkZWYgR0VUX0lOVFJJTlNJQ19PVkVSTE9BRF9UQUJMRQorc3RhdGljIGNvbnN0IHVpbnQ4X3QgT1RhYmxlW10gPSB7CisgIDAgfCAoMTw8MykgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSksCisgIDAsCisgIDAgfCAoMTw8MikgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCksCisgIDAgfCAoMTw8MCksCisgIDAgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NiksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8NiksCisgIDAgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NSkgfCAoMTw8NiksCisgIDAgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCksCisgIDAgfCAoMTw8MykgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8NSksCisgIDAsCisgIDAsCisgIDAsCisgIDAgfCAoMTw8MykgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSksCisgIDAgfCAoMTw8MCkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NikgfCAoMTw8NyksCisgIDAsCisgIDAgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MykgfCAoMTw8NCksCisgIDAsCisgIDAgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MyksCisgIDAgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MSkgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NyksCisgIDAgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCksCisgIDAgfCAoMTw8NiksCisgIDAgfCAoMTw8MCkgfCAoMTw8NCksCisgIDAgfCAoMTw8MykgfCAoMTw8NyksCisgIDAgfCAoMTw8MCksCisgIDAsCisgIDAgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NSksCisgIDAgfCAoMTw8NSksCisgIDAgfCAoMTw8MCksCisgIDAsCisgIDAgfCAoMTw8MCkgfCAoMTw8NiksCisgIDAsCisgIDAsCisgIDAgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MiksCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAgfCAoMTw8MCkgfCAoMTw8MiksCisgIDAsCisgIDAsCisgIDAgfCAoMTw8NyksCisgIDAgfCAoMTw8MCksCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSksCisgIDAsCisgIDAgfCAoMTw8MykgfCAoMTw8NCksCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSksCisgIDAsCisgIDAsCisgIDAgfCAoMTw8MiksCisgIDAsCisgIDAgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NiksCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAgfCAoMTw8NiksCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAgfCAoMTw8NCkgfCAoMTw8NSksCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCksCisgIDAsCisgIDAsCisgIDAsCisgIDAgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCksCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAgfCAoMTw8NyksCisgIDAsCisgIDAsCisgIDAgfCAoMTw8MiksCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAgfCAoMTw8MCkgfCAoMTw8MSksCisgIDAgfCAoMTw8NCksCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAgfCAoMTw8NiksCisgIDAgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MyksCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAsCisgIDAgfCAoMTw8MikgfCAoMTw8NCksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NyksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSkgfCAoMTw8NiksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8NCkgfCAoMTw8NSksCisgIDAgfCAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikKK307CisKK3JldHVybiAoT1RhYmxlW2lkLzhdICYgKDEgPDwgKGlkJTgpKSkgIT0gMDsKKyNlbmRpZgorCisvLyBHbG9iYWwgaW50cmluc2ljIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHR5cGUgdGFibGUuCisjaWZkZWYgR0VUX0lOVFJJTlNJQ19HRU5FUkFUT1JfR0xPQkFMCitzdGF0aWMgY29uc3QgdW5zaWduZWQgSUlUX1RhYmxlW10gPSB7CisgIDB4MmUsIDB4MmUyZSwgKDFVPDwzMSkgfCAxNzkwLCAweDEwLCAweDFmMWYsIDB4MWYxZiwgMHgyZjJmLCAKKyAgMHgyZjJmLCAweDJlMmUwLCAoMVU8PDMxKSB8IDQxNzAsIDB4MzJmLCAweDJmMywgMHgyZjJmMmYsICgxVTw8MzEpIHwgNDE2MywgKDFVPDwzMSkgfCAxMDcwLCAKKyAgMHgyZTAsIDB4MmUxLCAweDEyZTEsIDB4MmUsICgxVTw8MzEpIHwgMTA3MCwgKDFVPDwzMSkgfCA5ODEsIDB4MmUyZTEsIDB4MTQyZTJlLCAKKyAgMHgyZTAsICgxVTw8MzEpIHwgMTA3MiwgMHgxZiwgMHgyMmUyZSwgKDFVPDwzMSkgfCAxOTUsIDB4MmYyZiwgMHgxMWYxZiwgMHgxZjFmLCAKKyAgMHgxMWYxZiwgKDFVPDwzMSkgfCA0MjE3LCAoMVU8PDMxKSB8IDQyMTcsICgxVTw8MzEpIHwgNDIxNywgMHgwLCAweDAsIDB4NDJlLCAoMVU8PDMxKSB8IDQxNjcsIAorICAoMVU8PDMxKSB8IDQxNjYsIDB4MmU0MCwgMHgyZTUwLCAweDQwLCAweDJlMCwgMHgyZTAsIDB4MmUsIDB4MmU0LCAKKyAgMHgwLCAweDJlNCwgMHgwLCAweDJmMmYsIDB4MmYyZiwgMHgxZjFmMWYsICgxVTw8MzEpIHwgNDIwMiwgKDFVPDwzMSkgfCA0MjAyLCAKKyAgKDFVPDwzMSkgfCA0MjAyLCAoMVU8PDMxKSB8IDQyMDAsICgxVTw8MzEpIHwgNDIwMCwgKDFVPDwzMSkgfCA0MTk4LCAoMVU8PDMxKSB8IDQyMDAsICgxVTw8MzEpIHwgNDIwMCwgKDFVPDwzMSkgfCA0MjAwLCAoMVU8PDMxKSB8IDQyMDIsIAorICAoMVU8PDMxKSB8IDQyMDIsICgxVTw8MzEpIHwgNDIwMiwgKDFVPDwzMSkgfCA0MjAyLCAoMVU8PDMxKSB8IDQyMDAsICgxVTw8MzEpIHwgNDIwOSwgKDFVPDwzMSkgfCA0MjAyLCAoMVU8PDMxKSB8IDQyMDIsICgxVTw8MzEpIHwgNDIwMiwgCisgICgxVTw8MzEpIHwgNDIyMiwgKDFVPDwzMSkgfCAyNDgxLCAoMVU8PDMxKSB8IDQxNTksICgxVTw8MzEpIHwgNDI0NiwgKDFVPDwzMSkgfCA0MjI2LCAoMVU8PDMxKSB8IDQyMzgsICgxVTw8MzEpIHwgNDIzMCwgKDFVPDwzMSkgfCA0MjU1LCAKKyAgMHhiZjFmLCAweGJmMWYsICgxVTw8MzEpIHwgNDE5MSwgMHhiZjJmLCAweGJmMmYsICgxVTw8MzEpIHwgNDE5MSwgMHhiZjFmLCAweGJmMWYsIAorICAweGJmMWYsIDB4YmYxZiwgMHhiZjFmLCAweGJmMWYsIDB4YmYxZiwgMHgyZjJmLCAweDJmMmYsIDB4NCwgCisgIDB4MmYyZjJmMmYsIDB4MmYyZjJmMmYsIDB4NDJlLCAweDJlZTJlMmUsIDB4MmUyZWUwLCAweDJlZTJlMmUwLCAweDFmLCAoMVU8PDMxKSB8IDQyMjMsIAorICAweDJlMmUyZTAsIDB4NDQ1MmUwLCAweDU0NDUyZTAsIDB4NDQ1NTJlMCwgKDFVPDwzMSkgfCAzMDQ3LCAweDRmNGYsICgxVTw8MzEpIHwgMzA0OCwgMHg0ZjUwLCAKKyAgMHg0ZjUwLCAweDFmMmUyZSwgMHgyZSwgKDFVPDwzMSkgfCA0MjIzLCAweDQyZTJlMmUsIDB4MmYyZiwgMHgyZjJmLCAweDJmMmYsIAorICAweDQyZTAsICgxVTw8MzEpIHwgMTA3LCAoMVU8PDMxKSB8IDEyNTEsICgxVTw8MzEpIHwgMTI2MSwgKDFVPDwzMSkgfCAxMjczLCAoMVU8PDMxKSB8IDExNiwgKDFVPDwzMSkgfCAxMjcsIDB4MmYyZjJmLCAKKyAgKDFVPDwzMSkgfCAxODYsICgxVTw8MzEpIHwgMzEzNywgKDFVPDwzMSkgfCAxODYsICgxVTw8MzEpIHwgMzEzNywgMHgxOWYyNGYwLCAweDQ5ZjI0ZjAsIDB4MmYyZjJmLCAweDJmMmYsIAorICAweDExY2YxZiwgMHg0MCwgMHgyZjJmMmYsIDB4NDJmMmYsIDB4NDQ0MmUwLCAoMVU8PDMxKSB8IDE4MDAsICgxVTw8MzEpIHwgNDE3MywgMHg1LCAKKyAgMHg0MmUsIDB4MmYyZiwgMHgyZjJmLCAoMVU8PDMxKSB8IDE3MiwgMHgyZTQsIDB4MCwgMHg0MmUwLCAweDQyZTQsIAorICAweDJmMmYsICgxVTw8MzEpIHwgMTcyLCAweDJmMmYsIDB4ZjBmLCAoMVU8PDMxKSB8IDE3MiwgMHgyZSwgMHgyZWUyZTAsIDB4MmUwLCAKKyAgMHgyZSwgMHgyZSwgMHgwLCAweDJmMmYsICgxVTw8MzEpIHwgNDE4MiwgKDFVPDwzMSkgfCA0MTc3LCAoMVU8PDMxKSB8IDE3MiwgKDFVPDwzMSkgfCAxNzIsIAorICAoMVU8PDMxKSB8IDE3MiwgMHgyZTJlMCwgMHgyZTAsIDB4MmUwLCAweDQyZTJlMmUwLCAoMVU8PDMxKSB8IDE4MSwgMHg0MmUwLCAweDAsIAorICAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg1NDQsIDB4NDQ0LCAweDQ0NCwgMHg1NDQsIAorICAweDJjMmMyYywgMHgyYzJjMmMsIDB4MmMyYywgMHgyYzJjLCAweDRhNDRhNGEsIDB4NDQsIDB4NGE0NGE0YSwgMHg0YTQ0YTRhLCAKKyAgMHg0YTRhNGE0YSwgMHg0YTRhNGEsIDB4NGE0YTRhNGEsIDB4NGE0YTRhNGEsIDB4NGE0YTRhLCAweDRhNGE0YTRhLCAweDQwLCAweDQwLCAKKyAgMHg0MCwgMHg0MCwgKDFVPDwzMSkgfCAxMDU4LCAweDRmNSwgKDFVPDwzMSkgfCAxMDU4LCAweDRmNSwgMHhmMGYsICgxVTw8MzEpIHwgMTMyOCwgCisgIDB4M2YzZjNmLCAweDNmM2YsIDB4M2YzZjNmLCAweGFmYWYxZiwgMHhhZmFmMWYsIDB4YmYyZiwgMHhhZjFmLCAweGFmMWYsIAorICAweGFmMWYsIDB4YWYxZiwgMHhhZjFmLCAweGFmMWYsIDB4YWYxZiwgMHhhZjFmLCAweGJmM2YsIDB4YWYxZiwgCisgIDB4YWYxZiwgMHgyZjJmMmYsIDB4MmYyZjJmLCAweDNmM2YzZiwgMHhiZjJmLCAweDNmM2YzZiwgMHhiZjJmLCAweDJmMmYyZiwgCisgIDB4MmYyZjJmLCAweDNmM2YzZiwgMHhiZjJmLCAweDNmM2YzZiwgMHhiZjJmLCAweDJmMmYyZiwgMHgyZjJmLCAweDJmMmYyZiwgCisgIDB4MmYyZiwgMHgyZjJmLCAweDJmMmYsIDB4MmYyZjJmLCAoMVU8PDMxKSB8IDQwNDUsICgxVTw8MzEpIHwgNDAzNSwgKDFVPDwzMSkgfCA0MDIzLCAoMVU8PDMxKSB8IDQwNDUsIAorICAoMVU8PDMxKSB8IDQxMjQsICgxVTw8MzEpIHwgNDA0NSwgKDFVPDwzMSkgfCA0MDM1LCAoMVU8PDMxKSB8IDQxMDcsICgxVTw8MzEpIHwgNDAzNSwgKDFVPDwzMSkgfCA0MDIzLCAoMVU8PDMxKSB8IDQwODYsICgxVTw8MzEpIHwgNDAyMywgCisgIDB4M2YzZjNmLCAoMVU8PDMxKSB8IDEzNDAsIDB4NTUyYywgKDFVPDwzMSkgfCAxMzI4LCAweDNmM2YsICgxVTw8MzEpIHwgMTM0NywgKDFVPDwzMSkgfCAxMzI4LCAweDNmM2YzZiwgCisgIDB4YmYzZiwgMHhiZjFmLCAweGJmMWYsIDB4OWYxZiwgMHg5ZjFmLCAweDlmMWYsIDB4M2YzZjNmLCAoMVU8PDMxKSB8IDEzMzUsIAorICAweDNmM2YzZiwgMHgzZjNmM2YsIDB4M2YzZjNmLCAweGJmMWYsIDB4M2YzZjNmLCAweDNmM2YzZiwgMHhiZjFmLCAoMVU8PDMxKSB8IDEzNDAsIAorICAweDFmMWYsIDB4MWYxZjFmLCAweDFmMWYxZiwgKDFVPDwzMSkgfCAxMzQwLCAweDQ0NSwgMHgxZjFmLCAweDFmMWYxZiwgMHgxZjFmMWYsIAorICAoMVU8PDMxKSB8IDEzNDcsICgxVTw8MzEpIHwgMTM0NywgMHgxZjFmMWYsIDB4MWYxZjFmLCAoMVU8PDMxKSB8IDEzNDcsICgxVTw8MzEpIHwgMTM0NywgMHgxZjFmMWYsICgxVTw8MzEpIHwgMTk5LCAKKyAgKDFVPDwzMSkgfCAxOTksIDB4M2YzZjNmLCAweDFmMWYxZiwgMHgxZjFmMWYsICgxVTw8MzEpIHwgMTk2MSwgMHhjZjNmM2YwLCAoMVU8PDMxKSB8IDQwMDEsICgxVTw8MzEpIHwgNDAxMSwgCisgIDB4Y2YzZjNmMCwgKDFVPDwzMSkgfCA0MDUzLCAoMVU8PDMxKSB8IDQwMDEsICgxVTw8MzEpIHwgNDA2MiwgKDFVPDwzMSkgfCA0MDExLCAoMVU8PDMxKSB8IDQwNzMsICgxVTw8MzEpIHwgMTMyOCwgMHgxZjFmMWYsIAorICAweDNmMmMzZiwgMHgzZjJjMmMzZiwgKDFVPDwzMSkgfCAxMzAxLCAoMVU8PDMxKSB8IDEyODYsIDB4M2YyYzNmM2YsICgxVTw8MzEpIHwgMTMxMiwgKDFVPDwzMSkgfCAxMjk5LCAoMVU8PDMxKSB8IDEyODQsIAorICAweDNmM2YzZiwgMHhiZjNmLCAweGJmMWYsIDB4YmYxZiwgMHgzZjNmM2YsIDB4M2YzZjNmLCAweDNmM2YzZiwgMHgzZjNmM2YsIAorICAweGJmMWYsIDB4M2YzZjNmLCAweDNmM2YzZiwgMHhiZjFmLCAoMVU8PDMxKSB8IDEzNDAsIDB4MWYxZjFmLCAweDFmMWYxZiwgKDFVPDwzMSkgfCAxMzQ3LCAKKyAgMHgxZjFmMWYsICgxVTw8MzEpIHwgMTM0NywgMHgxZjFmMWYsICgxVTw8MzEpIHwgMTk5LCAweDNmM2YsIDB4M2YzZjNmLCAweDFmMWYxZiwgMHgzZjNmLCAKKyAgMHgxZjFmMWYsICgxVTw8MzEpIHwgMTk2MSwgMHgxZjFmMWYsIDB4NTNmNWJmM2YsIDB4NGFmMWYsIDB4NGFmMWYsIDB4N2EzYSwgMHg0OWYyZiwgCisgIDB4NDlmMmYsIDB4M2E3YSwgMHg0M2YzZjNmLCAweDQzZjNmM2YsIDB4MWYxZjFmLCAweDJmMmYyZiwgMHg4NywgMHgyZTU1NCwgCisgIDB4NGY1NCwgMHgyZTU1NCwgMHg0ZjU0LCAweDFmMWYxZiwgMHg0NDQ0LCAweDQ0NDQsICgxVTw8MzEpIHwgMTM3LCAoMVU8PDMxKSB8IDEzNywgCisgIDB4NTUsIDB4MTQ0NGE0NCwgMHgxNDQ0YTQ0LCAweDE0NDRhNDQ0LCAweDE0NDRhNDQsIDB4MTQ0NGE0NCwgMHgxNDQ0YTQ0LCAweDE0NDRhNDQsIAorICAweDE0NDRhNDQsIDB4MTQ0NGE0NCwgMHgxNDQ0YTQ0LCAweDE0NDRhNDQsIDB4MTE0NDRhMmYsIDB4MTE0NDRhMmYsICgxVTw8MzEpIHwgNzcsICgxVTw8MzEpIHwgNzcsIAorICAweDAsIDB4MCwgMHgwLCAweDQyZjEsIDB4MmYyZiwgMHg3Nzc3LCAweDc3NzcsIDB4Nzc3NywgCisgIDB4Nzc3NywgMHg0NDM5LCAweDQ0MzksIDB4NDQ3NCwgMHg3NzM5LCAweDc3MzksIDB4Nzc2OSwgMHg1LCAKKyAgKDFVPDwzMSkgfCA1MzEsIDB4MmYyZjJmMmYsICgxVTw8MzEpIHwgOTcsICgxVTw8MzEpIHwgODcsIDB4NDQ0LCAoMVU8PDMxKSB8IDE1OCwgKDFVPDwzMSkgfCAxNTgsICgxVTw8MzEpIHwgMTU4LCAKKyAgMHg0NDQsIDB4NDQ0LCAoMVU8PDMxKSB8IDMxOTYsIDB4NTU1LCAweDUwLCAoMVU8PDMxKSB8IDAsICgxVTw8MzEpIHwgNTMsIDB4NDJmMmY1LCAKKyAgMHg3NzcsIDB4MmYyZjJmMmYsIDB4Nzc3LCAweDJmMmYsIDB4YWYxZiwgMHgyZjJmLCAweDQsIDB4NDFmMWY1LCAKKyAgKDFVPDwzMSkgfCAxNjcsIDB4NTE1LCAoMVU8PDMxKSB8IDQzLCAoMVU8PDMxKSB8IDQzLCAoMVU8PDMxKSB8IDQyLCAoMVU8PDMxKSB8IDQzLCAoMVU8PDMxKSB8IDQzLCAoMVU8PDMxKSB8IDQzLCAKKyAgKDFVPDwzMSkgfCA0MywgKDFVPDwzMSkgfCA0MywgKDFVPDwzMSkgfCA0MywgKDFVPDwzMSkgfCA0MywgKDFVPDwzMSkgfCA0MywgKDFVPDwzMSkgfCA0MywgKDFVPDwzMSkgfCA0MywgKDFVPDwzMSkgfCAxNCwgCisgICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsIAorICAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAKKyAgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgCisgICgxVTw8MzEpIHwgMzAsICgxVTw8MzEpIHwgMzAsICgxVTw8MzEpIHwgMzAsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsIAorICAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAKKyAgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgCisgICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsIAorICAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAKKyAgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAyOSwgKDFVPDwzMSkgfCAyOSwgKDFVPDwzMSkgfCA1MzEsICgxVTw8MzEpIHwgNTMxLCAweDUwLCAKKyAgMHg0NDAsIDB4NDQ0NDcsIDB4NDQ0NzcsIDB4NDQ0Nzc3LCAoMVU8PDMxKSB8IDUzMSwgMHgxMCwgMHg0MmYyZiwgMHg0NDQ0LCAKKyAgMHgyZjJmLCAweDUxLCAweDQ0NCwgMHg0NDQsIDB4MTQ0NDFmMWYsIDB4NTQ1NSwgMHg0YTQ1NGEsIDB4NDQ0NCwgCisgIDB4MSwgMHg1NDU1LCAoMVU8PDMxKSB8IDUzMSwgMHgyZjJmLCAweDc3LCAweDQ0LCAweDQ0NCwgMHgyZjJmLCAKKyAgMHgyZjJmLCAweDc3LCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHg0MCwgCisgIDB4NSwgMHg0NCwgMHg0MCwgMHg1LCAweDUsIDB4NDQwLCAweDQ0MCwgMHg0MCwgCisgIDB4NDAsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQxZjFmLCAweDFmMWYxZiwgMHgxZjFmLCAweDJmMmYsIAorICAoMVU8PDMxKSB8IDY0LCAoMVU8PDMxKSB8IDYzLCAweDQyZjJmLCAweDQ0MWYxZiwgMHgwLCAoMVU8PDMxKSB8IDE0NywgMHgwLCAweDQsIAorICAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHhmMGYsIDB4MTEsIDB4NDQ0NCwgCisgIDB4ZjBmLCAweDQ0NDQ0NDAsIDB4NDQ0NDQ0MCwgMHgwLCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgCisgIDB4NDQ0LCAweDQ0NCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0LCAweDQwLCAweDQwLCAKKyAgMHg0ZjQsICgxVTw8MzEpIHwgMTA0MiwgMHgyZTQ0MCwgMHgyZTQ0MCwgMHgyZTQ0MCwgMHgyZTQ0MCwgMHg0ZjQsICgxVTw8MzEpIHwgMTA0MiwgCisgIDB4NDQ0NDQ0MCwgMHg0NDQ0NDQwLCAweDQ0NDQ0MCwgMHg0NDQ0NDAsIDB4NDQ0NDQ0LCAweDQ0NDQ0NCwgKDFVPDwzMSkgfCAyMDYxLCAoMVU8PDMxKSB8IDIwNjEsIAorICAweDJjMmMyYywgMHgyYzJjMmMsIDB4MmMyYywgMHgyYzJjLCAweDRhNDRhNGEsIDB4NDQsIDB4NGE0NGE0YSwgMHg0YTQ0YTRhLCAKKyAgMHg0YTRhNGE0YSwgMHg0YTRhNGEsIDB4NGE0YTRhNGEsIDB4NGE0YTRhNGEsIDB4NGE0YTRhLCAweDRhNGE0YTRhLCAweDNmM2YzZiwgMHgzZjNmM2YsIAorICAweDNmM2YsIDB4YmZiZjNmLCAweGJmYmYzZiwgMHgzZjNmM2YzZiwgMHgzZjNmLCAweGJmM2YsIDB4YmYzZiwgMHg0YWYxZiwgCisgIDB4NGFmMWYsIDB4N2EzYSwgMHg0OWYyZiwgMHg0OWYyZiwgMHgzYTdhLCAweGJmM2YsIDB4YmYzZiwgMHhiZjNmLCAKKyAgMHhiZjNmLCAweGJmM2YsIDB4YmYzZiwgMHgzZjNmM2YsIDB4M2YzZjNmLCAweDNmM2YzZiwgMHgzZjNmM2YsIDB4NGNmM2YsIAorICAoMVU8PDMxKSB8IDI5MzIsICgxVTw8MzEpIHwgMjAzNywgKDFVPDwzMSkgfCAyOTIxLCAoMVU8PDMxKSB8IDIwMTksICgxVTw8MzEpIHwgMjkwOCwgKDFVPDwzMSkgfCAxOTk3LCAweDNmM2YzZiwgMHgzZjNmM2YsIAorICAweDNmM2YzZiwgMHgzZjNmM2YsIDB4M2YzZjNmLCAweDNmM2YzZiwgKDFVPDwzMSkgfCAxMzQwLCAoMVU8PDMxKSB8IDEzNDAsICgxVTw8MzEpIHwgMTM0MCwgMHgzZjNmM2YsIAorICAweGJmM2YzZiwgMHhiZjNmM2YsIDB4M2YzZjNmLCAweGJmM2YsIDB4YmYzZiwgMHgzZjNmM2YsIDB4M2YzZjNmLCAweDNmM2YzZiwgCisgIDB4M2YzZjNmLCAweDNmM2YsIDB4M2YzZjNmLCAweDNmM2YzZiwgMHgzZjNmM2YsICgxVTw8MzEpIHwgMTM0MCwgKDFVPDwzMSkgfCAxMzIzLCAoMVU8PDMxKSB8IDEzMjMsIAorICAoMVU8PDMxKSB8IDEzMjMsIDB4M2YzZiwgMHgzZjNmM2YsICgxVTw8MzEpIHwgMTMyOCwgKDFVPDwzMSkgfCAxMzI4LCAoMVU8PDMxKSB8IDEzMjgsIDB4M2YzZjNmLCAweDNmM2YzZiwgCisgICgxVTw8MzEpIHwgMTMyOCwgKDFVPDwzMSkgfCAxMzI4LCAoMVU8PDMxKSB8IDEzMjgsIDB4M2YzZjNmLCAweDNmM2YzZiwgMHgzZjNmM2YsIDB4M2YzZjNmLCAweDNmM2YzZiwgCisgICgxVTw8MzEpIHwgMTMyOCwgMHgzZjNmLCAweDNmM2YzZiwgMHgzZjNmM2YsIDB4M2YzZjNmLCAweDNmM2YsIDB4M2YzZiwgMHgzZjNmLCAKKyAgMHgzZjNmLCAweDNmM2YsIDB4M2YzZiwgKDFVPDwzMSkgfCAxMzI4LCAweDNmM2YzZiwgMHgzZjNmM2YsIDB4M2YzZiwgMHgzZjNmM2YsIAorICAoMVU8PDMxKSB8IDEzMjgsIDB4M2YzZjNmM2YsIDB4M2YzZjNmLCAweDNmM2YzZiwgMHg0YmY0ZjAsIDB4NGJmYmY0ZjAsICgxVTw8MzEpIHwgMjMwMywgKDFVPDwzMSkgfCAyODEyLCAKKyAgKDFVPDwzMSkgfCAyMzEzLCAoMVU8PDMxKSB8IDI4MjMsICgxVTw8MzEpIHwgMjMyNSwgMHgyYjJiMmIsIDB4MmIyYjJiMmIsICgxVTw8MzEpIHwgOTU0LCAoMVU8PDMxKSB8IDk1MiwgMHgyYjJiMmIyYiwgCisgICgxVTw8MzEpIHwgOTU0LCAoMVU8PDMxKSB8IDk1MiwgKDFVPDwzMSkgfCA5NTAsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgCisgIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQwLCAKKyAgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIAorICAweDQ0NDQsIDB4NDQ0NCwgMHg1NDQ1LCAweDU0NDUsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgCisgIDB4NDQ0NCwgMHg0NDQ0LCAweDU0NDUsIDB4NTQ0NSwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIAorICAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIAorICAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHgyZTQ0MCwgMHgyZTQ0MCwgMHgyZTQ0MCwgMHgyZTQ0MCwgCisgIDB4NGY0NCwgMHgyZTQ0NCwgMHg0ZjQ0LCAweDJlNDQ0LCAweDQ0NCwgMHg0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDAsIAorICAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQ0LCAKKyAgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NCwgMHgyZjcsIAorICAweDJmNywgMHg1MmU1LCAweDUyZTUsIDB4NTJlNSwgMHg1NTUsIDB4NDQsIDB4NTUsIDB4NDQsIAorICAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIAorICAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDU1NSwgMHg1NTUsIAorICAweDQ0NCwgMHg1NDUsIDB4NDQ0LCAweDQ0NCwgMHg1NTUsIDB4NDQsIDB4NDQsIDB4NDQ0LCAKKyAgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDUsIDB4NDQ1LCAweDQ0NCwgMHg1NTUsIDB4NDQ0LCAKKyAgMHg1NTUsIDB4NDQ0LCAweDU1NSwgMHg0NDQsIDB4NTU1LCAweDQ0LCAweDU1LCAweDQ0LCAKKyAgMHg0NCwgMHg1NSwgMHg0NDQsIDB4NDQ0LCAweDU1NSwgMHg1NCwgMHg1NCwgMHg0NCwgCisgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgCisgIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgCisgIDB4NTU1LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgCisgIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ1LCAKKyAgMHg0NCwgMHg0NDQsIDB4NDQ0LCAweDU1LCAweDQ1LCAweDQ0LCAweDU1LCAweDU1LCAKKyAgMHg1NSwgMHg1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgCisgIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgCisgIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU0LCAweDU1NCwgCisgIDB4NTU0LCAweDU1NCwgMHg1NTQsIDB4NTU0LCAweDU1NCwgMHg1NTQsIDB4NTUsIDB4NTU1LCAKKyAgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAKKyAgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAKKyAgMHg1NTUsIDB4NTU1LCAweDU1NTUsIDB4NTU1LCAweDU1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIAorICAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NDQ0LCAweDU1NSwgMHg0NCwgCisgIDB4NDQsIDB4NDQ0LCAweDU1NSwgMHg0NDUsIDB4NDQ1LCAweDU0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg0NDQsIDB4NDQ0LCAweDQ0NSwgMHg0NDUsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg1NTUsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg0NDQsIDB4NDU0LCAweDU1NCwgMHg0NTQsIDB4NTU0LCAweDQ1NCwgMHg0NTQsIDB4NDU0LCAKKyAgMHg0NTQsIDB4NDU0LCAweDQ1NCwgMHg0NTQsIDB4NDU0LCAweDQ1NTUsIDB4NDU1NSwgMHg0NTU1LCAKKyAgMHg0NTU1LCAweDQ1NTUsIDB4NDU1NSwgMHg0NTU1LCAweDQ1NTUsIDB4NTU0LCAweDU1NCwgMHg1NTQsIAorICAweDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg0NDQsIDB4NTU0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg1NTQsIDB4NDQ0LCAKKyAgMHg0NDQsIDB4NTU0LCAweDQ0NCwgMHg0NDQsIDB4NDUsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIAorICAweDQ0NDQsIDB4NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NDQsIAorICAweDU1NDUsIDB4NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0LCAweDQ0NCwgCisgIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgCisgIDB4NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NTgsIDB4NTcsIDB4ODUsIAorICAweDg1LCAweDg3LCAweDg1LCAweDg1LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAKKyAgMHg3NSwgMHg3NSwgMHg3OCwgMHg3NSwgMHg3NSwgMHg3NCwgMHg3NCwgMHg3NCwgCisgIDB4NzQsIDB4NTgsIDB4NTcsIDB4NDgsIDB4NDcsIDB4NDgsIDB4NDcsIDB4NDg0LCAKKyAgMHg4ODQsIDB4ODg0LCAweDg4NCwgMHg4ODQsIDB4NDgsIDB4NDgsIDB4Nzc3LCAweDQ3NCwgCisgIDB4Nzc0LCAweDc3NCwgMHg3NzQsIDB4Nzc0LCAweDc3NywgMHg3NzcsIDB4NzcsIDB4Nzc3NywgCisgIDB4Nzc3NywgMHg0Nzc3NywgMHg3Nzc3LCAweDc3NzcsIDB4NDcsIDB4NDcsIDB4Nzc3LCAweDc3NywgCisgIDB4Nzc3LCAweDc3NywgKDFVPDwzMSkgfCAxODEwLCAoMVU8PDMxKSB8IDEwMTAsICgxVTw8MzEpIHwgOTkwLCAoMVU8PDMxKSB8IDE4MTgsICgxVTw8MzEpIHwgMTAyMSwgKDFVPDwzMSkgfCAxMDAwLCAKKyAgKDFVPDwzMSkgfCAxODEwLCAoMVU8PDMxKSB8IDEwMTAsICgxVTw8MzEpIHwgOTkwLCAoMVU8PDMxKSB8IDE4MTAsICgxVTw8MzEpIHwgMTAxMCwgKDFVPDwzMSkgfCA5OTAsICgxVTw8MzEpIHwgMTgxMCwgKDFVPDwzMSkgfCAxMDEwLCAKKyAgKDFVPDwzMSkgfCA5OTAsICgxVTw8MzEpIHwgMTgxMCwgKDFVPDwzMSkgfCAxMDEwLCAoMVU8PDMxKSB8IDk5MCwgMHg0ZTQsIDB4NWU1LCAweDQ0NDQsIDB4NDQ0NCwgCisgIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1LCAweDQ0NSwgCisgIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NSwgMHg0NDUsIDB4NDQ1LCAweDQ0NSwgCisgIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ0LCAweDQ0NSwgCisgIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NSwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0NCwgCisgIDB4NDQ0NCwgMHg0NDQ0LCAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAKKyAgMHg1NTU1LCAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAweDU1NTUsIAorICAweDU1NTUsIDB4NTU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgCisgIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgCisgIDB4NTU1LCAweDU1NSwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgCisgIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAKKyAgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIAorICAweDQ0NCwgMHg0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIAorICAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgCisgIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAKKyAgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1LCAweDQ0NSwgMHg0NDUsIAorICAweDQ0NSwgMHg0NDUsIDB4NDQ1LCAweDQ0NSwgMHg0NDUsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIAorICAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDUsIDB4NDQ1LCAweDQ0NSwgCisgIDB4NDQ1LCAweDQ0NSwgMHg0NDUsIDB4NDQ1LCAweDQ0NSwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgCisgIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAKKyAgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIAorICAweDQ0NCwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAKKyAgMHg0NDU1LCAweDQ0NSwgMHg0NDUsIDB4NDQ1LCAweDQ0NSwgMHg0NDUsIDB4NDQ1LCAweDQ0NSwgCisgIDB4NDQ1LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIAorICAweDQ0NTUsIDB4NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDU1NSwgMHg1NTUsIDB4NTU1NSwgCisgIDB4NTU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1NSwgMHg1NTU1LCAweDU1NCwgCisgIDB4NTU0LCAweDU1NSwgMHg1NTUsIDB4NDQ1NSwgMHg1NTU1LCAweDU1NTUsIDB4NTU1NSwgMHg0NDU1LCAKKyAgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgMHg1NTUsIDB4NTU1LCAweDQ0NSwgMHg0NDQsIDB4NDQ1LCAKKyAgMHg0NDQsIDB4NDQ1LCAweDQ0NSwgMHg1NTQsIDB4NTU0LCAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAKKyAgMHg1NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg0NTU1LCAweDQ1NSwgMHg0NTQsIAorICAweDU1NTUsIDB4NTU1LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NTQsIAorICAweDQ1NCwgMHg0NTQsIDB4NDU0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgCisgIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ1LCAweDQ0NTUsIAorICAweDQ0NSwgMHg0NDU1LCAweDU1NTUsIDB4NTU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NTUsIDB4NTU1NSwgCisgIDB4NTU1LCAweDU1NSwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg1NTU1LCAweDU1NTUsIDB4NTU1LCAKKyAgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1LCAweDQ0NSwgMHg1NTU1LCAweDU1NTUsIDB4NTU1LCAweDU1NSwgCisgIDB4NTU1LCAweDU1NSwgMHg0NDQ0LCAweDQ1NSwgMHg0NTU1LCAweDQ1NTUsIDB4NDU1NSwgMHg0NTU1LCAKKyAgMHg0NTU1LCAweDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NCwgMHg0NDQ0LCAKKyAgMHg0NTUsIDB4NDU1LCAweDQ1NSwgMHg0NTU1LCAweDQ1NTUsIDB4NDU1NSwgMHg0NTU1LCAweDQ1NTUsIAorICAweDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NCwgMHg0NTUsIDB4NDU1LCAKKyAgMHg0NTUsIDB4NDU1NSwgMHg0NTU1LCAweDQ1NTUsIDB4NDU1NSwgMHg0NTUsIDB4NDU1LCAweDQ0NCwgCisgIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ1NCwgMHg0NTUsIAorICAweDQ1NSwgMHg0NTUsIDB4NDU1NSwgMHg0NTU1LCAweDQ1NTUsIDB4NDU1NSwgMHg0NTU1LCAweDQ0NCwgCisgIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQsIDB4NDU0LCAweDQ1NSwgMHg0NTUsIAorICAweDQ0LCAweDU1LCAweDQ1NTUsIDB4NDQsIDB4NTQsIDB4NDQsIDB4NTQsIDB4NDQsIAorICAweDQ0LCAweDU0LCAweDQ0NCwgMHg0NDQsIDB4NDQsIDB4NTQsIDB4NDQsIDB4NTQsIAorICAweDU1LCAweDQ0NDQsIDB4NTQ0LCAweDQ0NTUsIDB4NTU1LCAweDQ0NDQ0LCAweDU0NDQsIDB4NDQ1NTUsIAorICAweDU1NTUsIDB4NTUsIDB4NTU1LCAweDQ1NSwgMHg0NTU1LCAweDQ1NTUsIDB4NDU1NSwgMHg0NTU1LCAKKyAgMHg0NTU1LCAweDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ1NSwgMHg0NTUsIAorICAweDQ1NSwgMHg0NTU1LCAweDQ1NTUsIDB4NDU1NSwgMHg0NTU1LCAweDQ1NTUsIDB4NDQ0LCAweDQ0NDQsIAorICAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDU1LCAweDQ1NSwgMHg0NTUsIDB4NDU1NSwgCisgIDB4NDU1NSwgMHg0NTU1LCAweDQ1NTUsIDB4NDU1NSwgMHg0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIAorICAweDQ0NDQsIDB4NDU1LCAweDQ1NSwgMHg0NDUsIDB4NTU0LCAweDQ0NCwgMHg0NDQsIDB4NTU1LCAKKyAgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg0NDJlMmUsICgxVTw8MzEpIHwgMTAzMiwgMHgyZTQ0MmUyZSwgMHg0NTJlMmUsICgxVTw8MzEpIHwgMTA0OCwgCisgIDB4MmU1NDJlMmUsIDB4NDQyZTJlLCAoMVU8PDMxKSB8IDEwMzIsIDB4MmU0NDJlMmUsIDB4NDQyZTJlLCAoMVU8PDMxKSB8IDEwMzIsIDB4MmU0NDJlMmUsIDB4NDQyZTJlLCAKKyAgKDFVPDwzMSkgfCAxMDMyLCAweDJlNDQyZTJlLCAweDQ0ZTQsIDB4NDQsIDB4NDQsIDB4NDQ0NDQsIDB4NDQ0NDQsIDB4NDQ0NDQsIAorICAweDQ0NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NTU1LCAweDQ1NTUsIDB4NDU1LCAKKyAgMHg0NTUsIDB4NDU1NSwgMHg1NCwgMHg1NCwgMHg1NCwgMHg1NSwgMHg1NCwgMHg1NSwgCisgIDB4NTQsIDB4NTUsIDB4NTQsIDB4NTUsIDB4NDQsIDB4NDUsIDB4NDU1NSwgMHg0NTU1LCAKKyAgMHg0NSwgMHg0NSwgMHg1NCwgMHg1NTUsIDB4NTQsIDB4NTU1LCAweDQ1LCAweDQ1LCAKKyAgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0LCAweDQ1NCwgMHg1NCwgCisgIDB4NDQ0NCwgMHg1NDQsIDB4NDQ1NSwgMHg1NTUsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0NCwgCisgIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQsIDB4NTVlNCwgMHg0NDQ0LCAweDQ0NDQsIAorICAweDQ0NDQsIDB4NDQ1NSwgMHg0NDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAKKyAgMHg1NTUsIDB4NDU0LCAweDQ1NCwgMHg1NCwgMHg0NTUsIDB4NDU1LCAweDQ1NTUsIDB4NDU1NSwgCisgIDB4NDU1NSwgMHg0NTU1LCAweDQ1NTUsIDB4NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIAorICAweDQ0NDQsIDB4NDUsIDB4NTU1LCAweDU1NSwgMHg0NGM0LCAweDQ0ZDQsIDB4NGQ0YywgKDFVPDwzMSkgfCAzMTIxLCAKKyAgMHg0ZDRjLCAoMVU8PDMxKSB8IDMxMjEsIDB4NDRjLCAweDQ0ZCwgMHg0NGMsIDB4NDRkLCAweDQ0YywgMHg0NGQsIAorICAoMVU8PDMxKSB8IDIwNCwgKDFVPDwzMSkgfCAyMjMsICgxVTw8MzEpIHwgMjA0LCAoMVU8PDMxKSB8IDIyMywgKDFVPDwzMSkgfCAyMDYsICgxVTw8MzEpIHwgMjI1LCAoMVU8PDMxKSB8IDIwNCwgKDFVPDwzMSkgfCAyMjMsIAorICAoMVU8PDMxKSB8IDIwNCwgKDFVPDwzMSkgfCAyMjMsICgxVTw8MzEpIHwgMTM1NywgKDFVPDwzMSkgfCAxMzY1LCAoMVU8PDMxKSB8IDEzNTcsICgxVTw8MzEpIHwgMTM2NSwgKDFVPDwzMSkgfCAyMDQsICgxVTw8MzEpIHwgMjIzLCAKKyAgKDFVPDwzMSkgfCAyMDQsICgxVTw8MzEpIHwgMjIzLCAoMVU8PDMxKSB8IDIwNCwgKDFVPDwzMSkgfCAyMjMsICgxVTw8MzEpIHwgMjg0MywgKDFVPDwzMSkgfCAyOTQ4LCAoMVU8PDMxKSB8IDI4NDMsICgxVTw8MzEpIHwgMjk0OCwgCisgICgxVTw8MzEpIHwgMjg0MywgKDFVPDwzMSkgfCAyOTQ4LCAoMVU8PDMxKSB8IDI4NDMsICgxVTw8MzEpIHwgMjk0OCwgMHg0YzRjLCAweDRkNGQsIDB4NGM0YywgMHg0ZDRkLCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg0YzRjLCAweDRkNGQsIDB4NGM0YywgMHg0ZDRkLCAweDRjNGMsIDB4NGQ0ZCwgMHg0YzRjLCAweDRkNGQsIAorICAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGQ0ZDRkLCAoMVU8PDMxKSB8IDMxMjYsICgxVTw8MzEpIHwgMjg3MCwgKDFVPDwzMSkgfCAyOTg1LCAoMVU8PDMxKSB8IDI4NzAsICgxVTw8MzEpIHwgMjk4NSwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0ZDRkNGQsICgxVTw8MzEpIHwgMzEyNiwgKDFVPDwzMSkgfCAyMTEsICgxVTw8MzEpIHwgMjMwLCAweDRjNGM0YywgMHg0ZDRkNGQsIAorICAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0ZDRkNGQsICgxVTw8MzEpIHwgMzEyNiwgKDFVPDwzMSkgfCAyODcwLCAoMVU8PDMxKSB8IDI5ODUsIAorICAoMVU8PDMxKSB8IDI4NzAsICgxVTw8MzEpIHwgMjk4NSwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRkNGQ0ZCwgKDFVPDwzMSkgfCAzMTI2LCAweDRjNGM0ZCwgKDFVPDwzMSkgfCAzMDE1LCAKKyAgMHg0YzRjNGQ0ZCwgKDFVPDwzMSkgfCAzMDEzLCAweDRjNGM0ZCwgKDFVPDwzMSkgfCAzMDE1LCAweDRjNGM0ZDRkLCAoMVU8PDMxKSB8IDMwMTMsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NGQ0ZDRkLCAoMVU8PDMxKSB8IDMxMjYsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRkNGQ0ZCwgKDFVPDwzMSkgfCAzMTI2LCAKKyAgMHg0YzRjNGQsICgxVTw8MzEpIHwgMzAxNSwgMHg0YzRjNGQ0ZCwgKDFVPDwzMSkgfCAzMDEzLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGQ0ZDRkLCAoMVU8PDMxKSB8IDMxMjYsIAorICAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGQ0ZDRkLCAoMVU8PDMxKSB8IDMxMjYsICgxVTw8MzEpIHwgMjg3MCwgKDFVPDwzMSkgfCAyOTg1LCAoMVU8PDMxKSB8IDI4NzAsICgxVTw8MzEpIHwgMjk4NSwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0ZDRkNGQsICgxVTw8MzEpIHwgMzEyNiwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAoMVU8PDMxKSB8IDEzNTUsICgxVTw8MzEpIHwgMTM2MywgKDFVPDwzMSkgfCAxMzUzLCAoMVU8PDMxKSB8IDEzNjEsICgxVTw8MzEpIHwgMTM1NSwgKDFVPDwzMSkgfCAxMzYzLCAKKyAgKDFVPDwzMSkgfCAxMzUzLCAoMVU8PDMxKSB8IDEzNjEsICgxVTw8MzEpIHwgMjgzNiwgKDFVPDwzMSkgfCAyOTQxLCAoMVU8PDMxKSB8IDI4MzYsICgxVTw8MzEpIHwgMjk0MSwgKDFVPDwzMSkgfCAyMzQxLCAoMVU8PDMxKSB8IDIzNzksIAorICAoMVU8PDMxKSB8IDIzMzksICgxVTw8MzEpIHwgMjM3NywgMHg0NGM0YywgMHg0NGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NDRjNGMsIDB4NDRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NDRjNGMsIDB4NDRkNGQsIAorICAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgCisgIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgCisgIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgMHg0NGM0YywgMHg0NGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIAorICAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgCisgIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YywgMHg0ZDRkLCAweDRkNGQsICgxVTw8MzEpIHwgMzEyOCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NGM0YywgMHg0ZDRkLCAweDRjNGMsIDB4NGQ0ZCwgMHg0YzRjNGQsICgxVTw8MzEpIHwgMzAxNSwgMHg0YywgMHg0ZCwgCisgIDB4NGQsICgxVTw8MzEpIHwgMzExMCwgMHg0YzRjLCAweDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjLCAweDRkNGQsIAorICAweDQ0YzRjNGQsICgxVTw8MzEpIHwgMjM5NywgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDQ0YzRjLCAweDQ0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgCisgIDB4NDRkNGQsICgxVTw8MzEpIHwgMjQ3MCwgMHg0NGQ0ZDRkLCAoMVU8PDMxKSB8IDI0NjgsIDB4NDRjNGMsIDB4NDRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAKKyAgMHg0NGQ0ZCwgKDFVPDwzMSkgfCAyNDcwLCAweDQ0ZDRkNGQsICgxVTw8MzEpIHwgMjQ2OCwgMHg0NGQ0YywgKDFVPDwzMSkgfCAyNDYyLCAweDQ0ZDRjNGMsICgxVTw8MzEpIHwgMjQ2MCwgCisgIDB4NDRjNGMsIDB4NDRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAweDQ0ZDRjLCAoMVU8PDMxKSB8IDI0NjIsIDB4NDRkNGM0YywgKDFVPDwzMSkgfCAyNDYwLCAKKyAgMHg0NGM0YywgMHg0NGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGM0YywgMHg0ZDRkNGQ0ZCwgCisgIDB4NDRkNGQsICgxVTw8MzEpIHwgMjQ3MCwgMHg0NGQ0ZDRkLCAoMVU8PDMxKSB8IDI0NjgsICgxVTw8MzEpIHwgMjg2MywgKDFVPDwzMSkgfCAyOTc4LCAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgCisgICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgKDFVPDwzMSkgfCAyODYzLCAoMVU8PDMxKSB8IDI5NzgsICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAKKyAgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAoMVU8PDMxKSB8IDI4NjMsICgxVTw8MzEpIHwgMjk3OCwgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsIAorICAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsIDB4NGM0NDJlMCwgMHg0ZDQ0MmUwLCAoMVU8PDMxKSB8IDI4NTEsICgxVTw8MzEpIHwgMjk2NiwgCisgIDB4NGQ0NDJlMCwgKDFVPDwzMSkgfCAzMTEzLCAoMVU8PDMxKSB8IDI5NTYsICgxVTw8MzEpIHwgMzEwMywgMHg0YzQ0MmUwLCAweDRkNDQyZTAsICgxVTw8MzEpIHwgMjg1MSwgKDFVPDwzMSkgfCAyOTY2LCAKKyAgKDFVPDwzMSkgfCAyODYzLCAoMVU8PDMxKSB8IDI5NzgsICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsIAorICAoMVU8PDMxKSB8IDI4NjMsICgxVTw8MzEpIHwgMjk3OCwgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgCisgICgxVTw8MzEpIHwgMjg2MywgKDFVPDwzMSkgfCAyOTc4LCAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAKKyAgKDFVPDwzMSkgfCAyODYzLCAoMVU8PDMxKSB8IDI5NzgsICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsIAorICAoMVU8PDMxKSB8IDI4NjMsICgxVTw8MzEpIHwgMjk3OCwgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgCisgICgxVTw8MzEpIHwgMjg2MywgKDFVPDwzMSkgfCAyOTc4LCAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAKKyAgMHg0NGM0YywgMHg0NGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAweDQ0YzRjLCAweDQ0ZDRkLCAKKyAgMHg0NGM0YywgMHg0NGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDQ0YzRjLCAweDQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIAorICAweDU0YzRjLCAweDU0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsICgxVTw8MzEpIHwgMjM1NywgKDFVPDwzMSkgfCAyMzg1LCAKKyAgKDFVPDwzMSkgfCAyMzU3LCAoMVU8PDMxKSB8IDIzODUsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAweDQ0YzRjNGQsICgxVTw8MzEpIHwgMjM5NywgMHg0NGM0YzRkLCAoMVU8PDMxKSB8IDIzOTcsIAorICAoMVU8PDMxKSB8IDIzNjcsICgxVTw8MzEpIHwgMjM5NSwgKDFVPDwzMSkgfCAyMzY3LCAoMVU8PDMxKSB8IDIzOTUsIDB4NDRjNGM0ZCwgKDFVPDwzMSkgfCAyMzk3LCAoMVU8PDMxKSB8IDI4NDMsICgxVTw8MzEpIHwgMjk0OCwgCisgICgxVTw8MzEpIHwgMjg0MywgKDFVPDwzMSkgfCAyOTQ4LCAoMVU8PDMxKSB8IDI4NDMsICgxVTw8MzEpIHwgMjk0OCwgKDFVPDwzMSkgfCAyODQzLCAoMVU8PDMxKSB8IDI5NDgsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0NGQ0ZCwgKDFVPDwzMSkgfCAyNDcwLCAweDQ0ZDRkNGQsICgxVTw8MzEpIHwgMjQ2OCwgMHg0ZDRkNGQsICgxVTw8MzEpIHwgMzEyNiwgCisgIDB4NDRkNGQsICgxVTw8MzEpIHwgMjQ3MCwgMHg0NGQ0ZDRkLCAoMVU8PDMxKSB8IDI0NjgsIDB4NGQ0ZDRkLCAoMVU8PDMxKSB8IDMxMjYsIDB4NDRkNGQsICgxVTw8MzEpIHwgMjQ3MCwgCisgIDB4NDRkNGQ0ZCwgKDFVPDwzMSkgfCAyNDY4LCAweDU0YzRjNGMsIDB4NTRkNGQ0ZCwgMHg0NGQ0ZCwgKDFVPDwzMSkgfCAyNDcwLCAweDQ0ZDRkNGQsICgxVTw8MzEpIHwgMjQ2OCwgCisgIDB4NTRjNGM0YywgMHg1NGQ0ZDRkLCAweDU0YzRjNGMsIDB4NTRkNGQ0ZCwgMHg0NGM0ZCwgKDFVPDwzMSkgfCAyNDA3LCAweDQ0YzRkNGQsICgxVTw8MzEpIHwgMjQwNSwgCisgIDB4NGM0YzRkLCAoMVU8PDMxKSB8IDMwMTUsIDB4NGM0YzRkNGQsICgxVTw8MzEpIHwgMzAxMywgMHg0YzRjNGQsICgxVTw8MzEpIHwgMzAxNSwgMHg0YzRjNGQ0ZCwgKDFVPDwzMSkgfCAzMDEzLCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0ZCwgKDFVPDwzMSkgfCAzMDE1LCAweDQ0YzRkLCAoMVU8PDMxKSB8IDI0MDcsIDB4NDRjNGQ0ZCwgKDFVPDwzMSkgfCAyNDA1LCAKKyAgMHg0NGM0ZDRkLCAoMVU8PDMxKSB8IDI0MDUsIDB4NDRjNGMsIDB4NDRkNGQsIDB4NDRjNGMsIDB4NDRkNGQsIDB4NGM0YzRkLCAoMVU8PDMxKSB8IDMwMTUsIAorICAweDRjNGM0ZDRkLCAoMVU8PDMxKSB8IDMwMTMsIDB4NGM0YzRkLCAoMVU8PDMxKSB8IDMwMTUsIDB4NGM0YzRkNGQsICgxVTw8MzEpIHwgMzAxMywgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YzRjLCAweDRkNGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjNGMsIDB4NGQ0ZDRkNGQsIAorICAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjNGMsIDB4NGQ0ZDRkNGQsIDB4NDRjNGMsIDB4NDRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDQ0YzRjLCAweDQ0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgMHg0NGM0YywgMHg0NGQ0ZCwgCisgIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAweDQ0YzRjLCAweDQ0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg0YzRjNGQ0ZCwgKDFVPDwzMSkgfCAzMDEzLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjNGMsIDB4NGQ0ZDRkNGQsIDB4NGM0YzRjNGMsIDB4NGQ0ZDRkNGQsIAorICAweDQ0YzRkLCAoMVU8PDMxKSB8IDI0MDcsIDB4NDRjNGQ0ZCwgKDFVPDwzMSkgfCAyNDA1LCAweDRjNGM0ZCwgKDFVPDwzMSkgfCAzMDE1LCAweDRjNGM0ZDRkLCAoMVU8PDMxKSB8IDMwMTMsIAorICAweDQ0YzRkLCAoMVU8PDMxKSB8IDI0MDcsIDB4NDRjNGQ0ZCwgKDFVPDwzMSkgfCAyNDA1LCAweDQ0YzRjLCAweDQ0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgCisgIDB4NGM0YzRkLCAoMVU8PDMxKSB8IDMwMTUsIDB4NGM0YzRkNGQsICgxVTw8MzEpIHwgMzAxMywgKDFVPDwzMSkgfCAyODcwLCAoMVU8PDMxKSB8IDI5ODUsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YywgMHg0ZDRkLCAKKyAgMHg0YzRjLCAweDRkNGQsIDB4NGM0YywgMHg0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YywgMHg0ZDRkLCAKKyAgKDFVPDwzMSkgfCAyMTgsICgxVTw8MzEpIHwgMjM3LCAoMVU8PDMxKSB8IDIxOCwgKDFVPDwzMSkgfCAyMzcsICgxVTw8MzEpIHwgMjE4LCAoMVU8PDMxKSB8IDIzNywgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg1NGM0ZCwgKDFVPDwzMSkgfCAzMTkwLCAweDU0YzRkNGQsICgxVTw8MzEpIHwgMzE4OCwgMHg0NGM0YywgMHg0NGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIAorICAweDQ0NGQ0ZCwgKDFVPDwzMSkgfCAyMTQ2LCAweDQ0NGQ0ZDRkLCAoMVU8PDMxKSB8IDIxNDQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGM0YywgMHg0ZDRkNGQ0ZCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGM0YywgMHg0ZDRkNGQ0ZCwgMHg0NGM0YywgMHg0NGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIAorICAweDU0YzRkLCAoMVU8PDMxKSB8IDMxOTAsIDB4NTRjNGQ0ZCwgKDFVPDwzMSkgfCAzMTg4LCAweDQ0NGQ0ZCwgKDFVPDwzMSkgfCAyMTQ2LCAweDQ0NGQ0ZDRkLCAoMVU8PDMxKSB8IDIxNDQsIAorICAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjNGMsIDB4NGQ0ZDRkNGQsIDB4NDRjNGMsIDB4NDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0NDRkNGQsICgxVTw8MzEpIHwgMjE0NiwgMHg0NDRkNGQ0ZCwgKDFVPDwzMSkgfCAyMTQ0LCAweDRjNGM0YywgMHg0ZDRkNGQsIAorICAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRkLCAoMVU8PDMxKSB8IDMwMjUsIDB4NGM0YzQ0MCwgMHg0ZDRkNDQwLCAKKyAgMHg0YzRjNDQwLCAweDRkNGQ0NDAsICgxVTw8MzEpIHwgMjg4OCwgKDFVPDwzMSkgfCAzMDAzLCAweDRjNGQ0NDAsICgxVTw8MzEpIHwgMzAyMiwgMHg0YzRkNDQwLCAoMVU8PDMxKSB8IDMwMjIsIAorICAoMVU8PDMxKSB8IDI4OTgsICgxVTw8MzEpIHwgMzAzMCwgMHg0YzRjNDQwLCAweDRkNGQ0NDAsIDB4NGM0YzQ0MCwgMHg0ZDRkNDQwLCAoMVU8PDMxKSB8IDI4ODgsICgxVTw8MzEpIHwgMzAwMywgCisgIDB4NGM0ZCwgKDFVPDwzMSkgfCAzMDI1LCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YywgMHg0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIAorICAweDRjNGMsIDB4NGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDQ0YzRjNGQsICgxVTw8MzEpIHwgMjM5NywgMHg0YzRjNGQsICgxVTw8MzEpIHwgMzAxNSwgCisgIDB4NGM0YzRkLCAoMVU8PDMxKSB8IDMwMTUsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRkNGQ0ZCwgKDFVPDwzMSkgfCAzMTI2LCAKKyAgKDFVPDwzMSkgfCAyODcwLCAoMVU8PDMxKSB8IDI5ODUsICgxVTw8MzEpIHwgMjg3MCwgKDFVPDwzMSkgfCAyOTg1LCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGQ0ZDRkLCAoMVU8PDMxKSB8IDMxMjYsIAorICAoMVU8PDMxKSB8IDIxMSwgKDFVPDwzMSkgfCAyMzAsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0ZDRkNGQsICgxVTw8MzEpIHwgMzEyNiwgKDFVPDwzMSkgfCAyODcwLCAoMVU8PDMxKSB8IDI5ODUsIAorICAoMVU8PDMxKSB8IDI4NzAsICgxVTw8MzEpIHwgMjk4NSwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRkNGQ0ZCwgKDFVPDwzMSkgfCAzMTI2LCAweDRjNGM0ZCwgKDFVPDwzMSkgfCAzMDE1LCAKKyAgMHg0YzRjNGQsICgxVTw8MzEpIHwgMzAxNSwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRkNGQ0ZCwgKDFVPDwzMSkgfCAzMTI2LCAweDRjNGM0YywgMHg0ZDRkNGQsIAorICAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGQ0ZDRkLCAoMVU8PDMxKSB8IDMxMjYsIDB4NGM0YzRkLCAoMVU8PDMxKSB8IDMwMTUsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NGQ0ZDRkLCAoMVU8PDMxKSB8IDMxMjYsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0ZDRkNGQsICgxVTw8MzEpIHwgMzEyNiwgKDFVPDwzMSkgfCAyODcwLCAoMVU8PDMxKSB8IDI5ODUsIAorICAoMVU8PDMxKSB8IDI4NzAsICgxVTw8MzEpIHwgMjk4NSwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRkNGQ0ZCwgKDFVPDwzMSkgfCAzMTI2LCAoMVU8PDMxKSB8IDI4NzksICgxVTw8MzEpIHwgMjk5NCwgCisgIDB4NDRkNGQsICgxVTw8MzEpIHwgMjQ3MCwgMHg0NGQ0ZDRkLCAoMVU8PDMxKSB8IDI0NjgsIDB4NDRkNGQsICgxVTw8MzEpIHwgMjQ3MCwgMHg0NGQ0ZDRkLCAoMVU8PDMxKSB8IDI0NjgsIAorICAweDQ0ZDRkLCAoMVU8PDMxKSB8IDI0NzAsIDB4NDRkNGQ0ZCwgKDFVPDwzMSkgfCAyNDY4LCAweDRjNGQsICgxVTw8MzEpIHwgMzAyNSwgMHg0YzRkLCAoMVU8PDMxKSB8IDMwMjUsIAorICAweDRjNGQ0ZCwgKDFVPDwzMSkgfCAzMDQwLCAweDRjNGQ0ZCwgKDFVPDwzMSkgfCAzMDQwLCAweDRjNGQsICgxVTw8MzEpIHwgMzAyNSwgMHg0YzRkLCAoMVU8PDMxKSB8IDMwMjUsIAorICAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0ZCwgKDFVPDwzMSkgfCAzMDI1LCAweDRjNGQsICgxVTw8MzEpIHwgMzAyNSwgMHgyZTAsIDB4MmUwLCAKKyAgMHgyZTAsIDB4MmUwLCAweDQyZTAsIDB4NTJlMCwgMHg0NDJlMmUyZSwgMHg0NDJlMmUyZSwgMHg0NDJlMmUyZSwgMHg0NDJlMmUyZSwgCisgIDB4NDQyZTJlMmUsIDB4NDQyZTJlMmUsIDB4NDQ0MmUyZSwgMHg0NDUyZTJlLCAweDQ0NDJlMmUsIDB4NDQ0MmUyZSwgMHg0NDQyZTJlLCAweDRiNGI0YiwgCisgIDB4MmUwLCAweDM5MzksIDB4MmEyYSwgMHg0NCwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIAorICAweDM5MzkzOSwgMHgzOTM5MzksIDB4NDQ0LCAweDM5MzkzOSwgMHgzOTM5MzksIDB4NDQ0LCAweDQ0NCwgMHgyYzJjMmMsIAorICAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIAorICAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDQ0NCwgMHgzOTM5MzksIDB4MmEyYTJhLCAweDM5MzkzOSwgMHgyYTJhMmEsIAorICAweDJhMmEyYSwgMHgyYTJhMmEsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDQyYzJjLCAweDQ1OTU5LCAKKyAgMHg0M2IzYiwgMHg0NGE0YSwgMHg0NDQsIDB4MmMyYzJjLCAweDQyYzJjLCAweDQ0NDQsIDB4MmMyYzJjLCAweDU5NTk1OSwgCisgIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgCisgIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgCisgIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4NDQ0NCwgMHgyYzJjMmMsIAorICAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDQyYzJjLCAweDQ1OTU5LCAweDQzYjNiLCAweDQ0YTRhLCAweDJjMmMyYzJjLCAKKyAgMHg1OTU5NTk1OSwgMHgzYjNiM2IzYiwgMHg0YTRhNGE0YSwgMHg0MmMyYzJjLCAweDQ1OTU5NTksIDB4NDNiM2IzYiwgMHg0NGE0YTRhLCAweDJjMmMyYzJjLCAKKyAgMHg1OTU5NTk1OSwgMHgzYjNiM2IzYiwgMHg0YTRhNGE0YSwgMHg0MmMyYzJjLCAweDQ1OTU5NTksIDB4NDNiM2IzYiwgMHg0NGE0YTRhLCAweDQ0LCAKKyAgMHgyYzJjMmMyYywgMHg0MmMyYzJjLCAweDJjMmMyYzJjLCAweDQyYzJjMmMsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAKKyAgMHg0MmMyYywgMHg0NTk1OSwgMHg0M2IzYiwgMHg0NGE0YSwgMHgyYzQsIDB4NTk0LCAweDNiNCwgMHgyYzQsIAorICAweDRhNCwgMHg0LCAweDJjMmMyYzJjLCAweDQyYzJjMmMsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAKKyAgMHg0MmMyYywgMHg0NTk1OSwgMHg0M2IzYiwgMHg0NGE0YSwgMHgyYzQsIDB4NTk0LCAweDNiNCwgMHgyYzQsIAorICAweDRhNCwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4NDJjMmMsIDB4NDU5NTksIDB4NDNiM2IsIAorICAweDQ0YTRhLCAweDQ0LCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAKKyAgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDQyYzJjLCAweDQ1OTU5LCAweDQzYjNiLCAweDQ0YTRhLCAweDQyYzJjLCAweDQ1OTU5LCAKKyAgMHg0M2IzYiwgMHg0NGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgCisgIDB4M2IzYjNiLCAweDRhNGE0YSwgMHg0MmMyYywgMHg0NTk1OSwgMHg0M2IzYiwgMHg0NGE0YSwgMHg0MmMyYywgMHg0NTk1OSwgCisgIDB4NDNiM2IsIDB4NDRhNGEsIDB4MzkzOTAsIDB4MzkzOTAsIDB4MzkzOTAsIDB4MmEyYTQsIDB4MmEyYTQsIDB4MmEyYTQsIAorICAweDJhMmE0LCAweDJhMmE0LCAweDJhMmE0LCAweDJhMmEwLCAweDJhMmEwLCAweDJhMmEwLCAweDQyYzQsIDB4NDU5NSwgCisgIDB4NDNiNCwgMHg0NGE0LCAweDQyYzQsIDB4NDU5NSwgMHg0M2I0LCAweDQ0YTQsIDB4NDQwLCAweDJjMmMyYywgCisgIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDQ1NTUsIAorICAweDRhNGE1OSwgMHgyYzJjM2IsIDB4M2IzYjRhLCAweDRhNGE1OSwgMHgyYzJjM2IsIDB4M2IzYjRhLCAweDM5Mzk1NSwgMHg0YTRhNTk1OSwgCisgIDB4MmMyYzNiM2IsIDB4M2IzYjRhNGEsIDB4NGE0YTU5NTksIDB4MmMyYzNiM2IsIDB4M2IzYjRhNGEsIDB4MzkzOTU1LCAweDQ0NTUsIDB4MzkzOTU1LCAKKyAgMHgzOTM5NTUsIDB4MmEyYTU1LCAweDJhMmE1NSwgMHgzOTM5NTUsIDB4MzkzOTU1LCAweDM5Mzk1NSwgMHg0NDU1LCAweDM5Mzk1NSwgCisgIDB4MzkzOTU1LCAweDJhMmE1NSwgMHgyYTJhNTUsIDB4NGE0YTU5NTksIDB4MmMyYzNiM2IsIDB4M2IzYjRhNGEsIDB4NGE0YTU5NTksIDB4MmMyYzNiM2IsIAorICAweDNiM2I0YTRhLCAweDM5Mzk1NSwgMHg0NTQsIDB4NDU0LCAweDQ1NCwgMHg0NTQsIDB4NDU0LCAweDQ1NCwgCisgIDB4ODk4OTg5LCAweDdhN2E3YSwgMHg4OTg5NTksIDB4N2E3YTRhLCAweDg5ODk1OSwgMHg3YTdhNGEsIDB4ODk1OSwgMHg3YTRhLCAKKyAgMHg4OTg5NTksIDB4N2E3YTRhLCAweDg5ODk1OSwgMHg3YTdhNGEsIDB4ODk4OTU5LCAweDdhN2E0YSwgMHg4OTg5NTksIDB4N2E3YTRhLCAKKyAgMHg4OTg5NTksIDB4N2E3YTRhLCAweDg5ODk1OSwgMHg3YTdhNGEsIDB4ODk4OTU5LCAweDdhN2E0YSwgMHg4OTg5NTksIDB4N2E3YTRhLCAKKyAgMHg4OTg5NTksIDB4N2E3YTRhLCAweDg5ODk4OSwgMHg3YTdhN2EsIDB4N2E3YTZiLCAweDg5ODk3YSwgMHg1OTg5ODksIDB4NGE3YTdhLCAKKyAgMHg3YTg5LCAweDZiN2EsIDB4N2E4OSwgMHg2YjdhLCAweDU5ODksIDB4NGE3YSwgMHg1OTg5LCAweDRhN2EsIAorICAweDRhODksIDB4M2I3YSwgMHg0YTg5LCAweDNiN2EsIDB4NDJjLCAweDU1OSwgMHg0M2IsIDB4NDRhLCAKKyAgMHg4OTg5LCAweDdhN2EsICgxVTw8MzEpIHwgMzk3OSwgMHg3YTdhN2E3YSwgMHg4OTg5ODksIDB4N2E3YTdhLCAweDg5ODk4OSwgMHg3YTdhN2EsIAorICAweDg5ODk4OSwgMHg3YTdhN2EsIDB4ODk4OTg5LCAweDdhN2E3YSwgKDFVPDwzMSkgfCAzOTc5LCAweDdhN2E3YTdhLCAweDg5ODk4OSwgMHg3YTdhN2EsIAorICAweDg5ODksIDB4N2E3YSwgMHg4OTg5LCAweDdhN2EsIDB4ODk4OSwgMHg3YTdhLCAweDg5ODk1OSwgMHg3YTdhNGEsIAorICAweDg5ODk1OSwgMHg3YTdhNGEsIDB4ODk4OTU5LCAweDdhN2E0YSwgMHg4OTg5NTksIDB4N2E3YTRhLCAweDg5ODk1OSwgMHg3YTdhNGEsIAorICAweDg5ODk1OSwgMHg3YTdhNGEsIDB4ODk4OSwgMHg3YTdhLCAweDg5ODk4OSwgMHg3YTdhN2EsIDB4ODk4OTU5LCAweDdhN2E0YSwgCisgIDB4ODk4OTU5LCAweDdhN2E0YSwgMHg4OTg5NTksIDB4N2E3YTRhLCAweDg5ODk1OSwgMHg3YTdhNGEsIDB4ODk4OTU5LCAweDdhN2E0YSwgCisgIDB4ODk1OSwgMHg3YTRhLCAweDg5NTksIDB4N2E0YSwgMHg3YTdhM2IsIDB4ODk4OTRhLCAweDg5NTksIDB4N2E0YSwgCisgIDB4ODk1OSwgMHg3YTRhLCAweDRhNGE1OSwgMHgyYzJjM2IsIDB4M2IzYjRhLCAweDRhNGE1OSwgMHgyYzJjM2IsIDB4M2IzYjRhLCAKKyAgMHg0YTRhNTksIDB4MmMyYzNiLCAweDNiM2I0YSwgMHg0YTRhNTksIDB4MmMyYzNiLCAweDNiM2I0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAKKyAgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAKKyAgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHg0NDJjMmMsIDB4NTQ1OTU5LCAKKyAgMHg0NDNiM2IsIDB4NDQ0YTRhLCAweDQ0NCwgMHgyYzQyYzJjLCAweDU5NDU5NTksIDB4M2I0M2IzYiwgMHg0YTQ0YTRhLCAweDQyZTQsIAorICAweDQyZTJjLCAweDQyZTU5LCAweDQyZTNiLCAweDQyZTRhLCAweDQyYywgMHg0NTksIDB4NDNiLCAweDQ0YSwgCisgIDB4NDJlNCwgMHg0NDQ0LCAweDQyZTQsIDB4NDQ1NSwgMHgzYjNiM2IzYiwgMHg0YTRhNGE0YSwgMHgzYjNiM2IzYiwgMHg0YTRhNGE0YSwgCisgIDB4NDQ1NSwgMHgyYzJjMmMyYywgMHg1OTU5NTk1OSwgMHgzYjNiM2IzYiwgMHg0YTRhNGE0YSwgMHgzOTM5NTUsIDB4MzkzOTU1LCAweDM5Mzk1NSwgCisgIDB4MzkzOTU1LCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgCisgIDB4NGE0YTRhLCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHg0MmMyYywgMHg0NTk1OSwgMHg0M2IzYiwgCisgIDB4NDRhNGEsIDB4NDJjMmMsIDB4NDU5NTksIDB4NDNiM2IsIDB4NDRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIAorICAweDRhNGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIAorICAweDRhNGE0YSwgMHg0MmMyYywgMHg0NTk1OSwgMHg0M2IzYiwgMHg0NGE0YSwgMHg0MmMyYywgMHg0NTk1OSwgMHg0M2IzYiwgCisgIDB4NDRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAKKyAgMHg0YTRhNGEsIDB4NDQ0LCAweDJjMmMsIDB4NDQ1NSwgMHgzYjNiM2IzYiwgMHg0YTRhNGE0YSwgMHgzYjNiM2IzYiwgMHg0YTRhNGE0YSwgCisgIDB4NDQ1NSwgMHgyYzJjMmMyYywgMHg1OTU5NTk1OSwgMHgzYjNiM2IzYiwgMHg0YTRhNGE0YSwgMHg0NTUsIDB4MzkzOTM5LCAweDNiM2IzYiwgCisgIDB4NGE0YTRhLCAweDM5MzkzOSwgMHgzOTM5NCwgMHgzOTM5NCwgMHgzOTJhMzksIDB4MzkyYTM5LCAweDM5MzkzOSwgMHg0NDQsIAorICAweDM5MzkzOSwgMHg0NDQsIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgzOTM5NTUsIDB4MzkzOTU1LCAweDQ0NSwgMHg0NDUsIAorICAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjLCAweDU5NTksIDB4M2IzYiwgMHg0YTRhLCAKKyAgMHgyYzJjLCAweDU5NTksIDB4M2IzYiwgMHg0YTRhLCAweDJjMmMyYywgMHg0MmMyYywgMHgyYzJjMmMsIDB4NDJjMmMsIAorICAweDM5MzkzOSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIAorICAweDRhNGE0YSwgMHgyYzJjLCAweDU5NTksIDB4M2IzYiwgMHg0YTRhLCAweDM5MzkzOSwgMHgyYTJhMmEsIDB4Mzk0LCAKKyAgMHgzOTQsIDB4MmEzOSwgMHgyYTM5LCAweDJhMzksIDB4MmEzOSwgMHgyYTM5LCAweDJhMzksIDB4MmEzOSwgCisgIDB4MmEzOSwgMHgzOTM5MmEsIDB4NDQ0MzksIDB4NDQ0MzksIDB4NDQzOSwgMHgzOTM5MmEsIDB4NDQzOSwgMHgzOTM5MmEsIAorICAweDQ0NDQsIDB4MmE0LCAweDQ0LCAweDQzOSwgMHg0MmEsIDB4NDJjMmMsIDB4NDU5NTksIDB4NDNiM2IsIAorICAweDQ0YTRhLCAweDQyYzJjLCAweDQ1OTU5LCAweDQzYjNiLCAweDQ0YTRhLCAweDQyYzJjLCAweDQzYjNiLCAweDQ0YTRhLCAKKyAgMHg0NTUsIDB4NDM5MzksIDB4NDJhMmEsIDB4NDM5MzksIDB4NDQ0LCAweDQzOTM5LCAweDQyYTJhLCAweDQzOTM5LCAKKyAgMHg0MmEyYSwgMHg0NDQsIDB4NDM5MzksIDB4NDJhMmEsIDB4NDJjMmMyYywgMHg0NTk1OTU5LCAweDQzYjNiM2IsIDB4NDRhNGE0YSwgCisgIDB4NDJjMmMyYywgMHg0NTk1OTU5LCAweDQzYjNiM2IsIDB4NDRhNGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIAorICAweDQyYzJjLCAweDQ1OTU5LCAweDQzYjNiLCAweDQ0YTRhLCAweDQyYzJjLCAweDQ1OTU5LCAweDQzYjNiLCAweDQ0YTRhLCAKKyAgMHg0MmMyYywgMHg0NTk1OSwgMHg0M2IzYiwgMHg0NGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIAorICAweDQyYzJjLCAweDQ1OTU5LCAweDQzYjNiLCAweDQ0YTRhLCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgCisgIDB4NDJjMmMsIDB4NDU5NTksIDB4NDNiM2IsIDB4NDRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAKKyAgMHg0MmMyYywgMHg0NTk1OSwgMHg0M2IzYiwgMHg0NGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIAorICAweDQyYzJjLCAweDQ1OTU5LCAweDQzYjNiLCAweDQ0YTRhLCAweDQyZTJjMCwgMHg0MmU1OTAsIDB4NDJlM2IwLCAweDQyZTRhMCwgCisgIDB4MzkzOTM5LCAweDM5MzkzOSwgMHg0NDQsIDB4MzkzOTM5LCAweDM5MzkzOSwgMHg0NDQsIDB4NDQ0LCAweDJjMmMyYywgCisgIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMyYywgCisgIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDM5MzkzOSwgCisgIDB4MmEyYTJhLCAweDM5MzkzOSwgMHgyYTJhMmEsIDB4MmEyYTJhLCAweDJhMmEyYSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgCisgIDB4NGE0YTRhLCAweDQyYzJjLCAweDQ1OTU5LCAweDQzYjNiLCAweDQ0YTRhLCAweDJjMmMyYzJjLCAweDU5NTk1OTU5LCAweDNiM2IzYjNiLCAKKyAgMHg0YTRhNGE0YSwgMHg0NDAsIDB4MmMyYzJjLCAweDQyYzJjLCAweDg4OCwgMHg3NzcsIDB4Nzc3LCAweDg4OCwgCisgIDB4Nzc3LCAweDc3NywgMHg4ODgsIDB4Nzc3LCAweDc3NywgMHg4ODgsIDB4Nzc3LCAweDc3NywgCisgIDB4MmZjZjJmLCAweDJmY2YyZiwgMHgxZmNmMWYsIDB4MWZjZjFmLCAweDFmY2YxZiwgMHgxZmNmMWYsIDB4MWYxZmNmMWYsIDB4MWYxZmNmMWYsIAorICAweDFmY2YxZiwgMHgxZmNmMWYsIDB4MWZjZjFmLCAweDFmY2YxZiwgMHgxZmNmMWYsIDB4MWZjZjFmLCAweDc0ZjcsIDB4ODRmOCwgCisgIDB4NDRmNCwgMHg0NGY0LCAweDFmY2YxZiwgMHgxZmNmMWYsIDB4MWZjZjFmLCAweDFmY2YxZiwgMHgxZmNmMWYsIDB4MWZjZjFmLCAKKyAgMHgxZmNmMWYsIDB4MWZjZjFmLCAweDQwLCAweDQwLCAweDQ0MCwgMHg0MCwgMHg0MCwgMHg0NDAsIAorICAweDAsIDB4NDQsIDB4NDQsIDB4NDQsIDB4ODUsIDB4NzQsIDB4NDcsIDB4NTgsIAorICAweDg4LCAweDc3LCAweDc3LCAweDRmMCwgMHg0ZjAsIDB4NzcsIDB4NzcsIDB4ODcsIAorICAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg3LCAweDg0LCAKKyAgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NSwgMHg4NSwgMHg4NSwgCisgIDB4ODUsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODUsIDB4ODUsIDB4ODUsIAorICAweDg1LCAweDc3NywgMHg3NzcsIDB4ODg4LCAweDc3NywgMHg3NzcsIDB4ODg4LCAweDc3NywgCisgIDB4Nzc3LCAweDg4OCwgMHg3NzcsIDB4Nzc3LCAweDg4OCwgMHg3NzcsIDB4Nzc3LCAweDg4LCAKKyAgMHg3NywgMHg3NywgMHg3MywgMHg3MywgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NCwgCisgIDB4NzQsIDB4NzQsIDB4NzQsIDB4NzQsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIAorICAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc0LCAweDc0LCAweDc0LCAweDc0LCAKKyAgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgCisgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4ODgsIDB4NzcsIDB4NzcsIDB4ODgsIAorICAweDc3LCAweDc3LCAweDg4ODgsIDB4Nzc3NywgMHg3Nzc3LCAweDg4ODgsIDB4Nzc3NywgMHg3Nzc3LCAKKyAgMHg4ODg4LCAweDc3NzcsIDB4Nzc3NywgMHg4ODg4LCAweDc3NzcsIDB4Nzc3NywgMHg4ODgsIDB4Nzc3LCAKKyAgMHg3NzcsIDB4ODg4LCAweDc3NywgMHg3NzcsIDB4NDQ0NCwgMHg0OCwgMHg0OCwgMHg0OCwgCisgIDB4NDgsIDB4NDcsIDB4NDcsIDB4NDcsIDB4NDcsIDB4MmUxLCAweDJlMSwgMHgyZTEsIAorICAweDJlMSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg0Y2YyZiwgMHg0Y2YxZiwgMHg0Y2Y0ZiwgMHg0Y2YyZiwgCisgIDB4NGNmMWYsIDB4NGNmNGYsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NTgsIDB4NTgsIDB4NTgsIAorICAweDU4LCAweDU3LCAweDU3LCAweDU3LCAweDU3LCAweDQ0OCwgKDFVPDwzMSkgfCAxOTY3LCAoMVU8PDMxKSB8IDMxODIsIAorICAweDQ0NCwgMHg1NDUsIDB4MCwgMHgwLCAweDAsIDB4ODgsIDB4NzcsIDB4MzMsIAorICAweDQ0LCAweDU1LCAweGNmNGYsIDB4ODg4LCAweDc3NywgMHg3NzcsIDB4ODg4LCAweDc3NywgCisgIDB4Nzc3LCAweDg4OCwgMHg3NzcsIDB4Nzc3LCAweDg4OCwgMHg3NzcsIDB4Nzc3LCAweDQ0NCwgCisgIDB4NDQ0LCAweDQ0NCwgMHg1NTUsIDB4NDQ0LCAweDU1NSwgMHg0NDQ0LCAweGNmNGYsIDB4Y2Y0ZiwgCisgIDB4Y2Y0ZiwgMHhjZjRmLCAweGNmNGYsIDB4Y2Y0ZiwgMHhjZjRmLCAweGNmNGYsIDB4Y2Y0ZiwgMHg4OCwgCisgIDB4ODgsIDB4NzcsIDB4NzcsIDB4ODgsIDB4NzcsIDB4NzcsIDB4ODgsIDB4NzcsIAorICAweDc3LCAweDg4LCAweDc3LCAweDc3LCAweDQsIDB4NSwgMHg0LCAweDQsIAorICAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgCisgIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAKKyAgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIAorICAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgCisgIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAKKyAgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIAorICAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgCisgIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NGY0LCAweDQ0NCwgCisgIDB4NDU1LCAweDQ1NSwgMHg4OCwgMHg3NywgMHg3NywgMHg4OCwgMHg3NywgMHg3NywgCisgIDB4NDQ0NCwgMHg0NDQ0LCAweDg4LCAweDc3LCAweDc3LCAweDQ0NzcsIDB4NDQ0NCwgMHg0NDc3LCAKKyAgMHg0NDQ0LCAweDQ0NzcsIDB4NDQ0NCwgMHg0NDc0NywgMHg0NDQ0NCwgMHg0NDc0NywgMHg0NDQ0NCwgMHg0NDc0NywgCisgIDB4NDQ0NDQsIDB4NDQ3NDcsIDB4NDQ0NDQsIDB4NDQ3NywgMHg0NDQ0LCAweDc3LCAweDc3LCAweDc3LCAKKyAgMHg3NywgMHg3NywgMHg4OCwgMHg3NywgMHg3NywgMHg4OCwgMHg3NywgMHg3NywgCisgIDB4ODgsIDB4NzcsIDB4NzcsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NDQ1MywgMHg0NDUzLCAKKyAgMHg0NDUzLCAweDQ0NTQsIDB4NDQ1NCwgMHg0NDU0LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTMsIAorICAweDQ0NTMsIDB4NDQ1MywgKDFVPDwzMSkgfCAyMTYyLCAoMVU8PDMxKSB8IDIxNjIsICgxVTw8MzEpIHwgMjE2MiwgKDFVPDwzMSkgfCAyMTc4LCAoMVU8PDMxKSB8IDIxNzgsICgxVTw8MzEpIHwgMjE3OCwgCisgICgxVTw8MzEpIHwgMjE5NSwgKDFVPDwzMSkgfCAyMTk1LCAoMVU8PDMxKSB8IDIxOTUsICgxVTw8MzEpIHwgMjE2MiwgKDFVPDwzMSkgfCAyMTYyLCAoMVU8PDMxKSB8IDIxNjIsICgxVTw8MzEpIHwgMjE1MywgKDFVPDwzMSkgfCAyMTUzLCAKKyAgKDFVPDwzMSkgfCAyMTUzLCAoMVU8PDMxKSB8IDIxNjksICgxVTw8MzEpIHwgMjE2OSwgKDFVPDwzMSkgfCAyMTY5LCAoMVU8PDMxKSB8IDIxNTMsICgxVTw8MzEpIHwgMjE1MywgKDFVPDwzMSkgfCAyMTUzLCAweDQ1MywgCisgIDB4NDUzLCAweDQ1MywgMHg0NTQsIDB4NDU0LCAweDQ1NCwgMHg0NTUsIDB4NDU1LCAweDQ1NSwgCisgIDB4NDUzLCAweDQ1MywgMHg0NTMsICgxVTw8MzEpIHwgMjQ5OSwgKDFVPDwzMSkgfCAyNDk5LCAoMVU8PDMxKSB8IDI0OTksICgxVTw8MzEpIHwgMjUxMywgKDFVPDwzMSkgfCAyNTEzLCAKKyAgKDFVPDwzMSkgfCAyNTEzLCAoMVU8PDMxKSB8IDI1MjgsICgxVTw8MzEpIHwgMjUyOCwgKDFVPDwzMSkgfCAyNTI4LCAoMVU8PDMxKSB8IDI0OTksICgxVTw8MzEpIHwgMjQ5OSwgKDFVPDwzMSkgfCAyNDk5LCAoMVU8PDMxKSB8IDI0OTEsIAorICAoMVU8PDMxKSB8IDI0OTEsICgxVTw8MzEpIHwgMjQ5MSwgKDFVPDwzMSkgfCAyNTA1LCAoMVU8PDMxKSB8IDI1MDUsICgxVTw8MzEpIHwgMjUwNSwgKDFVPDwzMSkgfCAyNDkxLCAoMVU8PDMxKSB8IDI0OTEsICgxVTw8MzEpIHwgMjQ5MSwgCisgIDB4NDQ0NTMsIDB4NDQ0NTMsIDB4NDQ0NTMsIDB4NDQ0NTQsIDB4NDQ0NTQsIDB4NDQ0NTQsIDB4NDQ0NTUsIDB4NDQ0NTUsIAorICAweDQ0NDU1LCAweDQ0NDUzLCAweDQ0NDUzLCAweDQ0NDUzLCAoMVU8PDMxKSB8IDIwNzgsICgxVTw8MzEpIHwgMjA3OCwgKDFVPDwzMSkgfCAyMDc4LCAoMVU8PDMxKSB8IDIwOTYsIAorICAoMVU8PDMxKSB8IDIwOTYsICgxVTw8MzEpIHwgMjA5NiwgKDFVPDwzMSkgfCAyMTE1LCAoMVU8PDMxKSB8IDIxMTUsICgxVTw8MzEpIHwgMjExNSwgKDFVPDwzMSkgfCAyMDc4LCAoMVU8PDMxKSB8IDIwNzgsICgxVTw8MzEpIHwgMjA3OCwgCisgICgxVTw8MzEpIHwgMjA2OCwgKDFVPDwzMSkgfCAyMDY4LCAoMVU8PDMxKSB8IDIwNjgsICgxVTw8MzEpIHwgMjA4NiwgKDFVPDwzMSkgfCAyMDg2LCAoMVU8PDMxKSB8IDIwODYsICgxVTw8MzEpIHwgMjA2OCwgKDFVPDwzMSkgfCAyMDY4LCAKKyAgKDFVPDwzMSkgfCAyMDY4LCAweDQ0NTMsIDB4NDQ1MywgMHg0NDUzLCAweDQ0NTQsIDB4NDQ1NCwgMHg0NDU0LCAweDQ0NTUsIAorICAweDQ0NTUsIDB4NDQ1NSwgMHg0NDUzLCAweDQ0NTMsIDB4NDQ1MywgKDFVPDwzMSkgfCAyMTYyLCAoMVU8PDMxKSB8IDIxNjIsICgxVTw8MzEpIHwgMjE2MiwgCisgICgxVTw8MzEpIHwgMjE3OCwgKDFVPDwzMSkgfCAyMTc4LCAoMVU8PDMxKSB8IDIxNzgsICgxVTw8MzEpIHwgMjE5NSwgKDFVPDwzMSkgfCAyMTk1LCAoMVU8PDMxKSB8IDIxOTUsICgxVTw8MzEpIHwgMjE2MiwgKDFVPDwzMSkgfCAyMTYyLCAKKyAgKDFVPDwzMSkgfCAyMTYyLCAoMVU8PDMxKSB8IDIxNTMsICgxVTw8MzEpIHwgMjE1MywgKDFVPDwzMSkgfCAyMTUzLCAoMVU8PDMxKSB8IDIxNjksICgxVTw8MzEpIHwgMjE2OSwgKDFVPDwzMSkgfCAyMTY5LCAoMVU8PDMxKSB8IDIxNTMsIAorICAoMVU8PDMxKSB8IDIxNTMsICgxVTw8MzEpIHwgMjE1MywgMHg0NDQ1MywgMHg0NDQ1MywgMHg0NDQ1MywgMHg0NDQ1NCwgMHg0NDQ1NCwgMHg0NDQ1NCwgCisgIDB4NDQ0NTUsIDB4NDQ0NTUsIDB4NDQ0NTUsIDB4NDQ0NTMsIDB4NDQ0NTMsIDB4NDQ0NTMsICgxVTw8MzEpIHwgMjA3OCwgKDFVPDwzMSkgfCAyMDc4LCAKKyAgKDFVPDwzMSkgfCAyMDc4LCAoMVU8PDMxKSB8IDIwOTYsICgxVTw8MzEpIHwgMjA5NiwgKDFVPDwzMSkgfCAyMDk2LCAoMVU8PDMxKSB8IDIxMTUsICgxVTw8MzEpIHwgMjExNSwgKDFVPDwzMSkgfCAyMTE1LCAoMVU8PDMxKSB8IDIwNzgsIAorICAoMVU8PDMxKSB8IDIwNzgsICgxVTw8MzEpIHwgMjA3OCwgKDFVPDwzMSkgfCAyMDY4LCAoMVU8PDMxKSB8IDIwNjgsICgxVTw8MzEpIHwgMjA2OCwgKDFVPDwzMSkgfCAyMDg2LCAoMVU8PDMxKSB8IDIwODYsICgxVTw8MzEpIHwgMjA4NiwgCisgICgxVTw8MzEpIHwgMjA2OCwgKDFVPDwzMSkgfCAyMDY4LCAoMVU8PDMxKSB8IDIwNjgsIDB4NTQsIDB4NTQsIDB4NTQsIDB4NTQsIDB4NTQsIAorICAweDU0LCAweDM0NDUwLCAweDM0NDUwLCAweDM0NDUwLCAweDQ0NDUwLCAweDQ0NDUwLCAweDQ0NDUwLCAweDU0NDUwLCAKKyAgMHg1NDQ1MCwgMHg1NDQ1MCwgMHgzNDQ1MCwgMHgzNDQ1MCwgMHgzNDQ1MCwgMHgzMzQ0NTAsIDB4MzM0NDUwLCAweDMzNDQ1MCwgCisgIDB4NDQ0NDUwLCAweDQ0NDQ1MCwgMHg0NDQ0NTAsIDB4NTU0NDUwLCAweDU1NDQ1MCwgMHg1NTQ0NTAsIDB4MzM0NDUwLCAweDMzNDQ1MCwgCisgIDB4MzM0NDUwLCAweDMzMzM0NDUwLCAweDMzMzM0NDUwLCAweDMzMzM0NDUwLCAweDQ0NDQ0NDUwLCAweDQ0NDQ0NDUwLCAweDQ0NDQ0NDUwLCAweDMzMzM0NDUwLCAKKyAgMHgzMzMzNDQ1MCwgMHgzMzMzNDQ1MCwgMHgzNDUwLCAweDM0NTAsIDB4MzQ1MCwgMHg0NDUwLCAweDQ0NTAsIDB4NDQ1MCwgCisgIDB4NTQ1MCwgMHg1NDUwLCAweDU0NTAsIDB4MzQ1MCwgMHgzNDUwLCAweDM0NTAsIDB4MzM0NTAsIDB4MzM0NTAsIAorICAweDMzNDUwLCAweDQ0NDUwLCAweDQ0NDUwLCAweDQ0NDUwLCAweDU1NDUwLCAweDU1NDUwLCAweDU1NDUwLCAweDMzNDUwLCAKKyAgMHgzMzQ1MCwgMHgzMzQ1MCwgMHgzMzMzNDUwLCAweDMzMzM0NTAsIDB4MzMzMzQ1MCwgMHg0NDQ0NDUwLCAweDQ0NDQ0NTAsIDB4NDQ0NDQ1MCwgCisgIDB4MzMzMzQ1MCwgMHgzMzMzNDUwLCAweDMzMzM0NTAsIDB4MzQ0NDUwLCAweDM0NDQ1MCwgMHgzNDQ0NTAsIDB4NDQ0NDUwLCAweDQ0NDQ1MCwgCisgIDB4NDQ0NDUwLCAweDU0NDQ1MCwgMHg1NDQ0NTAsIDB4NTQ0NDUwLCAweDM0NDQ1MCwgMHgzNDQ0NTAsIDB4MzQ0NDUwLCAweDMzNDQ0NTAsIAorICAweDMzNDQ0NTAsIDB4MzM0NDQ1MCwgMHg0NDQ0NDUwLCAweDQ0NDQ0NTAsIDB4NDQ0NDQ1MCwgMHg1NTQ0NDUwLCAweDU1NDQ0NTAsIDB4NTU0NDQ1MCwgCisgIDB4MzM0NDQ1MCwgMHgzMzQ0NDUwLCAweDMzNDQ0NTAsICgxVTw8MzEpIHwgMTEwNSwgKDFVPDwzMSkgfCAxMTA1LCAoMVU8PDMxKSB8IDExMDUsICgxVTw8MzEpIHwgMjA1MSwgKDFVPDwzMSkgfCAyMDUxLCAKKyAgKDFVPDwzMSkgfCAyMDUxLCAoMVU8PDMxKSB8IDExMDUsICgxVTw8MzEpIHwgMTEwNSwgKDFVPDwzMSkgfCAxMTA1LCAweDM0NDUwLCAweDM0NDUwLCAweDM0NDUwLCAweDQ0NDUwLCAKKyAgMHg0NDQ1MCwgMHg0NDQ1MCwgMHg1NDQ1MCwgMHg1NDQ1MCwgMHg1NDQ1MCwgMHgzNDQ1MCwgMHgzNDQ1MCwgMHgzNDQ1MCwgCisgIDB4MzM0NDUwLCAweDMzNDQ1MCwgMHgzMzQ0NTAsIDB4NDQ0NDUwLCAweDQ0NDQ1MCwgMHg0NDQ0NTAsIDB4NTU0NDUwLCAweDU1NDQ1MCwgCisgIDB4NTU0NDUwLCAweDMzNDQ1MCwgMHgzMzQ0NTAsIDB4MzM0NDUwLCAweDMzMzM0NDUwLCAweDMzMzM0NDUwLCAweDMzMzM0NDUwLCAweDQ0NDQ0NDUwLCAKKyAgMHg0NDQ0NDQ1MCwgMHg0NDQ0NDQ1MCwgMHgzMzMzNDQ1MCwgMHgzMzMzNDQ1MCwgMHgzMzMzNDQ1MCwgMHgzNDQ0NTAsIDB4MzQ0NDUwLCAweDM0NDQ1MCwgCisgIDB4NDQ0NDUwLCAweDQ0NDQ1MCwgMHg0NDQ0NTAsIDB4NTQ0NDUwLCAweDU0NDQ1MCwgMHg1NDQ0NTAsIDB4MzQ0NDUwLCAweDM0NDQ1MCwgCisgIDB4MzQ0NDUwLCAweDMzNDQ0NTAsIDB4MzM0NDQ1MCwgMHgzMzQ0NDUwLCAweDQ0NDQ0NTAsIDB4NDQ0NDQ1MCwgMHg0NDQ0NDUwLCAweDU1NDQ0NTAsIAorICAweDU1NDQ0NTAsIDB4NTU0NDQ1MCwgMHgzMzQ0NDUwLCAweDMzNDQ0NTAsIDB4MzM0NDQ1MCwgKDFVPDwzMSkgfCAxMTA1LCAoMVU8PDMxKSB8IDExMDUsICgxVTw8MzEpIHwgMTEwNSwgCisgICgxVTw8MzEpIHwgMjA1MSwgKDFVPDwzMSkgfCAyMDUxLCAoMVU8PDMxKSB8IDIwNTEsICgxVTw8MzEpIHwgMTEwNSwgKDFVPDwzMSkgfCAxMTA1LCAoMVU8PDMxKSB8IDExMDUsIDB4MzQ0NTAsIDB4NDQ0NTAsIAorICAweDM0NDUwLCAweDMzNDQ1MCwgMHg0NDQ0NTAsIDB4MzM0NDUwLCAweDMzMzM0NDUwLCAweDQ0NDQ0NDUwLCAweDMzMzM0NDUwLCAweDM0NTAsIAorICAweDQ0NTAsIDB4MzQ1MCwgMHgzMzQ1MCwgMHg0NDQ1MCwgMHgzMzQ1MCwgMHgzMzMzNDUwLCAweDQ0NDQ0NTAsIDB4MzMzMzQ1MCwgCisgIDB4MzQ0NDUwLCAweDQ0NDQ1MCwgMHgzNDQ0NTAsIDB4MzM0NDQ1MCwgMHg0NDQ0NDUwLCAweDMzNDQ0NTAsICgxVTw8MzEpIHwgMTEwNSwgKDFVPDwzMSkgfCAyMDUxLCAKKyAgKDFVPDwzMSkgfCAxMTA1LCAweDM0NDUwLCAweDQ0NDUwLCAweDM0NDUwLCAweDMzNDQ1MCwgMHg0NDQ0NTAsIDB4MzM0NDUwLCAweDMzMzM0NDUwLCAKKyAgMHg0NDQ0NDQ1MCwgMHgzMzMzNDQ1MCwgMHgzNDQ0NTAsIDB4NDQ0NDUwLCAweDM0NDQ1MCwgMHgzMzQ0NDUwLCAweDQ0NDQ0NTAsIDB4MzM0NDQ1MCwgCisgICgxVTw8MzEpIHwgMTEwNSwgKDFVPDwzMSkgfCAyMDUxLCAoMVU8PDMxKSB8IDExMDUsIDB4NTUsICgxVTw8MzEpIHwgMzUwNiwgKDFVPDwzMSkgfCAzNDk0LCAoMVU8PDMxKSB8IDM0OTQsICgxVTw8MzEpIHwgMzQyNCwgCisgICgxVTw8MzEpIHwgMzQxMywgKDFVPDwzMSkgfCAzNDEzLCAoMVU8PDMxKSB8IDMzNTAsICgxVTw8MzEpIHwgMjIwMiwgKDFVPDwzMSkgfCAzMzQwLCAoMVU8PDMxKSB8IDIxODUsICgxVTw8MzEpIHwgMzM0MCwgKDFVPDwzMSkgfCAyMTg1LCAKKyAgKDFVPDwzMSkgfCAzNTUwLCAoMVU8PDMxKSB8IDM1MzksICgxVTw8MzEpIHwgMzUzOSwgKDFVPDwzMSkgfCAzNDY0LCAoMVU8PDMxKSB8IDM0NTQsICgxVTw8MzEpIHwgMzQ1NCwgKDFVPDwzMSkgfCAzMzg2LCAoMVU8PDMxKSB8IDI1MzQsIAorICAoMVU8PDMxKSB8IDMzNzcsICgxVTw8MzEpIHwgMjUxOSwgKDFVPDwzMSkgfCAzMzc3LCAoMVU8PDMxKSB8IDI1MTksICgxVTw8MzEpIHwgMzY5NiwgKDFVPDwzMSkgfCAzNjgxLCAoMVU8PDMxKSB8IDM2ODEsICgxVTw8MzEpIHwgMzUwNiwgCisgICgxVTw8MzEpIHwgMzQ5NCwgKDFVPDwzMSkgfCAzNDk0LCAoMVU8PDMxKSB8IDM0MjQsICgxVTw8MzEpIHwgMjEyMywgKDFVPDwzMSkgfCAzNDEzLCAoMVU8PDMxKSB8IDIxMDQsICgxVTw8MzEpIHwgMzQxMywgKDFVPDwzMSkgfCAyMTA0LCAKKyAgKDFVPDwzMSkgfCAzNzUyLCAoMVU8PDMxKSB8IDM3MzgsICgxVTw8MzEpIHwgMzczOCwgKDFVPDwzMSkgfCAzNTUwLCAoMVU8PDMxKSB8IDM1MzksICgxVTw8MzEpIHwgMzUzOSwgKDFVPDwzMSkgfCAzNDY0LCAoMVU8PDMxKSB8IDIyMDIsIAorICAoMVU8PDMxKSB8IDM0NTQsICgxVTw8MzEpIHwgMjE4NSwgKDFVPDwzMSkgfCAzNDU0LCAoMVU8PDMxKSB8IDIxODUsICgxVTw8MzEpIHwgMzkyNCwgKDFVPDwzMSkgfCAzOTA3LCAoMVU8PDMxKSB8IDM5MDcsICgxVTw8MzEpIHwgMzY0NCwgCisgICgxVTw8MzEpIHwgMzYzMiwgKDFVPDwzMSkgfCAzNjMyLCAoMVU8PDMxKSB8IDM1NTAsICgxVTw8MzEpIHwgMjEyMywgKDFVPDwzMSkgfCAzNTM5LCAoMVU8PDMxKSB8IDIxMDQsICgxVTw8MzEpIHwgMzUzOSwgKDFVPDwzMSkgfCAyMTA0LCAKKyAgKDFVPDwzMSkgfCAzNTk2LCAoMVU8PDMxKSB8IDM1ODMsICgxVTw8MzEpIHwgMzU4MywgKDFVPDwzMSkgfCAzNTA2LCAoMVU8PDMxKSB8IDM0OTQsICgxVTw8MzEpIHwgMzQ5NCwgKDFVPDwzMSkgfCAzNjQ0LCAoMVU8PDMxKSB8IDM2MzIsIAorICAoMVU8PDMxKSB8IDM2MzIsICgxVTw8MzEpIHwgMzU1MCwgKDFVPDwzMSkgfCAzNTM5LCAoMVU8PDMxKSB8IDM1MzksICgxVTw8MzEpIHwgMzUxOCwgKDFVPDwzMSkgfCAzNDgzLCAoMVU8PDMxKSB8IDM0ODMsICgxVTw8MzEpIHwgMzQzNSwgCisgICgxVTw8MzEpIHwgMzQwMywgKDFVPDwzMSkgfCAzNDAzLCAoMVU8PDMxKSB8IDMzNjAsICgxVTw8MzEpIHwgMjIxMiwgKDFVPDwzMSkgfCAzMzMxLCAoMVU8PDMxKSB8IDIxNjksICgxVTw8MzEpIHwgMzMzMSwgKDFVPDwzMSkgfCAyMTY5LCAKKyAgKDFVPDwzMSkgfCAzNTYxLCAoMVU8PDMxKSB8IDM1MjksICgxVTw8MzEpIHwgMzUyOSwgKDFVPDwzMSkgfCAzNDc0LCAoMVU8PDMxKSB8IDM0NDUsICgxVTw8MzEpIHwgMzQ0NSwgKDFVPDwzMSkgfCAzMzk1LCAoMVU8PDMxKSB8IDI1NDMsIAorICAoMVU8PDMxKSB8IDMzNjksICgxVTw8MzEpIHwgMjUwNSwgKDFVPDwzMSkgfCAzMzY5LCAoMVU8PDMxKSB8IDI1MDUsICgxVTw8MzEpIHwgMzcxMSwgKDFVPDwzMSkgfCAzNjY3LCAoMVU8PDMxKSB8IDM2NjcsICgxVTw8MzEpIHwgMzUxOCwgCisgICgxVTw8MzEpIHwgMzQ4MywgKDFVPDwzMSkgfCAzNDgzLCAoMVU8PDMxKSB8IDM0MzUsICgxVTw8MzEpIHwgMjEzNCwgKDFVPDwzMSkgfCAzNDAzLCAoMVU8PDMxKSB8IDIwODYsICgxVTw8MzEpIHwgMzQwMywgKDFVPDwzMSkgfCAyMDg2LCAKKyAgKDFVPDwzMSkgfCAzNzY2LCAoMVU8PDMxKSB8IDM3MjUsICgxVTw8MzEpIHwgMzcyNSwgKDFVPDwzMSkgfCAzNTYxLCAoMVU8PDMxKSB8IDM1MjksICgxVTw8MzEpIHwgMzUyOSwgKDFVPDwzMSkgfCAzNDc0LCAoMVU8PDMxKSB8IDIyMTIsIAorICAoMVU8PDMxKSB8IDM0NDUsICgxVTw8MzEpIHwgMjE2OSwgKDFVPDwzMSkgfCAzNDQ1LCAoMVU8PDMxKSB8IDIxNjksICgxVTw8MzEpIHwgMzk0MSwgKDFVPDwzMSkgfCAzODkxLCAoMVU8PDMxKSB8IDM4OTEsICgxVTw8MzEpIHwgMzY1NiwgCisgICgxVTw8MzEpIHwgMzYyMSwgKDFVPDwzMSkgfCAzNjIxLCAoMVU8PDMxKSB8IDM1NjEsICgxVTw8MzEpIHwgMjEzNCwgKDFVPDwzMSkgfCAzNTI5LCAoMVU8PDMxKSB8IDIwODYsICgxVTw8MzEpIHwgMzUyOSwgKDFVPDwzMSkgfCAyMDg2LCAKKyAgKDFVPDwzMSkgfCAzNjA5LCAoMVU8PDMxKSB8IDM1NzEsICgxVTw8MzEpIHwgMzU3MSwgKDFVPDwzMSkgfCAzNTE4LCAoMVU8PDMxKSB8IDM0ODMsICgxVTw8MzEpIHwgMzQ4MywgKDFVPDwzMSkgfCAzNjU2LCAoMVU8PDMxKSB8IDM2MjEsIAorICAoMVU8PDMxKSB8IDM2MjEsICgxVTw8MzEpIHwgMzU2MSwgKDFVPDwzMSkgfCAzNTI5LCAoMVU8PDMxKSB8IDM1MjksICgxVTw8MzEpIHwgMzA5OCwgMHg0ZjUsICgxVTw8MzEpIHwgMzQ2NCwgKDFVPDwzMSkgfCAzNDU0LCAKKyAgKDFVPDwzMSkgfCAzNDU0LCAoMVU8PDMxKSB8IDM0NjQsICgxVTw8MzEpIHwgMzQ1NCwgKDFVPDwzMSkgfCAzNDU0LCAoMVU8PDMxKSB8IDM0NjQsICgxVTw8MzEpIHwgMzQ1NCwgKDFVPDwzMSkgfCAzNDU0LCAoMVU8PDMxKSB8IDM0NjQsIAorICAoMVU8PDMxKSB8IDM0NTQsICgxVTw8MzEpIHwgMzQ1NCwgKDFVPDwzMSkgfCAzNDc0LCAoMVU8PDMxKSB8IDM0NDUsICgxVTw8MzEpIHwgMzQ0NSwgKDFVPDwzMSkgfCAzNDc0LCAoMVU8PDMxKSB8IDM0NDUsICgxVTw8MzEpIHwgMzQ0NSwgCisgICgxVTw8MzEpIHwgMzQ3NCwgKDFVPDwzMSkgfCAzNDQ1LCAoMVU8PDMxKSB8IDM0NDUsICgxVTw8MzEpIHwgMzQ3NCwgKDFVPDwzMSkgfCAzNDQ1LCAoMVU8PDMxKSB8IDM0NDUsIDB4ODgsIDB4NzcsIAorICAweDc3LCAweDU0LCAweDU0LCAweDU0LCAweDU0LCAweDU0LCAweDU0LCAweDU0LCAKKyAgMHg1NCwgMHg0OCwgMHg0OCwgMHg0OCwgMHg0OCwgMHg0NywgMHg0NywgMHg0NywgCisgIDB4NDcsIDB4NTgsIDB4NTgsIDB4NTgsIDB4NTgsIDB4NTcsIDB4NTcsIDB4NTcsIAorICAweDU3LCAweDExLCAweDE0MSwgMHgxMSwgMHgxNDEsIDB4MTQsIDB4MTQ0LCAweDExLCAKKyAgMHgxNDEsICgxVTw8MzEpIHwgMzA1NCwgKDFVPDwzMSkgfCAyNDEzLCAoMVU8PDMxKSB8IDMwNTQsICgxVTw8MzEpIHwgMjQxMywgKDFVPDwzMSkgfCAzMDU0LCAoMVU8PDMxKSB8IDI0MTMsICgxVTw8MzEpIHwgMzA1NCwgCisgICgxVTw8MzEpIHwgMjQxMywgKDFVPDwzMSkgfCAzMDc0LCAoMVU8PDMxKSB8IDMwODYsICgxVTw8MzEpIHwgMjQzNCwgKDFVPDwzMSkgfCAyNDQ3LCAoMVU8PDMxKSB8IDMwNzQsICgxVTw8MzEpIHwgMzA4NiwgKDFVPDwzMSkgfCAyNDM0LCAKKyAgKDFVPDwzMSkgfCAyNDQ3LCAoMVU8PDMxKSB8IDMyMzEsICgxVTw8MzEpIHwgMzIzMSwgKDFVPDwzMSkgfCAzNzkxLCAoMVU8PDMxKSB8IDM3OTEsICgxVTw8MzEpIHwgMzI4MSwgKDFVPDwzMSkgfCAzMjgxLCAoMVU8PDMxKSB8IDM4NDEsIAorICAoMVU8PDMxKSB8IDM4NDEsICgxVTw8MzEpIHwgMzIzMSwgKDFVPDwzMSkgfCAzMjMxLCAoMVU8PDMxKSB8IDM3OTEsICgxVTw8MzEpIHwgMzc5MSwgKDFVPDwzMSkgfCAzMjgxLCAoMVU8PDMxKSB8IDMyODEsICgxVTw8MzEpIHwgMzg0MSwgCisgICgxVTw8MzEpIHwgMzg0MSwgKDFVPDwzMSkgfCAzMjMxLCAoMVU8PDMxKSB8IDMyMzEsICgxVTw8MzEpIHwgMzc5MSwgKDFVPDwzMSkgfCAzNzkxLCAoMVU8PDMxKSB8IDMyODEsICgxVTw8MzEpIHwgMzI4MSwgKDFVPDwzMSkgfCAzODQxLCAKKyAgKDFVPDwzMSkgfCAzODQxLCAoMVU8PDMxKSB8IDMyMzEsICgxVTw8MzEpIHwgMzIzMSwgKDFVPDwzMSkgfCAzNzkxLCAoMVU8PDMxKSB8IDM3OTEsICgxVTw8MzEpIHwgMzI4MSwgKDFVPDwzMSkgfCAzMjgxLCAoMVU8PDMxKSB8IDM4NDEsIAorICAoMVU8PDMxKSB8IDM4NDEsICgxVTw8MzEpIHwgMzIxOSwgKDFVPDwzMSkgfCAzNzc5LCAoMVU8PDMxKSB8IDI2MjUsICgxVTw8MzEpIHwgMjYzOCwgKDFVPDwzMSkgfCAzMjE5LCAoMVU8PDMxKSB8IDM3NzksICgxVTw8MzEpIHwgMjYyNSwgCisgICgxVTw8MzEpIHwgMjYzOCwgMHg1OTU5NTksIDB4NTk1OTU5LCAweDU5NTk1OSwgMHg1OTU5NTksIDB4MmMyYzJjMmMsIDB4MmMyYzJjLCAweDU5NTk1OSwgCisgIDB4M2IzYjNiLCAweDRhNGE0YSwgMHg1OTU5LCAweDQ0NTk1OSwgMHg0NDRhNGEsIDB4NDAsIDB4MCwgMHg0NDJlMCwgCisgIDB4NDQyZTAsIDB4NDQyZTAsIDB4NDQyZTAsIDB4MmUyYywgMHgyZTNiLCAweDJlNGEsIDB4MmUyYywgMHgyZTJjLCAKKyAgMHgyZTRhLCAweDJlNGEsIDB4M2IsIDB4NGEwLCAweDJlMmMwLCAweDJlM2IwLCAweDJlNGEwLCAweDJlNGEwLCAKKyAgMHgyZTRhMCwgMHgyYzJjMmMsIDB4M2IzYjNiLCAweDRhNGE0YSwgKDFVPDwzMSkgfCA0MjYyLCAweDRhNGE0YSwgKDFVPDwzMSkgfCA0MjYwLCAoMVU8PDMxKSB8IDQyNjAsIAorICAweDJjMmMyYywgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMyYywgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMyYywgMHgzYjNiM2IsIAorICAweDRhNGE0YSwgMHgyYzJjMmMsIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjNTksIDB4NDRhN2EsIDB4NDRhN2EsIDB4MmM0LCAKKyAgMHg3YTdhNGEsIDB4N2E3YTQ0LCAweDdhN2E0YSwgMHg3YTdhNDQsIDB4MmMyYzJjLCAweDJjMmM0NCwgMHg1OTU5NTksIDB4NTk1OTQ0LCAKKyAgMHgzYjNiM2IsIDB4M2IzYjQ0LCAweDRhNGE0YSwgMHg0YTRhNDQsIDB4N2E3YTRhLCAweDdhN2E0NCwgMHg3YTdhNGEsIDB4N2E3YTQ0LCAKKyAgMHgyYzJjMmMsIDB4MmMyYzQ0LCAweDU5NTk1OSwgMHg1OTU5NDQsIDB4M2IzYjNiLCAweDNiM2I0NCwgMHg0YTRhNGEsIDB4NGE0YTQ0LCAKKyAgMHgyYzJjMmMsIDB4MmMyYzQ0LCAweDU5NTk1OSwgMHg1OTU5NDQsIDB4M2IzYjNiLCAweDNiM2I0NCwgMHg0YTRhNGEsIDB4NGE0YTQ0LCAKKyAgMHgyYzJjMmMsIDB4MmMyYzQ0LCAweDNiM2IzYiwgMHgzYjNiNDQsIDB4NGE0YTRhLCAweDRhNGE0NCwgMHgyYzJjMmMsIDB4MmMyYzQ0LCAKKyAgMHgzYjNiM2IsIDB4M2IzYjQ0LCAweDRhNGE0YSwgMHg0YTRhNDQsIDB4NDdhNGEsIDB4NDdhNGEsIDB4MmM0LCAweDdhN2EsIAorICAweDJjMmMsIDB4N2E3YSwgMHg3YTdhN2E3YSwgMHg3YTdhN2EsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAKKyAgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4M2IzYjNiM2IsIDB4M2IzYjNiM2IsIDB4N2E3YTdhLCAweDJjMmMyYywgCisgIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDNiM2IzYjNiLCAKKyAgMHg0YTJjMmM0YSwgMHg0YTNiM2I0YSwgMHg0YTNiM2I0YSwgMHg0YTJjMmM0YSwgMHg0YTNiM2I0YSwgMHg0YTNiM2I0YSwgMHgyYzJjM2IsIDB4M2IzYjRhLCAKKyAgMHg0YTRhNTksIDB4MmMyYzNiLCAweDNiM2I0YSwgMHg0YTRhNTksIDB4MmMyYzNiLCAweDNiM2I0YSwgMHg0YTRhNTksIDB4MmMyYzNiLCAKKyAgMHgzYjNiNGEsIDB4NGE0YTU5LCAweDdhN2E3YTdhLCAweDJjNGE0YTRhLCAweDRhNGEzYiwgMHg1OTU5NGEsIDB4NTk1OTRhLCAweDNiM2IyYywgCisgIDB4M2IzYjJjLCAweDRhNGEzYiwgMHg0YTRhM2IsIDB4NTk1OTRhLCAweDNiM2IyYywgMHg0YTRhM2IsIDB4NTk1OSwgKDFVPDwzMSkgfCA0MjY0LCAKKyAgMHg0YTRhLCAweDdhN2EsIDB4N2E3YSwgMHg3YTdhLCAweDdhN2EsIDB4N2E3YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAKKyAgMHg1OTU5NTk1OSwgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHg0YTRhNGE0YSwgMHg0YTRhNGEsIDB4N2E3YSwgMHg0YTRhNGE0YSwgCisgIDB4NGE0YTRhLCAweDJjMmMyYywgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMyYywgMHg0YTRhNGEsIDB4NGE0YTRhLCAweDJjMmMyYywgCisgIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4NGE0YTRhLCAoMVU8PDMxKSB8IDQyNjIsIAorICAweDRhNGE0YSwgKDFVPDwzMSkgfCA0MjYwLCAoMVU8PDMxKSB8IDQyNjAsIDB4MmMyYzJjLCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDNiM2IzYiwgCisgIDB4NGE0YTRhLCAweDRhNGE0YSwgMHg0YTJjNGEsIDB4NGEzYjRhLCAweDRhMmM0YSwgMHg0YTRhNGEsIDB4M2I0YSwgMHgyYzNiLCAKKyAgMHgzYjRhLCAweDRhNTksIDB4M2I0YSwgMHgyYzNiLCAweDNiNGEsIDB4NGE1OSwgMHg1NTUsIDB4MWYwLCAKKyAgMHgyZTAsIDB4MmUwLCAweDJlMCwgMHgyZTAsIDB4MmUwLCAweDJlMCwgMHgyZTAsIDB4MmUwLCAKKyAgMHg1NTUsIDB4NTU1LCAweDQ0NCwgMHg0NDQsIDB4NSwgMHg1LCAweDUsIDB4NSwgCisgIDB4MSwgMHgwLCAweDFmMCwgMHg4YThhLCAweDhhOGE4YSwgMHg4YThhOGEsIDB4OGE4YSwgMHg4YThhLCAKKyAgMHg4YThhLCAweDhhOGEsIDB4OGE4YThhLCAweDhhOGE4YSwgMHg4YThhOGEsIDB4OGE4YThhLCAweDhhOGEsIDB4OGE4YSwgCisgIDB4OGE4YSwgMHg4YThhLCAweDhhOGEsIDB4OGE4YSwgMHg4YThhLCAweDhhOGEsIDB4NDhhOGE4YSwgKDFVPDwzMSkgfCAzOTkyLCAKKyAgKDFVPDwzMSkgfCAzOTkyLCAoMVU8PDMxKSB8IDM5OTIsICgxVTw8MzEpIHwgMzk5MiwgMHg4YThhOGEsIDB4OGE4YThhLCAweDhhOGEsIDB4OGE4YSwgKDFVPDwzMSkgfCAzOTkyLCAKKyAgKDFVPDwzMSkgfCAzOTkyLCAoMVU8PDMxKSB8IDM5OTIsICgxVTw8MzEpIHwgMzk5MiwgKDFVPDwzMSkgfCAzOTkyLCAweDhhOGEsIDB4OGE4YSwgMHg4YThhLCAweDhhOGEsIAorICAweDhhOGEsIDB4OGE4YSwgMHg4YThhLCAweDhhOGEsIDB4OGE4YSwgKDFVPDwzMSkgfCAzOTkyLCAweDhhOGE4YSwgMHg4YThhOGEsIAorICAweDhhOGE4YSwgKDFVPDwzMSkgfCAzOTkyLCAoMVU8PDMxKSB8IDM5OTIsIDB4OGE4YThhLCAweDhhOGE4YSwgKDFVPDwzMSkgfCAzOTkyLCAoMVU8PDMxKSB8IDM5OTIsICgxVTw8MzEpIHwgMzk5MiwgCisgICgxVTw8MzEpIHwgMzk5MiwgKDFVPDwzMSkgfCAzOTkyLCAoMVU8PDMxKSB8IDM5OTIsIDB4NDhhLCAweDJlOGEsIDB4MmU4YSwgMHgyZThhLCAweDJlOGEsIAorICAweDJlOGEsIDB4MmU4YSwgMHgyZThhLCAweDJlOGEsIDB4MmU4YSwgMHgyZThhLCAweDJlOGEsIDB4MmU4YSwgCisgIDB4MmU4YSwgMHgyZThhLCAweDJlOGEsIDB4MmU4YSwgMHgyZThhMCwgMHgyZThhMCwgMHgyZThhMCwgMHgyZThhMCwgCisgIDB4MmU4YTAsIDB4MmU4YTAsIDB4MmU4YTAsIDB4MmU4YTAsIDB4MmU4YTAsIDB4MmU4YTAsIDB4NTAsIDB4NTAsIAorICAweDUwLCAweDUwLCAweDAsIDB4NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgCisgIDB4NDQsIDB4NCwgMHg0NCwgMHg0LCAweDQsIDB4NDQsIDB4NCwgMHg0NCwgCisgIDB4NCwgMHg1LCAweDJlODksIDB4MmU4OSwgMHg1MmU0YSwgMHg1MmU0YSwgMHgyZTRhLCAweDJlNGEsIAorICAweDJlODkwLCAweDJlODkwLCAweDUyZTRhMCwgMHg1MmU0YTAsIDB4MmU0YTAsIDB4MmU0YTAsIDB4ODg4LCAweDg4OCwgCisgIDB4ODk4OTU5LCAweDg5ODk0NCwgMHg3YTdhNGEsIDB4N2E3YTQ0LCAweDg5ODk1OSwgMHg4OTg5NDQsIDB4N2E3YTRhLCAweDdhN2E0NCwgCisgIDB4ODk4OTU5LCAweDg5ODk0NCwgMHg3YTdhNGEsIDB4N2E3YTQ0LCAweDg5N2EsIDB4ODk0YSwgMHg4OTRhLCAweDNiN2EsIAorICAweDdhODksIDB4N2E3YSwgMHg1OTdhLCAweDRhODksIDB4NTk3YSwgMHg0YTg5LCAweDg5ODk4OSwgMHg3YTdhN2EsIAorICAweDU5NTk4OSwgMHg0YTRhN2EsIDB4ODk4OTg5LCAweDdhN2E3YSwgMHg4OTg5ODksIDB4N2E3YTdhLCAweDg5ODksIDB4ODk4OSwgCisgIDB4N2E3YSwgMHg3YTdhLCAweDg5ODksIDB4N2E3YSwgMHg0ODk1OSwgMHg0N2E0YSwgMHg4OTU5LCAweDdhNGEsIAorICAweDg5NTksIDB4N2E0YSwgMHg0NTk1OSwgMHg0NTk0YTRhLCAweDRhNGE0YSwgMHg3YTdhLCAweDAsICgxVTw8MzEpIHwgNzk2LCAKKyAgMHg0NGE0YTAsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgCisgIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAKKyAgMHgyZjJmLCAweDJmMmYsIDB4NCwgMHg0LCAweDQyZTQsIDB4NWU1MCwgMHg0MCwgMHg0MCwgCisgIDB4NTAsIDB4NDJlNCwgMHg0MmU0LCAweDQyZTAsIDB4NTJmNCwgMHg0LCAweDJjMmMyYywgMHgyYzJjMmMyYywgCisgIDB4NGE0YTRhLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4MmMyYzJjLCAweDJjMmMyYzJjLCAweDJjMmMyYywgMHgyYzJjMmMsIDB4NGE0YTRhLCAKKyAgMHg1OTU5NTksIDB4M2IzYjNiLCAweDJjMmMyYywgMHg0YTRhNGEsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHgyYzJjNTksICgxVTw8MzEpIHwgOTY1LCAKKyAgKDFVPDwzMSkgfCAyODAzLCAoMVU8PDMxKSB8IDMyMTAsICgxVTw8MzEpIHwgMTIyOCwgKDFVPDwzMSkgfCA5NjUsICgxVTw8MzEpIHwgMjgwMywgKDFVPDwzMSkgfCAzMjEwLCAoMVU8PDMxKSB8IDEyMjgsICgxVTw8MzEpIHwgOTY1LCAKKyAgKDFVPDwzMSkgfCAyODAzLCAoMVU8PDMxKSB8IDMyMTAsICgxVTw8MzEpIHwgMTIyOCwgMHg0YTRhNGEsICgxVTw8MzEpIHwgMTczOCwgKDFVPDwzMSkgfCAyMjUzLCAoMVU8PDMxKSB8IDI1NzEsICgxVTw8MzEpIHwgMTg4MywgCisgIDB4NDJjMmMsIDB4NDRhNGEsIDB4NDU5NTksIDB4NDNiM2IsIDB4MmMyYzJjLCAweDRhNGE0YSwgMHg1OTU5NTksIDB4M2IzYjNiLCAKKyAgMHg0MmMyYzJjLCAoMVU8PDMxKSB8IDE3NjAsIDB4NDRhNGE0YSwgKDFVPDwzMSkgfCAyMjMxLCAweDQzYjNiM2IsICgxVTw8MzEpIHwgMTkwNSwgMHg0MmMyYzJjLCAoMVU8PDMxKSB8IDE3NjAsIAorICAweDQ0YTRhNGEsICgxVTw8MzEpIHwgMjIzMSwgMHg0M2IzYjNiLCAoMVU8PDMxKSB8IDE5MDUsICgxVTw8MzEpIHwgMzk3MCwgKDFVPDwzMSkgfCAzOTU3LCAoMVU8PDMxKSB8IDM5NzAsICgxVTw8MzEpIHwgMzk3MCwgCisgICgxVTw8MzEpIHwgMzk1NywgKDFVPDwzMSkgfCAzOTU3LCAweDJjMmMyYywgKDFVPDwzMSkgfCA5NjUsIDB4NGE0YTRhLCAoMVU8PDMxKSB8IDI4MDMsIDB4M2IzYjNiLCAoMVU8PDMxKSB8IDEyMjgsIAorICAweDJjMmMyYywgKDFVPDwzMSkgfCA5NjUsIDB4NGE0YTRhLCAoMVU8PDMxKSB8IDI4MDMsIDB4M2IzYjNiLCAoMVU8PDMxKSB8IDEyMjgsIDB4MmMyYzJjLCAoMVU8PDMxKSB8IDk2NSwgCisgIDB4NGE0YTRhLCAoMVU8PDMxKSB8IDI4MDMsIDB4M2IzYjNiLCAoMVU8PDMxKSB8IDEyMjgsIDB4MmMyYzJjLCAoMVU8PDMxKSB8IDk2NSwgMHg0YTRhNGEsICgxVTw8MzEpIHwgMjgwMywgCisgIDB4M2IzYjNiLCAoMVU8PDMxKSB8IDEyMjgsIDB4NDQ4OTg5LCAweDQ0N2E3YSwgMHg0ODk4OTg5LCAweDQ3YTdhN2EsIDB4NDg5ODk4OSwgMHg0N2E3YTdhLCAKKyAgKDFVPDwzMSkgfCAyNzE5LCAoMVU8PDMxKSB8IDI2NTEsIDB4M2IyYzJjM2IsIDB4NTk0YTRhNTksIDB4MmM1OTU5MmMsIDB4NGEzYjNiNGEsIDB4MmMyYzNiLCAweDRhNGE1OSwgCisgIDB4NTk1OTJjLCAweDNiM2I0YSwgMHgyYzJjLCAoMVU8PDMxKSB8IDk3NCwgMHg0YTRhLCAoMVU8PDMxKSB8IDI3ODcsIDB4M2IzYiwgKDFVPDwzMSkgfCAxMjM3LCAKKyAgMHg0MmUyYywgMHgyZTQyYywgMHgyZTQyYywgMHgzYjJjMmMzYiwgMHg1OTRhNGE1OSwgMHg0YTNiM2I0YSwgMHgyYzJjMmMyYywgMHg0YTRhNGE0YSwgCisgIDB4M2IzYjNiM2IsIDB4M2IyYzJjM2IsIDB4NTk0YTRhNTksIDB4NGEzYjNiNGEsIDB4MmMyYzJjMmMsIDB4NGE0YTRhNGEsIDB4M2IzYjNiM2IsIDB4M2IyYzJjM2IsIAorICAweDU5NGE0YTU5LCAweDRhM2IzYjRhLCAweDNiMmMyYzNiLCAweDU5NGE0YTU5LCAweDRhM2IzYjRhLCAweDJjMmMzYiwgMHg0YTRhNTksIDB4M2IzYjRhLCAKKyAgMHgyYzJjMmMsIDB4NGE0YTRhLCAweDNiM2IzYiwgMHgyYzJjM2IsIDB4NGE0YTU5LCAweDNiM2I0YSwgMHgyYzJjMmMsIDB4NGE0YTRhLCAKKyAgMHgzYjNiM2IsIDB4MmMyYzNiLCAweDRhNGE1OSwgMHgzYjNiNGEsIDB4MmMyYzNiLCAweDRhNGE1OSwgMHgzYjNiNGEsICgxVTw8MzEpIHwgMTc3MCwgCisgIDB4NDU5NTk1OSwgMHgyYzJjMmMyYywgMHg0YTRhM2IsICgxVTw8MzEpIHwgMjc5NCwgMHg1OTU5NGEsICgxVTw8MzEpIHwgMzIwMSwgMHgzYjNiMmMsICgxVTw8MzEpIHwgMTIxOSwgCisgIDB4NGE0YTNiLCAoMVU8PDMxKSB8IDI3OTQsIDB4NTk1OTRhLCAoMVU8PDMxKSB8IDMyMDEsIDB4M2IzYjJjLCAoMVU8PDMxKSB8IDEyMTksIDB4MmMyYzJjMmMsIDB4MmMyYzJjMmMsIAorICAweDJjMmMyYywgMHg0YTRhNGEsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHgyYzJjMmMsIDB4MmMyYzJjLCAweDJjMmMyYywgMHg0MmMyYzJjLCAKKyAgMHgyYzJjMmMsIDB4MmMyYzJjLCAweDJjMmMyYywgMHgyYzJjMmMsIDB4MmMyYzJjLCAweDJlNDJjMCwgKDFVPDwzMSkgfCAxNzM4LCAoMVU8PDMxKSB8IDE3NDgsIAorICAoMVU8PDMxKSB8IDIyNTMsICgxVTw8MzEpIHwgMjI0MSwgKDFVPDwzMSkgfCAxODgzLCAoMVU8PDMxKSB8IDE4OTMsICgxVTw8MzEpIHwgMTczOCwgKDFVPDwzMSkgfCAxNzQ4LCAoMVU8PDMxKSB8IDIyNTMsICgxVTw8MzEpIHwgMjI0MSwgCisgICgxVTw8MzEpIHwgMTg4MywgKDFVPDwzMSkgfCAxODkzLCAweDJlNDJjMCwgMHgyYzJjNGEsIDB4NGE0YTU5LCAweDNiM2I1OSwgMHgzYjNiNGEsIDB4NGE0YTJjLCAKKyAgMHg1OTU5MmMsIDB4MmMyYzQsIDB4MmMzYiwgMHg0YTU5LCAweDNiNGEsIDB4MmMzYiwgMHg0YTU5LCAweDJjM2IsIAorICAweDRhNTksIDB4M2I0YSwgMHgzYjRhLCAweDJjM2IsIDB4NGE1OSwgMHgzYjRhLCAweDFmLCAweDQsIAorICAweDJlLCAweDFmMWYsIDB4MWY0MWYsIDB4NDFmLCAweDAsIDB4MmU0MCwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTIsIAorICAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgCisgICgxVTw8MzEpIHwgNDE1MiwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTUyLCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTUyLCAKKyAgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTIsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTIsICgxVTw8MzEpIHwgNDE1MiwgMHgyZTQ0MjIsIDB4MmU1NTIyLCAKKyAgMHgyZTQ0MjIsIDB4MmU1NTIyLCAweDU5NTk1OSwgMHg1YTVhNWEsIDB4NWI1YjViLCAweDU5NTk1OSwgMHg1YTVhNWEsIDB4NWI1YjViLCAKKyAgMHg1OTU5NTksIDB4NWE1YTVhLCAweDViNWI1YiwgMHg1OTU5NTksIDB4NWE1YTVhLCAweDViNWI1YiwgMHg1OTU5LCAweDI1OTU5LCAKKyAgMHg4YThhOGEsIDB4N2I3YjdiLCAoMVU8PDMxKSB8IDM5OTIsIDB4N2I3YjdiN2IsIDB4MjhhOGE4YSwgMHgyN2I3YjdiLCAweDhhN2EsIDB4OGE0YSwgCisgIDB4N2I0YiwgMHg0YjdiLCAweDhhNGEsIDB4N2I0YiwgMHgyN2I3YjdiLCAweDhhOGE4YSwgMHg3YjdiN2IsIDB4OGE4YThhLCAKKyAgMHg3YjdiN2IsIDB4MmUyZCwgMHg1OTJlODksIDB4NWEyZThhLCAweDRhMmU3YSwgMHg0YjJlN2IsIDB4ODk1OTJlMCwgMHg4YTVhMmUwLCAKKyAgMHg3YTRhMmUwLCAweDdiNGIyZTAsIDB4OGE4YThhLCAweDdiN2I3YiwgMHg4YThhOGEsIDB4N2I3YjdiLCAweDhhNCwgMHg3YjQsIAorICAweDVhNWE0LCAweDVhNWE0LCAweDVhNWE0LCAweDdiN2IsIDB4NDhhOGEsIDB4NDdiN2IsIDB4N2I3YiwgMHg4YThhLCAKKyAgMHg3YjdiLCAweDU5ODk4OSwgMHg1YThhOGEsIDB4NGE3YTdhLCAweDRiN2I3YiwgMHg4OTg5NCwgMHg4YThhNCwgMHg3YTdhNCwgCisgIDB4N2I3YjQsIDB4ODk4OTQsIDB4OGE4YTQsIDB4N2E3YTQsIDB4N2I3YjQsIDB4ODk4OTQsIDB4OGE4YTQsIDB4N2E3YTQsIAorICAweDdiN2I0LCAweDAsIDB4MCwgKDFVPDwzMSkgfCA0MjIsICgxVTw8MzEpIHwgNDk5LCAoMVU8PDMxKSB8IDgxMSwgKDFVPDwzMSkgfCA4NzYsICgxVTw8MzEpIHwgNjc3LCAKKyAgKDFVPDwzMSkgfCA3NTQsICgxVTw8MzEpIHwgNTQ2LCAoMVU8PDMxKSB8IDYwMSwgKDFVPDwzMSkgfCA0NDQsICgxVTw8MzEpIHwgNDU2LCAoMVU8PDMxKSB8IDgyMywgKDFVPDwzMSkgfCA4ODgsICgxVTw8MzEpIHwgNjk5LCAKKyAgKDFVPDwzMSkgfCA3MTEsICgxVTw8MzEpIHwgNTU4LCAoMVU8PDMxKSB8IDYxMywgMHg0YTJlNGEsIDB4NGIyZTRiLCAweDU5MmU1OSwgMHg1YTJlNWEsIDB4NGE0YTJlMCwgCisgIDB4NGI0YjJlMCwgMHg1OTU5MmUwLCAweDVhNWEyZTAsIDB4MjJkMmQzYywgMHg0YjRiM2MsIDB4M2MzYzJkLCAweDRiNGIzYywgMHgzYzNjMmQsIAorICAweDJkMmQyZCwgMHgzYzNjM2MsIDB4MmQyZDJkLCAweDNjM2MzYywgMHgyZDJkMmQyZCwgMHg0YjRiNGIsIDB4NGI3YjdiLCAweDRiNGI0YiwgCisgIDB4M2MzYzNjLCAweDNjM2MzYywgMHg0YjRiNGIsIDB4M2MzYzNjLCAweDNjM2MzYywgMHgyZDJkM2MsIDB4M2MzYzRiLCAweDJkNCwgCisgIDB4NGI0YjVhLCAweDNjM2MzYywgMHgzYzNjM2MsIDB4M2MzYzNjLCAweDRiNGI1YSwgMHgyZDJkNWEsIDB4MmQyZDJkLCAweDJkMmQyZCwgCisgIDB4NGI0YjRiLCAweDNjM2MzYywgMHg0YTRiNGIsIDB4NTk1YTVhLCAweDNiM2MzYywgMHg0NGI0YiwgMHg0NWE1YSwgMHg0M2MzYywgCisgIDB4NGE0YTRhLCAweDRiNGI0YiwgMHg1OTU5NTksIDB4NWE1YTVhLCAweDRhNGI0YiwgMHgzYjNjM2MsIDB4NDRiNGIsIDB4NDNjM2MsIAorICAweDRhNGE0YSwgMHg0YjRiNGIsIDB4NGE0YjRiLCAweDU5NWE1YSwgMHgzYjNjM2MsIDB4NDRiNGIsIDB4NDVhNWEsIDB4NDNjM2MsIAorICAweDRhNGE0YSwgMHg0YjRiNGIsIDB4NTk1OTU5LCAweDVhNWE1YSwgMHgyZDJkMmQsIDB4M2MzYzNjLCAweDJkMmQyZCwgMHgzYzNjM2MsIAorICAweDI1OSwgMHgyNWEsIDB4MjViLCAweDM0YSwgMHgzNGIsIDB4MzRjLCAweDQ1ODk4OSwgMHg0NDdhN2EsIAorICAweDQ1N2E3YSwgMHg0ODk0LCAweDQ4OTUsIDB4NDg5NCwgMHg0ODk1LCAweDQ3YTQsIDB4NDdhNSwgMHg0N2E0LCAKKyAgMHg0N2E1LCAweDQ4OTg5LCAweDQ0N2E3YSwgMHg0NTg5ODksIDB4NDU3YTdhLCAweDQyOGI4YjhiLCAweDQzN2M3YzdjLCAoMVU8PDMxKSB8IDE1MDQsIAorICAoMVU8PDMxKSB8IDE4MzgsICgxVTw8MzEpIHwgMTQ4MiwgKDFVPDwzMSkgfCAxODQ5LCAoMVU8PDMxKSB8IDE2MzYsICgxVTw8MzEpIHwgMTYwMywgKDFVPDwzMSkgfCAxNjE0LCAoMVU8PDMxKSB8IDE2MjUsICgxVTw8MzEpIHwgMTU0OCwgCisgICgxVTw8MzEpIHwgMTUyNiwgKDFVPDwzMSkgfCAxNTkyLCAoMVU8PDMxKSB8IDE1NzAsICgxVTw8MzEpIHwgMTUzNywgKDFVPDwzMSkgfCAxNTE1LCAoMVU8PDMxKSB8IDE1ODEsICgxVTw8MzEpIHwgMTU1OSwgKDFVPDwzMSkgfCAxNDQ5LCAKKyAgKDFVPDwzMSkgfCAxNDE2LCAoMVU8PDMxKSB8IDE0NjAsICgxVTw8MzEpIHwgMTQyNywgKDFVPDwzMSkgfCAxNDM4LCAoMVU8PDMxKSB8IDE0MDUsICgxVTw8MzEpIHwgMTQ5MywgKDFVPDwzMSkgfCAxNDcxLCAweDQ0MmU0YjIwLCAKKyAgMHg0NDJlNGMzMCwgMHg0NDJlNWIyMCwgMHg0NDJlNWIyMCwgKDFVPDwzMSkgfCAxNzI3LCAoMVU8PDMxKSB8IDE4NzIsICgxVTw8MzEpIHwgMTcwNCwgKDFVPDwzMSkgfCAxNjU5LCAweDQ4OTg5MTksIAorICAweDQ4YThhMWEsIDB4NDQ4YjhiMWIsIDB4NDdhN2ExYSwgMHg0N2I3YjFiLCAweDQ0N2M3YzFjLCAweDQyNDg5ODkyLCAweDQyNDdhN2EyLCAweDMyYzJjMmMsIAorICAweDQyZDJkMmQsICgxVTw8MzEpIHwgMzE2NywgMHgyNGE0YTRhLCAweDI0YjRiNGIsIDB4MzRjNGM0YywgMHgyODk4OTg5LCAweDI4YThhOGEsIDB4MjhiOGI4YiwgCisgIDB4MjdhN2E3YSwgMHgyN2I3YjdiLCAweDM3YzdjN2MsIDB4MjU5NTk1OSwgMHgyNWE1YTVhLCAweDI1YjViNWIsIDB4MzJjMmUwLCAweDQyZDJlMCwgCisgICgxVTw8MzEpIHwgMzE1MCwgMHgyNGEyZTAsIDB4MjRiMmUwLCAweDM0YzJlMCwgMHgyODkyZTAsIDB4MjhhMmUwLCAweDI4YjJlMCwgMHgyN2EyZTAsIAorICAweDI3YjJlMCwgMHgzN2MyZTAsIDB4MjU5MmUwLCAweDI1YTJlMCwgMHgyNWIyZTAsIDB4MjNiMmUwLCAweDMzYzJlMCwgMHg0M2QyZTAsIAorICAweDIzYjNiM2IsIDB4MzNjM2MzYywgMHg0M2QzZDNkLCAweDI0YTRhNGEsIDB4MjRiNGI0YiwgMHgzNGM0YzRjLCAweDI1OTU5NTksIDB4MjVhNWE1YSwgCisgIDB4MjViNWI1YiwgMHgyN2E0YTdhLCAweDI3YjRiN2IsIDB4NDM3YzRjN2MsIDB4MjRhODk0YSwgMHgyNGE4YTRhLCAweDQyNGI4YjRiLCAweDI3YTg5N2EsIAorICAweDI3YThhN2EsIDB4NDI3YjhiN2IsIDB4MjU5ODk1OSwgMHgyNWE4YTVhLCAweDQyNWI4YjViLCAweDI0YTg5NGEsIDB4MjRhOGE0YSwgMHg0MjRiOGI0YiwgCisgIDB4MjU5ODk1OSwgMHgyNWE4YTVhLCAweDQyNWI4YjViLCAweDI0YTdhNGEsIDB4MjRiN2I0YiwgMHg0MzRjN2M0YywgMHgyODk3YTg5LCAweDI4YTdhOGEsIAorICAweDQyOGI3YjhiLCAweDI1OTdhNTksIDB4MjVhN2E1YSwgMHg0MjViN2I1YiwgMHgyNGE3YTRhLCAweDI0YjdiNGIsIDB4NDM0YzdjNGMsIDB4MjU5N2E1OSwgCisgIDB4MjVhN2E1YSwgMHg0MjViN2I1YiwgMHgyODk1OTg5LCAweDI4YTVhOGEsIDB4NDI4YjViOGIsIDB4MjdhNTk3YSwgMHgyN2E1YTdhLCAweDQyN2I1YjdiLCAKKyAgKDFVPDwzMSkgfCAxNjcwLCAoMVU8PDMxKSB8IDE2OTMsIDB4MjRhODk0YSwgMHgyNGE4YTRhLCAweDQyNGI4YjRiLCAweDI1OTg5NTksIDB4MjVhOGE1YSwgMHg0MjViOGI1YiwgCisgIDB4MjRhODk0YSwgMHgyNGE4YTRhLCAweDQyNGI4YjRiLCAweDI1OTg5NTksIDB4MjVhOGE1YSwgMHg0MjViOGI1YiwgMHgyNGE3YTRhLCAweDI0YjdiNGIsIAorICAweDQzNGM3YzRjLCAweDI1OTdhNTksIDB4MjVhN2E1YSwgMHg0MjViN2I1YiwgMHgyNGE3YTRhLCAweDI0YjdiNGIsIDB4NDM0YzdjNGMsIDB4MjU5N2E1OSwgCisgIDB4MjVhN2E1YSwgMHg0MjViN2I1YiwgMHgyN2E0YTdhLCAweDI3YjRiN2IsIDB4NDM3YzRjN2MsIDB4Mjg5NTk4OSwgMHgyOGE1YThhLCAweDQyOGI1YjhiLCAKKyAgMHgyN2E1OTdhLCAweDI3YTVhN2EsIDB4NDI3YjViN2IsICgxVTw8MzEpIHwgMjcwLCAoMVU8PDMxKSB8IDExMzUsICgxVTw8MzEpIHwgMTkzNSwgKDFVPDwzMSkgfCAxNzI3LCAoMVU8PDMxKSB8IDE4NzIsIAorICAoMVU8PDMxKSB8IDE3MDQsICgxVTw8MzEpIHwgMTY1OSwgMHgzMmMyYzJjLCAweDQyZDJkMmQsICgxVTw8MzEpIHwgMzE2NywgMHgyNGE0YTRhLCAweDI0YjRiNGIsIDB4MzRjNGM0YywgCisgIDB4MzJjMmUyYywgMHg0MmQyZTJkLCAoMVU8PDMxKSB8IDMxNTcsIDB4MjRhMmU0YSwgMHgyNGIyZTRiLCAweDM0YzJlNGMsIDB4Mjg5MmU4OSwgMHgyOGEyZThhLCAKKyAgMHgyOGIyZThiLCAweDI3YTJlN2EsIDB4MjdiMmU3YiwgMHgzN2MyZTdjLCAweDI1OTJlNTksIDB4MjVhMmU1YSwgMHgyNWIyZTViLCAweDIzYjJlM2IsIAorICAweDMzYzJlM2MsIDB4NDNkMmUzZCwgMHgyODk4OTg5LCAweDI4YThhOGEsIDB4MjhiOGI4YiwgMHgyN2E3YTdhLCAweDI3YjdiN2IsIDB4MzdjN2M3YywgCisgIDB4MjU5NTk1OSwgMHgyNWE1YTVhLCAweDI1YjViNWIsIDB4MjNiM2IzYiwgMHgzM2MzYzNjLCAweDQzZDNkM2QsICgxVTw8MzEpIHwgMzU3LCAoMVU8PDMxKSB8IDM3OSwgCisgICgxVTw8MzEpIHwgMTM5MywgKDFVPDwzMSkgfCAzMTMsICgxVTw8MzEpIHwgMzM1LCAoMVU8PDMxKSB8IDE4MjYsICgxVTw8MzEpIHwgMTM4MSwgKDFVPDwzMSkgfCAxMzY5LCAweDI0ODkyLCAweDI0OGEyLCAKKyAgMHgyNDhiMiwgMHgyNDdhMiwgMHgyNDdiMiwgMHgzNDdjMywgMHgyNDg5MiwgMHgyNDdhMiwgMHgyODk4OTg5LCAweDI4YThhOGEsIAorICAweDQyOGI4YjhiLCAweDI3YTdhN2EsIDB4MjdiN2I3YiwgMHg0MzdjN2M3YywgKDFVPDwzMSkgfCAxNzA0LCAoMVU8PDMxKSB8IDE2NTksIDB4Mjg5NDg5ODksIDB4MjhhNDhhOGEsIAorICAoMVU8PDMxKSB8IDE3MTcsIDB4MjdhNDdhN2EsIDB4MjdiNDdiN2IsICgxVTw8MzEpIHwgMTg2MiwgKDFVPDwzMSkgfCAxNjgxLCAoMVU8PDMxKSB8IDE2NDcsICgxVTw8MzEpIHwgMTcyNywgKDFVPDwzMSkgfCAxODcyLCAKKyAgKDFVPDwzMSkgfCAxNzA0LCAoMVU8PDMxKSB8IDE2NTksICgxVTw8MzEpIHwgMTcyNywgKDFVPDwzMSkgfCAxODcyLCAoMVU8PDMxKSB8IDE3MDQsICgxVTw8MzEpIHwgMTY1OSwgKDFVPDwzMSkgfCAxNzI3LCAoMVU8PDMxKSB8IDE4NzIsIAorICAoMVU8PDMxKSB8IDE3MDQsICgxVTw8MzEpIHwgMTY1OSwgKDFVPDwzMSkgfCAxMDk1LCAoMVU8PDMxKSB8IDE3ODAsICgxVTw8MzEpIHwgMzE2NSwgKDFVPDwzMSkgfCAyNjAsICgxVTw8MzEpIHwgMTEyNSwgKDFVPDwzMSkgfCAxOTI1LCAKKyAgKDFVPDwzMSkgfCAxMDk1LCAoMVU8PDMxKSB8IDE3ODAsICgxVTw8MzEpIHwgMzE2NSwgKDFVPDwzMSkgfCAyNjAsICgxVTw8MzEpIHwgMTEyNSwgKDFVPDwzMSkgfCAxOTI1LCAoMVU8PDMxKSB8IDkwMCwgKDFVPDwzMSkgfCA5MzAsIAorICAoMVU8PDMxKSB8IDYyNSwgKDFVPDwzMSkgfCA2NTYsICgxVTw8MzEpIHwgMjYwLCAoMVU8PDMxKSB8IDExMjUsICgxVTw8MzEpIHwgMTkyNSwgKDFVPDwzMSkgfCAxMDk1LCAoMVU8PDMxKSB8IDE3ODAsICgxVTw8MzEpIHwgMzE2NSwgCisgICgxVTw8MzEpIHwgNzY2LCAoMVU8PDMxKSB8IDExOTksICgxVTw8MzEpIHwgNTExLCAoMVU8PDMxKSB8IDExODksICgxVTw8MzEpIHwgMjUwLCAoMVU8PDMxKSB8IDExMTUsICgxVTw8MzEpIHwgMTkxNSwgKDFVPDwzMSkgfCA0MDEsIAorICAoMVU8PDMxKSB8IDQ3OCwgKDFVPDwzMSkgfCAxMTY4LCAweDIyYzRhMmMsIDB4MjJjNGIyYywgMHgzMmM0YzJjLCAweDI0YTJlMCwgMHgyNGIyZTAsIDB4MzRjMmUwLCAKKyAgMHgyM2I0YTNiLCAweDIzYjRiM2IsIDB4MzNjNGMzYywgMHgyNGEyZTAsIDB4MjRiMmUwLCAweDM0YzJlMCwgMHgyMmM1OTJjLCAweDIyYzVhMmMsIAorICAweDIyYzViMmMsIDB4MjU5MmUwLCAweDI1YTJlMCwgMHgyNWIyZTAsIDB4MjRhNTk0YSwgMHgyNGE1YTRhLCAweDI0YjViNGIsIDB4MjU5MmUwLCAKKyAgMHgyNWEyZTAsIDB4MjViMmUwLCAweDIzYjU5M2IsIDB4MjNiNWEzYiwgMHgyM2I1YjNiLCAweDI1OTJlMCwgMHgyNWEyZTAsIDB4MjViMmUwLCAKKyAgMHgyMmMzYjJjLCAweDMyYzNjMmMsIDB4NDJkM2QyZCwgMHgyM2IyZTAsIDB4MzNjMmUwLCAweDQzZDJlMCwgMHgyMmM0YTJjLCAweDIyYzRiMmMsIAorICAweDMyYzRjMmMsIDB4MjRhMmUwLCAweDI0YjJlMCwgMHgzNGMyZTAsIDB4MjNiNGEzYiwgMHgyM2I0YjNiLCAweDMzYzRjM2MsIDB4MjRhMmUwLCAKKyAgMHgyNGIyZTAsIDB4MzRjMmUwLCAweDIyYzU5MmMsIDB4MjJjNWEyYywgMHgyMmM1YjJjLCAweDI1OTJlMCwgMHgyNWEyZTAsIDB4MjViMmUwLCAKKyAgMHgyNGE1OTRhLCAweDI0YTVhNGEsIDB4MjRiNWI0YiwgMHgyNTkyZTAsIDB4MjVhMmUwLCAweDI1YjJlMCwgMHgyM2I1OTNiLCAweDIzYjVhM2IsIAorICAweDIzYjViM2IsIDB4MjU5MmUwLCAweDI1YTJlMCwgMHgyNWIyZTAsIDB4MjJjM2IyYywgMHgzMmMzYzJjLCAweDQyZDNkMmQsIDB4MjNiMmUwLCAKKyAgMHgzM2MyZTAsIDB4NDNkMmUwLCAweDIyYzRhMmMsIDB4MjJjNGIyYywgMHgzMmM0YzJjLCAweDI0YTJlMCwgMHgyNGIyZTAsIDB4MzRjMmUwLCAKKyAgMHgyM2I0YTNiLCAweDIzYjRiM2IsIDB4MzNjNGMzYywgMHgyNGEyZTAsIDB4MjRiMmUwLCAweDM0YzJlMCwgMHgyMmM1OTJjLCAweDIyYzVhMmMsIAorICAweDIyYzViMmMsIDB4MjU5MmUwLCAweDI1YTJlMCwgMHgyNWIyZTAsIDB4MjRhNTk0YSwgMHgyNGE1YTRhLCAweDI0YjViNGIsIDB4MjU5MmUwLCAKKyAgMHgyNWEyZTAsIDB4MjViMmUwLCAweDIzYjU5M2IsIDB4MjNiNWEzYiwgMHgyM2I1YjNiLCAweDI1OTJlMCwgMHgyNWEyZTAsIDB4MjViMmUwLCAKKyAgMHgyMmMzYjJjLCAweDMyYzNjMmMsIDB4NDJkM2QyZCwgMHgyM2IyZTAsIDB4MzNjMmUwLCAweDQzZDJlMCwgKDFVPDwzMSkgfCAxMDk1LCAoMVU8PDMxKSB8IDE3ODAsIAorICAoMVU8PDMxKSB8IDMxNjUsIDB4MjRhNDRhNGEsIDB4MjRiNDRiNGIsIDB4MzRjNDRjNGMsIDB4MjU5NDU5NTksIDB4MjVhNDVhNWEsIDB4MjViNDViNWIsICgxVTw8MzEpIHwgNDM0LCAKKyAgKDFVPDwzMSkgfCA1MTEsICgxVTw8MzEpIHwgMTE4OSwgKDFVPDwzMSkgfCA1NzAsICgxVTw8MzEpIHwgNjI1LCAoMVU8PDMxKSB8IDY1NiwgMHgyNGE0NGE0YSwgMHgyNGI0NGI0YiwgMHgzNGM0NGM0YywgCisgIDB4MjU5NDU5NTksIDB4MjVhNDVhNWEsIDB4MjViNDViNWIsICgxVTw8MzEpIHwgNDM0LCAoMVU8PDMxKSB8IDUxMSwgKDFVPDwzMSkgfCAxMTg5LCAoMVU8PDMxKSB8IDU3MCwgKDFVPDwzMSkgfCA2MjUsIAorICAoMVU8PDMxKSB8IDY1NiwgKDFVPDwzMSkgfCAxMDk1LCAoMVU8PDMxKSB8IDE3ODAsICgxVTw8MzEpIHwgMzE2NSwgKDFVPDwzMSkgfCAyNjAsICgxVTw8MzEpIHwgMTEyNSwgKDFVPDwzMSkgfCAxOTI1LCAoMVU8PDMxKSB8IDEwOTUsIAorICAoMVU8PDMxKSB8IDE3ODAsICgxVTw8MzEpIHwgMzE2NSwgKDFVPDwzMSkgfCAyNjAsICgxVTw8MzEpIHwgMTEyNSwgKDFVPDwzMSkgfCAxOTI1LCAoMVU8PDMxKSB8IDMwMiwgKDFVPDwzMSkgfCAzMjQsICgxVTw8MzEpIHwgMTE1NywgCisgICgxVTw8MzEpIHwgMzQ2LCAoMVU8PDMxKSB8IDM2OCwgKDFVPDwzMSkgfCAzOTAsICgxVTw8MzEpIHwgODAwLCAoMVU8PDMxKSB8IDg2NSwgKDFVPDwzMSkgfCAxNzE1LCAoMVU8PDMxKSB8IDY2NiwgKDFVPDwzMSkgfCA3NDMsIAorICAoMVU8PDMxKSB8IDE4NjAsICgxVTw8MzEpIHwgMTk4NSwgKDFVPDwzMSkgfCAxOTczLCAweDI4OTQ4OTg5LCAweDI4YTQ4YThhLCAoMVU8PDMxKSB8IDE3MTcsIDB4MjdhNDdhN2EsIDB4MjdiNDdiN2IsIAorICAoMVU8PDMxKSB8IDE4NjIsICgxVTw8MzEpIHwgMTk4NSwgKDFVPDwzMSkgfCAxOTczLCAweDI4OTQ4OTg5LCAweDI4YTQ4YThhLCAoMVU8PDMxKSB8IDE3MTcsIDB4MjdhNDdhN2EsIDB4MjdiNDdiN2IsIAorICAoMVU8PDMxKSB8IDE4NjIsICgxVTw8MzEpIHwgMTk4NSwgKDFVPDwzMSkgfCAxOTczLCAoMVU8PDMxKSB8IDg1NSwgKDFVPDwzMSkgfCA5MjAsICgxVTw8MzEpIHwgMTcyNywgKDFVPDwzMSkgfCA3MzMsICgxVTw8MzEpIHwgNzg2LCAKKyAgKDFVPDwzMSkgfCAxODcyLCAoMVU8PDMxKSB8IDE3MDQsICgxVTw8MzEpIHwgMTY1OSwgMHgyODk4OTg5LCAweDI4YThhOGEsIDB4NDI4YjhiOGIsIDB4MjdhN2E3YSwgMHgyN2I3YjdiLCAKKyAgMHg0MzdjN2M3YywgKDFVPDwzMSkgfCAxNzA0LCAoMVU8PDMxKSB8IDE2NTksIDB4MjdhMmUwLCAoMVU8PDMxKSB8IDE3MjcsICgxVTw8MzEpIHwgMTg3MiwgKDFVPDwzMSkgfCAxNzA0LCAoMVU8PDMxKSB8IDE2NTksIAorICAweDI3YTNiN2EsIDB4MjdiM2I3YiwgMHg0MzdjM2M3YywgMHgyM2I0N2EzYiwgMHgyM2I0N2IzYiwgMHgzM2M0N2MzYywgKDFVPDwzMSkgfCA4NTUsICgxVTw8MzEpIHwgOTIwLCAKKyAgKDFVPDwzMSkgfCAxNzI3LCAoMVU8PDMxKSB8IDczMywgKDFVPDwzMSkgfCA3ODYsICgxVTw8MzEpIHwgMTg3MiwgKDFVPDwzMSkgfCAxNzA0LCAoMVU8PDMxKSB8IDE2NTksICgxVTw8MzEpIHwgODU1LCAoMVU8PDMxKSB8IDkyMCwgCisgICgxVTw8MzEpIHwgMTcyNywgKDFVPDwzMSkgfCA3MzMsICgxVTw8MzEpIHwgNzg2LCAoMVU8PDMxKSB8IDE4NzIsICgxVTw8MzEpIHwgODU1LCAoMVU8PDMxKSB8IDkyMCwgKDFVPDwzMSkgfCAxNzI3LCAoMVU8PDMxKSB8IDczMywgCisgICgxVTw8MzEpIHwgNzg2LCAoMVU8PDMxKSB8IDE4NzIsICgxVTw8MzEpIHwgODU1LCAoMVU8PDMxKSB8IDkyMCwgKDFVPDwzMSkgfCAxNzI3LCAoMVU8PDMxKSB8IDczMywgKDFVPDwzMSkgfCA3ODYsICgxVTw8MzEpIHwgMTg3MiwgCisgICgxVTw8MzEpIHwgNDM0LCAoMVU8PDMxKSB8IDUxMSwgKDFVPDwzMSkgfCAxMTg5LCAoMVU8PDMxKSB8IDQzNCwgKDFVPDwzMSkgfCA1MTEsICgxVTw8MzEpIHwgMTE4OSwgKDFVPDwzMSkgfCA0MzQsICgxVTw8MzEpIHwgNTExLCAKKyAgKDFVPDwzMSkgfCAxMTg5LCAoMVU8PDMxKSB8IDQzNCwgKDFVPDwzMSkgfCA1MTEsICgxVTw8MzEpIHwgMTE4OSwgKDFVPDwzMSkgfCA0MzQsICgxVTw8MzEpIHwgNTExLCAoMVU8PDMxKSB8IDExODksICgxVTw8MzEpIHwgMjYwLCAKKyAgKDFVPDwzMSkgfCAxMTI1LCAoMVU8PDMxKSB8IDE5MjUsICgxVTw8MzEpIHwgODM1LCAoMVU8PDMxKSB8IDkwMCwgKDFVPDwzMSkgfCA5MzAsICgxVTw8MzEpIHwgNjg5LCAoMVU8PDMxKSB8IDc2NiwgKDFVPDwzMSkgfCAxMTk5LCAKKyAgKDFVPDwzMSkgfCA1NzAsICgxVTw8MzEpIHwgNjI1LCAoMVU8PDMxKSB8IDY1NiwgKDFVPDwzMSkgfCAxMDk1LCAoMVU8PDMxKSB8IDE3ODAsICgxVTw8MzEpIHwgMzE2NSwgKDFVPDwzMSkgfCA0MzQsICgxVTw8MzEpIHwgNTExLCAKKyAgKDFVPDwzMSkgfCAxMTg5LCAoMVU8PDMxKSB8IDI2MCwgKDFVPDwzMSkgfCAxMTI1LCAoMVU8PDMxKSB8IDE5MjUsICgxVTw8MzEpIHwgODQ1LCAoMVU8PDMxKSB8IDkxMCwgKDFVPDwzMSkgfCA5NDAsICgxVTw8MzEpIHwgNzIzLCAKKyAgKDFVPDwzMSkgfCA3NzYsICgxVTw8MzEpIHwgMTIwOSwgKDFVPDwzMSkgfCA1NzAsICgxVTw8MzEpIHwgNjI1LCAoMVU8PDMxKSB8IDY1NiwgKDFVPDwzMSkgfCAxMDk1LCAoMVU8PDMxKSB8IDE3ODAsICgxVTw8MzEpIHwgMzE2NSwgCisgICgxVTw8MzEpIHwgNTcwLCAoMVU8PDMxKSB8IDYyNSwgKDFVPDwzMSkgfCA2NTYsICgxVTw8MzEpIHwgNTcwLCAoMVU8PDMxKSB8IDYyNSwgKDFVPDwzMSkgfCA2NTYsICgxVTw8MzEpIHwgNDExLCAoMVU8PDMxKSB8IDQ4OCwgCisgICgxVTw8MzEpIHwgMTE3OCwgKDFVPDwzMSkgfCA1MzUsICgxVTw8MzEpIHwgNTkwLCAoMVU8PDMxKSB8IDY0NSwgKDFVPDwzMSkgfCAyODEsICgxVTw8MzEpIHwgMTE0NiwgKDFVPDwzMSkgfCAxOTQ2LCAoMVU8PDMxKSB8IDQzNCwgCisgICgxVTw8MzEpIHwgNTExLCAoMVU8PDMxKSB8IDExODksICgxVTw8MzEpIHwgNTcwLCAoMVU8PDMxKSB8IDYyNSwgKDFVPDwzMSkgfCA2NTYsICgxVTw8MzEpIHwgMjYwLCAoMVU8PDMxKSB8IDExMjUsICgxVTw8MzEpIHwgMTkyNSwgCisgICgxVTw8MzEpIHwgNDExLCAoMVU8PDMxKSB8IDQ4OCwgKDFVPDwzMSkgfCAxMTc4LCAoMVU8PDMxKSB8IDUzNSwgKDFVPDwzMSkgfCA1OTAsICgxVTw8MzEpIHwgNjQ1LCAoMVU8PDMxKSB8IDI4MSwgKDFVPDwzMSkgfCAxMTQ2LCAKKyAgKDFVPDwzMSkgfCAxOTQ2LCAoMVU8PDMxKSB8IDQzNCwgKDFVPDwzMSkgfCA1MTEsICgxVTw8MzEpIHwgMTE4OSwgKDFVPDwzMSkgfCA1NzAsICgxVTw8MzEpIHwgNjI1LCAoMVU8PDMxKSB8IDY1NiwgKDFVPDwzMSkgfCAyNjAsIAorICAoMVU8PDMxKSB8IDExMjUsICgxVTw8MzEpIHwgMTkyNSwgMHgzMmMyYzMsIDB4NDJkMmQ0LCAoMVU8PDMxKSB8IDMxNzUsICgxVTw8MzEpIHwgODU1LCAoMVU8PDMxKSB8IDkyMCwgKDFVPDwzMSkgfCAxNzI3LCAKKyAgKDFVPDwzMSkgfCA3MzMsICgxVTw8MzEpIHwgNzg2LCAoMVU8PDMxKSB8IDE4NzIsICgxVTw8MzEpIHwgMTcwNCwgKDFVPDwzMSkgfCAxNjU5LCAoMVU8PDMxKSB8IDg1NSwgKDFVPDwzMSkgfCA5MjAsICgxVTw8MzEpIHwgMTcyNywgCisgICgxVTw8MzEpIHwgNzMzLCAoMVU8PDMxKSB8IDc4NiwgKDFVPDwzMSkgfCAxODcyLCAoMVU8PDMxKSB8IDg1NSwgKDFVPDwzMSkgfCA5MjAsICgxVTw8MzEpIHwgMTcyNywgKDFVPDwzMSkgfCA3MzMsICgxVTw8MzEpIHwgNzg2LCAKKyAgKDFVPDwzMSkgfCAxODcyLCAoMVU8PDMxKSB8IDE3MDQsICgxVTw8MzEpIHwgMTY1OSwgKDFVPDwzMSkgfCA4NTUsICgxVTw8MzEpIHwgOTIwLCAoMVU8PDMxKSB8IDE3MjcsICgxVTw8MzEpIHwgNzMzLCAoMVU8PDMxKSB8IDc4NiwgCisgICgxVTw8MzEpIHwgMTg3MiwgKDFVPDwzMSkgfCA4NTUsICgxVTw8MzEpIHwgOTIwLCAoMVU8PDMxKSB8IDE3MjcsICgxVTw8MzEpIHwgNzMzLCAoMVU8PDMxKSB8IDc4NiwgKDFVPDwzMSkgfCAxODcyLCAoMVU8PDMxKSB8IDE3MDQsIAorICAoMVU8PDMxKSB8IDE2NTksICgxVTw8MzEpIHwgMzU3LCAoMVU8PDMxKSB8IDM3OSwgKDFVPDwzMSkgfCAxMzkzLCAoMVU8PDMxKSB8IDMxMywgKDFVPDwzMSkgfCAzMzUsICgxVTw8MzEpIHwgMTgyNiwgKDFVPDwzMSkgfCAxMzgxLCAKKyAgKDFVPDwzMSkgfCAxMzY5LCAoMVU8PDMxKSB8IDMwMiwgKDFVPDwzMSkgfCAzMjQsICgxVTw8MzEpIHwgMTE1NywgKDFVPDwzMSkgfCAzNDYsICgxVTw8MzEpIHwgMzY4LCAoMVU8PDMxKSB8IDM5MCwgKDFVPDwzMSkgfCA4NTUsIAorICAoMVU8PDMxKSB8IDkyMCwgKDFVPDwzMSkgfCAxNzI3LCAoMVU8PDMxKSB8IDczMywgKDFVPDwzMSkgfCA3ODYsICgxVTw8MzEpIHwgMTg3MiwgKDFVPDwzMSkgfCAxNzA0LCAoMVU8PDMxKSB8IDE2NTksICgxVTw8MzEpIHwgODU1LCAKKyAgKDFVPDwzMSkgfCA5MjAsICgxVTw8MzEpIHwgMTcyNywgKDFVPDwzMSkgfCA3MzMsICgxVTw8MzEpIHwgNzg2LCAoMVU8PDMxKSB8IDE4NzIsICgxVTw8MzEpIHwgNDM0LCAoMVU8PDMxKSB8IDUxMSwgKDFVPDwzMSkgfCAxMTg5LCAKKyAgKDFVPDwzMSkgfCA0MzQsICgxVTw8MzEpIHwgNTExLCAoMVU8PDMxKSB8IDExODksICgxVTw8MzEpIHwgNDM0LCAoMVU8PDMxKSB8IDUxMSwgKDFVPDwzMSkgfCAxMTg5LCAoMVU8PDMxKSB8IDQzNCwgKDFVPDwzMSkgfCA1MTEsIAorICAoMVU8PDMxKSB8IDExODksICgxVTw8MzEpIHwgNDM0LCAoMVU8PDMxKSB8IDUxMSwgKDFVPDwzMSkgfCAxMTg5LCAoMVU8PDMxKSB8IDI2MCwgKDFVPDwzMSkgfCAxMTI1LCAoMVU8PDMxKSB8IDE5MjUsICgxVTw8MzEpIHwgODQ1LCAKKyAgKDFVPDwzMSkgfCA5MTAsICgxVTw8MzEpIHwgOTQwLCAoMVU8PDMxKSB8IDcyMywgKDFVPDwzMSkgfCA3NzYsICgxVTw8MzEpIHwgMTIwOSwgKDFVPDwzMSkgfCA1NzAsICgxVTw8MzEpIHwgNjI1LCAoMVU8PDMxKSB8IDY1NiwgCisgICgxVTw8MzEpIHwgMTA5NSwgKDFVPDwzMSkgfCAxNzgwLCAoMVU8PDMxKSB8IDMxNjUsICgxVTw8MzEpIHwgNTcwLCAoMVU8PDMxKSB8IDYyNSwgKDFVPDwzMSkgfCA2NTYsICgxVTw8MzEpIHwgNTcwLCAoMVU8PDMxKSB8IDYyNSwgCisgICgxVTw8MzEpIHwgNjU2LCAoMVU8PDMxKSB8IDQzNCwgKDFVPDwzMSkgfCA1MTEsICgxVTw8MzEpIHwgMTE4OSwgKDFVPDwzMSkgfCA1NzAsICgxVTw8MzEpIHwgNjI1LCAoMVU8PDMxKSB8IDY1NiwgKDFVPDwzMSkgfCAyNjAsIAorICAoMVU8PDMxKSB8IDExMjUsICgxVTw8MzEpIHwgMTkyNSwgKDFVPDwzMSkgfCA0MzQsICgxVTw8MzEpIHwgNTExLCAoMVU8PDMxKSB8IDExODksICgxVTw8MzEpIHwgNTcwLCAoMVU8PDMxKSB8IDYyNSwgKDFVPDwzMSkgfCA2NTYsIAorICAoMVU8PDMxKSB8IDI2MCwgKDFVPDwzMSkgfCAxMTI1LCAoMVU8PDMxKSB8IDE5MjUsIDB4NGM0YzNkLCAoMVU8PDMxKSB8IDEyNDQsIDB4NGM0YzNkLCAoMVU8PDMxKSB8IDEyNDQsIDB4NGM0YzViLCAKKyAgMHgzZDNkM2QsIDB4M2QzZDNkLCAweDNkM2QzZCwgMHg0YzRjNWIsICgxVTw8MzEpIHwgMTA4MywgKDFVPDwzMSkgfCAxMDc2LCAweDRhNGM0YywgMHg1OTViNWIsIAorICAweDNiM2QzZCwgMHg0NGM0YywgMHg0NWI1YiwgMHg0M2QzZCwgMHg0YzRjNGMsIDB4NWI1YjViLCAweDNiM2IzYiwgMHgzYzNjM2MsIAorICAweDNkM2QzZCwgMHg0YTRjNGMsIDB4NTk1OTU5LCAweDU5NWE1YSwgMHg1OTViNWIsIDB4M2IzZDNkLCAweDQ0YzRjLCAweDQ1OTU5LCAKKyAgMHg0NWE1YSwgMHg0NWI1YiwgMHg0M2QzZCwgMHg0YzRjNGMsIDB4NTk1OTU5LCAweDVhNWE1YSwgMHg1YjViNWIsIDB4M2IzYjNiLCAKKyAgMHgzYzNjM2MsIDB4M2QzZDNkLCAweDRhNGM0YywgMHg1OTViNWIsIDB4M2IzZDNkLCAweDQ0YzRjLCAweDQ1YjViLCAweDQzZDNkLCAKKyAgMHg0YzRjNGMsIDB4NWI1YjViLCAweDNiM2IzYiwgMHgzYzNjM2MsIDB4M2QzZDNkLCAweDI4OTg5ODksIDB4MjhhOGE4YSwgMHgyOGI4YjhiLCAKKyAgMHgyN2E3YTdhLCAweDI3YjdiN2IsIDB4MzdjN2M3YywgKDFVPDwzMSkgfCA4NTUsICgxVTw8MzEpIHwgNzMzLCAweDQyOGI4YjhiLCAweDQzN2M3YzdjLCAoMVU8PDMxKSB8IDE3MDQsIAorICAoMVU8PDMxKSB8IDE2NTksIDB4Mjg5ODk4OSwgMHgyOGE4YThhLCAweDI4YjhiOGIsIDB4MjdhN2E3YSwgMHgyN2I3YjdiLCAweDM3YzdjN2MsICgxVTw8MzEpIHwgODU1LCAKKyAgKDFVPDwzMSkgfCA3MzMsIDB4NDI4YjhiOGIsIDB4NDM3YzdjN2MsICgxVTw8MzEpIHwgMTcwNCwgKDFVPDwzMSkgfCAxNjU5LCAoMVU8PDMxKSB8IDI3NjcsICgxVTw8MzEpIHwgMjM0NywgKDFVPDwzMSkgfCAyNjAxLCAKKyAgKDFVPDwzMSkgfCAyNzA5LCAoMVU8PDMxKSB8IDI3NzcsICgxVTw8MzEpIHwgMjI5MywgKDFVPDwzMSkgfCAyNjExLCAoMVU8PDMxKSB8IDI2OTksICgxVTw8MzEpIHwgMjczNywgKDFVPDwzMSkgfCAyNTYxLCAoMVU8PDMxKSB8IDI3NTcsIAorICAoMVU8PDMxKSB8IDI1OTEsICgxVTw8MzEpIHwgMjY2OSwgKDFVPDwzMSkgfCAyMjYzLCAoMVU8PDMxKSB8IDI2NzksICgxVTw8MzEpIHwgMjI3MywgMHg0NDJlNGIyMCwgMHg0NDJlNGMzMCwgMHg0NDJlNWIyMCwgCisgIDB4NDQyZTViMjAsICgxVTw8MzEpIHwgMjcyNywgKDFVPDwzMSkgfCAyNTUxLCAoMVU8PDMxKSB8IDI3NDcsICgxVTw8MzEpIHwgMjU4MSwgKDFVPDwzMSkgfCAyNjU5LCAoMVU8PDMxKSB8IDIyMjEsICgxVTw8MzEpIHwgMjY4OSwgCisgICgxVTw8MzEpIHwgMjI4MywgMHgyZThiLCAweDJlN2MsIDB4NDQ4OTg5NCwgMHg0NDdhN2E0LCAweDQ4OTQsIDB4NDg5NSwgMHg0ODk0LCAKKyAgMHg0ODk1LCAweDQ3YTQsIDB4NDdhNSwgMHg0N2E0LCAweDQ3YTUsIDB4NWI4YjhiLCAweDRjN2M3YywgMHg0NDQsIAorICAweDU1NSwgMHg0NDQsIDB4NTU1LCAweDQ0NCwgMHg1NTUsIDB4NDQ0LCAweDU1NSwgMHgyZTAsIAorICAweDJlMCwgMHgyZTAsIDB4MmUwLCAweDQsIDB4NSwgMHg0MCwgMHg1MCwgKDFVPDwzMSkgfCAzOTc5LCAKKyAgKDFVPDwzMSkgfCAzOTkyLCAweDdhN2E3YTdhLCAweDdiN2I3YjdiLCAoMVU8PDMxKSB8IDM5NzksIDB4N2E3YTdhN2EsICgxVTw8MzEpIHwgMzk3OSwgKDFVPDwzMSkgfCAzOTkyLCAweDdhN2E3YTdhLCAKKyAgMHg3YjdiN2I3YiwgKDFVPDwzMSkgfCAzOTc5LCAoMVU8PDMxKSB8IDM5OTIsIDB4N2E3YTdhN2EsIDB4N2I3YjdiN2IsICgxVTw8MzEpIHwgMzk3OSwgMHg3YTdhN2E3YSwgKDFVPDwzMSkgfCAzOTc5LCAKKyAgKDFVPDwzMSkgfCAzOTkyLCAweDdhN2E3YTdhLCAweDdiN2I3YjdiLCAoMVU8PDMxKSB8IDM5NzksICgxVTw8MzEpIHwgMzk5MiwgMHg3YTdhN2E3YSwgMHg3YjdiN2I3YiwgKDFVPDwzMSkgfCAzOTc5LCAKKyAgMHg3YTdhN2E3YSwgKDFVPDwzMSkgfCAzOTc5LCAoMVU8PDMxKSB8IDM5OTIsIDB4N2E3YTdhN2EsIDB4N2I3YjdiN2IsICgxVTw8MzEpIHwgMzk3OSwgMHg3YTdhN2E3YSwgKDFVPDwzMSkgfCAzOTc5LCAKKyAgMHg3YTdhN2E3YSwgMHgyZTAsIDB4MmUwLCAweDJlMCwgMHgyZTAsIDB4NDAsIDB4NTAsIDB4MjAsIAorICAweDJlMCwgMHg0NDQyLCAweDQ0NTIsIDB4NDQ0MCwgMHg0NDUwLCAweDAsIDB4MCwgKDFVPDwzMSkgfCAxMDY0LCAKKyAgKDFVPDwzMSkgfCA0MTUwLCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsIAorICAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgMTA5MCwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgCisgICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCAzMTMzLCAKKyAgKDFVPDwzMSkgfCAyNDc2LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTM3LCAoMVU8PDMxKSB8IDQxNTUsIAorICAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgCisgICgxVTw8MzEpIHwgMzE0NiwgKDFVPDwzMSkgfCAzMTQ2LCAoMVU8PDMxKSB8IDMxNDYsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDMxNDYsICgxVTw8MzEpIHwgMzE0NiwgKDFVPDwzMSkgfCA0MTU1LCAKKyAgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgMzE0NiwgKDFVPDwzMSkgfCAzMTQ2LCAoMVU8PDMxKSB8IDMxNDYsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsIAorICAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgCisgICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgMHg0NDJlMCwgMHg0NDQwLCAweDI1OTU5NTksIDB4MjVhNWE1YSwgCisgIDB4MjViNWI1YiwgMHg0LCAweDUsIDB4NCwgMHg1LCAweDQsIDB4NCwgMHg0NSwgCisgICgxVTw8MzEpIHwgMTk1NywgKDFVPDwzMSkgfCAyNDg3LCAoMVU8PDMxKSB8IDI2MjEsICgxVTw8MzEpIHwgMTk1NywgKDFVPDwzMSkgfCAyNDg3LCAoMVU8PDMxKSB8IDI2MjEsIDB4NDQsIDB4NTUsIAorICAweDUsIDB4MmU1LCAweDJlMCwgMHgwLCAweDJlMCwgMHgyZTAsIDB4MmUyZSwgMHgyZTJlMmUsIAorICAweDAsIDB4NGE0YTRhLCAweDRhNGE0YSwgMHg0YTRhNGEsIDB4MjRhNGE0YSwgMHg0YTRhNGEsIDB4NGE0YTRhLCAweDRhNGE0YTRhLCAKKyAgMHgyZSwgMHgyN2E3YTdhLCAweDI3YTdhN2EsIDB4N2E3YTQsIDB4N2E3YTQsIDB4N2E3YTQsIDB4N2E3YTQsIDB4N2E3YTQsIAorICAweDdhN2E0LCAoMVU8PDMxKSB8IDM5ODgsICgxVTw8MzEpIHwgNDE0NiwgKDFVPDwzMSkgfCA0MTQwLCAoMVU8PDMxKSB8IDM5NjYsIDB4NDdhN2EsIDB4NTdhN2EsIDB4N2E0LCAKKyAgMHg3YTUsICgxVTw8MzEpIHwgMzk4OCwgKDFVPDwzMSkgfCAzOTY2LCAweDdhNCwgMHg3YTUsIDB4MmUwLCAweDdhN2E3YSwgMHg3YTdhN2EsIAorICAweDdhN2E3YSwgMHg3YTdhN2EsIDB4N2E0LCAoMVU8PDMxKSB8IDEwOTEsIDB4N2E3YSwgMHg3YTdhLCAweDdhN2EsIDB4N2E3YSwgCisgIDB4MCwgMHg3YTdhLCAweDdhN2EsIDB4MmUwLCAweDdhN2E0LCAweDdhN2E0LCAweDdhN2E0LCAweDdhN2E0LCAKKyAgMHg3YTdhNCwgMHg3YTdhNCwgMHgyZTAsIDB4Mjg5ODk4OSwgMHgyODk4OTg5LCAweDg5ODk0LCAweDg5ODk0LCAweDg5ODk0LCAKKyAgMHg4OTg5NCwgMHg4OTg5NCwgMHg4OTg5NCwgMHg0YTdhLCAweDg5NGEsIDB4ODk3YSwgMHg3YTRhLCAweDg5NCwgCisgIDB4ODk1LCAweDg5N2E3YSwgMHg0ODk4OSwgMHg1ODk4OSwgMHg3YTg5ODksIDB4ODk0YSwgMHg3YTRhLCAweDg5NCwgCisgIDB4ODk1LCAweDAsIDB4MmUyYzJjMCwgMHg4OTg5ODksIDB4ODk4OTg5LCAweDAsIDB4ODk4OTg5LCAweDg5ODk4OSwgCisgIDB4ODk0LCAweDRhNGEzYiwgMHgzYjNiMmMsIDB4M2IzYjJjLCAweDJjMmMyYywgMHgzYjNiM2IsIDB4MmMyYzJjLCAweDNiM2IzYiwgCisgIDB4MCwgMHgzYjNiNGEsIDB4MmM0LCAweDNiM2IzYiwgMHgzYjNiM2IsIDB4NGE0YTU5LCAweDJjMmM1OSwgMHg0YTRhNGEsIAorICAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NDRhNGEsIDB4NDU5NTksIDB4NDNiM2IsIDB4NGE0YTRhLCAweDNiM2IzYiwgMHg0NGE0YSwgCisgIDB4NDNiM2IsIDB4NGE0YTRhLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NDRhNGEsIDB4NDU5NTksIDB4NDNiM2IsIDB4MmMyYzJjLCAKKyAgMHgzYjNiM2IsIDB4MmMyYzJjLCAweDNiM2IzYiwgMHg4OTg5LCAweDg5ODksIDB4ODk4OTQsIDB4ODk4OTQsIDB4ODk4OTQsIAorICAweDg5ODk0LCAweDg5ODk0LCAweDg5ODk0LCAweDg5ODk4OSwgMHg3YTdhN2EsIDB4ODk4OTg5LCAweDdhN2E3YSwgMHg4OTg5ODksIAorICAweDdhN2E3YSwgMHgyZTJjLCAweDQ0MmUwLCAweDQ0MCwgKDFVPDwzMSkgfCAzOTc5LCAweDdhN2E3YTdhLCAweDI4OTg5ODksIDB4MjdhN2E3YSwgCisgIDB4MjdhN2E3YSwgMHgyMmMyYzNiLCAweDRhNGEzYiwgMHgyYzJjMmMyYywgMHgzYjNiLCAweDRhNGE1OSwgMHg1OTU5NCwgMHg1OTU5NCwgCisgIDB4NTk1OTQsIDB4NDg5ODksIDB4NDdhN2EsIDB4NDg5ODk4OSwgMHg0N2E3YTdhLCAweDM0NCwgMHg0NDQsIDB4MjQ0LCAKKyAgMHg1NTUsIDB4MjQyYzQyYzQsIDB4MjQyYzQyYzQsIDB4MjQyYzQyYzQsIDB4MjQyYzQyYzQsIDB4MjQyYzQyYzQsIDB4MjQyYzQyYzQsICgxVTw8MzEpIHwgMjkyLCAKKyAgMHgyMmMyYzQsIDB4MjJjMmM0LCAweDIyYzJjNCwgMHgyMmMyYzQsIDB4MjJjMmM0LCAweDIyYzJjNCwgMHgyMmMyYzJjLCAweDJjNTk1OSwgCisgIDB4MjI1OTU5LCAweDU5NTk1OSwgMHgyMjU5NTk1OSwgKDFVPDwzMSkgfCA0MTUyLCAoMVU8PDMxKSB8IDQxNTIsICgxVTw8MzEpIHwgNDE1MiwgKDFVPDwzMSkgfCA0MTU1LCAweDRhNGE0YSwgCisgICgxVTw8MzEpIHwgNDE1NSwgMHgzYjNiM2IsICgxVTw8MzEpIHwgNDE1NSwgMHgzYjNiM2IsICgxVTw8MzEpIHwgNDE1NSwgMHg0YTRhNGEsICgxVTw8MzEpIHwgNDE1NSwgMHgzYjNiM2IsIAorICAoMVU8PDMxKSB8IDQxNTUsIDB4M2IzYjNiLCAoMVU8PDMxKSB8IDQxNTUsIDB4MmMyYzNiLCAoMVU8PDMxKSB8IDQxNTUsIDB4M2IzYjNiLCAoMVU8PDMxKSB8IDQxNTUsIDB4MmMyYzJjLCAKKyAgKDFVPDwzMSkgfCA0MTU1LCAweDJjMmMyYywgKDFVPDwzMSkgfCA0MTU1LCAweDRhNGE0YSwgKDFVPDwzMSkgfCA0MTU1LCAweDNiM2IzYiwgMHgyZTQ0MjIsIDB4MmU1NTIyLCAKKyAgMHg0NDQsIDB4NTU1LCAweDNiN2EsIDB4M2I3YiwgMHg0N2EzYiwgMHg0N2IzYiwgMHgyMmMyYzJjLCAweDIyZDJkMmQsIAorICAoMVU8PDMxKSB8IDI0MiwgMHgyMmMyYzJjLCAweDIyZDJkMmQsICgxVTw8MzEpIHwgMjQyLCAweDJjMmMyYywgMHgyZDJkMmQsICgxVTw8MzEpIHwgMTA3NiwgMHg0MCwgCisgIDB4NTAsIDB4NDAsIDB4NTAsIDB4NDAsIDB4MmU0MCwgMHgyZTUwLCAweDJlNDAsIDB4MmU1MCwgCisgIDB4MjAsIDB4NCwgMHgwLCAweDQ1LCAweDg5ODksIDB4OGE4YSwgMHg3YTdhLCAweDdiN2IsIAorICAweDg5ODksIDB4N2E3YSwgMHgyMmMyYzJjLCAweDI0YTRhNGEsIDB4MjU5NTk1OSwgMHgyMmMyYzJjLCAweDI0YTRhNGEsIDB4MjU5NTk1OSwgCisgIDB4MjNiM2IzYiwgMHgyM2IzYjNiLCAoMVU8PDMxKSB8IDU4MCwgKDFVPDwzMSkgfCA2MzUsICgxVTw8MzEpIHwgNDY4LCAoMVU8PDMxKSB8IDUyMSwgMHgyYzRhLCAweDJjNTksIAorICAweDJjM2IsIDB4NGE1OSwgMHgyYzRhLCAweDJjNTksIDB4MmMzYiwgMHg0YTU5LCAweDNiNGEsIDB4M2I1OSwgCisgIDB4M2I0YSwgMHgzYjU5LCAweDJjM2IsIDB4NGE1OSwgMHgzYjRhLCAweDRhNGE0YTRhLCAweDU5NGE0YTU5LCAweDU5NGE0YTU5LCAKKyAgMHg0YTRhNGE0YSwgMHg1OTRhNGE1OSwgMHg1OTRhNGE1OSwgMHg0YTNiM2I0YSwgMHgzYjNiM2IzYiwgMHg0YTNiM2I0YSwgMHgzYjNiM2IzYiwgMHg0YTNiM2I0YSwgCisgIDB4NGEzYjNiNGEsIDB4MmMyYzJjMmMsIDB4MmMyYzJjLCAweDIyYzJjLCAweDRhNGE0YSwgMHgyNGE0YSwgMHg1OTU5NTksIDB4MjU5NTksIAorICAweDNiM2IzYiwgMHgyM2IzYiwgMHgyYzJjMmMsIDB4NGE0YTRhLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4MmMyYzJjLCAweDRhNGE0YSwgCisgIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0NDJlMCwgMHg0NDJlMCwgMHg0NDJlMCwgMHg0NDJlMCwgMHg0NDJlMCwgMHg0NDJlMCwgCisgIDB4NDQyZTAsIDB4NDQyZTAsIDB4NDQyZTAsIDB4NDQyZTAsIDB4NDQyZTAsIDB4NDQyZTAsIDB4NDQ0MCwgMHg0LCAKKyAgMHg0NCwgMHgyZTJlLCAweDQ0ZjAsIDB4MCwgMHg0ZjAsIDB4NDAsIDB4NDQ0NCwgKDFVPDwzMSkgfCAyMDYxLCAKKyAgMHg0ZjAsIDB4NGYwLCAweDRmNCwgMHg0ZjAsIDB4NCwgMHg0LCAweDQsIDB4NDQsIAorICAweDQ0ZiwgMHhjZjRmLCAweDRmNCwgMHg0ZjQsIDB4NGY0LCAweDJlNGYwLCAweDJlNGYwLCAweDJlNGYwLCAKKyAgMHgyZTRmMCwgMHgyZTRmMCwgMHg0NGY0LCAweDRmNCwgMHg0ZjAsIDB4NGYwLCAweDQ0ZjAsIDB4NDRmMCwgCisgIDB4NDRmNCwgMHg0NGYwLCAweDRmNCwgMHg0NGYwLCAweGNmNGYwLCAweDQ0ZjAsIDB4MmU0ZjAsIDB4NDQwLCAKKyAgMHg0NGYwLCAweDQ0ZjAsIDB4Y2Y0ZjAsIDB4NDAsIDB4NDRmMCwgMHgyZTRmMCwgMHg0NDQsIDB4MCwgCisgIDB4NGYwLCAweDRmNCwgMHg0ZjQsIDB4MmUsIDB4NDQ0LCAwCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBJSVRfTG9uZ0VuY29kaW5nVGFibGVbXSA9IHsKKyAgLyogMCAqLyAwLCA0LCA0LCAxNSwgMCwgMTUsIDAsIDE1LCAwLCAxNSwgMCwgMSwgMSwgMCwKKyAgLyogMTQgKi8gMTUsIDIsIDE1LCAxMCwgMTUsIDE3LCAxMCwgNCwgNCwgMSwgMSwgMSwgMSwgMSwgMCwKKyAgLyogMjkgKi8gMCwgMTUsIDIsIDE1LCA5LCAxNSwgMTcsIDQsIDEsIDEsIDEsIDEsIDAsCisgIC8qIDQyICovIDQsIDQsIDQsIDE1LCAxLCAxMSwgNCwgMSwgMSwgMSwgMCwKKyAgLyogNTMgKi8gMCwgNCwgNCwgMTUsIDMsIDE1LCAzLCAxLCAxLCAwLAorICAvKiA2MyAqLyAwLCAxNSwgMCwgMTAsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDEsIDEsIDAsCisgIC8qIDc3ICovIDAsIDE1LCAyLCAxMCwgNCwgNCwgNCwgMSwgMSwgMCwKKyAgLyogODcgKi8gMjEsIDE1LCAyLCAxLCAxNSwgMiwgMTUsIDIsIDEsIDAsCisgIC8qIDk3ICovIDE1LCAyLCAxNSwgMiwgMTUsIDIsIDE1LCAyLCAxLCAwLAorICAvKiAxMDcgKi8gMCwgMTUsIDMsIDMzLCAzLCAzMSwgMywgMSwgMCwKKyAgLyogMTE2ICovIDAsIDE1LCAzLCAzNCwgMSwgMCwgNCwgMzEsIDMsIDEsIDAsCisgIC8qIDEyNyAqLyAwLCAxNSwgMywgMTUsIDEyLCA0LCAzMSwgMywgMSwgMCwKKyAgLyogMTM3ICovIDE1LCAxLCAxNSwgMTIsIDE1LCAxLCA0LCA0LCAxLCAwLAorICAvKiAxNDcgKi8gMTUsIDEsIDE1LCAxLCAxNSwgMSwgNCwgNCwgNCwgMSwgMCwKKyAgLyogMTU4ICovIDcsIDI3LCAzLCA3LCA3LCA0LCA0LCAxLCAwLAorICAvKiAxNjcgKi8gMjEsIDEsIDUsIDEsIDAsCisgIC8qIDE3MiAqLyAyMSwgMTUsIDEsIDEsIDE1LCAxLCAxNSwgMSwgMCwKKyAgLyogMTgxICovIDAsIDE5LCAxNSwgMSwgMCwKKyAgLyogMTg2ICovIDAsIDE1LCA0LCAxNSwgMTIsIDE1LCAxNywgMSwgMCwKKyAgLyogMTk1ICovIDIsIDE4LCAxLCAwLAorICAvKiAxOTkgKi8gMTUsIDEsIDI1LCAxLCAwLAorICAvKiAyMDQgKi8gMzYsIDEsIDM2LCAxLCAzNiwgMSwgMCwKKyAgLyogMjExICovIDIxLCAxMiwgNCwgMzYsIDEsIDEyLCA0LCAxMiwgNCwgMzYsIDEsIDAsCisgIC8qIDIyMyAqLyAzNywgMSwgMzcsIDEsIDM3LCAxLCAwLAorICAvKiAyMzAgKi8gMjEsIDEzLCA0LCAzNywgMSwgMTMsIDQsIDEzLCA0LCAzNywgMSwgMCwKKyAgLyogMjQyICovIDE2LCAyLCAxNiwgMiwgMTYsIDIsIDIsIDAsCisgIC8qIDI1MCAqLyAxMSwgMywgMTIsIDIsIDEyLCAyLCAxMSwgMywgMiwgMCwKKyAgLyogMjYwICovIDExLCAzLCAxMSwgMywgMTEsIDMsIDExLCAzLCAyLCAwLAorICAvKiAyNzAgKi8gMTEsIDMsIDEyLCAyLCAxMiwgMiwgNCwgMTEsIDMsIDIsIDAsCisgIC8qIDI4MSAqLyAxMSwgMywgMTEsIDMsIDExLCAzLCA0LCAxMSwgMywgMiwgMCwKKyAgLyogMjkyICovIDEyLCAyLCAxMiwgMiwgNCwgMTIsIDIsIDQsIDIsIDAsCisgIC8qIDMwMiAqLyAxMCwgNCwgMTAsIDQsIDEwLCA0LCAxMCwgNCwgNCwgMiwgMCwKKyAgLyogMzEzICovIDEwLCA3LCAxMCwgNywgMTAsIDcsIDEwLCA0LCA0LCAyLCAwLAorICAvKiAzMjQgKi8gMTEsIDQsIDExLCA0LCAxMSwgNCwgMTEsIDQsIDQsIDIsIDAsCisgIC8qIDMzNSAqLyAxMSwgNywgMTEsIDcsIDExLCA3LCAxMSwgNCwgNCwgMiwgMCwKKyAgLyogMzQ2ICovIDksIDUsIDksIDUsIDksIDUsIDksIDUsIDQsIDIsIDAsCisgIC8qIDM1NyAqLyA5LCA4LCA5LCA4LCA5LCA4LCA5LCA1LCA0LCAyLCAwLAorICAvKiAzNjggKi8gMTAsIDUsIDEwLCA1LCAxMCwgNSwgMTAsIDUsIDQsIDIsIDAsCisgIC8qIDM3OSAqLyAxMCwgOCwgMTAsIDgsIDEwLCA4LCAxMCwgNSwgNCwgMiwgMCwKKyAgLyogMzkwICovIDExLCA1LCAxMSwgNSwgMTEsIDUsIDExLCA1LCA0LCAyLCAwLAorICAvKiA0MDEgKi8gMTAsIDQsIDExLCAzLCAxMSwgMywgMTAsIDQsIDIsIDAsCisgIC8qIDQxMSAqLyAxMCwgNCwgMTAsIDQsIDEwLCA0LCA0LCAxMCwgNCwgMiwgMCwKKyAgLyogNDIyICovIDEwLCA0LCAxMCwgNCwgMTQsIDIsIDEwLCA0LCAxMCwgNCwgMiwgMCwKKyAgLyogNDM0ICovIDEwLCA0LCAxMCwgNCwgMTAsIDQsIDEwLCA0LCAyLCAwLAorICAvKiA0NDQgKi8gMTAsIDQsIDEwLCA0LCAxNCwgMiwgOSwgNSwgMTAsIDQsIDIsIDAsCisgIC8qIDQ1NiAqLyAxMCwgNCwgMTAsIDQsIDE0LCAyLCAxMCwgNSwgMTAsIDQsIDIsIDAsCisgIC8qIDQ2OCAqLyAxMCwgNywgMTAsIDcsIDEwLCA3LCAxMCwgNCwgMiwgMCwKKyAgLyogNDc4ICovIDExLCA0LCAxMiwgMywgMTIsIDMsIDExLCA0LCAyLCAwLAorICAvKiA0ODggKi8gMTEsIDQsIDExLCA0LCAxMSwgNCwgNCwgMTEsIDQsIDIsIDAsCisgIC8qIDQ5OSAqLyAxMSwgNCwgMTEsIDQsIDE0LCAyLCAxMSwgNCwgMTEsIDQsIDIsIDAsCisgIC8qIDUxMSAqLyAxMSwgNCwgMTEsIDQsIDExLCA0LCAxMSwgNCwgMiwgMCwKKyAgLyogNTIxICovIDExLCA3LCAxMSwgNywgMTEsIDcsIDExLCA0LCAyLCAwLAorICAvKiA1MzEgKi8gMjcsIDQsIDIsIDAsCisgIC8qIDUzNSAqLyA5LCA1LCA5LCA1LCA5LCA1LCA0LCA5LCA1LCAyLCAwLAorICAvKiA1NDYgKi8gOSwgNSwgOSwgNSwgMTQsIDIsIDEwLCA0LCA5LCA1LCAyLCAwLAorICAvKiA1NTggKi8gOSwgNSwgOSwgNSwgMTQsIDIsIDksIDUsIDksIDUsIDIsIDAsCisgIC8qIDU3MCAqLyA5LCA1LCA5LCA1LCA5LCA1LCA5LCA1LCAyLCAwLAorICAvKiA1ODAgKi8gOSwgOCwgOSwgOCwgOSwgOCwgOSwgNSwgMiwgMCwKKyAgLyogNTkwICovIDEwLCA1LCAxMCwgNSwgMTAsIDUsIDQsIDEwLCA1LCAyLCAwLAorICAvKiA2MDEgKi8gMTAsIDUsIDEwLCA1LCAxNCwgMiwgMTAsIDQsIDEwLCA1LCAyLCAwLAorICAvKiA2MTMgKi8gMTAsIDUsIDEwLCA1LCAxNCwgMiwgMTAsIDUsIDEwLCA1LCAyLCAwLAorICAvKiA2MjUgKi8gMTAsIDUsIDEwLCA1LCAxMCwgNSwgMTAsIDUsIDIsIDAsCisgIC8qIDYzNSAqLyAxMCwgOCwgMTAsIDgsIDEwLCA4LCAxMCwgNSwgMiwgMCwKKyAgLyogNjQ1ICovIDExLCA1LCAxMSwgNSwgMTEsIDUsIDQsIDExLCA1LCAyLCAwLAorICAvKiA2NTYgKi8gMTEsIDUsIDExLCA1LCAxMSwgNSwgMTEsIDUsIDIsIDAsCisgIC8qIDY2NiAqLyAxMCwgNywgMTAsIDcsIDEwLCA3LCA0LCAxMCwgNywgMiwgMCwKKyAgLyogNjc3ICovIDEwLCA3LCAxMCwgNywgMTQsIDIsIDEwLCA0LCAxMCwgNywgMiwgMCwKKyAgLyogNjg5ICovIDEwLCA3LCAxMCwgNywgMTAsIDQsIDEwLCA3LCAyLCAwLAorICAvKiA2OTkgKi8gMTAsIDcsIDEwLCA3LCAxNCwgMiwgOSwgNSwgMTAsIDcsIDIsIDAsCisgIC8qIDcxMSAqLyAxMCwgNywgMTAsIDcsIDE0LCAyLCAxMCwgNSwgMTAsIDcsIDIsIDAsCisgIC8qIDcyMyAqLyAxMCwgNywgMTAsIDQsIDEwLCA3LCAxMCwgNywgMiwgMCwKKyAgLyogNzMzICovIDEwLCA3LCAxMCwgNywgMTAsIDcsIDEwLCA3LCAyLCAwLAorICAvKiA3NDMgKi8gMTEsIDcsIDExLCA3LCAxMSwgNywgNCwgMTEsIDcsIDIsIDAsCisgIC8qIDc1NCAqLyAxMSwgNywgMTEsIDcsIDE0LCAyLCAxMSwgNCwgMTEsIDcsIDIsIDAsCisgIC8qIDc2NiAqLyAxMSwgNywgMTEsIDcsIDExLCA0LCAxMSwgNywgMiwgMCwKKyAgLyogNzc2ICovIDExLCA3LCAxMSwgNCwgMTEsIDcsIDExLCA3LCAyLCAwLAorICAvKiA3ODYgKi8gMTEsIDcsIDExLCA3LCAxMSwgNywgMTEsIDcsIDIsIDAsCisgIC8qIDc5NiAqLyAyNywgNywgMiwgMCwKKyAgLyogODAwICovIDksIDgsIDksIDgsIDksIDgsIDQsIDksIDgsIDIsIDAsCisgIC8qIDgxMSAqLyA5LCA4LCA5LCA4LCAxNCwgMiwgMTAsIDQsIDksIDgsIDIsIDAsCisgIC8qIDgyMyAqLyA5LCA4LCA5LCA4LCAxNCwgMiwgOSwgNSwgOSwgOCwgMiwgMCwKKyAgLyogODM1ICovIDksIDgsIDksIDgsIDksIDUsIDksIDgsIDIsIDAsCisgIC8qIDg0NSAqLyA5LCA4LCA5LCA1LCA5LCA4LCA5LCA4LCAyLCAwLAorICAvKiA4NTUgKi8gOSwgOCwgOSwgOCwgOSwgOCwgOSwgOCwgMiwgMCwKKyAgLyogODY1ICovIDEwLCA4LCAxMCwgOCwgMTAsIDgsIDQsIDEwLCA4LCAyLCAwLAorICAvKiA4NzYgKi8gMTAsIDgsIDEwLCA4LCAxNCwgMiwgMTAsIDQsIDEwLCA4LCAyLCAwLAorICAvKiA4ODggKi8gMTAsIDgsIDEwLCA4LCAxNCwgMiwgMTAsIDUsIDEwLCA4LCAyLCAwLAorICAvKiA5MDAgKi8gMTAsIDgsIDEwLCA4LCAxMCwgNSwgMTAsIDgsIDIsIDAsCisgIC8qIDkxMCAqLyAxMCwgOCwgMTAsIDUsIDEwLCA4LCAxMCwgOCwgMiwgMCwKKyAgLyogOTIwICovIDEwLCA4LCAxMCwgOCwgMTAsIDgsIDEwLCA4LCAyLCAwLAorICAvKiA5MzAgKi8gMTEsIDgsIDExLCA4LCAxMSwgNSwgMTEsIDgsIDIsIDAsCisgIC8qIDk0MCAqLyAxMSwgOCwgMTEsIDUsIDExLCA4LCAxMSwgOCwgMiwgMCwKKyAgLyogOTUwICovIDExLCAyLCAxMSwgMiwgMTEsIDIsIDExLCAyLCAxMSwgMiwgMTEsIDIsIDExLCAyLCAwLAorICAvKiA5NjUgKi8gMjEsIDEyLCAyLCA0LCAxMiwgMiwgMTIsIDIsIDAsCisgIC8qIDk3NCAqLyAyMSwgMTIsIDIsIDQsIDEyLCAyLCAwLAorICAvKiA5ODEgKi8gMTgsIDQsIDE0LCAyLCAxNCwgMiwgMTQsIDIsIDAsCisgIC8qIDk5MCAqLyAyMSwgNCwgMTQsIDIsIDE0LCAyLCA0LCAxNCwgMiwgMCwKKyAgLyogMTAwMCAqLyAyMSwgNSwgMTQsIDIsIDE0LCAyLCA0LCAxNCwgMiwgMCwKKyAgLyogMTAxMCAqLyAyMSwgNCwgMTQsIDIsIDE0LCAyLCA0LCA0LCAxNCwgMiwgMCwKKyAgLyogMTAyMSAqLyAyMSwgNSwgMTQsIDIsIDE0LCAyLCA0LCA0LCAxNCwgMiwgMCwKKyAgLyogMTAzMiAqLyAxNCwgMiwgMTQsIDIsIDQsIDQsIDQsIDE0LCAyLCAwLAorICAvKiAxMDQyICovIDIxLCA0LCA0LCAxNCwgMiwgMCwKKyAgLyogMTA0OCAqLyAxNCwgMiwgMTQsIDIsIDQsIDQsIDUsIDE0LCAyLCAwLAorICAvKiAxMDU4ICovIDIxLCA1LCA1LCAxNCwgMiwgMCwKKyAgLyogMTA2NCAqLyAwLCAxNywgMTcsIDE0LCAyLCAwLAorICAvKiAxMDcwICovIDE0LCAyLCAxOCwgMTQsIDIsIDAsCisgIC8qIDEwNzYgKi8gMTYsIDIsIDE2LCAyLCAxNiwgMiwgMCwKKyAgLyogMTA4MyAqLyAxMSwgNSwgMTYsIDIsIDE2LCAyLCAwLAorICAvKiAxMDkwICovIDE3LCAxNywgMTcsIDIsIDAsCisgIC8qIDEwOTUgKi8gMTIsIDIsIDEyLCAyLCAxMiwgMiwgMTIsIDIsIDMsIDAsCisgIC8qIDExMDUgKi8gMCwgNSwgNCwgNCwgNCwgMywgMywgMywgMywgMCwKKyAgLyogMTExNSAqLyAxMiwgMywgMTMsIDIsIDEzLCAyLCAxMiwgMywgMywgMCwKKyAgLyogMTEyNSAqLyAxMiwgMywgMTIsIDMsIDEyLCAzLCAxMiwgMywgMywgMCwKKyAgLyogMTEzNSAqLyAxMiwgMywgMTMsIDIsIDEzLCAyLCA0LCAxMiwgMywgMywgMCwKKyAgLyogMTE0NiAqLyAxMiwgMywgMTIsIDMsIDEyLCAzLCA0LCAxMiwgMywgMywgMCwKKyAgLyogMTE1NyAqLyAxMiwgNCwgMTIsIDQsIDEyLCA0LCAxMiwgNCwgNCwgMywgMCwKKyAgLyogMTE2OCAqLyAxMiwgNCwgMTMsIDMsIDEzLCAzLCAxMiwgNCwgMywgMCwKKyAgLyogMTE3OCAqLyAxMiwgNCwgMTIsIDQsIDEyLCA0LCA0LCAxMiwgNCwgMywgMCwKKyAgLyogMTE4OSAqLyAxMiwgNCwgMTIsIDQsIDEyLCA0LCAxMiwgNCwgMywgMCwKKyAgLyogMTE5OSAqLyAxMiwgNywgMTIsIDcsIDEyLCA0LCAxMiwgNywgMywgMCwKKyAgLyogMTIwOSAqLyAxMiwgNywgMTIsIDQsIDEyLCA3LCAxMiwgNywgMywgMCwKKyAgLyogMTIxOSAqLyAyMSwgMTIsIDIsIDQsIDExLCAzLCAxMSwgMywgMCwKKyAgLyogMTIyOCAqLyAyMSwgMTEsIDMsIDQsIDExLCAzLCAxMSwgMywgMCwKKyAgLyogMTIzNyAqLyAyMSwgMTEsIDMsIDQsIDExLCAzLCAwLAorICAvKiAxMjQ0ICovIDE2LCAyLCAxMywgMywgMTMsIDMsIDAsCisgIC8qIDEyNTEgKi8gMTUsIDMsIDMzLCAzLCAzMSwgMywgMSwgMTUsIDMsIDAsCisgIC8qIDEyNjEgKi8gMTUsIDMsIDM0LCAxLCAwLCA0LCAzMSwgMywgMSwgMTUsIDMsIDAsCisgIC8qIDEyNzMgKi8gMTUsIDMsIDE1LCAxMiwgNCwgMzEsIDMsIDEsIDE1LCAzLCAwLAorICAvKiAxMjg0ICovIDE1LCAzLCAxNSwgMywgMTIsIDIsIDEyLCAyLCAxMiwgMiwgMTIsIDIsIDE1LCAzLCAwLAorICAvKiAxMjk5ICovIDE1LCAzLCAxNSwgMywgMTIsIDIsIDEyLCAyLCAxMiwgMiwgMTUsIDMsIDAsCisgIC8qIDEzMTIgKi8gMTUsIDMsIDE1LCAzLCAxMiwgMiwgMTIsIDIsIDE1LCAzLCAwLAorICAvKiAxMzIzICovIDE1LCAzLCAyNSwgMywgMCwKKyAgLyogMTMyOCAqLyAxNSwgMywgMjUsIDMsIDI1LCAzLCAwLAorICAvKiAxMzM1ICovIDE1LCAzLCAyNiwgMywgMCwKKyAgLyogMTM0MCAqLyAxNSwgMywgMjYsIDMsIDI2LCAzLCAwLAorICAvKiAxMzQ3ICovIDE1LCAxLCAyNSwgMSwgNCwgMCwKKyAgLyogMTM1MyAqLyAxMiwgNCwgMTIsIDQsIDM2LCAxLCA0LCAwLAorICAvKiAxMzYxICovIDEzLCA0LCAxMywgNCwgMzcsIDEsIDQsIDAsCisgIC8qIDEzNjkgKi8gMTAsIDcsIDEwLCA3LCAxMCwgNywgMTAsIDQsIDQsIDIsIDQsIDAsCisgIC8qIDEzODEgKi8gOSwgOCwgOSwgOCwgOSwgOCwgOSwgNSwgNCwgMiwgNCwgMCwKKyAgLyogMTM5MyAqLyAxMSwgOCwgMTEsIDgsIDExLCA4LCAxMSwgNSwgNCwgMiwgNCwgMCwKKyAgLyogMTQwNSAqLyAxMCwgNCwgMTAsIDQsIDE0LCAyLCAxMCwgNCwgMiwgNCwgMCwKKyAgLyogMTQxNiAqLyA5LCA1LCA5LCA1LCAxNCwgMiwgMTAsIDQsIDIsIDQsIDAsCisgIC8qIDE0MjcgKi8gMTAsIDUsIDEwLCA1LCAxNCwgMiwgMTAsIDQsIDIsIDQsIDAsCisgIC8qIDE0MzggKi8gMTAsIDcsIDEwLCA3LCAxNCwgMiwgMTAsIDQsIDIsIDQsIDAsCisgIC8qIDE0NDkgKi8gOSwgOCwgOSwgOCwgMTQsIDIsIDEwLCA0LCAyLCA0LCAwLAorICAvKiAxNDYwICovIDEwLCA4LCAxMCwgOCwgMTQsIDIsIDEwLCA0LCAyLCA0LCAwLAorICAvKiAxNDcxICovIDExLCA0LCAxMSwgNCwgMTQsIDIsIDExLCA0LCAyLCA0LCAwLAorICAvKiAxNDgyICovIDExLCA1LCAxMSwgNSwgMTQsIDIsIDExLCA0LCAyLCA0LCAwLAorICAvKiAxNDkzICovIDExLCA3LCAxMSwgNywgMTQsIDIsIDExLCA0LCAyLCA0LCAwLAorICAvKiAxNTA0ICovIDExLCA4LCAxMSwgOCwgMTQsIDIsIDExLCA0LCAyLCA0LCAwLAorICAvKiAxNTE1ICovIDEwLCA0LCAxMCwgNCwgMTQsIDIsIDksIDUsIDIsIDQsIDAsCisgIC8qIDE1MjYgKi8gOSwgNSwgOSwgNSwgMTQsIDIsIDksIDUsIDIsIDQsIDAsCisgIC8qIDE1MzcgKi8gMTAsIDcsIDEwLCA3LCAxNCwgMiwgOSwgNSwgMiwgNCwgMCwKKyAgLyogMTU0OCAqLyA5LCA4LCA5LCA4LCAxNCwgMiwgOSwgNSwgMiwgNCwgMCwKKyAgLyogMTU1OSAqLyAxMCwgNCwgMTAsIDQsIDE0LCAyLCAxMCwgNSwgMiwgNCwgMCwKKyAgLyogMTU3MCAqLyAxMCwgNSwgMTAsIDUsIDE0LCAyLCAxMCwgNSwgMiwgNCwgMCwKKyAgLyogMTU4MSAqLyAxMCwgNywgMTAsIDcsIDE0LCAyLCAxMCwgNSwgMiwgNCwgMCwKKyAgLyogMTU5MiAqLyAxMCwgOCwgMTAsIDgsIDE0LCAyLCAxMCwgNSwgMiwgNCwgMCwKKyAgLyogMTYwMyAqLyAxMSwgNCwgMTEsIDQsIDE0LCAyLCAxMSwgNSwgMiwgNCwgMCwKKyAgLyogMTYxNCAqLyAxMSwgNSwgMTEsIDUsIDE0LCAyLCAxMSwgNSwgMiwgNCwgMCwKKyAgLyogMTYyNSAqLyAxMSwgNywgMTEsIDcsIDE0LCAyLCAxMSwgNSwgMiwgNCwgMCwKKyAgLyogMTYzNiAqLyAxMSwgOCwgMTEsIDgsIDE0LCAyLCAxMSwgNSwgMiwgNCwgMCwKKyAgLyogMTY0NyAqLyAxMCwgNywgMTAsIDcsIDEwLCA3LCA0LCAxMCwgNywgMiwgNCwgMCwKKyAgLyogMTY1OSAqLyAxMCwgNywgMTAsIDcsIDEwLCA3LCAxMCwgNywgMiwgNCwgMCwKKyAgLyogMTY3MCAqLyAxMCwgNywgMTAsIDcsIDksIDgsIDEwLCA3LCAyLCA0LCAwLAorICAvKiAxNjgxICovIDksIDgsIDksIDgsIDksIDgsIDQsIDksIDgsIDIsIDQsIDAsCisgIC8qIDE2OTMgKi8gOSwgOCwgOSwgOCwgMTAsIDcsIDksIDgsIDIsIDQsIDAsCisgIC8qIDE3MDQgKi8gOSwgOCwgOSwgOCwgOSwgOCwgOSwgOCwgMiwgNCwgMCwKKyAgLyogMTcxNSAqLyAxMSwgOCwgMTEsIDgsIDExLCA4LCA0LCAxMSwgOCwgMiwgNCwgMCwKKyAgLyogMTcyNyAqLyAxMSwgOCwgMTEsIDgsIDExLCA4LCAxMSwgOCwgMiwgNCwgMCwKKyAgLyogMTczOCAqLyAxMiwgMiwgMTIsIDIsIDEyLCAyLCAxMiwgMiwgNCwgMCwKKyAgLyogMTc0OCAqLyAyMSwgMTIsIDIsIDQsIDEyLCAyLCAxMiwgMiwgMTIsIDIsIDQsIDAsCisgIC8qIDE3NjAgKi8gMjEsIDEyLCAyLCA0LCAxMiwgMiwgMTIsIDIsIDQsIDAsCisgIC8qIDE3NzAgKi8gMTIsIDIsIDksIDUsIDksIDUsIDEyLCAyLCA0LCAwLAorICAvKiAxNzgwICovIDEzLCAyLCAxMywgMiwgMTMsIDIsIDEzLCAyLCA0LCAwLAorICAvKiAxNzkwICovIDE1LCAxLCAxNSwgMSwgMTQsIDIsIDE0LCAyLCA0LCAwLAorICAvKiAxODAwICovIDE1LCA0LCAxNSwgNCwgMTQsIDIsIDE0LCAyLCA0LCAwLAorICAvKiAxODEwICovIDIxLCA0LCAxNCwgMiwgMTQsIDIsIDQsIDAsCisgIC8qIDE4MTggKi8gMjEsIDUsIDE0LCAyLCAxNCwgMiwgNCwgMCwKKyAgLyogMTgyNiAqLyAxMiwgNywgMTIsIDcsIDEyLCA3LCAxMiwgNCwgNCwgMywgNCwgMCwKKyAgLyogMTgzOCAqLyAxMiwgNCwgMTIsIDQsIDE0LCAyLCAxMiwgNCwgMywgNCwgMCwKKyAgLyogMTg0OSAqLyAxMiwgNywgMTIsIDcsIDE0LCAyLCAxMiwgNCwgMywgNCwgMCwKKyAgLyogMTg2MCAqLyAxMiwgNywgMTIsIDcsIDEyLCA3LCA0LCAxMiwgNywgMywgNCwgMCwKKyAgLyogMTg3MiAqLyAxMiwgNywgMTIsIDcsIDEyLCA3LCAxMiwgNywgMywgNCwgMCwKKyAgLyogMTg4MyAqLyAxMSwgMywgMTEsIDMsIDExLCAzLCAxMSwgMywgNCwgMCwKKyAgLyogMTg5MyAqLyAyMSwgMTEsIDMsIDQsIDExLCAzLCAxMSwgMywgMTEsIDMsIDQsIDAsCisgIC8qIDE5MDUgKi8gMjEsIDExLCAzLCA0LCAxMSwgMywgMTEsIDMsIDQsIDAsCisgIC8qIDE5MTUgKi8gMTMsIDMsIDE2LCAyLCAxNiwgMiwgMTMsIDMsIDQsIDAsCisgIC8qIDE5MjUgKi8gMTMsIDMsIDEzLCAzLCAxMywgMywgMTMsIDMsIDQsIDAsCisgIC8qIDE5MzUgKi8gMTMsIDMsIDE2LCAyLCAxNiwgMiwgNCwgMTMsIDMsIDQsIDAsCisgIC8qIDE5NDYgKi8gMTMsIDMsIDEzLCAzLCAxMywgMywgNCwgMTMsIDMsIDQsIDAsCisgIC8qIDE5NTcgKi8gMjEsIDMsIDQsIDAsCisgIC8qIDE5NjEgKi8gMTUsIDMsIDI2LCAzLCA0LCAwLAorICAvKiAxOTY3ICovIDIxLCA0LCAxLCA0LCA0LCAwLAorICAvKiAxOTczICovIDEwLCA3LCAxMCwgNywgMTAsIDcsIDEwLCA3LCAyLCA0LCA0LCAwLAorICAvKiAxOTg1ICovIDksIDgsIDksIDgsIDksIDgsIDksIDgsIDIsIDQsIDQsIDAsCisgIC8qIDE5OTcgKi8gMjMsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAzLCAxNSwgMTIsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAzLCA0LCA0LCAwLAorICAvKiAyMDE5ICovIDIyLCAxNSwgMywgMTUsIDMsIDE1LCAzLCAxNSwgMTIsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDQsIDQsIDAsCisgIC8qIDIwMzcgKi8gMjEsIDE1LCAzLCAxNSwgMywgMTUsIDEyLCAxNSwgMywgMTUsIDMsIDQsIDQsIDAsCisgIC8qIDIwNTEgKi8gMCwgNSwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgMCwKKyAgLyogMjA2MSAqLyAyMSwgNCwgNCwgNCwgNCwgNCwgMCwKKyAgLyogMjA2OCAqLyAyMywgMywgMywgMywgMywgNSwgNCwgNCwgNCwgMCwKKyAgLyogMjA3OCAqLyAyMSwgMywgMywgNSwgNCwgNCwgNCwgMCwKKyAgLyogMjA4NiAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNCwgNCwgNCwgMCwKKyAgLyogMjA5NiAqLyAyMSwgNCwgNCwgNSwgNCwgNCwgNCwgMCwKKyAgLyogMjEwNCAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNSwgNCwgNCwgNCwgMCwKKyAgLyogMjExNSAqLyAyMSwgNSwgNSwgNSwgNCwgNCwgNCwgMCwKKyAgLyogMjEyMyAqLyAyMywgNywgNywgNywgNywgNSwgNSwgNCwgNCwgNCwgMCwKKyAgLyogMjEzNCAqLyAyMywgNywgNywgNywgNywgNSwgNCwgNCwgNCwgMCwKKyAgLyogMjE0NCAqLyAxNiwgNCwgMTYsIDQsIDE2LCA0LCA0LCA0LCAwLAorICAvKiAyMTUzICovIDIzLCAzLCAzLCAzLCAzLCA1LCA0LCA0LCAwLAorICAvKiAyMTYyICovIDIxLCAzLCAzLCA1LCA0LCA0LCAwLAorICAvKiAyMTY5ICovIDIzLCA0LCA0LCA0LCA0LCA1LCA0LCA0LCAwLAorICAvKiAyMTc4ICovIDIxLCA0LCA0LCA1LCA0LCA0LCAwLAorICAvKiAyMTg1ICovIDIzLCA0LCA0LCA0LCA0LCA1LCA1LCA0LCA0LCAwLAorICAvKiAyMTk1ICovIDIxLCA1LCA1LCA1LCA0LCA0LCAwLAorICAvKiAyMjAyICovIDIzLCA3LCA3LCA3LCA3LCA1LCA1LCA0LCA0LCAwLAorICAvKiAyMjEyICovIDIzLCA3LCA3LCA3LCA3LCA1LCA0LCA0LCAwLAorICAvKiAyMjIxICovIDAsIDE0LCAyLCAyLCAxMCwgNCwgMTAsIDQsIDQsIDAsCisgIC8qIDIyMzEgKi8gMjEsIDEwLCA0LCA0LCAxMCwgNCwgMTAsIDQsIDQsIDAsCisgIC8qIDIyNDEgKi8gMjEsIDEwLCA0LCA0LCAxMCwgNCwgMTAsIDQsIDEwLCA0LCA0LCAwLAorICAvKiAyMjUzICovIDEwLCA0LCAxMCwgNCwgMTAsIDQsIDEwLCA0LCA0LCAwLAorICAvKiAyMjYzICovIDAsIDE0LCAyLCAyLCA5LCA1LCAxMCwgNCwgNCwgMCwKKyAgLyogMjI3MyAqLyAwLCAxNCwgMiwgMiwgMTAsIDUsIDEwLCA0LCA0LCAwLAorICAvKiAyMjgzICovIDAsIDE0LCAyLCAyLCAxMSwgNCwgMTEsIDQsIDQsIDAsCisgIC8qIDIyOTMgKi8gMCwgMTQsIDIsIDIsIDExLCA1LCAxMSwgNCwgNCwgMCwKKyAgLyogMjMwMyAqLyAwLCAxNSwgNCwgMTUsIDExLCAxNSwgMTEsIDQsIDQsIDAsCisgIC8qIDIzMTMgKi8gMCwgMTUsIDQsIDE1LCAxMSwgMTUsIDExLCAxNSwgMTEsIDQsIDQsIDAsCisgIC8qIDIzMjUgKi8gMCwgMTUsIDQsIDE1LCAxMSwgMTUsIDExLCAxNSwgMTEsIDE1LCAxMSwgNCwgNCwgMCwKKyAgLyogMjMzOSAqLyAzNiwgMSwgMzYsIDEsIDEyLCA0LCA0LCAwLAorICAvKiAyMzQ3ICovIDAsIDE0LCAyLCAzLCAxMiwgNCwgMTIsIDQsIDQsIDAsCisgIC8qIDIzNTcgKi8gMTIsIDQsIDEyLCA0LCAxMiwgNCwgMTIsIDQsIDQsIDAsCisgIC8qIDIzNjcgKi8gMTMsIDQsIDEzLCA0LCAxMiwgNCwgMTIsIDQsIDQsIDAsCisgIC8qIDIzNzcgKi8gMzcsIDEsIDM3LCAxLCAxMywgNCwgNCwgMCwKKyAgLyogMjM4NSAqLyAxMywgNCwgMTMsIDQsIDEzLCA0LCAxMywgNCwgNCwgMCwKKyAgLyogMjM5NSAqLyAxNiwgNCwgMTYsIDQsIDEzLCA0LCAxMywgNCwgNCwgMCwKKyAgLyogMjQwNSAqLyAxNiwgNCwgMTYsIDQsIDEzLCA0LCA0LCAwLAorICAvKiAyNDEzICovIDQwLCA5LCA2LCA5LCA2LCA5LCA2LCA5LCA2LCA5LCA2LCA5LCA2LCA5LCA2LCA5LCA2LCAxNSwgNCwgNCwgMCwKKyAgLyogMjQzNCAqLyAyMywgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgMTUsIDQsIDQsIDAsCisgIC8qIDI0NDcgKi8gNDAsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDE1LCA0LCA0LCAwLAorICAvKiAyNDYwICovIDEzLCA0LCAxMywgNCwgMTYsIDQsIDQsIDAsCisgIC8qIDI0NjggKi8gMTYsIDQsIDE2LCA0LCAxNiwgNCwgNCwgMCwKKyAgLyogMjQ3NiAqLyAxNywgMTcsIDQsIDQsIDAsCisgIC8qIDI0ODEgKi8gMTUsIDAsIDE4LCA0LCA0LCAwLAorICAvKiAyNDg3ICovIDIxLCA0LCA0LCAwLAorICAvKiAyNDkxICovIDIzLCAzLCAzLCAzLCAzLCA1LCA0LCAwLAorICAvKiAyNDk5ICovIDIxLCAzLCAzLCA1LCA0LCAwLAorICAvKiAyNTA1ICovIDIzLCA0LCA0LCA0LCA0LCA1LCA0LCAwLAorICAvKiAyNTEzICovIDIxLCA0LCA0LCA1LCA0LCAwLAorICAvKiAyNTE5ICovIDIzLCA0LCA0LCA0LCA0LCA1LCA1LCA0LCAwLAorICAvKiAyNTI4ICovIDIxLCA1LCA1LCA1LCA0LCAwLAorICAvKiAyNTM0ICovIDIzLCA3LCA3LCA3LCA3LCA1LCA1LCA0LCAwLAorICAvKiAyNTQzICovIDIzLCA3LCA3LCA3LCA3LCA1LCA0LCAwLAorICAvKiAyNTUxICovIDAsIDE0LCAyLCAyLCAxMCwgNCwgOSwgNSwgNCwgMCwKKyAgLyogMjU2MSAqLyAwLCAxNCwgMiwgMiwgOSwgNSwgOSwgNSwgNCwgMCwKKyAgLyogMjU3MSAqLyA5LCA1LCA5LCA1LCA5LCA1LCA5LCA1LCA0LCAwLAorICAvKiAyNTgxICovIDAsIDE0LCAyLCAyLCAxMCwgNCwgMTAsIDUsIDQsIDAsCisgIC8qIDI1OTEgKi8gMCwgMTQsIDIsIDIsIDEwLCA1LCAxMCwgNSwgNCwgMCwKKyAgLyogMjYwMSAqLyAwLCAxNCwgMiwgMiwgMTEsIDQsIDExLCA1LCA0LCAwLAorICAvKiAyNjExICovIDAsIDE0LCAyLCAyLCAxMSwgNSwgMTEsIDUsIDQsIDAsCisgIC8qIDI2MjEgKi8gMjEsIDUsIDQsIDAsCisgIC8qIDI2MjUgKi8gMCwgMTUsIDQsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDQsIDAsCisgIC8qIDI2MzggKi8gMCwgMTUsIDQsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDQsIDAsCisgIC8qIDI2NTEgKi8gMjEsIDEwLCA0LCA0LCAxMCwgNywgNCwgMCwKKyAgLyogMjY1OSAqLyAwLCAxNCwgMiwgMiwgMTAsIDQsIDEwLCA3LCA0LCAwLAorICAvKiAyNjY5ICovIDAsIDE0LCAyLCAyLCA5LCA1LCAxMCwgNywgNCwgMCwKKyAgLyogMjY3OSAqLyAwLCAxNCwgMiwgMiwgMTAsIDUsIDEwLCA3LCA0LCAwLAorICAvKiAyNjg5ICovIDAsIDE0LCAyLCAyLCAxMSwgNCwgMTEsIDcsIDQsIDAsCisgIC8qIDI2OTkgKi8gMCwgMTQsIDIsIDIsIDExLCA1LCAxMSwgNywgNCwgMCwKKyAgLyogMjcwOSAqLyAwLCAxNCwgMiwgMywgMTIsIDQsIDEyLCA3LCA0LCAwLAorICAvKiAyNzE5ICovIDIxLCA5LCA1LCA0LCA5LCA4LCA0LCAwLAorICAvKiAyNzI3ICovIDAsIDE0LCAyLCAyLCAxMCwgNCwgOSwgOCwgNCwgMCwKKyAgLyogMjczNyAqLyAwLCAxNCwgMiwgMiwgOSwgNSwgOSwgOCwgNCwgMCwKKyAgLyogMjc0NyAqLyAwLCAxNCwgMiwgMiwgMTAsIDQsIDEwLCA4LCA0LCAwLAorICAvKiAyNzU3ICovIDAsIDE0LCAyLCAyLCAxMCwgNSwgMTAsIDgsIDQsIDAsCisgIC8qIDI3NjcgKi8gMCwgMTQsIDIsIDIsIDExLCA0LCAxMSwgOCwgNCwgMCwKKyAgLyogMjc3NyAqLyAwLCAxNCwgMiwgMiwgMTEsIDUsIDExLCA4LCA0LCAwLAorICAvKiAyNzg3ICovIDIxLCAxMCwgNCwgNCwgMTAsIDQsIDAsCisgIC8qIDI3OTQgKi8gMjEsIDExLCAzLCA0LCAxMCwgNCwgMTAsIDQsIDAsCisgIC8qIDI4MDMgKi8gMjEsIDEwLCA0LCA0LCAxMCwgNCwgMTAsIDQsIDAsCisgIC8qIDI4MTIgKi8gMCwgMTUsIDQsIDE1LCAxMSwgMTUsIDExLCAxNSwgMTEsIDQsIDAsCisgIC8qIDI4MjMgKi8gMCwgMTUsIDQsIDE1LCAxMSwgMTUsIDExLCAxNSwgMTEsIDE1LCAxMSwgNCwgMCwKKyAgLyogMjgzNiAqLyAxMiwgNCwgMzYsIDEsIDEyLCA0LCAwLAorICAvKiAyODQzICovIDAsIDM2LCAxLCAxNCwgMiwgMTIsIDQsIDAsCisgIC8qIDI4NTEgKi8gMCwgMTQsIDIsIDM2LCAxLCA0LCA0LCAxMiwgNCwgMCwKKyAgLyogMjg2MSAqLyAzNiwgMSwgMzYsIDEsIDEyLCA0LCAxMiwgNCwgMCwKKyAgLyogMjg3MCAqLyAxMiwgNCwgMzYsIDEsIDEyLCA0LCAxMiwgNCwgMCwKKyAgLyogMjg3OSAqLyAxMywgNCwgMzYsIDEsIDEyLCA0LCAxMiwgNCwgMCwKKyAgLyogMjg4OCAqLyAwLCAzNiwgMSwgNCwgNCwgMTIsIDQsIDEyLCA0LCAwLAorICAvKiAyODk4ICovIDAsIDM2LCAxLCA0LCA0LCAxMywgNCwgMTIsIDQsIDAsCisgIC8qIDI5MDggKi8gMjMsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAzLCAxNSwgMTIsIDQsIDAsCisgIC8qIDI5MjEgKi8gMjIsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAxMiwgNCwgMCwKKyAgLyogMjkzMiAqLyAyMSwgMTUsIDMsIDE1LCAzLCAxNSwgMTIsIDQsIDAsCisgIC8qIDI5NDEgKi8gMTMsIDQsIDM3LCAxLCAxMywgNCwgMCwKKyAgLyogMjk0OCAqLyAwLCAzNywgMSwgMTQsIDIsIDEzLCA0LCAwLAorICAvKiAyOTU2ICovIDAsIDE0LCAyLCAzNiwgMSwgNCwgNCwgMTMsIDQsIDAsCisgIC8qIDI5NjYgKi8gMCwgMTQsIDIsIDM3LCAxLCA0LCA0LCAxMywgNCwgMCwKKyAgLyogMjk3NiAqLyAzNywgMSwgMzcsIDEsIDEzLCA0LCAxMywgNCwgMCwKKyAgLyogMjk4NSAqLyAxMywgNCwgMzcsIDEsIDEzLCA0LCAxMywgNCwgMCwKKyAgLyogMjk5NCAqLyAxNiwgNCwgMzcsIDEsIDEzLCA0LCAxMywgNCwgMCwKKyAgLyogMzAwMyAqLyAwLCAzNywgMSwgNCwgNCwgMTMsIDQsIDEzLCA0LCAwLAorICAvKiAzMDEzICovIDE2LCA0LCAxNiwgNCwgMTMsIDQsIDEzLCA0LCAwLAorICAvKiAzMDIyICovIDAsIDQsIDQsIDE2LCA0LCAxMywgNCwgMCwKKyAgLyogMzAzMCAqLyAwLCAzNywgMSwgNCwgNCwgMTYsIDQsIDEzLCA0LCAwLAorICAvKiAzMDQwICovIDE2LCA0LCAxNiwgNCwgMTMsIDQsIDAsCisgIC8qIDMwNDcgKi8gMCwgMTQsIDIwLCA1LCAxNSwgNCwgMCwKKyAgLyogMzA1NCAqLyA0MCwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgMTUsIDQsIDAsCisgIC8qIDMwNzQgKi8gMjMsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDE1LCA0LCAwLAorICAvKiAzMDg2ICovIDQwLCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCAxNSwgNCwgMCwKKyAgLyogMzA5OCAqLyA1LCAxOSwgMTUsIDQsIDAsCisgIC8qIDMxMDMgKi8gMCwgMTQsIDIsIDM3LCAxLCA0LCA0LCAxNiwgNCwgMCwKKyAgLyogMzExMyAqLyAwLCAxNCwgMiwgNCwgNCwgMTYsIDQsIDAsCisgIC8qIDMxMjEgKi8gMTMsIDQsIDE2LCA0LCAwLAorICAvKiAzMTI2ICovIDE2LCA0LCAxNiwgNCwgMTYsIDQsIDAsCisgIC8qIDMxMzMgKi8gNCwgMTcsIDQsIDAsCisgIC8qIDMxMzcgKi8gMCwgMTUsIDQsIDE1LCAxMiwgMTUsIDE3LCA0LCAwLAorICAvKiAzMTQ2ICovIDE3LCAxNywgNCwgMCwKKyAgLyogMzE1MCAqLyAwLCAxNCwgMiwgMTYsIDIsIDUsIDAsCisgIC8qIDMxNTcgKi8gMTYsIDIsIDE0LCAyLCAxNiwgMiwgNSwgMCwKKyAgLyogMzE2NSAqLyAxNiwgMiwgMTYsIDIsIDE2LCAyLCAxNiwgMiwgNSwgMCwKKyAgLyogMzE3NSAqLyA1LCAxNiwgMiwgMTYsIDIsIDUsIDAsCisgIC8qIDMxODIgKi8gMjEsIDUsIDEsIDQsIDUsIDAsCisgIC8qIDMxODggKi8gMTYsIDQsIDE2LCA0LCAxMywgNCwgNSwgMCwKKyAgLyogMzE5NiAqLyAyMSwgMSwgNSwgNSwgMCwKKyAgLyogMzIwMSAqLyAyMSwgMTAsIDQsIDQsIDksIDUsIDksIDUsIDAsCisgIC8qIDMyMTAgKi8gMjEsIDksIDUsIDQsIDksIDUsIDksIDUsIDAsCisgIC8qIDMyMTkgKi8gMCwgMTUsIDQsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDAsCisgIC8qIDMyMzEgKi8gMjMsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDAsCisgIC8qIDMyODEgKi8gNDAsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDAsCisgIC8qIDMzMzEgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDQsIDcsIDAsCisgIC8qIDMzNDAgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDUsIDQsIDcsIDAsCisgIC8qIDMzNTAgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDUsIDQsIDcsIDAsCisgIC8qIDMzNjAgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDQsIDcsIDAsCisgIC8qIDMzNjkgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDcsIDAsCisgIC8qIDMzNzcgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDUsIDcsIDAsCisgIC8qIDMzODYgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDUsIDcsIDAsCisgIC8qIDMzOTUgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDcsIDAsCisgIC8qIDM0MDMgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDQsIDcsIDcsIDAsCisgIC8qIDM0MTMgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDUsIDQsIDcsIDcsIDAsCisgIC8qIDM0MjQgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDUsIDQsIDcsIDcsIDAsCisgIC8qIDM0MzUgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDQsIDcsIDcsIDAsCisgIC8qIDM0NDUgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDcsIDcsIDAsCisgIC8qIDM0NTQgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDUsIDcsIDcsIDAsCisgIC8qIDM0NjQgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDUsIDcsIDcsIDAsCisgIC8qIDM0NzQgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDcsIDcsIDAsCisgIC8qIDM0ODMgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDQsIDcsIDcsIDcsIDAsCisgIC8qIDM0OTQgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDUsIDQsIDcsIDcsIDcsIDAsCisgIC8qIDM1MDYgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDUsIDQsIDcsIDcsIDcsIDAsCisgIC8qIDM1MTggKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDQsIDcsIDcsIDcsIDAsCisgIC8qIDM1MjkgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDcsIDcsIDcsIDAsCisgIC8qIDM1MzkgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDUsIDcsIDcsIDcsIDAsCisgIC8qIDM1NTAgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDUsIDcsIDcsIDcsIDAsCisgIC8qIDM1NjEgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDcsIDcsIDcsIDAsCisgIC8qIDM1NzEgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDQsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM1ODMgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDUsIDQsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM1OTYgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDUsIDQsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM2MDkgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDQsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM2MjEgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM2MzIgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDUsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM2NDQgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDUsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM2NTYgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM2NjcgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDQsIDcsIDcsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM2ODEgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDUsIDQsIDcsIDcsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM2OTYgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDUsIDQsIDcsIDcsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM3MTEgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDQsIDcsIDcsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM3MjUgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDcsIDcsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM3MzggKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDUsIDcsIDcsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM3NTIgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDUsIDcsIDcsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM3NjYgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDcsIDcsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM3NzkgKi8gMCwgMTUsIDQsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM3OTEgKi8gMjMsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM4NDEgKi8gNDAsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM4OTEgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM5MDcgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDUsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM5MjQgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDUsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM5NDEgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDAsCisgIC8qIDM5NTcgKi8gMjEsIDEwLCA0LCA0LCAxMCwgNywgMTAsIDcsIDAsCisgIC8qIDM5NjYgKi8gMTcsIDEwLCA3LCAwLAorICAvKiAzOTcwICovIDIxLCA5LCA1LCA0LCA5LCA4LCA5LCA4LCAwLAorICAvKiAzOTc5ICovIDksIDgsIDksIDgsIDksIDgsIDksIDgsIDAsCisgIC8qIDM5ODggKi8gMTcsIDksIDgsIDAsCisgIC8qIDM5OTIgKi8gMTAsIDgsIDEwLCA4LCAxMCwgOCwgMTAsIDgsIDAsCisgIC8qIDQwMDEgKi8gMCwgMTUsIDMsIDE1LCAzLCAxNSwgMywgMTUsIDEyLCAwLAorICAvKiA0MDExICovIDAsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAzLCAxNSwgMTIsIDAsCisgIC8qIDQwMjMgKi8gMjMsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAzLCAxNSwgMTIsIDAsCisgIC8qIDQwMzUgKi8gMjIsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAxMiwgMCwKKyAgLyogNDA0NSAqLyAyMSwgMTUsIDMsIDE1LCAzLCAxNSwgMTIsIDAsCisgIC8qIDQwNTMgKi8gMCwgMTUsIDMsIDE1LCAzLCA1LCAxNSwgMTIsIDAsCisgIC8qIDQwNjIgKi8gMCwgMTUsIDMsIDE1LCAzLCAxNSwgMywgNSwgMTUsIDEyLCAwLAorICAvKiA0MDczICovIDAsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAzLCA1LCAxNSwgMTIsIDAsCisgIC8qIDQwODYgKi8gMjMsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAzLCAxNSwgMywgNSwgMTUsIDEyLCAwLAorICAvKiA0MTA3ICovIDIyLCAxNSwgMywgMTUsIDMsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAzLCA1LCAxNSwgMTIsIDAsCisgIC8qIDQxMjQgKi8gMjEsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAzLCA1LCAxNSwgMTIsIDAsCisgIC8qIDQxMzcgKi8gNCwgMTcsIDAsCisgIC8qIDQxNDAgKi8gMTAsIDcsIDEwLCA3LCAxNywgMCwKKyAgLyogNDE0NiAqLyA5LCA4LCAxNywgMCwKKyAgLyogNDE1MCAqLyAwLCAxNCwgMTcsIDE3LCAwLAorICAvKiA0MTU1ICovIDE3LCAxNywgMTcsIDAsCisgIC8qIDQxNTkgKi8gMTUsIDAsIDE4LCAwLAorICAvKiA0MTYzICovIDEsIDE4LCAwLAorICAvKiA0MTY2ICovIDE1LCA0LCAxOCwgMCwKKyAgLyogNDE3MCAqLyAwLCAxOSwgMCwKKyAgLyogNDE3MyAqLyAxNSwgMSwgMTksIDAsCisgIC8qIDQxNzcgKi8gMSwgMTQsIDIsIDE5LCAwLAorICAvKiA0MTgyICovIDIxLCAxNCwgMiwgMSwgMTQsIDIsIDQsIDE5LCAwLAorICAvKiA0MTkxICovIDE1LCAyLCAxNSwgMTAsIDE1LCAxOSwgMCwKKyAgLyogNDE5OCAqLyAxNSwgMiwgMTUsIDIsIDE1LCAyLCAxNSwgMiwgMTksIDE5LCAwLAorICAvKiA0MjA5ICovIDE1LCAyLCAxNSwgMiwgNCwgMTksIDE5LCAwLAorICAvKiA0MjE3ICovIDAsIDE5LCAxOSwgMTksIDAsCisgIC8qIDQyMjIgKi8gMTUsIDAsIDI5LCAwLAorICAvKiA0MjI2ICovIDAsIDEsIDI5LCAwLAorICAvKiA0MjMwICovIDAsIDUsIDQsIDE0LCAyLCA0LCAyOSwgMCwKKyAgLyogNDIzOCAqLyA1LCA1LCA0LCAxNCwgMiwgNCwgMjksIDAsCisgIC8qIDQyNDYgKi8gMTgsIDUsIDQsIDE1LCA0LCA0LCA0LCAyOSwgMCwKKyAgLyogNDI1NSAqLyAwLCA1LCA0LCAyOSwgMCwKKyAgLyogNDI2MCAqLyAyOCwgMzUsIDI4LCAzNSwgMjgsIDM1LCAyOCwgMzUsIDAsCisgIDI1NQorfTsKKworI2VuZGlmCisKKy8vIEFkZCBwYXJhbWV0ZXIgYXR0cmlidXRlcyB0aGF0IGFyZSBub3QgY29tbW9uIHRvIGFsbCBpbnRyaW5zaWNzLgorI2lmZGVmIEdFVF9JTlRSSU5TSUNfQVRUUklCVVRFUworQXR0cmlidXRlTGlzdCBJbnRyaW5zaWM6OmdldEF0dHJpYnV0ZXMoTExWTUNvbnRleHQgJkMsIElEIGlkKSB7CisgIHN0YXRpYyBjb25zdCB1aW50OF90IEludHJpbnNpY3NUb0F0dHJpYnV0ZXNNYXBbXSA9IHsKKyAgICAxLCAvLyBsbHZtLmFkZHJlc3NvZnJldHVybmFkZHJlc3MKKyAgICAyLCAvLyBsbHZtLmFkanVzdC50cmFtcG9saW5lCisgICAgMywgLy8gbGx2bS5hbm5vdGF0aW9uCisgICAgMywgLy8gbGx2bS5hc3N1bWUKKyAgICA0LCAvLyBsbHZtLmJpdHJldmVyc2UKKyAgICA0LCAvLyBsbHZtLmJzd2FwCisgICAgNCwgLy8gbGx2bS5jYW5vbmljYWxpemUKKyAgICA0LCAvLyBsbHZtLmNlaWwKKyAgICAzLCAvLyBsbHZtLmNsZWFyX2NhY2hlCisgICAgNSwgLy8gbGx2bS5jb2Rldmlldy5hbm5vdGF0aW9uCisgICAgMSwgLy8gbGx2bS5jb252ZXJ0LmZyb20uZnAxNgorICAgIDEsIC8vIGxsdm0uY29udmVydC50by5mcDE2CisgICAgNCwgLy8gbGx2bS5jb3B5c2lnbgorICAgIDMsIC8vIGxsdm0uY29yby5hbGxvYworICAgIDYsIC8vIGxsdm0uY29yby5iZWdpbgorICAgIDcsIC8vIGxsdm0uY29yby5kZXN0cm95CisgICAgOCwgLy8gbGx2bS5jb3JvLmRvbmUKKyAgICAzLCAvLyBsbHZtLmNvcm8uZW5kCisgICAgMSwgLy8gbGx2bS5jb3JvLmZyYW1lCisgICAgOSwgLy8gbGx2bS5jb3JvLmZyZWUKKyAgICAxMCwgLy8gbGx2bS5jb3JvLmlkCisgICAgMTEsIC8vIGxsdm0uY29yby5wYXJhbQorICAgIDEyLCAvLyBsbHZtLmNvcm8ucHJvbWlzZQorICAgIDcsIC8vIGxsdm0uY29yby5yZXN1bWUKKyAgICAzLCAvLyBsbHZtLmNvcm8uc2F2ZQorICAgIDEsIC8vIGxsdm0uY29yby5zaXplCisgICAgMTMsIC8vIGxsdm0uY29yby5zdWJmbi5hZGRyCisgICAgMywgLy8gbGx2bS5jb3JvLnN1c3BlbmQKKyAgICA0LCAvLyBsbHZtLmNvcworICAgIDQsIC8vIGxsdm0uY3RsegorICAgIDQsIC8vIGxsdm0uY3Rwb3AKKyAgICA0LCAvLyBsbHZtLmN0dHoKKyAgICA0LCAvLyBsbHZtLmRiZy5hZGRyCisgICAgNCwgLy8gbGx2bS5kYmcuZGVjbGFyZQorICAgIDQsIC8vIGxsdm0uZGJnLnZhbHVlCisgICAgMywgLy8gbGx2bS5kZWJ1Z3RyYXAKKyAgICAxLCAvLyBsbHZtLmRvbm90aGluZworICAgIDMsIC8vIGxsdm0uZWguZHdhcmYuY2ZhCisgICAgMSwgLy8gbGx2bS5laC5leGNlcHRpb25jb2RlCisgICAgMSwgLy8gbGx2bS5laC5leGNlcHRpb25wb2ludGVyCisgICAgMywgLy8gbGx2bS5laC5yZXR1cm4uaTMyCisgICAgMywgLy8gbGx2bS5laC5yZXR1cm4uaTY0CisgICAgMSwgLy8gbGx2bS5laC5zamxqLmNhbGxzaXRlCisgICAgMywgLy8gbGx2bS5laC5zamxqLmZ1bmN0aW9uY29udGV4dAorICAgIDE0LCAvLyBsbHZtLmVoLnNqbGoubG9uZ2ptcAorICAgIDEsIC8vIGxsdm0uZWguc2psai5sc2RhCisgICAgMywgLy8gbGx2bS5laC5zamxqLnNldGptcAorICAgIDMsIC8vIGxsdm0uZWguc2psai5zZXR1cC5kaXNwYXRjaAorICAgIDEsIC8vIGxsdm0uZWgudHlwZWlkLmZvcgorICAgIDMsIC8vIGxsdm0uZWgudW53aW5kLmluaXQKKyAgICA0LCAvLyBsbHZtLmV4cAorICAgIDQsIC8vIGxsdm0uZXhwMgorICAgIDEsIC8vIGxsdm0uZXhwZWN0CisgICAgMTUsIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmNvcworICAgIDE1LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5leHAKKyAgICAxNSwgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuZXhwMgorICAgIDE1LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5mYWRkCisgICAgMTUsIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmZkaXYKKyAgICAxNSwgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuZm1hCisgICAgMTUsIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmZtdWwKKyAgICAxNSwgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuZnJlbQorICAgIDE1LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5mc3ViCisgICAgMTUsIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmxvZworICAgIDE1LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5sb2cxMAorICAgIDE1LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5sb2cyCisgICAgMTUsIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLm5lYXJieWludAorICAgIDE1LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5wb3cKKyAgICAxNSwgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQucG93aQorICAgIDE1LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5yaW50CisgICAgMTUsIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLnNpbgorICAgIDE1LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5zcXJ0CisgICAgNywgLy8gbGx2bS5leHBlcmltZW50YWwuZGVvcHRpbWl6ZQorICAgIDE2LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5nYy5yZWxvY2F0ZQorICAgIDE2LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5nYy5yZXN1bHQKKyAgICA3LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5nYy5zdGF0ZXBvaW50CisgICAgNywgLy8gbGx2bS5leHBlcmltZW50YWwuZ3VhcmQKKyAgICA3LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5wYXRjaHBvaW50Lmk2NAorICAgIDcsIC8vIGxsdm0uZXhwZXJpbWVudGFsLnBhdGNocG9pbnQudm9pZAorICAgIDcsIC8vIGxsdm0uZXhwZXJpbWVudGFsLnN0YWNrbWFwCisgICAgMSwgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5hZGQKKyAgICAxLCAvLyBsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLmFuZAorICAgIDEsIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UuZmFkZAorICAgIDEsIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UuZm1heAorICAgIDEsIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UuZm1pbgorICAgIDEsIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UuZm11bAorICAgIDEsIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UubXVsCisgICAgMSwgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5vcgorICAgIDEsIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2Uuc21heAorICAgIDEsIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2Uuc21pbgorICAgIDEsIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UudW1heAorICAgIDEsIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UudW1pbgorICAgIDEsIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UueG9yCisgICAgNCwgLy8gbGx2bS5mYWJzCisgICAgNCwgLy8gbGx2bS5mbG9vcgorICAgIDMsIC8vIGxsdm0uZmx0LnJvdW5kcworICAgIDQsIC8vIGxsdm0uZm1hCisgICAgNCwgLy8gbGx2bS5mbXVsYWRkCisgICAgMSwgLy8gbGx2bS5mcmFtZWFkZHJlc3MKKyAgICAyLCAvLyBsbHZtLmdjcmVhZAorICAgIDMsIC8vIGxsdm0uZ2Nyb290CisgICAgMTcsIC8vIGxsdm0uZ2N3cml0ZQorICAgIDMsIC8vIGxsdm0uZ2V0LmR5bmFtaWMuYXJlYS5vZmZzZXQKKyAgICAzLCAvLyBsbHZtLmljYWxsLmJyYW5jaC5mdW5uZWwKKyAgICAxOCwgLy8gbGx2bS5pbml0LnRyYW1wb2xpbmUKKyAgICAzLCAvLyBsbHZtLmluc3RycHJvZi5pbmNyZW1lbnQKKyAgICAzLCAvLyBsbHZtLmluc3RycHJvZi5pbmNyZW1lbnQuc3RlcAorICAgIDMsIC8vIGxsdm0uaW5zdHJwcm9mLnZhbHVlLnByb2ZpbGUKKyAgICAxOSwgLy8gbGx2bS5pbnZhcmlhbnQuZW5kCisgICAgMiwgLy8gbGx2bS5pbnZhcmlhbnQuZ3JvdXAuYmFycmllcgorICAgIDIwLCAvLyBsbHZtLmludmFyaWFudC5zdGFydAorICAgIDIwLCAvLyBsbHZtLmxpZmV0aW1lLmVuZAorICAgIDIwLCAvLyBsbHZtLmxpZmV0aW1lLnN0YXJ0CisgICAgMiwgLy8gbGx2bS5sb2FkLnJlbGF0aXZlCisgICAgMSwgLy8gbGx2bS5sb2NhbGFkZHJlc3MKKyAgICAzLCAvLyBsbHZtLmxvY2FsZXNjYXBlCisgICAgMSwgLy8gbGx2bS5sb2NhbHJlY292ZXIKKyAgICA0LCAvLyBsbHZtLmxvZworICAgIDQsIC8vIGxsdm0ubG9nMTAKKyAgICA0LCAvLyBsbHZtLmxvZzIKKyAgICAxNCwgLy8gbGx2bS5sb25nam1wCisgICAgMjEsIC8vIGxsdm0ubWFza2VkLmNvbXByZXNzc3RvcmUKKyAgICAxNiwgLy8gbGx2bS5tYXNrZWQuZXhwYW5kbG9hZAorICAgIDE2LCAvLyBsbHZtLm1hc2tlZC5nYXRoZXIKKyAgICAyLCAvLyBsbHZtLm1hc2tlZC5sb2FkCisgICAgMywgLy8gbGx2bS5tYXNrZWQuc2NhdHRlcgorICAgIDIxLCAvLyBsbHZtLm1hc2tlZC5zdG9yZQorICAgIDQsIC8vIGxsdm0ubWF4bnVtCisgICAgMjIsIC8vIGxsdm0ubWVtY3B5CisgICAgMjIsIC8vIGxsdm0ubWVtY3B5LmVsZW1lbnQudW5vcmRlcmVkLmF0b21pYworICAgIDIzLCAvLyBsbHZtLm1lbW1vdmUKKyAgICAyMiwgLy8gbGx2bS5tZW1tb3ZlLmVsZW1lbnQudW5vcmRlcmVkLmF0b21pYworICAgIDI0LCAvLyBsbHZtLm1lbXNldAorICAgIDI0LCAvLyBsbHZtLm1lbXNldC5lbGVtZW50LnVub3JkZXJlZC5hdG9taWMKKyAgICA0LCAvLyBsbHZtLm1pbm51bQorICAgIDQsIC8vIGxsdm0ubmVhcmJ5aW50CisgICAgNCwgLy8gbGx2bS5vYmplY3RzaXplCisgICAgMywgLy8gbGx2bS5wY21hcmtlcgorICAgIDQsIC8vIGxsdm0ucG93CisgICAgNCwgLy8gbGx2bS5wb3dpCisgICAgMjUsIC8vIGxsdm0ucHJlZmV0Y2gKKyAgICAzLCAvLyBsbHZtLnB0ci5hbm5vdGF0aW9uCisgICAgMTYsIC8vIGxsdm0ucmVhZF9yZWdpc3RlcgorICAgIDMsIC8vIGxsdm0ucmVhZGN5Y2xlY291bnRlcgorICAgIDEsIC8vIGxsdm0ucmV0dXJuYWRkcmVzcworICAgIDQsIC8vIGxsdm0ucmludAorICAgIDQsIC8vIGxsdm0ucm91bmQKKyAgICA0LCAvLyBsbHZtLnNhZGQud2l0aC5vdmVyZmxvdworICAgIDMsIC8vIGxsdm0uc2V0am1wCisgICAgMTUsIC8vIGxsdm0uc2lkZWVmZmVjdAorICAgIDE0LCAvLyBsbHZtLnNpZ2xvbmdqbXAKKyAgICAzLCAvLyBsbHZtLnNpZ3NldGptcAorICAgIDQsIC8vIGxsdm0uc2luCisgICAgNCwgLy8gbGx2bS5zbXVsLndpdGgub3ZlcmZsb3cKKyAgICA0LCAvLyBsbHZtLnNxcnQKKyAgICAyNiwgLy8gbGx2bS5zc2EuY29weQorICAgIDQsIC8vIGxsdm0uc3N1Yi53aXRoLm92ZXJmbG93CisgICAgMywgLy8gbGx2bS5zdGFja2d1YXJkCisgICAgMywgLy8gbGx2bS5zdGFja3Byb3RlY3RvcgorICAgIDMsIC8vIGxsdm0uc3RhY2tyZXN0b3JlCisgICAgMywgLy8gbGx2bS5zdGFja3NhdmUKKyAgICAxLCAvLyBsbHZtLnRocmVhZC5wb2ludGVyCisgICAgMTQsIC8vIGxsdm0udHJhcAorICAgIDQsIC8vIGxsdm0udHJ1bmMKKyAgICAxLCAvLyBsbHZtLnR5cGUuY2hlY2tlZC5sb2FkCisgICAgMSwgLy8gbGx2bS50eXBlLnRlc3QKKyAgICA0LCAvLyBsbHZtLnVhZGQud2l0aC5vdmVyZmxvdworICAgIDQsIC8vIGxsdm0udW11bC53aXRoLm92ZXJmbG93CisgICAgNCwgLy8gbGx2bS51c3ViLndpdGgub3ZlcmZsb3cKKyAgICAzLCAvLyBsbHZtLnZhX2NvcHkKKyAgICAzLCAvLyBsbHZtLnZhX2VuZAorICAgIDMsIC8vIGxsdm0udmFfc3RhcnQKKyAgICAzLCAvLyBsbHZtLnZhci5hbm5vdGF0aW9uCisgICAgMywgLy8gbGx2bS53cml0ZV9yZWdpc3RlcgorICAgIDI3LCAvLyBsbHZtLnhyYXkuY3VzdG9tZXZlbnQKKyAgICAzLCAvLyBsbHZtLmFhcmNoNjQuY2xyZXgKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuY3JjMzJiCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0LmNyYzMyY2IKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuY3JjMzJjaAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5jcmMzMmN3CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0LmNyYzMyY3gKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuY3JjMzJoCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0LmNyYzMydworICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5jcmMzMngKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLmFlc2QKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLmFlc2UKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLmFlc2ltYworICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uYWVzbWMKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTFjCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0LmNyeXB0by5zaGExaAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uc2hhMW0KKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTFwCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0LmNyeXB0by5zaGExc3UwCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0LmNyeXB0by5zaGExc3UxCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0LmNyeXB0by5zaGEyNTZoCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0LmNyeXB0by5zaGEyNTZoMgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uc2hhMjU2c3UwCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0LmNyeXB0by5zaGEyNTZzdTEKKyAgICAzLCAvLyBsbHZtLmFhcmNoNjQuZG1iCisgICAgMywgLy8gbGx2bS5hYXJjaDY0LmRzYgorICAgIDMsIC8vIGxsdm0uYWFyY2g2NC5oaW50CisgICAgMywgLy8gbGx2bS5hYXJjaDY0LmlzYgorICAgIDMsIC8vIGxsdm0uYWFyY2g2NC5sZGF4cAorICAgIDMsIC8vIGxsdm0uYWFyY2g2NC5sZGF4cgorICAgIDMsIC8vIGxsdm0uYWFyY2g2NC5sZHhwCisgICAgMywgLy8gbGx2bS5hYXJjaDY0LmxkeHIKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5hYnMKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5hZGRobgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmFkZHAKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5jbHMKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mYWJkCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmFjZ2UKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mYWNndAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZhZGR2CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dGFzCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dGF1CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dG1zCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dG11CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dG5zCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dG51CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dHBzCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dHB1CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dHhuCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dHpzCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dHp1CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZm1heAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtYXhubQorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtYXhubXAKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbWF4bm12CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZm1heHAKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbWF4dgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtaW4KKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbWlubm0KKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbWlubm1wCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZm1pbm5tdgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtaW5wCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZm1pbnYKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbXVseAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZyZWNwZQorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZyZWNwcworICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZyZWNweAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZyaW50bgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZyc3FydGUKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mcnNxcnRzCisgICAgMiwgLy8gbGx2bS5hYXJjaDY0Lm5lb24ubGQxeDIKKyAgICAyLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5sZDF4MworICAgIDIsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmxkMXg0CisgICAgMiwgLy8gbGx2bS5hYXJjaDY0Lm5lb24ubGQyCisgICAgMiwgLy8gbGx2bS5hYXJjaDY0Lm5lb24ubGQybGFuZQorICAgIDIsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmxkMnIKKyAgICAyLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5sZDMKKyAgICAyLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5sZDNsYW5lCisgICAgMiwgLy8gbGx2bS5hYXJjaDY0Lm5lb24ubGQzcgorICAgIDIsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmxkNAorICAgIDIsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmxkNGxhbmUKKyAgICAyLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5sZDRyCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24ucG11bAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnBtdWxsCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24ucG11bGw2NAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnJhZGRobgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnJiaXQKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5yc2hybgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnJzdWJobgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNhYmQKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zYWRkbHAKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zYWRkbHYKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zYWRkdgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNjYWxhci5zcXh0bgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNjYWxhci5zcXh0dW4KKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zY2FsYXIudXF4dG4KKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zaGFkZAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNobGwKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zaHN1YgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNtYXgKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zbWF4cAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNtYXh2CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc21pbgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNtaW5wCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc21pbnYKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zbXVsbAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxYWJzCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3FhZGQKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcWRtdWxoCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3FkbXVsbAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxZG11bGxzLnNjYWxhcgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxbmVnCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3FyZG11bGgKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcXJzaGwKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcXJzaHJuCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3Fyc2hydW4KKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcXNobAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxc2hsdQorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxc2hybgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxc2hydW4KKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcXN1YgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxeHRuCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3F4dHVuCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3JoYWRkCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3JzaGwKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zc2hsCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3NobGwKKyAgICAxOSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3QxeDIKKyAgICAyOCwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3QxeDMKKyAgICAyOSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3QxeDQKKyAgICAxOSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3QyCisgICAgMjgsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnN0MmxhbmUKKyAgICAyOCwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3QzCisgICAgMjksIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnN0M2xhbmUKKyAgICAyOSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3Q0CisgICAgMzAsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnN0NGxhbmUKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zdWJobgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnN1cWFkZAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnRibDEKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi50YmwyCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udGJsMworICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnRibDQKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi50YngxCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udGJ4MgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnRieDMKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi50Yng0CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udWFiZAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVhZGRscAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVhZGRsdgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVhZGR2CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udWhhZGQKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi51aHN1YgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVtYXgKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi51bWF4cAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVtYXh2CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udW1pbgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVtaW5wCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udW1pbnYKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi51bXVsbAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVxYWRkCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXFyc2hsCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXFyc2hybgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVxc2hsCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXFzaHJuCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXFzdWIKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi51cXh0bgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVyZWNwZQorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVyaGFkZAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVyc2hsCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXJzcXJ0ZQorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVzaGwKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi51c2hsbAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVzcWFkZAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnZjb3B5LmxhbmUKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi52Y3Z0ZnAyZnhzCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udmN2dGZwMmZ4dQorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnZjdnRmcDJoZgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnZjdnRmeHMyZnAKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi52Y3Z0Znh1MmZwCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udmN2dGhmMmZwCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udnNsaQorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnZzcmkKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuc2RpdgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5zaXNkLmZhYmQKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuc2lzZC5mY3Z0eG4KKyAgICAzLCAvLyBsbHZtLmFhcmNoNjQuc3RseHAKKyAgICAzLCAvLyBsbHZtLmFhcmNoNjQuc3RseHIKKyAgICAzLCAvLyBsbHZtLmFhcmNoNjQuc3R4cAorICAgIDMsIC8vIGxsdm0uYWFyY2g2NC5zdHhyCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0LnVkaXYKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5hbGlnbmJpdAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmFsaWduYnl0ZQorICAgIDE4LCAvLyBsbHZtLmFtZGdjbi5hdG9taWMuZGVjCisgICAgMTgsIC8vIGxsdm0uYW1kZ2NuLmF0b21pYy5pbmMKKyAgICAzMSwgLy8gbGx2bS5hbWRnY24uYnJlYWsKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLmFkZAorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMuYW5kCisgICAgMywgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy5jbXBzd2FwCisgICAgMywgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy5vcgorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMuc21heAorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMuc21pbgorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMuc3ViCisgICAgMywgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy5zd2FwCisgICAgMywgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy51bWF4CisgICAgMywgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy51bWluCisgICAgMywgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy54b3IKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmxvYWQKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmxvYWQuZm9ybWF0CisgICAgMzIsIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5zdG9yZQorICAgIDMyLCAvLyBsbHZtLmFtZGdjbi5idWZmZXIuc3RvcmUuZm9ybWF0CisgICAgMywgLy8gbGx2bS5hbWRnY24uYnVmZmVyLndiaW52bDEKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5idWZmZXIud2JpbnZsMS5zYworICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci53YmludmwxLnZvbAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmNsYXNzCisgICAgNCwgLy8gbGx2bS5hbWRnY24uY29zCisgICAgNCwgLy8gbGx2bS5hbWRnY24uY3ViZWlkCisgICAgNCwgLy8gbGx2bS5hbWRnY24uY3ViZW1hCisgICAgNCwgLy8gbGx2bS5hbWRnY24uY3ViZXNjCisgICAgNCwgLy8gbGx2bS5hbWRnY24uY3ViZXRjCisgICAgNCwgLy8gbGx2bS5hbWRnY24uY3Z0LnBrLmkxNgorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmN2dC5way51MTYKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5jdnQucGsudTguZjMyCisgICAgNCwgLy8gbGx2bS5hbWRnY24uY3Z0LnBrbm9ybS5pMTYKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5jdnQucGtub3JtLnUxNgorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmN2dC5wa3J0egorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmRpc3BhdGNoLmlkCisgICAgNCwgLy8gbGx2bS5hbWRnY24uZGlzcGF0Y2gucHRyCisgICAgNCwgLy8gbGx2bS5hbWRnY24uZGl2LmZpeHVwCisgICAgNCwgLy8gbGx2bS5hbWRnY24uZGl2LmZtYXMKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5kaXYuc2NhbGUKKyAgICAzMSwgLy8gbGx2bS5hbWRnY24uZHMuYnBlcm11dGUKKyAgICAxOCwgLy8gbGx2bS5hbWRnY24uZHMuZmFkZAorICAgIDE4LCAvLyBsbHZtLmFtZGdjbi5kcy5mbWF4CisgICAgMTgsIC8vIGxsdm0uYW1kZ2NuLmRzLmZtaW4KKyAgICAzMSwgLy8gbGx2bS5hbWRnY24uZHMucGVybXV0ZQorICAgIDMxLCAvLyBsbHZtLmFtZGdjbi5kcy5zd2l6emxlCisgICAgMzMsIC8vIGxsdm0uYW1kZ2NuLmVsc2UKKyAgICAzMSwgLy8gbGx2bS5hbWRnY24uZWxzZS5icmVhaworICAgIDMzLCAvLyBsbHZtLmFtZGdjbi5lbmQuY2YKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5leHAKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5leHAuY29tcHIKKyAgICAzMSwgLy8gbGx2bS5hbWRnY24uZmNtcAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmZkaXYuZmFzdAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmZtZWQzCisgICAgNCwgLy8gbGx2bS5hbWRnY24uZm11bC5sZWdhY3kKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5mcmFjdAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmZyZXhwLmV4cAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmZyZXhwLm1hbnQKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5ncm91cHN0YXRpY3NpemUKKyAgICAzMSwgLy8gbGx2bS5hbWRnY24uaWNtcAorICAgIDMzLCAvLyBsbHZtLmFtZGdjbi5pZgorICAgIDMxLCAvLyBsbHZtLmFtZGdjbi5pZi5icmVhaworICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5hZGQKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuYW5kCisgICAgMywgLy8gbGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLmNtcHN3YXAKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuZGVjCisgICAgMywgLy8gbGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLmluYworICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5vcgorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5zbWF4CisgICAgMywgLy8gbGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLnNtaW4KKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuc3ViCisgICAgMywgLy8gbGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLnN3YXAKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMudW1heAorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy51bWluCisgICAgMywgLy8gbGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLnhvcgorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0CisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYgorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmIuY2wKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5iLmNsLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5iLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5iCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5iLmNsCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5iLmNsLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmIubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMuY2wKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmNsLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmwKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmwubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMubHoKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmx6Lm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jbAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmNsLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5sCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQubC5vCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQubHoKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5sei5vCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQubworICAgIDEsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdldGxvZAorICAgIDEsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdldHJlc2luZm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UubG9hZAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5sb2FkLm1pcAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmIKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmIuY2wKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmIuY2wubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYi5vCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmIKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuYi5jbAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5iLmNsLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuYi5vCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmNkCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmNkLmNsCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmNkLmNsLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuY2QubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5jbAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5jbC5vCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmQKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuZC5jbAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5kLmNsLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuZC5vCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmwKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMubC5vCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmx6CisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmx6Lm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuY2QKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmNkLmNsCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jZC5jbC5vCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jZC5vCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jbAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuY2wubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuZAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuZC5jbAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuZC5jbC5vCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5kLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmwKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmwubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUubHoKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmx6Lm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLm8KKyAgICAzMiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc3RvcmUKKyAgICAzMiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc3RvcmUubWlwCisgICAgNCwgLy8gbGx2bS5hbWRnY24uaW1wbGljaXQuYnVmZmVyLnB0cgorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmltcGxpY2l0YXJnLnB0cgorICAgIDMzLCAvLyBsbHZtLmFtZGdjbi5pbml0LmV4ZWMKKyAgICAzMywgLy8gbGx2bS5hbWRnY24uaW5pdC5leGVjLmZyb20uaW5wdXQKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5pbnRlcnAubW92CisgICAgNCwgLy8gbGx2bS5hbWRnY24uaW50ZXJwLnAxCisgICAgNCwgLy8gbGx2bS5hbWRnY24uaW50ZXJwLnAyCisgICAgNCwgLy8gbGx2bS5hbWRnY24ua2VybmFyZy5zZWdtZW50LnB0cgorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmtpbGwKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5sZGV4cAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmxlcnAKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5sb2cuY2xhbXAKKyAgICAzMywgLy8gbGx2bS5hbWRnY24ubG9vcAorICAgIDEsIC8vIGxsdm0uYW1kZ2NuLm1iY250LmhpCisgICAgMSwgLy8gbGx2bS5hbWRnY24ubWJjbnQubG8KKyAgICAzMSwgLy8gbGx2bS5hbWRnY24ubW92LmRwcAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLm1xc2FkLnBrLnUxNi51OAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLm1xc2FkLnUzMi51OAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLm1zYWQudTgKKyAgICAxLCAvLyBsbHZtLmFtZGdjbi5wcy5saXZlCisgICAgNCwgLy8gbGx2bS5hbWRnY24ucXNhZC5way51MTYudTgKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5xdWV1ZS5wdHIKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5yY3AKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5yY3AubGVnYWN5CisgICAgMzEsIC8vIGxsdm0uYW1kZ2NuLnJlYWRmaXJzdGxhbmUKKyAgICAzMSwgLy8gbGx2bS5hbWRnY24ucmVhZGxhbmUKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5yc3EKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5yc3EuY2xhbXAKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5yc3EubGVnYWN5CisgICAgMzMsIC8vIGxsdm0uYW1kZ2NuLnMuYmFycmllcgorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLnMuZGNhY2hlLmludgorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLnMuZGNhY2hlLmludi52b2wKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5zLmRjYWNoZS53YgorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLnMuZGNhY2hlLndiLnZvbAorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLnMuZGVjcGVyZmxldmVsCisgICAgNCwgLy8gbGx2bS5hbWRnY24ucy5nZXRwYworICAgIDM0LCAvLyBsbHZtLmFtZGdjbi5zLmdldHJlZworICAgIDMsIC8vIGxsdm0uYW1kZ2NuLnMuaW5jcGVyZmxldmVsCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLnMubWVtcmVhbHRpbWUKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24ucy5tZW10aW1lCisgICAgMywgLy8gbGx2bS5hbWRnY24ucy5zZW5kbXNnCisgICAgMywgLy8gbGx2bS5hbWRnY24ucy5zZW5kbXNnaGFsdAorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLnMuc2xlZXAKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5zLndhaXRjbnQKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5zYWQuaGkudTgKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5zYWQudTE2CisgICAgNCwgLy8gbGx2bS5hbWRnY24uc2FkLnU4CisgICAgNCwgLy8gbGx2bS5hbWRnY24uc2JmZQorICAgIDMxLCAvLyBsbHZtLmFtZGdjbi5zZXQuaW5hY3RpdmUKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5zZmZiaAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLnNpbgorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi50YnVmZmVyLmxvYWQKKyAgICAzMiwgLy8gbGx2bS5hbWRnY24udGJ1ZmZlci5zdG9yZQorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLnRyaWcucHJlb3AKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi51YmZlCisgICAgMzMsIC8vIGxsdm0uYW1kZ2NuLnVucmVhY2hhYmxlCisgICAgMzEsIC8vIGxsdm0uYW1kZ2NuLnVwZGF0ZS5kcHAKKyAgICAzMywgLy8gbGx2bS5hbWRnY24ud2F2ZS5iYXJyaWVyCisgICAgNCwgLy8gbGx2bS5hbWRnY24ud29ya2dyb3VwLmlkLngKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi53b3JrZ3JvdXAuaWQueQorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLndvcmtncm91cC5pZC56CisgICAgNCwgLy8gbGx2bS5hbWRnY24ud29ya2l0ZW0uaWQueAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLndvcmtpdGVtLmlkLnkKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi53b3JraXRlbS5pZC56CisgICAgNCwgLy8gbGx2bS5hbWRnY24ud3FtCisgICAgMzEsIC8vIGxsdm0uYW1kZ2NuLndxbS52b3RlCisgICAgMzEsIC8vIGxsdm0uYW1kZ2NuLndyaXRlbGFuZQorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLnd3bQorICAgIDMsIC8vIGxsdm0uYXJtLmNkcAorICAgIDMsIC8vIGxsdm0uYXJtLmNkcDIKKyAgICAzLCAvLyBsbHZtLmFybS5jbHJleAorICAgIDEsIC8vIGxsdm0uYXJtLmNyYzMyYgorICAgIDEsIC8vIGxsdm0uYXJtLmNyYzMyY2IKKyAgICAxLCAvLyBsbHZtLmFybS5jcmMzMmNoCisgICAgMSwgLy8gbGx2bS5hcm0uY3JjMzJjdworICAgIDEsIC8vIGxsdm0uYXJtLmNyYzMyaAorICAgIDEsIC8vIGxsdm0uYXJtLmNyYzMydworICAgIDMsIC8vIGxsdm0uYXJtLmRiZworICAgIDMsIC8vIGxsdm0uYXJtLmRtYgorICAgIDMsIC8vIGxsdm0uYXJtLmRzYgorICAgIDMsIC8vIGxsdm0uYXJtLmdldC5mcHNjcgorICAgIDMsIC8vIGxsdm0uYXJtLmhpbnQKKyAgICAzLCAvLyBsbHZtLmFybS5pc2IKKyAgICAzLCAvLyBsbHZtLmFybS5sZGFleAorICAgIDMsIC8vIGxsdm0uYXJtLmxkYWV4ZAorICAgIDMsIC8vIGxsdm0uYXJtLmxkYworICAgIDMsIC8vIGxsdm0uYXJtLmxkYzIKKyAgICAzLCAvLyBsbHZtLmFybS5sZGMybAorICAgIDMsIC8vIGxsdm0uYXJtLmxkY2wKKyAgICAzLCAvLyBsbHZtLmFybS5sZHJleAorICAgIDMsIC8vIGxsdm0uYXJtLmxkcmV4ZAorICAgIDMsIC8vIGxsdm0uYXJtLm1jcgorICAgIDMsIC8vIGxsdm0uYXJtLm1jcjIKKyAgICAzLCAvLyBsbHZtLmFybS5tY3JyCisgICAgMywgLy8gbGx2bS5hcm0ubWNycjIKKyAgICAzLCAvLyBsbHZtLmFybS5tcmMKKyAgICAzLCAvLyBsbHZtLmFybS5tcmMyCisgICAgMywgLy8gbGx2bS5hcm0ubXJyYworICAgIDMsIC8vIGxsdm0uYXJtLm1ycmMyCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi5hZXNkCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi5hZXNlCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi5hZXNpbWMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLmFlc21jCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi5zaGExYworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24uc2hhMWgKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnNoYTFtCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi5zaGExcAorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24uc2hhMXN1MAorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24uc2hhMXN1MQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24uc2hhMjU2aAorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24uc2hhMjU2aDIKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnNoYTI1NnN1MAorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24uc2hhMjU2c3UxCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52YWJkcworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmFiZHUKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZhYnMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZhY2dlCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52YWNndAorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmJzbAorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmNscworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmN2dGFzCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0YXUKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZjdnRmcDJmeHMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZjdnRmcDJmeHUKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZjdnRmcDJoZgorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmN2dGZ4czJmcAorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmN2dGZ4dTJmcAorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmN2dGhmMmZwCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0bXMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZjdnRtdQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmN2dG5zCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0bnUKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZjdnRwcworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmN2dHB1CisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52aGFkZHMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZoYWRkdQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmhzdWJzCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52aHN1YnUKKyAgICAyLCAvLyBsbHZtLmFybS5uZW9uLnZsZDEKKyAgICAyLCAvLyBsbHZtLmFybS5uZW9uLnZsZDIKKyAgICAyLCAvLyBsbHZtLmFybS5uZW9uLnZsZDJsYW5lCisgICAgMiwgLy8gbGx2bS5hcm0ubmVvbi52bGQzCisgICAgMiwgLy8gbGx2bS5hcm0ubmVvbi52bGQzbGFuZQorICAgIDIsIC8vIGxsdm0uYXJtLm5lb24udmxkNAorICAgIDIsIC8vIGxsdm0uYXJtLm5lb24udmxkNGxhbmUKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZtYXhubQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udm1heHMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZtYXh1CisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52bWlubm0KKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZtaW5zCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52bWludQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udm11bGxwCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52bXVsbHMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZtdWxsdQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udm11bHAKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZwYWRhbHMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZwYWRhbHUKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZwYWRkCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cGFkZGxzCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cGFkZGx1CisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cG1heHMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZwbWF4dQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnBtaW5zCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cG1pbnUKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZxYWJzCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cWFkZHMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZxYWRkdQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFkbXVsaAorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFkbXVsbAorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFtb3ZucworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFtb3Zuc3UKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZxbW92bnUKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZxbmVnCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cXJkbXVsaAorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFyc2hpZnRucworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFyc2hpZnRuc3UKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZxcnNoaWZ0bnUKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZxcnNoaWZ0cworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFyc2hpZnR1CisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cXNoaWZ0bnMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZxc2hpZnRuc3UKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZxc2hpZnRudQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFzaGlmdHMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZxc2hpZnRzdQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFzaGlmdHUKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZxc3VicworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFzdWJ1CisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cmFkZGhuCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cmVjcGUKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZyZWNwcworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnJoYWRkcworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnJoYWRkdQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnJpbnRhCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cmludG0KKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZyaW50bgorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnJpbnRwCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cmludHgKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZyaW50egorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnJzaGlmdG4KKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZyc2hpZnRzCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cnNoaWZ0dQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnJzcXJ0ZQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnJzcXJ0cworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnJzdWJobgorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnNoaWZ0aW5zCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52c2hpZnRzCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52c2hpZnR1CisgICAgMjEsIC8vIGxsdm0uYXJtLm5lb24udnN0MQorICAgIDIxLCAvLyBsbHZtLmFybS5uZW9uLnZzdDIKKyAgICAyMSwgLy8gbGx2bS5hcm0ubmVvbi52c3QybGFuZQorICAgIDIxLCAvLyBsbHZtLmFybS5uZW9uLnZzdDMKKyAgICAyMSwgLy8gbGx2bS5hcm0ubmVvbi52c3QzbGFuZQorICAgIDIxLCAvLyBsbHZtLmFybS5uZW9uLnZzdDQKKyAgICAyMSwgLy8gbGx2bS5hcm0ubmVvbi52c3Q0bGFuZQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnRibDEKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZ0YmwyCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52dGJsMworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnRibDQKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZ0YngxCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52dGJ4MgorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnRieDMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZ0Yng0CisgICAgMSwgLy8gbGx2bS5hcm0ucWFkZAorICAgIDEsIC8vIGxsdm0uYXJtLnFhZGQxNgorICAgIDEsIC8vIGxsdm0uYXJtLnFhZGQ4CisgICAgMSwgLy8gbGx2bS5hcm0ucWFzeAorICAgIDEsIC8vIGxsdm0uYXJtLnFzYXgKKyAgICAxLCAvLyBsbHZtLmFybS5xc3ViCisgICAgMSwgLy8gbGx2bS5hcm0ucXN1YjE2CisgICAgMSwgLy8gbGx2bS5hcm0ucXN1YjgKKyAgICAzLCAvLyBsbHZtLmFybS5zYWRkMTYKKyAgICAzLCAvLyBsbHZtLmFybS5zYWRkOAorICAgIDMsIC8vIGxsdm0uYXJtLnNhc3gKKyAgICAxNiwgLy8gbGx2bS5hcm0uc2VsCisgICAgMywgLy8gbGx2bS5hcm0uc2V0LmZwc2NyCisgICAgMSwgLy8gbGx2bS5hcm0uc2hhZGQxNgorICAgIDEsIC8vIGxsdm0uYXJtLnNoYWRkOAorICAgIDEsIC8vIGxsdm0uYXJtLnNoYXN4CisgICAgMSwgLy8gbGx2bS5hcm0uc2hzYXgKKyAgICAxLCAvLyBsbHZtLmFybS5zaHN1YjE2CisgICAgMSwgLy8gbGx2bS5hcm0uc2hzdWI4CisgICAgMSwgLy8gbGx2bS5hcm0uc21sYWJiCisgICAgMSwgLy8gbGx2bS5hcm0uc21sYWJ0CisgICAgMSwgLy8gbGx2bS5hcm0uc21sYWQKKyAgICAxLCAvLyBsbHZtLmFybS5zbWxhZHgKKyAgICAxLCAvLyBsbHZtLmFybS5zbWxhbGQKKyAgICAxLCAvLyBsbHZtLmFybS5zbWxhbGR4CisgICAgMSwgLy8gbGx2bS5hcm0uc21sYXRiCisgICAgMSwgLy8gbGx2bS5hcm0uc21sYXR0CisgICAgMSwgLy8gbGx2bS5hcm0uc21sYXdiCisgICAgMSwgLy8gbGx2bS5hcm0uc21sYXd0CisgICAgMSwgLy8gbGx2bS5hcm0uc21sc2QKKyAgICAxLCAvLyBsbHZtLmFybS5zbWxzZHgKKyAgICAxLCAvLyBsbHZtLmFybS5zbWxzbGQKKyAgICAxLCAvLyBsbHZtLmFybS5zbWxzbGR4CisgICAgMSwgLy8gbGx2bS5hcm0uc211YWQKKyAgICAxLCAvLyBsbHZtLmFybS5zbXVhZHgKKyAgICAxLCAvLyBsbHZtLmFybS5zbXVsYmIKKyAgICAxLCAvLyBsbHZtLmFybS5zbXVsYnQKKyAgICAxLCAvLyBsbHZtLmFybS5zbXVsdGIKKyAgICAxLCAvLyBsbHZtLmFybS5zbXVsdHQKKyAgICAxLCAvLyBsbHZtLmFybS5zbXVsd2IKKyAgICAxLCAvLyBsbHZtLmFybS5zbXVsd3QKKyAgICAxLCAvLyBsbHZtLmFybS5zbXVzZAorICAgIDEsIC8vIGxsdm0uYXJtLnNtdXNkeAorICAgIDMsIC8vIGxsdm0uYXJtLnNwYWNlCisgICAgMSwgLy8gbGx2bS5hcm0uc3NhdAorICAgIDEsIC8vIGxsdm0uYXJtLnNzYXQxNgorICAgIDMsIC8vIGxsdm0uYXJtLnNzYXgKKyAgICAzLCAvLyBsbHZtLmFybS5zc3ViMTYKKyAgICAzLCAvLyBsbHZtLmFybS5zc3ViOAorICAgIDMsIC8vIGxsdm0uYXJtLnN0YworICAgIDMsIC8vIGxsdm0uYXJtLnN0YzIKKyAgICAzLCAvLyBsbHZtLmFybS5zdGMybAorICAgIDMsIC8vIGxsdm0uYXJtLnN0Y2wKKyAgICAzLCAvLyBsbHZtLmFybS5zdGxleAorICAgIDMsIC8vIGxsdm0uYXJtLnN0bGV4ZAorICAgIDMsIC8vIGxsdm0uYXJtLnN0cmV4CisgICAgMywgLy8gbGx2bS5hcm0uc3RyZXhkCisgICAgMSwgLy8gbGx2bS5hcm0uc3h0YWIxNgorICAgIDEsIC8vIGxsdm0uYXJtLnN4dGIxNgorICAgIDMsIC8vIGxsdm0uYXJtLnVhZGQxNgorICAgIDMsIC8vIGxsdm0uYXJtLnVhZGQ4CisgICAgMywgLy8gbGx2bS5hcm0udWFzeAorICAgIDEsIC8vIGxsdm0uYXJtLnVoYWRkMTYKKyAgICAxLCAvLyBsbHZtLmFybS51aGFkZDgKKyAgICAxLCAvLyBsbHZtLmFybS51aGFzeAorICAgIDEsIC8vIGxsdm0uYXJtLnVoc2F4CisgICAgMSwgLy8gbGx2bS5hcm0udWhzdWIxNgorICAgIDEsIC8vIGxsdm0uYXJtLnVoc3ViOAorICAgIDMsIC8vIGxsdm0uYXJtLnVuZGVmaW5lZAorICAgIDEsIC8vIGxsdm0uYXJtLnVxYWRkMTYKKyAgICAxLCAvLyBsbHZtLmFybS51cWFkZDgKKyAgICAxLCAvLyBsbHZtLmFybS51cWFzeAorICAgIDEsIC8vIGxsdm0uYXJtLnVxc2F4CisgICAgMSwgLy8gbGx2bS5hcm0udXFzdWIxNgorICAgIDEsIC8vIGxsdm0uYXJtLnVxc3ViOAorICAgIDEsIC8vIGxsdm0uYXJtLnVzYWQ4CisgICAgMSwgLy8gbGx2bS5hcm0udXNhZGE4CisgICAgMSwgLy8gbGx2bS5hcm0udXNhdAorICAgIDEsIC8vIGxsdm0uYXJtLnVzYXQxNgorICAgIDMsIC8vIGxsdm0uYXJtLnVzYXgKKyAgICAzLCAvLyBsbHZtLmFybS51c3ViMTYKKyAgICAzLCAvLyBsbHZtLmFybS51c3ViOAorICAgIDEsIC8vIGxsdm0uYXJtLnV4dGFiMTYKKyAgICAxLCAvLyBsbHZtLmFybS51eHRiMTYKKyAgICAxLCAvLyBsbHZtLmFybS52Y3Z0cgorICAgIDEsIC8vIGxsdm0uYXJtLnZjdnRydQorICAgIDE2LCAvLyBsbHZtLmJwZi5sb2FkLmJ5dGUKKyAgICAxNiwgLy8gbGx2bS5icGYubG9hZC5oYWxmCisgICAgMTYsIC8vIGxsdm0uYnBmLmxvYWQud29yZAorICAgIDMsIC8vIGxsdm0uYnBmLnBzZXVkbworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5hYnMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuYWJzcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5hYnNzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuYWRkCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LmhoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LmhsCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LmxoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LmxsCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LnNhdC5oaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRoLmgxNi5zYXQuaGwKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuYWRkaC5oMTYuc2F0LmxoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LnNhdC5sbAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRoLmwxNi5obAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRoLmwxNi5sbAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRoLmwxNi5zYXQuaGwKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuYWRkaC5sMTYuc2F0LmxsCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuYWRkcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRwc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZHNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRzcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuYW5kaXIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuYW5kcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5hc2xoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFzcmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuY29tYmluZS5oaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5jb21iaW5lLmhsCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmNvbWJpbmUubGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuY29tYmluZS5sbAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5jb21iaW5laWkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuY29tYmluZXcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIubWF4CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLm1heHAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIubWF4dQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5tYXh1cAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5taW4KKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIubWlucAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5taW51CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLm1pbnVwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLm5lZworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5uZWdwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLm5lZ3NhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5ub3QKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIubm90cAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5vcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5vcmlyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLm9ycAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5yb3VuZHNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc2F0YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zYXRoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnNhdHViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnNhdHVoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5oaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5obAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5saAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5sbAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5zYXQuaGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc3ViaC5oMTYuc2F0LmhsCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YmguaDE2LnNhdC5saAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5zYXQubGwKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc3ViaC5sMTYuaGwKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc3ViaC5sMTYubGwKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc3ViaC5sMTYuc2F0LmhsCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YmgubDE2LnNhdC5sbAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YnJpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YnNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdmFkZGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc3ZhZGRocworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdmFkZHVocworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdmF2Z2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc3ZhdmdocworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdm5hdmdoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN2c3ViaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdnN1YmhzCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN2c3VidWhzCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN3aXoKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc3h0YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zeHRoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN4dHcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudGZyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnRmcmloCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnRmcmlsCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnRmcnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudGZycGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudGZyc2kKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmFic2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmFic2hzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmFic3cKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmFic3dzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmFkZGIubWFwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZhZGRoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZhZGRocworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YWRkdWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmFkZHVicworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YWRkdWhzCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZhZGR3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZhZGR3cworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YXZnaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YXZnaGNyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZhdmdocgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YXZndWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmF2Z3VicgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YXZndWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmF2Z3VocgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YXZndXcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmF2Z3V3cgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YXZndworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YXZnd2NyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZhdmd3cgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52Y21wYmVxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZjbXBiZ3R1CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZjbXBoZXEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmNtcGhndAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52Y21waGd0dQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52Y21wd2VxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZjbXB3Z3QKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmNtcHdndHUKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmNvbmoKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudm1heGIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudm1heGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudm1heHViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZtYXh1aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52bWF4dXcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudm1heHcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudm1pbmIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudm1pbmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudm1pbnViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZtaW51aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52bWludXcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudm1pbncKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudm5hdmdoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZuYXZnaGNyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZuYXZnaHIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudm5hdmd3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZuYXZnd2NyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZuYXZnd3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudnJhZGR1YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52cmFkZHViLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52cnNhZHViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZyc2FkdWIuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZzdWJiLm1hcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52c3ViaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52c3ViaHMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudnN1YnViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZzdWJ1YnMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudnN1YnVocworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52c3VidworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52c3Vid3MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIueG9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnhvcnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuenh0YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi56eHRoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LmFuZG4KKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQuYW5kbnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQuYml0c3BsaXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQuYml0c3BsaXRpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LmJvdW5kc2NoZWNrCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LmNtcGJlcQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5jbXBiZXFpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LmNtcGJndAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5jbXBiZ3RpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LmNtcGJndHUKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQuY21wYmd0dWkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQuY21waGVxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LmNtcGhlcWkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQuY21waGd0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LmNtcGhndGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQuY21waGd0dQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5jbXBoZ3R1aQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5jb21iaW5laXIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQuY29tYmluZXJpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LmNyb3VuZC5yaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5jcm91bmQucnIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQubW9kd3JhcHUKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQub3JuCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0Lm9ybnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQucmNtcGVxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnJjbXBlcWkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQucmNtcG5lcQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5yY21wbmVxaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5yb3VuZC5yaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5yb3VuZC5yaS5zYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQucm91bmQucnIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQucm91bmQucnIuc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnRsYm1hdGNoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnZjbXBiZXEuYW55CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnZjbXBiZXFpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnZjbXBiZ3QKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQudmNtcGJndGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQudmNtcGJndHVpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnZjbXBoZXFpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnZjbXBoZ3RpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnZjbXBoZ3R1aQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC52Y21wd2VxaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC52Y21wd2d0aQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC52Y21wd2d0dWkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQudnJtYXhoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnZybWF4dWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQudnJtYXh1dworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC52cm1heHcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQudnJtaW5oCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnZybWludWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQudnJtaW51dworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC52cm1pbncKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTUudmFkZGh1YnMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTYudmNtcGJlcS5ub3RhbnkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTYudmNtcGJlcS5ub3RhbnkuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5hbGw4CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5hbmRuCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLmFueTgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIuYml0c2NscgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5iaXRzY2xyaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5iaXRzc2V0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGVxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGVxaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5jbXBlcXAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIuY21wZ2VpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGdldWkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIuY21wZ3QKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIuY21wZ3RpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGd0cAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5jbXBndHUKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIuY21wZ3R1aQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5jbXBndHVwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGx0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGx0dQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5tYXNrCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLm11eAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5tdXhpaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5tdXhpcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5tdXhyaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5ub3QKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIub3JuCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLnB4ZmVyLm1hcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi50ZnJwcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi50ZnJycAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi52aXRwYWNrCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLnZtdXgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIueG9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkM0LmFuZC5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzQuYW5kLmFuZG4KKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzQuYW5kLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkM0LmFuZC5vcm4KKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzQuY21wbHRlCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkM0LmNtcGx0ZWkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzQuY21wbHRldQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DNC5jbXBsdGV1aQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DNC5jbXBuZXEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzQuY21wbmVxaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DNC5mYXN0Y29ybmVyOQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DNC5mYXN0Y29ybmVyOS5ub3QKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzQubmJpdHNjbHIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzQubmJpdHNjbHJpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkM0Lm5iaXRzc2V0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkM0Lm9yLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DNC5vci5hbmRuCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkM0Lm9yLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkM0Lm9yLm9ybgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LmQyZGYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uRjIuY29udi5kMnNmCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYyZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LmRmMmQuY2hvcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LmRmMnNmCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYydWQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uRjIuY29udi5kZjJ1ZC5jaG9wCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYydXcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uRjIuY29udi5kZjJ1dy5jaG9wCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYydworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LmRmMncuY2hvcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnNmMmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uRjIuY29udi5zZjJkLmNob3AKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uRjIuY29udi5zZjJkZgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnNmMnVkCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuc2YydWQuY2hvcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnNmMnV3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuc2YydXcuY2hvcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnNmMncKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uRjIuY29udi5zZjJ3LmNob3AKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uRjIuY29udi51ZDJkZgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnVkMnNmCisgICAgMzUsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnV3MmRmCisgICAgMzUsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnV3MnNmCisgICAgMzUsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LncyZGYKKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYudzJzZgorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuZGZjbGFzcworICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuZGZjbXBlcQorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuZGZjbXBnZQorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuZGZjbXBndAorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuZGZjbXB1bworICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuZGZpbW0ubgorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuZGZpbW0ucAorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuc2ZhZGQKKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLnNmY2xhc3MKKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLnNmY21wZXEKKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLnNmY21wZ2UKKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLnNmY21wZ3QKKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLnNmY21wdW8KKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLnNmZml4dXBkCisgICAgMzUsIC8vIGxsdm0uaGV4YWdvbi5GMi5zZmZpeHVwbgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5GMi5zZmZpeHVwcgorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuc2ZmbWEKKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLnNmZm1hLmxpYgorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuc2ZmbWEuc2MKKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLnNmZm1zCisgICAgMzUsIC8vIGxsdm0uaGV4YWdvbi5GMi5zZmZtcy5saWIKKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLnNmaW1tLm4KKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLnNmaW1tLnAKKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLnNmbWF4CisgICAgMzUsIC8vIGxsdm0uaGV4YWdvbi5GMi5zZm1pbgorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuc2ZtcHkKKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLnNmc3ViCisgICAgMTYsIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmIucGJyCisgICAgMjgsIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmIucGNpCisgICAgMTksIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmIucGNyCisgICAgMTYsIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmQucGJyCisgICAgMjgsIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmQucGNpCisgICAgMTksIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmQucGNyCisgICAgMTYsIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmgucGJyCisgICAgMjgsIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmgucGNpCisgICAgMTksIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmgucGNyCisgICAgMTYsIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmkucGJyCisgICAgMjgsIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmkucGNpCisgICAgMTksIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcmkucGNyCisgICAgMTYsIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcnViLnBicgorICAgIDI4LCAvLyBsbHZtLmhleGFnb24uTDIubG9hZHJ1Yi5wY2kKKyAgICAxOSwgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRydWIucGNyCisgICAgMTYsIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcnVoLnBicgorICAgIDI4LCAvLyBsbHZtLmhleGFnb24uTDIubG9hZHJ1aC5wY2kKKyAgICAxOSwgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRydWgucGNyCisgICAgMTgsIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2Fkdy5sb2NrZWQKKyAgICAxOCwgLy8gbGx2bS5oZXhhZ29uLkw0LmxvYWRkLmxvY2tlZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5hY2NpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmFjY2lpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmNtYWNpLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmNtYWNyLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmNtYWNzLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmNtYWNzLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmNtYWNzYy5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5jbWFjc2MuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuY21weWkuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuY21weXIuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuY21weXJzLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmNtcHlycy5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5jbXB5cnNjLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmNtcHlyc2MuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuY21weXMuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuY21weXMuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuY21weXNjLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmNtcHlzYy5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5jbmFjcy5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5jbmFjcy5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5jbmFjc2MuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuY25hY3NjLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmRwbXB5c3MuYWNjLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmRwbXB5c3MubmFjLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmRwbXB5c3Mucm5kLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmRwbXB5c3MuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuZHBtcHl1dS5hY2MuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuZHBtcHl1dS5uYWMuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuZHBtcHl1dS5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5obW1weWgucnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmhtbXB5aC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5obW1weWwucnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmhtbXB5bC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tYWNpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1hY3NpbgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tYWNzaXAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1hY2hzLnJzMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjaHMucnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWNocy5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjaHMuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1hY2xzLnJzMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjbHMucnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWNscy5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjbHMuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1hY3Vocy5yczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1hY3Vocy5yczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1hY3Vocy5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjdWhzLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWN1bHMucnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWN1bHMucnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWN1bHMuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1hY3Vscy5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5aC5yczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1weWgucnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHloLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHloLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHlsLnJzMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5bC5yczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1weWwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1weWwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1weXVoLnJzMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5dWgucnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHl1aC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5dWguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1weXVsLnJzMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5dWwucnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHl1bC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5dWwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5oaC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLmhoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2MuaGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5obC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLmxoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2MubGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5sbC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLmxsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmhoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmhoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmhsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmhsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmxoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmxoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmxsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmxsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5oaC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuaGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmhsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5obC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmxoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5sbC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5oaC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLmhoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuaGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5obC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLmxoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMubGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5sbC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLmxsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmhoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmhoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmhsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmhsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmxoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmxoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmxsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmxsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5ybmQuaGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnJuZC5oaC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmhsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5ybmQuaGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnJuZC5saC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmxoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5ybmQubGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnJuZC5sbC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmhoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQuaGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5obC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmhsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQubGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5saC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmxsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQubGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQuaGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQuaGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQuaGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQuaGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQubGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQubGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQubGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQubGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnVwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS51cC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkudXAuczEuc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmhoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmhoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmhsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmhsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmxoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmxoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmxsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmxsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuaGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5oaC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLmhsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuaGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5saC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLmxoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5sbC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5oaC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5oaC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5obC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5obC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5saC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5saC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5sbC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5sbC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5oaC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5oaC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5obC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5obC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5saC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5saC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5sbC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5sbC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXNtaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlzdS51cAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5oaC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5oaC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5obC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5obC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5saC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5saC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5sbC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5sbC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmhoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuaGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5obC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmhsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUubGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5saC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmxsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUubGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5uYWMuaGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5uYWMuaGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5uYWMuaGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5uYWMuaGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5uYWMubGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5uYWMubGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5uYWMubGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5uYWMubGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dS51cAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5hY2MuaGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQuYWNjLmhoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmFjYy5obC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5hY2MuaGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQuYWNjLmxoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmFjYy5saC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5hY2MubGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQuYWNjLmxsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmhoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmhoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmhsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmhsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmxoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmxoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmxsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmxsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLm5hYy5oaC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5uYWMuaGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQubmFjLmhsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLm5hYy5obC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5uYWMubGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQubmFjLmxoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLm5hYy5sbC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5uYWMubGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubmFjY2kKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubmFjY2lpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnN1YmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52YWJzZGlmZmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudmFic2RpZmZ3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZjbWFjLnMwLnNhdC5pCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZjbWFjLnMwLnNhdC5yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZjbXB5LnMwLnNhdC5pCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZjbXB5LnMwLnNhdC5yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZjbXB5LnMxLnNhdC5pCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZjbXB5LnMxLnNhdC5yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZkbWFjcy5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52ZG1hY3MuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudmRtcHlycy5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52ZG1weXJzLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZkbXB5cy5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52ZG1weXMuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudm1hYzIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudm1hYzJlcworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52bWFjMmVzLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZtYWMyZXMuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudm1hYzJzLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZtYWMycy5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52bWFjMnN1LnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZtYWMyc3UuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudm1weTJlcy5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52bXB5MmVzLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZtcHkycy5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52bXB5MnMuczBwYWNrCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZtcHkycy5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52bXB5MnMuczFwYWNrCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZtcHkyc3UuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudm1weTJzdS5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52cmFkZGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudnJhZGR1aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52cmNtYWNpLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZyY21hY2kuczBjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZyY21hY3IuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudnJjbWFjci5zMGMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudnJjbXB5aS5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52cmNtcHlpLnMwYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52cmNtcHlyLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZyY21weXIuczBjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZyY21weXMuYWNjLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZyY21weXMuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudnJjbXB5cy5zMXJwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZybWFjLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZybXB5LnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnhvci54YWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00LmFuZC5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQuYW5kLmFuZG4KKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQuYW5kLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00LmFuZC54b3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQuY21weWkud2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQuY21weWkud2hjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00LmNtcHlyLndoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00LmNtcHlyLndoYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC5tYWMudXAuczEuc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00Lm1weXJpLmFkZGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQubXB5cmkuYWRkcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC5tcHlyaS5hZGRyLnUyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00Lm1weXJyLmFkZGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQubXB5cnIuYWRkcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC5uYWMudXAuczEuc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00Lm9yLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC5vci5hbmRuCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00Lm9yLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00Lm9yLnhvcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC5wbXB5dworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC5wbXB5dy5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQudnBtcHloCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00LnZwbXB5aC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQudnJtcHllaC5hY2MuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQudnJtcHllaC5hY2MuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQudnJtcHllaC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC52cm1weWVoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00LnZybXB5b2guYWNjLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00LnZybXB5b2guYWNjLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00LnZybXB5b2guczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQudnJtcHlvaC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC54b3IuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00Lnhvci5hbmRuCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00Lnhvci5vcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC54b3IueGFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNS52ZG1hY2JzdQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNS52ZG1weWJzdQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNS52bWFjYnN1CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk01LnZtYWNidXUKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTUudm1weWJzdQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNS52bXB5YnV1CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk01LnZybWFjYnN1CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk01LnZybWFjYnV1CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk01LnZybXB5YnN1CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk01LnZybXB5YnV1CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk02LnZhYnNkaWZmYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNi52YWJzZGlmZnViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFkZGFzbC5ycnJpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkucC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkucC5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkucC5uYWMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkucC5vcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS5wLnhhY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkucgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS5yLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS5yLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS5yLm5hYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS5yLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnIuc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnIueGFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS52aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS52dworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci5wCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnAuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnAuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnAubmFjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnAub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNsLnIucC54b3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNsLnIucgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci5yLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci5yLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci5yLm5hYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci5yLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnIuc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnZoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnZ3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkucC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkucC5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkucC5uYWMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkucC5vcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5wLnJuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5wLnJuZC5nb29kc3ludGF4CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkuci5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkuci5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkuci5uYWMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkuci5vcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5yLnJuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5yLnJuZC5nb29kc3ludGF4CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnN2dy50cnVuCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnZoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnZ3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5yLnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIucC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIucC5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIucC5uYWMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIucC5vcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5wLnhvcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5yLnIuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5yLnIuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5yLnIubmFjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5yLnIub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIuci5zYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIuc3Z3LnRydW4KKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIudmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIudncKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYnJldgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5icmV2cAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5jYWJhY2VuY2JpbgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5jbDAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuY2wwcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5jbDEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuY2wxcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5jbGIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuY2xibm9ybQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5jbGJwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmNscmJpdC5pCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmNscmJpdC5yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmN0MAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5jdDBwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmN0MQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5jdDFwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmRlaW50ZXJsZWF2ZQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5leHRyYWN0dQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5leHRyYWN0dS5ycAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5leHRyYWN0dXAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuZXh0cmFjdHVwLnJwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmluc2VydAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5pbnNlcnQucnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuaW5zZXJ0cAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5pbnNlcnRwLnJwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmludGVybGVhdmUKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubGZzcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc2wuci5wCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnAuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnAuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnAubmFjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnAub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIucC54b3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIucgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc2wuci5yLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc2wuci5yLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc2wuci5yLm5hYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc2wuci5yLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnZoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnZ3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNyLmkucC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNyLmkucC5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNyLmkucC5uYWMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNyLmkucC5vcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5wLnhhY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNyLmkucgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5yLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5yLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5yLm5hYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5yLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnIueGFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS52aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS52dworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3Iuci5wCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnAuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnAuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnAubmFjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnAub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIucC54b3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIucgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3Iuci5yLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3Iuci5yLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3Iuci5yLm5hYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3Iuci5yLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnZoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnZ3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnBhY2tobAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5wYXJpdHlwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnNldGJpdC5pCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnNldGJpdC5yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnNodWZmZWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuc2h1ZmZlaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5zaHVmZm9iCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnNodWZmb2gKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmIucGJyCisgICAgMjksIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJiLnBjaQorICAgIDI4LCAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyYi5wY3IKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmQucGJyCisgICAgMjksIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJkLnBjaQorICAgIDI4LCAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyZC5wY3IKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmYucGJyCisgICAgMjksIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJmLnBjaQorICAgIDI4LCAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyZi5wY3IKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmgucGJyCisgICAgMjksIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJoLnBjaQorICAgIDI4LCAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyaC5wY3IKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmkucGJyCisgICAgMjksIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJpLnBjaQorICAgIDI4LCAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyaS5wY3IKKyAgICAxOCwgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3Jldy5sb2NrZWQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuc3ZzYXRoYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5zdnNhdGh1YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi50YWJsZWlkeGIuZ29vZHN5bnRheAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi50YWJsZWlkeGQuZ29vZHN5bnRheAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi50YWJsZWlkeGguZ29vZHN5bnRheAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi50YWJsZWlkeHcuZ29vZHN5bnRheAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi50b2dnbGViaXQuaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi50b2dnbGViaXQucgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi50c3RiaXQuaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi50c3RiaXQucgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52YWxpZ25pYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52YWxpZ25yYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52Y25lZ2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIudmNyb3RhdGUKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIudnJjbmVnaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52cm5kcGFja3doCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnZybmRwYWNrd2hzCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnZzYXRoYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52c2F0aGIubm9wYWNrCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnZzYXRodWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIudnNhdGh1Yi5ub3BhY2sKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIudnNhdHdoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnZzYXR3aC5ub3BhY2sKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIudnNhdHd1aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52c2F0d3VoLm5vcGFjaworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52c3BsYXRyYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52c3BsYXRyaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52c3BsaWNlaWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIudnNwbGljZXJiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnZzeHRiaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52c3h0aHcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIudnRydW5laGIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIudnRydW5ld2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIudnRydW5vaGIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIudnRydW5vd2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIudnp4dGJoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnZ6eHRodworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNC5hZGRhZGRpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0LmFkZGkuYXNsLnJpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0LmFkZGkubHNyLnJpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0LmFuZGkuYXNsLnJpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0LmFuZGkubHNyLnJpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0LmNsYmFkZGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQuY2xicGFkZGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQuY2xicG5vcm0KKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQuZXh0cmFjdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNC5leHRyYWN0LnJwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0LmV4dHJhY3RwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0LmV4dHJhY3RwLnJwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0LmxzbGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQubnRzdGJpdC5pCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0Lm50c3RiaXQucgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNC5vci5hbmRpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0Lm9yLmFuZGl4CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0Lm9yLm9yaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNC5vcmkuYXNsLnJpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0Lm9yaS5sc3IucmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQucGFyaXR5CisgICAgMTgsIC8vIGxsdm0uaGV4YWdvbi5TNC5zdG9yZWQubG9ja2VkCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0LnN1YmFkZGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQuc3ViaS5hc2wucmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQuc3ViaS5sc3IucmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQudnJjcm90YXRlCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0LnZyY3JvdGF0ZS5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQudnhhZGRzdWJoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0LnZ4YWRkc3ViaHIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQudnhhZGRzdWJ3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0LnZ4c3ViYWRkaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNC52eHN1YmFkZGhyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0LnZ4c3ViYWRkdworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNS5hc3JodWIucm5kLnNhdC5nb29kc3ludGF4CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM1LmFzcmh1Yi5zYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzUucG9wY291bnRwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM1LnZhc3Jocm5kLmdvb2RzeW50YXgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzYucm9sLmkucAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNi5yb2wuaS5wLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNi5yb2wuaS5wLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNi5yb2wuaS5wLm5hYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNi5yb2wuaS5wLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnAueGFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNi5yb2wuaS5yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnIuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnIuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnIubmFjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnIub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzYucm9sLmkuci54YWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM2LnZzcGxhdHJicAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNi52dHJ1bmVoYi5wcHAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzYudnRydW5vaGIucHBwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LmV4dHJhY3R3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LmV4dHJhY3R3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYuaGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYuaGkuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5sbworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5sby4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2Lmx2c3BsYXRiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2Lmx2c3BsYXRiLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYubHZzcGxhdGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYubHZzcGxhdGguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5sdnNwbGF0dworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5sdnNwbGF0dy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQuYW5kLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5hbmQubgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLmFuZC5uLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5ub3QKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5ub3QuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQub3IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLm9yLm4KKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5vci5uLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5zY2FsYXIyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQuc2NhbGFyMi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQuc2NhbGFyMnYyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQuc2NhbGFyMnYyLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYucHJlZC54b3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYucHJlZC54b3IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5zaHVmZmVxaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5zaHVmZmVxaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnNodWZmZXF3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnNodWZmZXF3LjEyOEIKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZTMzJiLm5xcHJlZC5haQorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudlMzMmIubnFwcmVkLmFpLjEyOEIKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZTMzJiLm50Lm5xcHJlZC5haQorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudlMzMmIubnQubnFwcmVkLmFpLjEyOEIKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZTMzJiLm50LnFwcmVkLmFpCisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5WNi52UzMyYi5udC5xcHJlZC5haS4xMjhCCisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5WNi52UzMyYi5xcHJlZC5haQorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudlMzMmIucXByZWQuYWkuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNiLnNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzYi5zYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzZGlmZmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFic2RpZmZoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFic2RpZmZ1YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzZGlmZnViLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFic2RpZmZ1aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzZGlmZnVoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFic2RpZmZ3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNkaWZmdy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFic2guc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNoLnNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnN3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnN3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFic3cuc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnN3LnNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRiLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGIuZHYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGIuZHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYm5xCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRibnEuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYnEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGJxLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGJzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGJzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYnNhdC5kdgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYnNhdC5kdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRjYXJyeQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkY2FycnkuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkY2xiaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkY2xiaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRjbGJ3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRjbGJ3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaC5kdgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaC5kdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRobnEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGhucS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRocQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaHEuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaHNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaHNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRoc2F0LmR2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRoc2F0LmR2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGh3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRody4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRody5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGh3LmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHViaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YmguYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YmguYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVic2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YnNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YnNhdC5kdgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWJzYXQuZHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWJ1YmIuc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YnViYi5zYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWhzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVoc2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVoc2F0LmR2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1aHNhdC5kdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1aHcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVody4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1aHcuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1aHcuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHV3c2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1d3NhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1d3NhdC5kdgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdXdzYXQuZHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR3LmR2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR3LmR2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHducQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkd25xLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHdxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR3cS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR3c2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR3c2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHdzYXQuZHYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHdzYXQuZHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWxpZ25iCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbGlnbmIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWxpZ25iaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWxpZ25iaS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFuZC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmRucXJ0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmRucXJ0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFuZG5xcnQuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmRucXJ0LmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmRxcnQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFuZHFydC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmRxcnQuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmRxcnQuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFuZHZucXYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFuZHZucXYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YW5kdnF2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmR2cXYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YW5kdnJ0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmR2cnQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YW5kdnJ0LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YW5kdnJ0LmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2xoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2xoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzbGguYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2xoLmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2xodgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNsaHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNsdworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNsdy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2x3LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNsdy5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNsd3YKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzbHd2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcmguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyaC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcmguYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcmhicm5kc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3JoYnJuZHNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3JoYnNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyaGJzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyaHVicm5kc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3JodWJybmRzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyaHVic2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3JodWJzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyaHYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcmh2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcnVodWJybmRzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcnVodWJybmRzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNydWh1YnNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNydWh1YnNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J1d3Vocm5kc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J1d3Vocm5kc2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcnV3dWhzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcnV3dWhzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNydworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNydy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNydy5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyd2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcndoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcndocm5kc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3aHJuZHNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3aHNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyd2hzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyd3Vocm5kc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3dWhybmRzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyd3Voc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3dWhzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyd3YKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcnd2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzc2lnbgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNzaWduLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzc2lnbnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzc2lnbnAuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZnYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZnYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmdicm5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmdicm5kLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmF2Z2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmF2Z2guMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZnaHJuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZnaHJuZC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd1YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndWIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndWJybmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3Vicm5kLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3VoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd1aC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd1aHJuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndWhybmQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndXcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3V3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3V3cm5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd1d3JuZC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3dybmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3dybmQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Y2wwaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Y2wwaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZjbDB3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZjbDB3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmNvbWJpbmUKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmNvbWJpbmUuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZDAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmQwLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRkMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZGQwLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRlYWxiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkZWFsYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkZWFsYjR3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkZWFsYjR3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRlYWxoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkZWFsaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkZWFsdmRkCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkZWFsdmRkLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRlbHRhCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkZWx0YS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlidXMuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzLmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzLmR2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzLmR2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlidXMuZHYuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzLmR2LmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGIuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGIuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloYi5kdgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhiLmR2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloYi5kdi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloYi5kdi5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhpc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGlzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhpc2F0LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhpc2F0LmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhzYXQuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHNhdC5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhzdWlzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloc3Vpc2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloc3Vpc2F0LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhzdWlzYXQuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloc3VzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloc3VzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhzdXNhdC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloc3VzYXQuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlodnNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWh2c2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlodnNhdC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlodnNhdC5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZHNhZHVoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkc2FkdWguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZHNhZHVoLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZHNhZHVoLmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmVxYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWIuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWIuYW5kLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmVxYi5vcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXFiLm9yLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmVxYi54b3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmVxYi54b3IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXFoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXFoLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXFoLmFuZC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWgub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmVxaC5vci4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWgueG9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWgueG9yLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmVxdworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXF3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmVxdy5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmVxdy5hbmQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXF3Lm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcXcub3IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXF3LnhvcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXF3Lnhvci4xMjhCCisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybWgKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaC4xMjhCCisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybWhxCisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybWhxLjEyOEIKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaHcKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaHcuMTI4QgorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm1od3EKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaHdxLjEyOEIKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtdworICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm13LjEyOEIKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtd3EKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtd3EuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RiLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RiLmFuZC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGIub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0Yi5vci4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGIueG9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGIueG9yLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0aC5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0aC5hbmQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RoLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGgub3IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RoLnhvcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RoLnhvci4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHViLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dWIuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHViLmFuZC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHViLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHViLm9yLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dWIueG9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHViLnhvci4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHVoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHVoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dWguYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHVoLmFuZC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHVoLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHVoLm9yLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dWgueG9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHVoLnhvci4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHV3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHV3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dXcuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHV3LmFuZC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHV3Lm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHV3Lm9yLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dXcueG9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHV3Lnhvci4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHcuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHcuYW5kLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dy5vcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R3Lm9yLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dy54b3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dy54b3IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52aW5zZXJ0d3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmluc2VydHdyLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmxhbGlnbmIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmxhbGlnbmIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bGFsaWduYmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmxhbGlnbmJpLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmxzcmIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmxzcmIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHNyaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHNyaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsc3JodgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHNyaHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHNydworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHNydy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsc3J3dgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHNyd3YuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0NAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0NC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2dmIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ2Yi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2dmIubm0KKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ2Yi5ubS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2dmIub3JhY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ2Yi5vcmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2dmIub3JhY2NpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2dmIub3JhY2NpLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ2YmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ2YmkuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dndoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2d2guMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dndoLm5tCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2d2gubm0uMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dndoLm9yYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2d2gub3JhY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dndoLm9yYWNjaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dndoLm9yYWNjaS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2d2hpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2d2hpLjEyOEIKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXNrZWRzdG9yZW5xCisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bWFza2Vkc3RvcmVucS4xMjhCCisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bWFza2Vkc3RvcmVudG5xCisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bWFza2Vkc3RvcmVudG5xLjEyOEIKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXNrZWRzdG9yZW50cQorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudm1hc2tlZHN0b3JlbnRxLjEyOEIKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXNrZWRzdG9yZXEKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXNrZWRzdG9yZXEuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bWF4YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bWF4Yi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXhoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXhoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1heHViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXh1Yi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXh1aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bWF4dWguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bWF4dworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bWF4dy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtaW5iCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtaW5iLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1pbmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1pbmguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bWludWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1pbnViLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1pbnVoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtaW51aC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtaW53CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtaW53LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYWJ1cworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhYnVzLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYWJ1cy5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYWJ1cy5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhYnVzdgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhYnVzdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFidXUKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYWJ1dS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFidXUuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFidXUuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYWJ1dXYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYWJ1dXYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhaGIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYWhiLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYWhiLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhaGIuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYWhoc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFoaHNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGF1aGIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYXVoYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGF1aGIuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGF1aGIuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYXVodWhzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYXVodWhzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBzdWh1aHNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBzdWh1aHNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlidXMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ1cy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlidXMuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlidXMuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ1c3YKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ1c3YuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5YnVzdi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ1c3YuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlidi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlidi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ2LmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlld3VoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlld3VoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWV3dWguNjQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWV3dWguNjQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHloLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aC5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHNhdC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWhzYXQuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWhzcnMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWhzcnMuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHNzCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHloc3MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHVzCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlodXMuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHVzLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHVzLmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlodgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHYuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlodi5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHZzcnMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWh2c3JzLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWllb2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWllb2guMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWV3aC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWlld2guYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWlld3VoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpZXd1aC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpZXd1aC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWlld3VoLmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWguYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpaC5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWhiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpaGIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWhiLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWhiLmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpb3doCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpb3doLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXdiLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3Yi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3Yi5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXdoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpd2guMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXdoLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXdoLmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpd3ViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpd3ViLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3dWIuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpd3ViLmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlvd2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weW93aC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlvd2guNjQuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlvd2guNjQuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weW93aC5ybmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weW93aC5ybmQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5b3doLnJuZC5zYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlvd2gucm5kLnNhY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5b3doLnNhY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weW93aC5zYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1Yi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1Yi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXViLmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1YnYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXVidi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1YnYuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1YnYuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXVoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1aC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1aC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXVoLmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1aGUKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXVoZS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1aGUuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1aGUuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXVodgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWh2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXVodi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXVodi5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXV4CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtdXguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bmF2Z2IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm5hdmdiLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm5hdmdoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZuYXZnaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZuYXZndWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm5hdmd1Yi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZuYXZndworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bmF2Z3cuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bm9ybWFtdGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm5vcm1hbXRoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm5vcm1hbXR3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZub3JtYW10dy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZub3QKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm5vdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZvcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52b3IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja2ViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrZWIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja2VoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrZWguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja2hiLnNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja2hiLnNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNraHViLnNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja2h1Yi5zYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja29iCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrb2IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja29oCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrb2guMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja3doLnNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja3doLnNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrd3VoLnNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja3d1aC5zYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cG9wY291bnRoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwb3Bjb3VudGguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cHJlZml4cWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnByZWZpeHFiLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnByZWZpeHFoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwcmVmaXhxaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwcmVmaXhxdworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cHJlZml4cXcuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cmRlbHRhCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZyZGVsdGEuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1Yi5ydHQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidWIucnR0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidWIucnR0LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1Yi5ydHQuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXMuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1cy5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXMuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXNpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzaS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzaS5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXNpLmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzdgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1c3YuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1c3YuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzdi5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ2LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ2LmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1Yi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWIuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWIuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1Yi5ydHQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1Yi5ydHQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViLnJ0dC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1Yi5ydHQuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1YmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1YmkuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViaS5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1YmkuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1YnYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1YnYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXVidi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1YnYuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJvcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm9yLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJvdW5kaGIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJvdW5kaGIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmRodWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJvdW5kaHViLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJvdW5kdWh1YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmR1aHViLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJvdW5kdXd1aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmR1d3VoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJvdW5kd2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJvdW5kd2guMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmR3dWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJvdW5kd3VoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJzYWR1YmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJzYWR1YmkuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cnNhZHViaS5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJzYWR1YmkuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNhdGh1YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2F0aHViLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNhdHV3dWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNhdHV3dWguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2F0d2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNhdHdoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzYi4xMjhCCisgICAgMzIsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1oCisgICAgMzIsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1oLjEyOEIKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWguYWRkCisgICAgMzIsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1oLmFkZC4xMjhCCisgICAgMzIsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1ocQorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHEuMTI4QgorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHcKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWh3LjEyOEIKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWh3LmFkZAorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHcuYWRkLjEyOEIKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWh3cQorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHdxLjEyOEIKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybXcKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybXcuMTI4QgorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtdy5hZGQKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybXcuYWRkLjEyOEIKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybXdxCisgICAgMzIsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm13cS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2guMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1ZmVoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZWguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1ZmZiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZmIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1ZmZlYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1ZmZlYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNodWZmaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZm9iCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZm9iLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNodWZmdmRkCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZnZkZC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmb2ViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmb2ViLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNodWZvZWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNodWZvZWguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1Zm9oCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmb2guMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJiLmR2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJiLmR2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YmJucQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViYm5xLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YmJxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJicS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJic2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJic2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YmJzYXQuZHYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YmJzYXQuZHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViY2FycnkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YmNhcnJ5LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YmguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViaC5kdgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViaC5kdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJobnEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YmhucS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJocQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViaHEuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViaHNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViaHNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJoc2F0LmR2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJoc2F0LmR2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1Ymh3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJody4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1YmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YnViaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1YnNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWJzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWJzYXQuZHYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YnVic2F0LmR2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YnVidWJiLnNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWJ1YmIuc2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YnVoc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1aHNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1aHNhdC5kdgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWhzYXQuZHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWh3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1aHcuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidXdzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YnV3c2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YnV3c2F0LmR2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1d3NhdC5kdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YncuZHYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YncuZHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3Vid25xCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ3bnEuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3Vid3EKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YndxLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YndzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YndzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3Vid3NhdC5kdgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3Vid3NhdC5kdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzd2FwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzd2FwLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnRtcHliCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ0bXB5Yi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ0bXB5Yi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnRtcHliLmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ0bXB5YnVzCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ0bXB5YnVzLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnRtcHlidXMuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ0bXB5YnVzLmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ0bXB5aGIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnRtcHloYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ0bXB5aGIuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ0bXB5aGIuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnVucGFja2IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnVucGFja2IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52dW5wYWNraAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52dW5wYWNraC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2tvYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52dW5wYWNrb2IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52dW5wYWNrb2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnVucGFja29oLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnVucGFja3ViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2t1Yi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2t1aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52dW5wYWNrdWguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52eG9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ4b3IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52emIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnpiLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnpoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ6aC4xMjhCCisgICAgMywgLy8gbGx2bS5oZXhhZ29uLlkyLmRjY2xlYW5hCisgICAgMywgLy8gbGx2bS5oZXhhZ29uLlkyLmRjY2xlYW5pbnZhCisgICAgMywgLy8gbGx2bS5oZXhhZ29uLlkyLmRjaW52YQorICAgIDM2LCAvLyBsbHZtLmhleGFnb24uWTIuZGN6ZXJvYQorICAgIDMsIC8vIGxsdm0uaGV4YWdvbi5ZNC5sMmZldGNoCisgICAgMywgLy8gbGx2bS5oZXhhZ29uLlk1LmwyZmV0Y2gKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLmNpcmMubGRiCisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5jaXJjLmxkZAorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uY2lyYy5sZGgKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLmNpcmMubGR1YgorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uY2lyYy5sZHVoCisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5jaXJjLmxkdworICAgIDMyLCAvLyBsbHZtLmhleGFnb24uY2lyYy5zdGIKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLmNpcmMuc3RkCisgICAgMzIsIC8vIGxsdm0uaGV4YWdvbi5jaXJjLnN0aAorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uY2lyYy5zdGhoaQorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uY2lyYy5zdHcKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLm1tMjU2aS52YWRkdworICAgIDMsIC8vIGxsdm0uaGV4YWdvbi5wcmVmZXRjaAorICAgIDMsIC8vIGxsdm0ubWlwcy5hYnNxLnMucGgKKyAgICAzLCAvLyBsbHZtLm1pcHMuYWJzcS5zLnFiCisgICAgMywgLy8gbGx2bS5taXBzLmFic3Eucy53CisgICAgMSwgLy8gbGx2bS5taXBzLmFkZC5hLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYWRkLmEuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGQuYS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZC5hLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuYWRkcS5waAorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRxLnMucGgKKyAgICAzLCAvLyBsbHZtLm1pcHMuYWRkcS5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuYWRkcWgucGgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYWRkcWguci5waAorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRxaC5yLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuYWRkcWgudworICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRzLmEuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRzLmEuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRzLmEuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRzLmEudworICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRzLnMuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRzLnMuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRzLnMuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRzLnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRzLnUuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRzLnUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRzLnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRzLnUudworICAgIDMsIC8vIGxsdm0ubWlwcy5hZGRzYworICAgIDMsIC8vIGxsdm0ubWlwcy5hZGR1LnBoCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHUucWIKKyAgICAzLCAvLyBsbHZtLm1pcHMuYWRkdS5zLnBoCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHUucy5xYgorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGR1aC5xYgorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGR1aC5yLnFiCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHYuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGR2LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuYWRkdi5oCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHYudworICAgIDEsIC8vIGxsdm0ubWlwcy5hZGR2aS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHZpLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuYWRkdmkuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGR2aS53CisgICAgMywgLy8gbGx2bS5taXBzLmFkZHdjCisgICAgMSwgLy8gbGx2bS5taXBzLmFuZC52CisgICAgMSwgLy8gbGx2bS5taXBzLmFuZGkuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5hcHBlbmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXN1Yi5zLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXN1Yi5zLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXN1Yi5zLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXN1Yi5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXN1Yi51LmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXN1Yi51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXN1Yi51LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXN1Yi51LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXZlLnMuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5hdmUucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLmF2ZS5zLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXZlLnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5hdmUudS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmF2ZS51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXZlLnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5hdmUudS53CisgICAgMSwgLy8gbGx2bS5taXBzLmF2ZXIucy5iCisgICAgMSwgLy8gbGx2bS5taXBzLmF2ZXIucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLmF2ZXIucy5oCisgICAgMSwgLy8gbGx2bS5taXBzLmF2ZXIucy53CisgICAgMSwgLy8gbGx2bS5taXBzLmF2ZXIudS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmF2ZXIudS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmF2ZXIudS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmF2ZXIudS53CisgICAgMSwgLy8gbGx2bS5taXBzLmJhbGlnbgorICAgIDEsIC8vIGxsdm0ubWlwcy5iY2xyLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmNsci5kCisgICAgMSwgLy8gbGx2bS5taXBzLmJjbHIuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5iY2xyLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmNscmkuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5iY2xyaS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmJjbHJpLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmNscmkudworICAgIDEsIC8vIGxsdm0ubWlwcy5iaW5zbC5iCisgICAgMSwgLy8gbGx2bS5taXBzLmJpbnNsLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmluc2wuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5iaW5zbC53CisgICAgMSwgLy8gbGx2bS5taXBzLmJpbnNsaS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmJpbnNsaS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmJpbnNsaS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmJpbnNsaS53CisgICAgMSwgLy8gbGx2bS5taXBzLmJpbnNyLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmluc3IuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5iaW5zci5oCisgICAgMSwgLy8gbGx2bS5taXBzLmJpbnNyLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmluc3JpLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmluc3JpLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmluc3JpLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmluc3JpLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuYml0cmV2CisgICAgMSwgLy8gbGx2bS5taXBzLmJtbnoudgorICAgIDEsIC8vIGxsdm0ubWlwcy5ibW56aS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmJtei52CisgICAgMSwgLy8gbGx2bS5taXBzLmJtemkuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5ibmVnLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYm5lZy5kCisgICAgMSwgLy8gbGx2bS5taXBzLmJuZWcuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5ibmVnLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuYm5lZ2kuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5ibmVnaS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmJuZWdpLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYm5lZ2kudworICAgIDEsIC8vIGxsdm0ubWlwcy5ibnouYgorICAgIDEsIC8vIGxsdm0ubWlwcy5ibnouZAorICAgIDEsIC8vIGxsdm0ubWlwcy5ibnouaAorICAgIDEsIC8vIGxsdm0ubWlwcy5ibnoudgorICAgIDEsIC8vIGxsdm0ubWlwcy5ibnoudworICAgIDE2LCAvLyBsbHZtLm1pcHMuYnBvc2dlMzIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYnNlbC52CisgICAgMSwgLy8gbGx2bS5taXBzLmJzZWxpLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYnNldC5iCisgICAgMSwgLy8gbGx2bS5taXBzLmJzZXQuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5ic2V0LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYnNldC53CisgICAgMSwgLy8gbGx2bS5taXBzLmJzZXRpLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYnNldGkuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5ic2V0aS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmJzZXRpLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuYnouYgorICAgIDEsIC8vIGxsdm0ubWlwcy5iei5kCisgICAgMSwgLy8gbGx2bS5taXBzLmJ6LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYnoudgorICAgIDEsIC8vIGxsdm0ubWlwcy5iei53CisgICAgMSwgLy8gbGx2bS5taXBzLmNlcS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmNlcS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmNlcS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmNlcS53CisgICAgMSwgLy8gbGx2bS5taXBzLmNlcWkuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5jZXFpLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2VxaS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmNlcWkudworICAgIDMsIC8vIGxsdm0ubWlwcy5jZmNtc2EKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2xlLnMuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5jbGUucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLmNsZS5zLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2xlLnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5jbGUudS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmNsZS51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2xlLnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5jbGUudS53CisgICAgMSwgLy8gbGx2bS5taXBzLmNsZWkucy5iCisgICAgMSwgLy8gbGx2bS5taXBzLmNsZWkucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLmNsZWkucy5oCisgICAgMSwgLy8gbGx2bS5taXBzLmNsZWkucy53CisgICAgMSwgLy8gbGx2bS5taXBzLmNsZWkudS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmNsZWkudS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmNsZWkudS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmNsZWkudS53CisgICAgMSwgLy8gbGx2bS5taXBzLmNsdC5zLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2x0LnMuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5jbHQucy5oCisgICAgMSwgLy8gbGx2bS5taXBzLmNsdC5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2x0LnUuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5jbHQudS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmNsdC51LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2x0LnUudworICAgIDEsIC8vIGxsdm0ubWlwcy5jbHRpLnMuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5jbHRpLnMuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5jbHRpLnMuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5jbHRpLnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5jbHRpLnUuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5jbHRpLnUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5jbHRpLnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5jbHRpLnUudworICAgIDMsIC8vIGxsdm0ubWlwcy5jbXAuZXEucGgKKyAgICAzLCAvLyBsbHZtLm1pcHMuY21wLmxlLnBoCisgICAgMywgLy8gbGx2bS5taXBzLmNtcC5sdC5waAorICAgIDMsIC8vIGxsdm0ubWlwcy5jbXBnZHUuZXEucWIKKyAgICAzLCAvLyBsbHZtLm1pcHMuY21wZ2R1LmxlLnFiCisgICAgMywgLy8gbGx2bS5taXBzLmNtcGdkdS5sdC5xYgorICAgIDMsIC8vIGxsdm0ubWlwcy5jbXBndS5lcS5xYgorICAgIDMsIC8vIGxsdm0ubWlwcy5jbXBndS5sZS5xYgorICAgIDMsIC8vIGxsdm0ubWlwcy5jbXBndS5sdC5xYgorICAgIDMsIC8vIGxsdm0ubWlwcy5jbXB1LmVxLnFiCisgICAgMywgLy8gbGx2bS5taXBzLmNtcHUubGUucWIKKyAgICAzLCAvLyBsbHZtLm1pcHMuY21wdS5sdC5xYgorICAgIDEsIC8vIGxsdm0ubWlwcy5jb3B5LnMuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5jb3B5LnMuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5jb3B5LnMuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5jb3B5LnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5jb3B5LnUuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5jb3B5LnUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5jb3B5LnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5jb3B5LnUudworICAgIDMsIC8vIGxsdm0ubWlwcy5jdGNtc2EKKyAgICAxLCAvLyBsbHZtLm1pcHMuZGl2LnMuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5kaXYucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLmRpdi5zLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuZGl2LnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5kaXYudS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmRpdi51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZGl2LnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5kaXYudS53CisgICAgMSwgLy8gbGx2bS5taXBzLmRsc2EKKyAgICAxLCAvLyBsbHZtLm1pcHMuZG90cC5zLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZG90cC5zLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuZG90cC5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZG90cC51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZG90cC51LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuZG90cC51LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZHBhLncucGgKKyAgICAxLCAvLyBsbHZtLm1pcHMuZHBhZGQucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLmRwYWRkLnMuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5kcGFkZC5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZHBhZGQudS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmRwYWRkLnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5kcGFkZC51LncKKyAgICAzLCAvLyBsbHZtLm1pcHMuZHBhcS5zLncucGgKKyAgICAzLCAvLyBsbHZtLm1pcHMuZHBhcS5zYS5sLncKKyAgICAzLCAvLyBsbHZtLm1pcHMuZHBhcXgucy53LnBoCisgICAgMywgLy8gbGx2bS5taXBzLmRwYXF4LnNhLncucGgKKyAgICAxLCAvLyBsbHZtLm1pcHMuZHBhdS5oLnFibAorICAgIDEsIC8vIGxsdm0ubWlwcy5kcGF1LmgucWJyCisgICAgMSwgLy8gbGx2bS5taXBzLmRwYXgudy5waAorICAgIDEsIC8vIGxsdm0ubWlwcy5kcHMudy5waAorICAgIDMsIC8vIGxsdm0ubWlwcy5kcHNxLnMudy5waAorICAgIDMsIC8vIGxsdm0ubWlwcy5kcHNxLnNhLmwudworICAgIDMsIC8vIGxsdm0ubWlwcy5kcHNxeC5zLncucGgKKyAgICAzLCAvLyBsbHZtLm1pcHMuZHBzcXguc2Eudy5waAorICAgIDEsIC8vIGxsdm0ubWlwcy5kcHN1LmgucWJsCisgICAgMSwgLy8gbGx2bS5taXBzLmRwc3UuaC5xYnIKKyAgICAxLCAvLyBsbHZtLm1pcHMuZHBzdWIucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLmRwc3ViLnMuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5kcHN1Yi5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZHBzdWIudS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmRwc3ViLnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5kcHN1Yi51LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZHBzeC53LnBoCisgICAgMywgLy8gbGx2bS5taXBzLmV4dHAKKyAgICAzLCAvLyBsbHZtLm1pcHMuZXh0cGRwCisgICAgMywgLy8gbGx2bS5taXBzLmV4dHIuci53CisgICAgMywgLy8gbGx2bS5taXBzLmV4dHIucnMudworICAgIDMsIC8vIGxsdm0ubWlwcy5leHRyLnMuaAorICAgIDMsIC8vIGxsdm0ubWlwcy5leHRyLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmFkZC5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZhZGQudworICAgIDEsIC8vIGxsdm0ubWlwcy5mY2FmLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmNhZi53CisgICAgMSwgLy8gbGx2bS5taXBzLmZjZXEuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mY2VxLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmNsYXNzLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmNsYXNzLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmNsZS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZjbGUudworICAgIDEsIC8vIGxsdm0ubWlwcy5mY2x0LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmNsdC53CisgICAgMSwgLy8gbGx2bS5taXBzLmZjbmUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mY25lLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmNvci5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZjb3IudworICAgIDEsIC8vIGxsdm0ubWlwcy5mY3VlcS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZjdWVxLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmN1bGUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mY3VsZS53CisgICAgMSwgLy8gbGx2bS5taXBzLmZjdWx0LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmN1bHQudworICAgIDEsIC8vIGxsdm0ubWlwcy5mY3VuLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmN1bi53CisgICAgMSwgLy8gbGx2bS5taXBzLmZjdW5lLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmN1bmUudworICAgIDEsIC8vIGxsdm0ubWlwcy5mZGl2LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmRpdi53CisgICAgMSwgLy8gbGx2bS5taXBzLmZleGRvLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmV4ZG8udworICAgIDEsIC8vIGxsdm0ubWlwcy5mZXhwMi5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZleHAyLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmV4dXBsLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmV4dXBsLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmV4dXByLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmV4dXByLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmZpbnQucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZmaW50LnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5mZmludC51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmZpbnQudS53CisgICAgMSwgLy8gbGx2bS5taXBzLmZmcWwuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mZnFsLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmZxci5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZmcXIudworICAgIDEsIC8vIGxsdm0ubWlwcy5maWxsLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmlsbC5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZpbGwuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5maWxsLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmxvZzIuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mbG9nMi53CisgICAgMSwgLy8gbGx2bS5taXBzLmZtYWRkLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZm1hZGQudworICAgIDEsIC8vIGxsdm0ubWlwcy5mbWF4LmEuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mbWF4LmEudworICAgIDEsIC8vIGxsdm0ubWlwcy5mbWF4LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZm1heC53CisgICAgMSwgLy8gbGx2bS5taXBzLmZtaW4uYS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZtaW4uYS53CisgICAgMSwgLy8gbGx2bS5taXBzLmZtaW4uZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mbWluLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZm1zdWIuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mbXN1Yi53CisgICAgMSwgLy8gbGx2bS5taXBzLmZtdWwuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mbXVsLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnJjcC5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZyY3AudworICAgIDEsIC8vIGxsdm0ubWlwcy5mcmludC5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZyaW50LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnJzcXJ0LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnJzcXJ0LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnNhZi5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZzYWYudworICAgIDEsIC8vIGxsdm0ubWlwcy5mc2VxLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnNlcS53CisgICAgMSwgLy8gbGx2bS5taXBzLmZzbGUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mc2xlLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnNsdC5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZzbHQudworICAgIDEsIC8vIGxsdm0ubWlwcy5mc25lLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnNuZS53CisgICAgMSwgLy8gbGx2bS5taXBzLmZzb3IuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mc29yLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnNxcnQuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mc3FydC53CisgICAgMSwgLy8gbGx2bS5taXBzLmZzdWIuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mc3ViLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnN1ZXEuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mc3VlcS53CisgICAgMSwgLy8gbGx2bS5taXBzLmZzdWxlLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnN1bGUudworICAgIDEsIC8vIGxsdm0ubWlwcy5mc3VsdC5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZzdWx0LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnN1bi5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZzdW4udworICAgIDEsIC8vIGxsdm0ubWlwcy5mc3VuZS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZzdW5lLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnRpbnQucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZ0aW50LnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5mdGludC51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnRpbnQudS53CisgICAgMSwgLy8gbGx2bS5taXBzLmZ0cS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmZ0cS53CisgICAgMSwgLy8gbGx2bS5taXBzLmZ0cnVuYy5zLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnRydW5jLnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5mdHJ1bmMudS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZ0cnVuYy51LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuaGFkZC5zLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuaGFkZC5zLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuaGFkZC5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuaGFkZC51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuaGFkZC51LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuaGFkZC51LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuaHN1Yi5zLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuaHN1Yi5zLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuaHN1Yi5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuaHN1Yi51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuaHN1Yi51LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuaHN1Yi51LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuaWx2ZXYuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5pbHZldi5kCisgICAgMSwgLy8gbGx2bS5taXBzLmlsdmV2LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuaWx2ZXYudworICAgIDEsIC8vIGxsdm0ubWlwcy5pbHZsLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuaWx2bC5kCisgICAgMSwgLy8gbGx2bS5taXBzLmlsdmwuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5pbHZsLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuaWx2b2QuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5pbHZvZC5kCisgICAgMSwgLy8gbGx2bS5taXBzLmlsdm9kLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuaWx2b2QudworICAgIDEsIC8vIGxsdm0ubWlwcy5pbHZyLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuaWx2ci5kCisgICAgMSwgLy8gbGx2bS5taXBzLmlsdnIuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5pbHZyLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuaW5zZXJ0LmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuaW5zZXJ0LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuaW5zZXJ0LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuaW5zZXJ0LncKKyAgICAxNiwgLy8gbGx2bS5taXBzLmluc3YKKyAgICAxLCAvLyBsbHZtLm1pcHMuaW5zdmUuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5pbnN2ZS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmluc3ZlLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuaW5zdmUudworICAgIDIsIC8vIGxsdm0ubWlwcy5sYnV4CisgICAgMiwgLy8gbGx2bS5taXBzLmxkLmIKKyAgICAyLCAvLyBsbHZtLm1pcHMubGQuZAorICAgIDIsIC8vIGxsdm0ubWlwcy5sZC5oCisgICAgMiwgLy8gbGx2bS5taXBzLmxkLncKKyAgICAxLCAvLyBsbHZtLm1pcHMubGRpLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMubGRpLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMubGRpLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMubGRpLncKKyAgICAyLCAvLyBsbHZtLm1pcHMubGh4CisgICAgMSwgLy8gbGx2bS5taXBzLmxzYQorICAgIDIsIC8vIGxsdm0ubWlwcy5sd3gKKyAgICAxLCAvLyBsbHZtLm1pcHMubWFkZAorICAgIDEsIC8vIGxsdm0ubWlwcy5tYWRkLnEuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5tYWRkLnEudworICAgIDEsIC8vIGxsdm0ubWlwcy5tYWRkci5xLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMubWFkZHIucS53CisgICAgMSwgLy8gbGx2bS5taXBzLm1hZGR1CisgICAgMSwgLy8gbGx2bS5taXBzLm1hZGR2LmIKKyAgICAxLCAvLyBsbHZtLm1pcHMubWFkZHYuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5tYWRkdi5oCisgICAgMSwgLy8gbGx2bS5taXBzLm1hZGR2LncKKyAgICAzLCAvLyBsbHZtLm1pcHMubWFxLnMudy5waGwKKyAgICAzLCAvLyBsbHZtLm1pcHMubWFxLnMudy5waHIKKyAgICAzLCAvLyBsbHZtLm1pcHMubWFxLnNhLncucGhsCisgICAgMywgLy8gbGx2bS5taXBzLm1hcS5zYS53LnBocgorICAgIDEsIC8vIGxsdm0ubWlwcy5tYXguYS5iCisgICAgMSwgLy8gbGx2bS5taXBzLm1heC5hLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMubWF4LmEuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5tYXguYS53CisgICAgMSwgLy8gbGx2bS5taXBzLm1heC5zLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMubWF4LnMuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5tYXgucy5oCisgICAgMSwgLy8gbGx2bS5taXBzLm1heC5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMubWF4LnUuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5tYXgudS5kCisgICAgMSwgLy8gbGx2bS5taXBzLm1heC51LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMubWF4LnUudworICAgIDEsIC8vIGxsdm0ubWlwcy5tYXhpLnMuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5tYXhpLnMuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5tYXhpLnMuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5tYXhpLnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5tYXhpLnUuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5tYXhpLnUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5tYXhpLnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5tYXhpLnUudworICAgIDEsIC8vIGxsdm0ubWlwcy5taW4uYS5iCisgICAgMSwgLy8gbGx2bS5taXBzLm1pbi5hLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMubWluLmEuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5taW4uYS53CisgICAgMSwgLy8gbGx2bS5taXBzLm1pbi5zLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMubWluLnMuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5taW4ucy5oCisgICAgMSwgLy8gbGx2bS5taXBzLm1pbi5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMubWluLnUuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5taW4udS5kCisgICAgMSwgLy8gbGx2bS5taXBzLm1pbi51LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMubWluLnUudworICAgIDEsIC8vIGxsdm0ubWlwcy5taW5pLnMuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5taW5pLnMuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5taW5pLnMuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5taW5pLnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5taW5pLnUuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5taW5pLnUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5taW5pLnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5taW5pLnUudworICAgIDEsIC8vIGxsdm0ubWlwcy5tb2Qucy5iCisgICAgMSwgLy8gbGx2bS5taXBzLm1vZC5zLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMubW9kLnMuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5tb2Qucy53CisgICAgMSwgLy8gbGx2bS5taXBzLm1vZC51LmIKKyAgICAxLCAvLyBsbHZtLm1pcHMubW9kLnUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5tb2QudS5oCisgICAgMSwgLy8gbGx2bS5taXBzLm1vZC51LncKKyAgICAxLCAvLyBsbHZtLm1pcHMubW9kc3ViCisgICAgMSwgLy8gbGx2bS5taXBzLm1vdmUudgorICAgIDEsIC8vIGxsdm0ubWlwcy5tc3ViCisgICAgMSwgLy8gbGx2bS5taXBzLm1zdWIucS5oCisgICAgMSwgLy8gbGx2bS5taXBzLm1zdWIucS53CisgICAgMSwgLy8gbGx2bS5taXBzLm1zdWJyLnEuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5tc3Vici5xLncKKyAgICAxLCAvLyBsbHZtLm1pcHMubXN1YnUKKyAgICAxLCAvLyBsbHZtLm1pcHMubXN1YnYuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5tc3Vidi5kCisgICAgMSwgLy8gbGx2bS5taXBzLm1zdWJ2LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMubXN1YnYudworICAgIDMsIC8vIGxsdm0ubWlwcy5tdGhsaXAKKyAgICAzLCAvLyBsbHZtLm1pcHMubXVsLnBoCisgICAgMSwgLy8gbGx2bS5taXBzLm11bC5xLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMubXVsLnEudworICAgIDMsIC8vIGxsdm0ubWlwcy5tdWwucy5waAorICAgIDMsIC8vIGxsdm0ubWlwcy5tdWxlcS5zLncucGhsCisgICAgMywgLy8gbGx2bS5taXBzLm11bGVxLnMudy5waHIKKyAgICAzLCAvLyBsbHZtLm1pcHMubXVsZXUucy5waC5xYmwKKyAgICAzLCAvLyBsbHZtLm1pcHMubXVsZXUucy5waC5xYnIKKyAgICAzLCAvLyBsbHZtLm1pcHMubXVscS5ycy5waAorICAgIDMsIC8vIGxsdm0ubWlwcy5tdWxxLnJzLncKKyAgICAzLCAvLyBsbHZtLm1pcHMubXVscS5zLnBoCisgICAgMywgLy8gbGx2bS5taXBzLm11bHEucy53CisgICAgMSwgLy8gbGx2bS5taXBzLm11bHIucS5oCisgICAgMSwgLy8gbGx2bS5taXBzLm11bHIucS53CisgICAgMSwgLy8gbGx2bS5taXBzLm11bHNhLncucGgKKyAgICAzLCAvLyBsbHZtLm1pcHMubXVsc2FxLnMudy5waAorICAgIDEsIC8vIGxsdm0ubWlwcy5tdWx0CisgICAgMSwgLy8gbGx2bS5taXBzLm11bHR1CisgICAgMSwgLy8gbGx2bS5taXBzLm11bHYuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5tdWx2LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMubXVsdi5oCisgICAgMSwgLy8gbGx2bS5taXBzLm11bHYudworICAgIDEsIC8vIGxsdm0ubWlwcy5ubG9jLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMubmxvYy5kCisgICAgMSwgLy8gbGx2bS5taXBzLm5sb2MuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5ubG9jLncKKyAgICAxLCAvLyBsbHZtLm1pcHMubmx6Yy5iCisgICAgMSwgLy8gbGx2bS5taXBzLm5semMuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5ubHpjLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMubmx6Yy53CisgICAgMSwgLy8gbGx2bS5taXBzLm5vci52CisgICAgMSwgLy8gbGx2bS5taXBzLm5vcmkuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5vci52CisgICAgMSwgLy8gbGx2bS5taXBzLm9yaS5iCisgICAgMSwgLy8gbGx2bS5taXBzLnBhY2tybC5waAorICAgIDEsIC8vIGxsdm0ubWlwcy5wY2tldi5iCisgICAgMSwgLy8gbGx2bS5taXBzLnBja2V2LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMucGNrZXYuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5wY2tldi53CisgICAgMSwgLy8gbGx2bS5taXBzLnBja29kLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMucGNrb2QuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5wY2tvZC5oCisgICAgMSwgLy8gbGx2bS5taXBzLnBja29kLncKKyAgICAxLCAvLyBsbHZtLm1pcHMucGNudC5iCisgICAgMSwgLy8gbGx2bS5taXBzLnBjbnQuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5wY250LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMucGNudC53CisgICAgMTYsIC8vIGxsdm0ubWlwcy5waWNrLnBoCisgICAgMTYsIC8vIGxsdm0ubWlwcy5waWNrLnFiCisgICAgMSwgLy8gbGx2bS5taXBzLnByZWNlcS53LnBobAorICAgIDEsIC8vIGxsdm0ubWlwcy5wcmVjZXEudy5waHIKKyAgICAxLCAvLyBsbHZtLm1pcHMucHJlY2VxdS5waC5xYmwKKyAgICAxLCAvLyBsbHZtLm1pcHMucHJlY2VxdS5waC5xYmxhCisgICAgMSwgLy8gbGx2bS5taXBzLnByZWNlcXUucGgucWJyCisgICAgMSwgLy8gbGx2bS5taXBzLnByZWNlcXUucGgucWJyYQorICAgIDEsIC8vIGxsdm0ubWlwcy5wcmVjZXUucGgucWJsCisgICAgMSwgLy8gbGx2bS5taXBzLnByZWNldS5waC5xYmxhCisgICAgMSwgLy8gbGx2bS5taXBzLnByZWNldS5waC5xYnIKKyAgICAxLCAvLyBsbHZtLm1pcHMucHJlY2V1LnBoLnFicmEKKyAgICAzLCAvLyBsbHZtLm1pcHMucHJlY3IucWIucGgKKyAgICAxLCAvLyBsbHZtLm1pcHMucHJlY3Iuc3JhLnBoLncKKyAgICAxLCAvLyBsbHZtLm1pcHMucHJlY3Iuc3JhLnIucGgudworICAgIDEsIC8vIGxsdm0ubWlwcy5wcmVjcnEucGgudworICAgIDEsIC8vIGxsdm0ubWlwcy5wcmVjcnEucWIucGgKKyAgICAzLCAvLyBsbHZtLm1pcHMucHJlY3JxLnJzLnBoLncKKyAgICAzLCAvLyBsbHZtLm1pcHMucHJlY3JxdS5zLnFiLnBoCisgICAgMSwgLy8gbGx2bS5taXBzLnByZXBlbmQKKyAgICAxLCAvLyBsbHZtLm1pcHMucmFkZHUudy5xYgorICAgIDE2LCAvLyBsbHZtLm1pcHMucmRkc3AKKyAgICAxLCAvLyBsbHZtLm1pcHMucmVwbC5waAorICAgIDEsIC8vIGxsdm0ubWlwcy5yZXBsLnFiCisgICAgMSwgLy8gbGx2bS5taXBzLnNhdC5zLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2F0LnMuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5zYXQucy5oCisgICAgMSwgLy8gbGx2bS5taXBzLnNhdC5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2F0LnUuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zYXQudS5kCisgICAgMSwgLy8gbGx2bS5taXBzLnNhdC51LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2F0LnUudworICAgIDEsIC8vIGxsdm0ubWlwcy5zaGYuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zaGYuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5zaGYudworICAgIDEsIC8vIGxsdm0ubWlwcy5zaGlsbworICAgIDMsIC8vIGxsdm0ubWlwcy5zaGxsLnBoCisgICAgMywgLy8gbGx2bS5taXBzLnNobGwucWIKKyAgICAzLCAvLyBsbHZtLm1pcHMuc2hsbC5zLnBoCisgICAgMywgLy8gbGx2bS5taXBzLnNobGwucy53CisgICAgMSwgLy8gbGx2bS5taXBzLnNocmEucGgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2hyYS5xYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zaHJhLnIucGgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2hyYS5yLnFiCisgICAgMSwgLy8gbGx2bS5taXBzLnNocmEuci53CisgICAgMSwgLy8gbGx2bS5taXBzLnNocmwucGgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2hybC5xYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zbGQuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zbGQuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5zbGQuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5zbGQudworICAgIDEsIC8vIGxsdm0ubWlwcy5zbGRpLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2xkaS5kCisgICAgMSwgLy8gbGx2bS5taXBzLnNsZGkuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5zbGRpLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2xsLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2xsLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2xsLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2xsLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2xsaS5iCisgICAgMSwgLy8gbGx2bS5taXBzLnNsbGkuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5zbGxpLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2xsaS53CisgICAgMSwgLy8gbGx2bS5taXBzLnNwbGF0LmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3BsYXQuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5zcGxhdC5oCisgICAgMSwgLy8gbGx2bS5taXBzLnNwbGF0LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3BsYXRpLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3BsYXRpLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3BsYXRpLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3BsYXRpLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JhLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JhLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JhLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JhLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JhaS5iCisgICAgMSwgLy8gbGx2bS5taXBzLnNyYWkuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5zcmFpLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JhaS53CisgICAgMSwgLy8gbGx2bS5taXBzLnNyYXIuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zcmFyLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Jhci5oCisgICAgMSwgLy8gbGx2bS5taXBzLnNyYXIudworICAgIDEsIC8vIGxsdm0ubWlwcy5zcmFyaS5iCisgICAgMSwgLy8gbGx2bS5taXBzLnNyYXJpLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JhcmkuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5zcmFyaS53CisgICAgMSwgLy8gbGx2bS5taXBzLnNybC5iCisgICAgMSwgLy8gbGx2bS5taXBzLnNybC5kCisgICAgMSwgLy8gbGx2bS5taXBzLnNybC5oCisgICAgMSwgLy8gbGx2bS5taXBzLnNybC53CisgICAgMSwgLy8gbGx2bS5taXBzLnNybGkuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zcmxpLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JsaS5oCisgICAgMSwgLy8gbGx2bS5taXBzLnNybGkudworICAgIDEsIC8vIGxsdm0ubWlwcy5zcmxyLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Jsci5kCisgICAgMSwgLy8gbGx2bS5taXBzLnNybHIuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5zcmxyLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JscmkuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zcmxyaS5kCisgICAgMSwgLy8gbGx2bS5taXBzLnNybHJpLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JscmkudworICAgIDIxLCAvLyBsbHZtLm1pcHMuc3QuYgorICAgIDIxLCAvLyBsbHZtLm1pcHMuc3QuZAorICAgIDIxLCAvLyBsbHZtLm1pcHMuc3QuaAorICAgIDIxLCAvLyBsbHZtLm1pcHMuc3QudworICAgIDEsIC8vIGxsdm0ubWlwcy5zdWJxLnBoCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnEucy5waAorICAgIDMsIC8vIGxsdm0ubWlwcy5zdWJxLnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5zdWJxaC5waAorICAgIDEsIC8vIGxsdm0ubWlwcy5zdWJxaC5yLnBoCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnFoLnIudworICAgIDEsIC8vIGxsdm0ubWlwcy5zdWJxaC53CisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnMucy5iCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnMucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnMucy5oCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnMucy53CisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnMudS5iCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnMudS5kCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnMudS5oCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnMudS53CisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnN1cy51LmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Vic3VzLnUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5zdWJzdXMudS5oCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnN1cy51LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Vic3V1LnMuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zdWJzdXUucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnN1dS5zLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Vic3V1LnMudworICAgIDMsIC8vIGxsdm0ubWlwcy5zdWJ1LnBoCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnUucWIKKyAgICAzLCAvLyBsbHZtLm1pcHMuc3VidS5zLnBoCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnUucy5xYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zdWJ1aC5xYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zdWJ1aC5yLnFiCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnYuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zdWJ2LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Vidi5oCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnYudworICAgIDEsIC8vIGxsdm0ubWlwcy5zdWJ2aS5iCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnZpLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3VidmkuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5zdWJ2aS53CisgICAgMSwgLy8gbGx2bS5taXBzLnZzaGYuYgorICAgIDEsIC8vIGxsdm0ubWlwcy52c2hmLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMudnNoZi5oCisgICAgMSwgLy8gbGx2bS5taXBzLnZzaGYudworICAgIDMsIC8vIGxsdm0ubWlwcy53cmRzcAorICAgIDEsIC8vIGxsdm0ubWlwcy54b3IudgorICAgIDEsIC8vIGxsdm0ubWlwcy54b3JpLmIKKyAgICAxLCAvLyBsbHZtLm52dm0uYWRkLnJtLmQKKyAgICAxLCAvLyBsbHZtLm52dm0uYWRkLnJtLmYKKyAgICAxLCAvLyBsbHZtLm52dm0uYWRkLnJtLmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLmFkZC5ybi5kCisgICAgMSwgLy8gbGx2bS5udnZtLmFkZC5ybi5mCisgICAgMSwgLy8gbGx2bS5udnZtLmFkZC5ybi5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5hZGQucnAuZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5hZGQucnAuZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5hZGQucnAuZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uYWRkLnJ6LmQKKyAgICAxLCAvLyBsbHZtLm52dm0uYWRkLnJ6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uYWRkLnJ6LmZ0ei5mCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMuYWRkLmdlbi5mLmN0YQorICAgIDE4LCAvLyBsbHZtLm52dm0uYXRvbWljLmFkZC5nZW4uZi5zeXMKKyAgICAxOCwgLy8gbGx2bS5udnZtLmF0b21pYy5hZGQuZ2VuLmkuY3RhCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMuYWRkLmdlbi5pLnN5cworICAgIDE4LCAvLyBsbHZtLm52dm0uYXRvbWljLmFuZC5nZW4uaS5jdGEKKyAgICAxOCwgLy8gbGx2bS5udnZtLmF0b21pYy5hbmQuZ2VuLmkuc3lzCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMuY2FzLmdlbi5pLmN0YQorICAgIDE4LCAvLyBsbHZtLm52dm0uYXRvbWljLmNhcy5nZW4uaS5zeXMKKyAgICAxOCwgLy8gbGx2bS5udnZtLmF0b21pYy5kZWMuZ2VuLmkuY3RhCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMuZGVjLmdlbi5pLnN5cworICAgIDE4LCAvLyBsbHZtLm52dm0uYXRvbWljLmV4Y2guZ2VuLmkuY3RhCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMuZXhjaC5nZW4uaS5zeXMKKyAgICAxOCwgLy8gbGx2bS5udnZtLmF0b21pYy5pbmMuZ2VuLmkuY3RhCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMuaW5jLmdlbi5pLnN5cworICAgIDE4LCAvLyBsbHZtLm52dm0uYXRvbWljLmxvYWQuYWRkLmYzMgorICAgIDE4LCAvLyBsbHZtLm52dm0uYXRvbWljLmxvYWQuYWRkLmY2NAorICAgIDE4LCAvLyBsbHZtLm52dm0uYXRvbWljLmxvYWQuZGVjLjMyCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMubG9hZC5pbmMuMzIKKyAgICAxOCwgLy8gbGx2bS5udnZtLmF0b21pYy5tYXguZ2VuLmkuY3RhCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMubWF4Lmdlbi5pLnN5cworICAgIDE4LCAvLyBsbHZtLm52dm0uYXRvbWljLm1pbi5nZW4uaS5jdGEKKyAgICAxOCwgLy8gbGx2bS5udnZtLmF0b21pYy5taW4uZ2VuLmkuc3lzCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMub3IuZ2VuLmkuY3RhCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMub3IuZ2VuLmkuc3lzCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMueG9yLmdlbi5pLmN0YQorICAgIDE4LCAvLyBsbHZtLm52dm0uYXRvbWljLnhvci5nZW4uaS5zeXMKKyAgICAzMywgLy8gbGx2bS5udnZtLmJhci5zeW5jCisgICAgMzMsIC8vIGxsdm0ubnZ2bS5iYXIud2FycC5zeW5jCisgICAgMzMsIC8vIGxsdm0ubnZ2bS5iYXJyaWVyCisgICAgMzMsIC8vIGxsdm0ubnZ2bS5iYXJyaWVyLm4KKyAgICAzMywgLy8gbGx2bS5udnZtLmJhcnJpZXIuc3luYworICAgIDMzLCAvLyBsbHZtLm52dm0uYmFycmllci5zeW5jLmNudAorICAgIDMzLCAvLyBsbHZtLm52dm0uYmFycmllcjAKKyAgICAzMywgLy8gbGx2bS5udnZtLmJhcnJpZXIwLmFuZAorICAgIDMzLCAvLyBsbHZtLm52dm0uYmFycmllcjAub3IKKyAgICAzMywgLy8gbGx2bS5udnZtLmJhcnJpZXIwLnBvcGMKKyAgICAxLCAvLyBsbHZtLm52dm0uYml0Y2FzdC5kMmxsCisgICAgMSwgLy8gbGx2bS5udnZtLmJpdGNhc3QuZjJpCisgICAgMSwgLy8gbGx2bS5udnZtLmJpdGNhc3QuaTJmCisgICAgMSwgLy8gbGx2bS5udnZtLmJpdGNhc3QubGwyZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5jZWlsLmQKKyAgICAxLCAvLyBsbHZtLm52dm0uY2VpbC5mCisgICAgMSwgLy8gbGx2bS5udnZtLmNlaWwuZnR6LmYKKyAgICAzLCAvLyBsbHZtLm52dm0uY29tcGlsZXIuZXJyb3IKKyAgICAzLCAvLyBsbHZtLm52dm0uY29tcGlsZXIud2FybgorICAgIDEsIC8vIGxsdm0ubnZ2bS5jb3MuYXBwcm94LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uY29zLmFwcHJveC5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMmYucm0KKyAgICAxLCAvLyBsbHZtLm52dm0uZDJmLnJtLmZ0egorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMmYucm4KKyAgICAxLCAvLyBsbHZtLm52dm0uZDJmLnJuLmZ0egorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMmYucnAKKyAgICAxLCAvLyBsbHZtLm52dm0uZDJmLnJwLmZ0egorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMmYucnoKKyAgICAxLCAvLyBsbHZtLm52dm0uZDJmLnJ6LmZ0egorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMmkuaGkKKyAgICAxLCAvLyBsbHZtLm52dm0uZDJpLmxvCisgICAgMSwgLy8gbGx2bS5udnZtLmQyaS5ybQorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMmkucm4KKyAgICAxLCAvLyBsbHZtLm52dm0uZDJpLnJwCisgICAgMSwgLy8gbGx2bS5udnZtLmQyaS5yegorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMmxsLnJtCisgICAgMSwgLy8gbGx2bS5udnZtLmQybGwucm4KKyAgICAxLCAvLyBsbHZtLm52dm0uZDJsbC5ycAorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMmxsLnJ6CisgICAgMSwgLy8gbGx2bS5udnZtLmQydWkucm0KKyAgICAxLCAvLyBsbHZtLm52dm0uZDJ1aS5ybgorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMnVpLnJwCisgICAgMSwgLy8gbGx2bS5udnZtLmQydWkucnoKKyAgICAxLCAvLyBsbHZtLm52dm0uZDJ1bGwucm0KKyAgICAxLCAvLyBsbHZtLm52dm0uZDJ1bGwucm4KKyAgICAxLCAvLyBsbHZtLm52dm0uZDJ1bGwucnAKKyAgICAxLCAvLyBsbHZtLm52dm0uZDJ1bGwucnoKKyAgICAxLCAvLyBsbHZtLm52dm0uZGl2LmFwcHJveC5mCisgICAgMSwgLy8gbGx2bS5udnZtLmRpdi5hcHByb3guZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZGl2LnJtLmQKKyAgICAxLCAvLyBsbHZtLm52dm0uZGl2LnJtLmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZGl2LnJtLmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLmRpdi5ybi5kCisgICAgMSwgLy8gbGx2bS5udnZtLmRpdi5ybi5mCisgICAgMSwgLy8gbGx2bS5udnZtLmRpdi5ybi5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5kaXYucnAuZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5kaXYucnAuZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5kaXYucnAuZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZGl2LnJ6LmQKKyAgICAxLCAvLyBsbHZtLm52dm0uZGl2LnJ6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZGl2LnJ6LmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLmV4Mi5hcHByb3guZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5leDIuYXBwcm94LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZXgyLmFwcHJveC5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMmgucm4KKyAgICAxLCAvLyBsbHZtLm52dm0uZjJoLnJuLmZ0egorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMmkucm0KKyAgICAxLCAvLyBsbHZtLm52dm0uZjJpLnJtLmZ0egorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMmkucm4KKyAgICAxLCAvLyBsbHZtLm52dm0uZjJpLnJuLmZ0egorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMmkucnAKKyAgICAxLCAvLyBsbHZtLm52dm0uZjJpLnJwLmZ0egorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMmkucnoKKyAgICAxLCAvLyBsbHZtLm52dm0uZjJpLnJ6LmZ0egorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMmxsLnJtCisgICAgMSwgLy8gbGx2bS5udnZtLmYybGwucm0uZnR6CisgICAgMSwgLy8gbGx2bS5udnZtLmYybGwucm4KKyAgICAxLCAvLyBsbHZtLm52dm0uZjJsbC5ybi5mdHoKKyAgICAxLCAvLyBsbHZtLm52dm0uZjJsbC5ycAorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMmxsLnJwLmZ0egorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMmxsLnJ6CisgICAgMSwgLy8gbGx2bS5udnZtLmYybGwucnouZnR6CisgICAgMSwgLy8gbGx2bS5udnZtLmYydWkucm0KKyAgICAxLCAvLyBsbHZtLm52dm0uZjJ1aS5ybS5mdHoKKyAgICAxLCAvLyBsbHZtLm52dm0uZjJ1aS5ybgorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMnVpLnJuLmZ0egorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMnVpLnJwCisgICAgMSwgLy8gbGx2bS5udnZtLmYydWkucnAuZnR6CisgICAgMSwgLy8gbGx2bS5udnZtLmYydWkucnoKKyAgICAxLCAvLyBsbHZtLm52dm0uZjJ1aS5yei5mdHoKKyAgICAxLCAvLyBsbHZtLm52dm0uZjJ1bGwucm0KKyAgICAxLCAvLyBsbHZtLm52dm0uZjJ1bGwucm0uZnR6CisgICAgMSwgLy8gbGx2bS5udnZtLmYydWxsLnJuCisgICAgMSwgLy8gbGx2bS5udnZtLmYydWxsLnJuLmZ0egorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMnVsbC5ycAorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMnVsbC5ycC5mdHoKKyAgICAxLCAvLyBsbHZtLm52dm0uZjJ1bGwucnoKKyAgICAxLCAvLyBsbHZtLm52dm0uZjJ1bGwucnouZnR6CisgICAgMSwgLy8gbGx2bS5udnZtLmZhYnMuZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5mYWJzLmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZmFicy5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5mbG9vci5kCisgICAgMSwgLy8gbGx2bS5udnZtLmZsb29yLmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZmxvb3IuZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZm1hLnJtLmQKKyAgICAxLCAvLyBsbHZtLm52dm0uZm1hLnJtLmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZm1hLnJtLmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLmZtYS5ybi5kCisgICAgMSwgLy8gbGx2bS5udnZtLmZtYS5ybi5mCisgICAgMSwgLy8gbGx2bS5udnZtLmZtYS5ybi5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5mbWEucnAuZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5mbWEucnAuZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5mbWEucnAuZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZm1hLnJ6LmQKKyAgICAxLCAvLyBsbHZtLm52dm0uZm1hLnJ6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZm1hLnJ6LmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLmZtYXguZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5mbWF4LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZm1heC5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5mbWluLmQKKyAgICAxLCAvLyBsbHZtLm52dm0uZm1pbi5mCisgICAgMSwgLy8gbGx2bS5udnZtLmZtaW4uZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZm5zCisgICAgMSwgLy8gbGx2bS5udnZtLmkyZC5ybQorICAgIDEsIC8vIGxsdm0ubnZ2bS5pMmQucm4KKyAgICAxLCAvLyBsbHZtLm52dm0uaTJkLnJwCisgICAgMSwgLy8gbGx2bS5udnZtLmkyZC5yegorICAgIDEsIC8vIGxsdm0ubnZ2bS5pMmYucm0KKyAgICAxLCAvLyBsbHZtLm52dm0uaTJmLnJuCisgICAgMSwgLy8gbGx2bS5udnZtLmkyZi5ycAorICAgIDEsIC8vIGxsdm0ubnZ2bS5pMmYucnoKKyAgICAxLCAvLyBsbHZtLm52dm0uaXNzcGFjZXAuY29uc3QKKyAgICAxLCAvLyBsbHZtLm52dm0uaXNzcGFjZXAuZ2xvYmFsCisgICAgMSwgLy8gbGx2bS5udnZtLmlzc3BhY2VwLmxvY2FsCisgICAgMSwgLy8gbGx2bS5udnZtLmlzc3BhY2VwLnNoYXJlZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5pc3R5cGVwLnNhbXBsZXIKKyAgICAxLCAvLyBsbHZtLm52dm0uaXN0eXBlcC5zdXJmYWNlCisgICAgMSwgLy8gbGx2bS5udnZtLmlzdHlwZXAudGV4dHVyZQorICAgIDM3LCAvLyBsbHZtLm52dm0ubGRnLmdsb2JhbC5mCisgICAgMzcsIC8vIGxsdm0ubnZ2bS5sZGcuZ2xvYmFsLmkKKyAgICAzNywgLy8gbGx2bS5udnZtLmxkZy5nbG9iYWwucAorICAgIDM3LCAvLyBsbHZtLm52dm0ubGR1Lmdsb2JhbC5mCisgICAgMzcsIC8vIGxsdm0ubnZ2bS5sZHUuZ2xvYmFsLmkKKyAgICAzNywgLy8gbGx2bS5udnZtLmxkdS5nbG9iYWwucAorICAgIDEsIC8vIGxsdm0ubnZ2bS5sZzIuYXBwcm94LmQKKyAgICAxLCAvLyBsbHZtLm52dm0ubGcyLmFwcHJveC5mCisgICAgMSwgLy8gbGx2bS5udnZtLmxnMi5hcHByb3guZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0ubGwyZC5ybQorICAgIDEsIC8vIGxsdm0ubnZ2bS5sbDJkLnJuCisgICAgMSwgLy8gbGx2bS5udnZtLmxsMmQucnAKKyAgICAxLCAvLyBsbHZtLm52dm0ubGwyZC5yegorICAgIDEsIC8vIGxsdm0ubnZ2bS5sbDJmLnJtCisgICAgMSwgLy8gbGx2bS5udnZtLmxsMmYucm4KKyAgICAxLCAvLyBsbHZtLm52dm0ubGwyZi5ycAorICAgIDEsIC8vIGxsdm0ubnZ2bS5sbDJmLnJ6CisgICAgMSwgLy8gbGx2bS5udnZtLmxvaGkuaTJkCisgICAgMzgsIC8vIGxsdm0ubnZ2bS5tYXRjaC5hbGwuc3luYy5pMzJwCisgICAgMzgsIC8vIGxsdm0ubnZ2bS5tYXRjaC5hbGwuc3luYy5pNjRwCisgICAgMzgsIC8vIGxsdm0ubnZ2bS5tYXRjaC5hbnkuc3luYy5pMzIKKyAgICAzOCwgLy8gbGx2bS5udnZtLm1hdGNoLmFueS5zeW5jLmk2NAorICAgIDMsIC8vIGxsdm0ubnZ2bS5tZW1iYXIuY3RhCisgICAgMywgLy8gbGx2bS5udnZtLm1lbWJhci5nbAorICAgIDMsIC8vIGxsdm0ubnZ2bS5tZW1iYXIuc3lzCisgICAgMSwgLy8gbGx2bS5udnZtLm1vdmUuZG91YmxlCisgICAgMSwgLy8gbGx2bS5udnZtLm1vdmUuZmxvYXQKKyAgICAxLCAvLyBsbHZtLm52dm0ubW92ZS5pMTYKKyAgICAxLCAvLyBsbHZtLm52dm0ubW92ZS5pMzIKKyAgICAxLCAvLyBsbHZtLm52dm0ubW92ZS5pNjQKKyAgICAxMiwgLy8gbGx2bS5udnZtLm1vdmUucHRyCisgICAgMSwgLy8gbGx2bS5udnZtLm11bC5ybS5kCisgICAgMSwgLy8gbGx2bS5udnZtLm11bC5ybS5mCisgICAgMSwgLy8gbGx2bS5udnZtLm11bC5ybS5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5tdWwucm4uZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5tdWwucm4uZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5tdWwucm4uZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0ubXVsLnJwLmQKKyAgICAxLCAvLyBsbHZtLm52dm0ubXVsLnJwLmYKKyAgICAxLCAvLyBsbHZtLm52dm0ubXVsLnJwLmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLm11bC5yei5kCisgICAgMSwgLy8gbGx2bS5udnZtLm11bC5yei5mCisgICAgMSwgLy8gbGx2bS5udnZtLm11bC5yei5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5tdWwyNC5pCisgICAgMSwgLy8gbGx2bS5udnZtLm11bDI0LnVpCisgICAgMSwgLy8gbGx2bS5udnZtLm11bGhpLmkKKyAgICAxLCAvLyBsbHZtLm52dm0ubXVsaGkubGwKKyAgICAxLCAvLyBsbHZtLm52dm0ubXVsaGkudWkKKyAgICAxLCAvLyBsbHZtLm52dm0ubXVsaGkudWxsCisgICAgMSwgLy8gbGx2bS5udnZtLnBybXQKKyAgICAxLCAvLyBsbHZtLm52dm0ucHRyLmNvbnN0YW50LnRvLmdlbgorICAgIDEsIC8vIGxsdm0ubnZ2bS5wdHIuZ2VuLnRvLmNvbnN0YW50CisgICAgMSwgLy8gbGx2bS5udnZtLnB0ci5nZW4udG8uZ2xvYmFsCisgICAgMSwgLy8gbGx2bS5udnZtLnB0ci5nZW4udG8ubG9jYWwKKyAgICAxLCAvLyBsbHZtLm52dm0ucHRyLmdlbi50by5wYXJhbQorICAgIDEsIC8vIGxsdm0ubnZ2bS5wdHIuZ2VuLnRvLnNoYXJlZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5wdHIuZ2xvYmFsLnRvLmdlbgorICAgIDEsIC8vIGxsdm0ubnZ2bS5wdHIubG9jYWwudG8uZ2VuCisgICAgMSwgLy8gbGx2bS5udnZtLnB0ci5zaGFyZWQudG8uZ2VuCisgICAgMSwgLy8gbGx2bS5udnZtLnJjcC5hcHByb3guZnR6LmQKKyAgICAxLCAvLyBsbHZtLm52dm0ucmNwLnJtLmQKKyAgICAxLCAvLyBsbHZtLm52dm0ucmNwLnJtLmYKKyAgICAxLCAvLyBsbHZtLm52dm0ucmNwLnJtLmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLnJjcC5ybi5kCisgICAgMSwgLy8gbGx2bS5udnZtLnJjcC5ybi5mCisgICAgMSwgLy8gbGx2bS5udnZtLnJjcC5ybi5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5yY3AucnAuZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yY3AucnAuZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5yY3AucnAuZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0ucmNwLnJ6LmQKKyAgICAxLCAvLyBsbHZtLm52dm0ucmNwLnJ6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0ucmNwLnJ6LmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuY2xvY2sKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5jbG9jazY0CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuY3RhaWQudworICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmN0YWlkLngKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5jdGFpZC55CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuY3RhaWQuegorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzAKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTAKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxMQorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzEyCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTMKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxNAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzE1CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTYKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxNworICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzE4CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTkKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjAKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyMQorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzIyCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjMKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyNAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzI1CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjYKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyNworICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzI4CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjkKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWczCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMzAKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWczMQorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzQKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc1CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnNgorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzcKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc4CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnOQorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmdyaWRpZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmxhbmVpZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmxhbmVtYXNrLmVxCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubGFuZW1hc2suZ2UKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5sYW5lbWFzay5ndAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmxhbmVtYXNrLmxlCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubGFuZW1hc2subHQKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5uY3RhaWQudworICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLm5jdGFpZC54CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubmN0YWlkLnkKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5uY3RhaWQuegorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLm5zbWlkCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubnRpZC53CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubnRpZC54CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubnRpZC55CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubnRpZC56CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubndhcnBpZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnBtMAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnBtMQorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnBtMgorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnBtMworICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnNtaWQKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy50aWQudworICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnRpZC54CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcudGlkLnkKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy50aWQuegorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLndhcnBpZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLndhcnBzaXplCisgICAgMSwgLy8gbGx2bS5udnZtLnJlZmxlY3QKKyAgICAxLCAvLyBsbHZtLm52dm0ucm90YXRlLmIzMgorICAgIDEsIC8vIGxsdm0ubnZ2bS5yb3RhdGUuYjY0CisgICAgMSwgLy8gbGx2bS5udnZtLnJvdGF0ZS5yaWdodC5iNjQKKyAgICAxLCAvLyBsbHZtLm52dm0ucm91bmQuZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yb3VuZC5mCisgICAgMSwgLy8gbGx2bS5udnZtLnJvdW5kLmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLnJzcXJ0LmFwcHJveC5kCisgICAgMSwgLy8gbGx2bS5udnZtLnJzcXJ0LmFwcHJveC5mCisgICAgMSwgLy8gbGx2bS5udnZtLnJzcXJ0LmFwcHJveC5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5zYWQuaQorICAgIDEsIC8vIGxsdm0ubnZ2bS5zYWQudWkKKyAgICAxLCAvLyBsbHZtLm52dm0uc2F0dXJhdGUuZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5zYXR1cmF0ZS5mCisgICAgMSwgLy8gbGx2bS5udnZtLnNhdHVyYXRlLmZ0ei5mCisgICAgMzgsIC8vIGxsdm0ubnZ2bS5zaGZsLmJmbHkuZjMyCisgICAgMzgsIC8vIGxsdm0ubnZ2bS5zaGZsLmJmbHkuaTMyCisgICAgMzgsIC8vIGxsdm0ubnZ2bS5zaGZsLmRvd24uZjMyCisgICAgMzgsIC8vIGxsdm0ubnZ2bS5zaGZsLmRvd24uaTMyCisgICAgMzgsIC8vIGxsdm0ubnZ2bS5zaGZsLmlkeC5mMzIKKyAgICAzOCwgLy8gbGx2bS5udnZtLnNoZmwuaWR4LmkzMgorICAgIDM4LCAvLyBsbHZtLm52dm0uc2hmbC5zeW5jLmJmbHkuZjMyCisgICAgMzgsIC8vIGxsdm0ubnZ2bS5zaGZsLnN5bmMuYmZseS5pMzIKKyAgICAzOCwgLy8gbGx2bS5udnZtLnNoZmwuc3luYy5kb3duLmYzMgorICAgIDM4LCAvLyBsbHZtLm52dm0uc2hmbC5zeW5jLmRvd24uaTMyCisgICAgMzgsIC8vIGxsdm0ubnZ2bS5zaGZsLnN5bmMuaWR4LmYzMgorICAgIDM4LCAvLyBsbHZtLm52dm0uc2hmbC5zeW5jLmlkeC5pMzIKKyAgICAzOCwgLy8gbGx2bS5udnZtLnNoZmwuc3luYy51cC5mMzIKKyAgICAzOCwgLy8gbGx2bS5udnZtLnNoZmwuc3luYy51cC5pMzIKKyAgICAzOCwgLy8gbGx2bS5udnZtLnNoZmwudXAuZjMyCisgICAgMzgsIC8vIGxsdm0ubnZ2bS5zaGZsLnVwLmkzMgorICAgIDEsIC8vIGxsdm0ubnZ2bS5zaW4uYXBwcm94LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uc2luLmFwcHJveC5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5zcXJ0LmFwcHJveC5mCisgICAgMSwgLy8gbGx2bS5udnZtLnNxcnQuYXBwcm94LmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLnNxcnQuZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5zcXJ0LnJtLmQKKyAgICAxLCAvLyBsbHZtLm52dm0uc3FydC5ybS5mCisgICAgMSwgLy8gbGx2bS5udnZtLnNxcnQucm0uZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uc3FydC5ybi5kCisgICAgMSwgLy8gbGx2bS5udnZtLnNxcnQucm4uZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5zcXJ0LnJuLmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLnNxcnQucnAuZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5zcXJ0LnJwLmYKKyAgICAxLCAvLyBsbHZtLm52dm0uc3FydC5ycC5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5zcXJ0LnJ6LmQKKyAgICAxLCAvLyBsbHZtLm52dm0uc3FydC5yei5mCisgICAgMSwgLy8gbGx2bS5udnZtLnNxcnQucnouZnR6LmYKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LmkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5Lmk2NC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5Lmk2NC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTY0Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5Lmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52MmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52Mmk2NC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTY0LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52Mmk2NC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5pMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5pMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTY0LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTY0LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5pNjQuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC52MmkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnYyaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC52MmkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQudjJpMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC52MmkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQudjJpMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnYyaTY0LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQudjJpNjQudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnYyaTY0Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC52Mmk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQudjJpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQudjJpOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQudjRpMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC52NGkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQudjRpMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnY0aTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQudjRpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnY0aTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC52NGk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQudjRpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQudjRpOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LmkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LmkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pNjQuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pNjQudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5Lmk2NC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52MmkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52MmkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpNjQuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52Mmk2NC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpNjQuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52Mmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52Mmk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5pMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5pMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuaTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5pMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmk2NC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmk2NC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuaTY0Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5pOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5pOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQudjJpMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC52MmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQudjJpMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnYyaTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQudjJpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnYyaTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC52Mmk2NC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnYyaTY0LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC52Mmk2NC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQudjJpOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnYyaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnYyaTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnY0aTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQudjRpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnY0aTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC52NGkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnY0aTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC52NGkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQudjRpOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnY0aTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnY0aTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLmkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC5pMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC5pMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLmkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTY0LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTY0LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC5pNjQuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLmk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLmk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC52MmkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnYyaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC52MmkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QudjJpMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC52MmkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QudjJpMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnYyaTY0LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QudjJpNjQudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnYyaTY0Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC52Mmk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QudjJpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QudjJpOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QudjRpMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC52NGkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QudjRpMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnY0aTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QudjRpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnY0aTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC52NGk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QudjRpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QudjRpOC56ZXJvCisgICAgMSwgLy8gbGx2bS5udnZtLnN1cS5hcnJheS5zaXplCisgICAgMSwgLy8gbGx2bS5udnZtLnN1cS5jaGFubmVsLmRhdGEudHlwZQorICAgIDEsIC8vIGxsdm0ubnZ2bS5zdXEuY2hhbm5lbC5vcmRlcgorICAgIDEsIC8vIGxsdm0ubnZ2bS5zdXEuZGVwdGgKKyAgICAxLCAvLyBsbHZtLm52dm0uc3VxLmhlaWdodAorICAgIDEsIC8vIGxsdm0ubnZ2bS5zdXEud2lkdGgKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTY0LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pNjQudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTY0Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5Lmk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52MmkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTY0LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52Mmk2NC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52Mmk2NC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52Mmk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52Mmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuaTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5pMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuaTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5pNjQuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmk2NC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5pNjQuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuaTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52MmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52MmkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52MmkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpNjQuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTY0LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTY0Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52NGkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5Lmk2NC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTY0LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5Lmk2NC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52MmkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52MmkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk2NC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpNjQudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpNjQuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5pMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5pMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuaTY0LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5pNjQudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuaTY0Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5pOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5pOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52MmkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTY0LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52Mmk2NC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52Mmk2NC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52Mmk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52Mmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52NGkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52NGkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52NGk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52NGk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QuaTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC5pMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QuaTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLmkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QuaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLmkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC5pNjQuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLmk2NC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC5pNjQuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QuaTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLmk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52MmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52MmkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52MmkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpNjQuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTY0LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTY0Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52NGkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS5pMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkuaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5Lmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LnYyaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LnYyaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LnYyaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjRpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjRpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjRpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4xZC5pMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLnYyaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLnYyaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLnYyaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQudjRpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQudjRpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQudjRpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS5pMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkuaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5Lmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LnYyaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LnYyaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LnYyaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjRpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjRpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjRpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4yZC5pMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLnYyaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLnYyaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLnYyaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQudjRpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQudjRpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQudjRpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4zZC5pMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuM2QuaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjNkLmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjNkLnYyaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjNkLnYyaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjNkLnYyaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuM2QudjRpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuM2QudjRpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuM2QudjRpOC50cmFwCisgICAgMSwgLy8gbGx2bS5udnZtLnN3YXAubG8uaGkuYjY0CisgICAgMywgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS5ncmFkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkuZ3JhZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjFkLmFycmF5LmdyYWQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS5sZXZlbC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjFkLmFycmF5LmxldmVsLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkubGV2ZWwudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjFkLmFycmF5LnY0ZjMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS52NHMzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjFkLmFycmF5LnY0dTMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjR1MzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4xZC5ncmFkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMWQuZ3JhZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjFkLmdyYWQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4xZC5sZXZlbC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjFkLmxldmVsLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMWQubGV2ZWwudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4xZC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjFkLnY0ZjMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMWQudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4xZC52NHMzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjFkLnY0dTMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMWQudjR1MzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS5ncmFkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkuZ3JhZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjJkLmFycmF5LmdyYWQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS5sZXZlbC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjJkLmFycmF5LmxldmVsLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkubGV2ZWwudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjJkLmFycmF5LnY0ZjMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS52NHMzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjJkLmFycmF5LnY0dTMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjR1MzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4yZC5ncmFkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMmQuZ3JhZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjJkLmdyYWQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4yZC5sZXZlbC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjJkLmxldmVsLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMmQubGV2ZWwudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4yZC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjJkLnY0ZjMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMmQudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4yZC52NHMzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjJkLnY0dTMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMmQudjR1MzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4zZC5ncmFkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguM2QuZ3JhZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjNkLmdyYWQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4zZC5sZXZlbC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjNkLmxldmVsLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguM2QubGV2ZWwudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4zZC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjNkLnY0ZjMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguM2QudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4zZC52NHMzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjNkLnY0dTMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguM2QudjR1MzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC5jdWJlLmFycmF5LmxldmVsLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguY3ViZS5hcnJheS5sZXZlbC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LmN1YmUuYXJyYXkubGV2ZWwudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC5jdWJlLmFycmF5LnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguY3ViZS5hcnJheS52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LmN1YmUuYXJyYXkudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC5jdWJlLmxldmVsLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguY3ViZS5sZXZlbC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LmN1YmUubGV2ZWwudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC5jdWJlLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguY3ViZS52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LmN1YmUudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LmdyYWQudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LmdyYWQudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LmdyYWQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LmxldmVsLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS5sZXZlbC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkubGV2ZWwudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS52NGYzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LnY0czMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkudjR1MzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmdyYWQudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmdyYWQudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmdyYWQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmxldmVsLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5sZXZlbC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQubGV2ZWwudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC52NGYzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLnY0czMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQudjR1MzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LmdyYWQudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LmdyYWQudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LmdyYWQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LmxldmVsLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS5sZXZlbC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkubGV2ZWwudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS52NGYzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LnY0czMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkudjR1MzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmdyYWQudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmdyYWQudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmdyYWQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmxldmVsLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5sZXZlbC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQubGV2ZWwudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC52NGYzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0czMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQudjR1MzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmdyYWQudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmdyYWQudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmdyYWQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmxldmVsLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC5sZXZlbC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QubGV2ZWwudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjNkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC52NGYzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjNkLnY0czMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QudjR1MzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUuYXJyYXkubGV2ZWwudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUuYXJyYXkubGV2ZWwudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUuYXJyYXkubGV2ZWwudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUuYXJyYXkudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUuYXJyYXkudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUuYXJyYXkudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUubGV2ZWwudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUubGV2ZWwudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUubGV2ZWwudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUudjR1MzIuZjMyCisgICAgMSwgLy8gbGx2bS5udnZtLnRleHN1cmYuaGFuZGxlCisgICAgMSwgLy8gbGx2bS5udnZtLnRleHN1cmYuaGFuZGxlLmludGVybmFsCisgICAgMywgLy8gbGx2bS5udnZtLnRsZDQuYS4yZC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGxkNC5hLjJkLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50bGQ0LmEuMmQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRsZDQuYi4yZC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGxkNC5iLjJkLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50bGQ0LmIuMmQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRsZDQuZy4yZC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGxkNC5nLjJkLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50bGQ0LmcuMmQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRsZDQuci4yZC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGxkNC5yLjJkLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50bGQ0LnIuMmQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRsZDQudW5pZmllZC5hLjJkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuYS4yZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGxkNC51bmlmaWVkLmEuMmQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRsZDQudW5pZmllZC5iLjJkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuYi4yZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGxkNC51bmlmaWVkLmIuMmQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRsZDQudW5pZmllZC5nLjJkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuZy4yZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGxkNC51bmlmaWVkLmcuMmQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRsZDQudW5pZmllZC5yLjJkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuci4yZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGxkNC51bmlmaWVkLnIuMmQudjR1MzIuZjMyCisgICAgMSwgLy8gbGx2bS5udnZtLnRydW5jLmQKKyAgICAxLCAvLyBsbHZtLm52dm0udHJ1bmMuZgorICAgIDEsIC8vIGxsdm0ubnZ2bS50cnVuYy5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS50eHEuYXJyYXkuc2l6ZQorICAgIDEsIC8vIGxsdm0ubnZ2bS50eHEuY2hhbm5lbC5kYXRhLnR5cGUKKyAgICAxLCAvLyBsbHZtLm52dm0udHhxLmNoYW5uZWwub3JkZXIKKyAgICAxLCAvLyBsbHZtLm52dm0udHhxLmRlcHRoCisgICAgMSwgLy8gbGx2bS5udnZtLnR4cS5oZWlnaHQKKyAgICAxLCAvLyBsbHZtLm52dm0udHhxLm51bS5taXBtYXAubGV2ZWxzCisgICAgMSwgLy8gbGx2bS5udnZtLnR4cS5udW0uc2FtcGxlcworICAgIDEsIC8vIGxsdm0ubnZ2bS50eHEud2lkdGgKKyAgICAxLCAvLyBsbHZtLm52dm0udWkyZC5ybQorICAgIDEsIC8vIGxsdm0ubnZ2bS51aTJkLnJuCisgICAgMSwgLy8gbGx2bS5udnZtLnVpMmQucnAKKyAgICAxLCAvLyBsbHZtLm52dm0udWkyZC5yegorICAgIDEsIC8vIGxsdm0ubnZ2bS51aTJmLnJtCisgICAgMSwgLy8gbGx2bS5udnZtLnVpMmYucm4KKyAgICAxLCAvLyBsbHZtLm52dm0udWkyZi5ycAorICAgIDEsIC8vIGxsdm0ubnZ2bS51aTJmLnJ6CisgICAgMSwgLy8gbGx2bS5udnZtLnVsbDJkLnJtCisgICAgMSwgLy8gbGx2bS5udnZtLnVsbDJkLnJuCisgICAgMSwgLy8gbGx2bS5udnZtLnVsbDJkLnJwCisgICAgMSwgLy8gbGx2bS5udnZtLnVsbDJkLnJ6CisgICAgMSwgLy8gbGx2bS5udnZtLnVsbDJmLnJtCisgICAgMSwgLy8gbGx2bS5udnZtLnVsbDJmLnJuCisgICAgMSwgLy8gbGx2bS5udnZtLnVsbDJmLnJwCisgICAgMSwgLy8gbGx2bS5udnZtLnVsbDJmLnJ6CisgICAgMzgsIC8vIGxsdm0ubnZ2bS52b3RlLmFsbAorICAgIDM4LCAvLyBsbHZtLm52dm0udm90ZS5hbGwuc3luYworICAgIDM4LCAvLyBsbHZtLm52dm0udm90ZS5hbnkKKyAgICAzOCwgLy8gbGx2bS5udnZtLnZvdGUuYW55LnN5bmMKKyAgICAzOCwgLy8gbGx2bS5udnZtLnZvdGUuYmFsbG90CisgICAgMzgsIC8vIGxsdm0ubnZ2bS52b3RlLmJhbGxvdC5zeW5jCisgICAgMzgsIC8vIGxsdm0ubnZ2bS52b3RlLnVuaQorICAgIDM4LCAvLyBsbHZtLm52dm0udm90ZS51bmkuc3luYworICAgIDEzLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5hLmNvbC5mMTYKKyAgICAxMywgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYS5jb2wuc3RyaWRlLmYxNgorICAgIDEzLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5hLnJvdy5mMTYKKyAgICAxMywgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYS5yb3cuc3RyaWRlLmYxNgorICAgIDEzLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5iLmNvbC5mMTYKKyAgICAxMywgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYi5jb2wuc3RyaWRlLmYxNgorICAgIDEzLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5iLnJvdy5mMTYKKyAgICAxMywgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYi5yb3cuc3RyaWRlLmYxNgorICAgIDEzLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5jLmNvbC5mMTYKKyAgICAxMywgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYy5jb2wuZjMyCisgICAgMTMsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmMuY29sLnN0cmlkZS5mMTYKKyAgICAxMywgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYy5jb2wuc3RyaWRlLmYzMgorICAgIDEzLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5jLnJvdy5mMTYKKyAgICAxMywgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYy5yb3cuZjMyCisgICAgMTMsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmMucm93LnN0cmlkZS5mMTYKKyAgICAxMywgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYy5yb3cuc3RyaWRlLmYzMgorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLmNvbC5mMTYuZjE2CisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wuY29sLmYxNi5mMTYuc2F0ZmluaXRlCisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wuY29sLmYxNi5mMzIKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5jb2wuZjE2LmYzMi5zYXRmaW5pdGUKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5jb2wuZjMyLmYxNgorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLmNvbC5mMzIuZjE2LnNhdGZpbml0ZQorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLmNvbC5mMzIuZjMyCisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wuY29sLmYzMi5mMzIuc2F0ZmluaXRlCisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wucm93LmYxNi5mMTYKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5yb3cuZjE2LmYxNi5zYXRmaW5pdGUKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5yb3cuZjE2LmYzMgorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLnJvdy5mMTYuZjMyLnNhdGZpbml0ZQorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLnJvdy5mMzIuZjE2CisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wucm93LmYzMi5mMTYuc2F0ZmluaXRlCisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wucm93LmYzMi5mMzIKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5yb3cuZjMyLmYzMi5zYXRmaW5pdGUKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5jb2wuZjE2LmYxNgorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMTYuZjE2LnNhdGZpbml0ZQorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMTYuZjMyCisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cuY29sLmYxNi5mMzIuc2F0ZmluaXRlCisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cuY29sLmYzMi5mMTYKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5jb2wuZjMyLmYxNi5zYXRmaW5pdGUKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5jb2wuZjMyLmYzMgorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMzIuZjMyLnNhdGZpbml0ZQorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LnJvdy5mMTYuZjE2CisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cucm93LmYxNi5mMTYuc2F0ZmluaXRlCisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cucm93LmYxNi5mMzIKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5yb3cuZjE2LmYzMi5zYXRmaW5pdGUKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5yb3cuZjMyLmYxNgorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LnJvdy5mMzIuZjE2LnNhdGZpbml0ZQorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LnJvdy5mMzIuZjMyCisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cucm93LmYzMi5mMzIuc2F0ZmluaXRlCisgICAgMzksIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5zdG9yZS5kLmNvbC5mMTYKKyAgICAzOSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LnN0b3JlLmQuY29sLmYzMgorICAgIDM5LCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYuc3RvcmUuZC5jb2wuc3RyaWRlLmYxNgorICAgIDM5LCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYuc3RvcmUuZC5jb2wuc3RyaWRlLmYzMgorICAgIDM5LCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYuc3RvcmUuZC5yb3cuZjE2CisgICAgMzksIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5zdG9yZS5kLnJvdy5mMzIKKyAgICAzOSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LnN0b3JlLmQucm93LnN0cmlkZS5mMTYKKyAgICAzOSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LnN0b3JlLmQucm93LnN0cmlkZS5mMzIKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52Y2lwaGVyCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udmNpcGhlcmxhc3QKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52bmNpcGhlcgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZuY2lwaGVybGFzdAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZwZXJteG9yCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udnBtc3VtYgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZwbXN1bWQKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52cG1zdW1oCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udnBtc3VtdworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZzYm94CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udnNoYXNpZ21hZAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZzaGFzaWdtYXcKKyAgICAzLCAvLyBsbHZtLnBwYy5hbHRpdmVjLmRzcworICAgIDMsIC8vIGxsdm0ucHBjLmFsdGl2ZWMuZHNzYWxsCisgICAgMywgLy8gbGx2bS5wcGMuYWx0aXZlYy5kc3QKKyAgICAzLCAvLyBsbHZtLnBwYy5hbHRpdmVjLmRzdHN0CisgICAgMywgLy8gbGx2bS5wcGMuYWx0aXZlYy5kc3RzdHQKKyAgICAzLCAvLyBsbHZtLnBwYy5hbHRpdmVjLmRzdHQKKyAgICAyLCAvLyBsbHZtLnBwYy5hbHRpdmVjLmx2ZWJ4CisgICAgMiwgLy8gbGx2bS5wcGMuYWx0aXZlYy5sdmVoeAorICAgIDIsIC8vIGxsdm0ucHBjLmFsdGl2ZWMubHZld3gKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLmx2c2wKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLmx2c3IKKyAgICAyLCAvLyBsbHZtLnBwYy5hbHRpdmVjLmx2eAorICAgIDIsIC8vIGxsdm0ucHBjLmFsdGl2ZWMubHZ4bAorICAgIDE2LCAvLyBsbHZtLnBwYy5hbHRpdmVjLm1mdnNjcgorICAgIDMsIC8vIGxsdm0ucHBjLmFsdGl2ZWMubXR2c2NyCisgICAgNDAsIC8vIGxsdm0ucHBjLmFsdGl2ZWMuc3R2ZWJ4CisgICAgNDAsIC8vIGxsdm0ucHBjLmFsdGl2ZWMuc3R2ZWh4CisgICAgNDAsIC8vIGxsdm0ucHBjLmFsdGl2ZWMuc3R2ZXd4CisgICAgNDAsIC8vIGxsdm0ucHBjLmFsdGl2ZWMuc3R2eAorICAgIDQwLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnN0dnhsCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52YWJzZHViCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52YWJzZHVoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52YWJzZHV3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52YWRkY3VxCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52YWRkY3V3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52YWRkZWN1cQorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmFkZGV1cW0KKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhZGRzYnMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhZGRzaHMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhZGRzd3MKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhZGR1YnMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhZGR1aHMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhZGR1d3MKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhdmdzYgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmF2Z3NoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52YXZnc3cKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhdmd1YgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmF2Z3VoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52YXZndXcKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZicGVybXEKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjZnN4CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y2Z1eAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNsemxzYmIKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBiZnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBiZnAucAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGVxZnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBlcWZwLnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBlcXViCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1Yi5wCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1ZAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGVxdWQucAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGVxdWgKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBlcXVoLnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBlcXV3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1dy5wCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ2VmcAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGdlZnAucAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0ZnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndGZwLnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHNiCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzYi5wCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzZAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0c2QucAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0c2gKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHNoLnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHN3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3Rzdy5wCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1YgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0dWIucAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0dWQKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHVkLnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHVoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1aC5wCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1dworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0dXcucAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcG5lYgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcG5lYi5wCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmVoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmVoLnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZXcKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZXcucAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcG5lemIKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZXpiLnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZXpoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmV6aC5wCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmV6dworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcG5lencucAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmN0c3hzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y3R1eHMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjdHpsc2JiCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52ZXhwdGVmcAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmdiYmQKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZsb2dlZnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtYWRkZnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtYXhmcAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1heHNiCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWF4c2QKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtYXhzaAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1heHN3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWF4dWIKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtYXh1ZAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1heHVoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWF4dXcKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtaGFkZHNocworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1ocmFkZHNocworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1pbmZwCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWluc2IKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtaW5zZAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1pbnNoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWluc3cKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtaW51YgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1pbnVkCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWludWgKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtaW51dworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1sYWRkdWhtCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXN1bW1ibQorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1zdW1zaG0KKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtc3Vtc2hzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXN1bXVibQorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1zdW11aG0KKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtc3VtdWhzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsZXNiCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsZXNoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsZXN3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsZXViCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsZXVoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsZXV3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsb3NiCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsb3NoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsb3N3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsb3ViCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsb3VoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsb3V3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bm1zdWJmcAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnBlcm0KKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwa3B4CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cGtzZHNzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cGtzZHVzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cGtzaHNzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cGtzaHVzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cGtzd3NzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cGtzd3VzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cGt1ZHVzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cGt1aHVzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cGt1d3VzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cHJ0eWJkCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cHJ0eWJxCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cHJ0eWJ3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmVmcAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnJmaW0KKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZyZmluCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmZpcAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnJmaXoKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZybGIKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZybGQKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZybGRtaQorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnJsZG5tCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmxoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmx3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmx3bWkKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZybHdubQorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnJzcXJ0ZWZwCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c2VsCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c2wKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzbGIKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzbGgKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzbG8KKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzbHYKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzbHcKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzcgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNyYWIKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzcmFoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3JhdworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNyYgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNyaAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNybworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNydgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNydworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnN1YmN1cQorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnN1YmN1dworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnN1YmVjdXEKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdWJldXFtCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3Vic2JzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3Vic2hzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3Vic3dzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3VidWJzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3VidWhzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3VidXdzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3VtMnN3cworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnN1bTRzYnMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdW00c2hzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3VtNHVicworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnN1bXN3cworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnVwa2hweAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnVwa2hzYgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnVwa2hzaAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnVwa2hzdworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnVwa2xweAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnVwa2xzYgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnVwa2xzaAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnVwa2xzdworICAgIDEsIC8vIGxsdm0ucHBjLmJwZXJtZAorICAgIDMsIC8vIGxsdm0ucHBjLmNmZW5jZQorICAgIDMsIC8vIGxsdm0ucHBjLmRjYmEKKyAgICAzLCAvLyBsbHZtLnBwYy5kY2JmCisgICAgMywgLy8gbGx2bS5wcGMuZGNiaQorICAgIDMsIC8vIGxsdm0ucHBjLmRjYnN0CisgICAgMTgsIC8vIGxsdm0ucHBjLmRjYnQKKyAgICAxOCwgLy8gbGx2bS5wcGMuZGNidHN0CisgICAgMywgLy8gbGx2bS5wcGMuZGNiegorICAgIDMsIC8vIGxsdm0ucHBjLmRjYnpsCisgICAgMSwgLy8gbGx2bS5wcGMuZGl2ZGUKKyAgICAxLCAvLyBsbHZtLnBwYy5kaXZkZXUKKyAgICAxLCAvLyBsbHZtLnBwYy5kaXZ3ZQorICAgIDEsIC8vIGxsdm0ucHBjLmRpdndldQorICAgIDMsIC8vIGxsdm0ucHBjLmdldC50ZXhhc3IKKyAgICAzLCAvLyBsbHZtLnBwYy5nZXQudGV4YXNydQorICAgIDMsIC8vIGxsdm0ucHBjLmdldC50ZmhhcgorICAgIDMsIC8vIGxsdm0ucHBjLmdldC50ZmlhcgorICAgIDMsIC8vIGxsdm0ucHBjLmlzLmRlY3JlbWVudGVkLmN0ci5ub256ZXJvCisgICAgMywgLy8gbGx2bS5wcGMubHdzeW5jCisgICAgMywgLy8gbGx2bS5wcGMubXRjdHIKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmYWJzCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZmFkZAorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZhZGRzCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZmNmaWQKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmY2ZpZHMKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmY2ZpZHUKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmY2ZpZHVzCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZmNtcGVxCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZmNtcGd0CisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZmNtcGx0CisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZmNwc2duCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZmN0aWQKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmY3RpZHUKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmY3RpZHV6CisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZmN0aWR6CisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZmN0aXcKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmY3Rpd3UKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmY3Rpd3V6CisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZmN0aXd6CisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZmxvZ2ljYWwKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmbWFkZAorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZtYWRkcworICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZtc3ViCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2Zm1zdWJzCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2Zm11bAorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZtdWxzCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2Zm5hYnMKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmbmVnCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2Zm5tYWRkCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2Zm5tYWRkcworICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZubXN1YgorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZubXN1YnMKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmcGVybQorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZyZQorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZyZXMKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmcmltCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZnJpbgorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZyaXAKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmcml6CisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZnJzcAorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZyc3FydGUKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmcnNxcnRlcworICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZzZWwKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmc3ViCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZnN1YnMKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmdHN0bmFuCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZnhtYWRkCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZnhtYWRkcworICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZ4bXVsCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZnhtdWxzCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2Znh4Y3BubWFkZAorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZ4eGNwbm1hZGRzCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2Znh4bWFkZAorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZ4eG1hZGRzCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2Znh4bnBtYWRkCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2Znh4bnBtYWRkcworICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmdwY2kKKyAgICAyLCAvLyBsbHZtLnBwYy5xcHgucXZsZmNkCisgICAgMiwgLy8gbGx2bS5wcGMucXB4LnF2bGZjZGEKKyAgICAyLCAvLyBsbHZtLnBwYy5xcHgucXZsZmNzCisgICAgMiwgLy8gbGx2bS5wcGMucXB4LnF2bGZjc2EKKyAgICAyLCAvLyBsbHZtLnBwYy5xcHgucXZsZmQKKyAgICAyLCAvLyBsbHZtLnBwYy5xcHgucXZsZmRhCisgICAgMiwgLy8gbGx2bS5wcGMucXB4LnF2bGZpd2EKKyAgICAyLCAvLyBsbHZtLnBwYy5xcHgucXZsZml3YWEKKyAgICAyLCAvLyBsbHZtLnBwYy5xcHgucXZsZml3egorICAgIDIsIC8vIGxsdm0ucHBjLnFweC5xdmxmaXd6YQorICAgIDIsIC8vIGxsdm0ucHBjLnFweC5xdmxmcworICAgIDIsIC8vIGxsdm0ucHBjLnFweC5xdmxmc2EKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZscGNsZAorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmxwY2xzCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2bHBjcmQKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZscGNycworICAgIDQwLCAvLyBsbHZtLnBwYy5xcHgucXZzdGZjZAorICAgIDQwLCAvLyBsbHZtLnBwYy5xcHgucXZzdGZjZGEKKyAgICA0MCwgLy8gbGx2bS5wcGMucXB4LnF2c3RmY3MKKyAgICA0MCwgLy8gbGx2bS5wcGMucXB4LnF2c3RmY3NhCisgICAgNDAsIC8vIGxsdm0ucHBjLnFweC5xdnN0ZmQKKyAgICA0MCwgLy8gbGx2bS5wcGMucXB4LnF2c3RmZGEKKyAgICA0MCwgLy8gbGx2bS5wcGMucXB4LnF2c3RmaXcKKyAgICA0MCwgLy8gbGx2bS5wcGMucXB4LnF2c3RmaXdhCisgICAgNDAsIC8vIGxsdm0ucHBjLnFweC5xdnN0ZnMKKyAgICA0MCwgLy8gbGx2bS5wcGMucXB4LnF2c3Rmc2EKKyAgICAzLCAvLyBsbHZtLnBwYy5zZXQudGV4YXNyCisgICAgMywgLy8gbGx2bS5wcGMuc2V0LnRleGFzcnUKKyAgICAzLCAvLyBsbHZtLnBwYy5zZXQudGZoYXIKKyAgICAzLCAvLyBsbHZtLnBwYy5zZXQudGZpYXIKKyAgICAzLCAvLyBsbHZtLnBwYy5zeW5jCisgICAgMywgLy8gbGx2bS5wcGMudGFib3J0CisgICAgMywgLy8gbGx2bS5wcGMudGFib3J0ZGMKKyAgICAzLCAvLyBsbHZtLnBwYy50YWJvcnRkY2kKKyAgICAzLCAvLyBsbHZtLnBwYy50YWJvcnR3YworICAgIDMsIC8vIGxsdm0ucHBjLnRhYm9ydHdjaQorICAgIDMsIC8vIGxsdm0ucHBjLnRiZWdpbgorICAgIDMsIC8vIGxsdm0ucHBjLnRjaGVjaworICAgIDMsIC8vIGxsdm0ucHBjLnRlbmQKKyAgICAzLCAvLyBsbHZtLnBwYy50ZW5kYWxsCisgICAgMywgLy8gbGx2bS5wcGMudHJlY2hrcHQKKyAgICAzLCAvLyBsbHZtLnBwYy50cmVjbGFpbQorICAgIDMsIC8vIGxsdm0ucHBjLnRyZXN1bWUKKyAgICAzLCAvLyBsbHZtLnBwYy50c3IKKyAgICAzLCAvLyBsbHZtLnBwYy50c3VzcGVuZAorICAgIDMsIC8vIGxsdm0ucHBjLnR0ZXN0CisgICAgMiwgLy8gbGx2bS5wcGMudnN4Lmx4dmQyeAorICAgIDIsIC8vIGxsdm0ucHBjLnZzeC5seHZkMnguYmUKKyAgICAyLCAvLyBsbHZtLnBwYy52c3gubHh2bAorICAgIDIsIC8vIGxsdm0ucHBjLnZzeC5seHZsbAorICAgIDIsIC8vIGxsdm0ucHBjLnZzeC5seHZ3NHgKKyAgICAyLCAvLyBsbHZtLnBwYy52c3gubHh2dzR4LmJlCisgICAgNDAsIC8vIGxsdm0ucHBjLnZzeC5zdHh2ZDJ4CisgICAgNDAsIC8vIGxsdm0ucHBjLnZzeC5zdHh2ZDJ4LmJlCisgICAgNDAsIC8vIGxsdm0ucHBjLnZzeC5zdHh2bAorICAgIDQwLCAvLyBsbHZtLnBwYy52c3guc3R4dmxsCisgICAgNDAsIC8vIGxsdm0ucHBjLnZzeC5zdHh2dzR4CisgICAgNDAsIC8vIGxsdm0ucHBjLnZzeC5zdHh2dzR4LmJlCisgICAgMSwgLy8gbGx2bS5wcGMudnN4LnhzbWF4ZHAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHNtaW5kcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmNtcGVxZHAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZjbXBlcWRwLnAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZjbXBlcXNwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZXFzcC5wCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZ2VkcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmNtcGdlZHAucAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmNtcGdlc3AKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZjbXBnZXNwLnAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZjbXBndGRwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZ3RkcC5wCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZ3RzcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmNtcGd0c3AucAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmN2ZHBzcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmN2ZHBzeHdzCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2Y3ZkcHV4d3MKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZjdmhwc3AKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZjdnNwZHAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZjdnNwaHAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZjdnN4ZHNwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2Y3ZzeHdkcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmN2dXhkc3AKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZjdnV4d2RwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2ZGl2ZHAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZkaXZzcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmlleHBkcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmlleHBzcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dm1heGRwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2bWF4c3AKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZtaW5kcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dm1pbnNwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2cmRwaXAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZyZWRwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2cmVzcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dnJzcGlwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2cnNxcnRlZHAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZyc3FydGVzcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dnRzdGRjZHAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZ0c3RkY3NwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2eGV4cGRwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2eGV4cHNwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2eHNpZ2RwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2eHNpZ3NwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh4ZXh0cmFjdHV3CisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh4aW5zZXJ0dworICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54eGxlcXYKKyAgICA0LCAvLyBsbHZtLnI2MDAuY3ViZQorICAgIDMzLCAvLyBsbHZtLnI2MDAuZ3JvdXAuYmFycmllcgorICAgIDQsIC8vIGxsdm0ucjYwMC5pbXBsaWNpdGFyZy5wdHIKKyAgICAzLCAvLyBsbHZtLnI2MDAucmF0LnN0b3JlLnR5cGVkCisgICAgNCwgLy8gbGx2bS5yNjAwLnJlYWQuZ2xvYmFsLnNpemUueAorICAgIDQsIC8vIGxsdm0ucjYwMC5yZWFkLmdsb2JhbC5zaXplLnkKKyAgICA0LCAvLyBsbHZtLnI2MDAucmVhZC5nbG9iYWwuc2l6ZS56CisgICAgNCwgLy8gbGx2bS5yNjAwLnJlYWQubG9jYWwuc2l6ZS54CisgICAgNCwgLy8gbGx2bS5yNjAwLnJlYWQubG9jYWwuc2l6ZS55CisgICAgNCwgLy8gbGx2bS5yNjAwLnJlYWQubG9jYWwuc2l6ZS56CisgICAgNCwgLy8gbGx2bS5yNjAwLnJlYWQubmdyb3Vwcy54CisgICAgNCwgLy8gbGx2bS5yNjAwLnJlYWQubmdyb3Vwcy55CisgICAgNCwgLy8gbGx2bS5yNjAwLnJlYWQubmdyb3Vwcy56CisgICAgNCwgLy8gbGx2bS5yNjAwLnJlYWQudGdpZC54CisgICAgNCwgLy8gbGx2bS5yNjAwLnJlYWQudGdpZC55CisgICAgNCwgLy8gbGx2bS5yNjAwLnJlYWQudGdpZC56CisgICAgNCwgLy8gbGx2bS5yNjAwLnJlYWQudGlkaWcueAorICAgIDQsIC8vIGxsdm0ucjYwMC5yZWFkLnRpZGlnLnkKKyAgICA0LCAvLyBsbHZtLnI2MDAucmVhZC50aWRpZy56CisgICAgNCwgLy8gbGx2bS5yNjAwLnJlY2lwc3FydC5jbGFtcGVkCisgICAgNCwgLy8gbGx2bS5yNjAwLnJlY2lwc3FydC5pZWVlCisgICAgMywgLy8gbGx2bS5zMzkwLmVmcGMKKyAgICAxLCAvLyBsbHZtLnMzOTAuZXRuZAorICAgIDEsIC8vIGxsdm0uczM5MC5sY2JiCisgICAgNDAsIC8vIGxsdm0uczM5MC5udHN0ZworICAgIDMsIC8vIGxsdm0uczM5MC5wcGEudHhhc3Npc3QKKyAgICAzLCAvLyBsbHZtLnMzOTAuc2ZwYworICAgIDQxLCAvLyBsbHZtLnMzOTAudGFib3J0CisgICAgNDIsIC8vIGxsdm0uczM5MC50YmVnaW4KKyAgICA0MiwgLy8gbGx2bS5zMzkwLnRiZWdpbi5ub2Zsb2F0CisgICAgNDIsIC8vIGxsdm0uczM5MC50YmVnaW5jCisgICAgMSwgLy8gbGx2bS5zMzkwLnRkYworICAgIDMsIC8vIGxsdm0uczM5MC50ZW5kCisgICAgMSwgLy8gbGx2bS5zMzkwLnZhY2NiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZhY2NjcQorICAgIDEsIC8vIGxsdm0uczM5MC52YWNjZgorICAgIDEsIC8vIGxsdm0uczM5MC52YWNjZworICAgIDEsIC8vIGxsdm0uczM5MC52YWNjaAorICAgIDEsIC8vIGxsdm0uczM5MC52YWNjcQorICAgIDEsIC8vIGxsdm0uczM5MC52YWNxCisgICAgMSwgLy8gbGx2bS5zMzkwLnZhcQorICAgIDEsIC8vIGxsdm0uczM5MC52YXZnYgorICAgIDEsIC8vIGxsdm0uczM5MC52YXZnZgorICAgIDEsIC8vIGxsdm0uczM5MC52YXZnZworICAgIDEsIC8vIGxsdm0uczM5MC52YXZnaAorICAgIDEsIC8vIGxsdm0uczM5MC52YXZnbGIKKyAgICAxLCAvLyBsbHZtLnMzOTAudmF2Z2xmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZhdmdsZworICAgIDEsIC8vIGxsdm0uczM5MC52YXZnbGgKKyAgICAxLCAvLyBsbHZtLnMzOTAudmJwZXJtCisgICAgMSwgLy8gbGx2bS5zMzkwLnZjZXFicworICAgIDEsIC8vIGxsdm0uczM5MC52Y2VxZnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmNlcWdzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZjZXFocworICAgIDEsIC8vIGxsdm0uczM5MC52Y2hicworICAgIDEsIC8vIGxsdm0uczM5MC52Y2hmcworICAgIDEsIC8vIGxsdm0uczM5MC52Y2hncworICAgIDEsIC8vIGxsdm0uczM5MC52Y2hocworICAgIDEsIC8vIGxsdm0uczM5MC52Y2hsYnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmNobGZzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZjaGxncworICAgIDEsIC8vIGxsdm0uczM5MC52Y2hsaHMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmNrc20KKyAgICAxLCAvLyBsbHZtLnMzOTAudmVyaW1iCisgICAgMSwgLy8gbGx2bS5zMzkwLnZlcmltZgorICAgIDEsIC8vIGxsdm0uczM5MC52ZXJpbWcKKyAgICAxLCAvLyBsbHZtLnMzOTAudmVyaW1oCisgICAgMSwgLy8gbGx2bS5zMzkwLnZlcmxsYgorICAgIDEsIC8vIGxsdm0uczM5MC52ZXJsbGYKKyAgICAxLCAvLyBsbHZtLnMzOTAudmVybGxnCisgICAgMSwgLy8gbGx2bS5zMzkwLnZlcmxsaAorICAgIDEsIC8vIGxsdm0uczM5MC52ZXJsbHZiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZlcmxsdmYKKyAgICAxLCAvLyBsbHZtLnMzOTAudmVybGx2ZworICAgIDEsIC8vIGxsdm0uczM5MC52ZXJsbHZoCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmYWViCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmYWVicworICAgIDEsIC8vIGxsdm0uczM5MC52ZmFlZgorICAgIDEsIC8vIGxsdm0uczM5MC52ZmFlZnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZhZWgKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZhZWhzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmYWV6YgorICAgIDEsIC8vIGxsdm0uczM5MC52ZmFlemJzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmYWV6ZgorICAgIDEsIC8vIGxsdm0uczM5MC52ZmFlemZzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmYWV6aAorICAgIDEsIC8vIGxsdm0uczM5MC52ZmFlemhzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmY2VkYnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZjZXNicworICAgIDEsIC8vIGxsdm0uczM5MC52ZmNoZGJzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmY2hlZGJzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmY2hlc2JzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmY2hzYnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlZWIKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlZWJzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmZWVmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmZWVmcworICAgIDEsIC8vIGxsdm0uczM5MC52ZmVlaAorICAgIDEsIC8vIGxsdm0uczM5MC52ZmVlaHMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlZXpiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmZWV6YnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlZXpmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmZWV6ZnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlZXpoCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmZWV6aHMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlbmViCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmZW5lYnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlbmVmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmZW5lZnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlbmVoCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmZW5laHMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlbmV6YgorICAgIDEsIC8vIGxsdm0uczM5MC52ZmVuZXpicworICAgIDEsIC8vIGxsdm0uczM5MC52ZmVuZXpmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmZW5lemZzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmZW5lemgKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlbmV6aHMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZpZGIKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZpc2IKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZtYXhkYgorICAgIDEsIC8vIGxsdm0uczM5MC52Zm1heHNiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmbWluZGIKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZtaW5zYgorICAgIDEsIC8vIGxsdm0uczM5MC52ZnRjaWRiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmdGNpc2IKKyAgICAxLCAvLyBsbHZtLnMzOTAudmdmbWFiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZnZm1hZgorICAgIDEsIC8vIGxsdm0uczM5MC52Z2ZtYWcKKyAgICAxLCAvLyBsbHZtLnMzOTAudmdmbWFoCisgICAgMSwgLy8gbGx2bS5zMzkwLnZnZm1iCisgICAgMSwgLy8gbGx2bS5zMzkwLnZnZm1mCisgICAgMSwgLy8gbGx2bS5zMzkwLnZnZm1nCisgICAgMSwgLy8gbGx2bS5zMzkwLnZnZm1oCisgICAgMSwgLy8gbGx2bS5zMzkwLnZpc3RyYgorICAgIDEsIC8vIGxsdm0uczM5MC52aXN0cmJzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZpc3RyZgorICAgIDEsIC8vIGxsdm0uczM5MC52aXN0cmZzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZpc3RyaAorICAgIDEsIC8vIGxsdm0uczM5MC52aXN0cmhzCisgICAgMiwgLy8gbGx2bS5zMzkwLnZsYmIKKyAgICAyLCAvLyBsbHZtLnMzOTAudmxsCisgICAgMiwgLy8gbGx2bS5zMzkwLnZscmwKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1hZWIKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1hZWYKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1hZWgKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1haGIKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1haGYKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1haGgKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1hbGViCisgICAgMSwgLy8gbGx2bS5zMzkwLnZtYWxlZgorICAgIDEsIC8vIGxsdm0uczM5MC52bWFsZWgKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1hbGhiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZtYWxoZgorICAgIDEsIC8vIGxsdm0uczM5MC52bWFsaGgKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1hbG9iCisgICAgMSwgLy8gbGx2bS5zMzkwLnZtYWxvZgorICAgIDEsIC8vIGxsdm0uczM5MC52bWFsb2gKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1hb2IKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1hb2YKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1hb2gKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1lYgorICAgIDEsIC8vIGxsdm0uczM5MC52bWVmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZtZWgKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1oYgorICAgIDEsIC8vIGxsdm0uczM5MC52bWhmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZtaGgKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1sZWIKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1sZWYKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1sZWgKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1saGIKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1saGYKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1saGgKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1sb2IKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1sb2YKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1sb2gKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1vYgorICAgIDEsIC8vIGxsdm0uczM5MC52bW9mCisgICAgMSwgLy8gbGx2bS5zMzkwLnZtb2gKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1zbGcKKyAgICAxLCAvLyBsbHZtLnMzOTAudnBkaQorICAgIDEsIC8vIGxsdm0uczM5MC52cGVybQorICAgIDEsIC8vIGxsdm0uczM5MC52cGtsc2YKKyAgICAxLCAvLyBsbHZtLnMzOTAudnBrbHNmcworICAgIDEsIC8vIGxsdm0uczM5MC52cGtsc2cKKyAgICAxLCAvLyBsbHZtLnMzOTAudnBrbHNncworICAgIDEsIC8vIGxsdm0uczM5MC52cGtsc2gKKyAgICAxLCAvLyBsbHZtLnMzOTAudnBrbHNocworICAgIDEsIC8vIGxsdm0uczM5MC52cGtzZgorICAgIDEsIC8vIGxsdm0uczM5MC52cGtzZnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudnBrc2cKKyAgICAxLCAvLyBsbHZtLnMzOTAudnBrc2dzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZwa3NoCisgICAgMSwgLy8gbGx2bS5zMzkwLnZwa3NocworICAgIDEsIC8vIGxsdm0uczM5MC52c2JjYmlxCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzYmlxCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzY2JpYgorICAgIDEsIC8vIGxsdm0uczM5MC52c2NiaWYKKyAgICAxLCAvLyBsbHZtLnMzOTAudnNjYmlnCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzY2JpaAorICAgIDEsIC8vIGxsdm0uczM5MC52c2NiaXEKKyAgICAxLCAvLyBsbHZtLnMzOTAudnNsCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzbGIKKyAgICAxLCAvLyBsbHZtLnMzOTAudnNsZGIKKyAgICAxLCAvLyBsbHZtLnMzOTAudnNxCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzcmEKKyAgICAxLCAvLyBsbHZtLnMzOTAudnNyYWIKKyAgICAxLCAvLyBsbHZtLnMzOTAudnNybAorICAgIDEsIC8vIGxsdm0uczM5MC52c3JsYgorICAgIDQwLCAvLyBsbHZtLnMzOTAudnN0bAorICAgIDEsIC8vIGxsdm0uczM5MC52c3RyY2IKKyAgICAxLCAvLyBsbHZtLnMzOTAudnN0cmNicworICAgIDEsIC8vIGxsdm0uczM5MC52c3RyY2YKKyAgICAxLCAvLyBsbHZtLnMzOTAudnN0cmNmcworICAgIDEsIC8vIGxsdm0uczM5MC52c3RyY2gKKyAgICAxLCAvLyBsbHZtLnMzOTAudnN0cmNocworICAgIDEsIC8vIGxsdm0uczM5MC52c3RyY3piCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzdHJjemJzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzdHJjemYKKyAgICAxLCAvLyBsbHZtLnMzOTAudnN0cmN6ZnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudnN0cmN6aAorICAgIDEsIC8vIGxsdm0uczM5MC52c3RyY3pocworICAgIDQwLCAvLyBsbHZtLnMzOTAudnN0cmwKKyAgICAxLCAvLyBsbHZtLnMzOTAudnN1bWIKKyAgICAxLCAvLyBsbHZtLnMzOTAudnN1bWdmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzdW1naAorICAgIDEsIC8vIGxsdm0uczM5MC52c3VtaAorICAgIDEsIC8vIGxsdm0uczM5MC52c3VtcWYKKyAgICAxLCAvLyBsbHZtLnMzOTAudnN1bXFnCisgICAgMSwgLy8gbGx2bS5zMzkwLnZ0bQorICAgIDEsIC8vIGxsdm0uczM5MC52dXBoYgorICAgIDEsIC8vIGxsdm0uczM5MC52dXBoZgorICAgIDEsIC8vIGxsdm0uczM5MC52dXBoaAorICAgIDEsIC8vIGxsdm0uczM5MC52dXBsYgorICAgIDEsIC8vIGxsdm0uczM5MC52dXBsZgorICAgIDEsIC8vIGxsdm0uczM5MC52dXBsaGIKKyAgICAxLCAvLyBsbHZtLnMzOTAudnVwbGhmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZ1cGxoaAorICAgIDEsIC8vIGxsdm0uczM5MC52dXBsaHcKKyAgICAxLCAvLyBsbHZtLnMzOTAudnVwbGxiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZ1cGxsZgorICAgIDEsIC8vIGxsdm0uczM5MC52dXBsbGgKKyAgICAxNiwgLy8gbGx2bS53YXNtLmN1cnJlbnQubWVtb3J5CisgICAgNDMsIC8vIGxsdm0ud2FzbS5nZXQuZWhzZWxlY3RvcgorICAgIDQzLCAvLyBsbHZtLndhc20uZ2V0LmV4Y2VwdGlvbgorICAgIDMsIC8vIGxsdm0ud2FzbS5ncm93Lm1lbW9yeQorICAgIDMsIC8vIGxsdm0ud2FzbS5tZW0uZ3JvdworICAgIDE2LCAvLyBsbHZtLndhc20ubWVtLnNpemUKKyAgICA0NCwgLy8gbGx2bS53YXNtLnJldGhyb3cKKyAgICA0NCwgLy8gbGx2bS53YXNtLnRocm93CisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3cucGF2Z3VzYgorICAgIDEsIC8vIGxsdm0ueDg2LjNkbm93LnBmMmlkCisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3cucGZhY2MKKyAgICAxLCAvLyBsbHZtLng4Ni4zZG5vdy5wZmFkZAorICAgIDEsIC8vIGxsdm0ueDg2LjNkbm93LnBmY21wZXEKKyAgICAxLCAvLyBsbHZtLng4Ni4zZG5vdy5wZmNtcGdlCisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3cucGZjbXBndAorICAgIDEsIC8vIGxsdm0ueDg2LjNkbm93LnBmbWF4CisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3cucGZtaW4KKyAgICAxLCAvLyBsbHZtLng4Ni4zZG5vdy5wZm11bAorICAgIDEsIC8vIGxsdm0ueDg2LjNkbm93LnBmcmNwCisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3cucGZyY3BpdDEKKyAgICAxLCAvLyBsbHZtLng4Ni4zZG5vdy5wZnJjcGl0MgorICAgIDEsIC8vIGxsdm0ueDg2LjNkbm93LnBmcnNxaXQxCisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3cucGZyc3FydAorICAgIDEsIC8vIGxsdm0ueDg2LjNkbm93LnBmc3ViCisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3cucGZzdWJyCisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3cucGkyZmQKKyAgICAxLCAvLyBsbHZtLng4Ni4zZG5vdy5wbXVsaHJ3CisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3dhLnBmMml3CisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3dhLnBmbmFjYworICAgIDEsIC8vIGxsdm0ueDg2LjNkbm93YS5wZnBuYWNjCisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3dhLnBpMmZ3CisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3dhLnBzd2FwZAorICAgIDIxLCAvLyBsbHZtLng4Ni5hZGRjYXJyeS51MzIKKyAgICAyMSwgLy8gbGx2bS54ODYuYWRkY2FycnkudTY0CisgICAgMjEsIC8vIGxsdm0ueDg2LmFkZGNhcnJ5eC51MzIKKyAgICAyMSwgLy8gbGx2bS54ODYuYWRkY2Fycnl4LnU2NAorICAgIDEsIC8vIGxsdm0ueDg2LmFlc25pLmFlc2RlYworICAgIDEsIC8vIGxsdm0ueDg2LmFlc25pLmFlc2RlYy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hZXNuaS5hZXNkZWMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYWVzbmkuYWVzZGVjbGFzdAorICAgIDEsIC8vIGxsdm0ueDg2LmFlc25pLmFlc2RlY2xhc3QuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYWVzbmkuYWVzZGVjbGFzdC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hZXNuaS5hZXNlbmMKKyAgICAxLCAvLyBsbHZtLng4Ni5hZXNuaS5hZXNlbmMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYWVzbmkuYWVzZW5jLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmFlc25pLmFlc2VuY2xhc3QKKyAgICAxLCAvLyBsbHZtLng4Ni5hZXNuaS5hZXNlbmNsYXN0LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmFlc25pLmFlc2VuY2xhc3QuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYWVzbmkuYWVzaW1jCisgICAgMSwgLy8gbGx2bS54ODYuYWVzbmkuYWVza2V5Z2VuYXNzaXN0CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LmFkZHN1Yi5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdnguYWRkc3ViLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5ibGVuZHYucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LmJsZW5kdi5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdnguY21wLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5jbXAucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LmN2dC5wZDIucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LmN2dC5wZDJkcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdnguY3Z0LnBzMmRxLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5jdnRkcTIucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LmN2dHQucGQyZHEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LmN2dHQucHMyZHEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LmRwLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5oYWRkLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5oYWRkLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5oc3ViLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5oc3ViLnBzLjI1NgorICAgIDE2LCAvLyBsbHZtLng4Ni5hdngubGR1LmRxLjI1NgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eC5tYXNrbG9hZC5wZAorICAgIDIsIC8vIGxsdm0ueDg2LmF2eC5tYXNrbG9hZC5wZC4yNTYKKyAgICAyLCAvLyBsbHZtLng4Ni5hdngubWFza2xvYWQucHMKKyAgICAyLCAvLyBsbHZtLng4Ni5hdngubWFza2xvYWQucHMuMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eC5tYXNrc3RvcmUucGQKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4Lm1hc2tzdG9yZS5wZC4yNTYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4Lm1hc2tzdG9yZS5wcworICAgIDIxLCAvLyBsbHZtLng4Ni5hdngubWFza3N0b3JlLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5tYXgucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Lm1heC5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngubWluLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5taW4ucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Lm1vdm1zay5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngubW92bXNrLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5wdGVzdGMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnB0ZXN0bnpjLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5wdGVzdHouMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnJjcC5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngucm91bmQucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnJvdW5kLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5yc3FydC5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdnguc3FydC5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdnguc3FydC5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngudnBlcm1pbHZhci5wZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC52cGVybWlsdmFyLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC52cGVybWlsdmFyLnBzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnZwZXJtaWx2YXIucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0Yy5wZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC52dGVzdGMucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0Yy5wcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eC52dGVzdGMucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0bnpjLnBkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0bnpjLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC52dGVzdG56Yy5wcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eC52dGVzdG56Yy5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngudnRlc3R6LnBkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0ei5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngudnRlc3R6LnBzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0ei5wcy4yNTYKKyAgICAzLCAvLyBsbHZtLng4Ni5hdngudnplcm9hbGwKKyAgICAzLCAvLyBsbHZtLng4Ni5hdngudnplcm91cHBlcgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLmQuZAorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLmQuZC4yNTYKKyAgICAyLCAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5kLnBkCisgICAgMiwgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIuZC5wZC4yNTYKKyAgICAyLCAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5kLnBzCisgICAgMiwgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIuZC5wcy4yNTYKKyAgICAyLCAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5kLnEKKyAgICAyLCAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5kLnEuMjU2CisgICAgMiwgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5kCisgICAgMiwgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5kLjI1NgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLnEucGQKKyAgICAyLCAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5xLnBkLjI1NgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLnEucHMKKyAgICAyLCAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5xLnBzLjI1NgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLnEucQorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLnEucS4yNTYKKyAgICAyLCAvLyBsbHZtLng4Ni5hdngyLm1hc2tsb2FkLmQKKyAgICAyLCAvLyBsbHZtLng4Ni5hdngyLm1hc2tsb2FkLmQuMjU2CisgICAgMiwgLy8gbGx2bS54ODYuYXZ4Mi5tYXNrbG9hZC5xCisgICAgMiwgLy8gbGx2bS54ODYuYXZ4Mi5tYXNrbG9hZC5xLjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdngyLm1hc2tzdG9yZS5kCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDIubWFza3N0b3JlLmQuMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDIubWFza3N0b3JlLnEKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4Mi5tYXNrc3RvcmUucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLm1wc2FkYncKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBhY2tzc2R3CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wYWNrc3N3YgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucGFja3VzZHcKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBhY2t1c3diCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wYWRkcy5iCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wYWRkcy53CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wYWRkdXMuYgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucGFkZHVzLncKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBibGVuZHZiCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wZXJtZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucGVybXBzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5waGFkZC5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5waGFkZC5zdworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucGhhZGQudworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucGhzdWIuZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucGhzdWIuc3cKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBoc3ViLncKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBtYWRkLnViLnN3CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wbWFkZC53ZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucG1vdm1za2IKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBtdWwuZHEKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBtdWwuaHIuc3cKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBtdWxoLncKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBtdWxodS53CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wbXVsdS5kcQorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNhZC5idworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNodWYuYgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNpZ24uYgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNpZ24uZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNpZ24udworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNsbC5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc2xsLnEKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBzbGwudworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNsbGkuZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNsbGkucQorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNsbGkudworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNsbHYuZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNsbHYuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBzbGx2LnEKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBzbGx2LnEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc3JhLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBzcmEudworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNyYWkuZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNyYWkudworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNyYXYuZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNyYXYuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBzcmwuZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNybC5xCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc3JsLncKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBzcmxpLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBzcmxpLnEKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBzcmxpLncKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBzcmx2LmQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBzcmx2LmQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc3Jsdi5xCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc3Jsdi5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHN1YnMuYgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHN1YnMudworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHN1YnVzLmIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBzdWJ1cy53CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmJyb2FkY2FzdG1iLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5icm9hZGNhc3RtYi4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIuYnJvYWRjYXN0bWIuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmJyb2FkY2FzdG13LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5icm9hZGNhc3Rtdy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIuYnJvYWRjYXN0bXcuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHNpMnNkNjQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0c2kyc3MzMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnRzaTJzczY0CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHRzZDJzaQorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnR0c2Qyc2k2NAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnR0c2QydXNpCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHRzZDJ1c2k2NAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnR0c3Myc2kKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0dHNzMnNpNjQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0dHNzMnVzaQorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnR0c3MydXNpNjQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0dXNpMnNkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHVzaTJzcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnR1c2k2NDJzZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnR1c2k2NDJzcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5leHAyLnBkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmV4cDIucHMKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLmRwZC41MTIKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLmRwaS41MTIKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLmRwcS41MTIKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLmRwcy41MTIKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLnFwZC41MTIKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLnFwaS41MTIKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLnFwcS41MTIKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLnFwcy41MTIKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2RpdjIuZGYKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2RpdjIuZGkKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2RpdjQuZGYKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2RpdjQuZGkKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2RpdjQuc2YKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2RpdjQuc2kKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2Rpdjguc2YKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2Rpdjguc2kKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3NpdjIuZGYKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3NpdjIuZGkKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3NpdjQuZGYKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3NpdjQuZGkKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3NpdjQuc2YKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3NpdjQuc2kKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3Npdjguc2YKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3Npdjguc2kKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcnBmLmRwZC41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcnBmLmRwcy41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcnBmLnFwZC41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcnBmLnFwcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5hZGQucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suYWRkLnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmFkZC5zZC5yb3VuZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmFkZC5zcy5yb3VuZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5wZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jbXAucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY21wLnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5wcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jbXAucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY21wLnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5zZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5zcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLmIuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MuYi4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5iLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLmQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5kLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5xLjUxMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5iLjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5iLjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5iLjUxMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5kLjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5kLjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5kLjUxMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5wZC4xMjgKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucGQuMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLnBkLjUxMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5wcy4xMjgKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucHMuMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLnBzLjUxMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5xLjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5xLjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5xLjUxMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS53LjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS53LjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS53LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLncuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Mudy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy53LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbmZsaWN0LmQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29uZmxpY3QuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb25mbGljdC5kLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbmZsaWN0LnEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29uZmxpY3QucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb25mbGljdC5xLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dGRxMnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dGRxMnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dGRxMnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMmRxLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMmRxLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMmRxLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnBzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQycHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQycHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQycXEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQycXEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQycXEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQydWRxLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnVkcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJ1ZHEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQydXFxLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnVxcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJ1cXEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMyZHEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMyZHEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMyZHEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMycGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMycGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMycGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMycXEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMycXEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMycXEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMydWRxLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnVkcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJ1ZHEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMydXFxLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnVxcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJ1cXEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cXEycGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cXEycGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cXEycGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cXEycHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cXEycHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cXEycHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0c2Qyc3Mucm91bmQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRzczJzZC5yb3VuZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJkcS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQyZHEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBkMmRxLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJxcS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQycXEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBkMnFxLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJ1ZHEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBkMnVkcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQydWRxLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJ1cXEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBkMnVxcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQydXFxLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJkcS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMyZHEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBzMmRxLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJxcS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMycXEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBzMnFxLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJ1ZHEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBzMnVkcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMydWRxLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJ1cXEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBzMnVxcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMydXFxLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVkcTJwcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1ZHEycHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dWRxMnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVxcTJwZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1cXEycGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dXFxMnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVxcTJwcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1cXEycHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dXFxMnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmRicHNhZGJ3LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmRicHNhZGJ3LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmRicHNhZGJ3LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmRpdi5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5kaXYucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZGl2LnNkLnJvdW5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZGl2LnNzLnJvdW5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmIuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmIuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmIuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmQuNTEyCisgICAgMiwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQuYi4xMjgKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5iLjI1NgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLmIuNTEyCisgICAgMiwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQuZC4xMjgKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5kLjI1NgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLmQuNTEyCisgICAgMiwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQucGQuMTI4CisgICAgMiwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQucGQuMjU2CisgICAgMiwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQucGQuNTEyCisgICAgMiwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQucHMuMTI4CisgICAgMiwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQucHMuMjU2CisgICAgMiwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQucHMuNTEyCisgICAgMiwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQucS4xMjgKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5xLjI1NgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLnEuNTEyCisgICAgMiwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQudy4xMjgKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC53LjI1NgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLncuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLncuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZml4dXBpbW0ucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZml4dXBpbW0ucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZml4dXBpbW0ucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZml4dXBpbW0ucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZml4dXBpbW0ucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZml4dXBpbW0ucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZml4dXBpbW0uc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5zcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3MucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZnBjbGFzcy5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3MucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZnBjbGFzcy5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3Muc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnNzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldGV4cC5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRleHAucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldGV4cC5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRleHAucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnNkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnNzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0bWFudC5wZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0bWFudC5wcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0bWFudC5zZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5tYXgucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2subWF4LnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLm1heC5zZC5yb3VuZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLm1heC5zcy5yb3VuZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLm1pbi5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5taW4ucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2subWluLnNkLnJvdW5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2subWluLnNzLnJvdW5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2subXVsLnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLm11bC5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5tdWwuc2Qucm91bmQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5tdWwuc3Mucm91bmQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkcy5iLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGRzLmIuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHMuYi41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkcy53LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGRzLncuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHMudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkdXMuYi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkdXMuYi4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkdXMuYi41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkdXMudy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkdXMudy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkdXMudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmRmLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBlcm12YXIuZGYuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5kaS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmRpLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBlcm12YXIuaGkuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5oaS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmhpLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBlcm12YXIucWkuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5xaS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnFpLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBlcm12YXIuc2YuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5zZi41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnNpLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBlcm12YXIuc2kuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1hZGR1YnMudy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbWFkZHVicy53LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtYWRkdWJzLncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1hZGR3LmQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1hZGR3LmQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1hZGR3LmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kYi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmRiLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YuZGIuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YuZGIubWVtLjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmRiLm1lbS4yNTYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kYi5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kdy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmR3LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YuZHcuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YuZHcubWVtLjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmR3Lm1lbS4yNTYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kdy5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xYi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFiLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucWIuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucWIubWVtLjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFiLm1lbS4yNTYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xYi5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucWQuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucWQubWVtLjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFkLm1lbS4yNTYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xZC5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xdy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnF3LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucXcuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucXcubWVtLjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnF3Lm1lbS4yNTYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xdy5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi53Yi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LndiLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Yud2IuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Yud2IubWVtLjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LndiLm1lbS4yNTYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi53Yi5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZGIuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZGIuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZGIuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmRiLm1lbS4xMjgKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZGIubWVtLjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kYi5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZHcuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZHcuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZHcuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmR3Lm1lbS4xMjgKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZHcubWVtLjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kdy5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWIuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWIuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWIuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFiLm1lbS4xMjgKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWIubWVtLjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xYi5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWQuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFkLm1lbS4xMjgKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWQubWVtLjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xZC5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucXcuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucXcuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucXcuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnF3Lm1lbS4xMjgKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucXcubWVtLjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xdy5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMud2IuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMud2IuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMud2IuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLndiLm1lbS4xMjgKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMud2IubWVtLjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy53Yi5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmRiLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kYi4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZGIuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kYi5tZW0uMTI4CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kYi5tZW0uMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kYi5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmR3LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kdy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZHcuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kdy5tZW0uMTI4CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kdy5tZW0uMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kdy5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFiLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xYi4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWIuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xYi5tZW0uMTI4CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xYi5tZW0uMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xYi5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWQuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xZC5tZW0uMTI4CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xZC5tZW0uMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xZC5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnF3LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xdy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucXcuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xdy5tZW0uMTI4CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xdy5tZW0uMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xdy5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLndiLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy53Yi4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMud2IuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy53Yi5tZW0uMTI4CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy53Yi5tZW0uMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy53Yi5tZW0uNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG11bHRpc2hpZnQucWIuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG11bHRpc2hpZnQucWIuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG11bHRpc2hpZnQucWIuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbC5kLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb2wuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sLmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbC5xLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb2wucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sLnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbHYuZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sdi5kLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb2x2LmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbHYucS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sdi5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb2x2LnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvci5kLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb3IuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9yLmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvci5xLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb3IucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9yLnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvcnYuZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9ydi5kLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb3J2LmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvcnYucS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9ydi5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb3J2LnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnMuYi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3Vicy5iLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBzdWJzLmIuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnMudy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3Vicy53LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBzdWJzLncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnVzLmIuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnVzLmIuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnVzLmIuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnVzLncuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnVzLncuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnVzLncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHRlcm5sb2cuZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wdGVybmxvZy5kLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnB0ZXJubG9nLmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHRlcm5sb2cucS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wdGVybmxvZy5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnB0ZXJubG9nLnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2UucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2UucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2UucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2UucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2UucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2UucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2Uuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5zcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJlZHVjZS5wZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yZWR1Y2UucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJlZHVjZS5wcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yZWR1Y2UucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJlZHVjZS5zZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJlZHVjZS5zcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnNkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucm5kc2NhbGUuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc2NhbGVmLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNjYWxlZi5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc2NhbGVmLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNjYWxlZi5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zcXJ0LnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zcXJ0LnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zcXJ0LnNkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5zcworICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zdG9yZS5zcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnN1Yi5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zdWIucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3ViLnNkLnJvdW5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3ViLnNzLnJvdW5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmN2dHBoMnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZjdnRwaDJwcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Y3Z0cGgycHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmN2dHBzMnBoLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZjdnRwczJwaC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Y3Z0cHMycGguNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZC5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZC5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkLnNkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkLnNzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkc3ViLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZHN1Yi5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGRzdWIucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkc3ViLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZHN1Yi5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGRzdWIucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubWFkZC5wZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm5tYWRkLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1hZGQucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubWFkZC5wcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm5tYWRkLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1hZGQucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubXN1Yi5wZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm5tc3ViLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1zdWIucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubXN1Yi5wcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm5tc3ViLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1zdWIucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcGJ1c2QuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcGJ1c2QuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcGJ1c2QuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcGJ1c2RzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHBidXNkcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwYnVzZHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcHdzc2QuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcHdzc2QuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcHdzc2QuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcHdzc2RzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHB3c3Nkcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwd3NzZHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5kLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5oaS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLmhpLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIuaGkuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5wZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5wcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5xLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5xaS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLnFpLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucWkuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5kLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5oaS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLmhpLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIuaGkuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5wZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5wcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5xLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5xaS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLnFpLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucWkuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBtYWRkNTJoLnVxLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwbWFkZDUyaC51cS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cG1hZGQ1MmgudXEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBtYWRkNTJsLnVxLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwbWFkZDUybC51cS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cG1hZGQ1MmwudXEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLmQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLmQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLnEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLnEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLncuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLncuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi5kLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi5xLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi53LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYudy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLmQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLmQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLnEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLnEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLncuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLncuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi5kLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi5xLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi53LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYudy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHVmYml0cW1iLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2h1ZmJpdHFtYi4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNodWZiaXRxbWIuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5wZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5wcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5zZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkc3ViLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGRzdWIucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZHN1Yi5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkc3ViLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGRzdWIucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZHN1Yi5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1Yi5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1Yi5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnNkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1Yi5zcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWJhZGQucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1YmFkZC5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViYWRkLnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWJhZGQucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1YmFkZC5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViYWRkLnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm5tc3ViLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm5tc3ViLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm5tc3ViLnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm5tc3ViLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm5tc3ViLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm5tc3ViLnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm5tc3ViLnNkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3ouZml4dXBpbW0ucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LmZpeHVwaW1tLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5maXh1cGltbS5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3ouZml4dXBpbW0ucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LmZpeHVwaW1tLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5maXh1cGltbS5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3ouZml4dXBpbW0uc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3ouZml4dXBpbW0uc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oucHRlcm5sb2cuZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oucHRlcm5sb2cuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oucHRlcm5sb2cuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oucHRlcm5sb2cucS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oucHRlcm5sb2cucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oucHRlcm5sb2cucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZC5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZC5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnNkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZC5zcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGRzdWIucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZHN1Yi5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkc3ViLnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGRzdWIucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZHN1Yi5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkc3ViLnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGRwYnVzZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcGJ1c2QuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHBidXNkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGRwYnVzZHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHBidXNkcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcGJ1c2RzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGRwd3NzZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcHdzc2QuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHB3c3NkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGRwd3NzZHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHB3c3Nkcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcHdzc2RzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLmQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5kLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLmhpLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLmhpLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLmhpLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5xLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnFpLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnFpLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnFpLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cG1hZGQ1MmgudXEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwbWFkZDUyaC51cS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBtYWRkNTJoLnVxLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cG1hZGQ1MmwudXEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwbWFkZDUybC51cS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBtYWRkNTJsLnVxLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cHNobGR2LmQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi5kLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cHNobGR2LnEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi5xLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cHNobGR2LncuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYudy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi53LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cHNocmR2LmQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi5kLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cHNocmR2LnEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi5xLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cHNocmR2LncuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYudy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi53LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wYWNrc3Nkdy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucGFja3Nzd2IuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBhY2t1c2R3LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wYWNrdXN3Yi41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucG11bC5kcS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucG11bC5oci5zdy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucG11bGgudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucG11bGh1LncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBtdWx1LmRxLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2FkLmJ3LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2h1Zi5iLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsLmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzbGwucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNsbC53LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsaS5kLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsaS5xLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsaS53LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsdi5kLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsdi5xLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsdi53LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsdi53LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsdi53LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JhLmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmEucS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNyYS5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JhLnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmEudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNyYWkuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNyYWkucS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNyYWkucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNyYWkucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNyYWkudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNyYXYuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNyYXYucS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNyYXYucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNyYXYucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNyYXYudy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNyYXYudy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNyYXYudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNybC5kLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JsLnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmwudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNybGkuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNybGkucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNybGkudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNybHYuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNybHYucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNybHYudy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNybHYudy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNybHYudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucmNwMTQucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnJjcDE0LnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AxNC5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucmNwMTQucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnJjcDE0LnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AxNC5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucmNwMTQuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucmNwMTQuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucmNwMjgucGQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucmNwMjgucHMKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucmNwMjguc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucmNwMjguc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5wZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5wcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5zZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yc3FydDE0LnNzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnJzcXJ0MjgucGQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQyOC5wcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yc3FydDI4LnNkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnJzcXJ0Mjguc3MKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXIuZHBkLjUxMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5kcGkuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyLmRwcS41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXIuZHBzLjUxMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5xcGQuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyLnFwaS41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXIucXBxLjUxMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5xcHMuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2Mi5kZgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcmRpdjIuZGkKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJkaXY0LmRmCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2NC5kaQorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcmRpdjQuc2YKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJkaXY0LnNpCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2OC5zZgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcmRpdjguc2kKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJwZi5kcGQuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVycGYuZHBzLjUxMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnBmLnFwZC41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJwZi5xcHMuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2Mi5kZgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnNpdjIuZGkKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJzaXY0LmRmCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2NC5kaQorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnNpdjQuc2YKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJzaXY0LnNpCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2OC5zZgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnNpdjguc2kKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIudmJyb2FkY2FzdC5zZC41MTIKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIudmJyb2FkY2FzdC5zcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIudmNvbWkuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIudmNvbWkuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIudmN2dHNkMnNpMzIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIudmN2dHNkMnNpNjQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIudmN2dHNkMnVzaTMyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnZjdnRzZDJ1c2k2NAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi52Y3Z0c3Myc2kzMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi52Y3Z0c3Myc2k2NAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi52Y3Z0c3MydXNpMzIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIudmN2dHNzMnVzaTY0CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnZwZXJtaWx2YXIucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnZwZXJtaWx2YXIucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYm1pLmJleHRyLjMyCisgICAgMSwgLy8gbGx2bS54ODYuYm1pLmJleHRyLjY0CisgICAgMSwgLy8gbGx2bS54ODYuYm1pLmJ6aGkuMzIKKyAgICAxLCAvLyBsbHZtLng4Ni5ibWkuYnpoaS42NAorICAgIDEsIC8vIGxsdm0ueDg2LmJtaS5wZGVwLjMyCisgICAgMSwgLy8gbGx2bS54ODYuYm1pLnBkZXAuNjQKKyAgICAxLCAvLyBsbHZtLng4Ni5ibWkucGV4dC4zMgorICAgIDEsIC8vIGxsdm0ueDg2LmJtaS5wZXh0LjY0CisgICAgMywgLy8gbGx2bS54ODYuY2xmbHVzaG9wdAorICAgIDMsIC8vIGxsdm0ueDg2LmNscnNzYnN5CisgICAgMywgLy8gbGx2bS54ODYuY2x3YgorICAgIDMsIC8vIGxsdm0ueDg2LmNsemVybworICAgIDMsIC8vIGxsdm0ueDg2LmZsYWdzLnJlYWQudTMyCisgICAgMywgLy8gbGx2bS54ODYuZmxhZ3MucmVhZC51NjQKKyAgICAzLCAvLyBsbHZtLng4Ni5mbGFncy53cml0ZS51MzIKKyAgICAzLCAvLyBsbHZtLng4Ni5mbGFncy53cml0ZS51NjQKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZtYWRkLnBkCisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbWFkZC5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZtYWRkLnBzCisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbWFkZC5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZtYWRkLnNkCisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbWFkZC5zcworICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm1hZGRzdWIucGQKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZtYWRkc3ViLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm1hZGRzdWIucHMKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZtYWRkc3ViLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm1zdWIucGQKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZtc3ViLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm1zdWIucHMKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZtc3ViLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm1zdWIuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZtc3ViLnNzCisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbXN1YmFkZC5wZAorICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm1zdWJhZGQucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbXN1YmFkZC5wcworICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm1zdWJhZGQucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbm1hZGQucGQKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZubWFkZC5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZubWFkZC5wcworICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm5tYWRkLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm5tYWRkLnNkCisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbm1hZGQuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZubXN1Yi5wZAorICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm5tc3ViLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm5tc3ViLnBzCisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbm1zdWIucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbm1zdWIuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZubXN1Yi5zcworICAgIDEsIC8vIGxsdm0ueDg2LmZtYTQudmZtYWRkLnNkCisgICAgMSwgLy8gbGx2bS54ODYuZm1hNC52Zm1hZGQuc3MKKyAgICAzLCAvLyBsbHZtLng4Ni5meHJzdG9yCisgICAgMywgLy8gbGx2bS54ODYuZnhyc3RvcjY0CisgICAgMywgLy8gbGx2bS54ODYuZnhzYXZlCisgICAgMywgLy8gbGx2bS54ODYuZnhzYXZlNjQKKyAgICAzLCAvLyBsbHZtLng4Ni5pbmNzc3BkCisgICAgMywgLy8gbGx2bS54ODYuaW5jc3NwcQorICAgIDMsIC8vIGxsdm0ueDg2LmludAorICAgIDMsIC8vIGxsdm0ueDg2Lmxsd3BjYgorICAgIDMsIC8vIGxsdm0ueDg2Lmx3cGluczMyCisgICAgMywgLy8gbGx2bS54ODYubHdwaW5zNjQKKyAgICAzLCAvLyBsbHZtLng4Ni5sd3B2YWwzMgorICAgIDMsIC8vIGxsdm0ueDg2Lmx3cHZhbDY0CisgICAgMywgLy8gbGx2bS54ODYubW14LmVtbXMKKyAgICAzLCAvLyBsbHZtLng4Ni5tbXguZmVtbXMKKyAgICAzLCAvLyBsbHZtLng4Ni5tbXgubWFza21vdnEKKyAgICAzLCAvLyBsbHZtLng4Ni5tbXgubW92bnQuZHEKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGFja3NzZHcKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGFja3Nzd2IKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGFja3Vzd2IKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGFkZC5iCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBhZGQuZAorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wYWRkLnEKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGFkZC53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBhZGRzLmIKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGFkZHMudworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wYWRkdXMuYgorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wYWRkdXMudworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wYWxpZ25yLmIKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGFuZAorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wYW5kbgorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wYXZnLmIKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGF2Zy53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBjbXBlcS5iCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBjbXBlcS5kCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBjbXBlcS53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBjbXBndC5iCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBjbXBndC5kCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBjbXBndC53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBleHRyLncKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGluc3IudworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wbWFkZC53ZAorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wbWF4cy53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBtYXh1LmIKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucG1pbnMudworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wbWludS5iCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBtb3Ztc2tiCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBtdWxoLncKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucG11bGh1LncKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucG11bGwudworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wbXVsdS5kcQorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wb3IKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHNhZC5idworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wc2xsLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHNsbC5xCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBzbGwudworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wc2xsaS5kCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBzbGxpLnEKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHNsbGkudworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wc3JhLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHNyYS53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBzcmFpLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHNyYWkudworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wc3JsLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHNybC5xCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBzcmwudworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wc3JsaS5kCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBzcmxpLnEKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHNybGkudworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wc3ViLmIKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHN1Yi5kCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBzdWIucQorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wc3ViLncKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHN1YnMuYgorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wc3Vicy53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBzdWJ1cy5iCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBzdWJ1cy53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnB1bnBja2hidworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wdW5wY2toZHEKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHVucGNraHdkCisgICAgMSwgLy8gbGx2bS54ODYubW14LnB1bnBja2xidworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wdW5wY2tsZHEKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHVucGNrbHdkCisgICAgMSwgLy8gbGx2bS54ODYubW14LnB4b3IKKyAgICAzLCAvLyBsbHZtLng4Ni5tb25pdG9yeAorICAgIDMsIC8vIGxsdm0ueDg2Lm13YWl0eAorICAgIDEsIC8vIGxsdm0ueDg2LnBjbG11bHFkcQorICAgIDEsIC8vIGxsdm0ueDg2LnBjbG11bHFkcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5wY2xtdWxxZHEuNTEyCisgICAgMywgLy8gbGx2bS54ODYucmRmc2Jhc2UuMzIKKyAgICAzLCAvLyBsbHZtLng4Ni5yZGZzYmFzZS42NAorICAgIDMsIC8vIGxsdm0ueDg2LnJkZ3NiYXNlLjMyCisgICAgMywgLy8gbGx2bS54ODYucmRnc2Jhc2UuNjQKKyAgICAzLCAvLyBsbHZtLng4Ni5yZHBpZAorICAgIDMsIC8vIGxsdm0ueDg2LnJkcGtydQorICAgIDMsIC8vIGxsdm0ueDg2LnJkcG1jCisgICAgMywgLy8gbGx2bS54ODYucmRyYW5kLjE2CisgICAgMywgLy8gbGx2bS54ODYucmRyYW5kLjMyCisgICAgMywgLy8gbGx2bS54ODYucmRyYW5kLjY0CisgICAgMywgLy8gbGx2bS54ODYucmRzZWVkLjE2CisgICAgMywgLy8gbGx2bS54ODYucmRzZWVkLjMyCisgICAgMywgLy8gbGx2bS54ODYucmRzZWVkLjY0CisgICAgMywgLy8gbGx2bS54ODYucmRzc3BkCisgICAgMywgLy8gbGx2bS54ODYucmRzc3BxCisgICAgMywgLy8gbGx2bS54ODYucmR0c2MKKyAgICAyMSwgLy8gbGx2bS54ODYucmR0c2NwCisgICAgMywgLy8gbGx2bS54ODYucnN0b3Jzc3AKKyAgICAzLCAvLyBsbHZtLng4Ni5zYXZlcHJldnNzcAorICAgIDMsIC8vIGxsdm0ueDg2LnNlaC5laGd1YXJkCisgICAgMywgLy8gbGx2bS54ODYuc2VoLmVocmVnbm9kZQorICAgIDEsIC8vIGxsdm0ueDg2LnNlaC5sc2RhCisgICAgMSwgLy8gbGx2bS54ODYuc2VoLnJlY292ZXJmcAorICAgIDMsIC8vIGxsdm0ueDg2LnNldHNzYnN5CisgICAgMSwgLy8gbGx2bS54ODYuc2hhMW1zZzEKKyAgICAxLCAvLyBsbHZtLng4Ni5zaGExbXNnMgorICAgIDEsIC8vIGxsdm0ueDg2LnNoYTFuZXh0ZQorICAgIDEsIC8vIGxsdm0ueDg2LnNoYTFybmRzNAorICAgIDEsIC8vIGxsdm0ueDg2LnNoYTI1Nm1zZzEKKyAgICAxLCAvLyBsbHZtLng4Ni5zaGEyNTZtc2cyCisgICAgMSwgLy8gbGx2bS54ODYuc2hhMjU2cm5kczIKKyAgICAzLCAvLyBsbHZtLng4Ni5zbHdwY2IKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UuY21wLnBzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLmNtcC5zcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5jb21pZXEuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UuY29taWdlLnNzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLmNvbWlndC5zcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5jb21pbGUuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UuY29taWx0LnNzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLmNvbWluZXEuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UuY3Z0cGQycGkKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UuY3Z0cGkycGQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UuY3Z0cGkycHMKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UuY3Z0cHMycGkKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UuY3Z0c2kyc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UuY3Z0c2k2NDJzcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5jdnRzczJzaQorICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5jdnRzczJzaTY0CisgICAgMSwgLy8gbGx2bS54ODYuc3NlLmN2dHRwZDJwaQorICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5jdnR0cHMycGkKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UuY3Z0dHNzMnNpCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLmN2dHRzczJzaTY0CisgICAgMywgLy8gbGx2bS54ODYuc3NlLmxkbXhjc3IKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UubWF4LnBzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLm1heC5zcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5taW4ucHMKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UubWluLnNzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLm1vdm1zay5wcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5wc2h1Zi53CisgICAgMSwgLy8gbGx2bS54ODYuc3NlLnJjcC5wcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5yY3Auc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UucnNxcnQucHMKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UucnNxcnQuc3MKKyAgICAzLCAvLyBsbHZtLng4Ni5zc2Uuc2ZlbmNlCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLnNxcnQucHMKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2Uuc3FydC5zcworICAgIDMsIC8vIGxsdm0ueDg2LnNzZS5zdG14Y3NyCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLnVjb21pZXEuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UudWNvbWlnZS5zcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS51Y29taWd0LnNzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLnVjb21pbGUuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UudWNvbWlsdC5zcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS51Y29taW5lcS5zcworICAgIDMsIC8vIGxsdm0ueDg2LnNzZTIuY2xmbHVzaAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIuY21wLnBkCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5jbXAuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLmNvbWllcS5zZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIuY29taWdlLnNkCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5jb21pZ3Quc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLmNvbWlsZS5zZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIuY29taWx0LnNkCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5jb21pbmVxLnNkCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5jdnRkcTJwcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIuY3Z0cGQyZHEKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLmN2dHBkMnBzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5jdnRwczJkcQorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIuY3Z0c2Qyc2kKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLmN2dHNkMnNpNjQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLmN2dHNkMnNzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5jdnRzaTJzZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIuY3Z0c2k2NDJzZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIuY3Z0c3Myc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLmN2dHRwZDJkcQorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIuY3Z0dHBzMmRxCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5jdnR0c2Qyc2kKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLmN2dHRzZDJzaTY0CisgICAgMywgLy8gbGx2bS54ODYuc3NlMi5sZmVuY2UKKyAgICAzLCAvLyBsbHZtLng4Ni5zc2UyLm1hc2ttb3YuZHF1CisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5tYXgucGQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLm1heC5zZAorICAgIDMsIC8vIGxsdm0ueDg2LnNzZTIubWZlbmNlCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5taW4ucGQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLm1pbi5zZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIubW92bXNrLnBkCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wYWNrc3Nkdy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBhY2tzc3diLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIucGFja3Vzd2IuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wYWRkcy5iCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wYWRkcy53CisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wYWRkdXMuYgorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIucGFkZHVzLncKKyAgICAzLCAvLyBsbHZtLng4Ni5zc2UyLnBhdXNlCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wbWFkZC53ZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIucG1vdm1za2IuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wbXVsaC53CisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wbXVsaHUudworICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIucG11bHUuZHEKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBzYWQuYncKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBzbGwuZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIucHNsbC5xCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wc2xsLncKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBzbGxpLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBzbGxpLnEKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBzbGxpLncKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBzcmEuZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIucHNyYS53CisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wc3JhaS5kCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wc3JhaS53CisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wc3JsLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBzcmwucQorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIucHNybC53CisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wc3JsaS5kCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wc3JsaS5xCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wc3JsaS53CisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wc3Vicy5iCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wc3Vicy53CisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wc3VidXMuYgorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIucHN1YnVzLncKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnNxcnQucGQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnNxcnQuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnVjb21pZXEuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnVjb21pZ2Uuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnVjb21pZ3Quc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnVjb21pbGUuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnVjb21pbHQuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnVjb21pbmVxLnNkCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMy5hZGRzdWIucGQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UzLmFkZHN1Yi5wcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZTMuaGFkZC5wZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTMuaGFkZC5wcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZTMuaHN1Yi5wZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTMuaHN1Yi5wcworICAgIDE2LCAvLyBsbHZtLng4Ni5zc2UzLmxkdS5kcQorICAgIDMsIC8vIGxsdm0ueDg2LnNzZTMubW9uaXRvcgorICAgIDMsIC8vIGxsdm0ueDg2LnNzZTMubXdhaXQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0MS5ibGVuZHZwZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQxLmJsZW5kdnBzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDEuZHBwZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQxLmRwcHMKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0MS5pbnNlcnRwcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQxLm1wc2FkYncKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0MS5wYWNrdXNkdworICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQxLnBibGVuZHZiCisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDEucGhtaW5wb3N1dworICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQxLnBtdWxkcQorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQxLnB0ZXN0YworICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQxLnB0ZXN0bnpjCisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDEucHRlc3R6CisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDEucm91bmQucGQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0MS5yb3VuZC5wcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQxLnJvdW5kLnNkCisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDEucm91bmQuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0Mi5jcmMzMi4zMi4xNgorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQyLmNyYzMyLjMyLjMyCisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDIuY3JjMzIuMzIuOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQyLmNyYzMyLjY0LjY0CisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDIucGNtcGVzdHJpMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDIucGNtcGVzdHJpYTEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQyLnBjbXBlc3RyaWMxMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0Mi5wY21wZXN0cmlvMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDIucGNtcGVzdHJpczEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQyLnBjbXBlc3RyaXoxMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0Mi5wY21wZXN0cm0xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0Mi5wY21waXN0cmkxMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0Mi5wY21waXN0cmlhMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDIucGNtcGlzdHJpYzEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQyLnBjbXBpc3RyaW8xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0Mi5wY21waXN0cmlzMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDIucGNtcGlzdHJpejEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQyLnBjbXBpc3RybTEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTRhLmV4dHJxCisgICAgMSwgLy8gbGx2bS54ODYuc3NlNGEuZXh0cnFpCisgICAgMSwgLy8gbGx2bS54ODYuc3NlNGEuaW5zZXJ0cQorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTRhLmluc2VydHFpCisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucGFicy5iCisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucGFicy5kCisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucGFicy53CisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucGhhZGQuZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzc2UzLnBoYWRkLmQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucGhhZGQuc3cKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5waGFkZC5zdy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5waGFkZC53CisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucGhhZGQudy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5waHN1Yi5kCisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucGhzdWIuZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5waHN1Yi5zdworICAgIDEsIC8vIGxsdm0ueDg2LnNzc2UzLnBoc3ViLnN3LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzc2UzLnBoc3ViLncKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5waHN1Yi53LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzc2UzLnBtYWRkLnViLnN3CisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucG1hZGQudWIuc3cuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucG11bC5oci5zdworICAgIDEsIC8vIGxsdm0ueDg2LnNzc2UzLnBtdWwuaHIuc3cuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucHNodWYuYgorICAgIDEsIC8vIGxsdm0ueDg2LnNzc2UzLnBzaHVmLmIuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucHNpZ24uYgorICAgIDEsIC8vIGxsdm0ueDg2LnNzc2UzLnBzaWduLmIuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucHNpZ24uZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzc2UzLnBzaWduLmQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucHNpZ24udworICAgIDEsIC8vIGxsdm0ueDg2LnNzc2UzLnBzaWduLncuMTI4CisgICAgMjEsIC8vIGxsdm0ueDg2LnN1YmJvcnJvdy51MzIKKyAgICAyMSwgLy8gbGx2bS54ODYuc3ViYm9ycm93LnU2NAorICAgIDEsIC8vIGxsdm0ueDg2LnRibS5iZXh0cmkudTMyCisgICAgMSwgLy8gbGx2bS54ODYudGJtLmJleHRyaS51NjQKKyAgICAxLCAvLyBsbHZtLng4Ni52Y3Z0cGgycHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYudmN2dHBoMnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LnZjdnRwczJwaC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni52Y3Z0cHMycGguMjU2CisgICAgMSwgLy8gbGx2bS54ODYudmdmMnA4YWZmaW5laW52cWIuMTI4CisgICAgMSwgLy8gbGx2bS54ODYudmdmMnA4YWZmaW5laW52cWIuMjU2CisgICAgMSwgLy8gbGx2bS54ODYudmdmMnA4YWZmaW5laW52cWIuNTEyCisgICAgMSwgLy8gbGx2bS54ODYudmdmMnA4YWZmaW5lcWIuMTI4CisgICAgMSwgLy8gbGx2bS54ODYudmdmMnA4YWZmaW5lcWIuMjU2CisgICAgMSwgLy8gbGx2bS54ODYudmdmMnA4YWZmaW5lcWIuNTEyCisgICAgMSwgLy8gbGx2bS54ODYudmdmMnA4bXVsYi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni52Z2YycDhtdWxiLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LnZnZjJwOG11bGIuNTEyCisgICAgMywgLy8gbGx2bS54ODYud3Jmc2Jhc2UuMzIKKyAgICAzLCAvLyBsbHZtLng4Ni53cmZzYmFzZS42NAorICAgIDMsIC8vIGxsdm0ueDg2LndyZ3NiYXNlLjMyCisgICAgMywgLy8gbGx2bS54ODYud3Jnc2Jhc2UuNjQKKyAgICAzLCAvLyBsbHZtLng4Ni53cnBrcnUKKyAgICAzLCAvLyBsbHZtLng4Ni53cnNzZAorICAgIDMsIC8vIGxsdm0ueDg2Lndyc3NxCisgICAgMywgLy8gbGx2bS54ODYud3J1c3NkCisgICAgMywgLy8gbGx2bS54ODYud3J1c3NxCisgICAgMywgLy8gbGx2bS54ODYueGFib3J0CisgICAgMywgLy8gbGx2bS54ODYueGJlZ2luCisgICAgMywgLy8gbGx2bS54ODYueGVuZAorICAgIDMsIC8vIGxsdm0ueDg2LnhnZXRidgorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52ZnJjei5wZAorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52ZnJjei5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudmZyY3oucHMKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudmZyY3oucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZmcmN6LnNkCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZmcmN6LnNzCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwY29tYgorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGNvbWQKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBjb21xCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwY29tdWIKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBjb211ZAorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGNvbXVxCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwY29tdXcKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBjb213CisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwZXJtaWwycGQKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBlcm1pbDJwZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBlcm1pbDJwcworICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGVybWlsMnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGhhZGRiZAorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGhhZGRicQorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGhhZGRidworICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGhhZGRkcQorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGhhZGR1YmQKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBoYWRkdWJxCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwaGFkZHVidworICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGhhZGR1ZHEKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBoYWRkdXdkCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwaGFkZHV3cQorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGhhZGR3ZAorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGhhZGR3cQorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGhzdWJidworICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGhzdWJkcQorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGhzdWJ3ZAorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cG1hY3NkZAorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cG1hY3NkcWgKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBtYWNzZHFsCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwbWFjc3NkZAorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cG1hY3NzZHFoCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwbWFjc3NkcWwKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBtYWNzc3dkCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwbWFjc3N3dworICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cG1hY3N3ZAorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cG1hY3N3dworICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cG1hZGNzc3dkCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwbWFkY3N3ZAorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cHBlcm0KKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnByb3RiCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwcm90YmkKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnByb3RkCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwcm90ZGkKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnByb3RxCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwcm90cWkKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnByb3R3CisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwcm90d2kKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBzaGFiCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwc2hhZAorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cHNoYXEKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBzaGF3CisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwc2hsYgorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cHNobGQKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBzaGxxCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwc2hsdworICAgIDMsIC8vIGxsdm0ueDg2Lnhyc3RvcgorICAgIDMsIC8vIGxsdm0ueDg2Lnhyc3RvcjY0CisgICAgMywgLy8gbGx2bS54ODYueHJzdG9ycworICAgIDMsIC8vIGxsdm0ueDg2Lnhyc3RvcnM2NAorICAgIDMsIC8vIGxsdm0ueDg2LnhzYXZlCisgICAgMywgLy8gbGx2bS54ODYueHNhdmU2NAorICAgIDMsIC8vIGxsdm0ueDg2LnhzYXZlYworICAgIDMsIC8vIGxsdm0ueDg2LnhzYXZlYzY0CisgICAgMywgLy8gbGx2bS54ODYueHNhdmVvcHQKKyAgICAzLCAvLyBsbHZtLng4Ni54c2F2ZW9wdDY0CisgICAgMywgLy8gbGx2bS54ODYueHNhdmVzCisgICAgMywgLy8gbGx2bS54ODYueHNhdmVzNjQKKyAgICAzLCAvLyBsbHZtLng4Ni54c2V0YnYKKyAgICAzLCAvLyBsbHZtLng4Ni54dGVzdAorICAgIDEsIC8vIGxsdm0ueGNvcmUuYml0cmV2CisgICAgMywgLy8gbGx2bS54Y29yZS5jaGVja2V2ZW50CisgICAgNDUsIC8vIGxsdm0ueGNvcmUuY2hrY3QKKyAgICAzLCAvLyBsbHZtLnhjb3JlLmNscmUKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5jbHJwdAorICAgIDMsIC8vIGxsdm0ueGNvcmUuY2xyc3IKKyAgICAxLCAvLyBsbHZtLnhjb3JlLmNyYzMyCisgICAgMSwgLy8gbGx2bS54Y29yZS5jcmM4CisgICAgNDUsIC8vIGxsdm0ueGNvcmUuZWR1CisgICAgNDUsIC8vIGxsdm0ueGNvcmUuZWV1CisgICAgNDUsIC8vIGxsdm0ueGNvcmUuZW5kaW4KKyAgICA0NSwgLy8gbGx2bS54Y29yZS5mcmVlcgorICAgIDMsIC8vIGxsdm0ueGNvcmUuZ2V0ZWQKKyAgICAzLCAvLyBsbHZtLnhjb3JlLmdldGV0CisgICAgMSwgLy8gbGx2bS54Y29yZS5nZXRpZAorICAgIDMsIC8vIGxsdm0ueGNvcmUuZ2V0cHMKKyAgICAzLCAvLyBsbHZtLnhjb3JlLmdldHIKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5nZXRzdAorICAgIDQ1LCAvLyBsbHZtLnhjb3JlLmdldHRzCisgICAgNDUsIC8vIGxsdm0ueGNvcmUuaW4KKyAgICA0NSwgLy8gbGx2bS54Y29yZS5pbmN0CisgICAgNDUsIC8vIGxsdm0ueGNvcmUuaW5pdGNwCisgICAgNDUsIC8vIGxsdm0ueGNvcmUuaW5pdGRwCisgICAgNDUsIC8vIGxsdm0ueGNvcmUuaW5pdGxyCisgICAgNDUsIC8vIGxsdm0ueGNvcmUuaW5pdHBjCisgICAgNDUsIC8vIGxsdm0ueGNvcmUuaW5pdHNwCisgICAgNDUsIC8vIGxsdm0ueGNvcmUuaW5zaHIKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5pbnQKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5tam9pbgorICAgIDQ1LCAvLyBsbHZtLnhjb3JlLm1zeW5jCisgICAgNDUsIC8vIGxsdm0ueGNvcmUub3V0CisgICAgNDUsIC8vIGxsdm0ueGNvcmUub3V0Y3QKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5vdXRzaHIKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5vdXR0CisgICAgNDUsIC8vIGxsdm0ueGNvcmUucGVlaworICAgIDQ1LCAvLyBsbHZtLnhjb3JlLnNldGMKKyAgICA0NiwgLy8gbGx2bS54Y29yZS5zZXRjbGsKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5zZXRkCisgICAgNDUsIC8vIGxsdm0ueGNvcmUuc2V0ZXYKKyAgICAzLCAvLyBsbHZtLnhjb3JlLnNldHBzCisgICAgNDUsIC8vIGxsdm0ueGNvcmUuc2V0cHNjCisgICAgNDUsIC8vIGxsdm0ueGNvcmUuc2V0cHQKKyAgICA0NiwgLy8gbGx2bS54Y29yZS5zZXRyZHkKKyAgICAzLCAvLyBsbHZtLnhjb3JlLnNldHNyCisgICAgNDUsIC8vIGxsdm0ueGNvcmUuc2V0dHcKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5zZXR2CisgICAgMSwgLy8gbGx2bS54Y29yZS5zZXh0CisgICAgMywgLy8gbGx2bS54Y29yZS5zc3luYworICAgIDQ1LCAvLyBsbHZtLnhjb3JlLnN5bmNyCisgICAgNDUsIC8vIGxsdm0ueGNvcmUudGVzdGN0CisgICAgNDUsIC8vIGxsdm0ueGNvcmUudGVzdHdjdAorICAgIDE2LCAvLyBsbHZtLnhjb3JlLndhaXRldmVudAorICAgIDEsIC8vIGxsdm0ueGNvcmUuemV4dAorICB9OworCisgIEF0dHJpYnV0ZUxpc3QgQVNbNV07CisgIHVuc2lnbmVkIE51bUF0dHJzID0gMDsKKyAgaWYgKGlkICE9IDApIHsKKyAgICBzd2l0Y2goSW50cmluc2ljc1RvQXR0cmlidXRlc01hcFtpZCAtIDFdKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBhdHRyaWJ1dGUgbnVtYmVyIik7CisgICAgY2FzZSAzOiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kfTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAxOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSA0NTogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRyUGFyYW0xW109IHtBdHRyaWJ1dGU6Ok5vQ2FwdHVyZX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCAxLCBBdHRyUGFyYW0xKTsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmR9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDQ2OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTFbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlfTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDEsIEF0dHJQYXJhbTEpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRyUGFyYW0yW109IHtBdHRyaWJ1dGU6Ok5vQ2FwdHVyZX07CisgICAgICBBU1sxXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCAyLCBBdHRyUGFyYW0yKTsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmR9OworICAgICAgQVNbMl0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDM7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDY6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtMltdPSB7QXR0cmlidXRlOjpXcml0ZU9ubHl9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMiwgQXR0clBhcmFtMik7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kfTsKKyAgICAgIEFTWzFdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAyOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAyNTogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRyUGFyYW0xW109IHtBdHRyaWJ1dGU6Ok5vQ2FwdHVyZSxBdHRyaWJ1dGU6OlJlYWRPbmx5fTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDEsIEF0dHJQYXJhbTEpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OkluYWNjZXNzaWJsZU1lbU9yQXJnTWVtT25seX07CisgICAgICBBU1sxXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMjsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMjE6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpBcmdNZW1Pbmx5fTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAxOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAxODogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRyUGFyYW0xW109IHtBdHRyaWJ1dGU6Ok5vQ2FwdHVyZX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCAxLCBBdHRyUGFyYW0xKTsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpBcmdNZW1Pbmx5fTsKKyAgICAgIEFTWzFdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAyOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSA4OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTFbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlLEF0dHJpYnV0ZTo6UmVhZE9ubHl9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMSwgQXR0clBhcmFtMSk7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6QXJnTWVtT25seX07CisgICAgICBBU1sxXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMjsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMjQ6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtMVtdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmUsQXR0cmlidXRlOjpXcml0ZU9ubHl9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMSwgQXR0clBhcmFtMSk7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6QXJnTWVtT25seX07CisgICAgICBBU1sxXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMjsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMjI6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtMVtdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmUsQXR0cmlidXRlOjpXcml0ZU9ubHl9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMSwgQXR0clBhcmFtMSk7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTJbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlLEF0dHJpYnV0ZTo6UmVhZE9ubHl9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMiwgQXR0clBhcmFtMik7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6QXJnTWVtT25seX07CisgICAgICBBU1syXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMzsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMjM6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtMVtdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmV9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMSwgQXR0clBhcmFtMSk7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTJbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlLEF0dHJpYnV0ZTo6UmVhZE9ubHl9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMiwgQXR0clBhcmFtMik7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6QXJnTWVtT25seX07CisgICAgICBBU1syXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMzsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMjA6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtMltdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmV9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMiwgQXR0clBhcmFtMik7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6QXJnTWVtT25seX07CisgICAgICBBU1sxXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMjsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMTc6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtMltdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmV9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMiwgQXR0clBhcmFtMik7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTNbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlfTsKKyAgICAgIEFTWzFdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDMsIEF0dHJQYXJhbTMpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OkFyZ01lbU9ubHl9OworICAgICAgQVNbMl0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDM7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDE5OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTNbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlfTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDMsIEF0dHJQYXJhbTMpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OkFyZ01lbU9ubHl9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDI4OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTRbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlfTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDQsIEF0dHJQYXJhbTQpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OkFyZ01lbU9ubHl9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDI5OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTVbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlfTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDUsIEF0dHJQYXJhbTUpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OkFyZ01lbU9ubHl9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDMwOiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTZbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlfTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDYsIEF0dHJQYXJhbTYpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OkFyZ01lbU9ubHl9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDE1OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6SW5hY2Nlc3NpYmxlTWVtT25seX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMzI6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpXcml0ZU9ubHl9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDI3OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTFbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlLEF0dHJpYnV0ZTo6UmVhZE9ubHl9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMSwgQXR0clBhcmFtMSk7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6V3JpdGVPbmx5fTsKKyAgICAgIEFTWzFdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAyOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSA0MDogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OldyaXRlT25seSxBdHRyaWJ1dGU6OkFyZ01lbU9ubHl9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDM5OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTFbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlLEF0dHJpYnV0ZTo6V3JpdGVPbmx5fTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDEsIEF0dHJQYXJhbTEpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OldyaXRlT25seSxBdHRyaWJ1dGU6OkFyZ01lbU9ubHl9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDE2OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6UmVhZE9ubHl9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDI6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpSZWFkT25seSxBdHRyaWJ1dGU6OkFyZ01lbU9ubHl9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDM3OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTFbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlfTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDEsIEF0dHJQYXJhbTEpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OlJlYWRPbmx5LEF0dHJpYnV0ZTo6QXJnTWVtT25seX07CisgICAgICBBU1sxXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMjsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMTM6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtMVtdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmUsQXR0cmlidXRlOjpSZWFkT25seX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCAxLCBBdHRyUGFyYW0xKTsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpSZWFkT25seSxBdHRyaWJ1dGU6OkFyZ01lbU9ubHl9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDk6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtMltdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmUsQXR0cmlidXRlOjpSZWFkT25seX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCAyLCBBdHRyUGFyYW0yKTsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpSZWFkT25seSxBdHRyaWJ1dGU6OkFyZ01lbU9ubHl9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDEwOiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTJbXT0ge0F0dHJpYnV0ZTo6UmVhZE5vbmV9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMiwgQXR0clBhcmFtMik7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTNbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlLEF0dHJpYnV0ZTo6UmVhZE9ubHl9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMywgQXR0clBhcmFtMyk7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6UmVhZE9ubHksQXR0cmlidXRlOjpBcmdNZW1Pbmx5fTsKKyAgICAgIEFTWzJdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAzOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAxOiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6UmVhZE5vbmV9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDEyOiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTFbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlfTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDEsIEF0dHJQYXJhbTEpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OlJlYWROb25lfTsKKyAgICAgIEFTWzFdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAyOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAyNjogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRyUGFyYW0xW109IHtBdHRyaWJ1dGU6OlJldHVybmVkfTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDEsIEF0dHJQYXJhbTEpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OlJlYWROb25lfTsKKyAgICAgIEFTWzFdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAyOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAxMTogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRyUGFyYW0xW109IHtBdHRyaWJ1dGU6OlJlYWROb25lfTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDEsIEF0dHJQYXJhbTEpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRyUGFyYW0yW109IHtBdHRyaWJ1dGU6OlJlYWROb25lfTsKKyAgICAgIEFTWzFdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDIsIEF0dHJQYXJhbTIpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OlJlYWROb25lfTsKKyAgICAgIEFTWzJdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAzOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSA0MzogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZH07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMzY6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpXcml0ZU9ubHksQXR0cmlidXRlOjpBcmdNZW1Pbmx5fTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAxOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAzNDogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OlNwZWN1bGF0YWJsZSxBdHRyaWJ1dGU6OlJlYWRPbmx5fTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAxOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSA0OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6U3BlY3VsYXRhYmxlLEF0dHJpYnV0ZTo6UmVhZE5vbmV9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDMzOiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6Q29udmVyZ2VudH07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMzg6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpDb252ZXJnZW50LEF0dHJpYnV0ZTo6SW5hY2Nlc3NpYmxlTWVtT25seX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMzE6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpDb252ZXJnZW50LEF0dHJpYnV0ZTo6UmVhZE5vbmV9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDE0OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6Tm9SZXR1cm59OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDU6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpOb0R1cGxpY2F0ZSxBdHRyaWJ1dGU6OkluYWNjZXNzaWJsZU1lbU9ubHl9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDQyOiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6Tm9EdXBsaWNhdGUsQXR0cmlidXRlOjpXcml0ZU9ubHl9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDc6IHsKKyAgICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0KCk7CisgICAgICB9CisgICAgY2FzZSAzNTogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpSZWFkTm9uZX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgNDQ6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9SZXR1cm59OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDQxOiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vUmV0dXJuLEF0dHJpYnV0ZTo6V3JpdGVPbmx5fTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAxOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgbWFrZUFycmF5UmVmKEFTLCBOdW1BdHRycykpOworfQorI2VuZGlmIC8vIEdFVF9JTlRSSU5TSUNfQVRUUklCVVRFUworCisvLyBHZXQgdGhlIExMVk0gaW50cmluc2ljIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBidWlsdGluLgorLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBDIGZyb250LWVuZC4gIFRoZSBidWlsdGluIG5hbWUgaXMgcGFzc2VkCisvLyBpbiBhcyBCdWlsdGluTmFtZSwgYW5kIGEgdGFyZ2V0IHByZWZpeCAoZS5nLiAncHBjJykgaXMgcGFzc2VkCisvLyBpbiBhcyBUYXJnZXRQcmVmaXguICBUaGUgcmVzdWx0IGlzIGFzc2lnbmVkIHRvICdJbnRyaW5zaWNJRCcuCisjaWZkZWYgR0VUX0xMVk1fSU5UUklOU0lDX0ZPUl9HQ0NfQlVJTFRJTgorSW50cmluc2ljOjpJRCBJbnRyaW5zaWM6OmdldEludHJpbnNpY0ZvckdDQ0J1aWx0aW4oY29uc3QgY2hhciAqVGFyZ2V0UHJlZml4U3RyLCBTdHJpbmdSZWYgQnVpbHRpbk5hbWVTdHIpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgQnVpbHRpbk5hbWVzW10gPSB7CisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnZCcsICdqJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAndCcsICdyJywgJ2EnLCAnbScsICdwJywgJ28nLCAnbCcsICdpJywgJ24nLCAnZScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnZCcsICdlJywgJ2InLCAndScsICdnJywgJ3QnLCAncicsCisgICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3UnLCAnbicsCisgICd3JywgJ2knLCAnbicsICdkJywgJ18nLCAnaScsICduJywgJ2knLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnZicsICdsJywgJ3QnLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAncycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICduJywgJ2knLCAndCcsCisgICdfJywgJ3QnLCAncicsICdhJywgJ20nLCAncCcsICdvJywgJ2wnLCAnaScsICduJywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ28nLCAnYicsICdqJywgJ2UnLCAnYycsICd0JywgJ18nLCAncycsCisgICdpJywgJ3onLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsCisgICd0JywgJ2EnLCAnYycsICdrJywgJ18nLCAncicsICdlJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICd0JywgJ2EnLCAnYycsICdrJywgJ18nLCAncycsCisgICdhJywgJ3YnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndCcsCisgICdoJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ28nLCAnaScsICduJywgJ3QnLCAnZScsICdyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ2QnLCAnbScsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsCisgICdfJywgJ2QnLCAncycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ3InLCAnbScsICdfJywgJ2knLCAncycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ2InLCAndScsICdmJywgJ2YnLCAnZScsCisgICdyJywgJ18nLCAndycsICdiJywgJ2knLCAnbicsICd2JywgJ2wnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdiJywgJ3UnLCAnZicsCisgICdmJywgJ2UnLCAncicsICdfJywgJ3cnLCAnYicsICdpJywgJ24nLCAndicsICdsJywgJzEnLCAnXycsICdzJywgJ2MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsCisgICduJywgJ18nLCAnYicsICd1JywgJ2YnLCAnZicsICdlJywgJ3InLCAnXycsICd3JywgJ2InLCAnaScsICduJywgJ3YnLCAnbCcsCisgICcxJywgJ18nLCAndicsICdvJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAnYycsICd1JywgJ2InLCAnZScsICdpJywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsCisgICduJywgJ18nLCAnYycsICd1JywgJ2InLCAnZScsICdtJywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAnYycsICd1JywgJ2InLCAnZScsCisgICdzJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsCisgICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAnYycsICd1JywgJ2InLCAnZScsICd0JywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAnYycsCisgICd2JywgJ3QnLCAnXycsICdwJywgJ2snLCAnXycsICd1JywgJzgnLCAnXycsICdmJywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsCisgICdkJywgJ2knLCAncycsICdwJywgJ2EnLCAndCcsICdjJywgJ2gnLCAnXycsICdpJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAnZCcsCisgICdpJywgJ3MnLCAncCcsICdhJywgJ3QnLCAnYycsICdoJywgJ18nLCAncCcsICd0JywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAnZCcsCisgICdzJywgJ18nLCAnYicsICdwJywgJ2UnLCAncicsICdtJywgJ3UnLCAndCcsICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ2QnLCAncycsCisgICdfJywgJ2YnLCAnYScsICdkJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAnZCcsICdzJywgJ18nLCAnZicsICdtJywgJ2EnLCAneCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsCisgICdjJywgJ24nLCAnXycsICdkJywgJ3MnLCAnXycsICdmJywgJ20nLCAnaScsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ2QnLCAncycsCisgICdfJywgJ3AnLCAnZScsICdyJywgJ20nLCAndScsICd0JywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAnZCcsICdzJywgJ18nLCAncycsCisgICd3JywgJ2knLCAneicsICd6JywgJ2wnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdmJywgJ20nLCAnZScsICdkJywgJzMnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsCisgICduJywgJ18nLCAnZicsICdtJywgJ3UnLCAnbCcsICdfJywgJ2wnLCAnZScsICdnJywgJ2EnLCAnYycsICd5JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsCisgICdfJywgJ2cnLCAncicsICdvJywgJ3UnLCAncCcsICdzJywgJ3QnLCAnYScsICd0JywgJ2knLCAnYycsICdzJywgJ2knLCAneicsCisgICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsCisgICdnJywgJ2MnLCAnbicsICdfJywgJ2knLCAnbScsICdwJywgJ2wnLCAnaScsICdjJywgJ2knLCAndCcsICdfJywgJ2InLCAndScsCisgICdmJywgJ2YnLCAnZScsICdyJywgJ18nLCAncCcsICd0JywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAnaScsICdtJywgJ3AnLCAnbCcsCisgICdpJywgJ2MnLCAnaScsICd0JywgJ2EnLCAncicsICdnJywgJ18nLCAncCcsICd0JywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAnaScsCisgICduJywgJ3QnLCAnZScsICdyJywgJ3AnLCAnXycsICdtJywgJ28nLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdpJywgJ24nLCAndCcsCisgICdlJywgJ3InLCAncCcsICdfJywgJ3AnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdpJywgJ24nLCAndCcsICdlJywgJ3InLCAncCcsCisgICdfJywgJ3AnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdrJywgJ2UnLCAncicsICduJywgJ2EnLCAncicsICdnJywgJ18nLCAncycsCisgICdlJywgJ2cnLCAnbScsICdlJywgJ24nLCAndCcsICdfJywgJ3AnLCAndCcsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ2wnLCAnZScsCisgICdyJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsCisgICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAnbScsICdiJywgJ2MnLCAnbicsICd0JywgJ18nLCAnaCcsICdpJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsCisgICdfJywgJ20nLCAnYicsICdjJywgJ24nLCAndCcsICdfJywgJ2wnLCAnbycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdtJywgJ3EnLCAncycsCisgICdhJywgJ2QnLCAnXycsICdwJywgJ2snLCAnXycsICd1JywgJzEnLCAnNicsICdfJywgJ3UnLCAnOCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsCisgICdtJywgJ3EnLCAncycsICdhJywgJ2QnLCAnXycsICd1JywgJzMnLCAnMicsICdfJywgJ3UnLCAnOCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdkJywgJ18nLCAndScsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ3EnLCAncycsICdhJywgJ2QnLCAnXycsCisgICdwJywgJ2snLCAnXycsICd1JywgJzEnLCAnNicsICdfJywgJ3UnLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdxJywgJ3UnLCAnZScsCisgICd1JywgJ2UnLCAnXycsICdwJywgJ3QnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdyJywgJ2MnLCAncCcsICdfJywgJ2wnLCAnZScsCisgICdnJywgJ2EnLCAnYycsICd5JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnZicsICdpJywgJ3InLCAncycsCisgICd0JywgJ2wnLCAnYScsICduJywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdsJywgJ2EnLCAnbicsCisgICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsCisgICdnJywgJ2MnLCAnbicsICdfJywgJ3InLCAncycsICdxJywgJ18nLCAnbCcsICdlJywgJ2cnLCAnYScsICdjJywgJ3knLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsCisgICduJywgJ18nLCAncycsICdfJywgJ2InLCAnYScsICdyJywgJ3InLCAnaScsICdlJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAncycsCisgICdfJywgJ2QnLCAnYycsICdhJywgJ2MnLCAnaCcsICdlJywgJ18nLCAnaScsICduJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAncycsCisgICdfJywgJ2QnLCAnYycsICdhJywgJ2MnLCAnaCcsICdlJywgJ18nLCAnaScsICduJywgJ3YnLCAnXycsICd2JywgJ28nLCAnbCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsCisgICdjJywgJ24nLCAnXycsICdzJywgJ18nLCAnZCcsICdjJywgJ2EnLCAnYycsICdoJywgJ2UnLCAnXycsICd3JywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsCisgICduJywgJ18nLCAncycsICdfJywgJ2QnLCAnYycsICdhJywgJ2MnLCAnaCcsICdlJywgJ18nLCAndycsICdiJywgJ18nLCAndicsCisgICdvJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsCisgICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAncycsICdfJywgJ2QnLCAnZScsICdjJywgJ3AnLCAnZScsICdyJywgJ2YnLCAnbCcsCisgICdlJywgJ3YnLCAnZScsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ3MnLCAnXycsICdnJywgJ2UnLCAndCcsICdwJywgJ2MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsCisgICduJywgJ18nLCAncycsICdfJywgJ2cnLCAnZScsICd0JywgJ3InLCAnZScsICdnJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ3MnLCAnXycsCisgICdpJywgJ24nLCAnYycsICdwJywgJ2UnLCAncicsICdmJywgJ2wnLCAnZScsICd2JywgJ2UnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsCisgICdzJywgJ18nLCAnbScsICdlJywgJ20nLCAncicsICdlJywgJ2EnLCAnbCcsICd0JywgJ2knLCAnbScsICdlJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsCisgICdfJywgJ3MnLCAnXycsICdtJywgJ2UnLCAnbScsICd0JywgJ2knLCAnbScsICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ3MnLCAnXycsCisgICdzJywgJ2UnLCAnbicsICdkJywgJ20nLCAncycsICdnJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ3MnLCAnXycsICdzJywgJ2UnLCAnbicsCisgICdkJywgJ20nLCAncycsICdnJywgJ2gnLCAnYScsICdsJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAncycsICdfJywgJ3MnLCAnbCcsCisgICdlJywgJ2UnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdzJywgJ18nLCAndycsICdhJywgJ2knLCAndCcsICdjJywgJ24nLCAndCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsCisgICdjJywgJ24nLCAnXycsICdzJywgJ2EnLCAnZCcsICdfJywgJ2gnLCAnaScsICdfJywgJ3UnLCAnOCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsCisgICdzJywgJ2EnLCAnZCcsICdfJywgJ3UnLCAnMScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ3MnLCAnYScsICdkJywgJ18nLCAndScsCisgICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsCisgICdnJywgJ2MnLCAnbicsICdfJywgJ3cnLCAnYScsICd2JywgJ2UnLCAnXycsICdiJywgJ2EnLCAncicsICdyJywgJ2knLCAnZScsCisgICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsCisgICdnJywgJ2MnLCAnbicsICdfJywgJ3cnLCAnbycsICdyJywgJ2snLCAnZycsICdyJywgJ28nLCAndScsICdwJywgJ18nLCAnaScsCisgICdkJywgJ18nLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICd3JywgJ28nLCAncicsICdrJywgJ2cnLCAncicsICdvJywgJ3UnLCAncCcsCisgICdfJywgJ2knLCAnZCcsICdfJywgJ3knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAndycsICdvJywgJ3InLCAnaycsICdnJywgJ3InLCAnbycsCisgICd1JywgJ3AnLCAnXycsICdpJywgJ2QnLCAnXycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ3cnLCAncicsICdpJywgJ3QnLCAnZScsCisgICdsJywgJ2EnLCAnbicsICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ3InLCAnbScsICdfJywgJ2MnLCAnZCcsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ2MnLCAnZCcsICdwJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAnZycsICdlJywgJ3QnLCAnXycsCisgICdmJywgJ3AnLCAncycsICdjJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAnbCcsICdkJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAnbCcsICdkJywgJ2MnLCAnMicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdsJywgJ2QnLCAnYycsCisgICcyJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsCisgICdtJywgJ18nLCAnbCcsICdkJywgJ2MnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdtJywgJ2MnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdtJywgJ2MnLCAncicsICcyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ20nLCAncicsCisgICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsCisgICdfJywgJ20nLCAncicsICdjJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncScsICdhJywgJ2QnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdxJywgJ2EnLCAnZCcsICdkJywgJzEnLCAnNicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsCisgICdxJywgJ2EnLCAnZCcsICdkJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncScsICdhJywgJ3MnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdxJywgJ3MnLCAnYScsICd4JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3EnLCAncycsCisgICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsCisgICdtJywgJ18nLCAncScsICdzJywgJ3UnLCAnYicsICcxJywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncScsICdzJywgJ3UnLCAnYicsICc4JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnYScsCisgICdkJywgJ2QnLCAnMScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnYScsICdkJywgJ2QnLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdzJywgJ2EnLCAncycsICd4JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnZScsCisgICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsCisgICdfJywgJ3MnLCAnZScsICd0JywgJ18nLCAnZicsICdwJywgJ3MnLCAnYycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnaCcsICdhJywgJ2QnLCAnZCcsCisgICcxJywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsCisgICdtJywgJ18nLCAncycsICdoJywgJ2EnLCAnZCcsICdkJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncycsICdoJywgJ2EnLCAncycsICd4JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnaCcsCisgICdzJywgJ2EnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdyJywgJ20nLCAnXycsICdzJywgJ2gnLCAncycsICd1JywgJ2InLCAnMScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnaCcsICdzJywgJ3UnLCAnYicsCisgICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsCisgICdfJywgJ3MnLCAnbScsICdsJywgJ2EnLCAnYicsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsICdsJywgJ2EnLCAnYicsICd0JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsCisgICdsJywgJ2EnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdyJywgJ20nLCAnXycsICdzJywgJ20nLCAnbCcsICdhJywgJ2QnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdzJywgJ20nLCAnbCcsICdhJywgJ2wnLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsCisgICdzJywgJ20nLCAnbCcsICdhJywgJ2wnLCAnZCcsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsICdsJywgJ2EnLCAndCcsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsCisgICdsJywgJ2EnLCAndCcsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsICdsJywgJ2EnLCAndycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsICdsJywgJ2EnLCAndycsCisgICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsCisgICdfJywgJ3MnLCAnbScsICdsJywgJ3MnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdzJywgJ20nLCAnbCcsICdzJywgJ2QnLCAneCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdzJywgJ20nLCAnbCcsCisgICdzJywgJ2wnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdyJywgJ20nLCAnXycsICdzJywgJ20nLCAnbCcsICdzJywgJ2wnLCAnZCcsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsICd1JywgJ2EnLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsCisgICdzJywgJ20nLCAndScsICdhJywgJ2QnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdzJywgJ20nLCAndScsICdsJywgJ2InLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdzJywgJ20nLCAndScsCisgICdsJywgJ2InLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdyJywgJ20nLCAnXycsICdzJywgJ20nLCAndScsICdsJywgJ3QnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdzJywgJ20nLCAndScsICdsJywgJ3QnLCAndCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsCisgICdzJywgJ20nLCAndScsICdsJywgJ3cnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdzJywgJ20nLCAndScsICdsJywgJ3cnLCAndCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdzJywgJ20nLCAndScsCisgICdzJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsCisgICdtJywgJ18nLCAncycsICdtJywgJ3UnLCAncycsICdkJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncycsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdzJywgJ3MnLCAnYScsCisgICd0JywgJzEnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdyJywgJ20nLCAnXycsICdzJywgJ3MnLCAnYScsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAncycsICd1JywgJ2InLCAnMScsICc2JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAncycsCisgICd1JywgJ2InLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdyJywgJ20nLCAnXycsICdzJywgJ3QnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdzJywgJ3QnLCAnYycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAndCcsICdjJywgJzInLCAnbCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsCisgICdzJywgJ3QnLCAnYycsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAneCcsICd0JywgJ2EnLCAnYicsICcxJywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncycsICd4JywgJ3QnLCAnYicsCisgICcxJywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsCisgICdtJywgJ18nLCAndScsICdhJywgJ2QnLCAnZCcsICcxJywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAndScsICdhJywgJ2QnLCAnZCcsICc4JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3UnLCAnYScsCisgICdzJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsCisgICdtJywgJ18nLCAndScsICdoJywgJ2EnLCAnZCcsICdkJywgJzEnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICd1JywgJ2gnLCAnYScsICdkJywgJ2QnLCAnOCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsCisgICd1JywgJ2gnLCAnYScsICdzJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAndScsICdoJywgJ3MnLCAnYScsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3UnLCAnaCcsICdzJywgJ3UnLCAnYicsCisgICcxJywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsCisgICdtJywgJ18nLCAndScsICdoJywgJ3MnLCAndScsICdiJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAndScsICdxJywgJ2EnLCAnZCcsICdkJywgJzEnLCAnNicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsCisgICd1JywgJ3EnLCAnYScsICdkJywgJ2QnLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICd1JywgJ3EnLCAnYScsICdzJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAndScsICdxJywgJ3MnLCAnYScsCisgICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsCisgICdfJywgJ3UnLCAncScsICdzJywgJ3UnLCAnYicsICcxJywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAndScsICdxJywgJ3MnLCAndScsICdiJywgJzgnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAndScsCisgICdzJywgJ2EnLCAnZCcsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ3InLCAnbScsICdfJywgJ3UnLCAncycsICdhJywgJ2QnLCAnYScsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3UnLCAncycsICdhJywgJ3QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAndScsCisgICdzJywgJ2EnLCAndCcsICcxJywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAndScsICdzJywgJ2EnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICd1JywgJ3MnLCAndScsICdiJywgJzEnLCAnNicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsCisgICd1JywgJ3MnLCAndScsICdiJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAndScsICd4JywgJ3QnLCAnYScsICdiJywgJzEnLCAnNicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICd1JywgJ3gnLCAndCcsCisgICdiJywgJzEnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYicsCisgICdwJywgJ2YnLCAnXycsICdsJywgJ28nLCAnYScsICdkJywgJ18nLCAnYicsICd5JywgJ3QnLCAnZScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYicsICdwJywgJ2YnLCAnXycsICdsJywgJ28nLCAnYScsCisgICdkJywgJ18nLCAnaCcsICdhJywgJ2wnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYicsICdwJywgJ2YnLCAnXycsICdsJywgJ28nLCAnYScsICdkJywgJ18nLCAndycsICdvJywgJ3InLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYicsICdwJywgJ2YnLCAnXycsCisgICdwJywgJ3MnLCAnZScsICd1JywgJ2QnLCAnbycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ2EnLCAnYicsCisgICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnYScsICdiJywgJ3MnLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0EnLCAnMicsICdfJywgJ2EnLCAnYicsICdzJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsCisgICcyJywgJ18nLCAnYScsICdkJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdhJywgJ2QnLCAnZCcsCisgICdoJywgJ18nLCAnaCcsICcxJywgJzYnLCAnXycsICdoJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsCisgICdhJywgJ2QnLCAnZCcsICdoJywgJ18nLCAnaCcsICcxJywgJzYnLCAnXycsICdoJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdBJywgJzInLCAnXycsICdhJywgJ2QnLCAnZCcsICdoJywgJ18nLCAnaCcsICcxJywgJzYnLCAnXycsICdsJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdhJywgJ2QnLCAnZCcsICdoJywgJ18nLCAnaCcsICcxJywgJzYnLCAnXycsCisgICdsJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdhJywgJ2QnLCAnZCcsICdoJywgJ18nLCAnaCcsCisgICcxJywgJzYnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2gnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsCisgICdfJywgJ2EnLCAnZCcsICdkJywgJ2gnLCAnXycsICdoJywgJzEnLCAnNicsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnaCcsCisgICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnYScsICdkJywgJ2QnLCAnaCcsICdfJywgJ2gnLCAnMScsCisgICc2JywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdsJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsCisgICdhJywgJ2QnLCAnZCcsICdoJywgJ18nLCAnaCcsICcxJywgJzYnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2wnLCAnbCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ2EnLCAnZCcsICdkJywgJ2gnLCAnXycsICdsJywgJzEnLCAnNicsCisgICdfJywgJ2gnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ2EnLCAnZCcsICdkJywgJ2gnLCAnXycsCisgICdsJywgJzEnLCAnNicsICdfJywgJ2wnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ2EnLCAnZCcsCisgICdkJywgJ2gnLCAnXycsICdsJywgJzEnLCAnNicsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnaCcsICdsJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnYScsICdkJywgJ2QnLCAnaCcsICdfJywgJ2wnLCAnMScsICc2JywgJ18nLCAncycsCisgICdhJywgJ3QnLCAnXycsICdsJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdhJywgJ2QnLCAnZCcsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnYScsICdkJywgJ2QnLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0EnLCAnMicsICdfJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdBJywgJzInLCAnXycsICdhJywgJ2QnLCAnZCcsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsCisgICdfJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ2EnLCAnbicsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnYScsICduJywgJ2QnLCAnaScsICdyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnYScsICduJywgJ2QnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsCisgICdfJywgJ2EnLCAncycsICdsJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdhJywgJ3MnLCAncicsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAnYicsICdpJywgJ24nLCAnZScsCisgICdfJywgJ2gnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ2InLCAnaScsCisgICduJywgJ2UnLCAnXycsICdoJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdjJywgJ28nLCAnbScsCisgICdiJywgJ2knLCAnbicsICdlJywgJ18nLCAnbCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnYycsCisgICdvJywgJ20nLCAnYicsICdpJywgJ24nLCAnZScsICdfJywgJ2wnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsCisgICdfJywgJ2MnLCAnbycsICdtJywgJ2InLCAnaScsICduJywgJ2UnLCAnaScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsCisgICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAnYicsICdpJywgJ24nLCAnZScsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdtJywgJ2EnLCAneCcsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnbScsICdhJywgJ3gnLCAndScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0EnLCAnMicsICdfJywgJ20nLCAnYScsICd4JywgJ3UnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsCisgICdfJywgJ20nLCAnaScsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnbScsICdpJywgJ24nLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ20nLCAnaScsICduJywgJ3UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdBJywgJzInLCAnXycsICdtJywgJ2knLCAnbicsICd1JywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsCisgICduJywgJ2UnLCAnZycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ24nLCAnZScsICdnJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICduJywgJ2UnLCAnZycsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0EnLCAnMicsICdfJywgJ24nLCAnbycsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnbicsCisgICdvJywgJ3QnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0EnLCAnMicsICdfJywgJ28nLCAncicsICdpJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsCisgICdvJywgJ3InLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsCisgICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAncycsICdhJywgJ3QnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsCisgICdfJywgJ3MnLCAnYScsICd0JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdzJywgJ2EnLCAndCcsCisgICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdzJywgJ2EnLCAndCcsICd1JywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdzJywgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsCisgICdfJywgJ3MnLCAndScsICdiJywgJ2gnLCAnXycsICdoJywgJzEnLCAnNicsICdfJywgJ2gnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAndScsICdiJywgJ2gnLCAnXycsICdoJywgJzEnLCAnNicsICdfJywgJ2gnLCAnbCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAndScsICdiJywgJ2gnLCAnXycsICdoJywgJzEnLCAnNicsCisgICdfJywgJ2wnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAndScsICdiJywgJ2gnLCAnXycsCisgICdoJywgJzEnLCAnNicsICdfJywgJ2wnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAndScsCisgICdiJywgJ2gnLCAnXycsICdoJywgJzEnLCAnNicsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnaCcsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAncycsICd1JywgJ2InLCAnaCcsICdfJywgJ2gnLCAnMScsICc2JywgJ18nLCAncycsCisgICdhJywgJ3QnLCAnXycsICdoJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdzJywgJ3UnLCAnYicsCisgICdoJywgJ18nLCAnaCcsICcxJywgJzYnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2wnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAndScsICdiJywgJ2gnLCAnXycsICdoJywgJzEnLCAnNicsICdfJywgJ3MnLCAnYScsCisgICd0JywgJ18nLCAnbCcsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAncycsICd1JywgJ2InLCAnaCcsCisgICdfJywgJ2wnLCAnMScsICc2JywgJ18nLCAnaCcsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAncycsCisgICd1JywgJ2InLCAnaCcsICdfJywgJ2wnLCAnMScsICc2JywgJ18nLCAnbCcsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsCisgICcyJywgJ18nLCAncycsICd1JywgJ2InLCAnaCcsICdfJywgJ2wnLCAnMScsICc2JywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsCisgICdoJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdzJywgJ3UnLCAnYicsICdoJywgJ18nLCAnbCcsCisgICcxJywgJzYnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2wnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsCisgICdfJywgJ3MnLCAndScsICdiJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdzJywgJ3UnLCAnYicsCisgICdyJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdzJywgJ3UnLCAnYicsICdzJywgJ2EnLCAndCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAndicsICdhJywgJ2QnLCAnZCcsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAncycsICd2JywgJ2EnLCAnZCcsICdkJywgJ2gnLCAncycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAndicsICdhJywgJ2QnLCAnZCcsICd1JywgJ2gnLCAncycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAndicsICdhJywgJ3YnLCAnZycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsCisgICcyJywgJ18nLCAncycsICd2JywgJ2EnLCAndicsICdnJywgJ2gnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsCisgICdfJywgJ3MnLCAndicsICduJywgJ2EnLCAndicsICdnJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsCisgICdzJywgJ3YnLCAncycsICd1JywgJ2InLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAndicsCisgICdzJywgJ3UnLCAnYicsICdoJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdzJywgJ3YnLCAncycsCisgICd1JywgJ2InLCAndScsICdoJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdzJywgJ3cnLCAnaScsCisgICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAncycsICd4JywgJ3QnLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAneCcsICd0JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsCisgICdzJywgJ3gnLCAndCcsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndCcsICdmJywgJ3InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd0JywgJ2YnLCAncicsICdpJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdBJywgJzInLCAnXycsICd0JywgJ2YnLCAncicsICdpJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsCisgICd0JywgJ2YnLCAncicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndCcsICdmJywgJ3InLCAncCcsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndCcsICdmJywgJ3InLCAncycsICdpJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdhJywgJ2InLCAncycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsCisgICcyJywgJ18nLCAndicsICdhJywgJ2InLCAncycsICdoJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsCisgICcyJywgJ18nLCAndicsICdhJywgJ2InLCAncycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsCisgICdhJywgJ2InLCAncycsICd3JywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsCisgICdhJywgJ2QnLCAnZCcsICdiJywgJ18nLCAnbScsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsCisgICd2JywgJ2EnLCAnZCcsICdkJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ2EnLCAnZCcsCisgICdkJywgJ2gnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd1JywgJ2InLCAncycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsICdoJywgJ3MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdBJywgJzInLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ3cnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsCisgICdfJywgJ3YnLCAnYScsICd2JywgJ2cnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnYScsCisgICd2JywgJ2cnLCAnaCcsICdjJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ2EnLCAndicsCisgICdnJywgJ2gnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnYScsICd2JywgJ2cnLCAndScsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICd1JywgJ2InLCAncicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnYScsICd2JywgJ2cnLCAndScsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICd1JywgJ2gnLCAncicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnYScsICd2JywgJ2cnLCAndScsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsCisgICcyJywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICd1JywgJ3cnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsCisgICdfJywgJ3YnLCAnYScsICd2JywgJ2cnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnYScsCisgICd2JywgJ2cnLCAndycsICdjJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ2EnLCAndicsCisgICdnJywgJ3cnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnYicsCisgICdlJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ2InLCAnZycsCisgICd0JywgJ3UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ2gnLCAnZScsCisgICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdoJywgJ2cnLCAndCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnaCcsICdnJywgJ3QnLCAndScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAndycsICdlJywgJ3EnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ3cnLCAnZycsICd0JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICd3JywgJ2cnLCAndCcsICd1JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdjJywgJ28nLCAnbicsICdqJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsCisgICcyJywgJ18nLCAndicsICdtJywgJ2EnLCAneCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsCisgICdtJywgJ2EnLCAneCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdtJywgJ2EnLCAneCcsCisgICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ3UnLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnbScsICdhJywgJ3gnLCAndScsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdtJywgJ2EnLCAneCcsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsCisgICcyJywgJ18nLCAndicsICdtJywgJ2knLCAnbicsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsCisgICdtJywgJ2knLCAnbicsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdtJywgJ2knLCAnbicsCisgICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ20nLCAnaScsICduJywgJ3UnLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnbScsICdpJywgJ24nLCAndScsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdtJywgJ2knLCAnbicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsCisgICcyJywgJ18nLCAndicsICduJywgJ2EnLCAndicsICdnJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsCisgICd2JywgJ24nLCAnYScsICd2JywgJ2cnLCAnaCcsICdjJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsCisgICd2JywgJ24nLCAnYScsICd2JywgJ2cnLCAnaCcsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsCisgICduJywgJ2EnLCAndicsICdnJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ24nLCAnYScsCisgICd2JywgJ2cnLCAndycsICdjJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ24nLCAnYScsCisgICd2JywgJ2cnLCAndycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdyJywgJ2EnLCAnZCcsCisgICdkJywgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAncicsICdhJywgJ2QnLCAnZCcsCisgICd1JywgJ2InLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAncicsCisgICdzJywgJ2EnLCAnZCcsICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ3InLCAncycsCisgICdhJywgJ2QnLCAndScsICdiJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsCisgICd2JywgJ3MnLCAndScsICdiJywgJ2InLCAnXycsICdtJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsCisgICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAncycsCisgICd1JywgJ2InLCAnaCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsCisgICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ3UnLCAnYicsCisgICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd1JywgJ2gnLCAncycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndycsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsCisgICcyJywgJ18nLCAneCcsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd4JywgJ28nLCAncicsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAneicsICd4JywgJ3QnLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0EnLCAnMicsICdfJywgJ3onLCAneCcsICd0JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsCisgICdhJywgJ24nLCAnZCcsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAnYScsICduJywgJ2QnLCAnbicsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAnYicsICdpJywgJ3QnLCAncycsICdwJywgJ2wnLCAnaScsCisgICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAnYicsICdpJywgJ3QnLCAncycsICdwJywgJ2wnLCAnaScsCisgICd0JywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICdiJywgJ28nLCAndScsICduJywgJ2QnLCAncycsCisgICdjJywgJ2gnLCAnZScsICdjJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICdjJywgJ20nLCAncCcsCisgICdiJywgJ2UnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywgJ2MnLCAnbScsICdwJywgJ2InLCAnZScsCisgICdxJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICdjJywgJ20nLCAncCcsICdiJywgJ2cnLCAndCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywgJ2MnLCAnbScsICdwJywgJ2InLCAnZycsICd0JywgJ2knLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICdjJywgJ20nLCAncCcsICdiJywgJ2cnLCAndCcsICd1JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAnYycsICdtJywgJ3AnLCAnYicsICdnJywgJ3QnLCAndScsICdpJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAnYycsICdtJywgJ3AnLCAnaCcsICdlJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdBJywgJzQnLCAnXycsICdjJywgJ20nLCAncCcsICdoJywgJ2UnLCAncScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsCisgICc0JywgJ18nLCAnYycsICdtJywgJ3AnLCAnaCcsICdnJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsCisgICdjJywgJ20nLCAncCcsICdoJywgJ2cnLCAndCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAnYycsCisgICdtJywgJ3AnLCAnaCcsICdnJywgJ3QnLCAndScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywgJ2MnLCAnbScsCisgICdwJywgJ2gnLCAnZycsICd0JywgJ3UnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywgJ2MnLCAnbycsCisgICdtJywgJ2InLCAnaScsICduJywgJ2UnLCAnaScsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAnYycsCisgICdvJywgJ20nLCAnYicsICdpJywgJ24nLCAnZScsICdyJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsCisgICdjJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywgJ3InLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsCisgICdfJywgJ2MnLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAncicsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsCisgICc0JywgJ18nLCAnbScsICdvJywgJ2QnLCAndycsICdyJywgJ2EnLCAncCcsICd1JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsCisgICc0JywgJ18nLCAnbycsICdyJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICdvJywgJ3InLCAnbicsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAncicsICdjJywgJ20nLCAncCcsICdlJywgJ3EnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICdyJywgJ2MnLCAnbScsICdwJywgJ2UnLCAncScsICdpJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAncicsICdjJywgJ20nLCAncCcsICduJywgJ2UnLCAncScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0EnLCAnNCcsICdfJywgJ3InLCAnYycsICdtJywgJ3AnLCAnbicsICdlJywgJ3EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0EnLCAnNCcsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywgJ3InLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0EnLCAnNCcsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywgJ3InLCAnaScsICdfJywgJ3MnLCAnYScsCisgICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAncicsCisgICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAncicsCisgICdyJywgJ18nLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICd0JywgJ2wnLCAnYicsCisgICdtJywgJ2EnLCAndCcsICdjJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICd2JywgJ2MnLCAnbScsCisgICdwJywgJ2InLCAnZScsICdxJywgJ18nLCAnYScsICduJywgJ3knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsCisgICd2JywgJ2MnLCAnbScsICdwJywgJ2InLCAnZScsICdxJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsCisgICd2JywgJ2MnLCAnbScsICdwJywgJ2InLCAnZycsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAndicsCisgICdjJywgJ20nLCAncCcsICdiJywgJ2cnLCAndCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAndicsCisgICdjJywgJ20nLCAncCcsICdiJywgJ2cnLCAndCcsICd1JywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsCisgICd2JywgJ2MnLCAnbScsICdwJywgJ2gnLCAnZScsICdxJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsCisgICd2JywgJ2MnLCAnbScsICdwJywgJ2gnLCAnZycsICd0JywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsCisgICd2JywgJ2MnLCAnbScsICdwJywgJ2gnLCAnZycsICd0JywgJ3UnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsCisgICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAndycsICdlJywgJ3EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsCisgICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAndycsICdnJywgJ3QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsCisgICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAndycsICdnJywgJ3QnLCAndScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsCisgICc0JywgJ18nLCAndicsICdyJywgJ20nLCAnYScsICd4JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsCisgICd2JywgJ3InLCAnbScsICdhJywgJ3gnLCAndScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAndicsCisgICdyJywgJ20nLCAnYScsICd4JywgJ3UnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywgJ3YnLCAncicsCisgICdtJywgJ2EnLCAneCcsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAndicsICdyJywgJ20nLCAnaScsCisgICduJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICd2JywgJ3InLCAnbScsICdpJywgJ24nLCAndScsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAndicsICdyJywgJ20nLCAnaScsICduJywgJ3UnLCAndycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywgJ3YnLCAncicsICdtJywgJ2knLCAnbicsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQScsICc1JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdoJywgJ3UnLCAnYicsICdzJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQScsICc2JywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdiJywgJ2UnLCAncScsICdfJywgJ24nLCAnbycsCisgICd0JywgJ2EnLCAnbicsICd5JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc2JywgJ18nLCAndicsICdjJywgJ20nLCAncCcsCisgICdiJywgJ2UnLCAncScsICdfJywgJ24nLCAnbycsICd0JywgJ2EnLCAnbicsICd5JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnMicsICdfJywgJ2EnLCAnbCcsICdsJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdDJywgJzInLCAnXycsICdhJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnMicsICdfJywgJ2EnLCAnbicsCisgICdkJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzInLCAnXycsICdhJywgJ24nLCAneScsICc4JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQycsICcyJywgJ18nLCAnYicsICdpJywgJ3QnLCAncycsICdjJywgJ2wnLCAncicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0MnLCAnMicsICdfJywgJ2InLCAnaScsICd0JywgJ3MnLCAnYycsICdsJywgJ3InLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0MnLCAnMicsICdfJywgJ2InLCAnaScsICd0JywgJ3MnLCAncycsICdlJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdDJywgJzInLCAnXycsICdjJywgJ20nLCAncCcsICdlJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzInLCAnXycsCisgICdjJywgJ20nLCAncCcsICdlJywgJ3EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnMicsICdfJywgJ2MnLCAnbScsCisgICdwJywgJ2UnLCAncScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICcyJywgJ18nLCAnYycsICdtJywgJ3AnLCAnZycsCisgICdlJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzInLCAnXycsICdjJywgJ20nLCAncCcsICdnJywgJ2UnLCAndScsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICcyJywgJ18nLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnQycsICcyJywgJ18nLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdDJywgJzInLCAnXycsICdjJywgJ20nLCAncCcsICdnJywgJ3QnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnMicsCisgICdfJywgJ2MnLCAnbScsICdwJywgJ2cnLCAndCcsICd1JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICcyJywgJ18nLCAnYycsCisgICdtJywgJ3AnLCAnZycsICd0JywgJ3UnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnMicsICdfJywgJ2MnLCAnbScsCisgICdwJywgJ2cnLCAndCcsICd1JywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzInLCAnXycsICdjJywgJ20nLCAncCcsCisgICdsJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzInLCAnXycsICdjJywgJ20nLCAncCcsICdsJywgJ3QnLCAndScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdDJywgJzInLCAnXycsICdtJywgJ3UnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnMicsICdfJywgJ20nLCAndScsCisgICd4JywgJ2knLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnMicsICdfJywgJ20nLCAndScsICd4JywgJ2knLCAncicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnMicsICdfJywgJ20nLCAndScsICd4JywgJ3InLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0MnLCAnMicsICdfJywgJ24nLCAnbycsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICcyJywgJ18nLCAnbycsCisgICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICcyJywgJ18nLCAnbycsICdyJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdDJywgJzInLCAnXycsICdwJywgJ3gnLCAnZicsICdlJywgJ3InLCAnXycsICdtJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0MnLCAnMicsICdfJywgJ3QnLCAnZicsICdyJywgJ3AnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnMicsCisgICdfJywgJ3QnLCAnZicsICdyJywgJ3InLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnMicsICdfJywgJ3YnLCAnaScsCisgICd0JywgJ3AnLCAnYScsICdjJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzInLCAnXycsICd2JywgJ20nLCAndScsCisgICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICcyJywgJ18nLCAneCcsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdDJywgJzQnLCAnXycsICdhJywgJ24nLCAnZCcsICdfJywgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsCisgICc0JywgJ18nLCAnYScsICduJywgJ2QnLCAnXycsICdhJywgJ24nLCAnZCcsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsCisgICc0JywgJ18nLCAnYScsICduJywgJ2QnLCAnXycsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzQnLCAnXycsCisgICdhJywgJ24nLCAnZCcsICdfJywgJ28nLCAncicsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICc0JywgJ18nLCAnYycsCisgICdtJywgJ3AnLCAnbCcsICd0JywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzQnLCAnXycsICdjJywgJ20nLCAncCcsCisgICdsJywgJ3QnLCAnZScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICc0JywgJ18nLCAnYycsICdtJywgJ3AnLCAnbCcsCisgICd0JywgJ2UnLCAndScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnNCcsICdfJywgJ2MnLCAnbScsICdwJywgJ2wnLCAndCcsCisgICdlJywgJ3UnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnNCcsICdfJywgJ2MnLCAnbScsICdwJywgJ24nLCAnZScsCisgICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICc0JywgJ18nLCAnYycsICdtJywgJ3AnLCAnbicsICdlJywgJ3EnLCAnaScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnNCcsICdfJywgJ2YnLCAnYScsICdzJywgJ3QnLCAnYycsICdvJywgJ3InLCAnbicsCisgICdlJywgJ3InLCAnOScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnNCcsICdfJywgJ2YnLCAnYScsICdzJywgJ3QnLCAnYycsCisgICdvJywgJ3InLCAnbicsICdlJywgJ3InLCAnOScsICdfJywgJ24nLCAnbycsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsCisgICc0JywgJ18nLCAnbicsICdiJywgJ2knLCAndCcsICdzJywgJ2MnLCAnbCcsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsCisgICc0JywgJ18nLCAnbicsICdiJywgJ2knLCAndCcsICdzJywgJ2MnLCAnbCcsICdyJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdDJywgJzQnLCAnXycsICduJywgJ2InLCAnaScsICd0JywgJ3MnLCAncycsICdlJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdDJywgJzQnLCAnXycsICdvJywgJ3InLCAnXycsICdhJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnNCcsCisgICdfJywgJ28nLCAncicsICdfJywgJ2EnLCAnbicsICdkJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzQnLCAnXycsCisgICdvJywgJ3InLCAnXycsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzQnLCAnXycsICdvJywgJ3InLCAnXycsCisgICdvJywgJ3InLCAnbicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ2MnLCAnbycsICduJywgJ3YnLCAnXycsCisgICdkJywgJzInLCAnZCcsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnYycsICdvJywgJ24nLCAndicsCisgICdfJywgJ2QnLCAnMicsICdzJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdjJywgJ28nLCAnbicsCisgICd2JywgJ18nLCAnZCcsICdmJywgJzInLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ2MnLCAnbycsCisgICduJywgJ3YnLCAnXycsICdkJywgJ2YnLCAnMicsICdkJywgJ18nLCAnYycsICdoJywgJ28nLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0YnLCAnMicsICdfJywgJ2MnLCAnbycsICduJywgJ3YnLCAnXycsICdkJywgJ2YnLCAnMicsICdzJywgJ2YnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdjJywgJ28nLCAnbicsICd2JywgJ18nLCAnZCcsICdmJywgJzInLCAndScsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnYycsICdvJywgJ24nLCAndicsICdfJywgJ2QnLCAnZicsCisgICcyJywgJ3UnLCAnZCcsICdfJywgJ2MnLCAnaCcsICdvJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsCisgICdjJywgJ28nLCAnbicsICd2JywgJ18nLCAnZCcsICdmJywgJzInLCAndScsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsCisgICcyJywgJ18nLCAnYycsICdvJywgJ24nLCAndicsICdfJywgJ2QnLCAnZicsICcyJywgJ3UnLCAndycsICdfJywgJ2MnLCAnaCcsCisgICdvJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdjJywgJ28nLCAnbicsICd2JywgJ18nLCAnZCcsCisgICdmJywgJzInLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ2MnLCAnbycsICduJywgJ3YnLCAnXycsCisgICdkJywgJ2YnLCAnMicsICd3JywgJ18nLCAnYycsICdoJywgJ28nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsCisgICdfJywgJ2MnLCAnbycsICduJywgJ3YnLCAnXycsICdzJywgJ2YnLCAnMicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsCisgICcyJywgJ18nLCAnYycsICdvJywgJ24nLCAndicsICdfJywgJ3MnLCAnZicsICcyJywgJ2QnLCAnXycsICdjJywgJ2gnLCAnbycsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnYycsICdvJywgJ24nLCAndicsICdfJywgJ3MnLCAnZicsCisgICcyJywgJ2QnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ2MnLCAnbycsICduJywgJ3YnLCAnXycsCisgICdzJywgJ2YnLCAnMicsICd1JywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdjJywgJ28nLCAnbicsCisgICd2JywgJ18nLCAncycsICdmJywgJzInLCAndScsICdkJywgJ18nLCAnYycsICdoJywgJ28nLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0YnLCAnMicsICdfJywgJ2MnLCAnbycsICduJywgJ3YnLCAnXycsICdzJywgJ2YnLCAnMicsICd1JywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdjJywgJ28nLCAnbicsICd2JywgJ18nLCAncycsICdmJywgJzInLCAndScsCisgICd3JywgJ18nLCAnYycsICdoJywgJ28nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ2MnLCAnbycsCisgICduJywgJ3YnLCAnXycsICdzJywgJ2YnLCAnMicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnYycsCisgICdvJywgJ24nLCAndicsICdfJywgJ3MnLCAnZicsICcyJywgJ3cnLCAnXycsICdjJywgJ2gnLCAnbycsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnYycsICdvJywgJ24nLCAndicsICdfJywgJ3UnLCAnZCcsICcyJywgJ2QnLCAnZicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ2MnLCAnbycsICduJywgJ3YnLCAnXycsICd1JywgJ2QnLCAnMicsCisgICdzJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdjJywgJ28nLCAnbicsICd2JywgJ18nLCAndScsCisgICd3JywgJzInLCAnZCcsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnYycsICdvJywgJ24nLCAndicsCisgICdfJywgJ3UnLCAndycsICcyJywgJ3MnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ2MnLCAnbycsCisgICduJywgJ3YnLCAnXycsICd3JywgJzInLCAnZCcsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnYycsCisgICdvJywgJ24nLCAndicsICdfJywgJ3cnLCAnMicsICdzJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsCisgICdkJywgJ2YnLCAnYycsICdsJywgJ2EnLCAncycsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnZCcsCisgICdmJywgJ2MnLCAnbScsICdwJywgJ2UnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ2QnLCAnZicsCisgICdjJywgJ20nLCAncCcsICdnJywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdkJywgJ2YnLCAnYycsCisgICdtJywgJ3AnLCAnZycsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnZCcsICdmJywgJ2MnLCAnbScsCisgICdwJywgJ3UnLCAnbycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ2QnLCAnZicsICdpJywgJ20nLCAnbScsCisgICdfJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdkJywgJ2YnLCAnaScsICdtJywgJ20nLCAnXycsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAncycsICdmJywgJ2EnLCAnZCcsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAncycsICdmJywgJ2MnLCAnbCcsICdhJywgJ3MnLCAncycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ0YnLCAnMicsICdfJywgJ3MnLCAnZicsICdjJywgJ20nLCAncCcsICdlJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdGJywgJzInLCAnXycsICdzJywgJ2YnLCAnYycsICdtJywgJ3AnLCAnZycsICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsCisgICcyJywgJ18nLCAncycsICdmJywgJ2MnLCAnbScsICdwJywgJ2cnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsCisgICdfJywgJ3MnLCAnZicsICdjJywgJ20nLCAncCcsICd1JywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsCisgICdzJywgJ2YnLCAnZicsICdpJywgJ3gnLCAndScsICdwJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsCisgICdzJywgJ2YnLCAnZicsICdpJywgJ3gnLCAndScsICdwJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsCisgICdzJywgJ2YnLCAnZicsICdpJywgJ3gnLCAndScsICdwJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsCisgICdzJywgJ2YnLCAnZicsICdtJywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdzJywgJ2YnLCAnZicsCisgICdtJywgJ2EnLCAnXycsICdsJywgJ2knLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ3MnLCAnZicsCisgICdmJywgJ20nLCAnYScsICdfJywgJ3MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ3MnLCAnZicsCisgICdmJywgJ20nLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ3MnLCAnZicsICdmJywgJ20nLCAncycsCisgICdfJywgJ2wnLCAnaScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAncycsICdmJywgJ2knLCAnbScsCisgICdtJywgJ18nLCAnbicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ3MnLCAnZicsICdpJywgJ20nLCAnbScsCisgICdfJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdzJywgJ2YnLCAnbScsICdhJywgJ3gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdzJywgJ2YnLCAnbScsICdpJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdGJywgJzInLCAnXycsICdzJywgJ2YnLCAnbScsICdwJywgJ3knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsCisgICdzJywgJ2YnLCAncycsICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdMJywgJzInLCAnXycsICdsJywgJ28nLCAnYScsCisgICdkJywgJ3cnLCAnXycsICdsJywgJ28nLCAnYycsICdrJywgJ2UnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0wnLCAnNCcsCisgICdfJywgJ2wnLCAnbycsICdhJywgJ2QnLCAnZCcsICdfJywgJ2wnLCAnbycsICdjJywgJ2snLCAnZScsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnYScsICdjJywgJ2MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ2EnLCAnYycsICdjJywgJ2knLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ2MnLCAnbScsCisgICdhJywgJ2MnLCAnaScsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ2MnLCAnbScsCisgICdhJywgJ2MnLCAncicsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ2MnLCAnbScsCisgICdhJywgJ2MnLCAncycsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ2MnLCAnbScsCisgICdhJywgJ2MnLCAncycsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ2MnLCAnbScsCisgICdhJywgJ2MnLCAncycsICdjJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnYycsCisgICdtJywgJ2EnLCAnYycsICdzJywgJ2MnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdjJywgJ20nLCAncCcsICd5JywgJ2knLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdjJywgJ20nLCAncCcsICd5JywgJ3InLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdjJywgJ20nLCAncCcsICd5JywgJ3InLCAncycsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ2MnLCAnbScsICdwJywgJ3knLCAncicsICdzJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnYycsICdtJywgJ3AnLCAneScsICdyJywgJ3MnLCAnYycsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnMicsICdfJywgJ2MnLCAnbScsICdwJywgJ3knLCAncicsICdzJywgJ2MnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdjJywgJ20nLCAncCcsICd5JywgJ3MnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdjJywgJ20nLCAncCcsICd5JywgJ3MnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdjJywgJ20nLCAncCcsICd5JywgJ3MnLCAnYycsICdfJywgJ3MnLCAnMCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ2MnLCAnbScsICdwJywgJ3knLCAncycsICdjJywgJ18nLCAncycsCisgICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnYycsICduJywgJ2EnLCAnYycsICdzJywgJ18nLCAncycsCisgICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnYycsICduJywgJ2EnLCAnYycsICdzJywgJ18nLCAncycsCisgICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnYycsICduJywgJ2EnLCAnYycsICdzJywgJ2MnLCAnXycsCisgICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdjJywgJ24nLCAnYScsICdjJywgJ3MnLCAnYycsCisgICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ2QnLCAncCcsICdtJywgJ3AnLCAneScsCisgICdzJywgJ3MnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ2QnLCAncCcsICdtJywgJ3AnLCAneScsICdzJywgJ3MnLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ3MnLCAnMCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ2QnLCAncCcsICdtJywgJ3AnLCAneScsICdzJywgJ3MnLCAnXycsCisgICdyJywgJ24nLCAnZCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ2QnLCAncCcsCisgICdtJywgJ3AnLCAneScsICdzJywgJ3MnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdkJywgJ3AnLCAnbScsICdwJywgJ3knLCAndScsICd1JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdkJywgJ3AnLCAnbScsICdwJywgJ3knLCAndScsICd1JywgJ18nLCAnbicsCisgICdhJywgJ2MnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdkJywgJ3AnLCAnbScsCisgICdwJywgJ3knLCAndScsICd1JywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnaCcsCisgICdtJywgJ20nLCAncCcsICd5JywgJ2gnLCAnXycsICdyJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ2gnLCAnbScsICdtJywgJ3AnLCAneScsICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnaCcsICdtJywgJ20nLCAncCcsICd5JywgJ2wnLCAnXycsICdyJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnMicsICdfJywgJ2gnLCAnbScsICdtJywgJ3AnLCAneScsICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdhJywgJ2MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ20nLCAnYScsICdjJywgJ3MnLCAnaScsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsCisgICdhJywgJ2MnLCAncycsICdpJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ20nLCAnYScsCisgICdjJywgJ2gnLCAncycsICdfJywgJ3InLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsCisgICdtJywgJ2EnLCAnYycsICdoJywgJ3MnLCAnXycsICdyJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ20nLCAnbScsICdhJywgJ2MnLCAnaCcsICdzJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnbScsICdtJywgJ2EnLCAnYycsICdoJywgJ3MnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdNJywgJzInLCAnXycsICdtJywgJ20nLCAnYScsICdjJywgJ2wnLCAncycsICdfJywgJ3InLCAncycsICcwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdtJywgJ2EnLCAnYycsICdsJywgJ3MnLCAnXycsICdyJywgJ3MnLCAnMScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAnbScsICdhJywgJ2MnLCAnbCcsICdzJywgJ18nLCAncycsCisgICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdtJywgJ2EnLCAnYycsICdsJywgJ3MnLCAnXycsCisgICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ20nLCAnYScsICdjJywgJ3UnLCAnaCcsCisgICdzJywgJ18nLCAncicsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ20nLCAnYScsCisgICdjJywgJ3UnLCAnaCcsICdzJywgJ18nLCAncicsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdtJywgJ20nLCAnYScsICdjJywgJ3UnLCAnaCcsICdzJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnbScsICdtJywgJ2EnLCAnYycsICd1JywgJ2gnLCAncycsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAnbScsICdhJywgJ2MnLCAndScsICdsJywgJ3MnLCAnXycsICdyJywgJ3MnLCAnMCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAnbScsICdhJywgJ2MnLCAndScsICdsJywgJ3MnLCAnXycsCisgICdyJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAnbScsICdhJywgJ2MnLCAndScsCisgICdsJywgJ3MnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ20nLCAnYScsCisgICdjJywgJ3UnLCAnbCcsICdzJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsCisgICdtJywgJ3AnLCAneScsICdoJywgJ18nLCAncicsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdtJywgJ20nLCAncCcsICd5JywgJ2gnLCAnXycsICdyJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ20nLCAnbScsICdwJywgJ3knLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ20nLCAnbScsICdwJywgJ3knLCAnaCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ20nLCAnbScsICdwJywgJ3knLCAnbCcsICdfJywgJ3InLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnbScsICdtJywgJ3AnLCAneScsICdsJywgJ18nLCAncicsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdNJywgJzInLCAnXycsICdtJywgJ20nLCAncCcsICd5JywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdNJywgJzInLCAnXycsICdtJywgJ20nLCAncCcsICd5JywgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdNJywgJzInLCAnXycsICdtJywgJ20nLCAncCcsICd5JywgJ3UnLCAnaCcsICdfJywgJ3InLCAncycsICcwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdtJywgJ3AnLCAneScsICd1JywgJ2gnLCAnXycsICdyJywgJ3MnLCAnMScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAnbScsICdwJywgJ3knLCAndScsICdoJywgJ18nLCAncycsCisgICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdtJywgJ3AnLCAneScsICd1JywgJ2gnLCAnXycsCisgICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ20nLCAncCcsICd5JywgJ3UnLCAnbCcsCisgICdfJywgJ3InLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdtJywgJ3AnLCAneScsCisgICd1JywgJ2wnLCAnXycsICdyJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAnbScsCisgICdwJywgJ3knLCAndScsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsCisgICdtJywgJ3AnLCAneScsICd1JywgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdtJywgJ3AnLCAneScsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ2gnLCAnaCcsCisgICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnYScsCisgICdjJywgJ2MnLCAnXycsICdoJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdtJywgJ3AnLCAneScsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ2wnLCAnaCcsCisgICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnYScsCisgICdjJywgJ2MnLCAnXycsICdsJywgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdtJywgJ3AnLCAneScsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ2wnLCAnbCcsCisgICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnYScsCisgICdjJywgJ2MnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdzJywgJ2EnLCAndCcsCisgICdfJywgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsCisgICd5JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsCisgICdzJywgJ2EnLCAndCcsICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2wnLCAnaCcsCisgICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnYScsCisgICdjJywgJ2MnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdzJywgJ2EnLCAndCcsCisgICdfJywgJ2wnLCAnbCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsCisgICd5JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2wnLCAnbCcsICdfJywgJ3MnLCAnMScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsCisgICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdoJywgJ2gnLCAnXycsCisgICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ2gnLCAnbCcsCisgICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnaCcsCisgICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsCisgICdsJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsCisgICdfJywgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsCisgICd5JywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsCisgICdwJywgJ3knLCAnXycsICdsJywgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdtJywgJ3AnLCAneScsICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ2gnLCAnaCcsCisgICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnbicsCisgICdhJywgJ2MnLCAnXycsICdoJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdtJywgJ3AnLCAneScsICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ2wnLCAnaCcsCisgICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnbicsCisgICdhJywgJ2MnLCAnXycsICdsJywgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdtJywgJ3AnLCAneScsICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ2wnLCAnbCcsCisgICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnbicsCisgICdhJywgJ2MnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdzJywgJ2EnLCAndCcsCisgICdfJywgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsCisgICd5JywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsCisgICdzJywgJ2EnLCAndCcsICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2wnLCAnaCcsCisgICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnbicsCisgICdhJywgJ2MnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdzJywgJ2EnLCAndCcsCisgICdfJywgJ2wnLCAnbCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsCisgICd5JywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2wnLCAnbCcsICdfJywgJ3MnLCAnMScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAncicsICduJywgJ2QnLCAnXycsCisgICdoJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsCisgICdfJywgJ3InLCAnbicsICdkJywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdyJywgJ24nLCAnZCcsICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAncicsICduJywgJ2QnLCAnXycsCisgICdoJywgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsCisgICdfJywgJ3InLCAnbicsICdkJywgJ18nLCAnbCcsICdoJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdyJywgJ24nLCAnZCcsICdfJywgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAncicsICduJywgJ2QnLCAnXycsCisgICdsJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsCisgICdfJywgJ3InLCAnbicsICdkJywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsCisgICdoJywgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsCisgICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsCisgICdsJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsCisgICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnbCcsICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2wnLCAnbCcsICdfJywgJ3MnLCAnMCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsCisgICdsJywgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsCisgICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdoJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAncicsCisgICduJywgJ2QnLCAnXycsICdoJywgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdtJywgJ3AnLCAneScsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdoJywgJ2wnLCAnXycsCisgICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ3MnLCAnYScsCisgICd0JywgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdoJywgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAncicsICduJywgJ2QnLCAnXycsCisgICdsJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsCisgICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdsJywgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAncicsCisgICduJywgJ2QnLCAnXycsICdsJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdtJywgJ3AnLCAneScsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdsJywgJ2wnLCAnXycsCisgICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ3UnLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAndScsICdwJywgJ18nLCAncycsCisgICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICd1JywgJ3AnLCAnXycsCisgICdzJywgJzEnLCAnXycsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsCisgICd5JywgJ2QnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ2QnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ2gnLCAnaCcsCisgICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ2QnLCAnXycsCisgICdhJywgJ2MnLCAnYycsICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ20nLCAncCcsICd5JywgJ2QnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ2QnLCAnXycsICdhJywgJ2MnLCAnYycsCisgICdfJywgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsCisgICd5JywgJ2QnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ2QnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ2wnLCAnbCcsCisgICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ2QnLCAnXycsCisgICdhJywgJ2MnLCAnYycsICdfJywgJ2wnLCAnbCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ20nLCAncCcsICd5JywgJ2QnLCAnXycsICdoJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdkJywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ2QnLCAnXycsICdoJywgJ2wnLCAnXycsCisgICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdkJywgJ18nLCAnbCcsCisgICdoJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsCisgICdfJywgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsCisgICd5JywgJ2QnLCAnXycsICdsJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdtJywgJ3AnLCAneScsICdkJywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsCisgICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywgJ24nLCAnYScsCisgICdjJywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsCisgICdwJywgJ3knLCAnZCcsICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAnaCcsCisgICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsCisgICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAnbCcsICdoJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAnbCcsICdoJywgJ18nLCAncycsCisgICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywgJ24nLCAnYScsCisgICdjJywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsCisgICdwJywgJ3knLCAnZCcsICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywgJ3InLCAnbicsICdkJywgJ18nLCAnaCcsCisgICdoJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsCisgICdfJywgJ3InLCAnbicsICdkJywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywgJ3InLCAnbicsICdkJywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsCisgICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywgJ3InLCAnbicsCisgICdkJywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsCisgICdwJywgJ3knLCAnZCcsICdfJywgJ3InLCAnbicsICdkJywgJ18nLCAnbCcsICdoJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywgJ3InLCAnbicsICdkJywgJ18nLCAnbCcsCisgICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsCisgICdfJywgJ3InLCAnbicsICdkJywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywgJ3InLCAnbicsICdkJywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsCisgICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3MnLCAnbScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAncycsICd1JywgJ18nLCAndScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsCisgICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdfJywgJ2EnLCAnYycsCisgICdjJywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsCisgICdwJywgJ3knLCAndScsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnaCcsCisgICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsCisgICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnbCcsICdoJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnbCcsICdoJywgJ18nLCAncycsCisgICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdfJywgJ2EnLCAnYycsCisgICdjJywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsCisgICdwJywgJ3knLCAndScsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdfJywgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnXycsICdoJywgJ2gnLCAnXycsCisgICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ18nLCAnaCcsCisgICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsCisgICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsCisgICd5JywgJ3UnLCAnXycsICdsJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdtJywgJ3AnLCAneScsICd1JywgJ18nLCAnbCcsICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdfJywgJ2wnLCAnbCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnXycsICdsJywgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsCisgICdoJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsCisgICd1JywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdoJywgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdoJywgJ2wnLCAnXycsCisgICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ18nLCAnbicsCisgICdhJywgJ2MnLCAnXycsICdoJywgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdtJywgJ3AnLCAneScsICd1JywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdsJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsCisgICdsJywgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsCisgICd1JywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdsJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdsJywgJ2wnLCAnXycsCisgICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ18nLCAndScsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdkJywgJ18nLCAnYScsCisgICdjJywgJ2MnLCAnXycsICdoJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICdtJywgJ3AnLCAneScsICd1JywgJ2QnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnZCcsICdfJywgJ2EnLCAnYycsCisgICdjJywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsCisgICdwJywgJ3knLCAndScsICdkJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdoJywgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ2QnLCAnXycsICdhJywgJ2MnLCAnYycsCisgICdfJywgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsCisgICd5JywgJ3UnLCAnZCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnbCcsICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdkJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsCisgICdsJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsCisgICd1JywgJ2QnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ2wnLCAnbCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnZCcsICdfJywgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnZCcsICdfJywgJ2gnLCAnaCcsCisgICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnZCcsCisgICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsCisgICd5JywgJ3UnLCAnZCcsICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnZCcsICdfJywgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnZCcsICdfJywgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnZCcsICdfJywgJ2wnLCAnbCcsCisgICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnZCcsCisgICdfJywgJ2wnLCAnbCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsCisgICd5JywgJ3UnLCAnZCcsICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdkJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsCisgICdoJywgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsCisgICd1JywgJ2QnLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnZCcsICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAnaCcsCisgICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsCisgICdkJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdsJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ2QnLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ2wnLCAnaCcsCisgICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnZCcsCisgICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdkJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdsJywgJ2wnLCAnXycsCisgICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ2knLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICduJywgJ2EnLCAnYycsICdjJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdNJywgJzInLCAnXycsICduJywgJ2EnLCAnYycsICdjJywgJ2knLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ3MnLCAndScsICdiJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsCisgICdhJywgJ2InLCAncycsICdkJywgJ2knLCAnZicsICdmJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICd2JywgJ2EnLCAnYicsICdzJywgJ2QnLCAnaScsICdmJywgJ2YnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ3YnLCAnYycsICdtJywgJ2EnLCAnYycsICdfJywgJ3MnLCAnMCcsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnaScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAnYycsICdtJywgJ2EnLCAnYycsICdfJywgJ3MnLCAnMCcsCisgICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAnYycsCisgICdtJywgJ3AnLCAneScsICdfJywgJ3MnLCAnMCcsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAneScsICdfJywgJ3MnLCAnMCcsICdfJywgJ3MnLCAnYScsCisgICd0JywgJ18nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAneScsCisgICdfJywgJ3MnLCAnMScsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAneScsICdfJywgJ3MnLCAnMScsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAncicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAnZCcsICdtJywgJ2EnLCAnYycsICdzJywgJ18nLCAncycsCisgICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdkJywgJ20nLCAnYScsICdjJywgJ3MnLCAnXycsCisgICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAncicsCisgICdzJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdkJywgJ20nLCAncCcsCisgICd5JywgJ3InLCAncycsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAnZCcsCisgICdtJywgJ3AnLCAneScsICdzJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsCisgICdkJywgJ20nLCAncCcsICd5JywgJ3MnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICd2JywgJ20nLCAnYScsICdjJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICd2JywgJ20nLCAnYScsCisgICdjJywgJzInLCAnZScsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdtJywgJ2EnLCAnYycsCisgICcyJywgJ2UnLCAncycsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAnbScsCisgICdhJywgJ2MnLCAnMicsICdlJywgJ3MnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICd2JywgJ20nLCAnYScsICdjJywgJzInLCAncycsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ3YnLCAnbScsICdhJywgJ2MnLCAnMicsICdzJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAndicsICdtJywgJ2EnLCAnYycsICcyJywgJ3MnLCAndScsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAnbScsICdhJywgJ2MnLCAnMicsICdzJywgJ3UnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJzInLCAnZScsICdzJywgJ18nLCAncycsCisgICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICcyJywgJ2UnLCAncycsCisgICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnMicsCisgICdzJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdtJywgJ3AnLCAneScsCisgICcyJywgJ3MnLCAnXycsICdzJywgJzAnLCAncCcsICdhJywgJ2MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsCisgICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnMicsICdzJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICcyJywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICcyJywgJ3MnLCAnXycsICdzJywgJzEnLCAncCcsICdhJywgJ2MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnMicsICdzJywgJ3UnLCAnXycsCisgICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJzInLCAncycsCisgICd1JywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdyJywgJ2EnLCAnZCcsCisgICdkJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICd2JywgJ3InLCAnYScsICdkJywgJ2QnLCAndScsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdyJywgJ2MnLCAnbScsICdhJywgJ2MnLCAnaScsCisgICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAncicsICdjJywgJ20nLCAnYScsCisgICdjJywgJ2knLCAnXycsICdzJywgJzAnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAncicsCisgICdjJywgJ20nLCAnYScsICdjJywgJ3InLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsCisgICd2JywgJ3InLCAnYycsICdtJywgJ2EnLCAnYycsICdyJywgJ18nLCAncycsICcwJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdNJywgJzInLCAnXycsICd2JywgJ3InLCAnYycsICdtJywgJ3AnLCAneScsICdpJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdyJywgJ2MnLCAnbScsICdwJywgJ3knLCAnaScsICdfJywgJ3MnLCAnMCcsCisgICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdyJywgJ2MnLCAnbScsICdwJywgJ3knLCAncicsCisgICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAncicsICdjJywgJ20nLCAncCcsCisgICd5JywgJ3InLCAnXycsICdzJywgJzAnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAncicsCisgICdjJywgJ20nLCAncCcsICd5JywgJ3MnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAncicsICdjJywgJ20nLCAncCcsICd5JywgJ3MnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICd2JywgJ3InLCAnYycsICdtJywgJ3AnLCAneScsICdzJywgJ18nLCAncycsCisgICcxJywgJ3InLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAncicsICdtJywgJ2EnLCAnYycsCisgICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsCisgICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3gnLCAnbycsICdyJywgJ18nLCAneCcsCisgICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ2EnLCAnbicsICdkJywgJ18nLCAnYScsCisgICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzQnLCAnXycsICdhJywgJ24nLCAnZCcsICdfJywgJ2EnLCAnbicsCisgICdkJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzQnLCAnXycsICdhJywgJ24nLCAnZCcsICdfJywgJ28nLCAncicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ2EnLCAnbicsICdkJywgJ18nLCAneCcsICdvJywgJ3InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdNJywgJzQnLCAnXycsICdjJywgJ20nLCAncCcsICd5JywgJ2knLCAnXycsICd3JywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdNJywgJzQnLCAnXycsICdjJywgJ20nLCAncCcsICd5JywgJ2knLCAnXycsICd3JywgJ2gnLCAnYycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ2MnLCAnbScsICdwJywgJ3knLCAncicsICdfJywgJ3cnLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ2MnLCAnbScsICdwJywgJ3knLCAncicsICdfJywgJ3cnLCAnaCcsCisgICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAnbScsICdhJywgJ2MnLCAnXycsICd1JywgJ3AnLCAnXycsCisgICdzJywgJzEnLCAnXycsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ20nLCAncCcsCisgICd5JywgJ3InLCAnaScsICdfJywgJ2EnLCAnZCcsICdkJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzQnLCAnXycsCisgICdtJywgJ3AnLCAneScsICdyJywgJ2knLCAnXycsICdhJywgJ2QnLCAnZCcsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICc0JywgJ18nLCAnbScsICdwJywgJ3knLCAncicsICdpJywgJ18nLCAnYScsICdkJywgJ2QnLCAncicsICdfJywgJ3UnLCAnMicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ20nLCAncCcsICd5JywgJ3InLCAncicsICdfJywgJ2EnLCAnZCcsCisgICdkJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzQnLCAnXycsICdtJywgJ3AnLCAneScsICdyJywgJ3InLCAnXycsCisgICdhJywgJ2QnLCAnZCcsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsCisgICd1JywgJ3AnLCAnXycsICdzJywgJzEnLCAnXycsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsCisgICdfJywgJ28nLCAncicsICdfJywgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAnbycsCisgICdyJywgJ18nLCAnYScsICduJywgJ2QnLCAnbicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ28nLCAncicsCisgICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ28nLCAncicsICdfJywgJ3gnLCAnbycsCisgICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAncCcsICdtJywgJ3AnLCAneScsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAncCcsICdtJywgJ3AnLCAneScsICd3JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdNJywgJzQnLCAnXycsICd2JywgJ3AnLCAnbScsICdwJywgJ3knLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnNCcsICdfJywgJ3YnLCAncCcsICdtJywgJ3AnLCAneScsICdoJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdNJywgJzQnLCAnXycsICd2JywgJ3InLCAnbScsICdwJywgJ3knLCAnZScsICdoJywgJ18nLCAnYScsCisgICdjJywgJ2MnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzQnLCAnXycsICd2JywgJ3InLCAnbScsCisgICdwJywgJ3knLCAnZScsICdoJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdNJywgJzQnLCAnXycsICd2JywgJ3InLCAnbScsICdwJywgJ3knLCAnZScsICdoJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ2UnLCAnaCcsICdfJywgJ3MnLCAnMScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdvJywgJ2gnLCAnXycsCisgICdhJywgJ2MnLCAnYycsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ3YnLCAncicsCisgICdtJywgJ3AnLCAneScsICdvJywgJ2gnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnNCcsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdvJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdNJywgJzQnLCAnXycsICd2JywgJ3InLCAnbScsICdwJywgJ3knLCAnbycsICdoJywgJ18nLCAncycsCisgICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAneCcsICdvJywgJ3InLCAnXycsICdhJywgJ24nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ3gnLCAnbycsICdyJywgJ18nLCAnYScsICduJywgJ2QnLCAnbicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ3gnLCAnbycsICdyJywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAneCcsICdvJywgJ3InLCAnXycsICd4JywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICc1JywgJ18nLCAndicsICdkJywgJ20nLCAnYScsICdjJywgJ2InLCAncycsICd1JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICc1JywgJ18nLCAndicsICdkJywgJ20nLCAncCcsICd5JywgJ2InLCAncycsICd1JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnTScsICc1JywgJ18nLCAndicsICdtJywgJ2EnLCAnYycsICdiJywgJ3MnLCAndScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ00nLCAnNScsICdfJywgJ3YnLCAnbScsICdhJywgJ2MnLCAnYicsICd1JywgJ3UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdNJywgJzUnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2InLCAncycsICd1JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICc1JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAndScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNScsCisgICdfJywgJ3YnLCAncicsICdtJywgJ2EnLCAnYycsICdiJywgJ3MnLCAndScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNScsCisgICdfJywgJ3YnLCAncicsICdtJywgJ2EnLCAnYycsICdiJywgJ3UnLCAndScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNScsCisgICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdiJywgJ3MnLCAndScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNScsCisgICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAndScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNicsCisgICdfJywgJ3YnLCAnYScsICdiJywgJ3MnLCAnZCcsICdpJywgJ2YnLCAnZicsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsCisgICc2JywgJ18nLCAndicsICdhJywgJ2InLCAncycsICdkJywgJ2knLCAnZicsICdmJywgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAnZCcsICdkJywgJ2EnLCAncycsICdsJywgJ18nLCAncicsICdyJywgJ3InLCAnaScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdsJywgJ18nLCAnaScsICdfJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAnbCcsICdfJywgJ2knLCAnXycsICdwJywgJ18nLCAnYScsCisgICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAnbCcsICdfJywgJ2knLCAnXycsCisgICdwJywgJ18nLCAnYScsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAnbCcsCisgICdfJywgJ2knLCAnXycsICdwJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsCisgICdhJywgJ3MnLCAnbCcsICdfJywgJ2knLCAnXycsICdwJywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsCisgICcyJywgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdpJywgJ18nLCAncCcsICdfJywgJ3gnLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAnbCcsICdfJywgJ2knLCAnXycsICdyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdpJywgJ18nLCAncicsICdfJywgJ2EnLCAnYycsCisgICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdpJywgJ18nLCAncicsCisgICdfJywgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsCisgICdpJywgJ18nLCAncicsICdfJywgJ24nLCAnYScsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsCisgICdzJywgJ2wnLCAnXycsICdpJywgJ18nLCAncicsICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsCisgICdfJywgJ2EnLCAncycsICdsJywgJ18nLCAnaScsICdfJywgJ3InLCAnXycsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdsJywgJ18nLCAnaScsICdfJywgJ3InLCAnXycsICd4JywgJ2EnLCAnYycsCisgICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdpJywgJ18nLCAndicsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdpJywgJ18nLCAndicsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdyJywgJ18nLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdsJywgJ18nLCAncicsICdfJywgJ3AnLCAnXycsCisgICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdsJywgJ18nLCAncicsCisgICdfJywgJ3AnLCAnXycsICdhJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsCisgICdsJywgJ18nLCAncicsICdfJywgJ3AnLCAnXycsICduJywgJ2EnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsCisgICdfJywgJ2EnLCAncycsICdsJywgJ18nLCAncicsICdfJywgJ3AnLCAnXycsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAnbCcsICdfJywgJ3InLCAnXycsICdwJywgJ18nLCAneCcsICdvJywgJ3InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAnbCcsICdfJywgJ3InLCAnXycsICdyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdyJywgJ18nLCAncicsICdfJywgJ2EnLCAnYycsCisgICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdyJywgJ18nLCAncicsCisgICdfJywgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsCisgICdyJywgJ18nLCAncicsICdfJywgJ24nLCAnYScsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsCisgICdzJywgJ2wnLCAnXycsICdyJywgJ18nLCAncicsICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsCisgICdfJywgJ2EnLCAncycsICdsJywgJ18nLCAncicsICdfJywgJ3InLCAnXycsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdsJywgJ18nLCAncicsICdfJywgJ3YnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdsJywgJ18nLCAncicsICdfJywgJ3YnLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAnaScsICdfJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAncicsICdfJywgJ2knLCAnXycsICdwJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAncicsICdfJywgJ2knLCAnXycsICdwJywgJ18nLCAnYScsCisgICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAncicsICdfJywgJ2knLCAnXycsCisgICdwJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAncicsCisgICdfJywgJ2knLCAnXycsICdwJywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsCisgICdzJywgJ3InLCAnXycsICdpJywgJ18nLCAncCcsICdfJywgJ3InLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsCisgICcyJywgJ18nLCAnYScsICdzJywgJ3InLCAnXycsICdpJywgJ18nLCAncCcsICdfJywgJ3InLCAnbicsICdkJywgJ18nLCAnZycsCisgICdvJywgJ28nLCAnZCcsICdzJywgJ3knLCAnbicsICd0JywgJ2EnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsCisgICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAnaScsICdfJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsCisgICdhJywgJ3MnLCAncicsICdfJywgJ2knLCAnXycsICdyJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAncicsICdfJywgJ2knLCAnXycsICdyJywgJ18nLCAnYScsICduJywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAncicsICdfJywgJ2knLCAnXycsICdyJywgJ18nLCAnbicsCisgICdhJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAncicsICdfJywgJ2knLCAnXycsCisgICdyJywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ3InLCAnXycsCisgICdpJywgJ18nLCAncicsICdfJywgJ3InLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsCisgICdzJywgJ3InLCAnXycsICdpJywgJ18nLCAncicsICdfJywgJ3InLCAnbicsICdkJywgJ18nLCAnZycsICdvJywgJ28nLCAnZCcsCisgICdzJywgJ3knLCAnbicsICd0JywgJ2EnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsCisgICdyJywgJ18nLCAnaScsICdfJywgJ3MnLCAndicsICd3JywgJ18nLCAndCcsICdyJywgJ3UnLCAnbicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAnaScsICdfJywgJ3YnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAnaScsICdfJywgJ3YnLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAncicsICdfJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAncicsICdfJywgJ3InLCAnXycsICdwJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAncicsICdfJywgJ3InLCAnXycsICdwJywgJ18nLCAnYScsCisgICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAncicsICdfJywgJ3InLCAnXycsCisgICdwJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAncicsCisgICdfJywgJ3InLCAnXycsICdwJywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsCisgICdzJywgJ3InLCAnXycsICdyJywgJ18nLCAncCcsICdfJywgJ3gnLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsCisgICcyJywgJ18nLCAnYScsICdzJywgJ3InLCAnXycsICdyJywgJ18nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsCisgICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAncicsICdfJywgJ3InLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAncicsICdfJywgJ3InLCAnXycsICdhJywgJ24nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAncicsICdfJywgJ3InLCAnXycsCisgICduJywgJ2EnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAncicsCisgICdfJywgJ3InLCAnXycsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAncicsCisgICdfJywgJ3InLCAnXycsICdyJywgJ18nLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsCisgICdhJywgJ3MnLCAncicsICdfJywgJ3InLCAnXycsICdzJywgJ3YnLCAndycsICdfJywgJ3QnLCAncicsICd1JywgJ24nLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAncicsICdfJywgJ3InLCAnXycsICd2JywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAncicsICdfJywgJ3InLCAnXycsICd2JywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdiJywgJ3InLCAnZScsICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsCisgICcyJywgJ18nLCAnYicsICdyJywgJ2UnLCAndicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYycsCisgICdhJywgJ2InLCAnYScsICdjJywgJ2UnLCAnbicsICdjJywgJ2InLCAnaScsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsCisgICcyJywgJ18nLCAnYycsICdsJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdjJywgJ2wnLCAnMCcsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYycsICdsJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdTJywgJzInLCAnXycsICdjJywgJ2wnLCAnMScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYycsCisgICdsJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdjJywgJ2wnLCAnYicsICduJywgJ28nLCAncicsCisgICdtJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYycsICdsJywgJ2InLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ2MnLCAnbCcsICdyJywgJ2InLCAnaScsICd0JywgJ18nLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ2MnLCAnbCcsICdyJywgJ2InLCAnaScsICd0JywgJ18nLCAncicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ2MnLCAndCcsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYycsCisgICd0JywgJzAnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2MnLCAndCcsICcxJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYycsICd0JywgJzEnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsCisgICdfJywgJ2QnLCAnZScsICdpJywgJ24nLCAndCcsICdlJywgJ3InLCAnbCcsICdlJywgJ2EnLCAndicsICdlJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnZScsICd4JywgJ3QnLCAncicsICdhJywgJ2MnLCAndCcsICd1JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnZScsICd4JywgJ3QnLCAncicsICdhJywgJ2MnLCAndCcsICd1JywgJ18nLCAncicsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnZScsICd4JywgJ3QnLCAncicsICdhJywgJ2MnLCAndCcsCisgICd1JywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdlJywgJ3gnLCAndCcsICdyJywgJ2EnLCAnYycsCisgICd0JywgJ3UnLCAncCcsICdfJywgJ3InLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2knLCAnbicsCisgICdzJywgJ2UnLCAncicsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnaScsICduJywgJ3MnLCAnZScsCisgICdyJywgJ3QnLCAnXycsICdyJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdpJywgJ24nLCAncycsCisgICdlJywgJ3InLCAndCcsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnaScsICduJywgJ3MnLCAnZScsCisgICdyJywgJ3QnLCAncCcsICdfJywgJ3InLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2knLCAnbicsCisgICd0JywgJ2UnLCAncicsICdsJywgJ2UnLCAnYScsICd2JywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsCisgICdsJywgJ2YnLCAncycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ2wnLCAnXycsCisgICdyJywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdsJywgJ18nLCAncicsCisgICdfJywgJ3AnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsCisgICdsJywgJ18nLCAncicsICdfJywgJ3AnLCAnXycsICdhJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsCisgICdfJywgJ2wnLCAncycsICdsJywgJ18nLCAncicsICdfJywgJ3AnLCAnXycsICduJywgJ2EnLCAnYycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdsJywgJ18nLCAncicsICdfJywgJ3AnLCAnXycsICdvJywgJ3InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdsJywgJ3MnLCAnbCcsICdfJywgJ3InLCAnXycsICdwJywgJ18nLCAneCcsCisgICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdsJywgJ3MnLCAnbCcsICdfJywgJ3InLCAnXycsCisgICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ2wnLCAnXycsICdyJywgJ18nLCAncicsCisgICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ2wnLCAnXycsCisgICdyJywgJ18nLCAncicsICdfJywgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsCisgICdzJywgJ2wnLCAnXycsICdyJywgJ18nLCAncicsICdfJywgJ24nLCAnYScsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsCisgICcyJywgJ18nLCAnbCcsICdzJywgJ2wnLCAnXycsICdyJywgJ18nLCAncicsICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdsJywgJ18nLCAncicsICdfJywgJ3YnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdsJywgJ18nLCAncicsICdfJywgJ3YnLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdyJywgJ18nLCAnaScsICdfJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdTJywgJzInLCAnXycsICdsJywgJ3MnLCAncicsICdfJywgJ2knLCAnXycsICdwJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdsJywgJ3MnLCAncicsICdfJywgJ2knLCAnXycsICdwJywgJ18nLCAnYScsCisgICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdsJywgJ3MnLCAncicsICdfJywgJ2knLCAnXycsCisgICdwJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdsJywgJ3MnLCAncicsCisgICdfJywgJ2knLCAnXycsICdwJywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsCisgICdzJywgJ3InLCAnXycsICdpJywgJ18nLCAncCcsICdfJywgJ3gnLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdTJywgJzInLCAnXycsICdsJywgJ3MnLCAncicsICdfJywgJ2knLCAnXycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsCisgICcyJywgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsICdpJywgJ18nLCAncicsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsICdpJywgJ18nLCAncicsICdfJywgJ2EnLCAnbicsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsICdpJywgJ18nLCAncicsCisgICdfJywgJ24nLCAnYScsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsCisgICdpJywgJ18nLCAncicsICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsCisgICdyJywgJ18nLCAnaScsICdfJywgJ3InLCAnXycsICd4JywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsCisgICcyJywgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsICdpJywgJ18nLCAndicsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsCisgICcyJywgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsICdpJywgJ18nLCAndicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsCisgICcyJywgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsICdyJywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsCisgICdfJywgJ2wnLCAncycsICdyJywgJ18nLCAncicsICdfJywgJ3AnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdyJywgJ18nLCAncicsICdfJywgJ3AnLCAnXycsICdhJywgJ24nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdyJywgJ18nLCAncicsICdfJywgJ3AnLCAnXycsCisgICduJywgJ2EnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdyJywgJ18nLCAncicsCisgICdfJywgJ3AnLCAnXycsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdsJywgJ3MnLCAncicsCisgICdfJywgJ3InLCAnXycsICdwJywgJ18nLCAneCcsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsCisgICdsJywgJ3MnLCAncicsICdfJywgJ3InLCAnXycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsCisgICdzJywgJ3InLCAnXycsICdyJywgJ18nLCAncicsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsCisgICcyJywgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsICdyJywgJ18nLCAncicsICdfJywgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsICdyJywgJ18nLCAncicsICdfJywgJ24nLCAnYScsCisgICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsICdyJywgJ18nLCAncicsCisgICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdyJywgJ18nLCAncicsCisgICdfJywgJ3YnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdyJywgJ18nLCAncicsCisgICdfJywgJ3YnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3AnLCAnYScsICdjJywgJ2snLCAnaCcsCisgICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAncCcsICdhJywgJ3InLCAnaScsICd0JywgJ3knLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3MnLCAnZScsICd0JywgJ2InLCAnaScsICd0JywgJ18nLCAnaScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3MnLCAnZScsICd0JywgJ2InLCAnaScsICd0JywgJ18nLCAncicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnZicsICdlJywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdzJywgJ2gnLCAndScsICdmJywgJ2YnLCAnZScsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAncycsICdoJywgJ3UnLCAnZicsICdmJywgJ28nLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnMicsICdfJywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnZicsICdvJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2InLCAncicsICdlJywgJ3YnLCAnXycsICdzJywgJ3QnLCAnYicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYicsICdyJywgJ2UnLCAndicsCisgICdfJywgJ3MnLCAndCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdiJywgJ3InLCAnZScsICd2JywgJ18nLCAncycsICd0JywgJ2gnLCAnaCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdiJywgJ3InLCAnZScsICd2JywgJ18nLCAncycsICd0JywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2InLCAncicsICdlJywgJ3YnLCAnXycsCisgICdzJywgJ3QnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsCisgICd3JywgJ18nLCAnbCcsICdvJywgJ2MnLCAnaycsICdlJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsCisgICdzJywgJ3YnLCAncycsICdhJywgJ3QnLCAnaCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAncycsCisgICd2JywgJ3MnLCAnYScsICd0JywgJ2gnLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndCcsCisgICdhJywgJ2InLCAnbCcsICdlJywgJ2knLCAnZCcsICd4JywgJ2InLCAnXycsICdnJywgJ28nLCAnbycsICdkJywgJ3MnLCAneScsCisgICduJywgJ3QnLCAnYScsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndCcsICdhJywgJ2InLCAnbCcsCisgICdlJywgJ2knLCAnZCcsICd4JywgJ2QnLCAnXycsICdnJywgJ28nLCAnbycsICdkJywgJ3MnLCAneScsICduJywgJ3QnLCAnYScsCisgICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndCcsICdhJywgJ2InLCAnbCcsICdlJywgJ2knLCAnZCcsCisgICd4JywgJ2gnLCAnXycsICdnJywgJ28nLCAnbycsICdkJywgJ3MnLCAneScsICduJywgJ3QnLCAnYScsICd4JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndCcsICdhJywgJ2InLCAnbCcsICdlJywgJ2knLCAnZCcsICd4JywgJ3cnLCAnXycsCisgICdnJywgJ28nLCAnbycsICdkJywgJ3MnLCAneScsICduJywgJ3QnLCAnYScsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsCisgICcyJywgJ18nLCAndCcsICdvJywgJ2cnLCAnZycsICdsJywgJ2UnLCAnYicsICdpJywgJ3QnLCAnXycsICdpJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndCcsICdvJywgJ2cnLCAnZycsICdsJywgJ2UnLCAnYicsICdpJywgJ3QnLCAnXycsCisgICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndCcsICdzJywgJ3QnLCAnYicsICdpJywgJ3QnLCAnXycsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndCcsICdzJywgJ3QnLCAnYicsICdpJywgJ3QnLCAnXycsCisgICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndicsICdhJywgJ2wnLCAnaScsICdnJywgJ24nLCAnaScsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndicsICdhJywgJ2wnLCAnaScsICdnJywgJ24nLCAncicsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndicsICdjJywgJ24nLCAnZScsICdnJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ2MnLCAncicsICdvJywgJ3QnLCAnYScsICd0JywgJ2UnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ3InLCAnYycsICduJywgJ2UnLCAnZycsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndicsICdyJywgJ24nLCAnZCcsICdwJywgJ2EnLCAnYycsICdrJywgJ3cnLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3YnLCAncicsICduJywgJ2QnLCAncCcsICdhJywgJ2MnLCAnaycsCisgICd3JywgJ2gnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3YnLCAncycsICdhJywgJ3QnLCAnaCcsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndicsICdzJywgJ2EnLCAndCcsICdoJywgJ2InLCAnXycsCisgICduJywgJ28nLCAncCcsICdhJywgJ2MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3YnLCAncycsCisgICdhJywgJ3QnLCAnaCcsICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ3MnLCAnYScsCisgICd0JywgJ2gnLCAndScsICdiJywgJ18nLCAnbicsICdvJywgJ3AnLCAnYScsICdjJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdTJywgJzInLCAnXycsICd2JywgJ3MnLCAnYScsICd0JywgJ3cnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsCisgICdfJywgJ3YnLCAncycsICdhJywgJ3QnLCAndycsICdoJywgJ18nLCAnbicsICdvJywgJ3AnLCAnYScsICdjJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ3MnLCAnYScsICd0JywgJ3cnLCAndScsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndicsICdzJywgJ2EnLCAndCcsICd3JywgJ3UnLCAnaCcsICdfJywgJ24nLCAnbycsCisgICdwJywgJ2EnLCAnYycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndicsICdzJywgJ3AnLCAnbCcsCisgICdhJywgJ3QnLCAncicsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndicsICdzJywgJ3AnLCAnbCcsCisgICdhJywgJ3QnLCAncicsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndicsICdzJywgJ3AnLCAnbCcsCisgICdpJywgJ2MnLCAnZScsICdpJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ3MnLCAncCcsCisgICdsJywgJ2knLCAnYycsICdlJywgJ3InLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3YnLCAncycsCisgICd4JywgJ3QnLCAnYicsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndicsICdzJywgJ3gnLCAndCcsCisgICdoJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ3QnLCAncicsICd1JywgJ24nLCAnZScsCisgICdoJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ3QnLCAncicsICd1JywgJ24nLCAnZScsCisgICd3JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ3QnLCAncicsICd1JywgJ24nLCAnbycsCisgICdoJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ3QnLCAncicsICd1JywgJ24nLCAnbycsCisgICd3JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ3onLCAneCcsICd0JywgJ2InLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3YnLCAneicsICd4JywgJ3QnLCAnaCcsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnUycsICc0JywgJ18nLCAnYScsICdkJywgJ2QnLCAnYScsICdkJywgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnNCcsICdfJywgJ2EnLCAnZCcsICdkJywgJ2knLCAnXycsICdhJywgJ3MnLCAnbCcsICdfJywgJ3InLCAnaScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsICdfJywgJ2EnLCAnZCcsICdkJywgJ2knLCAnXycsICdsJywgJ3MnLCAncicsCisgICdfJywgJ3InLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsICdfJywgJ2EnLCAnbicsICdkJywgJ2knLCAnXycsCisgICdhJywgJ3MnLCAnbCcsICdfJywgJ3InLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsICdfJywgJ2EnLCAnbicsCisgICdkJywgJ2knLCAnXycsICdsJywgJ3MnLCAncicsICdfJywgJ3InLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsCisgICdfJywgJ2MnLCAnbCcsICdiJywgJ2EnLCAnZCcsICdkJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzQnLCAnXycsCisgICdjJywgJ2wnLCAnYicsICdwJywgJ2EnLCAnZCcsICdkJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzQnLCAnXycsCisgICdjJywgJ2wnLCAnYicsICdwJywgJ24nLCAnbycsICdyJywgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzQnLCAnXycsCisgICdlJywgJ3gnLCAndCcsICdyJywgJ2EnLCAnYycsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc0JywgJ18nLCAnZScsCisgICd4JywgJ3QnLCAncicsICdhJywgJ2MnLCAndCcsICdfJywgJ3InLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsCisgICdfJywgJ2UnLCAneCcsICd0JywgJ3InLCAnYScsICdjJywgJ3QnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsCisgICdfJywgJ2UnLCAneCcsICd0JywgJ3InLCAnYScsICdjJywgJ3QnLCAncCcsICdfJywgJ3InLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnNCcsICdfJywgJ2wnLCAncycsICdsJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzQnLCAnXycsCisgICduJywgJ3QnLCAncycsICd0JywgJ2InLCAnaScsICd0JywgJ18nLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsCisgICdfJywgJ24nLCAndCcsICdzJywgJ3QnLCAnYicsICdpJywgJ3QnLCAnXycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsCisgICc0JywgJ18nLCAnbycsICdyJywgJ18nLCAnYScsICduJywgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsCisgICdfJywgJ28nLCAncicsICdfJywgJ2EnLCAnbicsICdkJywgJ2knLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsCisgICdfJywgJ28nLCAncicsICdfJywgJ28nLCAncicsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc0JywgJ18nLCAnbycsCisgICdyJywgJ2knLCAnXycsICdhJywgJ3MnLCAnbCcsICdfJywgJ3InLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsCisgICdfJywgJ28nLCAncicsICdpJywgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsICdyJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdTJywgJzQnLCAnXycsICdwJywgJ2EnLCAncicsICdpJywgJ3QnLCAneScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsCisgICdfJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdkJywgJ18nLCAnbCcsICdvJywgJ2MnLCAnaycsICdlJywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzQnLCAnXycsICdzJywgJ3UnLCAnYicsICdhJywgJ2QnLCAnZCcsICdpJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnUycsICc0JywgJ18nLCAncycsICd1JywgJ2InLCAnaScsICdfJywgJ2EnLCAncycsICdsJywgJ18nLCAncicsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc0JywgJ18nLCAncycsICd1JywgJ2InLCAnaScsICdfJywgJ2wnLCAncycsCisgICdyJywgJ18nLCAncicsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc0JywgJ18nLCAndicsICdyJywgJ2MnLCAncicsCisgICdvJywgJ3QnLCAnYScsICd0JywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzQnLCAnXycsICd2JywgJ3InLCAnYycsCisgICdyJywgJ28nLCAndCcsICdhJywgJ3QnLCAnZScsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsCisgICc0JywgJ18nLCAndicsICd4JywgJ2EnLCAnZCcsICdkJywgJ3MnLCAndScsICdiJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdTJywgJzQnLCAnXycsICd2JywgJ3gnLCAnYScsICdkJywgJ2QnLCAncycsICd1JywgJ2InLCAnaCcsICdyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnUycsICc0JywgJ18nLCAndicsICd4JywgJ2EnLCAnZCcsICdkJywgJ3MnLCAndScsICdiJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzQnLCAnXycsICd2JywgJ3gnLCAncycsICd1JywgJ2InLCAnYScsICdkJywgJ2QnLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsICdfJywgJ3YnLCAneCcsICdzJywgJ3UnLCAnYicsICdhJywgJ2QnLCAnZCcsCisgICdoJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzQnLCAnXycsICd2JywgJ3gnLCAncycsICd1JywgJ2InLCAnYScsCisgICdkJywgJ2QnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNScsICdfJywgJ2EnLCAncycsICdyJywgJ2gnLCAndScsCisgICdiJywgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2cnLCAnbycsICdvJywgJ2QnLCAncycsCisgICd5JywgJ24nLCAndCcsICdhJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzUnLCAnXycsICdhJywgJ3MnLCAncicsCisgICdoJywgJ3UnLCAnYicsICdfJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc1JywgJ18nLCAncCcsCisgICdvJywgJ3AnLCAnYycsICdvJywgJ3UnLCAnbicsICd0JywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzUnLCAnXycsCisgICd2JywgJ2EnLCAncycsICdyJywgJ2gnLCAncicsICduJywgJ2QnLCAnXycsICdnJywgJ28nLCAnbycsICdkJywgJ3MnLCAneScsCisgICduJywgJ3QnLCAnYScsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc2JywgJ18nLCAncicsICdvJywgJ2wnLCAnXycsCisgICdpJywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNicsICdfJywgJ3InLCAnbycsICdsJywgJ18nLCAnaScsCisgICdfJywgJ3AnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNicsICdfJywgJ3InLCAnbycsCisgICdsJywgJ18nLCAnaScsICdfJywgJ3AnLCAnXycsICdhJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNicsCisgICdfJywgJ3InLCAnbycsICdsJywgJ18nLCAnaScsICdfJywgJ3AnLCAnXycsICduJywgJ2EnLCAnYycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1MnLCAnNicsICdfJywgJ3InLCAnbycsICdsJywgJ18nLCAnaScsICdfJywgJ3AnLCAnXycsICdvJywgJ3InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdTJywgJzYnLCAnXycsICdyJywgJ28nLCAnbCcsICdfJywgJ2knLCAnXycsICdwJywgJ18nLCAneCcsCisgICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNicsICdfJywgJ3InLCAnbycsICdsJywgJ18nLCAnaScsCisgICdfJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzYnLCAnXycsICdyJywgJ28nLCAnbCcsICdfJywgJ2knLCAnXycsCisgICdyJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzYnLCAnXycsICdyJywgJ28nLCAnbCcsCisgICdfJywgJ2knLCAnXycsICdyJywgJ18nLCAnYScsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzYnLCAnXycsCisgICdyJywgJ28nLCAnbCcsICdfJywgJ2knLCAnXycsICdyJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdTJywgJzYnLCAnXycsICdyJywgJ28nLCAnbCcsICdfJywgJ2knLCAnXycsICdyJywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnUycsICc2JywgJ18nLCAncicsICdvJywgJ2wnLCAnXycsICdpJywgJ18nLCAncicsICdfJywgJ3gnLCAnYScsCisgICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzYnLCAnXycsICd2JywgJ3MnLCAncCcsICdsJywgJ2EnLCAndCcsCisgICdyJywgJ2InLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNicsICdfJywgJ3YnLCAndCcsICdyJywgJ3UnLCAnbicsCisgICdlJywgJ2gnLCAnYicsICdfJywgJ3AnLCAncCcsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc2JywgJ18nLCAndicsCisgICd0JywgJ3InLCAndScsICduJywgJ28nLCAnaCcsICdiJywgJ18nLCAncCcsICdwJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICdlJywgJ3gnLCAndCcsICdyJywgJ2EnLCAnYycsICd0JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICdlJywgJ3gnLCAndCcsICdyJywgJ2EnLCAnYycsICd0JywgJ3cnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAnaCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAnaCcsICdpJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ2wnLCAnbycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ2wnLCAnbycsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICdsJywgJ3YnLCAncycsICdwJywgJ2wnLCAnYScsCisgICd0JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICdsJywgJ3YnLCAncycsICdwJywgJ2wnLCAnYScsCisgICd0JywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAnbCcsCisgICd2JywgJ3MnLCAncCcsICdsJywgJ2EnLCAndCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAnbCcsCisgICd2JywgJ3MnLCAncCcsICdsJywgJ2EnLCAndCcsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ2wnLCAndicsICdzJywgJ3AnLCAnbCcsICdhJywgJ3QnLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ2wnLCAndicsICdzJywgJ3AnLCAnbCcsICdhJywgJ3QnLCAndycsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICdwJywgJ3InLCAnZScsICdkJywgJ18nLCAnYScsCisgICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICdwJywgJ3InLCAnZScsICdkJywgJ18nLCAnYScsCisgICduJywgJ2QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAncCcsCisgICdyJywgJ2UnLCAnZCcsICdfJywgJ2EnLCAnbicsICdkJywgJ18nLCAnbicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3AnLCAncicsICdlJywgJ2QnLCAnXycsICdhJywgJ24nLCAnZCcsICdfJywgJ24nLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAncCcsICdyJywgJ2UnLCAnZCcsICdfJywgJ24nLCAnbycsCisgICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAncCcsICdyJywgJ2UnLCAnZCcsICdfJywgJ24nLCAnbycsCisgICd0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3AnLCAncicsCisgICdlJywgJ2QnLCAnXycsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICdwJywgJ3InLCAnZScsCisgICdkJywgJ18nLCAnbycsICdyJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3AnLCAncicsICdlJywgJ2QnLCAnXycsICdvJywgJ3InLCAnXycsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAncCcsICdyJywgJ2UnLCAnZCcsICdfJywgJ28nLCAncicsICdfJywgJ24nLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAncCcsICdyJywgJ2UnLCAnZCcsICdfJywgJ3MnLCAnYycsCisgICdhJywgJ2wnLCAnYScsICdyJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICdwJywgJ3InLCAnZScsCisgICdkJywgJ18nLCAncycsICdjJywgJ2EnLCAnbCcsICdhJywgJ3InLCAnMicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICdwJywgJ3InLCAnZScsICdkJywgJ18nLCAncycsICdjJywgJ2EnLCAnbCcsCisgICdhJywgJ3InLCAnMicsICd2JywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICdwJywgJ3InLCAnZScsCisgICdkJywgJ18nLCAncycsICdjJywgJ2EnLCAnbCcsICdhJywgJ3InLCAnMicsICd2JywgJzInLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAncCcsICdyJywgJ2UnLCAnZCcsICdfJywgJ3gnLCAnbycsCisgICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAncCcsICdyJywgJ2UnLCAnZCcsICdfJywgJ3gnLCAnbycsCisgICdyJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3MnLCAnaCcsCisgICd1JywgJ2YnLCAnZicsICdlJywgJ3EnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3MnLCAnaCcsCisgICd1JywgJ2YnLCAnZicsICdlJywgJ3EnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICdzJywgJ2gnLCAndScsICdmJywgJ2YnLCAnZScsICdxJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICdzJywgJ2gnLCAndScsICdmJywgJ2YnLCAnZScsICdxJywgJ3cnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdTJywgJzMnLCAnMicsICdiJywgJ18nLCAnbicsCisgICdxJywgJ3AnLCAncicsICdlJywgJ2QnLCAnXycsICdhJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ1MnLCAnMycsICcyJywgJ2InLCAnXycsICduJywgJ3EnLCAncCcsICdyJywgJ2UnLCAnZCcsICdfJywgJ2EnLCAnaScsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ1MnLCAnMycsCisgICcyJywgJ2InLCAnXycsICduJywgJ3QnLCAnXycsICduJywgJ3EnLCAncCcsICdyJywgJ2UnLCAnZCcsICdfJywgJ2EnLCAnaScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnUycsICczJywgJzInLCAnYicsICdfJywgJ24nLCAndCcsCisgICdfJywgJ24nLCAncScsICdwJywgJ3InLCAnZScsICdkJywgJ18nLCAnYScsICdpJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnUycsICczJywgJzInLCAnYicsICdfJywgJ24nLCAndCcsCisgICdfJywgJ3EnLCAncCcsICdyJywgJ2UnLCAnZCcsICdfJywgJ2EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnUycsICczJywgJzInLCAnYicsICdfJywgJ24nLCAndCcsICdfJywgJ3EnLCAncCcsICdyJywgJ2UnLCAnZCcsCisgICdfJywgJ2EnLCAnaScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ1MnLCAnMycsICcyJywgJ2InLCAnXycsICdxJywgJ3AnLCAncicsICdlJywgJ2QnLCAnXycsICdhJywgJ2knLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ1MnLCAnMycsICcyJywgJ2InLCAnXycsICdxJywgJ3AnLCAncicsCisgICdlJywgJ2QnLCAnXycsICdhJywgJ2knLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdhJywgJ2InLCAncycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdhJywgJ2InLCAncycsICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnYScsICdiJywgJ3MnLCAnYicsICdfJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdhJywgJ2InLCAncycsICdiJywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2InLCAncycsICdkJywgJ2knLCAnZicsCisgICdmJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnYicsICdzJywgJ2QnLCAnaScsCisgICdmJywgJ2YnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2EnLCAnYicsICdzJywgJ2QnLCAnaScsICdmJywgJ2YnLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdhJywgJ2InLCAncycsICdkJywgJ2knLCAnZicsICdmJywgJ3UnLCAnYicsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnYicsICdzJywgJ2QnLCAnaScsCisgICdmJywgJ2YnLCAndScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2InLCAncycsCisgICdkJywgJ2knLCAnZicsICdmJywgJ3UnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnYicsICdzJywgJ2QnLCAnaScsICdmJywgJ2YnLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdiJywgJ3MnLCAnZCcsICdpJywgJ2YnLCAnZicsICd3JywgJ18nLCAnMScsCisgICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdiJywgJ3MnLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdiJywgJ3MnLCAnaCcsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnYicsICdzJywgJ2gnLCAnXycsCisgICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdiJywgJ3MnLCAnaCcsCisgICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnYScsICdiJywgJ3MnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICdiJywgJ3MnLCAndycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2EnLCAnYicsICdzJywgJ3cnLCAnXycsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnYScsICdiJywgJ3MnLCAndycsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAnYicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ2InLCAnXycsICdkJywgJ3YnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ2InLCAnXycsICdkJywgJ3YnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsCisgICdiJywgJ24nLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAnYicsCisgICduJywgJ3EnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdhJywgJ2QnLCAnZCcsICdiJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsCisgICdkJywgJ2InLCAncScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2EnLCAnZCcsICdkJywgJ2InLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2EnLCAnZCcsICdkJywgJ2InLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdiJywgJ3MnLCAnYScsICd0JywgJ18nLCAnZCcsCisgICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdiJywgJ3MnLCAnYScsCisgICd0JywgJ18nLCAnZCcsICd2JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ3YnLCAnNicsCisgICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAnYycsICdhJywgJ3InLCAncicsICd5JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAndicsCisgICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdjJywgJ2EnLCAncicsICdyJywgJ3knLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdjJywgJ2wnLCAnYicsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdjJywgJ2wnLCAnYicsCisgICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICdkJywgJ2QnLCAnYycsICdsJywgJ2InLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICdkJywgJ2QnLCAnYycsICdsJywgJ2InLCAndycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2EnLCAnZCcsICdkJywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdoJywgJ18nLCAnZCcsICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdoJywgJ18nLCAnZCcsICd2JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAnaCcsICduJywgJ3EnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ2gnLCAnbicsICdxJywgJ18nLCAnMScsCisgICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAnaCcsCisgICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdoJywgJ3EnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsCisgICdoJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsCisgICdoJywgJ3MnLCAnYScsICd0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAnaCcsICdzJywgJ2EnLCAndCcsICdfJywgJ2QnLCAndicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAnaCcsICdzJywgJ2EnLCAndCcsICdfJywgJ2QnLCAndicsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsCisgICdkJywgJ2gnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAnaCcsCisgICd3JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICdkJywgJ2QnLCAnaCcsICd3JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2EnLCAnZCcsICdkJywgJ2gnLCAndycsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsICdiJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ3UnLCAnYicsICdoJywgJ18nLCAnMScsCisgICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsCisgICdiJywgJ2gnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICdkJywgJ2QnLCAndScsICdiJywgJ2gnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ3UnLCAnYicsICdzJywgJ2EnLCAndCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsICdiJywgJ3MnLCAnYScsCisgICd0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICdkJywgJ2QnLCAndScsICdiJywgJ3MnLCAnYScsICd0JywgJ18nLCAnZCcsICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd1JywgJ2InLCAncycsICdhJywgJ3QnLCAnXycsICdkJywgJ3YnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsCisgICd1JywgJ2InLCAndScsICdiJywgJ2InLCAnXycsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsICdiJywgJ3UnLCAnYicsICdiJywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsCisgICd1JywgJ2gnLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsCisgICdkJywgJ3UnLCAnaCcsICdzJywgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ3UnLCAnaCcsICdzJywgJ2EnLCAndCcsICdfJywgJ2QnLCAndicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsICdoJywgJ3MnLCAnYScsCisgICd0JywgJ18nLCAnZCcsICd2JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsICdoJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2EnLCAnZCcsICdkJywgJ3UnLCAnaCcsICd3JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsICdoJywgJ3cnLCAnXycsICdhJywgJ2MnLCAnYycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsICdoJywgJ3cnLCAnXycsCisgICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2EnLCAnZCcsICdkJywgJ3UnLCAndycsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsICd3JywgJ3MnLCAnYScsICd0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsICd3JywgJ3MnLCAnYScsCisgICd0JywgJ18nLCAnZCcsICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsCisgICd1JywgJ3cnLCAncycsICdhJywgJ3QnLCAnXycsICdkJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd3JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndycsICdfJywgJ2QnLCAndicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndycsICdfJywgJ2QnLCAndicsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ3cnLCAnbicsCisgICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd3JywgJ24nLCAncScsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsCisgICdkJywgJ3cnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndycsCisgICdxJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICdkJywgJ2QnLCAndycsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICdkJywgJ2QnLCAndycsICdzJywgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ3cnLCAncycsICdhJywgJ3QnLCAnXycsICdkJywgJ3YnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ3cnLCAncycsICdhJywgJ3QnLCAnXycsCisgICdkJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdhJywgJ2wnLCAnaScsICdnJywgJ24nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICdsJywgJ2knLCAnZycsICduJywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdhJywgJ2wnLCAnaScsICdnJywgJ24nLCAnYicsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdhJywgJ2wnLCAnaScsICdnJywgJ24nLCAnYicsICdpJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnbicsICdkJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICduJywgJ2QnLCAnbicsICdxJywgJ3InLCAndCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICduJywgJ2QnLCAnbicsICdxJywgJ3InLCAndCcsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnbicsICdkJywgJ24nLCAncScsCisgICdyJywgJ3QnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICduJywgJ2QnLCAnbicsICdxJywgJ3InLCAndCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICduJywgJ2QnLCAncScsICdyJywgJ3QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnbicsICdkJywgJ3EnLCAncicsICd0JywgJ18nLCAnMScsCisgICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICduJywgJ2QnLCAncScsCisgICdyJywgJ3QnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICduJywgJ2QnLCAncScsICdyJywgJ3QnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnbicsICdkJywgJ3YnLCAnbicsICdxJywgJ3YnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnbicsICdkJywgJ3YnLCAnbicsICdxJywgJ3YnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ24nLCAnZCcsCisgICd2JywgJ3EnLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICduJywgJ2QnLCAndicsCisgICdxJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdhJywgJ24nLCAnZCcsICd2JywgJ3InLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICduJywgJ2QnLCAndicsICdyJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdhJywgJ24nLCAnZCcsICd2JywgJ3InLCAndCcsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ24nLCAnZCcsICd2JywgJ3InLCAndCcsICdfJywgJ2EnLCAnYycsCisgICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICdzJywgJ2wnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ2wnLCAnaCcsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsCisgICdsJywgJ2gnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICdzJywgJ2wnLCAnaCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ2wnLCAnaCcsICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAnbCcsICdoJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAnbCcsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAnbCcsICd3JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ2wnLCAndycsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAnbCcsICd3JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAnbCcsCisgICd3JywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdsJywgJ3cnLCAndicsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsCisgICdyJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ2gnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsCisgICdoJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsCisgICdyJywgJ2gnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ2gnLCAnYicsICdyJywgJ24nLCAnZCcsICdzJywgJ2EnLCAndCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ3InLCAnaCcsICdiJywgJ3InLCAnbicsCisgICdkJywgJ3MnLCAnYScsICd0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnYScsICdzJywgJ3InLCAnaCcsICdiJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsICdoJywgJ2InLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsICdoJywgJ3UnLCAnYicsCisgICdyJywgJ24nLCAnZCcsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICdzJywgJ3InLCAnaCcsICd1JywgJ2InLCAncicsICduJywgJ2QnLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsICdoJywgJ3UnLCAnYicsCisgICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ3InLCAnaCcsCisgICd1JywgJ2InLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsICdoJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2EnLCAncycsICdyJywgJ2gnLCAndicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ3UnLCAnaCcsICd1JywgJ2InLCAncicsICduJywgJ2QnLCAncycsCisgICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ3UnLCAnaCcsCisgICd1JywgJ2InLCAncicsICduJywgJ2QnLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsICd1JywgJ2gnLCAndScsICdiJywgJ3MnLCAnYScsCisgICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsICd1JywgJ2gnLCAndScsCisgICdiJywgJ3MnLCAnYScsICd0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnYScsICdzJywgJ3InLCAndScsICd3JywgJ3UnLCAnaCcsICdyJywgJ24nLCAnZCcsICdzJywgJ2EnLCAndCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ3InLCAndScsICd3JywgJ3UnLCAnaCcsCisgICdyJywgJ24nLCAnZCcsICdzJywgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ3UnLCAndycsICd1JywgJ2gnLCAncycsICdhJywgJ3QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ3UnLCAndycsICd1JywgJ2gnLCAncycsCisgICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdhJywgJ3MnLCAncicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsCisgICd3JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICdzJywgJ3InLCAndycsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdhJywgJ3MnLCAncicsICd3JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsICd3JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ3cnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ3cnLCAnaCcsICdyJywgJ24nLCAnZCcsCisgICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ3InLCAndycsCisgICdoJywgJ3InLCAnbicsICdkJywgJ3MnLCAnYScsICd0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ3InLCAndycsICdoJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsICd3JywgJ2gnLCAncycsICdhJywgJ3QnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsCisgICd3JywgJ3UnLCAnaCcsICdyJywgJ24nLCAnZCcsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnYScsICdzJywgJ3InLCAndycsICd1JywgJ2gnLCAncicsICduJywgJ2QnLCAncycsICdhJywgJ3QnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsCisgICd3JywgJ3UnLCAnaCcsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICdzJywgJ3InLCAndycsICd1JywgJ2gnLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsICd3JywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ3cnLCAndicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdzJywgJ2knLCAnZycsICduJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncycsICdpJywgJ2cnLCAnbicsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdzJywgJ2knLCAnZycsCisgICduJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdzJywgJ2knLCAnZycsCisgICduJywgJ3AnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdhJywgJ3YnLCAnZycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsCisgICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICd2JywgJ2cnLCAnYicsICdyJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICd2JywgJ2cnLCAnYicsICdyJywgJ24nLCAnZCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2EnLCAndicsICdnJywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICdoJywgJ3InLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICdoJywgJ3InLCAnbicsICdkJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICd2JywgJ2cnLCAndScsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICd1JywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICd1JywgJ2InLCAncicsCisgICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ3UnLCAnYicsCisgICdyJywgJ24nLCAnZCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2EnLCAndicsICdnJywgJ3UnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICd2JywgJ2cnLCAndScsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnYScsICd2JywgJ2cnLCAndScsICdoJywgJ3InLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICd1JywgJ2gnLCAncicsICduJywgJ2QnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICd1JywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ3UnLCAndycsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ3UnLCAndycsCisgICdyJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICd2JywgJ2cnLCAndScsCisgICd3JywgJ3InLCAnbicsICdkJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnYScsICd2JywgJ2cnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsCisgICd2JywgJ2cnLCAndycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2EnLCAndicsICdnJywgJ3cnLCAncicsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2EnLCAndicsICdnJywgJ3cnLCAncicsICduJywgJ2QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdjJywgJ2wnLCAnMCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdjJywgJ2wnLCAnMCcsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYycsICdsJywgJzAnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnYycsICdsJywgJzAnLCAndycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2MnLCAnbycsICdtJywgJ2InLCAnaScsICduJywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2MnLCAnbycsICdtJywgJ2InLCAnaScsICduJywgJ2UnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnMCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnZCcsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdkJywgJ2QnLCAnMCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2QnLCAnZScsICdhJywgJ2wnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsCisgICdlJywgJ2EnLCAnbCcsICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnZCcsICdlJywgJ2EnLCAnbCcsICdiJywgJzQnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnZCcsICdlJywgJ2EnLCAnbCcsICdiJywgJzQnLCAndycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnZScsICdhJywgJ2wnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdlJywgJ2EnLCAnbCcsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdlJywgJ2EnLCAnbCcsICd2JywgJ2QnLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdlJywgJ2EnLCAnbCcsICd2JywgJ2QnLCAnZCcsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnZScsCisgICdsJywgJ3QnLCAnYScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdlJywgJ2wnLCAndCcsCisgICdhJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsCisgICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsCisgICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAnYicsICd1JywgJ3MnLCAnXycsICdhJywgJ2MnLCAnYycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsCisgICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICdfJywgJ2QnLCAndicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICdfJywgJ2QnLCAndicsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsCisgICdwJywgJ3knLCAnYicsICd1JywgJ3MnLCAnXycsICdkJywgJ3YnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICdfJywgJ2QnLCAndicsCisgICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdoJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdoJywgJ2InLCAnXycsICdhJywgJ2MnLCAnYycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdoJywgJ2InLCAnXycsCisgICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsICdiJywgJ18nLCAnZCcsICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdkJywgJ20nLCAncCcsICd5JywgJ2gnLCAnYicsICdfJywgJ2QnLCAndicsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsCisgICdiJywgJ18nLCAnZCcsICd2JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsICdiJywgJ18nLCAnZCcsICd2JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ20nLCAncCcsCisgICd5JywgJ2gnLCAnaScsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsCisgICdtJywgJ3AnLCAneScsICdoJywgJ2knLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ20nLCAncCcsICd5JywgJ2gnLCAnaScsICdzJywgJ2EnLCAndCcsCisgICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ20nLCAncCcsCisgICd5JywgJ2gnLCAnaScsICdzJywgJ2EnLCAndCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdoJywgJ3MnLCAnYScsCisgICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ20nLCAncCcsICd5JywgJ2gnLCAncycsCisgICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdkJywgJ20nLCAncCcsICd5JywgJ2gnLCAncycsICdhJywgJ3QnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdoJywgJ3MnLCAnYScsICd0JywgJ18nLCAnYScsCisgICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdkJywgJ20nLCAncCcsICd5JywgJ2gnLCAncycsICd1JywgJ2knLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsICdzJywgJ3UnLCAnaScsICdzJywgJ2EnLCAndCcsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsCisgICdwJywgJ3knLCAnaCcsICdzJywgJ3UnLCAnaScsICdzJywgJ2EnLCAndCcsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ20nLCAncCcsICd5JywgJ2gnLCAncycsICd1JywgJ2knLCAncycsCisgICdhJywgJ3QnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsICdzJywgJ3UnLCAncycsICdhJywgJ3QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsICdzJywgJ3UnLCAncycsCisgICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdkJywgJ20nLCAncCcsICd5JywgJ2gnLCAncycsICd1JywgJ3MnLCAnYScsICd0JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsICdzJywgJ3UnLCAncycsCisgICdhJywgJ3QnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsICd2JywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ20nLCAncCcsICd5JywgJ2gnLCAndicsICdzJywgJ2EnLCAndCcsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsCisgICdwJywgJ3knLCAnaCcsICd2JywgJ3MnLCAnYScsICd0JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsICd2JywgJ3MnLCAnYScsICd0JywgJ18nLCAnYScsCisgICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdkJywgJ3MnLCAnYScsICdkJywgJ3UnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsCisgICdzJywgJ2EnLCAnZCcsICd1JywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdkJywgJ3MnLCAnYScsICdkJywgJ3UnLCAnaCcsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ3MnLCAnYScsICdkJywgJ3UnLCAnaCcsICdfJywgJ2EnLCAnYycsCisgICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZScsCisgICdxJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2UnLCAncScsICdiJywgJ18nLCAnMScsCisgICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZScsICdxJywgJ2InLCAnXycsCisgICdhJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZScsICdxJywgJ2InLCAnXycsCisgICdhJywgJ24nLCAnZCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2UnLCAncScsICdiJywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdlJywgJ3EnLCAnYicsICdfJywgJ28nLCAncicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2UnLCAncScsICdiJywgJ18nLCAneCcsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2UnLCAncScsICdiJywgJ18nLCAneCcsICdvJywgJ3InLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdlJywgJ3EnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZScsICdxJywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdlJywgJ3EnLCAnaCcsICdfJywgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdlJywgJ3EnLCAnaCcsICdfJywgJ2EnLCAnbicsICdkJywgJ18nLCAnMScsCisgICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZScsICdxJywgJ2gnLCAnXycsCisgICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2UnLCAncScsICdoJywgJ18nLCAnbycsCisgICdyJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZScsCisgICdxJywgJ2gnLCAnXycsICd4JywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZScsCisgICdxJywgJ2gnLCAnXycsICd4JywgJ28nLCAncicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2UnLCAncScsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdlJywgJ3EnLCAndycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2UnLCAncScsICd3JywgJ18nLCAnYScsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2UnLCAncScsICd3JywgJ18nLCAnYScsICduJywgJ2QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdlJywgJ3EnLCAndycsICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZScsICdxJywgJ3cnLCAnXycsICdvJywgJ3InLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdlJywgJ3EnLCAndycsICdfJywgJ3gnLCAnbycsCisgICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdlJywgJ3EnLCAndycsICdfJywgJ3gnLCAnbycsCisgICdyJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsCisgICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnbScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdtJywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdtJywgJ2gnLCAncScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnbScsCisgICdoJywgJ3EnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdtJywgJ2gnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnbScsICdoJywgJ3cnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsCisgICdtJywgJ2gnLCAndycsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ2EnLCAndCcsCisgICdoJywgJ2UnLCAncicsICdtJywgJ2gnLCAndycsICdxJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnbScsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdtJywgJ3cnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ2EnLCAndCcsCisgICdoJywgJ2UnLCAncicsICdtJywgJ3cnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsCisgICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnbScsICd3JywgJ3EnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnZycsICd0JywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAnYicsICdfJywgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAnYicsICdfJywgJ2EnLCAnbicsICdkJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ2InLCAnXycsICdvJywgJ3InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsICdiJywgJ18nLCAnbycsICdyJywgJ18nLCAnMScsCisgICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ2InLCAnXycsCisgICd4JywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ2InLCAnXycsCisgICd4JywgJ28nLCAncicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2cnLCAndCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAnaCcsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsCisgICdoJywgJ18nLCAnYScsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsCisgICdoJywgJ18nLCAnYScsICduJywgJ2QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAnaCcsICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnZycsICd0JywgJ2gnLCAnXycsICdvJywgJ3InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAnaCcsICdfJywgJ3gnLCAnbycsICdyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAnaCcsICdfJywgJ3gnLCAnbycsICdyJywgJ18nLCAnMScsCisgICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ3UnLCAnYicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ3UnLCAnYicsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsICd1JywgJ2InLCAnXycsCisgICdhJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ3UnLCAnYicsCisgICdfJywgJ2EnLCAnbicsICdkJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnZycsICd0JywgJ3UnLCAnYicsICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnZycsICd0JywgJ3UnLCAnYicsICdfJywgJ28nLCAncicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsICd1JywgJ2InLCAnXycsICd4JywgJ28nLCAncicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ3UnLCAnYicsICdfJywgJ3gnLCAnbycsCisgICdyJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsCisgICd0JywgJ3UnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ3UnLCAnaCcsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsCisgICd1JywgJ2gnLCAnXycsICdhJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsCisgICd0JywgJ3UnLCAnaCcsICdfJywgJ2EnLCAnbicsICdkJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ3UnLCAnaCcsICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ3UnLCAnaCcsICdfJywgJ28nLCAncicsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsICd1JywgJ2gnLCAnXycsCisgICd4JywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ3UnLCAnaCcsCisgICdfJywgJ3gnLCAnbycsICdyJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnZycsICd0JywgJ3UnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsCisgICd0JywgJ3UnLCAndycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2cnLCAndCcsICd1JywgJ3cnLCAnXycsICdhJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnZycsICd0JywgJ3UnLCAndycsICdfJywgJ2EnLCAnbicsICdkJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ3UnLCAndycsICdfJywgJ28nLCAncicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ3UnLCAndycsICdfJywgJ28nLCAncicsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsCisgICd1JywgJ3cnLCAnXycsICd4JywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsCisgICd0JywgJ3UnLCAndycsICdfJywgJ3gnLCAnbycsICdyJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2cnLCAndCcsICd3JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnZycsICd0JywgJ3cnLCAnXycsICdhJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnZycsICd0JywgJ3cnLCAnXycsICdhJywgJ24nLCAnZCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsICd3JywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAndycsICdfJywgJ28nLCAncicsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsICd3JywgJ18nLCAneCcsCisgICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsICd3JywgJ18nLCAneCcsCisgICdvJywgJ3InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdpJywgJ24nLCAncycsICdlJywgJ3InLCAndCcsICd3JywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2knLCAnbicsICdzJywgJ2UnLCAncicsICd0JywgJ3cnLCAncicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2wnLCAnYScsICdsJywgJ2knLCAnZycsICduJywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2wnLCAnYScsICdsJywgJ2knLCAnZycsICduJywgJ2InLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdsJywgJ2EnLCAnbCcsCisgICdpJywgJ2cnLCAnbicsICdiJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2wnLCAnYScsCisgICdsJywgJ2knLCAnZycsICduJywgJ2InLCAnaScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2wnLCAncycsICdyJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2wnLCAncycsICdyJywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdsJywgJ3MnLCAncicsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdsJywgJ3MnLCAncicsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnbCcsICdzJywgJ3InLCAnaCcsICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdsJywgJ3MnLCAncicsICdoJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdsJywgJ3MnLCAncicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdsJywgJ3MnLCAncicsICd3JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnbCcsICdzJywgJ3InLCAndycsICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdsJywgJ3MnLCAncicsICd3JywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdsJywgJ3UnLCAndCcsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdsJywgJ3UnLCAndCcsICc0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnbCcsICd1JywgJ3QnLCAndicsICd2JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2wnLCAndScsICd0JywgJ3YnLCAndicsICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbCcsICd1JywgJ3QnLCAndicsICd2JywgJ2InLCAnXycsICduJywgJ20nLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2wnLCAndScsICd0JywgJ3YnLCAndicsICdiJywgJ18nLCAnbicsCisgICdtJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbCcsCisgICd1JywgJ3QnLCAndicsICd2JywgJ2InLCAnXycsICdvJywgJ3InLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ2wnLCAndScsICd0JywgJ3YnLCAndicsICdiJywgJ18nLCAnbycsICdyJywgJ2EnLCAnYycsCisgICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbCcsCisgICd1JywgJ3QnLCAndicsICd2JywgJ2InLCAnXycsICdvJywgJ3InLCAnYScsICdjJywgJ2MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbCcsICd1JywgJ3QnLCAndicsICd2JywgJ2InLCAnXycsICdvJywgJ3InLCAnYScsCisgICdjJywgJ2MnLCAnaScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2wnLCAndScsICd0JywgJ3YnLCAndicsICdiJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ2wnLCAndScsICd0JywgJ3YnLCAndicsICdiJywgJ2knLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdsJywgJ3UnLCAndCcsICd2JywgJ3cnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbCcsICd1JywgJ3QnLCAndicsICd3JywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdsJywgJ3UnLCAndCcsICd2JywgJ3cnLCAnaCcsCisgICdfJywgJ24nLCAnbScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbCcsICd1JywgJ3QnLCAndicsCisgICd3JywgJ2gnLCAnXycsICduJywgJ20nLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdsJywgJ3UnLCAndCcsICd2JywgJ3cnLCAnaCcsICdfJywgJ28nLCAncicsICdhJywgJ2MnLCAnYycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbCcsICd1JywgJ3QnLCAndicsICd3JywgJ2gnLCAnXycsCisgICdvJywgJ3InLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdsJywgJ3UnLCAndCcsICd2JywgJ3cnLCAnaCcsICdfJywgJ28nLCAncicsICdhJywgJ2MnLCAnYycsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdsJywgJ3UnLCAndCcsICd2JywgJ3cnLCAnaCcsCisgICdfJywgJ28nLCAncicsICdhJywgJ2MnLCAnYycsICdpJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbCcsICd1JywgJ3QnLCAndicsICd3JywgJ2gnLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbCcsICd1JywgJ3QnLCAndicsICd3JywgJ2gnLCAnaScsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAnYScsICdzJywgJ2snLCAnZScsCisgICdkJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICduJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ20nLCAnYScsICdzJywgJ2snLCAnZScsICdkJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICduJywgJ3EnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ2EnLCAncycsCisgICdrJywgJ2UnLCAnZCcsICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAnbicsICd0JywgJ24nLCAncScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdhJywgJ3MnLCAnaycsICdlJywgJ2QnLCAncycsICd0JywgJ28nLCAncicsCisgICdlJywgJ24nLCAndCcsICduJywgJ3EnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdtJywgJ2EnLCAncycsICdrJywgJ2UnLCAnZCcsICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAnbicsCisgICd0JywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAnYScsICdzJywgJ2snLCAnZScsCisgICdkJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICduJywgJ3QnLCAncScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAnYScsICdzJywgJ2snLCAnZScsICdkJywgJ3MnLCAndCcsCisgICdvJywgJ3InLCAnZScsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ2EnLCAncycsCisgICdrJywgJ2UnLCAnZCcsICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAncScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ2EnLCAneCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdtJywgJ2EnLCAneCcsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdhJywgJ3gnLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdtJywgJ2EnLCAneCcsICd1JywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ2EnLCAneCcsICd1JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ3UnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ3cnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ2knLCAnbicsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdtJywgJ2knLCAnbicsICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdpJywgJ24nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnbScsICdpJywgJ24nLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAnaScsICduJywgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnbScsICdpJywgJ24nLCAndScsICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdpJywgJ24nLCAndScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdtJywgJ2knLCAnbicsICd1JywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ2knLCAnbicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdtJywgJ2knLCAnbicsICd3JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ2EnLCAnYicsICd1JywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICdhJywgJ2InLCAndScsICdzJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ2EnLCAnYicsICd1JywgJ3MnLCAnXycsCisgICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ2EnLCAnYicsCisgICd1JywgJ3MnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICdhJywgJ2InLCAndScsICdzJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICdhJywgJ2InLCAndScsICdzJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAnYScsICdiJywgJ3UnLCAndScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ2EnLCAnYicsICd1JywgJ3UnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAnYScsCisgICdiJywgJ3UnLCAndScsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdtJywgJ3AnLCAnYScsICdiJywgJ3UnLCAndScsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ2EnLCAnYicsICd1JywgJ3UnLCAndicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ2EnLCAnYicsICd1JywgJ3UnLCAndicsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsCisgICdhJywgJ2gnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ2EnLCAnaCcsCisgICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsCisgICdwJywgJ2EnLCAnaCcsICdiJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ20nLCAncCcsICdhJywgJ2gnLCAnYicsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ2EnLCAnaCcsICdoJywgJ3MnLCAnYScsCisgICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAnYScsICdoJywgJ2gnLCAncycsCisgICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdtJywgJ3AnLCAnYScsICd1JywgJ2gnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsCisgICdwJywgJ2EnLCAndScsICdoJywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAnYScsICd1JywgJ2gnLCAnYicsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAnYScsICd1JywgJ2gnLCAnYicsICdfJywgJ2EnLCAnYycsCisgICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsCisgICdwJywgJ2EnLCAndScsICdoJywgJ3UnLCAnaCcsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnbScsICdwJywgJ2EnLCAndScsICdoJywgJ3UnLCAnaCcsICdzJywgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICdzJywgJ3UnLCAnaCcsCisgICd1JywgJ2gnLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsCisgICdzJywgJ3UnLCAnaCcsICd1JywgJ2gnLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnYicsICd1JywgJ3MnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsCisgICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsCisgICdiJywgJ3UnLCAncycsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnYicsICd1JywgJ3MnLCAndicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnYicsICd1JywgJ3MnLCAndicsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2InLCAndScsCisgICdzJywgJ3YnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsCisgICdwJywgJ3knLCAnYicsICd1JywgJ3MnLCAndicsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnYicsICd2JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdiJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdiJywgJ3YnLCAnXycsCisgICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnYicsCisgICd2JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdlJywgJ3cnLCAndScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdlJywgJ3cnLCAndScsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnZScsICd3JywgJ3UnLCAnaCcsCisgICdfJywgJzYnLCAnNCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnZScsCisgICd3JywgJ3UnLCAnaCcsICdfJywgJzYnLCAnNCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ20nLCAncCcsICd5JywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdoJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2gnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2gnLCAncycsCisgICdhJywgJ3QnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsCisgICdwJywgJ3knLCAnaCcsICdzJywgJ2EnLCAndCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaCcsICdzJywgJ3InLCAncycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaCcsICdzJywgJ3InLCAncycsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsCisgICd5JywgJ2gnLCAncycsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsCisgICdoJywgJ3MnLCAncycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ20nLCAncCcsICd5JywgJ2gnLCAndScsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdtJywgJ3AnLCAneScsICdoJywgJ3UnLCAncycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2gnLCAndScsICdzJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2gnLCAndScsICdzJywgJ18nLCAnYScsCisgICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdtJywgJ3AnLCAneScsICdoJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsCisgICd5JywgJ2gnLCAndicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ20nLCAncCcsICd5JywgJ2gnLCAndicsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdoJywgJ3YnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2gnLCAndicsCisgICdzJywgJ3InLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaCcsCisgICd2JywgJ3MnLCAncicsICdzJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaScsICdlJywgJ28nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaScsICdlJywgJ28nLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2knLCAnZScsICd3JywgJ2gnLCAnXycsCisgICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaScsCisgICdlJywgJ3cnLCAnaCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaScsICdlJywgJ3cnLCAndScsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdpJywgJ2UnLCAndycsICd1JywgJ2gnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsCisgICdpJywgJ2UnLCAndycsICd1JywgJ2gnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaScsICdlJywgJ3cnLCAndScsICdoJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsCisgICdpJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2knLCAnaCcsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsCisgICd5JywgJ2knLCAnaCcsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdtJywgJ3AnLCAneScsICdpJywgJ2gnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2knLCAnaCcsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdpJywgJ2gnLCAnYicsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2knLCAnaCcsCisgICdiJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsCisgICd5JywgJ2knLCAnaCcsICdiJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdpJywgJ28nLCAndycsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdpJywgJ28nLCAndycsICdoJywgJ18nLCAnMScsCisgICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaScsCisgICd3JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2knLCAndycsCisgICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsCisgICdwJywgJ3knLCAnaScsICd3JywgJ2InLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaScsICd3JywgJ2InLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2knLCAndycsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdpJywgJ3cnLCAnaCcsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsCisgICd5JywgJ2knLCAndycsICdoJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ20nLCAncCcsICd5JywgJ2knLCAndycsICdoJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdpJywgJ3cnLCAndScsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdpJywgJ3cnLCAndScsCisgICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsCisgICdwJywgJ3knLCAnaScsICd3JywgJ3UnLCAnYicsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdpJywgJ3cnLCAndScsICdiJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsCisgICdvJywgJ3cnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnbycsCisgICd3JywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdtJywgJ3AnLCAneScsICdvJywgJ3cnLCAnaCcsICdfJywgJzYnLCAnNCcsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdvJywgJ3cnLCAnaCcsICdfJywgJzYnLCAnNCcsCisgICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnbycsICd3JywgJ2gnLCAnXycsICdyJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnbycsICd3JywgJ2gnLCAnXycsICdyJywgJ24nLCAnZCcsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsCisgICd5JywgJ28nLCAndycsICdoJywgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdzJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdvJywgJ3cnLCAnaCcsICdfJywgJ3InLCAnbicsCisgICdkJywgJ18nLCAncycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ28nLCAndycsICdoJywgJ18nLCAncycsICdhJywgJ2MnLCAnYycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnbycsICd3JywgJ2gnLCAnXycsCisgICdzJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdtJywgJ3AnLCAneScsICd1JywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICd1JywgJ2InLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAndScsICdiJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsCisgICd1JywgJ2InLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAndScsCisgICdiJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdtJywgJ3AnLCAneScsICd1JywgJ2InLCAndicsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICd1JywgJ2InLCAndicsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsCisgICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAndScsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICd1JywgJ2gnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsCisgICd1JywgJ2gnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsCisgICdwJywgJ3knLCAndScsICdoJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICd1JywgJ2gnLCAnZScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAndScsICdoJywgJ2UnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICd1JywgJ2gnLCAnZScsCisgICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsCisgICd1JywgJ2gnLCAnZScsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAndScsICdoJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ3UnLCAnaCcsICd2JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAndScsICdoJywgJ3YnLCAnXycsCisgICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAndScsCisgICdoJywgJ3YnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAndScsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdtJywgJ3UnLCAneCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ24nLCAnYScsICd2JywgJ2cnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbicsCisgICdhJywgJ3YnLCAnZycsICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnbicsICdhJywgJ3YnLCAnZycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICduJywgJ2EnLCAndicsICdnJywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICduJywgJ2EnLCAndicsICdnJywgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnbicsICdhJywgJ3YnLCAnZycsICd1JywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICduJywgJ2EnLCAndicsICdnJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ24nLCAnYScsICd2JywgJ2cnLCAndycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ24nLCAnbycsICdyJywgJ20nLCAnYScsICdtJywgJ3QnLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbicsICdvJywgJ3InLCAnbScsICdhJywgJ20nLCAndCcsCisgICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbicsCisgICdvJywgJ3InLCAnbScsICdhJywgJ20nLCAndCcsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICduJywgJ28nLCAncicsICdtJywgJ2EnLCAnbScsICd0JywgJ3cnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICduJywgJ28nLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAnbicsICdvJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ28nLCAncicsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3AnLCAnYScsCisgICdjJywgJ2snLCAnZScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdwJywgJ2EnLCAnYycsCisgICdrJywgJ2UnLCAnYicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ3AnLCAnYScsICdjJywgJ2snLCAnZScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdwJywgJ2EnLCAnYycsICdrJywgJ2UnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ3AnLCAnYScsICdjJywgJ2snLCAnaCcsICdiJywgJ18nLCAncycsICdhJywgJ3QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3AnLCAnYScsICdjJywgJ2snLCAnaCcsICdiJywgJ18nLCAncycsCisgICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdwJywgJ2EnLCAnYycsICdrJywgJ2gnLCAndScsICdiJywgJ18nLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ3AnLCAnYScsICdjJywgJ2snLCAnaCcsICd1JywgJ2InLCAnXycsICdzJywgJ2EnLCAndCcsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3AnLCAnYScsCisgICdjJywgJ2snLCAnbycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdwJywgJ2EnLCAnYycsCisgICdrJywgJ28nLCAnYicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ3AnLCAnYScsICdjJywgJ2snLCAnbycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdwJywgJ2EnLCAnYycsICdrJywgJ28nLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ3AnLCAnYScsICdjJywgJ2snLCAndycsICdoJywgJ18nLCAncycsICdhJywgJ3QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3AnLCAnYScsICdjJywgJ2snLCAndycsICdoJywgJ18nLCAncycsCisgICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdwJywgJ2EnLCAnYycsICdrJywgJ3cnLCAndScsICdoJywgJ18nLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ3AnLCAnYScsICdjJywgJ2snLCAndycsICd1JywgJ2gnLCAnXycsICdzJywgJ2EnLCAndCcsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3AnLCAnbycsCisgICdwJywgJ2MnLCAnbycsICd1JywgJ24nLCAndCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdwJywgJ28nLCAncCcsICdjJywgJ28nLCAndScsICduJywgJ3QnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3AnLCAncicsICdlJywgJ2YnLCAnaScsICd4JywgJ3EnLCAnYicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncCcsICdyJywgJ2UnLCAnZicsICdpJywgJ3gnLCAncScsCisgICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncCcsCisgICdyJywgJ2UnLCAnZicsICdpJywgJ3gnLCAncScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdwJywgJ3InLCAnZScsICdmJywgJ2knLCAneCcsICdxJywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdwJywgJ3InLCAnZScsICdmJywgJ2knLCAneCcsICdxJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3AnLCAncicsICdlJywgJ2YnLCAnaScsICd4JywgJ3EnLCAndycsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnZCcsCisgICdlJywgJ2wnLCAndCcsICdhJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ2QnLCAnZScsCisgICdsJywgJ3QnLCAnYScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ3InLCAnbScsICdwJywgJ3knLCAnYicsICd1JywgJ2InLCAnXycsICdyJywgJ3QnLCAndCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAnYicsICdfJywgJ3InLCAndCcsCisgICd0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsCisgICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAnYicsICdfJywgJ3InLCAndCcsICd0JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbScsICdwJywgJ3knLCAnYicsICd1JywgJ2InLCAnXycsCisgICdyJywgJ3QnLCAndCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbScsICdwJywgJ3knLCAnYicsCisgICd1JywgJ3MnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsCisgICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ2InLCAndScsCisgICdzJywgJ2knLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdyJywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywgJ2knLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICdpJywgJ18nLCAnYScsCisgICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdyJywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ3InLCAnbScsICdwJywgJ3knLCAnYicsICd1JywgJ3MnLCAndicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbScsICdwJywgJ3knLCAnYicsICd1JywgJ3MnLCAndicsCisgICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsCisgICd5JywgJ2InLCAndScsICdzJywgJ3YnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbScsICdwJywgJ3knLCAnYicsICd2JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ2InLCAndicsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbScsICdwJywgJ3knLCAnYicsCisgICd2JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbScsCisgICdwJywgJ3knLCAnYicsICd2JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICd1JywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ3UnLCAnYicsCisgICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsCisgICd5JywgJ3UnLCAnYicsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICd1JywgJ2InLCAnXycsICdyJywgJ3QnLCAndCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICd1JywgJ2InLCAnXycsCisgICdyJywgJ3QnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ3InLCAnbScsICdwJywgJ3knLCAndScsICdiJywgJ18nLCAncicsICd0JywgJ3QnLCAnXycsICdhJywgJ2MnLCAnYycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICd1JywgJ2InLCAnXycsCisgICdyJywgJ3QnLCAndCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICd1JywgJ2InLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICd1JywgJ2InLCAnaScsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbScsICdwJywgJ3knLCAndScsCisgICdiJywgJ2knLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsCisgICdtJywgJ3AnLCAneScsICd1JywgJ2InLCAnaScsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICd1JywgJ2InLCAndicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICd1JywgJ2InLCAndicsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbScsCisgICdwJywgJ3knLCAndScsICdiJywgJ3YnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICd1JywgJ2InLCAndicsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsCisgICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdvJywgJ3InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbycsICdyJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ2gnLCAnYicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ2gnLCAnYicsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbycsCisgICd1JywgJ24nLCAnZCcsICdoJywgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsCisgICdvJywgJ3UnLCAnbicsICdkJywgJ2gnLCAndScsICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ3UnLCAnaCcsICd1JywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICd1JywgJ2gnLCAndScsCisgICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsCisgICdvJywgJ3UnLCAnbicsICdkJywgJ3UnLCAndycsICd1JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICd1JywgJ3cnLCAndScsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ3cnLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ3cnLCAnaCcsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbycsCisgICd1JywgJ24nLCAnZCcsICd3JywgJ3UnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsCisgICdvJywgJ3UnLCAnbicsICdkJywgJ3cnLCAndScsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdzJywgJ2EnLCAnZCcsICd1JywgJ2InLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdzJywgJ2EnLCAnZCcsICd1JywgJ2InLCAnaScsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAncycsICdhJywgJ2QnLCAndScsCisgICdiJywgJ2knLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsCisgICdzJywgJ2EnLCAnZCcsICd1JywgJ2InLCAnaScsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdhJywgJ3QnLCAnaCcsICd1JywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnYScsICd0JywgJ2gnLCAndScsICdiJywgJ18nLCAnMScsCisgICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdhJywgJ3QnLCAndScsCisgICd3JywgJ3UnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdhJywgJ3QnLCAndScsCisgICd3JywgJ3UnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ3MnLCAnYScsICd0JywgJ3cnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsCisgICdhJywgJ3QnLCAndycsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAncycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2InLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2MnLCAnYScsCisgICd0JywgJ3QnLCAnZScsICdyJywgJ20nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsCisgICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdtJywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ20nLCAnaCcsCisgICdfJywgJ2EnLCAnZCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2MnLCAnYScsCisgICd0JywgJ3QnLCAnZScsICdyJywgJ20nLCAnaCcsICdfJywgJ2EnLCAnZCcsICdkJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsCisgICdtJywgJ2gnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdjJywgJ2EnLCAndCcsCisgICd0JywgJ2UnLCAncicsICdtJywgJ2gnLCAncScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnbScsICdoJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnbScsCisgICdoJywgJ3cnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ20nLCAnaCcsICd3JywgJ18nLCAnYScsICdkJywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnbScsCisgICdoJywgJ3cnLCAnXycsICdhJywgJ2QnLCAnZCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnbScsICdoJywgJ3cnLCAncScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsCisgICdtJywgJ2gnLCAndycsICdxJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdtJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnbScsICd3JywgJ18nLCAnMScsCisgICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdjJywgJ2EnLCAndCcsCisgICd0JywgJ2UnLCAncicsICdtJywgJ3cnLCAnXycsICdhJywgJ2QnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdtJywgJ3cnLCAnXycsICdhJywgJ2QnLCAnZCcsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnYycsCisgICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnbScsICd3JywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnbScsICd3JywgJ3EnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnZScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdzJywgJ2gnLCAndScsICdmJywgJ2UnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnZicsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2gnLCAndScsICdmJywgJ2YnLCAnYicsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnZicsCisgICdlJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnZicsCisgICdlJywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdzJywgJ2gnLCAndScsICdmJywgJ2YnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsCisgICdoJywgJ3UnLCAnZicsICdmJywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdzJywgJ2gnLCAndScsICdmJywgJ2YnLCAnbycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdzJywgJ2gnLCAndScsICdmJywgJ2YnLCAnbycsICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdoJywgJ3UnLCAnZicsICdmJywgJ3YnLCAnZCcsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2gnLCAndScsICdmJywgJ2YnLCAndicsCisgICdkJywgJ2QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdzJywgJ2gnLCAndScsICdmJywgJ28nLCAnZScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdzJywgJ2gnLCAndScsICdmJywgJ28nLCAnZScsICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdoJywgJ3UnLCAnZicsICdvJywgJ2UnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdoJywgJ3UnLCAnZicsICdvJywgJ2UnLCAnaCcsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnbycsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2gnLCAndScsICdmJywgJ28nLCAnaCcsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsCisgICdiJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ2InLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsCisgICdiJywgJ18nLCAnZCcsICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsCisgICdiJywgJ18nLCAnZCcsICd2JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAnYicsICduJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ3MnLCAndScsICdiJywgJ2InLCAnbicsICdxJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAnYicsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICdiJywgJ3EnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICdiJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICdiJywgJ3MnLCAnYScsICd0JywgJ18nLCAnMScsCisgICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAnYicsCisgICdzJywgJ2EnLCAndCcsICdfJywgJ2QnLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsCisgICd1JywgJ2InLCAnYicsICdzJywgJ2EnLCAndCcsICdfJywgJ2QnLCAndicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICd2JywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ2MnLCAnYScsICdyJywgJ3InLCAneScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ3YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAnYycsICdhJywgJ3InLCAncicsCisgICd5JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsCisgICd1JywgJ2InLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAnaCcsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsCisgICdiJywgJ2gnLCAnXycsICdkJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsCisgICdiJywgJ2gnLCAnXycsICdkJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICdoJywgJ24nLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAnaCcsICduJywgJ3EnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICdoJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ2gnLCAncScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ2gnLCAncycsICdhJywgJ3QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ2gnLCAncycsICdhJywgJ3QnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsCisgICdoJywgJ3MnLCAnYScsICd0JywgJ18nLCAnZCcsICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdzJywgJ3UnLCAnYicsICdoJywgJ3MnLCAnYScsICd0JywgJ18nLCAnZCcsICd2JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAnaCcsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICdoJywgJ3cnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd1JywgJ2InLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndScsICdiJywgJ2gnLCAnXycsCisgICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsCisgICd1JywgJ2InLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsCisgICdiJywgJ3UnLCAnYicsICdzJywgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ3UnLCAnYicsICdzJywgJ2EnLCAndCcsICdfJywgJ2QnLCAndicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndScsICdiJywgJ3MnLCAnYScsCisgICd0JywgJ18nLCAnZCcsICd2JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndScsICdiJywgJ3UnLCAnYicsICdiJywgJ18nLCAncycsICdhJywgJ3QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ3UnLCAnYicsICd1JywgJ2InLCAnYicsCisgICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndScsICdoJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd1JywgJ2gnLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd1JywgJ2gnLCAncycsCisgICdhJywgJ3QnLCAnXycsICdkJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsCisgICdiJywgJ3UnLCAnaCcsICdzJywgJ2EnLCAndCcsICdfJywgJ2QnLCAndicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ3UnLCAnaCcsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd1JywgJ2gnLCAndycsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ3UnLCAndycsCisgICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndScsCisgICd3JywgJ3MnLCAnYScsICd0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsCisgICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndScsICd3JywgJ3MnLCAnYScsICd0JywgJ18nLCAnZCcsICd2JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd1JywgJ3cnLCAncycsICdhJywgJ3QnLCAnXycsCisgICdkJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICdzJywgJ3UnLCAnYicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsCisgICd3JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsCisgICd1JywgJ2InLCAndycsICdfJywgJ2QnLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsCisgICd1JywgJ2InLCAndycsICdfJywgJ2QnLCAndicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsCisgICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ3cnLCAnbicsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd3JywgJ24nLCAncScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ3cnLCAncScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndycsICdxJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndycsICdzJywgJ2EnLCAndCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndycsICdzJywgJ2EnLCAndCcsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsCisgICdiJywgJ3cnLCAncycsICdhJywgJ3QnLCAnXycsICdkJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ3MnLCAndScsICdiJywgJ3cnLCAncycsICdhJywgJ3QnLCAnXycsICdkJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3cnLCAnYScsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3cnLCAnYScsICdwJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAndCcsICdtJywgJ3AnLCAneScsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd0JywgJ20nLCAncCcsICd5JywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd0JywgJ20nLCAncCcsICd5JywgJ2InLCAnXycsCisgICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsCisgICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAndCcsICdtJywgJ3AnLCAneScsCisgICdiJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICd0JywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsCisgICc2JywgJ18nLCAndicsICd0JywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAndCcsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsCisgICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd0JywgJ20nLCAncCcsCisgICd5JywgJ2InLCAndScsICdzJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd0JywgJ20nLCAncCcsICd5JywgJ2gnLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAndCcsICdtJywgJ3AnLCAneScsICdoJywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsCisgICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd0JywgJ20nLCAncCcsICd5JywgJ2gnLCAnYicsCisgICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd0JywgJ20nLCAncCcsCisgICd5JywgJ2gnLCAnYicsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAndScsICduJywgJ3AnLCAnYScsICdjJywgJ2snLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAndScsICduJywgJ3AnLCAnYScsICdjJywgJ2snLCAnYicsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3UnLCAnbicsICdwJywgJ2EnLCAnYycsCisgICdrJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3UnLCAnbicsICdwJywgJ2EnLCAnYycsCisgICdrJywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICd1JywgJ24nLCAncCcsICdhJywgJ2MnLCAnaycsICdvJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsCisgICd2JywgJ3UnLCAnbicsICdwJywgJ2EnLCAnYycsICdrJywgJ28nLCAnYicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3UnLCAnbicsICdwJywgJ2EnLCAnYycsICdrJywgJ28nLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsCisgICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAndScsICduJywgJ3AnLCAnYScsICdjJywgJ2snLCAnbycsCisgICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAndScsCisgICduJywgJ3AnLCAnYScsICdjJywgJ2snLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICd1JywgJ24nLCAncCcsICdhJywgJ2MnLCAnaycsICd1JywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsCisgICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd1JywgJ24nLCAncCcsICdhJywgJ2MnLCAnaycsICd1JywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsCisgICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3UnLCAnbicsICdwJywgJ2EnLCAnYycsICdrJywgJ3UnLCAnaCcsCisgICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3gnLCAnbycsCisgICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsCisgICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd4JywgJ28nLCAncicsICdfJywgJzEnLCAnMicsCisgICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3onLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAneicsICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsCisgICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAneicsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsCisgICd6JywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnWScsICcyJywgJ18nLCAnZCcsCisgICdjJywgJ2MnLCAnbCcsICdlJywgJ2EnLCAnbicsICdhJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnWScsICcyJywgJ18nLCAnZCcsCisgICdjJywgJ2MnLCAnbCcsICdlJywgJ2EnLCAnbicsICdpJywgJ24nLCAndicsICdhJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnWScsCisgICcyJywgJ18nLCAnZCcsICdjJywgJ2knLCAnbicsICd2JywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdZJywgJzInLCAnXycsCisgICdkJywgJ2MnLCAneicsICdlJywgJ3InLCAnbycsICdhJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnWScsICc0JywgJ18nLCAnbCcsCisgICcyJywgJ2YnLCAnZScsICd0JywgJ2MnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1knLCAnNScsICdfJywgJ2wnLCAnMicsCisgICdmJywgJ2UnLCAndCcsICdjJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2MnLCAnaScsICdyJywgJ2MnLCAnXycsICdsJywgJ2QnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYycsICdpJywgJ3InLCAnYycsICdfJywgJ2wnLCAnZCcsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdjJywgJ2knLCAncicsICdjJywgJ18nLCAnbCcsCisgICdkJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2MnLCAnaScsCisgICdyJywgJ2MnLCAnXycsICdsJywgJ2QnLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdjJywgJ2knLCAncicsICdjJywgJ18nLCAnbCcsICdkJywgJ3UnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYycsICdpJywgJ3InLCAnYycsICdfJywgJ2wnLCAnZCcsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdjJywgJ2knLCAncicsCisgICdjJywgJ18nLCAncycsICd0JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2MnLCAnaScsICdyJywgJ2MnLCAnXycsICdzJywgJ3QnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYycsICdpJywgJ3InLCAnYycsICdfJywgJ3MnLCAndCcsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdjJywgJ2knLCAncicsICdjJywgJ18nLCAncycsCisgICd0JywgJ2gnLCAnaCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdjJywgJ2knLCAncicsICdjJywgJ18nLCAncycsICd0JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ18nLCAnbScsICdtJywgJzInLCAnNScsICc2JywgJ2knLCAnXycsICd2JywgJ2EnLCAnZCcsCisgICdkJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsCisgICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdwJywgJ3InLCAnZScsICdmJywgJ2UnLCAndCcsICdjJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsCisgICdhJywgJ2InLCAncycsICdxJywgJ18nLCAncycsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2EnLCAnYicsICdzJywgJ3EnLCAnXycsCisgICdzJywgJ18nLCAncScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYScsICdiJywgJ3MnLCAncScsICdfJywgJ3MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAnZCcsCisgICdkJywgJ18nLCAnYScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICdkJywgJ2QnLCAnXycsICdhJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ2QnLCAnZCcsCisgICdfJywgJ2EnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAnZCcsICdkJywgJ18nLCAnYScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdhJywgJ2QnLCAnZCcsCisgICdxJywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYScsICdkJywgJ2QnLCAncScsICdfJywgJ3MnLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsCisgICdhJywgJ2QnLCAnZCcsICdxJywgJ18nLCAncycsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdhJywgJ2QnLCAnZCcsICdxJywgJ2gnLCAnXycsCisgICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsCisgICdwJywgJ3MnLCAnXycsICdhJywgJ2QnLCAnZCcsICdxJywgJ2gnLCAnXycsICdyJywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYScsCisgICdkJywgJ2QnLCAncScsICdoJywgJ18nLCAncicsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdhJywgJ2QnLCAnZCcsICdxJywgJ2gnLCAnXycsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAnXycsICdhJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ2QnLCAnZCcsICdzJywgJ18nLCAnYScsCisgICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnYScsICdkJywgJ2QnLCAncycsICdfJywgJ2EnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAnXycsCisgICdhJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdhJywgJ2QnLCAnZCcsICdzJywgJ18nLCAncycsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICdkJywgJ2QnLCAncycsCisgICdfJywgJ3MnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAnXycsICdzJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ2QnLCAnZCcsCisgICdzJywgJ18nLCAncycsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICdkJywgJ2QnLCAncycsICdfJywgJ3UnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAnZCcsCisgICdkJywgJ3MnLCAnXycsICd1JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ2QnLCAnZCcsICdzJywgJ18nLCAndScsICdfJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsCisgICdkJywgJ2QnLCAncycsICdfJywgJ3UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYScsICdkJywgJ2QnLCAncycsICdjJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYScsCisgICdkJywgJ2QnLCAndScsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2EnLCAnZCcsICdkJywgJ3UnLCAnXycsICdxJywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsCisgICdhJywgJ2QnLCAnZCcsICd1JywgJ18nLCAncycsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2EnLCAnZCcsICdkJywgJ3UnLCAnXycsCisgICdzJywgJ18nLCAncScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYScsICdkJywgJ2QnLCAndScsICdoJywgJ18nLCAncScsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYScsCisgICdkJywgJ2QnLCAndScsICdoJywgJ18nLCAncicsICdfJywgJ3EnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ2QnLCAnZCcsICd2JywgJ18nLCAnYicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdhJywgJ2QnLCAnZCcsICd2JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ2QnLCAnZCcsICd2JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ2QnLCAnZCcsCisgICd2JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdhJywgJ2QnLCAnZCcsICd2JywgJ2knLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAnZCcsICdkJywgJ3YnLCAnaScsCisgICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnYScsICdkJywgJ2QnLCAndicsICdpJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ2QnLCAnZCcsICd2JywgJ2knLCAnXycsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsCisgICdzJywgJ18nLCAnYScsICdkJywgJ2QnLCAndycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAnbicsICdkJywgJ18nLCAndicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ24nLCAnZCcsCisgICdpJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdpJywgJ3AnLCAncycsICdfJywgJ2EnLCAncCcsICdwJywgJ2UnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAncycsICd1JywgJ2InLCAnXycsCisgICdzJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdhJywgJ3MnLCAndScsICdiJywgJ18nLCAncycsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICdzJywgJ3UnLCAnYicsCisgICdfJywgJ3MnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAncycsICd1JywgJ2InLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ3MnLCAndScsCisgICdiJywgJ18nLCAndScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICdzJywgJ3UnLCAnYicsICdfJywgJ3UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAncycsCisgICd1JywgJ2InLCAnXycsICd1JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ3MnLCAndScsICdiJywgJ18nLCAndScsICdfJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsCisgICd2JywgJ2UnLCAnXycsICdzJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ3YnLCAnZScsICdfJywgJ3MnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAndicsCisgICdlJywgJ18nLCAncycsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICd2JywgJ2UnLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ3YnLCAnZScsCisgICdfJywgJ3UnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAndicsICdlJywgJ18nLCAndScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICd2JywgJ2UnLCAnXycsCisgICd1JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdhJywgJ3YnLCAnZScsICdfJywgJ3UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAndicsICdlJywgJ3InLCAnXycsCisgICdzJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdhJywgJ3YnLCAnZScsICdyJywgJ18nLCAncycsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICd2JywgJ2UnLCAncicsCisgICdfJywgJ3MnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAndicsICdlJywgJ3InLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ3YnLCAnZScsCisgICdyJywgJ18nLCAndScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICd2JywgJ2UnLCAncicsICdfJywgJ3UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAndicsCisgICdlJywgJ3InLCAnXycsICd1JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ3YnLCAnZScsICdyJywgJ18nLCAndScsICdfJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsCisgICdiJywgJ2EnLCAnbCcsICdpJywgJ2cnLCAnbicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ2MnLCAnbCcsICdyJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ2MnLCAnbCcsCisgICdyJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdiJywgJ2MnLCAnbCcsICdyJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ2MnLCAnbCcsICdyJywgJ18nLCAndycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdiJywgJ2MnLCAnbCcsICdyJywgJ2knLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnYycsICdsJywgJ3InLCAnaScsICdfJywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsCisgICdjJywgJ2wnLCAncicsICdpJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ2MnLCAnbCcsICdyJywgJ2knLCAnXycsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnaScsCisgICduJywgJ3MnLCAnbCcsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdpJywgJ24nLCAncycsICdsJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ2knLCAnbicsCisgICdzJywgJ2wnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnaScsICduJywgJ3MnLCAnbCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdpJywgJ24nLCAncycsCisgICdsJywgJ2knLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnaScsICduJywgJ3MnLCAnbCcsICdpJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ2knLCAnbicsCisgICdzJywgJ2wnLCAnaScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdpJywgJ24nLCAncycsICdsJywgJ2knLCAnXycsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnaScsCisgICduJywgJ3MnLCAncicsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdpJywgJ24nLCAncycsICdyJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ2knLCAnbicsCisgICdzJywgJ3InLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnaScsICduJywgJ3MnLCAncicsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdpJywgJ24nLCAncycsCisgICdyJywgJ2knLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnaScsICduJywgJ3MnLCAncicsICdpJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ2knLCAnbicsCisgICdzJywgJ3InLCAnaScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdpJywgJ24nLCAncycsICdyJywgJ2knLCAnXycsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYicsCisgICdpJywgJ3QnLCAncicsICdlJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdtJywgJ24nLCAneicsICdfJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdtJywgJ24nLCAneicsCisgICdpJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdiJywgJ20nLCAneicsICdfJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdtJywgJ3onLCAnaScsICdfJywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsCisgICduJywgJ2UnLCAnZycsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICduJywgJ2UnLCAnZycsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICduJywgJ2UnLCAnZycsCisgICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnYicsICduJywgJ2UnLCAnZycsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICduJywgJ2UnLCAnZycsICdpJywgJ18nLCAnYicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdiJywgJ24nLCAnZScsICdnJywgJ2knLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnbicsICdlJywgJ2cnLCAnaScsICdfJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsCisgICduJywgJ2UnLCAnZycsICdpJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ24nLCAneicsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICduJywgJ3onLCAnXycsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2InLCAnbicsICd6JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ24nLCAneicsICdfJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICduJywgJ3onLCAnXycsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsCisgICdzJywgJ18nLCAnYicsICdwJywgJ28nLCAncycsICdnJywgJ2UnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAncycsICdlJywgJ2wnLCAnXycsCisgICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2InLCAncycsICdlJywgJ2wnLCAnaScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdzJywgJ2UnLCAndCcsICdfJywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsCisgICdzJywgJ2UnLCAndCcsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdzJywgJ2UnLCAndCcsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdzJywgJ2UnLCAndCcsCisgICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnYicsICdzJywgJ2UnLCAndCcsICdpJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ3MnLCAnZScsICd0JywgJ2knLCAnXycsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2InLCAncycsICdlJywgJ3QnLCAnaScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdzJywgJ2UnLCAndCcsICdpJywgJ18nLCAndycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdiJywgJ3onLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAneicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICd6JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ3onLCAnXycsCisgICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2InLCAneicsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdlJywgJ3EnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnZScsICdxJywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdjJywgJ2UnLCAncScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdlJywgJ3EnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnZScsICdxJywgJ2knLCAnXycsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2MnLCAnZScsICdxJywgJ2knLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnZScsICdxJywgJ2knLCAnXycsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnZScsCisgICdxJywgJ2knLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnZicsICdjJywgJ20nLCAncycsICdhJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnbCcsICdlJywgJ18nLCAncycsCisgICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnYycsICdsJywgJ2UnLCAnXycsICdzJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywgJ2wnLCAnZScsICdfJywgJ3MnLCAnXycsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2MnLCAnbCcsICdlJywgJ18nLCAncycsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdsJywgJ2UnLCAnXycsICd1JywgJ18nLCAnYicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdjJywgJ2wnLCAnZScsICdfJywgJ3UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnbCcsICdlJywgJ18nLCAndScsICdfJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsCisgICdsJywgJ2UnLCAnXycsICd1JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywgJ2wnLCAnZScsICdpJywgJ18nLCAncycsICdfJywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsCisgICdsJywgJ2UnLCAnaScsICdfJywgJ3MnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnbCcsICdlJywgJ2knLCAnXycsICdzJywgJ18nLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdjJywgJ2wnLCAnZScsICdpJywgJ18nLCAncycsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdsJywgJ2UnLCAnaScsICdfJywgJ3UnLCAnXycsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2MnLCAnbCcsICdlJywgJ2knLCAnXycsICd1JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywgJ2wnLCAnZScsICdpJywgJ18nLCAndScsCisgICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnYycsICdsJywgJ2UnLCAnaScsICdfJywgJ3UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnbCcsICd0JywgJ18nLCAncycsCisgICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnYycsICdsJywgJ3QnLCAnXycsICdzJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywgJ2wnLCAndCcsICdfJywgJ3MnLCAnXycsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2MnLCAnbCcsICd0JywgJ18nLCAncycsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdsJywgJ3QnLCAnXycsICd1JywgJ18nLCAnYicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdjJywgJ2wnLCAndCcsICdfJywgJ3UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnbCcsICd0JywgJ18nLCAndScsICdfJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsCisgICdsJywgJ3QnLCAnXycsICd1JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywgJ2wnLCAndCcsICdpJywgJ18nLCAncycsICdfJywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsCisgICdsJywgJ3QnLCAnaScsICdfJywgJ3MnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnbCcsICd0JywgJ2knLCAnXycsICdzJywgJ18nLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdjJywgJ2wnLCAndCcsICdpJywgJ18nLCAncycsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdsJywgJ3QnLCAnaScsICdfJywgJ3UnLCAnXycsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2MnLCAnbCcsICd0JywgJ2knLCAnXycsICd1JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywgJ2wnLCAndCcsICdpJywgJ18nLCAndScsCisgICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnYycsICdsJywgJ3QnLCAnaScsICdfJywgJ3UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYycsICdtJywgJ3AnLCAnXycsCisgICdlJywgJ3EnLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdjJywgJ20nLCAncCcsICdfJywgJ2wnLCAnZScsICdfJywgJ3AnLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsCisgICdfJywgJ2MnLCAnbScsICdwJywgJ18nLCAnbCcsICd0JywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYycsICdtJywgJ3AnLCAnZycsCisgICdkJywgJ3UnLCAnXycsICdlJywgJ3EnLCAnXycsICdxJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdjJywgJ20nLCAncCcsICdnJywgJ2QnLCAndScsCisgICdfJywgJ2wnLCAnZScsICdfJywgJ3EnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2MnLCAnbScsICdwJywgJ2cnLCAnZCcsICd1JywgJ18nLCAnbCcsCisgICd0JywgJ18nLCAncScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYycsICdtJywgJ3AnLCAnZycsICd1JywgJ18nLCAnZScsICdxJywgJ18nLCAncScsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsCisgICdzJywgJ18nLCAnYycsICdtJywgJ3AnLCAnZycsICd1JywgJ18nLCAnbCcsICdlJywgJ18nLCAncScsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYycsCisgICdtJywgJ3AnLCAnZycsICd1JywgJ18nLCAnbCcsICd0JywgJ18nLCAncScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYycsICdtJywgJ3AnLCAndScsCisgICdfJywgJ2UnLCAncScsICdfJywgJ3EnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2MnLCAnbScsICdwJywgJ3UnLCAnXycsICdsJywgJ2UnLCAnXycsCisgICdxJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsCisgICdwJywgJ3MnLCAnXycsICdjJywgJ20nLCAncCcsICd1JywgJ18nLCAnbCcsICd0JywgJ18nLCAncScsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnbycsCisgICdwJywgJ3knLCAnXycsICdzJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywgJ28nLCAncCcsICd5JywgJ18nLCAncycsICdfJywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsCisgICdvJywgJ3AnLCAneScsICdfJywgJ3MnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnbycsICdwJywgJ3knLCAnXycsICdzJywgJ18nLCAndycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdjJywgJ28nLCAncCcsICd5JywgJ18nLCAndScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdvJywgJ3AnLCAneScsICdfJywgJ3UnLCAnXycsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2MnLCAnbycsICdwJywgJ3knLCAnXycsICd1JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywgJ28nLCAncCcsICd5JywgJ18nLCAndScsCisgICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnYycsICd0JywgJ2MnLCAnbScsICdzJywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZCcsICdpJywgJ3YnLCAnXycsICdzJywgJ18nLCAnYicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdkJywgJ2knLCAndicsICdfJywgJ3MnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2QnLCAnaScsICd2JywgJ18nLCAncycsICdfJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZCcsCisgICdpJywgJ3YnLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdkJywgJ2knLCAndicsICdfJywgJ3UnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2QnLCAnaScsCisgICd2JywgJ18nLCAndScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZCcsICdpJywgJ3YnLCAnXycsICd1JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdkJywgJ2knLCAndicsCisgICdfJywgJ3UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnZCcsICdsJywgJ3MnLCAnYScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdkJywgJ28nLCAndCcsICdwJywgJ18nLCAncycsCisgICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnZCcsICdvJywgJ3QnLCAncCcsICdfJywgJ3MnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2QnLCAnbycsICd0JywgJ3AnLCAnXycsCisgICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdkJywgJ28nLCAndCcsICdwJywgJ18nLCAndScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZCcsICdvJywgJ3QnLCAncCcsCisgICdfJywgJ3UnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2QnLCAnbycsICd0JywgJ3AnLCAnXycsICd1JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2QnLCAncCcsCisgICdhJywgJ18nLCAndycsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdkJywgJ3AnLCAnYScsICdkJywgJ2QnLCAnXycsICdzJywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdkJywgJ3AnLCAnYScsICdkJywgJ2QnLCAnXycsICdzJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdkJywgJ3AnLCAnYScsICdkJywgJ2QnLCAnXycsCisgICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdkJywgJ3AnLCAnYScsICdkJywgJ2QnLCAnXycsICd1JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdkJywgJ3AnLCAnYScsCisgICdkJywgJ2QnLCAnXycsICd1JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdkJywgJ3AnLCAnYScsICdkJywgJ2QnLCAnXycsICd1JywgJ18nLCAndycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsCisgICdfJywgJ2QnLCAncCcsICdhJywgJ3EnLCAnXycsICdzJywgJ18nLCAndycsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2QnLCAncCcsCisgICdhJywgJ3EnLCAnXycsICdzJywgJ2EnLCAnXycsICdsJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2QnLCAncCcsICdhJywgJ3EnLCAneCcsCisgICdfJywgJ3MnLCAnXycsICd3JywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnZCcsICdwJywgJ2EnLCAncScsICd4JywgJ18nLCAncycsCisgICdhJywgJ18nLCAndycsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2QnLCAncCcsICdhJywgJ3UnLCAnXycsICdoJywgJ18nLCAncScsCisgICdiJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsCisgICdwJywgJ3MnLCAnXycsICdkJywgJ3AnLCAnYScsICd1JywgJ18nLCAnaCcsICdfJywgJ3EnLCAnYicsICdyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnZCcsCisgICdwJywgJ2EnLCAneCcsICdfJywgJ3cnLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdkJywgJ3AnLCAncycsICdfJywgJ3cnLCAnXycsCisgICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsCisgICdwJywgJ3MnLCAnXycsICdkJywgJ3AnLCAncycsICdxJywgJ18nLCAncycsICdfJywgJ3cnLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsCisgICdkJywgJ3AnLCAncycsICdxJywgJ18nLCAncycsICdhJywgJ18nLCAnbCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdkJywgJ3AnLCAncycsCisgICdxJywgJ3gnLCAnXycsICdzJywgJ18nLCAndycsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2QnLCAncCcsICdzJywgJ3EnLCAneCcsCisgICdfJywgJ3MnLCAnYScsICdfJywgJ3cnLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdkJywgJ3AnLCAncycsICd1JywgJ18nLCAnaCcsCisgICdfJywgJ3EnLCAnYicsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnZCcsICdwJywgJ3MnLCAndScsICdfJywgJ2gnLCAnXycsICdxJywgJ2InLCAncicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdkJywgJ3AnLCAncycsICd1JywgJ2InLCAnXycsICdzJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdkJywgJ3AnLCAncycsICd1JywgJ2InLCAnXycsCisgICdzJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdkJywgJ3AnLCAncycsICd1JywgJ2InLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdkJywgJ3AnLCAncycsCisgICd1JywgJ2InLCAnXycsICd1JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdkJywgJ3AnLCAncycsICd1JywgJ2InLCAnXycsICd1JywgJ18nLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdkJywgJ3AnLCAncycsICd1JywgJ2InLCAnXycsICd1JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2QnLCAncCcsICdzJywgJ3gnLCAnXycsCisgICd3JywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnZScsICd4JywgJ3QnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2UnLCAneCcsICd0JywgJ3AnLCAnZCcsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsCisgICdzJywgJ18nLCAnZScsICd4JywgJ3QnLCAncicsICdfJywgJ3InLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnZScsICd4JywgJ3QnLCAncicsCisgICdfJywgJ3InLCAncycsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdlJywgJ3gnLCAndCcsICdyJywgJ18nLCAncycsICdfJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsCisgICdlJywgJ3gnLCAndCcsICdyJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2EnLCAnZCcsICdkJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2EnLCAnZCcsCisgICdkJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdmJywgJ2MnLCAnYScsICdmJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2MnLCAnYScsICdmJywgJ18nLCAndycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdmJywgJ2MnLCAnZScsICdxJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2MnLCAnZScsICdxJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2MnLCAnbCcsCisgICdhJywgJ3MnLCAncycsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdjJywgJ2wnLCAnYScsICdzJywgJ3MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnYycsCisgICdsJywgJ2UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnYycsICdsJywgJ2UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnYycsICdsJywgJ3QnLCAnXycsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2YnLCAnYycsICdsJywgJ3QnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnYycsICduJywgJ2UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnYycsCisgICduJywgJ2UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnYycsICdvJywgJ3InLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnYycsICdvJywgJ3InLCAnXycsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2YnLCAnYycsICd1JywgJ2UnLCAncScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdjJywgJ3UnLCAnZScsICdxJywgJ18nLCAndycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdmJywgJ2MnLCAndScsICdsJywgJ2UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnYycsICd1JywgJ2wnLCAnZScsICdfJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsCisgICdjJywgJ3UnLCAnbCcsICd0JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2MnLCAndScsICdsJywgJ3QnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnYycsCisgICd1JywgJ24nLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnYycsICd1JywgJ24nLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnYycsICd1JywgJ24nLCAnZScsCisgICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnZicsICdjJywgJ3UnLCAnbicsICdlJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2QnLCAnaScsICd2JywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdmJywgJ2QnLCAnaScsICd2JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2UnLCAneCcsICdkJywgJ28nLCAnXycsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnZScsCisgICd4JywgJ2QnLCAnbycsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdlJywgJ3gnLCAncCcsICcyJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2UnLCAneCcsCisgICdwJywgJzInLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnZScsICd4JywgJ3UnLCAncCcsICdsJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2UnLCAneCcsCisgICd1JywgJ3AnLCAnbCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdlJywgJ3gnLCAndScsICdwJywgJ3InLCAnXycsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnZScsCisgICd4JywgJ3UnLCAncCcsICdyJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2YnLCAnaScsICduJywgJ3QnLCAnXycsICdzJywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdmJywgJ2YnLCAnaScsICduJywgJ3QnLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2YnLCAnaScsICduJywgJ3QnLCAnXycsCisgICd1JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdmJywgJ2YnLCAnaScsICduJywgJ3QnLCAnXycsICd1JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2YnLCAncScsCisgICdsJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdmJywgJ2YnLCAncScsICdsJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2YnLCAncScsICdyJywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdmJywgJ2YnLCAncScsICdyJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2knLCAnbCcsICdsJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2knLCAnbCcsCisgICdsJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdmJywgJ2knLCAnbCcsICdsJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2knLCAnbCcsICdsJywgJ18nLCAndycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdmJywgJ2wnLCAnbycsICdnJywgJzInLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnbCcsICdvJywgJ2cnLCAnMicsICdfJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsCisgICdtJywgJ2EnLCAnZCcsICdkJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnbScsCisgICdhJywgJ3gnLCAnXycsICdhJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ20nLCAnYScsICd4JywgJ18nLCAnYScsICdfJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsCisgICdtJywgJ2EnLCAneCcsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdtJywgJ2EnLCAneCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdtJywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnbScsICdpJywgJ24nLCAnXycsICdhJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ20nLCAnaScsCisgICduJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdmJywgJ20nLCAnaScsICduJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ20nLCAncycsICd1JywgJ2InLCAnXycsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2YnLCAnbScsICdzJywgJ3UnLCAnYicsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdtJywgJ3UnLCAnbCcsICdfJywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsCisgICdtJywgJ3UnLCAnbCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdyJywgJ2MnLCAncCcsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdyJywgJ2MnLCAncCcsCisgICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnZicsICdyJywgJ2knLCAnbicsICd0JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3InLCAnaScsICduJywgJ3QnLCAnXycsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2YnLCAncicsICdzJywgJ3EnLCAncicsICd0JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3InLCAncycsICdxJywgJ3InLCAndCcsCisgICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnZicsICdzJywgJ2EnLCAnZicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdzJywgJ2EnLCAnZicsICdfJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsCisgICdzJywgJ2UnLCAncScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdzJywgJ2UnLCAncScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdzJywgJ2wnLCAnZScsCisgICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnZicsICdzJywgJ2wnLCAnZScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdzJywgJ2wnLCAndCcsICdfJywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsCisgICdzJywgJ2wnLCAndCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdzJywgJ24nLCAnZScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdzJywgJ24nLCAnZScsCisgICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnZicsICdzJywgJ28nLCAncicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdzJywgJ28nLCAncicsICdfJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsCisgICdzJywgJ3EnLCAncicsICd0JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3MnLCAncScsICdyJywgJ3QnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAncycsCisgICd1JywgJ2InLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAncycsICd1JywgJ2InLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAncycsICd1JywgJ2UnLCAncScsCisgICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnZicsICdzJywgJ3UnLCAnZScsICdxJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3MnLCAndScsICdsJywgJ2UnLCAnXycsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2YnLCAncycsICd1JywgJ2wnLCAnZScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdzJywgJ3UnLCAnbCcsICd0JywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdmJywgJ3MnLCAndScsICdsJywgJ3QnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAncycsICd1JywgJ24nLCAnXycsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAncycsCisgICd1JywgJ24nLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAncycsICd1JywgJ24nLCAnZScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdzJywgJ3UnLCAnbicsCisgICdlJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdmJywgJ3QnLCAnaScsICduJywgJ3QnLCAnXycsICdzJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3QnLCAnaScsCisgICduJywgJ3QnLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3QnLCAnaScsICduJywgJ3QnLCAnXycsICd1JywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdmJywgJ3QnLCAnaScsICduJywgJ3QnLCAnXycsICd1JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3QnLCAncScsICdfJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsCisgICd0JywgJ3EnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAndCcsICdyJywgJ3UnLCAnbicsICdjJywgJ18nLCAncycsICdfJywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsCisgICd0JywgJ3InLCAndScsICduJywgJ2MnLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3QnLCAncicsICd1JywgJ24nLCAnYycsCisgICdfJywgJ3UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAndCcsICdyJywgJ3UnLCAnbicsICdjJywgJ18nLCAndScsICdfJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnaCcsCisgICdhJywgJ2QnLCAnZCcsICdfJywgJ3MnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2gnLCAnYScsICdkJywgJ2QnLCAnXycsICdzJywgJ18nLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdoJywgJ2EnLCAnZCcsICdkJywgJ18nLCAncycsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnaCcsICdhJywgJ2QnLCAnZCcsICdfJywgJ3UnLCAnXycsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2gnLCAnYScsICdkJywgJ2QnLCAnXycsICd1JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdoJywgJ2EnLCAnZCcsICdkJywgJ18nLCAndScsCisgICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnaCcsICdzJywgJ3UnLCAnYicsICdfJywgJ3MnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2gnLCAncycsICd1JywgJ2InLCAnXycsCisgICdzJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdoJywgJ3MnLCAndScsICdiJywgJ18nLCAncycsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnaCcsICdzJywgJ3UnLCAnYicsCisgICdfJywgJ3UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2gnLCAncycsICd1JywgJ2InLCAnXycsICd1JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdoJywgJ3MnLCAndScsCisgICdiJywgJ18nLCAndScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnaScsICdsJywgJ3YnLCAnZScsICd2JywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdpJywgJ2wnLCAndicsCisgICdlJywgJ3YnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2knLCAnbCcsICd2JywgJ2UnLCAndicsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnaScsICdsJywgJ3YnLCAnZScsCisgICd2JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdpJywgJ2wnLCAndicsICdsJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdpJywgJ2wnLCAndicsICdsJywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdpJywgJ2wnLCAndicsICdsJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdpJywgJ2wnLCAndicsICdsJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdpJywgJ2wnLCAndicsCisgICdvJywgJ2QnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2knLCAnbCcsICd2JywgJ28nLCAnZCcsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnaScsICdsJywgJ3YnLCAnbycsCisgICdkJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdpJywgJ2wnLCAndicsICdvJywgJ2QnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2knLCAnbCcsICd2JywgJ3InLCAnXycsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ2knLCAnbCcsICd2JywgJ3InLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2knLCAnbCcsICd2JywgJ3InLCAnXycsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2knLCAnbCcsCisgICd2JywgJ3InLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ2knLCAnbicsICdzJywgJ2UnLCAncicsICd0JywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdpJywgJ24nLCAncycsCisgICdlJywgJ3InLCAndCcsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnaScsICduJywgJ3MnLCAnZScsICdyJywgJ3QnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2knLCAnbicsCisgICdzJywgJ2UnLCAncicsICd0JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2knLCAnbicsICdzJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnaScsICduJywgJ3MnLCAndicsCisgICdlJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdpJywgJ24nLCAncycsICd2JywgJ2UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2knLCAnbicsICdzJywgJ3YnLCAnZScsCisgICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnaScsICduJywgJ3MnLCAndicsICdlJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2wnLCAnYicsICd1JywgJ3gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbCcsCisgICdkJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdsJywgJ2QnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2wnLCAnZCcsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbCcsICdkJywgJ18nLCAndycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdsJywgJ2QnLCAnaScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbCcsICdkJywgJ2knLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2wnLCAnZCcsICdpJywgJ18nLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdsJywgJ2QnLCAnaScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdsJywgJ2gnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2wnLCAncycsICdhJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbCcsCisgICd3JywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsCisgICdwJywgJ3MnLCAnXycsICdtJywgJ2EnLCAnZCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnYScsICdkJywgJ2QnLCAnXycsICdxJywgJ18nLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdtJywgJ2EnLCAnZCcsICdkJywgJ18nLCAncScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdhJywgJ2QnLCAnZCcsICdyJywgJ18nLCAncScsCisgICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnbScsICdhJywgJ2QnLCAnZCcsICdyJywgJ18nLCAncScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdtJywgJ2EnLCAnZCcsCisgICdkJywgJ3UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnbScsICdhJywgJ2QnLCAnZCcsICd2JywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2EnLCAnZCcsICdkJywgJ3YnLCAnXycsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ20nLCAnYScsICdkJywgJ2QnLCAndicsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdhJywgJ2QnLCAnZCcsICd2JywgJ18nLCAndycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsCisgICdfJywgJ20nLCAnYScsICdxJywgJ18nLCAncycsICdfJywgJ3cnLCAnXycsICdwJywgJ2gnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ20nLCAnYScsCisgICdxJywgJ18nLCAncycsICdfJywgJ3cnLCAnXycsICdwJywgJ2gnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ20nLCAnYScsICdxJywgJ18nLCAncycsCisgICdhJywgJ18nLCAndycsICdfJywgJ3AnLCAnaCcsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbScsICdhJywgJ3EnLCAnXycsICdzJywgJ2EnLCAnXycsCisgICd3JywgJ18nLCAncCcsICdoJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdhJywgJ3gnLCAnXycsICdhJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2EnLCAneCcsCisgICdfJywgJ2EnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnYScsICd4JywgJ18nLCAnYScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdhJywgJ3gnLCAnXycsCisgICdhJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdtJywgJ2EnLCAneCcsICdfJywgJ3MnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnYScsICd4JywgJ18nLCAncycsCisgICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnbScsICdhJywgJ3gnLCAnXycsICdzJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2EnLCAneCcsICdfJywgJ3MnLCAnXycsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ20nLCAnYScsICd4JywgJ18nLCAndScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdhJywgJ3gnLCAnXycsICd1JywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdtJywgJ2EnLCAneCcsICdfJywgJ3UnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnYScsICd4JywgJ18nLCAndScsICdfJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsCisgICdhJywgJ3gnLCAnaScsICdfJywgJ3MnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnYScsICd4JywgJ2knLCAnXycsICdzJywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdtJywgJ2EnLCAneCcsICdpJywgJ18nLCAncycsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdhJywgJ3gnLCAnaScsICdfJywgJ3MnLCAnXycsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ20nLCAnYScsICd4JywgJ2knLCAnXycsICd1JywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2EnLCAneCcsICdpJywgJ18nLCAndScsCisgICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnbScsICdhJywgJ3gnLCAnaScsICdfJywgJ3UnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnYScsICd4JywgJ2knLCAnXycsCisgICd1JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdtJywgJ2knLCAnbicsICdfJywgJ2EnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnaScsICduJywgJ18nLCAnYScsCisgICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnbScsICdpJywgJ24nLCAnXycsICdhJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2knLCAnbicsICdfJywgJ2EnLCAnXycsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ20nLCAnaScsICduJywgJ18nLCAncycsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdpJywgJ24nLCAnXycsICdzJywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdtJywgJ2knLCAnbicsICdfJywgJ3MnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnaScsICduJywgJ18nLCAncycsICdfJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsCisgICdpJywgJ24nLCAnXycsICd1JywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2knLCAnbicsICdfJywgJ3UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnaScsCisgICduJywgJ18nLCAndScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdpJywgJ24nLCAnXycsICd1JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2knLCAnbicsCisgICdpJywgJ18nLCAncycsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdpJywgJ24nLCAnaScsICdfJywgJ3MnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnaScsCisgICduJywgJ2knLCAnXycsICdzJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2knLCAnbicsICdpJywgJ18nLCAncycsICdfJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsCisgICdpJywgJ24nLCAnaScsICdfJywgJ3UnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnaScsICduJywgJ2knLCAnXycsICd1JywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdtJywgJ2knLCAnbicsICdpJywgJ18nLCAndScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdpJywgJ24nLCAnaScsICdfJywgJ3UnLCAnXycsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ20nLCAnbycsICdkJywgJ18nLCAncycsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdvJywgJ2QnLCAnXycsICdzJywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdtJywgJ28nLCAnZCcsICdfJywgJ3MnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnbycsICdkJywgJ18nLCAncycsICdfJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsCisgICdvJywgJ2QnLCAnXycsICd1JywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ28nLCAnZCcsICdfJywgJ3UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnbycsCisgICdkJywgJ18nLCAndScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdvJywgJ2QnLCAnXycsICd1JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ20nLCAnbycsCisgICdkJywgJ3MnLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnbycsICd2JywgJ2UnLCAnXycsICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbScsICdzJywgJ3UnLCAnYicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdtJywgJ3MnLCAndScsICdiJywgJ18nLCAncScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdzJywgJ3UnLCAnYicsICdfJywgJ3EnLCAnXycsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ20nLCAncycsICd1JywgJ2InLCAncicsICdfJywgJ3EnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAncycsICd1JywgJ2InLCAncicsCisgICdfJywgJ3EnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbScsICdzJywgJ3UnLCAnYicsICd1JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAncycsICd1JywgJ2InLCAndicsCisgICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnbScsICdzJywgJ3UnLCAnYicsICd2JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ3MnLCAndScsICdiJywgJ3YnLCAnXycsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ20nLCAncycsICd1JywgJ2InLCAndicsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdtJywgJ3QnLCAnaCcsICdsJywgJ2knLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsCisgICdfJywgJ20nLCAndScsICdsJywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAndScsICdsJywgJ18nLCAncScsICdfJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsCisgICd1JywgJ2wnLCAnXycsICdxJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ20nLCAndScsICdsJywgJ18nLCAncycsICdfJywgJ3AnLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsCisgICdfJywgJ20nLCAndScsICdsJywgJ2UnLCAncScsICdfJywgJ3MnLCAnXycsICd3JywgJ18nLCAncCcsICdoJywgJ2wnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsCisgICdtJywgJ3UnLCAnbCcsICdlJywgJ3EnLCAnXycsICdzJywgJ18nLCAndycsICdfJywgJ3AnLCAnaCcsICdyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbScsCisgICd1JywgJ2wnLCAnZScsICd1JywgJ18nLCAncycsICdfJywgJ3AnLCAnaCcsICdfJywgJ3EnLCAnYicsICdsJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbScsCisgICd1JywgJ2wnLCAnZScsICd1JywgJ18nLCAncycsICdfJywgJ3AnLCAnaCcsICdfJywgJ3EnLCAnYicsICdyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbScsCisgICd1JywgJ2wnLCAncScsICdfJywgJ3InLCAncycsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ20nLCAndScsICdsJywgJ3EnLCAnXycsCisgICdyJywgJ3MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbScsICd1JywgJ2wnLCAncScsICdfJywgJ3MnLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsCisgICdtJywgJ3UnLCAnbCcsICdxJywgJ18nLCAncycsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICd1JywgJ2wnLCAncicsICdfJywgJ3EnLCAnXycsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ20nLCAndScsICdsJywgJ3InLCAnXycsICdxJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ20nLCAndScsICdsJywgJ3MnLCAnYScsCisgICdfJywgJ3cnLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdtJywgJ3UnLCAnbCcsICdzJywgJ2EnLCAncScsICdfJywgJ3MnLCAnXycsCisgICd3JywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbScsICd1JywgJ2wnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ20nLCAndScsICdsJywgJ3QnLCAndScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdtJywgJ3UnLCAnbCcsICd2JywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ3UnLCAnbCcsICd2JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ3UnLCAnbCcsCisgICd2JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdtJywgJ3UnLCAnbCcsICd2JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICduJywgJ2wnLCAnbycsICdjJywgJ18nLCAnYicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICduJywgJ2wnLCAnbycsICdjJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICduJywgJ2wnLCAnbycsICdjJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICduJywgJ2wnLCAnbycsCisgICdjJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICduJywgJ2wnLCAneicsICdjJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICduJywgJ2wnLCAneicsICdjJywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICduJywgJ2wnLCAneicsICdjJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICduJywgJ2wnLCAneicsICdjJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICduJywgJ28nLCAncicsCisgICdfJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAnbicsICdvJywgJ3InLCAnaScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbycsICdyJywgJ18nLCAndicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdvJywgJ3InLCAnaScsCisgICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsCisgICdwJywgJ3MnLCAnXycsICdwJywgJ2EnLCAnYycsICdrJywgJ3InLCAnbCcsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdwJywgJ2MnLCAnaycsCisgICdlJywgJ3YnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ3AnLCAnYycsICdrJywgJ2UnLCAndicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncCcsICdjJywgJ2snLCAnZScsCisgICd2JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdwJywgJ2MnLCAnaycsICdlJywgJ3YnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3AnLCAnYycsICdrJywgJ28nLCAnZCcsCisgICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAncCcsICdjJywgJ2snLCAnbycsICdkJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdwJywgJ2MnLCAnaycsICdvJywgJ2QnLCAnXycsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ3AnLCAnYycsICdrJywgJ28nLCAnZCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncCcsICdjJywgJ24nLCAndCcsICdfJywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncCcsCisgICdjJywgJ24nLCAndCcsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncCcsICdjJywgJ24nLCAndCcsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncCcsICdjJywgJ24nLCAndCcsCisgICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsCisgICdwJywgJ3MnLCAnXycsICdwJywgJ2knLCAnYycsICdrJywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAncCcsICdpJywgJ2MnLCAnaycsCisgICdfJywgJ3EnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdpJywgJ3AnLCAncycsICdfJywgJ3AnLCAncicsICdlJywgJ2MnLCAnZScsICdxJywgJ18nLCAndycsICdfJywgJ3AnLCAnaCcsCisgICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsCisgICdzJywgJ18nLCAncCcsICdyJywgJ2UnLCAnYycsICdlJywgJ3EnLCAnXycsICd3JywgJ18nLCAncCcsICdoJywgJ3InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsCisgICdwJywgJ3InLCAnZScsICdjJywgJ2UnLCAncScsICd1JywgJ18nLCAncCcsICdoJywgJ18nLCAncScsICdiJywgJ2wnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsCisgICdwJywgJ3InLCAnZScsICdjJywgJ2UnLCAncScsICd1JywgJ18nLCAncCcsICdoJywgJ18nLCAncScsICdiJywgJ2wnLCAnYScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsCisgICdfJywgJ3AnLCAncicsICdlJywgJ2MnLCAnZScsICdxJywgJ3UnLCAnXycsICdwJywgJ2gnLCAnXycsICdxJywgJ2InLCAncicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsCisgICdfJywgJ3AnLCAncicsICdlJywgJ2MnLCAnZScsICdxJywgJ3UnLCAnXycsICdwJywgJ2gnLCAnXycsICdxJywgJ2InLCAncicsCisgICdhJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsCisgICdzJywgJ18nLCAncCcsICdyJywgJ2UnLCAnYycsICdlJywgJ3UnLCAnXycsICdwJywgJ2gnLCAnXycsICdxJywgJ2InLCAnbCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsCisgICdfJywgJ3AnLCAncicsICdlJywgJ2MnLCAnZScsICd1JywgJ18nLCAncCcsICdoJywgJ18nLCAncScsICdiJywgJ2wnLCAnYScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsCisgICdfJywgJ3AnLCAncicsICdlJywgJ2MnLCAnZScsICd1JywgJ18nLCAncCcsICdoJywgJ18nLCAncScsICdiJywgJ3InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsCisgICdwJywgJ3InLCAnZScsICdjJywgJ2UnLCAndScsICdfJywgJ3AnLCAnaCcsICdfJywgJ3EnLCAnYicsICdyJywgJ2EnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsCisgICdwJywgJ3InLCAnZScsICdjJywgJ3InLCAnXycsICdxJywgJ2InLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdwJywgJ3InLCAnZScsCisgICdjJywgJ3InLCAnXycsICdzJywgJ3InLCAnYScsICdfJywgJ3AnLCAnaCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdwJywgJ3InLCAnZScsCisgICdjJywgJ3InLCAnXycsICdzJywgJ3InLCAnYScsICdfJywgJ3InLCAnXycsICdwJywgJ2gnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAncCcsCisgICdyJywgJ2UnLCAnYycsICdyJywgJ3EnLCAnXycsICdwJywgJ2gnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAncCcsICdyJywgJ2UnLCAnYycsCisgICdyJywgJ3EnLCAnXycsICdxJywgJ2InLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdwJywgJ3InLCAnZScsICdjJywgJ3InLCAncScsCisgICdfJywgJ3InLCAncycsICdfJywgJ3AnLCAnaCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdwJywgJ3InLCAnZScsICdjJywgJ3InLCAncScsCisgICd1JywgJ18nLCAncycsICdfJywgJ3EnLCAnYicsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3AnLCAncicsICdlJywgJ3AnLCAnZScsCisgICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsCisgICdwJywgJ3MnLCAnXycsICdyJywgJ2EnLCAnZCcsICdkJywgJ3UnLCAnXycsICd3JywgJ18nLCAncScsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAncicsCisgICdkJywgJ2QnLCAncycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAncicsICdlJywgJ3AnLCAnbCcsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3InLCAnZScsCisgICdwJywgJ2wnLCAnXycsICdxJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdzJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ2EnLCAndCcsCisgICdfJywgJ3MnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAncycsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsCisgICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ3UnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAndScsCisgICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICd1JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ3UnLCAnXycsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ3MnLCAnaCcsICdmJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ2gnLCAnZicsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdoJywgJ2YnLCAnXycsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsCisgICdzJywgJ18nLCAncycsICdoJywgJ2knLCAnbCcsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAncycsICdoJywgJ2wnLCAnbCcsICdfJywgJ3AnLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsCisgICdfJywgJ3MnLCAnaCcsICdsJywgJ2wnLCAnXycsICdxJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdzJywgJ2gnLCAnbCcsICdsJywgJ18nLCAncycsCisgICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdpJywgJ3AnLCAncycsICdfJywgJ3MnLCAnaCcsICdsJywgJ2wnLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3MnLCAnaCcsCisgICdyJywgJ2EnLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdzJywgJ2gnLCAncicsICdhJywgJ18nLCAncScsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAncycsCisgICdoJywgJ3InLCAnYScsICdfJywgJ3InLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdzJywgJ2gnLCAncicsICdhJywgJ18nLCAncicsCisgICdfJywgJ3EnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdpJywgJ3AnLCAncycsICdfJywgJ3MnLCAnaCcsICdyJywgJ2EnLCAnXycsICdyJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3MnLCAnaCcsCisgICdyJywgJ2wnLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdzJywgJ2gnLCAncicsICdsJywgJ18nLCAncScsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAnbCcsCisgICdkJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdzJywgJ2wnLCAnZCcsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdsJywgJ2QnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAnbCcsCisgICdkJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdzJywgJ2wnLCAnZCcsICdpJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ2wnLCAnZCcsICdpJywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdzJywgJ2wnLCAnZCcsICdpJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ2wnLCAnZCcsICdpJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ2wnLCAnbCcsCisgICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAncycsICdsJywgJ2wnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAnbCcsICdsJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ2wnLCAnbCcsCisgICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAncycsICdsJywgJ2wnLCAnaScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdsJywgJ2wnLCAnaScsICdfJywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsCisgICdsJywgJ2wnLCAnaScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdsJywgJ2wnLCAnaScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdwJywgJ2wnLCAnYScsCisgICd0JywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdzJywgJ3AnLCAnbCcsICdhJywgJ3QnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncCcsICdsJywgJ2EnLCAndCcsCisgICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAncycsICdwJywgJ2wnLCAnYScsICd0JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ3AnLCAnbCcsICdhJywgJ3QnLCAnaScsCisgICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAncycsICdwJywgJ2wnLCAnYScsICd0JywgJ2knLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncCcsICdsJywgJ2EnLCAndCcsCisgICdpJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdzJywgJ3AnLCAnbCcsICdhJywgJ3QnLCAnaScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywgJ2EnLCAnXycsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ3MnLCAncicsICdhJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ3InLCAnYScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywgJ2EnLCAnXycsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ3MnLCAncicsICdhJywgJ2knLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsICdhJywgJ2knLCAnXycsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsCisgICdhJywgJ2knLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsICdhJywgJ2knLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsICdhJywgJ3InLCAnXycsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ3MnLCAncicsICdhJywgJ3InLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsICdhJywgJ3InLCAnXycsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsCisgICdhJywgJ3InLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsICdhJywgJ3InLCAnaScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywgJ2EnLCAncicsCisgICdpJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdzJywgJ3InLCAnYScsICdyJywgJ2knLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsICdhJywgJ3InLCAnaScsCisgICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAncycsICdyJywgJ2wnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsICdsJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ3InLCAnbCcsCisgICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAncycsICdyJywgJ2wnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsICdsJywgJ2knLCAnXycsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsCisgICdsJywgJ2knLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsICdsJywgJ2knLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsICdsJywgJ2knLCAnXycsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ3MnLCAncicsICdsJywgJ3InLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsICdsJywgJ3InLCAnXycsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsCisgICdsJywgJ3InLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsICdsJywgJ3InLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsICdsJywgJ3InLCAnaScsCisgICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAncycsICdyJywgJ2wnLCAncicsICdpJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ3InLCAnbCcsICdyJywgJ2knLCAnXycsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ3MnLCAncicsICdsJywgJ3InLCAnaScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICd0JywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ3QnLCAnXycsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ3MnLCAndCcsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICd0JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3MnLCAndScsICdiJywgJ3EnLCAnXycsCisgICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsCisgICdwJywgJ3MnLCAnXycsICdzJywgJ3UnLCAnYicsICdxJywgJ18nLCAncycsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3MnLCAndScsCisgICdiJywgJ3EnLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3MnLCAndScsICdiJywgJ3EnLCAnaCcsICdfJywgJ3AnLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsCisgICdfJywgJ3MnLCAndScsICdiJywgJ3EnLCAnaCcsICdfJywgJ3InLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdzJywgJ3UnLCAnYicsCisgICdxJywgJ2gnLCAnXycsICdyJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3MnLCAndScsICdiJywgJ3EnLCAnaCcsICdfJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsCisgICd1JywgJ2InLCAncycsICdfJywgJ3MnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAndScsICdiJywgJ3MnLCAnXycsICdzJywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsCisgICdzJywgJ3UnLCAnYicsICdzJywgJ18nLCAncycsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICd1JywgJ2InLCAncycsICdfJywgJ3MnLCAnXycsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ3MnLCAndScsICdiJywgJ3MnLCAnXycsICd1JywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ3UnLCAnYicsICdzJywgJ18nLCAndScsCisgICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAncycsICd1JywgJ2InLCAncycsICdfJywgJ3UnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAndScsICdiJywgJ3MnLCAnXycsCisgICd1JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdzJywgJ3UnLCAnYicsICdzJywgJ3UnLCAncycsICdfJywgJ3UnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAndScsCisgICdiJywgJ3MnLCAndScsICdzJywgJ18nLCAndScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICd1JywgJ2InLCAncycsICd1JywgJ3MnLCAnXycsCisgICd1JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdzJywgJ3UnLCAnYicsICdzJywgJ3UnLCAncycsICdfJywgJ3UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAndScsCisgICdiJywgJ3MnLCAndScsICd1JywgJ18nLCAncycsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICd1JywgJ2InLCAncycsICd1JywgJ3UnLCAnXycsCisgICdzJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsCisgICdzJywgJ2EnLCAnXycsICdzJywgJ3UnLCAnYicsICdzJywgJ3UnLCAndScsICdfJywgJ3MnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAndScsCisgICdiJywgJ3MnLCAndScsICd1JywgJ18nLCAncycsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdzJywgJ3UnLCAnYicsICd1JywgJ18nLCAncCcsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsCisgICdzJywgJ18nLCAncycsICd1JywgJ2InLCAndScsICdfJywgJ3EnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3MnLCAndScsICdiJywgJ3UnLCAnXycsCisgICdzJywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAncycsICd1JywgJ2InLCAndScsICdfJywgJ3MnLCAnXycsICdxJywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsCisgICdzJywgJ3UnLCAnYicsICd1JywgJ2gnLCAnXycsICdxJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdzJywgJ3UnLCAnYicsICd1JywgJ2gnLCAnXycsCisgICdyJywgJ18nLCAncScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAndScsICdiJywgJ3YnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAndScsICdiJywgJ3YnLCAnXycsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ3MnLCAndScsICdiJywgJ3YnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAndScsICdiJywgJ3YnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAndScsCisgICdiJywgJ3YnLCAnaScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICd1JywgJ2InLCAndicsICdpJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ3UnLCAnYicsCisgICd2JywgJ2knLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAndScsICdiJywgJ3YnLCAnaScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAndicsICdzJywgJ2gnLCAnZicsCisgICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsCisgICdhJywgJ18nLCAndicsICdzJywgJ2gnLCAnZicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAndicsICdzJywgJ2gnLCAnZicsICdfJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAndicsCisgICdzJywgJ2gnLCAnZicsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICd3JywgJ3InLCAnZCcsICdzJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAneCcsICdvJywgJ3InLCAnXycsCisgICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsCisgICdfJywgJ3gnLCAnbycsICdyJywgJ2knLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdhJywgJ2QnLCAnZCcsICdfJywgJ3InLCAnbScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ2EnLCAnZCcsICdkJywgJ18nLCAncicsICdtJywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAnYScsICdkJywgJ2QnLCAnXycsICdyJywgJ20nLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2EnLCAnZCcsICdkJywgJ18nLCAncicsICduJywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnYScsICdkJywgJ2QnLCAnXycsICdyJywgJ24nLCAnXycsCisgICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdhJywgJ2QnLCAnZCcsICdfJywgJ3InLCAnbicsCisgICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnYScsCisgICdkJywgJ2QnLCAnXycsICdyJywgJ3AnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdhJywgJ2QnLCAnZCcsICdfJywgJ3InLCAncCcsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ2EnLCAnZCcsICdkJywgJ18nLCAncicsICdwJywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdhJywgJ2QnLCAnZCcsICdfJywgJ3InLCAneicsICdfJywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2EnLCAnZCcsICdkJywgJ18nLCAncicsICd6JywgJ18nLCAnZicsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnYScsICdkJywgJ2QnLCAnXycsICdyJywgJ3onLCAnXycsCisgICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2InLCAnYScsCisgICdyJywgJ18nLCAncycsICd5JywgJ24nLCAnYycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnYicsCisgICdhJywgJ3InLCAnXycsICd3JywgJ2EnLCAncicsICdwJywgJ18nLCAncycsICd5JywgJ24nLCAnYycsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnYicsICdhJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ2InLCAnYScsICdyJywgJ18nLCAnbicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnYicsCisgICdhJywgJ3InLCAncicsICdpJywgJ2UnLCAncicsICdfJywgJ3MnLCAneScsICduJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ2InLCAnYScsICdyJywgJ3InLCAnaScsICdlJywgJ3InLCAnXycsICdzJywgJ3knLCAnbicsCisgICdjJywgJ18nLCAnYycsICduJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAncycsICd5JywgJ24nLCAnYycsICd0JywgJ2gnLCAncicsCisgICdlJywgJ2EnLCAnZCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdiJywgJ2EnLCAncicsCisgICcwJywgJ18nLCAnYScsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2InLCAnYScsCisgICdyJywgJzAnLCAnXycsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2InLCAnYScsCisgICdyJywgJzAnLCAnXycsICdwJywgJ28nLCAncCcsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdiJywgJ2knLCAndCcsICdjJywgJ2EnLCAncycsICd0JywgJ18nLCAnZCcsICcyJywgJ2wnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnYicsICdpJywgJ3QnLCAnYycsICdhJywgJ3MnLCAndCcsICdfJywgJ2YnLCAnMicsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdiJywgJ2knLCAndCcsICdjJywgJ2EnLCAncycsCisgICd0JywgJ18nLCAnaScsICcyJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2InLCAnaScsCisgICd0JywgJ2MnLCAnYScsICdzJywgJ3QnLCAnXycsICdsJywgJ2wnLCAnMicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdjJywgJ2UnLCAnaScsICdsJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAnYycsICdlJywgJ2knLCAnbCcsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ2MnLCAnZScsICdpJywgJ2wnLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ2MnLCAnbycsICdzJywgJ18nLCAnYScsICdwJywgJ3AnLCAncicsICdvJywgJ3gnLCAnXycsCisgICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdjJywgJ28nLCAncycsICdfJywgJ2EnLCAncCcsCisgICdwJywgJ3InLCAnbycsICd4JywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdkJywgJzInLCAnZicsICdfJywgJ3InLCAnbScsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAnZCcsICcyJywgJ2YnLCAnXycsICdyJywgJ20nLCAnXycsICdmJywgJ3QnLCAneicsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ2YnLCAnXycsICdyJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ2QnLCAnMicsICdmJywgJ18nLCAncicsICduJywgJ18nLCAnZicsICd0JywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2QnLCAnMicsICdmJywgJ18nLCAncicsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAnZicsICdfJywgJ3InLCAncCcsICdfJywgJ2YnLCAndCcsCisgICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAnZicsICdfJywgJ3InLCAneicsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ2YnLCAnXycsICdyJywgJ3onLCAnXycsCisgICdmJywgJ3QnLCAneicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ2knLCAnXycsCisgICdoJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2QnLCAnMicsICdpJywgJ18nLCAnbCcsCisgICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAnaScsICdfJywgJ3InLCAnbScsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ2knLCAnXycsICdyJywgJ24nLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2QnLCAnMicsICdpJywgJ18nLCAncicsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAnaScsICdfJywgJ3InLCAneicsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ2wnLCAnbCcsICdfJywgJ3InLCAnbScsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ2wnLCAnbCcsICdfJywgJ3InLCAnbicsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ2wnLCAnbCcsICdfJywgJ3InLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ2wnLCAnbCcsICdfJywgJ3InLCAneicsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ3UnLCAnaScsICdfJywgJ3InLCAnbScsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ3UnLCAnaScsICdfJywgJ3InLCAnbicsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ3UnLCAnaScsICdfJywgJ3InLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ3UnLCAnaScsICdfJywgJ3InLCAneicsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ3UnLCAnbCcsICdsJywgJ18nLCAncicsICdtJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAndScsICdsJywgJ2wnLCAnXycsICdyJywgJ24nLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2QnLCAnMicsICd1JywgJ2wnLCAnbCcsICdfJywgJ3InLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ3UnLCAnbCcsICdsJywgJ18nLCAncicsCisgICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJ2knLCAndicsICdfJywgJ2EnLCAncCcsCisgICdwJywgJ3InLCAnbycsICd4JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsCisgICdpJywgJ3YnLCAnXycsICdhJywgJ3AnLCAncCcsICdyJywgJ28nLCAneCcsICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICdpJywgJ3YnLCAnXycsICdyJywgJ20nLCAnXycsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJ2knLCAndicsICdfJywgJ3InLCAnbScsCisgICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2QnLCAnaScsICd2JywgJ18nLCAncicsCisgICdtJywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdkJywgJ2knLCAndicsICdfJywgJ3InLCAnbicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ2QnLCAnaScsICd2JywgJ18nLCAncicsICduJywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAnZCcsICdpJywgJ3YnLCAnXycsICdyJywgJ24nLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2QnLCAnaScsICd2JywgJ18nLCAncicsICdwJywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICdpJywgJ3YnLCAnXycsICdyJywgJ3AnLCAnXycsCisgICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJ2knLCAndicsICdfJywgJ3InLCAncCcsCisgICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsCisgICdpJywgJ3YnLCAnXycsICdyJywgJ3onLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdkJywgJ2knLCAndicsICdfJywgJ3InLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ2QnLCAnaScsICd2JywgJ18nLCAncicsICd6JywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdlJywgJ3gnLCAnMicsICdfJywgJ2EnLCAncCcsICdwJywgJ3InLCAnbycsCisgICd4JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZScsICd4JywgJzInLCAnXycsCisgICdhJywgJ3AnLCAncCcsICdyJywgJ28nLCAneCcsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ2UnLCAneCcsICcyJywgJ18nLCAnYScsICdwJywgJ3AnLCAncicsICdvJywgJ3gnLCAnXycsICdmJywgJ3QnLCAneicsCisgICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsICdoJywgJ18nLCAncicsCisgICduJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJzInLCAnaCcsICdfJywgJ3InLCAnbicsCisgICdfJywgJ2YnLCAndCcsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJzInLCAnaScsCisgICdfJywgJ3InLCAnbScsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICcyJywgJ2knLCAnXycsCisgICdyJywgJ20nLCAnXycsICdmJywgJ3QnLCAneicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsCisgICcyJywgJ2knLCAnXycsICdyJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsCisgICdpJywgJ18nLCAncicsICduJywgJ18nLCAnZicsICd0JywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ2YnLCAnMicsICdpJywgJ18nLCAncicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdmJywgJzInLCAnaScsICdfJywgJ3InLCAncCcsICdfJywgJ2YnLCAndCcsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdmJywgJzInLCAnaScsICdfJywgJ3InLCAneicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAnZicsICcyJywgJ2knLCAnXycsICdyJywgJ3onLCAnXycsICdmJywgJ3QnLCAneicsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICcyJywgJ2wnLCAnbCcsICdfJywgJ3InLCAnbScsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICcyJywgJ2wnLCAnbCcsICdfJywgJ3InLCAnbScsICdfJywgJ2YnLCAndCcsCisgICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJzInLCAnbCcsICdsJywgJ18nLCAncicsCisgICduJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJzInLCAnbCcsICdsJywgJ18nLCAncicsCisgICduJywgJ18nLCAnZicsICd0JywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsCisgICdsJywgJ2wnLCAnXycsICdyJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsCisgICdsJywgJ2wnLCAnXycsICdyJywgJ3AnLCAnXycsICdmJywgJ3QnLCAneicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAnZicsICcyJywgJ2wnLCAnbCcsICdfJywgJ3InLCAneicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAnZicsICcyJywgJ2wnLCAnbCcsICdfJywgJ3InLCAneicsICdfJywgJ2YnLCAndCcsICd6JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJzInLCAndScsICdpJywgJ18nLCAncicsICdtJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJzInLCAndScsICdpJywgJ18nLCAncicsICdtJywgJ18nLCAnZicsCisgICd0JywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsICd1JywgJ2knLCAnXycsCisgICdyJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsICd1JywgJ2knLCAnXycsCisgICdyJywgJ24nLCAnXycsICdmJywgJ3QnLCAneicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsCisgICcyJywgJ3UnLCAnaScsICdfJywgJ3InLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsCisgICcyJywgJ3UnLCAnaScsICdfJywgJ3InLCAncCcsICdfJywgJ2YnLCAndCcsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdmJywgJzInLCAndScsICdpJywgJ18nLCAncicsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdmJywgJzInLCAndScsICdpJywgJ18nLCAncicsICd6JywgJ18nLCAnZicsICd0JywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsICd1JywgJ2wnLCAnbCcsICdfJywgJ3InLCAnbScsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICcyJywgJ3UnLCAnbCcsICdsJywgJ18nLCAncicsCisgICdtJywgJ18nLCAnZicsICd0JywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsCisgICd1JywgJ2wnLCAnbCcsICdfJywgJ3InLCAnbicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsCisgICcyJywgJ3UnLCAnbCcsICdsJywgJ18nLCAncicsICduJywgJ18nLCAnZicsICd0JywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsICd1JywgJ2wnLCAnbCcsICdfJywgJ3InLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICcyJywgJ3UnLCAnbCcsICdsJywgJ18nLCAncicsICdwJywgJ18nLCAnZicsCisgICd0JywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsICd1JywgJ2wnLCAnbCcsCisgICdfJywgJ3InLCAneicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICcyJywgJ3UnLCAnbCcsCisgICdsJywgJ18nLCAncicsICd6JywgJ18nLCAnZicsICd0JywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ2YnLCAnYScsICdiJywgJ3MnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdmJywgJ2EnLCAnYicsICdzJywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsCisgICdhJywgJ2InLCAncycsICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAnZicsICdsJywgJ28nLCAnbycsICdyJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAnZicsICdsJywgJ28nLCAnbycsICdyJywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAnZicsICdsJywgJ28nLCAnbycsICdyJywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJ20nLCAnYScsICdfJywgJ3InLCAnbScsICdfJywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnbScsICdhJywgJ18nLCAncicsICdtJywgJ18nLCAnZicsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICdtJywgJ2EnLCAnXycsICdyJywgJ20nLCAnXycsCisgICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnbScsCisgICdhJywgJ18nLCAncicsICduJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsCisgICdtJywgJ2EnLCAnXycsICdyJywgJ24nLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdmJywgJ20nLCAnYScsICdfJywgJ3InLCAnbicsICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICdtJywgJ2EnLCAnXycsICdyJywgJ3AnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJ20nLCAnYScsICdfJywgJ3InLCAncCcsICdfJywgJ2YnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnbScsICdhJywgJ18nLCAncicsICdwJywgJ18nLCAnZicsCisgICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJ20nLCAnYScsCisgICdfJywgJ3InLCAneicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnbScsCisgICdhJywgJ18nLCAncicsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsCisgICdtJywgJ2EnLCAnXycsICdyJywgJ3onLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnbScsICdhJywgJ3gnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdmJywgJ20nLCAnYScsICd4JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAnZicsICdtJywgJ2EnLCAneCcsICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICdtJywgJ2knLCAnbicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnbScsICdpJywgJ24nLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdmJywgJ20nLCAnaScsICduJywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJ24nLCAncycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAnaScsICcyJywgJ2QnLCAnXycsICdyJywgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ2knLCAnMicsICdkJywgJ18nLCAncicsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdpJywgJzInLCAnZCcsICdfJywgJ3InLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnaScsCisgICcyJywgJ2QnLCAnXycsICdyJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2knLCAnMicsCisgICdmJywgJ18nLCAncicsICdtJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdpJywgJzInLCAnZicsCisgICdfJywgJ3InLCAnbicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnaScsICcyJywgJ2YnLCAnXycsCisgICdyJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2knLCAnMicsICdmJywgJ18nLCAncicsCisgICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdpJywgJ3MnLCAncycsICdwJywgJ2EnLCAnYycsCisgICdlJywgJ3AnLCAnXycsICdjJywgJ28nLCAnbicsICdzJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ2knLCAncycsICdzJywgJ3AnLCAnYScsICdjJywgJ2UnLCAncCcsICdfJywgJ2cnLCAnbCcsICdvJywgJ2InLCAnYScsCisgICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdpJywgJ3MnLCAncycsICdwJywgJ2EnLCAnYycsCisgICdlJywgJ3AnLCAnXycsICdsJywgJ28nLCAnYycsICdhJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ2knLCAncycsICdzJywgJ3AnLCAnYScsICdjJywgJ2UnLCAncCcsICdfJywgJ3MnLCAnaCcsICdhJywgJ3InLCAnZScsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdpJywgJ3MnLCAndCcsICd5JywgJ3AnLCAnZScsCisgICdwJywgJ18nLCAncycsICdhJywgJ20nLCAncCcsICdsJywgJ2UnLCAncicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAnaScsICdzJywgJ3QnLCAneScsICdwJywgJ2UnLCAncCcsICdfJywgJ3MnLCAndScsICdyJywgJ2YnLCAnYScsCisgICdjJywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2knLCAncycsICd0JywgJ3knLCAncCcsCisgICdlJywgJ3AnLCAnXycsICd0JywgJ2UnLCAneCcsICd0JywgJ3UnLCAncicsICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdsJywgJ2cnLCAnMicsICdfJywgJ2EnLCAncCcsICdwJywgJ3InLCAnbycsICd4JywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbCcsICdnJywgJzInLCAnXycsICdhJywgJ3AnLCAncCcsCisgICdyJywgJ28nLCAneCcsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2wnLCAnZycsCisgICcyJywgJ18nLCAnYScsICdwJywgJ3AnLCAncicsICdvJywgJ3gnLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2wnLCAnbCcsICcyJywgJ2QnLCAnXycsICdyJywgJ20nLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2wnLCAnbCcsICcyJywgJ2QnLCAnXycsICdyJywgJ24nLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2wnLCAnbCcsICcyJywgJ2QnLCAnXycsICdyJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2wnLCAnbCcsICcyJywgJ2QnLCAnXycsICdyJywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2wnLCAnbCcsICcyJywgJ2YnLCAnXycsICdyJywgJ20nLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2wnLCAnbCcsICcyJywgJ2YnLCAnXycsICdyJywgJ24nLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2wnLCAnbCcsICcyJywgJ2YnLCAnXycsICdyJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2wnLCAnbCcsICcyJywgJ2YnLCAnXycsICdyJywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2wnLCAnbycsICdoJywgJ2knLCAnXycsICdpJywgJzInLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbScsICdhJywgJ3QnLCAnYycsICdoJywgJ18nLCAnYScsCisgICduJywgJ3knLCAnXycsICdzJywgJ3knLCAnbicsICdjJywgJ18nLCAnaScsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ20nLCAnYScsICd0JywgJ2MnLCAnaCcsICdfJywgJ2EnLCAnbicsICd5JywgJ18nLCAncycsCisgICd5JywgJ24nLCAnYycsICdfJywgJ2knLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdtJywgJ2UnLCAnbScsICdiJywgJ2EnLCAncicsICdfJywgJ2MnLCAndCcsICdhJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdtJywgJ2UnLCAnbScsICdiJywgJ2EnLCAncicsICdfJywgJ2cnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbScsICdlJywgJ20nLCAnYicsICdhJywgJ3InLCAnXycsICdzJywgJ3knLCAncycsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbScsICd1JywgJ2wnLCAnXycsICdyJywgJ20nLCAnXycsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdtJywgJ3UnLCAnbCcsICdfJywgJ3InLCAnbScsCisgICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ20nLCAndScsICdsJywgJ18nLCAncicsCisgICdtJywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdtJywgJ3UnLCAnbCcsICdfJywgJ3InLCAnbicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ20nLCAndScsICdsJywgJ18nLCAncicsICduJywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAnbScsICd1JywgJ2wnLCAnXycsICdyJywgJ24nLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ20nLCAndScsICdsJywgJ18nLCAncicsICdwJywgJ18nLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbScsICd1JywgJ2wnLCAnXycsICdyJywgJ3AnLCAnXycsCisgICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdtJywgJ3UnLCAnbCcsICdfJywgJ3InLCAncCcsCisgICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbScsCisgICd1JywgJ2wnLCAnXycsICdyJywgJ3onLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdtJywgJ3UnLCAnbCcsICdfJywgJ3InLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ20nLCAndScsICdsJywgJ18nLCAncicsICd6JywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdtJywgJ3UnLCAnbCcsICcyJywgJzQnLCAnXycsICdpJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdtJywgJ3UnLCAnbCcsICcyJywgJzQnLCAnXycsICd1JywgJ2knLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ20nLCAndScsICdsJywgJ2gnLCAnaScsICdfJywgJ2knLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ20nLCAndScsICdsJywgJ2gnLCAnaScsICdfJywgJ2wnLCAnbCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbScsICd1JywgJ2wnLCAnaCcsICdpJywgJ18nLCAndScsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdtJywgJ3UnLCAnbCcsICdoJywgJ2knLCAnXycsCisgICd1JywgJ2wnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncCcsICdyJywgJ20nLCAndCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdjJywgJ3AnLCAnXycsICdhJywgJ3AnLCAncCcsCisgICdyJywgJ28nLCAneCcsICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncicsICdjJywgJ3AnLCAnXycsICdyJywgJ20nLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdyJywgJ2MnLCAncCcsICdfJywgJ3InLCAnbScsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnYycsICdwJywgJ18nLCAncicsICdtJywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsCisgICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2MnLCAncCcsICdfJywgJ3InLCAnbicsCisgICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnYycsICdwJywgJ18nLCAncicsCisgICduJywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdjJywgJ3AnLCAnXycsCisgICdyJywgJ24nLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3InLCAnYycsICdwJywgJ18nLCAncicsICdwJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncicsICdjJywgJ3AnLCAnXycsICdyJywgJ3AnLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdyJywgJ2MnLCAncCcsICdfJywgJ3InLCAncCcsICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdjJywgJ3AnLCAnXycsICdyJywgJ3onLCAnXycsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2MnLCAncCcsICdfJywgJ3InLCAneicsCisgICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnYycsICdwJywgJ18nLCAncicsCisgICd6JywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnYycsCisgICdsJywgJ28nLCAnYycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsCisgICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnYycsICdsJywgJ28nLCAnYycsCisgICdrJywgJzYnLCAnNCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsCisgICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ2MnLCAndCcsICdhJywgJ2knLCAnZCcsCisgICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsCisgICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsICdlJywgJ2cnLCAnXycsICdjJywgJ3QnLCAnYScsICdpJywgJ2QnLCAnXycsCisgICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsCisgICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnYycsICd0JywgJ2EnLCAnaScsICdkJywgJ18nLCAneScsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsCisgICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ2MnLCAndCcsICdhJywgJ2knLCAnZCcsICdfJywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsCisgICdfJywgJ3MnLCAncicsICdlJywgJ2cnLCAnXycsICdlJywgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICcwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsCisgICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnZScsICduJywgJ3YnLCAncicsICdlJywgJ2cnLCAnMScsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsCisgICdyJywgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzEnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsCisgICdyJywgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzEnLCAnMScsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsCisgICdyJywgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsCisgICdyJywgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzEnLCAnMycsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsCisgICdyJywgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzEnLCAnNCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsCisgICdyJywgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzEnLCAnNScsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsCisgICdyJywgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzEnLCAnNicsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsCisgICdyJywgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzEnLCAnNycsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsCisgICdyJywgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzEnLCAnOCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsCisgICdyJywgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzEnLCAnOScsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsCisgICdyJywgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsCisgICdlJywgJ2cnLCAnXycsICdlJywgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICcyJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsCisgICdlJywgJ2cnLCAnXycsICdlJywgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICcyJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsCisgICdlJywgJ2cnLCAnXycsICdlJywgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICcyJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsCisgICdlJywgJ2cnLCAnXycsICdlJywgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICcyJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsCisgICdlJywgJ2cnLCAnXycsICdlJywgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICcyJywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsCisgICdlJywgJ2cnLCAnXycsICdlJywgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICcyJywgJzUnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsCisgICdlJywgJ2cnLCAnXycsICdlJywgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICcyJywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsCisgICdlJywgJ2cnLCAnXycsICdlJywgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICcyJywgJzcnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsCisgICdlJywgJ2cnLCAnXycsICdlJywgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsCisgICdlJywgJ2cnLCAnXycsICdlJywgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICcyJywgJzknLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsCisgICdlJywgJ2cnLCAnXycsICdlJywgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICczJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsCisgICdnJywgJ18nLCAnZScsICduJywgJ3YnLCAncicsICdlJywgJ2cnLCAnMycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsCisgICdnJywgJ18nLCAnZScsICduJywgJ3YnLCAncicsICdlJywgJ2cnLCAnMycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsCisgICdnJywgJ18nLCAnZScsICduJywgJ3YnLCAncicsICdlJywgJ2cnLCAnNCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsCisgICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzUnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsICdlJywgJ2cnLCAnXycsCisgICdlJywgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnZScsCisgICduJywgJ3YnLCAncicsICdlJywgJ2cnLCAnNycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsCisgICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsCisgICd2JywgJ3InLCAnZScsICdnJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsCisgICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsICdlJywgJ2cnLCAnXycsICdlJywgJ24nLCAndicsCisgICdyJywgJ2UnLCAnZycsICc5JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsCisgICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnZycsICdyJywgJ2knLCAnZCcsCisgICdpJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsCisgICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsICdlJywgJ2cnLCAnXycsICdsJywgJ2EnLCAnbicsICdlJywgJ2knLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsCisgICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ2wnLCAnYScsICduJywgJ2UnLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdfJywgJ2UnLCAncScsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsCisgICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ2wnLCAnYScsICduJywgJ2UnLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdfJywgJ2cnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsCisgICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ2wnLCAnYScsCisgICduJywgJ2UnLCAnbScsICdhJywgJ3MnLCAnaycsICdfJywgJ2cnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsCisgICdfJywgJ2wnLCAnYScsICduJywgJ2UnLCAnbScsICdhJywgJ3MnLCAnaycsICdfJywgJ2wnLCAnZScsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsCisgICdyJywgJ2UnLCAnZycsICdfJywgJ2wnLCAnYScsICduJywgJ2UnLCAnbScsICdhJywgJ3MnLCAnaycsICdfJywgJ2wnLCAndCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsCisgICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ24nLCAnYycsICd0JywgJ2EnLCAnaScsICdkJywgJ18nLCAndycsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsCisgICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ24nLCAnYycsICd0JywgJ2EnLCAnaScsICdkJywgJ18nLCAneCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsCisgICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ24nLCAnYycsICd0JywgJ2EnLCAnaScsICdkJywgJ18nLCAneScsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsCisgICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ24nLCAnYycsICd0JywgJ2EnLCAnaScsICdkJywgJ18nLCAneicsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsCisgICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ24nLCAncycsICdtJywgJ2knLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsCisgICdyJywgJ2UnLCAnZycsICdfJywgJ24nLCAndCcsICdpJywgJ2QnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsCisgICdnJywgJ18nLCAnbicsICd0JywgJ2knLCAnZCcsICdfJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsICdlJywgJ2cnLCAnXycsCisgICduJywgJ3QnLCAnaScsICdkJywgJ18nLCAneScsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsCisgICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ24nLCAndCcsCisgICdpJywgJ2QnLCAnXycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsCisgICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnbicsICd3JywgJ2EnLCAncicsCisgICdwJywgJ2knLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsCisgICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ3AnLCAnbScsICcwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsCisgICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAncCcsICdtJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsICdlJywgJ2cnLCAnXycsCisgICdwJywgJ20nLCAnMicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsCisgICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ3AnLCAnbScsICczJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsCisgICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAncycsICdtJywgJ2knLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsCisgICdfJywgJ3QnLCAnaScsICdkJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsCisgICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ3QnLCAnaScsCisgICdkJywgJ18nLCAneCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsCisgICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ3QnLCAnaScsICdkJywgJ18nLCAneScsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsCisgICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ3QnLCAnaScsICdkJywgJ18nLCAneicsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsCisgICdyJywgJ2UnLCAnZycsICdfJywgJ3cnLCAnYScsICdyJywgJ3AnLCAnaScsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsCisgICdnJywgJ18nLCAndycsICdhJywgJ3InLCAncCcsICdzJywgJ2knLCAneicsICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdyJywgJ28nLCAndCcsICdhJywgJ3QnLCAnZScsICdfJywgJ2InLCAnMycsICcyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ28nLCAndCcsICdhJywgJ3QnLCAnZScsICdfJywgJ2InLCAnNicsCisgICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ28nLCAndCcsICdhJywgJ3QnLCAnZScsCisgICdfJywgJ3InLCAnaScsICdnJywgJ2gnLCAndCcsICdfJywgJ2InLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAncycsICdxJywgJ3InLCAndCcsICdfJywgJ2EnLCAncCcsCisgICdwJywgJ3InLCAnbycsICd4JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsCisgICdzJywgJ3EnLCAncicsICd0JywgJ18nLCAnYScsICdwJywgJ3AnLCAncicsICdvJywgJ3gnLCAnXycsICdmJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ3MnLCAncScsICdyJywgJ3QnLCAnXycsICdhJywgJ3AnLCAncCcsCisgICdyJywgJ28nLCAneCcsICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncycsICdhJywgJ2QnLCAnXycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdzJywgJ2EnLCAnZCcsICdfJywgJ3UnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICdhJywgJ3QnLCAndScsICdyJywgJ2EnLCAndCcsICdlJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncycsICdhJywgJ3QnLCAndScsICdyJywgJ2EnLCAndCcsICdlJywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICdhJywgJ3QnLCAndScsICdyJywgJ2EnLCAndCcsICdlJywgJ18nLCAnZicsCisgICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ2gnLCAnZicsCisgICdsJywgJ18nLCAnYicsICdmJywgJ2wnLCAneScsICdfJywgJ2YnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdzJywgJ2gnLCAnZicsICdsJywgJ18nLCAnYicsICdmJywgJ2wnLCAneScsICdfJywgJ2knLCAnMycsCisgICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ2gnLCAnZicsICdsJywgJ18nLCAnZCcsCisgICdvJywgJ3cnLCAnbicsICdfJywgJ2YnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdzJywgJ2gnLCAnZicsICdsJywgJ18nLCAnZCcsICdvJywgJ3cnLCAnbicsICdfJywgJ2knLCAnMycsICcyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ2gnLCAnZicsICdsJywgJ18nLCAnaScsICdkJywgJ3gnLCAnXycsCisgICdmJywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICdoJywgJ2YnLCAnbCcsCisgICdfJywgJ2knLCAnZCcsICd4JywgJ18nLCAnaScsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAnaCcsICdmJywgJ2wnLCAnXycsICdzJywgJ3knLCAnbicsICdjJywgJ18nLCAnYicsICdmJywgJ2wnLCAneScsCisgICdfJywgJ2YnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ2gnLCAnZicsCisgICdsJywgJ18nLCAncycsICd5JywgJ24nLCAnYycsICdfJywgJ2InLCAnZicsICdsJywgJ3knLCAnXycsICdpJywgJzMnLCAnMicsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICdoJywgJ2YnLCAnbCcsICdfJywgJ3MnLCAneScsCisgICduJywgJ2MnLCAnXycsICdkJywgJ28nLCAndycsICduJywgJ18nLCAnZicsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAnaCcsICdmJywgJ2wnLCAnXycsICdzJywgJ3knLCAnbicsICdjJywgJ18nLCAnZCcsCisgICdvJywgJ3cnLCAnbicsICdfJywgJ2knLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdzJywgJ2gnLCAnZicsICdsJywgJ18nLCAncycsICd5JywgJ24nLCAnYycsICdfJywgJ2knLCAnZCcsICd4JywgJ18nLCAnZicsCisgICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAnaCcsICdmJywgJ2wnLCAnXycsCisgICdzJywgJ3knLCAnbicsICdjJywgJ18nLCAnaScsICdkJywgJ3gnLCAnXycsICdpJywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICdoJywgJ2YnLCAnbCcsICdfJywgJ3MnLCAneScsICduJywgJ2MnLCAnXycsCisgICd1JywgJ3AnLCAnXycsICdmJywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICdoJywgJ2YnLCAnbCcsICdfJywgJ3MnLCAneScsICduJywgJ2MnLCAnXycsICd1JywgJ3AnLCAnXycsICdpJywgJzMnLCAnMicsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICdoJywgJ2YnLCAnbCcsICdfJywgJ3UnLCAncCcsCisgICdfJywgJ2YnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ2gnLCAnZicsCisgICdsJywgJ18nLCAndScsICdwJywgJ18nLCAnaScsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAnaScsICduJywgJ18nLCAnYScsICdwJywgJ3AnLCAncicsICdvJywgJ3gnLCAnXycsICdmJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ2knLCAnbicsICdfJywgJ2EnLCAncCcsICdwJywgJ3InLCAnbycsCisgICd4JywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdzJywgJ3EnLCAncicsICd0JywgJ18nLCAnYScsICdwJywgJ3AnLCAncicsICdvJywgJ3gnLCAnXycsICdmJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3EnLCAncicsICd0JywgJ18nLCAnYScsICdwJywgJ3AnLCAncicsCisgICdvJywgJ3gnLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAncScsICdyJywgJ3QnLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdzJywgJ3EnLCAncicsICd0JywgJ18nLCAncicsICdtJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncycsICdxJywgJ3InLCAndCcsICdfJywgJ3InLCAnbScsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAncScsICdyJywgJ3QnLCAnXycsICdyJywgJ20nLCAnXycsICdmJywgJ3QnLCAneicsCisgICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAncScsICdyJywgJ3QnLCAnXycsCisgICdyJywgJ24nLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3EnLCAncicsCisgICd0JywgJ18nLCAncicsICduJywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICdxJywgJ3InLCAndCcsICdfJywgJ3InLCAnbicsICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICdxJywgJ3InLCAndCcsICdfJywgJ3InLCAncCcsICdfJywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAncScsICdyJywgJ3QnLCAnXycsICdyJywgJ3AnLCAnXycsCisgICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3EnLCAncicsICd0JywgJ18nLCAncicsCisgICdwJywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdzJywgJ3EnLCAncicsICd0JywgJ18nLCAncicsICd6JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncycsICdxJywgJ3InLCAndCcsICdfJywgJ3InLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAncScsICdyJywgJ3QnLCAnXycsICdyJywgJ3onLCAnXycsICdmJywgJ3QnLCAneicsCisgICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdxJywgJ18nLCAnYScsCisgICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAncycsICdpJywgJ3onLCAnZScsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncycsICd1JywgJ3EnLCAnXycsICdjJywgJ2gnLCAnYScsICduJywgJ24nLCAnZScsICdsJywgJ18nLCAnZCcsCisgICdhJywgJ3QnLCAnYScsICdfJywgJ3QnLCAneScsICdwJywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdxJywgJ18nLCAnYycsICdoJywgJ2EnLCAnbicsICduJywgJ2UnLCAnbCcsICdfJywgJ28nLCAncicsCisgICdkJywgJ2UnLCAncicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3EnLCAnXycsCisgICdkJywgJ2UnLCAncCcsICd0JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsCisgICdxJywgJ18nLCAnaCcsICdlJywgJ2knLCAnZycsICdoJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdxJywgJ18nLCAndycsICdpJywgJ2QnLCAndCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsCisgICdyJywgJ2EnLCAneScsICdfJywgJ2knLCAnMScsICc2JywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsCisgICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ2knLCAnMScsICc2JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsCisgICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICdpJywgJzEnLCAnNicsICdfJywgJ3onLCAnZScsCisgICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsCisgICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAnaScsICczJywgJzInLCAnXycsCisgICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsCisgICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAnaScsCisgICczJywgJzInLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsCisgICdfJywgJ2knLCAnMycsICcyJywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsCisgICdhJywgJ3knLCAnXycsICdpJywgJzYnLCAnNCcsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsCisgICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICdpJywgJzYnLCAnNCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsCisgICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAnaScsICc2JywgJzQnLCAnXycsICd6JywgJ2UnLCAncicsCisgICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsCisgICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ2knLCAnOCcsICdfJywgJ2MnLCAnbCcsCisgICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsCisgICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICdpJywgJzgnLCAnXycsCisgICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ2knLCAnOCcsCisgICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsCisgICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsCisgICcyJywgJ2knLCAnMScsICc2JywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsCisgICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnMicsICdpJywgJzEnLCAnNicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsCisgICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICcyJywgJ2knLCAnMScsICc2JywgJ18nLCAneicsCisgICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsCisgICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywgJzInLCAnaScsCisgICczJywgJzInLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsCisgICd5JywgJ18nLCAndicsICcyJywgJ2knLCAnMycsICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsCisgICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywgJzInLCAnaScsICczJywgJzInLCAnXycsICd6JywgJ2UnLCAncicsCisgICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsCisgICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnMicsICdpJywgJzYnLCAnNCcsCisgICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsCisgICd2JywgJzInLCAnaScsICc2JywgJzQnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsCisgICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnMicsICdpJywgJzYnLCAnNCcsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsCisgICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICcyJywgJ2knLCAnOCcsICdfJywgJ2MnLCAnbCcsCisgICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsCisgICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywgJzInLCAnaScsCisgICc4JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsCisgICd2JywgJzInLCAnaScsICc4JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsCisgICdhJywgJ3knLCAnXycsICd2JywgJzQnLCAnaScsICcxJywgJzYnLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsCisgICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICc0JywgJ2knLCAnMScsICc2JywgJ18nLCAndCcsCisgICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsCisgICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywgJzQnLCAnaScsCisgICcxJywgJzYnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsCisgICdfJywgJ3YnLCAnNCcsICdpJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsCisgICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywgJzQnLCAnaScsICczJywgJzInLCAnXycsICd0JywgJ3InLCAnYScsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsCisgICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnNCcsICdpJywgJzMnLCAnMicsCisgICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsCisgICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsCisgICc0JywgJ2knLCAnOCcsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsCisgICdhJywgJ3knLCAnXycsICd2JywgJzQnLCAnaScsICc4JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsCisgICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywgJzQnLCAnaScsICc4JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsCisgICcxJywgJ2QnLCAnXycsICdpJywgJzEnLCAnNicsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsCisgICdpJywgJzEnLCAnNicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAnaScsICcxJywgJzYnLCAnXycsCisgICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ2knLCAnMycsICcyJywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsCisgICdfJywgJzEnLCAnZCcsICdfJywgJ2knLCAnMycsICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsCisgICdpJywgJzMnLCAnMicsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAnaScsICc2JywgJzQnLCAnXycsCisgICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsCisgICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAnaScsICc2JywgJzQnLCAnXycsICd0JywgJ3InLCAnYScsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsCisgICdfJywgJzEnLCAnZCcsICdfJywgJ2knLCAnNicsICc0JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsCisgICdpJywgJzgnLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAnaScsICc4JywgJ18nLCAndCcsCisgICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsCisgICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdpJywgJzgnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsCisgICdfJywgJ3YnLCAnMicsICdpJywgJzEnLCAnNicsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsCisgICd2JywgJzInLCAnaScsICcxJywgJzYnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ3YnLCAnMicsCisgICdpJywgJzEnLCAnNicsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnMycsCisgICcyJywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywgJzMnLCAnMicsCisgICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsCisgICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnMycsICcyJywgJ18nLCAneicsCisgICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsCisgICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICc2JywgJzQnLCAnXycsICdjJywgJ2wnLCAnYScsCisgICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsCisgICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnNicsICc0JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsCisgICcxJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICc2JywgJzQnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsCisgICdfJywgJ3YnLCAnMicsICdpJywgJzgnLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAndicsCisgICcyJywgJ2knLCAnOCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnOCcsCisgICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsCisgICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnMScsICc2JywgJ18nLCAnYycsCisgICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ3YnLCAnNCcsICdpJywgJzEnLCAnNicsICdfJywgJ3QnLCAncicsCisgICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsCisgICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnMScsICc2JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsCisgICcxJywgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICczJywgJzInLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsCisgICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnMycsICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsCisgICd2JywgJzQnLCAnaScsICczJywgJzInLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ3YnLCAnNCcsCisgICdpJywgJzgnLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnOCcsCisgICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsCisgICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnOCcsICdfJywgJ3onLCAnZScsCisgICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsCisgICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAnaScsICcxJywgJzYnLCAnXycsCisgICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsCisgICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAnaScsCisgICcxJywgJzYnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsCisgICdfJywgJ2knLCAnMScsICc2JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsCisgICdhJywgJ3knLCAnXycsICdpJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsCisgICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICdpJywgJzMnLCAnMicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsCisgICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAnaScsICczJywgJzInLCAnXycsICd6JywgJ2UnLCAncicsCisgICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsCisgICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ2knLCAnNicsICc0JywgJ18nLCAnYycsCisgICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ2knLCAnNicsCisgICc0JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsCisgICdpJywgJzYnLCAnNCcsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsCisgICd5JywgJ18nLCAnaScsICc4JywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsCisgICdyJywgJ2EnLCAneScsICdfJywgJ2knLCAnOCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsCisgICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAnaScsICc4JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsCisgICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywgJzInLCAnaScsICcxJywgJzYnLCAnXycsICdjJywgJ2wnLCAnYScsCisgICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsCisgICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICcyJywgJ2knLCAnMScsCisgICc2JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsCisgICd2JywgJzInLCAnaScsICcxJywgJzYnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsCisgICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnMicsICdpJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsCisgICcyJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywgJzInLCAnaScsICczJywgJzInLCAnXycsCisgICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnMicsCisgICdpJywgJzMnLCAnMicsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsCisgICd5JywgJ18nLCAndicsICcyJywgJ2knLCAnNicsICc0JywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsCisgICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnMicsICdpJywgJzYnLCAnNCcsICdfJywgJ3QnLCAncicsCisgICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsCisgICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICcyJywgJ2knLCAnNicsCisgICc0JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsCisgICd2JywgJzInLCAnaScsICc4JywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsCisgICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnMicsICdpJywgJzgnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsCisgICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnMicsICdpJywgJzgnLCAnXycsICd6JywgJ2UnLCAncicsCisgICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsCisgICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnNCcsICdpJywgJzEnLCAnNicsCisgICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsCisgICd2JywgJzQnLCAnaScsICcxJywgJzYnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsCisgICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnNCcsICdpJywgJzEnLCAnNicsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsCisgICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICc0JywgJ2knLCAnMycsICcyJywgJ18nLCAnYycsCisgICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnNCcsCisgICdpJywgJzMnLCAnMicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsCisgICd5JywgJ18nLCAndicsICc0JywgJ2knLCAnMycsICcyJywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsCisgICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywgJzQnLCAnaScsICc4JywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsCisgICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnNCcsICdpJywgJzgnLCAnXycsCisgICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnNCcsCisgICdpJywgJzgnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2knLCAnMScsICc2JywgJ18nLCAnYycsCisgICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2knLCAnMScsICc2JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsCisgICcyJywgJ2QnLCAnXycsICdpJywgJzEnLCAnNicsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnaScsCisgICczJywgJzInLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnaScsICczJywgJzInLCAnXycsCisgICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2knLCAnMycsICcyJywgJ18nLCAneicsICdlJywgJ3InLCAnbycsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsCisgICcyJywgJ2QnLCAnXycsICdpJywgJzYnLCAnNCcsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsCisgICdpJywgJzYnLCAnNCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnaScsICc2JywgJzQnLCAnXycsCisgICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2knLCAnOCcsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsCisgICcyJywgJ2QnLCAnXycsICdpJywgJzgnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2knLCAnOCcsCisgICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsCisgICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnMScsICc2JywgJ18nLCAnYycsCisgICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywgJzEnLCAnNicsICdfJywgJ3QnLCAncicsCisgICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsCisgICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnMScsICc2JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsCisgICcyJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICczJywgJzInLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsCisgICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnMycsICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsCisgICd2JywgJzInLCAnaScsICczJywgJzInLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ3YnLCAnMicsCisgICdpJywgJzYnLCAnNCcsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsCisgICc2JywgJzQnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywgJzYnLCAnNCcsCisgICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsCisgICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnOCcsICdfJywgJ2MnLCAnbCcsCisgICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsCisgICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICc4JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsCisgICcyJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICc4JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsCisgICd2JywgJzQnLCAnaScsICcxJywgJzYnLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAndicsCisgICc0JywgJ2knLCAnMScsICc2JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsCisgICcxJywgJzYnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ3YnLCAnNCcsICdpJywgJzMnLCAnMicsCisgICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICczJywgJzInLCAnXycsCisgICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ3YnLCAnNCcsICdpJywgJzMnLCAnMicsICdfJywgJ3onLCAnZScsCisgICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsCisgICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnOCcsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsCisgICcyJywgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICc4JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsCisgICd2JywgJzQnLCAnaScsICc4JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICdpJywgJzEnLCAnNicsCisgICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICdpJywgJzEnLCAnNicsICdfJywgJ3QnLCAncicsCisgICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsCisgICdiJywgJ18nLCAnMycsICdkJywgJ18nLCAnaScsICcxJywgJzYnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsCisgICdfJywgJ2knLCAnMycsICcyJywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsICdfJywgJ2knLCAnMycsCisgICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICdpJywgJzMnLCAnMicsICdfJywgJ3onLCAnZScsCisgICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsCisgICdiJywgJ18nLCAnMycsICdkJywgJ18nLCAnaScsICc2JywgJzQnLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMycsCisgICdkJywgJ18nLCAnaScsICc2JywgJzQnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsICdfJywgJ2knLCAnNicsCisgICc0JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICdpJywgJzgnLCAnXycsICdjJywgJ2wnLCAnYScsCisgICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsCisgICdiJywgJ18nLCAnMycsICdkJywgJ18nLCAnaScsICc4JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywgJ2QnLCAnXycsCisgICdpJywgJzgnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywgJzEnLCAnNicsCisgICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICcxJywgJzYnLCAnXycsCisgICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywgJzEnLCAnNicsICdfJywgJ3onLCAnZScsCisgICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsCisgICdiJywgJ18nLCAnMycsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnMycsICcyJywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsCisgICdfJywgJzMnLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywgJzMnLCAnMicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMycsCisgICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnMycsICcyJywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywgJ2QnLCAnXycsCisgICd2JywgJzInLCAnaScsICc2JywgJzQnLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMycsICdkJywgJ18nLCAndicsCisgICcyJywgJ2knLCAnNicsICc0JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsCisgICc2JywgJzQnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywgJzgnLCAnXycsCisgICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsCisgICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMycsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnOCcsICdfJywgJ3QnLCAncicsCisgICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsCisgICdiJywgJ18nLCAnMycsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnOCcsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMycsCisgICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnMScsICc2JywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsCisgICdfJywgJ3YnLCAnNCcsICdpJywgJzEnLCAnNicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMycsICdkJywgJ18nLCAndicsCisgICc0JywgJ2knLCAnMScsICc2JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsCisgICczJywgJzInLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMycsICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnMycsCisgICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICczJywgJzInLCAnXycsCisgICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsICdfJywgJ3YnLCAnNCcsICdpJywgJzgnLCAnXycsICdjJywgJ2wnLCAnYScsCisgICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsCisgICdiJywgJ18nLCAnMycsICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnOCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMycsCisgICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnOCcsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMScsICdkJywgJ18nLCAnYScsCisgICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAnaScsICcxJywgJzYnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywgJzEnLCAnZCcsCisgICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ2knLCAnMycsICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsCisgICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICdpJywgJzgnLCAnXycsICd0JywgJ3InLCAnYScsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsCisgICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnMicsICdpJywgJzEnLCAnNicsCisgICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsCisgICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsCisgICcyJywgJ2knLCAnMycsICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsCisgICdhJywgJ3knLCAnXycsICd2JywgJzInLCAnaScsICc4JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcxJywgJ2QnLCAnXycsCisgICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywgJzQnLCAnaScsICcxJywgJzYnLCAnXycsICd0JywgJ3InLCAnYScsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsCisgICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnNCcsICdpJywgJzMnLCAnMicsCisgICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsCisgICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsCisgICc0JywgJ2knLCAnOCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMScsICdkJywgJ18nLCAnaScsICcxJywgJzYnLCAnXycsCisgICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAncCcsICdfJywgJzEnLCAnZCcsICdfJywgJ2knLCAnMycsICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsCisgICcxJywgJ2QnLCAnXycsICdpJywgJzgnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywgJzEnLCAnZCcsICdfJywgJ3YnLCAnMicsCisgICdpJywgJzEnLCAnNicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMScsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnMycsCisgICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcxJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICc4JywgJ18nLCAndCcsCisgICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsCisgICdfJywgJ3AnLCAnXycsICcxJywgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICcxJywgJzYnLCAnXycsICd0JywgJ3InLCAnYScsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsCisgICdfJywgJzEnLCAnZCcsICdfJywgJ3YnLCAnNCcsICdpJywgJzMnLCAnMicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMScsCisgICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnOCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsCisgICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAnaScsICcxJywgJzYnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywgJzInLCAnZCcsCisgICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ2knLCAnMycsICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsCisgICcyJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICdpJywgJzgnLCAnXycsICd0JywgJ3InLCAnYScsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsCisgICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnMicsICdpJywgJzEnLCAnNicsCisgICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsCisgICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsCisgICcyJywgJ2knLCAnMycsICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcyJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsCisgICdhJywgJ3knLCAnXycsICd2JywgJzInLCAnaScsICc4JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcyJywgJ2QnLCAnXycsCisgICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywgJzQnLCAnaScsICcxJywgJzYnLCAnXycsICd0JywgJ3InLCAnYScsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsCisgICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnNCcsICdpJywgJzMnLCAnMicsCisgICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsCisgICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsCisgICc0JywgJ2knLCAnOCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMicsICdkJywgJ18nLCAnaScsICcxJywgJzYnLCAnXycsCisgICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAncCcsICdfJywgJzInLCAnZCcsICdfJywgJ2knLCAnMycsICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsCisgICcyJywgJ2QnLCAnXycsICdpJywgJzgnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywgJzInLCAnZCcsICdfJywgJ3YnLCAnMicsCisgICdpJywgJzEnLCAnNicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMicsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnMycsCisgICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcyJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICc4JywgJ18nLCAndCcsCisgICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsCisgICdfJywgJ3AnLCAnXycsICcyJywgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICcxJywgJzYnLCAnXycsICd0JywgJ3InLCAnYScsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsCisgICdfJywgJzInLCAnZCcsICdfJywgJ3YnLCAnNCcsICdpJywgJzMnLCAnMicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMicsCisgICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnOCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMycsICdkJywgJ18nLCAnaScsCisgICcxJywgJzYnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsCisgICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywgJzMnLCAnZCcsICdfJywgJ2knLCAnMycsICcyJywgJ18nLCAndCcsCisgICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsCisgICdfJywgJ3AnLCAnXycsICczJywgJ2QnLCAnXycsICdpJywgJzgnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywgJzMnLCAnZCcsCisgICdfJywgJ3YnLCAnMicsICdpJywgJzEnLCAnNicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMycsICdkJywgJ18nLCAndicsCisgICcyJywgJ2knLCAnMycsICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsCisgICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICczJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsCisgICc4JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsCisgICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICczJywgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICcxJywgJzYnLCAnXycsCisgICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsCisgICd0JywgJ18nLCAncCcsICdfJywgJzMnLCAnZCcsICdfJywgJ3YnLCAnNCcsICdpJywgJzMnLCAnMicsICdfJywgJ3QnLCAncicsCisgICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsCisgICdwJywgJ18nLCAnMycsICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnOCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndycsICdhJywgJ3AnLCAnXycsICdsJywgJ28nLCAnXycsCisgICdoJywgJ2knLCAnXycsICdiJywgJzYnLCAnNCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAndCcsCisgICdyJywgJ3UnLCAnbicsICdjJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAndCcsCisgICdyJywgJ3UnLCAnbicsICdjJywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAndCcsCisgICdyJywgJ3UnLCAnbicsICdjJywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICd0JywgJ3gnLCAncScsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3MnLCAnaScsCisgICd6JywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3QnLCAneCcsICdxJywgJ18nLCAnYycsCisgICdoJywgJ2EnLCAnbicsICduJywgJ2UnLCAnbCcsICdfJywgJ2QnLCAnYScsICd0JywgJ2EnLCAnXycsICd0JywgJ3knLCAncCcsCisgICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICd0JywgJ3gnLCAncScsICdfJywgJ2MnLCAnaCcsCisgICdhJywgJ24nLCAnbicsICdlJywgJ2wnLCAnXycsICdvJywgJ3InLCAnZCcsICdlJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3QnLCAneCcsICdxJywgJ18nLCAnZCcsICdlJywgJ3AnLCAndCcsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICd0JywgJ3gnLCAncScsICdfJywgJ2gnLCAnZScsICdpJywgJ2cnLCAnaCcsCisgICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICd0JywgJ3gnLCAncScsICdfJywgJ24nLCAndScsCisgICdtJywgJ18nLCAnbScsICdpJywgJ3AnLCAnbScsICdhJywgJ3AnLCAnXycsICdsJywgJ2UnLCAndicsICdlJywgJ2wnLCAncycsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAndCcsICd4JywgJ3EnLCAnXycsICduJywgJ3UnLCAnbScsCisgICdfJywgJ3MnLCAnYScsICdtJywgJ3AnLCAnbCcsICdlJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsCisgICdfJywgJ3QnLCAneCcsICdxJywgJ18nLCAndycsICdpJywgJ2QnLCAndCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICd1JywgJ2knLCAnMicsICdkJywgJ18nLCAncicsICdtJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICd1JywgJ2knLCAnMicsICdkJywgJ18nLCAncicsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICd1JywgJ2knLCAnMicsICdkJywgJ18nLCAncicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICd1JywgJ2knLCAnMicsICdkJywgJ18nLCAncicsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICd1JywgJ2knLCAnMicsICdmJywgJ18nLCAncicsICdtJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICd1JywgJ2knLCAnMicsICdmJywgJ18nLCAncicsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICd1JywgJ2knLCAnMicsICdmJywgJ18nLCAncicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICd1JywgJ2knLCAnMicsICdmJywgJ18nLCAncicsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICd1JywgJ2wnLCAnbCcsICcyJywgJ2QnLCAnXycsICdyJywgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3UnLCAnbCcsICdsJywgJzInLCAnZCcsICdfJywgJ3InLCAnbicsICdcMDAwJywgJ18nLCAnXycsCisgICduJywgJ3YnLCAndicsICdtJywgJ18nLCAndScsICdsJywgJ2wnLCAnMicsICdkJywgJ18nLCAncicsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICd1JywgJ2wnLCAnbCcsICcyJywgJ2QnLCAnXycsICdyJywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3UnLCAnbCcsICdsJywgJzInLCAnZicsICdfJywgJ3InLCAnbScsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAndScsICdsJywgJ2wnLCAnMicsICdmJywgJ18nLCAncicsCisgICduJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICd1JywgJ2wnLCAnbCcsICcyJywgJ2YnLCAnXycsCisgICdyJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3UnLCAnbCcsICdsJywgJzInLCAnZicsCisgICdfJywgJ3InLCAneicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAndicsICdvJywgJ3QnLCAnZScsCisgICdfJywgJ2EnLCAnbCcsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICd2JywgJ28nLCAndCcsCisgICdlJywgJ18nLCAnYScsICdsJywgJ2wnLCAnXycsICdzJywgJ3knLCAnbicsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsCisgICd2JywgJ20nLCAnXycsICd2JywgJ28nLCAndCcsICdlJywgJ18nLCAnYScsICduJywgJ3knLCAnXDAwMCcsICdfJywgJ18nLCAnbicsCisgICd2JywgJ3YnLCAnbScsICdfJywgJ3YnLCAnbycsICd0JywgJ2UnLCAnXycsICdhJywgJ24nLCAneScsICdfJywgJ3MnLCAneScsCisgICduJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3YnLCAnbycsICd0JywgJ2UnLCAnXycsCisgICdiJywgJ2EnLCAnbCcsICdsJywgJ28nLCAndCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAndicsCisgICdvJywgJ3QnLCAnZScsICdfJywgJ2InLCAnYScsICdsJywgJ2wnLCAnbycsICd0JywgJ18nLCAncycsICd5JywgJ24nLCAnYycsCisgICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAndicsICdvJywgJ3QnLCAnZScsICdfJywgJ3UnLCAnbicsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICd2JywgJ28nLCAndCcsICdlJywgJ18nLCAndScsCisgICduJywgJ2knLCAnXycsICdzJywgJ3knLCAnbicsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAnYycsICdyJywgJ3knLCAncCcsCisgICd0JywgJ28nLCAnXycsICd2JywgJ2MnLCAnaScsICdwJywgJ2gnLCAnZScsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAnYycsCisgICdyJywgJ3knLCAncCcsICd0JywgJ28nLCAnXycsICd2JywgJ2MnLCAnaScsICdwJywgJ2gnLCAnZScsICdyJywgJ2wnLCAnYScsCisgICdzJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsCisgICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICdjJywgJ3InLCAneScsICdwJywgJ3QnLCAnbycsICdfJywgJ3YnLCAnbicsCisgICdjJywgJ2knLCAncCcsICdoJywgJ2UnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ2MnLCAncicsICd5JywgJ3AnLCAndCcsCisgICdvJywgJ18nLCAndicsICduJywgJ2MnLCAnaScsICdwJywgJ2gnLCAnZScsICdyJywgJ2wnLCAnYScsICdzJywgJ3QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICdjJywgJ3InLCAneScsICdwJywgJ3QnLCAnbycsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsCisgICd4JywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ2MnLCAncicsICd5JywgJ3AnLCAndCcsICdvJywgJ18nLCAndicsCisgICdwJywgJ20nLCAncycsICd1JywgJ20nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ2MnLCAncicsICd5JywgJ3AnLCAndCcsCisgICdvJywgJ18nLCAndicsICdwJywgJ20nLCAncycsICd1JywgJ20nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ2MnLCAncicsCisgICd5JywgJ3AnLCAndCcsICdvJywgJ18nLCAndicsICdwJywgJ20nLCAncycsICd1JywgJ20nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsCisgICdfJywgJ2MnLCAncicsICd5JywgJ3AnLCAndCcsICdvJywgJ18nLCAndicsICdwJywgJ20nLCAncycsICd1JywgJ20nLCAndycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsCisgICd2JywgJ2UnLCAnYycsICdfJywgJ2MnLCAncicsICd5JywgJ3AnLCAndCcsICdvJywgJ18nLCAndicsICdzJywgJ2InLCAnbycsCisgICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsCisgICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAnYycsICdyJywgJ3knLCAncCcsICd0JywgJ28nLCAnXycsICd2JywgJ3MnLCAnaCcsCisgICdhJywgJ3MnLCAnaScsICdnJywgJ20nLCAnYScsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAnYycsICdyJywgJ3knLCAncCcsCisgICd0JywgJ28nLCAnXycsICd2JywgJ3MnLCAnaCcsICdhJywgJ3MnLCAnaScsICdnJywgJ20nLCAnYScsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsCisgICdjJywgJ18nLCAnZCcsICdzJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICdkJywgJ3MnLCAncycsICdhJywgJ2wnLCAnbCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsCisgICd2JywgJ2UnLCAnYycsICdfJywgJ2QnLCAncycsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAnZCcsICdzJywgJ3QnLCAncycsCisgICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsCisgICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAnZCcsICdzJywgJ3QnLCAncycsICd0JywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsCisgICdkJywgJ3MnLCAndCcsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAnbScsICdmJywgJ3YnLCAncycsICdjJywgJ3InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICdtJywgJ3QnLCAndicsICdzJywgJ2MnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYScsCisgICdiJywgJ3MnLCAnZCcsICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2EnLCAnYicsICdzJywgJ2QnLCAndScsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsCisgICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdhJywgJ2InLCAncycsICdkJywgJ3UnLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsCisgICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAnYycsICd1JywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2EnLCAnZCcsCisgICdkJywgJ2MnLCAndScsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdlJywgJ2MnLCAndScsCisgICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsCisgICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdlJywgJ3UnLCAncScsICdtJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsCisgICdjJywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdzJywgJ2InLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYScsCisgICdkJywgJ2QnLCAncycsICdoJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ3MnLCAndycsCisgICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsCisgICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd1JywgJ2InLCAncycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsCisgICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsICdoJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2EnLCAnZCcsCisgICdkJywgJ3UnLCAndycsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICdzJywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ3MnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYScsCisgICd2JywgJ2cnLCAncycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICd1JywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ3UnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYScsCisgICd2JywgJ2cnLCAndScsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdiJywgJ3AnLCAnZScsICdyJywgJ20nLCAncScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsCisgICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdmJywgJ3MnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsCisgICdmJywgJ3UnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdsJywgJ3onLCAnbCcsICdzJywgJ2InLCAnYicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsCisgICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnYicsICdmJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsCisgICd2JywgJ2MnLCAnbScsICdwJywgJ2InLCAnZicsICdwJywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsCisgICdtJywgJ3AnLCAnZScsICdxJywgJ2YnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZScsCisgICdxJywgJ2YnLCAncCcsICdfJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ2UnLCAncScsCisgICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsCisgICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ2UnLCAncScsICd1JywgJ2InLCAnXycsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsCisgICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdlJywgJ3EnLCAndScsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsCisgICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdlJywgJ3EnLCAndScsICdkJywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsCisgICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZScsICdxJywgJ3UnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsCisgICdtJywgJ3AnLCAnZScsICdxJywgJ3UnLCAnaCcsICdfJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsCisgICdwJywgJ2UnLCAncScsICd1JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ2UnLCAncScsCisgICd1JywgJ3cnLCAnXycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdnJywgJ2UnLCAnZicsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsCisgICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdnJywgJ2UnLCAnZicsICdwJywgJ18nLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsCisgICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ2YnLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsCisgICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ2YnLCAncCcsICdfJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsCisgICd2JywgJ2MnLCAnbScsICdwJywgJ2cnLCAndCcsICdzJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsCisgICdwJywgJ2cnLCAndCcsICdzJywgJ2InLCAnXycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsCisgICdnJywgJ3QnLCAncycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdnJywgJ3QnLCAncycsCisgICdkJywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ3MnLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsCisgICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ3MnLCAnaCcsICdfJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ2cnLCAndCcsICdzJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsCisgICd2JywgJ2MnLCAnbScsICdwJywgJ2cnLCAndCcsICdzJywgJ3cnLCAnXycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsCisgICdjJywgJ20nLCAncCcsICdnJywgJ3QnLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsCisgICdnJywgJ3QnLCAndScsICdiJywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZycsCisgICd0JywgJ3UnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ3UnLCAnZCcsCisgICdfJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsCisgICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ2cnLCAndCcsICd1JywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ2cnLCAndCcsICd1JywgJ2gnLCAnXycsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsCisgICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdnJywgJ3QnLCAndScsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsCisgICdjJywgJ20nLCAncCcsICdnJywgJ3QnLCAndScsICd3JywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsCisgICdtJywgJ3AnLCAnbicsICdlJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ24nLCAnZScsCisgICdiJywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnbicsICdlJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ24nLCAnZScsICdoJywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsCisgICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnbicsICdlJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsCisgICdwJywgJ24nLCAnZScsICd3JywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnbicsCisgICdlJywgJ3onLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnbicsICdlJywgJ3onLCAnYicsCisgICdfJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsCisgICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ24nLCAnZScsICd6JywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ24nLCAnZScsICd6JywgJ2gnLCAnXycsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsCisgICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICduJywgJ2UnLCAneicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsCisgICdjJywgJ20nLCAncCcsICduJywgJ2UnLCAneicsICd3JywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsCisgICd0JywgJ3MnLCAneCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ3QnLCAndScsICd4JywgJ3MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAndCcsICd6JywgJ2wnLCAncycsICdiJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsCisgICd2JywgJ2UnLCAneCcsICdwJywgJ3QnLCAnZScsICdmJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2cnLCAnYicsCisgICdiJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsCisgICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2wnLCAnbycsICdnJywgJ2UnLCAnZicsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsCisgICdjJywgJ18nLCAndicsICdtJywgJ2EnLCAnZCcsICdkJywgJ2YnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnbScsCisgICdhJywgJ3gnLCAnZicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ2EnLCAneCcsICdzJywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ3MnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnbScsCisgICdhJywgJ3gnLCAncycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ2EnLCAneCcsICdzJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnbScsCisgICdhJywgJ3gnLCAndScsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ2EnLCAneCcsICd1JywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ3UnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnbScsCisgICdoJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAnaCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ2gnLCAncicsCisgICdhJywgJ2QnLCAnZCcsICdzJywgJ2gnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnbScsICdpJywgJ24nLCAnZicsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsCisgICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ2knLCAnbicsICdzJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsCisgICd2JywgJ20nLCAnaScsICduJywgJ3MnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnbScsICdpJywgJ24nLCAncycsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsCisgICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ2knLCAnbicsICdzJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsCisgICd2JywgJ20nLCAnaScsICduJywgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnbScsICdpJywgJ24nLCAndScsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsCisgICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ2knLCAnbicsICd1JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsCisgICd2JywgJ20nLCAnaScsICduJywgJ3UnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnbScsICdsJywgJ2EnLCAnZCcsCisgICdkJywgJ3UnLCAnaCcsICdtJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ3MnLCAndScsICdtJywgJ20nLCAnYicsCisgICdtJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsCisgICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ3MnLCAndScsICdtJywgJ3MnLCAnaCcsICdtJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsCisgICdjJywgJ18nLCAndicsICdtJywgJ3MnLCAndScsICdtJywgJ3MnLCAnaCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsCisgICdtJywgJ3MnLCAndScsICdtJywgJ3UnLCAnYicsICdtJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ3MnLCAndScsCisgICdtJywgJ3UnLCAnaCcsICdtJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ3MnLCAndScsICdtJywgJ3UnLCAnaCcsCisgICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsCisgICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ3UnLCAnbCcsICdlJywgJ3MnLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsCisgICdfJywgJ3YnLCAnbScsICd1JywgJ2wnLCAnZScsICdzJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAndScsCisgICdsJywgJ2UnLCAncycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ3UnLCAnbCcsICdlJywgJ3UnLCAnYicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsCisgICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnbScsICd1JywgJ2wnLCAnZScsICd1JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsCisgICd2JywgJ20nLCAndScsICdsJywgJ2UnLCAndScsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ3UnLCAnbCcsCisgICdvJywgJ3MnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnbScsICd1JywgJ2wnLCAnbycsICdzJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAndScsICdsJywgJ28nLCAncycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsCisgICdtJywgJ3UnLCAnbCcsICdvJywgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnbScsICd1JywgJ2wnLCAnbycsCisgICd1JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsCisgICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAndScsICdsJywgJ28nLCAndScsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsCisgICdjJywgJ18nLCAndicsICduJywgJ20nLCAncycsICd1JywgJ2InLCAnZicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsCisgICdwJywgJ2UnLCAncicsICdtJywgJ18nLCAnNCcsICdzJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3AnLCAnaycsCisgICdwJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsCisgICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3AnLCAnaycsICdzJywgJ2QnLCAncycsICdzJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsCisgICdjJywgJ18nLCAndicsICdwJywgJ2snLCAncycsICdkJywgJ3UnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncCcsCisgICdrJywgJ3MnLCAnaCcsICdzJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3AnLCAnaycsICdzJywgJ2gnLCAndScsCisgICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsCisgICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdwJywgJ2snLCAncycsICd3JywgJ3MnLCAncycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsCisgICdfJywgJ3YnLCAncCcsICdrJywgJ3MnLCAndycsICd1JywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3AnLCAnaycsCisgICd1JywgJ2QnLCAndScsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdwJywgJ2snLCAndScsICdoJywgJ3UnLCAncycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsCisgICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncCcsICdrJywgJ3UnLCAndycsICd1JywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsCisgICd2JywgJ3AnLCAncicsICd0JywgJ3knLCAnYicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdwJywgJ3InLCAndCcsCisgICd5JywgJ2InLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncCcsICdyJywgJ3QnLCAneScsICdiJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICd2JywgJ3InLCAnZScsICdmJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3InLCAnZicsCisgICdpJywgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsCisgICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3InLCAnZicsICdpJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsCisgICd2JywgJ3InLCAnZicsICdpJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3InLCAnZicsICdpJywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICd2JywgJ3InLCAnbCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdyJywgJ2wnLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsCisgICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncicsICdsJywgJ2QnLCAnbScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsCisgICdyJywgJ2wnLCAnZCcsICduJywgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3InLCAnbCcsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsCisgICdjJywgJ18nLCAndicsICdyJywgJ2wnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncicsICdsJywgJ3cnLCAnbScsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsCisgICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdyJywgJ2wnLCAndycsICduJywgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsCisgICd2JywgJ3InLCAncycsICdxJywgJ3InLCAndCcsICdlJywgJ2YnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsCisgICdlJywgJ2wnLCAnXycsICc0JywgJ3MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICdsJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsCisgICdjJywgJ18nLCAndicsICdzJywgJ2wnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICdsJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICd2JywgJ3MnLCAnbCcsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdzJywgJ2wnLCAndicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsCisgICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICdsJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3MnLCAncicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsCisgICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICdyJywgJ2EnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsCisgICdyJywgJ2EnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICdyJywgJ2EnLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsCisgICdfJywgJ3YnLCAncycsICdyJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3MnLCAncicsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsCisgICdjJywgJ18nLCAndicsICdzJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICdyJywgJ3YnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICd2JywgJ3MnLCAncicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsCisgICdjJywgJ3UnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAnYycsICd1JywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ2UnLCAnYycsICd1JywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsCisgICd2JywgJ3MnLCAndScsICdiJywgJ2UnLCAndScsICdxJywgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3MnLCAndScsCisgICdiJywgJ3MnLCAnYicsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICdzJywgJ2gnLCAncycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsCisgICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAncycsICd3JywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsCisgICd2JywgJ3MnLCAndScsICdiJywgJ3UnLCAnYicsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsCisgICd1JywgJ2gnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsCisgICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndScsICd3JywgJ3MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsCisgICdlJywgJ2MnLCAnXycsICd2JywgJ3MnLCAndScsICdtJywgJzInLCAncycsICd3JywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsCisgICd2JywgJ3MnLCAndScsICdtJywgJzQnLCAncycsICdiJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3MnLCAndScsCisgICdtJywgJzQnLCAncycsICdoJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3MnLCAndScsICdtJywgJzQnLCAndScsCisgICdiJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsCisgICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3MnLCAndScsICdtJywgJ3MnLCAndycsICdzJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsCisgICdjJywgJ18nLCAndicsICd1JywgJ3AnLCAnaycsICdoJywgJ3AnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAndScsCisgICdwJywgJ2snLCAnaCcsICdzJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3UnLCAncCcsICdrJywgJ2gnLCAncycsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsCisgICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICd1JywgJ3AnLCAnaycsICdoJywgJ3MnLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsCisgICdfJywgJ3YnLCAndScsICdwJywgJ2snLCAnbCcsICdwJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3UnLCAncCcsCisgICdrJywgJ2wnLCAncycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICd1JywgJ3AnLCAnaycsICdsJywgJ3MnLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsCisgICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAndScsICdwJywgJ2snLCAnbCcsICdzJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2InLCAncCcsICdlJywgJ3InLCAnbScsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdkJywgJ2knLCAndicsICdkJywgJ2UnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2QnLCAnaScsICd2JywgJ2QnLCAnZScsCisgICd1JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdkJywgJ2knLCAndicsCisgICd3JywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2QnLCAnaScsCisgICd2JywgJ3cnLCAnZScsICd1JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdnJywgJ2UnLCAndCcsICdfJywgJ3QnLCAnZScsICd4JywgJ2EnLCAncycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdnJywgJ2UnLCAndCcsICdfJywgJ3QnLCAnZScsICd4JywgJ2EnLCAncycsCisgICdyJywgJ3UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2cnLCAnZScsCisgICd0JywgJ18nLCAndCcsICdmJywgJ2gnLCAnYScsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdnJywgJ2UnLCAndCcsICdfJywgJ3QnLCAnZicsICdpJywgJ2EnLCAncicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsCisgICdhJywgJ2InLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsCisgICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICdhJywgJ2QnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICdhJywgJ2QnLCAnZCcsCisgICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsCisgICdfJywgJ3EnLCAndicsICdmJywgJ2MnLCAnZicsICdpJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAnYycsICdmJywgJ2knLCAnZCcsCisgICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsCisgICdfJywgJ3EnLCAndicsICdmJywgJ2MnLCAnZicsICdpJywgJ2QnLCAndScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICdjJywgJ2YnLCAnaScsCisgICdkJywgJ3UnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsCisgICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICdjJywgJ20nLCAncCcsICdlJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAnYycsCisgICdtJywgJ3AnLCAnZycsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ2MnLCAnbScsICdwJywgJ2wnLCAndCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsCisgICdjJywgJ3AnLCAncycsICdnJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAnYycsICd0JywgJ2knLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsCisgICdjJywgJ3QnLCAnaScsICdkJywgJ3UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAnYycsICd0JywgJ2knLCAnZCcsICd1JywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsCisgICd2JywgJ2YnLCAnYycsICd0JywgJ2knLCAnZCcsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ2MnLCAndCcsICdpJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsCisgICd2JywgJ2YnLCAnYycsICd0JywgJ2knLCAndycsICd1JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ2MnLCAndCcsICdpJywgJ3cnLCAndScsCisgICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsCisgICdfJywgJ3EnLCAndicsICdmJywgJ2MnLCAndCcsICdpJywgJ3cnLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICdsJywgJ28nLCAnZycsCisgICdpJywgJ2MnLCAnYScsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAnbScsCisgICdhJywgJ2QnLCAnZCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ20nLCAncycsICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAnbScsCisgICdzJywgJ3UnLCAnYicsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ20nLCAndScsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ20nLCAndScsCisgICdsJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsCisgICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAnbicsICdhJywgJ2InLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICduJywgJ2UnLCAnZycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsCisgICdxJywgJ3YnLCAnZicsICduJywgJ20nLCAnYScsICdkJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAnbicsICdtJywgJ2EnLCAnZCcsCisgICdkJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsCisgICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAnbicsICdtJywgJ3MnLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ24nLCAnbScsCisgICdzJywgJ3UnLCAnYicsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ3AnLCAnZScsICdyJywgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAncicsCisgICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsCisgICdfJywgJ3EnLCAndicsICdmJywgJ3InLCAnZScsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ3InLCAnaScsICdtJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsCisgICdmJywgJ3InLCAnaScsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ3InLCAnaScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ3InLCAnaScsCisgICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsCisgICdfJywgJ3EnLCAndicsICdmJywgJ3InLCAncycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ3InLCAncycsICdxJywgJ3InLCAndCcsCisgICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsCisgICdfJywgJ3EnLCAndicsICdmJywgJ3InLCAncycsICdxJywgJ3InLCAndCcsICdlJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAncycsCisgICdlJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsCisgICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAncycsICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAncycsICd1JywgJ2InLCAncycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsCisgICdxJywgJ3YnLCAnZicsICd0JywgJ3MnLCAndCcsICduJywgJ2EnLCAnbicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICd4JywgJ20nLCAnYScsCisgICdkJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsCisgICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAneCcsICdtJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAneCcsCisgICdtJywgJ3UnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsCisgICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICd4JywgJ20nLCAndScsICdsJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAneCcsCisgICd4JywgJ2MnLCAncCcsICduJywgJ20nLCAnYScsICdkJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAneCcsICd4JywgJ2MnLCAncCcsCisgICduJywgJ20nLCAnYScsICdkJywgJ2QnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICd4JywgJ3gnLCAnbScsICdhJywgJ2QnLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsCisgICdxJywgJ3YnLCAnZicsICd4JywgJ3gnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ3gnLCAneCcsCisgICduJywgJ3AnLCAnbScsICdhJywgJ2QnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICd4JywgJ3gnLCAnbicsICdwJywgJ20nLCAnYScsCisgICdkJywgJ2QnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsCisgICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZycsICdwJywgJ2MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnbCcsICdmJywgJ2MnLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsCisgICdxJywgJ3YnLCAnbCcsICdmJywgJ2MnLCAnZCcsICdhJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdsJywgJ2YnLCAnYycsICdzJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsCisgICdsJywgJ2YnLCAnYycsICdzJywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2wnLCAnZicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdsJywgJ2YnLCAnZCcsCisgICdhJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsCisgICdfJywgJ3EnLCAndicsICdsJywgJ2YnLCAnaScsICd3JywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2wnLCAnZicsICdpJywgJ3cnLCAnYScsCisgICdhJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsCisgICdfJywgJ3EnLCAndicsICdsJywgJ2YnLCAnaScsICd3JywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2wnLCAnZicsICdpJywgJ3cnLCAneicsCisgICdhJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsCisgICdfJywgJ3EnLCAndicsICdsJywgJ2YnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnbCcsICdmJywgJ3MnLCAnYScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnbCcsCisgICdwJywgJ2MnLCAnbCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdsJywgJ3AnLCAnYycsICdsJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2wnLCAncCcsCisgICdjJywgJ3InLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsCisgICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnbCcsICdwJywgJ2MnLCAncicsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdzJywgJ3QnLCAnZicsCisgICdjJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsCisgICd4JywgJ18nLCAncScsICd2JywgJ3MnLCAndCcsICdmJywgJ2MnLCAnZCcsICdhJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdzJywgJ3QnLCAnZicsCisgICdjJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsCisgICd4JywgJ18nLCAncScsICd2JywgJ3MnLCAndCcsICdmJywgJ2MnLCAncycsICdhJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdzJywgJ3QnLCAnZicsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsCisgICdfJywgJ3EnLCAndicsICdzJywgJ3QnLCAnZicsICdkJywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ3MnLCAndCcsICdmJywgJ2knLCAndycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsCisgICdxJywgJ3YnLCAncycsICd0JywgJ2YnLCAnaScsICd3JywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ3MnLCAndCcsICdmJywgJ3MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsCisgICd2JywgJ3MnLCAndCcsICdmJywgJ3MnLCAnYScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncycsICdlJywgJ3QnLCAnXycsICd0JywgJ2UnLCAneCcsICdhJywgJ3MnLCAncicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICdlJywgJ3QnLCAnXycsICd0JywgJ2UnLCAneCcsCisgICdhJywgJ3MnLCAncicsICd1JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdzJywgJ2UnLCAndCcsICdfJywgJ3QnLCAnZicsICdoJywgJ2EnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICdlJywgJ3QnLCAnXycsICd0JywgJ2YnLCAnaScsICdhJywgJ3InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3QnLCAnYScsICdiJywgJ28nLCAncicsCisgICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd0JywgJ2EnLCAnYicsCisgICdvJywgJ3InLCAndCcsICdkJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ3QnLCAnYScsICdiJywgJ28nLCAncicsICd0JywgJ2QnLCAnYycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd0JywgJ2EnLCAnYicsICdvJywgJ3InLCAndCcsICd3JywgJ2MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3QnLCAnYScsICdiJywgJ28nLCAncicsCisgICd0JywgJ3cnLCAnYycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICd0JywgJ2InLCAnZScsICdnJywgJ2knLCAnbicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAndCcsICdjJywgJ2gnLCAnZScsICdjJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3QnLCAnZScsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3QnLCAnZScsICduJywgJ2QnLCAnYScsICdsJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3QnLCAncicsICdlJywgJ2MnLCAnaCcsICdrJywgJ3AnLCAndCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndCcsICdyJywgJ2UnLCAnYycsCisgICdsJywgJ2EnLCAnaScsICdtJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICd0JywgJ3InLCAnZScsICdzJywgJ3UnLCAnbScsICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICd0JywgJ3MnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAndCcsICdzJywgJ3UnLCAncycsICdwJywgJ2UnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd0JywgJ3QnLCAnZScsICdzJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICdzJywgJ20nLCAnYScsCisgICd4JywgJ2QnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsCisgICdzJywgJ3gnLCAnXycsICd4JywgJ3MnLCAnbScsICdpJywgJ24nLCAnZCcsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsICdjJywgJ20nLCAncCcsCisgICdlJywgJ3EnLCAnZCcsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsICdjJywgJ20nLCAncCcsICdlJywgJ3EnLCAnZCcsICdwJywgJ18nLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsCisgICd4JywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZScsICdxJywgJ3MnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZScsCisgICdxJywgJ3MnLCAncCcsICdfJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ2MnLCAnbScsICdwJywgJ2cnLCAnZScsICdkJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsCisgICd2JywgJ2MnLCAnbScsICdwJywgJ2cnLCAnZScsICdkJywgJ3AnLCAnXycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsICdjJywgJ20nLCAncCcsCisgICdnJywgJ2UnLCAncycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsICdjJywgJ20nLCAncCcsICdnJywgJ2UnLCAncycsICdwJywgJ18nLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsCisgICd4JywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ2QnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZycsCisgICd0JywgJ2QnLCAncCcsICdfJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ2MnLCAnbScsICdwJywgJ2cnLCAndCcsICdzJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsCisgICd2JywgJ2MnLCAnbScsICdwJywgJ2cnLCAndCcsICdzJywgJ3AnLCAnXycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsICdjJywgJ3YnLCAnZCcsCisgICdwJywgJ3MnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsCisgICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAnYycsICd2JywgJ2QnLCAncCcsICdzJywgJ3gnLCAndycsICdzJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsCisgICdjJywgJ3YnLCAnZCcsICdwJywgJ3UnLCAneCcsICd3JywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ2MnLCAndicsICdoJywgJ3AnLCAncycsCisgICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsCisgICdfJywgJ3gnLCAndicsICdjJywgJ3YnLCAncycsICdwJywgJ2QnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAnYycsICd2JywgJ3MnLCAncCcsCisgICdoJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsCisgICd4JywgJ18nLCAneCcsICd2JywgJ2MnLCAndicsICdzJywgJ3gnLCAnZCcsICdzJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ2MnLCAndicsCisgICdzJywgJ3gnLCAndycsICdkJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ2MnLCAndicsICd1JywgJ3gnLCAnZCcsICdzJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsCisgICd2JywgJ2MnLCAndicsICd1JywgJ3gnLCAndycsICdkJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ2QnLCAnaScsICd2JywgJ2QnLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsCisgICd4JywgJ3YnLCAnZCcsICdpJywgJ3YnLCAncycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsICdpJywgJ2UnLCAneCcsICdwJywgJ2QnLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsCisgICd4JywgJ3YnLCAnaScsICdlJywgJ3gnLCAncCcsICdzJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ20nLCAnYScsICd4JywgJ2QnLCAncCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsCisgICd4JywgJ3YnLCAnbScsICdhJywgJ3gnLCAncycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsICdtJywgJ2knLCAnbicsICdkJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsCisgICd2JywgJ20nLCAnaScsICduJywgJ3MnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAncicsICdlJywgJ2QnLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAncicsCisgICdlJywgJ3MnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsCisgICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAncicsICdzJywgJ3EnLCAncicsICd0JywgJ2UnLCAnZCcsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsCisgICdyJywgJ3MnLCAncScsICdyJywgJ3QnLCAnZScsICdzJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ3QnLCAncycsICd0JywgJ2QnLCAnYycsCisgICdkJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsCisgICd4JywgJ18nLCAneCcsICd2JywgJ3QnLCAncycsICd0JywgJ2QnLCAnYycsICdzJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ3gnLCAnZScsCisgICd4JywgJ3AnLCAnZCcsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsICd4JywgJ2UnLCAneCcsICdwJywgJ3MnLCAncCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAneCcsCisgICdzJywgJ2knLCAnZycsICdkJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ3gnLCAncycsICdpJywgJ2cnLCAncycsICdwJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAneCcsCisgICdlJywgJ3gnLCAndCcsICdyJywgJ2EnLCAnYycsICd0JywgJ3UnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3gnLCAnaScsICduJywgJ3MnLCAnZScsCisgICdyJywgJ3QnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsCisgICdzJywgJ3gnLCAnXycsICd4JywgJ3gnLCAnbCcsICdlJywgJ3EnLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncicsICc2JywgJzAnLCAnMCcsICdfJywgJ2cnLCAncicsICdvJywgJ3UnLCAncCcsCisgICdfJywgJ2InLCAnYScsICdyJywgJ3InLCAnaScsICdlJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3InLCAnNicsICcwJywgJzAnLCAnXycsICdpJywgJ20nLCAncCcsICdsJywgJ2knLCAnYycsCisgICdpJywgJ3QnLCAnYScsICdyJywgJ2cnLCAnXycsICdwJywgJ3QnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncicsICc2JywgJzAnLCAnMCcsICdfJywgJ3InLCAnYScsICd0JywgJ18nLCAncycsCisgICd0JywgJ28nLCAncicsICdlJywgJ18nLCAndCcsICd5JywgJ3AnLCAnZScsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdyJywgJzYnLCAnMCcsICcwJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsCisgICdfJywgJ2cnLCAnbCcsICdvJywgJ2InLCAnYScsICdsJywgJ18nLCAncycsICdpJywgJ3onLCAnZScsICdfJywgJ3gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3InLCAnNicsICcwJywgJzAnLCAnXycsCisgICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAnZycsICdsJywgJ28nLCAnYicsICdhJywgJ2wnLCAnXycsICdzJywgJ2knLCAneicsCisgICdlJywgJ18nLCAneScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncicsCisgICc2JywgJzAnLCAnMCcsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdnJywgJ2wnLCAnbycsICdiJywgJ2EnLCAnbCcsCisgICdfJywgJ3MnLCAnaScsICd6JywgJ2UnLCAnXycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdyJywgJzYnLCAnMCcsICcwJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ24nLCAnZycsCisgICdyJywgJ28nLCAndScsICdwJywgJ3MnLCAnXycsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdyJywgJzYnLCAnMCcsICcwJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ24nLCAnZycsCisgICdyJywgJ28nLCAndScsICdwJywgJ3MnLCAnXycsICd5JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdyJywgJzYnLCAnMCcsICcwJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ24nLCAnZycsCisgICdyJywgJ28nLCAndScsICdwJywgJ3MnLCAnXycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdyJywgJzYnLCAnMCcsICcwJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3QnLCAnZycsCisgICdpJywgJ2QnLCAnXycsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdyJywgJzYnLCAnMCcsICcwJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3QnLCAnZycsICdpJywgJ2QnLCAnXycsCisgICd5JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdyJywgJzYnLCAnMCcsCisgICcwJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3QnLCAnZycsICdpJywgJ2QnLCAnXycsICd6JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAnZScsCisgICdmJywgJ3AnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndCcsCisgICd4JywgJ18nLCAnbicsICdlJywgJ3MnLCAndCcsICdpJywgJ24nLCAnZycsICdfJywgJ2QnLCAnZScsICdwJywgJ3QnLCAnaCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsCisgICdfJywgJ2wnLCAnYycsICdiJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ3QnLCAneCcsICdfJywgJ2EnLCAncycsICdzJywgJ2knLCAncycsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAncycsICdmJywgJ3AnLCAnYycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsCisgICdfJywgJ3YnLCAnYScsICdjJywgJ2MnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnYScsICdjJywgJ2MnLCAnYycsICdxJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsCisgICdhJywgJ2MnLCAnYycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdhJywgJ2MnLCAnYycsICdnJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdhJywgJ2MnLCAnYycsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsCisgICcwJywgJ18nLCAndicsICdhJywgJ2MnLCAnYycsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdhJywgJ2MnLCAncScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnYScsCisgICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsCisgICcwJywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICdmJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsCisgICdhJywgJ3YnLCAnZycsICdnJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsCisgICdsJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsCisgICc5JywgJzAnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ2wnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnYScsICd2JywgJ2cnLCAnbCcsCisgICdnJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsCisgICcwJywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICdsJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2InLCAncCcsICdlJywgJ3InLCAnbScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsCisgICdfJywgJ3YnLCAnYycsICdrJywgJ3MnLCAnbScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnZScsICdyJywgJ2knLCAnbScsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsCisgICdlJywgJ3InLCAnaScsICdtJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2UnLCAncicsICdpJywgJ20nLCAnZycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnZScsCisgICdyJywgJ2knLCAnbScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdlJywgJ3InLCAnbCcsICdsJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2UnLCAncicsCisgICdsJywgJ2wnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsCisgICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnZScsICdyJywgJ2wnLCAnbCcsICdnJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdlJywgJ3InLCAnbCcsCisgICdsJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsCisgICc5JywgJzAnLCAnXycsICd2JywgJ2UnLCAncicsICdsJywgJ2wnLCAndicsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdlJywgJ3InLCAnbCcsCisgICdsJywgJ3YnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsCisgICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnZScsICdyJywgJ2wnLCAnbCcsICd2JywgJ2cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2UnLCAncicsCisgICdsJywgJ2wnLCAndicsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdmJywgJ2EnLCAnZScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdmJywgJ2EnLCAnZScsCisgICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsCisgICcwJywgJ18nLCAndicsICdmJywgJ2EnLCAnZScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdmJywgJ2EnLCAnZScsICd6JywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsCisgICd2JywgJ2YnLCAnYScsICdlJywgJ3onLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnZicsICdhJywgJ2UnLCAneicsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsCisgICdmJywgJ2UnLCAnZScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdmJywgJ2UnLCAnZScsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdmJywgJ2UnLCAnZScsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsCisgICcwJywgJ18nLCAndicsICdmJywgJ2UnLCAnZScsICd6JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2YnLCAnZScsICdlJywgJ3onLCAnZicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsCisgICdfJywgJ3YnLCAnZicsICdlJywgJ2UnLCAneicsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdmJywgJ2UnLCAnbicsICdlJywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsCisgICd2JywgJ2YnLCAnZScsICduJywgJ2UnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnZicsICdlJywgJ24nLCAnZScsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsCisgICdmJywgJ2UnLCAnbicsICdlJywgJ3onLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnZicsICdlJywgJ24nLCAnZScsICd6JywgJ2YnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsCisgICd2JywgJ2YnLCAnZScsICduJywgJ2UnLCAneicsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdnJywgJ2YnLCAnbScsICdhJywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsCisgICd2JywgJ2cnLCAnZicsICdtJywgJ2EnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnZycsICdmJywgJ20nLCAnYScsICdnJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsCisgICdnJywgJ2YnLCAnbScsICdhJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2cnLCAnZicsICdtJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2cnLCAnZicsCisgICdtJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsCisgICc5JywgJzAnLCAnXycsICd2JywgJ2cnLCAnZicsICdtJywgJ2cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2cnLCAnZicsICdtJywgJ2gnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsCisgICd2JywgJ2knLCAncycsICd0JywgJ3InLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnaScsICdzJywgJ3QnLCAncicsICdmJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsCisgICdpJywgJ3MnLCAndCcsICdyJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2wnLCAnYicsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdsJywgJ2wnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsCisgICd2JywgJ2wnLCAncicsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ2EnLCAnZScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ2EnLCAnZScsCisgICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsCisgICcwJywgJ18nLCAndicsICdtJywgJ2EnLCAnZScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ2EnLCAnaCcsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsCisgICdtJywgJ2EnLCAnaCcsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ2EnLCAnaCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ2EnLCAnbCcsCisgICdlJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsCisgICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnYScsICdsJywgJ2UnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnbScsICdhJywgJ2wnLCAnZScsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsCisgICcwJywgJ18nLCAndicsICdtJywgJ2EnLCAnbCcsICdoJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnYScsICdsJywgJ2gnLCAnZicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsCisgICdfJywgJ3YnLCAnbScsICdhJywgJ2wnLCAnaCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ2EnLCAnbCcsICdvJywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsCisgICd2JywgJ20nLCAnYScsICdsJywgJ28nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnbScsICdhJywgJ2wnLCAnbycsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsCisgICdtJywgJ2EnLCAnbycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ2EnLCAnbycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ2EnLCAnbycsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsCisgICcwJywgJ18nLCAndicsICdtJywgJ2UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnbScsICdlJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnZScsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsCisgICcwJywgJ18nLCAndicsICdtJywgJ2gnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnbScsICdoJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnaCcsCisgICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsCisgICcwJywgJ18nLCAndicsICdtJywgJ2wnLCAnZScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ2wnLCAnZScsICdmJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsCisgICdtJywgJ2wnLCAnZScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ2wnLCAnaCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ2wnLCAnaCcsCisgICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsCisgICcwJywgJ18nLCAndicsICdtJywgJ2wnLCAnaCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ2wnLCAnbycsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsCisgICdtJywgJ2wnLCAnbycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ2wnLCAnbycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ28nLCAnYicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsCisgICdfJywgJ3YnLCAnbScsICdvJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnbycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ3MnLCAnbCcsCisgICdnJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsCisgICcwJywgJ18nLCAndicsICdwJywgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAncCcsCisgICdrJywgJ2wnLCAncycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdwJywgJ2snLCAnbCcsICdzJywgJ2cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3AnLCAnaycsCisgICdsJywgJ3MnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsCisgICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAncCcsICdrJywgJ3MnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAncCcsICdrJywgJ3MnLCAnZycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsCisgICdfJywgJ3YnLCAncCcsICdrJywgJ3MnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAncycsICdiJywgJ2MnLCAnYicsICdpJywgJ3EnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsCisgICd2JywgJ3MnLCAnYicsICdpJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3MnLCAnYycsICdiJywgJ2knLCAnYicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAncycsCisgICdjJywgJ2InLCAnaScsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdzJywgJ2MnLCAnYicsICdpJywgJ2cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3MnLCAnYycsCisgICdiJywgJ2knLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsCisgICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAncycsICdjJywgJ2InLCAnaScsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdzJywgJ2wnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsCisgICd2JywgJ3MnLCAnbCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdzJywgJ2wnLCAnZCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdzJywgJ3EnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsCisgICd2JywgJ3MnLCAncicsICdhJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdzJywgJ3InLCAnYScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdzJywgJ3InLCAnbCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsCisgICdfJywgJ3YnLCAncycsICdyJywgJ2wnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAncycsICd0JywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3MnLCAndCcsCisgICdyJywgJ2MnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsCisgICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAncycsICd0JywgJ3InLCAnYycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdzJywgJ3QnLCAncicsCisgICdjJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsCisgICc5JywgJzAnLCAnXycsICd2JywgJ3MnLCAndCcsICdyJywgJ2MnLCAneicsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdzJywgJ3QnLCAncicsCisgICdjJywgJ3onLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsCisgICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAncycsICd0JywgJ3InLCAnYycsICd6JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3MnLCAndCcsCisgICdyJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsCisgICc5JywgJzAnLCAnXycsICd2JywgJ3MnLCAndScsICdtJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3MnLCAndScsICdtJywgJ2cnLCAnZicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsCisgICdfJywgJ3YnLCAncycsICd1JywgJ20nLCAnZycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdzJywgJ3UnLCAnbScsICdoJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsCisgICdzJywgJ3UnLCAnbScsICdxJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3MnLCAndScsICdtJywgJ3EnLCAnZycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAndCcsCisgICdtJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsCisgICcwJywgJ18nLCAndicsICd1JywgJ3AnLCAnaCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICd1JywgJ3AnLCAnaCcsICdmJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsCisgICd1JywgJ3AnLCAnaCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICd1JywgJ3AnLCAnbCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICd1JywgJ3AnLCAnbCcsCisgICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsCisgICcwJywgJ18nLCAndicsICd1JywgJ3AnLCAnbCcsICdoJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3UnLCAncCcsICdsJywgJ2gnLCAnZicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsCisgICdfJywgJ3YnLCAndScsICdwJywgJ2wnLCAnaCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICd1JywgJ3AnLCAnbCcsICdoJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsCisgICd2JywgJ3UnLCAncCcsICdsJywgJ2wnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAndScsICdwJywgJ2wnLCAnbCcsICdmJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsCisgICd1JywgJ3AnLCAnbCcsICdsJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAndicsICdnJywgJ3UnLCAncycsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdmJywgJzInLCAnaScsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdmJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdmJywgJ2EnLCAnZCcsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdmJywgJ2MnLCAnbScsICdwJywgJ2UnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnZicsICdjJywgJ20nLCAncCcsCisgICdnJywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ2YnLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdmJywgJ20nLCAnYScsCisgICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdmJywgJ20nLCAnaScsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdmJywgJ20nLCAndScsICdsJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdmJywgJ3InLCAnYycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdmJywgJ3InLCAnYycsICdwJywgJ2knLCAndCcsICcxJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdmJywgJ3InLCAnYycsICdwJywgJ2knLCAndCcsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdmJywgJ3InLCAncycsICdxJywgJ2knLCAndCcsCisgICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdmJywgJ3InLCAncycsICdxJywgJ3InLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnZicsICdzJywgJ3UnLCAnYicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAnZicsICdzJywgJ3UnLCAnYicsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdpJywgJzInLCAnZicsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdtJywgJ3UnLCAnbCcsICdoJywgJ3InLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnZicsICcyJywgJ2knLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnZicsCisgICduJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdmJywgJ3AnLCAnbicsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnaScsCisgICcyJywgJ2YnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2EnLCAnZCcsICdkJywgJ2MnLCAnYScsICdyJywgJ3InLCAneScsICdfJywgJ3UnLCAnMycsCisgICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnYScsICdkJywgJ2QnLCAnYycsICdhJywgJ3InLCAncicsICd5JywgJ18nLCAndScsICc2JywgJzQnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdhJywgJ2QnLCAnZCcsICdjJywgJ2EnLCAncicsICdyJywgJ3knLCAneCcsICdfJywgJ3UnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYScsCisgICdkJywgJ2QnLCAnYycsICdhJywgJ3InLCAncicsICd5JywgJ3gnLCAnXycsICd1JywgJzYnLCAnNCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2EnLCAnZScsCisgICdzJywgJ2QnLCAnZScsICdjJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYScsICdlJywgJ3MnLCAnZCcsICdlJywgJ2MnLCAnMicsCisgICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdhJywgJ2UnLCAncycsICdkJywgJ2UnLCAnYycsICc1JywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2EnLCAnZScsCisgICdzJywgJ2QnLCAnZScsICdjJywgJ2wnLCAnYScsICdzJywgJ3QnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdhJywgJ2UnLCAncycsCisgICdkJywgJ2UnLCAnYycsICdsJywgJ2EnLCAncycsICd0JywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYScsICdlJywgJ3MnLCAnZCcsCisgICdlJywgJ2MnLCAnbCcsICdhJywgJ3MnLCAndCcsICc1JywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2EnLCAnZScsICdzJywgJ2UnLCAnbicsCisgICdjJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYScsICdlJywgJ3MnLCAnZScsICduJywgJ2MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdhJywgJ2UnLCAncycsICdlJywgJ24nLCAnYycsICc1JywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2EnLCAnZScsICdzJywgJ2UnLCAnbicsCisgICdjJywgJ2wnLCAnYScsICdzJywgJ3QnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdhJywgJ2UnLCAncycsICdlJywgJ24nLCAnYycsCisgICdsJywgJ2EnLCAncycsICd0JywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYScsICdlJywgJ3MnLCAnZScsICduJywgJ2MnLCAnbCcsCisgICdhJywgJ3MnLCAndCcsICc1JywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2EnLCAnZScsICdzJywgJ2knLCAnbScsICdjJywgJzEnLCAnMicsCisgICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnYScsICdlJywgJ3MnLCAnaycsICdlJywgJ3knLCAnZycsICdlJywgJ24nLCAnYScsICdzJywgJ3MnLCAnaScsCisgICdzJywgJ3QnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywgJ2QnLCAnMicsCisgICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdiJywgJ2wnLCAnZScsICduJywgJ2QnLCAndicsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdiJywgJ2wnLCAnZScsCisgICduJywgJ2QnLCAndicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywgJ2QnLCAnMicsCisgICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywgJ2QnLCAnMicsICdkJywgJ3EnLCAnMicsCisgICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywgJ3MnLCAnMicsICdkJywgJ3EnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdjJywgJ3YnLCAndCcsICdkJywgJ3EnLCAnMicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsCisgICd0JywgJ3AnLCAnZCcsICcyJywgJ2QnLCAncScsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3QnLCAncCcsCisgICdzJywgJzInLCAnZCcsICdxJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZCcsICdwJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2gnLCAnYScsICdkJywgJ2QnLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnaCcsICdhJywgJ2QnLCAnZCcsCisgICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdoJywgJ3MnLCAndScsICdiJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2gnLCAncycsICd1JywgJ2InLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbCcsICdkJywgJ2QnLCAncScsCisgICd1JywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdsJywgJ28nLCAnYScsICdkJywgJ3AnLCAnZCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnbCcsICdvJywgJ2EnLCAnZCcsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ2wnLCAnbycsICdhJywgJ2QnLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdsJywgJ28nLCAnYScsICdkJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAncycsCisgICd0JywgJ28nLCAncicsICdlJywgJ3AnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAncycsICd0JywgJ28nLCAncicsCisgICdlJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAncycsICd0JywgJ28nLCAncicsCisgICdlJywgJ3AnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAncycsICd0JywgJ28nLCAncicsICdlJywgJ3AnLCAncycsCisgICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnYScsICd4JywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnYScsCisgICd4JywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnaScsICduJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ20nLCAnaScsICduJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnbycsICd2JywgJ20nLCAncycsCisgICdrJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnbycsICd2JywgJ20nLCAncycsICdrJywgJ3AnLCAncycsCisgICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAndCcsICdlJywgJ3MnLCAndCcsICdjJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICd0JywgJ2UnLCAncycsICd0JywgJ24nLCAneicsICdjJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICd0JywgJ2UnLCAncycsCisgICd0JywgJ3onLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ2MnLCAncCcsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdyJywgJ28nLCAndScsICduJywgJ2QnLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsCisgICdkJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAncycsICdxJywgJ3InLCAndCcsICdwJywgJ3MnLCAnMicsCisgICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdzJywgJ3EnLCAncicsICd0JywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAncScsCisgICdyJywgJ3QnLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ2knLCAnbCcsCisgICd2JywgJ2EnLCAncicsICdwJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAnaScsICdsJywgJ3YnLCAnYScsCisgICdyJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICdpJywgJ2wnLCAndicsCisgICdhJywgJ3InLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ2knLCAnbCcsICd2JywgJ2EnLCAncicsCisgICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3QnLCAnZScsICdzJywgJ3QnLCAnYycsICdwJywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3QnLCAnZScsICdzJywgJ3QnLCAnYycsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3QnLCAnZScsCisgICdzJywgJ3QnLCAnYycsICdwJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3QnLCAnZScsICdzJywgJ3QnLCAnYycsICdwJywgJ3MnLCAnMicsCisgICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3QnLCAnZScsICdzJywgJ3QnLCAnbicsICd6JywgJ2MnLCAncCcsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsCisgICd0JywgJ2UnLCAncycsICd0JywgJ24nLCAneicsICdjJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAndCcsCisgICdlJywgJ3MnLCAndCcsICduJywgJ3onLCAnYycsICdwJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3QnLCAnZScsICdzJywgJ3QnLCAnbicsCisgICd6JywgJ2MnLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICd0JywgJ2UnLCAncycsICd0JywgJ3onLCAncCcsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICd0JywgJ2UnLCAncycsICd0JywgJ3onLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsCisgICd0JywgJ2UnLCAncycsICd0JywgJ3onLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICd0JywgJ2UnLCAncycsICd0JywgJ3onLCAncCcsCisgICdzJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICd6JywgJ2UnLCAncicsICdvJywgJ2EnLCAnbCcsICdsJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsCisgICd6JywgJ2UnLCAncicsICdvJywgJ3UnLCAncCcsICdwJywgJ2UnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsCisgICdyJywgJ2QnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnZCcsICdfJywgJ2QnLCAnMicsCisgICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdkJywgJ18nLCAncCcsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsCisgICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnZCcsICdfJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsCisgICd0JywgJ2gnLCAnZScsICdyJywgJ2QnLCAnXycsICdwJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsCisgICdkJywgJ18nLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnZCcsCisgICdfJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdkJywgJ18nLCAncScsICcyJywgJzUnLCAnNicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJ3EnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsCisgICdlJywgJ3InLCAncScsICdfJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsCisgICdxJywgJ18nLCAncCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAncScsICdfJywgJ3AnLCAnZCcsCisgICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJ3EnLCAnXycsICdwJywgJ3MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdxJywgJ18nLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsCisgICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAncScsICdfJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsCisgICdxJywgJ18nLCAncScsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnbCcsICdvJywgJ2EnLCAnZCcsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdsJywgJ28nLCAnYScsICdkJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ2wnLCAnbycsICdhJywgJ2QnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnbCcsCisgICdvJywgJ2EnLCAnZCcsICdxJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdzJywgJ3QnLCAnbycsCisgICdyJywgJ2UnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAncycsICd0JywgJ28nLCAncicsICdlJywgJ2QnLCAnMicsCisgICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdxJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAncScsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAncCcsCisgICdzJywgJ2EnLCAnZCcsICdiJywgJ3cnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnYycsICdrJywgJ3MnLCAncycsCisgICdkJywgJ3cnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnYycsICdrJywgJ3MnLCAncycsICd3JywgJ2InLCAnMicsCisgICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnYycsICdrJywgJ3UnLCAncycsICdkJywgJ3cnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ2EnLCAnYycsICdrJywgJ3UnLCAncycsICd3JywgJ2InLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnZCcsCisgICdkJywgJ3MnLCAnYicsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICdkJywgJ2QnLCAncycsICd3JywgJzInLCAnNScsCisgICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdhJywgJ2QnLCAnZCcsICd1JywgJ3MnLCAnYicsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsCisgICdkJywgJ2QnLCAndScsICdzJywgJ3cnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2InLCAnbCcsICdlJywgJ24nLCAnZCcsCisgICd2JywgJ2InLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2UnLCAncicsICdtJywgJ3YnLCAnYScsICdyJywgJ3MnLCAnaScsCisgICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnZScsICdyJywgJ20nLCAndicsICdhJywgJ3InLCAncycsICdmJywgJzInLCAnNScsCisgICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdoJywgJ2EnLCAnZCcsICdkJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2gnLCAnYScsCisgICdkJywgJ2QnLCAncycsICd3JywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdoJywgJ2EnLCAnZCcsICdkJywgJ3cnLCAnMicsCisgICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ2gnLCAncycsICd1JywgJ2InLCAnZCcsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnaCcsCisgICdzJywgJ3UnLCAnYicsICdzJywgJ3cnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2gnLCAncycsICd1JywgJ2InLCAndycsCisgICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdhJywgJ2QnLCAnZCcsICd1JywgJ2InLCAncycsICd3JywgJzInLCAnNScsCisgICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdtJywgJ2EnLCAnZCcsICdkJywgJ3cnLCAnZCcsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsCisgICdvJywgJ3YnLCAnbScsICdzJywgJ2snLCAnYicsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICd1JywgJ2wnLCAnZCcsCisgICdxJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ3UnLCAnbCcsICdoJywgJ3InLCAncycsICd3JywgJzInLCAnNScsCisgICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdtJywgJ3UnLCAnbCcsICdoJywgJ3cnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAndScsCisgICdsJywgJ2gnLCAndScsICd3JywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ3UnLCAnbCcsICd1JywgJ2QnLCAncScsCisgICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdhJywgJ2QnLCAnYicsICd3JywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdzJywgJ2gnLCAndScsICdmJywgJ2InLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnaScsICdnJywgJ24nLCAnYicsCisgICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdpJywgJ2cnLCAnbicsICdkJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdzJywgJ2knLCAnZycsICduJywgJ3cnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsICdsJywgJ2QnLCAnMicsCisgICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsICdsJywgJ3EnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsCisgICdsJywgJ3cnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsICdsJywgJ2QnLCAnaScsICcyJywgJzUnLCAnNicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAncycsICdsJywgJ2wnLCAncScsICdpJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ2wnLCAnbCcsCisgICd3JywgJ2knLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsICdsJywgJ3YnLCAnNCcsICdzJywgJ2knLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3MnLCAnbCcsICdsJywgJ3YnLCAnOCcsICdzJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsICdsJywgJ3YnLCAnMicsCisgICdkJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsICdsJywgJ3YnLCAnNCcsICdkJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsCisgICdhJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdhJywgJ3cnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3MnLCAncicsICdhJywgJ2QnLCAnaScsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2EnLCAndycsCisgICdpJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnYScsICd2JywgJzQnLCAncycsICdpJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdzJywgJ3InLCAnYScsICd2JywgJzgnLCAncycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsICdkJywgJzInLCAnNScsCisgICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsICdxJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsCisgICd3JywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsICdkJywgJ2knLCAnMicsICc1JywgJzYnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3MnLCAncicsICdsJywgJ3EnLCAnaScsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2wnLCAndycsCisgICdpJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsICd2JywgJzQnLCAncycsICdpJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdzJywgJ3InLCAnbCcsICd2JywgJzgnLCAncycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsICd2JywgJzInLCAnZCcsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsICd2JywgJzQnLCAnZCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3UnLCAnYicsCisgICdzJywgJ2InLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAndScsICdiJywgJ3MnLCAndycsICcyJywgJzUnLCAnNicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAncycsICd1JywgJ2InLCAndScsICdzJywgJ2InLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAndScsCisgICdiJywgJ3UnLCAncycsICd3JywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYicsICdyJywgJ28nLCAnYScsICdkJywgJ2MnLCAnYScsCisgICdzJywgJ3QnLCAnbScsICdiJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYicsICdyJywgJ28nLCAnYScsICdkJywgJ2MnLCAnYScsCisgICdzJywgJ3QnLCAnbScsICdiJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYicsICdyJywgJ28nLCAnYScsICdkJywgJ2MnLCAnYScsCisgICdzJywgJ3QnLCAnbScsICdiJywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYicsICdyJywgJ28nLCAnYScsICdkJywgJ2MnLCAnYScsCisgICdzJywgJ3QnLCAnbScsICd3JywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYicsICdyJywgJ28nLCAnYScsICdkJywgJ2MnLCAnYScsCisgICdzJywgJ3QnLCAnbScsICd3JywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYicsICdyJywgJ28nLCAnYScsICdkJywgJ2MnLCAnYScsCisgICdzJywgJ3QnLCAnbScsICd3JywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncycsICdpJywgJzInLCAncycsCisgICdkJywgJzYnLCAnNCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3MnLCAnaScsICcyJywgJ3MnLCAncycsICczJywgJzInLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdjJywgJ3YnLCAndCcsICdzJywgJ2knLCAnMicsICdzJywgJ3MnLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdjJywgJ3YnLCAndCcsCisgICd0JywgJ3MnLCAnZCcsICcyJywgJ3MnLCAnaScsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2MnLCAndicsICd0JywgJ3QnLCAncycsCisgICdkJywgJzInLCAncycsICdpJywgJzYnLCAnNCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnYycsICd2JywgJ3QnLCAndCcsICdzJywgJ2QnLCAnMicsCisgICd1JywgJ3MnLCAnaScsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2MnLCAndicsICd0JywgJ3QnLCAncycsICdkJywgJzInLCAndScsCisgICdzJywgJ2knLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdjJywgJ3YnLCAndCcsICd0JywgJ3MnLCAncycsICcyJywgJ3MnLCAnaScsCisgICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ2MnLCAndicsICd0JywgJ3QnLCAncycsICdzJywgJzInLCAncycsICdpJywgJzYnLCAnNCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAnYycsICd2JywgJ3QnLCAndCcsICdzJywgJ3MnLCAnMicsICd1JywgJ3MnLCAnaScsICczJywgJzInLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ2MnLCAndicsICd0JywgJ3QnLCAncycsICdzJywgJzInLCAndScsICdzJywgJ2knLCAnNicsICc0JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsCisgICd2JywgJ3QnLCAndScsICdzJywgJ2knLCAnMicsICdzJywgJ2QnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndScsCisgICdzJywgJ2knLCAnMicsICdzJywgJ3MnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndScsICdzJywgJ2knLCAnMicsCisgICdzJywgJ2QnLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndScsICdzJywgJ2knLCAnMicsICdzJywgJ3MnLCAnNicsCisgICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnMicsICdwJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsCisgICd4JywgJ3AnLCAnMicsICdwJywgJ3MnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsCisgICdlJywgJ3InLCAncycsICdpJywgJ3YnLCAnOCcsICdkJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsCisgICdzJywgJ2knLCAndicsICcxJywgJzYnLCAncycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAncycsCisgICdpJywgJ3YnLCAnOCcsICdkJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdzJywgJ2knLCAndicsCisgICcxJywgJzYnLCAncycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnZCcsICdpJywgJ3YnLCAnOCcsCisgICdkJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdkJywgJ2knLCAndicsICcxJywgJzYnLCAncycsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnZCcsICdpJywgJ3YnLCAnOCcsICdkJywgJ2knLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdkJywgJ2knLCAndicsICcxJywgJzYnLCAncycsICdmJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsCisgICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnMycsICdkJywgJ2knLCAndicsICcyJywgJ2QnLCAnZicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsCisgICd0JywgJ2gnLCAnZScsICdyJywgJzMnLCAnZCcsICdpJywgJ3YnLCAnMicsICdkJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsCisgICdoJywgJ2UnLCAncicsICczJywgJ2QnLCAnaScsICd2JywgJzQnLCAnZCcsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsCisgICdlJywgJ3InLCAnMycsICdkJywgJ2knLCAndicsICc0JywgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsCisgICdyJywgJzMnLCAnZCcsICdpJywgJ3YnLCAnNCcsICdzJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsCisgICczJywgJ2QnLCAnaScsICd2JywgJzQnLCAncycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnMycsCisgICdkJywgJ2knLCAndicsICc4JywgJ3MnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJzMnLCAnZCcsCisgICdpJywgJ3YnLCAnOCcsICdzJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICczJywgJ3MnLCAnaScsCisgICd2JywgJzInLCAnZCcsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnMycsICdzJywgJ2knLCAndicsCisgICcyJywgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJzMnLCAncycsICdpJywgJ3YnLCAnNCcsCisgICdkJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICczJywgJ3MnLCAnaScsICd2JywgJzQnLCAnZCcsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnMycsICdzJywgJ2knLCAndicsICc0JywgJ3MnLCAnZicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJzMnLCAncycsICdpJywgJ3YnLCAnNCcsICdzJywgJ2knLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICczJywgJ3MnLCAnaScsICd2JywgJzgnLCAncycsICdmJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsCisgICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnMycsICdzJywgJ2knLCAndicsICc4JywgJ3MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsCisgICd0JywgJ2gnLCAnZScsICdyJywgJ3AnLCAnZicsICdkJywgJ3AnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsCisgICdyJywgJ3AnLCAnZicsICdkJywgJ3AnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJ3AnLCAnZicsCisgICdxJywgJ3AnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJ3AnLCAnZicsICdxJywgJ3AnLCAncycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdhJywgJ2QnLCAnZCcsICdwJywgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYScsCisgICdkJywgJ2QnLCAncycsICdkJywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAncycsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdjJywgJ20nLCAncCcsICdzJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsCisgICdtJywgJ3AnLCAncycsICdzJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsCisgICdlJywgJ3MnLCAncycsICdxJywgJ2knLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsCisgICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywgJ3EnLCAnaScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdjJywgJ28nLCAnbScsICdwJywgJ3InLCAnZScsICdzJywgJ3MnLCAncScsICdpJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsCisgICdzJywgJ2knLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsCisgICdyJywgJ2UnLCAncycsICdzJywgJ3MnLCAnaScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdjJywgJ28nLCAnbScsICdwJywgJ3InLCAnZScsICdzJywgJ3MnLCAncycsICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdkJywgJ2YnLCAnMScsCisgICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsCisgICdzJywgJ2QnLCAnZicsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ28nLCAnbScsCisgICdwJywgJ3InLCAnZScsICdzJywgJ3MnLCAnZCcsICdmJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdzJywgJ2YnLCAnMScsICcyJywgJzgnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywgJ3MnLCAnZicsCisgICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ28nLCAnbScsICdwJywgJ3InLCAnZScsCisgICdzJywgJ3MnLCAncycsICdmJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsCisgICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdkJywgJ2knLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywgJ2QnLCAnaScsICcyJywgJzUnLCAnNicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ28nLCAnbScsICdwJywgJ3InLCAnZScsICdzJywgJ3MnLCAnZCcsCisgICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsCisgICdlJywgJ3MnLCAncycsICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAncScsICdpJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdzJywgJ3QnLCAnbycsCisgICdyJywgJ2UnLCAncScsICdpJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsCisgICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAncScsICdpJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsCisgICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAncycsICdpJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAncycsCisgICdpJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsCisgICdlJywgJ3MnLCAncycsICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAncycsICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdzJywgJ3QnLCAnbycsCisgICdyJywgJ2UnLCAnZCcsICdmJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsCisgICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAnZCcsICdmJywgJzInLCAnNScsCisgICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsCisgICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAnZCcsICdmJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAncycsCisgICdmJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsCisgICdlJywgJ3MnLCAncycsICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAncycsICdmJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdzJywgJ3QnLCAnbycsCisgICdyJywgJ2UnLCAncycsICdmJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsCisgICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAnZCcsICdpJywgJzEnLCAnMicsCisgICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsCisgICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAnZCcsICdpJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAnZCcsCisgICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsCisgICdlJywgJ3MnLCAncycsICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAnaCcsICdpJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdzJywgJ3QnLCAnbycsCisgICdyJywgJ2UnLCAnaCcsICdpJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsCisgICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAnaCcsICdpJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsCisgICdoJywgJ2knLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsCisgICdyJywgJ2UnLCAncycsICdzJywgJ2gnLCAnaScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdjJywgJ28nLCAnbScsICdwJywgJ3InLCAnZScsICdzJywgJ3MnLCAnaCcsICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdjJywgJ28nLCAnbicsICdmJywgJ2wnLCAnaScsICdjJywgJ3QnLCAncycsCisgICdpJywgJ18nLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2MnLCAnbycsCisgICduJywgJ2YnLCAnbCcsICdpJywgJ2MnLCAndCcsICdzJywgJ2knLCAnXycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnYycsICdvJywgJ24nLCAnZicsICdsJywgJ2knLCAnYycsICd0JywgJ3MnLCAnaScsCisgICdfJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdjJywgJ28nLCAnbicsCisgICdmJywgJ2wnLCAnaScsICdjJywgJ3QnLCAnZCcsICdpJywgJ18nLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdwJywgJ2MnLCAnbycsICduJywgJ2YnLCAnbCcsICdpJywgJ2MnLCAndCcsICdkJywgJ2knLCAnXycsCisgICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnYycsICdvJywgJ24nLCAnZicsCisgICdsJywgJ2knLCAnYycsICd0JywgJ2QnLCAnaScsICdfJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2MnLCAndicsICd0JywgJ2QnLCAncScsICcyJywgJ3AnLCAncycsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywgJ2QnLCAnMicsICdkJywgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdkJywgJzInLCAnZCcsICdxJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAnZCcsICcyJywgJ3AnLCAncycsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywgJ2QnLCAnMicsICdwJywgJ3MnLCAnNScsCisgICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdkJywgJzInLCAncScsCisgICdxJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAnZCcsCisgICcyJywgJ3EnLCAncScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsCisgICdwJywgJ2QnLCAnMicsICdxJywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsCisgICd2JywgJ3QnLCAncCcsICdkJywgJzInLCAndScsICdkJywgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdkJywgJzInLCAndScsICdkJywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdkJywgJzInLCAndScsICdkJywgJ3EnLCAnNScsCisgICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdkJywgJzInLCAndScsCisgICdxJywgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsCisgICdkJywgJzInLCAndScsICdxJywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsCisgICd2JywgJ3QnLCAncCcsICdkJywgJzInLCAndScsICdxJywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdzJywgJzInLCAnZCcsICdxJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAncycsICcyJywgJ2QnLCAncScsICcyJywgJzUnLCAnNicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywgJ3MnLCAnMicsICdkJywgJ3EnLCAnNScsCisgICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdzJywgJzInLCAncCcsCisgICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAncycsCisgICcyJywgJ3EnLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsCisgICdwJywgJ3MnLCAnMicsICdxJywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsCisgICd2JywgJ3QnLCAncCcsICdzJywgJzInLCAncScsICdxJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAncycsICcyJywgJ3UnLCAnZCcsICdxJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAncycsICcyJywgJ3UnLCAnZCcsICdxJywgJzInLCAnNScsCisgICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAncycsICcyJywgJ3UnLCAnZCcsCisgICdxJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAncycsCisgICcyJywgJ3UnLCAncScsICdxJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsCisgICd0JywgJ3AnLCAncycsICcyJywgJ3UnLCAncScsICdxJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAncycsICcyJywgJ3UnLCAncScsICdxJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3EnLCAncScsICcyJywgJ3AnLCAnZCcsICcxJywgJzInLCAnOCcsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdxJywgJ3EnLCAnMicsICdwJywgJ2QnLCAnMicsCisgICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncScsICdxJywgJzInLCAncCcsCisgICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3EnLCAncScsCisgICcyJywgJ3AnLCAncycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsCisgICdxJywgJ3EnLCAnMicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsCisgICd2JywgJ3QnLCAncScsICdxJywgJzInLCAncCcsICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2MnLCAndicsICd0JywgJ3MnLCAnZCcsICcyJywgJ3MnLCAncycsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdzJywgJ3MnLCAnMicsICdzJywgJ2QnLCAnXycsCisgICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsCisgICdwJywgJ2QnLCAnMicsICdkJywgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsCisgICd2JywgJ3QnLCAndCcsICdwJywgJ2QnLCAnMicsICdkJywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsICdwJywgJ2QnLCAnMicsICdxJywgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsICdwJywgJ2QnLCAnMicsICdxJywgJ3EnLCAnMicsCisgICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsICdwJywgJ2QnLCAnMicsCisgICdxJywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsCisgICdwJywgJ2QnLCAnMicsICd1JywgJ2QnLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdjJywgJ3YnLCAndCcsICd0JywgJ3AnLCAnZCcsICcyJywgJ3UnLCAnZCcsICdxJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3QnLCAncCcsICdkJywgJzInLCAndScsICdkJywgJ3EnLCAnNScsCisgICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsICdwJywgJ2QnLCAnMicsCisgICd1JywgJ3EnLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsCisgICd0JywgJ3AnLCAnZCcsICcyJywgJ3UnLCAncScsICdxJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2MnLCAndicsICd0JywgJ3QnLCAncCcsICdkJywgJzInLCAndScsICdxJywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsICdwJywgJ3MnLCAnMicsICdkJywgJ3EnLCAnNScsCisgICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsICdwJywgJ3MnLCAnMicsCisgICdxJywgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsCisgICdwJywgJ3MnLCAnMicsICdxJywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsCisgICd2JywgJ3QnLCAndCcsICdwJywgJ3MnLCAnMicsICdxJywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsICdwJywgJ3MnLCAnMicsICd1JywgJ2QnLCAncScsICcxJywgJzInLCAnOCcsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd0JywgJ3AnLCAncycsICcyJywgJ3UnLCAnZCcsCisgICdxJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3QnLCAncCcsCisgICdzJywgJzInLCAndScsICdkJywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsCisgICd2JywgJ3QnLCAndCcsICdwJywgJ3MnLCAnMicsICd1JywgJ3EnLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd0JywgJ3AnLCAncycsICcyJywgJ3UnLCAncScsICdxJywgJzInLCAnNScsCisgICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3QnLCAncCcsICdzJywgJzInLCAndScsCisgICdxJywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndScsCisgICdkJywgJ3EnLCAnMicsICdwJywgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsCisgICd2JywgJ3QnLCAndScsICdkJywgJ3EnLCAnMicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndScsICdkJywgJ3EnLCAnMicsICdwJywgJ3MnLCAnNScsICcxJywgJzInLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndScsICdxJywgJ3EnLCAnMicsICdwJywgJ2QnLCAnMScsCisgICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndScsICdxJywgJ3EnLCAnMicsCisgICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndScsCisgICdxJywgJ3EnLCAnMicsICdwJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsCisgICd2JywgJ3QnLCAndScsICdxJywgJ3EnLCAnMicsICdwJywgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndScsICdxJywgJ3EnLCAnMicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndScsICdxJywgJ3EnLCAnMicsICdwJywgJ3MnLCAnNScsCisgICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZCcsICdiJywgJ3AnLCAncycsICdhJywgJ2QnLCAnYicsCisgICd3JywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2QnLCAnYicsICdwJywgJ3MnLCAnYScsCisgICdkJywgJ2InLCAndycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdkJywgJ2InLCAncCcsCisgICdzJywgJ2EnLCAnZCcsICdiJywgJ3cnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZCcsCisgICdpJywgJ3YnLCAncCcsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2QnLCAnaScsCisgICd2JywgJ3AnLCAncycsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdkJywgJ2knLCAndicsCisgICdzJywgJ2QnLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZCcsCisgICdpJywgJ3YnLCAncycsICdzJywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ3EnLCAnaScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdlJywgJ3gnLCAncCcsICdhJywgJ24nLCAnZCcsICdxJywgJ2knLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAncScsICdpJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ3MnLCAnaScsCisgICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdlJywgJ3gnLCAncCcsICdhJywgJ24nLCAnZCcsCisgICdzJywgJ2knLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsCisgICduJywgJ2QnLCAncycsICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsCisgICdwJywgJ2EnLCAnbicsICdkJywgJ2wnLCAnbycsICdhJywgJ2QnLCAncScsICdpJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ2wnLCAnbycsICdhJywgJ2QnLCAncScsCisgICdpJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsCisgICdkJywgJ2wnLCAnbycsICdhJywgJ2QnLCAncScsICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ2wnLCAnbycsICdhJywgJ2QnLCAncycsICdpJywgJzEnLCAnMicsCisgICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ2wnLCAnbycsCisgICdhJywgJ2QnLCAncycsICdpJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsCisgICdwJywgJ2EnLCAnbicsICdkJywgJ2wnLCAnbycsICdhJywgJ2QnLCAncycsICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ2wnLCAnbycsICdhJywgJ2QnLCAnZCcsCisgICdmJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsCisgICdkJywgJ2wnLCAnbycsICdhJywgJ2QnLCAnZCcsICdmJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ2wnLCAnbycsICdhJywgJ2QnLCAnZCcsICdmJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ2wnLCAnbycsCisgICdhJywgJ2QnLCAncycsICdmJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsCisgICdwJywgJ2EnLCAnbicsICdkJywgJ2wnLCAnbycsICdhJywgJ2QnLCAncycsICdmJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ2wnLCAnbycsICdhJywgJ2QnLCAncycsCisgICdmJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsCisgICdkJywgJ2wnLCAnbycsICdhJywgJ2QnLCAnZCcsICdpJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ2wnLCAnbycsICdhJywgJ2QnLCAnZCcsICdpJywgJzInLCAnNScsCisgICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ2wnLCAnbycsCisgICdhJywgJ2QnLCAnZCcsICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsCisgICdwJywgJ2EnLCAnbicsICdkJywgJ2wnLCAnbycsICdhJywgJ2QnLCAnaCcsICdpJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ2wnLCAnbycsICdhJywgJ2QnLCAnaCcsCisgICdpJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsCisgICdkJywgJ2wnLCAnbycsICdhJywgJ2QnLCAnaCcsICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ2QnLCAnZicsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdlJywgJ3gnLCAncCcsICdhJywgJ24nLCAnZCcsICdkJywgJ2YnLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAnZCcsICdmJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ3MnLCAnZicsCisgICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdlJywgJ3gnLCAncCcsICdhJywgJ24nLCAnZCcsCisgICdzJywgJ2YnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsCisgICduJywgJ2QnLCAncycsICdmJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsCisgICdwJywgJ2EnLCAnbicsICdkJywgJ2QnLCAnaScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdlJywgJ3gnLCAncCcsICdhJywgJ24nLCAnZCcsICdkJywgJ2knLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAnZCcsICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ2gnLCAnaScsICcxJywgJzInLCAnOCcsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdlJywgJ3gnLCAncCcsICdhJywgJ24nLCAnZCcsICdoJywgJ2knLCAnMicsCisgICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAnaCcsCisgICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2YnLCAnaScsICd4JywgJ3UnLCAncCcsCisgICdpJywgJ20nLCAnbScsICdwJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZicsCisgICdpJywgJ3gnLCAndScsICdwJywgJ2knLCAnbScsICdtJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdmJywgJ2knLCAneCcsICd1JywgJ3AnLCAnaScsICdtJywgJ20nLCAncCcsICdkJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2YnLCAnaScsICd4JywgJ3UnLCAncCcsICdpJywgJ20nLCAnbScsCisgICdwJywgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZicsICdpJywgJ3gnLCAndScsCisgICdwJywgJ2knLCAnbScsICdtJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdmJywgJ2knLCAneCcsICd1JywgJ3AnLCAnaScsICdtJywgJ20nLCAncCcsICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2YnLCAnaScsICd4JywgJ3UnLCAncCcsICdpJywgJ20nLCAnbScsICdzJywgJ2QnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZicsICdpJywgJ3gnLCAndScsICdwJywgJ2knLCAnbScsICdtJywgJ3MnLCAncycsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdmJywgJ3AnLCAnYycsICdsJywgJ2EnLCAncycsICdzJywgJ3AnLCAnZCcsCisgICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdmJywgJ3AnLCAnYycsICdsJywgJ2EnLCAncycsCisgICdzJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdmJywgJ3AnLCAnYycsCisgICdsJywgJ2EnLCAncycsICdzJywgJ3AnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdmJywgJ3AnLCAnYycsICdsJywgJ2EnLCAncycsICdzJywgJ3AnLCAncycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdmJywgJ3AnLCAnYycsICdsJywgJ2EnLCAncycsICdzJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdmJywgJ3AnLCAnYycsICdsJywgJ2EnLCAncycsICdzJywgJ3AnLCAncycsCisgICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdmJywgJ3AnLCAnYycsICdsJywgJ2EnLCAncycsCisgICdzJywgJ3MnLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdmJywgJ3AnLCAnYycsICdsJywgJ2EnLCAncycsCisgICdzJywgJ3MnLCAncycsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2UnLCAndCcsICdlJywgJ3gnLCAncCcsCisgICdwJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdlJywgJ3QnLCAnZScsCisgICd4JywgJ3AnLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnZScsCisgICd0JywgJ2UnLCAneCcsICdwJywgJ3AnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdnJywgJ2UnLCAndCcsICdlJywgJ3gnLCAncCcsICdwJywgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnZycsICdlJywgJ3QnLCAnZScsICd4JywgJ3AnLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnZScsICd0JywgJ2UnLCAneCcsICdwJywgJ3AnLCAncycsICc1JywgJzEnLCAnMicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2UnLCAndCcsICdlJywgJ3gnLCAncCcsICdzJywgJ2QnLCAnMScsCisgICcyJywgJzgnLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsCisgICdlJywgJ3QnLCAnZScsICd4JywgJ3AnLCAncycsICdzJywgJzEnLCAnMicsICc4JywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsCisgICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnZScsICd0JywgJ20nLCAnYScsICduJywgJ3QnLCAncCcsCisgICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnZScsICd0JywgJ20nLCAnYScsCisgICduJywgJ3QnLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnZScsCisgICd0JywgJ20nLCAnYScsICduJywgJ3QnLCAncCcsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2cnLCAnZScsICd0JywgJ20nLCAnYScsICduJywgJ3QnLCAncCcsICdzJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnZScsICd0JywgJ20nLCAnYScsICduJywgJ3QnLCAncCcsICdzJywgJzInLCAnNScsCisgICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnZScsICd0JywgJ20nLCAnYScsICduJywgJ3QnLCAncCcsCisgICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnZScsICd0JywgJ20nLCAnYScsCisgICduJywgJ3QnLCAncycsICdkJywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2cnLCAnZScsICd0JywgJ20nLCAnYScsICduJywgJ3QnLCAncycsICdzJywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsCisgICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnYScsICd4JywgJ3AnLCAnZCcsICc1JywgJzEnLCAnMicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdtJywgJ2EnLCAneCcsICdwJywgJ3MnLCAnNScsICcxJywgJzInLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywgJ3gnLCAncycsICdkJywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsCisgICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnYScsICd4JywgJ3MnLCAncycsICdfJywgJ3InLCAnbycsCisgICd1JywgJ24nLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdtJywgJ2knLCAnbicsICdwJywgJ2QnLCAnNScsCisgICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdpJywgJ24nLCAncCcsICdzJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnaScsICduJywgJ3MnLCAnZCcsICdfJywgJ3InLCAnbycsCisgICd1JywgJ24nLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdtJywgJ2knLCAnbicsICdzJywgJ3MnLCAnXycsCisgICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICd1JywgJ2wnLCAncCcsCisgICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAndScsICdsJywgJ3AnLCAncycsCisgICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdtJywgJ3UnLCAnbCcsICdzJywgJ2QnLCAnXycsCisgICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICd1JywgJ2wnLCAncycsCisgICdzJywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsCisgICdkJywgJ2QnLCAncycsICdiJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsCisgICdkJywgJ2QnLCAncycsICd3JywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsCisgICdkJywgJ2QnLCAndScsICdzJywgJ2InLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdhJywgJ2QnLCAnZCcsICd1JywgJ3MnLCAndycsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ2UnLCAncicsICdtJywgJ3YnLCAnYScsICdyJywgJ2QnLCAnZicsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ2UnLCAncicsICdtJywgJ3YnLCAnYScsICdyJywgJ2QnLCAnZicsICc1JywgJzEnLCAnMicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2UnLCAncicsICdtJywgJ3YnLCAnYScsICdyJywgJ2QnLCAnaScsCisgICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2UnLCAncicsICdtJywgJ3YnLCAnYScsCisgICdyJywgJ2QnLCAnaScsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2UnLCAncicsCisgICdtJywgJ3YnLCAnYScsICdyJywgJ2gnLCAnaScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ2UnLCAncicsICdtJywgJ3YnLCAnYScsICdyJywgJ2gnLCAnaScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ2UnLCAncicsICdtJywgJ3YnLCAnYScsICdyJywgJ2gnLCAnaScsICc1JywgJzEnLCAnMicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2UnLCAncicsICdtJywgJ3YnLCAnYScsICdyJywgJ3EnLCAnaScsCisgICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2UnLCAncicsICdtJywgJ3YnLCAnYScsCisgICdyJywgJ3EnLCAnaScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2UnLCAncicsCisgICdtJywgJ3YnLCAnYScsICdyJywgJ3EnLCAnaScsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ2UnLCAncicsICdtJywgJ3YnLCAnYScsICdyJywgJ3MnLCAnZicsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ2UnLCAncicsICdtJywgJ3YnLCAnYScsICdyJywgJ3MnLCAnaScsICc1JywgJzEnLCAnMicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnYScsICdkJywgJ2QnLCAndScsICdiJywgJ3MnLCAndycsCisgICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnYScsICdkJywgJ2QnLCAndycsCisgICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAnZCcsCisgICdiJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAnZCcsCisgICdiJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAnZCcsCisgICdiJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAnZCcsCisgICdiJywgJzEnLCAnMicsICc4JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsCisgICdvJywgJ3YnLCAnZCcsICdiJywgJzInLCAnNScsICc2JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAnZCcsICdiJywgJzUnLCAnMScsICcyJywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAnZCcsICd3JywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAnZCcsICd3JywgJzInLCAnNScsICc2JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAnZCcsICd3JywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAnZCcsICd3JywgJzEnLCAnMicsICc4JywgJ20nLCAnZScsCisgICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAnZCcsICd3JywgJzInLCAnNScsCisgICc2JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAnZCcsCisgICd3JywgJzUnLCAnMScsICcyJywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsCisgICdvJywgJ3YnLCAncScsICdiJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsCisgICdvJywgJ3YnLCAncScsICdiJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsCisgICdvJywgJ3YnLCAncScsICdiJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsCisgICdvJywgJ3YnLCAncScsICdiJywgJzEnLCAnMicsICc4JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncScsICdiJywgJzInLCAnNScsICc2JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncScsICdiJywgJzUnLCAnMScsICcyJywgJ20nLCAnZScsCisgICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncScsICdkJywgJzEnLCAnMicsCisgICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncScsICdkJywgJzInLCAnNScsCisgICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncScsICdkJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncScsICdkJywgJzEnLCAnMicsCisgICc4JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncScsCisgICdkJywgJzInLCAnNScsICc2JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsCisgICdvJywgJ3YnLCAncScsICdkJywgJzUnLCAnMScsICcyJywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncScsICd3JywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncScsICd3JywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncScsICd3JywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncScsICd3JywgJzEnLCAnMicsICc4JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncScsICd3JywgJzInLCAnNScsICc2JywgJ20nLCAnZScsCisgICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncScsICd3JywgJzUnLCAnMScsCisgICcyJywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndycsCisgICdiJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndycsCisgICdiJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndycsCisgICdiJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndycsCisgICdiJywgJzEnLCAnMicsICc4JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsCisgICdvJywgJ3YnLCAndycsICdiJywgJzInLCAnNScsICc2JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndycsICdiJywgJzUnLCAnMScsICcyJywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdkJywgJ2InLCAnMScsICcyJywgJzgnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ2QnLCAnYicsICcyJywgJzUnLCAnNicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAnZCcsICdiJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdkJywgJ2InLCAnMScsCisgICcyJywgJzgnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsCisgICdzJywgJ2QnLCAnYicsICcyJywgJzUnLCAnNicsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAnZCcsICdiJywgJzUnLCAnMScsICcyJywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdkJywgJ3cnLCAnMScsICcyJywgJzgnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ2QnLCAndycsICcyJywgJzUnLCAnNicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAnZCcsICd3JywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdkJywgJ3cnLCAnMScsCisgICcyJywgJzgnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsCisgICdzJywgJ2QnLCAndycsICcyJywgJzUnLCAnNicsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAnZCcsICd3JywgJzUnLCAnMScsICcyJywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdxJywgJ2InLCAnMScsICcyJywgJzgnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ3EnLCAnYicsICcyJywgJzUnLCAnNicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAncScsICdiJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdxJywgJ2InLCAnMScsCisgICcyJywgJzgnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsCisgICdzJywgJ3EnLCAnYicsICcyJywgJzUnLCAnNicsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAncScsICdiJywgJzUnLCAnMScsICcyJywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdxJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ3EnLCAnZCcsICcyJywgJzUnLCAnNicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAncScsICdkJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdxJywgJ2QnLCAnMScsCisgICcyJywgJzgnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsCisgICdzJywgJ3EnLCAnZCcsICcyJywgJzUnLCAnNicsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAncScsICdkJywgJzUnLCAnMScsICcyJywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdxJywgJ3cnLCAnMScsICcyJywgJzgnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ3EnLCAndycsICcyJywgJzUnLCAnNicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAncScsICd3JywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdxJywgJ3cnLCAnMScsCisgICcyJywgJzgnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsCisgICdzJywgJ3EnLCAndycsICcyJywgJzUnLCAnNicsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAncScsICd3JywgJzUnLCAnMScsICcyJywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICd3JywgJ2InLCAnMScsICcyJywgJzgnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ3cnLCAnYicsICcyJywgJzUnLCAnNicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAndycsICdiJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICd3JywgJ2InLCAnMScsCisgICcyJywgJzgnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsCisgICdzJywgJ3cnLCAnYicsICcyJywgJzUnLCAnNicsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAndycsICdiJywgJzUnLCAnMScsICcyJywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsICdzJywgJ2QnLCAnYicsICcxJywgJzInLCAnOCcsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICdkJywgJ2InLCAnMicsCisgICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywgJ3MnLCAnZCcsCisgICdiJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsCisgICdzJywgJ2QnLCAnYicsICcxJywgJzInLCAnOCcsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICdkJywgJ2InLCAnMicsICc1JywgJzYnLCAnbScsICdlJywgJ20nLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywgJ3MnLCAnZCcsICdiJywgJzUnLCAnMScsCisgICcyJywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsCisgICdzJywgJ2QnLCAndycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsCisgICd2JywgJ3UnLCAncycsICdkJywgJ3cnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdtJywgJ28nLCAndicsICd1JywgJ3MnLCAnZCcsICd3JywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsICdzJywgJ2QnLCAndycsICcxJywgJzInLCAnOCcsICdtJywgJ2UnLCAnbScsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICdkJywgJ3cnLCAnMicsCisgICc1JywgJzYnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsCisgICd1JywgJ3MnLCAnZCcsICd3JywgJzUnLCAnMScsICcyJywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsICdzJywgJ3EnLCAnYicsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICdxJywgJ2InLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywgJ3MnLCAncScsICdiJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsICdzJywgJ3EnLCAnYicsCisgICcxJywgJzInLCAnOCcsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsCisgICd2JywgJ3UnLCAncycsICdxJywgJ2InLCAnMicsICc1JywgJzYnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywgJ3MnLCAncScsICdiJywgJzUnLCAnMScsICcyJywgJ20nLCAnZScsCisgICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsICdzJywgJ3EnLCAnZCcsCisgICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsCisgICdxJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsCisgICd1JywgJ3MnLCAncScsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsCisgICdvJywgJ3YnLCAndScsICdzJywgJ3EnLCAnZCcsICcxJywgJzInLCAnOCcsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICdxJywgJ2QnLCAnMicsICc1JywgJzYnLCAnbScsCisgICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywgJ3MnLCAncScsCisgICdkJywgJzUnLCAnMScsICcyJywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsCisgICdvJywgJ3YnLCAndScsICdzJywgJ3EnLCAndycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICdxJywgJ3cnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywgJ3MnLCAncScsICd3JywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsICdzJywgJ3EnLCAndycsICcxJywgJzInLCAnOCcsCisgICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsCisgICdxJywgJ3cnLCAnMicsICc1JywgJzYnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdtJywgJ28nLCAndicsICd1JywgJ3MnLCAncScsICd3JywgJzUnLCAnMScsICcyJywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsICdzJywgJ3cnLCAnYicsICcxJywgJzInLCAnOCcsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICd3JywgJ2InLCAnMicsCisgICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywgJ3MnLCAndycsCisgICdiJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsCisgICdzJywgJ3cnLCAnYicsICcxJywgJzInLCAnOCcsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICd3JywgJ2InLCAnMicsICc1JywgJzYnLCAnbScsICdlJywgJ20nLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywgJ3MnLCAndycsICdiJywgJzUnLCAnMScsCisgICcyJywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdtJywgJ3UnLCAnbCcsCisgICd0JywgJ2knLCAncycsICdoJywgJ2knLCAnZicsICd0JywgJ3EnLCAnYicsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnbScsICd1JywgJ2wnLCAndCcsICdpJywgJ3MnLCAnaCcsICdpJywgJ2YnLCAndCcsCisgICdxJywgJ2InLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ20nLCAndScsCisgICdsJywgJ3QnLCAnaScsICdzJywgJ2gnLCAnaScsICdmJywgJ3QnLCAncScsICdiJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncicsICdvJywgJ2wnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ3InLCAnbycsICdsJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdyJywgJ28nLCAnbCcsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAncicsICdvJywgJ2wnLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3InLCAnbycsICdsJywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdyJywgJ28nLCAnbCcsICdxJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncicsCisgICdvJywgJ2wnLCAndicsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncicsCisgICdvJywgJ2wnLCAndicsICdkJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncicsCisgICdvJywgJ2wnLCAndicsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncicsCisgICdvJywgJ2wnLCAndicsICdxJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncicsCisgICdvJywgJ2wnLCAndicsICdxJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncicsCisgICdvJywgJ2wnLCAndicsICdxJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncicsCisgICdvJywgJ3InLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3InLCAnbycsCisgICdyJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdyJywgJ28nLCAncicsCisgICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncicsICdvJywgJ3InLCAncScsCisgICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3InLCAnbycsICdyJywgJ3EnLCAnMicsCisgICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdyJywgJ28nLCAncicsICdxJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncicsICdvJywgJ3InLCAndicsICdkJywgJzEnLCAnMicsCisgICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncicsICdvJywgJ3InLCAndicsICdkJywgJzInLCAnNScsCisgICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncicsICdvJywgJ3InLCAndicsICdkJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncicsICdvJywgJ3InLCAndicsICdxJywgJzEnLCAnMicsCisgICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncicsICdvJywgJ3InLCAndicsICdxJywgJzInLCAnNScsCisgICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncicsICdvJywgJ3InLCAndicsICdxJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICd1JywgJ2InLCAncycsICdiJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICd1JywgJ2InLCAncycsICd3JywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICd1JywgJ2InLCAndScsICdzJywgJ2InLCAnNScsCisgICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3UnLCAnYicsICd1JywgJ3MnLCAndycsCisgICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3QnLCAnZScsICdyJywgJ24nLCAnbCcsCisgICdvJywgJ2cnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3QnLCAnZScsCisgICdyJywgJ24nLCAnbCcsICdvJywgJ2cnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3QnLCAnZScsICdyJywgJ24nLCAnbCcsICdvJywgJ2cnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ3QnLCAnZScsICdyJywgJ24nLCAnbCcsICdvJywgJ2cnLCAncScsICcxJywgJzInLCAnOCcsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3QnLCAnZScsICdyJywgJ24nLCAnbCcsICdvJywgJ2cnLCAncScsCisgICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3QnLCAnZScsICdyJywgJ24nLCAnbCcsCisgICdvJywgJ2cnLCAncScsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ2EnLCAnbicsCisgICdnJywgJ2UnLCAncCcsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnYScsCisgICduJywgJ2cnLCAnZScsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsCisgICdhJywgJ24nLCAnZycsICdlJywgJ3AnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdyJywgJ2EnLCAnbicsICdnJywgJ2UnLCAncCcsICdzJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3InLCAnYScsICduJywgJ2cnLCAnZScsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncicsICdhJywgJ24nLCAnZycsICdlJywgJ3AnLCAncycsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdyJywgJ2EnLCAnbicsICdnJywgJ2UnLCAncycsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAncicsCisgICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnYScsICduJywgJ2cnLCAnZScsCisgICdzJywgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncicsICdlJywgJ2QnLCAndScsICdjJywgJ2UnLCAncCcsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnZScsICdkJywgJ3UnLCAnYycsICdlJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ2UnLCAnZCcsICd1JywgJ2MnLCAnZScsICdwJywgJ2QnLCAnNScsCisgICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdlJywgJ2QnLCAndScsICdjJywgJ2UnLCAncCcsCisgICdzJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnZScsICdkJywgJ3UnLCAnYycsCisgICdlJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ2UnLCAnZCcsCisgICd1JywgJ2MnLCAnZScsICdwJywgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsCisgICdlJywgJ2QnLCAndScsICdjJywgJ2UnLCAncycsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnZScsCisgICdkJywgJ3UnLCAnYycsICdlJywgJ3MnLCAncycsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ24nLCAnZCcsCisgICdzJywgJ2MnLCAnYScsICdsJywgJ2UnLCAncCcsICdkJywgJ18nLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncicsICduJywgJ2QnLCAncycsICdjJywgJ2EnLCAnbCcsICdlJywgJ3AnLCAnZCcsICdfJywgJzInLCAnNScsCisgICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnbicsICdkJywgJ3MnLCAnYycsICdhJywgJ2wnLCAnZScsCisgICdwJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICduJywgJ2QnLCAncycsICdjJywgJ2EnLCAnbCcsCisgICdlJywgJ3AnLCAncycsICdfJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnbicsCisgICdkJywgJ3MnLCAnYycsICdhJywgJ2wnLCAnZScsICdwJywgJ3MnLCAnXycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdyJywgJ24nLCAnZCcsICdzJywgJ2MnLCAnYScsICdsJywgJ2UnLCAncCcsICdzJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnbicsICdkJywgJ3MnLCAnYycsICdhJywgJ2wnLCAnZScsICdzJywgJ2QnLCAnXycsCisgICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICduJywgJ2QnLCAncycsCisgICdjJywgJ2EnLCAnbCcsICdlJywgJ3MnLCAncycsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICdsJywgJ2UnLCAnZicsICdwJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdjJywgJ2EnLCAnbCcsICdlJywgJ2YnLCAncCcsICdkJywgJzInLCAnNScsCisgICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsICdhJywgJ2wnLCAnZScsICdmJywgJ3AnLCAnZCcsCisgICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICdsJywgJ2UnLCAnZicsCisgICdwJywgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdjJywgJ2EnLCAnbCcsCisgICdlJywgJ2YnLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsCisgICdhJywgJ2wnLCAnZScsICdmJywgJ3AnLCAncycsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdzJywgJ2MnLCAnYScsICdsJywgJ2UnLCAnZicsICdzJywgJ2QnLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdjJywgJ2EnLCAnbCcsICdlJywgJ2YnLCAncycsICdzJywgJ18nLCAncicsCisgICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAncScsICdyJywgJ3QnLCAncCcsCisgICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAncScsICdyJywgJ3QnLCAncCcsCisgICdkJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAncScsICdyJywgJ3QnLCAncCcsCisgICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAncScsICdyJywgJ3QnLCAncCcsCisgICdzJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAncScsICdyJywgJ3QnLCAncCcsCisgICdzJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAncScsICdyJywgJ3QnLCAncCcsCisgICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAncScsICdyJywgJ3QnLCAncycsCisgICdkJywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAncScsCisgICdyJywgJ3QnLCAncycsICdzJywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdzJywgJ3MnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsCisgICd1JywgJ2InLCAncCcsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAndScsCisgICdiJywgJ3AnLCAncycsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ3UnLCAnYicsCisgICdzJywgJ2QnLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsCisgICd1JywgJ2InLCAncycsICdzJywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAnYycsICd2JywgJ3QnLCAncCcsICdoJywgJzInLCAncCcsICdzJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAnYycsICd2JywgJ3QnLCAncCcsICdoJywgJzInLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnYycsICd2JywgJ3QnLCAncCcsICdoJywgJzInLCAncCcsICdzJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnYycsICd2JywgJ3QnLCAncCcsICdzJywgJzInLCAncCcsCisgICdoJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnYycsICd2JywgJ3QnLCAncCcsICdzJywgJzInLCAncCcsCisgICdoJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnYycsICd2JywgJ3QnLCAncCcsCisgICdzJywgJzInLCAncCcsICdoJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsCisgICdtJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncCcsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAncycsICcxJywgJzInLCAnOCcsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdwJywgJ3MnLCAnMicsCisgICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncCcsCisgICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsCisgICdkJywgJ3MnLCAnZCcsICczJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsCisgICdkJywgJ3MnLCAncycsICczJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsCisgICdkJywgJ3MnLCAndScsICdiJywgJ3AnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncycsICd1JywgJ2InLCAncCcsCisgICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsCisgICdkJywgJ3MnLCAndScsICdiJywgJ3AnLCAncycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncycsICd1JywgJ2InLCAncCcsCisgICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICduJywgJ20nLCAnYScsCisgICdkJywgJ2QnLCAncCcsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsCisgICduJywgJ20nLCAnYScsICdkJywgJ2QnLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAnZicsICduJywgJ20nLCAnYScsICdkJywgJ2QnLCAncCcsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICduJywgJ20nLCAnYScsICdkJywgJ2QnLCAncCcsICdzJywgJzEnLCAnMicsCisgICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICduJywgJ20nLCAnYScsICdkJywgJ2QnLCAncCcsCisgICdzJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICduJywgJ20nLCAnYScsCisgICdkJywgJ2QnLCAncCcsICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsCisgICduJywgJ20nLCAncycsICd1JywgJ2InLCAncCcsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAnZicsICduJywgJ20nLCAncycsICd1JywgJ2InLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICduJywgJ20nLCAncycsICd1JywgJ2InLCAncCcsICdkJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICduJywgJ20nLCAncycsICd1JywgJ2InLCAncCcsCisgICdzJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICduJywgJ20nLCAncycsCisgICd1JywgJ2InLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsCisgICduJywgJ20nLCAncycsICd1JywgJ2InLCAncCcsICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAncCcsICdkJywgJ3AnLCAnYicsICd1JywgJ3MnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZCcsICdwJywgJ2InLCAndScsICdzJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2QnLCAncCcsICdiJywgJ3UnLCAncycsICdkJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdkJywgJ3AnLCAnYicsICd1JywgJ3MnLCAnZCcsCisgICdzJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdkJywgJ3AnLCAnYicsCisgICd1JywgJ3MnLCAnZCcsICdzJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsCisgICdkJywgJ3AnLCAnYicsICd1JywgJ3MnLCAnZCcsICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAncCcsICdkJywgJ3AnLCAndycsICdzJywgJ3MnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZCcsICdwJywgJ3cnLCAncycsICdzJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2QnLCAncCcsICd3JywgJ3MnLCAncycsICdkJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdkJywgJ3AnLCAndycsICdzJywgJ3MnLCAnZCcsCisgICdzJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdkJywgJ3AnLCAndycsCisgICdzJywgJ3MnLCAnZCcsICdzJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsCisgICdkJywgJ3AnLCAndycsICdzJywgJ3MnLCAnZCcsICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICdpJywgJzInLCAndicsICdhJywgJ3InLCAnZCcsICcxJywgJzInLCAnOCcsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAnaScsICcyJywgJ3YnLCAnYScsCisgICdyJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsCisgICdtJywgJ2knLCAnMicsICd2JywgJ2EnLCAncicsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICdpJywgJzInLCAndicsICdhJywgJ3InLCAnaCcsICdpJywgJzEnLCAnMicsCisgICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICdpJywgJzInLCAndicsCisgICdhJywgJ3InLCAnaCcsICdpJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsCisgICdlJywgJ3InLCAnbScsICdpJywgJzInLCAndicsICdhJywgJ3InLCAnaCcsICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICdpJywgJzInLCAndicsICdhJywgJ3InLCAncCcsCisgICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsCisgICdpJywgJzInLCAndicsICdhJywgJ3InLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICdpJywgJzInLCAndicsICdhJywgJ3InLCAncCcsICdkJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICdpJywgJzInLCAndicsCisgICdhJywgJ3InLCAncCcsICdzJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsCisgICdlJywgJ3InLCAnbScsICdpJywgJzInLCAndicsICdhJywgJ3InLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICdpJywgJzInLCAndicsICdhJywgJ3InLCAncCcsCisgICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsCisgICdpJywgJzInLCAndicsICdhJywgJ3InLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAnaScsICcyJywgJ3YnLCAnYScsICdyJywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ2knLCAnMicsICd2JywgJ2EnLCAncicsCisgICdxJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsCisgICdpJywgJzInLCAndicsICdhJywgJ3InLCAncScsICdpJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICdpJywgJzInLCAndicsICdhJywgJ3InLCAncScsICdpJywgJzInLCAnNScsCisgICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICdpJywgJzInLCAndicsCisgICdhJywgJ3InLCAncScsICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsCisgICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAndCcsICcyJywgJ3YnLCAnYScsICdyJywgJ2QnLCAnMicsCisgICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsCisgICd2JywgJ2EnLCAncicsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsCisgICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAnaCcsICdpJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAnaCcsCisgICdpJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsCisgICd0JywgJzInLCAndicsICdhJywgJ3InLCAnaCcsICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAncCcsICdkJywgJzEnLCAnMicsCisgICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsCisgICdhJywgJ3InLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsCisgICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAncCcsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAncCcsCisgICdzJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsCisgICd0JywgJzInLCAndicsICdhJywgJ3InLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAncCcsICdzJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsCisgICdhJywgJ3InLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsCisgICdyJywgJ20nLCAndCcsICcyJywgJ3YnLCAnYScsICdyJywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdxJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsCisgICdhJywgJ3InLCAncScsICdpJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsCisgICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAncScsICdpJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAncScsCisgICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdtJywgJ2EnLCAnZCcsCisgICdkJywgJzUnLCAnMicsICdoJywgJ3UnLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAnbScsICdhJywgJ2QnLCAnZCcsICc1JywgJzInLCAnaCcsICd1JywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ20nLCAnYScsICdkJywgJ2QnLCAnNScsICcyJywgJ2gnLCAndScsCisgICdxJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdtJywgJ2EnLCAnZCcsCisgICdkJywgJzUnLCAnMicsICdsJywgJ3UnLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAnbScsICdhJywgJ2QnLCAnZCcsICc1JywgJzInLCAnbCcsICd1JywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ20nLCAnYScsICdkJywgJ2QnLCAnNScsICcyJywgJ2wnLCAndScsCisgICdxJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsCisgICdkJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsCisgICdsJywgJ2QnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsCisgICdoJywgJ2wnLCAnZCcsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsCisgICdzJywgJ2gnLCAnbCcsICdkJywgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsCisgICdwJywgJ3MnLCAnaCcsICdsJywgJ2QnLCAncScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAncycsICdoJywgJ2wnLCAnZCcsICdxJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsICdkJywgJ3cnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdsJywgJ2QnLCAndycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ2wnLCAnZCcsICd3JywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsICdkJywgJ3YnLCAnZCcsICcxJywgJzInLCAnOCcsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ2wnLCAnZCcsICd2JywgJ2QnLCAnMicsCisgICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdsJywgJ2QnLCAndicsCisgICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsCisgICdkJywgJ3YnLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsCisgICdoJywgJ2wnLCAnZCcsICd2JywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsCisgICdwJywgJ3MnLCAnaCcsICdsJywgJ2QnLCAndicsICdxJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsICdkJywgJ3YnLCAndycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ2wnLCAnZCcsICd2JywgJ3cnLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdsJywgJ2QnLCAndicsICd3JywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAncicsICdkJywgJ2QnLCAnMScsCisgICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdyJywgJ2QnLCAnZCcsCisgICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ3InLCAnZCcsCisgICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAncicsCisgICdkJywgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsCisgICdyJywgJ2QnLCAncScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsCisgICdoJywgJ3InLCAnZCcsICdxJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsCisgICdzJywgJ2gnLCAncicsICdkJywgJ3cnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsCisgICdwJywgJ3MnLCAnaCcsICdyJywgJ2QnLCAndycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAncycsICdoJywgJ3InLCAnZCcsICd3JywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAncicsICdkJywgJ3YnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ3InLCAnZCcsICd2JywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdyJywgJ2QnLCAndicsICdkJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAncicsICdkJywgJ3YnLCAncScsCisgICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ3InLCAnZCcsCisgICd2JywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsCisgICdyJywgJ2QnLCAndicsICdxJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsCisgICdzJywgJ2gnLCAncicsICdkJywgJ3YnLCAndycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAncycsICdoJywgJ3InLCAnZCcsICd2JywgJ3cnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdyJywgJ2QnLCAndicsICd3JywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAndScsICdmJywgJ2InLCAnaScsICd0JywgJ3EnLCAnbScsCisgICdiJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAndScsCisgICdmJywgJ2InLCAnaScsICd0JywgJ3EnLCAnbScsICdiJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAndScsICdmJywgJ2InLCAnaScsICd0JywgJ3EnLCAnbScsICdiJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAnZCcsCisgICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsCisgICdkJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsCisgICdtJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnMycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAncycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAncycsCisgICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsCisgICdkJywgJ3MnLCAnZCcsICczJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsCisgICdkJywgJ2QnLCAncycsICdzJywgJzMnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsCisgICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywgJ2QnLCAnMicsCisgICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsCisgICdzJywgJ3UnLCAnYicsICdwJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsCisgICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsCisgICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdzJywgJ3UnLCAnYicsICdwJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdzJywgJ3UnLCAnYicsICdwJywgJ2QnLCAnMicsCisgICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdzJywgJ3UnLCAnYicsCisgICdwJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsCisgICdzJywgJ3UnLCAnYicsICdwJywgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ2YnLCAnbScsICdzJywgJ3UnLCAnYicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdzJywgJ3UnLCAnYicsICdwJywgJ3MnLCAnNScsICcxJywgJzInLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdzJywgJ3UnLCAnYicsICdzJywgJ2QnLCAnMycsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ3MnLCAndScsICdiJywgJ3MnLCAncycsCisgICczJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAncycsICd1JywgJ2InLCAnYScsCisgICdkJywgJ2QnLCAncCcsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsCisgICdmJywgJ20nLCAncycsICd1JywgJ2InLCAnYScsICdkJywgJ2QnLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAncycsICd1JywgJ2InLCAnYScsICdkJywgJ2QnLCAncCcsCisgICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAncycsCisgICd1JywgJ2InLCAnYScsICdkJywgJ2QnLCAncCcsICdzJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICczJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdmJywgJ20nLCAncycsICd1JywgJ2InLCAnYScsICdkJywgJ2QnLCAncCcsICdzJywgJzInLCAnNScsCisgICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAncycsICd1JywgJ2InLCAnYScsCisgICdkJywgJ2QnLCAncCcsICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsCisgICdmJywgJ24nLCAnbScsICdzJywgJ3UnLCAnYicsICdwJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbicsICdtJywgJ3MnLCAndScsICdiJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICduJywgJ20nLCAncycsICd1JywgJ2InLCAncCcsCisgICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ24nLCAnbScsCisgICdzJywgJ3UnLCAnYicsICdwJywgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ2YnLCAnbicsICdtJywgJ3MnLCAndScsICdiJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICduJywgJ20nLCAncycsICd1JywgJ2InLCAncCcsICdzJywgJzUnLCAnMScsCisgICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ24nLCAnbScsICdzJywgJ3UnLCAnYicsCisgICdzJywgJ2QnLCAnMycsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICduJywgJ20nLCAncycsCisgICd1JywgJ2InLCAncycsICdzJywgJzMnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdmJywgJ2knLCAneCcsCisgICd1JywgJ3AnLCAnaScsICdtJywgJ20nLCAncCcsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnZicsICdpJywgJ3gnLCAndScsICdwJywgJ2knLCAnbScsICdtJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2YnLCAnaScsICd4JywgJ3UnLCAncCcsICdpJywgJ20nLCAnbScsCisgICdwJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdmJywgJ2knLCAneCcsCisgICd1JywgJ3AnLCAnaScsICdtJywgJ20nLCAncCcsICdzJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnZicsICdpJywgJ3gnLCAndScsICdwJywgJ2knLCAnbScsICdtJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2YnLCAnaScsICd4JywgJ3UnLCAncCcsICdpJywgJ20nLCAnbScsCisgICdwJywgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdmJywgJ2knLCAneCcsCisgICd1JywgJ3AnLCAnaScsICdtJywgJ20nLCAncycsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZicsCisgICdpJywgJ3gnLCAndScsICdwJywgJ2knLCAnbScsICdtJywgJ3MnLCAncycsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAndCcsICdlJywgJ3InLCAnbicsICdsJywgJ28nLCAnZycsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICd0JywgJ2UnLCAncicsICduJywgJ2wnLCAnbycsICdnJywgJ2QnLCAnMicsCisgICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3QnLCAnZScsICdyJywgJ24nLCAnbCcsCisgICdvJywgJ2cnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAndCcsCisgICdlJywgJ3InLCAnbicsICdsJywgJ28nLCAnZycsICdxJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICd0JywgJ2UnLCAncicsICduJywgJ2wnLCAnbycsICdnJywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3QnLCAnZScsICdyJywgJ24nLCAnbCcsICdvJywgJ2cnLCAncScsCisgICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsCisgICdkJywgJ3AnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsCisgICdtJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAncycsICcxJywgJzInLCAnOCcsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAncycsCisgICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsCisgICdkJywgJ3AnLCAncycsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsCisgICdtJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAnZCcsICczJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsCisgICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncycsICdzJywgJzMnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsCisgICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsCisgICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywgJ3MnLCAnMScsCisgICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsCisgICdzJywgJ3UnLCAnYicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywgJ3MnLCAnNScsICcxJywgJzInLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZCcsICdwJywgJ2InLCAndScsICdzJywgJ2QnLCAnMScsCisgICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZCcsICdwJywgJ2InLCAndScsCisgICdzJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZCcsCisgICdwJywgJ2InLCAndScsICdzJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAnZCcsICdwJywgJ2InLCAndScsICdzJywgJ2QnLCAncycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdkJywgJ3AnLCAnYicsICd1JywgJ3MnLCAnZCcsICdzJywgJzInLCAnNScsCisgICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2QnLCAncCcsICdiJywgJ3UnLCAncycsCisgICdkJywgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZCcsCisgICdwJywgJ3cnLCAncycsICdzJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAnZCcsICdwJywgJ3cnLCAncycsICdzJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZCcsICdwJywgJ3cnLCAncycsICdzJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZCcsICdwJywgJ3cnLCAncycsICdzJywgJ2QnLCAncycsCisgICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdkJywgJ3AnLCAndycsCisgICdzJywgJ3MnLCAnZCcsICdzJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsCisgICdwJywgJ2QnLCAncCcsICd3JywgJ3MnLCAncycsICdkJywgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAndCcsICcyJywgJ3YnLCAnYScsICdyJywgJ2QnLCAnMScsCisgICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAndCcsCisgICcyJywgJ3YnLCAnYScsICdyJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAndCcsICcyJywgJ3YnLCAnYScsICdyJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAndCcsICcyJywgJ3YnLCAnYScsCisgICdyJywgJ2gnLCAnaScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsCisgICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAnaCcsICdpJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsCisgICdoJywgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsCisgICdyJywgJ20nLCAndCcsICcyJywgJ3YnLCAnYScsICdyJywgJ3AnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAncCcsCisgICdkJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsCisgICdtJywgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdwJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAndCcsICcyJywgJ3YnLCAnYScsICdyJywgJ3AnLCAncycsCisgICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsCisgICd0JywgJzInLCAndicsICdhJywgJ3InLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdwJywgJ3MnLCAnNScsCisgICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAndCcsCisgICcyJywgJ3YnLCAnYScsICdyJywgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAndCcsICcyJywgJ3YnLCAnYScsICdyJywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAndCcsICcyJywgJ3YnLCAnYScsCisgICdyJywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsCisgICdyJywgJ20nLCAndCcsICcyJywgJ3YnLCAnYScsICdyJywgJ3EnLCAnaScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAncScsCisgICdpJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsCisgICdtJywgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdxJywgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnbScsICdhJywgJ2QnLCAnZCcsICc1JywgJzInLCAnaCcsICd1JywgJ3EnLCAnMScsCisgICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnbScsICdhJywgJ2QnLCAnZCcsCisgICc1JywgJzInLCAnaCcsICd1JywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAnbScsICdhJywgJ2QnLCAnZCcsICc1JywgJzInLCAnaCcsICd1JywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnbScsICdhJywgJ2QnLCAnZCcsICc1JywgJzInLCAnbCcsCisgICd1JywgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnbScsCisgICdhJywgJ2QnLCAnZCcsICc1JywgJzInLCAnbCcsICd1JywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnbScsICdhJywgJ2QnLCAnZCcsICc1JywgJzInLCAnbCcsICd1JywgJ3EnLCAnNScsCisgICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ2wnLCAnZCcsCisgICd2JywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsCisgICdoJywgJ2wnLCAnZCcsICd2JywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAncycsICdoJywgJ2wnLCAnZCcsICd2JywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ2wnLCAnZCcsICd2JywgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ2wnLCAnZCcsICd2JywgJ3EnLCAnMicsCisgICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ2wnLCAnZCcsCisgICd2JywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsCisgICdoJywgJ2wnLCAnZCcsICd2JywgJ3cnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAncycsICdoJywgJ2wnLCAnZCcsICd2JywgJ3cnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ2wnLCAnZCcsICd2JywgJ3cnLCAnNScsICcxJywgJzInLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ3InLCAnZCcsICd2JywgJ2QnLCAnMScsCisgICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ3InLCAnZCcsCisgICd2JywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsCisgICdoJywgJ3InLCAnZCcsICd2JywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAncycsICdoJywgJ3InLCAnZCcsICd2JywgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ3InLCAnZCcsICd2JywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ3InLCAnZCcsICd2JywgJ3EnLCAnNScsCisgICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ3InLCAnZCcsCisgICd2JywgJ3cnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsCisgICdoJywgJ3InLCAnZCcsICd2JywgJ3cnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAncycsICdoJywgJ3InLCAnZCcsICd2JywgJ3cnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsCisgICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnYycsICdrJywgJ3MnLCAncycsICdkJywgJ3cnLCAnNScsICcxJywgJzInLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ2EnLCAnYycsICdrJywgJ3MnLCAncycsICd3JywgJ2InLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnYycsCisgICdrJywgJ3UnLCAncycsICdkJywgJ3cnLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnYycsICdrJywgJ3UnLCAncycsCisgICd3JywgJ2InLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAndScsICdsJywgJ2QnLCAncScsICc1JywgJzEnLCAnMicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAnbScsICd1JywgJ2wnLCAnaCcsICdyJywgJ3MnLCAndycsICc1JywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsCisgICd1JywgJ2wnLCAnaCcsICd3JywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ3UnLCAnbCcsICdoJywgJ3UnLCAndycsCisgICc1JywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICd1JywgJ2wnLCAndScsICdkJywgJ3EnLCAnNScsICcxJywgJzInLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3MnLCAnYScsICdkJywgJ2InLCAndycsICc1JywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdoJywgJ3UnLCAnZicsCisgICdiJywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ2wnLCAnbCcsICdkJywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdzJywgJ2wnLCAnbCcsICdxJywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ2wnLCAnbCcsICd3JywgJzUnLCAnMScsCisgICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdzJywgJ2wnLCAnbCcsICdkJywgJ2knLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsCisgICdsJywgJ3EnLCAnaScsICc1JywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywgJ2wnLCAndycsICdpJywgJzUnLCAnMScsCisgICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdzJywgJ2wnLCAnbCcsICd2JywgJzEnLCAnNicsICdzJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsCisgICdsJywgJ3YnLCAnOCcsICdkJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsICdsJywgJ3YnLCAnOCcsICdoJywgJ2knLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3MnLCAnbCcsICdsJywgJ3YnLCAnMScsICc2JywgJ2gnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywgJ2wnLCAndicsCisgICczJywgJzInLCAnaCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnYScsICdkJywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdzJywgJ3InLCAnYScsICdxJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnYScsICdxJywgJzInLCAnNScsCisgICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnYScsICdxJywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnYScsCisgICd3JywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnYScsICdkJywgJ2knLCAnNScsICcxJywgJzInLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3MnLCAncicsICdhJywgJ3EnLCAnaScsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2EnLCAncScsCisgICdpJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnYScsICdxJywgJ2knLCAnNScsICcxJywgJzInLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3MnLCAncicsICdhJywgJ3cnLCAnaScsICc1JywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2EnLCAndicsCisgICcxJywgJzYnLCAncycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnYScsICd2JywgJ3EnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3MnLCAncicsICdhJywgJ3YnLCAncScsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2EnLCAndicsCisgICc4JywgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2EnLCAndicsICc4JywgJ2gnLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsCisgICdyJywgJ2EnLCAndicsICcxJywgJzYnLCAnaCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnYScsICd2JywgJzMnLCAnMicsCisgICdoJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdsJywgJ2QnLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsCisgICdsJywgJ3EnLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdsJywgJ3cnLCAnNScsICcxJywgJzInLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3MnLCAncicsICdsJywgJ2QnLCAnaScsICc1JywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2wnLCAncScsCisgICdpJywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsICd3JywgJ2knLCAnNScsICcxJywgJzInLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3MnLCAncicsICdsJywgJ3YnLCAnMScsICc2JywgJ3MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2wnLCAndicsCisgICc4JywgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2wnLCAndicsICc4JywgJ2gnLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsCisgICdyJywgJ2wnLCAndicsICcxJywgJzYnLCAnaCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsICd2JywgJzMnLCAnMicsCisgICdoJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdyJywgJ2MnLCAncCcsICcxJywgJzQnLCAncCcsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsCisgICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnYycsICdwJywgJzEnLCAnNCcsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdjJywgJ3AnLCAnMScsICc0JywgJ3AnLCAnZCcsICc1JywgJzEnLCAnMicsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ2MnLCAncCcsICcxJywgJzQnLCAncCcsICdzJywgJzEnLCAnMicsCisgICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnYycsICdwJywgJzEnLCAnNCcsICdwJywgJ3MnLCAnMicsCisgICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdjJywgJ3AnLCAnMScsICc0JywgJ3AnLCAncycsCisgICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ2MnLCAncCcsICcxJywgJzQnLCAncycsCisgICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnYycsICdwJywgJzEnLCAnNCcsICdzJywgJ3MnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdjJywgJ3AnLCAnMicsICc4JywgJ3AnLCAnZCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdyJywgJ2MnLCAncCcsICcyJywgJzgnLCAncCcsICdzJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3InLCAnYycsICdwJywgJzInLCAnOCcsICdzJywgJ2QnLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsCisgICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdjJywgJ3AnLCAnMicsICc4JywgJ3MnLCAncycsICdfJywgJ3InLCAnbycsCisgICd1JywgJ24nLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ3MnLCAncScsICdyJywgJ3QnLCAnMScsCisgICc0JywgJ3AnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ3MnLCAncScsCisgICdyJywgJ3QnLCAnMScsICc0JywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdyJywgJ3MnLCAncScsICdyJywgJ3QnLCAnMScsICc0JywgJ3AnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdyJywgJ3MnLCAncScsICdyJywgJ3QnLCAnMScsICc0JywgJ3AnLCAncycsICcxJywgJzInLCAnOCcsCisgICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ3MnLCAncScsICdyJywgJ3QnLCAnMScsICc0JywgJ3AnLCAncycsCisgICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ3MnLCAncScsICdyJywgJ3QnLCAnMScsCisgICc0JywgJ3AnLCAncycsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ3MnLCAncScsCisgICdyJywgJ3QnLCAnMScsICc0JywgJ3MnLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ3MnLCAncScsCisgICdyJywgJ3QnLCAnMScsICc0JywgJ3MnLCAncycsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ3MnLCAncScsCisgICdyJywgJ3QnLCAnMicsICc4JywgJ3AnLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ3MnLCAncScsCisgICdyJywgJ3QnLCAnMicsICc4JywgJ3AnLCAncycsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ3MnLCAncScsCisgICdyJywgJ3QnLCAnMicsICc4JywgJ3MnLCAnZCcsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywgJ20nLCAnYScsCisgICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdyJywgJ3MnLCAncScsICdyJywgJ3QnLCAnMicsICc4JywgJ3MnLCAncycsICdfJywgJ3InLCAnbycsCisgICd1JywgJ24nLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsCisgICdyJywgJ3MnLCAnaScsICd2JywgJzgnLCAnZCcsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsCisgICdzJywgJ2knLCAndicsICcxJywgJzYnLCAncycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsCisgICdzJywgJ2knLCAndicsICc4JywgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAncycsCisgICdpJywgJ3YnLCAnMScsICc2JywgJ3MnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnZCcsCisgICdpJywgJ3YnLCAnOCcsICdkJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ2QnLCAnaScsCisgICd2JywgJzEnLCAnNicsICdzJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ2QnLCAnaScsCisgICd2JywgJzgnLCAnZCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdkJywgJ2knLCAndicsCisgICcxJywgJzYnLCAncycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdkJywgJ2knLCAndicsCisgICcyJywgJ2QnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnZCcsICdpJywgJ3YnLCAnMicsCisgICdkJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ2QnLCAnaScsICd2JywgJzQnLCAnZCcsCisgICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdkJywgJ2knLCAndicsICc0JywgJ2QnLCAnaScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnZCcsICdpJywgJ3YnLCAnNCcsICdzJywgJ2YnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ2QnLCAnaScsICd2JywgJzQnLCAncycsICdpJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsCisgICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdkJywgJ2knLCAndicsICc4JywgJ3MnLCAnZicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsCisgICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnZCcsICdpJywgJ3YnLCAnOCcsICdzJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsCisgICd0JywgJ3QnLCAnZScsICdyJywgJ3AnLCAnZicsICdkJywgJ3AnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsCisgICdlJywgJ3InLCAncCcsICdmJywgJ2QnLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsCisgICdwJywgJ2YnLCAncScsICdwJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ3AnLCAnZicsCisgICdxJywgJ3AnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAncycsICdpJywgJ3YnLCAnMicsCisgICdkJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ3MnLCAnaScsICd2JywgJzInLCAnZCcsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdzJywgJ2knLCAndicsICc0JywgJ2QnLCAnZicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAncycsICdpJywgJ3YnLCAnNCcsICdkJywgJ2knLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ3MnLCAnaScsICd2JywgJzQnLCAncycsICdmJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsCisgICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdzJywgJ2knLCAndicsICc0JywgJ3MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsCisgICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAncycsICdpJywgJ3YnLCAnOCcsICdzJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsCisgICd0JywgJ3QnLCAnZScsICdyJywgJ3MnLCAnaScsICd2JywgJzgnLCAncycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdjJywgJ28nLCAnbScsCisgICdpJywgJ3MnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnYycsICdvJywgJ20nLCAnaScsICdzJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2MnLCAndicsCisgICd0JywgJ3MnLCAnZCcsICcyJywgJ3MnLCAnaScsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2MnLCAndicsICd0JywgJ3MnLCAnZCcsCisgICcyJywgJ3MnLCAnaScsICc2JywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2MnLCAndicsICd0JywgJ3MnLCAnZCcsICcyJywgJ3UnLCAncycsCisgICdpJywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnYycsICd2JywgJ3QnLCAncycsICdkJywgJzInLCAndScsICdzJywgJ2knLCAnNicsCisgICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdjJywgJ3YnLCAndCcsICdzJywgJ3MnLCAnMicsICdzJywgJ2knLCAnMycsICcyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsCisgICdjJywgJ3YnLCAndCcsICdzJywgJ3MnLCAnMicsICdzJywgJ2knLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdjJywgJ3YnLCAndCcsCisgICdzJywgJ3MnLCAnMicsICd1JywgJ3MnLCAnaScsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2MnLCAndicsICd0JywgJ3MnLCAncycsCisgICcyJywgJ3UnLCAncycsICdpJywgJzYnLCAnNCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICdpJywgJ2wnLCAndicsCisgICdhJywgJ3InLCAncCcsICdkJywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ2knLCAnbCcsCisgICd2JywgJ2EnLCAncicsICdwJywgJ3MnLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdiJywgJ2UnLCAneCcsICd0JywgJ3InLCAnXycsCisgICd1JywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2InLCAnZScsICd4JywgJ3QnLCAncicsICdfJywgJ3UnLCAnNicsICc0JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYicsCisgICd6JywgJ2gnLCAnaScsICdfJywgJ3MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2InLCAneicsICdoJywgJ2knLCAnXycsICdkJywgJ2knLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ2QnLCAnZScsICdwJywgJ18nLCAncycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdkJywgJ2UnLCAncCcsICdfJywgJ2QnLCAnaScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAnZScsICd4JywgJ3QnLCAnXycsICdzJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2UnLCAneCcsICd0JywgJ18nLCAnZCcsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnYycsICdsJywgJ2YnLCAnbCcsICd1JywgJ3MnLCAnaCcsICdvJywgJ3AnLCAndCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbCcsCisgICdyJywgJ3MnLCAncycsICdiJywgJ3MnLCAneScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbCcsICd3JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ2wnLCAneicsCisgICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnZScsICdmJywgJ2wnLCAnYScsICdnJywgJ3MnLCAnXycsCisgICd1JywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnZScsICdmJywgJ2wnLCAnYScsICdnJywgJ3MnLCAnXycsCisgICd1JywgJzYnLCAnNCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3cnLCAncicsICdpJywgJ3QnLCAnZScsICdlJywgJ2YnLCAnbCcsICdhJywgJ2cnLCAncycsCisgICdfJywgJ3UnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndycsICdyJywgJ2knLCAndCcsICdlJywgJ2UnLCAnZicsICdsJywgJ2EnLCAnZycsCisgICdzJywgJ18nLCAndScsICc2JywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdwJywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsCisgICdhJywgJ2QnLCAnZCcsICdwJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdwJywgJ3MnLCAnMicsCisgICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ2QnLCAnMycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsCisgICdtJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAncycsICczJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncycsCisgICd1JywgJ2InLCAncCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncycsICd1JywgJ2InLCAncCcsCisgICdkJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncycsICd1JywgJ2InLCAncCcsCisgICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncycsICd1JywgJ2InLCAncCcsICdzJywgJzInLCAnNScsCisgICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsCisgICdkJywgJ2QnLCAncycsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZicsICd4JywgJ3InLCAncycsICd0JywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2YnLCAneCcsCisgICdyJywgJ3MnLCAndCcsICdvJywgJ3InLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZicsICd4JywgJ3MnLCAnYScsICd2JywgJ2UnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdmJywgJ3gnLCAncycsICdhJywgJ3YnLCAnZScsICc2JywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdpJywgJ24nLCAnYycsICdzJywgJ3MnLCAncCcsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnaScsICduJywgJ2MnLCAncycsICdzJywgJ3AnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2wnLCAnbCcsICd3JywgJ3AnLCAnYycsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnbCcsICd3JywgJ3AnLCAnaScsICduJywgJ3MnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbCcsICd3JywgJ3AnLCAnaScsCisgICduJywgJ3MnLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbCcsICd3JywgJ3AnLCAndicsICdhJywgJ2wnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbCcsCisgICd3JywgJ3AnLCAndicsICdhJywgJ2wnLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICdtJywgJ20nLCAncycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2YnLCAnZScsCisgICdtJywgJ20nLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnbScsICdvJywgJ3YnLCAncScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnbycsCisgICd2JywgJ24nLCAndCcsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywgJ2MnLCAnaycsICdzJywgJ3MnLCAnZCcsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdhJywgJ2MnLCAnaycsICdzJywgJ3MnLCAndycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywgJ2MnLCAnaycsICd1JywgJ3MnLCAndycsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdhJywgJ2QnLCAnZCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywgJ2QnLCAnZCcsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdhJywgJ2QnLCAnZCcsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywgJ2QnLCAnZCcsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywgJ2QnLCAnZCcsCisgICdzJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICdkJywgJ2QnLCAndScsCisgICdzJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnZCcsICdkJywgJ3UnLCAncycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywgJ2wnLCAnaScsCisgICdnJywgJ24nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnbicsICdkJywgJ24nLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ2EnLCAndicsICdnJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAndicsICdnJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2MnLCAnbScsCisgICdwJywgJ2UnLCAncScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdjJywgJ20nLCAncCcsICdlJywgJ3EnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYycsCisgICdtJywgJ3AnLCAnZScsICdxJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2MnLCAnbScsICdwJywgJ2cnLCAndCcsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdjJywgJ20nLCAncCcsICdnJywgJ3QnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ2UnLCAnYycsICdfJywgJ2UnLCAneCcsICd0JywgJ18nLCAndicsICc0JywgJ2gnLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZScsCisgICdjJywgJ18nLCAncycsICdlJywgJ3QnLCAnXycsICd2JywgJzQnLCAnaCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ2EnLCAnZCcsCisgICdkJywgJ3cnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdhJywgJ3gnLCAncycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ2EnLCAneCcsCisgICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ20nLCAnaScsICduJywgJ3MnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdpJywgJ24nLCAndScsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdtJywgJ3MnLCAnaycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ3UnLCAnbCcsCisgICdoJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ20nLCAndScsICdsJywgJ2gnLCAndScsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ3UnLCAnbCcsCisgICdsJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ20nLCAndScsICdsJywgJ3UnLCAnZCcsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdvJywgJ3InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3MnLCAnYScsICdkJywgJ2InLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywgJ2wnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsCisgICdsJywgJ2wnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywgJ2wnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywgJ2wnLCAnZCcsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdzJywgJ2wnLCAnbCcsICdxJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsICdsJywgJ3cnLCAnaScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAncycsICdyJywgJ2EnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2EnLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsCisgICdyJywgJ2EnLCAnZCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnYScsICd3JywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsCisgICdsJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdsJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdsJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3MnLCAncicsICdsJywgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2wnLCAncScsICdpJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdzJywgJ3InLCAnbCcsICd3JywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAndScsICdiJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAndScsCisgICdiJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ3MnLCAndScsICdiJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAndScsICdiJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3MnLCAndScsICdiJywgJ3MnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICd1JywgJ2InLCAncycsICd3JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdzJywgJ3UnLCAnYicsICd1JywgJ3MnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICd1JywgJ2InLCAndScsICdzJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3UnLCAnbicsICdwJywgJ2MnLCAnaycsICdoJywgJ2InLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAndScsICduJywgJ3AnLCAnYycsCisgICdrJywgJ2gnLCAnZCcsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICd1JywgJ24nLCAncCcsICdjJywgJ2snLCAnaCcsICd3JywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3UnLCAnbicsICdwJywgJ2MnLCAnaycsICdsJywgJ2InLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAndScsICduJywgJ3AnLCAnYycsCisgICdrJywgJ2wnLCAnZCcsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICd1JywgJ24nLCAncCcsICdjJywgJ2snLCAnbCcsICd3JywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3gnLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdvJywgJ24nLCAnaScsICd0JywgJ28nLCAncicsICd4JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsCisgICd3JywgJ2EnLCAnaScsICd0JywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2MnLCAnbCcsICdtJywgJ3UnLCAnbCcsICdxJywgJ2QnLCAncScsCisgICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYycsICdsJywgJ20nLCAndScsICdsJywgJ3EnLCAnZCcsICdxJywgJzInLCAnNScsCisgICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdjJywgJ2wnLCAnbScsICd1JywgJ2wnLCAncScsICdkJywgJ3EnLCAnNScsICcxJywgJzInLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdyJywgJ2QnLCAnZicsICdzJywgJ2InLCAnYScsICdzJywgJ2UnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdkJywgJ2YnLCAncycsCisgICdiJywgJ2EnLCAncycsICdlJywgJzYnLCAnNCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnZCcsICdnJywgJ3MnLCAnYicsICdhJywgJ3MnLCAnZScsCisgICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdyJywgJ2QnLCAnZycsICdzJywgJ2InLCAnYScsICdzJywgJ2UnLCAnNicsICc0JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsCisgICdkJywgJ3AnLCAnaScsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdkJywgJ3AnLCAnaycsICdyJywgJ3UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ2QnLCAncCcsCisgICdtJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdyJywgJ2QnLCAncycsICdzJywgJ3AnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnZCcsICdzJywgJ3MnLCAncCcsCisgICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncicsICdkJywgJ3QnLCAncycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdkJywgJ3QnLCAncycsICdjJywgJ3AnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdyJywgJ3MnLCAndCcsICdvJywgJ3InLCAncycsICdzJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2EnLCAndicsICdlJywgJ3AnLCAncicsCisgICdlJywgJ3YnLCAncycsICdzJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2UnLCAndCcsICdzJywgJ3MnLCAnYicsICdzJywgJ3knLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdzJywgJ2gnLCAnYScsICcxJywgJ20nLCAncycsICdnJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2gnLCAnYScsICcxJywgJ20nLCAncycsCisgICdnJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdzJywgJ2gnLCAnYScsICcxJywgJ24nLCAnZScsICd4JywgJ3QnLCAnZScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnaCcsCisgICdhJywgJzEnLCAncicsICduJywgJ2QnLCAncycsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdoJywgJ2EnLCAnMicsICc1JywgJzYnLCAnbScsCisgICdzJywgJ2cnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnaCcsICdhJywgJzInLCAnNScsICc2JywgJ20nLCAncycsICdnJywgJzInLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdzJywgJ2gnLCAnYScsICcyJywgJzUnLCAnNicsICdyJywgJ24nLCAnZCcsICdzJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2wnLCAndycsCisgICdwJywgJ2MnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbScsICdwJywgJ3MnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ2knLCAnZScsCisgICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAnaScsICdnJywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ28nLCAnbScsICdpJywgJ2cnLCAndCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2MnLCAnbycsICdtJywgJ2knLCAnbCcsICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAnaScsICdsJywgJ3QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdjJywgJ28nLCAnbScsICdpJywgJ24nLCAnZScsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdkJywgJzInLCAncCcsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdpJywgJzInLCAncCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsCisgICdpJywgJzInLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdzJywgJzInLCAncCcsICdpJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsCisgICd2JywgJ3QnLCAncycsICdzJywgJzInLCAncycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncycsICdzJywgJzInLCAncycsCisgICdpJywgJzYnLCAnNCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3QnLCAncCcsICdkJywgJzInLCAncCcsICdpJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsCisgICd2JywgJ3QnLCAndCcsICdwJywgJ3MnLCAnMicsICdwJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd0JywgJ3MnLCAncycsCisgICcyJywgJ3MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3QnLCAncycsICdzJywgJzInLCAncycsICdpJywgJzYnLCAnNCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ20nLCAnYScsICd4JywgJ3AnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnYScsICd4JywgJ3MnLCAncycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnaScsCisgICduJywgJ3AnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnaScsICduJywgJ3MnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnbycsICd2JywgJ20nLCAncycsCisgICdrJywgJ3AnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdoJywgJ3UnLCAnZicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdjJywgJ3AnLCAncCcsCisgICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncicsICdjJywgJ3AnLCAncycsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdzJywgJ3EnLCAncicsICd0JywgJ3AnLCAncycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3InLCAncycsICdxJywgJ3InLCAndCcsICdzJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2YnLCAnZScsICduJywgJ2MnLCAnZScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3MnLCAncScsICdyJywgJ3QnLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdxJywgJ3InLCAndCcsICdzJywgJ3MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd1JywgJ2MnLCAnbycsICdtJywgJ2knLCAnZScsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndScsICdjJywgJ28nLCAnbScsICdpJywgJ2cnLCAnZScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3UnLCAnYycsICdvJywgJ20nLCAnaScsICdnJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd1JywgJ2MnLCAnbycsICdtJywgJ2knLCAnbCcsCisgICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndScsICdjJywgJ28nLCAnbScsICdpJywgJ2wnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3UnLCAnYycsICdvJywgJ20nLCAnaScsCisgICduJywgJ2UnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbCcsICdmJywgJ2wnLCAndScsICdzJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ20nLCAncCcsCisgICdzJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdjJywgJ28nLCAnbScsICdpJywgJ3MnLCAnZCcsICdlJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ28nLCAnbScsCisgICdpJywgJ3MnLCAnZCcsICdnJywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ28nLCAnbScsICdpJywgJ3MnLCAnZCcsICdnJywgJ3QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdjJywgJ28nLCAnbScsICdpJywgJ3MnLCAnZCcsICdsJywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ28nLCAnbScsICdpJywgJ3MnLCAnZCcsCisgICdsJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdjJywgJ28nLCAnbScsICdpJywgJ3MnLCAnZCcsICduJywgJ2UnLCAncScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsCisgICd0JywgJ2QnLCAncScsICcyJywgJ3AnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAnZCcsICcyJywgJ2QnLCAncScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAnZCcsICcyJywgJ3AnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAncycsCisgICcyJywgJ2QnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3MnLCAnZCcsICcyJywgJ3MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsCisgICd0JywgJ3MnLCAnZCcsICcyJywgJ3MnLCAnaScsICc2JywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdzJywgJ2QnLCAnMicsCisgICdzJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd0JywgJ3AnLCAnZCcsICcyJywgJ2QnLCAncScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsCisgICd0JywgJ3QnLCAncCcsICdzJywgJzInLCAnZCcsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsICdzJywgJ2QnLCAnMicsCisgICdzJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd0JywgJ3MnLCAnZCcsICcyJywgJ3MnLCAnaScsICc2JywgJzQnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdsJywgJ2YnLCAnZScsICduJywgJ2MnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnbScsICdvJywgJ3YnLCAnZCcsCisgICdxJywgJ3UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdtJywgJ2EnLCAneCcsICdwJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdtJywgJ2EnLCAneCcsICdzJywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdtJywgJ2YnLCAnZScsICduJywgJ2MnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnaScsICduJywgJ3AnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnaScsCisgICduJywgJ3MnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnbycsICd2JywgJ20nLCAncycsICdrJywgJ3AnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsCisgICdjJywgJ2snLCAncycsICdzJywgJ2QnLCAndycsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICdjJywgJ2snLCAncycsCisgICdzJywgJ3cnLCAnYicsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICdjJywgJ2snLCAndScsICdzJywgJ3cnLCAnYicsCisgICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICdkJywgJ2QnLCAncycsICdiJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdhJywgJ2QnLCAnZCcsICdzJywgJ3cnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnZCcsICdkJywgJ3UnLCAncycsCisgICdiJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywgJ2QnLCAnZCcsICd1JywgJ3MnLCAndycsICcxJywgJzInLCAnOCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAnYScsICd1JywgJ3MnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdhJywgJ2QnLCAnZCcsICd3JywgJ2QnLCAnMScsCisgICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ20nLCAncycsICdrJywgJ2InLCAnMScsICcyJywgJzgnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ20nLCAndScsICdsJywgJ2gnLCAndycsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICd1JywgJ2wnLCAnaCcsCisgICd1JywgJ3cnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAndScsICdsJywgJ3UnLCAnZCcsICdxJywgJzEnLCAnMicsCisgICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdzJywgJ2EnLCAnZCcsICdiJywgJ3cnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsCisgICdsJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsICdsJywgJ3EnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3MnLCAnbCcsICdsJywgJ3cnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsICdsJywgJ2QnLCAnaScsCisgICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywgJ2wnLCAncScsICdpJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdzJywgJ2wnLCAnbCcsICd3JywgJ2knLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdhJywgJ2QnLCAnMScsCisgICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdhJywgJ3cnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsCisgICdhJywgJ2QnLCAnaScsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2EnLCAndycsICdpJywgJzEnLCAnMicsCisgICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsICdkJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsCisgICdxJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsICd3JywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdzJywgJ3InLCAnbCcsICdkJywgJ2knLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdsJywgJ3EnLCAnaScsCisgICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2wnLCAndycsICdpJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdzJywgJ3UnLCAnYicsICdzJywgJ2InLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAndScsICdiJywgJ3MnLCAndycsCisgICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICd1JywgJ2InLCAndScsICdzJywgJ2InLCAnMScsICcyJywgJzgnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3MnLCAndScsICdiJywgJ3UnLCAncycsICd3JywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdxJywgJ3InLCAndCcsCisgICdwJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdzJywgJ3EnLCAncicsICd0JywgJ3MnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3UnLCAnYycsICdvJywgJ20nLCAnaScsCisgICdzJywgJ2QnLCAnZScsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndScsICdjJywgJ28nLCAnbScsICdpJywgJ3MnLCAnZCcsICdnJywgJ2UnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd1JywgJ2MnLCAnbycsICdtJywgJ2knLCAncycsICdkJywgJ2cnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3UnLCAnYycsICdvJywgJ20nLCAnaScsCisgICdzJywgJ2QnLCAnbCcsICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndScsICdjJywgJ28nLCAnbScsICdpJywgJ3MnLCAnZCcsICdsJywgJ3QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd1JywgJ2MnLCAnbycsICdtJywgJ2knLCAncycsICdkJywgJ24nLCAnZScsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYScsICdkJywgJ2QnLCAncycsCisgICd1JywgJ2InLCAncCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYScsICdkJywgJ2QnLCAncycsICd1JywgJ2InLCAncCcsICdzJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnaCcsCisgICdhJywgJ2QnLCAnZCcsICdwJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdoJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAncycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2gnLCAncycsCisgICd1JywgJ2InLCAncCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnaCcsICdzJywgJ3UnLCAnYicsICdwJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdsJywgJ2QnLCAnZCcsCisgICdxJywgJ3UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdtJywgJ28nLCAnbicsICdpJywgJ3QnLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICd3JywgJ2EnLCAnaScsCisgICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAnYicsICdsJywgJ2UnLCAnbicsICdkJywgJ3YnLCAncCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYicsICdsJywgJ2UnLCAnbicsCisgICdkJywgJ3YnLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZCcsICdwJywgJ3AnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2QnLCAncCcsICdwJywgJ3MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdpJywgJ24nLCAncycsICdlJywgJ3InLCAndCcsICdwJywgJ3MnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdtJywgJ3AnLCAncycsCisgICdhJywgJ2QnLCAnYicsICd3JywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywgJ2MnLCAnaycsICd1JywgJ3MnLCAnZCcsCisgICd3JywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdiJywgJ2wnLCAnZScsICduJywgJ2QnLCAndicsICdiJywgJzEnLCAnMicsCisgICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdoJywgJ20nLCAnaScsICduJywgJ3AnLCAnbycsICdzJywgJ3UnLCAndycsICcxJywgJzInLCAnOCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAnbScsICd1JywgJ2wnLCAnZCcsICdxJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICd0JywgJ2UnLCAncycsCisgICd0JywgJ2MnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3QnLCAnZScsICdzJywgJ3QnLCAnbicsICd6JywgJ2MnLCAnMScsCisgICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ3QnLCAnZScsICdzJywgJ3QnLCAneicsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnbycsCisgICd1JywgJ24nLCAnZCcsICdwJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAncCcsICdzJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsCisgICdvJywgJ3UnLCAnbicsICdkJywgJ3MnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdzJywgJ3MnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdjJywgJ3InLCAnYycsICczJywgJzInLCAnaCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdyJywgJ2MnLCAnMycsICcyJywgJ3MnLCAnaScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ2MnLCAncicsICdjJywgJzMnLCAnMicsICdxJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3InLCAnYycsICczJywgJzInLCAnZCcsCisgICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdjJywgJ20nLCAncCcsICdlJywgJ3MnLCAndCcsICdyJywgJ2knLCAnMScsICcyJywgJzgnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ2MnLCAnbScsICdwJywgJ2UnLCAncycsICd0JywgJ3InLCAnaScsICdhJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdjJywgJ20nLCAncCcsICdlJywgJ3MnLCAndCcsICdyJywgJ2knLCAnYycsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYycsCisgICdtJywgJ3AnLCAnZScsICdzJywgJ3QnLCAncicsICdpJywgJ28nLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2MnLCAnbScsCisgICdwJywgJ2UnLCAncycsICd0JywgJ3InLCAnaScsICdzJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdjJywgJ20nLCAncCcsCisgICdlJywgJ3MnLCAndCcsICdyJywgJ2knLCAneicsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYycsICdtJywgJ3AnLCAnZScsCisgICdzJywgJ3QnLCAncicsICdtJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdjJywgJ20nLCAncCcsICdpJywgJ3MnLCAndCcsCisgICdyJywgJ2knLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2MnLCAnbScsICdwJywgJ2knLCAncycsICd0JywgJ3InLCAnaScsCisgICdhJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdjJywgJ20nLCAncCcsICdpJywgJ3MnLCAndCcsICdyJywgJ2knLCAnYycsCisgICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYycsICdtJywgJ3AnLCAnaScsICdzJywgJ3QnLCAncicsICdpJywgJ28nLCAnMScsCisgICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ2MnLCAnbScsICdwJywgJ2knLCAncycsICd0JywgJ3InLCAnaScsICdzJywgJzEnLCAnMicsCisgICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdjJywgJ20nLCAncCcsICdpJywgJ3MnLCAndCcsICdyJywgJ2knLCAneicsICcxJywgJzInLCAnOCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAnYycsICdtJywgJ3AnLCAnaScsICdzJywgJ3QnLCAncicsICdtJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsCisgICd4JywgJ3QnLCAncicsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3QnLCAncicsICdxJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdpJywgJ24nLCAncycsCisgICdlJywgJ3InLCAndCcsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnaScsICduJywgJ3MnLCAnZScsICdyJywgJ3QnLCAncScsICdpJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsCisgICdhJywgJ2InLCAncycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywgJ2InLCAncycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywgJ2InLCAncycsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdoJywgJ2EnLCAnZCcsICdkJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2gnLCAnYScsICdkJywgJ2QnLCAnZCcsCisgICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnaCcsICdhJywgJ2QnLCAnZCcsICdzJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2gnLCAnYScsCisgICdkJywgJ2QnLCAncycsICd3JywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdoJywgJ2EnLCAnZCcsICdkJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ2gnLCAnYScsICdkJywgJ2QnLCAndycsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnaCcsICdzJywgJ3UnLCAnYicsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdoJywgJ3MnLCAndScsICdiJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2gnLCAncycsCisgICd1JywgJ2InLCAncycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdoJywgJ3MnLCAndScsICdiJywgJ3MnLCAndycsICcxJywgJzInLCAnOCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3AnLCAnaCcsICdzJywgJ3UnLCAnYicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdoJywgJ3MnLCAndScsICdiJywgJ3cnLCAnMScsCisgICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICdwJywgJ20nLCAnYScsICdkJywgJ2QnLCAndScsICdiJywgJ3MnLCAndycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsCisgICdhJywgJ2QnLCAnZCcsICd1JywgJ2InLCAncycsICd3JywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ3UnLCAnbCcsCisgICdoJywgJ3InLCAncycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ3UnLCAnbCcsICdoJywgJ3InLCAncycsICd3JywgJzEnLCAnMicsCisgICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAncCcsICdzJywgJ2gnLCAndScsICdmJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnYicsCisgICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdpJywgJ2cnLCAnbicsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsCisgICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ2knLCAnZycsCisgICduJywgJ2InLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnaScsICdnJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsCisgICdpJywgJ2cnLCAnbicsICdkJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ2knLCAnZycsICduJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICdwJywgJ3MnLCAnaScsICdnJywgJ24nLCAndycsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAndScsICdiJywgJ2InLCAnbycsCisgICdyJywgJ3InLCAnbycsICd3JywgJ18nLCAndScsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ3UnLCAnYicsICdiJywgJ28nLCAncicsCisgICdyJywgJ28nLCAndycsICdfJywgJ3UnLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYicsICdlJywgJ3gnLCAndCcsICdyJywgJ2knLCAnXycsCisgICd1JywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ2InLCAnZScsICd4JywgJ3QnLCAncicsICdpJywgJ18nLCAndScsICc2JywgJzQnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ2MnLCAndicsICd0JywgJ3AnLCAnaCcsICcyJywgJ3AnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnYycsICd2JywgJ3QnLCAncCcsCisgICdoJywgJzInLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdjJywgJ3YnLCAndCcsICdwJywgJ3MnLCAnMicsCisgICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ2MnLCAndicsICd0JywgJ3AnLCAncycsICcyJywgJ3AnLCAnaCcsICcyJywgJzUnLCAnNicsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAnZycsICdmJywgJzInLCAncCcsICc4JywgJ2EnLCAnZicsICdmJywgJ2knLCAnbicsICdlJywgJ2knLCAnbicsCisgICd2JywgJ3EnLCAnYicsICdfJywgJ3YnLCAnMScsICc2JywgJ3EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZycsICdmJywgJzInLCAncCcsCisgICc4JywgJ2EnLCAnZicsICdmJywgJ2knLCAnbicsICdlJywgJ2knLCAnbicsICd2JywgJ3EnLCAnYicsICdfJywgJ3YnLCAnMycsCisgICcyJywgJ3EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZycsICdmJywgJzInLCAncCcsICc4JywgJ2EnLCAnZicsICdmJywgJ2knLCAnbicsCisgICdlJywgJ2knLCAnbicsICd2JywgJ3EnLCAnYicsICdfJywgJ3YnLCAnNicsICc0JywgJ3EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZycsCisgICdmJywgJzInLCAncCcsICc4JywgJ2EnLCAnZicsICdmJywgJ2knLCAnbicsICdlJywgJ3EnLCAnYicsICdfJywgJ3YnLCAnMScsCisgICc2JywgJ3EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZycsICdmJywgJzInLCAncCcsICc4JywgJ2EnLCAnZicsICdmJywgJ2knLCAnbicsCisgICdlJywgJ3EnLCAnYicsICdfJywgJ3YnLCAnMycsICcyJywgJ3EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZycsICdmJywgJzInLCAncCcsCisgICc4JywgJ2EnLCAnZicsICdmJywgJ2knLCAnbicsICdlJywgJ3EnLCAnYicsICdfJywgJ3YnLCAnNicsICc0JywgJ3EnLCAnaScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAnZycsICdmJywgJzInLCAncCcsICc4JywgJ20nLCAndScsICdsJywgJ2InLCAnXycsICd2JywgJzEnLCAnNicsCisgICdxJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ2cnLCAnZicsICcyJywgJ3AnLCAnOCcsICdtJywgJ3UnLCAnbCcsICdiJywgJ18nLCAndicsCisgICczJywgJzInLCAncScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsCisgICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdnJywgJ2YnLCAnMicsICdwJywgJzgnLCAnbScsICd1JywgJ2wnLCAnYicsCisgICdfJywgJ3YnLCAnNicsICc0JywgJ3EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3cnLCAncicsICdmJywgJ3MnLCAnYicsICdhJywgJ3MnLCAnZScsCisgICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd3JywgJ3InLCAnZicsICdzJywgJ2InLCAnYScsICdzJywgJ2UnLCAnNicsICc0JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndycsCisgICdyJywgJ2cnLCAncycsICdiJywgJ2EnLCAncycsICdlJywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3cnLCAncicsICdnJywgJ3MnLCAnYicsCisgICdhJywgJ3MnLCAnZScsICc2JywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd3JywgJ3InLCAncCcsICdrJywgJ3InLCAndScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3cnLCAncicsCisgICdzJywgJ3MnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3cnLCAncicsICdzJywgJ3MnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3cnLCAncicsICd1JywgJ3MnLCAncycsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndycsICdyJywgJ3UnLCAncycsICdzJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd4JywgJ2EnLCAnYicsICdvJywgJ3InLCAndCcsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3gnLCAnYicsICdlJywgJ2cnLCAnaScsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAneCcsICdlJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsCisgICdyJywgJ2MnLCAneicsICdwJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAncicsICdjJywgJ3onLCAncCcsICdkJywgJzInLCAnNScsCisgICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdmJywgJ3InLCAnYycsICd6JywgJ3AnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdyJywgJ2MnLCAneicsCisgICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAncicsICdjJywgJ3onLCAncycsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsCisgICdmJywgJ3InLCAnYycsICd6JywgJ3MnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdjJywgJ28nLCAnbScsICdiJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsCisgICdwJywgJ2MnLCAnbycsICdtJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnYycsICdvJywgJ20nLCAncScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsCisgICdjJywgJ28nLCAnbScsICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnYycsICdvJywgJ20nLCAndScsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsCisgICdwJywgJ2MnLCAnbycsICdtJywgJ3UnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdjJywgJ28nLCAnbScsICd1JywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAnYycsICdvJywgJ20nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICdpJywgJ2wnLCAnMicsCisgICdwJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAnaScsICdsJywgJzInLCAncCcsICdkJywgJzInLCAnNScsCisgICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ2knLCAnbCcsICcyJywgJ3AnLCAncycsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsCisgICdlJywgJ3InLCAnbScsICdpJywgJ2wnLCAnMicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnaCcsCisgICdhJywgJ2QnLCAnZCcsICdiJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnaCcsICdhJywgJ2QnLCAnZCcsICdiJywgJ3EnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAnaCcsICdhJywgJ2QnLCAnZCcsICdiJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnaCcsICdhJywgJ2QnLCAnZCcsCisgICdkJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnaCcsICdhJywgJ2QnLCAnZCcsICd1JywgJ2InLCAnZCcsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsCisgICdoJywgJ2EnLCAnZCcsICdkJywgJ3UnLCAnYicsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2gnLCAnYScsICdkJywgJ2QnLCAndScsCisgICdiJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnaCcsICdhJywgJ2QnLCAnZCcsICd1JywgJ2QnLCAncScsICdcMDAwJywgJ18nLCAnXycsCisgICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsCisgICdoJywgJ2EnLCAnZCcsICdkJywgJ3UnLCAndycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2gnLCAnYScsICdkJywgJ2QnLCAndScsCisgICd3JywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnaCcsICdhJywgJ2QnLCAnZCcsICd3JywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnaCcsCisgICdhJywgJ2QnLCAnZCcsICd3JywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnaCcsICdzJywgJ3UnLCAnYicsICdiJywgJ3cnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAnaCcsICdzJywgJ3UnLCAnYicsICdkJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnaCcsICdzJywgJ3UnLCAnYicsCisgICd3JywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnbScsICdhJywgJ2MnLCAncycsICdkJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnbScsCisgICdhJywgJ2MnLCAncycsICdkJywgJ3EnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdtJywgJ2EnLCAnYycsICdzJywgJ2QnLCAncScsCisgICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdwJywgJ20nLCAnYScsICdjJywgJ3MnLCAncycsICdkJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnbScsCisgICdhJywgJ2MnLCAncycsICdzJywgJ2QnLCAncScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ20nLCAnYScsICdjJywgJ3MnLCAncycsCisgICdkJywgJ3EnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsCisgICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdtJywgJ2EnLCAnYycsICdzJywgJ3MnLCAndycsICdkJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsCisgICdwJywgJ20nLCAnYScsICdjJywgJ3MnLCAncycsICd3JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnbScsICdhJywgJ2MnLCAncycsCisgICd3JywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnbScsICdhJywgJ2MnLCAncycsICd3JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnbScsCisgICdhJywgJ2QnLCAnYycsICdzJywgJ3MnLCAndycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ20nLCAnYScsICdkJywgJ2MnLCAncycsCisgICd3JywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsCisgICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncCcsICdlJywgJ3InLCAnbScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdyJywgJ28nLCAndCcsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdwJywgJ3InLCAnbycsICd0JywgJ2InLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdyJywgJ28nLCAndCcsCisgICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdwJywgJ3InLCAnbycsICd0JywgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdyJywgJ28nLCAndCcsCisgICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdwJywgJ3InLCAnbycsICd0JywgJ3EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdyJywgJ28nLCAndCcsCisgICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdwJywgJ3InLCAnbycsICd0JywgJ3cnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsCisgICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAnYScsCisgICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsCisgICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdhJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsCisgICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ2EnLCAncScsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsCisgICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAnYScsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsCisgICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdsJywgJ2InLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsCisgICd2JywgJ3AnLCAncycsICdoJywgJ2wnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsCisgICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsICdxJywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsCisgICdwJywgJ3MnLCAnaCcsICdsJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsCisgICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd4JywgJ3QnLCAnZScsICdzJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsCisgICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2InLCAnaScsICd0JywgJ3InLCAnZScsICd2JywgJ1wwMDAnLCAnXycsCisgICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdnJywgJ2UnLCAndCcsICdpJywgJ2QnLCAnXDAwMCcsCisgICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2cnLCAnZScsICd0JywgJ3AnLCAncycsCisgICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICdlJywgJ3QnLCAncCcsCisgICdzJywgJ1wwMDAnLAorICB9OworCisgIHN0cnVjdCBCdWlsdGluRW50cnkgeworICAgIEludHJpbnNpYzo6SUQgSW50cmluSUQ7CisgICAgdW5zaWduZWQgU3RyVGFiT2Zmc2V0OworICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gJkJ1aWx0aW5OYW1lc1tTdHJUYWJPZmZzZXRdOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yPChTdHJpbmdSZWYgUkhTKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RybmNtcChnZXROYW1lKCksIFJIUy5kYXRhKCksIFJIUy5zaXplKCkpIDwgMDsKKyAgICB9CisgIH07CisgIFN0cmluZ1JlZiBUYXJnZXRQcmVmaXgoVGFyZ2V0UHJlZml4U3RyKTsKKworICAvKiBUYXJnZXQgSW5kZXBlbmRlbnQgQnVpbHRpbnMgKi8geworICAgIHN0YXRpYyBjb25zdCBCdWlsdGluRW50cnkgTmFtZXNbXSA9IHsKKyAgICAgIHtJbnRyaW5zaWM6OmFkanVzdF90cmFtcG9saW5lLCAwfSwgLy8gX19idWlsdGluX2FkanVzdF90cmFtcG9saW5lCisgICAgICB7SW50cmluc2ljOjpkZWJ1Z3RyYXAsIDI4fSwgLy8gX19idWlsdGluX2RlYnVndHJhcAorICAgICAge0ludHJpbnNpYzo6Zmx0X3JvdW5kcywgNzB9LCAvLyBfX2J1aWx0aW5fZmx0X3JvdW5kcworICAgICAge0ludHJpbnNpYzo6aW5pdF90cmFtcG9saW5lLCA5MX0sIC8vIF9fYnVpbHRpbl9pbml0X3RyYW1wb2xpbmUKKyAgICAgIHtJbnRyaW5zaWM6Om9iamVjdHNpemUsIDExN30sIC8vIF9fYnVpbHRpbl9vYmplY3Rfc2l6ZQorICAgICAge0ludHJpbnNpYzo6c3RhY2tyZXN0b3JlLCAxMzl9LCAvLyBfX2J1aWx0aW5fc3RhY2tfcmVzdG9yZQorICAgICAge0ludHJpbnNpYzo6c3RhY2tzYXZlLCAxNjN9LCAvLyBfX2J1aWx0aW5fc3RhY2tfc2F2ZQorICAgICAge0ludHJpbnNpYzo6dGhyZWFkX3BvaW50ZXIsIDE4NH0sIC8vIF9fYnVpbHRpbl90aHJlYWRfcG9pbnRlcgorICAgICAge0ludHJpbnNpYzo6dHJhcCwgMjA5fSwgLy8gX19idWlsdGluX3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6OmVoX3Vud2luZF9pbml0LCA0OH0sIC8vIF9fYnVpbHRpbl91bndpbmRfaW5pdAorICAgIH07CisgICAgYXV0byBJID0gc3RkOjpsb3dlcl9ib3VuZChzdGQ6OmJlZ2luKE5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZW5kKE5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5OYW1lU3RyKTsKKyAgICBpZiAoSSAhPSBzdGQ6OmVuZChOYW1lcykgJiYKKyAgICAgICAgSS0+Z2V0TmFtZSgpID09IEJ1aWx0aW5OYW1lU3RyKQorICAgICAgcmV0dXJuIEktPkludHJpbklEOworICB9CisgIGlmIChUYXJnZXRQcmVmaXggPT0gImFhcmNoNjQiKSB7CisgICAgc3RhdGljIGNvbnN0IEJ1aWx0aW5FbnRyeSBhYXJjaDY0TmFtZXNbXSA9IHsKKyAgICAgIHtJbnRyaW5zaWM6OmFhcmNoNjRfZG1iLCAyMjR9LCAvLyBfX2J1aWx0aW5fYXJtX2RtYgorICAgICAge0ludHJpbnNpYzo6YWFyY2g2NF9kc2IsIDI0Mn0sIC8vIF9fYnVpbHRpbl9hcm1fZHNiCisgICAgICB7SW50cmluc2ljOjphYXJjaDY0X2lzYiwgMjYwfSwgLy8gX19idWlsdGluX2FybV9pc2IKKyAgICB9OworICAgIGF1dG8gSSA9IHN0ZDo6bG93ZXJfYm91bmQoc3RkOjpiZWdpbihhYXJjaDY0TmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjplbmQoYWFyY2g2NE5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5OYW1lU3RyKTsKKyAgICBpZiAoSSAhPSBzdGQ6OmVuZChhYXJjaDY0TmFtZXMpICYmCisgICAgICAgIEktPmdldE5hbWUoKSA9PSBCdWlsdGluTmFtZVN0cikKKyAgICAgIHJldHVybiBJLT5JbnRyaW5JRDsKKyAgfQorICBpZiAoVGFyZ2V0UHJlZml4ID09ICJhbWRnY24iKSB7CisgICAgc3RhdGljIGNvbnN0IEJ1aWx0aW5FbnRyeSBhbWRnY25OYW1lc1tdID0geworICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX2J1ZmZlcl93YmludmwxLCAyNzh9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2J1ZmZlcl93YmludmwxCisgICAgICB7SW50cmluc2ljOjphbWRnY25fYnVmZmVyX3diaW52bDFfc2MsIDMxMH0sIC8vIF9fYnVpbHRpbl9hbWRnY25fYnVmZmVyX3diaW52bDFfc2MKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9idWZmZXJfd2JpbnZsMV92b2wsIDM0NX0sIC8vIF9fYnVpbHRpbl9hbWRnY25fYnVmZmVyX3diaW52bDFfdm9sCisgICAgICB7SW50cmluc2ljOjphbWRnY25fY3ViZWlkLCAzODF9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2N1YmVpZAorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX2N1YmVtYSwgNDA1fSwgLy8gX19idWlsdGluX2FtZGdjbl9jdWJlbWEKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9jdWJlc2MsIDQyOX0sIC8vIF9fYnVpbHRpbl9hbWRnY25fY3ViZXNjCisgICAgICB7SW50cmluc2ljOjphbWRnY25fY3ViZXRjLCA0NTN9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2N1YmV0YworICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX2N2dF9wa191OF9mMzIsIDQ3N30sIC8vIF9fYnVpbHRpbl9hbWRnY25fY3Z0X3BrX3U4X2YzMgorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX2Rpc3BhdGNoX2lkLCA1MDh9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2Rpc3BhdGNoX2lkCisgICAgICB7SW50cmluc2ljOjphbWRnY25fZGlzcGF0Y2hfcHRyLCA1Mzd9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2Rpc3BhdGNoX3B0cgorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX2RzX2JwZXJtdXRlLCA1Njd9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2RzX2JwZXJtdXRlCisgICAgICB7SW50cmluc2ljOjphbWRnY25fZHNfZmFkZCwgNTk2fSwgLy8gX19idWlsdGluX2FtZGdjbl9kc19mYWRkCisgICAgICB7SW50cmluc2ljOjphbWRnY25fZHNfZm1heCwgNjIxfSwgLy8gX19idWlsdGluX2FtZGdjbl9kc19mbWF4CisgICAgICB7SW50cmluc2ljOjphbWRnY25fZHNfZm1pbiwgNjQ2fSwgLy8gX19idWlsdGluX2FtZGdjbl9kc19mbWluCisgICAgICB7SW50cmluc2ljOjphbWRnY25fZHNfcGVybXV0ZSwgNjcxfSwgLy8gX19idWlsdGluX2FtZGdjbl9kc19wZXJtdXRlCisgICAgICB7SW50cmluc2ljOjphbWRnY25fZHNfc3dpenpsZSwgNjk5fSwgLy8gX19idWlsdGluX2FtZGdjbl9kc19zd2l6emxlCisgICAgICB7SW50cmluc2ljOjphbWRnY25fZm1lZDMsIDcyN30sIC8vIF9fYnVpbHRpbl9hbWRnY25fZm1lZDMKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9mbXVsX2xlZ2FjeSwgNzUwfSwgLy8gX19idWlsdGluX2FtZGdjbl9mbXVsX2xlZ2FjeQorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX2dyb3Vwc3RhdGljc2l6ZSwgNzc5fSwgLy8gX19idWlsdGluX2FtZGdjbl9ncm91cHN0YXRpY3NpemUKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9pbXBsaWNpdF9idWZmZXJfcHRyLCA4MTJ9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2ltcGxpY2l0X2J1ZmZlcl9wdHIKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9pbXBsaWNpdGFyZ19wdHIsIDg0OX0sIC8vIF9fYnVpbHRpbl9hbWRnY25faW1wbGljaXRhcmdfcHRyCisgICAgICB7SW50cmluc2ljOjphbWRnY25faW50ZXJwX21vdiwgODgyfSwgLy8gX19idWlsdGluX2FtZGdjbl9pbnRlcnBfbW92CisgICAgICB7SW50cmluc2ljOjphbWRnY25faW50ZXJwX3AxLCA5MTB9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2ludGVycF9wMQorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX2ludGVycF9wMiwgOTM3fSwgLy8gX19idWlsdGluX2FtZGdjbl9pbnRlcnBfcDIKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9rZXJuYXJnX3NlZ21lbnRfcHRyLCA5NjR9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2tlcm5hcmdfc2VnbWVudF9wdHIKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9sZXJwLCAxMDAxfSwgLy8gX19idWlsdGluX2FtZGdjbl9sZXJwCisgICAgICB7SW50cmluc2ljOjphbWRnY25fbWJjbnRfaGksIDEwMjN9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX21iY250X2hpCisgICAgICB7SW50cmluc2ljOjphbWRnY25fbWJjbnRfbG8sIDEwNDl9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX21iY250X2xvCisgICAgICB7SW50cmluc2ljOjphbWRnY25fbXFzYWRfcGtfdTE2X3U4LCAxMDc1fSwgLy8gX19idWlsdGluX2FtZGdjbl9tcXNhZF9wa191MTZfdTgKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9tcXNhZF91MzJfdTgsIDExMDh9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX21xc2FkX3UzMl91OAorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX21zYWRfdTgsIDExMzh9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX21zYWRfdTgKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9xc2FkX3BrX3UxNl91OCwgMTE2M30sIC8vIF9fYnVpbHRpbl9hbWRnY25fcXNhZF9wa191MTZfdTgKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9xdWV1ZV9wdHIsIDExOTV9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3F1ZXVlX3B0cgorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX3JjcF9sZWdhY3ksIDEyMjJ9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3JjcF9sZWdhY3kKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9yZWFkZmlyc3RsYW5lLCAxMjUwfSwgLy8gX19idWlsdGluX2FtZGdjbl9yZWFkZmlyc3RsYW5lCisgICAgICB7SW50cmluc2ljOjphbWRnY25fcmVhZGxhbmUsIDEyODF9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3JlYWRsYW5lCisgICAgICB7SW50cmluc2ljOjphbWRnY25fcnNxX2xlZ2FjeSwgMTMwN30sIC8vIF9fYnVpbHRpbl9hbWRnY25fcnNxX2xlZ2FjeQorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX3NfYmFycmllciwgMTMzNX0sIC8vIF9fYnVpbHRpbl9hbWRnY25fc19iYXJyaWVyCisgICAgICB7SW50cmluc2ljOjphbWRnY25fc19kY2FjaGVfaW52LCAxMzYyfSwgLy8gX19idWlsdGluX2FtZGdjbl9zX2RjYWNoZV9pbnYKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9zX2RjYWNoZV9pbnZfdm9sLCAxMzkyfSwgLy8gX19idWlsdGluX2FtZGdjbl9zX2RjYWNoZV9pbnZfdm9sCisgICAgICB7SW50cmluc2ljOjphbWRnY25fc19kY2FjaGVfd2IsIDE0MjZ9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3NfZGNhY2hlX3diCisgICAgICB7SW50cmluc2ljOjphbWRnY25fc19kY2FjaGVfd2Jfdm9sLCAxNDU1fSwgLy8gX19idWlsdGluX2FtZGdjbl9zX2RjYWNoZV93Yl92b2wKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9zX2RlY3BlcmZsZXZlbCwgMTQ4OH0sIC8vIF9fYnVpbHRpbl9hbWRnY25fc19kZWNwZXJmbGV2ZWwKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9zX2dldHBjLCAxNTIwfSwgLy8gX19idWlsdGluX2FtZGdjbl9zX2dldHBjCisgICAgICB7SW50cmluc2ljOjphbWRnY25fc19nZXRyZWcsIDE1NDV9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3NfZ2V0cmVnCisgICAgICB7SW50cmluc2ljOjphbWRnY25fc19pbmNwZXJmbGV2ZWwsIDE1NzF9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3NfaW5jcGVyZmxldmVsCisgICAgICB7SW50cmluc2ljOjphbWRnY25fc19tZW1yZWFsdGltZSwgMTYwM30sIC8vIF9fYnVpbHRpbl9hbWRnY25fc19tZW1yZWFsdGltZQorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX3NfbWVtdGltZSwgMTYzNH0sIC8vIF9fYnVpbHRpbl9hbWRnY25fc19tZW10aW1lCisgICAgICB7SW50cmluc2ljOjphbWRnY25fc19zZW5kbXNnLCAxNjYxfSwgLy8gX19idWlsdGluX2FtZGdjbl9zX3NlbmRtc2cKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9zX3NlbmRtc2doYWx0LCAxNjg4fSwgLy8gX19idWlsdGluX2FtZGdjbl9zX3NlbmRtc2doYWx0CisgICAgICB7SW50cmluc2ljOjphbWRnY25fc19zbGVlcCwgMTcxOX0sIC8vIF9fYnVpbHRpbl9hbWRnY25fc19zbGVlcAorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX3Nfd2FpdGNudCwgMTc0NH0sIC8vIF9fYnVpbHRpbl9hbWRnY25fc193YWl0Y250CisgICAgICB7SW50cmluc2ljOjphbWRnY25fc2FkX2hpX3U4LCAxNzcxfSwgLy8gX19idWlsdGluX2FtZGdjbl9zYWRfaGlfdTgKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9zYWRfdTE2LCAxNzk4fSwgLy8gX19idWlsdGluX2FtZGdjbl9zYWRfdTE2CisgICAgICB7SW50cmluc2ljOjphbWRnY25fc2FkX3U4LCAxODIzfSwgLy8gX19idWlsdGluX2FtZGdjbl9zYWRfdTgKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl93YXZlX2JhcnJpZXIsIDE4NDd9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3dhdmVfYmFycmllcgorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX3dvcmtncm91cF9pZF94LCAxODc3fSwgLy8gX19idWlsdGluX2FtZGdjbl93b3JrZ3JvdXBfaWRfeAorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX3dvcmtncm91cF9pZF95LCAxOTA5fSwgLy8gX19idWlsdGluX2FtZGdjbl93b3JrZ3JvdXBfaWRfeQorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX3dvcmtncm91cF9pZF96LCAxOTQxfSwgLy8gX19idWlsdGluX2FtZGdjbl93b3JrZ3JvdXBfaWRfegorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX3dyaXRlbGFuZSwgMTk3M30sIC8vIF9fYnVpbHRpbl9hbWRnY25fd3JpdGVsYW5lCisgICAgfTsKKyAgICBhdXRvIEkgPSBzdGQ6Omxvd2VyX2JvdW5kKHN0ZDo6YmVnaW4oYW1kZ2NuTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjplbmQoYW1kZ2NuTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbHRpbk5hbWVTdHIpOworICAgIGlmIChJICE9IHN0ZDo6ZW5kKGFtZGdjbk5hbWVzKSAmJgorICAgICAgICBJLT5nZXROYW1lKCkgPT0gQnVpbHRpbk5hbWVTdHIpCisgICAgICByZXR1cm4gSS0+SW50cmluSUQ7CisgIH0KKyAgaWYgKFRhcmdldFByZWZpeCA9PSAiYXJtIikgeworICAgIHN0YXRpYyBjb25zdCBCdWlsdGluRW50cnkgYXJtTmFtZXNbXSA9IHsKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9jZHAsIDIwMDB9LCAvLyBfX2J1aWx0aW5fYXJtX2NkcAorICAgICAge0ludHJpbnNpYzo6YXJtX2NkcDIsIDIwMTh9LCAvLyBfX2J1aWx0aW5fYXJtX2NkcDIKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9kbWIsIDIyNH0sIC8vIF9fYnVpbHRpbl9hcm1fZG1iCisgICAgICB7SW50cmluc2ljOjphcm1fZHNiLCAyNDJ9LCAvLyBfX2J1aWx0aW5fYXJtX2RzYgorICAgICAge0ludHJpbnNpYzo6YXJtX2dldF9mcHNjciwgMjAzN30sIC8vIF9fYnVpbHRpbl9hcm1fZ2V0X2Zwc2NyCisgICAgICB7SW50cmluc2ljOjphcm1faXNiLCAyNjB9LCAvLyBfX2J1aWx0aW5fYXJtX2lzYgorICAgICAge0ludHJpbnNpYzo6YXJtX2xkYywgMjA2MX0sIC8vIF9fYnVpbHRpbl9hcm1fbGRjCisgICAgICB7SW50cmluc2ljOjphcm1fbGRjMiwgMjA3OX0sIC8vIF9fYnVpbHRpbl9hcm1fbGRjMgorICAgICAge0ludHJpbnNpYzo6YXJtX2xkYzJsLCAyMDk4fSwgLy8gX19idWlsdGluX2FybV9sZGMybAorICAgICAge0ludHJpbnNpYzo6YXJtX2xkY2wsIDIxMTh9LCAvLyBfX2J1aWx0aW5fYXJtX2xkY2wKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9tY3IsIDIxMzd9LCAvLyBfX2J1aWx0aW5fYXJtX21jcgorICAgICAge0ludHJpbnNpYzo6YXJtX21jcjIsIDIxNTV9LCAvLyBfX2J1aWx0aW5fYXJtX21jcjIKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9tcmMsIDIxNzR9LCAvLyBfX2J1aWx0aW5fYXJtX21yYworICAgICAge0ludHJpbnNpYzo6YXJtX21yYzIsIDIxOTJ9LCAvLyBfX2J1aWx0aW5fYXJtX21yYzIKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9xYWRkLCAyMjExfSwgLy8gX19idWlsdGluX2FybV9xYWRkCisgICAgICB7SW50cmluc2ljOjphcm1fcWFkZDE2LCAyMjMwfSwgLy8gX19idWlsdGluX2FybV9xYWRkMTYKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9xYWRkOCwgMjI1MX0sIC8vIF9fYnVpbHRpbl9hcm1fcWFkZDgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9xYXN4LCAyMjcxfSwgLy8gX19idWlsdGluX2FybV9xYXN4CisgICAgICB7SW50cmluc2ljOjphcm1fcXNheCwgMjI5MH0sIC8vIF9fYnVpbHRpbl9hcm1fcXNheAorICAgICAge0ludHJpbnNpYzo6YXJtX3FzdWIsIDIzMDl9LCAvLyBfX2J1aWx0aW5fYXJtX3FzdWIKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9xc3ViMTYsIDIzMjh9LCAvLyBfX2J1aWx0aW5fYXJtX3FzdWIxNgorICAgICAge0ludHJpbnNpYzo6YXJtX3FzdWI4LCAyMzQ5fSwgLy8gX19idWlsdGluX2FybV9xc3ViOAorICAgICAge0ludHJpbnNpYzo6YXJtX3NhZGQxNiwgMjM2OX0sIC8vIF9fYnVpbHRpbl9hcm1fc2FkZDE2CisgICAgICB7SW50cmluc2ljOjphcm1fc2FkZDgsIDIzOTB9LCAvLyBfX2J1aWx0aW5fYXJtX3NhZGQ4CisgICAgICB7SW50cmluc2ljOjphcm1fc2FzeCwgMjQxMH0sIC8vIF9fYnVpbHRpbl9hcm1fc2FzeAorICAgICAge0ludHJpbnNpYzo6YXJtX3NlbCwgMjQyOX0sIC8vIF9fYnVpbHRpbl9hcm1fc2VsCisgICAgICB7SW50cmluc2ljOjphcm1fc2V0X2Zwc2NyLCAyNDQ3fSwgLy8gX19idWlsdGluX2FybV9zZXRfZnBzY3IKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zaGFkZDE2LCAyNDcxfSwgLy8gX19idWlsdGluX2FybV9zaGFkZDE2CisgICAgICB7SW50cmluc2ljOjphcm1fc2hhZGQ4LCAyNDkzfSwgLy8gX19idWlsdGluX2FybV9zaGFkZDgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zaGFzeCwgMjUxNH0sIC8vIF9fYnVpbHRpbl9hcm1fc2hhc3gKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zaHNheCwgMjUzNH0sIC8vIF9fYnVpbHRpbl9hcm1fc2hzYXgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zaHN1YjE2LCAyNTU0fSwgLy8gX19idWlsdGluX2FybV9zaHN1YjE2CisgICAgICB7SW50cmluc2ljOjphcm1fc2hzdWI4LCAyNTc2fSwgLy8gX19idWlsdGluX2FybV9zaHN1YjgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zbWxhYmIsIDI1OTd9LCAvLyBfX2J1aWx0aW5fYXJtX3NtbGFiYgorICAgICAge0ludHJpbnNpYzo6YXJtX3NtbGFidCwgMjYxOH0sIC8vIF9fYnVpbHRpbl9hcm1fc21sYWJ0CisgICAgICB7SW50cmluc2ljOjphcm1fc21sYWQsIDI2Mzl9LCAvLyBfX2J1aWx0aW5fYXJtX3NtbGFkCisgICAgICB7SW50cmluc2ljOjphcm1fc21sYWR4LCAyNjU5fSwgLy8gX19idWlsdGluX2FybV9zbWxhZHgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zbWxhbGQsIDI2ODB9LCAvLyBfX2J1aWx0aW5fYXJtX3NtbGFsZAorICAgICAge0ludHJpbnNpYzo6YXJtX3NtbGFsZHgsIDI3MDF9LCAvLyBfX2J1aWx0aW5fYXJtX3NtbGFsZHgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zbWxhdGIsIDI3MjN9LCAvLyBfX2J1aWx0aW5fYXJtX3NtbGF0YgorICAgICAge0ludHJpbnNpYzo6YXJtX3NtbGF0dCwgMjc0NH0sIC8vIF9fYnVpbHRpbl9hcm1fc21sYXR0CisgICAgICB7SW50cmluc2ljOjphcm1fc21sYXdiLCAyNzY1fSwgLy8gX19idWlsdGluX2FybV9zbWxhd2IKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zbWxhd3QsIDI3ODZ9LCAvLyBfX2J1aWx0aW5fYXJtX3NtbGF3dAorICAgICAge0ludHJpbnNpYzo6YXJtX3NtbHNkLCAyODA3fSwgLy8gX19idWlsdGluX2FybV9zbWxzZAorICAgICAge0ludHJpbnNpYzo6YXJtX3NtbHNkeCwgMjgyN30sIC8vIF9fYnVpbHRpbl9hcm1fc21sc2R4CisgICAgICB7SW50cmluc2ljOjphcm1fc21sc2xkLCAyODQ4fSwgLy8gX19idWlsdGluX2FybV9zbWxzbGQKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zbWxzbGR4LCAyODY5fSwgLy8gX19idWlsdGluX2FybV9zbWxzbGR4CisgICAgICB7SW50cmluc2ljOjphcm1fc211YWQsIDI4OTF9LCAvLyBfX2J1aWx0aW5fYXJtX3NtdWFkCisgICAgICB7SW50cmluc2ljOjphcm1fc211YWR4LCAyOTExfSwgLy8gX19idWlsdGluX2FybV9zbXVhZHgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zbXVsYmIsIDI5MzJ9LCAvLyBfX2J1aWx0aW5fYXJtX3NtdWxiYgorICAgICAge0ludHJpbnNpYzo6YXJtX3NtdWxidCwgMjk1M30sIC8vIF9fYnVpbHRpbl9hcm1fc211bGJ0CisgICAgICB7SW50cmluc2ljOjphcm1fc211bHRiLCAyOTc0fSwgLy8gX19idWlsdGluX2FybV9zbXVsdGIKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zbXVsdHQsIDI5OTV9LCAvLyBfX2J1aWx0aW5fYXJtX3NtdWx0dAorICAgICAge0ludHJpbnNpYzo6YXJtX3NtdWx3YiwgMzAxNn0sIC8vIF9fYnVpbHRpbl9hcm1fc211bHdiCisgICAgICB7SW50cmluc2ljOjphcm1fc211bHd0LCAzMDM3fSwgLy8gX19idWlsdGluX2FybV9zbXVsd3QKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zbXVzZCwgMzA1OH0sIC8vIF9fYnVpbHRpbl9hcm1fc211c2QKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zbXVzZHgsIDMwNzh9LCAvLyBfX2J1aWx0aW5fYXJtX3NtdXNkeAorICAgICAge0ludHJpbnNpYzo6YXJtX3NzYXQsIDMwOTl9LCAvLyBfX2J1aWx0aW5fYXJtX3NzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zc2F0MTYsIDMxMTh9LCAvLyBfX2J1aWx0aW5fYXJtX3NzYXQxNgorICAgICAge0ludHJpbnNpYzo6YXJtX3NzYXgsIDMxMzl9LCAvLyBfX2J1aWx0aW5fYXJtX3NzYXgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zc3ViMTYsIDMxNTh9LCAvLyBfX2J1aWx0aW5fYXJtX3NzdWIxNgorICAgICAge0ludHJpbnNpYzo6YXJtX3NzdWI4LCAzMTc5fSwgLy8gX19idWlsdGluX2FybV9zc3ViOAorICAgICAge0ludHJpbnNpYzo6YXJtX3N0YywgMzE5OX0sIC8vIF9fYnVpbHRpbl9hcm1fc3RjCisgICAgICB7SW50cmluc2ljOjphcm1fc3RjMiwgMzIxN30sIC8vIF9fYnVpbHRpbl9hcm1fc3RjMgorICAgICAge0ludHJpbnNpYzo6YXJtX3N0YzJsLCAzMjM2fSwgLy8gX19idWlsdGluX2FybV9zdGMybAorICAgICAge0ludHJpbnNpYzo6YXJtX3N0Y2wsIDMyNTZ9LCAvLyBfX2J1aWx0aW5fYXJtX3N0Y2wKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zeHRhYjE2LCAzMjc1fSwgLy8gX19idWlsdGluX2FybV9zeHRhYjE2CisgICAgICB7SW50cmluc2ljOjphcm1fc3h0YjE2LCAzMjk3fSwgLy8gX19idWlsdGluX2FybV9zeHRiMTYKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91YWRkMTYsIDMzMTh9LCAvLyBfX2J1aWx0aW5fYXJtX3VhZGQxNgorICAgICAge0ludHJpbnNpYzo6YXJtX3VhZGQ4LCAzMzM5fSwgLy8gX19idWlsdGluX2FybV91YWRkOAorICAgICAge0ludHJpbnNpYzo6YXJtX3Vhc3gsIDMzNTl9LCAvLyBfX2J1aWx0aW5fYXJtX3Vhc3gKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91aGFkZDE2LCAzMzc4fSwgLy8gX19idWlsdGluX2FybV91aGFkZDE2CisgICAgICB7SW50cmluc2ljOjphcm1fdWhhZGQ4LCAzNDAwfSwgLy8gX19idWlsdGluX2FybV91aGFkZDgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91aGFzeCwgMzQyMX0sIC8vIF9fYnVpbHRpbl9hcm1fdWhhc3gKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91aHNheCwgMzQ0MX0sIC8vIF9fYnVpbHRpbl9hcm1fdWhzYXgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91aHN1YjE2LCAzNDYxfSwgLy8gX19idWlsdGluX2FybV91aHN1YjE2CisgICAgICB7SW50cmluc2ljOjphcm1fdWhzdWI4LCAzNDgzfSwgLy8gX19idWlsdGluX2FybV91aHN1YjgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91cWFkZDE2LCAzNTA0fSwgLy8gX19idWlsdGluX2FybV91cWFkZDE2CisgICAgICB7SW50cmluc2ljOjphcm1fdXFhZGQ4LCAzNTI2fSwgLy8gX19idWlsdGluX2FybV91cWFkZDgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91cWFzeCwgMzU0N30sIC8vIF9fYnVpbHRpbl9hcm1fdXFhc3gKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91cXNheCwgMzU2N30sIC8vIF9fYnVpbHRpbl9hcm1fdXFzYXgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91cXN1YjE2LCAzNTg3fSwgLy8gX19idWlsdGluX2FybV91cXN1YjE2CisgICAgICB7SW50cmluc2ljOjphcm1fdXFzdWI4LCAzNjA5fSwgLy8gX19idWlsdGluX2FybV91cXN1YjgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91c2FkOCwgMzYzMH0sIC8vIF9fYnVpbHRpbl9hcm1fdXNhZDgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91c2FkYTgsIDM2NTB9LCAvLyBfX2J1aWx0aW5fYXJtX3VzYWRhOAorICAgICAge0ludHJpbnNpYzo6YXJtX3VzYXQsIDM2NzF9LCAvLyBfX2J1aWx0aW5fYXJtX3VzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91c2F0MTYsIDM2OTB9LCAvLyBfX2J1aWx0aW5fYXJtX3VzYXQxNgorICAgICAge0ludHJpbnNpYzo6YXJtX3VzYXgsIDM3MTF9LCAvLyBfX2J1aWx0aW5fYXJtX3VzYXgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91c3ViMTYsIDM3MzB9LCAvLyBfX2J1aWx0aW5fYXJtX3VzdWIxNgorICAgICAge0ludHJpbnNpYzo6YXJtX3VzdWI4LCAzNzUxfSwgLy8gX19idWlsdGluX2FybV91c3ViOAorICAgICAge0ludHJpbnNpYzo6YXJtX3V4dGFiMTYsIDM3NzF9LCAvLyBfX2J1aWx0aW5fYXJtX3V4dGFiMTYKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91eHRiMTYsIDM3OTN9LCAvLyBfX2J1aWx0aW5fYXJtX3V4dGIxNgorICAgIH07CisgICAgYXV0byBJID0gc3RkOjpsb3dlcl9ib3VuZChzdGQ6OmJlZ2luKGFybU5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZW5kKGFybU5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5OYW1lU3RyKTsKKyAgICBpZiAoSSAhPSBzdGQ6OmVuZChhcm1OYW1lcykgJiYKKyAgICAgICAgSS0+Z2V0TmFtZSgpID09IEJ1aWx0aW5OYW1lU3RyKQorICAgICAgcmV0dXJuIEktPkludHJpbklEOworICB9CisgIGlmIChUYXJnZXRQcmVmaXggPT0gImJwZiIpIHsKKyAgICBzdGF0aWMgY29uc3QgQnVpbHRpbkVudHJ5IGJwZk5hbWVzW10gPSB7CisgICAgICB7SW50cmluc2ljOjpicGZfbG9hZF9ieXRlLCAzODE0fSwgLy8gX19idWlsdGluX2JwZl9sb2FkX2J5dGUKKyAgICAgIHtJbnRyaW5zaWM6OmJwZl9sb2FkX2hhbGYsIDM4Mzh9LCAvLyBfX2J1aWx0aW5fYnBmX2xvYWRfaGFsZgorICAgICAge0ludHJpbnNpYzo6YnBmX2xvYWRfd29yZCwgMzg2Mn0sIC8vIF9fYnVpbHRpbl9icGZfbG9hZF93b3JkCisgICAgICB7SW50cmluc2ljOjpicGZfcHNldWRvLCAzODg2fSwgLy8gX19idWlsdGluX2JwZl9wc2V1ZG8KKyAgICB9OworICAgIGF1dG8gSSA9IHN0ZDo6bG93ZXJfYm91bmQoc3RkOjpiZWdpbihicGZOYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZChicGZOYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluTmFtZVN0cik7CisgICAgaWYgKEkgIT0gc3RkOjplbmQoYnBmTmFtZXMpICYmCisgICAgICAgIEktPmdldE5hbWUoKSA9PSBCdWlsdGluTmFtZVN0cikKKyAgICAgIHJldHVybiBJLT5JbnRyaW5JRDsKKyAgfQorICBpZiAoVGFyZ2V0UHJlZml4ID09ICJoZXhhZ29uIikgeworICAgIHN0YXRpYyBjb25zdCBCdWlsdGluRW50cnkgaGV4YWdvbk5hbWVzW10gPSB7CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FicywgMzkwN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2FicworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9hYnNwLCAzOTMyfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfYWJzcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9hYnNzYXQsIDM5NTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hYnNzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYWRkLCAzOTg2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfYWRkCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FkZGhfaDE2X2hoLCA0MDExfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfYWRkaF9oMTZfaGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYWRkaF9oMTZfaGwsIDQwNDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRoX2gxNl9obAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9hZGRoX2gxNl9saCwgNDA3N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2FkZGhfaDE2X2xoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FkZGhfaDE2X2xsLCA0MTEwfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfYWRkaF9oMTZfbGwKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYWRkaF9oMTZfc2F0X2hoLCA0MTQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfYWRkaF9oMTZfc2F0X2hoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FkZGhfaDE2X3NhdF9obCwgNDE4MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2FkZGhfaDE2X3NhdF9obAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9hZGRoX2gxNl9zYXRfbGgsIDQyMTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRoX2gxNl9zYXRfbGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYWRkaF9oMTZfc2F0X2xsLCA0MjU0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfYWRkaF9oMTZfc2F0X2xsCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FkZGhfbDE2X2hsLCA0MjkxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfYWRkaF9sMTZfaGwKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYWRkaF9sMTZfbGwsIDQzMjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRoX2wxNl9sbAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9hZGRoX2wxNl9zYXRfaGwsIDQzNTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRoX2wxNl9zYXRfaGwKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYWRkaF9sMTZfc2F0X2xsLCA0Mzk0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfYWRkaF9sMTZfc2F0X2xsCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FkZGksIDQ0MzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FkZHAsIDQ0NTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FkZHBzYXQsIDQ0ODN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRwc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FkZHNhdCwgNDUxMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2FkZHNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9hZGRzcCwgNDU0MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2FkZHNwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FuZCwgNDU2N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9hbmRpciwgNDU5Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2FuZGlyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FuZHAsIDQ2MTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hbmRwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FzbGgsIDQ2NDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hc2xoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FzcmgsIDQ2NzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hc3JoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2NvbWJpbmVfaGgsIDQ2OTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9jb21iaW5lX2hoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2NvbWJpbmVfaGwsIDQ3Mjl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9jb21iaW5lX2hsCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2NvbWJpbmVfbGgsIDQ3NjF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9jb21iaW5lX2xoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2NvbWJpbmVfbGwsIDQ3OTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9jb21iaW5lX2xsCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2NvbWJpbmVpaSwgNDgyNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2NvbWJpbmVpaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9jb21iaW5ldywgNDg1Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2NvbWJpbmV3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX21heCwgNDg4Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX21heAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9tYXhwLCA0OTExfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfbWF4cAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9tYXh1LCA0OTM3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfbWF4dQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9tYXh1cCwgNDk2M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX21heHVwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX21pbiwgNDk5MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX21pbgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9taW5wLCA1MDE1fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfbWlucAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9taW51LCA1MDQxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfbWludQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9taW51cCwgNTA2N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX21pbnVwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX25lZywgNTA5NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX25lZworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9uZWdwLCA1MTE5fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfbmVncAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9uZWdzYXQsIDUxNDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9uZWdzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfbm90LCA1MTczfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfbm90CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX25vdHAsIDUxOTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9ub3RwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX29yLCA1MjI0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfb3JpciwgNTI0OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX29yaXIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfb3JwLCA1Mjc0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfb3JwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3JvdW5kc2F0LCA1Mjk5fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfcm91bmRzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc2F0LCA1MzI5fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3NhdGIsIDUzNTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zYXRiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3NhdGgsIDUzODB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zYXRoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3NhdHViLCA1NDA2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfc2F0dWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc2F0dWgsIDU0MzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zYXR1aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zdWIsIDU0NjB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3ViaF9oMTZfaGgsIDU0ODV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWJoX2gxNl9oaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zdWJoX2gxNl9obCwgNTUxOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YmhfaDE2X2hsCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N1YmhfaDE2X2xoLCA1NTUxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfc3ViaF9oMTZfbGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3ViaF9oMTZfbGwsIDU1ODR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWJoX2gxNl9sbAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zdWJoX2gxNl9zYXRfaGgsIDU2MTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWJoX2gxNl9zYXRfaGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3ViaF9oMTZfc2F0X2hsLCA1NjU0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfc3ViaF9oMTZfc2F0X2hsCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N1YmhfaDE2X3NhdF9saCwgNTY5MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YmhfaDE2X3NhdF9saAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zdWJoX2gxNl9zYXRfbGwsIDU3Mjh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWJoX2gxNl9zYXRfbGwKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3ViaF9sMTZfaGwsIDU3NjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWJoX2wxNl9obAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zdWJoX2wxNl9sbCwgNTc5OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YmhfbDE2X2xsCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N1YmhfbDE2X3NhdF9obCwgNTgzMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YmhfbDE2X3NhdF9obAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zdWJoX2wxNl9zYXRfbGwsIDU4Njh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWJoX2wxNl9zYXRfbGwKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3VicCwgNTkwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YnAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3VicmksIDU5MzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWJyaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zdWJzYXQsIDU5NTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWJzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3ZhZGRoLCA1OTg2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfc3ZhZGRoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N2YWRkaHMsIDYwMTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdmFkZGhzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N2YWRkdWhzLCA2MDQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfc3ZhZGR1aHMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3ZhdmdoLCA2MDczfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfc3ZhdmdoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N2YXZnaHMsIDYxMDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdmF2Z2hzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N2bmF2Z2gsIDYxMzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdm5hdmdoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N2c3ViaCwgNjE1OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N2c3ViaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zdnN1YmhzLCA2MTg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfc3ZzdWJocworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zdnN1YnVocywgNjIxNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N2c3VidWhzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N3aXosIDYyNDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zd2l6CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N4dGIsIDYyNzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zeHRiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N4dGgsIDYyOTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zeHRoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N4dHcsIDYzMjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zeHR3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3RmciwgNjM1MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3RmcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl90ZnJpaCwgNjM3NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3RmcmloCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3RmcmlsLCA2NDAyfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdGZyaWwKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdGZycCwgNjQyOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3RmcnAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdGZycGksIDY0NTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl90ZnJwaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl90ZnJzaSwgNjQ4Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3RmcnNpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZhYnNoLCA2NTA5fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmFic2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmFic2hzYXQsIDY1MzZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92YWJzaHNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92YWJzdywgNjU2Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZhYnN3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZhYnN3c2F0LCA2NTkzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmFic3dzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmFkZGJfbWFwLCA2NjIzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmFkZGJfbWFwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZhZGRoLCA2NjU0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmFkZGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmFkZGhzLCA2NjgxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmFkZGhzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZhZGR1YiwgNjcwOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZhZGR1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92YWRkdWJzLCA2NzM3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmFkZHVicworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92YWRkdWhzLCA2NzY2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmFkZHVocworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92YWRkdywgNjc5NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZhZGR3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZhZGR3cywgNjgyMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZhZGR3cworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92YXZnaCwgNjg1MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZhdmdoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZhdmdoY3IsIDY4Nzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92YXZnaGNyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZhdmdociwgNjkwNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZhdmdocgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92YXZndWIsIDY5MzR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92YXZndWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmF2Z3ViciwgNjk2Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3Zhdmd1YnIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmF2Z3VoLCA2OTkxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmF2Z3VoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3Zhdmd1aHIsIDcwMTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92YXZndWhyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3Zhdmd1dywgNzA0OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3Zhdmd1dworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92YXZndXdyLCA3MDc2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmF2Z3V3cgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92YXZndywgNzEwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3Zhdmd3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3Zhdmd3Y3IsIDcxMzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92YXZnd2NyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3Zhdmd3ciwgNzE2MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3Zhdmd3cgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92Y21wYmVxLCA3MTg5fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmNtcGJlcQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92Y21wYmd0dSwgNzIxOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZjbXBiZ3R1CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZjbXBoZXEsIDcyNDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92Y21waGVxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZjbXBoZ3QsIDcyNzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92Y21waGd0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZjbXBoZ3R1LCA3MzA2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmNtcGhndHUKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmNtcHdlcSwgNzMzNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZjbXB3ZXEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmNtcHdndCwgNzM2NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZjbXB3Z3QKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmNtcHdndHUsIDczOTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92Y21wd2d0dQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92Y29uaiwgNzQyNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3Zjb25qCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZtYXhiLCA3NDUxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdm1heGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdm1heGgsIDc0Nzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92bWF4aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92bWF4dWIsIDc1MDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92bWF4dWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdm1heHVoLCA3NTMzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdm1heHVoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZtYXh1dywgNzU2MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZtYXh1dworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92bWF4dywgNzU4OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZtYXh3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZtaW5iLCA3NjE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdm1pbmIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdm1pbmgsIDc2NDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92bWluaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92bWludWIsIDc2NzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92bWludWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdm1pbnVoLCA3Njk4fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdm1pbnVoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZtaW51dywgNzcyNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZtaW51dworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92bWludywgNzc1NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZtaW53CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZuYXZnaCwgNzc4MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZuYXZnaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92bmF2Z2hjciwgNzgwOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZuYXZnaGNyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZuYXZnaHIsIDc4Mzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92bmF2Z2hyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZuYXZndywgNzg2OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZuYXZndworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92bmF2Z3djciwgNzg5Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZuYXZnd2NyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZuYXZnd3IsIDc5MjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92bmF2Z3dyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZyYWRkdWIsIDc5NTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92cmFkZHViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZyYWRkdWJfYWNjLCA3OTg0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdnJhZGR1Yl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdnJzYWR1YiwgODAxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3Zyc2FkdWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdnJzYWR1Yl9hY2MsIDgwNDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92cnNhZHViX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92c3ViYl9tYXAsIDgwNzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92c3ViYl9tYXAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdnN1YmgsIDgxMTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92c3ViaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92c3ViaHMsIDgxMzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92c3ViaHMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdnN1YnViLCA4MTY1fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdnN1YnViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZzdWJ1YnMsIDgxOTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92c3VidWJzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZzdWJ1aHMsIDgyMjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92c3VidWhzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZzdWJ3LCA4MjUxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdnN1YncKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdnN1YndzLCA4Mjc4fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdnN1YndzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3hvciwgODMwNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3hvcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl94b3JwLCA4MzMxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfeG9ycAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl96eHRiLCA4MzU3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfenh0YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl96eHRoLCA4MzgzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfenh0aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9hbmRuLCA4NDA5fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfYW5kbgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9hbmRucCwgODQzNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X2FuZG5wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X2JpdHNwbGl0LCA4NDYyfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfYml0c3BsaXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfYml0c3BsaXRpLCA4NDkyfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfYml0c3BsaXRpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X2JvdW5kc2NoZWNrLCA4NTIzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfYm91bmRzY2hlY2sKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfY21wYmVxLCA4NTU2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfY21wYmVxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X2NtcGJlcWksIDg1ODR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9jbXBiZXFpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X2NtcGJndCwgODYxM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X2NtcGJndAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9jbXBiZ3RpLCA4NjQxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfY21wYmd0aQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9jbXBiZ3R1LCA4NjcwfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfY21wYmd0dQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9jbXBiZ3R1aSwgODY5OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X2NtcGJndHVpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X2NtcGhlcSwgODcyOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X2NtcGhlcQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9jbXBoZXFpLCA4NzU3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfY21waGVxaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9jbXBoZ3QsIDg3ODZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9jbXBoZ3QKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfY21waGd0aSwgODgxNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X2NtcGhndGkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfY21waGd0dSwgODg0M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X2NtcGhndHUKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfY21waGd0dWksIDg4NzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9jbXBoZ3R1aQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9jb21iaW5laXIsIDg5MDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9jb21iaW5laXIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfY29tYmluZXJpLCA4OTMzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfY29tYmluZXJpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X2Nyb3VuZF9yaSwgODk2NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X2Nyb3VuZF9yaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9jcm91bmRfcnIsIDg5OTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9jcm91bmRfcnIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfbW9kd3JhcHUsIDkwMjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9tb2R3cmFwdQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9vcm4sIDkwNTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9vcm4KKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfb3JucCwgOTA4MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X29ybnAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfcmNtcGVxLCA5MTA3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfcmNtcGVxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3JjbXBlcWksIDkxMzV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9yY21wZXFpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3JjbXBuZXEsIDkxNjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9yY21wbmVxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3JjbXBuZXFpLCA5MTkzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfcmNtcG5lcWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfcm91bmRfcmksIDkyMjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9yb3VuZF9yaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9yb3VuZF9yaV9zYXQsIDkyNTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9yb3VuZF9yaV9zYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfcm91bmRfcnIsIDkyODd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9yb3VuZF9ycgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9yb3VuZF9ycl9zYXQsIDkzMTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9yb3VuZF9ycl9zYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfdGxibWF0Y2gsIDkzNTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF90bGJtYXRjaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF92Y21wYmVxX2FueSwgOTM4MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZjbXBiZXFfYW55CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3ZjbXBiZXFpLCA5NDE0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfdmNtcGJlcWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfdmNtcGJndCwgOTQ0NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZjbXBiZ3QKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfdmNtcGJndGksIDk0NzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF92Y21wYmd0aQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF92Y21wYmd0dWksIDk1MDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF92Y21wYmd0dWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfdmNtcGhlcWksIDk1MzR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF92Y21waGVxaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF92Y21waGd0aSwgOTU2NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZjbXBoZ3RpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3ZjbXBoZ3R1aSwgOTU5NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZjbXBoZ3R1aQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF92Y21wd2VxaSwgOTYyNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZjbXB3ZXFpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3ZjbXB3Z3RpLCA5NjU1fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfdmNtcHdndGkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfdmNtcHdndHVpLCA5Njg1fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfdmNtcHdndHVpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3ZybWF4aCwgOTcxNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZybWF4aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF92cm1heHVoLCA5NzQ0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfdnJtYXh1aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF92cm1heHV3LCA5NzczfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfdnJtYXh1dworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF92cm1heHcsIDk4MDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF92cm1heHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfdnJtaW5oLCA5ODMwfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfdnJtaW5oCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3ZybWludWgsIDk4NTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF92cm1pbnVoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3ZybWludXcsIDk4ODd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF92cm1pbnV3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3ZybWludywgOTkxNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZybWludworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNV92YWRkaHVicywgOTk0NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E1X3ZhZGRodWJzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E2X3ZjbXBiZXFfbm90YW55LCA5OTc0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTZfdmNtcGJlcV9ub3RhbnkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTZfdmNtcGJlcV9ub3RhbnlfMTI4QiwgMTAwMTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNl92Y21wYmVxX25vdGFueV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX2FsbDgsIDEwMDUxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfYWxsOAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl9hbmQsIDEwMDc3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX2FuZG4sIDEwMTAyfSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfYW5kbgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl9hbnk4LCAxMDEyOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX2FueTgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfYml0c2NsciwgMTAxNTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9iaXRzY2xyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX2JpdHNjbHJpLCAxMDE4M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX2JpdHNjbHJpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX2JpdHNzZXQsIDEwMjEzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfYml0c3NldAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl9jbXBlcSwgMTAyNDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9jbXBlcQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl9jbXBlcWksIDEwMjY5fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfY21wZXFpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX2NtcGVxcCwgMTAyOTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9jbXBlcXAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfY21wZ2VpLCAxMDMyNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX2NtcGdlaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl9jbXBnZXVpLCAxMDM1M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX2NtcGdldWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfY21wZ3QsIDEwMzgyfSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfY21wZ3QKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfY21wZ3RpLCAxMDQwOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX2NtcGd0aQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl9jbXBndHAsIDEwNDM3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfY21wZ3RwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX2NtcGd0dSwgMTA0NjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9jbXBndHUKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfY21wZ3R1aSwgMTA0OTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9jbXBndHVpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX2NtcGd0dXAsIDEwNTIyfSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfY21wZ3R1cAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl9jbXBsdCwgMTA1NTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9jbXBsdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl9jbXBsdHUsIDEwNTc4fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfY21wbHR1CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX21hc2ssIDEwNjA2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfbWFzaworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl9tdXgsIDEwNjMyfSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfbXV4CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX211eGlpLCAxMDY1N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX211eGlpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX211eGlyLCAxMDY4NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX211eGlyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX211eHJpLCAxMDcxMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX211eHJpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX25vdCwgMTA3Mzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9ub3QKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfb3IsIDEwNzYzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfb3JuLCAxMDc4N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX29ybgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl9weGZlcl9tYXAsIDEwODEyfSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfcHhmZXJfbWFwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX3RmcnByLCAxMDg0M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX3RmcnByCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX3RmcnJwLCAxMDg3MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX3RmcnJwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX3ZpdHBhY2ssIDEwODk3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfdml0cGFjaworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl92bXV4LCAxMDkyNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX3ZtdXgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfeG9yLCAxMDk1Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX3hvcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DNF9hbmRfYW5kLCAxMDk3N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0M0X2FuZF9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzRfYW5kX2FuZG4sIDExMDA2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzRfYW5kX2FuZG4KKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzRfYW5kX29yLCAxMTAzNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0M0X2FuZF9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DNF9hbmRfb3JuLCAxMTA2NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0M0X2FuZF9vcm4KKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzRfY21wbHRlLCAxMTA5M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0M0X2NtcGx0ZQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DNF9jbXBsdGVpLCAxMTEyMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0M0X2NtcGx0ZWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzRfY21wbHRldSwgMTExNTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DNF9jbXBsdGV1CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0M0X2NtcGx0ZXVpLCAxMTE3OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0M0X2NtcGx0ZXVpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0M0X2NtcG5lcSwgMTEyMDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DNF9jbXBuZXEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzRfY21wbmVxaSwgMTEyMzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DNF9jbXBuZXFpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0M0X2Zhc3Rjb3JuZXI5LCAxMTI2Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0M0X2Zhc3Rjb3JuZXI5CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0M0X2Zhc3Rjb3JuZXI5X25vdCwgMTEyOTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DNF9mYXN0Y29ybmVyOV9ub3QKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzRfbmJpdHNjbHIsIDExMzM2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzRfbmJpdHNjbHIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzRfbmJpdHNjbHJpLCAxMTM2Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0M0X25iaXRzY2xyaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DNF9uYml0c3NldCwgMTEzOTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DNF9uYml0c3NldAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DNF9vcl9hbmQsIDExNDI3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzRfb3JfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0M0X29yX2FuZG4sIDExNDU1fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzRfb3JfYW5kbgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DNF9vcl9vciwgMTE0ODR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DNF9vcl9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DNF9vcl9vcm4sIDExNTExfSwgLy8gX19idWlsdGluX0hFWEFHT05fQzRfb3Jfb3JuCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2NvbnZfZDJkZiwgMTE1Mzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X2QyZGYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl9kMnNmLCAxMTU3MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfZDJzZgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9jb252X2RmMmQsIDExNjAxfSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl9kZjJkCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2NvbnZfZGYyZF9jaG9wLCAxMTYzMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfZGYyZF9jaG9wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2NvbnZfZGYyc2YsIDExNjY4fSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl9kZjJzZgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9jb252X2RmMnVkLCAxMTcwMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfZGYydWQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl9kZjJ1ZF9jaG9wLCAxMTczMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfZGYydWRfY2hvcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9jb252X2RmMnV3LCAxMTc2OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfZGYydXcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl9kZjJ1d19jaG9wLCAxMTgwMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfZGYydXdfY2hvcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9jb252X2RmMncsIDExODM4fSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl9kZjJ3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2NvbnZfZGYyd19jaG9wLCAxMTg2OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfZGYyd19jaG9wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2NvbnZfc2YyZCwgMTE5MDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X3NmMmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl9zZjJkX2Nob3AsIDExOTM2fSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl9zZjJkX2Nob3AKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl9zZjJkZiwgMTE5NzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X3NmMmRmCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2NvbnZfc2YydWQsIDEyMDA0fSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl9zZjJ1ZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9jb252X3NmMnVkX2Nob3AsIDEyMDM2fSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl9zZjJ1ZF9jaG9wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2NvbnZfc2YydXcsIDEyMDczfSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl9zZjJ1dworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9jb252X3NmMnV3X2Nob3AsIDEyMTA1fSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl9zZjJ1d19jaG9wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2NvbnZfc2YydywgMTIxNDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X3NmMncKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl9zZjJ3X2Nob3AsIDEyMTczfSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl9zZjJ3X2Nob3AKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl91ZDJkZiwgMTIyMDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X3VkMmRmCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2NvbnZfdWQyc2YsIDEyMjQxfSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl91ZDJzZgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9jb252X3V3MmRmLCAxMjI3M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfdXcyZGYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl91dzJzZiwgMTIzMDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X3V3MnNmCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2NvbnZfdzJkZiwgMTIzMzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X3cyZGYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl93MnNmLCAxMjM2OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfdzJzZgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9kZmNsYXNzLCAxMjM5OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2RmY2xhc3MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfZGZjbXBlcSwgMTI0Mjh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9kZmNtcGVxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2RmY21wZ2UsIDEyNDU3fSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfZGZjbXBnZQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9kZmNtcGd0LCAxMjQ4Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2RmY21wZ3QKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfZGZjbXB1bywgMTI1MTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9kZmNtcHVvCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2RmaW1tX24sIDEyNTQ0fSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfZGZpbW1fbgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9kZmltbV9wLCAxMjU3M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2RmaW1tX3AKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfc2ZhZGQsIDEyNjAyfSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfc2ZhZGQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfc2ZjbGFzcywgMTI2Mjl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmNsYXNzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX3NmY21wZXEsIDEyNjU4fSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfc2ZjbXBlcQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9zZmNtcGdlLCAxMjY4N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmY21wZ2UKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfc2ZjbXBndCwgMTI3MTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmNtcGd0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX3NmY21wdW8sIDEyNzQ1fSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfc2ZjbXB1bworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9zZmZpeHVwZCwgMTI3NzR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmZpeHVwZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9zZmZpeHVwbiwgMTI4MDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmZpeHVwbgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9zZmZpeHVwciwgMTI4MzR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmZpeHVwcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9zZmZtYSwgMTI4NjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmZtYQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9zZmZtYV9saWIsIDEyODkxfSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfc2ZmbWFfbGliCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX3NmZm1hX3NjLCAxMjkyMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmZm1hX3NjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX3NmZm1zLCAxMjk1Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmZm1zCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX3NmZm1zX2xpYiwgMTI5Nzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmZtc19saWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfc2ZpbW1fbiwgMTMwMTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmltbV9uCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX3NmaW1tX3AsIDEzMDM5fSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfc2ZpbW1fcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9zZm1heCwgMTMwNjh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZm1heAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9zZm1pbiwgMTMwOTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZm1pbgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9zZm1weSwgMTMxMjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZm1weQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9zZnN1YiwgMTMxNDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZnN1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9MMl9sb2Fkd19sb2NrZWQsIDEzMTc2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTDJfbG9hZHdfbG9ja2VkCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0w0X2xvYWRkX2xvY2tlZCwgMTMyMTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9MNF9sb2FkZF9sb2NrZWQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfYWNjaSwgMTMyNDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9hY2NpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2FjY2lpLCAxMzI3MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2FjY2lpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2NtYWNpX3MwLCAxMzI5N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2NtYWNpX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2NtYWNyX3MwLCAxMzMyN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2NtYWNyX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2NtYWNzX3MwLCAxMzM1N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2NtYWNzX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2NtYWNzX3MxLCAxMzM4N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2NtYWNzX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2NtYWNzY19zMCwgMTM0MTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbWFjc2NfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfY21hY3NjX3MxLCAxMzQ0OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2NtYWNzY19zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9jbXB5aV9zMCwgMTM0Nzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbXB5aV9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9jbXB5cl9zMCwgMTM1MDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbXB5cl9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9jbXB5cnNfczAsIDEzNTM5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfY21weXJzX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2NtcHlyc19zMSwgMTM1NzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbXB5cnNfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfY21weXJzY19zMCwgMTM2MDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbXB5cnNjX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2NtcHlyc2NfczEsIDEzNjMzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfY21weXJzY19zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9jbXB5c19zMCwgMTM2NjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbXB5c19zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9jbXB5c19zMSwgMTM2OTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbXB5c19zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9jbXB5c2NfczAsIDEzNzI1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfY21weXNjX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2NtcHlzY19zMSwgMTM3NTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbXB5c2NfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfY25hY3NfczAsIDEzNzg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfY25hY3NfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfY25hY3NfczEsIDEzODE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfY25hY3NfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfY25hY3NjX3MwLCAxMzg0N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2NuYWNzY19zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9jbmFjc2NfczEsIDEzODc4fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfY25hY3NjX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2RwbXB5c3NfYWNjX3MwLCAxMzkwOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2RwbXB5c3NfYWNjX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2RwbXB5c3NfbmFjX3MwLCAxMzk0NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2RwbXB5c3NfbmFjX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2RwbXB5c3Nfcm5kX3MwLCAxMzk4MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2RwbXB5c3Nfcm5kX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2RwbXB5c3NfczAsIDE0MDE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfZHBtcHlzc19zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9kcG1weXV1X2FjY19zMCwgMTQwNDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9kcG1weXV1X2FjY19zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9kcG1weXV1X25hY19zMCwgMTQwODV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9kcG1weXV1X25hY19zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9kcG1weXV1X3MwLCAxNDEyMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2RwbXB5dXVfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfaG1tcHloX3JzMSwgMTQxNTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9obW1weWhfcnMxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2htbXB5aF9zMSwgMTQxODV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9obW1weWhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfaG1tcHlsX3JzMSwgMTQyMTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9obW1weWxfcnMxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2htbXB5bF9zMSwgMTQyNDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9obW1weWxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbWFjaSwgMTQyNzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tYWNpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21hY3NpbiwgMTQzMDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tYWNzaW4KKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbWFjc2lwLCAxNDMzM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21hY3NpcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbWFjaHNfcnMwLCAxNDM2MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWNoc19yczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1hY2hzX3JzMSwgMTQzOTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbWFjaHNfcnMxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tYWNoc19zMCwgMTQ0MjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbWFjaHNfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1hY2hzX3MxLCAxNDQ1Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWNoc19zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbWFjbHNfcnMwLCAxNDQ4N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWNsc19yczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1hY2xzX3JzMSwgMTQ1MTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbWFjbHNfcnMxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tYWNsc19zMCwgMTQ1NTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbWFjbHNfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1hY2xzX3MxLCAxNDU4Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWNsc19zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbWFjdWhzX3JzMCwgMTQ2MTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbWFjdWhzX3JzMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbWFjdWhzX3JzMSwgMTQ2NDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbWFjdWhzX3JzMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbWFjdWhzX3MwLCAxNDY3OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWN1aHNfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1hY3Voc19zMSwgMTQ3MTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbWFjdWhzX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tYWN1bHNfcnMwLCAxNDc0M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWN1bHNfcnMwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tYWN1bHNfcnMxLCAxNDc3Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWN1bHNfcnMxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tYWN1bHNfczAsIDE0ODA5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1hY3Vsc19zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbWFjdWxzX3MxLCAxNDg0MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWN1bHNfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1weWhfcnMwLCAxNDg3M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHloX3JzMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbXB5aF9yczEsIDE0OTA0fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1weWhfcnMxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tcHloX3MwLCAxNDkzNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHloX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tcHloX3MxLCAxNDk2NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHloX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tcHlsX3JzMCwgMTQ5OTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbXB5bF9yczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1weWxfcnMxLCAxNTAyNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHlsX3JzMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbXB5bF9zMCwgMTUwNTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbXB5bF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbXB5bF9zMSwgMTUwODd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbXB5bF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbXB5dWhfcnMwLCAxNTExN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHl1aF9yczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1weXVoX3JzMSwgMTUxNDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbXB5dWhfcnMxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tcHl1aF9zMCwgMTUxODF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbXB5dWhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1weXVoX3MxLCAxNTIxMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHl1aF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbXB5dWxfcnMwLCAxNTI0M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHl1bF9yczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1weXVsX3JzMSwgMTUyNzV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbXB5dWxfcnMxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tcHl1bF9zMCwgMTUzMDd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbXB5dWxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1weXVsX3MxLCAxNTMzOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHl1bF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfYWNjX2hoX3MwLCAxNTM2OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2NfaGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2FjY19oaF9zMSwgMTU0MDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfYWNjX2hoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9hY2NfaGxfczAsIDE1NDM5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19obF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfYWNjX2hsX3MxLCAxNTQ3NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2NfaGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2FjY19saF9zMCwgMTU1MDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfYWNjX2xoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9hY2NfbGhfczEsIDE1NTQ0fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19saF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfYWNjX2xsX3MwLCAxNTU3OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2NfbGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2FjY19sbF9zMSwgMTU2MTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfYWNjX2xsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9hY2Nfc2F0X2hoX3MwLCAxNTY0OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2Nfc2F0X2hoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9hY2Nfc2F0X2hoX3MxLCAxNTY4OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2Nfc2F0X2hoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9hY2Nfc2F0X2hsX3MwLCAxNTcyN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2Nfc2F0X2hsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9hY2Nfc2F0X2hsX3MxLCAxNTc2Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2Nfc2F0X2hsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9hY2Nfc2F0X2xoX3MwLCAxNTgwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2Nfc2F0X2xoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9hY2Nfc2F0X2xoX3MxLCAxNTg0NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2Nfc2F0X2xoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9hY2Nfc2F0X2xsX3MwLCAxNTg4M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2Nfc2F0X2xsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9hY2Nfc2F0X2xsX3MxLCAxNTkyMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2Nfc2F0X2xsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9oaF9zMCwgMTU5NjF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfaGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2hoX3MxLCAxNTk5Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9oaF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfaGxfczAsIDE2MDIzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2hsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9obF9zMSwgMTYwNTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfaGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2xoX3MwLCAxNjA4NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9saF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfbGhfczEsIDE2MTE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2xoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9sbF9zMCwgMTYxNDd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfbGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2xsX3MxLCAxNjE3OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9sbF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfbmFjX2hoX3MwLCAxNjIwOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfaGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X25hY19oaF9zMSwgMTYyNDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfbmFjX2hoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9uYWNfaGxfczAsIDE2Mjc5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19obF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfbmFjX2hsX3MxLCAxNjMxNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfaGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X25hY19saF9zMCwgMTYzNDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfbmFjX2xoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9uYWNfbGhfczEsIDE2Mzg0fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19saF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfbmFjX2xsX3MwLCAxNjQxOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfbGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X25hY19sbF9zMSwgMTY0NTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfbmFjX2xsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9uYWNfc2F0X2hoX3MwLCAxNjQ4OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfc2F0X2hoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9uYWNfc2F0X2hoX3MxLCAxNjUyOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfc2F0X2hoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9uYWNfc2F0X2hsX3MwLCAxNjU2N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfc2F0X2hsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9uYWNfc2F0X2hsX3MxLCAxNjYwNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfc2F0X2hsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9uYWNfc2F0X2xoX3MwLCAxNjY0NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfc2F0X2xoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9uYWNfc2F0X2xoX3MxLCAxNjY4NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfc2F0X2xoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9uYWNfc2F0X2xsX3MwLCAxNjcyM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfc2F0X2xsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9uYWNfc2F0X2xsX3MxLCAxNjc2Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfc2F0X2xsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9ybmRfaGhfczAsIDE2ODAxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3JuZF9oaF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfcm5kX2hoX3MxLCAxNjgzNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9ybmRfaGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X3JuZF9obF9zMCwgMTY4NzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfcm5kX2hsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9ybmRfaGxfczEsIDE2OTA2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3JuZF9obF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfcm5kX2xoX3MwLCAxNjk0MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9ybmRfbGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X3JuZF9saF9zMSwgMTY5NzZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfcm5kX2xoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9ybmRfbGxfczAsIDE3MDExfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3JuZF9sbF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfcm5kX2xsX3MxLCAxNzA0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9ybmRfbGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X3NhdF9oaF9zMCwgMTcwODF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfc2F0X2hoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9zYXRfaGhfczEsIDE3MTE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3NhdF9oaF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfc2F0X2hsX3MwLCAxNzE1MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9zYXRfaGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X3NhdF9obF9zMSwgMTcxODZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfc2F0X2hsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9zYXRfbGhfczAsIDE3MjIxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3NhdF9saF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfc2F0X2xoX3MxLCAxNzI1Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9zYXRfbGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X3NhdF9sbF9zMCwgMTcyOTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfc2F0X2xsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9zYXRfbGxfczEsIDE3MzI2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3NhdF9sbF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9oaF9zMCwgMTczNjF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfc2F0X3JuZF9oaF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9oaF9zMSwgMTc0MDB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfc2F0X3JuZF9oaF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9obF9zMCwgMTc0Mzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfc2F0X3JuZF9obF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9obF9zMSwgMTc0Nzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfc2F0X3JuZF9obF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9saF9zMCwgMTc1MTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfc2F0X3JuZF9saF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9saF9zMSwgMTc1NTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfc2F0X3JuZF9saF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9sbF9zMCwgMTc1OTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfc2F0X3JuZF9sbF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9sbF9zMSwgMTc2MzR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfc2F0X3JuZF9sbF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfdXAsIDE3NjczfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3VwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV91cF9zMSwgMTc3MDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfdXBfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X3VwX3MxX3NhdCwgMTc3MzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfdXBfczFfc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weWRfYWNjX2hoX3MwLCAxNzc2N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weWRfYWNjX2hoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weWRfYWNjX2hoX3MxLCAxNzgwM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weWRfYWNjX2hoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weWRfYWNjX2hsX3MwLCAxNzgzOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weWRfYWNjX2hsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weWRfYWNjX2hsX3MxLCAxNzg3NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weWRfYWNjX2hsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weWRfYWNjX2xoX3MwLCAxNzkxMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weWRfYWNjX2xoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weWRfYWNjX2xoX3MxLCAxNzk0N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weWRfYWNjX2xoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weWRfYWNjX2xsX3MwLCAxNzk4M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weWRfYWNjX2xsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weWRfYWNjX2xsX3MxLCAxODAxOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weWRfYWNjX2xsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weWRfaGhfczAsIDE4MDU1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9oaF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX2hoX3MxLCAxODA4N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weWRfaGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9obF9zMCwgMTgxMTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX2hsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weWRfaGxfczEsIDE4MTUxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9obF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX2xoX3MwLCAxODE4M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weWRfbGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9saF9zMSwgMTgyMTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX2xoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weWRfbGxfczAsIDE4MjQ3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9sbF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX2xsX3MxLCAxODI3OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weWRfbGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9uYWNfaGhfczAsIDE4MzExfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9uYWNfaGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9uYWNfaGhfczEsIDE4MzQ3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9uYWNfaGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9uYWNfaGxfczAsIDE4MzgzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9uYWNfaGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9uYWNfaGxfczEsIDE4NDE5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9uYWNfaGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9uYWNfbGhfczAsIDE4NDU1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9uYWNfbGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9uYWNfbGhfczEsIDE4NDkxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9uYWNfbGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9uYWNfbGxfczAsIDE4NTI3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9uYWNfbGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9uYWNfbGxfczEsIDE4NTYzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9uYWNfbGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9ybmRfaGhfczAsIDE4NTk5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9ybmRfaGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9ybmRfaGhfczEsIDE4NjM1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9ybmRfaGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9ybmRfaGxfczAsIDE4NjcxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9ybmRfaGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9ybmRfaGxfczEsIDE4NzA3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9ybmRfaGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9ybmRfbGhfczAsIDE4NzQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9ybmRfbGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9ybmRfbGhfczEsIDE4Nzc5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9ybmRfbGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9ybmRfbGxfczAsIDE4ODE1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9ybmRfbGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9ybmRfbGxfczEsIDE4ODUxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9ybmRfbGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5aSwgMTg4ODd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXNtaSwgMTg5MTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlzbWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5c3VfdXAsIDE4OTQxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5c3VfdXAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dV9hY2NfaGhfczAsIDE4OTcxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9hY2NfaGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dV9hY2NfaGhfczEsIDE5MDA3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9hY2NfaGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dV9hY2NfaGxfczAsIDE5MDQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9hY2NfaGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dV9hY2NfaGxfczEsIDE5MDc5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9hY2NfaGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dV9hY2NfbGhfczAsIDE5MTE1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9hY2NfbGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dV9hY2NfbGhfczEsIDE5MTUxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9hY2NfbGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dV9hY2NfbGxfczAsIDE5MTg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9hY2NfbGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dV9hY2NfbGxfczEsIDE5MjIzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9hY2NfbGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dV9oaF9zMCwgMTkyNTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2hoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVfaGhfczEsIDE5MjkxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9oaF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X2hsX3MwLCAxOTMyM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfaGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dV9obF9zMSwgMTkzNTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2hsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVfbGhfczAsIDE5Mzg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9saF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X2xoX3MxLCAxOTQxOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfbGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dV9sbF9zMCwgMTk0NTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2xsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVfbGxfczEsIDE5NDgzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9sbF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X25hY19oaF9zMCwgMTk1MTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X25hY19oaF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X25hY19oaF9zMSwgMTk1NTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X25hY19oaF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X25hY19obF9zMCwgMTk1ODd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X25hY19obF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X25hY19obF9zMSwgMTk2MjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X25hY19obF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X25hY19saF9zMCwgMTk2NTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X25hY19saF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X25hY19saF9zMSwgMTk2OTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X25hY19saF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X25hY19sbF9zMCwgMTk3MzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X25hY19sbF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X25hY19sbF9zMSwgMTk3Njd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X25hY19sbF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X3VwLCAxOTgwM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfdXAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfYWNjX2hoX3MwLCAxOTgzMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2FjY19oaF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1ZF9hY2NfaGhfczEsIDE5ODY5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfYWNjX2hoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX2FjY19obF9zMCwgMTk5MDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9hY2NfaGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfYWNjX2hsX3MxLCAxOTk0M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2FjY19obF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1ZF9hY2NfbGhfczAsIDE5OTgwfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfYWNjX2xoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX2FjY19saF9zMSwgMjAwMTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9hY2NfbGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfYWNjX2xsX3MwLCAyMDA1NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2FjY19sbF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1ZF9hY2NfbGxfczEsIDIwMDkxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfYWNjX2xsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX2hoX3MwLCAyMDEyOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2hoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX2hoX3MxLCAyMDE2MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2hoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX2hsX3MwLCAyMDE5NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2hsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX2hsX3MxLCAyMDIyN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2hsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX2xoX3MwLCAyMDI2MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2xoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX2xoX3MxLCAyMDI5M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2xoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX2xsX3MwLCAyMDMyNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2xsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX2xsX3MxLCAyMDM1OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2xsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX25hY19oaF9zMCwgMjAzOTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9uYWNfaGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfbmFjX2hoX3MxLCAyMDQyOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX25hY19oaF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1ZF9uYWNfaGxfczAsIDIwNDY2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfbmFjX2hsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX25hY19obF9zMSwgMjA1MDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9uYWNfaGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfbmFjX2xoX3MwLCAyMDU0MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX25hY19saF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1ZF9uYWNfbGhfczEsIDIwNTc3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfbmFjX2xoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX25hY19sbF9zMCwgMjA2MTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9uYWNfbGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfbmFjX2xsX3MxLCAyMDY1MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX25hY19sbF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1aSwgMjA2ODh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1aQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9uYWNjaSwgMjA3MTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9uYWNjaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9uYWNjaWksIDIwNzQyfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbmFjY2lpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3N1YmFjYywgMjA3NzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9zdWJhY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdmFic2RpZmZoLCAyMDc5OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZhYnNkaWZmaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92YWJzZGlmZncsIDIwODI5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdmFic2RpZmZ3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZjbWFjX3MwX3NhdF9pLCAyMDg2MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZjbWFjX3MwX3NhdF9pCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZjbWFjX3MwX3NhdF9yLCAyMDg5Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZjbWFjX3MwX3NhdF9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZjbXB5X3MwX3NhdF9pLCAyMDkzMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZjbXB5X3MwX3NhdF9pCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZjbXB5X3MwX3NhdF9yLCAyMDk2OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZjbXB5X3MwX3NhdF9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZjbXB5X3MxX3NhdF9pLCAyMTAwNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZjbXB5X3MxX3NhdF9pCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZjbXB5X3MxX3NhdF9yLCAyMTA0MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZjbXB5X3MxX3NhdF9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZkbWFjc19zMCwgMjEwNzZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92ZG1hY3NfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdmRtYWNzX3MxLCAyMTEwN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZkbWFjc19zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92ZG1weXJzX3MwLCAyMTEzOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZkbXB5cnNfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdmRtcHlyc19zMSwgMjExNzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92ZG1weXJzX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZkbXB5c19zMCwgMjEyMDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92ZG1weXNfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdmRtcHlzX3MxLCAyMTIzM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZkbXB5c19zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92bWFjMiwgMjEyNjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92bWFjMgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92bWFjMmVzLCAyMTI5MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZtYWMyZXMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdm1hYzJlc19zMCwgMjEzMjB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92bWFjMmVzX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZtYWMyZXNfczEsIDIxMzUyfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdm1hYzJlc19zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92bWFjMnNfczAsIDIxMzg0fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdm1hYzJzX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZtYWMyc19zMSwgMjE0MTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92bWFjMnNfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdm1hYzJzdV9zMCwgMjE0NDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92bWFjMnN1X3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZtYWMyc3VfczEsIDIxNDc4fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdm1hYzJzdV9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92bXB5MmVzX3MwLCAyMTUxMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZtcHkyZXNfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdm1weTJlc19zMSwgMjE1NDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92bXB5MmVzX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZtcHkyc19zMCwgMjE1NzR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92bXB5MnNfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdm1weTJzX3MwcGFjaywgMjE2MDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92bXB5MnNfczBwYWNrCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZtcHkyc19zMSwgMjE2NDB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92bXB5MnNfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdm1weTJzX3MxcGFjaywgMjE2NzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92bXB5MnNfczFwYWNrCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZtcHkyc3VfczAsIDIxNzA2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdm1weTJzdV9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92bXB5MnN1X3MxLCAyMTczOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZtcHkyc3VfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdnJhZGRoLCAyMTc3MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZyYWRkaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92cmFkZHVoLCAyMTc5OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZyYWRkdWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdnJjbWFjaV9zMCwgMjE4Mjd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92cmNtYWNpX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZyY21hY2lfczBjLCAyMTg1OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZyY21hY2lfczBjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZyY21hY3JfczAsIDIxODkyfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdnJjbWFjcl9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92cmNtYWNyX3MwYywgMjE5MjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92cmNtYWNyX3MwYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92cmNtcHlpX3MwLCAyMTk1N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZyY21weWlfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdnJjbXB5aV9zMGMsIDIxOTg5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdnJjbXB5aV9zMGMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdnJjbXB5cl9zMCwgMjIwMjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92cmNtcHlyX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZyY21weXJfczBjLCAyMjA1NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZyY21weXJfczBjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZyY21weXNfYWNjX3MxLCAyMjA4N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZyY21weXNfYWNjX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZyY21weXNfczEsIDIyMTIzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdnJjbXB5c19zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92cmNtcHlzX3MxcnAsIDIyMTU1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdnJjbXB5c19zMXJwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZybWFjX3MwLCAyMjE4OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZybWFjX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZybXB5X3MwLCAyMjIxOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZybXB5X3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3hvcl94YWNjLCAyMjI0OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3hvcl94YWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X2FuZF9hbmQsIDIyMjc5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfYW5kX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF9hbmRfYW5kbiwgMjIzMDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF9hbmRfYW5kbgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF9hbmRfb3IsIDIyMzM4fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfYW5kX29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X2FuZF94b3IsIDIyMzY2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfYW5kX3hvcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF9jbXB5aV93aCwgMjIzOTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF9jbXB5aV93aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF9jbXB5aV93aGMsIDIyNDI1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfY21weWlfd2hjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X2NtcHlyX3doLCAyMjQ1Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X2NtcHlyX3doCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X2NtcHlyX3doYywgMjI0ODZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF9jbXB5cl93aGMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfbWFjX3VwX3MxX3NhdCwgMjI1MTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF9tYWNfdXBfczFfc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X21weXJpX2FkZGksIDIyNTUyfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfbXB5cmlfYWRkaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF9tcHlyaV9hZGRyLCAyMjU4NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X21weXJpX2FkZHIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfbXB5cmlfYWRkcl91MiwgMjI2MTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF9tcHlyaV9hZGRyX3UyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X21weXJyX2FkZGksIDIyNjUxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfbXB5cnJfYWRkaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF9tcHlycl9hZGRyLCAyMjY4M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X21weXJyX2FkZHIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfbmFjX3VwX3MxX3NhdCwgMjI3MTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF9uYWNfdXBfczFfc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X29yX2FuZCwgMjI3NTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF9vcl9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfb3JfYW5kbiwgMjI3Nzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF9vcl9hbmRuCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X29yX29yLCAyMjgwN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X29yX29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X29yX3hvciwgMjI4MzR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF9vcl94b3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfcG1weXcsIDIyODYyfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfcG1weXcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfcG1weXdfYWNjLCAyMjg4OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X3BtcHl3X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF92cG1weWgsIDIyOTIwfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfdnBtcHloCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X3ZwbXB5aF9hY2MsIDIyOTQ4fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfdnBtcHloX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF92cm1weWVoX2FjY19zMCwgMjI5ODB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF92cm1weWVoX2FjY19zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF92cm1weWVoX2FjY19zMSwgMjMwMTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF92cm1weWVoX2FjY19zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF92cm1weWVoX3MwLCAyMzA1Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X3ZybXB5ZWhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfdnJtcHllaF9zMSwgMjMwODR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF92cm1weWVoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X3ZybXB5b2hfYWNjX3MwLCAyMzExNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X3ZybXB5b2hfYWNjX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X3ZybXB5b2hfYWNjX3MxLCAyMzE1Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X3ZybXB5b2hfYWNjX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X3ZybXB5b2hfczAsIDIzMTg4fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfdnJtcHlvaF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF92cm1weW9oX3MxLCAyMzIyMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X3ZybXB5b2hfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfeG9yX2FuZCwgMjMyNTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF94b3JfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X3hvcl9hbmRuLCAyMzI4MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X3hvcl9hbmRuCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X3hvcl9vciwgMjMzMTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF94b3Jfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfeG9yX3hhY2MsIDIzMzM5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfeG9yX3hhY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTVfdmRtYWNic3UsIDIzMzY5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTVfdmRtYWNic3UKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTVfdmRtcHlic3UsIDIzMzk5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTVfdmRtcHlic3UKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTVfdm1hY2JzdSwgMjM0Mjl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNV92bWFjYnN1CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX001X3ZtYWNidXUsIDIzNDU4fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTVfdm1hY2J1dQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNV92bXB5YnN1LCAyMzQ4N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX001X3ZtcHlic3UKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTVfdm1weWJ1dSwgMjM1MTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNV92bXB5YnV1CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX001X3ZybWFjYnN1LCAyMzU0NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX001X3ZybWFjYnN1CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX001X3ZybWFjYnV1LCAyMzU3NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX001X3ZybWFjYnV1CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX001X3ZybXB5YnN1LCAyMzYwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX001X3ZybXB5YnN1CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX001X3ZybXB5YnV1LCAyMzYzNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX001X3ZybXB5YnV1CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX002X3ZhYnNkaWZmYiwgMjM2NjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNl92YWJzZGlmZmIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTZfdmFic2RpZmZ1YiwgMjM2OTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNl92YWJzZGlmZnViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FkZGFzbF9ycnJpLCAyMzcyOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FkZGFzbF9ycnJpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FzbF9pX3AsIDIzNzYxfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX2lfcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfaV9wX2FjYywgMjM3OTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfaV9wX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfaV9wX2FuZCwgMjM4MjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfaV9wX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfaV9wX25hYywgMjM4NTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfaV9wX25hYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfaV9wX29yLCAyMzg4OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9pX3Bfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX2lfcF94YWNjLCAyMzkyMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9pX3BfeGFjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfaV9yLCAyMzk1NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9pX3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX2lfcl9hY2MsIDIzOTg0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX2lfcl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX2lfcl9hbmQsIDI0MDE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX2lfcl9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX2lfcl9uYWMsIDI0MDUwfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX2lfcl9uYWMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX2lfcl9vciwgMjQwODN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfaV9yX29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FzbF9pX3Jfc2F0LCAyNDExNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9pX3Jfc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FzbF9pX3JfeGFjYywgMjQxNDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfaV9yX3hhY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX2lfdmgsIDI0MTgyfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX2lfdmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX2lfdncsIDI0MjEyfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX2lfdncKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX3JfcCwgMjQyNDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfcl9wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FzbF9yX3BfYWNjLCAyNDI3MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9yX3BfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FzbF9yX3BfYW5kLCAyNDMwNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9yX3BfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FzbF9yX3BfbmFjLCAyNDMzN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9yX3BfbmFjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FzbF9yX3Bfb3IsIDI0MzcwfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX3JfcF9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfcl9wX3hvciwgMjQ0MDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfcl9wX3hvcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfcl9yLCAyNDQzNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9yX3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX3Jfcl9hY2MsIDI0NDY0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX3Jfcl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX3Jfcl9hbmQsIDI0NDk3fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX3Jfcl9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX3Jfcl9uYWMsIDI0NTMwfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX3Jfcl9uYWMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX3Jfcl9vciwgMjQ1NjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfcl9yX29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FzbF9yX3Jfc2F0LCAyNDU5NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9yX3Jfc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FzbF9yX3ZoLCAyNDYyOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9yX3ZoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FzbF9yX3Z3LCAyNDY1OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9yX3Z3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9pX3AsIDI0Njg4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3JfaV9wX2FjYywgMjQ3MTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3JfaV9wX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3JfaV9wX2FuZCwgMjQ3NTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3JfaV9wX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3JfaV9wX25hYywgMjQ3ODN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3JfaV9wX25hYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3JfaV9wX29yLCAyNDgxNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9pX3Bfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNyX2lfcF9ybmQsIDI0ODQ4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfcF9ybmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNyX2lfcF9ybmRfZ29vZHN5bnRheCwgMjQ4ODF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3JfaV9wX3JuZF9nb29kc3ludGF4CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9pX3IsIDI0OTI1fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3JfaV9yX2FjYywgMjQ5NTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3JfaV9yX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3JfaV9yX2FuZCwgMjQ5ODd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3JfaV9yX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3JfaV9yX25hYywgMjUwMjB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3JfaV9yX25hYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3JfaV9yX29yLCAyNTA1M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9pX3Jfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNyX2lfcl9ybmQsIDI1MDg1fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfcl9ybmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNyX2lfcl9ybmRfZ29vZHN5bnRheCwgMjUxMTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3JfaV9yX3JuZF9nb29kc3ludGF4CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9pX3N2d190cnVuLCAyNTE2Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9pX3N2d190cnVuCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9pX3ZoLCAyNTE5OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9pX3ZoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9pX3Z3LCAyNTIyOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9pX3Z3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9yX3AsIDI1MjU4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNyX3JfcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3Jfcl9wX2FjYywgMjUyODd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3Jfcl9wX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3Jfcl9wX2FuZCwgMjUzMjB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3Jfcl9wX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3Jfcl9wX25hYywgMjUzNTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3Jfcl9wX25hYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3Jfcl9wX29yLCAyNTM4Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9yX3Bfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNyX3JfcF94b3IsIDI1NDE4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNyX3JfcF94b3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNyX3JfciwgMjU0NTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3Jfcl9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9yX3JfYWNjLCAyNTQ4MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9yX3JfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9yX3JfYW5kLCAyNTUxM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9yX3JfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9yX3JfbmFjLCAyNTU0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9yX3JfbmFjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9yX3Jfb3IsIDI1NTc5fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNyX3Jfcl9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3Jfcl9yX3NhdCwgMjU2MTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3Jfcl9yX3NhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3Jfcl9zdndfdHJ1biwgMjU2NDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3Jfcl9zdndfdHJ1bgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3Jfcl92aCwgMjU2ODB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3Jfcl92aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3Jfcl92dywgMjU3MTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3Jfcl92dworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9icmV2LCAyNTc0MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2JyZXYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYnJldnAsIDI1NzY2fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYnJldnAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfY2FiYWNlbmNiaW4sIDI1NzkzfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfY2FiYWNlbmNiaW4KKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfY2wwLCAyNTgyNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2NsMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9jbDBwLCAyNTg1MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2NsMHAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfY2wxLCAyNTg3N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2NsMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9jbDFwLCAyNTkwMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2NsMXAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfY2xiLCAyNTkyOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2NsYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9jbGJub3JtLCAyNTk1M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2NsYm5vcm0KKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfY2xicCwgMjU5ODJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9jbGJwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2NscmJpdF9pLCAyNjAwOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2NscmJpdF9pCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2NscmJpdF9yLCAyNjAzOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2NscmJpdF9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2N0MCwgMjYwNjh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9jdDAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfY3QwcCwgMjYwOTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9jdDBwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2N0MSwgMjYxMTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9jdDEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfY3QxcCwgMjYxNDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9jdDFwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2RlaW50ZXJsZWF2ZSwgMjYxNzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9kZWludGVybGVhdmUKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfZXh0cmFjdHUsIDI2MjA0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfZXh0cmFjdHUKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfZXh0cmFjdHVfcnAsIDI2MjM0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfZXh0cmFjdHVfcnAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfZXh0cmFjdHVwLCAyNjI2N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2V4dHJhY3R1cAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9leHRyYWN0dXBfcnAsIDI2Mjk4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfZXh0cmFjdHVwX3JwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2luc2VydCwgMjYzMzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9pbnNlcnQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfaW5zZXJ0X3JwLCAyNjM2MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2luc2VydF9ycAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9pbnNlcnRwLCAyNjM5MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2luc2VydHAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfaW5zZXJ0cF9ycCwgMjY0MjB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9pbnNlcnRwX3JwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2ludGVybGVhdmUsIDI2NDUyfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfaW50ZXJsZWF2ZQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sZnNwLCAyNjQ4NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xmc3AKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNsX3JfcCwgMjY1MTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc2xfcl9wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzbF9yX3BfYWNjLCAyNjUzOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzbF9yX3BfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzbF9yX3BfYW5kLCAyNjU3Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzbF9yX3BfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzbF9yX3BfbmFjLCAyNjYwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzbF9yX3BfbmFjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzbF9yX3Bfb3IsIDI2NjM4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNsX3JfcF9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc2xfcl9wX3hvciwgMjY2NzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc2xfcl9wX3hvcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc2xfcl9yLCAyNjcwM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzbF9yX3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNsX3Jfcl9hY2MsIDI2NzMyfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNsX3Jfcl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNsX3Jfcl9hbmQsIDI2NzY1fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNsX3Jfcl9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNsX3Jfcl9uYWMsIDI2Nzk4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNsX3Jfcl9uYWMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNsX3Jfcl9vciwgMjY4MzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc2xfcl9yX29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzbF9yX3ZoLCAyNjg2M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzbF9yX3ZoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzbF9yX3Z3LCAyNjg5M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzbF9yX3Z3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzcl9pX3AsIDI2OTIzfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX2lfcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3JfaV9wX2FjYywgMjY5NTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV9wX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3JfaV9wX2FuZCwgMjY5ODV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV9wX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3JfaV9wX25hYywgMjcwMTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV9wX25hYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3JfaV9wX29yLCAyNzA1MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9pX3Bfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX2lfcF94YWNjLCAyNzA4M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9pX3BfeGFjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3JfaV9yLCAyNzExN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9pX3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX2lfcl9hY2MsIDI3MTQ2fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX2lfcl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX2lfcl9hbmQsIDI3MTc5fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX2lfcl9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX2lfcl9uYWMsIDI3MjEyfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX2lfcl9uYWMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX2lfcl9vciwgMjcyNDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV9yX29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzcl9pX3JfeGFjYywgMjcyNzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV9yX3hhY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX2lfdmgsIDI3MzExfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX2lfdmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX2lfdncsIDI3MzQxfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX2lfdncKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX3JfcCwgMjczNzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3Jfcl9wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzcl9yX3BfYWNjLCAyNzQwMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9yX3BfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzcl9yX3BfYW5kLCAyNzQzM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9yX3BfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzcl9yX3BfbmFjLCAyNzQ2Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9yX3BfbmFjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzcl9yX3Bfb3IsIDI3NDk5fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX3JfcF9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3Jfcl9wX3hvciwgMjc1MzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3Jfcl9wX3hvcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3Jfcl9yLCAyNzU2NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9yX3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX3Jfcl9hY2MsIDI3NTkzfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX3Jfcl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX3Jfcl9hbmQsIDI3NjI2fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX3Jfcl9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX3Jfcl9uYWMsIDI3NjU5fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX3Jfcl9uYWMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX3Jfcl9vciwgMjc2OTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3Jfcl9yX29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzcl9yX3ZoLCAyNzcyNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9yX3ZoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzcl9yX3Z3LCAyNzc1NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9yX3Z3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3BhY2tobCwgMjc3ODR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9wYWNraGwKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfcGFyaXR5cCwgMjc4MTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9wYXJpdHlwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3NldGJpdF9pLCAyNzg0MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3NldGJpdF9pCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3NldGJpdF9yLCAyNzg3MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3NldGJpdF9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3NodWZmZWIsIDI3OTAxfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfc2h1ZmZlYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9zaHVmZmVoLCAyNzkzMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3NodWZmZWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfc2h1ZmZvYiwgMjc5NTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9zaHVmZm9iCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3NodWZmb2gsIDI3OTg4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfc2h1ZmZvaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9zdG9yZXdfbG9ja2VkLCAyODExNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3N0b3Jld19sb2NrZWQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfc3ZzYXRoYiwgMjgxNDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9zdnNhdGhiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3N2c2F0aHViLCAyODE3OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3N2c2F0aHViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3RhYmxlaWR4Yl9nb29kc3ludGF4LCAyODIwOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3RhYmxlaWR4Yl9nb29kc3ludGF4CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3RhYmxlaWR4ZF9nb29kc3ludGF4LCAyODI1MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3RhYmxlaWR4ZF9nb29kc3ludGF4CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3RhYmxlaWR4aF9nb29kc3ludGF4LCAyODI5Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3RhYmxlaWR4aF9nb29kc3ludGF4CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3RhYmxlaWR4d19nb29kc3ludGF4LCAyODMzNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3RhYmxlaWR4d19nb29kc3ludGF4CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3RvZ2dsZWJpdF9pLCAyODM3Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3RvZ2dsZWJpdF9pCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3RvZ2dsZWJpdF9yLCAyODQwOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3RvZ2dsZWJpdF9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3RzdGJpdF9pLCAyODQ0Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3RzdGJpdF9pCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3RzdGJpdF9yLCAyODQ3Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3RzdGJpdF9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3ZhbGlnbmliLCAyODUwMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZhbGlnbmliCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3ZhbGlnbnJiLCAyODUzMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZhbGlnbnJiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3ZjbmVnaCwgMjg1NjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl92Y25lZ2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdmNyb3RhdGUsIDI4NTkwfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdmNyb3RhdGUKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdnJjbmVnaCwgMjg2MjB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl92cmNuZWdoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3ZybmRwYWNrd2gsIDI4NjQ5fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnJuZHBhY2t3aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl92cm5kcGFja3docywgMjg2ODF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl92cm5kcGFja3docworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl92c2F0aGIsIDI4NzE0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnNhdGhiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3ZzYXRoYl9ub3BhY2ssIDI4NzQyfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnNhdGhiX25vcGFjaworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl92c2F0aHViLCAyODc3N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZzYXRodWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdnNhdGh1Yl9ub3BhY2ssIDI4ODA2fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnNhdGh1Yl9ub3BhY2sKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdnNhdHdoLCAyODg0Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZzYXR3aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl92c2F0d2hfbm9wYWNrLCAyODg3MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZzYXR3aF9ub3BhY2sKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdnNhdHd1aCwgMjg5MDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl92c2F0d3VoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3ZzYXR3dWhfbm9wYWNrLCAyODkzNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZzYXR3dWhfbm9wYWNrCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3ZzcGxhdHJiLCAyODk3MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZzcGxhdHJiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3ZzcGxhdHJoLCAyOTAwMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZzcGxhdHJoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3ZzcGxpY2VpYiwgMjkwMzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl92c3BsaWNlaWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdnNwbGljZXJiLCAyOTA2MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZzcGxpY2VyYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl92c3h0YmgsIDI5MDkyfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnN4dGJoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3ZzeHRodywgMjkxMjB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl92c3h0aHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdnRydW5laGIsIDI5MTQ4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnRydW5laGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdnRydW5ld2gsIDI5MTc4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnRydW5ld2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdnRydW5vaGIsIDI5MjA4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnRydW5vaGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdnRydW5vd2gsIDI5MjM4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnRydW5vd2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdnp4dGJoLCAyOTI2OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3Z6eHRiaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl92enh0aHcsIDI5Mjk2fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnp4dGh3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X2FkZGFkZGksIDI5MzI0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfYWRkYWRkaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9hZGRpX2FzbF9yaSwgMjkzNTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF9hZGRpX2FzbF9yaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9hZGRpX2xzcl9yaSwgMjkzODZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF9hZGRpX2xzcl9yaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9hbmRpX2FzbF9yaSwgMjk0MTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF9hbmRpX2FzbF9yaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9hbmRpX2xzcl9yaSwgMjk0NTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF9hbmRpX2xzcl9yaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9jbGJhZGRpLCAyOTQ4NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X2NsYmFkZGkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfY2xicGFkZGksIDI5NTE0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfY2xicGFkZGkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfY2xicG5vcm0sIDI5NTQ0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfY2xicG5vcm0KKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfZXh0cmFjdCwgMjk1NzR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF9leHRyYWN0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X2V4dHJhY3RfcnAsIDI5NjAzfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfZXh0cmFjdF9ycAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9leHRyYWN0cCwgMjk2MzV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF9leHRyYWN0cAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9leHRyYWN0cF9ycCwgMjk2NjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF9leHRyYWN0cF9ycAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9sc2xpLCAyOTY5OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X2xzbGkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfbnRzdGJpdF9pLCAyOTcyNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X250c3RiaXRfaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9udHN0Yml0X3IsIDI5NzU1fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfbnRzdGJpdF9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X29yX2FuZGksIDI5Nzg2fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfb3JfYW5kaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9vcl9hbmRpeCwgMjk4MTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF9vcl9hbmRpeAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9vcl9vcmksIDI5ODQ1fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfb3Jfb3JpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X29yaV9hc2xfcmksIDI5ODczfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfb3JpX2FzbF9yaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9vcmlfbHNyX3JpLCAyOTkwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X29yaV9sc3JfcmkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfcGFyaXR5LCAyOTkzN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X3Bhcml0eQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9zdG9yZWRfbG9ja2VkLCAyOTk2NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X3N0b3JlZF9sb2NrZWQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfc3ViYWRkaSwgMzAwMDB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF9zdWJhZGRpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X3N1YmlfYXNsX3JpLCAzMDAyOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X3N1YmlfYXNsX3JpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X3N1YmlfbHNyX3JpLCAzMDA2Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X3N1YmlfbHNyX3JpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X3ZyY3JvdGF0ZSwgMzAwOTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF92cmNyb3RhdGUKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfdnJjcm90YXRlX2FjYywgMzAxMjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF92cmNyb3RhdGVfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X3Z4YWRkc3ViaCwgMzAxNjF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF92eGFkZHN1YmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfdnhhZGRzdWJociwgMzAxOTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF92eGFkZHN1YmhyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X3Z4YWRkc3VidywgMzAyMjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF92eGFkZHN1YncKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfdnhzdWJhZGRoLCAzMDI1NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X3Z4c3ViYWRkaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF92eHN1YmFkZGhyLCAzMDI4Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X3Z4c3ViYWRkaHIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfdnhzdWJhZGR3LCAzMDMxOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X3Z4c3ViYWRkdworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNV9hc3JodWJfcm5kX3NhdF9nb29kc3ludGF4LCAzMDM0OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M1X2Fzcmh1Yl9ybmRfc2F0X2dvb2RzeW50YXgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzVfYXNyaHViX3NhdCwgMzAzOTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNV9hc3JodWJfc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M1X3BvcGNvdW50cCwgMzA0Mjh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNV9wb3Bjb3VudHAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzVfdmFzcmhybmRfZ29vZHN5bnRheCwgMzA0NTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNV92YXNyaHJuZF9nb29kc3ludGF4CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M2X3JvbF9pX3AsIDMwNTAwfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzZfcm9sX2lfcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNl9yb2xfaV9wX2FjYywgMzA1Mjl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNl9yb2xfaV9wX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNl9yb2xfaV9wX2FuZCwgMzA1NjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNl9yb2xfaV9wX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNl9yb2xfaV9wX25hYywgMzA1OTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNl9yb2xfaV9wX25hYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNl9yb2xfaV9wX29yLCAzMDYyOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M2X3JvbF9pX3Bfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzZfcm9sX2lfcF94YWNjLCAzMDY2MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M2X3JvbF9pX3BfeGFjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNl9yb2xfaV9yLCAzMDY5NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M2X3JvbF9pX3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzZfcm9sX2lfcl9hY2MsIDMwNzIzfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzZfcm9sX2lfcl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzZfcm9sX2lfcl9hbmQsIDMwNzU2fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzZfcm9sX2lfcl9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzZfcm9sX2lfcl9uYWMsIDMwNzg5fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzZfcm9sX2lfcl9uYWMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzZfcm9sX2lfcl9vciwgMzA4MjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNl9yb2xfaV9yX29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M2X3JvbF9pX3JfeGFjYywgMzA4NTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNl9yb2xfaV9yX3hhY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzZfdnNwbGF0cmJwLCAzMDg4OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M2X3ZzcGxhdHJicAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNl92dHJ1bmVoYl9wcHAsIDMwOTE5fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzZfdnRydW5laGJfcHBwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M2X3Z0cnVub2hiX3BwcCwgMzA5NTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNl92dHJ1bm9oYl9wcHAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfZXh0cmFjdHcsIDMwOTg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfZXh0cmFjdHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfZXh0cmFjdHdfMTI4QiwgMzEwMTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9leHRyYWN0d18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X2hpLCAzMTA1Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X2hpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X2hpXzEyOEIsIDMxMDc2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfaGlfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9sbywgMzExMDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9sbworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9sb18xMjhCLCAzMTEyOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X2xvXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfbHZzcGxhdGIsIDMxMTU4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfbHZzcGxhdGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfbHZzcGxhdGJfMTI4QiwgMzExODh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9sdnNwbGF0Yl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X2x2c3BsYXRoLCAzMTIyM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X2x2c3BsYXRoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X2x2c3BsYXRoXzEyOEIsIDMxMjUzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfbHZzcGxhdGhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9sdnNwbGF0dywgMzEyODh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9sdnNwbGF0dworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9sdnNwbGF0d18xMjhCLCAzMTMxOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X2x2c3BsYXR3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfcHJlZF9hbmQsIDMxMzUzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfcHJlZF9hbmRfMTI4QiwgMzEzODN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9wcmVkX2FuZF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ByZWRfYW5kX24sIDMxNDE4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF9hbmRfbgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9wcmVkX2FuZF9uXzEyOEIsIDMxNDUwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF9hbmRfbl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ByZWRfbm90LCAzMTQ4N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ByZWRfbm90CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ByZWRfbm90XzEyOEIsIDMxNTE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF9ub3RfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9wcmVkX29yLCAzMTU1Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ByZWRfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfcHJlZF9vcl8xMjhCLCAzMTU4MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ByZWRfb3JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9wcmVkX29yX24sIDMxNjE1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF9vcl9uCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ByZWRfb3Jfbl8xMjhCLCAzMTY0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ByZWRfb3Jfbl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ByZWRfc2NhbGFyMiwgMzE2ODJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9wcmVkX3NjYWxhcjIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfcHJlZF9zY2FsYXIyXzEyOEIsIDMxNzE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF9zY2FsYXIyXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfcHJlZF9zY2FsYXIydjIsIDMxNzU1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF9zY2FsYXIydjIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfcHJlZF9zY2FsYXIydjJfMTI4QiwgMzE3OTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9wcmVkX3NjYWxhcjJ2Ml8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ByZWRfeG9yLCAzMTgzMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ByZWRfeG9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ByZWRfeG9yXzEyOEIsIDMxODYyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF94b3JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9zaHVmZmVxaCwgMzE4OTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9zaHVmZmVxaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9zaHVmZmVxaF8xMjhCLCAzMTkyN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3NodWZmZXFoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfc2h1ZmZlcXcsIDMxOTYyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfc2h1ZmZlcXcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfc2h1ZmZlcXdfMTI4QiwgMzE5OTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9zaHVmZmVxd18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZTMzJiX25xcHJlZF9haSwgMzIwMjd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92UzMyYl9ucXByZWRfYWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdlMzMmJfbnFwcmVkX2FpXzEyOEIsIDMyMDY0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdlMzMmJfbnFwcmVkX2FpXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdlMzMmJfbnRfbnFwcmVkX2FpLCAzMjEwNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZTMzJiX250X25xcHJlZF9haQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92UzMyYl9udF9ucXByZWRfYWlfMTI4QiwgMzIxNDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92UzMyYl9udF9ucXByZWRfYWlfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92UzMyYl9udF9xcHJlZF9haSwgMzIxOTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92UzMyYl9udF9xcHJlZF9haQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92UzMyYl9udF9xcHJlZF9haV8xMjhCLCAzMjIzMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZTMzJiX250X3FwcmVkX2FpXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdlMzMmJfcXByZWRfYWksIDMyMjc0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdlMzMmJfcXByZWRfYWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdlMzMmJfcXByZWRfYWlfMTI4QiwgMzIzMTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92UzMyYl9xcHJlZF9haV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhYnNiLCAzMjM1MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnNiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhYnNiXzEyOEIsIDMyMzc4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFic2JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWJzYl9zYXQsIDMyNDEwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFic2Jfc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhYnNiX3NhdF8xMjhCLCAzMjQ0MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnNiX3NhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhYnNkaWZmaCwgMzI0Nzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzZGlmZmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFic2RpZmZoXzEyOEIsIDMyNTA4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFic2RpZmZoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFic2RpZmZ1YiwgMzI1NDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzZGlmZnViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhYnNkaWZmdWJfMTI4QiwgMzI1NzZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzZGlmZnViXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFic2RpZmZ1aCwgMzI2MTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzZGlmZnVoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhYnNkaWZmdWhfMTI4QiwgMzI2NDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzZGlmZnVoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFic2RpZmZ3LCAzMjY4Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnNkaWZmdworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWJzZGlmZndfMTI4QiwgMzI3MTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzZGlmZndfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWJzaCwgMzI3NDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWJzaF8xMjhCLCAzMjc3Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnNoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFic2hfc2F0LCAzMjgwOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnNoX3NhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWJzaF9zYXRfMTI4QiwgMzI4Mzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzaF9zYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWJzdywgMzI4NzV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzdworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWJzd18xMjhCLCAzMjkwMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnN3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFic3dfc2F0LCAzMjkzNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnN3X3NhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWJzd19zYXRfMTI4QiwgMzI5NjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzd19zYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkYiwgMzMwMDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkYl8xMjhCLCAzMzAyOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRiXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGJfZHYsIDMzMDYwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGJfZHYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGJfZHZfMTI4QiwgMzMwOTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkYl9kdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRibnEsIDMzMTI1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGJucQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkYm5xXzEyOEIsIDMzMTU0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGJucV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRicSwgMzMxODh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkYnEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGJxXzEyOEIsIDMzMjE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGJxXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGJzYXQsIDMzMjQ5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGJzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGJzYXRfMTI4QiwgMzMyNzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkYnNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRic2F0X2R2LCAzMzMxNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRic2F0X2R2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRic2F0X2R2XzEyOEIsIDMzMzQ3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGJzYXRfZHZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkY2xiaCwgMzM0NTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkY2xiaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkY2xiaF8xMjhCLCAzMzQ4Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRjbGJoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGNsYncsIDMzNTE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGNsYncKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGNsYndfMTI4QiwgMzM1NDd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkY2xid18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRoLCAzMzU4Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRoXzEyOEIsIDMzNjA5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkaF9kdiwgMzM2NDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaF9kdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkaF9kdl8xMjhCLCAzMzY3MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRoX2R2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGhucSwgMzM3MDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaG5xCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRobnFfMTI4QiwgMzM3MzV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaG5xXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGhxLCAzMzc2OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRocQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkaHFfMTI4QiwgMzM3OTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaHFfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkaHNhdCwgMzM4MzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaHNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkaHNhdF8xMjhCLCAzMzg2MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRoc2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGhzYXRfZHYsIDMzODk1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGhzYXRfZHYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGhzYXRfZHZfMTI4QiwgMzM5Mjh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaHNhdF9kdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRodywgMzM5NjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGh3XzEyOEIsIDMzOTk0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGh3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGh3X2FjYywgMzQwMjd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaHdfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRod19hY2NfMTI4QiwgMzQwNTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaHdfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHViaCwgMzQwOTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWJoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGR1YmhfMTI4QiwgMzQxMjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWJoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHViaF9hY2MsIDM0MTU5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHViaF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHViaF9hY2NfMTI4QiwgMzQxOTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWJoX2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGR1YnNhdCwgMzQyMzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWJzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHVic2F0XzEyOEIsIDM0MjYxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHVic2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHVic2F0X2R2LCAzNDI5N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1YnNhdF9kdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkdWJzYXRfZHZfMTI4QiwgMzQzMzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWJzYXRfZHZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkdWJ1YmJfc2F0LCAzNDM3MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1YnViYl9zYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHVidWJiX3NhdF8xMjhCLCAzNDQwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1YnViYl9zYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkdWhzYXQsIDM0NDQ1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHVoc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGR1aHNhdF8xMjhCLCAzNDQ3Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1aHNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGR1aHNhdF9kdiwgMzQ1MTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWhzYXRfZHYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHVoc2F0X2R2XzEyOEIsIDM0NTQ2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHVoc2F0X2R2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHVodywgMzQ1ODV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWh3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGR1aHdfMTI4QiwgMzQ2MTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWh3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHVod19hY2MsIDM0NjQ4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHVod19hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHVod19hY2NfMTI4QiwgMzQ2ODF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWh3X2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGR1d3NhdCwgMzQ3MTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdXdzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHV3c2F0XzEyOEIsIDM0NzUwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHV3c2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHV3c2F0X2R2LCAzNDc4Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1d3NhdF9kdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkdXdzYXRfZHZfMTI4QiwgMzQ4MjB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdXdzYXRfZHZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkdywgMzQ4NTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkd18xMjhCLCAzNDg4Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHdfZHYsIDM0OTE4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHdfZHYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHdfZHZfMTI4QiwgMzQ5NDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkd19kdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGR3bnEsIDM0OTgzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHducQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkd25xXzEyOEIsIDM1MDEyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHducV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGR3cSwgMzUwNDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkd3EKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHdxXzEyOEIsIDM1MDc0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHdxXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHdzYXQsIDM1MTA3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHdzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHdzYXRfMTI4QiwgMzUxMzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkd3NhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGR3c2F0X2R2LCAzNTE3Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR3c2F0X2R2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGR3c2F0X2R2XzEyOEIsIDM1MjA1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHdzYXRfZHZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWxpZ25iLCAzNTI0M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbGlnbmIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFsaWduYl8xMjhCLCAzNTI3Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbGlnbmJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWxpZ25iaSwgMzUzMDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWxpZ25iaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWxpZ25iaV8xMjhCLCAzNTMzNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbGlnbmJpXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFuZCwgMzUzNzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhbmRfMTI4QiwgMzUzOTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFuZG5xcnQsIDM1NDI4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFuZG5xcnQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFuZG5xcnRfMTI4QiwgMzU0NTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kbnFydF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhbmRucXJ0X2FjYywgMzU0OTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kbnFydF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFuZG5xcnRfYWNjXzEyOEIsIDM1NTI3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFuZG5xcnRfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFuZHFydCwgMzU1NjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kcXJ0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhbmRxcnRfMTI4QiwgMzU1OTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kcXJ0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFuZHFydF9hY2MsIDM1NjI5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFuZHFydF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFuZHFydF9hY2NfMTI4QiwgMzU2NjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kcXJ0X2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhbmR2bnF2LCAzNTcwMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmR2bnF2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhbmR2bnF2XzEyOEIsIDM1NzMwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFuZHZucXZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YW5kdnF2LCAzNTc2NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmR2cXYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFuZHZxdl8xMjhCLCAzNTc5NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmR2cXZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YW5kdnJ0LCAzNTgyOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmR2cnQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFuZHZydF8xMjhCLCAzNTg1N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmR2cnRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YW5kdnJ0X2FjYywgMzU4OTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kdnJ0X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YW5kdnJ0X2FjY18xMjhCLCAzNTkyNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmR2cnRfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzbGgsIDM1OTYyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzbGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzbGhfMTI4QiwgMzU5ODl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNsaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc2xoX2FjYywgMzYwMjF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNsaF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzbGhfYWNjXzEyOEIsIDM2MDUyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzbGhfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzbGh2LCAzNjA4OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc2xodgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNsaHZfMTI4QiwgMzYxMTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNsaHZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNsdywgMzYxNDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNsdworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNsd18xMjhCLCAzNjE3Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc2x3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzbHdfYWNjLCAzNjIwOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc2x3X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNsd19hY2NfMTI4QiwgMzYyMzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNsd19hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNsd3YsIDM2Mjc1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzbHd2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc2x3dl8xMjhCLCAzNjMwM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc2x3dl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3JoLCAzNjMzNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3JoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3JoXzEyOEIsIDM2MzYzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcmhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyaF9hY2MsIDM2Mzk1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcmhfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3JoX2FjY18xMjhCLCAzNjQyNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3JoX2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3JoYnJuZHNhdCwgMzY0NjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyaGJybmRzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcmhicm5kc2F0XzEyOEIsIDM2NDk2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcmhicm5kc2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcmhic2F0LCAzNjUzNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3JoYnNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyaGJzYXRfMTI4QiwgMzY1NjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyaGJzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyaHVicm5kc2F0LCAzNjYwMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3JodWJybmRzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcmh1YnJuZHNhdF8xMjhCLCAzNjYzN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3JodWJybmRzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyaHVic2F0LCAzNjY3N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3JodWJzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcmh1YnNhdF8xMjhCLCAzNjcwOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3JodWJzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyaHYsIDM2NzQ2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcmh2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3Jodl8xMjhCLCAzNjc3NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3Jodl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3J1aHVicm5kc2F0LCAzNjgwN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J1aHVicm5kc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3J1aHVicm5kc2F0XzEyOEIsIDM2ODQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcnVodWJybmRzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNydWh1YnNhdCwgMzY4ODR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNydWh1YnNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNydWh1YnNhdF8xMjhCLCAzNjkxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J1aHVic2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcnV3dWhybmRzYXQsIDM2OTU1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcnV3dWhybmRzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcnV3dWhybmRzYXRfMTI4QiwgMzY5OTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNydXd1aHJuZHNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3J1d3Voc2F0LCAzNzAzMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J1d3Voc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3J1d3Voc2F0XzEyOEIsIDM3MDY1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcnV3dWhzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNydywgMzcxMDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNydworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyd18xMjhCLCAzNzEzMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcndfYWNjLCAzNzE2Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J3X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyd19hY2NfMTI4QiwgMzcxOTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyd19hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyd2gsIDM3MjI5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcndoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3J3aF8xMjhCLCAzNzI1N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J3aF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3J3aHJuZHNhdCwgMzcyOTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyd2hybmRzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcndocm5kc2F0XzEyOEIsIDM3MzI0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcndocm5kc2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcndoc2F0LCAzNzM2M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J3aHNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyd2hzYXRfMTI4QiwgMzczOTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyd2hzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyd3Vocm5kc2F0LCAzNzQzMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J3dWhybmRzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcnd1aHJuZHNhdF8xMjhCLCAzNzQ2NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J3dWhybmRzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyd3Voc2F0LCAzNzUwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J3dWhzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcnd1aHNhdF8xMjhCLCAzNzUzN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J3dWhzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyd3YsIDM3NTc0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcnd2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3J3dl8xMjhCLCAzNzYwMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J3dl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3NpZ24sIDM3NjM1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzc2lnbgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNzaWduXzEyOEIsIDM3NjY0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzc2lnbl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3NpZ25wLCAzNzY5OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3NpZ25wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3NpZ25wXzEyOEIsIDM3NzI4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzc2lnbnBfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXZnYiwgMzc3NjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZnYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXZnYl8xMjhCLCAzNzc5MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhdmdiXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmF2Z2JybmQsIDM3ODIyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z2JybmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmF2Z2JybmRfMTI4QiwgMzc4NTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZnYnJuZF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhdmdoLCAzNzg4N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhdmdoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhdmdoXzEyOEIsIDM3OTE0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z2hfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXZnaHJuZCwgMzc5NDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZnaHJuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXZnaHJuZF8xMjhCLCAzNzk3Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhdmdocm5kXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmF2Z3ViLCAzODAxMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhdmd1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXZndWJfMTI4QiwgMzgwMzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZndWJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXZndWJybmQsIDM4MDcyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z3Vicm5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhdmd1YnJuZF8xMjhCLCAzODEwM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhdmd1YnJuZF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhdmd1aCwgMzgxMzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZndWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmF2Z3VoXzEyOEIsIDM4MTY3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z3VoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmF2Z3Vocm5kLCAzODIwMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhdmd1aHJuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXZndWhybmRfMTI4QiwgMzgyMzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZndWhybmRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXZndXcsIDM4MjY3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z3V3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhdmd1d18xMjhCLCAzODI5NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhdmd1d18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhdmd1d3JuZCwgMzgzMjh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZndXdybmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmF2Z3V3cm5kXzEyOEIsIDM4MzU5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z3V3cm5kXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmF2Z3csIDM4Mzk1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z3cKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmF2Z3dfMTI4QiwgMzg0MjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZnd18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhdmd3cm5kLCAzODQ1NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhdmd3cm5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhdmd3cm5kXzEyOEIsIDM4NDg0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z3dybmRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Y2wwaCwgMzg1MTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Y2wwaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Y2wwaF8xMjhCLCAzODU0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZjbDBoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmNsMHcsIDM4NTc4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmNsMHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmNsMHdfMTI4QiwgMzg2MDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Y2wwd18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zjb21iaW5lLCAzODYzN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zjb21iaW5lCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zjb21iaW5lXzEyOEIsIDM4NjY3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmNvbWJpbmVfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZDAsIDM4NzAyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmQwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkMF8xMjhCLCAzODcyN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkMF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkZDAsIDM4NzU3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRkMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZGQwXzEyOEIsIDM4NzgzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRkMF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkZWFsYiwgMzg4MTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZGVhbGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRlYWxiNHcsIDM4ODc1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRlYWxiNHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRlYWxiNHdfMTI4QiwgMzg5MDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZGVhbGI0d18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkZWFsYl8xMjhCLCAzODg0Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkZWFsYl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkZWFsaCwgMzg5NDB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZGVhbGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRlYWxoXzEyOEIsIDM4OTY4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRlYWxoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRlYWx2ZGQsIDM5MDAxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRlYWx2ZGQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRlYWx2ZGRfMTI4QiwgMzkwMzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZGVhbHZkZF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkZWx0YSwgMzkwNjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZGVsdGEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRlbHRhXzEyOEIsIDM5MDk0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRlbHRhXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHlidXMsIDM5MTI3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHlidXMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHlidXNfMTI4QiwgMzkxNTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWJ1c18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5YnVzX2FjYywgMzkxOTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWJ1c19hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHlidXNfYWNjXzEyOEIsIDM5MjI2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHlidXNfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHlidXNfZHYsIDM5MjY1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHlidXNfZHYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHlidXNfZHZfMTI4QiwgMzkyOTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWJ1c19kdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5YnVzX2R2X2FjYywgMzkzMzZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWJ1c19kdl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHlidXNfZHZfYWNjXzEyOEIsIDM5MzczfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHlidXNfZHZfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHloYiwgMzk0MTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aGJfMTI4QiwgMzk0NDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhiXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHloYl9hY2MsIDM5NDc4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloYl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHloYl9hY2NfMTI4QiwgMzk1MTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhiX2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aGJfZHYsIDM5NTQ5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloYl9kdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWhiX2R2XzEyOEIsIDM5NTgxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloYl9kdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aGJfZHZfYWNjLCAzOTYxOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aGJfZHZfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aGJfZHZfYWNjXzEyOEIsIDM5NjU0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloYl9kdl9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWhpc2F0LCAzOTY5NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aGlzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHloaXNhdF8xMjhCLCAzOTcyN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aGlzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWhpc2F0X2FjYywgMzk3NjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhpc2F0X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWhpc2F0X2FjY18xMjhCLCAzOTgwMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aGlzYXRfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHloc2F0LCAzOTg0MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aHNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWhzYXRfMTI4QiwgMzk4NzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWhzYXRfYWNjLCAzOTkwOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aHNhdF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHloc2F0X2FjY18xMjhCLCAzOTk0M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aHNhdF9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWhzdWlzYXQsIDM5OTgzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloc3Vpc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aHN1aXNhdF8xMjhCLCA0MDAxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aHN1aXNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aHN1aXNhdF9hY2MsIDQwMDU2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloc3Vpc2F0X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWhzdWlzYXRfYWNjXzEyOEIsIDQwMDk0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloc3Vpc2F0X2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aHN1c2F0LCA0MDEzN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aHN1c2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aHN1c2F0XzEyOEIsIDQwMTcwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloc3VzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWhzdXNhdF9hY2MsIDQwMjA4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloc3VzYXRfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aHN1c2F0X2FjY18xMjhCLCA0MDI0NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aHN1c2F0X2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aHZzYXQsIDQwMjg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHlodnNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWh2c2F0XzEyOEIsIDQwMzE5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHlodnNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aHZzYXRfYWNjLCA0MDM1Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aHZzYXRfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aHZzYXRfYWNjXzEyOEIsIDQwMzkyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHlodnNhdF9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZHNhZHVoLCA0MDQzM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zkc2FkdWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRzYWR1aF8xMjhCLCA0MDQ2Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zkc2FkdWhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZHNhZHVoX2FjYywgNDA0OTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZHNhZHVoX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZHNhZHVoX2FjY18xMjhCLCA0MDUyOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zkc2FkdWhfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmVxYiwgNDA1Njd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXFiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZlcWJfMTI4QiwgNDA1OTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXFiXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmVxYl9hbmQsIDQwNjI0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmVxYl9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmVxYl9hbmRfMTI4QiwgNDA2NTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXFiX2FuZF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZlcWJfb3IsIDQwNjg5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmVxYl9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZXFiX29yXzEyOEIsIDQwNzE4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmVxYl9vcl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZlcWJfeG9yLCA0MDc1Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWJfeG9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZlcWJfeG9yXzEyOEIsIDQwNzgyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmVxYl94b3JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZXFoLCA0MDgxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmVxaF8xMjhCLCA0MDg0M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZXFoX2FuZCwgNDA4NzR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXFoX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZXFoX2FuZF8xMjhCLCA0MDkwNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWhfYW5kXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmVxaF9vciwgNDA5Mzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXFoX29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZlcWhfb3JfMTI4QiwgNDA5Njh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXFoX29yXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmVxaF94b3IsIDQxMDAyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmVxaF94b3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmVxaF94b3JfMTI4QiwgNDEwMzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXFoX3hvcl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZlcXcsIDQxMDY3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmVxdworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZXF3XzEyOEIsIDQxMDkzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmVxd18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZlcXdfYW5kLCA0MTEyNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcXdfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZlcXdfYW5kXzEyOEIsIDQxMTU0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmVxd19hbmRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZXF3X29yLCA0MTE4OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcXdfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmVxd19vcl8xMjhCLCA0MTIxOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcXdfb3JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZXF3X3hvciwgNDEyNTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXF3X3hvcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZXF3X3hvcl8xMjhCLCA0MTI4Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcXdfeG9yXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmdhdGhlcm1oLCA0MTMxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZnYXRoZXJtaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z2F0aGVybWhfMTI4QiwgNDEzNDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z2F0aGVybWhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z2F0aGVybWhxLCA0MTM4NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZnYXRoZXJtaHEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmdhdGhlcm1ocV8xMjhCLCA0MTQxNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZnYXRoZXJtaHFfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z2F0aGVybWh3LCA0MTQ1M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZnYXRoZXJtaHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmdhdGhlcm1od18xMjhCLCA0MTQ4NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZnYXRoZXJtaHdfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z2F0aGVybWh3cSwgNDE1MjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z2F0aGVybWh3cQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z2F0aGVybWh3cV8xMjhCLCA0MTU1NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZnYXRoZXJtaHdxXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmdhdGhlcm13LCA0MTU5M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZnYXRoZXJtdworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z2F0aGVybXdfMTI4QiwgNDE2MjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z2F0aGVybXdfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z2F0aGVybXdxLCA0MTY2MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZnYXRoZXJtd3EKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmdhdGhlcm13cV8xMjhCLCA0MTY5Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZnYXRoZXJtd3FfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3RiLCA0MTcyOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0Yl8xMjhCLCA0MTc1NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndGJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3RiX2FuZCwgNDE3ODZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3RiX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3RiX2FuZF8xMjhCLCA0MTgxNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndGJfYW5kXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0Yl9vciwgNDE4NTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3RiX29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndGJfb3JfMTI4QiwgNDE4ODB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3RiX29yXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0Yl94b3IsIDQxOTE0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0Yl94b3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0Yl94b3JfMTI4QiwgNDE5NDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3RiX3hvcl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndGgsIDQxOTc5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3RoXzEyOEIsIDQyMDA1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0aF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndGhfYW5kLCA0MjAzNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndGhfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndGhfYW5kXzEyOEIsIDQyMDY2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0aF9hbmRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3RoX29yLCA0MjEwMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndGhfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0aF9vcl8xMjhCLCA0MjEzMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndGhfb3JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3RoX3hvciwgNDIxNjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3RoX3hvcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3RoX3hvcl8xMjhCLCA0MjE5NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndGhfeG9yXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dWIsIDQyMjI5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0dWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dWJfMTI4QiwgNDIyNTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1Yl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndHViX2FuZCwgNDIyODh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1Yl9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dWJfYW5kXzEyOEIsIDQyMzE5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0dWJfYW5kXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dWJfb3IsIDQyMzU1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0dWJfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dWJfb3JfMTI4QiwgNDIzODV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1Yl9vcl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndHViX3hvciwgNDI0MjB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1Yl94b3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dWJfeG9yXzEyOEIsIDQyNDUxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0dWJfeG9yXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dWgsIDQyNDg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0dWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dWhfMTI4QiwgNDI1MTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1aF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndHVoX2FuZCwgNDI1NDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1aF9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dWhfYW5kXzEyOEIsIDQyNTc3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0dWhfYW5kXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dWhfb3IsIDQyNjEzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0dWhfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dWhfb3JfMTI4QiwgNDI2NDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1aF9vcl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndHVoX3hvciwgNDI2Nzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1aF94b3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dWhfeG9yXzEyOEIsIDQyNzA5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0dWhfeG9yXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dXcsIDQyNzQ1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0dXcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dXdfMTI4QiwgNDI3NzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1d18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndHV3X2FuZCwgNDI4MDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1d19hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dXdfYW5kXzEyOEIsIDQyODM1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0dXdfYW5kXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dXdfb3IsIDQyODcxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0dXdfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dXdfb3JfMTI4QiwgNDI5MDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1d19vcl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndHV3X3hvciwgNDI5MzZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1d194b3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dXdfeG9yXzEyOEIsIDQyOTY3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0dXdfeG9yXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dywgNDMwMDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndHdfMTI4QiwgNDMwMjl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0d19hbmQsIDQzMDYwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0d19hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0d19hbmRfMTI4QiwgNDMwOTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R3X2FuZF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndHdfb3IsIDQzMTI1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0d19vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R3X29yXzEyOEIsIDQzMTU0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0d19vcl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndHdfeG9yLCA0MzE4OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHdfeG9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndHdfeG9yXzEyOEIsIDQzMjE4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0d194b3JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92aW5zZXJ0d3IsIDQzMjUzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmluc2VydHdyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZpbnNlcnR3cl8xMjhCLCA0MzI4NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZpbnNlcnR3cl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZsYWxpZ25iLCA0MzMyMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsYWxpZ25iCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZsYWxpZ25iXzEyOEIsIDQzMzUwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmxhbGlnbmJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bGFsaWduYmksIDQzMzg1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmxhbGlnbmJpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZsYWxpZ25iaV8xMjhCLCA0MzQxNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsYWxpZ25iaV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zsc3JiLCA0MzQ1Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zsc3JiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zsc3JiXzEyOEIsIDQzNDc5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmxzcmJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHNyaCwgNDM1MTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHNyaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHNyaF8xMjhCLCA0MzUzOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zsc3JoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmxzcmh2LCA0MzU3MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zsc3JodgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHNyaHZfMTI4QiwgNDM1OTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHNyaHZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHNydywgNDM2MzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHNydworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHNyd18xMjhCLCA0MzY1OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zsc3J3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmxzcnd2LCA0MzY5MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zsc3J3dgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHNyd3ZfMTI4QiwgNDM3MTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHNyd3ZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHV0NCwgNDM3NTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0NAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHV0NF8xMjhCLCA0Mzc3OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXQ0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmx1dHZ2YiwgNDM4MTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dnZiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZsdXR2dmJfMTI4QiwgNDM4Mzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dnZiXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmx1dHZ2Yl9ubSwgNDM4NzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dnZiX25tCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZsdXR2dmJfbm1fMTI4QiwgNDM5MDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dnZiX25tXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmx1dHZ2Yl9vcmFjYywgNDM5NDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dnZiX29yYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZsdXR2dmJfb3JhY2NfMTI4QiwgNDM5Nzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dnZiX29yYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmx1dHZ2Yl9vcmFjY2ksIDQ0MDE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmx1dHZ2Yl9vcmFjY2kKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmx1dHZ2Yl9vcmFjY2lfMTI4QiwgNDQwNTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dnZiX29yYWNjaV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZsdXR2dmJpLCA0NDA5NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2dmJpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZsdXR2dmJpXzEyOEIsIDQ0MTI0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmx1dHZ2YmlfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHV0dndoLCA0NDE1OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2d2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmx1dHZ3aF8xMjhCLCA0NDE4OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2d2hfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHV0dndoX25tLCA0NDIyMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2d2hfbm0KKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmx1dHZ3aF9ubV8xMjhCLCA0NDI1NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2d2hfbm1fMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHV0dndoX29yYWNjLCA0NDI5MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2d2hfb3JhY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmx1dHZ3aF9vcmFjY18xMjhCLCA0NDMyNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2d2hfb3JhY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHV0dndoX29yYWNjaSwgNDQzNjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dndoX29yYWNjaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHV0dndoX29yYWNjaV8xMjhCLCA0NDQwMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2d2hfb3JhY2NpXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmx1dHZ3aGksIDQ0NDQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmx1dHZ3aGkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmx1dHZ3aGlfMTI4QiwgNDQ0NzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dndoaV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZW5xLCA0NDUwOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtYXNrZWRzdG9yZW5xCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZW5xXzEyOEIsIDQ0NTQ0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1hc2tlZHN0b3JlbnFfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWFza2Vkc3RvcmVudG5xLCA0NDU4NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtYXNrZWRzdG9yZW50bnEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1hc2tlZHN0b3JlbnRucV8xMjhCLCA0NDYyM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtYXNrZWRzdG9yZW50bnFfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWFza2Vkc3RvcmVudHEsIDQ0NjY2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1hc2tlZHN0b3JlbnRxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZW50cV8xMjhCLCA0NDcwM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtYXNrZWRzdG9yZW50cV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZXEsIDQ0NzQ1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1hc2tlZHN0b3JlcQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWFza2Vkc3RvcmVxXzEyOEIsIDQ0NzgwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1hc2tlZHN0b3JlcV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtYXhiLCA0NDgyMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtYXhiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtYXhiXzEyOEIsIDQ0ODQ3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1heGJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWF4aCwgNDQ4Nzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWF4aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWF4aF8xMjhCLCA0NDkwNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtYXhoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1heHViLCA0NDkzOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtYXh1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWF4dWJfMTI4QiwgNDQ5NjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWF4dWJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWF4dWgsIDQ0OTk5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1heHVoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtYXh1aF8xMjhCLCA0NTAyN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtYXh1aF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtYXh3LCA0NTA2MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtYXh3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtYXh3XzEyOEIsIDQ1MDg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1heHdfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWluYiwgNDUxMTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWluYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWluYl8xMjhCLCA0NTE0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtaW5iXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1pbmgsIDQ1MTc4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1pbmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1pbmhfMTI4QiwgNDUyMDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWluaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtaW51YiwgNDUyMzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWludWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1pbnViXzEyOEIsIDQ1MjY1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1pbnViXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1pbnVoLCA0NTI5OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtaW51aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWludWhfMTI4QiwgNDUzMjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWludWhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWludywgNDUzNTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWludworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWlud18xMjhCLCA0NTM4Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtaW53XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wYWJ1cywgNDU0MTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhYnVzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcGFidXNfMTI4QiwgNDU0NDd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhYnVzXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wYWJ1c19hY2MsIDQ1NDgxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1wYWJ1c19hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wYWJ1c19hY2NfMTI4QiwgNDU1MTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhYnVzX2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcGFidXN2LCA0NTU1Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFidXN2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcGFidXN2XzEyOEIsIDQ1NTgyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1wYWJ1c3ZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhYnV1LCA0NTYxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFidXUKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wYWJ1dV8xMjhCLCA0NTY0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFidXVfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhYnV1X2FjYywgNDU2ODB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhYnV1X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhYnV1X2FjY18xMjhCLCA0NTcxM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFidXVfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wYWJ1dXYsIDQ1NzUxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1wYWJ1dXYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wYWJ1dXZfMTI4QiwgNDU3ODF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhYnV1dl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcGFoYiwgNDU4MTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhaGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wYWhiXzEyOEIsIDQ1ODQ0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1wYWhiXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wYWhiX2FjYywgNDU4Nzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhaGJfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcGFoYl9hY2NfMTI4QiwgNDU5MDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhaGJfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wYWhoc2F0LCA0NTk0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFoaHNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhaGhzYXRfMTI4QiwgNDU5Nzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhaGhzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhdWhiLCA0NjAxM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGF1aGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wYXVoYl8xMjhCLCA0NjA0Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGF1aGJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhdWhiX2FjYywgNDYwNzZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhdWhiX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhdWhiX2FjY18xMjhCLCA0NjEwOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGF1aGJfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wYXVodWhzYXQsIDQ2MTQ3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1wYXVodWhzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wYXVodWhzYXRfMTI4QiwgNDYxODB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhdWh1aHNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHN1aHVoc2F0LCA0NjIxOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHN1aHVoc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHN1aHVoc2F0XzEyOEIsIDQ2MjUxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1wc3VodWhzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5YnVzLCA0NjI4OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlidXMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWJ1c18xMjhCLCA0NjMxOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlidXNfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5YnVzX2FjYywgNDYzNTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5YnVzX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5YnVzX2FjY18xMjhCLCA0NjM4NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlidXNfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWJ1c3YsIDQ2NDIzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWJ1c3YKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWJ1c3ZfMTI4QiwgNDY0NTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5YnVzdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlidXN2X2FjYywgNDY0ODh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5YnVzdl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWJ1c3ZfYWNjXzEyOEIsIDQ2NTIyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWJ1c3ZfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWJ2LCA0NjU2MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlidgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5YnZfMTI4QiwgNDY1ODl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5YnZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5YnZfYWNjLCA0NjYyMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlidl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWJ2X2FjY18xMjhCLCA0NjY1NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlidl9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5ZXd1aCwgNDY2OTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5ZXd1aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5ZXd1aF8xMjhCLCA0NjcyMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlld3VoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWV3dWhfNjQsIDQ2NzU2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWV3dWhfNjQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWV3dWhfNjRfMTI4QiwgNDY3ODl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5ZXd1aF82NF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHloLCA0NjgyN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHloCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHloXzEyOEIsIDQ2ODU0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aF9hY2MsIDQ2ODg2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWhfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHloX2FjY18xMjhCLCA0NjkxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHloX2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHloc2F0X2FjYywgNDY5NTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aHNhdF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWhzYXRfYWNjXzEyOEIsIDQ2OTg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWhzYXRfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWhzcnMsIDQ3MDI2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWhzcnMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWhzcnNfMTI4QiwgNDcwNTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aHNyc18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHloc3MsIDQ3MDkxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWhzcworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aHNzXzEyOEIsIDQ3MTIwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWhzc18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlodXMsIDQ3MTU0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWh1cworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aHVzXzEyOEIsIDQ3MTgzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWh1c18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlodXNfYWNjLCA0NzIxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlodXNfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlodXNfYWNjXzEyOEIsIDQ3MjUwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWh1c19hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aHYsIDQ3Mjg4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWh2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlodl8xMjhCLCA0NzMxNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlodl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlodl9hY2MsIDQ3MzQ5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWh2X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aHZfYWNjXzEyOEIsIDQ3MzgxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWh2X2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlodnNycywgNDc0MTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aHZzcnMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWh2c3JzXzEyOEIsIDQ3NDQ5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWh2c3JzXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWllb2gsIDQ3NDg1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWllb2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWllb2hfMTI4QiwgNDc1MTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aWVvaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpZXdoX2FjYywgNDc1NTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aWV3aF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWlld2hfYWNjXzEyOEIsIDQ3NTg0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWlld2hfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWlld3VoLCA0NzYyM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpZXd1aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aWV3dWhfMTI4QiwgNDc2NTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aWV3dWhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aWV3dWhfYWNjLCA0NzY5MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpZXd1aF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWlld3VoX2FjY18xMjhCLCA0NzcyNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpZXd1aF9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aWgsIDQ3NzY1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWloCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpaF8xMjhCLCA0Nzc5M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpaF9hY2MsIDQ3ODI2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWloX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aWhfYWNjXzEyOEIsIDQ3ODU4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWloX2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpaGIsIDQ3ODk1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWloYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aWhiXzEyOEIsIDQ3OTI0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWloYl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpaGJfYWNjLCA0Nzk1OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpaGJfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpaGJfYWNjXzEyOEIsIDQ3OTkxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWloYl9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aW93aCwgNDgwMjl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aW93aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aW93aF8xMjhCLCA0ODA1OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpb3doXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWl3YiwgNDgwOTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aXdiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpd2JfMTI4QiwgNDgxMjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aXdiXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWl3Yl9hY2MsIDQ4MTU3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWl3Yl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWl3Yl9hY2NfMTI4QiwgNDgxOTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aXdiX2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpd2gsIDQ4MjI4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWl3aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aXdoXzEyOEIsIDQ4MjU3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWl3aF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpd2hfYWNjLCA0ODI5MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpd2hfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpd2hfYWNjXzEyOEIsIDQ4MzI0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWl3aF9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aXd1YiwgNDgzNjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aXd1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aXd1Yl8xMjhCLCA0ODM5Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpd3ViXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWl3dWJfYWNjLCA0ODQyN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpd3ViX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aXd1Yl9hY2NfMTI4QiwgNDg0NjF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aXd1Yl9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5b3doLCA0ODUwMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlvd2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weW93aF8xMjhCLCA0ODUyOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlvd2hfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5b3doXzY0X2FjYywgNDg1NjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5b3doXzY0X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5b3doXzY0X2FjY18xMjhCLCA0ODU5OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlvd2hfNjRfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weW93aF9ybmQsIDQ4NjQwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weW93aF9ybmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weW93aF9ybmRfMTI4QiwgNDg2NzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5b3doX3JuZF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlvd2hfcm5kX3NhY2MsIDQ4NzExfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weW93aF9ybmRfc2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5b3doX3JuZF9zYWNjXzEyOEIsIDQ4NzQ5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weW93aF9ybmRfc2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlvd2hfc2FjYywgNDg3OTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5b3doX3NhY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weW93aF9zYWNjXzEyOEIsIDQ4ODI2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weW93aF9zYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weXViLCA0ODg2NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWJfMTI4QiwgNDg4OTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5dWJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWJfYWNjLCA0ODkyNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1Yl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weXViX2FjY18xMjhCLCA0ODk1OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1Yl9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWJ2LCA0ODk5NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1YnYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weXVidl8xMjhCLCA0OTAyNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1YnZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWJ2X2FjYywgNDkwNTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5dWJ2X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWJ2X2FjY18xMjhCLCA0OTA5MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1YnZfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weXVoLCA0OTEyOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWhfMTI4QiwgNDkxNTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5dWhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWhfYWNjLCA0OTE5MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1aF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weXVoX2FjY18xMjhCLCA0OTIyMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1aF9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWhlLCA0OTI1OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1aGUKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weXVoZV8xMjhCLCA0OTI4OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1aGVfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWhlX2FjYywgNDkzMjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5dWhlX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWhlX2FjY18xMjhCLCA0OTM1NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1aGVfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weXVodiwgNDkzOTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5dWh2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHl1aHZfMTI4QiwgNDk0MjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5dWh2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weXVodl9hY2MsIDQ5NDU2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weXVodl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weXVodl9hY2NfMTI4QiwgNDk0ODl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5dWh2X2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtdXgsIDQ5NTI3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm11eAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXV4XzEyOEIsIDQ5NTUzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm11eF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZuYXZnYiwgNDk1ODR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bmF2Z2IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm5hdmdiXzEyOEIsIDQ5NjEyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm5hdmdiXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm5hdmdoLCA0OTY0NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZuYXZnaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bmF2Z2hfMTI4QiwgNDk2NzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bmF2Z2hfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bmF2Z3ViLCA0OTcwNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZuYXZndWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm5hdmd1Yl8xMjhCLCA0OTczNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZuYXZndWJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bmF2Z3csIDQ5NzY5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm5hdmd3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZuYXZnd18xMjhCLCA0OTc5N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZuYXZnd18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zub3JtYW10aCwgNDk4MzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bm9ybWFtdGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm5vcm1hbXRoXzEyOEIsIDQ5ODYxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm5vcm1hbXRoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm5vcm1hbXR3LCA0OTg5N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zub3JtYW10dworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bm9ybWFtdHdfMTI4QiwgNDk5Mjh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bm9ybWFtdHdfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bm90LCA0OTk2NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zub3QKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm5vdF8xMjhCLCA0OTk5MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zub3RfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92b3IsIDUwMDIxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zvcl8xMjhCLCA1MDA0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zvcl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwYWNrZWIsIDUwMDc2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2tlYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cGFja2ViXzEyOEIsIDUwMTA1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2tlYl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwYWNrZWgsIDUwMTM5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2tlaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cGFja2VoXzEyOEIsIDUwMTY4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2tlaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwYWNraGJfc2F0LCA1MDIwMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZwYWNraGJfc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwYWNraGJfc2F0XzEyOEIsIDUwMjM1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2toYl9zYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cGFja2h1Yl9zYXQsIDUwMjczfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2todWJfc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwYWNraHViX3NhdF8xMjhCLCA1MDMwN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZwYWNraHViX3NhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwYWNrb2IsIDUwMzQ2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2tvYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cGFja29iXzEyOEIsIDUwMzc1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2tvYl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwYWNrb2gsIDUwNDA5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2tvaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cGFja29oXzEyOEIsIDUwNDM4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2tvaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwYWNrd2hfc2F0LCA1MDQ3Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZwYWNrd2hfc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwYWNrd2hfc2F0XzEyOEIsIDUwNTA1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2t3aF9zYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cGFja3d1aF9zYXQsIDUwNTQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2t3dWhfc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwYWNrd3VoX3NhdF8xMjhCLCA1MDU3N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZwYWNrd3VoX3NhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zwb3Bjb3VudGgsIDUwNjE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBvcGNvdW50aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cG9wY291bnRoXzEyOEIsIDUwNjQ4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBvcGNvdW50aF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwcmVmaXhxYiwgNTA2ODV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cHJlZml4cWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnByZWZpeHFiXzEyOEIsIDUwNzE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnByZWZpeHFiXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnByZWZpeHFoLCA1MDc1Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZwcmVmaXhxaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cHJlZml4cWhfMTI4QiwgNTA3ODN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cHJlZml4cWhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cHJlZml4cXcsIDUwODE5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnByZWZpeHF3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwcmVmaXhxd18xMjhCLCA1MDg1MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZwcmVmaXhxd18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZyZGVsdGEsIDUwODg2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJkZWx0YQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cmRlbHRhXzEyOEIsIDUwOTE1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJkZWx0YV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5YnViX3J0dCwgNTA5NDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1Yl9ydHQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHlidWJfcnR0XzEyOEIsIDUwOTgzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidWJfcnR0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHlidWJfcnR0X2FjYywgNTEwMjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1Yl9ydHRfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5YnViX3J0dF9hY2NfMTI4QiwgNTEwNjB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1Yl9ydHRfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHlidXMsIDUxMTAzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidXMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHlidXNfMTI4QiwgNTExMzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1c18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5YnVzX2FjYywgNTExNjh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1c19hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHlidXNfYWNjXzEyOEIsIDUxMjAyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidXNfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHlidXNpLCA1MTI0MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5YnVzaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weWJ1c2lfMTI4QiwgNTEyNzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1c2lfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weWJ1c2lfYWNjLCA1MTMwOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5YnVzaV9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHlidXNpX2FjY18xMjhCLCA1MTM0M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5YnVzaV9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weWJ1c3YsIDUxMzgzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidXN2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5YnVzdl8xMjhCLCA1MTQxNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5YnVzdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5YnVzdl9hY2MsIDUxNDUwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidXN2X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weWJ1c3ZfYWNjXzEyOEIsIDUxNDg1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidXN2X2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5YnYsIDUxNTI1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weWJ2XzEyOEIsIDUxNTU0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5YnZfYWNjLCA1MTU4OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5YnZfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5YnZfYWNjXzEyOEIsIDUxNjIxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidl9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weXViLCA1MTY1OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5dWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHl1Yl8xMjhCLCA1MTY4OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5dWJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weXViX2FjYywgNTE3MjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXViX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weXViX2FjY18xMjhCLCA1MTc1NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5dWJfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHl1Yl9ydHQsIDUxNzkzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHl1Yl9ydHQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHl1Yl9ydHRfMTI4QiwgNTE4MjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXViX3J0dF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5dWJfcnR0X2FjYywgNTE4NjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXViX3J0dF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHl1Yl9ydHRfYWNjXzEyOEIsIDUxOTAxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHl1Yl9ydHRfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHl1YmksIDUxOTQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHl1YmkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHl1YmlfMTI4QiwgNTE5NzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXViaV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5dWJpX2FjYywgNTIwMDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXViaV9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHl1YmlfYWNjXzEyOEIsIDUyMDQyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHl1YmlfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHl1YnYsIDUyMDgxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHl1YnYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHl1YnZfMTI4QiwgNTIxMTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXVidl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5dWJ2X2FjYywgNTIxNDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXVidl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHl1YnZfYWNjXzEyOEIsIDUyMTgwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHl1YnZfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJvciwgNTIyMTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zyb3JfMTI4QiwgNTIyNDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm9yXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJvdW5kaGIsIDUyMjc2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJvdW5kaGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJvdW5kaGJfMTI4QiwgNTIzMDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmRoYl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zyb3VuZGh1YiwgNTIzNDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmRodWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJvdW5kaHViXzEyOEIsIDUyMzcyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJvdW5kaHViXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJvdW5kdWh1YiwgNTI0MDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmR1aHViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zyb3VuZHVodWJfMTI4QiwgNTI0NDB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmR1aHViXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJvdW5kdXd1aCwgNTI0Nzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmR1d3VoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zyb3VuZHV3dWhfMTI4QiwgNTI1MDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmR1d3VoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJvdW5kd2gsIDUyNTQ2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJvdW5kd2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJvdW5kd2hfMTI4QiwgNTI1NzZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmR3aF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zyb3VuZHd1aCwgNTI2MTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmR3dWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJvdW5kd3VoXzEyOEIsIDUyNjQyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJvdW5kd3VoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJzYWR1YmksIDUyNjc4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJzYWR1YmkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJzYWR1YmlfMTI4QiwgNTI3MDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cnNhZHViaV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zyc2FkdWJpX2FjYywgNTI3NDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cnNhZHViaV9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJzYWR1YmlfYWNjXzEyOEIsIDUyNzc3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJzYWR1YmlfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNhdGh1YiwgNTI4MTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2F0aHViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzYXRodWJfMTI4QiwgNTI4NDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2F0aHViXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNhdHV3dWgsIDUyODc5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNhdHV3dWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNhdHV3dWhfMTI4QiwgNTI5MDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2F0dXd1aF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzYXR3aCwgNTI5NDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2F0d2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNhdHdoXzEyOEIsIDUyOTcyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNhdHdoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNiLCA1MzAwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2JfMTI4QiwgNTMwMzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2NhdHRlcm1oLCA1MzA2MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNjYXR0ZXJtaF8xMjhCLCA1MzA5Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybWhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2NhdHRlcm1oX2FkZCwgNTMxMjl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm1oX2FkZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2NhdHRlcm1oX2FkZF8xMjhCLCA1MzE2NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybWhfYWRkXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNjYXR0ZXJtaHEsIDUzMjA2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNjYXR0ZXJtaHEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNjYXR0ZXJtaHFfMTI4QiwgNTMyMzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm1ocV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzY2F0dGVybWh3LCA1MzI3N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybWh3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzY2F0dGVybWh3XzEyOEIsIDUzMzEwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNjYXR0ZXJtaHdfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2NhdHRlcm1od19hZGQsIDUzMzQ4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNjYXR0ZXJtaHdfYWRkCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzY2F0dGVybWh3X2FkZF8xMjhCLCA1MzM4NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybWh3X2FkZF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzY2F0dGVybWh3cSwgNTM0Mjd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm1od3EKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNjYXR0ZXJtaHdxXzEyOEIsIDUzNDYxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNjYXR0ZXJtaHdxXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNjYXR0ZXJtdywgNTM1MDB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm13CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzY2F0dGVybXdfMTI4QiwgNTM1MzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm13XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNjYXR0ZXJtd19hZGQsIDUzNTY5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNjYXR0ZXJtd19hZGQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNjYXR0ZXJtd19hZGRfMTI4QiwgNTM2MDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm13X2FkZF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzY2F0dGVybXdxLCA1MzY0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybXdxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzY2F0dGVybXdxXzEyOEIsIDUzNjc5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNjYXR0ZXJtd3FfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2gsIDUzNzE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzaF8xMjhCLCA1Mzc0Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzaHVmZWgsIDUzNzcyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZlaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2h1ZmVoXzEyOEIsIDUzODAxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZlaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzaHVmZmIsIDUzODM1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZmYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2h1ZmZiXzEyOEIsIDUzODY0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZmYl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzaHVmZmViLCA1Mzg5OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaHVmZmViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzaHVmZmViXzEyOEIsIDUzOTI4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZmZWJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2h1ZmZoLCA1Mzk2M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaHVmZmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNodWZmaF8xMjhCLCA1Mzk5Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaHVmZmhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2h1ZmZvYiwgNTQwMjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2h1ZmZvYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2h1ZmZvYl8xMjhCLCA1NDA1Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaHVmZm9iXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNodWZmdmRkLCA1NDA5MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaHVmZnZkZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2h1ZmZ2ZGRfMTI4QiwgNTQxMjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2h1ZmZ2ZGRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2h1Zm9lYiwgNTQxNTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2h1Zm9lYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2h1Zm9lYl8xMjhCLCA1NDE4OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaHVmb2ViXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNodWZvZWgsIDU0MjIzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZvZWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNodWZvZWhfMTI4QiwgNTQyNTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2h1Zm9laF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzaHVmb2gsIDU0Mjg4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZvaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2h1Zm9oXzEyOEIsIDU0MzE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZvaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJiLCA1NDM1MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJiXzEyOEIsIDU0Mzc4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViYl9kdiwgNTQ0MTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViYl9kdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViYl9kdl8xMjhCLCA1NDQ0MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJiX2R2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YmJucSwgNTQ0NzV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViYm5xCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJibnFfMTI4QiwgNTQ1MDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViYm5xXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YmJxLCA1NDUzOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJicQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViYnFfMTI4QiwgNTQ1NjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViYnFfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViYnNhdCwgNTQ1OTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViYnNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViYnNhdF8xMjhCLCA1NDYyOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJic2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YmJzYXRfZHYsIDU0NjY0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmJzYXRfZHYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YmJzYXRfZHZfMTI4QiwgNTQ2OTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViYnNhdF9kdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJoLCA1NDgwMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJoXzEyOEIsIDU0ODI5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViaF9kdiwgNTQ4NjF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViaF9kdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViaF9kdl8xMjhCLCA1NDg5MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJoX2R2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YmhucSwgNTQ5MjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViaG5xCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJobnFfMTI4QiwgNTQ5NTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViaG5xXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YmhxLCA1NDk4OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJocQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViaHFfMTI4QiwgNTUwMTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViaHFfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViaHNhdCwgNTUwNTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViaHNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViaHNhdF8xMjhCLCA1NTA4MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJoc2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YmhzYXRfZHYsIDU1MTE1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmhzYXRfZHYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YmhzYXRfZHZfMTI4QiwgNTUxNDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViaHNhdF9kdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJodywgNTUxODZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViaHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1Ymh3XzEyOEIsIDU1MjE0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1Ymh3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YnViaCwgNTUyNDd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidWJoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ1YmhfMTI4QiwgNTUyNzZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidWJoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YnVic2F0LCA1NTMxMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1YnNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3VidWJzYXRfMTI4QiwgNTUzNDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidWJzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3VidWJzYXRfZHYsIDU1Mzc3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnVic2F0X2R2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ1YnNhdF9kdl8xMjhCLCA1NTQxMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1YnNhdF9kdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ1YnViYl9zYXQsIDU1NDUwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnVidWJiX3NhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3VidWJ1YmJfc2F0XzEyOEIsIDU1NDg1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnVidWJiX3NhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ1aHNhdCwgNTU1MjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidWhzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YnVoc2F0XzEyOEIsIDU1NTU2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnVoc2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YnVoc2F0X2R2LCA1NTU5Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1aHNhdF9kdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3VidWhzYXRfZHZfMTI4QiwgNTU2MjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidWhzYXRfZHZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3VidWh3LCA1NTY2NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1aHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YnVod18xMjhCLCA1NTY5NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1aHdfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3VidXdzYXQsIDU1NzI4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnV3c2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ1d3NhdF8xMjhCLCA1NTc1OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1d3NhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ1d3NhdF9kdiwgNTU3OTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidXdzYXRfZHYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YnV3c2F0X2R2XzEyOEIsIDU1ODI5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnV3c2F0X2R2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YncsIDU1ODY4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YncKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YndfMTI4QiwgNTU4OTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3Vid18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ3X2R2LCA1NTkyN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ3X2R2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ3X2R2XzEyOEIsIDU1OTU3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YndfZHZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3Vid25xLCA1NTk5Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ3bnEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YnducV8xMjhCLCA1NjAyMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ3bnFfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3Vid3EsIDU2MDU1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YndxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ3cV8xMjhCLCA1NjA4M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ3cV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ3c2F0LCA1NjExNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ3c2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ3c2F0XzEyOEIsIDU2MTQ2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YndzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3Vid3NhdF9kdiwgNTYxODF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3Vid3NhdF9kdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3Vid3NhdF9kdl8xMjhCLCA1NjIxNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ3c2F0X2R2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN3YXAsIDU2MjUyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN3YXAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN3YXBfMTI4QiwgNTYyNzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3dhcF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Z0bXB5YiwgNTYzMTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dG1weWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnRtcHliXzEyOEIsIDU2MzM5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnRtcHliXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnRtcHliX2FjYywgNTYzNzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dG1weWJfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Z0bXB5Yl9hY2NfMTI4QiwgNTY0MDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dG1weWJfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnRtcHlidXMsIDU2NDQxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnRtcHlidXMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnRtcHlidXNfMTI4QiwgNTY0NzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dG1weWJ1c18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Z0bXB5YnVzX2FjYywgNTY1MDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dG1weWJ1c19hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnRtcHlidXNfYWNjXzEyOEIsIDU2NTQwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnRtcHlidXNfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnRtcHloYiwgNTY1Nzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dG1weWhiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Z0bXB5aGJfMTI4QiwgNTY2MDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dG1weWhiXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnRtcHloYl9hY2MsIDU2NjQyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnRtcHloYl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnRtcHloYl9hY2NfMTI4QiwgNTY2NzV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dG1weWhiX2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Z1bnBhY2tiLCA1NjcxM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z1bnBhY2tiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Z1bnBhY2tiXzEyOEIsIDU2NzQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnVucGFja2JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92dW5wYWNraCwgNTY3Nzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dW5wYWNraAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92dW5wYWNraF8xMjhCLCA1NjgwOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z1bnBhY2toXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnVucGFja29iLCA1Njg0M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z1bnBhY2tvYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92dW5wYWNrb2JfMTI4QiwgNTY4NzR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dW5wYWNrb2JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92dW5wYWNrb2gsIDU2OTEwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnVucGFja29oCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Z1bnBhY2tvaF8xMjhCLCA1Njk0MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z1bnBhY2tvaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Z1bnBhY2t1YiwgNTY5Nzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dW5wYWNrdWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnVucGFja3ViXzEyOEIsIDU3MDA4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnVucGFja3ViXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnVucGFja3VoLCA1NzA0NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z1bnBhY2t1aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92dW5wYWNrdWhfMTI4QiwgNTcwNzV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dW5wYWNrdWhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92eG9yLCA1NzExMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z4b3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnhvcl8xMjhCLCA1NzEzN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z4b3JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92emIsIDU3MTY4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnpiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Z6Yl8xMjhCLCA1NzE5M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z6Yl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Z6aCwgNTcyMjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92emgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnpoXzEyOEIsIDU3MjQ4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnpoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fWTJfZGNjbGVhbmEsIDU3Mjc4fSwgLy8gX19idWlsdGluX0hFWEFHT05fWTJfZGNjbGVhbmEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fWTJfZGNjbGVhbmludmEsIDU3MzA4fSwgLy8gX19idWlsdGluX0hFWEFHT05fWTJfZGNjbGVhbmludmEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fWTJfZGNpbnZhLCA1NzM0MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1kyX2RjaW52YQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9ZMl9kY3plcm9hLCA1NzM2OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1kyX2RjemVyb2EKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fWTRfbDJmZXRjaCwgNTczOTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9ZNF9sMmZldGNoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1k1X2wyZmV0Y2gsIDU3NDI3fSwgLy8gX19idWlsdGluX0hFWEFHT05fWTVfbDJmZXRjaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9wcmVmZXRjaCwgNTc2OTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9wcmVmZXRjaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkY2FycnksIDMzMzg1fSwgLy8gX19idWlsdGluX0hFWEFHT05fdjZfdmFkZGNhcnJ5CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRjYXJyeV8xMjhCLCAzMzQxNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX3Y2X3ZhZGRjYXJyeV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJjYXJyeSwgNTQ3MzV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl92Nl92c3ViY2FycnkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YmNhcnJ5XzEyOEIsIDU0NzY2fSwgLy8gX19idWlsdGluX0hFWEFHT05fdjZfdnN1YmNhcnJ5XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fbW0yNTZpX3ZhZGR3LCA1NzY2OX0sIC8vIF9fYnVpbHRpbl9fbW0yNTZpX3ZhZGR3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3N0b3JlcmJfcGJyLCAyODAxN30sIC8vIF9fYnVpbHRpbl9icmV2X3N0YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9zdG9yZXJkX3BiciwgMjgwMzZ9LCAvLyBfX2J1aWx0aW5fYnJldl9zdGQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfc3RvcmVyaF9wYnIsIDI4MDc2fSwgLy8gX19idWlsdGluX2JyZXZfc3RoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3N0b3JlcmZfcGJyLCAyODA1NX0sIC8vIF9fYnVpbHRpbl9icmV2X3N0aGhpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3N0b3JlcmlfcGJyLCAyODA5NX0sIC8vIF9fYnVpbHRpbl9icmV2X3N0dworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9jaXJjX2xkYiwgNTc0NTZ9LCAvLyBfX2J1aWx0aW5fY2lyY19sZGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fY2lyY19sZGQsIDU3NDc1fSwgLy8gX19idWlsdGluX2NpcmNfbGRkCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX2NpcmNfbGRoLCA1NzQ5NH0sIC8vIF9fYnVpbHRpbl9jaXJjX2xkaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9jaXJjX2xkdWIsIDU3NTEzfSwgLy8gX19idWlsdGluX2NpcmNfbGR1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9jaXJjX2xkdWgsIDU3NTMzfSwgLy8gX19idWlsdGluX2NpcmNfbGR1aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9jaXJjX2xkdywgNTc1NTN9LCAvLyBfX2J1aWx0aW5fY2lyY19sZHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fY2lyY19zdGIsIDU3NTcyfSwgLy8gX19idWlsdGluX2NpcmNfc3RiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX2NpcmNfc3RkLCA1NzU5MX0sIC8vIF9fYnVpbHRpbl9jaXJjX3N0ZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9jaXJjX3N0aCwgNTc2MTB9LCAvLyBfX2J1aWx0aW5fY2lyY19zdGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fY2lyY19zdGhoaSwgNTc2Mjl9LCAvLyBfX2J1aWx0aW5fY2lyY19zdGhoaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9jaXJjX3N0dywgNTc2NTB9LCAvLyBfX2J1aWx0aW5fY2lyY19zdHcKKyAgICB9OworICAgIGF1dG8gSSA9IHN0ZDo6bG93ZXJfYm91bmQoc3RkOjpiZWdpbihoZXhhZ29uTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjplbmQoaGV4YWdvbk5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5OYW1lU3RyKTsKKyAgICBpZiAoSSAhPSBzdGQ6OmVuZChoZXhhZ29uTmFtZXMpICYmCisgICAgICAgIEktPmdldE5hbWUoKSA9PSBCdWlsdGluTmFtZVN0cikKKyAgICAgIHJldHVybiBJLT5JbnRyaW5JRDsKKyAgfQorICBpZiAoVGFyZ2V0UHJlZml4ID09ICJtaXBzIikgeworICAgIHN0YXRpYyBjb25zdCBCdWlsdGluRW50cnkgbWlwc05hbWVzW10gPSB7CisgICAgICB7SW50cmluc2ljOjptaXBzX2Fic3Ffc19waCwgNTc3MjB9LCAvLyBfX2J1aWx0aW5fbWlwc19hYnNxX3NfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWJzcV9zX3FiLCA1Nzc0NX0sIC8vIF9fYnVpbHRpbl9taXBzX2Fic3Ffc19xYgorICAgICAge0ludHJpbnNpYzo6bWlwc19hYnNxX3NfdywgNTc3NzB9LCAvLyBfX2J1aWx0aW5fbWlwc19hYnNxX3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRxX3BoLCA1Nzg4Mn0sIC8vIF9fYnVpbHRpbl9taXBzX2FkZHFfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkcV9zX3BoLCA1NzkwNX0sIC8vIF9fYnVpbHRpbl9taXBzX2FkZHFfc19waAorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRxX3NfdywgNTc5MzB9LCAvLyBfX2J1aWx0aW5fbWlwc19hZGRxX3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRxaF9waCwgNTc5NTR9LCAvLyBfX2J1aWx0aW5fbWlwc19hZGRxaF9waAorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRxaF9yX3BoLCA1Nzk3OH0sIC8vIF9fYnVpbHRpbl9taXBzX2FkZHFoX3JfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkcWhfcl93LCA1ODAwNH0sIC8vIF9fYnVpbHRpbl9taXBzX2FkZHFoX3JfdworICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRxaF93LCA1ODAyOX0sIC8vIF9fYnVpbHRpbl9taXBzX2FkZHFoX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkc2MsIDU4MzI4fSwgLy8gX19idWlsdGluX21pcHNfYWRkc2MKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkdV9waCwgNTgzNDl9LCAvLyBfX2J1aWx0aW5fbWlwc19hZGR1X3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHVfcWIsIDU4MzcyfSwgLy8gX19idWlsdGluX21pcHNfYWRkdV9xYgorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGR1X3NfcGgsIDU4Mzk1fSwgLy8gX19idWlsdGluX21pcHNfYWRkdV9zX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHVfc19xYiwgNTg0MjB9LCAvLyBfX2J1aWx0aW5fbWlwc19hZGR1X3NfcWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkdWhfcWIsIDU4NDQ1fSwgLy8gX19idWlsdGluX21pcHNfYWRkdWhfcWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkdWhfcl9xYiwgNTg0Njl9LCAvLyBfX2J1aWx0aW5fbWlwc19hZGR1aF9yX3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHdjLCA1ODY2N30sIC8vIF9fYnVpbHRpbl9taXBzX2FkZHdjCisgICAgICB7SW50cmluc2ljOjptaXBzX2FwcGVuZCwgNTg3Mjl9LCAvLyBfX2J1aWx0aW5fbWlwc19hcHBlbmQKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmFsaWduLCA1OTI5NX0sIC8vIF9fYnVpbHRpbl9taXBzX2JhbGlnbgorICAgICAge0ludHJpbnNpYzo6bWlwc19iaXRyZXYsIDU5ODQ5fSwgLy8gX19idWlsdGluX21pcHNfYml0cmV2CisgICAgICB7SW50cmluc2ljOjptaXBzX2Jwb3NnZTMyLCA2MDIyN30sIC8vIF9fYnVpbHRpbl9taXBzX2Jwb3NnZTMyCisgICAgICB7SW50cmluc2ljOjptaXBzX2NtcF9lcV9waCwgNjE0NjZ9LCAvLyBfX2J1aWx0aW5fbWlwc19jbXBfZXFfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY21wX2xlX3BoLCA2MTQ5MX0sIC8vIF9fYnVpbHRpbl9taXBzX2NtcF9sZV9waAorICAgICAge0ludHJpbnNpYzo6bWlwc19jbXBfbHRfcGgsIDYxNTE2fSwgLy8gX19idWlsdGluX21pcHNfY21wX2x0X3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX2NtcGdkdV9lcV9xYiwgNjE1NDF9LCAvLyBfX2J1aWx0aW5fbWlwc19jbXBnZHVfZXFfcWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY21wZ2R1X2xlX3FiLCA2MTU2OX0sIC8vIF9fYnVpbHRpbl9taXBzX2NtcGdkdV9sZV9xYgorICAgICAge0ludHJpbnNpYzo6bWlwc19jbXBnZHVfbHRfcWIsIDYxNTk3fSwgLy8gX19idWlsdGluX21pcHNfY21wZ2R1X2x0X3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX2NtcGd1X2VxX3FiLCA2MTYyNX0sIC8vIF9fYnVpbHRpbl9taXBzX2NtcGd1X2VxX3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX2NtcGd1X2xlX3FiLCA2MTY1Mn0sIC8vIF9fYnVpbHRpbl9taXBzX2NtcGd1X2xlX3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX2NtcGd1X2x0X3FiLCA2MTY3OX0sIC8vIF9fYnVpbHRpbl9taXBzX2NtcGd1X2x0X3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX2NtcHVfZXFfcWIsIDYxNzA2fSwgLy8gX19idWlsdGluX21pcHNfY21wdV9lcV9xYgorICAgICAge0ludHJpbnNpYzo6bWlwc19jbXB1X2xlX3FiLCA2MTczMn0sIC8vIF9fYnVpbHRpbl9taXBzX2NtcHVfbGVfcWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY21wdV9sdF9xYiwgNjE3NTh9LCAvLyBfX2J1aWx0aW5fbWlwc19jbXB1X2x0X3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX2Rsc2EsIDYyMTY1fSwgLy8gX19idWlsdGluX21pcHNfZGxzYQorICAgICAge0ludHJpbnNpYzo6bWlwc19kcGFfd19waCwgNjIzMjN9LCAvLyBfX2J1aWx0aW5fbWlwc19kcGFfd19waAorICAgICAge0ludHJpbnNpYzo6bWlwc19kcGFxX3Nfd19waCwgNjI0OTF9LCAvLyBfX2J1aWx0aW5fbWlwc19kcGFxX3Nfd19waAorICAgICAge0ludHJpbnNpYzo6bWlwc19kcGFxX3NhX2xfdywgNjI1MTh9LCAvLyBfX2J1aWx0aW5fbWlwc19kcGFxX3NhX2xfdworICAgICAge0ludHJpbnNpYzo6bWlwc19kcGFxeF9zX3dfcGgsIDYyNTQ1fSwgLy8gX19idWlsdGluX21pcHNfZHBhcXhfc193X3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX2RwYXF4X3NhX3dfcGgsIDYyNTczfSwgLy8gX19idWlsdGluX21pcHNfZHBhcXhfc2Ffd19waAorICAgICAge0ludHJpbnNpYzo6bWlwc19kcGF1X2hfcWJsLCA2MjYwMn0sIC8vIF9fYnVpbHRpbl9taXBzX2RwYXVfaF9xYmwKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZHBhdV9oX3FiciwgNjI2Mjh9LCAvLyBfX2J1aWx0aW5fbWlwc19kcGF1X2hfcWJyCisgICAgICB7SW50cmluc2ljOjptaXBzX2RwYXhfd19waCwgNjI2NTR9LCAvLyBfX2J1aWx0aW5fbWlwc19kcGF4X3dfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZHBzX3dfcGgsIDYyNjc5fSwgLy8gX19idWlsdGluX21pcHNfZHBzX3dfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZHBzcV9zX3dfcGgsIDYyNzAzfSwgLy8gX19idWlsdGluX21pcHNfZHBzcV9zX3dfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZHBzcV9zYV9sX3csIDYyNzMwfSwgLy8gX19idWlsdGluX21pcHNfZHBzcV9zYV9sX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZHBzcXhfc193X3BoLCA2Mjc1N30sIC8vIF9fYnVpbHRpbl9taXBzX2Rwc3F4X3Nfd19waAorICAgICAge0ludHJpbnNpYzo6bWlwc19kcHNxeF9zYV93X3BoLCA2Mjc4NX0sIC8vIF9fYnVpbHRpbl9taXBzX2Rwc3F4X3NhX3dfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZHBzdV9oX3FibCwgNjI4MTR9LCAvLyBfX2J1aWx0aW5fbWlwc19kcHN1X2hfcWJsCisgICAgICB7SW50cmluc2ljOjptaXBzX2Rwc3VfaF9xYnIsIDYyODQwfSwgLy8gX19idWlsdGluX21pcHNfZHBzdV9oX3FicgorICAgICAge0ludHJpbnNpYzo6bWlwc19kcHN4X3dfcGgsIDYzMDEwfSwgLy8gX19idWlsdGluX21pcHNfZHBzeF93X3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX2V4dHAsIDYzMDM1fSwgLy8gX19idWlsdGluX21pcHNfZXh0cAorICAgICAge0ludHJpbnNpYzo6bWlwc19leHRwZHAsIDYzMDU1fSwgLy8gX19idWlsdGluX21pcHNfZXh0cGRwCisgICAgICB7SW50cmluc2ljOjptaXBzX2V4dHJfcl93LCA2MzA3N30sIC8vIF9fYnVpbHRpbl9taXBzX2V4dHJfcl93CisgICAgICB7SW50cmluc2ljOjptaXBzX2V4dHJfcnNfdywgNjMxMDF9LCAvLyBfX2J1aWx0aW5fbWlwc19leHRyX3JzX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZXh0cl9zX2gsIDYzMTI2fSwgLy8gX19idWlsdGluX21pcHNfZXh0cl9zX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZXh0cl93LCA2MzE1MH0sIC8vIF9fYnVpbHRpbl9taXBzX2V4dHJfdworICAgICAge0ludHJpbnNpYzo6bWlwc19pbnN2LCA2NjIwMn0sIC8vIF9fYnVpbHRpbl9taXBzX2luc3YKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbGJ1eCwgNjYzMTB9LCAvLyBfX2J1aWx0aW5fbWlwc19sYnV4CisgICAgICB7SW50cmluc2ljOjptaXBzX2xoeCwgNjY0ODZ9LCAvLyBfX2J1aWx0aW5fbWlwc19saHgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbHNhLCA2NjUwNX0sIC8vIF9fYnVpbHRpbl9taXBzX2xzYQorICAgICAge0ludHJpbnNpYzo6bWlwc19sd3gsIDY2NTI0fSwgLy8gX19idWlsdGluX21pcHNfbHd4CisgICAgICB7SW50cmluc2ljOjptaXBzX21hZGQsIDY2NTQzfSwgLy8gX19idWlsdGluX21pcHNfbWFkZAorICAgICAge0ludHJpbnNpYzo6bWlwc19tYWRkdSwgNjY2NTd9LCAvLyBfX2J1aWx0aW5fbWlwc19tYWRkdQorICAgICAge0ludHJpbnNpYzo6bWlwc19tYXFfc193X3BobCwgNjY3NjZ9LCAvLyBfX2J1aWx0aW5fbWlwc19tYXFfc193X3BobAorICAgICAge0ludHJpbnNpYzo6bWlwc19tYXFfc193X3BociwgNjY3OTN9LCAvLyBfX2J1aWx0aW5fbWlwc19tYXFfc193X3BocgorICAgICAge0ludHJpbnNpYzo6bWlwc19tYXFfc2Ffd19waGwsIDY2ODIwfSwgLy8gX19idWlsdGluX21pcHNfbWFxX3NhX3dfcGhsCisgICAgICB7SW50cmluc2ljOjptaXBzX21hcV9zYV93X3BociwgNjY4NDh9LCAvLyBfX2J1aWx0aW5fbWlwc19tYXFfc2Ffd19waHIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbW9kc3ViLCA2Nzk0OH0sIC8vIF9fYnVpbHRpbl9taXBzX21vZHN1YgorICAgICAge0ludHJpbnNpYzo6bWlwc19tc3ViLCA2Nzk5MX0sIC8vIF9fYnVpbHRpbl9taXBzX21zdWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXN1YnUsIDY4MTA1fSwgLy8gX19idWlsdGluX21pcHNfbXN1YnUKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXRobGlwLCA2ODIxNH0sIC8vIF9fYnVpbHRpbl9taXBzX210aGxpcAorICAgICAge0ludHJpbnNpYzo6bWlwc19tdWxfcGgsIDY4MjM2fSwgLy8gX19idWlsdGluX21pcHNfbXVsX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX211bF9zX3BoLCA2ODMwMn0sIC8vIF9fYnVpbHRpbl9taXBzX211bF9zX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX211bGVxX3Nfd19waGwsIDY4MzI2fSwgLy8gX19idWlsdGluX21pcHNfbXVsZXFfc193X3BobAorICAgICAge0ludHJpbnNpYzo6bWlwc19tdWxlcV9zX3dfcGhyLCA2ODM1NX0sIC8vIF9fYnVpbHRpbl9taXBzX211bGVxX3Nfd19waHIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXVsZXVfc19waF9xYmwsIDY4Mzg0fSwgLy8gX19idWlsdGluX21pcHNfbXVsZXVfc19waF9xYmwKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXVsZXVfc19waF9xYnIsIDY4NDE0fSwgLy8gX19idWlsdGluX21pcHNfbXVsZXVfc19waF9xYnIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXVscV9yc19waCwgNjg0NDR9LCAvLyBfX2J1aWx0aW5fbWlwc19tdWxxX3JzX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX211bHFfcnNfdywgNjg0NzB9LCAvLyBfX2J1aWx0aW5fbWlwc19tdWxxX3JzX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXVscV9zX3BoLCA2ODQ5NX0sIC8vIF9fYnVpbHRpbl9taXBzX211bHFfc19waAorICAgICAge0ludHJpbnNpYzo6bWlwc19tdWxxX3NfdywgNjg1MjB9LCAvLyBfX2J1aWx0aW5fbWlwc19tdWxxX3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19tdWxzYV93X3BoLCA2ODU5MH0sIC8vIF9fYnVpbHRpbl9taXBzX211bHNhX3dfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXVsc2FxX3Nfd19waCwgNjg2MTZ9LCAvLyBfX2J1aWx0aW5fbWlwc19tdWxzYXFfc193X3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX211bHQsIDY4NjQ1fSwgLy8gX19idWlsdGluX21pcHNfbXVsdAorICAgICAge0ludHJpbnNpYzo6bWlwc19tdWx0dSwgNjg2NjV9LCAvLyBfX2J1aWx0aW5fbWlwc19tdWx0dQorICAgICAge0ludHJpbnNpYzo6bWlwc19wYWNrcmxfcGgsIDY5MDE4fSwgLy8gX19idWlsdGluX21pcHNfcGFja3JsX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX3BpY2tfcGgsIDY5MzAzfSwgLy8gX19idWlsdGluX21pcHNfcGlja19waAorICAgICAge0ludHJpbnNpYzo6bWlwc19waWNrX3FiLCA2OTMyNn0sIC8vIF9fYnVpbHRpbl9taXBzX3BpY2tfcWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcHJlY2VxX3dfcGhsLCA2OTM0OX0sIC8vIF9fYnVpbHRpbl9taXBzX3ByZWNlcV93X3BobAorICAgICAge0ludHJpbnNpYzo6bWlwc19wcmVjZXFfd19waHIsIDY5Mzc3fSwgLy8gX19idWlsdGluX21pcHNfcHJlY2VxX3dfcGhyCisgICAgICB7SW50cmluc2ljOjptaXBzX3ByZWNlcXVfcGhfcWJsLCA2OTQwNX0sIC8vIF9fYnVpbHRpbl9taXBzX3ByZWNlcXVfcGhfcWJsCisgICAgICB7SW50cmluc2ljOjptaXBzX3ByZWNlcXVfcGhfcWJsYSwgNjk0MzV9LCAvLyBfX2J1aWx0aW5fbWlwc19wcmVjZXF1X3BoX3FibGEKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcHJlY2VxdV9waF9xYnIsIDY5NDY2fSwgLy8gX19idWlsdGluX21pcHNfcHJlY2VxdV9waF9xYnIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcHJlY2VxdV9waF9xYnJhLCA2OTQ5Nn0sIC8vIF9fYnVpbHRpbl9taXBzX3ByZWNlcXVfcGhfcWJyYQorICAgICAge0ludHJpbnNpYzo6bWlwc19wcmVjZXVfcGhfcWJsLCA2OTUyN30sIC8vIF9fYnVpbHRpbl9taXBzX3ByZWNldV9waF9xYmwKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcHJlY2V1X3BoX3FibGEsIDY5NTU2fSwgLy8gX19idWlsdGluX21pcHNfcHJlY2V1X3BoX3FibGEKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcHJlY2V1X3BoX3FiciwgNjk1ODZ9LCAvLyBfX2J1aWx0aW5fbWlwc19wcmVjZXVfcGhfcWJyCisgICAgICB7SW50cmluc2ljOjptaXBzX3ByZWNldV9waF9xYnJhLCA2OTYxNX0sIC8vIF9fYnVpbHRpbl9taXBzX3ByZWNldV9waF9xYnJhCisgICAgICB7SW50cmluc2ljOjptaXBzX3ByZWNyX3FiX3BoLCA2OTY0NX0sIC8vIF9fYnVpbHRpbl9taXBzX3ByZWNyX3FiX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX3ByZWNyX3NyYV9waF93LCA2OTY3Mn0sIC8vIF9fYnVpbHRpbl9taXBzX3ByZWNyX3NyYV9waF93CisgICAgICB7SW50cmluc2ljOjptaXBzX3ByZWNyX3NyYV9yX3BoX3csIDY5NzAyfSwgLy8gX19idWlsdGluX21pcHNfcHJlY3Jfc3JhX3JfcGhfdworICAgICAge0ludHJpbnNpYzo6bWlwc19wcmVjcnFfcGhfdywgNjk3MzR9LCAvLyBfX2J1aWx0aW5fbWlwc19wcmVjcnFfcGhfdworICAgICAge0ludHJpbnNpYzo6bWlwc19wcmVjcnFfcWJfcGgsIDY5NzYxfSwgLy8gX19idWlsdGluX21pcHNfcHJlY3JxX3FiX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX3ByZWNycV9yc19waF93LCA2OTc4OX0sIC8vIF9fYnVpbHRpbl9taXBzX3ByZWNycV9yc19waF93CisgICAgICB7SW50cmluc2ljOjptaXBzX3ByZWNycXVfc19xYl9waCwgNjk4MTl9LCAvLyBfX2J1aWx0aW5fbWlwc19wcmVjcnF1X3NfcWJfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcHJlcGVuZCwgNjk4NTB9LCAvLyBfX2J1aWx0aW5fbWlwc19wcmVwZW5kCisgICAgICB7SW50cmluc2ljOjptaXBzX3JhZGR1X3dfcWIsIDY5ODczfSwgLy8gX19idWlsdGluX21pcHNfcmFkZHVfd19xYgorICAgICAge0ludHJpbnNpYzo6bWlwc19yZGRzcCwgNjk4OTl9LCAvLyBfX2J1aWx0aW5fbWlwc19yZGRzcAorICAgICAge0ludHJpbnNpYzo6bWlwc19yZXBsX3BoLCA2OTkyMH0sIC8vIF9fYnVpbHRpbl9taXBzX3JlcGxfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcmVwbF9xYiwgNjk5NDN9LCAvLyBfX2J1aWx0aW5fbWlwc19yZXBsX3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX3NoaWxvLCA3MDIwMn0sIC8vIF9fYnVpbHRpbl9taXBzX3NoaWxvCisgICAgICB7SW50cmluc2ljOjptaXBzX3NobGxfcGgsIDcwMjIzfSwgLy8gX19idWlsdGluX21pcHNfc2hsbF9waAorICAgICAge0ludHJpbnNpYzo6bWlwc19zaGxsX3FiLCA3MDI0Nn0sIC8vIF9fYnVpbHRpbl9taXBzX3NobGxfcWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2hsbF9zX3BoLCA3MDI2OX0sIC8vIF9fYnVpbHRpbl9taXBzX3NobGxfc19waAorICAgICAge0ludHJpbnNpYzo6bWlwc19zaGxsX3NfdywgNzAyOTR9LCAvLyBfX2J1aWx0aW5fbWlwc19zaGxsX3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zaHJhX3BoLCA3MDMxOH0sIC8vIF9fYnVpbHRpbl9taXBzX3NocmFfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2hyYV9xYiwgNzAzNDF9LCAvLyBfX2J1aWx0aW5fbWlwc19zaHJhX3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX3NocmFfcl9waCwgNzAzNjR9LCAvLyBfX2J1aWx0aW5fbWlwc19zaHJhX3JfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2hyYV9yX3FiLCA3MDM4OX0sIC8vIF9fYnVpbHRpbl9taXBzX3NocmFfcl9xYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zaHJhX3JfdywgNzA0MTR9LCAvLyBfX2J1aWx0aW5fbWlwc19zaHJhX3JfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zaHJsX3BoLCA3MDQzOH0sIC8vIF9fYnVpbHRpbl9taXBzX3NocmxfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2hybF9xYiwgNzA0NjF9LCAvLyBfX2J1aWx0aW5fbWlwc19zaHJsX3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnFfcGgsIDcxNzQwfSwgLy8gX19idWlsdGluX21pcHNfc3VicV9waAorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJxX3NfcGgsIDcxNzYzfSwgLy8gX19idWlsdGluX21pcHNfc3VicV9zX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnFfc193LCA3MTc4OH0sIC8vIF9fYnVpbHRpbl9taXBzX3N1YnFfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnFoX3BoLCA3MTgxMn0sIC8vIF9fYnVpbHRpbl9taXBzX3N1YnFoX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnFoX3JfcGgsIDcxODM2fSwgLy8gX19idWlsdGluX21pcHNfc3VicWhfcl9waAorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJxaF9yX3csIDcxODYyfSwgLy8gX19idWlsdGluX21pcHNfc3VicWhfcl93CisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnFoX3csIDcxODg3fSwgLy8gX19idWlsdGluX21pcHNfc3VicWhfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJ1X3BoLCA3MjI5NH0sIC8vIF9fYnVpbHRpbl9taXBzX3N1YnVfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3VidV9xYiwgNzIzMTd9LCAvLyBfX2J1aWx0aW5fbWlwc19zdWJ1X3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnVfc19waCwgNzIzNDB9LCAvLyBfX2J1aWx0aW5fbWlwc19zdWJ1X3NfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3VidV9zX3FiLCA3MjM2NX0sIC8vIF9fYnVpbHRpbl9taXBzX3N1YnVfc19xYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJ1aF9xYiwgNzIzOTB9LCAvLyBfX2J1aWx0aW5fbWlwc19zdWJ1aF9xYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJ1aF9yX3FiLCA3MjQxNH0sIC8vIF9fYnVpbHRpbl9taXBzX3N1YnVoX3JfcWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfd3Jkc3AsIDcyNjk2fSwgLy8gX19idWlsdGluX21pcHNfd3Jkc3AKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkX2FfYiwgNTc3OTR9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZF9hX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkX2FfZCwgNTc4MTZ9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZF9hX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkX2FfaCwgNTc4Mzh9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZF9hX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkX2FfdywgNTc4NjB9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZF9hX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkc19hX2IsIDU4MDUyfSwgLy8gX19idWlsdGluX21zYV9hZGRzX2FfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRzX2FfZCwgNTgwNzV9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZHNfYV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHNfYV9oLCA1ODA5OH0sIC8vIF9fYnVpbHRpbl9tc2FfYWRkc19hX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkc19hX3csIDU4MTIxfSwgLy8gX19idWlsdGluX21zYV9hZGRzX2FfdworICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRzX3NfYiwgNTgxNDR9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZHNfc19iCisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHNfc19kLCA1ODE2N30sIC8vIF9fYnVpbHRpbl9tc2FfYWRkc19zX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkc19zX2gsIDU4MTkwfSwgLy8gX19idWlsdGluX21zYV9hZGRzX3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRzX3NfdywgNTgyMTN9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZHNfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHNfdV9iLCA1ODIzNn0sIC8vIF9fYnVpbHRpbl9tc2FfYWRkc191X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkc191X2QsIDU4MjU5fSwgLy8gX19idWlsdGluX21zYV9hZGRzX3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRzX3VfaCwgNTgyODJ9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZHNfdV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHNfdV93LCA1ODMwNX0sIC8vIF9fYnVpbHRpbl9tc2FfYWRkc191X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkdl9iLCA1ODQ5NX0sIC8vIF9fYnVpbHRpbl9tc2FfYWRkdl9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHZfZCwgNTg1MTZ9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZHZfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGR2X2gsIDU4NTM3fSwgLy8gX19idWlsdGluX21zYV9hZGR2X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkdl93LCA1ODU1OH0sIC8vIF9fYnVpbHRpbl9tc2FfYWRkdl93CisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHZpX2IsIDU4NTc5fSwgLy8gX19idWlsdGluX21zYV9hZGR2aV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHZpX2QsIDU4NjAxfSwgLy8gX19idWlsdGluX21zYV9hZGR2aV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHZpX2gsIDU4NjIzfSwgLy8gX19idWlsdGluX21zYV9hZGR2aV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHZpX3csIDU4NjQ1fSwgLy8gX19idWlsdGluX21zYV9hZGR2aV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2FuZF92LCA1ODY4OH0sIC8vIF9fYnVpbHRpbl9tc2FfYW5kX3YKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYW5kaV9iLCA1ODcwOH0sIC8vIF9fYnVpbHRpbl9tc2FfYW5kaV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2FzdWJfc19iLCA1ODc1MX0sIC8vIF9fYnVpbHRpbl9tc2FfYXN1Yl9zX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYXN1Yl9zX2QsIDU4Nzc0fSwgLy8gX19idWlsdGluX21zYV9hc3ViX3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19hc3ViX3NfaCwgNTg3OTd9LCAvLyBfX2J1aWx0aW5fbXNhX2FzdWJfc19oCisgICAgICB7SW50cmluc2ljOjptaXBzX2FzdWJfc193LCA1ODgyMH0sIC8vIF9fYnVpbHRpbl9tc2FfYXN1Yl9zX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYXN1Yl91X2IsIDU4ODQzfSwgLy8gX19idWlsdGluX21zYV9hc3ViX3VfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19hc3ViX3VfZCwgNTg4NjZ9LCAvLyBfX2J1aWx0aW5fbXNhX2FzdWJfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2FzdWJfdV9oLCA1ODg4OX0sIC8vIF9fYnVpbHRpbl9tc2FfYXN1Yl91X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYXN1Yl91X3csIDU4OTEyfSwgLy8gX19idWlsdGluX21zYV9hc3ViX3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19hdmVfc19iLCA1ODkzNX0sIC8vIF9fYnVpbHRpbl9tc2FfYXZlX3NfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19hdmVfc19kLCA1ODk1N30sIC8vIF9fYnVpbHRpbl9tc2FfYXZlX3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19hdmVfc19oLCA1ODk3OX0sIC8vIF9fYnVpbHRpbl9tc2FfYXZlX3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19hdmVfc193LCA1OTAwMX0sIC8vIF9fYnVpbHRpbl9tc2FfYXZlX3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19hdmVfdV9iLCA1OTAyM30sIC8vIF9fYnVpbHRpbl9tc2FfYXZlX3VfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19hdmVfdV9kLCA1OTA0NX0sIC8vIF9fYnVpbHRpbl9tc2FfYXZlX3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19hdmVfdV9oLCA1OTA2N30sIC8vIF9fYnVpbHRpbl9tc2FfYXZlX3VfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19hdmVfdV93LCA1OTA4OX0sIC8vIF9fYnVpbHRpbl9tc2FfYXZlX3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19hdmVyX3NfYiwgNTkxMTF9LCAvLyBfX2J1aWx0aW5fbXNhX2F2ZXJfc19iCisgICAgICB7SW50cmluc2ljOjptaXBzX2F2ZXJfc19kLCA1OTEzNH0sIC8vIF9fYnVpbHRpbl9tc2FfYXZlcl9zX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYXZlcl9zX2gsIDU5MTU3fSwgLy8gX19idWlsdGluX21zYV9hdmVyX3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19hdmVyX3NfdywgNTkxODB9LCAvLyBfX2J1aWx0aW5fbXNhX2F2ZXJfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX2F2ZXJfdV9iLCA1OTIwM30sIC8vIF9fYnVpbHRpbl9tc2FfYXZlcl91X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYXZlcl91X2QsIDU5MjI2fSwgLy8gX19idWlsdGluX21zYV9hdmVyX3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19hdmVyX3VfaCwgNTkyNDl9LCAvLyBfX2J1aWx0aW5fbXNhX2F2ZXJfdV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2F2ZXJfdV93LCA1OTI3Mn0sIC8vIF9fYnVpbHRpbl9tc2FfYXZlcl91X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmNscl9iLCA1OTMxN30sIC8vIF9fYnVpbHRpbl9tc2FfYmNscl9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2JjbHJfZCwgNTkzMzh9LCAvLyBfX2J1aWx0aW5fbXNhX2JjbHJfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19iY2xyX2gsIDU5MzU5fSwgLy8gX19idWlsdGluX21zYV9iY2xyX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmNscl93LCA1OTM4MH0sIC8vIF9fYnVpbHRpbl9tc2FfYmNscl93CisgICAgICB7SW50cmluc2ljOjptaXBzX2JjbHJpX2IsIDU5NDAxfSwgLy8gX19idWlsdGluX21zYV9iY2xyaV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2JjbHJpX2QsIDU5NDIzfSwgLy8gX19idWlsdGluX21zYV9iY2xyaV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2JjbHJpX2gsIDU5NDQ1fSwgLy8gX19idWlsdGluX21zYV9iY2xyaV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2JjbHJpX3csIDU5NDY3fSwgLy8gX19idWlsdGluX21zYV9iY2xyaV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2JpbnNsX2IsIDU5NDg5fSwgLy8gX19idWlsdGluX21zYV9iaW5zbF9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2JpbnNsX2QsIDU5NTExfSwgLy8gX19idWlsdGluX21zYV9iaW5zbF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2JpbnNsX2gsIDU5NTMzfSwgLy8gX19idWlsdGluX21zYV9iaW5zbF9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2JpbnNsX3csIDU5NTU1fSwgLy8gX19idWlsdGluX21zYV9iaW5zbF93CisgICAgICB7SW50cmluc2ljOjptaXBzX2JpbnNsaV9iLCA1OTU3N30sIC8vIF9fYnVpbHRpbl9tc2FfYmluc2xpX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmluc2xpX2QsIDU5NjAwfSwgLy8gX19idWlsdGluX21zYV9iaW5zbGlfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19iaW5zbGlfaCwgNTk2MjN9LCAvLyBfX2J1aWx0aW5fbXNhX2JpbnNsaV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2JpbnNsaV93LCA1OTY0Nn0sIC8vIF9fYnVpbHRpbl9tc2FfYmluc2xpX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmluc3JfYiwgNTk2Njl9LCAvLyBfX2J1aWx0aW5fbXNhX2JpbnNyX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmluc3JfZCwgNTk2OTF9LCAvLyBfX2J1aWx0aW5fbXNhX2JpbnNyX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmluc3JfaCwgNTk3MTN9LCAvLyBfX2J1aWx0aW5fbXNhX2JpbnNyX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmluc3JfdywgNTk3MzV9LCAvLyBfX2J1aWx0aW5fbXNhX2JpbnNyX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmluc3JpX2IsIDU5NzU3fSwgLy8gX19idWlsdGluX21zYV9iaW5zcmlfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19iaW5zcmlfZCwgNTk3ODB9LCAvLyBfX2J1aWx0aW5fbXNhX2JpbnNyaV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2JpbnNyaV9oLCA1OTgwM30sIC8vIF9fYnVpbHRpbl9tc2FfYmluc3JpX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmluc3JpX3csIDU5ODI2fSwgLy8gX19idWlsdGluX21zYV9iaW5zcmlfdworICAgICAge0ludHJpbnNpYzo6bWlwc19ibW56X3YsIDU5ODcxfSwgLy8gX19idWlsdGluX21zYV9ibW56X3YKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYm1uemlfYiwgNTk4OTJ9LCAvLyBfX2J1aWx0aW5fbXNhX2JtbnppX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYm16X3YsIDU5OTE0fSwgLy8gX19idWlsdGluX21zYV9ibXpfdgorICAgICAge0ludHJpbnNpYzo6bWlwc19ibXppX2IsIDU5OTM0fSwgLy8gX19idWlsdGluX21zYV9ibXppX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYm5lZ19iLCA1OTk1NX0sIC8vIF9fYnVpbHRpbl9tc2FfYm5lZ19iCisgICAgICB7SW50cmluc2ljOjptaXBzX2JuZWdfZCwgNTk5NzZ9LCAvLyBfX2J1aWx0aW5fbXNhX2JuZWdfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19ibmVnX2gsIDU5OTk3fSwgLy8gX19idWlsdGluX21zYV9ibmVnX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYm5lZ193LCA2MDAxOH0sIC8vIF9fYnVpbHRpbl9tc2FfYm5lZ193CisgICAgICB7SW50cmluc2ljOjptaXBzX2JuZWdpX2IsIDYwMDM5fSwgLy8gX19idWlsdGluX21zYV9ibmVnaV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2JuZWdpX2QsIDYwMDYxfSwgLy8gX19idWlsdGluX21zYV9ibmVnaV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2JuZWdpX2gsIDYwMDgzfSwgLy8gX19idWlsdGluX21zYV9ibmVnaV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2JuZWdpX3csIDYwMTA1fSwgLy8gX19idWlsdGluX21zYV9ibmVnaV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2Juel9iLCA2MDEyN30sIC8vIF9fYnVpbHRpbl9tc2FfYm56X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYm56X2QsIDYwMTQ3fSwgLy8gX19idWlsdGluX21zYV9ibnpfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19ibnpfaCwgNjAxNjd9LCAvLyBfX2J1aWx0aW5fbXNhX2Juel9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2Juel92LCA2MDE4N30sIC8vIF9fYnVpbHRpbl9tc2FfYm56X3YKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYm56X3csIDYwMjA3fSwgLy8gX19idWlsdGluX21zYV9ibnpfdworICAgICAge0ludHJpbnNpYzo6bWlwc19ic2VsX3YsIDYwMjUxfSwgLy8gX19idWlsdGluX21zYV9ic2VsX3YKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYnNlbGlfYiwgNjAyNzJ9LCAvLyBfX2J1aWx0aW5fbXNhX2JzZWxpX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYnNldF9iLCA2MDI5NH0sIC8vIF9fYnVpbHRpbl9tc2FfYnNldF9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2JzZXRfZCwgNjAzMTV9LCAvLyBfX2J1aWx0aW5fbXNhX2JzZXRfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19ic2V0X2gsIDYwMzM2fSwgLy8gX19idWlsdGluX21zYV9ic2V0X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYnNldF93LCA2MDM1N30sIC8vIF9fYnVpbHRpbl9tc2FfYnNldF93CisgICAgICB7SW50cmluc2ljOjptaXBzX2JzZXRpX2IsIDYwMzc4fSwgLy8gX19idWlsdGluX21zYV9ic2V0aV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2JzZXRpX2QsIDYwNDAwfSwgLy8gX19idWlsdGluX21zYV9ic2V0aV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2JzZXRpX2gsIDYwNDIyfSwgLy8gX19idWlsdGluX21zYV9ic2V0aV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2JzZXRpX3csIDYwNDQ0fSwgLy8gX19idWlsdGluX21zYV9ic2V0aV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2J6X2IsIDYwNDY2fSwgLy8gX19idWlsdGluX21zYV9iel9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2J6X2QsIDYwNDg1fSwgLy8gX19idWlsdGluX21zYV9iel9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2J6X2gsIDYwNTA0fSwgLy8gX19idWlsdGluX21zYV9iel9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2J6X3YsIDYwNTIzfSwgLy8gX19idWlsdGluX21zYV9iel92CisgICAgICB7SW50cmluc2ljOjptaXBzX2J6X3csIDYwNTQyfSwgLy8gX19idWlsdGluX21zYV9iel93CisgICAgICB7SW50cmluc2ljOjptaXBzX2NlcV9iLCA2MDU2MX0sIC8vIF9fYnVpbHRpbl9tc2FfY2VxX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2VxX2QsIDYwNTgxfSwgLy8gX19idWlsdGluX21zYV9jZXFfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19jZXFfaCwgNjA2MDF9LCAvLyBfX2J1aWx0aW5fbXNhX2NlcV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2NlcV93LCA2MDYyMX0sIC8vIF9fYnVpbHRpbl9tc2FfY2VxX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2VxaV9iLCA2MDY0MX0sIC8vIF9fYnVpbHRpbl9tc2FfY2VxaV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2NlcWlfZCwgNjA2NjJ9LCAvLyBfX2J1aWx0aW5fbXNhX2NlcWlfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19jZXFpX2gsIDYwNjgzfSwgLy8gX19idWlsdGluX21zYV9jZXFpX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2VxaV93LCA2MDcwNH0sIC8vIF9fYnVpbHRpbl9tc2FfY2VxaV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2NmY21zYSwgNjA3MjV9LCAvLyBfX2J1aWx0aW5fbXNhX2NmY21zYQorICAgICAge0ludHJpbnNpYzo6bWlwc19jbGVfc19iLCA2MDc0Nn0sIC8vIF9fYnVpbHRpbl9tc2FfY2xlX3NfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19jbGVfc19kLCA2MDc2OH0sIC8vIF9fYnVpbHRpbl9tc2FfY2xlX3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19jbGVfc19oLCA2MDc5MH0sIC8vIF9fYnVpbHRpbl9tc2FfY2xlX3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19jbGVfc193LCA2MDgxMn0sIC8vIF9fYnVpbHRpbl9tc2FfY2xlX3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19jbGVfdV9iLCA2MDgzNH0sIC8vIF9fYnVpbHRpbl9tc2FfY2xlX3VfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19jbGVfdV9kLCA2MDg1Nn0sIC8vIF9fYnVpbHRpbl9tc2FfY2xlX3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19jbGVfdV9oLCA2MDg3OH0sIC8vIF9fYnVpbHRpbl9tc2FfY2xlX3VfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19jbGVfdV93LCA2MDkwMH0sIC8vIF9fYnVpbHRpbl9tc2FfY2xlX3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19jbGVpX3NfYiwgNjA5MjJ9LCAvLyBfX2J1aWx0aW5fbXNhX2NsZWlfc19iCisgICAgICB7SW50cmluc2ljOjptaXBzX2NsZWlfc19kLCA2MDk0NX0sIC8vIF9fYnVpbHRpbl9tc2FfY2xlaV9zX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2xlaV9zX2gsIDYwOTY4fSwgLy8gX19idWlsdGluX21zYV9jbGVpX3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19jbGVpX3NfdywgNjA5OTF9LCAvLyBfX2J1aWx0aW5fbXNhX2NsZWlfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX2NsZWlfdV9iLCA2MTAxNH0sIC8vIF9fYnVpbHRpbl9tc2FfY2xlaV91X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2xlaV91X2QsIDYxMDM3fSwgLy8gX19idWlsdGluX21zYV9jbGVpX3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19jbGVpX3VfaCwgNjEwNjB9LCAvLyBfX2J1aWx0aW5fbXNhX2NsZWlfdV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2NsZWlfdV93LCA2MTA4M30sIC8vIF9fYnVpbHRpbl9tc2FfY2xlaV91X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2x0X3NfYiwgNjExMDZ9LCAvLyBfX2J1aWx0aW5fbXNhX2NsdF9zX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2x0X3NfZCwgNjExMjh9LCAvLyBfX2J1aWx0aW5fbXNhX2NsdF9zX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2x0X3NfaCwgNjExNTB9LCAvLyBfX2J1aWx0aW5fbXNhX2NsdF9zX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2x0X3NfdywgNjExNzJ9LCAvLyBfX2J1aWx0aW5fbXNhX2NsdF9zX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2x0X3VfYiwgNjExOTR9LCAvLyBfX2J1aWx0aW5fbXNhX2NsdF91X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2x0X3VfZCwgNjEyMTZ9LCAvLyBfX2J1aWx0aW5fbXNhX2NsdF91X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2x0X3VfaCwgNjEyMzh9LCAvLyBfX2J1aWx0aW5fbXNhX2NsdF91X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2x0X3VfdywgNjEyNjB9LCAvLyBfX2J1aWx0aW5fbXNhX2NsdF91X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2x0aV9zX2IsIDYxMjgyfSwgLy8gX19idWlsdGluX21zYV9jbHRpX3NfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19jbHRpX3NfZCwgNjEzMDV9LCAvLyBfX2J1aWx0aW5fbXNhX2NsdGlfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX2NsdGlfc19oLCA2MTMyOH0sIC8vIF9fYnVpbHRpbl9tc2FfY2x0aV9zX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2x0aV9zX3csIDYxMzUxfSwgLy8gX19idWlsdGluX21zYV9jbHRpX3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19jbHRpX3VfYiwgNjEzNzR9LCAvLyBfX2J1aWx0aW5fbXNhX2NsdGlfdV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2NsdGlfdV9kLCA2MTM5N30sIC8vIF9fYnVpbHRpbl9tc2FfY2x0aV91X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2x0aV91X2gsIDYxNDIwfSwgLy8gX19idWlsdGluX21zYV9jbHRpX3VfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19jbHRpX3VfdywgNjE0NDN9LCAvLyBfX2J1aWx0aW5fbXNhX2NsdGlfdV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2NvcHlfc19iLCA2MTc4NH0sIC8vIF9fYnVpbHRpbl9tc2FfY29weV9zX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY29weV9zX2QsIDYxODA3fSwgLy8gX19idWlsdGluX21zYV9jb3B5X3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19jb3B5X3NfaCwgNjE4MzB9LCAvLyBfX2J1aWx0aW5fbXNhX2NvcHlfc19oCisgICAgICB7SW50cmluc2ljOjptaXBzX2NvcHlfc193LCA2MTg1M30sIC8vIF9fYnVpbHRpbl9tc2FfY29weV9zX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY29weV91X2IsIDYxODc2fSwgLy8gX19idWlsdGluX21zYV9jb3B5X3VfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19jb3B5X3VfZCwgNjE4OTl9LCAvLyBfX2J1aWx0aW5fbXNhX2NvcHlfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2NvcHlfdV9oLCA2MTkyMn0sIC8vIF9fYnVpbHRpbl9tc2FfY29weV91X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY29weV91X3csIDYxOTQ1fSwgLy8gX19idWlsdGluX21zYV9jb3B5X3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19jdGNtc2EsIDYxOTY4fSwgLy8gX19idWlsdGluX21zYV9jdGNtc2EKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZGl2X3NfYiwgNjE5ODl9LCAvLyBfX2J1aWx0aW5fbXNhX2Rpdl9zX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZGl2X3NfZCwgNjIwMTF9LCAvLyBfX2J1aWx0aW5fbXNhX2Rpdl9zX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZGl2X3NfaCwgNjIwMzN9LCAvLyBfX2J1aWx0aW5fbXNhX2Rpdl9zX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZGl2X3NfdywgNjIwNTV9LCAvLyBfX2J1aWx0aW5fbXNhX2Rpdl9zX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZGl2X3VfYiwgNjIwNzd9LCAvLyBfX2J1aWx0aW5fbXNhX2Rpdl91X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZGl2X3VfZCwgNjIwOTl9LCAvLyBfX2J1aWx0aW5fbXNhX2Rpdl91X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZGl2X3VfaCwgNjIxMjF9LCAvLyBfX2J1aWx0aW5fbXNhX2Rpdl91X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZGl2X3VfdywgNjIxNDN9LCAvLyBfX2J1aWx0aW5fbXNhX2Rpdl91X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZG90cF9zX2QsIDYyMTg1fSwgLy8gX19idWlsdGluX21zYV9kb3RwX3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19kb3RwX3NfaCwgNjIyMDh9LCAvLyBfX2J1aWx0aW5fbXNhX2RvdHBfc19oCisgICAgICB7SW50cmluc2ljOjptaXBzX2RvdHBfc193LCA2MjIzMX0sIC8vIF9fYnVpbHRpbl9tc2FfZG90cF9zX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZG90cF91X2QsIDYyMjU0fSwgLy8gX19idWlsdGluX21zYV9kb3RwX3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19kb3RwX3VfaCwgNjIyNzd9LCAvLyBfX2J1aWx0aW5fbXNhX2RvdHBfdV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2RvdHBfdV93LCA2MjMwMH0sIC8vIF9fYnVpbHRpbl9tc2FfZG90cF91X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZHBhZGRfc19kLCA2MjM0N30sIC8vIF9fYnVpbHRpbl9tc2FfZHBhZGRfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX2RwYWRkX3NfaCwgNjIzNzF9LCAvLyBfX2J1aWx0aW5fbXNhX2RwYWRkX3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19kcGFkZF9zX3csIDYyMzk1fSwgLy8gX19idWlsdGluX21zYV9kcGFkZF9zX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZHBhZGRfdV9kLCA2MjQxOX0sIC8vIF9fYnVpbHRpbl9tc2FfZHBhZGRfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2RwYWRkX3VfaCwgNjI0NDN9LCAvLyBfX2J1aWx0aW5fbXNhX2RwYWRkX3VfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19kcGFkZF91X3csIDYyNDY3fSwgLy8gX19idWlsdGluX21zYV9kcGFkZF91X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZHBzdWJfc19kLCA2Mjg2Nn0sIC8vIF9fYnVpbHRpbl9tc2FfZHBzdWJfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX2Rwc3ViX3NfaCwgNjI4OTB9LCAvLyBfX2J1aWx0aW5fbXNhX2Rwc3ViX3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19kcHN1Yl9zX3csIDYyOTE0fSwgLy8gX19idWlsdGluX21zYV9kcHN1Yl9zX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZHBzdWJfdV9kLCA2MjkzOH0sIC8vIF9fYnVpbHRpbl9tc2FfZHBzdWJfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2Rwc3ViX3VfaCwgNjI5NjJ9LCAvLyBfX2J1aWx0aW5fbXNhX2Rwc3ViX3VfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19kcHN1Yl91X3csIDYyOTg2fSwgLy8gX19idWlsdGluX21zYV9kcHN1Yl91X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmFkZF9kLCA2MzE3Mn0sIC8vIF9fYnVpbHRpbl9tc2FfZmFkZF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZhZGRfdywgNjMxOTN9LCAvLyBfX2J1aWx0aW5fbXNhX2ZhZGRfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mY2FmX2QsIDYzMjE0fSwgLy8gX19idWlsdGluX21zYV9mY2FmX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmNhZl93LCA2MzIzNX0sIC8vIF9fYnVpbHRpbl9tc2FfZmNhZl93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZjZXFfZCwgNjMyNTZ9LCAvLyBfX2J1aWx0aW5fbXNhX2ZjZXFfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mY2VxX3csIDYzMjc3fSwgLy8gX19idWlsdGluX21zYV9mY2VxX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmNsYXNzX2QsIDYzMjk4fSwgLy8gX19idWlsdGluX21zYV9mY2xhc3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mY2xhc3NfdywgNjMzMjF9LCAvLyBfX2J1aWx0aW5fbXNhX2ZjbGFzc193CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZjbGVfZCwgNjMzNDR9LCAvLyBfX2J1aWx0aW5fbXNhX2ZjbGVfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mY2xlX3csIDYzMzY1fSwgLy8gX19idWlsdGluX21zYV9mY2xlX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmNsdF9kLCA2MzM4Nn0sIC8vIF9fYnVpbHRpbl9tc2FfZmNsdF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZjbHRfdywgNjM0MDd9LCAvLyBfX2J1aWx0aW5fbXNhX2ZjbHRfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mY25lX2QsIDYzNDI4fSwgLy8gX19idWlsdGluX21zYV9mY25lX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmNuZV93LCA2MzQ0OX0sIC8vIF9fYnVpbHRpbl9tc2FfZmNuZV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2Zjb3JfZCwgNjM0NzB9LCAvLyBfX2J1aWx0aW5fbXNhX2Zjb3JfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mY29yX3csIDYzNDkxfSwgLy8gX19idWlsdGluX21zYV9mY29yX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmN1ZXFfZCwgNjM1MTJ9LCAvLyBfX2J1aWx0aW5fbXNhX2ZjdWVxX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmN1ZXFfdywgNjM1MzR9LCAvLyBfX2J1aWx0aW5fbXNhX2ZjdWVxX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmN1bGVfZCwgNjM1NTZ9LCAvLyBfX2J1aWx0aW5fbXNhX2ZjdWxlX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmN1bGVfdywgNjM1Nzh9LCAvLyBfX2J1aWx0aW5fbXNhX2ZjdWxlX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmN1bHRfZCwgNjM2MDB9LCAvLyBfX2J1aWx0aW5fbXNhX2ZjdWx0X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmN1bHRfdywgNjM2MjJ9LCAvLyBfX2J1aWx0aW5fbXNhX2ZjdWx0X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmN1bl9kLCA2MzY0NH0sIC8vIF9fYnVpbHRpbl9tc2FfZmN1bl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZjdW5fdywgNjM2NjV9LCAvLyBfX2J1aWx0aW5fbXNhX2ZjdW5fdworICAgICAge0ludHJpbnNpYzo6bWlwc19mY3VuZV9kLCA2MzY4Nn0sIC8vIF9fYnVpbHRpbl9tc2FfZmN1bmVfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mY3VuZV93LCA2MzcwOH0sIC8vIF9fYnVpbHRpbl9tc2FfZmN1bmVfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mZGl2X2QsIDYzNzMwfSwgLy8gX19idWlsdGluX21zYV9mZGl2X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmRpdl93LCA2Mzc1MX0sIC8vIF9fYnVpbHRpbl9tc2FfZmRpdl93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZleGRvX2gsIDYzNzcyfSwgLy8gX19idWlsdGluX21zYV9mZXhkb19oCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZleGRvX3csIDYzNzk0fSwgLy8gX19idWlsdGluX21zYV9mZXhkb193CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZleHAyX2QsIDYzODE2fSwgLy8gX19idWlsdGluX21zYV9mZXhwMl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZleHAyX3csIDYzODM4fSwgLy8gX19idWlsdGluX21zYV9mZXhwMl93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZleHVwbF9kLCA2Mzg2MH0sIC8vIF9fYnVpbHRpbl9tc2FfZmV4dXBsX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmV4dXBsX3csIDYzODgzfSwgLy8gX19idWlsdGluX21zYV9mZXh1cGxfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mZXh1cHJfZCwgNjM5MDZ9LCAvLyBfX2J1aWx0aW5fbXNhX2ZleHVwcl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZleHVwcl93LCA2MzkyOX0sIC8vIF9fYnVpbHRpbl9tc2FfZmV4dXByX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmZpbnRfc19kLCA2Mzk1Mn0sIC8vIF9fYnVpbHRpbl9tc2FfZmZpbnRfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZmaW50X3NfdywgNjM5NzZ9LCAvLyBfX2J1aWx0aW5fbXNhX2ZmaW50X3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mZmludF91X2QsIDY0MDAwfSwgLy8gX19idWlsdGluX21zYV9mZmludF91X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmZpbnRfdV93LCA2NDAyNH0sIC8vIF9fYnVpbHRpbl9tc2FfZmZpbnRfdV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZmcWxfZCwgNjQwNDh9LCAvLyBfX2J1aWx0aW5fbXNhX2ZmcWxfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mZnFsX3csIDY0MDY5fSwgLy8gX19idWlsdGluX21zYV9mZnFsX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmZxcl9kLCA2NDA5MH0sIC8vIF9fYnVpbHRpbl9tc2FfZmZxcl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZmcXJfdywgNjQxMTF9LCAvLyBfX2J1aWx0aW5fbXNhX2ZmcXJfdworICAgICAge0ludHJpbnNpYzo6bWlwc19maWxsX2IsIDY0MTMyfSwgLy8gX19idWlsdGluX21zYV9maWxsX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmlsbF9kLCA2NDE1M30sIC8vIF9fYnVpbHRpbl9tc2FfZmlsbF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZpbGxfaCwgNjQxNzR9LCAvLyBfX2J1aWx0aW5fbXNhX2ZpbGxfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19maWxsX3csIDY0MTk1fSwgLy8gX19idWlsdGluX21zYV9maWxsX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmxvZzJfZCwgNjQyMTZ9LCAvLyBfX2J1aWx0aW5fbXNhX2Zsb2cyX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmxvZzJfdywgNjQyMzh9LCAvLyBfX2J1aWx0aW5fbXNhX2Zsb2cyX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZm1hZGRfZCwgNjQyNjB9LCAvLyBfX2J1aWx0aW5fbXNhX2ZtYWRkX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZm1hZGRfdywgNjQyODJ9LCAvLyBfX2J1aWx0aW5fbXNhX2ZtYWRkX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZm1heF9hX2QsIDY0MzA0fSwgLy8gX19idWlsdGluX21zYV9mbWF4X2FfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mbWF4X2FfdywgNjQzMjd9LCAvLyBfX2J1aWx0aW5fbXNhX2ZtYXhfYV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZtYXhfZCwgNjQzNTB9LCAvLyBfX2J1aWx0aW5fbXNhX2ZtYXhfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mbWF4X3csIDY0MzcxfSwgLy8gX19idWlsdGluX21zYV9mbWF4X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZm1pbl9hX2QsIDY0MzkyfSwgLy8gX19idWlsdGluX21zYV9mbWluX2FfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mbWluX2FfdywgNjQ0MTV9LCAvLyBfX2J1aWx0aW5fbXNhX2ZtaW5fYV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZtaW5fZCwgNjQ0Mzh9LCAvLyBfX2J1aWx0aW5fbXNhX2ZtaW5fZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mbWluX3csIDY0NDU5fSwgLy8gX19idWlsdGluX21zYV9mbWluX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZm1zdWJfZCwgNjQ0ODB9LCAvLyBfX2J1aWx0aW5fbXNhX2Ztc3ViX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZm1zdWJfdywgNjQ1MDJ9LCAvLyBfX2J1aWx0aW5fbXNhX2Ztc3ViX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZm11bF9kLCA2NDUyNH0sIC8vIF9fYnVpbHRpbl9tc2FfZm11bF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZtdWxfdywgNjQ1NDV9LCAvLyBfX2J1aWx0aW5fbXNhX2ZtdWxfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mcmNwX2QsIDY0NTY2fSwgLy8gX19idWlsdGluX21zYV9mcmNwX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnJjcF93LCA2NDU4N30sIC8vIF9fYnVpbHRpbl9tc2FfZnJjcF93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZyaW50X2QsIDY0NjA4fSwgLy8gX19idWlsdGluX21zYV9mcmludF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZyaW50X3csIDY0NjMwfSwgLy8gX19idWlsdGluX21zYV9mcmludF93CisgICAgICB7SW50cmluc2ljOjptaXBzX2Zyc3FydF9kLCA2NDY1Mn0sIC8vIF9fYnVpbHRpbl9tc2FfZnJzcXJ0X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnJzcXJ0X3csIDY0Njc1fSwgLy8gX19idWlsdGluX21zYV9mcnNxcnRfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mc2FmX2QsIDY0Njk4fSwgLy8gX19idWlsdGluX21zYV9mc2FmX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnNhZl93LCA2NDcxOX0sIC8vIF9fYnVpbHRpbl9tc2FfZnNhZl93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzZXFfZCwgNjQ3NDB9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzZXFfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mc2VxX3csIDY0NzYxfSwgLy8gX19idWlsdGluX21zYV9mc2VxX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnNsZV9kLCA2NDc4Mn0sIC8vIF9fYnVpbHRpbl9tc2FfZnNsZV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzbGVfdywgNjQ4MDN9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzbGVfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mc2x0X2QsIDY0ODI0fSwgLy8gX19idWlsdGluX21zYV9mc2x0X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnNsdF93LCA2NDg0NX0sIC8vIF9fYnVpbHRpbl9tc2FfZnNsdF93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzbmVfZCwgNjQ4NjZ9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzbmVfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mc25lX3csIDY0ODg3fSwgLy8gX19idWlsdGluX21zYV9mc25lX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnNvcl9kLCA2NDkwOH0sIC8vIF9fYnVpbHRpbl9tc2FfZnNvcl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2Zzb3JfdywgNjQ5Mjl9LCAvLyBfX2J1aWx0aW5fbXNhX2Zzb3JfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mc3FydF9kLCA2NDk1MH0sIC8vIF9fYnVpbHRpbl9tc2FfZnNxcnRfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mc3FydF93LCA2NDk3Mn0sIC8vIF9fYnVpbHRpbl9tc2FfZnNxcnRfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mc3ViX2QsIDY0OTk0fSwgLy8gX19idWlsdGluX21zYV9mc3ViX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnN1Yl93LCA2NTAxNX0sIC8vIF9fYnVpbHRpbl9tc2FfZnN1Yl93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzdWVxX2QsIDY1MDM2fSwgLy8gX19idWlsdGluX21zYV9mc3VlcV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzdWVxX3csIDY1MDU4fSwgLy8gX19idWlsdGluX21zYV9mc3VlcV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzdWxlX2QsIDY1MDgwfSwgLy8gX19idWlsdGluX21zYV9mc3VsZV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzdWxlX3csIDY1MTAyfSwgLy8gX19idWlsdGluX21zYV9mc3VsZV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzdWx0X2QsIDY1MTI0fSwgLy8gX19idWlsdGluX21zYV9mc3VsdF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzdWx0X3csIDY1MTQ2fSwgLy8gX19idWlsdGluX21zYV9mc3VsdF93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzdW5fZCwgNjUxNjh9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzdW5fZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mc3VuX3csIDY1MTg5fSwgLy8gX19idWlsdGluX21zYV9mc3VuX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnN1bmVfZCwgNjUyMTB9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzdW5lX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnN1bmVfdywgNjUyMzJ9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzdW5lX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnRpbnRfc19kLCA2NTI1NH0sIC8vIF9fYnVpbHRpbl9tc2FfZnRpbnRfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX2Z0aW50X3NfdywgNjUyNzh9LCAvLyBfX2J1aWx0aW5fbXNhX2Z0aW50X3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mdGludF91X2QsIDY1MzAyfSwgLy8gX19idWlsdGluX21zYV9mdGludF91X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnRpbnRfdV93LCA2NTMyNn0sIC8vIF9fYnVpbHRpbl9tc2FfZnRpbnRfdV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2Z0cV9oLCA2NTM1MH0sIC8vIF9fYnVpbHRpbl9tc2FfZnRxX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnRxX3csIDY1MzcwfSwgLy8gX19idWlsdGluX21zYV9mdHFfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mdHJ1bmNfc19kLCA2NTM5MH0sIC8vIF9fYnVpbHRpbl9tc2FfZnRydW5jX3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mdHJ1bmNfc193LCA2NTQxNX0sIC8vIF9fYnVpbHRpbl9tc2FfZnRydW5jX3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mdHJ1bmNfdV9kLCA2NTQ0MH0sIC8vIF9fYnVpbHRpbl9tc2FfZnRydW5jX3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mdHJ1bmNfdV93LCA2NTQ2NX0sIC8vIF9fYnVpbHRpbl9tc2FfZnRydW5jX3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19oYWRkX3NfZCwgNjU0OTB9LCAvLyBfX2J1aWx0aW5fbXNhX2hhZGRfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX2hhZGRfc19oLCA2NTUxM30sIC8vIF9fYnVpbHRpbl9tc2FfaGFkZF9zX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaGFkZF9zX3csIDY1NTM2fSwgLy8gX19idWlsdGluX21zYV9oYWRkX3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19oYWRkX3VfZCwgNjU1NTl9LCAvLyBfX2J1aWx0aW5fbXNhX2hhZGRfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2hhZGRfdV9oLCA2NTU4Mn0sIC8vIF9fYnVpbHRpbl9tc2FfaGFkZF91X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaGFkZF91X3csIDY1NjA1fSwgLy8gX19idWlsdGluX21zYV9oYWRkX3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19oc3ViX3NfZCwgNjU2Mjh9LCAvLyBfX2J1aWx0aW5fbXNhX2hzdWJfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX2hzdWJfc19oLCA2NTY1MX0sIC8vIF9fYnVpbHRpbl9tc2FfaHN1Yl9zX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaHN1Yl9zX3csIDY1Njc0fSwgLy8gX19idWlsdGluX21zYV9oc3ViX3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19oc3ViX3VfZCwgNjU2OTd9LCAvLyBfX2J1aWx0aW5fbXNhX2hzdWJfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2hzdWJfdV9oLCA2NTcyMH0sIC8vIF9fYnVpbHRpbl9tc2FfaHN1Yl91X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaHN1Yl91X3csIDY1NzQzfSwgLy8gX19idWlsdGluX21zYV9oc3ViX3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19pbHZldl9iLCA2NTc2Nn0sIC8vIF9fYnVpbHRpbl9tc2FfaWx2ZXZfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19pbHZldl9kLCA2NTc4OH0sIC8vIF9fYnVpbHRpbl9tc2FfaWx2ZXZfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19pbHZldl9oLCA2NTgxMH0sIC8vIF9fYnVpbHRpbl9tc2FfaWx2ZXZfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19pbHZldl93LCA2NTgzMn0sIC8vIF9fYnVpbHRpbl9tc2FfaWx2ZXZfdworICAgICAge0ludHJpbnNpYzo6bWlwc19pbHZsX2IsIDY1ODU0fSwgLy8gX19idWlsdGluX21zYV9pbHZsX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaWx2bF9kLCA2NTg3NX0sIC8vIF9fYnVpbHRpbl9tc2FfaWx2bF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2lsdmxfaCwgNjU4OTZ9LCAvLyBfX2J1aWx0aW5fbXNhX2lsdmxfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19pbHZsX3csIDY1OTE3fSwgLy8gX19idWlsdGluX21zYV9pbHZsX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaWx2b2RfYiwgNjU5Mzh9LCAvLyBfX2J1aWx0aW5fbXNhX2lsdm9kX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaWx2b2RfZCwgNjU5NjB9LCAvLyBfX2J1aWx0aW5fbXNhX2lsdm9kX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaWx2b2RfaCwgNjU5ODJ9LCAvLyBfX2J1aWx0aW5fbXNhX2lsdm9kX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaWx2b2RfdywgNjYwMDR9LCAvLyBfX2J1aWx0aW5fbXNhX2lsdm9kX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaWx2cl9iLCA2NjAyNn0sIC8vIF9fYnVpbHRpbl9tc2FfaWx2cl9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2lsdnJfZCwgNjYwNDd9LCAvLyBfX2J1aWx0aW5fbXNhX2lsdnJfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19pbHZyX2gsIDY2MDY4fSwgLy8gX19idWlsdGluX21zYV9pbHZyX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaWx2cl93LCA2NjA4OX0sIC8vIF9fYnVpbHRpbl9tc2FfaWx2cl93CisgICAgICB7SW50cmluc2ljOjptaXBzX2luc2VydF9iLCA2NjExMH0sIC8vIF9fYnVpbHRpbl9tc2FfaW5zZXJ0X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaW5zZXJ0X2QsIDY2MTMzfSwgLy8gX19idWlsdGluX21zYV9pbnNlcnRfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19pbnNlcnRfaCwgNjYxNTZ9LCAvLyBfX2J1aWx0aW5fbXNhX2luc2VydF9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2luc2VydF93LCA2NjE3OX0sIC8vIF9fYnVpbHRpbl9tc2FfaW5zZXJ0X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaW5zdmVfYiwgNjYyMjJ9LCAvLyBfX2J1aWx0aW5fbXNhX2luc3ZlX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaW5zdmVfZCwgNjYyNDR9LCAvLyBfX2J1aWx0aW5fbXNhX2luc3ZlX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaW5zdmVfaCwgNjYyNjZ9LCAvLyBfX2J1aWx0aW5fbXNhX2luc3ZlX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaW5zdmVfdywgNjYyODh9LCAvLyBfX2J1aWx0aW5fbXNhX2luc3ZlX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbGRfYiwgNjYzMzB9LCAvLyBfX2J1aWx0aW5fbXNhX2xkX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbGRfZCwgNjYzNDl9LCAvLyBfX2J1aWx0aW5fbXNhX2xkX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbGRfaCwgNjYzNjh9LCAvLyBfX2J1aWx0aW5fbXNhX2xkX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbGRfdywgNjYzODd9LCAvLyBfX2J1aWx0aW5fbXNhX2xkX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbGRpX2IsIDY2NDA2fSwgLy8gX19idWlsdGluX21zYV9sZGlfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19sZGlfZCwgNjY0MjZ9LCAvLyBfX2J1aWx0aW5fbXNhX2xkaV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2xkaV9oLCA2NjQ0Nn0sIC8vIF9fYnVpbHRpbl9tc2FfbGRpX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbGRpX3csIDY2NDY2fSwgLy8gX19idWlsdGluX21zYV9sZGlfdworICAgICAge0ludHJpbnNpYzo6bWlwc19tYWRkX3FfaCwgNjY1NjN9LCAvLyBfX2J1aWx0aW5fbXNhX21hZGRfcV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX21hZGRfcV93LCA2NjU4Nn0sIC8vIF9fYnVpbHRpbl9tc2FfbWFkZF9xX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWFkZHJfcV9oLCA2NjYwOX0sIC8vIF9fYnVpbHRpbl9tc2FfbWFkZHJfcV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX21hZGRyX3FfdywgNjY2MzN9LCAvLyBfX2J1aWx0aW5fbXNhX21hZGRyX3FfdworICAgICAge0ludHJpbnNpYzo6bWlwc19tYWRkdl9iLCA2NjY3OH0sIC8vIF9fYnVpbHRpbl9tc2FfbWFkZHZfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19tYWRkdl9kLCA2NjcwMH0sIC8vIF9fYnVpbHRpbl9tc2FfbWFkZHZfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19tYWRkdl9oLCA2NjcyMn0sIC8vIF9fYnVpbHRpbl9tc2FfbWFkZHZfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19tYWRkdl93LCA2Njc0NH0sIC8vIF9fYnVpbHRpbl9tc2FfbWFkZHZfdworICAgICAge0ludHJpbnNpYzo6bWlwc19tYXhfYV9iLCA2Njg3Nn0sIC8vIF9fYnVpbHRpbl9tc2FfbWF4X2FfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19tYXhfYV9kLCA2Njg5OH0sIC8vIF9fYnVpbHRpbl9tc2FfbWF4X2FfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19tYXhfYV9oLCA2NjkyMH0sIC8vIF9fYnVpbHRpbl9tc2FfbWF4X2FfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19tYXhfYV93LCA2Njk0Mn0sIC8vIF9fYnVpbHRpbl9tc2FfbWF4X2FfdworICAgICAge0ludHJpbnNpYzo6bWlwc19tYXhfc19iLCA2Njk2NH0sIC8vIF9fYnVpbHRpbl9tc2FfbWF4X3NfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19tYXhfc19kLCA2Njk4Nn0sIC8vIF9fYnVpbHRpbl9tc2FfbWF4X3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19tYXhfc19oLCA2NzAwOH0sIC8vIF9fYnVpbHRpbl9tc2FfbWF4X3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19tYXhfc193LCA2NzAzMH0sIC8vIF9fYnVpbHRpbl9tc2FfbWF4X3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19tYXhfdV9iLCA2NzA1Mn0sIC8vIF9fYnVpbHRpbl9tc2FfbWF4X3VfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19tYXhfdV9kLCA2NzA3NH0sIC8vIF9fYnVpbHRpbl9tc2FfbWF4X3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19tYXhfdV9oLCA2NzA5Nn0sIC8vIF9fYnVpbHRpbl9tc2FfbWF4X3VfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19tYXhfdV93LCA2NzExOH0sIC8vIF9fYnVpbHRpbl9tc2FfbWF4X3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19tYXhpX3NfYiwgNjcxNDB9LCAvLyBfX2J1aWx0aW5fbXNhX21heGlfc19iCisgICAgICB7SW50cmluc2ljOjptaXBzX21heGlfc19kLCA2NzE2M30sIC8vIF9fYnVpbHRpbl9tc2FfbWF4aV9zX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWF4aV9zX2gsIDY3MTg2fSwgLy8gX19idWlsdGluX21zYV9tYXhpX3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19tYXhpX3NfdywgNjcyMDl9LCAvLyBfX2J1aWx0aW5fbXNhX21heGlfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX21heGlfdV9iLCA2NzIzMn0sIC8vIF9fYnVpbHRpbl9tc2FfbWF4aV91X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWF4aV91X2QsIDY3MjU1fSwgLy8gX19idWlsdGluX21zYV9tYXhpX3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19tYXhpX3VfaCwgNjcyNzh9LCAvLyBfX2J1aWx0aW5fbXNhX21heGlfdV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX21heGlfdV93LCA2NzMwMX0sIC8vIF9fYnVpbHRpbl9tc2FfbWF4aV91X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWluX2FfYiwgNjczMjR9LCAvLyBfX2J1aWx0aW5fbXNhX21pbl9hX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWluX2FfZCwgNjczNDZ9LCAvLyBfX2J1aWx0aW5fbXNhX21pbl9hX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWluX2FfaCwgNjczNjh9LCAvLyBfX2J1aWx0aW5fbXNhX21pbl9hX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWluX2FfdywgNjczOTB9LCAvLyBfX2J1aWx0aW5fbXNhX21pbl9hX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWluX3NfYiwgNjc0MTJ9LCAvLyBfX2J1aWx0aW5fbXNhX21pbl9zX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWluX3NfZCwgNjc0MzR9LCAvLyBfX2J1aWx0aW5fbXNhX21pbl9zX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWluX3NfaCwgNjc0NTZ9LCAvLyBfX2J1aWx0aW5fbXNhX21pbl9zX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWluX3NfdywgNjc0Nzh9LCAvLyBfX2J1aWx0aW5fbXNhX21pbl9zX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWluX3VfYiwgNjc1MDB9LCAvLyBfX2J1aWx0aW5fbXNhX21pbl91X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWluX3VfZCwgNjc1MjJ9LCAvLyBfX2J1aWx0aW5fbXNhX21pbl91X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWluX3VfaCwgNjc1NDR9LCAvLyBfX2J1aWx0aW5fbXNhX21pbl91X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWluX3VfdywgNjc1NjZ9LCAvLyBfX2J1aWx0aW5fbXNhX21pbl91X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWluaV9zX2IsIDY3NTg4fSwgLy8gX19idWlsdGluX21zYV9taW5pX3NfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19taW5pX3NfZCwgNjc2MTF9LCAvLyBfX2J1aWx0aW5fbXNhX21pbmlfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX21pbmlfc19oLCA2NzYzNH0sIC8vIF9fYnVpbHRpbl9tc2FfbWluaV9zX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWluaV9zX3csIDY3NjU3fSwgLy8gX19idWlsdGluX21zYV9taW5pX3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19taW5pX3VfYiwgNjc2ODB9LCAvLyBfX2J1aWx0aW5fbXNhX21pbmlfdV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX21pbmlfdV9kLCA2NzcwM30sIC8vIF9fYnVpbHRpbl9tc2FfbWluaV91X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWluaV91X2gsIDY3NzI2fSwgLy8gX19idWlsdGluX21zYV9taW5pX3VfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19taW5pX3VfdywgNjc3NDl9LCAvLyBfX2J1aWx0aW5fbXNhX21pbmlfdV93CisgICAgICB7SW50cmluc2ljOjptaXBzX21vZF9zX2IsIDY3NzcyfSwgLy8gX19idWlsdGluX21zYV9tb2Rfc19iCisgICAgICB7SW50cmluc2ljOjptaXBzX21vZF9zX2QsIDY3Nzk0fSwgLy8gX19idWlsdGluX21zYV9tb2Rfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX21vZF9zX2gsIDY3ODE2fSwgLy8gX19idWlsdGluX21zYV9tb2Rfc19oCisgICAgICB7SW50cmluc2ljOjptaXBzX21vZF9zX3csIDY3ODM4fSwgLy8gX19idWlsdGluX21zYV9tb2Rfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX21vZF91X2IsIDY3ODYwfSwgLy8gX19idWlsdGluX21zYV9tb2RfdV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX21vZF91X2QsIDY3ODgyfSwgLy8gX19idWlsdGluX21zYV9tb2RfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX21vZF91X2gsIDY3OTA0fSwgLy8gX19idWlsdGluX21zYV9tb2RfdV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX21vZF91X3csIDY3OTI2fSwgLy8gX19idWlsdGluX21zYV9tb2RfdV93CisgICAgICB7SW50cmluc2ljOjptaXBzX21vdmVfdiwgNjc5NzB9LCAvLyBfX2J1aWx0aW5fbXNhX21vdmVfdgorICAgICAge0ludHJpbnNpYzo6bWlwc19tc3ViX3FfaCwgNjgwMTF9LCAvLyBfX2J1aWx0aW5fbXNhX21zdWJfcV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX21zdWJfcV93LCA2ODAzNH0sIC8vIF9fYnVpbHRpbl9tc2FfbXN1Yl9xX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXN1YnJfcV9oLCA2ODA1N30sIC8vIF9fYnVpbHRpbl9tc2FfbXN1YnJfcV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX21zdWJyX3FfdywgNjgwODF9LCAvLyBfX2J1aWx0aW5fbXNhX21zdWJyX3FfdworICAgICAge0ludHJpbnNpYzo6bWlwc19tc3Vidl9iLCA2ODEyNn0sIC8vIF9fYnVpbHRpbl9tc2FfbXN1YnZfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19tc3Vidl9kLCA2ODE0OH0sIC8vIF9fYnVpbHRpbl9tc2FfbXN1YnZfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19tc3Vidl9oLCA2ODE3MH0sIC8vIF9fYnVpbHRpbl9tc2FfbXN1YnZfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19tc3Vidl93LCA2ODE5Mn0sIC8vIF9fYnVpbHRpbl9tc2FfbXN1YnZfdworICAgICAge0ludHJpbnNpYzo6bWlwc19tdWxfcV9oLCA2ODI1OH0sIC8vIF9fYnVpbHRpbl9tc2FfbXVsX3FfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19tdWxfcV93LCA2ODI4MH0sIC8vIF9fYnVpbHRpbl9tc2FfbXVsX3FfdworICAgICAge0ludHJpbnNpYzo6bWlwc19tdWxyX3FfaCwgNjg1NDR9LCAvLyBfX2J1aWx0aW5fbXNhX211bHJfcV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX211bHJfcV93LCA2ODU2N30sIC8vIF9fYnVpbHRpbl9tc2FfbXVscl9xX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXVsdl9iLCA2ODY4Nn0sIC8vIF9fYnVpbHRpbl9tc2FfbXVsdl9iCisgICAgICB7SW50cmluc2ljOjptaXBzX211bHZfZCwgNjg3MDd9LCAvLyBfX2J1aWx0aW5fbXNhX211bHZfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19tdWx2X2gsIDY4NzI4fSwgLy8gX19idWlsdGluX21zYV9tdWx2X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXVsdl93LCA2ODc0OX0sIC8vIF9fYnVpbHRpbl9tc2FfbXVsdl93CisgICAgICB7SW50cmluc2ljOjptaXBzX25sb2NfYiwgNjg3NzB9LCAvLyBfX2J1aWx0aW5fbXNhX25sb2NfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19ubG9jX2QsIDY4NzkxfSwgLy8gX19idWlsdGluX21zYV9ubG9jX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbmxvY19oLCA2ODgxMn0sIC8vIF9fYnVpbHRpbl9tc2FfbmxvY19oCisgICAgICB7SW50cmluc2ljOjptaXBzX25sb2NfdywgNjg4MzN9LCAvLyBfX2J1aWx0aW5fbXNhX25sb2NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19ubHpjX2IsIDY4ODU0fSwgLy8gX19idWlsdGluX21zYV9ubHpjX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbmx6Y19kLCA2ODg3NX0sIC8vIF9fYnVpbHRpbl9tc2Ffbmx6Y19kCisgICAgICB7SW50cmluc2ljOjptaXBzX25semNfaCwgNjg4OTZ9LCAvLyBfX2J1aWx0aW5fbXNhX25semNfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19ubHpjX3csIDY4OTE3fSwgLy8gX19idWlsdGluX21zYV9ubHpjX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbm9yX3YsIDY4OTM4fSwgLy8gX19idWlsdGluX21zYV9ub3JfdgorICAgICAge0ludHJpbnNpYzo6bWlwc19ub3JpX2IsIDY4OTU4fSwgLy8gX19idWlsdGluX21zYV9ub3JpX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfb3JfdiwgNjg5Nzl9LCAvLyBfX2J1aWx0aW5fbXNhX29yX3YKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfb3JpX2IsIDY4OTk4fSwgLy8gX19idWlsdGluX21zYV9vcmlfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19wY2tldl9iLCA2OTA0M30sIC8vIF9fYnVpbHRpbl9tc2FfcGNrZXZfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19wY2tldl9kLCA2OTA2NX0sIC8vIF9fYnVpbHRpbl9tc2FfcGNrZXZfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19wY2tldl9oLCA2OTA4N30sIC8vIF9fYnVpbHRpbl9tc2FfcGNrZXZfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19wY2tldl93LCA2OTEwOX0sIC8vIF9fYnVpbHRpbl9tc2FfcGNrZXZfdworICAgICAge0ludHJpbnNpYzo6bWlwc19wY2tvZF9iLCA2OTEzMX0sIC8vIF9fYnVpbHRpbl9tc2FfcGNrb2RfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19wY2tvZF9kLCA2OTE1M30sIC8vIF9fYnVpbHRpbl9tc2FfcGNrb2RfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19wY2tvZF9oLCA2OTE3NX0sIC8vIF9fYnVpbHRpbl9tc2FfcGNrb2RfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19wY2tvZF93LCA2OTE5N30sIC8vIF9fYnVpbHRpbl9tc2FfcGNrb2RfdworICAgICAge0ludHJpbnNpYzo6bWlwc19wY250X2IsIDY5MjE5fSwgLy8gX19idWlsdGluX21zYV9wY250X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcGNudF9kLCA2OTI0MH0sIC8vIF9fYnVpbHRpbl9tc2FfcGNudF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3BjbnRfaCwgNjkyNjF9LCAvLyBfX2J1aWx0aW5fbXNhX3BjbnRfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19wY250X3csIDY5MjgyfSwgLy8gX19idWlsdGluX21zYV9wY250X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2F0X3NfYiwgNjk5NjZ9LCAvLyBfX2J1aWx0aW5fbXNhX3NhdF9zX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2F0X3NfZCwgNjk5ODh9LCAvLyBfX2J1aWx0aW5fbXNhX3NhdF9zX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2F0X3NfaCwgNzAwMTB9LCAvLyBfX2J1aWx0aW5fbXNhX3NhdF9zX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2F0X3NfdywgNzAwMzJ9LCAvLyBfX2J1aWx0aW5fbXNhX3NhdF9zX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2F0X3VfYiwgNzAwNTR9LCAvLyBfX2J1aWx0aW5fbXNhX3NhdF91X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2F0X3VfZCwgNzAwNzZ9LCAvLyBfX2J1aWx0aW5fbXNhX3NhdF91X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2F0X3VfaCwgNzAwOTh9LCAvLyBfX2J1aWx0aW5fbXNhX3NhdF91X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2F0X3VfdywgNzAxMjB9LCAvLyBfX2J1aWx0aW5fbXNhX3NhdF91X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2hmX2IsIDcwMTQyfSwgLy8gX19idWlsdGluX21zYV9zaGZfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zaGZfaCwgNzAxNjJ9LCAvLyBfX2J1aWx0aW5fbXNhX3NoZl9oCisgICAgICB7SW50cmluc2ljOjptaXBzX3NoZl93LCA3MDE4Mn0sIC8vIF9fYnVpbHRpbl9tc2Ffc2hmX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2xkX2IsIDcwNDg0fSwgLy8gX19idWlsdGluX21zYV9zbGRfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zbGRfZCwgNzA1MDR9LCAvLyBfX2J1aWx0aW5fbXNhX3NsZF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3NsZF9oLCA3MDUyNH0sIC8vIF9fYnVpbHRpbl9tc2Ffc2xkX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2xkX3csIDcwNTQ0fSwgLy8gX19idWlsdGluX21zYV9zbGRfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zbGRpX2IsIDcwNTY0fSwgLy8gX19idWlsdGluX21zYV9zbGRpX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2xkaV9kLCA3MDU4NX0sIC8vIF9fYnVpbHRpbl9tc2Ffc2xkaV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3NsZGlfaCwgNzA2MDZ9LCAvLyBfX2J1aWx0aW5fbXNhX3NsZGlfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zbGRpX3csIDcwNjI3fSwgLy8gX19idWlsdGluX21zYV9zbGRpX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2xsX2IsIDcwNjQ4fSwgLy8gX19idWlsdGluX21zYV9zbGxfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zbGxfZCwgNzA2Njh9LCAvLyBfX2J1aWx0aW5fbXNhX3NsbF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3NsbF9oLCA3MDY4OH0sIC8vIF9fYnVpbHRpbl9tc2Ffc2xsX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2xsX3csIDcwNzA4fSwgLy8gX19idWlsdGluX21zYV9zbGxfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zbGxpX2IsIDcwNzI4fSwgLy8gX19idWlsdGluX21zYV9zbGxpX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2xsaV9kLCA3MDc0OX0sIC8vIF9fYnVpbHRpbl9tc2Ffc2xsaV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3NsbGlfaCwgNzA3NzB9LCAvLyBfX2J1aWx0aW5fbXNhX3NsbGlfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zbGxpX3csIDcwNzkxfSwgLy8gX19idWlsdGluX21zYV9zbGxpX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3BsYXRfYiwgNzA4MTJ9LCAvLyBfX2J1aWx0aW5fbXNhX3NwbGF0X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3BsYXRfZCwgNzA4MzR9LCAvLyBfX2J1aWx0aW5fbXNhX3NwbGF0X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3BsYXRfaCwgNzA4NTZ9LCAvLyBfX2J1aWx0aW5fbXNhX3NwbGF0X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3BsYXRfdywgNzA4Nzh9LCAvLyBfX2J1aWx0aW5fbXNhX3NwbGF0X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3BsYXRpX2IsIDcwOTAwfSwgLy8gX19idWlsdGluX21zYV9zcGxhdGlfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zcGxhdGlfZCwgNzA5MjN9LCAvLyBfX2J1aWx0aW5fbXNhX3NwbGF0aV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3NwbGF0aV9oLCA3MDk0Nn0sIC8vIF9fYnVpbHRpbl9tc2Ffc3BsYXRpX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3BsYXRpX3csIDcwOTY5fSwgLy8gX19idWlsdGluX21zYV9zcGxhdGlfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zcmFfYiwgNzA5OTJ9LCAvLyBfX2J1aWx0aW5fbXNhX3NyYV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX3NyYV9kLCA3MTAxMn0sIC8vIF9fYnVpbHRpbl9tc2Ffc3JhX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JhX2gsIDcxMDMyfSwgLy8gX19idWlsdGluX21zYV9zcmFfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zcmFfdywgNzEwNTJ9LCAvLyBfX2J1aWx0aW5fbXNhX3NyYV93CisgICAgICB7SW50cmluc2ljOjptaXBzX3NyYWlfYiwgNzEwNzJ9LCAvLyBfX2J1aWx0aW5fbXNhX3NyYWlfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zcmFpX2QsIDcxMDkzfSwgLy8gX19idWlsdGluX21zYV9zcmFpX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JhaV9oLCA3MTExNH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3JhaV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX3NyYWlfdywgNzExMzV9LCAvLyBfX2J1aWx0aW5fbXNhX3NyYWlfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zcmFyX2IsIDcxMTU2fSwgLy8gX19idWlsdGluX21zYV9zcmFyX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3Jhcl9kLCA3MTE3N30sIC8vIF9fYnVpbHRpbl9tc2Ffc3Jhcl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3NyYXJfaCwgNzExOTh9LCAvLyBfX2J1aWx0aW5fbXNhX3NyYXJfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zcmFyX3csIDcxMjE5fSwgLy8gX19idWlsdGluX21zYV9zcmFyX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JhcmlfYiwgNzEyNDB9LCAvLyBfX2J1aWx0aW5fbXNhX3NyYXJpX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JhcmlfZCwgNzEyNjJ9LCAvLyBfX2J1aWx0aW5fbXNhX3NyYXJpX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JhcmlfaCwgNzEyODR9LCAvLyBfX2J1aWx0aW5fbXNhX3NyYXJpX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JhcmlfdywgNzEzMDZ9LCAvLyBfX2J1aWx0aW5fbXNhX3NyYXJpX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JsX2IsIDcxMzI4fSwgLy8gX19idWlsdGluX21zYV9zcmxfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zcmxfZCwgNzEzNDh9LCAvLyBfX2J1aWx0aW5fbXNhX3NybF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3NybF9oLCA3MTM2OH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3JsX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JsX3csIDcxMzg4fSwgLy8gX19idWlsdGluX21zYV9zcmxfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zcmxpX2IsIDcxNDA4fSwgLy8gX19idWlsdGluX21zYV9zcmxpX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JsaV9kLCA3MTQyOX0sIC8vIF9fYnVpbHRpbl9tc2Ffc3JsaV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3NybGlfaCwgNzE0NTB9LCAvLyBfX2J1aWx0aW5fbXNhX3NybGlfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zcmxpX3csIDcxNDcxfSwgLy8gX19idWlsdGluX21zYV9zcmxpX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3Jscl9iLCA3MTQ5Mn0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Jscl9iCisgICAgICB7SW50cmluc2ljOjptaXBzX3NybHJfZCwgNzE1MTN9LCAvLyBfX2J1aWx0aW5fbXNhX3NybHJfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19zcmxyX2gsIDcxNTM0fSwgLy8gX19idWlsdGluX21zYV9zcmxyX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3Jscl93LCA3MTU1NX0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Jscl93CisgICAgICB7SW50cmluc2ljOjptaXBzX3NybHJpX2IsIDcxNTc2fSwgLy8gX19idWlsdGluX21zYV9zcmxyaV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX3NybHJpX2QsIDcxNTk4fSwgLy8gX19idWlsdGluX21zYV9zcmxyaV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3NybHJpX2gsIDcxNjIwfSwgLy8gX19idWlsdGluX21zYV9zcmxyaV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX3NybHJpX3csIDcxNjQyfSwgLy8gX19idWlsdGluX21zYV9zcmxyaV93CisgICAgICB7SW50cmluc2ljOjptaXBzX3N0X2IsIDcxNjY0fSwgLy8gX19idWlsdGluX21zYV9zdF9iCisgICAgICB7SW50cmluc2ljOjptaXBzX3N0X2QsIDcxNjgzfSwgLy8gX19idWlsdGluX21zYV9zdF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3N0X2gsIDcxNzAyfSwgLy8gX19idWlsdGluX21zYV9zdF9oCisgICAgICB7SW50cmluc2ljOjptaXBzX3N0X3csIDcxNzIxfSwgLy8gX19idWlsdGluX21zYV9zdF93CisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnNfc19iLCA3MTkxMH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Vic19zX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3Vic19zX2QsIDcxOTMzfSwgLy8gX19idWlsdGluX21zYV9zdWJzX3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJzX3NfaCwgNzE5NTZ9LCAvLyBfX2J1aWx0aW5fbXNhX3N1YnNfc19oCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnNfc193LCA3MTk3OX0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Vic19zX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3Vic191X2IsIDcyMDAyfSwgLy8gX19idWlsdGluX21zYV9zdWJzX3VfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJzX3VfZCwgNzIwMjV9LCAvLyBfX2J1aWx0aW5fbXNhX3N1YnNfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnNfdV9oLCA3MjA0OH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Vic191X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3Vic191X3csIDcyMDcxfSwgLy8gX19idWlsdGluX21zYV9zdWJzX3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJzdXNfdV9iLCA3MjA5NH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Vic3VzX3VfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJzdXNfdV9kLCA3MjExOX0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Vic3VzX3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJzdXNfdV9oLCA3MjE0NH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Vic3VzX3VfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJzdXNfdV93LCA3MjE2OX0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Vic3VzX3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJzdXVfc19iLCA3MjE5NH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Vic3V1X3NfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJzdXVfc19kLCA3MjIxOX0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Vic3V1X3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJzdXVfc19oLCA3MjI0NH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Vic3V1X3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJzdXVfc193LCA3MjI2OX0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Vic3V1X3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJ2X2IsIDcyNDQwfSwgLy8gX19idWlsdGluX21zYV9zdWJ2X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3Vidl9kLCA3MjQ2MX0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Vidl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnZfaCwgNzI0ODJ9LCAvLyBfX2J1aWx0aW5fbXNhX3N1YnZfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJ2X3csIDcyNTAzfSwgLy8gX19idWlsdGluX21zYV9zdWJ2X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3VidmlfYiwgNzI1MjR9LCAvLyBfX2J1aWx0aW5fbXNhX3N1YnZpX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3VidmlfZCwgNzI1NDZ9LCAvLyBfX2J1aWx0aW5fbXNhX3N1YnZpX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3VidmlfaCwgNzI1Njh9LCAvLyBfX2J1aWx0aW5fbXNhX3N1YnZpX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3VidmlfdywgNzI1OTB9LCAvLyBfX2J1aWx0aW5fbXNhX3N1YnZpX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfdnNoZl9iLCA3MjYxMn0sIC8vIF9fYnVpbHRpbl9tc2FfdnNoZl9iCisgICAgICB7SW50cmluc2ljOjptaXBzX3ZzaGZfZCwgNzI2MzN9LCAvLyBfX2J1aWx0aW5fbXNhX3ZzaGZfZAorICAgICAge0ludHJpbnNpYzo6bWlwc192c2hmX2gsIDcyNjU0fSwgLy8gX19idWlsdGluX21zYV92c2hmX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfdnNoZl93LCA3MjY3NX0sIC8vIF9fYnVpbHRpbl9tc2FfdnNoZl93CisgICAgICB7SW50cmluc2ljOjptaXBzX3hvcl92LCA3MjcxN30sIC8vIF9fYnVpbHRpbl9tc2FfeG9yX3YKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfeG9yaV9iLCA3MjczN30sIC8vIF9fYnVpbHRpbl9tc2FfeG9yaV9iCisgICAgfTsKKyAgICBhdXRvIEkgPSBzdGQ6Omxvd2VyX2JvdW5kKHN0ZDo6YmVnaW4obWlwc05hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZW5kKG1pcHNOYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluTmFtZVN0cik7CisgICAgaWYgKEkgIT0gc3RkOjplbmQobWlwc05hbWVzKSAmJgorICAgICAgICBJLT5nZXROYW1lKCkgPT0gQnVpbHRpbk5hbWVTdHIpCisgICAgICByZXR1cm4gSS0+SW50cmluSUQ7CisgIH0KKyAgaWYgKFRhcmdldFByZWZpeCA9PSAibnZ2bSIpIHsKKyAgICBzdGF0aWMgY29uc3QgQnVpbHRpbkVudHJ5IG52dm1OYW1lc1tdID0geworICAgICAge0ludHJpbnNpYzo6bnZ2bV9hZGRfcm1fZCwgNzI3NTh9LCAvLyBfX252dm1fYWRkX3JtX2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYWRkX3JtX2YsIDcyNzc0fSwgLy8gX19udnZtX2FkZF9ybV9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2FkZF9ybV9mdHpfZiwgNzI3OTB9LCAvLyBfX252dm1fYWRkX3JtX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2FkZF9ybl9kLCA3MjgxMH0sIC8vIF9fbnZ2bV9hZGRfcm5fZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9hZGRfcm5fZiwgNzI4MjZ9LCAvLyBfX252dm1fYWRkX3JuX2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYWRkX3JuX2Z0el9mLCA3Mjg0Mn0sIC8vIF9fbnZ2bV9hZGRfcm5fZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYWRkX3JwX2QsIDcyODYyfSwgLy8gX19udnZtX2FkZF9ycF9kCisgICAgICB7SW50cmluc2ljOjpudnZtX2FkZF9ycF9mLCA3Mjg3OH0sIC8vIF9fbnZ2bV9hZGRfcnBfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9hZGRfcnBfZnR6X2YsIDcyODk0fSwgLy8gX19udnZtX2FkZF9ycF9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9hZGRfcnpfZCwgNzI5MTR9LCAvLyBfX252dm1fYWRkX3J6X2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYWRkX3J6X2YsIDcyOTMwfSwgLy8gX19udnZtX2FkZF9yel9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2FkZF9yel9mdHpfZiwgNzI5NDZ9LCAvLyBfX252dm1fYWRkX3J6X2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2JhcnJpZXIsIDczMDAzfSwgLy8gX19udnZtX2JhcgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9iYXJyaWVyMF9hbmQsIDczMDg1fSwgLy8gX19udnZtX2JhcjBfYW5kCisgICAgICB7SW50cmluc2ljOjpudnZtX2JhcnJpZXIwX29yLCA3MzEwMX0sIC8vIF9fbnZ2bV9iYXIwX29yCisgICAgICB7SW50cmluc2ljOjpudnZtX2JhcnJpZXIwX3BvcGMsIDczMTE2fSwgLy8gX19udnZtX2JhcjBfcG9wYworICAgICAge0ludHJpbnNpYzo6bnZ2bV9iYXJyaWVyX24sIDczMDE0fSwgLy8gX19udnZtX2Jhcl9uCisgICAgICB7SW50cmluc2ljOjpudnZtX2Jhcl9zeW5jLCA3Mjk2Nn0sIC8vIF9fbnZ2bV9iYXJfc3luYworICAgICAge0ludHJpbnNpYzo6bnZ2bV9iYXJfd2FycF9zeW5jLCA3Mjk4Mn0sIC8vIF9fbnZ2bV9iYXJfd2FycF9zeW5jCisgICAgICB7SW50cmluc2ljOjpudnZtX2JhcnJpZXJfc3luYywgNzMwMjd9LCAvLyBfX252dm1fYmFycmllcl9zeW5jCisgICAgICB7SW50cmluc2ljOjpudnZtX2JhcnJpZXJfc3luY19jbnQsIDczMDQ3fSwgLy8gX19udnZtX2JhcnJpZXJfc3luY19jbnQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYml0Y2FzdF9kMmxsLCA3MzEzM30sIC8vIF9fbnZ2bV9iaXRjYXN0X2QybGwKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYml0Y2FzdF9mMmksIDczMTUzfSwgLy8gX19udnZtX2JpdGNhc3RfZjJpCisgICAgICB7SW50cmluc2ljOjpudnZtX2JpdGNhc3RfaTJmLCA3MzE3Mn0sIC8vIF9fbnZ2bV9iaXRjYXN0X2kyZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9iaXRjYXN0X2xsMmQsIDczMTkxfSwgLy8gX19udnZtX2JpdGNhc3RfbGwyZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9jZWlsX2QsIDczMjExfSwgLy8gX19udnZtX2NlaWxfZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9jZWlsX2YsIDczMjI1fSwgLy8gX19udnZtX2NlaWxfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9jZWlsX2Z0el9mLCA3MzIzOX0sIC8vIF9fbnZ2bV9jZWlsX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2Nvc19hcHByb3hfZiwgNzMyNTd9LCAvLyBfX252dm1fY29zX2FwcHJveF9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2Nvc19hcHByb3hfZnR6X2YsIDczMjc3fSwgLy8gX19udnZtX2Nvc19hcHByb3hfZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZDJmX3JtLCA3MzMwMX0sIC8vIF9fbnZ2bV9kMmZfcm0KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZDJmX3JtX2Z0eiwgNzMzMTV9LCAvLyBfX252dm1fZDJmX3JtX2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMmZfcm4sIDczMzMzfSwgLy8gX19udnZtX2QyZl9ybgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMmZfcm5fZnR6LCA3MzM0N30sIC8vIF9fbnZ2bV9kMmZfcm5fZnR6CisgICAgICB7SW50cmluc2ljOjpudnZtX2QyZl9ycCwgNzMzNjV9LCAvLyBfX252dm1fZDJmX3JwCisgICAgICB7SW50cmluc2ljOjpudnZtX2QyZl9ycF9mdHosIDczMzc5fSwgLy8gX19udnZtX2QyZl9ycF9mdHoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZDJmX3J6LCA3MzM5N30sIC8vIF9fbnZ2bV9kMmZfcnoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZDJmX3J6X2Z0eiwgNzM0MTF9LCAvLyBfX252dm1fZDJmX3J6X2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMmlfaGksIDczNDI5fSwgLy8gX19udnZtX2QyaV9oaQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMmlfbG8sIDczNDQzfSwgLy8gX19udnZtX2QyaV9sbworICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMmlfcm0sIDczNDU3fSwgLy8gX19udnZtX2QyaV9ybQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMmlfcm4sIDczNDcxfSwgLy8gX19udnZtX2QyaV9ybgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMmlfcnAsIDczNDg1fSwgLy8gX19udnZtX2QyaV9ycAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMmlfcnosIDczNDk5fSwgLy8gX19udnZtX2QyaV9yegorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMmxsX3JtLCA3MzUxM30sIC8vIF9fbnZ2bV9kMmxsX3JtCisgICAgICB7SW50cmluc2ljOjpudnZtX2QybGxfcm4sIDczNTI4fSwgLy8gX19udnZtX2QybGxfcm4KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZDJsbF9ycCwgNzM1NDN9LCAvLyBfX252dm1fZDJsbF9ycAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMmxsX3J6LCA3MzU1OH0sIC8vIF9fbnZ2bV9kMmxsX3J6CisgICAgICB7SW50cmluc2ljOjpudnZtX2QydWlfcm0sIDczNTczfSwgLy8gX19udnZtX2QydWlfcm0KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZDJ1aV9ybiwgNzM1ODh9LCAvLyBfX252dm1fZDJ1aV9ybgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMnVpX3JwLCA3MzYwM30sIC8vIF9fbnZ2bV9kMnVpX3JwCisgICAgICB7SW50cmluc2ljOjpudnZtX2QydWlfcnosIDczNjE4fSwgLy8gX19udnZtX2QydWlfcnoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZDJ1bGxfcm0sIDczNjMzfSwgLy8gX19udnZtX2QydWxsX3JtCisgICAgICB7SW50cmluc2ljOjpudnZtX2QydWxsX3JuLCA3MzY0OX0sIC8vIF9fbnZ2bV9kMnVsbF9ybgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMnVsbF9ycCwgNzM2NjV9LCAvLyBfX252dm1fZDJ1bGxfcnAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZDJ1bGxfcnosIDczNjgxfSwgLy8gX19udnZtX2QydWxsX3J6CisgICAgICB7SW50cmluc2ljOjpudnZtX2Rpdl9hcHByb3hfZiwgNzM2OTd9LCAvLyBfX252dm1fZGl2X2FwcHJveF9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2Rpdl9hcHByb3hfZnR6X2YsIDczNzE3fSwgLy8gX19udnZtX2Rpdl9hcHByb3hfZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZGl2X3JtX2QsIDczNzQxfSwgLy8gX19udnZtX2Rpdl9ybV9kCisgICAgICB7SW50cmluc2ljOjpudnZtX2Rpdl9ybV9mLCA3Mzc1N30sIC8vIF9fbnZ2bV9kaXZfcm1fZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kaXZfcm1fZnR6X2YsIDczNzczfSwgLy8gX19udnZtX2Rpdl9ybV9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kaXZfcm5fZCwgNzM3OTN9LCAvLyBfX252dm1fZGl2X3JuX2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZGl2X3JuX2YsIDczODA5fSwgLy8gX19udnZtX2Rpdl9ybl9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2Rpdl9ybl9mdHpfZiwgNzM4MjV9LCAvLyBfX252dm1fZGl2X3JuX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2Rpdl9ycF9kLCA3Mzg0NX0sIC8vIF9fbnZ2bV9kaXZfcnBfZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kaXZfcnBfZiwgNzM4NjF9LCAvLyBfX252dm1fZGl2X3JwX2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZGl2X3JwX2Z0el9mLCA3Mzg3N30sIC8vIF9fbnZ2bV9kaXZfcnBfZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZGl2X3J6X2QsIDczODk3fSwgLy8gX19udnZtX2Rpdl9yel9kCisgICAgICB7SW50cmluc2ljOjpudnZtX2Rpdl9yel9mLCA3MzkxM30sIC8vIF9fbnZ2bV9kaXZfcnpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kaXZfcnpfZnR6X2YsIDczOTI5fSwgLy8gX19udnZtX2Rpdl9yel9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9leDJfYXBwcm94X2QsIDczOTQ5fSwgLy8gX19udnZtX2V4Ml9hcHByb3hfZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9leDJfYXBwcm94X2YsIDczOTY5fSwgLy8gX19udnZtX2V4Ml9hcHByb3hfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9leDJfYXBwcm94X2Z0el9mLCA3Mzk4OX0sIC8vIF9fbnZ2bV9leDJfYXBwcm94X2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2YyaF9ybiwgNzQwMTN9LCAvLyBfX252dm1fZjJoX3JuCisgICAgICB7SW50cmluc2ljOjpudnZtX2YyaF9ybl9mdHosIDc0MDI3fSwgLy8gX19udnZtX2YyaF9ybl9mdHoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJpX3JtLCA3NDA0NX0sIC8vIF9fbnZ2bV9mMmlfcm0KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJpX3JtX2Z0eiwgNzQwNTl9LCAvLyBfX252dm1fZjJpX3JtX2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMmlfcm4sIDc0MDc3fSwgLy8gX19udnZtX2YyaV9ybgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMmlfcm5fZnR6LCA3NDA5MX0sIC8vIF9fbnZ2bV9mMmlfcm5fZnR6CisgICAgICB7SW50cmluc2ljOjpudnZtX2YyaV9ycCwgNzQxMDl9LCAvLyBfX252dm1fZjJpX3JwCisgICAgICB7SW50cmluc2ljOjpudnZtX2YyaV9ycF9mdHosIDc0MTIzfSwgLy8gX19udnZtX2YyaV9ycF9mdHoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJpX3J6LCA3NDE0MX0sIC8vIF9fbnZ2bV9mMmlfcnoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJpX3J6X2Z0eiwgNzQxNTV9LCAvLyBfX252dm1fZjJpX3J6X2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMmxsX3JtLCA3NDE3M30sIC8vIF9fbnZ2bV9mMmxsX3JtCisgICAgICB7SW50cmluc2ljOjpudnZtX2YybGxfcm1fZnR6LCA3NDE4OH0sIC8vIF9fbnZ2bV9mMmxsX3JtX2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMmxsX3JuLCA3NDIwN30sIC8vIF9fbnZ2bV9mMmxsX3JuCisgICAgICB7SW50cmluc2ljOjpudnZtX2YybGxfcm5fZnR6LCA3NDIyMn0sIC8vIF9fbnZ2bV9mMmxsX3JuX2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMmxsX3JwLCA3NDI0MX0sIC8vIF9fbnZ2bV9mMmxsX3JwCisgICAgICB7SW50cmluc2ljOjpudnZtX2YybGxfcnBfZnR6LCA3NDI1Nn0sIC8vIF9fbnZ2bV9mMmxsX3JwX2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMmxsX3J6LCA3NDI3NX0sIC8vIF9fbnZ2bV9mMmxsX3J6CisgICAgICB7SW50cmluc2ljOjpudnZtX2YybGxfcnpfZnR6LCA3NDI5MH0sIC8vIF9fbnZ2bV9mMmxsX3J6X2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMnVpX3JtLCA3NDMwOX0sIC8vIF9fbnZ2bV9mMnVpX3JtCisgICAgICB7SW50cmluc2ljOjpudnZtX2YydWlfcm1fZnR6LCA3NDMyNH0sIC8vIF9fbnZ2bV9mMnVpX3JtX2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMnVpX3JuLCA3NDM0M30sIC8vIF9fbnZ2bV9mMnVpX3JuCisgICAgICB7SW50cmluc2ljOjpudnZtX2YydWlfcm5fZnR6LCA3NDM1OH0sIC8vIF9fbnZ2bV9mMnVpX3JuX2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMnVpX3JwLCA3NDM3N30sIC8vIF9fbnZ2bV9mMnVpX3JwCisgICAgICB7SW50cmluc2ljOjpudnZtX2YydWlfcnBfZnR6LCA3NDM5Mn0sIC8vIF9fbnZ2bV9mMnVpX3JwX2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMnVpX3J6LCA3NDQxMX0sIC8vIF9fbnZ2bV9mMnVpX3J6CisgICAgICB7SW50cmluc2ljOjpudnZtX2YydWlfcnpfZnR6LCA3NDQyNn0sIC8vIF9fbnZ2bV9mMnVpX3J6X2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMnVsbF9ybSwgNzQ0NDV9LCAvLyBfX252dm1fZjJ1bGxfcm0KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJ1bGxfcm1fZnR6LCA3NDQ2MX0sIC8vIF9fbnZ2bV9mMnVsbF9ybV9mdHoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJ1bGxfcm4sIDc0NDgxfSwgLy8gX19udnZtX2YydWxsX3JuCisgICAgICB7SW50cmluc2ljOjpudnZtX2YydWxsX3JuX2Z0eiwgNzQ0OTd9LCAvLyBfX252dm1fZjJ1bGxfcm5fZnR6CisgICAgICB7SW50cmluc2ljOjpudnZtX2YydWxsX3JwLCA3NDUxN30sIC8vIF9fbnZ2bV9mMnVsbF9ycAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMnVsbF9ycF9mdHosIDc0NTMzfSwgLy8gX19udnZtX2YydWxsX3JwX2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMnVsbF9yeiwgNzQ1NTN9LCAvLyBfX252dm1fZjJ1bGxfcnoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJ1bGxfcnpfZnR6LCA3NDU2OX0sIC8vIF9fbnZ2bV9mMnVsbF9yel9mdHoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZmFic19kLCA3NDU4OX0sIC8vIF9fbnZ2bV9mYWJzX2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZmFic19mLCA3NDYwM30sIC8vIF9fbnZ2bV9mYWJzX2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZmFic19mdHpfZiwgNzQ2MTd9LCAvLyBfX252dm1fZmFic19mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mbG9vcl9kLCA3NDYzNX0sIC8vIF9fbnZ2bV9mbG9vcl9kCisgICAgICB7SW50cmluc2ljOjpudnZtX2Zsb29yX2YsIDc0NjUwfSwgLy8gX19udnZtX2Zsb29yX2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZmxvb3JfZnR6X2YsIDc0NjY1fSwgLy8gX19udnZtX2Zsb29yX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2ZtYV9ybV9kLCA3NDY4NH0sIC8vIF9fbnZ2bV9mbWFfcm1fZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mbWFfcm1fZiwgNzQ3MDB9LCAvLyBfX252dm1fZm1hX3JtX2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZm1hX3JtX2Z0el9mLCA3NDcxNn0sIC8vIF9fbnZ2bV9mbWFfcm1fZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZm1hX3JuX2QsIDc0NzM2fSwgLy8gX19udnZtX2ZtYV9ybl9kCisgICAgICB7SW50cmluc2ljOjpudnZtX2ZtYV9ybl9mLCA3NDc1Mn0sIC8vIF9fbnZ2bV9mbWFfcm5fZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mbWFfcm5fZnR6X2YsIDc0NzY4fSwgLy8gX19udnZtX2ZtYV9ybl9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mbWFfcnBfZCwgNzQ3ODh9LCAvLyBfX252dm1fZm1hX3JwX2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZm1hX3JwX2YsIDc0ODA0fSwgLy8gX19udnZtX2ZtYV9ycF9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2ZtYV9ycF9mdHpfZiwgNzQ4MjB9LCAvLyBfX252dm1fZm1hX3JwX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2ZtYV9yel9kLCA3NDg0MH0sIC8vIF9fbnZ2bV9mbWFfcnpfZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mbWFfcnpfZiwgNzQ4NTZ9LCAvLyBfX252dm1fZm1hX3J6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZm1hX3J6X2Z0el9mLCA3NDg3Mn0sIC8vIF9fbnZ2bV9mbWFfcnpfZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZm1heF9kLCA3NDg5Mn0sIC8vIF9fbnZ2bV9mbWF4X2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZm1heF9mLCA3NDkwNn0sIC8vIF9fbnZ2bV9mbWF4X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZm1heF9mdHpfZiwgNzQ5MjB9LCAvLyBfX252dm1fZm1heF9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mbWluX2QsIDc0OTM4fSwgLy8gX19udnZtX2ZtaW5fZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mbWluX2YsIDc0OTUyfSwgLy8gX19udnZtX2ZtaW5fZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mbWluX2Z0el9mLCA3NDk2Nn0sIC8vIF9fbnZ2bV9mbWluX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2ZucywgNzQ5ODR9LCAvLyBfX252dm1fZm5zCisgICAgICB7SW50cmluc2ljOjpudnZtX2kyZF9ybSwgNzQ5OTV9LCAvLyBfX252dm1faTJkX3JtCisgICAgICB7SW50cmluc2ljOjpudnZtX2kyZF9ybiwgNzUwMDl9LCAvLyBfX252dm1faTJkX3JuCisgICAgICB7SW50cmluc2ljOjpudnZtX2kyZF9ycCwgNzUwMjN9LCAvLyBfX252dm1faTJkX3JwCisgICAgICB7SW50cmluc2ljOjpudnZtX2kyZF9yeiwgNzUwMzd9LCAvLyBfX252dm1faTJkX3J6CisgICAgICB7SW50cmluc2ljOjpudnZtX2kyZl9ybSwgNzUwNTF9LCAvLyBfX252dm1faTJmX3JtCisgICAgICB7SW50cmluc2ljOjpudnZtX2kyZl9ybiwgNzUwNjV9LCAvLyBfX252dm1faTJmX3JuCisgICAgICB7SW50cmluc2ljOjpudnZtX2kyZl9ycCwgNzUwNzl9LCAvLyBfX252dm1faTJmX3JwCisgICAgICB7SW50cmluc2ljOjpudnZtX2kyZl9yeiwgNzUwOTN9LCAvLyBfX252dm1faTJmX3J6CisgICAgICB7SW50cmluc2ljOjpudnZtX2lzc3BhY2VwX2NvbnN0LCA3NTEwN30sIC8vIF9fbnZ2bV9pc3NwYWNlcF9jb25zdAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9pc3NwYWNlcF9nbG9iYWwsIDc1MTI5fSwgLy8gX19udnZtX2lzc3BhY2VwX2dsb2JhbAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9pc3NwYWNlcF9sb2NhbCwgNzUxNTJ9LCAvLyBfX252dm1faXNzcGFjZXBfbG9jYWwKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1faXNzcGFjZXBfc2hhcmVkLCA3NTE3NH0sIC8vIF9fbnZ2bV9pc3NwYWNlcF9zaGFyZWQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1faXN0eXBlcF9zYW1wbGVyLCA3NTE5N30sIC8vIF9fbnZ2bV9pc3R5cGVwX3NhbXBsZXIKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1faXN0eXBlcF9zdXJmYWNlLCA3NTIyMH0sIC8vIF9fbnZ2bV9pc3R5cGVwX3N1cmZhY2UKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1faXN0eXBlcF90ZXh0dXJlLCA3NTI0M30sIC8vIF9fbnZ2bV9pc3R5cGVwX3RleHR1cmUKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbGcyX2FwcHJveF9kLCA3NTI2Nn0sIC8vIF9fbnZ2bV9sZzJfYXBwcm94X2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbGcyX2FwcHJveF9mLCA3NTI4Nn0sIC8vIF9fbnZ2bV9sZzJfYXBwcm94X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbGcyX2FwcHJveF9mdHpfZiwgNzUzMDZ9LCAvLyBfX252dm1fbGcyX2FwcHJveF9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9sbDJkX3JtLCA3NTMzMH0sIC8vIF9fbnZ2bV9sbDJkX3JtCisgICAgICB7SW50cmluc2ljOjpudnZtX2xsMmRfcm4sIDc1MzQ1fSwgLy8gX19udnZtX2xsMmRfcm4KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbGwyZF9ycCwgNzUzNjB9LCAvLyBfX252dm1fbGwyZF9ycAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9sbDJkX3J6LCA3NTM3NX0sIC8vIF9fbnZ2bV9sbDJkX3J6CisgICAgICB7SW50cmluc2ljOjpudnZtX2xsMmZfcm0sIDc1MzkwfSwgLy8gX19udnZtX2xsMmZfcm0KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbGwyZl9ybiwgNzU0MDV9LCAvLyBfX252dm1fbGwyZl9ybgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9sbDJmX3JwLCA3NTQyMH0sIC8vIF9fbnZ2bV9sbDJmX3JwCisgICAgICB7SW50cmluc2ljOjpudnZtX2xsMmZfcnosIDc1NDM1fSwgLy8gX19udnZtX2xsMmZfcnoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbG9oaV9pMmQsIDc1NDUwfSwgLy8gX19udnZtX2xvaGlfaTJkCisgICAgICB7SW50cmluc2ljOjpudnZtX21hdGNoX2FueV9zeW5jX2kzMiwgNzU0NjZ9LCAvLyBfX252dm1fbWF0Y2hfYW55X3N5bmNfaTMyCisgICAgICB7SW50cmluc2ljOjpudnZtX21hdGNoX2FueV9zeW5jX2k2NCwgNzU0OTJ9LCAvLyBfX252dm1fbWF0Y2hfYW55X3N5bmNfaTY0CisgICAgICB7SW50cmluc2ljOjpudnZtX21lbWJhcl9jdGEsIDc1NTE4fSwgLy8gX19udnZtX21lbWJhcl9jdGEKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbWVtYmFyX2dsLCA3NTUzNn0sIC8vIF9fbnZ2bV9tZW1iYXJfZ2wKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbWVtYmFyX3N5cywgNzU1NTN9LCAvLyBfX252dm1fbWVtYmFyX3N5cworICAgICAge0ludHJpbnNpYzo6bnZ2bV9tdWwyNF9pLCA3NTc3OX0sIC8vIF9fbnZ2bV9tdWwyNF9pCisgICAgICB7SW50cmluc2ljOjpudnZtX211bDI0X3VpLCA3NTc5NH0sIC8vIF9fbnZ2bV9tdWwyNF91aQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9tdWxfcm1fZCwgNzU1NzF9LCAvLyBfX252dm1fbXVsX3JtX2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbXVsX3JtX2YsIDc1NTg3fSwgLy8gX19udnZtX211bF9ybV9mCisgICAgICB7SW50cmluc2ljOjpudnZtX211bF9ybV9mdHpfZiwgNzU2MDN9LCAvLyBfX252dm1fbXVsX3JtX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX211bF9ybl9kLCA3NTYyM30sIC8vIF9fbnZ2bV9tdWxfcm5fZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9tdWxfcm5fZiwgNzU2Mzl9LCAvLyBfX252dm1fbXVsX3JuX2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbXVsX3JuX2Z0el9mLCA3NTY1NX0sIC8vIF9fbnZ2bV9tdWxfcm5fZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbXVsX3JwX2QsIDc1Njc1fSwgLy8gX19udnZtX211bF9ycF9kCisgICAgICB7SW50cmluc2ljOjpudnZtX211bF9ycF9mLCA3NTY5MX0sIC8vIF9fbnZ2bV9tdWxfcnBfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9tdWxfcnBfZnR6X2YsIDc1NzA3fSwgLy8gX19udnZtX211bF9ycF9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9tdWxfcnpfZCwgNzU3Mjd9LCAvLyBfX252dm1fbXVsX3J6X2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbXVsX3J6X2YsIDc1NzQzfSwgLy8gX19udnZtX211bF9yel9mCisgICAgICB7SW50cmluc2ljOjpudnZtX211bF9yel9mdHpfZiwgNzU3NTl9LCAvLyBfX252dm1fbXVsX3J6X2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX211bGhpX2ksIDc1ODEwfSwgLy8gX19udnZtX211bGhpX2kKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbXVsaGlfbGwsIDc1ODI1fSwgLy8gX19udnZtX211bGhpX2xsCisgICAgICB7SW50cmluc2ljOjpudnZtX211bGhpX3VpLCA3NTg0MX0sIC8vIF9fbnZ2bV9tdWxoaV91aQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9tdWxoaV91bGwsIDc1ODU3fSwgLy8gX19udnZtX211bGhpX3VsbAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9wcm10LCA3NTg3NH0sIC8vIF9fbnZ2bV9wcm10CisgICAgICB7SW50cmluc2ljOjpudnZtX3JjcF9hcHByb3hfZnR6X2QsIDc1ODg2fSwgLy8gX19udnZtX3JjcF9hcHByb3hfZnR6X2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmNwX3JtX2QsIDc1OTEwfSwgLy8gX19udnZtX3JjcF9ybV9kCisgICAgICB7SW50cmluc2ljOjpudnZtX3JjcF9ybV9mLCA3NTkyNn0sIC8vIF9fbnZ2bV9yY3Bfcm1fZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yY3Bfcm1fZnR6X2YsIDc1OTQyfSwgLy8gX19udnZtX3JjcF9ybV9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yY3Bfcm5fZCwgNzU5NjJ9LCAvLyBfX252dm1fcmNwX3JuX2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmNwX3JuX2YsIDc1OTc4fSwgLy8gX19udnZtX3JjcF9ybl9mCisgICAgICB7SW50cmluc2ljOjpudnZtX3JjcF9ybl9mdHpfZiwgNzU5OTR9LCAvLyBfX252dm1fcmNwX3JuX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX3JjcF9ycF9kLCA3NjAxNH0sIC8vIF9fbnZ2bV9yY3BfcnBfZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yY3BfcnBfZiwgNzYwMzB9LCAvLyBfX252dm1fcmNwX3JwX2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmNwX3JwX2Z0el9mLCA3NjA0Nn0sIC8vIF9fbnZ2bV9yY3BfcnBfZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmNwX3J6X2QsIDc2MDY2fSwgLy8gX19udnZtX3JjcF9yel9kCisgICAgICB7SW50cmluc2ljOjpudnZtX3JjcF9yel9mLCA3NjA4Mn0sIC8vIF9fbnZ2bV9yY3BfcnpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yY3BfcnpfZnR6X2YsIDc2MDk4fSwgLy8gX19udnZtX3JjcF9yel9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2Nsb2NrLCA3NjExOH0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2Nsb2NrCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfY2xvY2s2NCwgNzYxNDV9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19jbG9jazY0CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfY3RhaWRfdywgNzYxNzR9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19jdGFpZF93CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfY3RhaWRfeCwgNzYyMDN9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19jdGFpZF94CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfY3RhaWRfeSwgNzYyMzJ9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19jdGFpZF95CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfY3RhaWRfeiwgNzYyNjF9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19jdGFpZF96CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMCwgNzYyOTB9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcwCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMSwgNzYzMTl9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTAsIDc2MzQ4fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMSwgNzYzNzh9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzEyLCA3NjQwOH0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzEyCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTMsIDc2NDM4fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTMKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNCwgNzY0Njh9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzE1LCA3NjQ5OH0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzE1CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTYsIDc2NTI4fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTYKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNywgNzY1NTh9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNworICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzE4LCA3NjU4OH0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzE4CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTksIDc2NjE4fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTkKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyLCA3NjY0OH0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzIKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMCwgNzY2Nzd9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzIxLCA3NjcwN30sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzIxCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjIsIDc2NzM3fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjIKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMywgNzY3Njd9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMworICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI0LCA3Njc5N30sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI0CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjUsIDc2ODI3fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjUKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyNiwgNzY4NTd9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyNgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI3LCA3Njg4N30sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI3CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjgsIDc2OTE3fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjgKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyOSwgNzY5NDd9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyOQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzMsIDc2OTc3fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMworICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzMwLCA3NzAwNn0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzMwCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMzEsIDc3MDM2fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMzEKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc0LCA3NzA2Nn0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc1LCA3NzA5NX0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzUKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc2LCA3NzEyNH0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzYKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc3LCA3NzE1M30sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzcKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc4LCA3NzE4Mn0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzgKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc5LCA3NzIxMX0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzkKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19ncmlkaWQsIDc3MjQwfSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZ3JpZGlkCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfbGFuZWlkLCA3NzI2OH0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2xhbmVpZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2xhbmVtYXNrX2VxLCA3NzI5Nn0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2xhbmVtYXNrX2VxCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfbGFuZW1hc2tfZ2UsIDc3MzI5fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfbGFuZW1hc2tfZ2UKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19ndCwgNzczNjJ9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19ndAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2xhbmVtYXNrX2xlLCA3NzM5NX0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2xhbmVtYXNrX2xlCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfbGFuZW1hc2tfbHQsIDc3NDI4fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfbGFuZW1hc2tfbHQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19uY3RhaWRfdywgNzc0NjF9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19uY3RhaWRfdworICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX25jdGFpZF94LCA3NzQ5MX0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX25jdGFpZF94CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfbmN0YWlkX3ksIDc3NTIxfSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfbmN0YWlkX3kKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19uY3RhaWRfeiwgNzc1NTF9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19uY3RhaWRfegorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX25zbWlkLCA3NzU4MX0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX25zbWlkCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfbnRpZF93LCA3NzYwOH0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX250aWRfdworICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX250aWRfeCwgNzc2MzZ9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19udGlkX3gKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19udGlkX3ksIDc3NjY0fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfbnRpZF95CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfbnRpZF96LCA3NzY5Mn0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX250aWRfegorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX253YXJwaWQsIDc3NzIwfSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfbndhcnBpZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX3BtMCwgNzc3NDl9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19wbTAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19wbTEsIDc3Nzc0fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfcG0xCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfcG0yLCA3Nzc5OX0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX3BtMgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX3BtMywgNzc4MjR9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19wbTMKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19zbWlkLCA3Nzg0OX0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX3NtaWQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ190aWRfdywgNzc4NzV9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ190aWRfdworICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX3RpZF94LCA3NzkwMn0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX3RpZF94CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfdGlkX3ksIDc3OTI5fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfdGlkX3kKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ190aWRfeiwgNzc5NTZ9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ190aWRfegorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX3dhcnBpZCwgNzc5ODN9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ193YXJwaWQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ193YXJwc2l6ZSwgNzgwMTF9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ193YXJwc2l6ZQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yb3RhdGVfYjMyLCA3ODA0MX0sIC8vIF9fbnZ2bV9yb3RhdGVfYjMyCisgICAgICB7SW50cmluc2ljOjpudnZtX3JvdGF0ZV9iNjQsIDc4MDU5fSwgLy8gX19udnZtX3JvdGF0ZV9iNjQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcm90YXRlX3JpZ2h0X2I2NCwgNzgwNzd9LCAvLyBfX252dm1fcm90YXRlX3JpZ2h0X2I2NAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yb3VuZF9kLCA3ODEwMX0sIC8vIF9fbnZ2bV9yb3VuZF9kCisgICAgICB7SW50cmluc2ljOjpudnZtX3JvdW5kX2YsIDc4MTE2fSwgLy8gX19udnZtX3JvdW5kX2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcm91bmRfZnR6X2YsIDc4MTMxfSwgLy8gX19udnZtX3JvdW5kX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX3JzcXJ0X2FwcHJveF9kLCA3ODE1MH0sIC8vIF9fbnZ2bV9yc3FydF9hcHByb3hfZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yc3FydF9hcHByb3hfZiwgNzgxNzJ9LCAvLyBfX252dm1fcnNxcnRfYXBwcm94X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcnNxcnRfYXBwcm94X2Z0el9mLCA3ODE5NH0sIC8vIF9fbnZ2bV9yc3FydF9hcHByb3hfZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc2FkX2ksIDc4MjIwfSwgLy8gX19udnZtX3NhZF9pCisgICAgICB7SW50cmluc2ljOjpudnZtX3NhZF91aSwgNzgyMzN9LCAvLyBfX252dm1fc2FkX3VpCisgICAgICB7SW50cmluc2ljOjpudnZtX3NhdHVyYXRlX2QsIDc4MjQ3fSwgLy8gX19udnZtX3NhdHVyYXRlX2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc2F0dXJhdGVfZiwgNzgyNjV9LCAvLyBfX252dm1fc2F0dXJhdGVfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zYXR1cmF0ZV9mdHpfZiwgNzgyODN9LCAvLyBfX252dm1fc2F0dXJhdGVfZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc2hmbF9iZmx5X2YzMiwgNzgzMDV9LCAvLyBfX252dm1fc2hmbF9iZmx5X2YzMgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zaGZsX2JmbHlfaTMyLCA3ODMyNn0sIC8vIF9fbnZ2bV9zaGZsX2JmbHlfaTMyCisgICAgICB7SW50cmluc2ljOjpudnZtX3NoZmxfZG93bl9mMzIsIDc4MzQ3fSwgLy8gX19udnZtX3NoZmxfZG93bl9mMzIKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc2hmbF9kb3duX2kzMiwgNzgzNjh9LCAvLyBfX252dm1fc2hmbF9kb3duX2kzMgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zaGZsX2lkeF9mMzIsIDc4Mzg5fSwgLy8gX19udnZtX3NoZmxfaWR4X2YzMgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zaGZsX2lkeF9pMzIsIDc4NDA5fSwgLy8gX19udnZtX3NoZmxfaWR4X2kzMgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zaGZsX3N5bmNfYmZseV9mMzIsIDc4NDI5fSwgLy8gX19udnZtX3NoZmxfc3luY19iZmx5X2YzMgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zaGZsX3N5bmNfYmZseV9pMzIsIDc4NDU1fSwgLy8gX19udnZtX3NoZmxfc3luY19iZmx5X2kzMgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zaGZsX3N5bmNfZG93bl9mMzIsIDc4NDgxfSwgLy8gX19udnZtX3NoZmxfc3luY19kb3duX2YzMgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zaGZsX3N5bmNfZG93bl9pMzIsIDc4NTA3fSwgLy8gX19udnZtX3NoZmxfc3luY19kb3duX2kzMgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zaGZsX3N5bmNfaWR4X2YzMiwgNzg1MzN9LCAvLyBfX252dm1fc2hmbF9zeW5jX2lkeF9mMzIKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc2hmbF9zeW5jX2lkeF9pMzIsIDc4NTU4fSwgLy8gX19udnZtX3NoZmxfc3luY19pZHhfaTMyCisgICAgICB7SW50cmluc2ljOjpudnZtX3NoZmxfc3luY191cF9mMzIsIDc4NTgzfSwgLy8gX19udnZtX3NoZmxfc3luY191cF9mMzIKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc2hmbF9zeW5jX3VwX2kzMiwgNzg2MDd9LCAvLyBfX252dm1fc2hmbF9zeW5jX3VwX2kzMgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zaGZsX3VwX2YzMiwgNzg2MzF9LCAvLyBfX252dm1fc2hmbF91cF9mMzIKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc2hmbF91cF9pMzIsIDc4NjUwfSwgLy8gX19udnZtX3NoZmxfdXBfaTMyCisgICAgICB7SW50cmluc2ljOjpudnZtX3Npbl9hcHByb3hfZiwgNzg2Njl9LCAvLyBfX252dm1fc2luX2FwcHJveF9mCisgICAgICB7SW50cmluc2ljOjpudnZtX3Npbl9hcHByb3hfZnR6X2YsIDc4Njg5fSwgLy8gX19udnZtX3Npbl9hcHByb3hfZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3FydF9hcHByb3hfZiwgNzg3MTN9LCAvLyBfX252dm1fc3FydF9hcHByb3hfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zcXJ0X2FwcHJveF9mdHpfZiwgNzg3MzR9LCAvLyBfX252dm1fc3FydF9hcHByb3hfZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3FydF9mLCA3ODc1OX0sIC8vIF9fbnZ2bV9zcXJ0X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3FydF9ybV9kLCA3ODc3M30sIC8vIF9fbnZ2bV9zcXJ0X3JtX2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3FydF9ybV9mLCA3ODc5MH0sIC8vIF9fbnZ2bV9zcXJ0X3JtX2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3FydF9ybV9mdHpfZiwgNzg4MDd9LCAvLyBfX252dm1fc3FydF9ybV9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zcXJ0X3JuX2QsIDc4ODI4fSwgLy8gX19udnZtX3NxcnRfcm5fZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zcXJ0X3JuX2YsIDc4ODQ1fSwgLy8gX19udnZtX3NxcnRfcm5fZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zcXJ0X3JuX2Z0el9mLCA3ODg2Mn0sIC8vIF9fbnZ2bV9zcXJ0X3JuX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX3NxcnRfcnBfZCwgNzg4ODN9LCAvLyBfX252dm1fc3FydF9ycF9kCisgICAgICB7SW50cmluc2ljOjpudnZtX3NxcnRfcnBfZiwgNzg5MDB9LCAvLyBfX252dm1fc3FydF9ycF9mCisgICAgICB7SW50cmluc2ljOjpudnZtX3NxcnRfcnBfZnR6X2YsIDc4OTE3fSwgLy8gX19udnZtX3NxcnRfcnBfZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3FydF9yel9kLCA3ODkzOH0sIC8vIF9fbnZ2bV9zcXJ0X3J6X2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3FydF9yel9mLCA3ODk1NX0sIC8vIF9fbnZ2bV9zcXJ0X3J6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3FydF9yel9mdHpfZiwgNzg5NzJ9LCAvLyBfX252dm1fc3FydF9yel9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXFfYXJyYXlfc2l6ZSwgNzg5OTN9LCAvLyBfX252dm1fc3VxX2FycmF5X3NpemUKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VxX2NoYW5uZWxfZGF0YV90eXBlLCA3OTAxNX0sIC8vIF9fbnZ2bV9zdXFfY2hhbm5lbF9kYXRhX3R5cGUKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VxX2NoYW5uZWxfb3JkZXIsIDc5MDQ0fSwgLy8gX19udnZtX3N1cV9jaGFubmVsX29yZGVyCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1cV9kZXB0aCwgNzkwNjl9LCAvLyBfX252dm1fc3VxX2RlcHRoCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1cV9oZWlnaHQsIDc5MDg2fSwgLy8gX19udnZtX3N1cV9oZWlnaHQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VxX3dpZHRoLCA3OTEwNH0sIC8vIF9fbnZ2bV9zdXFfd2lkdGgKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X2kxNl9jbGFtcCwgNzkxMjF9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X2kxNl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTE2X3RyYXAsIDc5MTU0fSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV9pMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTE2X3plcm8sIDc5MTg2fSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV9pMTZfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTMyX2NsYW1wLCA3OTIxOH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTMyX2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV9pMzJfdHJhcCwgNzkyNTF9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X2kzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV9pMzJfemVybywgNzkyODN9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X2kzMl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV9pNjRfY2xhbXAsIDc5MzE1fSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV9pNjRfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X2k2NF90cmFwLCA3OTM0OH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTY0X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X2k2NF96ZXJvLCA3OTM4MH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTY0X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X2k4X2NsYW1wLCA3OTQxMn0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaThfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X2k4X3RyYXAsIDc5NDQ0fSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV9pOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV9pOF96ZXJvLCA3OTQ3NX0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaThfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpMTZfY2xhbXAsIDc5NTA2fSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV92MmkxNl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpMTZfdHJhcCwgNzk1NDF9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTE2X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X3YyaTE2X3plcm8sIDc5NTc1fSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV92MmkxNl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV92MmkzMl9jbGFtcCwgNzk2MDl9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTMyX2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV92MmkzMl90cmFwLCA3OTY0NH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpMzJfemVybywgNzk2Nzh9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTMyX3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X3YyaTY0X2NsYW1wLCA3OTcxMn0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpNjRfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X3YyaTY0X3RyYXAsIDc5NzQ3fSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV92Mmk2NF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV92Mmk2NF96ZXJvLCA3OTc4MX0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpNjRfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpOF9jbGFtcCwgNzk4MTV9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X3YyaThfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X3YyaThfdHJhcCwgNzk4NDl9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X3YyaThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpOF96ZXJvLCA3OTg4Mn0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpOF96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV92NGkxNl9jbGFtcCwgNzk5MTV9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X3Y0aTE2X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV92NGkxNl90cmFwLCA3OTk1MH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMTZfemVybywgNzk5ODR9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X3Y0aTE2X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X3Y0aTMyX2NsYW1wLCA4MDAxOH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMzJfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X3Y0aTMyX3RyYXAsIDgwMDUzfSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV92NGkzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV92NGkzMl96ZXJvLCA4MDA4N30sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMzJfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpOF9jbGFtcCwgODAxMjF9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X3Y0aThfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X3Y0aThfdHJhcCwgODAxNTV9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X3Y0aThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpOF96ZXJvLCA4MDE4OH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpOF96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9pMTZfY2xhbXAsIDgwMjIxfSwgLy8gX19udnZtX3N1c3RfYl8xZF9pMTZfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2kxNl90cmFwLCA4MDI0OH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfaTE2X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2kxNl96ZXJvLCA4MDI3NH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfaTE2X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2kzMl9jbGFtcCwgODAzMDB9LCAvLyBfX252dm1fc3VzdF9iXzFkX2kzMl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfaTMyX3RyYXAsIDgwMzI3fSwgLy8gX19udnZtX3N1c3RfYl8xZF9pMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfaTMyX3plcm8sIDgwMzUzfSwgLy8gX19udnZtX3N1c3RfYl8xZF9pMzJfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfaTY0X2NsYW1wLCA4MDM3OX0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfaTY0X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9pNjRfdHJhcCwgODA0MDZ9LCAvLyBfX252dm1fc3VzdF9iXzFkX2k2NF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9pNjRfemVybywgODA0MzJ9LCAvLyBfX252dm1fc3VzdF9iXzFkX2k2NF96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9pOF9jbGFtcCwgODA0NTh9LCAvLyBfX252dm1fc3VzdF9iXzFkX2k4X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9pOF90cmFwLCA4MDQ4NH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfaThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfaThfemVybywgODA1MDl9LCAvLyBfX252dm1fc3VzdF9iXzFkX2k4X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX3YyaTE2X2NsYW1wLCA4MDUzNH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfdjJpMTZfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX3YyaTE2X3RyYXAsIDgwNTYzfSwgLy8gX19udnZtX3N1c3RfYl8xZF92MmkxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF92MmkxNl96ZXJvLCA4MDU5MX0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfdjJpMTZfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfdjJpMzJfY2xhbXAsIDgwNjE5fSwgLy8gX19udnZtX3N1c3RfYl8xZF92MmkzMl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfdjJpMzJfdHJhcCwgODA2NDh9LCAvLyBfX252dm1fc3VzdF9iXzFkX3YyaTMyX3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX3YyaTMyX3plcm8sIDgwNjc2fSwgLy8gX19udnZtX3N1c3RfYl8xZF92MmkzMl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF92Mmk2NF9jbGFtcCwgODA3MDR9LCAvLyBfX252dm1fc3VzdF9iXzFkX3YyaTY0X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF92Mmk2NF90cmFwLCA4MDczM30sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfdjJpNjRfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfdjJpNjRfemVybywgODA3NjF9LCAvLyBfX252dm1fc3VzdF9iXzFkX3YyaTY0X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX3YyaThfY2xhbXAsIDgwNzg5fSwgLy8gX19udnZtX3N1c3RfYl8xZF92Mmk4X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF92Mmk4X3RyYXAsIDgwODE3fSwgLy8gX19udnZtX3N1c3RfYl8xZF92Mmk4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX3YyaThfemVybywgODA4NDR9LCAvLyBfX252dm1fc3VzdF9iXzFkX3YyaThfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfdjRpMTZfY2xhbXAsIDgwODcxfSwgLy8gX19udnZtX3N1c3RfYl8xZF92NGkxNl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfdjRpMTZfdHJhcCwgODA5MDB9LCAvLyBfX252dm1fc3VzdF9iXzFkX3Y0aTE2X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX3Y0aTE2X3plcm8sIDgwOTI4fSwgLy8gX19udnZtX3N1c3RfYl8xZF92NGkxNl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF92NGkzMl9jbGFtcCwgODA5NTZ9LCAvLyBfX252dm1fc3VzdF9iXzFkX3Y0aTMyX2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF92NGkzMl90cmFwLCA4MDk4NX0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfdjRpMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfdjRpMzJfemVybywgODEwMTN9LCAvLyBfX252dm1fc3VzdF9iXzFkX3Y0aTMyX3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX3Y0aThfY2xhbXAsIDgxMDQxfSwgLy8gX19udnZtX3N1c3RfYl8xZF92NGk4X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF92NGk4X3RyYXAsIDgxMDY5fSwgLy8gX19udnZtX3N1c3RfYl8xZF92NGk4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX3Y0aThfemVybywgODEwOTZ9LCAvLyBfX252dm1fc3VzdF9iXzFkX3Y0aThfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTE2X2NsYW1wLCA4MTEyM30sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTE2X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV9pMTZfdHJhcCwgODExNTZ9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X2kxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV9pMTZfemVybywgODExODh9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X2kxNl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV9pMzJfY2xhbXAsIDgxMjIwfSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV9pMzJfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X2kzMl90cmFwLCA4MTI1M30sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTMyX3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X2kzMl96ZXJvLCA4MTI4NX0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTMyX3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X2k2NF9jbGFtcCwgODEzMTd9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X2k2NF9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTY0X3RyYXAsIDgxMzUwfSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV9pNjRfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTY0X3plcm8sIDgxMzgyfSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV9pNjRfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfaThfY2xhbXAsIDgxNDE0fSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV9pOF9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfaThfdHJhcCwgODE0NDZ9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X2k4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X2k4X3plcm8sIDgxNDc3fSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV9pOF96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV92MmkxNl9jbGFtcCwgODE1MDh9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTE2X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV92MmkxNl90cmFwLCA4MTU0M30sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMTZfemVybywgODE1Nzd9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTE2X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X3YyaTMyX2NsYW1wLCA4MTYxMX0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMzJfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X3YyaTMyX3RyYXAsIDgxNjQ2fSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV92MmkzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV92MmkzMl96ZXJvLCA4MTY4MH0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMzJfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpNjRfY2xhbXAsIDgxNzE0fSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV92Mmk2NF9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpNjRfdHJhcCwgODE3NDl9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTY0X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X3YyaTY0X3plcm8sIDgxNzgzfSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV92Mmk2NF96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV92Mmk4X2NsYW1wLCA4MTgxN30sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpOF9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpOF90cmFwLCA4MTg1MX0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV92Mmk4X3plcm8sIDgxODg0fSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV92Mmk4X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTE2X2NsYW1wLCA4MTkxN30sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpMTZfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTE2X3RyYXAsIDgxOTUyfSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV92NGkxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV92NGkxNl96ZXJvLCA4MTk4Nn0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpMTZfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpMzJfY2xhbXAsIDgyMDIwfSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV92NGkzMl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpMzJfdHJhcCwgODIwNTV9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTMyX3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTMyX3plcm8sIDgyMDg5fSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV92NGkzMl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV92NGk4X2NsYW1wLCA4MjEyM30sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpOF9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpOF90cmFwLCA4MjE1N30sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV92NGk4X3plcm8sIDgyMTkwfSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV92NGk4X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2kxNl9jbGFtcCwgODIyMjN9LCAvLyBfX252dm1fc3VzdF9iXzJkX2kxNl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfaTE2X3RyYXAsIDgyMjUwfSwgLy8gX19udnZtX3N1c3RfYl8yZF9pMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfaTE2X3plcm8sIDgyMjc2fSwgLy8gX19udnZtX3N1c3RfYl8yZF9pMTZfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfaTMyX2NsYW1wLCA4MjMwMn0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfaTMyX2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9pMzJfdHJhcCwgODIzMjl9LCAvLyBfX252dm1fc3VzdF9iXzJkX2kzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9pMzJfemVybywgODIzNTV9LCAvLyBfX252dm1fc3VzdF9iXzJkX2kzMl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9pNjRfY2xhbXAsIDgyMzgxfSwgLy8gX19udnZtX3N1c3RfYl8yZF9pNjRfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2k2NF90cmFwLCA4MjQwOH0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfaTY0X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2k2NF96ZXJvLCA4MjQzNH0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfaTY0X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2k4X2NsYW1wLCA4MjQ2MH0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfaThfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2k4X3RyYXAsIDgyNDg2fSwgLy8gX19udnZtX3N1c3RfYl8yZF9pOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9pOF96ZXJvLCA4MjUxMX0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfaThfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfdjJpMTZfY2xhbXAsIDgyNTM2fSwgLy8gX19udnZtX3N1c3RfYl8yZF92MmkxNl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfdjJpMTZfdHJhcCwgODI1NjV9LCAvLyBfX252dm1fc3VzdF9iXzJkX3YyaTE2X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX3YyaTE2X3plcm8sIDgyNTkzfSwgLy8gX19udnZtX3N1c3RfYl8yZF92MmkxNl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF92MmkzMl9jbGFtcCwgODI2MjF9LCAvLyBfX252dm1fc3VzdF9iXzJkX3YyaTMyX2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF92MmkzMl90cmFwLCA4MjY1MH0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfdjJpMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfdjJpMzJfemVybywgODI2Nzh9LCAvLyBfX252dm1fc3VzdF9iXzJkX3YyaTMyX3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX3YyaTY0X2NsYW1wLCA4MjcwNn0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfdjJpNjRfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX3YyaTY0X3RyYXAsIDgyNzM1fSwgLy8gX19udnZtX3N1c3RfYl8yZF92Mmk2NF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF92Mmk2NF96ZXJvLCA4Mjc2M30sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfdjJpNjRfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfdjJpOF9jbGFtcCwgODI3OTF9LCAvLyBfX252dm1fc3VzdF9iXzJkX3YyaThfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX3YyaThfdHJhcCwgODI4MTl9LCAvLyBfX252dm1fc3VzdF9iXzJkX3YyaThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfdjJpOF96ZXJvLCA4Mjg0Nn0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfdjJpOF96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF92NGkxNl9jbGFtcCwgODI4NzN9LCAvLyBfX252dm1fc3VzdF9iXzJkX3Y0aTE2X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF92NGkxNl90cmFwLCA4MjkwMn0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfdjRpMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfdjRpMTZfemVybywgODI5MzB9LCAvLyBfX252dm1fc3VzdF9iXzJkX3Y0aTE2X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX3Y0aTMyX2NsYW1wLCA4Mjk1OH0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfdjRpMzJfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX3Y0aTMyX3RyYXAsIDgyOTg3fSwgLy8gX19udnZtX3N1c3RfYl8yZF92NGkzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF92NGkzMl96ZXJvLCA4MzAxNX0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfdjRpMzJfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfdjRpOF9jbGFtcCwgODMwNDN9LCAvLyBfX252dm1fc3VzdF9iXzJkX3Y0aThfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX3Y0aThfdHJhcCwgODMwNzF9LCAvLyBfX252dm1fc3VzdF9iXzJkX3Y0aThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfdjRpOF96ZXJvLCA4MzA5OH0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfdjRpOF96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF9pMTZfY2xhbXAsIDgzMTI1fSwgLy8gX19udnZtX3N1c3RfYl8zZF9pMTZfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX2kxNl90cmFwLCA4MzE1Mn0sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfaTE2X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX2kxNl96ZXJvLCA4MzE3OH0sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfaTE2X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX2kzMl9jbGFtcCwgODMyMDR9LCAvLyBfX252dm1fc3VzdF9iXzNkX2kzMl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfaTMyX3RyYXAsIDgzMjMxfSwgLy8gX19udnZtX3N1c3RfYl8zZF9pMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfaTMyX3plcm8sIDgzMjU3fSwgLy8gX19udnZtX3N1c3RfYl8zZF9pMzJfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfaTY0X2NsYW1wLCA4MzI4M30sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfaTY0X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF9pNjRfdHJhcCwgODMzMTB9LCAvLyBfX252dm1fc3VzdF9iXzNkX2k2NF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF9pNjRfemVybywgODMzMzZ9LCAvLyBfX252dm1fc3VzdF9iXzNkX2k2NF96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF9pOF9jbGFtcCwgODMzNjJ9LCAvLyBfX252dm1fc3VzdF9iXzNkX2k4X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF9pOF90cmFwLCA4MzM4OH0sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfaThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfaThfemVybywgODM0MTN9LCAvLyBfX252dm1fc3VzdF9iXzNkX2k4X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX3YyaTE2X2NsYW1wLCA4MzQzOH0sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfdjJpMTZfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX3YyaTE2X3RyYXAsIDgzNDY3fSwgLy8gX19udnZtX3N1c3RfYl8zZF92MmkxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF92MmkxNl96ZXJvLCA4MzQ5NX0sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfdjJpMTZfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfdjJpMzJfY2xhbXAsIDgzNTIzfSwgLy8gX19udnZtX3N1c3RfYl8zZF92MmkzMl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfdjJpMzJfdHJhcCwgODM1NTJ9LCAvLyBfX252dm1fc3VzdF9iXzNkX3YyaTMyX3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX3YyaTMyX3plcm8sIDgzNTgwfSwgLy8gX19udnZtX3N1c3RfYl8zZF92MmkzMl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF92Mmk2NF9jbGFtcCwgODM2MDh9LCAvLyBfX252dm1fc3VzdF9iXzNkX3YyaTY0X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF92Mmk2NF90cmFwLCA4MzYzN30sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfdjJpNjRfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfdjJpNjRfemVybywgODM2NjV9LCAvLyBfX252dm1fc3VzdF9iXzNkX3YyaTY0X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX3YyaThfY2xhbXAsIDgzNjkzfSwgLy8gX19udnZtX3N1c3RfYl8zZF92Mmk4X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF92Mmk4X3RyYXAsIDgzNzIxfSwgLy8gX19udnZtX3N1c3RfYl8zZF92Mmk4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX3YyaThfemVybywgODM3NDh9LCAvLyBfX252dm1fc3VzdF9iXzNkX3YyaThfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfdjRpMTZfY2xhbXAsIDgzNzc1fSwgLy8gX19udnZtX3N1c3RfYl8zZF92NGkxNl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfdjRpMTZfdHJhcCwgODM4MDR9LCAvLyBfX252dm1fc3VzdF9iXzNkX3Y0aTE2X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX3Y0aTE2X3plcm8sIDgzODMyfSwgLy8gX19udnZtX3N1c3RfYl8zZF92NGkxNl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF92NGkzMl9jbGFtcCwgODM4NjB9LCAvLyBfX252dm1fc3VzdF9iXzNkX3Y0aTMyX2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF92NGkzMl90cmFwLCA4Mzg4OX0sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfdjRpMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfdjRpMzJfemVybywgODM5MTd9LCAvLyBfX252dm1fc3VzdF9iXzNkX3Y0aTMyX3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX3Y0aThfY2xhbXAsIDgzOTQ1fSwgLy8gX19udnZtX3N1c3RfYl8zZF92NGk4X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF92NGk4X3RyYXAsIDgzOTczfSwgLy8gX19udnZtX3N1c3RfYl8zZF92NGk4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX3Y0aThfemVybywgODQwMDB9LCAvLyBfX252dm1fc3VzdF9iXzNkX3Y0aThfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMWRfYXJyYXlfaTE2X3RyYXAsIDg0MDI3fSwgLy8gX19udnZtX3N1c3RfcF8xZF9hcnJheV9pMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMWRfYXJyYXlfaTMyX3RyYXAsIDg0MDU5fSwgLy8gX19udnZtX3N1c3RfcF8xZF9hcnJheV9pMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMWRfYXJyYXlfaThfdHJhcCwgODQwOTF9LCAvLyBfX252dm1fc3VzdF9wXzFkX2FycmF5X2k4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzFkX2FycmF5X3YyaTE2X3RyYXAsIDg0MTIyfSwgLy8gX19udnZtX3N1c3RfcF8xZF9hcnJheV92MmkxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8xZF9hcnJheV92MmkzMl90cmFwLCA4NDE1Nn0sIC8vIF9fbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjJpMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjJpOF90cmFwLCA4NDE5MH0sIC8vIF9fbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjJpOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8xZF9hcnJheV92NGkxNl90cmFwLCA4NDIyM30sIC8vIF9fbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjRpMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjRpMzJfdHJhcCwgODQyNTd9LCAvLyBfX252dm1fc3VzdF9wXzFkX2FycmF5X3Y0aTMyX3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzFkX2FycmF5X3Y0aThfdHJhcCwgODQyOTF9LCAvLyBfX252dm1fc3VzdF9wXzFkX2FycmF5X3Y0aThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMWRfaTE2X3RyYXAsIDg0MzI0fSwgLy8gX19udnZtX3N1c3RfcF8xZF9pMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMWRfaTMyX3RyYXAsIDg0MzUwfSwgLy8gX19udnZtX3N1c3RfcF8xZF9pMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMWRfaThfdHJhcCwgODQzNzZ9LCAvLyBfX252dm1fc3VzdF9wXzFkX2k4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzFkX3YyaTE2X3RyYXAsIDg0NDAxfSwgLy8gX19udnZtX3N1c3RfcF8xZF92MmkxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8xZF92MmkzMl90cmFwLCA4NDQyOX0sIC8vIF9fbnZ2bV9zdXN0X3BfMWRfdjJpMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMWRfdjJpOF90cmFwLCA4NDQ1N30sIC8vIF9fbnZ2bV9zdXN0X3BfMWRfdjJpOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8xZF92NGkxNl90cmFwLCA4NDQ4NH0sIC8vIF9fbnZ2bV9zdXN0X3BfMWRfdjRpMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMWRfdjRpMzJfdHJhcCwgODQ1MTJ9LCAvLyBfX252dm1fc3VzdF9wXzFkX3Y0aTMyX3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzFkX3Y0aThfdHJhcCwgODQ1NDB9LCAvLyBfX252dm1fc3VzdF9wXzFkX3Y0aThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMmRfYXJyYXlfaTE2X3RyYXAsIDg0NTY3fSwgLy8gX19udnZtX3N1c3RfcF8yZF9hcnJheV9pMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMmRfYXJyYXlfaTMyX3RyYXAsIDg0NTk5fSwgLy8gX19udnZtX3N1c3RfcF8yZF9hcnJheV9pMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMmRfYXJyYXlfaThfdHJhcCwgODQ2MzF9LCAvLyBfX252dm1fc3VzdF9wXzJkX2FycmF5X2k4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzJkX2FycmF5X3YyaTE2X3RyYXAsIDg0NjYyfSwgLy8gX19udnZtX3N1c3RfcF8yZF9hcnJheV92MmkxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8yZF9hcnJheV92MmkzMl90cmFwLCA4NDY5Nn0sIC8vIF9fbnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjJpMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjJpOF90cmFwLCA4NDczMH0sIC8vIF9fbnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjJpOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8yZF9hcnJheV92NGkxNl90cmFwLCA4NDc2M30sIC8vIF9fbnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjRpMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjRpMzJfdHJhcCwgODQ3OTd9LCAvLyBfX252dm1fc3VzdF9wXzJkX2FycmF5X3Y0aTMyX3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzJkX2FycmF5X3Y0aThfdHJhcCwgODQ4MzF9LCAvLyBfX252dm1fc3VzdF9wXzJkX2FycmF5X3Y0aThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMmRfaTE2X3RyYXAsIDg0ODY0fSwgLy8gX19udnZtX3N1c3RfcF8yZF9pMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMmRfaTMyX3RyYXAsIDg0ODkwfSwgLy8gX19udnZtX3N1c3RfcF8yZF9pMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMmRfaThfdHJhcCwgODQ5MTZ9LCAvLyBfX252dm1fc3VzdF9wXzJkX2k4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzJkX3YyaTE2X3RyYXAsIDg0OTQxfSwgLy8gX19udnZtX3N1c3RfcF8yZF92MmkxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8yZF92MmkzMl90cmFwLCA4NDk2OX0sIC8vIF9fbnZ2bV9zdXN0X3BfMmRfdjJpMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMmRfdjJpOF90cmFwLCA4NDk5N30sIC8vIF9fbnZ2bV9zdXN0X3BfMmRfdjJpOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8yZF92NGkxNl90cmFwLCA4NTAyNH0sIC8vIF9fbnZ2bV9zdXN0X3BfMmRfdjRpMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMmRfdjRpMzJfdHJhcCwgODUwNTJ9LCAvLyBfX252dm1fc3VzdF9wXzJkX3Y0aTMyX3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzJkX3Y0aThfdHJhcCwgODUwODB9LCAvLyBfX252dm1fc3VzdF9wXzJkX3Y0aThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfM2RfaTE2X3RyYXAsIDg1MTA3fSwgLy8gX19udnZtX3N1c3RfcF8zZF9pMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfM2RfaTMyX3RyYXAsIDg1MTMzfSwgLy8gX19udnZtX3N1c3RfcF8zZF9pMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfM2RfaThfdHJhcCwgODUxNTl9LCAvLyBfX252dm1fc3VzdF9wXzNkX2k4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzNkX3YyaTE2X3RyYXAsIDg1MTg0fSwgLy8gX19udnZtX3N1c3RfcF8zZF92MmkxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8zZF92MmkzMl90cmFwLCA4NTIxMn0sIC8vIF9fbnZ2bV9zdXN0X3BfM2RfdjJpMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfM2RfdjJpOF90cmFwLCA4NTI0MH0sIC8vIF9fbnZ2bV9zdXN0X3BfM2RfdjJpOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8zZF92NGkxNl90cmFwLCA4NTI2N30sIC8vIF9fbnZ2bV9zdXN0X3BfM2RfdjRpMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfM2RfdjRpMzJfdHJhcCwgODUyOTV9LCAvLyBfX252dm1fc3VzdF9wXzNkX3Y0aTMyX3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzNkX3Y0aThfdHJhcCwgODUzMjN9LCAvLyBfX252dm1fc3VzdF9wXzNkX3Y0aThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zd2FwX2xvX2hpX2I2NCwgODUzNTB9LCAvLyBfX252dm1fc3dhcF9sb19oaV9iNjQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdHJ1bmNfZCwgODUzNzJ9LCAvLyBfX252dm1fdHJ1bmNfZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV90cnVuY19mLCA4NTM4N30sIC8vIF9fbnZ2bV90cnVuY19mCisgICAgICB7SW50cmluc2ljOjpudnZtX3RydW5jX2Z0el9mLCA4NTQwMn0sIC8vIF9fbnZ2bV90cnVuY19mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV90eHFfYXJyYXlfc2l6ZSwgODU0MjF9LCAvLyBfX252dm1fdHhxX2FycmF5X3NpemUKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdHhxX2NoYW5uZWxfZGF0YV90eXBlLCA4NTQ0M30sIC8vIF9fbnZ2bV90eHFfY2hhbm5lbF9kYXRhX3R5cGUKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdHhxX2NoYW5uZWxfb3JkZXIsIDg1NDcyfSwgLy8gX19udnZtX3R4cV9jaGFubmVsX29yZGVyCisgICAgICB7SW50cmluc2ljOjpudnZtX3R4cV9kZXB0aCwgODU0OTd9LCAvLyBfX252dm1fdHhxX2RlcHRoCisgICAgICB7SW50cmluc2ljOjpudnZtX3R4cV9oZWlnaHQsIDg1NTE0fSwgLy8gX19udnZtX3R4cV9oZWlnaHQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdHhxX251bV9taXBtYXBfbGV2ZWxzLCA4NTUzMn0sIC8vIF9fbnZ2bV90eHFfbnVtX21pcG1hcF9sZXZlbHMKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdHhxX251bV9zYW1wbGVzLCA4NTU2MX0sIC8vIF9fbnZ2bV90eHFfbnVtX3NhbXBsZXMKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdHhxX3dpZHRoLCA4NTU4NH0sIC8vIF9fbnZ2bV90eHFfd2lkdGgKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdWkyZF9ybSwgODU2MDF9LCAvLyBfX252dm1fdWkyZF9ybQorICAgICAge0ludHJpbnNpYzo6bnZ2bV91aTJkX3JuLCA4NTYxNn0sIC8vIF9fbnZ2bV91aTJkX3JuCisgICAgICB7SW50cmluc2ljOjpudnZtX3VpMmRfcnAsIDg1NjMxfSwgLy8gX19udnZtX3VpMmRfcnAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdWkyZF9yeiwgODU2NDZ9LCAvLyBfX252dm1fdWkyZF9yegorICAgICAge0ludHJpbnNpYzo6bnZ2bV91aTJmX3JtLCA4NTY2MX0sIC8vIF9fbnZ2bV91aTJmX3JtCisgICAgICB7SW50cmluc2ljOjpudnZtX3VpMmZfcm4sIDg1Njc2fSwgLy8gX19udnZtX3VpMmZfcm4KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdWkyZl9ycCwgODU2OTF9LCAvLyBfX252dm1fdWkyZl9ycAorICAgICAge0ludHJpbnNpYzo6bnZ2bV91aTJmX3J6LCA4NTcwNn0sIC8vIF9fbnZ2bV91aTJmX3J6CisgICAgICB7SW50cmluc2ljOjpudnZtX3VsbDJkX3JtLCA4NTcyMX0sIC8vIF9fbnZ2bV91bGwyZF9ybQorICAgICAge0ludHJpbnNpYzo6bnZ2bV91bGwyZF9ybiwgODU3Mzd9LCAvLyBfX252dm1fdWxsMmRfcm4KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdWxsMmRfcnAsIDg1NzUzfSwgLy8gX19udnZtX3VsbDJkX3JwCisgICAgICB7SW50cmluc2ljOjpudnZtX3VsbDJkX3J6LCA4NTc2OX0sIC8vIF9fbnZ2bV91bGwyZF9yegorICAgICAge0ludHJpbnNpYzo6bnZ2bV91bGwyZl9ybSwgODU3ODV9LCAvLyBfX252dm1fdWxsMmZfcm0KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdWxsMmZfcm4sIDg1ODAxfSwgLy8gX19udnZtX3VsbDJmX3JuCisgICAgICB7SW50cmluc2ljOjpudnZtX3VsbDJmX3JwLCA4NTgxN30sIC8vIF9fbnZ2bV91bGwyZl9ycAorICAgICAge0ludHJpbnNpYzo6bnZ2bV91bGwyZl9yeiwgODU4MzN9LCAvLyBfX252dm1fdWxsMmZfcnoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdm90ZV9hbGwsIDg1ODQ5fSwgLy8gX19udnZtX3ZvdGVfYWxsCisgICAgICB7SW50cmluc2ljOjpudnZtX3ZvdGVfYWxsX3N5bmMsIDg1ODY1fSwgLy8gX19udnZtX3ZvdGVfYWxsX3N5bmMKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdm90ZV9hbnksIDg1ODg2fSwgLy8gX19udnZtX3ZvdGVfYW55CisgICAgICB7SW50cmluc2ljOjpudnZtX3ZvdGVfYW55X3N5bmMsIDg1OTAyfSwgLy8gX19udnZtX3ZvdGVfYW55X3N5bmMKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdm90ZV9iYWxsb3QsIDg1OTIzfSwgLy8gX19udnZtX3ZvdGVfYmFsbG90CisgICAgICB7SW50cmluc2ljOjpudnZtX3ZvdGVfYmFsbG90X3N5bmMsIDg1OTQyfSwgLy8gX19udnZtX3ZvdGVfYmFsbG90X3N5bmMKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdm90ZV91bmksIDg1OTY2fSwgLy8gX19udnZtX3ZvdGVfdW5pCisgICAgICB7SW50cmluc2ljOjpudnZtX3ZvdGVfdW5pX3N5bmMsIDg1OTgyfSwgLy8gX19udnZtX3ZvdGVfdW5pX3N5bmMKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYmFycmllcjAsIDczMDcxfSwgLy8gX19zeW5jdGhyZWFkcworICAgIH07CisgICAgYXV0byBJID0gc3RkOjpsb3dlcl9ib3VuZChzdGQ6OmJlZ2luKG52dm1OYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZChudnZtTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbHRpbk5hbWVTdHIpOworICAgIGlmIChJICE9IHN0ZDo6ZW5kKG52dm1OYW1lcykgJiYKKyAgICAgICAgSS0+Z2V0TmFtZSgpID09IEJ1aWx0aW5OYW1lU3RyKQorICAgICAgcmV0dXJuIEktPkludHJpbklEOworICB9CisgIGlmIChUYXJnZXRQcmVmaXggPT0gInBwYyIpIHsKKyAgICBzdGF0aWMgY29uc3QgQnVpbHRpbkVudHJ5IHBwY05hbWVzW10gPSB7CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19jcnlwdG9fdmNpcGhlciwgODYwMDN9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdmNpcGhlcgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfY3J5cHRvX3ZjaXBoZXJsYXN0LCA4NjAzNn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192Y2lwaGVybGFzdAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfY3J5cHRvX3ZuY2lwaGVyLCA4NjA3M30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192bmNpcGhlcgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfY3J5cHRvX3ZuY2lwaGVybGFzdCwgODYxMDd9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdm5jaXBoZXJsYXN0CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19jcnlwdG9fdnBlcm14b3IsIDg2MTQ1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZwZXJteG9yCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19jcnlwdG9fdnBtc3VtYiwgODYxNzl9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnBtc3VtYgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfY3J5cHRvX3ZwbXN1bWQsIDg2MjEyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZwbXN1bWQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX2NyeXB0b192cG1zdW1oLCA4NjI0NX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192cG1zdW1oCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19jcnlwdG9fdnBtc3VtdywgODYyNzh9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnBtc3VtdworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfY3J5cHRvX3ZzYm94LCA4NjMxMX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192c2JveAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfY3J5cHRvX3ZzaGFzaWdtYWQsIDg2MzQyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZzaGFzaWdtYWQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX2NyeXB0b192c2hhc2lnbWF3LCA4NjM3OH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192c2hhc2lnbWF3CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19kc3MsIDg2NDE0fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfZHNzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19kc3NhbGwsIDg2NDM2fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfZHNzYWxsCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19kc3QsIDg2NDYxfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfZHN0CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19kc3RzdCwgODY0ODN9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY19kc3RzdAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfZHN0c3R0LCA4NjUwN30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX2RzdHN0dAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfZHN0dCwgODY1MzJ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY19kc3R0CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19tZnZzY3IsIDg2NTU1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfbWZ2c2NyCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19tdHZzY3IsIDg2NTgwfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfbXR2c2NyCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192YWJzZHViLCA4NjYwNX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZhYnNkdWIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZhYnNkdWgsIDg2NjMxfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmFic2R1aAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmFic2R1dywgODY2NTd9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192YWJzZHV3CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192YWRkY3VxLCA4NjY4M30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGRjdXEKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZhZGRjdXcsIDg2NzA5fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmFkZGN1dworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmFkZGVjdXEsIDg2NzM1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmFkZGVjdXEKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZhZGRldXFtLCA4Njc2Mn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGRldXFtCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192YWRkc2JzLCA4Njc4OX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGRzYnMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZhZGRzaHMsIDg2ODE1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmFkZHNocworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmFkZHN3cywgODY4NDF9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192YWRkc3dzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192YWRkdWJzLCA4Njg2N30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGR1YnMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZhZGR1aHMsIDg2ODkzfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmFkZHVocworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmFkZHV3cywgODY5MTl9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192YWRkdXdzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192YXZnc2IsIDg2OTQ1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmF2Z3NiCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192YXZnc2gsIDg2OTcwfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmF2Z3NoCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192YXZnc3csIDg2OTk1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmF2Z3N3CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192YXZndWIsIDg3MDIwfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmF2Z3ViCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192YXZndWgsIDg3MDQ1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmF2Z3VoCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192YXZndXcsIDg3MDcwfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmF2Z3V3CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192YnBlcm1xLCA4NzA5NX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZicGVybXEKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjZnN4LCA4NzEyMX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZjZnN4CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y2Z1eCwgODcxNDV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y2Z1eAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNsemxzYmIsIDg3MTY5fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNsemxzYmIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBiZnAsIDg3MTk2fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGJmcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGJmcF9wLCA4NzIyMn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBiZnBfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGVxZnAsIDg3MjUwfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxZnAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBlcWZwX3AsIDg3Mjc3fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxZnBfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGVxdWIsIDg3MzA2fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBlcXViX3AsIDg3MzMzfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWJfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGVxdWQsIDg3MzYyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBlcXVkX3AsIDg3Mzg5fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGVxdWgsIDg3NDE4fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWgKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBlcXVoX3AsIDg3NDQ1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWhfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGVxdXcsIDg3NDc0fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdXcKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBlcXV3X3AsIDg3NTAxfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdXdfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGdlZnAsIDg3NTMwfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGdlZnAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBnZWZwX3AsIDg3NTU3fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGdlZnBfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0ZnAsIDg3NTg2fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0ZnAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndGZwX3AsIDg3NjEzfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0ZnBfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0c2IsIDg3NjQyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2IKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHNiX3AsIDg3NjY5fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2JfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0c2QsIDg3Njk4fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2QKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHNkX3AsIDg3NzI1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2RfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0c2gsIDg3NzU0fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2gKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHNoX3AsIDg3NzgxfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2hfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0c3csIDg3ODEwfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c3cKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHN3X3AsIDg3ODM3fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c3dfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0dWIsIDg3ODY2fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHViX3AsIDg3ODkzfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWJfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0dWQsIDg3OTIyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHVkX3AsIDg3OTQ5fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWRfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0dWgsIDg3OTc4fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWgKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHVoX3AsIDg4MDA1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWhfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0dXcsIDg4MDM0fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXcKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBndHV3X3AsIDg4MDYxfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXdfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcG5lYiwgODgwOTB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wbmViCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wbmViX3AsIDg4MTE2fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcG5lYl9wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wbmVoLCA4ODE0NH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBuZWgKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBuZWhfcCwgODgxNzB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wbmVoX3AKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBuZXcsIDg4MTk4fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcG5ldworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcG5ld19wLCA4ODIyNH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBuZXdfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcG5lemIsIDg4MjUyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcG5lemIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBuZXpiX3AsIDg4Mjc5fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcG5lemJfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcG5lemgsIDg4MzA4fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcG5lemgKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBuZXpoX3AsIDg4MzM1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcG5lemhfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcG5lencsIDg4MzY0fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcG5lencKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBuZXp3X3AsIDg4MzkxfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcG5lendfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmN0c3hzLCA4ODQyMH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZjdHN4cworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmN0dXhzLCA4ODQ0NX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZjdHV4cworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmN0emxzYmIsIDg4NDcwfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmN0emxzYmIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZleHB0ZWZwLCA4ODQ5N30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZleHB0ZWZwCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Z2JiZCwgODg1MjR9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Z2JiZAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmxvZ2VmcCwgODg1NDh9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bG9nZWZwCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bWFkZGZwLCA4ODU3NH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYWRkZnAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtYXhmcCwgODg2MDB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bWF4ZnAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtYXhzYiwgODg2MjV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bWF4c2IKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtYXhzZCwgODg2NTB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bWF4c2QKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtYXhzaCwgODg2NzV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bWF4c2gKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtYXhzdywgODg3MDB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bWF4c3cKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtYXh1YiwgODg3MjV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bWF4dWIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtYXh1ZCwgODg3NTB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bWF4dWQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtYXh1aCwgODg3NzV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bWF4dWgKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtYXh1dywgODg4MDB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bWF4dXcKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtaGFkZHNocywgODg4MjV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bWhhZGRzaHMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtaHJhZGRzaHMsIDg4ODUzfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm1ocmFkZHNocworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1pbmZwLCA4ODg4Mn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW5mcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1pbnNiLCA4ODkwN30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW5zYgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1pbnNkLCA4ODkzMn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW5zZAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1pbnNoLCA4ODk1N30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW5zaAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1pbnN3LCA4ODk4Mn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW5zdworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1pbnViLCA4OTAwN30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW51YgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1pbnVkLCA4OTAzMn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW51ZAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1pbnVoLCA4OTA1N30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW51aAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1pbnV3LCA4OTA4Mn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaW51dworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1sYWRkdWhtLCA4OTEwN30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtbGFkZHVobQorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1zdW1tYm0sIDg5MTM1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm1zdW1tYm0KKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Ztc3Vtc2htLCA4OTE2Mn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3Ztc3Vtc2htCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bXN1bXNocywgODkxODl9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bXN1bXNocworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1zdW11Ym0sIDg5MjE2fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm1zdW11Ym0KKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Ztc3VtdWhtLCA4OTI0M30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3Ztc3VtdWhtCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bXN1bXVocywgODkyNzB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bXN1bXVocworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm11bGVzYiwgODkyOTd9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bXVsZXNiCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bXVsZXNoLCA4OTMyM30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxlc2gKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtdWxlc3csIDg5MzQ5fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm11bGVzdworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm11bGV1YiwgODkzNzV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bXVsZXViCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bXVsZXVoLCA4OTQwMX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxldWgKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtdWxldXcsIDg5NDI3fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm11bGV1dworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm11bG9zYiwgODk0NTN9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bXVsb3NiCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bXVsb3NoLCA4OTQ3OX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxvc2gKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtdWxvc3csIDg5NTA1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm11bG9zdworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm11bG91YiwgODk1MzF9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bXVsb3ViCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bXVsb3VoLCA4OTU1N30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxvdWgKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtdWxvdXcsIDg5NTgzfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm11bG91dworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm5tc3ViZnAsIDg5NjA5fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm5tc3ViZnAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZwZXJtLCA4OTYzNn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZwZXJtXzRzaQorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnBrcHgsIDg5NjY0fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnBrcHgKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Zwa3Nkc3MsIDg5Njg4fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnBrc2RzcworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnBrc2R1cywgODk3MTR9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cGtzZHVzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cGtzaHNzLCA4OTc0MH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3Zwa3Noc3MKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Zwa3NodXMsIDg5NzY2fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnBrc2h1cworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnBrc3dzcywgODk3OTJ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cGtzd3NzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cGtzd3VzLCA4OTgxOH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3Zwa3N3dXMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Zwa3VkdXMsIDg5ODQ0fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnBrdWR1cworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnBrdWh1cywgODk4NzB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cGt1aHVzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cGt1d3VzLCA4OTg5Nn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3Zwa3V3dXMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZwcnR5YmQsIDg5OTIyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnBydHliZAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnBydHlicSwgODk5NDh9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cHJ0eWJxCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cHJ0eWJ3LCA4OTk3NH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZwcnR5YncKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZyZWZwLCA5MDAwMH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZyZWZwCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cmZpbSwgOTAwMjR9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cmZpbQorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnJmaW4sIDkwMDQ4fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnJmaW4KKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZyZmlwLCA5MDA3Mn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZyZmlwCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cmZpeiwgOTAwOTZ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cmZpegorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnJsYiwgOTAxMjB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cmxiCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cmxkLCA5MDE0M30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZybGQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZybGRtaSwgOTAxNjZ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cmxkbWkKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZybGRubSwgOTAxOTF9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cmxkbm0KKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZybGgsIDkwMjE2fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnJsaAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnJsdywgOTAyMzl9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cmx3CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cmx3bWksIDkwMjYyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnJsd21pCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cmx3bm0sIDkwMjg3fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnJsd25tCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cnNxcnRlZnAsIDkwMzEyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnJzcXJ0ZWZwCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c2VsLCA5MDM0MH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzZWxfNHNpCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c2wsIDkwMzY3fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnNsCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c2xiLCA5MDM4OX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzbGIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzbGgsIDkwNDEyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnNsaAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnNsbywgOTA0MzV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c2xvCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c2x2LCA5MDQ1OH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzbHYKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzbHcsIDkwNDgxfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnNsdworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnNyLCA5MDUwNH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzcgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnNyYWIsIDkwNTI2fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnNyYWIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzcmFoLCA5MDU1MH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzcmFoCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c3JhdywgOTA1NzR9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c3JhdworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnNyYiwgOTA1OTh9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c3JiCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c3JoLCA5MDYyMX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzcmgKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Zzcm8sIDkwNjQ0fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnNybworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnNydiwgOTA2Njd9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c3J2CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c3J3LCA5MDY5MH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzcncKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzdWJjdXEsIDkwNzEzfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnN1YmN1cQorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnN1YmN1dywgOTA3Mzl9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c3ViY3V3CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c3ViZWN1cSwgOTA3NjV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c3ViZWN1cQorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnN1YmV1cW0sIDkwNzkyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnN1YmV1cW0KKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzdWJzYnMsIDkwODE5fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnN1YnNicworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnN1YnNocywgOTA4NDV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c3Vic2hzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c3Vic3dzLCA5MDg3MX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJzd3MKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzdWJ1YnMsIDkwODk3fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnN1YnVicworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnN1YnVocywgOTA5MjN9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c3VidWhzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c3VidXdzLCA5MDk0OX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJ1d3MKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzdW0yc3dzLCA5MDk3NX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdW0yc3dzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c3VtNHNicywgOTEwMDJ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c3VtNHNicworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnN1bTRzaHMsIDkxMDI5fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnN1bTRzaHMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzdW00dWJzLCA5MTA1Nn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdW00dWJzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c3Vtc3dzLCA5MTA4M30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdW1zd3MKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Z1cGtocHgsIDkxMTA5fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnVwa2hweAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnVwa2hzYiwgOTExMzV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192dXBraHNiCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192dXBraHNoLCA5MTE2MX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtoc2gKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Z1cGtoc3csIDkxMTg3fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnVwa2hzdworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnVwa2xweCwgOTEyMTN9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192dXBrbHB4CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192dXBrbHNiLCA5MTIzOX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtsc2IKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Z1cGtsc2gsIDkxMjY1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnVwa2xzaAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnVwa2xzdywgOTEyOTF9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192dXBrbHN3CisgICAgICB7SW50cmluc2ljOjpwcGNfYnBlcm1kLCA5MTMxN30sIC8vIF9fYnVpbHRpbl9icGVybWQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19kaXZkZSwgOTEzMzR9LCAvLyBfX2J1aWx0aW5fZGl2ZGUKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19kaXZkZXUsIDkxMzUwfSwgLy8gX19idWlsdGluX2RpdmRldQorICAgICAge0ludHJpbnNpYzo6cHBjX2RpdndlLCA5MTM2N30sIC8vIF9fYnVpbHRpbl9kaXZ3ZQorICAgICAge0ludHJpbnNpYzo6cHBjX2RpdndldSwgOTEzODN9LCAvLyBfX2J1aWx0aW5fZGl2d2V1CisgICAgICB7SW50cmluc2ljOjpwcGNfZ2V0X3RleGFzciwgOTE0MDB9LCAvLyBfX2J1aWx0aW5fZ2V0X3RleGFzcgorICAgICAge0ludHJpbnNpYzo6cHBjX2dldF90ZXhhc3J1LCA5MTQyMX0sIC8vIF9fYnVpbHRpbl9nZXRfdGV4YXNydQorICAgICAge0ludHJpbnNpYzo6cHBjX2dldF90ZmhhciwgOTE0NDN9LCAvLyBfX2J1aWx0aW5fZ2V0X3RmaGFyCisgICAgICB7SW50cmluc2ljOjpwcGNfZ2V0X3RmaWFyLCA5MTQ2M30sIC8vIF9fYnVpbHRpbl9nZXRfdGZpYXIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmYWJzLCA5MTQ4M30sIC8vIF9fYnVpbHRpbl9xcHhfcXZmYWJzCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZmFkZCwgOTE1MDR9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZmFkZAorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZhZGRzLCA5MTUyNX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmYWRkcworICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZjZmlkLCA5MTU0N30sIC8vIF9fYnVpbHRpbl9xcHhfcXZmY2ZpZAorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZjZmlkcywgOTE1Njl9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZmNmaWRzCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZmNmaWR1LCA5MTU5Mn0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmY2ZpZHUKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmY2ZpZHVzLCA5MTYxNX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmY2ZpZHVzCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZmNtcGVxLCA5MTYzOX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmY21wZXEKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmY21wZ3QsIDkxNjYyfSwgLy8gX19idWlsdGluX3FweF9xdmZjbXBndAorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZjbXBsdCwgOTE2ODV9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZmNtcGx0CisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZmNwc2duLCA5MTcwOH0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmY3BzZ24KKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmY3RpZCwgOTE3MzF9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZmN0aWQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmY3RpZHUsIDkxNzUzfSwgLy8gX19idWlsdGluX3FweF9xdmZjdGlkdQorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZjdGlkdXosIDkxNzc2fSwgLy8gX19idWlsdGluX3FweF9xdmZjdGlkdXoKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmY3RpZHosIDkxODAwfSwgLy8gX19idWlsdGluX3FweF9xdmZjdGlkegorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZjdGl3LCA5MTgyM30sIC8vIF9fYnVpbHRpbl9xcHhfcXZmY3RpdworICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZjdGl3dSwgOTE4NDV9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZmN0aXd1CisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZmN0aXd1eiwgOTE4Njh9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZmN0aXd1egorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZjdGl3eiwgOTE4OTJ9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZmN0aXd6CisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZmxvZ2ljYWwsIDkxOTE1fSwgLy8gX19idWlsdGluX3FweF9xdmZsb2dpY2FsCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2Zm1hZGQsIDkxOTQwfSwgLy8gX19idWlsdGluX3FweF9xdmZtYWRkCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2Zm1hZGRzLCA5MTk2Mn0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmbWFkZHMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmbXN1YiwgOTE5ODV9LCAvLyBfX2J1aWx0aW5fcXB4X3F2Zm1zdWIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmbXN1YnMsIDkyMDA3fSwgLy8gX19idWlsdGluX3FweF9xdmZtc3VicworICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZtdWwsIDkyMDMwfSwgLy8gX19idWlsdGluX3FweF9xdmZtdWwKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmbXVscywgOTIwNTF9LCAvLyBfX2J1aWx0aW5fcXB4X3F2Zm11bHMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmbmFicywgOTIwNzN9LCAvLyBfX2J1aWx0aW5fcXB4X3F2Zm5hYnMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmbmVnLCA5MjA5NX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmbmVnCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2Zm5tYWRkLCA5MjExNn0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmbm1hZGQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmbm1hZGRzLCA5MjEzOX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmbm1hZGRzCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2Zm5tc3ViLCA5MjE2M30sIC8vIF9fYnVpbHRpbl9xcHhfcXZmbm1zdWIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmbm1zdWJzLCA5MjE4Nn0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmbm1zdWJzCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZnBlcm0sIDkyMjEwfSwgLy8gX19idWlsdGluX3FweF9xdmZwZXJtCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZnJlLCA5MjIzMn0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmcmUKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmcmVzLCA5MjI1Mn0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmcmVzCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZnJpbSwgOTIyNzN9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZnJpbQorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZyaW4sIDkyMjk0fSwgLy8gX19idWlsdGluX3FweF9xdmZyaW4KKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmcmlwLCA5MjMxNX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmcmlwCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZnJpeiwgOTIzMzZ9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZnJpegorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZyc3AsIDkyMzU3fSwgLy8gX19idWlsdGluX3FweF9xdmZyc3AKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmcnNxcnRlLCA5MjM3OH0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmcnNxcnRlCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZnJzcXJ0ZXMsIDkyNDAyfSwgLy8gX19idWlsdGluX3FweF9xdmZyc3FydGVzCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZnNlbCwgOTI0Mjd9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZnNlbAorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZzdWIsIDkyNDQ4fSwgLy8gX19idWlsdGluX3FweF9xdmZzdWIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmc3VicywgOTI0Njl9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZnN1YnMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmdHN0bmFuLCA5MjQ5MX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmdHN0bmFuCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZnhtYWRkLCA5MjUxNX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmeG1hZGQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmeG1hZGRzLCA5MjUzOH0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmeG1hZGRzCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZnhtdWwsIDkyNTYyfSwgLy8gX19idWlsdGluX3FweF9xdmZ4bXVsCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZnhtdWxzLCA5MjU4NH0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmeG11bHMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmeHhjcG5tYWRkLCA5MjYwN30sIC8vIF9fYnVpbHRpbl9xcHhfcXZmeHhjcG5tYWRkCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2Znh4Y3BubWFkZHMsIDkyNjM0fSwgLy8gX19idWlsdGluX3FweF9xdmZ4eGNwbm1hZGRzCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2Znh4bWFkZCwgOTI2NjJ9LCAvLyBfX2J1aWx0aW5fcXB4X3F2Znh4bWFkZAorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZ4eG1hZGRzLCA5MjY4Nn0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmeHhtYWRkcworICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZ4eG5wbWFkZCwgOTI3MTF9LCAvLyBfX2J1aWx0aW5fcXB4X3F2Znh4bnBtYWRkCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2Znh4bnBtYWRkcywgOTI3Mzd9LCAvLyBfX2J1aWx0aW5fcXB4X3F2Znh4bnBtYWRkcworICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmdwY2ksIDkyNzY0fSwgLy8gX19idWlsdGluX3FweF9xdmdwY2kKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZsZmNkLCA5Mjc4NX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZsZmNkCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2bGZjZGEsIDkyODA2fSwgLy8gX19idWlsdGluX3FweF9xdmxmY2RhCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2bGZjcywgOTI4Mjh9LCAvLyBfX2J1aWx0aW5fcXB4X3F2bGZjcworICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmxmY3NhLCA5Mjg0OX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZsZmNzYQorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmxmZCwgOTI4NzF9LCAvLyBfX2J1aWx0aW5fcXB4X3F2bGZkCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2bGZkYSwgOTI4OTF9LCAvLyBfX2J1aWx0aW5fcXB4X3F2bGZkYQorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmxmaXdhLCA5MjkxMn0sIC8vIF9fYnVpbHRpbl9xcHhfcXZsZml3YQorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmxmaXdhYSwgOTI5MzR9LCAvLyBfX2J1aWx0aW5fcXB4X3F2bGZpd2FhCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2bGZpd3osIDkyOTU3fSwgLy8gX19idWlsdGluX3FweF9xdmxmaXd6CisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2bGZpd3phLCA5Mjk3OX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZsZml3emEKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZsZnMsIDkzMDAyfSwgLy8gX19idWlsdGluX3FweF9xdmxmcworICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmxmc2EsIDkzMDIyfSwgLy8gX19idWlsdGluX3FweF9xdmxmc2EKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZscGNsZCwgOTMwNDN9LCAvLyBfX2J1aWx0aW5fcXB4X3F2bHBjbGQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZscGNscywgOTMwNjV9LCAvLyBfX2J1aWx0aW5fcXB4X3F2bHBjbHMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZscGNyZCwgOTMwODd9LCAvLyBfX2J1aWx0aW5fcXB4X3F2bHBjcmQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZscGNycywgOTMxMDl9LCAvLyBfX2J1aWx0aW5fcXB4X3F2bHBjcnMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZzdGZjZCwgOTMxMzF9LCAvLyBfX2J1aWx0aW5fcXB4X3F2c3RmY2QKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZzdGZjZGEsIDkzMTUzfSwgLy8gX19idWlsdGluX3FweF9xdnN0ZmNkYQorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdnN0ZmNzLCA5MzE3Nn0sIC8vIF9fYnVpbHRpbl9xcHhfcXZzdGZjcworICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdnN0ZmNzYSwgOTMxOTh9LCAvLyBfX2J1aWx0aW5fcXB4X3F2c3RmY3NhCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2c3RmZCwgOTMyMjF9LCAvLyBfX2J1aWx0aW5fcXB4X3F2c3RmZAorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdnN0ZmRhLCA5MzI0Mn0sIC8vIF9fYnVpbHRpbl9xcHhfcXZzdGZkYQorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdnN0Zml3LCA5MzI2NH0sIC8vIF9fYnVpbHRpbl9xcHhfcXZzdGZpdworICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdnN0Zml3YSwgOTMyODZ9LCAvLyBfX2J1aWx0aW5fcXB4X3F2c3RmaXdhCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2c3RmcywgOTMzMDl9LCAvLyBfX2J1aWx0aW5fcXB4X3F2c3RmcworICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdnN0ZnNhLCA5MzMzMH0sIC8vIF9fYnVpbHRpbl9xcHhfcXZzdGZzYQorICAgICAge0ludHJpbnNpYzo6cHBjX3NldF90ZXhhc3IsIDkzMzUyfSwgLy8gX19idWlsdGluX3NldF90ZXhhc3IKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19zZXRfdGV4YXNydSwgOTMzNzN9LCAvLyBfX2J1aWx0aW5fc2V0X3RleGFzcnUKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19zZXRfdGZoYXIsIDkzMzk1fSwgLy8gX19idWlsdGluX3NldF90ZmhhcgorICAgICAge0ludHJpbnNpYzo6cHBjX3NldF90ZmlhciwgOTM0MTV9LCAvLyBfX2J1aWx0aW5fc2V0X3RmaWFyCisgICAgICB7SW50cmluc2ljOjpwcGNfdGFib3J0LCA5MzQzNX0sIC8vIF9fYnVpbHRpbl90YWJvcnQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY190YWJvcnRkYywgOTM0NTJ9LCAvLyBfX2J1aWx0aW5fdGFib3J0ZGMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY190YWJvcnRkY2ksIDkzNDcxfSwgLy8gX19idWlsdGluX3RhYm9ydGRjaQorICAgICAge0ludHJpbnNpYzo6cHBjX3RhYm9ydHdjLCA5MzQ5MX0sIC8vIF9fYnVpbHRpbl90YWJvcnR3YworICAgICAge0ludHJpbnNpYzo6cHBjX3RhYm9ydHdjaSwgOTM1MTB9LCAvLyBfX2J1aWx0aW5fdGFib3J0d2NpCisgICAgICB7SW50cmluc2ljOjpwcGNfdGJlZ2luLCA5MzUzMH0sIC8vIF9fYnVpbHRpbl90YmVnaW4KKyAgICAgIHtJbnRyaW5zaWM6OnBwY190Y2hlY2ssIDkzNTQ3fSwgLy8gX19idWlsdGluX3RjaGVjaworICAgICAge0ludHJpbnNpYzo6cHBjX3RlbmQsIDkzNTY0fSwgLy8gX19idWlsdGluX3RlbmQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY190ZW5kYWxsLCA5MzU3OX0sIC8vIF9fYnVpbHRpbl90ZW5kYWxsCisgICAgICB7SW50cmluc2ljOjpwcGNfdHJlY2hrcHQsIDkzNTk3fSwgLy8gX19idWlsdGluX3RyZWNoa3B0CisgICAgICB7SW50cmluc2ljOjpwcGNfdHJlY2xhaW0sIDkzNjE2fSwgLy8gX19idWlsdGluX3RyZWNsYWltCisgICAgICB7SW50cmluc2ljOjpwcGNfdHJlc3VtZSwgOTM2MzV9LCAvLyBfX2J1aWx0aW5fdHJlc3VtZQorICAgICAge0ludHJpbnNpYzo6cHBjX3RzciwgOTM2NTN9LCAvLyBfX2J1aWx0aW5fdHNyCisgICAgICB7SW50cmluc2ljOjpwcGNfdHN1c3BlbmQsIDkzNjY3fSwgLy8gX19idWlsdGluX3RzdXNwZW5kCisgICAgICB7SW50cmluc2ljOjpwcGNfdHRlc3QsIDkzNjg2fSwgLy8gX19idWlsdGluX3R0ZXN0CisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3hzbWF4ZHAsIDkzNzAyfSwgLy8gX19idWlsdGluX3ZzeF94c21heGRwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3hzbWluZHAsIDkzNzI0fSwgLy8gX19idWlsdGluX3ZzeF94c21pbmRwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2Y21wZXFkcCwgOTM3NDZ9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y21wZXFkcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dmNtcGVxZHBfcCwgOTM3NzB9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y21wZXFkcF9wCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2Y21wZXFzcCwgOTM3OTZ9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y21wZXFzcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dmNtcGVxc3BfcCwgOTM4MjB9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y21wZXFzcF9wCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2Y21wZ2VkcCwgOTM4NDZ9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y21wZ2VkcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dmNtcGdlZHBfcCwgOTM4NzB9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y21wZ2VkcF9wCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2Y21wZ2VzcCwgOTM4OTZ9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y21wZ2VzcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dmNtcGdlc3BfcCwgOTM5MjB9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y21wZ2VzcF9wCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2Y21wZ3RkcCwgOTM5NDZ9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y21wZ3RkcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dmNtcGd0ZHBfcCwgOTM5NzB9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y21wZ3RkcF9wCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2Y21wZ3RzcCwgOTM5OTZ9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y21wZ3RzcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dmNtcGd0c3BfcCwgOTQwMjB9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y21wZ3RzcF9wCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2Y3ZkcHNwLCA5NDA0Nn0sIC8vIF9fYnVpbHRpbl92c3hfeHZjdmRwc3AKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZjdmRwc3h3cywgOTQwNjl9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y3ZkcHN4d3MKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZjdmRwdXh3cywgOTQwOTR9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y3ZkcHV4d3MKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZjdmhwc3AsIDk0MTE5fSwgLy8gX19idWlsdGluX3ZzeF94dmN2aHBzcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dmN2c3BkcCwgOTQxNDJ9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y3ZzcGRwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2Y3ZzcGhwLCA5NDE2NX0sIC8vIF9fYnVpbHRpbl92c3hfeHZjdnNwaHAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZjdnN4ZHNwLCA5NDE4OH0sIC8vIF9fYnVpbHRpbl92c3hfeHZjdnN4ZHNwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2Y3ZzeHdkcCwgOTQyMTJ9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y3ZzeHdkcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dmN2dXhkc3AsIDk0MjM2fSwgLy8gX19idWlsdGluX3ZzeF94dmN2dXhkc3AKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZjdnV4d2RwLCA5NDI2MH0sIC8vIF9fYnVpbHRpbl92c3hfeHZjdnV4d2RwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2ZGl2ZHAsIDk0Mjg0fSwgLy8gX19idWlsdGluX3ZzeF94dmRpdmRwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2ZGl2c3AsIDk0MzA2fSwgLy8gX19idWlsdGluX3ZzeF94dmRpdnNwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2aWV4cGRwLCA5NDMyOH0sIC8vIF9fYnVpbHRpbl92c3hfeHZpZXhwZHAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZpZXhwc3AsIDk0MzUxfSwgLy8gX19idWlsdGluX3ZzeF94dmlleHBzcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dm1heGRwLCA5NDM3NH0sIC8vIF9fYnVpbHRpbl92c3hfeHZtYXhkcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dm1heHNwLCA5NDM5Nn0sIC8vIF9fYnVpbHRpbl92c3hfeHZtYXhzcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dm1pbmRwLCA5NDQxOH0sIC8vIF9fYnVpbHRpbl92c3hfeHZtaW5kcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dm1pbnNwLCA5NDQ0MH0sIC8vIF9fYnVpbHRpbl92c3hfeHZtaW5zcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dnJlZHAsIDk0NDYyfSwgLy8gX19idWlsdGluX3ZzeF94dnJlZHAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZyZXNwLCA5NDQ4M30sIC8vIF9fYnVpbHRpbl92c3hfeHZyZXNwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2cnNxcnRlZHAsIDk0NTA0fSwgLy8gX19idWlsdGluX3ZzeF94dnJzcXJ0ZWRwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2cnNxcnRlc3AsIDk0NTI5fSwgLy8gX19idWlsdGluX3ZzeF94dnJzcXJ0ZXNwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2dHN0ZGNkcCwgOTQ1NTR9LCAvLyBfX2J1aWx0aW5fdnN4X3h2dHN0ZGNkcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dnRzdGRjc3AsIDk0NTc4fSwgLy8gX19idWlsdGluX3ZzeF94dnRzdGRjc3AKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZ4ZXhwZHAsIDk0NjAyfSwgLy8gX19idWlsdGluX3ZzeF94dnhleHBkcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dnhleHBzcCwgOTQ2MjV9LCAvLyBfX2J1aWx0aW5fdnN4X3h2eGV4cHNwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2eHNpZ2RwLCA5NDY0OH0sIC8vIF9fYnVpbHRpbl92c3hfeHZ4c2lnZHAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZ4c2lnc3AsIDk0NjcxfSwgLy8gX19idWlsdGluX3ZzeF94dnhzaWdzcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94eGV4dHJhY3R1dywgOTQ2OTR9LCAvLyBfX2J1aWx0aW5fdnN4X3h4ZXh0cmFjdHV3CisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h4aW5zZXJ0dywgOTQ3MjB9LCAvLyBfX2J1aWx0aW5fdnN4X3h4aW5zZXJ0dworICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94eGxlcXYsIDk0NzQ0fSwgLy8gX19idWlsdGluX3ZzeF94eGxlcXYKKyAgICB9OworICAgIGF1dG8gSSA9IHN0ZDo6bG93ZXJfYm91bmQoc3RkOjpiZWdpbihwcGNOYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZChwcGNOYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluTmFtZVN0cik7CisgICAgaWYgKEkgIT0gc3RkOjplbmQocHBjTmFtZXMpICYmCisgICAgICAgIEktPmdldE5hbWUoKSA9PSBCdWlsdGluTmFtZVN0cikKKyAgICAgIHJldHVybiBJLT5JbnRyaW5JRDsKKyAgfQorICBpZiAoVGFyZ2V0UHJlZml4ID09ICJyNjAwIikgeworICAgIHN0YXRpYyBjb25zdCBCdWlsdGluRW50cnkgcjYwME5hbWVzW10gPSB7CisgICAgICB7SW50cmluc2ljOjpyNjAwX2dyb3VwX2JhcnJpZXIsIDk0NzY1fSwgLy8gX19idWlsdGluX3I2MDBfZ3JvdXBfYmFycmllcgorICAgICAge0ludHJpbnNpYzo6cjYwMF9pbXBsaWNpdGFyZ19wdHIsIDk0Nzk0fSwgLy8gX19idWlsdGluX3I2MDBfaW1wbGljaXRhcmdfcHRyCisgICAgICB7SW50cmluc2ljOjpyNjAwX3JhdF9zdG9yZV90eXBlZCwgOTQ4MjV9LCAvLyBfX2J1aWx0aW5fcjYwMF9yYXRfc3RvcmVfdHlwZWQKKyAgICAgIHtJbnRyaW5zaWM6OnI2MDBfcmVhZF9nbG9iYWxfc2l6ZV94LCA5NDg1Nn0sIC8vIF9fYnVpbHRpbl9yNjAwX3JlYWRfZ2xvYmFsX3NpemVfeAorICAgICAge0ludHJpbnNpYzo6cjYwMF9yZWFkX2dsb2JhbF9zaXplX3ksIDk0ODkwfSwgLy8gX19idWlsdGluX3I2MDBfcmVhZF9nbG9iYWxfc2l6ZV95CisgICAgICB7SW50cmluc2ljOjpyNjAwX3JlYWRfZ2xvYmFsX3NpemVfeiwgOTQ5MjR9LCAvLyBfX2J1aWx0aW5fcjYwMF9yZWFkX2dsb2JhbF9zaXplX3oKKyAgICAgIHtJbnRyaW5zaWM6OnI2MDBfcmVhZF9uZ3JvdXBzX3gsIDk0OTU4fSwgLy8gX19idWlsdGluX3I2MDBfcmVhZF9uZ3JvdXBzX3gKKyAgICAgIHtJbnRyaW5zaWM6OnI2MDBfcmVhZF9uZ3JvdXBzX3ksIDk0OTg4fSwgLy8gX19idWlsdGluX3I2MDBfcmVhZF9uZ3JvdXBzX3kKKyAgICAgIHtJbnRyaW5zaWM6OnI2MDBfcmVhZF9uZ3JvdXBzX3osIDk1MDE4fSwgLy8gX19idWlsdGluX3I2MDBfcmVhZF9uZ3JvdXBzX3oKKyAgICAgIHtJbnRyaW5zaWM6OnI2MDBfcmVhZF90Z2lkX3gsIDk1MDQ4fSwgLy8gX19idWlsdGluX3I2MDBfcmVhZF90Z2lkX3gKKyAgICAgIHtJbnRyaW5zaWM6OnI2MDBfcmVhZF90Z2lkX3ksIDk1MDc1fSwgLy8gX19idWlsdGluX3I2MDBfcmVhZF90Z2lkX3kKKyAgICAgIHtJbnRyaW5zaWM6OnI2MDBfcmVhZF90Z2lkX3osIDk1MTAyfSwgLy8gX19idWlsdGluX3I2MDBfcmVhZF90Z2lkX3oKKyAgICB9OworICAgIGF1dG8gSSA9IHN0ZDo6bG93ZXJfYm91bmQoc3RkOjpiZWdpbihyNjAwTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjplbmQocjYwME5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5OYW1lU3RyKTsKKyAgICBpZiAoSSAhPSBzdGQ6OmVuZChyNjAwTmFtZXMpICYmCisgICAgICAgIEktPmdldE5hbWUoKSA9PSBCdWlsdGluTmFtZVN0cikKKyAgICAgIHJldHVybiBJLT5JbnRyaW5JRDsKKyAgfQorICBpZiAoVGFyZ2V0UHJlZml4ID09ICJzMzkwIikgeworICAgIHN0YXRpYyBjb25zdCBCdWlsdGluRW50cnkgczM5ME5hbWVzW10gPSB7CisgICAgICB7SW50cmluc2ljOjpzMzkwX2VmcGMsIDk1MTI5fSwgLy8gX19idWlsdGluX3MzOTBfZWZwYworICAgICAge0ludHJpbnNpYzo6czM5MF9sY2JiLCA5NTE3Nn0sIC8vIF9fYnVpbHRpbl9zMzkwX2xjYmIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfc2ZwYywgOTUyMTZ9LCAvLyBfX2J1aWx0aW5fczM5MF9zZnBjCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZhY2NiLCA5NTIzNn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZhY2NiCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZhY2NjcSwgOTUyNTd9LCAvLyBfX2J1aWx0aW5fczM5MF92YWNjY3EKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmFjY2YsIDk1Mjc5fSwgLy8gX19idWlsdGluX3MzOTBfdmFjY2YKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmFjY2csIDk1MzAwfSwgLy8gX19idWlsdGluX3MzOTBfdmFjY2cKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmFjY2gsIDk1MzIxfSwgLy8gX19idWlsdGluX3MzOTBfdmFjY2gKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmFjY3EsIDk1MzQyfSwgLy8gX19idWlsdGluX3MzOTBfdmFjY3EKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmFjcSwgOTUzNjN9LCAvLyBfX2J1aWx0aW5fczM5MF92YWNxCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZhcSwgOTUzODN9LCAvLyBfX2J1aWx0aW5fczM5MF92YXEKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmF2Z2IsIDk1NDAyfSwgLy8gX19idWlsdGluX3MzOTBfdmF2Z2IKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmF2Z2YsIDk1NDIzfSwgLy8gX19idWlsdGluX3MzOTBfdmF2Z2YKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmF2Z2csIDk1NDQ0fSwgLy8gX19idWlsdGluX3MzOTBfdmF2Z2cKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmF2Z2gsIDk1NDY1fSwgLy8gX19idWlsdGluX3MzOTBfdmF2Z2gKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmF2Z2xiLCA5NTQ4Nn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZhdmdsYgorICAgICAge0ludHJpbnNpYzo6czM5MF92YXZnbGYsIDk1NTA4fSwgLy8gX19idWlsdGluX3MzOTBfdmF2Z2xmCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZhdmdsZywgOTU1MzB9LCAvLyBfX2J1aWx0aW5fczM5MF92YXZnbGcKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmF2Z2xoLCA5NTU1Mn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZhdmdsaAorICAgICAge0ludHJpbnNpYzo6czM5MF92YnBlcm0sIDk1NTc0fSwgLy8gX19idWlsdGluX3MzOTBfdmJwZXJtCisgICAgICB7SW50cmluc2ljOjpzMzkwX3Zja3NtLCA5NTU5Nn0sIC8vIF9fYnVpbHRpbl9zMzkwX3Zja3NtCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZlcmltYiwgOTU2MTd9LCAvLyBfX2J1aWx0aW5fczM5MF92ZXJpbWIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmVyaW1mLCA5NTYzOX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZlcmltZgorICAgICAge0ludHJpbnNpYzo6czM5MF92ZXJpbWcsIDk1NjYxfSwgLy8gX19idWlsdGluX3MzOTBfdmVyaW1nCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZlcmltaCwgOTU2ODN9LCAvLyBfX2J1aWx0aW5fczM5MF92ZXJpbWgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmVybGxiLCA5NTcwNX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZlcmxsYgorICAgICAge0ludHJpbnNpYzo6czM5MF92ZXJsbGYsIDk1NzI3fSwgLy8gX19idWlsdGluX3MzOTBfdmVybGxmCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZlcmxsZywgOTU3NDl9LCAvLyBfX2J1aWx0aW5fczM5MF92ZXJsbGcKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmVybGxoLCA5NTc3MX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZlcmxsaAorICAgICAge0ludHJpbnNpYzo6czM5MF92ZXJsbHZiLCA5NTc5M30sIC8vIF9fYnVpbHRpbl9zMzkwX3ZlcmxsdmIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmVybGx2ZiwgOTU4MTZ9LCAvLyBfX2J1aWx0aW5fczM5MF92ZXJsbHZmCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZlcmxsdmcsIDk1ODM5fSwgLy8gX19idWlsdGluX3MzOTBfdmVybGx2ZworICAgICAge0ludHJpbnNpYzo6czM5MF92ZXJsbHZoLCA5NTg2Mn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZlcmxsdmgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmZhZWIsIDk1ODg1fSwgLy8gX19idWlsdGluX3MzOTBfdmZhZWIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmZhZWYsIDk1OTA2fSwgLy8gX19idWlsdGluX3MzOTBfdmZhZWYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmZhZWgsIDk1OTI3fSwgLy8gX19idWlsdGluX3MzOTBfdmZhZWgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmZhZXpiLCA5NTk0OH0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZmYWV6YgorICAgICAge0ludHJpbnNpYzo6czM5MF92ZmFlemYsIDk1OTcwfSwgLy8gX19idWlsdGluX3MzOTBfdmZhZXpmCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZmYWV6aCwgOTU5OTJ9LCAvLyBfX2J1aWx0aW5fczM5MF92ZmFlemgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmZlZWIsIDk2MDE0fSwgLy8gX19idWlsdGluX3MzOTBfdmZlZWIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmZlZWYsIDk2MDM1fSwgLy8gX19idWlsdGluX3MzOTBfdmZlZWYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmZlZWgsIDk2MDU2fSwgLy8gX19idWlsdGluX3MzOTBfdmZlZWgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmZlZXpiLCA5NjA3N30sIC8vIF9fYnVpbHRpbl9zMzkwX3ZmZWV6YgorICAgICAge0ludHJpbnNpYzo6czM5MF92ZmVlemYsIDk2MDk5fSwgLy8gX19idWlsdGluX3MzOTBfdmZlZXpmCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZmZWV6aCwgOTYxMjF9LCAvLyBfX2J1aWx0aW5fczM5MF92ZmVlemgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmZlbmViLCA5NjE0M30sIC8vIF9fYnVpbHRpbl9zMzkwX3ZmZW5lYgorICAgICAge0ludHJpbnNpYzo6czM5MF92ZmVuZWYsIDk2MTY1fSwgLy8gX19idWlsdGluX3MzOTBfdmZlbmVmCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZmZW5laCwgOTYxODd9LCAvLyBfX2J1aWx0aW5fczM5MF92ZmVuZWgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmZlbmV6YiwgOTYyMDl9LCAvLyBfX2J1aWx0aW5fczM5MF92ZmVuZXpiCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZmZW5lemYsIDk2MjMyfSwgLy8gX19idWlsdGluX3MzOTBfdmZlbmV6ZgorICAgICAge0ludHJpbnNpYzo6czM5MF92ZmVuZXpoLCA5NjI1NX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZmZW5lemgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmdmbWFiLCA5NjI3OH0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZnZm1hYgorICAgICAge0ludHJpbnNpYzo6czM5MF92Z2ZtYWYsIDk2MzAwfSwgLy8gX19idWlsdGluX3MzOTBfdmdmbWFmCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZnZm1hZywgOTYzMjJ9LCAvLyBfX2J1aWx0aW5fczM5MF92Z2ZtYWcKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmdmbWFoLCA5NjM0NH0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZnZm1haAorICAgICAge0ludHJpbnNpYzo6czM5MF92Z2ZtYiwgOTYzNjZ9LCAvLyBfX2J1aWx0aW5fczM5MF92Z2ZtYgorICAgICAge0ludHJpbnNpYzo6czM5MF92Z2ZtZiwgOTYzODd9LCAvLyBfX2J1aWx0aW5fczM5MF92Z2ZtZgorICAgICAge0ludHJpbnNpYzo6czM5MF92Z2ZtZywgOTY0MDh9LCAvLyBfX2J1aWx0aW5fczM5MF92Z2ZtZworICAgICAge0ludHJpbnNpYzo6czM5MF92Z2ZtaCwgOTY0Mjl9LCAvLyBfX2J1aWx0aW5fczM5MF92Z2ZtaAorICAgICAge0ludHJpbnNpYzo6czM5MF92aXN0cmIsIDk2NDUwfSwgLy8gX19idWlsdGluX3MzOTBfdmlzdHJiCisgICAgICB7SW50cmluc2ljOjpzMzkwX3Zpc3RyZiwgOTY0NzJ9LCAvLyBfX2J1aWx0aW5fczM5MF92aXN0cmYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmlzdHJoLCA5NjQ5NH0sIC8vIF9fYnVpbHRpbl9zMzkwX3Zpc3RyaAorICAgICAge0ludHJpbnNpYzo6czM5MF92bGJiLCA5NjUxNn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZsYmIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmxsLCA5NjUzNn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZsbAorICAgICAge0ludHJpbnNpYzo6czM5MF92bHJsLCA5NjU1NX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZscmwKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1hZWIsIDk2NTc1fSwgLy8gX19idWlsdGluX3MzOTBfdm1hZWIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1hZWYsIDk2NTk2fSwgLy8gX19idWlsdGluX3MzOTBfdm1hZWYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1hZWgsIDk2NjE3fSwgLy8gX19idWlsdGluX3MzOTBfdm1hZWgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1haGIsIDk2NjM4fSwgLy8gX19idWlsdGluX3MzOTBfdm1haGIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1haGYsIDk2NjU5fSwgLy8gX19idWlsdGluX3MzOTBfdm1haGYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1haGgsIDk2NjgwfSwgLy8gX19idWlsdGluX3MzOTBfdm1haGgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1hbGViLCA5NjcwMX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZtYWxlYgorICAgICAge0ludHJpbnNpYzo6czM5MF92bWFsZWYsIDk2NzIzfSwgLy8gX19idWlsdGluX3MzOTBfdm1hbGVmCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZtYWxlaCwgOTY3NDV9LCAvLyBfX2J1aWx0aW5fczM5MF92bWFsZWgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1hbGhiLCA5Njc2N30sIC8vIF9fYnVpbHRpbl9zMzkwX3ZtYWxoYgorICAgICAge0ludHJpbnNpYzo6czM5MF92bWFsaGYsIDk2Nzg5fSwgLy8gX19idWlsdGluX3MzOTBfdm1hbGhmCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZtYWxoaCwgOTY4MTF9LCAvLyBfX2J1aWx0aW5fczM5MF92bWFsaGgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1hbG9iLCA5NjgzM30sIC8vIF9fYnVpbHRpbl9zMzkwX3ZtYWxvYgorICAgICAge0ludHJpbnNpYzo6czM5MF92bWFsb2YsIDk2ODU1fSwgLy8gX19idWlsdGluX3MzOTBfdm1hbG9mCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZtYWxvaCwgOTY4Nzd9LCAvLyBfX2J1aWx0aW5fczM5MF92bWFsb2gKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1hb2IsIDk2ODk5fSwgLy8gX19idWlsdGluX3MzOTBfdm1hb2IKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1hb2YsIDk2OTIwfSwgLy8gX19idWlsdGluX3MzOTBfdm1hb2YKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1hb2gsIDk2OTQxfSwgLy8gX19idWlsdGluX3MzOTBfdm1hb2gKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1lYiwgOTY5NjJ9LCAvLyBfX2J1aWx0aW5fczM5MF92bWViCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZtZWYsIDk2OTgyfSwgLy8gX19idWlsdGluX3MzOTBfdm1lZgorICAgICAge0ludHJpbnNpYzo6czM5MF92bWVoLCA5NzAwMn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZtZWgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1oYiwgOTcwMjJ9LCAvLyBfX2J1aWx0aW5fczM5MF92bWhiCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZtaGYsIDk3MDQyfSwgLy8gX19idWlsdGluX3MzOTBfdm1oZgorICAgICAge0ludHJpbnNpYzo6czM5MF92bWhoLCA5NzA2Mn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZtaGgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1sZWIsIDk3MDgyfSwgLy8gX19idWlsdGluX3MzOTBfdm1sZWIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1sZWYsIDk3MTAzfSwgLy8gX19idWlsdGluX3MzOTBfdm1sZWYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1sZWgsIDk3MTI0fSwgLy8gX19idWlsdGluX3MzOTBfdm1sZWgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1saGIsIDk3MTQ1fSwgLy8gX19idWlsdGluX3MzOTBfdm1saGIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1saGYsIDk3MTY2fSwgLy8gX19idWlsdGluX3MzOTBfdm1saGYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1saGgsIDk3MTg3fSwgLy8gX19idWlsdGluX3MzOTBfdm1saGgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1sb2IsIDk3MjA4fSwgLy8gX19idWlsdGluX3MzOTBfdm1sb2IKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1sb2YsIDk3MjI5fSwgLy8gX19idWlsdGluX3MzOTBfdm1sb2YKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1sb2gsIDk3MjUwfSwgLy8gX19idWlsdGluX3MzOTBfdm1sb2gKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1vYiwgOTcyNzF9LCAvLyBfX2J1aWx0aW5fczM5MF92bW9iCisgICAgICB7SW50cmluc2ljOjpzMzkwX3Ztb2YsIDk3MjkxfSwgLy8gX19idWlsdGluX3MzOTBfdm1vZgorICAgICAge0ludHJpbnNpYzo6czM5MF92bW9oLCA5NzMxMX0sIC8vIF9fYnVpbHRpbl9zMzkwX3Ztb2gKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1zbGcsIDk3MzMxfSwgLy8gX19idWlsdGluX3MzOTBfdm1zbGcKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnBkaSwgOTczNTJ9LCAvLyBfX2J1aWx0aW5fczM5MF92cGRpCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZwZXJtLCA5NzM3Mn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZwZXJtCisgICAgICB7SW50cmluc2ljOjpzMzkwX3Zwa2xzZiwgOTczOTN9LCAvLyBfX2J1aWx0aW5fczM5MF92cGtsc2YKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnBrbHNnLCA5NzQxNX0sIC8vIF9fYnVpbHRpbl9zMzkwX3Zwa2xzZworICAgICAge0ludHJpbnNpYzo6czM5MF92cGtsc2gsIDk3NDM3fSwgLy8gX19idWlsdGluX3MzOTBfdnBrbHNoCisgICAgICB7SW50cmluc2ljOjpzMzkwX3Zwa3NmLCA5NzQ1OX0sIC8vIF9fYnVpbHRpbl9zMzkwX3Zwa3NmCisgICAgICB7SW50cmluc2ljOjpzMzkwX3Zwa3NnLCA5NzQ4MH0sIC8vIF9fYnVpbHRpbl9zMzkwX3Zwa3NnCisgICAgICB7SW50cmluc2ljOjpzMzkwX3Zwa3NoLCA5NzUwMX0sIC8vIF9fYnVpbHRpbl9zMzkwX3Zwa3NoCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzYmNiaXEsIDk3NTIyfSwgLy8gX19idWlsdGluX3MzOTBfdnNiY2JpcQorICAgICAge0ludHJpbnNpYzo6czM5MF92c2JpcSwgOTc1NDV9LCAvLyBfX2J1aWx0aW5fczM5MF92c2JpcQorICAgICAge0ludHJpbnNpYzo6czM5MF92c2NiaWIsIDk3NTY2fSwgLy8gX19idWlsdGluX3MzOTBfdnNjYmliCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzY2JpZiwgOTc1ODh9LCAvLyBfX2J1aWx0aW5fczM5MF92c2NiaWYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnNjYmlnLCA5NzYxMH0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzY2JpZworICAgICAge0ludHJpbnNpYzo6czM5MF92c2NiaWgsIDk3NjMyfSwgLy8gX19idWlsdGluX3MzOTBfdnNjYmloCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzY2JpcSwgOTc2NTR9LCAvLyBfX2J1aWx0aW5fczM5MF92c2NiaXEKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnNsLCA5NzY3Nn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzbAorICAgICAge0ludHJpbnNpYzo6czM5MF92c2xiLCA5NzY5NX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzbGIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnNsZGIsIDk3NzE1fSwgLy8gX19idWlsdGluX3MzOTBfdnNsZGIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnNxLCA5NzczNn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzcQorICAgICAge0ludHJpbnNpYzo6czM5MF92c3JhLCA5Nzc1NX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzcmEKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnNyYWIsIDk3Nzc1fSwgLy8gX19idWlsdGluX3MzOTBfdnNyYWIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnNybCwgOTc3OTZ9LCAvLyBfX2J1aWx0aW5fczM5MF92c3JsCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzcmxiLCA5NzgxNn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzcmxiCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzdGwsIDk3ODM3fSwgLy8gX19idWlsdGluX3MzOTBfdnN0bAorICAgICAge0ludHJpbnNpYzo6czM5MF92c3RyY2IsIDk3ODU3fSwgLy8gX19idWlsdGluX3MzOTBfdnN0cmNiCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzdHJjZiwgOTc4Nzl9LCAvLyBfX2J1aWx0aW5fczM5MF92c3RyY2YKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnN0cmNoLCA5NzkwMX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzdHJjaAorICAgICAge0ludHJpbnNpYzo6czM5MF92c3RyY3piLCA5NzkyM30sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzdHJjemIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnN0cmN6ZiwgOTc5NDZ9LCAvLyBfX2J1aWx0aW5fczM5MF92c3RyY3pmCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzdHJjemgsIDk3OTY5fSwgLy8gX19idWlsdGluX3MzOTBfdnN0cmN6aAorICAgICAge0ludHJpbnNpYzo6czM5MF92c3RybCwgOTc5OTJ9LCAvLyBfX2J1aWx0aW5fczM5MF92c3RybAorICAgICAge0ludHJpbnNpYzo6czM5MF92c3VtYiwgOTgwMTN9LCAvLyBfX2J1aWx0aW5fczM5MF92c3VtYgorICAgICAge0ludHJpbnNpYzo6czM5MF92c3VtZ2YsIDk4MDM0fSwgLy8gX19idWlsdGluX3MzOTBfdnN1bWdmCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzdW1naCwgOTgwNTZ9LCAvLyBfX2J1aWx0aW5fczM5MF92c3VtZ2gKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnN1bWgsIDk4MDc4fSwgLy8gX19idWlsdGluX3MzOTBfdnN1bWgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnN1bXFmLCA5ODA5OX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzdW1xZgorICAgICAge0ludHJpbnNpYzo6czM5MF92c3VtcWcsIDk4MTIxfSwgLy8gX19idWlsdGluX3MzOTBfdnN1bXFnCisgICAgICB7SW50cmluc2ljOjpzMzkwX3Z0bSwgOTgxNDN9LCAvLyBfX2J1aWx0aW5fczM5MF92dG0KKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnVwaGIsIDk4MTYyfSwgLy8gX19idWlsdGluX3MzOTBfdnVwaGIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnVwaGYsIDk4MTgzfSwgLy8gX19idWlsdGluX3MzOTBfdnVwaGYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnVwaGgsIDk4MjA0fSwgLy8gX19idWlsdGluX3MzOTBfdnVwaGgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnVwbGIsIDk4MjI1fSwgLy8gX19idWlsdGluX3MzOTBfdnVwbGIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnVwbGYsIDk4MjQ2fSwgLy8gX19idWlsdGluX3MzOTBfdnVwbGYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnVwbGhiLCA5ODI2N30sIC8vIF9fYnVpbHRpbl9zMzkwX3Z1cGxoYgorICAgICAge0ludHJpbnNpYzo6czM5MF92dXBsaGYsIDk4Mjg5fSwgLy8gX19idWlsdGluX3MzOTBfdnVwbGhmCisgICAgICB7SW50cmluc2ljOjpzMzkwX3Z1cGxoaCwgOTgzMTF9LCAvLyBfX2J1aWx0aW5fczM5MF92dXBsaGgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnVwbGh3LCA5ODMzM30sIC8vIF9fYnVpbHRpbl9zMzkwX3Z1cGxodworICAgICAge0ludHJpbnNpYzo6czM5MF92dXBsbGIsIDk4MzU1fSwgLy8gX19idWlsdGluX3MzOTBfdnVwbGxiCisgICAgICB7SW50cmluc2ljOjpzMzkwX3Z1cGxsZiwgOTgzNzd9LCAvLyBfX2J1aWx0aW5fczM5MF92dXBsbGYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnVwbGxoLCA5ODM5OX0sIC8vIF9fYnVpbHRpbl9zMzkwX3Z1cGxsaAorICAgICAge0ludHJpbnNpYzo6czM5MF90ZW5kLCA5MzU2NH0sIC8vIF9fYnVpbHRpbl90ZW5kCisgICAgICB7SW50cmluc2ljOjpzMzkwX3BwYV90eGFzc2lzdCwgOTUxOTZ9LCAvLyBfX2J1aWx0aW5fdHhfYXNzaXN0CisgICAgICB7SW50cmluc2ljOjpzMzkwX2V0bmQsIDk1MTQ5fSwgLy8gX19idWlsdGluX3R4X25lc3RpbmdfZGVwdGgKKyAgICB9OworICAgIGF1dG8gSSA9IHN0ZDo6bG93ZXJfYm91bmQoc3RkOjpiZWdpbihzMzkwTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjplbmQoczM5ME5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5OYW1lU3RyKTsKKyAgICBpZiAoSSAhPSBzdGQ6OmVuZChzMzkwTmFtZXMpICYmCisgICAgICAgIEktPmdldE5hbWUoKSA9PSBCdWlsdGluTmFtZVN0cikKKyAgICAgIHJldHVybiBJLT5JbnRyaW5JRDsKKyAgfQorICBpZiAoVGFyZ2V0UHJlZml4ID09ICJ4ODYiKSB7CisgICAgc3RhdGljIGNvbnN0IEJ1aWx0aW5FbnRyeSB4ODZOYW1lc1tdID0geworICAgICAge0ludHJpbnNpYzo6eDg2X2FkZGNhcnJ5X3UzMiwgOTg5Mjl9LCAvLyBfX2J1aWx0aW5faWEzMl9hZGRjYXJyeV91MzIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hZGRjYXJyeV91NjQsIDk4OTU3fSwgLy8gX19idWlsdGluX2lhMzJfYWRkY2FycnlfdTY0CisgICAgICB7SW50cmluc2ljOjp4ODZfYWRkY2Fycnl4X3UzMiwgOTg5ODV9LCAvLyBfX2J1aWx0aW5faWEzMl9hZGRjYXJyeXhfdTMyCisgICAgICB7SW50cmluc2ljOjp4ODZfYWRkY2Fycnl4X3U2NCwgOTkwMTR9LCAvLyBfX2J1aWx0aW5faWEzMl9hZGRjYXJyeXhfdTY0CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfYWRkX3BkXzUxMiwgMTA0NTY2fSwgLy8gX19idWlsdGluX2lhMzJfYWRkcGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2FkZF9wc181MTIsIDEwNDU5NX0sIC8vIF9fYnVpbHRpbl9pYTMyX2FkZHBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19hZGRfc2Rfcm91bmQsIDEwNDYyNH0sIC8vIF9fYnVpbHRpbl9pYTMyX2FkZHNkX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19hZGRfc3Nfcm91bmQsIDEwNDY1Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX2FkZHNzX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UzX2FkZHN1Yl9wZCwgMTM1MDU2fSwgLy8gX19idWlsdGluX2lhMzJfYWRkc3VicGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfYWRkc3ViX3BkXzI1NiwgOTk0MjZ9LCAvLyBfX2J1aWx0aW5faWEzMl9hZGRzdWJwZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTNfYWRkc3ViX3BzLCAxMzUwODB9LCAvLyBfX2J1aWx0aW5faWEzMl9hZGRzdWJwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9hZGRzdWJfcHNfMjU2LCA5OTQ1M30sIC8vIF9fYnVpbHRpbl9pYTMyX2FkZHN1YnBzMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYWVzbmlfYWVzZGVjLCA5OTA0M30sIC8vIF9fYnVpbHRpbl9pYTMyX2Flc2RlYzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2Flc25pX2Flc2RlY18yNTYsIDk5MDY4fSwgLy8gX19idWlsdGluX2lhMzJfYWVzZGVjMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYWVzbmlfYWVzZGVjXzUxMiwgOTkwOTN9LCAvLyBfX2J1aWx0aW5faWEzMl9hZXNkZWM1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hZXNuaV9hZXNkZWNsYXN0LCA5OTExOH0sIC8vIF9fYnVpbHRpbl9pYTMyX2Flc2RlY2xhc3QxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hZXNuaV9hZXNkZWNsYXN0XzI1NiwgOTkxNDd9LCAvLyBfX2J1aWx0aW5faWEzMl9hZXNkZWNsYXN0MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYWVzbmlfYWVzZGVjbGFzdF81MTIsIDk5MTc2fSwgLy8gX19idWlsdGluX2lhMzJfYWVzZGVjbGFzdDUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X2Flc25pX2Flc2VuYywgOTkyMDV9LCAvLyBfX2J1aWx0aW5faWEzMl9hZXNlbmMxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hZXNuaV9hZXNlbmNfMjU2LCA5OTIzMH0sIC8vIF9fYnVpbHRpbl9pYTMyX2Flc2VuYzI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2Flc25pX2Flc2VuY181MTIsIDk5MjU1fSwgLy8gX19idWlsdGluX2lhMzJfYWVzZW5jNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfYWVzbmlfYWVzZW5jbGFzdCwgOTkyODB9LCAvLyBfX2J1aWx0aW5faWEzMl9hZXNlbmNsYXN0MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYWVzbmlfYWVzZW5jbGFzdF8yNTYsIDk5MzA5fSwgLy8gX19idWlsdGluX2lhMzJfYWVzZW5jbGFzdDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2Flc25pX2Flc2VuY2xhc3RfNTEyLCA5OTMzOH0sIC8vIF9fYnVpbHRpbl9pYTMyX2Flc2VuY2xhc3Q1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hZXNuaV9hZXNpbWMsIDk5MzY3fSwgLy8gX19idWlsdGluX2lhMzJfYWVzaW1jMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYWVzbmlfYWVza2V5Z2VuYXNzaXN0LCA5OTM5Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX2Flc2tleWdlbmFzc2lzdDEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2JtaV9iZXh0cl8zMiwgMTI5MzI0fSwgLy8gX19idWlsdGluX2lhMzJfYmV4dHJfdTMyCisgICAgICB7SW50cmluc2ljOjp4ODZfYm1pX2JleHRyXzY0LCAxMjkzNDl9LCAvLyBfX2J1aWx0aW5faWEzMl9iZXh0cl91NjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl90Ym1fYmV4dHJpX3UzMiwgMTM2OTU4fSwgLy8gX19idWlsdGluX2lhMzJfYmV4dHJpX3UzMgorICAgICAge0ludHJpbnNpYzo6eDg2X3RibV9iZXh0cmlfdTY0LCAxMzY5ODR9LCAvLyBfX2J1aWx0aW5faWEzMl9iZXh0cmlfdTY0CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDFfYmxlbmR2cGQsIDEzNTI1N30sIC8vIF9fYnVpbHRpbl9pYTMyX2JsZW5kdnBkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X2JsZW5kdl9wZF8yNTYsIDk5NDgwfSwgLy8gX19idWlsdGluX2lhMzJfYmxlbmR2cGQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0MV9ibGVuZHZwcywgMTM1MjgxfSwgLy8gX19idWlsdGluX2lhMzJfYmxlbmR2cHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfYmxlbmR2X3BzXzI1NiwgOTk1MDd9LCAvLyBfX2J1aWx0aW5faWEzMl9ibGVuZHZwczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9icm9hZGNhc3RtYl8xMjgsIDEwMzExOH0sIC8vIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdG1iMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2Jyb2FkY2FzdG1iXzI1NiwgMTAzMTQ4fSwgLy8gX19idWlsdGluX2lhMzJfYnJvYWRjYXN0bWIyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfYnJvYWRjYXN0bWJfNTEyLCAxMDMxNzh9LCAvLyBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RtYjUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9icm9hZGNhc3Rtd18xMjgsIDEwMzIwOH0sIC8vIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdG13MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2Jyb2FkY2FzdG13XzI1NiwgMTAzMjM4fSwgLy8gX19idWlsdGluX2lhMzJfYnJvYWRjYXN0bXcyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfYnJvYWRjYXN0bXdfNTEyLCAxMDMyNjh9LCAvLyBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RtdzUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X2JtaV9iemhpXzY0LCAxMjkzOTd9LCAvLyBfX2J1aWx0aW5faWEzMl9iemhpX2RpCisgICAgICB7SW50cmluc2ljOjp4ODZfYm1pX2J6aGlfMzIsIDEyOTM3NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2J6aGlfc2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX2NsZmx1c2gsIDEzMzM2OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2NsZmx1c2gKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9jbGZsdXNob3B0LCAxMjk1MTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9jbGZsdXNob3B0CisgICAgICB7SW50cmluc2ljOjp4ODZfY2xyc3Nic3ksIDEyOTUzOH0sIC8vIF9fYnVpbHRpbl9pYTMyX2NscnNzYnN5CisgICAgICB7SW50cmluc2ljOjp4ODZfY2x3YiwgMTI5NTYyfSwgLy8gX19idWlsdGluX2lhMzJfY2x3YgorICAgICAge0ludHJpbnNpYzo6eDg2X2NsemVybywgMTI5NTgyfSwgLy8gX19idWlsdGluX2lhMzJfY2x6ZXJvCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9jbXBfc2QsIDEzMzM5Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX2NtcHNkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY21wX3NkLCAxMDQ2ODh9LCAvLyBfX2J1aWx0aW5faWEzMl9jbXBzZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlX2NtcF9zcywgMTMyNTQ0fSwgLy8gX19idWlsdGluX2lhMzJfY21wc3MKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jbXBfc3MsIDEwNDcxNH0sIC8vIF9fYnVpbHRpbl9pYTMyX2NtcHNzX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfY29taWVxX3NzLCAxMzI1NjV9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21pZXEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfY29taWdlX3NzLCAxMzI1ODd9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21pZ2UKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfY29taWd0X3NzLCAxMzI2MDl9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21pZ3QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfY29taWxlX3NzLCAxMzI2MzF9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21pbGUKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfY29taWx0X3NzLCAxMzI2NTN9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21pbHQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfY29taW5lcV9zcywgMTMyNjc1fSwgLy8gX19idWlsdGluX2lhMzJfY29taW5lcQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfY29taWVxX3NkLCAxMzM0MTN9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21pc2RlcQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfY29taWdlX3NkLCAxMzM0Mzd9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21pc2RnZQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfY29taWd0X3NkLCAxMzM0NjF9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21pc2RndAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfY29taWxlX3NkLCAxMzM0ODV9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21pc2RsZQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfY29taWx0X3NkLCAxMzM1MDl9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21pc2RsdAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfY29taW5lcV9zZCwgMTMzNTMzfSwgLy8gX19idWlsdGluX2lhMzJfY29taXNkbmVxCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfcGRfMTI4LCAxMDQ5NDR9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21wcmVzc2RmMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19wZF8yNTYsIDEwNDk3OH0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzZGYyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3BkXzUxMiwgMTA1MDEyfSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NkZjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfcV8xMjgsIDEwNTE0OH0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzZGkxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3FfMjU2LCAxMDUxODJ9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21wcmVzc2RpMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19xXzUxMiwgMTA1MjE2fSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NkaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfd18xMjgsIDEwNTk1Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzaGkxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3dfMjU2LCAxMDU5ODZ9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21wcmVzc2hpMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc193XzUxMiwgMTA2MDIwfSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NoaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfYl8xMjgsIDEwNDc0MH0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzcWkxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX2JfMjU2LCAxMDQ3NzR9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3FpMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19iXzUxMiwgMTA0ODA4fSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NxaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfcHNfMTI4LCAxMDUwNDZ9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3NmMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19wc18yNTYsIDEwNTA4MH0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc2YyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3BzXzUxMiwgMTA1MTE0fSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzZjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfZF8xMjgsIDEwNDg0Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc2kxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX2RfMjU2LCAxMDQ4NzZ9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3NpMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19kXzUxMiwgMTA0OTEwfSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcGRfMTI4LCAxMDU0ODR9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3JlZGYxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3N0b3JlX3BkXzI1NiwgMTA1NTIzfSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWRmMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9wZF81MTIsIDEwNTU2Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVkZjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcV8xMjgsIDEwNTcxOH0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVkaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcV8yNTYsIDEwNTc1N30sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVkaTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcV81MTIsIDEwNTc5Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVkaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfd18xMjgsIDEwNTgzNX0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVoaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfd18yNTYsIDEwNTg3NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVoaTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfd181MTIsIDEwNTkxM30sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVoaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfYl8xMjgsIDEwNTI1MH0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVxaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfYl8yNTYsIDEwNTI4OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVxaTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfYl81MTIsIDEwNTMyOH0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVxaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcHNfMTI4LCAxMDU2MDF9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3Jlc2YxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3N0b3JlX3BzXzI1NiwgMTA1NjQwfSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXNmMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9wc181MTIsIDEwNTY3OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVzZjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfZF8xMjgsIDEwNTM2N30sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVzaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfZF8yNTYsIDEwNTQwNn0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVzaTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfZF81MTIsIDEwNTQ0NX0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVzaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDJfY3JjMzJfNjRfNjQsIDEzNTc0NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2NyYzMyZGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0Ml9jcmMzMl8zMl8xNiwgMTM1Njc1fSwgLy8gX19idWlsdGluX2lhMzJfY3JjMzJoaQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQyX2NyYzMyXzMyXzgsIDEzNTcyMX0sIC8vIF9fYnVpbHRpbl9pYTMyX2NyYzMycWkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0Ml9jcmMzMl8zMl8zMiwgMTM1Njk4fSwgLy8gX19idWlsdGluX2lhMzJfY3JjMzJzaQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfY3Z0ZHEycHMsIDEzMzU1OH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dGRxMnBzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X2N2dGRxMl9wc18yNTYsIDk5NjE1fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0ZHEycHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRkcTJwc181MTIsIDEwNjI3Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dGRxMnBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX2N2dHBkMmRxLCAxMzM1ODJ9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwZDJkcQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHBkMmRxXzEyOCwgMTA2MzA4fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cGQyZHExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9jdnRfcGQyZHFfMjU2LCA5OTU2MX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBkMmRxMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cGQyZHFfNTEyLCAxMDYzNDB9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwZDJkcTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlX2N2dHBkMnBpLCAxMzI2OTh9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwZDJwaQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfY3Z0cGQycHMsIDEzMzYwNn0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnBzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X2N2dF9wZDJfcHNfMjU2LCA5OTUzNH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnBzMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cGQycHNfNTEyLCAxMDY0MDF9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwZDJwczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cGQycHMsIDEwNjM3Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnBzX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwZDJxcV8xMjgsIDEwNjQzM30sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnFxMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwZDJxcV8yNTYsIDEwNjQ2NX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnFxMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwZDJxcV81MTIsIDEwNjQ5N30sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnFxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwZDJ1ZHFfMTI4LCAxMDY1Mjl9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwZDJ1ZHExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHBkMnVkcV8yNTYsIDEwNjU2Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnVkcTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cGQydWRxXzUxMiwgMTA2NTk1fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cGQydWRxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwZDJ1cXFfMTI4LCAxMDY2Mjh9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwZDJ1cXExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHBkMnVxcV8yNTYsIDEwNjY2MX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnVxcTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cGQydXFxXzUxMiwgMTA2Njk0fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cGQydXFxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfY3Z0cGkycGQsIDEzMjcyMn0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBpMnBkCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlX2N2dHBpMnBzLCAxMzI3NDZ9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwaTJwcworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfY3Z0cHMyZHEsIDEzMzYzMH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBzMmRxCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cHMyZHFfMTI4LCAxMDY3Mjd9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwczJkcTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X2N2dF9wczJkcV8yNTYsIDk5NTg4fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cHMyZHEyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwczJkcV8yNTYsIDEwNjc1OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBzMmRxMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwczJkcV81MTIsIDEwNjc5MX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBzMmRxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwczJwZF81MTIsIDEwNjgyM30sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnBkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfY3Z0cHMycGksIDEzMjc3MH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnBpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cHMycXFfMTI4LCAxMDY4NTV9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwczJxcTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cHMycXFfMjU2LCAxMDY4ODd9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwczJxcTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cHMycXFfNTEyLCAxMDY5MTl9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwczJxcTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cHMydWRxXzEyOCwgMTA2OTUxfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cHMydWRxMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwczJ1ZHFfMjU2LCAxMDY5ODR9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwczJ1ZHEyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHBzMnVkcV81MTIsIDEwNzAxN30sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnVkcTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cHMydXFxXzEyOCwgMTA3MDUwfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cHMydXFxMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwczJ1cXFfMjU2LCAxMDcwODN9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwczJ1cXEyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHBzMnVxcV81MTIsIDEwNzExNn0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnVxcTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cXEycGRfMTI4LCAxMDcxNDl9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRxcTJwZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cXEycGRfMjU2LCAxMDcxODF9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRxcTJwZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cXEycGRfNTEyLCAxMDcyMTN9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRxcTJwZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cXEycHNfMTI4LCAxMDcyNDV9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRxcTJwczEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cXEycHNfMjU2LCAxMDcyNzd9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRxcTJwczI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cXEycHNfNTEyLCAxMDczMDl9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRxcTJwczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9jdnRzZDJzaSwgMTMzNjU0fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0c2Qyc2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX2N2dHNkMnNpNjQsIDEzMzY3OH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHNkMnNpNjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX2N2dHNkMnNzLCAxMzM3MDR9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRzZDJzcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHNkMnNzX3JvdW5kLCAxMDczNDF9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRzZDJzc19yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2N2dHNpMnNkNjQsIDEwMzI5OH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHNpMnNkNjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfY3Z0c2kyc3MzMiwgMTAzMzI0fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0c2kyc3MzMgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9jdnRzaTJzczY0LCAxMDMzNTB9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRzaTJzczY0CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0c3Myc2Rfcm91bmQsIDEwNzM3Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHNzMnNkX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfY3Z0c3Myc2ksIDEzMjc5NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHNzMnNpCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlX2N2dHNzMnNpNjQsIDEzMjgxOH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHNzMnNpNjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX2N2dHRwZDJkcSwgMTMzNzI4fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBkMmRxCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMmRxXzEyOCwgMTA3NDExfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBkMmRxMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfY3Z0dF9wZDJkcV8yNTYsIDk5NjQyfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBkMmRxMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMmRxXzUxMiwgMTA3NDQ0fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBkMmRxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfY3Z0dHBkMnBpLCAxMzI4NDR9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cGQycGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR0cGQycXFfMTI4LCAxMDc0Nzd9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cGQycXExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJxcV8yNTYsIDEwNzUxMH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJxcTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMnFxXzUxMiwgMTA3NTQzfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBkMnFxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR0cGQydWRxXzEyOCwgMTA3NTc2fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBkMnVkcTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMnVkcV8yNTYsIDEwNzYxMH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1ZHEyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJ1ZHFfNTEyLCAxMDc2NDR9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cGQydWRxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR0cGQydXFxXzEyOCwgMTA3Njc4fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBkMnVxcTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMnVxcV8yNTYsIDEwNzcxMn0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1cXEyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJ1cXFfNTEyLCAxMDc3NDZ9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cGQydXFxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX2N2dHRwczJkcSwgMTMzNzUzfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBzMmRxCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X2N2dHRfcHMyZHFfMjU2LCA5OTY3MH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJkcTI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHRwczJkcV81MTIsIDEwNzc4MH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJkcTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlX2N2dHRwczJwaSwgMTMyODY5fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBzMnBpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMnFxXzEyOCwgMTA3ODEzfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBzMnFxMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR0cHMycXFfMjU2LCAxMDc4NDZ9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cHMycXEyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHRwczJxcV81MTIsIDEwNzg3OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJxcTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMnVkcV8xMjgsIDEwNzkxMn0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1ZHExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHRwczJ1ZHFfMjU2LCAxMDc5NDZ9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cHMydWRxMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR0cHMydWRxXzUxMiwgMTA3OTgwfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBzMnVkcTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMnVxcV8xMjgsIDEwODAxNH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1cXExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHRwczJ1cXFfMjU2LCAxMDgwNDh9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cHMydXFxMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR0cHMydXFxXzUxMiwgMTA4MDgyfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBzMnVxcTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9jdnR0c2Qyc2ksIDEzMzc3OH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRzZDJzaQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfY3Z0dHNkMnNpNjQsIDEzMzgwM30sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRzZDJzaTY0CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlX2N2dHRzczJzaSwgMTMyODk0fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHNzMnNpCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlX2N2dHRzczJzaTY0LCAxMzI5MTl9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0c3Myc2k2NAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHVkcTJwc18xMjgsIDEwODExNn0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHVkcTJwczEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dWRxMnBzXzI1NiwgMTA4MTQ5fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dWRxMnBzMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR1ZHEycHNfNTEyLCAxMDgxODJ9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR1ZHEycHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHVxcTJwZF8xMjgsIDEwODIxNX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dXFxMnBkXzI1NiwgMTA4MjQ4fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dXFxMnBkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR1cXEycGRfNTEyLCAxMDgyODF9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR1cXEycGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHVxcTJwc18xMjgsIDEwODMxNH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwczEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dXFxMnBzXzI1NiwgMTA4MzQ3fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dXFxMnBzMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR1cXEycHNfNTEyLCAxMDgzODB9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR1cXEycHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9jdnR1c2kyc2QsIDEwMzYwNH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHVzaTJzZDMyCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2N2dHVzaTY0MnNkLCAxMDM2NTh9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR1c2kyc2Q2NAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9jdnR1c2kyc3MsIDEwMzYzMX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHVzaTJzczMyCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2N2dHVzaTY0MnNzLCAxMDM2ODV9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR1c2kyc3M2NAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2RicHNhZGJ3XzEyOCwgMTA4NDEzfSwgLy8gX19idWlsdGluX2lhMzJfZGJwc2FkYncxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2RicHNhZGJ3XzI1NiwgMTA4NDQ1fSwgLy8gX19idWlsdGluX2lhMzJfZGJwc2FkYncyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2RicHNhZGJ3XzUxMiwgMTA4NDc3fSwgLy8gX19idWlsdGluX2lhMzJfZGJwc2FkYnc1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2Rpdl9wZF81MTIsIDEwODUwOX0sIC8vIF9fYnVpbHRpbl9pYTMyX2RpdnBkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19kaXZfcHNfNTEyLCAxMDg1Mzh9LCAvLyBfX2J1aWx0aW5faWEzMl9kaXZwczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZGl2X3NkX3JvdW5kLCAxMDg1Njd9LCAvLyBfX2J1aWx0aW5faWEzMl9kaXZzZF9yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZGl2X3NzX3JvdW5kLCAxMDg1OTl9LCAvLyBfX2J1aWx0aW5faWEzMl9kaXZzc19yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDFfZHBwZCwgMTM1MzA1fSwgLy8gX19idWlsdGluX2lhMzJfZHBwZAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQxX2RwcHMsIDEzNTMyNX0sIC8vIF9fYnVpbHRpbl9pYTMyX2RwcHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfZHBfcHNfMjU2LCA5OTY5OH0sIC8vIF9fYnVpbHRpbl9pYTMyX2RwcHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfZW1tcywgMTMwMjk4fSwgLy8gX19idWlsdGluX2lhMzJfZW1tcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9leHAyX3BkLCAxMDM3MTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9leHAycGRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9leHAyX3BzLCAxMDM3Mzl9LCAvLyBfX2J1aWx0aW5faWEzMl9leHAycHNfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9wZF8xMjgsIDEwOTQ3MX0sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGRmMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19leHBhbmRfcGRfMjU2LCAxMDk1MDN9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRkZjI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3BkXzUxMiwgMTA5NTM1fSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kZGY1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9xXzEyOCwgMTA5NjYzfSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kZGkxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9xXzI1NiwgMTA5Njk1fSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kZGkyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9xXzUxMiwgMTA5NzI3fSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kZGk1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF93XzEyOCwgMTA5NzU5fSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kaGkxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF93XzI1NiwgMTA5NzkxfSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kaGkyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF93XzUxMiwgMTA5ODIzfSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kaGk1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3BkXzEyOCwgMTA5MDM5fSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZGRmMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9wZF8yNTYsIDEwOTA3NX0sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRkZjI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfcGRfNTEyLCAxMDkxMTF9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkZGY1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3FfMTI4LCAxMDkyNTV9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkZGkxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3FfMjU2LCAxMDkyOTF9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkZGkyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3FfNTEyLCAxMDkzMjd9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkZGk1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3dfMTI4LCAxMDkzNjN9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkaGkxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3dfMjU2LCAxMDkzOTl9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkaGkyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3dfNTEyLCAxMDk0MzV9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkaGk1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX2JfMTI4LCAxMDg4MjN9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkcWkxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX2JfMjU2LCAxMDg4NTl9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkcWkyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX2JfNTEyLCAxMDg4OTV9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkcWk1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3BzXzEyOCwgMTA5MTQ3fSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZHNmMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9wc18yNTYsIDEwOTE4M30sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRzZjI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfcHNfNTEyLCAxMDkyMTl9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2Fkc2Y1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX2RfMTI4LCAxMDg5MzF9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2Fkc2kxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX2RfMjU2LCAxMDg5Njd9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2Fkc2kyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX2RfNTEyLCAxMDkwMDN9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2Fkc2k1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9iXzEyOCwgMTA4NjMxfSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kcWkxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9iXzI1NiwgMTA4NjYzfSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kcWkyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9iXzUxMiwgMTA4Njk1fSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kcWk1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9wc18xMjgsIDEwOTU2N30sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZHNmMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19leHBhbmRfcHNfMjU2LCAxMDk1OTl9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRzZjI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3BzXzUxMiwgMTA5NjMxfSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kc2Y1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9kXzEyOCwgMTA4NzI3fSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kc2kxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9kXzI1NiwgMTA4NzU5fSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kc2kyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9kXzUxMiwgMTA4NzkxfSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kc2k1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTRhX2V4dHJxLCAxMzYxNjl9LCAvLyBfX2J1aWx0aW5faWEzMl9leHRycQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTRhX2V4dHJxaSwgMTM2MTkwfSwgLy8gX19idWlsdGluX2lhMzJfZXh0cnFpCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X2ZlbW1zLCAxMzAzMTh9LCAvLyBfX2J1aWx0aW5faWEzMl9mZW1tcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3BkXzEyOCwgMTA5ODU1fSwgLy8gX19idWlsdGluX2lhMzJfZml4dXBpbW1wZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3BkXzEyOCwgMTIzMzU3fSwgLy8gX19idWlsdGluX2lhMzJfZml4dXBpbW1wZDEyOF9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3BkXzI1NiwgMTA5ODg5fSwgLy8gX19idWlsdGluX2lhMzJfZml4dXBpbW1wZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3BkXzI1NiwgMTIzMzkyfSwgLy8gX19idWlsdGluX2lhMzJfZml4dXBpbW1wZDI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3BkXzUxMiwgMTA5OTIzfSwgLy8gX19idWlsdGluX2lhMzJfZml4dXBpbW1wZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3BkXzUxMiwgMTIzNDI3fSwgLy8gX19idWlsdGluX2lhMzJfZml4dXBpbW1wZDUxMl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3BzXzEyOCwgMTA5OTU3fSwgLy8gX19idWlsdGluX2lhMzJfZml4dXBpbW1wczEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3BzXzEyOCwgMTIzNDYyfSwgLy8gX19idWlsdGluX2lhMzJfZml4dXBpbW1wczEyOF9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3BzXzI1NiwgMTA5OTkxfSwgLy8gX19idWlsdGluX2lhMzJfZml4dXBpbW1wczI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3BzXzI1NiwgMTIzNDk3fSwgLy8gX19idWlsdGluX2lhMzJfZml4dXBpbW1wczI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3BzXzUxMiwgMTEwMDI1fSwgLy8gX19idWlsdGluX2lhMzJfZml4dXBpbW1wczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3BzXzUxMiwgMTIzNTMyfSwgLy8gX19idWlsdGluX2lhMzJfZml4dXBpbW1wczUxMl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3NkLCAxMTAwNTl9LCAvLyBfX2J1aWx0aW5faWEzMl9maXh1cGltbXNkX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fc2QsIDEyMzU2N30sIC8vIF9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tc2RfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19maXh1cGltbV9zcywgMTEwMDkwfSwgLy8gX19idWlsdGluX2lhMzJfZml4dXBpbW1zc19tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3NzLCAxMjM1OTl9LCAvLyBfX2J1aWx0aW5faWEzMl9maXh1cGltbXNzX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZnBjbGFzc19wZF8xMjgsIDExMDEyMX0sIC8vIF9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NwZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZnBjbGFzc19wZF8yNTYsIDExMDE1NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NwZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZnBjbGFzc19wZF81MTIsIDExMDE4N30sIC8vIF9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NwZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZnBjbGFzc19wc18xMjgsIDExMDIyMH0sIC8vIF9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NwczEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZnBjbGFzc19wc18yNTYsIDExMDI1M30sIC8vIF9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NwczI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZnBjbGFzc19wc181MTIsIDExMDI4Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NwczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZnBjbGFzc19zZCwgMTEwMzE5fSwgLy8gX19idWlsdGluX2lhMzJfZnBjbGFzc3NkX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19mcGNsYXNzX3NzLCAxMTAzNDl9LCAvLyBfX2J1aWx0aW5faWEzMl9mcGNsYXNzc3NfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2Z4cnN0b3IsIDEzMDA0MH0sIC8vIF9fYnVpbHRpbl9pYTMyX2Z4cnN0b3IKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9meHJzdG9yNjQsIDEzMDA2M30sIC8vIF9fYnVpbHRpbl9pYTMyX2Z4cnN0b3I2NAorICAgICAge0ludHJpbnNpYzo6eDg2X2Z4c2F2ZSwgMTMwMDg4fSwgLy8gX19idWlsdGluX2lhMzJfZnhzYXZlCisgICAgICB7SW50cmluc2ljOjp4ODZfZnhzYXZlNjQsIDEzMDExMH0sIC8vIF9fYnVpbHRpbl9pYTMyX2Z4c2F2ZTY0CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcjNkaXYyX2RmLCAxMDM5OTR9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2MmRmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcjNkaXYyX2RpLCAxMDQwMjN9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2MmRpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcjNkaXY0X2RmLCAxMDQwNTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2NGRmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcjNkaXY0X2RpLCAxMDQwODF9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2NGRpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcjNkaXY0X3NmLCAxMDQxMTB9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2NHNmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcjNkaXY0X3NpLCAxMDQxMzl9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2NHNpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcjNkaXY4X3NmLCAxMDQxNjh9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2OHNmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcjNkaXY4X3NpLCAxMDQxOTd9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2OHNpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcjNzaXYyX2RmLCAxMDQyMjZ9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2MmRmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcjNzaXYyX2RpLCAxMDQyNTV9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2MmRpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcjNzaXY0X2RmLCAxMDQyODR9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2NGRmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcjNzaXY0X2RpLCAxMDQzMTN9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2NGRpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcjNzaXY0X3NmLCAxMDQzNDJ9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2NHNmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcjNzaXY0X3NpLCAxMDQzNzF9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2NHNpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcjNzaXY4X3NmLCAxMDQ0MDB9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2OHNmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcjNzaXY4X3NpLCAxMDQ0Mjl9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2OHNpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9nYXRoZXJfZF9kLCAxMDA5MzB9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJkX2QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX2dhdGhlcl9kX2RfMjU2LCAxMDA5NTV9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJkX2QyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX2dhdGhlcl9kX3BkLCAxMDA5ODN9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJkX3BkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9nYXRoZXJfZF9wZF8yNTYsIDEwMTAwOX0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcGQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX2dhdGhlcl9kX3BzLCAxMDEwMzh9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJkX3BzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9nYXRoZXJfZF9wc18yNTYsIDEwMTA2NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX2dhdGhlcl9kX3EsIDEwMTA5M30sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfZ2F0aGVyX2RfcV8yNTYsIDEwMTExOH0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcTI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9nYXRoZXJfcXBzXzUxMiwgMTAzOTY1fSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2MTZzZgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9nYXRoZXJfcXBpXzUxMiwgMTAzOTA4fSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2MTZzaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9nYXRoZXJfcXBkXzUxMiwgMTAzODgwfSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2OGRmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcl9xcHFfNTEyLCAxMDM5Mzd9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY4ZGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVycGZfZHBkXzUxMiwgMTA0NDU4fSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVycGZkcGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVycGZfZHBzXzUxMiwgMTA0NDg1fSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVycGZkcHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVycGZfcXBkXzUxMiwgMTA0NTEyfSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVycGZxcGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVycGZfcXBzXzUxMiwgMTA0NTM5fSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVycGZxcHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX2dhdGhlcl9xX2QsIDEwMTE0Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnFfZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfZ2F0aGVyX3FfZF8yNTYsIDEwMTE3MX0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnFfZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfZ2F0aGVyX3FfcGQsIDEwMTE5OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnFfcGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX2dhdGhlcl9xX3BkXzI1NiwgMTAxMjI1fSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVycV9wZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfZ2F0aGVyX3FfcHMsIDEwMTI1NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnFfcHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX2dhdGhlcl9xX3BzXzI1NiwgMTAxMjgwfSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVycV9wczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfZ2F0aGVyX3FfcSwgMTAxMzA5fSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVycV9xCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9nYXRoZXJfcV9xXzI1NiwgMTAxMzM0fSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVycV9xMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcl9kcHNfNTEyLCAxMDM4NTF9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXYxNnNmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcl9kcGlfNTEyLCAxMDM3OTR9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXYxNnNpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcl9kcGRfNTEyLCAxMDM3NjZ9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY4ZGYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyX2RwcV81MTIsIDEwMzgyM30sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjhkaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2dldGV4cF9wZF8xMjgsIDExMDM3OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2dldGV4cHBkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19nZXRleHBfcGRfMjU2LCAxMTA0MTF9LCAvLyBfX2J1aWx0aW5faWEzMl9nZXRleHBwZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3BkXzUxMiwgMTEwNDQzfSwgLy8gX19idWlsdGluX2lhMzJfZ2V0ZXhwcGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2dldGV4cF9wc18xMjgsIDExMDQ3NX0sIC8vIF9fYnVpbHRpbl9pYTMyX2dldGV4cHBzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19nZXRleHBfcHNfMjU2LCAxMTA1MDd9LCAvLyBfX2J1aWx0aW5faWEzMl9nZXRleHBwczI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3BzXzUxMiwgMTEwNTM5fSwgLy8gX19idWlsdGluX2lhMzJfZ2V0ZXhwcHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2dldGV4cF9zZCwgMTEwNTcxfSwgLy8gX19idWlsdGluX2lhMzJfZ2V0ZXhwc2QxMjhfcm91bmRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2dldGV4cF9zcywgMTEwNjA5fSwgLy8gX19idWlsdGluX2lhMzJfZ2V0ZXhwc3MxMjhfcm91bmRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfcGRfMTI4LCAxMTA2NDd9LCAvLyBfX2J1aWx0aW5faWEzMl9nZXRtYW50cGQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfcGRfMjU2LCAxMTA2ODB9LCAvLyBfX2J1aWx0aW5faWEzMl9nZXRtYW50cGQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfcGRfNTEyLCAxMTA3MTN9LCAvLyBfX2J1aWx0aW5faWEzMl9nZXRtYW50cGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfcHNfMTI4LCAxMTA3NDZ9LCAvLyBfX2J1aWx0aW5faWEzMl9nZXRtYW50cHMxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfcHNfMjU2LCAxMTA3Nzl9LCAvLyBfX2J1aWx0aW5faWEzMl9nZXRtYW50cHMyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfcHNfNTEyLCAxMTA4MTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9nZXRtYW50cHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfc2QsIDExMDg0NX0sIC8vIF9fYnVpbHRpbl9pYTMyX2dldG1hbnRzZF9yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZ2V0bWFudF9zcywgMTEwODgxfSwgLy8gX19idWlsdGluX2lhMzJfZ2V0bWFudHNzX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UzX2hhZGRfcGQsIDEzNTEwNH0sIC8vIF9fYnVpbHRpbl9pYTMyX2hhZGRwZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9oYWRkX3BkXzI1NiwgOTk3MjF9LCAvLyBfX2J1aWx0aW5faWEzMl9oYWRkcGQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UzX2hhZGRfcHMsIDEzNTEyNn0sIC8vIF9fYnVpbHRpbl9pYTMyX2hhZGRwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9oYWRkX3BzXzI1NiwgOTk3NDZ9LCAvLyBfX2J1aWx0aW5faWEzMl9oYWRkcHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UzX2hzdWJfcGQsIDEzNTE0OH0sIC8vIF9fYnVpbHRpbl9pYTMyX2hzdWJwZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9oc3ViX3BkXzI1NiwgOTk3NzF9LCAvLyBfX2J1aWx0aW5faWEzMl9oc3VicGQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UzX2hzdWJfcHMsIDEzNTE3MH0sIC8vIF9fYnVpbHRpbl9pYTMyX2hzdWJwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9oc3ViX3BzXzI1NiwgOTk3OTZ9LCAvLyBfX2J1aWx0aW5faWEzMl9oc3VicHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9pbmNzc3BkLCAxMzAxMzR9LCAvLyBfX2J1aWx0aW5faWEzMl9pbmNzc3BkCisgICAgICB7SW50cmluc2ljOjp4ODZfaW5jc3NwcSwgMTMwMTU3fSwgLy8gX19idWlsdGluX2lhMzJfaW5jc3NwcQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQxX2luc2VydHBzLCAxMzUzNDV9LCAvLyBfX2J1aWx0aW5faWEzMl9pbnNlcnRwczEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTRhX2luc2VydHEsIDEzNjIxMn0sIC8vIF9fYnVpbHRpbl9pYTMyX2luc2VydHEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0YV9pbnNlcnRxaSwgMTM2MjM1fSwgLy8gX19idWlsdGluX2lhMzJfaW5zZXJ0cWkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UzX2xkdV9kcSwgMTM1MTkyfSwgLy8gX19idWlsdGluX2lhMzJfbGRkcXUKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfbGR1X2RxXzI1NiwgOTk4MjF9LCAvLyBfX2J1aWx0aW5faWEzMl9sZGRxdTI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfbGZlbmNlLCAxMzM4MzB9LCAvLyBfX2J1aWx0aW5faWEzMl9sZmVuY2UKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9sbHdwY2IsIDEzMDE4MH0sIC8vIF9fYnVpbHRpbl9pYTMyX2xsd3BjYgorICAgICAge0ludHJpbnNpYzo6eDg2X2x3cGluczMyLCAxMzAyMDJ9LCAvLyBfX2J1aWx0aW5faWEzMl9sd3BpbnMzMgorICAgICAge0ludHJpbnNpYzo6eDg2X2x3cGluczY0LCAxMzAyMjZ9LCAvLyBfX2J1aWx0aW5faWEzMl9sd3BpbnM2NAorICAgICAge0ludHJpbnNpYzo6eDg2X2x3cHZhbDMyLCAxMzAyNTB9LCAvLyBfX2J1aWx0aW5faWEzMl9sd3B2YWwzMgorICAgICAge0ludHJpbnNpYzo6eDg2X2x3cHZhbDY0LCAxMzAyNzR9LCAvLyBfX2J1aWx0aW5faWEzMl9sd3B2YWw2NAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfbWFza2xvYWRfZCwgMTAxMzYyfSwgLy8gX19idWlsdGluX2lhMzJfbWFza2xvYWRkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9tYXNrbG9hZF9kXzI1NiwgMTAxMzg3fSwgLy8gX19idWlsdGluX2lhMzJfbWFza2xvYWRkMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X21hc2tsb2FkX3BkLCA5OTg0NX0sIC8vIF9fYnVpbHRpbl9pYTMyX21hc2tsb2FkcGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfbWFza2xvYWRfcGRfMjU2LCA5OTg3MX0sIC8vIF9fYnVpbHRpbl9pYTMyX21hc2tsb2FkcGQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfbWFza2xvYWRfcHMsIDk5OTAwfSwgLy8gX19idWlsdGluX2lhMzJfbWFza2xvYWRwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9tYXNrbG9hZF9wc18yNTYsIDk5OTI2fSwgLy8gX19idWlsdGluX2lhMzJfbWFza2xvYWRwczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfbWFza2xvYWRfcSwgMTAxNDE1fSwgLy8gX19idWlsdGluX2lhMzJfbWFza2xvYWRxCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9tYXNrbG9hZF9xXzI1NiwgMTAxNDQwfSwgLy8gX19idWlsdGluX2lhMzJfbWFza2xvYWRxMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9tYXNrbW92X2RxdSwgMTMzODUyfSwgLy8gX19idWlsdGluX2lhMzJfbWFza21vdmRxdQorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9tYXNrbW92cSwgMTMwMzM5fSwgLy8gX19idWlsdGluX2lhMzJfbWFza21vdnEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX21hc2tzdG9yZV9kLCAxMDE0Njh9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9tYXNrc3RvcmVfZF8yNTYsIDEwMTQ5NH0sIC8vIF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZWQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfbWFza3N0b3JlX3BkLCA5OTk1NX0sIC8vIF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXBkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X21hc2tzdG9yZV9wZF8yNTYsIDk5OTgyfSwgLy8gX19idWlsdGluX2lhMzJfbWFza3N0b3JlcGQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfbWFza3N0b3JlX3BzLCAxMDAwMTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9tYXNrc3RvcmVfcHNfMjU2LCAxMDAwMzl9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVwczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfbWFza3N0b3JlX3EsIDEwMTUyM30sIC8vIF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX21hc2tzdG9yZV9xXzI1NiwgMTAxNTQ5fSwgLy8gX19idWlsdGluX2lhMzJfbWFza3N0b3JlcTI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfbWF4X3BkLCAxMzM4Nzh9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXhwZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9tYXhfcGRfMjU2LCAxMDAwNjl9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXhwZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX21heF9wZF81MTIsIDExMDkxN30sIC8vIF9fYnVpbHRpbl9pYTMyX21heHBkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfbWF4X3BzLCAxMzI5NDZ9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXhwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9tYXhfcHNfMjU2LCAxMDAwOTN9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXhwczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX21heF9wc181MTIsIDExMDk0Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX21heHBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX21heF9zZCwgMTMzODk5fSwgLy8gX19idWlsdGluX2lhMzJfbWF4c2QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19tYXhfc2Rfcm91bmQsIDExMDk3NX0sIC8vIF9fYnVpbHRpbl9pYTMyX21heHNkX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfbWF4X3NzLCAxMzI5Njd9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXhzcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX21heF9zc19yb3VuZCwgMTExMDA3fSwgLy8gX19idWlsdGluX2lhMzJfbWF4c3Nfcm91bmRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfbWZlbmNlLCAxMzM5MjB9LCAvLyBfX2J1aWx0aW5faWEzMl9tZmVuY2UKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX21pbl9wZCwgMTMzOTQyfSwgLy8gX19idWlsdGluX2lhMzJfbWlucGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfbWluX3BkXzI1NiwgMTAwMTE3fSwgLy8gX19idWlsdGluX2lhMzJfbWlucGQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19taW5fcGRfNTEyLCAxMTEwMzl9LCAvLyBfX2J1aWx0aW5faWEzMl9taW5wZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlX21pbl9wcywgMTMyOTg4fSwgLy8gX19idWlsdGluX2lhMzJfbWlucHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfbWluX3BzXzI1NiwgMTAwMTQxfSwgLy8gX19idWlsdGluX2lhMzJfbWlucHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19taW5fcHNfNTEyLCAxMTEwNjh9LCAvLyBfX2J1aWx0aW5faWEzMl9taW5wczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9taW5fc2QsIDEzMzk2M30sIC8vIF9fYnVpbHRpbl9pYTMyX21pbnNkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfbWluX3NkX3JvdW5kLCAxMTEwOTd9LCAvLyBfX2J1aWx0aW5faWEzMl9taW5zZF9yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlX21pbl9zcywgMTMzMDA5fSwgLy8gX19idWlsdGluX2lhMzJfbWluc3MKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19taW5fc3Nfcm91bmQsIDExMTEyOX0sIC8vIF9fYnVpbHRpbl9pYTMyX21pbnNzX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UzX21vbml0b3IsIDEzNTIxM30sIC8vIF9fYnVpbHRpbl9pYTMyX21vbml0b3IKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tb25pdG9yeCwgMTMxODg1fSwgLy8gX19idWlsdGluX2lhMzJfbW9uaXRvcngKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX21vdm1za19wZCwgMTMzOTg0fSwgLy8gX19idWlsdGluX2lhMzJfbW92bXNrcGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfbW92bXNrX3BkXzI1NiwgMTAwMTY1fSwgLy8gX19idWlsdGluX2lhMzJfbW92bXNrcGQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfbW92bXNrX3BzLCAxMzMwMzB9LCAvLyBfX2J1aWx0aW5faWEzMl9tb3Ztc2twcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9tb3Ztc2tfcHNfMjU2LCAxMDAxOTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9tb3Ztc2twczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9tb3ZudF9kcSwgMTMwMzYzfSwgLy8gX19idWlsdGluX2lhMzJfbW92bnRxCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDFfbXBzYWRidywgMTM1MzcyfSwgLy8gX19idWlsdGluX2lhMzJfbXBzYWRidzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfbXBzYWRidywgMTAxNTc4fSwgLy8gX19idWlsdGluX2lhMzJfbXBzYWRidzI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX211bF9wZF81MTIsIDExMTE2MX0sIC8vIF9fYnVpbHRpbl9pYTMyX211bHBkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19tdWxfcHNfNTEyLCAxMTExOTB9LCAvLyBfX2J1aWx0aW5faWEzMl9tdWxwczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfbXVsX3NkX3JvdW5kLCAxMTEyMTl9LCAvLyBfX2J1aWx0aW5faWEzMl9tdWxzZF9yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfbXVsX3NzX3JvdW5kLCAxMTEyNTF9LCAvLyBfX2J1aWx0aW5faWEzMl9tdWxzc19yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlM19td2FpdCwgMTM1MjM2fSwgLy8gX19idWlsdGluX2lhMzJfbXdhaXQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9td2FpdHgsIDEzMTkwOX0sIC8vIF9fYnVpbHRpbl9pYTMyX213YWl0eAorICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BhYnNfYiwgMTM2MjU5fSwgLy8gX19idWlsdGluX2lhMzJfcGFic2IKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19wYWJzX2QsIDEzNjI4MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhYnNkCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NzZTNfcGFic193LCAxMzYzMDF9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWJzdworICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wYWNrc3NkdywgMTMwMzg1fSwgLy8gX19idWlsdGluX2lhMzJfcGFja3NzZHcKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BhY2tzc2R3XzEyOCwgMTM0MDA4fSwgLy8gX19idWlsdGluX2lhMzJfcGFja3NzZHcxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BhY2tzc2R3LCAxMDE2MDR9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWNrc3NkdzI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wYWNrc3Nkd181MTIsIDEyNjE4M30sIC8vIF9fYnVpbHRpbl9pYTMyX3BhY2tzc2R3NTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BhY2tzc3diLCAxMzA0MDl9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWNrc3N3YgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcGFja3Nzd2JfMTI4LCAxMzQwMzV9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWNrc3N3YjEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcGFja3Nzd2IsIDEwMTYzMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhY2tzc3diMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BhY2tzc3diXzUxMiwgMTI2MjEwfSwgLy8gX19idWlsdGluX2lhMzJfcGFja3Nzd2I1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0MV9wYWNrdXNkdywgMTM1Mzk4fSwgLy8gX19idWlsdGluX2lhMzJfcGFja3VzZHcxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BhY2t1c2R3LCAxMDE2NTh9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWNrdXNkdzI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wYWNrdXNkd181MTIsIDEyNjIzN30sIC8vIF9fYnVpbHRpbl9pYTMyX3BhY2t1c2R3NTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BhY2t1c3diLCAxMzA0MzN9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWNrdXN3YgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcGFja3Vzd2JfMTI4LCAxMzQwNjJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWNrdXN3YjEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcGFja3Vzd2IsIDEwMTY4NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhY2t1c3diMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BhY2t1c3diXzUxMiwgMTI2MjY0fSwgLy8gX19idWlsdGluX2lhMzJfcGFja3Vzd2I1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcGFkZF9iLCAxMzA0NTd9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWRkYgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wYWRkX2QsIDEzMDQ3OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhZGRkCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BhZGRfcSwgMTMwNDk5fSwgLy8gX19idWlsdGluX2lhMzJfcGFkZHEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcGFkZHNfYiwgMTMwNTQxfSwgLy8gX19idWlsdGluX2lhMzJfcGFkZHNiCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wYWRkc19iLCAxMzQwODl9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWRkc2IxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BhZGRzX2IsIDEwMTcxMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhZGRzYjI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3BhZGRzX2JfNTEyLCAxMTEyODN9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWRkc2I1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wYWRkc193LCAxMzA1NjN9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWRkc3cKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BhZGRzX3csIDEzNDExNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhZGRzdzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcGFkZHNfdywgMTAxNzM3fSwgLy8gX19idWlsdGluX2lhMzJfcGFkZHN3MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcGFkZHNfd181MTIsIDExMTMxM30sIC8vIF9fYnVpbHRpbl9pYTMyX3BhZGRzdzUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BhZGR1c19iLCAxMzA1ODV9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWRkdXNiCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wYWRkdXNfYiwgMTM0MTM5fSwgLy8gX19idWlsdGluX2lhMzJfcGFkZHVzYjEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcGFkZHVzX2IsIDEwMTc2Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhZGR1c2IyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wYWRkdXNfYl81MTIsIDExMTM0M30sIC8vIF9fYnVpbHRpbl9pYTMyX3BhZGR1c2I1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wYWRkdXNfdywgMTMwNjA4fSwgLy8gX19idWlsdGluX2lhMzJfcGFkZHVzdworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcGFkZHVzX3csIDEzNDE2NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhZGR1c3cxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BhZGR1c193LCAxMDE3ODh9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWRkdXN3MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcGFkZHVzX3dfNTEyLCAxMTEzNzR9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWRkdXN3NTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcGFkZF93LCAxMzA1MjB9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWRkdworICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wYWxpZ25yX2IsIDEzMDYzMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhbGlnbnIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcGFuZCwgMTMwNjU0fSwgLy8gX19idWlsdGluX2lhMzJfcGFuZAorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wYW5kbiwgMTMwNjc0fSwgLy8gX19idWlsdGluX2lhMzJfcGFuZG4KKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BhdXNlLCAxMzQxOTF9LCAvLyBfX2J1aWx0aW5faWEzMl9wYXVzZQorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wYXZnX2IsIDEzMDY5NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhdmdiCisgICAgICB7SW50cmluc2ljOjp4ODZfM2Rub3dfcGF2Z3VzYiwgOTg0MjF9LCAvLyBfX2J1aWx0aW5faWEzMl9wYXZndXNiCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BhdmdfdywgMTMwNzE2fSwgLy8gX19idWlsdGluX2lhMzJfcGF2Z3cKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0MV9wYmxlbmR2YiwgMTM1NDI1fSwgLy8gX19idWlsdGluX2lhMzJfcGJsZW5kdmIxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BibGVuZHZiLCAxMDE4MTR9LCAvLyBfX2J1aWx0aW5faWEzMl9wYmxlbmR2YjI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3BjbG11bHFkcSwgMTMxOTMxfSwgLy8gX19idWlsdGluX2lhMzJfcGNsbXVscWRxMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfcGNsbXVscWRxXzI1NiwgMTMxOTU5fSwgLy8gX19idWlsdGluX2lhMzJfcGNsbXVscWRxMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfcGNsbXVscWRxXzUxMiwgMTMxOTg3fSwgLy8gX19idWlsdGluX2lhMzJfcGNsbXVscWRxNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BjbXBlcV9iLCAxMzA3Mzd9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21wZXFiCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BjbXBlcV9kLCAxMzA3NjB9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21wZXFkCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BjbXBlcV93LCAxMzA3ODN9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21wZXF3CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDJfcGNtcGVzdHJpMTI4LCAxMzU3Njd9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21wZXN0cmkxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0Ml9wY21wZXN0cmlhMTI4LCAxMzU3OTV9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21wZXN0cmlhMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDJfcGNtcGVzdHJpYzEyOCwgMTM1ODI0fSwgLy8gX19idWlsdGluX2lhMzJfcGNtcGVzdHJpYzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQyX3BjbXBlc3RyaW8xMjgsIDEzNTg1M30sIC8vIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaW8xMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0Ml9wY21wZXN0cmlzMTI4LCAxMzU4ODJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21wZXN0cmlzMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDJfcGNtcGVzdHJpejEyOCwgMTM1OTExfSwgLy8gX19idWlsdGluX2lhMzJfcGNtcGVzdHJpejEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQyX3BjbXBlc3RybTEyOCwgMTM1OTQwfSwgLy8gX19idWlsdGluX2lhMzJfcGNtcGVzdHJtMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BjbXBndF9iLCAxMzA4MDZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21wZ3RiCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BjbXBndF9kLCAxMzA4Mjl9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21wZ3RkCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BjbXBndF93LCAxMzA4NTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21wZ3R3CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDJfcGNtcGlzdHJpMTI4LCAxMzU5Njh9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21waXN0cmkxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0Ml9wY21waXN0cmlhMTI4LCAxMzU5OTZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21waXN0cmlhMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDJfcGNtcGlzdHJpYzEyOCwgMTM2MDI1fSwgLy8gX19idWlsdGluX2lhMzJfcGNtcGlzdHJpYzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQyX3BjbXBpc3RyaW8xMjgsIDEzNjA1NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaW8xMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0Ml9wY21waXN0cmlzMTI4LCAxMzYwODN9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21waXN0cmlzMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDJfcGNtcGlzdHJpejEyOCwgMTM2MTEyfSwgLy8gX19idWlsdGluX2lhMzJfcGNtcGlzdHJpejEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQyX3BjbXBpc3RybTEyOCwgMTM2MTQxfSwgLy8gX19idWlsdGluX2lhMzJfcGNtcGlzdHJtMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYm1pX3BkZXBfNjQsIDEyOTQ0M30sIC8vIF9fYnVpbHRpbl9pYTMyX3BkZXBfZGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9ibWlfcGRlcF8zMiwgMTI5NDIwfSwgLy8gX19idWlsdGluX2lhMzJfcGRlcF9zaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfZGZfMjU2LCAxMTE0MDV9LCAvLyBfX2J1aWx0aW5faWEzMl9wZXJtdmFyZGYyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfZGZfNTEyLCAxMTE0Mzh9LCAvLyBfX2J1aWx0aW5faWEzMl9wZXJtdmFyZGY1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfZGlfMjU2LCAxMTE0NzF9LCAvLyBfX2J1aWx0aW5faWEzMl9wZXJtdmFyZGkyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfZGlfNTEyLCAxMTE1MDR9LCAvLyBfX2J1aWx0aW5faWEzMl9wZXJtdmFyZGk1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfaGlfMTI4LCAxMTE1Mzd9LCAvLyBfX2J1aWx0aW5faWEzMl9wZXJtdmFyaGkxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfaGlfMjU2LCAxMTE1NzB9LCAvLyBfX2J1aWx0aW5faWEzMl9wZXJtdmFyaGkyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfaGlfNTEyLCAxMTE2MDN9LCAvLyBfX2J1aWx0aW5faWEzMl9wZXJtdmFyaGk1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfcWlfMTI4LCAxMTE2MzZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wZXJtdmFycWkxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfcWlfMjU2LCAxMTE2Njl9LCAvLyBfX2J1aWx0aW5faWEzMl9wZXJtdmFycWkyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfcWlfNTEyLCAxMTE3MDJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wZXJtdmFycWk1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcGVybXBzLCAxMDE4Njl9LCAvLyBfX2J1aWx0aW5faWEzMl9wZXJtdmFyc2YyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wZXJtdmFyX3NmXzUxMiwgMTExNzM1fSwgLy8gX19idWlsdGluX2lhMzJfcGVybXZhcnNmNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3Blcm1kLCAxMDE4NDF9LCAvLyBfX2J1aWx0aW5faWEzMl9wZXJtdmFyc2kyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wZXJtdmFyX3NpXzUxMiwgMTExNzY4fSwgLy8gX19idWlsdGluX2lhMzJfcGVybXZhcnNpNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9ibWlfcGV4dF82NCwgMTI5NDg5fSwgLy8gX19idWlsdGluX2lhMzJfcGV4dF9kaQorICAgICAge0ludHJpbnNpYzo6eDg2X2JtaV9wZXh0XzMyLCAxMjk0NjZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wZXh0X3NpCisgICAgICB7SW50cmluc2ljOjp4ODZfM2Rub3dfcGYyaWQsIDk4NDQ0fSwgLy8gX19idWlsdGluX2lhMzJfcGYyaWQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd2FfcGYyaXcsIDk4ODQyfSwgLy8gX19idWlsdGluX2lhMzJfcGYyaXcKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd19wZmFjYywgOTg0NjV9LCAvLyBfX2J1aWx0aW5faWEzMl9wZmFjYworICAgICAge0ludHJpbnNpYzo6eDg2XzNkbm93X3BmYWRkLCA5ODQ4Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BmYWRkCisgICAgICB7SW50cmluc2ljOjp4ODZfM2Rub3dfcGZjbXBlcSwgOTg1MDd9LCAvLyBfX2J1aWx0aW5faWEzMl9wZmNtcGVxCisgICAgICB7SW50cmluc2ljOjp4ODZfM2Rub3dfcGZjbXBnZSwgOTg1MzB9LCAvLyBfX2J1aWx0aW5faWEzMl9wZmNtcGdlCisgICAgICB7SW50cmluc2ljOjp4ODZfM2Rub3dfcGZjbXBndCwgOTg1NTN9LCAvLyBfX2J1aWx0aW5faWEzMl9wZmNtcGd0CisgICAgICB7SW50cmluc2ljOjp4ODZfM2Rub3dfcGZtYXgsIDk4NTc2fSwgLy8gX19idWlsdGluX2lhMzJfcGZtYXgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd19wZm1pbiwgOTg1OTd9LCAvLyBfX2J1aWx0aW5faWEzMl9wZm1pbgorICAgICAge0ludHJpbnNpYzo6eDg2XzNkbm93X3BmbXVsLCA5ODYxOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BmbXVsCisgICAgICB7SW50cmluc2ljOjp4ODZfM2Rub3dhX3BmbmFjYywgOTg4NjN9LCAvLyBfX2J1aWx0aW5faWEzMl9wZm5hY2MKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd2FfcGZwbmFjYywgOTg4ODV9LCAvLyBfX2J1aWx0aW5faWEzMl9wZnBuYWNjCisgICAgICB7SW50cmluc2ljOjp4ODZfM2Rub3dfcGZyY3AsIDk4NjM5fSwgLy8gX19idWlsdGluX2lhMzJfcGZyY3AKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd19wZnJjcGl0MSwgOTg2NjB9LCAvLyBfX2J1aWx0aW5faWEzMl9wZnJjcGl0MQorICAgICAge0ludHJpbnNpYzo6eDg2XzNkbm93X3BmcmNwaXQyLCA5ODY4NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BmcmNwaXQyCisgICAgICB7SW50cmluc2ljOjp4ODZfM2Rub3dfcGZyc3FpdDEsIDk4NzA4fSwgLy8gX19idWlsdGluX2lhMzJfcGZyc3FpdDEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd19wZnJzcXJ0LCA5ODczMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BmcnNxcnQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd19wZnN1YiwgOTg3NTV9LCAvLyBfX2J1aWx0aW5faWEzMl9wZnN1YgorICAgICAge0ludHJpbnNpYzo6eDg2XzNkbm93X3Bmc3ViciwgOTg3NzZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wZnN1YnIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19waGFkZF9kLCAxMzYzMjJ9LCAvLyBfX2J1aWx0aW5faWEzMl9waGFkZGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19waGFkZF9kXzEyOCwgMTM2MzQ0fSwgLy8gX19idWlsdGluX2lhMzJfcGhhZGRkMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9waGFkZF9kLCAxMDE4OTd9LCAvLyBfX2J1aWx0aW5faWEzMl9waGFkZGQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19waGFkZF9zdywgMTM2MzY5fSwgLy8gX19idWlsdGluX2lhMzJfcGhhZGRzdworICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BoYWRkX3N3XzEyOCwgMTM2MzkyfSwgLy8gX19idWlsdGluX2lhMzJfcGhhZGRzdzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcGhhZGRfc3csIDEwMTkyMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BoYWRkc3cyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19waGFkZF93LCAxMzY0MTh9LCAvLyBfX2J1aWx0aW5faWEzMl9waGFkZHcKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19waGFkZF93XzEyOCwgMTM2NDQwfSwgLy8gX19idWlsdGluX2lhMzJfcGhhZGR3MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9waGFkZF93LCAxMDE5NDh9LCAvLyBfX2J1aWx0aW5faWEzMl9waGFkZHcyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0MV9waG1pbnBvc3V3LCAxMzU0NTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9waG1pbnBvc3V3MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NzZTNfcGhzdWJfZCwgMTM2NDY1fSwgLy8gX19idWlsdGluX2lhMzJfcGhzdWJkCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NzZTNfcGhzdWJfZF8xMjgsIDEzNjQ4N30sIC8vIF9fYnVpbHRpbl9pYTMyX3Boc3ViZDEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcGhzdWJfZCwgMTAxOTczfSwgLy8gX19idWlsdGluX2lhMzJfcGhzdWJkMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NzZTNfcGhzdWJfc3csIDEzNjUxMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Boc3Vic3cKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19waHN1Yl9zd18xMjgsIDEzNjUzNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Boc3Vic3cxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3Boc3ViX3N3LCAxMDE5OTh9LCAvLyBfX2J1aWx0aW5faWEzMl9waHN1YnN3MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NzZTNfcGhzdWJfdywgMTM2NTYxfSwgLy8gX19idWlsdGluX2lhMzJfcGhzdWJ3CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NzZTNfcGhzdWJfd18xMjgsIDEzNjU4M30sIC8vIF9fYnVpbHRpbl9pYTMyX3Boc3VidzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcGhzdWJfdywgMTAyMDI0fSwgLy8gX19idWlsdGluX2lhMzJfcGhzdWJ3MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfM2Rub3dfcGkyZmQsIDk4Nzk4fSwgLy8gX19idWlsdGluX2lhMzJfcGkyZmQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd2FfcGkyZncsIDk4OTA4fSwgLy8gX19idWlsdGluX2lhMzJfcGkyZncKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19wbWFkZF91Yl9zdywgMTM2NjA4fSwgLy8gX19idWlsdGluX2lhMzJfcG1hZGR1YnN3CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NzZTNfcG1hZGRfdWJfc3dfMTI4LCAxMzY2MzN9LCAvLyBfX2J1aWx0aW5faWEzMl9wbWFkZHVic3cxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BtYWRkX3ViX3N3LCAxMDIwNDl9LCAvLyBfX2J1aWx0aW5faWEzMl9wbWFkZHVic3cyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbWFkZHVic193XzUxMiwgMTExODAxfSwgLy8gX19idWlsdGluX2lhMzJfcG1hZGR1YnN3NTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcG1hZGRfd2QsIDEzMDkzMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtYWRkd2QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BtYWRkX3dkLCAxMzQyMTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbWFkZHdkMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wbWFkZF93ZCwgMTAyMDc3fSwgLy8gX19idWlsdGluX2lhMzJfcG1hZGR3ZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3BtYWRkd19kXzUxMiwgMTExODM0fSwgLy8gX19idWlsdGluX2lhMzJfcG1hZGR3ZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BtYXhzX3csIDEzMDk1NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtYXhzdworICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wbWF4dV9iLCAxMzA5NzZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbWF4dWIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcG1pbnNfdywgMTMwOTk4fSwgLy8gX19idWlsdGluX2lhMzJfcG1pbnN3CisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BtaW51X2IsIDEzMTAyMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtaW51YgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfZGJfMTI4LCAxMTE4NjV9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92ZGIxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfZGJfbWVtXzEyOCwgMTExOTU1fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdmRiMTI4bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X2RiXzI1NiwgMTExODk1fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdmRiMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X2RiX21lbV8yNTYsIDExMTk4OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZkYjI1Nm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9kYl81MTIsIDExMTkyNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZkYjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9kYl9tZW1fNTEyLCAxMTIwMjF9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92ZGI1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfZHdfMTI4LCAxMTIwNTR9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92ZHcxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfZHdfbWVtXzEyOCwgMTEyMTQ0fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdmR3MTI4bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X2R3XzI1NiwgMTEyMDg0fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdmR3MjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X2R3X21lbV8yNTYsIDExMjE3N30sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZkdzI1Nm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9kd181MTIsIDExMjExNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZkdzUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9kd19tZW1fNTEyLCAxMTIyMTB9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92ZHc1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wbW92bXNrYiwgMTMxMDQyfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdm1za2IKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3Btb3Ztc2tiXzEyOCwgMTM0MjM4fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdm1za2IxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3Btb3Ztc2tiLCAxMDIxMDN9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92bXNrYjI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWJfMTI4LCAxMTIyNDN9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92cWIxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWJfbWVtXzEyOCwgMTEyMzMzfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnFiMTI4bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X3FiXzI1NiwgMTEyMjczfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnFiMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X3FiX21lbV8yNTYsIDExMjM2Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZxYjI1Nm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9xYl81MTIsIDExMjMwM30sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZxYjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9xYl9tZW1fNTEyLCAxMTIzOTl9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92cWI1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWRfMTI4LCAxMTI0MzJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92cWQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWRfbWVtXzEyOCwgMTEyNTIyfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnFkMTI4bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X3FkXzI1NiwgMTEyNDYyfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnFkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X3FkX21lbV8yNTYsIDExMjU1NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZxZDI1Nm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9xZF81MTIsIDExMjQ5Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZxZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9xZF9tZW1fNTEyLCAxMTI1ODh9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92cWQ1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfcXdfMTI4LCAxMTI2MjF9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92cXcxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfcXdfbWVtXzEyOCwgMTEyNzExfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnF3MTI4bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X3F3XzI1NiwgMTEyNjUxfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnF3MjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X3F3X21lbV8yNTYsIDExMjc0NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZxdzI1Nm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9xd181MTIsIDExMjY4MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZxdzUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9xd19tZW1fNTEyLCAxMTI3Nzd9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92cXc1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2RiXzEyOCwgMTEyOTk5fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNkYjEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfZGJfbWVtXzEyOCwgMTEzMDkyfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNkYjEyOG1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfZGJfMjU2LCAxMTMwMzB9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c2RiMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19kYl9tZW1fMjU2LCAxMTMxMjZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c2RiMjU2bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19kYl81MTIsIDExMzA2MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzZGI1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2RiX21lbV81MTIsIDExMzE2MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzZGI1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2R3XzEyOCwgMTEzMTk0fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNkdzEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfZHdfbWVtXzEyOCwgMTEzMjg3fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNkdzEyOG1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfZHdfMjU2LCAxMTMyMjV9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c2R3MjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19kd19tZW1fMjU2LCAxMTMzMjF9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c2R3MjU2bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19kd181MTIsIDExMzI1Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzZHc1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2R3X21lbV81MTIsIDExMzM1NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzZHc1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FiXzEyOCwgMTEzMzg5fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNxYjEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWJfbWVtXzEyOCwgMTEzNDgyfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNxYjEyOG1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWJfMjU2LCAxMTM0MjB9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c3FiMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19xYl9tZW1fMjU2LCAxMTM1MTZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c3FiMjU2bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19xYl81MTIsIDExMzQ1MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWI1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FiX21lbV81MTIsIDExMzU1MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWI1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FkXzEyOCwgMTEzNTg0fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNxZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWRfbWVtXzEyOCwgMTEzNjc3fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNxZDEyOG1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWRfMjU2LCAxMTM2MTV9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c3FkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19xZF9tZW1fMjU2LCAxMTM3MTF9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c3FkMjU2bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19xZF81MTIsIDExMzY0Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FkX21lbV81MTIsIDExMzc0NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWQ1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3F3XzEyOCwgMTEzNzc5fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNxdzEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcXdfbWVtXzEyOCwgMTEzODcyfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNxdzEyOG1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcXdfMjU2LCAxMTM4MTB9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c3F3MjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19xd19tZW1fMjU2LCAxMTM5MDZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c3F3MjU2bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19xd181MTIsIDExMzg0MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcXc1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3F3X21lbV81MTIsIDExMzk0MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcXc1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3diXzEyOCwgMTEzOTc0fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnN3YjEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfd2JfbWVtXzEyOCwgMTE0MDY3fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnN3YjEyOG1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfd2JfMjU2LCAxMTQwMDV9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c3diMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c193Yl9tZW1fMjU2LCAxMTQxMDF9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c3diMjU2bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c193Yl81MTIsIDExNDAzNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Zzd2I1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3diX21lbV81MTIsIDExNDEzNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Zzd2I1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kYl8xMjgsIDExNDE2OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2RiMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfZGJfbWVtXzEyOCwgMTE0MjY1fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzZGIxMjhtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kYl8yNTYsIDExNDIwMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2RiMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfZGJfbWVtXzI1NiwgMTE0MzAwfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzZGIyNTZtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kYl81MTIsIDExNDIzM30sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2RiNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfZGJfbWVtXzUxMiwgMTE0MzM1fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzZGI1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kd18xMjgsIDExNDM3MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2R3MTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfZHdfbWVtXzEyOCwgMTE0NDY2fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzZHcxMjhtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kd18yNTYsIDExNDQwMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2R3MjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfZHdfbWVtXzI1NiwgMTE0NTAxfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzZHcyNTZtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kd181MTIsIDExNDQzNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c2R3NTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfZHdfbWVtXzUxMiwgMTE0NTM2fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzZHc1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xYl8xMjgsIDExNDU3MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FiMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfcWJfbWVtXzEyOCwgMTE0NjY3fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcWIxMjhtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xYl8yNTYsIDExNDYwM30sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FiMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfcWJfbWVtXzI1NiwgMTE0NzAyfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcWIyNTZtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xYl81MTIsIDExNDYzNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FiNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfcWJfbWVtXzUxMiwgMTE0NzM3fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcWI1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xZF8xMjgsIDExNDc3Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfcWRfbWVtXzEyOCwgMTE0ODY4fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcWQxMjhtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xZF8yNTYsIDExNDgwNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfcWRfbWVtXzI1NiwgMTE0OTAzfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcWQyNTZtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xZF81MTIsIDExNDgzNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfcWRfbWVtXzUxMiwgMTE0OTM4fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcWQ1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xd18xMjgsIDExNDk3M30sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3F3MTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfcXdfbWVtXzEyOCwgMTE1MDY5fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcXcxMjhtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xd18yNTYsIDExNTAwNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3F3MjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfcXdfbWVtXzI1NiwgMTE1MTA0fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcXcyNTZtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xd181MTIsIDExNTAzN30sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3F3NTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfcXdfbWVtXzUxMiwgMTE1MTM5fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcXc1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c193Yl8xMjgsIDExNTE3NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3diMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfd2JfbWVtXzEyOCwgMTE1MjcwfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzd2IxMjhtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c193Yl8yNTYsIDExNTIwNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3diMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfd2JfbWVtXzI1NiwgMTE1MzA1fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzd2IyNTZtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c193Yl81MTIsIDExNTIzOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z1c3diNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92dXNfd2JfbWVtXzUxMiwgMTE1MzQwfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzd2I1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Zfd2JfMTI4LCAxMTI4MTB9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92d2IxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Zfd2JfbWVtXzEyOCwgMTEyOTAwfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdndiMTI4bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X3diXzI1NiwgMTEyODQwfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdndiMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X3diX21lbV8yNTYsIDExMjkzM30sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z3YjI1Nm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl93Yl81MTIsIDExMjg3MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z3YjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl93Yl9tZW1fNTEyLCAxMTI5NjZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92d2I1MTJtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQxX3BtdWxkcSwgMTM1NDgxfSwgLy8gX19idWlsdGluX2lhMzJfcG11bGRxMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wbXVsX2RxLCAxMDIxMzB9LCAvLyBfX2J1aWx0aW5faWEzMl9wbXVsZHEyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcG11bF9kcV81MTIsIDEyNjI5MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtdWxkcTUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BtdWxfaHJfc3csIDEzNjY2MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtdWxocnN3CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NzZTNfcG11bF9ocl9zd18xMjgsIDEzNjY4NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtdWxocnN3MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wbXVsX2hyX3N3LCAxMDIxNTV9LCAvLyBfX2J1aWx0aW5faWEzMl9wbXVsaHJzdzI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wbXVsX2hyX3N3XzUxMiwgMTI2MzE2fSwgLy8gX19idWlsdGluX2lhMzJfcG11bGhyc3c1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd19wbXVsaHJ3LCA5ODgxOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtdWxocncKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcG11bGh1X3csIDEzMTA4OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtdWxodXcKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BtdWxodV93LCAxMzQyOTB9LCAvLyBfX2J1aWx0aW5faWEzMl9wbXVsaHV3MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wbXVsaHVfdywgMTAyMjA3fSwgLy8gX19idWlsdGluX2lhMzJfcG11bGh1dzI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wbXVsaHVfd181MTIsIDEyNjM2OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtdWxodXc1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcG11bGhfdywgMTMxMDY2fSwgLy8gX19idWlsdGluX2lhMzJfcG11bGh3CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wbXVsaF93LCAxMzQyNjV9LCAvLyBfX2J1aWx0aW5faWEzMl9wbXVsaHcxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BtdWxoX3csIDEwMjE4Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtdWxodzI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wbXVsaF93XzUxMiwgMTI2MzQzfSwgLy8gX19idWlsdGluX2lhMzJfcG11bGh3NTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BtdWxsX3csIDEzMTExMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtdWxsdworICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wbXVsdV9kcSwgMTMxMTMzfSwgLy8gX19idWlsdGluX2lhMzJfcG11bHVkcQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcG11bHVfZHEsIDEzNDMxNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtdWx1ZHExMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BtdWx1X2RxLCAxMDIyMzN9LCAvLyBfX2J1aWx0aW5faWEzMl9wbXVsdWRxMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BtdWx1X2RxXzUxMiwgMTI2Mzk0fSwgLy8gX19idWlsdGluX2lhMzJfcG11bHVkcTUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wb3IsIDEzMTE1Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BvcgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb2xfZF8xMjgsIDExNTQ4OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb2xkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wcm9sX2RfMjU2LCAxMTU1MTh9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9sZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvbF9kXzUxMiwgMTE1NTQ3fSwgLy8gX19idWlsdGluX2lhMzJfcHJvbGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb2xfcV8xMjgsIDExNTU3Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb2xxMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wcm9sX3FfMjU2LCAxMTU2MDV9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9scTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvbF9xXzUxMiwgMTE1NjM0fSwgLy8gX19idWlsdGluX2lhMzJfcHJvbHE1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb2x2X2RfMTI4LCAxMTU2NjN9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9sdmQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb2x2X2RfMjU2LCAxMTU2OTN9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9sdmQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb2x2X2RfNTEyLCAxMTU3MjN9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9sdmQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb2x2X3FfMTI4LCAxMTU3NTN9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9sdnExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb2x2X3FfMjU2LCAxMTU3ODN9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9sdnEyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb2x2X3FfNTEyLCAxMTU4MTN9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9sdnE1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb3JfZF8xMjgsIDExNTg0M30sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb3JkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wcm9yX2RfMjU2LCAxMTU4NzJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9yZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvcl9kXzUxMiwgMTE1OTAxfSwgLy8gX19idWlsdGluX2lhMzJfcHJvcmQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb3JfcV8xMjgsIDExNTkzMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb3JxMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wcm9yX3FfMjU2LCAxMTU5NTl9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9ycTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvcl9xXzUxMiwgMTE1OTg4fSwgLy8gX19idWlsdGluX2lhMzJfcHJvcnE1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb3J2X2RfMTI4LCAxMTYwMTd9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9ydmQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb3J2X2RfMjU2LCAxMTYwNDd9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9ydmQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb3J2X2RfNTEyLCAxMTYwNzd9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9ydmQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb3J2X3FfMTI4LCAxMTYxMDd9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9ydnExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb3J2X3FfMjU2LCAxMTYxMzd9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9ydnEyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb3J2X3FfNTEyLCAxMTYxNjd9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9ydnE1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wc2FkX2J3LCAxMzExNzV9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2FkYncKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzYWRfYncsIDEzNDM0Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzYWRidzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcHNhZF9idywgMTAyMjU5fSwgLy8gX19idWlsdGluX2lhMzJfcHNhZGJ3MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzYWRfYndfNTEyLCAxMjY0MjB9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2FkYnc1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19wc2h1Zl9iLCAxMzY3MTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2h1ZmIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19wc2h1Zl9iXzEyOCwgMTM2NzM0fSwgLy8gX19idWlsdGluX2lhMzJfcHNodWZiMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc2h1Zl9iLCAxMDIyODR9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2h1ZmIyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNodWZfYl81MTIsIDEyNjQ0NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzaHVmYjUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9wc2h1Zl93LCAxMzMwNTR9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2h1ZncKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19wc2lnbl9iLCAxMzY3NTl9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2lnbmIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19wc2lnbl9iXzEyOCwgMTM2NzgxfSwgLy8gX19idWlsdGluX2lhMzJfcHNpZ25iMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc2lnbl9iLCAxMDIzMDl9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2lnbmIyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19wc2lnbl9kLCAxMzY4MDZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2lnbmQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19wc2lnbl9kXzEyOCwgMTM2ODI4fSwgLy8gX19idWlsdGluX2lhMzJfcHNpZ25kMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc2lnbl9kLCAxMDIzMzR9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2lnbmQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19wc2lnbl93LCAxMzY4NTN9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2lnbncKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19wc2lnbl93XzEyOCwgMTM2ODc1fSwgLy8gX19idWlsdGluX2lhMzJfcHNpZ253MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc2lnbl93LCAxMDIzNTl9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2lnbncyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcHNsbF9kLCAxMzExOTd9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xsZAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcHNsbF9kLCAxMzQzNjd9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xsZDEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcHNsbF9kLCAxMDIzODR9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xsZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc2xsX2RfNTEyLCAxMjY0NzB9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xsZDUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wc2xsaV9kLCAxMzEyNjB9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xsZGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzbGxpX2QsIDEzNDQzOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGxkaTEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcHNsbGlfZCwgMTAyNDU2fSwgLy8gX19idWlsdGluX2lhMzJfcHNsbGRpMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzbGxpX2RfNTEyLCAxMjY1NDJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xsZGk1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcHNsbF9xLCAxMzEyMTh9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xscQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcHNsbF9xLCAxMzQzOTF9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xscTEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcHNsbF9xLCAxMDI0MDh9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xscTI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc2xsX3FfNTEyLCAxMjY0OTR9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xscTUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wc2xsaV9xLCAxMzEyODJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xscWkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzbGxpX3EsIDEzNDQ2NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGxxaTEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcHNsbGlfcSwgMTAyNDgxfSwgLy8gX19idWlsdGluX2lhMzJfcHNsbHFpMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzbGxpX3FfNTEyLCAxMjY1Njd9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xscWk1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNsbHZfd18yNTYsIDEyNjY5MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGx2MTZoaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc2xsdl9kXzUxMiwgMTI2NjE3fSwgLy8gX19idWlsdGluX2lhMzJfcHNsbHYxNnNpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc2xsdl9xLCAxMDI1Nzl9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xsdjJkaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc2xsdl93XzUxMiwgMTI2NzE1fSwgLy8gX19idWlsdGluX2lhMzJfcHNsbHYzMmhpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc2xsdl9xXzI1NiwgMTAyNjAzfSwgLy8gX19idWlsdGluX2lhMzJfcHNsbHY0ZGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzbGx2X2QsIDEwMjUzMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGx2NHNpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzbGx2X3FfNTEyLCAxMjY2NDJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xsdjhkaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc2xsdl93XzEyOCwgMTI2NjY2fSwgLy8gX19idWlsdGluX2lhMzJfcHNsbHY4aGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzbGx2X2RfMjU2LCAxMDI1NTV9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xsdjhzaQorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wc2xsX3csIDEzMTIzOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGx3CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wc2xsX3csIDEzNDQxNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGx3MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc2xsX3csIDEwMjQzMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGx3MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzbGxfd181MTIsIDEyNjUxOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGx3NTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzbGxpX3csIDEzMTMwNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGx3aQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcHNsbGlfdywgMTM0NDg5fSwgLy8gX19idWlsdGluX2lhMzJfcHNsbHdpMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc2xsaV93LCAxMDI1MDZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xsd2kyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNsbGlfd181MTIsIDEyNjU5Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGx3aTUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wc3JhX2QsIDEzMTMyNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmFkCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wc3JhX2QsIDEzNDUxNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmFkMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc3JhX2QsIDEwMjYyN30sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmFkMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzcmFfZF81MTIsIDEyNjc0MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmFkNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzcmFpX2QsIDEzMTM2OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmFkaQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcHNyYWlfZCwgMTM0NTYyfSwgLy8gX19idWlsdGluX2lhMzJfcHNyYWRpMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc3JhaV9kLCAxMDI2NzV9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JhZGkyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNyYWlfZF81MTIsIDEyNjg2MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmFkaTUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc3JhX3FfMTI4LCAxMjY3NjR9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JhcTEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc3JhX3FfMjU2LCAxMjY3ODh9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JhcTI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc3JhX3FfNTEyLCAxMjY4MTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JhcTUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc3JhaV9xXzEyOCwgMTI2ODg1fSwgLy8gX19idWlsdGluX2lhMzJfcHNyYXFpMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzcmFpX3FfMjU2LCAxMjY5MTB9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JhcWkyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNyYWlfcV81MTIsIDEyNjkzNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmFxaTUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc3Jhdl93XzI1NiwgMTI3MTA4fSwgLy8gX19idWlsdGluX2lhMzJfcHNyYXYxNmhpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzcmF2X2RfNTEyLCAxMjY5ODV9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JhdjE2c2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNyYXZfd181MTIsIDEyNzEzM30sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmF2MzJoaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcHNyYXZfZCwgMTAyNzI1fSwgLy8gX19idWlsdGluX2lhMzJfcHNyYXY0c2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNyYXZfcV81MTIsIDEyNzA2MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmF2OGRpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzcmF2X3dfMTI4LCAxMjcwODR9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JhdjhoaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcHNyYXZfZF8yNTYsIDEwMjc0OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmF2OHNpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzcmF2X3FfMTI4LCAxMjcwMTB9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JhdnExMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNyYXZfcV8yNTYsIDEyNzAzNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmF2cTI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wc3JhX3csIDEzMTM0N30sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmF3CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wc3JhX3csIDEzNDUzOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmF3MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc3JhX3csIDEwMjY1MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmF3MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzcmFfd181MTIsIDEyNjgzNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmF3NTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzcmFpX3csIDEzMTM5MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmF3aQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcHNyYWlfdywgMTM0NTg3fSwgLy8gX19idWlsdGluX2lhMzJfcHNyYXdpMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc3JhaV93LCAxMDI3MDB9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3Jhd2kyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNyYWlfd181MTIsIDEyNjk2MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmF3aTUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wc3JsX2QsIDEzMTQxMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmxkCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wc3JsX2QsIDEzNDYxMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmxkMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc3JsX2QsIDEwMjc3M30sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmxkMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzcmxfZF81MTIsIDEyNzE1OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmxkNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzcmxpX2QsIDEzMTQ3NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmxkaQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcHNybGlfZCwgMTM0Njg0fSwgLy8gX19idWlsdGluX2lhMzJfcHNybGRpMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc3JsaV9kLCAxMDI4NDV9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JsZGkyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNybGlfZF81MTIsIDEyNzIzMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmxkaTUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wc3JsX3EsIDEzMTQzM30sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmxxCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wc3JsX3EsIDEzNDYzNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmxxMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc3JsX3EsIDEwMjc5N30sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmxxMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzcmxfcV81MTIsIDEyNzE4Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmxxNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzcmxpX3EsIDEzMTQ5N30sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmxxaQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcHNybGlfcSwgMTM0NzA5fSwgLy8gX19idWlsdGluX2lhMzJfcHNybHFpMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc3JsaV9xLCAxMDI4NzB9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JscWkyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNybGlfcV81MTIsIDEyNzI1NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmxxaTUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc3Jsdl93XzI1NiwgMTI3Mzc4fSwgLy8gX19idWlsdGluX2lhMzJfcHNybHYxNmhpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3Bzcmx2X2RfNTEyLCAxMjczMDV9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JsdjE2c2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3Bzcmx2X3EsIDEwMjk2OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Bzcmx2MmRpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3Bzcmx2X3dfNTEyLCAxMjc0MDN9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JsdjMyaGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3Bzcmx2X3FfMjU2LCAxMDI5OTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JsdjRkaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcHNybHZfZCwgMTAyOTIwfSwgLy8gX19idWlsdGluX2lhMzJfcHNybHY0c2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNybHZfcV81MTIsIDEyNzMzMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Bzcmx2OGRpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3Bzcmx2X3dfMTI4LCAxMjczNTR9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JsdjhoaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcHNybHZfZF8yNTYsIDEwMjk0NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Bzcmx2OHNpCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzcmxfdywgMTMxNDU0fSwgLy8gX19idWlsdGluX2lhMzJfcHNybHcKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmxfdywgMTM0NjYwfSwgLy8gX19idWlsdGluX2lhMzJfcHNybHcxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzcmxfdywgMTAyODIxfSwgLy8gX19idWlsdGluX2lhMzJfcHNybHcyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNybF93XzUxMiwgMTI3MjA2fSwgLy8gX19idWlsdGluX2lhMzJfcHNybHc1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcHNybGlfdywgMTMxNTE5fSwgLy8gX19idWlsdGluX2lhMzJfcHNybHdpCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wc3JsaV93LCAxMzQ3MzR9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3Jsd2kxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzcmxpX3csIDEwMjg5NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Bzcmx3aTI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc3JsaV93XzUxMiwgMTI3MjgwfSwgLy8gX19idWlsdGluX2lhMzJfcHNybHdpNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzdWJfYiwgMTMxNTQxfSwgLy8gX19idWlsdGluX2lhMzJfcHN1YmIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcHN1Yl9kLCAxMzE1NjJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3ViZAorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wc3ViX3EsIDEzMTU4M30sIC8vIF9fYnVpbHRpbl9pYTMyX3BzdWJxCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzdWJzX2IsIDEzMTYyNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzdWJzYgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcHN1YnNfYiwgMTM0NzU5fSwgLy8gX19idWlsdGluX2lhMzJfcHN1YnNiMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc3Vic19iLCAxMDMwMTZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3Vic2IyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wc3Vic19iXzUxMiwgMTE2MTk3fSwgLy8gX19idWlsdGluX2lhMzJfcHN1YnNiNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcHN1YnNfdywgMTMxNjQ3fSwgLy8gX19idWlsdGluX2lhMzJfcHN1YnN3CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wc3Vic193LCAxMzQ3ODR9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3Vic3cxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzdWJzX3csIDEwMzA0MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzdWJzdzI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3BzdWJzX3dfNTEyLCAxMTYyMjd9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3Vic3c1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wc3VidXNfYiwgMTMxNjY5fSwgLy8gX19idWlsdGluX2lhMzJfcHN1YnVzYgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcHN1YnVzX2IsIDEzNDgwOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzdWJ1c2IxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzdWJ1c19iLCAxMDMwNjZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3VidXNiMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHN1YnVzX2JfNTEyLCAxMTYyNTd9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3VidXNiNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcHN1YnVzX3csIDEzMTY5Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzdWJ1c3cKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzdWJ1c193LCAxMzQ4MzV9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3VidXN3MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc3VidXNfdywgMTAzMDkyfSwgLy8gX19idWlsdGluX2lhMzJfcHN1YnVzdzI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3BzdWJ1c193XzUxMiwgMTE2Mjg4fSwgLy8gX19idWlsdGluX2lhMzJfcHN1YnVzdzUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzdWJfdywgMTMxNjA0fSwgLy8gX19idWlsdGluX2lhMzJfcHN1YncKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wdGVybmxvZ19kXzEyOCwgMTE2MzE5fSwgLy8gX19idWlsdGluX2lhMzJfcHRlcm5sb2dkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfcHRlcm5sb2dfZF8xMjgsIDEyMzYzMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3B0ZXJubG9nZDEyOF9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3B0ZXJubG9nX2RfMjU2LCAxMTYzNTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wdGVybmxvZ2QyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel9wdGVybmxvZ19kXzI1NiwgMTIzNjY1fSwgLy8gX19idWlsdGluX2lhMzJfcHRlcm5sb2dkMjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHRlcm5sb2dfZF81MTIsIDExNjM4NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3B0ZXJubG9nZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3B0ZXJubG9nX2RfNTEyLCAxMjM2OTl9LCAvLyBfX2J1aWx0aW5faWEzMl9wdGVybmxvZ2Q1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wdGVybmxvZ19xXzEyOCwgMTE2NDE4fSwgLy8gX19idWlsdGluX2lhMzJfcHRlcm5sb2dxMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfcHRlcm5sb2dfcV8xMjgsIDEyMzczM30sIC8vIF9fYnVpbHRpbl9pYTMyX3B0ZXJubG9ncTEyOF9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3B0ZXJubG9nX3FfMjU2LCAxMTY0NTF9LCAvLyBfX2J1aWx0aW5faWEzMl9wdGVybmxvZ3EyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel9wdGVybmxvZ19xXzI1NiwgMTIzNzY3fSwgLy8gX19idWlsdGluX2lhMzJfcHRlcm5sb2dxMjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHRlcm5sb2dfcV81MTIsIDExNjQ4NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3B0ZXJubG9ncTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3B0ZXJubG9nX3FfNTEyLCAxMjM4MDF9LCAvLyBfX2J1aWx0aW5faWEzMl9wdGVybmxvZ3E1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0MV9wdGVzdGMsIDEzNTUwNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3B0ZXN0YzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9wdGVzdGNfMjU2LCAxMDAyMTl9LCAvLyBfX2J1aWx0aW5faWEzMl9wdGVzdGMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0MV9wdGVzdG56YywgMTM1NTMxfSwgLy8gX19idWlsdGluX2lhMzJfcHRlc3RuemMxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfcHRlc3RuemNfMjU2LCAxMDAyNDR9LCAvLyBfX2J1aWx0aW5faWEzMl9wdGVzdG56YzI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQxX3B0ZXN0eiwgMTM1NTU4fSwgLy8gX19idWlsdGluX2lhMzJfcHRlc3R6MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3B0ZXN0el8yNTYsIDEwMDI3MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3B0ZXN0ejI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wdW5wY2toYncsIDEzMTcxNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3B1bnBja2hidworICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wdW5wY2toZHEsIDEzMTc0MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3B1bnBja2hkcQorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wdW5wY2tod2QsIDEzMTc2NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3B1bnBja2h3ZAorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wdW5wY2tsYncsIDEzMTc5MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3B1bnBja2xidworICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wdW5wY2tsZHEsIDEzMTgxNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3B1bnBja2xkcQorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wdW5wY2tsd2QsIDEzMTg0MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3B1bnBja2x3ZAorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9weG9yLCAxMzE4NjV9LCAvLyBfX2J1aWx0aW5faWEzMl9weG9yCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcmFuZ2VfcGRfMTI4LCAxMTY1MTd9LCAvLyBfX2J1aWx0aW5faWEzMl9yYW5nZXBkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19yYW5nZV9wZF8yNTYsIDExNjU0OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3JhbmdlcGQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3JhbmdlX3BkXzUxMiwgMTE2NTc5fSwgLy8gX19idWlsdGluX2lhMzJfcmFuZ2VwZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcmFuZ2VfcHNfMTI4LCAxMTY2MTB9LCAvLyBfX2J1aWx0aW5faWEzMl9yYW5nZXBzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19yYW5nZV9wc18yNTYsIDExNjY0MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3JhbmdlcHMyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3JhbmdlX3BzXzUxMiwgMTE2NjcyfSwgLy8gX19idWlsdGluX2lhMzJfcmFuZ2VwczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcmFuZ2Vfc2QsIDExNjcwM30sIC8vIF9fYnVpbHRpbl9pYTMyX3Jhbmdlc2QxMjhfcm91bmRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3JhbmdlX3NzLCAxMTY3NDB9LCAvLyBfX2J1aWx0aW5faWEzMl9yYW5nZXNzMTI4X3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcmNwMTRfcGRfMTI4LCAxMjc0Mjh9LCAvLyBfX2J1aWx0aW5faWEzMl9yY3AxNHBkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcmNwMTRfcGRfMjU2LCAxMjc0NTl9LCAvLyBfX2J1aWx0aW5faWEzMl9yY3AxNHBkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcmNwMTRfcGRfNTEyLCAxMjc0OTB9LCAvLyBfX2J1aWx0aW5faWEzMl9yY3AxNHBkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcmNwMTRfcHNfMTI4LCAxMjc1MjF9LCAvLyBfX2J1aWx0aW5faWEzMl9yY3AxNHBzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcmNwMTRfcHNfMjU2LCAxMjc1NTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9yY3AxNHBzMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcmNwMTRfcHNfNTEyLCAxMjc1ODN9LCAvLyBfX2J1aWx0aW5faWEzMl9yY3AxNHBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcmNwMTRfc2QsIDEyNzYxNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3JjcDE0c2RfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yY3AxNF9zcywgMTI3NjQyfSwgLy8gX19idWlsdGluX2lhMzJfcmNwMTRzc19tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3JjcDI4X3BkLCAxMjc2NzB9LCAvLyBfX2J1aWx0aW5faWEzMl9yY3AyOHBkX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcmNwMjhfcHMsIDEyNzY5OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3JjcDI4cHNfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yY3AyOF9zZCwgMTI3NzI2fSwgLy8gX19idWlsdGluX2lhMzJfcmNwMjhzZF9yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3JjcDI4X3NzLCAxMjc3NjB9LCAvLyBfX2J1aWx0aW5faWEzMl9yY3AyOHNzX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfcmNwX3BzLCAxMzMwNzZ9LCAvLyBfX2J1aWx0aW5faWEzMl9yY3BwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9yY3BfcHNfMjU2LCAxMDAyOTZ9LCAvLyBfX2J1aWx0aW5faWEzMl9yY3BwczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9yY3Bfc3MsIDEzMzA5N30sIC8vIF9fYnVpbHRpbl9pYTMyX3JjcHNzCisgICAgICB7SW50cmluc2ljOjp4ODZfcmRmc2Jhc2VfMzIsIDEzMjAxNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3JkZnNiYXNlMzIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9yZGZzYmFzZV82NCwgMTMyMDQxfSwgLy8gX19idWlsdGluX2lhMzJfcmRmc2Jhc2U2NAorICAgICAge0ludHJpbnNpYzo6eDg2X3JkZ3NiYXNlXzMyLCAxMzIwNjd9LCAvLyBfX2J1aWx0aW5faWEzMl9yZGdzYmFzZTMyCisgICAgICB7SW50cmluc2ljOjp4ODZfcmRnc2Jhc2VfNjQsIDEzMjA5M30sIC8vIF9fYnVpbHRpbl9pYTMyX3JkZ3NiYXNlNjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9yZHBpZCwgMTMyMTE5fSwgLy8gX19idWlsdGluX2lhMzJfcmRwaWQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9yZHBrcnUsIDEzMjE0MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3JkcGtydQorICAgICAge0ludHJpbnNpYzo6eDg2X3JkcG1jLCAxMzIxNjJ9LCAvLyBfX2J1aWx0aW5faWEzMl9yZHBtYworICAgICAge0ludHJpbnNpYzo6eDg2X3Jkc3NwZCwgMTMyMTgzfSwgLy8gX19idWlsdGluX2lhMzJfcmRzc3BkCisgICAgICB7SW50cmluc2ljOjp4ODZfcmRzc3BxLCAxMzIyMDV9LCAvLyBfX2J1aWx0aW5faWEzMl9yZHNzcHEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9yZHRzYywgMTMyMjI3fSwgLy8gX19idWlsdGluX2lhMzJfcmR0c2MKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9yZHRzY3AsIDEzMjI0OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3JkdHNjcAorICAgICAge0ludHJpbnNpYzo6eDg2X2ZsYWdzX3JlYWRfdTMyLCAxMjk2MDR9LCAvLyBfX2J1aWx0aW5faWEzMl9yZWFkZWZsYWdzX3UzMgorICAgICAge0ludHJpbnNpYzo6eDg2X2ZsYWdzX3JlYWRfdTY0LCAxMjk2MzR9LCAvLyBfX2J1aWx0aW5faWEzMl9yZWFkZWZsYWdzX3U2NAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3JlZHVjZV9wZF8xMjgsIDExNjc3N30sIC8vIF9fYnVpbHRpbl9pYTMyX3JlZHVjZXBkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19yZWR1Y2VfcGRfMjU2LCAxMTY4MDl9LCAvLyBfX2J1aWx0aW5faWEzMl9yZWR1Y2VwZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcmVkdWNlX3BkXzUxMiwgMTE2ODQxfSwgLy8gX19idWlsdGluX2lhMzJfcmVkdWNlcGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3JlZHVjZV9wc18xMjgsIDExNjg3M30sIC8vIF9fYnVpbHRpbl9pYTMyX3JlZHVjZXBzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19yZWR1Y2VfcHNfMjU2LCAxMTY5MDV9LCAvLyBfX2J1aWx0aW5faWEzMl9yZWR1Y2VwczI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcmVkdWNlX3BzXzUxMiwgMTE2OTM3fSwgLy8gX19idWlsdGluX2lhMzJfcmVkdWNlcHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3JlZHVjZV9zZCwgMTE2OTY5fSwgLy8gX19idWlsdGluX2lhMzJfcmVkdWNlc2RfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3JlZHVjZV9zcywgMTE2OTk4fSwgLy8gX19idWlsdGluX2lhMzJfcmVkdWNlc3NfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3JuZHNjYWxlX3BkXzEyOCwgMTE3MDI3fSwgLy8gX19idWlsdGluX2lhMzJfcm5kc2NhbGVwZF8xMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3JuZHNjYWxlX3BkXzI1NiwgMTE3MDYyfSwgLy8gX19idWlsdGluX2lhMzJfcm5kc2NhbGVwZF8yNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3JuZHNjYWxlX3BkXzUxMiwgMTE3MDk3fSwgLy8gX19idWlsdGluX2lhMzJfcm5kc2NhbGVwZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcm5kc2NhbGVfcHNfMTI4LCAxMTcxMjh9LCAvLyBfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBzXzEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcm5kc2NhbGVfcHNfMjU2LCAxMTcxNjN9LCAvLyBfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBzXzI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcm5kc2NhbGVfcHNfNTEyLCAxMTcxOTh9LCAvLyBfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBzX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19ybmRzY2FsZV9zZCwgMTE3MjI5fSwgLy8gX19idWlsdGluX2lhMzJfcm5kc2NhbGVzZF9yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcm5kc2NhbGVfc3MsIDExNzI2Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlc3Nfcm91bmRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQxX3JvdW5kX3BkLCAxMzU1ODN9LCAvLyBfX2J1aWx0aW5faWEzMl9yb3VuZHBkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3JvdW5kX3BkXzI1NiwgMTAwMzIwfSwgLy8gX19idWlsdGluX2lhMzJfcm91bmRwZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQxX3JvdW5kX3BzLCAxMzU2MDZ9LCAvLyBfX2J1aWx0aW5faWEzMl9yb3VuZHBzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3JvdW5kX3BzXzI1NiwgMTAwMzQ2fSwgLy8gX19idWlsdGluX2lhMzJfcm91bmRwczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQxX3JvdW5kX3NkLCAxMzU2Mjl9LCAvLyBfX2J1aWx0aW5faWEzMl9yb3VuZHNkCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDFfcm91bmRfc3MsIDEzNTY1Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3JvdW5kc3MKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcnNxcnQxNF9wZF8xMjgsIDEyNzc5NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRwZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3JzcXJ0MTRfcGRfMjU2LCAxMjc4Mjd9LCAvLyBfX2J1aWx0aW5faWEzMl9yc3FydDE0cGQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yc3FydDE0X3BkXzUxMiwgMTI3ODYwfSwgLy8gX19idWlsdGluX2lhMzJfcnNxcnQxNHBkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcnNxcnQxNF9wc18xMjgsIDEyNzg5M30sIC8vIF9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRwczEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3JzcXJ0MTRfcHNfMjU2LCAxMjc5MjZ9LCAvLyBfX2J1aWx0aW5faWEzMl9yc3FydDE0cHMyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yc3FydDE0X3BzXzUxMiwgMTI3OTU5fSwgLy8gX19idWlsdGluX2lhMzJfcnNxcnQxNHBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcnNxcnQxNF9zZCwgMTI3OTkyfSwgLy8gX19idWlsdGluX2lhMzJfcnNxcnQxNHNkX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcnNxcnQxNF9zcywgMTI4MDIyfSwgLy8gX19idWlsdGluX2lhMzJfcnNxcnQxNHNzX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcnNxcnQyOF9wZCwgMTI4MDUyfSwgLy8gX19idWlsdGluX2lhMzJfcnNxcnQyOHBkX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcnNxcnQyOF9wcywgMTI4MDgyfSwgLy8gX19idWlsdGluX2lhMzJfcnNxcnQyOHBzX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcnNxcnQyOF9zZCwgMTI4MTEyfSwgLy8gX19idWlsdGluX2lhMzJfcnNxcnQyOHNkX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcnNxcnQyOF9zcywgMTI4MTQ4fSwgLy8gX19idWlsdGluX2lhMzJfcnNxcnQyOHNzX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfcnNxcnRfcHMsIDEzMzExOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3JzcXJ0cHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfcnNxcnRfcHNfMjU2LCAxMDAzNzJ9LCAvLyBfX2J1aWx0aW5faWEzMl9yc3FydHBzMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlX3JzcXJ0X3NzLCAxMzMxNDF9LCAvLyBfX2J1aWx0aW5faWEzMl9yc3FydHNzCisgICAgICB7SW50cmluc2ljOjp4ODZfcnN0b3Jzc3AsIDEzMjI3MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3JzdG9yc3NwCisgICAgICB7SW50cmluc2ljOjp4ODZfc2F2ZXByZXZzc3AsIDEzMjI5NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3NhdmVwcmV2c3NwCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfc2NhbGVmX3BkXzEyOCwgMTE3MzAzfSwgLy8gX19idWlsdGluX2lhMzJfc2NhbGVmcGQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3NjYWxlZl9wZF8yNTYsIDExNzMzNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYWxlZnBkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19zY2FsZWZfcGRfNTEyLCAxMTczNjd9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2FsZWZwZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfc2NhbGVmX3BzXzEyOCwgMTE3Mzk5fSwgLy8gX19idWlsdGluX2lhMzJfc2NhbGVmcHMxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3NjYWxlZl9wc18yNTYsIDExNzQzMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYWxlZnBzMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19zY2FsZWZfcHNfNTEyLCAxMTc0NjN9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2FsZWZwczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfc2NhbGVmX3NkLCAxMTc0OTV9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2FsZWZzZF9yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfc2NhbGVmX3NzLCAxMTc1MzB9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2FsZWZzc19yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJfcXBzXzUxMiwgMTI4MzkwfSwgLy8gX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjE2c2YKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcl9xcGlfNTEyLCAxMjgzMzF9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2MTZzaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9zY2F0dGVyZGl2Ml9kZiwgMTI4NDIwfSwgLy8gX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjJkZgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9zY2F0dGVyZGl2Ml9kaSwgMTI4NDQ5fSwgLy8gX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjJkaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9zY2F0dGVyZGl2NF9kZiwgMTI4NDc4fSwgLy8gX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjRkZgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9zY2F0dGVyZGl2NF9kaSwgMTI4NTA3fSwgLy8gX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjRkaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9zY2F0dGVyZGl2NF9zZiwgMTI4NTM2fSwgLy8gX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjRzZgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9zY2F0dGVyZGl2NF9zaSwgMTI4NTY1fSwgLy8gX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjRzaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9zY2F0dGVyX3FwZF81MTIsIDEyODMwMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY4ZGYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcl9xcHFfNTEyLCAxMjgzNjF9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2OGRpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJkaXY4X3NmLCAxMjg1OTR9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2OHNmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJkaXY4X3NpLCAxMjg2MjN9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2OHNpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJwZl9kcGRfNTEyLCAxMjg2NTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVycGZkcGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcnBmX2Rwc181MTIsIDEyODY4MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJwZmRwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9zY2F0dGVycGZfcXBkXzUxMiwgMTI4NzA4fSwgLy8gX19idWlsdGluX2lhMzJfc2NhdHRlcnBmcXBkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJwZl9xcHNfNTEyLCAxMjg3MzZ9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVycGZxcHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcl9kcHNfNTEyLCAxMjgyNzJ9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2MTZzZgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9zY2F0dGVyX2RwaV81MTIsIDEyODIxM30sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXYxNnNpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJzaXYyX2RmLCAxMjg3NjR9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2MmRmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJzaXYyX2RpLCAxMjg3OTN9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2MmRpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJzaXY0X2RmLCAxMjg4MjJ9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2NGRmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJzaXY0X2RpLCAxMjg4NTF9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2NGRpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJzaXY0X3NmLCAxMjg4ODB9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2NHNmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJzaXY0X3NpLCAxMjg5MDl9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2NHNpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJfZHBkXzUxMiwgMTI4MTg0fSwgLy8gX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjhkZgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9zY2F0dGVyX2RwcV81MTIsIDEyODI0M30sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY4ZGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcnNpdjhfc2YsIDEyODkzOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY4c2YKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcnNpdjhfc2ksIDEyODk2N30sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY4c2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zZXRzc2JzeSwgMTMyMzIxfSwgLy8gX19idWlsdGluX2lhMzJfc2V0c3Nic3kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2Vfc2ZlbmNlLCAxMzMxNjR9LCAvLyBfX2J1aWx0aW5faWEzMl9zZmVuY2UKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zaGExbXNnMSwgMTMyMzQ1fSwgLy8gX19idWlsdGluX2lhMzJfc2hhMW1zZzEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zaGExbXNnMiwgMTMyMzY5fSwgLy8gX19idWlsdGluX2lhMzJfc2hhMW1zZzIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zaGExbmV4dGUsIDEzMjM5M30sIC8vIF9fYnVpbHRpbl9pYTMyX3NoYTFuZXh0ZQorICAgICAge0ludHJpbnNpYzo6eDg2X3NoYTFybmRzNCwgMTMyNDE4fSwgLy8gX19idWlsdGluX2lhMzJfc2hhMXJuZHM0CisgICAgICB7SW50cmluc2ljOjp4ODZfc2hhMjU2bXNnMSwgMTMyNDQzfSwgLy8gX19idWlsdGluX2lhMzJfc2hhMjU2bXNnMQorICAgICAge0ludHJpbnNpYzo6eDg2X3NoYTI1Nm1zZzIsIDEzMjQ2OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3NoYTI1Nm1zZzIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zaGEyNTZybmRzMiwgMTMyNDk1fSwgLy8gX19idWlsdGluX2lhMzJfc2hhMjU2cm5kczIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zbHdwY2IsIDEzMjUyMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Nsd3BjYgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfc3FydF9wZCwgMTM0ODYxfSwgLy8gX19idWlsdGluX2lhMzJfc3FydHBkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfc3FydF9wZF8xMjgsIDExNzU2NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3NxcnRwZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3NxcnRfcGRfMjU2LCAxMDAzOTh9LCAvLyBfX2J1aWx0aW5faWEzMl9zcXJ0cGQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19zcXJ0X3BkXzI1NiwgMTE3NTk1fSwgLy8gX19idWlsdGluX2lhMzJfc3FydHBkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19zcXJ0X3BkXzUxMiwgMTE3NjI1fSwgLy8gX19idWlsdGluX2lhMzJfc3FydHBkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2Vfc3FydF9wcywgMTMzMTg2fSwgLy8gX19idWlsdGluX2lhMzJfc3FydHBzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfc3FydF9wc18xMjgsIDExNzY1NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3NxcnRwczEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3NxcnRfcHNfMjU2LCAxMDA0MjN9LCAvLyBfX2J1aWx0aW5faWEzMl9zcXJ0cHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19zcXJ0X3BzXzI1NiwgMTE3Njg1fSwgLy8gX19idWlsdGluX2lhMzJfc3FydHBzMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19zcXJ0X3BzXzUxMiwgMTE3NzE1fSwgLy8gX19idWlsdGluX2lhMzJfc3FydHBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3NxcnRfc2QsIDEzNDg4M30sIC8vIF9fYnVpbHRpbl9pYTMyX3NxcnRzZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3NxcnRfc2QsIDExNzc0NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3NxcnRzZF9yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlX3NxcnRfc3MsIDEzMzIwOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3NxcnRzcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3NxcnRfc3MsIDExNzc3OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3NxcnRzc19yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfc3RvcmVfc3MsIDExNzgxMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3N0b3Jlc3NfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3N1YmJvcnJvd191MzIsIDEzNjkwMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3N1YmJvcnJvd191MzIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zdWJib3Jyb3dfdTY0LCAxMzY5Mjl9LCAvLyBfX2J1aWx0aW5faWEzMl9zdWJib3Jyb3dfdTY0CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfc3ViX3BkXzUxMiwgMTE3ODM5fSwgLy8gX19idWlsdGluX2lhMzJfc3VicGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3N1Yl9wc181MTIsIDExNzg2OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3N1YnBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19zdWJfc2Rfcm91bmQsIDExNzg5N30sIC8vIF9fYnVpbHRpbl9pYTMyX3N1YnNkX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19zdWJfc3Nfcm91bmQsIDExNzkyOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3N1YnNzX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfdWNvbWllcV9zcywgMTMzMjMwfSwgLy8gX19idWlsdGluX2lhMzJfdWNvbWllcQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV91Y29taWdlX3NzLCAxMzMyNTN9LCAvLyBfX2J1aWx0aW5faWEzMl91Y29taWdlCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlX3Vjb21pZ3Rfc3MsIDEzMzI3Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Vjb21pZ3QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfdWNvbWlsZV9zcywgMTMzMjk5fSwgLy8gX19idWlsdGluX2lhMzJfdWNvbWlsZQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV91Y29taWx0X3NzLCAxMzMzMjJ9LCAvLyBfX2J1aWx0aW5faWEzMl91Y29taWx0CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlX3Vjb21pbmVxX3NzLCAxMzMzNDV9LCAvLyBfX2J1aWx0aW5faWEzMl91Y29taW5lcQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfdWNvbWllcV9zZCwgMTM0OTA1fSwgLy8gX19idWlsdGluX2lhMzJfdWNvbWlzZGVxCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl91Y29taWdlX3NkLCAxMzQ5MzB9LCAvLyBfX2J1aWx0aW5faWEzMl91Y29taXNkZ2UKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3Vjb21pZ3Rfc2QsIDEzNDk1NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Vjb21pc2RndAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfdWNvbWlsZV9zZCwgMTM0OTgwfSwgLy8gX19idWlsdGluX2lhMzJfdWNvbWlzZGxlCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl91Y29taWx0X3NkLCAxMzUwMDV9LCAvLyBfX2J1aWx0aW5faWEzMl91Y29taXNkbHQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3Vjb21pbmVxX3NkLCAxMzUwMzB9LCAvLyBfX2J1aWx0aW5faWEzMl91Y29taXNkbmVxCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3Zjb21pX3NkLCAxMjg5OTZ9LCAvLyBfX2J1aWx0aW5faWEzMl92Y29taXNkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3Zjb21pX3NzLCAxMjkwMTl9LCAvLyBfX2J1aWx0aW5faWEzMl92Y29taXNzCisgICAgICB7SW50cmluc2ljOjp4ODZfdmN2dHBoMnBzXzEyOCwgMTM3MDEwfSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHBoMnBzCisgICAgICB7SW50cmluc2ljOjp4ODZfdmN2dHBoMnBzXzI1NiwgMTM3MDM1fSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHBoMnBzMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdmN2dHBoMnBzXzI1NiwgMTE3OTkxfSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHBoMnBzMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Y3Z0cGgycHNfNTEyLCAxMTgwMjR9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0cGgycHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZjdnRwaDJwc18xMjgsIDExNzk2MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZjdnRwaDJwc19tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfdmN2dHBzMnBoXzEyOCwgMTM3MDYzfSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHBzMnBoCisgICAgICB7SW50cmluc2ljOjp4ODZfdmN2dHBzMnBoXzI1NiwgMTM3MDg4fSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHBzMnBoMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdmN2dHBzMnBoXzI1NiwgMTE4MDg3fSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHBzMnBoMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Y3Z0cHMycGhfNTEyLCAxMTgxMjB9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGg1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZjdnRwczJwaF8xMjgsIDExODA1N30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3ZjdnRzZDJzaTMyLCAxMjkwNDJ9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0c2Qyc2kzMgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl92Y3Z0c2Qyc2k2NCwgMTI5MDY5fSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHNkMnNpNjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfdmN2dHNkMnVzaTMyLCAxMjkwOTZ9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0c2QydXNpMzIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfdmN2dHNkMnVzaTY0LCAxMjkxMjR9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0c2QydXNpNjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfdmN2dHNzMnNpMzIsIDEyOTE1Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZjdnRzczJzaTMyCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3ZjdnRzczJzaTY0LCAxMjkxNzl9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0c3Myc2k2NAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl92Y3Z0c3MydXNpMzIsIDEyOTIwNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZjdnRzczJ1c2kzMgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl92Y3Z0c3MydXNpNjQsIDEyOTIzNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZjdnRzczJ1c2k2NAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9jdnR0c2Qyc2ksIDEwMzM3Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZjdnR0c2Qyc2kzMgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9jdnR0c2Qyc2k2NCwgMTAzNDA0fSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHRzZDJzaTY0CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2N2dHRzZDJ1c2ksIDEwMzQzMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZjdnR0c2QydXNpMzIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfY3Z0dHNkMnVzaTY0LCAxMDM0NjF9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0dHNkMnVzaTY0CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2N2dHRzczJzaSwgMTAzNDkwfSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHRzczJzaTMyCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2N2dHRzczJzaTY0LCAxMDM1MTh9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0dHNzMnNpNjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfY3Z0dHNzMnVzaSwgMTAzNTQ2fSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHRzczJ1c2kzMgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9jdnR0c3MydXNpNjQsIDEwMzU3NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZjdnR0c3MydXNpNjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcGV4dHJfdywgMTMwODc1fSwgLy8gX19idWlsdGluX2lhMzJfdmVjX2V4dF92NGhpCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BpbnNyX3csIDEzMDkwM30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZlY19zZXRfdjRoaQorICAgICAge0ludHJpbnNpYzo6eDg2X2ZtYV92Zm1hZGRfcGQsIDEyOTcyNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdmZtYWRkX3BkXzEyOCwgMTE4MTUzfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkcGQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1hZGRfcGRfMTI4LCAxMjIxMzd9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDEyOF9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfcGRfMTI4LCAxMjM4MzV9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDEyOF9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2ZtYV92Zm1hZGRfcGRfMjU2LCAxMjk3NTB9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZmbWFkZF9wZF8yNTYsIDExODE4NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtYWRkX3BkXzI1NiwgMTIyMTcwfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkcGQyNTZfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3BkXzI1NiwgMTIzODY4fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkcGQyNTZfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm1hZGRfcGRfNTEyLCAxMTgyMTd9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9wZF81MTIsIDEyMjIwM30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkNTEyX21hc2szCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZF9wZF81MTIsIDEyMzkwMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkNTEyX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfZm1hX3ZmbWFkZF9wcywgMTI5Nzc3fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkcHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm1hZGRfcHNfMTI4LCAxMTgyNDl9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRwczEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9wc18xMjgsIDEyMjIzNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMTI4X21hc2szCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZF9wc18xMjgsIDEyMzkzNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfZm1hX3ZmbWFkZF9wc18yNTYsIDEyOTgwMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdmZtYWRkX3BzXzI1NiwgMTE4MjgxfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkcHMyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1hZGRfcHNfMjU2LCAxMjIyNjl9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1Nl9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfcHNfMjU2LCAxMjM5Njd9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZmbWFkZF9wc181MTIsIDExODMxM30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtYWRkX3BzXzUxMiwgMTIyMzAyfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkcHM1MTJfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3BzXzUxMiwgMTI0MDAwfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkcHM1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9mbWE0X3ZmbWFkZF9zZCwgMTI5OTkyfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc2QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9mbWFfdmZtYWRkX3NkLCAxMjk4Mjh9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzZDMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm1hZGRfc2QsIDExODM0NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkM19tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9zZCwgMTIyMzM1fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc2QzX21hc2szCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZF9zZCwgMTI0MDMzfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc2QzX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfZm1hNF92Zm1hZGRfc3MsIDEzMDAxNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzCisgICAgICB7SW50cmluc2ljOjp4ODZfZm1hX3ZmbWFkZF9zcywgMTI5ODUzfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3MzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdmZtYWRkX3NzLCAxMTgzNzV9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzczNfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1hZGRfc3MsIDEyMjM2Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzM19tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfc3MsIDEyNDA2NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzM19tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2ZtYV92Zm1hZGRzdWJfcGQsIDEyOTg3OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdmZtYWRkc3ViX3BkXzEyOCwgMTE4NDA1fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1hZGRzdWJfcGRfMTI4LCAxMjIzOTd9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDEyOF9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92Zm1hZGRzdWJfcGRfMTI4LCAxMjQwOTV9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDEyOF9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2ZtYV92Zm1hZGRzdWJfcGRfMjU2LCAxMjk5MDV9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZmbWFkZHN1Yl9wZF8yNTYsIDExODQ0MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtYWRkc3ViX3BkXzI1NiwgMTIyNDMzfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQyNTZfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdmZtYWRkc3ViX3BkXzI1NiwgMTI0MTMxfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQyNTZfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm1hZGRzdWJfcGRfNTEyLCAxMTg0NzV9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZHN1Yl9wZF81MTIsIDEyMjQ2OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkNTEyX21hc2szCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZHN1Yl9wZF81MTIsIDEyNDE2N30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkNTEyX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfZm1hX3ZmbWFkZHN1Yl9wcywgMTI5OTM1fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm1hZGRzdWJfcHNfMTI4LCAxMTg1MTB9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZHN1Yl9wc18xMjgsIDEyMjUwNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMTI4X21hc2szCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZHN1Yl9wc18xMjgsIDEyNDIwM30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfZm1hX3ZmbWFkZHN1Yl9wc18yNTYsIDEyOTk2Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdmZtYWRkc3ViX3BzXzI1NiwgMTE4NTQ1fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1hZGRzdWJfcHNfMjU2LCAxMjI1NDF9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczI1Nl9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92Zm1hZGRzdWJfcHNfMjU2LCAxMjQyMzl9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZmbWFkZHN1Yl9wc181MTIsIDExODU4MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtYWRkc3ViX3BzXzUxMiwgMTIyNTc3fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHM1MTJfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdmZtYWRkc3ViX3BzXzUxMiwgMTI0Mjc1fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHM1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtc3ViYWRkX3BkXzEyOCwgMTIyODczfSwgLy8gX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcGQxMjhfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtc3ViYWRkX3BkXzI1NiwgMTIyOTA5fSwgLy8gX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcGQyNTZfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtc3ViYWRkX3BkXzUxMiwgMTIyOTQ1fSwgLy8gX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcGQ1MTJfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtc3ViYWRkX3BzXzEyOCwgMTIyOTgxfSwgLy8gX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcHMxMjhfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtc3ViYWRkX3BzXzI1NiwgMTIzMDE3fSwgLy8gX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcHMyNTZfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtc3ViYWRkX3BzXzUxMiwgMTIzMDUzfSwgLy8gX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcHM1MTJfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3BkXzEyOCwgMTIyNjEzfSwgLy8gX19idWlsdGluX2lhMzJfdmZtc3VicGQxMjhfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3BkXzI1NiwgMTIyNjQ2fSwgLy8gX19idWlsdGluX2lhMzJfdmZtc3VicGQyNTZfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3BkXzUxMiwgMTIyNjc5fSwgLy8gX19idWlsdGluX2lhMzJfdmZtc3VicGQ1MTJfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3BzXzEyOCwgMTIyNzEyfSwgLy8gX19idWlsdGluX2lhMzJfdmZtc3VicHMxMjhfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3BzXzI1NiwgMTIyNzQ1fSwgLy8gX19idWlsdGluX2lhMzJfdmZtc3VicHMyNTZfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3BzXzUxMiwgMTIyNzc4fSwgLy8gX19idWlsdGluX2lhMzJfdmZtc3VicHM1MTJfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3NkLCAxMjI4MTF9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1zdWJzZDNfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3NzLCAxMjI4NDJ9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1zdWJzczNfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm5tYWRkX3BkXzEyOCwgMTE4NjE1fSwgLy8gX19idWlsdGluX2lhMzJfdmZubWFkZHBkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm5tYWRkX3BkXzI1NiwgMTE4NjQ4fSwgLy8gX19idWlsdGluX2lhMzJfdmZubWFkZHBkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm5tYWRkX3BkXzUxMiwgMTE4NjgxfSwgLy8gX19idWlsdGluX2lhMzJfdmZubWFkZHBkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm5tYWRkX3BzXzEyOCwgMTE4NzE0fSwgLy8gX19idWlsdGluX2lhMzJfdmZubWFkZHBzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm5tYWRkX3BzXzI1NiwgMTE4NzQ3fSwgLy8gX19idWlsdGluX2lhMzJfdmZubWFkZHBzMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm5tYWRkX3BzXzUxMiwgMTE4NzgwfSwgLy8gX19idWlsdGluX2lhMzJfdmZubWFkZHBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm5tc3ViX3BkXzEyOCwgMTE4ODEzfSwgLy8gX19idWlsdGluX2lhMzJfdmZubXN1YnBkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZubXN1Yl9wZF8xMjgsIDEyMzA4OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwZDEyOF9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zmbm1zdWJfcGRfMjU2LCAxMTg4NDZ9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm5tc3VicGQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm5tc3ViX3BkXzI1NiwgMTIzMTIzfSwgLy8gX19idWlsdGluX2lhMzJfdmZubXN1YnBkMjU2X21hc2szCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdmZubXN1Yl9wZF81MTIsIDExODg3OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfcGRfNTEyLCAxMjMxNTd9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm5tc3VicGQ1MTJfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm5tc3ViX3BzXzEyOCwgMTE4OTEyfSwgLy8gX19idWlsdGluX2lhMzJfdmZubXN1YnBzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZubXN1Yl9wc18xMjgsIDEyMzE5MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwczEyOF9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zmbm1zdWJfcHNfMjU2LCAxMTg5NDV9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm5tc3VicHMyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm5tc3ViX3BzXzI1NiwgMTIzMjI1fSwgLy8gX19idWlsdGluX2lhMzJfdmZubXN1YnBzMjU2X21hc2szCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdmZubXN1Yl9wc181MTIsIDExODk3OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfcHNfNTEyLCAxMjMyNTl9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm5tc3VicHM1MTJfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZubXN1Yl9zZCwgMTIzMjkzfSwgLy8gX19idWlsdGluX2lhMzJfdmZubXN1YnNkM19tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm5tc3ViX3NzLCAxMjMzMjV9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm5tc3Vic3MzX21hc2szCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZmcmN6X3BkLCAxMzc3MTN9LCAvLyBfX2J1aWx0aW5faWEzMl92ZnJjenBkCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZmcmN6X3BkXzI1NiwgMTM3NzM2fSwgLy8gX19idWlsdGluX2lhMzJfdmZyY3pwZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92ZnJjel9wcywgMTM3NzYyfSwgLy8gX19idWlsdGluX2lhMzJfdmZyY3pwcworICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92ZnJjel9wc18yNTYsIDEzNzc4NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmcmN6cHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdmZyY3pfc2QsIDEzNzgxMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmcmN6c2QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdmZyY3pfc3MsIDEzNzgzNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmcmN6c3MKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl92Z2YycDhhZmZpbmVpbnZxYl8xMjgsIDEzNzExNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZnZjJwOGFmZmluZWludnFiX3YxNnFpCisgICAgICB7SW50cmluc2ljOjp4ODZfdmdmMnA4YWZmaW5laW52cWJfMjU2LCAxMzcxNTV9LCAvLyBfX2J1aWx0aW5faWEzMl92Z2YycDhhZmZpbmVpbnZxYl92MzJxaQorICAgICAge0ludHJpbnNpYzo6eDg2X3ZnZjJwOGFmZmluZWludnFiXzUxMiwgMTM3MTk0fSwgLy8gX19idWlsdGluX2lhMzJfdmdmMnA4YWZmaW5laW52cWJfdjY0cWkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl92Z2YycDhhZmZpbmVxYl8xMjgsIDEzNzIzM30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZnZjJwOGFmZmluZXFiX3YxNnFpCisgICAgICB7SW50cmluc2ljOjp4ODZfdmdmMnA4YWZmaW5lcWJfMjU2LCAxMzcyNjl9LCAvLyBfX2J1aWx0aW5faWEzMl92Z2YycDhhZmZpbmVxYl92MzJxaQorICAgICAge0ludHJpbnNpYzo6eDg2X3ZnZjJwOGFmZmluZXFiXzUxMiwgMTM3MzA1fSwgLy8gX19idWlsdGluX2lhMzJfdmdmMnA4YWZmaW5lcWJfdjY0cWkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl92Z2YycDhtdWxiXzEyOCwgMTM3MzQxfSwgLy8gX19idWlsdGluX2lhMzJfdmdmMnA4bXVsYl92MTZxaQorICAgICAge0ludHJpbnNpYzo6eDg2X3ZnZjJwOG11bGJfMjU2LCAxMzczNzN9LCAvLyBfX2J1aWx0aW5faWEzMl92Z2YycDhtdWxiX3YzMnFpCisgICAgICB7SW50cmluc2ljOjp4ODZfdmdmMnA4bXVsYl81MTIsIDEzNzQwNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZnZjJwOG11bGJfdjY0cWkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBjb21iLCAxMzc4NTd9LCAvLyBfX2J1aWx0aW5faWEzMl92cGNvbWIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBjb21kLCAxMzc4Nzl9LCAvLyBfX2J1aWx0aW5faWEzMl92cGNvbWQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBjb21xLCAxMzc5MDF9LCAvLyBfX2J1aWx0aW5faWEzMl92cGNvbXEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBjb211YiwgMTM3OTIzfSwgLy8gX19idWlsdGluX2lhMzJfdnBjb211YgorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGNvbXVkLCAxMzc5NDZ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGNvbXVkCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwY29tdXEsIDEzNzk2OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwY29tdXEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBjb211dywgMTM3OTkyfSwgLy8gX19idWlsdGluX2lhMzJfdnBjb211dworICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGNvbXcsIDEzODAxNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwY29tdworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbmZsaWN0X3FfMTI4LCAxMDYxNjV9LCAvLyBfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0ZGlfMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb25mbGljdF9xXzI1NiwgMTA2MjAyfSwgLy8gX19idWlsdGluX2lhMzJfdnBjb25mbGljdGRpXzI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29uZmxpY3RfcV81MTIsIDEwNjIzOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwY29uZmxpY3RkaV81MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbmZsaWN0X2RfMTI4LCAxMDYwNTR9LCAvLyBfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0c2lfMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb25mbGljdF9kXzI1NiwgMTA2MDkxfSwgLy8gX19idWlsdGluX2lhMzJfdnBjb25mbGljdHNpXzI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29uZmxpY3RfZF81MTIsIDEwNjEyOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwY29uZmxpY3RzaV81MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZHBidXNkXzEyOCwgMTE5MDExfSwgLy8gX19idWlsdGluX2lhMzJfdnBkcGJ1c2QxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cGRwYnVzZF8xMjgsIDEyNDMxMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBkcGJ1c2RfMjU2LCAxMTkwNDN9LCAvLyBfX2J1aWx0aW5faWEzMl92cGRwYnVzZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZHBidXNkXzI1NiwgMTI0MzQ0fSwgLy8gX19idWlsdGluX2lhMzJfdnBkcGJ1c2QyNTZfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGRwYnVzZF81MTIsIDExOTA3NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBkcGJ1c2RfNTEyLCAxMjQzNzd9LCAvLyBfX2J1aWx0aW5faWEzMl92cGRwYnVzZDUxMl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZHBidXNkc18xMjgsIDExOTEwN30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkczEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZHBidXNkc18xMjgsIDEyNDQxMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkczEyOF9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZHBidXNkc18yNTYsIDExOTE0MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkczI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZHBidXNkc18yNTYsIDEyNDQ0NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkczI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZHBidXNkc181MTIsIDExOTE3M30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZHBidXNkc181MTIsIDEyNDQ3OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkczUxMl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZHB3c3NkXzEyOCwgMTE5MjA2fSwgLy8gX19idWlsdGluX2lhMzJfdnBkcHdzc2QxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cGRwd3NzZF8xMjgsIDEyNDUxMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBkcHdzc2RfMjU2LCAxMTkyMzh9LCAvLyBfX2J1aWx0aW5faWEzMl92cGRwd3NzZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZHB3c3NkXzI1NiwgMTI0NTQ1fSwgLy8gX19idWlsdGluX2lhMzJfdnBkcHdzc2QyNTZfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGRwd3NzZF81MTIsIDExOTI3MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBkcHdzc2RfNTEyLCAxMjQ1Nzh9LCAvLyBfX2J1aWx0aW5faWEzMl92cGRwd3NzZDUxMl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZHB3c3Nkc18xMjgsIDExOTMwMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkczEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZHB3c3Nkc18xMjgsIDEyNDYxMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkczEyOF9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZHB3c3Nkc18yNTYsIDExOTMzNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkczI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZHB3c3Nkc18yNTYsIDEyNDY0NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkczI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZHB3c3Nkc181MTIsIDExOTM2OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZHB3c3Nkc181MTIsIDEyNDY3OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkczUxMl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfZF8xMjgsIDExOTQwMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGVybWkydmFyX2RfMjU2LCAxMTk0MzZ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWkydmFyZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9kXzUxMiwgMTE5NDcxfSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcmQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfaGlfMTI4LCAxMTk1MDZ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWkydmFyaGkxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfaGlfMjU2LCAxMTk1NDJ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWkydmFyaGkyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfaGlfNTEyLCAxMTk1Nzh9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWkydmFyaGk1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcGRfMTI4LCAxMTk2MTR9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWkydmFycGQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcGRfMjU2LCAxMTk2NTB9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWkydmFycGQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcGRfNTEyLCAxMTk2ODZ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWkydmFycGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcHNfMTI4LCAxMTk3MjJ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWkydmFycHMxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcHNfMjU2LCAxMTk3NTh9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWkydmFycHMyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcHNfNTEyLCAxMTk3OTR9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWkydmFycHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcV8xMjgsIDExOTgzMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJxMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGVybWkydmFyX3FfMjU2LCAxMTk4NjV9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWkydmFycTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9xXzUxMiwgMTE5OTAwfSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnE1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcWlfMTI4LCAxMTk5MzV9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWkydmFycWkxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcWlfMjU2LCAxMTk5NzF9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWkydmFycWkyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcWlfNTEyLCAxMjAwMDd9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWkydmFycWk1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGVybWlsMnBkLCAxMzgwMzd9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWlsMnBkCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwZXJtaWwycGRfMjU2LCAxMzgwNjN9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWlsMnBkMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwZXJtaWwycHMsIDEzODA5Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWwycHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBlcm1pbDJwc18yNTYsIDEzODExOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWwycHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfdnBlcm1pbHZhcl9wZCwgMTAwNDQ4fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3ZwZXJtaWx2YXJfcGRfMjU2LCAxMDA0NzZ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycGQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfdnBlcm1pbHZhcl9wZF81MTIsIDEyOTI2Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwZDUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF92cGVybWlsdmFyX3BzLCAxMDA1MDd9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfdnBlcm1pbHZhcl9wc18yNTYsIDEwMDUzNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl92cGVybWlsdmFyX3BzXzUxMiwgMTI5MjkzfSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBzNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9kXzEyOCwgMTIwMDQzfSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX2RfMTI4LCAxMjQ3MTN9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFyZDEyOF9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfZF8yNTYsIDEyMDA3OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9kXzI1NiwgMTI0NzQ5fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmQyNTZfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGVybXQydmFyX2RfNTEyLCAxMjAxMTN9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFyZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfZF81MTIsIDEyNDc4NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJkNTEyX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9oaV8xMjgsIDEyMDE0OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJoaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfaGlfMTI4LCAxMjQ4MjF9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFyaGkxMjhfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGVybXQydmFyX2hpXzI1NiwgMTIwMTg0fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmhpMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9oaV8yNTYsIDEyNDg1OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJoaTI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfaGlfNTEyLCAxMjAyMjB9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFyaGk1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX2hpXzUxMiwgMTI0ODk1fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmhpNTEyX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9wZF8xMjgsIDEyMDI1Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcGRfMTI4LCAxMjQ5MzJ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycGQxMjhfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3BkXzI1NiwgMTIwMjkyfSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9wZF8yNTYsIDEyNDk2OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwZDI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcGRfNTEyLCAxMjAzMjh9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3BkXzUxMiwgMTI1MDA2fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBkNTEyX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9wc18xMjgsIDEyMDM2NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwczEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcHNfMTI4LCAxMjUwNDN9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycHMxMjhfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3BzXzI1NiwgMTIwNDAwfSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBzMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9wc18yNTYsIDEyNTA4MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwczI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcHNfNTEyLCAxMjA0MzZ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3BzXzUxMiwgMTI1MTE3fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBzNTEyX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9xXzEyOCwgMTIwNDcyfSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3FfMTI4LCAxMjUxNTR9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycTEyOF9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcV8yNTYsIDEyMDUwN30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9xXzI1NiwgMTI1MTkwfSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnEyNTZfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3FfNTEyLCAxMjA1NDJ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcV81MTIsIDEyNTIyNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxNTEyX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9xaV8xMjgsIDEyMDU3N30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcWlfMTI4LCAxMjUyNjJ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycWkxMjhfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3FpXzI1NiwgMTIwNjEzfSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnFpMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9xaV8yNTYsIDEyNTI5OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxaTI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcWlfNTEyLCAxMjA2NDl9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycWk1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3FpXzUxMiwgMTI1MzM2fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnFpNTEyX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwaGFkZGJkLCAxMzgxNDd9LCAvLyBfX2J1aWx0aW5faWEzMl92cGhhZGRiZAorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGhhZGRicSwgMTM4MTcxfSwgLy8gX19idWlsdGluX2lhMzJfdnBoYWRkYnEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBoYWRkYncsIDEzODE5NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZGJ3CisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwaGFkZGRxLCAxMzgyMTl9LCAvLyBfX2J1aWx0aW5faWEzMl92cGhhZGRkcQorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGhhZGR1YmQsIDEzODI0M30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHViZAorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGhhZGR1YnEsIDEzODI2OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHVicQorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGhhZGR1YncsIDEzODI5M30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHVidworICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGhhZGR1ZHEsIDEzODMxOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHVkcQorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGhhZGR1d2QsIDEzODM0M30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHV3ZAorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGhhZGR1d3EsIDEzODM2OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHV3cQorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGhhZGR3ZCwgMTM4MzkzfSwgLy8gX19idWlsdGluX2lhMzJfdnBoYWRkd2QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBoYWRkd3EsIDEzODQxN30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHdxCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwaHN1YmJ3LCAxMzg0NDF9LCAvLyBfX2J1aWx0aW5faWEzMl92cGhzdWJidworICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGhzdWJkcSwgMTM4NDY1fSwgLy8gX19idWlsdGluX2lhMzJfdnBoc3ViZHEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBoc3Vid2QsIDEzODQ4OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwaHN1YndkCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwbWFjc2RkLCAxMzg1MTN9LCAvLyBfX2J1aWx0aW5faWEzMl92cG1hY3NkZAorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cG1hY3NkcWgsIDEzODUzN30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc2RxaAorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cG1hY3NkcWwsIDEzODU2Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc2RxbAorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cG1hY3NzZGQsIDEzODU4N30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc3NkZAorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cG1hY3NzZHFoLCAxMzg2MTJ9LCAvLyBfX2J1aWx0aW5faWEzMl92cG1hY3NzZHFoCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwbWFjc3NkcWwsIDEzODYzOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc3NkcWwKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBtYWNzc3dkLCAxMzg2NjR9LCAvLyBfX2J1aWx0aW5faWEzMl92cG1hY3Nzd2QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBtYWNzc3d3LCAxMzg2ODl9LCAvLyBfX2J1aWx0aW5faWEzMl92cG1hY3Nzd3cKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBtYWNzd2QsIDEzODcxNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc3dkCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwbWFjc3d3LCAxMzg3Mzh9LCAvLyBfX2J1aWx0aW5faWEzMl92cG1hY3N3dworICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cG1hZGNzc3dkLCAxMzg3NjJ9LCAvLyBfX2J1aWx0aW5faWEzMl92cG1hZGNzc3dkCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwbWFkY3N3ZCwgMTM4Nzg4fSwgLy8gX19idWlsdGluX2lhMzJfdnBtYWRjc3dkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBtYWRkNTJoX3VxXzEyOCwgMTIwNjg1fSwgLy8gX19idWlsdGluX2lhMzJfdnBtYWRkNTJodXExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cG1hZGQ1MmhfdXFfMTI4LCAxMjUzNzN9LCAvLyBfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmh1cTEyOF9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwbWFkZDUyaF91cV8yNTYsIDEyMDcyMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUyaHVxMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBtYWRkNTJoX3VxXzI1NiwgMTI1NDA5fSwgLy8gX19idWlsdGluX2lhMzJfdnBtYWRkNTJodXEyNTZfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cG1hZGQ1MmhfdXFfNTEyLCAxMjA3NTV9LCAvLyBfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmh1cTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwbWFkZDUyaF91cV81MTIsIDEyNTQ0NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUyaHVxNTEyX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBtYWRkNTJsX3VxXzEyOCwgMTIwNzkwfSwgLy8gX19idWlsdGluX2lhMzJfdnBtYWRkNTJsdXExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cG1hZGQ1MmxfdXFfMTI4LCAxMjU0ODF9LCAvLyBfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmx1cTEyOF9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwbWFkZDUybF91cV8yNTYsIDEyMDgyNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUybHVxMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBtYWRkNTJsX3VxXzI1NiwgMTI1NTE3fSwgLy8gX19idWlsdGluX2lhMzJfdnBtYWRkNTJsdXEyNTZfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cG1hZGQ1MmxfdXFfNTEyLCAxMjA4NjB9LCAvLyBfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmx1cTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwbWFkZDUybF91cV81MTIsIDEyNTU1M30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUybHVxNTEyX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG11bHRpc2hpZnRfcWJfMTI4LCAxMTUzNzV9LCAvLyBfX2J1aWx0aW5faWEzMl92cG11bHRpc2hpZnRxYjEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG11bHRpc2hpZnRfcWJfMjU2LCAxMTU0MTN9LCAvLyBfX2J1aWx0aW5faWEzMl92cG11bHRpc2hpZnRxYjI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG11bHRpc2hpZnRfcWJfNTEyLCAxMTU0NTF9LCAvLyBfX2J1aWx0aW5faWEzMl92cG11bHRpc2hpZnRxYjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwcGVybSwgMTM4ODEzfSwgLy8gX19idWlsdGluX2lhMzJfdnBwZXJtCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3Zwcm90YiwgMTM4ODM1fSwgLy8gX19idWlsdGluX2lhMzJfdnByb3RiCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3Zwcm90YmksIDEzODg1N30sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwcm90YmkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnByb3RkLCAxMzg4ODB9LCAvLyBfX2J1aWx0aW5faWEzMl92cHJvdGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnByb3RkaSwgMTM4OTAyfSwgLy8gX19idWlsdGluX2lhMzJfdnByb3RkaQorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cHJvdHEsIDEzODkyNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwcm90cQorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cHJvdHFpLCAxMzg5NDd9LCAvLyBfX2J1aWx0aW5faWEzMl92cHJvdHFpCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3Zwcm90dywgMTM4OTcwfSwgLy8gX19idWlsdGluX2lhMzJfdnByb3R3CisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3Zwcm90d2ksIDEzODk5Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwcm90d2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBzaGFiLCAxMzkwMTV9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNoYWIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBzaGFkLCAxMzkwMzd9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNoYWQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBzaGFxLCAxMzkwNTl9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNoYXEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBzaGF3LCAxMzkwODF9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNoYXcKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBzaGxiLCAxMzkxMDN9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBzaGxkLCAxMzkxMjV9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNobGRfZF8xMjgsIDEyMDg5NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZGQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hsZF9kXzI1NiwgMTIwOTI2fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaGxkX2RfNTEyLCAxMjA5NTd9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGRkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNobGRfcV8xMjgsIDEyMDk4OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hsZF9xXzI1NiwgMTIxMDE5fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkcTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaGxkX3FfNTEyLCAxMjEwNTB9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGRxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNobGR2X2RfMTI4LCAxMjExNzR9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGR2ZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfZF8xMjgsIDEyNTU4OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZkMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaGxkdl9kXzI1NiwgMTIxMjA2fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkdmQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cHNobGR2X2RfMjU2LCAxMjU2MjJ9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGR2ZDI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfZF81MTIsIDEyMTIzOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl9kXzUxMiwgMTI1NjU1fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkdmQ1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNobGR2X3FfMTI4LCAxMjEyNzB9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGR2cTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfcV8xMjgsIDEyNTY4OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZxMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaGxkdl9xXzI1NiwgMTIxMzAyfSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkdnEyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cHNobGR2X3FfMjU2LCAxMjU3MjF9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGR2cTI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfcV81MTIsIDEyMTMzNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl9xXzUxMiwgMTI1NzU0fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkdnE1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNobGR2X3dfMTI4LCAxMjEzNjZ9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGR2dzEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfd18xMjgsIDEyNTc4N30sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZ3MTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaGxkdl93XzI1NiwgMTIxMzk4fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkdncyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cHNobGR2X3dfMjU2LCAxMjU4MjB9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGR2dzI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfd181MTIsIDEyMTQzMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZ3NTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl93XzUxMiwgMTI1ODUzfSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkdnc1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNobGRfd18xMjgsIDEyMTA4MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHcxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hsZF93XzI1NiwgMTIxMTEyfSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkdzI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaGxkX3dfNTEyLCAxMjExNDN9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGR3NTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBzaGxxLCAxMzkxNDd9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobHEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBzaGx3LCAxMzkxNjl9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobHcKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNocmRfZF8xMjgsIDEyMTQ2Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZGQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hyZF9kXzI1NiwgMTIxNDkzfSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaHJkX2RfNTEyLCAxMjE1MjR9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmRkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNocmRfcV8xMjgsIDEyMTU1NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hyZF9xXzI1NiwgMTIxNTg2fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkcTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaHJkX3FfNTEyLCAxMjE2MTd9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmRxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNocmR2X2RfMTI4LCAxMjE3NDF9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmR2ZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfZF8xMjgsIDEyNTg4Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZkMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaHJkdl9kXzI1NiwgMTIxNzczfSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkdmQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cHNocmR2X2RfMjU2LCAxMjU5MTl9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmR2ZDI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfZF81MTIsIDEyMTgwNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl9kXzUxMiwgMTI1OTUyfSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkdmQ1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNocmR2X3FfMTI4LCAxMjE4Mzd9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmR2cTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfcV8xMjgsIDEyNTk4NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZxMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaHJkdl9xXzI1NiwgMTIxODY5fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkdnEyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cHNocmR2X3FfMjU2LCAxMjYwMTh9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmR2cTI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfcV81MTIsIDEyMTkwMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl9xXzUxMiwgMTI2MDUxfSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkdnE1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNocmR2X3dfMTI4LCAxMjE5MzN9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmR2dzEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfd18xMjgsIDEyNjA4NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZ3MTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaHJkdl93XzI1NiwgMTIxOTY1fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkdncyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cHNocmR2X3dfMjU2LCAxMjYxMTd9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmR2dzI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfd181MTIsIDEyMTk5N30sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZ3NTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl93XzUxMiwgMTI2MTUwfSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkdnc1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNocmRfd18xMjgsIDEyMTY0OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHcxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hyZF93XzI1NiwgMTIxNjc5fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkdzI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaHJkX3dfNTEyLCAxMjE3MTB9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmR3NTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNodWZiaXRxbWJfMTI4LCAxMjIwMjl9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNodWZiaXRxbWIxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2h1ZmJpdHFtYl8yNTYsIDEyMjA2NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2h1ZmJpdHFtYjI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaHVmYml0cW1iXzUxMiwgMTIyMTAxfSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHVmYml0cW1iNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfdnRlc3RjX3BkLCAxMDA1NjZ9LCAvLyBfX2J1aWx0aW5faWEzMl92dGVzdGNwZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF92dGVzdGNfcGRfMjU2LCAxMDA1OTB9LCAvLyBfX2J1aWx0aW5faWEzMl92dGVzdGNwZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF92dGVzdGNfcHMsIDEwMDYxN30sIC8vIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0Y3BzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0Y19wc18yNTYsIDEwMDY0MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0Y3BzMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0bnpjX3BkLCAxMDA2Njh9LCAvLyBfX2J1aWx0aW5faWEzMl92dGVzdG56Y3BkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0bnpjX3BkXzI1NiwgMTAwNjk0fSwgLy8gX19idWlsdGluX2lhMzJfdnRlc3RuemNwZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF92dGVzdG56Y19wcywgMTAwNzIzfSwgLy8gX19idWlsdGluX2lhMzJfdnRlc3RuemNwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF92dGVzdG56Y19wc18yNTYsIDEwMDc0OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0bnpjcHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfdnRlc3R6X3BkLCAxMDA3Nzh9LCAvLyBfX2J1aWx0aW5faWEzMl92dGVzdHpwZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF92dGVzdHpfcGRfMjU2LCAxMDA4MDJ9LCAvLyBfX2J1aWx0aW5faWEzMl92dGVzdHpwZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF92dGVzdHpfcHMsIDEwMDgyOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0enBzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0el9wc18yNTYsIDEwMDg1M30sIC8vIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0enBzMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3Z6ZXJvYWxsLCAxMDA4ODB9LCAvLyBfX2J1aWx0aW5faWEzMl92emVyb2FsbAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF92emVyb3VwcGVyLCAxMDA5MDR9LCAvLyBfX2J1aWx0aW5faWEzMl92emVyb3VwcGVyCisgICAgICB7SW50cmluc2ljOjp4ODZfd3Jmc2Jhc2VfMzIsIDEzNzQzN30sIC8vIF9fYnVpbHRpbl9pYTMyX3dyZnNiYXNlMzIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl93cmZzYmFzZV82NCwgMTM3NDYzfSwgLy8gX19idWlsdGluX2lhMzJfd3Jmc2Jhc2U2NAorICAgICAge0ludHJpbnNpYzo6eDg2X3dyZ3NiYXNlXzMyLCAxMzc0ODl9LCAvLyBfX2J1aWx0aW5faWEzMl93cmdzYmFzZTMyCisgICAgICB7SW50cmluc2ljOjp4ODZfd3Jnc2Jhc2VfNjQsIDEzNzUxNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3dyZ3NiYXNlNjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9mbGFnc193cml0ZV91MzIsIDEyOTY2NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3dyaXRlZWZsYWdzX3UzMgorICAgICAge0ludHJpbnNpYzo6eDg2X2ZsYWdzX3dyaXRlX3U2NCwgMTI5Njk1fSwgLy8gX19idWlsdGluX2lhMzJfd3JpdGVlZmxhZ3NfdTY0CisgICAgICB7SW50cmluc2ljOjp4ODZfd3Jwa3J1LCAxMzc1NDF9LCAvLyBfX2J1aWx0aW5faWEzMl93cnBrcnUKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl93cnNzZCwgMTM3NTYzfSwgLy8gX19idWlsdGluX2lhMzJfd3Jzc2QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl93cnNzcSwgMTM3NTg0fSwgLy8gX19idWlsdGluX2lhMzJfd3Jzc3EKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl93cnVzc2QsIDEzNzYwNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3dydXNzZAorICAgICAge0ludHJpbnNpYzo6eDg2X3dydXNzcSwgMTM3NjI3fSwgLy8gX19idWlsdGluX2lhMzJfd3J1c3NxCisgICAgICB7SW50cmluc2ljOjp4ODZfeGFib3J0LCAxMzc2NDl9LCAvLyBfX2J1aWx0aW5faWEzMl94YWJvcnQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94YmVnaW4sIDEzNzY3MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3hiZWdpbgorICAgICAge0ludHJpbnNpYzo6eDg2X3hlbmQsIDEzNzY5M30sIC8vIF9fYnVpbHRpbl9pYTMyX3hlbmQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94dGVzdCwgMTM5MTkxfSwgLy8gX19idWlsdGluX2lhMzJfeHRlc3QKKyAgICB9OworICAgIGF1dG8gSSA9IHN0ZDo6bG93ZXJfYm91bmQoc3RkOjpiZWdpbih4ODZOYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZCh4ODZOYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluTmFtZVN0cik7CisgICAgaWYgKEkgIT0gc3RkOjplbmQoeDg2TmFtZXMpICYmCisgICAgICAgIEktPmdldE5hbWUoKSA9PSBCdWlsdGluTmFtZVN0cikKKyAgICAgIHJldHVybiBJLT5JbnRyaW5JRDsKKyAgfQorICBpZiAoVGFyZ2V0UHJlZml4ID09ICJ4Y29yZSIpIHsKKyAgICBzdGF0aWMgY29uc3QgQnVpbHRpbkVudHJ5IHhjb3JlTmFtZXNbXSA9IHsKKyAgICAgIHtJbnRyaW5zaWM6Onhjb3JlX2JpdHJldiwgMTM5MjEyfSwgLy8gX19idWlsdGluX2JpdHJldgorICAgICAge0ludHJpbnNpYzo6eGNvcmVfZ2V0aWQsIDEzOTIyOX0sIC8vIF9fYnVpbHRpbl9nZXRpZAorICAgICAge0ludHJpbnNpYzo6eGNvcmVfZ2V0cHMsIDEzOTI0NX0sIC8vIF9fYnVpbHRpbl9nZXRwcworICAgICAge0ludHJpbnNpYzo6eGNvcmVfc2V0cHMsIDEzOTI2MX0sIC8vIF9fYnVpbHRpbl9zZXRwcworICAgIH07CisgICAgYXV0byBJID0gc3RkOjpsb3dlcl9ib3VuZChzdGQ6OmJlZ2luKHhjb3JlTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjplbmQoeGNvcmVOYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluTmFtZVN0cik7CisgICAgaWYgKEkgIT0gc3RkOjplbmQoeGNvcmVOYW1lcykgJiYKKyAgICAgICAgSS0+Z2V0TmFtZSgpID09IEJ1aWx0aW5OYW1lU3RyKQorICAgICAgcmV0dXJuIEktPkludHJpbklEOworICB9CisgIHJldHVybiBJbnRyaW5zaWM6Om5vdF9pbnRyaW5zaWM7Cit9CisjZW5kaWYKKworLy8gR2V0IHRoZSBMTFZNIGludHJpbnNpYyB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgYnVpbHRpbi4KKy8vIFRoaXMgaXMgdXNlZCBieSB0aGUgQyBmcm9udC1lbmQuICBUaGUgYnVpbHRpbiBuYW1lIGlzIHBhc3NlZAorLy8gaW4gYXMgQnVpbHRpbk5hbWUsIGFuZCBhIHRhcmdldCBwcmVmaXggKGUuZy4gJ3BwYycpIGlzIHBhc3NlZAorLy8gaW4gYXMgVGFyZ2V0UHJlZml4LiAgVGhlIHJlc3VsdCBpcyBhc3NpZ25lZCB0byAnSW50cmluc2ljSUQnLgorI2lmZGVmIEdFVF9MTFZNX0lOVFJJTlNJQ19GT1JfTVNfQlVJTFRJTgorSW50cmluc2ljOjpJRCBJbnRyaW5zaWM6OmdldEludHJpbnNpY0Zvck1TQnVpbHRpbihjb25zdCBjaGFyICpUYXJnZXRQcmVmaXhTdHIsIFN0cmluZ1JlZiBCdWlsdGluTmFtZVN0cikgeworICBzdGF0aWMgY29uc3QgY2hhciBCdWlsdGluTmFtZXNbXSA9IHsKKyAgJ18nLCAnXycsICdkJywgJ20nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdkJywgJ3MnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdpJywKKyAgJ3MnLCAnYicsICdcMDAwJywgJ18nLCAnTScsICdvJywgJ3YnLCAnZScsICdGJywgJ3InLCAnbycsICdtJywgJ0MnLCAnbycsICdwJywKKyAgJ3InLCAnbycsICdjJywgJ2UnLCAncycsICdzJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnTScsICdvJywgJ3YnLCAnZScsICdGJywKKyAgJ3InLCAnbycsICdtJywgJ0MnLCAnbycsICdwJywgJ3InLCAnbycsICdjJywgJ2UnLCAncycsICdzJywgJ28nLCAncicsICcyJywKKyAgJ1wwMDAnLAorICB9OworCisgIHN0cnVjdCBCdWlsdGluRW50cnkgeworICAgIEludHJpbnNpYzo6SUQgSW50cmluSUQ7CisgICAgdW5zaWduZWQgU3RyVGFiT2Zmc2V0OworICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gJkJ1aWx0aW5OYW1lc1tTdHJUYWJPZmZzZXRdOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yPChTdHJpbmdSZWYgUkhTKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RybmNtcChnZXROYW1lKCksIFJIUy5kYXRhKCksIFJIUy5zaXplKCkpIDwgMDsKKyAgICB9CisgIH07CisgIFN0cmluZ1JlZiBUYXJnZXRQcmVmaXgoVGFyZ2V0UHJlZml4U3RyKTsKKworICBpZiAoVGFyZ2V0UHJlZml4ID09ICJhYXJjaDY0IikgeworICAgIHN0YXRpYyBjb25zdCBCdWlsdGluRW50cnkgYWFyY2g2NE5hbWVzW10gPSB7CisgICAgICB7SW50cmluc2ljOjphYXJjaDY0X2RtYiwgMH0sIC8vIF9fZG1iCisgICAgICB7SW50cmluc2ljOjphYXJjaDY0X2RzYiwgNn0sIC8vIF9fZHNiCisgICAgICB7SW50cmluc2ljOjphYXJjaDY0X2lzYiwgMTJ9LCAvLyBfX2lzYgorICAgIH07CisgICAgYXV0byBJID0gc3RkOjpsb3dlcl9ib3VuZChzdGQ6OmJlZ2luKGFhcmNoNjROYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZChhYXJjaDY0TmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbHRpbk5hbWVTdHIpOworICAgIGlmIChJICE9IHN0ZDo6ZW5kKGFhcmNoNjROYW1lcykgJiYKKyAgICAgICAgSS0+Z2V0TmFtZSgpID09IEJ1aWx0aW5OYW1lU3RyKQorICAgICAgcmV0dXJuIEktPkludHJpbklEOworICB9CisgIGlmIChUYXJnZXRQcmVmaXggPT0gImFybSIpIHsKKyAgICBzdGF0aWMgY29uc3QgQnVpbHRpbkVudHJ5IGFybU5hbWVzW10gPSB7CisgICAgICB7SW50cmluc2ljOjphcm1fbXJjLCAxOH0sIC8vIF9Nb3ZlRnJvbUNvcHJvY2Vzc29yCisgICAgICB7SW50cmluc2ljOjphcm1fbXJjMiwgMzl9LCAvLyBfTW92ZUZyb21Db3Byb2Nlc3NvcjIKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9kbWIsIDB9LCAvLyBfX2RtYgorICAgICAge0ludHJpbnNpYzo6YXJtX2RzYiwgNn0sIC8vIF9fZHNiCisgICAgICB7SW50cmluc2ljOjphcm1faXNiLCAxMn0sIC8vIF9faXNiCisgICAgfTsKKyAgICBhdXRvIEkgPSBzdGQ6Omxvd2VyX2JvdW5kKHN0ZDo6YmVnaW4oYXJtTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjplbmQoYXJtTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbHRpbk5hbWVTdHIpOworICAgIGlmIChJICE9IHN0ZDo6ZW5kKGFybU5hbWVzKSAmJgorICAgICAgICBJLT5nZXROYW1lKCkgPT0gQnVpbHRpbk5hbWVTdHIpCisgICAgICByZXR1cm4gSS0+SW50cmluSUQ7CisgIH0KKyAgcmV0dXJuIEludHJpbnNpYzo6bm90X2ludHJpbnNpYzsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChzZXRqbXBfdW5kZWZpbmVkX2Zvcl9tc3ZjKQorLy8gbGV0J3MgcmV0dXJuIGl0IHRvIF9zZXRqbXAgc3RhdGUKKyMgIHByYWdtYSBwb3BfbWFjcm8oInNldGptcCIpCisjICB1bmRlZiBzZXRqbXBfdW5kZWZpbmVkX2Zvcl9tc3ZjCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzc5ZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzLmgKQEAgLTAsMCArMSwxODggQEAKKy8vPT09LS0gbGx2bS9JbnN0cmluc2ljcy5oIC0gTExWTSBJbnRyaW5zaWMgRnVuY3Rpb24gSGFuZGxpbmcgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBzZXQgb2YgZW51bXMgd2hpY2ggYWxsb3cgcHJvY2Vzc2luZyBvZiBpbnRyaW5zaWMKKy8vIGZ1bmN0aW9ucy4gIFZhbHVlcyBvZiB0aGVzZSBlbnVtIHR5cGVzIGFyZSByZXR1cm5lZCBieQorLy8gRnVuY3Rpb246OmdldEludHJpbnNpY0lELgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9JTlRSSU5TSUNTX0gKKyNkZWZpbmUgTExWTV9JUl9JTlRSSU5TSUNTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFR5cGU7CitjbGFzcyBGdW5jdGlvblR5cGU7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgTW9kdWxlOworY2xhc3MgQXR0cmlidXRlTGlzdDsKKworLy8vIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIGFuIGVudW0gd2l0aCBhIHZhbHVlIGZvciBldmVyeSBpbnRyaW5zaWMvYnVpbHRpbgorLy8vIGZ1bmN0aW9uIGtub3duIGJ5IExMVk0uIFRoZSBlbnVtIHZhbHVlcyBhcmUgcmV0dXJuZWQgYnkKKy8vLyBGdW5jdGlvbjo6Z2V0SW50cmluc2ljSUQoKS4KK25hbWVzcGFjZSBJbnRyaW5zaWMgeworICBlbnVtIElEIDogdW5zaWduZWQgeworICAgIG5vdF9pbnRyaW5zaWMgPSAwLCAgIC8vIE11c3QgYmUgemVybworCisgICAgLy8gR2V0IHRoZSBpbnRyaW5zaWMgZW51bXMgZ2VuZXJhdGVkIGZyb20gSW50cmluc2ljcy50ZAorI2RlZmluZSBHRVRfSU5UUklOU0lDX0VOVU1fVkFMVUVTCisjaW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzLmdlbiIKKyN1bmRlZiBHRVRfSU5UUklOU0lDX0VOVU1fVkFMVUVTCisgICAgLCBudW1faW50cmluc2ljcworICB9OworCisgIC8vLyBSZXR1cm4gdGhlIExMVk0gbmFtZSBmb3IgYW4gaW50cmluc2ljLCBzdWNoIGFzICJsbHZtLnBwYy5hbHRpdmVjLmx2eCIuCisgIC8vLyBOb3RlLCB0aGlzIHZlcnNpb24gaXMgZm9yIGludHJpbnNpY3Mgd2l0aCBubyBvdmVybG9hZHMuICBVc2UgdGhlIG90aGVyCisgIC8vLyB2ZXJzaW9uIG9mIGdldE5hbWUgaWYgb3ZlcmxvYWRzIGFyZSByZXF1aXJlZC4KKyAgU3RyaW5nUmVmIGdldE5hbWUoSUQgaWQpOworCisgIC8vLyBSZXR1cm4gdGhlIExMVk0gbmFtZSBmb3IgYW4gaW50cmluc2ljLCBzdWNoIGFzICJsbHZtLnBwYy5hbHRpdmVjLmx2eCIuCisgIC8vLyBOb3RlLCB0aGlzIHZlcnNpb24gb2YgZ2V0TmFtZSBzdXBwb3J0cyBvdmVybG9hZHMsIGJ1dCBpcyBsZXNzIGVmZmljaWVudAorICAvLy8gdGhhbiB0aGUgU3RyaW5nUmVmIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbi4gIElmIG5vIG92ZXJsb2FkcyBhcmUKKyAgLy8vIHJlcXVyaWVkLCBpdCBpcyBzYWZlIHRvIHVzZSB0aGlzIHZlcnNpb24sIGJ1dCBiZXR0ZXIgdG8gdXNlIHRoZSBTdHJpbmdSZWYKKyAgLy8vIHZlcnNpb24uCisgIHN0ZDo6c3RyaW5nIGdldE5hbWUoSUQgaWQsIEFycmF5UmVmPFR5cGUqPiBUeXMpOworCisgIC8vLyBSZXR1cm4gdGhlIGZ1bmN0aW9uIHR5cGUgZm9yIGFuIGludHJpbnNpYy4KKyAgRnVuY3Rpb25UeXBlICpnZXRUeXBlKExMVk1Db250ZXh0ICZDb250ZXh0LCBJRCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFR5cGUqPiBUeXMgPSBOb25lKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBpbnRyaW5zaWMgY2FuIGJlIG92ZXJsb2FkZWQuCisgIGJvb2wgaXNPdmVybG9hZGVkKElEIGlkKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBpbnRyaW5zaWMgaXMgYSBsZWFmLCBpLmUuIGl0IGRvZXMgbm90IG1ha2UgYW55IGNhbGxzCisgIC8vLyBpdHNlbGYuICBNb3N0IGludHJpbnNpY3MgYXJlIGxlYWZzLCB0aGUgZXhjZXB0aW9ucyBiZWluZyB0aGUgcGF0Y2hwb2ludAorICAvLy8gYW5kIHN0YXRlcG9pbnQgaW50cmluc2ljcy4gVGhlc2UgY2FsbCAob3IgaW52b2tlKSB0aGVpciAidGFyZ2V0IiBhcmd1bWVudC4KKyAgYm9vbCBpc0xlYWYoSUQgaWQpOworCisgIC8vLyBSZXR1cm4gdGhlIGF0dHJpYnV0ZXMgZm9yIGFuIGludHJpbnNpYy4KKyAgQXR0cmlidXRlTGlzdCBnZXRBdHRyaWJ1dGVzKExMVk1Db250ZXh0ICZDLCBJRCBpZCk7CisKKyAgLy8vIENyZWF0ZSBvciBpbnNlcnQgYW4gTExWTSBGdW5jdGlvbiBkZWNsYXJhdGlvbiBmb3IgYW4gaW50cmluc2ljLCBhbmQgcmV0dXJuCisgIC8vLyBpdC4KKyAgLy8vCisgIC8vLyBUaGUgVHlzIHBhcmFtZXRlciBpcyBmb3IgaW50cmluc2ljcyB3aXRoIG92ZXJsb2FkZWQgdHlwZXMgKGUuZy4sIHRob3NlCisgIC8vLyB1c2luZyBpQW55LCBmQW55LCB2QW55LCBvciBpUFRSQW55KS4gIEZvciBhIGRlY2xhcmF0aW9uIG9mIGFuIG92ZXJsb2FkZWQKKyAgLy8vIGludHJpbnNpYywgVHlzIG11c3QgcHJvdmlkZSBleGFjdGx5IG9uZSB0eXBlIGZvciBlYWNoIG92ZXJsb2FkZWQgdHlwZSBpbgorICAvLy8gdGhlIGludHJpbnNpYy4KKyAgRnVuY3Rpb24gKmdldERlY2xhcmF0aW9uKE1vZHVsZSAqTSwgSUQgaWQsIEFycmF5UmVmPFR5cGUqPiBUeXMgPSBOb25lKTsKKworICAvLy8gTG9va3MgdXAgTmFtZSBpbiBOYW1lVGFibGUgdmlhIGJpbmFyeSBzZWFyY2guIE5hbWVUYWJsZSBtdXN0IGJlIHNvcnRlZAorICAvLy8gYW5kIGFsbCBlbnRyaWVzIG11c3Qgc3RhcnQgd2l0aCAibGx2bS4iLiAgSWYgTmFtZVRhYmxlIGNvbnRhaW5zIGFuIGV4YWN0CisgIC8vLyBtYXRjaCBmb3IgTmFtZSBvciBhIHByZWZpeCBvZiBOYW1lIGZvbGxvd2VkIGJ5IGEgZG90LCBpdHMgaW5kZXggaW4KKyAgLy8vIE5hbWVUYWJsZSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLCAtMSBpcyByZXR1cm5lZC4KKyAgaW50IGxvb2t1cExMVk1JbnRyaW5zaWNCeU5hbWUoQXJyYXlSZWY8Y29uc3QgY2hhciAqPiBOYW1lVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lKTsKKworICAvLy8gTWFwIGEgR0NDIGJ1aWx0aW4gbmFtZSB0byBhbiBpbnRyaW5zaWMgSUQuCisgIElEIGdldEludHJpbnNpY0ZvckdDQ0J1aWx0aW4oY29uc3QgY2hhciAqUHJlZml4LCBTdHJpbmdSZWYgQnVpbHRpbk5hbWUpOworCisgIC8vLyBNYXAgYSBNUyBidWlsdGluIG5hbWUgdG8gYW4gaW50cmluc2ljIElELgorICBJRCBnZXRJbnRyaW5zaWNGb3JNU0J1aWx0aW4oY29uc3QgY2hhciAqUHJlZml4LCBTdHJpbmdSZWYgQnVpbHRpbk5hbWUpOworCisgIC8vLyBUaGlzIGlzIGEgdHlwZSBkZXNjcmlwdG9yIHdoaWNoIGV4cGxhaW5zIHRoZSB0eXBlIHJlcXVpcmVtZW50cyBvZiBhbgorICAvLy8gaW50cmluc2ljLiBUaGlzIGlzIHJldHVybmVkIGJ5IGdldEludHJpbnNpY0luZm9UYWJsZUVudHJpZXMuCisgIHN0cnVjdCBJSVREZXNjcmlwdG9yIHsKKyAgICBlbnVtIElJVERlc2NyaXB0b3JLaW5kIHsKKyAgICAgIFZvaWQsIFZhckFyZywgTU1YLCBUb2tlbiwgTWV0YWRhdGEsIEhhbGYsIEZsb2F0LCBEb3VibGUsCisgICAgICBJbnRlZ2VyLCBWZWN0b3IsIFBvaW50ZXIsIFN0cnVjdCwKKyAgICAgIEFyZ3VtZW50LCBFeHRlbmRBcmd1bWVudCwgVHJ1bmNBcmd1bWVudCwgSGFsZlZlY0FyZ3VtZW50LAorICAgICAgU2FtZVZlY1dpZHRoQXJndW1lbnQsIFB0clRvQXJndW1lbnQsIFB0clRvRWx0LCBWZWNPZkFueVB0cnNUb0VsdAorICAgIH0gS2luZDsKKworICAgIHVuaW9uIHsKKyAgICAgIHVuc2lnbmVkIEludGVnZXJfV2lkdGg7CisgICAgICB1bnNpZ25lZCBGbG9hdF9XaWR0aDsKKyAgICAgIHVuc2lnbmVkIFZlY3Rvcl9XaWR0aDsKKyAgICAgIHVuc2lnbmVkIFBvaW50ZXJfQWRkcmVzc1NwYWNlOworICAgICAgdW5zaWduZWQgU3RydWN0X051bUVsZW1lbnRzOworICAgICAgdW5zaWduZWQgQXJndW1lbnRfSW5mbzsKKyAgICB9OworCisgICAgZW51bSBBcmdLaW5kIHsKKyAgICAgIEFLX0FueSwKKyAgICAgIEFLX0FueUludGVnZXIsCisgICAgICBBS19BbnlGbG9hdCwKKyAgICAgIEFLX0FueVZlY3RvciwKKyAgICAgIEFLX0FueVBvaW50ZXIKKyAgICB9OworCisgICAgdW5zaWduZWQgZ2V0QXJndW1lbnROdW1iZXIoKSBjb25zdCB7CisgICAgICBhc3NlcnQoS2luZCA9PSBBcmd1bWVudCB8fCBLaW5kID09IEV4dGVuZEFyZ3VtZW50IHx8CisgICAgICAgICAgICAgS2luZCA9PSBUcnVuY0FyZ3VtZW50IHx8IEtpbmQgPT0gSGFsZlZlY0FyZ3VtZW50IHx8CisgICAgICAgICAgICAgS2luZCA9PSBTYW1lVmVjV2lkdGhBcmd1bWVudCB8fCBLaW5kID09IFB0clRvQXJndW1lbnQgfHwKKyAgICAgICAgICAgICBLaW5kID09IFB0clRvRWx0KTsKKyAgICAgIHJldHVybiBBcmd1bWVudF9JbmZvID4+IDM7CisgICAgfQorICAgIEFyZ0tpbmQgZ2V0QXJndW1lbnRLaW5kKCkgY29uc3QgeworICAgICAgYXNzZXJ0KEtpbmQgPT0gQXJndW1lbnQgfHwgS2luZCA9PSBFeHRlbmRBcmd1bWVudCB8fAorICAgICAgICAgICAgIEtpbmQgPT0gVHJ1bmNBcmd1bWVudCB8fCBLaW5kID09IEhhbGZWZWNBcmd1bWVudCB8fAorICAgICAgICAgICAgIEtpbmQgPT0gU2FtZVZlY1dpZHRoQXJndW1lbnQgfHwgS2luZCA9PSBQdHJUb0FyZ3VtZW50KTsKKyAgICAgIHJldHVybiAoQXJnS2luZCkoQXJndW1lbnRfSW5mbyAmIDcpOworICAgIH0KKworICAgIC8vIFZlY09mQW55UHRyc1RvRWx0IHVzZXMgYm90aCBhbiBvdmVybG9hZGVkIGFyZ3VtZW50IChmb3IgYWRkcmVzcyBzcGFjZSkKKyAgICAvLyBhbmQgYSByZWZlcmVuY2UgYXJndW1lbnQgKGZvciBtYXRjaGluZyB2ZWN0b3Igd2lkdGggYW5kIGVsZW1lbnQgdHlwZXMpCisgICAgdW5zaWduZWQgZ2V0T3ZlcmxvYWRBcmdOdW1iZXIoKSBjb25zdCB7CisgICAgICBhc3NlcnQoS2luZCA9PSBWZWNPZkFueVB0cnNUb0VsdCk7CisgICAgICByZXR1cm4gQXJndW1lbnRfSW5mbyA+PiAxNjsKKyAgICB9CisgICAgdW5zaWduZWQgZ2V0UmVmQXJnTnVtYmVyKCkgY29uc3QgeworICAgICAgYXNzZXJ0KEtpbmQgPT0gVmVjT2ZBbnlQdHJzVG9FbHQpOworICAgICAgcmV0dXJuIEFyZ3VtZW50X0luZm8gJiAweEZGRkY7CisgICAgfQorCisgICAgc3RhdGljIElJVERlc2NyaXB0b3IgZ2V0KElJVERlc2NyaXB0b3JLaW5kIEssIHVuc2lnbmVkIEZpZWxkKSB7CisgICAgICBJSVREZXNjcmlwdG9yIFJlc3VsdCA9IHsgSywgeyBGaWVsZCB9IH07CisgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBJSVREZXNjcmlwdG9yIGdldChJSVREZXNjcmlwdG9yS2luZCBLLCB1bnNpZ25lZCBzaG9ydCBIaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgTG8pIHsKKyAgICAgIHVuc2lnbmVkIEZpZWxkID0gSGkgPDwgMTYgfCBMbzsKKyAgICAgIElJVERlc2NyaXB0b3IgUmVzdWx0ID0ge0ssIHtGaWVsZH19OworICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgIH07CisKKyAgLy8vIFJldHVybiB0aGUgSUlUIHRhYmxlIGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgaW50cmluc2ljIGludG8gYW4gYXJyYXkKKyAgLy8vIG9mIElJVERlc2NyaXB0b3JzLgorICB2b2lkIGdldEludHJpbnNpY0luZm9UYWJsZUVudHJpZXMoSUQgaWQsIFNtYWxsVmVjdG9ySW1wbDxJSVREZXNjcmlwdG9yPiAmVCk7CisKKyAgLy8vIE1hdGNoIHRoZSBzcGVjaWZpZWQgdHlwZSAod2hpY2ggY29tZXMgZnJvbSBhbiBpbnRyaW5zaWMgYXJndW1lbnQgb3IgcmV0dXJuCisgIC8vLyB2YWx1ZSkgd2l0aCB0aGUgdHlwZSBjb25zdHJhaW50cyBzcGVjaWZpZWQgYnkgdGhlIC50ZCBmaWxlLiBJZiB0aGUgZ2l2ZW4KKyAgLy8vIHR5cGUgaXMgYW4gb3ZlcmxvYWRlZCB0eXBlIGl0IGlzIHB1c2hlZCB0byB0aGUgQXJnVHlzIHZlY3Rvci4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSBnaXZlbiB0eXBlIG1hdGNoZXMgd2l0aCB0aGUgY29uc3RyYWludHMsIHRydWUKKyAgLy8vIG90aGVyd2lzZS4KKyAgYm9vbCBtYXRjaEludHJpbnNpY1R5cGUoVHlwZSAqVHksIEFycmF5UmVmPElJVERlc2NyaXB0b3I+ICZJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFR5cGUqPiAmQXJnVHlzKTsKKworICAvLy8gVmVyaWZ5IGlmIHRoZSBpbnRyaW5zaWMgaGFzIHZhcmlhYmxlIGFyZ3VtZW50cy4gVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8KKyAgLy8vIGJlIGNhbGxlZCBhZnRlciBhbGwgdGhlIGZpeGVkIGFyZ3VtZW50cyBoYXZlIGJlZW4gbWF0Y2hlZCBmaXJzdC4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgb24gZXJyb3IuCisgIGJvb2wgbWF0Y2hJbnRyaW5zaWNWYXJBcmcoYm9vbCBpc1ZhckFyZywgQXJyYXlSZWY8SUlURGVzY3JpcHRvcj4gJkluZm9zKTsKKworICAvLyBDaGVja3MgaWYgdGhlIGludHJpbnNpYyBuYW1lIG1hdGNoZXMgd2l0aCBpdHMgc2lnbmF0dXJlIGFuZCBpZiBub3QKKyAgLy8gcmV0dXJucyB0aGUgZGVjbGFyYXRpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYW5kIHJlbWFuZ2xlZCBuYW1lLgorICBsbHZtOjpPcHRpb25hbDxGdW5jdGlvbio+IHJlbWFuZ2xlSW50cmluc2ljRnVuY3Rpb24oRnVuY3Rpb24gKkYpOworCit9IC8vIEVuZCBJbnRyaW5zaWMgbmFtZXNwYWNlCisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzLnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYjFjNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3MudGQKQEAgLTAsMCArMSw5ODUgQEAKKy8vPT09LSBJbnRyaW5zaWNzLnRkIC0gRGVmaW5lcyBhbGwgTExWTSBpbnRyaW5zaWNzIC0tLS0tLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgcHJvcGVydGllcyBvZiBhbGwgTExWTSBpbnRyaW5zaWNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2luY2x1ZGUgImxsdm0vQ29kZUdlbi9WYWx1ZVR5cGVzLnRkIgoraW5jbHVkZSAibGx2bS9Db2RlR2VuL1NETm9kZVByb3BlcnRpZXMudGQiCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgUHJvcGVydGllcyB3ZSBrZWVwIHRyYWNrIG9mIGZvciBpbnRyaW5zaWNzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgSW50cmluc2ljUHJvcGVydHk7CisKKy8vIEludHIqTWVtIC0gTWVtb3J5IHByb3BlcnRpZXMuICBJZiBubyBwcm9wZXJ0eSBpcyBzZXQsIHRoZSB3b3JzdCBjYXNlCisvLyBpcyBhc3N1bWVkIChpdCBtYXkgcmVhZCBhbmQgd3JpdGUgYW55IG1lbW9yeSBpdCBjYW4gZ2V0IGFjY2VzcyB0byBhbmQgaXQgbWF5CisvLyBoYXZlIG90aGVyIHNpZGUgZWZmZWN0cykuCisKKy8vIEludHJOb01lbSAtIFRoZSBpbnRyaW5zaWMgZG9lcyBub3QgYWNjZXNzIG1lbW9yeSBvciBoYXZlIGFueSBvdGhlciBzaWRlCisvLyBlZmZlY3RzLiAgSXQgbWF5IGJlIENTRSdkIGRlbGV0ZWQgaWYgZGVhZCwgZXRjLgorZGVmIEludHJOb01lbSA6IEludHJpbnNpY1Byb3BlcnR5OworCisvLyBJbnRyUmVhZE1lbSAtIFRoaXMgaW50cmluc2ljIG9ubHkgcmVhZHMgZnJvbSBtZW1vcnkuIEl0IGRvZXMgbm90IHdyaXRlIHRvCisvLyBtZW1vcnkgYW5kIGhhcyBubyBvdGhlciBzaWRlIGVmZmVjdHMuIFRoZXJlZm9yZSwgaXQgY2Fubm90IGJlIG1vdmVkIGFjcm9zcworLy8gcG90ZW50aWFsbHkgYWxpYXNpbmcgc3RvcmVzLiBIb3dldmVyLCBpdCBjYW4gYmUgcmVvcmRlcmVkIG90aGVyd2lzZSBhbmQgY2FuCisvLyBiZSBkZWxldGVkIGlmIGRlYWQuCitkZWYgSW50clJlYWRNZW0gOiBJbnRyaW5zaWNQcm9wZXJ0eTsKKworLy8gSW50cldyaXRlTWVtIC0gVGhpcyBpbnRyaW5zaWMgb25seSB3cml0ZXMgdG8gbWVtb3J5LCBidXQgZG9lcyBub3QgcmVhZCBmcm9tCisvLyBtZW1vcnksIGFuZCBoYXMgbm8gb3RoZXIgc2lkZSBlZmZlY3RzLiBUaGlzIG1lYW5zIGRlYWQgc3RvcmVzIGJlZm9yZSBjYWxscworLy8gdG8gdGhpcyBpbnRyaW5zaWNzIG1heSBiZSByZW1vdmVkLgorZGVmIEludHJXcml0ZU1lbSA6IEludHJpbnNpY1Byb3BlcnR5OworCisvLyBJbnRyQXJnTWVtT25seSAtIFRoaXMgaW50cmluc2ljIG9ubHkgYWNjZXNzZXMgbWVtb3J5IHRoYXQgaXRzIHBvaW50ZXItdHlwZWQKKy8vIGFyZ3VtZW50KHMpIHBvaW50cyB0bywgYnV0IG1heSBhY2Nlc3MgYW4gdW5zcGVjaWZpZWQgYW1vdW50LiBPdGhlciB0aGFuCisvLyByZWFkcyBmcm9tIGFuZCAocG9zc2libHkgdm9sYXRpbGUpIHdyaXRlcyB0byBtZW1vcnksIGl0IGhhcyBubyBzaWRlIGVmZmVjdHMuCitkZWYgSW50ckFyZ01lbU9ubHkgOiBJbnRyaW5zaWNQcm9wZXJ0eTsKKworLy8gSW50ckluYWNjZXNzaWJsZU1lbU9ubHkgLS0gVGhpcyBpbnRyaW5zaWMgb25seSBhY2Nlc3NlcyBtZW1vcnkgdGhhdCBpcyBub3QKKy8vIGFjY2Vzc2libGUgYnkgdGhlIG1vZHVsZSBiZWluZyBjb21waWxlZC4gVGhpcyBpcyBhIHdlYWtlciBmb3JtIG9mIEludHJOb01lbS4KK2RlZiBJbnRySW5hY2Nlc3NpYmxlTWVtT25seSA6IEludHJpbnNpY1Byb3BlcnR5OworCisvLyBJbnRySW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW1Pbmx5IC0tIFRoaXMgaW50cmluc2ljIG9ubHkgYWNjZXNzZXMgbWVtb3J5IHRoYXQKKy8vIGl0cyBwb2ludGVyLXR5cGVkIGFyZ3VtZW50cyBwb2ludCB0byBvciBtZW1vcnkgdGhhdCBpcyBub3QgYWNjZXNzaWJsZQorLy8gYnkgdGhlIG1vZHVsZSBiZWluZyBjb21waWxlZC4gVGhpcyBpcyBhIHdlYWtlciBmb3JtIG9mIEludHJBcmdNZW1Pbmx5LgorZGVmIEludHJJbmFjY2Vzc2libGVNZW1PckFyZ01lbU9ubHkgOiBJbnRyaW5zaWNQcm9wZXJ0eTsKKworLy8gQ29tbXV0YXRpdmUgLSBUaGlzIGludHJpbnNpYyBpcyBjb21tdXRhdGl2ZTogWCBvcCBZID09IFkgb3AgWC4KK2RlZiBDb21tdXRhdGl2ZSA6IEludHJpbnNpY1Byb3BlcnR5OworCisvLyBUaHJvd3MgLSBUaGlzIGludHJpbnNpYyBjYW4gdGhyb3cuCitkZWYgVGhyb3dzIDogSW50cmluc2ljUHJvcGVydHk7CisKKy8vIE5vQ2FwdHVyZSAtIFRoZSBzcGVjaWZpZWQgYXJndW1lbnQgcG9pbnRlciBpcyBub3QgY2FwdHVyZWQgYnkgdGhlIGludHJpbnNpYy4KK2NsYXNzIE5vQ2FwdHVyZTxpbnQgYXJnTm8+IDogSW50cmluc2ljUHJvcGVydHkgeworICBpbnQgQXJnTm8gPSBhcmdObzsKK30KKworLy8gUmV0dXJuZWQgLSBUaGUgc3BlY2lmaWVkIGFyZ3VtZW50IGlzIGFsd2F5cyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZQorLy8gaW50cmluc2ljLgorY2xhc3MgUmV0dXJuZWQ8aW50IGFyZ05vPiA6IEludHJpbnNpY1Byb3BlcnR5IHsKKyAgaW50IEFyZ05vID0gYXJnTm87Cit9CisKKy8vIFJlYWRPbmx5IC0gVGhlIHNwZWNpZmllZCBhcmd1bWVudCBwb2ludGVyIGlzIG5vdCB3cml0dGVuIHRvIHRocm91Z2ggdGhlCisvLyBwb2ludGVyIGJ5IHRoZSBpbnRyaW5zaWMuCitjbGFzcyBSZWFkT25seTxpbnQgYXJnTm8+IDogSW50cmluc2ljUHJvcGVydHkgeworICBpbnQgQXJnTm8gPSBhcmdObzsKK30KKworLy8gV3JpdGVPbmx5IC0gVGhlIGludHJpbnNpYyBkb2VzIG5vdCByZWFkIG1lbW9yeSB0aHJvdWdoIHRoZSBzcGVjaWZpZWQKKy8vIGFyZ3VtZW50IHBvaW50ZXIuCitjbGFzcyBXcml0ZU9ubHk8aW50IGFyZ05vPiA6IEludHJpbnNpY1Byb3BlcnR5IHsKKyAgaW50IEFyZ05vID0gYXJnTm87Cit9CisKKy8vIFJlYWROb25lIC0gVGhlIHNwZWNpZmllZCBhcmd1bWVudCBwb2ludGVyIGlzIG5vdCBkZXJlZmVyZW5jZWQgYnkgdGhlCisvLyBpbnRyaW5zaWMuCitjbGFzcyBSZWFkTm9uZTxpbnQgYXJnTm8+IDogSW50cmluc2ljUHJvcGVydHkgeworICBpbnQgQXJnTm8gPSBhcmdObzsKK30KKworZGVmIEludHJOb1JldHVybiA6IEludHJpbnNpY1Byb3BlcnR5OworCisvLyBJbnRyTm9kdXBsaWNhdGUgLSBDYWxscyB0byB0aGlzIGludHJpbnNpYyBjYW5ub3QgYmUgZHVwbGljYXRlZC4KKy8vIFBhcmFsbGVscyB0aGUgbm9kdXBsaWNhdGUgYXR0cmlidXRlIG9uIExMVk0gSVIgZnVuY3Rpb25zLgorZGVmIEludHJOb0R1cGxpY2F0ZSA6IEludHJpbnNpY1Byb3BlcnR5OworCisvLyBJbnRyQ29udmVyZ2VudCAtIENhbGxzIHRvIHRoaXMgaW50cmluc2ljIGFyZSBjb252ZXJnZW50IGFuZCBtYXkgbm90IGJlIG1hZGUKKy8vIGNvbnRyb2wtZGVwZW5kZW50IG9uIGFueSBhZGRpdGlvbmFsIHZhbHVlcy4KKy8vIFBhcmFsbGVscyB0aGUgY29udmVyZ2VudCBhdHRyaWJ1dGUgb24gTExWTSBJUiBmdW5jdGlvbnMuCitkZWYgSW50ckNvbnZlcmdlbnQgOiBJbnRyaW5zaWNQcm9wZXJ0eTsKKworLy8gVGhpcyBwcm9wZXJ0eSBpbmRpY2F0ZXMgdGhhdCB0aGUgaW50cmluc2ljIGlzIHNhZmUgdG8gc3BlY3VsYXRlLgorZGVmIEludHJTcGVjdWxhdGFibGUgOiBJbnRyaW5zaWNQcm9wZXJ0eTsKKworLy8gVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgJ2hhcyBubyBvdGhlciBzaWRlIGVmZmVjdHMnCisvLyBsYW5ndWFnZSBvZiB0aGUgSW50ck5vTWVtLCBJbnRyUmVhZE1lbSwgSW50cldyaXRlTWVtLCBhbmQgSW50ckFyZ01lbU9ubHkKKy8vIGludHJpbnNpYyBwcm9wZXJ0aWVzLiAgQnkgZGVmYXVsdCwgaW50cmluc2ljcyBhcmUgYXNzdW1lZCB0byBoYXZlIHNpZGUKKy8vIGVmZmVjdHMsIHNvIHRoaXMgcHJvcGVydHkgaXMgb25seSBuZWNlc3NhcnkgaWYgeW91IGhhdmUgZGVmaW5lZCBvbmUgb2YKKy8vIHRoZSBtZW1vcnkgcHJvcGVydGllcyBsaXN0ZWQgYWJvdmUuCisvLyBGb3IgdGhpcyBwcm9wZXJ0eSwgJ3NpZGUgZWZmZWN0cycgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgJ3NpZGUgZWZmZWN0cycKKy8vIGRlZmluZWQgYnkgdGhlIGhhc1NpZGVFZmZlY3RzIHByb3BlcnR5IG9mIHRoZSBUYWJsZUdlbiBJbnN0cnVjdGlvbiBjbGFzcy4KK2RlZiBJbnRySGFzU2lkZUVmZmVjdHMgOiBJbnRyaW5zaWNQcm9wZXJ0eTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFR5cGVzIHVzZWQgYnkgaW50cmluc2ljcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIExMVk1UeXBlPFZhbHVlVHlwZSB2dD4geworICBWYWx1ZVR5cGUgVlQgPSB2dDsKK30KKworY2xhc3MgTExWTVF1YWxQb2ludGVyVHlwZTxMTFZNVHlwZSBlbHR5LCBpbnQgYWRkcnNwYWNlPgorICA6IExMVk1UeXBlPGlQVFI+eworICBMTFZNVHlwZSBFbFR5ID0gZWx0eTsKKyAgaW50IEFkZHJTcGFjZSA9IGFkZHJzcGFjZTsKK30KKworY2xhc3MgTExWTVBvaW50ZXJUeXBlPExMVk1UeXBlIGVsdHk+CisgIDogTExWTVF1YWxQb2ludGVyVHlwZTxlbHR5LCAwPjsKKworY2xhc3MgTExWTUFueVBvaW50ZXJUeXBlPExMVk1UeXBlIGVsdHk+CisgIDogTExWTVR5cGU8aVBUUkFueT57CisgIExMVk1UeXBlIEVsVHkgPSBlbHR5OworfQorCisvLyBNYXRjaCB0aGUgdHlwZSBvZiBhbm90aGVyIGludHJpbnNpYyBwYXJhbWV0ZXIuICBOdW1iZXIgaXMgYW4gaW5kZXggaW50byB0aGUKKy8vIGxpc3Qgb2Ygb3ZlcmxvYWRlZCB0eXBlcyBmb3IgdGhlIGludHJpbnNpYywgZXhjbHVkaW5nIGFsbCB0aGUgZml4ZWQgdHlwZXMuCisvLyBUaGUgTnVtYmVyIHZhbHVlIG11c3QgcmVmZXIgdG8gYSBwcmV2aW91c2x5IGxpc3RlZCB0eXBlLiAgRm9yIGV4YW1wbGU6CisvLyAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1fYW55ZmxvYXRfdHksIExMVk1NYXRjaFR5cGU8MD5dPgorLy8gaGFzIHR3byBvdmVybG9hZGVkIHR5cGVzLCB0aGUgMm5kIGFuZCAzcmQgYXJndW1lbnRzLiAgTExWTU1hdGNoVHlwZTwwPgorLy8gcmVmZXJzIHRvIHRoZSBmaXJzdCBvdmVybG9hZGVkIHR5cGUsIHdoaWNoIGlzIHRoZSAybmQgYXJndW1lbnQuCitjbGFzcyBMTFZNTWF0Y2hUeXBlPGludCBudW0+CisgIDogTExWTVR5cGU8T3RoZXJWVD57CisgIGludCBOdW1iZXIgPSBudW07Cit9CisKKy8vIE1hdGNoIHRoZSB0eXBlIG9mIGFub3RoZXIgaW50cmluc2ljIHBhcmFtZXRlciB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlIGJhc2VkIG9uCisvLyBhbiBpbnRlZ3JhbCB0eXBlIChpLmUuIGVpdGhlciBpTiBvciA8TiB4IGlNPiksIGJ1dCBjaGFuZ2UgdGhlIHNjYWxhciBzaXplIHRvCisvLyBiZSB0d2ljZSBhcyB3aWRlIG9yIGhhbGYgYXMgd2lkZSBhcyB0aGUgb3RoZXIgdHlwZS4gIFRoaXMgaXMgb25seSB1c2VmdWwgd2hlbgorLy8gdGhlIGludHJpbnNpYyBpcyBvdmVybG9hZGVkLCBzbyB0aGUgbWF0Y2hlZCB0eXBlIHNob3VsZCBiZSBkZWNsYXJlZCBhcyBpQW55LgorY2xhc3MgTExWTUV4dGVuZGVkVHlwZTxpbnQgbnVtPiA6IExMVk1NYXRjaFR5cGU8bnVtPjsKK2NsYXNzIExMVk1UcnVuY2F0ZWRUeXBlPGludCBudW0+IDogTExWTU1hdGNoVHlwZTxudW0+OworY2xhc3MgTExWTVZlY3RvclNhbWVXaWR0aDxpbnQgbnVtLCBMTFZNVHlwZSBlbHR5PgorICA6IExMVk1NYXRjaFR5cGU8bnVtPiB7CisgIFZhbHVlVHlwZSBFbFR5ID0gZWx0eS5WVDsKK30KK2NsYXNzIExMVk1Qb2ludGVyVG88aW50IG51bT4gOiBMTFZNTWF0Y2hUeXBlPG51bT47CitjbGFzcyBMTFZNUG9pbnRlclRvRWx0PGludCBudW0+IDogTExWTU1hdGNoVHlwZTxudW0+OworY2xhc3MgTExWTVZlY3Rvck9mQW55UG9pbnRlcnNUb0VsdDxpbnQgbnVtPiA6IExMVk1NYXRjaFR5cGU8bnVtPjsKKworLy8gTWF0Y2ggdGhlIHR5cGUgb2YgYW5vdGhlciBpbnRyaW5zaWMgcGFyYW1ldGVyIHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgYQorLy8gdmVjdG9yIHR5cGUsIGJ1dCBjaGFuZ2UgdGhlIGVsZW1lbnQgY291bnQgdG8gYmUgaGFsZiBhcyBtYW55CitjbGFzcyBMTFZNSGFsZkVsZW1lbnRzVmVjdG9yVHlwZTxpbnQgbnVtPiA6IExMVk1NYXRjaFR5cGU8bnVtPjsKKworZGVmIGxsdm1fdm9pZF90eSAgICAgICA6IExMVk1UeXBlPGlzVm9pZD47CitkZWYgbGx2bV9hbnlfdHkgICAgICAgIDogTExWTVR5cGU8QW55PjsKK2RlZiBsbHZtX2FueWludF90eSAgICAgOiBMTFZNVHlwZTxpQW55PjsKK2RlZiBsbHZtX2FueWZsb2F0X3R5ICAgOiBMTFZNVHlwZTxmQW55PjsKK2RlZiBsbHZtX2FueXZlY3Rvcl90eSAgOiBMTFZNVHlwZTx2QW55PjsKK2RlZiBsbHZtX2kxX3R5ICAgICAgICAgOiBMTFZNVHlwZTxpMT47CitkZWYgbGx2bV9pOF90eSAgICAgICAgIDogTExWTVR5cGU8aTg+OworZGVmIGxsdm1faTE2X3R5ICAgICAgICA6IExMVk1UeXBlPGkxNj47CitkZWYgbGx2bV9pMzJfdHkgICAgICAgIDogTExWTVR5cGU8aTMyPjsKK2RlZiBsbHZtX2k2NF90eSAgICAgICAgOiBMTFZNVHlwZTxpNjQ+OworZGVmIGxsdm1faGFsZl90eSAgICAgICA6IExMVk1UeXBlPGYxNj47CitkZWYgbGx2bV9mbG9hdF90eSAgICAgIDogTExWTVR5cGU8ZjMyPjsKK2RlZiBsbHZtX2RvdWJsZV90eSAgICAgOiBMTFZNVHlwZTxmNjQ+OworZGVmIGxsdm1fZjgwX3R5ICAgICAgICA6IExMVk1UeXBlPGY4MD47CitkZWYgbGx2bV9mMTI4X3R5ICAgICAgIDogTExWTVR5cGU8ZjEyOD47CitkZWYgbGx2bV9wcGNmMTI4X3R5ICAgIDogTExWTVR5cGU8cHBjZjEyOD47CitkZWYgbGx2bV9wdHJfdHkgICAgICAgIDogTExWTVBvaW50ZXJUeXBlPGxsdm1faThfdHk+OyAgICAgICAgICAgICAvLyBpOCoKK2RlZiBsbHZtX3B0cnB0cl90eSAgICAgOiBMTFZNUG9pbnRlclR5cGU8bGx2bV9wdHJfdHk+OyAgICAgICAgICAgIC8vIGk4KioKK2RlZiBsbHZtX2FueXB0cl90eSAgICAgOiBMTFZNQW55UG9pbnRlclR5cGU8bGx2bV9pOF90eT47ICAgICAgICAgIC8vIChzcGFjZSlpOCoKK2RlZiBsbHZtX2VtcHR5X3R5ICAgICAgOiBMTFZNVHlwZTxPdGhlclZUPjsgICAgICAgICAgICAgICAgICAgICAgIC8vIHsgfQorZGVmIGxsdm1fZGVzY3JpcHRvcl90eSA6IExMVk1Qb2ludGVyVHlwZTxsbHZtX2VtcHR5X3R5PjsgICAgICAgICAgLy8geyB9KgorZGVmIGxsdm1fbWV0YWRhdGFfdHkgICA6IExMVk1UeXBlPE1ldGFkYXRhVlQ+OyAgICAgICAgICAgICAgICAgICAgLy8gIXsuLi59CitkZWYgbGx2bV90b2tlbl90eSAgICAgIDogTExWTVR5cGU8dG9rZW4+OyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbgorCitkZWYgbGx2bV94ODZtbXhfdHkgICAgIDogTExWTVR5cGU8eDg2bW14PjsKK2RlZiBsbHZtX3B0cng4Nm1teF90eSAgOiBMTFZNUG9pbnRlclR5cGU8bGx2bV94ODZtbXhfdHk+OyAgICAgICAgIC8vIDwxIHggaTY0PioKKworZGVmIGxsdm1fdjJpMV90eSAgICAgICA6IExMVk1UeXBlPHYyaTE+OyAgICAgLy8gICAyIHggaTEKK2RlZiBsbHZtX3Y0aTFfdHkgICAgICAgOiBMTFZNVHlwZTx2NGkxPjsgICAgIC8vICAgNCB4IGkxCitkZWYgbGx2bV92OGkxX3R5ICAgICAgIDogTExWTVR5cGU8djhpMT47ICAgICAvLyAgIDggeCBpMQorZGVmIGxsdm1fdjE2aTFfdHkgICAgICA6IExMVk1UeXBlPHYxNmkxPjsgICAgLy8gIDE2IHggaTEKK2RlZiBsbHZtX3YzMmkxX3R5ICAgICAgOiBMTFZNVHlwZTx2MzJpMT47ICAgIC8vICAzMiB4IGkxCitkZWYgbGx2bV92NjRpMV90eSAgICAgIDogTExWTVR5cGU8djY0aTE+OyAgICAvLyAgNjQgeCBpMQorZGVmIGxsdm1fdjUxMmkxX3R5ICAgICA6IExMVk1UeXBlPHY1MTJpMT47ICAgLy8gNTEyIHggaTEKK2RlZiBsbHZtX3YxMDI0aTFfdHkgICAgOiBMTFZNVHlwZTx2MTAyNGkxPjsgIC8vMTAyNCB4IGkxCisKK2RlZiBsbHZtX3YxaThfdHkgICAgICAgOiBMTFZNVHlwZTx2MWk4PjsgICAgIC8vICAxIHggaTgKK2RlZiBsbHZtX3YyaThfdHkgICAgICAgOiBMTFZNVHlwZTx2Mmk4PjsgICAgIC8vICAyIHggaTgKK2RlZiBsbHZtX3Y0aThfdHkgICAgICAgOiBMTFZNVHlwZTx2NGk4PjsgICAgIC8vICA0IHggaTgKK2RlZiBsbHZtX3Y4aThfdHkgICAgICAgOiBMTFZNVHlwZTx2OGk4PjsgICAgIC8vICA4IHggaTgKK2RlZiBsbHZtX3YxNmk4X3R5ICAgICAgOiBMTFZNVHlwZTx2MTZpOD47ICAgIC8vIDE2IHggaTgKK2RlZiBsbHZtX3YzMmk4X3R5ICAgICAgOiBMTFZNVHlwZTx2MzJpOD47ICAgIC8vIDMyIHggaTgKK2RlZiBsbHZtX3Y2NGk4X3R5ICAgICAgOiBMTFZNVHlwZTx2NjRpOD47ICAgIC8vIDY0IHggaTgKK2RlZiBsbHZtX3YxMjhpOF90eSAgICAgOiBMTFZNVHlwZTx2MTI4aTg+OyAgIC8vMTI4IHggaTgKK2RlZiBsbHZtX3YyNTZpOF90eSAgICAgOiBMTFZNVHlwZTx2MjU2aTg+OyAgIC8vMjU2IHggaTgKKworZGVmIGxsdm1fdjFpMTZfdHkgICAgICA6IExMVk1UeXBlPHYxaTE2PjsgICAgLy8gIDEgeCBpMTYKK2RlZiBsbHZtX3YyaTE2X3R5ICAgICAgOiBMTFZNVHlwZTx2MmkxNj47ICAgIC8vICAyIHggaTE2CitkZWYgbGx2bV92NGkxNl90eSAgICAgIDogTExWTVR5cGU8djRpMTY+OyAgICAvLyAgNCB4IGkxNgorZGVmIGxsdm1fdjhpMTZfdHkgICAgICA6IExMVk1UeXBlPHY4aTE2PjsgICAgLy8gIDggeCBpMTYKK2RlZiBsbHZtX3YxNmkxNl90eSAgICAgOiBMTFZNVHlwZTx2MTZpMTY+OyAgIC8vIDE2IHggaTE2CitkZWYgbGx2bV92MzJpMTZfdHkgICAgIDogTExWTVR5cGU8djMyaTE2PjsgICAvLyAzMiB4IGkxNgorZGVmIGxsdm1fdjY0aTE2X3R5ICAgICA6IExMVk1UeXBlPHY2NGkxNj47ICAgLy8gNjQgeCBpMTYKK2RlZiBsbHZtX3YxMjhpMTZfdHkgICAgOiBMTFZNVHlwZTx2MTI4aTE2PjsgIC8vMTI4IHggaTE2CisKK2RlZiBsbHZtX3YxaTMyX3R5ICAgICAgOiBMTFZNVHlwZTx2MWkzMj47ICAgIC8vICAxIHggaTMyCitkZWYgbGx2bV92MmkzMl90eSAgICAgIDogTExWTVR5cGU8djJpMzI+OyAgICAvLyAgMiB4IGkzMgorZGVmIGxsdm1fdjRpMzJfdHkgICAgICA6IExMVk1UeXBlPHY0aTMyPjsgICAgLy8gIDQgeCBpMzIKK2RlZiBsbHZtX3Y4aTMyX3R5ICAgICAgOiBMTFZNVHlwZTx2OGkzMj47ICAgIC8vICA4IHggaTMyCitkZWYgbGx2bV92MTZpMzJfdHkgICAgIDogTExWTVR5cGU8djE2aTMyPjsgICAvLyAxNiB4IGkzMgorZGVmIGxsdm1fdjMyaTMyX3R5ICAgICA6IExMVk1UeXBlPHYzMmkzMj47ICAgLy8gMzIgeCBpMzIKK2RlZiBsbHZtX3Y2NGkzMl90eSAgICAgOiBMTFZNVHlwZTx2NjRpMzI+OyAgIC8vIDY0IHggaTMyCisKK2RlZiBsbHZtX3YxaTY0X3R5ICAgICAgOiBMTFZNVHlwZTx2MWk2ND47ICAgIC8vICAxIHggaTY0CitkZWYgbGx2bV92Mmk2NF90eSAgICAgIDogTExWTVR5cGU8djJpNjQ+OyAgICAvLyAgMiB4IGk2NAorZGVmIGxsdm1fdjRpNjRfdHkgICAgICA6IExMVk1UeXBlPHY0aTY0PjsgICAgLy8gIDQgeCBpNjQKK2RlZiBsbHZtX3Y4aTY0X3R5ICAgICAgOiBMTFZNVHlwZTx2OGk2ND47ICAgIC8vICA4IHggaTY0CitkZWYgbGx2bV92MTZpNjRfdHkgICAgIDogTExWTVR5cGU8djE2aTY0PjsgICAvLyAxNiB4IGk2NAorZGVmIGxsdm1fdjMyaTY0X3R5ICAgICA6IExMVk1UeXBlPHYzMmk2ND47ICAgLy8gMzIgeCBpNjQKKworZGVmIGxsdm1fdjFpMTI4X3R5ICAgICA6IExMVk1UeXBlPHYxaTEyOD47ICAgLy8gIDEgeCBpMTI4CisKK2RlZiBsbHZtX3YyZjE2X3R5ICAgICAgOiBMTFZNVHlwZTx2MmYxNj47ICAgIC8vICAyIHggaGFsZiAoX19mcDE2KQorZGVmIGxsdm1fdjRmMTZfdHkgICAgICA6IExMVk1UeXBlPHY0ZjE2PjsgICAgLy8gIDQgeCBoYWxmIChfX2ZwMTYpCitkZWYgbGx2bV92OGYxNl90eSAgICAgIDogTExWTVR5cGU8djhmMTY+OyAgICAvLyAgOCB4IGhhbGYgKF9fZnAxNikKK2RlZiBsbHZtX3YxZjMyX3R5ICAgICAgOiBMTFZNVHlwZTx2MWYzMj47ICAgIC8vICAxIHggZmxvYXQKK2RlZiBsbHZtX3YyZjMyX3R5ICAgICAgOiBMTFZNVHlwZTx2MmYzMj47ICAgIC8vICAyIHggZmxvYXQKK2RlZiBsbHZtX3Y0ZjMyX3R5ICAgICAgOiBMTFZNVHlwZTx2NGYzMj47ICAgIC8vICA0IHggZmxvYXQKK2RlZiBsbHZtX3Y4ZjMyX3R5ICAgICAgOiBMTFZNVHlwZTx2OGYzMj47ICAgIC8vICA4IHggZmxvYXQKK2RlZiBsbHZtX3YxNmYzMl90eSAgICAgOiBMTFZNVHlwZTx2MTZmMzI+OyAgIC8vIDE2IHggZmxvYXQKK2RlZiBsbHZtX3YxZjY0X3R5ICAgICAgOiBMTFZNVHlwZTx2MWY2ND47ICAgIC8vICAxIHggZG91YmxlCitkZWYgbGx2bV92MmY2NF90eSAgICAgIDogTExWTVR5cGU8djJmNjQ+OyAgICAvLyAgMiB4IGRvdWJsZQorZGVmIGxsdm1fdjRmNjRfdHkgICAgICA6IExMVk1UeXBlPHY0ZjY0PjsgICAgLy8gIDQgeCBkb3VibGUKK2RlZiBsbHZtX3Y4ZjY0X3R5ICAgICAgOiBMTFZNVHlwZTx2OGY2ND47ICAgIC8vICA4IHggZG91YmxlCisKK2RlZiBsbHZtX3ZhcmFyZ190eSAgICAgOiBMTFZNVHlwZTxpc1ZvaWQ+OyAgIC8vIHRoaXMgbWVhbnMgdmFyYXJnIGhlcmUKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW50cmluc2ljIERlZmluaXRpb25zLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gSW50cmluc2ljIGNsYXNzIC0gVGhpcyBpcyB1c2VkIHRvIGRlZmluZSBvbmUgTExWTSBpbnRyaW5zaWMuICBUaGUgbmFtZSBvZiB0aGUKKy8vIGludHJpbnNpYyBkZWZpbml0aW9uIHNob3VsZCBzdGFydCB3aXRoICJpbnRfIiwgdGhlbiBtYXRjaCB0aGUgTExWTSBpbnRyaW5zaWMKKy8vIG5hbWUgd2l0aCB0aGUgImxsdm0uIiBwcmVmaXggcmVtb3ZlZCwgYW5kIGFsbCAiLiJzIHR1cm5lZCBpbnRvICJfInMuICBGb3IKKy8vIGV4YW1wbGUsIGxsdm0uYnN3YXAuaTE2IC0+IGludF9ic3dhcF9pMTYuCisvLworLy8gICogUmV0VHlwZXMgaXMgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJldHVybiB0eXBlcyBleHBlY3RlZCBmb3IgdGhlCisvLyAgICBpbnRyaW5zaWMuCisvLyAgKiBQYXJhbVR5cGVzIGlzIGEgbGlzdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXIgdHlwZXMgZXhwZWN0ZWQgZm9yIHRoZQorLy8gICAgaW50cmluc2ljLgorLy8gICogUHJvcGVydGllcyBjYW4gYmUgc2V0IHRvIGRlc2NyaWJlIHRoZSBiZWhhdmlvciBvZiB0aGUgaW50cmluc2ljLgorLy8KK2NsYXNzIEludHJpbnNpYzxsaXN0PExMVk1UeXBlPiByZXRfdHlwZXMsCisgICAgICAgICAgICAgICAgbGlzdDxMTFZNVHlwZT4gcGFyYW1fdHlwZXMgPSBbXSwKKyAgICAgICAgICAgICAgICBsaXN0PEludHJpbnNpY1Byb3BlcnR5PiBpbnRyX3Byb3BlcnRpZXMgPSBbXSwKKyAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSA9ICIiLAorICAgICAgICAgICAgICAgIGxpc3Q8U0ROb2RlUHJvcGVydHk+IHNkX3Byb3BlcnRpZXMgPSBbXT4gOiBTRFBhdHRlcm5PcGVyYXRvciB7CisgIHN0cmluZyBMTFZNTmFtZSA9IG5hbWU7CisgIHN0cmluZyBUYXJnZXRQcmVmaXggPSAiIjsgICAvLyBTZXQgdG8gYSBwcmVmaXggZm9yIHRhcmdldC1zcGVjaWZpYyBpbnRyaW5zaWNzLgorICBsaXN0PExMVk1UeXBlPiBSZXRUeXBlcyA9IHJldF90eXBlczsKKyAgbGlzdDxMTFZNVHlwZT4gUGFyYW1UeXBlcyA9IHBhcmFtX3R5cGVzOworICBsaXN0PEludHJpbnNpY1Byb3BlcnR5PiBJbnRyUHJvcGVydGllcyA9IGludHJfcHJvcGVydGllczsKKyAgbGV0IFByb3BlcnRpZXMgPSBzZF9wcm9wZXJ0aWVzOworCisgIGJpdCBpc1RhcmdldCA9IDA7Cit9CisKKy8vLyBHQ0NCdWlsdGluIC0gSWYgdGhpcyBpbnRyaW5zaWMgZXhhY3RseSBjb3JyZXNwb25kcyB0byBhIEdDQyBidWlsdGluLCB0aGlzCisvLy8gc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBidWlsdGluLiAgVGhpcyBwcm92aWRlcyBhdXRvbWF0aWMgQ0JFIGFuZCBDRkUKKy8vLyBzdXBwb3J0LgorY2xhc3MgR0NDQnVpbHRpbjxzdHJpbmcgbmFtZT4geworICBzdHJpbmcgR0NDQnVpbHRpbk5hbWUgPSBuYW1lOworfQorCitjbGFzcyBNU0J1aWx0aW48c3RyaW5nIG5hbWU+IHsKKyAgc3RyaW5nIE1TQnVpbHRpbk5hbWUgPSBuYW1lOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tIFZhcmlhYmxlIEFyZ3VtZW50IEhhbmRsaW5nIEludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworCitkZWYgaW50X3Zhc3RhcnQgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdLCAibGx2bS52YV9zdGFydCI+OworZGVmIGludF92YWNvcHkgIDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fcHRyX3R5XSwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxsdm0udmFfY29weSI+OworZGVmIGludF92YWVuZCAgIDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXSwgImxsdm0udmFfZW5kIj47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLSBHYXJiYWdlIENvbGxlY3Rpb24gSW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworZGVmIGludF9nY3Jvb3QgIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cnB0cl90eSwgbGx2bV9wdHJfdHldPjsKK2RlZiBpbnRfZ2NyZWFkICA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9wdHJwdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfZ2N3cml0ZSA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3B0cnB0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8MT4sIE5vQ2FwdHVyZTwyPl0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb2RlIEdlbmVyYXRvciBJbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KK2RlZiBpbnRfcmV0dXJuYWRkcmVzcyA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FkZHJlc3NvZnJldHVybmFkZHJlc3MgOiBJbnRyaW5zaWM8W2xsdm1fcHRyX3R5XSwgW10sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfZnJhbWVhZGRyZXNzICA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3JlYWRfcmVnaXN0ZXIgIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sIFtsbHZtX21ldGFkYXRhX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtXSwgImxsdm0ucmVhZF9yZWdpc3RlciI+OworZGVmIGludF93cml0ZV9yZWdpc3RlciA6IEludHJpbnNpYzxbXSwgW2xsdm1fbWV0YWRhdGFfdHksIGxsdm1fYW55aW50X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10sICJsbHZtLndyaXRlX3JlZ2lzdGVyIj47CisKKy8vIEdldHMgdGhlIGFkZHJlc3Mgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIGFyZWEuIFRoaXMgaXMgdHlwaWNhbGx5IGEgY29weSBvZiB0aGUKKy8vIHN0YWNrLCBmcmFtZSwgb3IgYmFzZSBwb2ludGVyIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBwcm9sb2d1ZS4KK2RlZiBpbnRfbG9jYWxhZGRyZXNzIDogSW50cmluc2ljPFtsbHZtX3B0cl90eV0sIFtdLCBbSW50ck5vTWVtXT47CisKKy8vIEVzY2FwZXMgbG9jYWwgdmFyaWFibGVzIHRvIGFsbG93IGFjY2VzcyBmcm9tIG90aGVyIGZ1bmN0aW9ucy4KK2RlZiBpbnRfbG9jYWxlc2NhcGUgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3ZhcmFyZ190eV0+OworCisvLyBHaXZlbiBhIGZ1bmN0aW9uIGFuZCB0aGUgbG9jYWxhZGRyZXNzIG9mIGEgcGFyZW50IGZyYW1lLCByZXR1cm5zIGEgcG9pbnRlcgorLy8gdG8gYW4gZXNjYXBlZCBhbGxvY2F0aW9uIGluZGljYXRlZCBieSB0aGUgaW5kZXguCitkZWYgaW50X2xvY2FscmVjb3ZlciA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8gTm90ZTogd2UgdHJlYXQgc3RhY2tzYXZlL3N0YWNrcmVzdG9yZSBhcyB3cml0ZW1lbSBiZWNhdXNlIHdlIGRvbid0IG90aGVyd2lzZQorLy8gbW9kZWwgdGhlaXIgZGVwZW5kZW5jaWVzIG9uIGFsbG9jYXMuCitkZWYgaW50X3N0YWNrc2F2ZSAgICAgOiBJbnRyaW5zaWM8W2xsdm1fcHRyX3R5XT4sCisgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fc3RhY2tfc2F2ZSI+OworZGVmIGludF9zdGFja3Jlc3RvcmUgIDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zdGFja19yZXN0b3JlIj47CisKK2RlZiBpbnRfZ2V0X2R5bmFtaWNfYXJlYV9vZmZzZXQgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XT47CisKK2RlZiBpbnRfdGhyZWFkX3BvaW50ZXIgOiBJbnRyaW5zaWM8W2xsdm1fcHRyX3R5XSwgW10sIFtJbnRyTm9NZW1dPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdGhyZWFkX3BvaW50ZXIiPjsKKworLy8gSW50ckluYWNjZXNzaWJsZU1lbU9yQXJnTWVtT25seSBpcyBhIGxpdHRsZSBtb3JlIHBlc3NpbWlzdGljIHRoYW4gc3RyaWN0bHkKKy8vIG5lY2Vzc2FyeSBmb3IgcHJlZmV0Y2gsIGhvd2V2ZXIgaXQgZG9lcyBjb252ZW5pZW50bHkgcHJldmVudCB0aGUgcHJlZmV0Y2gKKy8vIGZyb20gYmVpbmcgcmVvcmRlcmVkIG92ZXJseSBtdWNoIHdpdGggcmVzcGVjdCB0byBuZWFyYnkgYWNjZXNzIHRvIHRoZSBzYW1lCisvLyBtZW1vcnkgd2hpbGUgbm90IGltcGVkaW5nIG9wdGltaXphdGlvbi4KK2RlZiBpbnRfcHJlZmV0Y2gKKyAgICA6IEludHJpbnNpYzxbXSwgWyBsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSBdLAorICAgICAgICAgICAgICAgIFsgSW50ckluYWNjZXNzaWJsZU1lbU9yQXJnTWVtT25seSwgUmVhZE9ubHk8MD4sIE5vQ2FwdHVyZTwwPiBdPjsKK2RlZiBpbnRfcGNtYXJrZXIgICAgICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XT47CisKK2RlZiBpbnRfcmVhZGN5Y2xlY291bnRlciA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldPjsKKworLy8gVGhlIGFzc3VtZSBpbnRyaW5zaWMgaXMgbWFya2VkIGFzIGFyYml0cmFyaWx5IHdyaXRpbmcgc28gdGhhdCBwcm9wZXIKKy8vIGNvbnRyb2wgZGVwZW5kZW5jaWVzIHdpbGwgYmUgbWFpbnRhaW5lZC4KK2RlZiBpbnRfYXNzdW1lICAgICAgICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTFfdHldLCBbXT47CisKKy8vIFN0YWNrIFByb3RlY3RvciBJbnRyaW5zaWMgLSBUaGUgc3RhY2twcm90ZWN0b3IgaW50cmluc2ljIHdyaXRlcyB0aGUgc3RhY2sKKy8vIGd1YXJkIHRvIHRoZSBjb3JyZWN0IHBsYWNlIG9uIHRoZSBzdGFjayBmcmFtZS4KK2RlZiBpbnRfc3RhY2twcm90ZWN0b3IgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9wdHJwdHJfdHldLCBbXT47CitkZWYgaW50X3N0YWNrZ3VhcmQgOiBJbnRyaW5zaWM8W2xsdm1fcHRyX3R5XSwgW10sIFtdPjsKKworLy8gQSBjb3VudGVyIGluY3JlbWVudCBmb3IgaW5zdHJ1bWVudGF0aW9uIGJhc2VkIHByb2ZpbGluZy4KK2RlZiBpbnRfaW5zdHJwcm9mX2luY3JlbWVudCA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsKKworLy8gQSBjb3VudGVyIGluY3JlbWVudCB3aXRoIHN0ZXAgZm9yIGluc3RydW1lbnRhdGlvbiBiYXNlZCBwcm9maWxpbmcuCitkZWYgaW50X2luc3RycHJvZl9pbmNyZW1lbnRfc3RlcCA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXT47CisKKy8vIEEgY2FsbCB0byBwcm9maWxlIHJ1bnRpbWUgZm9yIHZhbHVlIHByb2ZpbGluZyBvZiB0YXJnZXQgZXhwcmVzc2lvbnMKKy8vIHRocm91Z2ggaW5zdHJ1bWVudGF0aW9uIGJhc2VkIHByb2ZpbGluZy4KK2RlZiBpbnRfaW5zdHJwcm9mX3ZhbHVlX3Byb2ZpbGUgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YW5kYXJkIEMgTGlicmFyeSBJbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisKK2RlZiBpbnRfbWVtY3B5ICA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5LCBsbHZtX2FueXB0cl90eSwgbGx2bV9hbnlpbnRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kxX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPiwgTm9DYXB0dXJlPDE+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZU9ubHk8MD4sIFJlYWRPbmx5PDE+XT47CitkZWYgaW50X21lbW1vdmUgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5LCBsbHZtX2FueXB0cl90eSwgbGx2bV9hbnlpbnRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTFfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+LCBOb0NhcHR1cmU8MT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRPbmx5PDE+XT47CitkZWYgaW50X21lbXNldCAgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2FueWludF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8MD4sIFdyaXRlT25seTwwPl0+OworCisvLyBGSVhNRTogQWRkIHZlcnNpb24gb2YgdGhlc2UgZmxvYXRpbmcgcG9pbnQgaW50cmluc2ljcyB3aGljaCBhbGxvdyBub24tZGVmYXVsdAorLy8gcm91bmRpbmcgbW9kZXMgYW5kIEZQIGV4Y2VwdGlvbiBoYW5kbGluZy4KKworbGV0IEludHJQcm9wZXJ0aWVzID0gW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0gaW4geworICBkZWYgaW50X2ZtYSAgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPl0+OworICBkZWYgaW50X2ZtdWxhZGQgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPl0+OworCisgIC8vIFRoZXNlIGZ1bmN0aW9ucyBkbyBub3QgcmVhZCBtZW1vcnksIGJ1dCBhcmUgc2Vuc2l0aXZlIHRvIHRoZQorICAvLyByb3VuZGluZyBtb2RlLiBMTFZNIHB1cnBvc2VseSBkb2VzIG5vdCBtb2RlbCBjaGFuZ2VzIHRvIHRoZSBGUAorICAvLyBlbnZpcm9ubWVudCBzbyB0aGV5IGNhbiBiZSB0cmVhdGVkIGFzIHJlYWRub25lLgorICBkZWYgaW50X3NxcnQgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0+OworICBkZWYgaW50X3Bvd2kgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9pMzJfdHldPjsKKyAgZGVmIGludF9zaW4gIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsKKyAgZGVmIGludF9jb3MgIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsKKyAgZGVmIGludF9wb3cgIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XT47CisgIGRlZiBpbnRfbG9nICA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XT47CisgIGRlZiBpbnRfbG9nMTA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XT47CisgIGRlZiBpbnRfbG9nMiA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XT47CisgIGRlZiBpbnRfZXhwICA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XT47CisgIGRlZiBpbnRfZXhwMiA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XT47CisgIGRlZiBpbnRfZmFicyA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XT47CisgIGRlZiBpbnRfY29weXNpZ24gOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XT47CisgIGRlZiBpbnRfZmxvb3IgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0+OworICBkZWYgaW50X2NlaWwgIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsKKyAgZGVmIGludF90cnVuYyA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XT47CisgIGRlZiBpbnRfcmludCAgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0+OworICBkZWYgaW50X25lYXJieWludCA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XT47CisgIGRlZiBpbnRfcm91bmQgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0+OworICBkZWYgaW50X2Nhbm9uaWNhbGl6ZSA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCitkZWYgaW50X21pbm51bSA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sCisgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZSwgQ29tbXV0YXRpdmVdCis+OworZGVmIGludF9tYXhudW0gOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLAorICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPl0sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGUsIENvbW11dGF0aXZlXQorPjsKKworLy8gTk9URTogdGhlc2UgYXJlIGludGVybmFsIGludGVyZmFjZXMuCitkZWYgaW50X3NldGptcCAgICAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgIFtsbHZtX3B0cl90eV0+OworZGVmIGludF9sb25nam1wICAgIDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb1JldHVybl0+OworZGVmIGludF9zaWdzZXRqbXAgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0gLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5XT47CitkZWYgaW50X3NpZ2xvbmdqbXAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vUmV0dXJuXT47CisKKy8vIEludGVybmFsIGludGVyZmFjZSBmb3Igb2JqZWN0IHNpemUgY2hlY2tpbmcKK2RlZiBpbnRfb2JqZWN0c2l6ZSA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXB0cl90eSwgbGx2bV9pMV90eSwgbGx2bV9pMV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9vYmplY3Rfc2l6ZSI+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLSBDb25zdHJhaW5lZCBGbG9hdGluZyBQb2ludCBJbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKworbGV0IEludHJQcm9wZXJ0aWVzID0gW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5XSBpbiB7CisgIGRlZiBpbnRfZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2ZhZGQgOiBJbnRyaW5zaWM8WyBsbHZtX2FueWZsb2F0X3R5IF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5IF0+OworICBkZWYgaW50X2V4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9mc3ViIDogSW50cmluc2ljPFsgbGx2bV9hbnlmbG9hdF90eSBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSBdPjsKKyAgZGVmIGludF9leHBlcmltZW50YWxfY29uc3RyYWluZWRfZm11bCA6IEludHJpbnNpYzxbIGxsdm1fYW55ZmxvYXRfdHkgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHkgXT47CisgIGRlZiBpbnRfZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2ZkaXYgOiBJbnRyaW5zaWM8WyBsbHZtX2FueWZsb2F0X3R5IF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5IF0+OworICBkZWYgaW50X2V4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9mcmVtIDogSW50cmluc2ljPFsgbGx2bV9hbnlmbG9hdF90eSBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSBdPjsKKworICBkZWYgaW50X2V4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9mbWEgOiBJbnRyaW5zaWM8WyBsbHZtX2FueWZsb2F0X3R5IF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSBdPjsKKworICAvLyBUaGVzZSBpbnRyaW5zaWNzIGFyZSBzZW5zaXRpdmUgdG8gdGhlIHJvdW5kaW5nIG1vZGUgc28gd2UgbmVlZCBjb25zdHJhaW5lZAorICAvLyB2ZXJzaW9ucyBvZiBlYWNoIG9mIHRoZW0uICBXaGVuIHN0cmljdCByb3VuZGluZyBhbmQgZXhjZXB0aW9uIGNvbnRyb2wgYXJlCisgIC8vIG5vdCByZXF1aXJlZCB0aGUgbm9uLWNvbnN0cmFpbmVkIHZlcnNpb25zIG9mIHRoZXNlIGludHJpbnNpY3Mgc2hvdWxkIGJlCisgIC8vIHVzZWQuCisgIGRlZiBpbnRfZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX3NxcnQgOiBJbnRyaW5zaWM8WyBsbHZtX2FueWZsb2F0X3R5IF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHkgXT47CisgIGRlZiBpbnRfZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX3Bvd2kgOiBJbnRyaW5zaWM8WyBsbHZtX2FueWZsb2F0X3R5IF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSBdPjsKKyAgZGVmIGludF9leHBlcmltZW50YWxfY29uc3RyYWluZWRfc2luICA6IEludHJpbnNpYzxbIGxsdm1fYW55ZmxvYXRfdHkgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSBdPjsKKyAgZGVmIGludF9leHBlcmltZW50YWxfY29uc3RyYWluZWRfY29zICA6IEludHJpbnNpYzxbIGxsdm1fYW55ZmxvYXRfdHkgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSBdPjsKKyAgZGVmIGludF9leHBlcmltZW50YWxfY29uc3RyYWluZWRfcG93ICA6IEludHJpbnNpYzxbIGxsdm1fYW55ZmxvYXRfdHkgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHkgXT47CisgIGRlZiBpbnRfZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2xvZyAgOiBJbnRyaW5zaWM8WyBsbHZtX2FueWZsb2F0X3R5IF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHkgXT47CisgIGRlZiBpbnRfZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2xvZzEwOiBJbnRyaW5zaWM8WyBsbHZtX2FueWZsb2F0X3R5IF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHkgXT47CisgIGRlZiBpbnRfZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2xvZzIgOiBJbnRyaW5zaWM8WyBsbHZtX2FueWZsb2F0X3R5IF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHkgXT47CisgIGRlZiBpbnRfZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2V4cCAgOiBJbnRyaW5zaWM8WyBsbHZtX2FueWZsb2F0X3R5IF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5IF0+OworICBkZWYgaW50X2V4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9leHAyIDogSW50cmluc2ljPFsgbGx2bV9hbnlmbG9hdF90eSBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5IF0+OworICBkZWYgaW50X2V4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9yaW50ICA6IEludHJpbnNpYzxbIGxsdm1fYW55ZmxvYXRfdHkgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSBdPjsKKyAgZGVmIGludF9leHBlcmltZW50YWxfY29uc3RyYWluZWRfbmVhcmJ5aW50IDogSW50cmluc2ljPFsgbGx2bV9hbnlmbG9hdF90eSBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5IF0+OworfQorLy8gRklYTUU6IEFkZCBpbnRyaW5zaWNzIGZvciBmY21wLCBmcHRydW5jLCBmcGV4dCwgZnB0b3VpIGFuZCBmcHRvc2kuCisvLyBGSVhNRTogQWRkIGludHJpbnNpY3MgZm9yIGZhYnMsIGNvcHlzaWduLCBmbG9vciwgY2VpbCwgdHJ1bmMgYW5kIHJvdW5kPworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFeHBlY3QgSW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworZGVmIGludF9leHBlY3QgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPl0sIFtJbnRyTm9NZW1dPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCaXQgTWFuaXB1bGF0aW9uIEludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisKKy8vIE5vbmUgb2YgdGhlc2UgaW50cmluc2ljcyBhY2Nlc3NlcyBtZW1vcnkgYXQgYWxsLgorbGV0IEludHJQcm9wZXJ0aWVzID0gW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0gaW4geworICBkZWYgaW50X2Jzd2FwOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsKKyAgZGVmIGludF9jdHBvcDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XT47CisgIGRlZiBpbnRfY3RseiA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLCBbTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9pMV90eV0+OworICBkZWYgaW50X2N0dHogOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD4sIGxsdm1faTFfdHldPjsKKyAgZGVmIGludF9iaXRyZXZlcnNlIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERlYnVnZ2VyIEludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworCisvLyBOb25lIG9mIHRoZXNlIGludHJpbnNpY3MgYWNjZXNzZXMgbWVtb3J5IGF0IGFsbC4uLmJ1dCB0aGF0IGRvZXNuJ3QKKy8vIG1lYW4gdGhlIG9wdGltaXplcnMgY2FuIGNoYW5nZSB0aGVtIGFnZ3Jlc3NpdmVseS4gIFNwZWNpYWwgaGFuZGxpbmcKKy8vIG5lZWRlZCBpbiBhIGZldyBwbGFjZXMuIFRoZXNlIHN5bnRoZXRpYyBpbnRyaW5zaWNzIGhhdmUgbm8KKy8vIHNpZGUtZWZmZWN0cyBhbmQganVzdCBtYXJrIGluZm9ybWF0aW9uIGFib3V0IHRoZWlyIG9wZXJhbmRzLgorbGV0IEludHJQcm9wZXJ0aWVzID0gW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0gaW4geworICBkZWYgaW50X2RiZ19kZWNsYXJlICAgICAgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9tZXRhZGF0YV90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHldPjsKKyAgZGVmIGludF9kYmdfdmFsdWUgICAgICAgIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fbWV0YWRhdGFfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5XT47CisgIGRlZiBpbnRfZGJnX2FkZHIgICAgICAgICA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX21ldGFkYXRhX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLSBFeGNlcHRpb24gSGFuZGxpbmcgSW50cmluc2ljcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKworLy8gVGhlIHJlc3VsdCBvZiBlaC50eXBlaWQuZm9yIGRlcGVuZHMgb24gdGhlIGVuY2xvc2luZyBmdW5jdGlvbiwgYnV0IGluc2lkZSBhCisvLyBnaXZlbiBmdW5jdGlvbiBpdCBpcyAnY29uc3QnIGFuZCBtYXkgYmUgQ1NFJ2QgZXRjLgorZGVmIGludF9laF90eXBlaWRfZm9yIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9laF9yZXR1cm5faTMyIDogSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1fcHRyX3R5XT47CitkZWYgaW50X2VoX3JldHVybl9pNjQgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9wdHJfdHldPjsKKworLy8gZWguZXhjZXB0aW9ucG9pbnRlciByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBleGNlcHRpb24gY2F1Z2h0IGJ5CisvLyB0aGUgZ2l2ZW4gYGNhdGNocGFkYC4KK2RlZiBpbnRfZWhfZXhjZXB0aW9ucG9pbnRlciA6IEludHJpbnNpYzxbbGx2bV9hbnlwdHJfdHldLCBbbGx2bV90b2tlbl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLyBHZXRzIHRoZSBleGNlcHRpb24gY29kZSBmcm9tIGEgY2F0Y2hwYWQgdG9rZW4uIE9ubHkgdXNlZCBvbiBzb21lIHBsYXRmb3Jtcy4KK2RlZiBpbnRfZWhfZXhjZXB0aW9uY29kZSA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV90b2tlbl90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8gX19idWlsdGluX3Vud2luZF9pbml0IGlzIGFuIHVuZG9jdW1lbnRlZCBHQ0MgaW50cmluc2ljIHRoYXQgY2F1c2VzIGFsbAorLy8gY2FsbGVlLXNhdmVkIHJlZ2lzdGVycyB0byBiZSBzYXZlZCBhbmQgcmVzdG9yZWQgKHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5CisvLyBhcmUgdXNlZCkgaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24uIEl0IGlzIHVzZWQgYnkgbGliZ2NjX2VoLgorZGVmIGludF9laF91bndpbmRfaW5pdDogSW50cmluc2ljPFtdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl91bndpbmRfaW5pdCI+OworCitkZWYgaW50X2VoX2R3YXJmX2NmYSAgOiBJbnRyaW5zaWM8W2xsdm1fcHRyX3R5XSwgW2xsdm1faTMyX3R5XT47CisKK2xldCBJbnRyUHJvcGVydGllcyA9IFtJbnRyTm9NZW1dIGluIHsKKyAgZGVmIGludF9laF9zamxqX2xzZGEgICAgICAgICAgICAgOiBJbnRyaW5zaWM8W2xsdm1fcHRyX3R5XT47CisgIGRlZiBpbnRfZWhfc2psal9jYWxsc2l0ZSAgICAgICAgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHldPjsKK30KK2RlZiBpbnRfZWhfc2psal9mdW5jdGlvbmNvbnRleHQgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0+OworZGVmIGludF9laF9zamxqX3NldGptcCAgICAgICAgICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9wdHJfdHldPjsKK2RlZiBpbnRfZWhfc2psal9sb25nam1wICAgICAgICAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtJbnRyTm9SZXR1cm5dPjsKK2RlZiBpbnRfZWhfc2psal9zZXR1cF9kaXNwYXRjaCAgOiBJbnRyaW5zaWM8W10sIFtdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tIEdlbmVyaWMgVmFyaWFibGUgQXR0cmlidXRlIEludHJpbnNpY3MtLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCitkZWYgaW50X3Zhcl9hbm5vdGF0aW9uIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fcHRyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10sICJsbHZtLnZhci5hbm5vdGF0aW9uIj47CitkZWYgaW50X3B0cl9hbm5vdGF0aW9uIDogSW50cmluc2ljPFtMTFZNQW55UG9pbnRlclR5cGU8bGx2bV9hbnlpbnRfdHk+XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIGxsdm1fcHRyX3R5LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10sICJsbHZtLnB0ci5hbm5vdGF0aW9uIj47CitkZWYgaW50X2Fubm90YXRpb24gOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10sICJsbHZtLmFubm90YXRpb24iPjsKKworLy8gQW5ub3RhdGVzIHRoZSBjdXJyZW50IHByb2dyYW0gcG9pbnQgd2l0aCBtZXRhZGF0YSBzdHJpbmdzIHdoaWNoIGFyZSBlbWl0dGVkCisvLyBhcyBDb2RlVmlldyBkZWJ1ZyBpbmZvIHJlY29yZHMuIFRoaXMgaXMgZXhwZW5zaXZlLCBhcyBpdCBkaXNhYmxlcyBpbmxpbmluZworLy8gYW5kIGlzIG1vZGVsbGVkIGFzIGhhdmluZyBzaWRlIGVmZmVjdHMuCitkZWYgaW50X2NvZGV2aWV3X2Fubm90YXRpb24gOiBJbnRyaW5zaWM8W10sIFtsbHZtX21ldGFkYXRhX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJOb0R1cGxpY2F0ZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxsdm0uY29kZXZpZXcuYW5ub3RhdGlvbiI+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUcmFtcG9saW5lIEludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KK2RlZiBpbnRfaW5pdF90cmFtcG9saW5lIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3B0cl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8MD5dPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2luaXRfdHJhbXBvbGluZSI+OworCitkZWYgaW50X2FkanVzdF90cmFtcG9saW5lIDogSW50cmluc2ljPFtsbHZtX3B0cl90eV0sIFtsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWRqdXN0X3RyYW1wb2xpbmUiPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3ZlcmZsb3cgSW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisKKy8vIEV4cG9zZSB0aGUgY2FycnkgZmxhZyBmcm9tIGFkZCBvcGVyYXRpb25zIG9uIHR3byBpbnRlZ3JhbHMuCitkZWYgaW50X3NhZGRfd2l0aF9vdmVyZmxvdyA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHksIGxsdm1faTFfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0+OworZGVmIGludF91YWRkX3dpdGhfb3ZlcmZsb3cgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5LCBsbHZtX2kxX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdPjsKKworZGVmIGludF9zc3ViX3dpdGhfb3ZlcmZsb3cgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5LCBsbHZtX2kxX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdPjsKK2RlZiBpbnRfdXN1Yl93aXRoX292ZXJmbG93IDogSW50cmluc2ljPFtsbHZtX2FueWludF90eSwgbGx2bV9pMV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXT47CisKK2RlZiBpbnRfc211bF93aXRoX292ZXJmbG93IDogSW50cmluc2ljPFtsbHZtX2FueWludF90eSwgbGx2bV9pMV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXT47CitkZWYgaW50X3VtdWxfd2l0aF9vdmVyZmxvdyA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHksIGxsdm1faTFfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWVtb3J5IFVzZSBNYXJrZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KK2RlZiBpbnRfbGlmZXRpbWVfc3RhcnQgIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwxPl0+OworZGVmIGludF9saWZldGltZV9lbmQgICAgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDE+XT47CitkZWYgaW50X2ludmFyaWFudF9zdGFydCA6IEludHJpbnNpYzxbbGx2bV9kZXNjcmlwdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8MT5dPjsKK2RlZiBpbnRfaW52YXJpYW50X2VuZCAgIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fZGVzY3JpcHRvcl90eSwgbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8Mj5dPjsKKworLy8gaW52YXJpYW50Lmdyb3VwLmJhcnJpZXIgY2FuJ3QgYmUgbWFya2VkIHdpdGggJ3JlYWRub25lJyAoSW50ck5vTWVtKSwKKy8vIGJlY2F1c2UgaXQgd291bGQgY2F1c2UgQ1NFIG9mIHR3byBiYXJyaWVycyB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50LgorLy8gUmVhZG9ubHkgYW5kIGFyZ21lbW9ubHkgc2F5cyB0aGF0IGJhcnJpZXIgb25seSByZWFkcyBpdHMgYXJndW1lbnQgYW5kCisvLyBpdCBjYW4gYmUgQ1NFIG9ubHkgaWYgbWVtb3J5IGRpZG4ndCBjaGFuZ2UgYmV0d2VlbiAyIGJhcnJpZXJzIGNhbGwsCisvLyB3aGljaCBpcyB2YWxpZC4KKy8vIFRoZSBhcmd1bWVudCBhbHNvIGNhbid0IGJlIG1hcmtlZCB3aXRoICdyZXR1cm5lZCcgYXR0cmlidXRlLCBiZWNhdXNlCisvLyBpdCB3b3VsZCByZW1vdmUgYmFycmllci4KK2RlZiBpbnRfaW52YXJpYW50X2dyb3VwX2JhcnJpZXIgOiBJbnRyaW5zaWM8W2xsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YWNrbWFwIEludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworZGVmIGludF9leHBlcmltZW50YWxfc3RhY2ttYXAgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92YXJhcmdfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtUaHJvd3NdPjsKK2RlZiBpbnRfZXhwZXJpbWVudGFsX3BhdGNocG9pbnRfdm9pZCA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdmFyYXJnX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1Rocm93c10+OworZGVmIGludF9leHBlcmltZW50YWxfcGF0Y2hwb2ludF9pNjQgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdmFyYXJnX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbVGhyb3dzXT47CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2FyYmFnZSBDb2xsZWN0aW9uIEludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoZXNlIGFyZSBkb2N1bWVudGVkIGluIGRvY3MvU3RhdGVwb2ludC5yc3QKKworZGVmIGludF9leHBlcmltZW50YWxfZ2Nfc3RhdGVwb2ludCA6IEludHJpbnNpYzxbbGx2bV90b2tlbl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9hbnlwdHJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV92YXJhcmdfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbVGhyb3dzXT47CisKK2RlZiBpbnRfZXhwZXJpbWVudGFsX2djX3Jlc3VsdCAgIDogSW50cmluc2ljPFtsbHZtX2FueV90eV0sIFtsbHZtX3Rva2VuX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbV0+OworZGVmIGludF9leHBlcmltZW50YWxfZ2NfcmVsb2NhdGUgOiBJbnRyaW5zaWM8W2xsdm1fYW55X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdG9rZW5fdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb3JvdXRpbmUgSW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGhlc2UgYXJlIGRvY3VtZW50ZWQgaW4gZG9jcy9Db3JvdXRpbmVzLnJzdAorCisvLyBDb3JvdXRpbmUgU3RydWN0dXJlIEludHJpbnNpY3MuCisKK2RlZiBpbnRfY29yb19pZCA6IEludHJpbnNpYzxbbGx2bV90b2tlbl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fcHRyX3R5LCBsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5LCBJbnRyUmVhZE1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZE5vbmU8MT4sIFJlYWRPbmx5PDI+LCBOb0NhcHR1cmU8Mj5dPjsKK2RlZiBpbnRfY29yb19hbGxvYyA6IEludHJpbnNpYzxbbGx2bV9pMV90eV0sIFtsbHZtX3Rva2VuX3R5XSwgW10+OworZGVmIGludF9jb3JvX2JlZ2luIDogSW50cmluc2ljPFtsbHZtX3B0cl90eV0sIFtsbHZtX3Rva2VuX3R5LCBsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1dyaXRlT25seTwxPl0+OworCitkZWYgaW50X2Nvcm9fZnJlZSA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLCBbbGx2bV90b2tlbl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seSwgUmVhZE9ubHk8MT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9DYXB0dXJlPDE+XT47CitkZWYgaW50X2Nvcm9fZW5kIDogSW50cmluc2ljPFtsbHZtX2kxX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kxX3R5XSwgW10+OworCitkZWYgaW50X2Nvcm9fZnJhbWUgOiBJbnRyaW5zaWM8W2xsdm1fcHRyX3R5XSwgW10sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfY29yb19zaXplIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sIFtdLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfY29yb19zYXZlIDogSW50cmluc2ljPFtsbHZtX3Rva2VuX3R5XSwgW2xsdm1fcHRyX3R5XSwgW10+OworZGVmIGludF9jb3JvX3N1c3BlbmQgOiBJbnRyaW5zaWM8W2xsdm1faThfdHldLCBbbGx2bV90b2tlbl90eSwgbGx2bV9pMV90eV0sIFtdPjsKKworZGVmIGludF9jb3JvX3BhcmFtIDogSW50cmluc2ljPFtsbHZtX2kxX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgUmVhZE5vbmU8MD4sIFJlYWROb25lPDE+XT47CisKKy8vIENvcm91dGluZSBNYW5pcHVsYXRpb24gSW50cmluc2ljcy4KKworZGVmIGludF9jb3JvX3Jlc3VtZSA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW1Rocm93c10+OworZGVmIGludF9jb3JvX2Rlc3Ryb3kgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtUaHJvd3NdPjsKK2RlZiBpbnRfY29yb19kb25lIDogSW50cmluc2ljPFtsbHZtX2kxX3R5XSwgW2xsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgUmVhZE9ubHk8MD4sIE5vQ2FwdHVyZTwwPl0+OworZGVmIGludF9jb3JvX3Byb21pc2UgOiBJbnRyaW5zaWM8W2xsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTFfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgTm9DYXB0dXJlPDA+XT47CisKKy8vIENvcm91dGluZSBMb3dlcmluZyBJbnRyaW5zaWNzLiBVc2VkIGludGVybmFsbHkgYnkgY29yb3V0aW5lIHBhc3Nlcy4KKworZGVmIGludF9jb3JvX3N1YmZuX2FkZHIgOiBJbnRyaW5zaWM8W2xsdm1fcHRyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHksIFJlYWRPbmx5PDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vQ2FwdHVyZTwwPl0+OworCisvLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPdGhlciBJbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCitkZWYgaW50X2ZsdF9yb3VuZHMgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XT4sCisgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fZmx0X3JvdW5kcyI+OworZGVmIGludF90cmFwIDogSW50cmluc2ljPFtdLCBbXSwgW0ludHJOb1JldHVybl0+LAorICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX3RyYXAiPjsKK2RlZiBpbnRfZGVidWd0cmFwIDogSW50cmluc2ljPFtdPiwKKyAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2RlYnVndHJhcCI+OworCisvLyBTdXBwb3J0IGZvciBkeW5hbWljIGRlb3B0aW1pemF0aW9uIChvciBkZS1zcGVjaWFsaXphdGlvbikKK2RlZiBpbnRfZXhwZXJpbWVudGFsX2Rlb3B0aW1pemUgOiBJbnRyaW5zaWM8W2xsdm1fYW55X3R5XSwgW2xsdm1fdmFyYXJnX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1Rocm93c10+OworCisvLyBTdXBwb3J0IGZvciBzcGVjdWxhdGl2ZSBydW50aW1lIGd1YXJkcworZGVmIGludF9leHBlcmltZW50YWxfZ3VhcmQgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2kxX3R5LCBsbHZtX3ZhcmFyZ190eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbVGhyb3dzXT47CisKKy8vIE5PUDogY2FsbHMvaW52b2tlcyB0byB0aGlzIGludHJpbnNpYyBhcmUgcmVtb3ZlZCBieSBjb2RlZ2VuCitkZWYgaW50X2Rvbm90aGluZyA6IEludHJpbnNpYzxbXSwgW10sIFtJbnRyTm9NZW1dPjsKKworLy8gVGhpcyBpbnN0cnVjdGlvbiBoYXMgbm8gYWN0dWFsIGVmZmVjdCwgdGhvdWdoIGl0IGlzIHRyZWF0ZWQgYnkgdGhlIG9wdGltaXplcgorLy8gaGFzIGhhdmluZyBvcGFxdWUgc2lkZSBlZmZlY3RzLiBUaGlzIG1heSBiZSBpbnNlcnRlZCBpbnRvIGxvb3BzIHRvIGVuc3VyZQorLy8gdGhhdCB0aGV5IGFyZSBub3QgcmVtb3ZlZCBldmVuIGlmIHRoZXkgdHVybiBvdXQgdG8gYmUgZW1wdHksIGZvciBsYW5ndWFnZXMKKy8vIHdoaWNoIHNwZWNpZnkgdGhhdCBpbmZpbml0ZSBsb29wcyBtdXN0IGJlIHByZXNlcnZlZC4KK2RlZiBpbnRfc2lkZWVmZmVjdCA6IEludHJpbnNpYzxbXSwgW10sIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seV0+OworCisvLyBJbnRyaXNpY3MgdG8gc3VwcG9ydCBoYWxmIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBmb3JtYXQKK2xldCBJbnRyUHJvcGVydGllcyA9IFtJbnRyTm9NZW1dIGluIHsKK2RlZiBpbnRfY29udmVydF90b19mcDE2ICAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwgW2xsdm1fYW55ZmxvYXRfdHldPjsKK2RlZiBpbnRfY29udmVydF9mcm9tX2ZwMTYgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLCBbbGx2bV9pMTZfdHldPjsKK30KKworLy8gQ2xlYXIgY2FjaGUgaW50cmluc2ljLCBkZWZhdWx0IHRvIGlnbm9yZSAoaWUuIGVtaXQgbm90aGluZykKKy8vIG1hcHMgdG8gdm9pZCBfX2NsZWFyX2NhY2hlKCkgb24gc3VwcG9ydGluZyBwbGF0Zm9ybXMKK2RlZiBpbnRfY2xlYXJfY2FjaGUgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgImxsdm0uY2xlYXJfY2FjaGUiPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYXNrZWQgSW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCitkZWYgaW50X21hc2tlZF9zdG9yZSA6IEludHJpbnNpYzxbXSwgW2xsdm1fYW55dmVjdG9yX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmVjdG9yU2FtZVdpZHRoPDAsIGxsdm1faTFfdHk+XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCitkZWYgaW50X21hc2tlZF9sb2FkICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1BbnlQb2ludGVyVHlwZTxMTFZNTWF0Y2hUeXBlPDA+PiwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZlY3RvclNhbWVXaWR0aDwwLCBsbHZtX2kxX3R5PiwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKK2RlZiBpbnRfbWFza2VkX2dhdGhlcjogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTVZlY3Rvck9mQW55UG9pbnRlcnNUb0VsdDwwPiwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZlY3RvclNhbWVXaWR0aDwwLCBsbHZtX2kxX3R5PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbV0+OworCitkZWYgaW50X21hc2tlZF9zY2F0dGVyOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55dmVjdG9yX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmVjdG9yT2ZBbnlQb2ludGVyc1RvRWx0PDA+LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZlY3RvclNhbWVXaWR0aDwwLCBsbHZtX2kxX3R5Pl0+OworCitkZWYgaW50X21hc2tlZF9leHBhbmRsb2FkOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTVBvaW50ZXJUb0VsdDwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZlY3RvclNhbWVXaWR0aDwwLCBsbHZtX2kxX3R5PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtXT47CisKK2RlZiBpbnRfbWFza2VkX2NvbXByZXNzc3RvcmU6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnl2ZWN0b3JfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Qb2ludGVyVG9FbHQ8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WZWN0b3JTYW1lV2lkdGg8MCwgbGx2bV9pMV90eT5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCisvLyBUZXN0IHdoZXRoZXIgYSBwb2ludGVyIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHR5cGUgbWV0YWRhdGEgaWRlbnRpZmllci4KK2RlZiBpbnRfdHlwZV90ZXN0IDogSW50cmluc2ljPFtsbHZtX2kxX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX21ldGFkYXRhX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8gU2FmZWx5IGxvYWRzIGEgZnVuY3Rpb24gcG9pbnRlciBmcm9tIGEgdmlydHVhbCB0YWJsZSBwb2ludGVyIHVzaW5nIHR5cGUgbWV0YWRhdGEuCitkZWYgaW50X3R5cGVfY2hlY2tlZF9sb2FkIDogSW50cmluc2ljPFtsbHZtX3B0cl90eSwgbGx2bV9pMV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1fbWV0YWRhdGFfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vIENyZWF0ZSBhIGJyYW5jaCBmdW5uZWwgdGhhdCBpbXBsZW1lbnRzIGFuIGluZGlyZWN0IGNhbGwgdG8gYSBsaW1pdGVkIHNldCBvZgorLy8gY2FsbGVlcy4gVGhpcyBuZWVkcyB0byBiZSBhIG11c3R0YWlsIGNhbGwuCitkZWYgaW50X2ljYWxsX2JyYW5jaF9mdW5uZWwgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3ZhcmFyZ190eV0sIFtdPjsKKworZGVmIGludF9sb2FkX3JlbGF0aXZlOiBJbnRyaW5zaWM8W2xsdm1fcHRyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2FueWludF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKy8vIFhyYXkgaW50cmluc2ljcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEN1c3RvbSBldmVudCBsb2dnaW5nIGZvciB4LXJheS4KKy8vIFRha2VzIGEgcG9pbnRlciB0byBhIHN0cmluZyBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLgorZGVmIGludF94cmF5X2N1c3RvbWV2ZW50IDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+LCBSZWFkT25seTwwPiwgSW50cldyaXRlTWVtXT47CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLSBNZW1vcnkgaW50cmluc2ljcyB3aXRoIGVsZW1lbnQtd2lzZSBhdG9taWNpdHkgZ3VhcmFudGVlcyAtLS0tLS09PT0vLworLy8KKworLy8gQGxsdm0ubWVtY3B5LmVsZW1lbnQudW5vcmRlcmVkLmF0b21pYy4qKGRlc3QsIHNyYywgbGVuZ3RoLCBlbGVtZW50c2l6ZSkKK2RlZiBpbnRfbWVtY3B5X2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pYworICAgIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgIGxsdm1fYW55cHRyX3R5LCBsbHZtX2FueXB0cl90eSwgbGx2bV9hbnlpbnRfdHksIGxsdm1faTMyX3R5CisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICBJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+LCBOb0NhcHR1cmU8MT4sIFdyaXRlT25seTwwPiwKKyAgICAgICAgICAgICAgICAgIFJlYWRPbmx5PDE+CisgICAgICAgICAgICAgICAgXT47CisKKy8vIEBsbHZtLm1lbW1vdmUuZWxlbWVudC51bm9yZGVyZWQuYXRvbWljLiooZGVzdCwgc3JjLCBsZW5ndGgsIGVsZW1lbnRzaXplKQorZGVmIGludF9tZW1tb3ZlX2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pYworICAgIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgIGxsdm1fYW55cHRyX3R5LCBsbHZtX2FueXB0cl90eSwgbGx2bV9hbnlpbnRfdHksIGxsdm1faTMyX3R5CisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICBJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+LCBOb0NhcHR1cmU8MT4sIFdyaXRlT25seTwwPiwKKyAgICAgICAgICAgICAgICAgIFJlYWRPbmx5PDE+CisgICAgICAgICAgICAgICAgXT47CisKKy8vIEBsbHZtLm1lbXNldC5lbGVtZW50LnVub3JkZXJlZC5hdG9taWMuKihkZXN0LCB2YWx1ZSwgbGVuZ3RoLCBlbGVtZW50c2l6ZSkKK2RlZiBpbnRfbWVtc2V0X2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pYworICAgIDogSW50cmluc2ljPFtdLCBbIGxsdm1fYW55cHRyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2FueWludF90eSwgbGx2bV9pMzJfdHkgXSwKKyAgICAgICAgICAgICAgICBbIEludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8MD4sIFdyaXRlT25seTwwPiBdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVkdWN0aW9uIEludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCitkZWYgaW50X2V4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX2ZhZGQgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueWZsb2F0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9leHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9mbXVsIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnlmbG9hdF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfYWRkIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9leHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9tdWwgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2V4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX2FuZCA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2Vfb3IgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9leHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV94b3IgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2V4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX3NtYXggOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2Vfc21pbiA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9leHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV91bWF4IDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2V4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX3VtaW4gOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfZm1heCA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2V4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX2ZtaW4gOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLz09PS0tLS0tIEludHJpbnNpY3MgdGhhdCBhcmUgdXNlZCB0byBwcm92aWRlIHByZWRpY2F0ZSBpbmZvcm1hdGlvbiAtLS0tLT09PS8vCisKK2RlZiBpbnRfc3NhX2NvcHkgOiBJbnRyaW5zaWM8W2xsdm1fYW55X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBSZXR1cm5lZDwwPl0+OworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRhcmdldC1zcGVjaWZpYyBpbnRyaW5zaWNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3NQb3dlclBDLnRkIgoraW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzWDg2LnRkIgoraW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzQVJNLnRkIgoraW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzQUFyY2g2NC50ZCIKK2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljc1hDb3JlLnRkIgoraW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzSGV4YWdvbi50ZCIKK2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljc05WVk0udGQiCitpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3NNaXBzLnRkIgoraW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzQU1ER1BVLnRkIgoraW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzQlBGLnRkIgoraW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzU3lzdGVtWi50ZCIKK2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljc1dlYkFzc2VtYmx5LnRkIgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzQUFyY2g2NC50ZCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc0FBcmNoNjQudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzNDEzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc0FBcmNoNjQudGQKQEAgLTAsMCArMSw2NTIgQEAKKy8vPT09LSBJbnRyaW5zaWNzQUFSQ0g2NC50ZCAtIERlZmluZXMgQUFSQ0g2NCBpbnRyaW5zaWNzIC0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYWxsIG9mIHRoZSBBQVJDSDY0LXNwZWNpZmljIGludHJpbnNpY3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworbGV0IFRhcmdldFByZWZpeCA9ICJhYXJjaDY0IiBpbiB7CisKK2RlZiBpbnRfYWFyY2g2NF9sZHhyIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2FueXB0cl90eV0+OworZGVmIGludF9hYXJjaDY0X2xkYXhyIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2FueXB0cl90eV0+OworZGVmIGludF9hYXJjaDY0X3N0eHIgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2FueXB0cl90eV0+OworZGVmIGludF9hYXJjaDY0X3N0bHhyIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9hbnlwdHJfdHldPjsKKworZGVmIGludF9hYXJjaDY0X2xkeHAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sIFtsbHZtX3B0cl90eV0+OworZGVmIGludF9hYXJjaDY0X2xkYXhwIDogSW50cmluc2ljPFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLCBbbGx2bV9wdHJfdHldPjsKK2RlZiBpbnRfYWFyY2g2NF9zdHhwIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9wdHJfdHldPjsKK2RlZiBpbnRfYWFyY2g2NF9zdGx4cCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX3B0cl90eV0+OworCitkZWYgaW50X2FhcmNoNjRfY2xyZXggOiBJbnRyaW5zaWM8W10+OworCitkZWYgaW50X2FhcmNoNjRfc2RpdiA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLCBbTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPl0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYWFyY2g2NF91ZGl2IDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+XSwgW0ludHJOb01lbV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSElOVAorCitkZWYgaW50X2FhcmNoNjRfaGludCA6IEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBEYXRhIEJhcnJpZXIgSW5zdHJ1Y3Rpb25zCisKK2RlZiBpbnRfYWFyY2g2NF9kbWIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX2RtYiI+LCBNU0J1aWx0aW48Il9fZG1iIj4sIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XT47CitkZWYgaW50X2FhcmNoNjRfZHNiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9kc2IiPiwgTVNCdWlsdGluPCJfX2RzYiI+LCBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0+OworZGVmIGludF9hYXJjaDY0X2lzYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1faXNiIj4sIE1TQnVpbHRpbjwiX19pc2IiPiwgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHldPjsKKworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQWR2YW5jZWQgU0lNRCAoTkVPTikKKworbGV0IFRhcmdldFByZWZpeCA9ICJhYXJjaDY0IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLmFhcmNoNjQuIi4KKyAgY2xhc3MgQWR2U0lNRF8yU2NhbGFyX0Zsb2F0X0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBjbGFzcyBBZHZTSU1EX0ZQVG9JbnRSb3VuZGluZ19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLCBbbGx2bV9hbnlmbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBjbGFzcyBBZHZTSU1EXzFJbnRBcmdfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dLCBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfMUZsb2F0QXJnX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dLCBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfMVZlY3RvckFyZ19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0sIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8xVmVjdG9yQXJnX0V4cGFuZF9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLCBbbGx2bV9hbnl2ZWN0b3JfdHldLCBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfMVZlY3RvckFyZ19Mb25nX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sIFtMTFZNVHJ1bmNhdGVkVHlwZTwwPl0sIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8xSW50QXJnX05hcnJvd19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLCBbbGx2bV9hbnlpbnRfdHldLCBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfMVZlY3RvckFyZ19OYXJyb3dfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW0xMVk1FeHRlbmRlZFR5cGU8MD5dLCBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfMVZlY3RvckFyZ19JbnRfQWNyb3NzX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sIFtsbHZtX2FueXZlY3Rvcl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8xVmVjdG9yQXJnX0Zsb2F0X0Fjcm9zc19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtsbHZtX2FueXZlY3Rvcl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBjbGFzcyBBZHZTSU1EXzJJbnRBcmdfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8yRmxvYXRBcmdfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8yVmVjdG9yQXJnX0NvbXBhcmVfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwgW2xsdm1fYW55dmVjdG9yX3R5LCBMTFZNTWF0Y2hUeXBlPDE+XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfMkFyZ19GbG9hdENvbXBhcmVfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW2xsdm1fYW55ZmxvYXRfdHksIExMVk1NYXRjaFR5cGU8MT5dLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8yVmVjdG9yQXJnX0xvbmdfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICBbTExWTVRydW5jYXRlZFR5cGU8MD4sIExMVk1UcnVuY2F0ZWRUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfMlZlY3RvckFyZ19XaWRlX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1UcnVuY2F0ZWRUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfMlZlY3RvckFyZ19OYXJyb3dfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICBbTExWTUV4dGVuZGVkVHlwZTwwPiwgTExWTUV4dGVuZGVkVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EXzJBcmdfU2NhbGFyX05hcnJvd19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLAorICAgICAgICAgICAgICAgIFtMTFZNRXh0ZW5kZWRUeXBlPDA+LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EXzJWZWN0b3JBcmdfU2NhbGFyX0V4cGFuZF9CeVNpemVfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICBbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8yVmVjdG9yQXJnX1NjYWxhcl9XaWRlX0J5U2l6ZV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgIFtMTFZNVHJ1bmNhdGVkVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EXzJWZWN0b3JBcmdfU2NhbGFyX1dpZGVfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICBbTExWTVRydW5jYXRlZFR5cGU8MD4sIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfMlZlY3RvckFyZ19UaWVkX05hcnJvd19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgIFtMTFZNSGFsZkVsZW1lbnRzVmVjdG9yVHlwZTwwPiwgbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBjbGFzcyBBZHZTSU1EXzNWZWN0b3JBcmdfSW50cmluc2ljCisgICAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EXzNWZWN0b3JBcmdfU2NhbGFyX0ludHJpbnNpYworICAgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfM1ZlY3RvckFyZ19UaWVkX05hcnJvd19JbnRyaW5zaWMKKyAgICAgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICBbTExWTUhhbGZFbGVtZW50c1ZlY3RvclR5cGU8MD4sIGxsdm1fYW55dmVjdG9yX3R5LAorICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MT5dLCBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfM1ZlY3RvckFyZ19TY2FsYXJfVGllZF9OYXJyb3dfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICBbTExWTUhhbGZFbGVtZW50c1ZlY3RvclR5cGU8MD4sIGxsdm1fYW55dmVjdG9yX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EX0N2dEZ4VG9GUF9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtsbHZtX2FueWludF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF9DdnRGUFRvRnhfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW2xsdm1fYW55ZmxvYXRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgY2xhc3MgQWR2U0lNRF8xQXJnX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueV90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XSwgW0ludHJOb01lbV0+OworfQorCisvLyBBcml0aG1ldGljIG9wcworCitsZXQgVGFyZ2V0UHJlZml4ID0gImFhcmNoNjQiLCBJbnRyUHJvcGVydGllcyA9IFtJbnRyTm9NZW1dIGluIHsKKyAgLy8gVmVjdG9yIEFkZCBBY3Jvc3MgTGFuZXMKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc2FkZHYgOiBBZHZTSU1EXzFWZWN0b3JBcmdfSW50X0Fjcm9zc19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VhZGR2IDogQWR2U0lNRF8xVmVjdG9yQXJnX0ludF9BY3Jvc3NfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mYWRkdiA6IEFkdlNJTURfMVZlY3RvckFyZ19GbG9hdF9BY3Jvc3NfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBMb25nIEFkZCBBY3Jvc3MgTGFuZXMKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc2FkZGx2IDogQWR2U0lNRF8xVmVjdG9yQXJnX0ludF9BY3Jvc3NfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl91YWRkbHYgOiBBZHZTSU1EXzFWZWN0b3JBcmdfSW50X0Fjcm9zc19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIEhhbHZpbmcgQWRkCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NoYWRkIDogQWR2U0lNRF8yVmVjdG9yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdWhhZGQgOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBSb3VuZGluZyBIYWx2aW5nIEFkZAorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zcmhhZGQgOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl91cmhhZGQgOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBTYXR1cmF0aW5nIEFkZAorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zcWFkZCA6IEFkdlNJTURfMkludEFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3N1cWFkZCA6IEFkdlNJTURfMkludEFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VzcWFkZCA6IEFkdlNJTURfMkludEFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VxYWRkIDogQWR2U0lNRF8ySW50QXJnX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgQWRkIEhpZ2gtSGFsZgorICAvLyBGSVhNRTogdGhpcyBpcyBhIGxlZ2FjeSBpbnRyaW5zaWMgZm9yIGFhcmNoNjRfc2ltZC5oLiBSZW1vdmUgaXQgd2hlbiB0aGF0CisgIC8vIGhlYWRlciBpcyBubyBsb25nZXIgc3VwcG9ydGVkLgorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9hZGRobiA6IEFkdlNJTURfMlZlY3RvckFyZ19OYXJyb3dfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBSb3VuZGluZyBBZGQgSGlnaC1IYWxmCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3JhZGRobiA6IEFkdlNJTURfMlZlY3RvckFyZ19OYXJyb3dfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBTYXR1cmF0aW5nIERvdWJsaW5nIE11bHRpcGx5IEhpZ2gKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc3FkbXVsaCA6IEFkdlNJTURfMkludEFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFNhdHVyYXRpbmcgUm91bmRpbmcgRG91YmxpbmcgTXVsdGlwbHkgSGlnaAorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zcXJkbXVsaCA6IEFkdlNJTURfMkludEFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFBvbHlub21pbmFsIE11bHRpcGx5CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3BtdWwgOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBMb25nIE11bHRpcGx5CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NtdWxsIDogQWR2U0lNRF8yVmVjdG9yQXJnX0xvbmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl91bXVsbCA6IEFkdlNJTURfMlZlY3RvckFyZ19Mb25nX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fcG11bGwgOiBBZHZTSU1EXzJWZWN0b3JBcmdfTG9uZ19JbnRyaW5zaWM7CisKKyAgLy8gNjQtYml0IHBvbHlub21pYWwgbXVsdGlwbHkgcmVhbGx5IHJldHVybnMgYW4gaTEyOCwgd2hpY2ggaXMgbm90IGxlZ2FsLiBGYWtlCisgIC8vIGl0IHdpdGggYSB2MTZpOC4KKyAgZGVmIGludF9hYXJjaDY0X25lb25fcG11bGw2NCA6CisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisKKyAgLy8gVmVjdG9yIEV4dGVuZGluZyBNdWx0aXBseQorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mbXVseCA6IEFkdlNJTURfMkZsb2F0QXJnX0ludHJpbnNpYyB7CisgICAgbGV0IEludHJQcm9wZXJ0aWVzID0gW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdOworICB9CisKKyAgLy8gVmVjdG9yIFNhdHVyYXRpbmcgRG91YmxpbmcgTG9uZyBNdWx0aXBseQorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zcWRtdWxsIDogQWR2U0lNRF8yVmVjdG9yQXJnX0xvbmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zcWRtdWxsc19zY2FsYXIKKyAgICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIC8vIFZlY3RvciBIYWx2aW5nIFN1YnRyYWN0CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3Noc3ViIDogQWR2U0lNRF8yVmVjdG9yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdWhzdWIgOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBTYXR1cmF0aW5nIFN1YnRyYWN0CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3Nxc3ViIDogQWR2U0lNRF8ySW50QXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdXFzdWIgOiBBZHZTSU1EXzJJbnRBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBTdWJ0cmFjdCBIaWdoLUhhbGYKKyAgLy8gRklYTUU6IHRoaXMgaXMgYSBsZWdhY3kgaW50cmluc2ljIGZvciBhYXJjaDY0X3NpbWQuaC4gUmVtb3ZlIGl0IHdoZW4gdGhhdAorICAvLyBoZWFkZXIgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KKyAgZGVmIGludF9hYXJjaDY0X25lb25fc3ViaG4gOiBBZHZTSU1EXzJWZWN0b3JBcmdfTmFycm93X0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgUm91bmRpbmcgU3VidHJhY3QgSGlnaC1IYWxmCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3JzdWJobiA6IEFkdlNJTURfMlZlY3RvckFyZ19OYXJyb3dfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBDb21wYXJlIEFic29sdXRlIEdyZWF0ZXItdGhhbi1vci1lcXVhbAorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mYWNnZSA6IEFkdlNJTURfMkFyZ19GbG9hdENvbXBhcmVfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBDb21wYXJlIEFic29sdXRlIEdyZWF0ZXItdGhhbgorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mYWNndCA6IEFkdlNJTURfMkFyZ19GbG9hdENvbXBhcmVfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBBYnNvbHV0ZSBEaWZmZXJlbmNlCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NhYmQgOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl91YWJkIDogQWR2U0lNRF8yVmVjdG9yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fZmFiZCA6IEFkdlNJTURfMlZlY3RvckFyZ19JbnRyaW5zaWM7CisKKyAgLy8gU2NhbGFyIEFic29sdXRlIERpZmZlcmVuY2UKKyAgZGVmIGludF9hYXJjaDY0X3Npc2RfZmFiZCA6IEFkdlNJTURfMlNjYWxhcl9GbG9hdF9JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIE1heAorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zbWF4IDogQWR2U0lNRF8yVmVjdG9yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdW1heCA6IEFkdlNJTURfMlZlY3RvckFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZtYXggOiBBZHZTSU1EXzJGbG9hdEFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZtYXhubXAgOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBNYXggQWNyb3NzIExhbmVzCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NtYXh2IDogQWR2U0lNRF8xVmVjdG9yQXJnX0ludF9BY3Jvc3NfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl91bWF4diA6IEFkdlNJTURfMVZlY3RvckFyZ19JbnRfQWNyb3NzX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fZm1heHYgOiBBZHZTSU1EXzFWZWN0b3JBcmdfRmxvYXRfQWNyb3NzX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fZm1heG5tdiA6IEFkdlNJTURfMVZlY3RvckFyZ19GbG9hdF9BY3Jvc3NfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBNaW4KKyAgZGVmIGludF9hYXJjaDY0X25lb25fc21pbiA6IEFkdlNJTURfMlZlY3RvckFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VtaW4gOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mbWluIDogQWR2U0lNRF8yRmxvYXRBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mbWlubm1wIDogQWR2U0lNRF8yVmVjdG9yQXJnX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgTWluL01heCBOdW1iZXIKKyAgZGVmIGludF9hYXJjaDY0X25lb25fZm1pbm5tIDogQWR2U0lNRF8yRmxvYXRBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mbWF4bm0gOiBBZHZTSU1EXzJGbG9hdEFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIE1pbiBBY3Jvc3MgTGFuZXMKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc21pbnYgOiBBZHZTSU1EXzFWZWN0b3JBcmdfSW50X0Fjcm9zc19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VtaW52IDogQWR2U0lNRF8xVmVjdG9yQXJnX0ludF9BY3Jvc3NfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mbWludiA6IEFkdlNJTURfMVZlY3RvckFyZ19GbG9hdF9BY3Jvc3NfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mbWlubm12IDogQWR2U0lNRF8xVmVjdG9yQXJnX0Zsb2F0X0Fjcm9zc19JbnRyaW5zaWM7CisKKyAgLy8gUGFpcndpc2UgQWRkCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2FkZHAgOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworCisgIC8vIExvbmcgUGFpcndpc2UgQWRkCisgIC8vIEZJWE1FOiBJbiB0aGVvcnksIHdlIHNob3VsZG4ndCBuZWVkIGludHJpbnNpY3MgZm9yIHNhZGRscCBvcgorICAvLyB1YWRkbHAsIGJ1dCB0YmxnZW4ncyB0eXBlIGluZmVyZW5jZSBjdXJyZW50bHkgY2FuJ3QgaGFuZGxlIHRoZQorICAvLyBwYXR0ZXJuIGZyYWdtZW50cyB0aGlzIGVuZHMgdXAgZ2VuZXJhdGluZy4KKyAgZGVmIGludF9hYXJjaDY0X25lb25fc2FkZGxwIDogQWR2U0lNRF8xVmVjdG9yQXJnX0V4cGFuZF9JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VhZGRscCA6IEFkdlNJTURfMVZlY3RvckFyZ19FeHBhbmRfSW50cmluc2ljOworCisgIC8vIEZvbGRpbmcgTWF4aW11bQorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zbWF4cCA6IEFkdlNJTURfMlZlY3RvckFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VtYXhwIDogQWR2U0lNRF8yVmVjdG9yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fZm1heHAgOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworCisgIC8vIEZvbGRpbmcgTWluaW11bQorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zbWlucCA6IEFkdlNJTURfMlZlY3RvckFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VtaW5wIDogQWR2U0lNRF8yVmVjdG9yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fZm1pbnAgOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworCisgIC8vIFJlY2lwcm9jYWwgRXN0aW1hdGUvU3RlcAorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mcmVjcHMgOiBBZHZTSU1EXzJGbG9hdEFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2Zyc3FydHMgOiBBZHZTSU1EXzJGbG9hdEFyZ19JbnRyaW5zaWM7CisKKyAgLy8gUmVjaXByb2NhbCBFeHBvbmVudAorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mcmVjcHggOiBBZHZTSU1EXzFGbG9hdEFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFNhdHVyYXRpbmcgU2hpZnQgTGVmdAorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zcXNobCA6IEFkdlNJTURfMkludEFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3Vxc2hsIDogQWR2U0lNRF8ySW50QXJnX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgUm91bmRpbmcgU2hpZnQgTGVmdAorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zcnNobCA6IEFkdlNJTURfMkludEFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3Vyc2hsIDogQWR2U0lNRF8ySW50QXJnX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgU2F0dXJhdGluZyBSb3VuZGluZyBTaGlmdCBMZWZ0CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NxcnNobCA6IEFkdlNJTURfMkludEFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VxcnNobCA6IEFkdlNJTURfMkludEFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFNpZ25lZC0+VW5zaWduZWQgU2hpZnQgTGVmdCBieSBDb25zdGFudAorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zcXNobHUgOiBBZHZTSU1EXzJJbnRBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBTaWduZWQtPlVuc2lnbmVkIE5hcnJvd2luZyBTYXR1cmF0aW5nIFNoaWZ0IFJpZ2h0IGJ5IENvbnN0YW50CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3Nxc2hydW4gOiBBZHZTSU1EXzJBcmdfU2NhbGFyX05hcnJvd19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFNpZ25lZC0+VW5zaWduZWQgUm91bmRpbmcgTmFycm93aW5nIFNhdHVyYXRpbmcgU2hpZnQgUmlnaHQgYnkgQ29uc3QKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc3Fyc2hydW4gOiBBZHZTSU1EXzJBcmdfU2NhbGFyX05hcnJvd19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIE5hcnJvd2luZyBTaGlmdCBSaWdodCBieSBDb25zdGFudAorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zcXNocm4gOiBBZHZTSU1EXzJBcmdfU2NhbGFyX05hcnJvd19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3Vxc2hybiA6IEFkdlNJTURfMkFyZ19TY2FsYXJfTmFycm93X0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgUm91bmRpbmcgTmFycm93aW5nIFNoaWZ0IFJpZ2h0IGJ5IENvbnN0YW50CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3JzaHJuIDogQWR2U0lNRF8yQXJnX1NjYWxhcl9OYXJyb3dfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBSb3VuZGluZyBOYXJyb3dpbmcgU2F0dXJhdGluZyBTaGlmdCBSaWdodCBieSBDb25zdGFudAorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zcXJzaHJuIDogQWR2U0lNRF8yQXJnX1NjYWxhcl9OYXJyb3dfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl91cXJzaHJuIDogQWR2U0lNRF8yQXJnX1NjYWxhcl9OYXJyb3dfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBTaGlmdCBMZWZ0CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NzaGwgOiBBZHZTSU1EXzJJbnRBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl91c2hsIDogQWR2U0lNRF8ySW50QXJnX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgV2lkZW5pbmcgU2hpZnQgTGVmdCBieSBDb25zdGFudAorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zaGxsIDogQWR2U0lNRF8yVmVjdG9yQXJnX1NjYWxhcl9XaWRlX0J5U2l6ZV9JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NzaGxsIDogQWR2U0lNRF8yVmVjdG9yQXJnX1NjYWxhcl9XaWRlX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdXNobGwgOiBBZHZTSU1EXzJWZWN0b3JBcmdfU2NhbGFyX1dpZGVfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBTaGlmdCBSaWdodCBieSBDb25zdGFudCBhbmQgSW5zZXJ0CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3ZzcmkgOiBBZHZTSU1EXzNWZWN0b3JBcmdfU2NhbGFyX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgU2hpZnQgTGVmdCBieSBDb25zdGFudCBhbmQgSW5zZXJ0CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3ZzbGkgOiBBZHZTSU1EXzNWZWN0b3JBcmdfU2NhbGFyX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgU2F0dXJhdGluZyBOYXJyb3cKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc2NhbGFyX3NxeHRuOiBBZHZTSU1EXzFJbnRBcmdfTmFycm93X0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc2NhbGFyX3VxeHRuIDogQWR2U0lNRF8xSW50QXJnX05hcnJvd19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NxeHRuIDogQWR2U0lNRF8xVmVjdG9yQXJnX05hcnJvd19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VxeHRuIDogQWR2U0lNRF8xVmVjdG9yQXJnX05hcnJvd19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFNhdHVyYXRpbmcgRXh0cmFjdCBhbmQgVW5zaWduZWQgTmFycm93CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NjYWxhcl9zcXh0dW4gOiBBZHZTSU1EXzFJbnRBcmdfTmFycm93X0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc3F4dHVuIDogQWR2U0lNRF8xVmVjdG9yQXJnX05hcnJvd19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIEFic29sdXRlIFZhbHVlCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2FicyA6IEFkdlNJTURfMUFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFNhdHVyYXRpbmcgQWJzb2x1dGUgVmFsdWUKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc3FhYnMgOiBBZHZTSU1EXzFJbnRBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBTYXR1cmF0aW5nIE5lZ2F0aW9uCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NxbmVnIDogQWR2U0lNRF8xSW50QXJnX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgQ291bnQgTGVhZGluZyBTaWduIEJpdHMKKyAgZGVmIGludF9hYXJjaDY0X25lb25fY2xzIDogQWR2U0lNRF8xVmVjdG9yQXJnX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgUmVjaXByb2NhbCBFc3RpbWF0ZQorICBkZWYgaW50X2FhcmNoNjRfbmVvbl91cmVjcGUgOiBBZHZTSU1EXzFWZWN0b3JBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mcmVjcGUgOiBBZHZTSU1EXzFGbG9hdEFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFNxdWFyZSBSb290IEVzdGltYXRlCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3Vyc3FydGUgOiBBZHZTSU1EXzFWZWN0b3JBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mcnNxcnRlIDogQWR2U0lNRF8xRmxvYXRBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBCaXR3aXNlIFJldmVyc2UKKyAgZGVmIGludF9hYXJjaDY0X25lb25fcmJpdCA6IEFkdlNJTURfMVZlY3RvckFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIENvbnZlcnNpb25zIEJldHdlZW4gSGFsZi1QcmVjaXNpb24gYW5kIFNpbmdsZS1QcmVjaXNpb24uCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3ZjdnRmcDJoZgorICAgIDogSW50cmluc2ljPFtsbHZtX3Y0aTE2X3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3ZjdnRoZjJmcAorICAgIDogSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRpMTZfdHldLCBbSW50ck5vTWVtXT47CisKKyAgLy8gVmVjdG9yIENvbnZlcnNpb25zIEJldHdlZW4gRmxvYXRpbmctcG9pbnQgYW5kIEZpeGVkLXBvaW50LgorICBkZWYgaW50X2FhcmNoNjRfbmVvbl92Y3Z0ZnAyZnhzIDogQWR2U0lNRF9DdnRGUFRvRnhfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl92Y3Z0ZnAyZnh1IDogQWR2U0lNRF9DdnRGUFRvRnhfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl92Y3Z0ZnhzMmZwIDogQWR2U0lNRF9DdnRGeFRvRlBfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl92Y3Z0Znh1MmZwIDogQWR2U0lNRF9DdnRGeFRvRlBfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBGUC0+SW50IENvbnZlcnNpb25zCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZjdnRhcyA6IEFkdlNJTURfRlBUb0ludFJvdW5kaW5nX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fZmN2dGF1IDogQWR2U0lNRF9GUFRvSW50Um91bmRpbmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mY3Z0bXMgOiBBZHZTSU1EX0ZQVG9JbnRSb3VuZGluZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZjdnRtdSA6IEFkdlNJTURfRlBUb0ludFJvdW5kaW5nX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fZmN2dG5zIDogQWR2U0lNRF9GUFRvSW50Um91bmRpbmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mY3Z0bnUgOiBBZHZTSU1EX0ZQVG9JbnRSb3VuZGluZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZjdnRwcyA6IEFkdlNJTURfRlBUb0ludFJvdW5kaW5nX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fZmN2dHB1IDogQWR2U0lNRF9GUFRvSW50Um91bmRpbmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mY3Z0enMgOiBBZHZTSU1EX0ZQVG9JbnRSb3VuZGluZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZjdnR6dSA6IEFkdlNJTURfRlBUb0ludFJvdW5kaW5nX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgRlAgUm91bmRpbmc6IG9ubHkgdGllcyB0byBldmVuIGlzIHVucmVwcmVzZW50ZWQgYnkgYSBub3JtYWwKKyAgLy8gaW50cmluc2ljLgorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mcmludG4gOiBBZHZTSU1EXzFGbG9hdEFyZ19JbnRyaW5zaWM7CisKKyAgLy8gU2NhbGFyIEZQLT5JbnQgY29udmVyc2lvbnMKKworICAvLyBWZWN0b3IgRlAgSW5leGFjdCBOYXJyb3dpbmcKKyAgZGVmIGludF9hYXJjaDY0X25lb25fZmN2dHhuIDogQWR2U0lNRF8xVmVjdG9yQXJnX0V4cGFuZF9JbnRyaW5zaWM7CisKKyAgLy8gU2NhbGFyIEZQIEluZXhhY3QgTmFycm93aW5nCisgIGRlZiBpbnRfYWFyY2g2NF9zaXNkX2ZjdnR4biA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2RvdWJsZV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCitsZXQgVGFyZ2V0UHJlZml4ID0gImFhcmNoNjQiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0uYWFyY2g2NC4iLgorICBjbGFzcyBBZHZTSU1EXzJWZWN0b3IySW5kZXhfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICBbbGx2bV9hbnl2ZWN0b3JfdHksIGxsdm1faTY0X3R5LCBMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCisvLyBWZWN0b3IgZWxlbWVudCB0byBlbGVtZW50IG1vdmVzCitkZWYgaW50X2FhcmNoNjRfbmVvbl92Y29weV9sYW5lOiBBZHZTSU1EXzJWZWN0b3IySW5kZXhfSW50cmluc2ljOworCitsZXQgVGFyZ2V0UHJlZml4ID0gImFhcmNoNjQiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0uYWFyY2g2NC4iLgorICBjbGFzcyBBZHZTSU1EXzFWZWNfTG9hZF9JbnRyaW5zaWMKKyAgICAgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sIFtMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj5dLAorICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBjbGFzcyBBZHZTSU1EXzFWZWNfU3RvcmVfTGFuZV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbXSwgW2xsdm1fYW55dmVjdG9yX3R5LCBsbHZtX2k2NF90eSwgbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDI+XT47CisKKyAgY2xhc3MgQWR2U0lNRF8yVmVjX0xvYWRfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbTExWTUFueVBvaW50ZXJUeXBlPExMVk1NYXRjaFR5cGU8MD4+XSwKKyAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGNsYXNzIEFkdlNJTURfMlZlY19Mb2FkX0xhbmVfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHksIGxsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGNsYXNzIEFkdlNJTURfMlZlY19TdG9yZV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbXSwgW2xsdm1fYW55dmVjdG9yX3R5LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgTExWTUFueVBvaW50ZXJUeXBlPExMVk1NYXRjaFR5cGU8MD4+XSwKKyAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwyPl0+OworICBjbGFzcyBBZHZTSU1EXzJWZWNfU3RvcmVfTGFuZV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbXSwgW2xsdm1fYW55dmVjdG9yX3R5LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDM+XT47CisKKyAgY2xhc3MgQWR2U0lNRF8zVmVjX0xvYWRfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5LCBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbTExWTUFueVBvaW50ZXJUeXBlPExMVk1NYXRjaFR5cGU8MD4+XSwKKyAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGNsYXNzIEFkdlNJTURfM1ZlY19Mb2FkX0xhbmVfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5LCBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHksIGxsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGNsYXNzIEFkdlNJTURfM1ZlY19TdG9yZV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbXSwgW2xsdm1fYW55dmVjdG9yX3R5LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPiwgTExWTUFueVBvaW50ZXJUeXBlPExMVk1NYXRjaFR5cGU8MD4+XSwKKyAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwzPl0+OworICBjbGFzcyBBZHZTSU1EXzNWZWNfU3RvcmVfTGFuZV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbXSwgW2xsdm1fYW55dmVjdG9yX3R5LAorICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDQ+XT47CisKKyAgY2xhc3MgQWR2U0lNRF80VmVjX0xvYWRfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbTExWTUFueVBvaW50ZXJUeXBlPExMVk1NYXRjaFR5cGU8MD4+XSwKKyAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGNsYXNzIEFkdlNJTURfNFZlY19Mb2FkX0xhbmVfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHksIGxsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGNsYXNzIEFkdlNJTURfNFZlY19TdG9yZV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbXSwgW2xsdm1fYW55dmVjdG9yX3R5LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICBMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj5dLAorICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDQ+XT47CisgIGNsYXNzIEFkdlNJTURfNFZlY19TdG9yZV9MYW5lX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtdLCBbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5LCBsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8NT5dPjsKK30KKworLy8gTWVtb3J5IG9wcworCitkZWYgaW50X2FhcmNoNjRfbmVvbl9sZDF4MiA6IEFkdlNJTURfMlZlY19Mb2FkX0ludHJpbnNpYzsKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX2xkMXgzIDogQWR2U0lNRF8zVmVjX0xvYWRfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X25lb25fbGQxeDQgOiBBZHZTSU1EXzRWZWNfTG9hZF9JbnRyaW5zaWM7CisKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX3N0MXgyIDogQWR2U0lNRF8yVmVjX1N0b3JlX0ludHJpbnNpYzsKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX3N0MXgzIDogQWR2U0lNRF8zVmVjX1N0b3JlX0ludHJpbnNpYzsKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX3N0MXg0IDogQWR2U0lNRF80VmVjX1N0b3JlX0ludHJpbnNpYzsKKworZGVmIGludF9hYXJjaDY0X25lb25fbGQyIDogQWR2U0lNRF8yVmVjX0xvYWRfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X25lb25fbGQzIDogQWR2U0lNRF8zVmVjX0xvYWRfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X25lb25fbGQ0IDogQWR2U0lNRF80VmVjX0xvYWRfSW50cmluc2ljOworCitkZWYgaW50X2FhcmNoNjRfbmVvbl9sZDJsYW5lIDogQWR2U0lNRF8yVmVjX0xvYWRfTGFuZV9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfbmVvbl9sZDNsYW5lIDogQWR2U0lNRF8zVmVjX0xvYWRfTGFuZV9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfbmVvbl9sZDRsYW5lIDogQWR2U0lNRF80VmVjX0xvYWRfTGFuZV9JbnRyaW5zaWM7CisKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX2xkMnIgOiBBZHZTSU1EXzJWZWNfTG9hZF9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfbmVvbl9sZDNyIDogQWR2U0lNRF8zVmVjX0xvYWRfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X25lb25fbGQ0ciA6IEFkdlNJTURfNFZlY19Mb2FkX0ludHJpbnNpYzsKKworZGVmIGludF9hYXJjaDY0X25lb25fc3QyICA6IEFkdlNJTURfMlZlY19TdG9yZV9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfbmVvbl9zdDMgIDogQWR2U0lNRF8zVmVjX1N0b3JlX0ludHJpbnNpYzsKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX3N0NCAgOiBBZHZTSU1EXzRWZWNfU3RvcmVfSW50cmluc2ljOworCitkZWYgaW50X2FhcmNoNjRfbmVvbl9zdDJsYW5lICA6IEFkdlNJTURfMlZlY19TdG9yZV9MYW5lX0ludHJpbnNpYzsKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX3N0M2xhbmUgIDogQWR2U0lNRF8zVmVjX1N0b3JlX0xhbmVfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X25lb25fc3Q0bGFuZSAgOiBBZHZTSU1EXzRWZWNfU3RvcmVfTGFuZV9JbnRyaW5zaWM7CisKK2xldCBUYXJnZXRQcmVmaXggPSAiYWFyY2g2NCIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS5hYXJjaDY0LiIuCisgIGNsYXNzIEFkdlNJTURfVGJsMV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLCBbbGx2bV92MTZpOF90eSwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EX1RibDJfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgTExWTU1hdGNoVHlwZTwwPl0sIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF9UYmwzX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF9UYmw0X0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBjbGFzcyBBZHZTSU1EX1RieDFfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgbGx2bV92MTZpOF90eSwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EX1RieDJfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EX1RieDNfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgbGx2bV92MTZpOF90eSwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EX1RieDRfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworfQorZGVmIGludF9hYXJjaDY0X25lb25fdGJsMSA6IEFkdlNJTURfVGJsMV9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfbmVvbl90YmwyIDogQWR2U0lNRF9UYmwyX0ludHJpbnNpYzsKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX3RibDMgOiBBZHZTSU1EX1RibDNfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X25lb25fdGJsNCA6IEFkdlNJTURfVGJsNF9JbnRyaW5zaWM7CisKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX3RieDEgOiBBZHZTSU1EX1RieDFfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X25lb25fdGJ4MiA6IEFkdlNJTURfVGJ4Ml9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfbmVvbl90YngzIDogQWR2U0lNRF9UYngzX0ludHJpbnNpYzsKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX3RieDQgOiBBZHZTSU1EX1RieDRfSW50cmluc2ljOworCitsZXQgVGFyZ2V0UHJlZml4ID0gImFhcmNoNjQiIGluIHsKKyAgY2xhc3MgQ3J5cHRvX0FFU19EYXRhS2V5X0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgY2xhc3MgQ3J5cHRvX0FFU19EYXRhX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgLy8gU0hBIGludHJpbnNpYyB0YWtpbmcgNSB3b3JkcyBvZiB0aGUgaGFzaCAodjRpMzIsIGkzMikgYW5kIDQgb2YgdGhlIHNjaGVkdWxlCisgIC8vICh2NGkzMikuCisgIGNsYXNzIENyeXB0b19TSEFfNUhhc2g0U2NoZWR1bGVfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICAvLyBTSEEgaW50cmluc2ljIHRha2luZyA1IHdvcmRzIG9mIHRoZSBoYXNoICh2NGkzMiwgaTMyKSBhbmQgNCBvZiB0aGUgc2NoZWR1bGUKKyAgLy8gKHY0aTMyKS4KKyAgY2xhc3MgQ3J5cHRvX1NIQV8xSGFzaF9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgLy8gU0hBIGludHJpbnNpYyB0YWtpbmcgOCB3b3JkcyBvZiB0aGUgc2NoZWR1bGUKKyAgY2xhc3MgQ3J5cHRvX1NIQV84U2NoZWR1bGVfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICAvLyBTSEEgaW50cmluc2ljIHRha2luZyAxMiB3b3JkcyBvZiB0aGUgc2NoZWR1bGUKKyAgY2xhc3MgQ3J5cHRvX1NIQV8xMlNjaGVkdWxlX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICAvLyBTSEEgaW50cmluc2ljIHRha2luZyA4IHdvcmRzIG9mIHRoZSBoYXNoIGFuZCA0IG9mIHRoZSBzY2hlZHVsZS4KKyAgY2xhc3MgQ3J5cHRvX1NIQV84SGFzaDRTY2hlZHVsZV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKy8vIEFFUworZGVmIGludF9hYXJjaDY0X2NyeXB0b19hZXNlICAgOiBDcnlwdG9fQUVTX0RhdGFLZXlfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X2NyeXB0b19hZXNkICAgOiBDcnlwdG9fQUVTX0RhdGFLZXlfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X2NyeXB0b19hZXNtYyAgOiBDcnlwdG9fQUVTX0RhdGFfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X2NyeXB0b19hZXNpbWMgOiBDcnlwdG9fQUVTX0RhdGFfSW50cmluc2ljOworCisvLyBTSEExCitkZWYgaW50X2FhcmNoNjRfY3J5cHRvX3NoYTFjICA6IENyeXB0b19TSEFfNUhhc2g0U2NoZWR1bGVfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X2NyeXB0b19zaGExcCAgOiBDcnlwdG9fU0hBXzVIYXNoNFNjaGVkdWxlX0ludHJpbnNpYzsKK2RlZiBpbnRfYWFyY2g2NF9jcnlwdG9fc2hhMW0gIDogQ3J5cHRvX1NIQV81SGFzaDRTY2hlZHVsZV9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfY3J5cHRvX3NoYTFoICA6IENyeXB0b19TSEFfMUhhc2hfSW50cmluc2ljOworCitkZWYgaW50X2FhcmNoNjRfY3J5cHRvX3NoYTFzdTAgOiBDcnlwdG9fU0hBXzEyU2NoZWR1bGVfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X2NyeXB0b19zaGExc3UxIDogQ3J5cHRvX1NIQV84U2NoZWR1bGVfSW50cmluc2ljOworCisvLyBTSEEyNTYKK2RlZiBpbnRfYWFyY2g2NF9jcnlwdG9fc2hhMjU2aCAgIDogQ3J5cHRvX1NIQV84SGFzaDRTY2hlZHVsZV9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfY3J5cHRvX3NoYTI1NmgyICA6IENyeXB0b19TSEFfOEhhc2g0U2NoZWR1bGVfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X2NyeXB0b19zaGEyNTZzdTAgOiBDcnlwdG9fU0hBXzhTY2hlZHVsZV9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfY3J5cHRvX3NoYTI1NnN1MSA6IENyeXB0b19TSEFfMTJTY2hlZHVsZV9JbnRyaW5zaWM7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDUkMzMgorCitsZXQgVGFyZ2V0UHJlZml4ID0gImFhcmNoNjQiIGluIHsKKworZGVmIGludF9hYXJjaDY0X2NyYzMyYiAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hYXJjaDY0X2NyYzMyY2IgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hYXJjaDY0X2NyYzMyaCAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hYXJjaDY0X2NyYzMyY2ggOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hYXJjaDY0X2NyYzMydyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hYXJjaDY0X2NyYzMyY3cgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hYXJjaDY0X2NyYzMyeCAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sCisgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hYXJjaDY0X2NyYzMyY3ggOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sCisgICAgW0ludHJOb01lbV0+OworfQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzQU1ER1BVLnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzQU1ER1BVLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwOGFiMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NBTURHUFUudGQKQEAgLTAsMCArMSw5MjIgQEAKKy8vPT09LSBJbnRyaW5zaWNzQU1ER1BVLnRkIC0gRGVmaW5lcyBBTURHUFUgaW50cmluc2ljcyAtLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYWxsIG9mIHRoZSBSNjAwLXNwZWNpZmljIGludHJpbnNpY3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgQU1ER1BVUmVhZFByZWxvYWRSZWdpc3RlckludHJpbnNpYworICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0+OworCitjbGFzcyBBTURHUFVSZWFkUHJlbG9hZFJlZ2lzdGVySW50cmluc2ljTmFtZWQ8c3RyaW5nIG5hbWU+CisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXT4sIEdDQ0J1aWx0aW48bmFtZT47CisKK2xldCBUYXJnZXRQcmVmaXggPSAicjYwMCIgaW4geworCittdWx0aWNsYXNzIEFNREdQVVJlYWRQcmVsb2FkUmVnaXN0ZXJJbnRyaW5zaWNfeHl6IHsKKyAgZGVmIF94IDogQU1ER1BVUmVhZFByZWxvYWRSZWdpc3RlckludHJpbnNpYzsKKyAgZGVmIF95IDogQU1ER1BVUmVhZFByZWxvYWRSZWdpc3RlckludHJpbnNpYzsKKyAgZGVmIF96IDogQU1ER1BVUmVhZFByZWxvYWRSZWdpc3RlckludHJpbnNpYzsKK30KKworbXVsdGljbGFzcyBBTURHUFVSZWFkUHJlbG9hZFJlZ2lzdGVySW50cmluc2ljX3h5el9uYW1lZDxzdHJpbmcgcHJlZml4PiB7CisgIGRlZiBfeCA6IEFNREdQVVJlYWRQcmVsb2FkUmVnaXN0ZXJJbnRyaW5zaWNOYW1lZDwhc3RyY29uY2F0KHByZWZpeCwgIl94Iik+OworICBkZWYgX3kgOiBBTURHUFVSZWFkUHJlbG9hZFJlZ2lzdGVySW50cmluc2ljTmFtZWQ8IXN0cmNvbmNhdChwcmVmaXgsICJfeSIpPjsKKyAgZGVmIF96IDogQU1ER1BVUmVhZFByZWxvYWRSZWdpc3RlckludHJpbnNpY05hbWVkPCFzdHJjb25jYXQocHJlZml4LCAiX3oiKT47Cit9CisKK2RlZm0gaW50X3I2MDBfcmVhZF9nbG9iYWxfc2l6ZSA6IEFNREdQVVJlYWRQcmVsb2FkUmVnaXN0ZXJJbnRyaW5zaWNfeHl6X25hbWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Il9fYnVpbHRpbl9yNjAwX3JlYWRfZ2xvYmFsX3NpemUiPjsKK2RlZm0gaW50X3I2MDBfcmVhZF9uZ3JvdXBzIDogQU1ER1BVUmVhZFByZWxvYWRSZWdpc3RlckludHJpbnNpY194eXpfbmFtZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCJfX2J1aWx0aW5fcjYwMF9yZWFkX25ncm91cHMiPjsKK2RlZm0gaW50X3I2MDBfcmVhZF90Z2lkIDogQU1ER1BVUmVhZFByZWxvYWRSZWdpc3RlckludHJpbnNpY194eXpfbmFtZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPCJfX2J1aWx0aW5fcjYwMF9yZWFkX3RnaWQiPjsKKworZGVmbSBpbnRfcjYwMF9yZWFkX2xvY2FsX3NpemUgOiBBTURHUFVSZWFkUHJlbG9hZFJlZ2lzdGVySW50cmluc2ljX3h5ejsKK2RlZm0gaW50X3I2MDBfcmVhZF90aWRpZyA6IEFNREdQVVJlYWRQcmVsb2FkUmVnaXN0ZXJJbnRyaW5zaWNfeHl6OworCitkZWYgaW50X3I2MDBfZ3JvdXBfYmFycmllciA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9yNjAwX2dyb3VwX2JhcnJpZXIiPiwKKyAgSW50cmluc2ljPFtdLCBbXSwgW0ludHJDb252ZXJnZW50XT47CisKKy8vIEFTIDcgaXMgUEFSQU1fSV9BRERSRVNTLCB1c2VkIGZvciBrZXJuZWwgYXJndW1lbnRzCitkZWYgaW50X3I2MDBfaW1wbGljaXRhcmdfcHRyIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX3I2MDBfaW1wbGljaXRhcmdfcHRyIj4sCisgIEludHJpbnNpYzxbTExWTVF1YWxQb2ludGVyVHlwZTxsbHZtX2k4X3R5LCA3Pl0sIFtdLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXT47CisKK2RlZiBpbnRfcjYwMF9yYXRfc3RvcmVfdHlwZWQgOgorICAvLyAxc3QgcGFyYW1ldGVyOiBEYXRhCisgIC8vIDJuZCBwYXJhbWV0ZXI6IEluZGV4CisgIC8vIDNyZCBwYXJhbWV0ZXI6IENvbnN0YW50IFJBVCBJRAorICBJbnRyaW5zaWM8W10sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPiwKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX3I2MDBfcmF0X3N0b3JlX3R5cGVkIj47CisKK2RlZiBpbnRfcjYwMF9yZWNpcHNxcnRfaWVlZSA6ICBJbnRyaW5zaWM8CisgIFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dLCBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9yNjAwX3JlY2lwc3FydF9jbGFtcGVkIDogSW50cmluc2ljPAorICBbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XSwgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfcjYwMF9jdWJlIDogSW50cmluc2ljPAorICBbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK30gLy8gRW5kIFRhcmdldFByZWZpeCA9ICJyNjAwIgorCitsZXQgVGFyZ2V0UHJlZml4ID0gImFtZGdjbiIgaW4geworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQUJJIFNwZWNpYWwgSW50cmluc2ljcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmbSBpbnRfYW1kZ2NuX3dvcmtpdGVtX2lkIDogQU1ER1BVUmVhZFByZWxvYWRSZWdpc3RlckludHJpbnNpY194eXo7CitkZWZtIGludF9hbWRnY25fd29ya2dyb3VwX2lkIDogQU1ER1BVUmVhZFByZWxvYWRSZWdpc3RlckludHJpbnNpY194eXpfbmFtZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Il9fYnVpbHRpbl9hbWRnY25fd29ya2dyb3VwX2lkIj47CisKK2RlZiBpbnRfYW1kZ2NuX2Rpc3BhdGNoX3B0ciA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fZGlzcGF0Y2hfcHRyIj4sCisgIEludHJpbnNpYzxbTExWTVF1YWxQb2ludGVyVHlwZTxsbHZtX2k4X3R5LCA0Pl0sIFtdLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXT47CisKK2RlZiBpbnRfYW1kZ2NuX3F1ZXVlX3B0ciA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fcXVldWVfcHRyIj4sCisgIEludHJpbnNpYzxbTExWTVF1YWxQb2ludGVyVHlwZTxsbHZtX2k4X3R5LCA0Pl0sIFtdLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXT47CisKK2RlZiBpbnRfYW1kZ2NuX2tlcm5hcmdfc2VnbWVudF9wdHIgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX2tlcm5hcmdfc2VnbWVudF9wdHIiPiwKKyAgSW50cmluc2ljPFtMTFZNUXVhbFBvaW50ZXJUeXBlPGxsdm1faThfdHksIDQ+XSwgW10sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdPjsKKworZGVmIGludF9hbWRnY25faW1wbGljaXRhcmdfcHRyIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9pbXBsaWNpdGFyZ19wdHIiPiwKKyAgSW50cmluc2ljPFtMTFZNUXVhbFBvaW50ZXJUeXBlPGxsdm1faThfdHksIDQ+XSwgW10sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdPjsKKworZGVmIGludF9hbWRnY25fZ3JvdXBzdGF0aWNzaXplIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9ncm91cHN0YXRpY3NpemUiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXT47CisKK2RlZiBpbnRfYW1kZ2NuX2Rpc3BhdGNoX2lkIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9kaXNwYXRjaF9pZCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW10sIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdPjsKKworZGVmIGludF9hbWRnY25faW1wbGljaXRfYnVmZmVyX3B0ciA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25faW1wbGljaXRfYnVmZmVyX3B0ciI+LAorICBJbnRyaW5zaWM8W0xMVk1RdWFsUG9pbnRlclR5cGU8bGx2bV9pOF90eSwgND5dLCBbXSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0+OworCisvLyBTZXQgRVhFQyB0byB0aGUgNjQtYml0IHZhbHVlIGdpdmVuLgorLy8gVGhpcyBpcyBhbHdheXMgbW92ZWQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYmFzaWMgYmxvY2suCitkZWYgaW50X2FtZGdjbl9pbml0X2V4ZWMgOiBJbnRyaW5zaWM8W10sCisgIFtsbHZtX2k2NF90eV0sICAgICAgLy8gNjQtYml0IGxpdGVyYWwgY29uc3RhbnQKKyAgW0ludHJDb252ZXJnZW50XT47CisKKy8vIFNldCBFWEVDIGFjY29yZGluZyB0byBhIHRocmVhZCBjb3VudCBwYWNrZWQgaW4gYW4gU0dQUiBpbnB1dDoKKy8vICAgIHRocmVhZF9jb3VudCA9IChpbnB1dCA+PiBiaXRvZmZzZXQpICYgMHg3ZjsKKy8vIFRoaXMgaXMgYWx3YXlzIG1vdmVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJhc2ljIGJsb2NrLgorZGVmIGludF9hbWRnY25faW5pdF9leGVjX2Zyb21faW5wdXQgOiBJbnRyaW5zaWM8W10sCisgIFtsbHZtX2kzMl90eSwgICAgICAgLy8gMzItYml0IFNHUFIgaW5wdXQKKyAgIGxsdm1faTMyX3R5XSwgICAgICAvLyBiaXQgb2Zmc2V0IG9mIHRoZSB0aHJlYWQgY291bnQKKyAgW0ludHJDb252ZXJnZW50XT47CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIEludHJpbnNpY3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgc19zZW5kbXNnIGltbWVkaWF0ZSAoaTE2KSwKKy8vIHRoZSBzZWNvbmQgb25lIGlzIGNvcGllZCB0byBtMAorZGVmIGludF9hbWRnY25fc19zZW5kbXNnIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9zX3NlbmRtc2ciPiwKKyAgSW50cmluc2ljIDxbXSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKK2RlZiBpbnRfYW1kZ2NuX3Nfc2VuZG1zZ2hhbHQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3Nfc2VuZG1zZ2hhbHQiPiwKKyAgSW50cmluc2ljIDxbXSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKworZGVmIGludF9hbWRnY25fc19iYXJyaWVyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9zX2JhcnJpZXIiPiwKKyAgSW50cmluc2ljPFtdLCBbXSwgW0ludHJDb252ZXJnZW50XT47CisKK2RlZiBpbnRfYW1kZ2NuX3dhdmVfYmFycmllciA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fd2F2ZV9iYXJyaWVyIj4sCisgIEludHJpbnNpYzxbXSwgW10sIFtJbnRyQ29udmVyZ2VudF0+OworCitkZWYgaW50X2FtZGdjbl9zX3dhaXRjbnQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3Nfd2FpdGNudCI+LAorICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0sIFtdPjsKKworZGVmIGludF9hbWRnY25fZGl2X3NjYWxlIDogSW50cmluc2ljPAorICAvLyAxc3QgcGFyYW1ldGVyOiBOdW1lcmF0b3IKKyAgLy8gMm5kIHBhcmFtZXRlcjogRGVub21pbmF0b3IKKyAgLy8gM3JkIHBhcmFtZXRlcjogQ29uc3RhbnQgdG8gc2VsZWN0IHNlbGVjdCBiZXR3ZWVuIGZpcnN0IGFuZAorICAvLyAgICAgICAgICAgICAgICBzZWNvbmQuICgwID0gZmlyc3QsIDEgPSBzZWNvbmQpLgorICBbbGx2bV9hbnlmbG9hdF90eSwgbGx2bV9pMV90eV0sCisgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX2kxX3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2Rpdl9mbWFzIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwKKyAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD4sIGxsdm1faTFfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fZGl2X2ZpeHVwIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwKKyAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fdHJpZ19wcmVvcCA6IEludHJpbnNpYzwKKyAgW2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9pMzJfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fc2luIDogSW50cmluc2ljPAorICBbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2NvcyA6IEludHJpbnNpYzwKKyAgW2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0sIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9sb2dfY2xhbXAgOiBJbnRyaW5zaWM8CisgIFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dLCBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fZm11bF9sZWdhY3kgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX2ZtdWxfbGVnYWN5Ij4sCisgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX3JjcCA6IEludHJpbnNpYzwKKyAgW2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0sIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9yY3BfbGVnYWN5IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9yY3BfbGVnYWN5Ij4sCisgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX3JzcSA6ICBJbnRyaW5zaWM8CisgIFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dLCBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fcnNxX2xlZ2FjeSA6ICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3JzcV9sZWdhY3kiPiwKKyAgSW50cmluc2ljPAorICBbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX3JzcV9jbGFtcCA6IEludHJpbnNpYzwKKyAgW2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0sIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdPjsKKworZGVmIGludF9hbWRnY25fbGRleHAgOiBJbnRyaW5zaWM8CisgIFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD4sIGxsdm1faTMyX3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2ZyZXhwX21hbnQgOiBJbnRyaW5zaWM8CisgIFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dLCBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fZnJleHBfZXhwIDogSW50cmluc2ljPAorICBbbGx2bV9hbnlpbnRfdHldLCBbbGx2bV9hbnlmbG9hdF90eV0sIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCisvLyB2X2ZyYWN0IGlzIGJ1Z2d5IG9uIFNJL0NJLiBJdCBtaXNoYW5kbGVzIGluZmluaXRpZXMsIG1heSByZXR1cm4gMS4wCisvLyBhbmQgYWx3YXlzIHVzZXMgcnR6LCBzbyBpcyBub3Qgc3VpdGFibGUgZm9yIGltcGxlbWVudGluZyB0aGUgT3BlbkNMCisvLyBmcmFjdCBmdW5jdGlvbi4gSXQgc2hvdWxkIGJlIG9rIG9uIFZJLgorZGVmIGludF9hbWRnY25fZnJhY3QgOiBJbnRyaW5zaWM8CisgIFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dLCBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fY3Z0X3BrcnR6IDogSW50cmluc2ljPAorICBbbGx2bV92MmYxNl90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2N2dF9wa25vcm1faTE2IDogSW50cmluc2ljPAorICBbbGx2bV92MmkxNl90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2N2dF9wa25vcm1fdTE2IDogSW50cmluc2ljPAorICBbbGx2bV92MmkxNl90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2N2dF9wa19pMTYgOiBJbnRyaW5zaWM8CisgIFtsbHZtX3YyaTE2X3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9jdnRfcGtfdTE2IDogSW50cmluc2ljPAorICBbbGx2bV92MmkxNl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fY2xhc3MgOiBJbnRyaW5zaWM8CisgIFtsbHZtX2kxX3R5XSwgW2xsdm1fYW55ZmxvYXRfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2ZtZWQzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9mbWVkMyI+LAorICBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLAorICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fY3ViZWlkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9jdWJlaWQiPiwKKyAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwKKyAgICBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2N1YmVtYSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fY3ViZW1hIj4sCisgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sCisgIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2N1YmVzYyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fY3ViZXNjIj4sCisgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sCisgICAgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9jdWJldGMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX2N1YmV0YyI+LAorICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLAorICAgIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworLy8gdl9mZmJoX2kzMiwgYXMgb3Bwb3NlZCB0byB2X2ZmYmhfdTMyLiBGb3Igdl9mZmJoX3UzMiwgbGx2bS5jdGx6CisvLyBzaG91bGQgYmUgdXNlZC4KK2RlZiBpbnRfYW1kZ2NuX3NmZmJoIDoKKyAgSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKKworLy8gRmllbGRzIHNob3VsZCBtaXJyb3IgYXRvbWljcm13CitjbGFzcyBBTURHUFVBdG9taWNJbmNJbnRyaW4gOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwKKyAgW2xsdm1fYW55cHRyX3R5LAorICBMTFZNTWF0Y2hUeXBlPDA+LAorICBsbHZtX2kzMl90eSwgLy8gb3JkZXJpbmcKKyAgbGx2bV9pMzJfdHksIC8vIHNjb3BlCisgIGxsdm1faTFfdHldLCAvLyBpc1ZvbGF0aWxlCisgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+XSwgIiIsCisgIFtTRE5QTWVtT3BlcmFuZF0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2F0b21pY19pbmMgOiBBTURHUFVBdG9taWNJbmNJbnRyaW47CitkZWYgaW50X2FtZGdjbl9hdG9taWNfZGVjIDogQU1ER1BVQXRvbWljSW5jSW50cmluOworCitjbGFzcyBBTURHUFVMRFNGMzJJbnRyaW48c3RyaW5nIGNsYW5nX2J1aWx0aW4+IDoKKyAgR0NDQnVpbHRpbjxjbGFuZ19idWlsdGluPiwKKyAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwKKyAgICBbTExWTVF1YWxQb2ludGVyVHlwZTxsbHZtX2Zsb2F0X3R5LCAzPiwKKyAgICBsbHZtX2Zsb2F0X3R5LAorICAgIGxsdm1faTMyX3R5LCAvLyBvcmRlcmluZworICAgIGxsdm1faTMyX3R5LCAvLyBzY29wZQorICAgIGxsdm1faTFfdHldLCAvLyBpc1ZvbGF0aWxlCisgICAgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8MD5dCis+OworCitkZWYgaW50X2FtZGdjbl9kc19mYWRkIDogQU1ER1BVTERTRjMySW50cmluPCJfX2J1aWx0aW5fYW1kZ2NuX2RzX2ZhZGQiPjsKK2RlZiBpbnRfYW1kZ2NuX2RzX2ZtaW4gOiBBTURHUFVMRFNGMzJJbnRyaW48Il9fYnVpbHRpbl9hbWRnY25fZHNfZm1pbiI+OworZGVmIGludF9hbWRnY25fZHNfZm1heCA6IEFNREdQVUxEU0YzMkludHJpbjwiX19idWlsdGluX2FtZGdjbl9kc19mbWF4Ij47CisKK2NsYXNzIEFNREdQVUltYWdlTG9hZDxiaXQgTm9NZW0gPSAwPiA6IEludHJpbnNpYyA8CisgIFtsbHZtX2FueWZsb2F0X3R5XSwgLy8gdmRhdGEoVkdQUikKKyAgW2xsdm1fYW55aW50X3R5LCAgICAvLyB2YWRkcihWR1BSKQorICAgbGx2bV9hbnlpbnRfdHksICAgIC8vIHJzcmMoU0dQUikKKyAgIGxsdm1faTMyX3R5LCAgICAgICAvLyBkbWFzayhpbW0pCisgICBsbHZtX2kxX3R5LCAgICAgICAgLy8gZ2xjKGltbSkKKyAgIGxsdm1faTFfdHksICAgICAgICAvLyBzbGMoaW1tKQorICAgbGx2bV9pMV90eSwgICAgICAgIC8vIGx3ZShpbW0pCisgICBsbHZtX2kxX3R5XSwgICAgICAgLy8gZGEoaW1tKQorICAhaWYoTm9NZW0sIFtJbnRyTm9NZW1dLCBbSW50clJlYWRNZW1dKSwgIiIsCisgICFpZihOb01lbSwgW10sIFtTRE5QTWVtT3BlcmFuZF0pPjsKKworZGVmIGludF9hbWRnY25faW1hZ2VfbG9hZCA6IEFNREdQVUltYWdlTG9hZDsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2xvYWRfbWlwIDogQU1ER1BVSW1hZ2VMb2FkOworZGVmIGludF9hbWRnY25faW1hZ2VfZ2V0cmVzaW5mbyA6IEFNREdQVUltYWdlTG9hZDwxPjsKKworY2xhc3MgQU1ER1BVSW1hZ2VTdG9yZSA6IEludHJpbnNpYyA8CisgIFtdLAorICBbbGx2bV9hbnlmbG9hdF90eSwgIC8vIHZkYXRhKFZHUFIpCisgICBsbHZtX2FueWludF90eSwgICAgLy8gdmFkZHIoVkdQUikKKyAgIGxsdm1fYW55aW50X3R5LCAgICAvLyByc3JjKFNHUFIpCisgICBsbHZtX2kzMl90eSwgICAgICAgLy8gZG1hc2soaW1tKQorICAgbGx2bV9pMV90eSwgICAgICAgIC8vIGdsYyhpbW0pCisgICBsbHZtX2kxX3R5LCAgICAgICAgLy8gc2xjKGltbSkKKyAgIGxsdm1faTFfdHksICAgICAgICAvLyBsd2UoaW1tKQorICAgbGx2bV9pMV90eV0sICAgICAgIC8vIGRhKGltbSkKKyAgW0ludHJXcml0ZU1lbV0sICIiLCBbU0ROUE1lbU9wZXJhbmRdPjsKKworZGVmIGludF9hbWRnY25faW1hZ2Vfc3RvcmUgOiBBTURHUFVJbWFnZVN0b3JlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc3RvcmVfbWlwIDogQU1ER1BVSW1hZ2VTdG9yZTsKKworY2xhc3MgQU1ER1BVSW1hZ2VTYW1wbGU8Yml0IE5vTWVtID0gMD4gOiBJbnRyaW5zaWMgPAorICAgIFtsbHZtX2FueWZsb2F0X3R5XSwgLy8gdmRhdGEoVkdQUikKKyAgICBbbGx2bV9hbnlmbG9hdF90eSwgIC8vIHZhZGRyKFZHUFIpCisgICAgIGxsdm1fYW55aW50X3R5LCAgICAvLyByc3JjKFNHUFIpCisgICAgIGxsdm1fdjRpMzJfdHksICAgICAvLyBzYW1wbGVyKFNHUFIpCisgICAgIGxsdm1faTMyX3R5LCAgICAgICAvLyBkbWFzayhpbW0pCisgICAgIGxsdm1faTFfdHksICAgICAgICAvLyB1bm9ybShpbW0pCisgICAgIGxsdm1faTFfdHksICAgICAgICAvLyBnbGMoaW1tKQorICAgICBsbHZtX2kxX3R5LCAgICAgICAgLy8gc2xjKGltbSkKKyAgICAgbGx2bV9pMV90eSwgICAgICAgIC8vIGx3ZShpbW0pCisgICAgIGxsdm1faTFfdHldLCAgICAgICAvLyBkYShpbW0pCisgICAgICFpZihOb01lbSwgW0ludHJOb01lbV0sIFtJbnRyUmVhZE1lbV0pLCAiIiwKKyAgICAgIWlmKE5vTWVtLCBbXSwgW1NETlBNZW1PcGVyYW5kXSk+OworCisvLyBCYXNpYyBzYW1wbGUKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZSA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2NsIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfZCA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2RfY2wgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9sIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfYiA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2JfY2wgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9seiA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2NkIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY2RfY2wgOiBBTURHUFVJbWFnZVNhbXBsZTsKKworLy8gU2FtcGxlIHdpdGggY29tcGFyaXNvbgorZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2MgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2NsIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY19kIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY19kX2NsIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY19sIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY19iIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY19iX2NsIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY19seiA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2NfY2QgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2NkX2NsIDogQU1ER1BVSW1hZ2VTYW1wbGU7CisKKy8vIFNhbXBsZSB3aXRoIG9mZnNldHMKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY2xfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2RfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2RfY2xfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2xfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2JfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2JfY2xfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2x6X28gOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jZF9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY2RfY2xfbyA6IEFNREdQVUltYWdlU2FtcGxlOworCisvLyBTYW1wbGUgd2l0aCBjb21wYXJpc29uIGFuZCBvZmZzZXRzCitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY19vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY19jbF9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY19kX28gOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2RfY2xfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2NfbF9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY19iX28gOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2JfY2xfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2NfbHpfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2NfY2RfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2NfY2RfY2xfbyA6IEFNREdQVUltYWdlU2FtcGxlOworCisvLyBCYXNpYyBnYXRoZXI0CitkZWYgaW50X2FtZGdjbl9pbWFnZV9nYXRoZXI0IDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9nYXRoZXI0X2NsIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9nYXRoZXI0X2wgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjRfYiA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2VfZ2F0aGVyNF9iX2NsIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9nYXRoZXI0X2x6IDogQU1ER1BVSW1hZ2VTYW1wbGU7CisKKy8vIEdhdGhlcjQgd2l0aCBjb21wYXJpc29uCitkZWYgaW50X2FtZGdjbl9pbWFnZV9nYXRoZXI0X2MgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY19jbCA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2VfZ2F0aGVyNF9jX2wgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY19iIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9nYXRoZXI0X2NfYl9jbCA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2VfZ2F0aGVyNF9jX2x6IDogQU1ER1BVSW1hZ2VTYW1wbGU7CisKKy8vIEdhdGhlcjQgd2l0aCBvZmZzZXRzCitkZWYgaW50X2FtZGdjbl9pbWFnZV9nYXRoZXI0X28gOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY2xfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2VfZ2F0aGVyNF9sX28gOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjRfYl9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9nYXRoZXI0X2JfY2xfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2VfZ2F0aGVyNF9sel9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CisKKy8vIEdhdGhlcjQgd2l0aCBjb21wYXJpc29uIGFuZCBvZmZzZXRzCitkZWYgaW50X2FtZGdjbl9pbWFnZV9nYXRoZXI0X2NfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2VfZ2F0aGVyNF9jX2NsX28gOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY19sX28gOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY19iX28gOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY19iX2NsX28gOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY19sel9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CisKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dldGxvZCA6IEFNREdQVUltYWdlU2FtcGxlPDE+OworCitjbGFzcyBBTURHUFVJbWFnZUF0b21pYyA6IEludHJpbnNpYyA8CisgIFtsbHZtX2kzMl90eV0sCisgIFtsbHZtX2kzMl90eSwgICAgICAgLy8gdmRhdGEoVkdQUikKKyAgIGxsdm1fYW55aW50X3R5LCAgICAvLyB2YWRkcihWR1BSKQorICAgbGx2bV92OGkzMl90eSwgICAgIC8vIHJzcmMoU0dQUikKKyAgIGxsdm1faTFfdHksICAgICAgICAvLyByMTI4KGltbSkKKyAgIGxsdm1faTFfdHksICAgICAgICAvLyBkYShpbW0pCisgICBsbHZtX2kxX3R5XSwgICAgICAgLy8gc2xjKGltbSkKKyAgW10sICIiLCBbU0ROUE1lbU9wZXJhbmRdPjsKKworZGVmIGludF9hbWRnY25faW1hZ2VfYXRvbWljX3N3YXAgOiBBTURHUFVJbWFnZUF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2F0b21pY19hZGQgOiBBTURHUFVJbWFnZUF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2F0b21pY19zdWIgOiBBTURHUFVJbWFnZUF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2F0b21pY19zbWluIDogQU1ER1BVSW1hZ2VBdG9taWM7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9hdG9taWNfdW1pbiA6IEFNREdQVUltYWdlQXRvbWljOworZGVmIGludF9hbWRnY25faW1hZ2VfYXRvbWljX3NtYXggOiBBTURHUFVJbWFnZUF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2F0b21pY191bWF4IDogQU1ER1BVSW1hZ2VBdG9taWM7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9hdG9taWNfYW5kIDogQU1ER1BVSW1hZ2VBdG9taWM7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9hdG9taWNfb3IgOiBBTURHUFVJbWFnZUF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2F0b21pY194b3IgOiBBTURHUFVJbWFnZUF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2F0b21pY19pbmMgOiBBTURHUFVJbWFnZUF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2F0b21pY19kZWMgOiBBTURHUFVJbWFnZUF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2F0b21pY19jbXBzd2FwIDogSW50cmluc2ljIDwKKyAgW2xsdm1faTMyX3R5XSwKKyAgW2xsdm1faTMyX3R5LCAgICAgICAvLyBzcmMoVkdQUikKKyAgIGxsdm1faTMyX3R5LCAgICAgICAvLyBjbXAoVkdQUikKKyAgIGxsdm1fYW55aW50X3R5LCAgICAvLyB2YWRkcihWR1BSKQorICAgbGx2bV92OGkzMl90eSwgICAgIC8vIHJzcmMoU0dQUikKKyAgIGxsdm1faTFfdHksICAgICAgICAvLyByMTI4KGltbSkKKyAgIGxsdm1faTFfdHksICAgICAgICAvLyBkYShpbW0pCisgICBsbHZtX2kxX3R5XSwgICAgICAgLy8gc2xjKGltbSkKKyAgW10sICIiLCBbU0ROUE1lbU9wZXJhbmRdPjsKKworY2xhc3MgQU1ER1BVQnVmZmVyTG9hZCA6IEludHJpbnNpYyA8CisgIFtsbHZtX2FueWZsb2F0X3R5XSwKKyAgW2xsdm1fdjRpMzJfdHksICAgICAvLyByc3JjKFNHUFIpCisgICBsbHZtX2kzMl90eSwgICAgICAgLy8gdmluZGV4KFZHUFIpCisgICBsbHZtX2kzMl90eSwgICAgICAgLy8gb2Zmc2V0KFNHUFIvVkdQUi9pbW0pCisgICBsbHZtX2kxX3R5LCAgICAgICAgLy8gZ2xjKGltbSkKKyAgIGxsdm1faTFfdHldLCAgICAgICAvLyBzbGMoaW1tKQorICBbSW50clJlYWRNZW1dLCAiIiwgW1NETlBNZW1PcGVyYW5kXT47CitkZWYgaW50X2FtZGdjbl9idWZmZXJfbG9hZF9mb3JtYXQgOiBBTURHUFVCdWZmZXJMb2FkOworZGVmIGludF9hbWRnY25fYnVmZmVyX2xvYWQgOiBBTURHUFVCdWZmZXJMb2FkOworCitjbGFzcyBBTURHUFVCdWZmZXJTdG9yZSA6IEludHJpbnNpYyA8CisgIFtdLAorICBbbGx2bV9hbnlmbG9hdF90eSwgIC8vIHZkYXRhKFZHUFIpIC0tIGNhbiBjdXJyZW50bHkgb25seSBzZWxlY3QgZjMyLCB2MmYzMiwgdjRmMzIKKyAgIGxsdm1fdjRpMzJfdHksICAgICAvLyByc3JjKFNHUFIpCisgICBsbHZtX2kzMl90eSwgICAgICAgLy8gdmluZGV4KFZHUFIpCisgICBsbHZtX2kzMl90eSwgICAgICAgLy8gb2Zmc2V0KFNHUFIvVkdQUi9pbW0pCisgICBsbHZtX2kxX3R5LCAgICAgICAgLy8gZ2xjKGltbSkKKyAgIGxsdm1faTFfdHldLCAgICAgICAvLyBzbGMoaW1tKQorICBbSW50cldyaXRlTWVtXSwgIiIsIFtTRE5QTWVtT3BlcmFuZF0+OworZGVmIGludF9hbWRnY25fYnVmZmVyX3N0b3JlX2Zvcm1hdCA6IEFNREdQVUJ1ZmZlclN0b3JlOworZGVmIGludF9hbWRnY25fYnVmZmVyX3N0b3JlIDogQU1ER1BVQnVmZmVyU3RvcmU7CisKK2RlZiBpbnRfYW1kZ2NuX3RidWZmZXJfbG9hZCA6IEludHJpbnNpYyA8CisgICAgW2xsdm1fYW55X3R5XSwgICAgLy8gb3ZlcmxvYWRlZCBmb3IgdHlwZXMgZjMyL2kzMiwgdjJmMzIvdjJpMzIsIHY0ZjMyL3Y0aTMyCisgICAgW2xsdm1fdjRpMzJfdHksICAgLy8gcnNyYyhTR1BSKQorICAgICBsbHZtX2kzMl90eSwgICAgIC8vIHZpbmRleChWR1BSKQorICAgICBsbHZtX2kzMl90eSwgICAgIC8vIHZvZmZzZXQoVkdQUikKKyAgICAgbGx2bV9pMzJfdHksICAgICAvLyBzb2Zmc2V0KFNHUFIpCisgICAgIGxsdm1faTMyX3R5LCAgICAgLy8gb2Zmc2V0KGltbSkKKyAgICAgbGx2bV9pMzJfdHksICAgICAvLyBkZm10KGltbSkKKyAgICAgbGx2bV9pMzJfdHksICAgICAvLyBuZm10KGltbSkKKyAgICAgbGx2bV9pMV90eSwgICAgIC8vIGdsYyhpbW0pCisgICAgIGxsdm1faTFfdHldLCAgICAvLyBzbGMoaW1tKQorICAgIFtJbnRyUmVhZE1lbV0sICIiLCBbU0ROUE1lbU9wZXJhbmRdPjsKKworZGVmIGludF9hbWRnY25fdGJ1ZmZlcl9zdG9yZSA6IEludHJpbnNpYyA8CisgICAgW10sCisgICAgW2xsdm1fYW55X3R5LCAgICAvLyB2ZGF0YShWR1BSKSwgb3ZlcmxvYWRlZCBmb3IgdHlwZXMgZjMyL2kzMiwgdjJmMzIvdjJpMzIsIHY0ZjMyL3Y0aTMyCisgICAgIGxsdm1fdjRpMzJfdHksICAvLyByc3JjKFNHUFIpCisgICAgIGxsdm1faTMyX3R5LCAgICAvLyB2aW5kZXgoVkdQUikKKyAgICAgbGx2bV9pMzJfdHksICAgIC8vIHZvZmZzZXQoVkdQUikKKyAgICAgbGx2bV9pMzJfdHksICAgIC8vIHNvZmZzZXQoU0dQUikKKyAgICAgbGx2bV9pMzJfdHksICAgIC8vIG9mZnNldChpbW0pCisgICAgIGxsdm1faTMyX3R5LCAgICAvLyBkZm10KGltbSkKKyAgICAgbGx2bV9pMzJfdHksICAgIC8vIG5mbXQoaW1tKQorICAgICBsbHZtX2kxX3R5LCAgICAgLy8gZ2xjKGltbSkKKyAgICAgbGx2bV9pMV90eV0sICAgIC8vIHNsYyhpbW0pCisgICAgW0ludHJXcml0ZU1lbV0sICIiLCBbU0ROUE1lbU9wZXJhbmRdPjsKKworY2xhc3MgQU1ER1BVQnVmZmVyQXRvbWljIDogSW50cmluc2ljIDwKKyAgW2xsdm1faTMyX3R5XSwKKyAgW2xsdm1faTMyX3R5LCAgICAgICAvLyB2ZGF0YShWR1BSKQorICAgbGx2bV92NGkzMl90eSwgICAgIC8vIHJzcmMoU0dQUikKKyAgIGxsdm1faTMyX3R5LCAgICAgICAvLyB2aW5kZXgoVkdQUikKKyAgIGxsdm1faTMyX3R5LCAgICAgICAvLyBvZmZzZXQoU0dQUi9WR1BSL2ltbSkKKyAgIGxsdm1faTFfdHldLCAgICAgICAvLyBzbGMoaW1tKQorICBbXSwgIiIsIFtTRE5QTWVtT3BlcmFuZF0+OworZGVmIGludF9hbWRnY25fYnVmZmVyX2F0b21pY19zd2FwIDogQU1ER1BVQnVmZmVyQXRvbWljOworZGVmIGludF9hbWRnY25fYnVmZmVyX2F0b21pY19hZGQgOiBBTURHUFVCdWZmZXJBdG9taWM7CitkZWYgaW50X2FtZGdjbl9idWZmZXJfYXRvbWljX3N1YiA6IEFNREdQVUJ1ZmZlckF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2J1ZmZlcl9hdG9taWNfc21pbiA6IEFNREdQVUJ1ZmZlckF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2J1ZmZlcl9hdG9taWNfdW1pbiA6IEFNREdQVUJ1ZmZlckF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2J1ZmZlcl9hdG9taWNfc21heCA6IEFNREdQVUJ1ZmZlckF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2J1ZmZlcl9hdG9taWNfdW1heCA6IEFNREdQVUJ1ZmZlckF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2J1ZmZlcl9hdG9taWNfYW5kIDogQU1ER1BVQnVmZmVyQXRvbWljOworZGVmIGludF9hbWRnY25fYnVmZmVyX2F0b21pY19vciA6IEFNREdQVUJ1ZmZlckF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2J1ZmZlcl9hdG9taWNfeG9yIDogQU1ER1BVQnVmZmVyQXRvbWljOworZGVmIGludF9hbWRnY25fYnVmZmVyX2F0b21pY19jbXBzd2FwIDogSW50cmluc2ljPAorICBbbGx2bV9pMzJfdHldLAorICBbbGx2bV9pMzJfdHksICAgICAgIC8vIHNyYyhWR1BSKQorICAgbGx2bV9pMzJfdHksICAgICAgIC8vIGNtcChWR1BSKQorICAgbGx2bV92NGkzMl90eSwgICAgIC8vIHJzcmMoU0dQUikKKyAgIGxsdm1faTMyX3R5LCAgICAgICAvLyB2aW5kZXgoVkdQUikKKyAgIGxsdm1faTMyX3R5LCAgICAgICAvLyBvZmZzZXQoU0dQUi9WR1BSL2ltbSkKKyAgIGxsdm1faTFfdHldLCAgICAgICAvLyBzbGMoaW1tKQorICBbXSwgIiIsIFtTRE5QTWVtT3BlcmFuZF0+OworCisvLyBVc2VzIHRoYXQgZG8gbm90IHNldCB0aGUgZG9uZSBiaXQgc2hvdWxkIHNldCBJbnRyV3JpdGVNZW0gb24gdGhlCisvLyBjYWxsIHNpdGUuCitkZWYgaW50X2FtZGdjbl9leHAgOiBJbnRyaW5zaWMgPFtdLCBbCisgIGxsdm1faTMyX3R5LCAgICAgICAvLyB0Z3QsCisgIGxsdm1faTMyX3R5LCAgICAgICAvLyBlbgorICBsbHZtX2FueV90eSwgICAgICAgLy8gc3JjMCAoZjMyIG9yIGkzMikKKyAgTExWTU1hdGNoVHlwZTwwPiwgIC8vIHNyYzEKKyAgTExWTU1hdGNoVHlwZTwwPiwgIC8vIHNyYzIKKyAgTExWTU1hdGNoVHlwZTwwPiwgIC8vIHNyYzMKKyAgbGx2bV9pMV90eSwgICAgICAgIC8vIGRvbmUKKyAgbGx2bV9pMV90eSAgICAgICAgIC8vIHZtCisgIF0sCisgIFtdCis+OworCisvLyBleHAgd2l0aCBjb21wciBiaXQgc2V0LgorZGVmIGludF9hbWRnY25fZXhwX2NvbXByIDogSW50cmluc2ljIDxbXSwgWworICBsbHZtX2kzMl90eSwgICAgICAgLy8gdGd0LAorICBsbHZtX2kzMl90eSwgICAgICAgLy8gZW4KKyAgbGx2bV9hbnl2ZWN0b3JfdHksIC8vIHNyYzAgKHYyZjE2IG9yIHYyaTE2KQorICBMTFZNTWF0Y2hUeXBlPDA+LCAgLy8gc3JjMQorICBsbHZtX2kxX3R5LCAgICAgICAgLy8gZG9uZQorICBsbHZtX2kxX3R5XSwgICAgICAgLy8gdm0KKyAgW10KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2J1ZmZlcl93YmludmwxX3NjIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9idWZmZXJfd2JpbnZsMV9zYyI+LAorICBJbnRyaW5zaWM8W10sIFtdLCBbXT47CisKK2RlZiBpbnRfYW1kZ2NuX2J1ZmZlcl93YmludmwxIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9idWZmZXJfd2JpbnZsMSI+LAorICBJbnRyaW5zaWM8W10sIFtdLCBbXT47CisKK2RlZiBpbnRfYW1kZ2NuX3NfZGNhY2hlX2ludiA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fc19kY2FjaGVfaW52Ij4sCisgIEludHJpbnNpYzxbXSwgW10sIFtdPjsKKworZGVmIGludF9hbWRnY25fc19tZW10aW1lIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9zX21lbXRpbWUiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtdLCBbSW50clJlYWRNZW1dPjsKKworZGVmIGludF9hbWRnY25fc19zbGVlcCA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fc19zbGVlcCI+LAorICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0sIFtdPiB7Cit9CisKK2RlZiBpbnRfYW1kZ2NuX3NfaW5jcGVyZmxldmVsIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9zX2luY3BlcmZsZXZlbCI+LAorICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0sIFtdPiB7Cit9CisKK2RlZiBpbnRfYW1kZ2NuX3NfZGVjcGVyZmxldmVsIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9zX2RlY3BlcmZsZXZlbCI+LAorICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0sIFtdPiB7Cit9CisKK2RlZiBpbnRfYW1kZ2NuX3NfZ2V0cmVnIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9zX2dldHJlZyI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5XSwKKyAgW0ludHJSZWFkTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworLy8gaW50X2FtZGdjbl9zX2dldHBjIGlzIHByb3ZpZGVkIHRvIGFsbG93IGEgc3BlY2lmaWMgc3R5bGUgb2YgcG9zaXRpb24KKy8vIGluZGVwZW5kZW50IGNvZGUgdG8gZGV0ZXJtaW5lIHRoZSBoaWdoIHBhcnQgb2YgaXRzIGFkZHJlc3Mgd2hlbiBpdCBpcworLy8ga25vd24gKHRocm91Z2ggY29udmVudGlvbikgdGhhdCB0aGUgY29kZSBhbmQgYW55IGRhdGEgb2YgaW50ZXJlc3QgZG9lcworLy8gbm90IGNyb3NzIGEgNEdiIGFkZHJlc3MgYm91bmRhcnkuIFVzZSBmb3IgYW55IG90aGVyIHB1cnBvc2UgbWF5IG5vdAorLy8gcHJvZHVjZSB0aGUgZGVzaXJlZCByZXN1bHRzIGFzIG9wdGltaXphdGlvbnMgbWF5IGNhdXNlIGNvZGUgbW92ZW1lbnQsCisvLyBlc3BlY2lhbGx5IGFzIHdlIGV4cGxpY2l0bHkgdXNlIEludHJOb01lbSB0byBhbGxvdyBvcHRpbWl6YXRpb25zLgorZGVmIGludF9hbWRnY25fc19nZXRwYyA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fc19nZXRwYyI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW10sIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdPjsKKworLy8gX19idWlsdGluX2FtZGdjbl9pbnRlcnBfbW92IDxwYXJhbT4sIDxhdHRyX2NoYW4+LCA8YXR0cj4sIDxtMD4KKy8vIHBhcmFtIHZhbHVlczogMCA9IFAxMCwgMSA9IFAyMCwgMiA9IFAwCitkZWYgaW50X2FtZGdjbl9pbnRlcnBfbW92IDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9pbnRlcnBfbW92Ij4sCisgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0+OworCisvLyBfX2J1aWx0aW5fYW1kZ2NuX2ludGVycF9wMSA8aT4sIDxhdHRyX2NoYW4+LCA8YXR0cj4sIDxtMD4KKy8vIFRoaXMgaW50cmluc2ljIHJlYWRzIGZyb20gbGRzLCBidXQgdGhlIG1lbW9yeSB2YWx1ZXMgYXJlIGNvbnN0YW50LAorLy8gc28gaXQgYmVoYXZlcyBsaWtlIEludHJOb01lbS4KK2RlZiBpbnRfYW1kZ2NuX2ludGVycF9wMSA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25faW50ZXJwX3AxIj4sCisgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICBbbGx2bV9mbG9hdF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXT47CisKKy8vIF9fYnVpbHRpbl9hbWRnY25faW50ZXJwX3AyIDxwMT4sIDxqPiwgPGF0dHJfY2hhbj4sIDxhdHRyPiwgPG0wPgorZGVmIGludF9hbWRnY25faW50ZXJwX3AyIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9pbnRlcnBfcDIiPiwKKyAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdPjsKKyAgICAgICAgICAvLyBTZWUgaW50X2FtZGdjbl92X2ludGVycF9wMSBmb3Igd2h5IHRoaXMgaXMgSW50ck5vTWVtLgorCisvLyBQaXhlbCBzaGFkZXJzIG9ubHk6IHdoZXRoZXIgdGhlIGN1cnJlbnQgcGl4ZWwgaXMgbGl2ZSAoaS5lLiBub3QgYSBoZWxwZXIKKy8vIGludm9jYXRpb24gZm9yIGRlcml2YXRpdmUgY29tcHV0YXRpb24pLgorZGVmIGludF9hbWRnY25fcHNfbGl2ZSA6IEludHJpbnNpYyA8CisgIFtsbHZtX2kxX3R5XSwKKyAgW10sCisgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9hbWRnY25fbWJjbnRfbG8gOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX21iY250X2xvIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X2FtZGdjbl9tYmNudF9oaSA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fbWJjbnRfaGkiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKy8vIGxsdm0uYW1kZ2NuLmRzLnN3aXp6bGUgc3JjIG9mZnNldAorZGVmIGludF9hbWRnY25fZHNfc3dpenpsZSA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fZHNfc3dpenpsZSI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW0sIEludHJDb252ZXJnZW50XT47CisKK2RlZiBpbnRfYW1kZ2NuX3ViZmUgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwKKyAgW0xMVk1NYXRjaFR5cGU8MD4sIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9zYmZlIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sCisgIFtMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fbGVycCA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fbGVycCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fc2FkX3U4IDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9zYWRfdTgiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX21zYWRfdTggOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX21zYWRfdTgiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX3NhZF9oaV91OCA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fc2FkX2hpX3U4Ij4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9zYWRfdTE2IDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9zYWRfdTE2Ij4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9xc2FkX3BrX3UxNl91OCA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fcXNhZF9wa191MTZfdTgiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX21xc2FkX3BrX3UxNl91OCA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fbXFzYWRfcGtfdTE2X3U4Ij4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9tcXNhZF91MzJfdTggOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX21xc2FkX3UzMl91OCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2N2dF9wa191OF9mMzIgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX2N2dF9wa191OF9mMzIiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25faWNtcCA6CisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9hbnlpbnRfdHksIExMVk1NYXRjaFR5cGU8MD4sIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW0sIEludHJDb252ZXJnZW50XT47CisKK2RlZiBpbnRfYW1kZ2NuX2ZjbXAgOgorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fYW55ZmxvYXRfdHksIExMVk1NYXRjaFR5cGU8MD4sIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW0sIEludHJDb252ZXJnZW50XT47CisKK2RlZiBpbnRfYW1kZ2NuX3JlYWRmaXJzdGxhbmUgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3JlYWRmaXJzdGxhbmUiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW0sIEludHJDb252ZXJnZW50XT47CisKKy8vIFRoZSBsYW5lIGFyZ3VtZW50IG11c3QgYmUgdW5pZm9ybSBhY3Jvc3MgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGhyZWFkcyBvZiB0aGUKKy8vIGN1cnJlbnQgd2F2ZS4gT3RoZXJ3aXNlLCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4KK2RlZiBpbnRfYW1kZ2NuX3JlYWRsYW5lIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9yZWFkbGFuZSI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW0sIEludHJDb252ZXJnZW50XT47CisKKy8vIFRoZSB2YWx1ZSB0byB3cml0ZSBhbmQgbGFuZSBzZWxlY3QgYXJndW1lbnRzIG11c3QgYmUgdW5pZm9ybSBhY3Jvc3MgdGhlCisvLyBjdXJyZW50bHkgYWN0aXZlIHRocmVhZHMgb2YgdGhlIGN1cnJlbnQgd2F2ZS4gT3RoZXJ3aXNlLCB0aGUgcmVzdWx0IGlzCisvLyB1bmRlZmluZWQuCitkZWYgaW50X2FtZGdjbl93cml0ZWxhbmUgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3dyaXRlbGFuZSI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgWworICAgIGxsdm1faTMyX3R5LCAgICAvLyB1bmlmb3JtIHZhbHVlIHRvIHdyaXRlOiByZXR1cm5lZCBieSB0aGUgc2VsZWN0ZWQgbGFuZQorICAgIGxsdm1faTMyX3R5LCAgICAvLyB1bmlmb3JtIGxhbmUgc2VsZWN0CisgICAgbGx2bV9pMzJfdHkgICAgIC8vIHJldHVybmVkIGJ5IGFsbCBsYW5lcyBvdGhlciB0aGFuIHRoZSBzZWxlY3RlZCBvbmUKKyAgXSwKKyAgW0ludHJOb01lbSwgSW50ckNvbnZlcmdlbnRdCis+OworCitkZWYgaW50X2FtZGdjbl9hbGlnbmJpdCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9hbGlnbmJ5dGUgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworCisvLyBDb3BpZXMgdGhlIHNvdXJjZSB2YWx1ZSB0byB0aGUgZGVzdGluYXRpb24gdmFsdWUsIHdpdGggdGhlIGd1YXJhbnRlZSB0aGF0CisvLyB0aGUgc291cmNlIHZhbHVlIGlzIGNvbXB1dGVkIGFzIGlmIHRoZSBlbnRpcmUgcHJvZ3JhbSB3ZXJlIGV4ZWN1dGVkIGluIFdRTS4KK2RlZiBpbnRfYW1kZ2NuX3dxbSA6IEludHJpbnNpYzxbbGx2bV9hbnlfdHldLAorICBbTExWTU1hdGNoVHlwZTwwPl0sIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCisvLyBSZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgdGhyZWFkIHdpdGhpbiB0aGUgcGl4ZWwgcXVhZCBwYXNzZXMgdHJ1ZSBpbnRvCisvLyB0aGUgZnVuY3Rpb24uCitkZWYgaW50X2FtZGdjbl93cW1fdm90ZSA6IEludHJpbnNpYzxbbGx2bV9pMV90eV0sCisgIFtsbHZtX2kxX3R5XSwgW0ludHJOb01lbSwgSW50ckNvbnZlcmdlbnRdCis+OworCisvLyBJZiBmYWxzZSwgc2V0IEVYRUM9MCBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBlbmQgb2YgcHJvZ3JhbS4KK2RlZiBpbnRfYW1kZ2NuX2tpbGwgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2kxX3R5XSwgW10+OworCisvLyBDb3BpZXMgdGhlIGFjdGl2ZSBjaGFubmVscyBvZiB0aGUgc291cmNlIHZhbHVlIHRvIHRoZSBkZXN0aW5hdGlvbiB2YWx1ZSwKKy8vIHdpdGggdGhlIGd1YXJhbnRlZSB0aGF0IHRoZSBzb3VyY2UgdmFsdWUgaXMgY29tcHV0ZWQgYXMgaWYgdGhlIGVudGlyZQorLy8gcHJvZ3JhbSB3ZXJlIGV4ZWN1dGVkIGluIFdob2xlIFdhdmVmcm9udCBNb2RlLCBpLmUuIHdpdGggYWxsIGNoYW5uZWxzCisvLyBlbmFibGVkLCB3aXRoIGEgZmV3IGV4Y2VwdGlvbnM6IC0gUGhpIG5vZGVzIHdpdGggcmVxdWlyZSBXV00gcmV0dXJuIGFuCisvLyB1bmRlZmluZWQgdmFsdWUuCitkZWYgaW50X2FtZGdjbl93d20gOiBJbnRyaW5zaWM8W2xsdm1fYW55X3R5XSwKKyAgW0xMVk1NYXRjaFR5cGU8MD5dLCBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworLy8gR2l2ZW4gYSB2YWx1ZSwgY29waWVzIGl0IHdoaWxlIHNldHRpbmcgYWxsIHRoZSBpbmFjdGl2ZSBsYW5lcyB0byBhIGdpdmVuCisvLyB2YWx1ZS4gTm90ZSB0aGF0IE9wZW5HTCBoZWxwZXIgbGFuZXMgYXJlIGNvbnNpZGVyZWQgYWN0aXZlLCBzbyBpZiB0aGUKKy8vIHByb2dyYW0gZXZlciB1c2VzIFdRTSwgdGhlbiB0aGUgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBmaXJzdCBzb3VyY2Ugd2lsbCBiZQorLy8gY29tcHV0ZWQgaW4gV1FNLgorZGVmIGludF9hbWRnY25fc2V0X2luYWN0aXZlIDoKKyAgSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sCisgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgLy8gdmFsdWUgdG8gYmUgY29waWVkCisgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPl0sIC8vIHZhbHVlIGZvciB0aGUgaW5hY3RpdmUgbGFuZXMgdG8gdGFrZQorICAgICAgICAgICAgW0ludHJOb01lbSwgSW50ckNvbnZlcmdlbnRdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENJKyBJbnRyaW5zaWNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgaW50X2FtZGdjbl9zX2RjYWNoZV9pbnZfdm9sIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9zX2RjYWNoZV9pbnZfdm9sIj4sCisgIEludHJpbnNpYzxbXSwgW10sIFtdPjsKKworZGVmIGludF9hbWRnY25fYnVmZmVyX3diaW52bDFfdm9sIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9idWZmZXJfd2JpbnZsMV92b2wiPiwKKyAgSW50cmluc2ljPFtdLCBbXSwgW10+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVkkgSW50cmluc2ljcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gbGx2bS5hbWRnY24ubW92LmRwcC5pMzIgPHNyYz4gPGRwcF9jdHJsPiA8cm93X21hc2s+IDxiYW5rX21hc2s+IDxib3VuZF9jdHJsPgorZGVmIGludF9hbWRnY25fbW92X2RwcCA6CisgIEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLAorICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgbGx2bV9pMV90eV0sIFtJbnRyTm9NZW0sIEludHJDb252ZXJnZW50XT47CisKKy8vIGxsdm0uYW1kZ2NuLnVwZGF0ZS5kcHAuaTMyIDxvbGQ+IDxzcmM+IDxkcHBfY3RybD4gPHJvd19tYXNrPiA8YmFua19tYXNrPiA8Ym91bmRfY3RybD4KKy8vIFNob3VsZCBiZSBlcXVpdmFsZW50IHRvOgorLy8gdl9tb3ZfYjMyIDxkZXN0PiA8b2xkPgorLy8gdl9tb3ZfYjMyIDxkZXN0PiA8c3JjPiA8ZHBwX2N0cmw+IDxyb3dfbWFzaz4gPGJhbmtfbWFzaz4gPGJvdW5kX2N0cmw+CitkZWYgaW50X2FtZGdjbl91cGRhdGVfZHBwIDoKKyAgSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sCisgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kxX3R5XSwgW0ludHJOb01lbSwgSW50ckNvbnZlcmdlbnRdPjsKKworZGVmIGludF9hbWRnY25fc19kY2FjaGVfd2IgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3NfZGNhY2hlX3diIj4sCisgIEludHJpbnNpYzxbXSwgW10sIFtdPjsKKworZGVmIGludF9hbWRnY25fc19kY2FjaGVfd2Jfdm9sIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9zX2RjYWNoZV93Yl92b2wiPiwKKyAgSW50cmluc2ljPFtdLCBbXSwgW10+OworCitkZWYgaW50X2FtZGdjbl9zX21lbXJlYWx0aW1lIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9zX21lbXJlYWx0aW1lIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbXSwgW0ludHJSZWFkTWVtXT47CisKKy8vIGxsdm0uYW1kZ2NuLmRzLnBlcm11dGUgPGluZGV4PiA8c3JjPgorZGVmIGludF9hbWRnY25fZHNfcGVybXV0ZSA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fZHNfcGVybXV0ZSI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW0sIEludHJDb252ZXJnZW50XT47CisKKy8vIGxsdm0uYW1kZ2NuLmRzLmJwZXJtdXRlIDxpbmRleD4gPHNyYz4KK2RlZiBpbnRfYW1kZ2NuX2RzX2JwZXJtdXRlIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9kc19icGVybXV0ZSI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW0sIEludHJDb252ZXJnZW50XT47CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNwZWNpYWwgSW50cmluc2ljcyBmb3IgYmFja2VuZCBpbnRlcm5hbCB1c2Ugb25seS4gTm8gZnJvbnRlbmQKKy8vIHNob3VsZCBlbWl0IGNhbGxzIHRvIHRoZXNlLgorLy8gPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitkZWYgaW50X2FtZGdjbl9pZiA6IEludHJpbnNpYzxbbGx2bV9pMV90eSwgbGx2bV9pNjRfdHldLAorICBbbGx2bV9pMV90eV0sIFtJbnRyQ29udmVyZ2VudF0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2Vsc2UgOiBJbnRyaW5zaWM8W2xsdm1faTFfdHksIGxsdm1faTY0X3R5XSwKKyAgW2xsdm1faTY0X3R5XSwgW0ludHJDb252ZXJnZW50XQorPjsKKworZGVmIGludF9hbWRnY25fYnJlYWsgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwKKyAgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbSwgSW50ckNvbnZlcmdlbnRdCis+OworCitkZWYgaW50X2FtZGdjbl9pZl9icmVhayA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLAorICBbbGx2bV9pMV90eSwgbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtLCBJbnRyQ29udmVyZ2VudF0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2Vsc2VfYnJlYWsgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwKKyAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW0sIEludHJDb252ZXJnZW50XQorPjsKKworZGVmIGludF9hbWRnY25fbG9vcCA6IEludHJpbnNpYzxbbGx2bV9pMV90eV0sCisgIFtsbHZtX2k2NF90eV0sIFtJbnRyQ29udmVyZ2VudF0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2VuZF9jZiA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5XSwgW0ludHJDb252ZXJnZW50XT47CisKKy8vIFJlcHJlc2VudCB1bnJlYWNoYWJsZSBpbiBhIGRpdmVyZ2VudCByZWdpb24uCitkZWYgaW50X2FtZGdjbl91bnJlYWNoYWJsZSA6IEludHJpbnNpYzxbXSwgW10sIFtJbnRyQ29udmVyZ2VudF0+OworCisvLyBFbWl0IDIuNSB1bHAsIG5vIGRlbm9ybWFsIGRpdmlzaW9uLiBTaG91bGQgb25seSBiZSBpbnNlcnRlZCBieQorLy8gcGFzcyBiYXNlZCBvbiAhZnBtYXRoIG1ldGFkYXRhLgorZGVmIGludF9hbWRnY25fZmRpdl9mYXN0IDogSW50cmluc2ljPAorICBbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47Cit9CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NBUk0udGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NBUk0udGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzODYxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc0FSTS50ZApAQCAtMCwwICsxLDcxNiBAQAorLy89PT0tIEludHJpbnNpY3NBUk0udGQgLSBEZWZpbmVzIEFSTSBpbnRyaW5zaWNzIC0tLS0tLS0tLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgb2YgdGhlIEFSTS1zcGVjaWZpYyBpbnRyaW5zaWNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRMUworCitsZXQgVGFyZ2V0UHJlZml4ID0gImFybSIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS5hcm0uIi4KKworLy8gQSBzcGFjZS1jb25zdW1pbmcgaW50cmluc2ljIHByaW1hcmlseSBmb3IgdGVzdGluZyBBUk1Db25zdGFudElzbGFuZHMuIFRoZQorLy8gZmlyc3QgYXJndW1lbnQgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGlzICJpbnN0cnVjdGlvbiIgdGFrZXMgdXAsIHRoZSBzZWNvbmQKKy8vIGFuZCByZXR1cm4gdmFsdWUgYXJlIGVzc2VudGlhbGx5IGNoYWlucywgdXNlZCB0byBmb3JjZSBvcmRlcmluZyBkdXJpbmcgSVNlbC4KK2RlZiBpbnRfYXJtX3NwYWNlIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisKKy8vIDE2LWJpdCBtdWx0aXBsaWNhdGlvbnMKK2RlZiBpbnRfYXJtX3NtdWxiYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc211bGJiIj4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9zbXVsYnQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NtdWxidCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fc211bHRiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zbXVsdGIiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3NtdWx0dCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc211bHR0Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9zbXVsd2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NtdWx3YiI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fc211bHd0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zbXVsd3QiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNhdHVyYXRpbmcgQXJpdGhtZXRpYworCitkZWYgaW50X2FybV9xYWRkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9xYWRkIj4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9xc3ViIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9xc3ViIj4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9zc2F0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zc2F0Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV91c2F0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV91c2F0Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKy8vIEFjY3VtdWxhdGluZyBtdWx0aXBsaWNhdGlvbnMKK2RlZiBpbnRfYXJtX3NtbGFiYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc21sYWJiIj4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9zbWxhYnQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NtbGFidCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fc21sYXRiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zbWxhdGIiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3NtbGF0dCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc21sYXR0Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9zbWxhd2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NtbGF3YiI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fc21sYXd0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zbWxhd3QiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgIFtJbnRyTm9NZW1dPjsKKworLy8gUGFyYWxsZWwgMTYtYml0IHNhdHVyYXRpb24KK2RlZiBpbnRfYXJtX3NzYXQxNiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc3NhdDE2Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV91c2F0MTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3VzYXQxNiI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisvLyBQYWNraW5nIGFuZCB1bnBhY2tpbmcKK2RlZiBpbnRfYXJtX3N4dGFiMTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3N4dGFiMTYiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3N4dGIxNiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc3h0YjE2Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3V4dGFiMTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3V4dGFiMTYiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3V4dGIxNiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fdXh0YjE2Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8gUGFyYWxsZWwgc2VsZWN0aW9uLCByZWFkcyB0aGUgR0UgZmxhZ3MuCitkZWYgaW50X2FybV9zZWwgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NlbCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJSZWFkTWVtXT47CisKKy8vIFBhcmFsbGVsIDgtYml0IGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbgorZGVmIGludF9hcm1fcWFkZDggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9xYWRkOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fcXN1YjggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9xc3ViOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworLy8gV3JpdGVzIHRvIHRoZSBHRSBiaXRzLgorZGVmIGludF9hcm1fc2FkZDggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zYWRkOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9hcm1fc2hhZGQ4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc2hhZGQ4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9zaHN1YjggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zaHN1YjgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKy8vIFdyaXRlcyB0byB0aGUgR0UgYml0cy4KK2RlZiBpbnRfYXJtX3NzdWI4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc3N1YjgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKy8vIFdyaXRlcyB0byB0aGUgR0UgYml0cy4KK2RlZiBpbnRfYXJtX3VhZGQ4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fdWFkZDgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKK2RlZiBpbnRfYXJtX3VoYWRkOCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3VoYWRkOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fdWhzdWI4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fdWhzdWI4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV91cWFkZDggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV91cWFkZDgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3Vxc3ViOCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3Vxc3ViOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworLy8gV3JpdGVzIHRvIHRoZSBHRSBiaXRzLgorZGVmIGludF9hcm1fdXN1YjggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV91c3ViOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworCisvLyBTdW0gb2YgOC1iaXQgYWJzb2x1dGUgZGlmZmVyZW5jZXMKK2RlZiBpbnRfYXJtX3VzYWQ4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fdXNhZDgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3VzYWRhOCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3VzYWRhOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8gUGFyYWxsZWwgMTYtYml0IGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbgorZGVmIGludF9hcm1fcWFkZDE2ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fcWFkZDE2Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9xYXN4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fcWFzeCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fcXNheCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3FzYXgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3FzdWIxNiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3FzdWIxNiI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworLy8gV3JpdGVzIHRvIHRoZSBHRSBiaXRzLgorZGVmIGludF9hcm1fc2FkZDE2ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc2FkZDE2Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisvLyBXcml0ZXMgdG8gdGhlIEdFIGJpdHMuCitkZWYgaW50X2FybV9zYXN4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc2FzeCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9hcm1fc2hhZGQxNiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NoYWRkMTYiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3NoYXN4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc2hhc3giPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3Noc2F4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc2hzYXgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3Noc3ViMTYgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zaHN1YjE2Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisvLyBXcml0ZXMgdG8gdGhlIEdFIGJpdHMuCitkZWYgaW50X2FybV9zc2F4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc3NheCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworLy8gV3JpdGVzIHRvIHRoZSBHRSBiaXRzLgorZGVmIGludF9hcm1fc3N1YjE2ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc3N1YjE2Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisvLyBXcml0ZXMgdG8gdGhlIEdFIGJpdHMuCitkZWYgaW50X2FybV91YWRkMTYgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV91YWRkMTYiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKy8vIFdyaXRlcyB0byB0aGUgR0UgYml0cy4KK2RlZiBpbnRfYXJtX3Vhc3ggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV91YXN4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X2FybV91aGFkZDE2ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fdWhhZGQxNiI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fdWhhc3ggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV91aGFzeCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fdWhzYXggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV91aHNheCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fdWhzdWIxNiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3Voc3ViMTYiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3VxYWRkMTYgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV91cWFkZDE2Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV91cWFzeCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3VxYXN4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV91cXNheCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3Vxc2F4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV91cXN1YjE2ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fdXFzdWIxNiI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworLy8gV3JpdGVzIHRvIHRoZSBHRSBiaXRzLgorZGVmIGludF9hcm1fdXNheCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3VzYXgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKy8vIFdyaXRlcyB0byB0aGUgR0UgYml0cy4KK2RlZiBpbnRfYXJtX3VzdWIxNiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3VzdWIxNiI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworCisvLyBQYXJhbGxlbCAxNi1iaXQgbXVsdGlwbGljYXRpb24KK2RlZiBpbnRfYXJtX3NtbGFkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zbWxhZCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3NtbGFkeCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc21sYWR4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fc21sYWxkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zbWxhbGQiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9zbWxhbGR4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zbWxhbGR4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fc21sc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NtbHNkIj4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fc21sc2R4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zbWxzZHgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9zbWxzbGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NtbHNsZCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3NtbHNsZHggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NtbHNsZHgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9zbXVhZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc211YWQiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3NtdWFkeCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc211YWR4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9zbXVzZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc211c2QiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3NtdXNkeCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc211c2R4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIExvYWQsIFN0b3JlIGFuZCBDbGVhciBleGNsdXNpdmUKKworZGVmIGludF9hcm1fbGRyZXggOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fYW55cHRyX3R5XT47CitkZWYgaW50X2FybV9zdHJleCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1fYW55cHRyX3R5XT47CisKK2RlZiBpbnRfYXJtX2xkYWV4IDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2FueXB0cl90eV0+OworZGVmIGludF9hcm1fc3RsZXggOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2FueXB0cl90eV0+OworCitkZWYgaW50X2FybV9jbHJleCA6IEludHJpbnNpYzxbXT47CisKK2RlZiBpbnRfYXJtX3N0cmV4ZCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgIGxsdm1fcHRyX3R5XT47CitkZWYgaW50X2FybV9sZHJleGQgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtsbHZtX3B0cl90eV0+OworCitkZWYgaW50X2FybV9zdGxleGQgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3B0cl90eV0+OworZGVmIGludF9hcm1fbGRhZXhkIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbbGx2bV9wdHJfdHldPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIERhdGEgYmFycmllciBpbnN0cnVjdGlvbnMKK2RlZiBpbnRfYXJtX2RtYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fZG1iIj4sIE1TQnVpbHRpbjwiX19kbWIiPiwKKyAgICAgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XT47CitkZWYgaW50X2FybV9kc2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX2RzYiI+LCBNU0J1aWx0aW48Il9fZHNiIj4sCisgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0+OworZGVmIGludF9hcm1faXNiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9pc2IiPiwgTVNCdWlsdGluPCJfX2lzYiI+LAorICAgICAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHldPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFZGUAorCitkZWYgaW50X2FybV9nZXRfZnBzY3IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX2dldF9mcHNjciI+LAorICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtdPjsKK2RlZiBpbnRfYXJtX3NldF9mcHNjciA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc2V0X2Zwc2NyIj4sCisgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9hcm1fdmN2dHIgICAgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fYW55ZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3ZjdnRydSAgICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2FueWZsb2F0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDb3Byb2Nlc3NvcgorCitkZWYgaW50X2FybV9sZGMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX2xkYyI+LAorICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3B0cl90eV0sIFtdPjsKK2RlZiBpbnRfYXJtX2xkY2wgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX2xkY2wiPiwKKyAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9wdHJfdHldLCBbXT47CitkZWYgaW50X2FybV9sZGMyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9sZGMyIj4sCisgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1fcHRyX3R5XSwgW10+OworZGVmIGludF9hcm1fbGRjMmwgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX2xkYzJsIj4sCisgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1fcHRyX3R5XSwgW10+OworCitkZWYgaW50X2FybV9zdGMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3N0YyI+LAorICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3B0cl90eV0sIFtdPjsKK2RlZiBpbnRfYXJtX3N0Y2wgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3N0Y2wiPiwKKyAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9wdHJfdHldLCBbXT47CitkZWYgaW50X2FybV9zdGMyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zdGMyIj4sIAorICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3B0cl90eV0sIFtdPjsKK2RlZiBpbnRfYXJtX3N0YzJsIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zdGMybCI+LAorICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3B0cl90eV0sIFtdPjsKKworLy8gTW92ZSB0byBjb3Byb2Nlc3NvcgorZGVmIGludF9hcm1fbWNyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9tY3IiPiwKKyAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9hcm1fbWNyMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fbWNyMiI+LAorICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisKKy8vIE1vdmUgZnJvbSBjb3Byb2Nlc3NvcgorZGVmIGludF9hcm1fbXJjIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9tcmMiPiwKKyAgICAgICAgICAgICAgICAgIE1TQnVpbHRpbjwiX01vdmVGcm9tQ29wcm9jZXNzb3IiPiwKKyAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9hcm1fbXJjMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fbXJjMiI+LAorICAgICAgICAgICAgICAgICAgIE1TQnVpbHRpbjwiX01vdmVGcm9tQ29wcm9jZXNzb3IyIj4sCisgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKworLy8gQ29wcm9jZXNzb3IgZGF0YSBwcm9jZXNzaW5nCitkZWYgaW50X2FybV9jZHAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX2NkcCI+LAorICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X2FybV9jZHAyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9jZHAyIj4sCisgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKworLy8gTW92ZSBmcm9tIHR3byByZWdpc3RlcnMgdG8gY29wcm9jZXNzb3IKK2RlZiBpbnRfYXJtX21jcnIgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKK2RlZiBpbnRfYXJtX21jcnIyIDogSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworCitkZWYgaW50X2FybV9tcnJjIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X2FybV9tcnJjMiA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENSQzMyCisKK2RlZiBpbnRfYXJtX2NyYzMyYiAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fY3JjMzJjYiA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9jcmMzMmggIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX2NyYzMyY2ggOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fY3JjMzJ3ICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9jcmMzMmN3IDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgIFtJbnRyTm9NZW1dPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEhJTlQKKworZGVmIGludF9hcm1faGludCA6IEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XT47CitkZWYgaW50X2FybV9kYmcgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVU5EIChyZXNlcnZlZCB1bmRlZmluZWQgc2VxdWVuY2UpCisKK2RlZiBpbnRfYXJtX3VuZGVmaW5lZCA6IEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBZHZhbmNlZCBTSU1EIChORU9OKQorCisvLyBUaGUgZm9sbG93aW5nIGNsYXNzZXMgZG8gbm90IGNvcnJlc3BvbmQgZGlyZWN0bHkgdG8gR0NDIGJ1aWx0aW5zLgorY2xhc3MgTmVvbl8xQXJnX0ludHJpbnNpYworICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0sIFtJbnRyTm9NZW1dPjsKK2NsYXNzIE5lb25fMUFyZ19OYXJyb3dfSW50cmluc2ljCisgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sIFtMTFZNRXh0ZW5kZWRUeXBlPDA+XSwgW0ludHJOb01lbV0+OworY2xhc3MgTmVvbl8yQXJnX0ludHJpbnNpYworICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLCBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2NsYXNzIE5lb25fMkFyZ19OYXJyb3dfSW50cmluc2ljCisgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sIFtMTFZNRXh0ZW5kZWRUeXBlPDA+LCBMTFZNRXh0ZW5kZWRUeXBlPDA+XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworY2xhc3MgTmVvbl8yQXJnX0xvbmdfSW50cmluc2ljCisgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sIFtMTFZNVHJ1bmNhdGVkVHlwZTwwPiwgTExWTVRydW5jYXRlZFR5cGU8MD5dLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitjbGFzcyBOZW9uXzNBcmdfSW50cmluc2ljCisgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworY2xhc3MgTmVvbl8zQXJnX0xvbmdfSW50cmluc2ljCisgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNVHJ1bmNhdGVkVHlwZTwwPiwgTExWTVRydW5jYXRlZFR5cGU8MD5dLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitjbGFzcyBOZW9uX0N2dEZ4VG9GUF9JbnRyaW5zaWMKKyAgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLCBbbGx2bV9hbnlpbnRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworY2xhc3MgTmVvbl9DdnRGUFRvRnhfSW50cmluc2ljCisgIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sIFtsbHZtX2FueWZsb2F0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2NsYXNzIE5lb25fQ3Z0RlB0b0ludF8xQXJnX0ludHJpbnNpYworICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLCBbbGx2bV9hbnl2ZWN0b3JfdHldLCBbSW50ck5vTWVtXT47CisKK2NsYXNzIE5lb25fQ29tcGFyZV9JbnRyaW5zaWMKKyAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwgW2xsdm1fYW55dmVjdG9yX3R5LCBMTFZNTWF0Y2hUeXBlPDE+XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLyBUaGUgdGFibGUgb3BlcmFuZHMgZm9yIFZUQkwgYW5kIFZUQlggY29uc2lzdCBvZiAxIHRvIDQgdjhpOCB2ZWN0b3JzLgorLy8gQmVzaWRlcyB0aGUgdGFibGUsIFZUQkwgaGFzIG9uZSBvdGhlciB2OGk4IGFyZ3VtZW50IGFuZCBWVEJYIGhhcyB0d28uCisvLyBPdmVyYWxsLCB0aGUgY2xhc3NlcyByYW5nZSBmcm9tIDIgdG8gNiB2OGk4IGFyZ3VtZW50cy4KK2NsYXNzIE5lb25fVGJsMkFyZ19JbnRyaW5zaWMKKyAgOiBJbnRyaW5zaWM8W2xsdm1fdjhpOF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX3Y4aThfdHksIGxsdm1fdjhpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2NsYXNzIE5lb25fVGJsM0FyZ19JbnRyaW5zaWMKKyAgOiBJbnRyaW5zaWM8W2xsdm1fdjhpOF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX3Y4aThfdHksIGxsdm1fdjhpOF90eSwgbGx2bV92OGk4X3R5XSwgW0ludHJOb01lbV0+OworY2xhc3MgTmVvbl9UYmw0QXJnX0ludHJpbnNpYworICA6IEludHJpbnNpYzxbbGx2bV92OGk4X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1fdjhpOF90eSwgbGx2bV92OGk4X3R5LCBsbHZtX3Y4aThfdHksIGxsdm1fdjhpOF90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2NsYXNzIE5lb25fVGJsNUFyZ19JbnRyaW5zaWMKKyAgOiBJbnRyaW5zaWM8W2xsdm1fdjhpOF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX3Y4aThfdHksIGxsdm1fdjhpOF90eSwgbGx2bV92OGk4X3R5LCBsbHZtX3Y4aThfdHksCisgICAgICAgICAgICAgICBsbHZtX3Y4aThfdHldLCBbSW50ck5vTWVtXT47CitjbGFzcyBOZW9uX1RibDZBcmdfSW50cmluc2ljCisgIDogSW50cmluc2ljPFtsbHZtX3Y4aThfdHldLAorICAgICAgICAgICAgICBbbGx2bV92OGk4X3R5LCBsbHZtX3Y4aThfdHksIGxsdm1fdjhpOF90eSwgbGx2bV92OGk4X3R5LAorICAgICAgICAgICAgICAgbGx2bV92OGk4X3R5LCBsbHZtX3Y4aThfdHldLCBbSW50ck5vTWVtXT47CisKKy8vIEFyaXRobWV0aWMgb3BzCisKK2xldCBJbnRyUHJvcGVydGllcyA9IFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXSBpbiB7CisKKyAgLy8gVmVjdG9yIEFkZC4KKyAgZGVmIGludF9hcm1fbmVvbl92aGFkZHMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FybV9uZW9uX3ZoYWRkdSA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdnJoYWRkcyA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdnJoYWRkdSA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdnFhZGRzIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92cWFkZHUgOiBOZW9uXzJBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FybV9uZW9uX3ZyYWRkaG4gOiBOZW9uXzJBcmdfTmFycm93X0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgTXVsdGlwbHkuCisgIGRlZiBpbnRfYXJtX25lb25fdm11bHAgOiBOZW9uXzJBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FybV9uZW9uX3ZxZG11bGggOiBOZW9uXzJBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FybV9uZW9uX3ZxcmRtdWxoIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92bXVsbHMgOiBOZW9uXzJBcmdfTG9uZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdm11bGx1IDogTmVvbl8yQXJnX0xvbmdfSW50cmluc2ljOworICBkZWYgaW50X2FybV9uZW9uX3ZtdWxscCA6IE5lb25fMkFyZ19Mb25nX0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92cWRtdWxsIDogTmVvbl8yQXJnX0xvbmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBNYXhpbXVtLgorICBkZWYgaW50X2FybV9uZW9uX3ZtYXhzIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92bWF4dSA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdm1heG5tIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgTWluaW11bS4KKyAgZGVmIGludF9hcm1fbmVvbl92bWlucyA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdm1pbnUgOiBOZW9uXzJBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FybV9uZW9uX3ZtaW5ubSA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFJlY2lwcm9jYWwgU3RlcC4KKyAgZGVmIGludF9hcm1fbmVvbl92cmVjcHMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBSZWNpcHJvY2FsIFNxdWFyZSBSb290IFN0ZXAuCisgIGRlZiBpbnRfYXJtX25lb25fdnJzcXJ0cyA6IE5lb25fMkFyZ19JbnRyaW5zaWM7Cit9CisKKy8vIFZlY3RvciBTdWJ0cmFjdC4KK2RlZiBpbnRfYXJtX25lb25fdmhzdWJzIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdmhzdWJ1IDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnFzdWJzIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnFzdWJ1IDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnJzdWJobiA6IE5lb25fMkFyZ19OYXJyb3dfSW50cmluc2ljOworCisvLyBWZWN0b3IgQWJzb2x1dGUgQ29tcGFyZS4KK2RlZiBpbnRfYXJtX25lb25fdmFjZ2UgOiBOZW9uX0NvbXBhcmVfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92YWNndCA6IE5lb25fQ29tcGFyZV9JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBBYnNvbHV0ZSBEaWZmZXJlbmNlcy4KK2RlZiBpbnRfYXJtX25lb25fdmFiZHMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92YWJkdSA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBQYWlyd2lzZSBBZGQuCitkZWYgaW50X2FybV9uZW9uX3ZwYWRkIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIFBhaXJ3aXNlIEFkZCBMb25nLgorLy8gTm90ZTogVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgb3RoZXIgImxvbmciIE5FT04gaW50cmluc2ljcyBiZWNhdXNlCisvLyB0aGUgcmVzdWx0IHZlY3RvciBoYXMgaGFsZiBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSBzb3VyY2UgdmVjdG9yLgorLy8gVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gdmVjdG9yIHR5cGVzIG11c3QgYmUgc3BlY2lmaWVkIHNlcGFyYXRlbHkuCitkZWYgaW50X2FybV9uZW9uX3ZwYWRkbHMgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwgW2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9uZW9uX3ZwYWRkbHUgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwgW2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vIFZlY3RvciBQYWlyd2lzZSBBZGQgYW5kIEFjY3VtdWxhdGUgTG9uZy4KKy8vIE5vdGU6IFRoaXMgaXMgc2ltaWxhciB0byB2cGFkZGwgYnV0IHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IgYWxzbyBhcHBlYXJzCisvLyBhcyB0aGUgZmlyc3QgYXJndW1lbnQuCitkZWYgaW50X2FybV9uZW9uX3ZwYWRhbHMgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX25lb25fdnBhZGFsdSA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLyBWZWN0b3IgUGFpcndpc2UgTWF4aW11bSBhbmQgTWluaW11bS4KK2RlZiBpbnRfYXJtX25lb25fdnBtYXhzIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnBtYXh1IDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnBtaW5zIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnBtaW51IDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIFNoaWZ0czoKKy8vCisvLyBUaGUgdmFyaW91cyBzYXR1cmF0aW5nIGFuZCByb3VuZGluZyB2ZWN0b3Igc2hpZnQgb3BlcmF0aW9ucyBuZWVkIHRvIGJlCisvLyByZXByZXNlbnRlZCBieSBpbnRyaW5zaWNzIGluIExMVk0sIGFuZCBldmVuIHRoZSBiYXNpYyBWU0hMIHZhcmlhYmxlIHNoaWZ0CisvLyBvcGVyYXRpb24gY2Fubm90IGJlIHNhZmVseSB0cmFuc2xhdGVkIHRvIExMVk0ncyBzaGlmdCBvcGVyYXRvcnMuICBWU0hMIGNhbgorLy8gYmUgdXNlZCBmb3IgYm90aCBsZWZ0IGFuZCByaWdodCBzaGlmdHMsIG9yIGV2ZW4gY29tYmluYXRpb25zIG9mIHRoZSB0d28sCisvLyBkZXBlbmRpbmcgb24gdGhlIHNpZ25zIG9mIHRoZSBzaGlmdCBhbW91bnRzLiAgSXQgYWxzbyBoYXMgd2VsbC1kZWZpbmVkCisvLyBiZWhhdmlvciBmb3Igc2hpZnQgYW1vdW50cyB0aGF0IExMVk0gbGVhdmVzIHVuZGVmaW5lZC4gIE9ubHkgYmFzaWMgc2hpZnRzCisvLyBieSBjb25zdGFudHMgY2FuIGJlIHJlcHJlc2VudGVkIHdpdGggTExWTSdzIHNoaWZ0IG9wZXJhdG9ycy4KKy8vCisvLyBUaGUgc2hpZnQgY291bnRzIGZvciB0aGVzZSBpbnRyaW5zaWNzIGFyZSBhbHdheXMgdmVjdG9ycywgZXZlbiBmb3IgY29uc3RhbnQKKy8vIHNoaWZ0cywgd2hlcmUgdGhlIGNvbnN0YW50IGlzIHJlcGxpY2F0ZWQuICBGb3IgY29uc2lzdGVuY3kgd2l0aCBWU0hMIChhbmQKKy8vIG90aGVyIHZhcmlhYmxlIHNoaWZ0IGluc3RydWN0aW9ucyksIGxlZnQgc2hpZnRzIGhhdmUgcG9zaXRpdmUgc2hpZnQgY291bnRzCisvLyBhbmQgcmlnaHQgc2hpZnRzIGhhdmUgbmVnYXRpdmUgc2hpZnQgY291bnRzLiAgVGhpcyBjb252ZW50aW9uIGlzIGFsc28gdXNlZAorLy8gZm9yIGNvbnN0YW50IHJpZ2h0IHNoaWZ0IGludHJpbnNpY3MsIGFuZCB0byBoZWxwIHByZXNlcnZlIHNhbml0eSwgdGhlCisvLyBpbnRyaW5zaWMgbmFtZXMgdXNlICJzaGlmdCIgaW5zdGVhZCBvZiBlaXRoZXIgInNobCIgb3IgInNociIuICBXaGVyZQorLy8gYXBwbGljYWJsZSwgc2lnbmVkIGFuZCB1bnNpZ25lZCB2ZXJzaW9ucyBvZiB0aGUgaW50cmluc2ljcyBhcmUKKy8vIGRpc3Rpbmd1aXNoZWQgd2l0aCAicyIgYW5kICJ1IiBzdWZmaXhlcy4gIEEgZmV3IE5FT04gc2hpZnQgaW5zdHJ1Y3Rpb25zLAorLy8gc3VjaCBhcyBWUVNITFUsIHRha2Ugc2lnbmVkIG9wZXJhbmRzIGJ1dCBwcm9kdWNlIHVuc2lnbmVkIHJlc3VsdHM7IHRoZXNlCisvLyB1c2UgYSAic3UiIHN1ZmZpeC4KKworLy8gVmVjdG9yIFNoaWZ0LgorZGVmIGludF9hcm1fbmVvbl92c2hpZnRzIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnNoaWZ0dSA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBSb3VuZGluZyBTaGlmdC4KK2RlZiBpbnRfYXJtX25lb25fdnJzaGlmdHMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cnNoaWZ0dSA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3Zyc2hpZnRuIDogTmVvbl8yQXJnX05hcnJvd19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBTYXR1cmF0aW5nIFNoaWZ0LgorZGVmIGludF9hcm1fbmVvbl92cXNoaWZ0cyA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3Zxc2hpZnR1IDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnFzaGlmdHN1IDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnFzaGlmdG5zIDogTmVvbl8yQXJnX05hcnJvd19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3Zxc2hpZnRudSA6IE5lb25fMkFyZ19OYXJyb3dfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cXNoaWZ0bnN1IDogTmVvbl8yQXJnX05hcnJvd19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBTYXR1cmF0aW5nIFJvdW5kaW5nIFNoaWZ0LgorZGVmIGludF9hcm1fbmVvbl92cXJzaGlmdHMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cXJzaGlmdHUgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cXJzaGlmdG5zIDogTmVvbl8yQXJnX05hcnJvd19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZxcnNoaWZ0bnUgOiBOZW9uXzJBcmdfTmFycm93X0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnFyc2hpZnRuc3UgOiBOZW9uXzJBcmdfTmFycm93X0ludHJpbnNpYzsKKworLy8gVmVjdG9yIFNoaWZ0IGFuZCBJbnNlcnQuCitkZWYgaW50X2FybV9uZW9uX3ZzaGlmdGlucyA6IE5lb25fM0FyZ19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBBYnNvbHV0ZSBWYWx1ZSBhbmQgU2F0dXJhdGluZyBBYnNvbHV0ZSBWYWx1ZS4KK2RlZiBpbnRfYXJtX25lb25fdmFicyA6IE5lb25fMUFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZxYWJzIDogTmVvbl8xQXJnX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIFNhdHVyYXRpbmcgTmVnYXRlLgorZGVmIGludF9hcm1fbmVvbl92cW5lZyA6IE5lb25fMUFyZ19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBDb3VudCBMZWFkaW5nIFNpZ24vWmVybyBCaXRzLgorZGVmIGludF9hcm1fbmVvbl92Y2xzIDogTmVvbl8xQXJnX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIFJlY2lwcm9jYWwgRXN0aW1hdGUuCitkZWYgaW50X2FybV9uZW9uX3ZyZWNwZSA6IE5lb25fMUFyZ19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBSZWNpcHJvY2FsIFNxdWFyZSBSb290IEVzdGltYXRlLgorZGVmIGludF9hcm1fbmVvbl92cnNxcnRlIDogTmVvbl8xQXJnX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIENvbnZlcnNpb25zIEJldHdlZW4gRmxvYXRpbmctcG9pbnQgYW5kIEludGVnZXIKK2RlZiBpbnRfYXJtX25lb25fdmN2dGF1IDogTmVvbl9DdnRGUHRvSW50XzFBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92Y3Z0YXMgOiBOZW9uX0N2dEZQdG9JbnRfMUFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZjdnRudSA6IE5lb25fQ3Z0RlB0b0ludF8xQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdmN2dG5zIDogTmVvbl9DdnRGUHRvSW50XzFBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92Y3Z0cHUgOiBOZW9uX0N2dEZQdG9JbnRfMUFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZjdnRwcyA6IE5lb25fQ3Z0RlB0b0ludF8xQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdmN2dG11IDogTmVvbl9DdnRGUHRvSW50XzFBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92Y3Z0bXMgOiBOZW9uX0N2dEZQdG9JbnRfMUFyZ19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBDb252ZXJzaW9ucyBCZXR3ZWVuIEZsb2F0aW5nLXBvaW50IGFuZCBGaXhlZC1wb2ludC4KK2RlZiBpbnRfYXJtX25lb25fdmN2dGZwMmZ4cyA6IE5lb25fQ3Z0RlBUb0Z4X0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdmN2dGZwMmZ4dSA6IE5lb25fQ3Z0RlBUb0Z4X0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdmN2dGZ4czJmcCA6IE5lb25fQ3Z0RnhUb0ZQX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdmN2dGZ4dTJmcCA6IE5lb25fQ3Z0RnhUb0ZQX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIENvbnZlcnNpb25zIEJldHdlZW4gSGFsZi1QcmVjaXNpb24gYW5kIFNpbmdsZS1QcmVjaXNpb24uCitkZWYgaW50X2FybV9uZW9uX3ZjdnRmcDJoZgorICAgIDogSW50cmluc2ljPFtsbHZtX3Y0aTE2X3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9uZW9uX3ZjdnRoZjJmcAorICAgIDogSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRpMTZfdHldLCBbSW50ck5vTWVtXT47CisKKy8vIE5hcnJvd2luZyBTYXR1cmF0aW5nIFZlY3RvciBNb3Zlcy4KK2RlZiBpbnRfYXJtX25lb25fdnFtb3ZucyA6IE5lb25fMUFyZ19OYXJyb3dfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cW1vdm51IDogTmVvbl8xQXJnX05hcnJvd19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZxbW92bnN1IDogTmVvbl8xQXJnX05hcnJvd19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBUYWJsZSBMb29rdXAuCisvLyBUaGUgZmlyc3QgMS00IGFyZ3VtZW50cyBhcmUgdGhlIHRhYmxlLgorZGVmIGludF9hcm1fbmVvbl92dGJsMSA6IE5lb25fVGJsMkFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3Z0YmwyIDogTmVvbl9UYmwzQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnRibDMgOiBOZW9uX1RibDRBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92dGJsNCA6IE5lb25fVGJsNUFyZ19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBUYWJsZSBFeHRlbnNpb24uCisvLyBTb21lIGVsZW1lbnRzIG9mIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IgbWF5IG5vdCBiZSB1cGRhdGVkLCBzbyB0aGUgb3JpZ2luYWwKKy8vIHZhbHVlIG9mIHRoYXQgdmVjdG9yIGlzIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQuICBUaGUgbmV4dCAxLTQKKy8vIGFyZ3VtZW50cyBhZnRlciB0aGF0IGFyZSB0aGUgdGFibGUuCitkZWYgaW50X2FybV9uZW9uX3Z0YngxIDogTmVvbl9UYmwzQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnRieDIgOiBOZW9uX1RibDRBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92dGJ4MyA6IE5lb25fVGJsNUFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3Z0Yng0IDogTmVvbl9UYmw2QXJnX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIFJvdW5kaW5nCitkZWYgaW50X2FybV9uZW9uX3ZyaW50biA6IE5lb25fMUFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZyaW50eCA6IE5lb25fMUFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZyaW50YSA6IE5lb25fMUFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZyaW50eiA6IE5lb25fMUFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZyaW50bSA6IE5lb25fMUFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZyaW50cCA6IE5lb25fMUFyZ19JbnRyaW5zaWM7CisKKy8vIERlLWludGVybGVhdmluZyB2ZWN0b3IgbG9hZHMgZnJvbSBOLWVsZW1lbnQgc3RydWN0dXJlcy4KKy8vIFNvdXJjZSBvcGVyYW5kcyBhcmUgdGhlIGFkZHJlc3MgYW5kIGFsaWdubWVudC4KK2RlZiBpbnRfYXJtX25lb25fdmxkMSA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXB0cl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfYXJtX25lb25fdmxkMiA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXB0cl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfYXJtX25lb25fdmxkMyA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXB0cl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfYXJtX25lb25fdmxkNCA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXB0cl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworLy8gVmVjdG9yIGxvYWQgTi1lbGVtZW50IHN0cnVjdHVyZSB0byBvbmUgbGFuZS4KKy8vIFNvdXJjZSBvcGVyYW5kcyBhcmU6IHRoZSBhZGRyZXNzLCB0aGUgTiBpbnB1dCB2ZWN0b3JzIChzaW5jZSBvbmx5IG9uZQorLy8gbGFuZSBpcyBhc3NpZ25lZCksIHRoZSBsYW5lIG51bWJlciwgYW5kIHRoZSBhbGlnbm1lbnQuCitkZWYgaW50X2FybV9uZW9uX3ZsZDJsYW5lIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eSwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXB0cl90eSwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CitkZWYgaW50X2FybV9uZW9uX3ZsZDNsYW5lIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eSwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHksIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9hcm1fbmVvbl92bGQ0bGFuZSA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKy8vIEludGVybGVhdmluZyB2ZWN0b3Igc3RvcmVzIGZyb20gTi1lbGVtZW50IHN0cnVjdHVyZXMuCisvLyBTb3VyY2Ugb3BlcmFuZHMgYXJlOiB0aGUgYWRkcmVzcywgdGhlIE4gdmVjdG9ycywgYW5kIHRoZSBhbGlnbm1lbnQuCitkZWYgaW50X2FybV9uZW9uX3ZzdDEgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5LCBsbHZtX2FueXZlY3Rvcl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfYXJtX25lb25fdnN0MiA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHksIGxsdm1fYW55dmVjdG9yX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDE+LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CitkZWYgaW50X2FybV9uZW9uX3ZzdDMgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5LCBsbHZtX2FueXZlY3Rvcl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwxPiwgTExWTU1hdGNoVHlwZTwxPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfYXJtX25lb25fdnN0NCA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHksIGxsdm1fYW55dmVjdG9yX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDE+LCBMTFZNTWF0Y2hUeXBlPDE+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDE+LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKKy8vIFZlY3RvciBzdG9yZSBOLWVsZW1lbnQgc3RydWN0dXJlIGZyb20gb25lIGxhbmUuCisvLyBTb3VyY2Ugb3BlcmFuZHMgYXJlOiB0aGUgYWRkcmVzcywgdGhlIE4gdmVjdG9ycywgdGhlIGxhbmUgbnVtYmVyLCBhbmQKKy8vIHRoZSBhbGlnbm1lbnQuCitkZWYgaW50X2FybV9uZW9uX3ZzdDJsYW5lIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHksIGxsdm1fYW55dmVjdG9yX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwxPiwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9hcm1fbmVvbl92c3QzbGFuZSA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5LCBsbHZtX2FueXZlY3Rvcl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MT4sIExMVk1NYXRjaFR5cGU8MT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfYXJtX25lb25fdnN0NGxhbmUgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXB0cl90eSwgbGx2bV9hbnl2ZWN0b3JfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDE+LCBMTFZNTWF0Y2hUeXBlPDE+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwxPiwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworCisvLyBWZWN0b3IgYml0d2lzZSBzZWxlY3QuCitkZWYgaW50X2FybV9uZW9uX3Zic2wgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworCisvLyBDcnlwdG8gaW5zdHJ1Y3Rpb25zCitjbGFzcyBBRVNfMUFyZ19JbnRyaW5zaWMgOiBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworY2xhc3MgQUVTXzJBcmdfSW50cmluc2ljIDogSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitjbGFzcyBTSEFfMUFyZ19JbnRyaW5zaWMgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitjbGFzcyBTSEFfMkFyZ19JbnRyaW5zaWMgOiBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitjbGFzcyBTSEFfM0FyZ19pMzJfSW50cmluc2ljIDogSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworY2xhc3MgU0hBXzNBcmdfdjRpMzJfSW50cmluc2ljIDogSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9hcm1fbmVvbl9hZXNkIDogQUVTXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl9hZXNlIDogQUVTXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl9hZXNpbWMgOiBBRVNfMUFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX2Flc21jIDogQUVTXzFBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl9zaGExaCA6IFNIQV8xQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fc2hhMXN1MSA6IFNIQV8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fc2hhMjU2c3UwIDogU0hBXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl9zaGExYyA6IFNIQV8zQXJnX2kzMl9JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3NoYTFtIDogU0hBXzNBcmdfaTMyX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fc2hhMXAgOiBTSEFfM0FyZ19pMzJfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl9zaGExc3UwOiBTSEFfM0FyZ192NGkzMl9JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3NoYTI1Nmg6IFNIQV8zQXJnX3Y0aTMyX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fc2hhMjU2aDI6IFNIQV8zQXJnX3Y0aTMyX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fc2hhMjU2c3UxOiBTSEFfM0FyZ192NGkzMl9JbnRyaW5zaWM7CisKK30gLy8gZW5kIFRhcmdldFByZWZpeApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzQlBGLnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzQlBGLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZWNhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NCUEYudGQKQEAgLTAsMCArMSwyNCBAQAorLy89PT0tIEludHJpbnNpY3NCUEYudGQgLSBEZWZpbmVzIEJQRiBpbnRyaW5zaWNzIC0tLS0tLS0tLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgb2YgdGhlIEJQRi1zcGVjaWZpYyBpbnRyaW5zaWNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFNwZWNpYWxpemVkIGxvYWRzIGZyb20gcGFja2V0CitsZXQgVGFyZ2V0UHJlZml4ID0gImJwZiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS5icGYuIgorICBkZWYgaW50X2JwZl9sb2FkX2J5dGUgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYnBmX2xvYWRfYnl0ZSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2k2NF90eV0sIFtJbnRyUmVhZE1lbV0+OworICBkZWYgaW50X2JwZl9sb2FkX2hhbGYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYnBmX2xvYWRfaGFsZiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2k2NF90eV0sIFtJbnRyUmVhZE1lbV0+OworICBkZWYgaW50X2JwZl9sb2FkX3dvcmQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYnBmX2xvYWRfd29yZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2k2NF90eV0sIFtJbnRyUmVhZE1lbV0+OworICBkZWYgaW50X2JwZl9wc2V1ZG8gOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYnBmX3BzZXVkbyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0+OworfQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzSGV4YWdvbi50ZCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc0hleGFnb24udGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVmNDIxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc0hleGFnb24udGQKQEAgLTAsMCArMSwxMDk3NSBAQAorLy89PT0tIEludHJpbnNpY3NIZXhhZ29uLnRkIC0gRGVmaW5lcyBIZXhhZ29uIGludHJpbnNpY3MgLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFsbCBvZiB0aGUgSGV4YWdvbi1zcGVjaWZpYyBpbnRyaW5zaWNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBEZWZpbml0aW9ucyBmb3IgYWxsIEhleGFnb24gaW50cmluc2ljcy4KKy8vCisvLyBBbGwgSGV4YWdvbiBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0uaGV4YWdvbi4iLgorbGV0IFRhcmdldFByZWZpeCA9ICJoZXhhZ29uIiBpbiB7CisgIC8vLyBIZXhhZ29uX0ludHJpbnNpYyAtIEJhc2UgY2xhc3MgZm9yIGFsbCBIZXhhZ29uIGludHJpbnNpY3MuCisgIGNsYXNzIEhleGFnb25fSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXgsIGxpc3Q8TExWTVR5cGU+IHJldF90eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Q8TExWTVR5cGU+IHBhcmFtX3R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDxJbnRyaW5zaWNQcm9wZXJ0eT4gcHJvcGVydGllcz4KKyAgICA6IEdDQ0J1aWx0aW48IXN0cmNvbmNhdCgiX19idWlsdGluXyIsIEdDQ0ludFN1ZmZpeCk+LAorICAgICAgSW50cmluc2ljPHJldF90eXBlcywgcGFyYW1fdHlwZXMsIHByb3BlcnRpZXM+OworCisgIC8vLyBIZXhhZ29uX05vbkdDQ19JbnRyaW5zaWMgLSBCYXNlIGNsYXNzIGZvciBiaXRjb2RlIGNvbnZlcnRpYmxlIEhleGFnb24KKyAgLy8vIGludHJpbnNpY3MuCisgIGNsYXNzIEhleGFnb25fTm9uR0NDX0ludHJpbnNpYzxsaXN0PExMVk1UeXBlPiByZXRfdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0PExMVk1UeXBlPiBwYXJhbV90eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Q8SW50cmluc2ljUHJvcGVydHk+IHByb3BlcnRpZXM+CisgICAgOiBJbnRyaW5zaWM8cmV0X3R5cGVzLCBwYXJhbV90eXBlcywgcHJvcGVydGllcz47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMShRSV9mdHlwZV9NRU0sQlRfQk9PTCxCVF9QVFIpIC0+CisvLyBIZXhhZ29uX3FpX21lbV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3FpX21lbV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kxX3R5XSwgW2xsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzEoSElfZnR5cGVfU0ksQlRfSTE2LEJUX0lOVCkgLT4KKy8vIEhleGFnb25faGlfc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9oaV9zaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kxNl90eV0sIFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8xKFNJX2Z0eXBlX1NJLEJUX0lOVCxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMShESV9mdHlwZV9TSSxCVF9MT05HTE9ORyxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX2RpX3NpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fZGlfc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHldLCBbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMShTSV9mdHlwZV9ESSxCVF9JTlQsQlRfTE9OR0xPTkcpIC0+CisvLyBIZXhhZ29uX3NpX2RpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHldLCBbbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMShESV9mdHlwZV9ESSxCVF9MT05HTE9ORyxCVF9MT05HTE9ORykgLT4KKy8vIEhleGFnb25fZGlfZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kaV9kaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8xKFFJX2Z0eXBlX1FJLEJUX0JPT0wsQlRfQk9PTCkgLT4KKy8vIEhleGFnb25fcWlfcWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9xaV9xaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kxX3R5XSwgW2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzEoUUlfZnR5cGVfU0ksQlRfQk9PTCxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX3FpX3NpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fcWlfc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMV90eV0sIFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8xKERJX2Z0eXBlX1FJLEJUX0xPTkdMT05HLEJUX0JPT0wpIC0+CisvLyBIZXhhZ29uX2RpX3FpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fZGlfcWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHldLCBbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMShTSV9mdHlwZV9RSSxCVF9JTlQsQlRfQk9PTCkgLT4KKy8vIEhleGFnb25fc2lfcWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zaV9xaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8yKFFJX2Z0eXBlX1NJU0ksQlRfQk9PTCxCVF9JTlQsQlRfSU5UKSAtPgorLy8gSGV4YWdvbl9xaV9zaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fcWlfc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kxX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8yKHZvaWRfZnR5cGVfU0lTSSxCVF9WT0lELEJUX0lOVCxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX3ZvaWRfc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3ZvaWRfc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3ZvaWRfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzIoU0lfZnR5cGVfU0lTSSxCVF9JTlQsQlRfSU5ULEJUX0lOVCkgLT4KKy8vIEhleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzIoVVNJX2Z0eXBlX1NJU0ksQlRfVUlOVCxCVF9JTlQsQlRfSU5UKSAtPgorLy8gSGV4YWdvbl91c2lfc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3VzaV9zaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8yKERJX2Z0eXBlX1NJU0ksQlRfTE9OR0xPTkcsQlRfSU5ULEJUX0lOVCkgLT4KKy8vIEhleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzIoVURJX2Z0eXBlX1NJU0ksQlRfVUxPTkdMT05HLEJUX0lOVCxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX3VkaV9zaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fdWRpX3Npc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzIoRElfZnR5cGVfU0lESSxCVF9MT05HTE9ORyxCVF9JTlQsQlRfTE9OR0xPTkcpIC0+CisvLyBIZXhhZ29uX2RpX3NpZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kaV9zaWRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8yKERJX2Z0eXBlX0RJU0ksQlRfTE9OR0xPTkcsQlRfTE9OR0xPTkcsQlRfSU5UKSAtPgorLy8gSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fZGlfZGlzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMihTSV9mdHlwZV9TSURJLEJUX0lOVCxCVF9JTlQsQlRfTE9OR0xPTkcpIC0+CisvLyBIZXhhZ29uX3NpX3NpZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zaV9zaWRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8yKFNJX2Z0eXBlX0RJREksQlRfSU5ULEJUX0xPTkdMT05HLEJUX0xPTkdMT05HKSAtPgorLy8gSGV4YWdvbl9zaV9kaWRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfZGlkaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMihESV9mdHlwZV9ESURJLEJUX0xPTkdMT05HLEJUX0xPTkdMT05HLEJUX0xPTkdMT05HKSAtPgorLy8gSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMihVRElfZnR5cGVfRElESSxCVF9VTE9OR0xPTkcsQlRfTE9OR0xPTkcsQlRfTE9OR0xPTkcpIC0+CisvLyBIZXhhZ29uX3VkaV9kaWRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fdWRpX2RpZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzIoU0lfZnR5cGVfRElTSSxCVF9JTlQsQlRfTE9OR0xPTkcsQlRfSU5UKSAtPgorLy8gSGV4YWdvbl9zaV9kaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfZGlzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMihRSV9mdHlwZV9ESURJLEJUX0JPT0wsQlRfTE9OR0xPTkcsQlRfTE9OR0xPTkcpIC0+CisvLyBIZXhhZ29uX3FpX2RpZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9xaV9kaWRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTFfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzIoUUlfZnR5cGVfU0lESSxCVF9CT09MLEJUX0lOVCxCVF9MT05HTE9ORykgLT4KKy8vIEhleGFnb25fcWlfZGlkaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3FpX3NpZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMV90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMihRSV9mdHlwZV9ESVNJLEJUX0JPT0wsQlRfTE9OR0xPTkcsQlRfSU5UKSAtPgorLy8gSGV4YWdvbl9xaV9kaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fcWlfZGlzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kxX3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8yKFFJX2Z0eXBlX1FJUUksQlRfQk9PTCxCVF9CT09MLEJUX0JPT0wpIC0+CisvLyBIZXhhZ29uX3FpX3FpcWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9xaV9xaXFpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTFfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzIoUUlfZnR5cGVfUUlRSVFJLEJUX0JPT0wsQlRfQk9PTCxCVF9CT09MKSAtPgorLy8gSGV4YWdvbl9xaV9xaXFpcWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9xaV9xaXFpcWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMV90eV0sIFtsbHZtX2kxX3R5LCBsbHZtX2kxX3R5LCBsbHZtX2kxX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzIoU0lfZnR5cGVfUUlRSSxCVF9JTlQsQlRfQk9PTCxCVF9CT09MKSAtPgorLy8gSGV4YWdvbl9zaV9xaXFpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfcWlxaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMihTSV9mdHlwZV9RSVNJLEJUX0lOVCxCVF9CT09MLEJUX0lOVCkgLT4KKy8vIEhleGFnb25fc2lfcWlzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3NpX3Fpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHldLCBbbGx2bV9pMV90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMyh2b2lkX2Z0eXBlX1NJU0lTSSxCVF9WT0lELEJUX0lOVCxCVF9JTlQsQlRfSU5UKSAtPgorLy8gSGV4YWdvbl92b2lkX3Npc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3ZvaWRfc2lzaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdm9pZF90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8zKFNJX2Z0eXBlX1NJU0lTSSxCVF9JTlQsQlRfSU5ULEJUX0lOVCxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8zKERJX2Z0eXBlX1NJU0lTSSxCVF9MT05HTE9ORyxCVF9JTlQsQlRfSU5ULEJUX0lOVCkgLT4KKy8vIEhleGFnb25fZGlfc2lzaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fZGlfc2lzaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzMoU0lfZnR5cGVfRElTSVNJLEJUX0lOVCxCVF9MT05HTE9ORyxCVF9JTlQsQlRfSU5UKSAtPgorLy8gSGV4YWdvbl9zaV9kaXNpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zaV9kaXNpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMyhESV9mdHlwZV9ESVNJU0ksQlRfTE9OR0xPTkcsQlRfTE9OR0xPTkcsQlRfSU5ULEJUX0lOVCkgLT4KKy8vIEhleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzMoU0lfZnR5cGVfU0lESVNJLEJUX0lOVCxCVF9JTlQsQlRfTE9OR0xPTkcsQlRfSU5UKSAtPgorLy8gSGV4YWdvbl9zaV9zaWRpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zaV9zaWRpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMyhESV9mdHlwZV9ESURJU0ksQlRfTE9OR0xPTkcsQlRfTE9OR0xPTkcsCisvLyAgICAgICAgICAgICAgICAgICAgIEJUX0xPTkdMT05HLEJUX0lOVCkgLT4KKy8vIEhleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzMoU0lfZnR5cGVfU0lESURJLEJUX0lOVCxCVF9JTlQsQlRfTE9OR0xPTkcsQlRfTE9OR0xPTkcpIC0+CisvLyBIZXhhZ29uX3NpX3NpZGlkaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3NpX3NpZGlkaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8zKERJX2Z0eXBlX0RJRElESSxCVF9MT05HTE9ORyxCVF9MT05HTE9ORyxCVF9MT05HTE9ORywKKy8vICAgICAgICAgICAgICAgICAgICAgQlRfTE9OR0xPTkcpIC0+CisvLyBIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8zKFNJX2Z0eXBlX1NJU0lESSxCVF9JTlQsQlRfSU5ULEJUX0lOVCxCVF9MT05HTE9ORykgLT4KKy8vIEhleGFnb25fc2lfc2lzaWRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfc2lzaWRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzMoU0lfZnR5cGVfUUlTSVNJLEJUX0lOVCxCVF9CT09MLEJUX0lOVCxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX3NpX3Fpc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3NpX3Fpc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8zKERJX2Z0eXBlX1FJU0lTSSxCVF9MT05HTE9ORyxCVF9CT09MLEJUX0lOVCxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX2RpX3Fpc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX2RpX3Fpc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eV0sIFtsbHZtX2kxX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzMoRElfZnR5cGVfUUlESURJLEJUX0xPTkdMT05HLEJUX0JPT0wsQlRfTE9OR0xPTkcsCisvLyAgICAgICAgICAgICAgICAgICAgIEJUX0xPTkdMT05HKSAtPgorLy8gSGV4YWdvbl9kaV9xaWRpZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kaV9xaWRpZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMyhESV9mdHlwZV9ESURJUUksQlRfTE9OR0xPTkcsQlRfTE9OR0xPTkcsQlRfTE9OR0xPTkcsCisvLyAgICAgICAgICAgICAgICAgICAgIEJUX0JPT0wpIC0+CisvLyBIZXhhZ29uX2RpX2RpZGlxaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX2RpX2RpZGlxaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV80KFNJX2Z0eXBlX1NJU0lTSVNJLEJUX0lOVCxCVF9JTlQsQlRfSU5ULEJUX0lOVCxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX3NpX3Npc2lzaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfc2lzaXNpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzQoRElfZnR5cGVfRElESVNJU0ksQlRfTE9OR0xPTkcsQlRfTE9OR0xPTkcsCisvLyAgICAgICAgICAgICAgICAgICAgIEJUX0xPTkdMT05HLEJUX0lOVCxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX2RpX2RpZGlzaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fZGlfZGlkaXNpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitjbGFzcyBIZXhhZ29uX21lbV9tZW1tZW1zaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCitjbGFzcyBIZXhhZ29uX21lbV9tZW1zaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbV0+OworCitjbGFzcyBIZXhhZ29uX21lbV9tZW1kaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbV0+OworCitjbGFzcyBIZXhhZ29uX21lbV9tZW1tZW1zaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCitjbGFzcyBIZXhhZ29uX21lbV9tZW1zaXNpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbV0+OworCitjbGFzcyBIZXhhZ29uX21lbV9tZW1kaXNpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbV0+OworCitjbGFzcyBIZXhhZ29uX3YyNTZfdjI1NnYyNTZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKKy8vCisvLyBIZXhhZ29uX3NmX2RmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2Zfc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIFRocm93c10+OworLy8KKy8vIEhleGFnb25fc2ZfZGZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zZl9kZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIEhleGFnb25fc2ZfZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zZl9kaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIEhleGFnb25fZGZfc2ZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kZl9zZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIEhleGFnb25fZGlfc2ZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kaV9zZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIEhleGFnb25fc2Zfc2ZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zZl9zZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gSGV4YWdvbl9zaV9zZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3NpX3NmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gSGV4YWdvbl9zaV9kZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3NpX2RmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIEhleGFnb25fc2Zfc2ZzZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3NmX3Nmc2ZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgVGhyb3dzXT47CisvLworLy8gSGV4YWdvbl9zaV9zZnNmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfc2ZzZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgVGhyb3dzXT47CisvLworLy8gSGV4YWdvbl9zaV9zZnNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfc2ZzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIFRocm93c10+OworLy8KKy8vIEhleGFnb25fcWlfc2ZxaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3FpX3NmcWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMV90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBIZXhhZ29uX3NmX3Nmc2ZzZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3NmX3Nmc2ZzZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBUaHJvd3NdPjsKKy8vCisvLyBIZXhhZ29uX3NmX3Nmc2ZzZnFpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2Zfc2ZzZnNmcWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBUaHJvd3NdPjsKKy8vCisvLyBIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX2RpX2RpZGlkaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBIZXhhZ29uX2RmX3NpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fZGZfc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBUaHJvd3NdPjsKKy8vCisvLyBIZXhhZ29uX2RmX2RpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fZGZfZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gSGV4YWdvbl9kaV9kZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX2RpX2RmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5XSwgW2xsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIEhleGFnb25fZGZfZGZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kZl9kZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBIZXhhZ29uX2RmX2RmZGZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kZl9kZmRmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5LCBsbHZtX2RvdWJsZV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIFRocm93c10+OworLy8KKy8vIEhleGFnb25fc2lfZGZkZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3NpX2RmZGZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHldLCBbbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgVGhyb3dzXT47CisvLworLy8gSGV4YWdvbl9zaV9kZnNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfZGZzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2RvdWJsZV90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBUaHJvd3NdPjsKKy8vCisvLworLy8gSGV4YWdvbl9kZl9kZmRmZGZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kZl9kZmRmZGZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9kb3VibGVfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBUaHJvd3NdPjsKKy8vCisvLyBIZXhhZ29uX2RmX2RmZGZkZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX2RmX2RmZGZkZnFpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5LCBsbHZtX2RvdWJsZV90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fZG91YmxlX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIFRocm93c10+OworCisKKy8vIFRoaXMgb25lIGJlbG93IHdpbGwgbm90IGJlIGF1dG8tZ2VuZXJhdGVkLAorLy8gc28gbWFrZSBzdXJlLCB5b3UgZG9uJ3Qgb3ZlcndyaXRlIHRoaXMgb25lLgorLy8KKy8vIEJVSUxUSU5fSU5GT19OT05DT05TVChjaXJjX2xkZCxQVFJfZnR5cGVfUFRSUFRSU0lTSSw0KQorLy8KK2RlZiBpbnRfaGV4YWdvbl9jaXJjX2xkZCA6CitIZXhhZ29uX21lbV9tZW1tZW1zaXNpX0ludHJpbnNpYzwiY2lyY19sZGQiPjsKKy8vCisvLyBCVUlMVElOX0lORk9fTk9OQ09OU1QoY2lyY19sZHcsUFRSX2Z0eXBlX1BUUlBUUlNJU0ksNCkKKy8vCitkZWYgaW50X2hleGFnb25fY2lyY19sZHcgOgorSGV4YWdvbl9tZW1fbWVtbWVtc2lzaV9JbnRyaW5zaWM8ImNpcmNfbGR3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPX05PTkNPTlNUKGNpcmNfbGRoLFBUUl9mdHlwZV9QVFJQVFJTSVNJLDQpCisvLworZGVmIGludF9oZXhhZ29uX2NpcmNfbGRoIDoKK0hleGFnb25fbWVtX21lbW1lbXNpc2lfSW50cmluc2ljPCJjaXJjX2xkaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GT19OT05DT05TVChjaXJjX2xkdWgsUFRSX2Z0eXBlX1BUUlBUUlNJU0ksNCkKKy8vCitkZWYgaW50X2hleGFnb25fY2lyY19sZHVoIDoKK0hleGFnb25fbWVtX21lbW1lbXNpc2lfSW50cmluc2ljPCJjaXJjX2xkdWgiPjsKKy8vCisvLyBCVUlMVElOX0lORk9fTk9OQ09OU1QoY2lyY19sZGIsUFRSX2Z0eXBlX1BUUlBUUlNJU0ksNCkKKy8vCitkZWYgaW50X2hleGFnb25fY2lyY19sZGIgOgorSGV4YWdvbl9tZW1fbWVtbWVtc2lzaV9JbnRyaW5zaWM8ImNpcmNfbGRiIj47CisvLworLy8gQlVJTFRJTl9JTkZPX05PTkNPTlNUKGNpcmNfbGR1YixQVFJfZnR5cGVfUFRSUFRSU0lTSSw0KQorLy8KK2RlZiBpbnRfaGV4YWdvbl9jaXJjX2xkdWIgOgorSGV4YWdvbl9tZW1fbWVtbWVtc2lzaV9JbnRyaW5zaWM8ImNpcmNfbGR1YiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPX05PTkNPTlNUKGNpcmNfc3RkLFBUUl9mdHlwZV9QVFJESVNJU0ksNCkKKy8vCitkZWYgaW50X2hleGFnb25fY2lyY19zdGQgOgorSGV4YWdvbl9tZW1fbWVtZGlzaXNpX0ludHJpbnNpYzwiY2lyY19zdGQiPjsKKy8vCisvLyBCVUlMVElOX0lORk9fTk9OQ09OU1QoY2lyY19zdHcsUFRSX2Z0eXBlX1BUUlNJU0lTSSw0KQorLy8KK2RlZiBpbnRfaGV4YWdvbl9jaXJjX3N0dyA6CitIZXhhZ29uX21lbV9tZW1zaXNpc2lfSW50cmluc2ljPCJjaXJjX3N0dyI+OworLy8KKy8vIEJVSUxUSU5fSU5GT19OT05DT05TVChjaXJjX3N0aCxQVFJfZnR5cGVfUFRSU0lTSVNJLDQpCisvLworZGVmIGludF9oZXhhZ29uX2NpcmNfc3RoIDoKK0hleGFnb25fbWVtX21lbXNpc2lzaV9JbnRyaW5zaWM8ImNpcmNfc3RoIj47CisvLworLy8gQlVJTFRJTl9JTkZPX05PTkNPTlNUKGNpcmNfc3RoaGksUFRSX2Z0eXBlX1BUUlNJU0lTSSw0KQorLy8KK2RlZiBpbnRfaGV4YWdvbl9jaXJjX3N0aGhpIDoKK0hleGFnb25fbWVtX21lbXNpc2lzaV9JbnRyaW5zaWM8ImNpcmNfc3RoaGkiPjsKKy8vCisvLyBCVUlMVElOX0lORk9fTk9OQ09OU1QoY2lyY19zdGIsUFRSX2Z0eXBlX1BUUlNJU0lTSSw0KQorLy8KK2RlZiBpbnRfaGV4YWdvbl9jaXJjX3N0YiA6CitIZXhhZ29uX21lbV9tZW1zaXNpc2lfSW50cmluc2ljPCJjaXJjX3N0YiI+OworCisKK2RlZiBpbnRfaGV4YWdvbl9tbTI1NmlfdmFkZHcgOgorSGV4YWdvbl92MjU2X3YyNTZ2MjU2X0ludHJpbnNpYzwiX21tMjU2aV92YWRkdyI+OworCisKKy8vIFRoaXMgb25lIGFib3ZlIHdpbGwgbm90IGJlIGF1dG8tZ2VuZXJhdGVkLAorLy8gc28gbWFrZSBzdXJlLCB5b3UgZG9uJ3Qgb3ZlcndyaXRlIHRoaXMgb25lLgorLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2NtcGVxLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzJfY21wZXEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9jbXBlcSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2NtcGd0LFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzJfY21wZ3QgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9jbXBndCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2NtcGd0dSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0MyX2NtcGd0dSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0MyX2NtcGd0dSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2NtcGVxcCxRSV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0MyX2NtcGVxcCA6CitIZXhhZ29uX3NpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0MyX2NtcGVxcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2NtcGd0cCxRSV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0MyX2NtcGd0cCA6CitIZXhhZ29uX3NpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0MyX2NtcGd0cCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2NtcGd0dXAsUUlfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9jbXBndHVwIDoKK0hleGFnb25fc2lfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfY21wZ3R1cCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkE0X3JjbXBlcWksU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9yY21wZXFpIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfcmNtcGVxaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkE0X3JjbXBuZXFpLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfcmNtcG5lcWkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9yY21wbmVxaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkE0X3JjbXBlcSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3JjbXBlcSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X3JjbXBlcSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkE0X3JjbXBuZXEsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9yY21wbmVxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfcmNtcG5lcSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2JpdHNzZXQsUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9iaXRzc2V0IDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfYml0c3NldCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2JpdHNjbHIsUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9iaXRzY2xyIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfYml0c2NsciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkM0X25iaXRzc2V0LFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzRfbmJpdHNzZXQgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DNF9uYml0c3NldCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkM0X25iaXRzY2xyLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzRfbmJpdHNjbHIgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DNF9uYml0c2NsciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2NtcGVxaSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0MyX2NtcGVxaSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0MyX2NtcGVxaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2NtcGd0aSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0MyX2NtcGd0aSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0MyX2NtcGd0aSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2NtcGd0dWksUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9jbXBndHVpIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfY21wZ3R1aSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2NtcGdlaSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0MyX2NtcGdlaSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0MyX2NtcGdlaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2NtcGdldWksUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9jbXBnZXVpIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfY21wZ2V1aSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2NtcGx0LFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzJfY21wbHQgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9jbXBsdCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2NtcGx0dSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0MyX2NtcGx0dSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0MyX2NtcGx0dSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2JpdHNjbHJpLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzJfYml0c2NscmkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9iaXRzY2xyaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkM0X25iaXRzY2xyaSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0M0X25iaXRzY2xyaSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0M0X25iaXRzY2xyaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkM0X2NtcG5lcWksUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DNF9jbXBuZXFpIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzRfY21wbmVxaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkM0X2NtcGx0ZWksUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DNF9jbXBsdGVpIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzRfY21wbHRlaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkM0X2NtcGx0ZXVpLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzRfY21wbHRldWkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DNF9jbXBsdGV1aSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkM0X2NtcG5lcSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0M0X2NtcG5lcSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0M0X2NtcG5lcSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkM0X2NtcGx0ZSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0M0X2NtcGx0ZSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0M0X2NtcGx0ZSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkM0X2NtcGx0ZXUsUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DNF9jbXBsdGV1IDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzRfY21wbHRldSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2FuZCxRSV9mdHlwZV9RSVFJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0MyX2FuZCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0MyX2FuZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX29yLFFJX2Z0eXBlX1FJUUksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzJfb3IgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9vciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX3hvcixRSV9mdHlwZV9RSVFJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0MyX3hvciA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0MyX3hvciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2FuZG4sUUlfZnR5cGVfUUlRSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9hbmRuIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfYW5kbiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX25vdCxRSV9mdHlwZV9RSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9ub3QgOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfbm90Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfb3JuLFFJX2Z0eXBlX1FJUUksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzJfb3JuIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfb3JuIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzRfYW5kX2FuZCxRSV9mdHlwZV9RSVFJUUksMykKKy8vCitkZWYgaW50X2hleGFnb25fQzRfYW5kX2FuZCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzRfYW5kX2FuZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkM0X2FuZF9vcixRSV9mdHlwZV9RSVFJUUksMykKKy8vCitkZWYgaW50X2hleGFnb25fQzRfYW5kX29yIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DNF9hbmRfb3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5DNF9vcl9hbmQsUUlfZnR5cGVfUUlRSVFJLDMpCisvLworZGVmIGludF9oZXhhZ29uX0M0X29yX2FuZCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzRfb3JfYW5kIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzRfb3Jfb3IsUUlfZnR5cGVfUUlRSVFJLDMpCisvLworZGVmIGludF9oZXhhZ29uX0M0X29yX29yIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DNF9vcl9vciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkM0X2FuZF9hbmRuLFFJX2Z0eXBlX1FJUUlRSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DNF9hbmRfYW5kbiA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzRfYW5kX2FuZG4iPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5DNF9hbmRfb3JuLFFJX2Z0eXBlX1FJUUlRSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DNF9hbmRfb3JuIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DNF9hbmRfb3JuIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzRfb3JfYW5kbixRSV9mdHlwZV9RSVFJUUksMykKKy8vCitkZWYgaW50X2hleGFnb25fQzRfb3JfYW5kbiA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzRfb3JfYW5kbiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkM0X29yX29ybixRSV9mdHlwZV9RSVFJUUksMykKKy8vCitkZWYgaW50X2hleGFnb25fQzRfb3Jfb3JuIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DNF9vcl9vcm4iPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5DMl9weGZlcl9tYXAsUUlfZnR5cGVfUUksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQzJfcHhmZXJfbWFwIDoKK0hleGFnb25fc2lfcWlfSW50cmluc2ljPCJIRVhBR09OX0MyX3B4ZmVyX21hcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX2FueTgsUUlfZnR5cGVfUUksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQzJfYW55OCA6CitIZXhhZ29uX3NpX3FpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9hbnk4Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfYWxsOCxRSV9mdHlwZV9RSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9hbGw4IDoKK0hleGFnb25fc2lfcWlfSW50cmluc2ljPCJIRVhBR09OX0MyX2FsbDgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5DMl92aXRwYWNrLFNJX2Z0eXBlX1FJUUksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzJfdml0cGFjayA6CitIZXhhZ29uX3NpX3FpcWlfSW50cmluc2ljPCJIRVhBR09OX0MyX3ZpdHBhY2siPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5DMl9tdXgsU0lfZnR5cGVfUUlTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX0MyX211eCA6CitIZXhhZ29uX3NpX3Fpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfbXV4Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfbXV4aWksU0lfZnR5cGVfUUlTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX0MyX211eGlpIDoKK0hleGFnb25fc2lfcWlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9tdXhpaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX211eGlyLFNJX2Z0eXBlX1FJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9tdXhpciA6CitIZXhhZ29uX3NpX3Fpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfbXV4aXIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5DMl9tdXhyaSxTSV9mdHlwZV9RSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fQzJfbXV4cmkgOgorSGV4YWdvbl9zaV9xaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX0MyX211eHJpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfdm11eCxESV9mdHlwZV9RSURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fQzJfdm11eCA6CitIZXhhZ29uX2RpX3FpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfdm11eCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX21hc2ssRElfZnR5cGVfUUksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQzJfbWFzayA6CitIZXhhZ29uX2RpX3FpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9tYXNrIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmNtcGJlcSxRSV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZjbXBiZXEgOgorSGV4YWdvbl9zaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92Y21wYmVxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdmNtcGJlcWksUUlfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF92Y21wYmVxaSA6CitIZXhhZ29uX3NpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X3ZjbXBiZXFpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdmNtcGJlcV9hbnksUUlfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF92Y21wYmVxX2FueSA6CitIZXhhZ29uX3NpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0E0X3ZjbXBiZXFfYW55Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmNtcGJndHUsUUlfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92Y21wYmd0dSA6CitIZXhhZ29uX3NpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZjbXBiZ3R1Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdmNtcGJndHVpLFFJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfdmNtcGJndHVpIDoKK0hleGFnb25fc2lfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfdmNtcGJndHVpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdmNtcGJndCxRSV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3ZjbXBiZ3QgOgorSGV4YWdvbl9zaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF92Y21wYmd0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdmNtcGJndGksUUlfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF92Y21wYmd0aSA6CitIZXhhZ29uX3NpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X3ZjbXBiZ3RpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfY21wYmVxLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfY21wYmVxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfY21wYmVxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfY21wYmVxaSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X2NtcGJlcWkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9jbXBiZXFpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfY21wYmd0dSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X2NtcGJndHUgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9jbXBiZ3R1Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfY21wYmd0dWksUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9jbXBiZ3R1aSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X2NtcGJndHVpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfY21wYmd0LFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfY21wYmd0IDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfY21wYmd0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfY21wYmd0aSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X2NtcGJndGkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9jbXBiZ3RpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmNtcGhlcSxRSV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZjbXBoZXEgOgorSGV4YWdvbl9zaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92Y21waGVxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmNtcGhndCxRSV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZjbXBoZ3QgOgorSGV4YWdvbl9zaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92Y21waGd0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmNtcGhndHUsUUlfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92Y21waGd0dSA6CitIZXhhZ29uX3NpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZjbXBoZ3R1Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdmNtcGhlcWksUUlfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF92Y21waGVxaSA6CitIZXhhZ29uX3NpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X3ZjbXBoZXFpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdmNtcGhndGksUUlfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF92Y21waGd0aSA6CitIZXhhZ29uX3NpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X3ZjbXBoZ3RpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdmNtcGhndHVpLFFJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfdmNtcGhndHVpIDoKK0hleGFnb25fc2lfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfdmNtcGhndHVpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfY21waGVxLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfY21waGVxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfY21waGVxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfY21waGd0LFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfY21waGd0IDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfY21waGd0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfY21waGd0dSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X2NtcGhndHUgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9jbXBoZ3R1Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfY21waGVxaSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X2NtcGhlcWkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9jbXBoZXFpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfY21waGd0aSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X2NtcGhndGkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9jbXBoZ3RpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfY21waGd0dWksUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9jbXBoZ3R1aSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X2NtcGhndHVpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmNtcHdlcSxRSV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZjbXB3ZXEgOgorSGV4YWdvbl9zaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92Y21wd2VxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmNtcHdndCxRSV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZjbXB3Z3QgOgorSGV4YWdvbl9zaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92Y21wd2d0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmNtcHdndHUsUUlfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92Y21wd2d0dSA6CitIZXhhZ29uX3NpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZjbXB3Z3R1Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdmNtcHdlcWksUUlfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF92Y21wd2VxaSA6CitIZXhhZ29uX3NpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X3ZjbXB3ZXFpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdmNtcHdndGksUUlfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF92Y21wd2d0aSA6CitIZXhhZ29uX3NpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X3ZjbXB3Z3RpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdmNtcHdndHVpLFFJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfdmNtcHdndHVpIDoKK0hleGFnb25fc2lfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfdmNtcHdndHVpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfYm91bmRzY2hlY2ssUUlfZnR5cGVfU0lESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9ib3VuZHNjaGVjayA6CitIZXhhZ29uX3NpX3NpZGlfSW50cmluc2ljPCJIRVhBR09OX0E0X2JvdW5kc2NoZWNrIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdGxibWF0Y2gsUUlfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF90bGJtYXRjaCA6CitIZXhhZ29uX3NpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X3RsYm1hdGNoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfdGZycHIsU0lfZnR5cGVfUUksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQzJfdGZycHIgOgorSGV4YWdvbl9zaV9xaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfdGZycHIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5DMl90ZnJycCxRSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl90ZnJycCA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl90ZnJycCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkM0X2Zhc3Rjb3JuZXI5LFFJX2Z0eXBlX1FJUUksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzRfZmFzdGNvcm5lcjkgOgorSGV4YWdvbl9zaV9xaXFpX0ludHJpbnNpYzwiSEVYQUdPTl9DNF9mYXN0Y29ybmVyOSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkM0X2Zhc3Rjb3JuZXI5X25vdCxRSV9mdHlwZV9RSVFJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0M0X2Zhc3Rjb3JuZXI5X25vdCA6CitIZXhhZ29uX3NpX3FpcWlfSW50cmluc2ljPCJIRVhBR09OX0M0X2Zhc3Rjb3JuZXI5X25vdCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9hY2NfaGhfczAsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9hY2NfaGhfczAgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9hY2NfaGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfYWNjX2hoX3MxLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfYWNjX2hoX3MxIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfYWNjX2hoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2FjY19obF9zMCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2FjY19obF9zMCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2FjY19obF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9hY2NfaGxfczEsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9hY2NfaGxfczEgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9hY2NfaGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfYWNjX2xoX3MwLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfYWNjX2xoX3MwIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfYWNjX2xoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2FjY19saF9zMSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2FjY19saF9zMSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2FjY19saF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9hY2NfbGxfczAsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9hY2NfbGxfczAgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9hY2NfbGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfYWNjX2xsX3MxLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfYWNjX2xsX3MxIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfYWNjX2xsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X25hY19oaF9zMCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X25hY19oaF9zMCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X25hY19oaF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9uYWNfaGhfczEsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9uYWNfaGhfczEgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9uYWNfaGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfbmFjX2hsX3MwLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfbmFjX2hsX3MwIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfbmFjX2hsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X25hY19obF9zMSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X25hY19obF9zMSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X25hY19obF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9uYWNfbGhfczAsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9uYWNfbGhfczAgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9uYWNfbGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfbmFjX2xoX3MxLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfbmFjX2xoX3MxIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfbmFjX2xoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X25hY19sbF9zMCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X25hY19sbF9zMCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X25hY19sbF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9uYWNfbGxfczEsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9uYWNfbGxfczEgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9uYWNfbGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfYWNjX3NhdF9oaF9zMCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2FjY19zYXRfaGhfczAgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9hY2Nfc2F0X2hoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2FjY19zYXRfaGhfczEsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9hY2Nfc2F0X2hoX3MxIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfYWNjX3NhdF9oaF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9hY2Nfc2F0X2hsX3MwLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfYWNjX3NhdF9obF9zMCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2FjY19zYXRfaGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfYWNjX3NhdF9obF9zMSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2FjY19zYXRfaGxfczEgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9hY2Nfc2F0X2hsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2FjY19zYXRfbGhfczAsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9hY2Nfc2F0X2xoX3MwIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfYWNjX3NhdF9saF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9hY2Nfc2F0X2xoX3MxLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfYWNjX3NhdF9saF9zMSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2FjY19zYXRfbGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfYWNjX3NhdF9sbF9zMCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2FjY19zYXRfbGxfczAgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9hY2Nfc2F0X2xsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2FjY19zYXRfbGxfczEsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9hY2Nfc2F0X2xsX3MxIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfYWNjX3NhdF9sbF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9uYWNfc2F0X2hoX3MwLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfbmFjX3NhdF9oaF9zMCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X25hY19zYXRfaGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfbmFjX3NhdF9oaF9zMSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X25hY19zYXRfaGhfczEgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9uYWNfc2F0X2hoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X25hY19zYXRfaGxfczAsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9uYWNfc2F0X2hsX3MwIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfbmFjX3NhdF9obF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9uYWNfc2F0X2hsX3MxLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfbmFjX3NhdF9obF9zMSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X25hY19zYXRfaGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfbmFjX3NhdF9saF9zMCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X25hY19zYXRfbGhfczAgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9uYWNfc2F0X2xoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X25hY19zYXRfbGhfczEsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9uYWNfc2F0X2xoX3MxIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfbmFjX3NhdF9saF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9uYWNfc2F0X2xsX3MwLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfbmFjX3NhdF9sbF9zMCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X25hY19zYXRfbGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfbmFjX3NhdF9sbF9zMSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X25hY19zYXRfbGxfczEgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9uYWNfc2F0X2xsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2hoX3MwLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2hoX3MwIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2hoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2hoX3MxLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2hoX3MxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2hoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2hsX3MwLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2hsX3MwIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2hsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2hsX3MxLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2hsX3MxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2hsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2xoX3MwLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2xoX3MwIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2xoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2xoX3MxLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2xoX3MxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2xoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2xsX3MwLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2xsX3MwIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2xsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2xsX3MxLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2xsX3MxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2xsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3NhdF9oaF9zMCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9zYXRfaGhfczAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfc2F0X2hoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3NhdF9oaF9zMSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9zYXRfaGhfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfc2F0X2hoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3NhdF9obF9zMCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9zYXRfaGxfczAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfc2F0X2hsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3NhdF9obF9zMSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9zYXRfaGxfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfc2F0X2hsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3NhdF9saF9zMCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9zYXRfbGhfczAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfc2F0X2xoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3NhdF9saF9zMSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9zYXRfbGhfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfc2F0X2xoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3NhdF9sbF9zMCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9zYXRfbGxfczAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfc2F0X2xsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3NhdF9sbF9zMSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9zYXRfbGxfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfc2F0X2xsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3JuZF9oaF9zMCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9ybmRfaGhfczAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfcm5kX2hoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3JuZF9oaF9zMSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9ybmRfaGhfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfcm5kX2hoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3JuZF9obF9zMCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9ybmRfaGxfczAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfcm5kX2hsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3JuZF9obF9zMSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9ybmRfaGxfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfcm5kX2hsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3JuZF9saF9zMCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9ybmRfbGhfczAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfcm5kX2xoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3JuZF9saF9zMSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9ybmRfbGhfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfcm5kX2xoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3JuZF9sbF9zMCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9ybmRfbGxfczAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfcm5kX2xsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3JuZF9sbF9zMSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9ybmRfbGxfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfcm5kX2xsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3NhdF9ybmRfaGhfczAsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9oaF9zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9zYXRfcm5kX2hoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3NhdF9ybmRfaGhfczEsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9oaF9zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9zYXRfcm5kX2hoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3NhdF9ybmRfaGxfczAsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9obF9zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9zYXRfcm5kX2hsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3NhdF9ybmRfaGxfczEsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9obF9zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9zYXRfcm5kX2hsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3NhdF9ybmRfbGhfczAsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9saF9zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9zYXRfcm5kX2xoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3NhdF9ybmRfbGhfczEsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9saF9zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9zYXRfcm5kX2xoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3NhdF9ybmRfbGxfczAsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9sbF9zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9zYXRfcm5kX2xsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X3NhdF9ybmRfbGxfczEsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9sbF9zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9zYXRfcm5kX2xsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9hY2NfaGhfczAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfYWNjX2hoX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX2FjY19oaF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfYWNjX2hoX3MxLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX2FjY19oaF9zMSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9hY2NfaGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlkX2FjY19obF9zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9hY2NfaGxfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfYWNjX2hsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9hY2NfaGxfczEsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfYWNjX2hsX3MxIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX2FjY19obF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfYWNjX2xoX3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX2FjY19saF9zMCA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9hY2NfbGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlkX2FjY19saF9zMSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9hY2NfbGhfczEgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfYWNjX2xoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9hY2NfbGxfczAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfYWNjX2xsX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX2FjY19sbF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfYWNjX2xsX3MxLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX2FjY19sbF9zMSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9hY2NfbGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlkX25hY19oaF9zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9uYWNfaGhfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfbmFjX2hoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9uYWNfaGhfczEsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfbmFjX2hoX3MxIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX25hY19oaF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfbmFjX2hsX3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX25hY19obF9zMCA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9uYWNfaGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlkX25hY19obF9zMSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9uYWNfaGxfczEgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfbmFjX2hsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9uYWNfbGhfczAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfbmFjX2xoX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX25hY19saF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfbmFjX2xoX3MxLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX25hY19saF9zMSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9uYWNfbGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlkX25hY19sbF9zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9uYWNfbGxfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfbmFjX2xsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9uYWNfbGxfczEsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfbmFjX2xsX3MxIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX25hY19sbF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfaGhfczAsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX2hoX3MwIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9oaF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfaGhfczEsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX2hoX3MxIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9oaF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfaGxfczAsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX2hsX3MwIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9obF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfaGxfczEsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX2hsX3MxIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9obF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfbGhfczAsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX2xoX3MwIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9saF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfbGhfczEsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX2xoX3MxIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9saF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfbGxfczAsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX2xsX3MwIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9sbF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfbGxfczEsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX2xsX3MxIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9sbF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfcm5kX2hoX3MwLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9ybmRfaGhfczAgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX3JuZF9oaF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfcm5kX2hoX3MxLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9ybmRfaGhfczEgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX3JuZF9oaF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfcm5kX2hsX3MwLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9ybmRfaGxfczAgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX3JuZF9obF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfcm5kX2hsX3MxLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9ybmRfaGxfczEgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX3JuZF9obF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfcm5kX2xoX3MwLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9ybmRfbGhfczAgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX3JuZF9saF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfcm5kX2xoX3MxLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9ybmRfbGhfczEgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX3JuZF9saF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfcm5kX2xsX3MwLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9ybmRfbGxfczAgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX3JuZF9sbF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfcm5kX2xsX3MxLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9ybmRfbGxfczEgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX3JuZF9sbF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVfYWNjX2hoX3MwLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1X2FjY19oaF9zMCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dV9hY2NfaGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1X2FjY19oaF9zMSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dV9hY2NfaGhfczEgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVfYWNjX2hoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dV9hY2NfaGxfczAsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfYWNjX2hsX3MwIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X2FjY19obF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVfYWNjX2hsX3MxLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1X2FjY19obF9zMSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dV9hY2NfaGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1X2FjY19saF9zMCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dV9hY2NfbGhfczAgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVfYWNjX2xoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dV9hY2NfbGhfczEsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfYWNjX2xoX3MxIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X2FjY19saF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVfYWNjX2xsX3MwLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1X2FjY19sbF9zMCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dV9hY2NfbGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1X2FjY19sbF9zMSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dV9hY2NfbGxfczEgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVfYWNjX2xsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dV9uYWNfaGhfczAsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfbmFjX2hoX3MwIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X25hY19oaF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVfbmFjX2hoX3MxLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1X25hY19oaF9zMSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dV9uYWNfaGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1X25hY19obF9zMCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dV9uYWNfaGxfczAgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVfbmFjX2hsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dV9uYWNfaGxfczEsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfbmFjX2hsX3MxIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X25hY19obF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVfbmFjX2xoX3MwLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1X25hY19saF9zMCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dV9uYWNfbGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1X25hY19saF9zMSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dV9uYWNfbGhfczEgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVfbmFjX2xoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dV9uYWNfbGxfczAsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfbmFjX2xsX3MwIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X25hY19sbF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVfbmFjX2xsX3MxLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1X25hY19sbF9zMSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dV9uYWNfbGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1X2hoX3MwLFVTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfaGhfczAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X2hoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dV9oaF9zMSxVU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1X2hoX3MxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dV9oaF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVfaGxfczAsVVNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dV9obF9zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVfaGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1X2hsX3MxLFVTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfaGxfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X2hsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dV9saF9zMCxVU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1X2xoX3MwIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dV9saF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVfbGhfczEsVVNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dV9saF9zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVfbGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1X2xsX3MwLFVTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfbGxfczAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X2xsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dV9sbF9zMSxVU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1X2xsX3MxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dV9sbF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVkX2FjY19oaF9zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dWRfYWNjX2hoX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1ZF9hY2NfaGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1ZF9hY2NfaGhfczEsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVkX2FjY19oaF9zMSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dWRfYWNjX2hoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dWRfYWNjX2hsX3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1ZF9hY2NfaGxfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVkX2FjY19obF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVkX2FjY19obF9zMSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dWRfYWNjX2hsX3MxIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1ZF9hY2NfaGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1ZF9hY2NfbGhfczAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVkX2FjY19saF9zMCA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dWRfYWNjX2xoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dWRfYWNjX2xoX3MxLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1ZF9hY2NfbGhfczEgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVkX2FjY19saF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVkX2FjY19sbF9zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dWRfYWNjX2xsX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1ZF9hY2NfbGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1ZF9hY2NfbGxfczEsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVkX2FjY19sbF9zMSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dWRfYWNjX2xsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dWRfbmFjX2hoX3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1ZF9uYWNfaGhfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVkX25hY19oaF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVkX25hY19oaF9zMSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dWRfbmFjX2hoX3MxIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1ZF9uYWNfaGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1ZF9uYWNfaGxfczAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVkX25hY19obF9zMCA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dWRfbmFjX2hsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dWRfbmFjX2hsX3MxLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1ZF9uYWNfaGxfczEgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVkX25hY19obF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVkX25hY19saF9zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dWRfbmFjX2xoX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1ZF9uYWNfbGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1ZF9uYWNfbGhfczEsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVkX25hY19saF9zMSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dWRfbmFjX2xoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dWRfbmFjX2xsX3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1ZF9uYWNfbGxfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVkX25hY19sbF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVkX25hY19sbF9zMSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dWRfbmFjX2xsX3MxIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1ZF9uYWNfbGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1ZF9oaF9zMCxVRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1ZF9oaF9zMCA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVkX2hoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dWRfaGhfczEsVURJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dWRfaGhfczEgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1ZF9oaF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVkX2hsX3MwLFVESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVkX2hsX3MwIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dWRfaGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1ZF9obF9zMSxVRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1ZF9obF9zMSA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVkX2hsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dWRfbGhfczAsVURJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dWRfbGhfczAgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1ZF9saF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVkX2xoX3MxLFVESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVkX2xoX3MxIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dWRfbGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1ZF9sbF9zMCxVRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1ZF9sbF9zMCA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVkX2xsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dWRfbGxfczEsVURJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dWRfbGxfczEgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1ZF9sbF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXNtaSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXNtaSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXNtaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21hY3NpcCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbWFjc2lwIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tYWNzaXAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tYWNzaW4sU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21hY3NpbiA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbWFjc2luIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfZHBtcHlzc19zMCxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX2RwbXB5c3NfczAgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9kcG1weXNzX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfZHBtcHlzc19hY2NfczAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX2RwbXB5c3NfYWNjX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9kcG1weXNzX2FjY19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2RwbXB5c3NfbmFjX3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9kcG1weXNzX25hY19zMCA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfZHBtcHlzc19uYWNfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9kcG1weXV1X3MwLFVESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX2RwbXB5dXVfczAgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9kcG1weXV1X3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfZHBtcHl1dV9hY2NfczAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX2RwbXB5dXVfYWNjX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9kcG1weXV1X2FjY19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2RwbXB5dXVfbmFjX3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9kcG1weXV1X25hY19zMCA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfZHBtcHl1dV9uYWNfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfdXAsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfdXAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfdXAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfdXBfczEsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfdXBfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfdXBfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfdXBfczFfc2F0LFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X3VwX3MxX3NhdCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV91cF9zMV9zYXQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1X3VwLFVTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfdXAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X3VwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5c3VfdXAsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlzdV91cCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXN1X3VwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfZHBtcHlzc19ybmRfczAsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9kcG1weXNzX3JuZF9zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2RwbXB5c3Nfcm5kX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfbWFjX3VwX3MxX3NhdCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTRfbWFjX3VwX3MxX3NhdCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfbWFjX3VwX3MxX3NhdCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X25hY191cF9zMV9zYXQsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX000X25hY191cF9zMV9zYXQgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX000X25hY191cF9zMV9zYXQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlpLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5aSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1aSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVpIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dWkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tYWNpLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tYWNpIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tYWNpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfYWNjaSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfYWNjaSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfYWNjaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2FjY2lpLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9hY2NpaSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfYWNjaWkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9uYWNjaSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbmFjY2kgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX25hY2NpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbmFjY2lpLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9uYWNjaWkgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX25hY2NpaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3N1YmFjYyxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfc3ViYWNjIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9zdWJhY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF9tcHlycl9hZGRyLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF9tcHlycl9hZGRyIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF9tcHlycl9hZGRyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfbXB5cmlfYWRkcl91MixTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTRfbXB5cmlfYWRkcl91MiA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfbXB5cmlfYWRkcl91MiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X21weXJpX2FkZHIsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX000X21weXJpX2FkZHIgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX000X21weXJpX2FkZHIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF9tcHlyaV9hZGRpLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF9tcHlyaV9hZGRpIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF9tcHlyaV9hZGRpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfbXB5cnJfYWRkaSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTRfbXB5cnJfYWRkaSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfbXB5cnJfYWRkaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZtcHkyc19zMCxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZtcHkyc19zMCA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX3ZtcHkyc19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZtcHkyc19zMSxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZtcHkyc19zMSA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX3ZtcHkyc19zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZtYWMyc19zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdm1hYzJzX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92bWFjMnNfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92bWFjMnNfczEsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZtYWMyc19zMSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdm1hYzJzX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdm1weTJzdV9zMCxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZtcHkyc3VfczAgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92bXB5MnN1X3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdm1weTJzdV9zMSxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZtcHkyc3VfczEgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92bXB5MnN1X3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdm1hYzJzdV9zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdm1hYzJzdV9zMCA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdm1hYzJzdV9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZtYWMyc3VfczEsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZtYWMyc3VfczEgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX3ZtYWMyc3VfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92bXB5MnNfczBwYWNrLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdm1weTJzX3MwcGFjayA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX3ZtcHkyc19zMHBhY2siPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92bXB5MnNfczFwYWNrLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdm1weTJzX3MxcGFjayA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX3ZtcHkyc19zMXBhY2siPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92bWFjMixESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdm1hYzIgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX3ZtYWMyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdm1weTJlc19zMCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZtcHkyZXNfczAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92bXB5MmVzX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdm1weTJlc19zMSxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZtcHkyZXNfczEgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92bXB5MmVzX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdm1hYzJlc19zMCxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdm1hYzJlc19zMCA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdm1hYzJlc19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZtYWMyZXNfczEsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZtYWMyZXNfczEgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZtYWMyZXNfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92bWFjMmVzLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92bWFjMmVzIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92bWFjMmVzIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdnJtYWNfczAsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZybWFjX3MwIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92cm1hY19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZybXB5X3MwLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdnJtcHlfczAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92cm1weV9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZkbXB5cnNfczAsU0lfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92ZG1weXJzX3MwIDoKK0hleGFnb25fc2lfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdmRtcHlyc19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZkbXB5cnNfczEsU0lfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92ZG1weXJzX3MxIDoKK0hleGFnb25fc2lfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdmRtcHlyc19zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk01X3ZybXB5YnV1LERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTVfdnJtcHlidXUgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NNV92cm1weWJ1dSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk01X3ZybWFjYnV1LERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNV92cm1hY2J1dSA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTVfdnJtYWNidXUiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNV92cm1weWJzdSxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX001X3ZybXB5YnN1IDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTVfdnJtcHlic3UiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNV92cm1hY2JzdSxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTVfdnJtYWNic3UgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX001X3ZybWFjYnN1Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTVfdm1weWJ1dSxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX001X3ZtcHlidXUgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNV92bXB5YnV1Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTVfdm1weWJzdSxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX001X3ZtcHlic3UgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNV92bXB5YnN1Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTVfdm1hY2J1dSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTVfdm1hY2J1dSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTVfdm1hY2J1dSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk01X3ZtYWNic3UsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX001X3ZtYWNic3UgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX001X3ZtYWNic3UiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNV92ZG1weWJzdSxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX001X3ZkbXB5YnN1IDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTVfdmRtcHlic3UiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNV92ZG1hY2JzdSxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTVfdmRtYWNic3UgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX001X3ZkbWFjYnN1Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdmRtYWNzX3MwLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92ZG1hY3NfczAgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZkbWFjc19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZkbWFjc19zMSxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdmRtYWNzX3MxIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92ZG1hY3NfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92ZG1weXNfczAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92ZG1weXNfczAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92ZG1weXNfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92ZG1weXNfczEsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92ZG1weXNfczEgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92ZG1weXNfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9jbXB5cnNfczAsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9jbXB5cnNfczAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9jbXB5cnNfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9jbXB5cnNfczEsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9jbXB5cnNfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9jbXB5cnNfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9jbXB5cnNjX3MwLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfY21weXJzY19zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2NtcHlyc2NfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9jbXB5cnNjX3MxLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfY21weXJzY19zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2NtcHlyc2NfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9jbWFjc19zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfY21hY3NfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2NtYWNzX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfY21hY3NfczEsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX2NtYWNzX3MxIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9jbWFjc19zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2NtYWNzY19zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfY21hY3NjX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9jbWFjc2NfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9jbWFjc2NfczEsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX2NtYWNzY19zMSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfY21hY3NjX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfY21weXNfczAsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9jbXB5c19zMCA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2NtcHlzX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfY21weXNfczEsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9jbXB5c19zMSA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2NtcHlzX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfY21weXNjX3MwLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfY21weXNjX3MwIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfY21weXNjX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfY21weXNjX3MxLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfY21weXNjX3MxIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfY21weXNjX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfY25hY3NfczAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX2NuYWNzX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9jbmFjc19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2NuYWNzX3MxLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9jbmFjc19zMSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfY25hY3NfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9jbmFjc2NfczAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX2NuYWNzY19zMCA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfY25hY3NjX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfY25hY3NjX3MxLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9jbmFjc2NfczEgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2NuYWNzY19zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZyY21weXNfczEsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92cmNtcHlzX3MxIDoKK0hleGFnb25fZGlfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdnJjbXB5c19zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZyY21weXNfYWNjX3MxLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92cmNtcHlzX2FjY19zMSA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdnJjbXB5c19hY2NfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92cmNtcHlzX3MxcnAsU0lfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92cmNtcHlzX3MxcnAgOgorSGV4YWdvbl9zaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92cmNtcHlzX3MxcnAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbWFjbHNfczAsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tYWNsc19zMCA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1hY2xzX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1hY2xzX3MxLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbWFjbHNfczEgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tYWNsc19zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tYWNoc19zMCxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1hY2hzX3MwIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbWFjaHNfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbWFjaHNfczEsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tYWNoc19zMSA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1hY2hzX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1weWxfczAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbXB5bF9zMCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tcHlsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1weWxfczEsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbXB5bF9zMSA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tcHlsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1weWhfczAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbXB5aF9zMCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tcHloX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1weWhfczEsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbXB5aF9zMSA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tcHloX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1hY2xzX3JzMCxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1hY2xzX3JzMCA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1hY2xzX3JzMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tYWNsc19yczEsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tYWNsc19yczEgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tYWNsc19yczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbWFjaHNfcnMwLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbWFjaHNfcnMwIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbWFjaHNfcnMwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1hY2hzX3JzMSxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1hY2hzX3JzMSA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1hY2hzX3JzMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tcHlsX3JzMCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tcHlsX3JzMCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tcHlsX3JzMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tcHlsX3JzMSxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tcHlsX3JzMSA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tcHlsX3JzMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tcHloX3JzMCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tcHloX3JzMCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tcHloX3JzMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tcHloX3JzMSxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tcHloX3JzMSA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tcHloX3JzMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X3ZybXB5ZWhfczAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF92cm1weWVoX3MwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfdnJtcHllaF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X3ZybXB5ZWhfczEsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF92cm1weWVoX3MxIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfdnJtcHllaF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X3ZybXB5ZWhfYWNjX3MwLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF92cm1weWVoX2FjY19zMCA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfdnJtcHllaF9hY2NfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF92cm1weWVoX2FjY19zMSxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTRfdnJtcHllaF9hY2NfczEgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX000X3ZybXB5ZWhfYWNjX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfdnJtcHlvaF9zMCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX000X3ZybXB5b2hfczAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF92cm1weW9oX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfdnJtcHlvaF9zMSxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX000X3ZybXB5b2hfczEgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF92cm1weW9oX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfdnJtcHlvaF9hY2NfczAsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX000X3ZybXB5b2hfYWNjX3MwIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF92cm1weW9oX2FjY19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X3ZybXB5b2hfYWNjX3MxLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF92cm1weW9oX2FjY19zMSA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfdnJtcHlvaF9hY2NfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9obW1weWxfcnMxLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfaG1tcHlsX3JzMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2htbXB5bF9yczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9obW1weWhfcnMxLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfaG1tcHloX3JzMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2htbXB5aF9yczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9obW1weWxfczEsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9obW1weWxfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9obW1weWxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9obW1weWhfczEsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9obW1weWhfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9obW1weWhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbWFjdWxzX3MwLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbWFjdWxzX3MwIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbWFjdWxzX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1hY3Vsc19zMSxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1hY3Vsc19zMSA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1hY3Vsc19zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tYWN1aHNfczAsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tYWN1aHNfczAgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tYWN1aHNfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbWFjdWhzX3MxLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbWFjdWhzX3MxIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbWFjdWhzX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1weXVsX3MwLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1weXVsX3MwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1weXVsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1weXVsX3MxLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1weXVsX3MxIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1weXVsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1weXVoX3MwLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1weXVoX3MwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1weXVoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1weXVoX3MxLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1weXVoX3MxIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1weXVoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1hY3Vsc19yczAsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tYWN1bHNfcnMwIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbWFjdWxzX3JzMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tYWN1bHNfcnMxLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbWFjdWxzX3JzMSA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1hY3Vsc19yczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbWFjdWhzX3JzMCxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1hY3Voc19yczAgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tYWN1aHNfcnMwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1hY3Voc19yczEsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tYWN1aHNfcnMxIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbWFjdWhzX3JzMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tcHl1bF9yczAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbXB5dWxfcnMwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1weXVsX3JzMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tcHl1bF9yczEsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbXB5dWxfcnMxIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1weXVsX3JzMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tcHl1aF9yczAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbXB5dWhfcnMwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1weXVoX3JzMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tcHl1aF9yczEsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbXB5dWhfcnMxIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1weXVoX3JzMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZyY21hY2lfczAsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZyY21hY2lfczAgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZyY21hY2lfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92cmNtYWNyX3MwLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92cmNtYWNyX3MwIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92cmNtYWNyX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdnJjbWFjaV9zMGMsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZyY21hY2lfczBjIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92cmNtYWNpX3MwYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZyY21hY3JfczBjLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92cmNtYWNyX3MwYyA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdnJjbWFjcl9zMGMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9jbWFjaV9zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfY21hY2lfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2NtYWNpX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfY21hY3JfczAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX2NtYWNyX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9jbWFjcl9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZyY21weWlfczAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92cmNtcHlpX3MwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdnJjbXB5aV9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZyY21weXJfczAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92cmNtcHlyX3MwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdnJjbXB5cl9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZyY21weWlfczBjLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdnJjbXB5aV9zMGMgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92cmNtcHlpX3MwYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZyY21weXJfczBjLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdnJjbXB5cl9zMGMgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92cmNtcHlyX3MwYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2NtcHlpX3MwLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfY21weWlfczAgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9jbXB5aV9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2NtcHlyX3MwLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfY21weXJfczAgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9jbXB5cl9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X2NtcHlpX3doLFNJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTRfY21weWlfd2ggOgorSGV4YWdvbl9zaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF9jbXB5aV93aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X2NtcHlyX3doLFNJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTRfY21weXJfd2ggOgorSGV4YWdvbl9zaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF9jbXB5cl93aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X2NtcHlpX3doYyxTSV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX000X2NtcHlpX3doYyA6CitIZXhhZ29uX3NpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX000X2NtcHlpX3doYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X2NtcHlyX3doYyxTSV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX000X2NtcHlyX3doYyA6CitIZXhhZ29uX3NpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX000X2NtcHlyX3doYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZjbXB5X3MwX3NhdF9pLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdmNtcHlfczBfc2F0X2kgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92Y21weV9zMF9zYXRfaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZjbXB5X3MwX3NhdF9yLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdmNtcHlfczBfc2F0X3IgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92Y21weV9zMF9zYXRfciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZjbXB5X3MxX3NhdF9pLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdmNtcHlfczFfc2F0X2kgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92Y21weV9zMV9zYXRfaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZjbXB5X3MxX3NhdF9yLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdmNtcHlfczFfc2F0X3IgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92Y21weV9zMV9zYXRfciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZjbWFjX3MwX3NhdF9pLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92Y21hY19zMF9zYXRfaSA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdmNtYWNfczBfc2F0X2kiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92Y21hY19zMF9zYXRfcixESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdmNtYWNfczBfc2F0X3IgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZjbWFjX3MwX3NhdF9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdmNyb3RhdGUsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92Y3JvdGF0ZSA6CitIZXhhZ29uX2RpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3Zjcm90YXRlIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfdnJjcm90YXRlX2FjYyxESV9mdHlwZV9ESURJU0lTSSw0KQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF92cmNyb3RhdGVfYWNjIDoKK0hleGFnb25fZGlfZGlkaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1M0X3ZyY3JvdGF0ZV9hY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF92cmNyb3RhdGUsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1M0X3ZyY3JvdGF0ZSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfdnJjcm90YXRlIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdmNuZWdoLERJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdmNuZWdoIDoKK0hleGFnb25fZGlfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdmNuZWdoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdnJjbmVnaCxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdnJjbmVnaCA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdnJjbmVnaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X3BtcHl3LERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTRfcG1weXcgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF9wbXB5dyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X3ZwbXB5aCxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX000X3ZwbXB5aCA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX000X3ZwbXB5aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X3BtcHl3X2FjYyxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTRfcG1weXdfYWNjIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF9wbXB5d19hY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF92cG1weWhfYWNjLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF92cG1weWhfYWNjIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF92cG1weWhfYWNjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfYWRkIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWRkIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3ViLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc3ViIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ViIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkc2F0LFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfYWRkc2F0IDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWRkc2F0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3Vic2F0LFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc3Vic2F0IDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3Vic2F0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkaSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX2FkZGkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hZGRpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkaF9sMTZfbGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hZGRoX2wxNl9sbCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX2FkZGhfbDE2X2xsIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkaF9sMTZfaGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hZGRoX2wxNl9obCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX2FkZGhfbDE2X2hsIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkaF9sMTZfc2F0X2xsLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfYWRkaF9sMTZfc2F0X2xsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWRkaF9sMTZfc2F0X2xsIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkaF9sMTZfc2F0X2hsLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfYWRkaF9sMTZfc2F0X2hsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWRkaF9sMTZfc2F0X2hsIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3ViaF9sMTZfbGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdWJoX2wxNl9sbCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3N1YmhfbDE2X2xsIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3ViaF9sMTZfaGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdWJoX2wxNl9obCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3N1YmhfbDE2X2hsIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3ViaF9sMTZfc2F0X2xsLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc3ViaF9sMTZfc2F0X2xsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ViaF9sMTZfc2F0X2xsIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3ViaF9sMTZfc2F0X2hsLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc3ViaF9sMTZfc2F0X2hsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ViaF9sMTZfc2F0X2hsIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkaF9oMTZfbGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hZGRoX2gxNl9sbCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX2FkZGhfaDE2X2xsIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkaF9oMTZfbGgsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hZGRoX2gxNl9saCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX2FkZGhfaDE2X2xoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkaF9oMTZfaGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hZGRoX2gxNl9obCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX2FkZGhfaDE2X2hsIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkaF9oMTZfaGgsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hZGRoX2gxNl9oaCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX2FkZGhfaDE2X2hoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkaF9oMTZfc2F0X2xsLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfYWRkaF9oMTZfc2F0X2xsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWRkaF9oMTZfc2F0X2xsIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkaF9oMTZfc2F0X2xoLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfYWRkaF9oMTZfc2F0X2xoIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWRkaF9oMTZfc2F0X2xoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkaF9oMTZfc2F0X2hsLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfYWRkaF9oMTZfc2F0X2hsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWRkaF9oMTZfc2F0X2hsIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkaF9oMTZfc2F0X2hoLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfYWRkaF9oMTZfc2F0X2hoIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWRkaF9oMTZfc2F0X2hoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3ViaF9oMTZfbGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdWJoX2gxNl9sbCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3N1YmhfaDE2X2xsIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3ViaF9oMTZfbGgsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdWJoX2gxNl9saCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3N1YmhfaDE2X2xoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3ViaF9oMTZfaGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdWJoX2gxNl9obCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3N1YmhfaDE2X2hsIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3ViaF9oMTZfaGgsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdWJoX2gxNl9oaCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3N1YmhfaDE2X2hoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3ViaF9oMTZfc2F0X2xsLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc3ViaF9oMTZfc2F0X2xsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ViaF9oMTZfc2F0X2xsIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3ViaF9oMTZfc2F0X2xoLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc3ViaF9oMTZfc2F0X2xoIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ViaF9oMTZfc2F0X2xoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3ViaF9oMTZfc2F0X2hsLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc3ViaF9oMTZfc2F0X2hsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ViaF9oMTZfc2F0X2hsIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3ViaF9oMTZfc2F0X2hoLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc3ViaF9oMTZfc2F0X2hoIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ViaF9oMTZfc2F0X2hoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYXNsaCxTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hc2xoIDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX2FzbGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hc3JoLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX2FzcmggOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYXNyaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX2FkZHAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hZGRwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWRkcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX2FkZHBzYXQsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hZGRwc2F0IDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWRkcHNhdCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX2FkZHNwLERJX2Z0eXBlX1NJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfYWRkc3AgOgorSGV4YWdvbl9kaV9zaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hZGRzcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3N1YnAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdWJwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3VicCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX25lZyxTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9uZWcgOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfbmVnIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfbmVnc2F0LFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX25lZ3NhdCA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9uZWdzYXQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hYnMsU0lfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfYWJzIDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX2FicyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX2Fic3NhdCxTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hYnNzYXQgOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWJzc2F0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmNvbmosRElfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmNvbmogOgorSGV4YWdvbl9kaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmNvbmoiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9uZWdwLERJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX25lZ3AgOgorSGV4YWdvbl9kaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfbmVncCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX2Fic3AsRElfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfYWJzcCA6CitIZXhhZ29uX2RpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hYnNwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfbWF4LFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfbWF4IDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfbWF4Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfbWF4dSxVU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9tYXh1IDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfbWF4dSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX21pbixTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX21pbiA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX21pbiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX21pbnUsVVNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfbWludSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX21pbnUiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9tYXhwLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfbWF4cCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX21heHAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9tYXh1cCxVRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9tYXh1cCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX21heHVwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfbWlucCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX21pbnAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9taW5wIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfbWludXAsVURJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfbWludXAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9taW51cCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3RmcixTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl90ZnIgOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdGZyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdGZyc2ksU0lfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdGZyc2kgOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdGZyc2kiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl90ZnJwLERJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3RmcnAgOgorSGV4YWdvbl9kaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdGZycCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3RmcnBpLERJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3RmcnBpIDoKK0hleGFnb25fZGlfc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3RmcnBpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfenh0YixTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl96eHRiIDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3p4dGIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zeHRiLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3N4dGIgOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3h0YiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3p4dGgsU0lfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfenh0aCA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl96eHRoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3h0aCxTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zeHRoIDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3N4dGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9jb21iaW5ldyxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX2NvbWJpbmV3IDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfY29tYmluZXciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9jb21iaW5lcmksRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9jb21iaW5lcmkgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9jb21iaW5lcmkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9jb21iaW5laXIsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9jb21iaW5laXIgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9jb21iaW5laXIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9jb21iaW5laWksRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9jb21iaW5laWkgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9jb21iaW5laWkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9jb21iaW5lX2hoLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfY29tYmluZV9oaCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX2NvbWJpbmVfaGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9jb21iaW5lX2hsLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfY29tYmluZV9obCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX2NvbWJpbmVfaGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9jb21iaW5lX2xoLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfY29tYmluZV9saCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX2NvbWJpbmVfbGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9jb21iaW5lX2xsLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfY29tYmluZV9sbCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX2NvbWJpbmVfbGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl90ZnJpbCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3RmcmlsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdGZyaWwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl90ZnJpaCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3RmcmloIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdGZyaWgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hbmQsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hbmQgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hbmQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9vcixTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX29yIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfb3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl94b3IsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl94b3IgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl94b3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9ub3QsU0lfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfbm90IDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX25vdCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3hvcl94YWNjLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl94b3JfeGFjYyA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfeG9yX3hhY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF94b3JfeGFjYyxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTRfeG9yX3hhY2MgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX000X3hvcl94YWNjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfYW5kbixTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X2FuZG4gOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9hbmRuIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfb3JuLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfb3JuIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfb3JuIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfYW5kbnAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9hbmRucCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0E0X2FuZG5wIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfb3JucCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X29ybnAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9vcm5wIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfYWRkYWRkaSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzRfYWRkYWRkaSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfYWRkYWRkaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X3N1YmFkZGksU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1M0X3N1YmFkZGkgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1M0X3N1YmFkZGkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF9hbmRfYW5kLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF9hbmRfYW5kIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF9hbmRfYW5kIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfYW5kX2FuZG4sU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX000X2FuZF9hbmRuIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF9hbmRfYW5kbiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X2FuZF9vcixTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTRfYW5kX29yIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF9hbmRfb3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF9hbmRfeG9yLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF9hbmRfeG9yIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF9hbmRfeG9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfb3JfYW5kLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF9vcl9hbmQgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX000X29yX2FuZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X29yX2FuZG4sU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX000X29yX2FuZG4gOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX000X29yX2FuZG4iPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF9vcl9vcixTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTRfb3Jfb3IgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX000X29yX29yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfb3JfeG9yLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF9vcl94b3IgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX000X29yX3hvciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X29yX2FuZGl4LFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF9vcl9hbmRpeCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfb3JfYW5kaXgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF9vcl9hbmRpLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF9vcl9hbmRpIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF9vcl9hbmRpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfb3Jfb3JpLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF9vcl9vcmkgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1M0X29yX29yaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X3hvcl9hbmQsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX000X3hvcl9hbmQgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX000X3hvcl9hbmQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF94b3Jfb3IsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX000X3hvcl9vciA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfeG9yX29yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfeG9yX2FuZG4sU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX000X3hvcl9hbmRuIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF94b3JfYW5kbiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3N1YnJpLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc3VicmkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zdWJyaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX2FuZGlyLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfYW5kaXIgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hbmRpciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX29yaXIsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9vcmlyIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfb3JpciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX2FuZHAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hbmRwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYW5kcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX29ycCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX29ycCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX29ycCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3hvcnAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl94b3JwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfeG9ycCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX25vdHAsRElfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfbm90cCA6CitIZXhhZ29uX2RpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9ub3RwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3h0dyxESV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zeHR3IDoKK0hleGFnb25fZGlfc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3N4dHciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zYXQsU0lfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc2F0IDoKK0hleGFnb25fc2lfZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3NhdCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3JvdW5kc2F0LFNJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3JvdW5kc2F0IDoKK0hleGFnb25fc2lfZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3JvdW5kc2F0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc2F0aCxTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zYXRoIDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3NhdGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zYXR1aCxTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zYXR1aCA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zYXR1aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3NhdHViLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3NhdHViIDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3NhdHViIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc2F0YixTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zYXRiIDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3NhdGIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YWRkdWIsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92YWRkdWIgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YWRkdWIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YWRkYl9tYXAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92YWRkYl9tYXAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YWRkYl9tYXAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YWRkdWJzLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmFkZHVicyA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZhZGR1YnMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YWRkaCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZhZGRoIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmFkZGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YWRkaHMsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92YWRkaHMgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YWRkaHMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YWRkdWhzLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmFkZHVocyA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZhZGR1aHMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNV92YWRkaHVicyxTSV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E1X3ZhZGRodWJzIDoKK0hleGFnb25fc2lfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTVfdmFkZGh1YnMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YWRkdyxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZhZGR3IDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmFkZHciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YWRkd3MsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92YWRkd3MgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YWRkd3MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF92eGFkZHN1YncsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF92eGFkZHN1YncgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF92eGFkZHN1YnciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF92eHN1YmFkZHcsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF92eHN1YmFkZHcgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF92eHN1YmFkZHciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF92eGFkZHN1YmgsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF92eGFkZHN1YmggOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF92eGFkZHN1YmgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF92eHN1YmFkZGgsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF92eHN1YmFkZGggOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF92eHN1YmFkZGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF92eGFkZHN1YmhyLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzRfdnhhZGRzdWJociA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX1M0X3Z4YWRkc3ViaHIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF92eHN1YmFkZGhyLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzRfdnhzdWJhZGRociA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX1M0X3Z4c3ViYWRkaHIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdmF2Z2gsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdmF2Z2ggOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zdmF2Z2giPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdmF2Z2hzLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc3ZhdmdocyA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3N2YXZnaHMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdm5hdmdoLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc3ZuYXZnaCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3N2bmF2Z2giPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdmFkZGgsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdmFkZGggOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zdmFkZGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdmFkZGhzLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc3ZhZGRocyA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3N2YWRkaHMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdmFkZHVocyxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3N2YWRkdWhzIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ZhZGR1aHMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdnN1YmgsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdnN1YmggOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zdnN1YmgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdnN1YmhzLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc3ZzdWJocyA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3N2c3ViaHMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdnN1YnVocyxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3N2c3VidWhzIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ZzdWJ1aHMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92cmFkZHViLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdnJhZGR1YiA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZyYWRkdWIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92cmFkZHViX2FjYyxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdnJhZGR1Yl9hY2MgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZyYWRkdWJfYWNjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdnJhZGRoLFNJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdnJhZGRoIDoKK0hleGFnb25fc2lfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdnJhZGRoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdnJhZGR1aCxTSV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZyYWRkdWggOgorSGV4YWdvbl9zaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92cmFkZHVoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdnN1YnViLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdnN1YnViIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdnN1YnViIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdnN1YmJfbWFwLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdnN1YmJfbWFwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdnN1YmJfbWFwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdnN1YnVicyxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZzdWJ1YnMgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92c3VidWJzIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdnN1YmgsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92c3ViaCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZzdWJoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdnN1YmhzLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdnN1YmhzIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdnN1YmhzIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdnN1YnVocyxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZzdWJ1aHMgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92c3VidWhzIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdnN1YncsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92c3VidyA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZzdWJ3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdnN1YndzLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdnN1YndzIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdnN1YndzIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmFic2gsRElfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmFic2ggOgorSGV4YWdvbl9kaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmFic2giPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YWJzaHNhdCxESV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92YWJzaHNhdCA6CitIZXhhZ29uX2RpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YWJzaHNhdCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZhYnN3LERJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZhYnN3IDoKK0hleGFnb25fZGlfZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZhYnN3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmFic3dzYXQsRElfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmFic3dzYXQgOgorSGV4YWdvbl9kaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmFic3dzYXQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92YWJzZGlmZncsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92YWJzZGlmZncgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92YWJzZGlmZnciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92YWJzZGlmZmgsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92YWJzZGlmZmggOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92YWJzZGlmZmgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92cnNhZHViLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdnJzYWR1YiA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3Zyc2FkdWIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92cnNhZHViX2FjYyxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdnJzYWR1Yl9hY2MgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3Zyc2FkdWJfYWNjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmF2Z3ViLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmF2Z3ViIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmF2Z3ViIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmF2Z3VoLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmF2Z3VoIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmF2Z3VoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmF2Z2gsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92YXZnaCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZhdmdoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdm5hdmdoLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdm5hdmdoIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdm5hdmdoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmF2Z3csRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92YXZndyA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3Zhdmd3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdm5hdmd3LERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdm5hdmd3IDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdm5hdmd3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmF2Z3dyLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmF2Z3dyIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmF2Z3dyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdm5hdmd3cixESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZuYXZnd3IgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92bmF2Z3dyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmF2Z3djcixESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3Zhdmd3Y3IgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YXZnd2NyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdm5hdmd3Y3IsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92bmF2Z3djciA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZuYXZnd2NyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmF2Z2hjcixESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZhdmdoY3IgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YXZnaGNyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdm5hdmdoY3IsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92bmF2Z2hjciA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZuYXZnaGNyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmF2Z3V3LERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmF2Z3V3IDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmF2Z3V3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmF2Z3V3cixESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3Zhdmd1d3IgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YXZndXdyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmF2Z3VicixESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3Zhdmd1YnIgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YXZndWJyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmF2Z3VocixESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3Zhdmd1aHIgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YXZndWhyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmF2Z2hyLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmF2Z2hyIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmF2Z2hyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdm5hdmdocixESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZuYXZnaHIgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92bmF2Z2hyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfcm91bmRfcmksU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9yb3VuZF9yaSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X3JvdW5kX3JpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfcm91bmRfcnIsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9yb3VuZF9yciA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X3JvdW5kX3JyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfcm91bmRfcmlfc2F0LFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfcm91bmRfcmlfc2F0IDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfcm91bmRfcmlfc2F0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfcm91bmRfcnJfc2F0LFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfcm91bmRfcnJfc2F0IDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfcm91bmRfcnJfc2F0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfY3JvdW5kX3JpLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfY3JvdW5kX3JpIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfY3JvdW5kX3JpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfY3JvdW5kX3JyLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfY3JvdW5kX3JyIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfY3JvdW5kX3JyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdnJtaW5oLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF92cm1pbmggOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X3ZybWluaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkE0X3ZybWF4aCxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fQTRfdnJtYXhoIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF92cm1heGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF92cm1pbnVoLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF92cm1pbnVoIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF92cm1pbnVoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdnJtYXh1aCxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fQTRfdnJtYXh1aCA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfdnJtYXh1aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkE0X3ZybWludyxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fQTRfdnJtaW53IDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF92cm1pbnciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF92cm1heHcsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3ZybWF4dyA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfdnJtYXh3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdnJtaW51dyxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fQTRfdnJtaW51dyA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfdnJtaW51dyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkE0X3ZybWF4dXcsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3ZybWF4dXcgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X3ZybWF4dXciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bWluYixESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZtaW5iIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdm1pbmIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bWF4YixESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZtYXhiIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdm1heGIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bWludWIsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92bWludWIgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92bWludWIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bWF4dWIsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92bWF4dWIgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92bWF4dWIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bWluaCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZtaW5oIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdm1pbmgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bWF4aCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZtYXhoIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdm1heGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bWludWgsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92bWludWggOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92bWludWgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bWF4dWgsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92bWF4dWggOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92bWF4dWgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bWludyxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZtaW53IDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdm1pbnciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bWF4dyxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZtYXh3IDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdm1heHciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bWludXcsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92bWludXcgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92bWludXciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bWF4dXcsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92bWF4dXcgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92bWF4dXciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9tb2R3cmFwdSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X21vZHdyYXB1IDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfbW9kd3JhcHUiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZmFkZCxTRl9mdHlwZV9TRlNGLDIpCisvLworZGVmIGludF9oZXhhZ29uX0YyX3NmYWRkIDoKK0hleGFnb25fc2Zfc2ZzZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZhZGQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZnN1YixTRl9mdHlwZV9TRlNGLDIpCisvLworZGVmIGludF9oZXhhZ29uX0YyX3Nmc3ViIDoKK0hleGFnb25fc2Zfc2ZzZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZzdWIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZm1weSxTRl9mdHlwZV9TRlNGLDIpCisvLworZGVmIGludF9oZXhhZ29uX0YyX3NmbXB5IDoKK0hleGFnb25fc2Zfc2ZzZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZtcHkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZmZtYSxTRl9mdHlwZV9TRlNGU0YsMykKKy8vCitkZWYgaW50X2hleGFnb25fRjJfc2ZmbWEgOgorSGV4YWdvbl9zZl9zZnNmc2ZfSW50cmluc2ljPCJIRVhBR09OX0YyX3NmZm1hIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfc2ZmbWFfc2MsU0ZfZnR5cGVfU0ZTRlNGUUksNCkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfc2ZmbWFfc2MgOgorSGV4YWdvbl9zZl9zZnNmc2ZxaV9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZmbWFfc2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZmZtcyxTRl9mdHlwZV9TRlNGU0YsMykKKy8vCitkZWYgaW50X2hleGFnb25fRjJfc2ZmbXMgOgorSGV4YWdvbl9zZl9zZnNmc2ZfSW50cmluc2ljPCJIRVhBR09OX0YyX3NmZm1zIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfc2ZmbWFfbGliLFNGX2Z0eXBlX1NGU0ZTRiwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9zZmZtYV9saWIgOgorSGV4YWdvbl9zZl9zZnNmc2ZfSW50cmluc2ljPCJIRVhBR09OX0YyX3NmZm1hX2xpYiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX3NmZm1zX2xpYixTRl9mdHlwZV9TRlNGU0YsMykKKy8vCitkZWYgaW50X2hleGFnb25fRjJfc2ZmbXNfbGliIDoKK0hleGFnb25fc2Zfc2ZzZnNmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9zZmZtc19saWIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZmNtcGVxLFFJX2Z0eXBlX1NGU0YsMikKKy8vCitkZWYgaW50X2hleGFnb25fRjJfc2ZjbXBlcSA6CitIZXhhZ29uX3NpX3Nmc2ZfSW50cmluc2ljPCJIRVhBR09OX0YyX3NmY21wZXEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZmNtcGd0LFFJX2Z0eXBlX1NGU0YsMikKKy8vCitkZWYgaW50X2hleGFnb25fRjJfc2ZjbXBndCA6CitIZXhhZ29uX3NpX3Nmc2ZfSW50cmluc2ljPCJIRVhBR09OX0YyX3NmY21wZ3QiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZmNtcGdlLFFJX2Z0eXBlX1NGU0YsMikKKy8vCitkZWYgaW50X2hleGFnb25fRjJfc2ZjbXBnZSA6CitIZXhhZ29uX3NpX3Nmc2ZfSW50cmluc2ljPCJIRVhBR09OX0YyX3NmY21wZ2UiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZmNtcHVvLFFJX2Z0eXBlX1NGU0YsMikKKy8vCitkZWYgaW50X2hleGFnb25fRjJfc2ZjbXB1byA6CitIZXhhZ29uX3NpX3Nmc2ZfSW50cmluc2ljPCJIRVhBR09OX0YyX3NmY21wdW8iPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZm1heCxTRl9mdHlwZV9TRlNGLDIpCisvLworZGVmIGludF9oZXhhZ29uX0YyX3NmbWF4IDoKK0hleGFnb25fc2Zfc2ZzZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZtYXgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZm1pbixTRl9mdHlwZV9TRlNGLDIpCisvLworZGVmIGludF9oZXhhZ29uX0YyX3NmbWluIDoKK0hleGFnb25fc2Zfc2ZzZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZtaW4iPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZmNsYXNzLFFJX2Z0eXBlX1NGU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fRjJfc2ZjbGFzcyA6CitIZXhhZ29uX3NpX3Nmc2lfSW50cmluc2ljPCJIRVhBR09OX0YyX3NmY2xhc3MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZmltbV9wLFNGX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX3NmaW1tX3AgOgorSGV4YWdvbl9zZl9zaV9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZpbW1fcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX3NmaW1tX24sU0ZfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfc2ZpbW1fbiA6CitIZXhhZ29uX3NmX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9zZmltbV9uIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfc2ZmaXh1cG4sU0ZfZnR5cGVfU0ZTRiwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9zZmZpeHVwbiA6CitIZXhhZ29uX3NmX3Nmc2ZfSW50cmluc2ljPCJIRVhBR09OX0YyX3NmZml4dXBuIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfc2ZmaXh1cGQsU0ZfZnR5cGVfU0ZTRiwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9zZmZpeHVwZCA6CitIZXhhZ29uX3NmX3Nmc2ZfSW50cmluc2ljPCJIRVhBR09OX0YyX3NmZml4dXBkIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfc2ZmaXh1cHIsU0ZfZnR5cGVfU0YsMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfc2ZmaXh1cHIgOgorSGV4YWdvbl9zZl9zZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZmaXh1cHIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9kZmNtcGVxLFFJX2Z0eXBlX0RGREYsMikKKy8vCitkZWYgaW50X2hleGFnb25fRjJfZGZjbXBlcSA6CitIZXhhZ29uX3NpX2RmZGZfSW50cmluc2ljPCJIRVhBR09OX0YyX2RmY21wZXEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9kZmNtcGd0LFFJX2Z0eXBlX0RGREYsMikKKy8vCitkZWYgaW50X2hleGFnb25fRjJfZGZjbXBndCA6CitIZXhhZ29uX3NpX2RmZGZfSW50cmluc2ljPCJIRVhBR09OX0YyX2RmY21wZ3QiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9kZmNtcGdlLFFJX2Z0eXBlX0RGREYsMikKKy8vCitkZWYgaW50X2hleGFnb25fRjJfZGZjbXBnZSA6CitIZXhhZ29uX3NpX2RmZGZfSW50cmluc2ljPCJIRVhBR09OX0YyX2RmY21wZ2UiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9kZmNtcHVvLFFJX2Z0eXBlX0RGREYsMikKKy8vCitkZWYgaW50X2hleGFnb25fRjJfZGZjbXB1byA6CitIZXhhZ29uX3NpX2RmZGZfSW50cmluc2ljPCJIRVhBR09OX0YyX2RmY21wdW8iPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9kZmNsYXNzLFFJX2Z0eXBlX0RGU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fRjJfZGZjbGFzcyA6CitIZXhhZ29uX3NpX2Rmc2lfSW50cmluc2ljPCJIRVhBR09OX0YyX2RmY2xhc3MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9kZmltbV9wLERGX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2RmaW1tX3AgOgorSGV4YWdvbl9kZl9zaV9JbnRyaW5zaWM8IkhFWEFHT05fRjJfZGZpbW1fcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2RmaW1tX24sREZfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfZGZpbW1fbiA6CitIZXhhZ29uX2RmX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9kZmltbV9uIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfY29udl9zZjJkZixERl9mdHlwZV9TRiwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9jb252X3NmMmRmIDoKK0hleGFnb25fZGZfc2ZfSW50cmluc2ljPCJIRVhBR09OX0YyX2NvbnZfc2YyZGYiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X2RmMnNmLFNGX2Z0eXBlX0RGLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfZGYyc2YgOgorSGV4YWdvbl9zZl9kZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl9kZjJzZiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2NvbnZfdXcyc2YsU0ZfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfY29udl91dzJzZiA6CitIZXhhZ29uX3NmX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X3V3MnNmIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfY29udl91dzJkZixERl9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9jb252X3V3MmRmIDoKK0hleGFnb25fZGZfc2lfSW50cmluc2ljPCJIRVhBR09OX0YyX2NvbnZfdXcyZGYiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X3cyc2YsU0ZfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfY29udl93MnNmIDoKK0hleGFnb25fc2Zfc2lfSW50cmluc2ljPCJIRVhBR09OX0YyX2NvbnZfdzJzZiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2NvbnZfdzJkZixERl9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9jb252X3cyZGYgOgorSGV4YWdvbl9kZl9zaV9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl93MmRmIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfY29udl91ZDJzZixTRl9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9jb252X3VkMnNmIDoKK0hleGFnb25fc2ZfZGlfSW50cmluc2ljPCJIRVhBR09OX0YyX2NvbnZfdWQyc2YiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X3VkMmRmLERGX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfdWQyZGYgOgorSGV4YWdvbl9kZl9kaV9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl91ZDJkZiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2NvbnZfZDJzZixTRl9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9jb252X2Qyc2YgOgorSGV4YWdvbl9zZl9kaV9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl9kMnNmIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfY29udl9kMmRmLERGX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfZDJkZiA6CitIZXhhZ29uX2RmX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X2QyZGYiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X3NmMnV3LFNJX2Z0eXBlX1NGLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfc2YydXcgOgorSGV4YWdvbl9zaV9zZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl9zZjJ1dyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2NvbnZfc2YydyxTSV9mdHlwZV9TRiwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9jb252X3NmMncgOgorSGV4YWdvbl9zaV9zZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl9zZjJ3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfY29udl9zZjJ1ZCxESV9mdHlwZV9TRiwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9jb252X3NmMnVkIDoKK0hleGFnb25fZGlfc2ZfSW50cmluc2ljPCJIRVhBR09OX0YyX2NvbnZfc2YydWQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X3NmMmQsRElfZnR5cGVfU0YsMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfY29udl9zZjJkIDoKK0hleGFnb25fZGlfc2ZfSW50cmluc2ljPCJIRVhBR09OX0YyX2NvbnZfc2YyZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2NvbnZfZGYydXcsU0lfZnR5cGVfREYsMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfY29udl9kZjJ1dyA6CitIZXhhZ29uX3NpX2RmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X2RmMnV3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfY29udl9kZjJ3LFNJX2Z0eXBlX0RGLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfZGYydyA6CitIZXhhZ29uX3NpX2RmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X2RmMnciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X2RmMnVkLERJX2Z0eXBlX0RGLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfZGYydWQgOgorSGV4YWdvbl9kaV9kZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl9kZjJ1ZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2NvbnZfZGYyZCxESV9mdHlwZV9ERiwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9jb252X2RmMmQgOgorSGV4YWdvbl9kaV9kZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl9kZjJkIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfY29udl9zZjJ1d19jaG9wLFNJX2Z0eXBlX1NGLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfc2YydXdfY2hvcCA6CitIZXhhZ29uX3NpX3NmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X3NmMnV3X2Nob3AiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X3NmMndfY2hvcCxTSV9mdHlwZV9TRiwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9jb252X3NmMndfY2hvcCA6CitIZXhhZ29uX3NpX3NmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X3NmMndfY2hvcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2NvbnZfc2YydWRfY2hvcCxESV9mdHlwZV9TRiwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9jb252X3NmMnVkX2Nob3AgOgorSGV4YWdvbl9kaV9zZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl9zZjJ1ZF9jaG9wIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfY29udl9zZjJkX2Nob3AsRElfZnR5cGVfU0YsMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfY29udl9zZjJkX2Nob3AgOgorSGV4YWdvbl9kaV9zZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl9zZjJkX2Nob3AiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X2RmMnV3X2Nob3AsU0lfZnR5cGVfREYsMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfY29udl9kZjJ1d19jaG9wIDoKK0hleGFnb25fc2lfZGZfSW50cmluc2ljPCJIRVhBR09OX0YyX2NvbnZfZGYydXdfY2hvcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2NvbnZfZGYyd19jaG9wLFNJX2Z0eXBlX0RGLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfZGYyd19jaG9wIDoKK0hleGFnb25fc2lfZGZfSW50cmluc2ljPCJIRVhBR09OX0YyX2NvbnZfZGYyd19jaG9wIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfY29udl9kZjJ1ZF9jaG9wLERJX2Z0eXBlX0RGLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfZGYydWRfY2hvcCA6CitIZXhhZ29uX2RpX2RmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X2RmMnVkX2Nob3AiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X2RmMmRfY2hvcCxESV9mdHlwZV9ERiwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9jb252X2RmMmRfY2hvcCA6CitIZXhhZ29uX2RpX2RmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X2RmMmRfY2hvcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9yX3IsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3Jfcl9yIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX3JfciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9yX3IsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfcl9yIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNsX3JfciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9yX3IsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3Jfcl9yIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNyX3JfciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzbF9yX3IsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc2xfcl9yIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNsX3JfciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9yX3AsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3Jfcl9wIDoKK0hleGFnb25fZGlfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX3JfcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9yX3AsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfcl9wIDoKK0hleGFnb25fZGlfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNsX3JfcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9yX3AsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3Jfcl9wIDoKK0hleGFnb25fZGlfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNyX3JfcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzbF9yX3AsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc2xfcl9wIDoKK0hleGFnb25fZGlfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNsX3JfcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9yX3JfYWNjLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3Jfcl9yX2FjYyA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX3Jfcl9hY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc2xfcl9yX2FjYyxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX3Jfcl9hY2MgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9yX3JfYWNjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX3Jfcl9hY2MsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzcl9yX3JfYWNjIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3Jfcl9yX2FjYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzbF9yX3JfYWNjLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc2xfcl9yX2FjYyA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNsX3Jfcl9hY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc3Jfcl9wX2FjYyxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX3JfcF9hY2MgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9yX3BfYWNjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX3JfcF9hY2MsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9yX3BfYWNjIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfcl9wX2FjYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9yX3BfYWNjLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3Jfcl9wX2FjYyA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNyX3JfcF9hY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc2xfcl9wX2FjYyxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNsX3JfcF9hY2MgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzbF9yX3BfYWNjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX3Jfcl9uYWMsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9yX3JfbmFjIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3Jfcl9yX25hYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9yX3JfbmFjLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfcl9yX25hYyA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNsX3Jfcl9uYWMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc3Jfcl9yX25hYyxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX3Jfcl9uYWMgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9yX3JfbmFjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNsX3Jfcl9uYWMsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzbF9yX3JfbmFjIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc2xfcl9yX25hYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9yX3BfbmFjLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3Jfcl9wX25hYyA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX3JfcF9uYWMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc2xfcl9wX25hYyxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX3JfcF9uYWMgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9yX3BfbmFjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX3JfcF9uYWMsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzcl9yX3BfbmFjIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3Jfcl9wX25hYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzbF9yX3BfbmFjLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc2xfcl9wX25hYyA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNsX3JfcF9uYWMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc3Jfcl9yX2FuZCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX3Jfcl9hbmQgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9yX3JfYW5kIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX3Jfcl9hbmQsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9yX3JfYW5kIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfcl9yX2FuZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9yX3JfYW5kLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3Jfcl9yX2FuZCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNyX3Jfcl9hbmQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc2xfcl9yX2FuZCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNsX3Jfcl9hbmQgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzbF9yX3JfYW5kIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX3Jfcl9vcixTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX3Jfcl9vciA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX3Jfcl9vciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9yX3Jfb3IsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9yX3Jfb3IgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9yX3Jfb3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc3Jfcl9yX29yLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3Jfcl9yX29yIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3Jfcl9yX29yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNsX3Jfcl9vcixTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNsX3Jfcl9vciA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNsX3Jfcl9vciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9yX3BfYW5kLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3Jfcl9wX2FuZCA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX3JfcF9hbmQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc2xfcl9wX2FuZCxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX3JfcF9hbmQgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9yX3BfYW5kIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX3JfcF9hbmQsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzcl9yX3BfYW5kIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3Jfcl9wX2FuZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzbF9yX3BfYW5kLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc2xfcl9wX2FuZCA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNsX3JfcF9hbmQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc3Jfcl9wX29yLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3Jfcl9wX29yIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3Jfcl9wX29yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX3JfcF9vcixESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX3JfcF9vciA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNsX3JfcF9vciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9yX3Bfb3IsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzcl9yX3Bfb3IgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9yX3Bfb3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc2xfcl9wX29yLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc2xfcl9wX29yIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc2xfcl9wX29yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX3JfcF94b3IsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9yX3BfeG9yIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3Jfcl9wX3hvciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9yX3BfeG9yLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfcl9wX3hvciA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNsX3JfcF94b3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc3Jfcl9wX3hvcixESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX3JfcF94b3IgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9yX3BfeG9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNsX3JfcF94b3IsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzbF9yX3BfeG9yIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc2xfcl9wX3hvciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9yX3Jfc2F0LFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX3Jfcl9zYXQgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3Jfcl9yX3NhdCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9yX3Jfc2F0LFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX3Jfcl9zYXQgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfcl9yX3NhdCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9pX3IsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3JfaV9yIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX2lfciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9pX3IsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3JfaV9yIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNyX2lfciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9pX3IsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfaV9yIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNsX2lfciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9pX3AsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3JfaV9wIDoKK0hleGFnb25fZGlfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX2lfcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9pX3AsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3JfaV9wIDoKK0hleGFnb25fZGlfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNyX2lfcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9pX3AsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfaV9wIDoKK0hleGFnb25fZGlfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNsX2lfcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9pX3JfYWNjLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3JfaV9yX2FjYyA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX2lfcl9hY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc3JfaV9yX2FjYyxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX2lfcl9hY2MgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9pX3JfYWNjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX2lfcl9hY2MsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9pX3JfYWNjIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfaV9yX2FjYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9pX3BfYWNjLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3JfaV9wX2FjYyA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX2lfcF9hY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc3JfaV9wX2FjYyxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX2lfcF9hY2MgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9pX3BfYWNjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX2lfcF9hY2MsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9pX3BfYWNjIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfaV9wX2FjYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9pX3JfbmFjLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3JfaV9yX25hYyA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX2lfcl9uYWMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc3JfaV9yX25hYyxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX2lfcl9uYWMgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9pX3JfbmFjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX2lfcl9uYWMsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9pX3JfbmFjIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfaV9yX25hYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9pX3BfbmFjLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3JfaV9wX25hYyA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX2lfcF9uYWMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc3JfaV9wX25hYyxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX2lfcF9uYWMgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9pX3BfbmFjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX2lfcF9uYWMsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9pX3BfbmFjIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfaV9wX25hYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9pX3JfeGFjYyxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX2lfcl94YWNjIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3JfaV9yX3hhY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc2xfaV9yX3hhY2MsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9pX3JfeGFjYyA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNsX2lfcl94YWNjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX2lfcF94YWNjLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3JfaV9wX3hhY2MgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9pX3BfeGFjYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9pX3BfeGFjYyxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX2lfcF94YWNjIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfaV9wX3hhY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc3JfaV9yX2FuZCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX2lfcl9hbmQgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9pX3JfYW5kIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX2lfcl9hbmQsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzcl9pX3JfYW5kIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3JfaV9yX2FuZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9pX3JfYW5kLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfaV9yX2FuZCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNsX2lfcl9hbmQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc3JfaV9yX29yLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3JfaV9yX29yIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3JfaV9yX29yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX2lfcl9vcixTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX2lfcl9vciA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNyX2lfcl9vciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9pX3Jfb3IsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9pX3Jfb3IgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9pX3Jfb3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc3JfaV9wX2FuZCxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX2lfcF9hbmQgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9pX3BfYW5kIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX2lfcF9hbmQsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzcl9pX3BfYW5kIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3JfaV9wX2FuZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9pX3BfYW5kLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfaV9wX2FuZCA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNsX2lfcF9hbmQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc3JfaV9wX29yLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3JfaV9wX29yIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3JfaV9wX29yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX2lfcF9vcixESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX2lfcF9vciA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNyX2lfcF9vciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9pX3Bfb3IsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9pX3Bfb3IgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9pX3Bfb3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc2xfaV9yX3NhdCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9pX3Jfc2F0IDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNsX2lfcl9zYXQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc3JfaV9yX3JuZCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9pX3Jfcm5kIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX2lfcl9ybmQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc3JfaV9yX3JuZF9nb29kc3ludGF4LFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX2lfcl9ybmRfZ29vZHN5bnRheCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9pX3Jfcm5kX2dvb2RzeW50YXgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc3JfaV9wX3JuZCxESV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9pX3Bfcm5kIDoKK0hleGFnb25fZGlfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX2lfcF9ybmQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc3JfaV9wX3JuZF9nb29kc3ludGF4LERJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX2lfcF9ybmRfZ29vZHN5bnRheCA6CitIZXhhZ29uX2RpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9pX3Bfcm5kX2dvb2RzeW50YXgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF9sc2xpLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzRfbHNsaSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX1M0X2xzbGkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hZGRhc2xfcnJyaSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYWRkYXNsX3JycmkgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FkZGFzbF9ycnJpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfYW5kaV9hc2xfcmksU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1M0X2FuZGlfYXNsX3JpIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF9hbmRpX2FzbF9yaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X29yaV9hc2xfcmksU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1M0X29yaV9hc2xfcmkgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1M0X29yaV9hc2xfcmkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF9hZGRpX2FzbF9yaSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzRfYWRkaV9hc2xfcmkgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1M0X2FkZGlfYXNsX3JpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfc3ViaV9hc2xfcmksU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1M0X3N1YmlfYXNsX3JpIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF9zdWJpX2FzbF9yaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X2FuZGlfbHNyX3JpLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF9hbmRpX2xzcl9yaSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfYW5kaV9sc3JfcmkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF9vcmlfbHNyX3JpLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF9vcmlfbHNyX3JpIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF9vcmlfbHNyX3JpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfYWRkaV9sc3JfcmksU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1M0X2FkZGlfbHNyX3JpIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF9hZGRpX2xzcl9yaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X3N1YmlfbHNyX3JpLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF9zdWJpX2xzcl9yaSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfc3ViaV9sc3JfcmkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92YWxpZ25pYixESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdmFsaWduaWIgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3ZhbGlnbmliIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdmFsaWducmIsRElfZnR5cGVfRElESVFJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3ZhbGlnbnJiIDoKK0hleGFnb25fZGlfZGlkaXFpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl92YWxpZ25yYiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3ZzcGxpY2VpYixESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdnNwbGljZWliIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl92c3BsaWNlaWIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92c3BsaWNlcmIsRElfZnR5cGVfRElESVFJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3ZzcGxpY2VyYiA6CitIZXhhZ29uX2RpX2RpZGlxaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdnNwbGljZXJiIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdnNwbGF0cmgsRElfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdnNwbGF0cmggOgorSGV4YWdvbl9kaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdnNwbGF0cmgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92c3BsYXRyYixTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92c3BsYXRyYiA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl92c3BsYXRyYiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2luc2VydCxTSV9mdHlwZV9TSVNJU0lTSSw0KQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9pbnNlcnQgOgorSGV4YWdvbl9zaV9zaXNpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfaW5zZXJ0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdGFibGVpZHhiX2dvb2RzeW50YXgsU0lfZnR5cGVfU0lTSVNJU0ksNCkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdGFibGVpZHhiX2dvb2RzeW50YXggOgorSGV4YWdvbl9zaV9zaXNpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdGFibGVpZHhiX2dvb2RzeW50YXgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl90YWJsZWlkeGhfZ29vZHN5bnRheCxTSV9mdHlwZV9TSVNJU0lTSSw0KQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl90YWJsZWlkeGhfZ29vZHN5bnRheCA6CitIZXhhZ29uX3NpX3Npc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl90YWJsZWlkeGhfZ29vZHN5bnRheCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3RhYmxlaWR4d19nb29kc3ludGF4LFNJX2Z0eXBlX1NJU0lTSVNJLDQpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3RhYmxlaWR4d19nb29kc3ludGF4IDoKK0hleGFnb25fc2lfc2lzaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3RhYmxlaWR4d19nb29kc3ludGF4Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdGFibGVpZHhkX2dvb2RzeW50YXgsU0lfZnR5cGVfU0lTSVNJU0ksNCkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdGFibGVpZHhkX2dvb2RzeW50YXggOgorSGV4YWdvbl9zaV9zaXNpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdGFibGVpZHhkX2dvb2RzeW50YXgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9iaXRzcGxpdGksRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9iaXRzcGxpdGkgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9iaXRzcGxpdGkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9iaXRzcGxpdCxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X2JpdHNwbGl0IDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfYml0c3BsaXQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF9leHRyYWN0LFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF9leHRyYWN0IDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF9leHRyYWN0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfZXh0cmFjdHUsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2V4dHJhY3R1IDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9leHRyYWN0dSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2luc2VydHAsRElfZnR5cGVfRElESVNJU0ksNCkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfaW5zZXJ0cCA6CitIZXhhZ29uX2RpX2RpZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9pbnNlcnRwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfZXh0cmFjdHAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1M0X2V4dHJhY3RwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF9leHRyYWN0cCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2V4dHJhY3R1cCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfZXh0cmFjdHVwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9leHRyYWN0dXAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9pbnNlcnRfcnAsU0lfZnR5cGVfU0lTSURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2luc2VydF9ycCA6CitIZXhhZ29uX3NpX3Npc2lkaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfaW5zZXJ0X3JwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfZXh0cmFjdF9ycCxTSV9mdHlwZV9TSURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1M0X2V4dHJhY3RfcnAgOgorSGV4YWdvbl9zaV9zaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF9leHRyYWN0X3JwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfZXh0cmFjdHVfcnAsU0lfZnR5cGVfU0lESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9leHRyYWN0dV9ycCA6CitIZXhhZ29uX3NpX3NpZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX2V4dHJhY3R1X3JwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfaW5zZXJ0cF9ycCxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfaW5zZXJ0cF9ycCA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfaW5zZXJ0cF9ycCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X2V4dHJhY3RwX3JwLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzRfZXh0cmFjdHBfcnAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF9leHRyYWN0cF9ycCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2V4dHJhY3R1cF9ycCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2V4dHJhY3R1cF9ycCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX2V4dHJhY3R1cF9ycCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3RzdGJpdF9pLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdHN0Yml0X2kgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl90c3RiaXRfaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X250c3RiaXRfaSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1M0X250c3RiaXRfaSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX1M0X250c3RiaXRfaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3NldGJpdF9pLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfc2V0Yml0X2kgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9zZXRiaXRfaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3RvZ2dsZWJpdF9pLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdG9nZ2xlYml0X2kgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl90b2dnbGViaXRfaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2NscmJpdF9pLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfY2xyYml0X2kgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9jbHJiaXRfaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3RzdGJpdF9yLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdHN0Yml0X3IgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl90c3RiaXRfciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X250c3RiaXRfcixRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1M0X250c3RiaXRfciA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX1M0X250c3RiaXRfciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3NldGJpdF9yLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfc2V0Yml0X3IgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9zZXRiaXRfciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3RvZ2dsZWJpdF9yLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdG9nZ2xlYml0X3IgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl90b2dnbGViaXRfciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2NscmJpdF9yLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfY2xyYml0X3IgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9jbHJiaXRfciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9pX3ZoLERJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX2lfdmggOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3JfaV92aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9pX3ZoLERJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX2lfdmggOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3JfaV92aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9pX3ZoLERJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX2lfdmggOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfaV92aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9yX3ZoLERJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX3JfdmggOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3Jfcl92aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM1X2Fzcmh1Yl9ybmRfc2F0X2dvb2RzeW50YXgsU0lfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNV9hc3JodWJfcm5kX3NhdF9nb29kc3ludGF4IDoKK0hleGFnb25fc2lfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzVfYXNyaHViX3JuZF9zYXRfZ29vZHN5bnRheCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM1X2Fzcmh1Yl9zYXQsU0lfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNV9hc3JodWJfc2F0IDoKK0hleGFnb25fc2lfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzVfYXNyaHViX3NhdCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM1X3Zhc3Jocm5kX2dvb2RzeW50YXgsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNV92YXNyaHJuZF9nb29kc3ludGF4IDoKK0hleGFnb25fZGlfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzVfdmFzcmhybmRfZ29vZHN5bnRheCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9yX3ZoLERJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX3JfdmggOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfcl92aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9yX3ZoLERJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX3JfdmggOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3Jfcl92aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzbF9yX3ZoLERJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNsX3JfdmggOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc2xfcl92aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9pX3Z3LERJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX2lfdncgOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3JfaV92dyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9pX3N2d190cnVuLFNJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX2lfc3Z3X3RydW4gOgorSGV4YWdvbl9zaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3JfaV9zdndfdHJ1biI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9yX3N2d190cnVuLFNJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX3Jfc3Z3X3RydW4gOgorSGV4YWdvbl9zaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3Jfcl9zdndfdHJ1biI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9pX3Z3LERJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX2lfdncgOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3JfaV92dyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9pX3Z3LERJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX2lfdncgOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfaV92dyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9yX3Z3LERJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX3JfdncgOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3Jfcl92dyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9yX3Z3LERJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX3JfdncgOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfcl92dyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9yX3Z3LERJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX3JfdncgOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3Jfcl92dyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzbF9yX3Z3LERJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNsX3JfdncgOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc2xfcl92dyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3ZybmRwYWNrd2gsU0lfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdnJuZHBhY2t3aCA6CitIZXhhZ29uX3NpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl92cm5kcGFja3doIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdnJuZHBhY2t3aHMsU0lfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdnJuZHBhY2t3aHMgOgorSGV4YWdvbl9zaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdnJuZHBhY2t3aHMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92c3h0YmgsRElfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdnN4dGJoIDoKK0hleGFnb25fZGlfc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3ZzeHRiaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3Z6eHRiaCxESV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92enh0YmggOgorSGV4YWdvbl9kaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdnp4dGJoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdnNhdGh1YixTSV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92c2F0aHViIDoKK0hleGFnb25fc2lfZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX3ZzYXRodWIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9zdnNhdGh1YixTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9zdnNhdGh1YiA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9zdnNhdGh1YiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3N2c2F0aGIsU0lfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfc3ZzYXRoYiA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9zdnNhdGhiIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdnNhdGhiLFNJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3ZzYXRoYiA6CitIZXhhZ29uX3NpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl92c2F0aGIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92dHJ1bm9oYixTSV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92dHJ1bm9oYiA6CitIZXhhZ29uX3NpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl92dHJ1bm9oYiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3Z0cnVuZXdoLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdnRydW5ld2ggOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl92dHJ1bmV3aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3Z0cnVub3doLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdnRydW5vd2ggOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl92dHJ1bm93aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3Z0cnVuZWhiLFNJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3Z0cnVuZWhiIDoKK0hleGFnb25fc2lfZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX3Z0cnVuZWhiIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdnN4dGh3LERJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3ZzeHRodyA6CitIZXhhZ29uX2RpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl92c3h0aHciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92enh0aHcsRElfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdnp4dGh3IDoKK0hleGFnb25fZGlfc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3Z6eHRodyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3ZzYXR3aCxTSV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92c2F0d2ggOgorSGV4YWdvbl9zaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdnNhdHdoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdnNhdHd1aCxTSV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92c2F0d3VoIDoKK0hleGFnb25fc2lfZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX3ZzYXR3dWgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9wYWNraGwsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9wYWNraGwgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9wYWNraGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zd2l6LFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3N3aXogOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3dpeiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3ZzYXRodWJfbm9wYWNrLERJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3ZzYXRodWJfbm9wYWNrIDoKK0hleGFnb25fZGlfZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX3ZzYXRodWJfbm9wYWNrIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdnNhdGhiX25vcGFjayxESV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92c2F0aGJfbm9wYWNrIDoKK0hleGFnb25fZGlfZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX3ZzYXRoYl9ub3BhY2siPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92c2F0d2hfbm9wYWNrLERJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3ZzYXR3aF9ub3BhY2sgOgorSGV4YWdvbl9kaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdnNhdHdoX25vcGFjayI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3ZzYXR3dWhfbm9wYWNrLERJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3ZzYXR3dWhfbm9wYWNrIDoKK0hleGFnb25fZGlfZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX3ZzYXR3dWhfbm9wYWNrIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfc2h1ZmZvYixESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3NodWZmb2IgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9zaHVmZm9iIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfc2h1ZmZlYixESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3NodWZmZWIgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9zaHVmZmViIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfc2h1ZmZvaCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3NodWZmb2ggOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9zaHVmZm9oIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfc2h1ZmZlaCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3NodWZmZWggOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9zaHVmZmVoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzVfcG9wY291bnRwLFNJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1M1X3BvcGNvdW50cCA6CitIZXhhZ29uX3NpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9TNV9wb3Bjb3VudHAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF9wYXJpdHksU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF9wYXJpdHkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF9wYXJpdHkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9wYXJpdHlwLFNJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfcGFyaXR5cCA6CitIZXhhZ29uX3NpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX3Bhcml0eXAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sZnNwLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbGZzcCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX2xmc3AiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9jbGJub3JtLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2NsYm5vcm0gOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfY2xibm9ybSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X2NsYmFkZGksU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF9jbGJhZGRpIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfY2xiYWRkaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X2NsYnBub3JtLFNJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1M0X2NsYnBub3JtIDoKK0hleGFnb25fc2lfZGlfSW50cmluc2ljPCJIRVhBR09OX1M0X2NsYnBub3JtIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfY2xicGFkZGksU0lfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF9jbGJwYWRkaSA6CitIZXhhZ29uX3NpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1M0X2NsYnBhZGRpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfY2xiLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2NsYiA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9jbGIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9jbDAsU0lfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfY2wwIDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2NsMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2NsMSxTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9jbDEgOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfY2wxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfY2xicCxTSV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9jbGJwIDoKK0hleGFnb25fc2lfZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX2NsYnAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9jbDBwLFNJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2NsMHAgOgorSGV4YWdvbl9zaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfY2wwcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2NsMXAsU0lfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfY2wxcCA6CitIZXhhZ29uX3NpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9jbDFwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYnJldixTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9icmV2IDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2JyZXYiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9icmV2cCxESV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9icmV2cCA6CitIZXhhZ29uX2RpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9icmV2cCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2N0MCxTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9jdDAgOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfY3QwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfY3QxLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2N0MSA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9jdDEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9jdDBwLFNJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2N0MHAgOgorSGV4YWdvbl9zaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfY3QwcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2N0MXAsU0lfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfY3QxcCA6CitIZXhhZ29uX3NpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9jdDFwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfaW50ZXJsZWF2ZSxESV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9pbnRlcmxlYXZlIDoKK0hleGFnb25fZGlfZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX2ludGVybGVhdmUiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9kZWludGVybGVhdmUsRElfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfZGVpbnRlcmxlYXZlIDoKK0hleGFnb25fZGlfZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX2RlaW50ZXJsZWF2ZSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uZGNmZXRjaF9BLHZfZnR5cGVfREkqLDEpCisvLworZGVmIGludF9oZXhhZ29uX3ByZWZldGNoIDoKK0hleGFnb25fSW50cmluc2ljPCJIRVhBR09OX3ByZWZldGNoIiwgW10sIFtsbHZtX3B0cl90eV0sIFtdPjsKK2RlZiBpbnRfaGV4YWdvbl9ZMl9kY2NsZWFuYSA6CitIZXhhZ29uX0ludHJpbnNpYzwiSEVYQUdPTl9ZMl9kY2NsZWFuYSIsIFtdLCBbbGx2bV9wdHJfdHldLCBbXT47CitkZWYgaW50X2hleGFnb25fWTJfZGNjbGVhbmludmEgOgorSGV4YWdvbl9JbnRyaW5zaWM8IkhFWEFHT05fWTJfZGNjbGVhbmludmEiLCBbXSwgW2xsdm1fcHRyX3R5XSwgW10+OworZGVmIGludF9oZXhhZ29uX1kyX2RjaW52YSA6CitIZXhhZ29uX0ludHJpbnNpYzwiSEVYQUdPTl9ZMl9kY2ludmEiLCBbXSwgW2xsdm1fcHRyX3R5XSwgW10+OworZGVmIGludF9oZXhhZ29uX1kyX2RjemVyb2EgOgorSGV4YWdvbl9JbnRyaW5zaWM8IkhFWEFHT05fWTJfZGN6ZXJvYSIsIFtdLCBbbGx2bV9wdHJfdHldLAorICAgICAgW0ludHJXcml0ZU1lbSwgSW50ckFyZ01lbU9ubHksIEludHJIYXNTaWRlRWZmZWN0c10+OworZGVmIGludF9oZXhhZ29uX1k0X2wyZmV0Y2ggOgorSGV4YWdvbl9JbnRyaW5zaWM8IkhFWEFHT05fWTRfbDJmZXRjaCIsIFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9oZXhhZ29uX1k1X2wyZmV0Y2ggOgorSGV4YWdvbl9JbnRyaW5zaWM8IkhFWEFHT05fWTVfbDJmZXRjaCIsIFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faTY0X3R5XSwgW10+OworCitkZWYgbGx2bV9wdHIzMl90eSA6IExMVk1Qb2ludGVyVHlwZTxsbHZtX2kzMl90eT47CitkZWYgbGx2bV9wdHI2NF90eSA6IExMVk1Qb2ludGVyVHlwZTxsbHZtX2k2NF90eT47CisKKy8vIE1hcmsgbG9ja2VkIGxvYWRzIGFzIHJlYWQvd3JpdGUgdG8gcHJldmVudCBhbnkgYWNjaWRlbnRhbCByZW9yZGVyaW5nLgorZGVmIGludF9oZXhhZ29uX0wyX2xvYWR3X2xvY2tlZCA6CitIZXhhZ29uX0ludHJpbnNpYzwiSEVYQUdPTl9MMl9sb2Fkd19sb2NrZWQiLCBbbGx2bV9pMzJfdHldLCBbbGx2bV9wdHIzMl90eV0sCisgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPl0+OworZGVmIGludF9oZXhhZ29uX0w0X2xvYWRkX2xvY2tlZCA6CitIZXhhZ29uX0ludHJpbnNpYzwiSEVYQUdPTl9MNF9sb2FkZF9sb2NrZWQiLCBbbGx2bV9pNjRfdHldLCBbbGx2bV9wdHI2NF90eV0sCisgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPl0+OworCitkZWYgaW50X2hleGFnb25fUzJfc3RvcmV3X2xvY2tlZCA6CitIZXhhZ29uX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9zdG9yZXdfbG9ja2VkIiwgW2xsdm1faTMyX3R5XSwKKyAgICAgIFtsbHZtX3B0cjMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+XT47CitkZWYgaW50X2hleGFnb25fUzRfc3RvcmVkX2xvY2tlZCA6CitIZXhhZ29uX0ludHJpbnNpYzwiSEVYQUdPTl9TNF9zdG9yZWRfbG9ja2VkIiwgW2xsdm1faTMyX3R5XSwKKyAgICAgIFtsbHZtX3B0cjY0X3R5LCBsbHZtX2k2NF90eV0sIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+XT47CisKKy8vIFY2MAorCitjbGFzcyBIZXhhZ29uX3YyMDQ4djIwNDhfSW50cmluc2ljX1Q8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjY0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLyB0YWcgOiBWNl9oaV9XCisvLyB0YWcgOiBWNl9sb19XCitjbGFzcyBIZXhhZ29uX3Y1MTJ2MTAyNF9JbnRyaW5zaWNfVDxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vIHRhZyA6IFY2X2hpX1dfMTI4QgorLy8gdGFnIDogVjZfbG9fV18xMjhCCitjbGFzcyBIZXhhZ29uX3YxMDI0djIwNDhfSW50cmluc2ljX1Q8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjY0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitjbGFzcyBIZXhhZ29uX3YxMDI0djEwMjRfSW50cmluc2ljX1Q8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9oaV9XLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl9oaQorZGVmIGludF9oZXhhZ29uX1Y2X2hpIDoKK0hleGFnb25fdjUxMnYxMDI0X0ludHJpbnNpY19UPCJIRVhBR09OX1Y2X2hpIj47CisKKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X2xvX1csVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X2xvCitkZWYgaW50X2hleGFnb25fVjZfbG8gOgorSGV4YWdvbl92NTEydjEwMjRfSW50cmluc2ljX1Q8IkhFWEFHT05fVjZfbG8iPjsKKworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfaGlfVyxWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfaGlfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X2hpXzEyOEIgOgorSGV4YWdvbl92MTAyNHYyMDQ4X0ludHJpbnNpY19UPCJIRVhBR09OX1Y2X2hpXzEyOEIiPjsKKworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfbG9fVyxWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfbG9fMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X2xvXzEyOEIgOgorSGV4YWdvbl92MTAyNHYyMDQ4X0ludHJpbnNpY19UPCJIRVhBR09OX1Y2X2xvXzEyOEIiPjsKKworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzc2lnbnAsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3Zhc3NpZ25wCitkZWYgaW50X2hleGFnb25fVjZfdmFzc2lnbnAgOgorSGV4YWdvbl92MTAyNHYxMDI0X0ludHJpbnNpY19UPCJIRVhBR09OX1Y2X3Zhc3NpZ25wIj47CisKKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3NpZ25wLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92YXNzaWducF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFzc2lnbnBfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDhfSW50cmluc2ljX1Q8IkhFWEFHT05fVjZfdmFzc2lnbnBfMTI4QiI+OworCisKKy8vCisvLyBIZXhhZ29uX2lpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFM2X3JvbF9pX3IKK2NsYXNzIEhleGFnb25faWlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX0xMaUxMaWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBTNl9yb2xfaV9wCitjbGFzcyBIZXhhZ29uX0xMaUxMaWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25faWlpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFM2X3JvbF9pX3JfYWNjCitjbGFzcyBIZXhhZ29uX2lpaWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSxsbHZtX2kzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fTExpTExpTExpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFM2X3JvbF9pX3BfYWNjCitjbGFzcyBIZXhhZ29uX0xMaUxMaUxMaWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSxsbHZtX2k2NF90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZhbGlnbmIKK2NsYXNzIEhleGFnb25fdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFsaWduYl8xMjhCCitjbGFzcyBIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YzMmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjUxMnY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnJvcgorY2xhc3MgSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92cm9yXzEyOEIKK2NsYXNzIEhleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEwMjR2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnVucGFja3ViCitjbGFzcyBIZXhhZ29uX3YxMDI0djUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MjA0OHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnVucGFja3ViXzEyOEIKK2NsYXNzIEhleGFnb25fdjIwNDh2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTAyNHYxMDI0djUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3Z1bnBhY2tvYgorY2xhc3MgSGV4YWdvbl92MTAyNHYxMDI0djUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MjA0OHYyMDQ4djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92dW5wYWNrb2JfMTI4QgorY2xhc3MgSGV4YWdvbl92MjA0OHYyMDQ4djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y2NGkzMl90eV0sIFtsbHZtX3Y2NGkzMl90eSxsbHZtX3YzMmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnBhY2tlYgorY2xhc3MgSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnBhY2tlYl8xMjhCCitjbGFzcyBIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MjA0OHYyMDQ4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZkbXB5YnVzX2R2XzEyOEIKK2NsYXNzIEhleGFnb25fdjIwNDh2MjA0OGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y2NGkzMl90eV0sIFtsbHZtX3Y2NGkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjIwNDh2MjA0OHYyMDQ4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZkbXB5YnVzX2R2X2FjY18xMjhCCitjbGFzcyBIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y2NGkzMl90eV0sIFtsbHZtX3Y2NGkzMl90eSxsbHZtX3Y2NGkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjUxMnY1MTJ2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZkbXB5aHZzYXRfYWNjCitjbGFzcyBIZXhhZ29uX3Y1MTJ2NTEydjUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEwMjR2MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92ZG1weWh2c2F0X2FjY18xMjhCCitjbGFzcyBIZXhhZ29uX3YxMDI0djEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3Y1MTJ2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92ZG1weWhpc2F0CitjbGFzcyBIZXhhZ29uX3Y1MTJ2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEwMjR2MjA0OGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92ZG1weWhpc2F0XzEyOEIKK2NsYXNzIEhleGFnb25fdjEwMjR2MjA0OGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3Y2NGkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjUxMnY1MTJ2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92ZG1weWhpc2F0X2FjYworY2xhc3MgSGV4YWdvbl92NTEydjUxMnYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTAyNHYxMDI0djIwNDhpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmRtcHloaXNhdF9hY2NfMTI4QgorY2xhc3MgSGV4YWdvbl92MTAyNHYxMDI0djIwNDhpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV92NjRpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMDI0djEwMjRpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZybXB5dWJpCitjbGFzcyBIZXhhZ29uX3YxMDI0djEwMjRpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1faTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MjA0OHYyMDQ4aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92cm1weXViaV8xMjhCCitjbGFzcyBIZXhhZ29uX3YyMDQ4djIwNDhpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjY0aTMyX3R5LGxsdm1faTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZybXB5dWJpX2FjYworY2xhc3MgSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1faTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZybXB5dWJpX2FjY18xMjhCCitjbGFzcyBIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92NjRpMzJfdHksbGx2bV92NjRpMzJfdHksbGx2bV9pMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZhZGRiX2R2XzEyOEIKK2NsYXNzIEhleGFnb25fdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92NjRpMzJfdHksbGx2bV92NjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMDI0djUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YWRkdWJoCitjbGFzcyBIZXhhZ29uX3YxMDI0djUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFkZHViaF8xMjhCCitjbGFzcyBIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmQwCitjbGFzcyBIZXhhZ29uX3Y1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmQwXzEyOEIKK2NsYXNzIEhleGFnb25fdjEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3Y1MTJ2NjRpdjUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YWRkYnEKK2NsYXNzIEhleGFnb25fdjUxMnY2NGl2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjUxMmkxX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTAyNHYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZhZGRicV8xMjhCCitjbGFzcyBIZXhhZ29uX3YxMDI0djEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MTAyNGkxX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZhYnNoCitjbGFzcyBIZXhhZ29uX3Y1MTJ2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YWJzaF8xMjhCCitjbGFzcyBIZXhhZ29uX3YxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEwMjR2MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdm1weWJ2X2FjYworY2xhc3MgSGV4YWdvbl92MTAyNHYxMDI0djUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjIwNDh2MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bXB5YnZfYWNjXzEyOEIKK2NsYXNzIEhleGFnb25fdjIwNDh2MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y2NGkzMl90eV0sIFtsbHZtX3Y2NGkzMl90eSxsbHZtX3YzMmkzMl90eSxsbHZtX3YzMmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEwMjR2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZtcHl1YgorY2xhc3MgSGV4YWdvbl92MTAyNHY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YyMDQ4djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdm1weXViXzEyOEIKK2NsYXNzIEhleGFnb25fdjIwNDh2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y2NGkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEwMjR2MTAyNHY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdm1weXViX2FjYworY2xhc3MgSGV4YWdvbl92MTAyNHYxMDI0djUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YxNmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjIwNDh2MjA0OHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZtcHl1Yl9hY2NfMTI4QgorY2xhc3MgSGV4YWdvbl92MjA0OHYyMDQ4djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92NjRpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3Y1MTJ2NjRpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZhbmRxcnQKK2NsYXNzIEhleGFnb25fdjUxMnY2NGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92NTEyaTFfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMDI0djEyOGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFuZHFydF8xMjhCCitjbGFzcyBIZXhhZ29uX3YxMDI0djEyOGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MTAyNGkxX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92NTEydjUxMnY2NGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFuZHFydF9hY2MKK2NsYXNzIEhleGFnb25fdjUxMnY1MTJ2NjRpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1fdjUxMmkxX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTAyNHYxMDI0djEyOGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFuZHFydF9hY2NfMTI4QgorY2xhc3MgSGV4YWdvbl92MTAyNHYxMDI0djEyOGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV92MTAyNGkxX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92NjRpdjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YW5kdnJ0CitjbGFzcyBIZXhhZ29uX3Y2NGl2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjUxMmkxX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTI4aXYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZhbmR2cnRfMTI4QgorY2xhc3MgSGV4YWdvbl92MTI4aXYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjEwMjRpMV90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjY0aXY2NGl2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZhbmR2cnRfYWNjCitjbGFzcyBIZXhhZ29uX3Y2NGl2NjRpdjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y1MTJpMV90eV0sIFtsbHZtX3Y1MTJpMV90eSxsbHZtX3YxNmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEyOGl2MTI4aXYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZhbmR2cnRfYWNjXzEyOEIKK2NsYXNzIEhleGFnb25fdjEyOGl2MTI4aXYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjEwMjRpMV90eV0sIFtsbHZtX3YxMDI0aTFfdHksbGx2bV92MzJpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3Y2NGl2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZndHcKK2NsYXNzIEhleGFnb25fdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NTEyaTFfdHldLCBbbGx2bV92MTZpMzJfdHksbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZndHdfMTI4QgorY2xhc3MgSGV4YWdvbl92MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxMDI0aTFfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92Z3R3X2FuZAorY2xhc3MgSGV4YWdvbl92NjRpdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NTEyaTFfdHldLCBbbGx2bV92NTEyaTFfdHksbGx2bV92MTZpMzJfdHksbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmd0d19hbmRfMTI4QgorY2xhc3MgSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjEwMjRpMV90eV0sIFtsbHZtX3YxMDI0aTFfdHksbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3Y2NGl2NjRpdjY0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ByZWRfb3IKK2NsYXNzIEhleGFnb25fdjY0aXY2NGl2NjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NTEyaTFfdHldLCBbbGx2bV92NTEyaTFfdHksbGx2bV92NTEyaTFfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMjhpdjEyOGl2MTI4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ByZWRfb3JfMTI4QgorY2xhc3MgSGV4YWdvbl92MTI4aXYxMjhpdjEyOGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxMDI0aTFfdHldLCBbbGx2bV92MTAyNGkxX3R5LGxsdm1fdjEwMjRpMV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjY0aXY2NGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl9wcmVkX25vdAorY2xhc3MgSGV4YWdvbl92NjRpdjY0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjUxMmkxX3R5XSwgW2xsdm1fdjUxMmkxX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTI4aXYxMjhpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfcHJlZF9ub3RfMTI4QgorY2xhc3MgSGV4YWdvbl92MTI4aXYxMjhpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTAyNGkxX3R5XSwgW2xsdm1fdjEwMjRpMV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjY0aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl9wcmVkX3NjYWxhcjIKK2NsYXNzIEhleGFnb25fdjY0aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y1MTJpMV90eV0sIFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEyOGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfcHJlZF9zY2FsYXIyXzEyOEIKK2NsYXNzIEhleGFnb25fdjEyOGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTAyNGkxX3R5XSwgW2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTAyNHY2NGl2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3Zzd2FwCitjbGFzcyBIZXhhZ29uX3YxMDI0djY0aXY1MTJ2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92NTEyaTFfdHksbGx2bV92MTZpMzJfdHksbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YyMDQ4djEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnN3YXBfMTI4QgorY2xhc3MgSGV4YWdvbl92MjA0OHYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjEwMjRpMV90eSxsbHZtX3YzMmkzMl90eSxsbHZtX3YzMmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEwMjR2NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92c2h1ZmZ2ZGQKK2NsYXNzIEhleGFnb25fdjEwMjR2NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjIwNDh2MTAyNHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZzaHVmZnZkZF8xMjhCCitjbGFzcyBIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y2NGkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YzMmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworCisvLworLy8gSGV4YWdvbl9pdjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl9leHRyYWN0dworY2xhc3MgSGV4YWdvbl9pdjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25faXYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X2V4dHJhY3R3XzEyOEIKK2NsYXNzIEhleGFnb25faXYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X2x2c3BsYXR3CitjbGFzcyBIZXhhZ29uX3Y1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHldLCBbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X2x2c3BsYXR3XzEyOEIKK2NsYXNzIEhleGFnb25fdjEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3Y1MTJ2NTEydjUxMnY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmx1dHZ2Yl9vcmFjYworY2xhc3MgSGV4YWdvbl92NTEydjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTAyNHYxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bHV0dnZiX29yYWNjXzEyOEIKK2NsYXNzIEhleGFnb25fdjEwMjR2MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMDI0djEwMjR2NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bHV0dndoX29yYWNjCitjbGFzcyBIZXhhZ29uX3YxMDI0djEwMjR2NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjIwNDh2MjA0OHYxMDI0djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmx1dHZ3aF9vcmFjY18xMjhCCitjbGFzcyBIZXhhZ29uX3YyMDQ4djIwNDh2MTAyNHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjY0aTMyX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92djY0aXZtZW12NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnOiBWNl92UzMyYl9xcHJlZF9haQorY2xhc3MgSGV4YWdvbl92djY0aXZtZW12NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW2xsdm1fdjUxMmkxX3R5LGxsdm1fcHRyX3R5LGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKKy8vCisvLyBIZXhhZ29uX3Z2MTI4aXZtZW12MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZzogVjZfdlMzMmJfcXByZWRfYWlfMTI4QgorY2xhc3MgSGV4YWdvbl92djEyOGl2bWVtdjEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLCBbbGx2bV92MTAyNGkxX3R5LGxsdm1fcHRyX3R5LGxsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNl9yb2xfaV9yLFNJX2Z0eXBlX1NJU0ksMikKKy8vIHRhZyA6IFM2X3JvbF9pX3IKK2RlZiBpbnRfaGV4YWdvbl9TNl9yb2xfaV9yIDoKK0hleGFnb25faWlpX0ludHJpbnNpYzwiSEVYQUdPTl9TNl9yb2xfaV9yIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNl9yb2xfaV9wLERJX2Z0eXBlX0RJU0ksMikKKy8vIHRhZyA6IFM2X3JvbF9pX3AKK2RlZiBpbnRfaGV4YWdvbl9TNl9yb2xfaV9wIDoKK0hleGFnb25fTExpTExpaV9JbnRyaW5zaWM8IkhFWEFHT05fUzZfcm9sX2lfcCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzZfcm9sX2lfcl9hY2MsU0lfZnR5cGVfU0lTSVNJLDMpCisvLyB0YWcgOiBTNl9yb2xfaV9yX2FjYworZGVmIGludF9oZXhhZ29uX1M2X3JvbF9pX3JfYWNjIDoKK0hleGFnb25faWlpaV9JbnRyaW5zaWM8IkhFWEFHT05fUzZfcm9sX2lfcl9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM2X3JvbF9pX3BfYWNjLERJX2Z0eXBlX0RJRElTSSwzKQorLy8gdGFnIDogUzZfcm9sX2lfcF9hY2MKK2RlZiBpbnRfaGV4YWdvbl9TNl9yb2xfaV9wX2FjYyA6CitIZXhhZ29uX0xMaUxMaUxMaWlfSW50cmluc2ljPCJIRVhBR09OX1M2X3JvbF9pX3BfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNl9yb2xfaV9yX25hYyxTSV9mdHlwZV9TSVNJU0ksMykKKy8vIHRhZyA6IFM2X3JvbF9pX3JfbmFjCitkZWYgaW50X2hleGFnb25fUzZfcm9sX2lfcl9uYWMgOgorSGV4YWdvbl9paWlpX0ludHJpbnNpYzwiSEVYQUdPTl9TNl9yb2xfaV9yX25hYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzZfcm9sX2lfcF9uYWMsRElfZnR5cGVfRElESVNJLDMpCisvLyB0YWcgOiBTNl9yb2xfaV9wX25hYworZGVmIGludF9oZXhhZ29uX1M2X3JvbF9pX3BfbmFjIDoKK0hleGFnb25fTExpTExpTExpaV9JbnRyaW5zaWM8IkhFWEFHT05fUzZfcm9sX2lfcF9uYWMiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM2X3JvbF9pX3JfeGFjYyxTSV9mdHlwZV9TSVNJU0ksMykKKy8vIHRhZyA6IFM2X3JvbF9pX3JfeGFjYworZGVmIGludF9oZXhhZ29uX1M2X3JvbF9pX3JfeGFjYyA6CitIZXhhZ29uX2lpaWlfSW50cmluc2ljPCJIRVhBR09OX1M2X3JvbF9pX3JfeGFjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzZfcm9sX2lfcF94YWNjLERJX2Z0eXBlX0RJRElTSSwzKQorLy8gdGFnIDogUzZfcm9sX2lfcF94YWNjCitkZWYgaW50X2hleGFnb25fUzZfcm9sX2lfcF94YWNjIDoKK0hleGFnb25fTExpTExpTExpaV9JbnRyaW5zaWM8IkhFWEFHT05fUzZfcm9sX2lfcF94YWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNl9yb2xfaV9yX2FuZCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vIHRhZyA6IFM2X3JvbF9pX3JfYW5kCitkZWYgaW50X2hleGFnb25fUzZfcm9sX2lfcl9hbmQgOgorSGV4YWdvbl9paWlpX0ludHJpbnNpYzwiSEVYQUdPTl9TNl9yb2xfaV9yX2FuZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzZfcm9sX2lfcl9vcixTSV9mdHlwZV9TSVNJU0ksMykKKy8vIHRhZyA6IFM2X3JvbF9pX3Jfb3IKK2RlZiBpbnRfaGV4YWdvbl9TNl9yb2xfaV9yX29yIDoKK0hleGFnb25faWlpaV9JbnRyaW5zaWM8IkhFWEFHT05fUzZfcm9sX2lfcl9vciI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzZfcm9sX2lfcF9hbmQsRElfZnR5cGVfRElESVNJLDMpCisvLyB0YWcgOiBTNl9yb2xfaV9wX2FuZAorZGVmIGludF9oZXhhZ29uX1M2X3JvbF9pX3BfYW5kIDoKK0hleGFnb25fTExpTExpTExpaV9JbnRyaW5zaWM8IkhFWEFHT05fUzZfcm9sX2lfcF9hbmQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM2X3JvbF9pX3Bfb3IsRElfZnR5cGVfRElESVNJLDMpCisvLyB0YWcgOiBTNl9yb2xfaV9wX29yCitkZWYgaW50X2hleGFnb25fUzZfcm9sX2lfcF9vciA6CitIZXhhZ29uX0xMaUxMaUxMaWlfSW50cmluc2ljPCJIRVhBR09OX1M2X3JvbF9pX3Bfb3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2NhYmFjZW5jYmluLERJX2Z0eXBlX0RJRElRSSwzKQorLy8gdGFnIDogUzJfY2FiYWNlbmNiaW4KK2RlZiBpbnRfaGV4YWdvbl9TMl9jYWJhY2VuY2JpbiA6CitIZXhhZ29uX0xMaUxMaUxMaWlfSW50cmluc2ljPCJIRVhBR09OX1MyX2NhYmFjZW5jYmluIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWxpZ25iLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFsaWduYgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhbGlnbmIgOgorSGV4YWdvbl92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWxpZ25iIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWxpZ25iXzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YWxpZ25iXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWxpZ25iXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWxpZ25iXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsYWxpZ25iLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmxhbGlnbmIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bGFsaWduYiA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsYWxpZ25iIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bGFsaWduYl8xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmxhbGlnbmJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZsYWxpZ25iXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bGFsaWduYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWxpZ25iaSxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZhbGlnbmJpCitkZWYgaW50X2hleGFnb25fVjZfdmFsaWduYmkgOgorSGV4YWdvbl92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWxpZ25iaSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFsaWduYmlfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZhbGlnbmJpXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWxpZ25iaV8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFsaWduYmlfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmxhbGlnbmJpLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmxhbGlnbmJpCitkZWYgaW50X2hleGFnb25fVjZfdmxhbGlnbmJpIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmxhbGlnbmJpIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bGFsaWduYmlfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZsYWxpZ25iaV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmxhbGlnbmJpXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bGFsaWduYmlfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJvcixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92cm9yCitkZWYgaW50X2hleGFnb25fVjZfdnJvciA6CitIZXhhZ29uX3Y1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJvciI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJvcl8xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3Zyb3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zyb3JfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm9yXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z1bnBhY2t1YixWRF9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnVucGFja3ViCitkZWYgaW50X2hleGFnb25fVjZfdnVucGFja3ViIDoKK0hleGFnb25fdjEwMjR2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dW5wYWNrdWIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z1bnBhY2t1Yl8xMjhCLFZEX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92dW5wYWNrdWJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Z1bnBhY2t1Yl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnVucGFja3ViXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z1bnBhY2tiLFZEX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92dW5wYWNrYgorZGVmIGludF9oZXhhZ29uX1Y2X3Z1bnBhY2tiIDoKK0hleGFnb25fdjEwMjR2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dW5wYWNrYiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnVucGFja2JfMTI4QixWRF9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnVucGFja2JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Z1bnBhY2tiXzEyOEIgOgorSGV4YWdvbl92MjA0OHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dW5wYWNrYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92dW5wYWNrdWgsVkRfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3Z1bnBhY2t1aAorZGVmIGludF9oZXhhZ29uX1Y2X3Z1bnBhY2t1aCA6CitIZXhhZ29uX3YxMDI0djUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnVucGFja3VoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92dW5wYWNrdWhfMTI4QixWRF9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnVucGFja3VoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92dW5wYWNrdWhfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z1bnBhY2t1aF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92dW5wYWNraCxWRF9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnVucGFja2gKK2RlZiBpbnRfaGV4YWdvbl9WNl92dW5wYWNraCA6CitIZXhhZ29uX3YxMDI0djUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnVucGFja2giPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z1bnBhY2toXzEyOEIsVkRfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3Z1bnBhY2toXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92dW5wYWNraF8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnVucGFja2hfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnVucGFja29iLFZEX2Z0eXBlX1ZEVkksMikKKy8vIHRhZyA6IFY2X3Z1bnBhY2tvYgorZGVmIGludF9oZXhhZ29uX1Y2X3Z1bnBhY2tvYiA6CitIZXhhZ29uX3YxMDI0djEwMjR2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dW5wYWNrb2IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z1bnBhY2tvYl8xMjhCLFZEX2Z0eXBlX1ZEVkksMikKKy8vIHRhZyA6IFY2X3Z1bnBhY2tvYl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnVucGFja29iXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z1bnBhY2tvYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92dW5wYWNrb2gsVkRfZnR5cGVfVkRWSSwyKQorLy8gdGFnIDogVjZfdnVucGFja29oCitkZWYgaW50X2hleGFnb25fVjZfdnVucGFja29oIDoKK0hleGFnb25fdjEwMjR2MTAyNHY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z1bnBhY2tvaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnVucGFja29oXzEyOEIsVkRfZnR5cGVfVkRWSSwyKQorLy8gdGFnIDogVjZfdnVucGFja29oXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92dW5wYWNrb2hfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnVucGFja29oXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZwYWNrZWIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnBhY2tlYgorZGVmIGludF9oZXhhZ29uX1Y2X3ZwYWNrZWIgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZwYWNrZWIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZwYWNrZWJfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cGFja2ViXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cGFja2ViXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZwYWNrZWJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnBhY2tlaCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cGFja2VoCitkZWYgaW50X2hleGFnb25fVjZfdnBhY2tlaCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnBhY2tlaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnBhY2tlaF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZwYWNrZWhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZwYWNrZWhfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnBhY2tlaF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cGFja29iLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZwYWNrb2IKK2RlZiBpbnRfaGV4YWdvbl9WNl92cGFja29iIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cGFja29iIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cGFja29iXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnBhY2tvYl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnBhY2tvYl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cGFja29iXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZwYWNrb2gsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnBhY2tvaAorZGVmIGludF9oZXhhZ29uX1Y2X3ZwYWNrb2ggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZwYWNrb2giPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZwYWNrb2hfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cGFja29oXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cGFja29oXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZwYWNrb2hfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnBhY2todWJfc2F0LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZwYWNraHViX3NhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZwYWNraHViX3NhdCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnBhY2todWJfc2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cGFja2h1Yl9zYXRfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cGFja2h1Yl9zYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZwYWNraHViX3NhdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cGFja2h1Yl9zYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnBhY2toYl9zYXQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnBhY2toYl9zYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92cGFja2hiX3NhdCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnBhY2toYl9zYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZwYWNraGJfc2F0XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnBhY2toYl9zYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZwYWNraGJfc2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZwYWNraGJfc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZwYWNrd3VoX3NhdCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cGFja3d1aF9zYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92cGFja3d1aF9zYXQgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZwYWNrd3VoX3NhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnBhY2t3dWhfc2F0XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnBhY2t3dWhfc2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cGFja3d1aF9zYXRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnBhY2t3dWhfc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZwYWNrd2hfc2F0LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZwYWNrd2hfc2F0CitkZWYgaW50X2hleGFnb25fVjZfdnBhY2t3aF9zYXQgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZwYWNrd2hfc2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cGFja3doX3NhdF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZwYWNrd2hfc2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cGFja3doX3NhdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cGFja3doX3NhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92emIsVkRfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3Z6YgorZGVmIGludF9oZXhhZ29uX1Y2X3Z6YiA6CitIZXhhZ29uX3YxMDI0djUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnpiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92emJfMTI4QixWRF9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnpiXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92emJfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z6Yl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2IsVkRfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3ZzYgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzYiA6CitIZXhhZ29uX3YxMDI0djUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2JfMTI4QixWRF9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnNiXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2JfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92emgsVkRfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3Z6aAorZGVmIGludF9oZXhhZ29uX1Y2X3Z6aCA6CitIZXhhZ29uX3YxMDI0djUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnpoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92emhfMTI4QixWRF9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnpoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92emhfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z6aF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2gsVkRfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3ZzaAorZGVmIGludF9oZXhhZ29uX1Y2X3ZzaCA6CitIZXhhZ29uX3YxMDI0djUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2hfMTI4QixWRF9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnNoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2hfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzaF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWJ1cyxWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92ZG1weWJ1cworZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5YnVzIDoKK0hleGFnb25fdjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWJ1cyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHlidXNfMTI4QixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92ZG1weWJ1c18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHlidXNfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWJ1c18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWJ1c19hY2MsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92ZG1weWJ1c19hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWJ1c19hY2MgOgorSGV4YWdvbl92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWJ1c19hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5YnVzX2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmRtcHlidXNfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWJ1c19hY2NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5YnVzX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWJ1c19kdixWRF9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92ZG1weWJ1c19kdgorZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5YnVzX2R2IDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5YnVzX2R2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWJ1c19kdl8xMjhCLFZEX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3ZkbXB5YnVzX2R2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWJ1c19kdl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5YnVzX2R2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5YnVzX2R2X2FjYyxWRF9mdHlwZV9WRFZEU0ksMykKKy8vIHRhZyA6IFY2X3ZkbXB5YnVzX2R2X2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5YnVzX2R2X2FjYyA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5YnVzX2R2X2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHlidXNfZHZfYWNjXzEyOEIsVkRfZnR5cGVfVkRWRFNJLDMpCisvLyB0YWcgOiBWNl92ZG1weWJ1c19kdl9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5YnVzX2R2X2FjY18xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHlidXNfZHZfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aGIsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmRtcHloYgorZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5aGIgOgorSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aGIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aGJfMTI4QixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92ZG1weWhiXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhiXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWhiX2FjYyxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZkbXB5aGJfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloYl9hY2MgOgorSGV4YWdvbl92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWhiX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloYl9hY2NfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZkbXB5aGJfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhiX2FjY18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloYl9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloYl9kdixWRF9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92ZG1weWhiX2R2CitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloYl9kdiA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWhiX2R2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWhiX2R2XzEyOEIsVkRfZnR5cGVfVkRTSSwyKQorLy8gdGFnIDogVjZfdmRtcHloYl9kdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloYl9kdl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aGJfZHZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloYl9kdl9hY2MsVkRfZnR5cGVfVkRWRFNJLDMpCisvLyB0YWcgOiBWNl92ZG1weWhiX2R2X2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5aGJfZHZfYWNjIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloYl9kdl9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aGJfZHZfYWNjXzEyOEIsVkRfZnR5cGVfVkRWRFNJLDMpCisvLyB0YWcgOiBWNl92ZG1weWhiX2R2X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloYl9kdl9hY2NfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aGJfZHZfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aHZzYXQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmRtcHlodnNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5aHZzYXQgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aHZzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aHZzYXRfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92ZG1weWh2c2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWh2c2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aHZzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHlodnNhdF9hY2MsVklfZnR5cGVfVklWSVZJLDMpCisvLyB0YWcgOiBWNl92ZG1weWh2c2F0X2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5aHZzYXRfYWNjIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHlodnNhdF9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aHZzYXRfYWNjXzEyOEIsVklfZnR5cGVfVklWSVZJLDMpCisvLyB0YWcgOiBWNl92ZG1weWh2c2F0X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHlodnNhdF9hY2NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWh2c2F0X2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWhzYXQsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmRtcHloc2F0CitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloc2F0IDoKK0hleGFnb25fdjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWhzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aHNhdF8xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZkbXB5aHNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloc2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aHNhdF9hY2MsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92ZG1weWhzYXRfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloc2F0X2FjYyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aHNhdF9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aHNhdF9hY2NfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZkbXB5aHNhdF9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5aHNhdF9hY2NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aHNhdF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloaXNhdCxWSV9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92ZG1weWhpc2F0CitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloaXNhdCA6CitIZXhhZ29uX3Y1MTJ2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aGlzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aGlzYXRfMTI4QixWSV9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92ZG1weWhpc2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhpc2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloaXNhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWhpc2F0X2FjYyxWSV9mdHlwZV9WSVZEU0ksMykKKy8vIHRhZyA6IFY2X3ZkbXB5aGlzYXRfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloaXNhdF9hY2MgOgorSGV4YWdvbl92NTEydjUxMnYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloaXNhdF9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aGlzYXRfYWNjXzEyOEIsVklfZnR5cGVfVklWRFNJLDMpCisvLyB0YWcgOiBWNl92ZG1weWhpc2F0X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloaXNhdF9hY2NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MjA0OGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aGlzYXRfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aHN1c2F0LFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZkbXB5aHN1c2F0CitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloc3VzYXQgOgorSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aHN1c2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWhzdXNhdF8xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZkbXB5aHN1c2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhzdXNhdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aHN1c2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aHN1c2F0X2FjYyxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZkbXB5aHN1c2F0X2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5aHN1c2F0X2FjYyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aHN1c2F0X2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloc3VzYXRfYWNjXzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92ZG1weWhzdXNhdF9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5aHN1c2F0X2FjY18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloc3VzYXRfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aHN1aXNhdCxWSV9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92ZG1weWhzdWlzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhzdWlzYXQgOgorSGV4YWdvbl92NTEydjEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWhzdWlzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aHN1aXNhdF8xMjhCLFZJX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3ZkbXB5aHN1aXNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloc3Vpc2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloc3Vpc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aHN1aXNhdF9hY2MsVklfZnR5cGVfVklWRFNJLDMpCisvLyB0YWcgOiBWNl92ZG1weWhzdWlzYXRfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloc3Vpc2F0X2FjYyA6CitIZXhhZ29uX3Y1MTJ2NTEydjEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWhzdWlzYXRfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWhzdWlzYXRfYWNjXzEyOEIsVklfZnR5cGVfVklWRFNJLDMpCisvLyB0YWcgOiBWNl92ZG1weWhzdWlzYXRfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhzdWlzYXRfYWNjXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djIwNDhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWhzdWlzYXRfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z0bXB5YixWRF9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92dG1weWIKK2RlZiBpbnRfaGV4YWdvbl9WNl92dG1weWIgOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnRtcHliIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92dG1weWJfMTI4QixWRF9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92dG1weWJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Z0bXB5Yl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z0bXB5Yl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92dG1weWJfYWNjLFZEX2Z0eXBlX1ZEVkRTSSwzKQorLy8gdGFnIDogVjZfdnRtcHliX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3Z0bXB5Yl9hY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dG1weWJfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92dG1weWJfYWNjXzEyOEIsVkRfZnR5cGVfVkRWRFNJLDMpCisvLyB0YWcgOiBWNl92dG1weWJfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92dG1weWJfYWNjXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dG1weWJfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z0bXB5YnVzLFZEX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3Z0bXB5YnVzCitkZWYgaW50X2hleGFnb25fVjZfdnRtcHlidXMgOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnRtcHlidXMiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z0bXB5YnVzXzEyOEIsVkRfZnR5cGVfVkRTSSwyKQorLy8gdGFnIDogVjZfdnRtcHlidXNfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Z0bXB5YnVzXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnRtcHlidXNfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnRtcHlidXNfYWNjLFZEX2Z0eXBlX1ZEVkRTSSwzKQorLy8gdGFnIDogVjZfdnRtcHlidXNfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdnRtcHlidXNfYWNjIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnRtcHlidXNfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92dG1weWJ1c19hY2NfMTI4QixWRF9mdHlwZV9WRFZEU0ksMykKKy8vIHRhZyA6IFY2X3Z0bXB5YnVzX2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnRtcHlidXNfYWNjXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dG1weWJ1c19hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnRtcHloYixWRF9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92dG1weWhiCitkZWYgaW50X2hleGFnb25fVjZfdnRtcHloYiA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dG1weWhiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92dG1weWhiXzEyOEIsVkRfZnR5cGVfVkRTSSwyKQorLy8gdGFnIDogVjZfdnRtcHloYl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnRtcHloYl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z0bXB5aGJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnRtcHloYl9hY2MsVkRfZnR5cGVfVkRWRFNJLDMpCisvLyB0YWcgOiBWNl92dG1weWhiX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3Z0bXB5aGJfYWNjIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnRtcHloYl9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z0bXB5aGJfYWNjXzEyOEIsVkRfZnR5cGVfVkRWRFNJLDMpCisvLyB0YWcgOiBWNl92dG1weWhiX2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnRtcHloYl9hY2NfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z0bXB5aGJfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5dWIsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdnJtcHl1YgorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5dWIgOgorSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5dWIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5dWJfMTI4QixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92cm1weXViXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weXViXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHl1Yl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weXViX2FjYyxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZybXB5dWJfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHl1Yl9hY2MgOgorSGV4YWdvbl92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weXViX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHl1Yl9hY2NfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZybXB5dWJfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weXViX2FjY18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHl1Yl9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHl1YnYsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnJtcHl1YnYKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weXVidiA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHl1YnYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5dWJ2XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnJtcHl1YnZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5dWJ2XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5dWJ2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5dWJ2X2FjYyxWSV9mdHlwZV9WSVZJVkksMykKKy8vIHRhZyA6IFY2X3ZybXB5dWJ2X2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5dWJ2X2FjYyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5dWJ2X2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHl1YnZfYWNjXzEyOEIsVklfZnR5cGVfVklWSVZJLDMpCisvLyB0YWcgOiBWNl92cm1weXVidl9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5dWJ2X2FjY18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5dWJ2X2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weWJ2LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZybXB5YnYKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weWJ2IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weWJ2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weWJ2XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnJtcHlidl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHlidl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weWJ2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5YnZfYWNjLFZJX2Z0eXBlX1ZJVklWSSwzKQorLy8gdGFnIDogVjZfdnJtcHlidl9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weWJ2X2FjYyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5YnZfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weWJ2X2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklWSSwzKQorLy8gdGFnIDogVjZfdnJtcHlidl9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5YnZfYWNjXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHlidl9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHl1YmksVkRfZnR5cGVfVkRTSVNJLDMpCisvLyB0YWcgOiBWNl92cm1weXViaQorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5dWJpIDoKK0hleGFnb25fdjEwMjR2MTAyNGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weXViaSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHl1YmlfMTI4QixWRF9mdHlwZV9WRFNJU0ksMykKKy8vIHRhZyA6IFY2X3ZybXB5dWJpXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weXViaV8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weXViaV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weXViaV9hY2MsVkRfZnR5cGVfVkRWRFNJU0ksNCkKKy8vIHRhZyA6IFY2X3ZybXB5dWJpX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5dWJpX2FjYyA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weXViaV9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5dWJpX2FjY18xMjhCLFZEX2Z0eXBlX1ZEVkRTSVNJLDQpCisvLyB0YWcgOiBWNl92cm1weXViaV9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5dWJpX2FjY18xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4aWlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5dWJpX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weWJ1cyxWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92cm1weWJ1cworZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5YnVzIDoKK0hleGFnb25fdjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weWJ1cyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHlidXNfMTI4QixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92cm1weWJ1c18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHlidXNfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weWJ1c18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weWJ1c19hY2MsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92cm1weWJ1c19hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weWJ1c19hY2MgOgorSGV4YWdvbl92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weWJ1c19hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5YnVzX2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdnJtcHlidXNfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weWJ1c19hY2NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5YnVzX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weWJ1c2ksVkRfZnR5cGVfVkRTSVNJLDMpCisvLyB0YWcgOiBWNl92cm1weWJ1c2kKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weWJ1c2kgOgorSGV4YWdvbl92MTAyNHYxMDI0aWlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5YnVzaSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHlidXNpXzEyOEIsVkRfZnR5cGVfVkRTSVNJLDMpCisvLyB0YWcgOiBWNl92cm1weWJ1c2lfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5YnVzaV8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weWJ1c2lfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHlidXNpX2FjYyxWRF9mdHlwZV9WRFZEU0lTSSw0KQorLy8gdGFnIDogVjZfdnJtcHlidXNpX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5YnVzaV9hY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHlidXNpX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHlidXNpX2FjY18xMjhCLFZEX2Z0eXBlX1ZEVkRTSVNJLDQpCisvLyB0YWcgOiBWNl92cm1weWJ1c2lfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weWJ1c2lfYWNjXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhpaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHlidXNpX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weWJ1c3YsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnJtcHlidXN2CitkZWYgaW50X2hleGFnb25fVjZfdnJtcHlidXN2IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weWJ1c3YiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5YnVzdl8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZybXB5YnVzdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHlidXN2XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5YnVzdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weWJ1c3ZfYWNjLFZJX2Z0eXBlX1ZJVklWSSwzKQorLy8gdGFnIDogVjZfdnJtcHlidXN2X2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5YnVzdl9hY2MgOgorSGV4YWdvbl92NTEydjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weWJ1c3ZfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weWJ1c3ZfYWNjXzEyOEIsVklfZnR5cGVfVklWSVZJLDMpCisvLyB0YWcgOiBWNl92cm1weWJ1c3ZfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weWJ1c3ZfYWNjXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHlidXN2X2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZHNhZHVoLFZEX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3Zkc2FkdWgKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZHNhZHVoIDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zkc2FkdWgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zkc2FkdWhfMTI4QixWRF9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92ZHNhZHVoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZHNhZHVoXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRzYWR1aF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZHNhZHVoX2FjYyxWRF9mdHlwZV9WRFZEU0ksMykKKy8vIHRhZyA6IFY2X3Zkc2FkdWhfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmRzYWR1aF9hY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZHNhZHVoX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRzYWR1aF9hY2NfMTI4QixWRF9mdHlwZV9WRFZEU0ksMykKKy8vIHRhZyA6IFY2X3Zkc2FkdWhfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZHNhZHVoX2FjY18xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRzYWR1aF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJzYWR1YmksVkRfZnR5cGVfVkRTSVNJLDMpCisvLyB0YWcgOiBWNl92cnNhZHViaQorZGVmIGludF9oZXhhZ29uX1Y2X3Zyc2FkdWJpIDoKK0hleGFnb25fdjEwMjR2MTAyNGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cnNhZHViaSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJzYWR1YmlfMTI4QixWRF9mdHlwZV9WRFNJU0ksMykKKy8vIHRhZyA6IFY2X3Zyc2FkdWJpXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cnNhZHViaV8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cnNhZHViaV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cnNhZHViaV9hY2MsVkRfZnR5cGVfVkRWRFNJU0ksNCkKKy8vIHRhZyA6IFY2X3Zyc2FkdWJpX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3Zyc2FkdWJpX2FjYyA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cnNhZHViaV9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zyc2FkdWJpX2FjY18xMjhCLFZEX2Z0eXBlX1ZEVkRTSVNJLDQpCisvLyB0YWcgOiBWNl92cnNhZHViaV9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zyc2FkdWJpX2FjY18xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4aWlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zyc2FkdWJpX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNydyxWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92YXNydworZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3J3IDoKK0hleGFnb25fdjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNydyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcndfMTI4QixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92YXNyd18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFzcndfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNyd18xMjhCIj47CisKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc2x3LFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3Zhc2x3CitkZWYgaW50X2hleGFnb25fVjZfdmFzbHcgOgorSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc2x3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNsd18xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3Zhc2x3XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNsd18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc2x3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zsc3J3LFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3Zsc3J3CitkZWYgaW50X2hleGFnb25fVjZfdmxzcncgOgorSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zsc3J3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHNyd18xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3Zsc3J3XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHNyd18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zsc3J3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3J3dixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXNyd3YKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyd3YgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3J3diI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcnd2XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFzcnd2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyd3ZfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcnd2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc2x3dixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXNsd3YKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNsd3YgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc2x3diI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzbHd2XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFzbHd2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNsd3ZfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzbHd2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zsc3J3dixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bHNyd3YKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHNyd3YgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zsc3J3diI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmxzcnd2XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmxzcnd2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHNyd3ZfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmxzcnd2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3JoLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3Zhc3JoCitkZWYgaW50X2hleGFnb25fVjZfdmFzcmggOgorSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3JoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNyaF8xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3Zhc3JoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyaF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3JoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc2xoLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3Zhc2xoCitkZWYgaW50X2hleGFnb25fVjZfdmFzbGggOgorSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc2xoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNsaF8xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3Zhc2xoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNsaF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc2xoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zsc3JoLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3Zsc3JoCitkZWYgaW50X2hleGFnb25fVjZfdmxzcmggOgorSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zsc3JoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHNyaF8xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3Zsc3JoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHNyaF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zsc3JoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3JodixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXNyaHYKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyaHYgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3JodiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcmh2XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFzcmh2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyaHZfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcmh2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc2xodixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXNsaHYKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNsaHYgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc2xodiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzbGh2XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFzbGh2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNsaHZfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzbGh2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zsc3JodixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bHNyaHYKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHNyaHYgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zsc3JodiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmxzcmh2XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmxzcmh2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHNyaHZfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmxzcmh2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3J3aCxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3J3aAorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3J3aCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3J3aCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcndoXzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNyd2hfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3J3aF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcndoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3J3aHNhdCxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3J3aHNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3J3aHNhdCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3J3aHNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcndoc2F0XzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNyd2hzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3J3aHNhdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcndoc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3J3aHJuZHNhdCxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3J3aHJuZHNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3J3aHJuZHNhdCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3J3aHJuZHNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcndocm5kc2F0XzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNyd2hybmRzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3J3aHJuZHNhdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcndocm5kc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3J3dWhzYXQsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNyd3Voc2F0CitkZWYgaW50X2hleGFnb25fVjZfdmFzcnd1aHNhdCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3J3dWhzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3J3dWhzYXRfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3J3dWhzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3J3dWhzYXRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3J3dWhzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJvdW5kd2gsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnJvdW5kd2gKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm91bmR3aCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJvdW5kd2giPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zyb3VuZHdoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnJvdW5kd2hfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zyb3VuZHdoXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zyb3VuZHdoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zyb3VuZHd1aCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cm91bmR3dWgKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm91bmR3dWggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zyb3VuZHd1aCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJvdW5kd3VoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnJvdW5kd3VoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm91bmR3dWhfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJvdW5kd3VoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3JodWJzYXQsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNyaHVic2F0CitkZWYgaW50X2hleGFnb25fVjZfdmFzcmh1YnNhdCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3JodWJzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3JodWJzYXRfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3JodWJzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3JodWJzYXRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3JodWJzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcmh1YnJuZHNhdCxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3JodWJybmRzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyaHVicm5kc2F0IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcmh1YnJuZHNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcmh1YnJuZHNhdF8xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcmh1YnJuZHNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFzcmh1YnJuZHNhdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcmh1YnJuZHNhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNyaGJybmRzYXQsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNyaGJybmRzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyaGJybmRzYXQgOgorSGV4YWdvbl92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNyaGJybmRzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3JoYnJuZHNhdF8xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcmhicm5kc2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyaGJybmRzYXRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3JoYnJuZHNhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm91bmRoYixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cm91bmRoYgorZGVmIGludF9oZXhhZ29uX1Y2X3Zyb3VuZGhiIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm91bmRoYiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJvdW5kaGJfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cm91bmRoYl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnJvdW5kaGJfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJvdW5kaGJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJvdW5kaHViLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zyb3VuZGh1YgorZGVmIGludF9oZXhhZ29uX1Y2X3Zyb3VuZGh1YiA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJvdW5kaHViIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm91bmRodWJfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cm91bmRodWJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zyb3VuZGh1Yl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm91bmRodWJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzbHdfYWNjLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzbHdfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmFzbHdfYWNjIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzbHdfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNsd19hY2NfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc2x3X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFzbHdfYWNjXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNsd19hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcndfYWNjLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcndfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmFzcndfYWNjIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcndfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNyd19hY2NfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3J3X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFzcndfYWNjXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNyd19hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZGIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkYiA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRiXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZGJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRiXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRiXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJiLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJiCitkZWYgaW50X2hleGFnb25fVjZfdnN1YmIgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3ViYl8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJiXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViYl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkYl9kdixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92YWRkYl9kdgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRiX2R2IDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkYl9kdiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGJfZHZfMTI4QixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92YWRkYl9kdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGJfZHZfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGJfZHZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YmJfZHYsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdnN1YmJfZHYKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViYl9kdiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YmJfZHYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJiX2R2XzEyOEIsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdnN1YmJfZHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJiX2R2XzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJiX2R2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRoLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGRoCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkaF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGRoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkaF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkaF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3ViaCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3ViaAorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJoIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YmhfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3ViaF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YmhfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YmhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGhfZHYsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdmFkZGhfZHYKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkaF9kdiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGhfZHYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRoX2R2XzEyOEIsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdmFkZGhfZHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRoX2R2XzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRoX2R2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJoX2R2LFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZzdWJoX2R2CitkZWYgaW50X2hleGFnb25fVjZfdnN1YmhfZHYgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJoX2R2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3ViaF9kdl8xMjhCLFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZzdWJoX2R2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViaF9kdl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViaF9kdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdyxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkdworZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR3IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZHdfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkd18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZHdfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHdfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YncsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnN1YncKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3VidyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YnciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJ3XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnN1YndfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ3XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR3X2R2LFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZhZGR3X2R2CitkZWYgaW50X2hleGFnb25fVjZfdmFkZHdfZHYgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR3X2R2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkd19kdl8xMjhCLFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZhZGR3X2R2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkd19kdl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkd19kdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3Vid19kdixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92c3Vid19kdgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ3X2R2IDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3Vid19kdiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YndfZHZfMTI4QixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92c3Vid19kdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YndfZHZfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YndfZHZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZHVic2F0LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGR1YnNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1YnNhdCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHVic2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdWJzYXRfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkdWJzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1YnNhdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdWJzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZHVic2F0X2R2LFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZhZGR1YnNhdF9kdgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1YnNhdF9kdiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHVic2F0X2R2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdWJzYXRfZHZfMTI4QixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92YWRkdWJzYXRfZHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1YnNhdF9kdl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdWJzYXRfZHZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YnVic2F0LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJ1YnNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ1YnNhdCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YnVic2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3VidWJzYXRfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3VidWJzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ1YnNhdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3VidWJzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YnVic2F0X2R2LFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZzdWJ1YnNhdF9kdgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ1YnNhdF9kdiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YnVic2F0X2R2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3VidWJzYXRfZHZfMTI4QixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92c3VidWJzYXRfZHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ1YnNhdF9kdl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3VidWJzYXRfZHZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZHVoc2F0LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGR1aHNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1aHNhdCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHVoc2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdWhzYXRfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkdWhzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1aHNhdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdWhzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZHVoc2F0X2R2LFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZhZGR1aHNhdF9kdgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1aHNhdF9kdiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHVoc2F0X2R2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdWhzYXRfZHZfMTI4QixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92YWRkdWhzYXRfZHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1aHNhdF9kdl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdWhzYXRfZHZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YnVoc2F0LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJ1aHNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ1aHNhdCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YnVoc2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3VidWhzYXRfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3VidWhzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ1aHNhdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3VidWhzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YnVoc2F0X2R2LFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZzdWJ1aHNhdF9kdgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ1aHNhdF9kdiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YnVoc2F0X2R2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3VidWhzYXRfZHZfMTI4QixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92c3VidWhzYXRfZHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ1aHNhdF9kdl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3VidWhzYXRfZHZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGhzYXQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZGhzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkaHNhdCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGhzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRoc2F0XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZGhzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRoc2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRoc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRoc2F0X2R2LFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZhZGRoc2F0X2R2CitkZWYgaW50X2hleGFnb25fVjZfdmFkZGhzYXRfZHYgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRoc2F0X2R2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkaHNhdF9kdl8xMjhCLFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZhZGRoc2F0X2R2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkaHNhdF9kdl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkaHNhdF9kdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3ViaHNhdCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3ViaHNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJoc2F0IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViaHNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YmhzYXRfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3ViaHNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YmhzYXRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YmhzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YmhzYXRfZHYsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdnN1YmhzYXRfZHYKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViaHNhdF9kdiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YmhzYXRfZHYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJoc2F0X2R2XzEyOEIsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdnN1YmhzYXRfZHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJoc2F0X2R2XzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJoc2F0X2R2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR3c2F0LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGR3c2F0CitkZWYgaW50X2hleGFnb25fVjZfdmFkZHdzYXQgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR3c2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkd3NhdF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGR3c2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkd3NhdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkd3NhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkd3NhdF9kdixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92YWRkd3NhdF9kdgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR3c2F0X2R2IDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkd3NhdF9kdiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZHdzYXRfZHZfMTI4QixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92YWRkd3NhdF9kdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZHdzYXRfZHZfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHdzYXRfZHZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YndzYXQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnN1YndzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3Vid3NhdCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YndzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJ3c2F0XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnN1YndzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ3c2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ3c2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJ3c2F0X2R2LFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZzdWJ3c2F0X2R2CitkZWYgaW50X2hleGFnb25fVjZfdnN1YndzYXRfZHYgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ3c2F0X2R2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3Vid3NhdF9kdl8xMjhCLFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZzdWJ3c2F0X2R2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3Vid3NhdF9kdl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3Vid3NhdF9kdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXZndWIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z3ViCitkZWYgaW50X2hleGFnb25fVjZfdmF2Z3ViIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXZndWIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhdmd1Yl8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zhdmd1Yl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmF2Z3ViXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhdmd1Yl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXZndWJybmQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z3Vicm5kCitkZWYgaW50X2hleGFnb25fVjZfdmF2Z3Vicm5kIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXZndWJybmQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhdmd1YnJuZF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zhdmd1YnJuZF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmF2Z3Vicm5kXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhdmd1YnJuZF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXZndWgsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z3VoCitkZWYgaW50X2hleGFnb25fVjZfdmF2Z3VoIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXZndWgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhdmd1aF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zhdmd1aF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmF2Z3VoXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhdmd1aF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXZndWhybmQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z3Vocm5kCitkZWYgaW50X2hleGFnb25fVjZfdmF2Z3Vocm5kIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXZndWhybmQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhdmd1aHJuZF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zhdmd1aHJuZF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmF2Z3Vocm5kXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhdmd1aHJuZF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXZnaCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXZnaAorZGVmIGludF9oZXhhZ29uX1Y2X3ZhdmdoIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXZnaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmF2Z2hfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXZnaF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmF2Z2hfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmF2Z2hfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmF2Z2hybmQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z2hybmQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZnaHJuZCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmF2Z2hybmQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhdmdocm5kXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z2hybmRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhdmdocm5kXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhdmdocm5kXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZuYXZnaCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bmF2Z2gKK2RlZiBpbnRfaGV4YWdvbl9WNl92bmF2Z2ggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZuYXZnaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm5hdmdoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm5hdmdoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bmF2Z2hfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm5hdmdoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhdmd3LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zhdmd3CitkZWYgaW50X2hleGFnb25fVjZfdmF2Z3cgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhdmd3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXZnd18xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zhdmd3XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZnd18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXZnd18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXZnd3JuZCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXZnd3JuZAorZGVmIGludF9oZXhhZ29uX1Y2X3Zhdmd3cm5kIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXZnd3JuZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmF2Z3dybmRfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXZnd3JuZF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmF2Z3dybmRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmF2Z3dybmRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm5hdmd3LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZuYXZndworZGVmIGludF9oZXhhZ29uX1Y2X3ZuYXZndyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm5hdmd3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bmF2Z3dfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bmF2Z3dfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZuYXZnd18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bmF2Z3dfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFic2RpZmZ1YixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWJzZGlmZnViCitkZWYgaW50X2hleGFnb25fVjZfdmFic2RpZmZ1YiA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFic2RpZmZ1YiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFic2RpZmZ1Yl8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhYnNkaWZmdWJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhYnNkaWZmdWJfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFic2RpZmZ1Yl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWJzZGlmZnVoLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhYnNkaWZmdWgKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWJzZGlmZnVoIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWJzZGlmZnVoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWJzZGlmZnVoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFic2RpZmZ1aF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFic2RpZmZ1aF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWJzZGlmZnVoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhYnNkaWZmaCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWJzZGlmZmgKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWJzZGlmZmggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhYnNkaWZmaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFic2RpZmZoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFic2RpZmZoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWJzZGlmZmhfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFic2RpZmZoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhYnNkaWZmdyxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWJzZGlmZncKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWJzZGlmZncgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhYnNkaWZmdyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFic2RpZmZ3XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFic2RpZmZ3XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWJzZGlmZndfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFic2RpZmZ3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZuYXZndWIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm5hdmd1YgorZGVmIGludF9oZXhhZ29uX1Y2X3ZuYXZndWIgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZuYXZndWIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZuYXZndWJfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bmF2Z3ViXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bmF2Z3ViXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZuYXZndWJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZHViaCxWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkdWJoCitkZWYgaW50X2hleGFnb25fVjZfdmFkZHViaCA6CitIZXhhZ29uX3YxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR1YmgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR1YmhfMTI4QixWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkdWJoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkdWJoXzEyOEIgOgorSGV4YWdvbl92MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR1YmhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YnViaCxWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3VidWJoCitkZWYgaW50X2hleGFnb25fVjZfdnN1YnViaCA6CitIZXhhZ29uX3YxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ1YmgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJ1YmhfMTI4QixWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3VidWJoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3VidWJoXzEyOEIgOgorSGV4YWdvbl92MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ1YmhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGh3LFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGRodworZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRodyA6CitIZXhhZ29uX3YxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRodyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGh3XzEyOEIsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZGh3XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkaHdfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGh3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJodyxWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3ViaHcKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViaHcgOgorSGV4YWdvbl92MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViaHciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJod18xMjhCLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJod18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1Ymh3XzEyOEIgOgorSGV4YWdvbl92MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJod18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdWh3LFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGR1aHcKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkdWh3IDoKK0hleGFnb25fdjEwMjR2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHVodyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZHVod18xMjhCLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGR1aHdfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1aHdfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHVod18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3VidWh3LFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJ1aHcKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3VidWh3IDoKK0hleGFnb25fdjEwMjR2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YnVodyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YnVod18xMjhCLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJ1aHdfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ1aHdfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YnVod18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZDAsVklfZnR5cGVfLDApCisvLyB0YWcgOiBWNl92ZDAKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZDAgOgorSGV4YWdvbl92NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZDAiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkMF8xMjhCLFZJX2Z0eXBlXywwKQorLy8gdGFnIDogVjZfdmQwXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZDBfMTI4QiA6CitIZXhhZ29uX3YxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZDBfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGJxLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmFkZGJxCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGJxIDoKK0hleGFnb25fdjUxMnY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGJxIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkYnFfMTI4QixWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZhZGRicV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGJxXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGJxXzEyOEIiPjsKKworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YmJxLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdnN1YmJxCitkZWYgaW50X2hleGFnb25fVjZfdnN1YmJxIDoKK0hleGFnb25fdjUxMnY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YmJxIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3ViYnFfMTI4QixWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZzdWJicV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YmJxXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YmJxXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRibnEsVklfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92YWRkYm5xCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGJucSA6CitIZXhhZ29uX3Y1MTJ2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRibnEiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRibnFfMTI4QixWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZhZGRibnFfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRibnFfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkYm5xXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJibnEsVklfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92c3ViYm5xCitkZWYgaW50X2hleGFnb25fVjZfdnN1YmJucSA6CitIZXhhZ29uX3Y1MTJ2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJibnEiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJibnFfMTI4QixWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZzdWJibnFfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJibnFfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViYm5xXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRocSxWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZhZGRocQorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRocSA6CitIZXhhZ29uX3Y1MTJ2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRocSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGhxXzEyOEIsVklfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92YWRkaHFfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRocV8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRocV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3ViaHEsVklfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92c3ViaHEKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViaHEgOgorSGV4YWdvbl92NTEydjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViaHEiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJocV8xMjhCLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdnN1YmhxXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViaHFfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViaHFfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGhucSxWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZhZGRobnEKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkaG5xIDoKK0hleGFnb25fdjUxMnY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGhucSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGhucV8xMjhCLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmFkZGhucV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGhucV8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRobnFfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YmhucSxWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZzdWJobnEKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViaG5xIDoKK0hleGFnb25fdjUxMnY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YmhucSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YmhucV8xMjhCLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdnN1YmhucV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YmhucV8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJobnFfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZHdxLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmFkZHdxCitkZWYgaW50X2hleGFnb25fVjZfdmFkZHdxIDoKK0hleGFnb25fdjUxMnY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHdxIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkd3FfMTI4QixWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZhZGR3cV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZHdxXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHdxXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJ3cSxWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZzdWJ3cQorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ3cSA6CitIZXhhZ29uX3Y1MTJ2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ3cSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YndxXzEyOEIsVklfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92c3Vid3FfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ3cV8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ3cV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkd25xLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmFkZHducQorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR3bnEgOgorSGV4YWdvbl92NTEydjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkd25xIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkd25xXzEyOEIsVklfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92YWRkd25xXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkd25xXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHducV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3Vid25xLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdnN1YnducQorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ3bnEgOgorSGV4YWdvbl92NTEydjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3Vid25xIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3Vid25xXzEyOEIsVklfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92c3Vid25xXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3Vid25xXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YnducV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWJzaCxWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdmFic2gKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWJzaCA6CitIZXhhZ29uX3Y1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWJzaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFic2hfMTI4QixWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdmFic2hfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhYnNoXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWJzaF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWJzaF9zYXQsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3ZhYnNoX3NhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZhYnNoX3NhdCA6CitIZXhhZ29uX3Y1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWJzaF9zYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhYnNoX3NhdF8xMjhCLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92YWJzaF9zYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhYnNoX3NhdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFic2hfc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhYnN3LFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92YWJzdworZGVmIGludF9oZXhhZ29uX1Y2X3ZhYnN3IDoKK0hleGFnb25fdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhYnN3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWJzd18xMjhCLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92YWJzd18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFic3dfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhYnN3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhYnN3X3NhdCxWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdmFic3dfc2F0CitkZWYgaW50X2hleGFnb25fVjZfdmFic3dfc2F0IDoKK0hleGFnb25fdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhYnN3X3NhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFic3dfc2F0XzEyOEIsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3ZhYnN3X3NhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFic3dfc2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWJzd19zYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWJ2LFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlidgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlidiA6CitIZXhhZ29uX3YxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlidiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWJ2XzEyOEIsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weWJ2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5YnZfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWJ2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlidl9hY2MsVkRfZnR5cGVfVkRWSVZJLDMpCisvLyB0YWcgOiBWNl92bXB5YnZfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdm1weWJ2X2FjYyA6CitIZXhhZ29uX3YxMDI0djEwMjR2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWJ2X2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWJ2X2FjY18xMjhCLFZEX2Z0eXBlX1ZEVklWSSwzKQorLy8gdGFnIDogVjZfdm1weWJ2X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weWJ2X2FjY18xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlidl9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weXVidixWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bXB5dWJ2CitkZWYgaW50X2hleGFnb25fVjZfdm1weXVidiA6CitIZXhhZ29uX3YxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHl1YnYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHl1YnZfMTI4QixWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bXB5dWJ2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5dWJ2XzEyOEIgOgorSGV4YWdvbl92MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHl1YnZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weXVidl9hY2MsVkRfZnR5cGVfVkRWSVZJLDMpCisvLyB0YWcgOiBWNl92bXB5dWJ2X2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHl1YnZfYWNjIDoKK0hleGFnb25fdjEwMjR2MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5dWJ2X2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weXVidl9hY2NfMTI4QixWRF9mdHlwZV9WRFZJVkksMykKKy8vIHRhZyA6IFY2X3ZtcHl1YnZfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5dWJ2X2FjY18xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHl1YnZfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlidXN2LFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlidXN2CitkZWYgaW50X2hleGFnb25fVjZfdm1weWJ1c3YgOgorSGV4YWdvbl92MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5YnVzdiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWJ1c3ZfMTI4QixWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bXB5YnVzdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weWJ1c3ZfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWJ1c3ZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWJ1c3ZfYWNjLFZEX2Z0eXBlX1ZEVklWSSwzKQorLy8gdGFnIDogVjZfdm1weWJ1c3ZfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdm1weWJ1c3ZfYWNjIDoKK0hleGFnb25fdjEwMjR2MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5YnVzdl9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlidXN2X2FjY18xMjhCLFZEX2Z0eXBlX1ZEVklWSSwzKQorLy8gdGFnIDogVjZfdm1weWJ1c3ZfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5YnVzdl9hY2NfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5YnVzdl9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1wYWJ1c3YsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdm1wYWJ1c3YKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhYnVzdiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1wYWJ1c3YiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcGFidXN2XzEyOEIsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdm1wYWJ1c3ZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcGFidXN2XzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcGFidXN2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcGFidXV2LFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZtcGFidXV2CitkZWYgaW50X2hleGFnb25fVjZfdm1wYWJ1dXYgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcGFidXV2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBhYnV1dl8xMjhCLFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZtcGFidXV2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhYnV1dl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBhYnV1dl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aHYsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weWh2CitkZWYgaW50X2hleGFnb25fVjZfdm1weWh2IDoKK0hleGFnb25fdjEwMjR2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWh2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aHZfMTI4QixWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bXB5aHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlodl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aHZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWh2X2FjYyxWRF9mdHlwZV9WRFZJVkksMykKKy8vIHRhZyA6IFY2X3ZtcHlodl9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aHZfYWNjIDoKK0hleGFnb25fdjEwMjR2MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aHZfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aHZfYWNjXzEyOEIsVkRfZnR5cGVfVkRWSVZJLDMpCisvLyB0YWcgOiBWNl92bXB5aHZfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aHZfYWNjXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWh2X2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5dWh2LFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHl1aHYKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5dWh2IDoKK0hleGFnb25fdjEwMjR2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weXVodiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weXVodl8xMjhCLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHl1aHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHl1aHZfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weXVodl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5dWh2X2FjYyxWRF9mdHlwZV9WRFZJVkksMykKKy8vIHRhZyA6IFY2X3ZtcHl1aHZfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdm1weXVodl9hY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHl1aHZfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5dWh2X2FjY18xMjhCLFZEX2Z0eXBlX1ZEVklWSSwzKQorLy8gdGFnIDogVjZfdm1weXVodl9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHl1aHZfYWNjXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weXVodl9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWh2c3JzLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlodnNycworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlodnNycyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWh2c3JzIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aHZzcnNfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bXB5aHZzcnNfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlodnNyc18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aHZzcnNfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWh1cyxWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bXB5aHVzCitkZWYgaW50X2hleGFnb25fVjZfdm1weWh1cyA6CitIZXhhZ29uX3YxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlodXMiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlodXNfMTI4QixWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bXB5aHVzXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aHVzXzEyOEIgOgorSGV4YWdvbl92MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlodXNfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWh1c19hY2MsVkRfZnR5cGVfVkRWSVZJLDMpCisvLyB0YWcgOiBWNl92bXB5aHVzX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlodXNfYWNjIDoKK0hleGFnb25fdjEwMjR2MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aHVzX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWh1c19hY2NfMTI4QixWRF9mdHlwZV9WRFZJVkksMykKKy8vIHRhZyA6IFY2X3ZtcHlodXNfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aHVzX2FjY18xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlodXNfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpaCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bXB5aWgKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aWggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWloXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weWloXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aWhfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWloXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpaF9hY2MsVklfZnR5cGVfVklWSVZJLDMpCisvLyB0YWcgOiBWNl92bXB5aWhfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdm1weWloX2FjYyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpaF9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpaF9hY2NfMTI4QixWSV9mdHlwZV9WSVZJVkksMykKKy8vIHRhZyA6IFY2X3ZtcHlpaF9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpaF9hY2NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aWhfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlld3VoLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlld3VoCitkZWYgaW50X2hleGFnb25fVjZfdm1weWV3dWggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlld3VoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5ZXd1aF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlld3VoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5ZXd1aF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5ZXd1aF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5b3doLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlvd2gKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5b3doIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5b3doIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5b3doXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weW93aF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weW93aF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5b3doXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlvd2hfcm5kLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlvd2hfcm5kCitkZWYgaW50X2hleGFnb25fVjZfdm1weW93aF9ybmQgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlvd2hfcm5kIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5b3doX3JuZF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlvd2hfcm5kXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5b3doX3JuZF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5b3doX3JuZF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5b3doX3NhY2MsVklfZnR5cGVfVklWSVZJLDMpCisvLyB0YWcgOiBWNl92bXB5b3doX3NhY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5b3doX3NhY2MgOgorSGV4YWdvbl92NTEydjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5b3doX3NhY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlvd2hfc2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklWSSwzKQorLy8gdGFnIDogVjZfdm1weW93aF9zYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5b3doX3NhY2NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5b3doX3NhY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weW93aF9ybmRfc2FjYyxWSV9mdHlwZV9WSVZJVkksMykKKy8vIHRhZyA6IFY2X3ZtcHlvd2hfcm5kX3NhY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5b3doX3JuZF9zYWNjIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weW93aF9ybmRfc2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weW93aF9ybmRfc2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklWSSwzKQorLy8gdGFnIDogVjZfdm1weW93aF9ybmRfc2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weW93aF9ybmRfc2FjY18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlvd2hfcm5kX3NhY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWllb2gsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weWllb2gKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aWVvaCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWllb2giPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpZW9oXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weWllb2hfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpZW9oXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpZW9oXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpZXd1aCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bXB5aWV3dWgKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aWV3dWggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpZXd1aCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWlld3VoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weWlld3VoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aWV3dWhfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWlld3VoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpb3doLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlpb3doCitkZWYgaW50X2hleGFnb25fVjZfdm1weWlvd2ggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpb3doIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aW93aF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlpb3doXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aW93aF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aW93aF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aWV3aF9hY2MsVklfZnR5cGVfVklWSVZJLDMpCisvLyB0YWcgOiBWNl92bXB5aWV3aF9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aWV3aF9hY2MgOgorSGV4YWdvbl92NTEydjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aWV3aF9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpZXdoX2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklWSSwzKQorLy8gdGFnIDogVjZfdm1weWlld2hfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aWV3aF9hY2NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aWV3aF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWlld3VoX2FjYyxWSV9mdHlwZV9WSVZJVkksMykKKy8vIHRhZyA6IFY2X3ZtcHlpZXd1aF9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aWV3dWhfYWNjIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWlld3VoX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWlld3VoX2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklWSSwzKQorLy8gdGFnIDogVjZfdm1weWlld3VoX2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weWlld3VoX2FjY18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpZXd1aF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weXViLFZEX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZtcHl1YgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHl1YiA6CitIZXhhZ29uX3YxMDI0djUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHl1YiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weXViXzEyOEIsVkRfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdm1weXViXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5dWJfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5dWJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weXViX2FjYyxWRF9mdHlwZV9WRFZJU0ksMykKKy8vIHRhZyA6IFY2X3ZtcHl1Yl9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5dWJfYWNjIDoKK0hleGFnb25fdjEwMjR2MTAyNHY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5dWJfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5dWJfYWNjXzEyOEIsVkRfZnR5cGVfVkRWSVNJLDMpCisvLyB0YWcgOiBWNl92bXB5dWJfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5dWJfYWNjXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5dWJfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlidXMsVkRfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdm1weWJ1cworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlidXMgOgorSGV4YWdvbl92MTAyNHY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5YnVzIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5YnVzXzEyOEIsVkRfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdm1weWJ1c18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weWJ1c18xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlidXNfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWJ1c19hY2MsVkRfZnR5cGVfVkRWSVNJLDMpCisvLyB0YWcgOiBWNl92bXB5YnVzX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlidXNfYWNjIDoKK0hleGFnb25fdjEwMjR2MTAyNHY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5YnVzX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWJ1c19hY2NfMTI4QixWRF9mdHlwZV9WRFZJU0ksMykKKy8vIHRhZyA6IFY2X3ZtcHlidXNfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5YnVzX2FjY18xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWJ1c19hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1wYWJ1cyxWRF9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92bXBhYnVzCitkZWYgaW50X2hleGFnb25fVjZfdm1wYWJ1cyA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBhYnVzIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBhYnVzXzEyOEIsVkRfZnR5cGVfVkRTSSwyKQorLy8gdGFnIDogVjZfdm1wYWJ1c18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1wYWJ1c18xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcGFidXNfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1wYWJ1c19hY2MsVkRfZnR5cGVfVkRWRFNJLDMpCisvLyB0YWcgOiBWNl92bXBhYnVzX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcGFidXNfYWNjIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1wYWJ1c19hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcGFidXNfYWNjXzEyOEIsVkRfZnR5cGVfVkRWRFNJLDMpCisvLyB0YWcgOiBWNl92bXBhYnVzX2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1wYWJ1c19hY2NfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcGFidXNfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcGFoYixWRF9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92bXBhaGIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhaGIgOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1wYWhiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBhaGJfMTI4QixWRF9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92bXBhaGJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcGFoYl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcGFoYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBhaGJfYWNjLFZEX2Z0eXBlX1ZEVkRTSSwzKQorLy8gdGFnIDogVjZfdm1wYWhiX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcGFoYl9hY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBhaGJfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBhaGJfYWNjXzEyOEIsVkRfZnR5cGVfVkRWRFNJLDMpCisvLyB0YWcgOiBWNl92bXBhaGJfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhaGJfYWNjXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBhaGJfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHloLFZEX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZtcHloCitkZWYgaW50X2hleGFnb25fVjZfdm1weWggOgorSGV4YWdvbl92MTAyNHY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWhfMTI4QixWRF9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5aF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weWhfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aHNhdF9hY2MsVkRfZnR5cGVfVkRWSVNJLDMpCisvLyB0YWcgOiBWNl92bXB5aHNhdF9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aHNhdF9hY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHloc2F0X2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWhzYXRfYWNjXzEyOEIsVkRfZnR5cGVfVkRWSVNJLDMpCisvLyB0YWcgOiBWNl92bXB5aHNhdF9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHloc2F0X2FjY18xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWhzYXRfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHloc3MsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdm1weWhzcworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHloc3MgOgorSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHloc3MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHloc3NfMTI4QixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5aHNzXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aHNzXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWhzc18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aHNycyxWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5aHNycworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHloc3JzIDoKK0hleGFnb25fdjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aHNycyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWhzcnNfMTI4QixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5aHNyc18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weWhzcnNfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aHNyc18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5dWgsVkRfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdm1weXVoCitkZWYgaW50X2hleGFnb25fVjZfdm1weXVoIDoKK0hleGFnb25fdjEwMjR2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weXVoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5dWhfMTI4QixWRF9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5dWhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHl1aF8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHl1aF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5dWhfYWNjLFZEX2Z0eXBlX1ZEVklTSSwzKQorLy8gdGFnIDogVjZfdm1weXVoX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHl1aF9hY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHl1aF9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHl1aF9hY2NfMTI4QixWRF9mdHlwZV9WRFZJU0ksMykKKy8vIHRhZyA6IFY2X3ZtcHl1aF9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHl1aF9hY2NfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHl1aF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWloYixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5aWhiCitkZWYgaW50X2hleGFnb25fVjZfdm1weWloYiA6CitIZXhhZ29uX3Y1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWloYiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWloYl8xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZtcHlpaGJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpaGJfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aWhiXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpaGJfYWNjLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdm1weWloYl9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aWhiX2FjYyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpaGJfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aWhiX2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdm1weWloYl9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpaGJfYWNjXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aWhiX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aXdiLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZtcHlpd2IKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aXdiIDoKK0hleGFnb25fdjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aXdiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aXdiXzEyOEIsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdm1weWl3Yl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weWl3Yl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpd2JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWl3Yl9hY2MsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92bXB5aXdiX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpd2JfYWNjIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWl3Yl9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpd2JfYWNjXzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92bXB5aXdiX2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weWl3Yl9hY2NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpd2JfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpd2gsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdm1weWl3aAorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpd2ggOgorSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpd2giPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpd2hfMTI4QixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5aXdoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aXdoXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWl3aF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aXdoX2FjYyxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZtcHlpd2hfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdm1weWl3aF9hY2MgOgorSGV4YWdvbl92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aXdoX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWl3aF9hY2NfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZtcHlpd2hfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aXdoX2FjY18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWl3aF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFuZCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YW5kCitkZWYgaW50X2hleGFnb25fVjZfdmFuZCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFuZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFuZF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhbmRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhbmRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFuZF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92b3IsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm9yCitkZWYgaW50X2hleGFnb25fVjZfdm9yIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92b3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zvcl8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zvcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm9yXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zvcl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92eG9yLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Z4b3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92eG9yIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92eG9yIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92eG9yXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnhvcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnhvcl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92eG9yXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zub3QsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3Zub3QKK2RlZiBpbnRfaGV4YWdvbl9WNl92bm90IDoKK0hleGFnb25fdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zub3QiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zub3RfMTI4QixWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdm5vdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm5vdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm5vdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YW5kcXJ0LFZJX2Z0eXBlX1FWU0ksMikKKy8vIHRhZyA6IFY2X3ZhbmRxcnQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YW5kcXJ0IDoKK0hleGFnb25fdjUxMnY2NGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YW5kcXJ0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YW5kcXJ0XzEyOEIsVklfZnR5cGVfUVZTSSwyKQorLy8gdGFnIDogVjZfdmFuZHFydF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFuZHFydF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTI4aWlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhbmRxcnRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFuZHFydF9hY2MsVklfZnR5cGVfVklRVlNJLDMpCisvLyB0YWcgOiBWNl92YW5kcXJ0X2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZhbmRxcnRfYWNjIDoKK0hleGFnb25fdjUxMnY1MTJ2NjRpaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFuZHFydF9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhbmRxcnRfYWNjXzEyOEIsVklfZnR5cGVfVklRVlNJLDMpCisvLyB0YWcgOiBWNl92YW5kcXJ0X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFuZHFydF9hY2NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTI4aWlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhbmRxcnRfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhbmR2cnQsUVZfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmFuZHZydAorZGVmIGludF9oZXhhZ29uX1Y2X3ZhbmR2cnQgOgorSGV4YWdvbl92NjRpdjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhbmR2cnQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhbmR2cnRfMTI4QixRVl9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92YW5kdnJ0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YW5kdnJ0XzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFuZHZydF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YW5kdnJ0X2FjYyxRVl9mdHlwZV9RVlZJU0ksMykKKy8vIHRhZyA6IFY2X3ZhbmR2cnRfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmFuZHZydF9hY2MgOgorSGV4YWdvbl92NjRpdjY0aXY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YW5kdnJ0X2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFuZHZydF9hY2NfMTI4QixRVl9mdHlwZV9RVlZJU0ksMykKKy8vIHRhZyA6IFY2X3ZhbmR2cnRfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YW5kdnJ0X2FjY18xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFuZHZydF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0dyxRVl9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92Z3R3CitkZWYgaW50X2hleGFnb25fVjZfdmd0dyA6CitIZXhhZ29uX3Y2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0dyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0d18xMjhCLFFWX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZndHdfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHdfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0d18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R3X2FuZCxRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndHdfYW5kCitkZWYgaW50X2hleGFnb25fVjZfdmd0d19hbmQgOgorSGV4YWdvbl92NjRpdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R3X2FuZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0d19hbmRfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndHdfYW5kXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R3X2FuZF8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHdfYW5kXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHdfb3IsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3R3X29yCitkZWYgaW50X2hleGFnb25fVjZfdmd0d19vciA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHdfb3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHdfb3JfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndHdfb3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHdfb3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R3X29yXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHdfeG9yLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0d194b3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R3X3hvciA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHdfeG9yIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R3X3hvcl8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0d194b3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHdfeG9yXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0d194b3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxdyxRVl9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92ZXF3CitkZWYgaW50X2hleGFnb25fVjZfdmVxdyA6CitIZXhhZ29uX3Y2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxdyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxd18xMjhCLFFWX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZlcXdfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZlcXdfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxd18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZXF3X2FuZCxRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZlcXdfYW5kCitkZWYgaW50X2hleGFnb25fVjZfdmVxd19hbmQgOgorSGV4YWdvbl92NjRpdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZXF3X2FuZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxd19hbmRfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZlcXdfYW5kXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZXF3X2FuZF8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZlcXdfYW5kXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZlcXdfb3IsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92ZXF3X29yCitkZWYgaW50X2hleGFnb25fVjZfdmVxd19vciA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZlcXdfb3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZlcXdfb3JfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZlcXdfb3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZlcXdfb3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZXF3X29yXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZlcXdfeG9yLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmVxd194b3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZXF3X3hvciA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZlcXdfeG9yIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZXF3X3hvcl8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmVxd194b3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZlcXdfeG9yXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxd194b3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0aCxRVl9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92Z3RoCitkZWYgaW50X2hleGFnb25fVjZfdmd0aCA6CitIZXhhZ29uX3Y2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0aCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0aF8xMjhCLFFWX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZndGhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndGhfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0aF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3RoX2FuZCxRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndGhfYW5kCitkZWYgaW50X2hleGFnb25fVjZfdmd0aF9hbmQgOgorSGV4YWdvbl92NjRpdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3RoX2FuZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0aF9hbmRfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndGhfYW5kXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3RoX2FuZF8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndGhfYW5kXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndGhfb3IsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3RoX29yCitkZWYgaW50X2hleGFnb25fVjZfdmd0aF9vciA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndGhfb3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndGhfb3JfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndGhfb3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndGhfb3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3RoX29yXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndGhfeG9yLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0aF94b3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3RoX3hvciA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndGhfeG9yIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3RoX3hvcl8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0aF94b3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndGhfeG9yXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0aF94b3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxaCxRVl9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92ZXFoCitkZWYgaW50X2hleGFnb25fVjZfdmVxaCA6CitIZXhhZ29uX3Y2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxaF8xMjhCLFFWX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZlcWhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZlcWhfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxaF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZXFoX2FuZCxRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZlcWhfYW5kCitkZWYgaW50X2hleGFnb25fVjZfdmVxaF9hbmQgOgorSGV4YWdvbl92NjRpdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZXFoX2FuZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxaF9hbmRfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZlcWhfYW5kXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZXFoX2FuZF8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZlcWhfYW5kXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZlcWhfb3IsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92ZXFoX29yCitkZWYgaW50X2hleGFnb25fVjZfdmVxaF9vciA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZlcWhfb3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZlcWhfb3JfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZlcWhfb3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZlcWhfb3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZXFoX29yXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZlcWhfeG9yLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmVxaF94b3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZXFoX3hvciA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZlcWhfeG9yIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZXFoX3hvcl8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmVxaF94b3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZlcWhfeG9yXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxaF94b3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0YixRVl9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92Z3RiCitkZWYgaW50X2hleGFnb25fVjZfdmd0YiA6CitIZXhhZ29uX3Y2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0YiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0Yl8xMjhCLFFWX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZndGJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndGJfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0Yl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3RiX2FuZCxRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndGJfYW5kCitkZWYgaW50X2hleGFnb25fVjZfdmd0Yl9hbmQgOgorSGV4YWdvbl92NjRpdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3RiX2FuZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0Yl9hbmRfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndGJfYW5kXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3RiX2FuZF8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndGJfYW5kXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndGJfb3IsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3RiX29yCitkZWYgaW50X2hleGFnb25fVjZfdmd0Yl9vciA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndGJfb3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndGJfb3JfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndGJfb3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndGJfb3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3RiX29yXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndGJfeG9yLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0Yl94b3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3RiX3hvciA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndGJfeG9yIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3RiX3hvcl8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0Yl94b3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndGJfeG9yXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0Yl94b3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxYixRVl9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92ZXFiCitkZWYgaW50X2hleGFnb25fVjZfdmVxYiA6CitIZXhhZ29uX3Y2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxYiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxYl8xMjhCLFFWX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZlcWJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZlcWJfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZXFiX2FuZCxRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZlcWJfYW5kCitkZWYgaW50X2hleGFnb25fVjZfdmVxYl9hbmQgOgorSGV4YWdvbl92NjRpdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZXFiX2FuZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxYl9hbmRfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZlcWJfYW5kXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZXFiX2FuZF8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZlcWJfYW5kXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZlcWJfb3IsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92ZXFiX29yCitkZWYgaW50X2hleGFnb25fVjZfdmVxYl9vciA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZlcWJfb3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZlcWJfb3JfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZlcWJfb3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZlcWJfb3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZXFiX29yXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZlcWJfeG9yLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmVxYl94b3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZXFiX3hvciA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZlcWJfeG9yIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZXFiX3hvcl8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmVxYl94b3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZlcWJfeG9yXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxYl94b3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0dXcsUVZfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmd0dXcKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R1dyA6CitIZXhhZ29uX3Y2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0dXciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHV3XzEyOEIsUVZfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmd0dXdfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHV3XzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHV3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHV3X2FuZCxRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndHV3X2FuZAorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHV3X2FuZCA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHV3X2FuZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0dXdfYW5kXzEyOEIsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3R1d19hbmRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHV3X2FuZF8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHV3X2FuZF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R1d19vcixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndHV3X29yCitkZWYgaW50X2hleGFnb25fVjZfdmd0dXdfb3IgOgorSGV4YWdvbl92NjRpdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R1d19vciI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0dXdfb3JfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndHV3X29yXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R1d19vcl8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHV3X29yXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHV3X3hvcixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndHV3X3hvcgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHV3X3hvciA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHV3X3hvciI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0dXdfeG9yXzEyOEIsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3R1d194b3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHV3X3hvcl8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHV3X3hvcl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R1aCxRVl9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92Z3R1aAorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHVoIDoKK0hleGFnb25fdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R1aCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0dWhfMTI4QixRVl9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92Z3R1aF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmd0dWhfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0dWhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0dWhfYW5kLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0dWhfYW5kCitkZWYgaW50X2hleGFnb25fVjZfdmd0dWhfYW5kIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0dWhfYW5kIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R1aF9hbmRfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndHVoX2FuZF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmd0dWhfYW5kXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0dWhfYW5kXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHVoX29yLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0dWhfb3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R1aF9vciA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHVoX29yIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R1aF9vcl8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0dWhfb3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHVoX29yXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0dWhfb3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0dWhfeG9yLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0dWhfeG9yCitkZWYgaW50X2hleGFnb25fVjZfdmd0dWhfeG9yIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0dWhfeG9yIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R1aF94b3JfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndHVoX3hvcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmd0dWhfeG9yXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0dWhfeG9yXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHViLFFWX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZndHViCitkZWYgaW50X2hleGFnb25fVjZfdmd0dWIgOgorSGV4YWdvbl92NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHViIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R1Yl8xMjhCLFFWX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZndHViXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R1Yl8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R1Yl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R1Yl9hbmQsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3R1Yl9hbmQKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R1Yl9hbmQgOgorSGV4YWdvbl92NjRpdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R1Yl9hbmQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHViX2FuZF8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0dWJfYW5kXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R1Yl9hbmRfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R1Yl9hbmRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0dWJfb3IsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3R1Yl9vcgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHViX29yIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0dWJfb3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHViX29yXzEyOEIsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3R1Yl9vcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmd0dWJfb3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R1Yl9vcl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R1Yl94b3IsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3R1Yl94b3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R1Yl94b3IgOgorSGV4YWdvbl92NjRpdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R1Yl94b3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHViX3hvcl8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0dWJfeG9yXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R1Yl94b3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R1Yl94b3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfcHJlZF9vcixRVl9mdHlwZV9RVlFWLDIpCisvLyB0YWcgOiBWNl9wcmVkX29yCitkZWYgaW50X2hleGFnb25fVjZfcHJlZF9vciA6CitIZXhhZ29uX3Y2NGl2NjRpdjY0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfcHJlZF9vciI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfcHJlZF9vcl8xMjhCLFFWX2Z0eXBlX1FWUVYsMikKKy8vIHRhZyA6IFY2X3ByZWRfb3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ByZWRfb3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTI4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfcHJlZF9vcl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9wcmVkX2FuZCxRVl9mdHlwZV9RVlFWLDIpCisvLyB0YWcgOiBWNl9wcmVkX2FuZAorZGVmIGludF9oZXhhZ29uX1Y2X3ByZWRfYW5kIDoKK0hleGFnb25fdjY0aXY2NGl2NjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9wcmVkX2FuZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfcHJlZF9hbmRfMTI4QixRVl9mdHlwZV9RVlFWLDIpCisvLyB0YWcgOiBWNl9wcmVkX2FuZF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfcHJlZF9hbmRfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTI4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfcHJlZF9hbmRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfcHJlZF9ub3QsUVZfZnR5cGVfUVYsMSkKKy8vIHRhZyA6IFY2X3ByZWRfbm90CitkZWYgaW50X2hleGFnb25fVjZfcHJlZF9ub3QgOgorSGV4YWdvbl92NjRpdjY0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfcHJlZF9ub3QiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ByZWRfbm90XzEyOEIsUVZfZnR5cGVfUVYsMSkKKy8vIHRhZyA6IFY2X3ByZWRfbm90XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl9wcmVkX25vdF8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfcHJlZF9ub3RfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfcHJlZF94b3IsUVZfZnR5cGVfUVZRViwyKQorLy8gdGFnIDogVjZfcHJlZF94b3IKK2RlZiBpbnRfaGV4YWdvbl9WNl9wcmVkX3hvciA6CitIZXhhZ29uX3Y2NGl2NjRpdjY0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfcHJlZF94b3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ByZWRfeG9yXzEyOEIsUVZfZnR5cGVfUVZRViwyKQorLy8gdGFnIDogVjZfcHJlZF94b3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ByZWRfeG9yXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEyOGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ByZWRfeG9yXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ByZWRfYW5kX24sUVZfZnR5cGVfUVZRViwyKQorLy8gdGFnIDogVjZfcHJlZF9hbmRfbgorZGVmIGludF9oZXhhZ29uX1Y2X3ByZWRfYW5kX24gOgorSGV4YWdvbl92NjRpdjY0aXY2NGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ByZWRfYW5kX24iPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ByZWRfYW5kX25fMTI4QixRVl9mdHlwZV9RVlFWLDIpCisvLyB0YWcgOiBWNl9wcmVkX2FuZF9uXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl9wcmVkX2FuZF9uXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEyOGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ByZWRfYW5kX25fMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfcHJlZF9vcl9uLFFWX2Z0eXBlX1FWUVYsMikKKy8vIHRhZyA6IFY2X3ByZWRfb3JfbgorZGVmIGludF9oZXhhZ29uX1Y2X3ByZWRfb3JfbiA6CitIZXhhZ29uX3Y2NGl2NjRpdjY0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfcHJlZF9vcl9uIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9wcmVkX29yX25fMTI4QixRVl9mdHlwZV9RVlFWLDIpCisvLyB0YWcgOiBWNl9wcmVkX29yX25fMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ByZWRfb3Jfbl8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMjhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9wcmVkX29yX25fMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfcHJlZF9zY2FsYXIyLFFWX2Z0eXBlX1NJLDEpCisvLyB0YWcgOiBWNl9wcmVkX3NjYWxhcjIKK2RlZiBpbnRfaGV4YWdvbl9WNl9wcmVkX3NjYWxhcjIgOgorSGV4YWdvbl92NjRpaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfcHJlZF9zY2FsYXIyIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9wcmVkX3NjYWxhcjJfMTI4QixRVl9mdHlwZV9TSSwxKQorLy8gdGFnIDogVjZfcHJlZF9zY2FsYXIyXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl9wcmVkX3NjYWxhcjJfMTI4QiA6CitIZXhhZ29uX3YxMjhpaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfcHJlZF9zY2FsYXIyXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtdXgsVklfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92bXV4CitkZWYgaW50X2hleGFnb25fVjZfdm11eCA6CitIZXhhZ29uX3Y1MTJ2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtdXgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtdXhfMTI4QixWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZtdXhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtdXhfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXV4XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zzd2FwLFZEX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdnN3YXAKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3dhcCA6CitIZXhhZ29uX3YxMDI0djY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3dhcCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN3YXBfMTI4QixWRF9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3Zzd2FwXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3dhcF8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zzd2FwXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtYXh1YixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bWF4dWIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWF4dWIgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtYXh1YiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1heHViXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1heHViXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWF4dWJfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1heHViXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtaW51YixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bWludWIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWludWIgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtaW51YiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1pbnViXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1pbnViXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWludWJfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1pbnViXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtYXh1aCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bWF4dWgKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWF4dWggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtYXh1aCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1heHVoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1heHVoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWF4dWhfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1heHVoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtaW51aCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bWludWgKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWludWggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtaW51aCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1pbnVoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1pbnVoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWludWhfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1pbnVoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtYXhoLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtYXhoCitkZWYgaW50X2hleGFnb25fVjZfdm1heGggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtYXhoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bWF4aF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtYXhoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWF4aF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bWF4aF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bWluaCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bWluaAorZGVmIGludF9oZXhhZ29uX1Y2X3ZtaW5oIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bWluaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1pbmhfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bWluaF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1pbmhfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1pbmhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1heHcsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1heHcKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWF4dyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1heHciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtYXh3XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1heHdfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtYXh3XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtYXh3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtaW53LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtaW53CitkZWYgaW50X2hleGFnb25fVjZfdm1pbncgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtaW53Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bWlud18xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtaW53XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWlud18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bWlud18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2F0aHViLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzYXRodWIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2F0aHViIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2F0aHViIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2F0aHViXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnNhdGh1Yl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnNhdGh1Yl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2F0aHViXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzYXR3aCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c2F0d2gKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2F0d2ggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzYXR3aCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNhdHdoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnNhdHdoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2F0d2hfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNhdHdoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzaHVmZmViLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzaHVmZmViCitkZWYgaW50X2hleGFnb25fVjZfdnNodWZmZWIgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzaHVmZmViIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2h1ZmZlYl8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzaHVmZmViXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2h1ZmZlYl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2h1ZmZlYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2h1ZmZvYixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c2h1ZmZvYgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzaHVmZm9iIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2h1ZmZvYiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNodWZmb2JfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c2h1ZmZvYl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnNodWZmb2JfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNodWZmb2JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNodWZlaCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c2h1ZmVoCitkZWYgaW50X2hleGFnb25fVjZfdnNodWZlaCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNodWZlaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNodWZlaF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzaHVmZWhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzaHVmZWhfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNodWZlaF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2h1Zm9oLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzaHVmb2gKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2h1Zm9oIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2h1Zm9oIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2h1Zm9oXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnNodWZvaF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnNodWZvaF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2h1Zm9oXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzaHVmZnZkZCxWRF9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZzaHVmZnZkZAorZGVmIGludF9oZXhhZ29uX1Y2X3ZzaHVmZnZkZCA6CitIZXhhZ29uX3YxMDI0djUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2h1ZmZ2ZGQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzaHVmZnZkZF8xMjhCLFZEX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdnNodWZmdmRkXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2h1ZmZ2ZGRfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzaHVmZnZkZF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZGVhbHZkZCxWRF9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZkZWFsdmRkCitkZWYgaW50X2hleGFnb25fVjZfdmRlYWx2ZGQgOgorSGV4YWdvbl92MTAyNHY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRlYWx2ZGQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkZWFsdmRkXzEyOEIsVkRfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92ZGVhbHZkZF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmRlYWx2ZGRfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkZWFsdmRkXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzaHVmb2VoLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzaHVmb2VoCitkZWYgaW50X2hleGFnb25fVjZfdnNodWZvZWggOgorSGV4YWdvbl92MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2h1Zm9laCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNodWZvZWhfMTI4QixWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c2h1Zm9laF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnNodWZvZWhfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNodWZvZWhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNodWZvZWIsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnNodWZvZWIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2h1Zm9lYiA6CitIZXhhZ29uX3YxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzaHVmb2ViIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2h1Zm9lYl8xMjhCLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzaHVmb2ViXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2h1Zm9lYl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2h1Zm9lYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZGVhbGgsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3ZkZWFsaAorZGVmIGludF9oZXhhZ29uX1Y2X3ZkZWFsaCA6CitIZXhhZ29uX3Y1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZGVhbGgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkZWFsaF8xMjhCLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92ZGVhbGhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZkZWFsaF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRlYWxoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkZWFsYixWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdmRlYWxiCitkZWYgaW50X2hleGFnb25fVjZfdmRlYWxiIDoKK0hleGFnb25fdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkZWFsYiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRlYWxiXzEyOEIsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3ZkZWFsYl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmRlYWxiXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZGVhbGJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRlYWxiNHcsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmRlYWxiNHcKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZGVhbGI0dyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRlYWxiNHciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkZWFsYjR3XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmRlYWxiNHdfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZkZWFsYjR3XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkZWFsYjR3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzaHVmZmgsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3ZzaHVmZmgKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2h1ZmZoIDoKK0hleGFnb25fdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzaHVmZmgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzaHVmZmhfMTI4QixWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnNodWZmaF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnNodWZmaF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNodWZmaF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2h1ZmZiLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92c2h1ZmZiCitkZWYgaW50X2hleGFnb25fVjZfdnNodWZmYiA6CitIZXhhZ29uX3Y1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2h1ZmZiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2h1ZmZiXzEyOEIsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3ZzaHVmZmJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzaHVmZmJfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzaHVmZmJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfZXh0cmFjdHcsU0lfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfZXh0cmFjdHcKK2RlZiBpbnRfaGV4YWdvbl9WNl9leHRyYWN0dyA6CitIZXhhZ29uX2l2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfZXh0cmFjdHciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X2V4dHJhY3R3XzEyOEIsU0lfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfZXh0cmFjdHdfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X2V4dHJhY3R3XzEyOEIgOgorSGV4YWdvbl9pdjEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9leHRyYWN0d18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92aW5zZXJ0d3IsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmluc2VydHdyCitkZWYgaW50X2hleGFnb25fVjZfdmluc2VydHdyIDoKK0hleGFnb25fdjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92aW5zZXJ0d3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZpbnNlcnR3cl8xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZpbnNlcnR3cl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmluc2VydHdyXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmluc2VydHdyXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X2x2c3BsYXR3LFZJX2Z0eXBlX1NJLDEpCisvLyB0YWcgOiBWNl9sdnNwbGF0dworZGVmIGludF9oZXhhZ29uX1Y2X2x2c3BsYXR3IDoKK0hleGFnb25fdjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X2x2c3BsYXR3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9sdnNwbGF0d18xMjhCLFZJX2Z0eXBlX1NJLDEpCisvLyB0YWcgOiBWNl9sdnNwbGF0d18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfbHZzcGxhdHdfMTI4QiA6CitIZXhhZ29uX3YxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfbHZzcGxhdHdfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzc2lnbixWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdmFzc2lnbgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3NpZ24gOgorSGV4YWdvbl92NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzc2lnbiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzc2lnbl8xMjhCLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92YXNzaWduXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNzaWduXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNzaWduXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zjb21iaW5lLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zjb21iaW5lCitkZWYgaW50X2hleGFnb25fVjZfdmNvbWJpbmUgOgorSGV4YWdvbl92MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Y29tYmluZSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmNvbWJpbmVfMTI4QixWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92Y29tYmluZV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmNvbWJpbmVfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmNvbWJpbmVfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRlbHRhLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZkZWx0YQorZGVmIGludF9oZXhhZ29uX1Y2X3ZkZWx0YSA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRlbHRhIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZGVsdGFfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92ZGVsdGFfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZkZWx0YV8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZGVsdGFfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJkZWx0YSxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cmRlbHRhCitkZWYgaW50X2hleGFnb25fVjZfdnJkZWx0YSA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJkZWx0YSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJkZWx0YV8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZyZGVsdGFfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZyZGVsdGFfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJkZWx0YV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Y2wwdyxWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdmNsMHcKK2RlZiBpbnRfaGV4YWdvbl9WNl92Y2wwdyA6CitIZXhhZ29uX3Y1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Y2wwdyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmNsMHdfMTI4QixWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdmNsMHdfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZjbDB3XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Y2wwd18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Y2wwaCxWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdmNsMGgKK2RlZiBpbnRfaGV4YWdvbl9WNl92Y2wwaCA6CitIZXhhZ29uX3Y1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Y2wwaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmNsMGhfMTI4QixWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdmNsMGhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZjbDBoXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Y2wwaF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bm9ybWFtdHcsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3Zub3JtYW10dworZGVmIGludF9oZXhhZ29uX1Y2X3Zub3JtYW10dyA6CitIZXhhZ29uX3Y1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bm9ybWFtdHciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zub3JtYW10d18xMjhCLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92bm9ybWFtdHdfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zub3JtYW10d18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm5vcm1hbXR3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zub3JtYW10aCxWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdm5vcm1hbXRoCitkZWYgaW50X2hleGFnb25fVjZfdm5vcm1hbXRoIDoKK0hleGFnb25fdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zub3JtYW10aCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm5vcm1hbXRoXzEyOEIsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3Zub3JtYW10aF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm5vcm1hbXRoXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bm9ybWFtdGhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnBvcGNvdW50aCxWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnBvcGNvdW50aAorZGVmIGludF9oZXhhZ29uX1Y2X3Zwb3Bjb3VudGggOgorSGV4YWdvbl92NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnBvcGNvdW50aCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnBvcGNvdW50aF8xMjhCLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92cG9wY291bnRoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cG9wY291bnRoXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cG9wY291bnRoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsdXR2dmIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92bHV0dnZiCitkZWYgaW50X2hleGFnb25fVjZfdmx1dHZ2YiA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsdXR2dmIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsdXR2dmJfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZsdXR2dmJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZsdXR2dmJfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsdXR2dmJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmx1dHZ2Yl9vcmFjYyxWSV9mdHlwZV9WSVZJVklTSSw0KQorLy8gdGFnIDogVjZfdmx1dHZ2Yl9vcmFjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZsdXR2dmJfb3JhY2MgOgorSGV4YWdvbl92NTEydjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmx1dHZ2Yl9vcmFjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmx1dHZ2Yl9vcmFjY18xMjhCLFZJX2Z0eXBlX1ZJVklWSVNJLDQpCisvLyB0YWcgOiBWNl92bHV0dnZiX29yYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHV0dnZiX29yYWNjXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsdXR2dmJfb3JhY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmx1dHZ3aCxWRF9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZsdXR2d2gKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHV0dndoIDoKK0hleGFnb25fdjEwMjR2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsdXR2d2giPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsdXR2d2hfMTI4QixWRF9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZsdXR2d2hfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZsdXR2d2hfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsdXR2d2hfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmx1dHZ3aF9vcmFjYyxWRF9mdHlwZV9WRFZJVklTSSw0KQorLy8gdGFnIDogVjZfdmx1dHZ3aF9vcmFjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZsdXR2d2hfb3JhY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bHV0dndoX29yYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHV0dndoX29yYWNjXzEyOEIsVkRfZnR5cGVfVkRWSVZJU0ksNCkKKy8vIHRhZyA6IFY2X3ZsdXR2d2hfb3JhY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZsdXR2d2hfb3JhY2NfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmx1dHZ3aF9vcmFjY18xMjhCIj47CisKKy8vCisvLyBNYXNrZWQgdmVjdG9yIHN0b3JlcworLy8KK2RlZiBpbnRfaGV4YWdvbl9WNl92UzMyYl9xcHJlZF9haSA6CitIZXhhZ29uX3Z2NjRpdm1lbXY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZTMzJiX3FwcmVkX2FpIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92UzMyYl9ucXByZWRfYWkgOgorSGV4YWdvbl92djY0aXZtZW12NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92UzMyYl9ucXByZWRfYWkiPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZTMzJiX250X3FwcmVkX2FpIDoKK0hleGFnb25fdnY2NGl2bWVtdjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdlMzMmJfbnRfcXByZWRfYWkiPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZTMzJiX250X25xcHJlZF9haSA6CitIZXhhZ29uX3Z2NjRpdm1lbXY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZTMzJiX250X25xcHJlZF9haSI+OworCitkZWYgaW50X2hleGFnb25fVjZfdlMzMmJfcXByZWRfYWlfMTI4QiA6CitIZXhhZ29uX3Z2MTI4aXZtZW12MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdlMzMmJfcXByZWRfYWlfMTI4QiI+OworCitkZWYgaW50X2hleGFnb25fVjZfdlMzMmJfbnFwcmVkX2FpXzEyOEIgOgorSGV4YWdvbl92djEyOGl2bWVtdjEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZTMzJiX25xcHJlZF9haV8xMjhCIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92UzMyYl9udF9xcHJlZF9haV8xMjhCIDoKK0hleGFnb25fdnYxMjhpdm1lbXYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92UzMyYl9udF9xcHJlZF9haV8xMjhCIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92UzMyYl9udF9ucXByZWRfYWlfMTI4QiA6CitIZXhhZ29uX3Z2MTI4aXZtZW12MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdlMzMmJfbnRfbnFwcmVkX2FpXzEyOEIiPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZXEgOgorSGV4YWdvbl92djY0aXZtZW12NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bWFza2Vkc3RvcmVxIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWFza2Vkc3RvcmVucSA6CitIZXhhZ29uX3Z2NjRpdm1lbXY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtYXNrZWRzdG9yZW5xIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWFza2Vkc3RvcmVudHEgOgorSGV4YWdvbl92djY0aXZtZW12NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bWFza2Vkc3RvcmVudHEiPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZW50bnEgOgorSGV4YWdvbl92djY0aXZtZW12NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bWFza2Vkc3RvcmVudG5xIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWFza2Vkc3RvcmVxXzEyOEIgOgorSGV4YWdvbl92djEyOGl2bWVtdjEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtYXNrZWRzdG9yZXFfMTI4QiI+OworCitkZWYgaW50X2hleGFnb25fVjZfdm1hc2tlZHN0b3JlbnFfMTI4QiA6CitIZXhhZ29uX3Z2MTI4aXZtZW12MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1hc2tlZHN0b3JlbnFfMTI4QiI+OworCitkZWYgaW50X2hleGFnb25fVjZfdm1hc2tlZHN0b3JlbnRxXzEyOEIgOgorSGV4YWdvbl92djEyOGl2bWVtdjEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtYXNrZWRzdG9yZW50cV8xMjhCIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWFza2Vkc3RvcmVudG5xXzEyOEIgOgorSGV4YWdvbl92djEyOGl2bWVtdjEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtYXNrZWRzdG9yZW50bnFfMTI4QiI+OworCittdWx0aWNsYXNzIEhleGFnb25fY3VzdG9tX2NpcmNfbGRfSW50cmluc2ljPExMVk1UeXBlIEVsVHk+IHsKKyAgZGVmIE5BTUUjX3BjaSA6IEhleGFnb25fTm9uR0NDX0ludHJpbnNpYzwKKyAgICBbRWxUeSwgbGx2bV9wdHJfdHldLAorICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3B0cl90eV0sCisgICAgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8Mz5dPjsKKyAgZGVmIE5BTUUjX3BjciA6IEhleGFnb25fTm9uR0NDX0ludHJpbnNpYzwKKyAgICBbRWxUeSwgbGx2bV9wdHJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3B0cl90eV0sCisgICAgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8Mj5dPjsKK30KKworZGVmbSBpbnRfaGV4YWdvbl9MMl9sb2FkcnViIDogSGV4YWdvbl9jdXN0b21fY2lyY19sZF9JbnRyaW5zaWM8bGx2bV9pMzJfdHk+OworZGVmbSBpbnRfaGV4YWdvbl9MMl9sb2FkcmIgOiBIZXhhZ29uX2N1c3RvbV9jaXJjX2xkX0ludHJpbnNpYzxsbHZtX2kzMl90eT47CitkZWZtIGludF9oZXhhZ29uX0wyX2xvYWRydWggOiBIZXhhZ29uX2N1c3RvbV9jaXJjX2xkX0ludHJpbnNpYzxsbHZtX2kzMl90eT47CitkZWZtIGludF9oZXhhZ29uX0wyX2xvYWRyaCA6IEhleGFnb25fY3VzdG9tX2NpcmNfbGRfSW50cmluc2ljPGxsdm1faTMyX3R5PjsKK2RlZm0gaW50X2hleGFnb25fTDJfbG9hZHJpIDogSGV4YWdvbl9jdXN0b21fY2lyY19sZF9JbnRyaW5zaWM8bGx2bV9pMzJfdHk+OworZGVmbSBpbnRfaGV4YWdvbl9MMl9sb2FkcmQgOiBIZXhhZ29uX2N1c3RvbV9jaXJjX2xkX0ludHJpbnNpYzxsbHZtX2k2NF90eT47CisKK211bHRpY2xhc3MgSGV4YWdvbl9jdXN0b21fY2lyY19zdF9JbnRyaW5zaWM8TExWTVR5cGUgRWxUeT4geworICBkZWYgTkFNRSNfcGNpIDogSGV4YWdvbl9Ob25HQ0NfSW50cmluc2ljPAorICAgIFtsbHZtX3B0cl90eV0sCisgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIEVsVHksIGxsdm1fcHRyX3R5XSwKKyAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTw0Pl0+OworICBkZWYgTkFNRSNfcGNyIDogSGV4YWdvbl9Ob25HQ0NfSW50cmluc2ljPAorICAgIFtsbHZtX3B0cl90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIEVsVHksIGxsdm1fcHRyX3R5XSwKKyAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwzPl0+OworfQorCitkZWZtIGludF9oZXhhZ29uX1MyX3N0b3JlcmIgOiBIZXhhZ29uX2N1c3RvbV9jaXJjX3N0X0ludHJpbnNpYzxsbHZtX2kzMl90eT47CitkZWZtIGludF9oZXhhZ29uX1MyX3N0b3JlcmggOiBIZXhhZ29uX2N1c3RvbV9jaXJjX3N0X0ludHJpbnNpYzxsbHZtX2kzMl90eT47CitkZWZtIGludF9oZXhhZ29uX1MyX3N0b3JlcmYgOiBIZXhhZ29uX2N1c3RvbV9jaXJjX3N0X0ludHJpbnNpYzxsbHZtX2kzMl90eT47CitkZWZtIGludF9oZXhhZ29uX1MyX3N0b3JlcmkgOiBIZXhhZ29uX2N1c3RvbV9jaXJjX3N0X0ludHJpbnNpYzxsbHZtX2kzMl90eT47CitkZWZtIGludF9oZXhhZ29uX1MyX3N0b3JlcmQgOiBIZXhhZ29uX2N1c3RvbV9jaXJjX3N0X0ludHJpbnNpYzxsbHZtX2k2NF90eT47CisKKy8vIFRoZSBmcm9udC1lbmQgZW1pdHMgdGhlIGludHJpbnNpYyBjYWxsIHdpdGggb25seSB0d28gYXJndW1lbnRzLiBUaGUgdGhpcmQKKy8vIGFyZ3VtZW50IGZyb20gdGhlIGJ1aWx0aW4gaXMgYWxyZWFkeSB1c2VkIGJ5IGZyb250LWVuZCB0byB3cml0ZSB0byBtZW1vcnkKKy8vIGJ5IGdlbmVyYXRpbmcgYSBzdG9yZS4KK2NsYXNzIEhleGFnb25fY3VzdG9tX2JyZXZfbGRfSW50cmluc2ljPExMVk1UeXBlIEVsVHk+CisgOiBIZXhhZ29uX05vbkdDQ19JbnRyaW5zaWM8CisgICAgW0VsVHksIGxsdm1fcHRyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgW0ludHJSZWFkTWVtXT47CisKK2RlZiBpbnRfaGV4YWdvbl9MMl9sb2FkcnViX3BiciA6IEhleGFnb25fY3VzdG9tX2JyZXZfbGRfSW50cmluc2ljPGxsdm1faTMyX3R5PjsKK2RlZiBpbnRfaGV4YWdvbl9MMl9sb2FkcmJfcGJyIDogSGV4YWdvbl9jdXN0b21fYnJldl9sZF9JbnRyaW5zaWM8bGx2bV9pMzJfdHk+OworZGVmIGludF9oZXhhZ29uX0wyX2xvYWRydWhfcGJyIDogSGV4YWdvbl9jdXN0b21fYnJldl9sZF9JbnRyaW5zaWM8bGx2bV9pMzJfdHk+OworZGVmIGludF9oZXhhZ29uX0wyX2xvYWRyaF9wYnIgOiBIZXhhZ29uX2N1c3RvbV9icmV2X2xkX0ludHJpbnNpYzxsbHZtX2kzMl90eT47CitkZWYgaW50X2hleGFnb25fTDJfbG9hZHJpX3BiciA6IEhleGFnb25fY3VzdG9tX2JyZXZfbGRfSW50cmluc2ljPGxsdm1faTMyX3R5PjsKK2RlZiBpbnRfaGV4YWdvbl9MMl9sb2FkcmRfcGJyIDogSGV4YWdvbl9jdXN0b21fYnJldl9sZF9JbnRyaW5zaWM8bGx2bV9pNjRfdHk+OworCitkZWYgaW50X2hleGFnb25fUzJfc3RvcmVyYl9wYnIgOiBIZXhhZ29uX21lbV9tZW1zaXNpX0ludHJpbnNpYzwiYnJldl9zdGIiPjsKK2RlZiBpbnRfaGV4YWdvbl9TMl9zdG9yZXJoX3BiciA6IEhleGFnb25fbWVtX21lbXNpc2lfSW50cmluc2ljPCJicmV2X3N0aCI+OworZGVmIGludF9oZXhhZ29uX1MyX3N0b3JlcmZfcGJyIDogSGV4YWdvbl9tZW1fbWVtc2lzaV9JbnRyaW5zaWM8ImJyZXZfc3RoaGkiPjsKK2RlZiBpbnRfaGV4YWdvbl9TMl9zdG9yZXJpX3BiciA6IEhleGFnb25fbWVtX21lbXNpc2lfSW50cmluc2ljPCJicmV2X3N0dyI+OworZGVmIGludF9oZXhhZ29uX1MyX3N0b3JlcmRfcGJyIDogSGV4YWdvbl9tZW1fbWVtZGlzaV9JbnRyaW5zaWM8ImJyZXZfc3RkIj47CisKKworLy8vCisvLy8gSGV4YWdvblY2MiBpbnRyaW5zaWNzCisvLy8KKworLy8KKy8vIEhleGFnb25fTExpTExpTExpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogTTZfdmFic2RpZmZiCitjbGFzcyBIZXhhZ29uX0xMaUxMaUxMaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9MTGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogUzZfdnNwbGF0cmJwCitjbGFzcyBIZXhhZ29uX0xMaWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eV0sIFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3Y1MTJ2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3Zsc3JiCitjbGFzcyBIZXhhZ29uX1Y2Ml92NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YxMDI0djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmxzcmJfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjJfdjEwMjR2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YXNyd3Vocm5kc2F0CitjbGFzcyBIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksbGx2bV92MTZpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFzcnd1aHJuZHNhdF8xMjhCCitjbGFzcyBIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92cm91bmR1d3VoCitjbGFzcyBIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3Zyb3VuZHV3dWhfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2Ml92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YWRkdXdzYXRfZHZfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjJfdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92NjRpMzJfdHksbGx2bV92NjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YWRkaHdfYWNjCitjbGFzcyBIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YyMDQ4djIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFkZGh3X2FjY18xMjhCCitjbGFzcyBIZXhhZ29uX1Y2Ml92MjA0OHYyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjY0aTMyX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjEwMjR2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZtcHlld3VoXzY0CitjbGFzcyBIZXhhZ29uX1Y2Ml92MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2Ml92MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bXB5ZXd1aF82NF8xMjhCCitjbGFzcyBIZXhhZ29uX1Y2Ml92MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y2NGkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YzMmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YyMDQ4djIwNDhpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdm1wYXVoYl8xMjhCCitjbGFzcyBIZXhhZ29uX1Y2Ml92MjA0OHYyMDQ4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjY0aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjIwNDh2MjA0OHYyMDQ4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZtcGF1aGJfYWNjXzEyOEIKK2NsYXNzIEhleGFnb25fVjYyX3YyMDQ4djIwNDh2MjA0OGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y2NGkzMl90eV0sIFtsbHZtX3Y2NGkzMl90eSxsbHZtX3Y2NGkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3Y1MTJ2NjRpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZhbmRucXJ0CitjbGFzcyBIZXhhZ29uX1Y2Ml92NTEydjY0aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3Y1MTJpMV90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YxMDI0djEyOGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFuZG5xcnRfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjJfdjEwMjR2MTI4aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YxMDI0aTFfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2Ml92NTEydjUxMnY2NGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFuZG5xcnRfYWNjCitjbGFzcyBIZXhhZ29uX1Y2Ml92NTEydjUxMnY2NGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksbGx2bV92NTEyaTFfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEyOGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFuZG5xcnRfYWNjXzEyOEIKK2NsYXNzIEhleGFnb25fVjYyX3YxMDI0djEwMjR2MTI4aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YxMDI0aTFfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2Ml92NTEydjY0aXY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YW5kdnF2CitjbGFzcyBIZXhhZ29uX1Y2Ml92NTEydjY0aXY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3Y1MTJpMV90eSxsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YxMDI0djEyOGl2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZhbmR2cXZfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjJfdjEwMjR2MTI4aXYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MTAyNGkxX3R5LGxsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjY0aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl9wcmVkX3NjYWxhcjJ2MgorY2xhc3MgSGV4YWdvbl9WNjJfdjY0aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y1MTJpMV90eV0sIFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YxMjhpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ByZWRfc2NhbGFyMnYyXzEyOEIKK2NsYXNzIEhleGFnb25fVjYyX3YxMjhpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjEwMjRpMV90eV0sIFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3Y2NGl2NjRpdjY0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3NodWZmZXF3CitjbGFzcyBIZXhhZ29uX1Y2Ml92NjRpdjY0aXY2NGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y1MTJpMV90eV0sIFtsbHZtX3Y1MTJpMV90eSxsbHZtX3Y1MTJpMV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YxMjhpdjEyOGl2MTI4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3NodWZmZXF3XzEyOEIKK2NsYXNzIEhleGFnb25fVjYyX3YxMjhpdjEyOGl2MTI4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjEwMjRpMV90eV0sIFtsbHZtX3YxMDI0aTFfdHksbGx2bV92MTAyNGkxX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl9sdnNwbGF0aAorY2xhc3MgSGV4YWdvbl9WNjJfdjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X2x2c3BsYXRoXzEyOEIKK2NsYXNzIEhleGFnb25fVjYyX3YxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjUxMnY1MTJ2NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bHV0dnZiX29yYWNjaQorY2xhc3MgSGV4YWdvbl9WNjJfdjUxMnY1MTJ2NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZsdXR2dmJfb3JhY2NpXzEyOEIKK2NsYXNzIEhleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjEwMjR2NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bHV0dndoaQorY2xhc3MgSGV4YWdvbl9WNjJfdjEwMjR2NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YyMDQ4djEwMjR2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bHV0dndoaV8xMjhCCitjbGFzcyBIZXhhZ29uX1Y2Ml92MjA0OHYxMDI0djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djUxMnY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmx1dHZ3aF9vcmFjY2kKK2NsYXNzIEhleGFnb25fVjYyX3YxMDI0djEwMjR2NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YyMDQ4djIwNDh2MTAyNHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZsdXR2d2hfb3JhY2NpXzEyOEIKK2NsYXNzIEhleGFnb25fVjYyX3YyMDQ4djIwNDh2MTAyNHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjY0aTMyX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLyBIZXhhZ29uX3Y1MTJ2NjRpdjUxMnY1MTJ2NjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnOiBWNl92YWRkY2FycnkKK2NsYXNzIEhleGFnb25fdjUxMnY2NGl2NTEydjUxMnY2NGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjUxMmkxX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1fdjUxMmkxX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLyBIZXhhZ29uX3YxMDI0djEyOGl2MTAyNHYxMDI0djEyOGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWc6IFY2X3ZhZGRjYXJyeV8xMjhCCitjbGFzcyBIZXhhZ29uX3YxMDI0djEyOGl2MTAyNHYxMDI0djEyOGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHksIGxsdm1fdjEwMjRpMV90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YzMmkzMl90eSxsbHZtX3YxMDI0aTFfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk02X3ZhYnNkaWZmYixESV9mdHlwZV9ESURJLDIpCisvLyB0YWcgOiBNNl92YWJzZGlmZmIKK2RlZiBpbnRfaGV4YWdvbl9NNl92YWJzZGlmZmIgOgorSGV4YWdvbl9MTGlMTGlMTGlfSW50cmluc2ljPCJIRVhBR09OX002X3ZhYnNkaWZmYiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTZfdmFic2RpZmZ1YixESV9mdHlwZV9ESURJLDIpCisvLyB0YWcgOiBNNl92YWJzZGlmZnViCitkZWYgaW50X2hleGFnb25fTTZfdmFic2RpZmZ1YiA6CitIZXhhZ29uX0xMaUxMaUxMaV9JbnRyaW5zaWM8IkhFWEFHT05fTTZfdmFic2RpZmZ1YiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzZfdnRydW5laGJfcHBwLERJX2Z0eXBlX0RJREksMikKKy8vIHRhZyA6IFM2X3Z0cnVuZWhiX3BwcAorZGVmIGludF9oZXhhZ29uX1M2X3Z0cnVuZWhiX3BwcCA6CitIZXhhZ29uX0xMaUxMaUxMaV9JbnRyaW5zaWM8IkhFWEFHT05fUzZfdnRydW5laGJfcHBwIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNl92dHJ1bm9oYl9wcHAsRElfZnR5cGVfRElESSwyKQorLy8gdGFnIDogUzZfdnRydW5vaGJfcHBwCitkZWYgaW50X2hleGFnb25fUzZfdnRydW5vaGJfcHBwIDoKK0hleGFnb25fTExpTExpTExpX0ludHJpbnNpYzwiSEVYQUdPTl9TNl92dHJ1bm9oYl9wcHAiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM2X3ZzcGxhdHJicCxESV9mdHlwZV9TSSwxKQorLy8gdGFnIDogUzZfdnNwbGF0cmJwCitkZWYgaW50X2hleGFnb25fUzZfdnNwbGF0cmJwIDoKK0hleGFnb25fTExpaV9JbnRyaW5zaWM8IkhFWEFHT05fUzZfdnNwbGF0cmJwIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHNyYixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bHNyYgorZGVmIGludF9oZXhhZ29uX1Y2X3Zsc3JiIDoKK0hleGFnb25fVjYyX3Y1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmxzcmIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zsc3JiXzEyOEIsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmxzcmJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zsc3JiXzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zsc3JiXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3J3dWhybmRzYXQsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNyd3Vocm5kc2F0CitkZWYgaW50X2hleGFnb25fVjZfdmFzcnd1aHJuZHNhdCA6CitIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNyd3Vocm5kc2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNyd3Vocm5kc2F0XzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNyd3Vocm5kc2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyd3Vocm5kc2F0XzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcnd1aHJuZHNhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNydXd1aHJuZHNhdCxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3J1d3Vocm5kc2F0CitkZWYgaW50X2hleGFnb25fVjZfdmFzcnV3dWhybmRzYXQgOgorSGV4YWdvbl9WNjJfdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcnV3dWhybmRzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3J1d3Vocm5kc2F0XzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNydXd1aHJuZHNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFzcnV3dWhybmRzYXRfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNydXd1aHJuZHNhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNyaGJzYXQsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNyaGJzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyaGJzYXQgOgorSGV4YWdvbl9WNjJfdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcmhic2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNyaGJzYXRfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3JoYnNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFzcmhic2F0XzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcmhic2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zyb3VuZHV3dWgsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnJvdW5kdXd1aAorZGVmIGludF9oZXhhZ29uX1Y2X3Zyb3VuZHV3dWggOgorSGV4YWdvbl9WNjJfdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm91bmR1d3VoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm91bmR1d3VoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnJvdW5kdXd1aF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnJvdW5kdXd1aF8xMjhCIDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJvdW5kdXd1aF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm91bmR1aHViLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zyb3VuZHVodWIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm91bmR1aHViIDoKK0hleGFnb25fVjYyX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJvdW5kdWh1YiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJvdW5kdWh1Yl8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zyb3VuZHVodWJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zyb3VuZHVodWJfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zyb3VuZHVodWJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZHV3c2F0LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGR1d3NhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1d3NhdCA6CitIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR1d3NhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZHV3c2F0XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZHV3c2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkdXdzYXRfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR1d3NhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdXdzYXRfZHYsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdmFkZHV3c2F0X2R2CitkZWYgaW50X2hleGFnb25fVjZfdmFkZHV3c2F0X2R2IDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHV3c2F0X2R2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdXdzYXRfZHZfMTI4QixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92YWRkdXdzYXRfZHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1d3NhdF9kdl8xMjhCIDoKK0hleGFnb25fVjYyX3YyMDQ4djIwNDh2MjA0OF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHV3c2F0X2R2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJ1d3NhdCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3VidXdzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3VidXdzYXQgOgorSGV4YWdvbl9WNjJfdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3VidXdzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJ1d3NhdF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJ1d3NhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YnV3c2F0XzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3VidXdzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YnV3c2F0X2R2LFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZzdWJ1d3NhdF9kdgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ1d3NhdF9kdiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ1d3NhdF9kdiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YnV3c2F0X2R2XzEyOEIsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdnN1YnV3c2F0X2R2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3VidXdzYXRfZHZfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ1d3NhdF9kdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkYnNhdCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkYnNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRic2F0IDoKK0hleGFnb25fVjYyX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGJzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRic2F0XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZGJzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRic2F0XzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkYnNhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkYnNhdF9kdixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92YWRkYnNhdF9kdgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRic2F0X2R2IDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGJzYXRfZHYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRic2F0X2R2XzEyOEIsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdmFkZGJzYXRfZHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRic2F0X2R2XzEyOEIgOgorSGV4YWdvbl9WNjJfdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkYnNhdF9kdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3ViYnNhdCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3ViYnNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJic2F0IDoKK0hleGFnb25fVjYyX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YmJzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJic2F0XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnN1YmJzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJic2F0XzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViYnNhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3ViYnNhdF9kdixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92c3ViYnNhdF9kdgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJic2F0X2R2IDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YmJzYXRfZHYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJic2F0X2R2XzEyOEIsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdnN1YmJzYXRfZHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJic2F0X2R2XzEyOEIgOgorSGV4YWdvbl9WNjJfdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViYnNhdF9kdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdWJ1YmJfc2F0LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGR1YnViYl9zYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkdWJ1YmJfc2F0IDoKK0hleGFnb25fVjYyX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHVidWJiX3NhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZHVidWJiX3NhdF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGR1YnViYl9zYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1YnViYl9zYXRfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR1YnViYl9zYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YnVidWJiX3NhdCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3VidWJ1YmJfc2F0CitkZWYgaW50X2hleGFnb25fVjZfdnN1YnVidWJiX3NhdCA6CitIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ1YnViYl9zYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJ1YnViYl9zYXRfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3VidWJ1YmJfc2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3VidWJ1YmJfc2F0XzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3VidWJ1YmJfc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRod19hY2MsVkRfZnR5cGVfVkRWSVZJLDMpCisvLyB0YWcgOiBWNl92YWRkaHdfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGh3X2FjYyA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRod19hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRod19hY2NfMTI4QixWRF9mdHlwZV9WRFZJVkksMykKKy8vIHRhZyA6IFY2X3ZhZGRod19hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRod19hY2NfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MjA0OHYyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGh3X2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdWh3X2FjYyxWRF9mdHlwZV9WRFZJVkksMykKKy8vIHRhZyA6IFY2X3ZhZGR1aHdfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmFkZHVod19hY2MgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdWh3X2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZHVod19hY2NfMTI4QixWRF9mdHlwZV9WRFZJVkksMykKKy8vIHRhZyA6IFY2X3ZhZGR1aHdfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkdWh3X2FjY18xMjhCIDoKK0hleGFnb25fVjYyX3YyMDQ4djIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdWh3X2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdWJoX2FjYyxWRF9mdHlwZV9WRFZJVkksMykKKy8vIHRhZyA6IFY2X3ZhZGR1YmhfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmFkZHViaF9hY2MgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdWJoX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZHViaF9hY2NfMTI4QixWRF9mdHlwZV9WRFZJVkksMykKKy8vIHRhZyA6IFY2X3ZhZGR1YmhfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkdWJoX2FjY18xMjhCIDoKK0hleGFnb25fVjYyX3YyMDQ4djIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdWJoX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5ZXd1aF82NCxWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bXB5ZXd1aF82NAorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlld3VoXzY0IDoKK0hleGFnb25fVjYyX3YxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlld3VoXzY0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5ZXd1aF82NF8xMjhCLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlld3VoXzY0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5ZXd1aF82NF8xMjhCIDoKK0hleGFnb25fVjYyX3YyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWV3dWhfNjRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weW93aF82NF9hY2MsVkRfZnR5cGVfVkRWSVZJLDMpCisvLyB0YWcgOiBWNl92bXB5b3doXzY0X2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlvd2hfNjRfYWNjIDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weW93aF82NF9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlvd2hfNjRfYWNjXzEyOEIsVkRfZnR5cGVfVkRWSVZJLDMpCisvLyB0YWcgOiBWNl92bXB5b3doXzY0X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weW93aF82NF9hY2NfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MjA0OHYyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weW93aF82NF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1wYXVoYixWRF9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92bXBhdWhiCitkZWYgaW50X2hleGFnb25fVjZfdm1wYXVoYiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1wYXVoYiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1wYXVoYl8xMjhCLFZEX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3ZtcGF1aGJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcGF1aGJfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MjA0OHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1wYXVoYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBhdWhiX2FjYyxWRF9mdHlwZV9WRFZEU0ksMykKKy8vIHRhZyA6IFY2X3ZtcGF1aGJfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdm1wYXVoYl9hY2MgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1wYXVoYl9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcGF1aGJfYWNjXzEyOEIsVkRfZnR5cGVfVkRWRFNJLDMpCisvLyB0YWcgOiBWNl92bXBhdWhiX2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1wYXVoYl9hY2NfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MjA0OHYyMDQ4djIwNDhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBhdWhiX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aXd1YixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5aXd1YgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpd3ViIDoKK0hleGFnb25fVjYyX3Y1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWl3dWIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpd3ViXzEyOEIsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdm1weWl3dWJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpd3ViXzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpd3ViXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpd3ViX2FjYyxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZtcHlpd3ViX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpd3ViX2FjYyA6CitIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aXd1Yl9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpd3ViX2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdm1weWl3dWJfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aXd1Yl9hY2NfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aXd1Yl9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFuZG5xcnQsVklfZnR5cGVfUVZTSSwyKQorLy8gdGFnIDogVjZfdmFuZG5xcnQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YW5kbnFydCA6CitIZXhhZ29uX1Y2Ml92NTEydjY0aWlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhbmRucXJ0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YW5kbnFydF8xMjhCLFZJX2Z0eXBlX1FWU0ksMikKKy8vIHRhZyA6IFY2X3ZhbmRucXJ0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YW5kbnFydF8xMjhCIDoKK0hleGFnb25fVjYyX3YxMDI0djEyOGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YW5kbnFydF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YW5kbnFydF9hY2MsVklfZnR5cGVfVklRVlNJLDMpCisvLyB0YWcgOiBWNl92YW5kbnFydF9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92YW5kbnFydF9hY2MgOgorSGV4YWdvbl9WNjJfdjUxMnY1MTJ2NjRpaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFuZG5xcnRfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YW5kbnFydF9hY2NfMTI4QixWSV9mdHlwZV9WSVFWU0ksMykKKy8vIHRhZyA6IFY2X3ZhbmRucXJ0X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFuZG5xcnRfYWNjXzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMjhpaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFuZG5xcnRfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhbmR2cXYsVklfZnR5cGVfUVZWSSwyKQorLy8gdGFnIDogVjZfdmFuZHZxdgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhbmR2cXYgOgorSGV4YWdvbl9WNjJfdjUxMnY2NGl2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YW5kdnF2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YW5kdnF2XzEyOEIsVklfZnR5cGVfUVZWSSwyKQorLy8gdGFnIDogVjZfdmFuZHZxdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFuZHZxdl8xMjhCIDoKK0hleGFnb25fVjYyX3YxMDI0djEyOGl2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFuZHZxdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YW5kdm5xdixWSV9mdHlwZV9RVlZJLDIpCisvLyB0YWcgOiBWNl92YW5kdm5xdgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhbmR2bnF2IDoKK0hleGFnb25fVjYyX3Y1MTJ2NjRpdjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFuZHZucXYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhbmR2bnF2XzEyOEIsVklfZnR5cGVfUVZWSSwyKQorLy8gdGFnIDogVjZfdmFuZHZucXZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhbmR2bnF2XzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTI4aXYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YW5kdm5xdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9wcmVkX3NjYWxhcjJ2MixRVl9mdHlwZV9TSSwxKQorLy8gdGFnIDogVjZfcHJlZF9zY2FsYXIydjIKK2RlZiBpbnRfaGV4YWdvbl9WNl9wcmVkX3NjYWxhcjJ2MiA6CitIZXhhZ29uX1Y2Ml92NjRpaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfcHJlZF9zY2FsYXIydjIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ByZWRfc2NhbGFyMnYyXzEyOEIsUVZfZnR5cGVfU0ksMSkKKy8vIHRhZyA6IFY2X3ByZWRfc2NhbGFyMnYyXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl9wcmVkX3NjYWxhcjJ2Ml8xMjhCIDoKK0hleGFnb25fVjYyX3YxMjhpaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfcHJlZF9zY2FsYXIydjJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfc2h1ZmZlcXcsUVZfZnR5cGVfUVZRViwyKQorLy8gdGFnIDogVjZfc2h1ZmZlcXcKK2RlZiBpbnRfaGV4YWdvbl9WNl9zaHVmZmVxdyA6CitIZXhhZ29uX1Y2Ml92NjRpdjY0aXY2NGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3NodWZmZXF3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9zaHVmZmVxd18xMjhCLFFWX2Z0eXBlX1FWUVYsMikKKy8vIHRhZyA6IFY2X3NodWZmZXF3XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl9zaHVmZmVxd18xMjhCIDoKK0hleGFnb25fVjYyX3YxMjhpdjEyOGl2MTI4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfc2h1ZmZlcXdfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfc2h1ZmZlcWgsUVZfZnR5cGVfUVZRViwyKQorLy8gdGFnIDogVjZfc2h1ZmZlcWgKK2RlZiBpbnRfaGV4YWdvbl9WNl9zaHVmZmVxaCA6CitIZXhhZ29uX1Y2Ml92NjRpdjY0aXY2NGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3NodWZmZXFoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9zaHVmZmVxaF8xMjhCLFFWX2Z0eXBlX1FWUVYsMikKKy8vIHRhZyA6IFY2X3NodWZmZXFoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl9zaHVmZmVxaF8xMjhCIDoKK0hleGFnb25fVjYyX3YxMjhpdjEyOGl2MTI4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfc2h1ZmZlcWhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1heGIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1heGIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWF4YiA6CitIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtYXhiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bWF4Yl8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtYXhiXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWF4Yl8xMjhCIDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1heGJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1pbmIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1pbmIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWluYiA6CitIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtaW5iIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bWluYl8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtaW5iXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWluYl8xMjhCIDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1pbmJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNhdHV3dWgsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnNhdHV3dWgKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2F0dXd1aCA6CitIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzYXR1d3VoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2F0dXd1aF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzYXR1d3VoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2F0dXd1aF8xMjhCIDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNhdHV3dWhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfbHZzcGxhdGgsVklfZnR5cGVfU0ksMSkKKy8vIHRhZyA6IFY2X2x2c3BsYXRoCitkZWYgaW50X2hleGFnb25fVjZfbHZzcGxhdGggOgorSGV4YWdvbl9WNjJfdjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X2x2c3BsYXRoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9sdnNwbGF0aF8xMjhCLFZJX2Z0eXBlX1NJLDEpCisvLyB0YWcgOiBWNl9sdnNwbGF0aF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfbHZzcGxhdGhfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X2x2c3BsYXRoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X2x2c3BsYXRiLFZJX2Z0eXBlX1NJLDEpCisvLyB0YWcgOiBWNl9sdnNwbGF0YgorZGVmIGludF9oZXhhZ29uX1Y2X2x2c3BsYXRiIDoKK0hleGFnb25fVjYyX3Y1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9sdnNwbGF0YiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfbHZzcGxhdGJfMTI4QixWSV9mdHlwZV9TSSwxKQorLy8gdGFnIDogVjZfbHZzcGxhdGJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X2x2c3BsYXRiXzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9sdnNwbGF0Yl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkY2xidyxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkY2xidworZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRjbGJ3IDoKK0hleGFnb25fVjYyX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGNsYnciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRjbGJ3XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZGNsYndfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRjbGJ3XzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkY2xid18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkY2xiaCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkY2xiaAorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRjbGJoIDoKK0hleGFnb25fVjYyX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGNsYmgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRjbGJoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZGNsYmhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRjbGJoXzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkY2xiaF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHV0dnZiaSxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZsdXR2dmJpCitkZWYgaW50X2hleGFnb25fVjZfdmx1dHZ2YmkgOgorSGV4YWdvbl9WNjJfdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmx1dHZ2YmkiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsdXR2dmJpXzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92bHV0dnZiaV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmx1dHZ2YmlfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bHV0dnZiaV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHV0dnZiX29yYWNjaSxWSV9mdHlwZV9WSVZJVklTSSw0KQorLy8gdGFnIDogVjZfdmx1dHZ2Yl9vcmFjY2kKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHV0dnZiX29yYWNjaSA6CitIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmx1dHZ2Yl9vcmFjY2kiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsdXR2dmJfb3JhY2NpXzEyOEIsVklfZnR5cGVfVklWSVZJU0ksNCkKKy8vIHRhZyA6IFY2X3ZsdXR2dmJfb3JhY2NpXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHV0dnZiX29yYWNjaV8xMjhCIDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmx1dHZ2Yl9vcmFjY2lfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmx1dHZ3aGksVkRfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92bHV0dndoaQorZGVmIGludF9oZXhhZ29uX1Y2X3ZsdXR2d2hpIDoKK0hleGFnb25fVjYyX3YxMDI0djUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bHV0dndoaSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmx1dHZ3aGlfMTI4QixWRF9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZsdXR2d2hpXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHV0dndoaV8xMjhCIDoKK0hleGFnb25fVjYyX3YyMDQ4djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsdXR2d2hpXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsdXR2d2hfb3JhY2NpLFZEX2Z0eXBlX1ZEVklWSVNJLDQpCisvLyB0YWcgOiBWNl92bHV0dndoX29yYWNjaQorZGVmIGludF9oZXhhZ29uX1Y2X3ZsdXR2d2hfb3JhY2NpIDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsdXR2d2hfb3JhY2NpIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHV0dndoX29yYWNjaV8xMjhCLFZEX2Z0eXBlX1ZEVklWSVNJLDQpCisvLyB0YWcgOiBWNl92bHV0dndoX29yYWNjaV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmx1dHZ3aF9vcmFjY2lfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MjA0OHYyMDQ4djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsdXR2d2hfb3JhY2NpXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsdXR2dmJfbm0sVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92bHV0dnZiX25tCitkZWYgaW50X2hleGFnb25fVjZfdmx1dHZ2Yl9ubSA6CitIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bHV0dnZiX25tIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHV0dnZiX25tXzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92bHV0dnZiX25tXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHV0dnZiX25tXzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmx1dHZ2Yl9ubV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHV0dndoX25tLFZEX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmx1dHZ3aF9ubQorZGVmIGludF9oZXhhZ29uX1Y2X3ZsdXR2d2hfbm0gOgorSGV4YWdvbl9WNjJfdjEwMjR2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsdXR2d2hfbm0iPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsdXR2d2hfbm1fMTI4QixWRF9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZsdXR2d2hfbm1fMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZsdXR2d2hfbm1fMTI4QiA6CitIZXhhZ29uX1Y2Ml92MjA0OHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bHV0dndoX25tXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRjYXJyeSxWSV9mdHlwZV9WSVZJUVYsMykKKy8vIHRhZzogVjZfdmFkZGNhcnJ5CitkZWYgaW50X2hleGFnb25fVjZfdmFkZGNhcnJ5IDoKK0hleGFnb25fdjUxMnY2NGl2NTEydjUxMnY2NGlfSW50cmluc2ljPCJIRVhBR09OX3Y2X3ZhZGRjYXJyeSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGNhcnJ5XzEyOEIsVklfZnR5cGVfVklWSVFWLDMpCisvLyB0YWc6IFY2X3ZhZGRjYXJyeV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGNhcnJ5XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMjhpdjEwMjR2MTAyNHYxMjhpX0ludHJpbnNpYzwiSEVYQUdPTl92Nl92YWRkY2FycnlfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YmNhcnJ5LFZJX2Z0eXBlX1ZJVklRViwzKQorLy8gdGFnOiBWNl92c3ViY2FycnkKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViY2FycnkgOgorSGV4YWdvbl92NTEydjY0aXY1MTJ2NTEydjY0aV9JbnRyaW5zaWM8IkhFWEFHT05fdjZfdnN1YmNhcnJ5Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3ViY2FycnlfMTI4QixWSV9mdHlwZV9WSVZJUVYsMykKKy8vIHRhZzogVjZfdnN1YmNhcnJ5XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViY2FycnlfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEyOGl2MTAyNHYxMDI0djEyOGlfSW50cmluc2ljPCJIRVhBR09OX3Y2X3ZzdWJjYXJyeV8xMjhCIj47CisKKworLy8vCisvLy8gSGV4YWdvblY2NSBpbnRyaW5zaWNzCisvLy8KKworLy8KKy8vIEhleGFnb25fVjY1X2lMTGlMTGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBBNl92Y21wYmVxX25vdGFueQorY2xhc3MgSGV4YWdvbl9WNjVfaUxMaUxMaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5LGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjVfdjEwMjR2NTEyTExpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnJtcHl1Yl9ydHQKK2NsYXNzIEhleGFnb25fVjY1X3YxMDI0djUxMkxMaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjVfdjIwNDh2MTAyNExMaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZybXB5dWJfcnR0XzEyOEIKK2NsYXNzIEhleGFnb25fVjY1X3YyMDQ4djEwMjRMTGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y2NGkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjY1X3YxMDI0djEwMjR2NTEyTExpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnJtcHl1Yl9ydHRfYWNjCitjbGFzcyBIZXhhZ29uX1Y2NV92MTAyNHYxMDI0djUxMkxMaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjVfdjIwNDh2MjA0OHYxMDI0TExpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnJtcHl1Yl9ydHRfYWNjXzEyOEIKK2NsYXNzIEhleGFnb25fVjY1X3YyMDQ4djIwNDh2MTAyNExMaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjY0aTMyX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjVfdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3Zhc3J1d3Voc2F0CitjbGFzcyBIZXhhZ29uX1Y2NV92NTEydjUxMnY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksbGx2bV92MTZpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2NV92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFzcnV3dWhzYXRfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjVfdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjVfdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmF2Z3V3CitjbGFzcyBIZXhhZ29uX1Y2NV92NTEydjUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3Zhdmd1d18xMjhCCitjbGFzcyBIZXhhZ29uX1Y2NV92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YzMmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjY1X3Y1MTJ2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFic2IKK2NsYXNzIEhleGFnb25fVjY1X3Y1MTJ2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2NV92MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFic2JfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjVfdjEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjVfdjEwMjR2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bXBhYnV1CitjbGFzcyBIZXhhZ29uX1Y2NV92MTAyNHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjVfdjIwNDh2MjA0OGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bXBhYnV1XzEyOEIKK2NsYXNzIEhleGFnb25fVjY1X3YyMDQ4djIwNDhpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92NjRpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2NV92MjA0OHYyMDQ4djIwNDhpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdm1wYWJ1dV9hY2NfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjVfdjIwNDh2MjA0OHYyMDQ4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjY0aTMyX3R5LGxsdm1fdjY0aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjVfdjEwMjR2MTAyNHY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdm1weWhfYWNjCitjbGFzcyBIZXhhZ29uX1Y2NV92MTAyNHYxMDI0djUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YxNmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjY1X3YyMDQ4djIwNDh2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bXB5aF9hY2NfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjVfdjIwNDh2MjA0OHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjY0aTMyX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjVfdjUxMnY1MTJ2NTEyTExpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdm1wYWhoc2F0CitjbGFzcyBIZXhhZ29uX1Y2NV92NTEydjUxMnY1MTJMTGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eSxsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNExMaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZtcGFoaHNhdF8xMjhCCitjbGFzcyBIZXhhZ29uX1Y2NV92MTAyNHYxMDI0djEwMjRMTGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YzMmkzMl90eSxsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjY1X3Y1MTJ2NTEyTExpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmx1dDQKK2NsYXNzIEhleGFnb25fVjY1X3Y1MTJ2NTEyTExpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2NV92MTAyNHYxMDI0TExpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmx1dDRfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjVfdjEwMjR2MTAyNExMaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjVfdjUxMnY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdm1weXVoZQorY2xhc3MgSGV4YWdvbl9WNjVfdjUxMnY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2NV92NTEydjY0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZwcmVmaXhxYgorY2xhc3MgSGV4YWdvbl9WNjVfdjUxMnY2NGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3Y1MTJpMV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjY1X3YxMDI0djEyOGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92cHJlZml4cWJfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjVfdjEwMjR2MTI4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjEwMjRpMV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkE2X3ZjbXBiZXFfbm90YW55LFFJX2Z0eXBlX0RJREksMikKKy8vIHRhZyA6IEE2X3ZjbXBiZXFfbm90YW55CitkZWYgaW50X2hleGFnb25fQTZfdmNtcGJlcV9ub3RhbnkgOgorSGV4YWdvbl9WNjVfaUxMaUxMaV9JbnRyaW5zaWM8IkhFWEFHT05fQTZfdmNtcGJlcV9ub3RhbnkiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkE2X3ZjbXBiZXFfbm90YW55XzEyOEIsUUlfZnR5cGVfRElESSwyKQorLy8gdGFnIDogQTZfdmNtcGJlcV9ub3RhbnlfMTI4QgorZGVmIGludF9oZXhhZ29uX0E2X3ZjbXBiZXFfbm90YW55XzEyOEIgOgorSGV4YWdvbl9WNjVfaUxMaUxMaV9JbnRyaW5zaWM8IkhFWEFHT05fQTZfdmNtcGJlcV9ub3RhbnlfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHl1Yl9ydHQsVkRfZnR5cGVfVklESSwyKQorLy8gdGFnIDogVjZfdnJtcHl1Yl9ydHQKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weXViX3J0dCA6CitIZXhhZ29uX1Y2NV92MTAyNHY1MTJMTGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5dWJfcnR0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weXViX3J0dF8xMjhCLFZEX2Z0eXBlX1ZJREksMikKKy8vIHRhZyA6IFY2X3ZybXB5dWJfcnR0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weXViX3J0dF8xMjhCIDoKK0hleGFnb25fVjY1X3YyMDQ4djEwMjRMTGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5dWJfcnR0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5dWJfcnR0X2FjYyxWRF9mdHlwZV9WRFZJREksMykKKy8vIHRhZyA6IFY2X3ZybXB5dWJfcnR0X2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5dWJfcnR0X2FjYyA6CitIZXhhZ29uX1Y2NV92MTAyNHYxMDI0djUxMkxMaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHl1Yl9ydHRfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weXViX3J0dF9hY2NfMTI4QixWRF9mdHlwZV9WRFZJREksMykKKy8vIHRhZyA6IFY2X3ZybXB5dWJfcnR0X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHl1Yl9ydHRfYWNjXzEyOEIgOgorSGV4YWdvbl9WNjVfdjIwNDh2MjA0OHYxMDI0TExpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weXViX3J0dF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHlidWJfcnR0LFZEX2Z0eXBlX1ZJREksMikKKy8vIHRhZyA6IFY2X3ZybXB5YnViX3J0dAorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5YnViX3J0dCA6CitIZXhhZ29uX1Y2NV92MTAyNHY1MTJMTGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5YnViX3J0dCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHlidWJfcnR0XzEyOEIsVkRfZnR5cGVfVklESSwyKQorLy8gdGFnIDogVjZfdnJtcHlidWJfcnR0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weWJ1Yl9ydHRfMTI4QiA6CitIZXhhZ29uX1Y2NV92MjA0OHYxMDI0TExpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weWJ1Yl9ydHRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHlidWJfcnR0X2FjYyxWRF9mdHlwZV9WRFZJREksMykKKy8vIHRhZyA6IFY2X3ZybXB5YnViX3J0dF9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weWJ1Yl9ydHRfYWNjIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjR2NTEyTExpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weWJ1Yl9ydHRfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weWJ1Yl9ydHRfYWNjXzEyOEIsVkRfZnR5cGVfVkRWSURJLDMpCisvLyB0YWcgOiBWNl92cm1weWJ1Yl9ydHRfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weWJ1Yl9ydHRfYWNjXzEyOEIgOgorSGV4YWdvbl9WNjVfdjIwNDh2MjA0OHYxMDI0TExpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weWJ1Yl9ydHRfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3J1d3Voc2F0LFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcnV3dWhzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNydXd1aHNhdCA6CitIZXhhZ29uX1Y2NV92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNydXd1aHNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcnV3dWhzYXRfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3J1d3Voc2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNydXd1aHNhdF8xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3J1d3Voc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3J1aHVic2F0LFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcnVodWJzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNydWh1YnNhdCA6CitIZXhhZ29uX1Y2NV92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNydWh1YnNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcnVodWJzYXRfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3J1aHVic2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNydWh1YnNhdF8xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3J1aHVic2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3J1aHVicm5kc2F0LFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcnVodWJybmRzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNydWh1YnJuZHNhdCA6CitIZXhhZ29uX1Y2NV92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNydWh1YnJuZHNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcnVodWJybmRzYXRfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3J1aHVicm5kc2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNydWh1YnJuZHNhdF8xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3J1aHVicm5kc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc2xoX2FjYyxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc2xoX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3Zhc2xoX2FjYyA6CitIZXhhZ29uX1Y2NV92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNsaF9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc2xoX2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzbGhfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNsaF9hY2NfMTI4QiA6CitIZXhhZ29uX1Y2NV92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNsaF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcmhfYWNjLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcmhfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmFzcmhfYWNjIDoKK0hleGFnb25fVjY1X3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3JoX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcmhfYWNjXzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNyaF9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3JoX2FjY18xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3JoX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXZndXcsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z3V3CitkZWYgaW50X2hleGFnb25fVjZfdmF2Z3V3IDoKK0hleGFnb25fVjY1X3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmF2Z3V3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXZndXdfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXZndXdfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhdmd1d18xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmF2Z3V3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhdmd1d3JuZCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXZndXdybmQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZndXdybmQgOgorSGV4YWdvbl9WNjVfdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXZndXdybmQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhdmd1d3JuZF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zhdmd1d3JuZF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmF2Z3V3cm5kXzEyOEIgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXZndXdybmRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmF2Z2IsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z2IKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZnYiA6CitIZXhhZ29uX1Y2NV92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhdmdiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXZnYl8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhdmdiXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZnYl8xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmF2Z2JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmF2Z2JybmQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z2JybmQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZnYnJuZCA6CitIZXhhZ29uX1Y2NV92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhdmdicm5kIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXZnYnJuZF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zhdmdicm5kXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZnYnJuZF8xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmF2Z2JybmRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm5hdmdiLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZuYXZnYgorZGVmIGludF9oZXhhZ29uX1Y2X3ZuYXZnYiA6CitIZXhhZ29uX1Y2NV92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZuYXZnYiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm5hdmdiXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm5hdmdiXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bmF2Z2JfMTI4QiA6CitIZXhhZ29uX1Y2NV92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZuYXZnYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWJzYixWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdmFic2IKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWJzYiA6CitIZXhhZ29uX1Y2NV92NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFic2IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhYnNiXzEyOEIsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3ZhYnNiXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWJzYl8xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhYnNiXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhYnNiX3NhdCxWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdmFic2Jfc2F0CitkZWYgaW50X2hleGFnb25fVjZfdmFic2Jfc2F0IDoKK0hleGFnb25fVjY1X3Y1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWJzYl9zYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhYnNiX3NhdF8xMjhCLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92YWJzYl9zYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhYnNiX3NhdF8xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhYnNiX3NhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBhYnV1LFZEX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3ZtcGFidXUKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhYnV1IDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBhYnV1Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBhYnV1XzEyOEIsVkRfZnR5cGVfVkRTSSwyKQorLy8gdGFnIDogVjZfdm1wYWJ1dV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1wYWJ1dV8xMjhCIDoKK0hleGFnb25fVjY1X3YyMDQ4djIwNDhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBhYnV1XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcGFidXVfYWNjLFZEX2Z0eXBlX1ZEVkRTSSwzKQorLy8gdGFnIDogVjZfdm1wYWJ1dV9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhYnV1X2FjYyA6CitIZXhhZ29uX1Y2NV92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBhYnV1X2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1wYWJ1dV9hY2NfMTI4QixWRF9mdHlwZV9WRFZEU0ksMykKKy8vIHRhZyA6IFY2X3ZtcGFidXVfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhYnV1X2FjY18xMjhCIDoKK0hleGFnb25fVjY1X3YyMDQ4djIwNDh2MjA0OGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcGFidXVfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHloX2FjYyxWRF9mdHlwZV9WRFZJU0ksMykKKy8vIHRhZyA6IFY2X3ZtcHloX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHloX2FjYyA6CitIZXhhZ29uX1Y2NV92MTAyNHYxMDI0djUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHloX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWhfYWNjXzEyOEIsVkRfZnR5cGVfVkRWSVNJLDMpCisvLyB0YWcgOiBWNl92bXB5aF9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHloX2FjY18xMjhCIDoKK0hleGFnb25fVjY1X3YyMDQ4djIwNDh2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHloX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBhaGhzYXQsVklfZnR5cGVfVklWSURJLDMpCisvLyB0YWcgOiBWNl92bXBhaGhzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhaGhzYXQgOgorSGV4YWdvbl9WNjVfdjUxMnY1MTJ2NTEyTExpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBhaGhzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcGFoaHNhdF8xMjhCLFZJX2Z0eXBlX1ZJVklESSwzKQorLy8gdGFnIDogVjZfdm1wYWhoc2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhaGhzYXRfMTI4QiA6CitIZXhhZ29uX1Y2NV92MTAyNHYxMDI0djEwMjRMTGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcGFoaHNhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBhdWh1aHNhdCxWSV9mdHlwZV9WSVZJREksMykKKy8vIHRhZyA6IFY2X3ZtcGF1aHVoc2F0CitkZWYgaW50X2hleGFnb25fVjZfdm1wYXVodWhzYXQgOgorSGV4YWdvbl9WNjVfdjUxMnY1MTJ2NTEyTExpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBhdWh1aHNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1wYXVodWhzYXRfMTI4QixWSV9mdHlwZV9WSVZJREksMykKKy8vIHRhZyA6IFY2X3ZtcGF1aHVoc2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhdWh1aHNhdF8xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNExMaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1wYXVodWhzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1wc3VodWhzYXQsVklfZnR5cGVfVklWSURJLDMpCisvLyB0YWcgOiBWNl92bXBzdWh1aHNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHN1aHVoc2F0IDoKK0hleGFnb25fVjY1X3Y1MTJ2NTEydjUxMkxMaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1wc3VodWhzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHN1aHVoc2F0XzEyOEIsVklfZnR5cGVfVklWSURJLDMpCisvLyB0YWcgOiBWNl92bXBzdWh1aHNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1wc3VodWhzYXRfMTI4QiA6CitIZXhhZ29uX1Y2NV92MTAyNHYxMDI0djEwMjRMTGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHN1aHVoc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsdXQ0LFZJX2Z0eXBlX1ZJREksMikKKy8vIHRhZyA6IFY2X3ZsdXQ0CitkZWYgaW50X2hleGFnb25fVjZfdmx1dDQgOgorSGV4YWdvbl9WNjVfdjUxMnY1MTJMTGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsdXQ0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHV0NF8xMjhCLFZJX2Z0eXBlX1ZJREksMikKKy8vIHRhZyA6IFY2X3ZsdXQ0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHV0NF8xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjRMTGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsdXQ0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHl1aGUsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdm1weXVoZQorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHl1aGUgOgorSGV4YWdvbl9WNjVfdjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5dWhlIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5dWhlXzEyOEIsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdm1weXVoZV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weXVoZV8xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5dWhlXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHl1aGVfYWNjLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdm1weXVoZV9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5dWhlX2FjYyA6CitIZXhhZ29uX1Y2NV92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5dWhlX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weXVoZV9hY2NfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZtcHl1aGVfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5dWhlX2FjY18xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHl1aGVfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZwcmVmaXhxYixWSV9mdHlwZV9RViwxKQorLy8gdGFnIDogVjZfdnByZWZpeHFiCitkZWYgaW50X2hleGFnb25fVjZfdnByZWZpeHFiIDoKK0hleGFnb25fVjY1X3Y1MTJ2NjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cHJlZml4cWIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZwcmVmaXhxYl8xMjhCLFZJX2Z0eXBlX1FWLDEpCisvLyB0YWcgOiBWNl92cHJlZml4cWJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZwcmVmaXhxYl8xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEyOGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZwcmVmaXhxYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cHJlZml4cWgsVklfZnR5cGVfUVYsMSkKKy8vIHRhZyA6IFY2X3ZwcmVmaXhxaAorZGVmIGludF9oZXhhZ29uX1Y2X3ZwcmVmaXhxaCA6CitIZXhhZ29uX1Y2NV92NTEydjY0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnByZWZpeHFoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cHJlZml4cWhfMTI4QixWSV9mdHlwZV9RViwxKQorLy8gdGFnIDogVjZfdnByZWZpeHFoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cHJlZml4cWhfMTI4QiA6CitIZXhhZ29uX1Y2NV92MTAyNHYxMjhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cHJlZml4cWhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnByZWZpeHF3LFZJX2Z0eXBlX1FWLDEpCisvLyB0YWcgOiBWNl92cHJlZml4cXcKK2RlZiBpbnRfaGV4YWdvbl9WNl92cHJlZml4cXcgOgorSGV4YWdvbl9WNjVfdjUxMnY2NGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZwcmVmaXhxdyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnByZWZpeHF3XzEyOEIsVklfZnR5cGVfUVYsMSkKKy8vIHRhZyA6IFY2X3ZwcmVmaXhxd18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnByZWZpeHF3XzEyOEIgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTI4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnByZWZpeHF3XzEyOEIiPjsKKworCisvLyBUaGUgc2NhdHRlci9nYXRoZXIgb25lcyBiZWxvdyB3aWxsIG5vdCBiZSBnZW5lcmF0ZWQgZnJvbSBpc2V0LnB5LiBNYWtlIHN1cmUKKy8vIHlvdSBkb24ndCBvdmVyd3JpdGUgdGhlc2UuCitjbGFzcyBIZXhhZ29uX1Y2NV92dm1lbWlpdjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW10sIFtsbHZtX3B0cl90eSxsbHZtX2kzMl90eSxsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCitjbGFzcyBIZXhhZ29uX1Y2NV92dm1lbWlpdjEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLCBbbGx2bV9wdHJfdHksbGx2bV9pMzJfdHksbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworY2xhc3MgSGV4YWdvbl9WNjVfdnZtZW1paXYyMDQ4X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW2xsdm1fcHRyX3R5LGxsdm1faTMyX3R5LGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjY0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKK2NsYXNzIEhleGFnb25fVjY1X3Z2bWVtdjY0aWlpdjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW10sIFtsbHZtX3B0cl90eSxsbHZtX3Y1MTJpMV90eSxsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSxsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCitjbGFzcyBIZXhhZ29uX1Y2NV92dm1lbXYxMjhpaWl2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW10sIFtsbHZtX3B0cl90eSxsbHZtX3YxMDI0aTFfdHksbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworY2xhc3MgSGV4YWdvbl9WNjVfdnZtZW12NjRpaWl2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW10sIFtsbHZtX3B0cl90eSxsbHZtX3Y1MTJpMV90eSxsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSxsbHZtX3YzMmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCitjbGFzcyBIZXhhZ29uX1Y2NV92dm1lbXYxMjhpaWl2MjA0OF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW10sIFtsbHZtX3B0cl90eSxsbHZtX3YxMDI0aTFfdHksbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksbGx2bV92NjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZnYXRoZXJtdyA6CitIZXhhZ29uX1Y2NV92dm1lbWlpdjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmdhdGhlcm13Ij47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z2F0aGVybXdfMTI4QiA6CitIZXhhZ29uX1Y2NV92dm1lbWlpdjEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZnYXRoZXJtd18xMjhCIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z2F0aGVybWggOgorSGV4YWdvbl9WNjVfdnZtZW1paXY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZnYXRoZXJtaCI+OworCitkZWYgaW50X2hleGFnb25fVjZfdmdhdGhlcm1oXzEyOEIgOgorSGV4YWdvbl9WNjVfdnZtZW1paXYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z2F0aGVybWhfMTI4QiI+OworCitkZWYgaW50X2hleGFnb25fVjZfdmdhdGhlcm1odyA6CitIZXhhZ29uX1Y2NV92dm1lbWlpdjEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZnYXRoZXJtaHciPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZnYXRoZXJtaHdfMTI4QiA6CitIZXhhZ29uX1Y2NV92dm1lbWlpdjIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZnYXRoZXJtaHdfMTI4QiI+OworCitkZWYgaW50X2hleGFnb25fVjZfdmdhdGhlcm13cSA6CitIZXhhZ29uX1Y2NV92dm1lbXY2NGlpaXY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZnYXRoZXJtd3EiPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZnYXRoZXJtd3FfMTI4QiA6CitIZXhhZ29uX1Y2NV92dm1lbXYxMjhpaWl2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmdhdGhlcm13cV8xMjhCIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z2F0aGVybWhxIDoKK0hleGFnb25fVjY1X3Z2bWVtdjY0aWlpdjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmdhdGhlcm1ocSI+OworCitkZWYgaW50X2hleGFnb25fVjZfdmdhdGhlcm1ocV8xMjhCIDoKK0hleGFnb25fVjY1X3Z2bWVtdjEyOGlpaXYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z2F0aGVybWhxXzEyOEIiPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZnYXRoZXJtaHdxIDoKK0hleGFnb25fVjY1X3Z2bWVtdjY0aWlpdjEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZnYXRoZXJtaHdxIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z2F0aGVybWh3cV8xMjhCIDoKK0hleGFnb25fVjY1X3Z2bWVtdjEyOGlpaXYyMDQ4X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z2F0aGVybWh3cV8xMjhCIj47CisKK2NsYXNzIEhleGFnb25fVjY1X3ZpaXY1MTJ2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW2xsdm1faTMyX3R5LGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbV0+OworCitjbGFzcyBIZXhhZ29uX1Y2NV92aWl2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW2xsdm1faTMyX3R5LGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbV0+OworCitjbGFzcyBIZXhhZ29uX1Y2NV92djY0aWlpdjUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLCBbbGx2bV92NTEyaTFfdHksbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50cldyaXRlTWVtXT47CisKK2NsYXNzIEhleGFnb25fVjY1X3Z2MTI4aWlpdjEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW10sIFtsbHZtX3YxMDI0aTFfdHksbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksbGx2bV92MzJpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50cldyaXRlTWVtXT47CisKK2NsYXNzIEhleGFnb25fVjY1X3ZpaXYxMDI0djUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW10sIFtsbHZtX2kzMl90eSxsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmkzMl90eSxsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyV3JpdGVNZW1dPjsKKworY2xhc3MgSGV4YWdvbl9WNjVfdmlpdjIwNDh2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW10sIFtsbHZtX2kzMl90eSxsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y2NGkzMl90eSxsbHZtX3YzMmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyV3JpdGVNZW1dPjsKKworY2xhc3MgSGV4YWdvbl9WNjVfdnY2NGlpaXYxMDI0djUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW10sIFtsbHZtX3Y1MTJpMV90eSxsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSxsbHZtX3YzMmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyV3JpdGVNZW1dPjsKKworY2xhc3MgSGV4YWdvbl9WNjVfdnYxMjhpaWl2MjA0OHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW2xsdm1fdjEwMjRpMV90eSxsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSxsbHZtX3Y2NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyV3JpdGVNZW1dPjsKKworY2xhc3MgSGV4YWdvbl9WNjVfdjIwNDhfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y2NGkzMl90eV0sIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2NhdHRlcm13LHZfZnR5cGVfU0lTSVZJVkksNCkKKy8vIHRhZyA6IFY2X3ZzY2F0dGVybXcKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2NhdHRlcm13IDoKK0hleGFnb25fVjY1X3ZpaXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2NhdHRlcm13Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2NhdHRlcm13XzEyOEIsdl9mdHlwZV9TSVNJVklWSSw0KQorLy8gdGFnIDogVjZfdnNjYXR0ZXJtd18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnNjYXR0ZXJtd18xMjhCIDoKK0hleGFnb25fVjY1X3ZpaXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzY2F0dGVybXdfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNjYXR0ZXJtaCx2X2Z0eXBlX1NJU0lWSVZJLDQpCisvLyB0YWcgOiBWNl92c2NhdHRlcm1oCitkZWYgaW50X2hleGFnb25fVjZfdnNjYXR0ZXJtaCA6CitIZXhhZ29uX1Y2NV92aWl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNjYXR0ZXJtaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNjYXR0ZXJtaF8xMjhCLHZfZnR5cGVfU0lTSVZJVkksNCkKKy8vIHRhZyA6IFY2X3ZzY2F0dGVybWhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzY2F0dGVybWhfMTI4QiA6CitIZXhhZ29uX1Y2NV92aWl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2NhdHRlcm1oXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzY2F0dGVybXdfYWRkLHZfZnR5cGVfU0lTSVZJVkksNCkKKy8vIHRhZyA6IFY2X3ZzY2F0dGVybXdfYWRkCitkZWYgaW50X2hleGFnb25fVjZfdnNjYXR0ZXJtd19hZGQgOgorSGV4YWdvbl9WNjVfdmlpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzY2F0dGVybXdfYWRkIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2NhdHRlcm13X2FkZF8xMjhCLHZfZnR5cGVfU0lTSVZJVkksNCkKKy8vIHRhZyA6IFY2X3ZzY2F0dGVybXdfYWRkXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2NhdHRlcm13X2FkZF8xMjhCIDoKK0hleGFnb25fVjY1X3ZpaXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzY2F0dGVybXdfYWRkXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzY2F0dGVybWhfYWRkLHZfZnR5cGVfU0lTSVZJVkksNCkKKy8vIHRhZyA6IFY2X3ZzY2F0dGVybWhfYWRkCitkZWYgaW50X2hleGFnb25fVjZfdnNjYXR0ZXJtaF9hZGQgOgorSGV4YWdvbl9WNjVfdmlpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzY2F0dGVybWhfYWRkIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2NhdHRlcm1oX2FkZF8xMjhCLHZfZnR5cGVfU0lTSVZJVkksNCkKKy8vIHRhZyA6IFY2X3ZzY2F0dGVybWhfYWRkXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2NhdHRlcm1oX2FkZF8xMjhCIDoKK0hleGFnb25fVjY1X3ZpaXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzY2F0dGVybWhfYWRkXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzY2F0dGVybXdxLHZfZnR5cGVfUVZTSVNJVklWSSw1KQorLy8gdGFnIDogVjZfdnNjYXR0ZXJtd3EKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2NhdHRlcm13cSA6CitIZXhhZ29uX1Y2NV92djY0aWlpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzY2F0dGVybXdxIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2NhdHRlcm13cV8xMjhCLHZfZnR5cGVfUVZTSVNJVklWSSw1KQorLy8gdGFnIDogVjZfdnNjYXR0ZXJtd3FfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzY2F0dGVybXdxXzEyOEIgOgorSGV4YWdvbl9WNjVfdnYxMjhpaWl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2NhdHRlcm13cV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2NhdHRlcm1ocSx2X2Z0eXBlX1FWU0lTSVZJVkksNSkKKy8vIHRhZyA6IFY2X3ZzY2F0dGVybWhxCitkZWYgaW50X2hleGFnb25fVjZfdnNjYXR0ZXJtaHEgOgorSGV4YWdvbl9WNjVfdnY2NGlpaXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2NhdHRlcm1ocSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNjYXR0ZXJtaHFfMTI4Qix2X2Z0eXBlX1FWU0lTSVZJVkksNSkKKy8vIHRhZyA6IFY2X3ZzY2F0dGVybWhxXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2NhdHRlcm1ocV8xMjhCIDoKK0hleGFnb25fVjY1X3Z2MTI4aWlpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNjYXR0ZXJtaHFfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNjYXR0ZXJtaHcsdl9mdHlwZV9TSVNJVkRWSSw0KQorLy8gdGFnIDogVjZfdnNjYXR0ZXJtaHcKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2NhdHRlcm1odyA6CitIZXhhZ29uX1Y2NV92aWl2MTAyNHY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzY2F0dGVybWh3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2NhdHRlcm1od18xMjhCLHZfZnR5cGVfU0lTSVZEVkksNCkKKy8vIHRhZyA6IFY2X3ZzY2F0dGVybWh3XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2NhdHRlcm1od18xMjhCIDoKK0hleGFnb25fVjY1X3ZpaXYyMDQ4djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzY2F0dGVybWh3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzY2F0dGVybWh3cSx2X2Z0eXBlX1FWU0lTSVZEVkksNSkKKy8vIHRhZyA6IFY2X3ZzY2F0dGVybWh3cQorZGVmIGludF9oZXhhZ29uX1Y2X3ZzY2F0dGVybWh3cSA6CitIZXhhZ29uX1Y2NV92djY0aWlpdjEwMjR2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2NhdHRlcm1od3EiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzY2F0dGVybWh3cV8xMjhCLHZfZnR5cGVfUVZTSVNJVkRWSSw1KQorLy8gdGFnIDogVjZfdnNjYXR0ZXJtaHdxXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2NhdHRlcm1od3FfMTI4QiA6CitIZXhhZ29uX1Y2NV92djEyOGlpaXYyMDQ4djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzY2F0dGVybWh3cV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2NhdHRlcm1od19hZGQsdl9mdHlwZV9TSVNJVkRWSSw0KQorLy8gdGFnIDogVjZfdnNjYXR0ZXJtaHdfYWRkCitkZWYgaW50X2hleGFnb25fVjZfdnNjYXR0ZXJtaHdfYWRkIDoKK0hleGFnb25fVjY1X3ZpaXYxMDI0djUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNjYXR0ZXJtaHdfYWRkIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2NhdHRlcm1od19hZGRfMTI4Qix2X2Z0eXBlX1NJU0lWRFZJLDQpCisvLyB0YWcgOiBWNl92c2NhdHRlcm1od19hZGRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzY2F0dGVybWh3X2FkZF8xMjhCIDoKK0hleGFnb25fVjY1X3ZpaXYyMDQ4djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzY2F0dGVybWh3X2FkZF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZGQwLFZEX2Z0eXBlXywwKQorLy8gdGFnIDogVjZfdmRkMAorZGVmIGludF9oZXhhZ29uX1Y2X3ZkZDAgOgorSGV4YWdvbl92MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRkMCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRkMF8xMjhCLFZEX2Z0eXBlXywwKQorLy8gdGFnIDogVjZfdmRkMF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmRkMF8xMjhCIDoKK0hleGFnb25fVjY1X3YyMDQ4X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZGQwXzEyOEIiPjsKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc01pcHMudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NNaXBzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMWE3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NNaXBzLnRkCkBAIC0wLDAgKzEsMTc3MSBAQAorLy89PT0tIEludHJpbnNpY3NNaXBzLnRkIC0gRGVmaW5lcyBNaXBzIGludHJpbnNpY3MgLS0tLS0tLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgb2YgdGhlIE1JUFMtc3BlY2lmaWMgaW50cmluc2ljcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTUlQUyBEU1AgZGF0YSB0eXBlcworZGVmIG1pcHNfdjJxMTVfdHk6IExMVk1UeXBlPHYyaTE2PjsKK2RlZiBtaXBzX3Y0cTdfdHk6IExMVk1UeXBlPHY0aTg+OworZGVmIG1pcHNfcTMxX3R5OiBMTFZNVHlwZTxpMzI+OworCitsZXQgVGFyZ2V0UHJlZml4ID0gIm1pcHMiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ubWlwcy4iLgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTUlQUyBEU1AgUmV2IDEKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFkZGl0aW9uL3N1YnRyYWN0aW9uCisKK2RlZiBpbnRfbWlwc19hZGR1X3FiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfYWRkdV9xYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpOF90eV0sIFtsbHZtX3Y0aThfdHksIGxsdm1fdjRpOF90eV0sCisgICAgICAgICAgICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2FkZHVfc19xYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2FkZHVfc19xYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpOF90eV0sIFtsbHZtX3Y0aThfdHksIGxsdm1fdjRpOF90eV0sCisgICAgICAgICAgICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnVfcWIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zdWJ1X3FiIj4sCisgIEludHJpbnNpYzxbbGx2bV92NGk4X3R5XSwgW2xsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnVfc19xYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3N1YnVfc19xYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpOF90eV0sIFtsbHZtX3Y0aThfdHksIGxsdm1fdjRpOF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2FkZHFfcGggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19hZGRxX3BoIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFttaXBzX3YycTE1X3R5LCBtaXBzX3YycTE1X3R5XSwKKyAgICAgICAgICAgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYWRkcV9zX3BoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfYWRkcV9zX3BoIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFttaXBzX3YycTE1X3R5LCBtaXBzX3YycTE1X3R5XSwKKyAgICAgICAgICAgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3VicV9waCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3N1YnFfcGgiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW21pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3VicV9zX3BoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc3VicV9zX3BoIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFttaXBzX3YycTE1X3R5LCBtaXBzX3YycTE1X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbWFkZDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbWFkZCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKK2RlZiBpbnRfbWlwc19tYWRkdTogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbWFkZHUiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisKK2RlZiBpbnRfbWlwc19tc3ViOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19tc3ViIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbXN1YnU6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX21zdWJ1Ij4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19hZGRxX3NfdzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfYWRkcV9zX3ciPiwKKyAgSW50cmluc2ljPFttaXBzX3EzMV90eV0sIFttaXBzX3EzMV90eSwgbWlwc19xMzFfdHldLCBbQ29tbXV0YXRpdmVdPjsKK2RlZiBpbnRfbWlwc19zdWJxX3NfdzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc3VicV9zX3ciPiwKKyAgSW50cmluc2ljPFttaXBzX3EzMV90eV0sIFttaXBzX3EzMV90eSwgbWlwc19xMzFfdHldLCBbXT47CisKK2RlZiBpbnRfbWlwc19hZGRzYzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfYWRkc2MiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbQ29tbXV0YXRpdmVdPjsKK2RlZiBpbnRfbWlwc19hZGR3YzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfYWRkd2MiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbQ29tbXV0YXRpdmVdPjsKKworZGVmIGludF9taXBzX21vZHN1YjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbW9kc3ViIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfcmFkZHVfd19xYjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcmFkZHVfd19xYiI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRpOF90eV0sIFtJbnRyTm9NZW1dPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFic29sdXRlIHZhbHVlCisKK2RlZiBpbnRfbWlwc19hYnNxX3NfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2Fic3Ffc19waCI+LAorICBJbnRyaW5zaWM8W21pcHNfdjJxMTVfdHldLCBbbWlwc192MnExNV90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19hYnNxX3NfdzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfYWJzcV9zX3ciPiwKKyAgSW50cmluc2ljPFttaXBzX3EzMV90eV0sIFttaXBzX3EzMV90eV0sIFtdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFByZWNpc2lvbiByZWR1Y2UvZXhwYW5kCisKK2RlZiBpbnRfbWlwc19wcmVjcnFfcWJfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3ByZWNycV9xYl9waCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpOF90eV0sIFttaXBzX3YycTE1X3R5LCBtaXBzX3YycTE1X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3ByZWNycXVfc19xYl9waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcHJlY3JxdV9zX3FiX3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV92NGk4X3R5XSwgW21pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbXT47CitkZWYgaW50X21pcHNfcHJlY3JxX3BoX3c6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3ByZWNycV9waF93Ij4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFttaXBzX3EzMV90eSwgbWlwc19xMzFfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfcHJlY3JxX3JzX3BoX3c6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3ByZWNycV9yc19waF93Ij4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFttaXBzX3EzMV90eSwgbWlwc19xMzFfdHldLCBbXT47CitkZWYgaW50X21pcHNfcHJlY2VxX3dfcGhsOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19wcmVjZXFfd19waGwiPiwKKyAgSW50cmluc2ljPFttaXBzX3EzMV90eV0sIFttaXBzX3YycTE1X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3ByZWNlcV93X3BocjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcHJlY2VxX3dfcGhyIj4sCisgIEludHJpbnNpYzxbbWlwc19xMzFfdHldLCBbbWlwc192MnExNV90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19wcmVjZXF1X3BoX3FibDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcHJlY2VxdV9waF9xYmwiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW2xsdm1fdjRpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19wcmVjZXF1X3BoX3FicjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcHJlY2VxdV9waF9xYnIiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW2xsdm1fdjRpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19wcmVjZXF1X3BoX3FibGE6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3ByZWNlcXVfcGhfcWJsYSI+LAorICBJbnRyaW5zaWM8W21pcHNfdjJxMTVfdHldLCBbbGx2bV92NGk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3ByZWNlcXVfcGhfcWJyYTogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcHJlY2VxdV9waF9xYnJhIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFtsbHZtX3Y0aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfcHJlY2V1X3BoX3FibDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcHJlY2V1X3BoX3FibCI+LAorICBJbnRyaW5zaWM8W21pcHNfdjJxMTVfdHldLCBbbGx2bV92NGk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3ByZWNldV9waF9xYnI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3ByZWNldV9waF9xYnIiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW2xsdm1fdjRpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19wcmVjZXVfcGhfcWJsYTogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcHJlY2V1X3BoX3FibGEiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW2xsdm1fdjRpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19wcmVjZXVfcGhfcWJyYTogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcHJlY2V1X3BoX3FicmEiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW2xsdm1fdjRpOF90eV0sIFtJbnRyTm9NZW1dPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNoaWZ0CisKK2RlZiBpbnRfbWlwc19zaGxsX3FiOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zaGxsX3FiIj4sCisgIEludHJpbnNpYzxbbGx2bV92NGk4X3R5XSwgW2xsdm1fdjRpOF90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X21pcHNfc2hybF9xYjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc2hybF9xYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpOF90eV0sIFtsbHZtX3Y0aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NobGxfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3NobGxfcGgiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW21pcHNfdjJxMTVfdHksIGxsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9taXBzX3NobGxfc19waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc2hsbF9zX3BoIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFttaXBzX3YycTE1X3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19zaHJhX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zaHJhX3BoIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFttaXBzX3YycTE1X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zaHJhX3JfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3NocmFfcl9waCI+LAorICBJbnRyaW5zaWM8W21pcHNfdjJxMTVfdHldLCBbbWlwc192MnExNV90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2hsbF9zX3c6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3NobGxfc193Ij4sCisgIEludHJpbnNpYzxbbWlwc19xMzFfdHldLCBbbWlwc19xMzFfdHksIGxsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9taXBzX3NocmFfcl93OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zaHJhX3JfdyI+LAorICBJbnRyaW5zaWM8W21pcHNfcTMxX3R5XSwgW21pcHNfcTMxX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zaGlsbzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc2hpbG8iPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNdWx0aXBsaWNhdGlvbgorCitkZWYgaW50X21pcHNfbXVsZXVfc19waF9xYmw6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX211bGV1X3NfcGhfcWJsIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFtsbHZtX3Y0aThfdHksIG1pcHNfdjJxMTVfdHldLCBbXT47CitkZWYgaW50X21pcHNfbXVsZXVfc19waF9xYnI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX211bGV1X3NfcGhfcWJyIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFtsbHZtX3Y0aThfdHksIG1pcHNfdjJxMTVfdHldLCBbXT47CitkZWYgaW50X21pcHNfbXVscV9yc19waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbXVscV9yc19waCI+LAorICBJbnRyaW5zaWM8W21pcHNfdjJxMTVfdHldLCBbbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sIFtDb21tdXRhdGl2ZV0+OworZGVmIGludF9taXBzX211bGVxX3Nfd19waGw6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX211bGVxX3Nfd19waGwiPiwKKyAgSW50cmluc2ljPFttaXBzX3EzMV90eV0sIFttaXBzX3YycTE1X3R5LCBtaXBzX3YycTE1X3R5XSwgW0NvbW11dGF0aXZlXT47CitkZWYgaW50X21pcHNfbXVsZXFfc193X3BocjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbXVsZXFfc193X3BociI+LAorICBJbnRyaW5zaWM8W21pcHNfcTMxX3R5XSwgW21pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbQ29tbXV0YXRpdmVdPjsKK2RlZiBpbnRfbWlwc19tdWxzYXFfc193X3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19tdWxzYXFfc193X3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIG1pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbXT47CitkZWYgaW50X21pcHNfbWFxX3Nfd19waGw6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX21hcV9zX3dfcGhsIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIG1pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbXT47CitkZWYgaW50X21pcHNfbWFxX3Nfd19waHI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX21hcV9zX3dfcGhyIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIG1pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbXT47CitkZWYgaW50X21pcHNfbWFxX3NhX3dfcGhsOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19tYXFfc2Ffd19waGwiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19tYXFfc2Ffd19waHI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX21hcV9zYV93X3BociI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBtaXBzX3YycTE1X3R5LCBtaXBzX3YycTE1X3R5XSwgW10+OworZGVmIGludF9taXBzX211bHQ6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX211bHQiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKK2RlZiBpbnRfbWlwc19tdWx0dTogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbXVsdHUiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIERvdCBwcm9kdWN0IHdpdGggYWNjdW11bGF0ZS9zdWJ0cmFjdAorCitkZWYgaW50X21pcHNfZHBhdV9oX3FibDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZHBhdV9oX3FibCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX3Y0aThfdHksIGxsdm1fdjRpOF90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZHBhdV9oX3FicjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZHBhdV9oX3FiciI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX3Y0aThfdHksIGxsdm1fdjRpOF90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZHBzdV9oX3FibDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZHBzdV9oX3FibCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX3Y0aThfdHksIGxsdm1fdjRpOF90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZHBzdV9oX3FicjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZHBzdV9oX3FiciI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX3Y0aThfdHksIGxsdm1fdjRpOF90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZHBhcV9zX3dfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2RwYXFfc193X3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIG1pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbXT47CitkZWYgaW50X21pcHNfZHBzcV9zX3dfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2Rwc3Ffc193X3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIG1pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbXT47CitkZWYgaW50X21pcHNfZHBhcV9zYV9sX3c6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2RwYXFfc2FfbF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIG1pcHNfcTMxX3R5LCBtaXBzX3EzMV90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19kcHNxX3NhX2xfdzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZHBzcV9zYV9sX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbWlwc19xMzFfdHksIG1pcHNfcTMxX3R5XSwgW10+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ29tcGFyaXNvbgorCitkZWYgaW50X21pcHNfY21wdV9lcV9xYjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfY21wdV9lcV9xYiI+LAorICBJbnRyaW5zaWM8W10sIFtsbHZtX3Y0aThfdHksIGxsdm1fdjRpOF90eV0sIFtDb21tdXRhdGl2ZV0+OworZGVmIGludF9taXBzX2NtcHVfbHRfcWI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2NtcHVfbHRfcWIiPiwKKyAgSW50cmluc2ljPFtdLCBbbGx2bV92NGk4X3R5LCBsbHZtX3Y0aThfdHldLCBbXT47CitkZWYgaW50X21pcHNfY21wdV9sZV9xYjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfY21wdV9sZV9xYiI+LAorICBJbnRyaW5zaWM8W10sIFtsbHZtX3Y0aThfdHksIGxsdm1fdjRpOF90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19jbXBndV9lcV9xYjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfY21wZ3VfZXFfcWIiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0aThfdHksIGxsdm1fdjRpOF90eV0sIFtDb21tdXRhdGl2ZV0+OworZGVmIGludF9taXBzX2NtcGd1X2x0X3FiOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19jbXBndV9sdF9xYiI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwgW10+OworZGVmIGludF9taXBzX2NtcGd1X2xlX3FiOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19jbXBndV9sZV9xYiI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwgW10+OworZGVmIGludF9taXBzX2NtcF9lcV9waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfY21wX2VxX3BoIj4sCisgIEludHJpbnNpYzxbXSwgW21pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbQ29tbXV0YXRpdmVdPjsKK2RlZiBpbnRfbWlwc19jbXBfbHRfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2NtcF9sdF9waCI+LAorICBJbnRyaW5zaWM8W10sIFttaXBzX3YycTE1X3R5LCBtaXBzX3YycTE1X3R5XSwgW10+OworZGVmIGludF9taXBzX2NtcF9sZV9waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfY21wX2xlX3BoIj4sCisgIEludHJpbnNpYzxbXSwgW21pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBFeHRyYWN0aW5nCisKK2RlZiBpbnRfbWlwc19leHRyX3NfaDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZXh0cl9zX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X21pcHNfZXh0cl93OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19leHRyX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X21pcHNfZXh0cl9yc193OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19leHRyX3JzX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X21pcHNfZXh0cl9yX3c6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2V4dHJfcl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9taXBzX2V4dHA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2V4dHAiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X21pcHNfZXh0cGRwOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19leHRwZHAiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNaXNjCisKK2RlZiBpbnRfbWlwc193cmRzcDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfd3Jkc3AiPiwKKyAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9taXBzX3JkZHNwOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19yZGRzcCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJSZWFkTWVtXT47CisKK2RlZiBpbnRfbWlwc19pbnN2OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19pbnN2Ij4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJSZWFkTWVtXT47CitkZWYgaW50X21pcHNfYml0cmV2OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19iaXRyZXYiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3BhY2tybF9waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcGFja3JsX3BoIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFttaXBzX3YycTE1X3R5LCBtaXBzX3YycTE1X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfcmVwbF9xYjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcmVwbF9xYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpOF90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19yZXBsX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19yZXBsX3BoIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3BpY2tfcWI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3BpY2tfcWIiPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aThfdHldLCBbbGx2bV92NGk4X3R5LCBsbHZtX3Y0aThfdHldLCBbSW50clJlYWRNZW1dPjsKK2RlZiBpbnRfbWlwc19waWNrX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19waWNrX3BoIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFttaXBzX3YycTE1X3R5LCBtaXBzX3YycTE1X3R5XSwgW0ludHJSZWFkTWVtXT47CisKK2RlZiBpbnRfbWlwc19tdGhsaXA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX210aGxpcCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKworZGVmIGludF9taXBzX2Jwb3NnZTMyOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19icG9zZ2UzMiI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyUmVhZE1lbV0+OworCitkZWYgaW50X21pcHNfbGJ1eDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbGJ1eCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfbWlwc19saHg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2xoeCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfbWlwc19sd3g6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2x3eCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1JUFMgRFNQIFJldiAyCisKK2RlZiBpbnRfbWlwc19hYnNxX3NfcWI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2Fic3Ffc19xYiI+LAorICBJbnRyaW5zaWM8W21pcHNfdjRxN190eV0sIFttaXBzX3Y0cTdfdHldLCBbXT47CisKK2RlZiBpbnRfbWlwc19hZGRxaF9waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfYWRkcWhfcGgiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW21pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKK2RlZiBpbnRfbWlwc19hZGRxaF9yX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19hZGRxaF9yX3BoIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFttaXBzX3YycTE1X3R5LCBtaXBzX3YycTE1X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CitkZWYgaW50X21pcHNfYWRkcWhfdzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfYWRkcWhfdyI+LAorICBJbnRyaW5zaWM8W21pcHNfcTMxX3R5XSwgW21pcHNfcTMxX3R5LCBtaXBzX3EzMV90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworZGVmIGludF9taXBzX2FkZHFoX3JfdzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfYWRkcWhfcl93Ij4sCisgIEludHJpbnNpYzxbbWlwc19xMzFfdHldLCBbbWlwc19xMzFfdHksIG1pcHNfcTMxX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisKK2RlZiBpbnRfbWlwc19hZGR1X3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19hZGR1X3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmkxNl90eV0sIFtsbHZtX3YyaTE2X3R5LCBsbHZtX3YyaTE2X3R5XSwgW0NvbW11dGF0aXZlXT47CitkZWYgaW50X21pcHNfYWRkdV9zX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19hZGR1X3NfcGgiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTE2X3R5XSwgW2xsdm1fdjJpMTZfdHksIGxsdm1fdjJpMTZfdHldLCBbQ29tbXV0YXRpdmVdPjsKKworZGVmIGludF9taXBzX2FkZHVoX3FiOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19hZGR1aF9xYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpOF90eV0sIFtsbHZtX3Y0aThfdHksIGxsdm1fdjRpOF90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworZGVmIGludF9taXBzX2FkZHVoX3JfcWI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2FkZHVoX3JfcWIiPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aThfdHldLCBbbGx2bV92NGk4X3R5LCBsbHZtX3Y0aThfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworZGVmIGludF9taXBzX2FwcGVuZDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfYXBwZW5kIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19iYWxpZ246IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2JhbGlnbiI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19jbXBnZHVfZXFfcWI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2NtcGdkdV9lcV9xYiI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwgW0NvbW11dGF0aXZlXT47CitkZWYgaW50X21pcHNfY21wZ2R1X2x0X3FiOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19jbXBnZHVfbHRfcWIiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0aThfdHksIGxsdm1fdjRpOF90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19jbXBnZHVfbGVfcWI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2NtcGdkdV9sZV9xYiI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwgW10+OworCitkZWYgaW50X21pcHNfZHBhX3dfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2RwYV93X3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1fdjJpMTZfdHksIGxsdm1fdjJpMTZfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Rwc193X3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19kcHNfd19waCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX3YyaTE2X3R5LCBsbHZtX3YyaTE2X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2RwYXF4X3Nfd19waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZHBhcXhfc193X3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIG1pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbXT47CitkZWYgaW50X21pcHNfZHBhcXhfc2Ffd19waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZHBhcXhfc2Ffd19waCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBtaXBzX3YycTE1X3R5LCBtaXBzX3YycTE1X3R5XSwgW10+OworZGVmIGludF9taXBzX2RwYXhfd19waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZHBheF93X3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1fdjJpMTZfdHksIGxsdm1fdjJpMTZfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Rwc3hfd19waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZHBzeF93X3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1fdjJpMTZfdHksIGxsdm1fdjJpMTZfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Rwc3F4X3Nfd19waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZHBzcXhfc193X3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIG1pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbXT47CitkZWYgaW50X21pcHNfZHBzcXhfc2Ffd19waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZHBzcXhfc2Ffd19waCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBtaXBzX3YycTE1X3R5LCBtaXBzX3YycTE1X3R5XSwgW10+OworCitkZWYgaW50X21pcHNfbXVsX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19tdWxfcGgiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTE2X3R5XSwgW2xsdm1fdjJpMTZfdHksIGxsdm1fdjJpMTZfdHldLCBbQ29tbXV0YXRpdmVdPjsKK2RlZiBpbnRfbWlwc19tdWxfc19waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbXVsX3NfcGgiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTE2X3R5XSwgW2xsdm1fdjJpMTZfdHksIGxsdm1fdjJpMTZfdHldLCBbQ29tbXV0YXRpdmVdPjsKKworZGVmIGludF9taXBzX211bHFfcnNfdzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbXVscV9yc193Ij4sCisgIEludHJpbnNpYzxbbWlwc19xMzFfdHldLCBbbWlwc19xMzFfdHksIG1pcHNfcTMxX3R5XSwgW0NvbW11dGF0aXZlXT47CitkZWYgaW50X21pcHNfbXVscV9zX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19tdWxxX3NfcGgiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW21pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbQ29tbXV0YXRpdmVdPjsKK2RlZiBpbnRfbWlwc19tdWxxX3NfdzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbXVscV9zX3ciPiwKKyAgSW50cmluc2ljPFttaXBzX3EzMV90eV0sIFttaXBzX3EzMV90eSwgbWlwc19xMzFfdHldLCBbQ29tbXV0YXRpdmVdPjsKK2RlZiBpbnRfbWlwc19tdWxzYV93X3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19tdWxzYV93X3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1fdjJpMTZfdHksIGxsdm1fdjJpMTZfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfcHJlY3JfcWJfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3ByZWNyX3FiX3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV92NGk4X3R5XSwgW2xsdm1fdjJpMTZfdHksIGxsdm1fdjJpMTZfdHldLCBbXT47CitkZWYgaW50X21pcHNfcHJlY3Jfc3JhX3BoX3c6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3ByZWNyX3NyYV9waF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92MmkxNl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19wcmVjcl9zcmFfcl9waF93OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19wcmVjcl9zcmFfcl9waF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92MmkxNl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3ByZXBlbmQ6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3ByZXBlbmQiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc2hyYV9xYjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc2hyYV9xYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpOF90eV0sIFtsbHZtX3Y0aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NocmFfcl9xYjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc2hyYV9yX3FiIj4sCisgIEludHJpbnNpYzxbbGx2bV92NGk4X3R5XSwgW2xsdm1fdjRpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2hybF9waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc2hybF9waCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpMTZfdHldLCBbbGx2bV92MmkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zdWJxaF9waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc3VicWhfcGgiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW21pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3VicWhfcl9waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc3VicWhfcl9waCI+LAorICBJbnRyaW5zaWM8W21pcHNfdjJxMTVfdHldLCBbbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zdWJxaF93OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zdWJxaF93Ij4sCisgIEludHJpbnNpYzxbbWlwc19xMzFfdHldLCBbbWlwc19xMzFfdHksIG1pcHNfcTMxX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnFoX3JfdzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc3VicWhfcl93Ij4sCisgIEludHJpbnNpYzxbbWlwc19xMzFfdHldLCBbbWlwc19xMzFfdHksIG1pcHNfcTMxX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc3VidV9waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc3VidV9waCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpMTZfdHldLCBbbGx2bV92MmkxNl90eSwgbGx2bV92MmkxNl90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19zdWJ1X3NfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3N1YnVfc19waCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpMTZfdHldLCBbbGx2bV92MmkxNl90eSwgbGx2bV92MmkxNl90eV0sIFtdPjsKKworZGVmIGludF9taXBzX3N1YnVoX3FiOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zdWJ1aF9xYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpOF90eV0sIFtsbHZtX3Y0aThfdHksIGxsdm1fdjRpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zdWJ1aF9yX3FiOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zdWJ1aF9yX3FiIj4sCisgIEludHJpbnNpYzxbbGx2bV92NGk4X3R5XSwgW2xsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwgW0ludHJOb01lbV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTUlQUyBNU0EKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFkZGl0aW9uL3N1YnRyYWN0aW9uCisKK2RlZiBpbnRfbWlwc19hZGRfYV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hZGRfYV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hZGRfYV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hZGRfYV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hZGRfYV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hZGRfYV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hZGRfYV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hZGRfYV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2FkZHNfYV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hZGRzX2FfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYWRkc19hX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FkZHNfYV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hZGRzX2FfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYWRkc19hX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2FkZHNfYV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hZGRzX2FfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19hZGRzX3NfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYWRkc19zX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2FkZHNfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hZGRzX3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYWRkc19zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FkZHNfc193Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hZGRzX3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYWRkc19zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYWRkc191X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FkZHNfdV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hZGRzX3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYWRkc191X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2FkZHNfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hZGRzX3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYWRkc191X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FkZHNfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2FkZHZfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYWRkdl9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hZGR2X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FkZHZfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYWRkdl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hZGR2X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2FkZHZfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYWRkdl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2FkZHZpX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FkZHZpX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hZGR2aV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hZGR2aV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYWRkdmlfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYWRkdmlfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2FkZHZpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FkZHZpX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2FuZF92IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hbmRfdiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2FuZGlfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYW5kaV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2FzdWJfc19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hc3ViX3NfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hc3ViX3NfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXN1Yl9zX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYXN1Yl9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FzdWJfc193Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2FzdWJfc19kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hc3ViX3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2FzdWJfdV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hc3ViX3VfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hc3ViX3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXN1Yl91X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYXN1Yl91X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FzdWJfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2FzdWJfdV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hc3ViX3VfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2F2ZV9zX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2F2ZV9zX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2F2ZV9zX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2F2ZV9zX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2F2ZV9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2F2ZV9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2F2ZV9zX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2F2ZV9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYXZlX3VfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXZlX3VfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYXZlX3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXZlX3VfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYXZlX3VfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXZlX3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYXZlX3VfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXZlX3VfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19hdmVyX3NfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXZlcl9zX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2F2ZXJfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hdmVyX3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYXZlcl9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2F2ZXJfc193Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hdmVyX3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXZlcl9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYXZlcl91X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2F2ZXJfdV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hdmVyX3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXZlcl91X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2F2ZXJfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hdmVyX3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYXZlcl91X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2F2ZXJfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2JjbHJfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYmNscl9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JjbHJfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYmNscl9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JjbHJfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYmNscl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JjbHJfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYmNscl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYmNscmlfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYmNscmlfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYmNscmlfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYmNscmlfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYmNscmlfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYmNscmlfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYmNscmlfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYmNscmlfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19iaW5zbF9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iaW5zbF9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19iaW5zbF9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iaW5zbF9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19iaW5zbF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iaW5zbF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19iaW5zbF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iaW5zbF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2JpbnNsaV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iaW5zbGlfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JpbnNsaV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iaW5zbGlfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JpbnNsaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iaW5zbGlfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JpbnNsaV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iaW5zbGlfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYmluc3JfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYmluc3JfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYmluc3JfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYmluc3JfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYmluc3JfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYmluc3JfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYmluc3JfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYmluc3JfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19iaW5zcmlfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYmluc3JpX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19iaW5zcmlfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYmluc3JpX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19iaW5zcmlfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYmluc3JpX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19iaW5zcmlfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYmluc3JpX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2JtbnpfdiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYm1uel92Ij4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2JtbnppX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JtbnppX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2Jtel92IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ibXpfdiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19ibXppX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JtemlfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYm5lZ19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ibmVnX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYm5lZ19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ibmVnX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYm5lZ193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ibmVnX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYm5lZ19kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ibmVnX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19ibmVnaV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ibmVnaV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ibmVnaV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ibmVnaV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ibmVnaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ibmVnaV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ibmVnaV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ibmVnaV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2Juel9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ibnpfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYm56X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Juel9oIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ibnpfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYm56X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Juel9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ibnpfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19ibnpfdiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYm56X3YiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYnNlbF92IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ic2VsX3YiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYnNlbGlfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYnNlbGlfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYnNldF9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ic2V0X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYnNldF9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ic2V0X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYnNldF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ic2V0X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYnNldF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ic2V0X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19ic2V0aV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ic2V0aV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ic2V0aV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ic2V0aV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ic2V0aV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ic2V0aV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ic2V0aV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ic2V0aV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2J6X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2J6X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2J6X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2J6X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2J6X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2J6X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2J6X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2J6X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYnpfdiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYnpfdiI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19jZXFfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2VxX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2VxX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NlcV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NlcV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jZXFfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jZXFfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2VxX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19jZXFpX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NlcWlfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2VxaV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jZXFpX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NlcWlfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2VxaV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jZXFpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NlcWlfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19jZmNtc2EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NmY21zYSI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5XSwgW10+OworCitkZWYgaW50X21pcHNfY2xlX3NfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2xlX3NfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jbGVfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbGVfc19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NsZV9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsZV9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2xlX3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2xlX3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2NsZV91X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsZV91X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2xlX3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2xlX3VfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jbGVfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbGVfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NsZV91X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsZV91X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19jbGVpX3NfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2xlaV9zX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NsZWlfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbGVpX3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2xlaV9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsZWlfc193Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jbGVpX3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2xlaV9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfY2xlaV91X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsZWlfdV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jbGVpX3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2xlaV91X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NsZWlfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbGVpX3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2xlaV91X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsZWlfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2NsdF9zX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsdF9zX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2x0X3NfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2x0X3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jbHRfc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbHRfc193Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NsdF9zX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsdF9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19jbHRfdV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbHRfdV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NsdF91X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsdF91X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2x0X3VfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2x0X3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jbHRfdV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbHRfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfY2x0aV9zX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsdGlfc19iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jbHRpX3NfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2x0aV9zX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NsdGlfc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbHRpX3NfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2x0aV9zX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsdGlfc19kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2NsdGlfdV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbHRpX3VfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2x0aV91X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsdGlfdV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jbHRpX3VfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2x0aV91X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NsdGlfdV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbHRpX3VfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19jb3B5X3NfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY29weV9zX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jb3B5X3NfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY29weV9zX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jb3B5X3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY29weV9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jb3B5X3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY29weV9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2NvcHlfdV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jb3B5X3VfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NvcHlfdV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jb3B5X3VfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NvcHlfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jb3B5X3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NvcHlfdV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jb3B5X3VfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfY3RjbXNhIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jdGNtc2EiPiwKKyAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworCitkZWYgaW50X21pcHNfZGl2X3NfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZGl2X3NfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19kaXZfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9kaXZfc19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Rpdl9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Rpdl9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZGl2X3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZGl2X3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2Rpdl91X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Rpdl91X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZGl2X3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZGl2X3VfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19kaXZfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9kaXZfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Rpdl91X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Rpdl91X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKKy8vIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgcGFydCBvZiB0aGUgTVNBIHNwZWMgYnV0IGl0IGRvZXMgbm90IHNoYXJlIHRoZQorLy8gX19idWlsdGluX21zYSBwcmVmaXggYmVjYXVzZSBpdCBvcGVyYXRlcyBvbiBHUCByZWdpc3RlcnMuCitkZWYgaW50X21pcHNfZGxzYSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2Rsc2EiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2RvdHBfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9kb3RwX3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19kb3RwX3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZG90cF9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZG90cF9zX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2RvdHBfc19kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZG90cF91X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2RvdHBfdV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2RvdHBfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9kb3RwX3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19kb3RwX3VfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZG90cF91X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19kcGFkZF9zX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2RwYWRkX3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19kcGFkZF9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2RwYWRkX3NfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19kcGFkZF9zX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2RwYWRkX3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2RwYWRkX3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZHBhZGRfdV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2RwYWRkX3VfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZHBhZGRfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2RwYWRkX3VfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZHBhZGRfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZHBzdWJfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9kcHN1Yl9zX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZHBzdWJfc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9kcHN1Yl9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZHBzdWJfc19kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9kcHN1Yl9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19kcHN1Yl91X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Rwc3ViX3VfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19kcHN1Yl91X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Rwc3ViX3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19kcHN1Yl91X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Rwc3ViX3VfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZhZGRfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmFkZF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZhZGRfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmFkZF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZmNhZl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mY2FmX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmNhZl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mY2FmX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mY2VxX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZjZXFfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mY2VxX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZjZXFfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZjbGVfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmNsZV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZjbGVfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmNsZV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZmNsdF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mY2x0X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmNsdF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mY2x0X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mY2xhc3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmNsYXNzX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmNsYXNzX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZjbGFzc19kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZmNuZV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mY25lX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmNuZV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mY25lX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mY29yX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Zjb3JfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mY29yX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Zjb3JfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZjdWVxX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZjdWVxX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmN1ZXFfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmN1ZXFfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZjdWxlX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZjdWxlX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmN1bGVfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmN1bGVfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZjdWx0X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZjdWx0X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmN1bHRfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmN1bHRfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZjdW5fdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmN1bl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZjdW5fZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmN1bl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZmN1bmVfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmN1bmVfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mY3VuZV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mY3VuZV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZmRpdl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mZGl2X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmRpdl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mZGl2X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mZXhkb19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mZXhkb19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGYxNl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZleGRvX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZleGRvX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mZXhwMl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mZXhwMl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZleHAyX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZleHAyX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mZXh1cGxfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmV4dXBsX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjhmMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmV4dXBsX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZleHVwbF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZmV4dXByX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZleHVwcl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y4ZjE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZleHVwcl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mZXh1cHJfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZmaW50X3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmZpbnRfc193Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZmaW50X3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmZpbnRfc19kIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZmZpbnRfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mZmludF91X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmZpbnRfdV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mZmludF91X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mZnFsX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZmcWxfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mZnFsX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZmcWxfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZmcXJfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmZxcl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZmcXJfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmZxcl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZmlsbF9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9maWxsX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZpbGxfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmlsbF9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19maWxsX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZpbGxfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmlsbF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9maWxsX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZmxvZzJfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmxvZzJfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mbG9nMl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mbG9nMl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZm1hZGRfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZm1hZGRfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZm1hZGRfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZm1hZGRfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mbWF4X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZtYXhfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mbWF4X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZtYXhfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZtYXhfYV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mbWF4X2FfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mbWF4X2FfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZm1heF9hX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mbWluX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZtaW5fdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mbWluX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZtaW5fZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZtaW5fYV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mbWluX2FfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mbWluX2FfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZm1pbl9hX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mbXN1Yl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mbXN1Yl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mbXN1Yl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mbXN1Yl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZtdWxfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZm11bF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZtdWxfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZm11bF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZnJpbnRfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnJpbnRfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mcmludF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mcmludF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZnJjcF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mcmNwX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZnJjcF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mcmNwX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mcnNxcnRfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnJzcXJ0X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZnJzcXJ0X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Zyc3FydF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZnNhZl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mc2FmX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZnNhZl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mc2FmX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mc2VxX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzZXFfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mc2VxX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzZXFfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZzbGVfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnNsZV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZzbGVfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnNsZV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZnNsdF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mc2x0X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZnNsdF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mc2x0X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mc25lX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzbmVfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mc25lX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzbmVfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2Zzb3JfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnNvcl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Zzb3JfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnNvcl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZnNxcnRfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnNxcnRfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mc3FydF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mc3FydF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZnN1Yl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mc3ViX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZnN1Yl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mc3ViX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mc3VlcV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mc3VlcV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZzdWVxX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzdWVxX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mc3VsZV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mc3VsZV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZzdWxlX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzdWxlX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mc3VsdF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mc3VsdF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZzdWx0X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzdWx0X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mc3VuX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzdW5fdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mc3VuX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzdW5fZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZzdW5lX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzdW5lX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZnN1bmVfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnN1bmVfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2Z0aW50X3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnRpbnRfc193Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Z0aW50X3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnRpbnRfc19kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZnRpbnRfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mdGludF91X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZnRpbnRfdV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mdGludF91X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mdHFfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnRxX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZnRxX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Z0cV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZnRydW5jX3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnRydW5jX3NfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mdHJ1bmNfc19kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mdHJ1bmNfc19kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZnRydW5jX3VfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnRydW5jX3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mdHJ1bmNfdV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mdHJ1bmNfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfaGFkZF9zX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2hhZGRfc19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2hhZGRfc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9oYWRkX3NfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19oYWRkX3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaGFkZF9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19oYWRkX3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaGFkZF91X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfaGFkZF91X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2hhZGRfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2hhZGRfdV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9oYWRkX3VfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2hzdWJfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9oc3ViX3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19oc3ViX3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaHN1Yl9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfaHN1Yl9zX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2hzdWJfc19kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfaHN1Yl91X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2hzdWJfdV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2hzdWJfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9oc3ViX3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19oc3ViX3VfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaHN1Yl91X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19pbHZldl9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbHZldl9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2lsdmV2X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2lsdmV2X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfaWx2ZXZfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaWx2ZXZfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19pbHZldl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbHZldl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfaWx2bF9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbHZsX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfaWx2bF9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbHZsX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfaWx2bF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbHZsX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfaWx2bF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbHZsX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19pbHZvZF9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbHZvZF9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2lsdm9kX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2lsdm9kX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfaWx2b2RfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaWx2b2RfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19pbHZvZF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbHZvZF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfaWx2cl9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbHZyX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfaWx2cl9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbHZyX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfaWx2cl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbHZyX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfaWx2cl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbHZyX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19pbnNlcnRfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaW5zZXJ0X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19pbnNlcnRfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaW5zZXJ0X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19pbnNlcnRfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaW5zZXJ0X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19pbnNlcnRfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaW5zZXJ0X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sCisgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2luc3ZlX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2luc3ZlX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfaW5zdmVfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaW5zdmVfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19pbnN2ZV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbnN2ZV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2luc3ZlX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2luc3ZlX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19sZF9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9sZF9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldLAorICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CitkZWYgaW50X21pcHNfbGRfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbGRfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9taXBzX2xkX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2xkX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfbWlwc19sZF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9sZF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldLAorICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKK2RlZiBpbnRfbWlwc19sZGlfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbGRpX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2xkaV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9sZGlfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbGRpX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2xkaV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19sZGlfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbGRpX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisvLyBUaGlzIGluc3RydWN0aW9uIGlzIHBhcnQgb2YgdGhlIE1TQSBzcGVjIGJ1dCBpdCBkb2VzIG5vdCBzaGFyZSB0aGUKKy8vIF9fYnVpbHRpbl9tc2EgcHJlZml4IGJlY2F1c2UgaXQgb3BlcmF0ZXMgb24gdGhlIEdQUiByZWdpc3RlcnMuCitkZWYgaW50X21pcHNfbHNhIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbHNhIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19tYWRkX3FfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWFkZF9xX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWFkZF9xX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21hZGRfcV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbWFkZHJfcV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYWRkcl9xX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWFkZHJfcV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYWRkcl9xX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19tYWRkdl9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYWRkdl9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21hZGR2X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21hZGR2X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWFkZHZfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWFkZHZfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tYWRkdl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYWRkdl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbWF4X2FfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWF4X2FfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tYXhfYV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYXhfYV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21heF9hX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21heF9hX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWF4X2FfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWF4X2FfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX21heF9zX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21heF9zX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWF4X3NfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWF4X3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tYXhfc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYXhfc193Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21heF9zX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21heF9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19tYXhfdV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYXhfdV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21heF91X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21heF91X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWF4X3VfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWF4X3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tYXhfdV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYXhfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbWF4aV9zX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21heGlfc19iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tYXhpX3NfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWF4aV9zX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21heGlfc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYXhpX3NfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWF4aV9zX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21heGlfc19kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX21heGlfdV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYXhpX3VfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWF4aV91X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21heGlfdV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tYXhpX3VfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWF4aV91X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21heGlfdV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYXhpX3VfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19taW5fYV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9taW5fYV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21pbl9hX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21pbl9hX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWluX2FfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWluX2FfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19taW5fYV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9taW5fYV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbWluX3NfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWluX3NfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19taW5fc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9taW5fc19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21pbl9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21pbl9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWluX3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWluX3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX21pbl91X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21pbl91X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWluX3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWluX3VfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19taW5fdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9taW5fdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21pbl91X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21pbl91X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19taW5pX3NfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWluaV9zX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21pbmlfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9taW5pX3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWluaV9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21pbmlfc193Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19taW5pX3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWluaV9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbWluaV91X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21pbmlfdV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19taW5pX3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWluaV91X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21pbmlfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9taW5pX3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWluaV91X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21pbmlfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX21vZF9zX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21vZF9zX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbW9kX3NfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbW9kX3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tb2Rfc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tb2Rfc193Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21vZF9zX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21vZF9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19tb2RfdV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tb2RfdV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21vZF91X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21vZF91X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbW9kX3VfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbW9kX3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tb2RfdV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tb2RfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbW92ZV92IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tb3ZlX3YiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19tc3ViX3FfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbXN1Yl9xX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbXN1Yl9xX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21zdWJfcV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbXN1YnJfcV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tc3Vicl9xX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbXN1YnJfcV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tc3Vicl9xX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19tc3Vidl9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tc3Vidl9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21zdWJ2X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21zdWJ2X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbXN1YnZfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbXN1YnZfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tc3Vidl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tc3Vidl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbXVsX3FfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbXVsX3FfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tdWxfcV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tdWxfcV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbXVscl9xX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX211bHJfcV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX211bHJfcV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tdWxyX3FfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX211bHZfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbXVsdl9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX211bHZfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbXVsdl9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX211bHZfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbXVsdl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX211bHZfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbXVsdl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbmxvY19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ubG9jX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbmxvY19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ubG9jX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbmxvY193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ubG9jX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbmxvY19kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ubG9jX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19ubHpjX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX25semNfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ubHpjX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX25semNfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ubHpjX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX25semNfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ubHpjX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX25semNfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX25vcl92IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ub3JfdiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX25vcmlfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffbm9yaV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX29yX3YgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX29yX3YiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19vcmlfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffb3JpX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfcGNrZXZfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfcGNrZXZfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19wY2tldl9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9wY2tldl9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3Bja2V2X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3Bja2V2X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfcGNrZXZfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfcGNrZXZfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3Bja29kX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3Bja29kX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfcGNrb2RfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfcGNrb2RfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19wY2tvZF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9wY2tvZF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3Bja29kX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3Bja29kX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19wY250X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3BjbnRfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19wY250X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3BjbnRfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19wY250X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3BjbnRfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19wY250X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3BjbnRfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3NhdF9zX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NhdF9zX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NhdF9zX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NhdF9zX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NhdF9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NhdF9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NhdF9zX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NhdF9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc2F0X3VfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2F0X3VfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2F0X3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2F0X3VfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2F0X3VfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2F0X3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2F0X3VfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2F0X3VfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zaGZfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2hmX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NoZl9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zaGZfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2hmX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NoZl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3NsZF9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zbGRfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2xkX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NsZF9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zbGRfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2xkX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NsZF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zbGRfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zbGRpX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NsZGlfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NsZGlfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2xkaV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2xkaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zbGRpX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zbGRpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NsZGlfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc2xsX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NsbF9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NsbF9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zbGxfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zbGxfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2xsX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2xsX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NsbF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc2xsaV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zbGxpX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NsbGlfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2xsaV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zbGxpX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NsbGlfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2xsaV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zbGxpX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc3BsYXRfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3BsYXRfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3BsYXRfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3BsYXRfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3BsYXRfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3BsYXRfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3BsYXRfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3BsYXRfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zcGxhdGlfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3BsYXRpX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NwbGF0aV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcGxhdGlfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3BsYXRpX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NwbGF0aV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcGxhdGlfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3BsYXRpX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc3JhX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NyYV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NyYV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmFfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcmFfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3JhX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3JhX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NyYV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc3JhaV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmFpX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NyYWlfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3JhaV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcmFpX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NyYWlfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3JhaV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmFpX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc3Jhcl9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmFyX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3Jhcl9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmFyX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3Jhcl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmFyX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3Jhcl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmFyX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zcmFyaV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmFyaV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcmFyaV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmFyaV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcmFyaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmFyaV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcmFyaV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmFyaV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3NybF9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmxfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcmxfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3JsX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3JsX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NybF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NybF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmxfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3NybGlfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3JsaV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcmxpX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NybGlfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3JsaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmxpX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NybGlfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3JsaV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3NybHJfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Jscl9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NybHJfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Jscl9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NybHJfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Jscl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NybHJfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Jscl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc3JscmlfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3JscmlfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3JscmlfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3JscmlfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3JscmlfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3JscmlfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3JscmlfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3JscmlfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zdF9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zdF9iIj4sCisgIEludHJpbnNpYzxbXSwgW2xsdm1fdjE2aThfdHksIGxsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9taXBzX3N0X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N0X2giPiwKKyAgSW50cmluc2ljPFtdLCBbbGx2bV92OGkxNl90eSwgbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJBcmdNZW1Pbmx5XT47CitkZWYgaW50X21pcHNfc3RfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3RfdyI+LAorICBJbnRyaW5zaWM8W10sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldLAorICBbSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfbWlwc19zdF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zdF9kIj4sCisgIEludHJpbnNpYzxbXSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyQXJnTWVtT25seV0+OworCitkZWYgaW50X21pcHNfc3Vic19zX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnNfc19iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnNfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zdWJzX3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zdWJzX3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Vic19zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3Vic19zX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnNfc19kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc3Vic191X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnNfdV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnNfdV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zdWJzX3VfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zdWJzX3VfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Vic191X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3Vic191X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnNfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc3Vic3VzX3VfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Vic3VzX3VfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zdWJzdXNfdV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zdWJzdXNfdV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnN1c191X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnN1c191X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3Vic3VzX3VfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Vic3VzX3VfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3N1YnN1dV9zX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnN1dV9zX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3Vic3V1X3NfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Vic3V1X3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zdWJzdXVfc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zdWJzdXVfc193Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnN1dV9zX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnN1dV9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zdWJ2X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnZfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zdWJ2X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnZfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zdWJ2X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnZfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zdWJ2X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnZfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3N1YnZpX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnZpX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnZpX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnZpX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnZpX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnZpX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnZpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnZpX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfdnNoZl9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV92c2hmX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3ZzaGZfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfdnNoZl9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc192c2hmX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3ZzaGZfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfdnNoZl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV92c2hmX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfeG9yX3YgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3hvcl92Ij4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfeG9yaV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV94b3JpX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworfQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzTlZWTS50ZCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc05WVk0udGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA5YWViZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc05WVk0udGQKQEAgLTAsMCArMSw0MDQxIEBACisvLz09PS0gSW50cmluc2ljc05WVk0udGQgLSBEZWZpbmVzIE5WVk0gaW50cmluc2ljcyAtLS0tLS0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFsbCBvZiB0aGUgTlZWTS1zcGVjaWZpYyBpbnRyaW5zaWNzIGZvciB1c2Ugd2l0aCBOVlBUWC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBUaGUgZm9sbG93aW5nIGludHJpbnNpY3Mgd2VyZSBvbmNlIGRlZmluZWQgaGVyZSwgYnV0IGFyZSBub3cgYXV0by11cGdyYWRlZAorLy8gdG8gdGFyZ2V0LWdlbmVyaWMgTExWTSBpbnRyaW5zaWNzLgorLy8KKy8vICAgKiBsbHZtLm52dm0uYnJldjMyICAtLT4gbGx2bS5iaXRyZXZlcnNlLmkzMgorLy8gICAqIGxsdm0ubnZ2bS5icmV2NjQgIC0tPiBsbHZtLmJpdHJldmVyc2UuaTY0CisvLyAgICogbGx2bS5udnZtLmNsei5pICAgLS0+IGxsdm0uY3Rsei5pMzIKKy8vICAgKiBsbHZtLm52dm0uY2x6LmxsICAtLT4gdHJ1bmMgaTY0IGxsdm0uY3Rsei5pNjQoeCkgdG8gaTMyCisvLyAgICogbGx2bS5udnZtLnBvcGMuaSAgLS0+IGxsdm0uY3Rwb3AuaTMyCisvLyAgICogbGx2bS5udnZtLnBvcGMubGwgLS0+IHRydW5jIGk2NCBsbHZtLmN0cG9wLmk2NCB0byBpMzIKKy8vICAgKiBsbHZtLm52dm0uYWJzLmkgICAtLT4gc2VsZWN0KHggPj0gLXgsIHgsIC14KQorLy8gICAqIGxsdm0ubnZ2bS5hYnMubGwgIC0tPiBpYmlkLgorLy8gICAqIGxsdm0ubnZ2bS5tYXguaSAgIC0tPiBzZWxlY3QoeCBzZ2UgeSwgeCwgeSkKKy8vICAgKiBsbHZtLm52dm0ubWF4LmxsICAtLT4gaWJpZC4KKy8vICAgKiBsbHZtLm52dm0ubWF4LnVpICAtLT4gc2VsZWN0KHggdWdlIHksIHgsIHkpCisvLyAgICogbGx2bS5udnZtLm1heC51bGwgLS0+IGliaWQuCisvLyAgICogbGx2bS5udnZtLm1heC5pICAgLS0+IHNlbGVjdCh4IHNsZSB5LCB4LCB5KQorLy8gICAqIGxsdm0ubnZ2bS5tYXgubGwgIC0tPiBpYmlkLgorLy8gICAqIGxsdm0ubnZ2bS5tYXgudWkgIC0tPiBzZWxlY3QoeCB1bGUgeSwgeCwgeSkKKy8vICAgKiBsbHZtLm52dm0ubWF4LnVsbCAtLT4gaWJpZC4KKy8vICAgKiBsbHZtLm52dm0uaDJmICAgICAtLT4gbGx2bS5jb252ZXJ0LnRvLmZwMTYuZjMyCisKK2RlZiBsbHZtX2FueWk2NHB0cl90eSAgICAgOiBMTFZNQW55UG9pbnRlclR5cGU8bGx2bV9pNjRfdHk+OyAgICAgLy8gKHNwYWNlKWk2NCoKKworLy8KKy8vIE1JU0MKKy8vCisKK2xldCBUYXJnZXRQcmVmaXggPSAibnZ2bSIgaW4geworICBkZWYgaW50X252dm1fcHJtdCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9wcm10Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisvLworLy8gTWluIE1heAorLy8KKworICBkZWYgaW50X252dm1fZm1pbl9mIDogR0NDQnVpbHRpbjwiX19udnZtX2ZtaW5fZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fZm1pbl9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mbWluX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisKKyAgZGVmIGludF9udnZtX2ZtYXhfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mbWF4X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XQorICAgICAgICAsIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9mbWF4X2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX2ZtYXhfZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworICBkZWYgaW50X252dm1fZm1pbl9kIDogR0NDQnVpbHRpbjwiX19udnZtX2ZtaW5fZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fZm1heF9kIDogR0NDQnVpbHRpbjwiX19udnZtX2ZtYXhfZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisvLworLy8gTXVsdGlwbGljYXRpb24KKy8vCisKKyAgZGVmIGludF9udnZtX211bGhpX2kgOiBHQ0NCdWlsdGluPCJfX252dm1fbXVsaGlfaSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fbXVsaGlfdWkgOiBHQ0NCdWlsdGluPCJfX252dm1fbXVsaGlfdWkiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworICBkZWYgaW50X252dm1fbXVsaGlfbGwgOiBHQ0NCdWlsdGluPCJfX252dm1fbXVsaGlfbGwiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX211bGhpX3VsbCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9tdWxoaV91bGwiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworICBkZWYgaW50X252dm1fbXVsX3JuX2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX211bF9ybl9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fbXVsX3JuX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fbXVsX3JuX2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX211bF9yel9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9tdWxfcnpfZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX211bF9yel9mIDogR0NDQnVpbHRpbjwiX19udnZtX211bF9yel9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9tdWxfcm1fZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fbXVsX3JtX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9tdWxfcm1fZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9tdWxfcm1fZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fbXVsX3JwX2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX211bF9ycF9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fbXVsX3JwX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fbXVsX3JwX2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworICBkZWYgaW50X252dm1fbXVsX3JuX2QgOiBHQ0NCdWlsdGluPCJfX252dm1fbXVsX3JuX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX211bF9yel9kIDogR0NDQnVpbHRpbjwiX19udnZtX211bF9yel9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5LCBsbHZtX2RvdWJsZV90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9tdWxfcm1fZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9tdWxfcm1fZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fbXVsX3JwX2QgOiBHQ0NCdWlsdGluPCJfX252dm1fbXVsX3JwX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworICBkZWYgaW50X252dm1fbXVsMjRfaSA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9tdWwyNF9pIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9tdWwyNF91aSA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9tdWwyNF91aSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisvLworLy8gRGl2CisvLworCisgIGRlZiBpbnRfbnZ2bV9kaXZfYXBwcm94X2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX2Rpdl9hcHByb3hfZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX2Rpdl9hcHByb3hfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kaXZfYXBwcm94X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworICBkZWYgaW50X252dm1fZGl2X3JuX2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX2Rpdl9ybl9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fZGl2X3JuX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZGl2X3JuX2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworICBkZWYgaW50X252dm1fZGl2X3J6X2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX2Rpdl9yel9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fZGl2X3J6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZGl2X3J6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworICBkZWYgaW50X252dm1fZGl2X3JtX2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX2Rpdl9ybV9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fZGl2X3JtX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZGl2X3JtX2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworICBkZWYgaW50X252dm1fZGl2X3JwX2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX2Rpdl9ycF9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fZGl2X3JwX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZGl2X3JwX2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworICBkZWYgaW50X252dm1fZGl2X3JuX2QgOiBHQ0NCdWlsdGluPCJfX252dm1fZGl2X3JuX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX2Rpdl9yel9kIDogR0NDQnVpbHRpbjwiX19udnZtX2Rpdl9yel9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5LCBsbHZtX2RvdWJsZV90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9kaXZfcm1fZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kaXZfcm1fZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fZGl2X3JwX2QgOiBHQ0NCdWlsdGluPCJfX252dm1fZGl2X3JwX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworLy8KKy8vIFNhZAorLy8KKworICBkZWYgaW50X252dm1fc2FkX2kgOiBHQ0NCdWlsdGluPCJfX252dm1fc2FkX2kiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9zYWRfdWkgOiBHQ0NCdWlsdGluPCJfX252dm1fc2FkX3VpIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisvLworLy8gRmxvb3IgIENlaWwKKy8vCisKKyAgZGVmIGludF9udnZtX2Zsb29yX2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX2Zsb29yX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2Zsb29yX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZmxvb3JfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mbG9vcl9kIDogR0NDQnVpbHRpbjwiX19udnZtX2Zsb29yX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9udnZtX2NlaWxfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fY2VpbF9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9jZWlsX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fY2VpbF9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2NlaWxfZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9jZWlsX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisKKy8vCisvLyBBYnMKKy8vCisKKyAgZGVmIGludF9udnZtX2ZhYnNfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZmFic19mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mYWJzX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZmFic19mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2ZhYnNfZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mYWJzX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisKKy8vCisvLyBSb3VuZAorLy8KKworICBkZWYgaW50X252dm1fcm91bmRfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fcm91bmRfZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fcm91bmRfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9yb3VuZF9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1fcm91bmRfZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9yb3VuZF9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworCisvLworLy8gVHJ1bmMKKy8vCisKKyAgZGVmIGludF9udnZtX3RydW5jX2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX3RydW5jX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3RydW5jX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fdHJ1bmNfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9udnZtX3RydW5jX2QgOiBHQ0NCdWlsdGluPCJfX252dm1fdHJ1bmNfZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIFNhdHVyYXRlCisvLworCisgIGRlZiBpbnRfbnZ2bV9zYXR1cmF0ZV9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zYXR1cmF0ZV9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9zYXR1cmF0ZV9mIDogR0NDQnVpbHRpbjwiX19udnZtX3NhdHVyYXRlX2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV9zYXR1cmF0ZV9kIDogR0NDQnVpbHRpbjwiX19udnZtX3NhdHVyYXRlX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisKKy8vCisvLyBFeHAyICBMb2cyCisvLworCisgIGRlZiBpbnRfbnZ2bV9leDJfYXBwcm94X2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX2V4Ml9hcHByb3hfZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZXgyX2FwcHJveF9mIDogR0NDQnVpbHRpbjwiX19udnZtX2V4Ml9hcHByb3hfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9leDJfYXBwcm94X2QgOiBHQ0NCdWlsdGluPCJfX252dm1fZXgyX2FwcHJveF9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV9sZzJfYXBwcm94X2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX2xnMl9hcHByb3hfZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fbGcyX2FwcHJveF9mIDogR0NDQnVpbHRpbjwiX19udnZtX2xnMl9hcHByb3hfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9sZzJfYXBwcm94X2QgOiBHQ0NCdWlsdGluPCJfX252dm1fbGcyX2FwcHJveF9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworCisvLworLy8gU2luICBDb3MKKy8vCisKKyAgZGVmIGludF9udnZtX3Npbl9hcHByb3hfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fc2luX2FwcHJveF9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9zaW5fYXBwcm94X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fc2luX2FwcHJveF9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1fY29zX2FwcHJveF9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9jb3NfYXBwcm94X2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2Nvc19hcHByb3hfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9jb3NfYXBwcm94X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworCisvLworLy8gRm1hCisvLworCisgIGRlZiBpbnRfbnZ2bV9mbWFfcm5fZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZm1hX3JuX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9mbWFfcm5fZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mbWFfcm5fZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fZm1hX3J6X2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX2ZtYV9yel9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fZm1hX3J6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZm1hX3J6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX2ZtYV9ybV9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mbWFfcm1fZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX2ZtYV9ybV9mIDogR0NDQnVpbHRpbjwiX19udnZtX2ZtYV9ybV9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9mbWFfcnBfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZm1hX3JwX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9mbWFfcnBfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mbWFfcnBfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIGRlZiBpbnRfbnZ2bV9mbWFfcm5fZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mbWFfcm5fZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sCisgICAgICAgIFtsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX2ZtYV9yel9kIDogR0NDQnVpbHRpbjwiX19udnZtX2ZtYV9yel9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgW2xsdm1fZG91YmxlX3R5LCBsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fZm1hX3JtX2QgOiBHQ0NCdWlsdGluPCJfX252dm1fZm1hX3JtX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLAorICAgICAgICBbbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5LCBsbHZtX2RvdWJsZV90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9mbWFfcnBfZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mbWFfcnBfZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sCisgICAgICAgIFtsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworLy8KKy8vIFJjcAorLy8KKworICBkZWYgaW50X252dm1fcmNwX3JuX2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX3JjcF9ybl9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9yY3Bfcm5fZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9yY3Bfcm5fZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9yY3BfcnpfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fcmNwX3J6X2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3JjcF9yel9mIDogR0NDQnVpbHRpbjwiX19udnZtX3JjcF9yel9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3JjcF9ybV9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9yY3Bfcm1fZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fcmNwX3JtX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fcmNwX3JtX2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fcmNwX3JwX2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX3JjcF9ycF9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9yY3BfcnBfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9yY3BfcnBfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9udnZtX3JjcF9ybl9kIDogR0NDQnVpbHRpbjwiX19udnZtX3JjcF9ybl9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fcmNwX3J6X2QgOiBHQ0NCdWlsdGluPCJfX252dm1fcmNwX3J6X2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9yY3Bfcm1fZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9yY3Bfcm1fZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3JjcF9ycF9kIDogR0NDQnVpbHRpbjwiX19udnZtX3JjcF9ycF9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV9yY3BfYXBwcm94X2Z0el9kIDogR0NDQnVpbHRpbjwiX19udnZtX3JjcF9hcHByb3hfZnR6X2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisKKy8vCisvLyBTcXJ0CisvLworCisgIGRlZiBpbnRfbnZ2bV9zcXJ0X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fc3FydF9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3NxcnRfcm5fZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fc3FydF9ybl9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9zcXJ0X3JuX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fc3FydF9ybl9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3NxcnRfcnpfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fc3FydF9yel9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9zcXJ0X3J6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fc3FydF9yel9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3NxcnRfcm1fZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fc3FydF9ybV9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9zcXJ0X3JtX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fc3FydF9ybV9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3NxcnRfcnBfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fc3FydF9ycF9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9zcXJ0X3JwX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fc3FydF9ycF9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3NxcnRfYXBwcm94X2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX3NxcnRfYXBwcm94X2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3NxcnRfYXBwcm94X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fc3FydF9hcHByb3hfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9udnZtX3NxcnRfcm5fZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zcXJ0X3JuX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9zcXJ0X3J6X2QgOiBHQ0NCdWlsdGluPCJfX252dm1fc3FydF9yel9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fc3FydF9ybV9kIDogR0NDQnVpbHRpbjwiX19udnZtX3NxcnRfcm1fZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3NxcnRfcnBfZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zcXJ0X3JwX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisKKy8vCisvLyBSc3FydAorLy8KKworICBkZWYgaW50X252dm1fcnNxcnRfYXBwcm94X2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX3JzcXJ0X2FwcHJveF9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9yc3FydF9hcHByb3hfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9yc3FydF9hcHByb3hfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9yc3FydF9hcHByb3hfZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9yc3FydF9hcHByb3hfZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEFkZAorLy8KKworICBkZWYgaW50X252dm1fYWRkX3JuX2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX2FkZF9ybl9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fYWRkX3JuX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fYWRkX3JuX2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX2FkZF9yel9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9hZGRfcnpfZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX2FkZF9yel9mIDogR0NDQnVpbHRpbjwiX19udnZtX2FkZF9yel9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9hZGRfcm1fZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fYWRkX3JtX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9hZGRfcm1fZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9hZGRfcm1fZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fYWRkX3JwX2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX2FkZF9ycF9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fYWRkX3JwX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fYWRkX3JwX2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworICBkZWYgaW50X252dm1fYWRkX3JuX2QgOiBHQ0NCdWlsdGluPCJfX252dm1fYWRkX3JuX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX2FkZF9yel9kIDogR0NDQnVpbHRpbjwiX19udnZtX2FkZF9yel9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5LCBsbHZtX2RvdWJsZV90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9hZGRfcm1fZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9hZGRfcm1fZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fYWRkX3JwX2QgOiBHQ0NCdWlsdGluPCJfX252dm1fYWRkX3JwX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworLy8KKy8vIENvbnZlcnQKKy8vCisKKyAgZGVmIGludF9udnZtX2QyZl9ybl9mdHogOiBHQ0NCdWlsdGluPCJfX252dm1fZDJmX3JuX2Z0eiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZDJmX3JuIDogR0NDQnVpbHRpbjwiX19udnZtX2QyZl9ybiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZDJmX3J6X2Z0eiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kMmZfcnpfZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9kMmZfcnogOiBHQ0NCdWlsdGluPCJfX252dm1fZDJmX3J6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9kMmZfcm1fZnR6IDogR0NDQnVpbHRpbjwiX19udnZtX2QyZl9ybV9mdHoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2QyZl9ybSA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kMmZfcm0iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2QyZl9ycF9mdHogOiBHQ0NCdWlsdGluPCJfX252dm1fZDJmX3JwX2Z0eiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZDJmX3JwIDogR0NDQnVpbHRpbjwiX19udnZtX2QyZl9ycCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV9kMmlfcm4gOiBHQ0NCdWlsdGluPCJfX252dm1fZDJpX3JuIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZDJpX3J6IDogR0NDQnVpbHRpbjwiX19udnZtX2QyaV9yeiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2QyaV9ybSA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kMmlfcm0iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9kMmlfcnAgOiBHQ0NCdWlsdGluPCJfX252dm1fZDJpX3JwIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV9kMnVpX3JuIDogR0NDQnVpbHRpbjwiX19udnZtX2QydWlfcm4iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9kMnVpX3J6IDogR0NDQnVpbHRpbjwiX19udnZtX2QydWlfcnoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9kMnVpX3JtIDogR0NDQnVpbHRpbjwiX19udnZtX2QydWlfcm0iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9kMnVpX3JwIDogR0NDQnVpbHRpbjwiX19udnZtX2QydWlfcnAiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9udnZtX2kyZF9ybiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9pMmRfcm4iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9pMmRfcnogOiBHQ0NCdWlsdGluPCJfX252dm1faTJkX3J6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1faTJkX3JtIDogR0NDQnVpbHRpbjwiX19udnZtX2kyZF9ybSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2kyZF9ycCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9pMmRfcnAiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9udnZtX3VpMmRfcm4gOiBHQ0NCdWlsdGluPCJfX252dm1fdWkyZF9ybiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3VpMmRfcnogOiBHQ0NCdWlsdGluPCJfX252dm1fdWkyZF9yeiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3VpMmRfcm0gOiBHQ0NCdWlsdGluPCJfX252dm1fdWkyZF9ybSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3VpMmRfcnAgOiBHQ0NCdWlsdGluPCJfX252dm1fdWkyZF9ycCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1fZjJpX3JuX2Z0eiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mMmlfcm5fZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMmlfcm4gOiBHQ0NCdWlsdGluPCJfX252dm1fZjJpX3JuIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMmlfcnpfZnR6IDogR0NDQnVpbHRpbjwiX19udnZtX2YyaV9yel9mdHoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YyaV9yeiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mMmlfcnoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YyaV9ybV9mdHogOiBHQ0NCdWlsdGluPCJfX252dm1fZjJpX3JtX2Z0eiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZjJpX3JtIDogR0NDQnVpbHRpbjwiX19udnZtX2YyaV9ybSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZjJpX3JwX2Z0eiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mMmlfcnBfZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMmlfcnAgOiBHQ0NCdWlsdGluPCJfX252dm1fZjJpX3JwIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9udnZtX2YydWlfcm5fZnR6IDogR0NDQnVpbHRpbjwiX19udnZtX2YydWlfcm5fZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMnVpX3JuIDogR0NDQnVpbHRpbjwiX19udnZtX2YydWlfcm4iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YydWlfcnpfZnR6IDogR0NDQnVpbHRpbjwiX19udnZtX2YydWlfcnpfZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMnVpX3J6IDogR0NDQnVpbHRpbjwiX19udnZtX2YydWlfcnoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YydWlfcm1fZnR6IDogR0NDQnVpbHRpbjwiX19udnZtX2YydWlfcm1fZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMnVpX3JtIDogR0NDQnVpbHRpbjwiX19udnZtX2YydWlfcm0iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YydWlfcnBfZnR6IDogR0NDQnVpbHRpbjwiX19udnZtX2YydWlfcnBfZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMnVpX3JwIDogR0NDQnVpbHRpbjwiX19udnZtX2YydWlfcnAiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1faTJmX3JuIDogR0NDQnVpbHRpbjwiX19udnZtX2kyZl9ybiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1faTJmX3J6IDogR0NDQnVpbHRpbjwiX19udnZtX2kyZl9yeiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1faTJmX3JtIDogR0NDQnVpbHRpbjwiX19udnZtX2kyZl9ybSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1faTJmX3JwIDogR0NDQnVpbHRpbjwiX19udnZtX2kyZl9ycCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV91aTJmX3JuIDogR0NDQnVpbHRpbjwiX19udnZtX3VpMmZfcm4iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3VpMmZfcnogOiBHQ0NCdWlsdGluPCJfX252dm1fdWkyZl9yeiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fdWkyZl9ybSA6IEdDQ0J1aWx0aW48Il9fbnZ2bV91aTJmX3JtIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV91aTJmX3JwIDogR0NDQnVpbHRpbjwiX19udnZtX3VpMmZfcnAiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1fbG9oaV9pMmQgOiBHQ0NCdWlsdGluPCJfX252dm1fbG9oaV9pMmQiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworICBkZWYgaW50X252dm1fZDJpX2xvIDogR0NDQnVpbHRpbjwiX19udnZtX2QyaV9sbyI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2QyaV9oaSA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kMmlfaGkiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9udnZtX2YybGxfcm5fZnR6IDogR0NDQnVpbHRpbjwiX19udnZtX2YybGxfcm5fZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMmxsX3JuIDogR0NDQnVpbHRpbjwiX19udnZtX2YybGxfcm4iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YybGxfcnpfZnR6IDogR0NDQnVpbHRpbjwiX19udnZtX2YybGxfcnpfZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMmxsX3J6IDogR0NDQnVpbHRpbjwiX19udnZtX2YybGxfcnoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YybGxfcm1fZnR6IDogR0NDQnVpbHRpbjwiX19udnZtX2YybGxfcm1fZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMmxsX3JtIDogR0NDQnVpbHRpbjwiX19udnZtX2YybGxfcm0iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YybGxfcnBfZnR6IDogR0NDQnVpbHRpbjwiX19udnZtX2YybGxfcnBfZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMmxsX3JwIDogR0NDQnVpbHRpbjwiX19udnZtX2YybGxfcnAiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1fZjJ1bGxfcm5fZnR6IDogR0NDQnVpbHRpbjwiX19udnZtX2YydWxsX3JuX2Z0eiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZjJ1bGxfcm4gOiBHQ0NCdWlsdGluPCJfX252dm1fZjJ1bGxfcm4iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YydWxsX3J6X2Z0eiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mMnVsbF9yel9mdHoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YydWxsX3J6IDogR0NDQnVpbHRpbjwiX19udnZtX2YydWxsX3J6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMnVsbF9ybV9mdHogOiBHQ0NCdWlsdGluPCJfX252dm1fZjJ1bGxfcm1fZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMnVsbF9ybSA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mMnVsbF9ybSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZjJ1bGxfcnBfZnR6IDogR0NDQnVpbHRpbjwiX19udnZtX2YydWxsX3JwX2Z0eiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZjJ1bGxfcnAgOiBHQ0NCdWlsdGluPCJfX252dm1fZjJ1bGxfcnAiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1fZDJsbF9ybiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kMmxsX3JuIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZDJsbF9yeiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kMmxsX3J6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZDJsbF9ybSA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kMmxsX3JtIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZDJsbF9ycCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kMmxsX3JwIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV9kMnVsbF9ybiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kMnVsbF9ybiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2QydWxsX3J6IDogR0NDQnVpbHRpbjwiX19udnZtX2QydWxsX3J6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZDJ1bGxfcm0gOiBHQ0NCdWlsdGluPCJfX252dm1fZDJ1bGxfcm0iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9kMnVsbF9ycCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kMnVsbF9ycCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1fbGwyZl9ybiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9sbDJmX3JuIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9sbDJmX3J6IDogR0NDQnVpbHRpbjwiX19udnZtX2xsMmZfcnoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2xsMmZfcm0gOiBHQ0NCdWlsdGluPCJfX252dm1fbGwyZl9ybSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fbGwyZl9ycCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9sbDJmX3JwIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV91bGwyZl9ybiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV91bGwyZl9ybiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fdWxsMmZfcnogOiBHQ0NCdWlsdGluPCJfX252dm1fdWxsMmZfcnoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3VsbDJmX3JtIDogR0NDQnVpbHRpbjwiX19udnZtX3VsbDJmX3JtIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV91bGwyZl9ycCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV91bGwyZl9ycCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV9sbDJkX3JuIDogR0NDQnVpbHRpbjwiX19udnZtX2xsMmRfcm4iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9sbDJkX3J6IDogR0NDQnVpbHRpbjwiX19udnZtX2xsMmRfcnoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9sbDJkX3JtIDogR0NDQnVpbHRpbjwiX19udnZtX2xsMmRfcm0iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9sbDJkX3JwIDogR0NDQnVpbHRpbjwiX19udnZtX2xsMmRfcnAiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV91bGwyZF9ybiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV91bGwyZF9ybiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3VsbDJkX3J6IDogR0NDQnVpbHRpbjwiX19udnZtX3VsbDJkX3J6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fdWxsMmRfcm0gOiBHQ0NCdWlsdGluPCJfX252dm1fdWxsMmRfcm0iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV91bGwyZF9ycCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV91bGwyZF9ycCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1fZjJoX3JuX2Z0eiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mMmhfcm5fZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMmhfcm4gOiBHQ0NCdWlsdGluPCJfX252dm1fZjJoX3JuIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisKKy8vCisvLyBCaXRjYXN0CisvLworCisgIGRlZiBpbnRfbnZ2bV9iaXRjYXN0X2YyaSA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9iaXRjYXN0X2YyaSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fYml0Y2FzdF9pMmYgOiBHQ0NCdWlsdGluPCJfX252dm1fYml0Y2FzdF9pMmYiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1fYml0Y2FzdF9sbDJkIDogR0NDQnVpbHRpbjwiX19udnZtX2JpdGNhc3RfbGwyZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2JpdGNhc3RfZDJsbCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9iaXRjYXN0X2QybGwiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisKKy8vIEZOUworCisgIGRlZiBpbnRfbnZ2bV9mbnMgOiBHQ0NCdWlsdGluPCJfX252dm1fZm5zIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8gQXRvbWljcyBub3QgYXZhaWxhYmxlIGFzIGxsdm0gaW50cmluc2ljcy4KKyAgZGVmIGludF9udnZtX2F0b21pY19sb2FkX2FkZF9mMzIgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLAorICAgICAgICAgIFtMTFZNQW55UG9pbnRlclR5cGU8bGx2bV9mbG9hdF90eT4sIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPl0+OworICAvLyBBdG9taWMgYWRkIG9mIGY2NCByZXF1aXJlcyBzbV82MC4KKyAgZGVmIGludF9udnZtX2F0b21pY19sb2FkX2FkZF9mNjQgOiBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgICBbTExWTUFueVBvaW50ZXJUeXBlPGxsdm1fZG91YmxlX3R5PiwgbGx2bV9kb3VibGVfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPl0+OworCisgIGRlZiBpbnRfbnZ2bV9hdG9taWNfbG9hZF9pbmNfMzIgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgICBbTExWTUFueVBvaW50ZXJUeXBlPGxsdm1faTMyX3R5PiwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X252dm1fYXRvbWljX2xvYWRfZGVjXzMyIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0xMVk1BbnlQb2ludGVyVHlwZTxsbHZtX2kzMl90eT4sIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8MD5dPjsKKworICBjbGFzcyBTQ09QRURfQVRPTUlDMl9pbXBsPExMVk1UeXBlIGVsdHk+CisgICAgICAgIDogSW50cmluc2ljPFtlbHR5XSwKKyAgICAgICAgICBbTExWTUFueVBvaW50ZXJUeXBlPExMVk1NYXRjaFR5cGU8MD4+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPl0+OworICBjbGFzcyBTQ09QRURfQVRPTUlDM19pbXBsPExMVk1UeXBlIGVsdHk+CisgICAgICAgIDogSW50cmluc2ljPFtlbHR5XSwKKyAgICAgICAgICBbTExWTUFueVBvaW50ZXJUeXBlPExMVk1NYXRjaFR5cGU8MD4+LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPl0+OworCisgIG11bHRpY2xhc3MgUFRYQXRvbWljV2l0aFNjb3BlMjxMTFZNVHlwZSBlbHR5PiB7CisgICAgZGVmIF9jdGEgOiBTQ09QRURfQVRPTUlDMl9pbXBsPGVsdHk+OworICAgIGRlZiBfc3lzIDogU0NPUEVEX0FUT01JQzJfaW1wbDxlbHR5PjsKKyAgfQorICBtdWx0aWNsYXNzIFBUWEF0b21pY1dpdGhTY29wZTM8TExWTVR5cGUgZWx0eT4geworICAgIGRlZiBfY3RhIDogU0NPUEVEX0FUT01JQzNfaW1wbDxlbHR5PjsKKyAgICBkZWYgX3N5cyA6IFNDT1BFRF9BVE9NSUMzX2ltcGw8ZWx0eT47CisgIH0KKyAgbXVsdGljbGFzcyBQVFhBdG9taWNXaXRoU2NvcGUyX2ZpIHsKKyAgICBkZWZtIF9mOiBQVFhBdG9taWNXaXRoU2NvcGUyPGxsdm1fYW55ZmxvYXRfdHk+OworICAgIGRlZm0gX2k6IFBUWEF0b21pY1dpdGhTY29wZTI8bGx2bV9hbnlpbnRfdHk+OworICB9CisgIGRlZm0gaW50X252dm1fYXRvbWljX2FkZF9nZW4gICA6IFBUWEF0b21pY1dpdGhTY29wZTJfZmk7CisgIGRlZm0gaW50X252dm1fYXRvbWljX2luY19nZW5faSA6IFBUWEF0b21pY1dpdGhTY29wZTI8bGx2bV9hbnlpbnRfdHk+OworICBkZWZtIGludF9udnZtX2F0b21pY19kZWNfZ2VuX2kgOiBQVFhBdG9taWNXaXRoU2NvcGUyPGxsdm1fYW55aW50X3R5PjsKKyAgZGVmbSBpbnRfbnZ2bV9hdG9taWNfZXhjaF9nZW5faTogUFRYQXRvbWljV2l0aFNjb3BlMjxsbHZtX2FueWludF90eT47CisgIGRlZm0gaW50X252dm1fYXRvbWljX3hvcl9nZW5faSA6IFBUWEF0b21pY1dpdGhTY29wZTI8bGx2bV9hbnlpbnRfdHk+OworICBkZWZtIGludF9udnZtX2F0b21pY19tYXhfZ2VuX2kgOiBQVFhBdG9taWNXaXRoU2NvcGUyPGxsdm1fYW55aW50X3R5PjsKKyAgZGVmbSBpbnRfbnZ2bV9hdG9taWNfbWluX2dlbl9pIDogUFRYQXRvbWljV2l0aFNjb3BlMjxsbHZtX2FueWludF90eT47CisgIGRlZm0gaW50X252dm1fYXRvbWljX29yX2dlbl9pICA6IFBUWEF0b21pY1dpdGhTY29wZTI8bGx2bV9hbnlpbnRfdHk+OworICBkZWZtIGludF9udnZtX2F0b21pY19hbmRfZ2VuX2kgOiBQVFhBdG9taWNXaXRoU2NvcGUyPGxsdm1fYW55aW50X3R5PjsKKyAgZGVmbSBpbnRfbnZ2bV9hdG9taWNfY2FzX2dlbl9pIDogUFRYQXRvbWljV2l0aFNjb3BlMzxsbHZtX2FueWludF90eT47CisKKy8vIEJhci5TeW5jCisKKyAgLy8gVGhlIGJ1aWx0aW4gZm9yICJiYXIuc3luYyAwIiBpcyBjYWxsZWQgX19zeW5jdGhyZWFkcy4gIFVubGlrZSBtb3N0IG9mIHRoZQorICAvLyBpbnRyaW5zaWNzIGluIHRoaXMgZmlsZSwgdGhpcyBvbmUgaXMgYSB1c2VyLWZhY2luZyBBUEkuCisgIGRlZiBpbnRfbnZ2bV9iYXJyaWVyMCA6IEdDQ0J1aWx0aW48Il9fc3luY3RocmVhZHMiPiwKKyAgICAgIEludHJpbnNpYzxbXSwgW10sIFtJbnRyQ29udmVyZ2VudF0+OworICAvLyBTeW5jaHJvbml6ZSBhbGwgdGhyZWFkcyBpbiB0aGUgQ1RBIGF0IGJhcnJpZXIgJ24nLgorICBkZWYgaW50X252dm1fYmFycmllcl9uIDogR0NDQnVpbHRpbjwiX19udnZtX2Jhcl9uIj4sCisgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0sIFtJbnRyQ29udmVyZ2VudF0+OworICAvLyBTeW5jaHJvbml6ZSAnbScsIGEgbXVsdGlwbGUgb2Ygd2FycCBzaXplLCAoYXJnIDIpIHRocmVhZHMgaW4KKyAgLy8gdGhlIENUQSBhdCBiYXJyaWVyICduJyAoYXJnIDEpLgorICBkZWYgaW50X252dm1fYmFycmllciA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9iYXIiPiwKKyAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyQ29udmVyZ2VudF0+OworICBkZWYgaW50X252dm1fYmFycmllcjBfcG9wYyA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9iYXIwX3BvcGMiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ckNvbnZlcmdlbnRdPjsKKyAgZGVmIGludF9udnZtX2JhcnJpZXIwX2FuZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9iYXIwX2FuZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyQ29udmVyZ2VudF0+OworICBkZWYgaW50X252dm1fYmFycmllcjBfb3IgOiBHQ0NCdWlsdGluPCJfX252dm1fYmFyMF9vciI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyQ29udmVyZ2VudF0+OworCisgIGRlZiBpbnRfbnZ2bV9iYXJfc3luYyA6CisgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0sIFtJbnRyQ29udmVyZ2VudF0+LAorICAgICAgR0NDQnVpbHRpbjwiX19udnZtX2Jhcl9zeW5jIj47CisgIGRlZiBpbnRfbnZ2bV9iYXJfd2FycF9zeW5jIDoKKyAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XSwgW0ludHJDb252ZXJnZW50XT4sCisgICAgICBHQ0NCdWlsdGluPCJfX252dm1fYmFyX3dhcnBfc3luYyI+OworCisgIC8vIGJhcnJpZXIuc3luYyBpZFssIGNudF0KKyAgZGVmIGludF9udnZtX2JhcnJpZXJfc3luYyA6CisgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0sIFtJbnRyQ29udmVyZ2VudF0+LAorICAgICAgR0NDQnVpbHRpbjwiX19udnZtX2JhcnJpZXJfc3luYyI+OworICBkZWYgaW50X252dm1fYmFycmllcl9zeW5jX2NudCA6CisgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ckNvbnZlcmdlbnRdPiwKKyAgICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9iYXJyaWVyX3N5bmNfY250Ij47CisKKyAgLy8gTWVtYmFyCisgIGRlZiBpbnRfbnZ2bV9tZW1iYXJfY3RhIDogR0NDQnVpbHRpbjwiX19udnZtX21lbWJhcl9jdGEiPiwKKyAgICAgIEludHJpbnNpYzxbXSwgW10sIFtdPjsKKyAgZGVmIGludF9udnZtX21lbWJhcl9nbCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9tZW1iYXJfZ2wiPiwKKyAgICAgIEludHJpbnNpYzxbXSwgW10sIFtdPjsKKyAgZGVmIGludF9udnZtX21lbWJhcl9zeXMgOiBHQ0NCdWlsdGluPCJfX252dm1fbWVtYmFyX3N5cyI+LAorICAgICAgSW50cmluc2ljPFtdLCBbXSwgW10+OworCisvLyBHZW5lcmF0ZWQgd2l0aGluIG52dm0uIFVzZSBmb3IgbGR1IG9uIHNtXzIwIG9yIGxhdGVyLiAgU2Vjb25kIGFyZyBpcyB0aGUKKy8vIHBvaW50ZXIncyBhbGlnbm1lbnQuCitkZWYgaW50X252dm1fbGR1X2dsb2JhbF9pIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sCisgIFtMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj4sIGxsdm1faTMyX3R5XSwKKyAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+XSwKKyAgImxsdm0ubnZ2bS5sZHUuZ2xvYmFsLmkiPjsKK2RlZiBpbnRfbnZ2bV9sZHVfZ2xvYmFsX2YgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLAorICBbTExWTUFueVBvaW50ZXJUeXBlPExMVk1NYXRjaFR5cGU8MD4+LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPl0sCisgICJsbHZtLm52dm0ubGR1Lmdsb2JhbC5mIj47CitkZWYgaW50X252dm1fbGR1X2dsb2JhbF9wIDogSW50cmluc2ljPFtsbHZtX2FueXB0cl90eV0sCisgIFtMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj4sIGxsdm1faTMyX3R5XSwKKyAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+XSwKKyAgImxsdm0ubnZ2bS5sZHUuZ2xvYmFsLnAiPjsKKworLy8gR2VuZXJhdGVkIHdpdGhpbiBudnZtLiBVc2UgZm9yIGxkZyBvbiBzbV8zNSBvciBsYXRlci4gIFNlY29uZCBhcmcgaXMgdGhlCisvLyBwb2ludGVyJ3MgYWxpZ25tZW50LgorZGVmIGludF9udnZtX2xkZ19nbG9iYWxfaSA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLAorICBbTExWTUFueVBvaW50ZXJUeXBlPExMVk1NYXRjaFR5cGU8MD4+LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPl0sCisgICJsbHZtLm52dm0ubGRnLmdsb2JhbC5pIj47CitkZWYgaW50X252dm1fbGRnX2dsb2JhbF9mIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwKKyAgW0xMVk1BbnlQb2ludGVyVHlwZTxMTFZNTWF0Y2hUeXBlPDA+PiwgbGx2bV9pMzJfdHldLAorICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8MD5dLAorICAibGx2bS5udnZtLmxkZy5nbG9iYWwuZiI+OworZGVmIGludF9udnZtX2xkZ19nbG9iYWxfcCA6IEludHJpbnNpYzxbbGx2bV9hbnlwdHJfdHldLAorICBbTExWTUFueVBvaW50ZXJUeXBlPExMVk1NYXRjaFR5cGU8MD4+LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPl0sCisgICJsbHZtLm52dm0ubGRnLmdsb2JhbC5wIj47CisKKy8vIFVzZSBmb3IgZ2VuZXJpYyBwb2ludGVycworLy8gLSBUaGVzZSBpbnRyaW5zaWNzIGFyZSB1c2VkIHRvIGNvbnZlcnQgYWRkcmVzcyBzcGFjZXMuCisvLyAtIFRoZSBpbnB1dCBwb2ludGVyIGFuZCBvdXRwdXQgcG9pbnRlciBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSwgZXhjZXB0IGZvcgorLy8gICB0aGUgYWRkcmVzcy1zcGFjZS4gKFRoaXMgcmVzdHJpY3Rpb24gaXMgbm90IGVuZm9yY2VkIGhlcmUgYXMgdGhlcmUgaXMKKy8vICAgY3VycmVudGx5IG5vIHdheSB0byBkZXNjcmliZSBpdCkuCisvLyAtIFRoaXMgY29tcGxlbWVudHMgdGhlIGxsdm0gYml0Y2FzdCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY2FzdCBvbmUgdHlwZQorLy8gICBvZiBwb2ludGVyIHRvIGFub3RoZXIgdHlwZSBvZiBwb2ludGVyLCB3aGlsZSB0aGUgYWRkcmVzcyBzcGFjZSByZW1haW5zCisvLyAgIHRoZSBzYW1lLgorZGVmIGludF9udnZtX3B0cl9sb2NhbF90b19nZW46IEludHJpbnNpYzxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgICAgImxsdm0ubnZ2bS5wdHIubG9jYWwudG8uZ2VuIj47CitkZWYgaW50X252dm1fcHRyX3NoYXJlZF90b19nZW46IEludHJpbnNpYzxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgICAgImxsdm0ubnZ2bS5wdHIuc2hhcmVkLnRvLmdlbiI+OworZGVmIGludF9udnZtX3B0cl9nbG9iYWxfdG9fZ2VuOiBJbnRyaW5zaWM8W2xsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICAgICJsbHZtLm52dm0ucHRyLmdsb2JhbC50by5nZW4iPjsKK2RlZiBpbnRfbnZ2bV9wdHJfY29uc3RhbnRfdG9fZ2VuOiBJbnRyaW5zaWM8W2xsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICAgICJsbHZtLm52dm0ucHRyLmNvbnN0YW50LnRvLmdlbiI+OworCitkZWYgaW50X252dm1fcHRyX2dlbl90b19nbG9iYWw6IEludHJpbnNpYzxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgICAgImxsdm0ubnZ2bS5wdHIuZ2VuLnRvLmdsb2JhbCI+OworZGVmIGludF9udnZtX3B0cl9nZW5fdG9fc2hhcmVkOiBJbnRyaW5zaWM8W2xsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICAgICJsbHZtLm52dm0ucHRyLmdlbi50by5zaGFyZWQiPjsKK2RlZiBpbnRfbnZ2bV9wdHJfZ2VuX3RvX2xvY2FsOiBJbnRyaW5zaWM8W2xsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICAgICJsbHZtLm52dm0ucHRyLmdlbi50by5sb2NhbCI+OworZGVmIGludF9udnZtX3B0cl9nZW5fdG9fY29uc3RhbnQ6IEludHJpbnNpYzxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgICAgImxsdm0ubnZ2bS5wdHIuZ2VuLnRvLmNvbnN0YW50Ij47CisKKy8vIFVzZWQgaW4gbnZ2bSBpbnRlcm5hbGx5IHRvIGhlbHAgYWRkcmVzcyBzcGFjZSBvcHQgYW5kIHB0eCBjb2RlIGdlbmVyYXRpb24KKy8vIFRoaXMgaXMgZm9yIHBhcmFtcyB0aGF0IGFyZSBwYXNzZWQgdG8ga2VybmVsIGZ1bmN0aW9ucyBieSBwb2ludGVyIGJ5LXZhbC4KK2RlZiBpbnRfbnZ2bV9wdHJfZ2VuX3RvX3BhcmFtOiBJbnRyaW5zaWM8W2xsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxsdm0ubnZ2bS5wdHIuZ2VuLnRvLnBhcmFtIj47CisKKy8vIE1vdmUgaW50cmluc2ljcywgdXNlZCBpbiBudnZtIGludGVybmFsbHkKKworZGVmIGludF9udnZtX21vdmVfaTE2IDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sIFtsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dLAorICAibGx2bS5udnZtLm1vdmUuaTE2Ij47CitkZWYgaW50X252dm1fbW92ZV9pMzIgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0sCisgICJsbHZtLm52dm0ubW92ZS5pMzIiPjsKK2RlZiBpbnRfbnZ2bV9tb3ZlX2k2NCA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXSwKKyAgImxsdm0ubnZ2bS5tb3ZlLmk2NCI+OworZGVmIGludF9udnZtX21vdmVfZmxvYXQgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sCisgIFtJbnRyTm9NZW1dLCAibGx2bS5udnZtLm1vdmUuZmxvYXQiPjsKK2RlZiBpbnRfbnZ2bV9tb3ZlX2RvdWJsZSA6IEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHldLAorICBbSW50ck5vTWVtXSwgImxsdm0ubnZ2bS5tb3ZlLmRvdWJsZSI+OworZGVmIGludF9udnZtX21vdmVfcHRyIDogSW50cmluc2ljPFtsbHZtX2FueXB0cl90eV0sIFtsbHZtX2FueXB0cl90eV0sCisgIFtJbnRyTm9NZW0sIE5vQ2FwdHVyZTwwPl0sICJsbHZtLm52dm0ubW92ZS5wdHIiPjsKKworCisvLyBGb3IgZ2V0dGluZyB0aGUgaGFuZGxlIGZyb20gYSB0ZXh0dXJlIG9yIHN1cmZhY2UgdmFyaWFibGUKK2RlZiBpbnRfbnZ2bV90ZXhzdXJmX2hhbmRsZQorICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9tZXRhZGF0YV90eSwgbGx2bV9hbnlpNjRwdHJfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXSwgImxsdm0ubnZ2bS50ZXhzdXJmLmhhbmRsZSI+OworZGVmIGludF9udnZtX3RleHN1cmZfaGFuZGxlX2ludGVybmFsCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dLCAibGx2bS5udnZtLnRleHN1cmYuaGFuZGxlLmludGVybmFsIj47CisKKy8vLyBFcnJvciAvIFdhcm4KK2RlZiBpbnRfbnZ2bV9jb21waWxlcl9lcnJvciA6CisgICAgSW50cmluc2ljPFtdLCBbbGx2bV9hbnlwdHJfdHldLCBbXSwgImxsdm0ubnZ2bS5jb21waWxlci5lcnJvciI+OworZGVmIGludF9udnZtX2NvbXBpbGVyX3dhcm4gOgorICAgIEludHJpbnNpYzxbXSwgW2xsdm1fYW55cHRyX3R5XSwgW10sICJsbHZtLm52dm0uY29tcGlsZXIud2FybiI+OworCitkZWYgaW50X252dm1fcmVmbGVjdCA6CisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9hbnlwdHJfdHldLCBbSW50ck5vTWVtXSwgImxsdm0ubnZ2bS5yZWZsZWN0Ij47CisKKy8vIGlzc3BhY2VwLntjb25zdCwgZ2xvYmFsLCBsb2NhbCwgc2hhcmVkfQorZGVmIGludF9udnZtX2lzc3BhY2VwX2NvbnN0CisgIDogSW50cmluc2ljPFtsbHZtX2kxX3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uaXNzcGFjZXAuY29uc3QiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1faXNzcGFjZXBfY29uc3QiPjsKK2RlZiBpbnRfbnZ2bV9pc3NwYWNlcF9nbG9iYWwKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTFfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5pc3NwYWNlcC5nbG9iYWwiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1faXNzcGFjZXBfZ2xvYmFsIj47CitkZWYgaW50X252dm1faXNzcGFjZXBfbG9jYWwKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTFfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5pc3NwYWNlcC5sb2NhbCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9pc3NwYWNlcF9sb2NhbCI+OworZGVmIGludF9udnZtX2lzc3BhY2VwX3NoYXJlZAorICA6IEludHJpbnNpYzxbbGx2bV9pMV90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLmlzc3BhY2VwLnNoYXJlZCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9pc3NwYWNlcF9zaGFyZWQiPjsKKworLy8gRW52aXJvbm1lbnQgcmVnaXN0ZXIgcmVhZAorZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMCI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMQorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMSI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMiI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMworICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWczIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMyI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnNAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc0Ij4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnNCI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnNQorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc1Ij4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnNSI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnNgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc2Ij4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnNiI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnNworICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc3Ij4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnNyI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnOAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc4Ij4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnOCI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnOQorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc5Ij4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnOSI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMCI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTEKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTEiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMSI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTIiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMiI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTMKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTMiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMyI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTQKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTQiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNCI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTUKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTUiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNSI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTYKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTYiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNiI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTcKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTciPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNyI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTgKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTgiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxOCI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTkKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTkiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxOSI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMCI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjEKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjEiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMSI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjIiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMiI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjMKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjMiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMyI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjQKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjQiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyNCI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjUKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjUiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyNSI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjYKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjYiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyNiI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjcKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjciPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyNyI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjgKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjgiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyOCI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjkKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjkiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyOSI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMzAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMzAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWczMCI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMzEKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMzEiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWczMSI+OworCisKKy8vIFRleHR1cmUgRmV0Y2gKKy8vIHRleG1vZGVfaW5kZXBlbmRlbnQKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfdjRmMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMWQudjRmMzIuczMyIj47CitkZWYgaW50X252dm1fdGV4XzFkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMWQudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzFkX2xldmVsX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMWQubGV2ZWwudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzFkX2dyYWRfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMWQuZ3JhZC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfdjRzMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjFkLnY0czMyLnMzMiI+OworZGVmIGludF9udnZtX3RleF8xZF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4xZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfbGV2ZWxfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMWQubGV2ZWwudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzFkX2dyYWRfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjFkLmdyYWQudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzFkX3Y0dTMyX3MzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4xZC52NHUzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMWQudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzFkX2xldmVsX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjFkLmxldmVsLnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8xZF9ncmFkX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4xZC5ncmFkLnY0dTMyLmYzMiI+OworCitkZWYgaW50X252dm1fdGV4XzFkX2FycmF5X3Y0ZjMyX3MzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4xZC5hcnJheS52NGYzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfYXJyYXlfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzFkX2FycmF5X2xldmVsX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4xZC5hcnJheS5sZXZlbC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfYXJyYXlfZ3JhZF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkuZ3JhZC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfYXJyYXlfdjRzMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4xZC5hcnJheS52NHMzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfYXJyYXlfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8xZF9hcnJheV9sZXZlbF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LmxldmVsLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8xZF9hcnJheV9ncmFkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkuZ3JhZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfYXJyYXlfdjR1MzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4xZC5hcnJheS52NHUzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfYXJyYXlfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8xZF9hcnJheV9sZXZlbF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LmxldmVsLnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8xZF9hcnJheV9ncmFkX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkuZ3JhZC52NHUzMi5mMzIiPjsKKworZGVmIGludF9udnZtX3RleF8yZF92NGYzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQudjRmMzIuczMyIj47CitkZWYgaW50X252dm1fdGV4XzJkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzJkX2xldmVsX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjJkLmxldmVsLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8yZF9ncmFkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjJkLmdyYWQudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzJkX3Y0czMyX3MzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQudjRzMzIuczMyIj47CitkZWYgaW50X252dm1fdGV4XzJkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjJkLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8yZF9sZXZlbF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQubGV2ZWwudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzJkX2dyYWRfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjJkLmdyYWQudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzJkX3Y0dTMyX3MzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQudjR1MzIuczMyIj47CitkZWYgaW50X252dm1fdGV4XzJkX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjJkLnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8yZF9sZXZlbF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQubGV2ZWwudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzJkX2dyYWRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjJkLmdyYWQudjR1MzIuZjMyIj47CisKK2RlZiBpbnRfbnZ2bV90ZXhfMmRfYXJyYXlfdjRmMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjRmMzIuczMyIj47CitkZWYgaW50X252dm1fdGV4XzJkX2FycmF5X3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4yZC5hcnJheS52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMmRfYXJyYXlfbGV2ZWxfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LmxldmVsLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8yZF9hcnJheV9ncmFkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkuZ3JhZC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMmRfYXJyYXlfdjRzMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LnY0czMyLnMzMiI+OworZGVmIGludF9udnZtX3RleF8yZF9hcnJheV92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8yZF9hcnJheV9sZXZlbF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LmxldmVsLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8yZF9hcnJheV9ncmFkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LmdyYWQudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzJkX2FycmF5X3Y0dTMyX3MzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4yZC5hcnJheS52NHUzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMmRfYXJyYXlfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4yZC5hcnJheS52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMmRfYXJyYXlfbGV2ZWxfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4yZC5hcnJheS5sZXZlbC52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMmRfYXJyYXlfZ3JhZF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4yZC5hcnJheS5ncmFkLnY0dTMyLmYzMiI+OworCitkZWYgaW50X252dm1fdGV4XzNkX3Y0ZjMyX3MzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbXSwgImxsdm0ubnZ2bS50ZXguM2QudjRmMzIuczMyIj47CitkZWYgaW50X252dm1fdGV4XzNkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjNkLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8zZF9sZXZlbF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4zZC5sZXZlbC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfM2RfZ3JhZF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguM2QuZ3JhZC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfM2RfdjRzMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbXSwgImxsdm0ubnZ2bS50ZXguM2QudjRzMzIuczMyIj47CitkZWYgaW50X252dm1fdGV4XzNkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4zZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfM2RfbGV2ZWxfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjNkLmxldmVsLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8zZF9ncmFkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguM2QuZ3JhZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfM2RfdjR1MzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbXSwgImxsdm0ubnZ2bS50ZXguM2QudjR1MzIuczMyIj47CitkZWYgaW50X252dm1fdGV4XzNkX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4zZC52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfM2RfbGV2ZWxfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjNkLmxldmVsLnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8zZF9ncmFkX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguM2QuZ3JhZC52NHUzMi5mMzIiPjsKKworZGVmIGludF9udnZtX3RleF9jdWJlX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LmN1YmUudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X2N1YmVfbGV2ZWxfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguY3ViZS5sZXZlbC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfY3ViZV92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguY3ViZS52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfY3ViZV9sZXZlbF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguY3ViZS5sZXZlbC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfY3ViZV92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguY3ViZS52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfY3ViZV9sZXZlbF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguY3ViZS5sZXZlbC52NHUzMi5mMzIiPjsKKworZGVmIGludF9udnZtX3RleF9jdWJlX2FycmF5X3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC5jdWJlLmFycmF5LnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF9jdWJlX2FycmF5X2xldmVsX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC5jdWJlLmFycmF5LmxldmVsLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF9jdWJlX2FycmF5X3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguY3ViZS5hcnJheS52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfY3ViZV9hcnJheV9sZXZlbF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LmN1YmUuYXJyYXkubGV2ZWwudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X2N1YmVfYXJyYXlfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC5jdWJlLmFycmF5LnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF9jdWJlX2FycmF5X2xldmVsX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguY3ViZS5hcnJheS5sZXZlbC52NHUzMi5mMzIiPjsKKworZGVmIGludF9udnZtX3RsZDRfcl8yZF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGxkNC5yLjJkLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RsZDRfZ18yZF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGxkNC5nLjJkLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RsZDRfYl8yZF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGxkNC5iLjJkLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RsZDRfYV8yZF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGxkNC5hLjJkLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RsZDRfcl8yZF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRsZDQuci4yZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90bGQ0X2dfMmRfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LmcuMmQudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGxkNF9iXzJkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGxkNC5iLjJkLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RsZDRfYV8yZF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRsZDQuYS4yZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90bGQ0X3JfMmRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LnIuMmQudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGxkNF9nXzJkX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGxkNC5nLjJkLnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RsZDRfYl8yZF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRsZDQuYi4yZC52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90bGQ0X2FfMmRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LmEuMmQudjR1MzIuZjMyIj47CisKKworLy8gdGV4bW9kZV91bmlmaWVkCitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfdjRmMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLnY0ZjMyLnMzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzFkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzFkX2xldmVsX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmxldmVsLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzFkX2dyYWRfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmdyYWQudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfdjRzMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC52NHMzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8xZF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfbGV2ZWxfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmxldmVsLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzFkX2dyYWRfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5ncmFkLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzFkX3Y0dTMyX3MzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQudjR1MzIuczMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzFkX2xldmVsX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5sZXZlbC52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8xZF9ncmFkX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuZ3JhZC52NHUzMi5mMzIiPjsKKworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzFkX2FycmF5X3Y0ZjMyX3MzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkudjRmMzIuczMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfYXJyYXlfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzFkX2FycmF5X2xldmVsX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkubGV2ZWwudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfYXJyYXlfZ3JhZF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LmdyYWQudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfYXJyYXlfdjRzMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkudjRzMzIuczMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfYXJyYXlfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV9sZXZlbF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS5sZXZlbC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV9ncmFkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LmdyYWQudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfYXJyYXlfdjR1MzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkudjR1MzIuczMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfYXJyYXlfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV9sZXZlbF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS5sZXZlbC52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV9ncmFkX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LmdyYWQudjR1MzIuZjMyIj47CisKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8yZF92NGYzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0ZjMyLnMzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX2xldmVsX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5sZXZlbC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8yZF9ncmFkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5ncmFkLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX3Y0czMyX3MzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0czMyLnMzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8yZF9sZXZlbF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmxldmVsLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX2dyYWRfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5ncmFkLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX3Y0dTMyX3MzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0dTMyLnMzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8yZF9sZXZlbF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmxldmVsLnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX2dyYWRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5ncmFkLnY0dTMyLmYzMiI+OworCitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMmRfYXJyYXlfdjRmMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LnY0ZjMyLnMzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX2FycmF5X3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMmRfYXJyYXlfbGV2ZWxfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS5sZXZlbC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV9ncmFkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LmdyYWQudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMmRfYXJyYXlfdjRzMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS52NHMzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV9sZXZlbF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS5sZXZlbC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV9ncmFkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS5ncmFkLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX2FycmF5X3Y0dTMyX3MzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkudjR1MzIuczMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMmRfYXJyYXlfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMmRfYXJyYXlfbGV2ZWxfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkubGV2ZWwudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMmRfYXJyYXlfZ3JhZF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkuZ3JhZC52NHUzMi5mMzIiPjsKKworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzNkX3Y0ZjMyX3MzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtdLCAibGx2bS5udnZtLnRleC51bmlmaWVkLjNkLnY0ZjMyLnMzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzNkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8zZF9sZXZlbF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QubGV2ZWwudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfM2RfZ3JhZF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmdyYWQudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfM2RfdjRzMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtdLCAibGx2bS5udnZtLnRleC51bmlmaWVkLjNkLnY0czMyLnMzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzNkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfM2RfbGV2ZWxfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC5sZXZlbC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8zZF9ncmFkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmdyYWQudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfM2RfdjR1MzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtdLCAibGx2bS5udnZtLnRleC51bmlmaWVkLjNkLnY0dTMyLnMzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzNkX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfM2RfbGV2ZWxfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC5sZXZlbC52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8zZF9ncmFkX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmdyYWQudjR1MzIuZjMyIj47CisKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF9jdWJlX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkX2N1YmVfbGV2ZWxfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUubGV2ZWwudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfY3ViZV92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfY3ViZV9sZXZlbF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUubGV2ZWwudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfY3ViZV92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfY3ViZV9sZXZlbF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUubGV2ZWwudjR1MzIuZjMyIj47CisKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF9jdWJlX2FycmF5X3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF9jdWJlX2FycmF5X2xldmVsX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS5sZXZlbC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF9jdWJlX2FycmF5X3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUuYXJyYXkudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfY3ViZV9hcnJheV9sZXZlbF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLmFycmF5LmxldmVsLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkX2N1YmVfYXJyYXlfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF9jdWJlX2FycmF5X2xldmVsX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUuYXJyYXkubGV2ZWwudjR1MzIuZjMyIj47CisKK2RlZiBpbnRfbnZ2bV90bGQ0X3VuaWZpZWRfcl8yZF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuci4yZC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90bGQ0X3VuaWZpZWRfZ18yZF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuZy4yZC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90bGQ0X3VuaWZpZWRfYl8yZF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuYi4yZC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90bGQ0X3VuaWZpZWRfYV8yZF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuYS4yZC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90bGQ0X3VuaWZpZWRfcl8yZF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGxkNC51bmlmaWVkLnIuMmQudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGxkNF91bmlmaWVkX2dfMmRfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRsZDQudW5pZmllZC5nLjJkLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RsZDRfdW5pZmllZF9iXzJkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuYi4yZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90bGQ0X3VuaWZpZWRfYV8yZF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGxkNC51bmlmaWVkLmEuMmQudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGxkNF91bmlmaWVkX3JfMmRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRsZDQudW5pZmllZC5yLjJkLnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RsZDRfdW5pZmllZF9nXzJkX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuZy4yZC52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90bGQ0X3VuaWZpZWRfYl8yZF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGxkNC51bmlmaWVkLmIuMmQudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGxkNF91bmlmaWVkX2FfMmRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRsZDQudW5pZmllZC5hLjJkLnY0dTMyLmYzMiI+OworCisKKy8vPT09IFN1cmZhY2UgTG9hZAorLy8gLmNsYW1wIHZhcmlhbnRzCitkZWYgaW50X252dm1fc3VsZF8xZF9pOF9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5pOC5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfaTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmkxNi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfaTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmkzMi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfaTY0X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmk2NC5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfdjJpOF9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQudjJpOC5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfdjJpMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLnYyaTE2LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92MmkzMl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQudjJpMzIuY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX3YyaTY0X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC52Mmk2NC5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfdjRpOF9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC52NGk4LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92NGkxNl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC52NGkxNi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfdjRpMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQudjRpMzIuY2xhbXAiPjsKKworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfaThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5Lmk4LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV9pMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LmkxNi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfaTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pMzIuY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X2k2NF9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTY0LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92Mmk4X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpOC5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfdjJpMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52MmkxNi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfdjJpMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52MmkzMi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfdjJpNjRfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52Mmk2NC5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfdjRpOF9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpOC5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfdjRpMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTE2LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92NGkzMl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpMzIuY2xhbXAiPjsKKworZGVmIGludF9udnZtX3N1bGRfMmRfaThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmk4LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9pMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmkxNi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfaTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5pMzIuY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2k2NF9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuaTY0LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8yZF92Mmk4X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQudjJpOC5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfdjJpMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC52MmkxNi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfdjJpMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC52MmkzMi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfdjJpNjRfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC52Mmk2NC5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfdjRpOF9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQudjRpOC5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfdjRpMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLnY0aTE2LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8yZF92NGkzMl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQudjRpMzIuY2xhbXAiPjsKKworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfaThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pOC5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfaTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTE2LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV9pMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pMzIuY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X2k2NF9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5Lmk2NC5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfdjJpOF9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52Mmk4LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV92MmkxNl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52MmkxNi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfdjJpMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpMzIuY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X3YyaTY0X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTY0LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV92NGk4X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpOC5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfdjRpMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkxNi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfdjRpMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkzMi5jbGFtcCI+OworCitkZWYgaW50X252dm1fc3VsZF8zZF9pOF9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLmk4LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8zZF9pMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC5pMTYuY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX2kzMl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLmkzMi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfM2RfaTY0X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QuaTY0LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8zZF92Mmk4X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLnYyaTguY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX3YyaTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLnYyaTE2LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8zZF92MmkzMl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC52MmkzMi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfM2RfdjJpNjRfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QudjJpNjQuY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX3Y0aThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC52NGk4LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8zZF92NGkxNl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLnY0aTE2LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8zZF92NGkzMl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLnY0aTMyLmNsYW1wIj47CisKKy8vIC50cmFwIHZhcmlhbnRzCitkZWYgaW50X252dm1fc3VsZF8xZF9pOF90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmk4LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2kxNl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmkxNi50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9pMzJfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5pMzIudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfaTY0X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuaTY0LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX3YyaThfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQudjJpOC50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92MmkxNl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC52MmkxNi50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92MmkzMl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC52MmkzMi50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92Mmk2NF90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC52Mmk2NC50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92NGk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQudjRpOC50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92NGkxNl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLnY0aTE2LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX3Y0aTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQudjRpMzIudHJhcCI+OworCitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV9pOF90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pOC50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV9pMTZfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTE2LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X2kzMl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pMzIudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfaTY0X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5Lmk2NC50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92Mmk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52Mmk4LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X3YyaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52MmkxNi50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92MmkzMl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpMzIudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfdjJpNjRfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTY0LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X3Y0aThfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpOC50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92NGkxNl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGkxNi50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92NGkzMl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGkzMi50cmFwIj47CisKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2k4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmk4LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2kxNl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5pMTYudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmkzMi50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9pNjRfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuaTY0LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX3YyaThfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLnYyaTgudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfdjJpMTZfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLnYyaTE2LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX3YyaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC52MmkzMi50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8yZF92Mmk2NF90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQudjJpNjQudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfdjRpOF90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC52NGk4LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX3Y0aTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLnY0aTE2LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX3Y0aTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLnY0aTMyLnRyYXAiPjsKKworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfaThfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5Lmk4LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X2kxNl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTE2LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X2kzMl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTMyLnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X2k2NF90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTY0LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X3YyaThfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52Mmk4LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X3YyaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpMTYudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfdjJpMzJfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52MmkzMi50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV92Mmk2NF90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTY0LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X3Y0aThfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTgudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfdjRpMTZfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTE2LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X3Y0aTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkzMi50cmFwIj47CisKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX2k4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC5pOC50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8zZF9pMTZfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLmkxNi50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8zZF9pMzJfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLmkzMi50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8zZF9pNjRfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLmk2NC50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8zZF92Mmk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QudjJpOC50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8zZF92MmkxNl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLnYyaTE2LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX3YyaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QudjJpMzIudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfM2RfdjJpNjRfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC52Mmk2NC50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8zZF92NGk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC52NGk4LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX3Y0aTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC52NGkxNi50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8zZF92NGkzMl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QudjRpMzIudHJhcCI+OworCisvLyAuemVybyB2YXJpYW50cworZGVmIGludF9udnZtX3N1bGRfMWRfaThfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5pOC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9pMTZfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5pMTYuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMWRfaTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuaTMyLnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2k2NF96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmk2NC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92Mmk4X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLnYyaTguemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMWRfdjJpMTZfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQudjJpMTYuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMWRfdjJpMzJfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQudjJpMzIuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMWRfdjJpNjRfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQudjJpNjQuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMWRfdjRpOF96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLnY0aTguemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMWRfdjRpMTZfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC52NGkxNi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92NGkzMl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLnY0aTMyLnplcm8iPjsKKworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfaThfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTguemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfaTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LmkxNi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV9pMzJfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTMyLnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X2k2NF96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pNjQuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfdjJpOF96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpOC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92MmkxNl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpMTYuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfdjJpMzJfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTMyLnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X3YyaTY0X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52Mmk2NC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92NGk4X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTguemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfdjRpMTZfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpMTYuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfdjRpMzJfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpMzIuemVybyI+OworCitkZWYgaW50X252dm1fc3VsZF8yZF9pOF96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5pOC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9pMTZfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuaTE2Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2kzMl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5pMzIuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMmRfaTY0X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmk2NC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8yZF92Mmk4X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC52Mmk4Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX3YyaTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC52MmkxNi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8yZF92MmkzMl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQudjJpMzIuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMmRfdjJpNjRfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLnYyaTY0Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX3Y0aThfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQudjRpOC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8yZF92NGkxNl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC52NGkxNi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8yZF92NGkzMl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC52NGkzMi56ZXJvIj47CisKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X2k4X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pOC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV9pMTZfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LmkxNi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV9pMzJfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LmkzMi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV9pNjRfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5Lmk2NC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV92Mmk4X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpOC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV92MmkxNl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTE2Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X3YyaTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpMzIuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfdjJpNjRfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52Mmk2NC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV92NGk4X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGk4Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X3Y0aTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkxNi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV92NGkzMl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpMzIuemVybyI+OworCitkZWYgaW50X252dm1fc3VsZF8zZF9pOF96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QuaTguemVybyI+OworZGVmIGludF9udnZtX3N1bGRfM2RfaTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC5pMTYuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfM2RfaTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC5pMzIuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfM2RfaTY0X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC5pNjQuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfM2RfdjJpOF96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLnYyaTguemVybyI+OworZGVmIGludF9udnZtX3N1bGRfM2RfdjJpMTZfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC52MmkxNi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8zZF92MmkzMl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLnYyaTMyLnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX3YyaTY0X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QudjJpNjQuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfM2RfdjRpOF96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QudjRpOC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8zZF92NGkxNl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QudjRpMTYuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfM2RfdjRpMzJfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLnY0aTMyLnplcm8iPjsKKworLy89PT0tIFRleHR1cmUgUXVlcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIGludF9udnZtX3R4cV9jaGFubmVsX29yZGVyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnR4cS5jaGFubmVsLm9yZGVyIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3R4cV9jaGFubmVsX29yZGVyIj47CitkZWYgaW50X252dm1fdHhxX2NoYW5uZWxfZGF0YV90eXBlCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnR4cS5jaGFubmVsLmRhdGEudHlwZSI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV90eHFfY2hhbm5lbF9kYXRhX3R5cGUiPjsKK2RlZiBpbnRfbnZ2bV90eHFfd2lkdGgKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udHhxLndpZHRoIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3R4cV93aWR0aCI+OworZGVmIGludF9udnZtX3R4cV9oZWlnaHQKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udHhxLmhlaWdodCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV90eHFfaGVpZ2h0Ij47CitkZWYgaW50X252dm1fdHhxX2RlcHRoCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnR4cS5kZXB0aCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV90eHFfZGVwdGgiPjsKK2RlZiBpbnRfbnZ2bV90eHFfYXJyYXlfc2l6ZQorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50eHEuYXJyYXkuc2l6ZSI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV90eHFfYXJyYXlfc2l6ZSI+OworZGVmIGludF9udnZtX3R4cV9udW1fc2FtcGxlcworICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50eHEubnVtLnNhbXBsZXMiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fdHhxX251bV9zYW1wbGVzIj47CitkZWYgaW50X252dm1fdHhxX251bV9taXBtYXBfbGV2ZWxzCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnR4cS5udW0ubWlwbWFwLmxldmVscyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV90eHFfbnVtX21pcG1hcF9sZXZlbHMiPjsKKworLy89PT0tIFN1cmZhY2UgUXVlcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIGludF9udnZtX3N1cV9jaGFubmVsX29yZGVyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1cS5jaGFubmVsLm9yZGVyIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1cV9jaGFubmVsX29yZGVyIj47CitkZWYgaW50X252dm1fc3VxX2NoYW5uZWxfZGF0YV90eXBlCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1cS5jaGFubmVsLmRhdGEudHlwZSI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXFfY2hhbm5lbF9kYXRhX3R5cGUiPjsKK2RlZiBpbnRfbnZ2bV9zdXFfd2lkdGgKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VxLndpZHRoIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1cV93aWR0aCI+OworZGVmIGludF9udnZtX3N1cV9oZWlnaHQKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VxLmhlaWdodCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXFfaGVpZ2h0Ij47CitkZWYgaW50X252dm1fc3VxX2RlcHRoCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1cS5kZXB0aCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXFfZGVwdGgiPjsKK2RlZiBpbnRfbnZ2bV9zdXFfYXJyYXlfc2l6ZQorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXEuYXJyYXkuc2l6ZSI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXFfYXJyYXlfc2l6ZSI+OworCisKKy8vPT09LSBIYW5kbGUgUXVlcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2RlZiBpbnRfbnZ2bV9pc3R5cGVwX3NhbXBsZXIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTFfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5pc3R5cGVwLnNhbXBsZXIiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1faXN0eXBlcF9zYW1wbGVyIj47CitkZWYgaW50X252dm1faXN0eXBlcF9zdXJmYWNlCisgIDogSW50cmluc2ljPFtsbHZtX2kxX3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uaXN0eXBlcC5zdXJmYWNlIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX2lzdHlwZXBfc3VyZmFjZSI+OworZGVmIGludF9udnZtX2lzdHlwZXBfdGV4dHVyZQorICA6IEludHJpbnNpYzxbbGx2bV9pMV90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLmlzdHlwZXAudGV4dHVyZSI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9pc3R5cGVwX3RleHR1cmUiPjsKKworCisKKy8vPT09LSBTdXJmYWNlIFN0b3JlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFVuZm9ybWF0dGVkCisvLyAuY2xhbXAgdmFyaWFudAorZGVmIGludF9udnZtX3N1c3RfYl8xZF9pOF9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuaTguY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2k4X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2kxNl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuaTE2LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9pMTZfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfaTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5pMzIuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2kzMl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9pNjRfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmk2NC5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfaTY0X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3YyaThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC52Mmk4LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF92Mmk4X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3YyaTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpMTYuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX3YyaTE2X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3YyaTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpMzIuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX3YyaTMyX2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3YyaTY0X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpNjQuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX3YyaTY0X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3Y0aThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpOC5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfdjRpOF9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF92NGkxNl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC52NGkxNi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfdjRpMTZfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjRpMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpMzIuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX3Y0aTMyX2NsYW1wIj47CisKKworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV9pOF9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5Lmk4LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV9pOF9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV9pMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pMTYuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X2kxNl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV9pMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pMzIuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X2kzMl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV9pNjRfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pNjQuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X2k2NF9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92Mmk4X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpOC5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpOF9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92MmkxNl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTE2LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV92MmkxNl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92MmkzMl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTMyLmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV92MmkzMl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92Mmk2NF9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTY0LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV92Mmk2NF9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92NGk4X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGk4LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV92NGk4X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3Y0aTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGkxNi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMTZfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTMyLmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV92NGkzMl9jbGFtcCI+OworCisKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfaThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5pOC5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfaThfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfaTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuaTE2LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9pMTZfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfaTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuaTMyLmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9pMzJfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfaTY0X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuaTY0LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9pNjRfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjJpOF9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTguY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX3YyaThfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjJpMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC52MmkxNi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfdjJpMTZfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjJpMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC52MmkzMi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfdjJpMzJfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjJpNjRfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC52Mmk2NC5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfdjJpNjRfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjRpOF9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpOC5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfdjRpOF9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92NGkxNl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpMTYuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX3Y0aTE2X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX3Y0aTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC52NGkzMi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfdjRpMzJfY2xhbXAiPjsKKworCitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X2k4X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTguY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X2k4X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X2kxNl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LmkxNi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTE2X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X2kzMl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LmkzMi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTMyX2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X2k2NF9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5Lmk2NC5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTY0X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3YyaThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpOC5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpOF9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9hcnJheV92MmkxNl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52MmkxNi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMTZfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpMzIuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTMyX2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTY0X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTY0LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV92Mmk2NF9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9hcnJheV92NGk4X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpOC5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpOF9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9hcnJheV92NGkxNl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTE2LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV92NGkxNl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9hcnJheV92NGkzMl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTMyLmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV92NGkzMl9jbGFtcCI+OworCisKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfaThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC5pOC5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfaThfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfaTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuM2QuaTE2LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF9pMTZfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfaTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuM2QuaTMyLmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF9pMzJfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfaTY0X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuM2QuaTY0LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF9pNjRfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjJpOF9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC52Mmk4LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF92Mmk4X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzNkX3YyaTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTE2LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF92MmkxNl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF92MmkzMl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC52MmkzMi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfdjJpMzJfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjJpNjRfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpNjQuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX3YyaTY0X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzNkX3Y0aThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC52NGk4LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF92NGk4X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzNkX3Y0aTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpMTYuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX3Y0aTE2X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzNkX3Y0aTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpMzIuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX3Y0aTMyX2NsYW1wIj47CisKKworLy8gLnRyYXAgdmFyaWFudAorZGVmIGludF9udnZtX3N1c3RfYl8xZF9pOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5pOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9pOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2kxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5pMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfaTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9pMzJfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9pNjRfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuaTY0LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2k2NF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3YyaThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfdjJpOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3YyaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC52MmkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF92MmkxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3YyaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC52MmkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF92MmkzMl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3YyaTY0X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC52Mmk2NC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF92Mmk2NF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3Y0aThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC52NGk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX3Y0aThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF92NGkxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTE2LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX3Y0aTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjRpMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC52NGkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF92NGkzMl90cmFwIj47CisKKworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV9pOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV9pMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV9pMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV9pMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV9pMzJfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV9pNjRfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5Lmk2NC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV9pNjRfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92Mmk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52Mmk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X3YyaThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92MmkxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92MmkzMl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpMzJfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92Mmk2NF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpNjQudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpNjRfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92NGk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3Y0aTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTE2LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X3Y0aTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMzJfdHJhcCI+OworCisKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfaThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2k4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5pMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfaTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5pMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfaTMyX3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfaTY0X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5pNjQudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfaTY0X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjJpOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF92Mmk4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjJpMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTE2LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX3YyaTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjJpMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX3YyaTMyX3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjJpNjRfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTY0LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX3YyaTY0X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjRpOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC52NGk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX3Y0aThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92NGkxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC52NGkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF92NGkxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX3Y0aTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX3Y0aTMyX3RyYXAiPjsKKworCitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X2k4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV9pOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X2kxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTE2LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X2kxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X2kzMl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X2kzMl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X2k2NF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTY0LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X2k2NF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3YyaThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X3YyaThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9hcnJheV92MmkxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTE2LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52MmkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV92MmkzMl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTY0X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpNjQudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpNjRfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9hcnJheV92NGk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9hcnJheV92NGkxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9hcnJheV92NGkzMl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpMzJfdHJhcCI+OworCisKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfaThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLmk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX2k4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC5pMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfaTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC5pMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfaTMyX3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfaTY0X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC5pNjQudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfaTY0X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjJpOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfdjJpOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzNkX3YyaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfdjJpMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF92MmkzMl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX3YyaTMyX3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjJpNjRfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC52Mmk2NC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF92Mmk2NF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzNkX3Y0aThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfdjRpOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzNkX3Y0aTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC52NGkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF92NGkxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzNkX3Y0aTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC52NGkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF92NGkzMl90cmFwIj47CisKKworLy8gLnplcm8gdmFyaWFudAorZGVmIGludF9udnZtX3N1c3RfYl8xZF9pOF96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5pOC56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9pOF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2kxNl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5pMTYuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfaTE2X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfaTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmkzMi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9pMzJfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9pNjRfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuaTY0Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2k2NF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3YyaThfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTguemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfdjJpOF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3YyaTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC52MmkxNi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF92MmkxNl96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3YyaTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC52MmkzMi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF92MmkzMl96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3YyaTY0X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC52Mmk2NC56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF92Mmk2NF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3Y0aThfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC52NGk4Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX3Y0aThfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF92NGkxNl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTE2Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX3Y0aTE2X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjRpMzJfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC52NGkzMi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF92NGkzMl96ZXJvIj47CisKKworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV9pOF96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTguemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaThfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV9pMTZfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkxNi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV9pMTZfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV9pMzJfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkzMi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV9pMzJfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV9pNjRfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5Lmk2NC56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV9pNjRfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92Mmk4X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52Mmk4Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X3YyaThfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92MmkxNl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMTYuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpMTZfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92MmkzMl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMzIuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpMzJfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92Mmk2NF96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpNjQuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpNjRfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92NGk4X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTguemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpOF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3Y0aTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTE2Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X3Y0aTE2X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMzJfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMzIuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMzJfemVybyI+OworCisKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfaThfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmk4Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2k4X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfaTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5pMTYuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfaTE2X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfaTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5pMzIuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfaTMyX3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfaTY0X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5pNjQuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfaTY0X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjJpOF96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpOC56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF92Mmk4X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjJpMTZfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTE2Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX3YyaTE2X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjJpMzJfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTMyLnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX3YyaTMyX3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjJpNjRfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTY0Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX3YyaTY0X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjRpOF96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC52NGk4Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX3Y0aThfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92NGkxNl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC52NGkxNi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF92NGkxNl96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX3Y0aTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTMyLnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX3Y0aTMyX3plcm8iPjsKKworCitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X2k4X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pOC56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV9pOF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X2kxNl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTE2Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X2kxNl96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X2kzMl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTMyLnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X2kzMl96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X2k2NF96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTY0Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X2k2NF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3YyaThfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk4Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X3YyaThfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9hcnJheV92MmkxNl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTE2Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTE2X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMzJfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52MmkzMi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV92MmkzMl96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTY0X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpNjQuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpNjRfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9hcnJheV92NGk4X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGk4Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aThfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9hcnJheV92NGkxNl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpMTYuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpMTZfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9hcnJheV92NGkzMl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpMzIuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpMzJfemVybyI+OworCisKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfaThfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLmk4Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX2k4X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfaTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC5pMTYuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfaTE2X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfaTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC5pMzIuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfaTMyX3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfaTY0X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC5pNjQuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfaTY0X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjJpOF96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTguemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfdjJpOF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzNkX3YyaTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpMTYuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfdjJpMTZfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF92MmkzMl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTMyLnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX3YyaTMyX3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjJpNjRfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC52Mmk2NC56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF92Mmk2NF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzNkX3Y0aThfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTguemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfdjRpOF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzNkX3Y0aTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC52NGkxNi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF92NGkxNl96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzNkX3Y0aTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC52NGkzMi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF92NGkzMl96ZXJvIj47CisKKworCisvLyBGb3JtYXR0ZWQKKworZGVmIGludF9udnZtX3N1c3RfcF8xZF9pOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4xZC5pOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8xZF9pOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzFkX2kxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4xZC5pMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMWRfaTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMWRfaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjFkLmkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8xZF9pMzJfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8xZF92Mmk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4xZC52Mmk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzFkX3YyaThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8xZF92MmkxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMWQudjJpMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMWRfdjJpMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8xZF92MmkzMl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMWQudjJpMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMWRfdjJpMzJfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8xZF92NGk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMWQudjRpOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8xZF92NGk4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMWRfdjRpMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4xZC52NGkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8xZF92NGkxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzFkX3Y0aTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMWQudjRpMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMWRfdjRpMzJfdHJhcCI+OworCisKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMWRfYXJyYXlfaThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5Lmk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzFkX2FycmF5X2k4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMWRfYXJyYXlfaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS5pMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMWRfYXJyYXlfaTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMWRfYXJyYXlfaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS5pMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMWRfYXJyYXlfaTMyX3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjJpOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjJpOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8xZF9hcnJheV92Mmk4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjJpMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LnYyaTE2LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzFkX2FycmF5X3YyaTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjJpMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LnYyaTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzFkX2FycmF5X3YyaTMyX3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjRpOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS52NGk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzFkX2FycmF5X3Y0aThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8xZF9hcnJheV92NGkxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS52NGkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8xZF9hcnJheV92NGkxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzFkX2FycmF5X3Y0aTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LnY0aTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzFkX2FycmF5X3Y0aTMyX3RyYXAiPjsKKworCitkZWYgaW50X252dm1fc3VzdF9wXzJkX2k4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4yZC5pOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8yZF9pOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzJkX2kxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMmQuaTE2LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzJkX2kxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzJkX2kzMl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMmQuaTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzJkX2kzMl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzJkX3YyaThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjJkLnYyaTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMmRfdjJpOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzJkX3YyaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4yZC52MmkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8yZF92MmkxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzJkX3YyaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4yZC52MmkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8yZF92MmkzMl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzJkX3Y0aThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMmQudjRpOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8yZF92NGk4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMmRfdjRpMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMmQudjRpMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMmRfdjRpMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8yZF92NGkzMl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4yZC52NGkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8yZF92NGkzMl90cmFwIj47CisKKworZGVmIGludF9udnZtX3N1c3RfcF8yZF9hcnJheV9pOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkuaTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMmRfYXJyYXlfaThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8yZF9hcnJheV9pMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LmkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8yZF9hcnJheV9pMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8yZF9hcnJheV9pMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LmkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8yZF9hcnJheV9pMzJfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8yZF9hcnJheV92Mmk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjJpOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8yZF9hcnJheV92Mmk4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjJpMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS52MmkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8yZF9hcnJheV92MmkxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzJkX2FycmF5X3YyaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjJpMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjJpMzJfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8yZF9hcnJheV92NGk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS52NGk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzJkX2FycmF5X3Y0aThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8yZF9hcnJheV92NGkxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjRpMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjRpMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8yZF9hcnJheV92NGkzMl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjRpMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjRpMzJfdHJhcCI+OworCisKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfM2RfaThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjNkLmk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzNkX2k4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfM2RfaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4zZC5pMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfM2RfaTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfM2RfaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4zZC5pMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfM2RfaTMyX3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfM2RfdjJpOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjNkLnYyaTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfM2RfdjJpOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzNkX3YyaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuM2QudjJpMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfM2RfdjJpMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8zZF92MmkzMl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjNkLnYyaTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzNkX3YyaTMyX3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfM2RfdjRpOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuM2QudjRpOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8zZF92NGk4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfM2RfdjRpMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjNkLnY0aTE2LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzNkX3Y0aTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfM2RfdjRpMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjNkLnY0aTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzNkX3Y0aTMyX3RyYXAiPjsKKworCitkZWYgaW50X252dm1fcm90YXRlX2IzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0sICJsbHZtLm52dm0ucm90YXRlLmIzMiI+LAorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX252dm1fcm90YXRlX2IzMiI+OworCitkZWYgaW50X252dm1fcm90YXRlX2I2NAorICA6SW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgIFtJbnRyTm9NZW1dLCAibGx2bS5udnZtLnJvdGF0ZS5iNjQiPiwKKyAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX252dm1fcm90YXRlX2I2NCI+OworCitkZWYgaW50X252dm1fcm90YXRlX3JpZ2h0X2I2NAorICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0sICJsbHZtLm52dm0ucm90YXRlLnJpZ2h0LmI2NCI+LAorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX252dm1fcm90YXRlX3JpZ2h0X2I2NCI+OworCitkZWYgaW50X252dm1fc3dhcF9sb19oaV9iNjQKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0sICJsbHZtLm52dm0uc3dhcC5sby5oaS5iNjQiPiwKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19udnZtX3N3YXBfbG9faGlfYjY0Ij47CisKKworLy8gQWNjZXNzaW5nIHNwZWNpYWwgcmVnaXN0ZXJzLgorbXVsdGljbGFzcyBQVFhSZWFkU1JlZ0ludHJpbnNpY192NGkzMjxzdHJpbmcgcmVnbmFtZT4geworLy8gRklYTUU6IERvIHdlIG5lZWQgdGhlIDEyOC1iaXQgaW50ZWdlciB0eXBlIHZlcnNpb24/CisvLyAgICBkZWYgX3I2NCAgIDogSW50cmluc2ljPFtsbHZtX2kxMjhfdHldLCAgIFtdLCBbSW50ck5vTWVtXT47CisKKy8vIEZJWE1FOiBFbmFibGUgdGhpcyBvbmNlIHY0aTMyIHN1cHBvcnQgaXMgZW5hYmxlZCBpbiBiYWNrLWVuZC4KKy8vICAgIGRlZiBfdjRpMTYgOiBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbXSwgW0ludHJOb01lbV0+OworCisgIGRlZiBfeCAgICAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dPiwKKyAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnXyIgIyByZWduYW1lICMgIl94Ij47CisgIGRlZiBfeSAgICAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dPiwKKyAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnXyIgIyByZWduYW1lICMgIl95Ij47CisgIGRlZiBfeiAgICAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dPiwKKyAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnXyIgIyByZWduYW1lICMgIl96Ij47CisgIGRlZiBfdyAgICAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dPiwKKyAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnXyIgIyByZWduYW1lICMgIl93Ij47Cit9CisKK2NsYXNzIFBUWFJlYWRTUmVnSW50cmluc2ljX3IzMjxzdHJpbmcgbmFtZT4KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW1dPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ18iICMgbmFtZT47CisKK2NsYXNzIFBUWFJlYWRTUmVnSW50cmluc2ljX3I2NDxzdHJpbmcgbmFtZT4KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW10sIFtJbnRyTm9NZW1dPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ18iICMgbmFtZT47CisKK2RlZm0gaW50X252dm1fcmVhZF9wdHhfc3JlZ190aWQgOiBQVFhSZWFkU1JlZ0ludHJpbnNpY192NGkzMjwidGlkIj47CitkZWZtIGludF9udnZtX3JlYWRfcHR4X3NyZWdfbnRpZCA6IFBUWFJlYWRTUmVnSW50cmluc2ljX3Y0aTMyPCJudGlkIj47CisKK2RlZiBpbnRfbnZ2bV9yZWFkX3B0eF9zcmVnX2xhbmVpZCA6IFBUWFJlYWRTUmVnSW50cmluc2ljX3IzMjwibGFuZWlkIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ193YXJwaWQgOiBQVFhSZWFkU1JlZ0ludHJpbnNpY19yMzI8IndhcnBpZCI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfbndhcnBpZCA6IFBUWFJlYWRTUmVnSW50cmluc2ljX3IzMjwibndhcnBpZCI+OworCitkZWZtIGludF9udnZtX3JlYWRfcHR4X3NyZWdfY3RhaWQgOiBQVFhSZWFkU1JlZ0ludHJpbnNpY192NGkzMjwiY3RhaWQiPjsKK2RlZm0gaW50X252dm1fcmVhZF9wdHhfc3JlZ19uY3RhaWQgOiBQVFhSZWFkU1JlZ0ludHJpbnNpY192NGkzMjwibmN0YWlkIj47CisKK2RlZiBpbnRfbnZ2bV9yZWFkX3B0eF9zcmVnX3NtaWQgOiBQVFhSZWFkU1JlZ0ludHJpbnNpY19yMzI8InNtaWQiPjsKK2RlZiBpbnRfbnZ2bV9yZWFkX3B0eF9zcmVnX25zbWlkIDogUFRYUmVhZFNSZWdJbnRyaW5zaWNfcjMyPCJuc21pZCI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfZ3JpZGlkIDogUFRYUmVhZFNSZWdJbnRyaW5zaWNfcjMyPCJncmlkaWQiPjsKKworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfbGFuZW1hc2tfZXEgOgorICAgIFBUWFJlYWRTUmVnSW50cmluc2ljX3IzMjwibGFuZW1hc2tfZXEiPjsKK2RlZiBpbnRfbnZ2bV9yZWFkX3B0eF9zcmVnX2xhbmVtYXNrX2xlIDoKKyAgICBQVFhSZWFkU1JlZ0ludHJpbnNpY19yMzI8ImxhbmVtYXNrX2xlIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19sdCA6CisgICAgUFRYUmVhZFNSZWdJbnRyaW5zaWNfcjMyPCJsYW5lbWFza19sdCI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfbGFuZW1hc2tfZ2UgOgorICAgIFBUWFJlYWRTUmVnSW50cmluc2ljX3IzMjwibGFuZW1hc2tfZ2UiPjsKK2RlZiBpbnRfbnZ2bV9yZWFkX3B0eF9zcmVnX2xhbmVtYXNrX2d0IDoKKyAgICBQVFhSZWFkU1JlZ0ludHJpbnNpY19yMzI8ImxhbmVtYXNrX2d0Ij47CisKK2RlZiBpbnRfbnZ2bV9yZWFkX3B0eF9zcmVnX2Nsb2NrIDogUFRYUmVhZFNSZWdJbnRyaW5zaWNfcjMyPCJjbG9jayI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfY2xvY2s2NCA6IFBUWFJlYWRTUmVnSW50cmluc2ljX3I2NDwiY2xvY2s2NCI+OworCitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19wbTAgOiBQVFhSZWFkU1JlZ0ludHJpbnNpY19yMzI8InBtMCI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfcG0xIDogUFRYUmVhZFNSZWdJbnRyaW5zaWNfcjMyPCJwbTEiPjsKK2RlZiBpbnRfbnZ2bV9yZWFkX3B0eF9zcmVnX3BtMiA6IFBUWFJlYWRTUmVnSW50cmluc2ljX3IzMjwicG0yIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19wbTMgOiBQVFhSZWFkU1JlZ0ludHJpbnNpY19yMzI8InBtMyI+OworCitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ193YXJwc2l6ZSA6IFBUWFJlYWRTUmVnSW50cmluc2ljX3IzMjwid2FycHNpemUiPjsKKworLy8KKy8vIFNIVUZGTEUKKy8vCisKKy8vIHNoZmwuZG93bi5iMzIgZGVzdCwgdmFsLCBvZmZzZXQsIG1hc2tfYW5kX2NsYW1wCitkZWYgaW50X252dm1fc2hmbF9kb3duX2kzMiA6CisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS5zaGZsLmRvd24uaTMyIj4sCisgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zaGZsX2Rvd25faTMyIj47CitkZWYgaW50X252dm1fc2hmbF9kb3duX2YzMiA6CisgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5LCBJbnRyQ29udmVyZ2VudF0sICJsbHZtLm52dm0uc2hmbC5kb3duLmYzMiI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fc2hmbF9kb3duX2YzMiI+OworCisvLyBzaGZsLnVwLmIzMiBkZXN0LCB2YWwsIG9mZnNldCwgbWFza19hbmRfY2xhbXAKK2RlZiBpbnRfbnZ2bV9zaGZsX3VwX2kzMiA6CisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS5zaGZsLnVwLmkzMiI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fc2hmbF91cF9pMzIiPjsKK2RlZiBpbnRfbnZ2bV9zaGZsX3VwX2YzMiA6CisgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5LCBJbnRyQ29udmVyZ2VudF0sICJsbHZtLm52dm0uc2hmbC51cC5mMzIiPiwKKyAgR0NDQnVpbHRpbjwiX19udnZtX3NoZmxfdXBfZjMyIj47CisKKy8vIHNoZmwuYmZseS5iMzIgZGVzdCwgdmFsLCBvZmZzZXQsIG1hc2tfYW5kX2NsYW1wCitkZWYgaW50X252dm1fc2hmbF9iZmx5X2kzMiA6CisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS5zaGZsLmJmbHkuaTMyIj4sCisgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zaGZsX2JmbHlfaTMyIj47CitkZWYgaW50X252dm1fc2hmbF9iZmx5X2YzMiA6CisgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5LCBJbnRyQ29udmVyZ2VudF0sICJsbHZtLm52dm0uc2hmbC5iZmx5LmYzMiI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fc2hmbF9iZmx5X2YzMiI+OworCisvLyBzaGZsLmlkeC5iMzIgZGVzdCwgdmFsLCBsYW5lLCBtYXNrX2FuZF9jbGFtcAorZGVmIGludF9udnZtX3NoZmxfaWR4X2kzMiA6CisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS5zaGZsLmlkeC5pMzIiPiwKKyAgR0NDQnVpbHRpbjwiX19udnZtX3NoZmxfaWR4X2kzMiI+OworZGVmIGludF9udnZtX3NoZmxfaWR4X2YzMiA6CisgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5LCBJbnRyQ29udmVyZ2VudF0sICJsbHZtLm52dm0uc2hmbC5pZHguZjMyIj4sCisgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zaGZsX2lkeF9mMzIiPjsKKworLy8gU3luY2hyb25pemluZyBzaGZsIHZhcmlhbnRzIGF2YWlsYWJsZSBpbiBDVURBLTkuCisvLyBPbiBzbV83MCB0aGVzZSBkb24ndCBoYXZlIHRvIGJlIGNvbnZlcmdlbnQsIHNvIHdlIG1heSBldmVudHVhbGx5IHdhbnQgdG8KKy8vIGltcGxlbWVudCBub24tY29udmVyZ2VudCB2YXJpYW50IG9mIHRoaXMgaW50cmluc2ljLgorCisvLyBzaGZsLnN5bmMuZG93bi5iMzIgZGVzdCwgdGhyZWFkbWFzaywgdmFsLCBvZmZzZXQgLCBtYXNrX2FuZF9jbGFtcAorZGVmIGludF9udnZtX3NoZmxfc3luY19kb3duX2kzMiA6CisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5LCBJbnRyQ29udmVyZ2VudF0sICJsbHZtLm52dm0uc2hmbC5zeW5jLmRvd24uaTMyIj4sCisgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zaGZsX3N5bmNfZG93bl9pMzIiPjsKK2RlZiBpbnRfbnZ2bV9zaGZsX3N5bmNfZG93bl9mMzIgOgorICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS5zaGZsLnN5bmMuZG93bi5mMzIiPiwKKyAgR0NDQnVpbHRpbjwiX19udnZtX3NoZmxfc3luY19kb3duX2YzMiI+OworCisvLyBzaGZsLnN5bmMudXAuYjMyIGRlc3QsIHRocmVhZG1hc2ssIHZhbCwgb2Zmc2V0LCBtYXNrX2FuZF9jbGFtcAorZGVmIGludF9udnZtX3NoZmxfc3luY191cF9pMzIgOgorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ckNvbnZlcmdlbnRdLCAibGx2bS5udnZtLnNoZmwuc3luYy51cC5pMzIiPiwKKyAgR0NDQnVpbHRpbjwiX19udnZtX3NoZmxfc3luY191cF9pMzIiPjsKK2RlZiBpbnRfbnZ2bV9zaGZsX3N5bmNfdXBfZjMyIDoKKyAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5LCBJbnRyQ29udmVyZ2VudF0sICJsbHZtLm52dm0uc2hmbC5zeW5jLnVwLmYzMiI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fc2hmbF9zeW5jX3VwX2YzMiI+OworCisvLyBzaGZsLnN5bmMuYmZseS5iMzIgZGVzdCwgdGhyZWFkbWFzaywgdmFsLCBvZmZzZXQsIG1hc2tfYW5kX2NsYW1wCitkZWYgaW50X252dm1fc2hmbF9zeW5jX2JmbHlfaTMyIDoKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS5zaGZsLnN5bmMuYmZseS5pMzIiPiwKKyAgR0NDQnVpbHRpbjwiX19udnZtX3NoZmxfc3luY19iZmx5X2kzMiI+OworZGVmIGludF9udnZtX3NoZmxfc3luY19iZmx5X2YzMiA6CisgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ckNvbnZlcmdlbnRdLCAibGx2bS5udnZtLnNoZmwuc3luYy5iZmx5LmYzMiI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fc2hmbF9zeW5jX2JmbHlfZjMyIj47CisKKy8vIHNoZmwuc3luYy5pZHguYjMyIGRlc3QsIHRocmVhZG1hc2ssIHZhbCwgbGFuZSwgbWFza19hbmRfY2xhbXAKK2RlZiBpbnRfbnZ2bV9zaGZsX3N5bmNfaWR4X2kzMiA6CisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5LCBJbnRyQ29udmVyZ2VudF0sICJsbHZtLm52dm0uc2hmbC5zeW5jLmlkeC5pMzIiPiwKKyAgR0NDQnVpbHRpbjwiX19udnZtX3NoZmxfc3luY19pZHhfaTMyIj47CitkZWYgaW50X252dm1fc2hmbF9zeW5jX2lkeF9mMzIgOgorICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS5zaGZsLnN5bmMuaWR4LmYzMiI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fc2hmbF9zeW5jX2lkeF9mMzIiPjsKKworLy8KKy8vIFZPVEUKKy8vCisKKy8vIHZvdGUuYWxsIHByZWQKK2RlZiBpbnRfbnZ2bV92b3RlX2FsbCA6CisgIEludHJpbnNpYzxbbGx2bV9pMV90eV0sIFtsbHZtX2kxX3R5XSwKKyAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ckNvbnZlcmdlbnRdLCAibGx2bS5udnZtLnZvdGUuYWxsIj4sCisgIEdDQ0J1aWx0aW48Il9fbnZ2bV92b3RlX2FsbCI+OworLy8gdm90ZS5hbnkgcHJlZAorZGVmIGludF9udnZtX3ZvdGVfYW55IDoKKyAgSW50cmluc2ljPFtsbHZtX2kxX3R5XSwgW2xsdm1faTFfdHldLAorICAgICAgICAgICAgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5LCBJbnRyQ29udmVyZ2VudF0sICJsbHZtLm52dm0udm90ZS5hbnkiPiwKKyAgR0NDQnVpbHRpbjwiX19udnZtX3ZvdGVfYW55Ij47CisvLyB2b3RlLnVuaSBwcmVkCitkZWYgaW50X252dm1fdm90ZV91bmkgOgorICBJbnRyaW5zaWM8W2xsdm1faTFfdHldLCBbbGx2bV9pMV90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS52b3RlLnVuaSI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fdm90ZV91bmkiPjsKKy8vIHZvdGUuYmFsbG90IHByZWQKK2RlZiBpbnRfbnZ2bV92b3RlX2JhbGxvdCA6CisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMV90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS52b3RlLmJhbGxvdCI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fdm90ZV9iYWxsb3QiPjsKKworLy8KKy8vIFZPVEUuU1lOQworLy8KKworLy8gdm90ZS5zeW5jLmFsbCBtYXNrLCBwcmVkCitkZWYgaW50X252dm1fdm90ZV9hbGxfc3luYyA6CisgIEludHJpbnNpYzxbbGx2bV9pMV90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMV90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS52b3RlLmFsbC5zeW5jIj4sCisgIEdDQ0J1aWx0aW48Il9fbnZ2bV92b3RlX2FsbF9zeW5jIj47CisvLyB2b3RlLnN5bmMuYW55IG1hc2ssIHByZWQKK2RlZiBpbnRfbnZ2bV92b3RlX2FueV9zeW5jIDoKKyAgSW50cmluc2ljPFtsbHZtX2kxX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kxX3R5XSwKKyAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ckNvbnZlcmdlbnRdLCAibGx2bS5udnZtLnZvdGUuYW55LnN5bmMiPiwKKyAgR0NDQnVpbHRpbjwiX19udnZtX3ZvdGVfYW55X3N5bmMiPjsKKy8vIHZvdGUuc3luYy51bmkgbWFzaywgcHJlZAorZGVmIGludF9udnZtX3ZvdGVfdW5pX3N5bmMgOgorICBJbnRyaW5zaWM8W2xsdm1faTFfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTFfdHldLAorICAgICAgICAgICAgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5LCBJbnRyQ29udmVyZ2VudF0sICJsbHZtLm52dm0udm90ZS51bmkuc3luYyI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fdm90ZV91bmlfc3luYyI+OworLy8gdm90ZS5zeW5jLmJhbGxvdCBtYXNrLCBwcmVkCitkZWYgaW50X252dm1fdm90ZV9iYWxsb3Rfc3luYyA6CisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTFfdHldLAorICAgICAgICAgICAgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5LCBJbnRyQ29udmVyZ2VudF0sICJsbHZtLm52dm0udm90ZS5iYWxsb3Quc3luYyI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fdm90ZV9iYWxsb3Rfc3luYyI+OworCisvLworLy8gTUFUQ0guU1lOQworLy8KKy8vIG1hdGNoLmFueS5zeW5jLmIzMiBtYXNrLCB2YWx1ZQorZGVmIGludF9udnZtX21hdGNoX2FueV9zeW5jX2kzMiA6CisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ckNvbnZlcmdlbnRdLCAibGx2bS5udnZtLm1hdGNoLmFueS5zeW5jLmkzMiI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fbWF0Y2hfYW55X3N5bmNfaTMyIj47CisvLyBtYXRjaC5hbnkuc3luYy5iNjQgbWFzaywgdmFsdWUKK2RlZiBpbnRfbnZ2bV9tYXRjaF9hbnlfc3luY19pNjQgOgorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS5tYXRjaC5hbnkuc3luYy5pNjQiPiwKKyAgR0NDQnVpbHRpbjwiX19udnZtX21hdGNoX2FueV9zeW5jX2k2NCI+OworCisvLyBtYXRjaC5hbGwgaW5zdHJ1Y3Rpb24gaGF2ZSB0d28gdmFyaWFudHMgLS0gb25lIHJldHVybnMgYSBzaW5nbGUgdmFsdWUsIGFub3RoZXIKKy8vIHJldHVybnMgYSBwYWlyIHt2YWx1ZSwgcHJlZGljYXRlfS4gV2UgY3VycmVudGx5IG9ubHkgaW1wbGVtZW50IHRoZSBsYXR0ZXIgYXMKKy8vIHRoYXQncyB0aGUgdmFyaWFudCBleHBvc2VkIGJ5IENVREEgQVBJLgorCisvLyBtYXRjaC5hbGwuc3luYy5iMzJwIG1hc2ssIHZhbHVlCitkZWYgaW50X252dm1fbWF0Y2hfYWxsX3N5bmNfaTMycCA6CisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTFfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ckNvbnZlcmdlbnRdLCAibGx2bS5udnZtLm1hdGNoLmFsbC5zeW5jLmkzMnAiPjsKKy8vIG1hdGNoLmFsbC5zeW5jLmI2NHAgbWFzaywgdmFsdWUKK2RlZiBpbnRfbnZ2bV9tYXRjaF9hbGxfc3luY19pNjRwIDoKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eSwgbGx2bV9pMV90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5LCBJbnRyQ29udmVyZ2VudF0sICJsbHZtLm52dm0ubWF0Y2guYWxsLnN5bmMuaTY0cCI+OworCisvLworLy8gV01NQSBpbnN0cnVjdGlvbnMKKy8vCisKKy8vIFdNTUEuTE9BRAorY2xhc3MgTlZWTV9XTU1BX0xEX0dBTFNUUzxzdHJpbmcgR2VvbWV0cnksIHN0cmluZyBBYmMsIHN0cmluZyBMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBUeXBlLCBMTFZNVHlwZSByZWd0eSwgaW50IFdpdGhTdHJpZGU+CisgIDogSW50cmluc2ljPCFpZighZXEoQWJjI1R5cGUsImNmMTYiKSwKKyAgICAgICAgICAgICAgICAgIFtyZWd0eSwgcmVndHksIHJlZ3R5LCByZWd0eV0sCisgICAgICAgICAgICAgICAgICBbcmVndHksIHJlZ3R5LCByZWd0eSwgcmVndHksCisgICAgICAgICAgICAgICAgICAgcmVndHksIHJlZ3R5LCByZWd0eSwgcmVndHldKSwKKyAgICAgICAgICAgICAgIWlmKFdpdGhTdHJpZGUsIFtsbHZtX2FueXB0cl90eSwgbGx2bV9pMzJfdHldLCBbbGx2bV9hbnlwdHJfdHldKSwKKyAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seSwgUmVhZE9ubHk8MD4sIE5vQ2FwdHVyZTwwPl0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ud21tYS4iCisgICAgICAgICAgICAgICAgIyBHZW9tZXRyeQorICAgICAgICAgICAgICAgICMgIi5sb2FkIgorICAgICAgICAgICAgICAgICMgIi4iICMgQWJjCisgICAgICAgICAgICAgICAgIyAiLiIgIyBMYXlvdXQKKyAgICAgICAgICAgICAgICAjICFpZihXaXRoU3RyaWRlLCAiLnN0cmlkZSIsICIiKQorICAgICAgICAgICAgICAgICMgIi4iICMgVHlwZT47CisKK211bHRpY2xhc3MgTlZWTV9XTU1BX0xEX0dBTFQ8c3RyaW5nIEdlb21ldHJ5LCBzdHJpbmcgQWJjLCBzdHJpbmcgTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgVHlwZSwgTExWTVR5cGUgcmVndHk+IHsKKyAgZGVmIF9zdHJpZGU6IE5WVk1fV01NQV9MRF9HQUxTVFM8R2VvbWV0cnksIEFiYywgTGF5b3V0LCBUeXBlLCByZWd0eSwgMT47CisgIGRlZiBOQU1FICAgOiBOVlZNX1dNTUFfTERfR0FMU1RTPEdlb21ldHJ5LCBBYmMsIExheW91dCwgVHlwZSwgcmVndHksIDA+OworfQorCittdWx0aWNsYXNzIE5WVk1fV01NQV9MRF9HQVQ8c3RyaW5nIEdlb21ldHJ5LCBzdHJpbmcgQWJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIFR5cGUsIExMVk1UeXBlIHJlZ3R5PiB7CisgIGRlZm0gX3JvdzogTlZWTV9XTU1BX0xEX0dBTFQ8R2VvbWV0cnksIEFiYywgInJvdyIsIFR5cGUsIHJlZ3R5PjsKKyAgZGVmbSBfY29sOiBOVlZNX1dNTUFfTERfR0FMVDxHZW9tZXRyeSwgQWJjLCAiY29sIiwgVHlwZSwgcmVndHk+OworfQorCittdWx0aWNsYXNzIE5WVk1fV01NQV9MRF9HPHN0cmluZyBHZW9tZXRyeT4geworICBkZWZtIF9hX2YxNjogTlZWTV9XTU1BX0xEX0dBVDxHZW9tZXRyeSwgImEiLCAiZjE2IiwgbGx2bV92MmYxNl90eT47CisgIGRlZm0gX2JfZjE2OiBOVlZNX1dNTUFfTERfR0FUPEdlb21ldHJ5LCAiYiIsICJmMTYiLCBsbHZtX3YyZjE2X3R5PjsKKyAgZGVmbSBfY19mMTY6IE5WVk1fV01NQV9MRF9HQVQ8R2VvbWV0cnksICJjIiwgImYxNiIsIGxsdm1fdjJmMTZfdHk+OworICBkZWZtIF9jX2YzMjogTlZWTV9XTU1BX0xEX0dBVDxHZW9tZXRyeSwgImMiLCAiZjMyIiwgbGx2bV9mbG9hdF90eT47Cit9CisKK211bHRpY2xhc3MgTlZWTV9XTU1BX0xEIHsKKyAgZGVmbSBfbTE2bjE2azE2X2xvYWQ6IE5WVk1fV01NQV9MRF9HPCJtMTZuMTZrMTYiPjsKK30KKworZGVmbSBpbnRfbnZ2bV93bW1hOiBOVlZNX1dNTUFfTEQ7CisKKy8vIFdNTUEuU1RPUkUuRAorY2xhc3MgTlZWTV9XTU1BX1NURF9HTFNUUzxzdHJpbmcgR2VvbWV0cnksIHN0cmluZyBMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBUeXBlLCBMTFZNVHlwZSByZWd0eSwgaW50IFdpdGhTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgb25seSB1c2VkIHRvIGNyZWF0ZSBhIHR5cGVkIGVtcHR5IGFycmF5IHdlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gcGFzcyB0byAhaWYgYmVsb3cuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Q8TExWTVR5cGU+RW1wdHk9W10+CisgIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAhbGlzdGNvbmNhdCgKKyAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICFpZighZXEoVHlwZSwiZjE2IiksCisgICAgICAgICAgICAgICAgICAgIFtyZWd0eSwgcmVndHksIHJlZ3R5LCByZWd0eV0sCisgICAgICAgICAgICAgICAgICAgIFtyZWd0eSwgcmVndHksIHJlZ3R5LCByZWd0eSwKKyAgICAgICAgICAgICAgICAgICAgIHJlZ3R5LCByZWd0eSwgcmVndHksIHJlZ3R5XSksCisgICAgICAgICAgICAgICAgIWlmKFdpdGhTdHJpZGUsIFtsbHZtX2kzMl90eV0sIEVtcHR5KSksCisgICAgICAgICAgICAgIFtJbnRyV3JpdGVNZW0sIEludHJBcmdNZW1Pbmx5LCBXcml0ZU9ubHk8MD4sIE5vQ2FwdHVyZTwwPl0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ud21tYS4iCisgICAgICAgICAgICAgICAgICAgIyBHZW9tZXRyeQorICAgICAgICAgICAgICAgICAgICMgIi5zdG9yZS5kIgorICAgICAgICAgICAgICAgICAgICMgIi4iICMgTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIyAhaWYoV2l0aFN0cmlkZSwgIi5zdHJpZGUiLCAiIikKKyAgICAgICAgICAgICAgICAgICAjICIuIiAjIFR5cGU+OworCittdWx0aWNsYXNzIE5WVk1fV01NQV9TVERfR0xUPHN0cmluZyBHZW9tZXRyeSwgc3RyaW5nIExheW91dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBUeXBlLCBMTFZNVHlwZSByZWd0eT4geworICBkZWYgX3N0cmlkZTogTlZWTV9XTU1BX1NURF9HTFNUUzxHZW9tZXRyeSwgTGF5b3V0LCBUeXBlLCByZWd0eSwgMT47CisgIGRlZiBOQU1FOiAgICBOVlZNX1dNTUFfU1REX0dMU1RTPEdlb21ldHJ5LCBMYXlvdXQsIFR5cGUsIHJlZ3R5LCAwPjsKK30KKworbXVsdGljbGFzcyBOVlZNX1dNTUFfU1REX0dUPHN0cmluZyBHZW9tZXRyeSwgc3RyaW5nIFR5cGUsIExMVk1UeXBlIHJlZ3R5PiB7CisgIGRlZm0gX3JvdzogTlZWTV9XTU1BX1NURF9HTFQ8R2VvbWV0cnksICJyb3ciLCBUeXBlLCByZWd0eT47CisgIGRlZm0gX2NvbDogTlZWTV9XTU1BX1NURF9HTFQ8R2VvbWV0cnksICJjb2wiLCBUeXBlLCByZWd0eT47Cit9CittdWx0aWNsYXNzIE5WVk1fV01NQV9TVERfRzxzdHJpbmcgR2VvbWV0cnk+IHsKKyAgZGVmbSBfZF9mMTY6IE5WVk1fV01NQV9TVERfR1Q8R2VvbWV0cnksICJmMTYiLCBsbHZtX3YyZjE2X3R5PjsKKyAgZGVmbSBfZF9mMzI6IE5WVk1fV01NQV9TVERfR1Q8R2VvbWV0cnksICJmMzIiLCBsbHZtX2Zsb2F0X3R5PjsKK30KKworbXVsdGljbGFzcyBOVlZNX1dNTUFfU1REIHsKKyAgZGVmbSBfbTE2bjE2azE2X3N0b3JlOiBOVlZNX1dNTUFfU1REX0c8Im0xNm4xNmsxNiI+OworfQorCitkZWZtIGludF9udnZtX3dtbWE6IE5WVk1fV01NQV9TVEQ7CisKKy8vIFdNTUEuTU1BCitjbGFzcyBOVlZNX1dNTUFfTU1BX0dBQkRDUzxzdHJpbmcgR2VvbWV0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgQUxheW91dCwgc3RyaW5nIEJMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgRFR5cGUsIExMVk1UeXBlIGRfcmVndHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgQ1R5cGUsIExMVk1UeXBlIGNfcmVndHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgU2F0ZmluaXRlID0gIiI+CisgIDogSW50cmluc2ljPCFpZighZXEoRFR5cGUsImYxNiIpLAorICAgICAgICAgICAgICAgICAgICAgIFtkX3JlZ3R5LCBkX3JlZ3R5LCBkX3JlZ3R5LCBkX3JlZ3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICBbZF9yZWd0eSwgZF9yZWd0eSwgZF9yZWd0eSwgZF9yZWd0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgZF9yZWd0eSwgZF9yZWd0eSwgZF9yZWd0eSwgZF9yZWd0eV0pLAorICAgICAgICAgICAgICAhbGlzdGNvbmNhdCgKKyAgICAgICAgICAgICAgICBbLy8gQQorICAgICAgICAgICAgICAgIGxsdm1fdjJmMTZfdHksIGxsdm1fdjJmMTZfdHksIGxsdm1fdjJmMTZfdHksIGxsdm1fdjJmMTZfdHksCisgICAgICAgICAgICAgICAgbGx2bV92MmYxNl90eSwgbGx2bV92MmYxNl90eSwgbGx2bV92MmYxNl90eSwgbGx2bV92MmYxNl90eSwKKyAgICAgICAgICAgICAgICAvLyBCCisgICAgICAgICAgICAgICAgbGx2bV92MmYxNl90eSwgbGx2bV92MmYxNl90eSwgbGx2bV92MmYxNl90eSwgbGx2bV92MmYxNl90eSwKKyAgICAgICAgICAgICAgICBsbHZtX3YyZjE2X3R5LCBsbHZtX3YyZjE2X3R5LCBsbHZtX3YyZjE2X3R5LCBsbHZtX3YyZjE2X3R5XSwKKyAgICAgICAgICAgICAgICAhaWYoIWVxKENUeXBlLCJmMTYiKSwKKyAgICAgICAgICAgICAgICAgICAgICBbY19yZWd0eSwgY19yZWd0eSwgY19yZWd0eSwgY19yZWd0eV0sCisgICAgICAgICAgICAgICAgICAgICAgW2NfcmVndHksIGNfcmVndHksIGNfcmVndHksIGNfcmVndHksCisgICAgICAgICAgICAgICAgICAgICAgIGNfcmVndHksIGNfcmVndHksIGNfcmVndHksIGNfcmVndHldKSksCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLndtbWEuIgorICAgICAgICAgICAgICAgICMgR2VvbWV0cnkKKyAgICAgICAgICAgICAgICAjICIubW1hIgorICAgICAgICAgICAgICAgICMgIi4iICMgQUxheW91dAorICAgICAgICAgICAgICAgICMgIi4iICMgQkxheW91dAorICAgICAgICAgICAgICAgICMgIi4iICMgRFR5cGUKKyAgICAgICAgICAgICAgICAjICIuIiAjIENUeXBlCisgICAgICAgICAgICAgICAgIyBTYXRmaW5pdGU+IHsKK30KKworbXVsdGljbGFzcyBOVlZNX1dNTUFfTU1BX0dBQkRDPHN0cmluZyBHZW9tZXRyeSwgc3RyaW5nIEFMYXlvdXQsIHN0cmluZyBCTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBEVHlwZSwgTExWTVR5cGUgZF9yZWd0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgQ1R5cGUsIExMVk1UeXBlIGNfcmVndHk+IHsKKyAgZGVmIE5BTUUgOiBOVlZNX1dNTUFfTU1BX0dBQkRDUzxHZW9tZXRyeSwgQUxheW91dCwgQkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVHlwZSwgZF9yZWd0eSwgQ1R5cGUsIGNfcmVndHk+OworICBkZWYgX3NhdGZpbml0ZTogTlZWTV9XTU1BX01NQV9HQUJEQ1M8R2VvbWV0cnksIEFMYXlvdXQsIEJMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVHlwZSwgZF9yZWd0eSwgQ1R5cGUsIGNfcmVndHksIi5zYXRmaW5pdGUiPjsKK30KKworbXVsdGljbGFzcyBOVlZNX1dNTUFfTU1BX0dBQkQ8c3RyaW5nIEdlb21ldHJ5LCBzdHJpbmcgQUxheW91dCwgc3RyaW5nIEJMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgRFR5cGUsIExMVk1UeXBlIGRfcmVndHk+IHsKKyAgZGVmbSBfZjE2OiBOVlZNX1dNTUFfTU1BX0dBQkRDPEdlb21ldHJ5LCBBTGF5b3V0LCBCTGF5b3V0LCBEVHlwZSwgZF9yZWd0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYxNiIsIGxsdm1fdjJmMTZfdHk+OworICBkZWZtIF9mMzI6IE5WVk1fV01NQV9NTUFfR0FCREM8R2VvbWV0cnksIEFMYXlvdXQsIEJMYXlvdXQsIERUeXBlLCBkX3JlZ3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZjMyIiwgbGx2bV9mbG9hdF90eT47Cit9CisKK211bHRpY2xhc3MgTlZWTV9XTU1BX01NQV9HQUI8c3RyaW5nIEdlb21ldHJ5LCBzdHJpbmcgQUxheW91dCwgc3RyaW5nIEJMYXlvdXQ+IHsKKyAgZGVmbSBfZjE2OiBOVlZNX1dNTUFfTU1BX0dBQkQ8R2VvbWV0cnksIEFMYXlvdXQsIEJMYXlvdXQsICJmMTYiLCBsbHZtX3YyZjE2X3R5PjsKKyAgZGVmbSBfZjMyOiBOVlZNX1dNTUFfTU1BX0dBQkQ8R2VvbWV0cnksIEFMYXlvdXQsIEJMYXlvdXQsICJmMzIiLCBsbHZtX2Zsb2F0X3R5PjsKK30KKworbXVsdGljbGFzcyBOVlZNX1dNTUFfTU1BX0dBPHN0cmluZyBHZW9tZXRyeSwgc3RyaW5nIEFMYXlvdXQ+IHsKKyAgZGVmbSBfY29sOiBOVlZNX1dNTUFfTU1BX0dBQjxHZW9tZXRyeSwgQUxheW91dCwgImNvbCI+OworICBkZWZtIF9yb3c6IE5WVk1fV01NQV9NTUFfR0FCPEdlb21ldHJ5LCBBTGF5b3V0LCAicm93Ij47Cit9CisKK211bHRpY2xhc3MgTlZWTV9XTU1BX01NQV9HPHN0cmluZyBHZW9tZXRyeT4geworICBkZWZtIF9jb2w6IE5WVk1fV01NQV9NTUFfR0E8R2VvbWV0cnksICJjb2wiPjsKKyAgZGVmbSBfcm93OiBOVlZNX1dNTUFfTU1BX0dBPEdlb21ldHJ5LCAicm93Ij47Cit9CisKK211bHRpY2xhc3MgTlZWTV9XTU1BX01NQSB7CisgIGRlZm0gX20xNm4xNmsxNl9tbWEgOiBOVlZNX1dNTUFfTU1BX0c8Im0xNm4xNmsxNiI+OworfQorCitkZWZtIGludF9udnZtX3dtbWEgOiBOVlZNX1dNTUFfTU1BOworCit9IC8vIGxldCBUYXJnZXRQcmVmaXggPSAibnZ2bSIKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc1Bvd2VyUEMudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NQb3dlclBDLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMjFiYjgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NQb3dlclBDLnRkCkBAIC0wLDAgKzEsMTEzNyBAQAorLy89PT0tIEludHJpbnNpY3NQb3dlclBDLnRkIC0gRGVmaW5lcyBQb3dlclBDIGludHJpbnNpY3MgLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vIAorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8gCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFsbCBvZiB0aGUgUG93ZXJQQy1zcGVjaWZpYyBpbnRyaW5zaWNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBEZWZpbml0aW9ucyBmb3IgYWxsIFBvd2VyUEMgaW50cmluc2ljcy4KKy8vCisKKy8vIE5vbi1hbHRpdmVjIGludHJpbnNpY3MuCitsZXQgVGFyZ2V0UHJlZml4ID0gInBwYyIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS5wcGMuIi4KKyAgLy8gZGNiYS9kY2JmL2RjYmkvZGNic3QvZGNidC9kY2J6L2RjYnpsKFBQQzk3MCkgaW5zdHJ1Y3Rpb25zLgorICBkZWYgaW50X3BwY19kY2JhICA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10+OworICBkZWYgaW50X3BwY19kY2JmICA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10+OworICBkZWYgaW50X3BwY19kY2JpICA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10+OworICBkZWYgaW50X3BwY19kY2JzdCA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10+OworICBkZWYgaW50X3BwY19kY2J0ICA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwKKyAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3BwY19kY2J0c3Q6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwKKyAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3BwY19kY2J6ICA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10+OworICBkZWYgaW50X3BwY19kY2J6bCA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10+OworCisgIC8vIHN5bmMgaW5zdHJ1Y3Rpb24gKGkuZS4gc3luYyAwLCBhLmsuYSBod3N5bmMpCisgIGRlZiBpbnRfcHBjX3N5bmMgOiBJbnRyaW5zaWM8W10sIFtdLCBbXT47CisgIC8vIGx3c3luYyBpcyBzeW5jIDEKKyAgZGVmIGludF9wcGNfbHdzeW5jIDogSW50cmluc2ljPFtdLCBbXSwgW10+OworCisgIC8vIEludHJpbnNpY3MgdXNlZCB0byBnZW5lcmF0ZSBjdHItYmFzZWQgbG9vcHMuIFRoZXNlIHNob3VsZCBvbmx5IGJlCisgIC8vIGdlbmVyYXRlZCBieSB0aGUgUG93ZXJQQyBiYWNrZW5kIQorICBkZWYgaW50X3BwY19tdGN0ciA6IEludHJpbnNpYzxbXSwgW2xsdm1fYW55aW50X3R5XSwgW10+OworICBkZWYgaW50X3BwY19pc19kZWNyZW1lbnRlZF9jdHJfbm9uemVybyA6IEludHJpbnNpYzxbbGx2bV9pMV90eV0sIFtdLCBbXT47CisKKyAgLy8gSW50cmluc2ljcyBmb3IgW2RvdWJsZV13b3JkIGV4dGVuZGVkIGZvcm1zIG9mIGRpdmlkZSBpbnN0cnVjdGlvbnMKKyAgZGVmIGludF9wcGNfZGl2d2UgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fZGl2d2UiPiwKKyAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfZGl2d2V1IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2RpdndldSI+LAorICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2RpdmRlIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2RpdmRlIj4sCisgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2RpdmRldSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9kaXZkZXUiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIC8vIEJpdCBwZXJtdXRlIGRvdWJsZXdvcmQKKyAgZGVmIGludF9wcGNfYnBlcm1kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2JwZXJtZCI+LAorICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKworbGV0IFRhcmdldFByZWZpeCA9ICJwcGMiIGluIHsgIC8vIEFsbCBQUEMgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLnBwYy4iLgorICAvLy8gUG93ZXJQQ19WZWNfSW50cmluc2ljIC0gQmFzZSBjbGFzcyBmb3IgYWxsIGFsdGl2ZWMgaW50cmluc2ljcy4KKyAgY2xhc3MgUG93ZXJQQ19WZWNfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXgsIGxpc3Q8TExWTVR5cGU+IHJldF90eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Q8TExWTVR5cGU+IHBhcmFtX3R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDxJbnRyaW5zaWNQcm9wZXJ0eT4gcHJvcGVydGllcz4KKyAgICA6IEdDQ0J1aWx0aW48IXN0cmNvbmNhdCgiX19idWlsdGluX2FsdGl2ZWNfIiwgR0NDSW50U3VmZml4KT4sCisgICAgICBJbnRyaW5zaWM8cmV0X3R5cGVzLCBwYXJhbV90eXBlcywgcHJvcGVydGllcz47CisKKyAgLy8vIFBvd2VyUENfVlNYX0ludHJpbnNpYyAtIEJhc2UgY2xhc3MgZm9yIGFsbCBWU1ggaW50cmluc2ljcy4KKyAgY2xhc3MgUG93ZXJQQ19WU1hfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXgsIGxpc3Q8TExWTVR5cGU+IHJldF90eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Q8TExWTVR5cGU+IHBhcmFtX3R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDxJbnRyaW5zaWNQcm9wZXJ0eT4gcHJvcGVydGllcz4KKyAgICA6IEdDQ0J1aWx0aW48IXN0cmNvbmNhdCgiX19idWlsdGluX3ZzeF8iLCBHQ0NJbnRTdWZmaXgpPiwKKyAgICAgIEludHJpbnNpYzxyZXRfdHlwZXMsIHBhcmFtX3R5cGVzLCBwcm9wZXJ0aWVzPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBvd2VyUEMgQWx0aXZlYyBJbnRyaW5zaWMgQ2xhc3MgRGVmaW5pdGlvbnMuCisvLworCisvLy8gUG93ZXJQQ19WZWNfRkZfSW50cmluc2ljIC0gQSBQb3dlclBDIGludHJpbnNpYyB0aGF0IHRha2VzIG9uZSB2NGYzMgorLy8vIHZlY3RvciBhbmQgcmV0dXJucyBvbmUuICBUaGVzZSBpbnRyaW5zaWNzIGhhdmUgbm8gc2lkZSBlZmZlY3RzLgorY2xhc3MgUG93ZXJQQ19WZWNfRkZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogUG93ZXJQQ19WZWNfSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8vIFBvd2VyUENfVmVjX0ZGRl9JbnRyaW5zaWMgLSBBIFBvd2VyUEMgaW50cmluc2ljIHRoYXQgdGFrZXMgdHdvIHY0ZjMyCisvLy8gdmVjdG9ycyBhbmQgcmV0dXJucyBvbmUuICBUaGVzZSBpbnRyaW5zaWNzIGhhdmUgbm8gc2lkZSBlZmZlY3RzLgorY2xhc3MgUG93ZXJQQ19WZWNfRkZGX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IFBvd2VyUENfVmVjX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vLyBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljIC0gQSBQb3dlclBDIGludHJpbnNpYyB0aGF0IHRha2VzIHR3byB2MTZpOAorLy8vIHZlY3RvcnMgYW5kIHJldHVybnMgb25lLiAgVGhlc2UgaW50cmluc2ljcyBoYXZlIG5vIHNpZGUgZWZmZWN0cy4KK2NsYXNzIFBvd2VyUENfVmVjX0JCQl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4gCisgIDogUG93ZXJQQ19WZWNfSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8vIFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWMgLSBBIFBvd2VyUEMgaW50cmluc2ljIHRoYXQgdGFrZXMgdHdvIHY4aTE2CisvLy8gdmVjdG9ycyBhbmQgcmV0dXJucyBvbmUuICBUaGVzZSBpbnRyaW5zaWNzIGhhdmUgbm8gc2lkZSBlZmZlY3RzLgorY2xhc3MgUG93ZXJQQ19WZWNfSEhIX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PiAKKyAgOiBQb3dlclBDX1ZlY19JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLy8gUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYyAtIEEgUG93ZXJQQyBpbnRyaW5zaWMgdGhhdCB0YWtlcyB0d28gdjRpMzIKKy8vLyB2ZWN0b3JzIGFuZCByZXR1cm5zIG9uZS4gIFRoZXNlIGludHJpbnNpY3MgaGF2ZSBubyBzaWRlIGVmZmVjdHMuCitjbGFzcyBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+IAorICA6IFBvd2VyUENfVmVjX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vLyBQb3dlclBDX1ZlY19ERERfSW50cmluc2ljIC0gQSBQb3dlclBDIGludHJpbnNpYyB0aGF0IHRha2VzIHR3byB2Mmk2NAorLy8vIHZlY3RvcnMgYW5kIHJldHVybnMgb25lLiAgVGhlc2UgaW50cmluc2ljcyBoYXZlIG5vIHNpZGUgZWZmZWN0cy4KK2NsYXNzIFBvd2VyUENfVmVjX0RERF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBQb3dlclBDX1ZlY19JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLy8gUG93ZXJQQ19WZWNfUVFRX0ludHJpbnNpYyAtIEEgUG93ZXJQQyBpbnRyaW5zaWMgdGhhdCB0YWtlcyB0d28gdjFpMTI4CisvLy8gdmVjdG9ycyBhbmQgcmV0dXJucyBvbmUuIFRoZXNlIGludHJpbnNpY3MgaGF2ZSBubyBzaWRlIGVmZmVjdHMuCitjbGFzcyBQb3dlclBDX1ZlY19RUVFfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogUG93ZXJQQ19WZWNfSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MWkxMjhfdHldLCBbbGx2bV92MWkxMjhfdHksIGxsdm1fdjFpMTI4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQb3dlclBDIFZTWCBJbnRyaW5zaWMgQ2xhc3MgRGVmaW5pdGlvbnMuCisvLworCisvLy8gUG93ZXJQQ19WU1hfVmVjX0RERF9JbnRyaW5zaWMgLSBBIFBvd2VyUEMgaW50cmluc2ljIHRoYXQgdGFrZXMgdHdvIHYyZjY0CisvLy8gdmVjdG9ycyBhbmQgcmV0dXJucyBvbmUuICBUaGVzZSBpbnRyaW5zaWNzIGhhdmUgbm8gc2lkZSBlZmZlY3RzLgorY2xhc3MgUG93ZXJQQ19WU1hfVmVjX0RERF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLy8gUG93ZXJQQ19WU1hfVmVjX0ZGRl9JbnRyaW5zaWMgLSBBIFBvd2VyUEMgaW50cmluc2ljIHRoYXQgdGFrZXMgdHdvIHY0ZjMyCisvLy8gdmVjdG9ycyBhbmQgcmV0dXJucyBvbmUuICBUaGVzZSBpbnRyaW5zaWNzIGhhdmUgbm8gc2lkZSBlZmZlY3RzLgorY2xhc3MgUG93ZXJQQ19WU1hfVmVjX0ZGRl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLy8gUG93ZXJQQ19WU1hfU2NhX0RERF9JbnRyaW5zaWMgLSBBIFBvd2VyUEMgaW50cmluc2ljIHRoYXQgdGFrZXMgdHdvIGY2NAorLy8vIHNjYWxhcnMgYW5kIHJldHVybnMgb25lLiAgVGhlc2UgaW50cmluc2ljcyBoYXZlIG5vIHNpZGUgZWZmZWN0cy4KK2NsYXNzIFBvd2VyUENfVlNYX1NjYV9ERERfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogUG93ZXJQQ19WU1hfSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5LCBsbHZtX2RvdWJsZV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBvd2VyUEMgQWx0aXZlYyBJbnRyaW5zaWMgRGVmaW5pdGlvbnMuCisKK2xldCBUYXJnZXRQcmVmaXggPSAicHBjIiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLnBwYy4iLgorICAvLyBEYXRhIFN0cmVhbSBDb250cm9sLgorICBkZWYgaW50X3BwY19hbHRpdmVjX2RzcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX2RzcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0sIFtdPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY19kc3NhbGwgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY19kc3NhbGwiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbXSwgW10+OworICBkZWYgaW50X3BwY19hbHRpdmVjX2RzdCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX2RzdCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfZHN0dCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX2RzdHQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW10+OworICBkZWYgaW50X3BwY19hbHRpdmVjX2RzdHN0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfZHN0c3QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW10+OworICBkZWYgaW50X3BwY19hbHRpdmVjX2RzdHN0dCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX2RzdHN0dCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbXT47CisKKyAgLy8gVlNDUiBhY2Nlc3MuCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfbWZ2c2NyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfbWZ2c2NyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtdLCBbSW50clJlYWRNZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY19tdHZzY3IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY19tdHZzY3IiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV92NGkzMl90eV0sIFtdPjsKKworCisgIC8vIExvYWRzLiAgVGhlc2UgZG9uJ3QgbWFwIGRpcmVjdGx5IHRvIEdDQyBidWlsdGlucyBiZWNhdXNlIHRoZXkgcmVwcmVzZW50IHRoZQorICAvLyBzb3VyY2UgYWRkcmVzcyB3aXRoIGEgc2luZ2xlIHBvaW50ZXIuCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfbHZ4IDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX2x2eGwgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfbHZlYnggOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfbHZlaHggOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfbHZld3ggOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgLy8gU3RvcmVzLiAgVGhlc2UgZG9uJ3QgbWFwIGRpcmVjdGx5IHRvIEdDQyBidWlsdGlucyBiZWNhdXNlIHRoZXkgcmVwcmVzZW50IHRoZQorICAvLyBzb3VyY2UgYWRkcmVzcyB3aXRoIGEgc2luZ2xlIHBvaW50ZXIuCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfc3R2eCA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyV3JpdGVNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfc3R2eGwgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50cldyaXRlTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3N0dmVieCA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fdjE2aThfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyV3JpdGVNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfc3R2ZWh4IDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV92OGkxNl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY19zdHZld3ggOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50cldyaXRlTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisgIC8vIENvbXBhcmlzb25zIHNldHRpbmcgYSB2ZWN0b3IuCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGJmcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBiZnAiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBlcWZwIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxZnAiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBnZWZwIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGdlZnAiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndGZwIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0ZnAiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGVxdWQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1ZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGd0c2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGd0dWQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZXF1dyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXV3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZ3RzdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHN3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZ3R1dyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wbmV3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcG5ldyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcG5lencgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wbmV6dyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZXF1aCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVoIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZ3RzaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNoIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZ3R1aCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wbmVoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcG5laCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcG5lemggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wbmV6aCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZXF1YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXViIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZ3RzYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNiIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZ3R1YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wbmViIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcG5lYiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcG5lemIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wbmV6YiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgLy8gUHJlZGljYXRlIENvbXBhcmlzb25zLiAgVGhlIGZpcnN0IG9wZXJhbmQgc3BlY2lmaWVzIGludGVycHJldGF0aW9uIG9mIENSNi4KKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wYmZwX3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wYmZwX3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5LGxsdm1fdjRmMzJfdHksbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGVxZnBfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcWZwX3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5LGxsdm1fdjRmMzJfdHksbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGdlZnBfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBnZWZwX3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5LGxsdm1fdjRmMzJfdHksbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGd0ZnBfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndGZwX3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5LGxsdm1fdjRmMzJfdHksbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZXF1ZF9wIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWRfcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHksbGx2bV92Mmk2NF90eSxsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZ3RzZF9wIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2RfcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHksbGx2bV92Mmk2NF90eSxsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZ3R1ZF9wIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWRfcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHksbGx2bV92Mmk2NF90eSxsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBlcXV3X3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1d19wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y0aTMyX3R5LGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHN3X3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3Rzd19wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y0aTMyX3R5LGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHV3X3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1d19wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y0aTMyX3R5LGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBuZXdfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBuZXdfcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHksbGx2bV92NGkzMl90eSxsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wbmV6d19wIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcG5lendfcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHksbGx2bV92NGkzMl90eSxsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBlcXVoX3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1aF9wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y4aTE2X3R5LGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHNoX3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzaF9wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y4aTE2X3R5LGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHVoX3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y4aTE2X3R5LGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBuZWhfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBuZWhfcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHksbGx2bV92OGkxNl90eSxsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wbmV6aF9wIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcG5lemhfcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHksbGx2bV92OGkxNl90eSxsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBlcXViX3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1Yl9wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3YxNmk4X3R5LGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHNiX3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzYl9wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3YxNmk4X3R5LGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHViX3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1Yl9wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3YxNmk4X3R5LGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBuZWJfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBuZWJfcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHksbGx2bV92MTZpOF90eSxsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wbmV6Yl9wIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcG5lemJfcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHksbGx2bV92MTZpOF90eSxsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y2x6bHNiYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbHpsc2JiIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX3YxNmk4X3R5XSxbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmN0emxzYmIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y3R6bHNiYiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV92MTZpOF90eV0sW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZwcnR5YncgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cHJ0eWJ3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sW2xsdm1fdjRpMzJfdHldLFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192cHJ0eWJkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnBydHliZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLFtsbHZtX3YyaTY0X3R5XSxbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnBydHlicSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZwcnR5YnEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxaTEyOF90eV0sW2xsdm1fdjFpMTI4X3R5XSxbSW50ck5vTWVtXT47CisKK30KKworLy8gVmVjdG9yIGF2ZXJhZ2UuCitkZWYgaW50X3BwY19hbHRpdmVjX3ZhdmdzYiA6IFBvd2VyUENfVmVjX0JCQl9JbnRyaW5zaWM8InZhdmdzYiI+OworZGVmIGludF9wcGNfYWx0aXZlY192YXZnc2ggOiBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPCJ2YXZnc2giPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdmF2Z3N3IDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidmF2Z3N3Ij47CitkZWYgaW50X3BwY19hbHRpdmVjX3Zhdmd1YiA6IFBvd2VyUENfVmVjX0JCQl9JbnRyaW5zaWM8InZhdmd1YiI+OworZGVmIGludF9wcGNfYWx0aXZlY192YXZndWggOiBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPCJ2YXZndWgiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdmF2Z3V3IDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidmF2Z3V3Ij47CisKKy8vIFZlY3RvciBtYXhpbXVtLgorZGVmIGludF9wcGNfYWx0aXZlY192bWF4ZnAgOiBQb3dlclBDX1ZlY19GRkZfSW50cmluc2ljPCJ2bWF4ZnAiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdm1heHNiIDogUG93ZXJQQ19WZWNfQkJCX0ludHJpbnNpYzwidm1heHNiIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZtYXhzaCA6IFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWM8InZtYXhzaCI+OworZGVmIGludF9wcGNfYWx0aXZlY192bWF4c3cgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2bWF4c3ciPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdm1heHNkIDogUG93ZXJQQ19WZWNfREREX0ludHJpbnNpYzwidm1heHNkIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZtYXh1YiA6IFBvd2VyUENfVmVjX0JCQl9JbnRyaW5zaWM8InZtYXh1YiI+OworZGVmIGludF9wcGNfYWx0aXZlY192bWF4dWggOiBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPCJ2bWF4dWgiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdm1heHV3IDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidm1heHV3Ij47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZtYXh1ZCA6IFBvd2VyUENfVmVjX0RERF9JbnRyaW5zaWM8InZtYXh1ZCI+OworCisvLyBWZWN0b3IgbWluaW11bS4KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdm1pbmZwIDogUG93ZXJQQ19WZWNfRkZGX0ludHJpbnNpYzwidm1pbmZwIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZtaW5zYiA6IFBvd2VyUENfVmVjX0JCQl9JbnRyaW5zaWM8InZtaW5zYiI+OworZGVmIGludF9wcGNfYWx0aXZlY192bWluc2ggOiBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPCJ2bWluc2giPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdm1pbnN3IDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidm1pbnN3Ij47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZtaW5zZCA6IFBvd2VyUENfVmVjX0RERF9JbnRyaW5zaWM8InZtaW5zZCI+OworZGVmIGludF9wcGNfYWx0aXZlY192bWludWIgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2bWludWIiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdm1pbnVoIDogUG93ZXJQQ19WZWNfSEhIX0ludHJpbnNpYzwidm1pbnVoIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZtaW51dyA6IFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8InZtaW51dyI+OworZGVmIGludF9wcGNfYWx0aXZlY192bWludWQgOiBQb3dlclBDX1ZlY19ERERfSW50cmluc2ljPCJ2bWludWQiPjsKKworLy8gU2F0dXJhdGluZyBhZGRzLgorZGVmIGludF9wcGNfYWx0aXZlY192YWRkdWJzIDogUG93ZXJQQ19WZWNfQkJCX0ludHJpbnNpYzwidmFkZHVicyI+OworZGVmIGludF9wcGNfYWx0aXZlY192YWRkc2JzIDogUG93ZXJQQ19WZWNfQkJCX0ludHJpbnNpYzwidmFkZHNicyI+OworZGVmIGludF9wcGNfYWx0aXZlY192YWRkdWhzIDogUG93ZXJQQ19WZWNfSEhIX0ludHJpbnNpYzwidmFkZHVocyI+OworZGVmIGludF9wcGNfYWx0aXZlY192YWRkc2hzIDogUG93ZXJQQ19WZWNfSEhIX0ludHJpbnNpYzwidmFkZHNocyI+OworZGVmIGludF9wcGNfYWx0aXZlY192YWRkdXdzIDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidmFkZHV3cyI+OworZGVmIGludF9wcGNfYWx0aXZlY192YWRkc3dzIDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidmFkZHN3cyI+OworZGVmIGludF9wcGNfYWx0aXZlY192YWRkY3V3IDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidmFkZGN1dyI+OworZGVmIGludF9wcGNfYWx0aXZlY192YWRkY3VxIDogUG93ZXJQQ19WZWNfUVFRX0ludHJpbnNpYzwidmFkZGN1cSI+OworCisvLyBTYXR1cmF0aW5nIHN1YnMuCitkZWYgaW50X3BwY19hbHRpdmVjX3ZzdWJ1YnMgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2c3VidWJzIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZzdWJzYnMgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2c3Vic2JzIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZzdWJ1aHMgOiBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPCJ2c3VidWhzIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZzdWJzaHMgOiBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPCJ2c3Vic2hzIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZzdWJ1d3MgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2c3VidXdzIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZzdWJzd3MgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2c3Vic3dzIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZzdWJjdXcgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2c3ViY3V3Ij47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZzdWJjdXEgOiBQb3dlclBDX1ZlY19RUVFfSW50cmluc2ljPCJ2c3ViY3VxIj47CisKK2xldCBUYXJnZXRQcmVmaXggPSAicHBjIiBpbiB7ICAvLyBBbGwgUFBDIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS5wcGMuIi4KKyAgLy8gU2F0dXJhdGluZyBtdWx0aXBseS1hZGRzLgorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZtaGFkZHNocyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZtaGFkZHNocyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZtaHJhZGRzaHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bWhyYWRkc2hzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9wcGNfYWx0aXZlY192bWFkZGZwIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm1hZGRmcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZubXN1YmZwIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm5tc3ViZnAiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICAvLyBWZWN0b3IgTXVsdGlwbHkgU3VtIEludHJ1Y3Rpb25zLgorICBkZWYgaW50X3BwY19hbHRpdmVjX3Ztc3VtbWJtIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm1zdW1tYm0iPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3Ztc3Vtc2htIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm1zdW1zaG0iPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3Ztc3Vtc2hzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm1zdW1zaHMiPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192bXN1bXVibSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Ztc3VtdWJtIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgCisgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm1zdW11aG0gOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bXN1bXVobSI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm1zdW11aHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bXN1bXVocyI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgLy8gVmVjdG9yIE11bHRpcGx5IEludHJ1Y3Rpb25zLgorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZtdWxlc2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bXVsZXNiIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm11bGVzaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxlc2giPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192bXVsZXN3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm11bGVzdyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZtdWxldWIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bXVsZXViIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm11bGV1aCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxldWgiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192bXVsZXV3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm11bGV1dyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm11bG9zYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxvc2IiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192bXVsb3NoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm11bG9zaCI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZtdWxvc3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bXVsb3N3Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm11bG91YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxvdWIiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192bXVsb3VoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm11bG91aCI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZtdWxvdXcgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bXVsb3V3Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgLy8gVmVjdG9yIFN1bSBJbnRydWN0aW9ucy4KKyAgZGVmIGludF9wcGNfYWx0aXZlY192c3Vtc3dzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnN1bXN3cyI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192c3VtMnN3cyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZzdW0yc3dzIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZzdW00c2JzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnN1bTRzYnMiPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnN1bTRzaHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192c3VtNHNocyI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192c3VtNHVicyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZzdW00dWJzIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIC8vIE90aGVyIG11bHRpcGxpZXMuCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm1sYWRkdWhtIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm1sYWRkdWhtIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgCisgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CisKKyAgLy8gUGFja3MuCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnBrcHggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cGtweCI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192cGtzaHNzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnBrc2hzcyI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192cGtzaHVzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnBrc2h1cyI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192cGtzd3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnBrc3dzcyI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192cGtzd3VzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnBrc3d1cyI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192cGtzZHNzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnBrc2RzcyI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192cGtzZHVzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnBrc2R1cyI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgLy8gdnBrdWh1bSBpcyBsb3dlcmVkIHRvIGEgc2h1ZmZsZS4KKyAgZGVmIGludF9wcGNfYWx0aXZlY192cGt1aHVzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnBrdWh1cyI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgLy8gdnBrdXd1bSBpcyBsb3dlcmVkIHRvIGEgc2h1ZmZsZS4KKyAgZGVmIGludF9wcGNfYWx0aXZlY192cGt1d3VzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnBrdXd1cyI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgLy8gdnBrdWR1bSBpcyBsb3dlcmVkIHRvIGEgc2h1ZmZsZS4KKyAgZGVmIGludF9wcGNfYWx0aXZlY192cGt1ZHVzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnBrdWR1cyI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICAvLyBVbnBhY2tzLgorICBkZWYgaW50X3BwY19hbHRpdmVjX3Z1cGtocHggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192dXBraHB4Ij4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192dXBraHNiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnVwa2hzYiI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnVwa2hzaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtoc2giPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3Z1cGtoc3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192dXBraHN3Ij4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192dXBrbHB4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnVwa2xweCI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnVwa2xzYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtsc2IiPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3Z1cGtsc2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192dXBrbHNoIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192dXBrbHN3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnVwa2xzdyI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisKKworICAvLyBGUCA8LT4gaW50ZWdlciBjb252ZXJzaW9uLgorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjZnN4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNmc3giPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y2Z1eCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjZnV4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmN0c3hzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmN0c3hzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmN0dXhzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmN0dXhzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9wcGNfYWx0aXZlY192cmZpbSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZyZmltIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZyZmluIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnJmaW4iPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnJmaXAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cmZpcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192cmZpeiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZyZml6Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIC8vIEFkZCBFeHRlbmRlZCBRdWFkd29yZAorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZhZGRldXFtIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmFkZGV1cW0iPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxaTEyOF90eV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjFpMTI4X3R5LCBsbHZtX3YxaTEyOF90eSwgbGx2bV92MWkxMjhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZhZGRlY3VxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmFkZGVjdXEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxaTEyOF90eV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjFpMTI4X3R5LCBsbHZtX3YxaTEyOF90eSwgbGx2bV92MWkxMjhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIC8vIFN1YiBFeHRlbmRlZCBRdWFkd29yZAorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZzdWJldXFtIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnN1YmV1cW0iPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxaTEyOF90eV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjFpMTI4X3R5LCBsbHZtX3YxaTEyOF90eSwgbGx2bV92MWkxMjhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZzdWJlY3VxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnN1YmVjdXEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxaTEyOF90eV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjFpMTI4X3R5LCBsbHZtX3YxaTEyOF90eSwgbGx2bV92MWkxMjhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCitkZWYgaW50X3BwY19hbHRpdmVjX3ZzbCAgIDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidnNsIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZzbG8gIDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidnNsbyI+OworCitkZWYgaW50X3BwY19hbHRpdmVjX3ZzbGIgIDogUG93ZXJQQ19WZWNfQkJCX0ludHJpbnNpYzwidnNsYiI+OworZGVmIGludF9wcGNfYWx0aXZlY192c2x2ICA6IFBvd2VyUENfVmVjX0JCQl9JbnRyaW5zaWM8InZzbHYiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnNydiAgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2c3J2Ij47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZzbGggIDogUG93ZXJQQ19WZWNfSEhIX0ludHJpbnNpYzwidnNsaCI+OworZGVmIGludF9wcGNfYWx0aXZlY192c2x3ICA6IFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8InZzbHciPjsKKworLy8gUmlnaHQgU2hpZnRzLgorZGVmIGludF9wcGNfYWx0aXZlY192c3IgICA6IFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8InZzciI+OworZGVmIGludF9wcGNfYWx0aXZlY192c3JvICA6IFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8InZzcm8iPjsKKyAgCitkZWYgaW50X3BwY19hbHRpdmVjX3ZzcmIgIDogUG93ZXJQQ19WZWNfQkJCX0ludHJpbnNpYzwidnNyYiI+OworZGVmIGludF9wcGNfYWx0aXZlY192c3JoICA6IFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWM8InZzcmgiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnNydyAgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2c3J3Ij47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZzcmFiIDogUG93ZXJQQ19WZWNfQkJCX0ludHJpbnNpYzwidnNyYWIiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnNyYWggOiBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPCJ2c3JhaCI+OworZGVmIGludF9wcGNfYWx0aXZlY192c3JhdyA6IFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8InZzcmF3Ij47CisKKy8vIFJvdGF0ZXMuCitkZWYgaW50X3BwY19hbHRpdmVjX3ZybGIgIDogUG93ZXJQQ19WZWNfQkJCX0ludHJpbnNpYzwidnJsYiI+OworZGVmIGludF9wcGNfYWx0aXZlY192cmxoICA6IFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWM8InZybGgiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnJsdyAgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2cmx3Ij47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZybGQgIDogUG93ZXJQQ19WZWNfREREX0ludHJpbnNpYzwidnJsZCI+OworCitsZXQgVGFyZ2V0UHJlZml4ID0gInBwYyIgaW4geyAgLy8gQWxsIFBQQyBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ucHBjLiIuCisgIC8vIE1pc2NlbGxhbmVvdXMuCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfbHZzbCA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY19sdnNyIDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnBlcm0gOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cGVybV80c2kiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnNlbCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZzZWxfNHNpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZnYmJkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmdiYmQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmJwZXJtcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZicGVybXEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCitkZWYgaW50X3BwY19hbHRpdmVjX3ZleHB0ZWZwICA6IFBvd2VyUENfVmVjX0ZGX0ludHJpbnNpYzwidmV4cHRlZnAiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdmxvZ2VmcCAgIDogUG93ZXJQQ19WZWNfRkZfSW50cmluc2ljPCJ2bG9nZWZwIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZyZWZwICAgICA6IFBvd2VyUENfVmVjX0ZGX0ludHJpbnNpYzwidnJlZnAiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnJzcXJ0ZWZwIDogUG93ZXJQQ19WZWNfRkZfSW50cmluc2ljPCJ2cnNxcnRlZnAiPjsKKworLy8gUG93ZXI4IEludHJpbnNpY3MKKy8vIENyeXB0bworbGV0IFRhcmdldFByZWZpeCA9ICJwcGMiIGluIHsgIC8vIEFsbCBQUEMgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLnBwYy4iLgorICBkZWYgaW50X3BwY19hbHRpdmVjX2NyeXB0b192c2JveCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192c2JveCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY19jcnlwdG9fdnBlcm14b3IgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnBlcm14b3IiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9wcGNfYWx0aXZlY19jcnlwdG9fdnNoYXNpZ21hZCA6CisgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnNoYXNpZ21hZCI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfY3J5cHRvX3ZzaGFzaWdtYXcgOgorICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZzaGFzaWdtYXciPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CitkZWYgaW50X3BwY19hbHRpdmVjX2NyeXB0b192Y2lwaGVyIDoKKyAgICAgICAgICAgIFBvd2VyUENfVmVjX0RERF9JbnRyaW5zaWM8ImNyeXB0b192Y2lwaGVyIj47CitkZWYgaW50X3BwY19hbHRpdmVjX2NyeXB0b192Y2lwaGVybGFzdCA6CisgICAgICAgICAgICBQb3dlclBDX1ZlY19ERERfSW50cmluc2ljPCJjcnlwdG9fdmNpcGhlcmxhc3QiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfY3J5cHRvX3ZuY2lwaGVyIDoKKyAgICAgICAgICAgIFBvd2VyUENfVmVjX0RERF9JbnRyaW5zaWM8ImNyeXB0b192bmNpcGhlciI+OworZGVmIGludF9wcGNfYWx0aXZlY19jcnlwdG9fdm5jaXBoZXJsYXN0IDoKKyAgICAgICAgICAgIFBvd2VyUENfVmVjX0RERF9JbnRyaW5zaWM8ImNyeXB0b192bmNpcGhlcmxhc3QiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfY3J5cHRvX3ZwbXN1bWIgOgorICAgICAgICAgICAgUG93ZXJQQ19WZWNfQkJCX0ludHJpbnNpYzwiY3J5cHRvX3ZwbXN1bWIiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfY3J5cHRvX3ZwbXN1bWggOgorICAgICAgICAgICAgUG93ZXJQQ19WZWNfSEhIX0ludHJpbnNpYzwiY3J5cHRvX3ZwbXN1bWgiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfY3J5cHRvX3ZwbXN1bXcgOgorICAgICAgICAgICAgUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwiY3J5cHRvX3ZwbXN1bXciPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfY3J5cHRvX3ZwbXN1bWQgOgorICAgICAgICAgICAgUG93ZXJQQ19WZWNfREREX0ludHJpbnNpYzwiY3J5cHRvX3ZwbXN1bWQiPjsKKworLy8gQWJzb2x1dGUgRGlmZmVyZW5jZSBpbnRyaW5zaWNzCitkZWYgaW50X3BwY19hbHRpdmVjX3ZhYnNkdWIgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2YWJzZHViIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZhYnNkdWggOiBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPCJ2YWJzZHVoIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZhYnNkdXcgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2YWJzZHV3Ij47CisKKy8vIFZlY3RvciByb3RhdGVzCitkZWYgaW50X3BwY19hbHRpdmVjX3ZybHdubSA6CisgICAgICBQb3dlclBDX1ZlY19JbnRyaW5zaWM8InZybHdubSIsIFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnJsd21pIDoKKyAgICAgIFBvd2VyUENfVmVjX0ludHJpbnNpYzwidnJsd21pIiwgW2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZybGRubSA6CisgICAgICBQb3dlclBDX1ZlY19JbnRyaW5zaWM8InZybGRubSIsIFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnJsZG1pIDoKKyAgICAgIFBvd2VyUENfVmVjX0ludHJpbnNpYzwidnJsZG1pIiwgW2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQb3dlclBDIFZTWCBJbnRyaW5zaWMgRGVmaW5pdGlvbnMuCisKK2xldCBUYXJnZXRQcmVmaXggPSAicHBjIiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLnBwYy4iLgorCisvLyBWZWN0b3IgbG9hZC4KK2RlZiBpbnRfcHBjX3ZzeF9seHZ3NHggOgorICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9wcGNfdnN4X2x4dmQyeCA6CisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CitkZWYgaW50X3BwY192c3hfbHh2dzR4X2JlIDoKKyAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfcHBjX3ZzeF9seHZkMnhfYmUgOgorICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9wcGNfdnN4X2x4dmwgOgorICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2k2NF90eV0sIFtJbnRyUmVhZE1lbSwKKyAgICAgIEludHJBcmdNZW1Pbmx5XT47CitkZWYgaW50X3BwY192c3hfbHh2bGwgOgorICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2k2NF90eV0sIFtJbnRyUmVhZE1lbSwKKyAgICAgIEludHJBcmdNZW1Pbmx5XT47CitkZWYgaW50X3BwY192c3hfc3R4dmwgOgorICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV92NGkzMl90eSwgbGx2bV9wdHJfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgIFtJbnRyV3JpdGVNZW0sIEludHJBcmdNZW1Pbmx5XT47CitkZWYgaW50X3BwY192c3hfc3R4dmxsIDoKKyAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fcHRyX3R5LCBsbHZtX2k2NF90eV0sCisgICAgICBbSW50cldyaXRlTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisvLyBWZWN0b3Igc3RvcmUuCitkZWYgaW50X3BwY192c3hfc3R4dnc0eCA6IEludHJpbnNpYzxbXSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyV3JpdGVNZW0sIEludHJBcmdNZW1Pbmx5XT47CitkZWYgaW50X3BwY192c3hfc3R4dmQyeCA6IEludHJpbnNpYzxbXSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyV3JpdGVNZW0sIEludHJBcmdNZW1Pbmx5XT47CitkZWYgaW50X3BwY192c3hfc3R4dnc0eF9iZSA6IEludHJpbnNpYzxbXSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyV3JpdGVNZW0sIEludHJBcmdNZW1Pbmx5XT47CitkZWYgaW50X3BwY192c3hfc3R4dmQyeF9iZSA6IEludHJpbnNpYzxbXSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyV3JpdGVNZW0sIEludHJBcmdNZW1Pbmx5XT47CisvLyBWZWN0b3IgYW5kIHNjYWxhciBtYXhpbXVtLgorZGVmIGludF9wcGNfdnN4X3h2bWF4ZHAgOiBQb3dlclBDX1ZTWF9WZWNfREREX0ludHJpbnNpYzwieHZtYXhkcCI+OworZGVmIGludF9wcGNfdnN4X3h2bWF4c3AgOiBQb3dlclBDX1ZTWF9WZWNfRkZGX0ludHJpbnNpYzwieHZtYXhzcCI+OworZGVmIGludF9wcGNfdnN4X3hzbWF4ZHAgOiBQb3dlclBDX1ZTWF9TY2FfREREX0ludHJpbnNpYzwieHNtYXhkcCI+OworCisvLyBWZWN0b3IgYW5kIHNjYWxhciBtaW5pbXVtLgorZGVmIGludF9wcGNfdnN4X3h2bWluZHAgOiBQb3dlclBDX1ZTWF9WZWNfREREX0ludHJpbnNpYzwieHZtaW5kcCI+OworZGVmIGludF9wcGNfdnN4X3h2bWluc3AgOiBQb3dlclBDX1ZTWF9WZWNfRkZGX0ludHJpbnNpYzwieHZtaW5zcCI+OworZGVmIGludF9wcGNfdnN4X3hzbWluZHAgOiBQb3dlclBDX1ZTWF9TY2FfREREX0ludHJpbnNpYzwieHNtaW5kcCI+OworCisvLyBWZWN0b3IgZGl2aWRlLgorZGVmIGludF9wcGNfdnN4X3h2ZGl2ZHAgOiBQb3dlclBDX1ZTWF9WZWNfREREX0ludHJpbnNpYzwieHZkaXZkcCI+OworZGVmIGludF9wcGNfdnN4X3h2ZGl2c3AgOiBQb3dlclBDX1ZTWF9WZWNfRkZGX0ludHJpbnNpYzwieHZkaXZzcCI+OworCisvLyBWZWN0b3Igcm91bmQtdG8taW5maW5pdHkgKGNlaWwpCitkZWYgaW50X3BwY192c3hfeHZyc3BpcCA6CisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dnJkcGlwIDoKKyAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCisvLyBWZWN0b3IgcmVjaXByb2NhbCBlc3RpbWF0ZQorZGVmIGludF9wcGNfdnN4X3h2cmVzcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl92c3hfeHZyZXNwIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dnJlZHAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdnN4X3h2cmVkcCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKKy8vIFZlY3RvciByc3FydGUKK2RlZiBpbnRfcHBjX3ZzeF94dnJzcXJ0ZXNwIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3ZzeF94dnJzcXJ0ZXNwIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dnJzcXJ0ZWRwIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3ZzeF94dnJzcXJ0ZWRwIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8gVmVjdG9yIGNvbXBhcmUKK2RlZiBpbnRfcHBjX3ZzeF94dmNtcGVxZHAgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4dmNtcGVxZHAiLCBbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZjbXBlcWRwX3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdnN4X3h2Y21wZXFkcF9wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3YyZjY0X3R5LGxsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2Y21wZXFzcCA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2Y21wZXFzcCIsIFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dmNtcGVxc3BfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl92c3hfeHZjbXBlcXNwX3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5LGxsdm1fdjRmMzJfdHksbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZjbXBnZWRwIDoKKyAgICAgIFBvd2VyUENfVlNYX0ludHJpbnNpYzwieHZjbXBnZWRwIiwgW2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2Y21wZ2VkcF9wIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3ZzeF94dmNtcGdlZHBfcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHksbGx2bV92MmY2NF90eSxsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dmNtcGdlc3AgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4dmNtcGdlc3AiLCBbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZjbXBnZXNwX3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdnN4X3h2Y21wZ2VzcF9wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y0ZjMyX3R5LGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2Y21wZ3RkcCA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2Y21wZ3RkcCIsIFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dmNtcGd0ZHBfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl92c3hfeHZjbXBndGRwX3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5LGxsdm1fdjJmNjRfdHksbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZjbXBndHNwIDoKKyAgICAgIFBvd2VyUENfVlNYX0ludHJpbnNpYzwieHZjbXBndHNwIiwgW2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2Y21wZ3RzcF9wIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3ZzeF94dmNtcGd0c3BfcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHksbGx2bV92NGYzMl90eSxsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94eGxlcXYgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4eGxlcXYiLCBbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZpZXhwZHAgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4dmlleHBkcCIsW2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSxbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZpZXhwc3AgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4dmlleHBzcCIsW2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSxbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZjdmRwc3h3cyA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2Y3ZkcHN4d3MiLCBbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZjdmRwdXh3cyA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2Y3ZkcHV4d3MiLCBbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZjdnN4d2RwIDoKKyAgICAgIFBvd2VyUENfVlNYX0ludHJpbnNpYzwieHZjdnN4d2RwIiwgW2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2Y3Z1eHdkcCA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2Y3Z1eHdkcCIsIFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dmN2c3BkcCA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2Y3ZzcGRwIiwgW2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2Y3ZzeGRzcCA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2Y3ZzeGRzcCIsIFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dmN2dXhkc3AgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4dmN2dXhkc3AiLCBbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZjdmRwc3AgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4dmN2ZHBzcCIsIFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dmN2c3BocCA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2Y3ZzcGhwIiwgW2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2eGV4cGRwIDoKKyAgICAgIFBvd2VyUENfVlNYX0ludHJpbnNpYzwieHZ4ZXhwZHAiLCBbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZ4ZXhwc3AgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4dnhleHBzcCIsIFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dnhzaWdkcCA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2eHNpZ2RwIiwgW2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2eHNpZ3NwIDoKKyAgICAgIFBvd2VyUENfVlNYX0ludHJpbnNpYzwieHZ4c2lnc3AiLCBbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZ0c3RkY2RwIDoKKyAgICAgIFBvd2VyUENfVlNYX0ludHJpbnNpYzwieHZ0c3RkY2RwIiwgW2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dnRzdGRjc3AgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4dnRzdGRjc3AiLCBbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHksbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZjdmhwc3AgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4dmN2aHBzcCIsIFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkxNl90eV0sW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h4ZXh0cmFjdHV3IDoKKyAgICAgIFBvd2VyUENfVlNYX0ludHJpbnNpYzwieHhleHRyYWN0dXciLFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSxsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94eGluc2VydHcgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4eGluc2VydHciLFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eSxsbHZtX3YyaTY0X3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQb3dlclBDIFFQWCBJbnRyaW5zaWNzLgorLy8KKworbGV0IFRhcmdldFByZWZpeCA9ICJwcGMiIGluIHsgIC8vIEFsbCBQUEMgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLnBwYy4iLgorICAvLy8gUG93ZXJQQ19RUFhfSW50cmluc2ljIC0gQmFzZSBjbGFzcyBmb3IgYWxsIFFQWCBpbnRyaW5zaWNzLgorICBjbGFzcyBQb3dlclBDX1FQWF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeCwgbGlzdDxMTFZNVHlwZT4gcmV0X3R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDxMTFZNVHlwZT4gcGFyYW1fdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0PEludHJpbnNpY1Byb3BlcnR5PiBwcm9wZXJ0aWVzPgorICAgIDogR0NDQnVpbHRpbjwhc3RyY29uY2F0KCJfX2J1aWx0aW5fcXB4XyIsIEdDQ0ludFN1ZmZpeCk+LAorICAgICAgSW50cmluc2ljPHJldF90eXBlcywgcGFyYW1fdHlwZXMsIHByb3BlcnRpZXM+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUG93ZXJQQyBRUFggSW50cmluc2ljIENsYXNzIERlZmluaXRpb25zLgorLy8KKworLy8vIFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYyAtIEEgUG93ZXJQQyBpbnRyaW5zaWMgdGhhdCB0YWtlcyBvbmUgdjRmNjQKKy8vLyB2ZWN0b3IgYW5kIHJldHVybnMgb25lLiAgVGhlc2UgaW50cmluc2ljcyBoYXZlIG5vIHNpZGUgZWZmZWN0cy4KK2NsYXNzIFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IFBvd2VyUENfUVBYX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47CisKKy8vLyBQb3dlclBDX1FQWF9GRkZfSW50cmluc2ljIC0gQSBQb3dlclBDIGludHJpbnNpYyB0aGF0IHRha2VzIHR3byB2NGY2NAorLy8vIHZlY3RvcnMgYW5kIHJldHVybnMgb25lLiAgVGhlc2UgaW50cmluc2ljcyBoYXZlIG5vIHNpZGUgZWZmZWN0cy4KK2NsYXNzIFBvd2VyUENfUVBYX0ZGRl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBQb3dlclBDX1FQWF9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLy8gUG93ZXJQQ19RUFhfRkZGRl9JbnRyaW5zaWMgLSBBIFBvd2VyUEMgaW50cmluc2ljIHRoYXQgdGFrZXMgdGhyZWUgdjRmNjQKKy8vLyB2ZWN0b3JzIGFuZCByZXR1cm5zIG9uZS4gIFRoZXNlIGludHJpbnNpY3MgaGF2ZSBubyBzaWRlIGVmZmVjdHMuCitjbGFzcyBQb3dlclBDX1FQWF9GRkZGX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IFBvd2VyUENfUVBYX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vLyBQb3dlclBDX1FQWF9Mb2FkX0ludHJpbnNpYyAtIEEgUG93ZXJQQyBpbnRyaW5zaWMgdGhhdCB0YWtlcyBhIHBvaW50ZXIKKy8vLyBhbmQgcmV0dXJucyBhIHY0ZjY0LgorY2xhc3MgUG93ZXJQQ19RUFhfTG9hZF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBQb3dlclBDX1FQWF9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGY2NF90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworLy8vIFBvd2VyUENfUVBYX0xvYWRQZXJtX0ludHJpbnNpYyAtIEEgUG93ZXJQQyBpbnRyaW5zaWMgdGhhdCB0YWtlcyBhIHBvaW50ZXIKKy8vLyBhbmQgcmV0dXJucyBhIHY0ZjY0IHBlcm11dGF0aW9uLgorY2xhc3MgUG93ZXJQQ19RUFhfTG9hZFBlcm1fSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogUG93ZXJQQ19RUFhfSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmNjRfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50ck5vTWVtXT47CisKKy8vLyBQb3dlclBDX1FQWF9TdG9yZV9JbnRyaW5zaWMgLSBBIFBvd2VyUEMgaW50cmluc2ljIHRoYXQgdGFrZXMgYSBwb2ludGVyCisvLy8gYW5kIHN0b3JlcyBhIHY0ZjY0LgorY2xhc3MgUG93ZXJQQ19RUFhfU3RvcmVfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogUG93ZXJQQ19RUFhfSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW10sIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyV3JpdGVNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQb3dlclBDIFFQWCBJbnRyaW5zaWMgRGVmaW5pdGlvbnMuCisKK2xldCBUYXJnZXRQcmVmaXggPSAicHBjIiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLnBwYy4iLgorICAvLyBBZGQgSW5zdHJ1Y3Rpb25zCisgIGRlZiBpbnRfcHBjX3FweF9xdmZhZGQgOiBQb3dlclBDX1FQWF9GRkZfSW50cmluc2ljPCJxdmZhZGQiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZmFkZHMgOiBQb3dlclBDX1FQWF9GRkZfSW50cmluc2ljPCJxdmZhZGRzIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZzdWIgOiBQb3dlclBDX1FQWF9GRkZfSW50cmluc2ljPCJxdmZzdWIiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZnN1YnMgOiBQb3dlclBDX1FQWF9GRkZfSW50cmluc2ljPCJxdmZzdWJzIj47CisKKyAgLy8gRXN0aW1hdGUgSW5zdHJ1Y3Rpb25zCisgIGRlZiBpbnRfcHBjX3FweF9xdmZyZSA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmcmUiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZnJlcyA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmcmVzIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZyc3FydGUgOiBQb3dlclBDX1FQWF9GRl9JbnRyaW5zaWM8InF2ZnJzcXJ0ZSI+OworICBkZWYgaW50X3BwY19xcHhfcXZmcnNxcnRlcyA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmcnNxcnRlcyI+OworCisgIC8vIE11bHRpcGx5IEluc3RydWN0aW9ucworICBkZWYgaW50X3BwY19xcHhfcXZmbXVsIDogUG93ZXJQQ19RUFhfRkZGX0ludHJpbnNpYzwicXZmbXVsIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZtdWxzIDogUG93ZXJQQ19RUFhfRkZGX0ludHJpbnNpYzwicXZmbXVscyI+OworICBkZWYgaW50X3BwY19xcHhfcXZmeG11bCA6IFBvd2VyUENfUVBYX0ZGRl9JbnRyaW5zaWM8InF2ZnhtdWwiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZnhtdWxzIDogUG93ZXJQQ19RUFhfRkZGX0ludHJpbnNpYzwicXZmeG11bHMiPjsKKworICAvLyBNdWx0aXBseS1hZGQgaW5zdHJ1Y3Rpb25zCisgIGRlZiBpbnRfcHBjX3FweF9xdmZtYWRkIDogUG93ZXJQQ19RUFhfRkZGRl9JbnRyaW5zaWM8InF2Zm1hZGQiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2Zm1hZGRzIDogUG93ZXJQQ19RUFhfRkZGRl9JbnRyaW5zaWM8InF2Zm1hZGRzIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZubWFkZCA6IFBvd2VyUENfUVBYX0ZGRkZfSW50cmluc2ljPCJxdmZubWFkZCI+OworICBkZWYgaW50X3BwY19xcHhfcXZmbm1hZGRzIDogUG93ZXJQQ19RUFhfRkZGRl9JbnRyaW5zaWM8InF2Zm5tYWRkcyI+OworICBkZWYgaW50X3BwY19xcHhfcXZmbXN1YiA6IFBvd2VyUENfUVBYX0ZGRkZfSW50cmluc2ljPCJxdmZtc3ViIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZtc3VicyA6IFBvd2VyUENfUVBYX0ZGRkZfSW50cmluc2ljPCJxdmZtc3VicyI+OworICBkZWYgaW50X3BwY19xcHhfcXZmbm1zdWIgOiBQb3dlclBDX1FQWF9GRkZGX0ludHJpbnNpYzwicXZmbm1zdWIiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2Zm5tc3VicyA6IFBvd2VyUENfUVBYX0ZGRkZfSW50cmluc2ljPCJxdmZubXN1YnMiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZnhtYWRkIDogUG93ZXJQQ19RUFhfRkZGRl9JbnRyaW5zaWM8InF2ZnhtYWRkIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZ4bWFkZHMgOiBQb3dlclBDX1FQWF9GRkZGX0ludHJpbnNpYzwicXZmeG1hZGRzIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZ4eG5wbWFkZCA6IFBvd2VyUENfUVBYX0ZGRkZfSW50cmluc2ljPCJxdmZ4eG5wbWFkZCI+OworICBkZWYgaW50X3BwY19xcHhfcXZmeHhucG1hZGRzIDogUG93ZXJQQ19RUFhfRkZGRl9JbnRyaW5zaWM8InF2Znh4bnBtYWRkcyI+OworICBkZWYgaW50X3BwY19xcHhfcXZmeHhjcG5tYWRkIDogUG93ZXJQQ19RUFhfRkZGRl9JbnRyaW5zaWM8InF2Znh4Y3BubWFkZCI+OworICBkZWYgaW50X3BwY19xcHhfcXZmeHhjcG5tYWRkcyA6IFBvd2VyUENfUVBYX0ZGRkZfSW50cmluc2ljPCJxdmZ4eGNwbm1hZGRzIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZ4eG1hZGQgOiBQb3dlclBDX1FQWF9GRkZGX0ludHJpbnNpYzwicXZmeHhtYWRkIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZ4eG1hZGRzIDogUG93ZXJQQ19RUFhfRkZGRl9JbnRyaW5zaWM8InF2Znh4bWFkZHMiPjsKKworICAvLyBTZWxlY3QgSW5zdHJ1Y3Rpb24KKyAgZGVmIGludF9wcGNfcXB4X3F2ZnNlbCA6IFBvd2VyUENfUVBYX0ZGRkZfSW50cmluc2ljPCJxdmZzZWwiPjsKKworICAvLyBQZXJtdXRlIEluc3RydWN0aW9uCisgIGRlZiBpbnRfcHBjX3FweF9xdmZwZXJtIDogUG93ZXJQQ19RUFhfRkZGRl9JbnRyaW5zaWM8InF2ZnBlcm0iPjsKKworICAvLyBDb252ZXJ0IGFuZCBSb3VuZCBJbnN0cnVjdGlvbnMKKyAgZGVmIGludF9wcGNfcXB4X3F2ZmN0aWQgOiBQb3dlclBDX1FQWF9GRl9JbnRyaW5zaWM8InF2ZmN0aWQiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZmN0aWR1IDogUG93ZXJQQ19RUFhfRkZfSW50cmluc2ljPCJxdmZjdGlkdSI+OworICBkZWYgaW50X3BwY19xcHhfcXZmY3RpZHogOiBQb3dlclBDX1FQWF9GRl9JbnRyaW5zaWM8InF2ZmN0aWR6Ij47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZjdGlkdXogOiBQb3dlclBDX1FQWF9GRl9JbnRyaW5zaWM8InF2ZmN0aWR1eiI+OworICBkZWYgaW50X3BwY19xcHhfcXZmY3RpdyA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmY3RpdyI+OworICBkZWYgaW50X3BwY19xcHhfcXZmY3Rpd3UgOiBQb3dlclBDX1FQWF9GRl9JbnRyaW5zaWM8InF2ZmN0aXd1Ij47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZjdGl3eiA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmY3Rpd3oiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZmN0aXd1eiA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmY3Rpd3V6Ij47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZjZmlkIDogUG93ZXJQQ19RUFhfRkZfSW50cmluc2ljPCJxdmZjZmlkIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZjZmlkdSA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmY2ZpZHUiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZmNmaWRzIDogUG93ZXJQQ19RUFhfRkZfSW50cmluc2ljPCJxdmZjZmlkcyI+OworICBkZWYgaW50X3BwY19xcHhfcXZmY2ZpZHVzIDogUG93ZXJQQ19RUFhfRkZfSW50cmluc2ljPCJxdmZjZmlkdXMiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZnJzcCA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmcnNwIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZyaXogOiBQb3dlclBDX1FQWF9GRl9JbnRyaW5zaWM8InF2ZnJpeiI+OworICBkZWYgaW50X3BwY19xcHhfcXZmcmluIDogUG93ZXJQQ19RUFhfRkZfSW50cmluc2ljPCJxdmZyaW4iPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZnJpcCA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmcmlwIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZyaW0gOiBQb3dlclBDX1FQWF9GRl9JbnRyaW5zaWM8InF2ZnJpbSI+OworCisgIC8vIE1vdmUgSW5zdHJ1Y3Rpb25zCisgIGRlZiBpbnRfcHBjX3FweF9xdmZuZWcgOiBQb3dlclBDX1FQWF9GRl9JbnRyaW5zaWM8InF2Zm5lZyI+OworICBkZWYgaW50X3BwY19xcHhfcXZmYWJzIDogUG93ZXJQQ19RUFhfRkZfSW50cmluc2ljPCJxdmZhYnMiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2Zm5hYnMgOiBQb3dlclBDX1FQWF9GRl9JbnRyaW5zaWM8InF2Zm5hYnMiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZmNwc2duIDogUG93ZXJQQ19RUFhfRkZGX0ludHJpbnNpYzwicXZmY3BzZ24iPjsKKworICAvLyBDb21wYXJlIEluc3RydWN0aW9ucworICBkZWYgaW50X3BwY19xcHhfcXZmdHN0bmFuIDogUG93ZXJQQ19RUFhfRkZGX0ludHJpbnNpYzwicXZmdHN0bmFuIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZjbXBsdCA6IFBvd2VyUENfUVBYX0ZGRl9JbnRyaW5zaWM8InF2ZmNtcGx0Ij47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZjbXBndCA6IFBvd2VyUENfUVBYX0ZGRl9JbnRyaW5zaWM8InF2ZmNtcGd0Ij47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZjbXBlcSA6IFBvd2VyUENfUVBYX0ZGRl9JbnRyaW5zaWM8InF2ZmNtcGVxIj47CisKKyAgLy8gTG9hZCBpbnN0cnVjdGlvbnMKKyAgZGVmIGludF9wcGNfcXB4X3F2bGZkIDogUG93ZXJQQ19RUFhfTG9hZF9JbnRyaW5zaWM8InF2bGZkIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmxmZGEgOiBQb3dlclBDX1FQWF9Mb2FkX0ludHJpbnNpYzwicXZsZmRhIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmxmcyA6IFBvd2VyUENfUVBYX0xvYWRfSW50cmluc2ljPCJxdmxmcyI+OworICBkZWYgaW50X3BwY19xcHhfcXZsZnNhIDogUG93ZXJQQ19RUFhfTG9hZF9JbnRyaW5zaWM8InF2bGZzYSI+OworCisgIGRlZiBpbnRfcHBjX3FweF9xdmxmY2RhIDogUG93ZXJQQ19RUFhfTG9hZF9JbnRyaW5zaWM8InF2bGZjZGEiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2bGZjZCA6IFBvd2VyUENfUVBYX0xvYWRfSW50cmluc2ljPCJxdmxmY2QiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2bGZjc2EgOiBQb3dlclBDX1FQWF9Mb2FkX0ludHJpbnNpYzwicXZsZmNzYSI+OworICBkZWYgaW50X3BwY19xcHhfcXZsZmNzIDogUG93ZXJQQ19RUFhfTG9hZF9JbnRyaW5zaWM8InF2bGZjcyI+OworICBkZWYgaW50X3BwY19xcHhfcXZsZml3YWEgOiBQb3dlclBDX1FQWF9Mb2FkX0ludHJpbnNpYzwicXZsZml3YWEiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2bGZpd2EgOiBQb3dlclBDX1FQWF9Mb2FkX0ludHJpbnNpYzwicXZsZml3YSI+OworICBkZWYgaW50X3BwY19xcHhfcXZsZml3emEgOiBQb3dlclBDX1FQWF9Mb2FkX0ludHJpbnNpYzwicXZsZml3emEiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2bGZpd3ogOiBQb3dlclBDX1FQWF9Mb2FkX0ludHJpbnNpYzwicXZsZml3eiI+OworCisgIGRlZiBpbnRfcHBjX3FweF9xdmxwY2xkIDogUG93ZXJQQ19RUFhfTG9hZFBlcm1fSW50cmluc2ljPCJxdmxwY2xkIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmxwY2xzIDogUG93ZXJQQ19RUFhfTG9hZFBlcm1fSW50cmluc2ljPCJxdmxwY2xzIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmxwY3JkIDogUG93ZXJQQ19RUFhfTG9hZFBlcm1fSW50cmluc2ljPCJxdmxwY3JkIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmxwY3JzIDogUG93ZXJQQ19RUFhfTG9hZFBlcm1fSW50cmluc2ljPCJxdmxwY3JzIj47CisKKyAgLy8gU3RvcmUgaW5zdHJ1Y3Rpb25zCisgIGRlZiBpbnRfcHBjX3FweF9xdnN0ZmQgOiBQb3dlclBDX1FQWF9TdG9yZV9JbnRyaW5zaWM8InF2c3RmZCI+OworICBkZWYgaW50X3BwY19xcHhfcXZzdGZkYSA6IFBvd2VyUENfUVBYX1N0b3JlX0ludHJpbnNpYzwicXZzdGZkYSI+OworICBkZWYgaW50X3BwY19xcHhfcXZzdGZzIDogUG93ZXJQQ19RUFhfU3RvcmVfSW50cmluc2ljPCJxdnN0ZnMiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2c3Rmc2EgOiBQb3dlclBDX1FQWF9TdG9yZV9JbnRyaW5zaWM8InF2c3Rmc2EiPjsKKworICBkZWYgaW50X3BwY19xcHhfcXZzdGZjZGEgOiBQb3dlclBDX1FQWF9TdG9yZV9JbnRyaW5zaWM8InF2c3RmY2RhIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdnN0ZmNkIDogUG93ZXJQQ19RUFhfU3RvcmVfSW50cmluc2ljPCJxdnN0ZmNkIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdnN0ZmNzYSA6IFBvd2VyUENfUVBYX1N0b3JlX0ludHJpbnNpYzwicXZzdGZjc2EiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2c3RmY3MgOiBQb3dlclBDX1FQWF9TdG9yZV9JbnRyaW5zaWM8InF2c3RmY3MiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2c3RmaXdhIDogUG93ZXJQQ19RUFhfU3RvcmVfSW50cmluc2ljPCJxdnN0Zml3YSI+OworICBkZWYgaW50X3BwY19xcHhfcXZzdGZpdyA6IFBvd2VyUENfUVBYX1N0b3JlX0ludHJpbnNpYzwicXZzdGZpdyI+OworCisgIC8vIExvZ2ljYWwgYW5kIHBlcm11dGF0aW9uIGZvcm1hdGlvbgorICBkZWYgaW50X3BwY19xcHhfcXZmbG9naWNhbCA6IFBvd2VyUENfUVBYX0ludHJpbnNpYzwicXZmbG9naWNhbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19xcHhfcXZncGNpIDogUG93ZXJQQ19RUFhfSW50cmluc2ljPCJxdmdwY2kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGY2NF90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBvd2VyUEMgSFRNIEludHJpbnNpYyBEZWZpbml0aW9ucy4KKworbGV0IFRhcmdldFByZWZpeCA9ICJwcGMiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ucHBjLiIuCisKK2RlZiBpbnRfcHBjX3RiZWdpbiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl90YmVnaW4iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X3BwY190ZW5kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3RlbmQiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHldLCBbXT47CisKK2RlZiBpbnRfcHBjX3RhYm9ydCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl90YWJvcnQiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X3BwY190YWJvcnR3YyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl90YWJvcnR3YyI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9wcGNfdGFib3J0d2NpIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3RhYm9ydHdjaSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9wcGNfdGFib3J0ZGMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdGFib3J0ZGMiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKK2RlZiBpbnRfcHBjX3RhYm9ydGRjaSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl90YWJvcnRkY2kiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKworZGVmIGludF9wcGNfdGNoZWNrIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3RjaGVjayI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbXT47CitkZWYgaW50X3BwY190cmVjbGFpbSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl90cmVjbGFpbSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eV0sIFtdPjsKK2RlZiBpbnRfcHBjX3RyZWNoa3B0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX3RyZWNoa3B0Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtdPjsKK2RlZiBpbnRfcHBjX3RzciA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl90c3IiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHldLCBbXT47CisKK2RlZiBpbnRfcHBjX2dldF90ZXhhc3IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fZ2V0X3RleGFzciI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtdLCBbXT47CitkZWYgaW50X3BwY19nZXRfdGV4YXNydSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9nZXRfdGV4YXNydSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtdLCBbXT47CitkZWYgaW50X3BwY19nZXRfdGZoYXIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fZ2V0X3RmaGFyIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW10sIFtdPjsKK2RlZiBpbnRfcHBjX2dldF90ZmlhciA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9nZXRfdGZpYXIiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbXSwgW10+OworCitkZWYgaW50X3BwY19zZXRfdGV4YXNyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3NldF90ZXhhc3IiPiwKKyAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5XSwgW10+OworZGVmIGludF9wcGNfc2V0X3RleGFzcnUgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fc2V0X3RleGFzcnUiPiwKKyAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5XSwgW10+OworZGVmIGludF9wcGNfc2V0X3RmaGFyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3NldF90ZmhhciI+LAorICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHldLCBbXT47CitkZWYgaW50X3BwY19zZXRfdGZpYXIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fc2V0X3RmaWFyIj4sCisgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eV0sIFtdPjsKKworLy8gRXh0ZW5kZWQgbW5lbW9uaWNzCitkZWYgaW50X3BwY190ZW5kYWxsIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3RlbmRhbGwiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW10+OworZGVmIGludF9wcGNfdHJlc3VtZSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl90cmVzdW1lIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtdPjsKK2RlZiBpbnRfcHBjX3RzdXNwZW5kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3RzdXNwZW5kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtdPjsKKworZGVmIGludF9wcGNfdHRlc3QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdHRlc3QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbXSwgW10+OworCitkZWYgaW50X3BwY19jZmVuY2UgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2FueWludF90eV0sIFtdPjsKK30KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc1N5c3RlbVoudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NTeXN0ZW1aLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYTJlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NTeXN0ZW1aLnRkCkBAIC0wLDAgKzEsNDMxIEBACisvLz09PS0gSW50cmluc2ljc1N5c3RlbVoudGQgLSBEZWZpbmVzIFN5c3RlbVogaW50cmluc2ljcyAtLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFsbCBvZiB0aGUgU3lzdGVtWi1zcGVjaWZpYyBpbnRyaW5zaWNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIFN5c3RlbVpVbmFyeUNvbnY8c3RyaW5nIG5hbWUsIExMVk1UeXBlIHJlc3VsdCwgTExWTVR5cGUgYXJnPgorICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zMzkwXyIgIyMgbmFtZT4sCisgICAgSW50cmluc2ljPFtyZXN1bHRdLCBbYXJnXSwgW0ludHJOb01lbV0+OworCitjbGFzcyBTeXN0ZW1aVW5hcnk8c3RyaW5nIG5hbWUsIExMVk1UeXBlIHR5cGU+CisgIDogU3lzdGVtWlVuYXJ5Q29udjxuYW1lLCB0eXBlLCB0eXBlPjsKKworY2xhc3MgU3lzdGVtWlVuYXJ5Q29udkNDPExMVk1UeXBlIHJlc3VsdCwgTExWTVR5cGUgYXJnPgorICA6IEludHJpbnNpYzxbcmVzdWx0LCBsbHZtX2kzMl90eV0sIFthcmddLCBbSW50ck5vTWVtXT47CisKK2NsYXNzIFN5c3RlbVpVbmFyeUNDPExMVk1UeXBlIHR5cGU+CisgIDogU3lzdGVtWlVuYXJ5Q29udkNDPHR5cGUsIHR5cGU+OworCitjbGFzcyBTeXN0ZW1aQmluYXJ5Q29udjxzdHJpbmcgbmFtZSwgTExWTVR5cGUgcmVzdWx0LCBMTFZNVHlwZSBhcmc+CisgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3MzOTBfIiAjIyBuYW1lPiwKKyAgICBJbnRyaW5zaWM8W3Jlc3VsdF0sIFthcmcsIGFyZ10sIFtJbnRyTm9NZW1dPjsKKworY2xhc3MgU3lzdGVtWkJpbmFyeTxzdHJpbmcgbmFtZSwgTExWTVR5cGUgdHlwZT4KKyAgOiBTeXN0ZW1aQmluYXJ5Q29udjxuYW1lLCB0eXBlLCB0eXBlPjsKKworY2xhc3MgU3lzdGVtWkJpbmFyeUludDxzdHJpbmcgbmFtZSwgTExWTVR5cGUgdHlwZT4KKyAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fczM5MF8iICMjIG5hbWU+LAorICAgIEludHJpbnNpYzxbdHlwZV0sIFt0eXBlLCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworY2xhc3MgU3lzdGVtWkJpbmFyeUNvbnZDQzxMTFZNVHlwZSByZXN1bHQsIExMVk1UeXBlIGFyZz4KKyAgOiBJbnRyaW5zaWM8W3Jlc3VsdCwgbGx2bV9pMzJfdHldLCBbYXJnLCBhcmddLCBbSW50ck5vTWVtXT47CisKK2NsYXNzIFN5c3RlbVpCaW5hcnlDb252SW50Q0M8TExWTVR5cGUgcmVzdWx0LCBMTFZNVHlwZSBhcmc+CisgIDogSW50cmluc2ljPFtyZXN1bHQsIGxsdm1faTMyX3R5XSwgW2FyZywgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2NsYXNzIFN5c3RlbVpCaW5hcnlDQzxMTFZNVHlwZSB0eXBlPgorICA6IFN5c3RlbVpCaW5hcnlDb252Q0M8dHlwZSwgdHlwZT47CisKK2NsYXNzIFN5c3RlbVpUZXJuYXJ5Q29udjxzdHJpbmcgbmFtZSwgTExWTVR5cGUgcmVzdWx0LCBMTFZNVHlwZSBhcmc+CisgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3MzOTBfIiAjIyBuYW1lPiwKKyAgICBJbnRyaW5zaWM8W3Jlc3VsdF0sIFthcmcsIGFyZywgcmVzdWx0XSwgW0ludHJOb01lbV0+OworCitjbGFzcyBTeXN0ZW1aVGVybmFyeTxzdHJpbmcgbmFtZSwgTExWTVR5cGUgdHlwZT4KKyAgOiBTeXN0ZW1aVGVybmFyeUNvbnY8bmFtZSwgdHlwZSwgdHlwZT47CisKK2NsYXNzIFN5c3RlbVpUZXJuYXJ5SW50PHN0cmluZyBuYW1lLCBMTFZNVHlwZSB0eXBlPgorICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zMzkwXyIgIyMgbmFtZT4sCisgICAgSW50cmluc2ljPFt0eXBlXSwgW3R5cGUsIHR5cGUsIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitjbGFzcyBTeXN0ZW1aVGVybmFyeUludENDPExMVk1UeXBlIHR5cGU+CisgIDogSW50cmluc2ljPFt0eXBlLCBsbHZtX2kzMl90eV0sIFt0eXBlLCB0eXBlLCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworY2xhc3MgU3lzdGVtWlF1YXRlcm5hcnlJbnQ8c3RyaW5nIG5hbWUsIExMVk1UeXBlIHR5cGU+CisgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3MzOTBfIiAjIyBuYW1lPiwKKyAgICBJbnRyaW5zaWM8W3R5cGVdLCBbdHlwZSwgdHlwZSwgdHlwZSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2NsYXNzIFN5c3RlbVpRdWF0ZXJuYXJ5SW50Q0M8TExWTVR5cGUgdHlwZT4KKyAgOiBJbnRyaW5zaWM8W3R5cGUsIGxsdm1faTMyX3R5XSwgW3R5cGUsIHR5cGUsIHR5cGUsIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCittdWx0aWNsYXNzIFN5c3RlbVpVbmFyeUV4dEJIRjxzdHJpbmcgbmFtZT4geworICBkZWYgYiA6IFN5c3RlbVpVbmFyeUNvbnY8bmFtZSMjImIiLCBsbHZtX3Y4aTE2X3R5LCBsbHZtX3YxNmk4X3R5PjsKKyAgZGVmIGggOiBTeXN0ZW1aVW5hcnlDb252PG5hbWUjIyJoIiwgbGx2bV92NGkzMl90eSwgbGx2bV92OGkxNl90eT47CisgIGRlZiBmIDogU3lzdGVtWlVuYXJ5Q29udjxuYW1lIyMiZiIsIGxsdm1fdjJpNjRfdHksIGxsdm1fdjRpMzJfdHk+OworfQorCittdWx0aWNsYXNzIFN5c3RlbVpVbmFyeUV4dEJIV0Y8c3RyaW5nIG5hbWU+IHsKKyAgZGVmIGIgIDogU3lzdGVtWlVuYXJ5Q29udjxuYW1lIyMiYiIsICBsbHZtX3Y4aTE2X3R5LCBsbHZtX3YxNmk4X3R5PjsKKyAgZGVmIGh3IDogU3lzdGVtWlVuYXJ5Q29udjxuYW1lIyMiaHciLCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y4aTE2X3R5PjsKKyAgZGVmIGYgIDogU3lzdGVtWlVuYXJ5Q29udjxuYW1lIyMiZiIsICBsbHZtX3YyaTY0X3R5LCBsbHZtX3Y0aTMyX3R5PjsKK30KKworbXVsdGljbGFzcyBTeXN0ZW1aVW5hcnlCSEY8c3RyaW5nIG5hbWU+IHsKKyAgZGVmIGIgOiBTeXN0ZW1aVW5hcnk8bmFtZSMjImIiLCBsbHZtX3YxNmk4X3R5PjsKKyAgZGVmIGggOiBTeXN0ZW1aVW5hcnk8bmFtZSMjImgiLCBsbHZtX3Y4aTE2X3R5PjsKKyAgZGVmIGYgOiBTeXN0ZW1aVW5hcnk8bmFtZSMjImYiLCBsbHZtX3Y0aTMyX3R5PjsKK30KKworbXVsdGljbGFzcyBTeXN0ZW1aVW5hcnlCSEZHPHN0cmluZyBuYW1lPiA6IFN5c3RlbVpVbmFyeUJIRjxuYW1lPiB7CisgIGRlZiBnIDogU3lzdGVtWlVuYXJ5PG5hbWUjIyJnIiwgbGx2bV92Mmk2NF90eT47Cit9CisKK211bHRpY2xhc3MgU3lzdGVtWlVuYXJ5Q0NCSEYgeworICBkZWYgYnMgOiBTeXN0ZW1aVW5hcnlDQzxsbHZtX3YxNmk4X3R5PjsKKyAgZGVmIGhzIDogU3lzdGVtWlVuYXJ5Q0M8bGx2bV92OGkxNl90eT47CisgIGRlZiBmcyA6IFN5c3RlbVpVbmFyeUNDPGxsdm1fdjRpMzJfdHk+OworfQorCittdWx0aWNsYXNzIFN5c3RlbVpCaW5hcnlUcnVuY0hGRzxzdHJpbmcgbmFtZT4geworICBkZWYgaCA6IFN5c3RlbVpCaW5hcnlDb252PG5hbWUjIyJoIiwgbGx2bV92MTZpOF90eSwgbGx2bV92OGkxNl90eT47CisgIGRlZiBmIDogU3lzdGVtWkJpbmFyeUNvbnY8bmFtZSMjImYiLCBsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y0aTMyX3R5PjsKKyAgZGVmIGcgOiBTeXN0ZW1aQmluYXJ5Q29udjxuYW1lIyMiZyIsIGxsdm1fdjRpMzJfdHksIGxsdm1fdjJpNjRfdHk+OworfQorCittdWx0aWNsYXNzIFN5c3RlbVpCaW5hcnlUcnVuY0NDSEZHIHsKKyAgZGVmIGhzIDogU3lzdGVtWkJpbmFyeUNvbnZDQzxsbHZtX3YxNmk4X3R5LCBsbHZtX3Y4aTE2X3R5PjsKKyAgZGVmIGZzIDogU3lzdGVtWkJpbmFyeUNvbnZDQzxsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y0aTMyX3R5PjsKKyAgZGVmIGdzIDogU3lzdGVtWkJpbmFyeUNvbnZDQzxsbHZtX3Y0aTMyX3R5LCBsbHZtX3YyaTY0X3R5PjsKK30KKworbXVsdGljbGFzcyBTeXN0ZW1aQmluYXJ5RXh0QkhGPHN0cmluZyBuYW1lPiB7CisgIGRlZiBiIDogU3lzdGVtWkJpbmFyeUNvbnY8bmFtZSMjImIiLCBsbHZtX3Y4aTE2X3R5LCBsbHZtX3YxNmk4X3R5PjsKKyAgZGVmIGggOiBTeXN0ZW1aQmluYXJ5Q29udjxuYW1lIyMiaCIsIGxsdm1fdjRpMzJfdHksIGxsdm1fdjhpMTZfdHk+OworICBkZWYgZiA6IFN5c3RlbVpCaW5hcnlDb252PG5hbWUjIyJmIiwgbGx2bV92Mmk2NF90eSwgbGx2bV92NGkzMl90eT47Cit9CisKK211bHRpY2xhc3MgU3lzdGVtWkJpbmFyeUV4dEJIRkc8c3RyaW5nIG5hbWU+IDogU3lzdGVtWkJpbmFyeUV4dEJIRjxuYW1lPiB7CisgIGRlZiBnIDogU3lzdGVtWkJpbmFyeUNvbnY8bmFtZSMjImciLCBsbHZtX3YxNmk4X3R5LCBsbHZtX3YyaTY0X3R5PjsKK30KKworbXVsdGljbGFzcyBTeXN0ZW1aQmluYXJ5QkhGPHN0cmluZyBuYW1lPiB7CisgIGRlZiBiIDogU3lzdGVtWkJpbmFyeTxuYW1lIyMiYiIsIGxsdm1fdjE2aThfdHk+OworICBkZWYgaCA6IFN5c3RlbVpCaW5hcnk8bmFtZSMjImgiLCBsbHZtX3Y4aTE2X3R5PjsKKyAgZGVmIGYgOiBTeXN0ZW1aQmluYXJ5PG5hbWUjIyJmIiwgbGx2bV92NGkzMl90eT47Cit9CisKK211bHRpY2xhc3MgU3lzdGVtWkJpbmFyeUJIRkc8c3RyaW5nIG5hbWU+IDogU3lzdGVtWkJpbmFyeUJIRjxuYW1lPiB7CisgIGRlZiBnIDogU3lzdGVtWkJpbmFyeTxuYW1lIyMiZyIsIGxsdm1fdjJpNjRfdHk+OworfQorCittdWx0aWNsYXNzIFN5c3RlbVpCaW5hcnlJbnRCSEZHPHN0cmluZyBuYW1lPiB7CisgIGRlZiBiIDogU3lzdGVtWkJpbmFyeUludDxuYW1lIyMiYiIsIGxsdm1fdjE2aThfdHk+OworICBkZWYgaCA6IFN5c3RlbVpCaW5hcnlJbnQ8bmFtZSMjImgiLCBsbHZtX3Y4aTE2X3R5PjsKKyAgZGVmIGYgOiBTeXN0ZW1aQmluYXJ5SW50PG5hbWUjIyJmIiwgbGx2bV92NGkzMl90eT47CisgIGRlZiBnIDogU3lzdGVtWkJpbmFyeUludDxuYW1lIyMiZyIsIGxsdm1fdjJpNjRfdHk+OworfQorCittdWx0aWNsYXNzIFN5c3RlbVpCaW5hcnlDQ0JIRiB7CisgIGRlZiBicyA6IFN5c3RlbVpCaW5hcnlDQzxsbHZtX3YxNmk4X3R5PjsKKyAgZGVmIGhzIDogU3lzdGVtWkJpbmFyeUNDPGxsdm1fdjhpMTZfdHk+OworICBkZWYgZnMgOiBTeXN0ZW1aQmluYXJ5Q0M8bGx2bV92NGkzMl90eT47Cit9CisKK211bHRpY2xhc3MgU3lzdGVtWkNvbXBhcmVCSEZHPHN0cmluZyBuYW1lPiB7CisgIGRlZiBicyA6IFN5c3RlbVpCaW5hcnlDQzxsbHZtX3YxNmk4X3R5PjsKKyAgZGVmIGhzIDogU3lzdGVtWkJpbmFyeUNDPGxsdm1fdjhpMTZfdHk+OworICBkZWYgZnMgOiBTeXN0ZW1aQmluYXJ5Q0M8bGx2bV92NGkzMl90eT47CisgIGRlZiBncyA6IFN5c3RlbVpCaW5hcnlDQzxsbHZtX3YyaTY0X3R5PjsKK30KKworbXVsdGljbGFzcyBTeXN0ZW1aVGVybmFyeUV4dEJIRjxzdHJpbmcgbmFtZT4geworICBkZWYgYiA6IFN5c3RlbVpUZXJuYXJ5Q29udjxuYW1lIyMiYiIsIGxsdm1fdjhpMTZfdHksIGxsdm1fdjE2aThfdHk+OworICBkZWYgaCA6IFN5c3RlbVpUZXJuYXJ5Q29udjxuYW1lIyMiaCIsIGxsdm1fdjRpMzJfdHksIGxsdm1fdjhpMTZfdHk+OworICBkZWYgZiA6IFN5c3RlbVpUZXJuYXJ5Q29udjxuYW1lIyMiZiIsIGxsdm1fdjJpNjRfdHksIGxsdm1fdjRpMzJfdHk+OworfQorCittdWx0aWNsYXNzIFN5c3RlbVpUZXJuYXJ5RXh0QkhGRzxzdHJpbmcgbmFtZT4gOiBTeXN0ZW1aVGVybmFyeUV4dEJIRjxuYW1lPiB7CisgIGRlZiBnIDogU3lzdGVtWlRlcm5hcnlDb252PG5hbWUjIyJnIiwgbGx2bV92MTZpOF90eSwgbGx2bV92Mmk2NF90eT47Cit9CisKK211bHRpY2xhc3MgU3lzdGVtWlRlcm5hcnlCSEY8c3RyaW5nIG5hbWU+IHsKKyAgZGVmIGIgOiBTeXN0ZW1aVGVybmFyeTxuYW1lIyMiYiIsIGxsdm1fdjE2aThfdHk+OworICBkZWYgaCA6IFN5c3RlbVpUZXJuYXJ5PG5hbWUjIyJoIiwgbGx2bV92OGkxNl90eT47CisgIGRlZiBmIDogU3lzdGVtWlRlcm5hcnk8bmFtZSMjImYiLCBsbHZtX3Y0aTMyX3R5PjsKK30KKworbXVsdGljbGFzcyBTeXN0ZW1aVGVybmFyeUludEJIRjxzdHJpbmcgbmFtZT4geworICBkZWYgYiA6IFN5c3RlbVpUZXJuYXJ5SW50PG5hbWUjIyJiIiwgbGx2bV92MTZpOF90eT47CisgIGRlZiBoIDogU3lzdGVtWlRlcm5hcnlJbnQ8bmFtZSMjImgiLCBsbHZtX3Y4aTE2X3R5PjsKKyAgZGVmIGYgOiBTeXN0ZW1aVGVybmFyeUludDxuYW1lIyMiZiIsIGxsdm1fdjRpMzJfdHk+OworfQorCittdWx0aWNsYXNzIFN5c3RlbVpUZXJuYXJ5SW50Q0NCSEYgeworICBkZWYgYnMgOiBTeXN0ZW1aVGVybmFyeUludENDPGxsdm1fdjE2aThfdHk+OworICBkZWYgaHMgOiBTeXN0ZW1aVGVybmFyeUludENDPGxsdm1fdjhpMTZfdHk+OworICBkZWYgZnMgOiBTeXN0ZW1aVGVybmFyeUludENDPGxsdm1fdjRpMzJfdHk+OworfQorCittdWx0aWNsYXNzIFN5c3RlbVpRdWF0ZXJuYXJ5SW50QkhGPHN0cmluZyBuYW1lPiB7CisgIGRlZiBiIDogU3lzdGVtWlF1YXRlcm5hcnlJbnQ8bmFtZSMjImIiLCBsbHZtX3YxNmk4X3R5PjsKKyAgZGVmIGggOiBTeXN0ZW1aUXVhdGVybmFyeUludDxuYW1lIyMiaCIsIGxsdm1fdjhpMTZfdHk+OworICBkZWYgZiA6IFN5c3RlbVpRdWF0ZXJuYXJ5SW50PG5hbWUjIyJmIiwgbGx2bV92NGkzMl90eT47Cit9CisKK211bHRpY2xhc3MgU3lzdGVtWlF1YXRlcm5hcnlJbnRCSEZHPHN0cmluZyBuYW1lPiA6IFN5c3RlbVpRdWF0ZXJuYXJ5SW50QkhGPG5hbWU+IHsKKyAgZGVmIGcgOiBTeXN0ZW1aUXVhdGVybmFyeUludDxuYW1lIyMiZyIsIGxsdm1fdjJpNjRfdHk+OworfQorCittdWx0aWNsYXNzIFN5c3RlbVpRdWF0ZXJuYXJ5SW50Q0NCSEYgeworICBkZWYgYnMgOiBTeXN0ZW1aUXVhdGVybmFyeUludENDPGxsdm1fdjE2aThfdHk+OworICBkZWYgaHMgOiBTeXN0ZW1aUXVhdGVybmFyeUludENDPGxsdm1fdjhpMTZfdHk+OworICBkZWYgZnMgOiBTeXN0ZW1aUXVhdGVybmFyeUludENDPGxsdm1fdjRpMzJfdHk+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRyYW5zYWN0aW9uYWwtZXhlY3V0aW9uIGludHJpbnNpY3MKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitsZXQgVGFyZ2V0UHJlZml4ID0gInMzOTAiIGluIHsKKyAgZGVmIGludF9zMzkwX3RiZWdpbiA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vRHVwbGljYXRlLCBJbnRyV3JpdGVNZW1dPjsKKworICBkZWYgaW50X3MzOTBfdGJlZ2luX25vZmxvYXQgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb0R1cGxpY2F0ZSwgSW50cldyaXRlTWVtXT47CisKKyAgZGVmIGludF9zMzkwX3RiZWdpbmMgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vRHVwbGljYXRlLCBJbnRyV3JpdGVNZW1dPjsKKworICBkZWYgaW50X3MzOTBfdGFib3J0IDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9SZXR1cm4sIFRocm93cywgSW50cldyaXRlTWVtXT47CisKKyAgZGVmIGludF9zMzkwX3RlbmQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdGVuZCI+LAorICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXT47CisKKyAgZGVmIGludF9zMzkwX2V0bmQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdHhfbmVzdGluZ19kZXB0aCI+LAorICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfczM5MF9udHN0ZyA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX3B0cjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgSW50cldyaXRlTWVtXT47CisKKyAgZGVmIGludF9zMzkwX3BwYV90eGFzc2lzdCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl90eF9hc3Npc3QiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVmVjdG9yIGludHJpbnNpY3MKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitsZXQgVGFyZ2V0UHJlZml4ID0gInMzOTAiIGluIHsKKyAgZGVmIGludF9zMzkwX2xjYmIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fczM5MF9sY2JiIj4sCisgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9zMzkwX3ZsYmIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fczM5MF92bGJiIj4sCisgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3MzOTBfdmxsIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3MzOTBfdmxsIj4sCisgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF9zMzkwX3ZwZGkgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fczM5MF92cGRpIj4sCisgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfczM5MF92cGVybSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zMzkwX3ZwZXJtIj4sCisgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmbSBpbnRfczM5MF92cGtzIDogU3lzdGVtWkJpbmFyeVRydW5jSEZHPCJ2cGtzIj47CisgIGRlZm0gaW50X3MzOTBfdnBrcyA6IFN5c3RlbVpCaW5hcnlUcnVuY0NDSEZHOworCisgIGRlZm0gaW50X3MzOTBfdnBrbHMgOiBTeXN0ZW1aQmluYXJ5VHJ1bmNIRkc8InZwa2xzIj47CisgIGRlZm0gaW50X3MzOTBfdnBrbHMgOiBTeXN0ZW1aQmluYXJ5VHJ1bmNDQ0hGRzsKKworICBkZWYgaW50X3MzOTBfdnN0bCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zMzkwX3ZzdGwiPiwKKyAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIEludHJXcml0ZU1lbV0+OworCisgIGRlZm0gaW50X3MzOTBfdnVwbCAgOiBTeXN0ZW1aVW5hcnlFeHRCSFdGPCJ2dXBsIj47CisgIGRlZm0gaW50X3MzOTBfdnVwbGwgOiBTeXN0ZW1aVW5hcnlFeHRCSEY8InZ1cGxsIj47CisKKyAgZGVmbSBpbnRfczM5MF92dXBoICA6IFN5c3RlbVpVbmFyeUV4dEJIRjwidnVwaCI+OworICBkZWZtIGludF9zMzkwX3Z1cGxoIDogU3lzdGVtWlVuYXJ5RXh0QkhGPCJ2dXBsaCI+OworCisgIGRlZm0gaW50X3MzOTBfdmFjYyA6IFN5c3RlbVpCaW5hcnlCSEZHPCJ2YWNjIj47CisKKyAgZGVmIGludF9zMzkwX3ZhcSAgICA6IFN5c3RlbVpCaW5hcnk8InZhcSIsICAgICBsbHZtX3YxNmk4X3R5PjsKKyAgZGVmIGludF9zMzkwX3ZhY3EgICA6IFN5c3RlbVpUZXJuYXJ5PCJ2YWNxIiwgICBsbHZtX3YxNmk4X3R5PjsKKyAgZGVmIGludF9zMzkwX3ZhY2NxICA6IFN5c3RlbVpCaW5hcnk8InZhY2NxIiwgICBsbHZtX3YxNmk4X3R5PjsKKyAgZGVmIGludF9zMzkwX3ZhY2NjcSA6IFN5c3RlbVpUZXJuYXJ5PCJ2YWNjY3EiLCBsbHZtX3YxNmk4X3R5PjsKKworICBkZWZtIGludF9zMzkwX3ZhdmcgIDogU3lzdGVtWkJpbmFyeUJIRkc8InZhdmciPjsKKyAgZGVmbSBpbnRfczM5MF92YXZnbCA6IFN5c3RlbVpCaW5hcnlCSEZHPCJ2YXZnbCI+OworCisgIGRlZiBpbnRfczM5MF92Y2tzbSA6IFN5c3RlbVpCaW5hcnk8InZja3NtIiwgbGx2bV92NGkzMl90eT47CisKKyAgZGVmbSBpbnRfczM5MF92Z2ZtICA6IFN5c3RlbVpCaW5hcnlFeHRCSEZHPCJ2Z2ZtIj47CisgIGRlZm0gaW50X3MzOTBfdmdmbWEgOiBTeXN0ZW1aVGVybmFyeUV4dEJIRkc8InZnZm1hIj47CisKKyAgZGVmbSBpbnRfczM5MF92bWFoICA6IFN5c3RlbVpUZXJuYXJ5QkhGPCJ2bWFoIj47CisgIGRlZm0gaW50X3MzOTBfdm1hbGggOiBTeXN0ZW1aVGVybmFyeUJIRjwidm1hbGgiPjsKKyAgZGVmbSBpbnRfczM5MF92bWFlICA6IFN5c3RlbVpUZXJuYXJ5RXh0QkhGPCJ2bWFlIj47CisgIGRlZm0gaW50X3MzOTBfdm1hbGUgOiBTeXN0ZW1aVGVybmFyeUV4dEJIRjwidm1hbGUiPjsKKyAgZGVmbSBpbnRfczM5MF92bWFvICA6IFN5c3RlbVpUZXJuYXJ5RXh0QkhGPCJ2bWFvIj47CisgIGRlZm0gaW50X3MzOTBfdm1hbG8gOiBTeXN0ZW1aVGVybmFyeUV4dEJIRjwidm1hbG8iPjsKKworICBkZWZtIGludF9zMzkwX3ZtaCAgOiBTeXN0ZW1aQmluYXJ5QkhGPCJ2bWgiPjsKKyAgZGVmbSBpbnRfczM5MF92bWxoIDogU3lzdGVtWkJpbmFyeUJIRjwidm1saCI+OworICBkZWZtIGludF9zMzkwX3ZtZSAgOiBTeXN0ZW1aQmluYXJ5RXh0QkhGPCJ2bWUiPjsKKyAgZGVmbSBpbnRfczM5MF92bWxlIDogU3lzdGVtWkJpbmFyeUV4dEJIRjwidm1sZSI+OworICBkZWZtIGludF9zMzkwX3ZtbyAgOiBTeXN0ZW1aQmluYXJ5RXh0QkhGPCJ2bW8iPjsKKyAgZGVmbSBpbnRfczM5MF92bWxvIDogU3lzdGVtWkJpbmFyeUV4dEJIRjwidm1sbyI+OworCisgIGRlZm0gaW50X3MzOTBfdmVybGx2IDogU3lzdGVtWkJpbmFyeUJIRkc8InZlcmxsdiI+OworICBkZWZtIGludF9zMzkwX3ZlcmxsICA6IFN5c3RlbVpCaW5hcnlJbnRCSEZHPCJ2ZXJsbCI+OworICBkZWZtIGludF9zMzkwX3ZlcmltICA6IFN5c3RlbVpRdWF0ZXJuYXJ5SW50QkhGRzwidmVyaW0iPjsKKworICBkZWYgaW50X3MzOTBfdnNsICAgOiBTeXN0ZW1aQmluYXJ5PCJ2c2wiLCAgIGxsdm1fdjE2aThfdHk+OworICBkZWYgaW50X3MzOTBfdnNsYiAgOiBTeXN0ZW1aQmluYXJ5PCJ2c2xiIiwgIGxsdm1fdjE2aThfdHk+OworICBkZWYgaW50X3MzOTBfdnNyYSAgOiBTeXN0ZW1aQmluYXJ5PCJ2c3JhIiwgIGxsdm1fdjE2aThfdHk+OworICBkZWYgaW50X3MzOTBfdnNyYWIgOiBTeXN0ZW1aQmluYXJ5PCJ2c3JhYiIsIGxsdm1fdjE2aThfdHk+OworICBkZWYgaW50X3MzOTBfdnNybCAgOiBTeXN0ZW1aQmluYXJ5PCJ2c3JsIiwgIGxsdm1fdjE2aThfdHk+OworICBkZWYgaW50X3MzOTBfdnNybGIgOiBTeXN0ZW1aQmluYXJ5PCJ2c3JsYiIsIGxsdm1fdjE2aThfdHk+OworCisgIGRlZiBpbnRfczM5MF92c2xkYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zMzkwX3ZzbGRiIj4sCisgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZm0gaW50X3MzOTBfdnNjYmkgOiBTeXN0ZW1aQmluYXJ5QkhGRzwidnNjYmkiPjsKKworICBkZWYgaW50X3MzOTBfdnNxICAgICA6IFN5c3RlbVpCaW5hcnk8InZzcSIsICAgICAgbGx2bV92MTZpOF90eT47CisgIGRlZiBpbnRfczM5MF92c2JpcSAgIDogU3lzdGVtWlRlcm5hcnk8InZzYmlxIiwgICBsbHZtX3YxNmk4X3R5PjsKKyAgZGVmIGludF9zMzkwX3ZzY2JpcSAgOiBTeXN0ZW1aQmluYXJ5PCJ2c2NiaXEiLCAgIGxsdm1fdjE2aThfdHk+OworICBkZWYgaW50X3MzOTBfdnNiY2JpcSA6IFN5c3RlbVpUZXJuYXJ5PCJ2c2JjYmlxIiwgbGx2bV92MTZpOF90eT47CisKKyAgZGVmIGludF9zMzkwX3ZzdW1iIDogU3lzdGVtWkJpbmFyeUNvbnY8InZzdW1iIiwgbGx2bV92NGkzMl90eSwgbGx2bV92MTZpOF90eT47CisgIGRlZiBpbnRfczM5MF92c3VtaCA6IFN5c3RlbVpCaW5hcnlDb252PCJ2c3VtaCIsIGxsdm1fdjRpMzJfdHksIGxsdm1fdjhpMTZfdHk+OworCisgIGRlZiBpbnRfczM5MF92c3VtZ2ggOiBTeXN0ZW1aQmluYXJ5Q29udjwidnN1bWdoIiwgbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHk+OworICBkZWYgaW50X3MzOTBfdnN1bWdmIDogU3lzdGVtWkJpbmFyeUNvbnY8InZzdW1nZiIsIGxsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5PjsKKworICBkZWYgaW50X3MzOTBfdnN1bXFmIDogU3lzdGVtWkJpbmFyeUNvbnY8InZzdW1xZiIsIGxsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5PjsKKyAgZGVmIGludF9zMzkwX3ZzdW1xZyA6IFN5c3RlbVpCaW5hcnlDb252PCJ2c3VtcWciLCBsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eT47CisKKyAgZGVmIGludF9zMzkwX3Z0bSA6IFN5c3RlbVpCaW5hcnlDb252PCJ2dG0iLCBsbHZtX2kzMl90eSwgbGx2bV92MTZpOF90eT47CisKKyAgZGVmbSBpbnRfczM5MF92Y2VxIDogU3lzdGVtWkNvbXBhcmVCSEZHPCJ2Y2VxIj47CisgIGRlZm0gaW50X3MzOTBfdmNoICA6IFN5c3RlbVpDb21wYXJlQkhGRzwidmNoIj47CisgIGRlZm0gaW50X3MzOTBfdmNobCA6IFN5c3RlbVpDb21wYXJlQkhGRzwidmNobCI+OworCisgIGRlZm0gaW50X3MzOTBfdmZhZSAgOiBTeXN0ZW1aVGVybmFyeUludEJIRjwidmZhZSI+OworICBkZWZtIGludF9zMzkwX3ZmYWUgIDogU3lzdGVtWlRlcm5hcnlJbnRDQ0JIRjsKKyAgZGVmbSBpbnRfczM5MF92ZmFleiA6IFN5c3RlbVpUZXJuYXJ5SW50QkhGPCJ2ZmFleiI+OworICBkZWZtIGludF9zMzkwX3ZmYWV6IDogU3lzdGVtWlRlcm5hcnlJbnRDQ0JIRjsKKworICBkZWZtIGludF9zMzkwX3ZmZWUgIDogU3lzdGVtWkJpbmFyeUJIRjwidmZlZSI+OworICBkZWZtIGludF9zMzkwX3ZmZWUgIDogU3lzdGVtWkJpbmFyeUNDQkhGOworICBkZWZtIGludF9zMzkwX3ZmZWV6IDogU3lzdGVtWkJpbmFyeUJIRjwidmZlZXoiPjsKKyAgZGVmbSBpbnRfczM5MF92ZmVleiA6IFN5c3RlbVpCaW5hcnlDQ0JIRjsKKworICBkZWZtIGludF9zMzkwX3ZmZW5lICA6IFN5c3RlbVpCaW5hcnlCSEY8InZmZW5lIj47CisgIGRlZm0gaW50X3MzOTBfdmZlbmUgIDogU3lzdGVtWkJpbmFyeUNDQkhGOworICBkZWZtIGludF9zMzkwX3ZmZW5leiA6IFN5c3RlbVpCaW5hcnlCSEY8InZmZW5leiI+OworICBkZWZtIGludF9zMzkwX3ZmZW5leiA6IFN5c3RlbVpCaW5hcnlDQ0JIRjsKKworICBkZWZtIGludF9zMzkwX3Zpc3RyIDogU3lzdGVtWlVuYXJ5QkhGPCJ2aXN0ciI+OworICBkZWZtIGludF9zMzkwX3Zpc3RyIDogU3lzdGVtWlVuYXJ5Q0NCSEY7CisKKyAgZGVmbSBpbnRfczM5MF92c3RyYyAgOiBTeXN0ZW1aUXVhdGVybmFyeUludEJIRjwidnN0cmMiPjsKKyAgZGVmbSBpbnRfczM5MF92c3RyYyAgOiBTeXN0ZW1aUXVhdGVybmFyeUludENDQkhGOworICBkZWZtIGludF9zMzkwX3ZzdHJjeiA6IFN5c3RlbVpRdWF0ZXJuYXJ5SW50QkhGPCJ2c3RyY3oiPjsKKyAgZGVmbSBpbnRfczM5MF92c3RyY3ogOiBTeXN0ZW1aUXVhdGVybmFyeUludENDQkhGOworCisgIGRlZiBpbnRfczM5MF92ZmNlZGJzICA6IFN5c3RlbVpCaW5hcnlDb252Q0M8bGx2bV92Mmk2NF90eSwgbGx2bV92MmY2NF90eT47CisgIGRlZiBpbnRfczM5MF92ZmNoZGJzICA6IFN5c3RlbVpCaW5hcnlDb252Q0M8bGx2bV92Mmk2NF90eSwgbGx2bV92MmY2NF90eT47CisgIGRlZiBpbnRfczM5MF92ZmNoZWRicyA6IFN5c3RlbVpCaW5hcnlDb252Q0M8bGx2bV92Mmk2NF90eSwgbGx2bV92MmY2NF90eT47CisKKyAgZGVmIGludF9zMzkwX3ZmdGNpZGIgOiBTeXN0ZW1aQmluYXJ5Q29udkludENDPGxsdm1fdjJpNjRfdHksIGxsdm1fdjJmNjRfdHk+OworCisgIGRlZiBpbnRfczM5MF92ZmlkYiA6IEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICAvLyBJbnN0cnVjdGlvbnMgZnJvbSB0aGUgVmVjdG9yIEVuaGFuY2VtZW50cyBGYWNpbGl0eSAxCisgIGRlZiBpbnRfczM5MF92YnBlcm0gOiBTeXN0ZW1aQmluYXJ5Q29udjwidmJwZXJtIiwgbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHk+OworCisgIGRlZiBpbnRfczM5MF92bXNsZyAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fczM5MF92bXNsZyI+LAorICAgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9zMzkwX3ZmbWF4ZGIgOiBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfczM5MF92Zm1pbmRiIDogSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3MzOTBfdmZtYXhzYiA6IEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9zMzkwX3ZmbWluc2IgOiBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9zMzkwX3ZmY2VzYnMgIDogU3lzdGVtWkJpbmFyeUNvbnZDQzxsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0ZjMyX3R5PjsKKyAgZGVmIGludF9zMzkwX3ZmY2hzYnMgIDogU3lzdGVtWkJpbmFyeUNvbnZDQzxsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0ZjMyX3R5PjsKKyAgZGVmIGludF9zMzkwX3ZmY2hlc2JzIDogU3lzdGVtWkJpbmFyeUNvbnZDQzxsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0ZjMyX3R5PjsKKworICBkZWYgaW50X3MzOTBfdmZ0Y2lzYiA6IFN5c3RlbVpCaW5hcnlDb252SW50Q0M8bGx2bV92NGkzMl90eSwgbGx2bV92NGYzMl90eT47CisKKyAgZGVmIGludF9zMzkwX3ZmaXNiIDogSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIC8vIEluc3RydWN0aW9ucyBmcm9tIHRoZSBWZWN0b3IgUGFja2VkIERlY2ltYWwgRmFjaWxpdHkKKyAgZGVmIGludF9zMzkwX3ZscmwgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fczM5MF92bHJsIj4sCisgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3MzOTBfdnN0cmwgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fczM5MF92c3RybCI+LAorICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5LCBJbnRyV3JpdGVNZW1dPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBNaXNjIGludHJpbnNpY3MKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitsZXQgVGFyZ2V0UHJlZml4ID0gInMzOTAiIGluIHsKKyAgZGVmIGludF9zMzkwX3NmcGMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fczM5MF9zZnBjIj4sCisgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHldLCBbXT47CisgIGRlZiBpbnRfczM5MF9lZnBjIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3MzOTBfZWZwYyI+LAorICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW10+OworCisgIGRlZiBpbnRfczM5MF90ZGMgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fYW55ZmxvYXRfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NXZWJBc3NlbWJseS50ZCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc1dlYkFzc2VtYmx5LnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZTVlNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NXZWJBc3NlbWJseS50ZApAQCAtMCwwICsxLDQ4IEBACisvLz09PS0gSW50cmluc2ljc1dlYkFzc2VtYmx5LnRkIC0gRGVmaW5lcyB3YXNtIGludHJpbnNpY3MgLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgVGhpcyBmaWxlIGRlZmluZXMgYWxsIG9mIHRoZSBXZWJBc3NlbWJseS1zcGVjaWZpYyBpbnRyaW5zaWNzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitsZXQgVGFyZ2V0UHJlZml4ID0gIndhc20iIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ud2FzbS4iLgorCisvLyBRdWVyeSB0aGUgY3VycmVudCBtZW1vcnkgc2l6ZSwgYW5kIGluY3JlYXNlIHRoZSBjdXJyZW50IG1lbW9yeSBzaXplLgorLy8gTm90ZSB0aGF0IG1lbS5zaXplIGlzIG5vdCBJbnRyTm9NZW0gYmVjYXVzZSBpdCBtdXN0IGJlIHNlcXVlbmNlZCB3aXRoCisvLyByZXNwZWN0IHRvIG1lbS5ncm93IGNhbGxzLgorLy8gVGhlc2UgYXJlIHRoZSBuZXcgcHJvcG9zZWQgbmFtZXMsIHdoaWNoIGFyZW4ndCB5ZXQgb2ZmaWNpYWwuIFVzZSBhdCB5b3VyIG93bgorLy8gcmlzay4KK2RlZiBpbnRfd2FzbV9tZW1fc2l6ZSA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtXT47CitkZWYgaW50X3dhc21fbWVtX2dyb3cgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHksIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsKKworLy8gVGhlc2UgYXJlIHRoZSBleGlzdGluZyBuYW1lcywgd2hpY2ggYXJlIGN1cnJlbnRseSBvZmZpY2lhbCwgYnV0IGV4cGVjdGVkCisvLyB0byBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUuIFRoZXkgYWxzbyBsYWNrIHRoZSBpbW1lZGlhdGUgZmllbGQuCitkZWYgaW50X3dhc21fY3VycmVudF9tZW1vcnkgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW10sIFtJbnRyUmVhZE1lbV0+OworZGVmIGludF93YXNtX2dyb3dfbWVtb3J5IDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XSwgW10+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRXhjZXB0aW9uIGhhbmRsaW5nIGludHJpbnNpY3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIHRocm93IC8gcmV0aHJvdworZGVmIGludF93YXNtX3Rocm93IDogSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbVGhyb3dzLCBJbnRyTm9SZXR1cm5dPjsKK2RlZiBpbnRfd2FzbV9yZXRocm93IDogSW50cmluc2ljPFtdLCBbXSwgW1Rocm93cywgSW50ck5vUmV0dXJuXT47CisKKy8vIFNpbmNlIHdhc20gZG9lcyBub3QgdXNlIGxhbmRpbmdwYWQgaW5zdHJ1Y3Rpb25zLCB0aGVzZSBpbnN0cnVjdGlvbnMgcmV0dXJuCisvLyBleGNlcHRpb24gcG9pbnRlciBhbmQgc2VsZWN0b3IgdmFsdWVzIHVudGlsIHdlIGxvd2VyIHRoZW0gaW4gV2FzbUVIUHJlcGFyZS4KK2RlZiBpbnRfd2FzbV9nZXRfZXhjZXB0aW9uIDogSW50cmluc2ljPFtsbHZtX3B0cl90eV0sIFtdLCBbSW50ckhhc1NpZGVFZmZlY3RzXT47CitkZWYgaW50X3dhc21fZ2V0X2Voc2VsZWN0b3IgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJIYXNTaWRlRWZmZWN0c10+OworfQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzWDg2LnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzWDg2LnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYTlkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NYODYudGQKQEAgLTAsMCArMSw2NDIzIEBACisvLz09PS0gSW50cmluc2ljc1g4Ni50ZCAtIERlZmluZXMgWDg2IGludHJpbnNpY3MgLS0tLS0tLS0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFsbCBvZiB0aGUgWDg2LXNwZWNpZmljIGludHJpbnNpY3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEludGVycnVwdCB0cmFwcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2ludCA6IEludHJpbnNpYzxbXSwgW2xsdm1faThfdHldPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNFSCBpbnRyaW5zaWNzIGZvciBXaW5kb3dzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geworICBkZWYgaW50X3g4Nl9zZWhfbHNkYSA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgLy8gTWFya3MgdGhlIEVIIHJlZ2lzdHJhdGlvbiBub2RlIGNyZWF0ZWQgaW4gTExWTSBJUiBwcmlvciB0byBjb2RlIGdlbmVyYXRpb24uCisgIGRlZiBpbnRfeDg2X3NlaF9laHJlZ25vZGUgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsKKworICAvLyBNYXJrcyB0aGUgRUggZ3VhcmQgc2xvdCBub2RlIGNyZWF0ZWQgaW4gTExWTSBJUiBwcmlvciB0byBjb2RlIGdlbmVyYXRpb24uCisgIGRlZiBpbnRfeDg2X3NlaF9laGd1YXJkIDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47CisKKyAgLy8gR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgYW4gRUggcmVnaXN0cmF0aW9uIG9iamVjdCwgcmV0dXJucyB0aGUgdHJ1ZQorICAvLyBwYXJlbnQgZnJhbWUgYWRkcmVzcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggbGx2bS5sb2NhbHJlY292ZXIuCisgIGRlZiBpbnRfeDg2X3NlaF9yZWNvdmVyZnAgOiBJbnRyaW5zaWM8W2xsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGTEFHUy4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7CisgIGRlZiBpbnRfeDg2X2ZsYWdzX3JlYWRfdTMyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmVhZGVmbGFnc191MzIiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbXT47CisgIGRlZiBpbnRfeDg2X2ZsYWdzX3JlYWRfdTY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmVhZGVmbGFnc191NjQiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtdLCBbXT47CisgIGRlZiBpbnRfeDg2X2ZsYWdzX3dyaXRlX3UzMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3dyaXRlZWZsYWdzX3UzMiI+LAorICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfZmxhZ3Nfd3JpdGVfdTY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfd3JpdGVlZmxhZ3NfdTY0Ij4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5XSwgW10+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUmVhZCBUaW1lIFN0YW1wIENvdW50ZXIuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geworICBkZWYgaW50X3g4Nl9yZHRzYyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JkdHNjIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbXSwgW10+OworICBkZWYgaW50X3g4Nl9yZHRzY3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yZHRzY3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworfQorCisvLyBSZWFkIFBlcmZvcm1hbmNlLU1vbml0b3JpbmcgQ291bnRlci4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7CisgIGRlZiBpbnRfeDg2X3JkcG1jIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmRwbWMiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2kzMl90eV0sIFtdPjsKK30KKworLy8gUmVhZCBwcm9jZXNzb3IgSUQuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geworICBkZWYgaW50X3g4Nl9yZHBpZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JkcGlkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW10+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ0VUIFNTCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geworICBkZWYgaW50X3g4Nl9pbmNzc3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfaW5jc3NwZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfaW5jc3NwcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2luY3NzcHEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X3Jkc3NwZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Jkc3NwZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl9yZHNzcHEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yZHNzcHEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfc2F2ZXByZXZzc3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zYXZlcHJldnNzcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtdLCBbXT47CisgIGRlZiBpbnRfeDg2X3JzdG9yc3NwIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcnN0b3Jzc3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X3dyc3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfd3Jzc2QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1fcHRyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl93cnNzcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3dyc3NxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX3B0cl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfd3J1c3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfd3J1c3NkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5LCBsbHZtX3B0cl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfd3J1c3NxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfd3J1c3NxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX3B0cl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfc2V0c3Nic3kgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zZXRzc2JzeSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtdLCBbXT47CisgIGRlZiBpbnRfeDg2X2NscnNzYnN5IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY2xyc3Nic3kiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAzRE5vdyEKKworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsKKyAgZGVmIGludF94ODZfM2Rub3dfcGF2Z3VzYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bhdmd1c2IiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl8zZG5vd19wZjJpZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BmMmlkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2XzNkbm93X3BmYWNjIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGZhY2MiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl8zZG5vd19wZmFkZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BmYWRkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfM2Rub3dfcGZjbXBlcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BmY21wZXEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl8zZG5vd19wZmNtcGdlIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGZjbXBnZSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2XzNkbm93X3BmY21wZ3QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZmNtcGd0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfM2Rub3dfcGZtYXggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZm1heCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2XzNkbm93X3BmbWluIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGZtaW4iPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl8zZG5vd19wZm11bCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BmbXVsIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfM2Rub3dfcGZyY3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZnJjcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl8zZG5vd19wZnJjcGl0MSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BmcmNwaXQxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfM2Rub3dfcGZyY3BpdDIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZnJjcGl0MiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2XzNkbm93X3BmcnNxcnQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZnJzcXJ0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2XzNkbm93X3BmcnNxaXQxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGZyc3FpdDEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl8zZG5vd19wZnN1YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bmc3ViIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfM2Rub3dfcGZzdWJyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGZzdWJyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfM2Rub3dfcGkyZmQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waTJmZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl8zZG5vd19wbXVsaHJ3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG11bGhydyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAzRE5vdyEgZXh0ZW5zaW9ucworCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geworICBkZWYgaW50X3g4Nl8zZG5vd2FfcGYyaXcgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZjJpdyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl8zZG5vd2FfcGZuYWNjIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGZuYWNjIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfM2Rub3dhX3BmcG5hY2MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZnBuYWNjIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfM2Rub3dhX3BpMmZ3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGkyZnciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfM2Rub3dhX3Bzd2FwZCA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTU0UxCisKKy8vIEFyaXRobWV0aWMgb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlX3NxcnRfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zcXJ0c3MiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2Vfc3FydF9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NxcnRwcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV9yY3Bfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yY3BzcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV9yY3BfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yY3BwcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV9yc3FydF9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JzcXJ0c3MiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfcnNxcnRfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yc3FydHBzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX21pbl9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21pbnNzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV9taW5fcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9taW5wcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfbWF4X3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWF4c3MiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX21heF9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21heHBzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIENvbXBhcmlzb24gb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlX2NtcF9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NtcHNzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV9jbXBfcHMgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfY29taWVxX3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29taWVxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfY29taWx0X3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29taWx0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfY29taWxlX3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29taWxlIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfY29taWd0X3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29taWd0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfY29taWdlX3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29taWdlIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfY29taW5lcV9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbWluZXEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV91Y29taWVxX3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdWNvbWllcSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX3Vjb21pbHRfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl91Y29taWx0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfdWNvbWlsZV9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Vjb21pbGUiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV91Y29taWd0X3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdWNvbWlndCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX3Vjb21pZ2Vfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl91Y29taWdlIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfdWNvbWluZXFfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl91Y29taW5lcSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworCisvLyBDb252ZXJzaW9uIG9wcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZV9jdnRzczJzaSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHNzMnNpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX2N2dHNzMnNpNjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRzczJzaTY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX2N2dHRzczJzaSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRzczJzaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV9jdnR0c3Myc2k2NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRzczJzaTY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX2N2dHNpMnNzIDogLy8gVE9ETzogUmVtb3ZlIHRoaXMgaW50cmluc2ljLgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX2N2dHNpNjQyc3MgOiAvLyBUT0RPOiBSZW1vdmUgdGhpcyBpbnRyaW5zaWMuCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X3NzZV9jdnRwczJwaSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBzMnBpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX2N2dHRwczJwaTogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBzMnBpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX2N2dHBpMnBzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGkycHMiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIENhY2hlYWJpbGl0eSBzdXBwb3J0IG9wcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZV9zZmVuY2UgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zZmVuY2UiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbXSwgW10+OworfQorCisvLyBDb250cm9sIHJlZ2lzdGVyLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZV9zdG14Y3NyIDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X3NzZV9sZG14Y3NyIDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47Cit9CisKKy8vIE1pc2MuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlX21vdm1za19wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21vdm1za3BzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNTRTIKKworLy8gRlAgYXJpdGhtZXRpYyBvcHMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9zc2UyX3NxcnRfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zcXJ0c2QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3NxcnRfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zcXJ0cGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX21pbl9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21pbnNkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfbWluX3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWlucGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9tYXhfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXhzZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX21heF9wZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21heHBkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIEZQIGNvbXBhcmlzb24gb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlMl9jbXBfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jbXBzZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX2NtcF9wZCA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfY29taWVxX3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29taXNkZXEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfY29taWx0X3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29taXNkbHQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfY29taWxlX3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29taXNkbGUiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfY29taWd0X3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29taXNkZ3QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfY29taWdlX3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29taXNkZ2UiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfY29taW5lcV9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbWlzZG5lcSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl91Y29taWVxX3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdWNvbWlzZGVxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3Vjb21pbHRfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl91Y29taXNkbHQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfdWNvbWlsZV9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Vjb21pc2RsZSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl91Y29taWd0X3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdWNvbWlzZGd0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3Vjb21pZ2Vfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl91Y29taXNkZ2UiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfdWNvbWluZXFfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl91Y29taXNkbmVxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBJbnRlZ2VyIGFyaXRobWV0aWMgb3BzLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZTJfcGFkZHNfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhZGRzYjEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfc3NlMl9wYWRkc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFkZHN3MTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BhZGR1c19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFkZHVzYjEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfc3NlMl9wYWRkdXNfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhZGR1c3cxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfcHN1YnNfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzdWJzYjEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BzdWJzX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3Vic3cxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9wc3VidXNfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzdWJ1c2IxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9wc3VidXNfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzdWJ1c3cxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9wbXVsaHVfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWxodXcxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfcG11bGhfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWxodzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfc3NlMl9wbXVsdV9kcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWx1ZHExMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfcG1hZGRfd2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbWFkZHdkMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BzYWRfYncgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2FkYncxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47Cit9CisKKy8vIEludGVnZXIgc2hpZnQgb3BzLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZTJfcHNsbF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHcxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9wc2xsX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xsZDEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BzbGxfcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGxxMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfcHNybF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybHcxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9wc3JsX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsZDEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BzcmxfcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmxxMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfcHNyYV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXcxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9wc3JhX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhZDEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X3NzZTJfcHNsbGlfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGx3aTEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9wc2xsaV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbGRpMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BzbGxpX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xscWkxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfcHNybGlfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bzcmx3aTEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9wc3JsaV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybGRpMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BzcmxpX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JscWkxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfcHNyYWlfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmF3aTEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9wc3JhaV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYWRpMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBDb252ZXJzaW9uIG9wcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZTJfY3Z0ZHEycHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRkcTJwcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9jdnRwZDJkcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBkMmRxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX2N2dHRwZDJkcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwZDJkcSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9jdnRwZDJwcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBkMnBzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX2N2dHBzMmRxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cHMyZHEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfY3Z0dHBzMmRxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBzMmRxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX2N2dHNkMnNpIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0c2Qyc2kiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX2N2dHNkMnNpNjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRzZDJzaTY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9jdnR0c2Qyc2kgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0c2Qyc2kiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX2N2dHRzZDJzaTY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHNkMnNpNjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX2N2dHNpMnNkIDogLy8gVE9ETzogUmVtb3ZlIHRoaXMgaW50cmluc2ljLgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9jdnRzaTY0MnNkIDogLy8gVE9ETzogUmVtb3ZlIHRoaXMgaW50cmluc2ljLgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9jdnRzZDJzcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHNkMnNzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfY3Z0c3Myc2QgOiAvLyBUT0RPOiBSZW1vdmUgdGhpcyBpbnRyaW5zaWMuCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV9jdnRwZDJwaSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBkMnBpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX2N2dHRwZDJwaTogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBkMnBpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX2N2dHBpMnBkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGkycGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBNaXNjLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZTJfcGFja3Nzd2JfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFja3Nzd2IxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9wYWNrc3Nkd18xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWNrc3NkdzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BhY2t1c3diXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhY2t1c3diMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfbW92bXNrX3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbW92bXNrcGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3Btb3Ztc2tiXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Ztc2tiMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9tYXNrbW92X2RxdSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21hc2ttb3ZkcXUiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5LCBsbHZtX3B0cl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfc3NlMl9jbGZsdXNoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY2xmbHVzaCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfc3NlMl9sZmVuY2UgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9sZmVuY2UiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbXSwgW10+OworICBkZWYgaW50X3g4Nl9zc2UyX21mZW5jZSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21mZW5jZSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtdLCBbXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfcGF1c2UgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYXVzZSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtdLCBbXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTU0UzCisKKy8vIEFkZGl0aW9uIC8gc3VidHJhY3Rpb24gb3BzLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZTNfYWRkc3ViX3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYWRkc3VicHMiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlM19hZGRzdWJfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZGRzdWJwZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBIb3Jpem9udGFsIG9wcy4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9zc2UzX2hhZGRfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9oYWRkcHMiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlM19oYWRkX3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfaGFkZHBkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTNfaHN1Yl9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2hzdWJwcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UzX2hzdWJfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9oc3VicGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gU3BlY2lhbGl6ZWQgdW5hbGlnbmVkIGxvYWQuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlM19sZHVfZHEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9sZGRxdSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50clJlYWRNZW1dPjsKK30KKworLy8gVGhyZWFkIHN5bmNocm9uaXphdGlvbiBvcHMuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlM19tb25pdG9yIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbW9uaXRvciI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X3NzZTNfbXdhaXQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9td2FpdCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtdPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNTU0UzCisKKy8vIEhvcml6b250YWwgYXJpdGhtZXRpYyBvcHMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9zc3NlM19waGFkZF93ICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waGFkZHciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NzZTNfcGhhZGRfd18xMjggICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGhhZGR3MTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfc3NzZTNfcGhhZGRfZCAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGhhZGRkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BoYWRkX2RfMTI4ICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BoYWRkZDEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BoYWRkX3N3ICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BoYWRkc3ciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NzZTNfcGhhZGRfc3dfMTI4ICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGhhZGRzdzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3Boc3ViX3cgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Boc3VidyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc3NlM19waHN1Yl93XzEyOCAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waHN1YncxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9zc3NlM19waHN1Yl9kICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waHN1YmQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NzZTNfcGhzdWJfZF8xMjggICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGhzdWJkMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfc3NzZTNfcGhzdWJfc3cgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGhzdWJzdyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc3NlM19waHN1Yl9zd18xMjggICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waHN1YnN3MTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfc3NzZTNfcG1hZGRfdWJfc3cgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1hZGR1YnN3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BtYWRkX3ViX3N3XzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtYWRkdWJzdzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBQYWNrZWQgbXVsdGlwbHkgaGlnaCB3aXRoIHJvdW5kIGFuZCBzY2FsZQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BtdWxfaHJfc3cgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWxocnN3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9zc3NlM19wbXVsX2hyX3N3XzEyOCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsaHJzdzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKK30KKworLy8gU2h1ZmZsZSBvcHMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9zc3NlM19wc2h1Zl9iICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2h1ZmIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NzZTNfcHNodWZfYl8xMjggICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNodWZiMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV9wc2h1Zl93ICAgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzaHVmdyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKy8vIFNpZ24gb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NzZTNfcHNpZ25fYiAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNpZ25iIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BzaWduX2JfMTI4ICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzaWduYjEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BzaWduX3cgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzaWdudyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc3NlM19wc2lnbl93XzEyOCAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2lnbncxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9zc3NlM19wc2lnbl9kICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2lnbmQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NzZTNfcHNpZ25fZF8xMjggICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNpZ25kMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIEFic29sdXRlIHZhbHVlIG9wcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BhYnNfYiAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWJzYiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BhYnNfdyAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWJzdyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BhYnNfZCAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWJzZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU1NFNC4xCisKKy8vIEZQIHJvdW5kaW5nIG9wcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZTQxX3JvdW5kX3NzICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JvdW5kc3MiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTQxX3JvdW5kX3BzICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JvdW5kcHMiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTQxX3JvdW5kX3NkICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JvdW5kc2QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTQxX3JvdW5kX3BkICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JvdW5kcGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIFZlY3RvciBtaW4gZWxlbWVudAorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZTQxX3BobWlucG9zdXcgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGhtaW5wb3N1dzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKy8vIEFkdmFuY2VkIEVuY3J5cHRpb24gU3RhbmRhcmQgKEFFUykgSW5zdHJ1Y3Rpb25zCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYWVzbmlfYWVzaW1jICAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYWVzaW1jMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hZXNuaV9hZXNlbmMgICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZXNlbmMxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hZXNuaV9hZXNlbmNfMjU2ICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZXNlbmMyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hZXNuaV9hZXNlbmNfNTEyICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZXNlbmM1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2Flc25pX2Flc2VuY2xhc3QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZXNlbmNsYXN0MTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYWVzbmlfYWVzZW5jbGFzdF8yNTYgOgorICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Flc2VuY2xhc3QyNTYiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYWVzbmlfYWVzZW5jbGFzdF81MTIgOgorICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Flc2VuY2xhc3Q1MTIiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hZXNuaV9hZXNkZWMgICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZXNkZWMxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hZXNuaV9hZXNkZWNfMjU2ICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZXNkZWMyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hZXNuaV9hZXNkZWNfNTEyICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZXNkZWM1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2Flc25pX2Flc2RlY2xhc3QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZXNkZWNsYXN0MTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYWVzbmlfYWVzZGVjbGFzdF8yNTYgOgorICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Flc2RlY2xhc3QyNTYiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYWVzbmlfYWVzZGVjbGFzdF81MTIgOgorICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Flc2RlY2xhc3Q1MTIiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hZXNuaV9hZXNrZXlnZW5hc3Npc3QgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZXNrZXlnZW5hc3Npc3QxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCisvLyBQQ0xNVUwgaW5zdHJ1Y3Rpb25zCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9wY2xtdWxxZHEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY2xtdWxxZHExMjgiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfcGNsbXVscWRxXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbG11bHFkcTI1NiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9wY2xtdWxxZHFfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNsbXVscWRxNTEyIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKy8vIFZlY3RvciBwYWNrCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlNDFfcGFja3VzZHcgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFja3VzZHcxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCisvLyBWZWN0b3IgbXVsdGlwbHkKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9zc2U0MV9wbXVsZHEgICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsZHExMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKK30KKworLy8gVmVjdG9yIGluc2VydAorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZTQxX2luc2VydHBzICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfaW5zZXJ0cHMxMjgiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy8gVmVjdG9yIGJsZW5kCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlNDFfcGJsZW5kdmIgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BibGVuZHZiMTI4Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2U0MV9ibGVuZHZwZCAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYmxlbmR2cGQiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTQxX2JsZW5kdnBzICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9ibGVuZHZwcyI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSxsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy8gVmVjdG9yIGRvdCBwcm9kdWN0CitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlNDFfZHBwZCAgICAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZHBwZCI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfc3NlNDFfZHBwcyAgICAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZHBwcyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKK30KKworLy8gVmVjdG9yIHN1bSBvZiBhYnNvbHV0ZSBkaWZmZXJlbmNlcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZTQxX21wc2FkYncgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21wc2FkYncxMjgiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSxsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKK30KKworLy8gVGVzdCBpbnN0cnVjdGlvbiB3aXRoIGJpdHdpc2UgY29tcGFyaXNvbi4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7IC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZTQxX3B0ZXN0eiAgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3B0ZXN0ejEyOCI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlNDFfcHRlc3RjICAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHRlc3RjMTI4Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2U0MV9wdGVzdG56YyAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdGVzdG56YzEyOCI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNTRTQuMgorCisvLyBNaXNjZWxsYW5lb3VzCisvLyBDUkMgSW5zdHJ1Y3Rpb24KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7IC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZTQyX2NyYzMyXzMyXzggICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jcmMzMnFpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlNDJfY3JjMzJfMzJfMTYgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NyYzMyaGkiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlNDJfY3JjMzJfMzJfMzIgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NyYzMyc2kiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlNDJfY3JjMzJfNjRfNjQgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NyYzMyZGkiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy8gU3RyaW5nL3RleHQgcHJvY2Vzc2luZyBvcHMuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9zc2U0Ml9wY21waXN0cm0xMjggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGlzdHJtMTI4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLAorICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBpc3RyaTEyOCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21waXN0cmkxMjgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLAorICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBpc3RyaWExMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21waXN0cmlhMTI4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2U0Ml9wY21waXN0cmljMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGlzdHJpYzEyOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlNDJfcGNtcGlzdHJpbzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaW8xMjgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLAorICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBpc3RyaXMxMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21waXN0cmlzMTI4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2U0Ml9wY21waXN0cml6MTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGlzdHJpejEyOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlNDJfcGNtcGVzdHJtMTI4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbXBlc3RybTEyOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2U0Ml9wY21wZXN0cmkxMjggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGVzdHJpMTI4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2U0Ml9wY21wZXN0cmlhMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGVzdHJpYTEyOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlNDJfcGNtcGVzdHJpYzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaWMxMjgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgIGxsdm1faThfdHldLAorICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBlc3RyaW8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21wZXN0cmlvMTI4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2U0Ml9wY21wZXN0cmlzMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGVzdHJpczEyOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlNDJfcGNtcGVzdHJpejEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaXoxMjgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgIGxsdm1faThfdHldLAorICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTU0U0QQorCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlNGFfZXh0cnFpIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXh0cnFpIj4sCisgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faThfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTRhX2V4dHJxICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4dHJxIj4sCisgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfc3NlNGFfaW5zZXJ0cWkgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9pbnNlcnRxaSI+LAorICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2U0YV9pbnNlcnRxICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2luc2VydHEiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFWWAorCisvLyBBcml0aG1ldGljIG9wcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eF9hZGRzdWJfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYWRkc3VicGQyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfYWRkc3ViX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2FkZHN1YnBzMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X21heF9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXhwZDI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF9tYXhfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWF4cHMyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfbWluX3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21pbnBkMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92NGY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X21pbl9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9taW5wczI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4X3NxcnRfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc3FydHBkMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfc3FydF9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zcXJ0cHMyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4X3JzcXJ0X3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JzcXJ0cHMyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4X3JjcF9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yY3BwczI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdnhfcm91bmRfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcm91bmRwZDI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfcm91bmRfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcm91bmRwczI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBIb3Jpem9udGFsIG9wcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eF9oYWRkX3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2hhZGRwZDI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF9oc3ViX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2hzdWJwczI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF9oc3ViX3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2hzdWJwZDI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF9oYWRkX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2hhZGRwczI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIFZlY3RvciBwZXJtdXRhdGlvbgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eF92cGVybWlsdmFyX3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBkIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X3ZwZXJtaWx2YXJfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycHMiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eF92cGVybWlsdmFyX3BkXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwZDI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwgbGx2bV92NGk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X3ZwZXJtaWx2YXJfcHNfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBzMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4aTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfZF8xMjggOgorICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJkMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9kXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJkMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9kXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybWkydmFyX2hpXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJoaTEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfaGlfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcmhpMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aTE2X3R5LCBsbHZtX3YxNmkxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybWkydmFyX2hpXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJoaTUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sCisgICAgICAgICAgW2xsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eSwgbGx2bV92MzJpMTZfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9wZF8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWkydmFycGQxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybWkydmFyX3BkXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJwZDI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcGRfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnBkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9wc18xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWkydmFycHMxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybWkydmFyX3BzXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJwczI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcHNfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnBzNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmYzMl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybWkydmFyX3FfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnExMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybWkydmFyX3FfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnEyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybWkydmFyX3FfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnE1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybXQydmFyX2RfNTEyOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFyZDUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcV81MTI6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcHNfNTEyOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFycHM1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3BkXzUxMjoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBkNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfZF8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFyZDEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX2RfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmQxMjhfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9kXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJkMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfZF8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFyZDI1Nl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9kXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJkNTEyX21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9oaV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFyaGkxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9oaV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFyaGkxMjhfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9oaV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFyaGkyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX2hpXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJoaTI1Nl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfaGlfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmhpNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwKKyAgICAgICAgICBbbGx2bV92MzJpMTZfdHksIGxsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9oaV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFyaGk1MTJfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwKKyAgICAgICAgICBbbGx2bV92MzJpMTZfdHksIGxsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3BkXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwZDEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3BkXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwZDEyOF9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3BkXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwZDI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3BkXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwZDI1Nl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9wZF81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFycGQ1MTJfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9wc18xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFycHMxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9wc18xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFycHMxMjhfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9wc18yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFycHMyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9wc18yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFycHMyNTZfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcHNfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBzNTEyX21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9xXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFycTEyOF9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3FfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnEyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9xXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxMjU2X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3FfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnE1MTJfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9xaV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWkydmFycWkxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LAorICAgICAgICAgIGxsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9xaV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFycWkxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LAorICAgICAgICAgIGxsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcWlfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnFpMTI4X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksCisgICAgICAgICAgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybWkydmFyX3FpXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJxaTI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fdjMyaThfdHksCisgICAgICAgICAgbGx2bV92MzJpOF90eSwgbGx2bV92MzJpOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3FpXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxaTI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fdjMyaThfdHksCisgICAgICAgICAgbGx2bV92MzJpOF90eSwgbGx2bV92MzJpOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9xaV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFycWkyNTZfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaThfdHldLCBbbGx2bV92MzJpOF90eSwKKyAgICAgICAgICBsbHZtX3YzMmk4X3R5LCBsbHZtX3YzMmk4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcWlfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnFpNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjY0aThfdHldLCBbbGx2bV92NjRpOF90eSwKKyAgICAgICAgICBsbHZtX3Y2NGk4X3R5LCBsbHZtX3Y2NGk4X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcWlfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnFpNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjY0aThfdHldLCBbbGx2bV92NjRpOF90eSwKKyAgICAgICAgICBsbHZtX3Y2NGk4X3R5LCBsbHZtX3Y2NGk4X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3FpXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxaTUxMl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NjRpOF90eV0sIFtsbHZtX3Y2NGk4X3R5LAorICAgICAgICAgIGxsdm1fdjY0aThfdHksIGxsdm1fdjY0aThfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3ZwZXJtaWx2YXJfcGRfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBkNTEyIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhpNjRfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfdnBlcm1pbHZhcl9wc181MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycHM1MTIiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc2h1Zl9iXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzaHVmYjUxMiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NjRpOF90eV0sIFtsbHZtX3Y2NGk4X3R5LCBsbHZtX3Y2NGk4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKK30KKworLy8gR0ZOSSBJbnN0cnVjdGlvbnMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl92Z2YycDhhZmZpbmVpbnZxYl8xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmdmMnA4YWZmaW5laW52cWJfdjE2cWkiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3ZnZjJwOGFmZmluZWludnFiXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Z2YycDhhZmZpbmVpbnZxYl92MzJxaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sCisgICAgICAgICAgW2xsdm1fdjMyaThfdHksIGxsdm1fdjMyaThfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfdmdmMnA4YWZmaW5laW52cWJfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZnZjJwOGFmZmluZWludnFiX3Y2NHFpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y2NGk4X3R5XSwKKyAgICAgICAgICBbbGx2bV92NjRpOF90eSwgbGx2bV92NjRpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X3ZnZjJwOGFmZmluZXFiXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Z2YycDhhZmZpbmVxYl92MTZxaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfdmdmMnA4YWZmaW5lcWJfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZnZjJwOGFmZmluZXFiX3YzMnFpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwKKyAgICAgICAgICBbbGx2bV92MzJpOF90eSwgbGx2bV92MzJpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl92Z2YycDhhZmZpbmVxYl81MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmdmMnA4YWZmaW5lcWJfdjY0cWkiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjY0aThfdHldLAorICAgICAgICAgIFtsbHZtX3Y2NGk4X3R5LCBsbHZtX3Y2NGk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfdmdmMnA4bXVsYl8xMjggICAgIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZnZjJwOG11bGJfdjE2cWkiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3ZnZjJwOG11bGJfMjU2ICAgICA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Z2YycDhtdWxiX3YzMnFpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwKKyAgICAgICAgICBbbGx2bV92MzJpOF90eSwgbGx2bV92MzJpOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl92Z2YycDhtdWxiXzUxMiAgICAgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmdmMnA4bXVsYl92NjRxaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NjRpOF90eV0sCisgICAgICAgICAgW2xsdm1fdjY0aThfdHksIGxsdm1fdjY0aThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy8gVmVjdG9yIGJsZW5kCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4X2JsZW5kdl9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9ibGVuZHZwZDI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF9ibGVuZHZfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYmxlbmR2cHMyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBWZWN0b3IgZG90IHByb2R1Y3QKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdnhfZHBfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZHBwczI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworfQorCisvLyBWZWN0b3IgY29tcGFyZQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eF9jbXBfcGRfMjU2IDoKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfY21wX3BzXzI1NiA6CisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92OGYzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gVmVjdG9yIGNvbnZlcnQKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdnhfY3Z0ZHEyX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dGRxMnBzMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfY3Z0X3BkMl9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwZDJwczI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X2N2dF9wczJkcV8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwczJkcTI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X2N2dHRfcGQyZHFfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBkMmRxMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfY3Z0X3BkMmRxXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBkMmRxMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfY3Z0dF9wczJkcV8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cHMyZHEyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIFZlY3RvciBiaXQgdGVzdAorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eF92dGVzdHpfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92dGVzdHpwZCI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfdnRlc3RjX3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnRlc3RjcGQiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X3Z0ZXN0bnpjX3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnRlc3RuemNwZCI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfdnRlc3R6X3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnRlc3R6cHMiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X3Z0ZXN0Y19wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Z0ZXN0Y3BzIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF92dGVzdG56Y19wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Z0ZXN0bnpjcHMiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X3Z0ZXN0el9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92dGVzdHpwZDI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmNjRfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfdnRlc3RjX3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Z0ZXN0Y3BkMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF92dGVzdG56Y19wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92dGVzdG56Y3BkMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF92dGVzdHpfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnRlc3R6cHMyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X3Z0ZXN0Y19wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92dGVzdGNwczI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjhmMzJfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfdnRlc3RuemNfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnRlc3RuemNwczI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjhmMzJfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfcHRlc3R6XzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3B0ZXN0ejI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfcHRlc3RjXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3B0ZXN0YzI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfcHRlc3RuemNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHRlc3RuemMyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0aTY0X3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92NGk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BkXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9mcGNsYXNzcGQxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pOF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BkXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9mcGNsYXNzcGQyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pOF90eV0sIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BkXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9mcGNsYXNzcGQ1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pOF90eV0sIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BzXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9mcGNsYXNzcHMxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pOF90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BzXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9mcGNsYXNzcHMyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pOF90eV0sIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BzXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9mcGNsYXNzcHM1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMTZfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19mcGNsYXNzX3NkIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NzZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k4X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2ZwY2xhc3Nfc3MgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZnBjbGFzc3NzX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faThfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy8gVmVjdG9yIGV4dHJhY3Qgc2lnbiBtYXNrCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4X21vdm1za19wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tb3Ztc2twZDI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF9tb3Ztc2tfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbW92bXNrcHMyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBWZWN0b3IgemVybworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eF92emVyb2FsbCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Z6ZXJvYWxsIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW10sIFtdPjsKKyAgZGVmIGludF94ODZfYXZ4X3Z6ZXJvdXBwZXIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92emVyb3VwcGVyIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW10sIFtdPjsKK30KKworLy8gU0lNRCBsb2FkIG9wcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eF9sZHVfZHFfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbGRkcXUyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJSZWFkTWVtXT47Cit9CisKKy8vIENvbmRpdGlvbmFsIGxvYWQgb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4X21hc2tsb2FkX3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWFza2xvYWRwZCI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdnhfbWFza2xvYWRfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHBzIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eF9tYXNrbG9hZF9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHBkMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eF9tYXNrbG9hZF9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHBzMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47Cit9CisKKy8vIENvbmRpdGlvbmFsIHN0b3JlIG9wcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eF9tYXNrc3RvcmVfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVwZCI+LAorICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjJpNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4X21hc2tzdG9yZV9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXBzIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdnhfbWFza3N0b3JlX3BkXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXBkMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92NGk2NF90eSwgbGx2bV92NGY2NF90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdnhfbWFza3N0b3JlX3BzXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXBzMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eSwgbGx2bV92OGYzMl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3N0b3JlX3NzIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc3RvcmVzc19tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworfQorCisvLyBCSVRBTEcgYml0cyBzaHVmZmxlCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaHVmYml0cW1iXzEyOCA6CisgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHVmYml0cW1iMTI4X21hc2siPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNodWZiaXRxbWJfMjU2IDoKKyAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNodWZiaXRxbWIyNTZfbWFzayI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV92MzJpOF90eSwgbGx2bV92MzJpOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2h1ZmJpdHFtYl81MTIgOgorICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2h1ZmJpdHFtYjUxMl9tYXNrIj4sCisgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX3Y2NGk4X3R5LCBsbHZtX3Y2NGk4X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFWWDIKKworLy8gSW50ZWdlciBhcml0aG1ldGljIG9wcy4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdngyX3BhZGRzX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWRkc2IyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fdjMyaThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpOF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcGFkZHNfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhZGRzdzI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTE2X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wYWRkdXNfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhZGR1c2IyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fdjMyaThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpOF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcGFkZHVzX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWRkdXN3MjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzdWJzX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3Vic2IyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fdjMyaThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc3Vic193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHN1YnN3MjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHN1YnVzX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3VidXNiMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sIFtsbHZtX3YzMmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHN1YnVzX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3VidXN3MjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcG11bGh1X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsaHV3MjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BtdWxoX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsaHcyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcG11bHVfZHEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsdWRxMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BtdWxfZHEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsZHEyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcG1hZGRfd2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbWFkZHdkMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNhZF9idyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzYWRidzI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92MzJpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmk4X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKK30KKworLy8gSW50ZWdlciBzaGlmdCBvcHMuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4Ml9wc2xsX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xsdzI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNsbF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbGQyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc2xsX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xscTI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzcmxfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bzcmx3MjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc3JsX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsZDI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzcmxfcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmxxMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNyYV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXcyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzcmFfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmFkMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4Ml9wc2xsaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHdpMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNsbGlfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGxkaTI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc2xsaV9xIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHFpMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzcmxpX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3Jsd2kyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc3JsaV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybGRpMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzcmxpX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JscWkyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNyYWlfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmF3aTI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzcmFpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhZGkyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzcmFfcV8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhcTEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNyYV9xXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmFxMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzcmFpX3FfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXFpMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNyYWlfcV8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhcWkyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzbGxfd181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xsdzUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc2xsX2RfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbGQ1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNsbF9xXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGxxNTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3JsX3dfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybHc1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNybF9kXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmxkNTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzcmxfcV81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JscTUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNyYV93XzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmF3NTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLCBbbGx2bV92MzJpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzcmFfZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhZDUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3JhX3FfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXE1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNsbGlfd181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xsd2k1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzbGxpX2RfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbGRpNTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc2xsaV9xXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGxxaTUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzcmxpX3dfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybHdpNTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLCBbbGx2bV92MzJpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3JsaV9kXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmxkaTUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNybGlfcV81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JscWk1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3JhaV93XzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmF3aTUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNyYWlfZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhZGk1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzcmFpX3FfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXFpNTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BtdWx0aXNoaWZ0X3FiXzEyODoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBtdWx0aXNoaWZ0cWIxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG11bHRpc2hpZnRfcWJfMjU2OgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG11bHRpc2hpZnRxYjI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sIFtsbHZtX3YzMmk4X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaThfdHksIGxsdm1fdjMyaThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbXVsdGlzaGlmdF9xYl81MTI6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwbXVsdGlzaGlmdHFiNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y2NGk4X3R5XSwgW2xsdm1fdjY0aThfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92NjRpOF90eSwgbGx2bV92NjRpOF90eSwgbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIFBhY2sgb3BzLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eDJfcGFja3Nzd2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWNrc3N3YjI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaThfdHldLCBbbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcGFja3NzZHcgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWNrc3NkdzI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wYWNrdXN3YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhY2t1c3diMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sIFtsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wYWNrdXNkdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhY2t1c2R3MjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTMyX3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBIb3Jpem9udGFsIGFyaXRobWV0aWMgb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4Ml9waGFkZF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGhhZGR3MjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcGhhZGRfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BoYWRkZDI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BoYWRkX3N3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGhhZGRzdzI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3Boc3ViX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waHN1YncyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9waHN1Yl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGhzdWJkMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcGhzdWJfc3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waHN1YnN3MjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcG1hZGRfdWJfc3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbWFkZHVic3cyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YzMmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaThfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIFNpZ24gb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4Ml9wc2lnbl9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNpZ25iMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sIFtsbHZtX3YzMmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNpZ25fdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzaWdudzI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzaWduX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2lnbmQyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gUGFja2VkIG11bHRpcGx5IGhpZ2ggd2l0aCByb3VuZCBhbmQgc2NhbGUKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdngyX3BtdWxfaHJfc3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsaHJzdzI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTE2X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BtdWxfaHJfc3dfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG11bGhyc3c1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47Cit9CisKKy8vIFZlY3RvciBibGVuZAorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eDJfcGJsZW5kdmIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYmxlbmR2YjI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaThfdHldLCBbbGx2bV92MzJpOF90eSwgbGx2bV92MzJpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmk4X3R5XSwgW0ludHJOb01lbV0+OworfQorCisKKy8vIFZlY3RvciBwZXJtdXRhdGlvbgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eDJfcGVybWQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZXJtdmFyc2kyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3Blcm1wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Blcm12YXJzZjI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwgbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKy8vIENvbmRpdGlvbmFsIGxvYWQgb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4Ml9tYXNrbG9hZF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWFza2xvYWRkIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDJfbWFza2xvYWRfcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21hc2tsb2FkcSI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdngyX21hc2tsb2FkX2RfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWFza2xvYWRkMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDJfbWFza2xvYWRfcV8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHEyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKK30KKworLy8gQ29uZGl0aW9uYWwgc3RvcmUgb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4Ml9tYXNrc3RvcmVfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZWQiPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDJfbWFza3N0b3JlX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVxIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdngyX21hc2tzdG9yZV9kXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZWQyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHldLAorICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDJfbWFza3N0b3JlX3FfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWFza3N0b3JlcTI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKK30KKworLy8gVmFyaWFibGUgYml0IHNoaWZ0IG9wcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eDJfcHNsbHZfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGx2NHNpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc2xsdl9kXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGx2OHNpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc2xsdl9xIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHYyZGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzbGx2X3FfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHY0ZGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc2xsdl9kXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGx2MTZzaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc2xsdl9xXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGx2OGRpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdngyX3Bzcmx2X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsdjRzaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNybHZfZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsdjhzaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNybHZfcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bzcmx2MmRpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc3Jsdl9xXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bzcmx2NGRpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNybHZfZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsdjE2c2kiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNybHZfcV81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsdjhkaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4Ml9wc3Jhdl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXY0c2kiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzcmF2X2RfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXY4c2kiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3Jhdl9kXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmF2MTZzaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3Jhdl9xXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmF2cTEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3Jhdl9xXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmF2cTI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3Jhdl9xXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmF2OGRpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNsbHZfd18xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xsdjhoaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc2xsdl93XzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGx2MTZoaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LCBsbHZtX3YxNmkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc2xsdl93XzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGx2MzJoaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3Bzcmx2X3dfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybHY4aGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNybHZfd18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsdjE2aGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNybHZfd181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsdjMyaGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YzMmkxNl90eSwgbGx2bV92MzJpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3Jhdl93XzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmF2OGhpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzcmF2X3dfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXYxNmhpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzcmF2X3dfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXYzMmhpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLCBbbGx2bV92MzJpMTZfdHksIGxsdm1fdjMyaTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wcm9ydl9kXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Byb3J2ZDEyOF9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Byb3J2X2RfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHJvcnZkMjU2X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHJvcnZfZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wcm9ydmQ1MTJfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eSwgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Byb3J2X3FfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHJvcnZxMTI4X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHJvcnZfcV8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wcm9ydnEyNTZfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wcm9ydl9xXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Byb3J2cTUxMl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Byb2xfZF8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wcm9sZDEyOF9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0gLCBbbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHJvbF9kXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Byb2xkMjU2X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSAsIFtsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wcm9sX2RfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHJvbGQ1MTJfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSAsIFtsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wcm9sX3FfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHJvbHExMjhfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldICwgW2xsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Byb2xfcV8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wcm9scTI1Nl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0gLCBbbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHJvbF9xXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Byb2xxNTEyX21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSAsIFtsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHJvbHZfZF8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wcm9sdmQxMjhfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wcm9sdl9kXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Byb2x2ZDI1Nl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Byb2x2X2RfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHJvbHZkNTEyX21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wcm9sdl9xXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Byb2x2cTEyOF9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Byb2x2X3FfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHJvbHZxMjU2X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHJvbHZfcV81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wcm9sdnE1MTJfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wcm9yX2RfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHJvcmQxMjhfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHJvcl9kXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Byb3JkMjU2X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Byb3JfZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wcm9yZDUxMl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHJvcl9xXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Byb3JxMTI4X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Byb3JfcV8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wcm9ycTI1Nl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wcm9yX3FfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHJvcnE1MTJfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV92OGk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworfQorCisvLyBHYXRoZXIgb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4Ml9nYXRoZXJfZF9wZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcGQiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3B0cl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92MmY2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9nYXRoZXJfZF9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJkX3BkMjU2Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDJfZ2F0aGVyX3FfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3BkIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDJfZ2F0aGVyX3FfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVycV9wZDI1NiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdngyX2dhdGhlcl9kX3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyZF9wcyI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdngyX2dhdGhlcl9kX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcHMyNTYiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3B0cl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9nYXRoZXJfcV9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcnFfcHMiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3B0cl90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV92NGYzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9nYXRoZXJfcV9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3BzMjU2Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4Ml9nYXRoZXJfZF9xIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyZF9xIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLAorICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDJfZ2F0aGVyX2RfcV8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJkX3EyNTYiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sCisgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3B0cl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9nYXRoZXJfcV9xIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVycV9xIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLAorICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDJfZ2F0aGVyX3FfcV8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3EyNTYiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sCisgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3B0cl90eSwgbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9nYXRoZXJfZF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyZF9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDJfZ2F0aGVyX2RfZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJkX2QyNTYiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sCisgICAgICAgIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3B0cl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9nYXRoZXJfcV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVycV9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDJfZ2F0aGVyX3FfZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJxX2QyNTYiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3B0cl90eSwgbGx2bV92NGk2NF90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKK30KKworLy8gTWlzYy4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdngyX3Btb3Ztc2tiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdm1za2IyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YzMmk4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzaHVmX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2h1ZmIyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fdjMyaThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9tcHNhZGJ3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbXBzYWRidzI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjMyaThfdHksIGxsdm1fdjMyaThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGTUEzIGFuZCBGTUE0CisKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9mbWFfdmZtYWRkX3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc3MzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm1hZGRfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzZDMiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfZm1hNF92Zm1hZGRfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWE0X3ZmbWFkZF9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm1hZGRfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRwcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZtYWRkX3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkcGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfZm1hX3ZmbWFkZF9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZtYWRkX3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfZm1hX3ZmbXN1Yl9zcyA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZtc3ViX3NkIDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm1zdWJfcHMgOiAvLyBUT0RPOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfZm1hX3ZmbXN1Yl9wZCA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZtc3ViX3BzXzI1NiA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZtc3ViX3BkXzI1NiA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZubWFkZF9zcyA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZubWFkZF9zZCA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZubWFkZF9wcyA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZubWFkZF9wZCA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZubWFkZF9wc18yNTYgOiAvLyBUT0RPOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfZm1hX3Zmbm1hZGRfcGRfMjU2IDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm5tc3ViX3NzIDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm5tc3ViX3NkIDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm5tc3ViX3BzIDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm5tc3ViX3BkIDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm5tc3ViX3BzXzI1NiA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZubXN1Yl9wZF8yNTYgOiAvLyBUT0RPOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfZm1hX3ZmbWFkZHN1Yl9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm1hZGRzdWJfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZtYWRkc3ViX3BzXzI1NiA6CisgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZtYWRkc3ViX3BkXzI1NiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm1zdWJhZGRfcHMgOiAvLyBUT0RPOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfZm1hX3ZmbXN1YmFkZF9wZCA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZtc3ViYWRkX3BzXzI1NiA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZtc3ViYWRkX3BkXzI1NiA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZmbWFkZF9wZF8xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkcGQxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9wZF8xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkcGQxMjhfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfcGRfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMTI4X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm1hZGRfcGRfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRfcGRfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMjU2X21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3BkXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1Nl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZtYWRkX3BkXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwgIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9wZF81MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkcGQ1MTJfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCAgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3BkXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDUxMl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksICBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZmbWFkZF9wc18xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkcHMxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9wc18xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkcHMxMjhfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfcHNfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMTI4X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm1hZGRfcHNfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRfcHNfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMjU2X21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3BzXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1Nl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZtYWRkX3BzXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRwczUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksICBsbHZtX2kxNl90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtYWRkX3BzXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRwczUxMl9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCAgbGx2bV9pMTZfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZF9wc181MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkcHM1MTJfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgIGxsdm1faTE2X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZmbWFkZHN1Yl9wZF8xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbWFkZHN1Yl9wZF8xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQxMjhfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRzdWJfcGRfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMTI4X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm1hZGRzdWJfcGRfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRzdWJfcGRfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMjU2X21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdmZtYWRkc3ViX3BkXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDI1Nl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZtYWRkc3ViX3BkXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwgIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbWFkZHN1Yl9wZF81MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQ1MTJfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCAgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdmZtYWRkc3ViX3BkXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDUxMl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksICBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZmbWFkZHN1Yl9wc18xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbWFkZHN1Yl9wc18xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMxMjhfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRzdWJfcHNfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMTI4X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm1hZGRzdWJfcHNfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRzdWJfcHNfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMjU2X21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdmZtYWRkc3ViX3BzXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczI1Nl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZtYWRkc3ViX3BzXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksICBsbHZtX2kxNl90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtYWRkc3ViX3BzXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczUxMl9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCAgbGx2bV9pMTZfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZHN1Yl9wc181MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHM1MTJfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgIGxsdm1faTE2X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZtYWRkX3NkIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkM19tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZtYWRkX3NzIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzM19tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZF9zZCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzZDNfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCAgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3NzIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzM19tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksICBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRfc2QgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc2QzX21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9zcyA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzczNfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3NkIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbXN1YnNkM19tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfc3MgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtc3Vic3MzX21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbXN1Yl9wZF8xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtc3VicGQxMjhfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfcGRfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbXN1YnBkMjU2X21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3BkXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1zdWJwZDUxMl9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksICBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfcHNfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbXN1YnBzMTI4X21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3BzXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1zdWJwczI1Nl9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbXN1Yl9wc181MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtc3VicHM1MTJfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgIGxsdm1faTE2X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJhZGRfcGRfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbXN1YmFkZHBkMTI4X21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtc3ViYWRkX3BkXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1zdWJhZGRwZDI1Nl9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbXN1YmFkZF9wZF81MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcGQ1MTJfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCAgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtc3ViYWRkX3BzXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1zdWJhZGRwczEyOF9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbXN1YmFkZF9wc18yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcHMyNTZfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJhZGRfcHNfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbXN1YmFkZHBzNTEyX21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksICBsbHZtX2kxNl90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm5tYWRkX3BkXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm5tYWRkcGQxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZubWFkZF9wZF8yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZubWFkZHBkMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zmbm1hZGRfcGRfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRwZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwgIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZubWFkZF9wc18xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZubWFkZHBzMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zmbm1hZGRfcHNfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRwczI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm5tYWRkX3BzXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm5tYWRkcHM1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCAgbGx2bV9pMTZfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfc2QgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZubXN1YnNkM19tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm5tc3ViX3NzIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJzczNfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm5tc3ViX3BkXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm5tc3VicGQxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfcGRfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwZDEyOF9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZubXN1Yl9wZF8yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZubXN1YnBkMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm5tc3ViX3BkXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm5tc3VicGQyNTZfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zmbm1zdWJfcGRfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwgIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfcGRfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwZDUxMl9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksICBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zmbm1zdWJfcHNfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwczEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZubXN1Yl9wc18xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZubXN1YnBzMTI4X21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm5tc3ViX3BzXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm5tc3VicHMyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfcHNfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwczI1Nl9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZubXN1Yl9wc181MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZubXN1YnBzNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgIGxsdm1faTE2X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm5tc3ViX3BzXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm5tc3VicHM1MTJfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgIGxsdm1faTE2X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwbWFkZDUyaF91cV8xMjggOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmh1cTEyOF9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cG1hZGQ1MmhfdXFfMTI4IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBtYWRkNTJodXExMjhfbWFza3oiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBtYWRkNTJsX3VxXzEyOCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUybHVxMTI4X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwbWFkZDUybF91cV8xMjggOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmx1cTEyOF9tYXNreiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cG1hZGQ1MmhfdXFfMjU2IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBtYWRkNTJodXEyNTZfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBtYWRkNTJoX3VxXzI1NiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUyaHVxMjU2X21hc2t6Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwbWFkZDUybF91cV8yNTYgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmx1cTI1Nl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cG1hZGQ1MmxfdXFfMjU2IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBtYWRkNTJsdXEyNTZfbWFza3oiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBtYWRkNTJoX3VxXzUxMiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUyaHVxNTEyX21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwbWFkZDUyaF91cV81MTIgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmh1cTUxMl9tYXNreiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cG1hZGQ1MmxfdXFfNTEyIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBtYWRkNTJsdXE1MTJfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBtYWRkNTJsX3VxXzUxMiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUybHVxNTEyX21hc2t6Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIFZOTkkKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGRwYnVzZF8xMjggOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwYnVzZDEyOF9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGRwYnVzZF8xMjggOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwYnVzZDEyOF9tYXNreiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGRwYnVzZF8yNTYgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwYnVzZDI1Nl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGRwYnVzZF8yNTYgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwYnVzZDI1Nl9tYXNreiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGRwYnVzZF81MTIgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwYnVzZDUxMl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZHBidXNkXzUxMiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkNTEyX21hc2t6Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGRwYnVzZHNfMTI4IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBkcGJ1c2RzMTI4X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZHBidXNkc18xMjggOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwYnVzZHMxMjhfbWFza3oiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBkcGJ1c2RzXzI1NiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkczI1Nl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGRwYnVzZHNfMjU2IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBkcGJ1c2RzMjU2X21hc2t6Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZHBidXNkc181MTIgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwYnVzZHM1MTJfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkzMl90eSwgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGRwYnVzZHNfNTEyIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBkcGJ1c2RzNTEyX21hc2t6Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGRwd3NzZF8xMjggOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwd3NzZDEyOF9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGRwd3NzZF8xMjggOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwd3NzZDEyOF9tYXNreiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGRwd3NzZF8yNTYgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwd3NzZDI1Nl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGRwd3NzZF8yNTYgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwd3NzZDI1Nl9tYXNreiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGRwd3NzZF81MTIgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwd3NzZDUxMl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZHB3c3NkXzUxMiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkNTEyX21hc2t6Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGRwd3NzZHNfMTI4IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBkcHdzc2RzMTI4X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZHB3c3Nkc18xMjggOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwd3NzZHMxMjhfbWFza3oiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBkcHdzc2RzXzI1NiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkczI1Nl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGRwd3NzZHNfMjU2IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBkcHdzc2RzMjU2X21hc2t6Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZHB3c3Nkc181MTIgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwd3NzZHM1MTJfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkzMl90eSwgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGRwd3NzZHNfNTEyIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBkcHdzc2RzNTEyX21hc2t6Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFhPUAorCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfeG9wX3ZwZXJtaWwycGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWlsMnBkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfeG9wX3ZwZXJtaWwycGRfMjU2IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pbDJwZDI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X3hvcF92cGVybWlsMnBzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pbDJwcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBlcm1pbDJwc18yNTYgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWlsMnBzMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfeG9wX3ZmcmN6X3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZyY3pwZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZmcmN6X3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZyY3pwcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZmcmN6X3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZyY3pzZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZmcmN6X3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZyY3pzcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZmcmN6X3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmcmN6cGQyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92ZnJjel9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92ZnJjenBzMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X3hvcF92cGNvbWIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGNvbWIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwY29tdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwY29tdyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBjb21kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBjb21kIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cGNvbXEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGNvbXEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwY29tdWIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGNvbXViIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cGNvbXV3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBjb211dyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBjb211ZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwY29tdWQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwY29tdXEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGNvbXVxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfeG9wX3ZwaGFkZGJkIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBoYWRkYmQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cGhhZGRicSA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwaGFkZGJxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBoYWRkYncgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGhhZGRidyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwaGFkZGRxIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBoYWRkZHEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cGhhZGR1YmQgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGhhZGR1YmQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cGhhZGR1YnEgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGhhZGR1YnEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cGhhZGR1YncgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGhhZGR1YnciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cGhhZGR1ZHEgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGhhZGR1ZHEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cGhhZGR1d2QgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGhhZGR1d2QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cGhhZGR1d3EgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGhhZGR1d3EiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cGhhZGR3ZCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwaGFkZHdkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBoYWRkd3EgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGhhZGR3cSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwaHN1YmJ3IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBoc3ViYnciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cGhzdWJkcSA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwaHN1YmRxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBoc3Vid2QgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGhzdWJ3ZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwbWFjc2RkIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBtYWNzZGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cG1hY3NkcWggOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hY3NkcWgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cG1hY3NkcWwgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hY3NkcWwiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cG1hY3NzZGQgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hY3NzZGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cG1hY3NzZHFoIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBtYWNzc2RxaCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwbWFjc3NkcWwgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hY3NzZHFsIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBtYWNzc3dkIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBtYWNzc3dkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBtYWNzc3d3IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBtYWNzc3d3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBtYWNzd2QgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hY3N3ZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwbWFjc3d3IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBtYWNzd3ciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cG1hZGNzc3dkIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBtYWRjc3N3ZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwbWFkY3N3ZCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwbWFkY3N3ZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwcGVybSA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwcGVybSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X3hvcF92cHJvdGIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHJvdGIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnByb3RkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnByb3RkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3Zwcm90cSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwcm90cSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cHJvdHcgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHJvdHciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnByb3RiaSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwcm90YmkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnByb3RkaSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwcm90ZGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnByb3RxaSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwcm90cWkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnByb3R3aSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwcm90d2kiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X3hvcF92cHNoYWIgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNoYWIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBzaGFkIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGFkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3Zwc2hhcSA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hhcSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cHNoYXcgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNoYXciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBzaGxiIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxiIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3Zwc2hsZCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hsZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cHNobHEgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobHEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBzaGx3IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGx3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIExXUAorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2xsd3BjYiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2xsd3BjYiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfc2x3cGNiIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2x3cGNiIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9wdHJfdHldLCBbXSwgW10+OworICBkZWYgaW50X3g4Nl9sd3BpbnMzMiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2x3cGluczMyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pOF90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl9sd3BpbnM2NCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2x3cGluczY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pOF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl9sd3B2YWwzMiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2x3cHZhbDMyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X2x3cHZhbDY0IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbHdwdmFsNjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1NWAorCisvLyBFbXB0eSBNTVggc3RhdGUgb3AuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfbW14X2VtbXMgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZW1tcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtdLCBbXT47CisgIGRlZiBpbnRfeDg2X21teF9mZW1tcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZlbW1zIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW10sIFtdPjsKK30KKworLy8gSW50ZWdlciBhcml0aG1ldGljIG9wcy4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICAvLyBBZGRpdGlvbgorICBkZWYgaW50X3g4Nl9tbXhfcGFkZF9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFkZGIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfbW14X3BhZGRfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhZGR3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X21teF9wYWRkX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWRkZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9tbXhfcGFkZF9xIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFkZHEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworICBkZWYgaW50X3g4Nl9tbXhfcGFkZHNfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhZGRzYiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfbW14X3BhZGRzX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWRkc3ciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisKKyAgZGVmIGludF94ODZfbW14X3BhZGR1c19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFkZHVzYiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfbW14X3BhZGR1c193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFkZHVzdyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworICAvLyBTdWJ0cmFjdGlvbgorICBkZWYgaW50X3g4Nl9tbXhfcHN1Yl9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHN1YmIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9tbXhfcHN1Yl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHN1YnciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9tbXhfcHN1Yl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHN1YmQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9tbXhfcHN1Yl9xIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHN1YnEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X21teF9wc3Vic19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHN1YnNiIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wc3Vic193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHN1YnN3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfbW14X3BzdWJ1c19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHN1YnVzYiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9tbXhfcHN1YnVzX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3VidXN3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisKKyAgLy8gTXVsdGlwbGljYXRpb24KKyAgZGVmIGludF94ODZfbW14X3BtdWxoX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsaHciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X21teF9wbXVsbF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG11bGx3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9tbXhfcG11bGh1X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsaHV3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9tbXhfcG11bHVfZHEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsdWRxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9tbXhfcG1hZGRfd2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbWFkZHdkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIC8vIEJpdHdpc2Ugb3BlcmF0aW9ucworICBkZWYgaW50X3g4Nl9tbXhfcGFuZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhbmQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfbW14X3BhbmRuIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFuZG4iPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9tbXhfcG9yIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG9yIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X21teF9weG9yIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHhvciI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIC8vIEF2ZXJhZ2VzCisgIGRlZiBpbnRfeDg2X21teF9wYXZnX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYXZnYiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfbW14X3BhdmdfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bhdmd3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIC8vIE1heGltdW0KKyAgZGVmIGludF94ODZfbW14X3BtYXh1X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbWF4dWIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X21teF9wbWF4c193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1heHN3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIC8vIE1pbmltdW0KKyAgZGVmIGludF94ODZfbW14X3BtaW51X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbWludWIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X21teF9wbWluc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1pbnN3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIC8vIFBhY2tlZCBzdW0gb2YgYWJzb2x1dGUgZGlmZmVyZW5jZXMKKyAgZGVmIGludF94ODZfbW14X3BzYWRfYncgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2FkYnciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47Cit9CisKKy8vIEludGVnZXIgc2hpZnQgb3BzLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIC8vIFNoaWZ0IGxlZnQgbG9naWNhbAorICBkZWYgaW50X3g4Nl9tbXhfcHNsbF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfbW14X3BzbGxfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGxkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wc2xsX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xscSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X21teF9wc3JsX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsdyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9tbXhfcHNybF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfbW14X3BzcmxfcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmxxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfbW14X3BzcmFfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmF3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wc3JhX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X21teF9wc2xsaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHdpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wc2xsaV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbGRpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wc2xsaV9xIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHFpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfbW14X3BzcmxpX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3Jsd2kiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfbW14X3BzcmxpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsZGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfbW14X3BzcmxpX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JscWkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9tbXhfcHNyYWlfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmF3aSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9tbXhfcHNyYWlfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmFkaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworfQorLy8gUGVybXV0ZQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfZGZfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGVybXZhcmRmMjU2X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX2k4X3R5XSwgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9kZl81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZXJtdmFyZGY1MTJfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpNjRfdHksIGxsdm1fdjhmNjRfdHksIGxsdm1faThfdHldLCAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wZXJtdmFyX2RpXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Blcm12YXJkaTI1Nl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfZGlfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGVybXZhcmRpNTEyX21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9oaV8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZXJtdmFyaGkxMjhfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLCAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wZXJtdmFyX2hpXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Blcm12YXJoaTI1Nl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpMTZfdHksIGxsdm1faTE2X3R5XSwgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9oaV81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZXJtdmFyaGk1MTJfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpMTZfdHksIGxsdm1fdjMyaTE2X3R5LCBsbHZtX2kzMl90eV0sICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfcWlfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGVybXZhcnFpMTI4X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kxNl90eV0sICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfcWlfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGVybXZhcnFpMjU2X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fdjMyaThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmk4X3R5LCBsbHZtX3YzMmk4X3R5LCBsbHZtX2kzMl90eV0sICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfcWlfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGVybXZhcnFpNTEyX21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y2NGk4X3R5XSwgW2xsdm1fdjY0aThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y2NGk4X3R5LCBsbHZtX3Y2NGk4X3R5LCBsbHZtX2k2NF90eV0sICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfc2ZfMjU2IDogLy8gVE9ETzogUmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV9pOF90eV0sICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfc2ZfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGVybXZhcnNmNTEyX21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sIFtsbHZtX3YxNmYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmYzMl90eSwgbGx2bV9pMTZfdHldLCAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wZXJtdmFyX3NpXzI1NiA6IC8vIFRPRE86IFJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLCAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wZXJtdmFyX3NpXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Blcm12YXJzaTUxMl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwgIFtJbnRyTm9NZW1dPjsKK30KKy8vIFBhY2sgb3BzLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X21teF9wYWNrc3N3YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhY2tzc3diIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wYWNrc3NkdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhY2tzc2R3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wYWNrdXN3YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhY2t1c3diIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIFVucGFja2luZyBvcHMuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfbW14X3B1bnBja2hidyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3B1bnBja2hidyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wdW5wY2tod2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdW5wY2tod2QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9tbXhfcHVucGNraGRxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHVucGNraGRxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfbW14X3B1bnBja2xidyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3B1bnBja2xidyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wdW5wY2tsd2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdW5wY2tsd2QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9tbXhfcHVucGNrbGRxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHVucGNrbGRxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy8gSW50ZWdlciBjb21wYXJpc29uIG9wcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X21teF9wY21wZXFfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbXBlcWIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X21teF9wY21wZXFfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbXBlcXciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X21teF9wY21wZXFfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbXBlcWQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisKKyAgZGVmIGludF94ODZfbW14X3BjbXBndF9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGd0YiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9tbXhfcGNtcGd0X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21wZ3R3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wY21wZ3RfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbXBndGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gTWlzYy4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9tbXhfbWFza21vdnEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXNrbW92cSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHksIGxsdm1fcHRyX3R5XSwgW10+OworCisgIGRlZiBpbnRfeDg2X21teF9wbW92bXNrYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Ztc2tiIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfbW14X21vdm50X2RxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbW92bnRxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyeDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sIFtdPjsKKworICBkZWYgaW50X3g4Nl9tbXhfcGFsaWducl9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFsaWduciI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfbW14X3BleHRyX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y0aGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X21teF9waW5zcl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmVjX3NldF92NGhpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBCTUkKKworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2JtaV9iZXh0cl8zMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2JleHRyX3UzMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYm1pX2JleHRyXzY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYmV4dHJfdTY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9ibWlfYnpoaV8zMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2J6aGlfc2kiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2JtaV9iemhpXzY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYnpoaV9kaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYm1pX3BkZXBfMzIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZGVwX3NpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9ibWlfcGRlcF82NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BkZXBfZGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2JtaV9wZXh0XzMyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGV4dF9zaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYm1pX3BleHRfNjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZXh0X2RpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRlMvR1MgQmFzZQorCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfcmRmc2Jhc2VfMzIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yZGZzYmFzZTMyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X3JkZ3NiYXNlXzMyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmRnc2Jhc2UzMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl9yZGZzYmFzZV82NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JkZnNiYXNlNjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfcmRnc2Jhc2VfNjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yZGdzYmFzZTY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X3dyZnNiYXNlXzMyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfd3Jmc2Jhc2UzMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0+OworICBkZWYgaW50X3g4Nl93cmdzYmFzZV8zMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3dyZ3NiYXNlMzIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHldPjsKKyAgZGVmIGludF94ODZfd3Jmc2Jhc2VfNjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl93cmZzYmFzZTY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5XT47CisgIGRlZiBpbnRfeDg2X3dyZ3NiYXNlXzY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfd3Jnc2Jhc2U2NCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRlhTUgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2Z4cnN0b3IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9meHJzdG9yIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl9meHJzdG9yNjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9meHJzdG9yNjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X2Z4c2F2ZSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Z4c2F2ZSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfZnhzYXZlNjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9meHNhdmU2NCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFhTQVZFCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfeHNhdmUgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl94c2F2ZTY0IDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfeHJzdG9yIDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfeHJzdG9yNjQgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl94c2F2ZW9wdCA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X3hzYXZlb3B0NjQgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl94cnN0b3JzIDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfeHJzdG9yczY0IDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfeHNhdmVjIDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfeHNhdmVjNjQgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl94c2F2ZXMgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl94c2F2ZXM2NCA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X3hnZXRidiA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pMzJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X3hzZXRidiA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDTEZMVVNIT1BUIGFuZCBDTFdCCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfY2xmbHVzaG9wdCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NsZmx1c2hvcHQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47CisKKyAgZGVmIGludF94ODZfY2x3YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Nsd2IiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTdXBwb3J0IHByb3RlY3Rpb24ga2V5CitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfcmRwa3J1IDogR0NDQnVpbHRpbiA8Il9fYnVpbHRpbl9pYTMyX3JkcGtydSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtdPjsKKyAgZGVmIGludF94ODZfd3Jwa3J1IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfd3Jwa3J1Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XSwgW10+OworfQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEhhbGYgZmxvYXQgY29udmVyc2lvbgorCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfdmN2dHBoMnBzXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZjdnRwaDJwcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfdmN2dHBoMnBzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZjdnRwaDJwczI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfdmN2dHBzMnBoXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl92Y3Z0cHMycGhfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHBzMnBoMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZjdnRwaDJwc181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y3Z0cGgycHM1MTJfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2aTE2X3R5LCBsbHZtX3YxNmYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZjdnRwaDJwc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y3Z0cGgycHMyNTZfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Y3Z0cGgycHNfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHBoMnBzX21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmN2dHBzMnBoXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaDUxMl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTE2X3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmN2dHBzMnBoXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaDI1Nl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Y3Z0cHMycGhfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHBzMnBoX21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUQk0KKworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3RibV9iZXh0cmlfdTMyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYmV4dHJpX3UzMiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfdGJtX2JleHRyaV91NjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9iZXh0cmlfdTY0Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUkRSQU5EIGludHJpbnNpY3MgLSBSZXR1cm4gYSByYW5kb20gdmFsdWUgYW5kIHdoZXRoZXIgaXQgaXMgdmFsaWQuCisvLyBSRFNFRUQgaW50cmluc2ljcyAtIFJldHVybiBhIE5JU1QgU1A4MDAtOTBCICYgQyBjb21wbGlhbnQgcmFuZG9tIHZhbHVlIGFuZAorLy8gd2hldGhlciBpdCBpcyB2YWxpZC4KKworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIC8vIFRoZXNlIGFyZSBkZWNsYXJlZCBzaWRlLWVmZmVjdGluZyBzbyB0aGV5IGRvbid0IGdldCBlbGltaW5hdGVkIGJ5IENTRSBvcgorICAvLyBMSUNNLgorICBkZWYgaW50X3g4Nl9yZHJhbmRfMTYgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sIFtdLCBbXT47CisgIGRlZiBpbnRfeDg2X3JkcmFuZF8zMiA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sIFtdPjsKKyAgZGVmIGludF94ODZfcmRyYW5kXzY0IDogSW50cmluc2ljPFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwgW10+OworICBkZWYgaW50X3g4Nl9yZHNlZWRfMTYgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sIFtdLCBbXT47CisgIGRlZiBpbnRfeDg2X3Jkc2VlZF8zMiA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sIFtdPjsKKyAgZGVmIGludF94ODZfcmRzZWVkXzY0IDogSW50cmluc2ljPFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwgW10+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQURYCisKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hZGRjYXJyeXhfdTMyOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZGRjYXJyeXhfdTMyIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pOF90eV0sIFtsbHZtX2k4X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3B0cl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hZGRjYXJyeXhfdTY0OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZGRjYXJyeXhfdTY0Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pOF90eV0sIFtsbHZtX2k4X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3B0cl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hZGRjYXJyeV91MzI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2FkZGNhcnJ5X3UzMiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faThfdHldLCBbbGx2bV9pOF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9wdHJfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYWRkY2FycnlfdTY0OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZGRjYXJyeV91NjQiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2k4X3R5XSwgW2xsdm1faThfdHksIGxsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fcHRyX3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X3N1YmJvcnJvd191MzI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3N1YmJvcnJvd191MzIiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2k4X3R5XSwgW2xsdm1faThfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fcHRyX3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X3N1YmJvcnJvd191NjQ6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3N1YmJvcnJvd191NjQiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2k4X3R5XSwgW2xsdm1faThfdHksIGxsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fcHRyX3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBSVE0gaW50cmluc2ljcy4gVHJhbnNhY3Rpb25hbCBNZW1vcnkgc3VwcG9ydC4KKworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3hiZWdpbiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3hiZWdpbiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtdPjsKKyAgZGVmIGludF94ODZfeGVuZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3hlbmQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbXSwgW10+OworICBkZWYgaW50X3g4Nl94YWJvcnQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl94YWJvcnQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pOF90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfeHRlc3QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl94dGVzdCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtdPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFWWDUxMgorCisvLyBDb252ZXJzaW9uIG9wcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9jdnR0c3Myc2kgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y3Z0dHNzMnNpMzIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX2N2dHRzczJzaTY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHRzczJzaTY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9jdnR0c3MydXNpIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHRzczJ1c2kzMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfY3Z0dHNzMnVzaTY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHRzczJ1c2k2NCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfY3Z0dXNpMnNzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dXNpMnNzMzIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfY3Z0dXNpNjQyc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR1c2kyc3M2NCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9jdnR0c2Qyc2kgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y3Z0dHNkMnNpMzIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX2N2dHRzZDJzaTY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHRzZDJzaTY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9jdnR0c2QydXNpIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHRzZDJ1c2kzMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfY3Z0dHNkMnVzaTY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHRzZDJ1c2k2NCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfY3Z0dXNpMnNkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dXNpMnNkMzIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9jdnR1c2k2NDJzZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHVzaTJzZDY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3ZjdnRzczJ1c2kzMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZjdnRzczJ1c2kzMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfdmN2dHNzMnVzaTY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHNzMnVzaTY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl92Y3Z0c3Myc2kzMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZjdnRzczJzaTMyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl92Y3Z0c3Myc2k2NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZjdnRzczJzaTY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl92Y3Z0c2QydXNpMzIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y3Z0c2QydXNpMzIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3ZjdnRzZDJ1c2k2NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZjdnRzZDJ1c2k2NCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfdmN2dHNkMnNpMzIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y3Z0c2Qyc2kzMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfdmN2dHNkMnNpNjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y3Z0c2Qyc2k2NCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfY3Z0c2kyc3MzMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHNpMnNzMzIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfY3Z0c2kyc3M2NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHNpMnNzNjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfY3Z0c2kyc2Q2NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHNpMnNkNjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBQYWNrIG9wcy4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdng1MTJfcGFja3Nzd2JfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFja3Nzd2I1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y2NGk4X3R5XSwgW2xsdm1fdjMyaTE2X3R5LGxsdm1fdjMyaTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BhY2tzc2R3XzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhY2tzc2R3NTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wYWNrdXN3Yl81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWNrdXN3YjUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjY0aThfdHldLCBbbGx2bV92MzJpMTZfdHksbGx2bV92MzJpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BhY2t1c2R3XzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhY2t1c2R3NTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKy8vIFZlY3RvciBjb252ZXJ0CitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0ZHEycHNfMTI4IDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRkcTJwc18yNTYgOiAvLyBUT0RPOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dGRxMnBzXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dGRxMnBzNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCAgbGx2bV9pMTZfdHksICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHBkMmRxXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBkMmRxMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3Y0aTMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHBkMmRxXzI1NiA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRpMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cGQyZHFfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGQyZHE1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhpMzJfdHksICBsbHZtX2k4X3R5LCAgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwZDJwc18yNTYgOiAvLyBUT0RPOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHBkMnBzXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBkMnBzNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjMyX3R5LCAgbGx2bV9pOF90eSwgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0c2Qyc3Nfcm91bmQgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRzZDJzc19yb3VuZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92NGYzMl90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRzczJzZF9yb3VuZCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHNzMnNkX3JvdW5kX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHBkMnBzIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGQycHNfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjRmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cGQycXFfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGQycXExMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJpNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cGQycXFfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGQycXEyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRpNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cGQycXFfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGQycXE1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhpNjRfdHksICBsbHZtX2k4X3R5LCAgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwZDJ1ZHFfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGQydWRxMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3Y0aTMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHBkMnVkcV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwZDJ1ZHEyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRpMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cGQydWRxXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBkMnVkcTUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGY2NF90eSwgbGx2bV92OGkzMl90eSwgIGxsdm1faThfdHksICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHBkMnVxcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwZDJ1cXExMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJpNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cGQydXFxXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBkMnVxcTI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGk2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwZDJ1cXFfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGQydXFxNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4aTY0X3R5LCAgbGx2bV9pOF90eSwgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cHMyZHFfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cHMyZHExMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRpMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cHMyZHFfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cHMyZHEyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhpMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cHMyZHFfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cHMyZHE1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZpMzJfdHksICBsbHZtX2kxNl90eSwgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cHMycGRfMTI4IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cHMycGRfMjU2IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cHMycGRfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cHMycGQ1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmNjRfdHksICBsbHZtX2k4X3R5LCAgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwczJxcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwczJxcTEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92Mmk2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwczJxcV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwczJxcTI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGk2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwczJxcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwczJxcTUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGk2NF90eSwgIGxsdm1faThfdHksICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHBzMnVkcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwczJ1ZHExMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRpMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cHMydWRxXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBzMnVkcTI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGkzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwczJ1ZHFfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cHMydWRxNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2aTMyX3R5LCAgbGx2bV9pMTZfdHksICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHBzMnVxcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwczJ1cXExMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjJpNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cHMydXFxXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBzMnVxcTI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGk2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwczJ1cXFfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cHMydXFxNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4aTY0X3R5LCAgbGx2bV9pOF90eSwgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cXEycGRfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cXEycGQxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cXEycGRfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cXEycGQyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cXEycGRfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cXEycGQ1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhmNjRfdHksICBsbHZtX2k4X3R5LCAgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRxcTJwc18xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRxcTJwczEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRxcTJwc18yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRxcTJwczI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRxcTJwc181MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRxcTJwczUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGk2NF90eSwgbGx2bV92OGYzMl90eSwgIGxsdm1faThfdHksICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJkcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cGQyZHExMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjRpMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMmRxXzI1NiA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRpMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMmRxXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwZDJkcTUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGY2NF90eSwgbGx2bV92OGkzMl90eSwgIGxsdm1faThfdHksICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJxcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cGQycXExMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJpNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMnFxXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwZDJxcTI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGk2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR0cGQycXFfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBkMnFxNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4aTY0X3R5LCAgbGx2bV9pOF90eSwgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMnVkcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cGQydWRxMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3Y0aTMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJ1ZHFfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBkMnVkcTI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGkzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR0cGQydWRxXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1ZHE1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhpMzJfdHksICBsbHZtX2k4X3R5LCAgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR0cGQydXFxXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1cXExMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJpNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMnVxcV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cGQydXFxMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0aTY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJ1cXFfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBkMnVxcTUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGY2NF90eSwgbGx2bV92OGk2NF90eSwgIGxsdm1faThfdHksICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJkcV8xMjggOiAvLyBUT0RPOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0aTMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJkcV8yNTYgOiAvLyBUT0RPOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4aTMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJkcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cHMyZHE1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZpMzJfdHksICBsbHZtX2kxNl90eSwgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMnFxXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwczJxcTEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92Mmk2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR0cHMycXFfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBzMnFxMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0aTY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJxcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cHMycXE1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhpNjRfdHksICBsbHZtX2k4X3R5LCAgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR0cHMydWRxXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1ZHExMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRpMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMnVkcV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cHMydWRxMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4aTMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJ1ZHFfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBzMnVkcTUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmkzMl90eSwgIGxsdm1faTE2X3R5LCAgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR0cHMydXFxXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1cXExMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjJpNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMnVxcV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cHMydXFxMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0aTY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJ1cXFfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBzMnVxcTUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGk2NF90eSwgIGxsdm1faThfdHksICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHVkcTJwc18xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR1ZHEycHMxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dWRxMnBzXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHVkcTJwczI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGkzMl90eSwgbGx2bV92OGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR1ZHEycHNfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dWRxMnBzNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCAgbGx2bV9pMTZfdHksICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHVxcTJwZF8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR1cXEycGQxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dXFxMnBkXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwZDI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92NGY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR1cXEycGRfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dXFxMnBkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCAgbGx2bV9pOF90eSwgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dXFxMnBzXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwczEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR1cXEycHNfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dXFxMnBzMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHVxcTJwc181MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR1cXEycHM1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhmMzJfdHksICBsbHZtX2k4X3R5LCAgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19ybmRzY2FsZV9wZF8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBkXzEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5LCAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcm5kc2NhbGVfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcm5kc2NhbGVwZF8yNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGY2NF90eSwgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3JuZHNjYWxlX3BkXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcGRfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3JuZHNjYWxlX3BzXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcHNfMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHksICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19ybmRzY2FsZV9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBzXzI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjMyX3R5LCAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcm5kc2NhbGVfcHNfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcm5kc2NhbGVwc19tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YxNmYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3JlZHVjZV9wZF8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yZWR1Y2VwZDEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5LCAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcmVkdWNlX3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JlZHVjZXBkMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmNjRfdHksICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19yZWR1Y2VfcGRfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmVkdWNlcGQ1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3JlZHVjZV9wc18xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yZWR1Y2VwczEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcmVkdWNlX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JlZHVjZXBzMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHksICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19yZWR1Y2VfcHNfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmVkdWNlcHM1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV92MTZmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcmFuZ2VfcGRfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmFuZ2VwZDEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcmFuZ2VfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmFuZ2VwZDI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmNjRfdHksICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcmFuZ2VfcGRfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmFuZ2VwZDUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhmNjRfdHksICBsbHZtX2k4X3R5LCAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3g4Nl9hdng1MTJfbWFza19yYW5nZV9wc18xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yYW5nZXBzMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3g4Nl9hdng1MTJfbWFza19yYW5nZV9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yYW5nZXBzMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGYzMl90eSwgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3g4Nl9hdng1MTJfbWFza19yYW5nZV9wc181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yYW5nZXBzNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2ZjMyX3R5LCAgbGx2bV9pMTZfdHksICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gVmVjdG9yIGxvYWQgd2l0aCBicm9hZGNhc3QKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICAvLyBUT0RPOiBSZW1vdmUgdGhlIGJyb2FkY2FzdCBpbnRyaW5zaWNzIHdpdGggbm8gZ2NjIGJ1aWx0aW4gYW5kIGF1dG91cGdyYWRlCisgIGRlZiBpbnRfeDg2X2F2eDUxMl92YnJvYWRjYXN0X3NzXzUxMiA6CisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3Zicm9hZGNhc3Rfc2RfNTEyIDoKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisgICBkZWYgaW50X3g4Nl9hdng1MTJfYnJvYWRjYXN0bXdfNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RtdzUxMiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgICBkZWYgaW50X3g4Nl9hdng1MTJfYnJvYWRjYXN0bXdfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RtdzI1NiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgIGRlZiBpbnRfeDg2X2F2eDUxMl9icm9hZGNhc3Rtd18xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdG13MTI4Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICAgZGVmIGludF94ODZfYXZ4NTEyX2Jyb2FkY2FzdG1iXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYnJvYWRjYXN0bWI1MTIiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgIGRlZiBpbnRfeDg2X2F2eDUxMl9icm9hZGNhc3RtYl8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdG1iMjU2Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgICBkZWYgaW50X3g4Nl9hdng1MTJfYnJvYWRjYXN0bWJfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RtYjEyOCI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBBcml0aG1ldGljIG9wcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfYWRkX3BzXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2FkZHBzNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2FkZF9wZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZGRwZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfc3ViX3BzXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3N1YnBzNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3N1Yl9wZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zdWJwZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfbXVsX3BzXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX211bHBzNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX211bF9wZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tdWxwZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZGl2X3BzXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2RpdnBzNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2Rpdl9wZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9kaXZwZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfbWF4X3BzXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21heHBzNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX21heF9wZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXhwZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfbWluX3BzXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21pbnBzNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX21pbl9wZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9taW5wZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19hZGRfc3Nfcm91bmQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZGRzc19yb3VuZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZGl2X3NzX3JvdW5kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZGl2c3Nfcm91bmRfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX211bF9zc19yb3VuZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX211bHNzX3JvdW5kX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19zdWJfc3Nfcm91bmQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zdWJzc19yb3VuZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfbWF4X3NzX3JvdW5kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWF4c3Nfcm91bmRfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX21pbl9zc19yb3VuZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21pbnNzX3JvdW5kX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19hZGRfc2Rfcm91bmQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZGRzZF9yb3VuZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZGl2X3NkX3JvdW5kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZGl2c2Rfcm91bmRfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX211bF9zZF9yb3VuZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX211bHNkX3JvdW5kX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19zdWJfc2Rfcm91bmQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zdWJzZF9yb3VuZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfbWF4X3NkX3JvdW5kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWF4c2Rfcm91bmRfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX21pbl9zZF9yb3VuZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21pbnNkX3JvdW5kX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3JuZHNjYWxlX3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcm5kc2NhbGVzc19yb3VuZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3JuZHNjYWxlX3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcm5kc2NhbGVzZF9yb3VuZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19yYW5nZV9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Jhbmdlc3MxMjhfcm91bmRfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19yYW5nZV9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Jhbmdlc2QxMjhfcm91bmRfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcmVkdWNlX3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmVkdWNlc3NfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19yZWR1Y2Vfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yZWR1Y2VzZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19zY2FsZWZfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2FsZWZzZF9yb3VuZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19zY2FsZWZfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2FsZWZzc19yb3VuZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19zY2FsZWZfcGRfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhbGVmcGQxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19zY2FsZWZfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhbGVmcGQyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjY0X3R5LCBsbHZtX2k4X3R5XSxbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3NjYWxlZl9wZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2FsZWZwZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhmNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19zY2FsZWZfcHNfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhbGVmcHMxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19zY2FsZWZfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhbGVmcHMyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19zY2FsZWZfcHNfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhbGVmcHM1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmYzMl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3NxcnRfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zcXJ0c3Nfcm91bmRfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19zcXJ0X3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc3FydHNkX3JvdW5kX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19zcXJ0X3BkXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NxcnRwZDEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfc3FydF9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zcXJ0cGQyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3NxcnRfcGRfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc3FydHBkNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfc3FydF9wc18xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zcXJ0cHMxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19zcXJ0X3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NxcnRwczI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3NxcnRfcHNfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc3FydHBzNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19maXh1cGltbV9wZF8xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZml4dXBpbW1wZDEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3BkXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkMTI4X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZml4dXBpbW1fcGRfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tcGQyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel9maXh1cGltbV9wZF8yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZml4dXBpbW1wZDI1Nl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3BkXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3BkXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkNTEyX21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwgbGx2bV92OGk2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3BzXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9maXh1cGltbXBzMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fcHNfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tcHMxMjhfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19maXh1cGltbV9wc18yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZml4dXBpbW1wczI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3BzXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9maXh1cGltbXBzMjU2X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZml4dXBpbW1fcHNfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tcHM1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel9maXh1cGltbV9wc181MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZml4dXBpbW1wczUxMl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3NkIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tc2RfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fc2QgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZml4dXBpbW1zZF9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19maXh1cGltbV9zcyA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9maXh1cGltbXNzX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3NzIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tc3NfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3BkXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dldGV4cHBkMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19nZXRleHBfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2V0ZXhwcGQyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2dldGV4cF9wZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nZXRleHBwZDUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2dldGV4cF9wc18xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nZXRleHBwczEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2dldGV4cF9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nZXRleHBwczI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2dldGV4cF9wc181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nZXRleHBwczUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19nZXRleHBfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nZXRleHBzczEyOF9yb3VuZF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2dldGV4cF9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dldGV4cHNkMTI4X3JvdW5kX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19nZXRtYW50X3BkXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nZXRtYW50cGQxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksbGx2bV9pMzJfdHksIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZ2V0bWFudF9wZF8yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2V0bWFudHBkMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LGxsdm1faTMyX3R5LCBsbHZtX3Y0ZjY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfcGRfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dldG1hbnRwZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGY2NF90eSxsbHZtX2kzMl90eSwgbGx2bV92OGY2NF90eSwgIGxsdm1faThfdHksbGx2bV9pMzJfdHkgXSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZ2V0bWFudF9wc18xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2V0bWFudHBzMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19nZXRtYW50X3BzXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nZXRtYW50cHMyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfcHNfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dldG1hbnRwczUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2ZjMyX3R5LGxsdm1faTMyX3R5LCBsbHZtX3YxNmYzMl90eSxsbHZtX2kxNl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfc3MgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2V0bWFudHNzX3JvdW5kX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZ2V0bWFudF9zZCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nZXRtYW50c2Rfcm91bmRfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfcnNxcnQxNF9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRzc19tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3JzcXJ0MTRfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yc3FydDE0c2RfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3JzcXJ0MTRfcGRfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcnNxcnQxNHBkMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcnNxcnQxNF9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yc3FydDE0cGQyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9yc3FydDE0X3BkXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRwZDUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3JzcXJ0MTRfcHNfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcnNxcnQxNHBzMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3JzcXJ0MTRfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcnNxcnQxNHBzMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcnNxcnQxNF9wc181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yc3FydDE0cHM1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3JjcDE0X3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmNwMTRzc19tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3JjcDE0X3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmNwMTRzZF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfcmNwMTRfcGRfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmNwMTRwZDEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3JjcDE0X3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JjcDE0cGQyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9yY3AxNF9wZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yY3AxNHBkNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcmNwMTRfcHNfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmNwMTRwczEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9yY3AxNF9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yY3AxNHBzMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcmNwMTRfcHNfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmNwMTRwczUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9yY3AyOF9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JjcDI4cHNfbWFzayI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3JjcDI4X3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmNwMjhwZF9tYXNrIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX2V4cDJfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHAycHNfbWFzayI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX2V4cDJfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHAycGRfbWFzayI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3JjcDI4X3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmNwMjhzc19yb3VuZF9tYXNrIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcmNwMjhfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yY3AyOHNkX3JvdW5kX21hc2siPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9yc3FydDI4X3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcnNxcnQyOHBzX21hc2siPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3JzcXJ0MjhfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yc3FydDI4cGRfbWFzayI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3JzcXJ0Mjhfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yc3FydDI4c3Nfcm91bmRfbWFzayI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3JzcXJ0Mjhfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yc3FydDI4c2Rfcm91bmRfbWFzayI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzYWRfYndfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNhZGJ3NTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y2NGk4X3R5LCBsbHZtX3Y2NGk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47Cit9CisvLyBJbnRlZ2VyIGFyaXRobWV0aWMgb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wYWRkc19iXzEyOCA6IC8vIEZJWE1FOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wYWRkc19iXzI1NiA6IC8vIEZJWE1FOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaThfdHldLCBbbGx2bV92MzJpOF90eSwgbGx2bV92MzJpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wYWRkc19iXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhZGRzYjUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y2NGk4X3R5XSwgW2xsdm1fdjY0aThfdHksIGxsdm1fdjY0aThfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y2NGk4X3R5LCBsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcGFkZHNfd18xMjggOiAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wYWRkc193XzI1NiA6IC8vIEZJWE1FOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LCBsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTE2X3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcGFkZHNfd181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWRkc3c1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLCBbbGx2bV92MzJpMTZfdHksIGxsdm1fdjMyaTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wYWRkdXNfYl8xMjggOiAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcGFkZHVzX2JfMjU2IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sIFtsbHZtX3YzMmk4X3R5LCBsbHZtX3YzMmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BhZGR1c19iXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhZGR1c2I1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NjRpOF90eV0sIFtsbHZtX3Y2NGk4X3R5LCBsbHZtX3Y2NGk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92NjRpOF90eSwgbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BhZGR1c193XzEyOCA6IC8vIEZJWE1FOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BhZGR1c193XzI1NiA6IC8vIEZJWE1FOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LCBsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTE2X3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcGFkZHVzX3dfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFkZHVzdzUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YzMmkxNl90eSwgbGx2bV92MzJpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BzdWJzX2JfMTI4IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpOF90eSwgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BzdWJzX2JfMjU2IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sIFtsbHZtX3YzMmk4X3R5LCBsbHZtX3YzMmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BzdWJzX2JfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHN1YnNiNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjY0aThfdHldLCBbbGx2bV92NjRpOF90eSwgbGx2bV92NjRpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjY0aThfdHksIGxsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wc3Vic193XzEyOCA6IC8vIEZJWE1FOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BzdWJzX3dfMjU2IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wc3Vic193XzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzdWJzdzUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YzMmkxNl90eSwgbGx2bV92MzJpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BzdWJ1c19iXzEyOCA6IC8vIEZJWE1FOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wc3VidXNfYl8yNTYgOiAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fdjMyaThfdHksIGxsdm1fdjMyaThfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHN1YnVzX2JfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHN1YnVzYjUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y2NGk4X3R5XSwgW2xsdm1fdjY0aThfdHksIGxsdm1fdjY0aThfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y2NGk4X3R5LCBsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHN1YnVzX3dfMTI4IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHN1YnVzX3dfMjU2IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wc3VidXNfd181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3VidXN3NTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BtdWx1X2RxXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWx1ZHE1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BtdWxfZHFfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG11bGRxNTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wbXVsaHVfd181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsaHV3NTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLCBbbGx2bV92MzJpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpMTZfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcG11bGhfd181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsaHc1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BtYWRkd19kXzEyOCA6IC8vIEZJWE1FOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y0aTMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbWFkZHdfZF8yNTYgOiAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aTE2X3R5LCBsbHZtX3Y4aTMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbWFkZHdfZF81MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1hZGR3ZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eSwgbGx2bV92MTZpMzJfdHksICBsbHZtX2kxNl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbWFkZHVic193XzEyOCA6IC8vIEZJWE1FOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX3Y4aTE2X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbWFkZHVic193XzI1NiA6IC8vIEZJWE1FOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwKKyAgICAgICAgICBbbGx2bV92MzJpOF90eSwgbGx2bV92MzJpOF90eSwgbGx2bV92MTZpMTZfdHksICBsbHZtX2kxNl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbWFkZHVic193XzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbWFkZHVic3c1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLAorICAgICAgICAgIFtsbHZtX3Y2NGk4X3R5LCBsbHZtX3Y2NGk4X3R5LCBsbHZtX3YzMmkxNl90eSwgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZGJwc2FkYndfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2RicHNhZGJ3MTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19kYnBzYWRid18yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZGJwc2FkYncyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLAorICAgICAgICAgIFtsbHZtX3YzMmk4X3R5LCBsbHZtX3YzMmk4X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2RicHNhZGJ3XzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9kYnBzYWRidzUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sCisgICAgICAgICAgW2xsdm1fdjY0aThfdHksIGxsdm1fdjY0aThfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIEdhdGhlciBhbmQgU2NhdHRlciBvcHMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXJfZHBkXzUxMiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY4ZGYiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcl9kcHNfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjE2c2YiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXJfcXBkXzUxMiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY4ZGYiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcl9xcHNfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjE2c2YiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwgbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXJfZHBxXzUxMiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY4ZGkiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwgbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcl9kcGlfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjE2c2kiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXJfcXBxXzUxMiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY4ZGkiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwgbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcl9xcGlfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjE2c2kiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwgbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfZ2F0aGVyM2RpdjJfZGYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2MmRmIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcjNkaXYyX2RpIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyM2RpdjJkaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJpNjRfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXIzZGl2NF9kZiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcjNkaXY0ZGYiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3B0cl90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfZ2F0aGVyM2RpdjRfZGkgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2NGRpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcjNkaXY0X3NmIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyM2RpdjRzZiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXIzZGl2NF9zaSA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcjNkaXY0c2kiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3B0cl90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfZ2F0aGVyM2Rpdjhfc2YgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2OHNmIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcjNkaXY4X3NpIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyM2RpdjhzaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXIzc2l2Ml9kZiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcjNzaXYyZGYiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3B0cl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfZ2F0aGVyM3NpdjJfZGkgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2MmRpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcjNzaXY0X2RmIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyM3NpdjRkZiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXIzc2l2NF9kaSA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcjNzaXY0ZGkiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3B0cl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfZ2F0aGVyM3NpdjRfc2YgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2NHNmIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcjNzaXY0X3NpIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyM3NpdjRzaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXIzc2l2OF9zZiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcjNzaXY4c2YiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3B0cl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfZ2F0aGVyM3Npdjhfc2kgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2OHNpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGkzMl90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKy8vIHNjYXR0ZXIKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJfZHBkXzUxMiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2OGRmIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4ZjY0X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcl9kcHNfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXYxNnNmIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZmMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVyX3FwZF81MTIgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjhkZiI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX2k4X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGk2NF90eSwgbGx2bV92OGY2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJfcXBzXzUxMiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2MTZzZiI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX2k4X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGk2NF90eSwgbGx2bV92OGYzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVyX2RwcV81MTIgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjhkaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX2k4X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVyX2RwaV81MTIgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjE2c2kiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVyX3FwcV81MTIgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjhkaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX2k4X3R5LGxsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJfcXBpXzUxMiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2MTZzaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJkaXYyX2RmIDoKKyAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2MmRmIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVyZGl2Ml9kaSA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXYyZGkiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJkaXY0X2RmIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjRkZiI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1faThfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcmRpdjRfZGkgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2NGRpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pOF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVyZGl2NF9zZiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY0c2YiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJkaXY0X3NpIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjRzaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1faThfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcmRpdjhfc2YgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2OHNmIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pOF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVyZGl2OF9zaSA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY4c2kiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJzaXYyX2RmIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjJkZiI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1faThfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcnNpdjJfZGkgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2MmRpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pOF90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVyc2l2NF9kZiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY0ZGYiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJzaXY0X2RpIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjRkaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1faThfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcnNpdjRfc2YgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2NHNmIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pOF90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVyc2l2NF9zaSA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY0c2kiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJzaXY4X3NmIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjhzZiI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1faThfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcnNpdjhfc2kgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2OHNpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pOF90eSwgbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCisgIC8vIGdhdGhlciBwcmVmZXRjaAorICBkZWYgaW50X3g4Nl9hdng1MTJfZ2F0aGVycGZfZHBkXzUxMiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJwZmRwZCI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faThfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1fcHRyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXJwZl9kcHNfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcnBmZHBzIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMTZfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfZ2F0aGVycGZfcXBkXzUxMiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJwZnFwZCI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faThfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1fcHRyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXJwZl9xcHNfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcnBmcXBzIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pOF90eSwgbGx2bV92OGk2NF90eSwgbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKworICAvLyBzY2F0dGVyIHByZWZldGNoCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVycGZfZHBkXzUxMiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVycGZkcGQiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2k4X3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcnBmX2Rwc181MTIgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcnBmZHBzIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMTZfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcnBmX3FwZF81MTIgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcnBmcXBkIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pOF90eSwgbGx2bV92OGk2NF90eSwgbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJwZl9xcHNfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJwZnFwcyI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faThfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1fcHRyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47Cit9CisKKy8vIEFWWC01MTIgY29uZmxpY3QgZGV0ZWN0aW9uIGluc3RydWN0aW9uCisvLyBJbnN0cnVjdGlvbnMgdGhhdCBjb3VudCB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgemVybyBiaXRzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb25mbGljdF9kXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBjb25mbGljdHNpXzEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbmZsaWN0X2RfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0c2lfMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29uZmxpY3RfZF81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwY29uZmxpY3RzaV81MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb25mbGljdF9xXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBjb25mbGljdGRpXzEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbmZsaWN0X3FfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0ZGlfMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29uZmxpY3RfcV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwY29uZmxpY3RkaV81MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCisvLyBDb21wYXJlcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsKKyAgLy8gNTEyLWJpdAorICBkZWYgaW50X3g4Nl9hdng1MTJfdmNvbWlfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y29taXNkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl92Y29taV9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zjb21pc3MiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gQ29tcHJlc3MsIEV4cGFuZAorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfcHNfNTEyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NzZjUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19wZF81MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc2RmNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfcHNfMjU2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NzZjI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3BkXzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzZGYyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19wc18xMjggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc3NmMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfcGRfMTI4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NkZjEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcHNfNTEyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3Jlc2Y1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV92MTZmMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcGRfNTEyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3JlZGY1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3N0b3JlX3BzXzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXNmMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fdjhmMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9wZF8yNTYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVkZjI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcHNfMTI4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3Jlc2YxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3N0b3JlX3BkXzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWRmMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX2RfNTEyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NzaTUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19xXzUxMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzZGk1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19kXzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc2kyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19xXzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzZGkyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19kXzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc2kxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19xXzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzZGkxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3N0b3JlX2RfNTEyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3Jlc2k1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcV81MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVkaTUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfZF8yNTYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVzaTI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcV8yNTYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVkaTI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfZF8xMjggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVzaTEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcV8xMjggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVkaTEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3YyaTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19iXzUxMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzcWk1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjY0aThfdHldLCBbbGx2bV92NjRpOF90eSwgbGx2bV92NjRpOF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfd181MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc2hpNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YzMmkxNl90eSwgbGx2bV92MzJpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX2JfMjU2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NxaTI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sIFtsbHZtX3YzMmk4X3R5LCBsbHZtX3YzMmk4X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc193XzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzaGkyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LCBsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfYl8xMjggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc3FpMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3dfMTI4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NoaTEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfYl81MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVxaTUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y2NGk4X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3N0b3JlX3dfNTEyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3JlaGk1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV92MzJpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfYl8yNTYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVxaTI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3YzMmk4X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3N0b3JlX3dfMjU2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3JlaGkyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfYl8xMjggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVxaTEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3N0b3JlX3dfMTI4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3JlaGkxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisKKy8vIGV4cGFuZAorICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfcHNfNTEyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kc2Y1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3BkXzUxMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGRmNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3BzXzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZHNmMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3BkXzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGRmMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3BzXzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZHNmMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3BkXzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGRmMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9wc181MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRzZjUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9wZF81MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRkZjUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9wc18yNTYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRzZjI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92OGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9wZF8yNTYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRkZjI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9wc18xMjggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRzZjEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9wZF8xMjggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRkZjEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9kXzUxMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZHNpNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9xXzUxMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGRpNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2RfMjU2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kc2kyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfcV8yNTYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHBhbmRkaTI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9kXzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZHNpMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3FfMTI4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kZGkxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX2RfNTEyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHBhbmRsb2Fkc2k1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfcV81MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRkaTUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9kXzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZHNpMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3FfMjU2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkZGkyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfZF8xMjggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRzaTEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9xXzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZGRpMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3YyaTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2JfNTEyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHBhbmRxaTUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NjRpOF90eV0sIFtsbHZtX3Y2NGk4X3R5LCBsbHZtX3Y2NGk4X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfd181MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGhpNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YzMmkxNl90eSwgbGx2bV92MzJpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9iXzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kcWkyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaThfdHldLCBbbGx2bV92MzJpOF90eSwgbGx2bV92MzJpOF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3dfMjU2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHBhbmRoaTI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfYl8xMjggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZHFpMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF93XzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kaGkxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX2JfNTEyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkcWk1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjY0aThfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fdjY0aThfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3dfNTEyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkaGk1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfYl8yNTYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRxaTI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92MzJpOF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfd18yNTYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRoaTI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9iXzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZHFpMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF93XzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZGhpMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47Cit9CisKKy8vIFZCTUkyIENvbmNhdCAmIFNoaWZ0CitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaGxkX3FfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkcTUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaGxkX3FfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkcTI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaGxkX3FfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkcTEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNobGRfZF81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGRkNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZF9kXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hsZGQyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLAorICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZF9kXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hsZGQxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaGxkX3dfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkdzUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLAorICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjMyaTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNobGRfd18yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGR3MjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aTE2X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZF93XzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hsZHcxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5LCBsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaHJkX3FfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkcTUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaHJkX3FfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkcTI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaHJkX3FfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkcTEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNocmRfZF81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmRkNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZF9kXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hyZGQyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLAorICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZF9kXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hyZGQxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaHJkX3dfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkdzUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLAorICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjMyaTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNocmRfd18yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmR3MjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aTE2X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZF93XzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hyZHcxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5LCBsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaGxkdl93XzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZ3MTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfd18xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGR2dzEyOF9tYXNreiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNobGR2X3dfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkdncyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LCBsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eSwgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cHNobGR2X3dfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkdncyNTZfbWFza3oiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNobGR2X3dfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkdnc1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cHNobGR2X3dfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkdnc1MTJfbWFza3oiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YzMmkxNl90eSwgbGx2bV92MzJpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGR2cTEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cHNobGR2X3FfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkdnExMjhfbWFza3oiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaGxkdl9xXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZxMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfcV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGR2cTI1Nl9tYXNreiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNobGR2X3FfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkdnE1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl9xXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZxNTEyX21hc2t6Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaGxkdl9kXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZkMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfZF8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGR2ZDEyOF9tYXNreiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNobGR2X2RfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkdmQyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl9kXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZkMjU2X21hc2t6Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfZF81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGR2ZDUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfZF81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGR2ZDUxMl9tYXNreiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkzMl90eSwgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaHJkdl93XzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZ3MTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfd18xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmR2dzEyOF9tYXNreiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNocmR2X3dfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkdncyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LCBsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eSwgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cHNocmR2X3dfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkdncyNTZfbWFza3oiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNocmR2X3dfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkdnc1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cHNocmR2X3dfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkdnc1MTJfbWFza3oiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YzMmkxNl90eSwgbGx2bV92MzJpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmR2cTEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cHNocmR2X3FfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkdnExMjhfbWFza3oiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaHJkdl9xXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZxMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfcV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmR2cTI1Nl9tYXNreiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNocmR2X3FfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkdnE1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl9xXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZxNTEyX21hc2t6Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaHJkdl9kXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZkMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfZF8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmR2ZDEyOF9tYXNreiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNocmR2X2RfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkdmQyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl9kXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZkMjU2X21hc2t6Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfZF81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmR2ZDUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfZF81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmR2ZDUxMl9tYXNreiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkzMl90eSwgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIHRydW5jYXRlCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3FiXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnFiMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdl9xYl9tZW1fMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cWIxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FiXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxYjEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FiX21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzcWIxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xYl8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FiMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FiX21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FiMTI4bWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3FiXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnFiMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdl9xYl9tZW1fMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cWIyNTZtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FiXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxYjI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FiX21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzcWIyNTZtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xYl8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FiMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FiX21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FiMjU2bWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3FiXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnFiNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGk2NF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdl9xYl9tZW1fNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cWI1MTJtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FiXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxYjUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FiX21lbV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzcWI1MTJtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xYl81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FiNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGk2NF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FiX21lbV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FiNTEybWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92OGk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3F3XzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnF3MTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdl9xd19tZW1fMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cXcxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3F3XzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxdzEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3F3X21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzcXcxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xd18xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3F3MTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3F3X21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3F3MTI4bWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3F3XzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnF3MjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdl9xd19tZW1fMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cXcyNTZtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3F3XzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxdzI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3F3X21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzcXcyNTZtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xd18yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3F3MjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3F3X21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3F3MjU2bWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3F3XzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnF3NTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGk2NF90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdl9xd19tZW1fNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cXc1MTJtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3F3XzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxdzUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3F3X21lbV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzcXc1MTJtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xd181MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3F3NTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGk2NF90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3F3X21lbV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3F3NTEybWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92OGk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3FkXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnFkMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdl9xZF9tZW1fMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cWQxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FkXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxZDEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FkX21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzcWQxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xZF8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FkMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FkX21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FkMTI4bWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3FkXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnFkMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdl9xZF9tZW1fMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cWQyNTZtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FkXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxZDI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FkX21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzcWQyNTZtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xZF8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FkMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FkX21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FkMjU2bWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3FkXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnFkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGk2NF90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdl9xZF9tZW1fNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cWQ1MTJtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FkXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FkX21lbV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzcWQ1MTJtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xZF81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGk2NF90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FkX21lbV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3FkNTEybWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92OGk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X2RiXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdmRiMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdl9kYl9tZW1fMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92ZGIxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2RiXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNkYjEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2RiX21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzZGIxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kYl8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c2RiMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2RiX21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c2RiMTI4bWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X2RiXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdmRiMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkzMl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdl9kYl9tZW1fMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92ZGIyNTZtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2RiXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNkYjI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2RiX21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzZGIyNTZtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kYl8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c2RiMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkzMl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2RiX21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c2RiMjU2bWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X2RiXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdmRiNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X2RiX21lbV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZkYjUxMm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92c19kYl81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzZGI1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2RiX21lbV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzZGI1MTJtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3YxNmkzMl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2RiXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzZGI1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kYl9tZW1fNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92dXNkYjUxMm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X2R3XzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdmR3MTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdl9kd19tZW1fMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92ZHcxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2R3XzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNkdzEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2R3X21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzZHcxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kd18xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c2R3MTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2R3X21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c2R3MTI4bWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X2R3XzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdmR3MjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkzMl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdl9kd19tZW1fMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92ZHcyNTZtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2R3XzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNkdzI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2R3X21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzZHcyNTZtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kd18yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c2R3MjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkzMl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2R3X21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c2R3MjU2bWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X2R3XzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdmR3NTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZfZHdfbWVtXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdmR3NTEybWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2R3XzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNkdzUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92c19kd19tZW1fNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c2R3NTEybWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kd181MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c2R3NTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kd19tZW1fNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92dXNkdzUxMm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3diXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdndiMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkxNl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdl93Yl9tZW1fMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92d2IxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3diXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnN3YjEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3diX21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Zzd2IxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c193Yl8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3diMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkxNl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3diX21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3diMTI4bWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3diXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdndiMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3diX21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z3YjI1Nm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjE2aTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92c193Yl8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Zzd2IyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3diX21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Zzd2IyNTZtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3YxNmkxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3diXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzd2IyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c193Yl9tZW1fMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92dXN3YjI1Nm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjE2aTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3diXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdndiNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMTZfdHksIGxsdm1fdjMyaThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3diX21lbV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z3YjUxMm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjMyaTE2X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92c193Yl81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Zzd2I1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkxNl90eSwgbGx2bV92MzJpOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3diX21lbV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Zzd2I1MTJtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3YzMmkxNl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3diXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzd2I1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkxNl90eSwgbGx2bV92MzJpOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c193Yl9tZW1fNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92dXN3YjUxMm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjMyaTE2X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworfQorCisvLyBCaXR3aXNlIHRlcm5hcnkgbG9naWMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3B0ZXJubG9nX2RfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdGVybmxvZ2QxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3B0ZXJubG9nX2RfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdGVybmxvZ2QxMjhfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3B0ZXJubG9nX2RfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdGVybmxvZ2QyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3B0ZXJubG9nX2RfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdGVybmxvZ2QyNTZfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3B0ZXJubG9nX2RfNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdGVybmxvZ2Q1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfcHRlcm5sb2dfZF81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3B0ZXJubG9nZDUxMl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wdGVybmxvZ19xXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHRlcm5sb2dxMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel9wdGVybmxvZ19xXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHRlcm5sb2dxMTI4X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wdGVybmxvZ19xXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHRlcm5sb2dxMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel9wdGVybmxvZ19xXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHRlcm5sb2dxMjU2X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wdGVybmxvZ19xXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHRlcm5sb2dxNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel9wdGVybmxvZ19xXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHRlcm5sb2dxNTEyX21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gTWlzYy4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NtcF9wc181MTIgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTFfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY21wX3BkXzUxMiA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxX3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jbXBfcHNfMjU2IDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTFfdHldLCBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY21wX3BkXzI1NiA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkxX3R5XSwgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NtcF9wc18xMjggOgorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTFfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NtcF9wZF8xMjggOgorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTFfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY21wX3NzIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY21wc3NfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faThfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NtcF9zZCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NtcHNkX21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k4X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU0hBIGludHJpbnNpY3MKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7CisgIGRlZiBpbnRfeDg2X3NoYTFybmRzNCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NoYTFybmRzNCI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NoYTFuZXh0ZSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NoYTFuZXh0ZSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NoYTFtc2cxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2hhMW1zZzEiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zaGExbXNnMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NoYTFtc2cyIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc2hhMjU2cm5kczIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zaGEyNTZybmRzMiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc2hhMjU2bXNnMSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NoYTI1Nm1zZzEiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zaGEyNTZtc2cyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2hhMjU2bXNnMiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUaHJlYWQgc3luY2hyb25pemF0aW9uIG9wcyB3aXRoIHRpbWVyLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsKKyAgZGVmIGludF94ODZfbW9uaXRvcngKKyAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbW9uaXRvcngiPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbIGxsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHkgXSwgW10+OworICBkZWYgaW50X3g4Nl9td2FpdHgKKyAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbXdhaXR4Ij4sCisgICAgICAgIEludHJpbnNpYzxbXSwgWyBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5IF0sIFtdPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENhY2hlLWxpbmUgemVybworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsKKyAgZGVmIGludF94ODZfY2x6ZXJvIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY2x6ZXJvIj4sCisgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsKK30KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc1hDb3JlLnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzWENvcmUudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYxNGUxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc1hDb3JlLnRkCkBAIC0wLDAgKzEsMTIxIEBACisvLz09LSBJbnRyaW5zaWNzWENvcmUudGQgLSBYQ29yZSBpbnRyaW5zaWNzICAgICAgICAgICAgICAgICAtKi0gdGFibGVnZW4gLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFsbCBvZiB0aGUgWENvcmUtc3BlY2lmaWMgaW50cmluc2ljcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitsZXQgVGFyZ2V0UHJlZml4ID0gInhjb3JlIiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLnhjb3JlLiIuCisgIC8vIE1pc2NlbGxhbmVvdXMgaW5zdHJ1Y3Rpb25zLgorICBkZWYgaW50X3hjb3JlX2JpdHJldiA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eV0sW0ludHJOb01lbV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9iaXRyZXYiPjsKKyAgZGVmIGludF94Y29yZV9jcmM4IDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5LGxsdm1faTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94Y29yZV9jcmMzMiA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eSxsbHZtX2kzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3hjb3JlX3NleHQgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeGNvcmVfemV4dCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94Y29yZV9nZXRpZCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtdLFtJbnRyTm9NZW1dPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9nZXRpZCI+OworICBkZWYgaW50X3hjb3JlX2dldHBzIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5XT4sCisgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fZ2V0cHMiPjsKKyAgZGVmIGludF94Y29yZV9zZXRwcyA6IEludHJpbnNpYzxbXSxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XT4sCisgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fc2V0cHMiPjsKKyAgZGVmIGludF94Y29yZV9nZXRlZCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtdPjsKKyAgZGVmIGludF94Y29yZV9nZXRldCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtdPjsKKyAgZGVmIGludF94Y29yZV9zZXRzciA6IEludHJpbnNpYzxbXSxbbGx2bV9pMzJfdHldPjsKKyAgZGVmIGludF94Y29yZV9jbHJzciA6IEludHJpbnNpYzxbXSxbbGx2bV9pMzJfdHldPjsKKworICAvLyBSZXNvdXJjZSBpbnN0cnVjdGlvbnMuCisgIGRlZiBpbnRfeGNvcmVfZ2V0ciA6IEludHJpbnNpYzxbbGx2bV9hbnlwdHJfdHldLFtsbHZtX2kzMl90eV0+OworICBkZWYgaW50X3hjb3JlX2ZyZWVyIDogSW50cmluc2ljPFtdLFtsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9pbiA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2FueXB0cl90eV0sW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX2ludCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9pbmN0IDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9vdXQgOiBJbnRyaW5zaWM8W10sW2xsdm1fYW55cHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9vdXR0IDogSW50cmluc2ljPFtdLFtsbHZtX2FueXB0cl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX291dGN0IDogSW50cmluc2ljPFtdLFtsbHZtX2FueXB0cl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9jaGtjdCA6IEludHJpbnNpYzxbXSxbbGx2bV9hbnlwdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfeGNvcmVfdGVzdGN0IDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX3Rlc3R3Y3QgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX3NldGQgOiBJbnRyaW5zaWM8W10sW2xsdm1fYW55cHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX3NldGMgOiBJbnRyaW5zaWM8W10sW2xsdm1fYW55cHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX2luc2hyIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1fYW55cHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX291dHNociA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2FueXB0cl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9zZXRwdCA6IEludHJpbnNpYzxbXSxbbGx2bV9hbnlwdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfeGNvcmVfY2xycHQgOiBJbnRyaW5zaWM8W10sW2xsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfeGNvcmVfZ2V0dHMgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9zeW5jciA6IEludHJpbnNpYzxbXSxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9zZXR0dyA6IEludHJpbnNpYzxbXSxbbGx2bV9hbnlwdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfeGNvcmVfc2V0diA6IEludHJpbnNpYzxbXSxbbGx2bV9hbnlwdHJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9zZXRldiA6IEludHJpbnNpYzxbXSxbbGx2bV9hbnlwdHJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfeGNvcmVfZWV1IDogSW50cmluc2ljPFtdLFtsbHZtX2FueXB0cl90eV0sIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9lZHUgOiBJbnRyaW5zaWM8W10sW2xsdm1fYW55cHRyX3R5XSwgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX3NldGNsayA6IEludHJpbnNpYzxbXSxbbGx2bV9hbnlwdHJfdHksIGxsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPiwgTm9DYXB0dXJlPDE+XT47CisgIGRlZiBpbnRfeGNvcmVfc2V0cmR5IDogSW50cmluc2ljPFtdLFtsbHZtX2FueXB0cl90eSwgbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+LCBOb0NhcHR1cmU8MT5dPjsKKyAgZGVmIGludF94Y29yZV9zZXRwc2MgOiBJbnRyaW5zaWM8W10sW2xsdm1fYW55cHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9wZWVrIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9lbmRpbiA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+XT47CisKKyAgLy8gSW50cmluc2ljcyBmb3IgZXZlbnRzLgorICBkZWYgaW50X3hjb3JlX3dhaXRldmVudCA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLFtdLCBbSW50clJlYWRNZW1dPjsKKworICAvLyBJZiBhbnkgb2YgdGhlIHJlc291cmNlcyBvd25lZCBieSB0aGUgdGhyZWFkIGFyZSByZWFkeSB0aGlzIHJldHVybnMgdGhlCisgIC8vIHZlY3RvciBvZiBvbmUgb2YgdGhlIHJlYWR5IHJlc291cmNlcy4gSWYgbm8gcmVzb3VyY2VzIG93bmVkIGJ5IHRoZSB0aHJlYWQKKyAgLy8gYXJlIHJlYWR5IHRoZW4gdGhlIG9wZXJhbmQgcGFzc2VkIHRvIHRoZSBpbnRyaW5zaWMgaXMgcmV0dXJuZWQuCisgIGRlZiBpbnRfeGNvcmVfY2hlY2tldmVudCA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLFtsbHZtX3B0cl90eV0+OworCisgIGRlZiBpbnRfeGNvcmVfY2xyZSA6IEludHJpbnNpYzxbXSxbXSxbXT47CisKKyAgLy8gSW50cmluc2ljcyBmb3IgdGhyZWFkcy4KKyAgZGVmIGludF94Y29yZV9nZXRzdCA6IEludHJpbnNpYyA8W2xsdm1fYW55cHRyX3R5XSxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfeGNvcmVfbXN5bmMgOiBJbnRyaW5zaWMgPFtdLFtsbHZtX2FueXB0cl90eV0sIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9zc3luYyA6IEludHJpbnNpYyA8W10sW10+OworICBkZWYgaW50X3hjb3JlX21qb2luIDogSW50cmluc2ljIDxbXSxbbGx2bV9hbnlwdHJfdHldLCBbTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfeGNvcmVfaW5pdHNwIDogSW50cmluc2ljIDxbXSxbbGx2bV9hbnlwdHJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9pbml0cGMgOiBJbnRyaW5zaWMgPFtdLFtsbHZtX2FueXB0cl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX2luaXRsciA6IEludHJpbnNpYyA8W10sW2xsdm1fYW55cHRyX3R5LCBsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfeGNvcmVfaW5pdGNwIDogSW50cmluc2ljIDxbXSxbbGx2bV9hbnlwdHJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9pbml0ZHAgOiBJbnRyaW5zaWMgPFtdLFtsbHZtX2FueXB0cl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworfQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9MTFZNQ29udGV4dC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9MTFZNQ29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NzhiNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0xMVk1Db250ZXh0LmgKQEAgLTAsMCArMSwzNDkgQEAKKy8vPT09LSBsbHZtL0xMVk1Db250ZXh0LmggLSBDbGFzcyBmb3IgbWFuYWdpbmcgImdsb2JhbCIgc3RhdGUgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIExMVk1Db250ZXh0LCBhIGNvbnRhaW5lciBvZiAiZ2xvYmFsIiBzdGF0ZSBpbiBMTFZNLCBzdWNoCisvLyBhcyB0aGUgZ2xvYmFsIHR5cGUgYW5kIGNvbnN0YW50IHVuaXF1aW5nIHRhYmxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfTExWTUNPTlRFWFRfSAorI2RlZmluZSBMTFZNX0lSX0xMVk1DT05URVhUX0gKKworI2luY2x1ZGUgImxsdm0tYy9UeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGlhZ25vc3RpY0hhbmRsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0JpbmRpbmdXcmFwcGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9PcHRpb25zLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIERpYWdub3N0aWNJbmZvOworZW51bSBEaWFnbm9zdGljU2V2ZXJpdHkgOiBjaGFyOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIExMVk1Db250ZXh0SW1wbDsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIE9wdFBhc3NHYXRlOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKK2NsYXNzIFNNRGlhZ25vc3RpYzsKK2NsYXNzIFN0cmluZ1JlZjsKK2NsYXNzIFR3aW5lOworCituYW1lc3BhY2UgeWFtbCB7CisKK2NsYXNzIE91dHB1dDsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHlhbWwKKworbmFtZXNwYWNlIFN5bmNTY29wZSB7CisKK3R5cGVkZWYgdWludDhfdCBJRDsKKworLy8vIEtub3duIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRHMsIHdoaWNoIGFsd2F5cyBoYXZlIHRoZSBzYW1lIHZhbHVlLiAgQWxsCisvLy8gc3luY2hyb25pemF0aW9uIHNjb3BlIElEcyB0aGF0IExMVk0gaGFzIHNwZWNpYWwga25vd2xlZGdlIG9mIGFyZSBsaXN0ZWQKKy8vLyBoZXJlLiAgQWRkaXRpb25hbGx5LCB0aGlzIHNjaGVtZSBhbGxvd3MgTExWTSB0byBlZmZpY2llbnRseSBjaGVjayBmb3IKKy8vLyBzcGVjaWZpYyBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQgd2l0aG91dCBjb21wYXJpbmcgc3RyaW5ncy4KK2VudW0geworICAvLy8gU3luY2hyb25pemVkIHdpdGggcmVzcGVjdCB0byBzaWduYWwgaGFuZGxlcnMgZXhlY3V0aW5nIGluIHRoZSBzYW1lIHRocmVhZC4KKyAgU2luZ2xlVGhyZWFkID0gMCwKKworICAvLy8gU3luY2hyb25pemVkIHdpdGggcmVzcGVjdCB0byBhbGwgY29uY3VycmVudGx5IGV4ZWN1dGluZyB0aHJlYWRzLgorICBTeXN0ZW0gPSAxCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgU3luY1Njb3BlCisKKy8vLyBUaGlzIGlzIGFuIGltcG9ydGFudCBjbGFzcyBmb3IgdXNpbmcgTExWTSBpbiBhIHRocmVhZGVkIGNvbnRleHQuICBJdAorLy8vIChvcGFxdWVseSkgb3ducyBhbmQgbWFuYWdlcyB0aGUgY29yZSAiZ2xvYmFsIiBkYXRhIG9mIExMVk0ncyBjb3JlCisvLy8gaW5mcmFzdHJ1Y3R1cmUsIGluY2x1ZGluZyB0aGUgdHlwZSBhbmQgY29uc3RhbnQgdW5pcXVpbmcgdGFibGVzLgorLy8vIExMVk1Db250ZXh0IGl0c2VsZiBwcm92aWRlcyBubyBsb2NraW5nIGd1YXJhbnRlZXMsIHNvIHlvdSBzaG91bGQgYmUgY2FyZWZ1bAorLy8vIHRvIGhhdmUgb25lIGNvbnRleHQgcGVyIHRocmVhZC4KK2NsYXNzIExMVk1Db250ZXh0IHsKK3B1YmxpYzoKKyAgTExWTUNvbnRleHRJbXBsICpjb25zdCBwSW1wbDsKKyAgTExWTUNvbnRleHQoKTsKKyAgTExWTUNvbnRleHQoTExWTUNvbnRleHQgJikgPSBkZWxldGU7CisgIExMVk1Db250ZXh0ICZvcGVyYXRvcj0oY29uc3QgTExWTUNvbnRleHQgJikgPSBkZWxldGU7CisgIH5MTFZNQ29udGV4dCgpOworCisgIC8vIFBpbm5lZCBtZXRhZGF0YSBuYW1lcywgd2hpY2ggYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUuICBUaGlzIGlzIGEKKyAgLy8gY29tcGlsZS10aW1lIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiwgbm90IGEgY29ycmVjdG5lc3Mgb3B0aW1pemF0aW9uLgorICBlbnVtIDogdW5zaWduZWQgeworICAgIE1EX2RiZyA9IDAsICAgICAgICAgICAgICAgICAgICAgICAvLyAiZGJnIgorICAgIE1EX3RiYWEgPSAxLCAgICAgICAgICAgICAgICAgICAgICAvLyAidGJhYSIKKyAgICBNRF9wcm9mID0gMiwgICAgICAgICAgICAgICAgICAgICAgLy8gInByb2YiCisgICAgTURfZnBtYXRoID0gMywgICAgICAgICAgICAgICAgICAgIC8vICJmcG1hdGgiCisgICAgTURfcmFuZ2UgPSA0LCAgICAgICAgICAgICAgICAgICAgIC8vICJyYW5nZSIKKyAgICBNRF90YmFhX3N0cnVjdCA9IDUsICAgICAgICAgICAgICAgLy8gInRiYWEuc3RydWN0IgorICAgIE1EX2ludmFyaWFudF9sb2FkID0gNiwgICAgICAgICAgICAvLyAiaW52YXJpYW50LmxvYWQiCisgICAgTURfYWxpYXNfc2NvcGUgPSA3LCAgICAgICAgICAgICAgIC8vICJhbGlhcy5zY29wZSIKKyAgICBNRF9ub2FsaWFzID0gOCwgICAgICAgICAgICAgICAgICAgLy8gIm5vYWxpYXMiLAorICAgIE1EX25vbnRlbXBvcmFsID0gOSwgICAgICAgICAgICAgICAvLyAibm9udGVtcG9yYWwiCisgICAgTURfbWVtX3BhcmFsbGVsX2xvb3BfYWNjZXNzID0gMTAsIC8vICJsbHZtLm1lbS5wYXJhbGxlbF9sb29wX2FjY2VzcyIKKyAgICBNRF9ub25udWxsID0gMTEsICAgICAgICAgICAgICAgICAgLy8gIm5vbm51bGwiCisgICAgTURfZGVyZWZlcmVuY2VhYmxlID0gMTIsICAgICAgICAgIC8vICJkZXJlZmVyZW5jZWFibGUiCisgICAgTURfZGVyZWZlcmVuY2VhYmxlX29yX251bGwgPSAxMywgIC8vICJkZXJlZmVyZW5jZWFibGVfb3JfbnVsbCIKKyAgICBNRF9tYWtlX2ltcGxpY2l0ID0gMTQsICAgICAgICAgICAgLy8gIm1ha2UuaW1wbGljaXQiCisgICAgTURfdW5wcmVkaWN0YWJsZSA9IDE1LCAgICAgICAgICAgIC8vICJ1bnByZWRpY3RhYmxlIgorICAgIE1EX2ludmFyaWFudF9ncm91cCA9IDE2LCAgICAgICAgICAvLyAiaW52YXJpYW50Lmdyb3VwIgorICAgIE1EX2FsaWduID0gMTcsICAgICAgICAgICAgICAgICAgICAvLyAiYWxpZ24iCisgICAgTURfbG9vcCA9IDE4LCAgICAgICAgICAgICAgICAgICAgIC8vICJsbHZtLmxvb3AiCisgICAgTURfdHlwZSA9IDE5LCAgICAgICAgICAgICAgICAgICAgIC8vICJ0eXBlIgorICAgIE1EX3NlY3Rpb25fcHJlZml4ID0gMjAsICAgICAgICAgICAvLyAic2VjdGlvbl9wcmVmaXgiCisgICAgTURfYWJzb2x1dGVfc3ltYm9sID0gMjEsICAgICAgICAgIC8vICJhYnNvbHV0ZV9zeW1ib2wiCisgICAgTURfYXNzb2NpYXRlZCA9IDIyLCAgICAgICAgICAgICAgIC8vICJhc3NvY2lhdGVkIgorICAgIE1EX2NhbGxlZXMgPSAyMywgICAgICAgICAgICAgICAgICAvLyAiY2FsbGVlcyIKKyAgICBNRF9pcnJfbG9vcCA9IDI0LCAgICAgICAgICAgICAgICAgLy8gImlycl9sb29wIgorICB9OworCisgIC8vLyBLbm93biBvcGVyYW5kIGJ1bmRsZSB0YWcgSURzLCB3aGljaCBhbHdheXMgaGF2ZSB0aGUgc2FtZSB2YWx1ZS4gIEFsbAorICAvLy8gb3BlcmFuZCBidW5kbGUgdGFncyB0aGF0IExMVk0gaGFzIHNwZWNpYWwga25vd2xlZGdlIG9mIGFyZSBsaXN0ZWQgaGVyZS4KKyAgLy8vIEFkZGl0aW9uYWxseSwgdGhpcyBzY2hlbWUgYWxsb3dzIExMVk0gdG8gZWZmaWNpZW50bHkgY2hlY2sgZm9yIHNwZWNpZmljCisgIC8vLyBvcGVyYW5kIGJ1bmRsZSB0YWdzIHdpdGhvdXQgY29tcGFyaW5nIHN0cmluZ3MuCisgIGVudW0gOiB1bnNpZ25lZCB7CisgICAgT0JfZGVvcHQgPSAwLCAgICAgICAgIC8vICJkZW9wdCIKKyAgICBPQl9mdW5jbGV0ID0gMSwgICAgICAgLy8gImZ1bmNsZXQiCisgICAgT0JfZ2NfdHJhbnNpdGlvbiA9IDIsIC8vICJnYy10cmFuc2l0aW9uIgorICB9OworCisgIC8vLyBnZXRNREtpbmRJRCAtIFJldHVybiBhIHVuaXF1ZSBub24temVybyBJRCBmb3IgdGhlIHNwZWNpZmllZCBtZXRhZGF0YSBraW5kLgorICAvLy8gVGhpcyBJRCBpcyB1bmlxdWVkIGFjcm9zcyBtb2R1bGVzIGluIHRoZSBjdXJyZW50IExMVk1Db250ZXh0LgorICB1bnNpZ25lZCBnZXRNREtpbmRJRChTdHJpbmdSZWYgTmFtZSkgY29uc3Q7CisKKyAgLy8vIGdldE1ES2luZE5hbWVzIC0gUG9wdWxhdGUgY2xpZW50IHN1cHBsaWVkIFNtYWxsVmVjdG9yIHdpdGggdGhlIG5hbWUgZm9yCisgIC8vLyBjdXN0b20gbWV0YWRhdGEgSURzIHJlZ2lzdGVyZWQgaW4gdGhpcyBMTFZNQ29udGV4dC4KKyAgdm9pZCBnZXRNREtpbmROYW1lcyhTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmUmVzdWx0KSBjb25zdDsKKworICAvLy8gZ2V0T3BlcmFuZEJ1bmRsZVRhZ3MgLSBQb3B1bGF0ZSBjbGllbnQgc3VwcGxpZWQgU21hbGxWZWN0b3Igd2l0aCB0aGUKKyAgLy8vIGJ1bmRsZSB0YWdzIHJlZ2lzdGVyZWQgaW4gdGhpcyBMTFZNQ29udGV4dC4gIFRoZSBidW5kbGUgdGFncyBhcmUgb3JkZXJlZAorICAvLy8gYnkgaW5jcmVhc2luZyBidW5kbGUgSURzLgorICAvLy8gXHNlZSBMTFZNQ29udGV4dDo6Z2V0T3BlcmFuZEJ1bmRsZVRhZ0lECisgIHZvaWQgZ2V0T3BlcmFuZEJ1bmRsZVRhZ3MoU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gJlJlc3VsdCkgY29uc3Q7CisKKyAgLy8vIGdldE9wZXJhbmRCdW5kbGVUYWdJRCAtIE1hcHMgYSBidW5kbGUgdGFnIHRvIGFuIGludGVnZXIgSUQuICBFdmVyeSBidW5kbGUKKyAgLy8vIHRhZyByZWdpc3RlcmVkIHdpdGggYW4gTExWTUNvbnRleHQgaGFzIGFuIHVuaXF1ZSBJRC4KKyAgdWludDMyX3QgZ2V0T3BlcmFuZEJ1bmRsZVRhZ0lEKFN0cmluZ1JlZiBUYWcpIGNvbnN0OworCisgIC8vLyBnZXRPckluc2VydFN5bmNTY29wZUlEIC0gTWFwcyBzeW5jaHJvbml6YXRpb24gc2NvcGUgbmFtZSB0bworICAvLy8gc3luY2hyb25pemF0aW9uIHNjb3BlIElELiAgRXZlcnkgc3luY2hyb25pemF0aW9uIHNjb3BlIHJlZ2lzdGVyZWQgd2l0aAorICAvLy8gTExWTUNvbnRleHQgaGFzIHVuaXF1ZSBJRCBleGNlcHQgcHJlLWRlZmluZWQgb25lcy4KKyAgU3luY1Njb3BlOjpJRCBnZXRPckluc2VydFN5bmNTY29wZUlEKFN0cmluZ1JlZiBTU04pOworCisgIC8vLyBnZXRTeW5jU2NvcGVOYW1lcyAtIFBvcHVsYXRlcyBjbGllbnQgc3VwcGxpZWQgU21hbGxWZWN0b3Igd2l0aAorICAvLy8gc3luY2hyb25pemF0aW9uIHNjb3BlIG5hbWVzIHJlZ2lzdGVyZWQgd2l0aCBMTFZNQ29udGV4dC4gIFN5bmNocm9uaXphdGlvbgorICAvLy8gc2NvcGUgbmFtZXMgYXJlIG9yZGVyZWQgYnkgaW5jcmVhc2luZyBzeW5jaHJvbml6YXRpb24gc2NvcGUgSURzLgorICB2b2lkIGdldFN5bmNTY29wZU5hbWVzKFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICZTU05zKSBjb25zdDsKKworICAvLy8gRGVmaW5lIHRoZSBHQyBmb3IgYSBmdW5jdGlvbgorICB2b2lkIHNldEdDKGNvbnN0IEZ1bmN0aW9uICZGbiwgc3RkOjpzdHJpbmcgR0NOYW1lKTsKKworICAvLy8gUmV0dXJuIHRoZSBHQyBmb3IgYSBmdW5jdGlvbgorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0R0MoY29uc3QgRnVuY3Rpb24gJkZuKTsKKworICAvLy8gUmVtb3ZlIHRoZSBHQyBmb3IgYSBmdW5jdGlvbgorICB2b2lkIGRlbGV0ZUdDKGNvbnN0IEZ1bmN0aW9uICZGbik7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBDb250ZXh0IHJ1bnRpbWUgY29uZmlndXJhdGlvbiBpcyBzZXQgdG8gZGlzY2FyZCBhbGwKKyAgLy8vIHZhbHVlIG5hbWVzLiBXaGVuIHRydWUsIG9ubHkgR2xvYmFsVmFsdWUgbmFtZXMgd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlCisgIC8vLyBJUi4KKyAgYm9vbCBzaG91bGREaXNjYXJkVmFsdWVOYW1lcygpIGNvbnN0OworCisgIC8vLyBTZXQgdGhlIENvbnRleHQgcnVudGltZSBjb25maWd1cmF0aW9uIHRvIGRpc2NhcmQgYWxsIHZhbHVlIG5hbWUgKGJ1dAorICAvLy8gR2xvYmFsVmFsdWUpLiBDbGllbnRzIGNhbiB1c2UgdGhpcyBmbGFnIHRvIHNhdmUgbWVtb3J5IGFuZCBydW50aW1lLAorICAvLy8gZXNwZWNpYWxseSBpbiByZWxlYXNlIG1vZGUuCisgIHZvaWQgc2V0RGlzY2FyZFZhbHVlTmFtZXMoYm9vbCBEaXNjYXJkKTsKKworICAvLy8gV2hldGhlciB0aGVyZSBpcyBhIHN0cmluZyBtYXAgZm9yIHVuaXF1aW5nIGRlYnVnIGluZm8KKyAgLy8vIGlkZW50aWZpZXJzIGFjcm9zcyB0aGUgY29udGV4dC4gIE9mZiBieSBkZWZhdWx0LgorICBib29sIGlzT0RSVW5pcXVpbmdEZWJ1Z1R5cGVzKCkgY29uc3Q7CisgIHZvaWQgZW5hYmxlRGVidWdUeXBlT0RSVW5pcXVpbmcoKTsKKyAgdm9pZCBkaXNhYmxlRGVidWdUeXBlT0RSVW5pcXVpbmcoKTsKKworICB1c2luZyBJbmxpbmVBc21EaWFnSGFuZGxlclR5ID0gdm9pZCAoKikoY29uc3QgU01EaWFnbm9zdGljJiwgdm9pZCAqQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExvY0Nvb2tpZSk7CisKKyAgLy8vIERlZmluZXMgdGhlIHR5cGUgb2YgYSB5aWVsZCBjYWxsYmFjay4KKyAgLy8vIFxzZWUgTExWTUNvbnRleHQ6OnNldFlpZWxkQ2FsbGJhY2suCisgIHVzaW5nIFlpZWxkQ2FsbGJhY2tUeSA9IHZvaWQgKCopKExMVk1Db250ZXh0ICpDb250ZXh0LCB2b2lkICpPcGFxdWVIYW5kbGUpOworCisgIC8vLyBzZXRJbmxpbmVBc21EaWFnbm9zdGljSGFuZGxlciAtIFRoaXMgbWV0aG9kIHNldHMgYSBoYW5kbGVyIHRoYXQgaXMgaW52b2tlZAorICAvLy8gd2hlbiBwcm9ibGVtcyB3aXRoIGlubGluZSBhc20gYXJlIGRldGVjdGVkIGJ5IHRoZSBiYWNrZW5kLiAgVGhlIGZpcnN0CisgIC8vLyBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uIHBvaW50ZXIgYW5kIHRoZSBzZWNvbmQgaXMgYSBjb250ZXh0IHBvaW50ZXIgdGhhdAorICAvLy8gZ2V0cyBwYXNzZWQgaW50byB0aGUgRGlhZ0hhbmRsZXIuCisgIC8vLworICAvLy8gTExWTUNvbnRleHQgZG9lc24ndCB0YWtlIG93bmVyc2hpcCBvciBpbnRlcnByZXQgZWl0aGVyIG9mIHRoZXNlCisgIC8vLyBwb2ludGVycy4KKyAgdm9pZCBzZXRJbmxpbmVBc21EaWFnbm9zdGljSGFuZGxlcihJbmxpbmVBc21EaWFnSGFuZGxlclR5IERpYWdIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkRpYWdDb250ZXh0ID0gbnVsbHB0cik7CisKKyAgLy8vIGdldElubGluZUFzbURpYWdub3N0aWNIYW5kbGVyIC0gUmV0dXJuIHRoZSBkaWFnbm9zdGljIGhhbmRsZXIgc2V0IGJ5CisgIC8vLyBzZXRJbmxpbmVBc21EaWFnbm9zdGljSGFuZGxlci4KKyAgSW5saW5lQXNtRGlhZ0hhbmRsZXJUeSBnZXRJbmxpbmVBc21EaWFnbm9zdGljSGFuZGxlcigpIGNvbnN0OworCisgIC8vLyBnZXRJbmxpbmVBc21EaWFnbm9zdGljQ29udGV4dCAtIFJldHVybiB0aGUgZGlhZ25vc3RpYyBjb250ZXh0IHNldCBieQorICAvLy8gc2V0SW5saW5lQXNtRGlhZ25vc3RpY0hhbmRsZXIuCisgIHZvaWQgKmdldElubGluZUFzbURpYWdub3N0aWNDb250ZXh0KCkgY29uc3Q7CisKKyAgLy8vIHNldERpYWdub3N0aWNIYW5kbGVyQ2FsbEJhY2sgLSBUaGlzIG1ldGhvZCBzZXRzIGEgaGFuZGxlciBjYWxsIGJhY2sKKyAgLy8vIHRoYXQgaXMgaW52b2tlZCB3aGVuIHRoZSBiYWNrZW5kIG5lZWRzIHRvIHJlcG9ydCBhbnl0aGluZyB0byB0aGUgdXNlci4KKyAgLy8vIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uIHBvaW50ZXIgYW5kIHRoZSBzZWNvbmQgaXMgYSBjb250ZXh0IHBvaW50ZXIKKyAgLy8vIHRoYXQgZ2V0cyBwYXNzZWQgaW50byB0aGUgRGlhZ0hhbmRsZXIuICBUaGUgdGhpcmQgYXJndW1lbnQgc2hvdWxkIGJlIHNldCB0bworICAvLy8gdHJ1ZSBpZiB0aGUgaGFuZGxlciBvbmx5IGV4cGVjdHMgZW5hYmxlZCBkaWFnbm9zdGljcy4KKyAgLy8vCisgIC8vLyBMTFZNQ29udGV4dCBkb2Vzbid0IHRha2Ugb3duZXJzaGlwIG9yIGludGVycHJldCBlaXRoZXIgb2YgdGhlc2UKKyAgLy8vIHBvaW50ZXJzLgorICB2b2lkIHNldERpYWdub3N0aWNIYW5kbGVyQ2FsbEJhY2soCisgICAgICBEaWFnbm9zdGljSGFuZGxlcjo6RGlhZ25vc3RpY0hhbmRsZXJUeSBEaWFnSGFuZGxlciwKKyAgICAgIHZvaWQgKkRpYWdDb250ZXh0ID0gbnVsbHB0ciwgYm9vbCBSZXNwZWN0RmlsdGVycyA9IGZhbHNlKTsKKworICAvLy8gc2V0RGlhZ25vc3RpY0hhbmRsZXIgLSBUaGlzIG1ldGhvZCBzZXRzIHVuaXF1ZV9wdHIgdG8gb2JqZWN0IG9mIERpYWdub3N0aWNIYW5kbGVyCisgIC8vLyB0byBwcm92aWRlIGN1c3RvbSBkaWFnbm9zdGljIGhhbmRsaW5nLiBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdW5pcXVlX3B0ciBvZiBvYmplY3QKKyAgLy8vIG9mIHR5cGUgRGlhZ25vc3RpY0hhbmRsZXIgb3IgYSBkZXJpdmVkIG9mIHRoYXQuICAgVGhlIHRoaXJkIGFyZ3VtZW50IHNob3VsZCBiZQorICAvLy8gc2V0IHRvIHRydWUgaWYgdGhlIGhhbmRsZXIgb25seSBleHBlY3RzIGVuYWJsZWQgZGlhZ25vc3RpY3MuCisgIC8vLworICAvLy8gT3duZXJzaGlwIG9mIHRoaXMgcG9pbnRlciBpcyBtb3ZlZCB0byBMTFZNQ29udGV4dEltcGwuCisgIHZvaWQgc2V0RGlhZ25vc3RpY0hhbmRsZXIoc3RkOjp1bmlxdWVfcHRyPERpYWdub3N0aWNIYW5kbGVyPiAmJkRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVzcGVjdEZpbHRlcnMgPSBmYWxzZSk7CisKKyAgLy8vIGdldERpYWdub3N0aWNIYW5kbGVyQ2FsbEJhY2sgLSBSZXR1cm4gdGhlIGRpYWdub3N0aWMgaGFuZGxlciBjYWxsIGJhY2sgc2V0IGJ5CisgIC8vLyBzZXREaWFnbm9zdGljSGFuZGxlckNhbGxCYWNrLgorICBEaWFnbm9zdGljSGFuZGxlcjo6RGlhZ25vc3RpY0hhbmRsZXJUeSBnZXREaWFnbm9zdGljSGFuZGxlckNhbGxCYWNrKCkgY29uc3Q7CisKKyAgLy8vIGdldERpYWdub3N0aWNDb250ZXh0IC0gUmV0dXJuIHRoZSBkaWFnbm9zdGljIGNvbnRleHQgc2V0IGJ5CisgIC8vLyBzZXREaWFnbm9zdGljQ29udGV4dC4KKyAgdm9pZCAqZ2V0RGlhZ25vc3RpY0NvbnRleHQoKSBjb25zdDsKKworICAvLy8gZ2V0RGlhZ0hhbmRsZXJQdHIgLSBSZXR1cm5zIGNvbnN0IHJhdyBwb2ludGVyIG9mIERpYWdub3N0aWNIYW5kbGVyIHNldCBieQorICAvLy8gc2V0RGlhZ25vc3RpY0hhbmRsZXIuCisgIGNvbnN0IERpYWdub3N0aWNIYW5kbGVyICpnZXREaWFnSGFuZGxlclB0cigpIGNvbnN0OworCisgIC8vLyBnZXREaWFnbm9zdGljSGFuZGxlciAtIHRyYW5zZmVycyBvd2VuZXJzaGlwIG9mIERpYWdub3N0aWNIYW5kbGVyIHVuaXF1ZV9wdHIKKyAgLy8vIHRvIGNhbGxlci4KKyAgc3RkOjp1bmlxdWVfcHRyPERpYWdub3N0aWNIYW5kbGVyPiBnZXREaWFnbm9zdGljSGFuZGxlcigpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGlmIGEgY29kZSBob3RuZXNzIG1ldHJpYyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gb3B0aW1pemF0aW9uCisgIC8vLyBkaWFnbm9zdGljcy4KKyAgYm9vbCBnZXREaWFnbm9zdGljc0hvdG5lc3NSZXF1ZXN0ZWQoKSBjb25zdDsKKyAgLy8vIFxicmllZiBTZXQgaWYgYSBjb2RlIGhvdG5lc3MgbWV0cmljIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBvcHRpbWl6YXRpb24KKyAgLy8vIGRpYWdub3N0aWNzLgorICB2b2lkIHNldERpYWdub3N0aWNzSG90bmVzc1JlcXVlc3RlZChib29sIFJlcXVlc3RlZCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG1pbmltdW0gaG90bmVzcyB2YWx1ZSBhIGRpYWdub3N0aWMgd291bGQgbmVlZCBpbiBvcmRlcgorICAvLy8gdG8gYmUgaW5jbHVkZWQgaW4gb3B0aW1pemF0aW9uIGRpYWdub3N0aWNzLiBJZiB0aGVyZSBpcyBubyBtaW5pbXVtLCB0aGlzCisgIC8vLyByZXR1cm5zIE5vbmUuCisgIHVpbnQ2NF90IGdldERpYWdub3N0aWNzSG90bmVzc1RocmVzaG9sZCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBtaW5pbXVtIGhvdG5lc3MgdmFsdWUgYSBkaWFnbm9zdGljIG5lZWRzIGluIG9yZGVyIHRvIGJlCisgIC8vLyBpbmNsdWRlZCBpbiBvcHRpbWl6YXRpb24gZGlhZ25vc3RpY3MuCisgIHZvaWQgc2V0RGlhZ25vc3RpY3NIb3RuZXNzVGhyZXNob2xkKHVpbnQ2NF90IFRocmVzaG9sZCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIFlBTUwgZmlsZSB1c2VkIGJ5IHRoZSBiYWNrZW5kIHRvIHNhdmUgb3B0aW1pemF0aW9uCisgIC8vLyBkaWFnbm9zdGljcy4gIElmIG51bGwsIGRpYWdub3N0aWNzIGFyZSBub3Qgc2F2ZWQgaW4gYSBmaWxlIGJ1dCBvbmx5CisgIC8vLyBlbWl0dGVkIHZpYSB0aGUgZGlhZ25vc3RpYyBoYW5kbGVyLgorICB5YW1sOjpPdXRwdXQgKmdldERpYWdub3N0aWNzT3V0cHV0RmlsZSgpOworICAvLy8gU2V0IHRoZSBkaWFnbm9zdGljcyBvdXRwdXQgZmlsZSB1c2VkIGZvciBvcHRpbWl6YXRpb24gZGlhZ25vc3RpY3MuCisgIC8vLworICAvLy8gQnkgZGVmYXVsdCBvciBpZiBpbnZva2VkIHdpdGggbnVsbCwgZGlhZ25vc3RpY3MgYXJlIG5vdCBzYXZlZCBpbiBhIGZpbGUKKyAgLy8vIGJ1dCBvbmx5IGVtaXR0ZWQgdmlhIHRoZSBkaWFnbm9zdGljIGhhbmRsZXIuICBFdmVuIGlmIGFuIG91dHB1dCBmaWxlIGlzCisgIC8vLyBzZXQsIHRoZSBoYW5kbGVyIGlzIGludm9rZWQgZm9yIGVhY2ggZGlhZ25vc3RpYyBtZXNzYWdlLgorICB2b2lkIHNldERpYWdub3N0aWNzT3V0cHV0RmlsZShzdGQ6OnVuaXF1ZV9wdHI8eWFtbDo6T3V0cHV0PiBGKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgcHJlZml4IHRoYXQgc2hvdWxkIGJlIHByaW50ZWQgaW4gZnJvbnQgb2YgYSBkaWFnbm9zdGljIG9mCisgIC8vLyAgICAgICAgdGhlIGdpdmVuIFxwIFNldmVyaXR5CisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXREaWFnbm9zdGljTWVzc2FnZVByZWZpeChEaWFnbm9zdGljU2V2ZXJpdHkgU2V2ZXJpdHkpOworCisgIC8vLyBcYnJpZWYgUmVwb3J0IGEgbWVzc2FnZSB0byB0aGUgY3VycmVudGx5IGluc3RhbGxlZCBkaWFnbm9zdGljIGhhbmRsZXIuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zLCBpbiBwYXJ0aWN1bGFyIGluIHRoZSBjYXNlIG9mIGVycm9yIHJlcG9ydGluZworICAvLy8gKERJLlNldmVyaXR5ID09IFxhIERTX0Vycm9yKSwgc28gdGhlIGNhbGxlciBzaG91bGQgbGVhdmUgdGhlIGNvbXBpbGF0aW9uCisgIC8vLyBwcm9jZXNzIGluIGEgc2VsZi1jb25zaXN0ZW50IHN0YXRlLCBldmVuIHRob3VnaCB0aGUgZ2VuZXJhdGVkIGNvZGUKKyAgLy8vIG5lZWQgbm90IGJlIGNvcnJlY3QuCisgIC8vLworICAvLy8gVGhlIGRpYWdub3N0aWMgbWVzc2FnZSB3aWxsIGJlIGltcGxpY2l0bHkgcHJlZml4ZWQgd2l0aCBhIHNldmVyaXR5IGtleXdvcmQKKyAgLy8vIGFjY29yZGluZyB0byBccCBESS5nZXRTZXZlcml0eSgpLCBpLmUuLCAiZXJyb3I6ICIgZm9yIFxhIERTX0Vycm9yLAorICAvLy8gIndhcm5pbmc6ICIgZm9yIFxhIERTX1dhcm5pbmcsIGFuZCAibm90ZTogIiBmb3IgXGEgRFNfTm90ZS4KKyAgdm9pZCBkaWFnbm9zZShjb25zdCBEaWFnbm9zdGljSW5mbyAmREkpOworCisgIC8vLyBcYnJpZWYgUmVnaXN0ZXJzIGEgeWllbGQgY2FsbGJhY2sgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dC4KKyAgLy8vCisgIC8vLyBUaGUgeWllbGQgY2FsbGJhY2sgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBieSBMTFZNIHRvIHRyYW5zZmVyIGNvbnRyb2wgYmFjaworICAvLy8gdG8gdGhlIGNsaWVudCB0aGF0IGludm9rZWQgdGhlIExMVk0gY29tcGlsYXRpb24uIFRoaXMgY2FuIGJlIHVzZWQgdG8geWllbGQKKyAgLy8vIGNvbnRyb2wgb2YgdGhlIHRocmVhZCwgb3IgcGVyZm9ybSBwZXJpb2RpYyB3b3JrIG5lZWRlZCBieSB0aGUgY2xpZW50LgorICAvLy8gVGhlcmUgaXMgbm8gZ3VhcmFudGVlZCBmcmVxdWVuY3kgYXQgd2hpY2ggY2FsbGJhY2tzIG11c3Qgb2NjdXI7IGluIGZhY3QsCisgIC8vLyB0aGUgY2xpZW50IGlzIG5vdCBndWFyYW50ZWVkIHRvIGV2ZXIgcmVjZWl2ZSB0aGlzIGNhbGxiYWNrLiBJdCBpcyBhdCB0aGUKKyAgLy8vIHNvbGUgZGlzY3JldGlvbiBvZiBMTFZNIHRvIGRvIHNvIGFuZCBvbmx5IGlmIGl0IGNhbiBndWFyYW50ZWUgdGhhdAorICAvLy8gc3VzcGVuZGluZyB0aGUgdGhyZWFkIHdvbid0IGJsb2NrIGFueSBmb3J3YXJkIHByb2dyZXNzIGluIG90aGVyIExMVk0KKyAgLy8vIGNvbnRleHRzIGluIHRoZSBzYW1lIHByb2Nlc3MuCisgIC8vLworICAvLy8gQXQgYSBzdXNwZW5kIHBvaW50LCB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgTExWTSBjb250ZXh0IGlzIGludGVudGlvbmFsbHkKKyAgLy8vIHVuZGVmaW5lZC4gTm8gYXNzdW1wdGlvbnMgYWJvdXQgaXQgY2FuIG9yIHNob3VsZCBiZSBtYWRlLiBPbmx5IExMVk0KKyAgLy8vIGNvbnRleHQgQVBJIGNhbGxzIHRoYXQgZXhwbGljaXRseSBzdGF0ZSB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgZHVyaW5nIGEKKyAgLy8vIHlpZWxkIGNhbGxiYWNrIGFyZSBhbGxvd2VkIHRvIGJlIHVzZWQuIEFueSBvdGhlciBBUEkgY2FsbHMgaW50byB0aGUKKyAgLy8vIGNvbnRleHQgYXJlIG5vdCBzdXBwb3J0ZWQgdW50aWwgdGhlIHlpZWxkIGNhbGxiYWNrIGZ1bmN0aW9uIHJldHVybnMKKyAgLy8vIGNvbnRyb2wgdG8gTExWTS4gT3RoZXIgTExWTSBjb250ZXh0cyBhcmUgdW5hZmZlY3RlZCBieSB0aGlzIHJlc3RyaWN0aW9uLgorICB2b2lkIHNldFlpZWxkQ2FsbGJhY2soWWllbGRDYWxsYmFja1R5IENhbGxiYWNrLCB2b2lkICpPcGFxdWVIYW5kbGUpOworCisgIC8vLyBcYnJpZWYgQ2FsbHMgdGhlIHlpZWxkIGNhbGxiYWNrIChpZiBhcHBsaWNhYmxlKS4KKyAgLy8vCisgIC8vLyBUaGlzIHRyYW5zZmVycyBjb250cm9sIG9mIHRoZSBjdXJyZW50IHRocmVhZCBiYWNrIHRvIHRoZSBjbGllbnQsIHdoaWNoIG1heQorICAvLy8gc3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQuIE9ubHkgY2FsbCB0aGlzIG1ldGhvZCB3aGVuIExMVk0gZG9lc24ndCBob2xkCisgIC8vLyBhbnkgZ2xvYmFsIG11dGV4IG9yIGNhbm5vdCBibG9jayB0aGUgZXhlY3V0aW9uIGluIGFub3RoZXIgTExWTSBjb250ZXh0LgorICB2b2lkIHlpZWxkKCk7CisKKyAgLy8vIGVtaXRFcnJvciAtIEVtaXQgYW4gZXJyb3IgbWVzc2FnZSB0byB0aGUgY3VycmVudGx5IGluc3RhbGxlZCBlcnJvciBoYW5kbGVyCisgIC8vLyB3aXRoIG9wdGlvbmFsIGxvY2F0aW9uIGluZm9ybWF0aW9uLiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zLCBzbyBjb2RlIHNob3VsZAorICAvLy8gYmUgcHJlcGFyZWQgdG8gZHJvcCB0aGUgZXJyb25lb3VzIGNvbnN0cnVjdCBvbiB0aGUgZmxvb3IgYW5kICJub3QgY3Jhc2giLgorICAvLy8gVGhlIGdlbmVyYXRlZCBjb2RlIG5lZWQgbm90IGJlIGNvcnJlY3QuICBUaGUgZXJyb3IgbWVzc2FnZSB3aWxsIGJlCisgIC8vLyBpbXBsaWNpdGx5IHByZWZpeGVkIHdpdGggImVycm9yOiAiIGFuZCBzaG91bGQgbm90IGVuZCB3aXRoIGEgIi4iLgorICB2b2lkIGVtaXRFcnJvcih1bnNpZ25lZCBMb2NDb29raWUsIGNvbnN0IFR3aW5lICZFcnJvclN0cik7CisgIHZvaWQgZW1pdEVycm9yKGNvbnN0IEluc3RydWN0aW9uICpJLCBjb25zdCBUd2luZSAmRXJyb3JTdHIpOworICB2b2lkIGVtaXRFcnJvcihjb25zdCBUd2luZSAmRXJyb3JTdHIpOworCisgIC8vLyBcYnJpZWYgUXVlcnkgZm9yIGEgZGVidWcgb3B0aW9uJ3MgdmFsdWUuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHR5cGVkIGRhdGEgcG9wdWxhdGVkIGZyb20gY29tbWFuZCBsaW5lIHBhcnNpbmcuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBWYWxULCB0eXBlbmFtZSBCYXNlLCBWYWxUKEJhc2U6OipNZW0pPgorICBWYWxUIGdldE9wdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gT3B0aW9uUmVnaXN0cnk6Omluc3RhbmNlKCkudGVtcGxhdGUgZ2V0PFZhbFQsIEJhc2UsIE1lbT4oKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWNjZXNzIHRoZSBvYmplY3Qgd2hpY2ggbWFuYWdlcyBvcHRpbWl6YXRpb24gYmlzZWN0aW9uIGZvciBmYWlsdXJlCisgIC8vLyBhbmFseXNpcy4KKyAgT3B0UGFzc0dhdGUgJmdldE9wdFBhc3NHYXRlKCk7CisKK3ByaXZhdGU6CisgIC8vIE1vZHVsZSBuZWVkcyBhY2Nlc3MgdG8gdGhlIGFkZC9yZW1vdmVNb2R1bGUgbWV0aG9kcy4KKyAgZnJpZW5kIGNsYXNzIE1vZHVsZTsKKworICAvLy8gYWRkTW9kdWxlIC0gUmVnaXN0ZXIgYSBtb2R1bGUgYXMgYmVpbmcgaW5zdGFudGlhdGVkIGluIHRoaXMgY29udGV4dC4gIElmCisgIC8vLyB0aGUgY29udGV4dCBpcyBkZWxldGVkLCB0aGUgbW9kdWxlIHdpbGwgYmUgZGVsZXRlZCBhcyB3ZWxsLgorICB2b2lkIGFkZE1vZHVsZShNb2R1bGUqKTsKKworICAvLy8gcmVtb3ZlTW9kdWxlIC0gVW5yZWdpc3RlciBhIG1vZHVsZSBmcm9tIHRoaXMgY29udGV4dC4KKyAgdm9pZCByZW1vdmVNb2R1bGUoTW9kdWxlKik7Cit9OworCisvLyBDcmVhdGUgd3JhcHBlcnMgZm9yIEMgQmluZGluZyB0eXBlcyAoc2VlIENCaW5kaW5nV3JhcHBpbmcuaCkuCitERUZJTkVfU0lNUExFX0NPTlZFUlNJT05fRlVOQ1RJT05TKExMVk1Db250ZXh0LCBMTFZNQ29udGV4dFJlZikKKworLyogU3BlY2lhbGl6ZWQgb3BhcXVlIGNvbnRleHQgY29udmVyc2lvbnMuCisgKi8KK2lubGluZSBMTFZNQ29udGV4dCAqKnVud3JhcChMTFZNQ29udGV4dFJlZiogVHlzKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PExMVk1Db250ZXh0Kio+KFR5cyk7Cit9CisKK2lubGluZSBMTFZNQ29udGV4dFJlZiAqd3JhcChjb25zdCBMTFZNQ29udGV4dCAqKlR5cykgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxMTFZNQ29udGV4dFJlZio+KGNvbnN0X2Nhc3Q8TExWTUNvbnRleHQqKj4oVHlzKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0xMVk1DT05URVhUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTGVnYWN5UGFzc01hbmFnZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTGVnYWN5UGFzc01hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTM3NmExCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9MZWdhY3lQYXNzTWFuYWdlci5oCkBAIC0wLDAgKzEsMTA2IEBACisvLz09PS0gTGVnYWN5UGFzc01hbmFnZXIuaCAtIExlZ2FjeSBDb250YWluZXIgZm9yIFBhc3NlcyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBsZWdhY3kgUGFzc01hbmFnZXIgY2xhc3MuICBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaG9sZCwKKy8vIG1haW50YWluLCBhbmQgb3B0aW1pemUgZXhlY3V0aW9uIG9mIFBhc3Nlcy4gIFRoZSBQYXNzTWFuYWdlciBjbGFzcyBlbnN1cmVzCisvLyB0aGF0IGFuYWx5c2lzIHJlc3VsdHMgYXJlIGF2YWlsYWJsZSBiZWZvcmUgYSBwYXNzIHJ1bnMsIGFuZCB0aGF0IFBhc3MncyBhcmUKKy8vIGRlc3Ryb3llZCB3aGVuIHRoZSBQYXNzTWFuYWdlciBpcyBkZXN0cm95ZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0xFR0FDWVBBU1NNQU5BR0VSX0gKKyNkZWZpbmUgTExWTV9JUl9MRUdBQ1lQQVNTTUFOQUdFUl9ICisKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0JpbmRpbmdXcmFwcGluZy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFBhc3M7CitjbGFzcyBNb2R1bGU7CisKK25hbWVzcGFjZSBsZWdhY3kgeworCitjbGFzcyBQYXNzTWFuYWdlckltcGw7CitjbGFzcyBGdW5jdGlvblBhc3NNYW5hZ2VySW1wbDsKKworLy8vIFBhc3NNYW5hZ2VyQmFzZSAtIEFuIGFic3RyYWN0IGludGVyZmFjZSB0byBhbGxvdyBjb2RlIHRvIGFkZCBwYXNzZXMgdG8KKy8vLyBhIHBhc3MgbWFuYWdlciB3aXRob3V0IGhhdmluZyB0byBoYXJkLWNvZGUgd2hhdCBraW5kIG9mIHBhc3MgbWFuYWdlcgorLy8vIGl0IGlzLgorY2xhc3MgUGFzc01hbmFnZXJCYXNlIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+UGFzc01hbmFnZXJCYXNlKCk7CisKKyAgLy8vIEFkZCBhIHBhc3MgdG8gdGhlIHF1ZXVlIG9mIHBhc3NlcyB0byBydW4uICBUaGlzIHBhc3NlcyBvd25lcnNoaXAgb2YKKyAgLy8vIHRoZSBQYXNzIHRvIHRoZSBQYXNzTWFuYWdlci4gIFdoZW4gdGhlIFBhc3NNYW5hZ2VyIGlzIGRlc3Ryb3llZCwgdGhlIHBhc3MKKyAgLy8vIHdpbGwgYmUgZGVzdHJveWVkIGFzIHdlbGwsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gZGVsZXRlIHRoZSBwYXNzLiAgVGhpcworICAvLy8gbWF5IGV2ZW4gZGVzdHJveSB0aGUgcGFzcyByaWdodCBhd2F5IGlmIGl0IGlzIGZvdW5kIHRvIGJlIHJlZHVuZGFudC4gVGhpcworICAvLy8gaW1wbGllcyB0aGF0IGFsbCBwYXNzZXMgTVVTVCBiZSBhbGxvY2F0ZWQgd2l0aCAnbmV3Jy4KKyAgdmlydHVhbCB2b2lkIGFkZChQYXNzICpQKSA9IDA7Cit9OworCisvLy8gUGFzc01hbmFnZXIgbWFuYWdlcyBNb2R1bGVQYXNzTWFuYWdlcnMKK2NsYXNzIFBhc3NNYW5hZ2VyIDogcHVibGljIFBhc3NNYW5hZ2VyQmFzZSB7CitwdWJsaWM6CisKKyAgUGFzc01hbmFnZXIoKTsKKyAgflBhc3NNYW5hZ2VyKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBhZGQoUGFzcyAqUCkgb3ZlcnJpZGU7CisKKyAgLy8vIHJ1biAtIEV4ZWN1dGUgYWxsIG9mIHRoZSBwYXNzZXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uICBLZWVwIHRyYWNrIG9mCisgIC8vLyB3aGV0aGVyIGFueSBvZiB0aGUgcGFzc2VzIG1vZGlmaWVzIHRoZSBtb2R1bGUsIGFuZCBpZiBzbywgcmV0dXJuIHRydWUuCisgIGJvb2wgcnVuKE1vZHVsZSAmTSk7CisKK3ByaXZhdGU6CisgIC8vLyBQYXNzTWFuYWdlckltcGxfTmV3IGlzIHRoZSBhY3R1YWwgY2xhc3MuIFBhc3NNYW5hZ2VyIGlzIGp1c3QgdGhlCisgIC8vLyB3cmFwZXIgdG8gcHVibGlzaCBzaW1wbGUgcGFzcyBtYW5hZ2VyIGludGVyZmFjZQorICBQYXNzTWFuYWdlckltcGwgKlBNOworfTsKKworLy8vIEZ1bmN0aW9uUGFzc01hbmFnZXIgbWFuYWdlcyBGdW5jdGlvblBhc3NlcyBhbmQgQmFzaWNCbG9ja1Bhc3NNYW5hZ2Vycy4KK2NsYXNzIEZ1bmN0aW9uUGFzc01hbmFnZXIgOiBwdWJsaWMgUGFzc01hbmFnZXJCYXNlIHsKK3B1YmxpYzoKKyAgLy8vIEZ1bmN0aW9uUGFzc01hbmFnZXIgY3RvciAtIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIHBhc3MgbWFuYWdlci4gIEl0IG5lZWRzLAorICAvLy8gYnV0IGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mLCB0aGUgc3BlY2lmaWVkIE1vZHVsZS4KKyAgZXhwbGljaXQgRnVuY3Rpb25QYXNzTWFuYWdlcihNb2R1bGUgKk0pOworICB+RnVuY3Rpb25QYXNzTWFuYWdlcigpIG92ZXJyaWRlOworCisgIHZvaWQgYWRkKFBhc3MgKlApIG92ZXJyaWRlOworCisgIC8vLyBydW4gLSBFeGVjdXRlIGFsbCBvZiB0aGUgcGFzc2VzIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uLiAgS2VlcAorICAvLy8gdHJhY2sgb2Ygd2hldGhlciBhbnkgb2YgdGhlIHBhc3NlcyBtb2RpZmllcyB0aGUgZnVuY3Rpb24sIGFuZCBpZgorICAvLy8gc28sIHJldHVybiB0cnVlLgorICAvLy8KKyAgYm9vbCBydW4oRnVuY3Rpb24gJkYpOworCisgIC8vLyBkb0luaXRpYWxpemF0aW9uIC0gUnVuIGFsbCBvZiB0aGUgaW5pdGlhbGl6ZXJzIGZvciB0aGUgZnVuY3Rpb24gcGFzc2VzLgorICAvLy8KKyAgYm9vbCBkb0luaXRpYWxpemF0aW9uKCk7CisKKyAgLy8vIGRvRmluYWxpemF0aW9uIC0gUnVuIGFsbCBvZiB0aGUgZmluYWxpemVycyBmb3IgdGhlIGZ1bmN0aW9uIHBhc3Nlcy4KKyAgLy8vCisgIGJvb2wgZG9GaW5hbGl6YXRpb24oKTsKKworcHJpdmF0ZToKKyAgRnVuY3Rpb25QYXNzTWFuYWdlckltcGwgKkZQTTsKKyAgTW9kdWxlICpNOworfTsKKworfSAvLyBFbmQgbGVnYWN5IG5hbWVzcGFjZQorCisvLyBDcmVhdGUgd3JhcHBlcnMgZm9yIEMgQmluZGluZyB0eXBlcyAoc2VlIENCaW5kaW5nV3JhcHBpbmcuaCkuCitERUZJTkVfU1REQ1hYX0NPTlZFUlNJT05fRlVOQ1RJT05TKGxlZ2FjeTo6UGFzc01hbmFnZXJCYXNlLCBMTFZNUGFzc01hbmFnZXJSZWYpCisKKy8vLyBJZiAtdGltZS1wYXNzZXMgaGFzIGJlZW4gc3BlY2lmaWVkLCByZXBvcnQgdGhlIHRpbWluZ3MgaW1tZWRpYXRlbHkgYW5kIHRoZW4KKy8vLyByZXNldCB0aGUgdGltZXJzIHRvIHplcm8uCit2b2lkIHJlcG9ydEFuZFJlc2V0VGltaW5ncygpOworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0xlZ2FjeVBhc3NNYW5hZ2Vycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9MZWdhY3lQYXNzTWFuYWdlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGM0YTc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9MZWdhY3lQYXNzTWFuYWdlcnMuaApAQCAtMCwwICsxLDUwNSBAQAorLy89PT0tIExlZ2FjeVBhc3NNYW5hZ2Vycy5oIC0gTGVnYWN5IFBhc3MgSW5mcmFzdHJ1Y3R1cmUgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIExMVk0gUGFzcyBNYW5hZ2VyIGluZnJhc3RydWN0dXJlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9MRUdBQ1lQQVNTTUFOQUdFUlNfSAorI2RlZmluZSBMTFZNX0lSX0xFR0FDWVBBU1NNQU5BR0VSU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gT3ZlcnZpZXc6CisvLyBUaGUgUGFzcyBNYW5hZ2VyIEluZnJhc3RydWN0dXJlIG1hbmFnZXMgcGFzc2VzLiBJdCdzIHJlc3BvbnNpYmlsaXRpZXMgYXJlOgorLy8KKy8vICAgbyBNYW5hZ2Ugb3B0aW1pemF0aW9uIHBhc3MgZXhlY3V0aW9uIG9yZGVyCisvLyAgIG8gTWFrZSByZXF1aXJlZCBBbmFseXNpcyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgYmVmb3JlIHBhc3MgUCBpcyBydW4KKy8vICAgbyBSZWxlYXNlIG1lbW9yeSBvY2N1cGllZCBieSBkZWFkIHBhc3NlcworLy8gICBvIElmIEFuYWx5c2lzIGluZm9ybWF0aW9uIGlzIGRpcnRpZWQgYnkgYSBwYXNzIHRoZW4gcmVnZW5lcmF0ZSBBbmFseXNpcworLy8gICAgIGluZm9ybWF0aW9uIGJlZm9yZSBpdCBpcyBjb25zdW1lZCBieSBhbm90aGVyIHBhc3MuCisvLworLy8gUGFzcyBNYW5hZ2VyIEluZnJhc3RydWN0dXJlIHVzZXMgbXVsdGlwbGUgcGFzcyBtYW5hZ2Vycy4gIFRoZXkgYXJlCisvLyBQYXNzTWFuYWdlciwgRnVuY3Rpb25QYXNzTWFuYWdlciwgTVBQYXNzTWFuYWdlciwgRlBQYXNzTWFuYWdlciwgQkJQYXNzTWFuYWdlci4KKy8vIFRoaXMgY2xhc3MgaGllcmFyY2h5IHVzZXMgbXVsdGlwbGUgaW5oZXJpdGFuY2UgYnV0IHBhc3MgbWFuYWdlcnMgZG8gbm90CisvLyBkZXJpdmUgZnJvbSBhbm90aGVyIHBhc3MgbWFuYWdlci4KKy8vCisvLyBQYXNzTWFuYWdlciBhbmQgRnVuY3Rpb25QYXNzTWFuYWdlciBhcmUgdHdvIHRvcC1sZXZlbCBwYXNzIG1hbmFnZXIgdGhhdAorLy8gcmVwcmVzZW50cyB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlIG9mIHRoaXMgZW50aXJlIHBhc3MgbWFuYWdlciBpbmZyYXN0dWN0dXJlLgorLy8KKy8vIEltcG9ydGFudCBjbGFzc2VzIDoKKy8vCisvLyBbb10gY2xhc3MgUE1Ub3BMZXZlbE1hbmFnZXI7CisvLworLy8gVHdvIHRvcCBsZXZlbCBtYW5hZ2VycywgUGFzc01hbmFnZXIgYW5kIEZ1bmN0aW9uUGFzc01hbmFnZXIsIGRlcml2ZSBmcm9tCisvLyBQTVRvcExldmVsTWFuYWdlci4gUE1Ub3BMZXZlbE1hbmFnZXIgbWFuYWdlcyBpbmZvcm1hdGlvbiB1c2VkIGJ5IHRvcCBsZXZlbAorLy8gbWFuYWdlcnMgc3VjaCBhcyBsYXN0IHVzZXIgaW5mby4KKy8vCisvLyBbb10gY2xhc3MgUE1EYXRhTWFuYWdlcjsKKy8vCisvLyBQTURhdGFNYW5hZ2VyIG1hbmFnZXMgaW5mb3JtYXRpb24sIGUuZy4gbGlzdCBvZiBhdmFpbGFibGUgYW5hbHlzaXMgaW5mbywKKy8vIHVzZWQgYnkgYSBwYXNzIG1hbmFnZXIgdG8gbWFuYWdlIGV4ZWN1dGlvbiBvcmRlciBvZiBwYXNzZXMuIEl0IGFsc28gcHJvdmlkZXMKKy8vIGEgcGxhY2UgdG8gaW1wbGVtZW50IGNvbW1vbiBwYXNzIG1hbmFnZXIgQVBJcy4gQWxsIHBhc3MgbWFuYWdlcnMgZGVyaXZlIGZyb20KKy8vIFBNRGF0YU1hbmFnZXIuCisvLworLy8gW29dIGNsYXNzIEJCUGFzc01hbmFnZXIgOiBwdWJsaWMgRnVuY3Rpb25QYXNzLCBwdWJsaWMgUE1EYXRhTWFuYWdlcjsKKy8vCisvLyBCQlBhc3NNYW5hZ2VyIG1hbmFnZXMgQmFzaWNCbG9ja1Bhc3Nlcy4KKy8vCisvLyBbb10gY2xhc3MgRnVuY3Rpb25QYXNzTWFuYWdlcjsKKy8vCisvLyBUaGlzIGlzIGEgZXh0ZXJuYWwgaW50ZXJmYWNlIHVzZWQgdG8gbWFuYWdlIEZ1bmN0aW9uUGFzc2VzLiBUaGlzCisvLyBpbnRlcmZhY2UgcmVsaWVzIG9uIEZ1bmN0aW9uUGFzc01hbmFnZXJJbXBsIHRvIGRvIGFsbCB0aGUgdGFza3MuCisvLworLy8gW29dIGNsYXNzIEZ1bmN0aW9uUGFzc01hbmFnZXJJbXBsIDogcHVibGljIE1vZHVsZVBhc3MsIFBNRGF0YU1hbmFnZXIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUE1Ub3BMZXZlbE1hbmFnZXI7CisvLworLy8gRnVuY3Rpb25QYXNzTWFuYWdlckltcGwgaXMgYSB0b3AgbGV2ZWwgbWFuYWdlci4gSXQgbWFuYWdlcyBGUFBhc3NNYW5hZ2VycworLy8KKy8vIFtvXSBjbGFzcyBGUFBhc3NNYW5hZ2VyIDogcHVibGljIE1vZHVsZVBhc3MsIHB1YmxpYyBQTURhdGFNYW5hZ2VyOworLy8KKy8vIEZQUGFzc01hbmFnZXIgbWFuYWdlcyBGdW5jdGlvblBhc3NlcyBhbmQgQkJQYXNzTWFuYWdlcnMKKy8vCisvLyBbb10gY2xhc3MgTVBQYXNzTWFuYWdlciA6IHB1YmxpYyBQYXNzLCBwdWJsaWMgUE1EYXRhTWFuYWdlcjsKKy8vCisvLyBNUFBhc3NNYW5hZ2VyIG1hbmFnZXMgTW9kdWxlUGFzc2VzIGFuZCBGUFBhc3NNYW5hZ2VycworLy8KKy8vIFtvXSBjbGFzcyBQYXNzTWFuYWdlcjsKKy8vCisvLyBUaGlzIGlzIGEgZXh0ZXJuYWwgaW50ZXJmYWNlIHVzZWQgYnkgdmFyaW91cyB0b29scyB0byBtYW5hZ2VzIHBhc3Nlcy4gSXQKKy8vIHJlbGllcyBvbiBQYXNzTWFuYWdlckltcGwgdG8gZG8gYWxsIHRoZSB0YXNrcy4KKy8vCisvLyBbb10gY2xhc3MgUGFzc01hbmFnZXJJbXBsIDogcHVibGljIFBhc3MsIHB1YmxpYyBQTURhdGFNYW5hZ2VyLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBQTVRvcExldmVsTWFuYWdlcgorLy8KKy8vIFBhc3NNYW5hZ2VySW1wbCBpcyBhIHRvcCBsZXZlbCBwYXNzIG1hbmFnZXIgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nCisvLyBNUFBhc3NNYW5hZ2Vycy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUHJldHR5U3RhY2tUcmFjZS5oIgorCituYW1lc3BhY2UgbGx2bSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBQYXNzOworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgVmFsdWU7CitjbGFzcyBUaW1lcjsKK2NsYXNzIFBNRGF0YU1hbmFnZXI7CisKKy8vIGVudW1zIGZvciBkZWJ1Z2dpbmcgc3RyaW5ncworZW51bSBQYXNzRGVidWdnaW5nU3RyaW5nIHsKKyAgRVhFQ1VUSU9OX01TRywgLy8gIkV4ZWN1dGluZyBQYXNzICciICsgUGFzc05hbWUKKyAgTU9ESUZJQ0FUSU9OX01TRywgLy8gIk1hZGUgTW9kaWZpY2F0aW9uICciICsgUGFzc05hbWUKKyAgRlJFRUlOR19NU0csIC8vICIgRnJlZWluZyBQYXNzICciICsgUGFzc05hbWUKKyAgT05fQkFTSUNCTE9DS19NU0csIC8vICInIG9uIEJhc2ljQmxvY2sgJyIgKyBJbnN0cnVjdGlvbk5hbWUgKyAiJy4uLlxuIgorICBPTl9GVU5DVElPTl9NU0csIC8vICInIG9uIEZ1bmN0aW9uICciICsgRnVuY3Rpb25OYW1lICsgIicuLi5cbiIKKyAgT05fTU9EVUxFX01TRywgLy8gIicgb24gTW9kdWxlICciICsgTW9kdWxlTmFtZSArICInLi4uXG4iCisgIE9OX1JFR0lPTl9NU0csIC8vICInIG9uIFJlZ2lvbiAnIiArIE1zZyArICInLi4uXG4nIgorICBPTl9MT09QX01TRywgLy8gIicgb24gTG9vcCAnIiArIE1zZyArICInLi4uXG4nIgorICBPTl9DR19NU0cgLy8gIicgb24gQ2FsbCBHcmFwaCBOb2RlcyAnIiArIE1zZyArICInLi4uXG4nIgorfTsKKworLy8vIFBhc3NNYW5hZ2VyUHJldHR5U3RhY2tFbnRyeSAtIFRoaXMgaXMgdXNlZCB0byBwcmludCBpbmZvcm1hdGl2ZSBpbmZvcm1hdGlvbgorLy8vIGFib3V0IHdoYXQgcGFzcyBpcyBydW5uaW5nIHdoZW4vaWYgYSBzdGFjayB0cmFjZSBpcyBnZW5lcmF0ZWQuCitjbGFzcyBQYXNzTWFuYWdlclByZXR0eVN0YWNrRW50cnkgOiBwdWJsaWMgUHJldHR5U3RhY2tUcmFjZUVudHJ5IHsKKyAgUGFzcyAqUDsKKyAgVmFsdWUgKlY7CisgIE1vZHVsZSAqTTsKKworcHVibGljOgorICBleHBsaWNpdCBQYXNzTWFuYWdlclByZXR0eVN0YWNrRW50cnkoUGFzcyAqcCkKKyAgICA6IFAocCksIFYobnVsbHB0ciksIE0obnVsbHB0cikge30gIC8vIFdoZW4gUCBpcyByZWxlYXNlTWVtb3J5J2QuCisgIFBhc3NNYW5hZ2VyUHJldHR5U3RhY2tFbnRyeShQYXNzICpwLCBWYWx1ZSAmdikKKyAgICA6IFAocCksIFYoJnYpLCBNKG51bGxwdHIpIHt9IC8vIFdoZW4gUCBpcyBydW4gb24gVgorICBQYXNzTWFuYWdlclByZXR0eVN0YWNrRW50cnkoUGFzcyAqcCwgTW9kdWxlICZtKQorICAgIDogUChwKSwgVihudWxscHRyKSwgTSgmbSkge30gLy8gV2hlbiBQIGlzIHJ1biBvbiBNCisKKyAgLy8vIHByaW50IC0gRW1pdCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHN0YWNrIGZyYW1lIHRvIE9TLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUE1TdGFjaworLy8KKy8vLyBQTVN0YWNrIC0gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgc3RhY2sgZGF0YSBzdHJ1Y3R1cmUgb2YgUE1EYXRhTWFuYWdlcgorLy8vIHBvaW50ZXJzLgorLy8vCisvLy8gVG9wIGxldmVsIHBhc3MgbWFuYWdlcnMgKHNlZSBQYXNzTWFuYWdlci5jcHApIG1haW50YWluIGFjdGl2ZSBQYXNzIE1hbmFnZXJzCisvLy8gdXNpbmcgUE1TdGFjay4gRWFjaCBQYXNzIGltcGxlbWVudHMgYXNzaWduUGFzc01hbmFnZXIoKSB0byBjb25uZWN0IGl0c2VsZgorLy8vIHdpdGggYXBwcm9wcmlhdGUgbWFuYWdlci4gYXNzaWduUGFzc01hbmFnZXIoKSB3YWxrcyBQTVN0YWNrIHRvIGZpbmQKKy8vLyBzdWl0YWJsZSBtYW5hZ2VyLgorY2xhc3MgUE1TdGFjayB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UE1EYXRhTWFuYWdlciAqPjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdGVyYXRvcjsKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBTLnJiZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFMucmVuZCgpOyB9CisKKyAgdm9pZCBwb3AoKTsKKyAgUE1EYXRhTWFuYWdlciAqdG9wKCkgY29uc3QgeyByZXR1cm4gUy5iYWNrKCk7IH0KKyAgdm9pZCBwdXNoKFBNRGF0YU1hbmFnZXIgKlBNKTsKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFMuZW1wdHkoKTsgfQorCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCitwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxQTURhdGFNYW5hZ2VyICo+IFM7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUE1Ub3BMZXZlbE1hbmFnZXIKKy8vCisvLy8gUE1Ub3BMZXZlbE1hbmFnZXIgbWFuYWdlcyBMYXN0VXNlciBpbmZvIGFuZCBjb2xsZWN0cyBjb21tb24gQVBJcyB1c2VkIGJ5CisvLy8gdG9wIGxldmVsIHBhc3MgbWFuYWdlcnMuCitjbGFzcyBQTVRvcExldmVsTWFuYWdlciB7Citwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IFBNVG9wTGV2ZWxNYW5hZ2VyKFBNRGF0YU1hbmFnZXIgKlBNRE0pOworCisgIHVuc2lnbmVkIGdldE51bUNvbnRhaW5lZE1hbmFnZXJzKCkgY29uc3QgeworICAgIHJldHVybiAodW5zaWduZWQpUGFzc01hbmFnZXJzLnNpemUoKTsKKyAgfQorCisgIHZvaWQgaW5pdGlhbGl6ZUFsbEFuYWx5c2lzSW5mbygpOworCitwcml2YXRlOgorICB2aXJ0dWFsIFBNRGF0YU1hbmFnZXIgKmdldEFzUE1EYXRhTWFuYWdlcigpID0gMDsKKyAgdmlydHVhbCBQYXNzTWFuYWdlclR5cGUgZ2V0VG9wTGV2ZWxQYXNzTWFuYWdlclR5cGUoKSA9IDA7CisKK3B1YmxpYzoKKyAgLy8vIFNjaGVkdWxlIHBhc3MgUCBmb3IgZXhlY3V0aW9uLiBNYWtlIHN1cmUgdGhhdCBwYXNzZXMgcmVxdWlyZWQgYnkKKyAgLy8vIFAgYXJlIHJ1biBiZWZvcmUgUCBpcyBydW4uIFVwZGF0ZSBhbmFseXNpcyBpbmZvIG1haW50YWluZWQgYnkKKyAgLy8vIHRoZSBtYW5hZ2VyLiBSZW1vdmUgZGVhZCBwYXNzZXMuIFRoaXMgaXMgYSByZWN1cnNpdmUgZnVuY3Rpb24uCisgIHZvaWQgc2NoZWR1bGVQYXNzKFBhc3MgKlApOworCisgIC8vLyBTZXQgcGFzcyBQIGFzIHRoZSBsYXN0IHVzZXIgb2YgdGhlIGdpdmVuIGFuYWx5c2lzIHBhc3Nlcy4KKyAgdm9pZCBzZXRMYXN0VXNlcihBcnJheVJlZjxQYXNzKj4gQW5hbHlzaXNQYXNzZXMsIFBhc3MgKlApOworCisgIC8vLyBDb2xsZWN0IHBhc3NlcyB3aG9zZSBsYXN0IHVzZXIgaXMgUAorICB2b2lkIGNvbGxlY3RMYXN0VXNlcyhTbWFsbFZlY3RvckltcGw8UGFzcyAqPiAmTGFzdFVzZXMsIFBhc3MgKlApOworCisgIC8vLyBGaW5kIHRoZSBwYXNzIHRoYXQgaW1wbGVtZW50cyBBbmFseXNpcyBBSUQuIFNlYXJjaCBpbW11dGFibGUKKyAgLy8vIHBhc3NlcyBhbmQgYWxsIHBhc3MgbWFuYWdlcnMuIElmIGRlc2lyZWQgcGFzcyBpcyBub3QgZm91bmQKKyAgLy8vIHRoZW4gcmV0dXJuIE5VTEwuCisgIFBhc3MgKmZpbmRBbmFseXNpc1Bhc3MoQW5hbHlzaXNJRCBBSUQpOworCisgIC8vLyBSZXRyaWV2ZSB0aGUgUGFzc0luZm8gZm9yIGFuIGFuYWx5c2lzLgorICBjb25zdCBQYXNzSW5mbyAqZmluZEFuYWx5c2lzUGFzc0luZm8oQW5hbHlzaXNJRCBBSUQpIGNvbnN0OworCisgIC8vLyBGaW5kIGFuYWx5c2lzIHVzYWdlIGluZm9ybWF0aW9uIGZvciB0aGUgcGFzcyBQLgorICBBbmFseXNpc1VzYWdlICpmaW5kQW5hbHlzaXNVc2FnZShQYXNzICpQKTsKKworICB2aXJ0dWFsIH5QTVRvcExldmVsTWFuYWdlcigpOworCisgIC8vLyBBZGQgaW1tdXRhYmxlIHBhc3MgYW5kIGluaXRpYWxpemUgaXQuCisgIHZvaWQgYWRkSW1tdXRhYmxlUGFzcyhJbW11dGFibGVQYXNzICpQKTsKKworICBpbmxpbmUgU21hbGxWZWN0b3JJbXBsPEltbXV0YWJsZVBhc3MgKj4mIGdldEltbXV0YWJsZVBhc3NlcygpIHsKKyAgICByZXR1cm4gSW1tdXRhYmxlUGFzc2VzOworICB9CisKKyAgdm9pZCBhZGRQYXNzTWFuYWdlcihQTURhdGFNYW5hZ2VyICpNYW5hZ2VyKSB7CisgICAgUGFzc01hbmFnZXJzLnB1c2hfYmFjayhNYW5hZ2VyKTsKKyAgfQorCisgIC8vIEFkZCBNYW5hZ2VyIGludG8gdGhlIGxpc3Qgb2YgbWFuYWdlcnMgdGhhdCBhcmUgbm90IGRpcmVjdGx5CisgIC8vIG1haW50YWluZWQgYnkgdGhpcyB0b3AgbGV2ZWwgcGFzcyBtYW5hZ2VyCisgIGlubGluZSB2b2lkIGFkZEluZGlyZWN0UGFzc01hbmFnZXIoUE1EYXRhTWFuYWdlciAqTWFuYWdlcikgeworICAgIEluZGlyZWN0UGFzc01hbmFnZXJzLnB1c2hfYmFjayhNYW5hZ2VyKTsKKyAgfQorCisgIC8vIFByaW50IHBhc3NlcyBtYW5hZ2VkIGJ5IHRoaXMgdG9wIGxldmVsIG1hbmFnZXIuCisgIHZvaWQgZHVtcFBhc3NlcygpIGNvbnN0OworICB2b2lkIGR1bXBBcmd1bWVudHMoKSBjb25zdDsKKworICAvLyBBY3RpdmUgUGFzcyBNYW5hZ2VycworICBQTVN0YWNrIGFjdGl2ZVN0YWNrOworCitwcm90ZWN0ZWQ6CisgIC8vLyBDb2xsZWN0aW9uIG9mIHBhc3MgbWFuYWdlcnMKKyAgU21hbGxWZWN0b3I8UE1EYXRhTWFuYWdlciAqLCA4PiBQYXNzTWFuYWdlcnM7CisKK3ByaXZhdGU6CisgIC8vLyBDb2xsZWN0aW9uIG9mIHBhc3MgbWFuYWdlcnMgdGhhdCBhcmUgbm90IGRpcmVjdGx5IG1haW50YWluZWQKKyAgLy8vIGJ5IHRoaXMgcGFzcyBtYW5hZ2VyCisgIFNtYWxsVmVjdG9yPFBNRGF0YU1hbmFnZXIgKiwgOD4gSW5kaXJlY3RQYXNzTWFuYWdlcnM7CisKKyAgLy8gTWFwIHRvIGtlZXAgdHJhY2sgb2YgbGFzdCB1c2VyIG9mIHRoZSBhbmFseXNpcyBwYXNzLgorICAvLyBMYXN0VXNlci0+c2Vjb25kIGlzIHRoZSBsYXN0IHVzZXIgb2YgTGFzdHVzZXItPmZpcnN0LgorICBEZW5zZU1hcDxQYXNzICosIFBhc3MgKj4gTGFzdFVzZXI7CisKKyAgLy8gTWFwIHRvIGtlZXAgdHJhY2sgb2YgcGFzc2VzIHRoYXQgYXJlIGxhc3QgdXNlZCBieSBhIHBhc3MuCisgIC8vIFRoaXMgaW52ZXJzZSBtYXAgaXMgaW5pdGlhbGl6ZWQgYXQgUE0tPnJ1bigpIGJhc2VkIG9uCisgIC8vIExhc3RVc2VyIG1hcC4KKyAgRGVuc2VNYXA8UGFzcyAqLCBTbWFsbFB0clNldDxQYXNzICosIDg+ID4gSW52ZXJzZWRMYXN0VXNlcjsKKworICAvLy8gSW1tdXRhYmxlIHBhc3NlcyBhcmUgbWFuYWdlZCBieSB0b3AgbGV2ZWwgbWFuYWdlci4KKyAgU21hbGxWZWN0b3I8SW1tdXRhYmxlUGFzcyAqLCAxNj4gSW1tdXRhYmxlUGFzc2VzOworCisgIC8vLyBNYXAgZnJvbSBJRCB0byBpbW11dGFibGUgcGFzc2VzLgorICBTbWFsbERlbnNlTWFwPEFuYWx5c2lzSUQsIEltbXV0YWJsZVBhc3MgKiwgOD4gSW1tdXRhYmxlUGFzc01hcDsKKworCisgIC8vLyBBIHdyYXBwZXIgYXJvdW5kIEFuYWx5c2lzVXNhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIHVuaXF1ZWluZy4gIFRoZSB3cmFwcGVyCisgIC8vLyBpcyB1c2VkIHRvIGF2b2lkIG5lZWRpbmcgdG8gbWFrZSBBbmFseXNpc1VzYWdlIGl0c2VsZiBhIGZvbGRpbmcgc2V0IG5vZGUuCisgIHN0cnVjdCBBVUZvbGRpbmdTZXROb2RlIDogcHVibGljIEZvbGRpbmdTZXROb2RlIHsKKyAgICBBbmFseXNpc1VzYWdlIEFVOworICAgIEFVRm9sZGluZ1NldE5vZGUoY29uc3QgQW5hbHlzaXNVc2FnZSAmQVUpIDogQVUoQVUpIHt9CisgICAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7CisgICAgICBQcm9maWxlKElELCBBVSk7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQsIGNvbnN0IEFuYWx5c2lzVXNhZ2UgJkFVKSB7CisgICAgICAvLyBUT0RPOiBXZSBjb3VsZCBjb25zaWRlciBzb3J0aW5nIHRoZSBkZXBlbmRlbmN5IGFycmF5cyB3aXRoaW4gdGhlCisgICAgICAvLyBBbmFseXNpc1VzYWdlIChzaW5jZSB0aGV5IGFyZSBjb25jZXB0dWFsbHkgdW5vcmRlcmVkKS4KKyAgICAgIElELkFkZEJvb2xlYW4oQVUuZ2V0UHJlc2VydmVzQWxsKCkpOworICAgICAgYXV0byBQcm9maWxlVmVjID0gWyZdKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxBbmFseXNpc0lEPiYgVmVjKSB7CisgICAgICAgIElELkFkZEludGVnZXIoVmVjLnNpemUoKSk7CisgICAgICAgIGZvcihBbmFseXNpc0lEIEFJRCA6IFZlYykKKyAgICAgICAgICBJRC5BZGRQb2ludGVyKEFJRCk7CisgICAgICB9OworICAgICAgUHJvZmlsZVZlYyhBVS5nZXRSZXF1aXJlZFNldCgpKTsKKyAgICAgIFByb2ZpbGVWZWMoQVUuZ2V0UmVxdWlyZWRUcmFuc2l0aXZlU2V0KCkpOworICAgICAgUHJvZmlsZVZlYyhBVS5nZXRQcmVzZXJ2ZWRTZXQoKSk7CisgICAgICBQcm9maWxlVmVjKEFVLmdldFVzZWRTZXQoKSk7CisgICAgfQorICB9OworCisgIC8vIENvbnRhaW5zIGFsbCBvZiB0aGUgdW5pcXVlIGNvbWJpbmF0aW9ucyBvZiBBbmFseXNpc1VzYWdlLiAgVGhpcyBpcyBoZWxwZnVsCisgIC8vIHdoZW4gd2UgaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgcGFzcyBzaW5jZSB0aGV5J2xsIHVzdWFsbHkKKyAgLy8gaGF2ZSB0aGUgc2FtZSBhbmFseXNpcyB1c2FnZSBhbmQgY2FuIHNoYXJlIHN0b3JhZ2UuCisgIEZvbGRpbmdTZXQ8QVVGb2xkaW5nU2V0Tm9kZT4gVW5pcXVlQW5hbHlzaXNVc2FnZXM7CisKKyAgLy8gQWxsb2NhdG9yIHVzZWQgZm9yIGFsbG9jYXRpbmcgVUFGb2xkaW5nU2V0Tm9kZXMuICBUaGlzIGhhbmRsZXMgZGVsZXRpb24gb2YKKyAgLy8gYWxsIGFsbG9jYXRlZCBub2RlcyBpbiBvbmUgZmVsbCBzd29vcC4KKyAgU3BlY2lmaWNCdW1wUHRyQWxsb2NhdG9yPEFVRm9sZGluZ1NldE5vZGU+IEFVRm9sZGluZ1NldE5vZGVBbGxvY2F0b3I7CisKKyAgLy8gTWFwcyBmcm9tIGEgcGFzcyB0byBpdCdzIGFzc29jaWF0ZWQgZW50cnkgaW4gVW5pcXVlQW5hbHlzaXNVc2FnZXMuICBEb2VzCisgIC8vIG5vdCBvd24gdGhlIHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRoIGVpdGhlciBrZXkgb3IgdmFsdWUuLiAKKyAgRGVuc2VNYXA8UGFzcyAqLCBBbmFseXNpc1VzYWdlKj4gQW5Vc2FnZU1hcDsKKworICAvLy8gQ29sbGVjdGlvbiBvZiBQYXNzSW5mbyBvYmplY3RzIGZvdW5kIHZpYSBhbmFseXNpcyBJRHMgYW5kIGluIHRoaXMgdG9wCisgIC8vLyBsZXZlbCBtYW5hZ2VyLiBUaGlzIGlzIHVzZWQgdG8gbWVtb2l6ZSBxdWVyaWVzIHRvIHRoZSBwYXNzIHJlZ2lzdHJ5LgorICAvLy8gRklYTUU6IFRoaXMgaXMgYW4gZWdyZWdpb3VzIGhhY2sgYmVjYXVzZSBxdWVyeWluZyB0aGUgcGFzcyByZWdpc3RyeSBpcworICAvLy8gZWl0aGVyIHNsb3cgb3IgcmFjeS4KKyAgbXV0YWJsZSBEZW5zZU1hcDxBbmFseXNpc0lELCBjb25zdCBQYXNzSW5mbyAqPiBBbmFseXNpc1Bhc3NJbmZvczsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQTURhdGFNYW5hZ2VyCisKKy8vLyBQTURhdGFNYW5hZ2VyIHByb3ZpZGVzIHRoZSBjb21tb24gcGxhY2UgdG8gbWFuYWdlIHRoZSBhbmFseXNpcyBkYXRhCisvLy8gdXNlZCBieSBwYXNzIG1hbmFnZXJzLgorY2xhc3MgUE1EYXRhTWFuYWdlciB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFBNRGF0YU1hbmFnZXIoKSA6IFRQTShudWxscHRyKSwgRGVwdGgoMCkgeworICAgIGluaXRpYWxpemVBbmFseXNpc0luZm8oKTsKKyAgfQorCisgIHZpcnR1YWwgflBNRGF0YU1hbmFnZXIoKTsKKworICB2aXJ0dWFsIFBhc3MgKmdldEFzUGFzcygpID0gMDsKKworICAvLy8gQXVnbWVudCBBdmFpbGFibGVBbmFseXNpcyBieSBhZGRpbmcgYW5hbHlzaXMgbWFkZSBhdmFpbGFibGUgYnkgcGFzcyBQLgorICB2b2lkIHJlY29yZEF2YWlsYWJsZUFuYWx5c2lzKFBhc3MgKlApOworCisgIC8vLyB2ZXJpZnlQcmVzZXJ2ZWRBbmFseXNpcyAtLSBWZXJpZnkgYW5hbHlzaXMgcHJlc3JldmVkIGJ5IHBhc3MgUC4KKyAgdm9pZCB2ZXJpZnlQcmVzZXJ2ZWRBbmFseXNpcyhQYXNzICpQKTsKKworICAvLy8gUmVtb3ZlIEFuYWx5c2lzIHRoYXQgaXMgbm90IHByZXNlcnZlZCBieSB0aGUgcGFzcworICB2b2lkIHJlbW92ZU5vdFByZXNlcnZlZEFuYWx5c2lzKFBhc3MgKlApOworCisgIC8vLyBSZW1vdmUgZGVhZCBwYXNzZXMgdXNlZCBieSBQLgorICB2b2lkIHJlbW92ZURlYWRQYXNzZXMoUGFzcyAqUCwgU3RyaW5nUmVmIE1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gUGFzc0RlYnVnZ2luZ1N0cmluZyk7CisKKyAgLy8vIFJlbW92ZSBQLgorICB2b2lkIGZyZWVQYXNzKFBhc3MgKlAsIFN0cmluZ1JlZiBNc2csCisgICAgICAgICAgICAgICAgZW51bSBQYXNzRGVidWdnaW5nU3RyaW5nKTsKKworICAvLy8gQWRkIHBhc3MgUCBpbnRvIHRoZSBQYXNzVmVjdG9yLiBVcGRhdGUKKyAgLy8vIEF2YWlsYWJsZUFuYWx5c2lzIGFwcHJvcHJpYXRlbHkgaWYgUHJvY2Vzc0FuYWx5c2lzIGlzIHRydWUuCisgIHZvaWQgYWRkKFBhc3MgKlAsIGJvb2wgUHJvY2Vzc0FuYWx5c2lzID0gdHJ1ZSk7CisKKyAgLy8vIEFkZCBSZXF1aXJlZFBhc3MgaW50byBsaXN0IG9mIGxvd2VyIGxldmVsIHBhc3NlcyByZXF1aXJlZCBieSBwYXNzIFAuCisgIC8vLyBSZXF1aXJlZFBhc3MgaXMgcnVuIG9uIHRoZSBmbHkgYnkgUGFzcyBNYW5hZ2VyIHdoZW4gUCByZXF1ZXN0cyBpdAorICAvLy8gdGhyb3VnaCBnZXRBbmFseXNpcyBpbnRlcmZhY2UuCisgIHZpcnR1YWwgdm9pZCBhZGRMb3dlckxldmVsUmVxdWlyZWRQYXNzKFBhc3MgKlAsIFBhc3MgKlJlcXVpcmVkUGFzcyk7CisKKyAgdmlydHVhbCBQYXNzICpnZXRPblRoZUZseVBhc3MoUGFzcyAqUCwgQW5hbHlzaXNJRCBQSSwgRnVuY3Rpb24gJkYpOworCisgIC8vLyBJbml0aWFsaXplIGF2YWlsYWJsZSBhbmFseXNpcyBpbmZvcm1hdGlvbi4KKyAgdm9pZCBpbml0aWFsaXplQW5hbHlzaXNJbmZvKCkgeworICAgIEF2YWlsYWJsZUFuYWx5c2lzLmNsZWFyKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFBNVF9MYXN0OyArK2kpCisgICAgICBJbmhlcml0ZWRBbmFseXNpc1tpXSA9IG51bGxwdHI7CisgIH0KKworICAvLyBSZXR1cm4gdHJ1ZSBpZiBQIHByZXNlcnZlcyBoaWdoIGxldmVsIGFuYWx5c2lzIHVzZWQgYnkgb3RoZXIKKyAgLy8gcGFzc2VzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBtYW5hZ2VyLgorICBib29sIHByZXNlcnZlSGlnaGVyTGV2ZWxBbmFseXNpcyhQYXNzICpQKTsKKworICAvLy8gUG9wdWxhdGUgVXNlZFBhc3NlcyB3aXRoIGFuYWx5c2lzIHBhc3MgdGhhdCBhcmUgdXNlZCBvciByZXF1aXJlZCBieSBwYXNzCisgIC8vLyBQIGFuZCBhcmUgYXZhaWxhYmxlLiBQb3B1bGF0ZSBSZXFQYXNzTm90QXZhaWxhYmxlIHdpdGggYW5hbHlzaXMgcGFzcyB0aGF0CisgIC8vLyBhcmUgcmVxdWlyZWQgYnkgcGFzcyBQIGJ1dCBhcmUgbm90IGF2YWlsYWJsZS4KKyAgdm9pZCBjb2xsZWN0UmVxdWlyZWRBbmRVc2VkQW5hbHlzZXMoCisgICAgICBTbWFsbFZlY3RvckltcGw8UGFzcyAqPiAmVXNlZFBhc3NlcywKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxBbmFseXNpc0lEPiAmUmVxUGFzc05vdEF2YWlsYWJsZSwgUGFzcyAqUCk7CisKKyAgLy8vIEFsbCBSZXF1aXJlZCBhbmFseXNlcyBzaG91bGQgYmUgYXZhaWxhYmxlIHRvIHRoZSBwYXNzIGFzIGl0IHJ1bnMhICBIZXJlCisgIC8vLyB3ZSBmaWxsIGluIHRoZSBBbmFseXNpc0ltcGxzIG1lbWJlciBvZiB0aGUgcGFzcyBzbyB0aGF0IGl0IGNhbgorICAvLy8gc3VjY2Vzc2Z1bGx5IHVzZSB0aGUgZ2V0QW5hbHlzaXMoKSBtZXRob2QgdG8gcmV0cmlldmUgdGhlCisgIC8vLyBpbXBsZW1lbnRhdGlvbnMgaXQgbmVlZHMuCisgIHZvaWQgaW5pdGlhbGl6ZUFuYWx5c2lzSW1wbChQYXNzICpQKTsKKworICAvLy8gRmluZCB0aGUgcGFzcyB0aGF0IGltcGxlbWVudHMgQW5hbHlzaXMgQUlELiBJZiBkZXNpcmVkIHBhc3MgaXMgbm90IGZvdW5kCisgIC8vLyB0aGVuIHJldHVybiBOVUxMLgorICBQYXNzICpmaW5kQW5hbHlzaXNQYXNzKEFuYWx5c2lzSUQgQUlELCBib29sIERpcmVjdGlvbik7CisKKyAgLy8gQWNjZXNzIHRvcGxldmVsIG1hbmFnZXIKKyAgUE1Ub3BMZXZlbE1hbmFnZXIgKmdldFRvcExldmVsTWFuYWdlcigpIHsgcmV0dXJuIFRQTTsgfQorICB2b2lkIHNldFRvcExldmVsTWFuYWdlcihQTVRvcExldmVsTWFuYWdlciAqVCkgeyBUUE0gPSBUOyB9CisKKyAgdW5zaWduZWQgZ2V0RGVwdGgoKSBjb25zdCB7IHJldHVybiBEZXB0aDsgfQorICB2b2lkIHNldERlcHRoKHVuc2lnbmVkIG5ld0RlcHRoKSB7IERlcHRoID0gbmV3RGVwdGg7IH0KKworICAvLyBQcmludCByb3V0aW5lcyB1c2VkIGJ5IGRlYnVnLXBhc3MKKyAgdm9pZCBkdW1wTGFzdFVzZXMoUGFzcyAqUCwgdW5zaWduZWQgT2Zmc2V0KSBjb25zdDsKKyAgdm9pZCBkdW1wUGFzc0FyZ3VtZW50cygpIGNvbnN0OworICB2b2lkIGR1bXBQYXNzSW5mbyhQYXNzICpQLCBlbnVtIFBhc3NEZWJ1Z2dpbmdTdHJpbmcgUzEsCisgICAgICAgICAgICAgICAgICAgIGVudW0gUGFzc0RlYnVnZ2luZ1N0cmluZyBTMiwgU3RyaW5nUmVmIE1zZyk7CisgIHZvaWQgZHVtcFJlcXVpcmVkU2V0KGNvbnN0IFBhc3MgKlApIGNvbnN0OworICB2b2lkIGR1bXBQcmVzZXJ2ZWRTZXQoY29uc3QgUGFzcyAqUCkgY29uc3Q7CisgIHZvaWQgZHVtcFVzZWRTZXQoY29uc3QgUGFzcyAqUCkgY29uc3Q7CisKKyAgdW5zaWduZWQgZ2V0TnVtQ29udGFpbmVkUGFzc2VzKCkgY29uc3QgeworICAgIHJldHVybiAodW5zaWduZWQpUGFzc1ZlY3Rvci5zaXplKCk7CisgIH0KKworICB2aXJ0dWFsIFBhc3NNYW5hZ2VyVHlwZSBnZXRQYXNzTWFuYWdlclR5cGUoKSBjb25zdCB7CisgICAgYXNzZXJ0ICggMCAmJiAiSW52YWxpZCB1c2Ugb2YgZ2V0UGFzc01hbmFnZXJUeXBlIik7CisgICAgcmV0dXJuIFBNVF9Vbmtub3duOworICB9CisKKyAgRGVuc2VNYXA8QW5hbHlzaXNJRCwgUGFzcyo+ICpnZXRBdmFpbGFibGVBbmFseXNpcygpIHsKKyAgICByZXR1cm4gJkF2YWlsYWJsZUFuYWx5c2lzOworICB9CisKKyAgLy8gQ29sbGVjdCBBdmFpbGFibGVBbmFseXNpcyBmcm9tIGFsbCB0aGUgYWN0aXZlIFBhc3MgTWFuYWdlcnMuCisgIHZvaWQgcG9wdWxhdGVJbmhlcml0ZWRBbmFseXNpcyhQTVN0YWNrICZQTVMpIHsKKyAgICB1bnNpZ25lZCBJbmRleCA9IDA7CisgICAgZm9yIChQTVN0YWNrOjppdGVyYXRvciBJID0gUE1TLmJlZ2luKCksIEUgPSBQTVMuZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkKKyAgICAgIEluaGVyaXRlZEFuYWx5c2lzW0luZGV4KytdID0gKCpJKS0+Z2V0QXZhaWxhYmxlQW5hbHlzaXMoKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8vIFRvcCBsZXZlbCBtYW5hZ2VyLgorICBQTVRvcExldmVsTWFuYWdlciAqVFBNOworCisgIC8vIENvbGxlY3Rpb24gb2YgcGFzcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgbWFuYWdlcgorICBTbWFsbFZlY3RvcjxQYXNzICosIDE2PiBQYXNzVmVjdG9yOworCisgIC8vIENvbGxlY3Rpb24gb2YgQW5hbHlzaXMgcHJvdmlkZWQgYnkgUGFyZW50IHBhc3MgbWFuYWdlciBhbmQKKyAgLy8gdXNlZCBieSBjdXJyZW50IHBhc3MgbWFuYWdlci4gQXQgYXQgdGltZSB0aGVyZSBjYW4gbm90IGJlIG1vcmUKKyAgLy8gdGhlbiBQTVRfTGFzdCBhY3RpdmUgcGFzcyBtYW5nZXJzLgorICBEZW5zZU1hcDxBbmFseXNpc0lELCBQYXNzICo+ICpJbmhlcml0ZWRBbmFseXNpc1tQTVRfTGFzdF07CisKKyAgLy8vIGlzUGFzc0RlYnVnZ2luZ0V4ZWN1dGlvbnNPck1vcmUgLSBSZXR1cm4gdHJ1ZSBpZiAtZGVidWctcGFzcz1FeGVjdXRpb25zCisgIC8vLyBvciBoaWdoZXIgaXMgc3BlY2lmaWVkLgorICBib29sIGlzUGFzc0RlYnVnZ2luZ0V4ZWN1dGlvbnNPck1vcmUoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgdm9pZCBkdW1wQW5hbHlzaXNVc2FnZShTdHJpbmdSZWYgTXNnLCBjb25zdCBQYXNzICpQLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFuYWx5c2lzVXNhZ2U6OlZlY3RvclR5cGUgJlNldCkgY29uc3Q7CisKKyAgLy8gU2V0IG9mIGF2YWlsYWJsZSBBbmFseXNpcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHdoaWxlIHNjaGVkdWxpbmcKKyAgLy8gcGFzcy4gSWYgYSBwYXNzIHJlcXVpcmVzIGFuIGFuYWx5c2lzIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgdGhlbgorICAvLyB0aGUgcmVxdWlyZWQgYW5hbHlzaXMgcGFzcyBpcyBzY2hlZHVsZWQgdG8gcnVuIGJlZm9yZSB0aGUgcGFzcyBpdHNlbGYgaXMKKyAgLy8gc2NoZWR1bGVkIHRvIHJ1bi4KKyAgRGVuc2VNYXA8QW5hbHlzaXNJRCwgUGFzcyo+IEF2YWlsYWJsZUFuYWx5c2lzOworCisgIC8vIENvbGxlY3Rpb24gb2YgaGlnaGVyIGxldmVsIGFuYWx5c2lzIHVzZWQgYnkgdGhlIHBhc3MgbWFuYWdlZCBieQorICAvLyB0aGlzIG1hbmFnZXIuCisgIFNtYWxsVmVjdG9yPFBhc3MgKiwgMTY+IEhpZ2hlckxldmVsQW5hbHlzaXM7CisKKyAgdW5zaWduZWQgRGVwdGg7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRlBQYXNzTWFuYWdlcgorLy8KKy8vLyBGUFBhc3NNYW5hZ2VyIG1hbmFnZXMgQkJQYXNzTWFuYWdlcnMgYW5kIEZ1bmN0aW9uUGFzc2VzLgorLy8vIEl0IGJhdGNoZXMgYWxsIGZ1bmN0aW9uIHBhc3NlcyBhbmQgYmFzaWMgYmxvY2sgcGFzcyBtYW5hZ2VycyB0b2dldGhlciBhbmQKKy8vLyBzZXF1ZW5jZSB0aGVtIHRvIHByb2Nlc3Mgb25lIGZ1bmN0aW9uIGF0IGEgdGltZSBiZWZvcmUgcHJvY2Vzc2luZyBuZXh0CisvLy8gZnVuY3Rpb24uCitjbGFzcyBGUFBhc3NNYW5hZ2VyIDogcHVibGljIE1vZHVsZVBhc3MsIHB1YmxpYyBQTURhdGFNYW5hZ2VyIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIGV4cGxpY2l0IEZQUGFzc01hbmFnZXIoKQorICA6IE1vZHVsZVBhc3MoSUQpLCBQTURhdGFNYW5hZ2VyKCkgeyB9CisKKyAgLy8vIHJ1biAtIEV4ZWN1dGUgYWxsIG9mIHRoZSBwYXNzZXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uICBLZWVwIHRyYWNrIG9mCisgIC8vLyB3aGV0aGVyIGFueSBvZiB0aGUgcGFzc2VzIG1vZGlmaWVzIHRoZSBtb2R1bGUsIGFuZCBpZiBzbywgcmV0dXJuIHRydWUuCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRik7CisgIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKSBvdmVycmlkZTsKKworICAvLy8gY2xlYW51cCAtIEFmdGVyIHJ1bm5pbmcgYWxsIHBhc3NlcywgY2xlYW4gdXAgcGFzcyBtYW5hZ2VyIGNhY2hlLgorICB2b2lkIGNsZWFudXAoKTsKKworICAvLy8gZG9Jbml0aWFsaXphdGlvbiAtIE92ZXJyaWRlcyBNb2R1bGVQYXNzIGRvSW5pdGlhbGl6YXRpb24gZm9yIGdsb2JhbAorICAvLy8gaW5pdGlhbGl6YXRpb24gdGFza3MKKyAgLy8vCisgIHVzaW5nIE1vZHVsZVBhc3M6OmRvSW5pdGlhbGl6YXRpb247CisKKyAgLy8vIGRvSW5pdGlhbGl6YXRpb24gLSBSdW4gYWxsIG9mIHRoZSBpbml0aWFsaXplcnMgZm9yIHRoZSBmdW5jdGlvbiBwYXNzZXMuCisgIC8vLworICBib29sIGRvSW5pdGlhbGl6YXRpb24oTW9kdWxlICZNKSBvdmVycmlkZTsKKworICAvLy8gZG9GaW5hbGl6YXRpb24gLSBPdmVycmlkZXMgTW9kdWxlUGFzcyBkb0ZpbmFsaXphdGlvbiBmb3IgZ2xvYmFsCisgIC8vLyBmaW5hbGl6YXRpb24gdGFza3MKKyAgLy8vCisgIHVzaW5nIE1vZHVsZVBhc3M6OmRvRmluYWxpemF0aW9uOworCisgIC8vLyBkb0ZpbmFsaXphdGlvbiAtIFJ1biBhbGwgb2YgdGhlIGZpbmFsaXplcnMgZm9yIHRoZSBmdW5jdGlvbiBwYXNzZXMuCisgIC8vLworICBib29sIGRvRmluYWxpemF0aW9uKE1vZHVsZSAmTSkgb3ZlcnJpZGU7CisKKyAgUE1EYXRhTWFuYWdlciAqZ2V0QXNQTURhdGFNYW5hZ2VyKCkgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQorICBQYXNzICpnZXRBc1Bhc3MoKSBvdmVycmlkZSB7IHJldHVybiB0aGlzOyB9CisKKyAgLy8vIFBhc3MgTWFuYWdlciBpdHNlbGYgZG9lcyBub3QgaW52YWxpZGF0ZSBhbnkgYW5hbHlzaXMgaW5mby4KKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkluZm8pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBJbmZvLnNldFByZXNlcnZlc0FsbCgpOworICB9CisKKyAgLy8gUHJpbnQgcGFzc2VzIG1hbmFnZWQgYnkgdGhpcyBtYW5hZ2VyCisgIHZvaWQgZHVtcFBhc3NTdHJ1Y3R1cmUodW5zaWduZWQgT2Zmc2V0KSBvdmVycmlkZTsKKworICBTdHJpbmdSZWYgZ2V0UGFzc05hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiRnVuY3Rpb24gUGFzcyBNYW5hZ2VyIjsgfQorCisgIEZ1bmN0aW9uUGFzcyAqZ2V0Q29udGFpbmVkUGFzcyh1bnNpZ25lZCBOKSB7CisgICAgYXNzZXJ0ICggTiA8IFBhc3NWZWN0b3Iuc2l6ZSgpICYmICJQYXNzIG51bWJlciBvdXQgb2YgcmFuZ2UhIik7CisgICAgRnVuY3Rpb25QYXNzICpGUCA9IHN0YXRpY19jYXN0PEZ1bmN0aW9uUGFzcyAqPihQYXNzVmVjdG9yW05dKTsKKyAgICByZXR1cm4gRlA7CisgIH0KKworICBQYXNzTWFuYWdlclR5cGUgZ2V0UGFzc01hbmFnZXJUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBQTVRfRnVuY3Rpb25QYXNzTWFuYWdlcjsKKyAgfQorfTsKKworVGltZXIgKmdldFBhc3NUaW1lcihQYXNzICopOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTGVnYWN5UGFzc05hbWVQYXJzZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTGVnYWN5UGFzc05hbWVQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2VjMDgxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9MZWdhY3lQYXNzTmFtZVBhcnNlci5oCkBAIC0wLDAgKzEsMTM5IEBACisvLz09PS0gTGVnYWN5UGFzc05hbWVQYXJzZXIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgUGFzc05hbWVQYXJzZXIgYW5kIEZpbHRlcmVkUGFzc05hbWVQYXJzZXI8PiBjbGFzc2VzLAorLy8gd2hpY2ggYXJlIHVzZWQgdG8gYWRkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gYSB1dGlsaXR5IGZvciBhbGwgb2YgdGhlCisvLyBwYXNzZXMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBpbnRvIHRoZSBzeXN0ZW0uCisvLworLy8gVGhlIFBhc3NOYW1lUGFyc2VyIGNsYXNzIGFkZHMgQUxMIHBhc3NlcyBsaW5rZWQgaW50byB0aGUgc3lzdGVtICh0aGF0IGFyZQorLy8gY3JlYXRhYmxlKSBhcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIHRoZSB0b29sICh3aGVuIGluc3RhbnRpYXRlZCB3aXRoIHRoZQorLy8gYXBwcm9wcmlhdGUgY29tbWFuZCBsaW5lIG9wdGlvbiB0ZW1wbGF0ZSkuICBUaGUgRmlsdGVyZWRQYXNzTmFtZVBhcnNlcjw+CisvLyB0ZW1wbGF0ZSBpcyB1c2VkIGZvciB0aGUgc2FtZSBwdXJwb3NlcyBhcyBQYXNzTmFtZVBhcnNlciwgZXhjZXB0IHRoYXQgaXQgb25seQorLy8gaW5jbHVkZXMgcGFzc2VzIHRoYXQgaGF2ZSBhIFBhc3NUeXBlIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgZmlsdGVyCisvLyAod2hpY2ggaXMgdGhlIHRlbXBsYXRlIGFyZ3VtZW50KS4KKy8vCisvLyBOb3RlIHRoYXQgdGhpcyBpcyBwYXJ0IG9mIHRoZSBsZWdhY3kgcGFzcyBtYW5hZ2VyIGluZnJhc3RydWN0dXJlIGFuZCB3aWxsIGJlCisvLyAoZXZlbnR1YWxseSkgZ29pbmcgYXdheS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfTEVHQUNZUEFTU05BTUVQQVJTRVJfSAorI2RlZmluZSBMTFZNX0lSX0xFR0FDWVBBU1NOQU1FUEFSU0VSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUGFzc05hbWVQYXJzZXIgY2xhc3MgLSBNYWtlIHVzZSBvZiB0aGUgcGFzcyByZWdpc3RyYXRpb24gbWVjaGFuaXNtIHRvCisvLyBhdXRvbWF0aWNhbGx5IGFkZCBhIGNvbW1hbmQgbGluZSBhcmd1bWVudCB0byBvcHQgZm9yIGVhY2ggcGFzcy4KKy8vCitjbGFzcyBQYXNzTmFtZVBhcnNlciA6IHB1YmxpYyBQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBjbDo6cGFyc2VyPGNvbnN0IFBhc3NJbmZvKj4geworcHVibGljOgorICBQYXNzTmFtZVBhcnNlcihjbDo6T3B0aW9uICZPKTsKKyAgflBhc3NOYW1lUGFyc2VyKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBpbml0aWFsaXplKCkgeworICAgIGNsOjpwYXJzZXI8Y29uc3QgUGFzc0luZm8qPjo6aW5pdGlhbGl6ZSgpOworCisgICAgLy8gQWRkIGFsbCBvZiB0aGUgcGFzc2VzIHRvIHRoZSBtYXAgdGhhdCBnb3QgaW5pdGlhbGl6ZWQgYmVmb3JlICd0aGlzJyBkaWQuCisgICAgZW51bWVyYXRlUGFzc2VzKCk7CisgIH0KKworICAvLyBpZ25vcmFibGVQYXNzSW1wbCAtIENhbiBiZSBvdmVycmlkZW4gaW4gc3ViY2xhc3NlcyB0byByZWZpbmUgdGhlIGxpc3Qgb2YKKyAgLy8gd2hpY2ggcGFzc2VzIHdlIHdhbnQgdG8gaW5jbHVkZS4KKyAgLy8KKyAgdmlydHVhbCBib29sIGlnbm9yYWJsZVBhc3NJbXBsKGNvbnN0IFBhc3NJbmZvICpQKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIGlubGluZSBib29sIGlnbm9yYWJsZVBhc3MoY29uc3QgUGFzc0luZm8gKlApIGNvbnN0IHsKKyAgICAvLyBJZ25vcmUgbm9uLXNlbGVjdGFibGUgYW5kIG5vbi1jb25zdHJ1Y3RpYmxlIHBhc3NlcyEgIElnbm9yZQorICAgIC8vIG5vbi1vcHRpbWl6YXRpb25zLgorICAgIHJldHVybiBQLT5nZXRQYXNzQXJndW1lbnQoKS5lbXB0eSgpIHx8IFAtPmdldE5vcm1hbEN0b3IoKSA9PSBudWxscHRyIHx8CisgICAgICAgICAgIGlnbm9yYWJsZVBhc3NJbXBsKFApOworICB9CisKKyAgLy8gSW1wbGVtZW50IHRoZSBQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXIgY2FsbGJhY2tzIHVzZWQgdG8gcG9wdWxhdGUgb3VyIG1hcAorICAvLworICB2b2lkIHBhc3NSZWdpc3RlcmVkKGNvbnN0IFBhc3NJbmZvICpQKSBvdmVycmlkZSB7CisgICAgaWYgKGlnbm9yYWJsZVBhc3MoUCkpIHJldHVybjsKKyAgICBpZiAoZmluZE9wdGlvbihQLT5nZXRQYXNzQXJndW1lbnQoKS5kYXRhKCkpICE9IGdldE51bU9wdGlvbnMoKSkgeworICAgICAgZXJycygpIDw8ICJUd28gcGFzc2VzIHdpdGggdGhlIHNhbWUgYXJndW1lbnQgKC0iCisgICAgICAgICAgIDw8IFAtPmdldFBhc3NBcmd1bWVudCgpIDw8ICIpIGF0dGVtcHRlZCB0byBiZSByZWdpc3RlcmVkIVxuIjsKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUobnVsbHB0cik7CisgICAgfQorICAgIGFkZExpdGVyYWxPcHRpb24oUC0+Z2V0UGFzc0FyZ3VtZW50KCkuZGF0YSgpLCBQLCBQLT5nZXRQYXNzTmFtZSgpLmRhdGEoKSk7CisgIH0KKyAgdm9pZCBwYXNzRW51bWVyYXRlKGNvbnN0IFBhc3NJbmZvICpQKSBvdmVycmlkZSB7IHBhc3NSZWdpc3RlcmVkKFApOyB9CisKKyAgLy8gcHJpbnRPcHRpb25JbmZvIC0gUHJpbnQgb3V0IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3B0aW9uLiAgT3ZlcnJpZGUgdGhlCisgIC8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gc29ydCB0aGUgdGFibGUgYmVmb3JlIHdlIHByaW50Li4uCisgIHZvaWQgcHJpbnRPcHRpb25JbmZvKGNvbnN0IGNsOjpPcHRpb24gJk8sIHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIFBhc3NOYW1lUGFyc2VyICpQTlAgPSBjb25zdF9jYXN0PFBhc3NOYW1lUGFyc2VyKj4odGhpcyk7CisgICAgYXJyYXlfcG9kX3NvcnQoUE5QLT5WYWx1ZXMuYmVnaW4oKSwgUE5QLT5WYWx1ZXMuZW5kKCksIFZhbENvbXBhcmUpOworICAgIGNsOjpwYXJzZXI8Y29uc3QgUGFzc0luZm8qPjo6cHJpbnRPcHRpb25JbmZvKE8sIEdsb2JhbFdpZHRoKTsKKyAgfQorCitwcml2YXRlOgorICAvLyBWYWxDb21wYXJlIC0gUHJvdmlkZSBhIHNvcnRpbmcgY29tcGFyYXRvciBmb3IgVmFsdWVzIGVsZW1lbnRzLi4uCisgIHN0YXRpYyBpbnQgVmFsQ29tcGFyZShjb25zdCBQYXNzTmFtZVBhcnNlcjo6T3B0aW9uSW5mbyAqVlQxLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFzc05hbWVQYXJzZXI6Ok9wdGlvbkluZm8gKlZUMikgeworICAgIHJldHVybiBWVDEtPk5hbWUuY29tcGFyZShWVDItPk5hbWUpOworICB9Cit9OworCisvLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBGaWx0ZXJlZFBhc3NOYW1lUGFyc2VyIGNsYXNzIC0gTWFrZSB1c2Ugb2YgdGhlIHBhc3MgcmVnaXN0cmF0aW9uCisvLy8gbWVjaGFuaXNtIHRvIGF1dG9tYXRpY2FsbHkgYWRkIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRvIG9wdCBmb3IKKy8vLyBlYWNoIHBhc3MgdGhhdCBzYXRpc2ZpZXMgYSBmaWx0ZXIgY3JpdGVyaWEuICBGaWx0ZXIgc2hvdWxkIHJldHVybgorLy8vIHRydWUgZm9yIHBhc3NlcyB0byBiZSByZWdpc3RlcmVkIGFzIGNvbW1hbmQtbGluZSBvcHRpb25zLgorLy8vCit0ZW1wbGF0ZTx0eXBlbmFtZSBGaWx0ZXI+CitjbGFzcyBGaWx0ZXJlZFBhc3NOYW1lUGFyc2VyIDogcHVibGljIFBhc3NOYW1lUGFyc2VyIHsKK3ByaXZhdGU6CisgIEZpbHRlciBmaWx0ZXI7CisKK3B1YmxpYzoKKyAgYm9vbCBpZ25vcmFibGVQYXNzSW1wbChjb25zdCBQYXNzSW5mbyAqUCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiAhZmlsdGVyKCpQKTsKKyAgfQorfTsKKworLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gUGFzc0FyZ0ZpbHRlciAtIEEgZmlsdGVyIGZvciB1c2Ugd2l0aCBQYXNzTmFtZUZpbHRlclBhcnNlciB0aGF0IG9ubHkKKy8vLyBhY2NlcHRzIGEgUGFzcyB3aG9zZSBBcmcgbWF0Y2hlcyBjZXJ0YWluIHN0cmluZ3MuCisvLy8KKy8vLyBVc2UgbGlrZSB0aGlzOgorLy8vCisvLy8gZXh0ZXJuIGNvbnN0IGNoYXIgQWxsb3dlZFBhc3NBcmdzW10gPSAiLWFuZGVyc19hYSAtZHNlIjsKKy8vLworLy8vIHN0YXRpYyBjbDo6bGlzdDwKKy8vLyAgIGNvbnN0IFBhc3NJbmZvKiwKKy8vLyAgIGJvb2wsCisvLy8gICBGaWx0ZXJlZFBhc3NOYW1lUGFyc2VyPFBhc3NBcmdGaWx0ZXI8QWxsb3dlZFBhc3NBcmdzPiA+ID4KKy8vLyBQYXNzTGlzdChjbDo6ZGVzYygiUGFzc2VzIGF2YWlsYWJsZToiKSk7CisvLy8KKy8vLyBPbmx5IHRoZSAtYW5kZXJzX2FhIGFuZCAtZHNlIG9wdGlvbnMgd2lsbCBiZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIuCisvLy8KK3RlbXBsYXRlPGNvbnN0IGNoYXIgKkFyZ3M+CitjbGFzcyBQYXNzQXJnRmlsdGVyIHsKK3B1YmxpYzoKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFBhc3NJbmZvICZQKSBjb25zdCB7CisgICAgcmV0dXJuIFN0cmluZ1JlZihBcmdzKS5jb250YWlucyhQLmdldFBhc3NBcmd1bWVudCgpKTsKKyAgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL01EQnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9NREJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTIxOGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9NREJ1aWxkZXIuaApAQCAtMCwwICsxLDIwMyBAQAorLy89PT0tLS0tIGxsdm0vTURCdWlsZGVyLmggLSBCdWlsZGVyIGZvciBMTFZNIG1ldGFkYXRhIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgTURCdWlsZGVyIGNsYXNzLCB3aGljaCBpcyB1c2VkIGFzIGEgY29udmVuaWVudCB3YXkgdG8KKy8vIGNyZWF0ZSBMTFZNIG1ldGFkYXRhIHdpdGggYSBjb25zaXN0ZW50IGFuZCBzaW1wbGlmaWVkIGludGVyZmFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfTURCVUlMREVSX0gKKyNkZWZpbmUgTExWTV9JUl9NREJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQVBJbnQ7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIENvbnN0YW50OworY2xhc3MgQ29uc3RhbnRBc01ldGFkYXRhOworY2xhc3MgTUROb2RlOworY2xhc3MgTURTdHJpbmc7CitjbGFzcyBNZXRhZGF0YTsKKworY2xhc3MgTURCdWlsZGVyIHsKKyAgTExWTUNvbnRleHQgJkNvbnRleHQ7CisKK3B1YmxpYzoKKyAgTURCdWlsZGVyKExMVk1Db250ZXh0ICZjb250ZXh0KSA6IENvbnRleHQoY29udGV4dCkge30KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZ2l2ZW4gc3RyaW5nIGFzIG1ldGFkYXRhLgorICBNRFN0cmluZyAqY3JlYXRlU3RyaW5nKFN0cmluZ1JlZiBTdHIpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBnaXZlbiBjb25zdGFudCBhcyBtZXRhZGF0YS4KKyAgQ29uc3RhbnRBc01ldGFkYXRhICpjcmVhdGVDb25zdGFudChDb25zdGFudCAqQyk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBGUE1hdGggbWV0YWRhdGEuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIFJldHVybiBtZXRhZGF0YSB3aXRoIHRoZSBnaXZlbiBzZXR0aW5ncy4gIFRoZSBzcGVjaWFsIHZhbHVlIDAuMAorICAvLy8gZm9yIHRoZSBBY2N1cmFjeSBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBkZWZhdWx0IChtYXhpbWFsIHByZWNpc2lvbikKKyAgLy8vIHNldHRpbmcuCisgIE1ETm9kZSAqY3JlYXRlRlBNYXRoKGZsb2F0IEFjY3VyYWN5KTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFByb2YgbWV0YWRhdGEuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIFJldHVybiBtZXRhZGF0YSBjb250YWluaW5nIHR3byBicmFuY2ggd2VpZ2h0cy4KKyAgTUROb2RlICpjcmVhdGVCcmFuY2hXZWlnaHRzKHVpbnQzMl90IFRydWVXZWlnaHQsIHVpbnQzMl90IEZhbHNlV2VpZ2h0KTsKKworICAvLy8gXGJyaWVmIFJldHVybiBtZXRhZGF0YSBjb250YWluaW5nIGEgbnVtYmVyIG9mIGJyYW5jaCB3ZWlnaHRzLgorICBNRE5vZGUgKmNyZWF0ZUJyYW5jaFdlaWdodHMoQXJyYXlSZWY8dWludDMyX3Q+IFdlaWdodHMpOworCisgIC8vLyBSZXR1cm4gbWV0YWRhdGEgc3BlY2lmeWluZyB0aGF0IGEgYnJhbmNoIG9yIHN3aXRjaCBpcyB1bnByZWRpY3RhYmxlLgorICBNRE5vZGUgKmNyZWF0ZVVucHJlZGljdGFibGUoKTsKKworICAvLy8gUmV0dXJuIG1ldGFkYXRhIGNvbnRhaW5pbmcgdGhlIGVudHJ5IFxwIENvdW50IGZvciBhIGZ1bmN0aW9uLCBhIGJvb2xlYW4KKyAgLy8vIFxTeW50aGV0aWMgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb3VudHMgd2VyZSBzeW50aGV0aXplZCwgYW5kIHRoZQorICAvLy8gR1VJRHMgc3RvcmVkIGluIFxwIEltcG9ydHMgdGhhdCBuZWVkIHRvIGJlIGltcG9ydGVkIGZvciBzYW1wbGUgUEdPLCB0bworICAvLy8gZW5hYmxlIHRoZSBzYW1lIGlubGluZXMgYXMgdGhlIHByb2ZpbGVkIG9wdGltaXplZCBiaW5hcnkKKyAgTUROb2RlICpjcmVhdGVGdW5jdGlvbkVudHJ5Q291bnQodWludDY0X3QgQ291bnQsIGJvb2wgU3ludGhldGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZW5zZVNldDxHbG9iYWxWYWx1ZTo6R1VJRD4gKkltcG9ydHMpOworCisgIC8vLyBSZXR1cm4gbWV0YWRhdGEgY29udGFpbmluZyB0aGUgc2VjdGlvbiBwcmVmaXggZm9yIGEgZnVuY3Rpb24uCisgIE1ETm9kZSAqY3JlYXRlRnVuY3Rpb25TZWN0aW9uUHJlZml4KFN0cmluZ1JlZiBQcmVmaXgpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUmFuZ2UgbWV0YWRhdGEuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIFJldHVybiBtZXRhZGF0YSBkZXNjcmliaW5nIHRoZSByYW5nZSBbTG8sIEhpKS4KKyAgTUROb2RlICpjcmVhdGVSYW5nZShjb25zdCBBUEludCAmTG8sIGNvbnN0IEFQSW50ICZIaSk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gbWV0YWRhdGEgZGVzY3JpYmluZyB0aGUgcmFuZ2UgW0xvLCBIaSkuCisgIE1ETm9kZSAqY3JlYXRlUmFuZ2UoQ29uc3RhbnQgKkxvLCBDb25zdGFudCAqSGkpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQ2FsbGVlcyBtZXRhZGF0YS4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgUmV0dXJuIG1ldGFkYXRhIGluZGljYXRpbmcgdGhlIHBvc3NpYmxlIGNhbGxlZXMgb2YgaW5kaXJlY3QKKyAgLy8vIGNhbGxzLgorICBNRE5vZGUgKmNyZWF0ZUNhbGxlZXMoQXJyYXlSZWY8RnVuY3Rpb24gKj4gQ2FsbGVlcyk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBQSBtZXRhZGF0YS4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitwcm90ZWN0ZWQ6CisgIC8vLyBcYnJpZWYgUmV0dXJuIG1ldGFkYXRhIGFwcHJvcHJpYXRlIGZvciBhIEFBIHJvb3Qgbm9kZSAoc2NvcGUgb3IgVEJBQSkuCisgIC8vLyBFYWNoIHJldHVybmVkIG5vZGUgaXMgZGlzdGluY3QgZnJvbSBhbGwgb3RoZXIgbWV0YWRhdGEgYW5kIHdpbGwgbmV2ZXIKKyAgLy8vIGJlIGlkZW50aWZpZWQgKHVuaXF1ZWQpIHdpdGggYW55dGhpbmcgZWxzZS4KKyAgTUROb2RlICpjcmVhdGVBbm9ueW1vdXNBQVJvb3QoU3RyaW5nUmVmIE5hbWUgPSBTdHJpbmdSZWYoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpFeHRyYSA9IG51bGxwdHIpOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgUmV0dXJuIG1ldGFkYXRhIGFwcHJvcHJpYXRlIGZvciBhIFRCQUEgcm9vdCBub2RlLiBFYWNoIHJldHVybmVkCisgIC8vLyBub2RlIGlzIGRpc3RpbmN0IGZyb20gYWxsIG90aGVyIG1ldGFkYXRhIGFuZCB3aWxsIG5ldmVyIGJlIGlkZW50aWZpZWQKKyAgLy8vICh1bmlxdWVkKSB3aXRoIGFueXRoaW5nIGVsc2UuCisgIE1ETm9kZSAqY3JlYXRlQW5vbnltb3VzVEJBQVJvb3QoKSB7CisgICAgcmV0dXJuIGNyZWF0ZUFub255bW91c0FBUm9vdCgpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gbWV0YWRhdGEgYXBwcm9wcmlhdGUgZm9yIGFuIGFsaWFzIHNjb3BlIGRvbWFpbiBub2RlLgorICAvLy8gRWFjaCByZXR1cm5lZCBub2RlIGlzIGRpc3RpbmN0IGZyb20gYWxsIG90aGVyIG1ldGFkYXRhIGFuZCB3aWxsIG5ldmVyCisgIC8vLyBiZSBpZGVudGlmaWVkICh1bmlxdWVkKSB3aXRoIGFueXRoaW5nIGVsc2UuCisgIE1ETm9kZSAqY3JlYXRlQW5vbnltb3VzQWxpYXNTY29wZURvbWFpbihTdHJpbmdSZWYgTmFtZSA9IFN0cmluZ1JlZigpKSB7CisgICAgcmV0dXJuIGNyZWF0ZUFub255bW91c0FBUm9vdChOYW1lKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIG1ldGFkYXRhIGFwcHJvcHJpYXRlIGZvciBhbiBhbGlhcyBzY29wZSByb290IG5vZGUuCisgIC8vLyBFYWNoIHJldHVybmVkIG5vZGUgaXMgZGlzdGluY3QgZnJvbSBhbGwgb3RoZXIgbWV0YWRhdGEgYW5kIHdpbGwgbmV2ZXIKKyAgLy8vIGJlIGlkZW50aWZpZWQgKHVuaXF1ZWQpIHdpdGggYW55dGhpbmcgZWxzZS4KKyAgTUROb2RlICpjcmVhdGVBbm9ueW1vdXNBbGlhc1Njb3BlKE1ETm9kZSAqRG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUgPSBTdHJpbmdSZWYoKSkgeworICAgIHJldHVybiBjcmVhdGVBbm9ueW1vdXNBQVJvb3QoTmFtZSwgRG9tYWluKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIG1ldGFkYXRhIGFwcHJvcHJpYXRlIGZvciBhIFRCQUEgcm9vdCBub2RlIHdpdGggdGhlIGdpdmVuCisgIC8vLyBuYW1lLiAgVGhpcyBtYXkgYmUgaWRlbnRpZmllZCAodW5pcXVlZCkgd2l0aCBvdGhlciByb290cyB3aXRoIHRoZSBzYW1lCisgIC8vLyBuYW1lLgorICBNRE5vZGUgKmNyZWF0ZVRCQUFSb290KFN0cmluZ1JlZiBOYW1lKTsKKworICAvLy8gXGJyaWVmIFJldHVybiBtZXRhZGF0YSBhcHByb3ByaWF0ZSBmb3IgYW4gYWxpYXMgc2NvcGUgZG9tYWluIG5vZGUgd2l0aAorICAvLy8gdGhlIGdpdmVuIG5hbWUuIFRoaXMgbWF5IGJlIGlkZW50aWZpZWQgKHVuaXF1ZWQpIHdpdGggb3RoZXIgcm9vdHMgd2l0aAorICAvLy8gdGhlIHNhbWUgbmFtZS4KKyAgTUROb2RlICpjcmVhdGVBbGlhc1Njb3BlRG9tYWluKFN0cmluZ1JlZiBOYW1lKTsKKworICAvLy8gXGJyaWVmIFJldHVybiBtZXRhZGF0YSBhcHByb3ByaWF0ZSBmb3IgYW4gYWxpYXMgc2NvcGUgbm9kZSB3aXRoCisgIC8vLyB0aGUgZ2l2ZW4gbmFtZS4gVGhpcyBtYXkgYmUgaWRlbnRpZmllZCAodW5pcXVlZCkgd2l0aCBvdGhlciBzY29wZXMgd2l0aAorICAvLy8gdGhlIHNhbWUgbmFtZSBhbmQgZG9tYWluLgorICBNRE5vZGUgKmNyZWF0ZUFsaWFzU2NvcGUoU3RyaW5nUmVmIE5hbWUsIE1ETm9kZSAqRG9tYWluKTsKKworICAvLy8gXGJyaWVmIFJldHVybiBtZXRhZGF0YSBmb3IgYSBub24tcm9vdCBUQkFBIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwKKyAgLy8vIHBhcmVudCBpbiB0aGUgVEJBQSB0cmVlLCBhbmQgdmFsdWUgZm9yICdwb2ludHNUb0NvbnN0YW50TWVtb3J5Jy4KKyAgTUROb2RlICpjcmVhdGVUQkFBTm9kZShTdHJpbmdSZWYgTmFtZSwgTUROb2RlICpQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0NvbnN0YW50ID0gZmFsc2UpOworCisgIHN0cnVjdCBUQkFBU3RydWN0RmllbGQgeworICAgIHVpbnQ2NF90IE9mZnNldDsKKyAgICB1aW50NjRfdCBTaXplOworICAgIE1ETm9kZSAqVHlwZTsKKyAgICBUQkFBU3RydWN0RmllbGQodWludDY0X3QgT2Zmc2V0LCB1aW50NjRfdCBTaXplLCBNRE5vZGUgKlR5cGUpIDoKKyAgICAgIE9mZnNldChPZmZzZXQpLCBTaXplKFNpemUpLCBUeXBlKFR5cGUpIHt9CisgIH07CisKKyAgLy8vIFxicmllZiBSZXR1cm4gbWV0YWRhdGEgZm9yIGEgdGJhYS5zdHJ1Y3Qgbm9kZSB3aXRoIHRoZSBnaXZlbgorICAvLy8gc3RydWN0IGZpZWxkIGRlc2NyaXB0aW9ucy4KKyAgTUROb2RlICpjcmVhdGVUQkFBU3RydWN0Tm9kZShBcnJheVJlZjxUQkFBU3RydWN0RmllbGQ+IEZpZWxkcyk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gbWV0YWRhdGEgZm9yIGEgVEJBQSBzdHJ1Y3Qgbm9kZSBpbiB0aGUgdHlwZSBEQUcKKyAgLy8vIHdpdGggdGhlIGdpdmVuIG5hbWUsIGEgbGlzdCBvZiBwYWlycyAob2Zmc2V0LCBmaWVsZCB0eXBlIGluIHRoZSB0eXBlIERBRykuCisgIE1ETm9kZSAqCisgIGNyZWF0ZVRCQUFTdHJ1Y3RUeXBlTm9kZShTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHN0ZDo6cGFpcjxNRE5vZGUgKiwgdWludDY0X3Q+PiBGaWVsZHMpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIG1ldGFkYXRhIGZvciBhIFRCQUEgc2NhbGFyIHR5cGUgbm9kZSB3aXRoIHRoZQorICAvLy8gZ2l2ZW4gbmFtZSwgYW4gb2Zmc2V0IGFuZCBhIHBhcmVudCBpbiB0aGUgVEJBQSB0eXBlIERBRy4KKyAgTUROb2RlICpjcmVhdGVUQkFBU2NhbGFyVHlwZU5vZGUoU3RyaW5nUmVmIE5hbWUsIE1ETm9kZSAqUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXQgPSAwKTsKKworICAvLy8gXGJyaWVmIFJldHVybiBtZXRhZGF0YSBmb3IgYSBUQkFBIHRhZyBub2RlIHdpdGggdGhlIGdpdmVuCisgIC8vLyBiYXNlIHR5cGUsIGFjY2VzcyB0eXBlIGFuZCBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGJhc2UgdHlwZS4KKyAgTUROb2RlICpjcmVhdGVUQkFBU3RydWN0VGFnTm9kZShNRE5vZGUgKkJhc2VUeXBlLCBNRE5vZGUgKkFjY2Vzc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0LCBib29sIElzQ29uc3RhbnQgPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gbWV0YWRhdGEgZm9yIGEgVEJBQSB0eXBlIG5vZGUgaW4gdGhlIFRCQUEgdHlwZSBEQUcgd2l0aCB0aGUKKyAgLy8vIGdpdmVuIHBhcmVudCB0eXBlLCBzaXplIGluIGJ5dGVzLCB0eXBlIGlkZW50aWZpZXIgYW5kIGEgbGlzdCBvZiBmaWVsZHMuCisgIE1ETm9kZSAqY3JlYXRlVEJBQVR5cGVOb2RlKE1ETm9kZSAqUGFyZW50LCB1aW50NjRfdCBTaXplLCBNZXRhZGF0YSAqSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFRCQUFTdHJ1Y3RGaWVsZD4gRmllbGRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFRCQUFTdHJ1Y3RGaWVsZD4oKSk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gbWV0YWRhdGEgZm9yIGEgVEJBQSBhY2Nlc3MgdGFnIHdpdGggdGhlIGdpdmVuIGJhc2UgdHlwZSwKKyAgLy8vIGZpbmFsIGFjY2VzcyB0eXBlLCBvZmZzZXQgb2YgdGhlIGFjY2VzcyByZWxhdGl2ZSB0byB0aGUgYmFzZSB0eXBlLCBzaXplIG9mCisgIC8vLyB0aGUgYWNjZXNzIGFuZCBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgYWNjZXNzZWQgb2JqZWN0IGNhbiBiZQorICAvLy8gY29uc2lkZXJlZCBpbW11dGFibGUgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUgVEJBQSBhbmFseXNpcy4KKyAgTUROb2RlICpjcmVhdGVUQkFBQWNjZXNzVGFnKE1ETm9kZSAqQmFzZVR5cGUsIE1ETm9kZSAqQWNjZXNzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldCwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbW11dGFibGUgPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gbXV0YWJsZSB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBtdXRhYmxlIG9yIGltbXV0YWJsZSBUQkFBCisgIC8vLyBhY2Nlc3MgdGFnLgorICBNRE5vZGUgKmNyZWF0ZU11dGFibGVUQkFBQWNjZXNzVGFnKE1ETm9kZSAqVGFnKTsKKworICAvLy8gXGJyaWVmIFJldHVybiBtZXRhZGF0YSBjb250YWluaW5nIGFuIGlycmVkdWNpYmxlIGxvb3AgaGVhZGVyIHdlaWdodC4KKyAgTUROb2RlICpjcmVhdGVJcnJMb29wSGVhZGVyV2VpZ2h0KHVpbnQ2NF90IFdlaWdodCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTWFuZ2xlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9NYW5nbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI2MWMwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTWFuZ2xlci5oCkBAIC0wLDAgKzEsNTggQEAKKy8vPT09LS0gbGx2bS9JUi9NYW5nbGVyLmggLSBTZWxmLWNvbnRhaW5lZCBuYW1lIG1hbmdsZXIgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVW5pZmllZCBuYW1lIG1hbmdsZXIgZm9yIHZhcmlvdXMgYmFja2VuZHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX01BTkdMRVJfSAorI2RlZmluZSBMTFZNX0lSX01BTkdMRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbFZhbHVlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRGF0YUxheW91dDsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBTbWFsbFZlY3RvckltcGw7CitjbGFzcyBUcmlwbGU7CitjbGFzcyBUd2luZTsKK2NsYXNzIHJhd19vc3RyZWFtOworCitjbGFzcyBNYW5nbGVyIHsKKyAgLy8vIFdlIG5lZWQgdG8gZ2l2ZSBnbG9iYWwgdmFsdWVzIHRoZSBzYW1lIG5hbWUgZXZlcnkgdGltZSB0aGV5IGFyZSBtYW5nbGVkLgorICAvLy8gVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgbnVtYmVyIHdlIGdpdmUgdG8gYW5vbnltb3VzIG9uZXMuCisgIG11dGFibGUgRGVuc2VNYXA8Y29uc3QgR2xvYmFsVmFsdWUqLCB1bnNpZ25lZD4gQW5vbkdsb2JhbElEczsKKworcHVibGljOgorICAvLy8gUHJpbnQgdGhlIGFwcHJvcHJpYXRlIHByZWZpeCBhbmQgdGhlIHNwZWNpZmllZCBnbG9iYWwgdmFyaWFibGUncyBuYW1lLgorICAvLy8gSWYgdGhlIGdsb2JhbCB2YXJpYWJsZSBkb2Vzbid0IGhhdmUgYSBuYW1lLCB0aGlzIGZpbGxzIGluIGEgdW5pcXVlIG5hbWUKKyAgLy8vIGZvciB0aGUgZ2xvYmFsLgorICB2b2lkIGdldE5hbWVXaXRoUHJlZml4KHJhd19vc3RyZWFtICZPUywgY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ2Fubm90VXNlUHJpdmF0ZUxhYmVsKSBjb25zdDsKKyAgdm9pZCBnZXROYW1lV2l0aFByZWZpeChTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk91dE5hbWUsIGNvbnN0IEdsb2JhbFZhbHVlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENhbm5vdFVzZVByaXZhdGVMYWJlbCkgY29uc3Q7CisKKyAgLy8vIFByaW50IHRoZSBhcHByb3ByaWF0ZSBwcmVmaXggYW5kIHRoZSBzcGVjaWZpZWQgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlCisgIC8vLyBuYW1lLiBHVk5hbWUgbXVzdCBub3QgYmUgZW1wdHkuCisgIHN0YXRpYyB2b2lkIGdldE5hbWVXaXRoUHJlZml4KHJhd19vc3RyZWFtICZPUywgY29uc3QgVHdpbmUgJkdWTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpOworICBzdGF0aWMgdm9pZCBnZXROYW1lV2l0aFByZWZpeChTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk91dE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZHVk5hbWUsIGNvbnN0IERhdGFMYXlvdXQgJkRMKTsKK307CisKK3ZvaWQgZW1pdExpbmtlckZsYWdzRm9yR2xvYmFsQ09GRihyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEdsb2JhbFZhbHVlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmlwbGUgJlRULCBNYW5nbGVyICZNYW5nbGVyKTsKKwordm9pZCBlbWl0TGlua2VyRmxhZ3NGb3JVc2VkQ09GRihyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEdsb2JhbFZhbHVlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJpcGxlICZULCBNYW5nbGVyICZNKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL01ldGFkYXRhLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTWV0YWRhdGEuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzY2RjYWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL01ldGFkYXRhLmRlZgpAQCAtMCwwICsxLDEyNSBAQAorLy89PT0tIGxsdm0vSVIvTWV0YWRhdGEuZGVmIC0gTWV0YWRhdGEgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBNYWNyb3MgZm9yIHJ1bm5pbmcgdGhyb3VnaCBhbGwgdHlwZXMgb2YgbWV0YWRhdGEuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmICEoZGVmaW5lZCBIQU5ETEVfTUVUQURBVEEgfHwgZGVmaW5lZCBIQU5ETEVfTUVUQURBVEFfTEVBRiB8fCAgICAgICAgICAgICAgIFwKKyAgICAgIGRlZmluZWQgSEFORExFX01FVEFEQVRBX0JSQU5DSCB8fCBkZWZpbmVkIEhBTkRMRV9NRE5PREVfTEVBRiB8fCAgICAgICAgICBcCisgICAgICBkZWZpbmVkIEhBTkRMRV9NRE5PREVfTEVBRl9VTklRVUFCTEUgfHwgZGVmaW5lZCBIQU5ETEVfTUROT0RFX0JSQU5DSCB8fCAgXAorICAgICAgZGVmaW5lZCBIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFIHx8ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGRlZmluZWQgSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBkZWZpbmVkIEhBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfQlJBTkNIKQorI2Vycm9yICJNaXNzaW5nIG1hY3JvIGRlZmluaXRpb24gb2YgSEFORExFX01FVEFEQVRBKiIKKyNlbmRpZgorCisvLyBIYW5kbGVyIGZvciBhbGwgdHlwZXMgb2YgbWV0YWRhdGEuCisjaWZuZGVmIEhBTkRMRV9NRVRBREFUQQorI2RlZmluZSBIQU5ETEVfTUVUQURBVEEoQ0xBU1MpCisjZW5kaWYKKworLy8gSGFuZGxlciBmb3IgbGVhZiBub2RlcyBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LgorI2lmbmRlZiBIQU5ETEVfTUVUQURBVEFfTEVBRgorI2RlZmluZSBIQU5ETEVfTUVUQURBVEFfTEVBRihDTEFTUykgSEFORExFX01FVEFEQVRBKENMQVNTKQorI2VuZGlmCisKKy8vIEhhbmRsZXIgZm9yIG5vbi1sZWFmIG5vZGVzIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuCisjaWZuZGVmIEhBTkRMRV9NRVRBREFUQV9CUkFOQ0gKKyNkZWZpbmUgSEFORExFX01FVEFEQVRBX0JSQU5DSChDTEFTUykgSEFORExFX01FVEFEQVRBKENMQVNTKQorI2VuZGlmCisKKy8vIEhhbmRsZXIgZm9yIHNwZWNpYWxpemVkIGFuZCB1bmlxdWFibGUgbGVhZiBub2RlcyB1bmRlciBNRE5vZGUuICBEZWZlcnMgdG8KKy8vIEhBTkRMRV9NRE5PREVfTEVBRl9VTklRVUFCTEUgaWYgaXQncyBkZWZpbmVkLCBvdGhlcndpc2UgdG8KKy8vIEhBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRi4KKyNpZm5kZWYgSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGX1VOSVFVQUJMRQorI2lmZGVmIEhBTkRMRV9NRE5PREVfTEVBRl9VTklRVUFCTEUKKyNkZWZpbmUgSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGX1VOSVFVQUJMRShDTEFTUykgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEhBTkRMRV9NRE5PREVfTEVBRl9VTklRVUFCTEUoQ0xBU1MpCisjZWxzZQorI2RlZmluZSBIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKENMQVNTKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGKENMQVNTKQorI2VuZGlmCisjZW5kaWYKKworLy8gSGFuZGxlciBmb3IgbGVhZiBub2RlcyB1bmRlciBNRE5vZGUuCisjaWZuZGVmIEhBTkRMRV9NRE5PREVfTEVBRl9VTklRVUFCTEUKKyNkZWZpbmUgSEFORExFX01ETk9ERV9MRUFGX1VOSVFVQUJMRShDTEFTUykgSEFORExFX01ETk9ERV9MRUFGKENMQVNTKQorI2VuZGlmCisKKy8vIEhhbmRsZXIgZm9yIGxlYWYgbm9kZXMgdW5kZXIgTUROb2RlLgorI2lmbmRlZiBIQU5ETEVfTUROT0RFX0xFQUYKKyNkZWZpbmUgSEFORExFX01ETk9ERV9MRUFGKENMQVNTKSBIQU5ETEVfTUVUQURBVEFfTEVBRihDTEFTUykKKyNlbmRpZgorCisvLyBIYW5kbGVyIGZvciBub24tbGVhZiBub2RlcyB1bmRlciBNRE5vZGUuCisjaWZuZGVmIEhBTkRMRV9NRE5PREVfQlJBTkNICisjZGVmaW5lIEhBTkRMRV9NRE5PREVfQlJBTkNIKENMQVNTKSBIQU5ETEVfTUVUQURBVEFfQlJBTkNIKENMQVNTKQorI2VuZGlmCisKKy8vIEhhbmRsZXIgZm9yIHNwZWNpYWxpemVkIGxlYWYgbm9kZXMgdW5kZXIgTUROb2RlLgorI2lmbmRlZiBIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUYKKyNkZWZpbmUgSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGKENMQVNTKSBIQU5ETEVfTUROT0RFX0xFQUYoQ0xBU1MpCisjZW5kaWYKKworLy8gSGFuZGxlciBmb3Igc3BlY2lhbGl6ZWQgbm9uLWxlYWYgbm9kZXMgdW5kZXIgTUROb2RlLgorI2lmbmRlZiBIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0JSQU5DSAorI2RlZmluZSBIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0JSQU5DSChDTEFTUykgSEFORExFX01ETk9ERV9CUkFOQ0goQ0xBU1MpCisjZW5kaWYKKworSEFORExFX01FVEFEQVRBX0xFQUYoTURTdHJpbmcpCitIQU5ETEVfTUVUQURBVEFfQlJBTkNIKFZhbHVlQXNNZXRhZGF0YSkKK0hBTkRMRV9NRVRBREFUQV9MRUFGKENvbnN0YW50QXNNZXRhZGF0YSkKK0hBTkRMRV9NRVRBREFUQV9MRUFGKExvY2FsQXNNZXRhZGF0YSkKK0hBTkRMRV9NRVRBREFUQV9MRUFGKERpc3RpbmN0TURPcGVyYW5kUGxhY2Vob2xkZXIpCitIQU5ETEVfTUROT0RFX0JSQU5DSChNRE5vZGUpCitIQU5ETEVfTUROT0RFX0xFQUZfVU5JUVVBQkxFKE1EVHVwbGUpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJTG9jYXRpb24pCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJRXhwcmVzc2lvbikKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRl9VTklRVUFCTEUoRElHbG9iYWxWYXJpYWJsZUV4cHJlc3Npb24pCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0JSQU5DSChESU5vZGUpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKEdlbmVyaWNESU5vZGUpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJU3VicmFuZ2UpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJRW51bWVyYXRvcikKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfQlJBTkNIKERJU2NvcGUpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0JSQU5DSChESVR5cGUpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJQmFzaWNUeXBlKQorSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGX1VOSVFVQUJMRShESURlcml2ZWRUeXBlKQorSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGX1VOSVFVQUJMRShESUNvbXBvc2l0ZVR5cGUpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJU3Vicm91dGluZVR5cGUpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJRmlsZSkKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRihESUNvbXBpbGVVbml0KQorSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9CUkFOQ0goRElMb2NhbFNjb3BlKQorSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGX1VOSVFVQUJMRShESVN1YnByb2dyYW0pCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0JSQU5DSChESUxleGljYWxCbG9ja0Jhc2UpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJTGV4aWNhbEJsb2NrKQorSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGX1VOSVFVQUJMRShESUxleGljYWxCbG9ja0ZpbGUpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJTmFtZXNwYWNlKQorSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGX1VOSVFVQUJMRShESU1vZHVsZSkKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfQlJBTkNIKERJVGVtcGxhdGVQYXJhbWV0ZXIpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJVGVtcGxhdGVUeXBlUGFyYW1ldGVyKQorSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGX1VOSVFVQUJMRShESVRlbXBsYXRlVmFsdWVQYXJhbWV0ZXIpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0JSQU5DSChESVZhcmlhYmxlKQorSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGX1VOSVFVQUJMRShESUdsb2JhbFZhcmlhYmxlKQorSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGX1VOSVFVQUJMRShESUxvY2FsVmFyaWFibGUpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJT2JqQ1Byb3BlcnR5KQorSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGX1VOSVFVQUJMRShESUltcG9ydGVkRW50aXR5KQorSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9CUkFOQ0goRElNYWNyb05vZGUpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJTWFjcm8pCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJTWFjcm9GaWxlKQorCisjdW5kZWYgSEFORExFX01FVEFEQVRBCisjdW5kZWYgSEFORExFX01FVEFEQVRBX0xFQUYKKyN1bmRlZiBIQU5ETEVfTUVUQURBVEFfQlJBTkNICisjdW5kZWYgSEFORExFX01ETk9ERV9MRUFGCisjdW5kZWYgSEFORExFX01ETk9ERV9MRUFGX1VOSVFVQUJMRQorI3VuZGVmIEhBTkRMRV9NRE5PREVfQlJBTkNICisjdW5kZWYgSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGCisjdW5kZWYgSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGX1VOSVFVQUJMRQorI3VuZGVmIEhBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfQlJBTkNICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL01ldGFkYXRhLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL01ldGFkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMwYjg3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTWV0YWRhdGEuaApAQCAtMCwwICsxLDE0MjUgQEAKKy8vPT09LSBsbHZtL0lSL01ldGFkYXRhLmggLSBNZXRhZGF0YSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIEBmaWxlCisvLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMgZm9yIG1ldGFkYXRhIHN1YmNsYXNzZXMuCisvLy8gVGhleSByZXByZXNlbnQgdGhlIGRpZmZlcmVudCBmbGF2b3JzIG9mIG1ldGFkYXRhIHRoYXQgbGl2ZSBpbiBMTFZNLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9NRVRBREFUQV9ICisjZGVmaW5lIExMVk1fSVJfTUVUQURBVEFfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DQmluZGluZ1dyYXBwaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNb2R1bGU7CitjbGFzcyBNb2R1bGVTbG90VHJhY2tlcjsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgVHlwZTsKKworZW51bSBMTFZNQ29uc3RhbnRzIDogdWludDMyX3QgeworICBERUJVR19NRVRBREFUQV9WRVJTSU9OID0gMyAvLyBDdXJyZW50IGRlYnVnIGluZm8gdmVyc2lvbiBudW1iZXIuCit9OworCisvLy8gXGJyaWVmIFJvb3Qgb2YgdGhlIG1ldGFkYXRhIGhpZXJhcmNoeS4KKy8vLworLy8vIFRoaXMgaXMgYSByb290IGNsYXNzIGZvciB0eXBlbGVzcyBkYXRhIGluIHRoZSBJUi4KK2NsYXNzIE1ldGFkYXRhIHsKKyAgZnJpZW5kIGNsYXNzIFJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsOworCisgIC8vLyBcYnJpZWYgUlRUSS4KKyAgY29uc3QgdW5zaWduZWQgY2hhciBTdWJjbGFzc0lEOworCitwcm90ZWN0ZWQ6CisgIC8vLyBcYnJpZWYgQWN0aXZlIHR5cGUgb2Ygc3RvcmFnZS4KKyAgZW51bSBTdG9yYWdlVHlwZSB7IFVuaXF1ZWQsIERpc3RpbmN0LCBUZW1wb3JhcnkgfTsKKworICAvLy8gXGJyaWVmIFN0b3JhZ2UgZmxhZyBmb3Igbm9uLXVuaXF1ZWQsIG90aGVyd2lzZSB1bm93bmVkLCBtZXRhZGF0YS4KKyAgdW5zaWduZWQgY2hhciBTdG9yYWdlOworICAvLyBUT0RPOiBleHBvc2UgcmVtYWluaW5nIGJpdHMgdG8gc3ViY2xhc3Nlcy4KKworICB1bnNpZ25lZCBzaG9ydCBTdWJjbGFzc0RhdGExNiA9IDA7CisgIHVuc2lnbmVkIFN1YmNsYXNzRGF0YTMyID0gMDsKKworcHVibGljOgorICBlbnVtIE1ldGFkYXRhS2luZCB7CisjZGVmaW5lIEhBTkRMRV9NRVRBREFUQV9MRUFGKENMQVNTKSBDTEFTUyMjS2luZCwKKyNpbmNsdWRlICJsbHZtL0lSL01ldGFkYXRhLmRlZiIKKyAgfTsKKworcHJvdGVjdGVkOgorICBNZXRhZGF0YSh1bnNpZ25lZCBJRCwgU3RvcmFnZVR5cGUgU3RvcmFnZSkKKyAgICAgIDogU3ViY2xhc3NJRChJRCksIFN0b3JhZ2UoU3RvcmFnZSkgeworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKCp0aGlzKSA9PSA4LCAiTWV0YWRhdGEgZmllbGRzIHBvb3JseSBwYWNrZWQiKTsKKyAgfQorCisgIH5NZXRhZGF0YSgpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIERlZmF1bHQgaGFuZGxpbmcgb2YgYSBjaGFuZ2VkIG9wZXJhbmQsIHdoaWNoIGFzc2VydHMuCisgIC8vLworICAvLy8gSWYgc3ViY2xhc3NlcyBwYXNzIHRoZW1zZWx2ZXMgaW4gYXMgb3duZXJzIHRvIGEgdHJhY2tpbmcgbm9kZSByZWZlcmVuY2UsCisgIC8vLyB0aGV5IG11c3QgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZC4KKyAgdm9pZCBoYW5kbGVDaGFuZ2VkT3BlcmFuZCh2b2lkICosIE1ldGFkYXRhICopIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmltcGxlbWVudGVkIGluIE1ldGFkYXRhIHN1YmNsYXNzIik7CisgIH0KKworcHVibGljOgorICB1bnNpZ25lZCBnZXRNZXRhZGF0YUlEKCkgY29uc3QgeyByZXR1cm4gU3ViY2xhc3NJRDsgfQorCisgIC8vLyBcYnJpZWYgVXNlci1mcmllbmRseSBkdW1wLgorICAvLy8KKyAgLy8vIElmIFxjIE0gaXMgcHJvdmlkZWQsIG1ldGFkYXRhIG5vZGVzIHdpbGwgYmUgbnVtYmVyZWQgY2Fub25pY2FsbHk7CisgIC8vLyBvdGhlcndpc2UsIHBvaW50ZXIgYWRkcmVzc2VzIGFyZSBzdWJzdGl0dXRlZC4KKyAgLy8vCisgIC8vLyBOb3RlOiB0aGlzIHVzZXMgYW4gZXhwbGljaXQgb3ZlcmxvYWQgaW5zdGVhZCBvZiBkZWZhdWx0IGFyZ3VtZW50cyBzbyB0aGF0CisgIC8vLyB0aGUgbnVsbHB0ciB2ZXJzaW9uIGlzIGVhc3kgdG8gY2FsbCBmcm9tIGEgZGVidWdnZXIuCisgIC8vLworICAvLy8gQHsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisgIHZvaWQgZHVtcChjb25zdCBNb2R1bGUgKk0pIGNvbnN0OworICAvLy8gQH0KKworICAvLy8gXGJyaWVmIFByaW50LgorICAvLy8KKyAgLy8vIFByaW50cyBkZWZpbml0aW9uIG9mIFxjIHRoaXMuCisgIC8vLworICAvLy8gSWYgXGMgTSBpcyBwcm92aWRlZCwgbWV0YWRhdGEgbm9kZXMgd2lsbCBiZSBudW1iZXJlZCBjYW5vbmljYWxseTsKKyAgLy8vIG90aGVyd2lzZSwgcG9pbnRlciBhZGRyZXNzZXMgYXJlIHN1YnN0aXR1dGVkLgorICAvLy8gQHsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSAqTSA9IG51bGxwdHIsCisgICAgICAgICAgICAgYm9vbCBJc0ZvckRlYnVnID0gZmFsc2UpIGNvbnN0OworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgTW9kdWxlU2xvdFRyYWNrZXIgJk1TVCwgY29uc3QgTW9kdWxlICpNID0gbnVsbHB0ciwKKyAgICAgICAgICAgICBib29sIElzRm9yRGVidWcgPSBmYWxzZSkgY29uc3Q7CisgIC8vLyBAfQorCisgIC8vLyBcYnJpZWYgUHJpbnQgYXMgb3BlcmFuZC4KKyAgLy8vCisgIC8vLyBQcmludHMgcmVmZXJlbmNlIG9mIFxjIHRoaXMuCisgIC8vLworICAvLy8gSWYgXGMgTSBpcyBwcm92aWRlZCwgbWV0YWRhdGEgbm9kZXMgd2lsbCBiZSBudW1iZXJlZCBjYW5vbmljYWxseTsKKyAgLy8vIG90aGVyd2lzZSwgcG9pbnRlciBhZGRyZXNzZXMgYXJlIHN1YnN0aXR1dGVkLgorICAvLy8gQHsKKyAgdm9pZCBwcmludEFzT3BlcmFuZChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSAqTSA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIHByaW50QXNPcGVyYW5kKHJhd19vc3RyZWFtICZPUywgTW9kdWxlU2xvdFRyYWNrZXIgJk1TVCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKk0gPSBudWxscHRyKSBjb25zdDsKKyAgLy8vIEB9Cit9OworCisvLyBDcmVhdGUgd3JhcHBlcnMgZm9yIEMgQmluZGluZyB0eXBlcyAoc2VlIENCaW5kaW5nV3JhcHBpbmcuaCkuCitERUZJTkVfSVNBX0NPTlZFUlNJT05fRlVOQ1RJT05TKE1ldGFkYXRhLCBMTFZNTWV0YWRhdGFSZWYpCisKKy8vIFNwZWNpYWxpemVkIG9wYXF1ZSBtZXRhZGF0YSBjb252ZXJzaW9ucy4KK2lubGluZSBNZXRhZGF0YSAqKnVud3JhcChMTFZNTWV0YWRhdGFSZWYgKk1EcykgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxNZXRhZGF0YSoqPihNRHMpOworfQorCisjZGVmaW5lIEhBTkRMRV9NRVRBREFUQShDTEFTUykgY2xhc3MgQ0xBU1M7CisjaW5jbHVkZSAibGx2bS9JUi9NZXRhZGF0YS5kZWYiCisKKy8vIFByb3ZpZGUgc3BlY2lhbGl6YXRpb25zIG9mIGlzYSBzbyB0aGF0IHdlIGRvbid0IG5lZWQgZGVmaW5pdGlvbnMgb2YKKy8vIHN1YmNsYXNzZXMgdG8gc2VlIGlmIHRoZSBtZXRhZGF0YSBpcyBhIHN1YmNsYXNzLgorI2RlZmluZSBIQU5ETEVfTUVUQURBVEFfTEVBRihDTEFTUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzYV9pbXBsPENMQVNTLCBNZXRhZGF0YT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3QgTWV0YWRhdGEgJk1EKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIE1ELmdldE1ldGFkYXRhSUQoKSA9PSBNZXRhZGF0YTo6Q0xBU1MjI0tpbmQ7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07CisjaW5jbHVkZSAibGx2bS9JUi9NZXRhZGF0YS5kZWYiCisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1ldGFkYXRhICZNRCkgeworICBNRC5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworLy8vIFxicmllZiBNZXRhZGF0YSB3cmFwcGVyIGluIHRoZSBWYWx1ZSBoaWVyYXJjaHkuCisvLy8KKy8vLyBBIG1lbWJlciBvZiB0aGUgXGEgVmFsdWUgaGllcmFyY2h5IHRvIHJlcHJlc2VudCBhIHJlZmVyZW5jZSB0byBtZXRhZGF0YS4KKy8vLyBUaGlzIGFsbG93cywgZS5nLiwgaW5zdHJpbnNpY3MgdG8gaGF2ZSBtZXRhZGF0YSBhcyBvcGVyYW5kcy4KKy8vLworLy8vIE5vdGFibHksIHRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgaW4gZWl0aGVyIGhpZXJhcmNoeSB0aGF0IGlzIGFsbG93ZWQgdG8KKy8vLyByZWZlcmVuY2UgXGEgTG9jYWxBc01ldGFkYXRhLgorY2xhc3MgTWV0YWRhdGFBc1ZhbHVlIDogcHVibGljIFZhbHVlIHsKKyAgZnJpZW5kIGNsYXNzIFJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsOworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworCisgIE1ldGFkYXRhICpNRDsKKworICBNZXRhZGF0YUFzVmFsdWUoVHlwZSAqVHksIE1ldGFkYXRhICpNRCk7CisKKyAgLy8vIFxicmllZiBEcm9wIHVzZSBvZiBtZXRhZGF0YSAoZHVyaW5nIHRlYXJkb3duKS4KKyAgdm9pZCBkcm9wVXNlKCkgeyBNRCA9IG51bGxwdHI7IH0KKworcHVibGljOgorICB+TWV0YWRhdGFBc1ZhbHVlKCk7CisKKyAgc3RhdGljIE1ldGFkYXRhQXNWYWx1ZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBNZXRhZGF0YSAqTUQpOworICBzdGF0aWMgTWV0YWRhdGFBc1ZhbHVlICpnZXRJZkV4aXN0cyhMTFZNQ29udGV4dCAmQ29udGV4dCwgTWV0YWRhdGEgKk1EKTsKKworICBNZXRhZGF0YSAqZ2V0TWV0YWRhdGEoKSBjb25zdCB7IHJldHVybiBNRDsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IE1ldGFkYXRhQXNWYWx1ZVZhbDsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIGhhbmRsZUNoYW5nZWRNZXRhZGF0YShNZXRhZGF0YSAqTUQpOworICB2b2lkIHRyYWNrKCk7CisgIHZvaWQgdW50cmFjaygpOworfTsKKworLy8vIFxicmllZiBBUEkgZm9yIHRyYWNraW5nIG1ldGFkYXRhIHJlZmVyZW5jZXMgdGhyb3VnaCBSQVVXIGFuZCBkZWxldGlvbi4KKy8vLworLy8vIFNoYXJlZCBBUEkgZm9yIHVwZGF0aW5nIFxhIE1ldGFkYXRhIHBvaW50ZXJzIGluIHN1YmNsYXNzZXMgdGhhdCBzdXBwb3J0CisvLy8gUkFVVy4KKy8vLworLy8vIFRoaXMgQVBJIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGRpcmVjdGx5LiAgU2VlIFxhIFRyYWNraW5nTURSZWYgZm9yIGEKKy8vLyB1c2VyLWZyaWVuZGx5IHRyYWNraW5nIHJlZmVyZW5jZS4KK2NsYXNzIE1ldGFkYXRhVHJhY2tpbmcgeworcHVibGljOgorICAvLy8gXGJyaWVmIFRyYWNrIHRoZSByZWZlcmVuY2UgdG8gbWV0YWRhdGEuCisgIC8vLworICAvLy8gUmVnaXN0ZXIgXGMgTUQgd2l0aCBcYyAqTUQsIGlmIHRoZSBzdWJjbGFzcyBzdXBwb3J0cyB0cmFja2luZy4gIElmIFxjICpNRAorICAvLy8gZ2V0cyBSQVVXJ2VkLCBcYyBNRCB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIG5ldyBhZGRyZXNzLiAgSWYgXGMgKk1EIGdldHMKKyAgLy8vIGRlbGV0ZWQsIFxjIE1EIHdpbGwgYmUgc2V0IHRvIFxjIG51bGxwdHIuCisgIC8vLworICAvLy8gSWYgdHJhY2tpbmcgaXNuJ3Qgc3VwcG9ydGVkLCBcYyAqTUQgd2lsbCBub3QgY2hhbmdlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gdHJ1ZSBpZmYgdHJhY2tpbmcgaXMgc3VwcG9ydGVkIGJ5IFxjIE1ELgorICBzdGF0aWMgYm9vbCB0cmFjayhNZXRhZGF0YSAqJk1EKSB7CisgICAgcmV0dXJuIHRyYWNrKCZNRCwgKk1ELCBzdGF0aWNfY2FzdDxNZXRhZGF0YSAqPihudWxscHRyKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFRyYWNrIHRoZSByZWZlcmVuY2UgdG8gbWV0YWRhdGEgZm9yIFxhIE1ldGFkYXRhLgorICAvLy8KKyAgLy8vIEFzIFxhIHRyYWNrKE1ldGFkYXRhKiYpLCBidXQgd2l0aCBzdXBwb3J0IGZvciBjYWxsaW5nIGJhY2sgdG8gXGMgT3duZXIgdG8KKyAgLy8vIHRlbGwgaXQgdGhhdCBpdHMgb3BlcmFuZCBjaGFuZ2VkLiAgVGhpcyBjb3VsZCB0cmlnZ2VyIFxjIE93bmVyIGJlaW5nCisgIC8vLyByZS11bmlxdWVkLgorICBzdGF0aWMgYm9vbCB0cmFjayh2b2lkICpSZWYsIE1ldGFkYXRhICZNRCwgTWV0YWRhdGEgJk93bmVyKSB7CisgICAgcmV0dXJuIHRyYWNrKFJlZiwgTUQsICZPd25lcik7CisgIH0KKworICAvLy8gXGJyaWVmIFRyYWNrIHRoZSByZWZlcmVuY2UgdG8gbWV0YWRhdGEgZm9yIFxhIE1ldGFkYXRhQXNWYWx1ZS4KKyAgLy8vCisgIC8vLyBBcyBcYSB0cmFjayhNZXRhZGF0YSomKSwgYnV0IHdpdGggc3VwcG9ydCBmb3IgY2FsbGluZyBiYWNrIHRvIFxjIE93bmVyIHRvCisgIC8vLyB0ZWxsIGl0IHRoYXQgaXRzIG9wZXJhbmQgY2hhbmdlZC4gIFRoaXMgY291bGQgdHJpZ2dlciBcYyBPd25lciBiZWluZworICAvLy8gcmUtdW5pcXVlZC4KKyAgc3RhdGljIGJvb2wgdHJhY2sodm9pZCAqUmVmLCBNZXRhZGF0YSAmTUQsIE1ldGFkYXRhQXNWYWx1ZSAmT3duZXIpIHsKKyAgICByZXR1cm4gdHJhY2soUmVmLCBNRCwgJk93bmVyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU3RvcCB0cmFja2luZyBhIHJlZmVyZW5jZSB0byBtZXRhZGF0YS4KKyAgLy8vCisgIC8vLyBTdG9wcyBcYyAqTUQgZnJvbSB0cmFja2luZyBcYyBNRC4KKyAgc3RhdGljIHZvaWQgdW50cmFjayhNZXRhZGF0YSAqJk1EKSB7IHVudHJhY2soJk1ELCAqTUQpOyB9CisgIHN0YXRpYyB2b2lkIHVudHJhY2sodm9pZCAqUmVmLCBNZXRhZGF0YSAmTUQpOworCisgIC8vLyBcYnJpZWYgTW92ZSB0cmFja2luZyBmcm9tIG9uZSByZWZlcmVuY2UgdG8gYW5vdGhlci4KKyAgLy8vCisgIC8vLyBTZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byBcYyB1bnRyYWNrKE1EKSBmb2xsb3dlZCBieSBcYyB0cmFjayhOZXcpLAorICAvLy8gZXhjZXB0IHRoYXQgb3duZXJzaGlwIGNhbGxiYWNrcyBhcmUgbWFpbnRhaW5lZC4KKyAgLy8vCisgIC8vLyBOb3RlOiBpdCBpcyBhbiBlcnJvciBpZiBcYyAqTUQgZG9lcyBub3QgZXF1YWwgXGMgTmV3LgorICAvLy8KKyAgLy8vIFxyZXR1cm4gdHJ1ZSBpZmYgdHJhY2tpbmcgaXMgc3VwcG9ydGVkIGJ5IFxjIE1ELgorICBzdGF0aWMgYm9vbCByZXRyYWNrKE1ldGFkYXRhIComTUQsIE1ldGFkYXRhIComTmV3KSB7CisgICAgcmV0dXJuIHJldHJhY2soJk1ELCAqTUQsICZOZXcpOworICB9CisgIHN0YXRpYyBib29sIHJldHJhY2sodm9pZCAqUmVmLCBNZXRhZGF0YSAmTUQsIHZvaWQgKk5ldyk7CisKKyAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIG1ldGFkYXRhIGlzIHJlcGxhY2VhYmxlLgorICBzdGF0aWMgYm9vbCBpc1JlcGxhY2VhYmxlKGNvbnN0IE1ldGFkYXRhICZNRCk7CisKKyAgdXNpbmcgT3duZXJUeSA9IFBvaW50ZXJVbmlvbjxNZXRhZGF0YUFzVmFsdWUgKiwgTWV0YWRhdGEgKj47CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgVHJhY2sgYSByZWZlcmVuY2UgdG8gbWV0YWRhdGEgZm9yIGFuIG93bmVyLgorICAvLy8KKyAgLy8vIEdlbmVyYWxpemVkIHZlcnNpb24gb2YgdHJhY2tpbmcuCisgIHN0YXRpYyBib29sIHRyYWNrKHZvaWQgKlJlZiwgTWV0YWRhdGEgJk1ELCBPd25lclR5IE93bmVyKTsKK307CisKKy8vLyBcYnJpZWYgU2hhcmVkIGltcGxlbWVudGF0aW9uIG9mIHVzZS1saXN0cyBmb3IgcmVwbGFjZWFibGUgbWV0YWRhdGEuCisvLy8KKy8vLyBNb3N0IG1ldGFkYXRhIGNhbm5vdCBiZSBSQVVXJ2VkLiAgVGhpcyBpcyBhIHNoYXJlZCBpbXBsZW1lbnRhdGlvbiBvZgorLy8vIHVzZS1saXN0cyBhbmQgYXNzb2NpYXRlZCBBUEkgZm9yIHRoZSB0d28gdGhhdCBzdXBwb3J0IGl0IChcYSBWYWx1ZUFzTWV0YWRhdGEKKy8vLyBhbmQgXGEgVGVtcE1ETm9kZSkuCitjbGFzcyBSZXBsYWNlYWJsZU1ldGFkYXRhSW1wbCB7CisgIGZyaWVuZCBjbGFzcyBNZXRhZGF0YVRyYWNraW5nOworCitwdWJsaWM6CisgIHVzaW5nIE93bmVyVHkgPSBNZXRhZGF0YVRyYWNraW5nOjpPd25lclR5OworCitwcml2YXRlOgorICBMTFZNQ29udGV4dCAmQ29udGV4dDsKKyAgdWludDY0X3QgTmV4dEluZGV4ID0gMDsKKyAgU21hbGxEZW5zZU1hcDx2b2lkICosIHN0ZDo6cGFpcjxPd25lclR5LCB1aW50NjRfdD4sIDQ+IFVzZU1hcDsKKworcHVibGljOgorICBSZXBsYWNlYWJsZU1ldGFkYXRhSW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCkgOiBDb250ZXh0KENvbnRleHQpIHt9CisKKyAgflJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsKCkgeworICAgIGFzc2VydChVc2VNYXAuZW1wdHkoKSAmJiAiQ2Fubm90IGRlc3Ryb3kgaW4tdXNlIHJlcGxhY2VhYmxlIG1ldGFkYXRhIik7CisgIH0KKworICBMTFZNQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIENvbnRleHQ7IH0KKworICAvLy8gXGJyaWVmIFJlcGxhY2UgYWxsIHVzZXMgb2YgdGhpcyB3aXRoIE1ELgorICAvLy8KKyAgLy8vIFJlcGxhY2UgYWxsIHVzZXMgb2YgdGhpcyB3aXRoIFxjIE1ELCB3aGljaCBpcyBhbGxvd2VkIHRvIGJlIG51bGwuCisgIHZvaWQgcmVwbGFjZUFsbFVzZXNXaXRoKE1ldGFkYXRhICpNRCk7CisKKyAgLy8vIFxicmllZiBSZXNvbHZlIGFsbCB1c2VzIG9mIHRoaXMuCisgIC8vLworICAvLy8gUmVzb2x2ZSBhbGwgdXNlcyBvZiB0aGlzLCB0dXJuaW5nIG9mZiBSQVVXIHBlcm1hbmVudGx5LiAgSWYgXGMKKyAgLy8vIFJlc29sdmVVc2VycywgY2FsbCBcYSBNRE5vZGU6OnJlc29sdmUoKSBvbiBhbnkgdXNlcnMgd2hvc2UgbGFzdCBvcGVyYW5kCisgIC8vLyBpcyByZXNvbHZlZC4KKyAgdm9pZCByZXNvbHZlQWxsVXNlcyhib29sIFJlc29sdmVVc2VycyA9IHRydWUpOworCitwcml2YXRlOgorICB2b2lkIGFkZFJlZih2b2lkICpSZWYsIE93bmVyVHkgT3duZXIpOworICB2b2lkIGRyb3BSZWYodm9pZCAqUmVmKTsKKyAgdm9pZCBtb3ZlUmVmKHZvaWQgKlJlZiwgdm9pZCAqTmV3LCBjb25zdCBNZXRhZGF0YSAmTUQpOworCisgIC8vLyBMYXppbHkgY29uc3RydWN0IFJBVVcgc3VwcG9ydCBvbiBNRC4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIGlzIGFuIHVucmVzb2x2ZWQgTUROb2RlLCBSQVVXIHN1cHBvcnQgd2lsbCBiZSBjcmVhdGVkIG9uLWRlbWFuZC4KKyAgLy8vIFZhbHVlQXNNZXRhZGF0YSBhbHdheXMgaGFzIFJBVVcgc3VwcG9ydC4KKyAgc3RhdGljIFJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsICpnZXRPckNyZWF0ZShNZXRhZGF0YSAmTUQpOworCisgIC8vLyBHZXQgUkFVVyBzdXBwb3J0IG9uIE1ELCBpZiBpdCBleGlzdHMuCisgIHN0YXRpYyBSZXBsYWNlYWJsZU1ldGFkYXRhSW1wbCAqZ2V0SWZFeGlzdHMoTWV0YWRhdGEgJk1EKTsKKworICAvLy8gQ2hlY2sgd2hldGhlciB0aGlzIG5vZGUgd2lsbCBzdXBwb3J0IFJBVVcuCisgIC8vLworICAvLy8gUmV0dXJucyBcYyB0cnVlIHVubGVzcyBnZXRPckNyZWF0ZSgpIHdvdWxkIHJldHVybiBudWxsLgorICBzdGF0aWMgYm9vbCBpc1JlcGxhY2VhYmxlKGNvbnN0IE1ldGFkYXRhICZNRCk7Cit9OworCisvLy8gXGJyaWVmIFZhbHVlIHdyYXBwZXIgaW4gdGhlIE1ldGFkYXRhIGhpZXJhcmNoeS4KKy8vLworLy8vIFRoaXMgaXMgYSBjdXN0b20gdmFsdWUgaGFuZGxlIHRoYXQgYWxsb3dzIG90aGVyIG1ldGFkYXRhIHRvIHJlZmVyIHRvCisvLy8gY2xhc3NlcyBpbiB0aGUgVmFsdWUgaGllcmFyY2h5LgorLy8vCisvLy8gQmVjYXVzZSBvZiBmdWxsIHVuaXF1aW5nIHN1cHBvcnQsIGVhY2ggdmFsdWUgaXMgb25seSB3cmFwcGVkIGJ5IGEgc2luZ2xlIFxhCisvLy8gVmFsdWVBc01ldGFkYXRhIG9iamVjdCwgc28gdGhlIGxvb2t1cCBtYXBzIGFyZSBmYXIgbW9yZSBlZmZpY2llbnQgdGhhbgorLy8vIHRob3NlIHVzaW5nIFZhbHVlSGFuZGxlQmFzZS4KK2NsYXNzIFZhbHVlQXNNZXRhZGF0YSA6IHB1YmxpYyBNZXRhZGF0YSwgUmVwbGFjZWFibGVNZXRhZGF0YUltcGwgeworICBmcmllbmQgY2xhc3MgUmVwbGFjZWFibGVNZXRhZGF0YUltcGw7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisKKyAgVmFsdWUgKlY7CisKKyAgLy8vIFxicmllZiBEcm9wIHVzZXJzIHdpdGhvdXQgUkFVVyAoZHVyaW5nIHRlYXJkb3duKS4KKyAgdm9pZCBkcm9wVXNlcnMoKSB7CisgICAgUmVwbGFjZWFibGVNZXRhZGF0YUltcGw6OnJlc29sdmVBbGxVc2VzKC8qIFJlc29sdmVVc2VycyAqLyBmYWxzZSk7CisgIH0KKworcHJvdGVjdGVkOgorICBWYWx1ZUFzTWV0YWRhdGEodW5zaWduZWQgSUQsIFZhbHVlICpWKQorICAgICAgOiBNZXRhZGF0YShJRCwgVW5pcXVlZCksIFJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsKFYtPmdldENvbnRleHQoKSksIFYoVikgeworICAgIGFzc2VydChWICYmICJFeHBlY3RlZCB2YWxpZCB2YWx1ZSIpOworICB9CisKKyAgflZhbHVlQXNNZXRhZGF0YSgpID0gZGVmYXVsdDsKKworcHVibGljOgorICBzdGF0aWMgVmFsdWVBc01ldGFkYXRhICpnZXQoVmFsdWUgKlYpOworCisgIHN0YXRpYyBDb25zdGFudEFzTWV0YWRhdGEgKmdldENvbnN0YW50KFZhbHVlICpDKSB7CisgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnRBc01ldGFkYXRhPihnZXQoQykpOworICB9CisKKyAgc3RhdGljIExvY2FsQXNNZXRhZGF0YSAqZ2V0TG9jYWwoVmFsdWUgKkxvY2FsKSB7CisgICAgcmV0dXJuIGNhc3Q8TG9jYWxBc01ldGFkYXRhPihnZXQoTG9jYWwpKTsKKyAgfQorCisgIHN0YXRpYyBWYWx1ZUFzTWV0YWRhdGEgKmdldElmRXhpc3RzKFZhbHVlICpWKTsKKworICBzdGF0aWMgQ29uc3RhbnRBc01ldGFkYXRhICpnZXRDb25zdGFudElmRXhpc3RzKFZhbHVlICpDKSB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxDb25zdGFudEFzTWV0YWRhdGE+KGdldElmRXhpc3RzKEMpKTsKKyAgfQorCisgIHN0YXRpYyBMb2NhbEFzTWV0YWRhdGEgKmdldExvY2FsSWZFeGlzdHMoVmFsdWUgKkxvY2FsKSB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxMb2NhbEFzTWV0YWRhdGE+KGdldElmRXhpc3RzKExvY2FsKSk7CisgIH0KKworICBWYWx1ZSAqZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWOyB9CisgIFR5cGUgKmdldFR5cGUoKSBjb25zdCB7IHJldHVybiBWLT5nZXRUeXBlKCk7IH0KKyAgTExWTUNvbnRleHQgJmdldENvbnRleHQoKSBjb25zdCB7IHJldHVybiBWLT5nZXRDb250ZXh0KCk7IH0KKworICBzdGF0aWMgdm9pZCBoYW5kbGVEZWxldGlvbihWYWx1ZSAqVik7CisgIHN0YXRpYyB2b2lkIGhhbmRsZVJBVVcoVmFsdWUgKkZyb20sIFZhbHVlICpUbyk7CisKK3Byb3RlY3RlZDoKKyAgLy8vIFxicmllZiBIYW5kbGUgY29sbGlzaW9ucyBhZnRlciBcYSBWYWx1ZTo6cmVwbGFjZUFsbFVzZXNXaXRoKCkuCisgIC8vLworICAvLy8gUkFVVyBpc24ndCBzdXBwb3J0ZWQgZGlyZWN0bHkgZm9yIFxhIFZhbHVlQXNNZXRhZGF0YSwgYnV0IGlmIHRoZSB3cmFwcGVkCisgIC8vLyBcYSBWYWx1ZSBnZXRzIFJBVVcnZWQgYW5kIHRoZSB0YXJnZXQgYWxyZWFkeSBleGlzdHMsIHRoaXMgaXMgdXNlZCB0bworICAvLy8gbWVyZ2UgdGhlIHR3byBtZXRhZGF0YSBub2Rlcy4KKyAgdm9pZCByZXBsYWNlQWxsVXNlc1dpdGgoTWV0YWRhdGEgKk1EKSB7CisgICAgUmVwbGFjZWFibGVNZXRhZGF0YUltcGw6OnJlcGxhY2VBbGxVc2VzV2l0aChNRCk7CisgIH0KKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IExvY2FsQXNNZXRhZGF0YUtpbmQgfHwKKyAgICAgICAgICAgTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBDb25zdGFudEFzTWV0YWRhdGFLaW5kOworICB9Cit9OworCitjbGFzcyBDb25zdGFudEFzTWV0YWRhdGEgOiBwdWJsaWMgVmFsdWVBc01ldGFkYXRhIHsKKyAgZnJpZW5kIGNsYXNzIFZhbHVlQXNNZXRhZGF0YTsKKworICBDb25zdGFudEFzTWV0YWRhdGEoQ29uc3RhbnQgKkMpCisgICAgICA6IFZhbHVlQXNNZXRhZGF0YShDb25zdGFudEFzTWV0YWRhdGFLaW5kLCBDKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBDb25zdGFudEFzTWV0YWRhdGEgKmdldChDb25zdGFudCAqQykgeworICAgIHJldHVybiBWYWx1ZUFzTWV0YWRhdGE6OmdldENvbnN0YW50KEMpOworICB9CisKKyAgc3RhdGljIENvbnN0YW50QXNNZXRhZGF0YSAqZ2V0SWZFeGlzdHMoQ29uc3RhbnQgKkMpIHsKKyAgICByZXR1cm4gVmFsdWVBc01ldGFkYXRhOjpnZXRDb25zdGFudElmRXhpc3RzKEMpOworICB9CisKKyAgQ29uc3RhbnQgKmdldFZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PENvbnN0YW50PihWYWx1ZUFzTWV0YWRhdGE6OmdldFZhbHVlKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBDb25zdGFudEFzTWV0YWRhdGFLaW5kOworICB9Cit9OworCitjbGFzcyBMb2NhbEFzTWV0YWRhdGEgOiBwdWJsaWMgVmFsdWVBc01ldGFkYXRhIHsKKyAgZnJpZW5kIGNsYXNzIFZhbHVlQXNNZXRhZGF0YTsKKworICBMb2NhbEFzTWV0YWRhdGEoVmFsdWUgKkxvY2FsKQorICAgICAgOiBWYWx1ZUFzTWV0YWRhdGEoTG9jYWxBc01ldGFkYXRhS2luZCwgTG9jYWwpIHsKKyAgICBhc3NlcnQoIWlzYTxDb25zdGFudD4oTG9jYWwpICYmICJFeHBlY3RlZCBsb2NhbCB2YWx1ZSIpOworICB9CisKK3B1YmxpYzoKKyAgc3RhdGljIExvY2FsQXNNZXRhZGF0YSAqZ2V0KFZhbHVlICpMb2NhbCkgeworICAgIHJldHVybiBWYWx1ZUFzTWV0YWRhdGE6OmdldExvY2FsKExvY2FsKTsKKyAgfQorCisgIHN0YXRpYyBMb2NhbEFzTWV0YWRhdGEgKmdldElmRXhpc3RzKFZhbHVlICpMb2NhbCkgeworICAgIHJldHVybiBWYWx1ZUFzTWV0YWRhdGE6OmdldExvY2FsSWZFeGlzdHMoTG9jYWwpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBMb2NhbEFzTWV0YWRhdGFLaW5kOworICB9Cit9OworCisvLy8gXGJyaWVmIFRyYW5zaXRpb25hbCBBUEkgZm9yIGV4dHJhY3RpbmcgY29uc3RhbnRzIGZyb20gTWV0YWRhdGEuCisvLy8KKy8vLyBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0cmFuc2l0aW9uYWwgZnVuY3Rpb25zIGZvciBtZXRhZGF0YSB0aGF0IHBvaW50cyB0bworLy8vIFxhIENvbnN0YW50cy4KKy8vLworLy8vIEluIHByZWhpc3RvcnkgLS0gd2hlbiBtZXRhZGF0YSB3YXMgYSBzdWJjbGFzcyBvZiBcYSBWYWx1ZSAtLSBcYSBNRE5vZGUKKy8vLyBvcGVyYW5kcyBjb3VsZCByZWZlciB0byBhbnkgXGEgVmFsdWUuICBUaGVyZSdzIHdhcyBhIGxvdCBvZiBjb2RlIGxpa2UgdGhpczoKKy8vLworLy8vIFxjb2RlCisvLy8gICAgIE1ETm9kZSAqTiA9IC4uLjsKKy8vLyAgICAgYXV0byAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oTi0+Z2V0T3BlcmFuZCgyKSk7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIE5vdyB0aGF0IFxhIFZhbHVlIGFuZCBcYSBNZXRhZGF0YSBhcmUgaW4gc2VwYXJhdGUgaGllcmFyY2hpZXMsIG1haW50YWluaW5nCisvLy8gdGhlIHNlbWFudGljcyBmb3IgXGEgaXNhKCksIFxhIGNhc3QoKSwgXGEgZHluX2Nhc3QoKSAoZXRjLikgcmVxdWlyZXMgdGhyZWUKKy8vLyBzdGVwczogY2FzdCBpbiB0aGUgXGEgTWV0YWRhdGEgaGllcmFyY2h5LCBleHRyYWN0aW9uIG9mIHRoZSBcYSBWYWx1ZSwgYW5kCisvLy8gY2FzdCBpbiB0aGUgXGEgVmFsdWUgaGllcmFyY2h5LiAgQmVzaWRlcyBjcmVhdGluZyBib2lsZXItcGxhdGUsIHRoaXMKKy8vLyByZXF1aXJlcyBzdWJ0bGUgY29udHJvbCBmbG93IGNoYW5nZXMuCisvLy8KKy8vLyBUaGUgZW5kLWdvYWwgaXMgdG8gY3JlYXRlIGEgbmV3IHR5cGUgb2YgbWV0YWRhdGEsIGNhbGxlZCAoZS5nLikgXGEgTURJbnQsCisvLy8gc28gdGhhdCBtZXRhZGF0YSBjYW4gcmVmZXIgdG8gbnVtYmVycyB3aXRob3V0IHRyYXZlcnNpbmcgYSBicmlkZ2UgdG8gdGhlIFxhCisvLy8gVmFsdWUgaGllcmFyY2h5LiAgSW4gdGhpcyBmaW5hbCBzdGF0ZSwgdGhlIGNvZGUgYWJvdmUgd291bGQgbG9vayBsaWtlIHRoaXM6CisvLy8KKy8vLyBcY29kZQorLy8vICAgICBNRE5vZGUgKk4gPSAuLi47CisvLy8gICAgIGF1dG8gKk1JID0gZHluX2Nhc3Q8TURJbnQ+KE4tPmdldE9wZXJhbmQoMikpOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGUgQVBJIGluIHRoaXMgbmFtZXNwYWNlIHN1cHBvcnRzIHRoZSB0cmFuc2l0aW9uLiAgXGEgTURJbnQgZG9lc24ndCBleGlzdAorLy8vIHlldCwgYW5kIGV2ZW4gb25jZSBpdCBkb2VzLCBjaGFuZ2luZyBlYWNoIG1ldGFkYXRhIHNjaGVtYSB0byB1c2UgaXQgaXMgaXRzCisvLy8gb3duIG1pbmktcHJvamVjdC4gIEluIHRoZSBtZWFudGltZSB0aGlzIEFQSSBwcmV2ZW50cyB1cyBmcm9tIGludHJvZHVjaW5nCisvLy8gY29tcGxleCBhbmQgYnVnLXByb25lIGNvbnRyb2wgZmxvdyB0aGF0IHdpbGwgZGlzYXBwZWFyIGluIHRoZSBlbmQuICBJbgorLy8vIHBhcnRpY3VsYXIsIHRoZSBhYm92ZSBjb2RlIGxvb2tzIGxpa2UgdGhpczoKKy8vLworLy8vIFxjb2RlCisvLy8gICAgIE1ETm9kZSAqTiA9IC4uLjsKKy8vLyAgICAgYXV0byAqQ0kgPSBtZGNvbnN0OjpkeW5fZXh0cmFjdDxDb25zdGFudEludD4oTi0+Z2V0T3BlcmFuZCgyKSk7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoZSBmdWxsIHNldCBvZiBwcm92aWRlZCBmdW5jdGlvbnMgaW5jbHVkZXM6CisvLy8KKy8vLyAgIG1kY29uc3Q6Omhhc2EgICAgICAgICAgICAgICAgPD0+IGlzYQorLy8vICAgbWRjb25zdDo6ZXh0cmFjdCAgICAgICAgICAgICA8PT4gY2FzdAorLy8vICAgbWRjb25zdDo6ZXh0cmFjdF9vcl9udWxsICAgICA8PT4gY2FzdF9vcl9udWxsCisvLy8gICBtZGNvbnN0OjpkeW5fZXh0cmFjdCAgICAgICAgIDw9PiBkeW5fY2FzdAorLy8vICAgbWRjb25zdDo6ZHluX2V4dHJhY3Rfb3JfbnVsbCA8PT4gZHluX2Nhc3Rfb3JfbnVsbAorLy8vCisvLy8gVGhlIHRhcmdldCBvZiB0aGUgY2FzdCBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgXGEgQ29uc3RhbnQuCituYW1lc3BhY2UgbWRjb25zdCB7CisKK25hbWVzcGFjZSBkZXRhaWwgeworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gVCAmbWFrZSgpOwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFJlc3VsdD4gc3RydWN0IEhhc0RlcmVmZXJlbmNlIHsKKyAgdXNpbmcgWWVzID0gY2hhclsxXTsKKyAgdXNpbmcgTm8gPSBjaGFyWzJdOworICB0ZW1wbGF0ZSA8c2l6ZV90IE4+IHN0cnVjdCBTRklOQUUge307CisKKyAgdGVtcGxhdGUgPGNsYXNzIFUsIGNsYXNzIFY+CisgIHN0YXRpYyBZZXMgJmhhc0RlcmVmZXJlbmNlKFNGSU5BRTxzaXplb2Yoc3RhdGljX2Nhc3Q8Vj4oKm1ha2U8VT4oKSkpPiAqID0gMCk7CisgIHRlbXBsYXRlIDxjbGFzcyBVLCBjbGFzcyBWPiBzdGF0aWMgTm8gJmhhc0RlcmVmZXJlbmNlKC4uLik7CisKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPQorICAgICAgc2l6ZW9mKGhhc0RlcmVmZXJlbmNlPFQsIFJlc3VsdD4obnVsbHB0cikpID09IHNpemVvZihZZXMpOworfTsKK3RlbXBsYXRlIDxjbGFzcyBWLCBjbGFzcyBNPiBzdHJ1Y3QgSXNWYWxpZFBvaW50ZXIgeworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHN0ZDo6aXNfYmFzZV9vZjxDb25zdGFudCwgVj46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzRGVyZWZlcmVuY2U8TSwgY29uc3QgTWV0YWRhdGEgJj46OnZhbHVlOworfTsKK3RlbXBsYXRlIDxjbGFzcyBWLCBjbGFzcyBNPiBzdHJ1Y3QgSXNWYWxpZFJlZmVyZW5jZSB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gc3RkOjppc19iYXNlX29mPENvbnN0YW50LCBWPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2NvbnZlcnRpYmxlPE0sIGNvbnN0IE1ldGFkYXRhICY+Ojp2YWx1ZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKworLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIE1ldGFkYXRhIGhhcyBhIFZhbHVlLgorLy8vCisvLy8gQXMgYW4gYW5hbG9ndWUgdG8gXGEgaXNhKCksIGNoZWNrIHdoZXRoZXIgXGMgTUQgaGFzIGFuIFxhIFZhbHVlIGluc2lkZSBvZgorLy8vIHR5cGUgXGMgWC4KK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgoraW5saW5lIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGRldGFpbDo6SXNWYWxpZFBvaW50ZXI8WCwgWT46OnZhbHVlLCBib29sPjo6dHlwZQoraGFzYShZICYmTUQpIHsKKyAgYXNzZXJ0KE1EICYmICJOdWxsIHBvaW50ZXIgc2VudCBpbnRvIGhhc2EiKTsKKyAgaWYgKGF1dG8gKlYgPSBkeW5fY2FzdDxDb25zdGFudEFzTWV0YWRhdGE+KE1EKSkKKyAgICByZXR1cm4gaXNhPFg+KFYtPmdldFZhbHVlKCkpOworICByZXR1cm4gZmFsc2U7Cit9Cit0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4KK2lubGluZQorICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGRldGFpbDo6SXNWYWxpZFJlZmVyZW5jZTxYLCBZICY+Ojp2YWx1ZSwgYm9vbD46OnR5cGUKKyAgICBoYXNhKFkgJk1EKSB7CisgIHJldHVybiBoYXNhKCZNRCk7Cit9CisKKy8vLyBcYnJpZWYgRXh0cmFjdCBhIFZhbHVlIGZyb20gTWV0YWRhdGEuCisvLy8KKy8vLyBBcyBhbiBhbmFsb2d1ZSB0byBcYSBjYXN0KCksIGV4dHJhY3QgdGhlIFxhIFZhbHVlIHN1YmNsYXNzIFxjIFggZnJvbSBcYyBNRC4KK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgoraW5saW5lIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGRldGFpbDo6SXNWYWxpZFBvaW50ZXI8WCwgWT46OnZhbHVlLCBYICo+Ojp0eXBlCitleHRyYWN0KFkgJiZNRCkgeworICByZXR1cm4gY2FzdDxYPihjYXN0PENvbnN0YW50QXNNZXRhZGF0YT4oTUQpLT5nZXRWYWx1ZSgpKTsKK30KK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgoraW5saW5lCisgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8ZGV0YWlsOjpJc1ZhbGlkUmVmZXJlbmNlPFgsIFkgJj46OnZhbHVlLCBYICo+Ojp0eXBlCisgICAgZXh0cmFjdChZICZNRCkgeworICByZXR1cm4gZXh0cmFjdCgmTUQpOworfQorCisvLy8gXGJyaWVmIEV4dHJhY3QgYSBWYWx1ZSBmcm9tIE1ldGFkYXRhLCBhbGxvd2luZyBudWxsLgorLy8vCisvLy8gQXMgYW4gYW5hbG9ndWUgdG8gXGEgY2FzdF9vcl9udWxsKCksIGV4dHJhY3QgdGhlIFxhIFZhbHVlIHN1YmNsYXNzIFxjIFgKKy8vLyBmcm9tIFxjIE1ELCBhbGxvd2luZyBcYyBNRCB0byBiZSBudWxsLgordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitpbmxpbmUgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8ZGV0YWlsOjpJc1ZhbGlkUG9pbnRlcjxYLCBZPjo6dmFsdWUsIFggKj46OnR5cGUKK2V4dHJhY3Rfb3JfbnVsbChZICYmTUQpIHsKKyAgaWYgKGF1dG8gKlYgPSBjYXN0X29yX251bGw8Q29uc3RhbnRBc01ldGFkYXRhPihNRCkpCisgICAgcmV0dXJuIGNhc3Q8WD4oVi0+Z2V0VmFsdWUoKSk7CisgIHJldHVybiBudWxscHRyOworfQorCisvLy8gXGJyaWVmIEV4dHJhY3QgYSBWYWx1ZSBmcm9tIE1ldGFkYXRhLCBpZiBhbnkuCisvLy8KKy8vLyBBcyBhbiBhbmFsb2d1ZSB0byBcYSBkeW5fY2FzdF9vcl9udWxsKCksIGV4dHJhY3QgdGhlIFxhIFZhbHVlIHN1YmNsYXNzIFxjIFgKKy8vLyBmcm9tIFxjIE1ELCByZXR1cm4gbnVsbCBpZiBcYyBNRCBkb2Vzbid0IGNvbnRhaW4gYSBcYSBWYWx1ZSBvciBpZiB0aGUgXGEKKy8vLyBWYWx1ZSBpdCBkb2VzIGNvbnRhaW4gaXMgb2YgdGhlIHdyb25nIHN1YmNsYXNzLgordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitpbmxpbmUgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8ZGV0YWlsOjpJc1ZhbGlkUG9pbnRlcjxYLCBZPjo6dmFsdWUsIFggKj46OnR5cGUKK2R5bl9leHRyYWN0KFkgJiZNRCkgeworICBpZiAoYXV0byAqViA9IGR5bl9jYXN0PENvbnN0YW50QXNNZXRhZGF0YT4oTUQpKQorICAgIHJldHVybiBkeW5fY2FzdDxYPihWLT5nZXRWYWx1ZSgpKTsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vLyBcYnJpZWYgRXh0cmFjdCBhIFZhbHVlIGZyb20gTWV0YWRhdGEsIGlmIGFueSwgYWxsb3dpbmcgbnVsbC4KKy8vLworLy8vIEFzIGFuIGFuYWxvZ3VlIHRvIFxhIGR5bl9jYXN0X29yX251bGwoKSwgZXh0cmFjdCB0aGUgXGEgVmFsdWUgc3ViY2xhc3MgXGMgWAorLy8vIGZyb20gXGMgTUQsIHJldHVybiBudWxsIGlmIFxjIE1EIGRvZXNuJ3QgY29udGFpbiBhIFxhIFZhbHVlIG9yIGlmIHRoZSBcYQorLy8vIFZhbHVlIGl0IGRvZXMgY29udGFpbiBpcyBvZiB0aGUgd3Jvbmcgc3ViY2xhc3MsIGFsbG93aW5nIFxjIE1EIHRvIGJlIG51bGwuCit0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4KK2lubGluZSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxkZXRhaWw6OklzVmFsaWRQb2ludGVyPFgsIFk+Ojp2YWx1ZSwgWCAqPjo6dHlwZQorZHluX2V4dHJhY3Rfb3JfbnVsbChZICYmTUQpIHsKKyAgaWYgKGF1dG8gKlYgPSBkeW5fY2FzdF9vcl9udWxsPENvbnN0YW50QXNNZXRhZGF0YT4oTUQpKQorICAgIHJldHVybiBkeW5fY2FzdDxYPihWLT5nZXRWYWx1ZSgpKTsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBtZGNvbnN0CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGJyaWVmIEEgc2luZ2xlIHVuaXF1ZWQgc3RyaW5nLgorLy8vCisvLy8gVGhlc2UgYXJlIHVzZWQgdG8gZWZmaWNpZW50bHkgY29udGFpbiBhIGJ5dGUgc2VxdWVuY2UgZm9yIG1ldGFkYXRhLgorLy8vIE1EU3RyaW5nIGlzIGFsd2F5cyB1bm5hbWVkLgorY2xhc3MgTURTdHJpbmcgOiBwdWJsaWMgTWV0YWRhdGEgeworICBmcmllbmQgY2xhc3MgU3RyaW5nTWFwRW50cnk8TURTdHJpbmc+OworCisgIFN0cmluZ01hcEVudHJ5PE1EU3RyaW5nPiAqRW50cnkgPSBudWxscHRyOworCisgIE1EU3RyaW5nKCkgOiBNZXRhZGF0YShNRFN0cmluZ0tpbmQsIFVuaXF1ZWQpIHt9CisKK3B1YmxpYzoKKyAgTURTdHJpbmcoY29uc3QgTURTdHJpbmcgJikgPSBkZWxldGU7CisgIE1EU3RyaW5nICZvcGVyYXRvcj0oTURTdHJpbmcgJiYpID0gZGVsZXRlOworICBNRFN0cmluZyAmb3BlcmF0b3I9KGNvbnN0IE1EU3RyaW5nICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBNRFN0cmluZyAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBTdHJpbmdSZWYgU3RyKTsKKyAgc3RhdGljIE1EU3RyaW5nICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIGNvbnN0IGNoYXIgKlN0cikgeworICAgIHJldHVybiBnZXQoQ29udGV4dCwgU3RyID8gU3RyaW5nUmVmKFN0cikgOiBTdHJpbmdSZWYoKSk7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0U3RyaW5nKCkgY29uc3Q7CisKKyAgdW5zaWduZWQgZ2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gKHVuc2lnbmVkKWdldFN0cmluZygpLnNpemUoKTsgfQorCisgIHVzaW5nIGl0ZXJhdG9yID0gU3RyaW5nUmVmOjppdGVyYXRvcjsKKworICAvLy8gXGJyaWVmIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHN0cmluZy4KKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmcoKS5iZWdpbigpOyB9CisKKyAgLy8vIFxicmllZiBQb2ludGVyIHRvIG9uZSBieXRlIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmcoKS5lbmQoKTsgfQorCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nKCkuYnl0ZXNfYmVnaW4oKTsgfQorICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlc19lbmQoKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmcoKS5ieXRlc19lbmQoKTsgfQorCisgIC8vLyBcYnJpZWYgTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdC4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBNRFN0cmluZ0tpbmQ7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQSBjb2xsZWN0aW9uIG9mIG1ldGFkYXRhIG5vZGVzIHRoYXQgbWlnaHQgYmUgYXNzb2NpYXRlZCB3aXRoIGEKKy8vLyBtZW1vcnkgYWNjZXNzIHVzZWQgYnkgdGhlIGFsaWFzLWFuYWx5c2lzIGluZnJhc3RydWN0dXJlLgorc3RydWN0IEFBTUROb2RlcyB7CisgIGV4cGxpY2l0IEFBTUROb2RlcyhNRE5vZGUgKlQgPSBudWxscHRyLCBNRE5vZGUgKlMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpOID0gbnVsbHB0cikKKyAgICAgIDogVEJBQShUKSwgU2NvcGUoUyksIE5vQWxpYXMoTikge30KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQUFNRE5vZGVzICZBKSBjb25zdCB7CisgICAgcmV0dXJuIFRCQUEgPT0gQS5UQkFBICYmIFNjb3BlID09IEEuU2NvcGUgJiYgTm9BbGlhcyA9PSBBLk5vQWxpYXM7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgQUFNRE5vZGVzICZBKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IEEpOyB9CisKKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIFRCQUEgfHwgU2NvcGUgfHwgTm9BbGlhczsgfQorCisgIC8vLyBcYnJpZWYgVGhlIHRhZyBmb3IgdHlwZS1iYXNlZCBhbGlhcyBhbmFseXNpcy4KKyAgTUROb2RlICpUQkFBOworCisgIC8vLyBcYnJpZWYgVGhlIHRhZyBmb3IgYWxpYXMgc2NvcGUgc3BlY2lmaWNhdGlvbiAodXNlZCB3aXRoIG5vYWxpYXMpLgorICBNRE5vZGUgKlNjb3BlOworCisgIC8vLyBcYnJpZWYgVGhlIHRhZyBzcGVjaWZ5aW5nIHRoZSBub2FsaWFzIHNjb3BlLgorICBNRE5vZGUgKk5vQWxpYXM7CisKKyAgLy8vIFxicmllZiBHaXZlbiB0d28gc2V0cyBvZiBBQU1ETm9kZXMgdGhhdCBhcHBseSB0byB0aGUgc2FtZSBwb2ludGVyLAorICAvLy8gZ2l2ZSB0aGUgYmVzdCBBQU1ETm9kZXMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIGJvdGggKGkuZS4gYSBzZXQgb2YKKyAgLy8vIG5vZGVzIHdob3NlIGFsbG93YWJsZSBhbGlhc2luZyBjb25jbHVzaW9ucyBhcmUgYSBzdWJzZXQgb2YgdGhvc2UKKyAgLy8vIGFsbG93YWJsZSBieSBib3RoIG9mIHRoZSBpbnB1dHMpLiBIb3dldmVyLCBmb3IgZWZmaWNpZW5jeQorICAvLy8gcmVhc29ucywgZG8gbm90IGNyZWF0ZSBhbnkgbmV3IE1ETm9kZXMuCisgIEFBTUROb2RlcyBpbnRlcnNlY3QoY29uc3QgQUFNRE5vZGVzICZPdGhlcikgeworICAgIEFBTUROb2RlcyBSZXN1bHQ7CisgICAgUmVzdWx0LlRCQUEgPSBPdGhlci5UQkFBID09IFRCQUEgPyBUQkFBIDogbnVsbHB0cjsKKyAgICBSZXN1bHQuU2NvcGUgPSBPdGhlci5TY29wZSA9PSBTY29wZSA/IFNjb3BlIDogbnVsbHB0cjsKKyAgICBSZXN1bHQuTm9BbGlhcyA9IE90aGVyLk5vQWxpYXMgPT0gTm9BbGlhcyA/IE5vQWxpYXMgOiBudWxscHRyOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KK307CisKKy8vIFNwZWNpYWxpemUgRGVuc2VNYXBJbmZvIGZvciBBQU1ETm9kZXMuCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgRGVuc2VNYXBJbmZvPEFBTUROb2Rlcz4geworICBzdGF0aWMgaW5saW5lIEFBTUROb2RlcyBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gQUFNRE5vZGVzKERlbnNlTWFwSW5mbzxNRE5vZGUgKj46OmdldEVtcHR5S2V5KCksCisgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBudWxscHRyKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgQUFNRE5vZGVzIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gQUFNRE5vZGVzKERlbnNlTWFwSW5mbzxNRE5vZGUgKj46OmdldFRvbWJzdG9uZUtleSgpLAorICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0cik7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IEFBTUROb2RlcyAmVmFsKSB7CisgICAgcmV0dXJuIERlbnNlTWFwSW5mbzxNRE5vZGUgKj46OmdldEhhc2hWYWx1ZShWYWwuVEJBQSkgXgorICAgICAgICAgICBEZW5zZU1hcEluZm88TUROb2RlICo+OjpnZXRIYXNoVmFsdWUoVmFsLlNjb3BlKSBeCisgICAgICAgICAgIERlbnNlTWFwSW5mbzxNRE5vZGUgKj46OmdldEhhc2hWYWx1ZShWYWwuTm9BbGlhcyk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IEFBTUROb2RlcyAmTEhTLCBjb25zdCBBQU1ETm9kZXMgJlJIUykgeworICAgIHJldHVybiBMSFMgPT0gUkhTOworICB9Cit9OworCisvLy8gXGJyaWVmIFRyYWNraW5nIG1ldGFkYXRhIHJlZmVyZW5jZSBvd25lZCBieSBNZXRhZGF0YS4KKy8vLworLy8vIFNpbWlsYXIgdG8gXGEgVHJhY2tpbmdNRFJlZiwgYnV0IGl0J3MgZXhwZWN0ZWQgdG8gYmUgb3duZWQgYnkgYW4gaW5zdGFuY2UKKy8vLyBvZiBcYSBNZXRhZGF0YSwgd2hpY2ggaGFzIHRoZSBvcHRpb24gb2YgcmVnaXN0ZXJpbmcgaXRzZWxmIGZvciBjYWxsYmFja3MgdG8KKy8vLyByZS11bmlxdWUgaXRzZWxmLgorLy8vCisvLy8gSW4gcGFydGljdWxhciwgdGhpcyBpcyB1c2VkIGJ5IFxhIE1ETm9kZS4KK2NsYXNzIE1ET3BlcmFuZCB7CisgIE1ldGFkYXRhICpNRCA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgTURPcGVyYW5kKCkgPSBkZWZhdWx0OworICBNRE9wZXJhbmQoTURPcGVyYW5kICYmKSA9IGRlbGV0ZTsKKyAgTURPcGVyYW5kKGNvbnN0IE1ET3BlcmFuZCAmKSA9IGRlbGV0ZTsKKyAgTURPcGVyYW5kICZvcGVyYXRvcj0oTURPcGVyYW5kICYmKSA9IGRlbGV0ZTsKKyAgTURPcGVyYW5kICZvcGVyYXRvcj0oY29uc3QgTURPcGVyYW5kICYpID0gZGVsZXRlOworICB+TURPcGVyYW5kKCkgeyB1bnRyYWNrKCk7IH0KKworICBNZXRhZGF0YSAqZ2V0KCkgY29uc3QgeyByZXR1cm4gTUQ7IH0KKyAgb3BlcmF0b3IgTWV0YWRhdGEgKigpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisgIE1ldGFkYXRhICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gZ2V0KCk7IH0KKyAgTWV0YWRhdGEgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpnZXQoKTsgfQorCisgIHZvaWQgcmVzZXQoKSB7CisgICAgdW50cmFjaygpOworICAgIE1EID0gbnVsbHB0cjsKKyAgfQorICB2b2lkIHJlc2V0KE1ldGFkYXRhICpNRCwgTWV0YWRhdGEgKk93bmVyKSB7CisgICAgdW50cmFjaygpOworICAgIHRoaXMtPk1EID0gTUQ7CisgICAgdHJhY2soT3duZXIpOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgdHJhY2soTWV0YWRhdGEgKk93bmVyKSB7CisgICAgaWYgKE1EKSB7CisgICAgICBpZiAoT3duZXIpCisgICAgICAgIE1ldGFkYXRhVHJhY2tpbmc6OnRyYWNrKHRoaXMsICpNRCwgKk93bmVyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgTWV0YWRhdGFUcmFja2luZzo6dHJhY2soTUQpOworICAgIH0KKyAgfQorCisgIHZvaWQgdW50cmFjaygpIHsKKyAgICBhc3NlcnQoc3RhdGljX2Nhc3Q8dm9pZCAqPih0aGlzKSA9PSAmTUQgJiYgIkV4cGVjdGVkIHNhbWUgYWRkcmVzcyIpOworICAgIGlmIChNRCkKKyAgICAgIE1ldGFkYXRhVHJhY2tpbmc6OnVudHJhY2soTUQpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxNRE9wZXJhbmQ+IHsKKyAgdXNpbmcgU2ltcGxlVHlwZSA9IE1ldGFkYXRhICo7CisKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKE1ET3BlcmFuZCAmTUQpIHsgcmV0dXJuIE1ELmdldCgpOyB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxjb25zdCBNRE9wZXJhbmQ+IHsKKyAgdXNpbmcgU2ltcGxlVHlwZSA9IE1ldGFkYXRhICo7CisKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKGNvbnN0IE1ET3BlcmFuZCAmTUQpIHsgcmV0dXJuIE1ELmdldCgpOyB9Cit9OworCisvLy8gXGJyaWVmIFBvaW50ZXIgdG8gdGhlIGNvbnRleHQsIHdpdGggb3B0aW9uYWwgUkFVVyBzdXBwb3J0LgorLy8vCisvLy8gRWl0aGVyIGEgcmF3IChub24tbnVsbCkgcG9pbnRlciB0byB0aGUgXGEgTExWTUNvbnRleHQsIG9yIGFuIG93bmVkIHBvaW50ZXIKKy8vLyB0byBcYSBSZXBsYWNlYWJsZU1ldGFkYXRhSW1wbCAod2hpY2ggaGFzIGEgcmVmZXJlbmNlIHRvIFxhIExMVk1Db250ZXh0KS4KK2NsYXNzIENvbnRleHRBbmRSZXBsYWNlYWJsZVVzZXMgeworICBQb2ludGVyVW5pb248TExWTUNvbnRleHQgKiwgUmVwbGFjZWFibGVNZXRhZGF0YUltcGwgKj4gUHRyOworCitwdWJsaWM6CisgIENvbnRleHRBbmRSZXBsYWNlYWJsZVVzZXMoTExWTUNvbnRleHQgJkNvbnRleHQpIDogUHRyKCZDb250ZXh0KSB7fQorICBDb250ZXh0QW5kUmVwbGFjZWFibGVVc2VzKAorICAgICAgc3RkOjp1bmlxdWVfcHRyPFJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsPiBSZXBsYWNlYWJsZVVzZXMpCisgICAgICA6IFB0cihSZXBsYWNlYWJsZVVzZXMucmVsZWFzZSgpKSB7CisgICAgYXNzZXJ0KGdldFJlcGxhY2VhYmxlVXNlcygpICYmICJFeHBlY3RlZCBub24tbnVsbCByZXBsYWNlYWJsZSB1c2VzIik7CisgIH0KKyAgQ29udGV4dEFuZFJlcGxhY2VhYmxlVXNlcygpID0gZGVsZXRlOworICBDb250ZXh0QW5kUmVwbGFjZWFibGVVc2VzKENvbnRleHRBbmRSZXBsYWNlYWJsZVVzZXMgJiYpID0gZGVsZXRlOworICBDb250ZXh0QW5kUmVwbGFjZWFibGVVc2VzKGNvbnN0IENvbnRleHRBbmRSZXBsYWNlYWJsZVVzZXMgJikgPSBkZWxldGU7CisgIENvbnRleHRBbmRSZXBsYWNlYWJsZVVzZXMgJm9wZXJhdG9yPShDb250ZXh0QW5kUmVwbGFjZWFibGVVc2VzICYmKSA9IGRlbGV0ZTsKKyAgQ29udGV4dEFuZFJlcGxhY2VhYmxlVXNlcyAmCisgIG9wZXJhdG9yPShjb25zdCBDb250ZXh0QW5kUmVwbGFjZWFibGVVc2VzICYpID0gZGVsZXRlOworICB+Q29udGV4dEFuZFJlcGxhY2VhYmxlVXNlcygpIHsgZGVsZXRlIGdldFJlcGxhY2VhYmxlVXNlcygpOyB9CisKKyAgb3BlcmF0b3IgTExWTUNvbnRleHQgJigpIHsgcmV0dXJuIGdldENvbnRleHQoKTsgfQorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGNvbnRhaW5zIFJBVVcgc3VwcG9ydC4KKyAgYm9vbCBoYXNSZXBsYWNlYWJsZVVzZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIFB0ci5pczxSZXBsYWNlYWJsZU1ldGFkYXRhSW1wbCAqPigpOworICB9CisKKyAgTExWTUNvbnRleHQgJmdldENvbnRleHQoKSBjb25zdCB7CisgICAgaWYgKGhhc1JlcGxhY2VhYmxlVXNlcygpKQorICAgICAgcmV0dXJuIGdldFJlcGxhY2VhYmxlVXNlcygpLT5nZXRDb250ZXh0KCk7CisgICAgcmV0dXJuICpQdHIuZ2V0PExMVk1Db250ZXh0ICo+KCk7CisgIH0KKworICBSZXBsYWNlYWJsZU1ldGFkYXRhSW1wbCAqZ2V0UmVwbGFjZWFibGVVc2VzKCkgY29uc3QgeworICAgIGlmIChoYXNSZXBsYWNlYWJsZVVzZXMoKSkKKyAgICAgIHJldHVybiBQdHIuZ2V0PFJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsICo+KCk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gRW5zdXJlIHRoYXQgdGhpcyBoYXMgUkFVVyBzdXBwb3J0LCBhbmQgdGhlbiByZXR1cm4gaXQuCisgIFJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsICpnZXRPckNyZWF0ZVJlcGxhY2VhYmxlVXNlcygpIHsKKyAgICBpZiAoIWhhc1JlcGxhY2VhYmxlVXNlcygpKQorICAgICAgbWFrZVJlcGxhY2VhYmxlKGxsdm06Om1ha2VfdW5pcXVlPFJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsPihnZXRDb250ZXh0KCkpKTsKKyAgICByZXR1cm4gZ2V0UmVwbGFjZWFibGVVc2VzKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEFzc2lnbiBSQVVXIHN1cHBvcnQgdG8gdGhpcy4KKyAgLy8vCisgIC8vLyBNYWtlIHRoaXMgcmVwbGFjZWFibGUsIHRha2luZyBvd25lcnNoaXAgb2YgXGMgUmVwbGFjZWFibGVVc2VzICh3aGljaCBtdXN0CisgIC8vLyBub3QgYmUgbnVsbCkuCisgIHZvaWQKKyAgbWFrZVJlcGxhY2VhYmxlKHN0ZDo6dW5pcXVlX3B0cjxSZXBsYWNlYWJsZU1ldGFkYXRhSW1wbD4gUmVwbGFjZWFibGVVc2VzKSB7CisgICAgYXNzZXJ0KFJlcGxhY2VhYmxlVXNlcyAmJiAiRXhwZWN0ZWQgbm9uLW51bGwgcmVwbGFjZWFibGUgdXNlcyIpOworICAgIGFzc2VydCgmUmVwbGFjZWFibGVVc2VzLT5nZXRDb250ZXh0KCkgPT0gJmdldENvbnRleHQoKSAmJgorICAgICAgICAgICAiRXhwZWN0ZWQgc2FtZSBjb250ZXh0Iik7CisgICAgZGVsZXRlIGdldFJlcGxhY2VhYmxlVXNlcygpOworICAgIFB0ciA9IFJlcGxhY2VhYmxlVXNlcy5yZWxlYXNlKCk7CisgIH0KKworICAvLy8gXGJyaWVmIERyb3AgUkFVVyBzdXBwb3J0LgorICAvLy8KKyAgLy8vIENlZGUgb3duZXJzaGlwIG9mIFJBVVcgc3VwcG9ydCwgcmV0dXJuaW5nIGl0LgorICBzdGQ6OnVuaXF1ZV9wdHI8UmVwbGFjZWFibGVNZXRhZGF0YUltcGw+IHRha2VSZXBsYWNlYWJsZVVzZXMoKSB7CisgICAgYXNzZXJ0KGhhc1JlcGxhY2VhYmxlVXNlcygpICYmICJFeHBlY3RlZCB0byBvd24gcmVwbGFjZWFibGUgdXNlcyIpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxSZXBsYWNlYWJsZU1ldGFkYXRhSW1wbD4gUmVwbGFjZWFibGVVc2VzKAorICAgICAgICBnZXRSZXBsYWNlYWJsZVVzZXMoKSk7CisgICAgUHRyID0gJlJlcGxhY2VhYmxlVXNlcy0+Z2V0Q29udGV4dCgpOworICAgIHJldHVybiBSZXBsYWNlYWJsZVVzZXM7CisgIH0KK307CisKK3N0cnVjdCBUZW1wTUROb2RlRGVsZXRlciB7CisgIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoTUROb2RlICpOb2RlKSBjb25zdDsKK307CisKKyNkZWZpbmUgSEFORExFX01ETk9ERV9MRUFGKENMQVNTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVzaW5nIFRlbXAjI0NMQVNTID0gc3RkOjp1bmlxdWVfcHRyPENMQVNTLCBUZW1wTUROb2RlRGVsZXRlcj47CisjZGVmaW5lIEhBTkRMRV9NRE5PREVfQlJBTkNIKENMQVNTKSBIQU5ETEVfTUROT0RFX0xFQUYoQ0xBU1MpCisjaW5jbHVkZSAibGx2bS9JUi9NZXRhZGF0YS5kZWYiCisKKy8vLyBcYnJpZWYgTWV0YWRhdGEgbm9kZS4KKy8vLworLy8vIE1ldGFkYXRhIG5vZGVzIGNhbiBiZSB1bmlxdWVkLCBsaWtlIGNvbnN0YW50cywgb3IgZGlzdGluY3QuICBUZW1wb3JhcnkKKy8vLyBtZXRhZGF0YSBub2RlcyAod2l0aCBmdWxsIHN1cHBvcnQgZm9yIFJBVVcpIGNhbiBiZSB1c2VkIHRvIGRlbGF5IHVuaXF1aW5nCisvLy8gdW50aWwgZm9yd2FyZCByZWZlcmVuY2VzIGFyZSBrbm93bi4gIFRoZSBiYXNpYyBtZXRhZGF0YSBub2RlIGlzIGFuIFxhCisvLy8gTURUdXBsZS4KKy8vLworLy8vIFRoZXJlIGlzIGxpbWl0ZWQgc3VwcG9ydCBmb3IgUkFVVyBhdCBjb25zdHJ1Y3Rpb24gdGltZS4gIEF0IGNvbnN0cnVjdGlvbgorLy8vIHRpbWUsIGlmIGFueSBvcGVyYW5kIGlzIGEgdGVtcG9yYXJ5IG5vZGUgKG9yIGFuIHVucmVzb2x2ZWQgdW5pcXVlZCBub2RlLAorLy8vIHdoaWNoIGluZGljYXRlcyBhIHRyYW5zaXRpdmUgdGVtcG9yYXJ5IG9wZXJhbmQpLCB0aGUgbm9kZSBpdHNlbGYgd2lsbCBiZQorLy8vIHVucmVzb2x2ZWQuICBBcyBzb29uIGFzIGFsbCBvcGVyYW5kcyBiZWNvbWUgcmVzb2x2ZWQsIGl0IHdpbGwgZHJvcCBSQVVXCisvLy8gc3VwcG9ydCBwZXJtYW5lbnRseS4KKy8vLworLy8vIElmIGFuIHVucmVzb2x2ZWQgbm9kZSBpcyBwYXJ0IG9mIGEgY3ljbGUsIFxhIHJlc29sdmVDeWNsZXMoKSBuZWVkcworLy8vIHRvIGJlIGNhbGxlZCBvbiBzb21lIG1lbWJlciBvZiB0aGUgY3ljbGUgb25jZSBhbGwgdGVtcG9yYXJ5IG5vZGVzIGhhdmUgYmVlbgorLy8vIHJlcGxhY2VkLgorY2xhc3MgTUROb2RlIDogcHVibGljIE1ldGFkYXRhIHsKKyAgZnJpZW5kIGNsYXNzIFJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsOworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworCisgIHVuc2lnbmVkIE51bU9wZXJhbmRzOworICB1bnNpZ25lZCBOdW1VbnJlc29sdmVkOworCisgIENvbnRleHRBbmRSZXBsYWNlYWJsZVVzZXMgQ29udGV4dDsKKworcHJvdGVjdGVkOgorICBNRE5vZGUoTExWTUNvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIElELCBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzMSwgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzMiA9IE5vbmUpOworICB+TUROb2RlKCkgPSBkZWZhdWx0OworCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgU2l6ZSwgdW5zaWduZWQgTnVtT3BzKTsKKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqTWVtKTsKKworICAvLy8gXGJyaWVmIFJlcXVpcmVkIGJ5IHN0ZCwgYnV0IG5ldmVyIGNhbGxlZC4KKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqLCB1bnNpZ25lZCkgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIkNvbnN0cnVjdG9yIHRocm93cz8iKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVxdWlyZWQgYnkgc3RkLCBidXQgbmV2ZXIgY2FsbGVkLgorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICosIHVuc2lnbmVkLCBib29sKSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiQ29uc3RydWN0b3IgdGhyb3dzPyIpOworICB9CisKKyAgdm9pZCBkcm9wQWxsUmVmZXJlbmNlcygpOworCisgIE1ET3BlcmFuZCAqbXV0YWJsZV9iZWdpbigpIHsgcmV0dXJuIG11dGFibGVfZW5kKCkgLSBOdW1PcGVyYW5kczsgfQorICBNRE9wZXJhbmQgKm11dGFibGVfZW5kKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxNRE9wZXJhbmQgKj4odGhpcyk7IH0KKworICB1c2luZyBtdXRhYmxlX29wX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8TURPcGVyYW5kICo+OworCisgIG11dGFibGVfb3BfcmFuZ2UgbXV0YWJsZV9vcGVyYW5kcygpIHsKKyAgICByZXR1cm4gbXV0YWJsZV9vcF9yYW5nZShtdXRhYmxlX2JlZ2luKCksIG11dGFibGVfZW5kKCkpOworICB9CisKK3B1YmxpYzoKKyAgTUROb2RlKGNvbnN0IE1ETm9kZSAmKSA9IGRlbGV0ZTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTUROb2RlICYpID0gZGVsZXRlOworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90KSA9IGRlbGV0ZTsKKworICBzdGF0aWMgaW5saW5lIE1EVHVwbGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8TWV0YWRhdGEgKj4gTURzKTsKKyAgc3RhdGljIGlubGluZSBNRFR1cGxlICpnZXRJZkV4aXN0cyhMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBNRHMpOworICBzdGF0aWMgaW5saW5lIE1EVHVwbGUgKmdldERpc3RpbmN0KExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE1ldGFkYXRhICo+IE1Ecyk7CisgIHN0YXRpYyBpbmxpbmUgVGVtcE1EVHVwbGUgZ2V0VGVtcG9yYXJ5KExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBNRHMpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgKHRlbXBvcmFyeSkgY2xvbmUgb2YgdGhpcy4KKyAgVGVtcE1ETm9kZSBjbG9uZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRGVhbGxvY2F0ZSBhIG5vZGUgY3JlYXRlZCBieSBnZXRUZW1wb3JhcnkuCisgIC8vLworICAvLy8gQ2FsbHMgXGMgcmVwbGFjZUFsbFVzZXNXaXRoKG51bGxwdHIpIGJlZm9yZSBkZWxldGluZywgc28gYW55IHJlbWFpbmluZworICAvLy8gcmVmZXJlbmNlcyB3aWxsIGJlIHJlc2V0LgorICBzdGF0aWMgdm9pZCBkZWxldGVUZW1wb3JhcnkoTUROb2RlICpOKTsKKworICBMTFZNQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIENvbnRleHQuZ2V0Q29udGV4dCgpOyB9CisKKyAgLy8vIFxicmllZiBSZXBsYWNlIGEgc3BlY2lmaWMgb3BlcmFuZC4KKyAgdm9pZCByZXBsYWNlT3BlcmFuZFdpdGgodW5zaWduZWQgSSwgTWV0YWRhdGEgKk5ldyk7CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiBub2RlIGlzIGZ1bGx5IHJlc29sdmVkLgorICAvLy8KKyAgLy8vIElmIFxhIGlzVGVtcG9yYXJ5KCksIHRoaXMgYWx3YXlzIHJldHVybnMgXGMgZmFsc2U7IGlmIFxhIGlzRGlzdGluY3QoKSwKKyAgLy8vIHRoaXMgYWx3YXlzIHJldHVybnMgXGMgdHJ1ZS4KKyAgLy8vCisgIC8vLyBJZiBcYSBpc1VuaXF1ZWQoKSwgcmV0dXJucyBcYyB0cnVlIGlmIHRoaXMgaGFzIGFscmVhZHkgZHJvcHBlZCBSQVVXCisgIC8vLyBzdXBwb3J0IChiZWNhdXNlIGFsbCBvcGVyYW5kcyBhcmUgcmVzb2x2ZWQpLgorICAvLy8KKyAgLy8vIEFzIGZvcndhcmQgZGVjbGFyYXRpb25zIGFyZSByZXNvbHZlZCwgdGhlaXIgY29udGFpbmVycyBzaG91bGQgZ2V0CisgIC8vLyByZXNvbHZlZCBhdXRvbWF0aWNhbGx5LiAgSG93ZXZlciwgaWYgdGhpcyAob3Igb25lIG9mIGl0cyBvcGVyYW5kcykgaXMKKyAgLy8vIGludm9sdmVkIGluIGEgY3ljbGUsIFxhIHJlc29sdmVDeWNsZXMoKSBuZWVkcyB0byBiZSBjYWxsZWQgZXhwbGljaXRseS4KKyAgYm9vbCBpc1Jlc29sdmVkKCkgY29uc3QgeyByZXR1cm4gIWlzVGVtcG9yYXJ5KCkgJiYgIU51bVVucmVzb2x2ZWQ7IH0KKworICBib29sIGlzVW5pcXVlZCgpIGNvbnN0IHsgcmV0dXJuIFN0b3JhZ2UgPT0gVW5pcXVlZDsgfQorICBib29sIGlzRGlzdGluY3QoKSBjb25zdCB7IHJldHVybiBTdG9yYWdlID09IERpc3RpbmN0OyB9CisgIGJvb2wgaXNUZW1wb3JhcnkoKSBjb25zdCB7IHJldHVybiBTdG9yYWdlID09IFRlbXBvcmFyeTsgfQorCisgIC8vLyBcYnJpZWYgUkFVVyBhIHRlbXBvcmFyeS4KKyAgLy8vCisgIC8vLyBccHJlIFxhIGlzVGVtcG9yYXJ5KCkgbXVzdCBiZSBcYyB0cnVlLgorICB2b2lkIHJlcGxhY2VBbGxVc2VzV2l0aChNZXRhZGF0YSAqTUQpIHsKKyAgICBhc3NlcnQoaXNUZW1wb3JhcnkoKSAmJiAiRXhwZWN0ZWQgdGVtcG9yYXJ5IG5vZGUiKTsKKyAgICBpZiAoQ29udGV4dC5oYXNSZXBsYWNlYWJsZVVzZXMoKSkKKyAgICAgIENvbnRleHQuZ2V0UmVwbGFjZWFibGVVc2VzKCktPnJlcGxhY2VBbGxVc2VzV2l0aChNRCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlc29sdmUgY3ljbGVzLgorICAvLy8KKyAgLy8vIE9uY2UgYWxsIGZvcndhcmQgZGVjbGFyYXRpb25zIGhhdmUgYmVlbiByZXNvbHZlZCwgZm9yY2UgY3ljbGVzIHRvIGJlCisgIC8vLyByZXNvbHZlZC4KKyAgLy8vCisgIC8vLyBccHJlIE5vIG9wZXJhbmRzIChvciBvcGVyYW5kcycgb3BlcmFuZHMsIGV0Yy4pIGhhdmUgXGEgaXNUZW1wb3JhcnkoKS4KKyAgdm9pZCByZXNvbHZlQ3ljbGVzKCk7CisKKyAgLy8vIFJlc29sdmUgYSB1bmlxdWUsIHVucmVzb2x2ZWQgbm9kZS4KKyAgdm9pZCByZXNvbHZlKCk7CisKKyAgLy8vIFxicmllZiBSZXBsYWNlIGEgdGVtcG9yYXJ5IG5vZGUgd2l0aCBhIHBlcm1hbmVudCBvbmUuCisgIC8vLworICAvLy8gVHJ5IHRvIGNyZWF0ZSBhIHVuaXF1ZWQgdmVyc2lvbiBvZiBcYyBOIC0tIGluIHBsYWNlLCBpZiBwb3NzaWJsZSAtLSBhbmQKKyAgLy8vIHJldHVybiBpdC4gIElmIFxjIE4gY2Fubm90IGJlIHVuaXF1ZWQsIHJldHVybiBhIGRpc3RpbmN0IG5vZGUgaW5zdGVhZC4KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHN0YXRpYyB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Jhc2Vfb2Y8TUROb2RlLCBUPjo6dmFsdWUsIFQgKj46OnR5cGUKKyAgcmVwbGFjZVdpdGhQZXJtYW5lbnQoc3RkOjp1bmlxdWVfcHRyPFQsIFRlbXBNRE5vZGVEZWxldGVyPiBOKSB7CisgICAgcmV0dXJuIGNhc3Q8VD4oTi5yZWxlYXNlKCktPnJlcGxhY2VXaXRoUGVybWFuZW50SW1wbCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVwbGFjZSBhIHRlbXBvcmFyeSBub2RlIHdpdGggYSB1bmlxdWVkIG9uZS4KKyAgLy8vCisgIC8vLyBDcmVhdGUgYSB1bmlxdWVkIHZlcnNpb24gb2YgXGMgTiAtLSBpbiBwbGFjZSwgaWYgcG9zc2libGUgLS0gYW5kIHJldHVybgorICAvLy8gaXQuICBUYWtlcyBvd25lcnNoaXAgb2YgdGhlIHRlbXBvcmFyeSBub2RlLgorICAvLy8KKyAgLy8vIFxwcmUgTiBkb2VzIG5vdCBzZWxmLXJlZmVyZW5jZS4KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHN0YXRpYyB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Jhc2Vfb2Y8TUROb2RlLCBUPjo6dmFsdWUsIFQgKj46OnR5cGUKKyAgcmVwbGFjZVdpdGhVbmlxdWVkKHN0ZDo6dW5pcXVlX3B0cjxULCBUZW1wTUROb2RlRGVsZXRlcj4gTikgeworICAgIHJldHVybiBjYXN0PFQ+KE4ucmVsZWFzZSgpLT5yZXBsYWNlV2l0aFVuaXF1ZWRJbXBsKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXBsYWNlIGEgdGVtcG9yYXJ5IG5vZGUgd2l0aCBhIGRpc3RpbmN0IG9uZS4KKyAgLy8vCisgIC8vLyBDcmVhdGUgYSBkaXN0aW5jdCB2ZXJzaW9uIG9mIFxjIE4gLS0gaW4gcGxhY2UsIGlmIHBvc3NpYmxlIC0tIGFuZCByZXR1cm4KKyAgLy8vIGl0LiAgVGFrZXMgb3duZXJzaGlwIG9mIHRoZSB0ZW1wb3Jhcnkgbm9kZS4KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHN0YXRpYyB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Jhc2Vfb2Y8TUROb2RlLCBUPjo6dmFsdWUsIFQgKj46OnR5cGUKKyAgcmVwbGFjZVdpdGhEaXN0aW5jdChzdGQ6OnVuaXF1ZV9wdHI8VCwgVGVtcE1ETm9kZURlbGV0ZXI+IE4pIHsKKyAgICByZXR1cm4gY2FzdDxUPihOLnJlbGVhc2UoKS0+cmVwbGFjZVdpdGhEaXN0aW5jdEltcGwoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgTUROb2RlICpyZXBsYWNlV2l0aFBlcm1hbmVudEltcGwoKTsKKyAgTUROb2RlICpyZXBsYWNlV2l0aFVuaXF1ZWRJbXBsKCk7CisgIE1ETm9kZSAqcmVwbGFjZVdpdGhEaXN0aW5jdEltcGwoKTsKKworcHJvdGVjdGVkOgorICAvLy8gXGJyaWVmIFNldCBhbiBvcGVyYW5kLgorICAvLy8KKyAgLy8vIFNldHMgdGhlIG9wZXJhbmQgZGlyZWN0bHksIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgdW5pcXVpbmcuCisgIHZvaWQgc2V0T3BlcmFuZCh1bnNpZ25lZCBJLCBNZXRhZGF0YSAqTmV3KTsKKworICB2b2lkIHN0b3JlRGlzdGluY3RJbkNvbnRleHQoKTsKKyAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFN0b3JlVD4KKyAgc3RhdGljIFQgKnN0b3JlSW1wbChUICpOLCBTdG9yYWdlVHlwZSBTdG9yYWdlLCBTdG9yZVQgJlN0b3JlKTsKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0YXRpYyBUICpzdG9yZUltcGwoVCAqTiwgU3RvcmFnZVR5cGUgU3RvcmFnZSk7CisKK3ByaXZhdGU6CisgIHZvaWQgaGFuZGxlQ2hhbmdlZE9wZXJhbmQodm9pZCAqUmVmLCBNZXRhZGF0YSAqTmV3KTsKKworICAvLy8gRHJvcCBSQVVXIHN1cHBvcnQsIGlmIGFueS4KKyAgdm9pZCBkcm9wUmVwbGFjZWFibGVVc2VzKCk7CisKKyAgdm9pZCByZXNvbHZlQWZ0ZXJPcGVyYW5kQ2hhbmdlKE1ldGFkYXRhICpPbGQsIE1ldGFkYXRhICpOZXcpOworICB2b2lkIGRlY3JlbWVudFVucmVzb2x2ZWRPcGVyYW5kQ291bnQoKTsKKyAgdm9pZCBjb3VudFVucmVzb2x2ZWRPcGVyYW5kcygpOworCisgIC8vLyBcYnJpZWYgTXV0YXRlIHRoaXMgdG8gYmUgInVuaXF1ZWQiLgorICAvLy8KKyAgLy8vIE11dGF0ZSB0aGlzIHNvIHRoYXQgXGEgaXNVbmlxdWVkKCkuCisgIC8vLyBccHJlIFxhIGlzVGVtcG9yYXJ5KCkuCisgIC8vLyBccHJlIGFscmVhZHkgYWRkZWQgdG8gdW5pcXVpbmcgc2V0LgorICB2b2lkIG1ha2VVbmlxdWVkKCk7CisKKyAgLy8vIFxicmllZiBNdXRhdGUgdGhpcyB0byBiZSAiZGlzdGluY3QiLgorICAvLy8KKyAgLy8vIE11dGF0ZSB0aGlzIHNvIHRoYXQgXGEgaXNEaXN0aW5jdCgpLgorICAvLy8gXHByZSBcYSBpc1RlbXBvcmFyeSgpLgorICB2b2lkIG1ha2VEaXN0aW5jdCgpOworCisgIHZvaWQgZGVsZXRlQXNTdWJjbGFzcygpOworICBNRE5vZGUgKnVuaXF1aWZ5KCk7CisgIHZvaWQgZXJhc2VGcm9tU3RvcmUoKTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgTm9kZVR5PiBzdHJ1Y3QgSGFzQ2FjaGVkSGFzaDsKKyAgdGVtcGxhdGUgPGNsYXNzIE5vZGVUeT4KKyAgc3RhdGljIHZvaWQgZGlzcGF0Y2hSZWNhbGN1bGF0ZUhhc2goTm9kZVR5ICpOLCBzdGQ6OnRydWVfdHlwZSkgeworICAgIE4tPnJlY2FsY3VsYXRlSGFzaCgpOworICB9CisgIHRlbXBsYXRlIDxjbGFzcyBOb2RlVHk+CisgIHN0YXRpYyB2b2lkIGRpc3BhdGNoUmVjYWxjdWxhdGVIYXNoKE5vZGVUeSAqLCBzdGQ6OmZhbHNlX3R5cGUpIHt9CisgIHRlbXBsYXRlIDxjbGFzcyBOb2RlVHk+CisgIHN0YXRpYyB2b2lkIGRpc3BhdGNoUmVzZXRIYXNoKE5vZGVUeSAqTiwgc3RkOjp0cnVlX3R5cGUpIHsKKyAgICBOLT5zZXRIYXNoKDApOworICB9CisgIHRlbXBsYXRlIDxjbGFzcyBOb2RlVHk+CisgIHN0YXRpYyB2b2lkIGRpc3BhdGNoUmVzZXRIYXNoKE5vZGVUeSAqLCBzdGQ6OmZhbHNlX3R5cGUpIHt9CisKK3B1YmxpYzoKKyAgdXNpbmcgb3BfaXRlcmF0b3IgPSBjb25zdCBNRE9wZXJhbmQgKjsKKyAgdXNpbmcgb3BfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxvcF9pdGVyYXRvcj47CisKKyAgb3BfaXRlcmF0b3Igb3BfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TUROb2RlICo+KHRoaXMpLT5tdXRhYmxlX2JlZ2luKCk7CisgIH0KKworICBvcF9pdGVyYXRvciBvcF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TUROb2RlICo+KHRoaXMpLT5tdXRhYmxlX2VuZCgpOworICB9CisKKyAgb3BfcmFuZ2Ugb3BlcmFuZHMoKSBjb25zdCB7IHJldHVybiBvcF9yYW5nZShvcF9iZWdpbigpLCBvcF9lbmQoKSk7IH0KKworICBjb25zdCBNRE9wZXJhbmQgJmdldE9wZXJhbmQodW5zaWduZWQgSSkgY29uc3QgeworICAgIGFzc2VydChJIDwgTnVtT3BlcmFuZHMgJiYgIk91dCBvZiByYW5nZSIpOworICAgIHJldHVybiBvcF9iZWdpbigpW0ldOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gbnVtYmVyIG9mIE1ETm9kZSBvcGVyYW5kcy4KKyAgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdCB7IHJldHVybiBOdW1PcGVyYW5kczsgfQorCisgIC8vLyBcYnJpZWYgTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICBzd2l0Y2ggKE1ELT5nZXRNZXRhZGF0YUlEKCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworI2RlZmluZSBIQU5ETEVfTUROT0RFX0xFQUYoQ0xBU1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBDTEFTUyMjS2luZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHRydWU7CisjaW5jbHVkZSAibGx2bS9JUi9NZXRhZGF0YS5kZWYiCisgICAgfQorICB9CisKKyAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIE1ETm9kZSBpcyBhIHZ0YWJsZSBhY2Nlc3MuCisgIGJvb2wgaXNUQkFBVnRhYmxlQWNjZXNzKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBNZXRob2RzIGZvciBtZXRhZGF0YSBtZXJnaW5nLgorICBzdGF0aWMgTUROb2RlICpjb25jYXRlbmF0ZShNRE5vZGUgKkEsIE1ETm9kZSAqQik7CisgIHN0YXRpYyBNRE5vZGUgKmludGVyc2VjdChNRE5vZGUgKkEsIE1ETm9kZSAqQik7CisgIHN0YXRpYyBNRE5vZGUgKmdldE1vc3RHZW5lcmljVEJBQShNRE5vZGUgKkEsIE1ETm9kZSAqQik7CisgIHN0YXRpYyBNRE5vZGUgKmdldE1vc3RHZW5lcmljRlBNYXRoKE1ETm9kZSAqQSwgTUROb2RlICpCKTsKKyAgc3RhdGljIE1ETm9kZSAqZ2V0TW9zdEdlbmVyaWNSYW5nZShNRE5vZGUgKkEsIE1ETm9kZSAqQik7CisgIHN0YXRpYyBNRE5vZGUgKmdldE1vc3RHZW5lcmljQWxpYXNTY29wZShNRE5vZGUgKkEsIE1ETm9kZSAqQik7CisgIHN0YXRpYyBNRE5vZGUgKmdldE1vc3RHZW5lcmljQWxpZ25tZW50T3JEZXJlZmVyZW5jZWFibGUoTUROb2RlICpBLCBNRE5vZGUgKkIpOworfTsKKworLy8vIFxicmllZiBUdXBsZSBvZiBtZXRhZGF0YS4KKy8vLworLy8vIFRoaXMgaXMgdGhlIHNpbXBsZSBcYSBNRE5vZGUgYXJiaXRyYXJ5IHR1cGxlLiAgTm9kZXMgYXJlIHVuaXF1ZWQgYnkKKy8vLyBkZWZhdWx0IGJhc2VkIG9uIHRoZWlyIG9wZXJhbmRzLgorY2xhc3MgTURUdXBsZSA6IHB1YmxpYyBNRE5vZGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIE1EVHVwbGUoTExWTUNvbnRleHQgJkMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIHVuc2lnbmVkIEhhc2gsCisgICAgICAgICAgQXJyYXlSZWY8TWV0YWRhdGEgKj4gVmFscykKKyAgICAgIDogTUROb2RlKEMsIE1EVHVwbGVLaW5kLCBTdG9yYWdlLCBWYWxzKSB7CisgICAgc2V0SGFzaChIYXNoKTsKKyAgfQorCisgIH5NRFR1cGxlKCkgeyBkcm9wQWxsUmVmZXJlbmNlcygpOyB9CisKKyAgdm9pZCBzZXRIYXNoKHVuc2lnbmVkIEhhc2gpIHsgU3ViY2xhc3NEYXRhMzIgPSBIYXNoOyB9CisgIHZvaWQgcmVjYWxjdWxhdGVIYXNoKCk7CisKKyAgc3RhdGljIE1EVHVwbGUgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIEFycmF5UmVmPE1ldGFkYXRhICo+IE1EcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wTURUdXBsZSBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvcjxNZXRhZGF0YSAqLCA0PihvcF9iZWdpbigpLCBvcF9lbmQoKSkpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBHZXQgdGhlIGhhc2gsIGlmIGFueS4KKyAgdW5zaWduZWQgZ2V0SGFzaCgpIGNvbnN0IHsgcmV0dXJuIFN1YmNsYXNzRGF0YTMyOyB9CisKKyAgc3RhdGljIE1EVHVwbGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8TWV0YWRhdGEgKj4gTURzKSB7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgTURzLCBVbmlxdWVkKTsKKyAgfQorCisgIHN0YXRpYyBNRFR1cGxlICpnZXRJZkV4aXN0cyhMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8TWV0YWRhdGEgKj4gTURzKSB7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgTURzLCBVbmlxdWVkLCAvKiBTaG91bGRDcmVhdGUgKi8gZmFsc2UpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSBkaXN0aW5jdCBub2RlLgorICAvLy8KKyAgLy8vIFJldHVybiBhIGRpc3RpbmN0IG5vZGUgLS0gaS5lLiwgYSBub2RlIHRoYXQgaXMgbm90IHVuaXF1ZWQuCisgIHN0YXRpYyBNRFR1cGxlICpnZXREaXN0aW5jdChMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8TWV0YWRhdGEgKj4gTURzKSB7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgTURzLCBEaXN0aW5jdCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhIHRlbXBvcmFyeSBub2RlLgorICAvLy8KKyAgLy8vIEZvciB1c2UgaW4gY29uc3RydWN0aW5nIGN5Y2xpYyBNRE5vZGUgc3RydWN0dXJlcy4gQSB0ZW1wb3JhcnkgTUROb2RlIGlzCisgIC8vLyBub3QgdW5pcXVlZCwgbWF5IGJlIFJBVVcnZCwgYW5kIG11c3QgYmUgbWFudWFsbHkgZGVsZXRlZCB3aXRoCisgIC8vLyBkZWxldGVUZW1wb3JhcnkuCisgIHN0YXRpYyBUZW1wTURUdXBsZSBnZXRUZW1wb3JhcnkoTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8TWV0YWRhdGEgKj4gTURzKSB7CisgICAgcmV0dXJuIFRlbXBNRFR1cGxlKGdldEltcGwoQ29udGV4dCwgTURzLCBUZW1wb3JhcnkpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgKHRlbXBvcmFyeSkgY2xvbmUgb2YgdGhpcy4KKyAgVGVtcE1EVHVwbGUgY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gTURUdXBsZUtpbmQ7CisgIH0KK307CisKK01EVHVwbGUgKk1ETm9kZTo6Z2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBBcnJheVJlZjxNZXRhZGF0YSAqPiBNRHMpIHsKKyAgcmV0dXJuIE1EVHVwbGU6OmdldChDb250ZXh0LCBNRHMpOworfQorCitNRFR1cGxlICpNRE5vZGU6OmdldElmRXhpc3RzKExMVk1Db250ZXh0ICZDb250ZXh0LCBBcnJheVJlZjxNZXRhZGF0YSAqPiBNRHMpIHsKKyAgcmV0dXJuIE1EVHVwbGU6OmdldElmRXhpc3RzKENvbnRleHQsIE1Ecyk7Cit9CisKK01EVHVwbGUgKk1ETm9kZTo6Z2V0RGlzdGluY3QoTExWTUNvbnRleHQgJkNvbnRleHQsIEFycmF5UmVmPE1ldGFkYXRhICo+IE1EcykgeworICByZXR1cm4gTURUdXBsZTo6Z2V0RGlzdGluY3QoQ29udGV4dCwgTURzKTsKK30KKworVGVtcE1EVHVwbGUgTUROb2RlOjpnZXRUZW1wb3JhcnkoTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBNRHMpIHsKKyAgcmV0dXJuIE1EVHVwbGU6OmdldFRlbXBvcmFyeShDb250ZXh0LCBNRHMpOworfQorCit2b2lkIFRlbXBNRE5vZGVEZWxldGVyOjpvcGVyYXRvcigpKE1ETm9kZSAqTm9kZSkgY29uc3QgeworICBNRE5vZGU6OmRlbGV0ZVRlbXBvcmFyeShOb2RlKTsKK30KKworLy8vIFxicmllZiBUeXBlZCBpdGVyYXRvciB0aHJvdWdoIE1ETm9kZSBvcGVyYW5kcy4KKy8vLworLy8vIEFuIGl0ZXJhdG9yIHRoYXQgdHJhbnNmb3JtcyBhbiBcYSBNRE5vZGU6Oml0ZXJhdG9yIGludG8gYW4gaXRlcmF0b3Igb3ZlciBhCisvLy8gcGFydGljdWxhciBNZXRhZGF0YSBzdWJjbGFzcy4KK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgVHlwZWRNRE9wZXJhbmRJdGVyYXRvcgorICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjppbnB1dF9pdGVyYXRvcl90YWcsIFQgKiwgc3RkOjpwdHJkaWZmX3QsIHZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUICo+IHsKKyAgTUROb2RlOjpvcF9pdGVyYXRvciBJID0gbnVsbHB0cjsKKworcHVibGljOgorICBUeXBlZE1ET3BlcmFuZEl0ZXJhdG9yKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBUeXBlZE1ET3BlcmFuZEl0ZXJhdG9yKE1ETm9kZTo6b3BfaXRlcmF0b3IgSSkgOiBJKEkpIHt9CisKKyAgVCAqb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gY2FzdF9vcl9udWxsPFQ+KCpJKTsgfQorCisgIFR5cGVkTURPcGVyYW5kSXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgKytJOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFR5cGVkTURPcGVyYW5kSXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBUeXBlZE1ET3BlcmFuZEl0ZXJhdG9yIFRlbXAoKnRoaXMpOworICAgICsrSTsKKyAgICByZXR1cm4gVGVtcDsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUeXBlZE1ET3BlcmFuZEl0ZXJhdG9yICZYKSBjb25zdCB7IHJldHVybiBJID09IFguSTsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgVHlwZWRNRE9wZXJhbmRJdGVyYXRvciAmWCkgY29uc3QgeyByZXR1cm4gSSAhPSBYLkk7IH0KK307CisKKy8vLyBcYnJpZWYgVHlwZWQsIGFycmF5LWxpa2UgdHVwbGUgb2YgbWV0YWRhdGEuCisvLy8KKy8vLyBUaGlzIGlzIGEgd3JhcHBlciBmb3IgXGEgTURUdXBsZSB0aGF0IG1ha2VzIGl0IGFjdCBsaWtlIGFuIGFycmF5IGhvbGRpbmcgYQorLy8vIHBhcnRpY3VsYXIgdHlwZSBvZiBtZXRhZGF0YS4KK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBNRFR1cGxlVHlwZWRBcnJheVdyYXBwZXIgeworICBjb25zdCBNRFR1cGxlICpOID0gbnVsbHB0cjsKKworcHVibGljOgorICBNRFR1cGxlVHlwZWRBcnJheVdyYXBwZXIoKSA9IGRlZmF1bHQ7CisgIE1EVHVwbGVUeXBlZEFycmF5V3JhcHBlcihjb25zdCBNRFR1cGxlICpOKSA6IE4oTikge30KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVT4KKyAgTURUdXBsZVR5cGVkQXJyYXlXcmFwcGVyKAorICAgICAgY29uc3QgTURUdXBsZVR5cGVkQXJyYXlXcmFwcGVyPFU+ICZPdGhlciwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8VSAqLCBUICo+Ojp2YWx1ZT46OnR5cGUgKiA9CisgICAgICAgICAgbnVsbHB0cikKKyAgICAgIDogTihPdGhlci5nZXQoKSkge30KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVT4KKyAgZXhwbGljaXQgTURUdXBsZVR5cGVkQXJyYXlXcmFwcGVyKAorICAgICAgY29uc3QgTURUdXBsZVR5cGVkQXJyYXlXcmFwcGVyPFU+ICZPdGhlciwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX2NvbnZlcnRpYmxlPFUgKiwgVCAqPjo6dmFsdWU+Ojp0eXBlICogPQorICAgICAgICAgIG51bGxwdHIpCisgICAgICA6IE4oT3RoZXIuZ2V0KCkpIHt9CisKKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisgIGV4cGxpY2l0IG9wZXJhdG9yIE1EVHVwbGUgKigpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisKKyAgTURUdXBsZSAqZ2V0KCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxNRFR1cGxlICo+KE4pOyB9CisgIE1EVHVwbGUgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBnZXQoKTsgfQorICBNRFR1cGxlICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqZ2V0KCk7IH0KKworICAvLyBGSVhNRTogRml4IGNhbGxlcnMgYW5kIHJlbW92ZSBjb25kaXRpb24gb24gTi4KKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE4gPyBOLT5nZXROdW1PcGVyYW5kcygpIDogMHU7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIE4gPyBOLT5nZXROdW1PcGVyYW5kcygpID09IDAgOiB0cnVlOyB9CisgIFQgKm9wZXJhdG9yW10odW5zaWduZWQgSSkgY29uc3QgeyByZXR1cm4gY2FzdF9vcl9udWxsPFQ+KE4tPmdldE9wZXJhbmQoSSkpOyB9CisKKyAgLy8gRklYTUU6IEZpeCBjYWxsZXJzIGFuZCByZW1vdmUgY29uZGl0aW9uIG9uIE4uCisgIHVzaW5nIGl0ZXJhdG9yID0gVHlwZWRNRE9wZXJhbmRJdGVyYXRvcjxUPjsKKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIE4gPyBpdGVyYXRvcihOLT5vcF9iZWdpbigpKSA6IGl0ZXJhdG9yKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gTiA/IGl0ZXJhdG9yKE4tPm9wX2VuZCgpKSA6IGl0ZXJhdG9yKCk7IH0KK307CisKKyNkZWZpbmUgSEFORExFX01FVEFEQVRBKENMQVNTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVzaW5nIENMQVNTIyNBcnJheSA9IE1EVHVwbGVUeXBlZEFycmF5V3JhcHBlcjxDTEFTUz47CisjaW5jbHVkZSAibGx2bS9JUi9NZXRhZGF0YS5kZWYiCisKKy8vLyBQbGFjZWhvbGRlciBtZXRhZGF0YSBmb3Igb3BlcmFuZHMgb2YgZGlzdGluY3QgTUROb2Rlcy4KKy8vLworLy8vIFRoaXMgaXMgYSBsaWdodHdlaWdodCBwbGFjZWhvbGRlciBmb3IgYW4gb3BlcmFuZCBvZiBhIGRpc3RpbmN0IG5vZGUuICBJdCdzCisvLy8gcHVycG9zZSBpcyB0byBoZWxwIHRyYWNrIGZvcndhcmQgcmVmZXJlbmNlcyB3aGVuIGNyZWF0aW5nIGEgZGlzdGluY3Qgbm9kZS4KKy8vLyBUaGlzIGFsbG93cyBkaXN0aW5jdCBub2RlcyBpbnZvbHZlZCBpbiBhIGN5Y2xlIHRvIGJlIGNvbnN0cnVjdGVkIGJlZm9yZQorLy8vIHRoZWlyIG9wZXJhbmRzIHdpdGhvdXQgcmVxdWlyaW5nIGEgaGVhdnl3ZWlnaHQgdGVtcG9yYXJ5IG5vZGUgd2l0aAorLy8vIGZ1bGwtYmxvd24gUkFVVyBzdXBwb3J0LgorLy8vCisvLy8gRWFjaCBwbGFjZWhvbGRlciBzdXBwb3J0cyBvbmx5IGEgc2luZ2xlIE1ETm9kZSB1c2VyLiAgQ2xpZW50cyBzaG91bGQgcGFzcworLy8vIGFuIElELCByZXRyaWV2ZWQgdmlhIFxhIGdldElEKCksIHRvIGluZGljYXRlIHRoZSAicmVhbCIgb3BlcmFuZCB0aGF0IHRoaXMKKy8vLyBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aC4KKy8vLworLy8vIFdoaWxlIGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGltcGxlbWVudCBtb3ZlIG9wZXJhdG9ycywgdGhleSB3b3VsZCBiZQorLy8vIGZhaXJseSBleHBlbnNpdmUuICBMZWF2ZSB0aGVtIHVuaW1wbGVtZW50ZWQgdG8gZGlzY291cmFnZSB0aGVpciB1c2UKKy8vLyAoY2xpZW50cyBjYW4gdXNlIHN0ZDo6ZGVxdWUsIHN0ZDo6bGlzdCwgQnVtcFB0ckFsbG9jYXRvciwgZXRjLikuCitjbGFzcyBEaXN0aW5jdE1ET3BlcmFuZFBsYWNlaG9sZGVyIDogcHVibGljIE1ldGFkYXRhIHsKKyAgZnJpZW5kIGNsYXNzIE1ldGFkYXRhVHJhY2tpbmc7CisKKyAgTWV0YWRhdGEgKipVc2UgPSBudWxscHRyOworCitwdWJsaWM6CisgIGV4cGxpY2l0IERpc3RpbmN0TURPcGVyYW5kUGxhY2Vob2xkZXIodW5zaWduZWQgSUQpCisgICAgICA6IE1ldGFkYXRhKERpc3RpbmN0TURPcGVyYW5kUGxhY2Vob2xkZXJLaW5kLCBEaXN0aW5jdCkgeworICAgIFN1YmNsYXNzRGF0YTMyID0gSUQ7CisgIH0KKworICBEaXN0aW5jdE1ET3BlcmFuZFBsYWNlaG9sZGVyKCkgPSBkZWxldGU7CisgIERpc3RpbmN0TURPcGVyYW5kUGxhY2Vob2xkZXIoRGlzdGluY3RNRE9wZXJhbmRQbGFjZWhvbGRlciAmJikgPSBkZWxldGU7CisgIERpc3RpbmN0TURPcGVyYW5kUGxhY2Vob2xkZXIoY29uc3QgRGlzdGluY3RNRE9wZXJhbmRQbGFjZWhvbGRlciAmKSA9IGRlbGV0ZTsKKworICB+RGlzdGluY3RNRE9wZXJhbmRQbGFjZWhvbGRlcigpIHsKKyAgICBpZiAoVXNlKQorICAgICAgKlVzZSA9IG51bGxwdHI7CisgIH0KKworICB1bnNpZ25lZCBnZXRJRCgpIGNvbnN0IHsgcmV0dXJuIFN1YmNsYXNzRGF0YTMyOyB9CisKKyAgLy8vIFJlcGxhY2UgdGhlIHVzZSBvZiB0aGlzIHdpdGggTUQuCisgIHZvaWQgcmVwbGFjZVVzZVdpdGgoTWV0YWRhdGEgKk1EKSB7CisgICAgaWYgKCFVc2UpCisgICAgICByZXR1cm47CisgICAgKlVzZSA9IE1EOworCisgICAgaWYgKCpVc2UpCisgICAgICBNZXRhZGF0YVRyYWNraW5nOjp0cmFjaygqVXNlKTsKKworICAgIE1ldGFkYXRhICpUID0gY2FzdDxNZXRhZGF0YT4odGhpcyk7CisgICAgTWV0YWRhdGFUcmFja2luZzo6dW50cmFjayhUKTsKKyAgICBhc3NlcnQoIVVzZSAmJiAiVXNlIGlzIHN0aWxsIGJlaW5nIHRyYWNrZWQgZGVzcGl0ZSBiZWluZyB1bnRyYWNrZWQhIik7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGJyaWVmIEEgdHVwbGUgb2YgTUROb2Rlcy4KKy8vLworLy8vIERlc3BpdGUgaXRzIG5hbWUsIGEgTmFtZWRNRE5vZGUgaXNuJ3QgaXRzZWxmIGFuIE1ETm9kZS4gTmFtZWRNRE5vZGVzIGJlbG9uZworLy8vIHRvIG1vZHVsZXMsIGhhdmUgbmFtZXMsIGFuZCBjb250YWluIGxpc3RzIG9mIE1ETm9kZXMuCisvLy8KKy8vLyBUT0RPOiBJbmhlcml0IGZyb20gTWV0YWRhdGEuCitjbGFzcyBOYW1lZE1ETm9kZSA6IHB1YmxpYyBpbGlzdF9ub2RlPE5hbWVkTUROb2RlPiB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNb2R1bGU7CisKKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgTW9kdWxlICpQYXJlbnQgPSBudWxscHRyOworICB2b2lkICpPcGVyYW5kczsgLy8gU21hbGxWZWN0b3I8VHJhY2tpbmdNRFJlZiwgND4KKworICB2b2lkIHNldFBhcmVudChNb2R1bGUgKk0pIHsgUGFyZW50ID0gTTsgfQorCisgIGV4cGxpY2l0IE5hbWVkTUROb2RlKGNvbnN0IFR3aW5lICZOKTsKKworICB0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDI+CisgIGNsYXNzIG9wX2l0ZXJhdG9yX2ltcGwgOgorICAgICAgcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywgVDI+IHsKKyAgICBmcmllbmQgY2xhc3MgTmFtZWRNRE5vZGU7CisKKyAgICBjb25zdCBOYW1lZE1ETm9kZSAqTm9kZSA9IG51bGxwdHI7CisgICAgdW5zaWduZWQgSWR4ID0gMDsKKworICAgIG9wX2l0ZXJhdG9yX2ltcGwoY29uc3QgTmFtZWRNRE5vZGUgKk4sIHVuc2lnbmVkIGkpIDogTm9kZShOKSwgSWR4KGkpIHt9CisKKyAgcHVibGljOgorICAgIG9wX2l0ZXJhdG9yX2ltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3Qgb3BfaXRlcmF0b3JfaW1wbCAmbykgY29uc3QgeyByZXR1cm4gSWR4ID09IG8uSWR4OyB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IG9wX2l0ZXJhdG9yX2ltcGwgJm8pIGNvbnN0IHsgcmV0dXJuIElkeCAhPSBvLklkeDsgfQorCisgICAgb3BfaXRlcmF0b3JfaW1wbCAmb3BlcmF0b3IrKygpIHsKKyAgICAgICsrSWR4OworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wX2l0ZXJhdG9yX2ltcGwgb3BlcmF0b3IrKyhpbnQpIHsKKyAgICAgIG9wX2l0ZXJhdG9yX2ltcGwgdG1wKCp0aGlzKTsKKyAgICAgIG9wZXJhdG9yKysoKTsKKyAgICAgIHJldHVybiB0bXA7CisgICAgfQorCisgICAgb3BfaXRlcmF0b3JfaW1wbCAmb3BlcmF0b3ItLSgpIHsKKyAgICAgIC0tSWR4OworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wX2l0ZXJhdG9yX2ltcGwgb3BlcmF0b3ItLShpbnQpIHsKKyAgICAgIG9wX2l0ZXJhdG9yX2ltcGwgdG1wKCp0aGlzKTsKKyAgICAgIG9wZXJhdG9yLS0oKTsKKyAgICAgIHJldHVybiB0bXA7CisgICAgfQorCisgICAgVDEgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gTm9kZS0+Z2V0T3BlcmFuZChJZHgpOyB9CisgIH07CisKK3B1YmxpYzoKKyAgTmFtZWRNRE5vZGUoY29uc3QgTmFtZWRNRE5vZGUgJikgPSBkZWxldGU7CisgIH5OYW1lZE1ETm9kZSgpOworCisgIC8vLyBcYnJpZWYgRHJvcCBhbGwgcmVmZXJlbmNlcyBhbmQgcmVtb3ZlIHRoZSBub2RlIGZyb20gcGFyZW50IG1vZHVsZS4KKyAgdm9pZCBlcmFzZUZyb21QYXJlbnQoKTsKKworICAvLy8gUmVtb3ZlIGFsbCB1c2VzIGFuZCBjbGVhciBub2RlIHZlY3Rvci4KKyAgdm9pZCBkcm9wQWxsUmVmZXJlbmNlcygpIHsgY2xlYXJPcGVyYW5kcygpOyB9CisgIC8vLyBEcm9wIGFsbCByZWZlcmVuY2VzIHRvIHRoaXMgbm9kZSdzIG9wZXJhbmRzLgorICB2b2lkIGNsZWFyT3BlcmFuZHMoKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgbW9kdWxlIHRoYXQgaG9sZHMgdGhpcyBuYW1lZCBtZXRhZGF0YSBjb2xsZWN0aW9uLgorICBpbmxpbmUgTW9kdWxlICpnZXRQYXJlbnQoKSB7IHJldHVybiBQYXJlbnQ7IH0KKyAgaW5saW5lIGNvbnN0IE1vZHVsZSAqZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gUGFyZW50OyB9CisKKyAgTUROb2RlICpnZXRPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0OworICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0OworICB2b2lkIGFkZE9wZXJhbmQoTUROb2RlICpNKTsKKyAgdm9pZCBzZXRPcGVyYW5kKHVuc2lnbmVkIEksIE1ETm9kZSAqTmV3KTsKKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdDsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmUk9TLCBib29sIElzRm9yRGVidWcgPSBmYWxzZSkgY29uc3Q7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJlJPUywgTW9kdWxlU2xvdFRyYWNrZXIgJk1TVCwKKyAgICAgICAgICAgICBib29sIElzRm9yRGVidWcgPSBmYWxzZSkgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBPcGVyYW5kIEl0ZXJhdG9yIGludGVyZmFjZS4uLgorICAvLworICB1c2luZyBvcF9pdGVyYXRvciA9IG9wX2l0ZXJhdG9yX2ltcGw8TUROb2RlICosIE1ETm9kZT47CisKKyAgb3BfaXRlcmF0b3Igb3BfYmVnaW4oKSB7IHJldHVybiBvcF9pdGVyYXRvcih0aGlzLCAwKTsgfQorICBvcF9pdGVyYXRvciBvcF9lbmQoKSAgIHsgcmV0dXJuIG9wX2l0ZXJhdG9yKHRoaXMsIGdldE51bU9wZXJhbmRzKCkpOyB9CisKKyAgdXNpbmcgY29uc3Rfb3BfaXRlcmF0b3IgPSBvcF9pdGVyYXRvcl9pbXBsPGNvbnN0IE1ETm9kZSAqLCBNRE5vZGU+OworCisgIGNvbnN0X29wX2l0ZXJhdG9yIG9wX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3Rfb3BfaXRlcmF0b3IodGhpcywgMCk7IH0KKyAgY29uc3Rfb3BfaXRlcmF0b3Igb3BfZW5kKCkgICBjb25zdCB7IHJldHVybiBjb25zdF9vcF9pdGVyYXRvcih0aGlzLCBnZXROdW1PcGVyYW5kcygpKTsgfQorCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTxvcF9pdGVyYXRvcj4gIG9wZXJhbmRzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKG9wX2JlZ2luKCksIG9wX2VuZCgpKTsKKyAgfQorICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8Y29uc3Rfb3BfaXRlcmF0b3I+IG9wZXJhbmRzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKG9wX2JlZ2luKCksIG9wX2VuZCgpKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfTUVUQURBVEFfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Nb2R1bGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTW9kdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlNGJjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTW9kdWxlLmgKQEAgLTAsMCArMSw4NzYgQEAKKy8vPT09LSBsbHZtL01vZHVsZS5oIC0gQysrIGNsYXNzIHRvIHJlcHJlc2VudCBhIFZNIG1vZHVsZSAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIEBmaWxlCisvLy8gTW9kdWxlLmggVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMgZm9yIHRoZSBNb2R1bGUgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX01PRFVMRV9ICisjZGVmaW5lIExMVk1fSVJfTU9EVUxFX0gKKworI2luY2x1ZGUgImxsdm0tYy9UeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db21kYXQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RhdGFMYXlvdXQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9HbG9iYWxBbGlhcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsSUZ1bmMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbFZhcmlhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9NZXRhZGF0YS5oIgorI2luY2x1ZGUgImxsdm0vSVIvU3ltYm9sVGFibGVMaXN0VHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NCaW5kaW5nV3JhcHBpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29kZUdlbi5oIgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBFcnJvcjsKK2NsYXNzIEZ1bmN0aW9uVHlwZTsKK2NsYXNzIEdWTWF0ZXJpYWxpemVyOworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBNZW1vcnlCdWZmZXI7CitjbGFzcyBSYW5kb21OdW1iZXJHZW5lcmF0b3I7Cit0ZW1wbGF0ZSA8Y2xhc3MgUHRyVHlwZT4gY2xhc3MgU21hbGxQdHJTZXRJbXBsOworY2xhc3MgU3RydWN0VHlwZTsKKworLy8vIEEgTW9kdWxlIGluc3RhbmNlIGlzIHVzZWQgdG8gc3RvcmUgYWxsIHRoZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGFuCisvLy8gTExWTSBtb2R1bGUuIE1vZHVsZXMgYXJlIHRoZSB0b3AgbGV2ZWwgY29udGFpbmVyIG9mIGFsbCBvdGhlciBMTFZNCisvLy8gSW50ZXJtZWRpYXRlIFJlcHJlc2VudGF0aW9uIChJUikgb2JqZWN0cy4gRWFjaCBtb2R1bGUgZGlyZWN0bHkgY29udGFpbnMgYQorLy8vIGxpc3Qgb2YgZ2xvYmFscyB2YXJpYWJsZXMsIGEgbGlzdCBvZiBmdW5jdGlvbnMsIGEgbGlzdCBvZiBsaWJyYXJpZXMgKG9yCisvLy8gb3RoZXIgbW9kdWxlcykgdGhpcyBtb2R1bGUgZGVwZW5kcyBvbiwgYSBzeW1ib2wgdGFibGUsIGFuZCB2YXJpb3VzIGRhdGEKKy8vLyBhYm91dCB0aGUgdGFyZ2V0J3MgY2hhcmFjdGVyaXN0aWNzLgorLy8vCisvLy8gQSBtb2R1bGUgbWFpbnRhaW5zIGEgR2xvYmFsVmFsUmVmTWFwIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gaG9sZCBhbGwKKy8vLyBjb25zdGFudCByZWZlcmVuY2VzIHRvIGdsb2JhbCB2YXJpYWJsZXMgaW4gdGhlIG1vZHVsZS4gIFdoZW4gYSBnbG9iYWwKKy8vLyB2YXJpYWJsZSBpcyBkZXN0cm95ZWQsIGl0IHNob3VsZCBoYXZlIG5vIGVudHJpZXMgaW4gdGhlIEdsb2JhbFZhbHVlUmVmTWFwLgorLy8vIEBicmllZiBUaGUgbWFpbiBjb250YWluZXIgY2xhc3MgZm9yIHRoZSBMTFZNIEludGVybWVkaWF0ZSBSZXByZXNlbnRhdGlvbi4KK2NsYXNzIE1vZHVsZSB7CisvLy8gQG5hbWUgVHlwZXMgQW5kIEVudW1lcmF0aW9ucworLy8vIEB7CitwdWJsaWM6CisgIC8vLyBUaGUgdHlwZSBmb3IgdGhlIGxpc3Qgb2YgZ2xvYmFsIHZhcmlhYmxlcy4KKyAgdXNpbmcgR2xvYmFsTGlzdFR5cGUgPSBTeW1ib2xUYWJsZUxpc3Q8R2xvYmFsVmFyaWFibGU+OworICAvLy8gVGhlIHR5cGUgZm9yIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucy4KKyAgdXNpbmcgRnVuY3Rpb25MaXN0VHlwZSA9IFN5bWJvbFRhYmxlTGlzdDxGdW5jdGlvbj47CisgIC8vLyBUaGUgdHlwZSBmb3IgdGhlIGxpc3Qgb2YgYWxpYXNlcy4KKyAgdXNpbmcgQWxpYXNMaXN0VHlwZSA9IFN5bWJvbFRhYmxlTGlzdDxHbG9iYWxBbGlhcz47CisgIC8vLyBUaGUgdHlwZSBmb3IgdGhlIGxpc3Qgb2YgaWZ1bmNzLgorICB1c2luZyBJRnVuY0xpc3RUeXBlID0gU3ltYm9sVGFibGVMaXN0PEdsb2JhbElGdW5jPjsKKyAgLy8vIFRoZSB0eXBlIGZvciB0aGUgbGlzdCBvZiBuYW1lZCBtZXRhZGF0YS4KKyAgdXNpbmcgTmFtZWRNRExpc3RUeXBlID0gaWxpc3Q8TmFtZWRNRE5vZGU+OworICAvLy8gVGhlIHR5cGUgb2YgdGhlIGNvbWRhdCAic3ltYm9sIiB0YWJsZS4KKyAgdXNpbmcgQ29tZGF0U3ltVGFiVHlwZSA9IFN0cmluZ01hcDxDb21kYXQ+OworCisgIC8vLyBUaGUgR2xvYmFsIFZhcmlhYmxlIGl0ZXJhdG9yLgorICB1c2luZyBnbG9iYWxfaXRlcmF0b3IgPSBHbG9iYWxMaXN0VHlwZTo6aXRlcmF0b3I7CisgIC8vLyBUaGUgR2xvYmFsIFZhcmlhYmxlIGNvbnN0YW50IGl0ZXJhdG9yLgorICB1c2luZyBjb25zdF9nbG9iYWxfaXRlcmF0b3IgPSBHbG9iYWxMaXN0VHlwZTo6Y29uc3RfaXRlcmF0b3I7CisKKyAgLy8vIFRoZSBGdW5jdGlvbiBpdGVyYXRvcnMuCisgIHVzaW5nIGl0ZXJhdG9yID0gRnVuY3Rpb25MaXN0VHlwZTo6aXRlcmF0b3I7CisgIC8vLyBUaGUgRnVuY3Rpb24gY29uc3RhbnQgaXRlcmF0b3IKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBGdW5jdGlvbkxpc3RUeXBlOjpjb25zdF9pdGVyYXRvcjsKKworICAvLy8gVGhlIEZ1bmN0aW9uIHJldmVyc2UgaXRlcmF0b3IuCisgIHVzaW5nIHJldmVyc2VfaXRlcmF0b3IgPSBGdW5jdGlvbkxpc3RUeXBlOjpyZXZlcnNlX2l0ZXJhdG9yOworICAvLy8gVGhlIEZ1bmN0aW9uIGNvbnN0YW50IHJldmVyc2UgaXRlcmF0b3IuCisgIHVzaW5nIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgPSBGdW5jdGlvbkxpc3RUeXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgIC8vLyBUaGUgR2xvYmFsIEFsaWFzIGl0ZXJhdG9ycy4KKyAgdXNpbmcgYWxpYXNfaXRlcmF0b3IgPSBBbGlhc0xpc3RUeXBlOjppdGVyYXRvcjsKKyAgLy8vIFRoZSBHbG9iYWwgQWxpYXMgY29uc3RhbnQgaXRlcmF0b3IKKyAgdXNpbmcgY29uc3RfYWxpYXNfaXRlcmF0b3IgPSBBbGlhc0xpc3RUeXBlOjpjb25zdF9pdGVyYXRvcjsKKworICAvLy8gVGhlIEdsb2JhbCBJRnVuYyBpdGVyYXRvcnMuCisgIHVzaW5nIGlmdW5jX2l0ZXJhdG9yID0gSUZ1bmNMaXN0VHlwZTo6aXRlcmF0b3I7CisgIC8vLyBUaGUgR2xvYmFsIElGdW5jIGNvbnN0YW50IGl0ZXJhdG9yCisgIHVzaW5nIGNvbnN0X2lmdW5jX2l0ZXJhdG9yID0gSUZ1bmNMaXN0VHlwZTo6Y29uc3RfaXRlcmF0b3I7CisKKyAgLy8vIFRoZSBuYW1lZCBtZXRhZGF0YSBpdGVyYXRvcnMuCisgIHVzaW5nIG5hbWVkX21ldGFkYXRhX2l0ZXJhdG9yID0gTmFtZWRNRExpc3RUeXBlOjppdGVyYXRvcjsKKyAgLy8vIFRoZSBuYW1lZCBtZXRhZGF0YSBjb25zdGFudCBpdGVyYXRvcnMuCisgIHVzaW5nIGNvbnN0X25hbWVkX21ldGFkYXRhX2l0ZXJhdG9yID0gTmFtZWRNRExpc3RUeXBlOjpjb25zdF9pdGVyYXRvcjsKKworICAvLy8gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBzdXBwb3J0ZWQgYmVoYXZpb3JzIG9mIG1vZHVsZSBmbGFncy4KKyAgZW51bSBNb2RGbGFnQmVoYXZpb3IgeworICAgIC8vLyBFbWl0cyBhbiBlcnJvciBpZiB0d28gdmFsdWVzIGRpc2FncmVlLCBvdGhlcndpc2UgdGhlIHJlc3VsdGluZyB2YWx1ZSBpcworICAgIC8vLyB0aGF0IG9mIHRoZSBvcGVyYW5kcy4KKyAgICBFcnJvciA9IDEsCisKKyAgICAvLy8gRW1pdHMgYSB3YXJuaW5nIGlmIHR3byB2YWx1ZXMgZGlzYWdyZWUuIFRoZSByZXN1bHQgdmFsdWUgd2lsbCBiZSB0aGUKKyAgICAvLy8gb3BlcmFuZCBmb3IgdGhlIGZsYWcgZnJvbSB0aGUgZmlyc3QgbW9kdWxlIGJlaW5nIGxpbmtlZC4KKyAgICBXYXJuaW5nID0gMiwKKworICAgIC8vLyBBZGRzIGEgcmVxdWlyZW1lbnQgdGhhdCBhbm90aGVyIG1vZHVsZSBmbGFnIGJlIHByZXNlbnQgYW5kIGhhdmUgYQorICAgIC8vLyBzcGVjaWZpZWQgdmFsdWUgYWZ0ZXIgbGlua2luZyBpcyBwZXJmb3JtZWQuIFRoZSB2YWx1ZSBtdXN0IGJlIGEgbWV0YWRhdGEKKyAgICAvLy8gcGFpciwgd2hlcmUgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHBhaXIgaXMgdGhlIElEIG9mIHRoZSBtb2R1bGUgZmxhZworICAgIC8vLyB0byBiZSByZXN0cmljdGVkLCBhbmQgdGhlIHNlY29uZCBlbGVtZW50IG9mIHRoZSBwYWlyIGlzIHRoZSB2YWx1ZSB0aGUKKyAgICAvLy8gbW9kdWxlIGZsYWcgc2hvdWxkIGJlIHJlc3RyaWN0ZWQgdG8uIFRoaXMgYmVoYXZpb3IgY2FuIGJlIHVzZWQgdG8KKyAgICAvLy8gcmVzdHJpY3QgdGhlIGFsbG93YWJsZSByZXN1bHRzICh2aWEgdHJpZ2dlcmluZyBvZiBhbiBlcnJvcikgb2YgbGlua2luZworICAgIC8vLyBJRHMgd2l0aCB0aGUgKipPdmVycmlkZSoqIGJlaGF2aW9yLgorICAgIFJlcXVpcmUgPSAzLAorCisgICAgLy8vIFVzZXMgdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmVnYXJkbGVzcyBvZiB0aGUgYmVoYXZpb3Igb3IgdmFsdWUgb2YgdGhlCisgICAgLy8vIG90aGVyIG1vZHVsZS4gSWYgYm90aCBtb2R1bGVzIHNwZWNpZnkgKipPdmVycmlkZSoqLCBidXQgdGhlIHZhbHVlcworICAgIC8vLyBkaWZmZXIsIGFuIGVycm9yIHdpbGwgYmUgZW1pdHRlZC4KKyAgICBPdmVycmlkZSA9IDQsCisKKyAgICAvLy8gQXBwZW5kcyB0aGUgdHdvIHZhbHVlcywgd2hpY2ggYXJlIHJlcXVpcmVkIHRvIGJlIG1ldGFkYXRhIG5vZGVzLgorICAgIEFwcGVuZCA9IDUsCisKKyAgICAvLy8gQXBwZW5kcyB0aGUgdHdvIHZhbHVlcywgd2hpY2ggYXJlIHJlcXVpcmVkIHRvIGJlIG1ldGFkYXRhCisgICAgLy8vIG5vZGVzLiBIb3dldmVyLCBkdXBsaWNhdGUgZW50cmllcyBpbiB0aGUgc2Vjb25kIGxpc3QgYXJlIGRyb3BwZWQKKyAgICAvLy8gZHVyaW5nIHRoZSBhcHBlbmQgb3BlcmF0aW9uLgorICAgIEFwcGVuZFVuaXF1ZSA9IDYsCisKKyAgICAvLy8gVGFrZXMgdGhlIG1heCBvZiB0aGUgdHdvIHZhbHVlcywgd2hpY2ggYXJlIHJlcXVpcmVkIHRvIGJlIGludGVnZXJzLgorICAgIE1heCA9IDcsCisKKyAgICAvLyBNYXJrZXJzOgorICAgIE1vZEZsYWdCZWhhdmlvckZpcnN0VmFsID0gRXJyb3IsCisgICAgTW9kRmxhZ0JlaGF2aW9yTGFzdFZhbCA9IE1heAorICB9OworCisgIC8vLyBDaGVja3MgaWYgTWV0YWRhdGEgcmVwcmVzZW50cyBhIHZhbGlkIE1vZEZsYWdCZWhhdmlvciwgYW5kIHN0b3JlcyB0aGUKKyAgLy8vIGNvbnZlcnRlZCByZXN1bHQgaW4gTUZCLgorICBzdGF0aWMgYm9vbCBpc1ZhbGlkTW9kRmxhZ0JlaGF2aW9yKE1ldGFkYXRhICpNRCwgTW9kRmxhZ0JlaGF2aW9yICZNRkIpOworCisgIHN0cnVjdCBNb2R1bGVGbGFnRW50cnkgeworICAgIE1vZEZsYWdCZWhhdmlvciBCZWhhdmlvcjsKKyAgICBNRFN0cmluZyAqS2V5OworICAgIE1ldGFkYXRhICpWYWw7CisKKyAgICBNb2R1bGVGbGFnRW50cnkoTW9kRmxhZ0JlaGF2aW9yIEIsIE1EU3RyaW5nICpLLCBNZXRhZGF0YSAqVikKKyAgICAgICAgOiBCZWhhdmlvcihCKSwgS2V5KEspLCBWYWwoVikge30KKyAgfTsKKworLy8vIEB9CisvLy8gQG5hbWUgTWVtYmVyIFZhcmlhYmxlcworLy8vIEB7Citwcml2YXRlOgorICBMTFZNQ29udGV4dCAmQ29udGV4dDsgICAgICAgICAgIC8vLzwgVGhlIExMVk1Db250ZXh0IGZyb20gd2hpY2ggdHlwZXMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjb25zdGFudHMgYXJlIGFsbG9jYXRlZC4KKyAgR2xvYmFsTGlzdFR5cGUgR2xvYmFsTGlzdDsgICAgICAvLy88IFRoZSBHbG9iYWwgVmFyaWFibGVzIGluIHRoZSBtb2R1bGUKKyAgRnVuY3Rpb25MaXN0VHlwZSBGdW5jdGlvbkxpc3Q7ICAvLy88IFRoZSBGdW5jdGlvbnMgaW4gdGhlIG1vZHVsZQorICBBbGlhc0xpc3RUeXBlIEFsaWFzTGlzdDsgICAgICAgIC8vLzwgVGhlIEFsaWFzZXMgaW4gdGhlIG1vZHVsZQorICBJRnVuY0xpc3RUeXBlIElGdW5jTGlzdDsgICAgICAgIC8vLzwgVGhlIElGdW5jcyBpbiB0aGUgbW9kdWxlCisgIE5hbWVkTURMaXN0VHlwZSBOYW1lZE1ETGlzdDsgICAgLy8vPCBUaGUgbmFtZWQgbWV0YWRhdGEgaW4gdGhlIG1vZHVsZQorICBzdGQ6OnN0cmluZyBHbG9iYWxTY29wZUFzbTsgICAgIC8vLzwgSW5saW5lIEFzbSBhdCBnbG9iYWwgc2NvcGUuCisgIFZhbHVlU3ltYm9sVGFibGUgKlZhbFN5bVRhYjsgICAgLy8vPCBTeW1ib2wgdGFibGUgZm9yIHZhbHVlcworICBDb21kYXRTeW1UYWJUeXBlIENvbWRhdFN5bVRhYjsgIC8vLzwgU3ltYm9sIHRhYmxlIGZvciBDT01EQVRzCisgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+CisgIE93bmVkTWVtb3J5QnVmZmVyOyAgICAgICAgICAgICAgLy8vPCBNZW1vcnkgYnVmZmVyIGRpcmVjdGx5IG93bmVkIGJ5IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG1vZHVsZSwgZm9yIGxlZ2FjeSBjbGllbnRzIG9ubHkuCisgIHN0ZDo6dW5pcXVlX3B0cjxHVk1hdGVyaWFsaXplcj4KKyAgTWF0ZXJpYWxpemVyOyAgICAgICAgICAgICAgICAgICAvLy88IFVzZWQgdG8gbWF0ZXJpYWxpemUgR2xvYmFsVmFsdWVzCisgIHN0ZDo6c3RyaW5nIE1vZHVsZUlEOyAgICAgICAgICAgLy8vPCBIdW1hbiByZWFkYWJsZSBpZGVudGlmaWVyIGZvciB0aGUgbW9kdWxlCisgIHN0ZDo6c3RyaW5nIFNvdXJjZUZpbGVOYW1lOyAgICAgLy8vPCBPcmlnaW5hbCBzb3VyY2UgZmlsZSBuYW1lIGZvciBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCByZWNvcmRlZCBpbiBiaXRjb2RlLgorICBzdGQ6OnN0cmluZyBUYXJnZXRUcmlwbGU7ICAgICAgIC8vLzwgUGxhdGZvcm0gdGFyZ2V0IHRyaXBsZSBNb2R1bGUgY29tcGlsZWQgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEZvcm1hdDogKGFyY2gpKHN1YiktKHZlbmRvciktKHN5czAtKGFiaSkKKyAgdm9pZCAqTmFtZWRNRFN5bVRhYjsgICAgICAgICAgICAvLy88IE5hbWVkTUROb2RlIG5hbWVzLgorICBEYXRhTGF5b3V0IERMOyAgICAgICAgICAgICAgICAgIC8vLzwgRGF0YUxheW91dCBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZHVsZQorCisgIGZyaWVuZCBjbGFzcyBDb25zdGFudDsKKworLy8vIEB9CisvLy8gQG5hbWUgQ29uc3RydWN0b3JzCisvLy8gQHsKK3B1YmxpYzoKKyAgLy8vIFRoZSBNb2R1bGUgY29uc3RydWN0b3IuIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBkZWZhdWx0IGNvbnN0cnVjdG9yLiBZb3UKKyAgLy8vIG11c3QgcHJvdmlkZSBhIG5hbWUgZm9yIHRoZSBtb2R1bGUgdXBvbiBjb25zdHJ1Y3Rpb24uCisgIGV4cGxpY2l0IE1vZHVsZShTdHJpbmdSZWYgTW9kdWxlSUQsIExMVk1Db250ZXh0JiBDKTsKKyAgLy8vIFRoZSBtb2R1bGUgZGVzdHJ1Y3Rvci4gVGhpcyB3aWxsIGRyb3BBbGxSZWZlcmVuY2VzLgorICB+TW9kdWxlKCk7CisKKy8vLyBAfQorLy8vIEBuYW1lIE1vZHVsZSBMZXZlbCBBY2Nlc3NvcnMKKy8vLyBAeworCisgIC8vLyBHZXQgdGhlIG1vZHVsZSBpZGVudGlmaWVyIHdoaWNoIGlzLCBlc3NlbnRpYWxseSwgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4KKyAgLy8vIEByZXR1cm5zIHRoZSBtb2R1bGUgaWRlbnRpZmllciBhcyBhIHN0cmluZworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TW9kdWxlSWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIE1vZHVsZUlEOyB9CisKKyAgLy8vIEdldCB0aGUgbW9kdWxlJ3Mgb3JpZ2luYWwgc291cmNlIGZpbGUgbmFtZS4gV2hlbiBjb21waWxpbmcgZnJvbQorICAvLy8gYml0Y29kZSwgdGhpcyBpcyB0YWtlbiBmcm9tIGEgYml0Y29kZSByZWNvcmQgd2hlcmUgaXQgd2FzIHJlY29yZGVkLgorICAvLy8gRm9yIG90aGVyIGNvbXBpbGVzIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBNb2R1bGVJRCwgd2hpY2ggd291bGQKKyAgLy8vIGNvbnRhaW4gdGhlIHNvdXJjZSBmaWxlIG5hbWUuCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRTb3VyY2VGaWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZUZpbGVOYW1lOyB9CisKKyAgLy8vIFxicmllZiBHZXQgYSBzaG9ydCAibmFtZSIgZm9yIHRoZSBtb2R1bGUuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBvciBsb2dnaW5nLiBJdCBpcyBlc3NlbnRpYWxseSBhIGNvbnZlbmllbmNlCisgIC8vLyB3cmFwcGVyIGFyb3VuZCBnZXRNb2R1bGVJZGVudGlmaWVyKCkuCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTW9kdWxlSUQ7IH0KKworICAvLy8gR2V0IHRoZSBkYXRhIGxheW91dCBzdHJpbmcgZm9yIHRoZSBtb2R1bGUncyB0YXJnZXQgcGxhdGZvcm0uIFRoaXMgaXMKKyAgLy8vIGVxdWl2YWxlbnQgdG8gZ2V0RGF0YUxheW91dCgpLT5nZXRTdHJpbmdSZXByZXNlbnRhdGlvbigpLgorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0RGF0YUxheW91dFN0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gREwuZ2V0U3RyaW5nUmVwcmVzZW50YXRpb24oKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGRhdGEgbGF5b3V0IGZvciB0aGUgbW9kdWxlJ3MgdGFyZ2V0IHBsYXRmb3JtLgorICBjb25zdCBEYXRhTGF5b3V0ICZnZXREYXRhTGF5b3V0KCkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgdGFyZ2V0IHRyaXBsZSB3aGljaCBpcyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSB0YXJnZXQgaG9zdC4KKyAgLy8vIEByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRhcmdldCB0cmlwbGUuCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRUYXJnZXRUcmlwbGUoKSBjb25zdCB7IHJldHVybiBUYXJnZXRUcmlwbGU7IH0KKworICAvLy8gR2V0IHRoZSBnbG9iYWwgZGF0YSBjb250ZXh0LgorICAvLy8gQHJldHVybnMgTExWTUNvbnRleHQgLSBhIGNvbnRhaW5lciBmb3IgTExWTSdzIGdsb2JhbCBpbmZvcm1hdGlvbgorICBMTFZNQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIENvbnRleHQ7IH0KKworICAvLy8gR2V0IGFueSBtb2R1bGUtc2NvcGUgaW5saW5lIGFzc2VtYmx5IGJsb2Nrcy4KKyAgLy8vIEByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1vZHVsZS1zY29wZSBpbmxpbmUgYXNzZW1ibHkgYmxvY2tzLgorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TW9kdWxlSW5saW5lQXNtKCkgY29uc3QgeyByZXR1cm4gR2xvYmFsU2NvcGVBc207IH0KKworICAvLy8gR2V0IGEgUmFuZG9tTnVtYmVyR2VuZXJhdG9yIHNhbHRlZCBmb3IgdXNlIHdpdGggdGhpcyBtb2R1bGUuIFRoZQorICAvLy8gUk5HIGNhbiBiZSBzZWVkZWQgdmlhIC1ybmctc2VlZD08dWludDY0PiBhbmQgaXMgc2FsdGVkIHdpdGggdGhlCisgIC8vLyBNb2R1bGVJRCBhbmQgdGhlIHByb3ZpZGVkIHBhc3Mgc2FsdC4gVGhlIHJldHVybmVkIFJORyBzaG91bGQgbm90CisgIC8vLyBiZSBzaGFyZWQgYWNyb3NzIHRocmVhZHMgb3IgcGFzc2VzLgorICAvLy8KKyAgLy8vIEEgdW5pcXVlIFJORyBwZXIgcGFzcyBlbnN1cmVzIGEgcmVwcm9kdWNpYmxlIHJhbmRvbSBzdHJlYW0gZXZlbgorICAvLy8gd2hlbiBvdGhlciByYW5kb21uZXNzIGNvbnN1bWluZyBwYXNzZXMgYXJlIGFkZGVkIG9yIHJlbW92ZWQuIEluCisgIC8vLyBhZGRpdGlvbiwgdGhlIHJhbmRvbSBzdHJlYW0gd2lsbCBiZSByZXByb2R1Y2libGUgYWNyb3NzIExMVk0KKyAgLy8vIHZlcnNpb25zIHdoZW4gdGhlIHBhc3MgZG9lcyBub3QgY2hhbmdlLgorICBzdGQ6OnVuaXF1ZV9wdHI8UmFuZG9tTnVtYmVyR2VuZXJhdG9yPiBjcmVhdGVSTkcoY29uc3QgUGFzcyogUCkgY29uc3Q7CisKKy8vLyBAfQorLy8vIEBuYW1lIE1vZHVsZSBMZXZlbCBNdXRhdG9ycworLy8vIEB7CisKKyAgLy8vIFNldCB0aGUgbW9kdWxlIGlkZW50aWZpZXIuCisgIHZvaWQgc2V0TW9kdWxlSWRlbnRpZmllcihTdHJpbmdSZWYgSUQpIHsgTW9kdWxlSUQgPSBJRDsgfQorCisgIC8vLyBTZXQgdGhlIG1vZHVsZSdzIG9yaWdpbmFsIHNvdXJjZSBmaWxlIG5hbWUuCisgIHZvaWQgc2V0U291cmNlRmlsZU5hbWUoU3RyaW5nUmVmIE5hbWUpIHsgU291cmNlRmlsZU5hbWUgPSBOYW1lOyB9CisKKyAgLy8vIFNldCB0aGUgZGF0YSBsYXlvdXQKKyAgdm9pZCBzZXREYXRhTGF5b3V0KFN0cmluZ1JlZiBEZXNjKTsKKyAgdm9pZCBzZXREYXRhTGF5b3V0KGNvbnN0IERhdGFMYXlvdXQgJk90aGVyKTsKKworICAvLy8gU2V0IHRoZSB0YXJnZXQgdHJpcGxlLgorICB2b2lkIHNldFRhcmdldFRyaXBsZShTdHJpbmdSZWYgVCkgeyBUYXJnZXRUcmlwbGUgPSBUOyB9CisKKyAgLy8vIFNldCB0aGUgbW9kdWxlLXNjb3BlIGlubGluZSBhc3NlbWJseSBibG9ja3MuCisgIC8vLyBBIHRyYWlsaW5nIG5ld2xpbmUgaXMgYWRkZWQgaWYgdGhlIGlucHV0IGRvZXNuJ3QgaGF2ZSBvbmUuCisgIHZvaWQgc2V0TW9kdWxlSW5saW5lQXNtKFN0cmluZ1JlZiBBc20pIHsKKyAgICBHbG9iYWxTY29wZUFzbSA9IEFzbTsKKyAgICBpZiAoIUdsb2JhbFNjb3BlQXNtLmVtcHR5KCkgJiYgR2xvYmFsU2NvcGVBc20uYmFjaygpICE9ICdcbicpCisgICAgICBHbG9iYWxTY29wZUFzbSArPSAnXG4nOworICB9CisKKyAgLy8vIEFwcGVuZCB0byB0aGUgbW9kdWxlLXNjb3BlIGlubGluZSBhc3NlbWJseSBibG9ja3MuCisgIC8vLyBBIHRyYWlsaW5nIG5ld2xpbmUgaXMgYWRkZWQgaWYgdGhlIGlucHV0IGRvZXNuJ3QgaGF2ZSBvbmUuCisgIHZvaWQgYXBwZW5kTW9kdWxlSW5saW5lQXNtKFN0cmluZ1JlZiBBc20pIHsKKyAgICBHbG9iYWxTY29wZUFzbSArPSBBc207CisgICAgaWYgKCFHbG9iYWxTY29wZUFzbS5lbXB0eSgpICYmIEdsb2JhbFNjb3BlQXNtLmJhY2soKSAhPSAnXG4nKQorICAgICAgR2xvYmFsU2NvcGVBc20gKz0gJ1xuJzsKKyAgfQorCisvLy8gQH0KKy8vLyBAbmFtZSBHZW5lcmljIFZhbHVlIEFjY2Vzc29ycworLy8vIEB7CisKKyAgLy8vIFJldHVybiB0aGUgZ2xvYmFsIHZhbHVlIGluIHRoZSBtb2R1bGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIG9mCisgIC8vLyBhcmJpdHJhcnkgdHlwZS4gVGhpcyBtZXRob2QgcmV0dXJucyBudWxsIGlmIGEgZ2xvYmFsIHdpdGggdGhlIHNwZWNpZmllZAorICAvLy8gbmFtZSBpcyBub3QgZm91bmQuCisgIEdsb2JhbFZhbHVlICpnZXROYW1lZFZhbHVlKFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgdW5pcXVlIG5vbi16ZXJvIElEIGZvciB0aGUgc3BlY2lmaWVkIG1ldGFkYXRhIGtpbmQuIFRoaXMgSUQgaXMKKyAgLy8vIHVuaXF1ZWQgYWNyb3NzIG1vZHVsZXMgaW4gdGhlIGN1cnJlbnQgTExWTUNvbnRleHQuCisgIHVuc2lnbmVkIGdldE1ES2luZElEKFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKworICAvLy8gUG9wdWxhdGUgY2xpZW50IHN1cHBsaWVkIFNtYWxsVmVjdG9yIHdpdGggdGhlIG5hbWUgZm9yIGN1c3RvbSBtZXRhZGF0YSBJRHMKKyAgLy8vIHJlZ2lzdGVyZWQgaW4gdGhpcyBMTFZNQ29udGV4dC4KKyAgdm9pZCBnZXRNREtpbmROYW1lcyhTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmUmVzdWx0KSBjb25zdDsKKworICAvLy8gUG9wdWxhdGUgY2xpZW50IHN1cHBsaWVkIFNtYWxsVmVjdG9yIHdpdGggdGhlIGJ1bmRsZSB0YWdzIHJlZ2lzdGVyZWQgaW4KKyAgLy8vIHRoaXMgTExWTUNvbnRleHQuICBUaGUgYnVuZGxlIHRhZ3MgYXJlIG9yZGVyZWQgYnkgaW5jcmVhc2luZyBidW5kbGUgSURzLgorICAvLy8gXHNlZSBMTFZNQ29udGV4dDo6Z2V0T3BlcmFuZEJ1bmRsZVRhZ0lECisgIHZvaWQgZ2V0T3BlcmFuZEJ1bmRsZVRhZ3MoU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gJlJlc3VsdCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lIGJ5IHRoYXQKKyAgLy8vIG5hbWUuCisgIFN0cnVjdFR5cGUgKmdldFR5cGVCeU5hbWUoU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworCisgIHN0ZDo6dmVjdG9yPFN0cnVjdFR5cGUgKj4gZ2V0SWRlbnRpZmllZFN0cnVjdFR5cGVzKCkgY29uc3Q7CisKKy8vLyBAfQorLy8vIEBuYW1lIEZ1bmN0aW9uIEFjY2Vzc29ycworLy8vIEB7CisKKyAgLy8vIExvb2sgdXAgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBpbiB0aGUgbW9kdWxlIHN5bWJvbCB0YWJsZS4gRm91cgorICAvLy8gcG9zc2liaWxpdGllczoKKyAgLy8vICAgMS4gSWYgaXQgZG9lcyBub3QgZXhpc3QsIGFkZCBhIHByb3RvdHlwZSBmb3IgdGhlIGZ1bmN0aW9uIGFuZCByZXR1cm4gaXQuCisgIC8vLyAgIDIuIElmIGl0IGV4aXN0cywgYW5kIGhhcyBhIGxvY2FsIGxpbmthZ2UsIHRoZSBleGlzdGluZyBmdW5jdGlvbiBpcworICAvLy8gICAgICByZW5hbWVkIGFuZCBhIG5ldyBvbmUgaXMgaW5zZXJ0ZWQuCisgIC8vLyAgIDMuIE90aGVyd2lzZSwgaWYgdGhlIGV4aXN0aW5nIGZ1bmN0aW9uIGhhcyB0aGUgY29ycmVjdCBwcm90b3R5cGUsIHJldHVybgorICAvLy8gICAgICB0aGUgZXhpc3RpbmcgZnVuY3Rpb24uCisgIC8vLyAgIDQuIEZpbmFsbHksIHRoZSBmdW5jdGlvbiBleGlzdHMgYnV0IGhhcyB0aGUgd3JvbmcgcHJvdG90eXBlOiByZXR1cm4gdGhlCisgIC8vLyAgICAgIGZ1bmN0aW9uIHdpdGggYSBjb25zdGFudGV4cHIgY2FzdCB0byB0aGUgcmlnaHQgcHJvdG90eXBlLgorICBDb25zdGFudCAqZ2V0T3JJbnNlcnRGdW5jdGlvbihTdHJpbmdSZWYgTmFtZSwgRnVuY3Rpb25UeXBlICpULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0IEF0dHJpYnV0ZUxpc3QpOworCisgIENvbnN0YW50ICpnZXRPckluc2VydEZ1bmN0aW9uKFN0cmluZ1JlZiBOYW1lLCBGdW5jdGlvblR5cGUgKlQpOworCisgIC8vLyBMb29rIHVwIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gaW4gdGhlIG1vZHVsZSBzeW1ib2wgdGFibGUuIElmIGl0IGRvZXMgbm90CisgIC8vLyBleGlzdCwgYWRkIGEgcHJvdG90eXBlIGZvciB0aGUgZnVuY3Rpb24gYW5kIHJldHVybiBpdC4gVGhpcyBmdW5jdGlvbgorICAvLy8gZ3VhcmFudGVlcyB0byByZXR1cm4gYSBjb25zdGFudCBvZiBwb2ludGVyIHRvIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gdHlwZQorICAvLy8gb3IgYSBDb25zdGFudEV4cHIgQml0Q2FzdCBvZiB0aGF0IHR5cGUgaWYgdGhlIG5hbWVkIGZ1bmN0aW9uIGhhcyBhCisgIC8vLyBkaWZmZXJlbnQgdHlwZS4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBtZXRob2QgdGFrZXMgYSBsaXN0IG9mCisgIC8vLyBmdW5jdGlvbiBhcmd1bWVudHMsIHdoaWNoIG1ha2VzIGl0IGVhc2llciBmb3IgY2xpZW50cyB0byB1c2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3NUeT4KKyAgQ29uc3RhbnQgKmdldE9ySW5zZXJ0RnVuY3Rpb24oU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3QgQXR0cmlidXRlTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqUmV0VHksIEFyZ3NUeS4uLiBBcmdzKQorICB7CisgICAgU21hbGxWZWN0b3I8VHlwZSosIHNpemVvZi4uLihBcmdzVHkpPiBBcmdUeXN7QXJncy4uLn07CisgICAgcmV0dXJuIGdldE9ySW5zZXJ0RnVuY3Rpb24oTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblR5cGU6OmdldChSZXRUeSwgQXJnVHlzLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdCk7CisgIH0KKworICAvLy8gU2FtZSBhcyBhYm92ZSwgYnV0IHdpdGhvdXQgdGhlIGF0dHJpYnV0ZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3NUeT4KKyAgQ29uc3RhbnQgKmdldE9ySW5zZXJ0RnVuY3Rpb24oU3RyaW5nUmVmIE5hbWUsIFR5cGUgKlJldFR5LCBBcmdzVHkuLi4gQXJncykgeworICAgIHJldHVybiBnZXRPckluc2VydEZ1bmN0aW9uKE5hbWUsIEF0dHJpYnV0ZUxpc3R7fSwgUmV0VHksIEFyZ3MuLi4pOworICB9CisKKyAgLy8vIExvb2sgdXAgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBpbiB0aGUgbW9kdWxlIHN5bWJvbCB0YWJsZS4gSWYgaXQgZG9lcyBub3QKKyAgLy8vIGV4aXN0LCByZXR1cm4gbnVsbC4KKyAgRnVuY3Rpb24gKmdldEZ1bmN0aW9uKFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKworLy8vIEB9CisvLy8gQG5hbWUgR2xvYmFsIFZhcmlhYmxlIEFjY2Vzc29ycworLy8vIEB7CisKKyAgLy8vIExvb2sgdXAgdGhlIHNwZWNpZmllZCBnbG9iYWwgdmFyaWFibGUgaW4gdGhlIG1vZHVsZSBzeW1ib2wgdGFibGUuIElmIGl0CisgIC8vLyBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIG51bGwuIElmIEFsbG93SW50ZXJuYWwgaXMgc2V0IHRvIHRydWUsIHRoaXMKKyAgLy8vIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHR5cGVzIHRoYXQgaGF2ZSBJbnRlcm5hbExpbmthZ2UuIEJ5IGRlZmF1bHQsIHRoZXNlCisgIC8vLyB0eXBlcyBhcmUgbm90IHJldHVybmVkLgorICBHbG9iYWxWYXJpYWJsZSAqZ2V0R2xvYmFsVmFyaWFibGUoU3RyaW5nUmVmIE5hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0R2xvYmFsVmFyaWFibGUoTmFtZSwgZmFsc2UpOworICB9CisKKyAgR2xvYmFsVmFyaWFibGUgKmdldEdsb2JhbFZhcmlhYmxlKFN0cmluZ1JlZiBOYW1lLCBib29sIEFsbG93SW50ZXJuYWwpIGNvbnN0OworCisgIEdsb2JhbFZhcmlhYmxlICpnZXRHbG9iYWxWYXJpYWJsZShTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dJbnRlcm5hbCA9IGZhbHNlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IE1vZHVsZSAqPih0aGlzKS0+Z2V0R2xvYmFsVmFyaWFibGUoTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvd0ludGVybmFsKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGdsb2JhbCB2YXJpYWJsZSBpbiB0aGUgbW9kdWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBvZgorICAvLy8gYXJiaXRyYXJ5IHR5cGUuIFRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBpZiBhIGdsb2JhbCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgLy8vIG5hbWUgaXMgbm90IGZvdW5kLgorICBjb25zdCBHbG9iYWxWYXJpYWJsZSAqZ2V0TmFtZWRHbG9iYWwoU3RyaW5nUmVmIE5hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0R2xvYmFsVmFyaWFibGUoTmFtZSwgdHJ1ZSk7CisgIH0KKyAgR2xvYmFsVmFyaWFibGUgKmdldE5hbWVkR2xvYmFsKFN0cmluZ1JlZiBOYW1lKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8R2xvYmFsVmFyaWFibGUgKj4oCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IE1vZHVsZSAqPih0aGlzKS0+Z2V0TmFtZWRHbG9iYWwoTmFtZSkpOworICB9CisKKyAgLy8vIExvb2sgdXAgdGhlIHNwZWNpZmllZCBnbG9iYWwgaW4gdGhlIG1vZHVsZSBzeW1ib2wgdGFibGUuCisgIC8vLyAgIDEuIElmIGl0IGRvZXMgbm90IGV4aXN0LCBhZGQgYSBkZWNsYXJhdGlvbiBvZiB0aGUgZ2xvYmFsIGFuZCByZXR1cm4gaXQuCisgIC8vLyAgIDIuIEVsc2UsIHRoZSBnbG9iYWwgZXhpc3RzIGJ1dCBoYXMgdGhlIHdyb25nIHR5cGU6IHJldHVybiB0aGUgZnVuY3Rpb24KKyAgLy8vICAgICAgd2l0aCBhIGNvbnN0YW50ZXhwciBjYXN0IHRvIHRoZSByaWdodCB0eXBlLgorICAvLy8gICAzLiBGaW5hbGx5LCBpZiB0aGUgZXhpc3RpbmcgZ2xvYmFsIGlzIHRoZSBjb3JyZWN0IGRlY2xhcmF0aW9uLCByZXR1cm4KKyAgLy8vICAgICAgdGhlIGV4aXN0aW5nIGdsb2JhbC4KKyAgQ29uc3RhbnQgKmdldE9ySW5zZXJ0R2xvYmFsKFN0cmluZ1JlZiBOYW1lLCBUeXBlICpUeSk7CisKKy8vLyBAfQorLy8vIEBuYW1lIEdsb2JhbCBBbGlhcyBBY2Nlc3NvcnMKKy8vLyBAeworCisgIC8vLyBSZXR1cm4gdGhlIGdsb2JhbCBhbGlhcyBpbiB0aGUgbW9kdWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBvZgorICAvLy8gYXJiaXRyYXJ5IHR5cGUuIFRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBpZiBhIGdsb2JhbCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgLy8vIG5hbWUgaXMgbm90IGZvdW5kLgorICBHbG9iYWxBbGlhcyAqZ2V0TmFtZWRBbGlhcyhTdHJpbmdSZWYgTmFtZSkgY29uc3Q7CisKKy8vLyBAfQorLy8vIEBuYW1lIEdsb2JhbCBJRnVuYyBBY2Nlc3NvcnMKKy8vLyBAeworCisgIC8vLyBSZXR1cm4gdGhlIGdsb2JhbCBpZnVuYyBpbiB0aGUgbW9kdWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBvZgorICAvLy8gYXJiaXRyYXJ5IHR5cGUuIFRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBpZiBhIGdsb2JhbCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgLy8vIG5hbWUgaXMgbm90IGZvdW5kLgorICBHbG9iYWxJRnVuYyAqZ2V0TmFtZWRJRnVuYyhTdHJpbmdSZWYgTmFtZSkgY29uc3Q7CisKKy8vLyBAfQorLy8vIEBuYW1lIE5hbWVkIE1ldGFkYXRhIEFjY2Vzc29ycworLy8vIEB7CisKKyAgLy8vIFJldHVybiB0aGUgZmlyc3QgTmFtZWRNRE5vZGUgaW4gdGhlIG1vZHVsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVGhpcworICAvLy8gbWV0aG9kIHJldHVybnMgbnVsbCBpZiBhIE5hbWVkTUROb2RlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGlzIG5vdCBmb3VuZC4KKyAgTmFtZWRNRE5vZGUgKmdldE5hbWVkTWV0YWRhdGEoY29uc3QgVHdpbmUgJk5hbWUpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIG5hbWVkIE1ETm9kZSBpbiB0aGUgbW9kdWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUaGlzIG1ldGhvZAorICAvLy8gcmV0dXJucyBhIG5ldyBOYW1lZE1ETm9kZSBpZiBhIE5hbWVkTUROb2RlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGlzIG5vdAorICAvLy8gZm91bmQuCisgIE5hbWVkTUROb2RlICpnZXRPckluc2VydE5hbWVkTWV0YWRhdGEoU3RyaW5nUmVmIE5hbWUpOworCisgIC8vLyBSZW1vdmUgdGhlIGdpdmVuIE5hbWVkTUROb2RlIGZyb20gdGhpcyBtb2R1bGUgYW5kIGRlbGV0ZSBpdC4KKyAgdm9pZCBlcmFzZU5hbWVkTWV0YWRhdGEoTmFtZWRNRE5vZGUgKk5NRCk7CisKKy8vLyBAfQorLy8vIEBuYW1lIENvbWRhdCBBY2Nlc3NvcnMKKy8vLyBAeworCisgIC8vLyBSZXR1cm4gdGhlIENvbWRhdCBpbiB0aGUgbW9kdWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBJdCBpcyBjcmVhdGVkCisgIC8vLyBpZiBpdCBkaWRuJ3QgYWxyZWFkeSBleGlzdC4KKyAgQ29tZGF0ICpnZXRPckluc2VydENvbWRhdChTdHJpbmdSZWYgTmFtZSk7CisKKy8vLyBAfQorLy8vIEBuYW1lIE1vZHVsZSBGbGFncyBBY2Nlc3NvcnMKKy8vLyBAeworCisgIC8vLyBSZXR1cm5zIHRoZSBtb2R1bGUgZmxhZ3MgaW4gdGhlIHByb3ZpZGVkIHZlY3Rvci4KKyAgdm9pZCBnZXRNb2R1bGVGbGFnc01ldGFkYXRhKFNtYWxsVmVjdG9ySW1wbDxNb2R1bGVGbGFnRW50cnk+ICZGbGFncykgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpZiBLZXkgYXBwZWFycyBpbiBtb2R1bGUgZmxhZ3MsIG90aGVyd2lzZQorICAvLy8gcmV0dXJuIG51bGwuCisgIE1ldGFkYXRhICpnZXRNb2R1bGVGbGFnKFN0cmluZ1JlZiBLZXkpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBOYW1lZE1ETm9kZSBpbiB0aGUgbW9kdWxlIHRoYXQgcmVwcmVzZW50cyBtb2R1bGUtbGV2ZWwgZmxhZ3MuCisgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIG51bGwgaWYgdGhlcmUgYXJlIG5vIG1vZHVsZS1sZXZlbCBmbGFncy4KKyAgTmFtZWRNRE5vZGUgKmdldE1vZHVsZUZsYWdzTWV0YWRhdGEoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgTmFtZWRNRE5vZGUgaW4gdGhlIG1vZHVsZSB0aGF0IHJlcHJlc2VudHMgbW9kdWxlLWxldmVsIGZsYWdzLgorICAvLy8gSWYgbW9kdWxlLWxldmVsIGZsYWdzIGFyZW4ndCBmb3VuZCwgaXQgY3JlYXRlcyB0aGUgbmFtZWQgbWV0YWRhdGEgdGhhdAorICAvLy8gY29udGFpbnMgdGhlbS4KKyAgTmFtZWRNRE5vZGUgKmdldE9ySW5zZXJ0TW9kdWxlRmxhZ3NNZXRhZGF0YSgpOworCisgIC8vLyBBZGQgYSBtb2R1bGUtbGV2ZWwgZmxhZyB0byB0aGUgbW9kdWxlLWxldmVsIGZsYWdzIG1ldGFkYXRhLiBJdCB3aWxsIGNyZWF0ZQorICAvLy8gdGhlIG1vZHVsZS1sZXZlbCBmbGFncyBuYW1lZCBtZXRhZGF0YSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuCisgIHZvaWQgYWRkTW9kdWxlRmxhZyhNb2RGbGFnQmVoYXZpb3IgQmVoYXZpb3IsIFN0cmluZ1JlZiBLZXksIE1ldGFkYXRhICpWYWwpOworICB2b2lkIGFkZE1vZHVsZUZsYWcoTW9kRmxhZ0JlaGF2aW9yIEJlaGF2aW9yLCBTdHJpbmdSZWYgS2V5LCBDb25zdGFudCAqVmFsKTsKKyAgdm9pZCBhZGRNb2R1bGVGbGFnKE1vZEZsYWdCZWhhdmlvciBCZWhhdmlvciwgU3RyaW5nUmVmIEtleSwgdWludDMyX3QgVmFsKTsKKyAgdm9pZCBhZGRNb2R1bGVGbGFnKE1ETm9kZSAqTm9kZSk7CisKKy8vLyBAfQorLy8vIEBuYW1lIE1hdGVyaWFsaXphdGlvbgorLy8vIEB7CisKKyAgLy8vIFNldHMgdGhlIEdWTWF0ZXJpYWxpemVyIHRvIEdWTS4gVGhpcyBtb2R1bGUgbXVzdCBub3QgeWV0IGhhdmUgYQorICAvLy8gTWF0ZXJpYWxpemVyLiBUbyByZXNldCB0aGUgbWF0ZXJpYWxpemVyIGZvciBhIG1vZHVsZSB0aGF0IGFscmVhZHkgaGFzIG9uZSwKKyAgLy8vIGNhbGwgbWF0ZXJpYWxpemVBbGwgZmlyc3QuIERlc3Ryb3lpbmcgdGhpcyBtb2R1bGUgd2lsbCBkZXN0cm95CisgIC8vLyBpdHMgbWF0ZXJpYWxpemVyIHdpdGhvdXQgbWF0ZXJpYWxpemluZyBhbnkgbW9yZSBHbG9iYWxWYWx1ZXMuIFdpdGhvdXQKKyAgLy8vIGRlc3Ryb3lpbmcgdGhlIE1vZHVsZSwgdGhlcmUgaXMgbm8gd2F5IHRvIGRldGFjaCBvciBkZXN0cm95IGEgbWF0ZXJpYWxpemVyCisgIC8vLyB3aXRob3V0IG1hdGVyaWFsaXppbmcgYWxsIHRoZSBHVnMgaXQgY29udHJvbHMsIHRvIGF2b2lkIGxlYXZpbmcgb3JwaGFuCisgIC8vLyB1bm1hdGVyaWFsaXplZCBHVnMuCisgIHZvaWQgc2V0TWF0ZXJpYWxpemVyKEdWTWF0ZXJpYWxpemVyICpHVk0pOworICAvLy8gUmV0cmlldmVzIHRoZSBHVk1hdGVyaWFsaXplciwgaWYgYW55LCBmb3IgdGhpcyBNb2R1bGUuCisgIEdWTWF0ZXJpYWxpemVyICpnZXRNYXRlcmlhbGl6ZXIoKSBjb25zdCB7IHJldHVybiBNYXRlcmlhbGl6ZXIuZ2V0KCk7IH0KKyAgYm9vbCBpc01hdGVyaWFsaXplZCgpIGNvbnN0IHsgcmV0dXJuICFnZXRNYXRlcmlhbGl6ZXIoKTsgfQorCisgIC8vLyBNYWtlIHN1cmUgdGhlIEdsb2JhbFZhbHVlIGlzIGZ1bGx5IHJlYWQuCisgIGxsdm06OkVycm9yIG1hdGVyaWFsaXplKEdsb2JhbFZhbHVlICpHVik7CisKKyAgLy8vIE1ha2Ugc3VyZSBhbGwgR2xvYmFsVmFsdWVzIGluIHRoaXMgTW9kdWxlIGFyZSBmdWxseSByZWFkIGFuZCBjbGVhciB0aGUKKyAgLy8vIE1hdGVyaWFsaXplci4KKyAgbGx2bTo6RXJyb3IgbWF0ZXJpYWxpemVBbGwoKTsKKworICBsbHZtOjpFcnJvciBtYXRlcmlhbGl6ZU1ldGFkYXRhKCk7CisKKy8vLyBAfQorLy8vIEBuYW1lIERpcmVjdCBhY2Nlc3MgdG8gdGhlIGdsb2JhbHMgbGlzdCwgZnVuY3Rpb25zIGxpc3QsIGFuZCBzeW1ib2wgdGFibGUKKy8vLyBAeworCisgIC8vLyBHZXQgdGhlIE1vZHVsZSdzIGxpc3Qgb2YgZ2xvYmFsIHZhcmlhYmxlcyAoY29uc3RhbnQpLgorICBjb25zdCBHbG9iYWxMaXN0VHlwZSAgICZnZXRHbG9iYWxMaXN0KCkgY29uc3QgICAgICAgeyByZXR1cm4gR2xvYmFsTGlzdDsgfQorICAvLy8gR2V0IHRoZSBNb2R1bGUncyBsaXN0IG9mIGdsb2JhbCB2YXJpYWJsZXMuCisgIEdsb2JhbExpc3RUeXBlICAgICAgICAgJmdldEdsb2JhbExpc3QoKSAgICAgICAgICAgICB7IHJldHVybiBHbG9iYWxMaXN0OyB9CisKKyAgc3RhdGljIEdsb2JhbExpc3RUeXBlIE1vZHVsZTo6KmdldFN1Ymxpc3RBY2Nlc3MoR2xvYmFsVmFyaWFibGUqKSB7CisgICAgcmV0dXJuICZNb2R1bGU6Okdsb2JhbExpc3Q7CisgIH0KKworICAvLy8gR2V0IHRoZSBNb2R1bGUncyBsaXN0IG9mIGZ1bmN0aW9ucyAoY29uc3RhbnQpLgorICBjb25zdCBGdW5jdGlvbkxpc3RUeXBlICZnZXRGdW5jdGlvbkxpc3QoKSBjb25zdCAgICAgeyByZXR1cm4gRnVuY3Rpb25MaXN0OyB9CisgIC8vLyBHZXQgdGhlIE1vZHVsZSdzIGxpc3Qgb2YgZnVuY3Rpb25zLgorICBGdW5jdGlvbkxpc3RUeXBlICAgICAgICZnZXRGdW5jdGlvbkxpc3QoKSAgICAgICAgICAgeyByZXR1cm4gRnVuY3Rpb25MaXN0OyB9CisgIHN0YXRpYyBGdW5jdGlvbkxpc3RUeXBlIE1vZHVsZTo6KmdldFN1Ymxpc3RBY2Nlc3MoRnVuY3Rpb24qKSB7CisgICAgcmV0dXJuICZNb2R1bGU6OkZ1bmN0aW9uTGlzdDsKKyAgfQorCisgIC8vLyBHZXQgdGhlIE1vZHVsZSdzIGxpc3Qgb2YgYWxpYXNlcyAoY29uc3RhbnQpLgorICBjb25zdCBBbGlhc0xpc3RUeXBlICAgICZnZXRBbGlhc0xpc3QoKSBjb25zdCAgICAgICAgeyByZXR1cm4gQWxpYXNMaXN0OyB9CisgIC8vLyBHZXQgdGhlIE1vZHVsZSdzIGxpc3Qgb2YgYWxpYXNlcy4KKyAgQWxpYXNMaXN0VHlwZSAgICAgICAgICAmZ2V0QWxpYXNMaXN0KCkgICAgICAgICAgICAgIHsgcmV0dXJuIEFsaWFzTGlzdDsgfQorCisgIHN0YXRpYyBBbGlhc0xpc3RUeXBlIE1vZHVsZTo6KmdldFN1Ymxpc3RBY2Nlc3MoR2xvYmFsQWxpYXMqKSB7CisgICAgcmV0dXJuICZNb2R1bGU6OkFsaWFzTGlzdDsKKyAgfQorCisgIC8vLyBHZXQgdGhlIE1vZHVsZSdzIGxpc3Qgb2YgaWZ1bmNzIChjb25zdGFudCkuCisgIGNvbnN0IElGdW5jTGlzdFR5cGUgICAgJmdldElGdW5jTGlzdCgpIGNvbnN0ICAgICAgICB7IHJldHVybiBJRnVuY0xpc3Q7IH0KKyAgLy8vIEdldCB0aGUgTW9kdWxlJ3MgbGlzdCBvZiBpZnVuY3MuCisgIElGdW5jTGlzdFR5cGUgICAgICAgICAgJmdldElGdW5jTGlzdCgpICAgICAgICAgICAgICB7IHJldHVybiBJRnVuY0xpc3Q7IH0KKworICBzdGF0aWMgSUZ1bmNMaXN0VHlwZSBNb2R1bGU6OipnZXRTdWJsaXN0QWNjZXNzKEdsb2JhbElGdW5jKikgeworICAgIHJldHVybiAmTW9kdWxlOjpJRnVuY0xpc3Q7CisgIH0KKworICAvLy8gR2V0IHRoZSBNb2R1bGUncyBsaXN0IG9mIG5hbWVkIG1ldGFkYXRhIChjb25zdGFudCkuCisgIGNvbnN0IE5hbWVkTURMaXN0VHlwZSAgJmdldE5hbWVkTURMaXN0KCkgY29uc3QgICAgICB7IHJldHVybiBOYW1lZE1ETGlzdDsgfQorICAvLy8gR2V0IHRoZSBNb2R1bGUncyBsaXN0IG9mIG5hbWVkIG1ldGFkYXRhLgorICBOYW1lZE1ETGlzdFR5cGUgICAgICAgICZnZXROYW1lZE1ETGlzdCgpICAgICAgICAgICAgeyByZXR1cm4gTmFtZWRNRExpc3Q7IH0KKworICBzdGF0aWMgTmFtZWRNRExpc3RUeXBlIE1vZHVsZTo6KmdldFN1Ymxpc3RBY2Nlc3MoTmFtZWRNRE5vZGUqKSB7CisgICAgcmV0dXJuICZNb2R1bGU6Ok5hbWVkTURMaXN0OworICB9CisKKyAgLy8vIEdldCB0aGUgc3ltYm9sIHRhYmxlIG9mIGdsb2JhbCB2YXJpYWJsZSBhbmQgZnVuY3Rpb24gaWRlbnRpZmllcnMKKyAgY29uc3QgVmFsdWVTeW1ib2xUYWJsZSAmZ2V0VmFsdWVTeW1ib2xUYWJsZSgpIGNvbnN0IHsgcmV0dXJuICpWYWxTeW1UYWI7IH0KKyAgLy8vIEdldCB0aGUgTW9kdWxlJ3Mgc3ltYm9sIHRhYmxlIG9mIGdsb2JhbCB2YXJpYWJsZSBhbmQgZnVuY3Rpb24gaWRlbnRpZmllcnMuCisgIFZhbHVlU3ltYm9sVGFibGUgICAgICAgJmdldFZhbHVlU3ltYm9sVGFibGUoKSAgICAgICB7IHJldHVybiAqVmFsU3ltVGFiOyB9CisKKyAgLy8vIEdldCB0aGUgTW9kdWxlJ3Mgc3ltYm9sIHRhYmxlIGZvciBDT01EQVRzIChjb25zdGFudCkuCisgIGNvbnN0IENvbWRhdFN5bVRhYlR5cGUgJmdldENvbWRhdFN5bWJvbFRhYmxlKCkgY29uc3QgeyByZXR1cm4gQ29tZGF0U3ltVGFiOyB9CisgIC8vLyBHZXQgdGhlIE1vZHVsZSdzIHN5bWJvbCB0YWJsZSBmb3IgQ09NREFUcy4KKyAgQ29tZGF0U3ltVGFiVHlwZSAmZ2V0Q29tZGF0U3ltYm9sVGFibGUoKSB7IHJldHVybiBDb21kYXRTeW1UYWI7IH0KKworLy8vIEB9CisvLy8gQG5hbWUgR2xvYmFsIFZhcmlhYmxlIEl0ZXJhdGlvbgorLy8vIEB7CisKKyAgZ2xvYmFsX2l0ZXJhdG9yICAgICAgIGdsb2JhbF9iZWdpbigpICAgICAgIHsgcmV0dXJuIEdsb2JhbExpc3QuYmVnaW4oKTsgfQorICBjb25zdF9nbG9iYWxfaXRlcmF0b3IgZ2xvYmFsX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gR2xvYmFsTGlzdC5iZWdpbigpOyB9CisgIGdsb2JhbF9pdGVyYXRvciAgICAgICBnbG9iYWxfZW5kICAoKSAgICAgICB7IHJldHVybiBHbG9iYWxMaXN0LmVuZCgpOyB9CisgIGNvbnN0X2dsb2JhbF9pdGVyYXRvciBnbG9iYWxfZW5kICAoKSBjb25zdCB7IHJldHVybiBHbG9iYWxMaXN0LmVuZCgpOyB9CisgIGJvb2wgICAgICAgICAgICAgICAgICBnbG9iYWxfZW1wdHkoKSBjb25zdCB7IHJldHVybiBHbG9iYWxMaXN0LmVtcHR5KCk7IH0KKworICBpdGVyYXRvcl9yYW5nZTxnbG9iYWxfaXRlcmF0b3I+IGdsb2JhbHMoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoZ2xvYmFsX2JlZ2luKCksIGdsb2JhbF9lbmQoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfZ2xvYmFsX2l0ZXJhdG9yPiBnbG9iYWxzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGdsb2JhbF9iZWdpbigpLCBnbG9iYWxfZW5kKCkpOworICB9CisKKy8vLyBAfQorLy8vIEBuYW1lIEZ1bmN0aW9uIEl0ZXJhdGlvbgorLy8vIEB7CisKKyAgaXRlcmF0b3IgICAgICAgICAgICAgICAgYmVnaW4oKSAgICAgICB7IHJldHVybiBGdW5jdGlvbkxpc3QuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciAgICAgICAgICBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEZ1bmN0aW9uTGlzdC5iZWdpbigpOyB9CisgIGl0ZXJhdG9yICAgICAgICAgICAgICAgIGVuZCAgKCkgICAgICAgeyByZXR1cm4gRnVuY3Rpb25MaXN0LmVuZCgpOyAgIH0KKyAgY29uc3RfaXRlcmF0b3IgICAgICAgICAgZW5kICAoKSBjb25zdCB7IHJldHVybiBGdW5jdGlvbkxpc3QuZW5kKCk7ICAgfQorICByZXZlcnNlX2l0ZXJhdG9yICAgICAgICByYmVnaW4oKSAgICAgIHsgcmV0dXJuIEZ1bmN0aW9uTGlzdC5yYmVnaW4oKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yICByYmVnaW4oKSBjb25zdHsgcmV0dXJuIEZ1bmN0aW9uTGlzdC5yYmVnaW4oKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yICAgICAgICByZW5kKCkgICAgICAgIHsgcmV0dXJuIEZ1bmN0aW9uTGlzdC5yZW5kKCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAgcmVuZCgpIGNvbnN0ICB7IHJldHVybiBGdW5jdGlvbkxpc3QucmVuZCgpOyB9CisgIHNpemVfdCAgICAgICAgICAgICAgICAgIHNpemUoKSBjb25zdCAgeyByZXR1cm4gRnVuY3Rpb25MaXN0LnNpemUoKTsgfQorICBib29sICAgICAgICAgICAgICAgICAgICBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEZ1bmN0aW9uTGlzdC5lbXB0eSgpOyB9CisKKyAgaXRlcmF0b3JfcmFuZ2U8aXRlcmF0b3I+IGZ1bmN0aW9ucygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShiZWdpbigpLCBlbmQoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfaXRlcmF0b3I+IGZ1bmN0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShiZWdpbigpLCBlbmQoKSk7CisgIH0KKworLy8vIEB9CisvLy8gQG5hbWUgQWxpYXMgSXRlcmF0aW9uCisvLy8gQHsKKworICBhbGlhc19pdGVyYXRvciAgICAgICBhbGlhc19iZWdpbigpICAgICAgICAgICAgeyByZXR1cm4gQWxpYXNMaXN0LmJlZ2luKCk7IH0KKyAgY29uc3RfYWxpYXNfaXRlcmF0b3IgYWxpYXNfYmVnaW4oKSBjb25zdCAgICAgIHsgcmV0dXJuIEFsaWFzTGlzdC5iZWdpbigpOyB9CisgIGFsaWFzX2l0ZXJhdG9yICAgICAgIGFsaWFzX2VuZCAgKCkgICAgICAgICAgICB7IHJldHVybiBBbGlhc0xpc3QuZW5kKCk7ICAgfQorICBjb25zdF9hbGlhc19pdGVyYXRvciBhbGlhc19lbmQgICgpIGNvbnN0ICAgICAgeyByZXR1cm4gQWxpYXNMaXN0LmVuZCgpOyAgIH0KKyAgc2l6ZV90ICAgICAgICAgICAgICAgYWxpYXNfc2l6ZSAoKSBjb25zdCAgICAgIHsgcmV0dXJuIEFsaWFzTGlzdC5zaXplKCk7ICB9CisgIGJvb2wgICAgICAgICAgICAgICAgIGFsaWFzX2VtcHR5KCkgY29uc3QgICAgICB7IHJldHVybiBBbGlhc0xpc3QuZW1wdHkoKTsgfQorCisgIGl0ZXJhdG9yX3JhbmdlPGFsaWFzX2l0ZXJhdG9yPiBhbGlhc2VzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGFsaWFzX2JlZ2luKCksIGFsaWFzX2VuZCgpKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxjb25zdF9hbGlhc19pdGVyYXRvcj4gYWxpYXNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShhbGlhc19iZWdpbigpLCBhbGlhc19lbmQoKSk7CisgIH0KKworLy8vIEB9CisvLy8gQG5hbWUgSUZ1bmMgSXRlcmF0aW9uCisvLy8gQHsKKworICBpZnVuY19pdGVyYXRvciAgICAgICBpZnVuY19iZWdpbigpICAgICAgICAgICAgeyByZXR1cm4gSUZ1bmNMaXN0LmJlZ2luKCk7IH0KKyAgY29uc3RfaWZ1bmNfaXRlcmF0b3IgaWZ1bmNfYmVnaW4oKSBjb25zdCAgICAgIHsgcmV0dXJuIElGdW5jTGlzdC5iZWdpbigpOyB9CisgIGlmdW5jX2l0ZXJhdG9yICAgICAgIGlmdW5jX2VuZCAgKCkgICAgICAgICAgICB7IHJldHVybiBJRnVuY0xpc3QuZW5kKCk7ICAgfQorICBjb25zdF9pZnVuY19pdGVyYXRvciBpZnVuY19lbmQgICgpIGNvbnN0ICAgICAgeyByZXR1cm4gSUZ1bmNMaXN0LmVuZCgpOyAgIH0KKyAgc2l6ZV90ICAgICAgICAgICAgICAgaWZ1bmNfc2l6ZSAoKSBjb25zdCAgICAgIHsgcmV0dXJuIElGdW5jTGlzdC5zaXplKCk7ICB9CisgIGJvb2wgICAgICAgICAgICAgICAgIGlmdW5jX2VtcHR5KCkgY29uc3QgICAgICB7IHJldHVybiBJRnVuY0xpc3QuZW1wdHkoKTsgfQorCisgIGl0ZXJhdG9yX3JhbmdlPGlmdW5jX2l0ZXJhdG9yPiBpZnVuY3MoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoaWZ1bmNfYmVnaW4oKSwgaWZ1bmNfZW5kKCkpOworICB9CisgIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X2lmdW5jX2l0ZXJhdG9yPiBpZnVuY3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoaWZ1bmNfYmVnaW4oKSwgaWZ1bmNfZW5kKCkpOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBDb252ZW5pZW5jZSBpdGVyYXRvcnMKKyAgLy8vIEB7CisKKyAgdXNpbmcgZ2xvYmFsX29iamVjdF9pdGVyYXRvciA9CisgICAgICBjb25jYXRfaXRlcmF0b3I8R2xvYmFsT2JqZWN0LCBpdGVyYXRvciwgZ2xvYmFsX2l0ZXJhdG9yPjsKKyAgdXNpbmcgY29uc3RfZ2xvYmFsX29iamVjdF9pdGVyYXRvciA9CisgICAgICBjb25jYXRfaXRlcmF0b3I8Y29uc3QgR2xvYmFsT2JqZWN0LCBjb25zdF9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdF9nbG9iYWxfaXRlcmF0b3I+OworCisgIGl0ZXJhdG9yX3JhbmdlPGdsb2JhbF9vYmplY3RfaXRlcmF0b3I+IGdsb2JhbF9vYmplY3RzKCkgeworICAgIHJldHVybiBjb25jYXQ8R2xvYmFsT2JqZWN0PihmdW5jdGlvbnMoKSwgZ2xvYmFscygpKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxjb25zdF9nbG9iYWxfb2JqZWN0X2l0ZXJhdG9yPiBnbG9iYWxfb2JqZWN0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uY2F0PGNvbnN0IEdsb2JhbE9iamVjdD4oZnVuY3Rpb25zKCksIGdsb2JhbHMoKSk7CisgIH0KKworICBnbG9iYWxfb2JqZWN0X2l0ZXJhdG9yIGdsb2JhbF9vYmplY3RfYmVnaW4oKSB7CisgICAgcmV0dXJuIGdsb2JhbF9vYmplY3RzKCkuYmVnaW4oKTsKKyAgfQorICBnbG9iYWxfb2JqZWN0X2l0ZXJhdG9yIGdsb2JhbF9vYmplY3RfZW5kKCkgeyByZXR1cm4gZ2xvYmFsX29iamVjdHMoKS5lbmQoKTsgfQorCisgIGNvbnN0X2dsb2JhbF9vYmplY3RfaXRlcmF0b3IgZ2xvYmFsX29iamVjdF9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2xvYmFsX29iamVjdHMoKS5iZWdpbigpOworICB9CisgIGNvbnN0X2dsb2JhbF9vYmplY3RfaXRlcmF0b3IgZ2xvYmFsX29iamVjdF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdsb2JhbF9vYmplY3RzKCkuZW5kKCk7CisgIH0KKworICB1c2luZyBnbG9iYWxfdmFsdWVfaXRlcmF0b3IgPQorICAgICAgY29uY2F0X2l0ZXJhdG9yPEdsb2JhbFZhbHVlLCBpdGVyYXRvciwgZ2xvYmFsX2l0ZXJhdG9yLCBhbGlhc19pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICBpZnVuY19pdGVyYXRvcj47CisgIHVzaW5nIGNvbnN0X2dsb2JhbF92YWx1ZV9pdGVyYXRvciA9CisgICAgICBjb25jYXRfaXRlcmF0b3I8Y29uc3QgR2xvYmFsVmFsdWUsIGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9nbG9iYWxfaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3RfYWxpYXNfaXRlcmF0b3IsIGNvbnN0X2lmdW5jX2l0ZXJhdG9yPjsKKworICBpdGVyYXRvcl9yYW5nZTxnbG9iYWxfdmFsdWVfaXRlcmF0b3I+IGdsb2JhbF92YWx1ZXMoKSB7CisgICAgcmV0dXJuIGNvbmNhdDxHbG9iYWxWYWx1ZT4oZnVuY3Rpb25zKCksIGdsb2JhbHMoKSwgYWxpYXNlcygpLCBpZnVuY3MoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfZ2xvYmFsX3ZhbHVlX2l0ZXJhdG9yPiBnbG9iYWxfdmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiBjb25jYXQ8Y29uc3QgR2xvYmFsVmFsdWU+KGZ1bmN0aW9ucygpLCBnbG9iYWxzKCksIGFsaWFzZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnVuY3MoKSk7CisgIH0KKworICBnbG9iYWxfdmFsdWVfaXRlcmF0b3IgZ2xvYmFsX3ZhbHVlX2JlZ2luKCkgeyByZXR1cm4gZ2xvYmFsX3ZhbHVlcygpLmJlZ2luKCk7IH0KKyAgZ2xvYmFsX3ZhbHVlX2l0ZXJhdG9yIGdsb2JhbF92YWx1ZV9lbmQoKSB7IHJldHVybiBnbG9iYWxfdmFsdWVzKCkuZW5kKCk7IH0KKworICBjb25zdF9nbG9iYWxfdmFsdWVfaXRlcmF0b3IgZ2xvYmFsX3ZhbHVlX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBnbG9iYWxfdmFsdWVzKCkuYmVnaW4oKTsKKyAgfQorICBjb25zdF9nbG9iYWxfdmFsdWVfaXRlcmF0b3IgZ2xvYmFsX3ZhbHVlX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2xvYmFsX3ZhbHVlcygpLmVuZCgpOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBOYW1lZCBNZXRhZGF0YSBJdGVyYXRpb24KKyAgLy8vIEB7CisKKyAgbmFtZWRfbWV0YWRhdGFfaXRlcmF0b3IgbmFtZWRfbWV0YWRhdGFfYmVnaW4oKSB7IHJldHVybiBOYW1lZE1ETGlzdC5iZWdpbigpOyB9CisgIGNvbnN0X25hbWVkX21ldGFkYXRhX2l0ZXJhdG9yIG5hbWVkX21ldGFkYXRhX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBOYW1lZE1ETGlzdC5iZWdpbigpOworICB9CisKKyAgbmFtZWRfbWV0YWRhdGFfaXRlcmF0b3IgbmFtZWRfbWV0YWRhdGFfZW5kKCkgeyByZXR1cm4gTmFtZWRNRExpc3QuZW5kKCk7IH0KKyAgY29uc3RfbmFtZWRfbWV0YWRhdGFfaXRlcmF0b3IgbmFtZWRfbWV0YWRhdGFfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBOYW1lZE1ETGlzdC5lbmQoKTsKKyAgfQorCisgIHNpemVfdCBuYW1lZF9tZXRhZGF0YV9zaXplKCkgY29uc3QgeyByZXR1cm4gTmFtZWRNRExpc3Quc2l6ZSgpOyAgfQorICBib29sIG5hbWVkX21ldGFkYXRhX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gTmFtZWRNRExpc3QuZW1wdHkoKTsgfQorCisgIGl0ZXJhdG9yX3JhbmdlPG5hbWVkX21ldGFkYXRhX2l0ZXJhdG9yPiBuYW1lZF9tZXRhZGF0YSgpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShuYW1lZF9tZXRhZGF0YV9iZWdpbigpLCBuYW1lZF9tZXRhZGF0YV9lbmQoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfbmFtZWRfbWV0YWRhdGFfaXRlcmF0b3I+IG5hbWVkX21ldGFkYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKG5hbWVkX21ldGFkYXRhX2JlZ2luKCksIG5hbWVkX21ldGFkYXRhX2VuZCgpKTsKKyAgfQorCisgIC8vLyBBbiBpdGVyYXRvciBmb3IgRElDb21waWxlVW5pdHMgdGhhdCBza2lwcyB0aG9zZSBtYXJrZWQgTm9EZWJ1Zy4KKyAgY2xhc3MgZGVidWdfY29tcGlsZV91bml0c19pdGVyYXRvcgorICAgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZywgRElDb21waWxlVW5pdCAqPiB7CisgICAgTmFtZWRNRE5vZGUgKkNVczsKKyAgICB1bnNpZ25lZCBJZHg7CisKKyAgICB2b2lkIFNraXBOb0RlYnVnQ1VzKCk7CisKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IGRlYnVnX2NvbXBpbGVfdW5pdHNfaXRlcmF0b3IoTmFtZWRNRE5vZGUgKkNVcywgdW5zaWduZWQgSWR4KQorICAgICAgICA6IENVcyhDVXMpLCBJZHgoSWR4KSB7CisgICAgICBTa2lwTm9EZWJ1Z0NVcygpOworICAgIH0KKworICAgIGRlYnVnX2NvbXBpbGVfdW5pdHNfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgICArK0lkeDsKKyAgICAgIFNraXBOb0RlYnVnQ1VzKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgZGVidWdfY29tcGlsZV91bml0c19pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgICAgZGVidWdfY29tcGlsZV91bml0c19pdGVyYXRvciBUKCp0aGlzKTsKKyAgICAgICsrSWR4OworICAgICAgcmV0dXJuIFQ7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGRlYnVnX2NvbXBpbGVfdW5pdHNfaXRlcmF0b3IgJkkpIGNvbnN0IHsKKyAgICAgIHJldHVybiBJZHggPT0gSS5JZHg7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGRlYnVnX2NvbXBpbGVfdW5pdHNfaXRlcmF0b3IgJkkpIGNvbnN0IHsKKyAgICAgIHJldHVybiBJZHggIT0gSS5JZHg7CisgICAgfQorCisgICAgRElDb21waWxlVW5pdCAqb3BlcmF0b3IqKCkgY29uc3Q7CisgICAgRElDb21waWxlVW5pdCAqb3BlcmF0b3ItPigpIGNvbnN0OworICB9OworCisgIGRlYnVnX2NvbXBpbGVfdW5pdHNfaXRlcmF0b3IgZGVidWdfY29tcGlsZV91bml0c19iZWdpbigpIGNvbnN0IHsKKyAgICBhdXRvICpDVXMgPSBnZXROYW1lZE1ldGFkYXRhKCJsbHZtLmRiZy5jdSIpOworICAgIHJldHVybiBkZWJ1Z19jb21waWxlX3VuaXRzX2l0ZXJhdG9yKENVcywgMCk7CisgIH0KKworICBkZWJ1Z19jb21waWxlX3VuaXRzX2l0ZXJhdG9yIGRlYnVnX2NvbXBpbGVfdW5pdHNfZW5kKCkgY29uc3QgeworICAgIGF1dG8gKkNVcyA9IGdldE5hbWVkTWV0YWRhdGEoImxsdm0uZGJnLmN1Iik7CisgICAgcmV0dXJuIGRlYnVnX2NvbXBpbGVfdW5pdHNfaXRlcmF0b3IoQ1VzLCBDVXMgPyBDVXMtPmdldE51bU9wZXJhbmRzKCkgOiAwKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYW4gaXRlcmF0b3IgZm9yIGFsbCBESUNvbXBpbGVVbml0cyBsaXN0ZWQgaW4gdGhpcyBNb2R1bGUncworICAvLy8gbGx2bS5kYmcuY3UgbmFtZWQgbWV0YWRhdGEgbm9kZSBhbmQgYXJlbid0IGV4cGxpY2l0bHkgbWFya2VkIGFzCisgIC8vLyBOb0RlYnVnLgorICBpdGVyYXRvcl9yYW5nZTxkZWJ1Z19jb21waWxlX3VuaXRzX2l0ZXJhdG9yPiBkZWJ1Z19jb21waWxlX3VuaXRzKCkgY29uc3QgeworICAgIGF1dG8gKkNVcyA9IGdldE5hbWVkTWV0YWRhdGEoImxsdm0uZGJnLmN1Iik7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoCisgICAgICAgIGRlYnVnX2NvbXBpbGVfdW5pdHNfaXRlcmF0b3IoQ1VzLCAwKSwKKyAgICAgICAgZGVidWdfY29tcGlsZV91bml0c19pdGVyYXRvcihDVXMsIENVcyA/IENVcy0+Z2V0TnVtT3BlcmFuZHMoKSA6IDApKTsKKyAgfQorLy8vIEB9CisKKyAgLy8vIERlc3Ryb3kgQ29uc3RhbnRBcnJheXMgaW4gTExWTUNvbnRleHQgaWYgdGhleSBhcmUgbm90IHVzZWQuCisgIC8vLyBDb25zdGFudEFycmF5cyBjb25zdHJ1Y3RlZCBkdXJpbmcgbGlua2luZyBjYW4gY2F1c2UgcXVhZHJhdGljIG1lbW9yeQorICAvLy8gZXhwbG9zaW9uLiBSZWxlYXNpbmcgYWxsIHVudXNlZCBjb25zdGFudHMgY2FuIGNhdXNlIGEgMjAlIExUTyBjb21waWxlLXRpbWUKKyAgLy8vIHNsb3dkb3duIGZvciBhIGxhcmdlIGFwcGxpY2F0aW9uLgorICAvLy8KKyAgLy8vIE5PVEU6IENvbnN0YW50cyBhcmUgY3VycmVudGx5IG93bmVkIGJ5IExMVk1Db250ZXh0LiBUaGlzIGNhbiB0aGVuIG9ubHkKKyAgLy8vIGJlIGNhbGxlZCB3aGVyZSBhbGwgdXNlcyBvZiB0aGUgTExWTUNvbnRleHQgYXJlIHVuZGVyc3Rvb2QuCisgIHZvaWQgZHJvcFRyaXZpYWxseURlYWRDb25zdGFudEFycmF5cygpOworCisvLy8gQG5hbWUgVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHByaW50aW5nIGFuZCBkdW1waW5nIE1vZHVsZSBvYmplY3RzCisvLy8gQHsKKworICAvLy8gUHJpbnQgdGhlIG1vZHVsZSB0byBhbiBvdXRwdXQgc3RyZWFtIHdpdGggYW4gb3B0aW9uYWwKKyAgLy8vIEFzc2VtYmx5QW5ub3RhdGlvbldyaXRlci4gIElmIFxjIFNob3VsZFByZXNlcnZlVXNlTGlzdE9yZGVyLCB0aGVuIGluY2x1ZGUKKyAgLy8vIHVzZWxpc3RvcmRlciBkaXJlY3RpdmVzIHNvIHRoYXQgdXNlLWxpc3RzIGNhbiBiZSByZWNyZWF0ZWQgd2hlbiByZWFkaW5nCisgIC8vLyB0aGUgYXNzZW1ibHkuCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBBc3NlbWJseUFubm90YXRpb25Xcml0ZXIgKkFBVywKKyAgICAgICAgICAgICBib29sIFNob3VsZFByZXNlcnZlVXNlTGlzdE9yZGVyID0gZmFsc2UsCisgICAgICAgICAgICAgYm9vbCBJc0ZvckRlYnVnID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyBEdW1wIHRoZSBtb2R1bGUgdG8gc3RkZXJyIChmb3IgZGVidWdnaW5nKS4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gY2F1c2VzIGFsbCB0aGUgc3ViaW5zdHJ1Y3Rpb25zIHRvICJsZXQgZ28iIG9mIGFsbCByZWZlcmVuY2VzCisgIC8vLyB0aGF0IHRoZXkgYXJlIG1haW50YWluaW5nLiAgVGhpcyBhbGxvd3Mgb25lIHRvICdkZWxldGUnIGEgd2hvbGUgY2xhc3MgYXQKKyAgLy8vIGEgdGltZSwgZXZlbiB0aG91Z2ggdGhlcmUgbWF5IGJlIGNpcmN1bGFyIHJlZmVyZW5jZXMuLi4gZmlyc3QgYWxsCisgIC8vLyByZWZlcmVuY2VzIGFyZSBkcm9wcGVkLCBhbmQgYWxsIHVzZSBjb3VudHMgZ28gdG8gemVyby4gIFRoZW4gZXZlcnl0aGluZworICAvLy8gaXMgZGVsZXRlJ2QgZm9yIHJlYWwuICBOb3RlIHRoYXQgbm8gb3BlcmF0aW9ucyBhcmUgdmFsaWQgb24gYW4gb2JqZWN0CisgIC8vLyB0aGF0IGhhcyAiZHJvcHBlZCBhbGwgcmVmZXJlbmNlcyIsIGV4Y2VwdCBvcGVyYXRvciBkZWxldGUuCisgIHZvaWQgZHJvcEFsbFJlZmVyZW5jZXMoKTsKKworLy8vIEB9CisvLy8gQG5hbWUgVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHF1ZXJ5aW5nIERlYnVnIGluZm9ybWF0aW9uLgorLy8vIEB7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBOdW1iZXIgb2YgUmVnaXN0ZXIgUGFyYW1ldGVyc0R3YXJmIFZlcnNpb24gYnkgY2hlY2tpbmcKKyAgLy8vIG1vZHVsZSBmbGFncy4KKyAgdW5zaWduZWQgZ2V0TnVtYmVyUmVnaXN0ZXJQYXJhbWV0ZXJzKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBEd2FyZiBWZXJzaW9uIGJ5IGNoZWNraW5nIG1vZHVsZSBmbGFncy4KKyAgdW5zaWduZWQgZ2V0RHdhcmZWZXJzaW9uKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBDb2RlVmlldyBWZXJzaW9uIGJ5IGNoZWNraW5nIG1vZHVsZSBmbGFncy4KKyAgLy8vIFJldHVybnMgemVybyBpZiBub3QgcHJlc2VudCBpbiBtb2R1bGUuCisgIHVuc2lnbmVkIGdldENvZGVWaWV3RmxhZygpIGNvbnN0OworCisvLy8gQH0KKy8vLyBAbmFtZSBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgcXVlcnlpbmcgYW5kIHNldHRpbmcgUElDIGxldmVsCisvLy8gQHsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIFBJQyBsZXZlbCAoc21hbGwgb3IgbGFyZ2UgbW9kZWwpCisgIFBJQ0xldmVsOjpMZXZlbCBnZXRQSUNMZXZlbCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBQSUMgbGV2ZWwgKHNtYWxsIG9yIGxhcmdlIG1vZGVsKQorICB2b2lkIHNldFBJQ0xldmVsKFBJQ0xldmVsOjpMZXZlbCBQTCk7CisvLy8gQH0KKworLy8vIEB9CisvLy8gQG5hbWUgVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHF1ZXJ5aW5nIGFuZCBzZXR0aW5nIFBJRSBsZXZlbAorLy8vIEB7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBQSUUgbGV2ZWwgKHNtYWxsIG9yIGxhcmdlIG1vZGVsKQorICBQSUVMZXZlbDo6TGV2ZWwgZ2V0UElFTGV2ZWwoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFNldCB0aGUgUElFIGxldmVsIChzbWFsbCBvciBsYXJnZSBtb2RlbCkKKyAgdm9pZCBzZXRQSUVMZXZlbChQSUVMZXZlbDo6TGV2ZWwgUEwpOworLy8vIEB9CisKKyAgLy8vIEBuYW1lIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBxdWVyeWluZyBhbmQgc2V0dGluZyBQR08gc3VtbWFyeQorICAvLy8gQHsKKworICAvLy8gXGJyaWVmIEF0dGFjaCBwcm9maWxlIHN1bW1hcnkgbWV0YWRhdGEgdG8gdGhpcyBtb2R1bGUuCisgIHZvaWQgc2V0UHJvZmlsZVN1bW1hcnkoTWV0YWRhdGEgKk0pOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyBwcm9maWxlIHN1bW1hcnkgbWV0YWRhdGEKKyAgTWV0YWRhdGEgKmdldFByb2ZpbGVTdW1tYXJ5KCk7CisgIC8vLyBAfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgUExUIHNob3VsZCBiZSBhdm9pZGVkIGZvciBSVExpYiBjYWxscy4KKyAgYm9vbCBnZXRSdExpYlVzZUdPVCgpIGNvbnN0OworCisgIC8vLyBTZXQgdGhhdCBQTFQgc2hvdWxkIGJlIGF2b2lkIGZvciBSVExpYiBjYWxscy4KKyAgdm9pZCBzZXRSdExpYlVzZUdPVCgpOworCisKKyAgLy8vIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBnaXZlbiBtZW1vcnkgYnVmZmVyLgorICB2b2lkIHNldE93bmVkTWVtb3J5QnVmZmVyKHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IE1CKTsKK307CisKKy8vLyBcYnJpZWYgR2l2ZW4gImxsdm0udXNlZCIgb3IgImxsdm0uY29tcGlsZXIudXNlZCIgYXMgYSBnbG9iYWwgbmFtZSwgY29sbGVjdAorLy8vIHRoZSBpbml0aWFsaXplciBlbGVtZW50cyBvZiB0aGF0IGdsb2JhbCBpbiBTZXQgYW5kIHJldHVybiB0aGUgZ2xvYmFsIGl0c2VsZi4KK0dsb2JhbFZhcmlhYmxlICpjb2xsZWN0VXNlZEdsb2JhbFZhcmlhYmxlcyhjb25zdCBNb2R1bGUgJk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXRJbXBsPEdsb2JhbFZhbHVlICo+ICZTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb21waWxlclVzZWQpOworCisvLy8gQW4gcmF3X29zdHJlYW0gaW5zZXJ0ZXIgZm9yIG1vZHVsZXMuCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk8sIGNvbnN0IE1vZHVsZSAmTSkgeworICBNLnByaW50KE8sIG51bGxwdHIpOworICByZXR1cm4gTzsKK30KKworLy8gQ3JlYXRlIHdyYXBwZXJzIGZvciBDIEJpbmRpbmcgdHlwZXMgKHNlZSBDQmluZGluZ1dyYXBwaW5nLmgpLgorREVGSU5FX1NJTVBMRV9DT05WRVJTSU9OX0ZVTkNUSU9OUyhNb2R1bGUsIExMVk1Nb2R1bGVSZWYpCisKKy8qIExMVk1Nb2R1bGVQcm92aWRlclJlZiBleGlzdHMgZm9yIGhpc3RvcmljYWwgcmVhc29ucywgYnV0IG5vdyBqdXN0IGhvbGRzIGEKKyAqIE1vZHVsZS4KKyAqLworaW5saW5lIE1vZHVsZSAqdW53cmFwKExMVk1Nb2R1bGVQcm92aWRlclJlZiBNUCkgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxNb2R1bGUqPihNUCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX01PRFVMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL01vZHVsZVNsb3RUcmFja2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL01vZHVsZVNsb3RUcmFja2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyNmZiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTW9kdWxlU2xvdFRyYWNrZXIuaApAQCAtMCwwICsxLDgwIEBACisvLz09PS0tIGxsdm0vSVIvTW9kdWxlU2xvdFRyYWNrZXIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfTU9EVUxFU0xPVFRSQUNLRVJfSAorI2RlZmluZSBMTFZNX0lSX01PRFVMRVNMT1RUUkFDS0VSX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNb2R1bGU7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIFNsb3RUcmFja2VyOworY2xhc3MgVmFsdWU7CisKKy8vLyBNYW5hZ2UgbGlmZXRpbWUgb2YgYSBzbG90IHRyYWNrZXIgZm9yIHByaW50aW5nIElSLgorLy8vCisvLy8gV3JhcHBlciBhcm91bmQgdGhlIFxhIFNsb3RUcmFja2VyIHVzZWQgaW50ZXJuYWxseSBieSBcYSBBc21Xcml0ZXIuICBUaGlzCisvLy8gY2xhc3MgYWxsb3dzIGNhbGxlcnMgdG8gc2hhcmUgdGhlIGNvc3Qgb2YgaW5jb3Jwb3JhdGluZyB0aGUgbWV0YWRhdGEgaW4gYQorLy8vIG1vZHVsZSBvciBhIGZ1bmN0aW9uLgorLy8vCisvLy8gSWYgdGhlIElSIGNoYW5nZXMgZnJvbSB1bmRlcm5lYXRoIFxhIE1vZHVsZVNsb3RUcmFja2VyLCBzdHJpbmdzIGxpa2UKKy8vLyAiPGJhZHJlZj4iIHdpbGwgYmUgcHJpbnRlZCwgb3IsIHdvcnNlLCB0aGUgd3Jvbmcgc2xvdHMgZW50aXJlbHkuCitjbGFzcyBNb2R1bGVTbG90VHJhY2tlciB7CisgIC8vLyBTdG9yYWdlIGZvciBhIHNsb3QgdHJhY2tlci4KKyAgc3RkOjp1bmlxdWVfcHRyPFNsb3RUcmFja2VyPiBNYWNoaW5lU3RvcmFnZTsKKyAgYm9vbCBTaG91bGRDcmVhdGVTdG9yYWdlID0gZmFsc2U7CisgIGJvb2wgU2hvdWxkSW5pdGlhbGl6ZUFsbE1ldGFkYXRhID0gZmFsc2U7CisKKyAgY29uc3QgTW9kdWxlICpNID0gbnVsbHB0cjsKKyAgY29uc3QgRnVuY3Rpb24gKkYgPSBudWxscHRyOworICBTbG90VHJhY2tlciAqTWFjaGluZSA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgLy8vIFdyYXAgYSBwcmVpbml0aWFsaXplZCBTbG90VHJhY2tlci4KKyAgTW9kdWxlU2xvdFRyYWNrZXIoU2xvdFRyYWNrZXIgJk1hY2hpbmUsIGNvbnN0IE1vZHVsZSAqTSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb24gKkYgPSBudWxscHRyKTsKKworICAvLy8gQ29uc3RydWN0IGEgc2xvdCB0cmFja2VyIGZyb20gYSBtb2R1bGUuCisgIC8vLworICAvLy8gSWYgXGEgTSBpcyBcYyBudWxscHRyLCB1c2VzIGEgbnVsbCBzbG90IHRyYWNrZXIuICBPdGhlcndpc2UsIGluaXRpYWxpemVzCisgIC8vLyBhIHNsb3QgdHJhY2tlciwgYW5kIGluaXRpYWxpemVzIGFsbCBtZXRhZGF0YSBzbG90cy4gIFxjCisgIC8vLyBTaG91bGRJbml0aWFsaXplQWxsTWV0YWRhdGEgZGVmYXVsdHMgdG8gdHJ1ZSBiZWNhdXNlIHRoaXMgaXMgZXhwZWN0ZWQgdG8KKyAgLy8vIGJlIHNoYXJlZCBiZXR3ZWVuIG11bHRpcGxlIGNhbGxlcnMsIGFuZCBvdGhlcndpc2UgTUROb2RlIHJlZmVyZW5jZXMgd2lsbAorICAvLy8gbm90IG1hdGNoIHVwLgorICBleHBsaWNpdCBNb2R1bGVTbG90VHJhY2tlcihjb25zdCBNb2R1bGUgKk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkSW5pdGlhbGl6ZUFsbE1ldGFkYXRhID0gdHJ1ZSk7CisKKyAgLy8vIERlc3RydWN0b3IgdG8gY2xlYW4gdXAgc3RvcmFnZS4KKyAgfk1vZHVsZVNsb3RUcmFja2VyKCk7CisKKyAgLy8vIExhemlseSBjcmVhdGVzIGEgc2xvdCB0cmFja2VyLgorICBTbG90VHJhY2tlciAqZ2V0TWFjaGluZSgpOworCisgIGNvbnN0IE1vZHVsZSAqZ2V0TW9kdWxlKCkgY29uc3QgeyByZXR1cm4gTTsgfQorICBjb25zdCBGdW5jdGlvbiAqZ2V0Q3VycmVudEZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gRjsgfQorCisgIC8vLyBJbmNvcnBvcmF0ZSB0aGUgZ2l2ZW4gZnVuY3Rpb24uCisgIC8vLworICAvLy8gUHVyZ2UgdGhlIGN1cnJlbnRseSBpbmNvcnBvcmF0ZWQgZnVuY3Rpb24gYW5kIGluY29ycG9yYXRlIFxjIEYuICBJZiBcYyBGCisgIC8vLyBpcyBjdXJyZW50bHkgaW5jb3Jwb3JhdGVkLCB0aGlzIGlzIGEgbm8tb3AuCisgIHZvaWQgaW5jb3Jwb3JhdGVGdW5jdGlvbihjb25zdCBGdW5jdGlvbiAmRik7CisKKyAgLy8vIFJldHVybiB0aGUgc2xvdCBudW1iZXIgb2YgdGhlIHNwZWNpZmllZCBsb2NhbCB2YWx1ZS4KKyAgLy8vCisgIC8vLyBBIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcyB0aGlzIHZhbHVlIHNob3VsZCBiZSBpbmNvcnBvcmF0ZWQgcHJpb3IgdG8gY2FsbGluZworICAvLy8gdGhpcyBtZXRob2QuCisgIC8vLyBSZXR1cm4gLTEgaWYgdGhlIHZhbHVlIGlzIG5vdCBpbiB0aGUgZnVuY3Rpb24ncyBTbG90VHJhY2tlci4KKyAgaW50IGdldExvY2FsU2xvdChjb25zdCBWYWx1ZSAqVik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTW9kdWxlU3VtbWFyeUluZGV4LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL01vZHVsZVN1bW1hcnlJbmRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZjhjZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL01vZHVsZVN1bW1hcnlJbmRleC5oCkBAIC0wLDAgKzEsMTEwMCBAQAorLy89PT0tIGxsdm0vTW9kdWxlU3VtbWFyeUluZGV4LmggLSBNb2R1bGUgU3VtbWFyeSBJbmRleCAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gQGZpbGUKKy8vLyBNb2R1bGVTdW1tYXJ5SW5kZXguaCBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyB0aGUgY2xhc3NlcyB0aGF0CisvLy8gIGhvbGQgdGhlIG1vZHVsZSBpbmRleCBhbmQgc3VtbWFyeSBmb3IgZnVuY3Rpb24gaW1wb3J0aW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9NT0RVTEVTVU1NQVJZSU5ERVhfSAorI2RlZmluZSBMTFZNX0lSX01PRFVMRVNVTU1BUllJTkRFWF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TY2FsZWROdW1iZXIuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSB5YW1sIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBNYXBwaW5nVHJhaXRzOworCit9IC8vIGVuZCBuYW1lc3BhY2UgeWFtbAorCisvLy8gXGJyaWVmIENsYXNzIHRvIGFjY3VtdWxhdGUgYW5kIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgYSBjYWxsZWUuCitzdHJ1Y3QgQ2FsbGVlSW5mbyB7CisgIGVudW0gY2xhc3MgSG90bmVzc1R5cGUgOiB1aW50OF90IHsKKyAgICBVbmtub3duID0gMCwKKyAgICBDb2xkID0gMSwKKyAgICBOb25lID0gMiwKKyAgICBIb3QgPSAzLAorICAgIENyaXRpY2FsID0gNAorICB9OworCisgIC8vIFRoZSBzaXplIG9mIHRoZSBiaXQtZmllbGQgbWlnaHQgbmVlZCB0byBiZSBhZGp1c3RlZCBpZiBtb3JlIHZhbHVlcyBhcmUKKyAgLy8gYWRkZWQgdG8gSG90bmVzc1R5cGUgZW51bS4KKyAgdWludDMyX3QgSG90bmVzcyA6IDM7CisKKyAgLy8vIFRoZSB2YWx1ZSBzdG9yZWQgaW4gUmVsQmxvY2tGcmVxIGhhcyB0byBiZSBpbnRlcnByZXRlZCBhcyB0aGUgZGlnaXRzIG9mCisgIC8vLyBhIHNjYWxlZCBudW1iZXIgd2l0aCBhIHNjYWxlIG9mIFxwIC1TY2FsZVNoaWZ0LgorICB1aW50MzJfdCBSZWxCbG9ja0ZyZXEgOiAyOTsKKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IFNjYWxlU2hpZnQgPSA4OworICBzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IE1heFJlbEJsb2NrRnJlcSA9ICgxIDw8IDI5KSAtIDE7CisKKyAgQ2FsbGVlSW5mbygpCisgICAgICA6IEhvdG5lc3Moc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEhvdG5lc3NUeXBlOjpVbmtub3duKSksIFJlbEJsb2NrRnJlcSgwKSB7fQorICBleHBsaWNpdCBDYWxsZWVJbmZvKEhvdG5lc3NUeXBlIEhvdG5lc3MsIHVpbnQ2NF90IFJlbEJGKQorICAgICAgOiBIb3RuZXNzKHN0YXRpY19jYXN0PHVpbnQzMl90PihIb3RuZXNzKSksIFJlbEJsb2NrRnJlcShSZWxCRikge30KKworICB2b2lkIHVwZGF0ZUhvdG5lc3MoY29uc3QgSG90bmVzc1R5cGUgT3RoZXJIb3RuZXNzKSB7CisgICAgSG90bmVzcyA9IHN0ZDo6bWF4KEhvdG5lc3MsIHN0YXRpY19jYXN0PHVpbnQzMl90PihPdGhlckhvdG5lc3MpKTsKKyAgfQorCisgIEhvdG5lc3NUeXBlIGdldEhvdG5lc3MoKSBjb25zdCB7IHJldHVybiBIb3RuZXNzVHlwZShIb3RuZXNzKTsgfQorCisgIC8vLyBVcGRhdGUgXHAgUmVsQmxvY2tGcmVxIGZyb20gXHAgQmxvY2tGcmVxIGFuZCBccCBFbnRyeUZyZXEKKyAgLy8vCisgIC8vLyBCbG9ja0ZyZXEgaXMgZGl2aWRlZCBieSBFbnRyeUZyZXEgYW5kIGFkZGVkIHRvIFJlbEJsb2NrRnJlcS4gVG8gcmVwcmVzZW50CisgIC8vLyBmcmFjdGlvbmFsIHZhbHVlcywgdGhlIHJlc3VsdCBpcyByZXByZXNlbnRlZCBhcyBhIGZpeGVkIHBvaW50IG51bWJlciB3aXRoCisgIC8vLyBzY2FsZSBvZiAtU2NhbGVTaGlmdC4KKyAgdm9pZCB1cGRhdGVSZWxCbG9ja0ZyZXEodWludDY0X3QgQmxvY2tGcmVxLCB1aW50NjRfdCBFbnRyeUZyZXEpIHsKKyAgICBpZiAoRW50cnlGcmVxID09IDApCisgICAgICByZXR1cm47CisgICAgdXNpbmcgU2NhbGVkNjQgPSBTY2FsZWROdW1iZXI8dWludDY0X3Q+OworICAgIFNjYWxlZDY0IFRlbXAoQmxvY2tGcmVxLCBTY2FsZVNoaWZ0KTsKKyAgICBUZW1wIC89IFNjYWxlZDY0OjpnZXQoRW50cnlGcmVxKTsKKworICAgIHVpbnQ2NF90IFN1bSA9CisgICAgICAgIFNhdHVyYXRpbmdBZGQ8dWludDY0X3Q+KFRlbXAudG9JbnQ8dWludDY0X3Q+KCksIFJlbEJsb2NrRnJlcSk7CisgICAgU3VtID0gc3RkOjptaW4oU3VtLCB1aW50NjRfdChNYXhSZWxCbG9ja0ZyZXEpKTsKKyAgICBSZWxCbG9ja0ZyZXEgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oU3VtKTsKKyAgfQorfTsKKworY2xhc3MgR2xvYmFsVmFsdWVTdW1tYXJ5OworCit1c2luZyBHbG9iYWxWYWx1ZVN1bW1hcnlMaXN0ID0gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEdsb2JhbFZhbHVlU3VtbWFyeT4+OworCitzdHJ1Y3QgR2xvYmFsVmFsdWVTdW1tYXJ5SW5mbyB7CisgIHVuaW9uIE5hbWVPckdWIHsKKyAgICBOYW1lT3JHVihib29sIElzQW5hbHlzaXMpIHsKKyAgICAgIGlmIChJc0FuYWx5c2lzKQorICAgICAgICBHViA9IG51bGxwdHI7CisgICAgICBlbHNlCisgICAgICAgIE5hbWUgPSAiIjsKKyAgICB9CisKKyAgICAvLy8gVGhlIEdsb2JhbFZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzdW1tYXJ5LiBUaGlzIGlzIG9ubHkgdXNlZCBpbgorICAgIC8vLyBwZXItbW9kdWxlIHN1bW1hcmllcywgd2hlbiBtb2R1bGUgYW5hbHlzaXMgaXMgYmVpbmcgcnVuLgorICAgIGNvbnN0IEdsb2JhbFZhbHVlICpHVjsKKworICAgIC8vLyBTdW1tYXJ5IHN0cmluZyByZXByZXNlbnRhdGlvbi4gVGhpcyBTdHJpbmdSZWYgcG9pbnRzIHRvIEJDIG1vZHVsZQorICAgIC8vLyBzdHJpbmcgdGFibGUgYW5kIGlzIHZhbGlkIHVudGlsIG1vZHVsZSBkYXRhIGlzIHN0b3JlZCBpbiBtZW1vcnkuCisgICAgLy8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBoYXBwZW4gdW50aWwgcnVuVGhpbkxUT0JhY2tlbmQgZnVuY3Rpb24gaXMKKyAgICAvLy8gY2FsbGVkLCBzbyBpdCBpcyBzYWZlIHRvIHVzZSB0aGlzIGZpZWxkIGR1cmluZyB0aGluIGxpbmsuIFRoaXMgZmllbGQKKyAgICAvLy8gaXMgb25seSB2YWxpZCBpZiBzdW1tYXJ5IGluZGV4IHdhcyBsb2FkZWQgZnJvbSBCQyBmaWxlLgorICAgIFN0cmluZ1JlZiBOYW1lOworICB9IFU7CisKKyAgR2xvYmFsVmFsdWVTdW1tYXJ5SW5mbyhib29sIElzQW5hbHlzaXMpIDogVShJc0FuYWx5c2lzKSB7fQorCisgIC8vLyBMaXN0IG9mIGdsb2JhbCB2YWx1ZSBzdW1tYXJ5IHN0cnVjdHVyZXMgZm9yIGEgcGFydGljdWxhciB2YWx1ZSBoZWxkCisgIC8vLyBpbiB0aGUgR2xvYmFsVmFsdWVNYXAuIFJlcXVpcmVzIGEgdmVjdG9yIGluIHRoZSBjYXNlIG9mIG11bHRpcGxlCisgIC8vLyBDT01EQVQgdmFsdWVzIG9mIHRoZSBzYW1lIG5hbWUuCisgIEdsb2JhbFZhbHVlU3VtbWFyeUxpc3QgU3VtbWFyeUxpc3Q7Cit9OworCisvLy8gTWFwIGZyb20gZ2xvYmFsIHZhbHVlIEdVSUQgdG8gY29ycmVzcG9uZGluZyBzdW1tYXJ5IHN0cnVjdHVyZXMuIFVzZSBhCisvLy8gc3RkOjptYXAgcmF0aGVyIHRoYW4gYSBEZW5zZU1hcCBzbyB0aGF0IHBvaW50ZXJzIHRvIHRoZSBtYXAncyB2YWx1ZV90eXBlCisvLy8gKHdoaWNoIGFyZSB1c2VkIGJ5IFZhbHVlSW5mbykgYXJlIG5vdCBpbnZhbGlkYXRlZCBieSBpbnNlcnRpb24uIEFsc28gaXQgd2lsbAorLy8vIGxpa2VseSBpbmN1ciBsZXNzIG92ZXJoZWFkLCBhcyB0aGUgdmFsdWUgdHlwZSBpcyBub3QgdmVyeSBzbWFsbCBhbmQgdGhlIHNpemUKKy8vLyBvZiB0aGUgbWFwIGlzIHVua25vd24sIHJlc3VsdGluZyBpbiBpbmVmZmljaWVuY2llcyBkdWUgdG8gcmVwZWF0ZWQKKy8vLyBpbnNlcnRpb25zIGFuZCByZXNpemluZy4KK3VzaW5nIEdsb2JhbFZhbHVlU3VtbWFyeU1hcFR5ID0KKyAgICBzdGQ6Om1hcDxHbG9iYWxWYWx1ZTo6R1VJRCwgR2xvYmFsVmFsdWVTdW1tYXJ5SW5mbz47CisKKy8vLyBTdHJ1Y3QgdGhhdCBob2xkcyBhIHJlZmVyZW5jZSB0byBhIHBhcnRpY3VsYXIgR1VJRCBpbiBhIGdsb2JhbCB2YWx1ZQorLy8vIHN1bW1hcnkuCitzdHJ1Y3QgVmFsdWVJbmZvIHsKKyAgUG9pbnRlckludFBhaXI8Y29uc3QgR2xvYmFsVmFsdWVTdW1tYXJ5TWFwVHk6OnZhbHVlX3R5cGUgKiwgMSwgYm9vbD4KKyAgICAgIFJlZkFuZEZsYWc7CisKKyAgVmFsdWVJbmZvKCkgPSBkZWZhdWx0OworICBWYWx1ZUluZm8oYm9vbCBJc0FuYWx5c2lzLCBjb25zdCBHbG9iYWxWYWx1ZVN1bW1hcnlNYXBUeTo6dmFsdWVfdHlwZSAqUikgeworICAgIFJlZkFuZEZsYWcuc2V0UG9pbnRlcihSKTsKKyAgICBSZWZBbmRGbGFnLnNldEludChJc0FuYWx5c2lzKTsKKyAgfQorCisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBnZXRSZWYoKTsgfQorCisgIEdsb2JhbFZhbHVlOjpHVUlEIGdldEdVSUQoKSBjb25zdCB7IHJldHVybiBnZXRSZWYoKS0+Zmlyc3Q7IH0KKyAgY29uc3QgR2xvYmFsVmFsdWUgKmdldFZhbHVlKCkgY29uc3QgeworICAgIGFzc2VydChpc0Zyb21BbmFseXNpcygpKTsKKyAgICByZXR1cm4gZ2V0UmVmKCktPnNlY29uZC5VLkdWOworICB9CisKKyAgQXJyYXlSZWY8c3RkOjp1bmlxdWVfcHRyPEdsb2JhbFZhbHVlU3VtbWFyeT4+IGdldFN1bW1hcnlMaXN0KCkgY29uc3QgeworICAgIHJldHVybiBnZXRSZWYoKS0+c2Vjb25kLlN1bW1hcnlMaXN0OworICB9CisKKyAgU3RyaW5nUmVmIG5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRnJvbUFuYWx5c2lzKCkgPyBnZXRSZWYoKS0+c2Vjb25kLlUuR1YtPmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0UmVmKCktPnNlY29uZC5VLk5hbWU7CisgIH0KKworICBib29sIGlzRnJvbUFuYWx5c2lzKCkgY29uc3QgeyByZXR1cm4gUmVmQW5kRmxhZy5nZXRJbnQoKTsgfQorCisgIGNvbnN0IEdsb2JhbFZhbHVlU3VtbWFyeU1hcFR5Ojp2YWx1ZV90eXBlICpnZXRSZWYoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlZkFuZEZsYWcuZ2V0UG9pbnRlcigpOworICB9CisKKyAgYm9vbCBpc0RTT0xvY2FsKCkgY29uc3Q7Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZhbHVlSW5mbyAmQSwgY29uc3QgVmFsdWVJbmZvICZCKSB7CisgIGFzc2VydChBLmdldFJlZigpICYmIEIuZ2V0UmVmKCkgJiYKKyAgICAgICAgICJOZWVkIFZhbHVlSW5mbyB3aXRoIG5vbi1udWxsIFJlZiB0byBjb21wYXJlIEdVSURzIik7CisgIHJldHVybiBBLmdldFJlZigpID09IEIuZ2V0UmVmKCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgVmFsdWVJbmZvICZBLCBjb25zdCBWYWx1ZUluZm8gJkIpIHsKKyAgYXNzZXJ0KEEuZ2V0UmVmKCkgJiYgQi5nZXRSZWYoKSAmJgorICAgICAgICAgIk5lZWQgVmFsdWVJbmZvIHdpdGggbm9uLW51bGwgUmVmIHRvIGNvbXBhcmUgR1VJRHMiKTsKKyAgcmV0dXJuIEEuZ2V0R1VJRCgpICE9IEIuZ2V0R1VJRCgpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgVmFsdWVJbmZvICZBLCBjb25zdCBWYWx1ZUluZm8gJkIpIHsKKyAgYXNzZXJ0KEEuZ2V0UmVmKCkgJiYgQi5nZXRSZWYoKSAmJgorICAgICAgICAgIk5lZWQgVmFsdWVJbmZvIHdpdGggbm9uLW51bGwgUmVmIHRvIGNvbXBhcmUgR1VJRHMiKTsKKyAgcmV0dXJuIEEuZ2V0R1VJRCgpIDwgQi5nZXRHVUlEKCk7Cit9CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88VmFsdWVJbmZvPiB7CisgIHN0YXRpYyBpbmxpbmUgVmFsdWVJbmZvIGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBWYWx1ZUluZm8oZmFsc2UsIChHbG9iYWxWYWx1ZVN1bW1hcnlNYXBUeTo6dmFsdWVfdHlwZSAqKS04KTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgVmFsdWVJbmZvIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gVmFsdWVJbmZvKGZhbHNlLCAoR2xvYmFsVmFsdWVTdW1tYXJ5TWFwVHk6OnZhbHVlX3R5cGUgKiktMTYpOworICB9CisKKyAgc3RhdGljIGlubGluZSBib29sIGlzU3BlY2lhbEtleShWYWx1ZUluZm8gVikgeworICAgIHJldHVybiBWID09IGdldFRvbWJzdG9uZUtleSgpIHx8IFYgPT0gZ2V0RW1wdHlLZXkoKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoVmFsdWVJbmZvIEwsIFZhbHVlSW5mbyBSKSB7CisgICAgLy8gV2UgYXJlIG5vdCBzdXBwb3NlZCB0byBtaXggVmFsdWVJbmZvKHMpIHdpdGggZGlmZmVyZW50IGFuYWx5c2lzIGZsYWcKKyAgICAvLyBpbiBhIHNhbWUgY29udGFpbmVyLgorICAgIGFzc2VydChpc1NwZWNpYWxLZXkoTCkgfHwgaXNTcGVjaWFsS2V5KFIpIHx8CisgICAgICAgICAgIChMLmlzRnJvbUFuYWx5c2lzKCkgPT0gUi5pc0Zyb21BbmFseXNpcygpKSk7CisgICAgcmV0dXJuIEwuZ2V0UmVmKCkgPT0gUi5nZXRSZWYoKTsKKyAgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKFZhbHVlSW5mbyBJKSB7IHJldHVybiAodWludHB0cl90KUkuZ2V0UmVmKCk7IH0KK307CisKKy8vLyBcYnJpZWYgRnVuY3Rpb24gYW5kIHZhcmlhYmxlIHN1bW1hcnkgaW5mb3JtYXRpb24gdG8gYWlkIGRlY2lzaW9ucyBhbmQKKy8vLyBpbXBsZW1lbnRhdGlvbiBvZiBpbXBvcnRpbmcuCitjbGFzcyBHbG9iYWxWYWx1ZVN1bW1hcnkgeworcHVibGljOgorICAvLy8gXGJyaWVmIFN1YnViY2xhc3MgZGlzY3JpbWluYXRvciAoZm9yIGR5bl9jYXN0PD4gZXQgYWwuKQorICBlbnVtIFN1bW1hcnlLaW5kIDogdW5zaWduZWQgeyBBbGlhc0tpbmQsIEZ1bmN0aW9uS2luZCwgR2xvYmFsVmFyS2luZCB9OworCisgIC8vLyBHcm91cCBmbGFncyAoTGlua2FnZSwgTm90RWxpZ2libGVUb0ltcG9ydCwgZXRjLikgYXMgYSBiaXRmaWVsZC4KKyAgc3RydWN0IEdWRmxhZ3MgeworICAgIC8vLyBcYnJpZWYgVGhlIGxpbmthZ2UgdHlwZSBvZiB0aGUgYXNzb2NpYXRlZCBnbG9iYWwgdmFsdWUuCisgICAgLy8vCisgICAgLy8vIE9uZSB1c2UgaXMgdG8gZmxhZyB2YWx1ZXMgdGhhdCBoYXZlIGxvY2FsIGxpbmthZ2UgdHlwZXMgYW5kIG5lZWQgdG8KKyAgICAvLy8gaGF2ZSBtb2R1bGUgaWRlbnRpZmllciBhcHBlbmRlZCBiZWZvcmUgcGxhY2luZyBpbnRvIHRoZSBjb21iaW5lZAorICAgIC8vLyBpbmRleCwgdG8gZGlzYW1iaWd1YXRlIGZyb20gb3RoZXIgdmFsdWVzIHdpdGggdGhlIHNhbWUgbmFtZS4KKyAgICAvLy8gSW4gdGhlIGZ1dHVyZSB0aGlzIHdpbGwgYmUgdXNlZCB0byB1cGRhdGUgYW5kIG9wdGltaXplIGxpbmthZ2UKKyAgICAvLy8gdHlwZXMgYmFzZWQgb24gZ2xvYmFsIHN1bW1hcnktYmFzZWQgYW5hbHlzaXMuCisgICAgdW5zaWduZWQgTGlua2FnZSA6IDQ7CisKKyAgICAvLy8gSW5kaWNhdGUgaWYgdGhlIGdsb2JhbCB2YWx1ZSBjYW5ub3QgYmUgaW1wb3J0ZWQgKGUuZy4gaXQgY2Fubm90CisgICAgLy8vIGJlIHJlbmFtZWQgb3IgcmVmZXJlbmNlcyBzb21ldGhpbmcgdGhhdCBjYW4ndCBiZSByZW5hbWVkKS4KKyAgICB1bnNpZ25lZCBOb3RFbGlnaWJsZVRvSW1wb3J0IDogMTsKKworICAgIC8vLyBJbiBwZXItbW9kdWxlIHN1bW1hcnksIGluZGljYXRlIHRoYXQgdGhlIGdsb2JhbCB2YWx1ZSBtdXN0IGJlIGNvbnNpZGVyZWQKKyAgICAvLy8gYSBsaXZlIHJvb3QgZm9yIGluZGV4LWJhc2VkIGxpdmVuZXNzIGFuYWx5c2lzLiBVc2VkIGZvciBzcGVjaWFsIExMVk0KKyAgICAvLy8gdmFsdWVzIHN1Y2ggYXMgbGx2bS5nbG9iYWxfY3RvcnMgdGhhdCB0aGUgbGlua2VyIGRvZXMgbm90IGtub3cgYWJvdXQuCisgICAgLy8vCisgICAgLy8vIEluIGNvbWJpbmVkIHN1bW1hcnksIGluZGljYXRlIHRoYXQgdGhlIGdsb2JhbCB2YWx1ZSBpcyBsaXZlLgorICAgIHVuc2lnbmVkIExpdmUgOiAxOworCisgICAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSBsaW5rZXIgcmVzb2x2ZWQgdGhlIHN5bWJvbCB0byBhIGRlZmluaXRpb24gZnJvbQorICAgIC8vLyB3aXRoaW4gdGhlIHNhbWUgbGlua2FnZSB1bml0LgorICAgIHVuc2lnbmVkIERTT0xvY2FsIDogMTsKKworICAgIC8vLyBDb252ZW5pZW5jZSBDb25zdHJ1Y3RvcnMKKyAgICBleHBsaWNpdCBHVkZsYWdzKEdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXMgTGlua2FnZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgTm90RWxpZ2libGVUb0ltcG9ydCwgYm9vbCBMaXZlLCBib29sIElzTG9jYWwpCisgICAgICAgIDogTGlua2FnZShMaW5rYWdlKSwgTm90RWxpZ2libGVUb0ltcG9ydChOb3RFbGlnaWJsZVRvSW1wb3J0KSwKKyAgICAgICAgICBMaXZlKExpdmUpLCBEU09Mb2NhbChJc0xvY2FsKSB7fQorICB9OworCitwcml2YXRlOgorICAvLy8gS2luZCBvZiBzdW1tYXJ5IGZvciB1c2UgaW4gZHluX2Nhc3Q8PiBldCBhbC4KKyAgU3VtbWFyeUtpbmQgS2luZDsKKworICBHVkZsYWdzIEZsYWdzOworCisgIC8vLyBUaGlzIGlzIHRoZSBoYXNoIG9mIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaW4gdGhlIG9yaWdpbmFsIGZpbGUuIEl0IGlzCisgIC8vLyBpZGVudGljYWwgdG8gdGhlIEdVSUQgZm9yIGdsb2JhbCBzeW1ib2xzLCBidXQgZGlmZmVycyBmb3IgbG9jYWwgc2luY2UgdGhlCisgIC8vLyBHVUlEIGluY2x1ZGVzIHRoZSBtb2R1bGUgbGV2ZWwgaWQgaW4gdGhlIGhhc2guCisgIEdsb2JhbFZhbHVlOjpHVUlEIE9yaWdpbmFsTmFtZSA9IDA7CisKKyAgLy8vIFxicmllZiBQYXRoIG9mIG1vZHVsZSBJUiBjb250YWluaW5nIHZhbHVlJ3MgZGVmaW5pdGlvbiwgdXNlZCB0byBsb2NhdGUKKyAgLy8vIG1vZHVsZSBkdXJpbmcgaW1wb3J0aW5nLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgb25seSB1c2VkIGR1cmluZyBwYXJzaW5nIG9mIHRoZSBjb21iaW5lZCBpbmRleCwgb3Igd2hlbgorICAvLy8gcGFyc2luZyB0aGUgcGVyLW1vZHVsZSBpbmRleCBmb3IgY3JlYXRpb24gb2YgdGhlIGNvbWJpbmVkIHN1bW1hcnkgaW5kZXgsCisgIC8vLyBub3QgZHVyaW5nIHdyaXRpbmcgb2YgdGhlIHBlci1tb2R1bGUgaW5kZXggd2hpY2ggZG9lc24ndCBjb250YWluIGEKKyAgLy8vIG1vZHVsZSBwYXRoIHN0cmluZyB0YWJsZS4KKyAgU3RyaW5nUmVmIE1vZHVsZVBhdGg7CisKKyAgLy8vIExpc3Qgb2YgdmFsdWVzIHJlZmVyZW5jZWQgYnkgdGhpcyBnbG9iYWwgdmFsdWUncyBkZWZpbml0aW9uCisgIC8vLyAoZWl0aGVyIGJ5IHRoZSBpbml0aWFsaXplciBvZiBhIGdsb2JhbCB2YXJpYWJsZSwgb3IgcmVmZXJlbmNlZAorICAvLy8gZnJvbSB3aXRoaW4gYSBmdW5jdGlvbikuIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBmdW5jdGlvbnMgY2FsbGVkLCB3aGljaAorICAvLy8gYXJlIGxpc3RlZCBpbiB0aGUgZGVyaXZlZCBGdW5jdGlvblN1bW1hcnkgb2JqZWN0LgorICBzdGQ6OnZlY3RvcjxWYWx1ZUluZm8+IFJlZkVkZ2VMaXN0OworCitwcm90ZWN0ZWQ6CisgIEdsb2JhbFZhbHVlU3VtbWFyeShTdW1tYXJ5S2luZCBLLCBHVkZsYWdzIEZsYWdzLCBzdGQ6OnZlY3RvcjxWYWx1ZUluZm8+IFJlZnMpCisgICAgICA6IEtpbmQoSyksIEZsYWdzKEZsYWdzKSwgUmVmRWRnZUxpc3Qoc3RkOjptb3ZlKFJlZnMpKSB7CisgICAgYXNzZXJ0KChLICE9IEFsaWFzS2luZCB8fCBSZWZzLmVtcHR5KCkpICYmCisgICAgICAgICAgICJFeHBlY3Qgbm8gcmVmZXJlbmNlcyBmb3IgQWxpYXNTdW1tYXJ5Iik7CisgIH0KKworcHVibGljOgorICB2aXJ0dWFsIH5HbG9iYWxWYWx1ZVN1bW1hcnkoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFJldHVybnMgdGhlIGhhc2ggb2YgdGhlIG9yaWdpbmFsIG5hbWUsIGl0IGlzIGlkZW50aWNhbCB0byB0aGUgR1VJRCBmb3IKKyAgLy8vIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2xzLCBidXQgbm90IGZvciBsb2NhbCBvbmVzLgorICBHbG9iYWxWYWx1ZTo6R1VJRCBnZXRPcmlnaW5hbE5hbWUoKSB7IHJldHVybiBPcmlnaW5hbE5hbWU7IH0KKworICAvLy8gSW5pdGlhbGl6ZSB0aGUgb3JpZ2luYWwgbmFtZSBoYXNoIGluIHRoaXMgc3VtbWFyeS4KKyAgdm9pZCBzZXRPcmlnaW5hbE5hbWUoR2xvYmFsVmFsdWU6OkdVSUQgTmFtZSkgeyBPcmlnaW5hbE5hbWUgPSBOYW1lOyB9CisKKyAgLy8vIFdoaWNoIGtpbmQgb2Ygc3VtbWFyeSBzdWJjbGFzcyB0aGlzIGlzLgorICBTdW1tYXJ5S2luZCBnZXRTdW1tYXJ5S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICAvLy8gU2V0IHRoZSBwYXRoIHRvIHRoZSBtb2R1bGUgY29udGFpbmluZyB0aGlzIGZ1bmN0aW9uLCBmb3IgdXNlIGluCisgIC8vLyB0aGUgY29tYmluZWQgaW5kZXguCisgIHZvaWQgc2V0TW9kdWxlUGF0aChTdHJpbmdSZWYgTW9kUGF0aCkgeyBNb2R1bGVQYXRoID0gTW9kUGF0aDsgfQorCisgIC8vLyBHZXQgdGhlIHBhdGggdG8gdGhlIG1vZHVsZSBjb250YWluaW5nIHRoaXMgZnVuY3Rpb24uCisgIFN0cmluZ1JlZiBtb2R1bGVQYXRoKCkgY29uc3QgeyByZXR1cm4gTW9kdWxlUGF0aDsgfQorCisgIC8vLyBHZXQgdGhlIGZsYWdzIGZvciB0aGlzIEdsb2JhbFZhbHVlIChzZWUgXHAgc3RydWN0IEdWRmxhZ3MpLgorICBHVkZsYWdzIGZsYWdzKCkgeyByZXR1cm4gRmxhZ3M7IH0KKworICAvLy8gUmV0dXJuIGxpbmthZ2UgdHlwZSByZWNvcmRlZCBmb3IgdGhpcyBnbG9iYWwgdmFsdWUuCisgIEdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXMgbGlua2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8R2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcz4oRmxhZ3MuTGlua2FnZSk7CisgIH0KKworICAvLy8gU2V0cyB0aGUgbGlua2FnZSB0byB0aGUgdmFsdWUgZGV0ZXJtaW5lZCBieSBnbG9iYWwgc3VtbWFyeS1iYXNlZAorICAvLy8gb3B0aW1pemF0aW9uLiBXaWxsIGJlIGFwcGxpZWQgaW4gdGhlIFRoaW5MVE8gYmFja2VuZHMuCisgIHZvaWQgc2V0TGlua2FnZShHbG9iYWxWYWx1ZTo6TGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICBGbGFncy5MaW5rYWdlID0gTGlua2FnZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGdsb2JhbCB2YWx1ZSBjYW4ndCBiZSBpbXBvcnRlZC4KKyAgYm9vbCBub3RFbGlnaWJsZVRvSW1wb3J0KCkgY29uc3QgeyByZXR1cm4gRmxhZ3MuTm90RWxpZ2libGVUb0ltcG9ydDsgfQorCisgIGJvb2wgaXNMaXZlKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MuTGl2ZTsgfQorCisgIHZvaWQgc2V0TGl2ZShib29sIExpdmUpIHsgRmxhZ3MuTGl2ZSA9IExpdmU7IH0KKworICB2b2lkIHNldERTT0xvY2FsKGJvb2wgTG9jYWwpIHsgRmxhZ3MuRFNPTG9jYWwgPSBMb2NhbDsgfQorCisgIGJvb2wgaXNEU09Mb2NhbCgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzLkRTT0xvY2FsOyB9CisKKyAgLy8vIEZsYWcgdGhhdCB0aGlzIGdsb2JhbCB2YWx1ZSBjYW5ub3QgYmUgaW1wb3J0ZWQuCisgIHZvaWQgc2V0Tm90RWxpZ2libGVUb0ltcG9ydCgpIHsgRmxhZ3MuTm90RWxpZ2libGVUb0ltcG9ydCA9IHRydWU7IH0KKworICAvLy8gUmV0dXJuIHRoZSBsaXN0IG9mIHZhbHVlcyByZWZlcmVuY2VkIGJ5IHRoaXMgZ2xvYmFsIHZhbHVlIGRlZmluaXRpb24uCisgIEFycmF5UmVmPFZhbHVlSW5mbz4gcmVmcygpIGNvbnN0IHsgcmV0dXJuIFJlZkVkZ2VMaXN0OyB9CisKKyAgLy8vIElmIHRoaXMgaXMgYW4gYWxpYXMgc3VtbWFyeSwgcmV0dXJucyB0aGUgc3VtbWFyeSBvZiB0aGUgYWxpYXNlZCBvYmplY3QgKGEKKyAgLy8vIGdsb2JhbCB2YXJpYWJsZSBvciBmdW5jdGlvbiksIG90aGVyd2lzZSByZXR1cm5zIGl0c2VsZi4KKyAgR2xvYmFsVmFsdWVTdW1tYXJ5ICpnZXRCYXNlT2JqZWN0KCk7CisgIGNvbnN0IEdsb2JhbFZhbHVlU3VtbWFyeSAqZ2V0QmFzZU9iamVjdCgpIGNvbnN0OworCisgIGZyaWVuZCBjbGFzcyBNb2R1bGVTdW1tYXJ5SW5kZXg7Cit9OworCisvLy8gXGJyaWVmIEFsaWFzIHN1bW1hcnkgaW5mb3JtYXRpb24uCitjbGFzcyBBbGlhc1N1bW1hcnkgOiBwdWJsaWMgR2xvYmFsVmFsdWVTdW1tYXJ5IHsKKyAgR2xvYmFsVmFsdWVTdW1tYXJ5ICpBbGlhc2VlU3VtbWFyeTsKKyAgLy8gQWxpYXNlZUdVSUQgaXMgb25seSBzZXQgYW5kIGFjY2Vzc2VkIHdoZW4gd2UgYXJlIGJ1aWxkaW5nIGEgY29tYmluZWQgaW5kZXgKKyAgLy8gdmlhIHRoZSBCaXRjb2RlUmVhZGVyLgorICBHbG9iYWxWYWx1ZTo6R1VJRCBBbGlhc2VlR1VJRDsKKworcHVibGljOgorICBBbGlhc1N1bW1hcnkoR1ZGbGFncyBGbGFncykKKyAgICAgIDogR2xvYmFsVmFsdWVTdW1tYXJ5KEFsaWFzS2luZCwgRmxhZ3MsIEFycmF5UmVmPFZhbHVlSW5mbz57fSksCisgICAgICAgIEFsaWFzZWVTdW1tYXJ5KG51bGxwdHIpLCBBbGlhc2VlR1VJRCgwKSB7fQorCisgIC8vLyBDaGVjayBpZiB0aGlzIGlzIGFuIGFsaWFzIHN1bW1hcnkuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgR2xvYmFsVmFsdWVTdW1tYXJ5ICpHVlMpIHsKKyAgICByZXR1cm4gR1ZTLT5nZXRTdW1tYXJ5S2luZCgpID09IEFsaWFzS2luZDsKKyAgfQorCisgIHZvaWQgc2V0QWxpYXNlZShHbG9iYWxWYWx1ZVN1bW1hcnkgKkFsaWFzZWUpIHsgQWxpYXNlZVN1bW1hcnkgPSBBbGlhc2VlOyB9CisgIHZvaWQgc2V0QWxpYXNlZUdVSUQoR2xvYmFsVmFsdWU6OkdVSUQgR1VJRCkgeyBBbGlhc2VlR1VJRCA9IEdVSUQ7IH0KKworICBjb25zdCBHbG9iYWxWYWx1ZVN1bW1hcnkgJmdldEFsaWFzZWUoKSBjb25zdCB7CisgICAgYXNzZXJ0KEFsaWFzZWVTdW1tYXJ5ICYmICJVbmV4cGVjdGVkIG1pc3NpbmcgYWxpYXNlZSBzdW1tYXJ5Iik7CisgICAgcmV0dXJuICpBbGlhc2VlU3VtbWFyeTsKKyAgfQorCisgIEdsb2JhbFZhbHVlU3VtbWFyeSAmZ2V0QWxpYXNlZSgpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxHbG9iYWxWYWx1ZVN1bW1hcnkgJj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQWxpYXNTdW1tYXJ5ICo+KHRoaXMpLT5nZXRBbGlhc2VlKCkpOworICB9CisgIGNvbnN0IEdsb2JhbFZhbHVlOjpHVUlEICZnZXRBbGlhc2VlR1VJRCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoQWxpYXNlZUdVSUQgJiYgIlVuZXhwZWN0ZWQgbWlzc2luZyBhbGlhc2VlIEdVSUQiKTsKKyAgICByZXR1cm4gQWxpYXNlZUdVSUQ7CisgIH0KK307CisKK2NvbnN0IGlubGluZSBHbG9iYWxWYWx1ZVN1bW1hcnkgKkdsb2JhbFZhbHVlU3VtbWFyeTo6Z2V0QmFzZU9iamVjdCgpIGNvbnN0IHsKKyAgaWYgKGF1dG8gKkFTID0gZHluX2Nhc3Q8QWxpYXNTdW1tYXJ5Pih0aGlzKSkKKyAgICByZXR1cm4gJkFTLT5nZXRBbGlhc2VlKCk7CisgIHJldHVybiB0aGlzOworfQorCitpbmxpbmUgR2xvYmFsVmFsdWVTdW1tYXJ5ICpHbG9iYWxWYWx1ZVN1bW1hcnk6OmdldEJhc2VPYmplY3QoKSB7CisgIGlmIChhdXRvICpBUyA9IGR5bl9jYXN0PEFsaWFzU3VtbWFyeT4odGhpcykpCisgICAgcmV0dXJuICZBUy0+Z2V0QWxpYXNlZSgpOworICByZXR1cm4gdGhpczsKK30KKworLy8vIFxicmllZiBGdW5jdGlvbiBzdW1tYXJ5IGluZm9ybWF0aW9uIHRvIGFpZCBkZWNpc2lvbnMgYW5kIGltcGxlbWVudGF0aW9uIG9mCisvLy8gaW1wb3J0aW5nLgorY2xhc3MgRnVuY3Rpb25TdW1tYXJ5IDogcHVibGljIEdsb2JhbFZhbHVlU3VtbWFyeSB7CitwdWJsaWM6CisgIC8vLyA8Q2FsbGVlVmFsdWVJbmZvLCBDYWxsZWVJbmZvPiBjYWxsIGVkZ2UgcGFpci4KKyAgdXNpbmcgRWRnZVR5ID0gc3RkOjpwYWlyPFZhbHVlSW5mbywgQ2FsbGVlSW5mbz47CisKKyAgLy8vIEFuICJpZGVudGlmaWVyIiBmb3IgYSB2aXJ0dWFsIGZ1bmN0aW9uLiBUaGlzIGNvbnRhaW5zIHRoZSB0eXBlIGlkZW50aWZpZXIKKyAgLy8vIHJlcHJlc2VudGVkIGFzIGEgR1VJRCBhbmQgdGhlIG9mZnNldCBmcm9tIHRoZSBhZGRyZXNzIHBvaW50IHRvIHRoZSB2aXJ0dWFsCisgIC8vLyBmdW5jdGlvbiBwb2ludGVyLCB3aGVyZSAiYWRkcmVzcyBwb2ludCIgaXMgYXMgZGVmaW5lZCBpbiB0aGUgSXRhbml1bSBBQkk6CisgIC8vLyBodHRwczovL2l0YW5pdW0tY3h4LWFiaS5naXRodWIuaW8vY3h4LWFiaS9hYmkuaHRtbCN2dGFibGUtZ2VuZXJhbAorICBzdHJ1Y3QgVkZ1bmNJZCB7CisgICAgR2xvYmFsVmFsdWU6OkdVSUQgR1VJRDsKKyAgICB1aW50NjRfdCBPZmZzZXQ7CisgIH07CisKKyAgLy8vIEEgc3BlY2lmaWNhdGlvbiBmb3IgYSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwgd2l0aCBhbGwgY29uc3RhbnQgaW50ZWdlcgorICAvLy8gYXJndW1lbnRzLiBUaGlzIGlzIHVzZWQgdG8gcGVyZm9ybSB2aXJ0dWFsIGNvbnN0YW50IHByb3BhZ2F0aW9uIG9uIHRoZQorICAvLy8gc3VtbWFyeS4KKyAgc3RydWN0IENvbnN0VkNhbGwgeworICAgIFZGdW5jSWQgVkZ1bmM7CisgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IEFyZ3M7CisgIH07CisKKyAgLy8vIEZ1bmN0aW9uIGF0dHJpYnV0ZSBmbGFncy4gVXNlZCB0byB0cmFjayBpZiBhIGZ1bmN0aW9uIGFjY2Vzc2VzIG1lbW9yeSwKKyAgLy8vIHJlY3Vyc2VzIG9yIGFsaWFzZXMuCisgIHN0cnVjdCBGRmxhZ3MgeworICAgIHVuc2lnbmVkIFJlYWROb25lIDogMTsKKyAgICB1bnNpZ25lZCBSZWFkT25seSA6IDE7CisgICAgdW5zaWduZWQgTm9SZWN1cnNlIDogMTsKKyAgICB1bnNpZ25lZCBSZXR1cm5Eb2VzTm90QWxpYXMgOiAxOworICB9OworCisgIC8vLyBDcmVhdGUgYW4gZW1wdHkgRnVuY3Rpb25TdW1tYXJ5ICh3aXRoIHNwZWNpZmllZCBjYWxsIGVkZ2VzKS4KKyAgLy8vIFVzZWQgdG8gcmVwcmVzZW50IGV4dGVybmFsIG5vZGVzIGFuZCB0aGUgZHVtbXkgcm9vdCBub2RlLgorICBzdGF0aWMgRnVuY3Rpb25TdW1tYXJ5CisgIG1ha2VEdW1teUZ1bmN0aW9uU3VtbWFyeShzdGQ6OnZlY3RvcjxGdW5jdGlvblN1bW1hcnk6OkVkZ2VUeT4gRWRnZXMpIHsKKyAgICByZXR1cm4gRnVuY3Rpb25TdW1tYXJ5KAorICAgICAgICBGdW5jdGlvblN1bW1hcnk6OkdWRmxhZ3MoCisgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6TGlua2FnZVR5cGVzOjpBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZSwKKyAgICAgICAgICAgIC8qTm90RWxpZ2libGVUb0ltcG9ydD0qL3RydWUsIC8qTGl2ZT0qL3RydWUsIC8qSXNMb2NhbD0qL2ZhbHNlKSwKKyAgICAgICAgMCwgRnVuY3Rpb25TdW1tYXJ5OjpGRmxhZ3N7fSwgc3RkOjp2ZWN0b3I8VmFsdWVJbmZvPigpLAorICAgICAgICBzdGQ6Om1vdmUoRWRnZXMpLCBzdGQ6OnZlY3RvcjxHbG9iYWxWYWx1ZTo6R1VJRD4oKSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8RnVuY3Rpb25TdW1tYXJ5OjpWRnVuY0lkPigpLAorICAgICAgICBzdGQ6OnZlY3RvcjxGdW5jdGlvblN1bW1hcnk6OlZGdW5jSWQ+KCksCisgICAgICAgIHN0ZDo6dmVjdG9yPEZ1bmN0aW9uU3VtbWFyeTo6Q29uc3RWQ2FsbD4oKSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8RnVuY3Rpb25TdW1tYXJ5OjpDb25zdFZDYWxsPigpKTsKKyAgfQorCisgIC8vLyBBIGR1bW15IG5vZGUgdG8gcmVmZXJlbmNlIGV4dGVybmFsIGZ1bmN0aW9ucyB0aGF0IGFyZW4ndCBpbiB0aGUgaW5kZXgKKyAgc3RhdGljIEZ1bmN0aW9uU3VtbWFyeSBFeHRlcm5hbE5vZGU7CisKK3ByaXZhdGU6CisgIC8vLyBOdW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIChpZ25vcmluZyBkZWJ1ZyBpbnN0cnVjdGlvbnMsIGUuZy4pIGNvbXB1dGVkCisgIC8vLyBkdXJpbmcgdGhlIGluaXRpYWwgY29tcGlsZSBzdGVwIHdoZW4gdGhlIHN1bW1hcnkgaW5kZXggaXMgZmlyc3QgYnVpbHQuCisgIHVuc2lnbmVkIEluc3RDb3VudDsKKworICAvLy8gRnVuY3Rpb24gYXR0cmlidXRlIGZsYWdzLiBVc2VkIHRvIHRyYWNrIGlmIGEgZnVuY3Rpb24gYWNjZXNzZXMgbWVtb3J5LAorICAvLy8gcmVjdXJzZXMgb3IgYWxpYXNlcy4KKyAgRkZsYWdzIEZ1bkZsYWdzOworCisgIC8vLyBMaXN0IG9mIDxDYWxsZWVWYWx1ZUluZm8sIENhbGxlZUluZm8+IGNhbGwgZWRnZSBwYWlycyBmcm9tIHRoaXMgZnVuY3Rpb24uCisgIHN0ZDo6dmVjdG9yPEVkZ2VUeT4gQ2FsbEdyYXBoRWRnZUxpc3Q7CisKKyAgLy8vIEFsbCB0eXBlIGlkZW50aWZpZXIgcmVsYXRlZCBpbmZvcm1hdGlvbi4gQmVjYXVzZSB0aGVzZSBmaWVsZHMgYXJlCisgIC8vLyByZWxhdGl2ZWx5IHVuY29tbW9uIHdlIG9ubHkgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZW0gaWYgbmVjZXNzYXJ5LgorICBzdHJ1Y3QgVHlwZUlkSW5mbyB7CisgICAgLy8vIExpc3Qgb2YgdHlwZSBpZGVudGlmaWVycyB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gaW4gbGx2bS50eXBlLnRlc3QKKyAgICAvLy8gaW50cmluc2ljcyBvdGhlciB0aGFuIGJ5IGFuIGxsdm0uYXNzdW1lIGludHJpbnNpYywgcmVwcmVzZW50ZWQgYXMgR1VJRHMuCisgICAgc3RkOjp2ZWN0b3I8R2xvYmFsVmFsdWU6OkdVSUQ+IFR5cGVUZXN0czsKKworICAgIC8vLyBMaXN0IG9mIHZpcnR1YWwgY2FsbHMgbWFkZSBieSB0aGlzIGZ1bmN0aW9uIHVzaW5nIChyZXNwZWN0aXZlbHkpCisgICAgLy8vIGxsdm0uYXNzdW1lKGxsdm0udHlwZS50ZXN0KSBvciBsbHZtLnR5cGUuY2hlY2tlZC5sb2FkIGludHJpbnNpY3MgdGhhdCBkbworICAgIC8vLyBub3QgaGF2ZSBhbGwgY29uc3RhbnQgaW50ZWdlciBhcmd1bWVudHMuCisgICAgc3RkOjp2ZWN0b3I8VkZ1bmNJZD4gVHlwZVRlc3RBc3N1bWVWQ2FsbHMsIFR5cGVDaGVja2VkTG9hZFZDYWxsczsKKworICAgIC8vLyBMaXN0IG9mIHZpcnR1YWwgY2FsbHMgbWFkZSBieSB0aGlzIGZ1bmN0aW9uIHVzaW5nIChyZXNwZWN0aXZlbHkpCisgICAgLy8vIGxsdm0uYXNzdW1lKGxsdm0udHlwZS50ZXN0KSBvciBsbHZtLnR5cGUuY2hlY2tlZC5sb2FkIGludHJpbnNpY3Mgd2l0aAorICAgIC8vLyBhbGwgY29uc3RhbnQgaW50ZWdlciBhcmd1bWVudHMuCisgICAgc3RkOjp2ZWN0b3I8Q29uc3RWQ2FsbD4gVHlwZVRlc3RBc3N1bWVDb25zdFZDYWxscywKKyAgICAgICAgVHlwZUNoZWNrZWRMb2FkQ29uc3RWQ2FsbHM7CisgIH07CisKKyAgc3RkOjp1bmlxdWVfcHRyPFR5cGVJZEluZm8+IFRJZEluZm87CisKK3B1YmxpYzoKKyAgRnVuY3Rpb25TdW1tYXJ5KEdWRmxhZ3MgRmxhZ3MsIHVuc2lnbmVkIE51bUluc3RzLCBGRmxhZ3MgRnVuRmxhZ3MsCisgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxWYWx1ZUluZm8+IFJlZnMsIHN0ZDo6dmVjdG9yPEVkZ2VUeT4gQ0dFZGdlcywKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEdsb2JhbFZhbHVlOjpHVUlEPiBUeXBlVGVzdHMsCisgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxWRnVuY0lkPiBUeXBlVGVzdEFzc3VtZVZDYWxscywKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZGdW5jSWQ+IFR5cGVDaGVja2VkTG9hZFZDYWxscywKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENvbnN0VkNhbGw+IFR5cGVUZXN0QXNzdW1lQ29uc3RWQ2FsbHMsCisgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDb25zdFZDYWxsPiBUeXBlQ2hlY2tlZExvYWRDb25zdFZDYWxscykKKyAgICAgIDogR2xvYmFsVmFsdWVTdW1tYXJ5KEZ1bmN0aW9uS2luZCwgRmxhZ3MsIHN0ZDo6bW92ZShSZWZzKSksCisgICAgICAgIEluc3RDb3VudChOdW1JbnN0cyksIEZ1bkZsYWdzKEZ1bkZsYWdzKSwKKyAgICAgICAgQ2FsbEdyYXBoRWRnZUxpc3Qoc3RkOjptb3ZlKENHRWRnZXMpKSB7CisgICAgaWYgKCFUeXBlVGVzdHMuZW1wdHkoKSB8fCAhVHlwZVRlc3RBc3N1bWVWQ2FsbHMuZW1wdHkoKSB8fAorICAgICAgICAhVHlwZUNoZWNrZWRMb2FkVkNhbGxzLmVtcHR5KCkgfHwgIVR5cGVUZXN0QXNzdW1lQ29uc3RWQ2FsbHMuZW1wdHkoKSB8fAorICAgICAgICAhVHlwZUNoZWNrZWRMb2FkQ29uc3RWQ2FsbHMuZW1wdHkoKSkKKyAgICAgIFRJZEluZm8gPSBsbHZtOjptYWtlX3VuaXF1ZTxUeXBlSWRJbmZvPihUeXBlSWRJbmZveworICAgICAgICAgIHN0ZDo6bW92ZShUeXBlVGVzdHMpLCBzdGQ6Om1vdmUoVHlwZVRlc3RBc3N1bWVWQ2FsbHMpLAorICAgICAgICAgIHN0ZDo6bW92ZShUeXBlQ2hlY2tlZExvYWRWQ2FsbHMpLAorICAgICAgICAgIHN0ZDo6bW92ZShUeXBlVGVzdEFzc3VtZUNvbnN0VkNhbGxzKSwKKyAgICAgICAgICBzdGQ6Om1vdmUoVHlwZUNoZWNrZWRMb2FkQ29uc3RWQ2FsbHMpfSk7CisgIH0KKworICAvLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGZ1bmN0aW9uIHN1bW1hcnkuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgR2xvYmFsVmFsdWVTdW1tYXJ5ICpHVlMpIHsKKyAgICByZXR1cm4gR1ZTLT5nZXRTdW1tYXJ5S2luZCgpID09IEZ1bmN0aW9uS2luZDsKKyAgfQorCisgIC8vLyBHZXQgZnVuY3Rpb24gYXR0cmlidXRlIGZsYWdzLgorICBGRmxhZ3MgJmZmbGFncygpIHsgcmV0dXJuIEZ1bkZsYWdzOyB9CisKKyAgLy8vIEdldCB0aGUgaW5zdHJ1Y3Rpb24gY291bnQgcmVjb3JkZWQgZm9yIHRoaXMgZnVuY3Rpb24uCisgIHVuc2lnbmVkIGluc3RDb3VudCgpIGNvbnN0IHsgcmV0dXJuIEluc3RDb3VudDsgfQorCisgIC8vLyBSZXR1cm4gdGhlIGxpc3Qgb2YgPENhbGxlZVZhbHVlSW5mbywgQ2FsbGVlSW5mbz4gcGFpcnMuCisgIEFycmF5UmVmPEVkZ2VUeT4gY2FsbHMoKSBjb25zdCB7IHJldHVybiBDYWxsR3JhcGhFZGdlTGlzdDsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBsaXN0IG9mIHR5cGUgaWRlbnRpZmllcnMgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIGluCisgIC8vLyBsbHZtLnR5cGUudGVzdCBpbnRyaW5zaWNzIG90aGVyIHRoYW4gYnkgYW4gbGx2bS5hc3N1bWUgaW50cmluc2ljLAorICAvLy8gcmVwcmVzZW50ZWQgYXMgR1VJRHMuCisgIEFycmF5UmVmPEdsb2JhbFZhbHVlOjpHVUlEPiB0eXBlX3Rlc3RzKCkgY29uc3QgeworICAgIGlmIChUSWRJbmZvKQorICAgICAgcmV0dXJuIFRJZEluZm8tPlR5cGVUZXN0czsKKyAgICByZXR1cm4ge307CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbGlzdCBvZiB2aXJ0dWFsIGNhbGxzIG1hZGUgYnkgdGhpcyBmdW5jdGlvbiB1c2luZworICAvLy8gbGx2bS5hc3N1bWUobGx2bS50eXBlLnRlc3QpIGludHJpbnNpY3MgdGhhdCBkbyBub3QgaGF2ZSBhbGwgY29uc3RhbnQKKyAgLy8vIGludGVnZXIgYXJndW1lbnRzLgorICBBcnJheVJlZjxWRnVuY0lkPiB0eXBlX3Rlc3RfYXNzdW1lX3ZjYWxscygpIGNvbnN0IHsKKyAgICBpZiAoVElkSW5mbykKKyAgICAgIHJldHVybiBUSWRJbmZvLT5UeXBlVGVzdEFzc3VtZVZDYWxsczsKKyAgICByZXR1cm4ge307CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbGlzdCBvZiB2aXJ0dWFsIGNhbGxzIG1hZGUgYnkgdGhpcyBmdW5jdGlvbiB1c2luZworICAvLy8gbGx2bS50eXBlLmNoZWNrZWQubG9hZCBpbnRyaW5zaWNzIHRoYXQgZG8gbm90IGhhdmUgYWxsIGNvbnN0YW50IGludGVnZXIKKyAgLy8vIGFyZ3VtZW50cy4KKyAgQXJyYXlSZWY8VkZ1bmNJZD4gdHlwZV9jaGVja2VkX2xvYWRfdmNhbGxzKCkgY29uc3QgeworICAgIGlmIChUSWRJbmZvKQorICAgICAgcmV0dXJuIFRJZEluZm8tPlR5cGVDaGVja2VkTG9hZFZDYWxsczsKKyAgICByZXR1cm4ge307CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbGlzdCBvZiB2aXJ0dWFsIGNhbGxzIG1hZGUgYnkgdGhpcyBmdW5jdGlvbiB1c2luZworICAvLy8gbGx2bS5hc3N1bWUobGx2bS50eXBlLnRlc3QpIGludHJpbnNpY3Mgd2l0aCBhbGwgY29uc3RhbnQgaW50ZWdlcgorICAvLy8gYXJndW1lbnRzLgorICBBcnJheVJlZjxDb25zdFZDYWxsPiB0eXBlX3Rlc3RfYXNzdW1lX2NvbnN0X3ZjYWxscygpIGNvbnN0IHsKKyAgICBpZiAoVElkSW5mbykKKyAgICAgIHJldHVybiBUSWRJbmZvLT5UeXBlVGVzdEFzc3VtZUNvbnN0VkNhbGxzOworICAgIHJldHVybiB7fTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBsaXN0IG9mIHZpcnR1YWwgY2FsbHMgbWFkZSBieSB0aGlzIGZ1bmN0aW9uIHVzaW5nCisgIC8vLyBsbHZtLnR5cGUuY2hlY2tlZC5sb2FkIGludHJpbnNpY3Mgd2l0aCBhbGwgY29uc3RhbnQgaW50ZWdlciBhcmd1bWVudHMuCisgIEFycmF5UmVmPENvbnN0VkNhbGw+IHR5cGVfY2hlY2tlZF9sb2FkX2NvbnN0X3ZjYWxscygpIGNvbnN0IHsKKyAgICBpZiAoVElkSW5mbykKKyAgICAgIHJldHVybiBUSWRJbmZvLT5UeXBlQ2hlY2tlZExvYWRDb25zdFZDYWxsczsKKyAgICByZXR1cm4ge307CisgIH0KKworICAvLy8gQWRkIGEgdHlwZSB0ZXN0IHRvIHRoZSBzdW1tYXJ5LiBUaGlzIGlzIHVzZWQgYnkgV2hvbGVQcm9ncmFtRGV2aXJ0IGlmIHdlCisgIC8vLyB3ZXJlIHVuYWJsZSB0byBkZXZpcnR1YWxpemUgYSBjaGVja2VkIGNhbGwuCisgIHZvaWQgYWRkVHlwZVRlc3QoR2xvYmFsVmFsdWU6OkdVSUQgR3VpZCkgeworICAgIGlmICghVElkSW5mbykKKyAgICAgIFRJZEluZm8gPSBsbHZtOjptYWtlX3VuaXF1ZTxUeXBlSWRJbmZvPigpOworICAgIFRJZEluZm8tPlR5cGVUZXN0cy5wdXNoX2JhY2soR3VpZCk7CisgIH0KKworICBmcmllbmQgc3RydWN0IEdyYXBoVHJhaXRzPFZhbHVlSW5mbz47Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPEZ1bmN0aW9uU3VtbWFyeTo6VkZ1bmNJZD4geworICBzdGF0aWMgRnVuY3Rpb25TdW1tYXJ5OjpWRnVuY0lkIGdldEVtcHR5S2V5KCkgeyByZXR1cm4gezAsIHVpbnQ2NF90KC0xKX07IH0KKworICBzdGF0aWMgRnVuY3Rpb25TdW1tYXJ5OjpWRnVuY0lkIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gezAsIHVpbnQ2NF90KC0yKX07CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKEZ1bmN0aW9uU3VtbWFyeTo6VkZ1bmNJZCBMLCBGdW5jdGlvblN1bW1hcnk6OlZGdW5jSWQgUikgeworICAgIHJldHVybiBMLkdVSUQgPT0gUi5HVUlEICYmIEwuT2Zmc2V0ID09IFIuT2Zmc2V0OworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShGdW5jdGlvblN1bW1hcnk6OlZGdW5jSWQgSSkgeyByZXR1cm4gSS5HVUlEOyB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPEZ1bmN0aW9uU3VtbWFyeTo6Q29uc3RWQ2FsbD4geworICBzdGF0aWMgRnVuY3Rpb25TdW1tYXJ5OjpDb25zdFZDYWxsIGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiB7ezAsIHVpbnQ2NF90KC0xKX0sIHt9fTsKKyAgfQorCisgIHN0YXRpYyBGdW5jdGlvblN1bW1hcnk6OkNvbnN0VkNhbGwgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiB7ezAsIHVpbnQ2NF90KC0yKX0sIHt9fTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoRnVuY3Rpb25TdW1tYXJ5OjpDb25zdFZDYWxsIEwsCisgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25TdW1tYXJ5OjpDb25zdFZDYWxsIFIpIHsKKyAgICByZXR1cm4gRGVuc2VNYXBJbmZvPEZ1bmN0aW9uU3VtbWFyeTo6VkZ1bmNJZD46OmlzRXF1YWwoTC5WRnVuYywgUi5WRnVuYykgJiYKKyAgICAgICAgICAgTC5BcmdzID09IFIuQXJnczsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoRnVuY3Rpb25TdW1tYXJ5OjpDb25zdFZDYWxsIEkpIHsKKyAgICByZXR1cm4gSS5WRnVuYy5HVUlEOworICB9Cit9OworCisvLy8gXGJyaWVmIEdsb2JhbCB2YXJpYWJsZSBzdW1tYXJ5IGluZm9ybWF0aW9uIHRvIGFpZCBkZWNpc2lvbnMgYW5kCisvLy8gaW1wbGVtZW50YXRpb24gb2YgaW1wb3J0aW5nLgorLy8vCisvLy8gQ3VycmVudGx5IHRoaXMgZG9lc24ndCBhZGQgYW55dGhpbmcgdG8gdGhlIGJhc2UgXHAgR2xvYmFsVmFsdWVTdW1tYXJ5LAorLy8vIGJ1dCBpcyBhIHBsYWNlaG9sZGVyIGFzIGFkZGl0aW9uYWwgaW5mbyBtYXkgYmUgYWRkZWQgdG8gdGhlIHN1bW1hcnkKKy8vLyBmb3IgdmFyaWFibGVzLgorY2xhc3MgR2xvYmFsVmFyU3VtbWFyeSA6IHB1YmxpYyBHbG9iYWxWYWx1ZVN1bW1hcnkgeworCitwdWJsaWM6CisgIEdsb2JhbFZhclN1bW1hcnkoR1ZGbGFncyBGbGFncywgc3RkOjp2ZWN0b3I8VmFsdWVJbmZvPiBSZWZzKQorICAgICAgOiBHbG9iYWxWYWx1ZVN1bW1hcnkoR2xvYmFsVmFyS2luZCwgRmxhZ3MsIHN0ZDo6bW92ZShSZWZzKSkge30KKworICAvLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGdsb2JhbCB2YXJpYWJsZSBzdW1tYXJ5LgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEdsb2JhbFZhbHVlU3VtbWFyeSAqR1ZTKSB7CisgICAgcmV0dXJuIEdWUy0+Z2V0U3VtbWFyeUtpbmQoKSA9PSBHbG9iYWxWYXJLaW5kOworICB9Cit9OworCitzdHJ1Y3QgVHlwZVRlc3RSZXNvbHV0aW9uIHsKKyAgLy8vIFNwZWNpZmllcyB3aGljaCBraW5kIG9mIHR5cGUgY2hlY2sgd2Ugc2hvdWxkIGVtaXQgZm9yIHRoaXMgYnl0ZSBhcnJheS4KKyAgLy8vIFNlZSBodHRwOi8vY2xhbmcubGx2bS5vcmcvZG9jcy9Db250cm9sRmxvd0ludGVncml0eURlc2lnbi5odG1sIGZvciBmdWxsCisgIC8vLyBkZXRhaWxzIG9uIGVhY2gga2luZCBvZiBjaGVjazsgdGhlIGVudW1lcmF0b3JzIGFyZSBkZXNjcmliZWQgd2l0aAorICAvLy8gcmVmZXJlbmNlIHRvIHRoYXQgZG9jdW1lbnQuCisgIGVudW0gS2luZCB7CisgICAgVW5zYXQsICAgICAvLy88IFVuc2F0aXNmaWFibGUgdHlwZSAoaS5lLiBubyBnbG9iYWwgaGFzIHRoaXMgdHlwZSBtZXRhZGF0YSkKKyAgICBCeXRlQXJyYXksIC8vLzwgVGVzdCBhIGJ5dGUgYXJyYXkgKGZpcnN0IGV4YW1wbGUpCisgICAgSW5saW5lLCAgICAvLy88IElubGluZWQgYml0IHZlY3RvciAoIlNob3J0IElubGluZSBCaXQgVmVjdG9ycyIpCisgICAgU2luZ2xlLCAgICAvLy88IFNpbmdsZSBlbGVtZW50IChsYXN0IGV4YW1wbGUgaW4gIlNob3J0IElubGluZSBCaXQgVmVjdG9ycyIpCisgICAgQWxsT25lcywgICAvLy88IEFsbC1vbmVzIGJpdCB2ZWN0b3IgKCJFbGltaW5hdGluZyBCaXQgVmVjdG9yIENoZWNrcyBmb3IKKyAgICAgICAgICAgICAgIC8vLyAgQWxsLU9uZXMgQml0IFZlY3RvcnMiKQorICB9IFRoZUtpbmQgPSBVbnNhdDsKKworICAvLy8gUmFuZ2Ugb2Ygc2l6ZS0xIGV4cHJlc3NlZCBhcyBhIGJpdCB3aWR0aC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBzaXplIGlzIGluCisgIC8vLyByYW5nZSBbMSwyNTZdLCB0aGlzIG51bWJlciB3aWxsIGJlIDguIFRoaXMgaGVscHMgZ2VuZXJhdGUgdGhlIG1vc3QgY29tcGFjdAorICAvLy8gaW5zdHJ1Y3Rpb24gc2VxdWVuY2VzLgorICB1bnNpZ25lZCBTaXplTTFCaXRXaWR0aCA9IDA7CisKKyAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG9ubHkgdXNlZCBpZiB0aGUgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgdGhlIHVzZQorICAvLyBvZiBhYnNvbHV0ZSBzeW1ib2xzIHRvIHN0b3JlIGNvbnN0YW50cy4gVGhlaXIgbWVhbmluZ3MgYXJlIHRoZSBzYW1lIGFzIHRoZQorICAvLyBjb3JyZXNwb25kaW5nIGZpZWxkcyBpbiBMb3dlclR5cGVUZXN0c01vZHVsZTo6VHlwZUlkTG93ZXJpbmcgaW4KKyAgLy8gTG93ZXJUeXBlVGVzdHMuY3BwLgorCisgIHVpbnQ2NF90IEFsaWduTG9nMiA9IDA7CisgIHVpbnQ2NF90IFNpemVNMSA9IDA7CisgIHVpbnQ4X3QgQml0TWFzayA9IDA7CisgIHVpbnQ2NF90IElubGluZUJpdHMgPSAwOworfTsKKworc3RydWN0IFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb24geworICBlbnVtIEtpbmQgeworICAgIEluZGlyLCAgICAgICAgLy8vPCBKdXN0IGRvIGEgcmVndWxhciB2aXJ0dWFsIGNhbGwKKyAgICBTaW5nbGVJbXBsLCAgIC8vLzwgU2luZ2xlIGltcGxlbWVudGF0aW9uIGRldmlydHVhbGl6YXRpb24KKyAgICBCcmFuY2hGdW5uZWwsIC8vLzwgV2hlbiByZXRwb2xpbmUgbWl0aWdhdGlvbiBpcyBlbmFibGVkLCB1c2UgYSBicmFuY2ggZnVubmVsCisgICAgICAgICAgICAgICAgICAvLy88IHRoYXQgaXMgZGVmaW5lZCBpbiB0aGUgbWVyZ2VkIG1vZHVsZS4gT3RoZXJ3aXNlIHNhbWUgYXMKKyAgICAgICAgICAgICAgICAgIC8vLzwgSW5kaXIuCisgIH0gVGhlS2luZCA9IEluZGlyOworCisgIHN0ZDo6c3RyaW5nIFNpbmdsZUltcGxOYW1lOworCisgIHN0cnVjdCBCeUFyZyB7CisgICAgZW51bSBLaW5kIHsKKyAgICAgIEluZGlyLCAgICAgICAgICAgIC8vLzwgSnVzdCBkbyBhIHJlZ3VsYXIgdmlydHVhbCBjYWxsCisgICAgICBVbmlmb3JtUmV0VmFsLCAgICAvLy88IFVuaWZvcm0gcmV0dXJuIHZhbHVlIG9wdGltaXphdGlvbgorICAgICAgVW5pcXVlUmV0VmFsLCAgICAgLy8vPCBVbmlxdWUgcmV0dXJuIHZhbHVlIG9wdGltaXphdGlvbgorICAgICAgVmlydHVhbENvbnN0UHJvcCwgLy8vPCBWaXJ0dWFsIGNvbnN0YW50IHByb3BhZ2F0aW9uCisgICAgfSBUaGVLaW5kID0gSW5kaXI7CisKKyAgICAvLy8gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlc29sdXRpb246CisgICAgLy8vIC0gVW5pZm9ybVJldFZhbDogdGhlIHVuaWZvcm0gcmV0dXJuIHZhbHVlLgorICAgIC8vLyAtIFVuaXF1ZVJldFZhbDogdGhlIHJldHVybiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVuaXF1ZSB2dGFibGUgKDAgb3IKKyAgICAvLy8gICAxKS4KKyAgICB1aW50NjRfdCBJbmZvID0gMDsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBvbmx5IHVzZWQgaWYgdGhlIHRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IHRoZSB1c2UKKyAgICAvLyBvZiBhYnNvbHV0ZSBzeW1ib2xzIHRvIHN0b3JlIGNvbnN0YW50cy4KKworICAgIHVpbnQzMl90IEJ5dGUgPSAwOworICAgIHVpbnQzMl90IEJpdCA9IDA7CisgIH07CisKKyAgLy8vIFJlc29sdXRpb25zIGZvciBjYWxscyB3aXRoIGFsbCBjb25zdGFudCBpbnRlZ2VyIGFyZ3VtZW50cyAoZXhjbHVkaW5nIHRoZQorICAvLy8gZmlyc3QgYXJndW1lbnQsICJ0aGlzIiksIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGFyZ3VtZW50IHZlY3Rvci4KKyAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDY0X3Q+LCBCeUFyZz4gUmVzQnlBcmc7Cit9OworCitzdHJ1Y3QgVHlwZUlkU3VtbWFyeSB7CisgIFR5cGVUZXN0UmVzb2x1dGlvbiBUVFJlczsKKworICAvLy8gTWFwcGluZyBmcm9tIGJ5dGUgb2Zmc2V0IHRvIHdob2xlLXByb2dyYW0gZGV2aXJ0IHJlc29sdXRpb24gZm9yIHRoYXQKKyAgLy8vICh0eXBlaWQsIGJ5dGUgb2Zmc2V0KSBwYWlyLgorICBzdGQ6Om1hcDx1aW50NjRfdCwgV2hvbGVQcm9ncmFtRGV2aXJ0UmVzb2x1dGlvbj4gV1BEUmVzOworfTsKKworLy8vIDE2MCBiaXRzIFNIQTEKK3VzaW5nIE1vZHVsZUhhc2ggPSBzdGQ6OmFycmF5PHVpbnQzMl90LCA1PjsKKworLy8vIFR5cGUgdXNlZCBmb3IgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGdsb2JhbCB2YWx1ZSBzdW1tYXJ5IG1hcC4KK3VzaW5nIGNvbnN0X2d2c3VtbWFyeV9pdGVyYXRvciA9IEdsb2JhbFZhbHVlU3VtbWFyeU1hcFR5Ojpjb25zdF9pdGVyYXRvcjsKK3VzaW5nIGd2c3VtbWFyeV9pdGVyYXRvciA9IEdsb2JhbFZhbHVlU3VtbWFyeU1hcFR5OjppdGVyYXRvcjsKKworLy8vIFN0cmluZyB0YWJsZSB0byBob2xkL293biBtb2R1bGUgcGF0aCBzdHJpbmdzLCB3aGljaCBhZGRpdGlvbmFsbHkgaG9sZHMgdGhlCisvLy8gbW9kdWxlIElEIGFzc2lnbmVkIHRvIGVhY2ggbW9kdWxlIGR1cmluZyB0aGUgcGx1Z2luIHN0ZXAsIGFzIHdlbGwgYXMgYSBoYXNoCisvLy8gb2YgdGhlIG1vZHVsZS4gVGhlIFN0cmluZ01hcCBtYWtlcyBhIGNvcHkgb2YgYW5kIG93bnMgaW5zZXJ0ZWQgc3RyaW5ncy4KK3VzaW5nIE1vZHVsZVBhdGhTdHJpbmdUYWJsZVR5ID0gU3RyaW5nTWFwPHN0ZDo6cGFpcjx1aW50NjRfdCwgTW9kdWxlSGFzaD4+OworCisvLy8gTWFwIG9mIGdsb2JhbCB2YWx1ZSBHVUlEIHRvIGl0cyBzdW1tYXJ5LCB1c2VkIHRvIGlkZW50aWZ5IHZhbHVlcyBkZWZpbmVkIGluCisvLy8gYSBwYXJ0aWN1bGFyIG1vZHVsZSwgYW5kIHByb3ZpZGUgZWZmaWNpZW50IGFjY2VzcyB0byB0aGVpciBzdW1tYXJ5LgordXNpbmcgR1ZTdW1tYXJ5TWFwVHkgPSBEZW5zZU1hcDxHbG9iYWxWYWx1ZTo6R1VJRCwgR2xvYmFsVmFsdWVTdW1tYXJ5ICo+OworCisvLy8gQ2xhc3MgdG8gaG9sZCBtb2R1bGUgcGF0aCBzdHJpbmcgdGFibGUgYW5kIGdsb2JhbCB2YWx1ZSBtYXAsCisvLy8gYW5kIGVuY2Fwc3VsYXRlIG1ldGhvZHMgZm9yIG9wZXJhdGluZyBvbiB0aGVtLgorY2xhc3MgTW9kdWxlU3VtbWFyeUluZGV4IHsKK3ByaXZhdGU6CisgIC8vLyBNYXAgZnJvbSB2YWx1ZSBuYW1lIHRvIGxpc3Qgb2Ygc3VtbWFyeSBpbnN0YW5jZXMgZm9yIHZhbHVlcyBvZiB0aGF0CisgIC8vLyBuYW1lIChtYXkgYmUgZHVwbGljYXRlcyBpbiB0aGUgQ09NREFUIGNhc2UsIGUuZy4pLgorICBHbG9iYWxWYWx1ZVN1bW1hcnlNYXBUeSBHbG9iYWxWYWx1ZU1hcDsKKworICAvLy8gSG9sZHMgc3RyaW5ncyBmb3IgY29tYmluZWQgaW5kZXgsIG1hcHBpbmcgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlIElELgorICBNb2R1bGVQYXRoU3RyaW5nVGFibGVUeSBNb2R1bGVQYXRoU3RyaW5nVGFibGU7CisKKyAgLy8vIE1hcHBpbmcgZnJvbSB0eXBlIGlkZW50aWZpZXJzIHRvIHN1bW1hcnkgaW5mb3JtYXRpb24gZm9yIHRoYXQgdHlwZQorICAvLy8gaWRlbnRpZmllci4KKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFR5cGVJZFN1bW1hcnk+IFR5cGVJZE1hcDsKKworICAvLy8gTWFwcGluZyBmcm9tIG9yaWdpbmFsIElEIHRvIEdVSUQuIElmIG9yaWdpbmFsIElEIGNhbiBtYXAgdG8gbXVsdGlwbGUKKyAgLy8vIEdVSURzLCBpdCB3aWxsIGJlIG1hcHBlZCB0byAwLgorICBzdGQ6Om1hcDxHbG9iYWxWYWx1ZTo6R1VJRCwgR2xvYmFsVmFsdWU6OkdVSUQ+IE9pZEd1aWRNYXA7CisKKyAgLy8vIEluZGljYXRlcyB0aGF0IHN1bW1hcnktYmFzZWQgR2xvYmFsVmFsdWUgR0MgaGFzIHJ1biwgYW5kIHZhbHVlcyB3aXRoCisgIC8vLyBHVkZsYWdzOjpMaXZlPT1mYWxzZSBhcmUgcmVhbGx5IGRlYWQuIE90aGVyd2lzZSwgYWxsIHZhbHVlcyBtdXN0IGJlCisgIC8vLyBjb25zaWRlcmVkIGxpdmUuCisgIGJvb2wgV2l0aEdsb2JhbFZhbHVlRGVhZFN0cmlwcGluZyA9IGZhbHNlOworCisgIC8vLyBJbmRpY2F0ZXMgdGhhdCBkaXN0cmlidXRlZCBiYWNrZW5kIHNob3VsZCBza2lwIGNvbXBpbGF0aW9uIG9mIHRoZQorICAvLy8gbW9kdWxlLiBGbGFnIGlzIHN1cHBvc2UgdG8gYmUgc2V0IGJ5IGRpc3RyaWJ1dGVkIFRoaW5MVE8gaW5kZXhpbmcKKyAgLy8vIHdoZW4gaXQgZGV0ZWN0ZWQgdGhhdCB0aGUgbW9kdWxlIGlzIG5vdCBuZWVkZWQgZHVyaW5nIHRoZSBmaW5hbAorICAvLy8gbGlua2luZy4gQXMgcmVzdWx0IGRpc3RyaWJ1dGVkIGJhY2tlbmQgc2hvdWxkIGp1c3Qgb3V0cHV0IGEgbWluaW1hbAorICAvLy8gdmFsaWQgb2JqZWN0IGZpbGUuCisgIGJvb2wgU2tpcE1vZHVsZUJ5RGlzdHJpYnV0ZWRCYWNrZW5kID0gZmFsc2U7CisKKyAgLy8vIElmIHRydWUgdGhlbiB3ZSdyZSBwZXJmb3JtaW5nIGFuYWx5c2lzIG9mIElSIG1vZHVsZSwgZmlsbGluZyBzdW1tYXJ5CisgIC8vLyBhY2NvcmRpbmdseS4gVGhlIHZhbHVlIG9mICdmYWxzZScgbWVhbnMgd2UncmUgcmVhZGluZyBzdW1tYXJ5IGZyb20KKyAgLy8vIEJDIG9yIFlBTUwgc291cmNlLiBBZmZlY3RzIHRoZSB0eXBlIG9mIHZhbHVlIHN0b3JlZCBpbiBOYW1lT3JHViB1bmlvbgorICBib29sIElzQW5hbHlzaXM7CisKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IENmaUZ1bmN0aW9uRGVmczsKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IENmaUZ1bmN0aW9uRGVjbHM7CisKKyAgLy8gWUFNTCBJL08gc3VwcG9ydC4KKyAgZnJpZW5kIHlhbWw6Ok1hcHBpbmdUcmFpdHM8TW9kdWxlU3VtbWFyeUluZGV4PjsKKworICBHbG9iYWxWYWx1ZVN1bW1hcnlNYXBUeTo6dmFsdWVfdHlwZSAqCisgIGdldE9ySW5zZXJ0VmFsdWVQdHIoR2xvYmFsVmFsdWU6OkdVSUQgR1VJRCkgeworICAgIHJldHVybiAmKkdsb2JhbFZhbHVlTWFwLmVtcGxhY2UoR1VJRCwgR2xvYmFsVmFsdWVTdW1tYXJ5SW5mbyhJc0FuYWx5c2lzKSkuZmlyc3Q7CisgIH0KKworcHVibGljOgorICAvLyBTZWUgSXNBbmFseXNpcyB2YXJpYWJsZSBjb21tZW50LgorICBNb2R1bGVTdW1tYXJ5SW5kZXgoYm9vbCBJc1BlcmZvcm1pbmdBbmFseXNpcykKKyAgICAgIDogSXNBbmFseXNpcyhJc1BlcmZvcm1pbmdBbmFseXNpcykge30KKworICBib29sIGlzUGVyZm9ybWluZ0FuYWx5c2lzKCkgY29uc3QgeyByZXR1cm4gSXNBbmFseXNpczsgfQorCisgIGd2c3VtbWFyeV9pdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIEdsb2JhbFZhbHVlTWFwLmJlZ2luKCk7IH0KKyAgY29uc3RfZ3ZzdW1tYXJ5X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gR2xvYmFsVmFsdWVNYXAuYmVnaW4oKTsgfQorICBndnN1bW1hcnlfaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gR2xvYmFsVmFsdWVNYXAuZW5kKCk7IH0KKyAgY29uc3RfZ3ZzdW1tYXJ5X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEdsb2JhbFZhbHVlTWFwLmVuZCgpOyB9CisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gR2xvYmFsVmFsdWVNYXAuc2l6ZSgpOyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBkb2luZyBhIERGUyBvbiBhIFZhbHVlSW5mby4gTWFya3MgdGhlIGZ1bmN0aW9uIGluCisgIC8vLyB0aGUgRnVuY3Rpb25IYXNQYXJlbnQgbWFwLgorICBzdGF0aWMgdm9pZCBkaXNjb3Zlck5vZGVzKFZhbHVlSW5mbyBWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPFZhbHVlSW5mbywgYm9vbD4gJkZ1bmN0aW9uSGFzUGFyZW50KSB7CisgICAgaWYgKCFWLmdldFN1bW1hcnlMaXN0KCkuc2l6ZSgpKQorICAgICAgcmV0dXJuOyAvLyBza2lwIGV4dGVybmFsIGZ1bmN0aW9ucyB0aGF0IGRvbid0IGhhdmUgc3VtbWFyaWVzCisKKyAgICAvLyBNYXJrIGRpc2NvdmVyZWQgaWYgd2UgaGF2ZW4ndCB5ZXQKKyAgICBhdXRvIFMgPSBGdW5jdGlvbkhhc1BhcmVudC5lbXBsYWNlKFYsIGZhbHNlKTsKKworICAgIC8vIFN0b3AgaWYgd2UndmUgYWxyZWFkeSBkaXNjb3ZlcmVkIHRoaXMgbm9kZQorICAgIGlmICghUy5zZWNvbmQpCisgICAgICByZXR1cm47CisKKyAgICBGdW5jdGlvblN1bW1hcnkgKkYgPQorICAgICAgICBkeW5fY2FzdDxGdW5jdGlvblN1bW1hcnk+KFYuZ2V0U3VtbWFyeUxpc3QoKS5mcm9udCgpLmdldCgpKTsKKyAgICBhc3NlcnQoRiAhPSBudWxscHRyICYmICJFeHBlY3RlZCBGdW5jdGlvblN1bW1hcnkgbm9kZSIpOworCisgICAgZm9yIChhdXRvICZDIDogRi0+Y2FsbHMoKSkgeworICAgICAgLy8gSW5zZXJ0IG5vZGUgaWYgbmVjZXNzYXJ5CisgICAgICBhdXRvIFMgPSBGdW5jdGlvbkhhc1BhcmVudC5lbXBsYWNlKEMuZmlyc3QsIHRydWUpOworCisgICAgICAvLyBTa2lwIG5vZGVzIHRoYXQgd2UncmUgc3VyZSBoYXZlIHBhcmVudHMKKyAgICAgIGlmICghUy5zZWNvbmQgJiYgUy5maXJzdC0+c2Vjb25kKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKFMuc2Vjb25kKQorICAgICAgICBkaXNjb3Zlck5vZGVzKEMuZmlyc3QsIEZ1bmN0aW9uSGFzUGFyZW50KTsKKyAgICAgIGVsc2UKKyAgICAgICAgUy5maXJzdC0+c2Vjb25kID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLyBDYWxjdWxhdGUgdGhlIGNhbGxncmFwaCByb290CisgIEZ1bmN0aW9uU3VtbWFyeSBjYWxjdWxhdGVDYWxsR3JhcGhSb290KCkgeworICAgIC8vIEZ1bmN0aW9ucyB0aGF0IGhhdmUgYSBwYXJlbnQgd2lsbCBiZSBtYXJrZWQgaW4gRnVuY3Rpb25IYXNQYXJlbnQgcGFpci4KKyAgICAvLyBPbmNlIHdlJ3ZlIG1hcmtlZCBhbGwgZnVuY3Rpb25zLCB0aGUgZnVuY3Rpb25zIGluIHRoZSBtYXAgdGhhdCBhcmUgZmFsc2UKKyAgICAvLyBoYXZlIG5vIHBhcmVudCAoc28gdGhleSdyZSB0aGUgcm9vdHMpCisgICAgc3RkOjptYXA8VmFsdWVJbmZvLCBib29sPiBGdW5jdGlvbkhhc1BhcmVudDsKKworICAgIGZvciAoYXV0byAmUyA6ICp0aGlzKSB7CisgICAgICAvLyBTa2lwIGV4dGVybmFsIGZ1bmN0aW9ucworICAgICAgaWYgKCFTLnNlY29uZC5TdW1tYXJ5TGlzdC5zaXplKCkgfHwKKyAgICAgICAgICAhaXNhPEZ1bmN0aW9uU3VtbWFyeT4oUy5zZWNvbmQuU3VtbWFyeUxpc3QuZnJvbnQoKS5nZXQoKSkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGlzY292ZXJOb2RlcyhWYWx1ZUluZm8oSXNBbmFseXNpcywgJlMpLCBGdW5jdGlvbkhhc1BhcmVudCk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8RnVuY3Rpb25TdW1tYXJ5OjpFZGdlVHk+IEVkZ2VzOworICAgIC8vIGNyZWF0ZSBlZGdlcyB0byBhbGwgcm9vdHMgaW4gdGhlIEluZGV4CisgICAgZm9yIChhdXRvICZQIDogRnVuY3Rpb25IYXNQYXJlbnQpIHsKKyAgICAgIGlmIChQLnNlY29uZCkKKyAgICAgICAgY29udGludWU7IC8vIHNraXAgb3ZlciBub24tcm9vdCBub2RlcworICAgICAgRWRnZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFAuZmlyc3QsIENhbGxlZUluZm97fSkpOworICAgIH0KKyAgICBpZiAoRWRnZXMuZW1wdHkoKSkgeworICAgICAgLy8gRmFpbGVkIHRvIGZpbmQgcm9vdCAtIHJldHVybiBhbiBlbXB0eSBub2RlCisgICAgICByZXR1cm4gRnVuY3Rpb25TdW1tYXJ5OjptYWtlRHVtbXlGdW5jdGlvblN1bW1hcnkoe30pOworICAgIH0KKyAgICBhdXRvIENhbGxHcmFwaFJvb3QgPSBGdW5jdGlvblN1bW1hcnk6Om1ha2VEdW1teUZ1bmN0aW9uU3VtbWFyeShFZGdlcyk7CisgICAgcmV0dXJuIENhbGxHcmFwaFJvb3Q7CisgIH0KKworICBib29sIHdpdGhHbG9iYWxWYWx1ZURlYWRTdHJpcHBpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIFdpdGhHbG9iYWxWYWx1ZURlYWRTdHJpcHBpbmc7CisgIH0KKyAgdm9pZCBzZXRXaXRoR2xvYmFsVmFsdWVEZWFkU3RyaXBwaW5nKCkgeworICAgIFdpdGhHbG9iYWxWYWx1ZURlYWRTdHJpcHBpbmcgPSB0cnVlOworICB9CisKKyAgYm9vbCBza2lwTW9kdWxlQnlEaXN0cmlidXRlZEJhY2tlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIFNraXBNb2R1bGVCeURpc3RyaWJ1dGVkQmFja2VuZDsKKyAgfQorICB2b2lkIHNldFNraXBNb2R1bGVCeURpc3RyaWJ1dGVkQmFja2VuZCgpIHsKKyAgICBTa2lwTW9kdWxlQnlEaXN0cmlidXRlZEJhY2tlbmQgPSB0cnVlOworICB9CisKKyAgYm9vbCBpc0dsb2JhbFZhbHVlTGl2ZShjb25zdCBHbG9iYWxWYWx1ZVN1bW1hcnkgKkdWUykgY29uc3QgeworICAgIHJldHVybiAhV2l0aEdsb2JhbFZhbHVlRGVhZFN0cmlwcGluZyB8fCBHVlMtPmlzTGl2ZSgpOworICB9CisgIGJvb2wgaXNHVUlETGl2ZShHbG9iYWxWYWx1ZTo6R1VJRCBHVUlEKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgVmFsdWVJbmZvIGZvciBHVUlEIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIHJldHVybiBWYWx1ZUluZm8oKS4KKyAgVmFsdWVJbmZvIGdldFZhbHVlSW5mbyhHbG9iYWxWYWx1ZTo6R1VJRCBHVUlEKSBjb25zdCB7CisgICAgYXV0byBJID0gR2xvYmFsVmFsdWVNYXAuZmluZChHVUlEKTsKKyAgICByZXR1cm4gVmFsdWVJbmZvKElzQW5hbHlzaXMsIEkgPT0gR2xvYmFsVmFsdWVNYXAuZW5kKCkgPyBudWxscHRyIDogJipJKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSBWYWx1ZUluZm8gZm9yIFxwIEdVSUQuCisgIFZhbHVlSW5mbyBnZXRPckluc2VydFZhbHVlSW5mbyhHbG9iYWxWYWx1ZTo6R1VJRCBHVUlEKSB7CisgICAgcmV0dXJuIFZhbHVlSW5mbyhJc0FuYWx5c2lzLCBnZXRPckluc2VydFZhbHVlUHRyKEdVSUQpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSBWYWx1ZUluZm8gZm9yIFxwIEdVSUQgc2V0dGluZyB2YWx1ZSBccCBOYW1lLgorICBWYWx1ZUluZm8gZ2V0T3JJbnNlcnRWYWx1ZUluZm8oR2xvYmFsVmFsdWU6OkdVSUQgR1VJRCwgU3RyaW5nUmVmIE5hbWUpIHsKKyAgICBhc3NlcnQoIUlzQW5hbHlzaXMpOworICAgIGF1dG8gVlAgPSBnZXRPckluc2VydFZhbHVlUHRyKEdVSUQpOworICAgIFZQLT5zZWNvbmQuVS5OYW1lID0gTmFtZTsKKyAgICByZXR1cm4gVmFsdWVJbmZvKElzQW5hbHlzaXMsIFZQKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSBWYWx1ZUluZm8gZm9yIFxwIEdWIGFuZCBtYXJrIGl0IGFzIGJlbG9uZ2luZyB0byBHVi4KKyAgVmFsdWVJbmZvIGdldE9ySW5zZXJ0VmFsdWVJbmZvKGNvbnN0IEdsb2JhbFZhbHVlICpHVikgeworICAgIGFzc2VydChJc0FuYWx5c2lzKTsKKyAgICBhdXRvIFZQID0gZ2V0T3JJbnNlcnRWYWx1ZVB0cihHVi0+Z2V0R1VJRCgpKTsKKyAgICBWUC0+c2Vjb25kLlUuR1YgPSBHVjsKKyAgICByZXR1cm4gVmFsdWVJbmZvKElzQW5hbHlzaXMsIFZQKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIEdVSUQgZm9yIFxwIE9yaWdpbmFsSWQgaW4gdGhlIE9pZEd1aWRNYXAuCisgIEdsb2JhbFZhbHVlOjpHVUlEIGdldEdVSURGcm9tT3JpZ2luYWxJRChHbG9iYWxWYWx1ZTo6R1VJRCBPcmlnaW5hbElEKSBjb25zdCB7CisgICAgY29uc3QgYXV0byBJID0gT2lkR3VpZE1hcC5maW5kKE9yaWdpbmFsSUQpOworICAgIHJldHVybiBJID09IE9pZEd1aWRNYXAuZW5kKCkgPyAwIDogSS0+c2Vjb25kOworICB9CisKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+ICZjZmlGdW5jdGlvbkRlZnMoKSB7IHJldHVybiBDZmlGdW5jdGlvbkRlZnM7IH0KKyAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+ICZjZmlGdW5jdGlvbkRlZnMoKSBjb25zdCB7IHJldHVybiBDZmlGdW5jdGlvbkRlZnM7IH0KKworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gJmNmaUZ1bmN0aW9uRGVjbHMoKSB7IHJldHVybiBDZmlGdW5jdGlvbkRlY2xzOyB9CisgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiAmY2ZpRnVuY3Rpb25EZWNscygpIGNvbnN0IHsgcmV0dXJuIENmaUZ1bmN0aW9uRGVjbHM7IH0KKworICAvLy8gQWRkIGEgZ2xvYmFsIHZhbHVlIHN1bW1hcnkgZm9yIGEgdmFsdWUgb2YgdGhlIGdpdmVuIG5hbWUuCisgIHZvaWQgYWRkR2xvYmFsVmFsdWVTdW1tYXJ5KFN0cmluZ1JlZiBWYWx1ZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxHbG9iYWxWYWx1ZVN1bW1hcnk+IFN1bW1hcnkpIHsKKyAgICBhZGRHbG9iYWxWYWx1ZVN1bW1hcnkoZ2V0T3JJbnNlcnRWYWx1ZUluZm8oR2xvYmFsVmFsdWU6OmdldEdVSUQoVmFsdWVOYW1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShTdW1tYXJ5KSk7CisgIH0KKworICAvLy8gQWRkIGEgZ2xvYmFsIHZhbHVlIHN1bW1hcnkgZm9yIHRoZSBnaXZlbiBWYWx1ZUluZm8uCisgIHZvaWQgYWRkR2xvYmFsVmFsdWVTdW1tYXJ5KFZhbHVlSW5mbyBWSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEdsb2JhbFZhbHVlU3VtbWFyeT4gU3VtbWFyeSkgeworICAgIGFkZE9yaWdpbmFsTmFtZShWSS5nZXRHVUlEKCksIFN1bW1hcnktPmdldE9yaWdpbmFsTmFtZSgpKTsKKyAgICAvLyBIZXJlIHdlIGhhdmUgYSBub3Rpb25hbGx5IGNvbnN0IFZJLCBidXQgdGhlIHZhbHVlIGl0IHBvaW50cyB0byBpcyBvd25lZAorICAgIC8vIGJ5IHRoZSBub24tY29uc3QgKnRoaXMuCisgICAgY29uc3RfY2FzdDxHbG9iYWxWYWx1ZVN1bW1hcnlNYXBUeTo6dmFsdWVfdHlwZSAqPihWSS5nZXRSZWYoKSkKKyAgICAgICAgLT5zZWNvbmQuU3VtbWFyeUxpc3QucHVzaF9iYWNrKHN0ZDo6bW92ZShTdW1tYXJ5KSk7CisgIH0KKworICAvLy8gQWRkIGFuIG9yaWdpbmFsIG5hbWUgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gR1VJRC4KKyAgdm9pZCBhZGRPcmlnaW5hbE5hbWUoR2xvYmFsVmFsdWU6OkdVSUQgVmFsdWVHVUlELAorICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6R1VJRCBPcmlnR1VJRCkgeworICAgIGlmIChPcmlnR1VJRCA9PSAwIHx8IFZhbHVlR1VJRCA9PSBPcmlnR1VJRCkKKyAgICAgIHJldHVybjsKKyAgICBpZiAoT2lkR3VpZE1hcC5jb3VudChPcmlnR1VJRCkgJiYgT2lkR3VpZE1hcFtPcmlnR1VJRF0gIT0gVmFsdWVHVUlEKQorICAgICAgT2lkR3VpZE1hcFtPcmlnR1VJRF0gPSAwOworICAgIGVsc2UKKyAgICAgIE9pZEd1aWRNYXBbT3JpZ0dVSURdID0gVmFsdWVHVUlEOworICB9CisKKyAgLy8vIEZpbmQgdGhlIHN1bW1hcnkgZm9yIGdsb2JhbCBccCBHVUlEIGluIG1vZHVsZSBccCBNb2R1bGVJZCwgb3IgbnVsbHB0ciBpZgorICAvLy8gbm90IGZvdW5kLgorICBHbG9iYWxWYWx1ZVN1bW1hcnkgKmZpbmRTdW1tYXJ5SW5Nb2R1bGUoR2xvYmFsVmFsdWU6OkdVSUQgVmFsdWVHVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1vZHVsZUlkKSBjb25zdCB7CisgICAgYXV0byBDYWxsZWVJbmZvID0gZ2V0VmFsdWVJbmZvKFZhbHVlR1VJRCk7CisgICAgaWYgKCFDYWxsZWVJbmZvKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsgLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIGEgc3VtbWFyeQorICAgIH0KKyAgICBhdXRvIFN1bW1hcnkgPQorICAgICAgICBsbHZtOjpmaW5kX2lmKENhbGxlZUluZm8uZ2V0U3VtbWFyeUxpc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICBbJl0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEdsb2JhbFZhbHVlU3VtbWFyeT4gJlN1bW1hcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdW1tYXJ5LT5tb2R1bGVQYXRoKCkgPT0gTW9kdWxlSWQ7CisgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgaWYgKFN1bW1hcnkgPT0gQ2FsbGVlSW5mby5nZXRTdW1tYXJ5TGlzdCgpLmVuZCgpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIFN1bW1hcnktPmdldCgpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGZpcnN0IEdsb2JhbFZhbHVlU3VtbWFyeSBmb3IgXHAgR1YsIGFzc2VydGluZyB0aGF0IHRoZXJlCisgIC8vLyBpcyBvbmx5IG9uZSBpZiBccCBQZXJNb2R1bGVJbmRleC4KKyAgR2xvYmFsVmFsdWVTdW1tYXJ5ICpnZXRHbG9iYWxWYWx1ZVN1bW1hcnkoY29uc3QgR2xvYmFsVmFsdWUgJkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFBlck1vZHVsZUluZGV4ID0gdHJ1ZSkgY29uc3QgeworICAgIGFzc2VydChHVi5oYXNOYW1lKCkgJiYgIkNhbid0IGdldCBHbG9iYWxWYWx1ZVN1bW1hcnkgZm9yIEdWIHdpdGggbm8gbmFtZSIpOworICAgIHJldHVybiBnZXRHbG9iYWxWYWx1ZVN1bW1hcnkoR2xvYmFsVmFsdWU6OmdldEdVSUQoR1YuZ2V0TmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlck1vZHVsZUluZGV4KTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBmaXJzdCBHbG9iYWxWYWx1ZVN1bW1hcnkgZm9yIFxwIFZhbHVlR1VJRCwgYXNzZXJ0aW5nIHRoYXQKKyAgLy8vIHRoZXJlCisgIC8vLyBpcyBvbmx5IG9uZSBpZiBccCBQZXJNb2R1bGVJbmRleC4KKyAgR2xvYmFsVmFsdWVTdW1tYXJ5ICpnZXRHbG9iYWxWYWx1ZVN1bW1hcnkoR2xvYmFsVmFsdWU6OkdVSUQgVmFsdWVHVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFBlck1vZHVsZUluZGV4ID0gdHJ1ZSkgY29uc3Q7CisKKyAgLy8vIFRhYmxlIG9mIG1vZHVsZXMsIGNvbnRhaW5pbmcgbW9kdWxlIGhhc2ggYW5kIGlkLgorICBjb25zdCBTdHJpbmdNYXA8c3RkOjpwYWlyPHVpbnQ2NF90LCBNb2R1bGVIYXNoPj4gJm1vZHVsZVBhdGhzKCkgY29uc3QgeworICAgIHJldHVybiBNb2R1bGVQYXRoU3RyaW5nVGFibGU7CisgIH0KKworICAvLy8gVGFibGUgb2YgbW9kdWxlcywgY29udGFpbmluZyBoYXNoIGFuZCBpZC4KKyAgU3RyaW5nTWFwPHN0ZDo6cGFpcjx1aW50NjRfdCwgTW9kdWxlSGFzaD4+ICZtb2R1bGVQYXRocygpIHsKKyAgICByZXR1cm4gTW9kdWxlUGF0aFN0cmluZ1RhYmxlOworICB9CisKKyAgLy8vIEdldCB0aGUgbW9kdWxlIElEIHJlY29yZGVkIGZvciB0aGUgZ2l2ZW4gbW9kdWxlIHBhdGguCisgIHVpbnQ2NF90IGdldE1vZHVsZUlkKGNvbnN0IFN0cmluZ1JlZiBNb2RQYXRoKSBjb25zdCB7CisgICAgcmV0dXJuIE1vZHVsZVBhdGhTdHJpbmdUYWJsZS5sb29rdXAoTW9kUGF0aCkuZmlyc3Q7CisgIH0KKworICAvLy8gR2V0IHRoZSBtb2R1bGUgU0hBMSBoYXNoIHJlY29yZGVkIGZvciB0aGUgZ2l2ZW4gbW9kdWxlIHBhdGguCisgIGNvbnN0IE1vZHVsZUhhc2ggJmdldE1vZHVsZUhhc2goY29uc3QgU3RyaW5nUmVmIE1vZFBhdGgpIGNvbnN0IHsKKyAgICBhdXRvIEl0ID0gTW9kdWxlUGF0aFN0cmluZ1RhYmxlLmZpbmQoTW9kUGF0aCk7CisgICAgYXNzZXJ0KEl0ICE9IE1vZHVsZVBhdGhTdHJpbmdUYWJsZS5lbmQoKSAmJiAiTW9kdWxlIG5vdCByZWdpc3RlcmVkIik7CisgICAgcmV0dXJuIEl0LT5zZWNvbmQuc2Vjb25kOworICB9CisKKyAgLy8vIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBwcm9tb3RlZCBnbG9iYWwgbmFtZQorICAvLy8gZm9yIHRoZSBnaXZlbiB2YWx1ZSBuYW1lIG9mIGEgbG9jYWwsIGFuZCBpdHMgb3JpZ2luYWwgbW9kdWxlJ3MgSUQuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRHbG9iYWxOYW1lRm9yTG9jYWwoU3RyaW5nUmVmIE5hbWUsIE1vZHVsZUhhc2ggTW9kSGFzaCkgeworICAgIFNtYWxsU3RyaW5nPDI1Nj4gTmV3TmFtZShOYW1lKTsKKyAgICBOZXdOYW1lICs9ICIubGx2bS4iOworICAgIE5ld05hbWUgKz0gdXRvc3RyKCh1aW50NjRfdChNb2RIYXNoWzBdKSA8PCAzMikgfAorICAgICAgICAgICAgICAgICAgICAgIE1vZEhhc2hbMV0pOyAvLyBUYWtlIHRoZSBmaXJzdCA2NCBiaXRzCisgICAgcmV0dXJuIE5ld05hbWUuc3RyKCk7CisgIH0KKworICAvLy8gSGVscGVyIHRvIG9idGFpbiB0aGUgdW5wcm9tb3RlZCBuYW1lIGZvciBhIGdsb2JhbCB2YWx1ZSAob3IgdGhlIG9yaWdpbmFsCisgIC8vLyBuYW1lIGlmIG5vdCBwcm9tb3RlZCkuCisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0T3JpZ2luYWxOYW1lQmVmb3JlUHJvbW90ZShTdHJpbmdSZWYgTmFtZSkgeworICAgIHN0ZDo6cGFpcjxTdHJpbmdSZWYsIFN0cmluZ1JlZj4gUGFpciA9IE5hbWUuc3BsaXQoIi5sbHZtLiIpOworICAgIHJldHVybiBQYWlyLmZpcnN0OworICB9CisKKyAgdHlwZWRlZiBNb2R1bGVQYXRoU3RyaW5nVGFibGVUeTo6dmFsdWVfdHlwZSBNb2R1bGVJbmZvOworCisgIC8vLyBBZGQgYSBuZXcgbW9kdWxlIHdpdGggdGhlIGdpdmVuIFxwIEhhc2gsIG1hcHBlZCB0byB0aGUgZ2l2ZW4gXHAKKyAgLy8vIE1vZElELCBhbmQgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBtb2R1bGUuCisgIE1vZHVsZUluZm8gKmFkZE1vZHVsZShTdHJpbmdSZWYgTW9kUGF0aCwgdWludDY0X3QgTW9kSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVIYXNoIEhhc2ggPSBNb2R1bGVIYXNoe3swfX0pIHsKKyAgICByZXR1cm4gJipNb2R1bGVQYXRoU3RyaW5nVGFibGUuaW5zZXJ0KHtNb2RQYXRoLCB7TW9kSWQsIEhhc2h9fSkuZmlyc3Q7CisgIH0KKworICAvLy8gQ2hlY2sgaWYgdGhlIGdpdmVuIE1vZHVsZSBoYXMgYW55IGZ1bmN0aW9ucyBhdmFpbGFibGUgZm9yIGV4cG9ydGluZworICAvLy8gaW4gdGhlIGluZGV4LiBXZSBjb25zaWRlciBhbnkgbW9kdWxlIHByZXNlbnQgaW4gdGhlIE1vZHVsZVBhdGhTdHJpbmdUYWJsZQorICAvLy8gdG8gaGF2ZSBleHBvcnRlZCBmdW5jdGlvbnMuCisgIGJvb2wgaGFzRXhwb3J0ZWRGdW5jdGlvbnMoY29uc3QgTW9kdWxlICZNKSBjb25zdCB7CisgICAgcmV0dXJuIE1vZHVsZVBhdGhTdHJpbmdUYWJsZS5jb3VudChNLmdldE1vZHVsZUlkZW50aWZpZXIoKSk7CisgIH0KKworICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVHlwZUlkU3VtbWFyeT4gJnR5cGVJZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIFR5cGVJZE1hcDsKKyAgfQorCisgIC8vLyBUaGlzIGFjY2Vzc29yIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBleHBvcnRpbmcgYmVjYXVzZSBpdCBjYW4gbXV0YXRlIHRoZQorICAvLy8gbWFwLgorICBUeXBlSWRTdW1tYXJ5ICZnZXRPckluc2VydFR5cGVJZFN1bW1hcnkoU3RyaW5nUmVmIFR5cGVJZCkgeworICAgIHJldHVybiBUeXBlSWRNYXBbVHlwZUlkXTsKKyAgfQorCisgIC8vLyBUaGlzIHJldHVybnMgZWl0aGVyIGEgcG9pbnRlciB0byB0aGUgdHlwZSBpZCBzdW1tYXJ5IChpZiBwcmVzZW50IGluIHRoZQorICAvLy8gc3VtbWFyeSBtYXApIG9yIG51bGwgKGlmIG5vdCBwcmVzZW50KS4gVGhpcyBtYXkgYmUgdXNlZCB3aGVuIGltcG9ydGluZy4KKyAgY29uc3QgVHlwZUlkU3VtbWFyeSAqZ2V0VHlwZUlkU3VtbWFyeShTdHJpbmdSZWYgVHlwZUlkKSBjb25zdCB7CisgICAgYXV0byBJID0gVHlwZUlkTWFwLmZpbmQoVHlwZUlkKTsKKyAgICBpZiAoSSA9PSBUeXBlSWRNYXAuZW5kKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gJkktPnNlY29uZDsKKyAgfQorCisgIC8vLyBDb2xsZWN0IGZvciB0aGUgZ2l2ZW4gbW9kdWxlIHRoZSBsaXN0IG9mIGZ1bmN0aW9uIGl0IGRlZmluZXMKKyAgLy8vIChHVUlEIC0+IFN1bW1hcnkpLgorICB2b2lkIGNvbGxlY3REZWZpbmVkRnVuY3Rpb25zRm9yTW9kdWxlKFN0cmluZ1JlZiBNb2R1bGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWU3VtbWFyeU1hcFR5ICZHVlN1bW1hcnlNYXApIGNvbnN0OworCisgIC8vLyBDb2xsZWN0IGZvciBlYWNoIG1vZHVsZSB0aGUgbGlzdCBvZiBTdW1tYXJpZXMgaXQgZGVmaW5lcyAoR1VJRCAtPgorICAvLy8gU3VtbWFyeSkuCisgIHZvaWQgY29sbGVjdERlZmluZWRHVlN1bW1hcmllc1Blck1vZHVsZSgKKyAgICAgIFN0cmluZ01hcDxHVlN1bW1hcnlNYXBUeT4gJk1vZHVsZVRvRGVmaW5lZEdWU3VtbWFyaWVzKSBjb25zdDsKKworICAvLy8gRXhwb3J0IHN1bW1hcnkgdG8gZG90IGZpbGUgZm9yIEdyYXBoVml6LgorICB2b2lkIGV4cG9ydFRvRG90KHJhd19vc3RyZWFtJiBPUykgY29uc3Q7CisKKyAgLy8vIFByaW50IG91dCBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50cyBmb3IgZGVidWdnaW5nLgorICB2b2lkIGR1bXBTQ0NzKHJhd19vc3RyZWFtICZPUyk7Cit9OworCisvLy8gR3JhcGhUcmFpdHMgZGVmaW5pdGlvbiB0byBidWlsZCBTQ0MgZm9yIHRoZSBpbmRleAordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPFZhbHVlSW5mbz4geworICB0eXBlZGVmIFZhbHVlSW5mbyBOb2RlUmVmOworCisgIHN0YXRpYyBOb2RlUmVmIHZhbHVlSW5mb0Zyb21FZGdlKEZ1bmN0aW9uU3VtbWFyeTo6RWRnZVR5ICZQKSB7CisgICAgcmV0dXJuIFAuZmlyc3Q7CisgIH0KKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPQorICAgICAgbWFwcGVkX2l0ZXJhdG9yPHN0ZDo6dmVjdG9yPEZ1bmN0aW9uU3VtbWFyeTo6RWRnZVR5Pjo6aXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgZGVjbHR5cGUoJnZhbHVlSW5mb0Zyb21FZGdlKT47CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKFZhbHVlSW5mbyBWKSB7IHJldHVybiBWOyB9CisKKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeworICAgIGlmICghTi5nZXRTdW1tYXJ5TGlzdCgpLnNpemUoKSkgLy8gaGFuZGxlIGV4dGVybmFsIGZ1bmN0aW9uCisgICAgICByZXR1cm4gQ2hpbGRJdGVyYXRvclR5cGUoCisgICAgICAgICAgRnVuY3Rpb25TdW1tYXJ5OjpFeHRlcm5hbE5vZGUuQ2FsbEdyYXBoRWRnZUxpc3QuYmVnaW4oKSwKKyAgICAgICAgICAmdmFsdWVJbmZvRnJvbUVkZ2UpOworICAgIEZ1bmN0aW9uU3VtbWFyeSAqRiA9CisgICAgICAgIGNhc3Q8RnVuY3Rpb25TdW1tYXJ5PihOLmdldFN1bW1hcnlMaXN0KCkuZnJvbnQoKS0+Z2V0QmFzZU9iamVjdCgpKTsKKyAgICByZXR1cm4gQ2hpbGRJdGVyYXRvclR5cGUoRi0+Q2FsbEdyYXBoRWRnZUxpc3QuYmVnaW4oKSwgJnZhbHVlSW5mb0Zyb21FZGdlKTsKKyAgfQorCisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7CisgICAgaWYgKCFOLmdldFN1bW1hcnlMaXN0KCkuc2l6ZSgpKSAvLyBoYW5kbGUgZXh0ZXJuYWwgZnVuY3Rpb24KKyAgICAgIHJldHVybiBDaGlsZEl0ZXJhdG9yVHlwZSgKKyAgICAgICAgICBGdW5jdGlvblN1bW1hcnk6OkV4dGVybmFsTm9kZS5DYWxsR3JhcGhFZGdlTGlzdC5lbmQoKSwKKyAgICAgICAgICAmdmFsdWVJbmZvRnJvbUVkZ2UpOworICAgIEZ1bmN0aW9uU3VtbWFyeSAqRiA9CisgICAgICAgIGNhc3Q8RnVuY3Rpb25TdW1tYXJ5PihOLmdldFN1bW1hcnlMaXN0KCkuZnJvbnQoKS0+Z2V0QmFzZU9iamVjdCgpKTsKKyAgICByZXR1cm4gQ2hpbGRJdGVyYXRvclR5cGUoRi0+Q2FsbEdyYXBoRWRnZUxpc3QuZW5kKCksICZ2YWx1ZUluZm9Gcm9tRWRnZSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgR3JhcGhUcmFpdHM8TW9kdWxlU3VtbWFyeUluZGV4ICo+IDogcHVibGljIEdyYXBoVHJhaXRzPFZhbHVlSW5mbz4geworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoTW9kdWxlU3VtbWFyeUluZGV4ICpJKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEdsb2JhbFZhbHVlU3VtbWFyeT4gUm9vdCA9CisgICAgICAgIG1ha2VfdW5pcXVlPEZ1bmN0aW9uU3VtbWFyeT4oSS0+Y2FsY3VsYXRlQ2FsbEdyYXBoUm9vdCgpKTsKKyAgICBHbG9iYWxWYWx1ZVN1bW1hcnlJbmZvIEcoSS0+aXNQZXJmb3JtaW5nQW5hbHlzaXMoKSk7CisgICAgRy5TdW1tYXJ5TGlzdC5wdXNoX2JhY2soc3RkOjptb3ZlKFJvb3QpKTsKKyAgICBzdGF0aWMgYXV0byBQID0KKyAgICAgICAgR2xvYmFsVmFsdWVTdW1tYXJ5TWFwVHk6OnZhbHVlX3R5cGUoR2xvYmFsVmFsdWU6OkdVSUQoMCksIHN0ZDo6bW92ZShHKSk7CisgICAgcmV0dXJuIFZhbHVlSW5mbyhJLT5pc1BlcmZvcm1pbmdBbmFseXNpcygpLCAmUCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX01PRFVMRVNVTU1BUllJTkRFWF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL01vZHVsZVN1bW1hcnlJbmRleFlBTUwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTW9kdWxlU3VtbWFyeUluZGV4WUFNTC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzBkZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL01vZHVsZVN1bW1hcnlJbmRleFlBTUwuaApAQCAtMCwwICsxLDI3NiBAQAorLy89PT0tLSBsbHZtL01vZHVsZVN1bW1hcnlJbmRleFlBTUwuaCAtIFlBTUwgSS9PIGZvciBzdW1tYXJ5IC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX01PRFVMRVNVTU1BUllJTkRFWFlBTUxfSAorI2RlZmluZSBMTFZNX0lSX01PRFVMRVNVTU1BUllJTkRFWFlBTUxfSAorCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGVTdW1tYXJ5SW5kZXguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvWUFNTFRyYWl0cy5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgeWFtbCB7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxUeXBlVGVzdFJlc29sdXRpb246OktpbmQ+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJmlvLCBUeXBlVGVzdFJlc29sdXRpb246OktpbmQgJnZhbHVlKSB7CisgICAgaW8uZW51bUNhc2UodmFsdWUsICJVbnNhdCIsIFR5cGVUZXN0UmVzb2x1dGlvbjo6VW5zYXQpOworICAgIGlvLmVudW1DYXNlKHZhbHVlLCAiQnl0ZUFycmF5IiwgVHlwZVRlc3RSZXNvbHV0aW9uOjpCeXRlQXJyYXkpOworICAgIGlvLmVudW1DYXNlKHZhbHVlLCAiSW5saW5lIiwgVHlwZVRlc3RSZXNvbHV0aW9uOjpJbmxpbmUpOworICAgIGlvLmVudW1DYXNlKHZhbHVlLCAiU2luZ2xlIiwgVHlwZVRlc3RSZXNvbHV0aW9uOjpTaW5nbGUpOworICAgIGlvLmVudW1DYXNlKHZhbHVlLCAiQWxsT25lcyIsIFR5cGVUZXN0UmVzb2x1dGlvbjo6QWxsT25lcyk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPFR5cGVUZXN0UmVzb2x1dGlvbj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZpbywgVHlwZVRlc3RSZXNvbHV0aW9uICZyZXMpIHsKKyAgICBpby5tYXBPcHRpb25hbCgiS2luZCIsIHJlcy5UaGVLaW5kKTsKKyAgICBpby5tYXBPcHRpb25hbCgiU2l6ZU0xQml0V2lkdGgiLCByZXMuU2l6ZU0xQml0V2lkdGgpOworICAgIGlvLm1hcE9wdGlvbmFsKCJBbGlnbkxvZzIiLCByZXMuQWxpZ25Mb2cyKTsKKyAgICBpby5tYXBPcHRpb25hbCgiU2l6ZU0xIiwgcmVzLlNpemVNMSk7CisgICAgaW8ubWFwT3B0aW9uYWwoIkJpdE1hc2siLCByZXMuQml0TWFzayk7CisgICAgaW8ubWFwT3B0aW9uYWwoIklubGluZUJpdHMiLCByZXMuSW5saW5lQml0cyk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8V2hvbGVQcm9ncmFtRGV2aXJ0UmVzb2x1dGlvbjo6QnlBcmc6OktpbmQ+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJmlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaG9sZVByb2dyYW1EZXZpcnRSZXNvbHV0aW9uOjpCeUFyZzo6S2luZCAmdmFsdWUpIHsKKyAgICBpby5lbnVtQ2FzZSh2YWx1ZSwgIkluZGlyIiwgV2hvbGVQcm9ncmFtRGV2aXJ0UmVzb2x1dGlvbjo6QnlBcmc6OkluZGlyKTsKKyAgICBpby5lbnVtQ2FzZSh2YWx1ZSwgIlVuaWZvcm1SZXRWYWwiLAorICAgICAgICAgICAgICAgIFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb246OkJ5QXJnOjpVbmlmb3JtUmV0VmFsKTsKKyAgICBpby5lbnVtQ2FzZSh2YWx1ZSwgIlVuaXF1ZVJldFZhbCIsCisgICAgICAgICAgICAgICAgV2hvbGVQcm9ncmFtRGV2aXJ0UmVzb2x1dGlvbjo6QnlBcmc6OlVuaXF1ZVJldFZhbCk7CisgICAgaW8uZW51bUNhc2UodmFsdWUsICJWaXJ0dWFsQ29uc3RQcm9wIiwKKyAgICAgICAgICAgICAgICBXaG9sZVByb2dyYW1EZXZpcnRSZXNvbHV0aW9uOjpCeUFyZzo6VmlydHVhbENvbnN0UHJvcCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb246OkJ5QXJnPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJmlvLCBXaG9sZVByb2dyYW1EZXZpcnRSZXNvbHV0aW9uOjpCeUFyZyAmcmVzKSB7CisgICAgaW8ubWFwT3B0aW9uYWwoIktpbmQiLCByZXMuVGhlS2luZCk7CisgICAgaW8ubWFwT3B0aW9uYWwoIkluZm8iLCByZXMuSW5mbyk7CisgICAgaW8ubWFwT3B0aW9uYWwoIkJ5dGUiLCByZXMuQnl0ZSk7CisgICAgaW8ubWFwT3B0aW9uYWwoIkJpdCIsIHJlcy5CaXQpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IEN1c3RvbU1hcHBpbmdUcmFpdHM8CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDY0X3Q+LCBXaG9sZVByb2dyYW1EZXZpcnRSZXNvbHV0aW9uOjpCeUFyZz4+IHsKKyAgc3RhdGljIHZvaWQgaW5wdXRPbmUoCisgICAgICBJTyAmaW8sIFN0cmluZ1JlZiBLZXksCisgICAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50NjRfdD4sIFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb246OkJ5QXJnPiAmVikgeworICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBBcmdzOworICAgIHN0ZDo6cGFpcjxTdHJpbmdSZWYsIFN0cmluZ1JlZj4gUCA9IHsiIiwgS2V5fTsKKyAgICB3aGlsZSAoIVAuc2Vjb25kLmVtcHR5KCkpIHsKKyAgICAgIFAgPSBQLnNlY29uZC5zcGxpdCgnLCcpOworICAgICAgdWludDY0X3QgQXJnOworICAgICAgaWYgKFAuZmlyc3QuZ2V0QXNJbnRlZ2VyKDAsIEFyZykpIHsKKyAgICAgICAgaW8uc2V0RXJyb3IoImtleSBub3QgYW4gaW50ZWdlciIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBBcmdzLnB1c2hfYmFjayhBcmcpOworICAgIH0KKyAgICBpby5tYXBSZXF1aXJlZChLZXkuc3RyKCkuY19zdHIoKSwgVltBcmdzXSk7CisgIH0KKyAgc3RhdGljIHZvaWQgb3V0cHV0KAorICAgICAgSU8gJmlvLAorICAgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDY0X3Q+LCBXaG9sZVByb2dyYW1EZXZpcnRSZXNvbHV0aW9uOjpCeUFyZz4gJlYpIHsKKyAgICBmb3IgKGF1dG8gJlAgOiBWKSB7CisgICAgICBzdGQ6OnN0cmluZyBLZXk7CisgICAgICBmb3IgKHVpbnQ2NF90IEFyZyA6IFAuZmlyc3QpIHsKKyAgICAgICAgaWYgKCFLZXkuZW1wdHkoKSkKKyAgICAgICAgICBLZXkgKz0gJywnOworICAgICAgICBLZXkgKz0gbGx2bTo6dXRvc3RyKEFyZyk7CisgICAgICB9CisgICAgICBpby5tYXBSZXF1aXJlZChLZXkuY19zdHIoKSwgUC5zZWNvbmQpOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb246OktpbmQ+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJmlvLCBXaG9sZVByb2dyYW1EZXZpcnRSZXNvbHV0aW9uOjpLaW5kICZ2YWx1ZSkgeworICAgIGlvLmVudW1DYXNlKHZhbHVlLCAiSW5kaXIiLCBXaG9sZVByb2dyYW1EZXZpcnRSZXNvbHV0aW9uOjpJbmRpcik7CisgICAgaW8uZW51bUNhc2UodmFsdWUsICJTaW5nbGVJbXBsIiwgV2hvbGVQcm9ncmFtRGV2aXJ0UmVzb2x1dGlvbjo6U2luZ2xlSW1wbCk7CisgICAgaW8uZW51bUNhc2UodmFsdWUsICJCcmFuY2hGdW5uZWwiLAorICAgICAgICAgICAgICAgIFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb246OkJyYW5jaEZ1bm5lbCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb24+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmaW8sIFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb24gJnJlcykgeworICAgIGlvLm1hcE9wdGlvbmFsKCJLaW5kIiwgcmVzLlRoZUtpbmQpOworICAgIGlvLm1hcE9wdGlvbmFsKCJTaW5nbGVJbXBsTmFtZSIsIHJlcy5TaW5nbGVJbXBsTmFtZSk7CisgICAgaW8ubWFwT3B0aW9uYWwoIlJlc0J5QXJnIiwgcmVzLlJlc0J5QXJnKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBDdXN0b21NYXBwaW5nVHJhaXRzPHN0ZDo6bWFwPHVpbnQ2NF90LCBXaG9sZVByb2dyYW1EZXZpcnRSZXNvbHV0aW9uPj4geworICBzdGF0aWMgdm9pZCBpbnB1dE9uZShJTyAmaW8sIFN0cmluZ1JlZiBLZXksCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBXaG9sZVByb2dyYW1EZXZpcnRSZXNvbHV0aW9uPiAmVikgeworICAgIHVpbnQ2NF90IEtleUludDsKKyAgICBpZiAoS2V5LmdldEFzSW50ZWdlcigwLCBLZXlJbnQpKSB7CisgICAgICBpby5zZXRFcnJvcigia2V5IG5vdCBhbiBpbnRlZ2VyIik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlvLm1hcFJlcXVpcmVkKEtleS5zdHIoKS5jX3N0cigpLCBWW0tleUludF0pOworICB9CisgIHN0YXRpYyB2b2lkIG91dHB1dChJTyAmaW8sIHN0ZDo6bWFwPHVpbnQ2NF90LCBXaG9sZVByb2dyYW1EZXZpcnRSZXNvbHV0aW9uPiAmVikgeworICAgIGZvciAoYXV0byAmUCA6IFYpCisgICAgICBpby5tYXBSZXF1aXJlZChsbHZtOjp1dG9zdHIoUC5maXJzdCkuY19zdHIoKSwgUC5zZWNvbmQpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxUeXBlSWRTdW1tYXJ5PiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJmlvLCBUeXBlSWRTdW1tYXJ5JiBzdW1tYXJ5KSB7CisgICAgaW8ubWFwT3B0aW9uYWwoIlRUUmVzIiwgc3VtbWFyeS5UVFJlcyk7CisgICAgaW8ubWFwT3B0aW9uYWwoIldQRFJlcyIsIHN1bW1hcnkuV1BEUmVzKTsKKyAgfQorfTsKKworc3RydWN0IEZ1bmN0aW9uU3VtbWFyeVlhbWwgeworICB1bnNpZ25lZCBMaW5rYWdlOworICBib29sIE5vdEVsaWdpYmxlVG9JbXBvcnQsIExpdmUsIElzTG9jYWw7CisgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBUeXBlVGVzdHM7CisgIHN0ZDo6dmVjdG9yPEZ1bmN0aW9uU3VtbWFyeTo6VkZ1bmNJZD4gVHlwZVRlc3RBc3N1bWVWQ2FsbHMsCisgICAgICBUeXBlQ2hlY2tlZExvYWRWQ2FsbHM7CisgIHN0ZDo6dmVjdG9yPEZ1bmN0aW9uU3VtbWFyeTo6Q29uc3RWQ2FsbD4gVHlwZVRlc3RBc3N1bWVDb25zdFZDYWxscywKKyAgICAgIFR5cGVDaGVja2VkTG9hZENvbnN0VkNhbGxzOworfTsKKworfSAvLyBFbmQgeWFtbCBuYW1lc3BhY2UKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSB5YW1sIHsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8RnVuY3Rpb25TdW1tYXJ5OjpWRnVuY0lkPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJmlvLCBGdW5jdGlvblN1bW1hcnk6OlZGdW5jSWQmIGlkKSB7CisgICAgaW8ubWFwT3B0aW9uYWwoIkdVSUQiLCBpZC5HVUlEKTsKKyAgICBpby5tYXBPcHRpb25hbCgiT2Zmc2V0IiwgaWQuT2Zmc2V0KTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8RnVuY3Rpb25TdW1tYXJ5OjpDb25zdFZDYWxsPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJmlvLCBGdW5jdGlvblN1bW1hcnk6OkNvbnN0VkNhbGwmIGlkKSB7CisgICAgaW8ubWFwT3B0aW9uYWwoIlZGdW5jIiwgaWQuVkZ1bmMpOworICAgIGlvLm1hcE9wdGlvbmFsKCJBcmdzIiwgaWQuQXJncyk7CisgIH0KK307CisKK30gLy8gRW5kIHlhbWwgbmFtZXNwYWNlCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKEZ1bmN0aW9uU3VtbWFyeTo6VkZ1bmNJZCkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IoRnVuY3Rpb25TdW1tYXJ5OjpDb25zdFZDYWxsKQorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgeWFtbCB7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPEZ1bmN0aW9uU3VtbWFyeVlhbWw+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmaW8sIEZ1bmN0aW9uU3VtbWFyeVlhbWwmIHN1bW1hcnkpIHsKKyAgICBpby5tYXBPcHRpb25hbCgiTGlua2FnZSIsIHN1bW1hcnkuTGlua2FnZSk7CisgICAgaW8ubWFwT3B0aW9uYWwoIk5vdEVsaWdpYmxlVG9JbXBvcnQiLCBzdW1tYXJ5Lk5vdEVsaWdpYmxlVG9JbXBvcnQpOworICAgIGlvLm1hcE9wdGlvbmFsKCJMaXZlIiwgc3VtbWFyeS5MaXZlKTsKKyAgICBpby5tYXBPcHRpb25hbCgiTG9jYWwiLCBzdW1tYXJ5LklzTG9jYWwpOworICAgIGlvLm1hcE9wdGlvbmFsKCJUeXBlVGVzdHMiLCBzdW1tYXJ5LlR5cGVUZXN0cyk7CisgICAgaW8ubWFwT3B0aW9uYWwoIlR5cGVUZXN0QXNzdW1lVkNhbGxzIiwgc3VtbWFyeS5UeXBlVGVzdEFzc3VtZVZDYWxscyk7CisgICAgaW8ubWFwT3B0aW9uYWwoIlR5cGVDaGVja2VkTG9hZFZDYWxscyIsIHN1bW1hcnkuVHlwZUNoZWNrZWRMb2FkVkNhbGxzKTsKKyAgICBpby5tYXBPcHRpb25hbCgiVHlwZVRlc3RBc3N1bWVDb25zdFZDYWxscyIsCisgICAgICAgICAgICAgICAgICAgc3VtbWFyeS5UeXBlVGVzdEFzc3VtZUNvbnN0VkNhbGxzKTsKKyAgICBpby5tYXBPcHRpb25hbCgiVHlwZUNoZWNrZWRMb2FkQ29uc3RWQ2FsbHMiLAorICAgICAgICAgICAgICAgICAgIHN1bW1hcnkuVHlwZUNoZWNrZWRMb2FkQ29uc3RWQ2FsbHMpOworICB9Cit9OworCit9IC8vIEVuZCB5YW1sIG5hbWVzcGFjZQorfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworTExWTV9ZQU1MX0lTX1NUUklOR19NQVAoVHlwZUlkU3VtbWFyeSkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IoRnVuY3Rpb25TdW1tYXJ5WWFtbCkKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHlhbWwgeworCisvLyBGSVhNRTogQWRkIFlBTUwgbWFwcGluZ3MgZm9yIHRoZSByZXN0IG9mIHRoZSBtb2R1bGUgc3VtbWFyeS4KK3RlbXBsYXRlIDw+IHN0cnVjdCBDdXN0b21NYXBwaW5nVHJhaXRzPEdsb2JhbFZhbHVlU3VtbWFyeU1hcFR5PiB7CisgIHN0YXRpYyB2b2lkIGlucHV0T25lKElPICZpbywgU3RyaW5nUmVmIEtleSwgR2xvYmFsVmFsdWVTdW1tYXJ5TWFwVHkgJlYpIHsKKyAgICBzdGQ6OnZlY3RvcjxGdW5jdGlvblN1bW1hcnlZYW1sPiBGU3VtczsKKyAgICBpby5tYXBSZXF1aXJlZChLZXkuc3RyKCkuY19zdHIoKSwgRlN1bXMpOworICAgIHVpbnQ2NF90IEtleUludDsKKyAgICBpZiAoS2V5LmdldEFzSW50ZWdlcigwLCBLZXlJbnQpKSB7CisgICAgICBpby5zZXRFcnJvcigia2V5IG5vdCBhbiBpbnRlZ2VyIik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGF1dG8gUCA9IFYuZW1wbGFjZShLZXlJbnQsIC8qSXNBbmFseXNpcz0qL2ZhbHNlKTsKKyAgICBhdXRvICZFbGVtID0gKCpQLmZpcnN0KS5zZWNvbmQ7CisgICAgZm9yIChhdXRvICZGU3VtIDogRlN1bXMpIHsKKyAgICAgIEVsZW0uU3VtbWFyeUxpc3QucHVzaF9iYWNrKGxsdm06Om1ha2VfdW5pcXVlPEZ1bmN0aW9uU3VtbWFyeT4oCisgICAgICAgICAgR2xvYmFsVmFsdWVTdW1tYXJ5OjpHVkZsYWdzKAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxHbG9iYWxWYWx1ZTo6TGlua2FnZVR5cGVzPihGU3VtLkxpbmthZ2UpLAorICAgICAgICAgICAgICBGU3VtLk5vdEVsaWdpYmxlVG9JbXBvcnQsIEZTdW0uTGl2ZSwgRlN1bS5Jc0xvY2FsKSwKKyAgICAgICAgICAwLCBGdW5jdGlvblN1bW1hcnk6OkZGbGFnc3t9LCBBcnJheVJlZjxWYWx1ZUluZm8+e30sCisgICAgICAgICAgQXJyYXlSZWY8RnVuY3Rpb25TdW1tYXJ5OjpFZGdlVHk+e30sIHN0ZDo6bW92ZShGU3VtLlR5cGVUZXN0cyksCisgICAgICAgICAgc3RkOjptb3ZlKEZTdW0uVHlwZVRlc3RBc3N1bWVWQ2FsbHMpLAorICAgICAgICAgIHN0ZDo6bW92ZShGU3VtLlR5cGVDaGVja2VkTG9hZFZDYWxscyksCisgICAgICAgICAgc3RkOjptb3ZlKEZTdW0uVHlwZVRlc3RBc3N1bWVDb25zdFZDYWxscyksCisgICAgICAgICAgc3RkOjptb3ZlKEZTdW0uVHlwZUNoZWNrZWRMb2FkQ29uc3RWQ2FsbHMpKSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIG91dHB1dChJTyAmaW8sIEdsb2JhbFZhbHVlU3VtbWFyeU1hcFR5ICZWKSB7CisgICAgZm9yIChhdXRvICZQIDogVikgeworICAgICAgc3RkOjp2ZWN0b3I8RnVuY3Rpb25TdW1tYXJ5WWFtbD4gRlN1bXM7CisgICAgICBmb3IgKGF1dG8gJlN1bSA6IFAuc2Vjb25kLlN1bW1hcnlMaXN0KSB7CisgICAgICAgIGlmIChhdXRvICpGU3VtID0gZHluX2Nhc3Q8RnVuY3Rpb25TdW1tYXJ5PihTdW0uZ2V0KCkpKQorICAgICAgICAgIEZTdW1zLnB1c2hfYmFjayhGdW5jdGlvblN1bW1hcnlZYW1seworICAgICAgICAgICAgICBGU3VtLT5mbGFncygpLkxpbmthZ2UsCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGJvb2w+KEZTdW0tPmZsYWdzKCkuTm90RWxpZ2libGVUb0ltcG9ydCksCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGJvb2w+KEZTdW0tPmZsYWdzKCkuTGl2ZSksCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGJvb2w+KEZTdW0tPmZsYWdzKCkuRFNPTG9jYWwpLCBGU3VtLT50eXBlX3Rlc3RzKCksCisgICAgICAgICAgICAgIEZTdW0tPnR5cGVfdGVzdF9hc3N1bWVfdmNhbGxzKCksIEZTdW0tPnR5cGVfY2hlY2tlZF9sb2FkX3ZjYWxscygpLAorICAgICAgICAgICAgICBGU3VtLT50eXBlX3Rlc3RfYXNzdW1lX2NvbnN0X3ZjYWxscygpLAorICAgICAgICAgICAgICBGU3VtLT50eXBlX2NoZWNrZWRfbG9hZF9jb25zdF92Y2FsbHMoKX0pOworICAgICAgfQorICAgICAgaWYgKCFGU3Vtcy5lbXB0eSgpKQorICAgICAgICBpby5tYXBSZXF1aXJlZChsbHZtOjp1dG9zdHIoUC5maXJzdCkuY19zdHIoKSwgRlN1bXMpOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TW9kdWxlU3VtbWFyeUluZGV4PiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJmlvLCBNb2R1bGVTdW1tYXJ5SW5kZXgmIGluZGV4KSB7CisgICAgaW8ubWFwT3B0aW9uYWwoIkdsb2JhbFZhbHVlTWFwIiwgaW5kZXguR2xvYmFsVmFsdWVNYXApOworICAgIGlvLm1hcE9wdGlvbmFsKCJUeXBlSWRNYXAiLCBpbmRleC5UeXBlSWRNYXApOworICAgIGlvLm1hcE9wdGlvbmFsKCJXaXRoR2xvYmFsVmFsdWVEZWFkU3RyaXBwaW5nIiwKKyAgICAgICAgICAgICAgICAgICBpbmRleC5XaXRoR2xvYmFsVmFsdWVEZWFkU3RyaXBwaW5nKTsKKworICAgIGlmIChpby5vdXRwdXR0aW5nKCkpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBDZmlGdW5jdGlvbkRlZnMoaW5kZXguQ2ZpRnVuY3Rpb25EZWZzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LkNmaUZ1bmN0aW9uRGVmcy5lbmQoKSk7CisgICAgICBpby5tYXBPcHRpb25hbCgiQ2ZpRnVuY3Rpb25EZWZzIiwgQ2ZpRnVuY3Rpb25EZWZzKTsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBDZmlGdW5jdGlvbkRlY2xzKGluZGV4LkNmaUZ1bmN0aW9uRGVjbHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LkNmaUZ1bmN0aW9uRGVjbHMuZW5kKCkpOworICAgICAgaW8ubWFwT3B0aW9uYWwoIkNmaUZ1bmN0aW9uRGVjbHMiLCBDZmlGdW5jdGlvbkRlY2xzKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IENmaUZ1bmN0aW9uRGVmczsKKyAgICAgIGlvLm1hcE9wdGlvbmFsKCJDZmlGdW5jdGlvbkRlZnMiLCBDZmlGdW5jdGlvbkRlZnMpOworICAgICAgaW5kZXguQ2ZpRnVuY3Rpb25EZWZzID0ge0NmaUZ1bmN0aW9uRGVmcy5iZWdpbigpLCBDZmlGdW5jdGlvbkRlZnMuZW5kKCl9OworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IENmaUZ1bmN0aW9uRGVjbHM7CisgICAgICBpby5tYXBPcHRpb25hbCgiQ2ZpRnVuY3Rpb25EZWNscyIsIENmaUZ1bmN0aW9uRGVjbHMpOworICAgICAgaW5kZXguQ2ZpRnVuY3Rpb25EZWNscyA9IHtDZmlGdW5jdGlvbkRlY2xzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENmaUZ1bmN0aW9uRGVjbHMuZW5kKCl9OworICAgIH0KKyAgfQorfTsKKworfSAvLyBFbmQgeWFtbCBuYW1lc3BhY2UKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Ob0ZvbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Ob0ZvbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjA3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL05vRm9sZGVyLmgKQEAgLTAsMCArMSwzNDIgQEAKKy8vPT09LSBOb0ZvbGRlci5oIC0gQ29uc3RhbnQgZm9sZGluZyBoZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIE5vRm9sZGVyIGNsYXNzLCBhIGhlbHBlciBmb3IgSVJCdWlsZGVyLiAgSXQgcHJvdmlkZXMKKy8vIElSQnVpbGRlciB3aXRoIGEgc2V0IG9mIG1ldGhvZHMgZm9yIGNyZWF0aW5nIHVuZm9sZGVkIGNvbnN0YW50cy4gIFRoaXMgaXMKKy8vIHVzZWZ1bCBmb3IgbGVhcm5lcnMgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgaG93IExMVk0gSVIgd29ya3MsIGFuZCB3aG8gZG9uJ3QKKy8vIHdhbnQgZGV0YWlscyB0byBiZSBoaWRkZW4gYnkgdGhlIGNvbnN0YW50IGZvbGRlci4gIEZvciBnZW5lcmFsIGNvbnN0YW50CisvLyBjcmVhdGlvbiBhbmQgZm9sZGluZywgdXNlIENvbnN0YW50RXhwciBhbmQgdGhlIHJvdXRpbmVzIGluCisvLyBsbHZtL0FuYWx5c2lzL0NvbnN0YW50Rm9sZGluZy5oLgorLy8KKy8vIE5vdGU6IHNpbmNlIGl0IGlzIG5vdCBhY3R1YWxseSBwb3NzaWJsZSB0byBjcmVhdGUgdW5mb2xkZWQgY29uc3RhbnRzLCB0aGlzCisvLyBjbGFzcyByZXR1cm5zIGluc3RydWN0aW9ucyByYXRoZXIgdGhhbiBjb25zdGFudHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX05PRk9MREVSX0gKKyNkZWZpbmUgTExWTV9JUl9OT0ZPTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0clR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIE5vRm9sZGVyIC0gQ3JlYXRlICJjb25zdGFudHMiIChhY3R1YWxseSwgaW5zdHJ1Y3Rpb25zKSB3aXRoIG5vIGZvbGRpbmcuCitjbGFzcyBOb0ZvbGRlciB7CitwdWJsaWM6CisgIGV4cGxpY2l0IE5vRm9sZGVyKCkgPSBkZWZhdWx0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBCaW5hcnkgT3BlcmF0b3JzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIEluc3RydWN0aW9uICpDcmVhdGVBZGQoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKSBjb25zdCB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFkZChMSFMsIFJIUyk7CisgICAgaWYgKEhhc05VVykgQk8tPnNldEhhc05vVW5zaWduZWRXcmFwKCk7CisgICAgaWYgKEhhc05TVykgQk8tPnNldEhhc05vU2lnbmVkV3JhcCgpOworICAgIHJldHVybiBCTzsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVOU1dBZGQoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTlNXQWRkKExIUywgUkhTKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVOVVdBZGQoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTlVXQWRkKExIUywgUkhTKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVGQWRkKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZBZGQoTEhTLCBSSFMpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZVN1YihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpIGNvbnN0IHsKKyAgICBCaW5hcnlPcGVyYXRvciAqQk8gPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU3ViKExIUywgUkhTKTsKKyAgICBpZiAoSGFzTlVXKSBCTy0+c2V0SGFzTm9VbnNpZ25lZFdyYXAoKTsKKyAgICBpZiAoSGFzTlNXKSBCTy0+c2V0SGFzTm9TaWduZWRXcmFwKCk7CisgICAgcmV0dXJuIEJPOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZU5TV1N1YihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOU1dTdWIoTEhTLCBSSFMpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZU5VV1N1YihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOVVdTdWIoTEhTLCBSSFMpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUZTdWIoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRlN1YihMSFMsIFJIUyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlTXVsKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcgPSBmYWxzZSwgYm9vbCBIYXNOU1cgPSBmYWxzZSkgY29uc3QgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVNdWwoTEhTLCBSSFMpOworICAgIGlmIChIYXNOVVcpIEJPLT5zZXRIYXNOb1Vuc2lnbmVkV3JhcCgpOworICAgIGlmIChIYXNOU1cpIEJPLT5zZXRIYXNOb1NpZ25lZFdyYXAoKTsKKyAgICByZXR1cm4gQk87CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlTlNXTXVsKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5TV011bChMSFMsIFJIUyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlTlVXTXVsKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5VV011bChMSFMsIFJIUyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlRk11bChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGTXVsKExIUywgUkhTKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVVRGl2KENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFeGFjdCA9IGZhbHNlKSBjb25zdCB7CisgICAgaWYgKCFpc0V4YWN0KQorICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVVRGl2KExIUywgUkhTKTsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUV4YWN0VURpdihMSFMsIFJIUyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlRXhhY3RVRGl2KENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUV4YWN0VURpdihMSFMsIFJIUyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlU0RpdihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRXhhY3QgPSBmYWxzZSkgY29uc3QgeworICAgIGlmICghaXNFeGFjdCkKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU0RpdihMSFMsIFJIUyk7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVFeGFjdFNEaXYoTEhTLCBSSFMpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUV4YWN0U0RpdihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVFeGFjdFNEaXYoTEhTLCBSSFMpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUZEaXYoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRkRpdihMSFMsIFJIUyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlVVJlbShDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVVUmVtKExIUywgUkhTKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVTUmVtKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVNSZW0oTEhTLCBSSFMpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUZSZW0oQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRlJlbShMSFMsIFJIUyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlU2hsKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsIGJvb2wgSGFzTlVXID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOU1cgPSBmYWxzZSkgY29uc3QgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTaGwoTEhTLCBSSFMpOworICAgIGlmIChIYXNOVVcpIEJPLT5zZXRIYXNOb1Vuc2lnbmVkV3JhcCgpOworICAgIGlmIChIYXNOU1cpIEJPLT5zZXRIYXNOb1NpZ25lZFdyYXAoKTsKKyAgICByZXR1cm4gQk87CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlTFNocihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRXhhY3QgPSBmYWxzZSkgY29uc3QgeworICAgIGlmICghaXNFeGFjdCkKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTFNocihMSFMsIFJIUyk7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVFeGFjdExTaHIoTEhTLCBSSFMpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUFTaHIoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0V4YWN0ID0gZmFsc2UpIGNvbnN0IHsKKyAgICBpZiAoIWlzRXhhY3QpCisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFTaHIoTEhTLCBSSFMpOworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRXhhY3RBU2hyKExIUywgUkhTKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVBbmQoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKExIUywgUkhTKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVPcihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVPcihMSFMsIFJIUyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlWG9yKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVhvcihMSFMsIFJIUyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlQmluT3AoSW5zdHJ1Y3Rpb246OkJpbmFyeU9wcyBPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGUoT3BjLCBMSFMsIFJIUyk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVW5hcnkgT3BlcmF0b3JzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIEluc3RydWN0aW9uICpDcmVhdGVOZWcoQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcgPSBmYWxzZSwgYm9vbCBIYXNOU1cgPSBmYWxzZSkgY29uc3QgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOZWcoQyk7CisgICAgaWYgKEhhc05VVykgQk8tPnNldEhhc05vVW5zaWduZWRXcmFwKCk7CisgICAgaWYgKEhhc05TVykgQk8tPnNldEhhc05vU2lnbmVkV3JhcCgpOworICAgIHJldHVybiBCTzsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVOU1dOZWcoQ29uc3RhbnQgKkMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5TV05lZyhDKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVOVVdOZWcoQ29uc3RhbnQgKkMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5VV05lZyhDKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVGTmVnKENvbnN0YW50ICpDKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGTmVnKEMpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZU5vdChDb25zdGFudCAqQykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTm90KEMpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE1lbW9yeSBJbnN0cnVjdGlvbnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgQ29uc3RhbnQgKkNyZWF0ZUdldEVsZW1lbnRQdHIoVHlwZSAqVHksIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDb25zdGFudCAqPiBJZHhMaXN0KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0R2V0RWxlbWVudFB0cihUeSwgQywgSWR4TGlzdCk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlR2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsIENvbnN0YW50ICpJZHgpIGNvbnN0IHsKKyAgICAvLyBUaGlzIGZvcm0gb2YgdGhlIGZ1bmN0aW9uIG9ubHkgZXhpc3RzIHRvIGF2b2lkIGFtYmlndW91cyBvdmVybG9hZAorICAgIC8vIHdhcm5pbmdzIGFib3V0IHdoZXRoZXIgdG8gY29udmVydCBJZHggdG8gQXJyYXlSZWY8Q29uc3RhbnQgKj4gb3IKKyAgICAvLyBBcnJheVJlZjxWYWx1ZSAqPi4KKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKFR5LCBDLCBJZHgpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUdldEVsZW1lbnRQdHIoVHlwZSAqVHksIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBJZHhMaXN0KSBjb25zdCB7CisgICAgcmV0dXJuIEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoVHksIEMsIElkeExpc3QpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUluQm91bmRzR2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q29uc3RhbnQgKj4gSWR4TGlzdCkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEluQm91bmRzR2V0RWxlbWVudFB0cihUeSwgQywgSWR4TGlzdCk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlSW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5cGUgKlR5LCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqSWR4KSBjb25zdCB7CisgICAgLy8gVGhpcyBmb3JtIG9mIHRoZSBmdW5jdGlvbiBvbmx5IGV4aXN0cyB0byBhdm9pZCBhbWJpZ3VvdXMgb3ZlcmxvYWQKKyAgICAvLyB3YXJuaW5ncyBhYm91dCB3aGV0aGVyIHRvIGNvbnZlcnQgSWR4IHRvIEFycmF5UmVmPENvbnN0YW50ICo+IG9yCisgICAgLy8gQXJyYXlSZWY8VmFsdWUgKj4uCisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0SW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5LCBDLCBJZHgpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUluQm91bmRzR2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCkgY29uc3QgeworICAgIHJldHVybiBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlSW5Cb3VuZHMoVHksIEMsIElkeExpc3QpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIENhc3QvQ29udmVyc2lvbiBPcGVyYXRvcnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OkNhc3RPcHMgT3AsIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2FzdEluc3Q6OkNyZWF0ZShPcCwgQywgRGVzdFR5KTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVQb2ludGVyQ2FzdChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgcmV0dXJuIENhc3RJbnN0OjpDcmVhdGVQb2ludGVyQ2FzdChDLCBEZXN0VHkpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUludENhc3QoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCkgY29uc3QgeworICAgIHJldHVybiBDYXN0SW5zdDo6Q3JlYXRlSW50ZWdlckNhc3QoQywgRGVzdFR5LCBpc1NpZ25lZCk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlRlBDYXN0KENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2FzdEluc3Q6OkNyZWF0ZUZQQ2FzdChDLCBEZXN0VHkpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUJpdENhc3QoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpCaXRDYXN0LCBDLCBEZXN0VHkpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUludFRvUHRyKENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6SW50VG9QdHIsIEMsIERlc3RUeSk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlUHRyVG9JbnQoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpQdHJUb0ludCwgQywgRGVzdFR5KTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVaRXh0T3JCaXRDYXN0KENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2FzdEluc3Q6OkNyZWF0ZVpFeHRPckJpdENhc3QoQywgRGVzdFR5KTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVTRXh0T3JCaXRDYXN0KENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2FzdEluc3Q6OkNyZWF0ZVNFeHRPckJpdENhc3QoQywgRGVzdFR5KTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVUcnVuY09yQml0Q2FzdChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgcmV0dXJuIENhc3RJbnN0OjpDcmVhdGVUcnVuY09yQml0Q2FzdChDLCBEZXN0VHkpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIENvbXBhcmUgSW5zdHJ1Y3Rpb25zCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIEluc3RydWN0aW9uICpDcmVhdGVJQ21wKENtcEluc3Q6OlByZWRpY2F0ZSBQLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJQ21wSW5zdChQLCBMSFMsIFJIUyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlRkNtcChDbXBJbnN0OjpQcmVkaWNhdGUgUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBuZXcgRkNtcEluc3QoUCwgTEhTLCBSSFMpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE90aGVyIEluc3RydWN0aW9ucworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlU2VsZWN0KENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpUcnVlLCBDb25zdGFudCAqRmFsc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gU2VsZWN0SW5zdDo6Q3JlYXRlKEMsIFRydWUsIEZhbHNlKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVFeHRyYWN0RWxlbWVudChDb25zdGFudCAqVmVjLCBDb25zdGFudCAqSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIEV4dHJhY3RFbGVtZW50SW5zdDo6Q3JlYXRlKFZlYywgSWR4KTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVJbnNlcnRFbGVtZW50KENvbnN0YW50ICpWZWMsIENvbnN0YW50ICpOZXdFbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5zZXJ0RWxlbWVudEluc3Q6OkNyZWF0ZShWZWMsIE5ld0VsdCwgSWR4KTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVTaHVmZmxlVmVjdG9yKENvbnN0YW50ICpWMSwgQ29uc3RhbnQgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqTWFzaykgY29uc3QgeworICAgIHJldHVybiBuZXcgU2h1ZmZsZVZlY3Rvckluc3QoVjEsIFYyLCBNYXNrKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVFeHRyYWN0VmFsdWUoQ29uc3RhbnQgKkFnZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gSWR4TGlzdCkgY29uc3QgeworICAgIHJldHVybiBFeHRyYWN0VmFsdWVJbnN0OjpDcmVhdGUoQWdnLCBJZHhMaXN0KTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVJbnNlcnRWYWx1ZShDb25zdGFudCAqQWdnLCBDb25zdGFudCAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IElkeExpc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5zZXJ0VmFsdWVJbnN0OjpDcmVhdGUoQWdnLCBWYWwsIElkeExpc3QpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9OT0ZPTERFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL09wZXJhbmRUcmFpdHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvT3BlcmFuZFRyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MThhZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL09wZXJhbmRUcmFpdHMuaApAQCAtMCwwICsxLDE2MyBAQAorLy89PT0tLSBsbHZtL09wZXJhbmRUcmFpdHMuaCAtIE9wZXJhbmRUcmFpdHMgY2xhc3MgZGVmaW5pdGlvbiAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdHJhaXRzIGNsYXNzZXMgdGhhdCBhcmUgaGFuZHkgZm9yIGVuZm9yY2luZyB0aGUgY29ycmVjdAorLy8gbGF5b3V0IG9mIHZhcmlvdXMgVXNlciBzdWJjbGFzc2VzLiBJdCBhbHNvIHByb3ZpZGVzIHRoZSBtZWFucyBmb3IgYWNjZXNzaW5nCisvLyB0aGUgb3BlcmFuZHMgaW4gdGhlIG1vc3QgZWZmaWNpZW50IG1hbm5lci4KKy8vCisKKyNpZm5kZWYgTExWTV9JUl9PUEVSQU5EVFJBSVRTX0gKKyNkZWZpbmUgTExWTV9JUl9PUEVSQU5EVFJBSVRTX0gKKworI2luY2x1ZGUgImxsdm0vSVIvVXNlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgRml4ZWROdW1PcGVyYW5kIFRyYWl0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gRml4ZWROdW1PcGVyYW5kVHJhaXRzIC0gZGV0ZXJtaW5lIHRoZSBhbGxvY2F0aW9uIHJlZ2ltZSBvZiB0aGUgVXNlIGFycmF5CisvLy8gd2hlbiBpdCBpcyBhIHByZWZpeCB0byB0aGUgVXNlciBvYmplY3QsIGFuZCB0aGUgbnVtYmVyIG9mIFVzZSBvYmplY3RzIGlzCisvLy8ga25vd24gYXQgY29tcGlsZSB0aW1lLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3ViQ2xhc3MsIHVuc2lnbmVkIEFSSVRZPgorc3RydWN0IEZpeGVkTnVtT3BlcmFuZFRyYWl0cyB7CisgIHN0YXRpYyBVc2UgKm9wX2JlZ2luKFN1YkNsYXNzKiBVKSB7CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgIXN0ZDo6aXNfcG9seW1vcnBoaWM8U3ViQ2xhc3M+Ojp2YWx1ZSwKKyAgICAgICAgImFkZGluZyB2aXJ0dWFsIG1ldGhvZHMgdG8gc3ViY2xhc3NlcyBvZiBVc2VyIGJyZWFrcyB1c2UgbGlzdHMiKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxVc2UqPihVKSAtIEFSSVRZOworICB9CisgIHN0YXRpYyBVc2UgKm9wX2VuZChTdWJDbGFzcyogVSkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFVzZSo+KFUpOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBvcGVyYW5kcyhjb25zdCBVc2VyKikgeworICAgIHJldHVybiBBUklUWTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbE9wZXJhbmQgVHJhaXQgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBPcHRpb25hbE9wZXJhbmRUcmFpdHMgLSB3aGVuIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgbWF5IGNoYW5nZSBhdCBydW50aW1lLgorLy8vIE5hdHVyYWxseSBpdCBtYXkgb25seSBkZWNyZWFzZSwgYmVjYXVzZSB0aGUgYWxsb2NhdGlvbnMgbWF5IG5vdCBjaGFuZ2UuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdWJDbGFzcywgdW5zaWduZWQgQVJJVFkgPSAxPgorc3RydWN0IE9wdGlvbmFsT3BlcmFuZFRyYWl0cyA6IHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8U3ViQ2xhc3MsIEFSSVRZPiB7CisgIHN0YXRpYyB1bnNpZ25lZCBvcGVyYW5kcyhjb25zdCBVc2VyICpVKSB7CisgICAgcmV0dXJuIFUtPmdldE51bU9wZXJhbmRzKCk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFkaWNPcGVyYW5kIFRyYWl0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVmFyaWFkaWNPcGVyYW5kVHJhaXRzIC0gZGV0ZXJtaW5lIHRoZSBhbGxvY2F0aW9uIHJlZ2ltZSBvZiB0aGUgVXNlIGFycmF5CisvLy8gd2hlbiBpdCBpcyBhIHByZWZpeCB0byB0aGUgVXNlciBvYmplY3QsIGFuZCB0aGUgbnVtYmVyIG9mIFVzZSBvYmplY3RzIGlzCisvLy8gb25seSBrbm93biBhdCBhbGxvY2F0aW9uIHRpbWUuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdWJDbGFzcywgdW5zaWduZWQgTUlOQVJJVFkgPSAwPgorc3RydWN0IFZhcmlhZGljT3BlcmFuZFRyYWl0cyB7CisgIHN0YXRpYyBVc2UgKm9wX2JlZ2luKFN1YkNsYXNzKiBVKSB7CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgIXN0ZDo6aXNfcG9seW1vcnBoaWM8U3ViQ2xhc3M+Ojp2YWx1ZSwKKyAgICAgICAgImFkZGluZyB2aXJ0dWFsIG1ldGhvZHMgdG8gc3ViY2xhc3NlcyBvZiBVc2VyIGJyZWFrcyB1c2UgbGlzdHMiKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxVc2UqPihVKSAtIHN0YXRpY19jYXN0PFVzZXIqPihVKS0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgfQorICBzdGF0aWMgVXNlICpvcF9lbmQoU3ViQ2xhc3MqIFUpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxVc2UqPihVKTsKKyAgfQorICBzdGF0aWMgdW5zaWduZWQgb3BlcmFuZHMoY29uc3QgVXNlciAqVSkgeworICAgIHJldHVybiBVLT5nZXROdW1PcGVyYW5kcygpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIEh1bmdvZmZPcGVyYW5kIFRyYWl0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gSHVuZ29mZk9wZXJhbmRUcmFpdHMgLSBkZXRlcm1pbmUgdGhlIGFsbG9jYXRpb24gcmVnaW1lIG9mIHRoZSBVc2UgYXJyYXkKKy8vLyB3aGVuIGl0IGlzIG5vdCBhIHByZWZpeCB0byB0aGUgVXNlciBvYmplY3QsIGJ1dCBhbGxvY2F0ZWQgYXQgYW4gdW5yZWxhdGVkCisvLy8gaGVhcCBhZGRyZXNzLgorLy8vCisvLy8gVGhpcyBpcyB0aGUgdHJhaXRzIGNsYXNzIHRoYXQgaXMgbmVlZGVkIHdoZW4gdGhlIFVzZSBhcnJheSBtdXN0IGJlCisvLy8gcmVzaXphYmxlLgorCit0ZW1wbGF0ZSA8dW5zaWduZWQgTUlOQVJJVFkgPSAxPgorc3RydWN0IEh1bmdvZmZPcGVyYW5kVHJhaXRzIHsKKyAgc3RhdGljIFVzZSAqb3BfYmVnaW4oVXNlciogVSkgeworICAgIHJldHVybiBVLT5nZXRPcGVyYW5kTGlzdCgpOworICB9CisgIHN0YXRpYyBVc2UgKm9wX2VuZChVc2VyKiBVKSB7CisgICAgcmV0dXJuIFUtPmdldE9wZXJhbmRMaXN0KCkgKyBVLT5nZXROdW1PcGVyYW5kcygpOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBvcGVyYW5kcyhjb25zdCBVc2VyICpVKSB7CisgICAgcmV0dXJuIFUtPmdldE51bU9wZXJhbmRzKCk7CisgIH0KK307CisKKy8vLyBNYWNybyBmb3IgZ2VuZXJhdGluZyBpbi1jbGFzcyBvcGVyYW5kIGFjY2Vzc29yIGRlY2xhcmF0aW9ucy4KKy8vLyBJdCBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4gdGhlIHB1YmxpYyBzZWN0aW9uIG9mIHRoZSBpbnRlcmZhY2UuCisvLy8KKyNkZWZpbmUgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWQUxVRUNMQVNTKSBcCisgIHB1YmxpYzogXAorICBpbmxpbmUgVkFMVUVDTEFTUyAqZ2V0T3BlcmFuZCh1bnNpZ25lZCkgY29uc3Q7IFwKKyAgaW5saW5lIHZvaWQgc2V0T3BlcmFuZCh1bnNpZ25lZCwgVkFMVUVDTEFTUyopOyBcCisgIGlubGluZSBvcF9pdGVyYXRvciBvcF9iZWdpbigpOyBcCisgIGlubGluZSBjb25zdF9vcF9pdGVyYXRvciBvcF9iZWdpbigpIGNvbnN0OyBcCisgIGlubGluZSBvcF9pdGVyYXRvciBvcF9lbmQoKTsgXAorICBpbmxpbmUgY29uc3Rfb3BfaXRlcmF0b3Igb3BfZW5kKCkgY29uc3Q7IFwKKyAgcHJvdGVjdGVkOiBcCisgIHRlbXBsYXRlIDxpbnQ+IGlubGluZSBVc2UgJk9wKCk7IFwKKyAgdGVtcGxhdGUgPGludD4gaW5saW5lIGNvbnN0IFVzZSAmT3AoKSBjb25zdDsgXAorICBwdWJsaWM6IFwKKyAgaW5saW5lIHVuc2lnbmVkIGdldE51bU9wZXJhbmRzKCkgY29uc3QKKworLy8vIE1hY3JvIGZvciBnZW5lcmF0aW5nIG91dC1vZi1jbGFzcyBvcGVyYW5kIGFjY2Vzc29yIGRlZmluaXRpb25zCisjZGVmaW5lIERFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhDTEFTUywgVkFMVUVDTEFTUykgXAorQ0xBU1M6Om9wX2l0ZXJhdG9yIENMQVNTOjpvcF9iZWdpbigpIHsgXAorICByZXR1cm4gT3BlcmFuZFRyYWl0czxDTEFTUz46Om9wX2JlZ2luKHRoaXMpOyBcCit9IFwKK0NMQVNTOjpjb25zdF9vcF9pdGVyYXRvciBDTEFTUzo6b3BfYmVnaW4oKSBjb25zdCB7IFwKKyAgcmV0dXJuIE9wZXJhbmRUcmFpdHM8Q0xBU1M+OjpvcF9iZWdpbihjb25zdF9jYXN0PENMQVNTKj4odGhpcykpOyBcCit9IFwKK0NMQVNTOjpvcF9pdGVyYXRvciBDTEFTUzo6b3BfZW5kKCkgeyBcCisgIHJldHVybiBPcGVyYW5kVHJhaXRzPENMQVNTPjo6b3BfZW5kKHRoaXMpOyBcCit9IFwKK0NMQVNTOjpjb25zdF9vcF9pdGVyYXRvciBDTEFTUzo6b3BfZW5kKCkgY29uc3QgeyBcCisgIHJldHVybiBPcGVyYW5kVHJhaXRzPENMQVNTPjo6b3BfZW5kKGNvbnN0X2Nhc3Q8Q0xBU1MqPih0aGlzKSk7IFwKK30gXAorVkFMVUVDTEFTUyAqQ0xBU1M6OmdldE9wZXJhbmQodW5zaWduZWQgaV9ub2NhcHR1cmUpIGNvbnN0IHsgXAorICBhc3NlcnQoaV9ub2NhcHR1cmUgPCBPcGVyYW5kVHJhaXRzPENMQVNTPjo6b3BlcmFuZHModGhpcykgXAorICAgICAgICAgJiYgImdldE9wZXJhbmQoKSBvdXQgb2YgcmFuZ2UhIik7IFwKKyAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxWQUxVRUNMQVNTPiggXAorICAgIE9wZXJhbmRUcmFpdHM8Q0xBU1M+OjpvcF9iZWdpbihjb25zdF9jYXN0PENMQVNTKj4odGhpcykpW2lfbm9jYXB0dXJlXS5nZXQoKSk7IFwKK30gXAordm9pZCBDTEFTUzo6c2V0T3BlcmFuZCh1bnNpZ25lZCBpX25vY2FwdHVyZSwgVkFMVUVDTEFTUyAqVmFsX25vY2FwdHVyZSkgeyBcCisgIGFzc2VydChpX25vY2FwdHVyZSA8IE9wZXJhbmRUcmFpdHM8Q0xBU1M+OjpvcGVyYW5kcyh0aGlzKSBcCisgICAgICAgICAmJiAic2V0T3BlcmFuZCgpIG91dCBvZiByYW5nZSEiKTsgXAorICBPcGVyYW5kVHJhaXRzPENMQVNTPjo6b3BfYmVnaW4odGhpcylbaV9ub2NhcHR1cmVdID0gVmFsX25vY2FwdHVyZTsgXAorfSBcCit1bnNpZ25lZCBDTEFTUzo6Z2V0TnVtT3BlcmFuZHMoKSBjb25zdCB7IFwKKyAgcmV0dXJuIE9wZXJhbmRUcmFpdHM8Q0xBU1M+OjpvcGVyYW5kcyh0aGlzKTsgXAorfSBcCit0ZW1wbGF0ZSA8aW50IElkeF9ub2NhcHR1cmU+IFVzZSAmQ0xBU1M6Ok9wKCkgeyBcCisgIHJldHVybiB0aGlzLT5PcEZyb208SWR4X25vY2FwdHVyZT4odGhpcyk7IFwKK30gXAordGVtcGxhdGUgPGludCBJZHhfbm9jYXB0dXJlPiBjb25zdCBVc2UgJkNMQVNTOjpPcCgpIGNvbnN0IHsgXAorICByZXR1cm4gdGhpcy0+T3BGcm9tPElkeF9ub2NhcHR1cmU+KHRoaXMpOyBcCit9CisKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL09wZXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL09wZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3NDZlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvT3BlcmF0b3IuaApAQCAtMCwwICsxLDU2NiBAQAorLy89PT0tLSBsbHZtL09wZXJhdG9yLmggLSBPcGVyYXRvciB1dGlsaXR5IHN1YmNsYXNzIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB2YXJpb3VzIGNsYXNzZXMgZm9yIHdvcmtpbmcgd2l0aCBJbnN0cnVjdGlvbnMgYW5kCisvLyBDb25zdGFudEV4cHJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9PUEVSQVRPUl9ICisjZGVmaW5lIExMVk1fSVJfT1BFUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MgdGhhdCBwcm92aWRlcyBhbiBhYnN0cmFjdGlvbiBmb3IgdGhlIGNvbW1vbgorLy8vIGZ1bmN0aW9uYWxpdHkgYmV0d2VlbiBJbnN0cnVjdGlvbnMgYW5kIENvbnN0YW50RXhwcnMuCitjbGFzcyBPcGVyYXRvciA6IHB1YmxpYyBVc2VyIHsKK3B1YmxpYzoKKyAgLy8gVGhlIE9wZXJhdG9yIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgYSB1dGlsaXR5LCBhbmQgaXMgbmV2ZXIgaXRzZWxmCisgIC8vIGluc3RhbnRpYXRlZC4KKyAgT3BlcmF0b3IoKSA9IGRlbGV0ZTsKKyAgfk9wZXJhdG9yKCkgPSBkZWxldGU7CisKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSA9IGRlbGV0ZTsKKworICAvLy8gUmV0dXJuIHRoZSBvcGNvZGUgZm9yIHRoaXMgSW5zdHJ1Y3Rpb24gb3IgQ29uc3RhbnRFeHByLgorICB1bnNpZ25lZCBnZXRPcGNvZGUoKSBjb25zdCB7CisgICAgaWYgKGNvbnN0IEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KHRoaXMpKQorICAgICAgcmV0dXJuIEktPmdldE9wY29kZSgpOworICAgIHJldHVybiBjYXN0PENvbnN0YW50RXhwcj4odGhpcyktPmdldE9wY29kZSgpOworICB9CisKKyAgLy8vIElmIFYgaXMgYW4gSW5zdHJ1Y3Rpb24gb3IgQ29uc3RhbnRFeHByLCByZXR1cm4gaXRzIG9wY29kZS4KKyAgLy8vIE90aGVyd2lzZSByZXR1cm4gVXNlck9wMS4KKyAgc3RhdGljIHVuc2lnbmVkIGdldE9wY29kZShjb25zdCBWYWx1ZSAqVikgeworICAgIGlmIChjb25zdCBJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWKSkKKyAgICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKTsKKyAgICBpZiAoY29uc3QgQ29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oVikpCisgICAgICByZXR1cm4gQ0UtPmdldE9wY29kZSgpOworICAgIHJldHVybiBJbnN0cnVjdGlvbjo6VXNlck9wMTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKikgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0YW50RXhwciAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSB8fCBpc2E8Q29uc3RhbnRFeHByPihWKTsKKyAgfQorfTsKKworLy8vIFV0aWxpdHkgY2xhc3MgZm9yIGludGVnZXIgb3BlcmF0b3JzIHdoaWNoIG1heSBleGhpYml0IG92ZXJmbG93IC0gQWRkLCBTdWIsCisvLy8gTXVsLCBhbmQgU2hsLiBJdCBkb2VzIG5vdCBpbmNsdWRlIFNEaXYsIGRlc3BpdGUgdGhhdCBvcGVyYXRvciBoYXZpbmcgdGhlCisvLy8gcG90ZW50aWFsIGZvciBvdmVyZmxvdy4KK2NsYXNzIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3IgOiBwdWJsaWMgT3BlcmF0b3IgeworcHVibGljOgorICBlbnVtIHsKKyAgICBOb1Vuc2lnbmVkV3JhcCA9ICgxIDw8IDApLAorICAgIE5vU2lnbmVkV3JhcCAgID0gKDEgPDwgMSkKKyAgfTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworICBmcmllbmQgY2xhc3MgQ29uc3RhbnRFeHByOworCisgIHZvaWQgc2V0SGFzTm9VbnNpZ25lZFdyYXAoYm9vbCBCKSB7CisgICAgU3ViY2xhc3NPcHRpb25hbERhdGEgPQorICAgICAgKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgfk5vVW5zaWduZWRXcmFwKSB8IChCICogTm9VbnNpZ25lZFdyYXApOworICB9CisgIHZvaWQgc2V0SGFzTm9TaWduZWRXcmFwKGJvb2wgQikgeworICAgIFN1YmNsYXNzT3B0aW9uYWxEYXRhID0KKyAgICAgIChTdWJjbGFzc09wdGlvbmFsRGF0YSAmIH5Ob1NpZ25lZFdyYXApIHwgKEIgKiBOb1NpZ25lZFdyYXApOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFRlc3Qgd2hldGhlciB0aGlzIG9wZXJhdGlvbiBpcyBrbm93biB0byBuZXZlcgorICAvLy8gdW5kZXJnbyB1bnNpZ25lZCBvdmVyZmxvdywgYWthIHRoZSBudXcgcHJvcGVydHkuCisgIGJvb2wgaGFzTm9VbnNpZ25lZFdyYXAoKSBjb25zdCB7CisgICAgcmV0dXJuIFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgTm9VbnNpZ25lZFdyYXA7CisgIH0KKworICAvLy8gVGVzdCB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIGlzIGtub3duIHRvIG5ldmVyCisgIC8vLyB1bmRlcmdvIHNpZ25lZCBvdmVyZmxvdywgYWthIHRoZSBuc3cgcHJvcGVydHkuCisgIGJvb2wgaGFzTm9TaWduZWRXcmFwKCkgY29uc3QgeworICAgIHJldHVybiAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiBOb1NpZ25lZFdyYXApICE9IDA7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBZGQgfHwKKyAgICAgICAgICAgSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlN1YiB8fAorICAgICAgICAgICBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6TXVsIHx8CisgICAgICAgICAgIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTaGw7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDb25zdGFudEV4cHIgKkNFKSB7CisgICAgcmV0dXJuIENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QWRkIHx8CisgICAgICAgICAgIENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U3ViIHx8CisgICAgICAgICAgIENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6TXVsIHx8CisgICAgICAgICAgIENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U2hsOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gKGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSkpIHx8CisgICAgICAgICAgIChpc2E8Q29uc3RhbnRFeHByPihWKSAmJiBjbGFzc29mKGNhc3Q8Q29uc3RhbnRFeHByPihWKSkpOworICB9Cit9OworCisvLy8gQSB1ZGl2IG9yIHNkaXYgaW5zdHJ1Y3Rpb24sIHdoaWNoIGNhbiBiZSBtYXJrZWQgYXMgImV4YWN0IiwKKy8vLyBpbmRpY2F0aW5nIHRoYXQgbm8gYml0cyBhcmUgZGVzdHJveWVkLgorY2xhc3MgUG9zc2libHlFeGFjdE9wZXJhdG9yIDogcHVibGljIE9wZXJhdG9yIHsKK3B1YmxpYzoKKyAgZW51bSB7CisgICAgSXNFeGFjdCA9ICgxIDw8IDApCisgIH07CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKyAgZnJpZW5kIGNsYXNzIENvbnN0YW50RXhwcjsKKworICB2b2lkIHNldElzRXhhY3QoYm9vbCBCKSB7CisgICAgU3ViY2xhc3NPcHRpb25hbERhdGEgPSAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiB+SXNFeGFjdCkgfCAoQiAqIElzRXhhY3QpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFRlc3Qgd2hldGhlciB0aGlzIGRpdmlzaW9uIGlzIGtub3duIHRvIGJlIGV4YWN0LCB3aXRoIHplcm8gcmVtYWluZGVyLgorICBib29sIGlzRXhhY3QoKSBjb25zdCB7CisgICAgcmV0dXJuIFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgSXNFeGFjdDsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzUG9zc2libHlFeGFjdE9wY29kZSh1bnNpZ25lZCBPcEMpIHsKKyAgICByZXR1cm4gT3BDID09IEluc3RydWN0aW9uOjpTRGl2IHx8CisgICAgICAgICAgIE9wQyA9PSBJbnN0cnVjdGlvbjo6VURpdiB8fAorICAgICAgICAgICBPcEMgPT0gSW5zdHJ1Y3Rpb246OkFTaHIgfHwKKyAgICAgICAgICAgT3BDID09IEluc3RydWN0aW9uOjpMU2hyOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDb25zdGFudEV4cHIgKkNFKSB7CisgICAgcmV0dXJuIGlzUG9zc2libHlFeGFjdE9wY29kZShDRS0+Z2V0T3Bjb2RlKCkpOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gaXNQb3NzaWJseUV4YWN0T3Bjb2RlKEktPmdldE9wY29kZSgpKTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIChpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpKSB8fAorICAgICAgICAgICAoaXNhPENvbnN0YW50RXhwcj4oVikgJiYgY2xhc3NvZihjYXN0PENvbnN0YW50RXhwcj4oVikpKTsKKyAgfQorfTsKKworLy8vIENvbnZlbmllbmNlIHN0cnVjdCBmb3Igc3BlY2lmeWluZyBhbmQgcmVhc29uaW5nIGFib3V0IGZhc3QtbWF0aCBmbGFncy4KK2NsYXNzIEZhc3RNYXRoRmxhZ3MgeworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEZQTWF0aE9wZXJhdG9yOworCisgIHVuc2lnbmVkIEZsYWdzID0gMDsKKworICBGYXN0TWF0aEZsYWdzKHVuc2lnbmVkIEYpIHsKKyAgICAvLyBJZiBhbGwgNyBiaXRzIGFyZSBzZXQsIHR1cm4gdGhpcyBpbnRvIC0xLiBJZiB0aGUgbnVtYmVyIG9mIGJpdHMgZ3Jvd3MsCisgICAgLy8gdGhpcyBtdXN0IGJlIHVwZGF0ZWQuIFRoaXMgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBzb21lIGZvcndhcmQgYmluYXJ5CisgICAgLy8gY29tcGF0aWJpbGl0eSBpbnN1cmFuY2UgZm9yIHRoZSBtZWFuaW5nIG9mICdmYXN0JyBpbiBjYXNlIGJpdHMgYXJlIGFkZGVkLgorICAgIGlmIChGID09IDB4N0YpIEZsYWdzID0gfjBVOworICAgIGVsc2UgRmxhZ3MgPSBGOworICB9CisKK3B1YmxpYzoKKyAgLy8gVGhpcyBpcyBob3cgdGhlIGJpdHMgYXJlIHVzZWQgaW4gVmFsdWU6OlN1YmNsYXNzT3B0aW9uYWxEYXRhIHNvIHRoZXkKKyAgLy8gc2hvdWxkIGZpdCB0aGVyZSB0b28uCisgIC8vIFdBUk5JTkc6IFdlJ3JlIG91dCBvZiBzcGFjZS4gU3ViY2xhc3NPcHRpb25hbERhdGEgb25seSBoYXMgNyBiaXRzLiBOZXcKKyAgLy8gZnVuY3Rpb25hbGl0eSB3aWxsIHJlcXVpcmUgYSBjaGFuZ2UgaW4gaG93IHRoaXMgaW5mb3JtYXRpb24gaXMgc3RvcmVkLgorICBlbnVtIHsKKyAgICBBbGxvd1JlYXNzb2MgICAgPSAoMSA8PCAwKSwKKyAgICBOb05hTnMgICAgICAgICAgPSAoMSA8PCAxKSwKKyAgICBOb0luZnMgICAgICAgICAgPSAoMSA8PCAyKSwKKyAgICBOb1NpZ25lZFplcm9zICAgPSAoMSA8PCAzKSwKKyAgICBBbGxvd1JlY2lwcm9jYWwgPSAoMSA8PCA0KSwKKyAgICBBbGxvd0NvbnRyYWN0ICAgPSAoMSA8PCA1KSwKKyAgICBBcHByb3hGdW5jICAgICAgPSAoMSA8PCA2KQorICB9OworCisgIEZhc3RNYXRoRmxhZ3MoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBhbnkoKSBjb25zdCB7IHJldHVybiBGbGFncyAhPSAwOyB9CisgIGJvb2wgbm9uZSgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzID09IDA7IH0KKyAgYm9vbCBhbGwoKSBjb25zdCB7IHJldHVybiBGbGFncyA9PSB+MFU7IH0KKworICB2b2lkIGNsZWFyKCkgeyBGbGFncyA9IDA7IH0KKyAgdm9pZCBzZXQoKSAgIHsgRmxhZ3MgPSB+MFU7IH0KKworICAvLy8gRmxhZyBxdWVyaWVzCisgIGJvb2wgYWxsb3dSZWFzc29jKCkgY29uc3QgICAgeyByZXR1cm4gMCAhPSAoRmxhZ3MgJiBBbGxvd1JlYXNzb2MpOyB9CisgIGJvb2wgbm9OYU5zKCkgY29uc3QgICAgICAgICAgeyByZXR1cm4gMCAhPSAoRmxhZ3MgJiBOb05hTnMpOyB9CisgIGJvb2wgbm9JbmZzKCkgY29uc3QgICAgICAgICAgeyByZXR1cm4gMCAhPSAoRmxhZ3MgJiBOb0luZnMpOyB9CisgIGJvb2wgbm9TaWduZWRaZXJvcygpIGNvbnN0ICAgeyByZXR1cm4gMCAhPSAoRmxhZ3MgJiBOb1NpZ25lZFplcm9zKTsgfQorICBib29sIGFsbG93UmVjaXByb2NhbCgpIGNvbnN0IHsgcmV0dXJuIDAgIT0gKEZsYWdzICYgQWxsb3dSZWNpcHJvY2FsKTsgfQorICBib29sIGFsbG93Q29udHJhY3QoKSBjb25zdCAgIHsgcmV0dXJuIDAgIT0gKEZsYWdzICYgQWxsb3dDb250cmFjdCk7IH0KKyAgYm9vbCBhcHByb3hGdW5jKCkgY29uc3QgICAgICB7IHJldHVybiAwICE9IChGbGFncyAmIEFwcHJveEZ1bmMpOyB9CisgIC8vLyAnRmFzdCcgbWVhbnMgYWxsIGJpdHMgYXJlIHNldC4KKyAgYm9vbCBpc0Zhc3QoKSBjb25zdCAgICAgICAgICB7IHJldHVybiBhbGwoKTsgfQorCisgIC8vLyBGbGFnIHNldHRlcnMKKyAgdm9pZCBzZXRBbGxvd1JlYXNzb2MoKSAgICB7IEZsYWdzIHw9IEFsbG93UmVhc3NvYzsgfQorICB2b2lkIHNldE5vTmFOcygpICAgICAgICAgIHsgRmxhZ3MgfD0gTm9OYU5zOyB9CisgIHZvaWQgc2V0Tm9JbmZzKCkgICAgICAgICAgeyBGbGFncyB8PSBOb0luZnM7IH0KKyAgdm9pZCBzZXROb1NpZ25lZFplcm9zKCkgICB7IEZsYWdzIHw9IE5vU2lnbmVkWmVyb3M7IH0KKyAgdm9pZCBzZXRBbGxvd1JlY2lwcm9jYWwoKSB7IEZsYWdzIHw9IEFsbG93UmVjaXByb2NhbDsgfQorICAvLyBUT0RPOiBDaGFuZ2UgdGhlIG90aGVyIHNldCogZnVuY3Rpb25zIHRvIHRha2UgYSBwYXJhbWV0ZXI/CisgIHZvaWQgc2V0QWxsb3dDb250cmFjdChib29sIEIpIHsKKyAgICBGbGFncyA9IChGbGFncyAmIH5BbGxvd0NvbnRyYWN0KSB8IEIgKiBBbGxvd0NvbnRyYWN0OworICB9CisgIHZvaWQgc2V0QXBwcm94RnVuYygpICAgICAgeyBGbGFncyB8PSBBcHByb3hGdW5jOyB9CisgIHZvaWQgc2V0RmFzdCgpICAgICAgICAgICAgeyBzZXQoKTsgfQorCisgIHZvaWQgb3BlcmF0b3ImPShjb25zdCBGYXN0TWF0aEZsYWdzICZPdGhlckZsYWdzKSB7CisgICAgRmxhZ3MgJj0gT3RoZXJGbGFncy5GbGFnczsKKyAgfQorfTsKKworLy8vIFV0aWxpdHkgY2xhc3MgZm9yIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMgd2hpY2ggY2FuIGhhdmUKKy8vLyBpbmZvcm1hdGlvbiBhYm91dCByZWxheGVkIGFjY3VyYWN5IHJlcXVpcmVtZW50cyBhdHRhY2hlZCB0byB0aGVtLgorY2xhc3MgRlBNYXRoT3BlcmF0b3IgOiBwdWJsaWMgT3BlcmF0b3IgeworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIC8vLyAnRmFzdCcgbWVhbnMgYWxsIGJpdHMgYXJlIHNldC4KKyAgdm9pZCBzZXRGYXN0KGJvb2wgQikgeworICAgIHNldEhhc0FsbG93UmVhc3NvYyhCKTsKKyAgICBzZXRIYXNOb05hTnMoQik7CisgICAgc2V0SGFzTm9JbmZzKEIpOworICAgIHNldEhhc05vU2lnbmVkWmVyb3MoQik7CisgICAgc2V0SGFzQWxsb3dSZWNpcHJvY2FsKEIpOworICAgIHNldEhhc0FsbG93Q29udHJhY3QoQik7CisgICAgc2V0SGFzQXBwcm94RnVuYyhCKTsKKyAgfQorCisgIHZvaWQgc2V0SGFzQWxsb3dSZWFzc29jKGJvb2wgQikgeworICAgIFN1YmNsYXNzT3B0aW9uYWxEYXRhID0KKyAgICAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiB+RmFzdE1hdGhGbGFnczo6QWxsb3dSZWFzc29jKSB8CisgICAgKEIgKiBGYXN0TWF0aEZsYWdzOjpBbGxvd1JlYXNzb2MpOworICB9CisKKyAgdm9pZCBzZXRIYXNOb05hTnMoYm9vbCBCKSB7CisgICAgU3ViY2xhc3NPcHRpb25hbERhdGEgPQorICAgICAgKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgfkZhc3RNYXRoRmxhZ3M6Ok5vTmFOcykgfAorICAgICAgKEIgKiBGYXN0TWF0aEZsYWdzOjpOb05hTnMpOworICB9CisKKyAgdm9pZCBzZXRIYXNOb0luZnMoYm9vbCBCKSB7CisgICAgU3ViY2xhc3NPcHRpb25hbERhdGEgPQorICAgICAgKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgfkZhc3RNYXRoRmxhZ3M6Ok5vSW5mcykgfAorICAgICAgKEIgKiBGYXN0TWF0aEZsYWdzOjpOb0luZnMpOworICB9CisKKyAgdm9pZCBzZXRIYXNOb1NpZ25lZFplcm9zKGJvb2wgQikgeworICAgIFN1YmNsYXNzT3B0aW9uYWxEYXRhID0KKyAgICAgIChTdWJjbGFzc09wdGlvbmFsRGF0YSAmIH5GYXN0TWF0aEZsYWdzOjpOb1NpZ25lZFplcm9zKSB8CisgICAgICAoQiAqIEZhc3RNYXRoRmxhZ3M6Ok5vU2lnbmVkWmVyb3MpOworICB9CisKKyAgdm9pZCBzZXRIYXNBbGxvd1JlY2lwcm9jYWwoYm9vbCBCKSB7CisgICAgU3ViY2xhc3NPcHRpb25hbERhdGEgPQorICAgICAgKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgfkZhc3RNYXRoRmxhZ3M6OkFsbG93UmVjaXByb2NhbCkgfAorICAgICAgKEIgKiBGYXN0TWF0aEZsYWdzOjpBbGxvd1JlY2lwcm9jYWwpOworICB9CisKKyAgdm9pZCBzZXRIYXNBbGxvd0NvbnRyYWN0KGJvb2wgQikgeworICAgIFN1YmNsYXNzT3B0aW9uYWxEYXRhID0KKyAgICAgICAgKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgfkZhc3RNYXRoRmxhZ3M6OkFsbG93Q29udHJhY3QpIHwKKyAgICAgICAgKEIgKiBGYXN0TWF0aEZsYWdzOjpBbGxvd0NvbnRyYWN0KTsKKyAgfQorCisgIHZvaWQgc2V0SGFzQXBwcm94RnVuYyhib29sIEIpIHsKKyAgICBTdWJjbGFzc09wdGlvbmFsRGF0YSA9CisgICAgICAgIChTdWJjbGFzc09wdGlvbmFsRGF0YSAmIH5GYXN0TWF0aEZsYWdzOjpBcHByb3hGdW5jKSB8CisgICAgICAgIChCICogRmFzdE1hdGhGbGFnczo6QXBwcm94RnVuYyk7CisgIH0KKworICAvLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHNldHRpbmcgbXVsdGlwbGUgZmFzdC1tYXRoIGZsYWdzLgorICAvLy8gRk1GIGlzIGEgbWFzayBvZiB0aGUgYml0cyB0byBzZXQuCisgIHZvaWQgc2V0RmFzdE1hdGhGbGFncyhGYXN0TWF0aEZsYWdzIEZNRikgeworICAgIFN1YmNsYXNzT3B0aW9uYWxEYXRhIHw9IEZNRi5GbGFnczsKKyAgfQorCisgIC8vLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgY29weWluZyBhbGwgZmFzdC1tYXRoIGZsYWdzLgorICAvLy8gQWxsIHZhbHVlcyBpbiBGTUYgYXJlIHRyYW5zZmVycmVkIHRvIHRoaXMgb3BlcmF0b3IuCisgIHZvaWQgY29weUZhc3RNYXRoRmxhZ3MoRmFzdE1hdGhGbGFncyBGTUYpIHsKKyAgICBTdWJjbGFzc09wdGlvbmFsRGF0YSA9IEZNRi5GbGFnczsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBUZXN0IGlmIHRoaXMgb3BlcmF0aW9uIGFsbG93cyBhbGwgbm9uLXN0cmljdCBmbG9hdGluZy1wb2ludCB0cmFuc2Zvcm1zLgorICBib29sIGlzRmFzdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKChTdWJjbGFzc09wdGlvbmFsRGF0YSAmIEZhc3RNYXRoRmxhZ3M6OkFsbG93UmVhc3NvYykgIT0gMCAmJgorICAgICAgICAgICAgKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgRmFzdE1hdGhGbGFnczo6Tm9OYU5zKSAhPSAwICYmCisgICAgICAgICAgICAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiBGYXN0TWF0aEZsYWdzOjpOb0luZnMpICE9IDAgJiYKKyAgICAgICAgICAgIChTdWJjbGFzc09wdGlvbmFsRGF0YSAmIEZhc3RNYXRoRmxhZ3M6Ok5vU2lnbmVkWmVyb3MpICE9IDAgJiYKKyAgICAgICAgICAgIChTdWJjbGFzc09wdGlvbmFsRGF0YSAmIEZhc3RNYXRoRmxhZ3M6OkFsbG93UmVjaXByb2NhbCkgIT0gMCAmJgorICAgICAgICAgICAgKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgRmFzdE1hdGhGbGFnczo6QWxsb3dDb250cmFjdCkgIT0gMCAmJgorICAgICAgICAgICAgKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgRmFzdE1hdGhGbGFnczo6QXBwcm94RnVuYykgIT0gMCk7CisgIH0KKworICAvLy8gVGVzdCBpZiB0aGlzIG9wZXJhdGlvbiBtYXkgYmUgc2ltcGxpZmllZCB3aXRoIHJlYXNzb2NpYXRpdmUgdHJhbnNmb3Jtcy4KKyAgYm9vbCBoYXNBbGxvd1JlYXNzb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIChTdWJjbGFzc09wdGlvbmFsRGF0YSAmIEZhc3RNYXRoRmxhZ3M6OkFsbG93UmVhc3NvYykgIT0gMDsKKyAgfQorCisgIC8vLyBUZXN0IGlmIHRoaXMgb3BlcmF0aW9uJ3MgYXJndW1lbnRzIGFuZCByZXN1bHRzIGFyZSBhc3N1bWVkIG5vdC1OYU4uCisgIGJvb2wgaGFzTm9OYU5zKCkgY29uc3QgeworICAgIHJldHVybiAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiBGYXN0TWF0aEZsYWdzOjpOb05hTnMpICE9IDA7CisgIH0KKworICAvLy8gVGVzdCBpZiB0aGlzIG9wZXJhdGlvbidzIGFyZ3VtZW50cyBhbmQgcmVzdWx0cyBhcmUgYXNzdW1lZCBub3QtaW5maW5pdGUuCisgIGJvb2wgaGFzTm9JbmZzKCkgY29uc3QgeworICAgIHJldHVybiAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiBGYXN0TWF0aEZsYWdzOjpOb0luZnMpICE9IDA7CisgIH0KKworICAvLy8gVGVzdCBpZiB0aGlzIG9wZXJhdGlvbiBjYW4gaWdub3JlIHRoZSBzaWduIG9mIHplcm8uCisgIGJvb2wgaGFzTm9TaWduZWRaZXJvcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgRmFzdE1hdGhGbGFnczo6Tm9TaWduZWRaZXJvcykgIT0gMDsKKyAgfQorCisgIC8vLyBUZXN0IGlmIHRoaXMgb3BlcmF0aW9uIGNhbiB1c2UgcmVjaXByb2NhbCBtdWx0aXBseSBpbnN0ZWFkIG9mIGRpdmlzaW9uLgorICBib29sIGhhc0FsbG93UmVjaXByb2NhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgRmFzdE1hdGhGbGFnczo6QWxsb3dSZWNpcHJvY2FsKSAhPSAwOworICB9CisKKyAgLy8vIFRlc3QgaWYgdGhpcyBvcGVyYXRpb24gY2FuIGJlIGZsb2F0aW5nLXBvaW50IGNvbnRyYWN0ZWQgKEZNQSkuCisgIGJvb2wgaGFzQWxsb3dDb250cmFjdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgRmFzdE1hdGhGbGFnczo6QWxsb3dDb250cmFjdCkgIT0gMDsKKyAgfQorCisgIC8vLyBUZXN0IGlmIHRoaXMgb3BlcmF0aW9uIGFsbG93cyBhcHByb3hpbWF0aW9ucyBvZiBtYXRoIGxpYnJhcnkgZnVuY3Rpb25zIG9yCisgIC8vLyBpbnRyaW5zaWNzLgorICBib29sIGhhc0FwcHJveEZ1bmMoKSBjb25zdCB7CisgICAgcmV0dXJuIChTdWJjbGFzc09wdGlvbmFsRGF0YSAmIEZhc3RNYXRoRmxhZ3M6OkFwcHJveEZ1bmMpICE9IDA7CisgIH0KKworICAvLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGdldHRpbmcgYWxsIHRoZSBmYXN0LW1hdGggZmxhZ3MKKyAgRmFzdE1hdGhGbGFncyBnZXRGYXN0TWF0aEZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBGYXN0TWF0aEZsYWdzKFN1YmNsYXNzT3B0aW9uYWxEYXRhKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIG1heGltdW0gZXJyb3IgcGVybWl0dGVkIGJ5IHRoaXMgb3BlcmF0aW9uIGluIFVMUHMuIEFuIGFjY3VyYWN5IG9mCisgIC8vLyAwLjAgbWVhbnMgdGhhdCB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQgd2l0aCB0aGUgZGVmYXVsdAorICAvLy8gcHJlY2lzaW9uLgorICBmbG9hdCBnZXRGUEFjY3VyYWN5KCkgY29uc3Q7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRUeXBlKCktPmlzRlBPckZQVmVjdG9yVHkoKSB8fAorICAgICAgSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkZDbXA7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0YW50RXhwciAqQ0UpIHsKKyAgICByZXR1cm4gQ0UtPmdldFR5cGUoKS0+aXNGUE9yRlBWZWN0b3JUeSgpIHx8CisgICAgICAgICAgIENFLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RkNtcDsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gKGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSkpIHx8CisgICAgICAgICAgIChpc2E8Q29uc3RhbnRFeHByPihWKSAmJiBjbGFzc29mKGNhc3Q8Q29uc3RhbnRFeHByPihWKSkpOworICB9Cit9OworCisvLy8gQSBoZWxwZXIgdGVtcGxhdGUgZm9yIGRlZmluaW5nIG9wZXJhdG9ycyBmb3IgaW5kaXZpZHVhbCBvcGNvZGVzLgordGVtcGxhdGU8dHlwZW5hbWUgU3VwZXJDbGFzcywgdW5zaWduZWQgT3BjPgorY2xhc3MgQ29uY3JldGVPcGVyYXRvciA6IHB1YmxpYyBTdXBlckNsYXNzIHsKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBPcGM7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDb25zdGFudEV4cHIgKkNFKSB7CisgICAgcmV0dXJuIENFLT5nZXRPcGNvZGUoKSA9PSBPcGM7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiAoaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKSkgfHwKKyAgICAgICAgICAgKGlzYTxDb25zdGFudEV4cHI+KFYpICYmIGNsYXNzb2YoY2FzdDxDb25zdGFudEV4cHI+KFYpKSk7CisgIH0KK307CisKK2NsYXNzIEFkZE9wZXJhdG9yCisgIDogcHVibGljIENvbmNyZXRlT3BlcmF0b3I8T3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvciwgSW5zdHJ1Y3Rpb246OkFkZD4geworfTsKK2NsYXNzIFN1Yk9wZXJhdG9yCisgIDogcHVibGljIENvbmNyZXRlT3BlcmF0b3I8T3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvciwgSW5zdHJ1Y3Rpb246OlN1Yj4geworfTsKK2NsYXNzIE11bE9wZXJhdG9yCisgIDogcHVibGljIENvbmNyZXRlT3BlcmF0b3I8T3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvciwgSW5zdHJ1Y3Rpb246Ok11bD4geworfTsKK2NsYXNzIFNobE9wZXJhdG9yCisgIDogcHVibGljIENvbmNyZXRlT3BlcmF0b3I8T3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvciwgSW5zdHJ1Y3Rpb246OlNobD4geworfTsKKworY2xhc3MgU0Rpdk9wZXJhdG9yCisgIDogcHVibGljIENvbmNyZXRlT3BlcmF0b3I8UG9zc2libHlFeGFjdE9wZXJhdG9yLCBJbnN0cnVjdGlvbjo6U0Rpdj4geworfTsKK2NsYXNzIFVEaXZPcGVyYXRvcgorICA6IHB1YmxpYyBDb25jcmV0ZU9wZXJhdG9yPFBvc3NpYmx5RXhhY3RPcGVyYXRvciwgSW5zdHJ1Y3Rpb246OlVEaXY+IHsKK307CitjbGFzcyBBU2hyT3BlcmF0b3IKKyAgOiBwdWJsaWMgQ29uY3JldGVPcGVyYXRvcjxQb3NzaWJseUV4YWN0T3BlcmF0b3IsIEluc3RydWN0aW9uOjpBU2hyPiB7Cit9OworY2xhc3MgTFNock9wZXJhdG9yCisgIDogcHVibGljIENvbmNyZXRlT3BlcmF0b3I8UG9zc2libHlFeGFjdE9wZXJhdG9yLCBJbnN0cnVjdGlvbjo6TFNocj4geworfTsKKworY2xhc3MgWkV4dE9wZXJhdG9yIDogcHVibGljIENvbmNyZXRlT3BlcmF0b3I8T3BlcmF0b3IsIEluc3RydWN0aW9uOjpaRXh0PiB7fTsKKworY2xhc3MgR0VQT3BlcmF0b3IKKyAgOiBwdWJsaWMgQ29uY3JldGVPcGVyYXRvcjxPcGVyYXRvciwgSW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHI+IHsKKyAgZnJpZW5kIGNsYXNzIEdldEVsZW1lbnRQdHJJbnN0OworICBmcmllbmQgY2xhc3MgQ29uc3RhbnRFeHByOworCisgIGVudW0geworICAgIElzSW5Cb3VuZHMgPSAoMSA8PCAwKSwKKyAgICAvLyBJblJhbmdlSW5kZXg6IGJpdHMgMS02CisgIH07CisKKyAgdm9pZCBzZXRJc0luQm91bmRzKGJvb2wgQikgeworICAgIFN1YmNsYXNzT3B0aW9uYWxEYXRhID0KKyAgICAgIChTdWJjbGFzc09wdGlvbmFsRGF0YSAmIH5Jc0luQm91bmRzKSB8IChCICogSXNJbkJvdW5kcyk7CisgIH0KKworcHVibGljOgorICAvLy8gVGVzdCB3aGV0aGVyIHRoaXMgaXMgYW4gaW5ib3VuZHMgR0VQLCBhcyBkZWZpbmVkIGJ5IExhbmdSZWYuaHRtbC4KKyAgYm9vbCBpc0luQm91bmRzKCkgY29uc3QgeworICAgIHJldHVybiBTdWJjbGFzc09wdGlvbmFsRGF0YSAmIElzSW5Cb3VuZHM7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBpbmRleCB3aXRoIGFuIGlucmFuZ2UgYXR0YWNobWVudCwgb3IgTm9uZSBpZgorICAvLy8gbm9uZS4KKyAgT3B0aW9uYWw8dW5zaWduZWQ+IGdldEluUmFuZ2VJbmRleCgpIGNvbnN0IHsKKyAgICBpZiAoU3ViY2xhc3NPcHRpb25hbERhdGEgPj4gMSA9PSAwKSByZXR1cm4gTm9uZTsKKyAgICByZXR1cm4gKFN1YmNsYXNzT3B0aW9uYWxEYXRhID4+IDEpIC0gMTsKKyAgfQorCisgIGlubGluZSBvcF9pdGVyYXRvciAgICAgICBpZHhfYmVnaW4oKSAgICAgICB7IHJldHVybiBvcF9iZWdpbigpKzE7IH0KKyAgaW5saW5lIGNvbnN0X29wX2l0ZXJhdG9yIGlkeF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIG9wX2JlZ2luKCkrMTsgfQorICBpbmxpbmUgb3BfaXRlcmF0b3IgICAgICAgaWR4X2VuZCgpICAgICAgICAgeyByZXR1cm4gb3BfZW5kKCk7IH0KKyAgaW5saW5lIGNvbnN0X29wX2l0ZXJhdG9yIGlkeF9lbmQoKSAgIGNvbnN0IHsgcmV0dXJuIG9wX2VuZCgpOyB9CisKKyAgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKCkgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDApOworICB9CisgIGNvbnN0IFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZCgwKTsKKyAgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0UG9pbnRlck9wZXJhbmRJbmRleCgpIHsKKyAgICByZXR1cm4gMFU7ICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbmRleCBmb3IgbW9kaWZ5aW5nIGNvcnJlY3Qgb3BlcmFuZAorICB9CisKKyAgLy8vIE1ldGhvZCB0byByZXR1cm4gdGhlIHBvaW50ZXIgb3BlcmFuZCBhcyBhIFBvaW50ZXJUeXBlLgorICBUeXBlICpnZXRQb2ludGVyT3BlcmFuZFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFBvaW50ZXJPcGVyYW5kKCktPmdldFR5cGUoKTsKKyAgfQorCisgIFR5cGUgKmdldFNvdXJjZUVsZW1lbnRUeXBlKCkgY29uc3Q7CisgIFR5cGUgKmdldFJlc3VsdEVsZW1lbnRUeXBlKCkgY29uc3Q7CisKKyAgLy8vIE1ldGhvZCB0byByZXR1cm4gdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIHBvaW50ZXIgb3BlcmFuZC4KKyAgdW5zaWduZWQgZ2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UG9pbnRlck9wZXJhbmRUeXBlKCktPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUluZGljZXMoKSBjb25zdCB7ICAvLyBOb3RlOiBhbHdheXMgbm9uLW5lZ2F0aXZlCisgICAgcmV0dXJuIGdldE51bU9wZXJhbmRzKCkgLSAxOworICB9CisKKyAgYm9vbCBoYXNJbmRpY2VzKCkgY29uc3QgeworICAgIHJldHVybiBnZXROdW1PcGVyYW5kcygpID4gMTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbGwgb2YgdGhlIGluZGljZXMgb2YgdGhpcyBHRVAgYXJlIHplcm9zLgorICAvLy8gSWYgc28sIHRoZSByZXN1bHQgcG9pbnRlciBhbmQgdGhlIGZpcnN0IG9wZXJhbmQgaGF2ZSB0aGUgc2FtZQorICAvLy8gdmFsdWUsIGp1c3QgcG90ZW50aWFsbHkgZGlmZmVyZW50IHR5cGVzLgorICBib29sIGhhc0FsbFplcm9JbmRpY2VzKCkgY29uc3QgeworICAgIGZvciAoY29uc3Rfb3BfaXRlcmF0b3IgSSA9IGlkeF9iZWdpbigpLCBFID0gaWR4X2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgaWYgKENvbnN0YW50SW50ICpDID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEkpKQorICAgICAgICBpZiAoQy0+aXNaZXJvKCkpCisgICAgICAgICAgY29udGludWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGFsbCBvZiB0aGUgaW5kaWNlcyBvZiB0aGlzIEdFUCBhcmUgY29uc3RhbnQgaW50ZWdlcnMuCisgIC8vLyBJZiBzbywgdGhlIHJlc3VsdCBwb2ludGVyIGFuZCB0aGUgZmlyc3Qgb3BlcmFuZCBoYXZlCisgIC8vLyBhIGNvbnN0YW50IG9mZnNldCBiZXR3ZWVuIHRoZW0uCisgIGJvb2wgaGFzQWxsQ29uc3RhbnRJbmRpY2VzKCkgY29uc3QgeworICAgIGZvciAoY29uc3Rfb3BfaXRlcmF0b3IgSSA9IGlkeF9iZWdpbigpLCBFID0gaWR4X2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgaWYgKCFpc2E8Q29uc3RhbnRJbnQ+KEkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdW5zaWduZWQgY291bnROb25Db25zdGFudEluZGljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvdW50X2lmKG1ha2VfcmFuZ2UoaWR4X2JlZ2luKCksIGlkeF9lbmQoKSksIFtdKGNvbnN0IFVzZSYgdXNlKSB7CisgICAgICAgIHJldHVybiAhaXNhPENvbnN0YW50SW50PigqdXNlKTsKKyAgICAgIH0pOworICB9CisKKyAgLy8vIFxicmllZiBBY2N1bXVsYXRlIHRoZSBjb25zdGFudCBhZGRyZXNzIG9mZnNldCBvZiB0aGlzIEdFUCBpZiBwb3NzaWJsZS4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgYWNjZXB0cyBhbiBBUEludCBpbnRvIHdoaWNoIGl0IHdpbGwgYWNjdW11bGF0ZSB0aGUgY29uc3RhbnQKKyAgLy8vIG9mZnNldCBvZiB0aGlzIEdFUCBpZiB0aGUgR0VQIGlzIGluIGZhY3QgY29uc3RhbnQuIElmIHRoZSBHRVAgaXMgbm90CisgIC8vLyBhbGwtY29uc3RhbnQsIGl0IHJldHVybnMgZmFsc2UgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgb2Zmc2V0IEFQSW50IGlzCisgIC8vLyB1bmRlZmluZWQgKGl0IGlzICpub3QqIHByZXNlcnZlZCEpLiBUaGUgQVBJbnQgcGFzc2VkIGludG8gdGhpcyByb3V0aW5lCisgIC8vLyBtdXN0IGJlIGF0IGV4YWN0bHkgYXMgd2lkZSBhcyB0aGUgSW50UHRyIHR5cGUgZm9yIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZQorICAvLy8gYmFzZSBHRVAgcG9pbnRlci4KKyAgYm9vbCBhY2N1bXVsYXRlQ29uc3RhbnRPZmZzZXQoY29uc3QgRGF0YUxheW91dCAmREwsIEFQSW50ICZPZmZzZXQpIGNvbnN0OworfTsKKworY2xhc3MgUHRyVG9JbnRPcGVyYXRvcgorICAgIDogcHVibGljIENvbmNyZXRlT3BlcmF0b3I8T3BlcmF0b3IsIEluc3RydWN0aW9uOjpQdHJUb0ludD4geworICBmcmllbmQgY2xhc3MgUHRyVG9JbnQ7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudEV4cHI7CisKK3B1YmxpYzoKKyAgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKCkgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDApOworICB9CisgIGNvbnN0IFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZCgwKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRQb2ludGVyT3BlcmFuZEluZGV4KCkgeworICAgIHJldHVybiAwVTsgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGluZGV4IGZvciBtb2RpZnlpbmcgY29ycmVjdCBvcGVyYW5kCisgIH0KKworICAvLy8gTWV0aG9kIHRvIHJldHVybiB0aGUgcG9pbnRlciBvcGVyYW5kIGFzIGEgUG9pbnRlclR5cGUuCisgIFR5cGUgKmdldFBvaW50ZXJPcGVyYW5kVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UG9pbnRlck9wZXJhbmQoKS0+Z2V0VHlwZSgpOworICB9CisKKyAgLy8vIE1ldGhvZCB0byByZXR1cm4gdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIHBvaW50ZXIgb3BlcmFuZC4KKyAgdW5zaWduZWQgZ2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxQb2ludGVyVHlwZT4oZ2V0UG9pbnRlck9wZXJhbmRUeXBlKCkpLT5nZXRBZGRyZXNzU3BhY2UoKTsKKyAgfQorfTsKKworY2xhc3MgQml0Q2FzdE9wZXJhdG9yCisgICAgOiBwdWJsaWMgQ29uY3JldGVPcGVyYXRvcjxPcGVyYXRvciwgSW5zdHJ1Y3Rpb246OkJpdENhc3Q+IHsKKyAgZnJpZW5kIGNsYXNzIEJpdENhc3RJbnN0OworICBmcmllbmQgY2xhc3MgQ29uc3RhbnRFeHByOworCitwdWJsaWM6CisgIFR5cGUgKmdldFNyY1R5KCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDApLT5nZXRUeXBlKCk7CisgIH0KKworICBUeXBlICpnZXREZXN0VHkoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGUoKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfT1BFUkFUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9PcHRCaXNlY3QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvT3B0QmlzZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjNzI0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvT3B0QmlzZWN0LmgKQEAgLTAsMCArMSw4OSBAQAorLy89PT0tIGxsdm0vSVIvT3B0QmlzZWN0LmggLSBMTFZNIEJpc2VjdCBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UgZm9yIGJpc2VjdGluZyBvcHRpbWl6YXRpb25zLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfT1BUQklTRUNUX0gKKyNkZWZpbmUgTExWTV9JUl9PUFRCSVNFQ1RfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgUGFzczsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIFJlZ2lvbjsKK2NsYXNzIExvb3A7CitjbGFzcyBDYWxsR3JhcGhTQ0M7CisKKy8vLyBFeHRlbnNpb25zIHRvIHRoaXMgY2xhc3MgaW1wbGVtZW50IG1lY2hhbmlzbXMgdG8gZGlzYWJsZSBwYXNzZXMgYW5kCisvLy8gaW5kaXZpZHVhbCBvcHRpbWl6YXRpb25zIGF0IGNvbXBpbGUgdGltZS4KK2NsYXNzIE9wdFBhc3NHYXRlIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+T3B0UGFzc0dhdGUoKSA9IGRlZmF1bHQ7CisKKyAgdmlydHVhbCBib29sIHNob3VsZFJ1blBhc3MoY29uc3QgUGFzcyAqUCwgY29uc3QgTW9kdWxlICZVKSB7IHJldHVybiB0cnVlOyB9CisgIHZpcnR1YWwgYm9vbCBzaG91bGRSdW5QYXNzKGNvbnN0IFBhc3MgKlAsIGNvbnN0IEZ1bmN0aW9uICZVKSAge3JldHVybiB0cnVlOyB9CisgIHZpcnR1YWwgYm9vbCBzaG91bGRSdW5QYXNzKGNvbnN0IFBhc3MgKlAsIGNvbnN0IEJhc2ljQmxvY2sgJlUpICB7IHJldHVybiB0cnVlOyB9CisgIHZpcnR1YWwgYm9vbCBzaG91bGRSdW5QYXNzKGNvbnN0IFBhc3MgKlAsIGNvbnN0IFJlZ2lvbiAmVSkgIHsgcmV0dXJuIHRydWU7IH0KKyAgdmlydHVhbCBib29sIHNob3VsZFJ1blBhc3MoY29uc3QgUGFzcyAqUCwgY29uc3QgTG9vcCAmVSkgIHsgcmV0dXJuIHRydWU7IH0KKyAgdmlydHVhbCBib29sIHNob3VsZFJ1blBhc3MoY29uc3QgUGFzcyAqUCwgY29uc3QgQ2FsbEdyYXBoU0NDICZVKSAgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworLy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIG1lY2hhbmlzbSB0byBkaXNhYmxlIHBhc3NlcyBhbmQgaW5kaXZpZHVhbAorLy8vIG9wdGltaXphdGlvbnMgYXQgY29tcGlsZSB0aW1lIGJhc2VkIG9uIGEgY29tbWFuZCBsaW5lIG9wdGlvbgorLy8vICgtb3B0LWJpc2VjdC1saW1pdCkgaW4gb3JkZXIgdG8gcGVyZm9ybSBhIGJpc2VjdGluZyBzZWFyY2ggZm9yCisvLy8gb3B0aW1pemF0aW9uLXJlbGF0ZWQgcHJvYmxlbXMuCitjbGFzcyBPcHRCaXNlY3QgOiBwdWJsaWMgT3B0UGFzc0dhdGUgeworcHVibGljOgorICAvLy8gXGJyaWVmIERlZmF1bHQgY29uc3RydWN0b3IsIGluaXRpYWxpemVzIHRoZSBPcHRCaXNlY3Qgc3RhdGUgYmFzZWQgb24gdGhlCisgIC8vLyAtb3B0LWJpc2VjdC1saW1pdCBjb21tYW5kIGxpbmUgYXJndW1lbnQuCisgIC8vLworICAvLy8gQnkgZGVmYXVsdCwgYmlzZWN0aW9uIGlzIGRpc2FibGVkLgorICAvLy8KKyAgLy8vIENsaWVudHMgc2hvdWxkIG5vdCBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIGRpcmVjdGx5LiAgQWxsIGFjY2VzcyBzaG91bGQgZ28KKyAgLy8vIHRocm91Z2ggTExWTUNvbnRleHQuCisgIE9wdEJpc2VjdCgpOworCisgIHZpcnR1YWwgfk9wdEJpc2VjdCgpID0gZGVmYXVsdDsKKworICAvLy8gQ2hlY2tzIHRoZSBiaXNlY3QgbGltaXQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZWQgcGFzcyBzaG91bGQgcnVuLgorICAvLy8KKyAgLy8vIFRoZXNlIGZ1bmN0aW9ucyBpbW1lZGlhdGVseSByZXR1cm4gdHJ1ZSBpZiBiaXNlY3Rpb24gaXMgZGlzYWJsZWQuIElmIHRoZQorICAvLy8gYmlzZWN0IGxpbWl0IGlzIHNldCB0byAtMSwgdGhlIGZ1bmN0aW9ucyBwcmludCBhIG1lc3NhZ2UgZGVzY3JpYmluZworICAvLy8gdGhlIHBhc3MgYW5kIHRoZSBiaXNlY3QgbnVtYmVyIGFzc2lnbmVkIHRvIGl0IGFuZCByZXR1cm4gdHJ1ZS4gIE90aGVyd2lzZSwKKyAgLy8vIHRoZSBmdW5jdGlvbnMgcHJpbnQgYSBtZXNzYWdlIHdpdGggdGhlIGJpc2VjdCBudW1iZXIgYXNzaWduZWQgdG8gdGhlCisgIC8vLyBwYXNzIGFuZCBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBwYXNzIHdpbGwgYmUgcnVuIGFuZCByZXR1cm4gdHJ1ZSBpZgorICAvLy8gdGhlIGJpc2VjdCBsaW1pdCBoYXMgbm90IHlldCBiZWVuIGV4Y2VlZGVkIG9yIGZhbHNlIGlmIGl0IGhhcy4KKyAgLy8vCisgIC8vLyBNb3N0IHBhc3NlcyBzaG91bGQgbm90IGNhbGwgdGhlc2Ugcm91dGluZXMgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgYXJlCisgIC8vLyBjYWxsZWQgdGhyb3VnaCBoZWxwZXIgcm91dGluZXMgcHJvdmlkZWQgYnkgdGhlIHBhc3MgYmFzZSBjbGFzc2VzLiAgRm9yCisgIC8vLyBpbnN0YW5jZSwgZnVuY3Rpb24gcGFzc2VzIHNob3VsZCBjYWxsIEZ1bmN0aW9uUGFzczo6c2tpcEZ1bmN0aW9uKCkuCisgIGJvb2wgc2hvdWxkUnVuUGFzcyhjb25zdCBQYXNzICpQLCBjb25zdCBNb2R1bGUgJlUpIG92ZXJyaWRlOworICBib29sIHNob3VsZFJ1blBhc3MoY29uc3QgUGFzcyAqUCwgY29uc3QgRnVuY3Rpb24gJlUpIG92ZXJyaWRlOworICBib29sIHNob3VsZFJ1blBhc3MoY29uc3QgUGFzcyAqUCwgY29uc3QgQmFzaWNCbG9jayAmVSkgb3ZlcnJpZGU7CisgIGJvb2wgc2hvdWxkUnVuUGFzcyhjb25zdCBQYXNzICpQLCBjb25zdCBSZWdpb24gJlUpIG92ZXJyaWRlOworICBib29sIHNob3VsZFJ1blBhc3MoY29uc3QgUGFzcyAqUCwgY29uc3QgTG9vcCAmVSkgb3ZlcnJpZGU7CisgIGJvb2wgc2hvdWxkUnVuUGFzcyhjb25zdCBQYXNzICpQLCBjb25zdCBDYWxsR3JhcGhTQ0MgJlUpIG92ZXJyaWRlOworCitwcml2YXRlOgorICBib29sIGNoZWNrUGFzcyhjb25zdCBTdHJpbmdSZWYgUGFzc05hbWUsIGNvbnN0IFN0cmluZ1JlZiBUYXJnZXREZXNjKTsKKworICBib29sIEJpc2VjdEVuYWJsZWQgPSBmYWxzZTsKKyAgdW5zaWduZWQgTGFzdEJpc2VjdE51bSA9IDA7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9PUFRCSVNFQ1RfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9QYXNzTWFuYWdlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9QYXNzTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmODM4YTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1Bhc3NNYW5hZ2VyLmgKQEAgLTAsMCArMSwxMzI0IEBACisvLz09PS0gUGFzc01hbmFnZXIuaCAtIFBhc3MgbWFuYWdlbWVudCBpbmZyYXN0cnVjdHVyZSAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8KKy8vLyBUaGlzIGhlYWRlciBkZWZpbmVzIHZhcmlvdXMgaW50ZXJmYWNlcyBmb3IgcGFzcyBtYW5hZ2VtZW50IGluIExMVk0uIFRoZXJlCisvLy8gaXMgbm8gInBhc3MiIGludGVyZmFjZSBpbiBMTFZNIHBlciBzZS4gSW5zdGVhZCwgYW4gaW5zdGFuY2Ugb2YgYW55IGNsYXNzCisvLy8gd2hpY2ggc3VwcG9ydHMgYSBtZXRob2QgdG8gJ3J1bicgaXQgb3ZlciBhIHVuaXQgb2YgSVIgY2FuIGJlIHVzZWQgYXMKKy8vLyBhIHBhc3MuIEEgcGFzcyBtYW5hZ2VyIGlzIGdlbmVyYWxseSBhIHRvb2wgdG8gY29sbGVjdCBhIHNlcXVlbmNlIG9mIHBhc3NlcworLy8vIHdoaWNoIHJ1biBvdmVyIGEgcGFydGljdWxhciBJUiBjb25zdHJ1Y3QsIGFuZCBydW4gZWFjaCBvZiB0aGVtIGluIHNlcXVlbmNlCisvLy8gb3ZlciBlYWNoIHN1Y2ggY29uc3RydWN0IGluIHRoZSBjb250YWluaW5nIElSIGNvbnN0cnVjdC4gQXMgdGhlcmUgaXMgbm8KKy8vLyBjb250YWluaW5nIElSIGNvbnN0cnVjdCBmb3IgYSBNb2R1bGUsIGEgbWFuYWdlciBmb3IgcGFzc2VzIG92ZXIgbW9kdWxlcworLy8vIGZvcm1zIHRoZSBiYXNlIGNhc2Ugd2hpY2ggcnVucyBpdHMgbWFuYWdlZCBwYXNzZXMgaW4gc2VxdWVuY2Ugb3ZlciB0aGUKKy8vLyBzaW5nbGUgbW9kdWxlIHByb3ZpZGVkLgorLy8vCisvLy8gVGhlIGNvcmUgSVIgbGlicmFyeSBwcm92aWRlcyBtYW5hZ2VycyBmb3IgcnVubmluZyBwYXNzZXMgb3ZlcgorLy8vIG1vZHVsZXMgYW5kIGZ1bmN0aW9ucy4KKy8vLworLy8vICogRnVuY3Rpb25QYXNzTWFuYWdlciBjYW4gcnVuIG92ZXIgYSBNb2R1bGUsIHJ1bnMgZWFjaCBwYXNzIG92ZXIKKy8vLyAgIGEgRnVuY3Rpb24uCisvLy8gKiBNb2R1bGVQYXNzTWFuYWdlciBtdXN0IGJlIGRpcmVjdGx5IHJ1biwgcnVucyBlYWNoIHBhc3Mgb3ZlciB0aGUgTW9kdWxlLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHBhc3MgbWFuYWdlcnMgdXNlIGNvbmNlcHQtYmFzZWQKKy8vLyBwb2x5bW9ycGhpc20gYXMgb3V0bGluZWQgaW4gdGhlICJWYWx1ZSBTZW1hbnRpY3MgYW5kIENvbmNlcHQtYmFzZWQKKy8vLyBQb2x5bW9ycGhpc20iIHRhbGsgKG9yIGl0cyBhYmJyZXZpYXRlZCBzaWJsaW5nICJJbmhlcml0YW5jZSBJcyBUaGUgQmFzZQorLy8vIENsYXNzIG9mIEV2aWwiKSBieSBTZWFuIFBhcmVudDoKKy8vLyAqIGh0dHA6Ly9naXRodWIuY29tL3NlYW4tcGFyZW50L3NlYW4tcGFyZW50LmdpdGh1Yi5jb20vd2lraS9QYXBlcnMtYW5kLVByZXNlbnRhdGlvbnMKKy8vLyAqIGh0dHA6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1fQnBNWWVVRlh2OAorLy8vICogaHR0cDovL2NoYW5uZWw5Lm1zZG4uY29tL0V2ZW50cy9Hb2luZ05hdGl2ZS8yMDEzL0luaGVyaXRhbmNlLUlzLVRoZS1CYXNlLUNsYXNzLW9mLUV2aWwKKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX1BBU1NNQU5BR0VSX0gKKyNkZWZpbmUgTExWTV9JUl9QQVNTTUFOQUdFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVGlueVB0clZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXJJbnRlcm5hbC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9UeXBlTmFtZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEEgc3BlY2lhbCB0eXBlIHVzZWQgYnkgYW5hbHlzaXMgcGFzc2VzIHRvIHByb3ZpZGUgYW4gYWRkcmVzcyB0aGF0CisvLy8gaWRlbnRpZmllcyB0aGF0IHBhcnRpY3VsYXIgYW5hbHlzaXMgcGFzcyB0eXBlLgorLy8vCisvLy8gQW5hbHlzaXMgcGFzc2VzIHNob3VsZCBoYXZlIGEgc3RhdGljIGRhdGEgbWVtYmVyIG9mIHRoaXMgdHlwZSBhbmQgZGVyaXZlCisvLy8gZnJvbSB0aGUgXGMgQW5hbHlzaXNJbmZvTWl4aW4gdG8gZ2V0IGEgc3RhdGljIElEIG1ldGhvZCB1c2VkIHRvIGlkZW50aWZ5CisvLy8gdGhlIGFuYWx5c2lzIGluIHRoZSBwYXNzIG1hbmFnZW1lbnQgaW5mcmFzdHJ1Y3R1cmUuCitzdHJ1Y3QgYWxpZ25hcyg4KSBBbmFseXNpc0tleSB7fTsKKworLy8vIEEgc3BlY2lhbCB0eXBlIHVzZWQgdG8gcHJvdmlkZSBhbiBhZGRyZXNzIHRoYXQgaWRlbnRpZmllcyBhIHNldCBvZiByZWxhdGVkCisvLy8gYW5hbHlzZXMuICBUaGVzZSBzZXRzIGFyZSBwcmltYXJpbHkgdXNlZCBiZWxvdyB0byBtYXJrIHNldHMgb2YgYW5hbHlzZXMgYXMKKy8vLyBwcmVzZXJ2ZWQuCisvLy8KKy8vLyBGb3IgZXhhbXBsZSwgYSB0cmFuc2Zvcm1hdGlvbiBjYW4gaW5kaWNhdGUgdGhhdCBpdCBwcmVzZXJ2ZXMgdGhlIENGRyBvZiBhCisvLy8gZnVuY3Rpb24gYnkgcHJlc2VydmluZyB0aGUgYXBwcm9wcmlhdGUgQW5hbHlzaXNTZXRLZXkuICBBbiBhbmFseXNpcyB0aGF0CisvLy8gZGVwZW5kcyBvbmx5IG9uIHRoZSBDRkcgY2FuIHRoZW4gY2hlY2sgaWYgdGhhdCBBbmFseXNpc1NldEtleSBpcyBwcmVzZXJ2ZWQ7CisvLy8gaWYgaXQgaXMsIHRoZSBhbmFseXNpcyBrbm93cyB0aGF0IGl0IGl0c2VsZiBpcyBwcmVzZXJ2ZWQuCitzdHJ1Y3QgYWxpZ25hcyg4KSBBbmFseXNpc1NldEtleSB7fTsKKworLy8vIFRoaXMgdGVtcGxhdGVkIGNsYXNzIHJlcHJlc2VudHMgImFsbCBhbmFseXNlcyB0aGF0IG9wZXJhdGUgb3ZlciBcPGEKKy8vLyBwYXJ0aWN1bGFyIElSIHVuaXRcPiIgKGUuZy4gYSBGdW5jdGlvbiBvciBhIE1vZHVsZSkgaW4gaW5zdGFuY2VzIG9mCisvLy8gUHJlc2VydmVkQW5hbHlzaXMuCisvLy8KKy8vLyBUaGlzIGxldHMgYSB0cmFuc2Zvcm1hdGlvbiBzYXkgZS5nLiAiSSBwcmVzZXJ2ZWQgYWxsIGZ1bmN0aW9uIGFuYWx5c2VzIi4KKy8vLworLy8vIE5vdGUgdGhhdCB5b3UgbXVzdCBwcm92aWRlIGFuIGV4cGxpY2l0IGluc3RhbnRpYXRpb24gZGVjbGFyYXRpb24gYW5kCisvLy8gZGVmaW5pdGlvbiBmb3IgdGhpcyB0ZW1wbGF0ZSBpbiBvcmRlciB0byBnZXQgdGhlIGNvcnJlY3QgYmVoYXZpb3Igb24KKy8vLyBXaW5kb3dzLiBPdGhlcndpc2UsIHRoZSBhZGRyZXNzIG9mIFNldEtleSB3aWxsIG5vdCBiZSBzdGFibGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSVJVbml0VD4gY2xhc3MgQWxsQW5hbHlzZXNPbiB7CitwdWJsaWM6CisgIHN0YXRpYyBBbmFseXNpc1NldEtleSAqSUQoKSB7IHJldHVybiAmU2V0S2V5OyB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyBBbmFseXNpc1NldEtleSBTZXRLZXk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSVJVbml0VD4gQW5hbHlzaXNTZXRLZXkgQWxsQW5hbHlzZXNPbjxJUlVuaXRUPjo6U2V0S2V5OworCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgQWxsQW5hbHlzZXNPbjxNb2R1bGU+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIEFsbEFuYWx5c2VzT248RnVuY3Rpb24+OworCisvLy8gUmVwcmVzZW50cyBhbmFseXNlcyB0aGF0IG9ubHkgcmVseSBvbiBmdW5jdGlvbnMnIGNvbnRyb2wgZmxvdy4KKy8vLworLy8vIFRoaXMgY2FuIGJlIHVzZWQgd2l0aCBcYyBQcmVzZXJ2ZWRBbmFseXNlcyB0byBtYXJrIHRoZSBDRkcgYXMgcHJlc2VydmVkIGFuZAorLy8vIHRvIHF1ZXJ5IHdoZXRoZXIgaXQgaGFzIGJlZW4gcHJlc2VydmVkLgorLy8vCisvLy8gVGhlIENGRyBvZiBhIGZ1bmN0aW9uIGlzIGRlZmluZWQgYXMgdGhlIHNldCBvZiBiYXNpYyBibG9ja3MgYW5kIHRoZSBlZGdlcworLy8vIGJldHdlZW4gdGhlbS4gQ2hhbmdpbmcgdGhlIHNldCBvZiBiYXNpYyBibG9ja3MgaW4gYSBmdW5jdGlvbiBpcyBlbm91Z2ggdG8KKy8vLyBtdXRhdGUgdGhlIENGRy4gTXV0YXRpbmcgdGhlIGNvbmRpdGlvbiBvZiBhIGJyYW5jaCBvciBhcmd1bWVudCBvZiBhbgorLy8vIGludm9rZWQgZnVuY3Rpb24gZG9lcyBub3QgbXV0YXRlIHRoZSBDRkcsIGJ1dCBjaGFuZ2luZyB0aGUgc3VjY2Vzc29yIGxhYmVscworLy8vIG9mIHRob3NlIGluc3RydWN0aW9ucyBkb2VzLgorY2xhc3MgQ0ZHQW5hbHlzZXMgeworcHVibGljOgorICBzdGF0aWMgQW5hbHlzaXNTZXRLZXkgKklEKCkgeyByZXR1cm4gJlNldEtleTsgfQorCitwcml2YXRlOgorICBzdGF0aWMgQW5hbHlzaXNTZXRLZXkgU2V0S2V5OworfTsKKworLy8vIEEgc2V0IG9mIGFuYWx5c2VzIHRoYXQgYXJlIHByZXNlcnZlZCBmb2xsb3dpbmcgYSBydW4gb2YgYSB0cmFuc2Zvcm1hdGlvbgorLy8vIHBhc3MuCisvLy8KKy8vLyBUcmFuc2Zvcm1hdGlvbiBwYXNzZXMgYnVpbGQgYW5kIHJldHVybiB0aGVzZSBvYmplY3RzIHRvIGNvbW11bmljYXRlIHdoaWNoCisvLy8gYW5hbHlzZXMgYXJlIHN0aWxsIHZhbGlkIGFmdGVyIHRoZSB0cmFuc2Zvcm1hdGlvbi4gRm9yIG1vc3QgcGFzc2VzIHRoaXMgaXMKKy8vLyBmYWlybHkgc2ltcGxlOiBpZiB0aGV5IGRvbid0IGNoYW5nZSBhbnl0aGluZyBhbGwgYW5hbHlzZXMgYXJlIHByZXNlcnZlZCwKKy8vLyBvdGhlcndpc2Ugb25seSBhIHNob3J0IGxpc3Qgb2YgYW5hbHlzZXMgdGhhdCBoYXZlIGJlZW4gZXhwbGljaXRseSB1cGRhdGVkCisvLy8gYXJlIHByZXNlcnZlZC4KKy8vLworLy8vIFRoaXMgY2xhc3MgYWxzbyBsZXRzIHRyYW5zZm9ybWF0aW9uIHBhc3NlcyBtYXJrIGFic3RyYWN0ICpzZXRzKiBvZiBhbmFseXNlcworLy8vIGFzIHByZXNlcnZlZC4gQSB0cmFuc2Zvcm1hdGlvbiB0aGF0IChzYXkpIGRvZXMgbm90IGFsdGVyIHRoZSBDRkcgY2FuCisvLy8gaW5kaWNhdGUgc3VjaCBieSBtYXJraW5nIGEgcGFydGljdWxhciBBbmFseXNpc1NldEtleSBhcyBwcmVzZXJ2ZWQsIGFuZAorLy8vIHRoZW4gYW5hbHlzZXMgY2FuIHF1ZXJ5IHdoZXRoZXIgdGhhdCBBbmFseXNpc1NldEtleSBpcyBwcmVzZXJ2ZWQuCisvLy8KKy8vLyBGaW5hbGx5LCB0aGlzIGNsYXNzIGNhbiByZXByZXNlbnQgYW4gImFiYW5kb25lZCIgYW5hbHlzaXMsIHdoaWNoIGlzCisvLy8gbm90IHByZXNlcnZlZCBldmVuIGlmIGl0IHdvdWxkIGJlIGNvdmVyZWQgYnkgc29tZSBhYnN0cmFjdCBzZXQgb2YgYW5hbHlzZXMuCisvLy8KKy8vLyBHaXZlbiBhIGBQcmVzZXJ2ZWRBbmFseXNlc2Agb2JqZWN0LCBhbiBhbmFseXNpcyB3aWxsIHR5cGljYWxseSB3YW50IHRvCisvLy8gZmlndXJlIG91dCB3aGV0aGVyIGl0IGlzIHByZXNlcnZlZC4gSW4gdGhlIGV4YW1wbGUgYmVsb3csIE15QW5hbHlzaXNUeXBlIGlzCisvLy8gcHJlc2VydmVkIGlmIGl0J3Mgbm90IGFiYW5kb25lZCwgYW5kIChhKSBpdCdzIGV4cGxpY2l0bHkgbWFya2VkIGFzCisvLy8gcHJlc2VydmVkLCAoYiksIHRoZSBzZXQgQWxsQW5hbHlzZXNPbjxNeUlSVW5pdD4gaXMgcHJlc2VydmVkLCBvciAoYykgYm90aAorLy8vIEFuYWx5c2lzU2V0QSBhbmQgQW5hbHlzaXNTZXRCIGFyZSBwcmVzZXJ2ZWQuCisvLy8KKy8vLyBgYGAKKy8vLyAgIGF1dG8gUEFDID0gUEEuZ2V0Q2hlY2tlcjxNeUFuYWx5c2lzVHlwZT4oKTsKKy8vLyAgIGlmIChQQUMucHJlc2VydmVkKCkgfHwgUEFDLnByZXNlcnZlZFNldDxBbGxBbmFseXNlc09uPE15SVJVbml0Pj4oKSB8fAorLy8vICAgICAgIChQQUMucHJlc2VydmVkU2V0PEFuYWx5c2lzU2V0QT4oKSAmJgorLy8vICAgICAgICBQQUMucHJlc2VydmVkU2V0PEFuYWx5c2lzU2V0Qj4oKSkpIHsKKy8vLyAgICAgLy8gVGhlIGFuYWx5c2lzIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBwcmVzZXJ2ZWQgLi4uCisvLy8gICB9CisvLy8gYGBgCitjbGFzcyBQcmVzZXJ2ZWRBbmFseXNlcyB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ29udmVuaWVuY2UgZmFjdG9yeSBmdW5jdGlvbiBmb3IgdGhlIGVtcHR5IHByZXNlcnZlZCBzZXQuCisgIHN0YXRpYyBQcmVzZXJ2ZWRBbmFseXNlcyBub25lKCkgeyByZXR1cm4gUHJlc2VydmVkQW5hbHlzZXMoKTsgfQorCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgc3BlY2lhbCBwcmVzZXJ2ZWQgc2V0IHRoYXQgcHJlc2VydmVzIGFsbCBwYXNzZXMuCisgIHN0YXRpYyBQcmVzZXJ2ZWRBbmFseXNlcyBhbGwoKSB7CisgICAgUHJlc2VydmVkQW5hbHlzZXMgUEE7CisgICAgUEEuUHJlc2VydmVkSURzLmluc2VydCgmQWxsQW5hbHlzZXNLZXkpOworICAgIHJldHVybiBQQTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgcHJlc2VydmVkIGFuYWx5c2VzIG9iamVjdCB3aXRoIGEgc2luZ2xlIHByZXNlcnZlZCBzZXQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBbmFseXNpc1NldFQ+CisgIHN0YXRpYyBQcmVzZXJ2ZWRBbmFseXNlcyBhbGxJblNldCgpIHsKKyAgICBQcmVzZXJ2ZWRBbmFseXNlcyBQQTsKKyAgICBQQS5wcmVzZXJ2ZVNldDxBbmFseXNpc1NldFQ+KCk7CisgICAgcmV0dXJuIFBBOworICB9CisKKyAgLy8vIE1hcmsgYW4gYW5hbHlzaXMgYXMgcHJlc2VydmVkLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQW5hbHlzaXNUPiB2b2lkIHByZXNlcnZlKCkgeyBwcmVzZXJ2ZShBbmFseXNpc1Q6OklEKCkpOyB9CisKKyAgLy8vIFxicmllZiBHaXZlbiBhbiBhbmFseXNpcydzIElELCBtYXJrIHRoZSBhbmFseXNpcyBhcyBwcmVzZXJ2ZWQsIGFkZGluZyBpdAorICAvLy8gdG8gdGhlIHNldC4KKyAgdm9pZCBwcmVzZXJ2ZShBbmFseXNpc0tleSAqSUQpIHsKKyAgICAvLyBDbGVhciB0aGlzIElEIGZyb20gdGhlIGV4cGxpY2l0IG5vdC1wcmVzZXJ2ZWQgc2V0IGlmIHByZXNlbnQuCisgICAgTm90UHJlc2VydmVkQW5hbHlzaXNJRHMuZXJhc2UoSUQpOworCisgICAgLy8gSWYgd2UncmUgbm90IGFscmVhZHkgcHJlc2VydmluZyBhbGwgYW5hbHlzZXMgKG90aGVyIHRoYW4gdGhvc2UgaW4KKyAgICAvLyBOb3RQcmVzZXJ2ZWRBbmFseXNpc0lEcykuCisgICAgaWYgKCFhcmVBbGxQcmVzZXJ2ZWQoKSkKKyAgICAgIFByZXNlcnZlZElEcy5pbnNlcnQoSUQpOworICB9CisKKyAgLy8vIE1hcmsgYW4gYW5hbHlzaXMgc2V0IGFzIHByZXNlcnZlZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFuYWx5c2lzU2V0VD4gdm9pZCBwcmVzZXJ2ZVNldCgpIHsKKyAgICBwcmVzZXJ2ZVNldChBbmFseXNpc1NldFQ6OklEKCkpOworICB9CisKKyAgLy8vIE1hcmsgYW4gYW5hbHlzaXMgc2V0IGFzIHByZXNlcnZlZCB1c2luZyBpdHMgSUQuCisgIHZvaWQgcHJlc2VydmVTZXQoQW5hbHlzaXNTZXRLZXkgKklEKSB7CisgICAgLy8gSWYgd2UncmUgbm90IGFscmVhZHkgaW4gdGhlIHNhdHVyYXRlZCAnYWxsJyBzdGF0ZSwgYWRkIHRoaXMgc2V0LgorICAgIGlmICghYXJlQWxsUHJlc2VydmVkKCkpCisgICAgICBQcmVzZXJ2ZWRJRHMuaW5zZXJ0KElEKTsKKyAgfQorCisgIC8vLyBNYXJrIGFuIGFuYWx5c2lzIGFzIGFiYW5kb25lZC4KKyAgLy8vCisgIC8vLyBBbiBhYmFuZG9uZWQgYW5hbHlzaXMgaXMgbm90IHByZXNlcnZlZCwgZXZlbiBpZiBpdCBpcyBub21pbmFsbHkgY292ZXJlZAorICAvLy8gYnkgc29tZSBvdGhlciBzZXQgb3Igd2FzIHByZXZpb3VzbHkgZXhwbGljaXRseSBtYXJrZWQgYXMgcHJlc2VydmVkLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB5b3UgY2FuIG9ubHkgYWJhbmRvbiBhIHNwZWNpZmljIGFuYWx5c2lzLCBub3QgYSAqc2V0KiBvZgorICAvLy8gYW5hbHlzZXMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBbmFseXNpc1Q+IHZvaWQgYWJhbmRvbigpIHsgYWJhbmRvbihBbmFseXNpc1Q6OklEKCkpOyB9CisKKyAgLy8vIE1hcmsgYW4gYW5hbHlzaXMgYXMgYWJhbmRvbmVkIHVzaW5nIGl0cyBJRC4KKyAgLy8vCisgIC8vLyBBbiBhYmFuZG9uZWQgYW5hbHlzaXMgaXMgbm90IHByZXNlcnZlZCwgZXZlbiBpZiBpdCBpcyBub21pbmFsbHkgY292ZXJlZAorICAvLy8gYnkgc29tZSBvdGhlciBzZXQgb3Igd2FzIHByZXZpb3VzbHkgZXhwbGljaXRseSBtYXJrZWQgYXMgcHJlc2VydmVkLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB5b3UgY2FuIG9ubHkgYWJhbmRvbiBhIHNwZWNpZmljIGFuYWx5c2lzLCBub3QgYSAqc2V0KiBvZgorICAvLy8gYW5hbHlzZXMuCisgIHZvaWQgYWJhbmRvbihBbmFseXNpc0tleSAqSUQpIHsKKyAgICBQcmVzZXJ2ZWRJRHMuZXJhc2UoSUQpOworICAgIE5vdFByZXNlcnZlZEFuYWx5c2lzSURzLmluc2VydChJRCk7CisgIH0KKworICAvLy8gXGJyaWVmIEludGVyc2VjdCB0aGlzIHNldCB3aXRoIGFub3RoZXIgaW4gcGxhY2UuCisgIC8vLworICAvLy8gVGhpcyBpcyBhIG11dGF0aW5nIG9wZXJhdGlvbiBvbiB0aGlzIHByZXNlcnZlZCBzZXQsIHJlbW92aW5nIGFsbAorICAvLy8gcHJlc2VydmVkIHBhc3NlcyB3aGljaCBhcmUgbm90IGFsc28gcHJlc2VydmVkIGluIHRoZSBhcmd1bWVudC4KKyAgdm9pZCBpbnRlcnNlY3QoY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJkFyZykgeworICAgIGlmIChBcmcuYXJlQWxsUHJlc2VydmVkKCkpCisgICAgICByZXR1cm47CisgICAgaWYgKGFyZUFsbFByZXNlcnZlZCgpKSB7CisgICAgICAqdGhpcyA9IEFyZzsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gVGhlIGludGVyc2VjdGlvbiByZXF1aXJlcyB0aGUgKnVuaW9uKiBvZiB0aGUgZXhwbGljaXRseSBub3QtcHJlc2VydmVkCisgICAgLy8gSURzIGFuZCB0aGUgKmludGVyc2VjdGlvbiogb2YgdGhlIHByZXNlcnZlZCBJRHMuCisgICAgZm9yIChhdXRvIElEIDogQXJnLk5vdFByZXNlcnZlZEFuYWx5c2lzSURzKSB7CisgICAgICBQcmVzZXJ2ZWRJRHMuZXJhc2UoSUQpOworICAgICAgTm90UHJlc2VydmVkQW5hbHlzaXNJRHMuaW5zZXJ0KElEKTsKKyAgICB9CisgICAgZm9yIChhdXRvIElEIDogUHJlc2VydmVkSURzKQorICAgICAgaWYgKCFBcmcuUHJlc2VydmVkSURzLmNvdW50KElEKSkKKyAgICAgICAgUHJlc2VydmVkSURzLmVyYXNlKElEKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSW50ZXJzZWN0IHRoaXMgc2V0IHdpdGggYSB0ZW1wb3Jhcnkgb3RoZXIgc2V0IGluIHBsYWNlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYSBtdXRhdGluZyBvcGVyYXRpb24gb24gdGhpcyBwcmVzZXJ2ZWQgc2V0LCByZW1vdmluZyBhbGwKKyAgLy8vIHByZXNlcnZlZCBwYXNzZXMgd2hpY2ggYXJlIG5vdCBhbHNvIHByZXNlcnZlZCBpbiB0aGUgYXJndW1lbnQuCisgIHZvaWQgaW50ZXJzZWN0KFByZXNlcnZlZEFuYWx5c2VzICYmQXJnKSB7CisgICAgaWYgKEFyZy5hcmVBbGxQcmVzZXJ2ZWQoKSkKKyAgICAgIHJldHVybjsKKyAgICBpZiAoYXJlQWxsUHJlc2VydmVkKCkpIHsKKyAgICAgICp0aGlzID0gc3RkOjptb3ZlKEFyZyk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFRoZSBpbnRlcnNlY3Rpb24gcmVxdWlyZXMgdGhlICp1bmlvbiogb2YgdGhlIGV4cGxpY2l0bHkgbm90LXByZXNlcnZlZAorICAgIC8vIElEcyBhbmQgdGhlICppbnRlcnNlY3Rpb24qIG9mIHRoZSBwcmVzZXJ2ZWQgSURzLgorICAgIGZvciAoYXV0byBJRCA6IEFyZy5Ob3RQcmVzZXJ2ZWRBbmFseXNpc0lEcykgeworICAgICAgUHJlc2VydmVkSURzLmVyYXNlKElEKTsKKyAgICAgIE5vdFByZXNlcnZlZEFuYWx5c2lzSURzLmluc2VydChJRCk7CisgICAgfQorICAgIGZvciAoYXV0byBJRCA6IFByZXNlcnZlZElEcykKKyAgICAgIGlmICghQXJnLlByZXNlcnZlZElEcy5jb3VudChJRCkpCisgICAgICAgIFByZXNlcnZlZElEcy5lcmFzZShJRCk7CisgIH0KKworICAvLy8gQSBjaGVja2VyIG9iamVjdCB0aGF0IG1ha2VzIGl0IGVhc3kgdG8gcXVlcnkgZm9yIHdoZXRoZXIgYW4gYW5hbHlzaXMgb3IKKyAgLy8vIHNvbWUgc2V0IGNvdmVyaW5nIGl0IGlzIHByZXNlcnZlZC4KKyAgY2xhc3MgUHJlc2VydmVkQW5hbHlzaXNDaGVja2VyIHsKKyAgICBmcmllbmQgY2xhc3MgUHJlc2VydmVkQW5hbHlzZXM7CisKKyAgICBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmUEE7CisgICAgQW5hbHlzaXNLZXkgKmNvbnN0IElEOworICAgIGNvbnN0IGJvb2wgSXNBYmFuZG9uZWQ7CisKKyAgICAvLy8gQSBQcmVzZXJ2ZWRBbmFseXNpc0NoZWNrZXIgaXMgdGllZCB0byBhIHBhcnRpY3VsYXIgQW5hbHlzaXMgYmVjYXVzZQorICAgIC8vLyBgcHJlc2VydmVkKClgIGFuZCBgcHJlc2VydmVkU2V0KClgIGJvdGggcmV0dXJuIGZhbHNlIGlmIHRoZSBBbmFseXNpcworICAgIC8vLyB3YXMgYWJhbmRvbmVkLgorICAgIFByZXNlcnZlZEFuYWx5c2lzQ2hlY2tlcihjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmUEEsIEFuYWx5c2lzS2V5ICpJRCkKKyAgICAgICAgOiBQQShQQSksIElEKElEKSwgSXNBYmFuZG9uZWQoUEEuTm90UHJlc2VydmVkQW5hbHlzaXNJRHMuY291bnQoSUQpKSB7fQorCisgIHB1YmxpYzoKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjaGVja2VyJ3MgYW5hbHlzaXMgd2FzIG5vdCBhYmFuZG9uZWQgYW5kIGVpdGhlcgorICAgIC8vLyAgLSB0aGUgYW5hbHlzaXMgaXMgZXhwbGljaXRseSBwcmVzZXJ2ZWQgb3IKKyAgICAvLy8gIC0gYWxsIGFuYWx5c2VzIGFyZSBwcmVzZXJ2ZWQuCisgICAgYm9vbCBwcmVzZXJ2ZWQoKSB7CisgICAgICByZXR1cm4gIUlzQWJhbmRvbmVkICYmIChQQS5QcmVzZXJ2ZWRJRHMuY291bnQoJkFsbEFuYWx5c2VzS2V5KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEEuUHJlc2VydmVkSURzLmNvdW50KElEKSk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2hlY2tlcidzIGFuYWx5c2lzIHdhcyBub3QgYWJhbmRvbmVkIGFuZCBlaXRoZXIKKyAgICAvLy8gIC0gXHAgQW5hbHlzaXNTZXRUIGlzIGV4cGxpY2l0bHkgcHJlc2VydmVkIG9yCisgICAgLy8vICAtIGFsbCBhbmFseXNlcyBhcmUgcHJlc2VydmVkLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBBbmFseXNpc1NldFQ+IGJvb2wgcHJlc2VydmVkU2V0KCkgeworICAgICAgQW5hbHlzaXNTZXRLZXkgKlNldElEID0gQW5hbHlzaXNTZXRUOjpJRCgpOworICAgICAgcmV0dXJuICFJc0FiYW5kb25lZCAmJiAoUEEuUHJlc2VydmVkSURzLmNvdW50KCZBbGxBbmFseXNlc0tleSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBLlByZXNlcnZlZElEcy5jb3VudChTZXRJRCkpOworICAgIH0KKyAgfTsKKworICAvLy8gQnVpbGQgYSBjaGVja2VyIGZvciB0aGlzIGBQcmVzZXJ2ZWRBbmFseXNlc2AgYW5kIHRoZSBzcGVjaWZpZWQgYW5hbHlzaXMKKyAgLy8vIHR5cGUuCisgIC8vLworICAvLy8gWW91IGNhbiB1c2UgdGhlIHJldHVybmVkIG9iamVjdCB0byBxdWVyeSB3aGV0aGVyIGFuIGFuYWx5c2lzIHdhcworICAvLy8gcHJlc2VydmVkLiBTZWUgdGhlIGV4YW1wbGUgaW4gdGhlIGNvbW1lbnQgb24gYFByZXNlcnZlZEFuYWx5c2lzYC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFuYWx5c2lzVD4gUHJlc2VydmVkQW5hbHlzaXNDaGVja2VyIGdldENoZWNrZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFByZXNlcnZlZEFuYWx5c2lzQ2hlY2tlcigqdGhpcywgQW5hbHlzaXNUOjpJRCgpKTsKKyAgfQorCisgIC8vLyBCdWlsZCBhIGNoZWNrZXIgZm9yIHRoaXMgYFByZXNlcnZlZEFuYWx5c2VzYCBhbmQgdGhlIHNwZWNpZmllZCBhbmFseXNpcworICAvLy8gSUQuCisgIC8vLworICAvLy8gWW91IGNhbiB1c2UgdGhlIHJldHVybmVkIG9iamVjdCB0byBxdWVyeSB3aGV0aGVyIGFuIGFuYWx5c2lzIHdhcworICAvLy8gcHJlc2VydmVkLiBTZWUgdGhlIGV4YW1wbGUgaW4gdGhlIGNvbW1lbnQgb24gYFByZXNlcnZlZEFuYWx5c2lzYC4KKyAgUHJlc2VydmVkQW5hbHlzaXNDaGVja2VyIGdldENoZWNrZXIoQW5hbHlzaXNLZXkgKklEKSBjb25zdCB7CisgICAgcmV0dXJuIFByZXNlcnZlZEFuYWx5c2lzQ2hlY2tlcigqdGhpcywgSUQpOworICB9CisKKyAgLy8vIFRlc3Qgd2hldGhlciBhbGwgYW5hbHlzZXMgYXJlIHByZXNlcnZlZCAoYW5kIG5vbmUgYXJlIGFiYW5kb25lZCkuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHByaW1hcmlseSB0byBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIGEgdHJhbnNmb3JtYXRpb24KKyAgLy8vIHdoaWNoIG1ha2VzIG5vIGNoYW5nZXMgdG8gdGhlIElSLgorICBib29sIGFyZUFsbFByZXNlcnZlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTm90UHJlc2VydmVkQW5hbHlzaXNJRHMuZW1wdHkoKSAmJgorICAgICAgICAgICBQcmVzZXJ2ZWRJRHMuY291bnQoJkFsbEFuYWx5c2VzS2V5KTsKKyAgfQorCisgIC8vLyBEaXJlY3RseSB0ZXN0IHdoZXRoZXIgYSBzZXQgb2YgYW5hbHlzZXMgaXMgcHJlc2VydmVkLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgb25seSB0cnVlIHdoZW4gbm8gYW5hbHlzZXMgaGF2ZSBiZWVuIGV4cGxpY2l0bHkgYWJhbmRvbmVkLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQW5hbHlzaXNTZXRUPiBib29sIGFsbEFuYWx5c2VzSW5TZXRQcmVzZXJ2ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGFsbEFuYWx5c2VzSW5TZXRQcmVzZXJ2ZWQoQW5hbHlzaXNTZXRUOjpJRCgpKTsKKyAgfQorCisgIC8vLyBEaXJlY3RseSB0ZXN0IHdoZXRoZXIgYSBzZXQgb2YgYW5hbHlzZXMgaXMgcHJlc2VydmVkLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgb25seSB0cnVlIHdoZW4gbm8gYW5hbHlzZXMgaGF2ZSBiZWVuIGV4cGxpY2l0bHkgYWJhbmRvbmVkLgorICBib29sIGFsbEFuYWx5c2VzSW5TZXRQcmVzZXJ2ZWQoQW5hbHlzaXNTZXRLZXkgKlNldElEKSBjb25zdCB7CisgICAgcmV0dXJuIE5vdFByZXNlcnZlZEFuYWx5c2lzSURzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgKFByZXNlcnZlZElEcy5jb3VudCgmQWxsQW5hbHlzZXNLZXkpIHx8IFByZXNlcnZlZElEcy5jb3VudChTZXRJRCkpOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBBIHNwZWNpYWwga2V5IHVzZWQgdG8gaW5kaWNhdGUgYWxsIGFuYWx5c2VzLgorICBzdGF0aWMgQW5hbHlzaXNTZXRLZXkgQWxsQW5hbHlzZXNLZXk7CisKKyAgLy8vIFRoZSBJRHMgb2YgYW5hbHlzZXMgYW5kIGFuYWx5c2lzIHNldHMgdGhhdCBhcmUgcHJlc2VydmVkLgorICBTbWFsbFB0clNldDx2b2lkICosIDI+IFByZXNlcnZlZElEczsKKworICAvLy8gVGhlIElEcyBvZiBleHBsaWNpdGx5IG5vdC1wcmVzZXJ2ZWQgYW5hbHlzZXMuCisgIC8vLworICAvLy8gSWYgYW4gYW5hbHlzaXMgaW4gdGhpcyBzZXQgaXMgY292ZXJlZCBieSBhIHNldCBpbiBgUHJlc2VydmVkSURzYCwgd2UKKyAgLy8vIGNvbnNpZGVyIGl0IG5vdC1wcmVzZXJ2ZWQuIFRoYXQgaXMsIGBOb3RQcmVzZXJ2ZWRBbmFseXNpc0lEc2AgYWx3YXlzCisgIC8vLyAid2lucyIgb3ZlciBhbmFseXNpcyBzZXRzIGluIGBQcmVzZXJ2ZWRJRHNgLgorICAvLy8KKyAgLy8vIEFsc28sIGEgZ2l2ZW4gSUQgc2hvdWxkIG5ldmVyIG9jY3VyIGJvdGggaGVyZSBhbmQgaW4gYFByZXNlcnZlZElEc2AuCisgIFNtYWxsUHRyU2V0PEFuYWx5c2lzS2V5ICosIDI+IE5vdFByZXNlcnZlZEFuYWx5c2lzSURzOworfTsKKworLy8gRm9yd2FyZCBkZWNsYXJlIHRoZSBhbmFseXNpcyBtYW5hZ2VyIHRlbXBsYXRlLgordGVtcGxhdGUgPHR5cGVuYW1lIElSVW5pdFQsIHR5cGVuYW1lLi4uIEV4dHJhQXJnVHM+IGNsYXNzIEFuYWx5c2lzTWFuYWdlcjsKKworLy8vIEEgQ1JUUCBtaXgtaW4gdG8gYXV0b21hdGljYWxseSBwcm92aWRlIGluZm9ybWF0aW9uYWwgQVBJcyBuZWVkZWQgZm9yCisvLy8gcGFzc2VzLgorLy8vCisvLy8gVGhpcyBwcm92aWRlcyBzb21lIGJvaWxlcnBsYXRlIGZvciB0eXBlcyB0aGF0IGFyZSBwYXNzZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZFQ+IHN0cnVjdCBQYXNzSW5mb01peGluIHsKKyAgLy8vIEdldHMgdGhlIG5hbWUgb2YgdGhlIHBhc3Mgd2UgYXJlIG1peGVkIGludG8uCisgIHN0YXRpYyBTdHJpbmdSZWYgbmFtZSgpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfYmFzZV9vZjxQYXNzSW5mb01peGluLCBEZXJpdmVkVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIk11c3QgcGFzcyB0aGUgZGVyaXZlZCB0eXBlIGFzIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCEiKTsKKyAgICBTdHJpbmdSZWYgTmFtZSA9IGdldFR5cGVOYW1lPERlcml2ZWRUPigpOworICAgIGlmIChOYW1lLnN0YXJ0c3dpdGgoImxsdm06OiIpKQorICAgICAgTmFtZSA9IE5hbWUuZHJvcF9mcm9udChzdHJsZW4oImxsdm06OiIpKTsKKyAgICByZXR1cm4gTmFtZTsKKyAgfQorfTsKKworLy8vIEEgQ1JUUCBtaXgtaW4gdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbmFsIEFQSXMgbmVlZGVkIGZvciBhbmFseXNpcyBwYXNzZXMuCisvLy8KKy8vLyBUaGlzIHByb3ZpZGVzIHNvbWUgYm9pbGVycGxhdGUgZm9yIHR5cGVzIHRoYXQgYXJlIGFuYWx5c2lzIHBhc3Nlcy4gSXQKKy8vLyBhdXRvbWF0aWNhbGx5IG1peGVzIGluIFxjIFBhc3NJbmZvTWl4aW4uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZFQ+CitzdHJ1Y3QgQW5hbHlzaXNJbmZvTWl4aW4gOiBQYXNzSW5mb01peGluPERlcml2ZWRUPiB7CisgIC8vLyBSZXR1cm5zIGFuIG9wYXF1ZSwgdW5pcXVlIElEIGZvciB0aGlzIGFuYWx5c2lzIHR5cGUuCisgIC8vLworICAvLy8gVGhpcyBJRCBpcyBhIHBvaW50ZXIgdHlwZSB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgOC1ieXRlIGFsaWduZWQgYW5kIHRodXMKKyAgLy8vIHN1aXRhYmxlIGZvciB1c2UgaW4gc2V0cywgbWFwcywgYW5kIG90aGVyIGRhdGEgc3RydWN0dXJlcyB0aGF0IHVzZSB0aGUgbG93CisgIC8vLyBiaXRzIG9mIHBvaW50ZXJzLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIHRoZSBkZXJpdmVkIHR5cGUgcHJvdmlkZSBhIHN0YXRpYyBcYyBBbmFseXNpc0tleQorICAvLy8gbWVtYmVyIGNhbGxlZCBcYyBLZXkuCisgIC8vLworICAvLy8gRklYTUU6IFRoZSBvbmx5IHJlYXNvbiB0aGUgbWl4aW4gdHlwZSBpdHNlbGYgY2FuJ3QgZGVjbGFyZSB0aGUgS2V5IHZhbHVlCisgIC8vLyBpcyB0aGF0IHNvbWUgY29tcGlsZXJzIGNhbm5vdCBjb3JyZWN0bHkgdW5pcXVlIGEgdGVtcGxhdGVkIHN0YXRpYyB2YXJpYWJsZQorICAvLy8gc28gaXQgaGFzIHRoZSBzYW1lIGFkZHJlc3NlcyBpbiBlYWNoIGluc3RhbnRpYXRpb24uIFRoZSBvbmx5IGN1cnJlbnRseQorICAvLy8ga25vd24gcGxhdGZvcm0gd2l0aCB0aGlzIGxpbWl0YXRpb24gaXMgV2luZG93cyBETEwgYnVpbGRzLCBzcGVjaWZpY2FsbHkKKyAgLy8vIGJ1aWxkaW5nIGVhY2ggcGFydCBvZiBMTFZNIGFzIGEgRExMLiBJZiB3ZSBldmVyIHJlbW92ZSB0aGF0IGJ1aWxkCisgIC8vLyBjb25maWd1cmF0aW9uLCB0aGlzIG1peGluIGNhbiBwcm92aWRlIHRoZSBzdGF0aWMga2V5IGFzIHdlbGwuCisgIHN0YXRpYyBBbmFseXNpc0tleSAqSUQoKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Jhc2Vfb2Y8QW5hbHlzaXNJbmZvTWl4aW4sIERlcml2ZWRUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiTXVzdCBwYXNzIHRoZSBkZXJpdmVkIHR5cGUgYXMgdGhlIHRlbXBsYXRlIGFyZ3VtZW50ISIpOworICAgIHJldHVybiAmRGVyaXZlZFQ6OktleTsKKyAgfQorfTsKKworLy8vIFxicmllZiBNYW5hZ2VzIGEgc2VxdWVuY2Ugb2YgcGFzc2VzIG92ZXIgYSBwYXJ0aWN1bGFyIHVuaXQgb2YgSVIuCisvLy8KKy8vLyBBIHBhc3MgbWFuYWdlciBjb250YWlucyBhIHNlcXVlbmNlIG9mIHBhc3NlcyB0byBydW4gb3ZlciBhIHBhcnRpY3VsYXIgdW5pdAorLy8vIG9mIElSIChlLmcuIEZ1bmN0aW9ucywgTW9kdWxlcykuIEl0IGlzIGl0c2VsZiBhIHZhbGlkIHBhc3Mgb3ZlciB0aGF0IHVuaXQgb2YKKy8vLyBJUiwgYW5kIHdoZW4gcnVuIG92ZXIgc29tZSBnaXZlbiBJUiB3aWxsIHJ1biBlYWNoIG9mIGl0cyBjb250YWluZWQgcGFzc2VzIGluCisvLy8gc2VxdWVuY2UuIFBhc3MgbWFuYWdlcnMgYXJlIHRoZSBwcmltYXJ5IGFuZCBtb3N0IGJhc2ljIGJ1aWxkaW5nIGJsb2NrIG9mIGEKKy8vLyBwYXNzIHBpcGVsaW5lLgorLy8vCisvLy8gV2hlbiB5b3UgcnVuIGEgcGFzcyBtYW5hZ2VyLCB5b3UgcHJvdmlkZSBhbiBcYyBBbmFseXNpc01hbmFnZXI8SVJVbml0VD4KKy8vLyBhcmd1bWVudC4gVGhlIHBhc3MgbWFuYWdlciB3aWxsIHByb3BhZ2F0ZSB0aGF0IGFuYWx5c2lzIG1hbmFnZXIgdG8gZWFjaAorLy8vIHBhc3MgaXQgcnVucywgYW5kIHdpbGwgY2FsbCB0aGUgYW5hbHlzaXMgbWFuYWdlcidzIGludmFsaWRhdGlvbiByb3V0aW5lIHdpdGgKKy8vLyB0aGUgUHJlc2VydmVkQW5hbHlzZXMgb2YgZWFjaCBwYXNzIGl0IHJ1bnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSVJVbml0VCwKKyAgICAgICAgICB0eXBlbmFtZSBBbmFseXNpc01hbmFnZXJUID0gQW5hbHlzaXNNYW5hZ2VyPElSVW5pdFQ+LAorICAgICAgICAgIHR5cGVuYW1lLi4uIEV4dHJhQXJnVHM+CitjbGFzcyBQYXNzTWFuYWdlciA6IHB1YmxpYyBQYXNzSW5mb01peGluPAorICAgICAgICAgICAgICAgICAgICAgICAgUGFzc01hbmFnZXI8SVJVbml0VCwgQW5hbHlzaXNNYW5hZ2VyVCwgRXh0cmFBcmdUcy4uLj4+IHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBwYXNzIG1hbmFnZXIuCisgIC8vLworICAvLy8gSWYgXHAgRGVidWdMb2dnaW5nIGlzIHRydWUsIHdlJ2xsIGxvZyBvdXIgcHJvZ3Jlc3MgdG8gbGx2bTo6ZGJncygpLgorICBleHBsaWNpdCBQYXNzTWFuYWdlcihib29sIERlYnVnTG9nZ2luZyA9IGZhbHNlKSA6IERlYnVnTG9nZ2luZyhEZWJ1Z0xvZ2dpbmcpIHt9CisKKyAgLy8gRklYTUU6IFRoZXNlIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBkZWZhdWx0IG1vdmUgY29uc3RydWN0b3IvbW92ZQorICAvLyBhc3NpZ25tZW50LiBIb3dldmVyLCB1c2luZyA9IGRlZmF1bHQgdHJpZ2dlcnMgbGlua2VyIGVycm9ycyBkdWUgdG8gdGhlCisgIC8vIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGJlbG93LiBGaW5kIGF3YXkgdG8gdXNlIHRoZSBkZWZhdWx0IGFuZCByZW1vdmUgdGhlCisgIC8vIGR1cGxpY2F0ZWQgY29kZSBoZXJlLgorICBQYXNzTWFuYWdlcihQYXNzTWFuYWdlciAmJkFyZykKKyAgICAgIDogUGFzc2VzKHN0ZDo6bW92ZShBcmcuUGFzc2VzKSksCisgICAgICAgIERlYnVnTG9nZ2luZyhzdGQ6Om1vdmUoQXJnLkRlYnVnTG9nZ2luZykpIHt9CisKKyAgUGFzc01hbmFnZXIgJm9wZXJhdG9yPShQYXNzTWFuYWdlciAmJlJIUykgeworICAgIFBhc3NlcyA9IHN0ZDo6bW92ZShSSFMuUGFzc2VzKTsKKyAgICBEZWJ1Z0xvZ2dpbmcgPSBzdGQ6Om1vdmUoUkhTLkRlYnVnTG9nZ2luZyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBSdW4gYWxsIG9mIHRoZSBwYXNzZXMgaW4gdGhpcyBtYW5hZ2VyIG92ZXIgdGhlIGdpdmVuIHVuaXQgb2YgSVIuCisgIC8vLyBFeHRyYUFyZ3MgYXJlIHBhc3NlZCB0byBlYWNoIHBhc3MuCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihJUlVuaXRUICZJUiwgQW5hbHlzaXNNYW5hZ2VyVCAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYUFyZ1RzLi4uIEV4dHJhQXJncykgeworICAgIFByZXNlcnZlZEFuYWx5c2VzIFBBID0gUHJlc2VydmVkQW5hbHlzZXM6OmFsbCgpOworCisgICAgaWYgKERlYnVnTG9nZ2luZykKKyAgICAgIGRiZ3MoKSA8PCAiU3RhcnRpbmcgIiA8PCBnZXRUeXBlTmFtZTxJUlVuaXRUPigpIDw8ICIgcGFzcyBtYW5hZ2VyIHJ1bi5cbiI7CisKKyAgICBmb3IgKHVuc2lnbmVkIElkeCA9IDAsIFNpemUgPSBQYXNzZXMuc2l6ZSgpOyBJZHggIT0gU2l6ZTsgKytJZHgpIHsKKyAgICAgIGlmIChEZWJ1Z0xvZ2dpbmcpCisgICAgICAgIGRiZ3MoKSA8PCAiUnVubmluZyBwYXNzOiAiIDw8IFBhc3Nlc1tJZHhdLT5uYW1lKCkgPDwgIiBvbiAiCisgICAgICAgICAgICAgICA8PCBJUi5nZXROYW1lKCkgPDwgIlxuIjsKKworICAgICAgUHJlc2VydmVkQW5hbHlzZXMgUGFzc1BBID0gUGFzc2VzW0lkeF0tPnJ1bihJUiwgQU0sIEV4dHJhQXJncy4uLik7CisKKyAgICAgIC8vIFVwZGF0ZSB0aGUgYW5hbHlzaXMgbWFuYWdlciBhcyBlYWNoIHBhc3MgcnVucyBhbmQgcG90ZW50aWFsbHkKKyAgICAgIC8vIGludmFsaWRhdGVzIGFuYWx5c2VzLgorICAgICAgQU0uaW52YWxpZGF0ZShJUiwgUGFzc1BBKTsKKworICAgICAgLy8gRmluYWxseSwgaW50ZXJzZWN0IHRoZSBwcmVzZXJ2ZWQgYW5hbHlzZXMgdG8gY29tcHV0ZSB0aGUgYWdncmVnYXRlCisgICAgICAvLyBwcmVzZXJ2ZWQgc2V0IGZvciB0aGlzIHBhc3MgbWFuYWdlci4KKyAgICAgIFBBLmludGVyc2VjdChzdGQ6Om1vdmUoUGFzc1BBKSk7CisKKyAgICAgIC8vIEZJWE1FOiBIaXN0b3JpY2FsbHksIHRoZSBwYXNzIG1hbmFnZXJzIGFsbCBjYWxsZWQgdGhlIExMVk0gY29udGV4dCdzCisgICAgICAvLyB5aWVsZCBmdW5jdGlvbiBoZXJlLiBXZSBkb24ndCBoYXZlIGEgZ2VuZXJpYyB3YXkgdG8gYWNxdWlyZSB0aGUKKyAgICAgIC8vIGNvbnRleHQgYW5kIGl0IGlzbid0IHlldCBjbGVhciB3aGF0IHRoZSByaWdodCBwYXR0ZXJuIGlzIGZvciB5aWVsZGluZworICAgICAgLy8gaW4gdGhlIG5ldyBwYXNzIG1hbmFnZXIgc28gaXQgaXMgY3VycmVudGx5IG9taXR0ZWQuCisgICAgICAvL0lSLmdldENvbnRleHQoKS55aWVsZCgpOworICAgIH0KKworICAgIC8vIEludmFsaWRhdGlvbiB3YXMgaGFuZGxlZCBhZnRlciBlYWNoIHBhc3MgaW4gdGhlIGFib3ZlIGxvb3AgZm9yIHRoZQorICAgIC8vIGN1cnJlbnQgdW5pdCBvZiBJUi4gVGhlcmVmb3JlLCB0aGUgcmVtYWluaW5nIGFuYWx5c2lzIHJlc3VsdHMgaW4gdGhlCisgICAgLy8gQW5hbHlzaXNNYW5hZ2VyIGFyZSBwcmVzZXJ2ZWQuIFdlIG1hcmsgdGhpcyB3aXRoIGEgc2V0IHNvIHRoYXQgd2UgZG9uJ3QKKyAgICAvLyBuZWVkIHRvIGluc3BlY3QgZWFjaCBvbmUgaW5kaXZpZHVhbGx5LgorICAgIFBBLnByZXNlcnZlU2V0PEFsbEFuYWx5c2VzT248SVJVbml0VD4+KCk7CisKKyAgICBpZiAoRGVidWdMb2dnaW5nKQorICAgICAgZGJncygpIDw8ICJGaW5pc2hlZCAiIDw8IGdldFR5cGVOYW1lPElSVW5pdFQ+KCkgPDwgIiBwYXNzIG1hbmFnZXIgcnVuLlxuIjsKKworICAgIHJldHVybiBQQTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYXNzVD4gdm9pZCBhZGRQYXNzKFBhc3NUIFBhc3MpIHsKKyAgICB1c2luZyBQYXNzTW9kZWxUID0KKyAgICAgICAgZGV0YWlsOjpQYXNzTW9kZWw8SVJVbml0VCwgUGFzc1QsIFByZXNlcnZlZEFuYWx5c2VzLCBBbmFseXNpc01hbmFnZXJULAorICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYUFyZ1RzLi4uPjsKKworICAgIFBhc3Nlcy5lbXBsYWNlX2JhY2sobmV3IFBhc3NNb2RlbFQoc3RkOjptb3ZlKFBhc3MpKSk7CisgIH0KKworcHJpdmF0ZToKKyAgdXNpbmcgUGFzc0NvbmNlcHRUID0KKyAgICAgIGRldGFpbDo6UGFzc0NvbmNlcHQ8SVJVbml0VCwgQW5hbHlzaXNNYW5hZ2VyVCwgRXh0cmFBcmdUcy4uLj47CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFBhc3NDb25jZXB0VD4+IFBhc3NlczsKKworICAvLy8gXGJyaWVmIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHdlIHNob3VsZCBkbyBkZWJ1ZyBsb2dnaW5nLgorICBib29sIERlYnVnTG9nZ2luZzsKK307CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBQYXNzTWFuYWdlcjxNb2R1bGU+OworCisvLy8gXGJyaWVmIENvbnZlbmllbmNlIHR5cGVkZWYgZm9yIGEgcGFzcyBtYW5hZ2VyIG92ZXIgbW9kdWxlcy4KK3VzaW5nIE1vZHVsZVBhc3NNYW5hZ2VyID0gUGFzc01hbmFnZXI8TW9kdWxlPjsKKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFBhc3NNYW5hZ2VyPEZ1bmN0aW9uPjsKKworLy8vIFxicmllZiBDb252ZW5pZW5jZSB0eXBlZGVmIGZvciBhIHBhc3MgbWFuYWdlciBvdmVyIGZ1bmN0aW9ucy4KK3VzaW5nIEZ1bmN0aW9uUGFzc01hbmFnZXIgPSBQYXNzTWFuYWdlcjxGdW5jdGlvbj47CisKKy8vLyBcYnJpZWYgQSBjb250YWluZXIgZm9yIGFuYWx5c2VzIHRoYXQgbGF6aWx5IHJ1bnMgdGhlbSBhbmQgY2FjaGVzIHRoZWlyCisvLy8gcmVzdWx0cy4KKy8vLworLy8vIFRoaXMgY2xhc3MgY2FuIG1hbmFnZSBhbmFseXNlcyBmb3IgYW55IElSIHVuaXQgd2hlcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIElSCisvLy8gdW5pdCBzdWZmaWNpZXMgYXMgaXRzIGlkZW50aXR5LgordGVtcGxhdGUgPHR5cGVuYW1lIElSVW5pdFQsIHR5cGVuYW1lLi4uIEV4dHJhQXJnVHM+IGNsYXNzIEFuYWx5c2lzTWFuYWdlciB7CitwdWJsaWM6CisgIGNsYXNzIEludmFsaWRhdG9yOworCitwcml2YXRlOgorICAvLyBOb3cgdGhhdCB3ZSd2ZSBkZWZpbmVkIG91ciBpbnZhbGlkYXRvciwgd2UgY2FuIGRlZmluZSB0aGUgY29uY2VwdCB0eXBlcy4KKyAgdXNpbmcgUmVzdWx0Q29uY2VwdFQgPQorICAgICAgZGV0YWlsOjpBbmFseXNpc1Jlc3VsdENvbmNlcHQ8SVJVbml0VCwgUHJlc2VydmVkQW5hbHlzZXMsIEludmFsaWRhdG9yPjsKKyAgdXNpbmcgUGFzc0NvbmNlcHRUID0KKyAgICAgIGRldGFpbDo6QW5hbHlzaXNQYXNzQ29uY2VwdDxJUlVuaXRULCBQcmVzZXJ2ZWRBbmFseXNlcywgSW52YWxpZGF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFBcmdUcy4uLj47CisKKyAgLy8vIFxicmllZiBMaXN0IG9mIGFuYWx5c2lzIHBhc3MgSURzIGFuZCBhc3NvY2lhdGVkIGNvbmNlcHQgcG9pbnRlcnMuCisgIC8vLworICAvLy8gUmVxdWlyZXMgaXRlcmF0b3JzIHRvIGJlIHZhbGlkIGFjcm9zcyBhcHBlbmRpbmcgbmV3IGVudHJpZXMgYW5kIGFyYml0cmFyeQorICAvLy8gZXJhc2VzLiBQcm92aWRlcyB0aGUgYW5hbHlzaXMgSUQgdG8gZW5hYmxlIGZpbmRpbmcgaXRlcmF0b3JzIHRvIGEgZ2l2ZW4KKyAgLy8vIGVudHJ5IGluIG1hcHMgYmVsb3csIGFuZCBwcm92aWRlcyB0aGUgc3RvcmFnZSBmb3IgdGhlIGFjdHVhbCByZXN1bHQKKyAgLy8vIGNvbmNlcHQuCisgIHVzaW5nIEFuYWx5c2lzUmVzdWx0TGlzdFQgPQorICAgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxBbmFseXNpc0tleSAqLCBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0Q29uY2VwdFQ+Pj47CisKKyAgLy8vIFxicmllZiBNYXAgdHlwZSBmcm9tIElSVW5pdFQgcG9pbnRlciB0byBvdXIgY3VzdG9tIGxpc3QgdHlwZS4KKyAgdXNpbmcgQW5hbHlzaXNSZXN1bHRMaXN0TWFwVCA9IERlbnNlTWFwPElSVW5pdFQgKiwgQW5hbHlzaXNSZXN1bHRMaXN0VD47CisKKyAgLy8vIFxicmllZiBNYXAgdHlwZSBmcm9tIGEgcGFpciBvZiBhbmFseXNpcyBJRCBhbmQgSVJVbml0VCBwb2ludGVyIHRvIGFuCisgIC8vLyBpdGVyYXRvciBpbnRvIGEgcGFydGljdWxhciByZXN1bHQgbGlzdCAod2hpY2ggaXMgd2hlcmUgdGhlIGFjdHVhbCBhbmFseXNpcworICAvLy8gcmVzdWx0IGlzIHN0b3JlZCkuCisgIHVzaW5nIEFuYWx5c2lzUmVzdWx0TWFwVCA9CisgICAgICBEZW5zZU1hcDxzdGQ6OnBhaXI8QW5hbHlzaXNLZXkgKiwgSVJVbml0VCAqPiwKKyAgICAgICAgICAgICAgIHR5cGVuYW1lIEFuYWx5c2lzUmVzdWx0TGlzdFQ6Oml0ZXJhdG9yPjsKKworcHVibGljOgorICAvLy8gQVBJIHRvIGNvbW11bmljYXRlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGFuYWx5c2VzIGR1cmluZyBpbnZhbGlkYXRpb24uCisgIC8vLworICAvLy8gV2hlbiBhbiBhbmFseXNpcyByZXN1bHQgZW1iZWRzIGhhbmRsZXMgdG8gb3RoZXIgYW5hbHlzaXMgcmVzdWx0cywgaXQKKyAgLy8vIG5lZWRzIHRvIGJlIGludmFsaWRhdGVkIGJvdGggd2hlbiBpdHMgb3duIGluZm9ybWF0aW9uIGlzbid0IHByZXNlcnZlZCBhbmQKKyAgLy8vIHdoZW4gYW55IG9mIGl0cyBlbWJlZGRlZCBhbmFseXNpcyByZXN1bHRzIGVuZCB1cCBpbnZhbGlkYXRlZC4gV2UgcGFzcyBhbgorICAvLy8gXGMgSW52YWxpZGF0b3Igb2JqZWN0IGFzIGFuIGFyZ3VtZW50IHRvIFxjIGludmFsaWRhdGUoKSBpbiBvcmRlciB0byBsZXQKKyAgLy8vIHRoZSBhbmFseXNpcyByZXN1bHRzIHRoZW1zZWx2ZXMgZGVmaW5lIHRoZSBkZXBlbmRlbmN5IGdyYXBoIG9uIHRoZSBmbHkuCisgIC8vLyBUaGlzIGxldHMgdXMgYXZvaWQgYnVpbGRpbmcgYnVpbGRpbmcgYW4gZXhwbGljaXQgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgIC8vLyBkZXBlbmRlbmNpZXMgYmV0d2VlbiBhbmFseXNpcyByZXN1bHRzLgorICBjbGFzcyBJbnZhbGlkYXRvciB7CisgIHB1YmxpYzoKKyAgICAvLy8gVHJpZ2dlciB0aGUgaW52YWxpZGF0aW9uIG9mIHNvbWUgb3RoZXIgYW5hbHlzaXMgcGFzcyBpZiBub3QgYWxyZWFkeQorICAgIC8vLyBoYW5kbGVkIGFuZCByZXR1cm4gd2hldGhlciBpdCB3YXMgaW4gZmFjdCBpbnZhbGlkYXRlZC4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBnaXZlbiBhbmFseXNpcyByZXN1bHQncyBcYworICAgIC8vLyBpbnZhbGlkYXRlIG1ldGhvZCB0byB0cmlnZ2VyIGEgZGVwdGgtZmlyc3Qgd2FsayBvZiBhbGwgaW50ZXItYW5hbHlzaXMKKyAgICAvLy8gZGVwZW5kZW5jaWVzLiBUaGUgc2FtZSBccCBJUiB1bml0IGFuZCBccCBQQSBwYXNzZWQgdG8gdGhhdCByZXN1bHQncyBcYworICAgIC8vLyBpbnZhbGlkYXRlIG1ldGhvZCBzaG91bGQgaW4gdHVybiBiZSBwcm92aWRlZCB0byB0aGlzIHJvdXRpbmUuCisgICAgLy8vCisgICAgLy8vIFRoZSBmaXJzdCB0aW1lIHRoaXMgaXMgY2FsbGVkIGZvciBhIGdpdmVuIGFuYWx5c2lzIHBhc3MsIGl0IHdpbGwgY2FsbAorICAgIC8vLyB0aGUgY29ycmVzcG9uZGluZyByZXN1bHQncyBcYyBpbnZhbGlkYXRlIG1ldGhvZC4gIFN1YnNlcXVlbnQgY2FsbHMgd2lsbAorICAgIC8vLyB1c2UgYSBjYWNoZSBvZiB0aGUgcmVzdWx0cyBvZiB0aGF0IGluaXRpYWwgY2FsbC4gIEl0IGlzIGFuIGVycm9yIHRvIGZvcm0KKyAgICAvLy8gY3ljbGljIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGFuYWx5c2lzIHJlc3VsdHMuCisgICAgLy8vCisgICAgLy8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBhbmFseXNpcydzIHJlc3VsdCBpcyBpbnZhbGlkLiBBbnkKKyAgICAvLy8gZGVwZW5kZWNpZXMgb24gaXQgd2lsbCBiZWNvbWUgaW52YWxpZCBhcyBhIHJlc3VsdC4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFzc1Q+CisgICAgYm9vbCBpbnZhbGlkYXRlKElSVW5pdFQgJklSLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmUEEpIHsKKyAgICAgIHVzaW5nIFJlc3VsdE1vZGVsVCA9CisgICAgICAgICAgZGV0YWlsOjpBbmFseXNpc1Jlc3VsdE1vZGVsPElSVW5pdFQsIFBhc3NULCB0eXBlbmFtZSBQYXNzVDo6UmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVzZXJ2ZWRBbmFseXNlcywgSW52YWxpZGF0b3I+OworCisgICAgICByZXR1cm4gaW52YWxpZGF0ZUltcGw8UmVzdWx0TW9kZWxUPihQYXNzVDo6SUQoKSwgSVIsIFBBKTsKKyAgICB9CisKKyAgICAvLy8gQSB0eXBlLWVyYXNlZCB2YXJpYW50IG9mIHRoZSBhYm92ZSBpbnZhbGlkYXRlIG1ldGhvZCB3aXRoIHRoZSBzYW1lIGNvcmUKKyAgICAvLy8gQVBJIG90aGVyIHRoYW4gcGFzc2luZyBhbiBhbmFseXNpcyBJRCByYXRoZXIgdGhhbiBhbiBhbmFseXNpcyB0eXBlCisgICAgLy8vIHBhcmFtZXRlci4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyBzYWRseSBsZXNzIGVmZmljaWVudCB0aGFuIHRoZSBhYm92ZSByb3V0aW5lLCB3aGljaCBsZXZlcmFnZXMKKyAgICAvLy8gdGhlIHR5cGUgcGFyYW1ldGVyIHRvIGF2b2lkIHRoZSB0eXBlIGVyYXN1cmUgb3ZlcmhlYWQuCisgICAgYm9vbCBpbnZhbGlkYXRlKEFuYWx5c2lzS2V5ICpJRCwgSVJVbml0VCAmSVIsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICZQQSkgeworICAgICAgcmV0dXJuIGludmFsaWRhdGVJbXBsPD4oSUQsIElSLCBQQSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEFuYWx5c2lzTWFuYWdlcjsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRUID0gUmVzdWx0Q29uY2VwdFQ+CisgICAgYm9vbCBpbnZhbGlkYXRlSW1wbChBbmFseXNpc0tleSAqSUQsIElSVW5pdFQgJklSLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJlBBKSB7CisgICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IHZpc2l0ZWQgdGhpcyBwYXNzLCByZXR1cm4gdHJ1ZSBpZiBpdCB3YXMgaW52YWxpZGF0ZWQKKyAgICAgIC8vIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICBhdXRvIElNYXBJID0gSXNSZXN1bHRJbnZhbGlkYXRlZC5maW5kKElEKTsKKyAgICAgIGlmIChJTWFwSSAhPSBJc1Jlc3VsdEludmFsaWRhdGVkLmVuZCgpKQorICAgICAgICByZXR1cm4gSU1hcEktPnNlY29uZDsKKworICAgICAgLy8gT3RoZXJ3aXNlIGxvb2sgdXAgdGhlIHJlc3VsdCBvYmplY3QuCisgICAgICBhdXRvIFJJID0gUmVzdWx0cy5maW5kKHtJRCwgJklSfSk7CisgICAgICBhc3NlcnQoUkkgIT0gUmVzdWx0cy5lbmQoKSAmJgorICAgICAgICAgICAgICJUcnlpbmcgdG8gaW52YWxpZGF0ZSBhIGRlcGVuZGVudCByZXN1bHQgdGhhdCBpc24ndCBpbiB0aGUgIgorICAgICAgICAgICAgICJtYW5hZ2VyJ3MgY2FjaGUgaXMgYWx3YXlzIGFuIGVycm9yLCBsaWtlbHkgZHVlIHRvIGEgc3RhbGUgcmVzdWx0ICIKKyAgICAgICAgICAgICAiaGFuZGxlISIpOworCisgICAgICBhdXRvICZSZXN1bHQgPSBzdGF0aWNfY2FzdDxSZXN1bHRUICY+KCpSSS0+c2Vjb25kLT5zZWNvbmQpOworCisgICAgICAvLyBJbnNlcnQgaW50byB0aGUgbWFwIHdoZXRoZXIgdGhlIHJlc3VsdCBzaG91bGQgYmUgaW52YWxpZGF0ZWQgYW5kIHJldHVybgorICAgICAgLy8gdGhhdC4gTm90ZSB0aGF0IHdlIGNhbm5vdCByZXVzZSBJTWFwSSBhbmQgbXVzdCBkbyBhIGZyZXNoIGluc2VydCBoZXJlLAorICAgICAgLy8gYXMgY2FsbGluZyBpbnZhbGlkYXRlIGNvdWxkIChyZWN1cnNpdmVseSkgaW5zZXJ0IHRoaW5ncyBpbnRvIHRoZSBtYXAsCisgICAgICAvLyBtYWtpbmcgYW55IGl0ZXJhdG9yIG9yIHJlZmVyZW5jZSBpbnZhbGlkLgorICAgICAgYm9vbCBJbnNlcnRlZDsKKyAgICAgIHN0ZDo6dGllKElNYXBJLCBJbnNlcnRlZCkgPQorICAgICAgICAgIElzUmVzdWx0SW52YWxpZGF0ZWQuaW5zZXJ0KHtJRCwgUmVzdWx0LmludmFsaWRhdGUoSVIsIFBBLCAqdGhpcyl9KTsKKyAgICAgICh2b2lkKUluc2VydGVkOworICAgICAgYXNzZXJ0KEluc2VydGVkICYmICJTaG91bGQgbm90IGhhdmUgYWxyZWFkeSBpbnNlcnRlZCB0aGlzIElELCBsaWtlbHkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRpY2F0ZXMgYSBkZXBlbmRlbmN5IGN5Y2xlISIpOworICAgICAgcmV0dXJuIElNYXBJLT5zZWNvbmQ7CisgICAgfQorCisgICAgSW52YWxpZGF0b3IoU21hbGxEZW5zZU1hcDxBbmFseXNpc0tleSAqLCBib29sLCA4PiAmSXNSZXN1bHRJbnZhbGlkYXRlZCwKKyAgICAgICAgICAgICAgICBjb25zdCBBbmFseXNpc1Jlc3VsdE1hcFQgJlJlc3VsdHMpCisgICAgICAgIDogSXNSZXN1bHRJbnZhbGlkYXRlZChJc1Jlc3VsdEludmFsaWRhdGVkKSwgUmVzdWx0cyhSZXN1bHRzKSB7fQorCisgICAgU21hbGxEZW5zZU1hcDxBbmFseXNpc0tleSAqLCBib29sLCA4PiAmSXNSZXN1bHRJbnZhbGlkYXRlZDsKKyAgICBjb25zdCBBbmFseXNpc1Jlc3VsdE1hcFQgJlJlc3VsdHM7CisgIH07CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYW4gZW1wdHkgYW5hbHlzaXMgbWFuYWdlci4KKyAgLy8vCisgIC8vLyBJZiBccCBEZWJ1Z0xvZ2dpbmcgaXMgdHJ1ZSwgd2UnbGwgbG9nIG91ciBwcm9ncmVzcyB0byBsbHZtOjpkYmdzKCkuCisgIEFuYWx5c2lzTWFuYWdlcihib29sIERlYnVnTG9nZ2luZyA9IGZhbHNlKSA6IERlYnVnTG9nZ2luZyhEZWJ1Z0xvZ2dpbmcpIHt9CisgIEFuYWx5c2lzTWFuYWdlcihBbmFseXNpc01hbmFnZXIgJiYpID0gZGVmYXVsdDsKKyAgQW5hbHlzaXNNYW5hZ2VyICZvcGVyYXRvcj0oQW5hbHlzaXNNYW5hZ2VyICYmKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIGFuYWx5c2lzIG1hbmFnZXIgaGFzIGFuIGVtcHR5IHJlc3VsdHMgY2FjaGUuCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgYXNzZXJ0KEFuYWx5c2lzUmVzdWx0cy5lbXB0eSgpID09IEFuYWx5c2lzUmVzdWx0TGlzdHMuZW1wdHkoKSAmJgorICAgICAgICAgICAiVGhlIHN0b3JhZ2UgYW5kIGluZGV4IG9mIGFuYWx5c2lzIHJlc3VsdHMgZGlzYWdyZWUgb24gaG93IG1hbnkgIgorICAgICAgICAgICAidGhlcmUgYXJlISIpOworICAgIHJldHVybiBBbmFseXNpc1Jlc3VsdHMuZW1wdHkoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2xlYXIgYW55IGNhY2hlZCBhbmFseXNpcyByZXN1bHRzIGZvciBhIHNpbmdsZSB1bml0IG9mIElSLgorICAvLy8KKyAgLy8vIFRoaXMgZG9lc24ndCBpbnZhbGlkYXRlLCBidXQgaW5zdGVhZCBzaW1wbHkgZGVsZXRlcywgdGhlIHJlbGV2YW50IHJlc3VsdHMuCisgIC8vLyBJdCBpcyB1c2VmdWwgd2hlbiB0aGUgSVIgaXMgYmVpbmcgcmVtb3ZlZCBhbmQgd2Ugd2FudCB0byBjbGVhciBvdXQgYWxsIHRoZQorICAvLy8gbWVtb3J5IHBpbm5lZCBmb3IgaXQuCisgIHZvaWQgY2xlYXIoSVJVbml0VCAmSVIsIGxsdm06OlN0cmluZ1JlZiBOYW1lKSB7CisgICAgaWYgKERlYnVnTG9nZ2luZykKKyAgICAgIGRiZ3MoKSA8PCAiQ2xlYXJpbmcgYWxsIGFuYWx5c2lzIHJlc3VsdHMgZm9yOiAiIDw8IE5hbWUgPDwgIlxuIjsKKworICAgIGF1dG8gUmVzdWx0c0xpc3RJID0gQW5hbHlzaXNSZXN1bHRMaXN0cy5maW5kKCZJUik7CisgICAgaWYgKFJlc3VsdHNMaXN0SSA9PSBBbmFseXNpc1Jlc3VsdExpc3RzLmVuZCgpKQorICAgICAgcmV0dXJuOworICAgIC8vIERlbGV0ZSB0aGUgbWFwIGVudHJpZXMgdGhhdCBwb2ludCBpbnRvIHRoZSByZXN1bHRzIGxpc3QuCisgICAgZm9yIChhdXRvICZJREFuZFJlc3VsdCA6IFJlc3VsdHNMaXN0SS0+c2Vjb25kKQorICAgICAgQW5hbHlzaXNSZXN1bHRzLmVyYXNlKHtJREFuZFJlc3VsdC5maXJzdCwgJklSfSk7CisKKyAgICAvLyBBbmQgYWN0dWFsbHkgZGVzdHJveSBhbmQgZXJhc2UgdGhlIHJlc3VsdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSVIuCisgICAgQW5hbHlzaXNSZXN1bHRMaXN0cy5lcmFzZShSZXN1bHRzTGlzdEkpOworICB9CisKKyAgLy8vIFxicmllZiBDbGVhciBhbGwgYW5hbHlzaXMgcmVzdWx0cyBjYWNoZWQgYnkgdGhpcyBBbmFseXNpc01hbmFnZXIuCisgIC8vLworICAvLy8gTGlrZSBcYyBjbGVhcihJUlVuaXRUJiksIHRoaXMgZG9lc24ndCBpbnZhbGlkYXRlIHRoZSByZXN1bHRzOyBpdCBzaW1wbHkKKyAgLy8vIGRlbGV0ZXMgdGhlbS4gIFRoaXMgbGV0cyB5b3UgY2xlYW4gdXAgdGhlIEFuYWx5c2lzTWFuYWdlciB3aGVuIHRoZSBzZXQgb2YKKyAgLy8vIElSIHVuaXRzIGl0c2VsZiBoYXMgcG90ZW50aWFsbHkgY2hhbmdlZCwgYW5kIHRodXMgd2UgY2FuJ3QgZXZlbiBsb29rIHVwIGEKKyAgLy8vIGEgcmVzdWx0IGFuZCBpbnZhbGlkYXRlL2NsZWFyIGl0IGRpcmVjdGx5LgorICB2b2lkIGNsZWFyKCkgeworICAgIEFuYWx5c2lzUmVzdWx0cy5jbGVhcigpOworICAgIEFuYWx5c2lzUmVzdWx0TGlzdHMuY2xlYXIoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSByZXN1bHQgb2YgYW4gYW5hbHlzaXMgcGFzcyBmb3IgYSBnaXZlbiBJUiB1bml0LgorICAvLy8KKyAgLy8vIFJ1bnMgdGhlIGFuYWx5c2lzIGlmIGEgY2FjaGVkIHJlc3VsdCBpcyBub3QgYXZhaWxhYmxlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFzc1Q+CisgIHR5cGVuYW1lIFBhc3NUOjpSZXN1bHQgJmdldFJlc3VsdChJUlVuaXRUICZJUiwgRXh0cmFBcmdUcy4uLiBFeHRyYUFyZ3MpIHsKKyAgICBhc3NlcnQoQW5hbHlzaXNQYXNzZXMuY291bnQoUGFzc1Q6OklEKCkpICYmCisgICAgICAgICAgICJUaGlzIGFuYWx5c2lzIHBhc3Mgd2FzIG5vdCByZWdpc3RlcmVkIHByaW9yIHRvIGJlaW5nIHF1ZXJpZWQiKTsKKyAgICBSZXN1bHRDb25jZXB0VCAmUmVzdWx0Q29uY2VwdCA9CisgICAgICAgIGdldFJlc3VsdEltcGwoUGFzc1Q6OklEKCksIElSLCBFeHRyYUFyZ3MuLi4pOworCisgICAgdXNpbmcgUmVzdWx0TW9kZWxUID0KKyAgICAgICAgZGV0YWlsOjpBbmFseXNpc1Jlc3VsdE1vZGVsPElSVW5pdFQsIFBhc3NULCB0eXBlbmFtZSBQYXNzVDo6UmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlc2VydmVkQW5hbHlzZXMsIEludmFsaWRhdG9yPjsKKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHRNb2RlbFQgJj4oUmVzdWx0Q29uY2VwdCkuUmVzdWx0OworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGNhY2hlZCByZXN1bHQgb2YgYW4gYW5hbHlzaXMgcGFzcyBmb3IgYSBnaXZlbiBJUiB1bml0LgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIG5ldmVyIHJ1bnMgdGhlIGFuYWx5c2lzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gY2FjaGVkIHJlc3VsdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhc3NUPgorICB0eXBlbmFtZSBQYXNzVDo6UmVzdWx0ICpnZXRDYWNoZWRSZXN1bHQoSVJVbml0VCAmSVIpIGNvbnN0IHsKKyAgICBhc3NlcnQoQW5hbHlzaXNQYXNzZXMuY291bnQoUGFzc1Q6OklEKCkpICYmCisgICAgICAgICAgICJUaGlzIGFuYWx5c2lzIHBhc3Mgd2FzIG5vdCByZWdpc3RlcmVkIHByaW9yIHRvIGJlaW5nIHF1ZXJpZWQiKTsKKworICAgIFJlc3VsdENvbmNlcHRUICpSZXN1bHRDb25jZXB0ID0gZ2V0Q2FjaGVkUmVzdWx0SW1wbChQYXNzVDo6SUQoKSwgSVIpOworICAgIGlmICghUmVzdWx0Q29uY2VwdCkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgdXNpbmcgUmVzdWx0TW9kZWxUID0KKyAgICAgICAgZGV0YWlsOjpBbmFseXNpc1Jlc3VsdE1vZGVsPElSVW5pdFQsIFBhc3NULCB0eXBlbmFtZSBQYXNzVDo6UmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlc2VydmVkQW5hbHlzZXMsIEludmFsaWRhdG9yPjsKKworICAgIHJldHVybiAmc3RhdGljX2Nhc3Q8UmVzdWx0TW9kZWxUICo+KFJlc3VsdENvbmNlcHQpLT5SZXN1bHQ7CisgIH0KKworICAvLy8gXGJyaWVmIFJlZ2lzdGVyIGFuIGFuYWx5c2lzIHBhc3Mgd2l0aCB0aGUgbWFuYWdlci4KKyAgLy8vCisgIC8vLyBUaGUgcGFyYW1ldGVyIGlzIGEgY2FsbGFibGUgd2hvc2UgcmVzdWx0IGlzIGFuIGFuYWx5c2lzIHBhc3MuIFRoaXMgYWxsb3dzCisgIC8vLyBwYXNzaW5nIGluIGEgbGFtYmRhIHRvIGNvbnN0cnVjdCB0aGUgYW5hbHlzaXMuCisgIC8vLworICAvLy8gVGhlIGFuYWx5c2lzIHR5cGUgdG8gcmVnaXN0ZXIgaXMgdGhlIHR5cGUgcmV0dXJuZWQgYnkgY2FsbGluZyB0aGUgXGMKKyAgLy8vIFBhc3NCdWlsZGVyIGFyZ3VtZW50LiBJZiB0aGF0IHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLCB0aGVuIHRoZQorICAvLy8gYXJndW1lbnQgd2lsbCBub3QgYmUgY2FsbGVkIGFuZCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlLgorICAvLy8gT3RoZXJ3aXNlLCB3ZSByZWdpc3RlciB0aGUgYW5hbHlzaXMgcmV0dXJuZWQgYnkgY2FsbGluZyBcYyBQYXNzQnVpbGRlcigpLAorICAvLy8gYW5kIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlLgorICAvLy8KKyAgLy8vIChOb3RlOiBBbHRob3VnaCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90CisgIC8vLyBhbiBhbmFseXNpcyB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkLCB0aGVyZSBpbnRlbnRpb25hbGx5IGlzbid0IGEgd2F5IHRvCisgIC8vLyBxdWVyeSB0aGlzIGRpcmVjdGx5LiAgSW5zdGVhZCwgeW91IHNob3VsZCBqdXN0IHJlZ2lzdGVyIGFsbCB0aGUgYW5hbHlzZXMKKyAgLy8vIHlvdSBtaWdodCB3YW50IGFuZCBsZXQgdGhpcyBjbGFzcyBydW4gdGhlbSBsYXppbHkuICBUaGlzIGlkaW9tIGxldHMgdXMKKyAgLy8vIG1pbmltaXplIHRoZSBudW1iZXIgb2YgdGltZXMgd2UgaGF2ZSB0byBsb29rIHVwIGFuYWx5c2VzIGluIG91cgorICAvLy8gaGFzaHRhYmxlLikKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhc3NCdWlsZGVyVD4KKyAgYm9vbCByZWdpc3RlclBhc3MoUGFzc0J1aWxkZXJUICYmUGFzc0J1aWxkZXIpIHsKKyAgICB1c2luZyBQYXNzVCA9IGRlY2x0eXBlKFBhc3NCdWlsZGVyKCkpOworICAgIHVzaW5nIFBhc3NNb2RlbFQgPQorICAgICAgICBkZXRhaWw6OkFuYWx5c2lzUGFzc01vZGVsPElSVW5pdFQsIFBhc3NULCBQcmVzZXJ2ZWRBbmFseXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkYXRvciwgRXh0cmFBcmdUcy4uLj47CisKKyAgICBhdXRvICZQYXNzUHRyID0gQW5hbHlzaXNQYXNzZXNbUGFzc1Q6OklEKCldOworICAgIGlmIChQYXNzUHRyKQorICAgICAgLy8gQWxyZWFkeSByZWdpc3RlcmVkIHRoaXMgcGFzcyB0eXBlIQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gQ29uc3RydWN0IGEgbmV3IG1vZGVsIGFyb3VuZCB0aGUgaW5zdGFuY2UgcmV0dXJuZWQgYnkgdGhlIGJ1aWxkZXIuCisgICAgUGFzc1B0ci5yZXNldChuZXcgUGFzc01vZGVsVChQYXNzQnVpbGRlcigpKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gXGJyaWVmIEludmFsaWRhdGUgYSBzcGVjaWZpYyBhbmFseXNpcyBwYXNzIGZvciBhbiBJUiBtb2R1bGUuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoZSBhbmFseXNpcyByZXN1bHQgY2FuIGRpc3JlZ2FyZCBpbnZhbGlkYXRpb24sIGlmIGl0IGRldGVybWluZXMKKyAgLy8vIGl0IGlzIGluIGZhY3Qgc3RpbGwgdmFsaWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYXNzVD4gdm9pZCBpbnZhbGlkYXRlKElSVW5pdFQgJklSKSB7CisgICAgYXNzZXJ0KEFuYWx5c2lzUGFzc2VzLmNvdW50KFBhc3NUOjpJRCgpKSAmJgorICAgICAgICAgICAiVGhpcyBhbmFseXNpcyBwYXNzIHdhcyBub3QgcmVnaXN0ZXJlZCBwcmlvciB0byBiZWluZyBpbnZhbGlkYXRlZCIpOworICAgIGludmFsaWRhdGVJbXBsKFBhc3NUOjpJRCgpLCBJUik7CisgIH0KKworICAvLy8gXGJyaWVmIEludmFsaWRhdGUgY2FjaGVkIGFuYWx5c2VzIGZvciBhbiBJUiB1bml0LgorICAvLy8KKyAgLy8vIFdhbGsgdGhyb3VnaCBhbGwgb2YgdGhlIGFuYWx5c2VzIHBlcnRhaW5pbmcgdG8gdGhpcyB1bml0IG9mIElSIGFuZAorICAvLy8gaW52YWxpZGF0ZSB0aGVtLCB1bmxlc3MgdGhleSBhcmUgcHJlc2VydmVkIGJ5IHRoZSBQcmVzZXJ2ZWRBbmFseXNlcyBzZXQuCisgIHZvaWQgaW52YWxpZGF0ZShJUlVuaXRUICZJUiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJlBBKSB7CisgICAgLy8gV2UncmUgZG9uZSBpZiBhbGwgYW5hbHlzZXMgb24gdGhpcyBJUiB1bml0IGFyZSBwcmVzZXJ2ZWQuCisgICAgaWYgKFBBLmFsbEFuYWx5c2VzSW5TZXRQcmVzZXJ2ZWQ8QWxsQW5hbHlzZXNPbjxJUlVuaXRUPj4oKSkKKyAgICAgIHJldHVybjsKKworICAgIGlmIChEZWJ1Z0xvZ2dpbmcpCisgICAgICBkYmdzKCkgPDwgIkludmFsaWRhdGluZyBhbGwgbm9uLXByZXNlcnZlZCBhbmFseXNlcyBmb3I6ICIgPDwgSVIuZ2V0TmFtZSgpCisgICAgICAgICAgICAgPDwgIlxuIjsKKworICAgIC8vIFRyYWNrIHdoZXRoZXIgZWFjaCBhbmFseXNpcydzIHJlc3VsdCBpcyBpbnZhbGlkYXRlZCBpbgorICAgIC8vIElzUmVzdWx0SW52YWxpZGF0ZWQuCisgICAgU21hbGxEZW5zZU1hcDxBbmFseXNpc0tleSAqLCBib29sLCA4PiBJc1Jlc3VsdEludmFsaWRhdGVkOworICAgIEludmFsaWRhdG9yIEludihJc1Jlc3VsdEludmFsaWRhdGVkLCBBbmFseXNpc1Jlc3VsdHMpOworICAgIEFuYWx5c2lzUmVzdWx0TGlzdFQgJlJlc3VsdHNMaXN0ID0gQW5hbHlzaXNSZXN1bHRMaXN0c1smSVJdOworICAgIGZvciAoYXV0byAmQW5hbHlzaXNSZXN1bHRQYWlyIDogUmVzdWx0c0xpc3QpIHsKKyAgICAgIC8vIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIHRoaW5nIGFzIEludmFsaWRhdG9yOjppbnZhbGlkYXRlLCBidXQgd2UKKyAgICAgIC8vIGNhbid0IGNhbGwgaXQgaGVyZSBiZWNhdXNlIHdlJ3JlIG9wZXJhdGluZyBvbiB0aGUgdHlwZS1lcmFzZWQgcmVzdWx0LgorICAgICAgLy8gTW9yZW92ZXIgaWYgd2UgaW5zdGVhZCBjYWxsZWQgaW52YWxpZGF0ZSgpIGRpcmVjdGx5LCBpdCB3b3VsZCBkbyBhbgorICAgICAgLy8gdW5uZWNlc3NhcnkgbG9vayB1cCBpbiBSZXN1bHRzTGlzdC4KKyAgICAgIEFuYWx5c2lzS2V5ICpJRCA9IEFuYWx5c2lzUmVzdWx0UGFpci5maXJzdDsKKyAgICAgIGF1dG8gJlJlc3VsdCA9ICpBbmFseXNpc1Jlc3VsdFBhaXIuc2Vjb25kOworCisgICAgICBhdXRvIElNYXBJID0gSXNSZXN1bHRJbnZhbGlkYXRlZC5maW5kKElEKTsKKyAgICAgIGlmIChJTWFwSSAhPSBJc1Jlc3VsdEludmFsaWRhdGVkLmVuZCgpKQorICAgICAgICAvLyBUaGlzIHJlc3VsdCB3YXMgYWxyZWFkeSBoYW5kbGVkIHZpYSB0aGUgSW52YWxpZGF0b3IuCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBUcnkgdG8gaW52YWxpZGF0ZSB0aGUgcmVzdWx0LCBnaXZpbmcgaXQgdGhlIEludmFsaWRhdG9yIHNvIGl0IGNhbgorICAgICAgLy8gcmVjdXJzaXZlbHkgcXVlcnkgZm9yIGFueSBkZXBlbmRlbmNpZXMgaXQgaGFzIGFuZCByZWNvcmQgdGhlIHJlc3VsdC4KKyAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW5ub3QgcmV1c2UgJ0lNYXBJJyBoZXJlIG9yIHByZS1pbnNlcnQgdGhlIElELCBhcworICAgICAgLy8gUmVzdWx0LmludmFsaWRhdGUgbWF5IGluc2VydCB0aGluZ3MgaW50byB0aGUgbWFwLCBpbnZhbGlkYXRpbmcgb3VyCisgICAgICAvLyBpdGVyYXRvci4KKyAgICAgIGJvb2wgSW5zZXJ0ZWQgPQorICAgICAgICAgIElzUmVzdWx0SW52YWxpZGF0ZWQuaW5zZXJ0KHtJRCwgUmVzdWx0LmludmFsaWRhdGUoSVIsIFBBLCBJbnYpfSkKKyAgICAgICAgICAgICAgLnNlY29uZDsKKyAgICAgICh2b2lkKUluc2VydGVkOworICAgICAgYXNzZXJ0KEluc2VydGVkICYmICJTaG91bGQgbmV2ZXIgaGF2ZSBhbHJlYWR5IGluc2VydGVkIHRoaXMgSUQsIGxpa2VseSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImluZGljYXRlcyBhIGN5Y2xlISIpOworICAgIH0KKworICAgIC8vIE5vdyBlcmFzZSB0aGUgcmVzdWx0cyB0aGF0IHdlcmUgbWFya2VkIGFib3ZlIGFzIGludmFsaWRhdGVkLgorICAgIGlmICghSXNSZXN1bHRJbnZhbGlkYXRlZC5lbXB0eSgpKSB7CisgICAgICBmb3IgKGF1dG8gSSA9IFJlc3VsdHNMaXN0LmJlZ2luKCksIEUgPSBSZXN1bHRzTGlzdC5lbmQoKTsgSSAhPSBFOykgeworICAgICAgICBBbmFseXNpc0tleSAqSUQgPSBJLT5maXJzdDsKKyAgICAgICAgaWYgKCFJc1Jlc3VsdEludmFsaWRhdGVkLmxvb2t1cChJRCkpIHsKKyAgICAgICAgICArK0k7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoRGVidWdMb2dnaW5nKQorICAgICAgICAgIGRiZ3MoKSA8PCAiSW52YWxpZGF0aW5nIGFuYWx5c2lzOiAiIDw8IHRoaXMtPmxvb2tVcFBhc3MoSUQpLm5hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiIG9uICIgPDwgSVIuZ2V0TmFtZSgpIDw8ICJcbiI7CisKKyAgICAgICAgSSA9IFJlc3VsdHNMaXN0LmVyYXNlKEkpOworICAgICAgICBBbmFseXNpc1Jlc3VsdHMuZXJhc2Uoe0lELCAmSVJ9KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoUmVzdWx0c0xpc3QuZW1wdHkoKSkKKyAgICAgIEFuYWx5c2lzUmVzdWx0TGlzdHMuZXJhc2UoJklSKTsKKyAgfQorCitwcml2YXRlOgorICAvLy8gXGJyaWVmIExvb2sgdXAgYSByZWdpc3RlcmVkIGFuYWx5c2lzIHBhc3MuCisgIFBhc3NDb25jZXB0VCAmbG9va1VwUGFzcyhBbmFseXNpc0tleSAqSUQpIHsKKyAgICB0eXBlbmFtZSBBbmFseXNpc1Bhc3NNYXBUOjppdGVyYXRvciBQSSA9IEFuYWx5c2lzUGFzc2VzLmZpbmQoSUQpOworICAgIGFzc2VydChQSSAhPSBBbmFseXNpc1Bhc3Nlcy5lbmQoKSAmJgorICAgICAgICAgICAiQW5hbHlzaXMgcGFzc2VzIG11c3QgYmUgcmVnaXN0ZXJlZCBwcmlvciB0byBiZWluZyBxdWVyaWVkISIpOworICAgIHJldHVybiAqUEktPnNlY29uZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgTG9vayB1cCBhIHJlZ2lzdGVyZWQgYW5hbHlzaXMgcGFzcy4KKyAgY29uc3QgUGFzc0NvbmNlcHRUICZsb29rVXBQYXNzKEFuYWx5c2lzS2V5ICpJRCkgY29uc3QgeworICAgIHR5cGVuYW1lIEFuYWx5c2lzUGFzc01hcFQ6OmNvbnN0X2l0ZXJhdG9yIFBJID0gQW5hbHlzaXNQYXNzZXMuZmluZChJRCk7CisgICAgYXNzZXJ0KFBJICE9IEFuYWx5c2lzUGFzc2VzLmVuZCgpICYmCisgICAgICAgICAgICJBbmFseXNpcyBwYXNzZXMgbXVzdCBiZSByZWdpc3RlcmVkIHByaW9yIHRvIGJlaW5nIHF1ZXJpZWQhIik7CisgICAgcmV0dXJuICpQSS0+c2Vjb25kOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYW4gYW5hbHlzaXMgcmVzdWx0LCBydW5uaW5nIHRoZSBwYXNzIGlmIG5lY2Vzc2FyeS4KKyAgUmVzdWx0Q29uY2VwdFQgJmdldFJlc3VsdEltcGwoQW5hbHlzaXNLZXkgKklELCBJUlVuaXRUICZJUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFBcmdUcy4uLiBFeHRyYUFyZ3MpIHsKKyAgICB0eXBlbmFtZSBBbmFseXNpc1Jlc3VsdE1hcFQ6Oml0ZXJhdG9yIFJJOworICAgIGJvb2wgSW5zZXJ0ZWQ7CisgICAgc3RkOjp0aWUoUkksIEluc2VydGVkKSA9IEFuYWx5c2lzUmVzdWx0cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgIHN0ZDo6bWFrZV9wYWlyKElELCAmSVIpLCB0eXBlbmFtZSBBbmFseXNpc1Jlc3VsdExpc3RUOjppdGVyYXRvcigpKSk7CisKKyAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2FjaGVkIHJlc3VsdCBmb3IgdGhpcyBmdW5jdGlvbiwgbG9vayB1cCB0aGUgcGFzcyBhbmQKKyAgICAvLyBydW4gaXQgdG8gcHJvZHVjZSBhIHJlc3VsdCwgd2hpY2ggd2UgdGhlbiBhZGQgdG8gdGhlIGNhY2hlLgorICAgIGlmIChJbnNlcnRlZCkgeworICAgICAgYXV0byAmUCA9IHRoaXMtPmxvb2tVcFBhc3MoSUQpOworICAgICAgaWYgKERlYnVnTG9nZ2luZykKKyAgICAgICAgZGJncygpIDw8ICJSdW5uaW5nIGFuYWx5c2lzOiAiIDw8IFAubmFtZSgpIDw8ICIgb24gIiA8PCBJUi5nZXROYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcbiI7CisgICAgICBBbmFseXNpc1Jlc3VsdExpc3RUICZSZXN1bHRMaXN0ID0gQW5hbHlzaXNSZXN1bHRMaXN0c1smSVJdOworICAgICAgUmVzdWx0TGlzdC5lbXBsYWNlX2JhY2soSUQsIFAucnVuKElSLCAqdGhpcywgRXh0cmFBcmdzLi4uKSk7CisKKyAgICAgIC8vIFAucnVuIG1heSBoYXZlIGluc2VydGVkIGVsZW1lbnRzIGludG8gQW5hbHlzaXNSZXN1bHRzIGFuZCBpbnZhbGlkYXRlZAorICAgICAgLy8gUkkuCisgICAgICBSSSA9IEFuYWx5c2lzUmVzdWx0cy5maW5kKHtJRCwgJklSfSk7CisgICAgICBhc3NlcnQoUkkgIT0gQW5hbHlzaXNSZXN1bHRzLmVuZCgpICYmICJ3ZSBqdXN0IGluc2VydGVkIGl0ISIpOworCisgICAgICBSSS0+c2Vjb25kID0gc3RkOjpwcmV2KFJlc3VsdExpc3QuZW5kKCkpOworICAgIH0KKworICAgIHJldHVybiAqUkktPnNlY29uZC0+c2Vjb25kOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYSBjYWNoZWQgYW5hbHlzaXMgcmVzdWx0IG9yIHJldHVybiBudWxsLgorICBSZXN1bHRDb25jZXB0VCAqZ2V0Q2FjaGVkUmVzdWx0SW1wbChBbmFseXNpc0tleSAqSUQsIElSVW5pdFQgJklSKSBjb25zdCB7CisgICAgdHlwZW5hbWUgQW5hbHlzaXNSZXN1bHRNYXBUOjpjb25zdF9pdGVyYXRvciBSSSA9CisgICAgICAgIEFuYWx5c2lzUmVzdWx0cy5maW5kKHtJRCwgJklSfSk7CisgICAgcmV0dXJuIFJJID09IEFuYWx5c2lzUmVzdWx0cy5lbmQoKSA/IG51bGxwdHIgOiAmKlJJLT5zZWNvbmQtPnNlY29uZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgSW52YWxpZGF0ZSBhIGZ1bmN0aW9uIHBhc3MgcmVzdWx0LgorICB2b2lkIGludmFsaWRhdGVJbXBsKEFuYWx5c2lzS2V5ICpJRCwgSVJVbml0VCAmSVIpIHsKKyAgICB0eXBlbmFtZSBBbmFseXNpc1Jlc3VsdE1hcFQ6Oml0ZXJhdG9yIFJJID0KKyAgICAgICAgQW5hbHlzaXNSZXN1bHRzLmZpbmQoe0lELCAmSVJ9KTsKKyAgICBpZiAoUkkgPT0gQW5hbHlzaXNSZXN1bHRzLmVuZCgpKQorICAgICAgcmV0dXJuOworCisgICAgaWYgKERlYnVnTG9nZ2luZykKKyAgICAgIGRiZ3MoKSA8PCAiSW52YWxpZGF0aW5nIGFuYWx5c2lzOiAiIDw8IHRoaXMtPmxvb2tVcFBhc3MoSUQpLm5hbWUoKQorICAgICAgICAgICAgIDw8ICIgb24gIiA8PCBJUi5nZXROYW1lKCkgPDwgIlxuIjsKKyAgICBBbmFseXNpc1Jlc3VsdExpc3RzWyZJUl0uZXJhc2UoUkktPnNlY29uZCk7CisgICAgQW5hbHlzaXNSZXN1bHRzLmVyYXNlKFJJKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTWFwIHR5cGUgZnJvbSBtb2R1bGUgYW5hbHlzaXMgcGFzcyBJRCB0byBwYXNzIGNvbmNlcHQgcG9pbnRlci4KKyAgdXNpbmcgQW5hbHlzaXNQYXNzTWFwVCA9CisgICAgICBEZW5zZU1hcDxBbmFseXNpc0tleSAqLCBzdGQ6OnVuaXF1ZV9wdHI8UGFzc0NvbmNlcHRUPj47CisKKyAgLy8vIFxicmllZiBDb2xsZWN0aW9uIG9mIG1vZHVsZSBhbmFseXNpcyBwYXNzZXMsIGluZGV4ZWQgYnkgSUQuCisgIEFuYWx5c2lzUGFzc01hcFQgQW5hbHlzaXNQYXNzZXM7CisKKyAgLy8vIFxicmllZiBNYXAgZnJvbSBmdW5jdGlvbiB0byBhIGxpc3Qgb2YgZnVuY3Rpb24gYW5hbHlzaXMgcmVzdWx0cy4KKyAgLy8vCisgIC8vLyBQcm92aWRlcyBsaW5lYXIgdGltZSByZW1vdmFsIG9mIGFsbCBhbmFseXNpcyByZXN1bHRzIGZvciBhIGZ1bmN0aW9uIGFuZAorICAvLy8gdGhlIHVsdGltYXRlIHN0b3JhZ2UgZm9yIGEgcGFydGljdWxhciBjYWNoZWQgYW5hbHlzaXMgcmVzdWx0LgorICBBbmFseXNpc1Jlc3VsdExpc3RNYXBUIEFuYWx5c2lzUmVzdWx0TGlzdHM7CisKKyAgLy8vIFxicmllZiBNYXAgZnJvbSBhbiBhbmFseXNpcyBJRCBhbmQgZnVuY3Rpb24gdG8gYSBwYXJ0aWN1bGFyIGNhY2hlZAorICAvLy8gYW5hbHlzaXMgcmVzdWx0LgorICBBbmFseXNpc1Jlc3VsdE1hcFQgQW5hbHlzaXNSZXN1bHRzOworCisgIC8vLyBcYnJpZWYgSW5kaWNhdGVzIHdoZXRoZXIgd2UgbG9nIHRvIFxjIGxsdm06OmRiZ3MoKS4KKyAgYm9vbCBEZWJ1Z0xvZ2dpbmc7Cit9OworCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgQW5hbHlzaXNNYW5hZ2VyPE1vZHVsZT47CisKKy8vLyBcYnJpZWYgQ29udmVuaWVuY2UgdHlwZWRlZiBmb3IgdGhlIE1vZHVsZSBhbmFseXNpcyBtYW5hZ2VyLgordXNpbmcgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyID0gQW5hbHlzaXNNYW5hZ2VyPE1vZHVsZT47CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBBbmFseXNpc01hbmFnZXI8RnVuY3Rpb24+OworCisvLy8gXGJyaWVmIENvbnZlbmllbmNlIHR5cGVkZWYgZm9yIHRoZSBGdW5jdGlvbiBhbmFseXNpcyBtYW5hZ2VyLgordXNpbmcgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgPSBBbmFseXNpc01hbmFnZXI8RnVuY3Rpb24+OworCisvLy8gXGJyaWVmIEFuIGFuYWx5c2lzIG92ZXIgYW4gIm91dGVyIiBJUiB1bml0IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIGFuCisvLy8gYW5hbHlzaXMgbWFuYWdlciBvdmVyIGFuICJpbm5lciIgSVIgdW5pdC4gIFRoZSBpbm5lciB1bml0IG11c3QgYmUgY29udGFpbmVkCisvLy8gaW4gdGhlIG91dGVyIHVuaXQuCisvLy8KKy8vLyBGb3JlIGV4YW1wbGUsIElubmVyQW5hbHlzaXNNYW5hZ2VyUHJveHk8RnVuY3Rpb25BbmFseXNpc01hbmFnZXIsIE1vZHVsZT4gaXMKKy8vLyBhbiBhbmFseXNpcyBvdmVyIE1vZHVsZXMgKHRoZSAib3V0ZXIiIHVuaXQpIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIGEKKy8vLyBGdW5jdGlvbiBhbmFseXNpcyBtYW5hZ2VyLiAgVGhlIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyIGlzIHRoZSAiaW5uZXIiCisvLy8gbWFuYWdlciBiZWluZyBwcm94aWVkLCBhbmQgRnVuY3Rpb25zIGFyZSB0aGUgImlubmVyIiB1bml0LiAgVGhlIGlubmVyL291dGVyCisvLy8gcmVsYXRpb25zaGlwIGlzIHZhbGlkIGJlY2F1c2UgZWFjaCBGdW5jdGlvbiBpcyBjb250YWluZWQgaW4gb25lIE1vZHVsZS4KKy8vLworLy8vIElmIHlvdSdyZSAodHJhbnNpdGl2ZWx5KSB3aXRoaW4gYSBwYXNzIG1hbmFnZXIgZm9yIGFuIElSIHVuaXQgVSB0aGF0CisvLy8gY29udGFpbnMgSVIgdW5pdCBWLCB5b3Ugc2hvdWxkIG5ldmVyIHVzZSBhbiBhbmFseXNpcyBtYW5hZ2VyIG92ZXIgViwgZXhjZXB0CisvLy8gdmlhIG9uZSBvZiB0aGVzZSBwcm94aWVzLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoZSBwcm94eSdzIHJlc3VsdCBpcyBhIG1vdmUtb25seSBSQUlJIG9iamVjdC4gIFRoZSB2YWxpZGl0eSBvZgorLy8vIHRoZSBhbmFseXNlcyBpbiB0aGUgaW5uZXIgYW5hbHlzaXMgbWFuYWdlciBpcyB0aWVkIHRvIGl0cyBsaWZldGltZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBBbmFseXNpc01hbmFnZXJULCB0eXBlbmFtZSBJUlVuaXRULCB0eXBlbmFtZS4uLiBFeHRyYUFyZ1RzPgorY2xhc3MgSW5uZXJBbmFseXNpc01hbmFnZXJQcm94eQorICAgIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPAorICAgICAgICAgIElubmVyQW5hbHlzaXNNYW5hZ2VyUHJveHk8QW5hbHlzaXNNYW5hZ2VyVCwgSVJVbml0VD4+IHsKK3B1YmxpYzoKKyAgY2xhc3MgUmVzdWx0IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFJlc3VsdChBbmFseXNpc01hbmFnZXJUICZJbm5lckFNKSA6IElubmVyQU0oJklubmVyQU0pIHt9CisKKyAgICBSZXN1bHQoUmVzdWx0ICYmQXJnKSA6IElubmVyQU0oc3RkOjptb3ZlKEFyZy5Jbm5lckFNKSkgeworICAgICAgLy8gV2UgaGF2ZSB0byBudWxsIG91dCB0aGUgYW5hbHlzaXMgbWFuYWdlciBpbiB0aGUgbW92ZWQtZnJvbSBzdGF0ZQorICAgICAgLy8gYmVjYXVzZSB3ZSBhcmUgdGFraW5nIG93bmVyc2hpcCBvZiB0aGUgcmVzcG9uc2liaWx0eSB0byBjbGVhciB0aGUKKyAgICAgIC8vIGFuYWx5c2lzIHN0YXRlLgorICAgICAgQXJnLklubmVyQU0gPSBudWxscHRyOworICAgIH0KKworICAgIH5SZXN1bHQoKSB7CisgICAgICAvLyBJbm5lckFNIGlzIGNsZWFyZWQgaW4gYSBtb3ZlZCBmcm9tIHN0YXRlIHdoZXJlIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCisgICAgICBpZiAoIUlubmVyQU0pCisgICAgICAgIHJldHVybjsKKworICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBhbmFseXNpcyBtYW5hZ2VyIGlmIHdlJ3JlIGJlaW5nIGRlc3Ryb3llZCAtLSBpdCBtZWFucyB3ZQorICAgICAgLy8gZGlkbid0IGV2ZW4gc2VlIGFuIGludmFsaWRhdGUgY2FsbCB3aGVuIHdlIGdvdCBpbnZhbGlkYXRlZC4KKyAgICAgIElubmVyQU0tPmNsZWFyKCk7CisgICAgfQorCisgICAgUmVzdWx0ICZvcGVyYXRvcj0oUmVzdWx0ICYmUkhTKSB7CisgICAgICBJbm5lckFNID0gUkhTLklubmVyQU07CisgICAgICAvLyBXZSBoYXZlIHRvIG51bGwgb3V0IHRoZSBhbmFseXNpcyBtYW5hZ2VyIGluIHRoZSBtb3ZlZC1mcm9tIHN0YXRlCisgICAgICAvLyBiZWNhdXNlIHdlIGFyZSB0YWtpbmcgb3duZXJzaGlwIG9mIHRoZSByZXNwb25zaWJpbHR5IHRvIGNsZWFyIHRoZQorICAgICAgLy8gYW5hbHlzaXMgc3RhdGUuCisgICAgICBSSFMuSW5uZXJBTSA9IG51bGxwdHI7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8vIFxicmllZiBBY2Nlc3NvciBmb3IgdGhlIGFuYWx5c2lzIG1hbmFnZXIuCisgICAgQW5hbHlzaXNNYW5hZ2VyVCAmZ2V0TWFuYWdlcigpIHsgcmV0dXJuICpJbm5lckFNOyB9CisKKyAgICAvLy8gXGJyaWVmIEhhbmRsZXIgZm9yIGludmFsaWRhdGlvbiBvZiB0aGUgb3V0ZXIgSVIgdW5pdCwgXGMgSVJVbml0VC4KKyAgICAvLy8KKyAgICAvLy8gSWYgdGhlIHByb3h5IGFuYWx5c2lzIGl0c2VsZiBpcyBub3QgcHJlc2VydmVkLCB3ZSBhc3N1bWUgdGhhdCB0aGUgc2V0IG9mCisgICAgLy8vIGlubmVyIElSIG9iamVjdHMgY29udGFpbmVkIGluIElSVW5pdCBtYXkgaGF2ZSBjaGFuZ2VkLiAgSW4gdGhpcyBjYXNlLAorICAgIC8vLyB3ZSBoYXZlIHRvIGNhbGwgXGMgY2xlYXIoKSBvbiB0aGUgaW5uZXIgYW5hbHlzaXMgbWFuYWdlciwgYXMgaXQgbWF5IG5vdworICAgIC8vLyBoYXZlIHN0YWxlIHBvaW50ZXJzIHRvIGl0cyBpbm5lciBJUiBvYmplY3RzLgorICAgIC8vLworICAgIC8vLyBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHByb3h5IGFuYWx5c2lzIGlzIG1hcmtlZCBhcyBwcmVzZXJ2ZWQsIGFsbCBvZgorICAgIC8vLyB0aGUgYW5hbHlzZXMgaW4gdGhlIGlubmVyIGFuYWx5c2lzIG1hbmFnZXIgYXJlIHBvdGVudGlhbGx5IGludmFsaWRhdGVkCisgICAgLy8vIGJhc2VkIG9uIHRoZSBzZXQgb2YgcHJlc2VydmVkIGFuYWx5c2VzLgorICAgIGJvb2wgaW52YWxpZGF0ZSgKKyAgICAgICAgSVJVbml0VCAmSVIsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICZQQSwKKyAgICAgICAgdHlwZW5hbWUgQW5hbHlzaXNNYW5hZ2VyPElSVW5pdFQsIEV4dHJhQXJnVHMuLi4+OjpJbnZhbGlkYXRvciAmSW52KTsKKworICBwcml2YXRlOgorICAgIEFuYWx5c2lzTWFuYWdlclQgKklubmVyQU07CisgIH07CisKKyAgZXhwbGljaXQgSW5uZXJBbmFseXNpc01hbmFnZXJQcm94eShBbmFseXNpc01hbmFnZXJUICZJbm5lckFNKQorICAgICAgOiBJbm5lckFNKCZJbm5lckFNKSB7fQorCisgIC8vLyBcYnJpZWYgUnVuIHRoZSBhbmFseXNpcyBwYXNzIGFuZCBjcmVhdGUgb3VyIHByb3h5IHJlc3VsdCBvYmplY3QuCisgIC8vLworICAvLy8gVGhpcyBkb2Vzbid0IGRvIGFueSBpbnRlcmVzdGluZyB3b3JrOyBpdCBpcyBwcmltYXJpbHkgdXNlZCB0byBpbnNlcnQgb3VyCisgIC8vLyBwcm94eSByZXN1bHQgb2JqZWN0IGludG8gdGhlIG91dGVyIGFuYWx5c2lzIGNhY2hlIHNvIHRoYXQgd2UgY2FuIHByb3h5CisgIC8vLyBpbnZhbGlkYXRpb24gdG8gdGhlIGlubmVyIGFuYWx5c2lzIG1hbmFnZXIuCisgIFJlc3VsdCBydW4oSVJVbml0VCAmSVIsIEFuYWx5c2lzTWFuYWdlcjxJUlVuaXRULCBFeHRyYUFyZ1RzLi4uPiAmQU0sCisgICAgICAgICAgICAgRXh0cmFBcmdUcy4uLikgeworICAgIHJldHVybiBSZXN1bHQoKklubmVyQU0pOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjwKKyAgICAgIElubmVyQW5hbHlzaXNNYW5hZ2VyUHJveHk8QW5hbHlzaXNNYW5hZ2VyVCwgSVJVbml0VD4+OworCisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKKyAgQW5hbHlzaXNNYW5hZ2VyVCAqSW5uZXJBTTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBbmFseXNpc01hbmFnZXJULCB0eXBlbmFtZSBJUlVuaXRULCB0eXBlbmFtZS4uLiBFeHRyYUFyZ1RzPgorQW5hbHlzaXNLZXkKKyAgICBJbm5lckFuYWx5c2lzTWFuYWdlclByb3h5PEFuYWx5c2lzTWFuYWdlclQsIElSVW5pdFQsIEV4dHJhQXJnVHMuLi4+OjpLZXk7CisKKy8vLyBQcm92aWRlIHRoZSBcYyBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciB0byBcYyBNb2R1bGUgcHJveHkuCit1c2luZyBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlck1vZHVsZVByb3h5ID0KKyAgICBJbm5lckFuYWx5c2lzTWFuYWdlclByb3h5PEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyLCBNb2R1bGU+OworCisvLy8gU3BlY2lhbGl6YXRpb24gb2YgdGhlIGludmFsaWRhdGUgbWV0aG9kIGZvciB0aGUgXGMKKy8vLyBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlck1vZHVsZVByb3h5J3MgcmVzdWx0LgordGVtcGxhdGUgPD4KK2Jvb2wgRnVuY3Rpb25BbmFseXNpc01hbmFnZXJNb2R1bGVQcm94eTo6UmVzdWx0OjppbnZhbGlkYXRlKAorICAgIE1vZHVsZSAmTSwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJlBBLAorICAgIE1vZHVsZUFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJkludik7CisKKy8vIEVuc3VyZSB0aGUgXGMgRnVuY3Rpb25BbmFseXNpc01hbmFnZXJNb2R1bGVQcm94eSBpcyBwcm92aWRlZCBhcyBhbiBleHRlcm4KKy8vIHRlbXBsYXRlLgorZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIElubmVyQW5hbHlzaXNNYW5hZ2VyUHJveHk8RnVuY3Rpb25BbmFseXNpc01hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGU+OworCisvLy8gXGJyaWVmIEFuIGFuYWx5c2lzIG92ZXIgYW4gImlubmVyIiBJUiB1bml0IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIGFuCisvLy8gYW5hbHlzaXMgbWFuYWdlciBvdmVyIGEgIm91dGVyIiBJUiB1bml0LiAgVGhlIGlubmVyIHVuaXQgbXVzdCBiZSBjb250YWluZWQKKy8vLyBpbiB0aGUgb3V0ZXIgdW5pdC4KKy8vLworLy8vIEZvciBleGFtcGxlIE91dGVyQW5hbHlzaXNNYW5hZ2VyUHJveHk8TW9kdWxlQW5hbHlzaXNNYW5hZ2VyLCBGdW5jdGlvbj4gaXMgYW4KKy8vLyBhbmFseXNpcyBvdmVyIEZ1bmN0aW9ucyAodGhlICJpbm5lciIgdW5pdCkgd2hpY2ggcHJvdmlkZXMgYWNjZXNzIHRvIGEgTW9kdWxlCisvLy8gYW5hbHlzaXMgbWFuYWdlci4gIFRoZSBNb2R1bGVBbmFseXNpc01hbmFnZXIgaXMgdGhlICJvdXRlciIgbWFuYWdlciBiZWluZworLy8vIHByb3hpZWQsIGFuZCBNb2R1bGVzIGFyZSB0aGUgIm91dGVyIiBJUiB1bml0LiAgVGhlIGlubmVyL291dGVyIHJlbGF0aW9uc2hpcAorLy8vIGlzIHZhbGlkIGJlY2F1c2UgZWFjaCBGdW5jdGlvbiBpcyBjb250YWluZWQgaW4gb25lIE1vZHVsZS4KKy8vLworLy8vIFRoaXMgcHJveHkgb25seSBleHBvc2VzIHRoZSBjb25zdCBpbnRlcmZhY2Ugb2YgdGhlIG91dGVyIGFuYWx5c2lzIG1hbmFnZXIsCisvLy8gdG8gaW5kaWNhdGUgdGhhdCB5b3UgY2Fubm90IGNhdXNlIGFuIG91dGVyIGFuYWx5c2lzIHRvIHJ1biBmcm9tIHdpdGhpbiBhbgorLy8vIGlubmVyIHBhc3MuICBJbnN0ZWFkLCB5b3UgbXVzdCByZWx5IG9uIHRoZSBcYyBnZXRDYWNoZWRSZXN1bHQgQVBJLgorLy8vCisvLy8gVGhpcyBwcm94eSBkb2Vzbid0IG1hbmFnZSBpbnZhbGlkYXRpb24gaW4gYW55IHdheSAtLSB0aGF0IGlzIGhhbmRsZWQgYnkgdGhlCisvLy8gcmVjdXJzaXZlIHJldHVybiBwYXRoIG9mIGVhY2ggbGF5ZXIgb2YgdGhlIHBhc3MgbWFuYWdlci4gIEEgY29uc2VxdWVuY2Ugb2YKKy8vLyB0aGlzIGlzIHRoZSBvdXRlciBhbmFseXNlcyBtYXkgYmUgc3RhbGUuICBXZSBpbnZhbGlkYXRlIHRoZSBvdXRlciBhbmFseXNlcworLy8vIG9ubHkgd2hlbiB3ZSdyZSBkb25lIHJ1bm5pbmcgcGFzc2VzIG92ZXIgdGhlIGlubmVyIElSIHVuaXRzLgordGVtcGxhdGUgPHR5cGVuYW1lIEFuYWx5c2lzTWFuYWdlclQsIHR5cGVuYW1lIElSVW5pdFQsIHR5cGVuYW1lLi4uIEV4dHJhQXJnVHM+CitjbGFzcyBPdXRlckFuYWx5c2lzTWFuYWdlclByb3h5CisgICAgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48CisgICAgICAgICAgT3V0ZXJBbmFseXNpc01hbmFnZXJQcm94eTxBbmFseXNpc01hbmFnZXJULCBJUlVuaXRULCBFeHRyYUFyZ1RzLi4uPj4geworcHVibGljOgorICAvLy8gXGJyaWVmIFJlc3VsdCBwcm94eSBvYmplY3QgZm9yIFxjIE91dGVyQW5hbHlzaXNNYW5hZ2VyUHJveHkuCisgIGNsYXNzIFJlc3VsdCB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBSZXN1bHQoY29uc3QgQW5hbHlzaXNNYW5hZ2VyVCAmQU0pIDogQU0oJkFNKSB7fQorCisgICAgY29uc3QgQW5hbHlzaXNNYW5hZ2VyVCAmZ2V0TWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuICpBTTsgfQorCisgICAgLy8vIFdoZW4gaW52YWxpZGF0aW9uIG9jY3VycywgcmVtb3ZlIGFueSByZWdpc3RlcmVkIGludmFsaWRhdGlvbiBldmVudHMuCisgICAgYm9vbCBpbnZhbGlkYXRlKAorICAgICAgICBJUlVuaXRUICZJUlVuaXQsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICZQQSwKKyAgICAgICAgdHlwZW5hbWUgQW5hbHlzaXNNYW5hZ2VyPElSVW5pdFQsIEV4dHJhQXJnVHMuLi4+OjpJbnZhbGlkYXRvciAmSW52KSB7CisgICAgICAvLyBMb29wIG92ZXIgdGhlIHNldCBvZiByZWdpc3RlcmVkIG91dGVyIGludmFsaWRhdGlvbiBtYXBwaW5ncyBhbmQgaWYgYW55CisgICAgICAvLyBvZiB0aGVtIG1hcCB0byBhbiBhbmFseXNpcyB0aGF0IGlzIG5vdyBpbnZhbGlkLCBjbGVhciBpdCBvdXQuCisgICAgICBTbWFsbFZlY3RvcjxBbmFseXNpc0tleSAqLCA0PiBEZWFkS2V5czsKKyAgICAgIGZvciAoYXV0byAmS2V5VmFsdWVQYWlyIDogT3V0ZXJBbmFseXNpc0ludmFsaWRhdGlvbk1hcCkgeworICAgICAgICBBbmFseXNpc0tleSAqT3V0ZXJJRCA9IEtleVZhbHVlUGFpci5maXJzdDsKKyAgICAgICAgYXV0byAmSW5uZXJJRHMgPSBLZXlWYWx1ZVBhaXIuc2Vjb25kOworICAgICAgICBJbm5lcklEcy5lcmFzZShsbHZtOjpyZW1vdmVfaWYoSW5uZXJJRHMsIFsmXShBbmFseXNpc0tleSAqSW5uZXJJRCkgeworICAgICAgICAgIHJldHVybiBJbnYuaW52YWxpZGF0ZShJbm5lcklELCBJUlVuaXQsIFBBKTsgfSksCisgICAgICAgICAgICAgICAgICAgICAgIElubmVySURzLmVuZCgpKTsKKyAgICAgICAgaWYgKElubmVySURzLmVtcHR5KCkpCisgICAgICAgICAgRGVhZEtleXMucHVzaF9iYWNrKE91dGVySUQpOworICAgICAgfQorCisgICAgICBmb3IgKGF1dG8gT3V0ZXJJRCA6IERlYWRLZXlzKQorICAgICAgICBPdXRlckFuYWx5c2lzSW52YWxpZGF0aW9uTWFwLmVyYXNlKE91dGVySUQpOworCisgICAgICAvLyBUaGUgcHJveHkgaXRzZWxmIHJlbWFpbnMgdmFsaWQgcmVnYXJkbGVzcyBvZiBhbnl0aGluZyBlbHNlLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vLyBSZWdpc3RlciBhIGRlZmVycmVkIGludmFsaWRhdGlvbiBldmVudCBmb3Igd2hlbiB0aGUgb3V0ZXIgYW5hbHlzaXMKKyAgICAvLy8gbWFuYWdlciBwcm9jZXNzZXMgaXRzIGludmFsaWRhdGlvbnMuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIE91dGVyQW5hbHlzaXNULCB0eXBlbmFtZSBJbnZhbGlkYXRlZEFuYWx5c2lzVD4KKyAgICB2b2lkIHJlZ2lzdGVyT3V0ZXJBbmFseXNpc0ludmFsaWRhdGlvbigpIHsKKyAgICAgIEFuYWx5c2lzS2V5ICpPdXRlcklEID0gT3V0ZXJBbmFseXNpc1Q6OklEKCk7CisgICAgICBBbmFseXNpc0tleSAqSW52YWxpZGF0ZWRJRCA9IEludmFsaWRhdGVkQW5hbHlzaXNUOjpJRCgpOworCisgICAgICBhdXRvICZJbnZhbGlkYXRlZElETGlzdCA9IE91dGVyQW5hbHlzaXNJbnZhbGlkYXRpb25NYXBbT3V0ZXJJRF07CisgICAgICAvLyBOb3RlLCB0aGlzIGlzIGEgbGluZWFyIHNjYW4uIElmIHdlIGVuZCB1cCB3aXRoIGxhcmdlIG51bWJlcnMgb2YKKyAgICAgIC8vIGFuYWx5c2VzIHRoYXQgYWxsIHRyaWdnZXIgaW52YWxpZGF0aW9uIG9uIHRoZSBzYW1lIG91dGVyIGFuYWx5c2lzLAorICAgICAgLy8gdGhpcyBlbnRpcmUgc3lzdGVtIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHNvbWUgb3RoZXIgZGV0ZXJtaW5pc3RpYworICAgICAgLy8gZGF0YSBzdHJ1Y3R1cmUgc3VjaCBhcyBhIGBTZXRWZWN0b3JgIG9mIGEgcGFpciBvZiBwb2ludGVycy4KKyAgICAgIGF1dG8gSW52YWxpZGF0ZWRJdCA9IHN0ZDo6ZmluZChJbnZhbGlkYXRlZElETGlzdC5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRhdGVkSURMaXN0LmVuZCgpLCBJbnZhbGlkYXRlZElEKTsKKyAgICAgIGlmIChJbnZhbGlkYXRlZEl0ID09IEludmFsaWRhdGVkSURMaXN0LmVuZCgpKQorICAgICAgICBJbnZhbGlkYXRlZElETGlzdC5wdXNoX2JhY2soSW52YWxpZGF0ZWRJRCk7CisgICAgfQorCisgICAgLy8vIEFjY2VzcyB0aGUgbWFwIGZyb20gb3V0ZXIgYW5hbHlzZXMgdG8gZGVmZXJyZWQgaW52YWxpZGF0aW9uIHJlcXVpcmluZworICAgIC8vLyBhbmFseXNlcy4KKyAgICBjb25zdCBTbWFsbERlbnNlTWFwPEFuYWx5c2lzS2V5ICosIFRpbnlQdHJWZWN0b3I8QW5hbHlzaXNLZXkgKj4sIDI+ICYKKyAgICBnZXRPdXRlckludmFsaWRhdGlvbnMoKSBjb25zdCB7CisgICAgICByZXR1cm4gT3V0ZXJBbmFseXNpc0ludmFsaWRhdGlvbk1hcDsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBBbmFseXNpc01hbmFnZXJUICpBTTsKKworICAgIC8vLyBBIG1hcCBmcm9tIGFuIG91dGVyIGFuYWx5c2lzIElEIHRvIHRoZSBzZXQgb2YgdGhpcyBJUi11bml0J3MgYW5hbHlzZXMKKyAgICAvLy8gd2hpY2ggbmVlZCB0byBiZSBpbnZhbGlkYXRlZC4KKyAgICBTbWFsbERlbnNlTWFwPEFuYWx5c2lzS2V5ICosIFRpbnlQdHJWZWN0b3I8QW5hbHlzaXNLZXkgKj4sIDI+CisgICAgICAgIE91dGVyQW5hbHlzaXNJbnZhbGlkYXRpb25NYXA7CisgIH07CisKKyAgT3V0ZXJBbmFseXNpc01hbmFnZXJQcm94eShjb25zdCBBbmFseXNpc01hbmFnZXJUICZBTSkgOiBBTSgmQU0pIHt9CisKKyAgLy8vIFxicmllZiBSdW4gdGhlIGFuYWx5c2lzIHBhc3MgYW5kIGNyZWF0ZSBvdXIgcHJveHkgcmVzdWx0IG9iamVjdC4KKyAgLy8vIE5vdGhpbmcgdG8gc2VlIGhlcmUsIGl0IGp1c3QgZm9yd2FyZHMgdGhlIFxjIEFNIHJlZmVyZW5jZSBpbnRvIHRoZQorICAvLy8gcmVzdWx0LgorICBSZXN1bHQgcnVuKElSVW5pdFQgJiwgQW5hbHlzaXNNYW5hZ2VyPElSVW5pdFQsIEV4dHJhQXJnVHMuLi4+ICYsCisgICAgICAgICAgICAgRXh0cmFBcmdUcy4uLikgeworICAgIHJldHVybiBSZXN1bHQoKkFNKTsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48CisgICAgICBPdXRlckFuYWx5c2lzTWFuYWdlclByb3h5PEFuYWx5c2lzTWFuYWdlclQsIElSVW5pdFQsIEV4dHJhQXJnVHMuLi4+PjsKKworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCisgIGNvbnN0IEFuYWx5c2lzTWFuYWdlclQgKkFNOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEFuYWx5c2lzTWFuYWdlclQsIHR5cGVuYW1lIElSVW5pdFQsIHR5cGVuYW1lLi4uIEV4dHJhQXJnVHM+CitBbmFseXNpc0tleQorICAgIE91dGVyQW5hbHlzaXNNYW5hZ2VyUHJveHk8QW5hbHlzaXNNYW5hZ2VyVCwgSVJVbml0VCwgRXh0cmFBcmdUcy4uLj46OktleTsKKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIE91dGVyQW5hbHlzaXNNYW5hZ2VyUHJveHk8TW9kdWxlQW5hbHlzaXNNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24+OworLy8vIFByb3ZpZGUgdGhlIFxjIE1vZHVsZUFuYWx5c2lzTWFuYWdlciB0byBcYyBGdW5jdGlvbiBwcm94eS4KK3VzaW5nIE1vZHVsZUFuYWx5c2lzTWFuYWdlckZ1bmN0aW9uUHJveHkgPQorICAgIE91dGVyQW5hbHlzaXNNYW5hZ2VyUHJveHk8TW9kdWxlQW5hbHlzaXNNYW5hZ2VyLCBGdW5jdGlvbj47CisKKy8vLyBcYnJpZWYgVHJpdmlhbCBhZGFwdG9yIHRoYXQgbWFwcyBmcm9tIGEgbW9kdWxlIHRvIGl0cyBmdW5jdGlvbnMuCisvLy8KKy8vLyBEZXNpZ25lZCB0byBhbGxvdyBjb21wb3NpdGlvbiBvZiBhIEZ1bmN0aW9uUGFzcyhNYW5hZ2VyKSBhbmQKKy8vLyBhIE1vZHVsZVBhc3NNYW5hZ2VyLCBieSBydW5uaW5nIHRoZSBGdW5jdGlvblBhc3MoTWFuYWdlcikgb3ZlciBldmVyeQorLy8vIGZ1bmN0aW9uIGluIHRoZSBtb2R1bGUuCisvLy8KKy8vLyBGdW5jdGlvbiBwYXNzZXMgcnVuIHdpdGhpbiB0aGlzIGFkYXB0b3IgY2FuIHJlbHkgb24gaGF2aW5nIGV4Y2x1c2l2ZSBhY2Nlc3MKKy8vLyB0byB0aGUgZnVuY3Rpb24gdGhleSBhcmUgcnVuIG92ZXIuIFRoZXkgc2hvdWxkIG5vdCByZWFkIG9yIG1vZGlmeSBhbnkgb3RoZXIKKy8vLyBmdW5jdGlvbnMhIE90aGVyIHRocmVhZHMgb3Igc3lzdGVtcyBtYXkgYmUgbWFuaXB1bGF0aW5nIG90aGVyIGZ1bmN0aW9ucyBpbgorLy8vIHRoZSBtb2R1bGUsIGFuZCBzbyB0aGVpciBzdGF0ZSBzaG91bGQgbmV2ZXIgYmUgcmVsaWVkIG9uLgorLy8vIEZJWE1FOiBNYWtlIHRoZSBhYm92ZSB0cnVlIGZvciBhbGwgb2YgTExWTSdzIGFjdHVhbCBwYXNzZXMsIHNvbWUgc3RpbGwKKy8vLyB2aW9sYXRlIHRoaXMgcHJpbmNpcGxlLgorLy8vCisvLy8gRnVuY3Rpb24gcGFzc2VzIGNhbiBhbHNvIHJlYWQgdGhlIG1vZHVsZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiwgYnV0IHRoZXkKKy8vLyBzaG91bGQgbm90IG1vZGlmeSB0aGF0IG1vZHVsZSBvdXRzaWRlIG9mIHRoZSB1c2UgbGlzdHMgb2YgdmFyaW91cyBnbG9iYWxzLgorLy8vIEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIHBhc3MgaXMgbm90IHBlcm1pdHRlZCB0byBhZGQgZnVuY3Rpb25zIHRvIHRoZQorLy8vIG1vZHVsZS4KKy8vLyBGSVhNRTogTWFrZSB0aGUgYWJvdmUgdHJ1ZSBmb3IgYWxsIG9mIExMVk0ncyBhY3R1YWwgcGFzc2VzLCBzb21lIHN0aWxsCisvLy8gdmlvbGF0ZSB0aGlzIHByaW5jaXBsZS4KKy8vLworLy8vIE5vdGUgdGhhdCBhbHRob3VnaCBmdW5jdGlvbiBwYXNzZXMgY2FuIGFjY2VzcyBtb2R1bGUgYW5hbHlzZXMsIG1vZHVsZQorLy8vIGFuYWx5c2VzIGFyZSBub3QgaW52YWxpZGF0ZWQgd2hpbGUgdGhlIGZ1bmN0aW9uIHBhc3NlcyBhcmUgcnVubmluZywgc28gdGhleQorLy8vIG1heSBiZSBzdGFsZS4gIEZ1bmN0aW9uIGFuYWx5c2VzIHdpbGwgbm90IGJlIHN0YWxlLgordGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uUGFzc1Q+CitjbGFzcyBNb2R1bGVUb0Z1bmN0aW9uUGFzc0FkYXB0b3IKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPE1vZHVsZVRvRnVuY3Rpb25QYXNzQWRhcHRvcjxGdW5jdGlvblBhc3NUPj4geworcHVibGljOgorICBleHBsaWNpdCBNb2R1bGVUb0Z1bmN0aW9uUGFzc0FkYXB0b3IoRnVuY3Rpb25QYXNzVCBQYXNzKQorICAgICAgOiBQYXNzKHN0ZDo6bW92ZShQYXNzKSkge30KKworICAvLy8gXGJyaWVmIFJ1bnMgdGhlIGZ1bmN0aW9uIHBhc3MgYWNyb3NzIGV2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBtb2R1bGUuCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pIHsKKyAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmRkFNID0KKyAgICAgICAgQU0uZ2V0UmVzdWx0PEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyTW9kdWxlUHJveHk+KE0pLmdldE1hbmFnZXIoKTsKKworICAgIFByZXNlcnZlZEFuYWx5c2VzIFBBID0gUHJlc2VydmVkQW5hbHlzZXM6OmFsbCgpOworICAgIGZvciAoRnVuY3Rpb24gJkYgOiBNKSB7CisgICAgICBpZiAoRi5pc0RlY2xhcmF0aW9uKCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBQcmVzZXJ2ZWRBbmFseXNlcyBQYXNzUEEgPSBQYXNzLnJ1bihGLCBGQU0pOworCisgICAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGZ1bmN0aW9uIHBhc3MgY291bGRuJ3QgaGF2ZSBpbnZhbGlkYXRlZCBhbnkgb3RoZXIKKyAgICAgIC8vIGZ1bmN0aW9uJ3MgYW5hbHlzZXMgKHRoYXQncyB0aGUgY29udHJhY3Qgb2YgYSBmdW5jdGlvbiBwYXNzKSwgc28KKyAgICAgIC8vIGRpcmVjdGx5IGhhbmRsZSB0aGUgZnVuY3Rpb24gYW5hbHlzaXMgbWFuYWdlcidzIGludmFsaWRhdGlvbiBoZXJlLgorICAgICAgRkFNLmludmFsaWRhdGUoRiwgUGFzc1BBKTsKKworICAgICAgLy8gVGhlbiBpbnRlcnNlY3QgdGhlIHByZXNlcnZlZCBzZXQgc28gdGhhdCBpbnZhbGlkYXRpb24gb2YgbW9kdWxlCisgICAgICAvLyBhbmFseXNlcyB3aWxsIGV2ZW50dWFsbHkgb2NjdXIgd2hlbiB0aGUgbW9kdWxlIHBhc3MgY29tcGxldGVzLgorICAgICAgUEEuaW50ZXJzZWN0KHN0ZDo6bW92ZShQYXNzUEEpKTsKKyAgICB9CisKKyAgICAvLyBUaGUgRnVuY3Rpb25BbmFseXNpc01hbmFnZXJNb2R1bGVQcm94eSBpcyBwcmVzZXJ2ZWQgYmVjYXVzZSAod2UgYXNzdW1lKQorICAgIC8vIHRoZSBmdW5jdGlvbiBwYXNzZXMgd2UgcmFuIGRpZG4ndCBhZGQgb3IgcmVtb3ZlIGFueSBmdW5jdGlvbnMuCisgICAgLy8KKyAgICAvLyBXZSBhbHNvIHByZXNlcnZlIGFsbCBhbmFseXNlcyBvbiBGdW5jdGlvbnMsIGJlY2F1c2Ugd2UgZGlkIGFsbCB0aGUKKyAgICAvLyBpbnZhbGlkYXRpb24gd2UgbmVlZGVkIHRvIGRvIGFib3ZlLgorICAgIFBBLnByZXNlcnZlU2V0PEFsbEFuYWx5c2VzT248RnVuY3Rpb24+PigpOworICAgIFBBLnByZXNlcnZlPEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyTW9kdWxlUHJveHk+KCk7CisgICAgcmV0dXJuIFBBOworICB9CisKK3ByaXZhdGU6CisgIEZ1bmN0aW9uUGFzc1QgUGFzczsKK307CisKKy8vLyBcYnJpZWYgQSBmdW5jdGlvbiB0byBkZWR1Y2UgYSBmdW5jdGlvbiBwYXNzIHR5cGUgYW5kIHdyYXAgaXQgaW4gdGhlCisvLy8gdGVtcGxhdGVkIGFkYXB0b3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb25QYXNzVD4KK01vZHVsZVRvRnVuY3Rpb25QYXNzQWRhcHRvcjxGdW5jdGlvblBhc3NUPgorY3JlYXRlTW9kdWxlVG9GdW5jdGlvblBhc3NBZGFwdG9yKEZ1bmN0aW9uUGFzc1QgUGFzcykgeworICByZXR1cm4gTW9kdWxlVG9GdW5jdGlvblBhc3NBZGFwdG9yPEZ1bmN0aW9uUGFzc1Q+KHN0ZDo6bW92ZShQYXNzKSk7Cit9CisKKy8vLyBcYnJpZWYgQSB1dGlsaXR5IHBhc3MgdGVtcGxhdGUgdG8gZm9yY2UgYW4gYW5hbHlzaXMgcmVzdWx0IHRvIGJlIGF2YWlsYWJsZS4KKy8vLworLy8vIElmIHRoZXJlIGFyZSBleHRyYSBhcmd1bWVudHMgYXQgdGhlIHBhc3MncyBydW4gbGV2ZWwgdGhlcmUgbWF5IGFsc28gYmUKKy8vLyBleHRyYSBhcmd1bWVudHMgdG8gdGhlIGFuYWx5c2lzIG1hbmFnZXIncyBcYyBnZXRSZXN1bHQgcm91dGluZS4gV2UgY2FuJ3QKKy8vLyBndWVzcyBob3cgdG8gZWZmZWN0aXZlbHkgbWFwIHRoZSBhcmd1bWVudHMgZnJvbSBvbmUgdG8gdGhlIG90aGVyLCBhbmQgc28KKy8vLyB0aGlzIHNwZWNpYWxpemF0aW9uIGp1c3QgaWdub3JlcyB0aGVtLgorLy8vCisvLy8gU3BlY2lmaWMgcGF0dGVybnMgb2YgcnVuLW1ldGhvZCBleHRyYSBhcmd1bWVudHMgYW5kIGFuYWx5c2lzIG1hbmFnZXIgZXh0cmEKKy8vLyBhcmd1bWVudHMgd2lsbCBoYXZlIHRvIGJlIGRlZmluZWQgYXMgYXBwcm9wcmlhdGUgc3BlY2lhbGl6YXRpb25zLgordGVtcGxhdGUgPHR5cGVuYW1lIEFuYWx5c2lzVCwgdHlwZW5hbWUgSVJVbml0VCwKKyAgICAgICAgICB0eXBlbmFtZSBBbmFseXNpc01hbmFnZXJUID0gQW5hbHlzaXNNYW5hZ2VyPElSVW5pdFQ+LAorICAgICAgICAgIHR5cGVuYW1lLi4uIEV4dHJhQXJnVHM+CitzdHJ1Y3QgUmVxdWlyZUFuYWx5c2lzUGFzcworICAgIDogUGFzc0luZm9NaXhpbjxSZXF1aXJlQW5hbHlzaXNQYXNzPEFuYWx5c2lzVCwgSVJVbml0VCwgQW5hbHlzaXNNYW5hZ2VyVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYUFyZ1RzLi4uPj4geworICAvLy8gXGJyaWVmIFJ1biB0aGlzIHBhc3Mgb3ZlciBzb21lIHVuaXQgb2YgSVIuCisgIC8vLworICAvLy8gVGhpcyBwYXNzIGNhbiBiZSBydW4gb3ZlciBhbnkgdW5pdCBvZiBJUiBhbmQgdXNlIGFueSBhbmFseXNpcyBtYW5hZ2VyCisgIC8vLyBwcm92aWRlZCB0aGV5IHNhdGlzZnkgdGhlIGJhc2ljIEFQSSByZXF1aXJlbWVudHMuIFdoZW4gdGhpcyBwYXNzIGlzCisgIC8vLyBjcmVhdGVkLCB0aGVzZSBtZXRob2RzIGNhbiBiZSBpbnN0YW50aWF0ZWQgdG8gc2F0aXNmeSB3aGF0ZXZlciB0aGUKKyAgLy8vIGNvbnRleHQgcmVxdWlyZXMuCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihJUlVuaXRUICZBcmcsIEFuYWx5c2lzTWFuYWdlclQgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFBcmdUcyAmJi4uLiBBcmdzKSB7CisgICAgKHZvaWQpQU0udGVtcGxhdGUgZ2V0UmVzdWx0PEFuYWx5c2lzVD4oQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxFeHRyYUFyZ1RzPihBcmdzKS4uLik7CisKKyAgICByZXR1cm4gUHJlc2VydmVkQW5hbHlzZXM6OmFsbCgpOworICB9Cit9OworCisvLy8gXGJyaWVmIEEgbm8tb3AgcGFzcyB0ZW1wbGF0ZSB3aGljaCBzaW1wbHkgZm9yY2VzIGEgc3BlY2lmaWMgYW5hbHlzaXMgcmVzdWx0CisvLy8gdG8gYmUgaW52YWxpZGF0ZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQW5hbHlzaXNUPgorc3RydWN0IEludmFsaWRhdGVBbmFseXNpc1Bhc3MKKyAgICA6IFBhc3NJbmZvTWl4aW48SW52YWxpZGF0ZUFuYWx5c2lzUGFzczxBbmFseXNpc1Q+PiB7CisgIC8vLyBcYnJpZWYgUnVuIHRoaXMgcGFzcyBvdmVyIHNvbWUgdW5pdCBvZiBJUi4KKyAgLy8vCisgIC8vLyBUaGlzIHBhc3MgY2FuIGJlIHJ1biBvdmVyIGFueSB1bml0IG9mIElSIGFuZCB1c2UgYW55IGFuYWx5c2lzIG1hbmFnZXIsCisgIC8vLyBwcm92aWRlZCB0aGV5IHNhdGlzZnkgdGhlIGJhc2ljIEFQSSByZXF1aXJlbWVudHMuIFdoZW4gdGhpcyBwYXNzIGlzCisgIC8vLyBjcmVhdGVkLCB0aGVzZSBtZXRob2RzIGNhbiBiZSBpbnN0YW50aWF0ZWQgdG8gc2F0aXNmeSB3aGF0ZXZlciB0aGUKKyAgLy8vIGNvbnRleHQgcmVxdWlyZXMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJUlVuaXRULCB0eXBlbmFtZSBBbmFseXNpc01hbmFnZXJULCB0eXBlbmFtZS4uLiBFeHRyYUFyZ1RzPgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oSVJVbml0VCAmQXJnLCBBbmFseXNpc01hbmFnZXJUICZBTSwgRXh0cmFBcmdUcyAmJi4uLikgeworICAgIGF1dG8gUEEgPSBQcmVzZXJ2ZWRBbmFseXNlczo6YWxsKCk7CisgICAgUEEuYWJhbmRvbjxBbmFseXNpc1Q+KCk7CisgICAgcmV0dXJuIFBBOworICB9Cit9OworCisvLy8gXGJyaWVmIEEgdXRpbGl0eSBwYXNzIHRoYXQgZG9lcyBub3RoaW5nLCBidXQgcHJlc2VydmVzIG5vIGFuYWx5c2VzLgorLy8vCisvLy8gQmVjYXVzZSB0aGlzIHByZXNlcnZlcyBubyBhbmFseXNlcywgYW55IGFuYWx5c2lzIHBhc3NlcyBxdWVyaWVkIGFmdGVyIHRoaXMKKy8vLyBwYXNzIHJ1bnMgd2lsbCByZWNvbXB1dGUgZnJlc2ggcmVzdWx0cy4KK3N0cnVjdCBJbnZhbGlkYXRlQWxsQW5hbHlzZXNQYXNzIDogUGFzc0luZm9NaXhpbjxJbnZhbGlkYXRlQWxsQW5hbHlzZXNQYXNzPiB7CisgIC8vLyBcYnJpZWYgUnVuIHRoaXMgcGFzcyBvdmVyIHNvbWUgdW5pdCBvZiBJUi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElSVW5pdFQsIHR5cGVuYW1lIEFuYWx5c2lzTWFuYWdlclQsIHR5cGVuYW1lLi4uIEV4dHJhQXJnVHM+CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihJUlVuaXRUICYsIEFuYWx5c2lzTWFuYWdlclQgJiwgRXh0cmFBcmdUcyAmJi4uLikgeworICAgIHJldHVybiBQcmVzZXJ2ZWRBbmFseXNlczo6bm9uZSgpOworICB9Cit9OworCisvLy8gQSB1dGlsaXR5IHBhc3MgdGVtcGxhdGUgdGhhdCBzaW1wbHkgcnVucyBhbm90aGVyIHBhc3MgbXVsdGlwbGUgdGltZXMuCisvLy8KKy8vLyBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcgb3IgdGVzdGluZyBwYXNzZXMuIEl0IGFsc28gc2VydmVzIGFzIGFuCisvLy8gZXhhbXBsZSBvZiBob3cgdG8gZXh0ZW5kIHRoZSBwYXNzIG1hbmFnZXIgaW4gd2F5cyBiZXlvbmQgY29tcG9zaXRpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFzc1Q+CitjbGFzcyBSZXBlYXRlZFBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxSZXBlYXRlZFBhc3M8UGFzc1Q+PiB7CitwdWJsaWM6CisgIFJlcGVhdGVkUGFzcyhpbnQgQ291bnQsIFBhc3NUIFApIDogQ291bnQoQ291bnQpLCBQKHN0ZDo6bW92ZShQKSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSVJVbml0VCwgdHlwZW5hbWUgQW5hbHlzaXNNYW5hZ2VyVCwgdHlwZW5hbWUuLi4gVHM+CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihJUlVuaXRUICZBcmcsIEFuYWx5c2lzTWFuYWdlclQgJkFNLCBUcyAmJi4uLiBBcmdzKSB7CisgICAgYXV0byBQQSA9IFByZXNlcnZlZEFuYWx5c2VzOjphbGwoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IENvdW50OyArK2kpCisgICAgICBQQS5pbnRlcnNlY3QoUC5ydW4oQXJnLCBBTSwgc3RkOjpmb3J3YXJkPFRzPihBcmdzKS4uLikpOworICAgIHJldHVybiBQQTsKKyAgfQorCitwcml2YXRlOgorICBpbnQgQ291bnQ7CisgIFBhc3NUIFA7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFzc1Q+CitSZXBlYXRlZFBhc3M8UGFzc1Q+IGNyZWF0ZVJlcGVhdGVkUGFzcyhpbnQgQ291bnQsIFBhc3NUIFApIHsKKyAgcmV0dXJuIFJlcGVhdGVkUGFzczxQYXNzVD4oQ291bnQsIHN0ZDo6bW92ZShQKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX1BBU1NNQU5BR0VSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvUGFzc01hbmFnZXJJbnRlcm5hbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9QYXNzTWFuYWdlckludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5NWQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvUGFzc01hbmFnZXJJbnRlcm5hbC5oCkBAIC0wLDAgKzEsMzA4IEBACisvLz09PS0gUGFzc01hbmFnZXIgaW50ZXJuYWwgQVBJcyBhbmQgaW1wbGVtZW50YXRpb24gZGV0YWlscyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8KKy8vLyBUaGlzIGhlYWRlciBwcm92aWRlcyBpbnRlcm5hbCBBUElzIGFuZCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHVzZWQgYnkgdGhlCisvLy8gcGFzcyBtYW5hZ2VtZW50IGludGVyZmFjZXMgZXhwb3NlZCBpbiBQYXNzTWFuYWdlci5oLiBUbyB1bmRlcnN0YW5kIG1vcmUKKy8vLyBjb250ZXh0IG9mIHdoeSB0aGVzZSBwYXJ0aWN1bGFyIGludGVyZmFjZXMgYXJlIG5lZWRlZCwgc2VlIHRoYXQgaGVhZGVyCisvLy8gZmlsZS4gTm9uZSBvZiB0aGVzZSBBUElzIHNob3VsZCBiZSB1c2VkIGVsc2V3aGVyZS4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX1BBU1NNQU5BR0VSSU5URVJOQUxfSAorI2RlZmluZSBMTFZNX0lSX1BBU1NNQU5BR0VSSU5URVJOQUxfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIElSVW5pdFQ+IGNsYXNzIEFsbEFuYWx5c2VzT247Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSVJVbml0VCwgdHlwZW5hbWUuLi4gRXh0cmFBcmdUcz4gY2xhc3MgQW5hbHlzaXNNYW5hZ2VyOworY2xhc3MgUHJlc2VydmVkQW5hbHlzZXM7CisKKy8vLyBcYnJpZWYgSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiB0aGUgcGFzcyBtYW5hZ2VyIGludGVyZmFjZXMuCituYW1lc3BhY2UgZGV0YWlsIHsKKworLy8vIFxicmllZiBUZW1wbGF0ZSBmb3IgdGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgdXNlZCB0byBkaXNwYXRjaAorLy8vIHBvbHltb3JwaGljYWxseSBvdmVyIHBhc3Mgb2JqZWN0cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJUlVuaXRULCB0eXBlbmFtZSBBbmFseXNpc01hbmFnZXJULCB0eXBlbmFtZS4uLiBFeHRyYUFyZ1RzPgorc3RydWN0IFBhc3NDb25jZXB0IHsKKyAgLy8gQm9pbGVyIHBsYXRlIG5lY2Vzc2FyeSBmb3IgdGhlIGNvbnRhaW5lciBvZiBkZXJpdmVkIGNsYXNzZXMuCisgIHZpcnR1YWwgflBhc3NDb25jZXB0KCkgPSBkZWZhdWx0OworCisgIC8vLyBcYnJpZWYgVGhlIHBvbHltb3JwaGljIEFQSSB3aGljaCBydW5zIHRoZSBwYXNzIG92ZXIgYSBnaXZlbiBJUiBlbnRpdHkuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IGFjdHVhbCBwYXNzIG9iamVjdCBjYW4gb21pdCB0aGUgYW5hbHlzaXMgbWFuYWdlciBhcmd1bWVudCBpZgorICAvLy8gZGVzaXJlZC4gQWxzbyB0aGF0IHRoZSBhbmFseXNpcyBtYW5hZ2VyIG1heSBiZSBudWxsIGlmIHRoZXJlIGlzIG5vCisgIC8vLyBhbmFseXNpcyBtYW5hZ2VyIGluIHRoZSBwYXNzIHBpcGVsaW5lLgorICB2aXJ0dWFsIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihJUlVuaXRUICZJUiwgQW5hbHlzaXNNYW5hZ2VyVCAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhQXJnVHMuLi4gRXh0cmFBcmdzKSA9IDA7CisKKyAgLy8vIFxicmllZiBQb2x5bW9ycGhpYyBtZXRob2QgdG8gYWNjZXNzIHRoZSBuYW1lIG9mIGEgcGFzcy4KKyAgdmlydHVhbCBTdHJpbmdSZWYgbmFtZSgpID0gMDsKK307CisKKy8vLyBcYnJpZWYgQSB0ZW1wbGF0ZSB3cmFwcGVyIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBwb2x5bW9ycGhpYyBBUEkuCisvLy8KKy8vLyBDYW4gYmUgaW5zdGFudGlhdGVkIGZvciBhbnkgb2JqZWN0IHdoaWNoIHByb3ZpZGVzIGEgXGMgcnVuIG1ldGhvZCBhY2NlcHRpbmcKKy8vLyBhbiBcYyBJUlVuaXRUJiBhbmQgYW4gXGMgQW5hbHlzaXNNYW5hZ2VyPElSVW5pdD4mLiBJdCByZXF1aXJlcyB0aGUgcGFzcyB0bworLy8vIGJlIGEgY29weWFibGUgb2JqZWN0LgordGVtcGxhdGUgPHR5cGVuYW1lIElSVW5pdFQsIHR5cGVuYW1lIFBhc3NULCB0eXBlbmFtZSBQcmVzZXJ2ZWRBbmFseXNlc1QsCisgICAgICAgICAgdHlwZW5hbWUgQW5hbHlzaXNNYW5hZ2VyVCwgdHlwZW5hbWUuLi4gRXh0cmFBcmdUcz4KK3N0cnVjdCBQYXNzTW9kZWwgOiBQYXNzQ29uY2VwdDxJUlVuaXRULCBBbmFseXNpc01hbmFnZXJULCBFeHRyYUFyZ1RzLi4uPiB7CisgIGV4cGxpY2l0IFBhc3NNb2RlbChQYXNzVCBQYXNzKSA6IFBhc3Moc3RkOjptb3ZlKFBhc3MpKSB7fQorICAvLyBXZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVmaW5lIGFsbCB0aGUgc3BlY2lhbCBtZW1iZXIgZnVuY3Rpb25zIGJlY2F1c2UgTVNWQworICAvLyByZWZ1c2VzIHRvIGdlbmVyYXRlIHRoZW0uCisgIFBhc3NNb2RlbChjb25zdCBQYXNzTW9kZWwgJkFyZykgOiBQYXNzKEFyZy5QYXNzKSB7fQorICBQYXNzTW9kZWwoUGFzc01vZGVsICYmQXJnKSA6IFBhc3Moc3RkOjptb3ZlKEFyZy5QYXNzKSkge30KKworICBmcmllbmQgdm9pZCBzd2FwKFBhc3NNb2RlbCAmTEhTLCBQYXNzTW9kZWwgJlJIUykgeworICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgICBzd2FwKExIUy5QYXNzLCBSSFMuUGFzcyk7CisgIH0KKworICBQYXNzTW9kZWwgJm9wZXJhdG9yPShQYXNzTW9kZWwgUkhTKSB7CisgICAgc3dhcCgqdGhpcywgUkhTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBQcmVzZXJ2ZWRBbmFseXNlc1QgcnVuKElSVW5pdFQgJklSLCBBbmFseXNpc01hbmFnZXJUICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYUFyZ1RzLi4uIEV4dHJhQXJncykgb3ZlcnJpZGUgeworICAgIHJldHVybiBQYXNzLnJ1bihJUiwgQU0sIEV4dHJhQXJncy4uLik7CisgIH0KKworICBTdHJpbmdSZWYgbmFtZSgpIG92ZXJyaWRlIHsgcmV0dXJuIFBhc3NUOjpuYW1lKCk7IH0KKworICBQYXNzVCBQYXNzOworfTsKKworLy8vIFxicmllZiBBYnN0cmFjdCBjb25jZXB0IG9mIGFuIGFuYWx5c2lzIHJlc3VsdC4KKy8vLworLy8vIFRoaXMgY29uY2VwdCBpcyBwYXJhbWV0ZXJpemVkIG92ZXIgdGhlIElSIHVuaXQgdGhhdCB0aGlzIHJlc3VsdCBwZXJ0YWlucworLy8vIHRvLgordGVtcGxhdGUgPHR5cGVuYW1lIElSVW5pdFQsIHR5cGVuYW1lIFByZXNlcnZlZEFuYWx5c2VzVCwgdHlwZW5hbWUgSW52YWxpZGF0b3JUPgorc3RydWN0IEFuYWx5c2lzUmVzdWx0Q29uY2VwdCB7CisgIHZpcnR1YWwgfkFuYWx5c2lzUmVzdWx0Q29uY2VwdCgpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIE1ldGhvZCB0byB0cnkgYW5kIG1hcmsgYSByZXN1bHQgYXMgaW52YWxpZC4KKyAgLy8vCisgIC8vLyBXaGVuIHRoZSBvdXRlciBhbmFseXNpcyBtYW5hZ2VyIGRldGVjdHMgYSBjaGFuZ2UgaW4gc29tZSB1bmRlcmx5aW5nCisgIC8vLyB1bml0IG9mIHRoZSBJUiwgaXQgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIG9uIGFsbCBvZiB0aGUgcmVzdWx0cyBjYWNoZWQuCisgIC8vLworICAvLy8gXHAgUEEgaXMgYSBzZXQgb2YgcHJlc2VydmVkIGFuYWx5c2VzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGF2b2lkCisgIC8vLyBpbnZhbGlkYXRpb24gYmVjYXVzZSB0aGUgcGFzcyB3aGljaCBjaGFuZ2VkIHRoZSB1bmRlcmx5aW5nIElSIHRvb2sgY2FyZQorICAvLy8gdG8gdXBkYXRlIG9yIHByZXNlcnZlIHRoZSBhbmFseXNpcyByZXN1bHQgaW4gc29tZSB3YXkuCisgIC8vLworICAvLy8gXHAgSW52IGlzIHR5cGljYWxseSBhIFxjIEFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3Igb2JqZWN0IHRoYXQgY2FuIGJlCisgIC8vLyB1c2VkIGJ5IGEgcGFydGljdWxhciBhbmFseXNpcyByZXN1bHQgdG8gZGlzY292ZXIgaWYgb3RoZXIgYW5hbHlzZXMKKyAgLy8vIHJlc3VsdHMgYXJlIGFsc28gaW52YWxpZGF0ZWQgaW4gdGhlIGV2ZW50IHRoYXQgdGhpcyByZXN1bHQgZGVwZW5kcyBvbgorICAvLy8gdGhlbS4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGluIHRoZSBcYyBBbmFseXNpc01hbmFnZXIgZm9yIG1vcmUgZGV0YWlscy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZSByZXN1bHQgaXMgaW5kZWVkIGludmFsaWQgKHRoZSBkZWZhdWx0KS4KKyAgdmlydHVhbCBib29sIGludmFsaWRhdGUoSVJVbml0VCAmSVIsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzVCAmUEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRhdG9yVCAmSW52KSA9IDA7Cit9OworCisvLy8gXGJyaWVmIFNGSU5BRSBtZXRhZnVuY3Rpb24gZm9yIGNvbXB1dGluZyB3aGV0aGVyIFxjIFJlc3VsdFQgcHJvdmlkZXMgYW4KKy8vLyBcYyBpbnZhbGlkYXRlIG1lbWJlciBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJUlVuaXRULCB0eXBlbmFtZSBSZXN1bHRUPiBjbGFzcyBSZXN1bHRIYXNJbnZhbGlkYXRlTWV0aG9kIHsKKyAgdXNpbmcgRW5hYmxlZFR5cGUgPSBjaGFyOworICBzdHJ1Y3QgRGlzYWJsZWRUeXBlIHsKKyAgICBjaGFyIGEsIGI7CisgIH07CisKKyAgLy8gUHVyZWx5IHRvIGhlbHAgb3V0IE1TVkMgd2hpY2ggZmFpbHMgdG8gZGlzYWJsZSB0aGUgYmVsb3cgc3BlY2lhbGl6YXRpb24sCisgIC8vIGV4cGxpY2l0bHkgZW5hYmxlIHVzaW5nIHRoZSByZXN1bHQgdHlwZSdzIGludmFsaWRhdGUgcm91dGluZSBpZiB3ZSBjYW4KKyAgLy8gc3VjY2Vzc2Z1bGx5IGNhbGwgdGhhdCByb3V0aW5lLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IE5vbmNlIHsgdXNpbmcgVHlwZSA9IEVuYWJsZWRUeXBlOyB9OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RhdGljIHR5cGVuYW1lIE5vbmNlPGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxUPigpLmludmFsaWRhdGUoCisgICAgICBzdGQ6OmRlY2x2YWw8SVJVbml0VCAmPigpLCBzdGQ6OmRlY2x2YWw8UHJlc2VydmVkQW5hbHlzZXM+KCkpKT46OlR5cGUKKyAgICAgIGNoZWNrKHJhbms8Mj4pOworCisgIC8vIEZpcnN0IHdlIGRlZmluZSBhbiBvdmVybG9hZCB0aGF0IGNhbiBvbmx5IGJlIHRha2VuIGlmIHRoZXJlIGlzIG5vCisgIC8vIGludmFsaWRhdGUgbWVtYmVyLiBXZSBkbyB0aGlzIGJ5IHRha2luZyB0aGUgYWRkcmVzcyBvZiBhbiBpbnZhbGlkYXRlCisgIC8vIG1lbWJlciBpbiBhbiBhZGphY2VudCBiYXNlIGNsYXNzIG9mIGEgZGVyaXZlZCBjbGFzcy4gVGhpcyB3b3VsZCBiZQorICAvLyBhbWJpZ3VvdXMgaWYgdGhlcmUgd2VyZSBhbiBpbnZhbGlkYXRlIG1lbWJlciBpbiB0aGUgcmVzdWx0IHR5cGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPiBzdGF0aWMgRGlzYWJsZWRUeXBlIE5vbmNlRnVuY3Rpb24oVCBVOjoqKTsKKyAgc3RydWN0IENoZWNrZXJCYXNlIHsgaW50IGludmFsaWRhdGU7IH07CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgQ2hlY2tlciA6IENoZWNrZXJCYXNlLCBUIHt9OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RhdGljIGRlY2x0eXBlKE5vbmNlRnVuY3Rpb24oJkNoZWNrZXI8VD46OmludmFsaWRhdGUpKSBjaGVjayhyYW5rPDE+KTsKKworICAvLyBOb3cgd2UgaGF2ZSB0aGUgZmFsbGJhY2sgdGhhdCB3aWxsIG9ubHkgYmUgcmVhY2hlZCB3aGVuIHRoZXJlIGlzIGFuCisgIC8vIGludmFsaWRhdGUgbWVtYmVyLCBhbmQgZW5hYmxlcyB0aGUgdHJhaXQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgRW5hYmxlZFR5cGUgY2hlY2socmFuazwwPik7CisKK3B1YmxpYzoKKyAgZW51bSB7IFZhbHVlID0gc2l6ZW9mKGNoZWNrPFJlc3VsdFQ+KHJhbms8Mj4oKSkpID09IHNpemVvZihFbmFibGVkVHlwZSkgfTsKK307CisKKy8vLyBcYnJpZWYgV3JhcHBlciB0byBtb2RlbCB0aGUgYW5hbHlzaXMgcmVzdWx0IGNvbmNlcHQuCisvLy8KKy8vLyBCeSBkZWZhdWx0LCB0aGlzIHdpbGwgaW1wbGVtZW50IHRoZSBpbnZhbGlkYXRlIG1ldGhvZCB3aXRoIGEgdHJpdmlhbAorLy8vIGltcGxlbWVudGF0aW9uIHNvIHRoYXQgdGhlIGFjdHVhbCBhbmFseXNpcyByZXN1bHQgZG9lc24ndCBuZWVkIHRvIHByb3ZpZGUKKy8vLyBhbiBpbnZhbGlkYXRpb24gaGFuZGxlci4gSXQgaXMgb25seSBzZWxlY3RlZCB3aGVuIHRoZSBpbnZhbGlkYXRpb24gaGFuZGxlcgorLy8vIGlzIG5vdCBwYXJ0IG9mIHRoZSBSZXN1bHRUJ3MgaW50ZXJmYWNlLgordGVtcGxhdGUgPHR5cGVuYW1lIElSVW5pdFQsIHR5cGVuYW1lIFBhc3NULCB0eXBlbmFtZSBSZXN1bHRULAorICAgICAgICAgIHR5cGVuYW1lIFByZXNlcnZlZEFuYWx5c2VzVCwgdHlwZW5hbWUgSW52YWxpZGF0b3JULAorICAgICAgICAgIGJvb2wgSGFzSW52YWxpZGF0ZUhhbmRsZXIgPQorICAgICAgICAgICAgICBSZXN1bHRIYXNJbnZhbGlkYXRlTWV0aG9kPElSVW5pdFQsIFJlc3VsdFQ+OjpWYWx1ZT4KK3N0cnVjdCBBbmFseXNpc1Jlc3VsdE1vZGVsOworCisvLy8gXGJyaWVmIFNwZWNpYWxpemF0aW9uIG9mIFxjIEFuYWx5c2lzUmVzdWx0TW9kZWwgd2hpY2ggcHJvdmlkZXMgdGhlIGRlZmF1bHQKKy8vLyBpbnZhbGlkYXRlIGZ1bmN0aW9uYWxpdHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSVJVbml0VCwgdHlwZW5hbWUgUGFzc1QsIHR5cGVuYW1lIFJlc3VsdFQsCisgICAgICAgICAgdHlwZW5hbWUgUHJlc2VydmVkQW5hbHlzZXNULCB0eXBlbmFtZSBJbnZhbGlkYXRvclQ+CitzdHJ1Y3QgQW5hbHlzaXNSZXN1bHRNb2RlbDxJUlVuaXRULCBQYXNzVCwgUmVzdWx0VCwgUHJlc2VydmVkQW5hbHlzZXNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZGF0b3JULCBmYWxzZT4KKyAgICA6IEFuYWx5c2lzUmVzdWx0Q29uY2VwdDxJUlVuaXRULCBQcmVzZXJ2ZWRBbmFseXNlc1QsIEludmFsaWRhdG9yVD4geworICBleHBsaWNpdCBBbmFseXNpc1Jlc3VsdE1vZGVsKFJlc3VsdFQgUmVzdWx0KSA6IFJlc3VsdChzdGQ6Om1vdmUoUmVzdWx0KSkge30KKyAgLy8gV2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlZmluZSBhbGwgdGhlIHNwZWNpYWwgbWVtYmVyIGZ1bmN0aW9ucyBiZWNhdXNlIE1TVkMKKyAgLy8gcmVmdXNlcyB0byBnZW5lcmF0ZSB0aGVtLgorICBBbmFseXNpc1Jlc3VsdE1vZGVsKGNvbnN0IEFuYWx5c2lzUmVzdWx0TW9kZWwgJkFyZykgOiBSZXN1bHQoQXJnLlJlc3VsdCkge30KKyAgQW5hbHlzaXNSZXN1bHRNb2RlbChBbmFseXNpc1Jlc3VsdE1vZGVsICYmQXJnKQorICAgICAgOiBSZXN1bHQoc3RkOjptb3ZlKEFyZy5SZXN1bHQpKSB7fQorCisgIGZyaWVuZCB2b2lkIHN3YXAoQW5hbHlzaXNSZXN1bHRNb2RlbCAmTEhTLCBBbmFseXNpc1Jlc3VsdE1vZGVsICZSSFMpIHsKKyAgICB1c2luZyBzdGQ6OnN3YXA7CisgICAgc3dhcChMSFMuUmVzdWx0LCBSSFMuUmVzdWx0KTsKKyAgfQorCisgIEFuYWx5c2lzUmVzdWx0TW9kZWwgJm9wZXJhdG9yPShBbmFseXNpc1Jlc3VsdE1vZGVsIFJIUykgeworICAgIHN3YXAoKnRoaXMsIFJIUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBUaGUgbW9kZWwgYmFzZXMgaW52YWxpZGF0aW9uIHNvbGVseSBvbiBiZWluZyBpbiB0aGUgcHJlc2VydmVkIHNldC4KKyAgLy8KKyAgLy8gRklYTUU6IFdlIHNob3VsZCBhY3R1YWxseSB1c2UgdHdvIGRpZmZlcmVudCBjb25jZXB0cyBmb3IgYW5hbHlzaXMgcmVzdWx0cworICAvLyByYXRoZXIgdGhhbiB0d28gZGlmZmVyZW50IG1vZGVscywgYW5kIGF2b2lkIHRoZSBpbmRpcmVjdCBmdW5jdGlvbiBjYWxsIGZvcgorICAvLyBvbmVzIHRoYXQgdXNlIHRoZSB0cml2aWFsIGJlaGF2aW9yLgorICBib29sIGludmFsaWRhdGUoSVJVbml0VCAmLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlc1QgJlBBLAorICAgICAgICAgICAgICAgICAgSW52YWxpZGF0b3JUICYpIG92ZXJyaWRlIHsKKyAgICBhdXRvIFBBQyA9IFBBLnRlbXBsYXRlIGdldENoZWNrZXI8UGFzc1Q+KCk7CisgICAgcmV0dXJuICFQQUMucHJlc2VydmVkKCkgJiYKKyAgICAgICAgICAgIVBBQy50ZW1wbGF0ZSBwcmVzZXJ2ZWRTZXQ8QWxsQW5hbHlzZXNPbjxJUlVuaXRUPj4oKTsKKyAgfQorCisgIFJlc3VsdFQgUmVzdWx0OworfTsKKworLy8vIFxicmllZiBTcGVjaWFsaXphdGlvbiBvZiBcYyBBbmFseXNpc1Jlc3VsdE1vZGVsIHdoaWNoIGRlbGVnYXRlcyBpbnZhbGlkYXRlCisvLy8gaGFuZGxpbmcgdG8gXGMgUmVzdWx0VC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJUlVuaXRULCB0eXBlbmFtZSBQYXNzVCwgdHlwZW5hbWUgUmVzdWx0VCwKKyAgICAgICAgICB0eXBlbmFtZSBQcmVzZXJ2ZWRBbmFseXNlc1QsIHR5cGVuYW1lIEludmFsaWRhdG9yVD4KK3N0cnVjdCBBbmFseXNpc1Jlc3VsdE1vZGVsPElSVW5pdFQsIFBhc3NULCBSZXN1bHRULCBQcmVzZXJ2ZWRBbmFseXNlc1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkYXRvclQsIHRydWU+CisgICAgOiBBbmFseXNpc1Jlc3VsdENvbmNlcHQ8SVJVbml0VCwgUHJlc2VydmVkQW5hbHlzZXNULCBJbnZhbGlkYXRvclQ+IHsKKyAgZXhwbGljaXQgQW5hbHlzaXNSZXN1bHRNb2RlbChSZXN1bHRUIFJlc3VsdCkgOiBSZXN1bHQoc3RkOjptb3ZlKFJlc3VsdCkpIHt9CisgIC8vIFdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWZpbmUgYWxsIHRoZSBzcGVjaWFsIG1lbWJlciBmdW5jdGlvbnMgYmVjYXVzZSBNU1ZDCisgIC8vIHJlZnVzZXMgdG8gZ2VuZXJhdGUgdGhlbS4KKyAgQW5hbHlzaXNSZXN1bHRNb2RlbChjb25zdCBBbmFseXNpc1Jlc3VsdE1vZGVsICZBcmcpIDogUmVzdWx0KEFyZy5SZXN1bHQpIHt9CisgIEFuYWx5c2lzUmVzdWx0TW9kZWwoQW5hbHlzaXNSZXN1bHRNb2RlbCAmJkFyZykKKyAgICAgIDogUmVzdWx0KHN0ZDo6bW92ZShBcmcuUmVzdWx0KSkge30KKworICBmcmllbmQgdm9pZCBzd2FwKEFuYWx5c2lzUmVzdWx0TW9kZWwgJkxIUywgQW5hbHlzaXNSZXN1bHRNb2RlbCAmUkhTKSB7CisgICAgdXNpbmcgc3RkOjpzd2FwOworICAgIHN3YXAoTEhTLlJlc3VsdCwgUkhTLlJlc3VsdCk7CisgIH0KKworICBBbmFseXNpc1Jlc3VsdE1vZGVsICZvcGVyYXRvcj0oQW5hbHlzaXNSZXN1bHRNb2RlbCBSSFMpIHsKKyAgICBzd2FwKCp0aGlzLCBSSFMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGhlIG1vZGVsIGRlbGVnYXRlcyB0byB0aGUgXGMgUmVzdWx0VCBtZXRob2QuCisgIGJvb2wgaW52YWxpZGF0ZShJUlVuaXRUICZJUiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXNUICZQQSwKKyAgICAgICAgICAgICAgICAgIEludmFsaWRhdG9yVCAmSW52KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIFJlc3VsdC5pbnZhbGlkYXRlKElSLCBQQSwgSW52KTsKKyAgfQorCisgIFJlc3VsdFQgUmVzdWx0OworfTsKKworLy8vIFxicmllZiBBYnN0cmFjdCBjb25jZXB0IG9mIGFuIGFuYWx5c2lzIHBhc3MuCisvLy8KKy8vLyBUaGlzIGNvbmNlcHQgaXMgcGFyYW1ldGVyaXplZCBvdmVyIHRoZSBJUiB1bml0IHRoYXQgaXQgY2FuIHJ1biBvdmVyIGFuZAorLy8vIHByb2R1Y2UgYW4gYW5hbHlzaXMgcmVzdWx0LgordGVtcGxhdGUgPHR5cGVuYW1lIElSVW5pdFQsIHR5cGVuYW1lIFByZXNlcnZlZEFuYWx5c2VzVCwgdHlwZW5hbWUgSW52YWxpZGF0b3JULAorICAgICAgICAgIHR5cGVuYW1lLi4uIEV4dHJhQXJnVHM+CitzdHJ1Y3QgQW5hbHlzaXNQYXNzQ29uY2VwdCB7CisgIHZpcnR1YWwgfkFuYWx5c2lzUGFzc0NvbmNlcHQoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBNZXRob2QgdG8gcnVuIHRoaXMgYW5hbHlzaXMgb3ZlciBhIHVuaXQgb2YgSVIuCisgIC8vLyBccmV0dXJucyBBIHVuaXF1ZV9wdHIgdG8gdGhlIGFuYWx5c2lzIHJlc3VsdCBvYmplY3QgdG8gYmUgcXVlcmllZCBieQorICAvLy8gdXNlcnMuCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPAorICAgICAgQW5hbHlzaXNSZXN1bHRDb25jZXB0PElSVW5pdFQsIFByZXNlcnZlZEFuYWx5c2VzVCwgSW52YWxpZGF0b3JUPj4KKyAgcnVuKElSVW5pdFQgJklSLCBBbmFseXNpc01hbmFnZXI8SVJVbml0VCwgRXh0cmFBcmdUcy4uLj4gJkFNLAorICAgICAgRXh0cmFBcmdUcy4uLiBFeHRyYUFyZ3MpID0gMDsKKworICAvLy8gXGJyaWVmIFBvbHltb3JwaGljIG1ldGhvZCB0byBhY2Nlc3MgdGhlIG5hbWUgb2YgYSBwYXNzLgorICB2aXJ0dWFsIFN0cmluZ1JlZiBuYW1lKCkgPSAwOworfTsKKworLy8vIFxicmllZiBXcmFwcGVyIHRvIG1vZGVsIHRoZSBhbmFseXNpcyBwYXNzIGNvbmNlcHQuCisvLy8KKy8vLyBDYW4gd3JhcCBhbnkgdHlwZSB3aGljaCBpbXBsZW1lbnRzIGEgc3VpdGFibGUgXGMgcnVuIG1ldGhvZC4gVGhlIG1ldGhvZAorLy8vIG11c3QgYWNjZXB0IGFuIFxjIElSVW5pdFQmIGFuZCBhbiBcYyBBbmFseXNpc01hbmFnZXI8SVJVbml0VD4mIGFzIGFyZ3VtZW50cworLy8vIGFuZCBwcm9kdWNlIGFuIG9iamVjdCB3aGljaCBjYW4gYmUgd3JhcHBlZCBpbiBhIFxjIEFuYWx5c2lzUmVzdWx0TW9kZWwuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSVJVbml0VCwgdHlwZW5hbWUgUGFzc1QsIHR5cGVuYW1lIFByZXNlcnZlZEFuYWx5c2VzVCwKKyAgICAgICAgICB0eXBlbmFtZSBJbnZhbGlkYXRvclQsIHR5cGVuYW1lLi4uIEV4dHJhQXJnVHM+CitzdHJ1Y3QgQW5hbHlzaXNQYXNzTW9kZWwgOiBBbmFseXNpc1Bhc3NDb25jZXB0PElSVW5pdFQsIFByZXNlcnZlZEFuYWx5c2VzVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZGF0b3JULCBFeHRyYUFyZ1RzLi4uPiB7CisgIGV4cGxpY2l0IEFuYWx5c2lzUGFzc01vZGVsKFBhc3NUIFBhc3MpIDogUGFzcyhzdGQ6Om1vdmUoUGFzcykpIHt9CisgIC8vIFdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWZpbmUgYWxsIHRoZSBzcGVjaWFsIG1lbWJlciBmdW5jdGlvbnMgYmVjYXVzZSBNU1ZDCisgIC8vIHJlZnVzZXMgdG8gZ2VuZXJhdGUgdGhlbS4KKyAgQW5hbHlzaXNQYXNzTW9kZWwoY29uc3QgQW5hbHlzaXNQYXNzTW9kZWwgJkFyZykgOiBQYXNzKEFyZy5QYXNzKSB7fQorICBBbmFseXNpc1Bhc3NNb2RlbChBbmFseXNpc1Bhc3NNb2RlbCAmJkFyZykgOiBQYXNzKHN0ZDo6bW92ZShBcmcuUGFzcykpIHt9CisKKyAgZnJpZW5kIHZvaWQgc3dhcChBbmFseXNpc1Bhc3NNb2RlbCAmTEhTLCBBbmFseXNpc1Bhc3NNb2RlbCAmUkhTKSB7CisgICAgdXNpbmcgc3RkOjpzd2FwOworICAgIHN3YXAoTEhTLlBhc3MsIFJIUy5QYXNzKTsKKyAgfQorCisgIEFuYWx5c2lzUGFzc01vZGVsICZvcGVyYXRvcj0oQW5hbHlzaXNQYXNzTW9kZWwgUkhTKSB7CisgICAgc3dhcCgqdGhpcywgUkhTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBGSVhNRTogUmVwbGFjZSBQYXNzVDo6UmVzdWx0IHdpdGggdHlwZSB0cmFpdHMgd2hlbiB3ZSB1c2UgQysrMTEuCisgIHVzaW5nIFJlc3VsdE1vZGVsVCA9CisgICAgICBBbmFseXNpc1Jlc3VsdE1vZGVsPElSVW5pdFQsIFBhc3NULCB0eXBlbmFtZSBQYXNzVDo6UmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVzZXJ2ZWRBbmFseXNlc1QsIEludmFsaWRhdG9yVD47CisKKyAgLy8vIFxicmllZiBUaGUgbW9kZWwgZGVsZWdhdGVzIHRvIHRoZSBcYyBQYXNzVDo6cnVuIG1ldGhvZC4KKyAgLy8vCisgIC8vLyBUaGUgcmV0dXJuIGlzIHdyYXBwZWQgaW4gYW4gXGMgQW5hbHlzaXNSZXN1bHRNb2RlbC4KKyAgc3RkOjp1bmlxdWVfcHRyPAorICAgICAgQW5hbHlzaXNSZXN1bHRDb25jZXB0PElSVW5pdFQsIFByZXNlcnZlZEFuYWx5c2VzVCwgSW52YWxpZGF0b3JUPj4KKyAgcnVuKElSVW5pdFQgJklSLCBBbmFseXNpc01hbmFnZXI8SVJVbml0VCwgRXh0cmFBcmdUcy4uLj4gJkFNLAorICAgICAgRXh0cmFBcmdUcy4uLiBFeHRyYUFyZ3MpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZV91bmlxdWU8UmVzdWx0TW9kZWxUPihQYXNzLnJ1bihJUiwgQU0sIEV4dHJhQXJncy4uLikpOworICB9CisKKyAgLy8vIFxicmllZiBUaGUgbW9kZWwgZGVsZWdhdGVzIHRvIGEgc3RhdGljIFxjIFBhc3NUOjpuYW1lIG1ldGhvZC4KKyAgLy8vCisgIC8vLyBUaGUgcmV0dXJuZWQgc3RyaW5nIHJlZiBtdXN0IHBvaW50IHRvIGNvbnN0YW50IGltbXV0YWJsZSBkYXRhIQorICBTdHJpbmdSZWYgbmFtZSgpIG92ZXJyaWRlIHsgcmV0dXJuIFBhc3NUOjpuYW1lKCk7IH0KKworICBQYXNzVCBQYXNzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9QQVNTTUFOQUdFUklOVEVSTkFMX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvUGF0dGVybk1hdGNoLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1BhdHRlcm5NYXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGI4NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1BhdHRlcm5NYXRjaC5oCkBAIC0wLDAgKzEsMTczNiBAQAorLy89PT0tIFBhdHRlcm5NYXRjaC5oIC0gTWF0Y2ggb24gdGhlIExMVk0gSVIgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgYSBzaW1wbGUgYW5kIGVmZmljaWVudCBtZWNoYW5pc20gZm9yIHBlcmZvcm1pbmcgZ2VuZXJhbAorLy8gdHJlZS1iYXNlZCBwYXR0ZXJuIG1hdGNoZXMgb24gdGhlIExMVk0gSVIuIFRoZSBwb3dlciBvZiB0aGVzZSByb3V0aW5lcyBpcworLy8gdGhhdCBpdCBhbGxvd3MgeW91IHRvIHdyaXRlIGNvbmNpc2UgcGF0dGVybnMgdGhhdCBhcmUgZXhwcmVzc2l2ZSBhbmQgZWFzeSB0bworLy8gdW5kZXJzdGFuZC4gVGhlIG90aGVyIG1ham9yIGFkdmFudGFnZSBvZiB0aGlzIGlzIHRoYXQgaXQgYWxsb3dzIHlvdSB0bworLy8gdHJpdmlhbGx5IGNhcHR1cmUvYmluZCBlbGVtZW50cyBpbiB0aGUgcGF0dGVybiB0byB2YXJpYWJsZXMuIEZvciBleGFtcGxlLAorLy8geW91IGNhbiBkbyBzb21ldGhpbmcgbGlrZSB0aGlzOgorLy8KKy8vICBWYWx1ZSAqRXhwID0gLi4uCisvLyAgVmFsdWUgKlgsICpZOyAgQ29uc3RhbnRJbnQgKkMxLCAqQzI7ICAgICAgLy8gKFggJiBDMSkgfCAoWSAmIEMyKQorLy8gIGlmIChtYXRjaChFeHAsIG1fT3IobV9BbmQobV9WYWx1ZShYKSwgbV9Db25zdGFudEludChDMSkpLAorLy8gICAgICAgICAgICAgICAgICAgICAgbV9BbmQobV9WYWx1ZShZKSwgbV9Db25zdGFudEludChDMikpKSkpIHsKKy8vICAgIC4uLiBQYXR0ZXJuIGlzIG1hdGNoZWQgYW5kIHZhcmlhYmxlcyBhcmUgYm91bmQgLi4uCisvLyAgfQorLy8KKy8vIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCB0byB0aGluZ3MgbGlrZSB0aGUgaW5zdHJ1Y3Rpb24gY29tYmluZXIsIGJ1dCBjYW4KKy8vIGFsc28gYmUgdXNlZnVsIGZvciBzdGF0aWMgYW5hbHlzaXMgdG9vbHMgb3IgY29kZSBnZW5lcmF0b3JzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9QQVRURVJOTUFUQ0hfSAorI2RlZmluZSBMTFZNX0lSX1BBVFRFUk5NQVRDSF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEZsb2F0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudC5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0clR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9PcGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBQYXR0ZXJuTWF0Y2ggeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsLCB0eXBlbmFtZSBQYXR0ZXJuPiBib29sIG1hdGNoKFZhbCAqViwgY29uc3QgUGF0dGVybiAmUCkgeworICByZXR1cm4gY29uc3RfY2FzdDxQYXR0ZXJuICY+KFApLm1hdGNoKFYpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3ViUGF0dGVybl90PiBzdHJ1Y3QgT25lVXNlX21hdGNoIHsKKyAgU3ViUGF0dGVybl90IFN1YlBhdHRlcm47CisKKyAgT25lVXNlX21hdGNoKGNvbnN0IFN1YlBhdHRlcm5fdCAmU1ApIDogU3ViUGF0dGVybihTUCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4gYm9vbCBtYXRjaChPcFR5ICpWKSB7CisgICAgcmV0dXJuIFYtPmhhc09uZVVzZSgpICYmIFN1YlBhdHRlcm4ubWF0Y2goVik7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBpbmxpbmUgT25lVXNlX21hdGNoPFQ+IG1fT25lVXNlKGNvbnN0IFQgJlN1YlBhdHRlcm4pIHsKKyAgcmV0dXJuIFN1YlBhdHRlcm47Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcz4gc3RydWN0IGNsYXNzX21hdGNoIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElUeT4gYm9vbCBtYXRjaChJVHkgKlYpIHsgcmV0dXJuIGlzYTxDbGFzcz4oVik7IH0KK307CisKKy8vLyBNYXRjaCBhbiBhcmJpdHJhcnkgdmFsdWUgYW5kIGlnbm9yZSBpdC4KK2lubGluZSBjbGFzc19tYXRjaDxWYWx1ZT4gbV9WYWx1ZSgpIHsgcmV0dXJuIGNsYXNzX21hdGNoPFZhbHVlPigpOyB9CisKKy8vLyBNYXRjaCBhbiBhcmJpdHJhcnkgYmluYXJ5IG9wZXJhdGlvbiBhbmQgaWdub3JlIGl0LgoraW5saW5lIGNsYXNzX21hdGNoPEJpbmFyeU9wZXJhdG9yPiBtX0Jpbk9wKCkgeworICByZXR1cm4gY2xhc3NfbWF0Y2g8QmluYXJ5T3BlcmF0b3I+KCk7Cit9CisKKy8vLyBNYXRjaGVzIGFueSBjb21wYXJlIGluc3RydWN0aW9uIGFuZCBpZ25vcmUgaXQuCitpbmxpbmUgY2xhc3NfbWF0Y2g8Q21wSW5zdD4gbV9DbXAoKSB7IHJldHVybiBjbGFzc19tYXRjaDxDbXBJbnN0PigpOyB9CisKKy8vLyBNYXRjaCBhbiBhcmJpdHJhcnkgQ29uc3RhbnRJbnQgYW5kIGlnbm9yZSBpdC4KK2lubGluZSBjbGFzc19tYXRjaDxDb25zdGFudEludD4gbV9Db25zdGFudEludCgpIHsKKyAgcmV0dXJuIGNsYXNzX21hdGNoPENvbnN0YW50SW50PigpOworfQorCisvLy8gTWF0Y2ggYW4gYXJiaXRyYXJ5IHVuZGVmIGNvbnN0YW50LgoraW5saW5lIGNsYXNzX21hdGNoPFVuZGVmVmFsdWU+IG1fVW5kZWYoKSB7IHJldHVybiBjbGFzc19tYXRjaDxVbmRlZlZhbHVlPigpOyB9CisKKy8vLyBNYXRjaCBhbiBhcmJpdHJhcnkgQ29uc3RhbnQgYW5kIGlnbm9yZSBpdC4KK2lubGluZSBjbGFzc19tYXRjaDxDb25zdGFudD4gbV9Db25zdGFudCgpIHsgcmV0dXJuIGNsYXNzX21hdGNoPENvbnN0YW50PigpOyB9CisKKy8vLyBNYXRjaGluZyBjb21iaW5hdG9ycwordGVtcGxhdGUgPHR5cGVuYW1lIExUeSwgdHlwZW5hbWUgUlR5PiBzdHJ1Y3QgbWF0Y2hfY29tYmluZV9vciB7CisgIExUeSBMOworICBSVHkgUjsKKworICBtYXRjaF9jb21iaW5lX29yKGNvbnN0IExUeSAmTGVmdCwgY29uc3QgUlR5ICZSaWdodCkgOiBMKExlZnQpLCBSKFJpZ2h0KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJVHk+IGJvb2wgbWF0Y2goSVR5ICpWKSB7CisgICAgaWYgKEwubWF0Y2goVikpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoUi5tYXRjaChWKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIExUeSwgdHlwZW5hbWUgUlR5PiBzdHJ1Y3QgbWF0Y2hfY29tYmluZV9hbmQgeworICBMVHkgTDsKKyAgUlR5IFI7CisKKyAgbWF0Y2hfY29tYmluZV9hbmQoY29uc3QgTFR5ICZMZWZ0LCBjb25zdCBSVHkgJlJpZ2h0KSA6IEwoTGVmdCksIFIoUmlnaHQpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElUeT4gYm9vbCBtYXRjaChJVHkgKlYpIHsKKyAgICBpZiAoTC5tYXRjaChWKSkKKyAgICAgIGlmIChSLm1hdGNoKFYpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8vLyBDb21iaW5lIHR3byBwYXR0ZXJuIG1hdGNoZXJzIG1hdGNoaW5nIEwgfHwgUgordGVtcGxhdGUgPHR5cGVuYW1lIExUeSwgdHlwZW5hbWUgUlR5PgoraW5saW5lIG1hdGNoX2NvbWJpbmVfb3I8TFR5LCBSVHk+IG1fQ29tYmluZU9yKGNvbnN0IExUeSAmTCwgY29uc3QgUlR5ICZSKSB7CisgIHJldHVybiBtYXRjaF9jb21iaW5lX29yPExUeSwgUlR5PihMLCBSKTsKK30KKworLy8vIENvbWJpbmUgdHdvIHBhdHRlcm4gbWF0Y2hlcnMgbWF0Y2hpbmcgTCAmJiBSCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTFR5LCB0eXBlbmFtZSBSVHk+CitpbmxpbmUgbWF0Y2hfY29tYmluZV9hbmQ8TFR5LCBSVHk+IG1fQ29tYmluZUFuZChjb25zdCBMVHkgJkwsIGNvbnN0IFJUeSAmUikgeworICByZXR1cm4gbWF0Y2hfY29tYmluZV9hbmQ8TFR5LCBSVHk+KEwsIFIpOworfQorCitzdHJ1Y3QgbWF0Y2hfemVybyB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJVHk+IGJvb2wgbWF0Y2goSVR5ICpWKSB7CisgICAgaWYgKGNvbnN0IGF1dG8gKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgICByZXR1cm4gQy0+aXNOdWxsVmFsdWUoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8vLyBNYXRjaCBhbiBhcmJpdHJhcnkgemVyby9udWxsIGNvbnN0YW50LiBUaGlzIGluY2x1ZGVzCisvLy8gemVyb19pbml0aWFsaXplciBmb3IgdmVjdG9ycyBhbmQgQ29uc3RhbnRQb2ludGVyTnVsbCBmb3IgcG9pbnRlcnMuCitpbmxpbmUgbWF0Y2hfemVybyBtX1plcm8oKSB7IHJldHVybiBtYXRjaF96ZXJvKCk7IH0KKworc3RydWN0IGFwaW50X21hdGNoIHsKKyAgY29uc3QgQVBJbnQgKiZSZXM7CisKKyAgYXBpbnRfbWF0Y2goY29uc3QgQVBJbnQgKiZSKSA6IFJlcyhSKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJVHk+IGJvb2wgbWF0Y2goSVR5ICpWKSB7CisgICAgaWYgKGF1dG8gKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFYpKSB7CisgICAgICBSZXMgPSAmQ0ktPmdldFZhbHVlKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKFYtPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpKQorICAgICAgaWYgKGNvbnN0IGF1dG8gKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgICAgIGlmIChhdXRvICpDSSA9IGR5bl9jYXN0X29yX251bGw8Q29uc3RhbnRJbnQ+KEMtPmdldFNwbGF0VmFsdWUoKSkpIHsKKyAgICAgICAgICBSZXMgPSAmQ0ktPmdldFZhbHVlKCk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisvLyBFaXRoZXIgY29uc3RleHByIGlmIG9yIHJlbmFtaW5nIENvbnN0YW50RlA6OmdldFZhbHVlQVBGIHRvCisvLyBDb25zdGFudEZQOjpnZXRWYWx1ZSBpcyBuZWVkZWQgdG8gZG8gaXQgdmlhIHNpbmdsZSB0ZW1wbGF0ZQorLy8gZnVuY3Rpb24gZm9yIGJvdGggYXBpbnQvYXBmbG9hdC4KK3N0cnVjdCBhcGZsb2F0X21hdGNoIHsKKyAgY29uc3QgQVBGbG9hdCAqJlJlczsKKyAgYXBmbG9hdF9tYXRjaChjb25zdCBBUEZsb2F0IComUikgOiBSZXMoUikge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElUeT4gYm9vbCBtYXRjaChJVHkgKlYpIHsKKyAgICBpZiAoYXV0byAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEZQPihWKSkgeworICAgICAgUmVzID0gJkNJLT5nZXRWYWx1ZUFQRigpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChWLT5nZXRUeXBlKCktPmlzVmVjdG9yVHkoKSkKKyAgICAgIGlmIChjb25zdCBhdXRvICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgICAgICBpZiAoYXV0byAqQ0kgPSBkeW5fY2FzdF9vcl9udWxsPENvbnN0YW50RlA+KEMtPmdldFNwbGF0VmFsdWUoKSkpIHsKKyAgICAgICAgICBSZXMgPSAmQ0ktPmdldFZhbHVlQVBGKCk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8vLyBNYXRjaCBhIENvbnN0YW50SW50IG9yIHNwbGF0dGVkIENvbnN0YW50VmVjdG9yLCBiaW5kaW5nIHRoZQorLy8vIHNwZWNpZmllZCBwb2ludGVyIHRvIHRoZSBjb250YWluZWQgQVBJbnQuCitpbmxpbmUgYXBpbnRfbWF0Y2ggbV9BUEludChjb25zdCBBUEludCAqJlJlcykgeyByZXR1cm4gUmVzOyB9CisKKy8vLyBNYXRjaCBhIENvbnN0YW50RlAgb3Igc3BsYXR0ZWQgQ29uc3RhbnRWZWN0b3IsIGJpbmRpbmcgdGhlCisvLy8gc3BlY2lmaWVkIHBvaW50ZXIgdG8gdGhlIGNvbnRhaW5lZCBBUEZsb2F0LgoraW5saW5lIGFwZmxvYXRfbWF0Y2ggbV9BUEZsb2F0KGNvbnN0IEFQRmxvYXQgKiZSZXMpIHsgcmV0dXJuIFJlczsgfQorCit0ZW1wbGF0ZSA8aW50NjRfdCBWYWw+IHN0cnVjdCBjb25zdGFudGludF9tYXRjaCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJVHk+IGJvb2wgbWF0Y2goSVR5ICpWKSB7CisgICAgaWYgKGNvbnN0IGF1dG8gKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFYpKSB7CisgICAgICBjb25zdCBBUEludCAmQ0lWID0gQ0ktPmdldFZhbHVlKCk7CisgICAgICBpZiAoVmFsID49IDApCisgICAgICAgIHJldHVybiBDSVYgPT0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KFZhbCk7CisgICAgICAvLyBJZiBWYWwgaXMgbmVnYXRpdmUsIGFuZCBDSSBpcyBzaG9ydGVyIHRoYW4gaXQsIHRydW5jYXRlIHRvIHRoZSByaWdodAorICAgICAgLy8gbnVtYmVyIG9mIGJpdHMuICBJZiBpdCBpcyBsYXJnZXIsIHRoZW4gd2UgaGF2ZSB0byBzaWduIGV4dGVuZC4gIEp1c3QKKyAgICAgIC8vIGNvbXBhcmUgdGhlaXIgbmVnYXRlZCB2YWx1ZXMuCisgICAgICByZXR1cm4gLUNJViA9PSAtVmFsOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8vLyBNYXRjaCBhIENvbnN0YW50SW50IHdpdGggYSBzcGVjaWZpYyB2YWx1ZS4KK3RlbXBsYXRlIDxpbnQ2NF90IFZhbD4gaW5saW5lIGNvbnN0YW50aW50X21hdGNoPFZhbD4gbV9Db25zdGFudEludCgpIHsKKyAgcmV0dXJuIGNvbnN0YW50aW50X21hdGNoPFZhbD4oKTsKK30KKworLy8vIFRoaXMgaGVscGVyIGNsYXNzIGlzIHVzZWQgdG8gbWF0Y2ggc2NhbGFyIGFuZCB2ZWN0b3IgaW50ZWdlciBjb25zdGFudHMgdGhhdAorLy8vIHNhdGlzZnkgYSBzcGVjaWZpZWQgcHJlZGljYXRlLgorLy8vIEZvciB2ZWN0b3IgY29uc3RhbnRzLCB1bmRlZmluZWQgZWxlbWVudHMgYXJlIGlnbm9yZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZGljYXRlPiBzdHJ1Y3QgY3N0X3ByZWRfdHkgOiBwdWJsaWMgUHJlZGljYXRlIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElUeT4gYm9vbCBtYXRjaChJVHkgKlYpIHsKKyAgICBpZiAoY29uc3QgYXV0byAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVikpCisgICAgICByZXR1cm4gdGhpcy0+aXNWYWx1ZShDSS0+Z2V0VmFsdWUoKSk7CisgICAgaWYgKFYtPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpKSB7CisgICAgICBpZiAoY29uc3QgYXV0byAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkgeworICAgICAgICBpZiAoY29uc3QgYXV0byAqQ0kgPSBkeW5fY2FzdF9vcl9udWxsPENvbnN0YW50SW50PihDLT5nZXRTcGxhdFZhbHVlKCkpKQorICAgICAgICAgIHJldHVybiB0aGlzLT5pc1ZhbHVlKENJLT5nZXRWYWx1ZSgpKTsKKworICAgICAgICAvLyBOb24tc3BsYXQgdmVjdG9yIGNvbnN0YW50OiBjaGVjayBlYWNoIGVsZW1lbnQgZm9yIGEgbWF0Y2guCisgICAgICAgIHVuc2lnbmVkIE51bUVsdHMgPSBWLT5nZXRUeXBlKCktPmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgICAgIGFzc2VydChOdW1FbHRzICE9IDAgJiYgIkNvbnN0YW50IHZlY3RvciB3aXRoIG5vIGVsZW1lbnRzPyIpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUVsdHM7ICsraSkgeworICAgICAgICAgIENvbnN0YW50ICpFbHQgPSBDLT5nZXRBZ2dyZWdhdGVFbGVtZW50KGkpOworICAgICAgICAgIGlmICghRWx0KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGlmIChpc2E8VW5kZWZWYWx1ZT4oRWx0KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGF1dG8gKkNJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KEVsdCk7CisgICAgICAgICAgaWYgKCFDSSB8fCAhdGhpcy0+aXNWYWx1ZShDSS0+Z2V0VmFsdWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLy8vIFRoaXMgaGVscGVyIGNsYXNzIGlzIHVzZWQgdG8gbWF0Y2ggc2NhbGFyIGFuZCB2ZWN0b3IgY29uc3RhbnRzIHRoYXQKKy8vLyBzYXRpc2Z5IGEgc3BlY2lmaWVkIHByZWRpY2F0ZSwgYW5kIGJpbmQgdGhlbSB0byBhbiBBUEludC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkaWNhdGU+IHN0cnVjdCBhcGlfcHJlZF90eSA6IHB1YmxpYyBQcmVkaWNhdGUgeworICBjb25zdCBBUEludCAqJlJlczsKKworICBhcGlfcHJlZF90eShjb25zdCBBUEludCAqJlIpIDogUmVzKFIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElUeT4gYm9vbCBtYXRjaChJVHkgKlYpIHsKKyAgICBpZiAoY29uc3QgYXV0byAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVikpCisgICAgICBpZiAodGhpcy0+aXNWYWx1ZShDSS0+Z2V0VmFsdWUoKSkpIHsKKyAgICAgICAgUmVzID0gJkNJLT5nZXRWYWx1ZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICBpZiAoVi0+Z2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkpCisgICAgICBpZiAoY29uc3QgYXV0byAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkKKyAgICAgICAgaWYgKGF1dG8gKkNJID0gZHluX2Nhc3Rfb3JfbnVsbDxDb25zdGFudEludD4oQy0+Z2V0U3BsYXRWYWx1ZSgpKSkKKyAgICAgICAgICBpZiAodGhpcy0+aXNWYWx1ZShDSS0+Z2V0VmFsdWUoKSkpIHsKKyAgICAgICAgICAgIFJlcyA9ICZDSS0+Z2V0VmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLy8vIFRoaXMgaGVscGVyIGNsYXNzIGlzIHVzZWQgdG8gbWF0Y2ggc2NhbGFyIGFuZCB2ZWN0b3IgZmxvYXRpbmctcG9pbnQKKy8vLyBjb25zdGFudHMgdGhhdCBzYXRpc2Z5IGEgc3BlY2lmaWVkIHByZWRpY2F0ZS4KKy8vLyBGb3IgdmVjdG9yIGNvbnN0YW50cywgdW5kZWZpbmVkIGVsZW1lbnRzIGFyZSBpZ25vcmVkLgordGVtcGxhdGUgPHR5cGVuYW1lIFByZWRpY2F0ZT4gc3RydWN0IGNzdGZwX3ByZWRfdHkgOiBwdWJsaWMgUHJlZGljYXRlIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElUeT4gYm9vbCBtYXRjaChJVHkgKlYpIHsKKyAgICBpZiAoY29uc3QgYXV0byAqQ0YgPSBkeW5fY2FzdDxDb25zdGFudEZQPihWKSkKKyAgICAgIHJldHVybiB0aGlzLT5pc1ZhbHVlKENGLT5nZXRWYWx1ZUFQRigpKTsKKyAgICBpZiAoVi0+Z2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkpIHsKKyAgICAgIGlmIChjb25zdCBhdXRvICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKSB7CisgICAgICAgIGlmIChjb25zdCBhdXRvICpDRiA9IGR5bl9jYXN0X29yX251bGw8Q29uc3RhbnRGUD4oQy0+Z2V0U3BsYXRWYWx1ZSgpKSkKKyAgICAgICAgICByZXR1cm4gdGhpcy0+aXNWYWx1ZShDRi0+Z2V0VmFsdWVBUEYoKSk7CisKKyAgICAgICAgLy8gTm9uLXNwbGF0IHZlY3RvciBjb25zdGFudDogY2hlY2sgZWFjaCBlbGVtZW50IGZvciBhIG1hdGNoLgorICAgICAgICB1bnNpZ25lZCBOdW1FbHRzID0gVi0+Z2V0VHlwZSgpLT5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgICAgICBhc3NlcnQoTnVtRWx0cyAhPSAwICYmICJDb25zdGFudCB2ZWN0b3Igd2l0aCBubyBlbGVtZW50cz8iKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1FbHRzOyArK2kpIHsKKyAgICAgICAgICBDb25zdGFudCAqRWx0ID0gQy0+Z2V0QWdncmVnYXRlRWxlbWVudChpKTsKKyAgICAgICAgICBpZiAoIUVsdCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBpZiAoaXNhPFVuZGVmVmFsdWU+KEVsdCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBhdXRvICpDRiA9IGR5bl9jYXN0PENvbnN0YW50RlA+KEVsdCk7CisgICAgICAgICAgaWYgKCFDRiB8fCAhdGhpcy0+aXNWYWx1ZShDRi0+Z2V0VmFsdWVBUEYoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIEVuY2Fwc3VsYXRlIGNvbnN0YW50IHZhbHVlIHF1ZXJpZXMgZm9yIHVzZSBpbiB0ZW1wbGF0ZWQgcHJlZGljYXRlIG1hdGNoZXJzLgorLy8gVGhpcyBhbGxvd3MgY2hlY2tpbmcgaWYgY29uc3RhbnRzIG1hdGNoIHVzaW5nIGNvbXBvdW5kIHByZWRpY2F0ZXMgYW5kIHdvcmtzCisvLyB3aXRoIHZlY3RvciBjb25zdGFudHMsIHBvc3NpYmx5IHdpdGggcmVsYXhlZCBjb25zdHJhaW50cy4gRm9yIGV4YW1wbGUsIGlnbm9yZQorLy8gdW5kZWYgdmFsdWVzLgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RydWN0IGlzX2FsbF9vbmVzIHsKKyAgYm9vbCBpc1ZhbHVlKGNvbnN0IEFQSW50ICZDKSB7IHJldHVybiBDLmlzQWxsT25lc1ZhbHVlKCk7IH0KK307CisvLy8gTWF0Y2ggYW4gaW50ZWdlciBvciB2ZWN0b3Igd2l0aCBhbGwgYml0cyBzZXQuCisvLy8gRm9yIHZlY3RvcnMsIHRoaXMgaW5jbHVkZXMgY29uc3RhbnRzIHdpdGggdW5kZWZpbmVkIGVsZW1lbnRzLgoraW5saW5lIGNzdF9wcmVkX3R5PGlzX2FsbF9vbmVzPiBtX0FsbE9uZXMoKSB7CisgIHJldHVybiBjc3RfcHJlZF90eTxpc19hbGxfb25lcz4oKTsKK30KKworc3RydWN0IGlzX21heHNpZ25lZHZhbHVlIHsKKyAgYm9vbCBpc1ZhbHVlKGNvbnN0IEFQSW50ICZDKSB7IHJldHVybiBDLmlzTWF4U2lnbmVkVmFsdWUoKTsgfQorfTsKKy8vLyBNYXRjaCBhbiBpbnRlZ2VyIG9yIHZlY3RvciB3aXRoIHZhbHVlcyBoYXZpbmcgYWxsIGJpdHMgZXhjZXB0IGZvciB0aGUgaGlnaAorLy8vIGJpdCBzZXQgKDB4N2YuLi4pLgorLy8vIEZvciB2ZWN0b3JzLCB0aGlzIGluY2x1ZGVzIGNvbnN0YW50cyB3aXRoIHVuZGVmaW5lZCBlbGVtZW50cy4KK2lubGluZSBjc3RfcHJlZF90eTxpc19tYXhzaWduZWR2YWx1ZT4gbV9NYXhTaWduZWRWYWx1ZSgpIHsKKyAgcmV0dXJuIGNzdF9wcmVkX3R5PGlzX21heHNpZ25lZHZhbHVlPigpOworfQoraW5saW5lIGFwaV9wcmVkX3R5PGlzX21heHNpZ25lZHZhbHVlPiBtX01heFNpZ25lZFZhbHVlKGNvbnN0IEFQSW50IComVikgeworICByZXR1cm4gVjsKK30KKworc3RydWN0IGlzX25lZ2F0aXZlIHsKKyAgYm9vbCBpc1ZhbHVlKGNvbnN0IEFQSW50ICZDKSB7IHJldHVybiBDLmlzTmVnYXRpdmUoKTsgfQorfTsKKy8vLyBNYXRjaCBhbiBpbnRlZ2VyIG9yIHZlY3RvciBvZiBuZWdhdGl2ZSB2YWx1ZXMuCisvLy8gRm9yIHZlY3RvcnMsIHRoaXMgaW5jbHVkZXMgY29uc3RhbnRzIHdpdGggdW5kZWZpbmVkIGVsZW1lbnRzLgoraW5saW5lIGNzdF9wcmVkX3R5PGlzX25lZ2F0aXZlPiBtX05lZ2F0aXZlKCkgeworICByZXR1cm4gY3N0X3ByZWRfdHk8aXNfbmVnYXRpdmU+KCk7Cit9CitpbmxpbmUgYXBpX3ByZWRfdHk8aXNfbmVnYXRpdmU+IG1fTmVnYXRpdmUoY29uc3QgQVBJbnQgKiZWKSB7CisgIHJldHVybiBWOworfQorCitzdHJ1Y3QgaXNfbm9ubmVnYXRpdmUgeworICBib29sIGlzVmFsdWUoY29uc3QgQVBJbnQgJkMpIHsgcmV0dXJuIEMuaXNOb25OZWdhdGl2ZSgpOyB9Cit9OworLy8vIE1hdGNoIGFuIGludGVnZXIgb3IgdmVjdG9yIG9mIG5vbm5lZ2F0aXZlIHZhbHVlcy4KKy8vLyBGb3IgdmVjdG9ycywgdGhpcyBpbmNsdWRlcyBjb25zdGFudHMgd2l0aCB1bmRlZmluZWQgZWxlbWVudHMuCitpbmxpbmUgY3N0X3ByZWRfdHk8aXNfbm9ubmVnYXRpdmU+IG1fTm9uTmVnYXRpdmUoKSB7CisgIHJldHVybiBjc3RfcHJlZF90eTxpc19ub25uZWdhdGl2ZT4oKTsKK30KK2lubGluZSBhcGlfcHJlZF90eTxpc19ub25uZWdhdGl2ZT4gbV9Ob25OZWdhdGl2ZShjb25zdCBBUEludCAqJlYpIHsKKyAgcmV0dXJuIFY7Cit9CisKK3N0cnVjdCBpc19vbmUgeworICBib29sIGlzVmFsdWUoY29uc3QgQVBJbnQgJkMpIHsgcmV0dXJuIEMuaXNPbmVWYWx1ZSgpOyB9Cit9OworLy8vIE1hdGNoIGFuIGludGVnZXIgMSBvciBhIHZlY3RvciB3aXRoIGFsbCBlbGVtZW50cyBlcXVhbCB0byAxLgorLy8vIEZvciB2ZWN0b3JzLCB0aGlzIGluY2x1ZGVzIGNvbnN0YW50cyB3aXRoIHVuZGVmaW5lZCBlbGVtZW50cy4KK2lubGluZSBjc3RfcHJlZF90eTxpc19vbmU+IG1fT25lKCkgeworICByZXR1cm4gY3N0X3ByZWRfdHk8aXNfb25lPigpOworfQorCitzdHJ1Y3QgaXNfcG93ZXIyIHsKKyAgYm9vbCBpc1ZhbHVlKGNvbnN0IEFQSW50ICZDKSB7IHJldHVybiBDLmlzUG93ZXJPZjIoKTsgfQorfTsKKy8vLyBNYXRjaCBhbiBpbnRlZ2VyIG9yIHZlY3RvciBwb3dlci1vZi0yLgorLy8vIEZvciB2ZWN0b3JzLCB0aGlzIGluY2x1ZGVzIGNvbnN0YW50cyB3aXRoIHVuZGVmaW5lZCBlbGVtZW50cy4KK2lubGluZSBjc3RfcHJlZF90eTxpc19wb3dlcjI+IG1fUG93ZXIyKCkgeworICByZXR1cm4gY3N0X3ByZWRfdHk8aXNfcG93ZXIyPigpOworfQoraW5saW5lIGFwaV9wcmVkX3R5PGlzX3Bvd2VyMj4gbV9Qb3dlcjIoY29uc3QgQVBJbnQgKiZWKSB7CisgIHJldHVybiBWOworfQorCitzdHJ1Y3QgaXNfcG93ZXIyX29yX3plcm8geworICBib29sIGlzVmFsdWUoY29uc3QgQVBJbnQgJkMpIHsgcmV0dXJuICFDIHx8IEMuaXNQb3dlck9mMigpOyB9Cit9OworLy8vIE1hdGNoIGFuIGludGVnZXIgb3IgdmVjdG9yIG9mIDAgb3IgcG93ZXItb2YtMiB2YWx1ZXMuCisvLy8gRm9yIHZlY3RvcnMsIHRoaXMgaW5jbHVkZXMgY29uc3RhbnRzIHdpdGggdW5kZWZpbmVkIGVsZW1lbnRzLgoraW5saW5lIGNzdF9wcmVkX3R5PGlzX3Bvd2VyMl9vcl96ZXJvPiBtX1Bvd2VyMk9yWmVybygpIHsKKyAgcmV0dXJuIGNzdF9wcmVkX3R5PGlzX3Bvd2VyMl9vcl96ZXJvPigpOworfQoraW5saW5lIGFwaV9wcmVkX3R5PGlzX3Bvd2VyMl9vcl96ZXJvPiBtX1Bvd2VyMk9yWmVybyhjb25zdCBBUEludCAqJlYpIHsKKyAgcmV0dXJuIFY7Cit9CisKK3N0cnVjdCBpc19zaWduX21hc2sgeworICBib29sIGlzVmFsdWUoY29uc3QgQVBJbnQgJkMpIHsgcmV0dXJuIEMuaXNTaWduTWFzaygpOyB9Cit9OworLy8vIE1hdGNoIGFuIGludGVnZXIgb3IgdmVjdG9yIHdpdGggb25seSB0aGUgc2lnbiBiaXQocykgc2V0LgorLy8vIEZvciB2ZWN0b3JzLCB0aGlzIGluY2x1ZGVzIGNvbnN0YW50cyB3aXRoIHVuZGVmaW5lZCBlbGVtZW50cy4KK2lubGluZSBjc3RfcHJlZF90eTxpc19zaWduX21hc2s+IG1fU2lnbk1hc2soKSB7CisgIHJldHVybiBjc3RfcHJlZF90eTxpc19zaWduX21hc2s+KCk7Cit9CisKK3N0cnVjdCBpc19uYW4geworICBib29sIGlzVmFsdWUoY29uc3QgQVBGbG9hdCAmQykgeyByZXR1cm4gQy5pc05hTigpOyB9Cit9OworLy8vIE1hdGNoIGFuIGFyYml0cmFyeSBOYU4gY29uc3RhbnQuIFRoaXMgaW5jbHVkZXMgcXVpZXQgYW5kIHNpZ25hbGxpbmcgbmFucy4KKy8vLyBGb3IgdmVjdG9ycywgdGhpcyBpbmNsdWRlcyBjb25zdGFudHMgd2l0aCB1bmRlZmluZWQgZWxlbWVudHMuCitpbmxpbmUgY3N0ZnBfcHJlZF90eTxpc19uYW4+IG1fTmFOKCkgeworICByZXR1cm4gY3N0ZnBfcHJlZF90eTxpc19uYW4+KCk7Cit9CisKK3N0cnVjdCBpc19hbnlfemVyb19mcCB7CisgIGJvb2wgaXNWYWx1ZShjb25zdCBBUEZsb2F0ICZDKSB7IHJldHVybiBDLmlzWmVybygpOyB9Cit9OworLy8vIE1hdGNoIGEgZmxvYXRpbmctcG9pbnQgbmVnYXRpdmUgemVybyBvciBwb3NpdGl2ZSB6ZXJvLgorLy8vIEZvciB2ZWN0b3JzLCB0aGlzIGluY2x1ZGVzIGNvbnN0YW50cyB3aXRoIHVuZGVmaW5lZCBlbGVtZW50cy4KK2lubGluZSBjc3RmcF9wcmVkX3R5PGlzX2FueV96ZXJvX2ZwPiBtX0FueVplcm9GUCgpIHsKKyAgcmV0dXJuIGNzdGZwX3ByZWRfdHk8aXNfYW55X3plcm9fZnA+KCk7Cit9CisKK3N0cnVjdCBpc19wb3NfemVyb19mcCB7CisgIGJvb2wgaXNWYWx1ZShjb25zdCBBUEZsb2F0ICZDKSB7IHJldHVybiBDLmlzUG9zWmVybygpOyB9Cit9OworLy8vIE1hdGNoIGEgZmxvYXRpbmctcG9pbnQgcG9zaXRpdmUgemVyby4KKy8vLyBGb3IgdmVjdG9ycywgdGhpcyBpbmNsdWRlcyBjb25zdGFudHMgd2l0aCB1bmRlZmluZWQgZWxlbWVudHMuCitpbmxpbmUgY3N0ZnBfcHJlZF90eTxpc19wb3NfemVyb19mcD4gbV9Qb3NaZXJvRlAoKSB7CisgIHJldHVybiBjc3RmcF9wcmVkX3R5PGlzX3Bvc196ZXJvX2ZwPigpOworfQorCitzdHJ1Y3QgaXNfbmVnX3plcm9fZnAgeworICBib29sIGlzVmFsdWUoY29uc3QgQVBGbG9hdCAmQykgeyByZXR1cm4gQy5pc05lZ1plcm8oKTsgfQorfTsKKy8vLyBNYXRjaCBhIGZsb2F0aW5nLXBvaW50IG5lZ2F0aXZlIHplcm8uCisvLy8gRm9yIHZlY3RvcnMsIHRoaXMgaW5jbHVkZXMgY29uc3RhbnRzIHdpdGggdW5kZWZpbmVkIGVsZW1lbnRzLgoraW5saW5lIGNzdGZwX3ByZWRfdHk8aXNfbmVnX3plcm9fZnA+IG1fTmVnWmVyb0ZQKCkgeworICByZXR1cm4gY3N0ZnBfcHJlZF90eTxpc19uZWdfemVyb19mcD4oKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3M+IHN0cnVjdCBiaW5kX3R5IHsKKyAgQ2xhc3MgKiZWUjsKKworICBiaW5kX3R5KENsYXNzIComVikgOiBWUihWKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJVHk+IGJvb2wgbWF0Y2goSVR5ICpWKSB7CisgICAgaWYgKGF1dG8gKkNWID0gZHluX2Nhc3Q8Q2xhc3M+KFYpKSB7CisgICAgICBWUiA9IENWOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLy8vIE1hdGNoIGEgdmFsdWUsIGNhcHR1cmluZyBpdCBpZiB3ZSBtYXRjaC4KK2lubGluZSBiaW5kX3R5PFZhbHVlPiBtX1ZhbHVlKFZhbHVlIComVikgeyByZXR1cm4gVjsgfQoraW5saW5lIGJpbmRfdHk8Y29uc3QgVmFsdWU+IG1fVmFsdWUoY29uc3QgVmFsdWUgKiZWKSB7IHJldHVybiBWOyB9CisKKy8vLyBNYXRjaCBhbiBpbnN0cnVjdGlvbiwgY2FwdHVyaW5nIGl0IGlmIHdlIG1hdGNoLgoraW5saW5lIGJpbmRfdHk8SW5zdHJ1Y3Rpb24+IG1fSW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gKiZJKSB7IHJldHVybiBJOyB9CisvLy8gTWF0Y2ggYSBiaW5hcnkgb3BlcmF0b3IsIGNhcHR1cmluZyBpdCBpZiB3ZSBtYXRjaC4KK2lubGluZSBiaW5kX3R5PEJpbmFyeU9wZXJhdG9yPiBtX0Jpbk9wKEJpbmFyeU9wZXJhdG9yIComSSkgeyByZXR1cm4gSTsgfQorCisvLy8gTWF0Y2ggYSBDb25zdGFudEludCwgY2FwdHVyaW5nIHRoZSB2YWx1ZSBpZiB3ZSBtYXRjaC4KK2lubGluZSBiaW5kX3R5PENvbnN0YW50SW50PiBtX0NvbnN0YW50SW50KENvbnN0YW50SW50IComQ0kpIHsgcmV0dXJuIENJOyB9CisKKy8vLyBNYXRjaCBhIENvbnN0YW50LCBjYXB0dXJpbmcgdGhlIHZhbHVlIGlmIHdlIG1hdGNoLgoraW5saW5lIGJpbmRfdHk8Q29uc3RhbnQ+IG1fQ29uc3RhbnQoQ29uc3RhbnQgKiZDKSB7IHJldHVybiBDOyB9CisKKy8vLyBNYXRjaCBhIENvbnN0YW50RlAsIGNhcHR1cmluZyB0aGUgdmFsdWUgaWYgd2UgbWF0Y2guCitpbmxpbmUgYmluZF90eTxDb25zdGFudEZQPiBtX0NvbnN0YW50RlAoQ29uc3RhbnRGUCAqJkMpIHsgcmV0dXJuIEM7IH0KKworLy8vIE1hdGNoIGEgc3BlY2lmaWVkIFZhbHVlKi4KK3N0cnVjdCBzcGVjaWZpY3ZhbF90eSB7CisgIGNvbnN0IFZhbHVlICpWYWw7CisKKyAgc3BlY2lmaWN2YWxfdHkoY29uc3QgVmFsdWUgKlYpIDogVmFsKFYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElUeT4gYm9vbCBtYXRjaChJVHkgKlYpIHsgcmV0dXJuIFYgPT0gVmFsOyB9Cit9OworCisvLy8gTWF0Y2ggaWYgd2UgaGF2ZSBhIHNwZWNpZmljIHNwZWNpZmllZCB2YWx1ZS4KK2lubGluZSBzcGVjaWZpY3ZhbF90eSBtX1NwZWNpZmljKGNvbnN0IFZhbHVlICpWKSB7IHJldHVybiBWOyB9CisKKy8vLyBNYXRjaCBhIHNwZWNpZmllZCBmbG9hdGluZyBwb2ludCB2YWx1ZSBvciB2ZWN0b3Igb2YgYWxsIGVsZW1lbnRzIG9mCisvLy8gdGhhdCB2YWx1ZS4KK3N0cnVjdCBzcGVjaWZpY19mcHZhbCB7CisgIGRvdWJsZSBWYWw7CisKKyAgc3BlY2lmaWNfZnB2YWwoZG91YmxlIFYpIDogVmFsKFYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElUeT4gYm9vbCBtYXRjaChJVHkgKlYpIHsKKyAgICBpZiAoY29uc3QgYXV0byAqQ0ZQID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oVikpCisgICAgICByZXR1cm4gQ0ZQLT5pc0V4YWN0bHlWYWx1ZShWYWwpOworICAgIGlmIChWLT5nZXRUeXBlKCktPmlzVmVjdG9yVHkoKSkKKyAgICAgIGlmIChjb25zdCBhdXRvICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgICAgICBpZiAoYXV0byAqQ0ZQID0gZHluX2Nhc3Rfb3JfbnVsbDxDb25zdGFudEZQPihDLT5nZXRTcGxhdFZhbHVlKCkpKQorICAgICAgICAgIHJldHVybiBDRlAtPmlzRXhhY3RseVZhbHVlKFZhbCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvLy8gTWF0Y2ggYSBzcGVjaWZpYyBmbG9hdGluZyBwb2ludCB2YWx1ZSBvciB2ZWN0b3Igd2l0aCBhbGwgZWxlbWVudHMKKy8vLyBlcXVhbCB0byB0aGUgdmFsdWUuCitpbmxpbmUgc3BlY2lmaWNfZnB2YWwgbV9TcGVjaWZpY0ZQKGRvdWJsZSBWKSB7IHJldHVybiBzcGVjaWZpY19mcHZhbChWKTsgfQorCisvLy8gTWF0Y2ggYSBmbG9hdCAxLjAgb3IgdmVjdG9yIHdpdGggYWxsIGVsZW1lbnRzIGVxdWFsIHRvIDEuMC4KK2lubGluZSBzcGVjaWZpY19mcHZhbCBtX0ZQT25lKCkgeyByZXR1cm4gbV9TcGVjaWZpY0ZQKDEuMCk7IH0KKworc3RydWN0IGJpbmRfY29uc3RfaW50dmFsX3R5IHsKKyAgdWludDY0X3QgJlZSOworCisgIGJpbmRfY29uc3RfaW50dmFsX3R5KHVpbnQ2NF90ICZWKSA6IFZSKFYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElUeT4gYm9vbCBtYXRjaChJVHkgKlYpIHsKKyAgICBpZiAoY29uc3QgYXV0byAqQ1YgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVikpCisgICAgICBpZiAoQ1YtPmdldFZhbHVlKCkudWxlKFVJTlQ2NF9NQVgpKSB7CisgICAgICAgIFZSID0gQ1YtPmdldFpFeHRWYWx1ZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8vLyBNYXRjaCBhIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlIG9yIHZlY3RvciBvZiBhbGwgZWxlbWVudHMgb2YgdGhhdAorLy8gdmFsdWUuCitzdHJ1Y3Qgc3BlY2lmaWNfaW50dmFsIHsKKyAgdWludDY0X3QgVmFsOworCisgIHNwZWNpZmljX2ludHZhbCh1aW50NjRfdCBWKSA6IFZhbChWKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJVHk+IGJvb2wgbWF0Y2goSVR5ICpWKSB7CisgICAgY29uc3QgYXV0byAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVik7CisgICAgaWYgKCFDSSAmJiBWLT5nZXRUeXBlKCktPmlzVmVjdG9yVHkoKSkKKyAgICAgIGlmIChjb25zdCBhdXRvICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgICAgICBDSSA9IGR5bl9jYXN0X29yX251bGw8Q29uc3RhbnRJbnQ+KEMtPmdldFNwbGF0VmFsdWUoKSk7CisKKyAgICByZXR1cm4gQ0kgJiYgQ0ktPmdldFZhbHVlKCkgPT0gVmFsOworICB9Cit9OworCisvLy8gTWF0Y2ggYSBzcGVjaWZpYyBpbnRlZ2VyIHZhbHVlIG9yIHZlY3RvciB3aXRoIGFsbCBlbGVtZW50cyBlcXVhbCB0bworLy8vIHRoZSB2YWx1ZS4KK2lubGluZSBzcGVjaWZpY19pbnR2YWwgbV9TcGVjaWZpY0ludCh1aW50NjRfdCBWKSB7IHJldHVybiBzcGVjaWZpY19pbnR2YWwoVik7IH0KKworLy8vIE1hdGNoIGEgQ29uc3RhbnRJbnQgYW5kIGJpbmQgdG8gaXRzIHZhbHVlLiAgVGhpcyBkb2VzIG5vdCBtYXRjaAorLy8vIENvbnN0YW50SW50cyB3aWRlciB0aGFuIDY0LWJpdHMuCitpbmxpbmUgYmluZF9jb25zdF9pbnR2YWxfdHkgbV9Db25zdGFudEludCh1aW50NjRfdCAmVikgeyByZXR1cm4gVjsgfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWF0Y2hlciBmb3IgYW55IGJpbmFyeSBvcGVyYXRvci4KKy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTX3QsIHR5cGVuYW1lIFJIU190LCBib29sIENvbW11dGFibGUgPSBmYWxzZT4KK3N0cnVjdCBBbnlCaW5hcnlPcF9tYXRjaCB7CisgIExIU190IEw7CisgIFJIU190IFI7CisKKyAgQW55QmluYXJ5T3BfbWF0Y2goY29uc3QgTEhTX3QgJkxIUywgY29uc3QgUkhTX3QgJlJIUykgOiBMKExIUyksIFIoUkhTKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PiBib29sIG1hdGNoKE9wVHkgKlYpIHsKKyAgICBpZiAoYXV0byAqSSA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihWKSkKKyAgICAgIHJldHVybiAoTC5tYXRjaChJLT5nZXRPcGVyYW5kKDApKSAmJiBSLm1hdGNoKEktPmdldE9wZXJhbmQoMSkpKSB8fAorICAgICAgICAgICAgIChDb21tdXRhYmxlICYmIFIubWF0Y2goSS0+Z2V0T3BlcmFuZCgwKSkgJiYKKyAgICAgICAgICAgICAgTC5tYXRjaChJLT5nZXRPcGVyYW5kKDEpKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQW55QmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFM+IG1fQmluT3AoY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEFueUJpbmFyeU9wX21hdGNoPExIUywgUkhTPihMLCBSKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hdGNoZXJzIGZvciBzcGVjaWZpYyBiaW5hcnkgb3BlcmF0b3JzLgorLy8KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIU190LCB0eXBlbmFtZSBSSFNfdCwgdW5zaWduZWQgT3Bjb2RlLAorICAgICAgICAgIGJvb2wgQ29tbXV0YWJsZSA9IGZhbHNlPgorc3RydWN0IEJpbmFyeU9wX21hdGNoIHsKKyAgTEhTX3QgTDsKKyAgUkhTX3QgUjsKKworICBCaW5hcnlPcF9tYXRjaChjb25zdCBMSFNfdCAmTEhTLCBjb25zdCBSSFNfdCAmUkhTKSA6IEwoTEhTKSwgUihSSFMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIGlmIChWLT5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6Okluc3RydWN0aW9uVmFsICsgT3Bjb2RlKSB7CisgICAgICBhdXRvICpJID0gY2FzdDxCaW5hcnlPcGVyYXRvcj4oVik7CisgICAgICByZXR1cm4gKEwubWF0Y2goSS0+Z2V0T3BlcmFuZCgwKSkgJiYgUi5tYXRjaChJLT5nZXRPcGVyYW5kKDEpKSkgfHwKKyAgICAgICAgICAgICAoQ29tbXV0YWJsZSAmJiBSLm1hdGNoKEktPmdldE9wZXJhbmQoMCkpICYmCisgICAgICAgICAgICAgIEwubWF0Y2goSS0+Z2V0T3BlcmFuZCgxKSkpOworICAgIH0KKyAgICBpZiAoYXV0byAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KFYpKQorICAgICAgcmV0dXJuIENFLT5nZXRPcGNvZGUoKSA9PSBPcGNvZGUgJiYKKyAgICAgICAgICAgICAoKEwubWF0Y2goQ0UtPmdldE9wZXJhbmQoMCkpICYmIFIubWF0Y2goQ0UtPmdldE9wZXJhbmQoMSkpKSB8fAorICAgICAgICAgICAgICAoQ29tbXV0YWJsZSAmJiBSLm1hdGNoKENFLT5nZXRPcGVyYW5kKDApKSAmJgorICAgICAgICAgICAgICAgTC5tYXRjaChDRS0+Z2V0T3BlcmFuZCgxKSkpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OkFkZD4gbV9BZGQoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6QWRkPihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6RkFkZD4gbV9GQWRkKGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6RkFkZD4oTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlN1Yj4gbV9TdWIoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6U3ViPihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6RlN1Yj4gbV9GU3ViKGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6RlN1Yj4oTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246Ok11bD4gbV9NdWwoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6TXVsPihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6Rk11bD4gbV9GTXVsKGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6Rk11bD4oTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlVEaXY+IG1fVURpdihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlVEaXY+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpTRGl2PiBtX1NEaXYoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpTRGl2PihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6RkRpdj4gbV9GRGl2KGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6RkRpdj4oTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlVSZW0+IG1fVVJlbShjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlVSZW0+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpTUmVtPiBtX1NSZW0oY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpTUmVtPihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6RlJlbT4gbV9GUmVtKGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6RlJlbT4oTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OkFuZD4gbV9BbmQoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6QW5kPihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6T3I+IG1fT3IoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246Ok9yPihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6WG9yPiBtX1hvcihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpYb3I+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpTaGw+IG1fU2hsKGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlNobD4oTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OkxTaHI+IG1fTFNocihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OkxTaHI+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpBU2hyPiBtX0FTaHIoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpBU2hyPihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIU190LCB0eXBlbmFtZSBSSFNfdCwgdW5zaWduZWQgT3Bjb2RlLAorICAgICAgICAgIHVuc2lnbmVkIFdyYXBGbGFncyA9IDA+CitzdHJ1Y3QgT3ZlcmZsb3dpbmdCaW5hcnlPcF9tYXRjaCB7CisgIExIU190IEw7CisgIFJIU190IFI7CisKKyAgT3ZlcmZsb3dpbmdCaW5hcnlPcF9tYXRjaChjb25zdCBMSFNfdCAmTEhTLCBjb25zdCBSSFNfdCAmUkhTKQorICAgICAgOiBMKExIUyksIFIoUkhTKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PiBib29sIG1hdGNoKE9wVHkgKlYpIHsKKyAgICBpZiAoYXV0byAqT3AgPSBkeW5fY2FzdDxPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yPihWKSkgeworICAgICAgaWYgKE9wLT5nZXRPcGNvZGUoKSAhPSBPcGNvZGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmIChXcmFwRmxhZ3MgJiBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yOjpOb1Vuc2lnbmVkV3JhcCAmJgorICAgICAgICAgICFPcC0+aGFzTm9VbnNpZ25lZFdyYXAoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKFdyYXBGbGFncyAmIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I6Ok5vU2lnbmVkV3JhcCAmJgorICAgICAgICAgICFPcC0+aGFzTm9TaWduZWRXcmFwKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiBMLm1hdGNoKE9wLT5nZXRPcGVyYW5kKDApKSAmJiBSLm1hdGNoKE9wLT5nZXRPcGVyYW5kKDEpKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgT3ZlcmZsb3dpbmdCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OkFkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I6Ok5vU2lnbmVkV3JhcD4KK21fTlNXQWRkKGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBPdmVyZmxvd2luZ0JpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6QWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yOjpOb1NpZ25lZFdyYXA+KAorICAgICAgTCwgUik7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgT3ZlcmZsb3dpbmdCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I6Ok5vU2lnbmVkV3JhcD4KK21fTlNXU3ViKGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBPdmVyZmxvd2luZ0JpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6U3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yOjpOb1NpZ25lZFdyYXA+KAorICAgICAgTCwgUik7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgT3ZlcmZsb3dpbmdCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246Ok11bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I6Ok5vU2lnbmVkV3JhcD4KK21fTlNXTXVsKGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBPdmVyZmxvd2luZ0JpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6TXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yOjpOb1NpZ25lZFdyYXA+KAorICAgICAgTCwgUik7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgT3ZlcmZsb3dpbmdCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlNobCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I6Ok5vU2lnbmVkV3JhcD4KK21fTlNXU2hsKGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBPdmVyZmxvd2luZ0JpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6U2hsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yOjpOb1NpZ25lZFdyYXA+KAorICAgICAgTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBPdmVyZmxvd2luZ0JpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6QWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvcjo6Tm9VbnNpZ25lZFdyYXA+CittX05VV0FkZChjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gT3ZlcmZsb3dpbmdCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OkFkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvcjo6Tm9VbnNpZ25lZFdyYXA+KAorICAgICAgTCwgUik7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgT3ZlcmZsb3dpbmdCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I6Ok5vVW5zaWduZWRXcmFwPgorbV9OVVdTdWIoY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIE92ZXJmbG93aW5nQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpTdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I6Ok5vVW5zaWduZWRXcmFwPigKKyAgICAgIEwsIFIpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIE92ZXJmbG93aW5nQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpNdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yOjpOb1Vuc2lnbmVkV3JhcD4KK21fTlVXTXVsKGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBPdmVyZmxvd2luZ0JpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6TXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yOjpOb1Vuc2lnbmVkV3JhcD4oCisgICAgICBMLCBSKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBPdmVyZmxvd2luZ0JpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6U2hsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvcjo6Tm9VbnNpZ25lZFdyYXA+CittX05VV1NobChjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gT3ZlcmZsb3dpbmdCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlNobCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvcjo6Tm9VbnNpZ25lZFdyYXA+KAorICAgICAgTCwgUik7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDbGFzcyB0aGF0IG1hdGNoZXMgYSBncm91cCBvZiBiaW5hcnkgb3Bjb2Rlcy4KKy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTX3QsIHR5cGVuYW1lIFJIU190LCB0eXBlbmFtZSBQcmVkaWNhdGU+CitzdHJ1Y3QgQmluT3BQcmVkX21hdGNoIDogUHJlZGljYXRlIHsKKyAgTEhTX3QgTDsKKyAgUkhTX3QgUjsKKworICBCaW5PcFByZWRfbWF0Y2goY29uc3QgTEhTX3QgJkxIUywgY29uc3QgUkhTX3QgJlJIUykgOiBMKExIUyksIFIoUkhTKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PiBib29sIG1hdGNoKE9wVHkgKlYpIHsKKyAgICBpZiAoYXV0byAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWKSkKKyAgICAgIHJldHVybiB0aGlzLT5pc09wVHlwZShJLT5nZXRPcGNvZGUoKSkgJiYgTC5tYXRjaChJLT5nZXRPcGVyYW5kKDApKSAmJgorICAgICAgICAgICAgIFIubWF0Y2goSS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgaWYgKGF1dG8gKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihWKSkKKyAgICAgIHJldHVybiB0aGlzLT5pc09wVHlwZShDRS0+Z2V0T3Bjb2RlKCkpICYmIEwubWF0Y2goQ0UtPmdldE9wZXJhbmQoMCkpICYmCisgICAgICAgICAgICAgUi5tYXRjaChDRS0+Z2V0T3BlcmFuZCgxKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCitzdHJ1Y3QgaXNfc2hpZnRfb3AgeworICBib29sIGlzT3BUeXBlKHVuc2lnbmVkIE9wY29kZSkgeyByZXR1cm4gSW5zdHJ1Y3Rpb246OmlzU2hpZnQoT3Bjb2RlKTsgfQorfTsKKworc3RydWN0IGlzX3JpZ2h0X3NoaWZ0X29wIHsKKyAgYm9vbCBpc09wVHlwZSh1bnNpZ25lZCBPcGNvZGUpIHsKKyAgICByZXR1cm4gT3Bjb2RlID09IEluc3RydWN0aW9uOjpMU2hyIHx8IE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6QVNocjsKKyAgfQorfTsKKworc3RydWN0IGlzX2xvZ2ljYWxfc2hpZnRfb3AgeworICBib29sIGlzT3BUeXBlKHVuc2lnbmVkIE9wY29kZSkgeworICAgIHJldHVybiBPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OkxTaHIgfHwgT3Bjb2RlID09IEluc3RydWN0aW9uOjpTaGw7CisgIH0KK307CisKK3N0cnVjdCBpc19iaXR3aXNlbG9naWNfb3AgeworICBib29sIGlzT3BUeXBlKHVuc2lnbmVkIE9wY29kZSkgeworICAgIHJldHVybiBJbnN0cnVjdGlvbjo6aXNCaXR3aXNlTG9naWNPcChPcGNvZGUpOworICB9Cit9OworCitzdHJ1Y3QgaXNfaWRpdl9vcCB7CisgIGJvb2wgaXNPcFR5cGUodW5zaWduZWQgT3Bjb2RlKSB7CisgICAgcmV0dXJuIE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6U0RpdiB8fCBPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OlVEaXY7CisgIH0KK307CisKKy8vLyBNYXRjaGVzIHNoaWZ0IG9wZXJhdGlvbnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluT3BQcmVkX21hdGNoPExIUywgUkhTLCBpc19zaGlmdF9vcD4gbV9TaGlmdChjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbk9wUHJlZF9tYXRjaDxMSFMsIFJIUywgaXNfc2hpZnRfb3A+KEwsIFIpOworfQorCisvLy8gTWF0Y2hlcyBsb2dpY2FsIHNoaWZ0IG9wZXJhdGlvbnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluT3BQcmVkX21hdGNoPExIUywgUkhTLCBpc19yaWdodF9zaGlmdF9vcD4gbV9TaHIoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluT3BQcmVkX21hdGNoPExIUywgUkhTLCBpc19yaWdodF9zaGlmdF9vcD4oTCwgUik7Cit9CisKKy8vLyBNYXRjaGVzIGxvZ2ljYWwgc2hpZnQgb3BlcmF0aW9ucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5PcFByZWRfbWF0Y2g8TEhTLCBSSFMsIGlzX2xvZ2ljYWxfc2hpZnRfb3A+CittX0xvZ2ljYWxTaGlmdChjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluT3BQcmVkX21hdGNoPExIUywgUkhTLCBpc19sb2dpY2FsX3NoaWZ0X29wPihMLCBSKTsKK30KKworLy8vIE1hdGNoZXMgYml0d2lzZSBsb2dpYyBvcGVyYXRpb25zLgordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbk9wUHJlZF9tYXRjaDxMSFMsIFJIUywgaXNfYml0d2lzZWxvZ2ljX29wPgorbV9CaXR3aXNlTG9naWMoY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbk9wUHJlZF9tYXRjaDxMSFMsIFJIUywgaXNfYml0d2lzZWxvZ2ljX29wPihMLCBSKTsKK30KKworLy8vIE1hdGNoZXMgaW50ZWdlciBkaXZpc2lvbiBvcGVyYXRpb25zLgordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbk9wUHJlZF9tYXRjaDxMSFMsIFJIUywgaXNfaWRpdl9vcD4gbV9JRGl2KGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbk9wUHJlZF9tYXRjaDxMSFMsIFJIUywgaXNfaWRpdl9vcD4oTCwgUik7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDbGFzcyB0aGF0IG1hdGNoZXMgZXhhY3QgYmluYXJ5IG9wcy4KKy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3ViUGF0dGVybl90PiBzdHJ1Y3QgRXhhY3RfbWF0Y2ggeworICBTdWJQYXR0ZXJuX3QgU3ViUGF0dGVybjsKKworICBFeGFjdF9tYXRjaChjb25zdCBTdWJQYXR0ZXJuX3QgJlNQKSA6IFN1YlBhdHRlcm4oU1ApIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIGlmIChhdXRvICpQRU8gPSBkeW5fY2FzdDxQb3NzaWJseUV4YWN0T3BlcmF0b3I+KFYpKQorICAgICAgcmV0dXJuIFBFTy0+aXNFeGFjdCgpICYmIFN1YlBhdHRlcm4ubWF0Y2goVik7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaW5saW5lIEV4YWN0X21hdGNoPFQ+IG1fRXhhY3QoY29uc3QgVCAmU3ViUGF0dGVybikgeworICByZXR1cm4gU3ViUGF0dGVybjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hdGNoZXJzIGZvciBDbXBJbnN0IGNsYXNzZXMKKy8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFNfdCwgdHlwZW5hbWUgUkhTX3QsIHR5cGVuYW1lIENsYXNzLCB0eXBlbmFtZSBQcmVkaWNhdGVUeSwKKyAgICAgICAgICBib29sIENvbW11dGFibGUgPSBmYWxzZT4KK3N0cnVjdCBDbXBDbGFzc19tYXRjaCB7CisgIFByZWRpY2F0ZVR5ICZQcmVkaWNhdGU7CisgIExIU190IEw7CisgIFJIU190IFI7CisKKyAgQ21wQ2xhc3NfbWF0Y2goUHJlZGljYXRlVHkgJlByZWQsIGNvbnN0IExIU190ICZMSFMsIGNvbnN0IFJIU190ICZSSFMpCisgICAgICA6IFByZWRpY2F0ZShQcmVkKSwgTChMSFMpLCBSKFJIUykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4gYm9vbCBtYXRjaChPcFR5ICpWKSB7CisgICAgaWYgKGF1dG8gKkkgPSBkeW5fY2FzdDxDbGFzcz4oVikpCisgICAgICBpZiAoKEwubWF0Y2goSS0+Z2V0T3BlcmFuZCgwKSkgJiYgUi5tYXRjaChJLT5nZXRPcGVyYW5kKDEpKSkgfHwKKyAgICAgICAgICAoQ29tbXV0YWJsZSAmJiBSLm1hdGNoKEktPmdldE9wZXJhbmQoMCkpICYmCisgICAgICAgICAgIEwubWF0Y2goSS0+Z2V0T3BlcmFuZCgxKSkpKSB7CisgICAgICAgIFByZWRpY2F0ZSA9IEktPmdldFByZWRpY2F0ZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBDbXBDbGFzc19tYXRjaDxMSFMsIFJIUywgQ21wSW5zdCwgQ21wSW5zdDo6UHJlZGljYXRlPgorbV9DbXAoQ21wSW5zdDo6UHJlZGljYXRlICZQcmVkLCBjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQ21wQ2xhc3NfbWF0Y2g8TEhTLCBSSFMsIENtcEluc3QsIENtcEluc3Q6OlByZWRpY2F0ZT4oUHJlZCwgTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBDbXBDbGFzc19tYXRjaDxMSFMsIFJIUywgSUNtcEluc3QsIElDbXBJbnN0OjpQcmVkaWNhdGU+CittX0lDbXAoSUNtcEluc3Q6OlByZWRpY2F0ZSAmUHJlZCwgY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIENtcENsYXNzX21hdGNoPExIUywgUkhTLCBJQ21wSW5zdCwgSUNtcEluc3Q6OlByZWRpY2F0ZT4oUHJlZCwgTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBDbXBDbGFzc19tYXRjaDxMSFMsIFJIUywgRkNtcEluc3QsIEZDbXBJbnN0OjpQcmVkaWNhdGU+CittX0ZDbXAoRkNtcEluc3Q6OlByZWRpY2F0ZSAmUHJlZCwgY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIENtcENsYXNzX21hdGNoPExIUywgUkhTLCBGQ21wSW5zdCwgRkNtcEluc3Q6OlByZWRpY2F0ZT4oUHJlZCwgTCwgUik7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYXRjaGVycyBmb3IgU2VsZWN0SW5zdCBjbGFzc2VzCisvLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uZF90LCB0eXBlbmFtZSBMSFNfdCwgdHlwZW5hbWUgUkhTX3Q+CitzdHJ1Y3QgU2VsZWN0Q2xhc3NfbWF0Y2ggeworICBDb25kX3QgQzsKKyAgTEhTX3QgTDsKKyAgUkhTX3QgUjsKKworICBTZWxlY3RDbGFzc19tYXRjaChjb25zdCBDb25kX3QgJkNvbmQsIGNvbnN0IExIU190ICZMSFMsIGNvbnN0IFJIU190ICZSSFMpCisgICAgICA6IEMoQ29uZCksIEwoTEhTKSwgUihSSFMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIGlmIChhdXRvICpJID0gZHluX2Nhc3Q8U2VsZWN0SW5zdD4oVikpCisgICAgICByZXR1cm4gQy5tYXRjaChJLT5nZXRPcGVyYW5kKDApKSAmJiBMLm1hdGNoKEktPmdldE9wZXJhbmQoMSkpICYmCisgICAgICAgICAgICAgUi5tYXRjaChJLT5nZXRPcGVyYW5kKDIpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDb25kLCB0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBTZWxlY3RDbGFzc19tYXRjaDxDb25kLCBMSFMsIFJIUz4gbV9TZWxlY3QoY29uc3QgQ29uZCAmQywgY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIFNlbGVjdENsYXNzX21hdGNoPENvbmQsIExIUywgUkhTPihDLCBMLCBSKTsKK30KKworLy8vIFRoaXMgbWF0Y2hlcyBhIHNlbGVjdCBvZiB0d28gY29uc3RhbnRzLCBlLmcuOgorLy8vIG1fU2VsZWN0Q3N0PC0xLCAwPihtX1ZhbHVlKFYpKQordGVtcGxhdGUgPGludDY0X3QgTCwgaW50NjRfdCBSLCB0eXBlbmFtZSBDb25kPgoraW5saW5lIFNlbGVjdENsYXNzX21hdGNoPENvbmQsIGNvbnN0YW50aW50X21hdGNoPEw+LCBjb25zdGFudGludF9tYXRjaDxSPj4KK21fU2VsZWN0Q3N0KGNvbnN0IENvbmQgJkMpIHsKKyAgcmV0dXJuIG1fU2VsZWN0KEMsIG1fQ29uc3RhbnRJbnQ8TD4oKSwgbV9Db25zdGFudEludDxSPigpKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hdGNoZXJzIGZvciBJbnNlcnRFbGVtZW50SW5zdCBjbGFzc2VzCisvLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsX3QsIHR5cGVuYW1lIEVsdF90LCB0eXBlbmFtZSBJZHhfdD4KK3N0cnVjdCBJbnNlcnRFbGVtZW50Q2xhc3NfbWF0Y2ggeworICBWYWxfdCBWOworICBFbHRfdCBFOworICBJZHhfdCBJOworCisgIEluc2VydEVsZW1lbnRDbGFzc19tYXRjaChjb25zdCBWYWxfdCAmVmFsLCBjb25zdCBFbHRfdCAmRWx0LCBjb25zdCBJZHhfdCAmSWR4KQorICAgICAgOiBWKFZhbCksIEUoRWx0KSwgSShJZHgpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVlYpIHsKKyAgICBpZiAoYXV0byAqSUkgPSBkeW5fY2FzdDxJbnNlcnRFbGVtZW50SW5zdD4oVlYpKQorICAgICAgcmV0dXJuIFYubWF0Y2goSUktPmdldE9wZXJhbmQoMCkpICYmIEUubWF0Y2goSUktPmdldE9wZXJhbmQoMSkpICYmCisgICAgICAgICAgICAgSS5tYXRjaChJSS0+Z2V0T3BlcmFuZCgyKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsX3QsIHR5cGVuYW1lIEVsdF90LCB0eXBlbmFtZSBJZHhfdD4KK2lubGluZSBJbnNlcnRFbGVtZW50Q2xhc3NfbWF0Y2g8VmFsX3QsIEVsdF90LCBJZHhfdD4KK21fSW5zZXJ0RWxlbWVudChjb25zdCBWYWxfdCAmVmFsLCBjb25zdCBFbHRfdCAmRWx0LCBjb25zdCBJZHhfdCAmSWR4KSB7CisgIHJldHVybiBJbnNlcnRFbGVtZW50Q2xhc3NfbWF0Y2g8VmFsX3QsIEVsdF90LCBJZHhfdD4oVmFsLCBFbHQsIElkeCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYXRjaGVycyBmb3IgRXh0cmFjdEVsZW1lbnRJbnN0IGNsYXNzZXMKKy8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWxfdCwgdHlwZW5hbWUgSWR4X3Q+IHN0cnVjdCBFeHRyYWN0RWxlbWVudENsYXNzX21hdGNoIHsKKyAgVmFsX3QgVjsKKyAgSWR4X3QgSTsKKworICBFeHRyYWN0RWxlbWVudENsYXNzX21hdGNoKGNvbnN0IFZhbF90ICZWYWwsIGNvbnN0IElkeF90ICZJZHgpCisgICAgICA6IFYoVmFsKSwgSShJZHgpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVlYpIHsKKyAgICBpZiAoYXV0byAqSUkgPSBkeW5fY2FzdDxFeHRyYWN0RWxlbWVudEluc3Q+KFZWKSkKKyAgICAgIHJldHVybiBWLm1hdGNoKElJLT5nZXRPcGVyYW5kKDApKSAmJiBJLm1hdGNoKElJLT5nZXRPcGVyYW5kKDEpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWxfdCwgdHlwZW5hbWUgSWR4X3Q+CitpbmxpbmUgRXh0cmFjdEVsZW1lbnRDbGFzc19tYXRjaDxWYWxfdCwgSWR4X3Q+CittX0V4dHJhY3RFbGVtZW50KGNvbnN0IFZhbF90ICZWYWwsIGNvbnN0IElkeF90ICZJZHgpIHsKKyAgcmV0dXJuIEV4dHJhY3RFbGVtZW50Q2xhc3NfbWF0Y2g8VmFsX3QsIElkeF90PihWYWwsIElkeCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYXRjaGVycyBmb3IgU2h1ZmZsZVZlY3Rvckluc3QgY2xhc3NlcworLy8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFYxX3QsIHR5cGVuYW1lIFYyX3QsIHR5cGVuYW1lIE1hc2tfdD4KK3N0cnVjdCBTaHVmZmxlVmVjdG9yQ2xhc3NfbWF0Y2ggeworICBWMV90IFYxOworICBWMl90IFYyOworICBNYXNrX3QgTTsKKworICBTaHVmZmxlVmVjdG9yQ2xhc3NfbWF0Y2goY29uc3QgVjFfdCAmdjEsIGNvbnN0IFYyX3QgJnYyLCBjb25zdCBNYXNrX3QgJm0pCisgICAgICA6IFYxKHYxKSwgVjIodjIpLCBNKG0pIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIGlmIChhdXRvICpTSSA9IGR5bl9jYXN0PFNodWZmbGVWZWN0b3JJbnN0PihWKSkKKyAgICAgIHJldHVybiBWMS5tYXRjaChTSS0+Z2V0T3BlcmFuZCgwKSkgJiYgVjIubWF0Y2goU0ktPmdldE9wZXJhbmQoMSkpICYmCisgICAgICAgICAgICAgTS5tYXRjaChTSS0+Z2V0T3BlcmFuZCgyKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVjFfdCwgdHlwZW5hbWUgVjJfdCwgdHlwZW5hbWUgTWFza190PgoraW5saW5lIFNodWZmbGVWZWN0b3JDbGFzc19tYXRjaDxWMV90LCBWMl90LCBNYXNrX3Q+CittX1NodWZmbGVWZWN0b3IoY29uc3QgVjFfdCAmdjEsIGNvbnN0IFYyX3QgJnYyLCBjb25zdCBNYXNrX3QgJm0pIHsKKyAgcmV0dXJuIFNodWZmbGVWZWN0b3JDbGFzc19tYXRjaDxWMV90LCBWMl90LCBNYXNrX3Q+KHYxLCB2MiwgbSk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYXRjaGVycyBmb3IgQ2FzdEluc3QgY2xhc3NlcworLy8KKwordGVtcGxhdGUgPHR5cGVuYW1lIE9wX3QsIHVuc2lnbmVkIE9wY29kZT4gc3RydWN0IENhc3RDbGFzc19tYXRjaCB7CisgIE9wX3QgT3A7CisKKyAgQ2FzdENsYXNzX21hdGNoKGNvbnN0IE9wX3QgJk9wTWF0Y2gpIDogT3AoT3BNYXRjaCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4gYm9vbCBtYXRjaChPcFR5ICpWKSB7CisgICAgaWYgKGF1dG8gKk8gPSBkeW5fY2FzdDxPcGVyYXRvcj4oVikpCisgICAgICByZXR1cm4gTy0+Z2V0T3Bjb2RlKCkgPT0gT3Bjb2RlICYmIE9wLm1hdGNoKE8tPmdldE9wZXJhbmQoMCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLy8vIE1hdGNoZXMgQml0Q2FzdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PgoraW5saW5lIENhc3RDbGFzc19tYXRjaDxPcFR5LCBJbnN0cnVjdGlvbjo6Qml0Q2FzdD4gbV9CaXRDYXN0KGNvbnN0IE9wVHkgJk9wKSB7CisgIHJldHVybiBDYXN0Q2xhc3NfbWF0Y2g8T3BUeSwgSW5zdHJ1Y3Rpb246OkJpdENhc3Q+KE9wKTsKK30KKworLy8vIE1hdGNoZXMgUHRyVG9JbnQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4KK2lubGluZSBDYXN0Q2xhc3NfbWF0Y2g8T3BUeSwgSW5zdHJ1Y3Rpb246OlB0clRvSW50PiBtX1B0clRvSW50KGNvbnN0IE9wVHkgJk9wKSB7CisgIHJldHVybiBDYXN0Q2xhc3NfbWF0Y2g8T3BUeSwgSW5zdHJ1Y3Rpb246OlB0clRvSW50PihPcCk7Cit9CisKKy8vLyBNYXRjaGVzIFRydW5jLgordGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+CitpbmxpbmUgQ2FzdENsYXNzX21hdGNoPE9wVHksIEluc3RydWN0aW9uOjpUcnVuYz4gbV9UcnVuYyhjb25zdCBPcFR5ICZPcCkgeworICByZXR1cm4gQ2FzdENsYXNzX21hdGNoPE9wVHksIEluc3RydWN0aW9uOjpUcnVuYz4oT3ApOworfQorCisvLy8gTWF0Y2hlcyBTRXh0LgordGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+CitpbmxpbmUgQ2FzdENsYXNzX21hdGNoPE9wVHksIEluc3RydWN0aW9uOjpTRXh0PiBtX1NFeHQoY29uc3QgT3BUeSAmT3ApIHsKKyAgcmV0dXJuIENhc3RDbGFzc19tYXRjaDxPcFR5LCBJbnN0cnVjdGlvbjo6U0V4dD4oT3ApOworfQorCisvLy8gTWF0Y2hlcyBaRXh0LgordGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+CitpbmxpbmUgQ2FzdENsYXNzX21hdGNoPE9wVHksIEluc3RydWN0aW9uOjpaRXh0PiBtX1pFeHQoY29uc3QgT3BUeSAmT3ApIHsKKyAgcmV0dXJuIENhc3RDbGFzc19tYXRjaDxPcFR5LCBJbnN0cnVjdGlvbjo6WkV4dD4oT3ApOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4KK2lubGluZSBtYXRjaF9jb21iaW5lX29yPENhc3RDbGFzc19tYXRjaDxPcFR5LCBJbnN0cnVjdGlvbjo6WkV4dD4sCisgICAgICAgICAgICAgICAgICAgICAgICBDYXN0Q2xhc3NfbWF0Y2g8T3BUeSwgSW5zdHJ1Y3Rpb246OlNFeHQ+PgorbV9aRXh0T3JTRXh0KGNvbnN0IE9wVHkgJk9wKSB7CisgIHJldHVybiBtX0NvbWJpbmVPcihtX1pFeHQoT3ApLCBtX1NFeHQoT3ApKTsKK30KKworLy8vIE1hdGNoZXMgVUlUb0ZQLgordGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+CitpbmxpbmUgQ2FzdENsYXNzX21hdGNoPE9wVHksIEluc3RydWN0aW9uOjpVSVRvRlA+IG1fVUlUb0ZQKGNvbnN0IE9wVHkgJk9wKSB7CisgIHJldHVybiBDYXN0Q2xhc3NfbWF0Y2g8T3BUeSwgSW5zdHJ1Y3Rpb246OlVJVG9GUD4oT3ApOworfQorCisvLy8gTWF0Y2hlcyBTSVRvRlAuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4KK2lubGluZSBDYXN0Q2xhc3NfbWF0Y2g8T3BUeSwgSW5zdHJ1Y3Rpb246OlNJVG9GUD4gbV9TSVRvRlAoY29uc3QgT3BUeSAmT3ApIHsKKyAgcmV0dXJuIENhc3RDbGFzc19tYXRjaDxPcFR5LCBJbnN0cnVjdGlvbjo6U0lUb0ZQPihPcCk7Cit9CisKKy8vLyBNYXRjaGVzIEZQVHJ1bmMKK3RlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PgoraW5saW5lIENhc3RDbGFzc19tYXRjaDxPcFR5LCBJbnN0cnVjdGlvbjo6RlBUcnVuYz4gbV9GUFRydW5jKGNvbnN0IE9wVHkgJk9wKSB7CisgIHJldHVybiBDYXN0Q2xhc3NfbWF0Y2g8T3BUeSwgSW5zdHJ1Y3Rpb246OkZQVHJ1bmM+KE9wKTsKK30KKworLy8vIE1hdGNoZXMgRlBFeHQKK3RlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PgoraW5saW5lIENhc3RDbGFzc19tYXRjaDxPcFR5LCBJbnN0cnVjdGlvbjo6RlBFeHQ+IG1fRlBFeHQoY29uc3QgT3BUeSAmT3ApIHsKKyAgcmV0dXJuIENhc3RDbGFzc19tYXRjaDxPcFR5LCBJbnN0cnVjdGlvbjo6RlBFeHQ+KE9wKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hdGNoZXIgZm9yIExvYWRJbnN0IGNsYXNzZXMKKy8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBPcF90PiBzdHJ1Y3QgTG9hZENsYXNzX21hdGNoIHsKKyAgT3BfdCBPcDsKKworICBMb2FkQ2xhc3NfbWF0Y2goY29uc3QgT3BfdCAmT3BNYXRjaCkgOiBPcChPcE1hdGNoKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PiBib29sIG1hdGNoKE9wVHkgKlYpIHsKKyAgICBpZiAoYXV0byAqTEkgPSBkeW5fY2FzdDxMb2FkSW5zdD4oVikpCisgICAgICByZXR1cm4gT3AubWF0Y2goTEktPmdldFBvaW50ZXJPcGVyYW5kKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLy8vIE1hdGNoZXMgTG9hZEluc3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4gaW5saW5lIExvYWRDbGFzc19tYXRjaDxPcFR5PiBtX0xvYWQoY29uc3QgT3BUeSAmT3ApIHsKKyAgcmV0dXJuIExvYWRDbGFzc19tYXRjaDxPcFR5PihPcCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYXRjaGVycyBmb3IgdW5hcnkgb3BlcmF0b3JzCisvLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTX3Q+IHN0cnVjdCBuZWdfbWF0Y2ggeworICBMSFNfdCBMOworCisgIG5lZ19tYXRjaChjb25zdCBMSFNfdCAmTEhTKSA6IEwoTEhTKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PiBib29sIG1hdGNoKE9wVHkgKlYpIHsKKyAgICBpZiAoYXV0byAqTyA9IGR5bl9jYXN0PE9wZXJhdG9yPihWKSkKKyAgICAgIGlmIChPLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U3ViKQorICAgICAgICByZXR1cm4gbWF0Y2hJZk5lZyhPLT5nZXRPcGVyYW5kKDApLCBPLT5nZXRPcGVyYW5kKDEpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworcHJpdmF0ZToKKyAgYm9vbCBtYXRjaElmTmVnKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICByZXR1cm4gKChpc2E8Q29uc3RhbnRJbnQ+KExIUykgJiYgY2FzdDxDb25zdGFudEludD4oTEhTKS0+aXNaZXJvKCkpIHx8CisgICAgICAgICAgICBpc2E8Q29uc3RhbnRBZ2dyZWdhdGVaZXJvPihMSFMpKSAmJgorICAgICAgICAgICBMLm1hdGNoKFJIUyk7CisgIH0KK307CisKKy8vLyBNYXRjaCBhbiBpbnRlZ2VyIG5lZ2F0ZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFM+IGlubGluZSBuZWdfbWF0Y2g8TEhTPiBtX05lZyhjb25zdCBMSFMgJkwpIHsgcmV0dXJuIEw7IH0KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIU190PiBzdHJ1Y3QgZm5lZ19tYXRjaCB7CisgIExIU190IEw7CisKKyAgZm5lZ19tYXRjaChjb25zdCBMSFNfdCAmTEhTKSA6IEwoTEhTKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PiBib29sIG1hdGNoKE9wVHkgKlYpIHsKKyAgICBpZiAoYXV0byAqTyA9IGR5bl9jYXN0PE9wZXJhdG9yPihWKSkKKyAgICAgIGlmIChPLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RlN1YikKKyAgICAgICAgcmV0dXJuIG1hdGNoSWZGTmVnKE8tPmdldE9wZXJhbmQoMCksIE8tPmdldE9wZXJhbmQoMSkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCitwcml2YXRlOgorICBib29sIG1hdGNoSWZGTmVnKFZhbHVlICpMSFMsIFZhbHVlICpSSFMpIHsKKyAgICBpZiAoY29uc3QgYXV0byAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgcmV0dXJuIEMtPmlzTmVnYXRpdmVaZXJvVmFsdWUoKSAmJiBMLm1hdGNoKFJIUyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvLy8gTWF0Y2ggYSBmbG9hdGluZyBwb2ludCBuZWdhdGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTPiBpbmxpbmUgZm5lZ19tYXRjaDxMSFM+IG1fRk5lZyhjb25zdCBMSFMgJkwpIHsKKyAgcmV0dXJuIEw7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYXRjaGVycyBmb3IgY29udHJvbCBmbG93LgorLy8KKworc3RydWN0IGJyX21hdGNoIHsKKyAgQmFzaWNCbG9jayAqJlN1Y2M7CisKKyAgYnJfbWF0Y2goQmFzaWNCbG9jayAqJlN1Y2MpIDogU3VjYyhTdWNjKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PiBib29sIG1hdGNoKE9wVHkgKlYpIHsKKyAgICBpZiAoYXV0byAqQkkgPSBkeW5fY2FzdDxCcmFuY2hJbnN0PihWKSkKKyAgICAgIGlmIChCSS0+aXNVbmNvbmRpdGlvbmFsKCkpIHsKKyAgICAgICAgU3VjYyA9IEJJLT5nZXRTdWNjZXNzb3IoMCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworaW5saW5lIGJyX21hdGNoIG1fVW5jb25kaXRpb25hbEJyKEJhc2ljQmxvY2sgKiZTdWNjKSB7IHJldHVybiBicl9tYXRjaChTdWNjKTsgfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uZF90PiBzdHJ1Y3QgYnJjX21hdGNoIHsKKyAgQ29uZF90IENvbmQ7CisgIEJhc2ljQmxvY2sgKiZULCAqJkY7CisKKyAgYnJjX21hdGNoKGNvbnN0IENvbmRfdCAmQywgQmFzaWNCbG9jayAqJnQsIEJhc2ljQmxvY2sgKiZmKQorICAgICAgOiBDb25kKEMpLCBUKHQpLCBGKGYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIGlmIChhdXRvICpCSSA9IGR5bl9jYXN0PEJyYW5jaEluc3Q+KFYpKQorICAgICAgaWYgKEJJLT5pc0NvbmRpdGlvbmFsKCkgJiYgQ29uZC5tYXRjaChCSS0+Z2V0Q29uZGl0aW9uKCkpKSB7CisgICAgICAgIFQgPSBCSS0+Z2V0U3VjY2Vzc29yKDApOworICAgICAgICBGID0gQkktPmdldFN1Y2Nlc3NvcigxKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uZF90PgoraW5saW5lIGJyY19tYXRjaDxDb25kX3Q+IG1fQnIoY29uc3QgQ29uZF90ICZDLCBCYXNpY0Jsb2NrIComVCwgQmFzaWNCbG9jayAqJkYpIHsKKyAgcmV0dXJuIGJyY19tYXRjaDxDb25kX3Q+KEMsIFQsIEYpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWF0Y2hlcnMgZm9yIG1heC9taW4gaWRpb21zLCBlZzogInNlbGVjdCAoc2d0IHgsIHkpLCB4LCB5IiAtPiBzbWF4KHgseSkuCisvLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ21wSW5zdF90LCB0eXBlbmFtZSBMSFNfdCwgdHlwZW5hbWUgUkhTX3QsIHR5cGVuYW1lIFByZWRfdCwKKyAgICAgICAgICBib29sIENvbW11dGFibGUgPSBmYWxzZT4KK3N0cnVjdCBNYXhNaW5fbWF0Y2ggeworICBMSFNfdCBMOworICBSSFNfdCBSOworCisgIE1heE1pbl9tYXRjaChjb25zdCBMSFNfdCAmTEhTLCBjb25zdCBSSFNfdCAmUkhTKSA6IEwoTEhTKSwgUihSSFMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIC8vIExvb2sgZm9yICIoeCBwcmVkIHkpID8geCA6IHkiIG9yICIoeCBwcmVkIHkpID8geSA6IHgiLgorICAgIGF1dG8gKlNJID0gZHluX2Nhc3Q8U2VsZWN0SW5zdD4oVik7CisgICAgaWYgKCFTSSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBhdXRvICpDbXAgPSBkeW5fY2FzdDxDbXBJbnN0X3Q+KFNJLT5nZXRDb25kaXRpb24oKSk7CisgICAgaWYgKCFDbXApCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGEgc2VsZWN0IGNvbmRpdGlvbmVkIG9uIGEgY29tcGFyaXNvbi4gIENoZWNrIHRoYXQKKyAgICAvLyBpdCBpcyB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBzZWxlY3QgdGhhdCBhcmUgYmVpbmcgY29tcGFyZWQuCisgICAgVmFsdWUgKlRydWVWYWwgPSBTSS0+Z2V0VHJ1ZVZhbHVlKCk7CisgICAgVmFsdWUgKkZhbHNlVmFsID0gU0ktPmdldEZhbHNlVmFsdWUoKTsKKyAgICBWYWx1ZSAqTEhTID0gQ21wLT5nZXRPcGVyYW5kKDApOworICAgIFZhbHVlICpSSFMgPSBDbXAtPmdldE9wZXJhbmQoMSk7CisgICAgaWYgKChUcnVlVmFsICE9IExIUyB8fCBGYWxzZVZhbCAhPSBSSFMpICYmCisgICAgICAgIChUcnVlVmFsICE9IFJIUyB8fCBGYWxzZVZhbCAhPSBMSFMpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHR5cGVuYW1lIENtcEluc3RfdDo6UHJlZGljYXRlIFByZWQgPQorICAgICAgICBMSFMgPT0gVHJ1ZVZhbCA/IENtcC0+Z2V0UHJlZGljYXRlKCkgOiBDbXAtPmdldEludmVyc2VQcmVkaWNhdGUoKTsKKyAgICAvLyBEb2VzICIoeCBwcmVkIHkpID8geCA6IHkiIHJlcHJlc2VudCB0aGUgZGVzaXJlZCBtYXgvbWluIG9wZXJhdGlvbj8KKyAgICBpZiAoIVByZWRfdDo6bWF0Y2goUHJlZCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gSXQgZG9lcyEgIEJpbmQgdGhlIG9wZXJhbmRzLgorICAgIHJldHVybiAoTC5tYXRjaChMSFMpICYmIFIubWF0Y2goUkhTKSkgfHwKKyAgICAgICAgICAgKENvbW11dGFibGUgJiYgUi5tYXRjaChMSFMpICYmIEwubWF0Y2goUkhTKSk7CisgIH0KK307CisKKy8vLyBIZWxwZXIgY2xhc3MgZm9yIGlkZW50aWZ5aW5nIHNpZ25lZCBtYXggcHJlZGljYXRlcy4KK3N0cnVjdCBzbWF4X3ByZWRfdHkgeworICBzdGF0aWMgYm9vbCBtYXRjaChJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQpIHsKKyAgICByZXR1cm4gUHJlZCA9PSBDbXBJbnN0OjpJQ01QX1NHVCB8fCBQcmVkID09IENtcEluc3Q6OklDTVBfU0dFOworICB9Cit9OworCisvLy8gSGVscGVyIGNsYXNzIGZvciBpZGVudGlmeWluZyBzaWduZWQgbWluIHByZWRpY2F0ZXMuCitzdHJ1Y3Qgc21pbl9wcmVkX3R5IHsKKyAgc3RhdGljIGJvb2wgbWF0Y2goSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkKSB7CisgICAgcmV0dXJuIFByZWQgPT0gQ21wSW5zdDo6SUNNUF9TTFQgfHwgUHJlZCA9PSBDbXBJbnN0OjpJQ01QX1NMRTsKKyAgfQorfTsKKworLy8vIEhlbHBlciBjbGFzcyBmb3IgaWRlbnRpZnlpbmcgdW5zaWduZWQgbWF4IHByZWRpY2F0ZXMuCitzdHJ1Y3QgdW1heF9wcmVkX3R5IHsKKyAgc3RhdGljIGJvb2wgbWF0Y2goSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkKSB7CisgICAgcmV0dXJuIFByZWQgPT0gQ21wSW5zdDo6SUNNUF9VR1QgfHwgUHJlZCA9PSBDbXBJbnN0OjpJQ01QX1VHRTsKKyAgfQorfTsKKworLy8vIEhlbHBlciBjbGFzcyBmb3IgaWRlbnRpZnlpbmcgdW5zaWduZWQgbWluIHByZWRpY2F0ZXMuCitzdHJ1Y3QgdW1pbl9wcmVkX3R5IHsKKyAgc3RhdGljIGJvb2wgbWF0Y2goSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkKSB7CisgICAgcmV0dXJuIFByZWQgPT0gQ21wSW5zdDo6SUNNUF9VTFQgfHwgUHJlZCA9PSBDbXBJbnN0OjpJQ01QX1VMRTsKKyAgfQorfTsKKworLy8vIEhlbHBlciBjbGFzcyBmb3IgaWRlbnRpZnlpbmcgb3JkZXJlZCBtYXggcHJlZGljYXRlcy4KK3N0cnVjdCBvZm1heF9wcmVkX3R5IHsKKyAgc3RhdGljIGJvb2wgbWF0Y2goRkNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkKSB7CisgICAgcmV0dXJuIFByZWQgPT0gQ21wSW5zdDo6RkNNUF9PR1QgfHwgUHJlZCA9PSBDbXBJbnN0OjpGQ01QX09HRTsKKyAgfQorfTsKKworLy8vIEhlbHBlciBjbGFzcyBmb3IgaWRlbnRpZnlpbmcgb3JkZXJlZCBtaW4gcHJlZGljYXRlcy4KK3N0cnVjdCBvZm1pbl9wcmVkX3R5IHsKKyAgc3RhdGljIGJvb2wgbWF0Y2goRkNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkKSB7CisgICAgcmV0dXJuIFByZWQgPT0gQ21wSW5zdDo6RkNNUF9PTFQgfHwgUHJlZCA9PSBDbXBJbnN0OjpGQ01QX09MRTsKKyAgfQorfTsKKworLy8vIEhlbHBlciBjbGFzcyBmb3IgaWRlbnRpZnlpbmcgdW5vcmRlcmVkIG1heCBwcmVkaWNhdGVzLgorc3RydWN0IHVmbWF4X3ByZWRfdHkgeworICBzdGF0aWMgYm9vbCBtYXRjaChGQ21wSW5zdDo6UHJlZGljYXRlIFByZWQpIHsKKyAgICByZXR1cm4gUHJlZCA9PSBDbXBJbnN0OjpGQ01QX1VHVCB8fCBQcmVkID09IENtcEluc3Q6OkZDTVBfVUdFOworICB9Cit9OworCisvLy8gSGVscGVyIGNsYXNzIGZvciBpZGVudGlmeWluZyB1bm9yZGVyZWQgbWluIHByZWRpY2F0ZXMuCitzdHJ1Y3QgdWZtaW5fcHJlZF90eSB7CisgIHN0YXRpYyBib29sIG1hdGNoKEZDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCkgeworICAgIHJldHVybiBQcmVkID09IENtcEluc3Q6OkZDTVBfVUxUIHx8IFByZWQgPT0gQ21wSW5zdDo6RkNNUF9VTEU7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBNYXhNaW5fbWF0Y2g8SUNtcEluc3QsIExIUywgUkhTLCBzbWF4X3ByZWRfdHk+IG1fU01heChjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBNYXhNaW5fbWF0Y2g8SUNtcEluc3QsIExIUywgUkhTLCBzbWF4X3ByZWRfdHk+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgTWF4TWluX21hdGNoPElDbXBJbnN0LCBMSFMsIFJIUywgc21pbl9wcmVkX3R5PiBtX1NNaW4oY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gTWF4TWluX21hdGNoPElDbXBJbnN0LCBMSFMsIFJIUywgc21pbl9wcmVkX3R5PihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIE1heE1pbl9tYXRjaDxJQ21wSW5zdCwgTEhTLCBSSFMsIHVtYXhfcHJlZF90eT4gbV9VTWF4KGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIE1heE1pbl9tYXRjaDxJQ21wSW5zdCwgTEhTLCBSSFMsIHVtYXhfcHJlZF90eT4oTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBNYXhNaW5fbWF0Y2g8SUNtcEluc3QsIExIUywgUkhTLCB1bWluX3ByZWRfdHk+IG1fVU1pbihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBNYXhNaW5fbWF0Y2g8SUNtcEluc3QsIExIUywgUkhTLCB1bWluX3ByZWRfdHk+KEwsIFIpOworfQorCisvLy8gTWF0Y2ggYW4gJ29yZGVyZWQnIGZsb2F0aW5nIHBvaW50IG1heGltdW0gZnVuY3Rpb24uCisvLy8gRmxvYXRpbmcgcG9pbnQgaGFzIG9uZSBzcGVjaWFsIHZhbHVlICdOYU4nLiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHRvdGFsCisvLy8gb3JkZXIuIEhvd2V2ZXIsIGlmIHdlIGNhbiBpZ25vcmUgdGhlICdOYU4nIHZhbHVlIChmb3IgZXhhbXBsZSwgYmVjYXVzZSBvZiBhCisvLy8gJ25vLW5hbnMtZmxvYXQtbWF0aCcgZmxhZykgYSBjb21iaW5hdGlvbiBvZiBhIGZjbXAgYW5kIHNlbGVjdCBoYXMgJ21heGltdW0nCisvLy8gc2VtYW50aWNzLiBJbiB0aGUgcHJlc2VuY2Ugb2YgJ05hTicgd2UgaGF2ZSB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwKKy8vLyBzZWxlY3QoZmNtcChvZ3QvZ2UsIEwsIFIpLCBMLCBSKSBzZW1hbnRpY3MgbWF0Y2hlZCBieSB0aGlzIHByZWRpY2F0ZS4KKy8vLworLy8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heChMLCBSKSAgaWZmIEwgYW5kIFIgYXJlIG5vdCBOYU4KKy8vLyAgbV9PcmRGTWF4KEwsIFIpID0gICAgICBSICAgICAgICAgIGlmZiBMIG9yIFIgYXJlIE5hTgordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIE1heE1pbl9tYXRjaDxGQ21wSW5zdCwgTEhTLCBSSFMsIG9mbWF4X3ByZWRfdHk+IG1fT3JkRk1heChjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gTWF4TWluX21hdGNoPEZDbXBJbnN0LCBMSFMsIFJIUywgb2ZtYXhfcHJlZF90eT4oTCwgUik7Cit9CisKKy8vLyBNYXRjaCBhbiAnb3JkZXJlZCcgZmxvYXRpbmcgcG9pbnQgbWluaW11bSBmdW5jdGlvbi4KKy8vLyBGbG9hdGluZyBwb2ludCBoYXMgb25lIHNwZWNpYWwgdmFsdWUgJ05hTicuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gdG90YWwKKy8vLyBvcmRlci4gSG93ZXZlciwgaWYgd2UgY2FuIGlnbm9yZSB0aGUgJ05hTicgdmFsdWUgKGZvciBleGFtcGxlLCBiZWNhdXNlIG9mIGEKKy8vLyAnbm8tbmFucy1mbG9hdC1tYXRoJyBmbGFnKSBhIGNvbWJpbmF0aW9uIG9mIGEgZmNtcCBhbmQgc2VsZWN0IGhhcyAnbWluaW11bScKKy8vLyBzZW1hbnRpY3MuIEluIHRoZSBwcmVzZW5jZSBvZiAnTmFOJyB3ZSBoYXZlIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbAorLy8vIHNlbGVjdChmY21wKG9sdC9sZSwgTCwgUiksIEwsIFIpIHNlbWFudGljcyBtYXRjaGVkIGJ5IHRoaXMgcHJlZGljYXRlLgorLy8vCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluKEwsIFIpICBpZmYgTCBhbmQgUiBhcmUgbm90IE5hTgorLy8vICBtX09yZEZNaW4oTCwgUikgPSAgICAgIFIgICAgICAgICAgaWZmIEwgb3IgUiBhcmUgTmFOCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgTWF4TWluX21hdGNoPEZDbXBJbnN0LCBMSFMsIFJIUywgb2ZtaW5fcHJlZF90eT4gbV9PcmRGTWluKGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBNYXhNaW5fbWF0Y2g8RkNtcEluc3QsIExIUywgUkhTLCBvZm1pbl9wcmVkX3R5PihMLCBSKTsKK30KKworLy8vIE1hdGNoIGFuICd1bm9yZGVyZWQnIGZsb2F0aW5nIHBvaW50IG1heGltdW0gZnVuY3Rpb24uCisvLy8gRmxvYXRpbmcgcG9pbnQgaGFzIG9uZSBzcGVjaWFsIHZhbHVlICdOYU4nLiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHRvdGFsCisvLy8gb3JkZXIuIEhvd2V2ZXIsIGlmIHdlIGNhbiBpZ25vcmUgdGhlICdOYU4nIHZhbHVlIChmb3IgZXhhbXBsZSwgYmVjYXVzZSBvZiBhCisvLy8gJ25vLW5hbnMtZmxvYXQtbWF0aCcgZmxhZykgYSBjb21iaW5hdGlvbiBvZiBhIGZjbXAgYW5kIHNlbGVjdCBoYXMgJ21heGltdW0nCisvLy8gc2VtYW50aWNzLiBJbiB0aGUgcHJlc2VuY2Ugb2YgJ05hTicgd2UgaGF2ZSB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwKKy8vLyBzZWxlY3QoZmNtcCh1Z3QvZ2UsIEwsIFIpLCBMLCBSKSBzZW1hbnRpY3MgbWF0Y2hlZCBieSB0aGlzIHByZWRpY2F0ZS4KKy8vLworLy8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heChMLCBSKSAgaWZmIEwgYW5kIFIgYXJlIG5vdCBOYU4KKy8vLyAgbV9Vbm9yZEZNYXgoTCwgUikgPSAgICBMICAgICAgICAgIGlmZiBMIG9yIFIgYXJlIE5hTgordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIE1heE1pbl9tYXRjaDxGQ21wSW5zdCwgTEhTLCBSSFMsIHVmbWF4X3ByZWRfdHk+CittX1Vub3JkRk1heChjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gTWF4TWluX21hdGNoPEZDbXBJbnN0LCBMSFMsIFJIUywgdWZtYXhfcHJlZF90eT4oTCwgUik7Cit9CisKKy8vLyBNYXRjaCBhbiAndW5vcmRlcmVkJyBmbG9hdGluZyBwb2ludCBtaW5pbXVtIGZ1bmN0aW9uLgorLy8vIEZsb2F0aW5nIHBvaW50IGhhcyBvbmUgc3BlY2lhbCB2YWx1ZSAnTmFOJy4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyB0b3RhbAorLy8vIG9yZGVyLiBIb3dldmVyLCBpZiB3ZSBjYW4gaWdub3JlIHRoZSAnTmFOJyB2YWx1ZSAoZm9yIGV4YW1wbGUsIGJlY2F1c2Ugb2YgYQorLy8vICduby1uYW5zLWZsb2F0LW1hdGgnIGZsYWcpIGEgY29tYmluYXRpb24gb2YgYSBmY21wIGFuZCBzZWxlY3QgaGFzICdtaW5pbXVtJworLy8vIHNlbWFudGljcy4gSW4gdGhlIHByZXNlbmNlIG9mICdOYU4nIHdlIGhhdmUgdG8gcHJlc2VydmUgdGhlIG9yaWdpbmFsCisvLy8gc2VsZWN0KGZjbXAodWx0L2xlLCBMLCBSKSwgTCwgUikgc2VtYW50aWNzIG1hdGNoZWQgYnkgdGhpcyBwcmVkaWNhdGUuCisvLy8KKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKEwsIFIpICBpZmYgTCBhbmQgUiBhcmUgbm90IE5hTgorLy8vICBtX1Vub3JkRk1pbihMLCBSKSA9ICAgICBMICAgICAgICAgIGlmZiBMIG9yIFIgYXJlIE5hTgordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIE1heE1pbl9tYXRjaDxGQ21wSW5zdCwgTEhTLCBSSFMsIHVmbWluX3ByZWRfdHk+CittX1Vub3JkRk1pbihjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gTWF4TWluX21hdGNoPEZDbXBJbnN0LCBMSFMsIFJIUywgdWZtaW5fcHJlZF90eT4oTCwgUik7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYXRjaGVycyBmb3Igb3ZlcmZsb3cgY2hlY2sgcGF0dGVybnM6IGUuZy4gKGEgKyBiKSB1PCBhCisvLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTX3QsIHR5cGVuYW1lIFJIU190LCB0eXBlbmFtZSBTdW1fdD4KK3N0cnVjdCBVQWRkV2l0aE92ZXJmbG93X21hdGNoIHsKKyAgTEhTX3QgTDsKKyAgUkhTX3QgUjsKKyAgU3VtX3QgUzsKKworICBVQWRkV2l0aE92ZXJmbG93X21hdGNoKGNvbnN0IExIU190ICZMLCBjb25zdCBSSFNfdCAmUiwgY29uc3QgU3VtX3QgJlMpCisgICAgICA6IEwoTCksIFIoUiksIFMoUykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4gYm9vbCBtYXRjaChPcFR5ICpWKSB7CisgICAgVmFsdWUgKklDbXBMSFMsICpJQ21wUkhTOworICAgIElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZDsKKyAgICBpZiAoIW1fSUNtcChQcmVkLCBtX1ZhbHVlKElDbXBMSFMpLCBtX1ZhbHVlKElDbXBSSFMpKS5tYXRjaChWKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFZhbHVlICpBZGRMSFMsICpBZGRSSFM7CisgICAgYXV0byBBZGRFeHByID0gbV9BZGQobV9WYWx1ZShBZGRMSFMpLCBtX1ZhbHVlKEFkZFJIUykpOworCisgICAgLy8gKGEgKyBiKSB1PCBhLCAoYSArIGIpIHU8IGIKKyAgICBpZiAoUHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9VTFQpCisgICAgICBpZiAoQWRkRXhwci5tYXRjaChJQ21wTEhTKSAmJiAoSUNtcFJIUyA9PSBBZGRMSFMgfHwgSUNtcFJIUyA9PSBBZGRSSFMpKQorICAgICAgICByZXR1cm4gTC5tYXRjaChBZGRMSFMpICYmIFIubWF0Y2goQWRkUkhTKSAmJiBTLm1hdGNoKElDbXBMSFMpOworCisgICAgLy8gYSA+dSAoYSArIGIpLCBiID51IChhICsgYikKKyAgICBpZiAoUHJlZCA9PSBJQ21wSW5zdDo6SUNNUF9VR1QpCisgICAgICBpZiAoQWRkRXhwci5tYXRjaChJQ21wUkhTKSAmJiAoSUNtcExIUyA9PSBBZGRMSFMgfHwgSUNtcExIUyA9PSBBZGRSSFMpKQorICAgICAgICByZXR1cm4gTC5tYXRjaChBZGRMSFMpICYmIFIubWF0Y2goQWRkUkhTKSAmJiBTLm1hdGNoKElDbXBSSFMpOworCisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvLy8gTWF0Y2ggYW4gaWNtcCBpbnN0cnVjdGlvbiBjaGVja2luZyBmb3IgdW5zaWduZWQgb3ZlcmZsb3cgb24gYWRkaXRpb24uCisvLy8KKy8vLyBTIGlzIG1hdGNoZWQgdG8gdGhlIGFkZGl0aW9uIHdob3NlIHJlc3VsdCBpcyBiZWluZyBjaGVja2VkIGZvciBvdmVyZmxvdywgYW5kCisvLy8gTCBhbmQgUiBhcmUgbWF0Y2hlZCB0byB0aGUgTEhTIGFuZCBSSFMgb2YgUy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFNfdCwgdHlwZW5hbWUgUkhTX3QsIHR5cGVuYW1lIFN1bV90PgorVUFkZFdpdGhPdmVyZmxvd19tYXRjaDxMSFNfdCwgUkhTX3QsIFN1bV90PgorbV9VQWRkV2l0aE92ZXJmbG93KGNvbnN0IExIU190ICZMLCBjb25zdCBSSFNfdCAmUiwgY29uc3QgU3VtX3QgJlMpIHsKKyAgcmV0dXJuIFVBZGRXaXRoT3ZlcmZsb3dfbWF0Y2g8TEhTX3QsIFJIU190LCBTdW1fdD4oTCwgUiwgUyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBPcG5kX3Q+IHN0cnVjdCBBcmd1bWVudF9tYXRjaCB7CisgIHVuc2lnbmVkIE9wSTsKKyAgT3BuZF90IFZhbDsKKworICBBcmd1bWVudF9tYXRjaCh1bnNpZ25lZCBPcElkeCwgY29uc3QgT3BuZF90ICZWKSA6IE9wSShPcElkeCksIFZhbChWKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PiBib29sIG1hdGNoKE9wVHkgKlYpIHsKKyAgICBDYWxsU2l0ZSBDUyhWKTsKKyAgICByZXR1cm4gQ1MuaXNDYWxsKCkgJiYgVmFsLm1hdGNoKENTLmdldEFyZ3VtZW50KE9wSSkpOworICB9Cit9OworCisvLy8gTWF0Y2ggYW4gYXJndW1lbnQuCit0ZW1wbGF0ZSA8dW5zaWduZWQgT3BJLCB0eXBlbmFtZSBPcG5kX3Q+CitpbmxpbmUgQXJndW1lbnRfbWF0Y2g8T3BuZF90PiBtX0FyZ3VtZW50KGNvbnN0IE9wbmRfdCAmT3ApIHsKKyAgcmV0dXJuIEFyZ3VtZW50X21hdGNoPE9wbmRfdD4oT3BJLCBPcCk7Cit9CisKKy8vLyBJbnRyaW5zaWMgbWF0Y2hlcnMuCitzdHJ1Y3QgSW50cmluc2ljSURfbWF0Y2ggeworICB1bnNpZ25lZCBJRDsKKworICBJbnRyaW5zaWNJRF9tYXRjaChJbnRyaW5zaWM6OklEIEludHJJRCkgOiBJRChJbnRySUQpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIGlmIChjb25zdCBhdXRvICpDSSA9IGR5bl9jYXN0PENhbGxJbnN0PihWKSkKKyAgICAgIGlmIChjb25zdCBhdXRvICpGID0gQ0ktPmdldENhbGxlZEZ1bmN0aW9uKCkpCisgICAgICAgIHJldHVybiBGLT5nZXRJbnRyaW5zaWNJRCgpID09IElEOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLy8vIEludHJpbnNpYyBtYXRjaGVzIGFyZSBjb21iaW5hdGlvbnMgb2YgSUQgbWF0Y2hlcnMsIGFuZCBhcmd1bWVudAorLy8vIG1hdGNoZXJzLiBIaWdoZXIgYXJpdHkgbWF0Y2hlciBhcmUgZGVmaW5lZCByZWN1cnNpdmVseSBpbiB0ZXJtcyBvZiBhbmQtaW5nCisvLy8gdGhlbSB3aXRoIGxvd2VyIGFyaXR5IG1hdGNoZXJzLiBIZXJlJ3Mgc29tZSBjb252ZW5pZW50IHR5cGVkZWZzIGZvciB1cCB0bworLy8vIHNldmVyYWwgYXJndW1lbnRzLCBhbmQgbW9yZSBjYW4gYmUgYWRkZWQgYXMgbmVlZGVkCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDAgPSB2b2lkLCB0eXBlbmFtZSBUMSA9IHZvaWQsIHR5cGVuYW1lIFQyID0gdm9pZCwKKyAgICAgICAgICB0eXBlbmFtZSBUMyA9IHZvaWQsIHR5cGVuYW1lIFQ0ID0gdm9pZCwgdHlwZW5hbWUgVDUgPSB2b2lkLAorICAgICAgICAgIHR5cGVuYW1lIFQ2ID0gdm9pZCwgdHlwZW5hbWUgVDcgPSB2b2lkLCB0eXBlbmFtZSBUOCA9IHZvaWQsCisgICAgICAgICAgdHlwZW5hbWUgVDkgPSB2b2lkLCB0eXBlbmFtZSBUMTAgPSB2b2lkPgorc3RydWN0IG1fSW50cmluc2ljX1R5OwordGVtcGxhdGUgPHR5cGVuYW1lIFQwPiBzdHJ1Y3QgbV9JbnRyaW5zaWNfVHk8VDA+IHsKKyAgdXNpbmcgVHkgPSBtYXRjaF9jb21iaW5lX2FuZDxJbnRyaW5zaWNJRF9tYXRjaCwgQXJndW1lbnRfbWF0Y2g8VDA+PjsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxPiBzdHJ1Y3QgbV9JbnRyaW5zaWNfVHk8VDAsIFQxPiB7CisgIHVzaW5nIFR5ID0KKyAgICAgIG1hdGNoX2NvbWJpbmVfYW5kPHR5cGVuYW1lIG1fSW50cmluc2ljX1R5PFQwPjo6VHksIEFyZ3VtZW50X21hdGNoPFQxPj47Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgbV9JbnRyaW5zaWNfVHk8VDAsIFQxLCBUMj4geworICB1c2luZyBUeSA9CisgICAgICBtYXRjaF9jb21iaW5lX2FuZDx0eXBlbmFtZSBtX0ludHJpbnNpY19UeTxUMCwgVDE+OjpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50X21hdGNoPFQyPj47Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorc3RydWN0IG1fSW50cmluc2ljX1R5PFQwLCBUMSwgVDIsIFQzPiB7CisgIHVzaW5nIFR5ID0KKyAgICAgIG1hdGNoX2NvbWJpbmVfYW5kPHR5cGVuYW1lIG1fSW50cmluc2ljX1R5PFQwLCBUMSwgVDI+OjpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50X21hdGNoPFQzPj47Cit9OworCisvLy8gTWF0Y2ggaW50cmluc2ljIGNhbGxzIGxpa2UgdGhpczoKKy8vLyBtX0ludHJpbnNpYzxJbnRyaW5zaWM6OmZhYnM+KG1fVmFsdWUoWCkpCit0ZW1wbGF0ZSA8SW50cmluc2ljOjpJRCBJbnRySUQ+IGlubGluZSBJbnRyaW5zaWNJRF9tYXRjaCBtX0ludHJpbnNpYygpIHsKKyAgcmV0dXJuIEludHJpbnNpY0lEX21hdGNoKEludHJJRCk7Cit9CisKK3RlbXBsYXRlIDxJbnRyaW5zaWM6OklEIEludHJJRCwgdHlwZW5hbWUgVDA+CitpbmxpbmUgdHlwZW5hbWUgbV9JbnRyaW5zaWNfVHk8VDA+OjpUeSBtX0ludHJpbnNpYyhjb25zdCBUMCAmT3AwKSB7CisgIHJldHVybiBtX0NvbWJpbmVBbmQobV9JbnRyaW5zaWM8SW50cklEPigpLCBtX0FyZ3VtZW50PDA+KE9wMCkpOworfQorCit0ZW1wbGF0ZSA8SW50cmluc2ljOjpJRCBJbnRySUQsIHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMT4KK2lubGluZSB0eXBlbmFtZSBtX0ludHJpbnNpY19UeTxUMCwgVDE+OjpUeSBtX0ludHJpbnNpYyhjb25zdCBUMCAmT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxICZPcDEpIHsKKyAgcmV0dXJuIG1fQ29tYmluZUFuZChtX0ludHJpbnNpYzxJbnRySUQ+KE9wMCksIG1fQXJndW1lbnQ8MT4oT3AxKSk7Cit9CisKK3RlbXBsYXRlIDxJbnRyaW5zaWM6OklEIEludHJJRCwgdHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2lubGluZSB0eXBlbmFtZSBtX0ludHJpbnNpY19UeTxUMCwgVDEsIFQyPjo6VHkKK21fSW50cmluc2ljKGNvbnN0IFQwICZPcDAsIGNvbnN0IFQxICZPcDEsIGNvbnN0IFQyICZPcDIpIHsKKyAgcmV0dXJuIG1fQ29tYmluZUFuZChtX0ludHJpbnNpYzxJbnRySUQ+KE9wMCwgT3AxKSwgbV9Bcmd1bWVudDwyPihPcDIpKTsKK30KKwordGVtcGxhdGUgPEludHJpbnNpYzo6SUQgSW50cklELCB0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLAorICAgICAgICAgIHR5cGVuYW1lIFQzPgoraW5saW5lIHR5cGVuYW1lIG1fSW50cmluc2ljX1R5PFQwLCBUMSwgVDIsIFQzPjo6VHkKK21fSW50cmluc2ljKGNvbnN0IFQwICZPcDAsIGNvbnN0IFQxICZPcDEsIGNvbnN0IFQyICZPcDIsIGNvbnN0IFQzICZPcDMpIHsKKyAgcmV0dXJuIG1fQ29tYmluZUFuZChtX0ludHJpbnNpYzxJbnRySUQ+KE9wMCwgT3AxLCBPcDIpLCBtX0FyZ3VtZW50PDM+KE9wMykpOworfQorCisvLyBIZWxwZXIgaW50cmluc2ljIG1hdGNoaW5nIHNwZWNpYWxpemF0aW9ucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBPcG5kMD4KK2lubGluZSB0eXBlbmFtZSBtX0ludHJpbnNpY19UeTxPcG5kMD46OlR5IG1fQml0UmV2ZXJzZShjb25zdCBPcG5kMCAmT3AwKSB7CisgIHJldHVybiBtX0ludHJpbnNpYzxJbnRyaW5zaWM6OmJpdHJldmVyc2U+KE9wMCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBPcG5kMD4KK2lubGluZSB0eXBlbmFtZSBtX0ludHJpbnNpY19UeTxPcG5kMD46OlR5IG1fQlN3YXAoY29uc3QgT3BuZDAgJk9wMCkgeworICByZXR1cm4gbV9JbnRyaW5zaWM8SW50cmluc2ljOjpic3dhcD4oT3AwKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE9wbmQwLCB0eXBlbmFtZSBPcG5kMT4KK2lubGluZSB0eXBlbmFtZSBtX0ludHJpbnNpY19UeTxPcG5kMCwgT3BuZDE+OjpUeSBtX0ZNaW4oY29uc3QgT3BuZDAgJk9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3BuZDEgJk9wMSkgeworICByZXR1cm4gbV9JbnRyaW5zaWM8SW50cmluc2ljOjptaW5udW0+KE9wMCwgT3AxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE9wbmQwLCB0eXBlbmFtZSBPcG5kMT4KK2lubGluZSB0eXBlbmFtZSBtX0ludHJpbnNpY19UeTxPcG5kMCwgT3BuZDE+OjpUeSBtX0ZNYXgoY29uc3QgT3BuZDAgJk9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3BuZDEgJk9wMSkgeworICByZXR1cm4gbV9JbnRyaW5zaWM8SW50cmluc2ljOjptYXhudW0+KE9wMCwgT3AxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE9wbmRfdD4gc3RydWN0IFNpZ251bV9tYXRjaCB7CisgIE9wbmRfdCBWYWw7CisgIFNpZ251bV9tYXRjaChjb25zdCBPcG5kX3QgJlYpIDogVmFsKFYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIHVuc2lnbmVkIFR5cGVTaXplID0gVi0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgaWYgKFR5cGVTaXplID09IDApCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB1bnNpZ25lZCBTaGlmdFdpZHRoID0gVHlwZVNpemUgLSAxOworICAgIFZhbHVlICpPcEwgPSBudWxscHRyLCAqT3BSID0gbnVsbHB0cjsKKworICAgIC8vIFRoaXMgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHNpZ251bSB3ZSBtYXRjaDoKKyAgICAvLworICAgIC8vICBzaWdudW0oeCkgPT0gKHggPj4gNjMpIHwgKC14ID4+dSA2MykKKyAgICAvLworICAgIC8vIEFuIGkxIHZhbHVlIGlzIGl0cyBvd24gc2lnbnVtLCBzbyBpdCdzIGNvcnJlY3QgdG8gbWF0Y2gKKyAgICAvLworICAgIC8vICBzaWdudW0oeCkgPT0gKHggPj4gMCkgIHwgKC14ID4+dSAwKQorICAgIC8vCisgICAgLy8gZm9yIGkxIHZhbHVlcy4KKworICAgIGF1dG8gTEhTID0gbV9BU2hyKG1fVmFsdWUoT3BMKSwgbV9TcGVjaWZpY0ludChTaGlmdFdpZHRoKSk7CisgICAgYXV0byBSSFMgPSBtX0xTaHIobV9OZWcobV9WYWx1ZShPcFIpKSwgbV9TcGVjaWZpY0ludChTaGlmdFdpZHRoKSk7CisgICAgYXV0byBTaWdudW0gPSBtX09yKExIUywgUkhTKTsKKworICAgIHJldHVybiBTaWdudW0ubWF0Y2goVikgJiYgT3BMID09IE9wUiAmJiBWYWwubWF0Y2goT3BMKTsKKyAgfQorfTsKKworLy8vIE1hdGNoZXMgYSBzaWdudW0gcGF0dGVybi4KKy8vLworLy8vIHNpZ251bSh4KSA9CisvLy8gICAgICB4ID4gIDAgIC0+ICAxCisvLy8gICAgICB4ID09IDAgIC0+ICAwCisvLy8gICAgICB4IDwgIDAgIC0+IC0xCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsX3Q+IGlubGluZSBTaWdudW1fbWF0Y2g8VmFsX3Q+IG1fU2lnbnVtKGNvbnN0IFZhbF90ICZWKSB7CisgIHJldHVybiBTaWdudW1fbWF0Y2g8VmFsX3Q+KFYpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWF0Y2hlcnMgZm9yIHR3by1vcGVyYW5kcyBvcGVyYXRvcnMgd2l0aCB0aGUgb3BlcmF0b3JzIGluIGVpdGhlciBvcmRlcgorLy8KKworLy8vIE1hdGNoZXMgYSBCaW5hcnlPcGVyYXRvciB3aXRoIExIUyBhbmQgUkhTIGluIGVpdGhlciBvcmRlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBBbnlCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgdHJ1ZT4gbV9jX0Jpbk9wKGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBBbnlCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgdHJ1ZT4oTCwgUik7Cit9CisKKy8vLyBNYXRjaGVzIGFuIElDbXAgd2l0aCBhIHByZWRpY2F0ZSBvdmVyIExIUyBhbmQgUkhTIGluIGVpdGhlciBvcmRlci4KKy8vLyBEb2VzIG5vdCBzd2FwIHRoZSBwcmVkaWNhdGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQ21wQ2xhc3NfbWF0Y2g8TEhTLCBSSFMsIElDbXBJbnN0LCBJQ21wSW5zdDo6UHJlZGljYXRlLCB0cnVlPgorbV9jX0lDbXAoSUNtcEluc3Q6OlByZWRpY2F0ZSAmUHJlZCwgY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIENtcENsYXNzX21hdGNoPExIUywgUkhTLCBJQ21wSW5zdCwgSUNtcEluc3Q6OlByZWRpY2F0ZSwgdHJ1ZT4oUHJlZCwgTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUik7Cit9CisKKy8vLyBNYXRjaGVzIGEgQWRkIHdpdGggTEhTIGFuZCBSSFMgaW4gZWl0aGVyIG9yZGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6QWRkLCB0cnVlPiBtX2NfQWRkKGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6QWRkLCB0cnVlPihMLCBSKTsKK30KKworLy8vIE1hdGNoZXMgYSBNdWwgd2l0aCBMSFMgYW5kIFJIUyBpbiBlaXRoZXIgb3JkZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpNdWwsIHRydWU+IG1fY19NdWwoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpNdWwsIHRydWU+KEwsIFIpOworfQorCisvLy8gTWF0Y2hlcyBhbiBBbmQgd2l0aCBMSFMgYW5kIFJIUyBpbiBlaXRoZXIgb3JkZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpBbmQsIHRydWU+IG1fY19BbmQoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpBbmQsIHRydWU+KEwsIFIpOworfQorCisvLy8gTWF0Y2hlcyBhbiBPciB3aXRoIExIUyBhbmQgUkhTIGluIGVpdGhlciBvcmRlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246Ok9yLCB0cnVlPiBtX2NfT3IoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6T3IsIHRydWU+KEwsIFIpOworfQorCisvLy8gTWF0Y2hlcyBhbiBYb3Igd2l0aCBMSFMgYW5kIFJIUyBpbiBlaXRoZXIgb3JkZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpYb3IsIHRydWU+IG1fY19Yb3IoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpYb3IsIHRydWU+KEwsIFIpOworfQorCisvLy8gTWF0Y2hlcyBhICdOb3QnIGFzICd4b3IgViwgLTEnIG9yICd4b3IgLTEsIFYnLgordGVtcGxhdGUgPHR5cGVuYW1lIFZhbFR5PgoraW5saW5lIEJpbmFyeU9wX21hdGNoPFZhbFR5LCBjc3RfcHJlZF90eTxpc19hbGxfb25lcz4sIEluc3RydWN0aW9uOjpYb3IsIHRydWU+CittX05vdChjb25zdCBWYWxUeSAmVikgeworICByZXR1cm4gbV9jX1hvcihWLCBtX0FsbE9uZXMoKSk7Cit9CisKKy8vLyBNYXRjaGVzIGFuIFNNaW4gd2l0aCBMSFMgYW5kIFJIUyBpbiBlaXRoZXIgb3JkZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgTWF4TWluX21hdGNoPElDbXBJbnN0LCBMSFMsIFJIUywgc21pbl9wcmVkX3R5LCB0cnVlPgorbV9jX1NNaW4oY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIE1heE1pbl9tYXRjaDxJQ21wSW5zdCwgTEhTLCBSSFMsIHNtaW5fcHJlZF90eSwgdHJ1ZT4oTCwgUik7Cit9CisvLy8gTWF0Y2hlcyBhbiBTTWF4IHdpdGggTEhTIGFuZCBSSFMgaW4gZWl0aGVyIG9yZGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIE1heE1pbl9tYXRjaDxJQ21wSW5zdCwgTEhTLCBSSFMsIHNtYXhfcHJlZF90eSwgdHJ1ZT4KK21fY19TTWF4KGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBNYXhNaW5fbWF0Y2g8SUNtcEluc3QsIExIUywgUkhTLCBzbWF4X3ByZWRfdHksIHRydWU+KEwsIFIpOworfQorLy8vIE1hdGNoZXMgYSBVTWluIHdpdGggTEhTIGFuZCBSSFMgaW4gZWl0aGVyIG9yZGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIE1heE1pbl9tYXRjaDxJQ21wSW5zdCwgTEhTLCBSSFMsIHVtaW5fcHJlZF90eSwgdHJ1ZT4KK21fY19VTWluKGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBNYXhNaW5fbWF0Y2g8SUNtcEluc3QsIExIUywgUkhTLCB1bWluX3ByZWRfdHksIHRydWU+KEwsIFIpOworfQorLy8vIE1hdGNoZXMgYSBVTWF4IHdpdGggTEhTIGFuZCBSSFMgaW4gZWl0aGVyIG9yZGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIE1heE1pbl9tYXRjaDxJQ21wSW5zdCwgTEhTLCBSSFMsIHVtYXhfcHJlZF90eSwgdHJ1ZT4KK21fY19VTWF4KGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBNYXhNaW5fbWF0Y2g8SUNtcEluc3QsIExIUywgUkhTLCB1bWF4X3ByZWRfdHksIHRydWU+KEwsIFIpOworfQorCisvLy8gTWF0Y2hlcyBGQWRkIHdpdGggTEhTIGFuZCBSSFMgaW4gZWl0aGVyIG9yZGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6RkFkZCwgdHJ1ZT4KK21fY19GQWRkKGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OkZBZGQsIHRydWU+KEwsIFIpOworfQorCisvLy8gTWF0Y2hlcyBGTXVsIHdpdGggTEhTIGFuZCBSSFMgaW4gZWl0aGVyIG9yZGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6Rk11bCwgdHJ1ZT4KK21fY19GTXVsKGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OkZNdWwsIHRydWU+KEwsIFIpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgUGF0dGVybk1hdGNoCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9QQVRURVJOTUFUQ0hfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9QcmVkSXRlcmF0b3JDYWNoZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9QcmVkSXRlcmF0b3JDYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZjUzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1ByZWRJdGVyYXRvckNhY2hlLmgKQEAgLTAsMCArMSw4MSBAQAorLy89PT0tIFByZWRJdGVyYXRvckNhY2hlLmggLSBwcmVkX2l0ZXJhdG9yIENhY2hlIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUHJlZEl0ZXJhdG9yQ2FjaGUgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX1BSRURJVEVSQVRPUkNBQ0hFX0gKKyNkZWZpbmUgTExWTV9JUl9QUkVESVRFUkFUT1JDQUNIRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NGRy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gUHJlZEl0ZXJhdG9yQ2FjaGUgLSBUaGlzIGNsYXNzIGlzIGFuIGV4dHJlbWVseSB0cml2aWFsIGNhY2hlIGZvcgorLy8vIHByZWRlY2Vzc29yIGl0ZXJhdG9yIHF1ZXJpZXMuICBUaGlzIGlzIHVzZWZ1bCBmb3IgY29kZSB0aGF0IHJlcGVhdGVkbHkKKy8vLyB3YW50cyB0aGUgcHJlZGVjZXNzb3IgbGlzdCBmb3IgdGhlIHNhbWUgYmxvY2tzLgorY2xhc3MgUHJlZEl0ZXJhdG9yQ2FjaGUgeworICAvLy8gQmxvY2tUb1ByZWRzTWFwIC0gUG9pbnRlciB0byBudWxsLXRlcm1pbmF0ZWQgbGlzdC4KKyAgbXV0YWJsZSBEZW5zZU1hcDxCYXNpY0Jsb2NrICosIEJhc2ljQmxvY2sgKio+IEJsb2NrVG9QcmVkc01hcDsKKyAgbXV0YWJsZSBEZW5zZU1hcDxCYXNpY0Jsb2NrICosIHVuc2lnbmVkPiBCbG9ja1RvUHJlZENvdW50TWFwOworCisgIC8vLyBNZW1vcnkgLSBUaGlzIGlzIHRoZSBzcGFjZSB0aGF0IGhvbGRzIGNhY2hlZCBwcmVkcy4KKyAgQnVtcFB0ckFsbG9jYXRvciBNZW1vcnk7CisKK3ByaXZhdGU6CisgIC8vLyBHZXRQcmVkcyAtIEdldCBhIGNhY2hlZCBsaXN0IGZvciB0aGUgbnVsbC10ZXJtaW5hdGVkIHByZWRlY2Vzc29yIGxpc3Qgb2YKKyAgLy8vIHRoZSBzcGVjaWZpZWQgYmxvY2suICBUaGlzIGNhbiBiZSB1c2VkIGluIGEgbG9vcCBsaWtlIHRoaXM6CisgIC8vLyAgIGZvciAoQmFzaWNCbG9jayAqKlBJID0gUHJlZENhY2hlLT5HZXRQcmVkcyhCQik7ICpQSTsgKytQSSkKKyAgLy8vICAgICAgdXNlKCpQSSk7CisgIC8vLyBpbnN0ZWFkIG9mOgorICAvLy8gZm9yIChwcmVkX2l0ZXJhdG9yIFBJID0gcHJlZF9iZWdpbihCQiksIEUgPSBwcmVkX2VuZChCQik7IFBJICE9IEU7ICsrUEkpCisgIEJhc2ljQmxvY2sgKipHZXRQcmVkcyhCYXNpY0Jsb2NrICpCQikgeworICAgIEJhc2ljQmxvY2sgKiomRW50cnkgPSBCbG9ja1RvUHJlZHNNYXBbQkJdOworICAgIGlmIChFbnRyeSkKKyAgICAgIHJldHVybiBFbnRyeTsKKworICAgIFNtYWxsVmVjdG9yPEJhc2ljQmxvY2sgKiwgMzI+IFByZWRDYWNoZShwcmVkX2JlZ2luKEJCKSwgcHJlZF9lbmQoQkIpKTsKKyAgICBQcmVkQ2FjaGUucHVzaF9iYWNrKG51bGxwdHIpOyAvLyBudWxsIHRlcm1pbmF0b3IuCisKKyAgICBCbG9ja1RvUHJlZENvdW50TWFwW0JCXSA9IFByZWRDYWNoZS5zaXplKCkgLSAxOworCisgICAgRW50cnkgPSBNZW1vcnkuQWxsb2NhdGU8QmFzaWNCbG9jayAqPihQcmVkQ2FjaGUuc2l6ZSgpKTsKKyAgICBzdGQ6OmNvcHkoUHJlZENhY2hlLmJlZ2luKCksIFByZWRDYWNoZS5lbmQoKSwgRW50cnkpOworICAgIHJldHVybiBFbnRyeTsKKyAgfQorCisgIHVuc2lnbmVkIEdldE51bVByZWRzKEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgYXV0byBSZXN1bHQgPSBCbG9ja1RvUHJlZENvdW50TWFwLmZpbmQoQkIpOworICAgIGlmIChSZXN1bHQgIT0gQmxvY2tUb1ByZWRDb3VudE1hcC5lbmQoKSkKKyAgICAgIHJldHVybiBSZXN1bHQtPnNlY29uZDsKKyAgICByZXR1cm4gQmxvY2tUb1ByZWRDb3VudE1hcFtCQl0gPSBzdGQ6OmRpc3RhbmNlKHByZWRfYmVnaW4oQkIpLCBwcmVkX2VuZChCQikpOworICB9CisKK3B1YmxpYzoKKyAgc2l6ZV90IHNpemUoQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsgcmV0dXJuIEdldE51bVByZWRzKEJCKTsgfQorICBBcnJheVJlZjxCYXNpY0Jsb2NrICo+IGdldChCYXNpY0Jsb2NrICpCQikgeworICAgIHJldHVybiBtYWtlQXJyYXlSZWYoR2V0UHJlZHMoQkIpLCBHZXROdW1QcmVkcyhCQikpOworICB9CisKKyAgLy8vIGNsZWFyIC0gUmVtb3ZlIGFsbCBpbmZvcm1hdGlvbi4KKyAgdm9pZCBjbGVhcigpIHsKKyAgICBCbG9ja1RvUHJlZHNNYXAuY2xlYXIoKTsKKyAgICBCbG9ja1RvUHJlZENvdW50TWFwLmNsZWFyKCk7CisgICAgTWVtb3J5LlJlc2V0KCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Qcm9maWxlU3VtbWFyeS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Qcm9maWxlU3VtbWFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NWNlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1Byb2ZpbGVTdW1tYXJ5LmgKQEAgLTAsMCArMSw4NSBAQAorLy89PT0tIFByb2ZpbGVTdW1tYXJ5LmggLSBQcm9maWxlIHN1bW1hcnkgZGF0YSBzdHJ1Y3R1cmUuIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcHJvZmlsZSBzdW1tYXJ5IGRhdGEgc3RydWN0dXJlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9QUk9GSUxFU1VNTUFSWV9ICisjZGVmaW5lIExMVk1fSVJfUFJPRklMRVNVTU1BUllfSAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgTWV0YWRhdGE7CisKKy8vIFRoZSBwcm9maWxlIHN1bW1hcnkgaXMgb25lIG9yIG1vcmUgKEN1dG9mZiwgTWluQ291bnQsIE51bUNvdW50cykgdHJpcGxldHMuCisvLyBUaGUgc2VtYW50aWNzIG9mIGNvdW50cyBkZXBlbmQgb24gdGhlIHR5cGUgb2YgcHJvZmlsZS4gRm9yIGluc3RydW1lbnRhdGlvbgorLy8gcHJvZmlsZSwgY291bnRzIGFyZSBibG9jayBjb3VudHMgYW5kIGZvciBzYW1wbGUgcHJvZmlsZSwgY291bnRzIGFyZQorLy8gcGVyLWxpbmUgc2FtcGxlcy4gR2l2ZW4gYSB0YXJnZXQgY291bnRzIHBlcmNlbnRpbGUsIHdlIGNvbXB1dGUgdGhlIG1pbmltdW0KKy8vIG51bWJlciBvZiBjb3VudHMgbmVlZGVkIHRvIHJlYWNoIHRoaXMgdGFyZ2V0IGFuZCB0aGUgbWluaW11bSBhbW9uZyB0aGVzZQorLy8gY291bnRzLgorc3RydWN0IFByb2ZpbGVTdW1tYXJ5RW50cnkgeworICB1aW50MzJfdCBDdXRvZmY7ICAgIC8vLzwgVGhlIHJlcXVpcmVkIHBlcmNlbnRpbGUgb2YgY291bnRzLgorICB1aW50NjRfdCBNaW5Db3VudDsgIC8vLzwgVGhlIG1pbmltdW0gY291bnQgZm9yIHRoaXMgcGVyY2VudGlsZS4KKyAgdWludDY0X3QgTnVtQ291bnRzOyAvLy88IE51bWJlciBvZiBjb3VudHMgPj0gdGhlIG1pbmltdW0gY291bnQuCisKKyAgUHJvZmlsZVN1bW1hcnlFbnRyeSh1aW50MzJfdCBUaGVDdXRvZmYsIHVpbnQ2NF90IFRoZU1pbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFRoZU51bUNvdW50cykKKyAgICAgIDogQ3V0b2ZmKFRoZUN1dG9mZiksIE1pbkNvdW50KFRoZU1pbkNvdW50KSwgTnVtQ291bnRzKFRoZU51bUNvdW50cykge30KK307CisKK3VzaW5nIFN1bW1hcnlFbnRyeVZlY3RvciA9IHN0ZDo6dmVjdG9yPFByb2ZpbGVTdW1tYXJ5RW50cnk+OworCitjbGFzcyBQcm9maWxlU3VtbWFyeSB7CitwdWJsaWM6CisgIGVudW0gS2luZCB7IFBTS19JbnN0ciwgUFNLX1NhbXBsZSB9OworCitwcml2YXRlOgorICBjb25zdCBLaW5kIFBTSzsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKktpbmRTdHJbMl07CisgIFN1bW1hcnlFbnRyeVZlY3RvciBEZXRhaWxlZFN1bW1hcnk7CisgIHVpbnQ2NF90IFRvdGFsQ291bnQsIE1heENvdW50LCBNYXhJbnRlcm5hbENvdW50LCBNYXhGdW5jdGlvbkNvdW50OworICB1aW50MzJfdCBOdW1Db3VudHMsIE51bUZ1bmN0aW9uczsKKyAgLy8vIFxicmllZiBSZXR1cm4gZGV0YWlsZWQgc3VtbWFyeSBhcyBtZXRhZGF0YS4KKyAgTWV0YWRhdGEgKmdldERldGFpbGVkU3VtbWFyeU1EKExMVk1Db250ZXh0ICZDb250ZXh0KTsKKworcHVibGljOgorICBzdGF0aWMgY29uc3QgaW50IFNjYWxlID0gMTAwMDAwMDsKKworICBQcm9maWxlU3VtbWFyeShLaW5kIEssIFN1bW1hcnlFbnRyeVZlY3RvciBEZXRhaWxlZFN1bW1hcnksCisgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFRvdGFsQ291bnQsIHVpbnQ2NF90IE1heENvdW50LAorICAgICAgICAgICAgICAgICB1aW50NjRfdCBNYXhJbnRlcm5hbENvdW50LCB1aW50NjRfdCBNYXhGdW5jdGlvbkNvdW50LAorICAgICAgICAgICAgICAgICB1aW50MzJfdCBOdW1Db3VudHMsIHVpbnQzMl90IE51bUZ1bmN0aW9ucykKKyAgICAgIDogUFNLKEspLCBEZXRhaWxlZFN1bW1hcnkoc3RkOjptb3ZlKERldGFpbGVkU3VtbWFyeSkpLAorICAgICAgICBUb3RhbENvdW50KFRvdGFsQ291bnQpLCBNYXhDb3VudChNYXhDb3VudCksCisgICAgICAgIE1heEludGVybmFsQ291bnQoTWF4SW50ZXJuYWxDb3VudCksIE1heEZ1bmN0aW9uQ291bnQoTWF4RnVuY3Rpb25Db3VudCksCisgICAgICAgIE51bUNvdW50cyhOdW1Db3VudHMpLCBOdW1GdW5jdGlvbnMoTnVtRnVuY3Rpb25zKSB7fQorCisgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIFBTSzsgfQorICAvLy8gXGJyaWVmIFJldHVybiBzdW1tYXJ5IGluZm9ybWF0aW9uIGFzIG1ldGFkYXRhLgorICBNZXRhZGF0YSAqZ2V0TUQoTExWTUNvbnRleHQgJkNvbnRleHQpOworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBwcm9maWxlIHN1bW1hcnkgZnJvbSBtZXRkYXRhLgorICBzdGF0aWMgUHJvZmlsZVN1bW1hcnkgKmdldEZyb21NRChNZXRhZGF0YSAqTUQpOworICBTdW1tYXJ5RW50cnlWZWN0b3IgJmdldERldGFpbGVkU3VtbWFyeSgpIHsgcmV0dXJuIERldGFpbGVkU3VtbWFyeTsgfQorICB1aW50MzJfdCBnZXROdW1GdW5jdGlvbnMoKSB7IHJldHVybiBOdW1GdW5jdGlvbnM7IH0KKyAgdWludDY0X3QgZ2V0TWF4RnVuY3Rpb25Db3VudCgpIHsgcmV0dXJuIE1heEZ1bmN0aW9uQ291bnQ7IH0KKyAgdWludDMyX3QgZ2V0TnVtQ291bnRzKCkgeyByZXR1cm4gTnVtQ291bnRzOyB9CisgIHVpbnQ2NF90IGdldFRvdGFsQ291bnQoKSB7IHJldHVybiBUb3RhbENvdW50OyB9CisgIHVpbnQ2NF90IGdldE1heENvdW50KCkgeyByZXR1cm4gTWF4Q291bnQ7IH0KKyAgdWludDY0X3QgZ2V0TWF4SW50ZXJuYWxDb3VudCgpIHsgcmV0dXJuIE1heEludGVybmFsQ291bnQ7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX1BST0ZJTEVTVU1NQVJZX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvU2FmZXBvaW50SVJWZXJpZmllci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9TYWZlcG9pbnRJUlZlcmlmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyMDUwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvU2FmZXBvaW50SVJWZXJpZmllci5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vPT09LSBTYWZlcG9pbnRJUlZlcmlmaWVyLmggLSBDaGVja3MgZm9yIEdDIHJlbG9jYXRpb24gcHJvYmxlbXMgKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSB2ZXJpZmllciB3aGljaCBpcyB1c2VmdWwgZm9yIGVuZm9yY2luZyB0aGUgcmVsb2NhdGlvbgorLy8gcHJvcGVydGllcyByZXF1aXJlZCBieSBhIHJlbG9jYXRpbmcgR0MuICBTcGVjaWZpY2FsbHksIGl0IGxvb2tzIGZvciB1c2VzIG9mCisvLyB0aGUgdW5yZWxvY2F0ZWQgdmFsdWUgb2YgcG9pbnRlciBTU0EgdmFsdWVzIGFmdGVyIGEgcG9zc2libGUgc2FmZXBvaW50LiBJdAorLy8gYXR0ZW1wdHMgdG8gcmVwb3J0IG5vIGZhbHNlIG5lZ2F0aXZlcywgYnV0IG1heSBlbmQgdXAgcmVwb3J0aW5nIGZhbHNlCisvLyBwb3NpdGl2ZXMgaW4gcmFyZSBjYXNlcyAoc2VlIHRoZSBub3RlIGF0IHRoZSB0b3Agb2YgdGhlIGNvcnJlc3BvbmRpbmcgY3BwCisvLyBmaWxlLikKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfU0FGRVBPSU5UX0lSX1ZFUklGSUVSCisjZGVmaW5lIExMVk1fSVJfU0FGRVBPSU5UX0lSX1ZFUklGSUVSCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBGdW5jdGlvblBhc3M7CisKKy8vLyBSdW4gdGhlIHNhZmVwb2ludCB2ZXJpZmllciBvdmVyIGEgc2luZ2xlIGZ1bmN0aW9uLiAgQ3Jhc2hlcyBvbiBmYWlsdXJlLgordm9pZCB2ZXJpZnlTYWZlcG9pbnRJUihGdW5jdGlvbiAmRik7CisKKy8vLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhZmVwb2ludCB2ZXJpZmllciBwYXNzIHdoaWNoIGNhbiBiZSBhZGRlZCB0bworLy8vIGEgcGFzcyBwaXBlbGluZSB0byBjaGVjayBmb3IgcmVsb2NhdGlvbiBidWdzLgorRnVuY3Rpb25QYXNzICpjcmVhdGVTYWZlcG9pbnRJUlZlcmlmaWVyUGFzcygpOworfQorCisjZW5kaWYgLy8gTExWTV9JUl9TQUZFUE9JTlRfSVJfVkVSSUZJRVIKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvU3RhdGVwb2ludC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9TdGF0ZXBvaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3ZjY3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvU3RhdGVwb2ludC5oCkBAIC0wLDAgKzEsNDc0IEBACisvLz09PS0gbGx2bS9JUi9TdGF0ZXBvaW50LmggLSBnYy5zdGF0ZXBvaW50IHV0aWxpdGllcyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBhbmQgYSB3cmFwcGVyIGNsYXNzIGFuYWxvZ291cyB0bworLy8gQ2FsbFNpdGUgZm9yIGFjY2Vzc2luZyB0aGUgZmllbGRzIG9mIGdjLnN0YXRlcG9pbnQsIGdjLnJlbG9jYXRlLAorLy8gZ2MucmVzdWx0IGludHJpbnNpY3M7IGFuZCBzb21lIGdlbmVyYWwgdXRpbGl0aWVzIGhlbHBmdWwgd2hlbiBkZWFsaW5nIHdpdGgKKy8vIGdjLnN0YXRlcG9pbnQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX1NUQVRFUE9JTlRfSAorI2RlZmluZSBMTFZNX0lSX1NUQVRFUE9JTlRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUaGUgc3RhdGVwb2ludCBpbnRyaW5zaWMgYWNjZXB0cyBhIHNldCBvZiBmbGFncyBhcyBpdHMgdGhpcmQgYXJndW1lbnQuCisvLy8gVmFsaWQgdmFsdWVzIGNvbWUgb3V0IG9mIHRoaXMgc2V0LgorZW51bSBjbGFzcyBTdGF0ZXBvaW50RmxhZ3MgeworICBOb25lID0gMCwKKyAgR0NUcmFuc2l0aW9uID0gMSwgLy8vPCBJbmRpY2F0ZXMgdGhhdCB0aGlzIHN0YXRlcG9pbnQgaXMgYSB0cmFuc2l0aW9uIGZyb20KKyAgICAgICAgICAgICAgICAgICAgLy8vPCBHQy1hd2FyZSBjb2RlIHRvIGNvZGUgdGhhdCBpcyBub3QgR0MtYXdhcmUuCisgIC8vLyBNYXJrIHRoZSBkZW9wdCBhcmd1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0ZXBvaW50IGFzIG9ubHkgYmVpbmcKKyAgLy8vICJsaXZlLWluIi4gQnkgZGVmYXVsdCwgZGVvcHQgYXJndW1lbnRzIGFyZSAibGl2ZS10aHJvdWdoIi4gICJsaXZlLXRocm91Z2giCisgIC8vLyByZXF1aXJlcyB0aGF0IHRoZXkgdGhlIHZhbHVlIGJlIGxpdmUgb24gZW50cnksIG9uIGV4aXQsIGFuZCBhdCBhbnkgcG9pbnQKKyAgLy8vIGR1cmluZyB0aGUgY2FsbC4gICJsaXZlLWluIiBvbmx5IHJlcXVpcmVzIHRoZSB2YWx1ZSBiZSBhdmFpbGFibGUgYXQgdGhlCisgIC8vLyBzdGFydCBvZiB0aGUgY2FsbC4gIEluIHBhcnRpY3VsYXIsICJsaXZlLWluIiB2YWx1ZXMgY2FuIGJlIHBsYWNlZCBpbgorICAvLy8gdW51c2VkIGFyZ3VtZW50IHJlZ2lzdGVycyBvciBvdGhlciBub24tY2FsbGVlIHNhdmVkIHJlZ2lzdGVycy4KKyAgRGVvcHRMaXZlSW4gPSAyLAorCisgIE1hc2tBbGwgPSAzIC8vLzwgQSBiaXRtYXNrIHRoYXQgaW5jbHVkZXMgYWxsIHZhbGlkIGZsYWdzLgorfTsKKworY2xhc3MgR0NSZWxvY2F0ZUluc3Q7CitjbGFzcyBHQ1Jlc3VsdEluc3Q7CisKK2Jvb2wgaXNTdGF0ZXBvaW50KEltbXV0YWJsZUNhbGxTaXRlIENTKTsKK2Jvb2wgaXNTdGF0ZXBvaW50KGNvbnN0IFZhbHVlICpWKTsKK2Jvb2wgaXNTdGF0ZXBvaW50KGNvbnN0IFZhbHVlICZWKTsKKworYm9vbCBpc0dDUmVsb2NhdGUoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MpOworYm9vbCBpc0dDUmVsb2NhdGUoY29uc3QgVmFsdWUgKlYpOworCitib29sIGlzR0NSZXN1bHQoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MpOworYm9vbCBpc0dDUmVzdWx0KGNvbnN0IFZhbHVlICpWKTsKKworLy8vIEFuYWxvZ291cyB0byBDYWxsU2l0ZUJhc2UsIHRoaXMgcHJvdmlkZXMgbW9zdCBvZiB0aGUgYWN0dWFsCisvLy8gZnVuY3Rpb25hbGl0eSBmb3IgU3RhdGVwb2ludCBhbmQgSW1tdXRhYmxlU3RhdGVwb2ludC4gIEl0IGlzCisvLy8gdGVtcGxhdGl6ZWQgdG8gYWxsb3cgZWFzaWx5IHNwZWNpYWxpemluZyBvZiBjb25zdCBhbmQgbm9uLWNvbnN0CisvLy8gY29uY3JldGUgc3VidHlwZXMuICBUaGlzIGlzIHN0cnVjdHVyZWQgYW5hbG9nb3VzIHRvIENhbGxTaXRlCisvLy8gcmF0aGVyIHRoYW4gdGhlIEludHJpbnNpY0luc3QuaCBoZWxwZXJzIHNpbmNlIHdlIG5lZWQgdG8gc3VwcG9ydAorLy8vIGludm9rYWJsZSBzdGF0ZXBvaW50cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGdW5UeSwgdHlwZW5hbWUgSW5zdHJ1Y3Rpb25UeSwgdHlwZW5hbWUgVmFsdWVUeSwKKyAgICAgICAgICB0eXBlbmFtZSBDYWxsU2l0ZVR5PgorY2xhc3MgU3RhdGVwb2ludEJhc2UgeworICBDYWxsU2l0ZVR5IFN0YXRlcG9pbnRDUzsKKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBTdGF0ZXBvaW50QmFzZShJbnN0cnVjdGlvblR5ICpJKSB7CisgICAgaWYgKGlzU3RhdGVwb2ludChJKSkgeworICAgICAgU3RhdGVwb2ludENTID0gQ2FsbFNpdGVUeShJKTsKKyAgICAgIGFzc2VydChTdGF0ZXBvaW50Q1MgJiYgImlzU3RhdGVwb2ludCBpbXBsaWVzIENhbGxTaXRlIik7CisgICAgfQorICB9CisKKyAgZXhwbGljaXQgU3RhdGVwb2ludEJhc2UoQ2FsbFNpdGVUeSBDUykgeworICAgIGlmIChpc1N0YXRlcG9pbnQoQ1MpKQorICAgICAgU3RhdGVwb2ludENTID0gQ1M7CisgIH0KKworcHVibGljOgorICB1c2luZyBhcmdfaXRlcmF0b3IgPSB0eXBlbmFtZSBDYWxsU2l0ZVR5OjphcmdfaXRlcmF0b3I7CisKKyAgZW51bSB7CisgICAgSURQb3MgPSAwLAorICAgIE51bVBhdGNoQnl0ZXNQb3MgPSAxLAorICAgIENhbGxlZEZ1bmN0aW9uUG9zID0gMiwKKyAgICBOdW1DYWxsQXJnc1BvcyA9IDMsCisgICAgRmxhZ3NQb3MgPSA0LAorICAgIENhbGxBcmdzQmVnaW5Qb3MgPSA1LAorICB9OworCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QsIHVuc2lnbmVkKSA9IGRlbGV0ZTsKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSA9IGRlbGV0ZTsKKworICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgIC8vIFdlIGRvIG5vdCBhc3NpZ24gbm9uLXN0YXRlcG9pbnQgQ2FsbFNpdGVzIHRvIFN0YXRlcG9pbnRDUy4KKyAgICByZXR1cm4gKGJvb2wpU3RhdGVwb2ludENTOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgdW5kZXJseWluZyBDYWxsU2l0ZS4KKyAgQ2FsbFNpdGVUeSBnZXRDYWxsU2l0ZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoKnRoaXMgJiYgImNoZWNrIHZhbGlkaXR5IGZpcnN0ISIpOworICAgIHJldHVybiBTdGF0ZXBvaW50Q1M7CisgIH0KKworICB1aW50NjRfdCBnZXRGbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxDb25zdGFudEludD4oZ2V0Q2FsbFNpdGUoKS5nZXRBcmd1bWVudChGbGFnc1BvcykpCisgICAgICAgIC0+Z2V0WkV4dFZhbHVlKCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdGF0ZXBvaW50LgorICB1aW50NjRfdCBnZXRJRCgpIGNvbnN0IHsKKyAgICBjb25zdCBWYWx1ZSAqSURWYWwgPSBnZXRDYWxsU2l0ZSgpLmdldEFyZ3VtZW50KElEUG9zKTsKKyAgICByZXR1cm4gY2FzdDxDb25zdGFudEludD4oSURWYWwpLT5nZXRaRXh0VmFsdWUoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBwYXRjaGFibGUgYnl0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RhdGVwb2ludC4KKyAgdWludDMyX3QgZ2V0TnVtUGF0Y2hCeXRlcygpIGNvbnN0IHsKKyAgICBjb25zdCBWYWx1ZSAqTnVtUGF0Y2hCeXRlc1ZhbCA9IGdldENhbGxTaXRlKCkuZ2V0QXJndW1lbnQoTnVtUGF0Y2hCeXRlc1Bvcyk7CisgICAgdWludDY0X3QgTnVtUGF0Y2hCeXRlcyA9CisgICAgICBjYXN0PENvbnN0YW50SW50PihOdW1QYXRjaEJ5dGVzVmFsKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgYXNzZXJ0KGlzSW50PDMyPihOdW1QYXRjaEJ5dGVzKSAmJiAic2hvdWxkIGZpdCBpbiAzMiBiaXRzISIpOworICAgIHJldHVybiBOdW1QYXRjaEJ5dGVzOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgdmFsdWUgYWN0dWFsbHkgYmVpbmcgY2FsbGVkIG9yIGludm9rZWQuCisgIFZhbHVlVHkgKmdldENhbGxlZFZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRDYWxsU2l0ZSgpLmdldEFyZ3VtZW50KENhbGxlZEZ1bmN0aW9uUG9zKTsKKyAgfQorCisgIEluc3RydWN0aW9uVHkgKmdldEluc3RydWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBnZXRDYWxsU2l0ZSgpLmdldEluc3RydWN0aW9uKCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBmdW5jdGlvbiBiZWluZyBjYWxsZWQgaWYgdGhpcyBpcyBhIGRpcmVjdCBjYWxsLCBvdGhlcndpc2UKKyAgLy8vIHJldHVybiBudWxsIChpZiBpdCdzIGFuIGluZGlyZWN0IGNhbGwpLgorICBGdW5UeSAqZ2V0Q2FsbGVkRnVuY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGR5bl9jYXN0PEZ1bmN0aW9uPihnZXRDYWxsZWRWYWx1ZSgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGNhbGxlciBmdW5jdGlvbiBmb3IgdGhpcyBzdGF0ZXBvaW50LgorICBGdW5UeSAqZ2V0Q2FsbGVyKCkgY29uc3QgeyByZXR1cm4gZ2V0Q2FsbFNpdGUoKS5nZXRDYWxsZXIoKTsgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIHN0YXRlcG9pbnQgY2Fubm90IHVud2luZC4KKyAgYm9vbCBkb2VzTm90VGhyb3coKSBjb25zdCB7CisgICAgRnVuY3Rpb24gKkYgPSBnZXRDYWxsZWRGdW5jdGlvbigpOworICAgIHJldHVybiBnZXRDYWxsU2l0ZSgpLmRvZXNOb3RUaHJvdygpIHx8IChGID8gRi0+ZG9lc05vdFRocm93KCkgOiBmYWxzZSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgY2FsbCB1bmRlcmx5aW5nIHRoZQorICAvLy8gc3RhdGVwb2ludC4KKyAgVHlwZSAqZ2V0QWN0dWFsUmV0dXJuVHlwZSgpIGNvbnN0IHsKKyAgICBhdXRvICpGVHkgPSBjYXN0PEZ1bmN0aW9uVHlwZT4oCisgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KGdldENhbGxlZFZhbHVlKCktPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpOworICAgIHJldHVybiBGVHktPmdldFJldHVyblR5cGUoKTsKKyAgfQorCisgIC8vLyBOdW1iZXIgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgYWN0dWFsIGNhbGxlZS4KKyAgaW50IGdldE51bUNhbGxBcmdzKCkgY29uc3QgeworICAgIGNvbnN0IFZhbHVlICpOdW1DYWxsQXJnc1ZhbCA9IGdldENhbGxTaXRlKCkuZ2V0QXJndW1lbnQoTnVtQ2FsbEFyZ3NQb3MpOworICAgIHJldHVybiBjYXN0PENvbnN0YW50SW50PihOdW1DYWxsQXJnc1ZhbCktPmdldFpFeHRWYWx1ZSgpOworICB9CisKKyAgc2l6ZV90IGFyZ19zaXplKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtQ2FsbEFyZ3MoKTsgfQorICB0eXBlbmFtZSBDYWxsU2l0ZVR5OjphcmdfaXRlcmF0b3IgYXJnX2JlZ2luKCkgY29uc3QgeworICAgIGFzc2VydChDYWxsQXJnc0JlZ2luUG9zIDw9IChpbnQpZ2V0Q2FsbFNpdGUoKS5hcmdfc2l6ZSgpKTsKKyAgICByZXR1cm4gZ2V0Q2FsbFNpdGUoKS5hcmdfYmVnaW4oKSArIENhbGxBcmdzQmVnaW5Qb3M7CisgIH0KKyAgdHlwZW5hbWUgQ2FsbFNpdGVUeTo6YXJnX2l0ZXJhdG9yIGFyZ19lbmQoKSBjb25zdCB7CisgICAgYXV0byBJID0gYXJnX2JlZ2luKCkgKyBhcmdfc2l6ZSgpOworICAgIGFzc2VydCgoZ2V0Q2FsbFNpdGUoKS5hcmdfZW5kKCkgLSBJKSA+PSAwKTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIFZhbHVlVHkgKmdldEFyZ3VtZW50KHVuc2lnbmVkIEluZGV4KSB7CisgICAgYXNzZXJ0KEluZGV4IDwgYXJnX3NpemUoKSAmJiAib3V0IG9mIGJvdW5kcyEiKTsKKyAgICByZXR1cm4gKihhcmdfYmVnaW4oKSArIEluZGV4KTsKKyAgfQorCisgIC8vLyByYW5nZSBhZGFwdGVyIGZvciBjYWxsIGFyZ3VtZW50cworICBpdGVyYXRvcl9yYW5nZTxhcmdfaXRlcmF0b3I+IGNhbGxfYXJncygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShhcmdfYmVnaW4oKSwgYXJnX2VuZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGNhbGwgb3IgdGhlIGNhbGxlZSBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4KKyAgYm9vbCBwYXJhbUhhc0F0dHIodW5zaWduZWQgaSwgQXR0cmlidXRlOjpBdHRyS2luZCBBKSBjb25zdCB7CisgICAgRnVuY3Rpb24gKkYgPSBnZXRDYWxsZWRGdW5jdGlvbigpOworICAgIHJldHVybiBnZXRDYWxsU2l0ZSgpLnBhcmFtSGFzQXR0cihpICsgQ2FsbEFyZ3NCZWdpblBvcywgQSkgfHwKKyAgICAgICAgICAoRiA/IEYtPmdldEF0dHJpYnV0ZXMoKS5oYXNBdHRyaWJ1dGUoaSwgQSkgOiBmYWxzZSk7CisgIH0KKworICAvLy8gTnVtYmVyIG9mIEdDIHRyYW5zaXRpb24gYXJncy4KKyAgaW50IGdldE51bVRvdGFsR0NUcmFuc2l0aW9uQXJncygpIGNvbnN0IHsKKyAgICBjb25zdCBWYWx1ZSAqTnVtR0NUcmFuc2l0aW9uQXJncyA9ICphcmdfZW5kKCk7CisgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnRJbnQ+KE51bUdDVHJhbnNpdGlvbkFyZ3MpLT5nZXRaRXh0VmFsdWUoKTsKKyAgfQorICB0eXBlbmFtZSBDYWxsU2l0ZVR5OjphcmdfaXRlcmF0b3IgZ2NfdHJhbnNpdGlvbl9hcmdzX2JlZ2luKCkgY29uc3QgeworICAgIGF1dG8gSSA9IGFyZ19lbmQoKSArIDE7CisgICAgYXNzZXJ0KChnZXRDYWxsU2l0ZSgpLmFyZ19lbmQoKSAtIEkpID49IDApOworICAgIHJldHVybiBJOworICB9CisgIHR5cGVuYW1lIENhbGxTaXRlVHk6OmFyZ19pdGVyYXRvciBnY190cmFuc2l0aW9uX2FyZ3NfZW5kKCkgY29uc3QgeworICAgIGF1dG8gSSA9IGdjX3RyYW5zaXRpb25fYXJnc19iZWdpbigpICsgZ2V0TnVtVG90YWxHQ1RyYW5zaXRpb25BcmdzKCk7CisgICAgYXNzZXJ0KChnZXRDYWxsU2l0ZSgpLmFyZ19lbmQoKSAtIEkpID49IDApOworICAgIHJldHVybiBJOworICB9CisKKyAgLy8vIHJhbmdlIGFkYXB0ZXIgZm9yIEdDIHRyYW5zaXRpb24gYXJndW1lbnRzCisgIGl0ZXJhdG9yX3JhbmdlPGFyZ19pdGVyYXRvcj4gZ2NfdHJhbnNpdGlvbl9hcmdzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGdjX3RyYW5zaXRpb25fYXJnc19iZWdpbigpLCBnY190cmFuc2l0aW9uX2FyZ3NfZW5kKCkpOworICB9CisKKyAgLy8vIE51bWJlciBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBleGNsdWRpbmcgdGhvc2UgaW50ZW5kZWQKKyAgLy8vIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24uCisgIGludCBnZXROdW1Ub3RhbFZNU0FyZ3MoKSBjb25zdCB7CisgICAgY29uc3QgVmFsdWUgKk51bVZNU0FyZ3MgPSAqZ2NfdHJhbnNpdGlvbl9hcmdzX2VuZCgpOworICAgIHJldHVybiBjYXN0PENvbnN0YW50SW50PihOdW1WTVNBcmdzKS0+Z2V0WkV4dFZhbHVlKCk7CisgIH0KKworICB0eXBlbmFtZSBDYWxsU2l0ZVR5OjphcmdfaXRlcmF0b3IgZGVvcHRfYmVnaW4oKSBjb25zdCB7CisgICAgYXV0byBJID0gZ2NfdHJhbnNpdGlvbl9hcmdzX2VuZCgpICsgMTsKKyAgICBhc3NlcnQoKGdldENhbGxTaXRlKCkuYXJnX2VuZCgpIC0gSSkgPj0gMCk7CisgICAgcmV0dXJuIEk7CisgIH0KKyAgdHlwZW5hbWUgQ2FsbFNpdGVUeTo6YXJnX2l0ZXJhdG9yIGRlb3B0X2VuZCgpIGNvbnN0IHsKKyAgICBhdXRvIEkgPSBkZW9wdF9iZWdpbigpICsgZ2V0TnVtVG90YWxWTVNBcmdzKCk7CisgICAgYXNzZXJ0KChnZXRDYWxsU2l0ZSgpLmFyZ19lbmQoKSAtIEkpID49IDApOworICAgIHJldHVybiBJOworICB9CisKKyAgLy8vIHJhbmdlIGFkYXB0ZXIgZm9yIHZtIHN0YXRlIGFyZ3VtZW50cworICBpdGVyYXRvcl9yYW5nZTxhcmdfaXRlcmF0b3I+IGRlb3B0X29wZXJhbmRzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGRlb3B0X2JlZ2luKCksIGRlb3B0X2VuZCgpKTsKKyAgfQorCisgIHR5cGVuYW1lIENhbGxTaXRlVHk6OmFyZ19pdGVyYXRvciBnY19hcmdzX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBkZW9wdF9lbmQoKTsKKyAgfQorICB0eXBlbmFtZSBDYWxsU2l0ZVR5OjphcmdfaXRlcmF0b3IgZ2NfYXJnc19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldENhbGxTaXRlKCkuYXJnX2VuZCgpOworICB9CisKKyAgdW5zaWduZWQgZ2NBcmdzU3RhcnRJZHgoKSBjb25zdCB7CisgICAgcmV0dXJuIGdjX2FyZ3NfYmVnaW4oKSAtIGdldEluc3RydWN0aW9uKCktPm9wX2JlZ2luKCk7CisgIH0KKworICAvLy8gcmFuZ2UgYWRhcHRlciBmb3IgZ2MgYXJndW1lbnRzCisgIGl0ZXJhdG9yX3JhbmdlPGFyZ19pdGVyYXRvcj4gZ2NfYXJncygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShnY19hcmdzX2JlZ2luKCksIGdjX2FyZ3NfZW5kKCkpOworICB9CisKKyAgLy8vIEdldCBsaXN0IG9mIGFsbCBnYyByZWxvYWN0ZXMgbGlua2VkIHRvIHRoaXMgc3RhdGVwb2ludAorICAvLy8gTWF5IGNvbnRhaW4gc2V2ZXJhbCByZWxvY2F0aW9ucyBmb3IgdGhlIHNhbWUgYmFzZS9kZXJpdmVkIHBhaXIuCisgIC8vLyBGb3IgZXhhbXBsZSB0aGlzIGNvdWxkIGhhcHBlbiBkdWUgdG8gcmVsb2NhdGlvbnMgb24gdW53aW5kaW5nCisgIC8vLyBwYXRoIG9mIGludm9rZS4KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgR0NSZWxvY2F0ZUluc3QgKj4gZ2V0UmVsb2NhdGVzKCkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgZXhwZXJpbWVudGFsX2djX3Jlc3VsdCBjYWxsIHRpZWQgdG8gdGhpcyBzdGF0ZXBvaW50LiAgQ2FuIGJlCisgIC8vLyBudWxscHRyIGlmIHRoZXJlIGlzbid0IGEgZ2NfcmVzdWx0IHRpZWQgdG8gdGhpcyBzdGF0ZXBvaW50LiAgR3VhcmFudGVlZCB0bworICAvLy8gYmUgYSBDYWxsSW5zdCBpZiBub24tbnVsbC4KKyAgY29uc3QgR0NSZXN1bHRJbnN0ICpnZXRHQ1Jlc3VsdCgpIGNvbnN0IHsKKyAgICBmb3IgKGF1dG8gKlUgOiBnZXRJbnN0cnVjdGlvbigpLT51c2VycygpKQorICAgICAgaWYgKGF1dG8gKkdSSSA9IGR5bl9jYXN0PEdDUmVzdWx0SW5zdD4oVSkpCisgICAgICAgIHJldHVybiBHUkk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworI2lmbmRlZiBOREVCVUcKKyAgLy8vIEFzc2VydHMgaWYgdGhpcyBzdGF0ZXBvaW50IGlzIG1hbGZvcm1lZC4gIENvbW1vbiBjYXNlcyBmb3IgZmFpbHVyZQorICAvLy8gaW5jbHVkZSBpbmNvcnJlY3QgbGVuZ3RoIHByZWZpeGVzIGZvciB2YXJpYWJsZSBsZW5ndGggc2VjdGlvbnMgb3IKKyAgLy8vIGlsbGVnYWwgdmFsdWVzIGZvciBwYXJhbWV0ZXJzLgorICB2b2lkIHZlcmlmeSgpIHsKKyAgICBhc3NlcnQoZ2V0TnVtQ2FsbEFyZ3MoKSA+PSAwICYmCisgICAgICAgICAgICJudW1iZXIgb2YgYXJndW1lbnRzIHRvIGFjdHVhbGx5IGNhbGxlZSBjYW4ndCBiZSBuZWdhdGl2ZSIpOworCisgICAgLy8gVGhlIGludGVybmFsIGFzc2VydHMgaW4gdGhlIGl0ZXJhdG9yIGFjY2Vzc29ycyBkbyB0aGUgcmVzdC4KKyAgICAodm9pZClhcmdfYmVnaW4oKTsKKyAgICAodm9pZClhcmdfZW5kKCk7CisgICAgKHZvaWQpZ2NfdHJhbnNpdGlvbl9hcmdzX2JlZ2luKCk7CisgICAgKHZvaWQpZ2NfdHJhbnNpdGlvbl9hcmdzX2VuZCgpOworICAgICh2b2lkKWRlb3B0X2JlZ2luKCk7CisgICAgKHZvaWQpZGVvcHRfZW5kKCk7CisgICAgKHZvaWQpZ2NfYXJnc19iZWdpbigpOworICAgICh2b2lkKWdjX2FyZ3NfZW5kKCk7CisgIH0KKyNlbmRpZgorfTsKKworLy8vIEEgc3BlY2lhbGl6YXRpb24gb2YgaXQncyBiYXNlIGNsYXNzIGZvciByZWFkIG9ubHkgYWNjZXNzCisvLy8gdG8gYSBnYy5zdGF0ZXBvaW50LgorY2xhc3MgSW1tdXRhYmxlU3RhdGVwb2ludAorICAgIDogcHVibGljIFN0YXRlcG9pbnRCYXNlPGNvbnN0IEZ1bmN0aW9uLCBjb25zdCBJbnN0cnVjdGlvbiwgY29uc3QgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlQ2FsbFNpdGU+IHsKKyAgdXNpbmcgQmFzZSA9CisgICAgICBTdGF0ZXBvaW50QmFzZTxjb25zdCBGdW5jdGlvbiwgY29uc3QgSW5zdHJ1Y3Rpb24sIGNvbnN0IFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlQ2FsbFNpdGU+OworCitwdWJsaWM6CisgIGV4cGxpY2l0IEltbXV0YWJsZVN0YXRlcG9pbnQoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIDogQmFzZShJKSB7fQorICBleHBsaWNpdCBJbW11dGFibGVTdGF0ZXBvaW50KEltbXV0YWJsZUNhbGxTaXRlIENTKSA6IEJhc2UoQ1MpIHt9Cit9OworCisvLy8gQSBzcGVjaWFsaXphdGlvbiBvZiBpdCdzIGJhc2UgY2xhc3MgZm9yIHJlYWQtd3JpdGUgYWNjZXNzCisvLy8gdG8gYSBnYy5zdGF0ZXBvaW50LgorY2xhc3MgU3RhdGVwb2ludAorICAgIDogcHVibGljIFN0YXRlcG9pbnRCYXNlPEZ1bmN0aW9uLCBJbnN0cnVjdGlvbiwgVmFsdWUsIENhbGxTaXRlPiB7CisgIHVzaW5nIEJhc2UgPSBTdGF0ZXBvaW50QmFzZTxGdW5jdGlvbiwgSW5zdHJ1Y3Rpb24sIFZhbHVlLCBDYWxsU2l0ZT47CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgU3RhdGVwb2ludChJbnN0cnVjdGlvbiAqSSkgOiBCYXNlKEkpIHt9CisgIGV4cGxpY2l0IFN0YXRlcG9pbnQoQ2FsbFNpdGUgQ1MpIDogQmFzZShDUykge30KK307CisKKy8vLyBDb21tb24gYmFzZSBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIHZhbHVlcyBwcm9qZWN0ZWQgZnJvbSBhIHN0YXRlcG9pbnQuICAKKy8vLyBDdXJyZW50bHksIHRoZSBvbmx5IHByb2plY3Rpb25zIGF2YWlsYWJsZSBhcmUgZ2MucmVzdWx0IGFuZCBnYy5yZWxvY2F0ZS4KK2NsYXNzIEdDUHJvamVjdGlvbkluc3QgOiBwdWJsaWMgSW50cmluc2ljSW5zdCB7CitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgIHJldHVybiBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2djX3JlbG9jYXRlIHx8CisgICAgICBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2djX3Jlc3VsdDsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0ZSBpcyB0aWVkIHRvIHRoZSBpbnZva2Ugc3RhdGVwb2ludC4KKyAgLy8vIFRoaXMgaW5jbHVkZXMgcmVsb2NhdGVzIHdoaWNoIGFyZSBvbiB0aGUgdW53aW5kaW5nIHBhdGguCisgIGJvb2wgaXNUaWVkVG9JbnZva2UoKSBjb25zdCB7CisgICAgY29uc3QgVmFsdWUgKlRva2VuID0gZ2V0QXJnT3BlcmFuZCgwKTsKKworICAgIHJldHVybiBpc2E8TGFuZGluZ1BhZEluc3Q+KFRva2VuKSB8fCBpc2E8SW52b2tlSW5zdD4oVG9rZW4pOworICB9CisKKyAgLy8vIFRoZSBzdGF0ZXBvaW50IHdpdGggd2hpY2ggdGhpcyBnYy5yZWxvY2F0ZSBpcyBhc3NvY2lhdGVkLgorICBjb25zdCBJbnN0cnVjdGlvbiAqZ2V0U3RhdGVwb2ludCgpIGNvbnN0IHsKKyAgICBjb25zdCBWYWx1ZSAqVG9rZW4gPSBnZXRBcmdPcGVyYW5kKDApOworCisgICAgLy8gVGhpcyB0YWtlcyBjYXJlIGJvdGggb2YgcmVsb2NhdGVzIGZvciBjYWxsIHN0YXRlcG9pbnRzIGFuZCByZWxvY2F0ZXMKKyAgICAvLyBvbiBub3JtYWwgcGF0aCBvZiBpbnZva2Ugc3RhdGVwb2ludC4KKyAgICBpZiAoIWlzYTxMYW5kaW5nUGFkSW5zdD4oVG9rZW4pKSB7CisgICAgICBhc3NlcnQoaXNTdGF0ZXBvaW50KFRva2VuKSk7CisgICAgICByZXR1cm4gY2FzdDxJbnN0cnVjdGlvbj4oVG9rZW4pOworICAgIH0KKworICAgIC8vIFRoaXMgcmVsb2NhdGUgaXMgb24gZXhjZXB0aW9uYWwgcGF0aCBvZiBhbiBpbnZva2Ugc3RhdGVwb2ludAorICAgIGNvbnN0IEJhc2ljQmxvY2sgKkludm9rZUJCID0KKyAgICAgICAgY2FzdDxJbnN0cnVjdGlvbj4oVG9rZW4pLT5nZXRQYXJlbnQoKS0+Z2V0VW5pcXVlUHJlZGVjZXNzb3IoKTsKKworICAgIGFzc2VydChJbnZva2VCQiAmJiAic2FmZXBvaW50cyBzaG91bGQgaGF2ZSB1bmlxdWUgbGFuZGluZ3BhZHMiKTsKKyAgICBhc3NlcnQoSW52b2tlQkItPmdldFRlcm1pbmF0b3IoKSAmJgorICAgICAgICAgICAic2FmZXBvaW50IGJsb2NrIHNob3VsZCBiZSB3ZWxsIGZvcm1lZCIpOworICAgIGFzc2VydChpc1N0YXRlcG9pbnQoSW52b2tlQkItPmdldFRlcm1pbmF0b3IoKSkpOworCisgICAgcmV0dXJuIEludm9rZUJCLT5nZXRUZXJtaW5hdG9yKCk7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGNhbGxzIHRvIHRoZSBnYy5yZWxvY2F0ZSBpbnRyaW5zaWMuCitjbGFzcyBHQ1JlbG9jYXRlSW5zdCA6IHB1YmxpYyBHQ1Byb2plY3Rpb25JbnN0IHsKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgcmV0dXJuIEktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjpleHBlcmltZW50YWxfZ2NfcmVsb2NhdGU7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICB9CisKKyAgLy8vIFRoZSBpbmRleCBpbnRvIHRoZSBhc3NvY2lhdGUgc3RhdGVwb2ludCdzIGFyZ3VtZW50IGxpc3QKKyAgLy8vIHdoaWNoIGNvbnRhaW5zIHRoZSBiYXNlIHBvaW50ZXIgb2YgdGhlIHBvaW50ZXIgd2hvc2UKKyAgLy8vIHJlbG9jYXRpb24gdGhpcyBnYy5yZWxvY2F0ZSBkZXNjcmliZXMuCisgIHVuc2lnbmVkIGdldEJhc2VQdHJJbmRleCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxDb25zdGFudEludD4oZ2V0QXJnT3BlcmFuZCgxKSktPmdldFpFeHRWYWx1ZSgpOworICB9CisKKyAgLy8vIFRoZSBpbmRleCBpbnRvIHRoZSBhc3NvY2lhdGUgc3RhdGVwb2ludCdzIGFyZ3VtZW50IGxpc3Qgd2hpY2gKKyAgLy8vIGNvbnRhaW5zIHRoZSBwb2ludGVyIHdob3NlIHJlbG9jYXRpb24gdGhpcyBnYy5yZWxvY2F0ZSBkZXNjcmliZXMuCisgIHVuc2lnbmVkIGdldERlcml2ZWRQdHJJbmRleCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxDb25zdGFudEludD4oZ2V0QXJnT3BlcmFuZCgyKSktPmdldFpFeHRWYWx1ZSgpOworICB9CisKKyAgVmFsdWUgKmdldEJhc2VQdHIoKSBjb25zdCB7CisgICAgSW1tdXRhYmxlQ2FsbFNpdGUgQ1MoZ2V0U3RhdGVwb2ludCgpKTsKKyAgICByZXR1cm4gKihDUy5hcmdfYmVnaW4oKSArIGdldEJhc2VQdHJJbmRleCgpKTsKKyAgfQorCisgIFZhbHVlICpnZXREZXJpdmVkUHRyKCkgY29uc3QgeworICAgIEltbXV0YWJsZUNhbGxTaXRlIENTKGdldFN0YXRlcG9pbnQoKSk7CisgICAgcmV0dXJuICooQ1MuYXJnX2JlZ2luKCkgKyBnZXREZXJpdmVkUHRySW5kZXgoKSk7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGNhbGxzIHRvIHRoZSBnYy5yZXN1bHQgaW50cmluc2ljLgorY2xhc3MgR0NSZXN1bHRJbnN0IDogcHVibGljIEdDUHJvamVjdGlvbkluc3QgeworcHVibGljOgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF9nY19yZXN1bHQ7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuVHksIHR5cGVuYW1lIEluc3RydWN0aW9uVHksIHR5cGVuYW1lIFZhbHVlVHksCisgICAgICAgICAgdHlwZW5hbWUgQ2FsbFNpdGVUeT4KK3N0ZDo6dmVjdG9yPGNvbnN0IEdDUmVsb2NhdGVJbnN0ICo+CitTdGF0ZXBvaW50QmFzZTxGdW5UeSwgSW5zdHJ1Y3Rpb25UeSwgVmFsdWVUeSwgQ2FsbFNpdGVUeT46OmdldFJlbG9jYXRlcygpCisgICAgY29uc3QgeworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IEdDUmVsb2NhdGVJbnN0ICo+IFJlc3VsdDsKKworICBDYWxsU2l0ZVR5IFN0YXRlcG9pbnRDUyA9IGdldENhbGxTaXRlKCk7CisKKyAgLy8gU2VhcmNoIGZvciByZWxvY2F0ZWQgcG9pbnRlcnMuICBOb3RlIHRoYXQgd29ya2luZyBiYWNrd2FyZHMgZnJvbSB0aGUKKyAgLy8gZ2NfcmVsb2NhdGVzIGVuc3VyZXMgdGhhdCB3ZSBvbmx5IGdldCBwYWlycyB3aGljaCBhcmUgYWN0dWFsbHkgcmVsb2NhdGVkCisgIC8vIGFuZCB1c2VkIGFmdGVyIHRoZSBzdGF0ZXBvaW50LgorICBmb3IgKGNvbnN0IFVzZXIgKlUgOiBnZXRJbnN0cnVjdGlvbigpLT51c2VycygpKQorICAgIGlmIChhdXRvICpSZWxvY2F0ZSA9IGR5bl9jYXN0PEdDUmVsb2NhdGVJbnN0PihVKSkKKyAgICAgIFJlc3VsdC5wdXNoX2JhY2soUmVsb2NhdGUpOworCisgIGlmICghU3RhdGVwb2ludENTLmlzSW52b2tlKCkpCisgICAgcmV0dXJuIFJlc3VsdDsKKworICAvLyBXZSBuZWVkIHRvIHNjYW4gdGhvcm91Z2ggZXhjZXB0aW9uYWwgcmVsb2NhdGlvbnMgaWYgaXQgaXMgaW52b2tlIHN0YXRlcG9pbnQKKyAgTGFuZGluZ1BhZEluc3QgKkxhbmRpbmdQYWQgPQorICAgICAgY2FzdDxJbnZva2VJbnN0PihnZXRJbnN0cnVjdGlvbigpKS0+Z2V0TGFuZGluZ1BhZEluc3QoKTsKKworICAvLyBTZWFyY2ggZm9yIGdjIHJlbG9jYXRlcyB0aGF0IGFyZSBhdHRhY2hlZCB0byB0aGlzIGxhbmRpbmdwYWQuCisgIGZvciAoY29uc3QgVXNlciAqTGFuZGluZ1BhZFVzZXIgOiBMYW5kaW5nUGFkLT51c2VycygpKSB7CisgICAgaWYgKGF1dG8gKlJlbG9jYXRlID0gZHluX2Nhc3Q8R0NSZWxvY2F0ZUluc3Q+KExhbmRpbmdQYWRVc2VyKSkKKyAgICAgIFJlc3VsdC5wdXNoX2JhY2soUmVsb2NhdGUpOworICB9CisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vLyBDYWxsIHNpdGVzIHRoYXQgZ2V0IHdyYXBwZWQgYnkgYSBnYy5zdGF0ZXBvaW50IChjdXJyZW50bHkgb25seSBpbgorLy8vIFJld3JpdGVTdGF0ZXBvaW50c0ZvckdDIGFuZCBwb3RlbnRpYWxseSBpbiBvdGhlciBwYXNzZXMgaW4gdGhlIGZ1dHVyZSkgY2FuCisvLy8gaGF2ZSBhdHRyaWJ1dGVzIHRoYXQgZGVzY3JpYmUgcHJvcGVydGllcyBvZiBnYy5zdGF0ZXBvaW50IGNhbGwgdGhleSB3aWxsIGJlCisvLy8gZXZlbnR1YWxseSBiZSB3cmFwcGVkIGluLiAgVGhpcyBzdHJ1Y3QgaXMgdXNlZCByZXByZXNlbnQgc3VjaCBkaXJlY3RpdmVzLgorc3RydWN0IFN0YXRlcG9pbnREaXJlY3RpdmVzIHsKKyAgT3B0aW9uYWw8dWludDMyX3Q+IE51bVBhdGNoQnl0ZXM7CisgIE9wdGlvbmFsPHVpbnQ2NF90PiBTdGF0ZXBvaW50SUQ7CisKKyAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IERlZmF1bHRTdGF0ZXBvaW50SUQgPSAweEFCQ0RFRjAwOworICBzdGF0aWMgY29uc3QgdWludDY0X3QgRGVvcHRCdW5kbGVTdGF0ZXBvaW50SUQgPSAweEFCQ0RFRjBGOworfTsKKworLy8vIFBhcnNlIG91dCBzdGF0ZXBvaW50IGRpcmVjdGl2ZXMgZnJvbSB0aGUgZnVuY3Rpb24gYXR0cmlidXRlcyBwcmVzZW50IGluIFxwCisvLy8gQVMuCitTdGF0ZXBvaW50RGlyZWN0aXZlcyBwYXJzZVN0YXRlcG9pbnREaXJlY3RpdmVzRnJvbUF0dHJzKEF0dHJpYnV0ZUxpc3QgQVMpOworCisvLy8gUmV0dXJuIFxjIHRydWUgaWYgdGhlIFxwIEF0dHIgaXMgYW4gYXR0cmlidXRlIHRoYXQgaXMgYSBzdGF0ZXBvaW50CisvLy8gZGlyZWN0aXZlLgorYm9vbCBpc1N0YXRlcG9pbnREaXJlY3RpdmVBdHRyKEF0dHJpYnV0ZSBBdHRyKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfU1RBVEVQT0lOVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1N5bWJvbFRhYmxlTGlzdFRyYWl0cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9TeW1ib2xUYWJsZUxpc3RUcmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2NlOTAyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9TeW1ib2xUYWJsZUxpc3RUcmFpdHMuaApAQCAtMCwwICsxLDExOCBAQAorLy89PT0tIGxsdm0vU3ltYm9sVGFibGVMaXN0VHJhaXRzLmggLSBUcmFpdHMgZm9yIGlwbGlzdCAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIGdlbmVyaWMgY2xhc3MgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgYXV0b21hdGljCisvLyBzeW1ib2wgdGFibGUgbWFuaXB1bGF0aW9uIHRoYXQgb2NjdXJzIHdoZW4geW91IHB1dCAoZm9yIGV4YW1wbGUpIGEgbmFtZWQKKy8vIGluc3RydWN0aW9uIGludG8gYSBiYXNpYyBibG9jay4KKy8vCisvLyBUaGUgd2F5IHRoYXQgdGhpcyBpcyBpbXBsZW1lbnRlZCBpcyBieSB1c2luZyBhIHNwZWNpYWwgdHJhaXRzIGNsYXNzIHdpdGggdGhlCisvLyBpbnRydXNpdmUgbGlzdCB0aGF0IG1ha2VzIHVwIHRoZSBsaXN0IG9mIGluc3RydWN0aW9ucyBpbiBhIGJhc2ljIGJsb2NrLiAgV2hlbgorLy8gYSBuZXcgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgbGlzdCBvZiBpbnN0cnVjdGlvbnMsIHRoZSB0cmFpdHMgY2xhc3MgaXMKKy8vIG5vdGlmaWVkLCBhbGxvd2luZyB0aGUgc3ltYm9sIHRhYmxlIHRvIGJlIHVwZGF0ZWQuCisvLworLy8gVGhpcyBnZW5lcmljIGNsYXNzIGltcGxlbWVudHMgdGhlIHRyYWl0cyBjbGFzcy4gIEl0IG11c3QgYmUgZ2VuZXJpYyBzbyB0aGF0CisvLyBpdCBjYW4gd29yayBmb3IgYWxsIHVzZXMgaXQsIHdoaWNoIGluY2x1ZGUgbGlzdHMgb2YgaW5zdHJ1Y3Rpb25zLCBiYXNpYworLy8gYmxvY2tzLCBhcmd1bWVudHMsIGZ1bmN0aW9ucywgZ2xvYmFsIHZhcmlhYmxlcywgZXRjLi4uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX1NZTUJPTFRBQkxFTElTVFRSQUlUU19ICisjZGVmaW5lIExMVk1fSVJfU1lNQk9MVEFCTEVMSVNUVFJBSVRTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvc2ltcGxlX2lsaXN0LmgiCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBcmd1bWVudDsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEdsb2JhbEFsaWFzOworY2xhc3MgR2xvYmFsSUZ1bmM7CitjbGFzcyBHbG9iYWxWYXJpYWJsZTsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTW9kdWxlOworY2xhc3MgVmFsdWVTeW1ib2xUYWJsZTsKKworLy8vIFRlbXBsYXRlIG1ldGFmdW5jdGlvbiB0byBnZXQgdGhlIHBhcmVudCB0eXBlIGZvciBhIHN5bWJvbCB0YWJsZSBsaXN0LgorLy8vCisvLy8gSW1wbGVtZW50YXRpb25zIGNyZWF0ZSBhIHR5cGVkZWYgY2FsbGVkIFxjIHR5cGUgc28gdGhhdCB3ZSBvbmx5IG5lZWQgYQorLy8vIHNpbmdsZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZm9yIHRoZSBsaXN0IGFuZCB0cmFpdHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVR5PiBzdHJ1Y3QgU3ltYm9sVGFibGVMaXN0UGFyZW50VHlwZSB7fTsKKworI2RlZmluZSBERUZJTkVfU1lNQk9MX1RBQkxFX1BBUkVOVF9UWVBFKE5PREUsIFBBUkVOVCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gc3RydWN0IFN5bWJvbFRhYmxlTGlzdFBhcmVudFR5cGU8Tk9ERT4geyB1c2luZyB0eXBlID0gUEFSRU5UOyB9OworREVGSU5FX1NZTUJPTF9UQUJMRV9QQVJFTlRfVFlQRShJbnN0cnVjdGlvbiwgQmFzaWNCbG9jaykKK0RFRklORV9TWU1CT0xfVEFCTEVfUEFSRU5UX1RZUEUoQmFzaWNCbG9jaywgRnVuY3Rpb24pCitERUZJTkVfU1lNQk9MX1RBQkxFX1BBUkVOVF9UWVBFKEFyZ3VtZW50LCBGdW5jdGlvbikKK0RFRklORV9TWU1CT0xfVEFCTEVfUEFSRU5UX1RZUEUoRnVuY3Rpb24sIE1vZHVsZSkKK0RFRklORV9TWU1CT0xfVEFCTEVfUEFSRU5UX1RZUEUoR2xvYmFsVmFyaWFibGUsIE1vZHVsZSkKK0RFRklORV9TWU1CT0xfVEFCTEVfUEFSRU5UX1RZUEUoR2xvYmFsQWxpYXMsIE1vZHVsZSkKK0RFRklORV9TWU1CT0xfVEFCTEVfUEFSRU5UX1RZUEUoR2xvYmFsSUZ1bmMsIE1vZHVsZSkKKyN1bmRlZiBERUZJTkVfU1lNQk9MX1RBQkxFX1BBUkVOVF9UWVBFCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVHk+IGNsYXNzIFN5bWJvbFRhYmxlTGlzdDsKKworLy8gVmFsdWVTdWJDbGFzcyAgIC0gVGhlIHR5cGUgb2Ygb2JqZWN0cyB0aGF0IEkgaG9sZCwgZS5nLiBJbnN0cnVjdGlvbi4KKy8vIEl0ZW1QYXJlbnRDbGFzcyAtIFRoZSB0eXBlIG9mIG9iamVjdCB0aGF0IG93bnMgdGhlIGxpc3QsIGUuZy4gQmFzaWNCbG9jay4KKy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVTdWJDbGFzcz4KK2NsYXNzIFN5bWJvbFRhYmxlTGlzdFRyYWl0cyA6IHB1YmxpYyBpbGlzdF9hbGxvY190cmFpdHM8VmFsdWVTdWJDbGFzcz4geworICB1c2luZyBMaXN0VHkgPSBTeW1ib2xUYWJsZUxpc3Q8VmFsdWVTdWJDbGFzcz47CisgIHVzaW5nIGl0ZXJhdG9yID0gdHlwZW5hbWUgc2ltcGxlX2lsaXN0PFZhbHVlU3ViQ2xhc3M+OjppdGVyYXRvcjsKKyAgdXNpbmcgSXRlbVBhcmVudENsYXNzID0KKyAgICAgIHR5cGVuYW1lIFN5bWJvbFRhYmxlTGlzdFBhcmVudFR5cGU8VmFsdWVTdWJDbGFzcz46OnR5cGU7CisKK3B1YmxpYzoKKyAgU3ltYm9sVGFibGVMaXN0VHJhaXRzKCkgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAvLy8gZ2V0TGlzdE93bmVyIC0gUmV0dXJuIHRoZSBvYmplY3QgdGhhdCBvd25zIHRoaXMgbGlzdC4gIElmIHRoaXMgaXMgYSBsaXN0CisgIC8vLyBvZiBpbnN0cnVjdGlvbnMsIGl0IHJldHVybnMgdGhlIEJhc2ljQmxvY2sgdGhhdCBvd25zIHRoZW0uCisgIEl0ZW1QYXJlbnRDbGFzcyAqZ2V0TGlzdE93bmVyKCkgeworICAgIHNpemVfdCBPZmZzZXQoc2l6ZV90KCYoKEl0ZW1QYXJlbnRDbGFzcyopbnVsbHB0ci0+Kkl0ZW1QYXJlbnRDbGFzczo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdWJsaXN0QWNjZXNzKHN0YXRpY19jYXN0PFZhbHVlU3ViQ2xhc3MqPihudWxscHRyKSkpKSk7CisgICAgTGlzdFR5ICpBbmNob3Ioc3RhdGljX2Nhc3Q8TGlzdFR5ICo+KHRoaXMpKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxJdGVtUGFyZW50Q2xhc3MqPihyZWludGVycHJldF9jYXN0PGNoYXIqPihBbmNob3IpLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCk7CisgIH0KKworICBzdGF0aWMgTGlzdFR5ICZnZXRMaXN0KEl0ZW1QYXJlbnRDbGFzcyAqUGFyKSB7CisgICAgcmV0dXJuIFBhci0+KihQYXItPmdldFN1Ymxpc3RBY2Nlc3MoKFZhbHVlU3ViQ2xhc3MqKW51bGxwdHIpKTsKKyAgfQorCisgIHN0YXRpYyBWYWx1ZVN5bWJvbFRhYmxlICpnZXRTeW1UYWIoSXRlbVBhcmVudENsYXNzICpQYXIpIHsKKyAgICByZXR1cm4gUGFyID8gdG9QdHIoUGFyLT5nZXRWYWx1ZVN5bWJvbFRhYmxlKCkpIDogbnVsbHB0cjsKKyAgfQorCitwdWJsaWM6CisgIHZvaWQgYWRkTm9kZVRvTGlzdChWYWx1ZVN1YkNsYXNzICpWKTsKKyAgdm9pZCByZW1vdmVOb2RlRnJvbUxpc3QoVmFsdWVTdWJDbGFzcyAqVik7CisgIHZvaWQgdHJhbnNmZXJOb2Rlc0Zyb21MaXN0KFN5bWJvbFRhYmxlTGlzdFRyYWl0cyAmTDIsIGl0ZXJhdG9yIGZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvciBsYXN0KTsKKyAgLy8gcHJpdmF0ZToKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVFB0cj4KKyAgdm9pZCBzZXRTeW1UYWJPYmplY3QoVFB0ciAqLCBUUHRyKTsKKyAgc3RhdGljIFZhbHVlU3ltYm9sVGFibGUgKnRvUHRyKFZhbHVlU3ltYm9sVGFibGUgKlApIHsgcmV0dXJuIFA7IH0KKyAgc3RhdGljIFZhbHVlU3ltYm9sVGFibGUgKnRvUHRyKFZhbHVlU3ltYm9sVGFibGUgJlIpIHsgcmV0dXJuICZSOyB9Cit9OworCisvLy8gTGlzdCB0aGF0IGF1dG9tYXRpY2FsbHkgdXBkYXRlcyBwYXJlbnQgbGlua3MgYW5kIHN5bWJvbCB0YWJsZXMuCisvLy8KKy8vLyBXaGVuIG5vZGVzIGFyZSBpbnNlcnRlZCBpbnRvIGFuZCByZW1vdmVkIGZyb20gdGhpcyBsaXN0LCB0aGUgYXNzb2NpYXRlZAorLy8vIHN5bWJvbCB0YWJsZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZC4gIFNpbWlsYXJseSwgcGFyZW50IGxpbmtzIGdldAorLy8vIHVwZGF0ZWQgYXV0b21hdGljYWxseS4KK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgU3ltYm9sVGFibGVMaXN0CisgICAgOiBwdWJsaWMgaXBsaXN0X2ltcGw8c2ltcGxlX2lsaXN0PFQ+LCBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8VD4+IHt9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9TWU1CT0xUQUJMRUxJU1RUUkFJVFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9UcmFja2luZ01EUmVmLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1RyYWNraW5nTURSZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGVjOTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9UcmFja2luZ01EUmVmLmgKQEAgLTAsMCArMSwxNzggQEAKKy8vPT09LSBsbHZtL0lSL1RyYWNraW5nTURSZWYuaCAtIFRyYWNraW5nIE1ldGFkYXRhIHJlZmVyZW5jZXMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gUmVmZXJlbmNlcyB0byBtZXRhZGF0YSB0aGF0IHRyYWNrIFJBVVcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX1RSQUNLSU5HTURSRUZfSAorI2RlZmluZSBMTFZNX0lSX1RSQUNLSU5HTURSRUZfSAorCisjaW5jbHVkZSAibGx2bS9JUi9NZXRhZGF0YS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgVHJhY2tpbmcgbWV0YWRhdGEgcmVmZXJlbmNlLgorLy8vCisvLy8gVGhpcyBjbGFzcyBiZWhhdmVzIGxpa2UgXGEgVHJhY2tpbmdWSCwgYnV0IGZvciBtZXRhZGF0YS4KK2NsYXNzIFRyYWNraW5nTURSZWYgeworICBNZXRhZGF0YSAqTUQgPSBudWxscHRyOworCitwdWJsaWM6CisgIFRyYWNraW5nTURSZWYoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFRyYWNraW5nTURSZWYoTWV0YWRhdGEgKk1EKSA6IE1EKE1EKSB7IHRyYWNrKCk7IH0KKworICBUcmFja2luZ01EUmVmKFRyYWNraW5nTURSZWYgJiZYKSA6IE1EKFguTUQpIHsgcmV0cmFjayhYKTsgfQorICBUcmFja2luZ01EUmVmKGNvbnN0IFRyYWNraW5nTURSZWYgJlgpIDogTUQoWC5NRCkgeyB0cmFjaygpOyB9CisKKyAgVHJhY2tpbmdNRFJlZiAmb3BlcmF0b3I9KFRyYWNraW5nTURSZWYgJiZYKSB7CisgICAgaWYgKCZYID09IHRoaXMpCisgICAgICByZXR1cm4gKnRoaXM7CisKKyAgICB1bnRyYWNrKCk7CisgICAgTUQgPSBYLk1EOworICAgIHJldHJhY2soWCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVHJhY2tpbmdNRFJlZiAmb3BlcmF0b3I9KGNvbnN0IFRyYWNraW5nTURSZWYgJlgpIHsKKyAgICBpZiAoJlggPT0gdGhpcykKKyAgICAgIHJldHVybiAqdGhpczsKKworICAgIHVudHJhY2soKTsKKyAgICBNRCA9IFguTUQ7CisgICAgdHJhY2soKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB+VHJhY2tpbmdNRFJlZigpIHsgdW50cmFjaygpOyB9CisKKyAgTWV0YWRhdGEgKmdldCgpIGNvbnN0IHsgcmV0dXJuIE1EOyB9CisgIG9wZXJhdG9yIE1ldGFkYXRhICooKSBjb25zdCB7IHJldHVybiBnZXQoKTsgfQorICBNZXRhZGF0YSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisgIE1ldGFkYXRhICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqZ2V0KCk7IH0KKworICB2b2lkIHJlc2V0KCkgeworICAgIHVudHJhY2soKTsKKyAgICBNRCA9IG51bGxwdHI7CisgIH0KKyAgdm9pZCByZXNldChNZXRhZGF0YSAqTUQpIHsKKyAgICB1bnRyYWNrKCk7CisgICAgdGhpcy0+TUQgPSBNRDsKKyAgICB0cmFjaygpOworICB9CisKKyAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIHRoaXMgaGFzIGEgdHJpdmlhbCBkZXN0cnVjdG9yLgorICAvLy8KKyAgLy8vIElmIFxjIE1EIGlzbid0IHJlcGxhY2VhYmxlLCB0aGUgZGVzdHJ1Y3RvciB3aWxsIGJlIGEgbm8tb3AuCisgIGJvb2wgaGFzVHJpdmlhbERlc3RydWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuICFNRCB8fCAhTWV0YWRhdGFUcmFja2luZzo6aXNSZXBsYWNlYWJsZSgqTUQpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRyYWNraW5nTURSZWYgJlgpIGNvbnN0IHsgcmV0dXJuIE1EID09IFguTUQ7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRyYWNraW5nTURSZWYgJlgpIGNvbnN0IHsgcmV0dXJuIE1EICE9IFguTUQ7IH0KKworcHJpdmF0ZToKKyAgdm9pZCB0cmFjaygpIHsKKyAgICBpZiAoTUQpCisgICAgICBNZXRhZGF0YVRyYWNraW5nOjp0cmFjayhNRCk7CisgIH0KKworICB2b2lkIHVudHJhY2soKSB7CisgICAgaWYgKE1EKQorICAgICAgTWV0YWRhdGFUcmFja2luZzo6dW50cmFjayhNRCk7CisgIH0KKworICB2b2lkIHJldHJhY2soVHJhY2tpbmdNRFJlZiAmWCkgeworICAgIGFzc2VydChNRCA9PSBYLk1EICYmICJFeHBlY3RlZCB2YWx1ZXMgdG8gbWF0Y2giKTsKKyAgICBpZiAoWC5NRCkgeworICAgICAgTWV0YWRhdGFUcmFja2luZzo6cmV0cmFjayhYLk1ELCBNRCk7CisgICAgICBYLk1EID0gbnVsbHB0cjsKKyAgICB9CisgIH0KK307CisKKy8vLyBcYnJpZWYgVHlwZWQgdHJhY2tpbmcgcmVmLgorLy8vCisvLy8gVHJhY2sgcmVmZXJlcmVuY2VzIG9mIGEgcGFydGljdWxhciB0eXBlLiAgSXQncyB1c2VmdWwgdG8gdXNlIHRoaXMgZm9yIFxhCisvLy8gTUROb2RlIGFuZCBcYSBWYWx1ZUFzTWV0YWRhdGEuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgVHlwZWRUcmFja2luZ01EUmVmIHsKKyAgVHJhY2tpbmdNRFJlZiBSZWY7CisKK3B1YmxpYzoKKyAgVHlwZWRUcmFja2luZ01EUmVmKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBUeXBlZFRyYWNraW5nTURSZWYoVCAqTUQpIDogUmVmKHN0YXRpY19jYXN0PE1ldGFkYXRhICo+KE1EKSkge30KKworICBUeXBlZFRyYWNraW5nTURSZWYoVHlwZWRUcmFja2luZ01EUmVmICYmWCkgOiBSZWYoc3RkOjptb3ZlKFguUmVmKSkge30KKyAgVHlwZWRUcmFja2luZ01EUmVmKGNvbnN0IFR5cGVkVHJhY2tpbmdNRFJlZiAmWCkgOiBSZWYoWC5SZWYpIHt9CisKKyAgVHlwZWRUcmFja2luZ01EUmVmICZvcGVyYXRvcj0oVHlwZWRUcmFja2luZ01EUmVmICYmWCkgeworICAgIFJlZiA9IHN0ZDo6bW92ZShYLlJlZik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVHlwZWRUcmFja2luZ01EUmVmICZvcGVyYXRvcj0oY29uc3QgVHlwZWRUcmFja2luZ01EUmVmICZYKSB7CisgICAgUmVmID0gWC5SZWY7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVCAqZ2V0KCkgY29uc3QgeyByZXR1cm4gKFQgKilSZWYuZ2V0KCk7IH0KKyAgb3BlcmF0b3IgVCAqKCkgY29uc3QgeyByZXR1cm4gZ2V0KCk7IH0KKyAgVCAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisgIFQgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpnZXQoKTsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUeXBlZFRyYWNraW5nTURSZWYgJlgpIGNvbnN0IHsgcmV0dXJuIFJlZiA9PSBYLlJlZjsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgVHlwZWRUcmFja2luZ01EUmVmICZYKSBjb25zdCB7IHJldHVybiBSZWYgIT0gWC5SZWY7IH0KKworICB2b2lkIHJlc2V0KCkgeyBSZWYucmVzZXQoKTsgfQorICB2b2lkIHJlc2V0KFQgKk1EKSB7IFJlZi5yZXNldChzdGF0aWNfY2FzdDxNZXRhZGF0YSAqPihNRCkpOyB9CisKKyAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIHRoaXMgaGFzIGEgdHJpdmlhbCBkZXN0cnVjdG9yLgorICBib29sIGhhc1RyaXZpYWxEZXN0cnVjdG9yKCkgY29uc3QgeyByZXR1cm4gUmVmLmhhc1RyaXZpYWxEZXN0cnVjdG9yKCk7IH0KK307CisKK3VzaW5nIFRyYWNraW5nTUROb2RlUmVmID0gVHlwZWRUcmFja2luZ01EUmVmPE1ETm9kZT47Cit1c2luZyBUcmFja2luZ1ZhbHVlQXNNZXRhZGF0YVJlZiA9IFR5cGVkVHJhY2tpbmdNRFJlZjxWYWx1ZUFzTWV0YWRhdGE+OworCisvLyBFeHBvc2UgdGhlIHVuZGVybHlpbmcgbWV0YWRhdGEgdG8gY2FzdGluZy4KK3RlbXBsYXRlIDw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPFRyYWNraW5nTURSZWY+IHsKKyAgdXNpbmcgU2ltcGxlVHlwZSA9IE1ldGFkYXRhICo7CisKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKFRyYWNraW5nTURSZWYgJk1EKSB7IHJldHVybiBNRC5nZXQoKTsgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8Y29uc3QgVHJhY2tpbmdNRFJlZj4geworICB1c2luZyBTaW1wbGVUeXBlID0gTWV0YWRhdGEgKjsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoY29uc3QgVHJhY2tpbmdNRFJlZiAmTUQpIHsKKyAgICByZXR1cm4gTUQuZ2V0KCk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxUeXBlZFRyYWNraW5nTURSZWY8VD4+IHsKKyAgdXNpbmcgU2ltcGxlVHlwZSA9IFQgKjsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoVHlwZWRUcmFja2luZ01EUmVmPFQ+ICZNRCkgeworICAgIHJldHVybiBNRC5nZXQoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBzaW1wbGlmeV90eXBlPGNvbnN0IFR5cGVkVHJhY2tpbmdNRFJlZjxUPj4geworICB1c2luZyBTaW1wbGVUeXBlID0gVCAqOworCisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShjb25zdCBUeXBlZFRyYWNraW5nTURSZWY8VD4gJk1EKSB7CisgICAgcmV0dXJuIE1ELmdldCgpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9UUkFDS0lOR01EUkVGX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVHlwZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9UeXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhNzk3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVHlwZS5oCkBAIC0wLDAgKzEsNTA0IEBACisvLz09PS0gbGx2bS9UeXBlLmggLSBDbGFzc2VzIGZvciBoYW5kbGluZyBkYXRhIHR5cGVzIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIFR5cGUgY2xhc3MuICBGb3IgbW9yZSAiVHlwZSIKKy8vIHN0dWZmLCBsb29rIGluIERlcml2ZWRUeXBlcy5oLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9UWVBFX0gKKyNkZWZpbmUgTExWTV9JUl9UWVBFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FQRmxvYXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NCaW5kaW5nV3JhcHBpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlPGNsYXNzIEdyYXBoVHlwZT4gc3RydWN0IEdyYXBoVHJhaXRzOworY2xhc3MgSW50ZWdlclR5cGU7CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIFBvaW50ZXJUeXBlOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBTdHJpbmdSZWY7CisKKy8vLyBUaGUgaW5zdGFuY2VzIG9mIHRoZSBUeXBlIGNsYXNzIGFyZSBpbW11dGFibGU6IG9uY2UgdGhleSBhcmUgY3JlYXRlZCwKKy8vLyB0aGV5IGFyZSBuZXZlciBjaGFuZ2VkLiAgQWxzbyBub3RlIHRoYXQgb25seSBvbmUgaW5zdGFuY2Ugb2YgYSBwYXJ0aWN1bGFyCisvLy8gdHlwZSBpcyBldmVyIGNyZWF0ZWQuICBUaHVzIHNlZWluZyBpZiB0d28gdHlwZXMgYXJlIGVxdWFsIGlzIGEgbWF0dGVyIG9mCisvLy8gZG9pbmcgYSB0cml2aWFsIHBvaW50ZXIgY29tcGFyaXNvbi4gVG8gZW5mb3JjZSB0aGF0IG5vIHR3byBlcXVhbCBpbnN0YW5jZXMKKy8vLyBhcmUgY3JlYXRlZCwgVHlwZSBpbnN0YW5jZXMgY2FuIG9ubHkgYmUgY3JlYXRlZCB2aWEgc3RhdGljIGZhY3RvcnkgbWV0aG9kcworLy8vIGluIGNsYXNzIFR5cGUgYW5kIGluIGRlcml2ZWQgY2xhc3Nlcy4gIE9uY2UgYWxsb2NhdGVkLCBUeXBlcyBhcmUgbmV2ZXIKKy8vLyBmcmVlJ2QuCisvLy8KK2NsYXNzIFR5cGUgeworcHVibGljOgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIERlZmluaXRpb25zIG9mIGFsbCBvZiB0aGUgYmFzZSB0eXBlcyBmb3IgdGhlIFR5cGUgc3lzdGVtLiAgQmFzZWQgb24gdGhpcworICAvLy8gdmFsdWUsIHlvdSBjYW4gY2FzdCB0byBhIGNsYXNzIGRlZmluZWQgaW4gRGVyaXZlZFR5cGVzLmguCisgIC8vLyBOb3RlOiBJZiB5b3UgYWRkIGFuIGVsZW1lbnQgdG8gdGhpcywgeW91IG5lZWQgdG8gYWRkIGFuIGVsZW1lbnQgdG8gdGhlCisgIC8vLyBUeXBlOjpnZXRQcmltaXRpdmVUeXBlIGZ1bmN0aW9uLCBvciBlbHNlIHRoaW5ncyB3aWxsIGJyZWFrIQorICAvLy8gQWxzbyB1cGRhdGUgTExWTVR5cGVLaW5kIGFuZCBMTFZNR2V0VHlwZUtpbmQgKCkgaW4gdGhlIEMgYmluZGluZy4KKyAgLy8vCisgIGVudW0gVHlwZUlEIHsKKyAgICAvLyBQcmltaXRpdmVUeXBlcyAtIG1ha2Ugc3VyZSBMYXN0UHJpbWl0aXZlVHlJRCBzdGF5cyB1cCB0byBkYXRlLgorICAgIFZvaWRUeUlEID0gMCwgICAgLy8vPCAgMDogdHlwZSB3aXRoIG5vIHNpemUKKyAgICBIYWxmVHlJRCwgICAgICAgIC8vLzwgIDE6IDE2LWJpdCBmbG9hdGluZyBwb2ludCB0eXBlCisgICAgRmxvYXRUeUlELCAgICAgICAvLy88ICAyOiAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgdHlwZQorICAgIERvdWJsZVR5SUQsICAgICAgLy8vPCAgMzogNjQtYml0IGZsb2F0aW5nIHBvaW50IHR5cGUKKyAgICBYODZfRlA4MFR5SUQsICAgIC8vLzwgIDQ6IDgwLWJpdCBmbG9hdGluZyBwb2ludCB0eXBlIChYODcpCisgICAgRlAxMjhUeUlELCAgICAgICAvLy88ICA1OiAxMjgtYml0IGZsb2F0aW5nIHBvaW50IHR5cGUgKDExMi1iaXQgbWFudGlzc2EpCisgICAgUFBDX0ZQMTI4VHlJRCwgICAvLy88ICA2OiAxMjgtYml0IGZsb2F0aW5nIHBvaW50IHR5cGUgKHR3byA2NC1iaXRzLCBQb3dlclBDKQorICAgIExhYmVsVHlJRCwgICAgICAgLy8vPCAgNzogTGFiZWxzCisgICAgTWV0YWRhdGFUeUlELCAgICAvLy88ICA4OiBNZXRhZGF0YQorICAgIFg4Nl9NTVhUeUlELCAgICAgLy8vPCAgOTogTU1YIHZlY3RvcnMgKDY0IGJpdHMsIFg4NiBzcGVjaWZpYykKKyAgICBUb2tlblR5SUQsICAgICAgIC8vLzwgMTA6IFRva2VucworCisgICAgLy8gRGVyaXZlZCB0eXBlcy4uLiBzZWUgRGVyaXZlZFR5cGVzLmggZmlsZS4KKyAgICAvLyBNYWtlIHN1cmUgRmlyc3REZXJpdmVkVHlJRCBzdGF5cyB1cCB0byBkYXRlIQorICAgIEludGVnZXJUeUlELCAgICAgLy8vPCAxMTogQXJiaXRyYXJ5IGJpdCB3aWR0aCBpbnRlZ2VycworICAgIEZ1bmN0aW9uVHlJRCwgICAgLy8vPCAxMjogRnVuY3Rpb25zCisgICAgU3RydWN0VHlJRCwgICAgICAvLy88IDEzOiBTdHJ1Y3R1cmVzCisgICAgQXJyYXlUeUlELCAgICAgICAvLy88IDE0OiBBcnJheXMKKyAgICBQb2ludGVyVHlJRCwgICAgIC8vLzwgMTU6IFBvaW50ZXJzCisgICAgVmVjdG9yVHlJRCAgICAgICAvLy88IDE2OiBTSU1EICdwYWNrZWQnIGZvcm1hdCwgb3Igb3RoZXIgdmVjdG9yIHR5cGUKKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIFRoaXMgcmVmZXJzIHRvIHRoZSBMTFZNQ29udGV4dCBpbiB3aGljaCB0aGlzIHR5cGUgd2FzIHVuaXF1ZWQuCisgIExMVk1Db250ZXh0ICZDb250ZXh0OworCisgIFR5cGVJRCAgIElEIDogODsgICAgICAgICAgICAvLyBUaGUgY3VycmVudCBiYXNlIHR5cGUgb2YgdGhpcyB0eXBlLgorICB1bnNpZ25lZCBTdWJjbGFzc0RhdGEgOiAyNDsgLy8gU3BhY2UgZm9yIHN1YmNsYXNzZXMgdG8gc3RvcmUgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTUFYX0lOVF9CSVRTIHZhbHVlIGluIEludGVnZXJUeXBlIGNsYXNzLgorCitwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisKKyAgZXhwbGljaXQgVHlwZShMTFZNQ29udGV4dCAmQywgVHlwZUlEIHRpZCkKKyAgICA6IENvbnRleHQoQyksIElEKHRpZCksIFN1YmNsYXNzRGF0YSgwKSB7fQorICB+VHlwZSgpID0gZGVmYXVsdDsKKworICB1bnNpZ25lZCBnZXRTdWJjbGFzc0RhdGEoKSBjb25zdCB7IHJldHVybiBTdWJjbGFzc0RhdGE7IH0KKworICB2b2lkIHNldFN1YmNsYXNzRGF0YSh1bnNpZ25lZCB2YWwpIHsKKyAgICBTdWJjbGFzc0RhdGEgPSB2YWw7CisgICAgLy8gRW5zdXJlIHdlIGRvbid0IGhhdmUgYW55IGFjY2lkZW50YWwgdHJ1bmNhdGlvbi4KKyAgICBhc3NlcnQoZ2V0U3ViY2xhc3NEYXRhKCkgPT0gdmFsICYmICJTdWJjbGFzcyBkYXRhIHRvbyBsYXJnZSBmb3IgZmllbGQiKTsKKyAgfQorCisgIC8vLyBLZWVwcyB0cmFjayBvZiBob3cgbWFueSBUeXBlKidzIHRoZXJlIGFyZSBpbiB0aGUgQ29udGFpbmVkVHlzIGxpc3QuCisgIHVuc2lnbmVkIE51bUNvbnRhaW5lZFR5cyA9IDA7CisKKyAgLy8vIEEgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgVHlwZXMgY29udGFpbmVkIGJ5IHRoaXMgVHlwZS4gRm9yIGV4YW1wbGUsIHRoaXMKKyAgLy8vIGluY2x1ZGVzIHRoZSBhcmd1bWVudHMgb2YgYSBmdW5jdGlvbiB0eXBlLCB0aGUgZWxlbWVudHMgb2YgYSBzdHJ1Y3R1cmUsCisgIC8vLyB0aGUgcG9pbnRlZSBvZiBhIHBvaW50ZXIsIHRoZSBlbGVtZW50IHR5cGUgb2YgYW4gYXJyYXksIGV0Yy4gVGhpcyBwb2ludGVyCisgIC8vLyBtYXkgYmUgMCBmb3IgdHlwZXMgdGhhdCBkb24ndCBjb250YWluIG90aGVyIHR5cGVzIChJbnRlZ2VyLCBEb3VibGUsCisgIC8vLyBGbG9hdCkuCisgIFR5cGUgKiBjb25zdCAqQ29udGFpbmVkVHlzID0gbnVsbHB0cjsKKworICBzdGF0aWMgYm9vbCBpc1NlcXVlbnRpYWxUeXBlKFR5cGVJRCBUeUlEKSB7CisgICAgcmV0dXJuIFR5SUQgPT0gQXJyYXlUeUlEIHx8IFR5SUQgPT0gVmVjdG9yVHlJRDsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBQcmludCB0aGUgY3VycmVudCB0eXBlLgorICAvLy8gT21pdCB0aGUgdHlwZSBkZXRhaWxzIGlmIFxwIE5vRGV0YWlscyA9PSB0cnVlLgorICAvLy8gRS5nLiwgbGV0ICVzdCA9IHR5cGUgeyBpMzIsIGkxNiB9CisgIC8vLyBXaGVuIFxwIE5vRGV0YWlscyBpcyB0cnVlLCB3ZSBvbmx5IHByaW50ICVzdC4KKyAgLy8vIFB1dCBkaWZmZXJlbnRseSwgXHAgTm9EZXRhaWxzIHByaW50cyB0aGUgdHlwZSBhcyBpZgorICAvLy8gaW5saW5lZCB3aXRoIHRoZSBvcGVyYW5kcyB3aGVuIHByaW50aW5nIGFuIGluc3RydWN0aW9uLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPLCBib29sIElzRm9yRGVidWcgPSBmYWxzZSwKKyAgICAgICAgICAgICBib29sIE5vRGV0YWlscyA9IGZhbHNlKSBjb25zdDsKKworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBMTFZNQ29udGV4dCBpbiB3aGljaCB0aGlzIHR5cGUgd2FzIHVuaXF1ZWQuCisgIExMVk1Db250ZXh0ICZnZXRDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQ29udGV4dDsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBY2Nlc3NvcnMgZm9yIHdvcmtpbmcgd2l0aCB0eXBlcy4KKyAgLy8KKworICAvLy8gUmV0dXJuIHRoZSB0eXBlIGlkIGZvciB0aGUgdHlwZS4gVGhpcyB3aWxsIHJldHVybiBvbmUgb2YgdGhlIFR5cGVJRCBlbnVtCisgIC8vLyBlbGVtZW50cyBkZWZpbmVkIGFib3ZlLgorICBUeXBlSUQgZ2V0VHlwZUlEKCkgY29uc3QgeyByZXR1cm4gSUQ7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyAndm9pZCcuCisgIGJvb2wgaXNWb2lkVHkoKSBjb25zdCB7IHJldHVybiBnZXRUeXBlSUQoKSA9PSBWb2lkVHlJRDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzICdoYWxmJywgYSAxNi1iaXQgSUVFRSBmcCB0eXBlLgorICBib29sIGlzSGFsZlR5KCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZUlEKCkgPT0gSGFsZlR5SUQ7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyAnZmxvYXQnLCBhIDMyLWJpdCBJRUVFIGZwIHR5cGUuCisgIGJvb2wgaXNGbG9hdFR5KCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZUlEKCkgPT0gRmxvYXRUeUlEOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgJ2RvdWJsZScsIGEgNjQtYml0IElFRUUgZnAgdHlwZS4KKyAgYm9vbCBpc0RvdWJsZVR5KCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZUlEKCkgPT0gRG91YmxlVHlJRDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIHg4NiBsb25nIGRvdWJsZS4KKyAgYm9vbCBpc1g4Nl9GUDgwVHkoKSBjb25zdCB7IHJldHVybiBnZXRUeXBlSUQoKSA9PSBYODZfRlA4MFR5SUQ7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyAnZnAxMjgnLgorICBib29sIGlzRlAxMjhUeSgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVJRCgpID09IEZQMTI4VHlJRDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIHBvd2VycGMgbG9uZyBkb3VibGUuCisgIGJvb2wgaXNQUENfRlAxMjhUeSgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVJRCgpID09IFBQQ19GUDEyOFR5SUQ7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBvbmUgb2YgdGhlIHNpeCBmbG9hdGluZy1wb2ludCB0eXBlcworICBib29sIGlzRmxvYXRpbmdQb2ludFR5KCkgY29uc3QgeworICAgIHJldHVybiBnZXRUeXBlSUQoKSA9PSBIYWxmVHlJRCB8fCBnZXRUeXBlSUQoKSA9PSBGbG9hdFR5SUQgfHwKKyAgICAgICAgICAgZ2V0VHlwZUlEKCkgPT0gRG91YmxlVHlJRCB8fAorICAgICAgICAgICBnZXRUeXBlSUQoKSA9PSBYODZfRlA4MFR5SUQgfHwgZ2V0VHlwZUlEKCkgPT0gRlAxMjhUeUlEIHx8CisgICAgICAgICAgIGdldFR5cGVJRCgpID09IFBQQ19GUDEyOFR5SUQ7CisgIH0KKworICBjb25zdCBmbHRTZW1hbnRpY3MgJmdldEZsdFNlbWFudGljcygpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKGdldFR5cGVJRCgpKSB7CisgICAgY2FzZSBIYWxmVHlJRDogcmV0dXJuIEFQRmxvYXQ6OklFRUVoYWxmKCk7CisgICAgY2FzZSBGbG9hdFR5SUQ6IHJldHVybiBBUEZsb2F0OjpJRUVFc2luZ2xlKCk7CisgICAgY2FzZSBEb3VibGVUeUlEOiByZXR1cm4gQVBGbG9hdDo6SUVFRWRvdWJsZSgpOworICAgIGNhc2UgWDg2X0ZQODBUeUlEOiByZXR1cm4gQVBGbG9hdDo6eDg3RG91YmxlRXh0ZW5kZWQoKTsKKyAgICBjYXNlIEZQMTI4VHlJRDogcmV0dXJuIEFQRmxvYXQ6OklFRUVxdWFkKCk7CisgICAgY2FzZSBQUENfRlAxMjhUeUlEOiByZXR1cm4gQVBGbG9hdDo6UFBDRG91YmxlRG91YmxlKCk7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBmbG9hdGluZyB0eXBlIik7CisgICAgfQorICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgWDg2IE1NWC4KKyAgYm9vbCBpc1g4Nl9NTVhUeSgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVJRCgpID09IFg4Nl9NTVhUeUlEOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBGUCB0eXBlIG9yIGEgdmVjdG9yIG9mIEZQLgorICBib29sIGlzRlBPckZQVmVjdG9yVHkoKSBjb25zdCB7IHJldHVybiBnZXRTY2FsYXJUeXBlKCktPmlzRmxvYXRpbmdQb2ludFR5KCk7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyAnbGFiZWwnLgorICBib29sIGlzTGFiZWxUeSgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVJRCgpID09IExhYmVsVHlJRDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzICdtZXRhZGF0YScuCisgIGJvb2wgaXNNZXRhZGF0YVR5KCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZUlEKCkgPT0gTWV0YWRhdGFUeUlEOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgJ3Rva2VuJy4KKyAgYm9vbCBpc1Rva2VuVHkoKSBjb25zdCB7IHJldHVybiBnZXRUeXBlSUQoKSA9PSBUb2tlblR5SUQ7IH0KKworICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIEludGVnZXJUeXBlLgorICBib29sIGlzSW50ZWdlclR5KCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZUlEKCkgPT0gSW50ZWdlclR5SUQ7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBJbnRlZ2VyVHlwZSBvZiB0aGUgZ2l2ZW4gd2lkdGguCisgIGJvb2wgaXNJbnRlZ2VyVHkodW5zaWduZWQgQml0d2lkdGgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIGludGVnZXIgdHlwZSBvciBhIHZlY3RvciBvZiBpbnRlZ2VyIHR5cGVzLgorICBib29sIGlzSW50T3JJbnRWZWN0b3JUeSgpIGNvbnN0IHsgcmV0dXJuIGdldFNjYWxhclR5cGUoKS0+aXNJbnRlZ2VyVHkoKTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIGludGVnZXIgdHlwZSBvciBhIHZlY3RvciBvZiBpbnRlZ2VyIHR5cGVzIG9mCisgIC8vLyB0aGUgZ2l2ZW4gd2lkdGguCisgIGJvb2wgaXNJbnRPckludFZlY3RvclR5KHVuc2lnbmVkIEJpdFdpZHRoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFNjYWxhclR5cGUoKS0+aXNJbnRlZ2VyVHkoQml0V2lkdGgpOworICB9CisKKyAgLy8vIFRydWUgaWYgdGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBGdW5jdGlvblR5cGUuCisgIGJvb2wgaXNGdW5jdGlvblR5KCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZUlEKCkgPT0gRnVuY3Rpb25UeUlEOyB9CisKKyAgLy8vIFRydWUgaWYgdGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBTdHJ1Y3RUeXBlLgorICBib29sIGlzU3RydWN0VHkoKSBjb25zdCB7IHJldHVybiBnZXRUeXBlSUQoKSA9PSBTdHJ1Y3RUeUlEOyB9CisKKyAgLy8vIFRydWUgaWYgdGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBBcnJheVR5cGUuCisgIGJvb2wgaXNBcnJheVR5KCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZUlEKCkgPT0gQXJyYXlUeUlEOyB9CisKKyAgLy8vIFRydWUgaWYgdGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBQb2ludGVyVHlwZS4KKyAgYm9vbCBpc1BvaW50ZXJUeSgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVJRCgpID09IFBvaW50ZXJUeUlEOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBwb2ludGVyIHR5cGUgb3IgYSB2ZWN0b3Igb2YgcG9pbnRlciB0eXBlcy4KKyAgYm9vbCBpc1B0ck9yUHRyVmVjdG9yVHkoKSBjb25zdCB7IHJldHVybiBnZXRTY2FsYXJUeXBlKCktPmlzUG9pbnRlclR5KCk7IH0KKworICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIFZlY3RvclR5cGUuCisgIGJvb2wgaXNWZWN0b3JUeSgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVJRCgpID09IFZlY3RvclR5SUQ7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyB0eXBlIGNvdWxkIGJlIGNvbnZlcnRlZCB3aXRoIGEgbG9zc2xlc3MgQml0Q2FzdCB0bworICAvLy8gdHlwZSAnVHknLiBGb3IgZXhhbXBsZSwgaTgqIHRvIGkzMiouIEJpdENhc3RzIGFyZSB2YWxpZCBmb3IgdHlwZXMgb2YgdGhlCisgIC8vLyBzYW1lIHNpemUgb25seSB3aGVyZSBubyByZS1pbnRlcnByZXRhdGlvbiBvZiB0aGUgYml0cyBpcyBkb25lLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIHR5cGUgY291bGQgYmUgbG9zc2xlc3NseSBiaXRjYXN0IHRvIFR5CisgIGJvb2wgY2FuTG9zc2xlc3NseUJpdENhc3RUbyhUeXBlICpUeSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgdHlwZSBpcyBlbXB0eSwgdGhhdCBpcywgaXQgaGFzIG5vIGVsZW1lbnRzIG9yIGFsbCBvZgorICAvLy8gaXRzIGVsZW1lbnRzIGFyZSBlbXB0eS4KKyAgYm9vbCBpc0VtcHR5VHkoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgaXMgImZpcnN0IGNsYXNzIiwgbWVhbmluZyBpdCBpcyBhIHZhbGlkIHR5cGUgZm9yIGEKKyAgLy8vIFZhbHVlLgorICBib29sIGlzRmlyc3RDbGFzc1R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGVJRCgpICE9IEZ1bmN0aW9uVHlJRCAmJiBnZXRUeXBlSUQoKSAhPSBWb2lkVHlJRDsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBhIHZhbGlkIHR5cGUgZm9yIGEgcmVnaXN0ZXIgaW4gY29kZWdlbi4gVGhpcworICAvLy8gaW5jbHVkZXMgYWxsIGZpcnN0LWNsYXNzIHR5cGVzIGV4Y2VwdCBzdHJ1Y3QgYW5kIGFycmF5IHR5cGVzLgorICBib29sIGlzU2luZ2xlVmFsdWVUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBpc0Zsb2F0aW5nUG9pbnRUeSgpIHx8IGlzWDg2X01NWFR5KCkgfHwgaXNJbnRlZ2VyVHkoKSB8fAorICAgICAgICAgICBpc1BvaW50ZXJUeSgpIHx8IGlzVmVjdG9yVHkoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBhbiBhZ2dyZWdhdGUgdHlwZS4gVGhpcyBtZWFucyBpdCBpcyB2YWxpZCBhcworICAvLy8gdGhlIGZpcnN0IG9wZXJhbmQgb2YgYW4gaW5zZXJ0dmFsdWUgb3IgZXh0cmFjdHZhbHVlIGluc3RydWN0aW9uLiBUaGlzCisgIC8vLyBpbmNsdWRlcyBzdHJ1Y3QgYW5kIGFycmF5IHR5cGVzLCBidXQgZG9lcyBub3QgaW5jbHVkZSB2ZWN0b3IgdHlwZXMuCisgIGJvb2wgaXNBZ2dyZWdhdGVUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUeXBlSUQoKSA9PSBTdHJ1Y3RUeUlEIHx8IGdldFR5cGVJRCgpID09IEFycmF5VHlJRDsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBpdCBtYWtlcyBzZW5zZSB0byB0YWtlIHRoZSBzaXplIG9mIHRoaXMgdHlwZS4gVG8gZ2V0IHRoZQorICAvLy8gYWN0dWFsIHNpemUgZm9yIGEgcGFydGljdWxhciB0YXJnZXQsIGl0IGlzIHJlYXNvbmFibGUgdG8gdXNlIHRoZQorICAvLy8gRGF0YUxheW91dCBzdWJzeXN0ZW0gdG8gZG8gdGhpcy4KKyAgYm9vbCBpc1NpemVkKFNtYWxsUHRyU2V0SW1wbDxUeXBlKj4gKlZpc2l0ZWQgPSBudWxscHRyKSBjb25zdCB7CisgICAgLy8gSWYgaXQncyBhIHByaW1pdGl2ZSwgaXQgaXMgYWx3YXlzIHNpemVkLgorICAgIGlmIChnZXRUeXBlSUQoKSA9PSBJbnRlZ2VyVHlJRCB8fCBpc0Zsb2F0aW5nUG9pbnRUeSgpIHx8CisgICAgICAgIGdldFR5cGVJRCgpID09IFBvaW50ZXJUeUlEIHx8CisgICAgICAgIGdldFR5cGVJRCgpID09IFg4Nl9NTVhUeUlEKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gSWYgaXQgaXMgbm90IHNvbWV0aGluZyB0aGF0IGNhbiBoYXZlIGEgc2l6ZSAoZS5nLiBhIGZ1bmN0aW9uIG9yIGxhYmVsKSwKKyAgICAvLyBpdCBkb2Vzbid0IGhhdmUgYSBzaXplLgorICAgIGlmIChnZXRUeXBlSUQoKSAhPSBTdHJ1Y3RUeUlEICYmIGdldFR5cGVJRCgpICE9IEFycmF5VHlJRCAmJgorICAgICAgICBnZXRUeXBlSUQoKSAhPSBWZWN0b3JUeUlEKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIE90aGVyd2lzZSB3ZSBoYXZlIHRvIHRyeSBoYXJkZXIgdG8gZGVjaWRlLgorICAgIHJldHVybiBpc1NpemVkRGVyaXZlZFR5cGUoVmlzaXRlZCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBiYXNpYyBzaXplIG9mIHRoaXMgdHlwZSBpZiBpdCBpcyBhIHByaW1pdGl2ZSB0eXBlLiBUaGVzZSBhcmUKKyAgLy8vIGZpeGVkIGJ5IExMVk0gYW5kIGFyZSBub3QgdGFyZ2V0LWRlcGVuZGVudC4KKyAgLy8vIFRoaXMgd2lsbCByZXR1cm4gemVybyBpZiB0aGUgdHlwZSBkb2VzIG5vdCBoYXZlIGEgc2l6ZSBvciBpcyBub3QgYQorICAvLy8gcHJpbWl0aXZlIHR5cGUuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgbWF5IG5vdCByZWZsZWN0IHRoZSBzaXplIG9mIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGFuCisgIC8vLyBpbnN0YW5jZSBvZiB0aGUgdHlwZSBvciB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIHdyaXR0ZW4gd2hlbiBhbgorICAvLy8gaW5zdGFuY2Ugb2YgdGhlIHR5cGUgaXMgc3RvcmVkIHRvIG1lbW9yeS4gVGhlIERhdGFMYXlvdXQgY2xhc3MgcHJvdmlkZXMKKyAgLy8vIGFkZGl0aW9uYWwgcXVlcnkgZnVuY3Rpb25zIHRvIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIHVuc2lnbmVkIGdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIC8vLyBJZiB0aGlzIGlzIGEgdmVjdG9yIHR5cGUsIHJldHVybiB0aGUgZ2V0UHJpbWl0aXZlU2l6ZUluQml0cyB2YWx1ZSBmb3IgdGhlCisgIC8vLyBlbGVtZW50IHR5cGUuIE90aGVyd2lzZSByZXR1cm4gdGhlIGdldFByaW1pdGl2ZVNpemVJbkJpdHMgdmFsdWUgZm9yIHRoaXMKKyAgLy8vIHR5cGUuCisgIHVuc2lnbmVkIGdldFNjYWxhclNpemVJbkJpdHMoKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIC8vLyBSZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSBtYW50aXNzYSBvZiB0aGlzIHR5cGUuIFRoaXMgaXMgb25seSB2YWxpZCBvbgorICAvLy8gZmxvYXRpbmctcG9pbnQgdHlwZXMuIElmIHRoZSBGUCB0eXBlIGRvZXMgbm90IGhhdmUgYSBzdGFibGUgbWFudGlzc2EgKGUuZy4KKyAgLy8vIHBwYyBsb25nIGRvdWJsZSksIHRoaXMgbWV0aG9kIHJldHVybnMgLTEuCisgIGludCBnZXRGUE1hbnRpc3NhV2lkdGgoKSBjb25zdDsKKworICAvLy8gSWYgdGhpcyBpcyBhIHZlY3RvciB0eXBlLCByZXR1cm4gdGhlIGVsZW1lbnQgdHlwZSwgb3RoZXJ3aXNlIHJldHVybgorICAvLy8gJ3RoaXMnLgorICBUeXBlICpnZXRTY2FsYXJUeXBlKCkgY29uc3QgeworICAgIGlmIChpc1ZlY3RvclR5KCkpCisgICAgICByZXR1cm4gZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxUeXBlKj4odGhpcyk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVHlwZSBJdGVyYXRpb24gc3VwcG9ydC4KKyAgLy8KKyAgdXNpbmcgc3VidHlwZV9pdGVyYXRvciA9IFR5cGUgKiBjb25zdCAqOworCisgIHN1YnR5cGVfaXRlcmF0b3Igc3VidHlwZV9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIENvbnRhaW5lZFR5czsgfQorICBzdWJ0eXBlX2l0ZXJhdG9yIHN1YnR5cGVfZW5kKCkgY29uc3QgeyByZXR1cm4gJkNvbnRhaW5lZFR5c1tOdW1Db250YWluZWRUeXNdO30KKyAgQXJyYXlSZWY8VHlwZSo+IHN1YnR5cGVzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlQXJyYXlSZWYoc3VidHlwZV9iZWdpbigpLCBzdWJ0eXBlX2VuZCgpKTsKKyAgfQorCisgIHVzaW5nIHN1YnR5cGVfcmV2ZXJzZV9pdGVyYXRvciA9IHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxzdWJ0eXBlX2l0ZXJhdG9yPjsKKworICBzdWJ0eXBlX3JldmVyc2VfaXRlcmF0b3Igc3VidHlwZV9yYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIHN1YnR5cGVfcmV2ZXJzZV9pdGVyYXRvcihzdWJ0eXBlX2VuZCgpKTsKKyAgfQorICBzdWJ0eXBlX3JldmVyc2VfaXRlcmF0b3Igc3VidHlwZV9yZW5kKCkgY29uc3QgeworICAgIHJldHVybiBzdWJ0eXBlX3JldmVyc2VfaXRlcmF0b3Ioc3VidHlwZV9iZWdpbigpKTsKKyAgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgdHlwZSBpdGVyYXRvciAoZGVmaW5lZCBhdCB0aGUgZW5kIG9mCisgIC8vLyB0aGUgZmlsZSkuIEZvciBkZXJpdmVkIHR5cGVzLCB0aGlzIHJldHVybnMgdGhlIHR5cGVzICdjb250YWluZWQnIGluIHRoZQorICAvLy8gZGVyaXZlZCB0eXBlLgorICBUeXBlICpnZXRDb250YWluZWRUeXBlKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IE51bUNvbnRhaW5lZFR5cyAmJiAiSW5kZXggb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBDb250YWluZWRUeXNbaV07CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgdHlwZXMgaW4gdGhlIGRlcml2ZWQgdHlwZS4KKyAgdW5zaWduZWQgZ2V0TnVtQ29udGFpbmVkVHlwZXMoKSBjb25zdCB7IHJldHVybiBOdW1Db250YWluZWRUeXM7IH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSGVscGVyIG1ldGhvZHMgY29ycmVzcG9uZGluZyB0byBzdWJjbGFzcyBtZXRob2RzLiAgVGhpcyBmb3JjZXMgYSBjYXN0IHRvCisgIC8vIHRoZSBzcGVjaWZpZWQgc3ViY2xhc3MgYW5kIGNhbGxzIGl0cyBhY2Nlc3Nvci4gICJnZXRWZWN0b3JOdW1FbGVtZW50cyIgKGZvcgorICAvLyBleGFtcGxlKSBpcyBzaG9ydGhhbmQgZm9yIGNhc3Q8VmVjdG9yVHlwZT4oVHkpLT5nZXROdW1FbGVtZW50cygpLiAgVGhpcyBpcworICAvLyBvbmx5IGludGVuZGVkIHRvIGNvdmVyIHRoZSBjb3JlIG1ldGhvZHMgdGhhdCBhcmUgZnJlcXVlbnRseSB1c2VkLCBoZWxwZXIKKyAgLy8gbWV0aG9kcyBzaG91bGQgbm90IGJlIGFkZGVkIGhlcmUuCisKKyAgaW5saW5lIHVuc2lnbmVkIGdldEludGVnZXJCaXRXaWR0aCgpIGNvbnN0OworCisgIGlubGluZSBUeXBlICpnZXRGdW5jdGlvblBhcmFtVHlwZSh1bnNpZ25lZCBpKSBjb25zdDsKKyAgaW5saW5lIHVuc2lnbmVkIGdldEZ1bmN0aW9uTnVtUGFyYW1zKCkgY29uc3Q7CisgIGlubGluZSBib29sIGlzRnVuY3Rpb25WYXJBcmcoKSBjb25zdDsKKworICBpbmxpbmUgU3RyaW5nUmVmIGdldFN0cnVjdE5hbWUoKSBjb25zdDsKKyAgaW5saW5lIHVuc2lnbmVkIGdldFN0cnVjdE51bUVsZW1lbnRzKCkgY29uc3Q7CisgIGlubGluZSBUeXBlICpnZXRTdHJ1Y3RFbGVtZW50VHlwZSh1bnNpZ25lZCBOKSBjb25zdDsKKworICBpbmxpbmUgVHlwZSAqZ2V0U2VxdWVudGlhbEVsZW1lbnRUeXBlKCkgY29uc3QgeworICAgIGFzc2VydChpc1NlcXVlbnRpYWxUeXBlKGdldFR5cGVJRCgpKSAmJiAiTm90IGEgc2VxdWVudGlhbCB0eXBlISIpOworICAgIHJldHVybiBDb250YWluZWRUeXNbMF07CisgIH0KKworICBpbmxpbmUgdWludDY0X3QgZ2V0QXJyYXlOdW1FbGVtZW50cygpIGNvbnN0OworCisgIFR5cGUgKmdldEFycmF5RWxlbWVudFR5cGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldFR5cGVJRCgpID09IEFycmF5VHlJRCk7CisgICAgcmV0dXJuIENvbnRhaW5lZFR5c1swXTsKKyAgfQorCisgIGlubGluZSB1bnNpZ25lZCBnZXRWZWN0b3JOdW1FbGVtZW50cygpIGNvbnN0OworICBUeXBlICpnZXRWZWN0b3JFbGVtZW50VHlwZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0VHlwZUlEKCkgPT0gVmVjdG9yVHlJRCk7CisgICAgcmV0dXJuIENvbnRhaW5lZFR5c1swXTsKKyAgfQorCisgIFR5cGUgKmdldFBvaW50ZXJFbGVtZW50VHlwZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0VHlwZUlEKCkgPT0gUG9pbnRlclR5SUQpOworICAgIHJldHVybiBDb250YWluZWRUeXNbMF07CisgIH0KKworICAvLy8gR2V0IHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoaXMgcG9pbnRlciBvciBwb2ludGVyIHZlY3RvciB0eXBlLgorICBpbmxpbmUgdW5zaWduZWQgZ2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBTdGF0aWMgbWVtYmVycyBleHBvcnRlZCBieSB0aGUgVHlwZSBjbGFzcyBpdHNlbGYuICBVc2VmdWwgZm9yIGdldHRpbmcKKyAgLy8gaW5zdGFuY2VzIG9mIFR5cGUuCisgIC8vCisKKyAgLy8vIFJldHVybiBhIHR5cGUgYmFzZWQgb24gYW4gaWRlbnRpZmllci4KKyAgc3RhdGljIFR5cGUgKmdldFByaW1pdGl2ZVR5cGUoTExWTUNvbnRleHQgJkMsIFR5cGVJRCBJRE51bWJlcik7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFRoZXNlIGFyZSB0aGUgYnVpbHRpbiB0eXBlcyB0aGF0IGFyZSBhbHdheXMgYXZhaWxhYmxlLgorICAvLworICBzdGF0aWMgVHlwZSAqZ2V0Vm9pZFR5KExMVk1Db250ZXh0ICZDKTsKKyAgc3RhdGljIFR5cGUgKmdldExhYmVsVHkoTExWTUNvbnRleHQgJkMpOworICBzdGF0aWMgVHlwZSAqZ2V0SGFsZlR5KExMVk1Db250ZXh0ICZDKTsKKyAgc3RhdGljIFR5cGUgKmdldEZsb2F0VHkoTExWTUNvbnRleHQgJkMpOworICBzdGF0aWMgVHlwZSAqZ2V0RG91YmxlVHkoTExWTUNvbnRleHQgJkMpOworICBzdGF0aWMgVHlwZSAqZ2V0TWV0YWRhdGFUeShMTFZNQ29udGV4dCAmQyk7CisgIHN0YXRpYyBUeXBlICpnZXRYODZfRlA4MFR5KExMVk1Db250ZXh0ICZDKTsKKyAgc3RhdGljIFR5cGUgKmdldEZQMTI4VHkoTExWTUNvbnRleHQgJkMpOworICBzdGF0aWMgVHlwZSAqZ2V0UFBDX0ZQMTI4VHkoTExWTUNvbnRleHQgJkMpOworICBzdGF0aWMgVHlwZSAqZ2V0WDg2X01NWFR5KExMVk1Db250ZXh0ICZDKTsKKyAgc3RhdGljIFR5cGUgKmdldFRva2VuVHkoTExWTUNvbnRleHQgJkMpOworICBzdGF0aWMgSW50ZWdlclR5cGUgKmdldEludE5UeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgTik7CisgIHN0YXRpYyBJbnRlZ2VyVHlwZSAqZ2V0SW50MVR5KExMVk1Db250ZXh0ICZDKTsKKyAgc3RhdGljIEludGVnZXJUeXBlICpnZXRJbnQ4VHkoTExWTUNvbnRleHQgJkMpOworICBzdGF0aWMgSW50ZWdlclR5cGUgKmdldEludDE2VHkoTExWTUNvbnRleHQgJkMpOworICBzdGF0aWMgSW50ZWdlclR5cGUgKmdldEludDMyVHkoTExWTUNvbnRleHQgJkMpOworICBzdGF0aWMgSW50ZWdlclR5cGUgKmdldEludDY0VHkoTExWTUNvbnRleHQgJkMpOworICBzdGF0aWMgSW50ZWdlclR5cGUgKmdldEludDEyOFR5KExMVk1Db250ZXh0ICZDKTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhclR5PiBzdGF0aWMgVHlwZSAqZ2V0U2NhbGFyVHkoTExWTUNvbnRleHQgJkMpIHsKKyAgICBpbnQgbm9PZkJpdHMgPSBzaXplb2YoU2NhbGFyVHkpICogQ0hBUl9CSVQ7CisgICAgaWYgKHN0ZDo6aXNfaW50ZWdyYWw8U2NhbGFyVHk+Ojp2YWx1ZSkgeworICAgICAgcmV0dXJuIChUeXBlKikgVHlwZTo6Z2V0SW50TlR5KEMsIG5vT2ZCaXRzKTsKKyAgICB9IGVsc2UgaWYgKHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8U2NhbGFyVHk+Ojp2YWx1ZSkgeworICAgICAgc3dpdGNoIChub09mQml0cykgeworICAgICAgY2FzZSAzMjoKKyAgICAgICAgcmV0dXJuIFR5cGU6OmdldEZsb2F0VHkoQyk7CisgICAgICBjYXNlIDY0OgorICAgICAgICByZXR1cm4gVHlwZTo6Z2V0RG91YmxlVHkoQyk7CisgICAgICB9CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuc3VwcG9ydGVkIHR5cGUgaW4gVHlwZTo6Z2V0U2NhbGFyVHkiKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDb252ZW5pZW5jZSBtZXRob2RzIGZvciBnZXR0aW5nIHBvaW50ZXIgdHlwZXMgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIGJ1aWx0aW4KKyAgLy8gdHlwZXMgYXMgcG9pbnRlZS4KKyAgLy8KKyAgc3RhdGljIFBvaW50ZXJUeXBlICpnZXRIYWxmUHRyVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFTID0gMCk7CisgIHN0YXRpYyBQb2ludGVyVHlwZSAqZ2V0RmxvYXRQdHJUeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQVMgPSAwKTsKKyAgc3RhdGljIFBvaW50ZXJUeXBlICpnZXREb3VibGVQdHJUeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQVMgPSAwKTsKKyAgc3RhdGljIFBvaW50ZXJUeXBlICpnZXRYODZfRlA4MFB0clR5KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBUyA9IDApOworICBzdGF0aWMgUG9pbnRlclR5cGUgKmdldEZQMTI4UHRyVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFTID0gMCk7CisgIHN0YXRpYyBQb2ludGVyVHlwZSAqZ2V0UFBDX0ZQMTI4UHRyVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFTID0gMCk7CisgIHN0YXRpYyBQb2ludGVyVHlwZSAqZ2V0WDg2X01NWFB0clR5KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBUyA9IDApOworICBzdGF0aWMgUG9pbnRlclR5cGUgKmdldEludE5QdHJUeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgTiwgdW5zaWduZWQgQVMgPSAwKTsKKyAgc3RhdGljIFBvaW50ZXJUeXBlICpnZXRJbnQxUHRyVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFTID0gMCk7CisgIHN0YXRpYyBQb2ludGVyVHlwZSAqZ2V0SW50OFB0clR5KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBUyA9IDApOworICBzdGF0aWMgUG9pbnRlclR5cGUgKmdldEludDE2UHRyVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFTID0gMCk7CisgIHN0YXRpYyBQb2ludGVyVHlwZSAqZ2V0SW50MzJQdHJUeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQVMgPSAwKTsKKyAgc3RhdGljIFBvaW50ZXJUeXBlICpnZXRJbnQ2NFB0clR5KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBUyA9IDApOworCisgIC8vLyBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHR5cGUuIFRoaXMgaXMgZXF1aXZhbGVudCB0bworICAvLy8gUG9pbnRlclR5cGU6OmdldChGb28sIEFkZHJTcGFjZSkuCisgIFBvaW50ZXJUeXBlICpnZXRQb2ludGVyVG8odW5zaWduZWQgQWRkclNwYWNlID0gMCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIC8vLyBEZXJpdmVkIHR5cGVzIGxpa2Ugc3RydWN0dXJlcyBhbmQgYXJyYXlzIGFyZSBzaXplZCBpZmYgYWxsIG9mIHRoZSBtZW1iZXJzCisgIC8vLyBvZiB0aGUgdHlwZSBhcmUgc2l6ZWQgYXMgd2VsbC4gU2luY2UgYXNraW5nIGZvciB0aGVpciBzaXplIGlzIHJlbGF0aXZlbHkKKyAgLy8vIHVuY29tbW9uLCBtb3ZlIHRoaXMgb3BlcmF0aW9uIG91dC1vZi1saW5lLgorICBib29sIGlzU2l6ZWREZXJpdmVkVHlwZShTbWFsbFB0clNldEltcGw8VHlwZSo+ICpWaXNpdGVkID0gbnVsbHB0cikgY29uc3Q7Cit9OworCisvLyBQcmludGluZyBvZiB0eXBlcy4KK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFR5cGUgJlQpIHsKKyAgVC5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworLy8gYWxsb3cgaXNhPFBvaW50ZXJUeXBlPih4KSB0byB3b3JrIHdpdGhvdXQgRGVyaXZlZFR5cGVzLmggaW5jbHVkZWQuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8UG9pbnRlclR5cGUsIFR5cGU+IHsKKyAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3QgVHlwZSAmVHkpIHsKKyAgICByZXR1cm4gVHkuZ2V0VHlwZUlEKCkgPT0gVHlwZTo6UG9pbnRlclR5SUQ7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQcm92aWRlIHNwZWNpYWxpemF0aW9ucyBvZiBHcmFwaFRyYWl0cyB0byBiZSBhYmxlIHRvIHRyZWF0IGEgdHlwZSBhcyBhCisvLyBncmFwaCBvZiBzdWIgdHlwZXMuCisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxUeXBlICo+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IFR5cGUgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBUeXBlOjpzdWJ0eXBlX2l0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShUeXBlICpUKSB7IHJldHVybiBUOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPnN1YnR5cGVfYmVnaW4oKTsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+c3VidHlwZV9lbmQoKTsgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPGNvbnN0IFR5cGUqPiB7CisgIHVzaW5nIE5vZGVSZWYgPSBjb25zdCBUeXBlICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gVHlwZTo6c3VidHlwZV9pdGVyYXRvcjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoTm9kZVJlZiBUKSB7IHJldHVybiBUOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPnN1YnR5cGVfYmVnaW4oKTsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+c3VidHlwZV9lbmQoKTsgfQorfTsKKworLy8gQ3JlYXRlIHdyYXBwZXJzIGZvciBDIEJpbmRpbmcgdHlwZXMgKHNlZSBDQmluZGluZ1dyYXBwaW5nLmgpLgorREVGSU5FX0lTQV9DT05WRVJTSU9OX0ZVTkNUSU9OUyhUeXBlLCBMTFZNVHlwZVJlZikKKworLyogU3BlY2lhbGl6ZWQgb3BhcXVlIHR5cGUgY29udmVyc2lvbnMuCisgKi8KK2lubGluZSBUeXBlICoqdW53cmFwKExMVk1UeXBlUmVmKiBUeXMpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VHlwZSoqPihUeXMpOworfQorCitpbmxpbmUgTExWTVR5cGVSZWYgKndyYXAoVHlwZSAqKlR5cykgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxMTFZNVHlwZVJlZio+KGNvbnN0X2Nhc3Q8VHlwZSoqPihUeXMpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfVFlQRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1R5cGVCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1R5cGVCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJjNmYwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVHlwZUJ1aWxkZXIuaApAQCAtMCwwICsxLDQwNyBAQAorLy89PT0tLS0tIGxsdm0vVHlwZUJ1aWxkZXIuaCAtIEJ1aWxkZXIgZm9yIExMVk0gdHlwZXMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgVHlwZUJ1aWxkZXIgY2xhc3MsIHdoaWNoIGlzIHVzZWQgYXMgYSBjb252ZW5pZW50IHdheSB0bworLy8gY3JlYXRlIExMVk0gdHlwZXMgd2l0aCBhIGNvbnNpc3RlbnQgYW5kIHNpbXBsaWZpZWQgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9UWVBFQlVJTERFUl9ICisjZGVmaW5lIExMVk1fSVJfVFlQRUJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9JUi9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSA8Y2xpbWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVHlwZUJ1aWxkZXIgLSBUaGlzIHByb3ZpZGVzIGEgdW5pZm9ybSBBUEkgZm9yIGxvb2tpbmcgdXAgdHlwZXMKKy8vLyBrbm93biBhdCBjb21waWxlIHRpbWUuICBUbyBzdXBwb3J0IGNyb3NzLWNvbXBpbGF0aW9uLCB3ZSBkZWZpbmUgYQorLy8vIHNlcmllcyBvZiB0YWcgdHlwZXMgaW4gdGhlIGxsdm06OnR5cGVzIG5hbWVzcGFjZSwgbGlrZSBpPE4+LAorLy8vIGllZWVfZmxvYXQsIHBwY19mcDEyOCwgZXRjLiAgVHlwZUJ1aWxkZXI8VCwgZmFsc2U+IGFsbG93cyBUIHRvIGJlCisvLy8gYW55IG9mIHRoZXNlLCBhIG5hdGl2ZSBDIHR5cGUgKHdob3NlIHNpemUgbWF5IGRlcGVuZCBvbiB0aGUgaG9zdAorLy8vIGNvbXBpbGVyKSwgb3IgYSBwb2ludGVyLCBmdW5jdGlvbiwgb3Igc3RydWN0IHR5cGUgYnVpbHQgb3V0IG9mCisvLy8gdGhlc2UuICBUeXBlQnVpbGRlcjxULCB0cnVlPiByZW1vdmVzIG5hdGl2ZSBDIHR5cGVzIGZyb20gdGhpcyBzZXQKKy8vLyB0byBndWFyYW50ZWUgdGhhdCBpdHMgcmVzdWx0IGlzIHN1aXRhYmxlIGZvciBjcm9zcy1jb21waWxhdGlvbi4KKy8vLyBXZSBkZWZpbmUgdGhlIHByaW1pdGl2ZSB0eXBlcywgcG9pbnRlciB0eXBlcywgYW5kIGZ1bmN0aW9ucyB1cCB0bworLy8vIDUgYXJndW1lbnRzIGhlcmUsIGJ1dCB0byB1c2UgdGhpcyBjbGFzcyB3aXRoIHlvdXIgb3duIHR5cGVzLAorLy8vIHlvdSdsbCBuZWVkIHRvIHNwZWNpYWxpemUgaXQuICBGb3IgZXhhbXBsZSwgc2F5IHlvdSB3YW50IHRvIGNhbGwgYQorLy8vIGZ1bmN0aW9uIGRlZmluZWQgZXh0ZXJuYWxseSBhczoKKy8vLworLy8vIFxjb2Rley5jcHB9CisvLy8KKy8vLyAgIHN0cnVjdCBNeVR5cGUgeworLy8vICAgICBpbnQzMiBhOworLy8vICAgICBpbnQzMiAqYjsKKy8vLyAgICAgdm9pZCAqYXJyYXlbMV07ICAvLyBJbnRlbmRlZCBhcyBhIGZsZXhpYmxlIGFycmF5LgorLy8vICAgfTsKKy8vLyAgIGludDggQUZ1bmN0aW9uKHN0cnVjdCBNeVR5cGUgKnZhbHVlKTsKKy8vLworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBZb3UnbGwgd2FudCB0byB1c2UKKy8vLyAgIEZ1bmN0aW9uOjpDcmVhdGUoVHlwZUJ1aWxkZXI8dHlwZXM6Omk8OD4oTXlUeXBlKiksIHRydWU+OjpnZXQoKSwgLi4uKQorLy8vIHRvIGRlY2xhcmUgdGhlIGZ1bmN0aW9uLCBidXQgd2hlbiB5b3UgZmlyc3QgdHJ5IHRoaXMsIHlvdXIgY29tcGlsZXIgd2lsbAorLy8vIGNvbXBsYWluIHRoYXQgVHlwZUJ1aWxkZXI8TXlUeXBlLCB0cnVlPjo6Z2V0KCkgZG9lc24ndCBleGlzdC4gVG8gZml4IHRoaXMsCisvLy8gd3JpdGU6CisvLy8KKy8vLyBcY29kZXsuY3BwfQorLy8vCisvLy8gICBuYW1lc3BhY2UgbGx2bSB7CisvLy8gICB0ZW1wbGF0ZTxib29sIHhjb21waWxlPiBjbGFzcyBUeXBlQnVpbGRlcjxNeVR5cGUsIHhjb21waWxlPiB7CisvLy8gICBwdWJsaWM6CisvLy8gICAgIHN0YXRpYyBTdHJ1Y3RUeXBlICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQpIHsKKy8vLyAgICAgICAvLyBJZiB5b3UgY2FjaGUgdGhpcyByZXN1bHQsIGJlIHN1cmUgdG8gY2FjaGUgaXQgc2VwYXJhdGVseQorLy8vICAgICAgIC8vIGZvciBlYWNoIExMVk1Db250ZXh0LgorLy8vICAgICAgIHJldHVybiBTdHJ1Y3RUeXBlOjpnZXQoCisvLy8gICAgICAgICBUeXBlQnVpbGRlcjx0eXBlczo6aTwzMj4sIHhjb21waWxlPjo6Z2V0KENvbnRleHQpLAorLy8vICAgICAgICAgVHlwZUJ1aWxkZXI8dHlwZXM6Omk8MzI+KiwgeGNvbXBpbGU+OjpnZXQoQ29udGV4dCksCisvLy8gICAgICAgICBUeXBlQnVpbGRlcjx0eXBlczo6aTw4PipbXSwgeGNvbXBpbGU+OjpnZXQoQ29udGV4dCksCisvLy8gICAgICAgICBudWxscHRyKTsKKy8vLyAgICAgfQorLy8vCisvLy8gICAgIC8vIFlvdSBtYXkgZmluZCB0aGlzIGEgY29udmVuaWVudCBwbGFjZSB0byBwdXQgc29tZSBjb25zdGFudHMKKy8vLyAgICAgLy8gdG8gaGVscCB3aXRoIGdldGVsZW1lbnRwdHIuICBUaGV5IGRvbid0IGhhdmUgYW55IGVmZmVjdCBvbgorLy8vICAgICAvLyB0aGUgb3BlcmF0aW9uIG9mIFR5cGVCdWlsZGVyLgorLy8vICAgICBlbnVtIEZpZWxkcyB7CisvLy8gICAgICAgRklFTERfQSwKKy8vLyAgICAgICBGSUVMRF9CLAorLy8vICAgICAgIEZJRUxEX0FSUkFZCisvLy8gICAgIH07CisvLy8gICB9CisvLy8gICB9ICAvLyBuYW1lc3BhY2UgbGx2bQorLy8vCisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFR5cGVCdWlsZGVyIGNhbm5vdCBoYW5kbGUgcmVjdXJzaXZlIHR5cGVzIG9yIHR5cGVzIHlvdSBvbmx5IGtub3cgYXQgcnVudGltZS4KKy8vLyBJZiB5b3UgdHJ5IHRvIGdpdmUgaXQgYSByZWN1cnNpdmUgdHlwZSwgaXQgd2lsbCBkZWFkbG9jaywgaW5maW5pdGVseQorLy8vIHJlY3Vyc2UsIG9yIGRvIHNvbWV0aGluZyBzaW1pbGFybHkgdW5kZXNpcmFibGUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIGNyb3NzX2NvbXBpbGFibGU+IGNsYXNzIFR5cGVCdWlsZGVyIHt9OworCisvLyBUeXBlcyBmb3IgdXNlIHdpdGggY3Jvc3MtY29tcGlsYWJsZSBUeXBlQnVpbGRlcnMuICBUaGVzZSBjb3JyZXNwb25kCisvLyBleGFjdGx5IHdpdGggYW4gTExWTS1uYXRpdmUgdHlwZS4KK25hbWVzcGFjZSB0eXBlcyB7CisvLy8gaTxOPiBjb3JyZXNwb25kcyB0byB0aGUgTExWTSBJbnRlZ2VyVHlwZSB3aXRoIE4gYml0cy4KK3RlbXBsYXRlPHVpbnQzMl90IG51bV9iaXRzPiBjbGFzcyBpIHt9OworCisvLyBUaGUgZm9sbG93aW5nIGNsYXNzZXMgcmVwcmVzZW50IHRoZSBMTFZNIGZsb2F0aW5nIHR5cGVzLgorY2xhc3MgaWVlZV9mbG9hdCB7fTsKK2NsYXNzIGllZWVfZG91YmxlIHt9OworY2xhc3MgeDg2X2ZwODAge307CitjbGFzcyBmcDEyOCB7fTsKK2NsYXNzIHBwY19mcDEyOCB7fTsKKy8vIFg4NiBNTVguCitjbGFzcyB4ODZfbW14IHt9OworfSAgLy8gbmFtZXNwYWNlIHR5cGVzCisKKy8vIExMVk0gZG9lc24ndCBoYXZlIGNvbnN0IG9yIHZvbGF0aWxlIHR5cGVzLgordGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCBjcm9zcz4gY2xhc3MgVHlwZUJ1aWxkZXI8Y29uc3QgVCwgY3Jvc3M+CisgIDogcHVibGljIFR5cGVCdWlsZGVyPFQsIGNyb3NzPiB7fTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgY3Jvc3M+IGNsYXNzIFR5cGVCdWlsZGVyPHZvbGF0aWxlIFQsIGNyb3NzPgorICA6IHB1YmxpYyBUeXBlQnVpbGRlcjxULCBjcm9zcz4ge307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjxjb25zdCB2b2xhdGlsZSBULCBjcm9zcz4KKyAgOiBwdWJsaWMgVHlwZUJ1aWxkZXI8VCwgY3Jvc3M+IHt9OworCisvLyBQb2ludGVycwordGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCBjcm9zcz4gY2xhc3MgVHlwZUJ1aWxkZXI8VCosIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBQb2ludGVyVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgcmV0dXJuIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZUJ1aWxkZXI8VCxjcm9zcz46OmdldChDb250ZXh0KSk7CisgIH0KK307CisKKy8vLyBUaGVyZSBpcyBubyBzdXBwb3J0IGZvciByZWZlcmVuY2VzCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjxUJiwgY3Jvc3M+IHt9OworCisvLyBBcnJheXMKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBOLCBib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjxUW05dLCBjcm9zcz4geworcHVibGljOgorICBzdGF0aWMgQXJyYXlUeXBlICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQpIHsKKyAgICByZXR1cm4gQXJyYXlUeXBlOjpnZXQoVHlwZUJ1aWxkZXI8VCwgY3Jvc3M+OjpnZXQoQ29udGV4dCksIE4pOworICB9Cit9OworLy8vIExMVk0gdXNlcyBhbiBhcnJheSBvZiBsZW5ndGggMCB0byByZXByZXNlbnQgYW4gdW5rbm93bi1sZW5ndGggYXJyYXkuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjxUW10sIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBBcnJheVR5cGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCkgeworICAgIHJldHVybiBBcnJheVR5cGU6OmdldChUeXBlQnVpbGRlcjxULCBjcm9zcz46OmdldChDb250ZXh0KSwgMCk7CisgIH0KK307CisKKy8vIERlZmluZSB0aGUgQyBpbnRlZ3JhbCB0eXBlcyBvbmx5IGZvciBUeXBlQnVpbGRlcjxULCBmYWxzZT4uCisvLworLy8gQyBpbnRlZ3JhbCB0eXBlcyBkbyBub3QgaGF2ZSBhIGRlZmluZWQgc2l6ZS4gSXQgd291bGQgYmUgbmljZSB0byB1c2UgdGhlCisvLyBzdGRpbnQuaC1kZWZpbmVkIHR5cGVkZWZzIHRoYXQgZG8gaGF2ZSBkZWZpbmVkIHNpemVzLCBidXQgd2UnZCBydW4gaW50byB0aGUKKy8vIGZvbGxvd2luZyBwcm9ibGVtOgorLy8KKy8vIE9uIGFuIElMUDMyIG1hY2hpbmUsIHN0ZGludC5oIG1pZ2h0IGRlZmluZToKKy8vCisvLyAgIHR5cGVkZWYgaW50IGludDMyX3Q7CisvLyAgIHR5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7CisvLyAgIHR5cGVkZWYgbG9uZyBzaXplX3Q7CisvLworLy8gSWYgd2UgZGVmaW5lZCBUeXBlQnVpbGRlcjxpbnQzMl90PiBhbmQgVHlwZUJ1aWxkZXI8aW50NjRfdD4sIHRoZW4gYW55IHVzZSBvZgorLy8gVHlwZUJ1aWxkZXI8c2l6ZV90PiB3b3VsZCBmYWlsLiAgV2UgY291bGRuJ3QgZGVmaW5lIFR5cGVCdWlsZGVyPHNpemVfdD4gaW4KKy8vIGFkZGl0aW9uIHRvIHRoZSBkZWZpbmVkLXNpemUgdHlwZXMgYmVjYXVzZSB3ZSdkIGdldCBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgb24KKy8vIHBsYXRmb3JtcyB3aGVyZSBzdGRpbnQuaCBpbnN0ZWFkIGRlZmluZXM6CisvLworLy8gICB0eXBlZGVmIGludCBpbnQzMl90OworLy8gICB0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OworLy8gICB0eXBlZGVmIGludCBzaXplX3Q7CisvLworLy8gU28gd2UgZGVmaW5lIGFsbCB0aGUgcHJpbWl0aXZlIEMgdHlwZXMgYW5kIG5vdGhpbmcgZWxzZS4KKyNkZWZpbmUgREVGSU5FX0lOVEVHUkFMX1RZUEVCVUlMREVSKFQpIFwKK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8VCwgZmFsc2U+IHsgXAorcHVibGljOiBcCisgIHN0YXRpYyBJbnRlZ2VyVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7IFwKKyAgICByZXR1cm4gSW50ZWdlclR5cGU6OmdldChDb250ZXh0LCBzaXplb2YoVCkgKiBDSEFSX0JJVCk7IFwKKyAgfSBcCit9OyBcCit0ZW1wbGF0ZTw+IGNsYXNzIFR5cGVCdWlsZGVyPFQsIHRydWU+IHsgXAorICAvKiBXZSBwcm92aWRlIGEgZGVmaW5pdGlvbiBoZXJlIHNvIHVzZXJzIGRvbid0IGFjY2lkZW50YWxseSAqLyBcCisgIC8qIGRlZmluZSB0aGVzZSB0eXBlcyB0byB3b3JrLiAqLyBcCit9CitERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIoY2hhcik7CitERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIoc2lnbmVkIGNoYXIpOworREVGSU5FX0lOVEVHUkFMX1RZUEVCVUlMREVSKHVuc2lnbmVkIGNoYXIpOworREVGSU5FX0lOVEVHUkFMX1RZUEVCVUlMREVSKHNob3J0KTsKK0RFRklORV9JTlRFR1JBTF9UWVBFQlVJTERFUih1bnNpZ25lZCBzaG9ydCk7CitERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIoaW50KTsKK0RFRklORV9JTlRFR1JBTF9UWVBFQlVJTERFUih1bnNpZ25lZCBpbnQpOworREVGSU5FX0lOVEVHUkFMX1RZUEVCVUlMREVSKGxvbmcpOworREVGSU5FX0lOVEVHUkFMX1RZUEVCVUlMREVSKHVuc2lnbmVkIGxvbmcpOworI2lmZGVmIF9NU0NfVkVSCitERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIoX19pbnQ2NCk7CitERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIodW5zaWduZWQgX19pbnQ2NCk7CisjZWxzZSAvKiBfTVNDX1ZFUiAqLworREVGSU5FX0lOVEVHUkFMX1RZUEVCVUlMREVSKGxvbmcgbG9uZyk7CitERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIodW5zaWduZWQgbG9uZyBsb25nKTsKKyNlbmRpZiAvKiBfTVNDX1ZFUiAqLworI3VuZGVmIERFRklORV9JTlRFR1JBTF9UWVBFQlVJTERFUgorCit0ZW1wbGF0ZTx1aW50MzJfdCBudW1fYml0cywgYm9vbCBjcm9zcz4KK2NsYXNzIFR5cGVCdWlsZGVyPHR5cGVzOjppPG51bV9iaXRzPiwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIEludGVnZXJUeXBlICpnZXQoTExWTUNvbnRleHQgJkMpIHsKKyAgICByZXR1cm4gSW50ZWdlclR5cGU6OmdldChDLCBudW1fYml0cyk7CisgIH0KK307CisKK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8ZmxvYXQsIGZhbHNlPiB7CitwdWJsaWM6CisgIHN0YXRpYyBUeXBlICpnZXQoTExWTUNvbnRleHQmIEMpIHsKKyAgICByZXR1cm4gVHlwZTo6Z2V0RmxvYXRUeShDKTsKKyAgfQorfTsKK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8ZmxvYXQsIHRydWU+IHt9OworCit0ZW1wbGF0ZTw+IGNsYXNzIFR5cGVCdWlsZGVyPGRvdWJsZSwgZmFsc2U+IHsKK3B1YmxpYzoKKyAgc3RhdGljIFR5cGUgKmdldChMTFZNQ29udGV4dCYgQykgeworICAgIHJldHVybiBUeXBlOjpnZXREb3VibGVUeShDKTsKKyAgfQorfTsKK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8ZG91YmxlLCB0cnVlPiB7fTsKKwordGVtcGxhdGU8Ym9vbCBjcm9zcz4gY2xhc3MgVHlwZUJ1aWxkZXI8dHlwZXM6OmllZWVfZmxvYXQsIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBUeXBlICpnZXQoTExWTUNvbnRleHQmIEMpIHsgcmV0dXJuIFR5cGU6OmdldEZsb2F0VHkoQyk7IH0KK307Cit0ZW1wbGF0ZTxib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjx0eXBlczo6aWVlZV9kb3VibGUsIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBUeXBlICpnZXQoTExWTUNvbnRleHQmIEMpIHsgcmV0dXJuIFR5cGU6OmdldERvdWJsZVR5KEMpOyB9Cit9OwordGVtcGxhdGU8Ym9vbCBjcm9zcz4gY2xhc3MgVHlwZUJ1aWxkZXI8dHlwZXM6Ong4Nl9mcDgwLCBjcm9zcz4geworcHVibGljOgorICBzdGF0aWMgVHlwZSAqZ2V0KExMVk1Db250ZXh0JiBDKSB7IHJldHVybiBUeXBlOjpnZXRYODZfRlA4MFR5KEMpOyB9Cit9OwordGVtcGxhdGU8Ym9vbCBjcm9zcz4gY2xhc3MgVHlwZUJ1aWxkZXI8dHlwZXM6OmZwMTI4LCBjcm9zcz4geworcHVibGljOgorICBzdGF0aWMgVHlwZSAqZ2V0KExMVk1Db250ZXh0JiBDKSB7IHJldHVybiBUeXBlOjpnZXRGUDEyOFR5KEMpOyB9Cit9OwordGVtcGxhdGU8Ym9vbCBjcm9zcz4gY2xhc3MgVHlwZUJ1aWxkZXI8dHlwZXM6OnBwY19mcDEyOCwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIFR5cGUgKmdldChMTFZNQ29udGV4dCYgQykgeyByZXR1cm4gVHlwZTo6Z2V0UFBDX0ZQMTI4VHkoQyk7IH0KK307Cit0ZW1wbGF0ZTxib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjx0eXBlczo6eDg2X21teCwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIFR5cGUgKmdldChMTFZNQ29udGV4dCYgQykgeyByZXR1cm4gVHlwZTo6Z2V0WDg2X01NWFR5KEMpOyB9Cit9OworCit0ZW1wbGF0ZTxib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjx2b2lkLCBjcm9zcz4geworcHVibGljOgorICBzdGF0aWMgVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDKSB7CisgICAgcmV0dXJuIFR5cGU6OmdldFZvaWRUeShDKTsKKyAgfQorfTsKKworLy8vIHZvaWQqIGlzIGRpc2FsbG93ZWQgaW4gTExWTSB0eXBlcywgYnV0IGl0IG9jY3VycyBvZnRlbiBlbm91Z2ggaW4gQyBjb2RlIHRoYXQKKy8vLyB3ZSBzcGVjaWFsIGNhc2UgaXQuCit0ZW1wbGF0ZTw+IGNsYXNzIFR5cGVCdWlsZGVyPHZvaWQqLCBmYWxzZT4KKyAgOiBwdWJsaWMgVHlwZUJ1aWxkZXI8dHlwZXM6Omk8OD4qLCBmYWxzZT4ge307Cit0ZW1wbGF0ZTw+IGNsYXNzIFR5cGVCdWlsZGVyPGNvbnN0IHZvaWQqLCBmYWxzZT4KKyAgOiBwdWJsaWMgVHlwZUJ1aWxkZXI8dHlwZXM6Omk8OD4qLCBmYWxzZT4ge307Cit0ZW1wbGF0ZTw+IGNsYXNzIFR5cGVCdWlsZGVyPHZvbGF0aWxlIHZvaWQqLCBmYWxzZT4KKyAgOiBwdWJsaWMgVHlwZUJ1aWxkZXI8dHlwZXM6Omk8OD4qLCBmYWxzZT4ge307Cit0ZW1wbGF0ZTw+IGNsYXNzIFR5cGVCdWlsZGVyPGNvbnN0IHZvbGF0aWxlIHZvaWQqLCBmYWxzZT4KKyAgOiBwdWJsaWMgVHlwZUJ1aWxkZXI8dHlwZXM6Omk8OD4qLCBmYWxzZT4ge307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIGJvb2wgY3Jvc3M+IGNsYXNzIFR5cGVCdWlsZGVyPFIoKSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgcmV0dXJuIEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGVCdWlsZGVyPFIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLCBmYWxzZSk7CisgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgYm9vbCBjcm9zcz4gY2xhc3MgVHlwZUJ1aWxkZXI8UihBMSksIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBGdW5jdGlvblR5cGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCkgeworICAgIFR5cGUgKnBhcmFtc1tdID0geworICAgICAgVHlwZUJ1aWxkZXI8QTEsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgIH07CisgICAgcmV0dXJuIEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGVCdWlsZGVyPFIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIGZhbHNlKTsKKyAgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgYm9vbCBjcm9zcz4KK2NsYXNzIFR5cGVCdWlsZGVyPFIoQTEsIEEyKSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgVHlwZSAqcGFyYW1zW10gPSB7CisgICAgICBUeXBlQnVpbGRlcjxBMSwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBMiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgfTsKKyAgICByZXR1cm4gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZUJ1aWxkZXI8UiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgZmFsc2UpOworICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgYm9vbCBjcm9zcz4KK2NsYXNzIFR5cGVCdWlsZGVyPFIoQTEsIEEyLCBBMyksIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBGdW5jdGlvblR5cGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCkgeworICAgIFR5cGUgKnBhcmFtc1tdID0geworICAgICAgVHlwZUJ1aWxkZXI8QTEsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgVHlwZUJ1aWxkZXI8QTIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgVHlwZUJ1aWxkZXI8QTMsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgIH07CisgICAgcmV0dXJuIEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGVCdWlsZGVyPFIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIGZhbHNlKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCisgICAgICAgICBib29sIGNyb3NzPgorY2xhc3MgVHlwZUJ1aWxkZXI8UihBMSwgQTIsIEEzLCBBNCksIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBGdW5jdGlvblR5cGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCkgeworICAgIFR5cGUgKnBhcmFtc1tdID0geworICAgICAgVHlwZUJ1aWxkZXI8QTEsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgVHlwZUJ1aWxkZXI8QTIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgVHlwZUJ1aWxkZXI8QTMsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgVHlwZUJ1aWxkZXI8QTQsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgIH07CisgICAgcmV0dXJuIEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGVCdWlsZGVyPFIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIGZhbHNlKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCisgICAgICAgICB0eXBlbmFtZSBBNSwgYm9vbCBjcm9zcz4KK2NsYXNzIFR5cGVCdWlsZGVyPFIoQTEsIEEyLCBBMywgQTQsIEE1KSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgVHlwZSAqcGFyYW1zW10gPSB7CisgICAgICBUeXBlQnVpbGRlcjxBMSwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBMiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBMywgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBNCwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBNSwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgfTsKKyAgICByZXR1cm4gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZUJ1aWxkZXI8UiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgZmFsc2UpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCBib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjxSKC4uLiksIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBGdW5jdGlvblR5cGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCkgeworICAgIHJldHVybiBGdW5jdGlvblR5cGU6OmdldChUeXBlQnVpbGRlcjxSLCBjcm9zcz46OmdldChDb250ZXh0KSwgdHJ1ZSk7CisgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgYm9vbCBjcm9zcz4KK2NsYXNzIFR5cGVCdWlsZGVyPFIoQTEsIC4uLiksIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBGdW5jdGlvblR5cGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCkgeworICAgIFR5cGUgKnBhcmFtc1tdID0geworICAgICAgVHlwZUJ1aWxkZXI8QTEsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgIH07CisgICAgcmV0dXJuIEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGVCdWlsZGVyPFIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLCBwYXJhbXMsIHRydWUpOworICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCBib29sIGNyb3NzPgorY2xhc3MgVHlwZUJ1aWxkZXI8UihBMSwgQTIsIC4uLiksIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBGdW5jdGlvblR5cGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCkgeworICAgIFR5cGUgKnBhcmFtc1tdID0geworICAgICAgVHlwZUJ1aWxkZXI8QTEsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgVHlwZUJ1aWxkZXI8QTIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgIH07CisgICAgcmV0dXJuIEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGVCdWlsZGVyPFIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHRydWUpOworICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgYm9vbCBjcm9zcz4KK2NsYXNzIFR5cGVCdWlsZGVyPFIoQTEsIEEyLCBBMywgLi4uKSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgVHlwZSAqcGFyYW1zW10gPSB7CisgICAgICBUeXBlQnVpbGRlcjxBMSwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBMiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBMywgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgfTsKKyAgICByZXR1cm4gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZUJ1aWxkZXI8UiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgdHJ1ZSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAorICAgICAgICAgYm9vbCBjcm9zcz4KK2NsYXNzIFR5cGVCdWlsZGVyPFIoQTEsIEEyLCBBMywgQTQsIC4uLiksIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBGdW5jdGlvblR5cGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCkgeworICAgIFR5cGUgKnBhcmFtc1tdID0geworICAgICAgVHlwZUJ1aWxkZXI8QTEsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgVHlwZUJ1aWxkZXI8QTIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgVHlwZUJ1aWxkZXI8QTMsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgVHlwZUJ1aWxkZXI8QTQsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgIH07CisgICAgcmV0dXJuIEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGVCdWlsZGVyPFIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHRydWUpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKKyAgICAgICAgIHR5cGVuYW1lIEE1LCBib29sIGNyb3NzPgorY2xhc3MgVHlwZUJ1aWxkZXI8UihBMSwgQTIsIEEzLCBBNCwgQTUsIC4uLiksIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBGdW5jdGlvblR5cGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCkgeworICAgIFR5cGUgKnBhcmFtc1tdID0geworICAgICAgVHlwZUJ1aWxkZXI8QTEsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgVHlwZUJ1aWxkZXI8QTIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgVHlwZUJ1aWxkZXI8QTMsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgVHlwZUJ1aWxkZXI8QTQsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgVHlwZUJ1aWxkZXI8QTUsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgIH07CisgICAgcmV0dXJuIEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGVCdWlsZGVyPFIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHRydWUpOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVHlwZUZpbmRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9UeXBlRmluZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA1MGMzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVHlwZUZpbmRlci5oCkBAIC0wLDAgKzEsODIgQEAKKy8vPT09LSBsbHZtL0lSL1R5cGVGaW5kZXIuaCAtIENsYXNzIHRvIGZpbmQgdXNlZCBzdHJ1Y3QgdHlwZXMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgVHlwZUZpbmRlciBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfVFlQRUZJTkRFUl9ICisjZGVmaW5lIExMVk1fSVJfVFlQRUZJTkRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1ETm9kZTsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFN0cnVjdFR5cGU7CitjbGFzcyBUeXBlOworY2xhc3MgVmFsdWU7CisKKy8vLyBUeXBlRmluZGVyIC0gV2FsayBvdmVyIGEgbW9kdWxlLCBpZGVudGlmeWluZyBhbGwgb2YgdGhlIHR5cGVzIHRoYXQgYXJlCisvLy8gdXNlZCBieSB0aGUgbW9kdWxlLgorY2xhc3MgVHlwZUZpbmRlciB7CisgIC8vIFRvIGF2b2lkIHdhbGtpbmcgY29uc3RhbnQgZXhwcmVzc2lvbnMgbXVsdGlwbGUgdGltZXMgYW5kIG90aGVyIElSCisgIC8vIG9iamVjdHMsIHdlIGtlZXAgc2V2ZXJhbCBoZWxwZXIgbWFwcy4KKyAgRGVuc2VTZXQ8Y29uc3QgVmFsdWUqPiBWaXNpdGVkQ29uc3RhbnRzOworICBEZW5zZVNldDxjb25zdCBNRE5vZGUgKj4gVmlzaXRlZE1ldGFkYXRhOworICBEZW5zZVNldDxUeXBlKj4gVmlzaXRlZFR5cGVzOworCisgIHN0ZDo6dmVjdG9yPFN0cnVjdFR5cGUqPiBTdHJ1Y3RUeXBlczsKKyAgYm9vbCBPbmx5TmFtZWQgPSBmYWxzZTsKKworcHVibGljOgorICBUeXBlRmluZGVyKCkgPSBkZWZhdWx0OworCisgIHZvaWQgcnVuKGNvbnN0IE1vZHVsZSAmTSwgYm9vbCBvbmx5TmFtZWQpOworICB2b2lkIGNsZWFyKCk7CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBzdGQ6OnZlY3RvcjxTdHJ1Y3RUeXBlKj46Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IHN0ZDo6dmVjdG9yPFN0cnVjdFR5cGUqPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBTdHJ1Y3RUeXBlcy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIFN0cnVjdFR5cGVzLmVuZCgpOyB9CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBTdHJ1Y3RUeXBlcy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFN0cnVjdFR5cGVzLmVuZCgpOyB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFN0cnVjdFR5cGVzLmVtcHR5KCk7IH0KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBTdHJ1Y3RUeXBlcy5zaXplKCk7IH0KKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgSSwgaXRlcmF0b3IgRSkgeyByZXR1cm4gU3RydWN0VHlwZXMuZXJhc2UoSSwgRSk7IH0KKworICBTdHJ1Y3RUeXBlIComb3BlcmF0b3JbXSh1bnNpZ25lZCBJZHgpIHsgcmV0dXJuIFN0cnVjdFR5cGVzW0lkeF07IH0KKworICBEZW5zZVNldDxjb25zdCBNRE5vZGUgKj4gJmdldFZpc2l0ZWRNZXRhZGF0YSgpIHsgcmV0dXJuIFZpc2l0ZWRNZXRhZGF0YTsgfQorCitwcml2YXRlOgorICAvLy8gaW5jb3Jwb3JhdGVUeXBlIC0gVGhpcyBtZXRob2QgYWRkcyB0aGUgdHlwZSB0byB0aGUgbGlzdCBvZiB1c2VkCisgIC8vLyBzdHJ1Y3R1cmVzIGlmIGl0J3Mgbm90IGluIHRoZXJlIGFscmVhZHkuCisgIHZvaWQgaW5jb3Jwb3JhdGVUeXBlKFR5cGUgKlR5KTsKKworICAvLy8gaW5jb3Jwb3JhdGVWYWx1ZSAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gd2FsayBvcGVyYW5kIGxpc3RzIGZpbmRpbmcgdHlwZXMKKyAgLy8vIGhpZGluZyBpbiBjb25zdGFudCBleHByZXNzaW9ucyBhbmQgb3RoZXIgb3BlcmFuZHMgdGhhdCB3b24ndCBiZSB3YWxrZWQgaW4KKyAgLy8vIG90aGVyIHdheXMuICBHbG9iYWxWYWx1ZXMsIGJhc2ljIGJsb2NrcywgaW5zdHJ1Y3Rpb25zLCBhbmQgaW5zdCBvcGVyYW5kcworICAvLy8gYXJlIGFsbCBleHBsaWNpdGx5IGVudW1lcmF0ZWQuCisgIHZvaWQgaW5jb3Jwb3JhdGVWYWx1ZShjb25zdCBWYWx1ZSAqVik7CisKKyAgLy8vIGluY29ycG9yYXRlTUROb2RlIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byB3YWxrIHRoZSBvcGVyYW5kcyBvZiBhbiBNRE5vZGUKKyAgLy8vIHRvIGZpbmQgdHlwZXMgaGlkaW5nIHdpdGhpbi4KKyAgdm9pZCBpbmNvcnBvcmF0ZU1ETm9kZShjb25zdCBNRE5vZGUgKlYpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfVFlQRUZJTkRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1VzZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Vc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWMxMzkzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Vc2UuaApAQCAtMCwwICsxLDE4MiBAQAorLy89PT0tIGxsdm0vVXNlLmggLSBEZWZpbml0aW9uIG9mIHRoZSBVc2UgY2xhc3MgLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vCisvLy8gVGhpcyBkZWZpbmVzIHRoZSBVc2UgY2xhc3MuICBUaGUgVXNlIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9wZXJhbmQgb2YgYW4KKy8vLyBpbnN0cnVjdGlvbiBvciBzb21lIG90aGVyIFVzZXIgaW5zdGFuY2Ugd2hpY2ggcmVmZXJzIHRvIGEgVmFsdWUuICBUaGUgVXNlCisvLy8gY2xhc3Mga2VlcHMgdGhlICJ1c2UgbGlzdCIgb2YgdGhlIHJlZmVyZW5jZWQgdmFsdWUgdXAgdG8gZGF0ZS4KKy8vLworLy8vIFBvaW50ZXIgdGFnZ2luZyBpcyB1c2VkIHRvIGVmZmljaWVudGx5IGZpbmQgdGhlIFVzZXIgY29ycmVzcG9uZGluZyB0byBhIFVzZQorLy8vIHdpdGhvdXQgaGF2aW5nIHRvIHN0b3JlIGEgVXNlciBwb2ludGVyIGluIGV2ZXJ5IFVzZS4gQSBVc2VyIGlzIHByZWNlZGVkIGluCisvLy8gbWVtb3J5IGJ5IGFsbCB0aGUgVXNlcyBjb3JyZXNwb25kaW5nIHRvIGl0cyBvcGVyYW5kcywgYW5kIHRoZSBsb3cgYml0cyBvZgorLy8vIG9uZSBvZiB0aGUgZmllbGRzIChQcmV2KSBvZiB0aGUgVXNlIGNsYXNzIGFyZSB1c2VkIHRvIGVuY29kZSBvZmZzZXRzIHRvIGJlCisvLy8gYWJsZSB0byBmaW5kIHRoYXQgVXNlciBnaXZlbiBhIHBvaW50ZXIgdG8gYW55IFVzZS4gRm9yIGRldGFpbHMsIHNlZToKKy8vLworLy8vICAgaHR0cDovL3d3dy5sbHZtLm9yZy9kb2NzL1Byb2dyYW1tZXJzTWFudWFsLmh0bWwjVXNlckxheW91dAorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfVVNFX0gKKyNkZWZpbmUgTExWTV9JUl9VU0VfSAorCisjaW5jbHVkZSAibGx2bS1jL1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0JpbmRpbmdXcmFwcGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZT4gc3RydWN0IHNpbXBsaWZ5X3R5cGU7CitjbGFzcyBVc2VyOworY2xhc3MgVmFsdWU7CisKKy8vLyBcYnJpZWYgQSBVc2UgcmVwcmVzZW50cyB0aGUgZWRnZSBiZXR3ZWVuIGEgVmFsdWUgZGVmaW5pdGlvbiBhbmQgaXRzIHVzZXJzLgorLy8vCisvLy8gVGhpcyBpcyBub3Rpb25hbGx5IGEgdHdvLWRpbWVuc2lvbmFsIGxpbmtlZCBsaXN0LiBJdCBzdXBwb3J0cyB0cmF2ZXJzaW5nCisvLy8gYWxsIG9mIHRoZSB1c2VzIGZvciBhIHBhcnRpY3VsYXIgdmFsdWUgZGVmaW5pdGlvbi4gSXQgYWxzbyBzdXBwb3J0cyBqdW1waW5nCisvLy8gZGlyZWN0bHkgdG8gdGhlIHVzZWQgdmFsdWUgd2hlbiB3ZSBhcnJpdmUgZnJvbSB0aGUgVXNlcidzIG9wZXJhbmRzLCBhbmQKKy8vLyBqdW1waW5nIGRpcmVjdGx5IHRvIHRoZSBVc2VyIHdoZW4gd2UgYXJyaXZlIGZyb20gdGhlIFZhbHVlJ3MgdXNlcy4KKy8vLworLy8vIFRoZSBwb2ludGVyIHRvIHRoZSB1c2VkIFZhbHVlIGlzIGV4cGxpY2l0LCBhbmQgdGhlIHBvaW50ZXIgdG8gdGhlIFVzZXIgaXMKKy8vLyBpbXBsaWNpdC4gVGhlIGltcGxpY2l0IHBvaW50ZXIgaXMgZm91bmQgdmlhIGEgd2F5bWFya2luZyBhbGdvcml0aG0KKy8vLyBkZXNjcmliZWQgaW4gdGhlIHByb2dyYW1tZXIncyBtYW51YWw6CisvLy8KKy8vLyAgIGh0dHA6Ly93d3cubGx2bS5vcmcvZG9jcy9Qcm9ncmFtbWVyc01hbnVhbC5odG1sI3RoZS13YXltYXJraW5nLWFsZ29yaXRobQorLy8vCisvLy8gVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2luZ2xlIG1vc3QgbWVtb3J5IGludGVuc2l2ZSBvYmplY3QgaW4gTExWTSBiZWNhdXNlCisvLy8gb2YgdGhlIG51bWJlciBvZiB1c2VzIGluIHRoZSBzeXN0ZW0uIEF0IHRoZSBzYW1lIHRpbWUsIHRoZSBjb25zdGFudCB0aW1lCisvLy8gb3BlcmF0aW9ucyBpdCBhbGxvd3MgYXJlIGVzc2VudGlhbCB0byBtYW55IG9wdGltaXphdGlvbnMgaGF2aW5nIHJlYXNvbmFibGUKKy8vLyB0aW1lIGNvbXBsZXhpdHkuCitjbGFzcyBVc2UgeworcHVibGljOgorICBVc2UoY29uc3QgVXNlICZVKSA9IGRlbGV0ZTsKKworICAvLy8gXGJyaWVmIFByb3ZpZGUgYSBmYXN0IHN1YnN0aXR1dGUgdG8gc3RkOjpzd2FwPFVzZT4KKyAgLy8vIHRoYXQgYWxzbyB3b3JrcyB3aXRoIGxlc3Mgc3RhbmRhcmQtY29tcGxpYW50IGNvbXBpbGVycworICB2b2lkIHN3YXAoVXNlICZSSFMpOworCisgIC8vLyBQb2ludGVyIHRyYWl0cyBmb3IgdGhlIFVzZXJSZWYgUG9pbnRlckludFBhaXIuIFRoaXMgZW5zdXJlcyB3ZSBhbHdheXMKKyAgLy8vIHVzZSB0aGUgTFNCIHJlZ2FyZGxlc3Mgb2YgcG9pbnRlciBhbGlnbm1lbnQgb24gZGlmZmVyZW50IHRhcmdldHMuCisgIHN0cnVjdCBVc2VyUmVmUG9pbnRlclRyYWl0cyB7CisgICAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKFVzZXIgKlApIHsgcmV0dXJuIFA7IH0KKworICAgIHN0YXRpYyBpbmxpbmUgVXNlciAqZ2V0RnJvbVZvaWRQb2ludGVyKHZvaWQgKlApIHsKKyAgICAgIHJldHVybiAoVXNlciAqKVA7CisgICAgfQorCisgICAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSAxIH07CisgIH07CisKKyAgLy8gQSB0eXBlIGZvciB0aGUgd29yZCBmb2xsb3dpbmcgYW4gYXJyYXkgb2YgaHVuZy1vZmYgVXNlcyBpbiBtZW1vcnksIHdoaWNoIGlzCisgIC8vIGEgcG9pbnRlciBiYWNrIHRvIHRoZWlyIFVzZXIgd2l0aCB0aGUgYm90dG9tIGJpdCBzZXQuCisgIHVzaW5nIFVzZXJSZWYgPSBQb2ludGVySW50UGFpcjxVc2VyICosIDEsIHVuc2lnbmVkLCBVc2VyUmVmUG9pbnRlclRyYWl0cz47CisKKyAgLy8vIFBvaW50ZXIgdHJhaXRzIGZvciB0aGUgUHJldiBQb2ludGVySW50UGFpci4gVGhpcyBlbnN1cmVzIHdlIGFsd2F5cyB1c2UKKyAgLy8vIHRoZSB0d28gTFNCcyByZWdhcmRsZXNzIG9mIHBvaW50ZXIgYWxpZ25tZW50IG9uIGRpZmZlcmVudCB0YXJnZXRzLgorICBzdHJ1Y3QgUHJldlBvaW50ZXJUcmFpdHMgeworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0QXNWb2lkUG9pbnRlcihVc2UgKipQKSB7IHJldHVybiBQOyB9CisKKyAgICBzdGF0aWMgaW5saW5lIFVzZSAqKmdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7CisgICAgICByZXR1cm4gKFVzZSAqKilQOworICAgIH0KKworICAgIGVudW0geyBOdW1Mb3dCaXRzQXZhaWxhYmxlID0gMiB9OworICB9OworCitwcml2YXRlOgorICAvLy8gRGVzdHJ1Y3RvciAtIE9ubHkgZm9yIHphcCgpCisgIH5Vc2UoKSB7CisgICAgaWYgKFZhbCkKKyAgICAgIHJlbW92ZUZyb21MaXN0KCk7CisgIH0KKworICBlbnVtIFByZXZQdHJUYWcgeyB6ZXJvRGlnaXRUYWcsIG9uZURpZ2l0VGFnLCBzdG9wVGFnLCBmdWxsU3RvcFRhZyB9OworCisgIC8vLyBDb25zdHJ1Y3RvcgorICBVc2UoUHJldlB0clRhZyB0YWcpIHsgUHJldi5zZXRJbnQodGFnKTsgfQorCitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBWYWx1ZTsKKworICBvcGVyYXRvciBWYWx1ZSAqKCkgY29uc3QgeyByZXR1cm4gVmFsOyB9CisgIFZhbHVlICpnZXQoKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIFVzZXIgdGhhdCBjb250YWlucyB0aGlzIFVzZS4KKyAgLy8vCisgIC8vLyBGb3IgYW4gaW5zdHJ1Y3Rpb24gb3BlcmFuZCwgZm9yIGV4YW1wbGUsIHRoaXMgd2lsbCByZXR1cm4gdGhlCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgVXNlciAqZ2V0VXNlcigpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisKKyAgaW5saW5lIHZvaWQgc2V0KFZhbHVlICpWYWwpOworCisgIGlubGluZSBWYWx1ZSAqb3BlcmF0b3I9KFZhbHVlICpSSFMpOworICBpbmxpbmUgY29uc3QgVXNlICZvcGVyYXRvcj0oY29uc3QgVXNlICZSSFMpOworCisgIFZhbHVlICpvcGVyYXRvci0+KCkgeyByZXR1cm4gVmFsOyB9CisgIGNvbnN0IFZhbHVlICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gVmFsOyB9CisKKyAgVXNlICpnZXROZXh0KCkgY29uc3QgeyByZXR1cm4gTmV4dDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBvcGVyYW5kICMgb2YgdGhpcyB1c2UgaW4gaXRzIFVzZXIuCisgIHVuc2lnbmVkIGdldE9wZXJhbmRObygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgSW5pdGlhbGl6ZXMgdGhlIHdheW1hcmtpbmcgdGFncyBvbiBhbiBhcnJheSBvZiBVc2VzLgorICAvLy8KKyAgLy8vIFRoaXMgc2V0cyB1cCB0aGUgYXJyYXkgb2YgVXNlcyBzdWNoIHRoYXQgZ2V0VXNlcigpIGNhbiBmaW5kIHRoZSBVc2VyIGZyb20KKyAgLy8vIGFueSBvZiB0aG9zZSBVc2VzLgorICBzdGF0aWMgVXNlICppbml0VGFncyhVc2UgKlN0YXJ0LCBVc2UgKlN0b3ApOworCisgIC8vLyBcYnJpZWYgRGVzdHJveXMgVXNlIG9wZXJhbmRzIHdoZW4gdGhlIG51bWJlciBvZiBvcGVyYW5kcyBvZgorICAvLy8gYSBVc2VyIGNoYW5nZXMuCisgIHN0YXRpYyB2b2lkIHphcChVc2UgKlN0YXJ0LCBjb25zdCBVc2UgKlN0b3AsIGJvb2wgZGVsID0gZmFsc2UpOworCitwcml2YXRlOgorICBjb25zdCBVc2UgKmdldEltcGxpZWRVc2VyKCkgY29uc3QgTExWTV9SRUFET05MWTsKKworICBWYWx1ZSAqVmFsID0gbnVsbHB0cjsKKyAgVXNlICpOZXh0OworICBQb2ludGVySW50UGFpcjxVc2UgKiosIDIsIFByZXZQdHJUYWcsIFByZXZQb2ludGVyVHJhaXRzPiBQcmV2OworCisgIHZvaWQgc2V0UHJldihVc2UgKipOZXdQcmV2KSB7IFByZXYuc2V0UG9pbnRlcihOZXdQcmV2KTsgfQorCisgIHZvaWQgYWRkVG9MaXN0KFVzZSAqKkxpc3QpIHsKKyAgICBOZXh0ID0gKkxpc3Q7CisgICAgaWYgKE5leHQpCisgICAgICBOZXh0LT5zZXRQcmV2KCZOZXh0KTsKKyAgICBzZXRQcmV2KExpc3QpOworICAgICpMaXN0ID0gdGhpczsKKyAgfQorCisgIHZvaWQgcmVtb3ZlRnJvbUxpc3QoKSB7CisgICAgVXNlICoqU3RyaXBwZWRQcmV2ID0gUHJldi5nZXRQb2ludGVyKCk7CisgICAgKlN0cmlwcGVkUHJldiA9IE5leHQ7CisgICAgaWYgKE5leHQpCisgICAgICBOZXh0LT5zZXRQcmV2KFN0cmlwcGVkUHJldik7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQWxsb3cgY2xpZW50cyB0byB0cmVhdCB1c2VzIGp1c3QgbGlrZSB2YWx1ZXMgd2hlbiB1c2luZworLy8vIGNhc3Rpbmcgb3BlcmF0b3JzLgordGVtcGxhdGUgPD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8VXNlPiB7CisgIHVzaW5nIFNpbXBsZVR5cGUgPSBWYWx1ZSAqOworCisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShVc2UgJlZhbCkgeyByZXR1cm4gVmFsLmdldCgpOyB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8Y29uc3QgVXNlPiB7CisgIHVzaW5nIFNpbXBsZVR5cGUgPSAvKmNvbnN0Ki8gVmFsdWUgKjsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoY29uc3QgVXNlICZWYWwpIHsgcmV0dXJuIFZhbC5nZXQoKTsgfQorfTsKKworLy8gQ3JlYXRlIHdyYXBwZXJzIGZvciBDIEJpbmRpbmcgdHlwZXMgKHNlZSBDQmluZGluZ1dyYXBwaW5nLmgpLgorREVGSU5FX1NJTVBMRV9DT05WRVJTSU9OX0ZVTkNUSU9OUyhVc2UsIExMVk1Vc2VSZWYpCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX1VTRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1VzZUxpc3RPcmRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Vc2VMaXN0T3JkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGIzOTRmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Vc2VMaXN0T3JkZXIuaApAQCAtMCwwICsxLDQ0IEBACisvLz09PS0gbGx2bS9JUi9Vc2VMaXN0T3JkZXIuaCAtIExMVk0gVXNlIExpc3QgT3JkZXIgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBoYXMgc3RydWN0dXJlcyBhbmQgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIHByZXNlcnZpbmcgdXNlLWxpc3QKKy8vIG9yZGVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9VU0VMSVNUT1JERVJfSAorI2RlZmluZSBMTFZNX0lSX1VTRUxJU1RPUkRFUl9ICisKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIFZhbHVlOworCisvLy8gXGJyaWVmIFN0cnVjdHVyZSB0byBob2xkIGEgdXNlLWxpc3Qgb3JkZXIuCitzdHJ1Y3QgVXNlTGlzdE9yZGVyIHsKKyAgY29uc3QgVmFsdWUgKlYgPSBudWxscHRyOworICBjb25zdCBGdW5jdGlvbiAqRiA9IG51bGxwdHI7CisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBTaHVmZmxlOworCisgIFVzZUxpc3RPcmRlcihjb25zdCBWYWx1ZSAqViwgY29uc3QgRnVuY3Rpb24gKkYsIHNpemVfdCBTaHVmZmxlU2l6ZSkKKyAgICAgIDogVihWKSwgRihGKSwgU2h1ZmZsZShTaHVmZmxlU2l6ZSkge30KKworICBVc2VMaXN0T3JkZXIoKSA9IGRlZmF1bHQ7CisgIFVzZUxpc3RPcmRlcihVc2VMaXN0T3JkZXIgJiYpID0gZGVmYXVsdDsKKyAgVXNlTGlzdE9yZGVyICZvcGVyYXRvcj0oVXNlTGlzdE9yZGVyICYmKSA9IGRlZmF1bHQ7Cit9OworCit1c2luZyBVc2VMaXN0T3JkZXJTdGFjayA9IHN0ZDo6dmVjdG9yPFVzZUxpc3RPcmRlcj47CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX1VTRUxJU1RPUkRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1VzZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMzBiZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1VzZXIuaApAQCAtMCwwICsxLDMzNSBAQAorLy89PT0tIGxsdm0vVXNlci5oIC0gVXNlciBjbGFzcyBkZWZpbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIGludGVyZmFjZSB0aGF0IG9uZSB3aG8gdXNlcyBhIFZhbHVlIG11c3QgaW1wbGVtZW50LgorLy8gRWFjaCBpbnN0YW5jZSBvZiB0aGUgVmFsdWUgY2xhc3Mga2VlcHMgdHJhY2sgb2Ygd2hhdCBVc2VyJ3MgaGF2ZSBoYW5kbGVzCisvLyB0byBpdC4KKy8vCisvLyAgKiBJbnN0cnVjdGlvbnMgYXJlIHRoZSBsYXJnZXN0IGNsYXNzIG9mIFVzZXJzLgorLy8gICogQ29uc3RhbnRzIG1heSBiZSB1c2VycyBvZiBvdGhlciBjb25zdGFudHMgKHRoaW5rIGFycmF5cyBhbmQgc3R1ZmYpCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX1VTRVJfSAorI2RlZmluZSBMTFZNX0lSX1VTRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVXNlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgTXV0YWJsZUFycmF5UmVmOworCisvLy8gXGJyaWVmIENvbXBpbGUtdGltZSBjdXN0b21pemF0aW9uIG9mIFVzZXIgb3BlcmFuZHMuCisvLy8KKy8vLyBDdXN0b21pemVzIG9wZXJhbmQtcmVsYXRlZCBhbGxvY2F0b3JzIGFuZCBhY2Nlc3NvcnMuCit0ZW1wbGF0ZSA8Y2xhc3M+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czsKKworY2xhc3MgVXNlciA6IHB1YmxpYyBWYWx1ZSB7CisgIHRlbXBsYXRlIDx1bnNpZ25lZD4KKyAgZnJpZW5kIHN0cnVjdCBIdW5nb2ZmT3BlcmFuZFRyYWl0czsKKworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIGlubGluZSBzdGF0aWMgdm9pZCAqCisgIGFsbG9jYXRlRml4ZWRPcGVyYW5kVXNlcihzaXplX3QsIHVuc2lnbmVkLCB1bnNpZ25lZCk7CisKK3Byb3RlY3RlZDoKKyAgLy8vIEFsbG9jYXRlIGEgVXNlciB3aXRoIGFuIG9wZXJhbmQgcG9pbnRlciBjby1hbGxvY2F0ZWQuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIGZvciBzdWJjbGFzc2VzIHdoaWNoIG5lZWQgdG8gYWxsb2NhdGUgYSB2YXJpYWJsZSBudW1iZXIKKyAgLy8vIG9mIG9wZXJhbmRzLCBpZSwgJ2h1bmcgb2ZmIHVzZXMnLgorICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IFNpemUpOworCisgIC8vLyBBbGxvY2F0ZSBhIFVzZXIgd2l0aCB0aGUgb3BlcmFuZHMgY28tYWxsb2NhdGVkLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCBmb3Igc3ViY2xhc3NlcyB3aGljaCBoYXZlIGEgZml4ZWQgbnVtYmVyIG9mIG9wZXJhbmRzLgorICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IFNpemUsIHVuc2lnbmVkIFVzKTsKKworICAvLy8gQWxsb2NhdGUgYSBVc2VyIHdpdGggdGhlIG9wZXJhbmRzIGNvLWFsbG9jYXRlZC4gIElmIERlc2NCeXRlcyBpcyBub24temVybworICAvLy8gdGhlbiBhbGxvY2F0ZSBhbiBhZGRpdGlvbmFsIERlc2NCeXRlcyBieXRlcyBiZWZvcmUgdGhlIG9wZXJhbmRzLiBUaGVzZQorICAvLy8gYnl0ZXMgY2FuIGJlIGFjY2Vzc2VkIGJ5IGNhbGxpbmcgZ2V0RGVzY3JpcHRvci4KKyAgLy8vCisgIC8vLyBEZXNjQnl0ZXMgbmVlZHMgdG8gYmUgZGl2aXNpYmxlIGJ5IHNpemVvZih2b2lkICopLiAgVGhlIGFsbG9jYXRlZAorICAvLy8gZGVzY3JpcHRvciwgaWYgYW55LCBpcyBhbGlnbmVkIHRvIHNpemVvZih2b2lkICopIGJ5dGVzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCBmb3Igc3ViY2xhc3NlcyB3aGljaCBoYXZlIGEgZml4ZWQgbnVtYmVyIG9mIG9wZXJhbmRzLgorICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IFNpemUsIHVuc2lnbmVkIFVzLCB1bnNpZ25lZCBEZXNjQnl0ZXMpOworCisgIFVzZXIoVHlwZSAqdHksIHVuc2lnbmVkIHZ0eSwgVXNlICosIHVuc2lnbmVkIE51bU9wcykKKyAgICAgIDogVmFsdWUodHksIHZ0eSkgeworICAgIGFzc2VydChOdW1PcHMgPCAoMXUgPDwgTnVtVXNlck9wZXJhbmRzQml0cykgJiYgIlRvbyBtYW55IG9wZXJhbmRzIik7CisgICAgTnVtVXNlck9wZXJhbmRzID0gTnVtT3BzOworICAgIC8vIElmIHdlIGhhdmUgaHVuZyBvZmYgdXNlcywgdGhlbiB0aGUgb3BlcmFuZCBsaXN0IHNob3VsZCBpbml0aWFsbHkgYmUKKyAgICAvLyBudWxsLgorICAgIGFzc2VydCgoIUhhc0h1bmdPZmZVc2VzIHx8ICFnZXRPcGVyYW5kTGlzdCgpKSAmJgorICAgICAgICAgICAiRXJyb3IgaW4gaW5pdGlhbGl6aW5nIGh1bmcgb2ZmIHVzZXMgZm9yIFVzZXIiKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWxsb2NhdGUgdGhlIGFycmF5IG9mIFVzZXMsIGZvbGxvd2VkIGJ5IGEgcG9pbnRlcgorICAvLy8gKHdpdGggYm90dG9tIGJpdCBzZXQpIHRvIHRoZSBVc2VyLgorICAvLy8gXHBhcmFtIElzUGhpIGlkZW50aWZpZXMgY2FsbGVycyB3aGljaCBhcmUgcGhpIG5vZGVzIGFuZCB3aGljaCBuZWVkCisgIC8vLyBOIEJhc2ljQmxvY2sqIGFsbG9jYXRlZCBhbG9uZyB3aXRoIE4KKyAgdm9pZCBhbGxvY0h1bmdvZmZVc2VzKHVuc2lnbmVkIE4sIGJvb2wgSXNQaGkgPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBHcm93IHRoZSBudW1iZXIgb2YgaHVuZyBvZmYgdXNlcy4gIE5vdGUgdGhhdCBhbGxvY0h1bmdvZmZVc2VzCisgIC8vLyBzaG91bGQgYmUgY2FsbGVkIGlmIHRoZXJlIGFyZSBubyB1c2VzLgorICB2b2lkIGdyb3dIdW5nb2ZmVXNlcyh1bnNpZ25lZCBOLCBib29sIElzUGhpID0gZmFsc2UpOworCitwcm90ZWN0ZWQ6CisgIH5Vc2VyKCkgPSBkZWZhdWx0OyAvLyBVc2UgZGVsZXRlVmFsdWUoKSB0byBkZWxldGUgYSBnZW5lcmljIEluc3RydWN0aW9uLgorCitwdWJsaWM6CisgIFVzZXIoY29uc3QgVXNlciAmKSA9IGRlbGV0ZTsKKworICAvLy8gXGJyaWVmIEZyZWUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgVXNlciBhbmQgVXNlIG9iamVjdHMuCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKlVzcik7CisgIC8vLyBcYnJpZWYgUGxhY2VtZW50IGRlbGV0ZSAtIHJlcXVpcmVkIGJ5IHN0ZCwgY2FsbGVkIGlmIHRoZSBjdG9yIHRocm93cy4KKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqVXNyLCB1bnNpZ25lZCkgeworICAgIC8vIE5vdGU6IElmIGEgc3ViY2xhc3MgbWFuaXB1bGF0ZXMgdGhlIGluZm9ybWF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIGNhbGN1bGF0ZSB0aGUgCisgICAgLy8gVXNyIG1lbW9yeSBwb2ludGVyLCBlLmcuIE51bVVzZXJPcGVyYW5kcywgdGhlIG9wZXJhdG9yIGRlbGV0ZSBvZiB0aGF0IHN1YmNsYXNzIGhhcyAKKyAgICAvLyB0byByZXN0b3JlIHRoZSBjaGFuZ2VkIGluZm9ybWF0aW9uIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZSwgc2luY2UgdGhlIGR0b3Igb2YgdGhhdCBjbGFzcworICAgIC8vIGlzIG5vdCBjYWxsZWQgaWYgdGhlIGN0b3IgZmFpbHMuICAKKyAgICBVc2VyOjpvcGVyYXRvciBkZWxldGUoVXNyKTsKKworI2lmbmRlZiBMTFZNX0VOQUJMRV9FWENFUFRJT05TCisgICAgbGx2bV91bnJlYWNoYWJsZSgiQ29uc3RydWN0b3IgdGhyb3dzPyIpOworI2VuZGlmCisgIH0KKyAgLy8vIFxicmllZiBQbGFjZW1lbnQgZGVsZXRlIC0gcmVxdWlyZWQgYnkgc3RkLCBjYWxsZWQgaWYgdGhlIGN0b3IgdGhyb3dzLgorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpVc3IsIHVuc2lnbmVkLCBib29sKSB7CisgICAgLy8gTm90ZTogSWYgYSBzdWJjbGFzcyBtYW5pcHVsYXRlcyB0aGUgaW5mb3JtYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gY2FsY3VsYXRlIHRoZSAKKyAgICAvLyBVc3IgbWVtb3J5IHBvaW50ZXIsIGUuZy4gTnVtVXNlck9wZXJhbmRzLCB0aGUgb3BlcmF0b3IgZGVsZXRlIG9mIHRoYXQgc3ViY2xhc3MgaGFzIAorICAgIC8vIHRvIHJlc3RvcmUgdGhlIGNoYW5nZWQgaW5mb3JtYXRpb24gdG8gdGhlIG9yaWdpbmFsIHZhbHVlLCBzaW5jZSB0aGUgZHRvciBvZiB0aGF0IGNsYXNzCisgICAgLy8gaXMgbm90IGNhbGxlZCBpZiB0aGUgY3RvciBmYWlscy4gIAorICAgIFVzZXI6Om9wZXJhdG9yIGRlbGV0ZShVc3IpOworCisjaWZuZGVmIExMVk1fRU5BQkxFX0VYQ0VQVElPTlMKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJDb25zdHJ1Y3RvciB0aHJvd3M/Iik7CisjZW5kaWYKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHRlbXBsYXRlIDxpbnQgSWR4LCB0eXBlbmFtZSBVPiBzdGF0aWMgVXNlICZPcEZyb20oY29uc3QgVSAqdGhhdCkgeworICAgIHJldHVybiBJZHggPCAwCisgICAgICA/IE9wZXJhbmRUcmFpdHM8VT46Om9wX2VuZChjb25zdF9jYXN0PFUqPih0aGF0KSlbSWR4XQorICAgICAgOiBPcGVyYW5kVHJhaXRzPFU+OjpvcF9iZWdpbihjb25zdF9jYXN0PFUqPih0aGF0KSlbSWR4XTsKKyAgfQorCisgIHRlbXBsYXRlIDxpbnQgSWR4PiBVc2UgJk9wKCkgeworICAgIHJldHVybiBPcEZyb208SWR4Pih0aGlzKTsKKyAgfQorICB0ZW1wbGF0ZSA8aW50IElkeD4gY29uc3QgVXNlICZPcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gT3BGcm9tPElkeD4odGhpcyk7CisgIH0KKworcHJpdmF0ZToKKyAgY29uc3QgVXNlICpnZXRIdW5nT2ZmT3BlcmFuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCBVc2UgKmNvbnN0ICo+KHRoaXMpIC0gMSk7CisgIH0KKworICBVc2UgKiZnZXRIdW5nT2ZmT3BlcmFuZHMoKSB7IHJldHVybiAqKHJlaW50ZXJwcmV0X2Nhc3Q8VXNlICoqPih0aGlzKSAtIDEpOyB9CisKKyAgY29uc3QgVXNlICpnZXRJbnRydXNpdmVPcGVyYW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVc2UgKj4odGhpcykgLSBOdW1Vc2VyT3BlcmFuZHM7CisgIH0KKworICBVc2UgKmdldEludHJ1c2l2ZU9wZXJhbmRzKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFVzZSAqPih0aGlzKSAtIE51bVVzZXJPcGVyYW5kczsKKyAgfQorCisgIHZvaWQgc2V0T3BlcmFuZExpc3QoVXNlICpOZXdMaXN0KSB7CisgICAgYXNzZXJ0KEhhc0h1bmdPZmZVc2VzICYmCisgICAgICAgICAgICJTZXR0aW5nIG9wZXJhbmQgbGlzdCBvbmx5IHJlcXVpcmVkIGZvciBodW5nIG9mZiB1c2VzIik7CisgICAgZ2V0SHVuZ09mZk9wZXJhbmRzKCkgPSBOZXdMaXN0OworICB9CisKK3B1YmxpYzoKKyAgY29uc3QgVXNlICpnZXRPcGVyYW5kTGlzdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSGFzSHVuZ09mZlVzZXMgPyBnZXRIdW5nT2ZmT3BlcmFuZHMoKSA6IGdldEludHJ1c2l2ZU9wZXJhbmRzKCk7CisgIH0KKyAgVXNlICpnZXRPcGVyYW5kTGlzdCgpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxVc2UgKj4oc3RhdGljX2Nhc3Q8Y29uc3QgVXNlciAqPih0aGlzKS0+Z2V0T3BlcmFuZExpc3QoKSk7CisgIH0KKworICBWYWx1ZSAqZ2V0T3BlcmFuZCh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBOdW1Vc2VyT3BlcmFuZHMgJiYgImdldE9wZXJhbmQoKSBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGdldE9wZXJhbmRMaXN0KClbaV07CisgIH0KKworICB2b2lkIHNldE9wZXJhbmQodW5zaWduZWQgaSwgVmFsdWUgKlZhbCkgeworICAgIGFzc2VydChpIDwgTnVtVXNlck9wZXJhbmRzICYmICJzZXRPcGVyYW5kKCkgb3V0IG9mIHJhbmdlISIpOworICAgIGFzc2VydCgoIWlzYTxDb25zdGFudD4oKGNvbnN0IFZhbHVlKil0aGlzKSB8fAorICAgICAgICAgICAgaXNhPEdsb2JhbFZhbHVlPigoY29uc3QgVmFsdWUqKXRoaXMpKSAmJgorICAgICAgICAgICAiQ2Fubm90IG11dGF0ZSBhIGNvbnN0YW50IHdpdGggc2V0T3BlcmFuZCEiKTsKKyAgICBnZXRPcGVyYW5kTGlzdCgpW2ldID0gVmFsOworICB9CisKKyAgY29uc3QgVXNlICZnZXRPcGVyYW5kVXNlKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IE51bVVzZXJPcGVyYW5kcyAmJiAiZ2V0T3BlcmFuZFVzZSgpIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZExpc3QoKVtpXTsKKyAgfQorICBVc2UgJmdldE9wZXJhbmRVc2UodW5zaWduZWQgaSkgeworICAgIGFzc2VydChpIDwgTnVtVXNlck9wZXJhbmRzICYmICJnZXRPcGVyYW5kVXNlKCkgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBnZXRPcGVyYW5kTGlzdCgpW2ldOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdCB7IHJldHVybiBOdW1Vc2VyT3BlcmFuZHM7IH0KKworICAvLy8gUmV0dXJucyB0aGUgZGVzY3JpcHRvciBjby1hbGxvY2F0ZWQgd2l0aCB0aGlzIFVzZXIgaW5zdGFuY2UuCisgIEFycmF5UmVmPGNvbnN0IHVpbnQ4X3Q+IGdldERlc2NyaXB0b3IoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgZGVzY3JpcHRvciBjby1hbGxvY2F0ZWQgd2l0aCB0aGlzIFVzZXIgaW5zdGFuY2UuCisgIE11dGFibGVBcnJheVJlZjx1aW50OF90PiBnZXREZXNjcmlwdG9yKCk7CisKKyAgLy8vIFNldCB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIG9uIGEgR2xvYmFsVmFyaWFibGUuCisgIC8vLworICAvLy8gR2xvYmFsVmFyaWFibGUgYWx3YXlzIGFsbG9jYXRlcyBzcGFjZSBmb3IgYSBzaW5nbGUgb3BlcmFuZHMsIGJ1dAorICAvLy8gZG9lc24ndCBhbHdheXMgdXNlIGl0LgorICAvLy8KKyAgLy8vIEZJWE1FOiBBcyB0aGF0IHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgaXMgdXNlZCB0byBmaW5kIHRoZSBzdGFydCBvZgorICAvLy8gdGhlIGFsbG9jYXRlZCBtZW1vcnkgaW4gb3BlcmF0b3IgZGVsZXRlLCB3ZSBuZWVkIHRvIGFsd2F5cyB0aGluayB3ZSBoYXZlCisgIC8vLyAxIG9wZXJhbmQgYmVmb3JlIGRlbGV0ZS4KKyAgdm9pZCBzZXRHbG9iYWxWYXJpYWJsZU51bU9wZXJhbmRzKHVuc2lnbmVkIE51bU9wcykgeworICAgIGFzc2VydChOdW1PcHMgPD0gMSAmJiAiR2xvYmFsVmFyaWFibGUgY2FuIG9ubHkgaGF2ZSAwIG9yIDEgb3BlcmFuZHMiKTsKKyAgICBOdW1Vc2VyT3BlcmFuZHMgPSBOdW1PcHM7CisgIH0KKworICAvLy8gXGJyaWVmIFN1YmNsYXNzZXMgd2l0aCBodW5nIG9mZiB1c2VzIG5lZWQgdG8gbWFuYWdlIHRoZSBvcGVyYW5kIGNvdW50CisgIC8vLyB0aGVtc2VsdmVzLiAgSW4gdGhlc2UgaW5zdGFuY2VzLCB0aGUgb3BlcmFuZCBjb3VudCBpc24ndCB1c2VkIHRvIGZpbmQgdGhlCisgIC8vLyBPcGVyYW5kTGlzdCwgc28gdGhlcmUncyBubyBpc3N1ZSBpbiBoYXZpbmcgdGhlIG9wZXJhbmQgY291bnQgY2hhbmdlLgorICB2b2lkIHNldE51bUh1bmdPZmZVc2VPcGVyYW5kcyh1bnNpZ25lZCBOdW1PcHMpIHsKKyAgICBhc3NlcnQoSGFzSHVuZ09mZlVzZXMgJiYgIk11c3QgaGF2ZSBodW5nIG9mZiB1c2VzIHRvIHVzZSB0aGlzIG1ldGhvZCIpOworICAgIGFzc2VydChOdW1PcHMgPCAoMXUgPDwgTnVtVXNlck9wZXJhbmRzQml0cykgJiYgIlRvbyBtYW55IG9wZXJhbmRzIik7CisgICAgTnVtVXNlck9wZXJhbmRzID0gTnVtT3BzOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIE9wZXJhbmQgSXRlcmF0b3IgaW50ZXJmYWNlLi4uCisgIC8vCisgIHVzaW5nIG9wX2l0ZXJhdG9yID0gVXNlKjsKKyAgdXNpbmcgY29uc3Rfb3BfaXRlcmF0b3IgPSBjb25zdCBVc2UqOworICB1c2luZyBvcF9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPG9wX2l0ZXJhdG9yPjsKKyAgdXNpbmcgY29uc3Rfb3BfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxjb25zdF9vcF9pdGVyYXRvcj47CisKKyAgb3BfaXRlcmF0b3IgICAgICAgb3BfYmVnaW4oKSAgICAgICB7IHJldHVybiBnZXRPcGVyYW5kTGlzdCgpOyB9CisgIGNvbnN0X29wX2l0ZXJhdG9yIG9wX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZExpc3QoKTsgfQorICBvcF9pdGVyYXRvciAgICAgICBvcF9lbmQoKSAgICAgICAgIHsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZExpc3QoKSArIE51bVVzZXJPcGVyYW5kczsKKyAgfQorICBjb25zdF9vcF9pdGVyYXRvciBvcF9lbmQoKSAgIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZExpc3QoKSArIE51bVVzZXJPcGVyYW5kczsKKyAgfQorICBvcF9yYW5nZSBvcGVyYW5kcygpIHsKKyAgICByZXR1cm4gb3BfcmFuZ2Uob3BfYmVnaW4oKSwgb3BfZW5kKCkpOworICB9CisgIGNvbnN0X29wX3JhbmdlIG9wZXJhbmRzKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9vcF9yYW5nZShvcF9iZWdpbigpLCBvcF9lbmQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIEl0ZXJhdG9yIGZvciBkaXJlY3RseSBpdGVyYXRpbmcgb3ZlciB0aGUgb3BlcmFuZCBWYWx1ZXMuCisgIHN0cnVjdCB2YWx1ZV9vcF9pdGVyYXRvcgorICAgICAgOiBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8dmFsdWVfb3BfaXRlcmF0b3IsIG9wX2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgVmFsdWUgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCwgVmFsdWUgKiwgVmFsdWUgKj4geworICAgIGV4cGxpY2l0IHZhbHVlX29wX2l0ZXJhdG9yKFVzZSAqVSA9IG51bGxwdHIpIDogaXRlcmF0b3JfYWRhcHRvcl9iYXNlKFUpIHt9CisKKyAgICBWYWx1ZSAqb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKkk7IH0KKyAgICBWYWx1ZSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG9wZXJhdG9yKigpOyB9CisgIH07CisKKyAgdmFsdWVfb3BfaXRlcmF0b3IgdmFsdWVfb3BfYmVnaW4oKSB7CisgICAgcmV0dXJuIHZhbHVlX29wX2l0ZXJhdG9yKG9wX2JlZ2luKCkpOworICB9CisgIHZhbHVlX29wX2l0ZXJhdG9yIHZhbHVlX29wX2VuZCgpIHsKKyAgICByZXR1cm4gdmFsdWVfb3BfaXRlcmF0b3Iob3BfZW5kKCkpOworICB9CisgIGl0ZXJhdG9yX3JhbmdlPHZhbHVlX29wX2l0ZXJhdG9yPiBvcGVyYW5kX3ZhbHVlcygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZSh2YWx1ZV9vcF9iZWdpbigpLCB2YWx1ZV9vcF9lbmQoKSk7CisgIH0KKworICBzdHJ1Y3QgY29uc3RfdmFsdWVfb3BfaXRlcmF0b3IKKyAgICAgIDogaXRlcmF0b3JfYWRhcHRvcl9iYXNlPGNvbnN0X3ZhbHVlX29wX2l0ZXJhdG9yLCBjb25zdF9vcF9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIGNvbnN0IFZhbHVlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QsIGNvbnN0IFZhbHVlICosIGNvbnN0IFZhbHVlICo+IHsKKyAgICBleHBsaWNpdCBjb25zdF92YWx1ZV9vcF9pdGVyYXRvcihjb25zdCBVc2UgKlUgPSBudWxscHRyKSA6CisgICAgICBpdGVyYXRvcl9hZGFwdG9yX2Jhc2UoVSkge30KKworICAgIGNvbnN0IFZhbHVlICpvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqSTsgfQorICAgIGNvbnN0IFZhbHVlICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gb3BlcmF0b3IqKCk7IH0KKyAgfTsKKworICBjb25zdF92YWx1ZV9vcF9pdGVyYXRvciB2YWx1ZV9vcF9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfdmFsdWVfb3BfaXRlcmF0b3Iob3BfYmVnaW4oKSk7CisgIH0KKyAgY29uc3RfdmFsdWVfb3BfaXRlcmF0b3IgdmFsdWVfb3BfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF92YWx1ZV9vcF9pdGVyYXRvcihvcF9lbmQoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfdmFsdWVfb3BfaXRlcmF0b3I+IG9wZXJhbmRfdmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHZhbHVlX29wX2JlZ2luKCksIHZhbHVlX29wX2VuZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRHJvcCBhbGwgcmVmZXJlbmNlcyB0byBvcGVyYW5kcy4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIGluIGNoYXJnZSBvZiAibGV0dGluZyBnbyIgb2YgYWxsIG9iamVjdHMgdGhhdCB0aGlzIFVzZXIKKyAgLy8vIHJlZmVycyB0by4gIFRoaXMgYWxsb3dzIG9uZSB0byAnZGVsZXRlJyBhIHdob2xlIGNsYXNzIGF0IGEgdGltZSwgZXZlbgorICAvLy8gdGhvdWdoIHRoZXJlIG1heSBiZSBjaXJjdWxhciByZWZlcmVuY2VzLi4uICBGaXJzdCBhbGwgcmVmZXJlbmNlcyBhcmUKKyAgLy8vIGRyb3BwZWQsIGFuZCBhbGwgdXNlIGNvdW50cyBnbyB0byB6ZXJvLiAgVGhlbiBldmVyeXRoaW5nIGlzIGRlbGV0ZWQgZm9yCisgIC8vLyByZWFsLiAgTm90ZSB0aGF0IG5vIG9wZXJhdGlvbnMgYXJlIHZhbGlkIG9uIGFuIG9iamVjdCB0aGF0IGhhcyAiZHJvcHBlZAorICAvLy8gYWxsIHJlZmVyZW5jZXMiLCBleGNlcHQgb3BlcmF0b3IgZGVsZXRlLgorICB2b2lkIGRyb3BBbGxSZWZlcmVuY2VzKCkgeworICAgIGZvciAoVXNlICZVIDogb3BlcmFuZHMoKSkKKyAgICAgIFUuc2V0KG51bGxwdHIpOworICB9CisKKyAgLy8vIFxicmllZiBSZXBsYWNlIHVzZXMgb2Ygb25lIFZhbHVlIHdpdGggYW5vdGhlci4KKyAgLy8vCisgIC8vLyBSZXBsYWNlcyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgIkZyb20iIGRlZmluaXRpb24gd2l0aCByZWZlcmVuY2VzIHRvIHRoZQorICAvLy8gIlRvIiBkZWZpbml0aW9uLgorICB2b2lkIHJlcGxhY2VVc2VzT2ZXaXRoKFZhbHVlICpGcm9tLCBWYWx1ZSAqVG8pOworCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSB8fCBpc2E8Q29uc3RhbnQ+KFYpOworICB9Cit9OworCisvLyBFaXRoZXIgVXNlIG9iamVjdHMsIG9yIGEgVXNlIHBvaW50ZXIgY2FuIGJlIHByZXBlbmRlZCB0byBVc2VyLgorc3RhdGljX2Fzc2VydChhbGlnbm9mKFVzZSkgPj0gYWxpZ25vZihVc2VyKSwKKyAgICAgICAgICAgICAgIkFsaWdubWVudCBpcyBpbnN1ZmZpY2llbnQgYWZ0ZXIgb2JqZWN0cyBwcmVwZW5kZWQgdG8gVXNlciIpOworc3RhdGljX2Fzc2VydChhbGlnbm9mKFVzZSAqKSA+PSBhbGlnbm9mKFVzZXIpLAorICAgICAgICAgICAgICAiQWxpZ25tZW50IGlzIGluc3VmZmljaWVudCBhZnRlciBvYmplY3RzIHByZXBlbmRlZCB0byBVc2VyIik7CisKK3RlbXBsYXRlPD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8VXNlcjo6b3BfaXRlcmF0b3I+IHsKKyAgdXNpbmcgU2ltcGxlVHlwZSA9IFZhbHVlKjsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoVXNlcjo6b3BfaXRlcmF0b3IgJlZhbCkgeworICAgIHJldHVybiBWYWwtPmdldCgpOworICB9Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxVc2VyOjpjb25zdF9vcF9pdGVyYXRvcj4geworICB1c2luZyBTaW1wbGVUeXBlID0gLypjb25zdCovIFZhbHVlKjsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoVXNlcjo6Y29uc3Rfb3BfaXRlcmF0b3IgJlZhbCkgeworICAgIHJldHVybiBWYWwtPmdldCgpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9VU0VSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVmFsdWUuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9WYWx1ZS5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJkZGJhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVmFsdWUuZGVmCkBAIC0wLDAgKzEsMTE3IEBACisvLz09PS0tLS0tLS0tIGxsdm0vSVIvVmFsdWUuZGVmIC0gRmlsZSB0aGF0IGRlc2NyaWJlcyBWYWx1ZXMgLS0tdi0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgZGVzY3JpcHRpb25zIG9mIHRoZSB2YXJpb3VzIExMVk0gdmFsdWVzLiAgVGhpcyBpcworLy8gdXNlZCBhcyBhIGNlbnRyYWwgcGxhY2UgZm9yIGVudW1lcmF0aW5nIHRoZSBkaWZmZXJlbnQgdmFsdWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIE5PVEU6IE5PIElOQ0xVREUgR1VBUkQgREVTSVJFRCEKKworLy8gUHJvdmlkZSBkZWZpbml0aW9ucyBvZiBtYWNyb3Mgc28gdGhhdCB1c2VycyBvZiB0aGlzIGZpbGUgZG8gbm90IGhhdmUgdG8KKy8vIGRlZmluZSBldmVyeXRoaW5nIHRvIHVzZSBpdC4uLgorLy8KKyNpZiAhKGRlZmluZWQgSEFORExFX0dMT0JBTF9WQUxVRSB8fCBkZWZpbmVkIEhBTkRMRV9DT05TVEFOVCB8fCAgICAgICAgICAgICAgICBcCisgICAgICBkZWZpbmVkIEhBTkRMRV9JTlNUUlVDVElPTiB8fCBkZWZpbmVkIEhBTkRMRV9JTkxJTkVfQVNNX1ZBTFVFIHx8ICAgICAgICAgXAorICAgICAgZGVmaW5lZCBIQU5ETEVfTUVUQURBVEFfVkFMVUUgfHwgZGVmaW5lZCBIQU5ETEVfVkFMVUUgfHwgICAgICAgICAgICAgICAgIFwKKyAgICAgIGRlZmluZWQgSEFORExFX0NPTlNUQU5UX01BUktFUiB8fCBkZWZpbmVkIEhBTkRMRV9NRU1PUllfVkFMVUUpCisjZXJyb3IgIk1pc3NpbmcgbWFjcm8gZGVmaW5pdGlvbiBvZiBIQU5ETEVfVkFMVUUqIgorI2VuZGlmCisKKyNpZm5kZWYgSEFORExFX01FTU9SWV9WQUxVRQorI2RlZmluZSBIQU5ETEVfTUVNT1JZX1ZBTFVFKFZhbHVlTmFtZSkgSEFORExFX1ZBTFVFKFZhbHVlTmFtZSkKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9HTE9CQUxfVkFMVUUKKyNkZWZpbmUgSEFORExFX0dMT0JBTF9WQUxVRShWYWx1ZU5hbWUpIEhBTkRMRV9DT05TVEFOVChWYWx1ZU5hbWUpCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfQ09OU1RBTlQKKyNkZWZpbmUgSEFORExFX0NPTlNUQU5UKFZhbHVlTmFtZSkgSEFORExFX1ZBTFVFKFZhbHVlTmFtZSkKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9JTlNUUlVDVElPTgorI2RlZmluZSBIQU5ETEVfSU5TVFJVQ1RJT04oVmFsdWVOYW1lKSBIQU5ETEVfVkFMVUUoVmFsdWVOYW1lKQorI2VuZGlmCisKKyNpZm5kZWYgSEFORExFX0lOTElORV9BU01fVkFMVUUKKyNkZWZpbmUgSEFORExFX0lOTElORV9BU01fVkFMVUUoVmFsdWVOYW1lKSBIQU5ETEVfVkFMVUUoVmFsdWVOYW1lKQorI2VuZGlmCisKKyNpZm5kZWYgSEFORExFX01FVEFEQVRBX1ZBTFVFCisjZGVmaW5lIEhBTkRMRV9NRVRBREFUQV9WQUxVRShWYWx1ZU5hbWUpIEhBTkRMRV9WQUxVRShWYWx1ZU5hbWUpCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfVkFMVUUKKyNkZWZpbmUgSEFORExFX1ZBTFVFKFZhbHVlTmFtZSkKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9DT05TVEFOVF9NQVJLRVIKKyNkZWZpbmUgSEFORExFX0NPTlNUQU5UX01BUktFUihNYXJrZXJOYW1lLCBWYWx1ZU5hbWUpCisjZW5kaWYKKworLy8gSGF2aW5nIGNvbnN0YW50IGZpcnN0IG1ha2VzIHRoZSByYW5nZSBjaGVjayBmb3IgaXNhPENvbnN0YW50PiBmYXN0ZXIKKy8vIGFuZCBzbWFsbGVyIGJ5IG9uZSBvcGVyYXRpb24uCisKKy8vIENvbnN0YW50CitIQU5ETEVfR0xPQkFMX1ZBTFVFKEZ1bmN0aW9uKQorSEFORExFX0dMT0JBTF9WQUxVRShHbG9iYWxBbGlhcykKK0hBTkRMRV9HTE9CQUxfVkFMVUUoR2xvYmFsSUZ1bmMpCitIQU5ETEVfR0xPQkFMX1ZBTFVFKEdsb2JhbFZhcmlhYmxlKQorSEFORExFX0NPTlNUQU5UKEJsb2NrQWRkcmVzcykKK0hBTkRMRV9DT05TVEFOVChDb25zdGFudEV4cHIpCisKKy8vIENvbnN0YW50QWdncmVnYXRlLgorSEFORExFX0NPTlNUQU5UKENvbnN0YW50QXJyYXkpCitIQU5ETEVfQ09OU1RBTlQoQ29uc3RhbnRTdHJ1Y3QpCitIQU5ETEVfQ09OU1RBTlQoQ29uc3RhbnRWZWN0b3IpCisKKy8vIENvbnN0YW50RGF0YS4KK0hBTkRMRV9DT05TVEFOVChVbmRlZlZhbHVlKQorSEFORExFX0NPTlNUQU5UKENvbnN0YW50QWdncmVnYXRlWmVybykKK0hBTkRMRV9DT05TVEFOVChDb25zdGFudERhdGFBcnJheSkKK0hBTkRMRV9DT05TVEFOVChDb25zdGFudERhdGFWZWN0b3IpCitIQU5ETEVfQ09OU1RBTlQoQ29uc3RhbnRJbnQpCitIQU5ETEVfQ09OU1RBTlQoQ29uc3RhbnRGUCkKK0hBTkRMRV9DT05TVEFOVChDb25zdGFudFBvaW50ZXJOdWxsKQorSEFORExFX0NPTlNUQU5UKENvbnN0YW50VG9rZW5Ob25lKQorCitIQU5ETEVfQ09OU1RBTlRfTUFSS0VSKENvbnN0YW50Rmlyc3RWYWwsIEZ1bmN0aW9uKQorSEFORExFX0NPTlNUQU5UX01BUktFUihDb25zdGFudExhc3RWYWwsIENvbnN0YW50VG9rZW5Ob25lKQorSEFORExFX0NPTlNUQU5UX01BUktFUihDb25zdGFudERhdGFGaXJzdFZhbCwgVW5kZWZWYWx1ZSkKK0hBTkRMRV9DT05TVEFOVF9NQVJLRVIoQ29uc3RhbnREYXRhTGFzdFZhbCwgQ29uc3RhbnRUb2tlbk5vbmUpCitIQU5ETEVfQ09OU1RBTlRfTUFSS0VSKENvbnN0YW50QWdncmVnYXRlRmlyc3RWYWwsIENvbnN0YW50QXJyYXkpCitIQU5ETEVfQ09OU1RBTlRfTUFSS0VSKENvbnN0YW50QWdncmVnYXRlTGFzdFZhbCwgQ29uc3RhbnRWZWN0b3IpCisKK0hBTkRMRV9WQUxVRShBcmd1bWVudCkKK0hBTkRMRV9WQUxVRShCYXNpY0Jsb2NrKQorCisKK0hBTkRMRV9NRVRBREFUQV9WQUxVRShNZXRhZGF0YUFzVmFsdWUpCitIQU5ETEVfSU5MSU5FX0FTTV9WQUxVRShJbmxpbmVBc20pCisKKy8vIEZJWE1FOiBJdCdzIGF3a3dhcmQgdGhhdCBWYWx1ZS5kZWYga25vd3MgYWJvdXQgY2xhc3NlcyBpbiBBbmFseXNpcy4gV2hpbGUKKy8vIHRoaXMgZG9lc24ndCBpbnRyb2R1Y2UgYSBzdHJpY3QgbGluayBvciBpbmNsdWRlIGRlcGVuZGVuY3ksIHdlIHNob3VsZCByZW1vdmUKKy8vIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5IGV2ZW50dWFsbHkuCitIQU5ETEVfTUVNT1JZX1ZBTFVFKE1lbW9yeVVzZSkKK0hBTkRMRV9NRU1PUllfVkFMVUUoTWVtb3J5RGVmKQorSEFORExFX01FTU9SWV9WQUxVRShNZW1vcnlQaGkpCisKK0hBTkRMRV9JTlNUUlVDVElPTihJbnN0cnVjdGlvbikKKy8vIEVudW0gdmFsdWVzIHN0YXJ0aW5nIGF0IEluc3RydWN0aW9uVmFsIGFyZSB1c2VkIGZvciBJbnN0cnVjdGlvbnM7CisvLyBkb24ndCBhZGQgbmV3IHZhbHVlcyBoZXJlIQorCisjdW5kZWYgSEFORExFX01FTU9SWV9WQUxVRQorI3VuZGVmIEhBTkRMRV9HTE9CQUxfVkFMVUUKKyN1bmRlZiBIQU5ETEVfQ09OU1RBTlQKKyN1bmRlZiBIQU5ETEVfSU5TVFJVQ1RJT04KKyN1bmRlZiBIQU5ETEVfTUVUQURBVEFfVkFMVUUKKyN1bmRlZiBIQU5ETEVfSU5MSU5FX0FTTV9WQUxVRQorI3VuZGVmIEhBTkRMRV9WQUxVRQorI3VuZGVmIEhBTkRMRV9DT05TVEFOVF9NQVJLRVIKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVmFsdWUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODQ4ZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9WYWx1ZS5oCkBAIC0wLDAgKzEsODcyIEBACisvLz09PS0gbGx2bS9WYWx1ZS5oIC0gRGVmaW5pdGlvbiBvZiB0aGUgVmFsdWUgY2xhc3MgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgVmFsdWUgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX1ZBTFVFX0gKKyNkZWZpbmUgTExWTV9JUl9WQUxVRV9ICisKKyNpbmNsdWRlICJsbHZtLWMvVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVXNlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NCaW5kaW5nV3JhcHBpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFQSW50OworY2xhc3MgQXJndW1lbnQ7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgQ29uc3RhbnQ7CitjbGFzcyBDb25zdGFudERhdGE7CitjbGFzcyBDb25zdGFudEFnZ3JlZ2F0ZTsKK2NsYXNzIERhdGFMYXlvdXQ7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEdsb2JhbEFsaWFzOworY2xhc3MgR2xvYmFsSUZ1bmM7CitjbGFzcyBHbG9iYWxJbmRpcmVjdFN5bWJvbDsKK2NsYXNzIEdsb2JhbE9iamVjdDsKK2NsYXNzIEdsb2JhbFZhbHVlOworY2xhc3MgR2xvYmFsVmFyaWFibGU7CitjbGFzcyBJbmxpbmVBc207CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgTW9kdWxlOworY2xhc3MgTW9kdWxlU2xvdFRyYWNrZXI7CitjbGFzcyByYXdfb3N0cmVhbTsKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHk+IGNsYXNzIFN0cmluZ01hcEVudHJ5OworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgVHdpbmU7CitjbGFzcyBUeXBlOworY2xhc3MgVXNlcjsKKwordXNpbmcgVmFsdWVOYW1lID0gU3RyaW5nTWFwRW50cnk8VmFsdWUgKj47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gXGJyaWVmIExMVk0gVmFsdWUgUmVwcmVzZW50YXRpb24KKy8vLworLy8vIFRoaXMgaXMgYSB2ZXJ5IGltcG9ydGFudCBMTFZNIGNsYXNzLiBJdCBpcyB0aGUgYmFzZSBjbGFzcyBvZiBhbGwgdmFsdWVzCisvLy8gY29tcHV0ZWQgYnkgYSBwcm9ncmFtIHRoYXQgbWF5IGJlIHVzZWQgYXMgb3BlcmFuZHMgdG8gb3RoZXIgdmFsdWVzLiBWYWx1ZSBpcworLy8vIHRoZSBzdXBlciBjbGFzcyBvZiBvdGhlciBpbXBvcnRhbnQgY2xhc3NlcyBzdWNoIGFzIEluc3RydWN0aW9uIGFuZCBGdW5jdGlvbi4KKy8vLyBBbGwgVmFsdWVzIGhhdmUgYSBUeXBlLiBUeXBlIGlzIG5vdCBhIHN1YmNsYXNzIG9mIFZhbHVlLiBTb21lIHZhbHVlcyBjYW4KKy8vLyBoYXZlIGEgbmFtZSBhbmQgdGhleSBiZWxvbmcgdG8gc29tZSBNb2R1bGUuICBTZXR0aW5nIHRoZSBuYW1lIG9uIHRoZSBWYWx1ZQorLy8vIGF1dG9tYXRpY2FsbHkgdXBkYXRlcyB0aGUgbW9kdWxlJ3Mgc3ltYm9sIHRhYmxlLgorLy8vCisvLy8gRXZlcnkgdmFsdWUgaGFzIGEgInVzZSBsaXN0IiB0aGF0IGtlZXBzIHRyYWNrIG9mIHdoaWNoIG90aGVyIFZhbHVlcyBhcmUKKy8vLyB1c2luZyB0aGlzIFZhbHVlLiAgQSBWYWx1ZSBjYW4gYWxzbyBoYXZlIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgVmFsdWVIYW5kbGUKKy8vLyBvYmplY3RzIHRoYXQgd2F0Y2ggaXQgYW5kIGxpc3RlbiB0byBSQVVXIGFuZCBEZXN0cm95IGV2ZW50cy4gIFNlZQorLy8vIGxsdm0vSVIvVmFsdWVIYW5kbGUuaCBmb3IgZGV0YWlscy4KK2NsYXNzIFZhbHVlIHsKKyAgLy8gVGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCBvZiB0aGUgZmlyc3Qgd29yZCBvZiBWYWx1ZSAqbXVzdCogYmUgemVybzoKKyAgLy8gICBodHRwOi8vd3d3Lmxsdm0ub3JnL2RvY3MvUHJvZ3JhbW1lcnNNYW51YWwuaHRtbCN0aGUtd2F5bWFya2luZy1hbGdvcml0aG0KKyAgVHlwZSAqVlR5OworICBVc2UgKlVzZUxpc3Q7CisKKyAgZnJpZW5kIGNsYXNzIFZhbHVlQXNNZXRhZGF0YTsgLy8gQWxsb3cgYWNjZXNzIHRvIElzVXNlZEJ5TUQuCisgIGZyaWVuZCBjbGFzcyBWYWx1ZUhhbmRsZUJhc2U7CisKKyAgY29uc3QgdW5zaWduZWQgY2hhciBTdWJjbGFzc0lEOyAgIC8vIFN1YmNsYXNzIGlkZW50aWZpZXIgKGZvciBpc2EvZHluX2Nhc3QpCisgIHVuc2lnbmVkIGNoYXIgSGFzVmFsdWVIYW5kbGUgOiAxOyAvLyBIYXMgYSBWYWx1ZUhhbmRsZSBwb2ludGluZyB0byB0aGlzPworCitwcm90ZWN0ZWQ6CisgIC8vLyBcYnJpZWYgSG9sZCBzdWJjbGFzcyBkYXRhIHRoYXQgY2FuIGJlIGRyb3BwZWQuCisgIC8vLworICAvLy8gVGhpcyBtZW1iZXIgaXMgc2ltaWxhciB0byBTdWJjbGFzc0RhdGEsIGhvd2V2ZXIgaXQgaXMgZm9yIGhvbGRpbmcKKyAgLy8vIGluZm9ybWF0aW9uIHdoaWNoIG1heSBiZSB1c2VkIHRvIGFpZCBvcHRpbWl6YXRpb24sIGJ1dCB3aGljaCBtYXkgYmUKKyAgLy8vIGNsZWFyZWQgdG8gemVybyB3aXRob3V0IGFmZmVjdGluZyBjb25zZXJ2YXRpdmUgaW50ZXJwcmV0YXRpb24uCisgIHVuc2lnbmVkIGNoYXIgU3ViY2xhc3NPcHRpb25hbERhdGEgOiA3OworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIEhvbGQgYXJiaXRyYXJ5IHN1YmNsYXNzIGRhdGEuCisgIC8vLworICAvLy8gVGhpcyBtZW1iZXIgaXMgZGVmaW5lZCBieSB0aGlzIGNsYXNzLCBidXQgaXMgbm90IHVzZWQgZm9yIGFueXRoaW5nLgorICAvLy8gU3ViY2xhc3NlcyBjYW4gdXNlIGl0IHRvIGhvbGQgd2hhdGV2ZXIgc3RhdGUgdGhleSBmaW5kIHVzZWZ1bC4gIFRoaXMKKyAgLy8vIGZpZWxkIGlzIGluaXRpYWxpemVkIHRvIHplcm8gYnkgdGhlIGN0b3IuCisgIHVuc2lnbmVkIHNob3J0IFN1YmNsYXNzRGF0YTsKKworcHJvdGVjdGVkOgorICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgaW4gdGhlIHN1YmNsYXNzLgorICAvLy8KKyAgLy8vIFRoaXMgbWVtYmVyIGlzIGRlZmluZWQgYnkgdGhpcyBjbGFzcywgYnV0IG5vdCB1c2VkIGZvciBhbnl0aGluZy4KKyAgLy8vIFN1YmNsYXNzZXMgY2FuIHVzZSBpdCB0byBzdG9yZSB0aGVpciBudW1iZXIgb2Ygb3BlcmFuZHMsIGlmIHRoZXkgaGF2ZQorICAvLy8gYW55LgorICAvLy8KKyAgLy8vIFRoaXMgaXMgc3RvcmVkIGhlcmUgdG8gc2F2ZSBzcGFjZSBpbiBVc2VyIG9uIDY0LWJpdCBob3N0cy4gIFNpbmNlIG1vc3QKKyAgLy8vIGluc3RhbmNlcyBvZiBWYWx1ZSBoYXZlIG9wZXJhbmRzLCAzMi1iaXQgaG9zdHMgYXJlbid0IHNpZ25pZmljYW50bHkKKyAgLy8vIGFmZmVjdGVkLgorICAvLy8KKyAgLy8vIE5vdGUsIHRoaXMgc2hvdWxkICpOT1QqIGJlIHVzZWQgZGlyZWN0bHkgYnkgYW55IGNsYXNzIG90aGVyIHRoYW4gVXNlci4KKyAgLy8vIFVzZXIgdXNlcyB0aGlzIHZhbHVlIHRvIGZpbmQgdGhlIFVzZSBsaXN0LgorICBlbnVtIDogdW5zaWduZWQgeyBOdW1Vc2VyT3BlcmFuZHNCaXRzID0gMjggfTsKKyAgdW5zaWduZWQgTnVtVXNlck9wZXJhbmRzIDogTnVtVXNlck9wZXJhbmRzQml0czsKKworICAvLyBVc2UgdGhlIHNhbWUgdHlwZSBhcyB0aGUgYml0ZmllbGQgYWJvdmUgc28gdGhhdCBNU1ZDIHdpbGwgcGFjayB0aGVtLgorICB1bnNpZ25lZCBJc1VzZWRCeU1EIDogMTsKKyAgdW5zaWduZWQgSGFzTmFtZSA6IDE7CisgIHVuc2lnbmVkIEhhc0h1bmdPZmZVc2VzIDogMTsKKyAgdW5zaWduZWQgSGFzRGVzY3JpcHRvciA6IDE7CisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVc2VUPiAvLyBVc2VUID09ICdVc2UnIG9yICdjb25zdCBVc2UnCisgIGNsYXNzIHVzZV9pdGVyYXRvcl9pbXBsCisgICAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIFVzZVQgKj4geworICAgIGZyaWVuZCBjbGFzcyBWYWx1ZTsKKworICAgIFVzZVQgKlU7CisKKyAgICBleHBsaWNpdCB1c2VfaXRlcmF0b3JfaW1wbChVc2VUICp1KSA6IFUodSkge30KKworICBwdWJsaWM6CisgICAgdXNlX2l0ZXJhdG9yX2ltcGwoKSA6IFUoKSB7fQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHVzZV9pdGVyYXRvcl9pbXBsICZ4KSBjb25zdCB7IHJldHVybiBVID09IHguVTsgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCB1c2VfaXRlcmF0b3JfaW1wbCAmeCkgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0oeCk7IH0KKworICAgIHVzZV9pdGVyYXRvcl9pbXBsICZvcGVyYXRvcisrKCkgeyAvLyBQcmVpbmNyZW1lbnQKKyAgICAgIGFzc2VydChVICYmICJDYW5ub3QgaW5jcmVtZW50IGVuZCBpdGVyYXRvciEiKTsKKyAgICAgIFUgPSBVLT5nZXROZXh0KCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdXNlX2l0ZXJhdG9yX2ltcGwgb3BlcmF0b3IrKyhpbnQpIHsgLy8gUG9zdGluY3JlbWVudAorICAgICAgYXV0byB0bXAgPSAqdGhpczsKKyAgICAgICsrKnRoaXM7CisgICAgICByZXR1cm4gdG1wOworICAgIH0KKworICAgIFVzZVQgJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgIGFzc2VydChVICYmICJDYW5ub3QgZGVyZWZlcmVuY2UgZW5kIGl0ZXJhdG9yISIpOworICAgICAgcmV0dXJuICpVOworICAgIH0KKworICAgIFVzZVQgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmb3BlcmF0b3IqKCk7IH0KKworICAgIG9wZXJhdG9yIHVzZV9pdGVyYXRvcl9pbXBsPGNvbnN0IFVzZVQ+KCkgY29uc3QgeworICAgICAgcmV0dXJuIHVzZV9pdGVyYXRvcl9pbXBsPGNvbnN0IFVzZVQ+KFUpOworICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVXNlclR5PiAvLyBVc2VyVHkgPT0gJ1VzZXInIG9yICdjb25zdCBVc2VyJworICBjbGFzcyB1c2VyX2l0ZXJhdG9yX2ltcGwKKyAgICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgVXNlclR5ICo+IHsKKyAgICB1c2VfaXRlcmF0b3JfaW1wbDxVc2U+IFVJOworICAgIGV4cGxpY2l0IHVzZXJfaXRlcmF0b3JfaW1wbChVc2UgKlUpIDogVUkoVSkge30KKyAgICBmcmllbmQgY2xhc3MgVmFsdWU7CisKKyAgcHVibGljOgorICAgIHVzZXJfaXRlcmF0b3JfaW1wbCgpID0gZGVmYXVsdDsKKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCB1c2VyX2l0ZXJhdG9yX2ltcGwgJngpIGNvbnN0IHsgcmV0dXJuIFVJID09IHguVUk7IH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgdXNlcl9pdGVyYXRvcl9pbXBsICZ4KSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3I9PSh4KTsgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpdGVyYXRvciBpcyBlcXVhbCB0byB1c2VyX2VuZCgpIG9uIHRoZSB2YWx1ZS4KKyAgICBib29sIGF0RW5kKCkgY29uc3QgeyByZXR1cm4gKnRoaXMgPT0gdXNlcl9pdGVyYXRvcl9pbXBsKCk7IH0KKworICAgIHVzZXJfaXRlcmF0b3JfaW1wbCAmb3BlcmF0b3IrKygpIHsgLy8gUHJlaW5jcmVtZW50CisgICAgICArK1VJOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHVzZXJfaXRlcmF0b3JfaW1wbCBvcGVyYXRvcisrKGludCkgeyAvLyBQb3N0aW5jcmVtZW50CisgICAgICBhdXRvIHRtcCA9ICp0aGlzOworICAgICAgKysqdGhpczsKKyAgICAgIHJldHVybiB0bXA7CisgICAgfQorCisgICAgLy8gUmV0cmlldmUgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IFVzZXIuCisgICAgVXNlclR5ICpvcGVyYXRvciooKSBjb25zdCB7CisgICAgICByZXR1cm4gVUktPmdldFVzZXIoKTsKKyAgICB9CisKKyAgICBVc2VyVHkgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBvcGVyYXRvciooKTsgfQorCisgICAgb3BlcmF0b3IgdXNlcl9pdGVyYXRvcl9pbXBsPGNvbnN0IFVzZXJUeT4oKSBjb25zdCB7CisgICAgICByZXR1cm4gdXNlcl9pdGVyYXRvcl9pbXBsPGNvbnN0IFVzZXJUeT4oKlVJKTsKKyAgICB9CisKKyAgICBVc2UgJmdldFVzZSgpIGNvbnN0IHsgcmV0dXJuICpVSTsgfQorICB9OworCitwcm90ZWN0ZWQ6CisgIFZhbHVlKFR5cGUgKlR5LCB1bnNpZ25lZCBzY2lkKTsKKworICAvLy8gVmFsdWUncyBkZXN0cnVjdG9yIHNob3VsZCBiZSB2aXJ0dWFsIGJ5IGRlc2lnbiwgYnV0IHRoYXQgd291bGQgcmVxdWlyZQorICAvLy8gdGhhdCBWYWx1ZSBhbmQgYWxsIG9mIGl0cyBzdWJjbGFzc2VzIGhhdmUgYSB2dGFibGUgdGhhdCBlZmZlY3RpdmVseQorICAvLy8gZHVwbGljYXRlcyB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHZhbHVlIElELiBBcyBhIHNpemUgb3B0aW1pemF0aW9uLCB0aGUKKyAgLy8vIGRlc3RydWN0b3IgaGFzIGJlZW4gcHJvdGVjdGVkLCBhbmQgdGhlIGNhbGxlciBzaG91bGQgbWFudWFsbHkgY2FsbAorICAvLy8gZGVsZXRlVmFsdWUuCisgIH5WYWx1ZSgpOyAvLyBVc2UgZGVsZXRlVmFsdWUoKSB0byBkZWxldGUgYSBnZW5lcmljIFZhbHVlLgorCitwdWJsaWM6CisgIFZhbHVlKGNvbnN0IFZhbHVlICYpID0gZGVsZXRlOworICBWYWx1ZSAmb3BlcmF0b3I9KGNvbnN0IFZhbHVlICYpID0gZGVsZXRlOworCisgIC8vLyBEZWxldGUgYSBwb2ludGVyIHRvIGEgZ2VuZXJpYyBWYWx1ZS4KKyAgdm9pZCBkZWxldGVWYWx1ZSgpOworCisgIC8vLyBcYnJpZWYgU3VwcG9ydCBmb3IgZGVidWdnaW5nLCBjYWxsYWJsZSBpbiBHREI6IFYtPmR1bXAoKQorICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEltcGxlbWVudCBvcGVyYXRvcjw8IG9uIFZhbHVlLgorICAvLy8gQHsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTywgYm9vbCBJc0ZvckRlYnVnID0gZmFsc2UpIGNvbnN0OworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPLCBNb2R1bGVTbG90VHJhY2tlciAmTVNULAorICAgICAgICAgICAgIGJvb2wgSXNGb3JEZWJ1ZyA9IGZhbHNlKSBjb25zdDsKKyAgLy8vIEB9CisKKyAgLy8vIFxicmllZiBQcmludCB0aGUgbmFtZSBvZiB0aGlzIFZhbHVlIG91dCB0byB0aGUgc3BlY2lmaWVkIHJhd19vc3RyZWFtLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IGp1c3Qgd2FudCB0byBwcmludCAnaW50ICVyZWcxMjYnLCBub3QgdGhlCisgIC8vLyBpbnN0cnVjdGlvbiB0aGF0IGdlbmVyYXRlZCBpdC4gSWYgeW91IHNwZWNpZnkgYSBNb2R1bGUgZm9yIGNvbnRleHQsIHRoZW4KKyAgLy8vIGV2ZW4gY29uc3RhbnN0IGdldCBwcmV0dHktcHJpbnRlZDsgZm9yIGV4YW1wbGUsIHRoZSB0eXBlIG9mIGEgbnVsbAorICAvLy8gcG9pbnRlciBpcyBwcmludGVkIHN5bWJvbGljYWxseS4KKyAgLy8vIEB7CisgIHZvaWQgcHJpbnRBc09wZXJhbmQocmF3X29zdHJlYW0gJk8sIGJvb2wgUHJpbnRUeXBlID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKk0gPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBwcmludEFzT3BlcmFuZChyYXdfb3N0cmVhbSAmTywgYm9vbCBQcmludFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlU2xvdFRyYWNrZXIgJk1TVCkgY29uc3Q7CisgIC8vLyBAfQorCisgIC8vLyBcYnJpZWYgQWxsIHZhbHVlcyBhcmUgdHlwZWQsIGdldCB0aGUgdHlwZSBvZiB0aGlzIHZhbHVlLgorICBUeXBlICpnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVlR5OyB9CisKKyAgLy8vIFxicmllZiBBbGwgdmFsdWVzIGhvbGQgYSBjb250ZXh0IHRocm91Z2ggdGhlaXIgdHlwZS4KKyAgTExWTUNvbnRleHQgJmdldENvbnRleHQoKSBjb25zdDsKKworICAvLyBcYnJpZWYgQWxsIHZhbHVlcyBjYW4gcG90ZW50aWFsbHkgYmUgbmFtZWQuCisgIGJvb2wgaGFzTmFtZSgpIGNvbnN0IHsgcmV0dXJuIEhhc05hbWU7IH0KKyAgVmFsdWVOYW1lICpnZXRWYWx1ZU5hbWUoKSBjb25zdDsKKyAgdm9pZCBzZXRWYWx1ZU5hbWUoVmFsdWVOYW1lICpWTik7CisKK3ByaXZhdGU6CisgIHZvaWQgZGVzdHJveVZhbHVlTmFtZSgpOworICB2b2lkIGRvUkFVVyhWYWx1ZSAqTmV3LCBib29sIE5vTWV0YWRhdGEpOworICB2b2lkIHNldE5hbWVJbXBsKGNvbnN0IFR3aW5lICZOYW1lKTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIFJldHVybiBhIGNvbnN0YW50IHJlZmVyZW5jZSB0byB0aGUgdmFsdWUncyBuYW1lLgorICAvLy8KKyAgLy8vIFRoaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gdGhlIHNhbWUgcmVmZXJlbmNlIGFzIGxvbmcgYXMgdGhlIHZhbHVlIGlzIG5vdAorICAvLy8gbW9kaWZpZWQuICBJZiB0aGUgdmFsdWUgaGFzIGEgbmFtZSwgdGhpcyBkb2VzIGEgaGFzaHRhYmxlIGxvb2t1cCwgc28gaXQncworICAvLy8gbm90IGZyZWUuCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHZhbHVlLgorICAvLy8KKyAgLy8vIENob29zZSBhIG5ldyB1bmlxdWUgbmFtZSBpZiB0aGUgcHJvdmlkZWQgbmFtZSBpcyB0YWtlbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gTmFtZSBUaGUgbmV3IG5hbWU7IG9yICIiIGlmIHRoZSB2YWx1ZSdzIG5hbWUgc2hvdWxkIGJlIHJlbW92ZWQuCisgIHZvaWQgc2V0TmFtZShjb25zdCBUd2luZSAmTmFtZSk7CisKKyAgLy8vIFxicmllZiBUcmFuc2ZlciB0aGUgbmFtZSBmcm9tIFYgdG8gdGhpcyB2YWx1ZS4KKyAgLy8vCisgIC8vLyBBZnRlciB0YWtpbmcgVidzIG5hbWUsIHNldHMgVidzIG5hbWUgdG8gZW1wdHkuCisgIC8vLworICAvLy8gXG5vdGUgSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCBWLT50YWtlTmFtZShWKS4KKyAgdm9pZCB0YWtlTmFtZShWYWx1ZSAqVik7CisKKyAgLy8vIFxicmllZiBDaGFuZ2UgYWxsIHVzZXMgb2YgdGhpcyB0byBwb2ludCB0byBhIG5ldyBWYWx1ZS4KKyAgLy8vCisgIC8vLyBHbyB0aHJvdWdoIHRoZSB1c2VzIGxpc3QgZm9yIHRoaXMgZGVmaW5pdGlvbiBhbmQgbWFrZSBlYWNoIHVzZSBwb2ludCB0bworICAvLy8gIlYiIGluc3RlYWQgb2YgInRoaXMiLiAgQWZ0ZXIgdGhpcyBjb21wbGV0ZXMsICd0aGlzJ3MgdXNlIGxpc3QgaXMKKyAgLy8vIGd1YXJhbnRlZWQgdG8gYmUgZW1wdHkuCisgIHZvaWQgcmVwbGFjZUFsbFVzZXNXaXRoKFZhbHVlICpWKTsKKworICAvLy8gXGJyaWVmIENoYW5nZSBub24tbWV0YWRhdGEgdXNlcyBvZiB0aGlzIHRvIHBvaW50IHRvIGEgbmV3IFZhbHVlLgorICAvLy8KKyAgLy8vIEdvIHRocm91Z2ggdGhlIHVzZXMgbGlzdCBmb3IgdGhpcyBkZWZpbml0aW9uIGFuZCBtYWtlIGVhY2ggdXNlIHBvaW50IHRvCisgIC8vLyAiViIgaW5zdGVhZCBvZiAidGhpcyIuIFRoaXMgZnVuY3Rpb24gc2tpcHMgbWV0YWRhdGEgZW50cmllcyBpbiB0aGUgbGlzdC4KKyAgdm9pZCByZXBsYWNlTm9uTWV0YWRhdGFVc2VzV2l0aChWYWx1ZSAqVik7CisKKyAgLy8vIHJlcGxhY2VVc2VzT3V0c2lkZUJsb2NrIC0gR28gdGhyb3VnaCB0aGUgdXNlcyBsaXN0IGZvciB0aGlzIGRlZmluaXRpb24gYW5kCisgIC8vLyBtYWtlIGVhY2ggdXNlIHBvaW50IHRvICJWIiBpbnN0ZWFkIG9mICJ0aGlzIiB3aGVuIHRoZSB1c2UgaXMgb3V0c2lkZSB0aGUKKyAgLy8vIGJsb2NrLiAnVGhpcydzIHVzZSBsaXN0IGlzIGV4cGVjdGVkIHRvIGhhdmUgYXQgbGVhc3Qgb25lIGVsZW1lbnQuCisgIC8vLyBVbmxpa2UgcmVwbGFjZUFsbFVzZXNXaXRoIHRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCBiYXNpYyBibG9jaworICAvLy8gdmFsdWVzIG9yIGNvbnN0YW50IHVzZXJzLgorICB2b2lkIHJlcGxhY2VVc2VzT3V0c2lkZUJsb2NrKFZhbHVlICpWLCBCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIHJlcGxhY2VVc2VzRXhjZXB0QmxvY2tBZGRyIC0gR28gdGhyb3VnaCB0aGUgdXNlcyBsaXN0IGZvciB0aGlzIGRlZmluaXRpb24KKyAgLy8vIGFuZCBtYWtlIGVhY2ggdXNlIHBvaW50IHRvICJWIiBpbnN0ZWFkIG9mICJ0aGlzIiB3aGVuIHRoZSB1c2UgaXMgb3V0c2lkZQorICAvLy8gdGhlIGJsb2NrLiAnVGhpcydzIHVzZSBsaXN0IGlzIGV4cGVjdGVkIHRvIGhhdmUgYXQgbGVhc3Qgb25lIGVsZW1lbnQuCisgIC8vLyBVbmxpa2UgcmVwbGFjZUFsbFVzZXNXaXRoIHRoaXMgZnVuY3Rpb24gc2tpcHMgYmxvY2thZGRyIHVzZXMuCisgIHZvaWQgcmVwbGFjZVVzZXNFeGNlcHRCbG9ja0FkZHIoVmFsdWUgKk5ldyk7CisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIE1ldGhvZHMgZm9yIGhhbmRsaW5nIHRoZSBjaGFpbiBvZiB1c2VzIG9mIHRoaXMgVmFsdWUuCisgIC8vCisgIC8vIE1hdGVyaWFsaXppbmcgYSBmdW5jdGlvbiBjYW4gaW50cm9kdWNlIG5ldyB1c2VzLCBzbyB0aGVzZSBtZXRob2RzIGNvbWUgaW4KKyAgLy8gdHdvIHZhcmlhbnRzOgorICAvLyBUaGUgbWV0aG9kcyB0aGF0IHN0YXJ0IHdpdGggbWF0ZXJpYWxpemVkXyBjaGVjayB0aGUgdXNlcyB0aGF0IGFyZQorICAvLyBjdXJyZW50bHkga25vd24gZ2l2ZW4gd2hpY2ggZnVuY3Rpb25zIGFyZSBtYXRlcmlhbGl6ZWQuIEJlIHZlcnkgY2FyZWZ1bAorICAvLyB3aGVuIHVzaW5nIHRoZW0gc2luY2UgeW91IG1pZ2h0IG5vdCBnZXQgYWxsIHVzZXMuCisgIC8vIFRoZSBtZXRob2RzIHRoYXQgZG9uJ3Qgc3RhcnQgd2l0aCBtYXRlcmlhbGl6ZWRfIGFzc2VydCB0aGF0IG1vZHVsZXMgaXMKKyAgLy8gZnVsbHkgbWF0ZXJpYWxpemVkLgorICB2b2lkIGFzc2VydE1vZHVsZUlzTWF0ZXJpYWxpemVkSW1wbCgpIGNvbnN0OworICAvLyBUaGlzIGluZGlyZWN0aW9uIGV4aXN0cyBzbyB3ZSBjYW4ga2VlcCBhc3NlcnRNb2R1bGVJc01hdGVyaWFsaXplZEltcGwoKQorICAvLyBhcm91bmQgaW4gcmVsZWFzZSBidWlsZHMgb2YgVmFsdWUuY3BwIHRvIGJlIGxpbmtlZCB3aXRoIG90aGVyIGNvZGUgYnVpbHQKKyAgLy8gaW4gZGVidWcgbW9kZS4gQnV0IHRoaXMgYXZvaWRzIGNhbGxpbmcgaXQgaW4gYW55IG9mIHRoZSByZWxlYXNlIGJ1aWx0IGNvZGUuCisgIHZvaWQgYXNzZXJ0TW9kdWxlSXNNYXRlcmlhbGl6ZWQoKSBjb25zdCB7CisjaWZuZGVmIE5ERUJVRworICAgIGFzc2VydE1vZHVsZUlzTWF0ZXJpYWxpemVkSW1wbCgpOworI2VuZGlmCisgIH0KKworICBib29sIHVzZV9lbXB0eSgpIGNvbnN0IHsKKyAgICBhc3NlcnRNb2R1bGVJc01hdGVyaWFsaXplZCgpOworICAgIHJldHVybiBVc2VMaXN0ID09IG51bGxwdHI7CisgIH0KKworICBib29sIG1hdGVyaWFsaXplZF91c2VfZW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIFVzZUxpc3QgPT0gbnVsbHB0cjsKKyAgfQorCisgIHVzaW5nIHVzZV9pdGVyYXRvciA9IHVzZV9pdGVyYXRvcl9pbXBsPFVzZT47CisgIHVzaW5nIGNvbnN0X3VzZV9pdGVyYXRvciA9IHVzZV9pdGVyYXRvcl9pbXBsPGNvbnN0IFVzZT47CisKKyAgdXNlX2l0ZXJhdG9yIG1hdGVyaWFsaXplZF91c2VfYmVnaW4oKSB7IHJldHVybiB1c2VfaXRlcmF0b3IoVXNlTGlzdCk7IH0KKyAgY29uc3RfdXNlX2l0ZXJhdG9yIG1hdGVyaWFsaXplZF91c2VfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3VzZV9pdGVyYXRvcihVc2VMaXN0KTsKKyAgfQorICB1c2VfaXRlcmF0b3IgdXNlX2JlZ2luKCkgeworICAgIGFzc2VydE1vZHVsZUlzTWF0ZXJpYWxpemVkKCk7CisgICAgcmV0dXJuIG1hdGVyaWFsaXplZF91c2VfYmVnaW4oKTsKKyAgfQorICBjb25zdF91c2VfaXRlcmF0b3IgdXNlX2JlZ2luKCkgY29uc3QgeworICAgIGFzc2VydE1vZHVsZUlzTWF0ZXJpYWxpemVkKCk7CisgICAgcmV0dXJuIG1hdGVyaWFsaXplZF91c2VfYmVnaW4oKTsKKyAgfQorICB1c2VfaXRlcmF0b3IgdXNlX2VuZCgpIHsgcmV0dXJuIHVzZV9pdGVyYXRvcigpOyB9CisgIGNvbnN0X3VzZV9pdGVyYXRvciB1c2VfZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfdXNlX2l0ZXJhdG9yKCk7IH0KKyAgaXRlcmF0b3JfcmFuZ2U8dXNlX2l0ZXJhdG9yPiBtYXRlcmlhbGl6ZWRfdXNlcygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShtYXRlcmlhbGl6ZWRfdXNlX2JlZ2luKCksIHVzZV9lbmQoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfdXNlX2l0ZXJhdG9yPiBtYXRlcmlhbGl6ZWRfdXNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShtYXRlcmlhbGl6ZWRfdXNlX2JlZ2luKCksIHVzZV9lbmQoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8dXNlX2l0ZXJhdG9yPiB1c2VzKCkgeworICAgIGFzc2VydE1vZHVsZUlzTWF0ZXJpYWxpemVkKCk7CisgICAgcmV0dXJuIG1hdGVyaWFsaXplZF91c2VzKCk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfdXNlX2l0ZXJhdG9yPiB1c2VzKCkgY29uc3QgeworICAgIGFzc2VydE1vZHVsZUlzTWF0ZXJpYWxpemVkKCk7CisgICAgcmV0dXJuIG1hdGVyaWFsaXplZF91c2VzKCk7CisgIH0KKworICBib29sIHVzZXJfZW1wdHkoKSBjb25zdCB7CisgICAgYXNzZXJ0TW9kdWxlSXNNYXRlcmlhbGl6ZWQoKTsKKyAgICByZXR1cm4gVXNlTGlzdCA9PSBudWxscHRyOworICB9CisKKyAgdXNpbmcgdXNlcl9pdGVyYXRvciA9IHVzZXJfaXRlcmF0b3JfaW1wbDxVc2VyPjsKKyAgdXNpbmcgY29uc3RfdXNlcl9pdGVyYXRvciA9IHVzZXJfaXRlcmF0b3JfaW1wbDxjb25zdCBVc2VyPjsKKworICB1c2VyX2l0ZXJhdG9yIG1hdGVyaWFsaXplZF91c2VyX2JlZ2luKCkgeyByZXR1cm4gdXNlcl9pdGVyYXRvcihVc2VMaXN0KTsgfQorICBjb25zdF91c2VyX2l0ZXJhdG9yIG1hdGVyaWFsaXplZF91c2VyX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF91c2VyX2l0ZXJhdG9yKFVzZUxpc3QpOworICB9CisgIHVzZXJfaXRlcmF0b3IgdXNlcl9iZWdpbigpIHsKKyAgICBhc3NlcnRNb2R1bGVJc01hdGVyaWFsaXplZCgpOworICAgIHJldHVybiBtYXRlcmlhbGl6ZWRfdXNlcl9iZWdpbigpOworICB9CisgIGNvbnN0X3VzZXJfaXRlcmF0b3IgdXNlcl9iZWdpbigpIGNvbnN0IHsKKyAgICBhc3NlcnRNb2R1bGVJc01hdGVyaWFsaXplZCgpOworICAgIHJldHVybiBtYXRlcmlhbGl6ZWRfdXNlcl9iZWdpbigpOworICB9CisgIHVzZXJfaXRlcmF0b3IgdXNlcl9lbmQoKSB7IHJldHVybiB1c2VyX2l0ZXJhdG9yKCk7IH0KKyAgY29uc3RfdXNlcl9pdGVyYXRvciB1c2VyX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3VzZXJfaXRlcmF0b3IoKTsgfQorICBVc2VyICp1c2VyX2JhY2soKSB7CisgICAgYXNzZXJ0TW9kdWxlSXNNYXRlcmlhbGl6ZWQoKTsKKyAgICByZXR1cm4gKm1hdGVyaWFsaXplZF91c2VyX2JlZ2luKCk7CisgIH0KKyAgY29uc3QgVXNlciAqdXNlcl9iYWNrKCkgY29uc3QgeworICAgIGFzc2VydE1vZHVsZUlzTWF0ZXJpYWxpemVkKCk7CisgICAgcmV0dXJuICptYXRlcmlhbGl6ZWRfdXNlcl9iZWdpbigpOworICB9CisgIGl0ZXJhdG9yX3JhbmdlPHVzZXJfaXRlcmF0b3I+IG1hdGVyaWFsaXplZF91c2VycygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShtYXRlcmlhbGl6ZWRfdXNlcl9iZWdpbigpLCB1c2VyX2VuZCgpKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxjb25zdF91c2VyX2l0ZXJhdG9yPiBtYXRlcmlhbGl6ZWRfdXNlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UobWF0ZXJpYWxpemVkX3VzZXJfYmVnaW4oKSwgdXNlcl9lbmQoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8dXNlcl9pdGVyYXRvcj4gdXNlcnMoKSB7CisgICAgYXNzZXJ0TW9kdWxlSXNNYXRlcmlhbGl6ZWQoKTsKKyAgICByZXR1cm4gbWF0ZXJpYWxpemVkX3VzZXJzKCk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfdXNlcl9pdGVyYXRvcj4gdXNlcnMoKSBjb25zdCB7CisgICAgYXNzZXJ0TW9kdWxlSXNNYXRlcmlhbGl6ZWQoKTsKKyAgICByZXR1cm4gbWF0ZXJpYWxpemVkX3VzZXJzKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGV4YWN0bHkgb25lIHVzZXIgb2YgdGhpcyB2YWx1ZS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHNwZWNpYWxpemVkIGJlY2F1c2UgaXQgaXMgYSBjb21tb24gcmVxdWVzdCBhbmQgZG9lcyBub3QgcmVxdWlyZQorICAvLy8gdHJhdmVyc2luZyB0aGUgd2hvbGUgdXNlIGxpc3QuCisgIGJvb2wgaGFzT25lVXNlKCkgY29uc3QgeworICAgIGNvbnN0X3VzZV9pdGVyYXRvciBJID0gdXNlX2JlZ2luKCksIEUgPSB1c2VfZW5kKCk7CisgICAgaWYgKEkgPT0gRSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiArK0kgPT0gRTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBWYWx1ZSBoYXMgZXhhY3RseSBOIHVzZXJzLgorICBib29sIGhhc05Vc2VzKHVuc2lnbmVkIE4pIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyB2YWx1ZSBoYXMgTiB1c2VycyBvciBtb3JlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgbG9naWNhbGx5IGVxdWl2YWxlbnQgdG8gZ2V0TnVtVXNlcygpID49IE4uCisgIGJvb2wgaGFzTlVzZXNPck1vcmUodW5zaWduZWQgTikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiB0aGlzIHZhbHVlIGlzIHVzZWQgaW4gdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jay4KKyAgYm9vbCBpc1VzZWRJbkJhc2ljQmxvY2soY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2QgY29tcHV0ZXMgdGhlIG51bWJlciBvZiB1c2VzIG9mIHRoaXMgVmFsdWUuCisgIC8vLworICAvLy8gVGhpcyBpcyBhIGxpbmVhciB0aW1lIG9wZXJhdGlvbi4gIFVzZSBoYXNPbmVVc2UsIGhhc05Vc2VzLCBvcgorICAvLy8gaGFzTlVzZXNPck1vcmUgdG8gY2hlY2sgZm9yIHNwZWNpZmljIHZhbHVlcy4KKyAgdW5zaWduZWQgZ2V0TnVtVXNlcygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSB0aGUgVXNlIGNsYXNzLgorICB2b2lkIGFkZFVzZShVc2UgJlUpIHsgVS5hZGRUb0xpc3QoJlVzZUxpc3QpOyB9CisKKyAgLy8vIFxicmllZiBDb25jcmV0ZSBzdWJjbGFzcyBvZiB0aGlzLgorICAvLy8KKyAgLy8vIEFuIGVudW1lcmF0aW9uIGZvciBrZWVwaW5nIHRyYWNrIG9mIHRoZSBjb25jcmV0ZSBzdWJjbGFzcyBvZiBWYWx1ZSB0aGF0CisgIC8vLyBpcyBhY3R1YWxseSBpbnN0YW50aWF0ZWQuIFZhbHVlcyBvZiB0aGlzIGVudW1lcmF0aW9uIGFyZSBrZXB0IGluIHRoZQorICAvLy8gVmFsdWUgY2xhc3NlcyBTdWJjbGFzc0lEIGZpZWxkLiBUaGV5IGFyZSB1c2VkIGZvciBjb25jcmV0ZSB0eXBlCisgIC8vLyBpZGVudGlmaWNhdGlvbi4KKyAgZW51bSBWYWx1ZVR5IHsKKyNkZWZpbmUgSEFORExFX1ZBTFVFKE5hbWUpIE5hbWUjI1ZhbCwKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmRlZiIKKworICAgIC8vIE1hcmtlcnM6CisjZGVmaW5lIEhBTkRMRV9DT05TVEFOVF9NQVJLRVIoTWFya2VyLCBDb25zdGFudCkgTWFya2VyID0gQ29uc3RhbnQjI1ZhbCwKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmRlZiIKKyAgfTsKKworICAvLy8gXGJyaWVmIFJldHVybiBhbiBJRCBmb3IgdGhlIGNvbmNyZXRlIHR5cGUgb2YgdGhpcyBvYmplY3QuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgY2xhc3NvZiBjaGVja3MuICBUaGlzIHNob3VsZCBub3QgYmUgdXNlZAorICAvLy8gZm9yIGFueSBvdGhlciBwdXJwb3NlLCBhcyB0aGUgdmFsdWVzIG1heSBjaGFuZ2UgYXMgTExWTSBldm9sdmVzLiAgQWxzbywKKyAgLy8vIG5vdGUgdGhhdCBmb3IgaW5zdHJ1Y3Rpb25zLCB0aGUgSW5zdHJ1Y3Rpb24ncyBvcGNvZGUgaXMgYWRkZWQgdG8KKyAgLy8vIEluc3RydWN0aW9uVmFsLiBTbyB0aGlzIG1lYW5zIHRocmVlIHRoaW5nczoKKyAgLy8vICMgdGhlcmUgaXMgbm8gdmFsdWUgd2l0aCBjb2RlIEluc3RydWN0aW9uVmFsIChubyBvcGNvZGU9PTApLgorICAvLy8gIyB0aGVyZSBhcmUgbW9yZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSB2YWx1ZSB0eXBlIHRoYW4gaW4gVmFsdWVUeSBlbnVtLgorICAvLy8gIyB0aGUgSW5zdHJ1Y3Rpb25WYWwgZW51bWVyYXRvciBtdXN0IGJlIHRoZSBoaWdoZXN0IHZhbHVlZCBlbnVtZXJhdG9yIGluCisgIC8vLyAgIHRoZSBWYWx1ZVR5IGVudW0uCisgIHVuc2lnbmVkIGdldFZhbHVlSUQoKSBjb25zdCB7CisgICAgcmV0dXJuIFN1YmNsYXNzSUQ7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgcmF3IG9wdGlvbmFsIGZsYWdzIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGlzIHZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHRlc3RpbmcgdHdvIFZhbHVlcyBmb3IgZXF1aXZhbGVuY2UuCisgIHVuc2lnbmVkIGdldFJhd1N1YmNsYXNzT3B0aW9uYWxEYXRhKCkgY29uc3QgeworICAgIHJldHVybiBTdWJjbGFzc09wdGlvbmFsRGF0YTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2xlYXIgdGhlIG9wdGlvbmFsIGZsYWdzIGNvbnRhaW5lZCBpbiB0aGlzIHZhbHVlLgorICB2b2lkIGNsZWFyU3ViY2xhc3NPcHRpb25hbERhdGEoKSB7CisgICAgU3ViY2xhc3NPcHRpb25hbERhdGEgPSAwOworICB9CisKKyAgLy8vIFxicmllZiBDaGVjayB0aGUgb3B0aW9uYWwgZmxhZ3MgZm9yIGVxdWFsaXR5LgorICBib29sIGhhc1NhbWVTdWJjbGFzc09wdGlvbmFsRGF0YShjb25zdCBWYWx1ZSAqVikgY29uc3QgeworICAgIHJldHVybiBTdWJjbGFzc09wdGlvbmFsRGF0YSA9PSBWLT5TdWJjbGFzc09wdGlvbmFsRGF0YTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSB2YWx1ZSBoYW5kbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmFsdWUuCisgIGJvb2wgaGFzVmFsdWVIYW5kbGUoKSBjb25zdCB7IHJldHVybiBIYXNWYWx1ZUhhbmRsZTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgbWV0YWRhdGEgcmVmZXJlbmNpbmcgdGhpcyB2YWx1ZS4KKyAgYm9vbCBpc1VzZWRCeU1ldGFkYXRhKCkgY29uc3QgeyByZXR1cm4gSXNVc2VkQnlNRDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyB2YWx1ZSBpcyBhIHN3aWZ0ZXJyb3IgdmFsdWUuCisgIC8vLworICAvLy8gc3dpZnRlcnJvciB2YWx1ZXMgY2FuIGJlIGVpdGhlciBhIGZ1bmN0aW9uIGFyZ3VtZW50IG9yIGFuIGFsbG9jYSB3aXRoIGEKKyAgLy8vIHN3aWZ0ZXJyb3IgYXR0cmlidXRlLgorICBib29sIGlzU3dpZnRFcnJvcigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU3RyaXAgb2ZmIHBvaW50ZXIgY2FzdHMsIGFsbC16ZXJvIEdFUHMsIGFuZCBhbGlhc2VzLgorICAvLy8KKyAgLy8vIFJldHVybnMgdGhlIG9yaWdpbmFsIHVuY2FzdGVkIHZhbHVlLiAgSWYgdGhpcyBpcyBjYWxsZWQgb24gYSBub24tcG9pbnRlcgorICAvLy8gdmFsdWUsIGl0IHJldHVybnMgJ3RoaXMnLgorICBjb25zdCBWYWx1ZSAqc3RyaXBQb2ludGVyQ2FzdHMoKSBjb25zdDsKKyAgVmFsdWUgKnN0cmlwUG9pbnRlckNhc3RzKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PFZhbHVlICo+KAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IFZhbHVlICo+KHRoaXMpLT5zdHJpcFBvaW50ZXJDYXN0cygpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU3RyaXAgb2ZmIHBvaW50ZXIgY2FzdHMsIGFsbC16ZXJvIEdFUHMsIGFsaWFzZXMgYW5kIGJhcnJpZXJzLgorICAvLy8KKyAgLy8vIFJldHVybnMgdGhlIG9yaWdpbmFsIHVuY2FzdGVkIHZhbHVlLiAgSWYgdGhpcyBpcyBjYWxsZWQgb24gYSBub24tcG9pbnRlcgorICAvLy8gdmFsdWUsIGl0IHJldHVybnMgJ3RoaXMnLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIG9ubHkgaW4KKyAgLy8vIEFsaWFzIGFuYWx5c2lzLgorICBjb25zdCBWYWx1ZSAqc3RyaXBQb2ludGVyQ2FzdHNBbmRCYXJyaWVycygpIGNvbnN0OworICBWYWx1ZSAqc3RyaXBQb2ludGVyQ2FzdHNBbmRCYXJyaWVycygpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSAqPigKKyAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVmFsdWUgKj4odGhpcyktPnN0cmlwUG9pbnRlckNhc3RzQW5kQmFycmllcnMoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFN0cmlwIG9mZiBwb2ludGVyIGNhc3RzIGFuZCBhbGwtemVybyBHRVBzLgorICAvLy8KKyAgLy8vIFJldHVybnMgdGhlIG9yaWdpbmFsIHVuY2FzdGVkIHZhbHVlLiAgSWYgdGhpcyBpcyBjYWxsZWQgb24gYSBub24tcG9pbnRlcgorICAvLy8gdmFsdWUsIGl0IHJldHVybnMgJ3RoaXMnLgorICBjb25zdCBWYWx1ZSAqc3RyaXBQb2ludGVyQ2FzdHNOb0ZvbGxvd0FsaWFzZXMoKSBjb25zdDsKKyAgVmFsdWUgKnN0cmlwUG9pbnRlckNhc3RzTm9Gb2xsb3dBbGlhc2VzKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PFZhbHVlICo+KAorICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IFZhbHVlICo+KHRoaXMpLT5zdHJpcFBvaW50ZXJDYXN0c05vRm9sbG93QWxpYXNlcygpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU3RyaXAgb2ZmIHBvaW50ZXIgY2FzdHMgYW5kIGFsbC1jb25zdGFudCBpbmJvdW5kcyBHRVBzLgorICAvLy8KKyAgLy8vIFJldHVybnMgdGhlIG9yaWdpbmFsIHBvaW50ZXIgdmFsdWUuICBJZiB0aGlzIGlzIGNhbGxlZCBvbiBhIG5vbi1wb2ludGVyCisgIC8vLyB2YWx1ZSwgaXQgcmV0dXJucyAndGhpcycuCisgIGNvbnN0IFZhbHVlICpzdHJpcEluQm91bmRzQ29uc3RhbnRPZmZzZXRzKCkgY29uc3Q7CisgIFZhbHVlICpzdHJpcEluQm91bmRzQ29uc3RhbnRPZmZzZXRzKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PFZhbHVlICo+KAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBWYWx1ZSAqPih0aGlzKS0+c3RyaXBJbkJvdW5kc0NvbnN0YW50T2Zmc2V0cygpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWNjdW11bGF0ZSBvZmZzZXRzIGZyb20gXGEgc3RyaXBJbkJvdW5kc0NvbnN0YW50T2Zmc2V0cygpLgorICAvLy8KKyAgLy8vIFN0b3JlcyB0aGUgcmVzdWx0aW5nIGNvbnN0YW50IG9mZnNldCBzdHJpcHBlZCBpbnRvIHRoZSBBUEludCBwcm92aWRlZC4KKyAgLy8vIFRoZSBwcm92aWRlZCBBUEludCB3aWxsIGJlIGV4dGVuZGVkIG9yIHRydW5jYXRlZCBhcyBuZWVkZWQgdG8gYmUgdGhlCisgIC8vLyBjb3JyZWN0IGJpdHdpZHRoIGZvciBhbiBvZmZzZXQgb2YgdGhpcyBwb2ludGVyIHR5cGUuCisgIC8vLworICAvLy8gSWYgdGhpcyBpcyBjYWxsZWQgb24gYSBub24tcG9pbnRlciB2YWx1ZSwgaXQgcmV0dXJucyAndGhpcycuCisgIGNvbnN0IFZhbHVlICpzdHJpcEFuZEFjY3VtdWxhdGVJbkJvdW5kc0NvbnN0YW50T2Zmc2V0cyhjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZPZmZzZXQpIGNvbnN0OworICBWYWx1ZSAqc3RyaXBBbmRBY2N1bXVsYXRlSW5Cb3VuZHNDb25zdGFudE9mZnNldHMoY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludCAmT2Zmc2V0KSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUgKj4oc3RhdGljX2Nhc3Q8Y29uc3QgVmFsdWUgKj4odGhpcykKKyAgICAgICAgLT5zdHJpcEFuZEFjY3VtdWxhdGVJbkJvdW5kc0NvbnN0YW50T2Zmc2V0cyhETCwgT2Zmc2V0KSk7CisgIH0KKworICAvLy8gXGJyaWVmIFN0cmlwIG9mZiBwb2ludGVyIGNhc3RzIGFuZCBpbmJvdW5kcyBHRVBzLgorICAvLy8KKyAgLy8vIFJldHVybnMgdGhlIG9yaWdpbmFsIHBvaW50ZXIgdmFsdWUuICBJZiB0aGlzIGlzIGNhbGxlZCBvbiBhIG5vbi1wb2ludGVyCisgIC8vLyB2YWx1ZSwgaXQgcmV0dXJucyAndGhpcycuCisgIGNvbnN0IFZhbHVlICpzdHJpcEluQm91bmRzT2Zmc2V0cygpIGNvbnN0OworICBWYWx1ZSAqc3RyaXBJbkJvdW5kc09mZnNldHMoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUgKj4oCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVmFsdWUgKj4odGhpcyktPnN0cmlwSW5Cb3VuZHNPZmZzZXRzKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMga25vd24gdG8gYmUgZGVyZWZlcmVuY2VhYmxlIGZvciB0aGUKKyAgLy8vIHBvaW50ZXIgdmFsdWUuCisgIC8vLworICAvLy8gSWYgQ2FuQmVOdWxsIGlzIHNldCBieSB0aGlzIGZ1bmN0aW9uIHRoZSBwb2ludGVyIGNhbiBlaXRoZXIgYmUgbnVsbCBvciBiZQorICAvLy8gZGVyZWZlcmVuY2VhYmxlIHVwIHRvIHRoZSByZXR1cm5lZCBudW1iZXIgb2YgYnl0ZXMuCisgIHVpbnQ2NF90IGdldFBvaW50ZXJEZXJlZmVyZW5jZWFibGVCeXRlcyhjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkNhbkJlTnVsbCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGFuIGFsaWdubWVudCBvZiB0aGUgcG9pbnRlciB2YWx1ZS4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIGFuIGFsaWdubWVudCB3aGljaCBpcyBlaXRoZXIgc3BlY2lmaWVkIGV4cGxpY2l0bHksIGUuZy4gdmlhCisgIC8vLyBhbGlnbiBhdHRyaWJ1dGUgb2YgYSBmdW5jdGlvbiBhcmd1bWVudCwgb3IgZ3VhcmFudGVlZCBieSBEYXRhTGF5b3V0LgorICB1bnNpZ25lZCBnZXRQb2ludGVyQWxpZ25tZW50KGNvbnN0IERhdGFMYXlvdXQgJkRMKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFRyYW5zbGF0ZSBQSEkgbm9kZSB0byBpdHMgcHJlZGVjZXNzb3IgZnJvbSB0aGUgZ2l2ZW4gYmFzaWMgYmxvY2suCisgIC8vLworICAvLy8gSWYgdGhpcyB2YWx1ZSBpcyBhIFBISSBub2RlIHdpdGggQ3VyQkIgYXMgaXRzIHBhcmVudCwgcmV0dXJuIHRoZSB2YWx1ZSBpbgorICAvLy8gdGhlIFBISSBub2RlIGNvcnJlc3BvbmRpbmcgdG8gUHJlZEJCLiAgSWYgbm90LCByZXR1cm4gb3Vyc2VsZi4gIFRoaXMgaXMKKyAgLy8vIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBrbm93IHRoZSB2YWx1ZSBzb21ldGhpbmcgaGFzIGluIGEgcHJlZGVjZXNzb3IKKyAgLy8vIGJsb2NrLgorICBjb25zdCBWYWx1ZSAqRG9QSElUcmFuc2xhdGlvbihjb25zdCBCYXNpY0Jsb2NrICpDdXJCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmFzaWNCbG9jayAqUHJlZEJCKSBjb25zdDsKKyAgVmFsdWUgKkRvUEhJVHJhbnNsYXRpb24oY29uc3QgQmFzaWNCbG9jayAqQ3VyQkIsIGNvbnN0IEJhc2ljQmxvY2sgKlByZWRCQikgeworICAgIHJldHVybiBjb25zdF9jYXN0PFZhbHVlICo+KAorICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IFZhbHVlICo+KHRoaXMpLT5Eb1BISVRyYW5zbGF0aW9uKEN1ckJCLCBQcmVkQkIpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGhlIG1heGltdW0gYWxpZ25tZW50IGZvciBpbnN0cnVjdGlvbnMuCisgIC8vLworICAvLy8gVGhpcyBpcyB0aGUgZ3JlYXRlc3QgYWxpZ25tZW50IHZhbHVlIHN1cHBvcnRlZCBieSBsb2FkLCBzdG9yZSwgYW5kIGFsbG9jYQorICAvLy8gaW5zdHJ1Y3Rpb25zLCBhbmQgZ2xvYmFsIHZhbHVlcy4KKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE1heEFsaWdubWVudEV4cG9uZW50ID0gMjk7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBNYXhpbXVtQWxpZ25tZW50ID0gMXUgPDwgTWF4QWxpZ25tZW50RXhwb25lbnQ7CisKKyAgLy8vIFxicmllZiBNdXRhdGUgdGhlIHR5cGUgb2YgdGhpcyBWYWx1ZSB0byBiZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgaXMgYW4gZXh0cmVtZWx5IGRhbmdlcm91cyBvcGVyYXRpb24gd2hpY2ggY2FuIGNyZWF0ZQorICAvLy8gY29tcGxldGVseSBpbnZhbGlkIElSIHZlcnkgZWFzaWx5LiAgSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdGhhdCB5b3UKKyAgLy8vIHJlY3JlYXRlIElSIG9iamVjdHMgd2l0aCB0aGUgcmlnaHQgdHlwZXMgaW5zdGVhZCBvZiBtdXRhdGluZyB0aGVtIGluCisgIC8vLyBwbGFjZS4KKyAgdm9pZCBtdXRhdGVUeXBlKFR5cGUgKlR5KSB7CisgICAgVlR5ID0gVHk7CisgIH0KKworICAvLy8gXGJyaWVmIFNvcnQgdGhlIHVzZS1saXN0LgorICAvLy8KKyAgLy8vIFNvcnRzIHRoZSBWYWx1ZSdzIHVzZS1saXN0IGJ5IENtcCB1c2luZyBhIHN0YWJsZSBtZXJnZXNvcnQuICBDbXAgaXMKKyAgLy8vIGV4cGVjdGVkIHRvIGNvbXBhcmUgdHdvIFxhIFVzZSByZWZlcmVuY2VzLgorICB0ZW1wbGF0ZSA8Y2xhc3MgQ29tcGFyZT4gdm9pZCBzb3J0VXNlTGlzdChDb21wYXJlIENtcCk7CisKKyAgLy8vIFxicmllZiBSZXZlcnNlIHRoZSB1c2UtbGlzdC4KKyAgdm9pZCByZXZlcnNlVXNlTGlzdCgpOworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIE1lcmdlIHR3byBsaXN0cyB0b2dldGhlci4KKyAgLy8vCisgIC8vLyBNZXJnZXMgXGMgTCBhbmQgXGMgUiB1c2luZyBcYyBDbXAuICBUbyBlbmFibGUgc3RhYmxlIHNvcnRzLCBhbHdheXMgcHVzaGVzCisgIC8vLyAiZXF1YWwiIGl0ZW1zIGZyb20gTCBiZWZvcmUgaXRlbXMgZnJvbSBSLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGxpc3QuCisgIC8vLworICAvLy8gXG5vdGUgQ29tcGxldGVseSBpZ25vcmVzIFxhIFVzZTo6UHJldiAoZG9lc24ndCByZWFkLCBkb2Vzbid0IHVwZGF0ZSkuCisgIHRlbXBsYXRlIDxjbGFzcyBDb21wYXJlPgorICBzdGF0aWMgVXNlICptZXJnZVVzZUxpc3RzKFVzZSAqTCwgVXNlICpSLCBDb21wYXJlIENtcCkgeworICAgIFVzZSAqTWVyZ2VkOworICAgIFVzZSAqKk5leHQgPSAmTWVyZ2VkOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmICghTCkgeworICAgICAgICAqTmV4dCA9IFI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKCFSKSB7CisgICAgICAgICpOZXh0ID0gTDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoQ21wKCpSLCAqTCkpIHsKKyAgICAgICAgKk5leHQgPSBSOworICAgICAgICBOZXh0ID0gJlItPk5leHQ7CisgICAgICAgIFIgPSBSLT5OZXh0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKk5leHQgPSBMOworICAgICAgICBOZXh0ID0gJkwtPk5leHQ7CisgICAgICAgIEwgPSBMLT5OZXh0OworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBNZXJnZWQ7CisgIH0KKworcHJvdGVjdGVkOgorICB1bnNpZ25lZCBzaG9ydCBnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKSBjb25zdCB7IHJldHVybiBTdWJjbGFzc0RhdGE7IH0KKyAgdm9pZCBzZXRWYWx1ZVN1YmNsYXNzRGF0YSh1bnNpZ25lZCBzaG9ydCBEKSB7IFN1YmNsYXNzRGF0YSA9IEQ7IH0KK307CisKK3N0cnVjdCBWYWx1ZURlbGV0ZXIgeyB2b2lkIG9wZXJhdG9yKCkoVmFsdWUgKlYpIHsgVi0+ZGVsZXRlVmFsdWUoKTsgfSB9OworCisvLy8gVXNlIHRoaXMgaW5zdGVhZCBvZiBzdGQ6OnVuaXF1ZV9wdHI8VmFsdWU+IG9yIHN0ZDo6dW5pcXVlX3B0cjxJbnN0cnVjdGlvbj4uCisvLy8gVGhvc2UgZG9uJ3Qgd29yayBiZWNhdXNlIFZhbHVlIGFuZCBJbnN0cnVjdGlvbidzIGRlc3RydWN0b3JzIGFyZSBwcm90ZWN0ZWQsCisvLy8gYXJlbid0IHZpcnR1YWwsIGFuZCB3b24ndCBkZXN0cm95IHRoZSBjb21wbGV0ZSBvYmplY3QuCit1c2luZyB1bmlxdWVfdmFsdWUgPSBzdGQ6OnVuaXF1ZV9wdHI8VmFsdWUsIFZhbHVlRGVsZXRlcj47CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFZhbHVlICZWKSB7CisgIFYucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK3ZvaWQgVXNlOjpzZXQoVmFsdWUgKlYpIHsKKyAgaWYgKFZhbCkgcmVtb3ZlRnJvbUxpc3QoKTsKKyAgVmFsID0gVjsKKyAgaWYgKFYpIFYtPmFkZFVzZSgqdGhpcyk7Cit9CisKK1ZhbHVlICpVc2U6Om9wZXJhdG9yPShWYWx1ZSAqUkhTKSB7CisgIHNldChSSFMpOworICByZXR1cm4gUkhTOworfQorCitjb25zdCBVc2UgJlVzZTo6b3BlcmF0b3I9KGNvbnN0IFVzZSAmUkhTKSB7CisgIHNldChSSFMuVmFsKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ29tcGFyZT4gdm9pZCBWYWx1ZTo6c29ydFVzZUxpc3QoQ29tcGFyZSBDbXApIHsKKyAgaWYgKCFVc2VMaXN0IHx8ICFVc2VMaXN0LT5OZXh0KQorICAgIC8vIE5vIG5lZWQgdG8gc29ydCAwIG9yIDEgdXNlcy4KKyAgICByZXR1cm47CisKKyAgLy8gTm90ZTogdGhpcyBmdW5jdGlvbiBjb21wbGV0ZWx5IGlnbm9yZXMgUHJldiBwb2ludGVycyB1bnRpbCB0aGUgZW5kIHdoZW4KKyAgLy8gdGhleSdyZSBmaXhlZCBlbiBtYXNzZS4KKworICAvLyBDcmVhdGUgYSBiaW5vbWlhbCB2ZWN0b3Igb2Ygc29ydGVkIGxpc3RzLCB2aXNpdGluZyB1c2VzIG9uZSBhdCBhIHRpbWUgYW5kCisgIC8vIG1lcmdpbmcgbGlzdHMgYXMgbmVjZXNzYXJ5LgorICBjb25zdCB1bnNpZ25lZCBNYXhTbG90cyA9IDMyOworICBVc2UgKlNsb3RzW01heFNsb3RzXTsKKworICAvLyBDb2xsZWN0IHRoZSBmaXJzdCB1c2UsIHR1cm5pbmcgaXQgaW50byBhIHNpbmdsZS1pdGVtIGxpc3QuCisgIFVzZSAqTmV4dCA9IFVzZUxpc3QtPk5leHQ7CisgIFVzZUxpc3QtPk5leHQgPSBudWxscHRyOworICB1bnNpZ25lZCBOdW1TbG90cyA9IDE7CisgIFNsb3RzWzBdID0gVXNlTGlzdDsKKworICAvLyBDb2xsZWN0IGFsbCBidXQgdGhlIGxhc3QgdXNlLgorICB3aGlsZSAoTmV4dC0+TmV4dCkgeworICAgIFVzZSAqQ3VycmVudCA9IE5leHQ7CisgICAgTmV4dCA9IEN1cnJlbnQtPk5leHQ7CisKKyAgICAvLyBUdXJuIEN1cnJlbnQgaW50byBhIHNpbmdsZS1pdGVtIGxpc3QuCisgICAgQ3VycmVudC0+TmV4dCA9IG51bGxwdHI7CisKKyAgICAvLyBTYXZlIEN1cnJlbnQgaW4gdGhlIGZpcnN0IGF2YWlsYWJsZSBzbG90LCBtZXJnaW5nIG9uIGNvbGxpc2lvbnMuCisgICAgdW5zaWduZWQgSTsKKyAgICBmb3IgKEkgPSAwOyBJIDwgTnVtU2xvdHM7ICsrSSkgeworICAgICAgaWYgKCFTbG90c1tJXSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8vIE1lcmdlIHR3byBsaXN0cywgZG91YmxpbmcgdGhlIHNpemUgb2YgQ3VycmVudCBhbmQgZW1wdHlpbmcgc2xvdCBJLgorICAgICAgLy8KKyAgICAgIC8vIFNpbmNlIHRoZSB1c2VzIGluIFNsb3RzW0ldIG9yaWdpbmFsbHkgcHJlY2VkZWQgdGhvc2UgaW4gQ3VycmVudCwgc2VuZAorICAgICAgLy8gU2xvdHNbSV0gaW4gYXMgdGhlIGxlZnQgcGFyYW1ldGVyIHRvIG1haW50YWluIGEgc3RhYmxlIHNvcnQuCisgICAgICBDdXJyZW50ID0gbWVyZ2VVc2VMaXN0cyhTbG90c1tJXSwgQ3VycmVudCwgQ21wKTsKKyAgICAgIFNsb3RzW0ldID0gbnVsbHB0cjsKKyAgICB9CisgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIG5ldyBzbG90LgorICAgIGlmIChJID09IE51bVNsb3RzKSB7CisgICAgICArK051bVNsb3RzOworICAgICAgYXNzZXJ0KE51bVNsb3RzIDw9IE1heFNsb3RzICYmICJVc2UgbGlzdCBiaWdnZXIgdGhhbiAyXjMyIik7CisgICAgfQorCisgICAgLy8gRm91bmQgYW4gb3BlbiBzbG90LgorICAgIFNsb3RzW0ldID0gQ3VycmVudDsKKyAgfQorCisgIC8vIE1lcmdlIGFsbCB0aGUgbGlzdHMgdG9nZXRoZXIuCisgIGFzc2VydChOZXh0ICYmICJFeHBlY3RlZCBvbmUgbW9yZSBVc2UiKTsKKyAgYXNzZXJ0KCFOZXh0LT5OZXh0ICYmICJFeHBlY3RlZCBvbmx5IG9uZSBVc2UiKTsKKyAgVXNlTGlzdCA9IE5leHQ7CisgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgPCBOdW1TbG90czsgKytJKQorICAgIGlmIChTbG90c1tJXSkKKyAgICAgIC8vIFNpbmNlIHRoZSB1c2VzIGluIFNsb3RzW0ldIG9yaWdpbmFsbHkgcHJlY2VkZWQgdGhvc2UgaW4gVXNlTGlzdCwgc2VuZAorICAgICAgLy8gU2xvdHNbSV0gaW4gYXMgdGhlIGxlZnQgcGFyYW1ldGVyIHRvIG1haW50YWluIGEgc3RhYmxlIHNvcnQuCisgICAgICBVc2VMaXN0ID0gbWVyZ2VVc2VMaXN0cyhTbG90c1tJXSwgVXNlTGlzdCwgQ21wKTsKKworICAvLyBGaXggdGhlIFByZXYgcG9pbnRlcnMuCisgIGZvciAoVXNlICpJID0gVXNlTGlzdCwgKipQcmV2ID0gJlVzZUxpc3Q7IEk7IEkgPSBJLT5OZXh0KSB7CisgICAgSS0+c2V0UHJldihQcmV2KTsKKyAgICBQcmV2ID0gJkktPk5leHQ7CisgIH0KK30KKworLy8gaXNhIC0gUHJvdmlkZSBzb21lIHNwZWNpYWxpemF0aW9ucyBvZiBpc2Egc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGluY2x1ZGUKKy8vIHRoZSBzdWJ0eXBlIGhlYWRlciBmaWxlcyB0byB0ZXN0IHRvIHNlZSBpZiB0aGUgdmFsdWUgaXMgYSBzdWJjbGFzcy4uLgorLy8KK3RlbXBsYXRlIDw+IHN0cnVjdCBpc2FfaW1wbDxDb25zdGFudCwgVmFsdWU+IHsKKyAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3QgVmFsdWUgJlZhbCkgeworICAgIHN0YXRpY19hc3NlcnQoVmFsdWU6OkNvbnN0YW50Rmlyc3RWYWwgPT0gMCwgIlZhbC5nZXRWYWx1ZUlEKCkgPj0gVmFsdWU6OkNvbnN0YW50Rmlyc3RWYWwiKTsKKyAgICByZXR1cm4gVmFsLmdldFZhbHVlSUQoKSA8PSBWYWx1ZTo6Q29uc3RhbnRMYXN0VmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8Q29uc3RhbnREYXRhLCBWYWx1ZT4geworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXRWYWx1ZUlEKCkgPj0gVmFsdWU6OkNvbnN0YW50RGF0YUZpcnN0VmFsICYmCisgICAgICAgICAgIFZhbC5nZXRWYWx1ZUlEKCkgPD0gVmFsdWU6OkNvbnN0YW50RGF0YUxhc3RWYWw7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc2FfaW1wbDxDb25zdGFudEFnZ3JlZ2F0ZSwgVmFsdWU+IHsKKyAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3QgVmFsdWUgJlZhbCkgeworICAgIHJldHVybiBWYWwuZ2V0VmFsdWVJRCgpID49IFZhbHVlOjpDb25zdGFudEFnZ3JlZ2F0ZUZpcnN0VmFsICYmCisgICAgICAgICAgIFZhbC5nZXRWYWx1ZUlEKCkgPD0gVmFsdWU6OkNvbnN0YW50QWdncmVnYXRlTGFzdFZhbDsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzYV9pbXBsPEFyZ3VtZW50LCBWYWx1ZT4geworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdCAoY29uc3QgVmFsdWUgJlZhbCkgeworICAgIHJldHVybiBWYWwuZ2V0VmFsdWVJRCgpID09IFZhbHVlOjpBcmd1bWVudFZhbDsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzYV9pbXBsPElubGluZUFzbSwgVmFsdWU+IHsKKyAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3QgVmFsdWUgJlZhbCkgeworICAgIHJldHVybiBWYWwuZ2V0VmFsdWVJRCgpID09IFZhbHVlOjpJbmxpbmVBc21WYWw7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc2FfaW1wbDxJbnN0cnVjdGlvbiwgVmFsdWU+IHsKKyAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3QgVmFsdWUgJlZhbCkgeworICAgIHJldHVybiBWYWwuZ2V0VmFsdWVJRCgpID49IFZhbHVlOjpJbnN0cnVjdGlvblZhbDsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzYV9pbXBsPEJhc2ljQmxvY2ssIFZhbHVlPiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IFZhbHVlICZWYWwpIHsKKyAgICByZXR1cm4gVmFsLmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6QmFzaWNCbG9ja1ZhbDsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzYV9pbXBsPEZ1bmN0aW9uLCBWYWx1ZT4geworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6OkZ1bmN0aW9uVmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8R2xvYmFsVmFyaWFibGUsIFZhbHVlPiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IFZhbHVlICZWYWwpIHsKKyAgICByZXR1cm4gVmFsLmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6R2xvYmFsVmFyaWFibGVWYWw7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc2FfaW1wbDxHbG9iYWxBbGlhcywgVmFsdWU+IHsKKyAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3QgVmFsdWUgJlZhbCkgeworICAgIHJldHVybiBWYWwuZ2V0VmFsdWVJRCgpID09IFZhbHVlOjpHbG9iYWxBbGlhc1ZhbDsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzYV9pbXBsPEdsb2JhbElGdW5jLCBWYWx1ZT4geworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6Okdsb2JhbElGdW5jVmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8R2xvYmFsSW5kaXJlY3RTeW1ib2wsIFZhbHVlPiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IFZhbHVlICZWYWwpIHsKKyAgICByZXR1cm4gaXNhPEdsb2JhbEFsaWFzPihWYWwpIHx8IGlzYTxHbG9iYWxJRnVuYz4oVmFsKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzYV9pbXBsPEdsb2JhbFZhbHVlLCBWYWx1ZT4geworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuIGlzYTxHbG9iYWxPYmplY3Q+KFZhbCkgfHwgaXNhPEdsb2JhbEluZGlyZWN0U3ltYm9sPihWYWwpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8R2xvYmFsT2JqZWN0LCBWYWx1ZT4geworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuIGlzYTxHbG9iYWxWYXJpYWJsZT4oVmFsKSB8fCBpc2E8RnVuY3Rpb24+KFZhbCk7CisgIH0KK307CisKKy8vIENyZWF0ZSB3cmFwcGVycyBmb3IgQyBCaW5kaW5nIHR5cGVzIChzZWUgQ0JpbmRpbmdXcmFwcGluZy5oKS4KK0RFRklORV9JU0FfQ09OVkVSU0lPTl9GVU5DVElPTlMoVmFsdWUsIExMVk1WYWx1ZVJlZikKKworLy8gU3BlY2lhbGl6ZWQgb3BhcXVlIHZhbHVlIGNvbnZlcnNpb25zLgoraW5saW5lIFZhbHVlICoqdW53cmFwKExMVk1WYWx1ZVJlZiAqVmFscykgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxWYWx1ZSoqPihWYWxzKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2lubGluZSBUICoqdW53cmFwKExMVk1WYWx1ZVJlZiAqVmFscywgdW5zaWduZWQgTGVuZ3RoKSB7CisjaWZuZGVmIE5ERUJVRworICBmb3IgKExMVk1WYWx1ZVJlZiAqSSA9IFZhbHMsICpFID0gVmFscyArIExlbmd0aDsgSSAhPSBFOyArK0kpCisgICAgdW53cmFwPFQ+KCpJKTsgLy8gRm9yIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgYXNzZXJ0IG9uIGludmFsaWQgdXNhZ2UuCisjZW5kaWYKKyAgKHZvaWQpTGVuZ3RoOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKio+KFZhbHMpOworfQorCitpbmxpbmUgTExWTVZhbHVlUmVmICp3cmFwKGNvbnN0IFZhbHVlICoqVmFscykgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxMTFZNVmFsdWVSZWYqPihjb25zdF9jYXN0PFZhbHVlKio+KFZhbHMpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfVkFMVUVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9WYWx1ZUhhbmRsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9WYWx1ZUhhbmRsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NWNjN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1ZhbHVlSGFuZGxlLmgKQEAgLTAsMCArMSw1NjIgQEAKKy8vPT09LSBWYWx1ZUhhbmRsZS5oIC0gVmFsdWUgU21hcnQgUG9pbnRlciBjbGFzc2VzIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBWYWx1ZUhhbmRsZSBjbGFzcyBhbmQgaXRzIHN1Yi1jbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9WQUxVRUhBTkRMRV9ICisjZGVmaW5lIExMVk1fSVJfVkFMVUVIQU5ETEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgVGhpcyBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3Mgb2YgdmFsdWUgaGFuZGxlcy4KKy8vLworLy8vIFZhbHVlSGFuZGxlJ3MgYXJlIHNtYXJ0IHBvaW50ZXJzIHRvIFZhbHVlJ3MgdGhhdCBoYXZlIHNwZWNpYWwgYmVoYXZpb3Igd2hlbgorLy8vIHRoZSB2YWx1ZSBpcyBkZWxldGVkIG9yIFJlcGxhY2VBbGxVc2VzV2l0aCdkLiAgU2VlIHRoZSBzcGVjaWZpYyBoYW5kbGVzCisvLy8gYmVsb3cgZm9yIGRldGFpbHMuCitjbGFzcyBWYWx1ZUhhbmRsZUJhc2UgeworICBmcmllbmQgY2xhc3MgVmFsdWU7CisKK3Byb3RlY3RlZDoKKyAgLy8vIFxicmllZiBUaGlzIGluZGljYXRlcyB3aGF0IHN1YiBjbGFzcyB0aGUgaGFuZGxlIGFjdHVhbGx5IGlzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdG8gYXZvaWQgaGF2aW5nIGEgdnRhYmxlIGZvciB0aGUgbGlnaHQtd2VpZ2h0IGhhbmRsZSBwb2ludGVycy4gVGhlCisgIC8vLyBmdWxseSBnZW5lcmFsIENhbGxiYWNrIHZlcnNpb24gZG9lcyBoYXZlIGEgdnRhYmxlLgorICBlbnVtIEhhbmRsZUJhc2VLaW5kIHsgQXNzZXJ0LCBDYWxsYmFjaywgV2VhaywgV2Vha1RyYWNraW5nIH07CisKKyAgVmFsdWVIYW5kbGVCYXNlKGNvbnN0IFZhbHVlSGFuZGxlQmFzZSAmUkhTKQorICAgICAgOiBWYWx1ZUhhbmRsZUJhc2UoUkhTLlByZXZQYWlyLmdldEludCgpLCBSSFMpIHt9CisKKyAgVmFsdWVIYW5kbGVCYXNlKEhhbmRsZUJhc2VLaW5kIEtpbmQsIGNvbnN0IFZhbHVlSGFuZGxlQmFzZSAmUkhTKQorICAgICAgOiBQcmV2UGFpcihudWxscHRyLCBLaW5kKSwgVmFsKFJIUy5nZXRWYWxQdHIoKSkgeworICAgIGlmIChpc1ZhbGlkKGdldFZhbFB0cigpKSkKKyAgICAgIEFkZFRvRXhpc3RpbmdVc2VMaXN0KFJIUy5nZXRQcmV2UHRyKCkpOworICB9CisKK3ByaXZhdGU6CisgIFBvaW50ZXJJbnRQYWlyPFZhbHVlSGFuZGxlQmFzZSoqLCAyLCBIYW5kbGVCYXNlS2luZD4gUHJldlBhaXI7CisgIFZhbHVlSGFuZGxlQmFzZSAqTmV4dCA9IG51bGxwdHI7CisgIFZhbHVlICpWYWwgPSBudWxscHRyOworCisgIHZvaWQgc2V0VmFsUHRyKFZhbHVlICpWKSB7IFZhbCA9IFY7IH0KKworcHVibGljOgorICBleHBsaWNpdCBWYWx1ZUhhbmRsZUJhc2UoSGFuZGxlQmFzZUtpbmQgS2luZCkKKyAgICAgIDogUHJldlBhaXIobnVsbHB0ciwgS2luZCkge30KKyAgVmFsdWVIYW5kbGVCYXNlKEhhbmRsZUJhc2VLaW5kIEtpbmQsIFZhbHVlICpWKQorICAgICAgOiBQcmV2UGFpcihudWxscHRyLCBLaW5kKSwgVmFsKFYpIHsKKyAgICBpZiAoaXNWYWxpZChnZXRWYWxQdHIoKSkpCisgICAgICBBZGRUb1VzZUxpc3QoKTsKKyAgfQorCisgIH5WYWx1ZUhhbmRsZUJhc2UoKSB7CisgICAgaWYgKGlzVmFsaWQoZ2V0VmFsUHRyKCkpKQorICAgICAgUmVtb3ZlRnJvbVVzZUxpc3QoKTsKKyAgfQorCisgIFZhbHVlICpvcGVyYXRvcj0oVmFsdWUgKlJIUykgeworICAgIGlmIChnZXRWYWxQdHIoKSA9PSBSSFMpCisgICAgICByZXR1cm4gUkhTOworICAgIGlmIChpc1ZhbGlkKGdldFZhbFB0cigpKSkKKyAgICAgIFJlbW92ZUZyb21Vc2VMaXN0KCk7CisgICAgc2V0VmFsUHRyKFJIUyk7CisgICAgaWYgKGlzVmFsaWQoZ2V0VmFsUHRyKCkpKQorICAgICAgQWRkVG9Vc2VMaXN0KCk7CisgICAgcmV0dXJuIFJIUzsKKyAgfQorCisgIFZhbHVlICpvcGVyYXRvcj0oY29uc3QgVmFsdWVIYW5kbGVCYXNlICZSSFMpIHsKKyAgICBpZiAoZ2V0VmFsUHRyKCkgPT0gUkhTLmdldFZhbFB0cigpKQorICAgICAgcmV0dXJuIFJIUy5nZXRWYWxQdHIoKTsKKyAgICBpZiAoaXNWYWxpZChnZXRWYWxQdHIoKSkpCisgICAgICBSZW1vdmVGcm9tVXNlTGlzdCgpOworICAgIHNldFZhbFB0cihSSFMuZ2V0VmFsUHRyKCkpOworICAgIGlmIChpc1ZhbGlkKGdldFZhbFB0cigpKSkKKyAgICAgIEFkZFRvRXhpc3RpbmdVc2VMaXN0KFJIUy5nZXRQcmV2UHRyKCkpOworICAgIHJldHVybiBnZXRWYWxQdHIoKTsKKyAgfQorCisgIFZhbHVlICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gZ2V0VmFsUHRyKCk7IH0KKyAgVmFsdWUgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpnZXRWYWxQdHIoKTsgfQorCitwcm90ZWN0ZWQ6CisgIFZhbHVlICpnZXRWYWxQdHIoKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKworICBzdGF0aWMgYm9vbCBpc1ZhbGlkKFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYgJiYKKyAgICAgICAgICAgViAhPSBEZW5zZU1hcEluZm88VmFsdWUgKj46OmdldEVtcHR5S2V5KCkgJiYKKyAgICAgICAgICAgViAhPSBEZW5zZU1hcEluZm88VmFsdWUgKj46OmdldFRvbWJzdG9uZUtleSgpOworICB9CisKKyAgLy8vIFxicmllZiBSZW1vdmUgdGhpcyBWYWx1ZUhhbmRsZSBmcm9tIGl0cyBjdXJyZW50IHVzZSBsaXN0LgorICB2b2lkIFJlbW92ZUZyb21Vc2VMaXN0KCk7CisKKyAgLy8vIFxicmllZiBDbGVhciB0aGUgdW5kZXJseWluZyBwb2ludGVyIHdpdGhvdXQgY2xlYXJpbmcgdGhlIHVzZSBsaXN0LgorICAvLy8KKyAgLy8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiBhIGRlcml2ZWQgY2xhc3MgaGFzIG1hbnVhbGx5IHJlbW92ZWQgdGhlCisgIC8vLyBoYW5kbGUgZnJvbSB0aGUgdXNlIGxpc3QuCisgIHZvaWQgY2xlYXJWYWxQdHIoKSB7IHNldFZhbFB0cihudWxscHRyKTsgfQorCitwdWJsaWM6CisgIC8vIENhbGxiYWNrcyBtYWRlIGZyb20gVmFsdWUuCisgIHN0YXRpYyB2b2lkIFZhbHVlSXNEZWxldGVkKFZhbHVlICpWKTsKKyAgc3RhdGljIHZvaWQgVmFsdWVJc1JBVVdkKFZhbHVlICpPbGQsIFZhbHVlICpOZXcpOworCitwcml2YXRlOgorICAvLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorICBWYWx1ZUhhbmRsZUJhc2UgKipnZXRQcmV2UHRyKCkgY29uc3QgeyByZXR1cm4gUHJldlBhaXIuZ2V0UG9pbnRlcigpOyB9CisgIEhhbmRsZUJhc2VLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBQcmV2UGFpci5nZXRJbnQoKTsgfQorICB2b2lkIHNldFByZXZQdHIoVmFsdWVIYW5kbGVCYXNlICoqUHRyKSB7IFByZXZQYWlyLnNldFBvaW50ZXIoUHRyKTsgfQorCisgIC8vLyBcYnJpZWYgQWRkIHRoaXMgVmFsdWVIYW5kbGUgdG8gdGhlIHVzZSBsaXN0IGZvciBWLgorICAvLy8KKyAgLy8vIExpc3QgaXMgdGhlIGFkZHJlc3Mgb2YgZWl0aGVyIHRoZSBoZWFkIG9mIHRoZSBsaXN0IG9yIGEgTmV4dCBub2RlIHdpdGhpbgorICAvLy8gdGhlIGV4aXN0aW5nIHVzZSBsaXN0LgorICB2b2lkIEFkZFRvRXhpc3RpbmdVc2VMaXN0KFZhbHVlSGFuZGxlQmFzZSAqKkxpc3QpOworCisgIC8vLyBcYnJpZWYgQWRkIHRoaXMgVmFsdWVIYW5kbGUgdG8gdGhlIHVzZSBsaXN0IGFmdGVyIE5vZGUuCisgIHZvaWQgQWRkVG9FeGlzdGluZ1VzZUxpc3RBZnRlcihWYWx1ZUhhbmRsZUJhc2UgKk5vZGUpOworCisgIC8vLyBcYnJpZWYgQWRkIHRoaXMgVmFsdWVIYW5kbGUgdG8gdGhlIHVzZSBsaXN0IGZvciBWLgorICB2b2lkIEFkZFRvVXNlTGlzdCgpOworfTsKKworLy8vIFxicmllZiBBIG51bGxhYmxlIFZhbHVlIGhhbmRsZSB0aGF0IGlzIG51bGxhYmxlLgorLy8vCisvLy8gVGhpcyBpcyBhIHZhbHVlIGhhbmRsZSB0aGF0IHBvaW50cyB0byBhIHZhbHVlLCBhbmQgbnVsbHMgaXRzZWxmCisvLy8gb3V0IGlmIHRoYXQgdmFsdWUgaXMgZGVsZXRlZC4KK2NsYXNzIFdlYWtWSCA6IHB1YmxpYyBWYWx1ZUhhbmRsZUJhc2UgeworcHVibGljOgorICBXZWFrVkgoKSA6IFZhbHVlSGFuZGxlQmFzZShXZWFrKSB7fQorICBXZWFrVkgoVmFsdWUgKlApIDogVmFsdWVIYW5kbGVCYXNlKFdlYWssIFApIHt9CisgIFdlYWtWSChjb25zdCBXZWFrVkggJlJIUykKKyAgICAgIDogVmFsdWVIYW5kbGVCYXNlKFdlYWssIFJIUykge30KKworICBXZWFrVkggJm9wZXJhdG9yPShjb25zdCBXZWFrVkggJlJIUykgPSBkZWZhdWx0OworCisgIFZhbHVlICpvcGVyYXRvcj0oVmFsdWUgKlJIUykgeworICAgIHJldHVybiBWYWx1ZUhhbmRsZUJhc2U6Om9wZXJhdG9yPShSSFMpOworICB9CisgIFZhbHVlICpvcGVyYXRvcj0oY29uc3QgVmFsdWVIYW5kbGVCYXNlICZSSFMpIHsKKyAgICByZXR1cm4gVmFsdWVIYW5kbGVCYXNlOjpvcGVyYXRvcj0oUkhTKTsKKyAgfQorCisgIG9wZXJhdG9yIFZhbHVlKigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsUHRyKCk7CisgIH0KK307CisKKy8vIFNwZWNpYWxpemUgc2ltcGxpZnlfdHlwZSB0byBhbGxvdyBXZWFrVkggdG8gcGFydGljaXBhdGUgaW4KKy8vIGR5bl9jYXN0LCBpc2EsIGV0Yy4KK3RlbXBsYXRlIDw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPFdlYWtWSD4geworICB1c2luZyBTaW1wbGVUeXBlID0gVmFsdWUgKjsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoV2Vha1ZIICZXVkgpIHsgcmV0dXJuIFdWSDsgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPGNvbnN0IFdlYWtWSD4geworICB1c2luZyBTaW1wbGVUeXBlID0gVmFsdWUgKjsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoY29uc3QgV2Vha1ZIICZXVkgpIHsgcmV0dXJuIFdWSDsgfQorfTsKKworLy8vIFxicmllZiBWYWx1ZSBoYW5kbGUgdGhhdCBpcyBudWxsYWJsZSwgYnV0IHRyaWVzIHRvIHRyYWNrIHRoZSBWYWx1ZS4KKy8vLworLy8vIFRoaXMgaXMgYSB2YWx1ZSBoYW5kbGUgdGhhdCB0cmllcyBoYXJkIHRvIHBvaW50IHRvIGEgVmFsdWUsIGV2ZW4gYWNyb3NzCisvLy8gUkFVVyBvcGVyYXRpb25zLCBidXQgd2lsbCBudWxsIGl0c2VsZiBvdXQgaWYgdGhlIHZhbHVlIGlzIGRlc3Ryb3llZC4gIHRoaXMKKy8vLyBpcyB1c2VmdWwgZm9yIGFkdmlzb3J5IHNvcnRzIG9mIGluZm9ybWF0aW9uLCBidXQgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIHRoZQorLy8vIGtleSBvZiBhIG1hcCAoc2luY2UgdGhlIG1hcCB3b3VsZCBoYXZlIHRvIHJlYXJyYW5nZSBpdHNlbGYgd2hlbiB0aGUgcG9pbnRlcgorLy8vIGNoYW5nZXMpLgorY2xhc3MgV2Vha1RyYWNraW5nVkggOiBwdWJsaWMgVmFsdWVIYW5kbGVCYXNlIHsKK3B1YmxpYzoKKyAgV2Vha1RyYWNraW5nVkgoKSA6IFZhbHVlSGFuZGxlQmFzZShXZWFrVHJhY2tpbmcpIHt9CisgIFdlYWtUcmFja2luZ1ZIKFZhbHVlICpQKSA6IFZhbHVlSGFuZGxlQmFzZShXZWFrVHJhY2tpbmcsIFApIHt9CisgIFdlYWtUcmFja2luZ1ZIKGNvbnN0IFdlYWtUcmFja2luZ1ZIICZSSFMpCisgICAgICA6IFZhbHVlSGFuZGxlQmFzZShXZWFrVHJhY2tpbmcsIFJIUykge30KKworICBXZWFrVHJhY2tpbmdWSCAmb3BlcmF0b3I9KGNvbnN0IFdlYWtUcmFja2luZ1ZIICZSSFMpID0gZGVmYXVsdDsKKworICBWYWx1ZSAqb3BlcmF0b3I9KFZhbHVlICpSSFMpIHsKKyAgICByZXR1cm4gVmFsdWVIYW5kbGVCYXNlOjpvcGVyYXRvcj0oUkhTKTsKKyAgfQorICBWYWx1ZSAqb3BlcmF0b3I9KGNvbnN0IFZhbHVlSGFuZGxlQmFzZSAmUkhTKSB7CisgICAgcmV0dXJuIFZhbHVlSGFuZGxlQmFzZTo6b3BlcmF0b3I9KFJIUyk7CisgIH0KKworICBvcGVyYXRvciBWYWx1ZSooKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFZhbFB0cigpOworICB9CisKKyAgYm9vbCBwb2ludHNUb0FsaXZlVmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlSGFuZGxlQmFzZTo6aXNWYWxpZChnZXRWYWxQdHIoKSk7CisgIH0KK307CisKKy8vIFNwZWNpYWxpemUgc2ltcGxpZnlfdHlwZSB0byBhbGxvdyBXZWFrVHJhY2tpbmdWSCB0byBwYXJ0aWNpcGF0ZSBpbgorLy8gZHluX2Nhc3QsIGlzYSwgZXRjLgordGVtcGxhdGUgPD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8V2Vha1RyYWNraW5nVkg+IHsKKyAgdXNpbmcgU2ltcGxlVHlwZSA9IFZhbHVlICo7CisKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKFdlYWtUcmFja2luZ1ZIICZXVkgpIHsgcmV0dXJuIFdWSDsgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPGNvbnN0IFdlYWtUcmFja2luZ1ZIPiB7CisgIHVzaW5nIFNpbXBsZVR5cGUgPSBWYWx1ZSAqOworCisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShjb25zdCBXZWFrVHJhY2tpbmdWSCAmV1ZIKSB7CisgICAgcmV0dXJuIFdWSDsKKyAgfQorfTsKKworLy8vIFxicmllZiBWYWx1ZSBoYW5kbGUgdGhhdCBhc3NlcnRzIGlmIHRoZSBWYWx1ZSBpcyBkZWxldGVkLgorLy8vCisvLy8gVGhpcyBpcyBhIFZhbHVlIEhhbmRsZSB0aGF0IHBvaW50cyB0byBhIHZhbHVlIGFuZCBhc3NlcnRzIG91dCBpZiB0aGUgdmFsdWUKKy8vLyBpcyBkZXN0cm95ZWQgd2hpbGUgdGhlIGhhbmRsZSBpcyBzdGlsbCBsaXZlLiAgVGhpcyBpcyB2ZXJ5IHVzZWZ1bCBmb3IKKy8vLyBjYXRjaGluZyBkYW5nbGluZyBwb2ludGVyIGJ1Z3MgYW5kIG90aGVyIHRoaW5ncyB3aGljaCBjYW4gYmUgbm9uLW9idmlvdXMuCisvLy8gT25lIHBhcnRpY3VsYXJseSB1c2VmdWwgcGxhY2UgdG8gdXNlIHRoaXMgaXMgYXMgdGhlIEtleSBvZiBhIG1hcC4gIERhbmdsaW5nCisvLy8gcG9pbnRlciBidWdzIG9mdGVuIGxlYWQgdG8gcmVhbGx5IHN1YnRsZSBidWdzIHRoYXQgb25seSBvY2N1ciBpZiBhbm90aGVyCisvLy8gb2JqZWN0IGhhcHBlbnMgdG8gZ2V0IGFsbG9jYXRlZCB0byB0aGUgc2FtZSBhZGRyZXNzIGFzIHRoZSBvbGQgb25lLiAgVXNpbmcKKy8vLyBhbiBBc3NlcnRpbmdWSCBlbnN1cmVzIHRoYXQgYW4gYXNzZXJ0IGlzIHRyaWdnZXJlZCBhcyBzb29uIGFzIHRoZSBiYWQKKy8vLyBkZWxldGUgb2NjdXJzLgorLy8vCisvLy8gTm90ZSB0aGF0IGFuIEFzc2VydGluZ1ZIIGhhbmRsZSBkb2VzICpub3QqIGZvbGxvdyB2YWx1ZXMgYWNyb3NzIFJBVVcKKy8vLyBvcGVyYXRpb25zLiAgVGhpcyBtZWFucyB0aGF0IFJBVVcncyBuZWVkIHRvIGV4cGxpY2l0bHkgdXBkYXRlIHRoZQorLy8vIEFzc2VydGluZ1ZIJ3MgYXMgaXQgbW92ZXMuICBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgaW4gbm9uLWFzc2VydCBtb2RlIHRoaXMKKy8vLyBjbGFzcyB0dXJucyBpbnRvIGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCBhIHBvaW50ZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVUeT4KK2NsYXNzIEFzc2VydGluZ1ZICisjaWZuZGVmIE5ERUJVRworICA6IHB1YmxpYyBWYWx1ZUhhbmRsZUJhc2UKKyNlbmRpZgorICB7CisgIGZyaWVuZCBzdHJ1Y3QgRGVuc2VNYXBJbmZvPEFzc2VydGluZ1ZIPFZhbHVlVHk+PjsKKworI2lmbmRlZiBOREVCVUcKKyAgVmFsdWUgKmdldFJhd1ZhbFB0cigpIGNvbnN0IHsgcmV0dXJuIFZhbHVlSGFuZGxlQmFzZTo6Z2V0VmFsUHRyKCk7IH0KKyAgdm9pZCBzZXRSYXdWYWxQdHIoVmFsdWUgKlApIHsgVmFsdWVIYW5kbGVCYXNlOjpvcGVyYXRvcj0oUCk7IH0KKyNlbHNlCisgIFZhbHVlICpUaGVQdHI7CisgIFZhbHVlICpnZXRSYXdWYWxQdHIoKSBjb25zdCB7IHJldHVybiBUaGVQdHI7IH0KKyAgdm9pZCBzZXRSYXdWYWxQdHIoVmFsdWUgKlApIHsgVGhlUHRyID0gUDsgfQorI2VuZGlmCisgIC8vIENvbnZlcnQgYSBWYWx1ZVR5Kiwgd2hpY2ggbWF5IGJlIGNvbnN0LCB0byB0aGUgcmF3IFZhbHVlKi4KKyAgc3RhdGljIFZhbHVlICpHZXRBc1ZhbHVlKFZhbHVlICpWKSB7IHJldHVybiBWOyB9CisgIHN0YXRpYyBWYWx1ZSAqR2V0QXNWYWx1ZShjb25zdCBWYWx1ZSAqVikgeyByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSo+KFYpOyB9CisKKyAgVmFsdWVUeSAqZ2V0VmFsUHRyKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VmFsdWVUeSAqPihnZXRSYXdWYWxQdHIoKSk7IH0KKyAgdm9pZCBzZXRWYWxQdHIoVmFsdWVUeSAqUCkgeyBzZXRSYXdWYWxQdHIoR2V0QXNWYWx1ZShQKSk7IH0KKworcHVibGljOgorI2lmbmRlZiBOREVCVUcKKyAgQXNzZXJ0aW5nVkgoKSA6IFZhbHVlSGFuZGxlQmFzZShBc3NlcnQpIHt9CisgIEFzc2VydGluZ1ZIKFZhbHVlVHkgKlApIDogVmFsdWVIYW5kbGVCYXNlKEFzc2VydCwgR2V0QXNWYWx1ZShQKSkge30KKyAgQXNzZXJ0aW5nVkgoY29uc3QgQXNzZXJ0aW5nVkggJlJIUykgOiBWYWx1ZUhhbmRsZUJhc2UoQXNzZXJ0LCBSSFMpIHt9CisjZWxzZQorICBBc3NlcnRpbmdWSCgpIDogVGhlUHRyKG51bGxwdHIpIHt9CisgIEFzc2VydGluZ1ZIKFZhbHVlVHkgKlApIDogVGhlUHRyKEdldEFzVmFsdWUoUCkpIHt9CisjZW5kaWYKKworICBvcGVyYXRvciBWYWx1ZVR5KigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsUHRyKCk7CisgIH0KKworICBWYWx1ZVR5ICpvcGVyYXRvcj0oVmFsdWVUeSAqUkhTKSB7CisgICAgc2V0VmFsUHRyKFJIUyk7CisgICAgcmV0dXJuIGdldFZhbFB0cigpOworICB9CisgIFZhbHVlVHkgKm9wZXJhdG9yPShjb25zdCBBc3NlcnRpbmdWSDxWYWx1ZVR5PiAmUkhTKSB7CisgICAgc2V0VmFsUHRyKFJIUy5nZXRWYWxQdHIoKSk7CisgICAgcmV0dXJuIGdldFZhbFB0cigpOworICB9CisKKyAgVmFsdWVUeSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGdldFZhbFB0cigpOyB9CisgIFZhbHVlVHkgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpnZXRWYWxQdHIoKTsgfQorfTsKKworLy8gU3BlY2lhbGl6ZSBEZW5zZU1hcEluZm8gdG8gYWxsb3cgQXNzZXJ0aW5nVkggdG8gcGFydGljaXBhdGUgaW4gRGVuc2VNYXAuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IERlbnNlTWFwSW5mbzxBc3NlcnRpbmdWSDxUPj4geworICBzdGF0aWMgaW5saW5lIEFzc2VydGluZ1ZIPFQ+IGdldEVtcHR5S2V5KCkgeworICAgIEFzc2VydGluZ1ZIPFQ+IFJlczsKKyAgICBSZXMuc2V0UmF3VmFsUHRyKERlbnNlTWFwSW5mbzxWYWx1ZSAqPjo6Z2V0RW1wdHlLZXkoKSk7CisgICAgcmV0dXJuIFJlczsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgQXNzZXJ0aW5nVkg8VD4gZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIEFzc2VydGluZ1ZIPFQ+IFJlczsKKyAgICBSZXMuc2V0UmF3VmFsUHRyKERlbnNlTWFwSW5mbzxWYWx1ZSAqPjo6Z2V0VG9tYnN0b25lS2V5KCkpOworICAgIHJldHVybiBSZXM7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IEFzc2VydGluZ1ZIPFQ+ICZWYWwpIHsKKyAgICByZXR1cm4gRGVuc2VNYXBJbmZvPFZhbHVlICo+OjpnZXRIYXNoVmFsdWUoVmFsLmdldFJhd1ZhbFB0cigpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgQXNzZXJ0aW5nVkg8VD4gJkxIUywgY29uc3QgQXNzZXJ0aW5nVkg8VD4gJlJIUykgeworICAgIHJldHVybiBEZW5zZU1hcEluZm88VmFsdWUgKj46OmlzRXF1YWwoTEhTLmdldFJhd1ZhbFB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTLmdldFJhd1ZhbFB0cigpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNQb2RMaWtlPEFzc2VydGluZ1ZIPFQ+PiB7CisjaWZkZWYgTkRFQlVHCisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKKyNlbHNlCisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7CisjZW5kaWYKK307CisKKy8vLyBcYnJpZWYgVmFsdWUgaGFuZGxlIHRoYXQgdHJhY2tzIGEgVmFsdWUgYWNyb3NzIFJBVVcuCisvLy8KKy8vLyBUcmFja2luZ1ZIIGlzIGRlc2lnbmVkIGZvciBzaXR1YXRpb25zIHdoZXJlIGEgY2xpZW50IG5lZWRzIHRvIGhvbGQgYSBoYW5kbGUKKy8vLyB0byBhIFZhbHVlIChvciBzdWJjbGFzcykgYWNyb3NzIHNvbWUgb3BlcmF0aW9ucyB3aGljaCBtYXkgbW92ZSB0aGF0IHZhbHVlLAorLy8vIGJ1dCBzaG91bGQgbmV2ZXIgZGVzdHJveSBpdCBvciByZXBsYWNlIGl0IHdpdGggc29tZSB1bmFjY2VwdGFibGUgdHlwZS4KKy8vLworLy8vIEl0IGlzIGFuIGVycm9yIHRvIGF0dGVtcHQgdG8gcmVwbGFjZSBhIHZhbHVlIHdpdGggb25lIG9mIGEgdHlwZSB3aGljaCBpcworLy8vIGluY29tcGF0aWJsZSB3aXRoIGFueSBvZiBpdHMgb3V0c3RhbmRpbmcgVHJhY2tpbmdWSHMuCisvLy8KKy8vLyBJdCBpcyBhbiBlcnJvciB0byByZWFkIGZyb20gYSBUcmFja2luZ1ZIIHRoYXQgZG9lcyBub3QgcG9pbnQgdG8gYSB2YWxpZAorLy8vIHZhbHVlLiAgQSBUcmFja2luZ1ZIIGlzIHNhaWQgdG8gbm90IHBvaW50IHRvIGEgdmFsaWQgdmFsdWUgaWYgZWl0aGVyIGl0CisvLy8gaGFzbid0IHlldCBiZWVuIGFzc2lnbmVkIGEgdmFsdWUgeWV0IG9yIGJlY2F1c2UgdGhlIHZhbHVlIGl0IHdhcyB0cmFja2luZworLy8vIGhhcyBzaW5jZSBiZWVuIGRlbGV0ZWQuCisvLy8KKy8vLyBBc3NpZ25pbmcgYSB2YWx1ZSB0byBhIFRyYWNraW5nVkggaXMgYWx3YXlzIGFsbG93ZWQsIGV2ZW4gaWYgc2FpZCBUcmFja2luZ1ZICisvLy8gbm8gbG9uZ2VyIHBvaW50cyB0byBhIHZhbGlkIHZhbHVlLgordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVHk+IGNsYXNzIFRyYWNraW5nVkggeworICBXZWFrVHJhY2tpbmdWSCBJbm5lckhhbmRsZTsKKworcHVibGljOgorICBWYWx1ZVR5ICpnZXRWYWxQdHIoKSBjb25zdCB7CisgICAgYXNzZXJ0KElubmVySGFuZGxlLnBvaW50c1RvQWxpdmVWYWx1ZSgpICYmCisgICAgICAgICAgICJUcmFja2luZ1ZIIG11c3QgYmUgbm9uLW51bGwgYW5kIHZhbGlkIG9uIGRlcmVmZXJlbmNlISIpOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdmFsdWUgaXMgYSBtZW1iZXIgb2YgdGhlIGNvcnJlY3Qgc3ViY2xhc3MuIFdlIHdvdWxkIGxpa2UKKyAgICAvLyB0byBjaGVjayB0aGlzIHByb3BlcnR5IG9uIGFzc2lnbm1lbnQgZm9yIGJldHRlciBkZWJ1Z2dpbmcsIGJ1dCB3ZSBkb24ndAorICAgIC8vIHdhbnQgdG8gcmVxdWlyZSBhIHZpcnR1YWwgaW50ZXJmYWNlIG9uIHRoaXMgVkguIEluc3RlYWQgd2UgYWxsb3cgUkFVVyB0bworICAgIC8vIHJlcGxhY2UgdGhpcyB2YWx1ZSB3aXRoIGEgdmFsdWUgb2YgYW4gaW52YWxpZCB0eXBlLCBhbmQgY2hlY2sgaXQgaGVyZS4KKyAgICBhc3NlcnQoaXNhPFZhbHVlVHk+KElubmVySGFuZGxlKSAmJgorICAgICAgICAgICAiVHJhY2tlZCBWYWx1ZSB3YXMgcmVwbGFjZWQgYnkgb25lIHdpdGggYW4gaW52YWxpZCB0eXBlISIpOworICAgIHJldHVybiBjYXN0PFZhbHVlVHk+KElubmVySGFuZGxlKTsKKyAgfQorCisgIHZvaWQgc2V0VmFsUHRyKFZhbHVlVHkgKlApIHsKKyAgICAvLyBBc3NpZ25pbmcgdG8gbm9uLXZhbGlkIFRyYWNraW5nVkgncyBhcmUgZmluZSBzbyB3ZSBqdXN0IHVuY29uZGl0aW9uYWxseQorICAgIC8vIGFzc2lnbiBoZXJlLgorICAgIElubmVySGFuZGxlID0gR2V0QXNWYWx1ZShQKTsKKyAgfQorCisgIC8vIENvbnZlcnQgYSBWYWx1ZVR5Kiwgd2hpY2ggbWF5IGJlIGNvbnN0LCB0byB0aGUgdHlwZSB0aGUgYmFzZQorICAvLyBjbGFzcyBleHBlY3RzLgorICBzdGF0aWMgVmFsdWUgKkdldEFzVmFsdWUoVmFsdWUgKlYpIHsgcmV0dXJuIFY7IH0KKyAgc3RhdGljIFZhbHVlICpHZXRBc1ZhbHVlKGNvbnN0IFZhbHVlICpWKSB7IHJldHVybiBjb25zdF9jYXN0PFZhbHVlKj4oVik7IH0KKworcHVibGljOgorICBUcmFja2luZ1ZIKCkgPSBkZWZhdWx0OworICBUcmFja2luZ1ZIKFZhbHVlVHkgKlApIHsgc2V0VmFsUHRyKFApOyB9CisKKyAgb3BlcmF0b3IgVmFsdWVUeSooKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFZhbFB0cigpOworICB9CisKKyAgVmFsdWVUeSAqb3BlcmF0b3I9KFZhbHVlVHkgKlJIUykgeworICAgIHNldFZhbFB0cihSSFMpOworICAgIHJldHVybiBnZXRWYWxQdHIoKTsKKyAgfQorCisgIFZhbHVlVHkgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBnZXRWYWxQdHIoKTsgfQorICBWYWx1ZVR5ICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqZ2V0VmFsUHRyKCk7IH0KK307CisKKy8vLyBcYnJpZWYgVmFsdWUgaGFuZGxlIHdpdGggY2FsbGJhY2tzIG9uIFJBVVcgYW5kIGRlc3RydWN0aW9uLgorLy8vCisvLy8gVGhpcyBpcyBhIHZhbHVlIGhhbmRsZSB0aGF0IGFsbG93cyBzdWJjbGFzc2VzIHRvIGRlZmluZSBjYWxsYmFja3MgdGhhdCBydW4KKy8vLyB3aGVuIHRoZSB1bmRlcmx5aW5nIFZhbHVlIGhhcyBSQVVXIGNhbGxlZCBvbiBpdCBvciBpcyBkZXN0cm95ZWQuICBUaGlzCisvLy8gY2xhc3MgY2FuIGJlIHVzZWQgYXMgdGhlIGtleSBvZiBhIG1hcCwgYXMgbG9uZyBhcyB0aGUgdXNlciB0YWtlcyBpdCBvdXQgb2YKKy8vLyB0aGUgbWFwIGJlZm9yZSBjYWxsaW5nIHNldFZhbFB0cigpIChzaW5jZSB0aGUgbWFwIGhhcyB0byByZWFycmFuZ2UgaXRzZWxmCisvLy8gd2hlbiB0aGUgcG9pbnRlciBjaGFuZ2VzKS4gIFVubGlrZSBWYWx1ZUhhbmRsZUJhc2UsIHRoaXMgY2xhc3MgaGFzIGEgdnRhYmxlLgorY2xhc3MgQ2FsbGJhY2tWSCA6IHB1YmxpYyBWYWx1ZUhhbmRsZUJhc2UgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7Citwcm90ZWN0ZWQ6CisgIH5DYWxsYmFja1ZIKCkgPSBkZWZhdWx0OworICBDYWxsYmFja1ZIKGNvbnN0IENhbGxiYWNrVkggJikgPSBkZWZhdWx0OworICBDYWxsYmFja1ZIICZvcGVyYXRvcj0oY29uc3QgQ2FsbGJhY2tWSCAmKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBzZXRWYWxQdHIoVmFsdWUgKlApIHsKKyAgICBWYWx1ZUhhbmRsZUJhc2U6Om9wZXJhdG9yPShQKTsKKyAgfQorCitwdWJsaWM6CisgIENhbGxiYWNrVkgoKSA6IFZhbHVlSGFuZGxlQmFzZShDYWxsYmFjaykge30KKyAgQ2FsbGJhY2tWSChWYWx1ZSAqUCkgOiBWYWx1ZUhhbmRsZUJhc2UoQ2FsbGJhY2ssIFApIHt9CisKKyAgb3BlcmF0b3IgVmFsdWUqKCkgY29uc3QgeworICAgIHJldHVybiBnZXRWYWxQdHIoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2FsbGJhY2sgZm9yIFZhbHVlIGRlc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIENhbGxlZCB3aGVuIHRoaXMtPmdldFZhbFB0cigpIGlzIGRlc3Ryb3llZCwgaW5zaWRlIH5WYWx1ZSgpLCBzbyB5b3UKKyAgLy8vIG1heSBjYWxsIGFueSBub24tdmlydHVhbCBWYWx1ZSBtZXRob2Qgb24gZ2V0VmFsUHRyKCksIGJ1dCBubyBzdWJjbGFzcworICAvLy8gbWV0aG9kcy4gIElmIFdlYWtUcmFja2luZ1ZIIHdlcmUgaW1wbGVtZW50ZWQgYXMgYSBDYWxsYmFja1ZILCBpdCB3b3VsZCB1c2UKKyAgLy8vIHRoaXMKKyAgLy8vIG1ldGhvZCB0byBjYWxsIHNldFZhbFB0cihOVUxMKS4gIEFzc2VydGluZ1ZIIHdvdWxkIHVzZSB0aGlzIG1ldGhvZCB0bworICAvLy8gY2F1c2UgYW4gYXNzZXJ0aW9uIGZhaWx1cmUuCisgIC8vLworICAvLy8gQWxsIGltcGxlbWVudGF0aW9ucyBtdXN0IHJlbW92ZSB0aGUgcmVmZXJlbmNlIGZyb20gdGhpcyBvYmplY3QgdG8gdGhlCisgIC8vLyBWYWx1ZSB0aGF0J3MgYmVpbmcgZGVzdHJveWVkLgorICB2aXJ0dWFsIHZvaWQgZGVsZXRlZCgpIHsgc2V0VmFsUHRyKG51bGxwdHIpOyB9CisKKyAgLy8vIFxicmllZiBDYWxsYmFjayBmb3IgVmFsdWUgUkFVVy4KKyAgLy8vCisgIC8vLyBDYWxsZWQgd2hlbiB0aGlzLT5nZXRWYWxQdHIoKS0+cmVwbGFjZUFsbFVzZXNXaXRoKG5ld192YWx1ZSkgaXMgY2FsbGVkLAorICAvLy8gX2JlZm9yZV8gYW55IG9mIHRoZSB1c2VzIGhhdmUgYWN0dWFsbHkgYmVlbiByZXBsYWNlZC4gIElmIFdlYWtUcmFja2luZ1ZICisgIC8vLyB3ZXJlCisgIC8vLyBpbXBsZW1lbnRlZCBhcyBhIENhbGxiYWNrVkgsIGl0IHdvdWxkIHVzZSB0aGlzIG1ldGhvZCB0byBjYWxsCisgIC8vLyBzZXRWYWxQdHIobmV3X3ZhbHVlKS4gIEFzc2VydGluZ1ZIIHdvdWxkIGRvIG5vdGhpbmcgaW4gdGhpcyBtZXRob2QuCisgIHZpcnR1YWwgdm9pZCBhbGxVc2VzUmVwbGFjZWRXaXRoKFZhbHVlICopIHt9Cit9OworCisvLy8gVmFsdWUgaGFuZGxlIHRoYXQgcG9pc29ucyBpdHNlbGYgaWYgdGhlIFZhbHVlIGlzIGRlbGV0ZWQuCisvLy8KKy8vLyBUaGlzIGlzIGEgVmFsdWUgSGFuZGxlIHRoYXQgcG9pbnRzIHRvIGEgdmFsdWUgYW5kIHBvaXNvbnMgaXRzZWxmIGlmIHRoZQorLy8vIHZhbHVlIGlzIGRlc3Ryb3llZCB3aGlsZSB0aGUgaGFuZGxlIGlzIHN0aWxsIGxpdmUuICBUaGlzIGlzIHZlcnkgdXNlZnVsIGZvcgorLy8vIGNhdGNoaW5nIGRhbmdsaW5nIHBvaW50ZXIgYnVncyB3aGVyZSBhbiBcYyBBc3NlcnRpbmdWSCBjYW5ub3QgYmUgdXNlZAorLy8vIGJlY2F1c2UgdGhlIGRhbmdsaW5nIGhhbmRsZSBuZWVkcyB0byBvdXRsaXZlIHRoZSB2YWx1ZSB3aXRob3V0IGV2ZXIgYmVpbmcKKy8vLyB1c2VkLgorLy8vCisvLy8gT25lIHBhcnRpY3VsYXJseSB1c2VmdWwgcGxhY2UgdG8gdXNlIHRoaXMgaXMgYXMgdGhlIEtleSBvZiBhIG1hcC4gRGFuZ2xpbmcKKy8vLyBwb2ludGVyIGJ1Z3Mgb2Z0ZW4gbGVhZCB0byByZWFsbHkgc3VidGxlIGJ1Z3MgdGhhdCBvbmx5IG9jY3VyIGlmIGFub3RoZXIKKy8vLyBvYmplY3QgaGFwcGVucyB0byBnZXQgYWxsb2NhdGVkIHRvIHRoZSBzYW1lIGFkZHJlc3MgYXMgdGhlIG9sZCBvbmUuIFVzaW5nCisvLy8gYSBQb2lzb25pbmdWSCBlbnN1cmVzIHRoYXQgYW4gYXNzZXJ0IGlzIHRyaWdnZXJlZCBpZiBsb29raW5nIHVwIGEgbmV3IHZhbHVlCisvLy8gaW4gdGhlIG1hcCBmaW5kcyBhIGhhbmRsZSBmcm9tIHRoZSBvbGQgdmFsdWUuCisvLy8KKy8vLyBOb3RlIHRoYXQgYSBQb2lzb25pbmdWSCBoYW5kbGUgZG9lcyAqbm90KiBmb2xsb3cgdmFsdWVzIGFjcm9zcyBSQVVXCisvLy8gb3BlcmF0aW9ucy4gVGhpcyBtZWFucyB0aGF0IFJBVVcncyBuZWVkIHRvIGV4cGxpY2l0bHkgdXBkYXRlIHRoZQorLy8vIFBvaXNvbmluZ1ZIJ3MgYXMgaXQgbW92ZXMuIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBpbiBub24tYXNzZXJ0IG1vZGUgdGhpcworLy8vIGNsYXNzIHR1cm5zIGludG8gYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kIGEgcG9pbnRlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5PgorY2xhc3MgUG9pc29uaW5nVkgKKyNpZm5kZWYgTkRFQlVHCisgICAgZmluYWwgOiBwdWJsaWMgQ2FsbGJhY2tWSAorI2VuZGlmCit7CisgIGZyaWVuZCBzdHJ1Y3QgRGVuc2VNYXBJbmZvPFBvaXNvbmluZ1ZIPFZhbHVlVHk+PjsKKworICAvLyBDb252ZXJ0IGEgVmFsdWVUeSosIHdoaWNoIG1heSBiZSBjb25zdCwgdG8gdGhlIHJhdyBWYWx1ZSouCisgIHN0YXRpYyBWYWx1ZSAqR2V0QXNWYWx1ZShWYWx1ZSAqVikgeyByZXR1cm4gVjsgfQorICBzdGF0aWMgVmFsdWUgKkdldEFzVmFsdWUoY29uc3QgVmFsdWUgKlYpIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUgKj4oVik7IH0KKworI2lmbmRlZiBOREVCVUcKKyAgLy8vIEEgZmxhZyB0cmFja2luZyB3aGV0aGVyIHRoaXMgdmFsdWUgaGFzIGJlZW4gcG9pc29uZWQuCisgIC8vLworICAvLy8gT24gZGVsZXRlIGFuZCBSQVVXLCB3ZSBsZWF2ZSB0aGUgdmFsdWUgcG9pbnRlciBhbG9uZSBzbyB0aGF0IGFzIGEgcmF3CisgIC8vLyBwb2ludGVyIGl0IHByb2R1Y2VzIHRoZSBzYW1lIHZhbHVlIChhbmQgd2UgZml0IGludG8gdGhlIHNhbWUga2V5IG9mCisgIC8vLyBhIGhhc2ggdGFibGUsIGV0YyksIGJ1dCB3ZSBwb2lzb24gdGhlIGhhbmRsZSBzbyB0aGF0IGFueSB0b3AtbGV2ZWwgdXNhZ2UKKyAgLy8vIHdpbGwgZmFpbC4KKyAgYm9vbCBQb2lzb25lZCA9IGZhbHNlOworCisgIFZhbHVlICpnZXRSYXdWYWxQdHIoKSBjb25zdCB7IHJldHVybiBWYWx1ZUhhbmRsZUJhc2U6OmdldFZhbFB0cigpOyB9CisgIHZvaWQgc2V0UmF3VmFsUHRyKFZhbHVlICpQKSB7IFZhbHVlSGFuZGxlQmFzZTo6b3BlcmF0b3I9KFApOyB9CisKKyAgLy8vIEhhbmRsZSBkZWxldGlvbiBieSBwb2lzb25pbmcgdGhlIGhhbmRsZS4KKyAgdm9pZCBkZWxldGVkKCkgb3ZlcnJpZGUgeworICAgIGFzc2VydCghUG9pc29uZWQgJiYgIlRyaWVkIHRvIGRlbGV0ZSBhbiBhbHJlYWR5IHBvaXNvbmVkIGhhbmRsZSEiKTsKKyAgICBQb2lzb25lZCA9IHRydWU7CisgICAgUmVtb3ZlRnJvbVVzZUxpc3QoKTsKKyAgfQorCisgIC8vLyBIYW5kbGUgUkFVVyBieSBwb2lzb25pbmcgdGhlIGhhbmRsZS4KKyAgdm9pZCBhbGxVc2VzUmVwbGFjZWRXaXRoKFZhbHVlICopIG92ZXJyaWRlIHsKKyAgICBhc3NlcnQoIVBvaXNvbmVkICYmICJUcmllZCB0byBSQVVXIGFuIGFscmVhZHkgcG9pc29uZWQgaGFuZGxlISIpOworICAgIFBvaXNvbmVkID0gdHJ1ZTsKKyAgICBSZW1vdmVGcm9tVXNlTGlzdCgpOworICB9CisjZWxzZSAvLyBOREVCVUcKKyAgVmFsdWUgKlRoZVB0ciA9IG51bGxwdHI7CisKKyAgVmFsdWUgKmdldFJhd1ZhbFB0cigpIGNvbnN0IHsgcmV0dXJuIFRoZVB0cjsgfQorICB2b2lkIHNldFJhd1ZhbFB0cihWYWx1ZSAqUCkgeyBUaGVQdHIgPSBQOyB9CisjZW5kaWYKKworICBWYWx1ZVR5ICpnZXRWYWxQdHIoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFQb2lzb25lZCAmJiAiQWNjZXNzZWQgYSBwb2lzb25lZCB2YWx1ZSBoYW5kbGUhIik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFZhbHVlVHkgKj4oZ2V0UmF3VmFsUHRyKCkpOworICB9CisgIHZvaWQgc2V0VmFsUHRyKFZhbHVlVHkgKlApIHsgc2V0UmF3VmFsUHRyKEdldEFzVmFsdWUoUCkpOyB9CisKK3B1YmxpYzoKKyAgUG9pc29uaW5nVkgoKSA9IGRlZmF1bHQ7CisjaWZuZGVmIE5ERUJVRworICBQb2lzb25pbmdWSChWYWx1ZVR5ICpQKSA6IENhbGxiYWNrVkgoR2V0QXNWYWx1ZShQKSkge30KKyAgUG9pc29uaW5nVkgoY29uc3QgUG9pc29uaW5nVkggJlJIUykKKyAgICAgIDogQ2FsbGJhY2tWSChSSFMpLCBQb2lzb25lZChSSFMuUG9pc29uZWQpIHt9CisKKyAgflBvaXNvbmluZ1ZIKCkgeworICAgIGlmIChQb2lzb25lZCkKKyAgICAgIGNsZWFyVmFsUHRyKCk7CisgIH0KKworICBQb2lzb25pbmdWSCAmb3BlcmF0b3I9KGNvbnN0IFBvaXNvbmluZ1ZIICZSSFMpIHsKKyAgICBpZiAoUG9pc29uZWQpCisgICAgICBjbGVhclZhbFB0cigpOworICAgIENhbGxiYWNrVkg6Om9wZXJhdG9yPShSSFMpOworICAgIFBvaXNvbmVkID0gUkhTLlBvaXNvbmVkOworICAgIHJldHVybiAqdGhpczsKKyAgfQorI2Vsc2UKKyAgUG9pc29uaW5nVkgoVmFsdWVUeSAqUCkgOiBUaGVQdHIoR2V0QXNWYWx1ZShQKSkge30KKyNlbmRpZgorCisgIG9wZXJhdG9yIFZhbHVlVHkgKigpIGNvbnN0IHsgcmV0dXJuIGdldFZhbFB0cigpOyB9CisKKyAgVmFsdWVUeSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGdldFZhbFB0cigpOyB9CisgIFZhbHVlVHkgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpnZXRWYWxQdHIoKTsgfQorfTsKKworLy8gU3BlY2lhbGl6ZSBEZW5zZU1hcEluZm8gdG8gYWxsb3cgUG9pc29uaW5nVkggdG8gcGFydGljaXBhdGUgaW4gRGVuc2VNYXAuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IERlbnNlTWFwSW5mbzxQb2lzb25pbmdWSDxUPj4geworICBzdGF0aWMgaW5saW5lIFBvaXNvbmluZ1ZIPFQ+IGdldEVtcHR5S2V5KCkgeworICAgIFBvaXNvbmluZ1ZIPFQ+IFJlczsKKyAgICBSZXMuc2V0UmF3VmFsUHRyKERlbnNlTWFwSW5mbzxWYWx1ZSAqPjo6Z2V0RW1wdHlLZXkoKSk7CisgICAgcmV0dXJuIFJlczsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgUG9pc29uaW5nVkg8VD4gZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIFBvaXNvbmluZ1ZIPFQ+IFJlczsKKyAgICBSZXMuc2V0UmF3VmFsUHRyKERlbnNlTWFwSW5mbzxWYWx1ZSAqPjo6Z2V0VG9tYnN0b25lS2V5KCkpOworICAgIHJldHVybiBSZXM7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IFBvaXNvbmluZ1ZIPFQ+ICZWYWwpIHsKKyAgICByZXR1cm4gRGVuc2VNYXBJbmZvPFZhbHVlICo+OjpnZXRIYXNoVmFsdWUoVmFsLmdldFJhd1ZhbFB0cigpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgUG9pc29uaW5nVkg8VD4gJkxIUywgY29uc3QgUG9pc29uaW5nVkg8VD4gJlJIUykgeworICAgIHJldHVybiBEZW5zZU1hcEluZm88VmFsdWUgKj46OmlzRXF1YWwoTEhTLmdldFJhd1ZhbFB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTLmdldFJhd1ZhbFB0cigpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc1BvZExpa2U8UG9pc29uaW5nVkg8VD4+IHsKKyNpZmRlZiBOREVCVUcKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworI2Vsc2UKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKKyNlbmRpZgorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfVkFMVUVIQU5ETEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9WYWx1ZU1hcC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9WYWx1ZU1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZDU4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1ZhbHVlTWFwLmgKQEAgLTAsMCArMSw0MzQgQEAKKy8vPT09LSBWYWx1ZU1hcC5oIC0gU2FmZSBtYXAgZnJvbSBWYWx1ZXMgdG8gZGF0YSAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFZhbHVlTWFwIGNsYXNzLiAgVmFsdWVNYXAgbWFwcyBWYWx1ZSogb3IgYW55IHN1YmNsYXNzCisvLyB0byBhbiBhcmJpdHJhcnkgb3RoZXIgdHlwZS4gIEl0IHByb3ZpZGVzIHRoZSBEZW5zZU1hcCBpbnRlcmZhY2UgYnV0IHVwZGF0ZXMKKy8vIGl0c2VsZiB0byByZW1haW4gc2FmZSB3aGVuIGtleXMgYXJlIFJBVVdlZCBvciBkZWxldGVkLiAgQnkgZGVmYXVsdCwgd2hlbiBhCisvLyBrZXkgaXMgUkFVV2VkIGZyb20gVjEgdG8gVjIsIHRoZSBvbGQgbWFwcGluZyBWMS0+dGFyZ2V0IGlzIHJlbW92ZWQsIGFuZCBhIG5ldworLy8gbWFwcGluZyBWMi0+dGFyZ2V0IGlzIGFkZGVkLiAgSWYgVjIgYWxyZWFkeSBleGlzdGVkLCBpdHMgb2xkIHRhcmdldCBpcworLy8gb3ZlcndyaXR0ZW4uICBXaGVuIGEga2V5IGlzIGRlbGV0ZWQsIGl0cyBtYXBwaW5nIGlzIHJlbW92ZWQuCisvLworLy8gWW91IGNhbiBvdmVycmlkZSBhIFZhbHVlTWFwJ3MgQ29uZmlnIHBhcmFtZXRlciB0byBjb250cm9sIGV4YWN0bHkgd2hhdAorLy8gaGFwcGVucyBvbiBSQVVXIGFuZCBkZXN0cnVjdGlvbiBhbmQgdG8gZ2V0IGNhbGxlZCBiYWNrIG9uIGVhY2ggZXZlbnQuICBJdCdzCisvLyBsZWdhbCB0byBjYWxsIGJhY2sgaW50byB0aGUgVmFsdWVNYXAgZnJvbSBhIENvbmZpZydzIGNhbGxiYWNrcy4gIENvbmZpZworLy8gcGFyYW1ldGVycyBzaG91bGQgaW5oZXJpdCBmcm9tIFZhbHVlTWFwQ29uZmlnPEtleVQ+IHRvIGdldCBkZWZhdWx0CisvLyBpbXBsZW1lbnRhdGlvbnMgb2YgYWxsIHRoZSBtZXRob2RzIFZhbHVlTWFwIHVzZXMuICBTZWUgVmFsdWVNYXBDb25maWcgZm9yCisvLyBkb2N1bWVudGF0aW9uIG9mIHRoZSBmdW5jdGlvbnMgeW91IGNhbiBvdmVycmlkZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfVkFMVUVNQVBfSAorI2RlZmluZSBMTFZNX0lSX1ZBTFVFTUFQX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9JUi9UcmFja2luZ01EUmVmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L011dGV4LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1VuaXF1ZUxvY2suaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsdWVULCB0eXBlbmFtZSBDb25maWc+CitjbGFzcyBWYWx1ZU1hcENhbGxiYWNrVkg7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZW5zZU1hcFQsIHR5cGVuYW1lIEtleVQ+CitjbGFzcyBWYWx1ZU1hcEl0ZXJhdG9yOwordGVtcGxhdGU8dHlwZW5hbWUgRGVuc2VNYXBULCB0eXBlbmFtZSBLZXlUPgorY2xhc3MgVmFsdWVNYXBDb25zdEl0ZXJhdG9yOworCisvLy8gVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBjb25maWd1cmFibGUgYXNwZWN0cyBvZgorLy8vIFZhbHVlTWFwPD4uICBVc2VyIENvbmZpZ3Mgc2hvdWxkIGluaGVyaXQgZnJvbSB0aGlzIGNsYXNzIHRvIGJlIGFzIGNvbXBhdGlibGUKKy8vLyBhcyBwb3NzaWJsZSB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiBWYWx1ZU1hcC4KK3RlbXBsYXRlPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIE11dGV4VCA9IHN5czo6TXV0ZXg+CitzdHJ1Y3QgVmFsdWVNYXBDb25maWcgeworICB1c2luZyBtdXRleF90eXBlID0gTXV0ZXhUOworCisgIC8vLyBJZiBGb2xsb3dSQVVXIGlzIHRydWUsIHRoZSBWYWx1ZU1hcCB3aWxsIHVwZGF0ZSBtYXBwaW5ncyBvbiBSQVVXLiBJZiBpdCdzCisgIC8vLyBmYWxzZSwgdGhlIFZhbHVlTWFwIHdpbGwgbGVhdmUgdGhlIG9yaWdpbmFsIG1hcHBpbmcgaW4gcGxhY2UuCisgIGVudW0geyBGb2xsb3dSQVVXID0gdHJ1ZSB9OworCisgIC8vIEFsbCBtZXRob2RzIHdpbGwgYmUgY2FsbGVkIHdpdGggYSBmaXJzdCBhcmd1bWVudCBvZiB0eXBlIEV4dHJhRGF0YS4gIFRoZQorICAvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBpbiB0aGlzIGNsYXNzIHRha2UgYSB0ZW1wbGF0ZWQgZmlyc3QgYXJndW1lbnQgc28KKyAgLy8gdGhhdCB1c2Vycycgc3ViY2xhc3NlcyBjYW4gdXNlIGFueSB0eXBlIHRoZXkgd2FudCB3aXRob3V0IGhhdmluZyB0bworICAvLyBvdmVycmlkZSBhbGwgdGhlIGRlZmF1bHRzLgorICBzdHJ1Y3QgRXh0cmFEYXRhIHt9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEV4dHJhRGF0YVQ+CisgIHN0YXRpYyB2b2lkIG9uUkFVVyhjb25zdCBFeHRyYURhdGFUICYgLypEYXRhKi8sIEtleVQgLypPbGQqLywgS2V5VCAvKk5ldyovKSB7fQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBFeHRyYURhdGFUPgorICBzdGF0aWMgdm9pZCBvbkRlbGV0ZShjb25zdCBFeHRyYURhdGFUICYvKkRhdGEqLywgS2V5VCAvKk9sZCovKSB7fQorCisgIC8vLyBSZXR1cm5zIGEgbXV0ZXggdGhhdCBzaG91bGQgYmUgYWNxdWlyZWQgYXJvdW5kIGFueSBjaGFuZ2VzIHRvIHRoZSBtYXAuCisgIC8vLyBUaGlzIGlzIG9ubHkgYWNxdWlyZWQgZnJvbSB0aGUgQ2FsbGJhY2tWSCAoYW5kIGhlbGQgYXJvdW5kIGNhbGxzIHRvIG9uUkFVVworICAvLy8gYW5kIG9uRGVsZXRlKSBhbmQgbm90IGluc2lkZSBvdGhlciBWYWx1ZU1hcCBtZXRob2RzLiAgTlVMTCBtZWFucyB0aGF0IG5vCisgIC8vLyBtdXRleCBpcyBuZWNlc3NhcnkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEV4dHJhRGF0YVQ+CisgIHN0YXRpYyBtdXRleF90eXBlICpnZXRNdXRleChjb25zdCBFeHRyYURhdGFUICYvKkRhdGEqLykgeyByZXR1cm4gbnVsbHB0cjsgfQorfTsKKworLy8vIFNlZSB0aGUgZmlsZSBjb21tZW50LgordGVtcGxhdGU8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsdWVULCB0eXBlbmFtZSBDb25maWcgPVZhbHVlTWFwQ29uZmlnPEtleVQ+PgorY2xhc3MgVmFsdWVNYXAgeworICBmcmllbmQgY2xhc3MgVmFsdWVNYXBDYWxsYmFja1ZIPEtleVQsIFZhbHVlVCwgQ29uZmlnPjsKKworICB1c2luZyBWYWx1ZU1hcENWSCA9IFZhbHVlTWFwQ2FsbGJhY2tWSDxLZXlULCBWYWx1ZVQsIENvbmZpZz47CisgIHVzaW5nIE1hcFQgPSBEZW5zZU1hcDxWYWx1ZU1hcENWSCwgVmFsdWVULCBEZW5zZU1hcEluZm88VmFsdWVNYXBDVkg+PjsKKyAgdXNpbmcgTURNYXBUID0gRGVuc2VNYXA8Y29uc3QgTWV0YWRhdGEgKiwgVHJhY2tpbmdNRFJlZj47CisgIHVzaW5nIEV4dHJhRGF0YSA9IHR5cGVuYW1lIENvbmZpZzo6RXh0cmFEYXRhOworCisgIE1hcFQgTWFwOworICBPcHRpb25hbDxNRE1hcFQ+IE1ETWFwOworICBFeHRyYURhdGEgRGF0YTsKKyAgYm9vbCBNYXlNYXBNZXRhZGF0YSA9IHRydWU7CisKK3B1YmxpYzoKKyAgdXNpbmcga2V5X3R5cGUgPSBLZXlUOworICB1c2luZyBtYXBwZWRfdHlwZSA9IFZhbHVlVDsKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+OworICB1c2luZyBzaXplX3R5cGUgPSB1bnNpZ25lZDsKKworICBleHBsaWNpdCBWYWx1ZU1hcCh1bnNpZ25lZCBOdW1Jbml0QnVja2V0cyA9IDY0KQorICAgICAgOiBNYXAoTnVtSW5pdEJ1Y2tldHMpLCBEYXRhKCkge30KKyAgZXhwbGljaXQgVmFsdWVNYXAoY29uc3QgRXh0cmFEYXRhICZEYXRhLCB1bnNpZ25lZCBOdW1Jbml0QnVja2V0cyA9IDY0KQorICAgICAgOiBNYXAoTnVtSW5pdEJ1Y2tldHMpLCBEYXRhKERhdGEpIHt9CisgIFZhbHVlTWFwKGNvbnN0IFZhbHVlTWFwICYpID0gZGVsZXRlOworICBWYWx1ZU1hcCAmb3BlcmF0b3I9KGNvbnN0IFZhbHVlTWFwICYpID0gZGVsZXRlOworCisgIGJvb2wgaGFzTUQoKSBjb25zdCB7IHJldHVybiBib29sKE1ETWFwKTsgfQorICBNRE1hcFQgJk1EKCkgeworICAgIGlmICghTURNYXApCisgICAgICBNRE1hcC5lbXBsYWNlKCk7CisgICAgcmV0dXJuICpNRE1hcDsKKyAgfQorICBPcHRpb25hbDxNRE1hcFQ+ICZnZXRNRE1hcCgpIHsgcmV0dXJuIE1ETWFwOyB9CisKKyAgYm9vbCBtYXlNYXBNZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuIE1heU1hcE1ldGFkYXRhOyB9CisgIHZvaWQgZW5hYmxlTWFwTWV0YWRhdGEoKSB7IE1heU1hcE1ldGFkYXRhID0gdHJ1ZTsgfQorICB2b2lkIGRpc2FibGVNYXBNZXRhZGF0YSgpIHsgTWF5TWFwTWV0YWRhdGEgPSBmYWxzZTsgfQorCisgIC8vLyBHZXQgdGhlIG1hcHBlZCBtZXRhZGF0YSwgaWYgaXQncyBpbiB0aGUgbWFwLgorICBPcHRpb25hbDxNZXRhZGF0YSAqPiBnZXRNYXBwZWRNRChjb25zdCBNZXRhZGF0YSAqTUQpIGNvbnN0IHsKKyAgICBpZiAoIU1ETWFwKQorICAgICAgcmV0dXJuIE5vbmU7CisgICAgYXV0byBXaGVyZSA9IE1ETWFwLT5maW5kKE1EKTsKKyAgICBpZiAoV2hlcmUgPT0gTURNYXAtPmVuZCgpKQorICAgICAgcmV0dXJuIE5vbmU7CisgICAgcmV0dXJuIFdoZXJlLT5zZWNvbmQuZ2V0KCk7CisgIH0KKworICB1c2luZyBpdGVyYXRvciA9IFZhbHVlTWFwSXRlcmF0b3I8TWFwVCwgS2V5VD47CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gVmFsdWVNYXBDb25zdEl0ZXJhdG9yPE1hcFQsIEtleVQ+OworCisgIGlubGluZSBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKE1hcC5iZWdpbigpKTsgfQorICBpbmxpbmUgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IoTWFwLmVuZCgpKTsgfQorICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihNYXAuYmVnaW4oKSk7IH0KKyAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKE1hcC5lbmQoKSk7IH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gTWFwLmVtcHR5KCk7IH0KKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBNYXAuc2l6ZSgpOyB9CisKKyAgLy8vIEdyb3cgdGhlIG1hcCBzbyB0aGF0IGl0IGhhcyBhdCBsZWFzdCBTaXplIGJ1Y2tldHMuIERvZXMgbm90IHNocmluaworICB2b2lkIHJlc2l6ZShzaXplX3QgU2l6ZSkgeyBNYXAucmVzaXplKFNpemUpOyB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBNYXAuY2xlYXIoKTsKKyAgICBNRE1hcC5yZXNldCgpOworICB9CisKKyAgLy8vIFJldHVybiAxIGlmIHRoZSBzcGVjaWZpZWQga2V5IGlzIGluIHRoZSBtYXAsIDAgb3RoZXJ3aXNlLgorICBzaXplX3R5cGUgY291bnQoY29uc3QgS2V5VCAmVmFsKSBjb25zdCB7CisgICAgcmV0dXJuIE1hcC5maW5kX2FzKFZhbCkgPT0gTWFwLmVuZCgpID8gMCA6IDE7CisgIH0KKworICBpdGVyYXRvciBmaW5kKGNvbnN0IEtleVQgJlZhbCkgeworICAgIHJldHVybiBpdGVyYXRvcihNYXAuZmluZF9hcyhWYWwpKTsKKyAgfQorICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IEtleVQgJlZhbCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihNYXAuZmluZF9hcyhWYWwpKTsKKyAgfQorCisgIC8vLyBsb29rdXAgLSBSZXR1cm4gdGhlIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGtleSwgb3IgYSBkZWZhdWx0CisgIC8vLyBjb25zdHJ1Y3RlZCB2YWx1ZSBpZiBubyBzdWNoIGVudHJ5IGV4aXN0cy4KKyAgVmFsdWVUIGxvb2t1cChjb25zdCBLZXlUICZWYWwpIGNvbnN0IHsKKyAgICB0eXBlbmFtZSBNYXBUOjpjb25zdF9pdGVyYXRvciBJID0gTWFwLmZpbmRfYXMoVmFsKTsKKyAgICByZXR1cm4gSSAhPSBNYXAuZW5kKCkgPyBJLT5zZWNvbmQgOiBWYWx1ZVQoKTsKKyAgfQorCisgIC8vIEluc2VydHMga2V5LHZhbHVlIHBhaXIgaW50byB0aGUgbWFwIGlmIHRoZSBrZXkgaXNuJ3QgYWxyZWFkeSBpbiB0aGUgbWFwLgorICAvLyBJZiB0aGUga2V5IGlzIGFscmVhZHkgaW4gdGhlIG1hcCwgaXQgcmV0dXJucyBmYWxzZSBhbmQgZG9lc24ndCB1cGRhdGUgdGhlCisgIC8vIHZhbHVlLgorICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydChjb25zdCBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPiAmS1YpIHsKKyAgICBhdXRvIE1hcFJlc3VsdCA9IE1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoV3JhcChLVi5maXJzdCksIEtWLnNlY29uZCkpOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihNYXBSZXN1bHQuZmlyc3QpLCBNYXBSZXN1bHQuc2Vjb25kKTsKKyAgfQorCisgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+ICYmS1YpIHsKKyAgICBhdXRvIE1hcFJlc3VsdCA9CisgICAgICAgIE1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoV3JhcChLVi5maXJzdCksIHN0ZDo6bW92ZShLVi5zZWNvbmQpKSk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKE1hcFJlc3VsdC5maXJzdCksIE1hcFJlc3VsdC5zZWNvbmQpOworICB9CisKKyAgLy8vIGluc2VydCAtIFJhbmdlIGluc2VydGlvbiBvZiBwYWlycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdD4KKyAgdm9pZCBpbnNlcnQoSW5wdXRJdCBJLCBJbnB1dEl0IEUpIHsKKyAgICBmb3IgKDsgSSAhPSBFOyArK0kpCisgICAgICBpbnNlcnQoKkkpOworICB9CisKKyAgYm9vbCBlcmFzZShjb25zdCBLZXlUICZWYWwpIHsKKyAgICB0eXBlbmFtZSBNYXBUOjppdGVyYXRvciBJID0gTWFwLmZpbmRfYXMoVmFsKTsKKyAgICBpZiAoSSA9PSBNYXAuZW5kKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBNYXAuZXJhc2UoSSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgdm9pZCBlcmFzZShpdGVyYXRvciBJKSB7CisgICAgcmV0dXJuIE1hcC5lcmFzZShJLmJhc2UoKSk7CisgIH0KKworICB2YWx1ZV90eXBlJiBGaW5kQW5kQ29uc3RydWN0KGNvbnN0IEtleVQgJktleSkgeworICAgIHJldHVybiBNYXAuRmluZEFuZENvbnN0cnVjdChXcmFwKEtleSkpOworICB9CisKKyAgVmFsdWVUICZvcGVyYXRvcltdKGNvbnN0IEtleVQgJktleSkgeworICAgIHJldHVybiBNYXBbV3JhcChLZXkpXTsKKyAgfQorCisgIC8vLyBpc1BvaW50ZXJJbnRvQnVja2V0c0FycmF5IC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBwb2ludGVyIHBvaW50cworICAvLy8gc29tZXdoZXJlIGludG8gdGhlIFZhbHVlTWFwJ3MgYXJyYXkgb2YgYnVja2V0cyAoaS5lLiBlaXRoZXIgdG8gYSBrZXkgb3IKKyAgLy8vIHZhbHVlIGluIHRoZSBWYWx1ZU1hcCkuCisgIGJvb2wgaXNQb2ludGVySW50b0J1Y2tldHNBcnJheShjb25zdCB2b2lkICpQdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFwLmlzUG9pbnRlckludG9CdWNrZXRzQXJyYXkoUHRyKTsKKyAgfQorCisgIC8vLyBnZXRQb2ludGVySW50b0J1Y2tldHNBcnJheSgpIC0gUmV0dXJuIGFuIG9wYXF1ZSBwb2ludGVyIGludG8gdGhlIGJ1Y2tldHMKKyAgLy8vIGFycmF5LiAgSW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJldmlvdXMgbWV0aG9kLCB0aGlzIGNhbiBiZSB1c2VkIHRvCisgIC8vLyBkZXRlcm1pbmUgd2hldGhlciBhbiBpbnNlcnRpb24gY2F1c2VkIHRoZSBWYWx1ZU1hcCB0byByZWFsbG9jYXRlLgorICBjb25zdCB2b2lkICpnZXRQb2ludGVySW50b0J1Y2tldHNBcnJheSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFwLmdldFBvaW50ZXJJbnRvQnVja2V0c0FycmF5KCk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gVGFrZXMgYSBrZXkgYmVpbmcgbG9va2VkIHVwIGluIHRoZSBtYXAgYW5kIHdyYXBzIGl0IGludG8gYQorICAvLyBWYWx1ZU1hcENhbGxiYWNrVkgsIHRoZSBhY3R1YWwga2V5IHR5cGUgb2YgdGhlIG1hcC4gIFdlIHVzZSBhIGhlbHBlcgorICAvLyBmdW5jdGlvbiBiZWNhdXNlIFZhbHVlTWFwQ1ZIIGlzIGNvbnN0cnVjdGVkIHdpdGggYSBzZWNvbmQgcGFyYW1ldGVyLgorICBWYWx1ZU1hcENWSCBXcmFwKEtleVQga2V5KSBjb25zdCB7CisgICAgLy8gVGhlIG9ubHkgd2F5IHRoZSByZXN1bHRpbmcgQ2FsbGJhY2tWSCBjb3VsZCB0cnkgdG8gbW9kaWZ5ICp0aGlzIChtYWtpbmcKKyAgICAvLyB0aGUgY29uc3RfY2FzdCBpbmNvcnJlY3QpIGlzIGlmIGl0IGdldHMgaW5zZXJ0ZWQgaW50byB0aGUgbWFwLiAgQnV0IHRoZW4KKyAgICAvLyB0aGlzIGZ1bmN0aW9uIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIGEgbm9uLWNvbnN0IG1ldGhvZCwgbWFraW5nIHRoZQorICAgIC8vIGNvbnN0X2Nhc3Qgb2suCisgICAgcmV0dXJuIFZhbHVlTWFwQ1ZIKGtleSwgY29uc3RfY2FzdDxWYWx1ZU1hcCo+KHRoaXMpKTsKKyAgfQorfTsKKworLy8gVGhpcyBDYWxsYmFja1ZIIHVwZGF0ZXMgaXRzIFZhbHVlTWFwIHdoZW4gdGhlIGNvbnRhaW5lZCBWYWx1ZSBjaGFuZ2VzLAorLy8gYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZXMgZXhwcmVzc2VkIHRocm91Z2ggdGhlIENvbmZpZyBvYmplY3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsdWVULCB0eXBlbmFtZSBDb25maWc+CitjbGFzcyBWYWx1ZU1hcENhbGxiYWNrVkggZmluYWwgOiBwdWJsaWMgQ2FsbGJhY2tWSCB7CisgIGZyaWVuZCBjbGFzcyBWYWx1ZU1hcDxLZXlULCBWYWx1ZVQsIENvbmZpZz47CisgIGZyaWVuZCBzdHJ1Y3QgRGVuc2VNYXBJbmZvPFZhbHVlTWFwQ2FsbGJhY2tWSD47CisKKyAgdXNpbmcgVmFsdWVNYXBUID0gVmFsdWVNYXA8S2V5VCwgVmFsdWVULCBDb25maWc+OworICB1c2luZyBLZXlTYW5zUG9pbnRlclQgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9wb2ludGVyPEtleVQ+Ojp0eXBlOworCisgIFZhbHVlTWFwVCAqTWFwOworCisgIFZhbHVlTWFwQ2FsbGJhY2tWSChLZXlUIEtleSwgVmFsdWVNYXBUICpNYXApCisgICAgICA6IENhbGxiYWNrVkgoY29uc3RfY2FzdDxWYWx1ZSo+KHN0YXRpY19jYXN0PGNvbnN0IFZhbHVlKj4oS2V5KSkpLAorICAgICAgICBNYXAoTWFwKSB7fQorCisgIC8vIFByaXZhdGUgY29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgZW1wdHkvdG9tYnN0b25lIERlbnNlTWFwIGtleXMuCisgIFZhbHVlTWFwQ2FsbGJhY2tWSChWYWx1ZSAqVikgOiBDYWxsYmFja1ZIKFYpLCBNYXAobnVsbHB0cikge30KKworcHVibGljOgorICBLZXlUIFVud3JhcCgpIGNvbnN0IHsgcmV0dXJuIGNhc3Rfb3JfbnVsbDxLZXlTYW5zUG9pbnRlclQ+KGdldFZhbFB0cigpKTsgfQorCisgIHZvaWQgZGVsZXRlZCgpIG92ZXJyaWRlIHsKKyAgICAvLyBNYWtlIGEgY29weSB0aGF0IHdvbid0IGdldCBjaGFuZ2VkIGV2ZW4gd2hlbiAqdGhpcyBpcyBkZXN0cm95ZWQuCisgICAgVmFsdWVNYXBDYWxsYmFja1ZIIENvcHkoKnRoaXMpOworICAgIHR5cGVuYW1lIENvbmZpZzo6bXV0ZXhfdHlwZSAqTSA9IENvbmZpZzo6Z2V0TXV0ZXgoQ29weS5NYXAtPkRhdGEpOworICAgIHVuaXF1ZV9sb2NrPHR5cGVuYW1lIENvbmZpZzo6bXV0ZXhfdHlwZT4gR3VhcmQ7CisgICAgaWYgKE0pCisgICAgICBHdWFyZCA9IHVuaXF1ZV9sb2NrPHR5cGVuYW1lIENvbmZpZzo6bXV0ZXhfdHlwZT4oKk0pOworICAgIENvbmZpZzo6b25EZWxldGUoQ29weS5NYXAtPkRhdGEsIENvcHkuVW53cmFwKCkpOyAgLy8gTWF5IGRlc3Ryb3kgKnRoaXMuCisgICAgQ29weS5NYXAtPk1hcC5lcmFzZShDb3B5KTsgIC8vIERlZmluaXRlbHkgZGVzdHJveXMgKnRoaXMuCisgIH0KKworICB2b2lkIGFsbFVzZXNSZXBsYWNlZFdpdGgoVmFsdWUgKm5ld19rZXkpIG92ZXJyaWRlIHsKKyAgICBhc3NlcnQoaXNhPEtleVNhbnNQb2ludGVyVD4obmV3X2tleSkgJiYKKyAgICAgICAgICAgIkludmFsaWQgUkFVVyBvbiBrZXkgb2YgVmFsdWVNYXA8PiIpOworICAgIC8vIE1ha2UgYSBjb3B5IHRoYXQgd29uJ3QgZ2V0IGNoYW5nZWQgZXZlbiB3aGVuICp0aGlzIGlzIGRlc3Ryb3llZC4KKyAgICBWYWx1ZU1hcENhbGxiYWNrVkggQ29weSgqdGhpcyk7CisgICAgdHlwZW5hbWUgQ29uZmlnOjptdXRleF90eXBlICpNID0gQ29uZmlnOjpnZXRNdXRleChDb3B5Lk1hcC0+RGF0YSk7CisgICAgdW5pcXVlX2xvY2s8dHlwZW5hbWUgQ29uZmlnOjptdXRleF90eXBlPiBHdWFyZDsKKyAgICBpZiAoTSkKKyAgICAgIEd1YXJkID0gdW5pcXVlX2xvY2s8dHlwZW5hbWUgQ29uZmlnOjptdXRleF90eXBlPigqTSk7CisKKyAgICBLZXlUIHR5cGVkX25ld19rZXkgPSBjYXN0PEtleVNhbnNQb2ludGVyVD4obmV3X2tleSk7CisgICAgLy8gQ2FuIGRlc3Ryb3kgKnRoaXM6CisgICAgQ29uZmlnOjpvblJBVVcoQ29weS5NYXAtPkRhdGEsIENvcHkuVW53cmFwKCksIHR5cGVkX25ld19rZXkpOworICAgIGlmIChDb25maWc6OkZvbGxvd1JBVVcpIHsKKyAgICAgIHR5cGVuYW1lIFZhbHVlTWFwVDo6TWFwVDo6aXRlcmF0b3IgSSA9IENvcHkuTWFwLT5NYXAuZmluZChDb3B5KTsKKyAgICAgIC8vIEkgY291bGQgPT0gQ29weS5NYXAtPk1hcC5lbmQoKSBpZiB0aGUgb25SQVVXIGNhbGxiYWNrIGFscmVhZHkKKyAgICAgIC8vIHJlbW92ZWQgdGhlIG9sZCBtYXBwaW5nLgorICAgICAgaWYgKEkgIT0gQ29weS5NYXAtPk1hcC5lbmQoKSkgeworICAgICAgICBWYWx1ZVQgVGFyZ2V0KHN0ZDo6bW92ZShJLT5zZWNvbmQpKTsKKyAgICAgICAgQ29weS5NYXAtPk1hcC5lcmFzZShJKTsgIC8vIERlZmluaXRlbHkgZGVzdHJveXMgKnRoaXMuCisgICAgICAgIENvcHkuTWFwLT5pbnNlcnQoc3RkOjptYWtlX3BhaXIodHlwZWRfbmV3X2tleSwgc3RkOjptb3ZlKFRhcmdldCkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUgQ29uZmlnPgorc3RydWN0IERlbnNlTWFwSW5mbzxWYWx1ZU1hcENhbGxiYWNrVkg8S2V5VCwgVmFsdWVULCBDb25maWc+PiB7CisgIHVzaW5nIFZIID0gVmFsdWVNYXBDYWxsYmFja1ZIPEtleVQsIFZhbHVlVCwgQ29uZmlnPjsKKworICBzdGF0aWMgaW5saW5lIFZIIGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBWSChEZW5zZU1hcEluZm88VmFsdWUgKj46OmdldEVtcHR5S2V5KCkpOworICB9CisKKyAgc3RhdGljIGlubGluZSBWSCBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgcmV0dXJuIFZIKERlbnNlTWFwSW5mbzxWYWx1ZSAqPjo6Z2V0VG9tYnN0b25lS2V5KCkpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBWSCAmVmFsKSB7CisgICAgcmV0dXJuIERlbnNlTWFwSW5mbzxLZXlUPjo6Z2V0SGFzaFZhbHVlKFZhbC5VbndyYXAoKSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IEtleVQgJlZhbCkgeworICAgIHJldHVybiBEZW5zZU1hcEluZm88S2V5VD46OmdldEhhc2hWYWx1ZShWYWwpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBWSCAmTEhTLCBjb25zdCBWSCAmUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IEtleVQgJkxIUywgY29uc3QgVkggJlJIUykgeworICAgIHJldHVybiBMSFMgPT0gUkhTLmdldFZhbFB0cigpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZW5zZU1hcFQsIHR5cGVuYW1lIEtleVQ+CitjbGFzcyBWYWx1ZU1hcEl0ZXJhdG9yIDoKKyAgICBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxLZXlULCB0eXBlbmFtZSBEZW5zZU1hcFQ6Om1hcHBlZF90eXBlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Q+IHsKKyAgdXNpbmcgQmFzZVQgPSB0eXBlbmFtZSBEZW5zZU1hcFQ6Oml0ZXJhdG9yOworICB1c2luZyBWYWx1ZVQgPSB0eXBlbmFtZSBEZW5zZU1hcFQ6Om1hcHBlZF90eXBlOworCisgIEJhc2VUIEk7CisKK3B1YmxpYzoKKyAgVmFsdWVNYXBJdGVyYXRvcigpIDogSSgpIHt9CisgIFZhbHVlTWFwSXRlcmF0b3IoQmFzZVQgSSkgOiBJKEkpIHt9CisKKyAgQmFzZVQgYmFzZSgpIGNvbnN0IHsgcmV0dXJuIEk7IH0KKworICBzdHJ1Y3QgVmFsdWVUeXBlUHJveHkgeworICAgIGNvbnN0IEtleVQgZmlyc3Q7CisgICAgVmFsdWVUJiBzZWNvbmQ7CisKKyAgICBWYWx1ZVR5cGVQcm94eSAqb3BlcmF0b3ItPigpIHsgcmV0dXJuIHRoaXM7IH0KKworICAgIG9wZXJhdG9yIHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+KCkgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGZpcnN0LCBzZWNvbmQpOworICAgIH0KKyAgfTsKKworICBWYWx1ZVR5cGVQcm94eSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgVmFsdWVUeXBlUHJveHkgUmVzdWx0ID0ge0ktPmZpcnN0LlVud3JhcCgpLCBJLT5zZWNvbmR9OworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICBWYWx1ZVR5cGVQcm94eSBvcGVyYXRvci0+KCkgY29uc3QgeworICAgIHJldHVybiBvcGVyYXRvciooKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWYWx1ZU1hcEl0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gSSA9PSBSSFMuSTsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgVmFsdWVNYXBJdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEkgIT0gUkhTLkk7CisgIH0KKworICBpbmxpbmUgVmFsdWVNYXBJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgIC8vIFByZWluY3JlbWVudAorICAgICsrSTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgVmFsdWVNYXBJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAgLy8gUG9zdGluY3JlbWVudAorICAgIFZhbHVlTWFwSXRlcmF0b3IgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlbnNlTWFwVCwgdHlwZW5hbWUgS2V5VD4KK2NsYXNzIFZhbHVlTWFwQ29uc3RJdGVyYXRvciA6CisgICAgcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8S2V5VCwgdHlwZW5hbWUgRGVuc2VNYXBUOjptYXBwZWRfdHlwZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90PiB7CisgIHVzaW5nIEJhc2VUID0gdHlwZW5hbWUgRGVuc2VNYXBUOjpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgVmFsdWVUID0gdHlwZW5hbWUgRGVuc2VNYXBUOjptYXBwZWRfdHlwZTsKKworICBCYXNlVCBJOworCitwdWJsaWM6CisgIFZhbHVlTWFwQ29uc3RJdGVyYXRvcigpIDogSSgpIHt9CisgIFZhbHVlTWFwQ29uc3RJdGVyYXRvcihCYXNlVCBJKSA6IEkoSSkge30KKyAgVmFsdWVNYXBDb25zdEl0ZXJhdG9yKFZhbHVlTWFwSXRlcmF0b3I8RGVuc2VNYXBULCBLZXlUPiBPdGhlcikKKyAgICA6IEkoT3RoZXIuYmFzZSgpKSB7fQorCisgIEJhc2VUIGJhc2UoKSBjb25zdCB7IHJldHVybiBJOyB9CisKKyAgc3RydWN0IFZhbHVlVHlwZVByb3h5IHsKKyAgICBjb25zdCBLZXlUIGZpcnN0OworICAgIGNvbnN0IFZhbHVlVCYgc2Vjb25kOworICAgIFZhbHVlVHlwZVByb3h5ICpvcGVyYXRvci0+KCkgeyByZXR1cm4gdGhpczsgfQorICAgIG9wZXJhdG9yIHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+KCkgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGZpcnN0LCBzZWNvbmQpOworICAgIH0KKyAgfTsKKworICBWYWx1ZVR5cGVQcm94eSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgVmFsdWVUeXBlUHJveHkgUmVzdWx0ID0ge0ktPmZpcnN0LlVud3JhcCgpLCBJLT5zZWNvbmR9OworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICBWYWx1ZVR5cGVQcm94eSBvcGVyYXRvci0+KCkgY29uc3QgeworICAgIHJldHVybiBvcGVyYXRvciooKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWYWx1ZU1hcENvbnN0SXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiBJID09IFJIUy5JOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBWYWx1ZU1hcENvbnN0SXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiBJICE9IFJIUy5JOworICB9CisKKyAgaW5saW5lIFZhbHVlTWFwQ29uc3RJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgIC8vIFByZWluY3JlbWVudAorICAgICsrSTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgVmFsdWVNYXBDb25zdEl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7ICAvLyBQb3N0aW5jcmVtZW50CisgICAgVmFsdWVNYXBDb25zdEl0ZXJhdG9yIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9WQUxVRU1BUF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1ZhbHVlU3ltYm9sVGFibGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVmFsdWVTeW1ib2xUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Y2JiZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1ZhbHVlU3ltYm9sVGFibGUuaApAQCAtMCwwICsxLDEzOSBAQAorLy89PT0tIGxsdm0vVmFsdWVTeW1ib2xUYWJsZS5oIC0gSW1wbGVtZW50IGEgVmFsdWUgU3ltdGFiIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgbmFtZS9WYWx1ZSBzeW1ib2wgdGFibGUgZm9yIExMVk0uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX1ZBTFVFU1lNQk9MVEFCTEVfSAorI2RlZmluZSBMTFZNX0lSX1ZBTFVFU1lNQk9MVEFCTEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQXJndW1lbnQ7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBHbG9iYWxBbGlhczsKK2NsYXNzIEdsb2JhbElGdW5jOworY2xhc3MgR2xvYmFsVmFyaWFibGU7CitjbGFzcyBJbnN0cnVjdGlvbjsKK3RlbXBsYXRlIDx1bnNpZ25lZCBJbnRlcm5hbExlbj4gY2xhc3MgU21hbGxTdHJpbmc7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVTdWJDbGFzcz4gY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzOworCisvLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhIHN5bWJvbCB0YWJsZSBvZiBuYW1lL3ZhbHVlIHBhaXJzLiBJdCBpcyBlc3NlbnRpYWxseQorLy8vIGEgc3RkOjptYXA8c3RkOjpzdHJpbmcsVmFsdWUqPiBidXQgaGFzIGEgY29udHJvbGxlZCBpbnRlcmZhY2UgcHJvdmlkZWQgYnkKKy8vLyBMTFZNIGFzIHdlbGwgYXMgZW5zdXJpbmcgdW5pcXVlbmVzcyBvZiBuYW1lcy4KKy8vLworY2xhc3MgVmFsdWVTeW1ib2xUYWJsZSB7CisgIGZyaWVuZCBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8QXJndW1lbnQ+OworICBmcmllbmQgY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzPEJhc2ljQmxvY2s+OworICBmcmllbmQgY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzPEZ1bmN0aW9uPjsKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbFRhYmxlTGlzdFRyYWl0czxHbG9iYWxBbGlhcz47CisgIGZyaWVuZCBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8R2xvYmFsSUZ1bmM+OworICBmcmllbmQgY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzPEdsb2JhbFZhcmlhYmxlPjsKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbFRhYmxlTGlzdFRyYWl0czxJbnN0cnVjdGlvbj47CisgIGZyaWVuZCBjbGFzcyBWYWx1ZTsKKworLy8vIEBuYW1lIFR5cGVzCisvLy8gQHsKK3B1YmxpYzoKKyAgLy8vIEBicmllZiBBIG1hcHBpbmcgb2YgbmFtZXMgdG8gdmFsdWVzLgorICB1c2luZyBWYWx1ZU1hcCA9IFN0cmluZ01hcDxWYWx1ZSo+OworCisgIC8vLyBAYnJpZWYgQW4gaXRlcmF0b3Igb3ZlciBhIFZhbHVlTWFwLgorICB1c2luZyBpdGVyYXRvciA9IFZhbHVlTWFwOjppdGVyYXRvcjsKKworICAvLy8gQGJyaWVmIEEgY29uc3RfaXRlcmF0b3Igb3ZlciBhIFZhbHVlTWFwLgorICB1c2luZyBjb25zdF9pdGVyYXRvciA9IFZhbHVlTWFwOjpjb25zdF9pdGVyYXRvcjsKKworLy8vIEB9CisvLy8gQG5hbWUgQ29uc3RydWN0b3JzCisvLy8gQHsKKworICBWYWx1ZVN5bWJvbFRhYmxlKCkgOiB2bWFwKDApIHt9CisgIH5WYWx1ZVN5bWJvbFRhYmxlKCk7CisKKy8vLyBAfQorLy8vIEBuYW1lIEFjY2Vzc29ycworLy8vIEB7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGZpbmRzIHRoZSB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBccCBOYW1lIGluIHRoZQorICAvLy8gdGhlIHN5bWJvbCB0YWJsZS4KKyAgLy8vIEByZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIFxwIE5hbWUKKyAgLy8vIEBicmllZiBMb29rdXAgYSBuYW1lZCBWYWx1ZS4KKyAgVmFsdWUgKmxvb2t1cChTdHJpbmdSZWYgTmFtZSkgY29uc3QgeyByZXR1cm4gdm1hcC5sb29rdXAoTmFtZSk7IH0KKworICAvLy8gQHJldHVybnMgdHJ1ZSBpZmYgdGhlIHN5bWJvbCB0YWJsZSBpcyBlbXB0eQorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgc3ltYm9sIHRhYmxlIGlzIGVtcHR5CisgIGlubGluZSBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gdm1hcC5lbXB0eSgpOyB9CisKKyAgLy8vIEBicmllZiBUaGUgbnVtYmVyIG9mIG5hbWUvdHlwZSBwYWlycyBpcyByZXR1cm5lZC4KKyAgaW5saW5lIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiB1bnNpZ25lZCh2bWFwLnNpemUoKSk7IH0KKworICAvLy8gVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmcm9tIHRoZSBkZWJ1Z2dlciB0byBkaXNwbGF5IHRoZQorICAvLy8gY29udGVudCBvZiB0aGUgc3ltYm9sIHRhYmxlIHdoaWxlIGRlYnVnZ2luZy4KKyAgLy8vIEBicmllZiBQcmludCBvdXQgc3ltYm9sIHRhYmxlIG9uIHN0ZGVycgorICB2b2lkIGR1bXAoKSBjb25zdDsKKworLy8vIEB9CisvLy8gQG5hbWUgSXRlcmF0aW9uCisvLy8gQHsKKworICAvLy8gQGJyaWVmIEdldCBhbiBpdGVyYXRvciB0aGF0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3ltYm9sIHRhYmxlLgorICBpbmxpbmUgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiB2bWFwLmJlZ2luKCk7IH0KKworICAvLy8gQGJyaWVmIEdldCBhIGNvbnN0X2l0ZXJhdG9yIHRoYXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzeW1ib2wgdGFibGUuCisgIGlubGluZSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHZtYXAuYmVnaW4oKTsgfQorCisgIC8vLyBAYnJpZWYgR2V0IGFuIGl0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIHN5bWJvbCB0YWJsZS4KKyAgaW5saW5lIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIHZtYXAuZW5kKCk7IH0KKworICAvLy8gQGJyaWVmIEdldCBhIGNvbnN0X2l0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIHN5bWJvbCB0YWJsZS4KKyAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIHZtYXAuZW5kKCk7IH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIE11dGF0b3JzCisgIC8vLyBAeworcHJpdmF0ZToKKyAgVmFsdWVOYW1lICptYWtlVW5pcXVlTmFtZShWYWx1ZSAqViwgU21hbGxTdHJpbmc8MjU2PiAmVW5pcXVlTmFtZSk7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGFkZHMgdGhlIHByb3ZpZGVkIHZhbHVlIFxwIE4gdG8gdGhlIHN5bWJvbCB0YWJsZS4gIFRoZSBWYWx1ZQorICAvLy8gbXVzdCBoYXZlIGEgbmFtZSB3aGljaCBpcyB1c2VkIHRvIHBsYWNlIHRoZSB2YWx1ZSBpbiB0aGUgc3ltYm9sIHRhYmxlLgorICAvLy8gSWYgdGhlIGluc2VydGVkIG5hbWUgY29uZmxpY3RzLCB0aGlzIHJlbmFtZXMgdGhlIHZhbHVlLgorICAvLy8gQGJyaWVmIEFkZCBhIG5hbWVkIHZhbHVlIHRvIHRoZSBzeW1ib2wgdGFibGUKKyAgdm9pZCByZWluc2VydFZhbHVlKFZhbHVlICpWKTsKKworICAvLy8gY3JlYXRlVmFsdWVOYW1lIC0gVGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gY3JlYXRlIGEgdmFsdWUgbmFtZSBhbmQgaW5zZXJ0CisgIC8vLyBpdCBpbnRvIHRoZSBzeW1ib2wgdGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuICBJZiBpdCBjb25mbGljdHMsIGl0CisgIC8vLyBhdXRvLXJlbmFtZXMgdGhlIG5hbWUgYW5kIHJldHVybnMgdGhhdCBpbnN0ZWFkLgorICBWYWx1ZU5hbWUgKmNyZWF0ZVZhbHVlTmFtZShTdHJpbmdSZWYgTmFtZSwgVmFsdWUgKlYpOworCisgIC8vLyBUaGlzIG1ldGhvZCByZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgc3ltYm9sIHRhYmxlLiAgSXQgbGVhdmVzIHRoZQorICAvLy8gVmFsdWVOYW1lIGF0dGFjaGVkIHRvIHRoZSB2YWx1ZSwgYnV0IGl0IGlzIG5vIGxvbmdlciBpbnNlcnRlZCBpbiB0aGUKKyAgLy8vIHN5bXRhYi4KKyAgdm9pZCByZW1vdmVWYWx1ZU5hbWUoVmFsdWVOYW1lICpWKTsKKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIEludGVybmFsIERhdGEKKyAgLy8vIEB7CisKKyAgVmFsdWVNYXAgdm1hcDsgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIG1hcCB0aGF0IGhvbGRzIHRoZSBzeW1ib2wgdGFibGUuCisgIG11dGFibGUgdWludDMyX3QgTGFzdFVuaXF1ZSA9IDA7ICAvLy88IENvdW50ZXIgZm9yIHRyYWNraW5nIHVuaXF1ZSBuYW1lcworCisvLy8gQH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX1ZBTFVFU1lNQk9MVEFCTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9WZXJpZmllci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9WZXJpZmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMTBmMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1ZlcmlmaWVyLmgKQEAgLTAsMCArMSwxNDkgQEAKKy8vPT09LSBWZXJpZmllci5oIC0gTExWTSBJUiBWZXJpZmllciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGZ1bmN0aW9uIHZlcmlmaWVyIGludGVyZmFjZSwgdGhhdCBjYW4gYmUgdXNlZCBmb3Igc29tZQorLy8gc2FuaXR5IGNoZWNraW5nIG9mIGlucHV0IHRvIHRoZSBzeXN0ZW0sIGFuZCBmb3IgY2hlY2tpbmcgdGhhdCB0cmFuc2Zvcm1hdGlvbnMKKy8vIGhhdmVuJ3QgZG9uZSBzb21ldGhpbmcgYmFkLgorLy8KKy8vIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IHByb3ZpZGUgZnVsbCAnamF2YSBzdHlsZScgc2VjdXJpdHkgYW5kIHZlcmlmaWNhdGlvbnMsCisvLyBpbnN0ZWFkIGl0IGp1c3QgdHJpZXMgdG8gZW5zdXJlIHRoYXQgY29kZSBpcyB3ZWxsIGZvcm1lZC4KKy8vCisvLyBUbyBzZWUgd2hhdCBzcGVjaWZpY2FsbHkgaXMgY2hlY2tlZCwgbG9vayBhdCB0aGUgdG9wIG9mIFZlcmlmaWVyLmNwcAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9WRVJJRklFUl9ICisjZGVmaW5lIExMVk1fSVJfVkVSSUZJRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBUEludDsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgRnVuY3Rpb25QYXNzOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBNRE5vZGU7CitjbGFzcyBNb2R1bGU7CitjbGFzcyByYXdfb3N0cmVhbTsKK3N0cnVjdCBWZXJpZmllclN1cHBvcnQ7CisKKy8vLyBWZXJpZnkgdGhhdCB0aGUgVEJBQSBNZXRhZGF0YXMgYXJlIHZhbGlkLgorY2xhc3MgVEJBQVZlcmlmaWVyIHsKKyAgVmVyaWZpZXJTdXBwb3J0ICpEaWFnbm9zdGljID0gbnVsbHB0cjsKKworICAvLy8gSGVscGVyIHRvIGRpYWdub3NlIGEgZmFpbHVyZQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHlzPiB2b2lkIENoZWNrRmFpbGVkKFR5cyAmJi4uLiBBcmdzKTsKKworICAvLy8gQ2FjaGUgb2YgVEJBQSBiYXNlIG5vZGVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gdmlzaXRlZC4gIFRoaXMgY2FjaGNlIG1hcHMKKyAgLy8vIGEgbm9kZSB0aGF0IGhhcyBiZWVuIHZpc2l0ZWQgdG8gYSBwYWlyIChJc0ludmFsaWQsIEJpdFdpZHRoKSB3aGVyZQorICAvLy8KKyAgLy8vICBcYyBJc0ludmFsaWQgaXMgdHJ1ZSBpZmYgdGhlIG5vZGUgaXMgaW52YWxpZC4KKyAgLy8vICBcYyBCaXRXaWR0aCwgaWYgbm9uLXplcm8sIGlzIHRoZSBiaXR3aWR0aCBvZiB0aGUgaW50ZWdlciB1c2VkIHRvIGRlbm90aW5nCisgIC8vLyAgICB0aGUgb2Zmc2V0IG9mIHRoZSBhY2Nlc3MuICBJZiB6ZXJvLCBvbmx5IGEgemVybyBvZmZzZXQgaXMgYWxsb3dlZC4KKyAgLy8vCisgIC8vLyBcYyBCaXRXaWR0aCBoYXMgbm8gbWVhbmluZyBpZiBcYyBJc0ludmFsaWQgaXMgdHJ1ZS4KKyAgdXNpbmcgVEJBQUJhc2VOb2RlU3VtbWFyeSA9IHN0ZDo6cGFpcjxib29sLCB1bnNpZ25lZD47CisgIERlbnNlTWFwPGNvbnN0IE1ETm9kZSAqLCBUQkFBQmFzZU5vZGVTdW1tYXJ5PiBUQkFBQmFzZU5vZGVzOworCisgIC8vLyBNYXBzIGFuIGFsbGVnZWQgc2NhbGFyIFRCQUEgbm9kZSB0byBhIGJvb2xlYW4gdGhhdCBpcyB0cnVlIGlmIHRoZSBzYWlkCisgIC8vLyBUQkFBIG5vZGUgaXMgYSB2YWxpZCBzY2FsYXIgVEJBQSBub2RlIG9yIGZhbHNlIG90aGVyd2lzZS4KKyAgRGVuc2VNYXA8Y29uc3QgTUROb2RlICosIGJvb2w+IFRCQUFTY2FsYXJOb2RlczsKKworICAvLy8gXG5hbWUgSGVscGVyIGZ1bmN0aW9ucyB1c2VkIGJ5IFxjIHZpc2l0VEJBQU1ldGFkYXRhLgorICAvLy8gQHsKKyAgTUROb2RlICpnZXRGaWVsZE5vZGVGcm9tVEJBQUJhc2VOb2RlKEluc3RydWN0aW9uICZJLCBjb25zdCBNRE5vZGUgKkJhc2VOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJk9mZnNldCwgYm9vbCBJc05ld0Zvcm1hdCk7CisgIFRCQUFWZXJpZmllcjo6VEJBQUJhc2VOb2RlU3VtbWFyeSB2ZXJpZnlUQkFBQmFzZU5vZGUoSW5zdHJ1Y3Rpb24gJkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUROb2RlICpCYXNlTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzTmV3Rm9ybWF0KTsKKyAgVEJBQUJhc2VOb2RlU3VtbWFyeSB2ZXJpZnlUQkFBQmFzZU5vZGVJbXBsKEluc3RydWN0aW9uICZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUROb2RlICpCYXNlTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNOZXdGb3JtYXQpOworCisgIGJvb2wgaXNWYWxpZFNjYWxhclRCQUFOb2RlKGNvbnN0IE1ETm9kZSAqTUQpOworICAvLy8gQH0KKworcHVibGljOgorICBUQkFBVmVyaWZpZXIoVmVyaWZpZXJTdXBwb3J0ICpEaWFnbm9zdGljID0gbnVsbHB0cikKKyAgICAgIDogRGlhZ25vc3RpYyhEaWFnbm9zdGljKSB7fQorICAvLy8gVmlzaXQgYW4gaW5zdHJ1Y3Rpb24gYW5kIHJldHVybiB0cnVlIGlmIGl0IGlzIHZhbGlkLCByZXR1cm4gZmFsc2UgaWYgYW4KKyAgLy8vIGludmFsaWQgVEJBQSBpcyBhdHRhY2hlZC4KKyAgYm9vbCB2aXNpdFRCQUFNZXRhZGF0YShJbnN0cnVjdGlvbiAmSSwgY29uc3QgTUROb2RlICpNRCk7Cit9OworCisvLy8gXGJyaWVmIENoZWNrIGEgZnVuY3Rpb24gZm9yIGVycm9ycywgdXNlZnVsIGZvciB1c2Ugd2hlbiBkZWJ1Z2dpbmcgYQorLy8vIHBhc3MuCisvLy8KKy8vLyBJZiB0aGVyZSBhcmUgbm8gZXJyb3JzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZS4gSWYgYW4gZXJyb3IgaXMgZm91bmQsCisvLy8gYSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGVycm9yIGlzIHdyaXR0ZW4gdG8gT1MgKGlmIG5vbi1udWxsKSBhbmQgdHJ1ZSBpcworLy8vIHJldHVybmVkLgorYm9vbCB2ZXJpZnlGdW5jdGlvbihjb25zdCBGdW5jdGlvbiAmRiwgcmF3X29zdHJlYW0gKk9TID0gbnVsbHB0cik7CisKKy8vLyBcYnJpZWYgQ2hlY2sgYSBtb2R1bGUgZm9yIGVycm9ycy4KKy8vLworLy8vIElmIHRoZXJlIGFyZSBubyBlcnJvcnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLiBJZiBhbiBlcnJvciBpcworLy8vIGZvdW5kLCBhIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgZXJyb3IgaXMgd3JpdHRlbiB0byBPUyAoaWYKKy8vLyBub24tbnVsbCkgYW5kIHRydWUgaXMgcmV0dXJuZWQuCisvLy8KKy8vLyBccmV0dXJuIHRydWUgaWYgdGhlIG1vZHVsZSBpcyBicm9rZW4uIElmIEJyb2tlbkRlYnVnSW5mbyBpcworLy8vIHN1cHBsaWVkLCBEZWJ1Z0luZm8gdmVyaWZpY2F0aW9uIGZhaWx1cmVzIHdvbid0IGJlIGNvbnNpZGVyZWQgYXMKKy8vLyBlcnJvciBhbmQgaW5zdGVhZCAqQnJva2VuRGVidWdJbmZvIHdpbGwgYmUgc2V0IHRvIHRydWUuIERlYnVnCisvLy8gaW5mbyBlcnJvcnMgY2FuIGJlICJyZWNvdmVyZWQiIGZyb20gYnkgc3RyaXBwaW5nIHRoZSBkZWJ1ZyBpbmZvLgorYm9vbCB2ZXJpZnlNb2R1bGUoY29uc3QgTW9kdWxlICZNLCByYXdfb3N0cmVhbSAqT1MgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgYm9vbCAqQnJva2VuRGVidWdJbmZvID0gbnVsbHB0cik7CisKK0Z1bmN0aW9uUGFzcyAqY3JlYXRlVmVyaWZpZXJQYXNzKGJvb2wgRmF0YWxFcnJvcnMgPSB0cnVlKTsKKworLy8vIENoZWNrIGEgbW9kdWxlIGZvciBlcnJvcnMsIGFuZCByZXBvcnQgc2VwYXJhdGUgZXJyb3Igc3RhdGVzIGZvciBJUgorLy8vIGFuZCBkZWJ1ZyBpbmZvIGVycm9ycy4KK2NsYXNzIFZlcmlmaWVyQW5hbHlzaXMgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48VmVyaWZpZXJBbmFseXNpcz4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48VmVyaWZpZXJBbmFseXNpcz47CisKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICBzdHJ1Y3QgUmVzdWx0IHsKKyAgICBib29sIElSQnJva2VuLCBEZWJ1Z0luZm9Ccm9rZW47CisgIH07CisKKyAgUmVzdWx0IHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmKTsKKyAgUmVzdWx0IHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJik7Cit9OworCisvLy8gQ2hlY2sgYSBtb2R1bGUgZm9yIGVycm9ycywgYnV0IHJlcG9ydCBkZWJ1ZyBpbmZvIGVycm9ycyBzZXBhcmF0ZWx5LgorLy8vIE90aGVyd2lzZSBiZWhhdmVzIGFzIHRoZSBub3JtYWwgdmVyaWZ5TW9kdWxlLiBEZWJ1ZyBpbmZvIGVycm9ycyBjYW4gYmUKKy8vLyAicmVjb3ZlcmVkIiBmcm9tIGJ5IHN0cmlwcGluZyB0aGUgZGVidWcgaW5mby4KK2Jvb2wgdmVyaWZ5TW9kdWxlKGJvb2wgJkJyb2tlbkRlYnVnSW5mbywgY29uc3QgTW9kdWxlICZNLCByYXdfb3N0cmVhbSAqT1MpOworCisvLy8gXGJyaWVmIENyZWF0ZSBhIHZlcmlmaWVyIHBhc3MuCisvLy8KKy8vLyBDaGVjayBhIG1vZHVsZSBvciBmdW5jdGlvbiBmb3IgdmFsaWRpdHkuIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBwYXNzIHdyYXBwZWQKKy8vLyBhcm91bmQgdGhlIGFib3ZlIHZlcmlmeUZ1bmN0aW9uIGFuZCB2ZXJpZnlNb2R1bGUgcm91dGluZXMgYW5kCisvLy8gZnVuY3Rpb25hbGl0eS4gV2hlbiB0aGUgcGFzcyBkZXRlY3RzIGEgdmVyaWZpY2F0aW9uIGVycm9yIGl0IGlzIGFsd2F5cworLy8vIHByaW50ZWQgdG8gc3RkZXJyLCBhbmQgYnkgZGVmYXVsdCB0aGV5IGFyZSBmYXRhbC4gWW91IGNhbiBvdmVycmlkZSB0aGF0IGJ5CisvLy8gcGFzc2luZyBcYyBmYWxzZSB0byBccCBGYXRhbEVycm9ycy4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIGNyZWF0ZXMgYSBwYXNzIHN1aXRhYmxlIGZvciB0aGUgbGVnYWN5IHBhc3MgbWFuYWdlci4gSXQgaGFzCisvLy8gbm90aGluZyB0byBkbyB3aXRoIFxjIFZlcmlmaWVyUGFzcy4KK2NsYXNzIFZlcmlmaWVyUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPFZlcmlmaWVyUGFzcz4geworICBib29sIEZhdGFsRXJyb3JzOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFZlcmlmaWVyUGFzcyhib29sIEZhdGFsRXJyb3JzID0gdHJ1ZSkgOiBGYXRhbEVycm9ycyhGYXRhbEVycm9ycykge30KKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJkFNKTsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfVkVSSUZJRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUlJlYWRlci9JUlJlYWRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUlJlYWRlci9JUlJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZGRlODkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSUmVhZGVyL0lSUmVhZGVyLmgKQEAgLTAsMCArMSw2MyBAQAorLy89PT0tLS0tIGxsdm0vSVJSZWFkZXIvSVJSZWFkZXIuaCAtIFJlYWRlciBmb3IgTExWTSBJUiBmaWxlcyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBmdW5jdGlvbnMgZm9yIHJlYWRpbmcgTExWTSBJUi4gVGhleSBzdXBwb3J0IGJvdGgKKy8vIEJpdGNvZGUgYW5kIEFzc2VtYmx5LCBhdXRvbWF0aWNhbGx5IGRldGVjdGluZyB0aGUgaW5wdXQgZm9ybWF0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUlJFQURFUl9JUlJFQURFUl9ICisjZGVmaW5lIExMVk1fSVJSRUFERVJfSVJSRUFERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFN0cmluZ1JlZjsKK2NsYXNzIE1lbW9yeUJ1ZmZlclJlZjsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFNNRGlhZ25vc3RpYzsKK2NsYXNzIExMVk1Db250ZXh0OworCisvLy8gSWYgdGhlIGdpdmVuIGZpbGUgaG9sZHMgYSBiaXRjb2RlIGltYWdlLCByZXR1cm4gYSBNb2R1bGUKKy8vLyBmb3IgaXQgd2hpY2ggZG9lcyBsYXp5IGRlc2VyaWFsaXphdGlvbiBvZiBmdW5jdGlvbiBib2RpZXMuICBPdGhlcndpc2UsCisvLy8gYXR0ZW1wdCB0byBwYXJzZSBpdCBhcyBMTFZNIEFzc2VtYmx5IGFuZCByZXR1cm4gYSBmdWxseSBwb3B1bGF0ZWQKKy8vLyBNb2R1bGUuIFRoZSBTaG91bGRMYXp5TG9hZE1ldGFkYXRhIGZsYWcgaXMgcGFzc2VkIGRvd24gdG8gdGhlIGJpdGNvZGUKKy8vLyByZWFkZXIgdG8gb3B0aW9uYWxseSBlbmFibGUgbGF6eSBtZXRhZGF0YSBsb2FkaW5nLgorc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4KK2dldExhenlJUkZpbGVNb2R1bGUoU3RyaW5nUmVmIEZpbGVuYW1lLCBTTURpYWdub3N0aWMgJkVyciwgTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkTGF6eUxvYWRNZXRhZGF0YSA9IGZhbHNlKTsKKworLy8vIElmIHRoZSBnaXZlbiBNZW1vcnlCdWZmZXIgaG9sZHMgYSBiaXRjb2RlIGltYWdlLCByZXR1cm4gYSBNb2R1bGUKKy8vLyBmb3IgaXQuICBPdGhlcndpc2UsIGF0dGVtcHQgdG8gcGFyc2UgaXQgYXMgTExWTSBBc3NlbWJseSBhbmQgcmV0dXJuCisvLy8gYSBNb2R1bGUgZm9yIGl0LgorLy8vIFxwYXJhbSBVcGdyYWRlRGVidWdJbmZvIFJ1biBVcGdyYWRlRGVidWdJbmZvLCB3aGljaCBydW5zIHRoZSBWZXJpZmllci4KKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSBzZXQgdG8gZmFsc2UgYnkgbGx2bS1hcworLy8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB1c2UgaW5zaWRlIHRoZSBMTFZNIHRlc3R1aXRlIQorLy8vIFxwYXJhbSBEYXRhTGF5b3V0U3RyaW5nIE92ZXJyaWRlIGRhdGFsYXlvdXQgaW4gdGhlIGxsdm0gYXNzZW1ibHkuCitzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBwYXJzZUlSKE1lbW9yeUJ1ZmZlclJlZiBCdWZmZXIsIFNNRGlhZ25vc3RpYyAmRXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVcGdyYWRlRGVidWdJbmZvID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERhdGFMYXlvdXRTdHJpbmcgPSAiIik7CisKKy8vLyBJZiB0aGUgZ2l2ZW4gZmlsZSBob2xkcyBhIGJpdGNvZGUgaW1hZ2UsIHJldHVybiBhIE1vZHVsZSBmb3IgaXQuCisvLy8gT3RoZXJ3aXNlLCBhdHRlbXB0IHRvIHBhcnNlIGl0IGFzIExMVk0gQXNzZW1ibHkgYW5kIHJldHVybiBhIE1vZHVsZQorLy8vIGZvciBpdC4KKy8vLyBccGFyYW0gVXBncmFkZURlYnVnSW5mbyBSdW4gVXBncmFkZURlYnVnSW5mbywgd2hpY2ggcnVucyB0aGUgVmVyaWZpZXIuCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gc2hvdWxkIG9ubHkgYmUgc2V0IHRvIGZhbHNlIGJ5IGxsdm0tYXMKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdXNlIGluc2lkZSB0aGUgTExWTSB0ZXN0dWl0ZSEKKy8vLyBccGFyYW0gRGF0YUxheW91dFN0cmluZyBPdmVycmlkZSBkYXRhbGF5b3V0IGluIHRoZSBsbHZtIGFzc2VtYmx5Lgorc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gcGFyc2VJUkZpbGUoU3RyaW5nUmVmIEZpbGVuYW1lLCBTTURpYWdub3N0aWMgJkVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVcGdyYWRlRGVidWdJbmZvID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEYXRhTGF5b3V0U3RyaW5nID0gIiIpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSW5pdGlhbGl6ZVBhc3Nlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Jbml0aWFsaXplUGFzc2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhNTExMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSW5pdGlhbGl6ZVBhc3Nlcy5oCkBAIC0wLDAgKzEsMzk1IEBACisvLz09PS0gbGx2bS9Jbml0aWFsaXplUGFzc2VzLmggLSBJbml0aWFsaXplIEFsbCBQYXNzZXMgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBmb3IgdGhlIHBhc3MgaW5pdGlhbGl6YXRpb24gcm91dGluZXMKKy8vIGZvciB0aGUgZW50aXJlIExMVk0gcHJvamVjdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSU5JVElBTElaRVBBU1NFU19ICisjZGVmaW5lIExMVk1fSU5JVElBTElaRVBBU1NFU19ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgUGFzc1JlZ2lzdHJ5OworCisvLy8gSW5pdGlhbGl6ZSBhbGwgcGFzc2VzIGxpbmtlZCBpbnRvIHRoZSBUcmFuc2Zvcm1VdGlscyBsaWJyYXJ5Lgordm9pZCBpbml0aWFsaXplQ29yZShQYXNzUmVnaXN0cnkmKTsKKworLy8vIEluaXRpYWxpemUgYWxsIHBhc3NlcyBsaW5rZWQgaW50byB0aGUgVHJhbnNmb3JtVXRpbHMgbGlicmFyeS4KK3ZvaWQgaW5pdGlhbGl6ZVRyYW5zZm9ybVV0aWxzKFBhc3NSZWdpc3RyeSYpOworCisvLy8gSW5pdGlhbGl6ZSBhbGwgcGFzc2VzIGxpbmtlZCBpbnRvIHRoZSBTY2FsYXJPcHRzIGxpYnJhcnkuCit2b2lkIGluaXRpYWxpemVTY2FsYXJPcHRzKFBhc3NSZWdpc3RyeSYpOworCisvLy8gSW5pdGlhbGl6ZSBhbGwgcGFzc2VzIGxpbmtlZCBpbnRvIHRoZSBPYmpDQVJDT3B0cyBsaWJyYXJ5Lgordm9pZCBpbml0aWFsaXplT2JqQ0FSQ09wdHMoUGFzc1JlZ2lzdHJ5Jik7CisKKy8vLyBJbml0aWFsaXplIGFsbCBwYXNzZXMgbGlua2VkIGludG8gdGhlIFZlY3Rvcml6ZSBsaWJyYXJ5Lgordm9pZCBpbml0aWFsaXplVmVjdG9yaXphdGlvbihQYXNzUmVnaXN0cnkmKTsKKworLy8vIEluaXRpYWxpemUgYWxsIHBhc3NlcyBsaW5rZWQgaW50byB0aGUgSW5zdENvbWJpbmUgbGlicmFyeS4KK3ZvaWQgaW5pdGlhbGl6ZUluc3RDb21iaW5lKFBhc3NSZWdpc3RyeSYpOworCisvLy8gSW5pdGlhbGl6ZSBhbGwgcGFzc2VzIGxpbmtlZCBpbnRvIHRoZSBJUE8gbGlicmFyeS4KK3ZvaWQgaW5pdGlhbGl6ZUlQTyhQYXNzUmVnaXN0cnkmKTsKKworLy8vIEluaXRpYWxpemUgYWxsIHBhc3NlcyBsaW5rZWQgaW50byB0aGUgSW5zdHJ1bWVudGF0aW9uIGxpYnJhcnkuCit2b2lkIGluaXRpYWxpemVJbnN0cnVtZW50YXRpb24oUGFzc1JlZ2lzdHJ5Jik7CisKKy8vLyBJbml0aWFsaXplIGFsbCBwYXNzZXMgbGlua2VkIGludG8gdGhlIEFuYWx5c2lzIGxpYnJhcnkuCit2b2lkIGluaXRpYWxpemVBbmFseXNpcyhQYXNzUmVnaXN0cnkmKTsKKworLy8vIEluaXRpYWxpemUgYWxsIHBhc3NlcyBsaW5rZWQgaW50byB0aGUgQ29yb3V0aW5lcyBsaWJyYXJ5Lgordm9pZCBpbml0aWFsaXplQ29yb3V0aW5lcyhQYXNzUmVnaXN0cnkmKTsKKworLy8vIEluaXRpYWxpemUgYWxsIHBhc3NlcyBsaW5rZWQgaW50byB0aGUgQ29kZUdlbiBsaWJyYXJ5Lgordm9pZCBpbml0aWFsaXplQ29kZUdlbihQYXNzUmVnaXN0cnkmKTsKKworLy8vIEluaXRpYWxpemUgYWxsIHBhc3NlcyBsaW5rZWQgaW50byB0aGUgR2xvYmFsSVNlbCBsaWJyYXJ5Lgordm9pZCBpbml0aWFsaXplR2xvYmFsSVNlbChQYXNzUmVnaXN0cnkmKTsKKworLy8vIEluaXRpYWxpemUgYWxsIHBhc3NlcyBsaW5rZWQgaW50byB0aGUgQ29kZUdlbiBsaWJyYXJ5Lgordm9pZCBpbml0aWFsaXplVGFyZ2V0KFBhc3NSZWdpc3RyeSYpOworCit2b2lkIGluaXRpYWxpemVBQUV2YWxMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUFBUmVzdWx0c1dyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUFEQ0VMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUFkZERpc2NyaW1pbmF0b3JzTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVBZGRyZXNzU2FuaXRpemVyTW9kdWxlUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUFkZHJlc3NTYW5pdGl6ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQWdncmVzc2l2ZUluc3RDb21iaW5lckxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQWxpYXNTZXRQcmludGVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUFsaWdubWVudEZyb21Bc3N1bXB0aW9uc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVBbHdheXNJbmxpbmVyTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVBcmdQcm9tb3Rpb25QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQXNzdW1wdGlvbkNhY2hlVHJhY2tlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVBdG9taWNFeHBhbmRQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQkRDRUxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQmFycmllck5vb3BQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQmFzaWNBQVdyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUJsb2NrRXh0cmFjdG9yUGFzcyhQYXNzUmVnaXN0cnkgJik7Cit2b2lkIGluaXRpYWxpemVCbG9ja0ZyZXF1ZW5jeUluZm9XcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVCb3VuZHNDaGVja2luZ0xlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQnJhbmNoRm9sZGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVCcmFuY2hQcm9iYWJpbGl0eUluZm9XcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVCcmFuY2hSZWxheGF0aW9uUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUJyZWFrQ3JpdGljYWxFZGdlc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVCcmVha0ZhbHNlRGVwc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVDYWxsU2l0ZVNwbGl0dGluZ0xlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQ0ZHT25seVByaW50ZXJMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUNGR09ubHlWaWV3ZXJMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUNGR1ByaW50ZXJMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUNGR1NpbXBsaWZ5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVDRkdWaWV3ZXJMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUNGTEFuZGVyc0FBV3JhcHBlclBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQ0ZMU3RlZW5zQUFXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVDYWxsR3JhcGhET1RQcmludGVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUNhbGxHcmFwaFByaW50ZXJMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUNhbGxHcmFwaFZpZXdlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVDYWxsR3JhcGhXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVDb2RlR2VuUHJlcGFyZVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVDb25zdGFudEhvaXN0aW5nTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVDYWxsZWRWYWx1ZVByb3BhZ2F0aW9uTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5ICYpOwordm9pZCBpbml0aWFsaXplQ29uc3RhbnRNZXJnZUxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQ29uc3RhbnRQcm9wYWdhdGlvblBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVDb3JyZWxhdGVkVmFsdWVQcm9wYWdhdGlvblBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVDb3N0TW9kZWxBbmFseXNpc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVFYXJseU1hY2hpbmVMSUNNUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUVhcmx5VGFpbER1cGxpY2F0ZVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVFbnRyeUV4aXRJbnN0cnVtZW50ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUG9zdElubGluZUVudHJ5RXhpdEluc3RydW1lbnRlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVDcm9zc0RTT0NGSVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVEQUVQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplREFIUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZURDRUxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRFNFTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVEYXRhRmxvd1Nhbml0aXplclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVEZWFkSW5zdEVsaW1pbmF0aW9uUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZURlYWRNYWNoaW5lSW5zdHJ1Y3Rpb25FbGltUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZURlbGluZWFyaXphdGlvblBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVEZW1hbmRlZEJpdHNXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVEZXBlbmRlbmNlQW5hbHlzaXNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRGVwZW5kZW5jZUFuYWx5c2lzV3JhcHBlclBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRGV0ZWN0RGVhZExhbmVzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZURpdmVyZ2VuY2VBbmFseXNpc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVEaXZSZW1QYWlyc0xlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRG9tT25seVByaW50ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRG9tT25seVZpZXdlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVEb21QcmludGVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZURvbVZpZXdlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVEb21pbmFuY2VGcm9udGllcldyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZURvbWluYXRvclRyZWVXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVEd2FyZkVIUHJlcGFyZVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVFYXJseUNTRUxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRWFybHlDU0VNZW1TU0FMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUVhcmx5SWZDb252ZXJ0ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRWRnZUJ1bmRsZXNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRWZmaWNpZW5jeVNhbml0aXplclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVFbGltaW5hdGVBdmFpbGFibGVFeHRlcm5hbGx5TGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVFeHBhbmRJU2VsUHNldWRvc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVFeHBhbmRNZW1DbXBQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUV4cGFuZFBvc3RSQVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVFeHBhbmRSZWR1Y3Rpb25zUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUV4dGVybmFsQUFXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVGRW50cnlJbnNlcnRlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVGaW5hbGl6ZU1hY2hpbmVCdW5kbGVzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUZsYXR0ZW5DRkdQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUZsb2F0MkludExlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRm9yY2VGdW5jdGlvbkF0dHJzTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVGb3J3YXJkQ29udHJvbEZsb3dJbnRlZ3JpdHlQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRnVuY2xldExheW91dFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVGdW5jdGlvbkltcG9ydExlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplR0NNYWNoaW5lQ29kZUFuYWx5c2lzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUdDTW9kdWxlSW5mb1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVHQ09WUHJvZmlsZXJMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUdWTkhvaXN0TGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVHVk5MZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUdWTlNpbmtMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUdsb2JhbERDRUxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplR2xvYmFsTWVyZ2VQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplR2xvYmFsT3B0TGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVHbG9iYWxTcGxpdFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVHbG9iYWxzQUFXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVHdWFyZFdpZGVuaW5nTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVJUENQUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUlQU0NDUExlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplSVJUcmFuc2xhdG9yUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUlWVXNlcnNXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVJZkNvbnZlcnRlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVJbXBsaWNpdE51bGxDaGVja3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplSW5kVmFyU2ltcGxpZnlMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUluZGlyZWN0QnJFeHBhbmRQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUlSQ0VMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUluZmVyQWRkcmVzc1NwYWNlc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVJbmZlckZ1bmN0aW9uQXR0cnNMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUlubGluZUNvc3RBbmFseXNpc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVJbnN0Q291bnRQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplSW5zdE5hbWVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUluc3RTaW1wbGlmaWVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUluc3RyUHJvZmlsaW5nTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplSW5zdHJ1Y3Rpb25TZWxlY3RQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplSW50ZXJsZWF2ZWRBY2Nlc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplSW50ZXJuYWxpemVMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUludGVydmFsUGFydGl0aW9uUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUp1bXBUaHJlYWRpbmdQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTENTU0FWZXJpZmljYXRpb25QYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxDU1NBV3JhcHBlclBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTGF6eUJsb2NrRnJlcXVlbmN5SW5mb1Bhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTGF6eUJyYW5jaFByb2JhYmlsaXR5SW5mb1Bhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTGF6eU1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm9QYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxhenlWYWx1ZUluZm9QcmludGVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxhenlWYWx1ZUluZm9XcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMZWdhY3lMSUNNUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMZWdhY3lMb29wU2lua1Bhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTGVnYWxpemVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxpYkNhbGxzU2hyaW5rV3JhcExlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTGludFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMaXZlRGVidWdWYWx1ZXNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTGl2ZURlYnVnVmFyaWFibGVzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxpdmVJbnRlcnZhbHNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTGl2ZVJhbmdlU2hyaW5rUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxpdmVSZWdNYXRyaXhQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTGl2ZVN0YWNrc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMaXZlVmFyaWFibGVzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvYWRTdG9yZVZlY3Rvcml6ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG9hZGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb2NhbFN0YWNrU2xvdFBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG9jYWxpemVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvb3BBY2Nlc3NMZWdhY3lBbmFseXNpc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb29wRGF0YVByZWZldGNoTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb29wRGVsZXRpb25MZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvb3BEaXN0cmlidXRlTGVnYWN5UGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvb3BFeHRyYWN0b3JQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG9vcElkaW9tUmVjb2duaXplTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb29wSW5mb1dyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvb3BJbnRlcmNoYW5nZVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb29wTG9hZEVsaW1pbmF0aW9uUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvb3BQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvb3BQcmVkaWNhdGlvbkxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG9vcFJlcm9sbFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb29wUm90YXRlTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb29wU2ltcGxpZnlDRkdMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvb3BTaW1wbGlmeVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb29wU3RyZW5ndGhSZWR1Y2VQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG9vcFVucm9sbFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb29wVW5zd2l0Y2hQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG9vcFZlY3Rvcml6ZVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb29wVmVyc2lvbmluZ0xJQ01QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG9vcFZlcnNpb25pbmdQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvd2VyQXRvbWljTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb3dlckVtdVRMU1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb3dlckV4cGVjdEludHJpbnNpY1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb3dlckd1YXJkSW50cmluc2ljTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb3dlckludHJpbnNpY3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG93ZXJJbnZva2VMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvd2VyU3dpdGNoUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvd2VyVHlwZVRlc3RzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1JUlByaW50aW5nUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1hY2hpbmVCbG9ja1BsYWNlbWVudFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNYWNoaW5lQmxvY2tQbGFjZW1lbnRTdGF0c1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNYWNoaW5lQnJhbmNoUHJvYmFiaWxpdHlJbmZvUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1hY2hpbmVDU0VQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWFjaGluZUNvbWJpbmVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1hY2hpbmVDb3B5UHJvcGFnYXRpb25QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWFjaGluZURvbWluYW5jZUZyb250aWVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1hY2hpbmVEb21pbmF0b3JUcmVlUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1hY2hpbmVGdW5jdGlvblByaW50ZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1hY2hpbmVMSUNNUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1hY2hpbmVMb29wSW5mb1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNYWNoaW5lTW9kdWxlSW5mb1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlclBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWFjaGluZU91dGxpbmVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1hY2hpbmVQaXBlbGluZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWFjaGluZVBvc3REb21pbmF0b3JUcmVlUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1hY2hpbmVSZWdpb25JbmZvUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNYWNoaW5lU2NoZWR1bGVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1hY2hpbmVTaW5raW5nUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1hY2hpbmVUcmFjZU1ldHJpY3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWFjaGluZVZlcmlmaWVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNZW1DcHlPcHRMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1lbURlcFByaW50ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWVtRGVyZWZQcmludGVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1lbW9yeURlcGVuZGVuY2VXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNZW1vcnlTU0FQcmludGVyTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNZW1vcnlTU0FXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNZW1vcnlTYW5pdGl6ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWVyZ2VGdW5jdGlvbnNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWVyZ2VJQ21wc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNZXJnZWRMb2FkU3RvcmVNb3Rpb25MZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1ldGFSZW5hbWVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1vZHVsZURlYnVnSW5mb1ByaW50ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTW9kdWxlU3VtbWFyeUluZGV4V3JhcHBlclBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTXVzdEV4ZWN1dGVQcmludGVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU5hbWVBbm9uR2xvYmFsTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVOYXJ5UmVhc3NvY2lhdGVMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU5ld0dWTkxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplT2JqQ0FSQ0FBV3JhcHBlclBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplT2JqQ0FSQ0FQRWxpbVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVPYmpDQVJDQ29udHJhY3RQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplT2JqQ0FSQ0V4cGFuZFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVPYmpDQVJDT3B0UGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU9wdGltaXphdGlvblJlbWFya0VtaXR0ZXJXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVPcHRpbWl6ZVBISXNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUEFFdmFsUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVBFSVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQR09JbmRpcmVjdENhbGxQcm9tb3Rpb25MZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVBHT0luc3RydW1lbnRhdGlvbkdlbkxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUEdPSW5zdHJ1bWVudGF0aW9uVXNlTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQR09NZW1PUFNpemVPcHRMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVBISUVsaW1pbmF0aW9uUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVBhcnRpYWxJbmxpbmVyTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQYXJ0aWFsbHlJbmxpbmVMaWJDYWxsc0xlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUGF0Y2hhYmxlRnVuY3Rpb25QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUGVlcGhvbGVPcHRpbWl6ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUGh5c2ljYWxSZWdpc3RlclVzYWdlSW5mb1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQbGFjZUJhY2tlZGdlU2FmZXBvaW50c0ltcGxQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUGxhY2VTYWZlcG9pbnRzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVBvc3REb21Pbmx5UHJpbnRlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQb3N0RG9tT25seVZpZXdlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQb3N0RG9tUHJpbnRlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQb3N0RG9tVmlld2VyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVBvc3REb21pbmF0b3JUcmVlV3JhcHBlclBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUG9zdE1hY2hpbmVTY2hlZHVsZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUG9zdE9yZGVyRnVuY3Rpb25BdHRyc0xlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUG9zdFJBSGF6YXJkUmVjb2duaXplclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQb3N0UkFNYWNoaW5lU2lua2luZ1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQb3N0UkFTY2hlZHVsZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUHJlSVNlbEludHJpbnNpY0xvd2VyaW5nTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQcmVkaWNhdGVJbmZvUHJpbnRlckxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUHJpbnRCYXNpY0Jsb2NrUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQcmludEZ1bmN0aW9uUGFzc1dyYXBwZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUHJpbnRNb2R1bGVQYXNzV3JhcHBlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQcm9jZXNzSW1wbGljaXREZWZzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVByb2ZpbGVTdW1tYXJ5SW5mb1dyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVByb21vdGVMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVBydW5lRUhQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUkFCYXNpY1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVSZWdBbGxvY0Zhc3RQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUkFHcmVlZHlQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUmVhc3NvY2lhdGVMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVJlZ0JhbmtTZWxlY3RQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUmVhY2hpbmdEZWZBbmFseXNpc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVSZWdUb01lbVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVSZWdpb25JbmZvUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVSZWdpb25Pbmx5UHJpbnRlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVSZWdpb25Pbmx5Vmlld2VyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVJlZ2lvblByaW50ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUmVnaW9uVmlld2VyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVJlZ2lzdGVyQ29hbGVzY2VyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVJlbmFtZUluZGVwZW5kZW50U3VicmVnc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVSZXNldE1hY2hpbmVGdW5jdGlvblBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVSZXZlcnNlUG9zdE9yZGVyRnVuY3Rpb25BdHRyc0xlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUmV3cml0ZVN0YXRlcG9pbnRzRm9yR0NMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkgJik7Cit2b2lkIGluaXRpYWxpemVSZXdyaXRlU3ltYm9sc0xlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU2FmZXBvaW50SVJWZXJpZmllclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTQ0NQTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTQ0VWQUFXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTTFBWZWN0b3JpemVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVNST0FMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVNhZmVTdGFja0xlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU2FtcGxlUHJvZmlsZUxvYWRlckxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU2FuaXRpemVyQ292ZXJhZ2VNb2R1bGVQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU2NhbGFyRXZvbHV0aW9uV3JhcHBlclBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU2NhbGFyaXplTWFza2VkTWVtSW50cmluUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVNjYWxhcml6ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU2NhdmVuZ2VyVGVzdFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTY29wZWROb0FsaWFzQUFXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTZXBhcmF0ZUNvbnN0T2Zmc2V0RnJvbUdFUFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTaGFkb3dTdGFja0dDTG93ZXJpbmdQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU2hyaW5rV3JhcFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTaW1wbGVJbmxpbmVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVNpbXBsZUxvb3BVbnN3aXRjaExlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU2luZ2xlTG9vcEV4dHJhY3RvclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTaW5raW5nTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTakxqRUhQcmVwYXJlUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVNsb3RJbmRleGVzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVNwZWN1bGF0aXZlRXhlY3V0aW9uTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTcGlsbFBsYWNlbWVudFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTdGFja0NvbG9yaW5nUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVN0YWNrTWFwTGl2ZW5lc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU3RhY2tQcm90ZWN0b3JQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU3RhY2tTbG90Q29sb3JpbmdQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU3RyYWlnaHRMaW5lU3RyZW5ndGhSZWR1Y2VQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU3RyaXBEZWFkRGVidWdJbmZvUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVN0cmlwRGVhZFByb3RvdHlwZXNMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVN0cmlwRGVidWdEZWNsYXJlUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVN0cmlwR0NSZWxvY2F0ZXNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU3RyaXBOb25EZWJ1Z1N5bWJvbHNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU3RyaXBOb25MaW5lVGFibGVEZWJ1Z0luZm9QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU3RyaXBTeW1ib2xzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVN0cnVjdHVyaXplQ0ZHUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUhXQWRkcmVzc1Nhbml0aXplclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVUYWlsQ2FsbEVsaW1QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplVGFpbER1cGxpY2F0ZVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVUYXJnZXRMaWJyYXJ5SW5mb1dyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVRhcmdldFBhc3NDb25maWdQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplVGFyZ2V0VHJhbnNmb3JtSW5mb1dyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVRocmVhZFNhbml0aXplclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVUd29BZGRyZXNzSW5zdHJ1Y3Rpb25QYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVR5cGVCYXNlZEFBV3JhcHBlclBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplVW5pZnlGdW5jdGlvbkV4aXROb2Rlc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVVbnBhY2tNYWNoaW5lQnVuZGxlc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVVbnJlYWNoYWJsZUJsb2NrRWxpbUxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplVW5yZWFjaGFibGVNYWNoaW5lQmxvY2tFbGltUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVZlcmlmaWVyTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVWaXJ0UmVnTWFwUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVZpcnRSZWdSZXdyaXRlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVXaG9sZVByb2dyYW1EZXZpcnRQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplV2luRUhQcmVwYXJlUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVdyaXRlQml0Y29kZVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplV3JpdGVUaGluTFRPQml0Y29kZVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVYUmF5SW5zdHJ1bWVudGF0aW9uUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1JUkNhbm9uaWNhbGl6ZXJQYXNzKFBhc3NSZWdpc3RyeSAmKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSU5JVElBTElaRVBBU1NFU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xUTy9DYWNoaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xUTy9DYWNoaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwMWFiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL0NhY2hpbmcuaApAQCAtMCwwICsxLDQwIEBACisvLz09PS0gQ2FjaGluZy5oIC0gTExWTSBMaW5rIFRpbWUgT3B0aW1pemVyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBsb2NhbENhY2hlIGZ1bmN0aW9uLCB3aGljaCBhbGxvd3MgY2xpZW50cyB0byBhZGQgYQorLy8gZmlsZXN5c3RlbSBjYWNoZSB0byBUaGluTFRPLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9MVE9fQ0FDSElOR19ICisjZGVmaW5lIExMVk1fTFRPX0NBQ0hJTkdfSAorCisjaW5jbHVkZSAibGx2bS9MVE8vTFRPLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgbHRvIHsKKworLy8vIFRoaXMgdHlwZSBkZWZpbmVzIHRoZSBjYWxsYmFjayB0byBhZGQgYSBwcmUtZXhpc3RpbmcgbmF0aXZlIG9iamVjdCBmaWxlCisvLy8gKGUuZy4gaW4gYSBjYWNoZSkuCisvLy8KKy8vLyBCdWZmZXIgY2FsbGJhY2tzIG11c3QgYmUgdGhyZWFkIHNhZmUuCit0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCh1bnNpZ25lZCBUYXNrLCBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBNQik+CisgICAgQWRkQnVmZmVyRm47CisKKy8vLyBDcmVhdGUgYSBsb2NhbCBmaWxlIHN5c3RlbSBjYWNoZSB3aGljaCB1c2VzIHRoZSBnaXZlbiBjYWNoZSBkaXJlY3RvcnkgYW5kCisvLy8gZmlsZSBjYWxsYmFjay4gVGhpcyBmdW5jdGlvbiBhbHNvIGNyZWF0ZXMgdGhlIGNhY2hlIGRpcmVjdG9yeSBpZiBpdCBkb2VzIG5vdAorLy8vIGFscmVhZHkgZXhpc3QuCitFeHBlY3RlZDxOYXRpdmVPYmplY3RDYWNoZT4gbG9jYWxDYWNoZShTdHJpbmdSZWYgQ2FjaGVEaXJlY3RvcnlQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkQnVmZmVyRm4gQWRkQnVmZmVyKTsKKworfSAvLyBuYW1lc3BhY2UgbHRvCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MVE8vQ29uZmlnLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xUTy9Db25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQ5ODFjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MVE8vQ29uZmlnLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8vPT09LUNvbmZpZy5oIC0gTExWTSBMaW5rIFRpbWUgT3B0aW1pemVyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGx0bzo6Q29uZmlnIGRhdGEgc3RydWN0dXJlLCB3aGljaCBhbGxvd3MgY2xpZW50cyB0bworLy8gY29uZmlndXJlIExUTy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTFRPX0NPTkZJR19ICisjZGVmaW5lIExMVk1fTFRPX0NPTkZJR19ICisKKyNpbmNsdWRlICJsbHZtL0lSL0RpYWdub3N0aWNJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvZGVHZW4uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBFcnJvcjsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIE1vZHVsZVN1bW1hcnlJbmRleDsKK2NsYXNzIHJhd19wd3JpdGVfc3RyZWFtOworCituYW1lc3BhY2UgbHRvIHsKKworLy8vIExUTyBjb25maWd1cmF0aW9uLiBBIGxpbmtlciBjYW4gY29uZmlndXJlIExUTyBieSBzZXR0aW5nIGZpZWxkcyBpbiB0aGlzIGRhdGEKKy8vLyBzdHJ1Y3R1cmUgYW5kIHBhc3NpbmcgaXQgdG8gdGhlIGx0bzo6TFRPIGNvbnN0cnVjdG9yLgorc3RydWN0IENvbmZpZyB7CisgIC8vIE5vdGU6IHdoZW4gYWRkaW5nIGZpZWxkcyBoZXJlLCBjb25zaWRlciB3aGV0aGVyIHRoZXkgbmVlZCB0byBiZSBhZGRlZCB0bworICAvLyBjb21wdXRlQ2FjaGVLZXkgaW4gTFRPLmNwcC4KKyAgc3RkOjpzdHJpbmcgQ1BVOworICBUYXJnZXRPcHRpb25zIE9wdGlvbnM7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBNQXR0cnM7CisgIE9wdGlvbmFsPFJlbG9jOjpNb2RlbD4gUmVsb2NNb2RlbCA9IFJlbG9jOjpQSUNfOworICBPcHRpb25hbDxDb2RlTW9kZWw6Ok1vZGVsPiBDb2RlTW9kZWwgPSBOb25lOworICBDb2RlR2VuT3B0OjpMZXZlbCBDR09wdExldmVsID0gQ29kZUdlbk9wdDo6RGVmYXVsdDsKKyAgVGFyZ2V0TWFjaGluZTo6Q29kZUdlbkZpbGVUeXBlIENHRmlsZVR5cGUgPSBUYXJnZXRNYWNoaW5lOjpDR0ZUX09iamVjdEZpbGU7CisgIHVuc2lnbmVkIE9wdExldmVsID0gMjsKKyAgYm9vbCBEaXNhYmxlVmVyaWZ5ID0gZmFsc2U7CisKKyAgLy8vIFVzZSB0aGUgbmV3IHBhc3MgbWFuYWdlcgorICBib29sIFVzZU5ld1BNID0gZmFsc2U7CisKKyAgLy8vIERpc2FibGUgZW50aXJlbHkgdGhlIG9wdGltaXplciwgaW5jbHVkaW5nIGltcG9ydGluZyBmb3IgVGhpbkxUTworICBib29sIENvZGVHZW5Pbmx5ID0gZmFsc2U7CisKKyAgLy8vIElmIHRoaXMgZmllbGQgaXMgc2V0LCB0aGUgc2V0IG9mIHBhc3NlcyBydW4gaW4gdGhlIG1pZGRsZS1lbmQgb3B0aW1pemVyCisgIC8vLyB3aWxsIGJlIHRoZSBvbmUgc3BlY2lmaWVkIGJ5IHRoZSBzdHJpbmcuIE9ubHkgd29ya3Mgd2l0aCB0aGUgbmV3IHBhc3MKKyAgLy8vIG1hbmFnZXIgYXMgdGhlIG9sZCBvbmUgZG9lc24ndCBoYXZlIHRoaXMgYWJpbGl0eS4KKyAgc3RkOjpzdHJpbmcgT3B0UGlwZWxpbmU7CisKKyAgLy8gSWYgdGhpcyBmaWVsZCBpcyBzZXQsIGl0IGhhcyB0aGUgc2FtZSBlZmZlY3Qgb2Ygc3BlY2lmeWluZyBhbiBBQSBwaXBlbGluZQorICAvLyBpZGVudGlmaWVkIGJ5IHRoZSBzdHJpbmcuIE9ubHkgd29ya3Mgd2l0aCB0aGUgbmV3IHBhc3MgbWFuYWdlciwgaW4KKyAgLy8gY29uanVuY3Rpb24gT3B0UGlwZWxpbmUuCisgIHN0ZDo6c3RyaW5nIEFBUGlwZWxpbmU7CisKKyAgLy8vIFNldHRpbmcgdGhpcyBmaWVsZCB3aWxsIHJlcGxhY2UgdGFyZ2V0IHRyaXBsZXMgaW4gaW5wdXQgZmlsZXMgd2l0aCB0aGlzCisgIC8vLyB0cmlwbGUuCisgIHN0ZDo6c3RyaW5nIE92ZXJyaWRlVHJpcGxlOworCisgIC8vLyBTZXR0aW5nIHRoaXMgZmllbGQgd2lsbCByZXBsYWNlIHVuc3BlY2lmaWVkIHRhcmdldCB0cmlwbGVzIGluIGlucHV0IGZpbGVzCisgIC8vLyB3aXRoIHRoaXMgdHJpcGxlLgorICBzdGQ6OnN0cmluZyBEZWZhdWx0VHJpcGxlOworCisgIC8vLyBTYW1wbGUgUEdPIHByb2ZpbGUgcGF0aC4KKyAgc3RkOjpzdHJpbmcgU2FtcGxlUHJvZmlsZTsKKworICAvLy8gT3B0aW1pemF0aW9uIHJlbWFya3MgZmlsZSBwYXRoLgorICBzdGQ6OnN0cmluZyBSZW1hcmtzRmlsZW5hbWUgPSAiIjsKKworICAvLy8gV2hldGhlciB0byBlbWl0IG9wdGltaXphdGlvbiByZW1hcmtzIHdpdGggaG90bmVzcyBpbmZvcm1hdGlvbnMuCisgIGJvb2wgUmVtYXJrc1dpdGhIb3RuZXNzID0gZmFsc2U7CisKKyAgLy8vIFdoZXRoZXIgdG8gZW1pdCB0aGUgcGFzcyBtYW5hZ2VyIGRlYnVnZ2dpbmcgaW5mb3JtYXRpb25zLgorICBib29sIERlYnVnUGFzc01hbmFnZXIgPSBmYWxzZTsKKworICBib29sIFNob3VsZERpc2NhcmRWYWx1ZU5hbWVzID0gdHJ1ZTsKKyAgRGlhZ25vc3RpY0hhbmRsZXJGdW5jdGlvbiBEaWFnSGFuZGxlcjsKKworICAvLy8gSWYgdGhpcyBmaWVsZCBpcyBzZXQsIExUTyB3aWxsIHdyaXRlIGlucHV0IGZpbGUgcGF0aHMgYW5kIHN5bWJvbAorICAvLy8gcmVzb2x1dGlvbnMgaGVyZSBpbiBsbHZtLWx0bzIgY29tbWFuZCBsaW5lIGZsYWcgZm9ybWF0LiBUaGlzIGNhbiBiZQorICAvLy8gdXNlZCBmb3IgdGVzdGluZyBhbmQgZm9yIHJ1bm5pbmcgdGhlIExUTyBwaXBlbGluZSBvdXRzaWRlIG9mIHRoZSBsaW5rZXIKKyAgLy8vIHdpdGggbGx2bS1sdG8yLgorICBzdGQ6OnVuaXF1ZV9wdHI8cmF3X29zdHJlYW0+IFJlc29sdXRpb25GaWxlOworCisgIC8vLyBUaGUgZm9sbG93aW5nIGNhbGxiYWNrcyBkZWFsIHdpdGggdGFza3MsIHdoaWNoIG5vcm1hbGx5IHJlcHJlc2VudCB0aGUKKyAgLy8vIGVudGlyZSBvcHRpbWl6YXRpb24gYW5kIGNvZGUgZ2VuZXJhdGlvbiBwaXBlbGluZSBmb3Igd2hhdCB3aWxsIGJlY29tZSBhCisgIC8vLyBzaW5nbGUgbmF0aXZlIG9iamVjdCBmaWxlLiBFYWNoIHRhc2sgaGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgYmV0d2VlbiAwIGFuZAorICAvLy8gZ2V0TWF4VGFza3MoKS0xLCB3aGljaCBpcyBzdXBwbGllZCB0byB0aGUgY2FsbGJhY2sgdmlhIHRoZSBUYXNrIHBhcmFtZXRlci4KKyAgLy8vIEEgdGFzayByZXByZXNlbnRzIHRoZSBlbnRpcmUgcGlwZWxpbmUgZm9yIFRoaW5MVE8gYW5kIHJlZ3VsYXIKKyAgLy8vIChub24tcGFyYWxsZWwpIExUTywgYnV0IGEgcGFyYWxsZWwgY29kZSBnZW5lcmF0aW9uIHRhc2sgd2lsbCBiZSBzcGxpdCBpbnRvCisgIC8vLyBOIHRhc2tzIGJlZm9yZSBjb2RlIGdlbmVyYXRpb24sIHdoZXJlIE4gaXMgdGhlIHBhcmFsbGVsaXNtIGxldmVsLgorICAvLy8KKyAgLy8vIExUTyBtYXkgZGVjaWRlIHRvIHN0b3AgcHJvY2Vzc2luZyBhIHRhc2sgYXQgYW55IHRpbWUsIGZvciBleGFtcGxlIGlmIHRoZQorICAvLy8gbW9kdWxlIGlzIGVtcHR5IG9yIGlmIGEgbW9kdWxlIGhvb2sgKHNlZSBiZWxvdykgcmV0dXJucyBmYWxzZS4gRm9yIHRoaXMKKyAgLy8vIHJlYXNvbiwgdGhlIGNsaWVudCBzaG91bGQgbm90IGV4cGVjdCB0byByZWNlaXZlIGV4YWN0bHkgZ2V0TWF4VGFza3MoKQorICAvLy8gbmF0aXZlIG9iamVjdCBmaWxlcy4KKworICAvLy8gQSBtb2R1bGUgaG9vayBtYXkgYmUgdXNlZCBieSBhIGxpbmtlciB0byBwZXJmb3JtIGFjdGlvbnMgZHVyaW5nIHRoZSBMVE8KKyAgLy8vIHBpcGVsaW5lLiBGb3IgZXhhbXBsZSwgYSBsaW5rZXIgbWF5IHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGltcGxlbWVudAorICAvLy8gLXNhdmUtdGVtcHMuIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgYW55IGZ1cnRoZXIgcHJvY2Vzc2luZyBmb3IKKyAgLy8vIHRoYXQgdGFzayBpcyBhYm9ydGVkLgorICAvLy8KKyAgLy8vIE1vZHVsZSBob29rcyBtdXN0IGJlIHRocmVhZCBzYWZlIHdpdGggcmVzcGVjdCB0byB0aGUgbGlua2VyJ3MgaW50ZXJuYWwKKyAgLy8vIGRhdGEgc3RydWN0dXJlcy4gQSBtb2R1bGUgaG9vayB3aWxsIG5ldmVyIGJlIGNhbGxlZCBjb25jdXJyZW50bHkgZnJvbQorICAvLy8gbXVsdGlwbGUgdGhyZWFkcyB3aXRoIHRoZSBzYW1lIHRhc2sgSUQsIG9yIHRoZSBzYW1lIG1vZHVsZS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgaW4gb3V0LW9mLXByb2Nlc3MgYmFja2VuZCBzY2VuYXJpb3MsIG5vbmUgb2YgdGhlIGhvb2tzIHdpbGwgYmUKKyAgLy8vIGNhbGxlZCBmb3IgVGhpbkxUTyB0YXNrcy4KKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGJvb2wodW5zaWduZWQgVGFzaywgY29uc3QgTW9kdWxlICYpPiBNb2R1bGVIb29rRm47CisKKyAgLy8vIFRoaXMgbW9kdWxlIGhvb2sgaXMgY2FsbGVkIGFmdGVyIGxpbmtpbmcgKHJlZ3VsYXIgTFRPKSBvciBsb2FkaW5nCisgIC8vLyAoVGhpbkxUTykgdGhlIG1vZHVsZSwgYmVmb3JlIG1vZGlmeWluZyBpdC4KKyAgTW9kdWxlSG9va0ZuIFByZU9wdE1vZHVsZUhvb2s7CisKKyAgLy8vIFRoaXMgaG9vayBpcyBjYWxsZWQgYWZ0ZXIgcHJvbW90aW5nIGFueSBpbnRlcm5hbCBmdW5jdGlvbnMKKyAgLy8vIChUaGluTFRPLXNwZWNpZmljKS4KKyAgTW9kdWxlSG9va0ZuIFBvc3RQcm9tb3RlTW9kdWxlSG9vazsKKworICAvLy8gVGhpcyBob29rIGlzIGNhbGxlZCBhZnRlciBpbnRlcm5hbGl6aW5nIHRoZSBtb2R1bGUuCisgIE1vZHVsZUhvb2tGbiBQb3N0SW50ZXJuYWxpemVNb2R1bGVIb29rOworCisgIC8vLyBUaGlzIGhvb2sgaXMgY2FsbGVkIGFmdGVyIGltcG9ydGluZyBmcm9tIG90aGVyIG1vZHVsZXMgKFRoaW5MVE8tc3BlY2lmaWMpLgorICBNb2R1bGVIb29rRm4gUG9zdEltcG9ydE1vZHVsZUhvb2s7CisKKyAgLy8vIFRoaXMgbW9kdWxlIGhvb2sgaXMgY2FsbGVkIGFmdGVyIG9wdGltaXphdGlvbiBpcyBjb21wbGV0ZS4KKyAgTW9kdWxlSG9va0ZuIFBvc3RPcHRNb2R1bGVIb29rOworCisgIC8vLyBUaGlzIG1vZHVsZSBob29rIGlzIGNhbGxlZCBiZWZvcmUgY29kZSBnZW5lcmF0aW9uLiBJdCBpcyBzaW1pbGFyIHRvIHRoZQorICAvLy8gUG9zdE9wdE1vZHVsZUhvb2ssIGJ1dCBmb3IgcGFyYWxsZWwgY29kZSBnZW5lcmF0aW9uIGl0IGlzIGNhbGxlZCBhZnRlcgorICAvLy8gc3BsaXR0aW5nIHRoZSBtb2R1bGUuCisgIE1vZHVsZUhvb2tGbiBQcmVDb2RlR2VuTW9kdWxlSG9vazsKKworICAvLy8gQSBjb21iaW5lZCBpbmRleCBob29rIGlzIGNhbGxlZCBhZnRlciBhbGwgcGVyLW1vZHVsZSBpbmRleGVzIGhhdmUgYmVlbgorICAvLy8gY29tYmluZWQgKFRoaW5MVE8tc3BlY2lmaWMpLiBJdCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgLXNhdmUtdGVtcHMgZm9yCisgIC8vLyB0aGUgY29tYmluZWQgaW5kZXguCisgIC8vLworICAvLy8gSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCBhbnkgZnVydGhlciBwcm9jZXNzaW5nIGZvciBUaGluTFRPIHRhc2tzCisgIC8vLyBpcyBhYm9ydGVkLgorICAvLy8KKyAgLy8vIEl0IGlzIGNhbGxlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGJhY2tlbmQgaXMgaW4tcHJvY2VzcywgYWx0aG91Z2ggaXQKKyAgLy8vIGlzIG5vdCBjYWxsZWQgZnJvbSBpbmRpdmlkdWFsIGJhY2tlbmQgcHJvY2Vzc2VzLgorICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBNb2R1bGVTdW1tYXJ5SW5kZXggJkluZGV4KT4KKyAgICAgIENvbWJpbmVkSW5kZXhIb29rRm47CisgIENvbWJpbmVkSW5kZXhIb29rRm4gQ29tYmluZWRJbmRleEhvb2s7CisKKyAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0aGF0IGNvbmZpZ3VyZXMgdGhpcyBDb25maWcgb2JqZWN0IHRvIHdyaXRlCisgIC8vLyB0ZW1wb3JhcnkgZmlsZXMgbmFtZWQgYWZ0ZXIgdGhlIGdpdmVuIE91dHB1dEZpbGVOYW1lIGZvciBlYWNoIG9mIHRoZSBMVE8KKyAgLy8vIHBoYXNlcyB0byBkaXNrLiBBIGNsaWVudCBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gaW1wbGVtZW50IC1zYXZlLXRlbXBzLgorICAvLy8KKyAgLy8vIEZJWE1FOiBUZW1wb3JhcnkgZmlsZXMgZGVyaXZlZCBmcm9tIFRoaW5MVE8gYmFja2VuZHMgYXJlIGN1cnJlbnRseSBuYW1lZAorICAvLy8gYWZ0ZXIgdGhlIGlucHV0IGZpbGUgbmFtZSwgcmF0aGVyIHRoYW4gdGhlIG91dHB1dCBmaWxlIG5hbWUsIHdoZW4KKyAgLy8vIFVzZUlucHV0TW9kdWxlUGF0aCBpcyBzZXQgdG8gdHJ1ZS4KKyAgLy8vCisgIC8vLyBTcGVjaWZpY2FsbHksIGl0ICgxKSBzZXRzIGVhY2ggb2YgdGhlIGFib3ZlIG1vZHVsZSBob29rcyBhbmQgdGhlIGNvbWJpbmVkCisgIC8vLyBpbmRleCBob29rIHRvIGEgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgaG9vayBmdW5jdGlvbiAoaWYgYW55KSB0aGF0IHdhcworICAvLy8gcHJlc2VudCBpbiB0aGUgYXBwcm9wcmlhdGUgZmllbGQgd2hlbiB0aGUgYWRkU2F2ZVRlbXBzIGZ1bmN0aW9uIHdhcworICAvLy8gY2FsbGVkLCBhbmQgd3JpdGVzIHRoZSBtb2R1bGUgdG8gYSBiaXRjb2RlIGZpbGUgd2l0aCBhIG5hbWUgcHJlZml4ZWQgYnkKKyAgLy8vIHRoZSBnaXZlbiBvdXRwdXQgZmlsZSBuYW1lLCBhbmQgKDIpIGNyZWF0ZXMgYSByZXNvbHV0aW9uIGZpbGUgd2hvc2UgbmFtZQorICAvLy8gaXMgcHJlZml4ZWQgYnkgdGhlIGdpdmVuIG91dHB1dCBmaWxlIG5hbWUgYW5kIHNldHMgUmVzb2x1dGlvbkZpbGUgdG8gaXRzCisgIC8vLyBmaWxlIGhhbmRsZS4KKyAgRXJyb3IgYWRkU2F2ZVRlbXBzKHN0ZDo6c3RyaW5nIE91dHB1dEZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBVc2VJbnB1dE1vZHVsZVBhdGggPSBmYWxzZSk7Cit9OworCitzdHJ1Y3QgTFRPTExWTURpYWdub3N0aWNIYW5kbGVyIDogcHVibGljIERpYWdub3N0aWNIYW5kbGVyIHsKKyAgRGlhZ25vc3RpY0hhbmRsZXJGdW5jdGlvbiAqRm47CisgIExUT0xMVk1EaWFnbm9zdGljSGFuZGxlcihEaWFnbm9zdGljSGFuZGxlckZ1bmN0aW9uICpEaWFnSGFuZGxlckZuKQorICAgICAgOiBGbihEaWFnSGFuZGxlckZuKSB7fQorICBib29sIGhhbmRsZURpYWdub3N0aWNzKGNvbnN0IERpYWdub3N0aWNJbmZvICZESSkgb3ZlcnJpZGUgeworICAgICgqRm4pKERJKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKy8vLyBBIGRlcml2ZWQgY2xhc3Mgb2YgTExWTUNvbnRleHQgdGhhdCBpbml0aWFsaXplcyBpdHNlbGYgYWNjb3JkaW5nIHRvIGEgZ2l2ZW4KKy8vLyBDb25maWcgb2JqZWN0LiBUaGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIHRpZSBvd25lcnNoaXAgb2YgdGhlCisvLy8gZGlhZ25vc3RpYyBoYW5kbGVyIHRvIHRoZSBjb250ZXh0LCBhcyBvcHBvc2VkIHRvIHRoZSBDb25maWcgb2JqZWN0ICh3aGljaAorLy8vIG1heSBiZSBlcGhlbWVyYWwpLgorLy8gRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSByZXF1aXJlZCBhcyBkaWFnbm9zdGljIGhhbmRsZXIgaXMgbm90IGNhbGxiYWNrLgorc3RydWN0IExUT0xMVk1Db250ZXh0IDogTExWTUNvbnRleHQgeworCisgIExUT0xMVk1Db250ZXh0KGNvbnN0IENvbmZpZyAmQykgOiBEaWFnSGFuZGxlcihDLkRpYWdIYW5kbGVyKSB7CisgICAgc2V0RGlzY2FyZFZhbHVlTmFtZXMoQy5TaG91bGREaXNjYXJkVmFsdWVOYW1lcyk7CisgICAgZW5hYmxlRGVidWdUeXBlT0RSVW5pcXVpbmcoKTsKKyAgICBzZXREaWFnbm9zdGljSGFuZGxlcigKKyAgICAgICAgbGx2bTo6bWFrZV91bmlxdWU8TFRPTExWTURpYWdub3N0aWNIYW5kbGVyPigmRGlhZ0hhbmRsZXIpLCB0cnVlKTsKKyAgfQorICBEaWFnbm9zdGljSGFuZGxlckZ1bmN0aW9uIERpYWdIYW5kbGVyOworfTsKKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL0xUTy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MVE8vTFRPLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2YmVhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL0xUTy5oCkBAIC0wLDAgKzEsNDE3IEBACisvLz09PS1MVE8uaCAtIExMVk0gTGluayBUaW1lIE9wdGltaXplciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgdXNlZCB0byBzdXBwb3J0IExUTy4gSXQgaXMgaW50ZW5kZWQKKy8vIHRvIGJlIHVzZWQgYm90aCBieSBMVE8gY2xhc3NlcyBhcyB3ZWxsIGFzIGJ5IGNsaWVudHMgKGdvbGQtcGx1Z2luKSB0aGF0CisvLyBkb24ndCB1dGlsaXplIHRoZSBMVE8gY29kZSBnZW5lcmF0b3IgaW50ZXJmYWNlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTFRPX0xUT19ICisjZGVmaW5lIExMVk1fTFRPX0xUT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9NYXBWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RpYWdub3N0aWNJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGVTdW1tYXJ5SW5kZXguaCIKKyNpbmNsdWRlICJsbHZtL0xUTy9Db25maWcuaCIKKyNpbmNsdWRlICJsbHZtL0xpbmtlci9JUk1vdmVyLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvSVJTeW10YWIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVG9vbE91dHB1dEZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvdGhyZWFkLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JUE8vRnVuY3Rpb25JbXBvcnQuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCaXRjb2RlTW9kdWxlOworY2xhc3MgRXJyb3I7CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIE1lbW9yeUJ1ZmZlclJlZjsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFRhcmdldDsKK2NsYXNzIHJhd19wd3JpdGVfc3RyZWFtOworCisvLy8gUmVzb2x2ZSBXZWFrIGFuZCBMaW5rT25jZSB2YWx1ZXMgaW4gdGhlIFxwIEluZGV4LiBMaW5rYWdlIGNoYW5nZXMgcmVjb3JkZWQKKy8vLyBpbiB0aGUgaW5kZXggYW5kIHRoZSBUaGluTFRPIGJhY2tlbmRzIG11c3QgYXBwbHkgdGhlIGNoYW5nZXMgdG8gdGhlIE1vZHVsZQorLy8vIHZpYSB0aGluTFRPUmVzb2x2ZVdlYWtGb3JMaW5rZXJNb2R1bGUuCisvLy8KKy8vLyBUaGlzIGlzIGRvbmUgZm9yIGNvcnJlY3RuZXNzIChpZiB2YWx1ZSBleHBvcnRlZCwgZW5zdXJlIHdlIGFsd2F5cworLy8vIGVtaXQgYSBjb3B5KSwgYW5kIGNvbXBpbGUtdGltZSBvcHRpbWl6YXRpb24gKGFsbG93IGRyb3Agb2YgZHVwbGljYXRlcykuCit2b2lkIHRoaW5MVE9SZXNvbHZlV2Vha0ZvckxpbmtlckluSW5kZXgoCisgICAgTW9kdWxlU3VtbWFyeUluZGV4ICZJbmRleCwKKyAgICBmdW5jdGlvbl9yZWY8Ym9vbChHbG9iYWxWYWx1ZTo6R1VJRCwgY29uc3QgR2xvYmFsVmFsdWVTdW1tYXJ5ICopPgorICAgICAgICBpc1ByZXZhaWxpbmcsCisgICAgZnVuY3Rpb25fcmVmPHZvaWQoU3RyaW5nUmVmLCBHbG9iYWxWYWx1ZTo6R1VJRCwgR2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyk+CisgICAgICAgIHJlY29yZE5ld0xpbmthZ2UpOworCisvLy8gVXBkYXRlIHRoZSBsaW5rYWdlcyBpbiB0aGUgZ2l2ZW4gXHAgSW5kZXggdG8gbWFyayBleHBvcnRlZCB2YWx1ZXMKKy8vLyBhcyBleHRlcm5hbCBhbmQgbm9uLWV4cG9ydGVkIHZhbHVlcyBhcyBpbnRlcm5hbC4gVGhlIFRoaW5MVE8gYmFja2VuZHMKKy8vLyBtdXN0IGFwcGx5IHRoZSBjaGFuZ2VzIHRvIHRoZSBNb2R1bGUgdmlhIHRoaW5MVE9JbnRlcm5hbGl6ZU1vZHVsZS4KK3ZvaWQgdGhpbkxUT0ludGVybmFsaXplQW5kUHJvbW90ZUluSW5kZXgoCisgICAgTW9kdWxlU3VtbWFyeUluZGV4ICZJbmRleCwKKyAgICBmdW5jdGlvbl9yZWY8Ym9vbChTdHJpbmdSZWYsIEdsb2JhbFZhbHVlOjpHVUlEKT4gaXNFeHBvcnRlZCk7CisKK25hbWVzcGFjZSBsdG8geworCisvLy8gR2l2ZW4gdGhlIG9yaWdpbmFsIFxwIFBhdGggdG8gYW4gb3V0cHV0IGZpbGUsIHJlcGxhY2UgYW55IHBhdGgKKy8vLyBwcmVmaXggbWF0Y2hpbmcgXHAgT2xkUHJlZml4IHdpdGggXHAgTmV3UHJlZml4LiBBbHNvLCBjcmVhdGUgdGhlCisvLy8gcmVzdWx0aW5nIGRpcmVjdG9yeSBpZiBpdCBkb2VzIG5vdCB5ZXQgZXhpc3QuCitzdGQ6OnN0cmluZyBnZXRUaGluTFRPT3V0cHV0RmlsZShjb25zdCBzdGQ6OnN0cmluZyAmUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZPbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmTmV3UHJlZml4KTsKKworLy8vIFNldHVwIG9wdGltaXphdGlvbiByZW1hcmtzLgorRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPFRvb2xPdXRwdXRGaWxlPj4KK3NldHVwT3B0aW1pemF0aW9uUmVtYXJrcyhMTFZNQ29udGV4dCAmQ29udGV4dCwgU3RyaW5nUmVmIExUT1JlbWFya3NGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIExUT1Bhc3NSZW1hcmtzV2l0aEhvdG5lc3MsIGludCBDb3VudCA9IC0xKTsKKworY2xhc3MgTFRPOworc3RydWN0IFN5bWJvbFJlc29sdXRpb247CitjbGFzcyBUaGluQmFja2VuZFByb2M7CisKKy8vLyBBbiBpbnB1dCBmaWxlLiBUaGlzIGlzIGEgc3ltYm9sIHRhYmxlIHdyYXBwZXIgdGhhdCBvbmx5IGV4cG9zZXMgdGhlCisvLy8gaW5mb3JtYXRpb24gdGhhdCBhbiBMVE8gY2xpZW50IHNob3VsZCBuZWVkIGluIG9yZGVyIHRvIGRvIHN5bWJvbCByZXNvbHV0aW9uLgorY2xhc3MgSW5wdXRGaWxlIHsKK3B1YmxpYzoKKyAgY2xhc3MgU3ltYm9sOworCitwcml2YXRlOgorICAvLyBGSVhNRTogUmVtb3ZlIExUTyBjbGFzcyBmcmllbmRzaGlwIG9uY2Ugd2UgaGF2ZSBiaXRjb2RlIHN5bWJvbCB0YWJsZXMuCisgIGZyaWVuZCBMVE87CisgIElucHV0RmlsZSgpID0gZGVmYXVsdDsKKworICBzdGQ6OnZlY3RvcjxCaXRjb2RlTW9kdWxlPiBNb2RzOworICBTbWFsbFZlY3RvcjxjaGFyLCAwPiBTdHJ0YWI7CisgIHN0ZDo6dmVjdG9yPFN5bWJvbD4gU3ltYm9sczsKKworICAvLyBbYmVnaW4sIGVuZCkgZm9yIGVhY2ggbW9kdWxlCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4+IE1vZHVsZVN5bUluZGljZXM7CisKKyAgU3RyaW5nUmVmIFRhcmdldFRyaXBsZSwgU291cmNlRmlsZU5hbWUsIENPRkZMaW5rZXJPcHRzOworICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IENvbWRhdFRhYmxlOworCitwdWJsaWM6CisgIH5JbnB1dEZpbGUoKTsKKworICAvLy8gQ3JlYXRlIGFuIElucHV0RmlsZS4KKyAgc3RhdGljIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEZpbGU+PiBjcmVhdGUoTWVtb3J5QnVmZmVyUmVmIE9iamVjdCk7CisKKyAgLy8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gb25seSBleHBvc2UgdGhlIHN5bWJvbCBpbmZvcm1hdGlvbiB0aGF0IGFuCisgIC8vLyBMVE8gY2xpZW50IHNob3VsZCBuZWVkIGluIG9yZGVyIHRvIGRvIHN5bWJvbCByZXNvbHV0aW9uLgorICBjbGFzcyBTeW1ib2wgOiBpcnN5bXRhYjo6U3ltYm9sIHsKKyAgICBmcmllbmQgTFRPOworCisgIHB1YmxpYzoKKyAgICBTeW1ib2woY29uc3QgaXJzeW10YWI6OlN5bWJvbCAmUykgOiBpcnN5bXRhYjo6U3ltYm9sKFMpIHt9CisKKyAgICB1c2luZyBpcnN5bXRhYjo6U3ltYm9sOjppc1VuZGVmaW5lZDsKKyAgICB1c2luZyBpcnN5bXRhYjo6U3ltYm9sOjppc0NvbW1vbjsKKyAgICB1c2luZyBpcnN5bXRhYjo6U3ltYm9sOjppc1dlYWs7CisgICAgdXNpbmcgaXJzeW10YWI6OlN5bWJvbDo6aXNJbmRpcmVjdDsKKyAgICB1c2luZyBpcnN5bXRhYjo6U3ltYm9sOjpnZXROYW1lOworICAgIHVzaW5nIGlyc3ltdGFiOjpTeW1ib2w6OmdldFZpc2liaWxpdHk7CisgICAgdXNpbmcgaXJzeW10YWI6OlN5bWJvbDo6Y2FuQmVPbWl0dGVkRnJvbVN5bWJvbFRhYmxlOworICAgIHVzaW5nIGlyc3ltdGFiOjpTeW1ib2w6OmlzVExTOworICAgIHVzaW5nIGlyc3ltdGFiOjpTeW1ib2w6OmdldENvbWRhdEluZGV4OworICAgIHVzaW5nIGlyc3ltdGFiOjpTeW1ib2w6OmdldENvbW1vblNpemU7CisgICAgdXNpbmcgaXJzeW10YWI6OlN5bWJvbDo6Z2V0Q29tbW9uQWxpZ25tZW50OworICAgIHVzaW5nIGlyc3ltdGFiOjpTeW1ib2w6OmdldENPRkZXZWFrRXh0ZXJuYWxGYWxsYmFjazsKKyAgICB1c2luZyBpcnN5bXRhYjo6U3ltYm9sOjpnZXRTZWN0aW9uTmFtZTsKKyAgICB1c2luZyBpcnN5bXRhYjo6U3ltYm9sOjppc0V4ZWN1dGFibGU7CisgIH07CisKKyAgLy8vIEEgcmFuZ2Ugb3ZlciB0aGUgc3ltYm9scyBpbiB0aGlzIElucHV0RmlsZS4KKyAgQXJyYXlSZWY8U3ltYm9sPiBzeW1ib2xzKCkgY29uc3QgeyByZXR1cm4gU3ltYm9sczsgfQorCisgIC8vLyBSZXR1cm5zIGxpbmtlciBvcHRpb25zIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgZmlsZS4KKyAgU3RyaW5nUmVmIGdldENPRkZMaW5rZXJPcHRzKCkgY29uc3QgeyByZXR1cm4gQ09GRkxpbmtlck9wdHM7IH0KKworICAvLy8gUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgSW5wdXRGaWxlLgorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBpbnB1dCBmaWxlJ3MgdGFyZ2V0IHRyaXBsZS4KKyAgU3RyaW5nUmVmIGdldFRhcmdldFRyaXBsZSgpIGNvbnN0IHsgcmV0dXJuIFRhcmdldFRyaXBsZTsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBzb3VyY2UgZmlsZSBwYXRoIHNwZWNpZmllZCBhdCBjb21waWxlIHRpbWUuCisgIFN0cmluZ1JlZiBnZXRTb3VyY2VGaWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZUZpbGVOYW1lOyB9CisKKyAgLy8gUmV0dXJucyBhIHRhYmxlIHdpdGggYWxsIHRoZSBjb21kYXRzIHVzZWQgYnkgdGhpcyBmaWxlLgorICBBcnJheVJlZjxTdHJpbmdSZWY+IGdldENvbWRhdFRhYmxlKCkgY29uc3QgeyByZXR1cm4gQ29tZGF0VGFibGU7IH0KKworcHJpdmF0ZToKKyAgQXJyYXlSZWY8U3ltYm9sPiBtb2R1bGVfc3ltYm9scyh1bnNpZ25lZCBJKSBjb25zdCB7CisgICAgY29uc3QgYXV0byAmSW5kaWNlcyA9IE1vZHVsZVN5bUluZGljZXNbSV07CisgICAgcmV0dXJuIHtTeW1ib2xzLmRhdGEoKSArIEluZGljZXMuZmlyc3QsIFN5bWJvbHMuZGF0YSgpICsgSW5kaWNlcy5zZWNvbmR9OworICB9Cit9OworCisvLy8gVGhpcyBjbGFzcyB3cmFwcyBhbiBvdXRwdXQgc3RyZWFtIGZvciBhIG5hdGl2ZSBvYmplY3QuIE1vc3QgY2xpZW50cyBzaG91bGQKKy8vLyBqdXN0IGJlIGFibGUgdG8gcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoaXMgYmFzZSBjbGFzcyBmcm9tIHRoZSBzdHJlYW0KKy8vLyBjYWxsYmFjaywgYnV0IGlmIGEgY2xpZW50IG5lZWRzIHRvIHBlcmZvcm0gc29tZSBhY3Rpb24gYWZ0ZXIgdGhlIHN0cmVhbSBpcworLy8vIHdyaXR0ZW4gdG8sIHRoYXQgY2FuIGJlIGRvbmUgYnkgZGVyaXZpbmcgZnJvbSB0aGlzIGNsYXNzIGFuZCBvdmVycmlkaW5nIHRoZQorLy8vIGRlc3RydWN0b3IuCitjbGFzcyBOYXRpdmVPYmplY3RTdHJlYW0geworcHVibGljOgorICBOYXRpdmVPYmplY3RTdHJlYW0oc3RkOjp1bmlxdWVfcHRyPHJhd19wd3JpdGVfc3RyZWFtPiBPUykgOiBPUyhzdGQ6Om1vdmUoT1MpKSB7fQorICBzdGQ6OnVuaXF1ZV9wdHI8cmF3X3B3cml0ZV9zdHJlYW0+IE9TOworICB2aXJ0dWFsIH5OYXRpdmVPYmplY3RTdHJlYW0oKSA9IGRlZmF1bHQ7Cit9OworCisvLy8gVGhpcyB0eXBlIGRlZmluZXMgdGhlIGNhbGxiYWNrIHRvIGFkZCBhIG5hdGl2ZSBvYmplY3QgdGhhdCBpcyBnZW5lcmF0ZWQgb24KKy8vLyB0aGUgZmx5LgorLy8vCisvLy8gU3RyZWFtIGNhbGxiYWNrcyBtdXN0IGJlIHRocmVhZCBzYWZlLgordHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHN0ZDo6dW5pcXVlX3B0cjxOYXRpdmVPYmplY3RTdHJlYW0+KHVuc2lnbmVkIFRhc2spPgorICAgIEFkZFN0cmVhbUZuOworCisvLy8gVGhpcyBpcyB0aGUgdHlwZSBvZiBhIG5hdGl2ZSBvYmplY3QgY2FjaGUuIFRvIHJlcXVlc3QgYW4gaXRlbSBmcm9tIHRoZQorLy8vIGNhY2hlLCBwYXNzIGEgdW5pcXVlIHN0cmluZyBhcyB0aGUgS2V5LiBGb3IgaGl0cywgdGhlIGNhY2hlZCBmaWxlIHdpbGwgYmUKKy8vLyBhZGRlZCB0byB0aGUgbGluayBhbmQgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBBZGRTdHJlYW1GbigpLiBGb3IgbWlzc2VzLAorLy8vIHRoZSBjYWNoZSB3aWxsIHJldHVybiBhIHN0cmVhbSBjYWxsYmFjayB3aGljaCBtdXN0IGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UgdG8KKy8vLyBwcm9kdWNlIGNvbnRlbnQgZm9yIHRoZSBzdHJlYW0uIFRoZSBuYXRpdmUgb2JqZWN0IHN0cmVhbSBwcm9kdWNlZCBieSB0aGUKKy8vLyBzdHJlYW0gY2FsbGJhY2sgd2lsbCBhZGQgdGhlIGZpbGUgdG8gdGhlIGxpbmsgYWZ0ZXIgdGhlIHN0cmVhbSBpcyB3cml0dGVuCisvLy8gdG8uCisvLy8KKy8vLyBDbGllbnRzIGdlbmVyYWxseSBsb29rIGxpa2UgdGhpczoKKy8vLworLy8vIGlmIChBZGRTdHJlYW1GbiBBZGRTdHJlYW0gPSBDYWNoZShUYXNrLCBLZXkpKQorLy8vICAgUHJvZHVjZUNvbnRlbnQoQWRkU3RyZWFtKTsKK3R5cGVkZWYgc3RkOjpmdW5jdGlvbjxBZGRTdHJlYW1Gbih1bnNpZ25lZCBUYXNrLCBTdHJpbmdSZWYgS2V5KT4KKyAgICBOYXRpdmVPYmplY3RDYWNoZTsKKworLy8vIEEgVGhpbkJhY2tlbmQgZGVmaW5lcyB3aGF0IGhhcHBlbnMgYWZ0ZXIgdGhlIHRoaW4tbGluayBwaGFzZSBkdXJpbmcgVGhpbkxUTy4KKy8vLyBUaGUgZGV0YWlscyBvZiB0aGlzIHR5cGUgZGVmaW5pdGlvbiBhcmVuJ3QgaW1wb3J0YW50OyBjbGllbnRzIGNhbiBvbmx5CisvLy8gY3JlYXRlIGEgVGhpbkJhY2tlbmQgdXNpbmcgb25lIG9mIHRoZSBjcmVhdGUqVGhpbkJhY2tlbmQoKSBmdW5jdGlvbnMgYmVsb3cuCit0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248c3RkOjp1bmlxdWVfcHRyPFRoaW5CYWNrZW5kUHJvYz4oCisgICAgQ29uZmlnICZDLCBNb2R1bGVTdW1tYXJ5SW5kZXggJkNvbWJpbmVkSW5kZXgsCisgICAgU3RyaW5nTWFwPEdWU3VtbWFyeU1hcFR5PiAmTW9kdWxlVG9EZWZpbmVkR1ZTdW1tYXJpZXMsCisgICAgQWRkU3RyZWFtRm4gQWRkU3RyZWFtLCBOYXRpdmVPYmplY3RDYWNoZSBDYWNoZSk+CisgICAgVGhpbkJhY2tlbmQ7CisKKy8vLyBUaGlzIFRoaW5CYWNrZW5kIHJ1bnMgdGhlIGluZGl2aWR1YWwgYmFja2VuZCBqb2JzIGluLXByb2Nlc3MuCitUaGluQmFja2VuZCBjcmVhdGVJblByb2Nlc3NUaGluQmFja2VuZCh1bnNpZ25lZCBQYXJhbGxlbGlzbUxldmVsKTsKKworLy8vIFRoaXMgVGhpbkJhY2tlbmQgd3JpdGVzIGluZGl2aWR1YWwgbW9kdWxlIGluZGV4ZXMgdG8gZmlsZXMsIGluc3RlYWQgb2YKKy8vLyBydW5uaW5nIHRoZSBpbmRpdmlkdWFsIGJhY2tlbmQgam9icy4gVGhpcyBiYWNrZW5kIGlzIGZvciBkaXN0cmlidXRlZCBidWlsZHMKKy8vLyB3aGVyZSBzZXBhcmF0ZSBwcm9jZXNzZXMgd2lsbCBpbnZva2UgdGhlIHJlYWwgYmFja2VuZHMuCisvLy8KKy8vLyBUbyBmaW5kIHRoZSBwYXRoIHRvIHdyaXRlIHRoZSBpbmRleCB0bywgdGhlIGJhY2tlbmQgY2hlY2tzIGlmIHRoZSBwYXRoIGhhcyBhCisvLy8gcHJlZml4IG9mIE9sZFByZWZpeDsgaWYgc28sIGl0IHJlcGxhY2VzIHRoYXQgcHJlZml4IHdpdGggTmV3UHJlZml4LiBJdCB0aGVuCisvLy8gYXBwZW5kcyAiLnRoaW5sdG8uYmMiIGFuZCB3cml0ZXMgdGhlIGluZGV4IHRvIHRoYXQgcGF0aC4gSWYKKy8vLyBTaG91bGRFbWl0SW1wb3J0c0ZpbGVzIGlzIHRydWUgaXQgYWxzbyB3cml0ZXMgYSBsaXN0IG9mIGltcG9ydGVkIGZpbGVzIHRvIGEKKy8vLyBzaW1pbGFyIHBhdGggd2l0aCAiLmltcG9ydHMiIGFwcGVuZGVkIGluc3RlYWQuCisvLy8gTGlua2VkT2JqZWN0c0ZpbGUgaXMgYW4gb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0aGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgZm9yCisvLy8gdGhlIGZpbmFsIFRoaW5MVE8gbGlua2luZy4gQ2FuIGJlIG51bGxwdHIuCisvLy8gT25Xcml0ZSBpcyBjYWxsYmFjayB3aGljaCByZWNlaXZlcyBtb2R1bGUgaWRlbnRpZmllciBhbmQgbm90aWZpZXMgTFRPIHVzZXIKKy8vLyB0aGF0IGluZGV4IGZpbGUgZm9yIHRoZSBtb2R1bGUgKGFuZCBvcHRpb25hbGx5IGltcG9ydHMgZmlsZSkgd2FzIGNyZWF0ZWQuCit1c2luZyBJbmRleFdyaXRlQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcgJik+OworVGhpbkJhY2tlbmQgY3JlYXRlV3JpdGVJbmRleGVzVGhpbkJhY2tlbmQoc3RkOjpzdHJpbmcgT2xkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgTmV3UHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRFbWl0SW1wb3J0c0ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X2ZkX29zdHJlYW0gKkxpbmtlZE9iamVjdHNGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhXcml0ZUNhbGxiYWNrIE9uV3JpdGUpOworCisvLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgcmVzb2x1dGlvbi1iYXNlZCBpbnRlcmZhY2UgdG8gTExWTSdzIExUTworLy8vIGZ1bmN0aW9uYWxpdHkuIEl0IHN1cHBvcnRzIHJlZ3VsYXIgTFRPLCBwYXJhbGxlbCBMVE8gY29kZSBnZW5lcmF0aW9uIGFuZAorLy8vIFRoaW5MVE8uIFlvdSBjYW4gdXNlIGl0IGZyb20gYSBsaW5rZXIgaW4gdGhlIGZvbGxvd2luZyB3YXk6CisvLy8gLSBTZXQgaG9va3MgYW5kIGNvZGUgZ2VuZXJhdGlvbiBvcHRpb25zIChzZWUgbHRvOjpDb25maWcgc3RydWN0IGRlZmluZWQgaW4KKy8vLyAgIENvbmZpZy5oKSwgYW5kIHVzZSB0aGUgbHRvOjpDb25maWcgb2JqZWN0IHRvIGNyZWF0ZSBhbiBsdG86OkxUTyBvYmplY3QuCisvLy8gLSBDcmVhdGUgbHRvOjpJbnB1dEZpbGUgb2JqZWN0cyB1c2luZyBsdG86OklucHV0RmlsZTo6Y3JlYXRlKCksIHRoZW4gdXNlCisvLy8gICB0aGUgc3ltYm9scygpIGZ1bmN0aW9uIHRvIGVudW1lcmF0ZSBpdHMgc3ltYm9scyBhbmQgY29tcHV0ZSBhIHJlc29sdXRpb24KKy8vLyAgIGZvciBlYWNoIHN5bWJvbCAoc2VlIFN5bWJvbFJlc29sdXRpb24gYmVsb3cpLgorLy8vIC0gQWZ0ZXIgdGhlIGxpbmtlciBoYXMgdmlzaXRlZCBlYWNoIGlucHV0IGZpbGUgKGFuZCBlYWNoIHJlZ3VsYXIgb2JqZWN0CisvLy8gICBmaWxlKSBhbmQgY29tcHV0ZWQgYSByZXNvbHV0aW9uIGZvciBlYWNoIHN5bWJvbCwgdGFrZSBlYWNoIGx0bzo6SW5wdXRGaWxlCisvLy8gICBhbmQgcGFzcyBpdCBhbmQgYW4gYXJyYXkgb2Ygc3ltYm9sIHJlc29sdXRpb25zIHRvIHRoZSBhZGQoKSBmdW5jdGlvbi4KKy8vLyAtIENhbGwgdGhlIGdldE1heFRhc2tzKCkgZnVuY3Rpb24gdG8gZ2V0IGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YKKy8vLyAgIG5hdGl2ZSBvYmplY3QgZmlsZXMgdGhhdCBMVE8gbWF5IGFkZCB0byB0aGUgbGluay4KKy8vLyAtIENhbGwgdGhlIHJ1bigpIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdXNlIHRoZSBzdXBwbGllZCBBZGRTdHJlYW0KKy8vLyAgIGFuZCBDYWNoZSBmdW5jdGlvbnMgdG8gYWRkIHVwIHRvIGdldE1heFRhc2tzKCkgbmF0aXZlIG9iamVjdCBmaWxlcyB0bworLy8vICAgdGhlIGxpbmsuCitjbGFzcyBMVE8geworICBmcmllbmQgSW5wdXRGaWxlOworCitwdWJsaWM6CisgIC8vLyBDcmVhdGUgYW4gTFRPIG9iamVjdC4gQSBkZWZhdWx0IGNvbnN0cnVjdGVkIExUTyBvYmplY3QgaGFzIGEgcmVhc29uYWJsZQorICAvLy8gcHJvZHVjdGlvbiBjb25maWd1cmF0aW9uLCBidXQgeW91IGNhbiBjdXN0b21pemUgaXQgYnkgcGFzc2luZyBhcmd1bWVudHMgdG8KKyAgLy8vIHRoaXMgY29uc3RydWN0b3IuCisgIC8vLyBGSVhNRTogV2UgZG8gY3VycmVudGx5IHJlcXVpcmUgdGhlIERpYWdIYW5kbGVyIGZpZWxkIHRvIGJlIHNldCBpbiBDb25mLgorICAvLy8gVW50aWwgdGhhdCBpcyBmaXhlZCwgYSBDb25maWcgYXJndW1lbnQgaXMgcmVxdWlyZWQuCisgIExUTyhDb25maWcgQ29uZiwgVGhpbkJhY2tlbmQgQmFja2VuZCA9IG51bGxwdHIsCisgICAgICB1bnNpZ25lZCBQYXJhbGxlbENvZGVHZW5QYXJhbGxlbGlzbUxldmVsID0gMSk7CisgIH5MVE8oKTsKKworICAvLy8gQWRkIGFuIGlucHV0IGZpbGUgdG8gdGhlIExUTyBsaW5rLCB1c2luZyB0aGUgcHJvdmlkZWQgc3ltYm9sIHJlc29sdXRpb25zLgorICAvLy8gVGhlIHN5bWJvbCByZXNvbHV0aW9ucyBtdXN0IGFwcGVhciBpbiB0aGUgZW51bWVyYXRpb24gb3JkZXIgZ2l2ZW4gYnkKKyAgLy8vIElucHV0RmlsZTo6c3ltYm9scygpLgorICBFcnJvciBhZGQoc3RkOjp1bmlxdWVfcHRyPElucHV0RmlsZT4gT2JqLCBBcnJheVJlZjxTeW1ib2xSZXNvbHV0aW9uPiBSZXMpOworCisgIC8vLyBSZXR1cm5zIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YgdGFza3MgdGhhdCB0aGUgY2xpZW50IG1heSBleHBlY3QuCisgIC8vLyBUaGlzIG1heSBvbmx5IGJlIGNhbGxlZCBhZnRlciBhbGwgSVIgb2JqZWN0IGZpbGVzIGhhdmUgYmVlbiBhZGRlZC4gRm9yIGEKKyAgLy8vIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGFza3Mgc2VlIExUT0JhY2tlbmQuaC4KKyAgdW5zaWduZWQgZ2V0TWF4VGFza3MoKSBjb25zdDsKKworICAvLy8gUnVucyB0aGUgTFRPIHBpcGVsaW5lLiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSBzdXBwbGllZCBBZGRTdHJlYW0KKyAgLy8vIGZ1bmN0aW9uIHRvIGFkZCBuYXRpdmUgb2JqZWN0IGZpbGVzIHRvIHRoZSBsaW5rLgorICAvLy8KKyAgLy8vIFRoZSBDYWNoZSBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuIElmIHN1cHBsaWVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gY2FjaGUKKyAgLy8vIG5hdGl2ZSBvYmplY3QgZmlsZXMgYW5kIGFkZCB0aGVtIHRvIHRoZSBsaW5rLgorICAvLy8KKyAgLy8vIFRoZSBjbGllbnQgd2lsbCByZWNlaXZlIGF0IG1vc3Qgb25lIGNhbGxiYWNrICh2aWEgZWl0aGVyIEFkZFN0cmVhbSBvcgorICAvLy8gQ2FjaGUpIGZvciBlYWNoIHRhc2sgaWRlbnRpZmllci4KKyAgRXJyb3IgcnVuKEFkZFN0cmVhbUZuIEFkZFN0cmVhbSwgTmF0aXZlT2JqZWN0Q2FjaGUgQ2FjaGUgPSBudWxscHRyKTsKKworcHJpdmF0ZToKKyAgQ29uZmlnIENvbmY7CisKKyAgc3RydWN0IFJlZ3VsYXJMVE9TdGF0ZSB7CisgICAgUmVndWxhckxUT1N0YXRlKHVuc2lnbmVkIFBhcmFsbGVsQ29kZUdlblBhcmFsbGVsaXNtTGV2ZWwsIENvbmZpZyAmQ29uZik7CisgICAgc3RydWN0IENvbW1vblJlc29sdXRpb24geworICAgICAgdWludDY0X3QgU2l6ZSA9IDA7CisgICAgICB1bnNpZ25lZCBBbGlnbiA9IDA7CisgICAgICAvLy8gUmVjb3JkIGlmIGF0IGxlYXN0IG9uZSBpbnN0YW5jZSBvZiB0aGUgY29tbW9uIHdhcyBtYXJrZWQgYXMgcHJldmFpbGluZworICAgICAgYm9vbCBQcmV2YWlsaW5nID0gZmFsc2U7CisgICAgfTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQ29tbW9uUmVzb2x1dGlvbj4gQ29tbW9uczsKKworICAgIHVuc2lnbmVkIFBhcmFsbGVsQ29kZUdlblBhcmFsbGVsaXNtTGV2ZWw7CisgICAgTFRPTExWTUNvbnRleHQgQ3R4OworICAgIHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IENvbWJpbmVkTW9kdWxlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJUk1vdmVyPiBNb3ZlcjsKKworICAgIC8vIFRoaXMgc3RvcmVzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHJlZ3VsYXIgTFRPIG1vZHVsZSB0aGF0IHdlIGhhdmUgYWRkZWQKKyAgICAvLyB0byB0aGUgbGluay4gSXQgd2lsbCBlaXRoZXIgYmUgbGlua2VkIGltbWVkaWF0ZWx5IChmb3IgbW9kdWxlcyB3aXRob3V0CisgICAgLy8gc3VtbWFyaWVzKSBvciBhZnRlciBzdW1tYXJ5LWJhc2VkIGRlYWQgc3RyaXBwaW5nIChmb3IgbW9kdWxlcyB3aXRoCisgICAgLy8gc3VtbWFyaWVzKS4KKyAgICBzdHJ1Y3QgQWRkZWRNb2R1bGUgeworICAgICAgc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gTTsKKyAgICAgIHN0ZDo6dmVjdG9yPEdsb2JhbFZhbHVlICo+IEtlZXA7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxBZGRlZE1vZHVsZT4gTW9kc1dpdGhTdW1tYXJpZXM7CisgIH0gUmVndWxhckxUTzsKKworICBzdHJ1Y3QgVGhpbkxUT1N0YXRlIHsKKyAgICBUaGluTFRPU3RhdGUoVGhpbkJhY2tlbmQgQmFja2VuZCk7CisKKyAgICBUaGluQmFja2VuZCBCYWNrZW5kOworICAgIE1vZHVsZVN1bW1hcnlJbmRleCBDb21iaW5lZEluZGV4OworICAgIE1hcFZlY3RvcjxTdHJpbmdSZWYsIEJpdGNvZGVNb2R1bGU+IE1vZHVsZU1hcDsKKyAgICBEZW5zZU1hcDxHbG9iYWxWYWx1ZTo6R1VJRCwgU3RyaW5nUmVmPiBQcmV2YWlsaW5nTW9kdWxlRm9yR1VJRDsKKyAgfSBUaGluTFRPOworCisgIC8vIFRoZSBnbG9iYWwgcmVzb2x1dGlvbiBmb3IgYSBwYXJ0aWN1bGFyIChtYW5nbGVkKSBzeW1ib2wgbmFtZS4gVGhpcyBpcyBpbgorICAvLyBwYXJ0aWN1bGFyIG5lY2Vzc2FyeSB0byB0cmFjayB3aGV0aGVyIGVhY2ggc3ltYm9sIGNhbiBiZSBpbnRlcm5hbGl6ZWQuCisgIC8vIEJlY2F1c2UgYW55IGlucHV0IGZpbGUgbWF5IGludHJvZHVjZSBhIG5ldyBjcm9zcy1wYXJ0aXRpb24gcmVmZXJlbmNlLCB3ZQorICAvLyBjYW5ub3QgbWFrZSBhbnkgZmluYWwgaW50ZXJuYWxpemF0aW9uIGRlY2lzaW9ucyB1bnRpbCBhbGwgaW5wdXQgZmlsZXMgaGF2ZQorICAvLyBiZWVuIGFkZGVkIGFuZCB0aGUgY2xpZW50IGhhcyBjYWxsZWQgcnVuKCkuIER1cmluZyBydW4oKSB3ZSBhcHBseQorICAvLyBpbnRlcm5hbGl6YXRpb24gZGVjaXNpb25zIGVpdGhlciBkaXJlY3RseSB0byB0aGUgbW9kdWxlIChmb3IgcmVndWxhciBMVE8pCisgIC8vIG9yIHRvIHRoZSBjb21iaW5lZCBpbmRleCAoZm9yIFRoaW5MVE8pLgorICBzdHJ1Y3QgR2xvYmFsUmVzb2x1dGlvbiB7CisgICAgLy8vIFRoZSB1bm1hbmdsZWQgbmFtZSBvZiB0aGUgZ2xvYmFsLgorICAgIHN0ZDo6c3RyaW5nIElSTmFtZTsKKworICAgIC8vLyBLZWVwIHRyYWNrIGlmIHRoZSBzeW1ib2wgaXMgdmlzaWJsZSBvdXRzaWRlIG9mIGEgbW9kdWxlIHdpdGggYSBzdW1tYXJ5CisgICAgLy8vIChpLmUuIGluIGVpdGhlciBhIHJlZ3VsYXIgb2JqZWN0IG9yIGEgcmVndWxhciBMVE8gbW9kdWxlIHdpdGhvdXQgYQorICAgIC8vLyBzdW1tYXJ5KS4KKyAgICBib29sIFZpc2libGVPdXRzaWRlU3VtbWFyeSA9IGZhbHNlOworCisgICAgYm9vbCBVbm5hbWVkQWRkciA9IHRydWU7CisKKyAgICAvLy8gVHJ1ZSBpZiBtb2R1bGUgY29udGFpbnMgdGhlIHByZXZhaWxpbmcgZGVmaW5pdGlvbi4KKyAgICBib29sIFByZXZhaWxpbmcgPSBmYWxzZTsKKworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgbW9kdWxlIGNvbnRhaW5zIHRoZSBwcmV2YWlsaW5nIGRlZmluaXRpb24gYW5kIHN5bWJvbCBpcworICAgIC8vLyBhbiBJUiBzeW1ib2wuIEZvciBleGFtcGxlIHdoZW4gbW9kdWxlLWxldmVsIGlubGluZSBhc20gYmxvY2sgaXMgdXNlZCwKKyAgICAvLy8gc3ltYm9sIGNhbiBiZSBwcmV2YWlsaW5nIGluIG1vZHVsZSBidXQgaGF2ZSBubyBJUiBuYW1lLgorICAgIGJvb2wgaXNQcmV2YWlsaW5nSVJTeW1ib2woKSBjb25zdCB7IHJldHVybiBQcmV2YWlsaW5nICYmICFJUk5hbWUuZW1wdHkoKTsgfQorCisgICAgLy8vIFRoaXMgZmllbGQga2VlcHMgdHJhY2sgb2YgdGhlIHBhcnRpdGlvbiBudW1iZXIgb2YgdGhpcyBnbG9iYWwuIFRoZQorICAgIC8vLyByZWd1bGFyIExUTyBvYmplY3QgaXMgcGFydGl0aW9uIDAsIHdoaWxlIGVhY2ggVGhpbkxUTyBvYmplY3QgaGFzIGl0cyBvd24KKyAgICAvLy8gcGFydGl0aW9uIG51bWJlciBmcm9tIDEgb253YXJkcy4KKyAgICAvLy8KKyAgICAvLy8gQW55IGdsb2JhbCB0aGF0IGlzIGRlZmluZWQgb3IgdXNlZCBieSBtb3JlIHRoYW4gb25lIHBhcnRpdGlvbiwgb3IgdGhhdAorICAgIC8vLyBpcyByZWZlcmVuY2VkIGV4dGVybmFsbHksIG1heSBub3QgYmUgaW50ZXJuYWxpemVkLgorICAgIC8vLworICAgIC8vLyBQYXJ0aXRpb25zIGdlbmVyYWxseSBoYXZlIGEgb25lLXRvLW9uZSBjb3JyZXNwb25kZW5jZSB3aXRoIHRhc2tzLCBleGNlcHQKKyAgICAvLy8gdGhhdCB3ZSB1c2UgcGFydGl0aW9uIDAgZm9yIGFsbCBwYXJhbGxlbCBMVE8gY29kZSBnZW5lcmF0aW9uIHBhcnRpdGlvbnMuCisgICAgLy8vIEFueSBwYXJ0aXRpb25pbmcgb2YgdGhlIGNvbWJpbmVkIExUTyBvYmplY3QgaXMgZG9uZSBpbnRlcm5hbGx5IGJ5IHRoZQorICAgIC8vLyBMVE8gYmFja2VuZC4KKyAgICB1bnNpZ25lZCBQYXJ0aXRpb24gPSBVbmtub3duOworCisgICAgLy8vIFNwZWNpYWwgcGFydGl0aW9uIG51bWJlcnMuCisgICAgZW51bSA6IHVuc2lnbmVkIHsKKyAgICAgIC8vLyBBIHBhcnRpdGlvbiBudW1iZXIgaGFzIG5vdCB5ZXQgYmVlbiBhc3NpZ25lZCB0byB0aGlzIGdsb2JhbC4KKyAgICAgIFVua25vd24gPSAtMXUsCisKKyAgICAgIC8vLyBUaGlzIGdsb2JhbCBpcyBlaXRoZXIgdXNlZCBieSBtb3JlIHRoYW4gb25lIHBhcnRpdGlvbiBvciBoYXMgYW4KKyAgICAgIC8vLyBleHRlcm5hbCByZWZlcmVuY2UsIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGludGVybmFsaXplZC4KKyAgICAgIEV4dGVybmFsID0gLTJ1LAorCisgICAgICAvLy8gVGhlIFJlZ3VsYXJMVE8gcGFydGl0aW9uCisgICAgICBSZWd1bGFyTFRPID0gMCwKKyAgICB9OworICB9OworCisgIC8vIEdsb2JhbCBtYXBwaW5nIGZyb20gbWFuZ2xlZCBzeW1ib2wgbmFtZXMgdG8gcmVzb2x1dGlvbnMuCisgIFN0cmluZ01hcDxHbG9iYWxSZXNvbHV0aW9uPiBHbG9iYWxSZXNvbHV0aW9uczsKKworICB2b2lkIGFkZE1vZHVsZVRvR2xvYmFsUmVzKEFycmF5UmVmPElucHV0RmlsZTo6U3ltYm9sPiBTeW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFN5bWJvbFJlc29sdXRpb24+IFJlcywgdW5zaWduZWQgUGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5TdW1tYXJ5KTsKKworICAvLyBUaGVzZSBmdW5jdGlvbnMgdGFrZSBhIHJhbmdlIG9mIHN5bWJvbCByZXNvbHV0aW9ucyBbUmVzSSwgUmVzRSkgYW5kIGNvbnN1bWUKKyAgLy8gdGhlIHJlc29sdXRpb25zIHVzZWQgYnkgYSBzaW5nbGUgaW5wdXQgbW9kdWxlIGJ5IGluY3JlbWVudGluZyBSZXNJLiBBZnRlcgorICAvLyB0aGVzZSBmdW5jdGlvbnMgcmV0dXJuLCBbUmVzSSwgUmVzRSkgd2lsbCByZWZlciB0byB0aGUgcmVzb2x1dGlvbiByYW5nZSBmb3IKKyAgLy8gdGhlIHJlbWFpbmluZyBtb2R1bGVzIGluIHRoZSBJbnB1dEZpbGUuCisgIEVycm9yIGFkZE1vZHVsZShJbnB1dEZpbGUgJklucHV0LCB1bnNpZ25lZCBNb2RJLAorICAgICAgICAgICAgICAgICAgY29uc3QgU3ltYm9sUmVzb2x1dGlvbiAqJlJlc0ksIGNvbnN0IFN5bWJvbFJlc29sdXRpb24gKlJlc0UpOworCisgIEV4cGVjdGVkPFJlZ3VsYXJMVE9TdGF0ZTo6QWRkZWRNb2R1bGU+CisgIGFkZFJlZ3VsYXJMVE8oQml0Y29kZU1vZHVsZSBCTSwgQXJyYXlSZWY8SW5wdXRGaWxlOjpTeW1ib2w+IFN5bXMsCisgICAgICAgICAgICAgICAgY29uc3QgU3ltYm9sUmVzb2x1dGlvbiAqJlJlc0ksIGNvbnN0IFN5bWJvbFJlc29sdXRpb24gKlJlc0UpOworICBFcnJvciBsaW5rUmVndWxhckxUTyhSZWd1bGFyTFRPU3RhdGU6OkFkZGVkTW9kdWxlIE1vZCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBMaXZlbmVzc0Zyb21JbmRleCk7CisKKyAgRXJyb3IgYWRkVGhpbkxUTyhCaXRjb2RlTW9kdWxlIEJNLCBBcnJheVJlZjxJbnB1dEZpbGU6OlN5bWJvbD4gU3ltcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBTeW1ib2xSZXNvbHV0aW9uIComUmVzSSwgY29uc3QgU3ltYm9sUmVzb2x1dGlvbiAqUmVzRSk7CisKKyAgRXJyb3IgcnVuUmVndWxhckxUTyhBZGRTdHJlYW1GbiBBZGRTdHJlYW0pOworICBFcnJvciBydW5UaGluTFRPKEFkZFN0cmVhbUZuIEFkZFN0cmVhbSwgTmF0aXZlT2JqZWN0Q2FjaGUgQ2FjaGUpOworCisgIG11dGFibGUgYm9vbCBDYWxsZWRHZXRNYXhUYXNrcyA9IGZhbHNlOworfTsKKworLy8vIFRoZSByZXNvbHV0aW9uIGZvciBhIHN5bWJvbC4gVGhlIGxpbmtlciBtdXN0IHByb3ZpZGUgYSBTeW1ib2xSZXNvbHV0aW9uIGZvcgorLy8vIGVhY2ggZ2xvYmFsIHN5bWJvbCBiYXNlZCBvbiBpdHMgaW50ZXJuYWwgcmVzb2x1dGlvbiBvZiB0aGF0IHN5bWJvbC4KK3N0cnVjdCBTeW1ib2xSZXNvbHV0aW9uIHsKKyAgU3ltYm9sUmVzb2x1dGlvbigpCisgICAgICA6IFByZXZhaWxpbmcoMCksIEZpbmFsRGVmaW5pdGlvbkluTGlua2FnZVVuaXQoMCksIFZpc2libGVUb1JlZ3VsYXJPYmooMCksCisgICAgICAgIExpbmtlclJlZGVmaW5lZCgwKSB7fQorCisgIC8vLyBUaGUgbGlua2VyIGhhcyBjaG9zZW4gdGhpcyBkZWZpbml0aW9uIG9mIHRoZSBzeW1ib2wuCisgIHVuc2lnbmVkIFByZXZhaWxpbmcgOiAxOworCisgIC8vLyBUaGUgZGVmaW5pdGlvbiBvZiB0aGlzIHN5bWJvbCBpcyB1bnByZWVtcHRhYmxlIGF0IHJ1bnRpbWUgYW5kIGlzIGtub3duIHRvCisgIC8vLyBiZSBpbiB0aGlzIGxpbmthZ2UgdW5pdC4KKyAgdW5zaWduZWQgRmluYWxEZWZpbml0aW9uSW5MaW5rYWdlVW5pdCA6IDE7CisKKyAgLy8vIFRoZSBkZWZpbml0aW9uIG9mIHRoaXMgc3ltYm9sIGlzIHZpc2libGUgb3V0c2lkZSBvZiB0aGUgTFRPIHVuaXQuCisgIHVuc2lnbmVkIFZpc2libGVUb1JlZ3VsYXJPYmogOiAxOworCisgIC8vLyBMaW5rZXIgcmVkZWZpbmVkIHZlcnNpb24gb2YgdGhlIHN5bWJvbCB3aGljaCBhcHBlYXJlZCBpbiAtd3JhcCBvciAtZGVmc3ltCisgIC8vLyBsaW5rZXIgb3B0aW9uLgorICB1bnNpZ25lZCBMaW5rZXJSZWRlZmluZWQgOiAxOworfTsKKworfSAvLyBuYW1lc3BhY2UgbHRvCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MVE8vTFRPQmFja2VuZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MVE8vTFRPQmFja2VuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NzQzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xUTy9MVE9CYWNrZW5kLmgKQEAgLTAsMCArMSw1MiBAQAorLy89PT0tTFRPQmFja2VuZC5oIC0gTExWTSBMaW5rIFRpbWUgT3B0aW1pemVyIEJhY2tlbmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgImJhY2tlbmQiIHBoYXNlIG9mIExUTywgaS5lLiBpdCBwZXJmb3JtcworLy8gb3B0aW1pemF0aW9uIGFuZCBjb2RlIGdlbmVyYXRpb24gb24gYSBsb2FkZWQgbW9kdWxlLiBJdCBpcyBnZW5lcmFsbHkgdXNlZAorLy8gaW50ZXJuYWxseSBieSB0aGUgTFRPIGNsYXNzIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIGluZGVwZW5kZW50bHksIGZvciBleGFtcGxlCisvLyB0byBpbXBsZW1lbnQgYSBzdGFuZGFsb25lIFRoaW5MVE8gYmFja2VuZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTFRPX0xUT0JBQ0tFTkRfSAorI2RlZmluZSBMTFZNX0xUT19MVE9CQUNLRU5EX0gKKworI2luY2x1ZGUgImxsdm0vQURUL01hcFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGlhZ25vc3RpY0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZVN1bW1hcnlJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vTFRPL0xUTy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0lQTy9GdW5jdGlvbkltcG9ydC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJpdGNvZGVNb2R1bGU7CitjbGFzcyBFcnJvcjsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFRhcmdldDsKKworbmFtZXNwYWNlIGx0byB7CisKKy8vLyBSdW5zIGEgcmVndWxhciBMVE8gYmFja2VuZC4gVGhlIHJlZ3VsYXIgTFRPIGJhY2tlbmQgY2FuIGFsc28gYWN0IGFzIHRoZQorLy8vIHJlZ3VsYXIgTFRPIHBoYXNlIG9mIFRoaW5MVE8sIHdoaWNoIG1heSBuZWVkIHRvIGFjY2VzcyB0aGUgY29tYmluZWQgaW5kZXguCitFcnJvciBiYWNrZW5kKENvbmZpZyAmQywgQWRkU3RyZWFtRm4gQWRkU3RyZWFtLAorICAgICAgICAgICAgICB1bnNpZ25lZCBQYXJhbGxlbENvZGVHZW5QYXJhbGxlbGlzbUxldmVsLAorICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNLCBNb2R1bGVTdW1tYXJ5SW5kZXggJkNvbWJpbmVkSW5kZXgpOworCisvLy8gUnVucyBhIFRoaW5MVE8gYmFja2VuZC4KK0Vycm9yIHRoaW5CYWNrZW5kKENvbmZpZyAmQywgdW5zaWduZWQgVGFzaywgQWRkU3RyZWFtRm4gQWRkU3RyZWFtLCBNb2R1bGUgJk0sCisgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGVTdW1tYXJ5SW5kZXggJkNvbWJpbmVkSW5kZXgsCisgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkltcG9ydGVyOjpJbXBvcnRNYXBUeSAmSW1wb3J0TGlzdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEdWU3VtbWFyeU1hcFR5ICZEZWZpbmVkR2xvYmFscywKKyAgICAgICAgICAgICAgICAgIE1hcFZlY3RvcjxTdHJpbmdSZWYsIEJpdGNvZGVNb2R1bGU+ICZNb2R1bGVNYXApOworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL2xlZ2FjeS9MVE9Db2RlR2VuZXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xUTy9sZWdhY3kvTFRPQ29kZUdlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OGFiMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xUTy9sZWdhY3kvTFRPQ29kZUdlbmVyYXRvci5oCkBAIC0wLDAgKzEsMjQ0IEBACisvLz09PS1MVE9Db2RlR2VuZXJhdG9yLmggLSBMTFZNIExpbmsgVGltZSBPcHRpbWl6ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgTFRPQ29kZUdlbmVyYXRvciBjbGFzcy4KKy8vCisvLyAgIExUTyBjb21waWxhdGlvbiBjb25zaXN0cyBvZiB0aHJlZSBwaGFzZXM6IFByZS1JUE8sIElQTyBhbmQgUG9zdC1JUE8uCisvLworLy8gICBUaGUgUHJlLUlQTyBwaGFzZSBjb21waWxlcyBzb3VyY2UgY29kZSBpbnRvIGJpdGNvZGUgZmlsZS4gVGhlIHJlc3VsdGluZworLy8gYml0Y29kZSBmaWxlcywgYWxvbmcgd2l0aCBvYmplY3QgZmlsZXMgYW5kIGxpYnJhcmllcywgd2lsbCBiZSBmZWQgdG8gdGhlCisvLyBsaW5rZXIgdG8gdGhyb3VnaCB0aGUgSVBPIGFuZCBQb3N0LUlQTyBwaGFzZXMuIEJ5IHVzaW5nIG9iai1maWxlIGV4dGVuc2lvbiwKKy8vIHRoZSByZXN1bHRpbmcgYml0Y29kZSBmaWxlIGRpc2d1aXNlcyBpdHNlbGYgYXMgYW4gb2JqZWN0IGZpbGUsIGFuZCB0aGVyZWZvcmUKKy8vIG9idmlhdGVzIHRoZSBuZWVkIG9mIHdyaXRpbmcgYSBzcGVjaWFsIHNldCBvZiB0aGUgbWFrZS1ydWxlcyBvbmx5IGZvciBMVE8KKy8vIGNvbXBpbGF0aW9uLgorLy8KKy8vICAgVGhlIElQTyBwaGFzZSBwZXJmb3JtIGludGVyLXByb2NlZHVyYWwgYW5hbHlzZXMgYW5kIG9wdGltaXphdGlvbnMsIGFuZAorLy8gdGhlIFBvc3QtSVBPIGNvbnNpc3RzIHR3byBzdWItcGhhc2VzOiBpbnRyYS1wcm9jZWR1cmFsIHNjYWxhciBvcHRpbWl6YXRpb25zCisvLyAoU09QVCksIGFuZCBpbnRyYS1wcm9jZWR1cmFsIHRhcmdldC1kZXBlbmRlbnQgY29kZSBnZW5lcmF0b3IgKENHKS4KKy8vCisvLyAgIEFzIG9mIHRoaXMgd3JpdGluZywgd2UgZG9uJ3Qgc2VwYXJhdGUgSVBPIGFuZCB0aGUgUG9zdC1JUE8gU09QVC4gVGhleQorLy8gYXJlIGludGVybWluZ2xlZCB0b2dldGhlciwgYW5kIGFyZSBkcml2ZW4gYnkgYSBzaW5nbGUgcGFzcyBtYW5hZ2VyIChzZWUKKy8vIFBhc3NNYW5hZ2VyQnVpbGRlcjo6cG9wdWxhdGVMVE9QYXNzTWFuYWdlcigpKS4KKy8vCisvLyAgIFRoZSAiTFRPQ29kZUdlbmVyYXRvciIgaXMgdGhlIGRyaXZlciBmb3IgdGhlIElQTyBhbmQgUG9zdC1JUE8gc3RhZ2VzLgorLy8gVGhlICJDb2RlR2VuZXJhdG9yIiBoZXJlIGlzIGJpdCBjb25mdXNpbmcuIERvbid0IGNvbmZ1c2UgdGhlICJDb2RlR2VuZXJhdG9yIgorLy8gd2l0aCB0aGUgbWFjaGluZSBzcGVjaWZpYyBjb2RlIGdlbmVyYXRvci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTFRPX0xUT0NPREVHRU5FUkFUT1JfSAorI2RlZmluZSBMTFZNX0xUT19MVE9DT0RFR0VORVJBVE9SX0gKKworI2luY2x1ZGUgImxsdm0tYy9sdG8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Ub29sT3V0cHV0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0gewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEFycmF5UmVmOworICBjbGFzcyBMTFZNQ29udGV4dDsKKyAgY2xhc3MgRGlhZ25vc3RpY0luZm87CisgIGNsYXNzIExpbmtlcjsKKyAgY2xhc3MgTWFuZ2xlcjsKKyAgY2xhc3MgTWVtb3J5QnVmZmVyOworICBjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbzsKKyAgY2xhc3MgVGFyZ2V0TWFjaGluZTsKKyAgY2xhc3MgcmF3X29zdHJlYW07CisgIGNsYXNzIHJhd19wd3JpdGVfc3RyZWFtOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEMrKyBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIHRoZSBvcGFxdWUgbHRvX2NvZGVfZ2VuX3QgdHlwZS4KKy8vLworc3RydWN0IExUT0NvZGVHZW5lcmF0b3IgeworICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0VmVyc2lvblN0cmluZygpOworCisgIExUT0NvZGVHZW5lcmF0b3IoTExWTUNvbnRleHQgJkNvbnRleHQpOworICB+TFRPQ29kZUdlbmVyYXRvcigpOworCisgIC8vLyBNZXJnZSBnaXZlbiBtb2R1bGUuICBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLgorICAvLy8KKyAgLy8vIFJlc2V0cyBcYSBIYXNWZXJpZmllZElucHV0LgorICBib29sIGFkZE1vZHVsZShzdHJ1Y3QgTFRPTW9kdWxlICopOworCisgIC8vLyBTZXQgdGhlIGRlc3RpbmF0aW9uIG1vZHVsZS4KKyAgLy8vCisgIC8vLyBSZXNldHMgXGEgSGFzVmVyaWZpZWRJbnB1dC4KKyAgdm9pZCBzZXRNb2R1bGUoc3RkOjp1bmlxdWVfcHRyPExUT01vZHVsZT4gTSk7CisKKyAgdm9pZCBzZXRBc21VbmRlZmluZWRSZWZzKHN0cnVjdCBMVE9Nb2R1bGUgKik7CisgIHZvaWQgc2V0VGFyZ2V0T3B0aW9ucyhjb25zdCBUYXJnZXRPcHRpb25zICZPcHRpb25zKTsKKyAgdm9pZCBzZXREZWJ1Z0luZm8obHRvX2RlYnVnX21vZGVsKTsKKyAgdm9pZCBzZXRDb2RlUElDTW9kZWwoT3B0aW9uYWw8UmVsb2M6Ok1vZGVsPiBNb2RlbCkgeyBSZWxvY01vZGVsID0gTW9kZWw7IH0KKworICAvLy8gU2V0IHRoZSBmaWxlIHR5cGUgdG8gYmUgZW1pdHRlZCAoYXNzZW1ibHkgb3Igb2JqZWN0IGNvZGUpLgorICAvLy8gVGhlIGRlZmF1bHQgaXMgVGFyZ2V0TWFjaGluZTo6Q0dGVF9PYmplY3RGaWxlLgorICB2b2lkIHNldEZpbGVUeXBlKFRhcmdldE1hY2hpbmU6OkNvZGVHZW5GaWxlVHlwZSBGVCkgeyBGaWxlVHlwZSA9IEZUOyB9CisKKyAgdm9pZCBzZXRDcHUoU3RyaW5nUmVmIE1DcHUpIHsgdGhpcy0+TUNwdSA9IE1DcHU7IH0KKyAgdm9pZCBzZXRBdHRyKFN0cmluZ1JlZiBNQXR0cikgeyB0aGlzLT5NQXR0ciA9IE1BdHRyOyB9CisgIHZvaWQgc2V0T3B0TGV2ZWwodW5zaWduZWQgT3B0TGV2ZWwpOworCisgIHZvaWQgc2V0U2hvdWxkSW50ZXJuYWxpemUoYm9vbCBWYWx1ZSkgeyBTaG91bGRJbnRlcm5hbGl6ZSA9IFZhbHVlOyB9CisgIHZvaWQgc2V0U2hvdWxkRW1iZWRVc2VsaXN0cyhib29sIFZhbHVlKSB7IFNob3VsZEVtYmVkVXNlbGlzdHMgPSBWYWx1ZTsgfQorCisgIC8vLyBSZXN0b3JlIGxpbmthZ2Ugb2YgZ2xvYmFscworICAvLy8KKyAgLy8vIFdoZW4gc2V0LCB0aGUgbGlua2FnZSBvZiBnbG9iYWxzIHdpbGwgYmUgcmVzdG9yZWQgcHJpb3IgdG8gY29kZQorICAvLy8gZ2VuZXJhdGlvbi4gVGhhdCBpcywgYSBnbG9iYWwgc3ltYm9sIHRoYXQgaGFkIGV4dGVybmFsIGxpbmthZ2UgcHJpb3IgdG8KKyAgLy8vIExUTyB3aWxsIGJlIGVtaXR0ZWQgd2l0aCBleHRlcm5hbCBsaW5rYWdlIGFnYWluOyBhbmQgYSBsb2NhbCB3aWxsIHJlbWFpbgorICAvLy8gbG9jYWwuIE5vdGUgdGhhdCB0aGlzIG9wdGlvbiBvbmx5IGFmZmVjdHMgdGhlIGVuZCByZXN1bHQgLSBnbG9iYWxzIG1heQorICAvLy8gc3RpbGwgYmUgaW50ZXJuYWxpemVkIGluIHRoZSBwcm9jZXNzIG9mIExUTyBhbmQgbWF5IGJlIG1vZGlmaWVkIGFuZC9vcgorICAvLy8gZGVsZXRlZCB3aGVyZSBsZWdhbC4KKyAgLy8vCisgIC8vLyBUaGUgZGVmYXVsdCBiZWhhdmlvciB3aWxsIGludGVybmFsaXplIGdsb2JhbHMgKHVubGVzcyBvbiB0aGUgcHJlc2VydmUKKyAgLy8vIGxpc3QpIGFuZCwgaWYgcGFyYWxsZWwgY29kZSBnZW5lcmF0aW9uIGlzIGVuYWJsZWQsIHdpbGwgZXh0ZXJuYWxpemUKKyAgLy8vIGFsbCBsb2NhbHMuCisgIHZvaWQgc2V0U2hvdWxkUmVzdG9yZUdsb2JhbHNMaW5rYWdlKGJvb2wgVmFsdWUpIHsKKyAgICBTaG91bGRSZXN0b3JlR2xvYmFsc0xpbmthZ2UgPSBWYWx1ZTsKKyAgfQorCisgIHZvaWQgYWRkTXVzdFByZXNlcnZlU3ltYm9sKFN0cmluZ1JlZiBTeW0pIHsgTXVzdFByZXNlcnZlU3ltYm9sc1tTeW1dID0gMTsgfQorCisgIC8vLyBQYXNzIG9wdGlvbnMgdG8gdGhlIGRyaXZlciBhbmQgb3B0aW1pemF0aW9uIHBhc3Nlcy4KKyAgLy8vCisgIC8vLyBUaGVzZSBvcHRpb25zIGFyZSBub3QgbmVjZXNzYXJpbHkgZm9yIGRlYnVnZ2luZyBwdXJwb3NlICh0aGUgZnVuY3Rpb24KKyAgLy8vIG5hbWUgaXMgbWlzbGVhZGluZykuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCisgIC8vLyBMVE9Db2RlR2VuZXJhdG9yOjpjb21waWxleHh4KCksIGFuZAorICAvLy8gTFRPQ29kZUdlbmVyYXRvcjo6d3JpdGVNZXJnZWRNb2R1bGVzKCkuCisgIHZvaWQgc2V0Q29kZUdlbkRlYnVnT3B0aW9ucyhTdHJpbmdSZWYgT3B0cyk7CisKKyAgLy8vIFBhcnNlIHRoZSBvcHRpb25zIHNldCBpbiBzZXRDb2RlR2VuRGVidWdPcHRpb25zLgorICAvLy8KKyAgLy8vIExpa2UgXGEgc2V0Q29kZUdlbkRlYnVnT3B0aW9ucygpLCB0aGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZQorICAvLy8gTFRPQ29kZUdlbmVyYXRvcjo6Y29tcGlsZXh4eCgpIGFuZAorICAvLy8gTFRPQ29kZUdlbmVyYXRvcjo6d3JpdGVNZXJnZWRNb2R1bGVzKCkuCisgIHZvaWQgcGFyc2VDb2RlR2VuRGVidWdPcHRpb25zKCk7CisKKyAgLy8vIFdyaXRlIHRoZSBtZXJnZWQgbW9kdWxlIHRvIHRoZSBmaWxlIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gcGF0aC4gIFJldHVybgorICAvLy8gdHJ1ZSBvbiBzdWNjZXNzLgorICAvLy8KKyAgLy8vIENhbGxzIFxhIHZlcmlmeU1lcmdlZE1vZHVsZU9uY2UoKS4KKyAgYm9vbCB3cml0ZU1lcmdlZE1vZHVsZXMoU3RyaW5nUmVmIFBhdGgpOworCisgIC8vLyBDb21waWxlIHRoZSBtZXJnZWQgbW9kdWxlIGludG8gYSAqc2luZ2xlKiBvdXRwdXQgZmlsZTsgdGhlIHBhdGggdG8gb3V0cHV0CisgIC8vLyBmaWxlIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgdmlhIGFyZ3VtZW50ICJuYW1lIi4gUmV0dXJuIHRydWUgb24KKyAgLy8vIHN1Y2Nlc3MuCisgIC8vLworICAvLy8gXG5vdGUgSXQgaXMgdXAgdG8gdGhlIGxpbmtlciB0byByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBvdXRwdXQgZmlsZS4gIERvCisgIC8vLyBub3QgdHJ5IHRvIHJlbW92ZSB0aGUgb2JqZWN0IGZpbGUgaW4gTFRPQ29kZUdlbmVyYXRvcidzIGRlc3RydWN0b3IgYXMgd2UKKyAgLy8vIGRvbid0IHdobyAoTFRPQ29kZUdlbmVyYXRvciBvciB0aGUgb3V0cHV0IGZpbGUpIHdpbGwgbGFzdCBsb25nZXIuCisgIGJvb2wgY29tcGlsZV90b19maWxlKGNvbnN0IGNoYXIgKipOYW1lLCBib29sIERpc2FibGVWZXJpZnksCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGlzYWJsZUlubGluZSwgYm9vbCBEaXNhYmxlR1ZOTG9hZFBSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEaXNhYmxlVmVjdG9yaXphdGlvbik7CisKKyAgLy8vIEFzIHdpdGggY29tcGlsZV90b19maWxlKCksIHRoaXMgZnVuY3Rpb24gY29tcGlsZXMgdGhlIG1lcmdlZCBtb2R1bGUgaW50bworICAvLy8gc2luZ2xlIG91dHB1dCBmaWxlLiBJbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgb3V0cHV0IGZpbGUgcGF0aCB0byB0aGUKKyAgLy8vIGNhbGxlciAobGlua2VyKSwgaXQgYnJpbmdzIHRoZSBvdXRwdXQgdG8gYSBidWZmZXIsIGFuZCByZXR1cm5zIHRoZSBidWZmZXIKKyAgLy8vIHRvIHRoZSBjYWxsZXIuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGRlbGV0ZSB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgb25jZQorICAvLy8gaXRzIGNvbnRlbnQgaXMgYnJvdWdodCB0byBtZW1vcnkuIFJldHVybiBOVUxMIGlmIHRoZSBjb21waWxhdGlvbiB3YXMgbm90CisgIC8vLyBzdWNjZXNzZnVsLgorICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBjb21waWxlKGJvb2wgRGlzYWJsZVZlcmlmeSwgYm9vbCBEaXNhYmxlSW5saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGlzYWJsZUdWTkxvYWRQUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEaXNhYmxlVmVjdG9yaXphdGlvbik7CisKKyAgLy8vIE9wdGltaXplcyB0aGUgbWVyZ2VkIG1vZHVsZS4gIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgorICAvLy8KKyAgLy8vIENhbGxzIFxhIHZlcmlmeU1lcmdlZE1vZHVsZU9uY2UoKS4KKyAgYm9vbCBvcHRpbWl6ZShib29sIERpc2FibGVWZXJpZnksIGJvb2wgRGlzYWJsZUlubGluZSwgYm9vbCBEaXNhYmxlR1ZOTG9hZFBSRSwKKyAgICAgICAgICAgICAgICBib29sIERpc2FibGVWZWN0b3JpemF0aW9uKTsKKworICAvLy8gQ29tcGlsZXMgdGhlIG1lcmdlZCBvcHRpbWl6ZWQgbW9kdWxlIGludG8gYSBzaW5nbGUgb3V0cHV0IGZpbGUuIEl0IGJyaW5ncworICAvLy8gdGhlIG91dHB1dCB0byBhIGJ1ZmZlciwgYW5kIHJldHVybnMgdGhlIGJ1ZmZlciB0byB0aGUgY2FsbGVyLiBSZXR1cm4gTlVMTAorICAvLy8gaWYgdGhlIGNvbXBpbGF0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KKyAgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gY29tcGlsZU9wdGltaXplZCgpOworCisgIC8vLyBDb21waWxlIHRoZSBtZXJnZWQgb3B0aW1pemVkIG1vZHVsZSBpbnRvIG91dC5zaXplKCkgb3V0cHV0IGZpbGVzIGVhY2gKKyAgLy8vIHJlcHJlc2VudGluZyBhIGxpbmthYmxlIHBhcnRpdGlvbiBvZiB0aGUgbW9kdWxlLiBJZiBvdXQgY29udGFpbnMgbW9yZQorICAvLy8gdGhhbiBvbmUgZWxlbWVudCwgY29kZSBnZW5lcmF0aW9uIGlzIGRvbmUgaW4gcGFyYWxsZWwgd2l0aCBvdXQuc2l6ZSgpCisgIC8vLyB0aHJlYWRzLiAgT3V0cHV0IGZpbGVzIHdpbGwgYmUgd3JpdHRlbiB0byBtZW1iZXJzIG9mIG91dC4gUmV0dXJucyB0cnVlIG9uCisgIC8vLyBzdWNjZXNzLgorICAvLy8KKyAgLy8vIENhbGxzIFxhIHZlcmlmeU1lcmdlZE1vZHVsZU9uY2UoKS4KKyAgYm9vbCBjb21waWxlT3B0aW1pemVkKEFycmF5UmVmPHJhd19wd3JpdGVfc3RyZWFtICo+IE91dCk7CisKKyAgLy8vIEVuYWJsZSB0aGUgRnJlZXN0YW5kaW5nIG1vZGU6IGluZGljYXRlIHRoYXQgdGhlIG9wdGltaXplciBzaG91bGQgbm90CisgIC8vLyBhc3N1bWUgYnVpbHRpbnMgYXJlIHByZXNlbnQgb24gdGhlIHRhcmdldC4KKyAgdm9pZCBzZXRGcmVlc3RhbmRpbmcoYm9vbCBFbmFibGVkKSB7IEZyZWVzdGFuZGluZyA9IEVuYWJsZWQ7IH0KKworICB2b2lkIHNldERpYWdub3N0aWNIYW5kbGVyKGx0b19kaWFnbm9zdGljX2hhbmRsZXJfdCwgdm9pZCAqKTsKKworICBMTFZNQ29udGV4dCAmZ2V0Q29udGV4dCgpIHsgcmV0dXJuIENvbnRleHQ7IH0KKworICB2b2lkIHJlc2V0TWVyZ2VkTW9kdWxlKCkgeyBNZXJnZWRNb2R1bGUucmVzZXQoKTsgfQorICB2b2lkIERpYWdub3N0aWNIYW5kbGVyKGNvbnN0IERpYWdub3N0aWNJbmZvICZESSk7CisKK3ByaXZhdGU6CisgIHZvaWQgaW5pdGlhbGl6ZUxUT1Bhc3NlcygpOworCisgIC8vLyBWZXJpZnkgdGhlIG1lcmdlZCBtb2R1bGUgb24gZmlyc3QgY2FsbC4KKyAgLy8vCisgIC8vLyBTZXRzIFxhIEhhc1ZlcmlmaWVkSW5wdXQgb24gZmlyc3QgY2FsbCBhbmQgZG9lc24ndCBydW4gYWdhaW4gb24gdGhlIHNhbWUKKyAgLy8vIGlucHV0LgorICB2b2lkIHZlcmlmeU1lcmdlZE1vZHVsZU9uY2UoKTsKKworICBib29sIGNvbXBpbGVPcHRpbWl6ZWRUb0ZpbGUoY29uc3QgY2hhciAqKk5hbWUpOworICB2b2lkIHJlc3RvcmVMaW5rYWdlRm9yRXh0ZXJuYWxzKCk7CisgIHZvaWQgYXBwbHlTY29wZVJlc3RyaWN0aW9ucygpOworICB2b2lkIHByZXNlcnZlRGlzY2FyZGFibGVHVnMoCisgICAgICBNb2R1bGUgJlRoZU1vZHVsZSwKKyAgICAgIGxsdm06OmZ1bmN0aW9uX3JlZjxib29sKGNvbnN0IEdsb2JhbFZhbHVlICYpPiBtdXN0UHJlc2VydmVHVik7CisKKyAgYm9vbCBkZXRlcm1pbmVUYXJnZXQoKTsKKyAgc3RkOjp1bmlxdWVfcHRyPFRhcmdldE1hY2hpbmU+IGNyZWF0ZVRhcmdldE1hY2hpbmUoKTsKKworICB2b2lkIGVtaXRFcnJvcihjb25zdCBzdGQ6OnN0cmluZyAmRXJyTXNnKTsKKyAgdm9pZCBlbWl0V2FybmluZyhjb25zdCBzdGQ6OnN0cmluZyAmRXJyTXNnKTsKKworICB2b2lkIGZpbmlzaE9wdGltaXphdGlvblJlbWFya3MoKTsKKworICBMTFZNQ29udGV4dCAmQ29udGV4dDsKKyAgc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gTWVyZ2VkTW9kdWxlOworICBzdGQ6OnVuaXF1ZV9wdHI8TGlua2VyPiBUaGVMaW5rZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxUYXJnZXRNYWNoaW5lPiBUYXJnZXRNYWNoOworICBib29sIEVtaXREd2FyZkRlYnVnSW5mbyA9IGZhbHNlOworICBib29sIFNjb3BlUmVzdHJpY3Rpb25zRG9uZSA9IGZhbHNlOworICBib29sIEhhc1ZlcmlmaWVkSW5wdXQgPSBmYWxzZTsKKyAgT3B0aW9uYWw8UmVsb2M6Ok1vZGVsPiBSZWxvY01vZGVsOworICBTdHJpbmdTZXQ8PiBNdXN0UHJlc2VydmVTeW1ib2xzOworICBTdHJpbmdTZXQ8PiBBc21VbmRlZmluZWRSZWZzOworICBTdHJpbmdNYXA8R2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcz4gRXh0ZXJuYWxTeW1ib2xzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ29kZWdlbk9wdGlvbnM7CisgIHN0ZDo6c3RyaW5nIEZlYXR1cmVTdHI7CisgIHN0ZDo6c3RyaW5nIE1DcHU7CisgIHN0ZDo6c3RyaW5nIE1BdHRyOworICBzdGQ6OnN0cmluZyBOYXRpdmVPYmplY3RQYXRoOworICBUYXJnZXRPcHRpb25zIE9wdGlvbnM7CisgIENvZGVHZW5PcHQ6OkxldmVsIENHT3B0TGV2ZWwgPSBDb2RlR2VuT3B0OjpEZWZhdWx0OworICBjb25zdCBUYXJnZXQgKk1BcmNoID0gbnVsbHB0cjsKKyAgc3RkOjpzdHJpbmcgVHJpcGxlU3RyOworICB1bnNpZ25lZCBPcHRMZXZlbCA9IDI7CisgIGx0b19kaWFnbm9zdGljX2hhbmRsZXJfdCBEaWFnSGFuZGxlciA9IG51bGxwdHI7CisgIHZvaWQgKkRpYWdDb250ZXh0ID0gbnVsbHB0cjsKKyAgYm9vbCBTaG91bGRJbnRlcm5hbGl6ZSA9IHRydWU7CisgIGJvb2wgU2hvdWxkRW1iZWRVc2VsaXN0cyA9IGZhbHNlOworICBib29sIFNob3VsZFJlc3RvcmVHbG9iYWxzTGlua2FnZSA9IGZhbHNlOworICBUYXJnZXRNYWNoaW5lOjpDb2RlR2VuRmlsZVR5cGUgRmlsZVR5cGUgPSBUYXJnZXRNYWNoaW5lOjpDR0ZUX09iamVjdEZpbGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxUb29sT3V0cHV0RmlsZT4gRGlhZ25vc3RpY091dHB1dEZpbGU7CisgIGJvb2wgRnJlZXN0YW5kaW5nID0gZmFsc2U7Cit9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xUTy9sZWdhY3kvTFRPTW9kdWxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xUTy9sZWdhY3kvTFRPTW9kdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3ZTIyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL2xlZ2FjeS9MVE9Nb2R1bGUuaApAQCAtMCwwICsxLDIwOCBAQAorLy89PT0tTFRPTW9kdWxlLmggLSBMTFZNIExpbmsgVGltZSBPcHRpbWl6ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIExUT01vZHVsZSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTFRPX0xUT01PRFVMRV9ICisjZGVmaW5lIExMVk1fTFRPX0xUT01PRFVMRV9ICisKKyNpbmNsdWRlICJsbHZtLWMvbHRvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9JUk9iamVjdEZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9Nb2R1bGVTeW1ib2xUYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBGb3J3YXJkIHJlZmVyZW5jZXMgdG8gbGx2bSBjbGFzc2VzLgorbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBGdW5jdGlvbjsKKyAgY2xhc3MgR2xvYmFsVmFsdWU7CisgIGNsYXNzIE1lbW9yeUJ1ZmZlcjsKKyAgY2xhc3MgVGFyZ2V0T3B0aW9uczsKKyAgY2xhc3MgVmFsdWU7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQysrIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIG9wYXF1ZSBsdG9fbW9kdWxlX3QgdHlwZS4KKy8vLworc3RydWN0IExUT01vZHVsZSB7Citwcml2YXRlOgorICBzdHJ1Y3QgTmFtZUFuZEF0dHJpYnV0ZXMgeworICAgIFN0cmluZ1JlZiBuYW1lOworICAgIHVpbnQzMl90ICAgICAgICAgICBhdHRyaWJ1dGVzID0gMDsKKyAgICBib29sICAgICAgICAgICAgICAgaXNGdW5jdGlvbiA9IDA7CisgICAgY29uc3QgR2xvYmFsVmFsdWUgKnN5bWJvbCA9IDA7CisgIH07CisKKyAgc3RkOjp1bmlxdWVfcHRyPExMVk1Db250ZXh0PiBPd25lZENvbnRleHQ7CisKKyAgc3RkOjpzdHJpbmcgTGlua2VyT3B0czsKKworICBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNb2Q7CisgIE1lbW9yeUJ1ZmZlclJlZiBNQlJlZjsKKyAgTW9kdWxlU3ltYm9sVGFibGUgU3ltVGFiOworICBzdGQ6OnVuaXF1ZV9wdHI8VGFyZ2V0TWFjaGluZT4gX3RhcmdldDsKKyAgc3RkOjp2ZWN0b3I8TmFtZUFuZEF0dHJpYnV0ZXM+IF9zeW1ib2xzOworCisgIC8vIF9kZWZpbmVzIGFuZCBfdW5kZWZpbmVzIG9ubHkgbmVlZGVkIHRvIGRpc2FtYmlndWF0ZSB0ZW50YXRpdmUgZGVmaW5pdGlvbnMKKyAgU3RyaW5nU2V0PD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kZWZpbmVzOworICBTdHJpbmdNYXA8TmFtZUFuZEF0dHJpYnV0ZXM+IF91bmRlZmluZXM7CisgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gX2FzbV91bmRlZmluZXM7CisKKyAgTFRPTW9kdWxlKHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IE0sIE1lbW9yeUJ1ZmZlclJlZiBNQlJlZiwKKyAgICAgICAgICAgIFRhcmdldE1hY2hpbmUgKlRNKTsKKworcHVibGljOgorICB+TFRPTW9kdWxlKCk7CisKKyAgLy8vIFJldHVybnMgJ3RydWUnIGlmIHRoZSBmaWxlIG9yIG1lbW9yeSBjb250ZW50cyBpcyBMTFZNIGJpdGNvZGUuCisgIHN0YXRpYyBib29sIGlzQml0Y29kZUZpbGUoY29uc3Qgdm9pZCAqbWVtLCBzaXplX3QgbGVuZ3RoKTsKKyAgc3RhdGljIGJvb2wgaXNCaXRjb2RlRmlsZShTdHJpbmdSZWYgcGF0aCk7CisKKyAgLy8vIFJldHVybnMgJ3RydWUnIGlmIHRoZSBNb2R1bGUgaXMgcHJvZHVjZWQgZm9yIFRoaW5MVE8uCisgIGJvb2wgaXNUaGluTFRPKCk7CisKKyAgLy8vIFJldHVybnMgJ3RydWUnIGlmIHRoZSBtZW1vcnkgYnVmZmVyIGlzIExMVk0gYml0Y29kZSBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gdHJpcGxlLgorICBzdGF0aWMgYm9vbCBpc0JpdGNvZGVGb3JUYXJnZXQoTWVtb3J5QnVmZmVyICptZW1CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgdHJpcGxlUHJlZml4KTsKKworICAvLy8gUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHByb2R1Y2VyIGlkZW50aWZpY2F0aW9uIHN0b3JlZCBpbiB0aGUKKyAgLy8vIGJpdGNvZGUsIG9yICIiIGlmIHRoZSBiaXRjb2RlIGRvZXMgbm90IGNvbnRhaW5zIGFueS4KKyAgLy8vCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRQcm9kdWNlclN0cmluZyhNZW1vcnlCdWZmZXIgKkJ1ZmZlcik7CisKKyAgLy8vIENyZWF0ZSBhIE1lbW9yeUJ1ZmZlciBmcm9tIGEgbWVtb3J5IHJhbmdlIHdpdGggYW4gb3B0aW9uYWwgbmFtZS4KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+CisgIG1ha2VCdWZmZXIoY29uc3Qgdm9pZCAqbWVtLCBzaXplX3QgbGVuZ3RoLCBTdHJpbmdSZWYgbmFtZSA9ICIiKTsKKworICAvLy8gQ3JlYXRlIGFuIExUT01vZHVsZS4gTi5CLiBUaGVzZSBtZXRob2RzIHRha2Ugb3duZXJzaGlwIG9mIHRoZSBidWZmZXIuIFRoZQorICAvLy8gY2FsbGVyIG11c3QgaGF2ZSBpbml0aWFsaXplZCB0aGUgVGFyZ2V0cywgdGhlIFRhcmdldE1DcywgdGhlIEFzbVByaW50ZXJzLAorICAvLy8gYW5kIHRoZSBBc21QYXJzZXJzIGJ5IGNhbGxpbmc6CisgIC8vLworICAvLy8gSW5pdGlhbGl6ZUFsbFRhcmdldHMoKTsKKyAgLy8vIEluaXRpYWxpemVBbGxUYXJnZXRNQ3MoKTsKKyAgLy8vIEluaXRpYWxpemVBbGxBc21QcmludGVycygpOworICAvLy8gSW5pdGlhbGl6ZUFsbEFzbVBhcnNlcnMoKTsKKyAgc3RhdGljIEVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPExUT01vZHVsZT4+CisgIGNyZWF0ZUZyb21GaWxlKExMVk1Db250ZXh0ICZDb250ZXh0LCBTdHJpbmdSZWYgcGF0aCwKKyAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0T3B0aW9ucyAmb3B0aW9ucyk7CisgIHN0YXRpYyBFcnJvck9yPHN0ZDo6dW5pcXVlX3B0cjxMVE9Nb2R1bGU+PgorICBjcmVhdGVGcm9tT3BlbkZpbGUoTExWTUNvbnRleHQgJkNvbnRleHQsIGludCBmZCwgU3RyaW5nUmVmIHBhdGgsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0T3B0aW9ucyAmb3B0aW9ucyk7CisgIHN0YXRpYyBFcnJvck9yPHN0ZDo6dW5pcXVlX3B0cjxMVE9Nb2R1bGU+PgorICBjcmVhdGVGcm9tT3BlbkZpbGVTbGljZShMTFZNQ29udGV4dCAmQ29udGV4dCwgaW50IGZkLCBTdHJpbmdSZWYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1hcF9zaXplLCBvZmZfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE9wdGlvbnMgJm9wdGlvbnMpOworICBzdGF0aWMgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8TFRPTW9kdWxlPj4KKyAgY3JlYXRlRnJvbUJ1ZmZlcihMTFZNQ29udGV4dCAmQ29udGV4dCwgY29uc3Qgdm9pZCAqbWVtLCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE9wdGlvbnMgJm9wdGlvbnMsIFN0cmluZ1JlZiBwYXRoID0gIiIpOworICBzdGF0aWMgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8TFRPTW9kdWxlPj4KKyAgY3JlYXRlSW5Mb2NhbENvbnRleHQoc3RkOjp1bmlxdWVfcHRyPExMVk1Db250ZXh0PiBDb250ZXh0LCBjb25zdCB2b2lkICptZW0sCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgsIGNvbnN0IFRhcmdldE9wdGlvbnMgJm9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBwYXRoKTsKKworICBjb25zdCBNb2R1bGUgJmdldE1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuICpNb2Q7IH0KKyAgTW9kdWxlICZnZXRNb2R1bGUoKSB7IHJldHVybiAqTW9kOyB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gdGFrZU1vZHVsZSgpIHsgcmV0dXJuIHN0ZDo6bW92ZShNb2QpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgTW9kdWxlJ3MgdGFyZ2V0IHRyaXBsZS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldFRhcmdldFRyaXBsZSgpIHsKKyAgICByZXR1cm4gZ2V0TW9kdWxlKCkuZ2V0VGFyZ2V0VHJpcGxlKCk7CisgIH0KKworICAvLy8gU2V0IHRoZSBNb2R1bGUncyB0YXJnZXQgdHJpcGxlLgorICB2b2lkIHNldFRhcmdldFRyaXBsZShTdHJpbmdSZWYgVHJpcGxlKSB7CisgICAgZ2V0TW9kdWxlKCkuc2V0VGFyZ2V0VHJpcGxlKFRyaXBsZSk7CisgIH0KKworICAvLy8gR2V0IHRoZSBudW1iZXIgb2Ygc3ltYm9scworICB1aW50MzJfdCBnZXRTeW1ib2xDb3VudCgpIHsKKyAgICByZXR1cm4gX3N5bWJvbHMuc2l6ZSgpOworICB9CisKKyAgLy8vIEdldCB0aGUgYXR0cmlidXRlcyBmb3IgYSBzeW1ib2wgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgbHRvX3N5bWJvbF9hdHRyaWJ1dGVzIGdldFN5bWJvbEF0dHJpYnV0ZXModWludDMyX3QgaW5kZXgpIHsKKyAgICBpZiAoaW5kZXggPCBfc3ltYm9scy5zaXplKCkpCisgICAgICByZXR1cm4gbHRvX3N5bWJvbF9hdHRyaWJ1dGVzKF9zeW1ib2xzW2luZGV4XS5hdHRyaWJ1dGVzKTsKKyAgICByZXR1cm4gbHRvX3N5bWJvbF9hdHRyaWJ1dGVzKDApOworICB9CisKKyAgLy8vIEdldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgIFN0cmluZ1JlZiBnZXRTeW1ib2xOYW1lKHVpbnQzMl90IGluZGV4KSB7CisgICAgaWYgKGluZGV4IDwgX3N5bWJvbHMuc2l6ZSgpKQorICAgICAgcmV0dXJuIF9zeW1ib2xzW2luZGV4XS5uYW1lOworICAgIHJldHVybiBTdHJpbmdSZWYoKTsKKyAgfQorCisgIGNvbnN0IEdsb2JhbFZhbHVlICpnZXRTeW1ib2xHVih1aW50MzJfdCBpbmRleCkgeworICAgIGlmIChpbmRleCA8IF9zeW1ib2xzLnNpemUoKSkKKyAgICAgIHJldHVybiBfc3ltYm9sc1tpbmRleF0uc3ltYm9sOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgU3RyaW5nUmVmIGdldExpbmtlck9wdHMoKSB7IHJldHVybiBMaW5rZXJPcHRzOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiAmZ2V0QXNtVW5kZWZpbmVkUmVmcygpIHsgcmV0dXJuIF9hc21fdW5kZWZpbmVzOyB9CisKK3ByaXZhdGU6CisgIC8vLyBQYXJzZSBtZXRhZGF0YSBmcm9tIHRoZSBtb2R1bGUKKyAgLy8gRklYTUU6IGl0IG9ubHkgcGFyc2VzICJsbHZtLmxpbmtlci5vcHRpb25zIiBtZXRhZGF0YSBhdCB0aGUgbW9tZW50CisgIHZvaWQgcGFyc2VNZXRhZGF0YSgpOworCisgIC8vLyBQYXJzZSB0aGUgc3ltYm9scyBmcm9tIHRoZSBtb2R1bGUgYW5kIG1vZGVsLWxldmVsIEFTTSBhbmQgYWRkIHRoZW0gdG8KKyAgLy8vIGVpdGhlciB0aGUgZGVmaW5lZCBvciB1bmRlZmluZWQgbGlzdHMuCisgIHZvaWQgcGFyc2VTeW1ib2xzKCk7CisKKyAgLy8vIEFkZCBhIHN5bWJvbCB3aGljaCBpc24ndCBkZWZpbmVkIGp1c3QgeWV0IHRvIGEgbGlzdCB0byBiZSByZXNvbHZlZCBsYXRlci4KKyAgdm9pZCBhZGRQb3RlbnRpYWxVbmRlZmluZWRTeW1ib2woTW9kdWxlU3ltYm9sVGFibGU6OlN5bWJvbCBTeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNGdW5jKTsKKworICAvLy8gQWRkIGEgZGVmaW5lZCBzeW1ib2wgdG8gdGhlIGxpc3QuCisgIHZvaWQgYWRkRGVmaW5lZFN5bWJvbChTdHJpbmdSZWYgTmFtZSwgY29uc3QgR2xvYmFsVmFsdWUgKmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNGdW5jdGlvbik7CisKKyAgLy8vIEFkZCBhIGRhdGEgc3ltYm9sIGFzIGRlZmluZWQgdG8gdGhlIGxpc3QuCisgIHZvaWQgYWRkRGVmaW5lZERhdGFTeW1ib2woTW9kdWxlU3ltYm9sVGFibGU6OlN5bWJvbCBTeW0pOworICB2b2lkIGFkZERlZmluZWREYXRhU3ltYm9sKFN0cmluZ1JlZiBOYW1lLCBjb25zdCBHbG9iYWxWYWx1ZSAqdik7CisKKyAgLy8vIEFkZCBhIGZ1bmN0aW9uIHN5bWJvbCBhcyBkZWZpbmVkIHRvIHRoZSBsaXN0LgorICB2b2lkIGFkZERlZmluZWRGdW5jdGlvblN5bWJvbChNb2R1bGVTeW1ib2xUYWJsZTo6U3ltYm9sIFN5bSk7CisgIHZvaWQgYWRkRGVmaW5lZEZ1bmN0aW9uU3ltYm9sKFN0cmluZ1JlZiBOYW1lLCBjb25zdCBGdW5jdGlvbiAqRik7CisKKyAgLy8vIEFkZCBhIGdsb2JhbCBzeW1ib2wgZnJvbSBtb2R1bGUtbGV2ZWwgQVNNIHRvIHRoZSBkZWZpbmVkIGxpc3QuCisgIHZvaWQgYWRkQXNtR2xvYmFsU3ltYm9sKFN0cmluZ1JlZiwgbHRvX3N5bWJvbF9hdHRyaWJ1dGVzIHNjb3BlKTsKKworICAvLy8gQWRkIGEgZ2xvYmFsIHN5bWJvbCBmcm9tIG1vZHVsZS1sZXZlbCBBU00gdG8gdGhlIHVuZGVmaW5lZCBsaXN0LgorICB2b2lkIGFkZEFzbUdsb2JhbFN5bWJvbFVuZGVmKFN0cmluZ1JlZik7CisKKyAgLy8vIFBhcnNlIGkzODYvcHBjIE9iakMgY2xhc3MgZGF0YSBzdHJ1Y3R1cmUuCisgIHZvaWQgYWRkT2JqQ0NsYXNzKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpjbGd2KTsKKworICAvLy8gUGFyc2UgaTM4Ni9wcGMgT2JqQyBjYXRlZ29yeSBkYXRhIHN0cnVjdHVyZS4KKyAgdm9pZCBhZGRPYmpDQ2F0ZWdvcnkoY29uc3QgR2xvYmFsVmFyaWFibGUgKmNsZ3YpOworCisgIC8vLyBQYXJzZSBpMzg2L3BwYyBPYmpDIGNsYXNzIGxpc3QgZGF0YSBzdHJ1Y3R1cmUuCisgIHZvaWQgYWRkT2JqQ0NsYXNzUmVmKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpjbGd2KTsKKworICAvLy8gR2V0IHN0cmluZyB0aGF0IHRoZSBkYXRhIHBvaW50ZXIgcG9pbnRzIHRvLgorICBib29sIG9iamNDbGFzc05hbWVGcm9tRXhwcmVzc2lvbihjb25zdCBDb25zdGFudCAqYywgc3RkOjpzdHJpbmcgJm5hbWUpOworCisgIC8vLyBDcmVhdGUgYW4gTFRPTW9kdWxlIChwcml2YXRlIHZlcnNpb24pLgorICBzdGF0aWMgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8TFRPTW9kdWxlPj4KKyAgbWFrZUxUT01vZHVsZShNZW1vcnlCdWZmZXJSZWYgQnVmZmVyLCBjb25zdCBUYXJnZXRPcHRpb25zICZvcHRpb25zLAorICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDb250ZXh0LCBib29sIFNob3VsZEJlTGF6eSk7Cit9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xUTy9sZWdhY3kvVGhpbkxUT0NvZGVHZW5lcmF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL2xlZ2FjeS9UaGluTFRPQ29kZUdlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMmE5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xUTy9sZWdhY3kvVGhpbkxUT0NvZGVHZW5lcmF0b3IuaApAQCAtMCwwICsxLDM1NiBAQAorLy89PT0tVGhpbkxUT0NvZGVHZW5lcmF0b3IuaCAtIExMVk0gTGluayBUaW1lIE9wdGltaXplciAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFRoaW5MVE9Db2RlR2VuZXJhdG9yIGNsYXNzLCBzaW1pbGFyIHRvIHRoZQorLy8gTFRPQ29kZUdlbmVyYXRvciBidXQgZm9yIHRoZSBUaGluTFRPIHNjaGVtZS4gSXQgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvcgorLy8gbGlua2VyIHBsdWdpbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTFRPX1RISU5MVE9DT0RFR0VORVJBVE9SX0gKKyNkZWZpbmUgTExWTV9MVE9fVEhJTkxUT0NPREVHRU5FUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS1jL2x0by5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlU3VtbWFyeUluZGV4LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NhY2hlUHJ1bmluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db2RlR2VuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBUYXJnZXRNYWNoaW5lOworCisvLy8gV3JhcHBlciBhcm91bmQgTWVtb3J5QnVmZmVyUmVmLCBvd25pbmcgdGhlIGlkZW50aWZpZXIKK2NsYXNzIFRoaW5MVE9CdWZmZXIgeworICBzdGQ6OnN0cmluZyBPd25lZElkZW50aWZpZXI7CisgIFN0cmluZ1JlZiBCdWZmZXI7CisKK3B1YmxpYzoKKyAgVGhpbkxUT0J1ZmZlcihTdHJpbmdSZWYgQnVmZmVyLCBTdHJpbmdSZWYgSWRlbnRpZmllcikKKyAgICAgIDogT3duZWRJZGVudGlmaWVyKElkZW50aWZpZXIpLCBCdWZmZXIoQnVmZmVyKSB7fQorCisgIE1lbW9yeUJ1ZmZlclJlZiBnZXRNZW1CdWZmZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIE1lbW9yeUJ1ZmZlclJlZihCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7T3duZWRJZGVudGlmaWVyLmNfc3RyKCksIE93bmVkSWRlbnRpZmllci5zaXplKCl9KTsKKyAgfQorICBTdHJpbmdSZWYgZ2V0QnVmZmVyKCkgY29uc3QgeyByZXR1cm4gQnVmZmVyOyB9CisgIFN0cmluZ1JlZiBnZXRCdWZmZXJJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gT3duZWRJZGVudGlmaWVyOyB9Cit9OworCisvLy8gSGVscGVyIHRvIGdhdGhlciBvcHRpb25zIHJlbGV2YW50IHRvIHRoZSB0YXJnZXQgbWFjaGluZSBjcmVhdGlvbgorc3RydWN0IFRhcmdldE1hY2hpbmVCdWlsZGVyIHsKKyAgVHJpcGxlIFRoZVRyaXBsZTsKKyAgc3RkOjpzdHJpbmcgTUNwdTsKKyAgc3RkOjpzdHJpbmcgTUF0dHI7CisgIFRhcmdldE9wdGlvbnMgT3B0aW9uczsKKyAgT3B0aW9uYWw8UmVsb2M6Ok1vZGVsPiBSZWxvY01vZGVsOworICBDb2RlR2VuT3B0OjpMZXZlbCBDR09wdExldmVsID0gQ29kZUdlbk9wdDo6QWdncmVzc2l2ZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8VGFyZ2V0TWFjaGluZT4gY3JlYXRlKCkgY29uc3Q7Cit9OworCisvLy8gVGhpcyBjbGFzcyBkZWZpbmUgYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhlIExUT0NvZGVHZW5lcmF0b3IsIGJ1dCBhZGFwdGVkCisvLy8gZm9yIFRoaW5MVE8gcHJvY2Vzc2luZy4KKy8vLyBUaGUgVGhpbkxUT0NvZGVHZW5lcmF0b3IgaXMgbm90IGludGVuZGVkIHRvIGJlIHJldXNlIGZvciBtdWx0aXBsZQorLy8vIGNvbXBpbGF0aW9uOiB0aGUgbW9kZWwgaXMgdGhhdCB0aGUgY2xpZW50IGFkZHMgbW9kdWxlcyB0byB0aGUgZ2VuZXJhdG9yIGFuZAorLy8vIGFzayB0byBwZXJmb3JtIHRoZSBUaGluTFRPIG9wdGltaXphdGlvbnMgLyBjb2RlZ2VuLCBhbmQgZmluYWxseSBkZXN0cm95cyB0aGUKKy8vLyBjb2RlZ2VuZXJhdG9yLgorY2xhc3MgVGhpbkxUT0NvZGVHZW5lcmF0b3IgeworcHVibGljOgorICAvLy8gQWRkIGdpdmVuIG1vZHVsZSB0byB0aGUgY29kZSBnZW5lcmF0b3IuCisgIHZvaWQgYWRkTW9kdWxlKFN0cmluZ1JlZiBJZGVudGlmaWVyLCBTdHJpbmdSZWYgRGF0YSk7CisKKyAgLyoqCisgICAqIEFkZHMgdG8gYSBsaXN0IG9mIGFsbCBnbG9iYWwgc3ltYm9scyB0aGF0IG11c3QgZXhpc3QgaW4gdGhlIGZpbmFsIGdlbmVyYXRlZAorICAgKiBjb2RlLiBJZiBhIHN5bWJvbCBpcyBub3QgbGlzdGVkIHRoZXJlLCBpdCB3aWxsIGJlIG9wdGltaXplZCBhd2F5IGlmIGl0IGlzCisgICAqIGlubGluZWQgaW50byBldmVyeSB1c2FnZS4KKyAgICovCisgIHZvaWQgcHJlc2VydmVTeW1ib2woU3RyaW5nUmVmIE5hbWUpOworCisgIC8qKgorICAgKiBBZGRzIHRvIGEgbGlzdCBvZiBhbGwgZ2xvYmFsIHN5bWJvbHMgdGhhdCBhcmUgY3Jvc3MtcmVmZXJlbmNlZCBiZXR3ZWVuCisgICAqIFRoaW5MVE8gZmlsZXMuIElmIHRoZSBUaGluTFRPIENvZGVHZW5lcmF0b3IgY2FuIGVuc3VyZSB0aGF0IGV2ZXJ5CisgICAqIHJlZmVyZW5jZXMgZnJvbSBhIFRoaW5MVE8gbW9kdWxlIHRvIHRoaXMgc3ltYm9sIGlzIG9wdGltaXplZCBhd2F5LCB0aGVuCisgICAqIHRoZSBzeW1ib2wgY2FuIGJlIGRpc2NhcmRlZC4KKyAgICovCisgIHZvaWQgY3Jvc3NSZWZlcmVuY2VTeW1ib2woU3RyaW5nUmVmIE5hbWUpOworCisgIC8qKgorICAgKiBQcm9jZXNzIGFsbCB0aGUgbW9kdWxlcyB0aGF0IHdlcmUgYWRkZWQgdG8gdGhlIGNvZGUgZ2VuZXJhdG9yIGluIHBhcmFsbGVsLgorICAgKgorICAgKiBDbGllbnQgY2FuIGFjY2VzcyB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlcyB1c2luZyBnZXRQcm9kdWNlZEJpbmFyaWVzKCksCisgICAqIHVubGVzcyBzZXRHZW5lcmF0ZWRPYmplY3RzRGlyZWN0b3J5KCkgaGFzIGJlZW4gY2FsbGVkLCBpbiB3aGljaCBjYXNlCisgICAqIHJlc3VsdHMgYXJlIGF2YWlsYWJsZSB0aHJvdWdoIGdldFByb2R1Y2VkQmluYXJ5RmlsZXMoKS4KKyAgICovCisgIHZvaWQgcnVuKCk7CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgImluIG1lbW9yeSIgYmluYXJpZXMgcHJvZHVjZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yLiBUaGlzIGlzCisgICAqIGZpbGxlZCBhZnRlciBydW4oKSB1bmxlc3Mgc2V0R2VuZXJhdGVkT2JqZWN0c0RpcmVjdG9yeSgpIGhhcyBiZWVuCisgICAqIGNhbGxlZCwgaW4gd2hpY2ggY2FzZSByZXN1bHRzIGFyZSBhdmFpbGFibGUgdGhyb3VnaAorICAgKiBnZXRQcm9kdWNlZEJpbmFyeUZpbGVzKCkuCisgICAqLworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPj4gJmdldFByb2R1Y2VkQmluYXJpZXMoKSB7CisgICAgcmV0dXJuIFByb2R1Y2VkQmluYXJpZXM7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSAib24tZGlzayIgYmluYXJpZXMgcHJvZHVjZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yLiBUaGlzIGlzCisgICAqIGZpbGxlZCBhZnRlciBydW4oKSB3aGVuIHNldEdlbmVyYXRlZE9iamVjdHNEaXJlY3RvcnkoKSBoYXMgYmVlbgorICAgKiBjYWxsZWQsIGluIHdoaWNoIGNhc2UgcmVzdWx0cyBhcmUgYXZhaWxhYmxlIHRocm91Z2ggZ2V0UHJvZHVjZWRCaW5hcmllcygpLgorICAgKi8KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZnZXRQcm9kdWNlZEJpbmFyeUZpbGVzKCkgeworICAgIHJldHVybiBQcm9kdWNlZEJpbmFyeUZpbGVzOworICB9CisKKyAgLyoqCisgICAqIFxkZWZncm91cCBPcHRpb25zIHNldHRlcnMKKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqIFxkZWZncm91cCBDYWNoZSBjb250cm9sbGluZyBvcHRpb25zCisgICAqCisgICAqIFRoZXNlIGVudHJ5IHBvaW50cyBjb250cm9sIHRoZSBUaGluTFRPIGNhY2hlLiBUaGUgY2FjaGUgaXMgaW50ZW5kZWQgdG8KKyAgICogc3VwcG9ydCBpbmNyZW1lbnRhbCBidWlsZCwgYW5kIHRodXMgbmVlZHMgdG8gYmUgcGVyc2lzdGVudCBhY2Nyb3NzIGJ1aWxkLgorICAgKiBUaGUgY2xpZW50IGVuYWJsZWQgdGhlIGNhY2hlIGJ5IHN1cHBseWluZyBhIHBhdGggdG8gYW4gZXhpc3RpbmcgZGlyZWN0b3J5LgorICAgKiBUaGUgY29kZSBnZW5lcmF0b3Igd2lsbCB1c2UgdGhpcyB0byBzdG9yZSBvYmplY3RzIGZpbGVzIHRoYXQgbWF5IGJlIHJldXNlZAorICAgKiBkdXJpbmcgYSBzdWJzZXF1ZW50IGJ1aWxkLgorICAgKiBUbyBhdm9pZCBmaWxsaW5nIHRoZSBkaXNrIHNwYWNlLCBhIGZldyBrbm9icyBhcmUgcHJvdmlkZWQ6CisgICAqICAtIFRoZSBwcnVuaW5nIGludGVydmFsIGxpbWl0IHRoZSBmcmVxdWVuY3kgYXQgd2hpY2ggdGhlIGdhcmJhZ2UgY29sbGVjdG9yCisgICAqICAgIHdpbGwgdHJ5IHRvIHNjYW4gdGhlIGNhY2hlIGRpcmVjdG9yeSB0byBwcnVuZSBpdCBmcm9tIGV4cGlyZWQgZW50cmllcy4KKyAgICogICAgU2V0dGluZyB0byAtMSBkaXNhYmxlIHRoZSBwcnVuaW5nIChkZWZhdWx0KS4gU2V0dGluZyB0byAwIHdpbGwgZm9yY2UKKyAgICogICAgcHJ1bmluZyB0byBvY2N1ci4KKyAgICogIC0gVGhlIHBydW5pbmcgZXhwaXJhdGlvbiB0aW1lIGluZGljYXRlcyB0byB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgaG93IG9sZAorICAgKiAgICBhbiBlbnRyeSBuZWVkcyB0byBiZSB0byBiZSByZW1vdmVkLgorICAgKiAgLSBGaW5hbGx5LCB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgY2FuIGJlIGluc3RydWN0ZWQgdG8gcHJ1bmUgdGhlIGNhY2hlIHRpbGwKKyAgICogICAgdGhlIG9jY3VwaWVkIHNwYWNlIGdvZXMgYmVsb3cgYSB0aHJlc2hvbGQuCisgICAqIEB7CisgICAqLworCisgIHN0cnVjdCBDYWNoaW5nT3B0aW9ucyB7CisgICAgc3RkOjpzdHJpbmcgUGF0aDsgICAgICAgICAgICAgICAgICAgIC8vIFBhdGggdG8gdGhlIGNhY2hlLCBlbXB0eSB0byBkaXNhYmxlLgorICAgIENhY2hlUHJ1bmluZ1BvbGljeSBQb2xpY3k7CisgIH07CisKKyAgLy8vIFByb3ZpZGUgYSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIHRoZSBjYWNoZWQgZmlsZXMgZm9yCisgIC8vLyBpbmNyZW1lbnRhbCBidWlsZC4KKyAgdm9pZCBzZXRDYWNoZURpcihzdGQ6OnN0cmluZyBQYXRoKSB7IENhY2hlT3B0aW9ucy5QYXRoID0gc3RkOjptb3ZlKFBhdGgpOyB9CisKKyAgLy8vIENhY2hlIHBvbGljeTogaW50ZXJ2YWwgKHNlY29uZHMpIGJldHdlZW4gdHdvIHBydW5lcyBvZiB0aGUgY2FjaGUuIFNldCB0byBhCisgIC8vLyBuZWdhdGl2ZSB2YWx1ZSB0byBkaXNhYmxlIHBydW5pbmcuIEEgdmFsdWUgb2YgMCB3aWxsIGZvcmNlIHBydW5pbmcgdG8KKyAgLy8vIG9jY3VyLgorICB2b2lkIHNldENhY2hlUHJ1bmluZ0ludGVydmFsKGludCBJbnRlcnZhbCkgeworICAgIGlmKEludGVydmFsIDwgMCkKKyAgICAgIENhY2hlT3B0aW9ucy5Qb2xpY3kuSW50ZXJ2YWwucmVzZXQoKTsKKyAgICBlbHNlCisgICAgICBDYWNoZU9wdGlvbnMuUG9saWN5LkludGVydmFsID0gc3RkOjpjaHJvbm86OnNlY29uZHMoSW50ZXJ2YWwpOworICB9CisKKyAgLy8vIENhY2hlIHBvbGljeTogZXhwaXJhdGlvbiAoaW4gc2Vjb25kcykgZm9yIGFuIGVudHJ5LgorICAvLy8gQSB2YWx1ZSBvZiAwIHdpbGwgYmUgaWdub3JlZC4KKyAgdm9pZCBzZXRDYWNoZUVudHJ5RXhwaXJhdGlvbih1bnNpZ25lZCBFeHBpcmF0aW9uKSB7CisgICAgaWYgKEV4cGlyYXRpb24pCisgICAgICBDYWNoZU9wdGlvbnMuUG9saWN5LkV4cGlyYXRpb24gPSBzdGQ6OmNocm9ubzo6c2Vjb25kcyhFeHBpcmF0aW9uKTsKKyAgfQorCisgIC8qKgorICAgKiBTZXRzIHRoZSBtYXhpbXVtIGNhY2hlIHNpemUgdGhhdCBjYW4gYmUgcGVyc2lzdGVudCBhY3Jvc3MgYnVpbGQsIGluIHRlcm1zCisgICAqIG9mIHBlcmNlbnRhZ2Ugb2YgdGhlIGF2YWlsYWJsZSBzcGFjZSBvbiB0aGUgZGlzay4gU2V0IHRvIDEwMCB0byBpbmRpY2F0ZQorICAgKiBubyBsaW1pdCwgNTAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY2FjaGUgc2l6ZSB3aWxsIG5vdCBiZSBsZWZ0IG92ZXIKKyAgICogaGFsZiB0aGUgYXZhaWxhYmxlIHNwYWNlLiBBIHZhbHVlIG92ZXIgMTAwIHdpbGwgYmUgcmVkdWNlZCB0byAxMDAsIGFuZCBhCisgICAqIHZhbHVlIG9mIDAgd2lsbCBiZSBpZ25vcmVkLgorICAgKgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBsb29rcyBsaWtlOgorICAgKiAgQXZhaWxhYmxlU3BhY2UgPSBGcmVlU3BhY2UgKyBFeGlzdGluZ0NhY2hlU2l6ZQorICAgKiAgTmV3Q2FjaGVTaXplID0gQXZhaWxhYmxlU3BhY2UgKiBQLzEwMAorICAgKgorICAgKi8KKyAgdm9pZCBzZXRNYXhDYWNoZVNpemVSZWxhdGl2ZVRvQXZhaWxhYmxlU3BhY2UodW5zaWduZWQgUGVyY2VudGFnZSkgeworICAgIGlmIChQZXJjZW50YWdlKQorICAgICAgQ2FjaGVPcHRpb25zLlBvbGljeS5NYXhTaXplUGVyY2VudGFnZU9mQXZhaWxhYmxlU3BhY2UgPSBQZXJjZW50YWdlOworICB9CisKKyAgLy8vIENhY2hlIHBvbGljeTogdGhlIG1heGltdW0gc2l6ZSBmb3IgdGhlIGNhY2hlIGRpcmVjdG9yeSBpbiBieXRlcy4gQSB2YWx1ZQorICAvLy8gb3ZlciB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBzcGFjZSBvbiB0aGUgZGlzayB3aWxsIGJlIHJlZHVjZWQgdG8gdGhlCisgIC8vLyBhbW91bnQgb2YgYXZhaWxhYmxlIHNwYWNlLiBBIHZhbHVlIG9mIDAgd2lsbCBiZSBpZ25vcmVkLgorICB2b2lkIHNldENhY2hlTWF4U2l6ZUJ5dGVzKHVuc2lnbmVkIE1heFNpemVCeXRlcykgeworICAgIGlmIChNYXhTaXplQnl0ZXMpCisgICAgICBDYWNoZU9wdGlvbnMuUG9saWN5Lk1heFNpemVCeXRlcyA9IE1heFNpemVCeXRlczsKKyAgfQorCisgIC8vLyBDYWNoZSBwb2xpY3k6IHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlcyBpbiB0aGUgY2FjaGUgZGlyZWN0b3J5LiBBIHZhbHVlCisgIC8vLyBvZiAwIHdpbGwgYmUgaWdub3JlZC4KKyAgdm9pZCBzZXRDYWNoZU1heFNpemVGaWxlcyh1bnNpZ25lZCBNYXhTaXplRmlsZXMpIHsKKyAgICBpZiAoTWF4U2l6ZUZpbGVzKQorICAgICAgQ2FjaGVPcHRpb25zLlBvbGljeS5NYXhTaXplRmlsZXMgPSBNYXhTaXplRmlsZXM7CisgIH0KKworICAvKipAfSovCisKKyAgLy8vIFNldCB0aGUgcGF0aCB0byBhIGRpcmVjdG9yeSB3aGVyZSB0byBzYXZlIHRlbXBvcmFyaWVzIGF0IHZhcmlvdXMgc3RhZ2VzIG9mCisgIC8vLyB0aGUgcHJvY2Vzc2luZy4KKyAgdm9pZCBzZXRTYXZlVGVtcHNEaXIoc3RkOjpzdHJpbmcgUGF0aCkgeyBTYXZlVGVtcHNEaXIgPSBzdGQ6Om1vdmUoUGF0aCk7IH0KKworICAvLy8gU2V0IHRoZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdoZXJlIHRvIHNhdmUgZ2VuZXJhdGVkIG9iamVjdCBmaWxlcy4gVGhpcworICAvLy8gcGF0aCBjYW4gYmUgdXNlZCBieSBhIGxpbmtlciB0byByZXF1ZXN0IG9uLWRpc2sgZmlsZXMgaW5zdGVhZCBvZiBpbi1tZW1vcnkKKyAgLy8vIGJ1ZmZlcnMuIFdoZW4gc2V0LCByZXN1bHRzIGFyZSBhdmFpbGFibGUgdGhyb3VnaCBnZXRQcm9kdWNlZEJpbmFyeUZpbGVzKCkKKyAgLy8vIGluc3RlYWQgb2YgZ2V0UHJvZHVjZWRCaW5hcmllcygpLgorICB2b2lkIHNldEdlbmVyYXRlZE9iamVjdHNEaXJlY3Rvcnkoc3RkOjpzdHJpbmcgUGF0aCkgeworICAgIFNhdmVkT2JqZWN0c0RpcmVjdG9yeVBhdGggPSBzdGQ6Om1vdmUoUGF0aCk7CisgIH0KKworICAvLy8gQ1BVIHRvIHVzZSB0byBpbml0aWFsaXplIHRoZSBUYXJnZXRNYWNoaW5lCisgIHZvaWQgc2V0Q3B1KHN0ZDo6c3RyaW5nIENwdSkgeyBUTUJ1aWxkZXIuTUNwdSA9IHN0ZDo6bW92ZShDcHUpOyB9CisKKyAgLy8vIFN1YnRhcmdldCBhdHRyaWJ1dGVzCisgIHZvaWQgc2V0QXR0cihzdGQ6OnN0cmluZyBNQXR0cikgeyBUTUJ1aWxkZXIuTUF0dHIgPSBzdGQ6Om1vdmUoTUF0dHIpOyB9CisKKyAgLy8vIFRhcmdldE1hY2hpbmUgb3B0aW9ucworICB2b2lkIHNldFRhcmdldE9wdGlvbnMoVGFyZ2V0T3B0aW9ucyBPcHRpb25zKSB7CisgICAgVE1CdWlsZGVyLk9wdGlvbnMgPSBzdGQ6Om1vdmUoT3B0aW9ucyk7CisgIH0KKworICAvLy8gRW5hYmxlIHRoZSBGcmVlc3RhbmRpbmcgbW9kZTogaW5kaWNhdGUgdGhhdCB0aGUgb3B0aW1pemVyIHNob3VsZCBub3QKKyAgLy8vIGFzc3VtZSBidWlsdGlucyBhcmUgcHJlc2VudCBvbiB0aGUgdGFyZ2V0LgorICB2b2lkIHNldEZyZWVzdGFuZGluZyhib29sIEVuYWJsZWQpIHsgRnJlZXN0YW5kaW5nID0gRW5hYmxlZDsgfQorCisgIC8vLyBDb2RlTW9kZWwKKyAgdm9pZCBzZXRDb2RlUElDTW9kZWwoT3B0aW9uYWw8UmVsb2M6Ok1vZGVsPiBNb2RlbCkgeworICAgIFRNQnVpbGRlci5SZWxvY01vZGVsID0gTW9kZWw7CisgIH0KKworICAvLy8gQ29kZUdlbiBvcHRpbWl6YXRpb24gbGV2ZWwKKyAgdm9pZCBzZXRDb2RlR2VuT3B0TGV2ZWwoQ29kZUdlbk9wdDo6TGV2ZWwgQ0dPcHRMZXZlbCkgeworICAgIFRNQnVpbGRlci5DR09wdExldmVsID0gQ0dPcHRMZXZlbDsKKyAgfQorCisgIC8vLyBJUiBvcHRpbWl6YXRpb24gbGV2ZWw6IGZyb20gMCB0byAzLgorICB2b2lkIHNldE9wdExldmVsKHVuc2lnbmVkIE5ld09wdExldmVsKSB7CisgICAgT3B0TGV2ZWwgPSAoTmV3T3B0TGV2ZWwgPiAzKSA/IDMgOiBOZXdPcHRMZXZlbDsKKyAgfQorCisgIC8vLyBEaXNhYmxlIENvZGVHZW4sIG9ubHkgcnVuIHRoZSBzdGFnZXMgdGlsbCBjb2RlZ2VuIGFuZCBzdG9wLiBUaGUgb3V0cHV0CisgIC8vLyB3aWxsIGJlIGJpdGNvZGUuCisgIHZvaWQgZGlzYWJsZUNvZGVHZW4oYm9vbCBEaXNhYmxlKSB7IERpc2FibGVDb2RlR2VuID0gRGlzYWJsZTsgfQorCisgIC8vLyBQZXJmb3JtIENvZGVHZW4gb25seTogZGlzYWJsZSBhbGwgb3RoZXIgc3RhZ2VzLgorICB2b2lkIHNldENvZGVHZW5Pbmx5KGJvb2wgQ0dPbmx5KSB7IENvZGVHZW5Pbmx5ID0gQ0dPbmx5OyB9CisKKyAgLyoqQH0qLworCisgIC8qKgorICAgKiBcZGVmZ3JvdXAgU2V0IG9mIEFQSXMgdG8gcnVuIGluZGl2aWR1YWwgc3RhZ2VzIGluIGlzb2xhdGlvbi4KKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqIFByb2R1Y2UgdGhlIGNvbWJpbmVkIHN1bW1hcnkgaW5kZXggZnJvbSBhbGwgdGhlIGJpdGNvZGUgZmlsZXM6CisgICAqICJ0aGluLWxpbmsiLgorICAgKi8KKyAgc3RkOjp1bmlxdWVfcHRyPE1vZHVsZVN1bW1hcnlJbmRleD4gbGlua0NvbWJpbmVkSW5kZXgoKTsKKworICAvKioKKyAgICogUGVyZm9ybSBwcm9tb3Rpb24gYW5kIHJlbmFtaW5nIG9mIGV4cG9ydGVkIGludGVybmFsIGZ1bmN0aW9ucywKKyAgICogYW5kIGFkZGl0aW9uYWxseSByZXNvbHZlIHdlYWsgYW5kIGxpbmtvbmNlIHN5bWJvbHMuCisgICAqIEluZGV4IGlzIHVwZGF0ZWQgdG8gcmVmbGVjdCBsaW5rYWdlIGNoYW5nZXMgZnJvbSB3ZWFrIHJlc29sdXRpb24uCisgICAqLworICB2b2lkIHByb21vdGUoTW9kdWxlICZNb2R1bGUsIE1vZHVsZVN1bW1hcnlJbmRleCAmSW5kZXgpOworCisgIC8qKgorICAgKiBDb21wdXRlIGFuZCBlbWl0IHRoZSBpbXBvcnRlZCBmaWxlcyBmb3IgbW9kdWxlIGF0IFxwIE1vZHVsZVBhdGguCisgICAqLworICBzdGF0aWMgdm9pZCBlbWl0SW1wb3J0cyhTdHJpbmdSZWYgTW9kdWxlUGF0aCwgU3RyaW5nUmVmIE91dHB1dE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVN1bW1hcnlJbmRleCAmSW5kZXgpOworCisgIC8qKgorICAgKiBQZXJmb3JtIGNyb3NzLW1vZHVsZSBpbXBvcnRpbmcgZm9yIHRoZSBtb2R1bGUgaWRlbnRpZmllZCBieQorICAgKiBNb2R1bGVJZGVudGlmaWVyLgorICAgKi8KKyAgdm9pZCBjcm9zc01vZHVsZUltcG9ydChNb2R1bGUgJk1vZHVsZSwgTW9kdWxlU3VtbWFyeUluZGV4ICZJbmRleCk7CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIGxpc3Qgb2Ygc3VtbWFyaWVzIG5lZWRlZCBmb3IgaW1wb3J0aW5nIGludG8gbW9kdWxlLgorICAgKi8KKyAgc3RhdGljIHZvaWQgZ2F0aGVySW1wb3J0ZWRTdW1tYXJpZXNGb3JNb2R1bGUoCisgICAgICBTdHJpbmdSZWYgTW9kdWxlUGF0aCwgTW9kdWxlU3VtbWFyeUluZGV4ICZJbmRleCwKKyAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBHVlN1bW1hcnlNYXBUeT4gJk1vZHVsZVRvU3VtbWFyaWVzRm9ySW5kZXgpOworCisgIC8qKgorICAgKiBQZXJmb3JtIGludGVybmFsaXphdGlvbi4gSW5kZXggaXMgdXBkYXRlZCB0byByZWZsZWN0IGxpbmthZ2UgY2hhbmdlcy4KKyAgICovCisgIHZvaWQgaW50ZXJuYWxpemUoTW9kdWxlICZNb2R1bGUsIE1vZHVsZVN1bW1hcnlJbmRleCAmSW5kZXgpOworCisgIC8qKgorICAgKiBQZXJmb3JtIHBvc3QtaW1wb3J0aW5nIFRoaW5MVE8gb3B0aW1pemF0aW9ucy4KKyAgICovCisgIHZvaWQgb3B0aW1pemUoTW9kdWxlICZNb2R1bGUpOworCisgIC8qKgorICAgKiBQZXJmb3JtIFRoaW5MVE8gQ29kZUdlbi4KKyAgICovCisgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IGNvZGVnZW4oTW9kdWxlICZNb2R1bGUpOworCisgIC8qKkB9Ki8KKworcHJpdmF0ZToKKyAgLy8vIEhlbHBlciBmYWN0b3J5IHRvIGJ1aWxkIGEgVGFyZ2V0TWFjaGluZQorICBUYXJnZXRNYWNoaW5lQnVpbGRlciBUTUJ1aWxkZXI7CisKKyAgLy8vIFZlY3RvciBob2xkaW5nIHRoZSBpbi1tZW1vcnkgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHByb2R1Y2VkIGJpbmFyaWVzLCB3aGVuCisgIC8vLyBTYXZlZE9iamVjdHNEaXJlY3RvcnlQYXRoIGlzbid0IHNldC4KKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4+IFByb2R1Y2VkQmluYXJpZXM7CisKKyAgLy8vIFBhdGggdG8gZ2VuZXJhdGVkIGZpbGVzIGluIHRoZSBzdXBwbGllZCBTYXZlZE9iamVjdHNEaXJlY3RvcnlQYXRoIGlmIGFueS4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFByb2R1Y2VkQmluYXJ5RmlsZXM7CisKKyAgLy8vIFZlY3RvciBob2xkaW5nIHRoZSBpbnB1dCBidWZmZXJzIGNvbnRhaW5pbmcgdGhlIGJpdGNvZGUgbW9kdWxlcyB0bworICAvLy8gcHJvY2Vzcy4KKyAgc3RkOjp2ZWN0b3I8VGhpbkxUT0J1ZmZlcj4gTW9kdWxlczsKKworICAvLy8gU2V0IG9mIHN5bWJvbHMgdGhhdCBuZWVkIHRvIGJlIHByZXNlcnZlZCBvdXRzaWRlIG9mIHRoZSBzZXQgb2YgYml0Y29kZQorICAvLy8gZmlsZXMuCisgIFN0cmluZ1NldDw+IFByZXNlcnZlZFN5bWJvbHM7CisKKyAgLy8vIFNldCBvZiBzeW1ib2xzIHRoYXQgYXJlIGNyb3NzLXJlZmVyZW5jZWQgYmV0d2VlbiBiaXRjb2RlIGZpbGVzLgorICBTdHJpbmdTZXQ8PiBDcm9zc1JlZmVyZW5jZWRTeW1ib2xzOworCisgIC8vLyBDb250cm9sIHRoZSBjYWNoaW5nIGJlaGF2aW9yLgorICBDYWNoaW5nT3B0aW9ucyBDYWNoZU9wdGlvbnM7CisKKyAgLy8vIFBhdGggdG8gYSBkaXJlY3RvcnkgdG8gc2F2ZSB0aGUgdGVtcG9yYXJ5IGJpdGNvZGUgZmlsZXMuCisgIHN0ZDo6c3RyaW5nIFNhdmVUZW1wc0RpcjsKKworICAvLy8gUGF0aCB0byBhIGRpcmVjdG9yeSB0byBzYXZlIHRoZSBnZW5lcmF0ZWQgb2JqZWN0IGZpbGVzLgorICBzdGQ6OnN0cmluZyBTYXZlZE9iamVjdHNEaXJlY3RvcnlQYXRoOworCisgIC8vLyBGbGFnIHRvIGVuYWJsZS9kaXNhYmxlIENvZGVHZW4uIFdoZW4gc2V0IHRvIHRydWUsIHRoZSBwcm9jZXNzIHN0b3BzIGFmdGVyCisgIC8vLyBvcHRpbWl6YXRpb25zIGFuZCBhIGJpdGNvZGUgaXMgcHJvZHVjZWQuCisgIGJvb2wgRGlzYWJsZUNvZGVHZW4gPSBmYWxzZTsKKworICAvLy8gRmxhZyB0byBpbmRpY2F0ZSB0aGF0IG9ubHkgdGhlIENvZGVHZW4gd2lsbCBiZSBwZXJmb3JtZWQsIG5vIGNyb3NzLW1vZHVsZQorICAvLy8gaW1wb3J0aW5nIG9yIG9wdGltaXphdGlvbi4KKyAgYm9vbCBDb2RlR2VuT25seSA9IGZhbHNlOworCisgIC8vLyBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIG9wdGltaXplciBzaG91bGQgbm90IGFzc3VtZSBidWlsdGlucyBhcmUgcHJlc2VudAorICAvLy8gb24gdGhlIHRhcmdldC4KKyAgYm9vbCBGcmVlc3RhbmRpbmcgPSBmYWxzZTsKKworICAvLy8gSVIgT3B0aW1pemF0aW9uIExldmVsIFswLTNdLgorICB1bnNpZ25lZCBPcHRMZXZlbCA9IDM7Cit9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xUTy9sZWdhY3kvVXBkYXRlQ29tcGlsZXJVc2VkLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xUTy9sZWdhY3kvVXBkYXRlQ29tcGlsZXJVc2VkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlMDAyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL2xlZ2FjeS9VcGRhdGVDb21waWxlclVzZWQuaApAQCAtMCwwICsxLDMyIEBACisvLz09LS0tLS0tIFVwZGF0ZUNvbXBpbGVyVXNlZC5oIC0gTExWTSBMaW5rIFRpbWUgT3B0aW1pemVyIFV0aWxpdHkgLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBhIGhlbHBlciBjbGFzcyB0byB1cGRhdGUgbGx2bS5jb21waWxlcl91c2VkIG1ldGFkYXRhLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9MVE9fVVBEQVRFX0NPTVBJTEVSX1VTRURfSAorI2RlZmluZSBMTFZNX0xUT19VUERBVEVfQ09NUElMRVJfVVNFRF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbFZhbHVlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CisKKy8vLyBGaW5kIGFsbCBnbG9iYWxzIGluIFxwIFRoZU1vZHVsZSB0aGF0IGFyZSByZWZlcmVuY2VkIGluCisvLy8gXHAgQXNtVW5kZWZpbmVkUmVmcywgYXMgd2VsbCBhcyB0aGUgdXNlci1zdXBwbGllZCBmdW5jdGlvbnMgZGVmaW5pdGlvbnMgdGhhdAorLy8vIGFyZSBhbHNvIGxpYmNhbGxzLCBhbmQgY3JlYXRlIG9yIHVwZGF0ZSB0aGUgbWFnaWMgImxsdm0uY29tcGlsZXJfdXNlZCIKKy8vLyBnbG9iYWwgaW4gXHAgVGhlTW9kdWxlLgordm9pZCB1cGRhdGVDb21waWxlclVzZWQoTW9kdWxlICZUaGVNb2R1bGUsIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nU2V0PD4gJkFzbVVuZGVmaW5lZFJlZnMpOworfQorCisjZW5kaWYgLy8gTExWTV9MVE9fVVBEQVRFX0NPTVBJTEVSX1VTRURfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MaW5lRWRpdG9yL0xpbmVFZGl0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTGluZUVkaXRvci9MaW5lRWRpdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5OTVkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTGluZUVkaXRvci9MaW5lRWRpdG9yLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8vPT09LS0gbGx2bS9MaW5lRWRpdG9yL0xpbmVFZGl0b3IuaCAtIGxpbmUgZWRpdG9yIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9MSU5FRURJVE9SX0xJTkVFRElUT1JfSAorI2RlZmluZSBMTFZNX0xJTkVFRElUT1JfTElORUVESVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExpbmVFZGl0b3IgeworcHVibGljOgorICAvLy8gQ3JlYXRlIGEgTGluZUVkaXRvciBvYmplY3QuCisgIC8vLworICAvLy8gXHBhcmFtIFByb2dOYW1lIFRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHByb2dyYW0uIFVzZWQgdG8gZm9ybSBhIGRlZmF1bHQKKyAgLy8vIHByb21wdC4KKyAgLy8vIFxwYXJhbSBIaXN0b3J5UGF0aCBQYXRoIHRvIHRoZSBmaWxlIGluIHdoaWNoIHRvIHN0b3JlIGhpc3RvcnkgZGF0YSwgaWYKKyAgLy8vIHBvc3NpYmxlLgorICAvLy8gXHBhcmFtIEluIFRoZSBpbnB1dCBzdHJlYW0gdXNlZCBieSB0aGUgZWRpdG9yLgorICAvLy8gXHBhcmFtIE91dCBUaGUgb3V0cHV0IHN0cmVhbSB1c2VkIGJ5IHRoZSBlZGl0b3IuCisgIC8vLyBccGFyYW0gRXJyIFRoZSBlcnJvciBzdHJlYW0gdXNlZCBieSB0aGUgZWRpdG9yLgorICBMaW5lRWRpdG9yKFN0cmluZ1JlZiBQcm9nTmFtZSwgU3RyaW5nUmVmIEhpc3RvcnlQYXRoID0gIiIsIEZJTEUgKkluID0gc3RkaW4sCisgICAgICAgICAgICAgRklMRSAqT3V0ID0gc3Rkb3V0LCBGSUxFICpFcnIgPSBzdGRlcnIpOworICB+TGluZUVkaXRvcigpOworCisgIC8vLyBSZWFkcyBhIGxpbmUuCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgbGluZSwgb3IgbGx2bTo6T3B0aW9uYWw8c3RkOjpzdHJpbmc+KCkgb24gRU9GLgorICBsbHZtOjpPcHRpb25hbDxzdGQ6OnN0cmluZz4gcmVhZExpbmUoKSBjb25zdDsKKworICB2b2lkIHNhdmVIaXN0b3J5KCk7CisgIHZvaWQgbG9hZEhpc3RvcnkoKTsKKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RGVmYXVsdEhpc3RvcnlQYXRoKFN0cmluZ1JlZiBQcm9nTmFtZSk7CisKKyAgLy8vIFRoZSBhY3Rpb24gdG8gcGVyZm9ybSB1cG9uIGEgY29tcGxldGlvbiByZXF1ZXN0LgorICBzdHJ1Y3QgQ29tcGxldGlvbkFjdGlvbiB7CisgICAgZW51bSBBY3Rpb25LaW5kIHsKKyAgICAgIC8vLyBJbnNlcnQgVGV4dCBhdCB0aGUgY3Vyc29yIHBvc2l0aW9uLgorICAgICAgQUtfSW5zZXJ0LAorICAgICAgLy8vIFNob3cgQ29tcGxldGlvbnMsIG9yIGJlZXAgaWYgdGhlIGxpc3QgaXMgZW1wdHkuCisgICAgICBBS19TaG93Q29tcGxldGlvbnMKKyAgICB9OworCisgICAgQWN0aW9uS2luZCBLaW5kOworCisgICAgLy8vIFRoZSB0ZXh0IHRvIGluc2VydC4KKyAgICBzdGQ6OnN0cmluZyBUZXh0OworCisgICAgLy8vIFRoZSBsaXN0IG9mIGNvbXBsZXRpb25zIHRvIHNob3cuCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IENvbXBsZXRpb25zOworICB9OworCisgIC8vLyBBIHBvc3NpYmxlIGNvbXBsZXRpb24gYXQgYSBnaXZlbiBjdXJzb3IgcG9zaXRpb24uCisgIHN0cnVjdCBDb21wbGV0aW9uIHsKKyAgICBDb21wbGV0aW9uKCkge30KKyAgICBDb21wbGV0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZUeXBlZFRleHQsIGNvbnN0IHN0ZDo6c3RyaW5nICZEaXNwbGF5VGV4dCkKKyAgICAgICAgOiBUeXBlZFRleHQoVHlwZWRUZXh0KSwgRGlzcGxheVRleHQoRGlzcGxheVRleHQpIHt9CisKKyAgICAvLy8gVGhlIHRleHQgdG8gaW5zZXJ0LiBJZiB0aGUgdXNlciBoYXMgYWxyZWFkeSBpbnB1dCBzb21lIG9mIHRoZQorICAgIC8vLyBjb21wbGV0aW9uLCB0aGlzIHNob3VsZCBvbmx5IGluY2x1ZGUgdGhlIHJlc3Qgb2YgdGhlIHRleHQuCisgICAgc3RkOjpzdHJpbmcgVHlwZWRUZXh0OworCisgICAgLy8vIEEgZGVzY3JpcHRpb24gb2YgdGhpcyBjb21wbGV0aW9uLiBUaGlzIG1heSBiZSB0aGUgY29tcGxldGlvbiBpdHNlbGYsIG9yCisgICAgLy8vIG1heWJlIGEgc3VtbWFyeSBvZiBpdHMgdHlwZSBvciBhcmd1bWVudHMuCisgICAgc3RkOjpzdHJpbmcgRGlzcGxheVRleHQ7CisgIH07CisKKyAgLy8vIFNldCB0aGUgY29tcGxldGVyIGZvciB0aGlzIExpbmVFZGl0b3IuIEEgY29tcGxldGVyIGlzIGEgZnVuY3Rpb24gb2JqZWN0CisgIC8vLyB3aGljaCB0YWtlcyBhcmd1bWVudHMgb2YgdHlwZSBTdHJpbmdSZWYgKHRoZSBzdHJpbmcgdG8gY29tcGxldGUpIGFuZAorICAvLy8gc2l6ZV90ICh0aGUgemVyby1iYXNlZCBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIFN0cmluZ1JlZikgYW5kIHJldHVybnMgYQorICAvLy8gQ29tcGxldGlvbkFjdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgc2V0Q29tcGxldGVyKFQgQ29tcCkgeworICAgIENvbXBsZXRlci5yZXNldChuZXcgQ29tcGxldGVyTW9kZWw8VD4oQ29tcCkpOworICB9CisKKyAgLy8vIFNldCB0aGUgY29tcGxldGVyIGZvciB0aGlzIExpbmVFZGl0b3IgdG8gdGhlIGdpdmVuIGxpc3QgY29tcGxldGVyLgorICAvLy8gQSBsaXN0IGNvbXBsZXRlciBpcyBhIGZ1bmN0aW9uIG9iamVjdCB3aGljaCB0YWtlcyBhcmd1bWVudHMgb2YgdHlwZQorICAvLy8gU3RyaW5nUmVmICh0aGUgc3RyaW5nIHRvIGNvbXBsZXRlKSBhbmQgc2l6ZV90ICh0aGUgemVyby1iYXNlZCBjdXJzb3IKKyAgLy8vIHBvc2l0aW9uIGluIHRoZSBTdHJpbmdSZWYpIGFuZCByZXR1cm5zIGEgc3RkOjp2ZWN0b3I8Q29tcGxldGlvbj4uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHNldExpc3RDb21wbGV0ZXIoVCBDb21wKSB7CisgICAgQ29tcGxldGVyLnJlc2V0KG5ldyBMaXN0Q29tcGxldGVyTW9kZWw8VD4oQ29tcCkpOworICB9CisKKyAgLy8vIFVzZSB0aGUgY3VycmVudCBjb21wbGV0ZXIgdG8gcHJvZHVjZSBhIENvbXBsZXRpb25BY3Rpb24gZm9yIHRoZSBnaXZlbgorICAvLy8gY29tcGxldGlvbiByZXF1ZXN0LiBJZiB0aGUgY3VycmVudCBjb21wbGV0ZXIgaXMgYSBsaXN0IGNvbXBsZXRlciwgdGhpcworICAvLy8gd2lsbCByZXR1cm4gYW4gQUtfSW5zZXJ0IENvbXBsZXRpb25BY3Rpb24gaWYgZWFjaCBjb21wbGV0aW9uIGhhcyBhIGNvbW1vbgorICAvLy8gcHJlZml4LCBvciBhbiBBS19TaG93Q29tcGxldGlvbnMgQ29tcGxldGlvbkFjdGlvbiBvdGhlcndpc2UuCisgIC8vLworICAvLy8gXHBhcmFtIEJ1ZmZlciBUaGUgc3RyaW5nIHRvIGNvbXBsZXRlCisgIC8vLyBccGFyYW0gUG9zIFRoZSB6ZXJvLWJhc2VkIGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgU3RyaW5nUmVmCisgIENvbXBsZXRpb25BY3Rpb24gZ2V0Q29tcGxldGlvbkFjdGlvbihTdHJpbmdSZWYgQnVmZmVyLCBzaXplX3QgUG9zKSBjb25zdDsKKworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0UHJvbXB0KCkgY29uc3QgeyByZXR1cm4gUHJvbXB0OyB9CisgIHZvaWQgc2V0UHJvbXB0KGNvbnN0IHN0ZDo6c3RyaW5nICZQKSB7IFByb21wdCA9IFA7IH0KKworICAvLyBQdWJsaWMgc28gY2FsbGJhY2tzIGluIExpbmVFZGl0b3IuY3BwIGNhbiB1c2UgaXQuCisgIHN0cnVjdCBJbnRlcm5hbERhdGE7CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIFByb21wdDsKKyAgc3RkOjpzdHJpbmcgSGlzdG9yeVBhdGg7CisgIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcm5hbERhdGE+IERhdGE7CisKKyAgc3RydWN0IENvbXBsZXRlckNvbmNlcHQgeworICAgIHZpcnR1YWwgfkNvbXBsZXRlckNvbmNlcHQoKTsKKyAgICB2aXJ0dWFsIENvbXBsZXRpb25BY3Rpb24gY29tcGxldGUoU3RyaW5nUmVmIEJ1ZmZlciwgc2l6ZV90IFBvcykgY29uc3QgPSAwOworICB9OworCisgIHN0cnVjdCBMaXN0Q29tcGxldGVyQ29uY2VwdCA6IENvbXBsZXRlckNvbmNlcHQgeworICAgIH5MaXN0Q29tcGxldGVyQ29uY2VwdCgpIG92ZXJyaWRlOworICAgIENvbXBsZXRpb25BY3Rpb24gY29tcGxldGUoU3RyaW5nUmVmIEJ1ZmZlciwgc2l6ZV90IFBvcykgY29uc3Qgb3ZlcnJpZGU7CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldENvbW1vblByZWZpeChjb25zdCBzdGQ6OnZlY3RvcjxDb21wbGV0aW9uPiAmQ29tcHMpOworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8Q29tcGxldGlvbj4gZ2V0Q29tcGxldGlvbnMoU3RyaW5nUmVmIEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBQb3MpIGNvbnN0ID0gMDsKKyAgfTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RydWN0IENvbXBsZXRlck1vZGVsIDogQ29tcGxldGVyQ29uY2VwdCB7CisgICAgQ29tcGxldGVyTW9kZWwoVCBWYWx1ZSkgOiBWYWx1ZShWYWx1ZSkge30KKyAgICBDb21wbGV0aW9uQWN0aW9uIGNvbXBsZXRlKFN0cmluZ1JlZiBCdWZmZXIsIHNpemVfdCBQb3MpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBWYWx1ZShCdWZmZXIsIFBvcyk7CisgICAgfQorICAgIFQgVmFsdWU7CisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBMaXN0Q29tcGxldGVyTW9kZWwgOiBMaXN0Q29tcGxldGVyQ29uY2VwdCB7CisgICAgTGlzdENvbXBsZXRlck1vZGVsKFQgVmFsdWUpIDogVmFsdWUoc3RkOjptb3ZlKFZhbHVlKSkge30KKyAgICBzdGQ6OnZlY3RvcjxDb21wbGV0aW9uPiBnZXRDb21wbGV0aW9ucyhTdHJpbmdSZWYgQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBQb3MpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBWYWx1ZShCdWZmZXIsIFBvcyk7CisgICAgfQorICAgIFQgVmFsdWU7CisgIH07CisKKyAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IENvbXBsZXRlckNvbmNlcHQ+IENvbXBsZXRlcjsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xpbmtBbGxJUi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MaW5rQWxsSVIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTlmM2QzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MaW5rQWxsSVIuaApAQCAtMCwwICsxLDUyIEBACisvLz09PS0tLS0tIExpbmtBbGxJUi5oIC0gUmVmZXJlbmNlIEFsbCBWTUNvcmUgQ29kZSAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIHB1bGxzIGluIGFsbCB0aGUgb2JqZWN0IG1vZHVsZXMgb2YgdGhlIFZNQ29yZSBsaWJyYXJ5IHNvCisvLyB0aGF0IHRvb2xzIGxpa2UgbGxjLCBvcHQsIGFuZCBsbGkgY2FuIGVuc3VyZSB0aGV5IGFyZSBsaW5rZWQgd2l0aCBhbGwgc3ltYm9scworLy8gZnJvbSBsaWJWTUNvcmUuYSBJdCBzaG91bGQgb25seSBiZSB1c2VkIGZyb20gYSB0b29sJ3MgbWFpbiBwcm9ncmFtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9MSU5LQUxMSVJfSAorI2RlZmluZSBMTFZNX0xJTktBTExJUl9ICisKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5saW5lQXNtLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZlcmlmaWVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0R5bmFtaWNMaWJyYXJ5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L011dGV4LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BhdGguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUHJvY2Vzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Qcm9ncmFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NpZ25hbHMuaCIKKyNpbmNsdWRlIDxjc3RkbGliPgorCituYW1lc3BhY2UgeworICBzdHJ1Y3QgRm9yY2VWTUNvcmVMaW5raW5nIHsKKyAgICBGb3JjZVZNQ29yZUxpbmtpbmcoKSB7CisgICAgICAvLyBXZSBtdXN0IHJlZmVyZW5jZSBWTUNvcmUgaW4gc3VjaCBhIHdheSB0aGF0IGNvbXBpbGVycyB3aWxsIG5vdAorICAgICAgLy8gZGVsZXRlIGl0IGFsbCBhcyBkZWFkIGNvZGUsIGV2ZW4gd2l0aCB3aG9sZSBwcm9ncmFtIG9wdGltaXphdGlvbiwKKyAgICAgIC8vIHlldCBpcyBlZmZlY3RpdmVseSBhIE5PLU9QLiBBcyB0aGUgY29tcGlsZXIgaXNuJ3Qgc21hcnQgZW5vdWdoCisgICAgICAvLyB0byBrbm93IHRoYXQgZ2V0ZW52KCkgbmV2ZXIgcmV0dXJucyAtMSwgdGhpcyB3aWxsIGRvIHRoZSBqb2IuCisgICAgICBpZiAoc3RkOjpnZXRlbnYoImJhciIpICE9IChjaGFyKikgLTEpCisgICAgICAgIHJldHVybjsKKyAgICAgIGxsdm06OkxMVk1Db250ZXh0IENvbnRleHQ7CisgICAgICAodm9pZCluZXcgbGx2bTo6TW9kdWxlKCIiLCBDb250ZXh0KTsKKyAgICAgICh2b2lkKW5ldyBsbHZtOjpVbnJlYWNoYWJsZUluc3QoQ29udGV4dCk7CisgICAgICAodm9pZCkgICAgbGx2bTo6Y3JlYXRlVmVyaWZpZXJQYXNzKCk7IAorICAgIH0KKyAgfSBGb3JjZVZNQ29yZUxpbmtpbmc7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MaW5rQWxsUGFzc2VzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xpbmtBbGxQYXNzZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDc5NTZkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MaW5rQWxsUGFzc2VzLmgKQEAgLTAsMCArMSwyMzEgQEAKKy8vPT09LSBsbHZtL0xpbmtBbGxQYXNzZXMuaCAtLS0tLS0tLS0tLS0gUmVmZXJlbmNlIEFsbCBQYXNzZXMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgcHVsbHMgaW4gYWxsIHRyYW5zZm9ybWF0aW9uIGFuZCBhbmFseXNpcyBwYXNzZXMgZm9yIHRvb2xzCisvLyBsaWtlIG9wdCBhbmQgYnVncG9pbnQgdGhhdCBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTElOS0FMTFBBU1NFU19ICisjZGVmaW5lIExMVk1fTElOS0FMTFBBU1NFU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXNFdmFsdWF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzU2V0VHJhY2tlci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQmFzaWNBbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9DRkxBbmRlcnNBbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9DRkxTdGVlbnNBbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9DYWxsUHJpbnRlci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRG9tUHJpbnRlci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvR2xvYmFsc01vZFJlZi5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvSW50ZXJ2YWxQYXJ0aXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xpbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUG9zdERvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1JlZ2lvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1JlZ2lvblByaW50ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NvcGVkTm9BbGlhc0FBLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9UYXJnZXRMaWJyYXJ5SW5mby5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVHlwZUJhc2VkQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9QYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JUlByaW50aW5nUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1ZhbGdyaW5kLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0lQTy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JUE8vQWx3YXlzSW5saW5lci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JUE8vRnVuY3Rpb25BdHRycy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uL0JvdW5kc0NoZWNraW5nLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL09iakNBUkMuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9HVk4uaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvU3ltYm9sUmV3cml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvVW5pZnlGdW5jdGlvbkV4aXROb2Rlcy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9WZWN0b3JpemUuaCIKKyNpbmNsdWRlIDxjc3RkbGliPgorCituYW1lc3BhY2UgeworICBzdHJ1Y3QgRm9yY2VQYXNzTGlua2luZyB7CisgICAgRm9yY2VQYXNzTGlua2luZygpIHsKKyAgICAgIC8vIFdlIG11c3QgcmVmZXJlbmNlIHRoZSBwYXNzZXMgaW4gc3VjaCBhIHdheSB0aGF0IGNvbXBpbGVycyB3aWxsIG5vdAorICAgICAgLy8gZGVsZXRlIGl0IGFsbCBhcyBkZWFkIGNvZGUsIGV2ZW4gd2l0aCB3aG9sZSBwcm9ncmFtIG9wdGltaXphdGlvbiwKKyAgICAgIC8vIHlldCBpcyBlZmZlY3RpdmVseSBhIE5PLU9QLiBBcyB0aGUgY29tcGlsZXIgaXNuJ3Qgc21hcnQgZW5vdWdoCisgICAgICAvLyB0byBrbm93IHRoYXQgZ2V0ZW52KCkgbmV2ZXIgcmV0dXJucyAtMSwgdGhpcyB3aWxsIGRvIHRoZSBqb2IuCisgICAgICBpZiAoc3RkOjpnZXRlbnYoImJhciIpICE9IChjaGFyKikgLTEpCisgICAgICAgIHJldHVybjsKKworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUFBRXZhbFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVBZ2dyZXNzaXZlRENFUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUJpdFRyYWNraW5nRENFUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUFyZ3VtZW50UHJvbW90aW9uUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUFsaWdubWVudEZyb21Bc3N1bXB0aW9uc1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVCYXNpY0FBV3JhcHBlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTQ0VWQUFXcmFwcGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVR5cGVCYXNlZEFBV3JhcHBlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTY29wZWROb0FsaWFzQUFXcmFwcGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUJvdW5kc0NoZWNraW5nTGVnYWN5UGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUJyZWFrQ3JpdGljYWxFZGdlc1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVDYWxsR3JhcGhET1RQcmludGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUNhbGxHcmFwaFZpZXdlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVDRkdTaW1wbGlmaWNhdGlvblBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVDRkxBbmRlcnNBQVdyYXBwZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlQ0ZMU3RlZW5zQUFXcmFwcGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVN0cnVjdHVyaXplQ0ZHUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxpYkNhbGxzU2hyaW5rV3JhcFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVDYWxsZWRWYWx1ZVByb3BhZ2F0aW9uUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUNvbnN0YW50TWVyZ2VQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlQ29uc3RhbnRQcm9wYWdhdGlvblBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVDb3N0TW9kZWxBbmFseXNpc1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVEZWFkQXJnRWxpbWluYXRpb25QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRGVhZENvZGVFbGltaW5hdGlvblBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVEZWFkSW5zdEVsaW1pbmF0aW9uUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZURlYWRTdG9yZUVsaW1pbmF0aW9uUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZURlcGVuZGVuY2VBbmFseXNpc1dyYXBwZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRGl2ZXJnZW5jZUFuYWx5c2lzUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZURvbU9ubHlQcmludGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZURvbVByaW50ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRG9tT25seVZpZXdlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVEb21WaWV3ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlR0NPVlByb2ZpbGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVBHT0luc3RydW1lbnRhdGlvbkdlbkxlZ2FjeVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQR09JbnN0cnVtZW50YXRpb25Vc2VMZWdhY3lQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUEdPSW5kaXJlY3RDYWxsUHJvbW90aW9uTGVnYWN5UGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVBHT01lbU9QU2l6ZU9wdExlZ2FjeVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVJbnN0clByb2ZpbGluZ0xlZ2FjeVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVGdW5jdGlvbkltcG9ydFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVGdW5jdGlvbklubGluaW5nUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUFsd2F5c0lubGluZXJMZWdhY3lQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlR2xvYmFsRENFUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUdsb2JhbE9wdGltaXplclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVHbG9iYWxzQUFXcmFwcGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUd1YXJkV2lkZW5pbmdQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlSVBDb25zdGFudFByb3BhZ2F0aW9uUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUlQU0NDUFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVJbmR1Y3RpdmVSYW5nZUNoZWNrRWxpbWluYXRpb25QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlSW5kVmFyU2ltcGxpZnlQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlSW5zdHJ1Y3Rpb25Db21iaW5pbmdQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlSW50ZXJuYWxpemVQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTENTU0FQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTElDTVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb29wU2lua1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMYXp5VmFsdWVJbmZvUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxvb3BFeHRyYWN0b3JQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTG9vcEludGVyY2hhbmdlUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxvb3BQcmVkaWNhdGlvblBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb29wU2ltcGxpZnlQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTG9vcFNpbXBsaWZ5Q0ZHUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxvb3BTdHJlbmd0aFJlZHVjZVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb29wUmVyb2xsUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxvb3BVbnJvbGxQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTG9vcFVuc3dpdGNoUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxvb3BWZXJzaW9uaW5nTElDTVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb29wSWRpb21QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTG9vcFJvdGF0ZVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb3dlckV4cGVjdEludHJpbnNpY1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb3dlckludm9rZVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb3dlclN3aXRjaFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVOYXJ5UmVhc3NvY2lhdGVQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlT2JqQ0FSQ0FBV3JhcHBlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVPYmpDQVJDQVBFbGltUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZU9iakNBUkNFeHBhbmRQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlT2JqQ0FSQ0NvbnRyYWN0UGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZU9iakNBUkNPcHRQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUEFFdmFsUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVByb21vdGVNZW1vcnlUb1JlZ2lzdGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZURlbW90ZVJlZ2lzdGVyVG9NZW1vcnlQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUHJ1bmVFSFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQb3N0RG9tT25seVByaW50ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUG9zdERvbVByaW50ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUG9zdERvbU9ubHlWaWV3ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUG9zdERvbVZpZXdlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVSZWFzc29jaWF0ZVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVSZWdpb25JbmZvUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVJlZ2lvbk9ubHlQcmludGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVJlZ2lvbk9ubHlWaWV3ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUmVnaW9uUHJpbnRlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVSZWdpb25WaWV3ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlU0NDUFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTYWZlU3RhY2tQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlU1JPQVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTaW5nbGVMb29wRXh0cmFjdG9yUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVN0cmlwU3ltYm9sc1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTdHJpcE5vbkRlYnVnU3ltYm9sc1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTdHJpcERlYWREZWJ1Z0luZm9QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlU3RyaXBEZWFkUHJvdG90eXBlc1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVUYWlsQ2FsbEVsaW1pbmF0aW9uUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUp1bXBUaHJlYWRpbmdQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlVW5pZnlGdW5jdGlvbkV4aXROb2Rlc1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVJbnN0Q291bnRQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlQ29uc3RhbnRIb2lzdGluZ1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVDb2RlR2VuUHJlcGFyZVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVFbnRyeUV4aXRJbnN0cnVtZW50ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUG9zdElubGluZUVudHJ5RXhpdEluc3RydW1lbnRlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVFYXJseUNTRVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVHVk5Ib2lzdFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVNZXJnZWRMb2FkU3RvcmVNb3Rpb25QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlR1ZOUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZU5ld0dWTlBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVNZW1DcHlPcHRQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTG9vcERlbGV0aW9uUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVBvc3REb21UcmVlKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlSW5zdHJ1Y3Rpb25OYW1lclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVNZXRhUmVuYW1lclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQb3N0T3JkZXJGdW5jdGlvbkF0dHJzTGVnYWN5UGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVJldmVyc2VQb3N0T3JkZXJGdW5jdGlvbkF0dHJzUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZU1lcmdlRnVuY3Rpb25zUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZU1lcmdlSUNtcHNQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRXhwYW5kTWVtQ21wUGFzcygpOworICAgICAgc3RkOjpzdHJpbmcgYnVmOworICAgICAgbGx2bTo6cmF3X3N0cmluZ19vc3RyZWFtIG9zKGJ1Zik7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUHJpbnRNb2R1bGVQYXNzKG9zKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQcmludEZ1bmN0aW9uUGFzcyhvcyk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUHJpbnRCYXNpY0Jsb2NrUGFzcyhvcyk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTW9kdWxlRGVidWdJbmZvUHJpbnRlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQYXJ0aWFsSW5saW5pbmdQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTGludFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTaW5raW5nUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxvd2VyQXRvbWljUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUNvcnJlbGF0ZWRWYWx1ZVByb3BhZ2F0aW9uUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZU1lbURlcFByaW50ZXIoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVJbnN0cnVjdGlvblNpbXBsaWZpZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTG9vcFZlY3Rvcml6ZVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTTFBWZWN0b3JpemVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxvYWRTdG9yZVZlY3Rvcml6ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUGFydGlhbGx5SW5saW5lTGliQ2FsbHNQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlU2NhbGFyaXplclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTZXBhcmF0ZUNvbnN0T2Zmc2V0RnJvbUdFUFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTcGVjdWxhdGl2ZUV4ZWN1dGlvblBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTcGVjdWxhdGl2ZUV4ZWN1dGlvbklmSGFzQnJhbmNoRGl2ZXJnZW5jZVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVSZXdyaXRlU3ltYm9sc1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTdHJhaWdodExpbmVTdHJlbmd0aFJlZHVjZVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVNZW1EZXJlZlByaW50ZXIoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVNdXN0RXhlY3V0ZVByaW50ZXIoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVGbG9hdDJJbnRQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRWxpbWluYXRlQXZhaWxhYmxlRXh0ZXJuYWxseVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTY2FsYXJpemVNYXNrZWRNZW1JbnRyaW5QYXNzKCk7CisKKyAgICAgICh2b2lkKW5ldyBsbHZtOjpJbnRlcnZhbFBhcnRpdGlvbigpOworICAgICAgKHZvaWQpbmV3IGxsdm06OlNjYWxhckV2b2x1dGlvbldyYXBwZXJQYXNzKCk7CisgICAgICBsbHZtOjpGdW5jdGlvbjo6Q3JlYXRlKG51bGxwdHIsIGxsdm06Okdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UpLT52aWV3Q0ZHT25seSgpOworICAgICAgbGx2bTo6UkdQYXNzTWFuYWdlciBSR007CisgICAgICBsbHZtOjpUYXJnZXRMaWJyYXJ5SW5mb0ltcGwgVExJSTsKKyAgICAgIGxsdm06OlRhcmdldExpYnJhcnlJbmZvIFRMSShUTElJKTsKKyAgICAgIGxsdm06OkFsaWFzQW5hbHlzaXMgQUEoVExJKTsKKyAgICAgIGxsdm06OkFsaWFzU2V0VHJhY2tlciBYKEFBKTsKKyAgICAgIFguYWRkKG51bGxwdHIsIDAsIGxsdm06OkFBTUROb2RlcygpKTsgLy8gZm9yIC1wcmludC1hbGlhcy1zZXRzCisgICAgICAodm9pZCkgbGx2bTo6QXJlU3RhdGlzdGljc0VuYWJsZWQoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpzeXM6OlJ1bm5pbmdPblZhbGdyaW5kKCk7CisgICAgfQorICB9IEZvcmNlUGFzc0xpbmtpbmc7IC8vIEZvcmNlIGxpbmsgYnkgY3JlYXRpbmcgYSBnbG9iYWwgZGVmaW5pdGlvbi4KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xpbmtlci9JUk1vdmVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xpbmtlci9JUk1vdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1YWRhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTGlua2VyL0lSTW92ZXIuaApAQCAtMCwwICsxLDg5IEBACisvLz09PS0gSVJNb3Zlci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTElOS0VSX0lSTU9WRVJfSAorI2RlZmluZSBMTFZNX0xJTktFUl9JUk1PVkVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBFcnJvcjsKK2NsYXNzIEdsb2JhbFZhbHVlOworY2xhc3MgTWV0YWRhdGE7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBTdHJ1Y3RUeXBlOworY2xhc3MgVHJhY2tpbmdNRFJlZjsKK2NsYXNzIFR5cGU7CisKK2NsYXNzIElSTW92ZXIgeworICBzdHJ1Y3QgU3RydWN0VHlwZUtleUluZm8geworICAgIHN0cnVjdCBLZXlUeSB7CisgICAgICBBcnJheVJlZjxUeXBlICo+IEVUeXBlczsKKyAgICAgIGJvb2wgSXNQYWNrZWQ7CisgICAgICBLZXlUeShBcnJheVJlZjxUeXBlICo+IEUsIGJvb2wgUCk7CisgICAgICBLZXlUeShjb25zdCBTdHJ1Y3RUeXBlICpTVCk7CisgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgS2V5VHkgJnRoYXQpIGNvbnN0OworICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEtleVR5ICZ0aGF0KSBjb25zdDsKKyAgICB9OworICAgIHN0YXRpYyBTdHJ1Y3RUeXBlICpnZXRFbXB0eUtleSgpOworICAgIHN0YXRpYyBTdHJ1Y3RUeXBlICpnZXRUb21ic3RvbmVLZXkoKTsKKyAgICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IEtleVR5ICZLZXkpOworICAgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgU3RydWN0VHlwZSAqU1QpOworICAgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgS2V5VHkgJkxIUywgY29uc3QgU3RydWN0VHlwZSAqUkhTKTsKKyAgICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IFN0cnVjdFR5cGUgKkxIUywgY29uc3QgU3RydWN0VHlwZSAqUkhTKTsKKyAgfTsKKworICAvLy8gVHlwZSBvZiB0aGUgTWV0YWRhdGEgbWFwIGluIFxhIFZhbHVlVG9WYWx1ZU1hcFR5LgorICB0eXBlZGVmIERlbnNlTWFwPGNvbnN0IE1ldGFkYXRhICosIFRyYWNraW5nTURSZWY+IE1ETWFwVDsKKworcHVibGljOgorICBjbGFzcyBJZGVudGlmaWVkU3RydWN0VHlwZVNldCB7CisgICAgLy8gVGhlIHNldCBvZiBvcGFxdWUgdHlwZXMgaXMgdGhlIGNvbXBvc2l0ZSBtb2R1bGUuCisgICAgRGVuc2VTZXQ8U3RydWN0VHlwZSAqPiBPcGFxdWVTdHJ1Y3RUeXBlczsKKworICAgIC8vIFRoZSBzZXQgb2YgaWRlbnRpZmllZCBidXQgbm9uIG9wYXF1ZSBzdHJ1Y3R1cmVzIGluIHRoZSBjb21wb3NpdGUgbW9kdWxlLgorICAgIERlbnNlU2V0PFN0cnVjdFR5cGUgKiwgU3RydWN0VHlwZUtleUluZm8+IE5vbk9wYXF1ZVN0cnVjdFR5cGVzOworCisgIHB1YmxpYzoKKyAgICB2b2lkIGFkZE5vbk9wYXF1ZShTdHJ1Y3RUeXBlICpUeSk7CisgICAgdm9pZCBzd2l0Y2hUb05vbk9wYXF1ZShTdHJ1Y3RUeXBlICpUeSk7CisgICAgdm9pZCBhZGRPcGFxdWUoU3RydWN0VHlwZSAqVHkpOworICAgIFN0cnVjdFR5cGUgKmZpbmROb25PcGFxdWUoQXJyYXlSZWY8VHlwZSAqPiBFVHlwZXMsIGJvb2wgSXNQYWNrZWQpOworICAgIGJvb2wgaGFzVHlwZShTdHJ1Y3RUeXBlICpUeSk7CisgIH07CisKKyAgSVJNb3ZlcihNb2R1bGUgJk0pOworCisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKEdsb2JhbFZhbHVlICYpPiBWYWx1ZUFkZGVyOworCisgIC8vLyBNb3ZlIGluIHRoZSBwcm92aWRlIHZhbHVlcyBpbiBccCBWYWx1ZXNUb0xpbmsgZnJvbSBccCBTcmMuCisgIC8vLworICAvLy8gLSBccCBBZGRMYXp5Rm9yIGlzIGEgY2FsbCBiYWNrIHRoYXQgdGhlIElSTW92ZXIgd2lsbCBjYWxsIHdoZW4gYSBnbG9iYWwKKyAgLy8vICAgdmFsdWUgaXMgcmVmZXJlbmNlZCBieSBvbmUgb2YgdGhlIFZhbHVlc1RvTGluayAodHJhbnNpdGl2ZWx5KSBidXQgd2FzCisgIC8vLyAgIG5vdCBwcmVzZW50IGluIFZhbHVlc1RvTGluay4gVGhlIEdsb2JhbFZhbHVlIGFuZCBhIFZhbHVlQWRkZXIgY2FsbGJhY2sKKyAgLy8vICAgYXJlIHBhc3NlZCBhcyBhbiBhcmd1bWVudCwgYW5kIHRoZSBjYWxsYmFjayBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQKKyAgLy8vICAgaWYgdGhlIEdsb2JhbFZhbHVlIG5lZWRzIHRvIGJlIGFkZGVkIHRvIHRoZSBccCBWYWx1ZXNUb0xpbmsgYW5kIGxpbmtlZC4KKyAgLy8vIC0gXHAgSXNQZXJmb3JtaW5nSW1wb3J0IGlzIHRydWUgd2hlbiB0aGlzIElSIGxpbmsgaXMgdG8gcGVyZm9ybSBUaGluTFRPCisgIC8vLyAgIGZ1bmN0aW9uIGltcG9ydGluZyBmcm9tIFNyYy4KKyAgRXJyb3IgbW92ZShzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBTcmMsIEFycmF5UmVmPEdsb2JhbFZhbHVlICo+IFZhbHVlc1RvTGluaywKKyAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoR2xvYmFsVmFsdWUgJkdWLCBWYWx1ZUFkZGVyIEFkZCk+IEFkZExhenlGb3IsCisgICAgICAgICAgICAgYm9vbCBJc1BlcmZvcm1pbmdJbXBvcnQpOworICBNb2R1bGUgJmdldE1vZHVsZSgpIHsgcmV0dXJuIENvbXBvc2l0ZTsgfQorCitwcml2YXRlOgorICBNb2R1bGUgJkNvbXBvc2l0ZTsKKyAgSWRlbnRpZmllZFN0cnVjdFR5cGVTZXQgSWRlbnRpZmllZFN0cnVjdFR5cGVzOworICBNRE1hcFQgU2hhcmVkTURzOyAvLy88IEEgTWV0YWRhdGEgbWFwIHRvIHVzZSBmb3IgYWxsIGNhbGxzIHRvIFxhIG1vdmUoKS4KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MaW5rZXIvTGlua2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xpbmtlci9MaW5rZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjhlMDExCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MaW5rZXIvTGlua2VyLmgKQEAgLTAsMCArMSw1OSBAQAorLy89PT0tIExpbmtlci5oIC0gTW9kdWxlIExpbmtlciBJbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0xJTktFUl9MSU5LRVJfSAorI2RlZmluZSBMTFZNX0xJTktFUl9MSU5LRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9MaW5rZXIvSVJNb3Zlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBTdHJ1Y3RUeXBlOworY2xhc3MgVHlwZTsKKworLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBvZiBsaW5raW5nIGluIExMVk0uIEl0IGtlZXBzIGEKKy8vLyBwb2ludGVyIHRvIHRoZSBtZXJnZWQgbW9kdWxlIHNvIGZhci4gSXQgZG9lc24ndCB0YWtlIG93bmVyc2hpcCBvZiB0aGUKKy8vLyBtb2R1bGUgc2luY2UgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSB1c2VyIG9mIHRoaXMgY2xhc3Mgd2lsbCB3YW50IHRvIGRvCisvLy8gc29tZXRoaW5nIHdpdGggaXQgYWZ0ZXIgdGhlIGxpbmtpbmcuCitjbGFzcyBMaW5rZXIgeworICBJUk1vdmVyIE1vdmVyOworCitwdWJsaWM6CisgIGVudW0gRmxhZ3MgeworICAgIE5vbmUgPSAwLAorICAgIE92ZXJyaWRlRnJvbVNyYyA9ICgxIDw8IDApLAorICAgIExpbmtPbmx5TmVlZGVkID0gKDEgPDwgMSksCisgIH07CisKKyAgTGlua2VyKE1vZHVsZSAmTSk7CisKKyAgLy8vIFxicmllZiBMaW5rIFxwIFNyYyBpbnRvIHRoZSBjb21wb3NpdGUuCisgIC8vLworICAvLy8gUGFzc2luZyBPdmVycmlkZVN5bWJvbHMgYXMgdHJ1ZSB3aWxsIGhhdmUgc3ltYm9scyBmcm9tIFNyYworICAvLy8gc2hhZG93IHRob3NlIGluIHRoZSBEZXN0LgorICAvLy8KKyAgLy8vIFBhc3NpbmcgSW50ZXJuYWxpemVDYWxsYmFjayB3aWxsIGhhdmUgdGhlIGxpbmtlciBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoCisgIC8vLyB0aGUgbmV3IG1vZHVsZSBhbmQgYSBsaXN0IG9mIGdsb2JhbCB2YWx1ZSBuYW1lcyB0byBiZSBpbnRlcm5hbGl6ZWQgYnkgdGhlCisgIC8vLyBjYWxsYmFjay4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIHRydWUgb24gZXJyb3IuCisgIGJvb2wgbGlua0luTW9kdWxlKHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IFNyYywgdW5zaWduZWQgRmxhZ3MgPSBGbGFnczo6Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKE1vZHVsZSAmLCBjb25zdCBTdHJpbmdTZXQ8PiAmKT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVybmFsaXplQ2FsbGJhY2sgPSB7fSk7CisKKyAgc3RhdGljIGJvb2wgbGlua01vZHVsZXMoTW9kdWxlICZEZXN0LCBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzID0gRmxhZ3M6Ok5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChNb2R1bGUgJiwgY29uc3QgU3RyaW5nU2V0PD4gJik+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbGl6ZUNhbGxiYWNrID0ge30pOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL0NvbnN0YW50UG9vbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvQ29uc3RhbnRQb29scy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMzMyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL0NvbnN0YW50UG9vbHMuaApAQCAtMCwwICsxLDEwMyBAQAorLy89PT0tIENvbnN0YW50UG9vbC5oIC0gS2VlcCB0cmFjayBvZiBhc3NlbWJsZXItZ2VuZXJhdGVkICAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIENvbnN0YW50UG9vbCBhbmQgQXNzZW1ibGVyQ29uc3RhbnRQb29scyBjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19DT05TVEFOVFBPT0xTX0gKKyNkZWZpbmUgTExWTV9NQ19DT05TVEFOVFBPT0xTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTWFwVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU01Mb2MuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBNQ0V4cHI7CitjbGFzcyBNQ1NlY3Rpb247CitjbGFzcyBNQ1N0cmVhbWVyOworY2xhc3MgTUNTeW1ib2w7CitjbGFzcyBNQ1N5bWJvbFJlZkV4cHI7CisKK3N0cnVjdCBDb25zdGFudFBvb2xFbnRyeSB7CisgIENvbnN0YW50UG9vbEVudHJ5KE1DU3ltYm9sICpMLCBjb25zdCBNQ0V4cHIgKlZhbCwgdW5zaWduZWQgU3osIFNNTG9jIExvY18pCisgICAgOiBMYWJlbChMKSwgVmFsdWUoVmFsKSwgU2l6ZShTeiksIExvYyhMb2NfKSB7fQorCisgIE1DU3ltYm9sICpMYWJlbDsKKyAgY29uc3QgTUNFeHByICpWYWx1ZTsKKyAgdW5zaWduZWQgU2l6ZTsKKyAgU01Mb2MgTG9jOworfTsKKworLy8gQSBjbGFzcyB0byBrZWVwIHRyYWNrIG9mIGFzc2VtYmxlci1nZW5lcmF0ZWQgY29uc3RhbnQgcG9vbHMgdGhhdCBhcmUgdXNlIHRvCisvLyBpbXBsZW1lbnQgdGhlIGxkci1wc2V1ZG8uCitjbGFzcyBDb25zdGFudFBvb2wgeworICB1c2luZyBFbnRyeVZlY1R5ID0gU21hbGxWZWN0b3I8Q29uc3RhbnRQb29sRW50cnksIDQ+OworICBFbnRyeVZlY1R5IEVudHJpZXM7CisgIHN0ZDo6bWFwPGludDY0X3QsIGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqPiBDYWNoZWRFbnRyaWVzOworCitwdWJsaWM6CisgIC8vIEluaXRpYWxpemUgYSBuZXcgZW1wdHkgY29uc3RhbnQgcG9vbAorICBDb25zdGFudFBvb2woKSA9IGRlZmF1bHQ7CisKKyAgLy8gQWRkIGEgbmV3IGVudHJ5IHRvIHRoZSBjb25zdGFudCBwb29sIGluIHRoZSBuZXh0IHNsb3QuCisgIC8vIFxwYXJhbSBWYWx1ZSBpcyB0aGUgbmV3IGVudHJ5IHRvIHB1dCBpbiB0aGUgY29uc3RhbnQgcG9vbC4KKyAgLy8gXHBhcmFtIFNpemUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGVudHJ5CisgIC8vCisgIC8vIFxyZXR1cm5zIGEgTUNFeHByIHRoYXQgcmVmZXJlbmNlcyB0aGUgbmV3bHkgaW5zZXJ0ZWQgdmFsdWUKKyAgY29uc3QgTUNFeHByICphZGRFbnRyeShjb25zdCBNQ0V4cHIgKlZhbHVlLCBNQ0NvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSwgU01Mb2MgTG9jKTsKKworICAvLyBFbWl0IHRoZSBjb250ZW50cyBvZiB0aGUgY29uc3RhbnQgcG9vbCB1c2luZyB0aGUgcHJvdmlkZWQgc3RyZWFtZXIuCisgIHZvaWQgZW1pdEVudHJpZXMoTUNTdHJlYW1lciAmU3RyZWFtZXIpOworCisgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBjb25zdGFudCBwb29sIGlzIGVtcHR5CisgIGJvb2wgZW1wdHkoKTsKKworICB2b2lkIGNsZWFyQ2FjaGUoKTsKK307CisKK2NsYXNzIEFzc2VtYmxlckNvbnN0YW50UG9vbHMgeworICAvLyBNYXAgdHlwZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgcGVyLVNlY3Rpb24gY29uc3RhbnQgcG9vbHMgdXNlZCBieSB0aGUKKyAgLy8gbGRyLXBzZXVkbyBvcGNvZGUuIFRoZSBtYXAgYXNzb2NpYXRlcyBhIHNlY3Rpb24gdG8gaXRzIGNvbnN0YW50IHBvb2wuIFRoZQorICAvLyBjb25zdGFudCBwb29sIGlzIGEgdmVjdG9yIG9mIChsYWJlbCwgdmFsdWUpIHBhaXJzLiBXaGVuIHRoZSBsZHIKKyAgLy8gcHNldWRvIGlzIHBhcnNlZCB3ZSBpbnNlcnQgYSBuZXcgKGxhYmVsLCB2YWx1ZSkgcGFpciBpbnRvIHRoZSBjb25zdGFudCBwb29sCisgIC8vIGZvciB0aGUgY3VycmVudCBzZWN0aW9uIGFuZCBhZGQgTUNTeW1ib2xSZWZFeHByIHRvIHRoZSBuZXcgbGFiZWwgYXMKKyAgLy8gYW4gb3Bjb2RlIHRvIHRoZSBsZHIuIEFmdGVyIHdlIGhhdmUgcGFyc2VkIGFsbCB0aGUgdXNlciBpbnB1dCB3ZQorICAvLyBvdXRwdXQgdGhlIChsYWJlbCwgdmFsdWUpIHBhaXJzIGluIGVhY2ggY29uc3RhbnQgcG9vbCBhdCB0aGUgZW5kIG9mIHRoZQorICAvLyBzZWN0aW9uLgorICAvLworICAvLyBXZSB1c2UgdGhlIE1hcFZlY3RvciBmb3IgdGhlIG1hcCB0eXBlIHRvIGVuc3VyZSBzdGFibGUgaXRlcmF0aW9uIG9mCisgIC8vIHRoZSBzZWN0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBwYXJzZS4gV2UgbmVlZCB0byBpdGVyYXRlIG92ZXIgdGhlCisgIC8vIHNlY3Rpb25zIGluIGEgc3RhYmxlIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUgcHJpbnQgdGhlCisgIC8vIGNvbnN0YW50IHBvb2xzIGluIGEgZGV0ZXJtaW5pc3RpYyBvcmRlciB3aGVuIHByaW50aW5nIGFuIGFzc2VtYmx5CisgIC8vIGZpbGUuCisgIHVzaW5nIENvbnN0YW50UG9vbE1hcFR5ID0gTWFwVmVjdG9yPE1DU2VjdGlvbiAqLCBDb25zdGFudFBvb2w+OworICBDb25zdGFudFBvb2xNYXBUeSBDb25zdGFudFBvb2xzOworCitwdWJsaWM6CisgIHZvaWQgZW1pdEFsbChNQ1N0cmVhbWVyICZTdHJlYW1lcik7CisgIHZvaWQgZW1pdEZvckN1cnJlbnRTZWN0aW9uKE1DU3RyZWFtZXIgJlN0cmVhbWVyKTsKKyAgdm9pZCBjbGVhckNhY2hlRm9yQ3VycmVudFNlY3Rpb24oTUNTdHJlYW1lciAmU3RyZWFtZXIpOworICBjb25zdCBNQ0V4cHIgKmFkZEVudHJ5KE1DU3RyZWFtZXIgJlN0cmVhbWVyLCBjb25zdCBNQ0V4cHIgKkV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSwgU01Mb2MgTG9jKTsKKworcHJpdmF0ZToKKyAgQ29uc3RhbnRQb29sICpnZXRDb25zdGFudFBvb2woTUNTZWN0aW9uICpTZWN0aW9uKTsKKyAgQ29uc3RhbnRQb29sICZnZXRPckNyZWF0ZUNvbnN0YW50UG9vbChNQ1NlY3Rpb24gKlNlY3Rpb24pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfQ09OU1RBTlRQT09MU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL0xhbmVCaXRtYXNrLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL0xhbmVCaXRtYXNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwYjRlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTGFuZUJpdG1hc2suaApAQCAtMCwwICsxLDEwMiBAQAorLy89PT0tIGxsdm0vTUMvTGFuZUJpdG1hc2suaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gQSBjb21tb24gZGVmaW5pdGlvbiBvZiBMYW5lQml0bWFzayBmb3IgdXNlIGluIFRhYmxlR2VuIGFuZCBDb2RlR2VuLgorLy8vCisvLy8gQSBsYW5lIG1hc2sgaXMgYSBiaXRtYXNrIHJlcHJlc2VudGluZyB0aGUgY292ZXJpbmcgb2YgYSByZWdpc3RlciB3aXRoCisvLy8gc3ViLXJlZ2lzdGVycy4KKy8vLworLy8vIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgdG8gdHJhY2sgbGl2ZW5lc3MgYXQgc3ViLXJlZ2lzdGVyIGdyYW51bGFyaXR5LgorLy8vIExhbmUgbWFza3MgZm9yIHN1Yi1yZWdpc3RlciBpbmRpY2VzIGFyZSBzaW1pbGFyIHRvIHJlZ2lzdGVyIHVuaXRzIGZvcgorLy8vIHBoeXNpY2FsIHJlZ2lzdGVycy4gVGhlIGluZGl2aWR1YWwgYml0cyBpbiBhIGxhbmUgbWFzayBjYW4ndCBiZSBhc3NpZ25lZAorLy8vIGFueSBzcGVjaWZpYyBtZWFuaW5nLiBUaGV5IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGlmIHR3byBzdWItcmVnaXN0ZXIKKy8vLyBpbmRpY2VzIG92ZXJsYXAuCisvLy8KKy8vLyBJZmYgdGhlIHRhcmdldCBoYXMgYSByZWdpc3RlciBzdWNoIHRoYXQ6CisvLy8KKy8vLyAgIGdldFN1YlJlZyhSZWcsIEEpIG92ZXJsYXBzIGdldFN1YlJlZyhSZWcsIEIpCisvLy8KKy8vLyB0aGVuOgorLy8vCisvLy8gICAoZ2V0U3ViUmVnSW5kZXhMYW5lTWFzayhBKSAmIGdldFN1YlJlZ0luZGV4TGFuZU1hc2soQikpICE9IDAKKworI2lmbmRlZiBMTFZNX01DX0xBTkVCSVRNQVNLX0gKKyNkZWZpbmUgTExWTV9NQ19MQU5FQklUTUFTS19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1ByaW50YWJsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgc3RydWN0IExhbmVCaXRtYXNrIHsKKyAgICAvLyBXaGVuIGNoYW5naW5nIHRoZSB1bmRlcmx5aW5nIHR5cGUsIGNoYW5nZSB0aGUgZm9ybWF0IHN0cmluZyBhcyB3ZWxsLgorICAgIHVzaW5nIFR5cGUgPSB1bnNpZ25lZDsKKyAgICBlbnVtIDogdW5zaWduZWQgeyBCaXRXaWR0aCA9IDgqc2l6ZW9mKFR5cGUpIH07CisgICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBGb3JtYXRTdHIgPSAiJTA4WCI7CisKKyAgICBjb25zdGV4cHIgTGFuZUJpdG1hc2soKSA9IGRlZmF1bHQ7CisgICAgZXhwbGljaXQgY29uc3RleHByIExhbmVCaXRtYXNrKFR5cGUgVikgOiBNYXNrKFYpIHt9CisKKyAgICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09IChMYW5lQml0bWFzayBNKSBjb25zdCB7IHJldHVybiBNYXNrID09IE0uTWFzazsgfQorICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0gKExhbmVCaXRtYXNrIE0pIGNvbnN0IHsgcmV0dXJuIE1hc2sgIT0gTS5NYXNrOyB9CisgICAgY29uc3RleHByIGJvb2wgb3BlcmF0b3I8IChMYW5lQml0bWFzayBNKSAgY29uc3QgeyByZXR1cm4gTWFzayA8IE0uTWFzazsgfQorICAgIGNvbnN0ZXhwciBib29sIG5vbmUoKSBjb25zdCB7IHJldHVybiBNYXNrID09IDA7IH0KKyAgICBjb25zdGV4cHIgYm9vbCBhbnkoKSAgY29uc3QgeyByZXR1cm4gTWFzayAhPSAwOyB9CisgICAgY29uc3RleHByIGJvb2wgYWxsKCkgIGNvbnN0IHsgcmV0dXJuIH5NYXNrID09IDA7IH0KKworICAgIGNvbnN0ZXhwciBMYW5lQml0bWFzayBvcGVyYXRvcn4oKSBjb25zdCB7CisgICAgICByZXR1cm4gTGFuZUJpdG1hc2sofk1hc2spOworICAgIH0KKyAgICBjb25zdGV4cHIgTGFuZUJpdG1hc2sgb3BlcmF0b3J8KExhbmVCaXRtYXNrIE0pIGNvbnN0IHsKKyAgICAgIHJldHVybiBMYW5lQml0bWFzayhNYXNrIHwgTS5NYXNrKTsKKyAgICB9CisgICAgY29uc3RleHByIExhbmVCaXRtYXNrIG9wZXJhdG9yJihMYW5lQml0bWFzayBNKSBjb25zdCB7CisgICAgICByZXR1cm4gTGFuZUJpdG1hc2soTWFzayAmIE0uTWFzayk7CisgICAgfQorICAgIExhbmVCaXRtYXNrICZvcGVyYXRvcnw9KExhbmVCaXRtYXNrIE0pIHsKKyAgICAgIE1hc2sgfD0gTS5NYXNrOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBMYW5lQml0bWFzayAmb3BlcmF0b3ImPShMYW5lQml0bWFzayBNKSB7CisgICAgICBNYXNrICY9IE0uTWFzazsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBjb25zdGV4cHIgVHlwZSBnZXRBc0ludGVnZXIoKSBjb25zdCB7IHJldHVybiBNYXNrOyB9CisKKyAgICB1bnNpZ25lZCBnZXROdW1MYW5lcygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjb3VudFBvcHVsYXRpb24oTWFzayk7CisgICAgfQorICAgIHVuc2lnbmVkIGdldEhpZ2hlc3RMYW5lKCkgY29uc3QgeworICAgICAgcmV0dXJuIExvZzJfMzIoTWFzayk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0ZXhwciBMYW5lQml0bWFzayBnZXROb25lKCkgeyByZXR1cm4gTGFuZUJpdG1hc2soMCk7IH0KKyAgICBzdGF0aWMgY29uc3RleHByIExhbmVCaXRtYXNrIGdldEFsbCgpIHsgcmV0dXJuIH5MYW5lQml0bWFzaygwKTsgfQorICAgIHN0YXRpYyBjb25zdGV4cHIgTGFuZUJpdG1hc2sgZ2V0TGFuZSh1bnNpZ25lZCBMYW5lKSB7CisgICAgICByZXR1cm4gTGFuZUJpdG1hc2soVHlwZSgxKSA8PCBMYW5lKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBUeXBlIE1hc2sgPSAwOworICB9OworCisgIC8vLyBDcmVhdGUgUHJpbnRhYmxlIG9iamVjdCB0byBwcmludCBMYW5lQml0bWFza3Mgb24gYSBccmVmIHJhd19vc3RyZWFtLgorICBpbmxpbmUgUHJpbnRhYmxlIFByaW50TGFuZU1hc2soTGFuZUJpdG1hc2sgTGFuZU1hc2spIHsKKyAgICByZXR1cm4gUHJpbnRhYmxlKFtMYW5lTWFza10ocmF3X29zdHJlYW0gJk9TKSB7CisgICAgICBPUyA8PCBmb3JtYXQoTGFuZUJpdG1hc2s6OkZvcm1hdFN0ciwgTGFuZU1hc2suZ2V0QXNJbnRlZ2VyKCkpOworICAgIH0pOworICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX0xBTkVCSVRNQVNLX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc21CYWNrZW5kLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtQmFja2VuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YTU4NTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtQmFja2VuZC5oCkBAIC0wLDAgKzEsMTgyIEBACisvLz09PS0gbGx2bS9NQy9NQ0FzbUJhY2tlbmQuaCAtIE1DIEFzbSBCYWNrZW5kIC0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNBU01CQUNLRU5EX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0FTTUJBQ0tFTkRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNEaXJlY3RpdmVzLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0ZpeHVwLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0ZyYWdtZW50LmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNBc21MYXlvdXQ7CitjbGFzcyBNQ0Fzc2VtYmxlcjsKK2NsYXNzIE1DQ0ZJSW5zdHJ1Y3Rpb247CitjbGFzcyBNQ0NvZGVQYWRkZXI7CitzdHJ1Y3QgTUNGaXh1cEtpbmRJbmZvOworY2xhc3MgTUNGcmFnbWVudDsKK2NsYXNzIE1DSW5zdDsKK2NsYXNzIE1DT2JqZWN0U3RyZWFtZXI7CitjbGFzcyBNQ09iamVjdFdyaXRlcjsKK3N0cnVjdCBNQ0NvZGVQYWRkaW5nQ29udGV4dDsKK2NsYXNzIE1DUmVsYXhhYmxlRnJhZ21lbnQ7CitjbGFzcyBNQ1N1YnRhcmdldEluZm87CitjbGFzcyBNQ1ZhbHVlOworY2xhc3MgcmF3X3B3cml0ZV9zdHJlYW07CisKKy8vLyBHZW5lcmljIGludGVyZmFjZSB0byB0YXJnZXQgc3BlY2lmaWMgYXNzZW1ibGVyIGJhY2tlbmRzLgorY2xhc3MgTUNBc21CYWNrZW5kIHsKKyAgc3RkOjp1bmlxdWVfcHRyPE1DQ29kZVBhZGRlcj4gQ29kZVBhZGRlcjsKKworcHJvdGVjdGVkOiAvLyBDYW4gb25seSBjcmVhdGUgc3ViY2xhc3Nlcy4KKyAgTUNBc21CYWNrZW5kKCk7CisgIE1DQXNtQmFja2VuZChzdGQ6OnVuaXF1ZV9wdHI8TUNDb2RlUGFkZGVyPiBUYXJnZXRDb2RlUGFkZGVyKTsKKworcHVibGljOgorICBNQ0FzbUJhY2tlbmQoY29uc3QgTUNBc21CYWNrZW5kICYpID0gZGVsZXRlOworICBNQ0FzbUJhY2tlbmQgJm9wZXJhdG9yPShjb25zdCBNQ0FzbUJhY2tlbmQgJikgPSBkZWxldGU7CisgIHZpcnR1YWwgfk1DQXNtQmFja2VuZCgpOworCisgIC8vLyBsaWZldGltZSBtYW5hZ2VtZW50CisgIHZpcnR1YWwgdm9pZCByZXNldCgpIHt9CisKKyAgLy8vIENyZWF0ZSBhIG5ldyBNQ09iamVjdFdyaXRlciBpbnN0YW5jZSBmb3IgdXNlIGJ5IHRoZSBhc3NlbWJsZXIgYmFja2VuZCB0bworICAvLy8gZW1pdCB0aGUgZmluYWwgb2JqZWN0IGZpbGUuCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPE1DT2JqZWN0V3JpdGVyPgorICBjcmVhdGVPYmplY3RXcml0ZXIocmF3X3B3cml0ZV9zdHJlYW0gJk9TKSBjb25zdCA9IDA7CisKKyAgLy8vIFxuYW1lIFRhcmdldCBGaXh1cCBJbnRlcmZhY2VzCisgIC8vLyBAeworCisgIC8vLyBHZXQgdGhlIG51bWJlciBvZiB0YXJnZXQgc3BlY2lmaWMgZml4dXAga2luZHMuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TnVtRml4dXBLaW5kcygpIGNvbnN0ID0gMDsKKworICAvLy8gTWFwIGEgcmVsb2NhdGlvbiBuYW1lIHVzZWQgaW4gLnJlbG9jIHRvIGEgZml4dXAga2luZC4KKyAgdmlydHVhbCBPcHRpb25hbDxNQ0ZpeHVwS2luZD4gZ2V0Rml4dXBLaW5kKFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKworICAvLy8gR2V0IGluZm9ybWF0aW9uIG9uIGEgZml4dXAga2luZC4KKyAgdmlydHVhbCBjb25zdCBNQ0ZpeHVwS2luZEluZm8gJmdldEZpeHVwS2luZEluZm8oTUNGaXh1cEtpbmQgS2luZCkgY29uc3Q7CisKKyAgLy8vIEhvb2sgdG8gY2hlY2sgaWYgYSByZWxvY2F0aW9uIGlzIG5lZWRlZCBmb3Igc29tZSB0YXJnZXQgc3BlY2lmaWMgcmVhc29uLgorICB2aXJ0dWFsIGJvb2wgc2hvdWxkRm9yY2VSZWxvY2F0aW9uKGNvbnN0IE1DQXNzZW1ibGVyICZBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGaXh1cCAmRml4dXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNWYWx1ZSAmVGFyZ2V0KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIEFwcGx5IHRoZSBccCBWYWx1ZSBmb3IgZ2l2ZW4gXHAgRml4dXAgaW50byB0aGUgcHJvdmlkZWQgZGF0YSBmcmFnbWVudCwgYXQKKyAgLy8vIHRoZSBvZmZzZXQgc3BlY2lmaWVkIGJ5IHRoZSBmaXh1cCBhbmQgZm9sbG93aW5nIHRoZSBmaXh1cCBraW5kIGFzCisgIC8vLyBhcHByb3ByaWF0ZS4gRXJyb3JzIChzdWNoIGFzIGFuIG91dCBvZiByYW5nZSBmaXh1cCB2YWx1ZSkgc2hvdWxkIGJlCisgIC8vLyByZXBvcnRlZCB2aWEgXHAgQ3R4LgorICB2aXJ0dWFsIHZvaWQgYXBwbHlGaXh1cChjb25zdCBNQ0Fzc2VtYmxlciAmQXNtLCBjb25zdCBNQ0ZpeHVwICZGaXh1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNWYWx1ZSAmVGFyZ2V0LCBNdXRhYmxlQXJyYXlSZWY8Y2hhcj4gRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVmFsdWUsIGJvb2wgSXNSZXNvbHZlZCkgY29uc3QgPSAwOworCisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBUYXJnZXQgUmVsYXhhdGlvbiBJbnRlcmZhY2VzCisgIC8vLyBAeworCisgIC8vLyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBtYXkgbmVlZCByZWxheGF0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJbnN0IC0gVGhlIGluc3RydWN0aW9uIHRvIHRlc3QuCisgIHZpcnR1YWwgYm9vbCBtYXlOZWVkUmVsYXhhdGlvbihjb25zdCBNQ0luc3QgJkluc3QpIGNvbnN0ID0gMDsKKworICAvLy8gVGFyZ2V0IHNwZWNpZmljIHByZWRpY2F0ZSBmb3Igd2hldGhlciBhIGdpdmVuIGZpeHVwIHJlcXVpcmVzIHRoZQorICAvLy8gYXNzb2NpYXRlZCBpbnN0cnVjdGlvbiB0byBiZSByZWxheGVkLgorICB2aXJ0dWFsIGJvb2wgZml4dXBOZWVkc1JlbGF4YXRpb25BZHZhbmNlZChjb25zdCBNQ0ZpeHVwICZGaXh1cCwgYm9vbCBSZXNvbHZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DUmVsYXhhYmxlRnJhZ21lbnQgKkRGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdDsKKworICAvLy8gU2ltcGxlIHByZWRpY2F0ZSBmb3IgdGFyZ2V0cyB3aGVyZSAhUmVzb2x2ZWQgaW1wbGllcyByZXF1aXJpbmcgcmVsYXhhdGlvbgorICB2aXJ0dWFsIGJvb2wgZml4dXBOZWVkc1JlbGF4YXRpb24oY29uc3QgTUNGaXh1cCAmRml4dXAsIHVpbnQ2NF90IFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNSZWxheGFibGVGcmFnbWVudCAqREYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdCA9IDA7CisKKyAgLy8vIFJlbGF4IHRoZSBpbnN0cnVjdGlvbiBpbiB0aGUgZ2l2ZW4gZnJhZ21lbnQgdG8gdGhlIG5leHQgd2lkZXIgaW5zdHJ1Y3Rpb24uCisgIC8vLworICAvLy8gXHBhcmFtIEluc3QgVGhlIGluc3RydWN0aW9uIHRvIHJlbGF4LCB3aGljaCBtYXkgYmUgdGhlIHNhbWUgYXMgdGhlCisgIC8vLyBvdXRwdXQuCisgIC8vLyBccGFyYW0gU1RJIHRoZSBzdWJ0YXJnZXQgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGluc3RydWN0aW9uLgorICAvLy8gXHBhcmFtIFtvdXRdIFJlcyBPbiByZXR1cm4sIHRoZSByZWxheGVkIGluc3RydWN0aW9uLgorICB2aXJ0dWFsIHZvaWQgcmVsYXhJbnN0cnVjdGlvbihjb25zdCBNQ0luc3QgJkluc3QsIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0luc3QgJlJlcykgY29uc3QgPSAwOworCisgIC8vLyBAfQorCisgIC8vLyBSZXR1cm5zIHRoZSBtaW5pbXVtIHNpemUgb2YgYSBub3AgaW4gYnl0ZXMgb24gdGhpcyB0YXJnZXQuIFRoZSBhc3NlbWJsZXIKKyAgLy8vIHdpbGwgdXNlIHRoaXMgdG8gZW1pdCBleGNlc3MgcGFkZGluZyBpbiBzaXR1YXRpb25zIHdoZXJlIHRoZSBwYWRkaW5nCisgIC8vLyByZXF1aXJlZCBmb3Igc2ltcGxlIGFsaWdubWVudCB3b3VsZCBiZSBsZXNzIHRoYW4gdGhlIG1pbmltdW0gbm9wIHNpemUuCisgIC8vLworICB2aXJ0dWFsIHVuc2lnbmVkIGdldE1pbmltdW1Ob3BTaXplKCkgY29uc3QgeyByZXR1cm4gMTsgfQorCisgIC8vLyBXcml0ZSBhbiAob3B0aW1hbCkgbm9wIHNlcXVlbmNlIG9mIENvdW50IGJ5dGVzIHRvIHRoZSBnaXZlbiBvdXRwdXQuIElmIHRoZQorICAvLy8gdGFyZ2V0IGNhbm5vdCBnZW5lcmF0ZSBzdWNoIGEgc2VxdWVuY2UsIGl0IHNob3VsZCByZXR1cm4gYW4gZXJyb3IuCisgIC8vLworICAvLy8gXHJldHVybiAtIFRydWUgb24gc3VjY2Vzcy4KKyAgdmlydHVhbCBib29sIHdyaXRlTm9wRGF0YSh1aW50NjRfdCBDb3VudCwgTUNPYmplY3RXcml0ZXIgKk9XKSBjb25zdCA9IDA7CisKKyAgLy8vIEdpdmUgYmFja2VuZCBhbiBvcHBvcnR1bml0eSB0byBmaW5pc2ggbGF5b3V0IGFmdGVyIHJlbGF4YXRpb24KKyAgdmlydHVhbCB2b2lkIGZpbmlzaExheW91dChNQ0Fzc2VtYmxlciBjb25zdCAmQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQXNtTGF5b3V0ICZMYXlvdXQpIGNvbnN0IHt9CisKKyAgLy8vIEhhbmRsZSBhbnkgdGFyZ2V0LXNwZWNpZmljIGFzc2VtYmxlciBmbGFncy4gQnkgZGVmYXVsdCwgZG8gbm90aGluZy4KKyAgdmlydHVhbCB2b2lkIGhhbmRsZUFzc2VtYmxlckZsYWcoTUNBc3NlbWJsZXJGbGFnIEZsYWcpIHt9CisKKyAgLy8vIFxicmllZiBHZW5lcmF0ZSB0aGUgY29tcGFjdCB1bndpbmQgZW5jb2RpbmcgZm9yIHRoZSBDRkkgaW5zdHJ1Y3Rpb25zLgorICB2aXJ0dWFsIHVpbnQzMl90CisgICAgICBnZW5lcmF0ZUNvbXBhY3RVbndpbmRFbmNvZGluZyhBcnJheVJlZjxNQ0NGSUluc3RydWN0aW9uPikgY29uc3QgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIEhhbmRsZXMgYWxsIHRhcmdldCByZWxhdGVkIGNvZGUgcGFkZGluZyB3aGVuIHN0YXJ0aW5nIHRvIHdyaXRlIGEgbmV3CisgIC8vLyBiYXNpYyBibG9jayB0byBhbiBvYmplY3QgZmlsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gT1MgVGhlIHN0cmVhbWVyIHVzZWQgZm9yIHdyaXRpbmcgdGhlIHBhZGRpbmcgZGF0YSBhbmQgZnVuY3Rpb24uCisgIC8vLyBccGFyYW0gQ29udGV4dCB0aGUgY29udGV4dCBvZiB0aGUgcGFkZGluZywgRW1iZWRzIHRoZSBiYXNpYyBibG9jaydzCisgIC8vLyBwYXJhbWV0ZXJzLgorICB2b2lkIGhhbmRsZUNvZGVQYWRkaW5nQmFzaWNCbG9ja1N0YXJ0KE1DT2JqZWN0U3RyZWFtZXIgKk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQ29kZVBhZGRpbmdDb250ZXh0ICZDb250ZXh0KTsKKyAgLy8vIEhhbmRsZXMgYWxsIHRhcmdldCByZWxhdGVkIGNvZGUgcGFkZGluZyBhZnRlciB3cml0aW5nIGEgYmxvY2sgdG8gYW4gb2JqZWN0CisgIC8vLyBmaWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSBwYWRkaW5nLCBFbWJlZHMgdGhlIGJhc2ljIGJsb2NrJ3MKKyAgLy8vIHBhcmFtZXRlcnMuCisgIHZvaWQgaGFuZGxlQ29kZVBhZGRpbmdCYXNpY0Jsb2NrRW5kKGNvbnN0IE1DQ29kZVBhZGRpbmdDb250ZXh0ICZDb250ZXh0KTsKKyAgLy8vIEhhbmRsZXMgYWxsIHRhcmdldCByZWxhdGVkIGNvZGUgcGFkZGluZyBiZWZvcmUgd3JpdGluZyBhIG5ldyBpbnN0cnVjdGlvbgorICAvLy8gdG8gYW4gb2JqZWN0IGZpbGUuCisgIC8vLworICAvLy8gXHBhcmFtIEluc3QgdGhlIGluc3RydWN0aW9uLgorICB2b2lkIGhhbmRsZUNvZGVQYWRkaW5nSW5zdHJ1Y3Rpb25CZWdpbihjb25zdCBNQ0luc3QgJkluc3QpOworICAvLy8gSGFuZGxlcyBhbGwgdGFyZ2V0IHJlbGF0ZWQgY29kZSBwYWRkaW5nIGFmdGVyIHdyaXRpbmcgYW4gaW5zdHJ1Y3Rpb24gdG8gYW4KKyAgLy8vIG9iamVjdCBmaWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJbnN0IHRoZSBpbnN0cnVjdGlvbi4KKyAgdm9pZCBoYW5kbGVDb2RlUGFkZGluZ0luc3RydWN0aW9uRW5kKGNvbnN0IE1DSW5zdCAmSW5zdCk7CisKKyAgLy8vIFJlbGF4ZXMgYSBmcmFnbWVudCAoY2hhbmdlcyB0aGUgc2l6ZSBvZiB0aGUgcGFkZGluZykgYWNjb3JkaW5nIHRvIHRhcmdldAorICAvLy8gcmVxdWlyZW1lbnRzLiBUaGUgbmV3IHNpemUgY29tcHV0YXRpb24gaXMgZG9uZSB3LnIudCBhIGxheW91dC4KKyAgLy8vCisgIC8vLyBccGFyYW0gUEYgVGhlIGZyYWdtZW50IHRvIHJlbGF4LgorICAvLy8gXHBhcmFtIExheW91dCBDb2RlIGxheW91dCBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmZiBhbnkgcmVsYXhhdGlvbiBvY2N1cnJlZC4KKyAgYm9vbCByZWxheEZyYWdtZW50KE1DUGFkZGluZ0ZyYWdtZW50ICpQRiwgTUNBc21MYXlvdXQgJkxheW91dCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ0FTTUJBQ0tFTkRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc21JbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUzOGM0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc21JbmZvLmgKQEAgLTAsMCArMSw2MjQgQEAKKy8vPT09LS0gbGx2bS9NQy9NQ0FzbUluZm8uaCAtIEFzbSBpbmZvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGEgY2xhc3MgdG8gYmUgdXNlZCBhcyB0aGUgYmFzaXMgZm9yIHRhcmdldCBzcGVjaWZpYworLy8gYXNtIHdyaXRlcnMuICBUaGlzIGNsYXNzIHByaW1hcmlseSB0YWtlcyBjYXJlIG9mIGdsb2JhbCBwcmludGluZyBjb25zdGFudHMsCisvLyB3aGljaCBhcmUgdXNlZCBpbiB2ZXJ5IHNpbWlsYXIgd2F5cyBhY3Jvc3MgYWxsIHRhcmdldHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DQVNNSU5GT19ICisjZGVmaW5lIExMVk1fTUNfTUNBU01JTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNEaXJlY3RpdmVzLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNFeHByOworY2xhc3MgTUNTZWN0aW9uOworY2xhc3MgTUNTdHJlYW1lcjsKK2NsYXNzIE1DU3ltYm9sOworCituYW1lc3BhY2UgV2luRUggeworCitlbnVtIGNsYXNzIEVuY29kaW5nVHlwZSB7CisgIEludmFsaWQsIC8vLyBJbnZhbGlkCisgIEFscGhhLCAgIC8vLyBXaW5kb3dzIEFscGhhCisgIEFscGhhNjQsIC8vLyBXaW5kb3dzIEFYUDY0CisgIEFSTSwgICAgIC8vLyBXaW5kb3dzIE5UIChXaW5kb3dzIG9uIEFSTSkKKyAgQ0UsICAgICAgLy8vIFdpbmRvd3MgQ0UgQVJNLCBQb3dlclBDLCBTSDMsIFNINAorICBJdGFuaXVtLCAvLy8gV2luZG93cyB4NjQsIFdpbmRvd3MgSXRhbml1bSAoSUEtNjQpCisgIFg4NiwgICAgIC8vLyBXaW5kb3dzIHg4NiwgdXNlcyBubyBDRkksIGp1c3QgRUggdGFibGVzCisgIE1JUFMgPSBBbHBoYSwKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBXaW5FSAorCituYW1lc3BhY2UgTENPTU0geworCitlbnVtIExDT01NVHlwZSB7IE5vQWxpZ25tZW50LCBCeXRlQWxpZ25tZW50LCBMb2cyQWxpZ25tZW50IH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBMQ09NTQorCisvLy8gVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgYmFzZSBjbGFzcyBmb3IgYXNtCisvLy8gcHJvcGVydGllcyBhbmQgZmVhdHVyZXMgc3BlY2lmaWMgdG8gdGhlIHRhcmdldC4KK2NsYXNzIE1DQXNtSW5mbyB7Citwcm90ZWN0ZWQ6CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUHJvcGVydGllcyB0byBiZSBzZXQgYnkgdGhlIHRhcmdldCB3cml0ZXIsIHVzZWQgdG8gY29uZmlndXJlIGFzbSBwcmludGVyLgorICAvLworCisgIC8vLyBDb2RlIHBvaW50ZXIgc2l6ZSBpbiBieXRlcy4gIERlZmF1bHQgaXMgNC4KKyAgdW5zaWduZWQgQ29kZVBvaW50ZXJTaXplID0gNDsKKworICAvLy8gU2l6ZSBvZiB0aGUgc3RhY2sgc2xvdCByZXNlcnZlZCBmb3IgY2FsbGVlLXNhdmVkIHJlZ2lzdGVycywgaW4gYnl0ZXMuCisgIC8vLyBEZWZhdWx0IGlzIHNhbWUgYXMgcG9pbnRlciBzaXplLgorICB1bnNpZ25lZCBDYWxsZWVTYXZlU3RhY2tTbG90U2l6ZSA9IDQ7CisKKyAgLy8vIFRydWUgaWYgdGFyZ2V0IGlzIGxpdHRsZSBlbmRpYW4uICBEZWZhdWx0IGlzIHRydWUuCisgIGJvb2wgSXNMaXR0bGVFbmRpYW4gPSB0cnVlOworCisgIC8vLyBUcnVlIGlmIHRhcmdldCBzdGFjayBncm93IHVwLiAgRGVmYXVsdCBpcyBmYWxzZS4KKyAgYm9vbCBTdGFja0dyb3dzVXAgPSBmYWxzZTsKKworICAvLy8gVHJ1ZSBpZiB0aGlzIHRhcmdldCBoYXMgdGhlIE1hY2hPIC5zdWJzZWN0aW9uc192aWFfc3ltYm9scyBkaXJlY3RpdmUuCisgIC8vLyBEZWZhdWx0IGlzIGZhbHNlLgorICBib29sIEhhc1N1YnNlY3Rpb25zVmlhU3ltYm9scyA9IGZhbHNlOworCisgIC8vLyBUcnVlIGlmIHRoaXMgaXMgYSBNYWNoTyB0YXJnZXQgdGhhdCBzdXBwb3J0cyB0aGUgbWFjaG8tc3BlY2lmaWMgLnplcm9maWxsCisgIC8vLyBkaXJlY3RpdmUgZm9yIGVtaXR0aW5nIEJTUyBTeW1ib2xzLiAgRGVmYXVsdCBpcyBmYWxzZS4KKyAgYm9vbCBIYXNNYWNob1plcm9GaWxsRGlyZWN0aXZlID0gZmFsc2U7CisKKyAgLy8vIFRydWUgaWYgdGhpcyBpcyBhIE1hY2hPIHRhcmdldCB0aGF0IHN1cHBvcnRzIHRoZSBtYWNoby1zcGVjaWZpYyAudGJzcworICAvLy8gZGlyZWN0aXZlIGZvciBlbWl0dGluZyB0aHJlYWQgbG9jYWwgQlNTIFN5bWJvbHMuICBEZWZhdWx0IGlzIGZhbHNlLgorICBib29sIEhhc01hY2hvVEJTU0RpcmVjdGl2ZSA9IGZhbHNlOworCisgIC8vLyBUaGlzIGlzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbiwgd2hpY2ggaXMgbmVlZGVkIHRvCisgIC8vLyBjb21wdXRlIHRoZSBzaXplIG9mIGFuIGlubGluZSBhc20uICBEZWZhdWx0cyB0byA0LgorICB1bnNpZ25lZCBNYXhJbnN0TGVuZ3RoID0gNDsKKworICAvLy8gRXZlcnkgcG9zc2libGUgaW5zdHJ1Y3Rpb24gbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgdGhpcyB2YWx1ZS4gIEZhY3RvcmVkCisgIC8vLyBvdXQgaW4gLmRlYnVnX2ZyYW1lIGFuZCAuZGVidWdfbGluZS4gIERlZmF1bHRzIHRvIDEuCisgIHVuc2lnbmVkIE1pbkluc3RBbGlnbm1lbnQgPSAxOworCisgIC8vLyBUaGUgJyQnIHRva2VuLCB3aGVuIG5vdCByZWZlcmVuY2luZyBhbiBpZGVudGlmaWVyIG9yIGNvbnN0YW50LCByZWZlcnMgdG8KKyAgLy8vIHRoZSBjdXJyZW50IFBDLiAgRGVmYXVsdHMgdG8gZmFsc2UuCisgIGJvb2wgRG9sbGFySXNQQyA9IGZhbHNlOworCisgIC8vLyBUaGlzIHN0cmluZywgaWYgc3BlY2lmaWVkLCBpcyB1c2VkIHRvIHNlcGFyYXRlIGluc3RydWN0aW9ucyBmcm9tIGVhY2gKKyAgLy8vIG90aGVyIHdoZW4gb24gdGhlIHNhbWUgbGluZS4gIERlZmF1bHRzIHRvICc7JworICBjb25zdCBjaGFyICpTZXBhcmF0b3JTdHJpbmc7CisKKyAgLy8vIFRoaXMgaW5kaWNhdGVzIHRoZSBjb21tZW50IGNoYXJhY3RlciB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIuICBEZWZhdWx0cyB0bworICAvLy8gIiMiCisgIFN0cmluZ1JlZiBDb21tZW50U3RyaW5nOworCisgIC8vLyBUaGlzIGlzIGFwcGVuZGVkIHRvIGVtaXR0ZWQgbGFiZWxzLiAgRGVmYXVsdHMgdG8gIjoiCisgIGNvbnN0IGNoYXIgKkxhYmVsU3VmZml4OworCisgIC8vIFByaW50IHRoZSBFSCBiZWdpbiBzeW1ib2wgd2l0aCBhbiBhc3NpZ25tZW50LiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgYm9vbCBVc2VBc3NpZ25tZW50Rm9yRUhCZWdpbiA9IGZhbHNlOworCisgIC8vIERvIHdlIG5lZWQgdG8gY3JlYXRlIGEgbG9jYWwgc3ltYm9sIGZvciAuc2l6ZT8KKyAgYm9vbCBOZWVkc0xvY2FsRm9yU2l6ZSA9IGZhbHNlOworCisgIC8vLyBUaGlzIHByZWZpeCBpcyB1c2VkIGZvciBnbG9iYWxzIGxpa2UgY29uc3RhbnQgcG9vbCBlbnRyaWVzIHRoYXQgYXJlCisgIC8vLyBjb21wbGV0ZWx5IHByaXZhdGUgdG8gdGhlIC5zIGZpbGUgYW5kIHNob3VsZCBub3QgaGF2ZSBuYW1lcyBpbiB0aGUgLm8KKyAgLy8vIGZpbGUuICBEZWZhdWx0cyB0byAiTCIKKyAgU3RyaW5nUmVmIFByaXZhdGVHbG9iYWxQcmVmaXg7CisKKyAgLy8vIFRoaXMgcHJlZml4IGlzIHVzZWQgZm9yIGxhYmVscyBmb3IgYmFzaWMgYmxvY2tzLiBEZWZhdWx0cyB0byB0aGUgc2FtZSBhcworICAvLy8gUHJpdmF0ZUdsb2JhbFByZWZpeC4KKyAgU3RyaW5nUmVmIFByaXZhdGVMYWJlbFByZWZpeDsKKworICAvLy8gVGhpcyBwcmVmaXggaXMgdXNlZCBmb3Igc3ltYm9scyB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdGhyb3VnaCB0aGUKKyAgLy8vIGFzc2VtYmxlciBidXQgYmUgcmVtb3ZlZCBieSB0aGUgbGlua2VyLiAgVGhpcyBpcyAnbCcgb24gRGFyd2luLCBjdXJyZW50bHkKKyAgLy8vIHVzZWQgZm9yIHNvbWUgT2JqQyBtZXRhZGF0YS4gIFRoZSBkZWZhdWx0IG9mICIiIG1lYXN0IHRoYXQgZm9yIHRoaXMgc3lzdGVtCisgIC8vLyBhIHBsYWluIHByaXZhdGUgc3ltYm9sIHNob3VsZCBiZSB1c2VkLiAgRGVmYXVsdHMgdG8gIiIuCisgIFN0cmluZ1JlZiBMaW5rZXJQcml2YXRlR2xvYmFsUHJlZml4OworCisgIC8vLyBJZiB0aGVzZSBhcmUgbm9uZW1wdHksIHRoZXkgY29udGFpbiBhIGRpcmVjdGl2ZSB0byBlbWl0IGJlZm9yZSBhbmQgYWZ0ZXIKKyAgLy8vIGFuIGlubGluZSBhc3NlbWJseSBzdGF0ZW1lbnQuICBEZWZhdWx0cyB0byAiI0FQUFxuIiwgIiNOT19BUFBcbiIKKyAgY29uc3QgY2hhciAqSW5saW5lQXNtU3RhcnQ7CisgIGNvbnN0IGNoYXIgKklubGluZUFzbUVuZDsKKworICAvLy8gVGhlc2UgYXJlIGFzc2VtYmx5IGRpcmVjdGl2ZXMgdGhhdCB0ZWxscyB0aGUgYXNzZW1ibGVyIHRvIGludGVycHJldCB0aGUKKyAgLy8vIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgZGlmZmVyZW50bHkuICBEZWZhdWx0cyB0byAiLmNvZGUxNiIsICIuY29kZTMyIiwKKyAgLy8vICIuY29kZTY0Ii4KKyAgY29uc3QgY2hhciAqQ29kZTE2RGlyZWN0aXZlOworICBjb25zdCBjaGFyICpDb2RlMzJEaXJlY3RpdmU7CisgIGNvbnN0IGNoYXIgKkNvZGU2NERpcmVjdGl2ZTsKKworICAvLy8gV2hpY2ggZGlhbGVjdCBvZiBhbiBhc3NlbWJsZXIgdmFyaWFudCB0byB1c2UuICBEZWZhdWx0cyB0byAwCisgIHVuc2lnbmVkIEFzc2VtYmxlckRpYWxlY3QgPSAwOworCisgIC8vLyBUaGlzIGlzIHRydWUgaWYgdGhlIGFzc2VtYmxlciBhbGxvd3MgQCBjaGFyYWN0ZXJzIGluIHN5bWJvbCBuYW1lcy4KKyAgLy8vIERlZmF1bHRzIHRvIGZhbHNlLgorICBib29sIEFsbG93QXRJbk5hbWUgPSBmYWxzZTsKKworICAvLy8gSWYgdGhpcyBpcyB0cnVlLCBzeW1ib2wgbmFtZXMgd2l0aCBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbCBiZSBwcmludGVkIGluCisgIC8vLyBxdW90ZXMuCisgIGJvb2wgU3VwcG9ydHNRdW90ZWROYW1lcyA9IHRydWU7CisKKyAgLy8vIFRoaXMgaXMgdHJ1ZSBpZiBkYXRhIHJlZ2lvbiBtYXJrZXJzIHNob3VsZCBiZSBwcmludGVkIGFzCisgIC8vLyAiLmRhdGFfcmVnaW9uLy5lbmRfZGF0YV9yZWdpb24iIGRpcmVjdGl2ZXMuIElmIGZhbHNlLCB1c2UgIiRkLyRhIiBsYWJlbHMKKyAgLy8vIGluc3RlYWQuCisgIGJvb2wgVXNlRGF0YVJlZ2lvbkRpcmVjdGl2ZXMgPSBmYWxzZTsKKworICAvLz09PS0tLSBEYXRhIEVtaXNzaW9uIERpcmVjdGl2ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFRoaXMgc2hvdWxkIGJlIHNldCB0byB0aGUgZGlyZWN0aXZlIHVzZWQgdG8gZ2V0IHNvbWUgbnVtYmVyIG9mIHplcm8gYnl0ZXMKKyAgLy8vIGVtaXR0ZWQgdG8gdGhlIGN1cnJlbnQgc2VjdGlvbi4gIENvbW1vbiBjYXNlcyBhcmUgIlx0Lnplcm9cdCIgYW5kCisgIC8vLyAiXHQuc3BhY2VcdCIuICBJZiB0aGlzIGlzIHNldCB0byBudWxsLCB0aGUgRGF0YSpiaXRzRGlyZWN0aXZlJ3Mgd2lsbCBiZQorICAvLy8gdXNlZCB0byBlbWl0IHplcm8gYnl0ZXMuICBEZWZhdWx0cyB0byAiXHQuemVyb1x0IgorICBjb25zdCBjaGFyICpaZXJvRGlyZWN0aXZlOworCisgIC8vLyBUaGlzIGRpcmVjdGl2ZSBhbGxvd3MgZW1pc3Npb24gb2YgYW4gYXNjaWkgc3RyaW5nIHdpdGggdGhlIHN0YW5kYXJkIEMKKyAgLy8vIGVzY2FwZSBjaGFyYWN0ZXJzIGVtYmVkZGVkIGludG8gaXQuICBJZiBhIHRhcmdldCBkb2Vzbid0IHN1cHBvcnQgdGhpcywgaXQKKyAgLy8vIGNhbiBiZSBzZXQgdG8gbnVsbC4gRGVmYXVsdHMgdG8gIlx0LmFzY2lpXHQiCisgIGNvbnN0IGNoYXIgKkFzY2lpRGlyZWN0aXZlOworCisgIC8vLyBJZiBub3QgbnVsbCwgdGhpcyBhbGxvd3MgZm9yIHNwZWNpYWwgaGFuZGxpbmcgb2YgemVybyB0ZXJtaW5hdGVkIHN0cmluZ3MKKyAgLy8vIG9uIHRoaXMgdGFyZ2V0LiAgVGhpcyBpcyBjb21tb25seSBzdXBwb3J0ZWQgYXMgIi5hc2NpeiIuICBJZiBhIHRhcmdldAorICAvLy8gZG9lc24ndCBzdXBwb3J0IHRoaXMsIGl0IGNhbiBiZSBzZXQgdG8gbnVsbC4gIERlZmF1bHRzIHRvICJcdC5hc2Npelx0IgorICBjb25zdCBjaGFyICpBc2NpekRpcmVjdGl2ZTsKKworICAvLy8gVGhlc2UgZGlyZWN0aXZlcyBhcmUgdXNlZCB0byBvdXRwdXQgc29tZSB1bml0IG9mIGludGVnZXIgZGF0YSB0byB0aGUKKyAgLy8vIGN1cnJlbnQgc2VjdGlvbi4gIElmIGEgZGF0YSBkaXJlY3RpdmUgaXMgc2V0IHRvIG51bGwsIHNtYWxsZXIgZGF0YQorICAvLy8gZGlyZWN0aXZlcyB3aWxsIGJlIHVzZWQgdG8gZW1pdCB0aGUgbGFyZ2Ugc2l6ZXMuICBEZWZhdWx0cyB0byAiXHQuYnl0ZVx0IiwKKyAgLy8vICJcdC5zaG9ydFx0IiwgIlx0LmxvbmdcdCIsICJcdC5xdWFkXHQiCisgIGNvbnN0IGNoYXIgKkRhdGE4Yml0c0RpcmVjdGl2ZTsKKyAgY29uc3QgY2hhciAqRGF0YTE2Yml0c0RpcmVjdGl2ZTsKKyAgY29uc3QgY2hhciAqRGF0YTMyYml0c0RpcmVjdGl2ZTsKKyAgY29uc3QgY2hhciAqRGF0YTY0Yml0c0RpcmVjdGl2ZTsKKworICAvLy8gSWYgbm9uLW51bGwsIGEgZGlyZWN0aXZlIHRoYXQgaXMgdXNlZCB0byBlbWl0IGEgd29yZCB3aGljaCBzaG91bGQgYmUKKyAgLy8vIHJlbG9jYXRlZCBhcyBhIDY0LWJpdCBHUC1yZWxhdGl2ZSBvZmZzZXQsIGUuZy4gLmdwZHdvcmQgb24gTWlwcy4gIERlZmF1bHRzCisgIC8vLyB0byBudWxscHRyLgorICBjb25zdCBjaGFyICpHUFJlbDY0RGlyZWN0aXZlID0gbnVsbHB0cjsKKworICAvLy8gSWYgbm9uLW51bGwsIGEgZGlyZWN0aXZlIHRoYXQgaXMgdXNlZCB0byBlbWl0IGEgd29yZCB3aGljaCBzaG91bGQgYmUKKyAgLy8vIHJlbG9jYXRlZCBhcyBhIDMyLWJpdCBHUC1yZWxhdGl2ZSBvZmZzZXQsIGUuZy4gLmdwd29yZCBvbiBNaXBzIG9yIC5ncHJlbDMyCisgIC8vLyBvbiBBbHBoYS4gIERlZmF1bHRzIHRvIG51bGxwdHIuCisgIGNvbnN0IGNoYXIgKkdQUmVsMzJEaXJlY3RpdmUgPSBudWxscHRyOworCisgIC8vLyBJZiBub24tbnVsbCwgZGlyZWN0aXZlcyB0aGF0IGFyZSB1c2VkIHRvIGVtaXQgYSB3b3JkL2R3b3JkIHdoaWNoIHNob3VsZAorICAvLy8gYmUgcmVsb2NhdGVkIGFzIGEgMzIvNjQtYml0IERUUC9UUC1yZWxhdGl2ZSBvZmZzZXQsIGUuZy4gLmR0cHJlbHdvcmQvCisgIC8vLyAuZHRwcmVsZHdvcmQvLnRwcmVsd29yZC8udHByZWxkd29yZCBvbiBNaXBzLgorICBjb25zdCBjaGFyICpEVFBSZWwzMkRpcmVjdGl2ZSA9IG51bGxwdHI7CisgIGNvbnN0IGNoYXIgKkRUUFJlbDY0RGlyZWN0aXZlID0gbnVsbHB0cjsKKyAgY29uc3QgY2hhciAqVFBSZWwzMkRpcmVjdGl2ZSA9IG51bGxwdHI7CisgIGNvbnN0IGNoYXIgKlRQUmVsNjREaXJlY3RpdmUgPSBudWxscHRyOworCisgIC8vLyBUaGlzIGlzIHRydWUgaWYgdGhpcyB0YXJnZXQgdXNlcyAiU3VuIFN0eWxlIiBzeW50YXggZm9yIHNlY3Rpb24gc3dpdGNoaW5nCisgIC8vLyAoIiNhbGxvYywjd3JpdGUiIGV0YykgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIEVMRiBzeW50YXggKCwiYSx3IikgaW4KKyAgLy8vIC5zZWN0aW9uIGRpcmVjdGl2ZXMuICBEZWZhdWx0cyB0byBmYWxzZS4KKyAgYm9vbCBTdW5TdHlsZUVMRlNlY3Rpb25Td2l0Y2hTeW50YXggPSBmYWxzZTsKKworICAvLy8gVGhpcyBpcyB0cnVlIGlmIHRoaXMgdGFyZ2V0IHVzZXMgRUxGICcuc2VjdGlvbicgZGlyZWN0aXZlIGJlZm9yZSB0aGUKKyAgLy8vICcuYnNzJyBvbmUuIEl0J3MgdXNlZCBmb3IgUFBDL0xpbnV4IHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgJy5ic3MnCisgIC8vLyBkaXJlY3RpdmUgb25seS4gIERlZmF1bHRzIHRvIGZhbHNlLgorICBib29sIFVzZXNFTEZTZWN0aW9uRGlyZWN0aXZlRm9yQlNTID0gZmFsc2U7CisKKyAgYm9vbCBOZWVkc0R3YXJmU2VjdGlvbk9mZnNldERpcmVjdGl2ZSA9IGZhbHNlOworCisgIC8vPT09LS0tIEFsaWdubWVudCBJbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gSWYgdGhpcyBpcyB0cnVlICh0aGUgZGVmYXVsdCkgdGhlbiB0aGUgYXNtcHJpbnRlciBlbWl0cyAiLmFsaWduIE4iCisgIC8vLyBkaXJlY3RpdmVzLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWxpZ24gdG8uICBPdGhlcndpc2UsIGl0CisgIC8vLyBlbWl0cyAiLmFsaWduIGxvZzIoTikiLCBlLmcuIDMgdG8gYWxpZ24gdG8gYW4gOCBieXRlIGJvdW5kYXJ5LiAgRGVmYXVsdHMKKyAgLy8vIHRvIHRydWUuCisgIGJvb2wgQWxpZ25tZW50SXNJbkJ5dGVzID0gdHJ1ZTsKKworICAvLy8gSWYgbm9uLXplcm8sIHRoaXMgaXMgdXNlZCB0byBmaWxsIHRoZSBleGVjdXRhYmxlIHNwYWNlIGNyZWF0ZWQgYXMgdGhlCisgIC8vLyByZXN1bHQgb2YgYSBhbGlnbm1lbnQgZGlyZWN0aXZlLiAgRGVmYXVsdHMgdG8gMAorICB1bnNpZ25lZCBUZXh0QWxpZ25GaWxsVmFsdWUgPSAwOworCisgIC8vPT09LS0tIEdsb2JhbCBWYXJpYWJsZSBFbWlzc2lvbiBEaXJlY3RpdmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gVGhpcyBpcyB0aGUgZGlyZWN0aXZlIHVzZWQgdG8gZGVjbGFyZSBhIGdsb2JhbCBlbnRpdHkuIERlZmF1bHRzIHRvCisgIC8vLyAiLmdsb2JsIi4KKyAgY29uc3QgY2hhciAqR2xvYmFsRGlyZWN0aXZlOworCisgIC8vLyBUcnVlIGlmIHRoZSBleHByZXNzaW9uCisgIC8vLyAgIC5sb25nIGYgLSBnCisgIC8vLyB1c2VzIGEgcmVsb2NhdGlvbiBidXQgaXQgY2FuIGJlIHN1cHByZXNzZWQgYnkgd3JpdGluZworICAvLy8gICBhID0gZiAtIGcKKyAgLy8vICAgLmxvbmcgYQorICBib29sIFNldERpcmVjdGl2ZVN1cHByZXNzZXNSZWxvYyA9IGZhbHNlOworCisgIC8vLyBGYWxzZSBpZiB0aGUgYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgd2UgdXNlCisgIC8vLyBcY29kZQorICAvLy8gICBMYyA9IGEgLSBiCisgIC8vLyAgIC5sb25nIExjCisgIC8vLyBcZW5kY29kZQorICAvLworICAvLy8gaW5zdGVhZCBvZgorICAvLworICAvLy8gXGNvZGUKKyAgLy8vICAgLmxvbmcgYSAtIGIKKyAgLy8vIFxlbmRjb2RlCisgIC8vLworICAvLy8gIERlZmF1bHRzIHRvIHRydWUuCisgIGJvb2wgSGFzQWdncmVzc2l2ZVN5bWJvbEZvbGRpbmcgPSB0cnVlOworCisgIC8vLyBUcnVlIGlzIC5jb21tJ3MgYW5kIC5sY29tbXMgb3B0aW9uYWwgYWxpZ25tZW50IGlzIHRvIGJlIHNwZWNpZmllZCBpbiBieXRlcworICAvLy8gaW5zdGVhZCBvZiBsb2cyKG4pLiAgRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgYm9vbCBDT01NRGlyZWN0aXZlQWxpZ25tZW50SXNJbkJ5dGVzID0gdHJ1ZTsKKworICAvLy8gRGVzY3JpYmVzIGlmIHRoZSAubGNvbW0gZGlyZWN0aXZlIGZvciB0aGUgdGFyZ2V0IHN1cHBvcnRzIGFuIGFsaWdubWVudAorICAvLy8gYXJndW1lbnQgYW5kIGhvdyBpdCBpcyBpbnRlcnByZXRlZC4gIERlZmF1bHRzIHRvIE5vQWxpZ25tZW50LgorICBMQ09NTTo6TENPTU1UeXBlIExDT01NRGlyZWN0aXZlQWxpZ25tZW50VHlwZSA9IExDT01NOjpOb0FsaWdubWVudDsKKworICAvLyBUcnVlIGlmIHRoZSB0YXJnZXQgYWxsb3dzIC5hbGlnbiBkaXJlY3RpdmVzIG9uIGZ1bmN0aW9ucy4gVGhpcyBpcyB0cnVlIGZvcgorICAvLyBtb3N0IHRhcmdldHMsIHNvIGRlZmF1bHRzIHRvIHRydWUuCisgIGJvb2wgSGFzRnVuY3Rpb25BbGlnbm1lbnQgPSB0cnVlOworCisgIC8vLyBUcnVlIGlmIHRoZSB0YXJnZXQgaGFzIC50eXBlIGFuZCAuc2l6ZSBkaXJlY3RpdmVzLCB0aGlzIGlzIHRydWUgZm9yIG1vc3QKKyAgLy8vIEVMRiB0YXJnZXRzLiAgRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgYm9vbCBIYXNEb3RUeXBlRG90U2l6ZURpcmVjdGl2ZSA9IHRydWU7CisKKyAgLy8vIFRydWUgaWYgdGhlIHRhcmdldCBoYXMgYSBzaW5nbGUgcGFyYW1ldGVyIC5maWxlIGRpcmVjdGl2ZSwgdGhpcyBpcyB0cnVlCisgIC8vLyBmb3IgRUxGIHRhcmdldHMuICBEZWZhdWx0cyB0byB0cnVlLgorICBib29sIEhhc1NpbmdsZVBhcmFtZXRlckRvdEZpbGUgPSB0cnVlOworCisgIC8vLyBUcnVlIGlmIHRoZSB0YXJnZXQgaGFzIGEgLmlkZW50IGRpcmVjdGl2ZSwgdGhpcyBpcyB0cnVlIGZvciBFTEYgdGFyZ2V0cy4KKyAgLy8vIERlZmF1bHRzIHRvIGZhbHNlLgorICBib29sIEhhc0lkZW50RGlyZWN0aXZlID0gZmFsc2U7CisKKyAgLy8vIFRydWUgaWYgdGhpcyB0YXJnZXQgc3VwcG9ydHMgdGhlIE1hY2hPIC5ub19kZWFkX3N0cmlwIGRpcmVjdGl2ZS4gIERlZmF1bHRzCisgIC8vLyB0byBmYWxzZS4KKyAgYm9vbCBIYXNOb0RlYWRTdHJpcCA9IGZhbHNlOworCisgIC8vLyBUcnVlIGlmIHRoaXMgdGFyZ2V0IHN1cHBvcnRzIHRoZSBNYWNoTyAuYWx0X2VudHJ5IGRpcmVjdGl2ZS4gIERlZmF1bHRzIHRvCisgIC8vLyBmYWxzZS4KKyAgYm9vbCBIYXNBbHRFbnRyeSA9IGZhbHNlOworCisgIC8vLyBVc2VkIHRvIGRlY2xhcmUgYSBnbG9iYWwgYXMgYmVpbmcgYSB3ZWFrIHN5bWJvbC4gRGVmYXVsdHMgdG8gIi53ZWFrIi4KKyAgY29uc3QgY2hhciAqV2Vha0RpcmVjdGl2ZTsKKworICAvLy8gVGhpcyBkaXJlY3RpdmUsIGlmIG5vbi1udWxsLCBpcyB1c2VkIHRvIGRlY2xhcmUgYSBnbG9iYWwgYXMgYmVpbmcgYSB3ZWFrCisgIC8vLyB1bmRlZmluZWQgc3ltYm9sLiAgRGVmYXVsdHMgdG8gbnVsbHB0ci4KKyAgY29uc3QgY2hhciAqV2Vha1JlZkRpcmVjdGl2ZSA9IG51bGxwdHI7CisKKyAgLy8vIFRydWUgaWYgd2UgaGF2ZSBhIGRpcmVjdGl2ZSB0byBkZWNsYXJlIGEgZ2xvYmFsIGFzIGJlaW5nIGEgd2VhayBkZWZpbmVkCisgIC8vLyBzeW1ib2wuICBEZWZhdWx0cyB0byBmYWxzZS4KKyAgYm9vbCBIYXNXZWFrRGVmRGlyZWN0aXZlID0gZmFsc2U7CisKKyAgLy8vIFRydWUgaWYgd2UgaGF2ZSBhIGRpcmVjdGl2ZSB0byBkZWNsYXJlIGEgZ2xvYmFsIGFzIGJlaW5nIGEgd2VhayBkZWZpbmVkCisgIC8vLyBzeW1ib2wgdGhhdCBjYW4gYmUgaGlkZGVuICh1bmV4cG9ydGVkKS4gIERlZmF1bHRzIHRvIGZhbHNlLgorICBib29sIEhhc1dlYWtEZWZDYW5CZUhpZGRlbkRpcmVjdGl2ZSA9IGZhbHNlOworCisgIC8vLyBUcnVlIGlmIHdlIGhhdmUgYSAubGlua29uY2UgZGlyZWN0aXZlLiAgVGhpcyBpcyB1c2VkIG9uIGN5Z3dpbi9taW5ndy4KKyAgLy8vIERlZmF1bHRzIHRvIGZhbHNlLgorICBib29sIEhhc0xpbmtPbmNlRGlyZWN0aXZlID0gZmFsc2U7CisKKyAgLy8vIFRoaXMgYXR0cmlidXRlLCBpZiBub3QgTUNTQV9JbnZhbGlkLCBpcyB1c2VkIHRvIGRlY2xhcmUgYSBzeW1ib2wgYXMgaGF2aW5nCisgIC8vLyBoaWRkZW4gdmlzaWJpbGl0eS4gIERlZmF1bHRzIHRvIE1DU0FfSGlkZGVuLgorICBNQ1N5bWJvbEF0dHIgSGlkZGVuVmlzaWJpbGl0eUF0dHIgPSBNQ1NBX0hpZGRlbjsKKworICAvLy8gVGhpcyBhdHRyaWJ1dGUsIGlmIG5vdCBNQ1NBX0ludmFsaWQsIGlzIHVzZWQgdG8gZGVjbGFyZSBhbiB1bmRlZmluZWQKKyAgLy8vIHN5bWJvbCBhcyBoYXZpbmcgaGlkZGVuIHZpc2liaWxpdHkuIERlZmF1bHRzIHRvIE1DU0FfSGlkZGVuLgorICBNQ1N5bWJvbEF0dHIgSGlkZGVuRGVjbGFyYXRpb25WaXNpYmlsaXR5QXR0ciA9IE1DU0FfSGlkZGVuOworCisgIC8vLyBUaGlzIGF0dHJpYnV0ZSwgaWYgbm90IE1DU0FfSW52YWxpZCwgaXMgdXNlZCB0byBkZWNsYXJlIGEgc3ltYm9sIGFzIGhhdmluZworICAvLy8gcHJvdGVjdGVkIHZpc2liaWxpdHkuICBEZWZhdWx0cyB0byBNQ1NBX1Byb3RlY3RlZAorICBNQ1N5bWJvbEF0dHIgUHJvdGVjdGVkVmlzaWJpbGl0eUF0dHIgPSBNQ1NBX1Byb3RlY3RlZDsKKworICAvLz09PS0tLSBEd2FyZiBFbWlzc2lvbiBEaXJlY3RpdmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gVHJ1ZSBpZiB0YXJnZXQgc3VwcG9ydHMgZW1pc3Npb24gb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRGVmYXVsdHMgdG8KKyAgLy8vIGZhbHNlLgorICBib29sIFN1cHBvcnRzRGVidWdJbmZvcm1hdGlvbiA9IGZhbHNlOworCisgIC8vLyBFeGNlcHRpb24gaGFuZGxpbmcgZm9ybWF0IGZvciB0aGUgdGFyZ2V0LiAgRGVmYXVsdHMgdG8gTm9uZS4KKyAgRXhjZXB0aW9uSGFuZGxpbmcgRXhjZXB0aW9uc1R5cGUgPSBFeGNlcHRpb25IYW5kbGluZzo6Tm9uZTsKKworICAvLy8gV2luZG93cyBleGNlcHRpb24gaGFuZGxpbmcgZGF0YSAoLnBkYXRhKSBlbmNvZGluZy4gIERlZmF1bHRzIHRvIEludmFsaWQuCisgIFdpbkVIOjpFbmNvZGluZ1R5cGUgV2luRUhFbmNvZGluZ1R5cGUgPSBXaW5FSDo6RW5jb2RpbmdUeXBlOjpJbnZhbGlkOworCisgIC8vLyBUcnVlIGlmIER3YXJmMiBvdXRwdXQgZ2VuZXJhbGx5IHVzZXMgcmVsb2NhdGlvbnMgZm9yIHJlZmVyZW5jZXMgdG8gb3RoZXIKKyAgLy8vIC5kZWJ1Z18qIHNlY3Rpb25zLgorICBib29sIER3YXJmVXNlc1JlbG9jYXRpb25zQWNyb3NzU2VjdGlvbnMgPSB0cnVlOworCisgIC8vLyBUcnVlIGlmIERXQVJGIEZERSBzeW1ib2wgcmVmZXJlbmNlIHJlbG9jYXRpb25zIHNob3VsZCBiZSByZXBsYWNlZCBieSBhbgorICAvLy8gYWJzb2x1dGUgZGlmZmVyZW5jZS4KKyAgYm9vbCBEd2FyZkZERVN5bWJvbHNVc2VBYnNEaWZmID0gZmFsc2U7CisKKyAgLy8vIFRydWUgaWYgZHdhcmYgcmVnaXN0ZXIgbnVtYmVycyBhcmUgcHJpbnRlZCBpbnN0ZWFkIG9mIHN5bWJvbGljIHJlZ2lzdGVyCisgIC8vLyBuYW1lcyBpbiAuY2ZpXyogZGlyZWN0aXZlcy4gIERlZmF1bHRzIHRvIGZhbHNlLgorICBib29sIER3YXJmUmVnTnVtRm9yQ0ZJID0gZmFsc2U7CisKKyAgLy8vIFRydWUgaWYgdGFyZ2V0IHVzZXMgcGFyZW5zIHRvIGluZGljYXRlIHRoZSBzeW1ib2wgdmFyaWFudCBpbnN0ZWFkIG9mIEAuCisgIC8vLyBGb3IgZXhhbXBsZSwgZm9vKHBsdCkgaW5zdGVhZCBvZiBmb29AcGx0LiAgRGVmYXVsdHMgdG8gZmFsc2UuCisgIGJvb2wgVXNlUGFyZW5zRm9yU3ltYm9sVmFyaWFudCA9IGZhbHNlOworCisgIC8vPT09LS0tIFByb2xvZ3VlIFN0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIHN0ZDo6dmVjdG9yPE1DQ0ZJSW5zdHJ1Y3Rpb24+IEluaXRpYWxGcmFtZVN0YXRlOworCisgIC8vPT09LS0tIEludGVncmF0ZWQgQXNzZW1ibGVyIEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBTaG91bGQgd2UgdXNlIHRoZSBpbnRlZ3JhdGVkIGFzc2VtYmxlcj8KKyAgLy8vIFRoZSBpbnRlZ3JhdGVkIGFzc2VtYmxlciBzaG91bGQgYmUgZW5hYmxlZCBieSBkZWZhdWx0IChieSB0aGUKKyAgLy8vIGNvbnN0cnVjdG9ycykgd2hlbiBmYWlsaW5nIHRvIHBhcnNlIGEgdmFsaWQgcGllY2Ugb2YgYXNzZW1ibHkgKGlubGluZQorICAvLy8gb3Igb3RoZXJ3aXNlKSBpcyBjb25zaWRlcmVkIGEgYnVnLiBJdCBtYXkgdGhlbiBiZSBvdmVycmlkZGVuIGFmdGVyCisgIC8vLyBjb25zdHJ1Y3Rpb24gKHNlZSBMTFZNVGFyZ2V0TWFjaGluZTo6aW5pdEFzbUluZm8oKSkuCisgIGJvb2wgVXNlSW50ZWdyYXRlZEFzc2VtYmxlcjsKKworICAvLy8gUHJlc2VydmUgQ29tbWVudHMgaW4gYXNzZW1ibHkKKyAgYm9vbCBQcmVzZXJ2ZUFzbUNvbW1lbnRzOworCisgIC8vLyBDb21wcmVzcyBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4gRGVmYXVsdHMgdG8gbm8gY29tcHJlc3Npb24uCisgIERlYnVnQ29tcHJlc3Npb25UeXBlIENvbXByZXNzRGVidWdTZWN0aW9ucyA9IERlYnVnQ29tcHJlc3Npb25UeXBlOjpOb25lOworCisgIC8vLyBUcnVlIGlmIHRoZSBpbnRlZ3JhdGVkIGFzc2VtYmxlciBzaG91bGQgaW50ZXJwcmV0ICdhID4+IGInIGNvbnN0YW50CisgIC8vLyBleHByZXNzaW9ucyBhcyBsb2dpY2FsIHJhdGhlciB0aGFuIGFyaXRobWV0aWMuCisgIGJvb2wgVXNlTG9naWNhbFNociA9IHRydWU7CisKKyAgLy8gSWYgdHJ1ZSwgZW1pdCBHT1RQQ1JFTFgvUkVYX0dPVFBDUkVMWCBpbnN0ZWFkIG9mIEdPVFBDUkVMLCBvbgorICAvLyBYODZfNjQgRUxGLgorICBib29sIFJlbGF4RUxGUmVsb2NhdGlvbnMgPSB0cnVlOworCisgIC8vIElmIHRydWUsIHRoZW4gdGhlIGxleGVyIGFuZCBleHByZXNzaW9uIHBhcnNlciB3aWxsIHN1cHBvcnQgJW5lZygpLAorICAvLyAlaGkoKSwgYW5kIHNpbWlsYXIgdW5hcnkgb3BlcmF0b3JzLgorICBib29sIEhhc01pcHNFeHByZXNzaW9ucyA9IGZhbHNlOworCitwdWJsaWM6CisgIGV4cGxpY2l0IE1DQXNtSW5mbygpOworICB2aXJ0dWFsIH5NQ0FzbUluZm8oKTsKKworICAvLy8gR2V0IHRoZSBjb2RlIHBvaW50ZXIgc2l6ZSBpbiBieXRlcy4KKyAgdW5zaWduZWQgZ2V0Q29kZVBvaW50ZXJTaXplKCkgY29uc3QgeyByZXR1cm4gQ29kZVBvaW50ZXJTaXplOyB9CisKKyAgLy8vIEdldCB0aGUgY2FsbGVlLXNhdmVkIHJlZ2lzdGVyIHN0YWNrIHNsb3QKKyAgLy8vIHNpemUgaW4gYnl0ZXMuCisgIHVuc2lnbmVkIGdldENhbGxlZVNhdmVTdGFja1Nsb3RTaXplKCkgY29uc3QgeworICAgIHJldHVybiBDYWxsZWVTYXZlU3RhY2tTbG90U2l6ZTsKKyAgfQorCisgIC8vLyBUcnVlIGlmIHRoZSB0YXJnZXQgaXMgbGl0dGxlIGVuZGlhbi4KKyAgYm9vbCBpc0xpdHRsZUVuZGlhbigpIGNvbnN0IHsgcmV0dXJuIElzTGl0dGxlRW5kaWFuOyB9CisKKyAgLy8vIFRydWUgaWYgdGFyZ2V0IHN0YWNrIGdyb3cgdXAuCisgIGJvb2wgaXNTdGFja0dyb3d0aERpcmVjdGlvblVwKCkgY29uc3QgeyByZXR1cm4gU3RhY2tHcm93c1VwOyB9CisKKyAgYm9vbCBoYXNTdWJzZWN0aW9uc1ZpYVN5bWJvbHMoKSBjb25zdCB7IHJldHVybiBIYXNTdWJzZWN0aW9uc1ZpYVN5bWJvbHM7IH0KKworICAvLyBEYXRhIGRpcmVjdGl2ZSBhY2Nlc3NvcnMuCisKKyAgY29uc3QgY2hhciAqZ2V0RGF0YThiaXRzRGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gRGF0YThiaXRzRGlyZWN0aXZlOyB9CisgIGNvbnN0IGNoYXIgKmdldERhdGExNmJpdHNEaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBEYXRhMTZiaXRzRGlyZWN0aXZlOyB9CisgIGNvbnN0IGNoYXIgKmdldERhdGEzMmJpdHNEaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBEYXRhMzJiaXRzRGlyZWN0aXZlOyB9CisgIGNvbnN0IGNoYXIgKmdldERhdGE2NGJpdHNEaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBEYXRhNjRiaXRzRGlyZWN0aXZlOyB9CisgIGNvbnN0IGNoYXIgKmdldEdQUmVsNjREaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBHUFJlbDY0RGlyZWN0aXZlOyB9CisgIGNvbnN0IGNoYXIgKmdldEdQUmVsMzJEaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBHUFJlbDMyRGlyZWN0aXZlOyB9CisgIGNvbnN0IGNoYXIgKmdldERUUFJlbDY0RGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gRFRQUmVsNjREaXJlY3RpdmU7IH0KKyAgY29uc3QgY2hhciAqZ2V0RFRQUmVsMzJEaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBEVFBSZWwzMkRpcmVjdGl2ZTsgfQorICBjb25zdCBjaGFyICpnZXRUUFJlbDY0RGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gVFBSZWw2NERpcmVjdGl2ZTsgfQorICBjb25zdCBjaGFyICpnZXRUUFJlbDMyRGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gVFBSZWwzMkRpcmVjdGl2ZTsgfQorCisgIC8vLyBUYXJnZXRzIGNhbiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc3BlY2lmeSBhIHNlY3Rpb24gdG8gc3dpdGNoIHRvIGlmIHRoZQorICAvLy8gdHJhbnNsYXRpb24gdW5pdCBkb2Vzbid0IGhhdmUgYW55IHRyYW1wb2xpbmVzIHRoYXQgcmVxdWlyZSBhbiBleGVjdXRhYmxlCisgIC8vLyBzdGFjay4KKyAgdmlydHVhbCBNQ1NlY3Rpb24gKmdldE5vbmV4ZWN1dGFibGVTdGFja1NlY3Rpb24oTUNDb250ZXh0ICZDdHgpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGUgc2VjdGlvbiBpcyBhdG9taXplZCB1c2luZyB0aGUgc3ltYm9scyBpbiBpdC4KKyAgLy8vIFRoaXMgaXMgZmFsc2UgaWYgdGhlIHNlY3Rpb24gaXMgbm90IGF0b21pemVkIGF0IGFsbCAobW9zdCBFTEYgc2VjdGlvbnMpIG9yCisgIC8vLyBpZiBpdCBpcyBhdG9taXplZCBiYXNlZCBvbiBpdHMgY29udGVudHMgKE1hY2hPJyBfX1RFWFQsX19jc3RyaW5nIGZvcgorICAvLy8gZXhhbXBsZSkuCisgIHZpcnR1YWwgYm9vbCBpc1NlY3Rpb25BdG9taXphYmxlQnlTeW1ib2xzKGNvbnN0IE1DU2VjdGlvbiAmU2VjdGlvbikgY29uc3Q7CisKKyAgdmlydHVhbCBjb25zdCBNQ0V4cHIgKmdldEV4cHJGb3JQZXJzb25hbGl0eVN5bWJvbChjb25zdCBNQ1N5bWJvbCAqU3ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU3RyZWFtZXIgJlN0cmVhbWVyKSBjb25zdDsKKworICB2aXJ0dWFsIGNvbnN0IE1DRXhwciAqZ2V0RXhwckZvckZERVN5bWJvbChjb25zdCBNQ1N5bWJvbCAqU3ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTdHJlYW1lciAmU3RyZWFtZXIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgaWRlbnRpZmllciBccCBOYW1lIGRvZXMgbm90IG5lZWQgcXVvdGVzIHRvIGJlCisgIC8vLyBzeW50YWN0aWNhbGx5IGNvcnJlY3QuCisgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkVW5xdW90ZWROYW1lKFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIC5zZWN0aW9uIGRpcmVjdGl2ZSBzaG91bGQgYmUgb21pdHRlZCB3aGVuCisgIC8vLyBlbWl0dGluZyBccCBTZWN0aW9uTmFtZS4gIEZvciBleGFtcGxlOgorICAvLy8KKyAgLy8vIHNob3VsZE9taXRTZWN0aW9uRGlyZWN0aXZlKCIudGV4dCIpCisgIC8vLworICAvLy8gcmV0dXJucyBmYWxzZSA9PiAuc2VjdGlvbiAudGV4dCwjYWxsb2MsI2V4ZWNpbnN0cgorICAvLy8gcmV0dXJucyB0cnVlICA9PiAudGV4dAorICB2aXJ0dWFsIGJvb2wgc2hvdWxkT21pdFNlY3Rpb25EaXJlY3RpdmUoU3RyaW5nUmVmIFNlY3Rpb25OYW1lKSBjb25zdDsKKworICBib29sIHVzZXNTdW5TdHlsZUVMRlNlY3Rpb25Td2l0Y2hTeW50YXgoKSBjb25zdCB7CisgICAgcmV0dXJuIFN1blN0eWxlRUxGU2VjdGlvblN3aXRjaFN5bnRheDsKKyAgfQorCisgIGJvb2wgdXNlc0VMRlNlY3Rpb25EaXJlY3RpdmVGb3JCU1MoKSBjb25zdCB7CisgICAgcmV0dXJuIFVzZXNFTEZTZWN0aW9uRGlyZWN0aXZlRm9yQlNTOworICB9CisKKyAgYm9vbCBuZWVkc0R3YXJmU2VjdGlvbk9mZnNldERpcmVjdGl2ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTmVlZHNEd2FyZlNlY3Rpb25PZmZzZXREaXJlY3RpdmU7CisgIH0KKworICAvLyBBY2Nlc3NvcnMuCisKKyAgYm9vbCBoYXNNYWNob1plcm9GaWxsRGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gSGFzTWFjaG9aZXJvRmlsbERpcmVjdGl2ZTsgfQorICBib29sIGhhc01hY2hvVEJTU0RpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIEhhc01hY2hvVEJTU0RpcmVjdGl2ZTsgfQorICB1bnNpZ25lZCBnZXRNYXhJbnN0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gTWF4SW5zdExlbmd0aDsgfQorICB1bnNpZ25lZCBnZXRNaW5JbnN0QWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gTWluSW5zdEFsaWdubWVudDsgfQorICBib29sIGdldERvbGxhcklzUEMoKSBjb25zdCB7IHJldHVybiBEb2xsYXJJc1BDOyB9CisgIGNvbnN0IGNoYXIgKmdldFNlcGFyYXRvclN0cmluZygpIGNvbnN0IHsgcmV0dXJuIFNlcGFyYXRvclN0cmluZzsgfQorCisgIC8vLyBUaGlzIGluZGljYXRlcyB0aGUgY29sdW1uICh6ZXJvLWJhc2VkKSBhdCB3aGljaCBhc20gY29tbWVudHMgc2hvdWxkIGJlCisgIC8vLyBwcmludGVkLgorICB1bnNpZ25lZCBnZXRDb21tZW50Q29sdW1uKCkgY29uc3QgeyByZXR1cm4gNDA7IH0KKworICBTdHJpbmdSZWYgZ2V0Q29tbWVudFN0cmluZygpIGNvbnN0IHsgcmV0dXJuIENvbW1lbnRTdHJpbmc7IH0KKyAgY29uc3QgY2hhciAqZ2V0TGFiZWxTdWZmaXgoKSBjb25zdCB7IHJldHVybiBMYWJlbFN1ZmZpeDsgfQorCisgIGJvb2wgdXNlQXNzaWdubWVudEZvckVIQmVnaW4oKSBjb25zdCB7IHJldHVybiBVc2VBc3NpZ25tZW50Rm9yRUhCZWdpbjsgfQorICBib29sIG5lZWRzTG9jYWxGb3JTaXplKCkgY29uc3QgeyByZXR1cm4gTmVlZHNMb2NhbEZvclNpemU7IH0KKyAgU3RyaW5nUmVmIGdldFByaXZhdGVHbG9iYWxQcmVmaXgoKSBjb25zdCB7IHJldHVybiBQcml2YXRlR2xvYmFsUHJlZml4OyB9CisgIFN0cmluZ1JlZiBnZXRQcml2YXRlTGFiZWxQcmVmaXgoKSBjb25zdCB7IHJldHVybiBQcml2YXRlTGFiZWxQcmVmaXg7IH0KKworICBib29sIGhhc0xpbmtlclByaXZhdGVHbG9iYWxQcmVmaXgoKSBjb25zdCB7CisgICAgcmV0dXJuIExpbmtlclByaXZhdGVHbG9iYWxQcmVmaXhbMF0gIT0gJ1wwJzsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRMaW5rZXJQcml2YXRlR2xvYmFsUHJlZml4KCkgY29uc3QgeworICAgIGlmIChoYXNMaW5rZXJQcml2YXRlR2xvYmFsUHJlZml4KCkpCisgICAgICByZXR1cm4gTGlua2VyUHJpdmF0ZUdsb2JhbFByZWZpeDsKKyAgICByZXR1cm4gZ2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpOworICB9CisKKyAgY29uc3QgY2hhciAqZ2V0SW5saW5lQXNtU3RhcnQoKSBjb25zdCB7IHJldHVybiBJbmxpbmVBc21TdGFydDsgfQorICBjb25zdCBjaGFyICpnZXRJbmxpbmVBc21FbmQoKSBjb25zdCB7IHJldHVybiBJbmxpbmVBc21FbmQ7IH0KKyAgY29uc3QgY2hhciAqZ2V0Q29kZTE2RGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gQ29kZTE2RGlyZWN0aXZlOyB9CisgIGNvbnN0IGNoYXIgKmdldENvZGUzMkRpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIENvZGUzMkRpcmVjdGl2ZTsgfQorICBjb25zdCBjaGFyICpnZXRDb2RlNjREaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBDb2RlNjREaXJlY3RpdmU7IH0KKyAgdW5zaWduZWQgZ2V0QXNzZW1ibGVyRGlhbGVjdCgpIGNvbnN0IHsgcmV0dXJuIEFzc2VtYmxlckRpYWxlY3Q7IH0KKyAgYm9vbCBkb2VzQWxsb3dBdEluTmFtZSgpIGNvbnN0IHsgcmV0dXJuIEFsbG93QXRJbk5hbWU7IH0KKyAgYm9vbCBzdXBwb3J0c05hbWVRdW90aW5nKCkgY29uc3QgeyByZXR1cm4gU3VwcG9ydHNRdW90ZWROYW1lczsgfQorCisgIGJvb2wgZG9lc1N1cHBvcnREYXRhUmVnaW9uRGlyZWN0aXZlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gVXNlRGF0YVJlZ2lvbkRpcmVjdGl2ZXM7CisgIH0KKworICBjb25zdCBjaGFyICpnZXRaZXJvRGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gWmVyb0RpcmVjdGl2ZTsgfQorICBjb25zdCBjaGFyICpnZXRBc2NpaURpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIEFzY2lpRGlyZWN0aXZlOyB9CisgIGNvbnN0IGNoYXIgKmdldEFzY2l6RGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gQXNjaXpEaXJlY3RpdmU7IH0KKyAgYm9vbCBnZXRBbGlnbm1lbnRJc0luQnl0ZXMoKSBjb25zdCB7IHJldHVybiBBbGlnbm1lbnRJc0luQnl0ZXM7IH0KKyAgdW5zaWduZWQgZ2V0VGV4dEFsaWduRmlsbFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVGV4dEFsaWduRmlsbFZhbHVlOyB9CisgIGNvbnN0IGNoYXIgKmdldEdsb2JhbERpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIEdsb2JhbERpcmVjdGl2ZTsgfQorCisgIGJvb2wgZG9lc1NldERpcmVjdGl2ZVN1cHByZXNzUmVsb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIFNldERpcmVjdGl2ZVN1cHByZXNzZXNSZWxvYzsKKyAgfQorCisgIGJvb2wgaGFzQWdncmVzc2l2ZVN5bWJvbEZvbGRpbmcoKSBjb25zdCB7IHJldHVybiBIYXNBZ2dyZXNzaXZlU3ltYm9sRm9sZGluZzsgfQorCisgIGJvb2wgZ2V0Q09NTURpcmVjdGl2ZUFsaWdubWVudElzSW5CeXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ09NTURpcmVjdGl2ZUFsaWdubWVudElzSW5CeXRlczsKKyAgfQorCisgIExDT01NOjpMQ09NTVR5cGUgZ2V0TENPTU1EaXJlY3RpdmVBbGlnbm1lbnRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBMQ09NTURpcmVjdGl2ZUFsaWdubWVudFR5cGU7CisgIH0KKworICBib29sIGhhc0Z1bmN0aW9uQWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gSGFzRnVuY3Rpb25BbGlnbm1lbnQ7IH0KKyAgYm9vbCBoYXNEb3RUeXBlRG90U2l6ZURpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIEhhc0RvdFR5cGVEb3RTaXplRGlyZWN0aXZlOyB9CisgIGJvb2wgaGFzU2luZ2xlUGFyYW1ldGVyRG90RmlsZSgpIGNvbnN0IHsgcmV0dXJuIEhhc1NpbmdsZVBhcmFtZXRlckRvdEZpbGU7IH0KKyAgYm9vbCBoYXNJZGVudERpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIEhhc0lkZW50RGlyZWN0aXZlOyB9CisgIGJvb2wgaGFzTm9EZWFkU3RyaXAoKSBjb25zdCB7IHJldHVybiBIYXNOb0RlYWRTdHJpcDsgfQorICBib29sIGhhc0FsdEVudHJ5KCkgY29uc3QgeyByZXR1cm4gSGFzQWx0RW50cnk7IH0KKyAgY29uc3QgY2hhciAqZ2V0V2Vha0RpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIFdlYWtEaXJlY3RpdmU7IH0KKyAgY29uc3QgY2hhciAqZ2V0V2Vha1JlZkRpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIFdlYWtSZWZEaXJlY3RpdmU7IH0KKyAgYm9vbCBoYXNXZWFrRGVmRGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gSGFzV2Vha0RlZkRpcmVjdGl2ZTsgfQorCisgIGJvb2wgaGFzV2Vha0RlZkNhbkJlSGlkZGVuRGlyZWN0aXZlKCkgY29uc3QgeworICAgIHJldHVybiBIYXNXZWFrRGVmQ2FuQmVIaWRkZW5EaXJlY3RpdmU7CisgIH0KKworICBib29sIGhhc0xpbmtPbmNlRGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gSGFzTGlua09uY2VEaXJlY3RpdmU7IH0KKworICBNQ1N5bWJvbEF0dHIgZ2V0SGlkZGVuVmlzaWJpbGl0eUF0dHIoKSBjb25zdCB7IHJldHVybiBIaWRkZW5WaXNpYmlsaXR5QXR0cjsgfQorCisgIE1DU3ltYm9sQXR0ciBnZXRIaWRkZW5EZWNsYXJhdGlvblZpc2liaWxpdHlBdHRyKCkgY29uc3QgeworICAgIHJldHVybiBIaWRkZW5EZWNsYXJhdGlvblZpc2liaWxpdHlBdHRyOworICB9CisKKyAgTUNTeW1ib2xBdHRyIGdldFByb3RlY3RlZFZpc2liaWxpdHlBdHRyKCkgY29uc3QgeworICAgIHJldHVybiBQcm90ZWN0ZWRWaXNpYmlsaXR5QXR0cjsKKyAgfQorCisgIGJvb2wgZG9lc1N1cHBvcnREZWJ1Z0luZm9ybWF0aW9uKCkgY29uc3QgeyByZXR1cm4gU3VwcG9ydHNEZWJ1Z0luZm9ybWF0aW9uOyB9CisKKyAgYm9vbCBkb2VzU3VwcG9ydEV4Y2VwdGlvbkhhbmRsaW5nKCkgY29uc3QgeworICAgIHJldHVybiBFeGNlcHRpb25zVHlwZSAhPSBFeGNlcHRpb25IYW5kbGluZzo6Tm9uZTsKKyAgfQorCisgIEV4Y2VwdGlvbkhhbmRsaW5nIGdldEV4Y2VwdGlvbkhhbmRsaW5nVHlwZSgpIGNvbnN0IHsgcmV0dXJuIEV4Y2VwdGlvbnNUeXBlOyB9CisgIFdpbkVIOjpFbmNvZGluZ1R5cGUgZ2V0V2luRUhFbmNvZGluZ1R5cGUoKSBjb25zdCB7IHJldHVybiBXaW5FSEVuY29kaW5nVHlwZTsgfQorCisgIHZvaWQgc2V0RXhjZXB0aW9uc1R5cGUoRXhjZXB0aW9uSGFuZGxpbmcgRUgpIHsKKyAgICBFeGNlcHRpb25zVHlwZSA9IEVIOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nIG1ldGhvZCBmb3IgdGhlIHBsYXRmb3JtIHVzZXMgY2FsbAorICAvLy8gZnJhbWUgaW5mb3JtYXRpb24gdG8gdW53aW5kLgorICBib29sIHVzZXNDRklGb3JFSCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKEV4Y2VwdGlvbnNUeXBlID09IEV4Y2VwdGlvbkhhbmRsaW5nOjpEd2FyZkNGSSB8fAorICAgICAgICAgICAgRXhjZXB0aW9uc1R5cGUgPT0gRXhjZXB0aW9uSGFuZGxpbmc6OkFSTSB8fCB1c2VzV2luZG93c0NGSSgpKTsKKyAgfQorCisgIGJvb2wgdXNlc1dpbmRvd3NDRkkoKSBjb25zdCB7CisgICAgcmV0dXJuIEV4Y2VwdGlvbnNUeXBlID09IEV4Y2VwdGlvbkhhbmRsaW5nOjpXaW5FSCAmJgorICAgICAgICAgICAoV2luRUhFbmNvZGluZ1R5cGUgIT0gV2luRUg6OkVuY29kaW5nVHlwZTo6SW52YWxpZCAmJgorICAgICAgICAgICAgV2luRUhFbmNvZGluZ1R5cGUgIT0gV2luRUg6OkVuY29kaW5nVHlwZTo6WDg2KTsKKyAgfQorCisgIGJvb2wgZG9lc0R3YXJmVXNlUmVsb2NhdGlvbnNBY3Jvc3NTZWN0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gRHdhcmZVc2VzUmVsb2NhdGlvbnNBY3Jvc3NTZWN0aW9uczsKKyAgfQorCisgIGJvb2wgZG9Ed2FyZkZERVN5bWJvbHNVc2VBYnNEaWZmKCkgY29uc3QgeyByZXR1cm4gRHdhcmZGREVTeW1ib2xzVXNlQWJzRGlmZjsgfQorICBib29sIHVzZUR3YXJmUmVnTnVtRm9yQ0ZJKCkgY29uc3QgeyByZXR1cm4gRHdhcmZSZWdOdW1Gb3JDRkk7IH0KKyAgYm9vbCB1c2VQYXJlbnNGb3JTeW1ib2xWYXJpYW50KCkgY29uc3QgeyByZXR1cm4gVXNlUGFyZW5zRm9yU3ltYm9sVmFyaWFudDsgfQorCisgIHZvaWQgYWRkSW5pdGlhbEZyYW1lU3RhdGUoY29uc3QgTUNDRklJbnN0cnVjdGlvbiAmSW5zdCkgeworICAgIEluaXRpYWxGcmFtZVN0YXRlLnB1c2hfYmFjayhJbnN0KTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPE1DQ0ZJSW5zdHJ1Y3Rpb24+ICZnZXRJbml0aWFsRnJhbWVTdGF0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5pdGlhbEZyYW1lU3RhdGU7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYXNzZW1ibHkgKGlubGluZSBvciBvdGhlcndpc2UpIHNob3VsZCBiZSBwYXJzZWQuCisgIGJvb2wgdXNlSW50ZWdyYXRlZEFzc2VtYmxlcigpIGNvbnN0IHsgcmV0dXJuIFVzZUludGVncmF0ZWRBc3NlbWJsZXI7IH0KKworICAvLy8gU2V0IHdoZXRoZXIgYXNzZW1ibHkgKGlubGluZSBvciBvdGhlcndpc2UpIHNob3VsZCBiZSBwYXJzZWQuCisgIHZpcnR1YWwgdm9pZCBzZXRVc2VJbnRlZ3JhdGVkQXNzZW1ibGVyKGJvb2wgVmFsdWUpIHsKKyAgICBVc2VJbnRlZ3JhdGVkQXNzZW1ibGVyID0gVmFsdWU7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYXNzZW1ibHkgKGlubGluZSBvciBvdGhlcndpc2UpIHNob3VsZCBiZSBwYXJzZWQuCisgIGJvb2wgcHJlc2VydmVBc21Db21tZW50cygpIGNvbnN0IHsgcmV0dXJuIFByZXNlcnZlQXNtQ29tbWVudHM7IH0KKworICAvLy8gU2V0IHdoZXRoZXIgYXNzZW1ibHkgKGlubGluZSBvciBvdGhlcndpc2UpIHNob3VsZCBiZSBwYXJzZWQuCisgIHZpcnR1YWwgdm9pZCBzZXRQcmVzZXJ2ZUFzbUNvbW1lbnRzKGJvb2wgVmFsdWUpIHsKKyAgICBQcmVzZXJ2ZUFzbUNvbW1lbnRzID0gVmFsdWU7CisgIH0KKworICBEZWJ1Z0NvbXByZXNzaW9uVHlwZSBjb21wcmVzc0RlYnVnU2VjdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIENvbXByZXNzRGVidWdTZWN0aW9uczsKKyAgfQorCisgIHZvaWQgc2V0Q29tcHJlc3NEZWJ1Z1NlY3Rpb25zKERlYnVnQ29tcHJlc3Npb25UeXBlIENvbXByZXNzRGVidWdTZWN0aW9ucykgeworICAgIHRoaXMtPkNvbXByZXNzRGVidWdTZWN0aW9ucyA9IENvbXByZXNzRGVidWdTZWN0aW9uczsKKyAgfQorCisgIGJvb2wgc2hvdWxkVXNlTG9naWNhbFNocigpIGNvbnN0IHsgcmV0dXJuIFVzZUxvZ2ljYWxTaHI7IH0KKworICBib29sIGNhblJlbGF4UmVsb2NhdGlvbnMoKSBjb25zdCB7IHJldHVybiBSZWxheEVMRlJlbG9jYXRpb25zOyB9CisgIHZvaWQgc2V0UmVsYXhFTEZSZWxvY2F0aW9ucyhib29sIFYpIHsgUmVsYXhFTEZSZWxvY2F0aW9ucyA9IFY7IH0KKyAgYm9vbCBoYXNNaXBzRXhwcmVzc2lvbnMoKSBjb25zdCB7IHJldHVybiBIYXNNaXBzRXhwcmVzc2lvbnM7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DQVNNSU5GT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtSW5mb0NPRkYuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc21JbmZvQ09GRi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYzhhZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtSW5mb0NPRkYuaApAQCAtMCwwICsxLDQwIEBACisvLz09PS0gTUNBc21JbmZvQ09GRi5oIC0gQ09GRiBhc20gcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNBU01JTkZPQ09GRl9ICisjZGVmaW5lIExMVk1fTUNfTUNBU01JTkZPQ09GRl9ICisKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DQXNtSW5mb0NPRkYgOiBwdWJsaWMgTUNBc21JbmZvIHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IE1DQXNtSW5mb0NPRkYoKTsKK307CisKK2NsYXNzIE1DQXNtSW5mb01pY3Jvc29mdCA6IHB1YmxpYyBNQ0FzbUluZm9DT0ZGIHsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBNQ0FzbUluZm9NaWNyb3NvZnQoKTsKK307CisKK2NsYXNzIE1DQXNtSW5mb0dOVUNPRkYgOiBwdWJsaWMgTUNBc21JbmZvQ09GRiB7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgTUNBc21JbmZvR05VQ09GRigpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNBU01JTkZPQ09GRl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtSW5mb0Rhcndpbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUluZm9EYXJ3aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTMzZDYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUluZm9EYXJ3aW4uaApAQCAtMCwwICsxLDMxIEBACisvLz09PS0gTUNBc21JbmZvRGFyd2luLmggLSBEYXJ3aW4gYXNtIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRhcmdldCBhc20gcHJvcGVydGllcyByZWxhdGVkIHdoYXQgZm9ybSBhc20gc3RhdGVtZW50cworLy8gc2hvdWxkIHRha2UgaW4gZ2VuZXJhbCBvbiBEYXJ3aW4tYmFzZWQgdGFyZ2V0cworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0FTTUlORk9EQVJXSU5fSAorI2RlZmluZSBMTFZNX01DX01DQVNNSU5GT0RBUldJTl9ICisKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DQXNtSW5mb0RhcndpbiA6IHB1YmxpYyBNQ0FzbUluZm8geworcHVibGljOgorICBleHBsaWNpdCBNQ0FzbUluZm9EYXJ3aW4oKTsKKworICBib29sIGlzU2VjdGlvbkF0b21pemFibGVCeVN5bWJvbHMoY29uc3QgTUNTZWN0aW9uICZTZWN0aW9uKSBjb25zdCBvdmVycmlkZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DQVNNSU5GT0RBUldJTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtSW5mb0VMRi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUluZm9FTEYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTEzYWZjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUluZm9FTEYuaApAQCAtMCwwICsxLDMxIEBACisvLz09PS0gbGx2bS9NQy9NQ0FzbUluZm9FTEYuaCAtIEVMRiBBc20gaW5mbyAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNBU01JTkZPRUxGX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0FTTUlORk9FTEZfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0FzbUluZm9FTEYgOiBwdWJsaWMgTUNBc21JbmZvIHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICBNQ1NlY3Rpb24gKmdldE5vbmV4ZWN1dGFibGVTdGFja1NlY3Rpb24oTUNDb250ZXh0ICZDdHgpIGNvbnN0IGZpbmFsOworCitwcm90ZWN0ZWQ6CisgIC8vLyBUYXJnZXRzIHdoaWNoIGhhdmUgbm9uLWV4ZWN1dGFibGUgc3RhY2tzIGJ5IGRlZmF1bHQgY2FuIHNldCB0aGlzIHRvIGZhbHNlCisgIC8vLyB0byBkaXNhYmxlIHRoZSBzcGVjaWFsIHNlY3Rpb24gd2hpY2ggcmVxdWVzdHMgYSBub24tZXhlY3V0YWJsZSBzdGFjay4KKyAgYm9vbCBVc2VzTm9uZXhlY3V0YWJsZVN0YWNrU2VjdGlvbiA9IHRydWU7CisKKyAgTUNBc21JbmZvRUxGKCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ0FTTUlORk9FTEZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUluZm9XYXNtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtSW5mb1dhc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQ2Y2ZkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUluZm9XYXNtLmgKQEAgLTAsMCArMSwyNCBAQAorLy89PT0tLSBsbHZtL01DL01DQXNtSW5mb1dhc20uaCAtIFdhc20gQXNtIGluZm8gLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DQVNNSU5GT1dBU01fSAorI2RlZmluZSBMTFZNX01DX01DQVNNSU5GT1dBU01fSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbUluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTUNBc21JbmZvV2FzbSA6IHB1YmxpYyBNQ0FzbUluZm8geworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3Byb3RlY3RlZDoKKyAgTUNBc21JbmZvV2FzbSgpOworfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtTGF5b3V0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtTGF5b3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyMGQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc21MYXlvdXQuaApAQCAtMCwwICsxLDEwNyBAQAorLy89PT0tIE1DQXNtTGF5b3V0LmggLSBBc3NlbWJseSBMYXlvdXQgT2JqZWN0IC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DQVNNTEFZT1VUX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0FTTUxBWU9VVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1DQXNzZW1ibGVyOworY2xhc3MgTUNGcmFnbWVudDsKK2NsYXNzIE1DU2VjdGlvbjsKK2NsYXNzIE1DU3ltYm9sOworCisvLy8gRW5jYXBzdWxhdGVzIHRoZSBsYXlvdXQgb2YgYW4gYXNzZW1ibHkgZmlsZSBhdCBhIHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4KKy8vLworLy8vIEFzc2VtYmx5IG1heSByZXF1aXJlIGNvbXB1dGluZyBtdWx0aXBsZSBsYXlvdXRzIGZvciBhIHBhcnRpY3VsYXIgYXNzZW1ibHkKKy8vLyBmaWxlIGFzIHBhcnQgb2YgdGhlIHJlbGF4YXRpb24gcHJvY2Vzcy4gVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlIGxheW91dAorLy8vIGF0IGEgc2luZ2xlIHBvaW50IGluIHRpbWUgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGlzIGFsd2F5cyBwb3NzaWJsZSB0bworLy8vIGVmZmljaWVudGx5IGNvbXB1dGUgdGhlIGV4YWN0IGFkZHJlc3Mgb2YgYW55IHN5bWJvbCBpbiB0aGUgYXNzZW1ibHkgZmlsZSwKKy8vLyBldmVuIGR1cmluZyB0aGUgcmVsYXhhdGlvbiBwcm9jZXNzLgorY2xhc3MgTUNBc21MYXlvdXQgeworICBNQ0Fzc2VtYmxlciAmQXNzZW1ibGVyOworCisgIC8vLyBMaXN0IG9mIHNlY3Rpb25zIGluIGxheW91dCBvcmRlci4KKyAgbGx2bTo6U21hbGxWZWN0b3I8TUNTZWN0aW9uICosIDE2PiBTZWN0aW9uT3JkZXI7CisKKyAgLy8vIFRoZSBsYXN0IGZyYWdtZW50IHdoaWNoIHdhcyBsYWlkIG91dCwgb3IgMCBpZiBub3RoaW5nIGhhcyBiZWVuIGxhaWQKKyAgLy8vIG91dC4gRnJhZ21lbnRzIGFyZSBhbHdheXMgbGFpZCBvdXQgaW4gb3JkZXIsIHNvIGFsbCBmcmFnbWVudHMgd2l0aCBhCisgIC8vLyBsb3dlciBvcmRpbmFsIHdpbGwgYmUgdmFsaWQuCisgIG11dGFibGUgRGVuc2VNYXA8Y29uc3QgTUNTZWN0aW9uICosIE1DRnJhZ21lbnQgKj4gTGFzdFZhbGlkRnJhZ21lbnQ7CisKKyAgLy8vIFxicmllZiBNYWtlIHN1cmUgdGhhdCB0aGUgbGF5b3V0IGZvciB0aGUgZ2l2ZW4gZnJhZ21lbnQgaXMgdmFsaWQsIGxhemlseQorICAvLy8gY29tcHV0aW5nIGl0IGlmIG5lY2Vzc2FyeS4KKyAgdm9pZCBlbnN1cmVWYWxpZChjb25zdCBNQ0ZyYWdtZW50ICpGKSBjb25zdDsKKworICAvLy8gXGJyaWVmIElzIHRoZSBsYXlvdXQgZm9yIHRoaXMgZnJhZ21lbnQgdmFsaWQ/CisgIGJvb2wgaXNGcmFnbWVudFZhbGlkKGNvbnN0IE1DRnJhZ21lbnQgKkYpIGNvbnN0OworCitwdWJsaWM6CisgIE1DQXNtTGF5b3V0KE1DQXNzZW1ibGVyICZBc3NlbWJsZXIpOworCisgIC8vLyBHZXQgdGhlIGFzc2VtYmxlciBvYmplY3QgdGhpcyBpcyBhIGxheW91dCBmb3IuCisgIE1DQXNzZW1ibGVyICZnZXRBc3NlbWJsZXIoKSBjb25zdCB7IHJldHVybiBBc3NlbWJsZXI7IH0KKworICAvLy8gXGJyaWVmIEludmFsaWRhdGUgdGhlIGZyYWdtZW50cyBzdGFydGluZyB3aXRoIEYgYmVjYXVzZSBpdCBoYXMgYmVlbgorICAvLy8gcmVzaXplZC4gVGhlIGZyYWdtZW50J3Mgc2l6ZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gdXBkYXRlZCwgYnV0CisgIC8vLyBpdHMgYnVuZGxlIHBhZGRpbmcgd2lsbCBiZSByZWNvbXB1dGVkLgorICB2b2lkIGludmFsaWRhdGVGcmFnbWVudHNGcm9tKE1DRnJhZ21lbnQgKkYpOworCisgIC8vLyBcYnJpZWYgUGVyZm9ybSBsYXlvdXQgZm9yIGEgc2luZ2xlIGZyYWdtZW50LCBhc3N1bWluZyB0aGF0IHRoZSBwcmV2aW91cworICAvLy8gZnJhZ21lbnQgaGFzIGFscmVhZHkgYmVlbiBsYWlkIG91dCBjb3JyZWN0bHksIGFuZCB0aGUgcGFyZW50IHNlY3Rpb24gaGFzCisgIC8vLyBiZWVuIGluaXRpYWxpemVkLgorICB2b2lkIGxheW91dEZyYWdtZW50KE1DRnJhZ21lbnQgKkZyYWdtZW50KTsKKworICAvLy8gXG5hbWUgU2VjdGlvbiBBY2Nlc3MgKGluIGxheW91dCBvcmRlcikKKyAgLy8vIEB7CisKKyAgbGx2bTo6U21hbGxWZWN0b3JJbXBsPE1DU2VjdGlvbiAqPiAmZ2V0U2VjdGlvbk9yZGVyKCkgeyByZXR1cm4gU2VjdGlvbk9yZGVyOyB9CisgIGNvbnN0IGxsdm06OlNtYWxsVmVjdG9ySW1wbDxNQ1NlY3Rpb24gKj4gJmdldFNlY3Rpb25PcmRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gU2VjdGlvbk9yZGVyOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBGcmFnbWVudCBMYXlvdXQgRGF0YQorICAvLy8gQHsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgb2Zmc2V0IG9mIHRoZSBnaXZlbiBmcmFnbWVudCBpbnNpZGUgaXRzIGNvbnRhaW5pbmcgc2VjdGlvbi4KKyAgdWludDY0X3QgZ2V0RnJhZ21lbnRPZmZzZXQoY29uc3QgTUNGcmFnbWVudCAqRikgY29uc3Q7CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBVdGlsaXR5IEZ1bmN0aW9ucworICAvLy8gQHsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgYWRkcmVzcyBzcGFjZSBzaXplIG9mIHRoZSBnaXZlbiBzZWN0aW9uLCBhcyBpdCBlZmZlY3RzCisgIC8vLyBsYXlvdXQuIFRoaXMgbWF5IGRpZmZlciBmcm9tIHRoZSBzaXplIHJlcG9ydGVkIGJ5IFxzZWUgZ2V0U2VjdGlvblNpemUoKSBieQorICAvLy8gbm90IGluY2x1ZGluZyBzZWN0aW9uIHRhaWwgcGFkZGluZy4KKyAgdWludDY0X3QgZ2V0U2VjdGlvbkFkZHJlc3NTaXplKGNvbnN0IE1DU2VjdGlvbiAqU2VjKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgZGF0YSBzaXplIG9mIHRoZSBnaXZlbiBzZWN0aW9uLCBhcyBlbWl0dGVkIHRvIHRoZSBvYmplY3QKKyAgLy8vIGZpbGUuIFRoaXMgbWF5IGluY2x1ZGUgYWRkaXRpb25hbCBwYWRkaW5nLCBvciBiZSAwIGZvciB2aXJ0dWFsIHNlY3Rpb25zLgorICB1aW50NjRfdCBnZXRTZWN0aW9uRmlsZVNpemUoY29uc3QgTUNTZWN0aW9uICpTZWMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBvZmZzZXQgb2YgdGhlIGdpdmVuIHN5bWJvbCwgYXMgY29tcHV0ZWQgaW4gdGhlIGN1cnJlbnQKKyAgLy8vIGxheW91dC4KKyAgLy8vIFxyZXR1cm4gVHJ1ZSBvbiBzdWNjZXNzLgorICBib29sIGdldFN5bWJvbE9mZnNldChjb25zdCBNQ1N5bWJvbCAmUywgdWludDY0X3QgJlZhbCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBWYXJpYW50IHRoYXQgcmVwb3J0cyBhIGZhdGFsIGVycm9yIGlmIHRoZSBvZmZzZXQgaXMgbm90IGNvbXB1dGFibGUuCisgIHVpbnQ2NF90IGdldFN5bWJvbE9mZnNldChjb25zdCBNQ1N5bWJvbCAmUykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJZiB0aGlzIHN5bWJvbCBpcyBlcXVpdmFsZW50IHRvIEEgKyBDb25zdGFudCwgcmV0dXJuIEEuCisgIGNvbnN0IE1DU3ltYm9sICpnZXRCYXNlU3ltYm9sKGNvbnN0IE1DU3ltYm9sICZTeW1ib2wpIGNvbnN0OworCisgIC8vLyBAfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtTWFjcm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc21NYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YjMyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtTWFjcm8uaApAQCAtMCwwICsxLDE1OCBAQAorLy89PT0tIE1DQXNtTWFjcm8uaCAtIEFzc2VtYmx5IE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DQVNNTUFDUk9fSAorI2RlZmluZSBMTFZNX01DX01DQVNNTUFDUk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU01Mb2MuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFRhcmdldCBpbmRlcGVuZGVudCByZXByZXNlbnRhdGlvbiBmb3IgYW4gYXNzZW1ibGVyIHRva2VuLgorY2xhc3MgQXNtVG9rZW4geworcHVibGljOgorICBlbnVtIFRva2VuS2luZCB7CisgICAgLy8gTWFya2VycworICAgIEVvZiwgRXJyb3IsCisKKyAgICAvLyBTdHJpbmcgdmFsdWVzLgorICAgIElkZW50aWZpZXIsCisgICAgU3RyaW5nLAorCisgICAgLy8gSW50ZWdlciB2YWx1ZXMuCisgICAgSW50ZWdlciwKKyAgICBCaWdOdW0sIC8vIGxhcmdlciB0aGFuIDY0IGJpdHMKKworICAgIC8vIFJlYWwgdmFsdWVzLgorICAgIFJlYWwsCisKKyAgICAvLyBDb21tZW50cworICAgIENvbW1lbnQsCisgICAgSGFzaERpcmVjdGl2ZSwKKyAgICAvLyBOby12YWx1ZS4KKyAgICBFbmRPZlN0YXRlbWVudCwKKyAgICBDb2xvbiwKKyAgICBTcGFjZSwKKyAgICBQbHVzLCBNaW51cywgVGlsZGUsCisgICAgU2xhc2gsICAgICAvLyAnLycKKyAgICBCYWNrU2xhc2gsIC8vICdcJworICAgIExQYXJlbiwgUlBhcmVuLCBMQnJhYywgUkJyYWMsIExDdXJseSwgUkN1cmx5LAorICAgIFN0YXIsIERvdCwgQ29tbWEsIERvbGxhciwgRXF1YWwsIEVxdWFsRXF1YWwsCisKKyAgICBQaXBlLCBQaXBlUGlwZSwgQ2FyZXQsCisgICAgQW1wLCBBbXBBbXAsIEV4Y2xhaW0sIEV4Y2xhaW1FcXVhbCwgUGVyY2VudCwgSGFzaCwKKyAgICBMZXNzLCBMZXNzRXF1YWwsIExlc3NMZXNzLCBMZXNzR3JlYXRlciwKKyAgICBHcmVhdGVyLCBHcmVhdGVyRXF1YWwsIEdyZWF0ZXJHcmVhdGVyLCBBdCwKKworICAgIC8vIE1JUFMgdW5hcnkgZXhwcmVzc2lvbiBvcGVyYXRvcnMgc3VjaCBhcyAlbmVnLgorICAgIFBlcmNlbnRDYWxsMTYsIFBlcmNlbnRDYWxsX0hpLCBQZXJjZW50Q2FsbF9MbywgUGVyY2VudER0cHJlbF9IaSwKKyAgICBQZXJjZW50RHRwcmVsX0xvLCBQZXJjZW50R290LCBQZXJjZW50R290X0Rpc3AsIFBlcmNlbnRHb3RfSGksIFBlcmNlbnRHb3RfTG8sCisgICAgUGVyY2VudEdvdF9PZnN0LCBQZXJjZW50R290X1BhZ2UsIFBlcmNlbnRHb3R0cHJlbCwgUGVyY2VudEdwX1JlbCwgUGVyY2VudEhpLAorICAgIFBlcmNlbnRIaWdoZXIsIFBlcmNlbnRIaWdoZXN0LCBQZXJjZW50TG8sIFBlcmNlbnROZWcsIFBlcmNlbnRQY3JlbF9IaSwKKyAgICBQZXJjZW50UGNyZWxfTG8sIFBlcmNlbnRUbHNnZCwgUGVyY2VudFRsc2xkbSwgUGVyY2VudFRwcmVsX0hpLAorICAgIFBlcmNlbnRUcHJlbF9MbworICB9OworCitwcml2YXRlOgorICBUb2tlbktpbmQgS2luZDsKKworICAvLy8gQSByZWZlcmVuY2UgdG8gdGhlIGVudGlyZSB0b2tlbiBjb250ZW50czsgdGhpcyBpcyBhbHdheXMgYSBwb2ludGVyIGludG8KKyAgLy8vIGEgbWVtb3J5IGJ1ZmZlciBvd25lZCBieSB0aGUgc291cmNlIG1hbmFnZXIuCisgIFN0cmluZ1JlZiBTdHI7CisKKyAgQVBJbnQgSW50VmFsOworCitwdWJsaWM6CisgIEFzbVRva2VuKCkgPSBkZWZhdWx0OworICBBc21Ub2tlbihUb2tlbktpbmQgS2luZCwgU3RyaW5nUmVmIFN0ciwgQVBJbnQgSW50VmFsKQorICAgICAgOiBLaW5kKEtpbmQpLCBTdHIoU3RyKSwgSW50VmFsKHN0ZDo6bW92ZShJbnRWYWwpKSB7fQorICBBc21Ub2tlbihUb2tlbktpbmQgS2luZCwgU3RyaW5nUmVmIFN0ciwgaW50NjRfdCBJbnRWYWwgPSAwKQorICAgICAgOiBLaW5kKEtpbmQpLCBTdHIoU3RyKSwgSW50VmFsKDY0LCBJbnRWYWwsIHRydWUpIHt9CisKKyAgVG9rZW5LaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisgIGJvb2wgaXMoVG9rZW5LaW5kIEspIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gSzsgfQorICBib29sIGlzTm90KFRva2VuS2luZCBLKSBjb25zdCB7IHJldHVybiBLaW5kICE9IEs7IH0KKworICBTTUxvYyBnZXRMb2MoKSBjb25zdDsKKyAgU01Mb2MgZ2V0RW5kTG9jKCkgY29uc3Q7CisgIFNNUmFuZ2UgZ2V0TG9jUmFuZ2UoKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBjb250ZW50cyBvZiBhIHN0cmluZyB0b2tlbiAod2l0aG91dCBxdW90ZXMpLgorICBTdHJpbmdSZWYgZ2V0U3RyaW5nQ29udGVudHMoKSBjb25zdCB7CisgICAgYXNzZXJ0KEtpbmQgPT0gU3RyaW5nICYmICJUaGlzIHRva2VuIGlzbid0IGEgc3RyaW5nISIpOworICAgIHJldHVybiBTdHIuc2xpY2UoMSwgU3RyLnNpemUoKSAtIDEpOworICB9CisKKyAgLy8vIEdldCB0aGUgaWRlbnRpZmllciBzdHJpbmcgZm9yIHRoZSBjdXJyZW50IHRva2VuLCB3aGljaCBzaG91bGQgYmUgYW4KKyAgLy8vIGlkZW50aWZpZXIgb3IgYSBzdHJpbmcuIFRoaXMgZ2V0cyB0aGUgcG9ydGlvbiBvZiB0aGUgc3RyaW5nIHdoaWNoIHNob3VsZAorICAvLy8gYmUgdXNlZCBhcyB0aGUgaWRlbnRpZmllciwgZS5nLiwgaXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgcXVvdGVzIG9uCisgIC8vLyBzdHJpbmdzLgorICBTdHJpbmdSZWYgZ2V0SWRlbnRpZmllcigpIGNvbnN0IHsKKyAgICBpZiAoS2luZCA9PSBJZGVudGlmaWVyKQorICAgICAgcmV0dXJuIGdldFN0cmluZygpOworICAgIHJldHVybiBnZXRTdHJpbmdDb250ZW50cygpOworICB9CisKKyAgLy8vIEdldCB0aGUgc3RyaW5nIGZvciB0aGUgY3VycmVudCB0b2tlbiwgdGhpcyBpbmNsdWRlcyBhbGwgY2hhcmFjdGVycyAoZm9yCisgIC8vLyBleGFtcGxlLCB0aGUgcXVvdGVzIG9uIHN0cmluZ3MpIGluIHRoZSB0b2tlbi4KKyAgLy8vCisgIC8vLyBUaGUgcmV0dXJuZWQgU3RyaW5nUmVmIHBvaW50cyBpbnRvIHRoZSBzb3VyY2UgbWFuYWdlcidzIG1lbW9yeSBidWZmZXIsIGFuZAorICAvLy8gaXMgc2FmZSB0byBzdG9yZSBhY3Jvc3MgY2FsbHMgdG8gTGV4KCkuCisgIFN0cmluZ1JlZiBnZXRTdHJpbmcoKSBjb25zdCB7IHJldHVybiBTdHI7IH0KKworICAvLyBGSVhNRTogRG9uJ3QgY29tcHV0ZSB0aGlzIGluIGFkdmFuY2UsIGl0IG1ha2VzIGV2ZXJ5IHRva2VuIGxhcmdlciwgYW5kIGlzCisgIC8vIGFsc28gbm90IGdlbmVyYWxseSB3aGF0IHdlIHdhbnQgKGl0IGlzIG5pY2VyIGZvciByZWNvdmVyeSBldGMuIHRvIGxleCAxMjNicgorICAvLyBhcyBhIHNpbmdsZSB0b2tlbiwgdGhlbiBkaWFnbm9zZSBhcyBhbiBpbnZhbGlkIG51bWJlcikuCisgIGludDY0X3QgZ2V0SW50VmFsKCkgY29uc3QgeworICAgIGFzc2VydChLaW5kID09IEludGVnZXIgJiYgIlRoaXMgdG9rZW4gaXNuJ3QgYW4gaW50ZWdlciEiKTsKKyAgICByZXR1cm4gSW50VmFsLmdldFpFeHRWYWx1ZSgpOworICB9CisKKyAgQVBJbnQgZ2V0QVBJbnRWYWwoKSBjb25zdCB7CisgICAgYXNzZXJ0KChLaW5kID09IEludGVnZXIgfHwgS2luZCA9PSBCaWdOdW0pICYmCisgICAgICAgICAgICJUaGlzIHRva2VuIGlzbid0IGFuIGludGVnZXIhIik7CisgICAgcmV0dXJuIEludFZhbDsKKyAgfQorCisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdCB7IGR1bXAoZGJncygpKTsgfQorfTsKKworc3RydWN0IE1DQXNtTWFjcm9QYXJhbWV0ZXIgeworICBTdHJpbmdSZWYgTmFtZTsKKyAgc3RkOjp2ZWN0b3I8QXNtVG9rZW4+IFZhbHVlOworICBib29sIFJlcXVpcmVkID0gZmFsc2U7CisgIGJvb2wgVmFyYXJnID0gZmFsc2U7CisKKyAgTUNBc21NYWNyb1BhcmFtZXRlcigpID0gZGVmYXVsdDsKKworICB2b2lkIGR1bXAoKSBjb25zdCB7IGR1bXAoZGJncygpKTsgfQorICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKK307CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8TUNBc21NYWNyb1BhcmFtZXRlcj4gTUNBc21NYWNyb1BhcmFtZXRlcnM7CitzdHJ1Y3QgTUNBc21NYWNybyB7CisgIFN0cmluZ1JlZiBOYW1lOworICBTdHJpbmdSZWYgQm9keTsKKyAgTUNBc21NYWNyb1BhcmFtZXRlcnMgUGFyYW1ldGVyczsKKworcHVibGljOgorICBNQ0FzbU1hY3JvKFN0cmluZ1JlZiBOLCBTdHJpbmdSZWYgQiwgTUNBc21NYWNyb1BhcmFtZXRlcnMgUCkKKyAgICAgIDogTmFtZShOKSwgQm9keShCKSwgUGFyYW1ldGVycyhzdGQ6Om1vdmUoUCkpIHt9CisKKyAgdm9pZCBkdW1wKCkgY29uc3QgeyBkdW1wKGRiZ3MoKSk7IH0KKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3Q7Cit9OworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc3NlbWJsZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc3NlbWJsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTFiMDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0Fzc2VtYmxlci5oCkBAIC0wLDAgKzEsNDQ1IEBACisvLz09PS0gTUNBc3NlbWJsZXIuaCAtIE9iamVjdCBGaWxlIEdlbmVyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNBU1NFTUJMRVJfSAorI2RlZmluZSBMTFZNX01DX01DQVNTRU1CTEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvTWFjaE8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRGlyZWN0aXZlcy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNEd2FyZi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNGaXh1cC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNGcmFnbWVudC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNMaW5rZXJPcHRpbWl6YXRpb25IaW50LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0FzbUJhY2tlbmQ7CitjbGFzcyBNQ0FzbUxheW91dDsKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DQ29kZUVtaXR0ZXI7CitjbGFzcyBNQ0ZyYWdtZW50OworY2xhc3MgTUNPYmplY3RXcml0ZXI7CitjbGFzcyBNQ1NlY3Rpb247CitjbGFzcyBNQ1ZhbHVlOworCisvLyBGSVhNRTogVGhpcyByZWFsbHkgZG9lc24ndCBiZWxvbmcgaGVyZS4gU2VlIGNvbW1lbnRzIGJlbG93Lgorc3RydWN0IEluZGlyZWN0U3ltYm9sRGF0YSB7CisgIE1DU3ltYm9sICpTeW1ib2w7CisgIE1DU2VjdGlvbiAqU2VjdGlvbjsKK307CisKKy8vIEZJWE1FOiBEaXR0byB0aGlzLiBQdXJlbHkgc28gdGhlIFN0cmVhbWVyIGFuZCB0aGUgT2JqZWN0V3JpdGVyIGNhbiB0YWxrCisvLyB0byBvbmUgYW5vdGhlci4KK3N0cnVjdCBEYXRhUmVnaW9uRGF0YSB7CisgIC8vIFRoaXMgZW51bSBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHcvIHRoZSBtYWNoLW8gZGVmaW5pdGlvbiBpbgorICAvLyBsbHZtL09iamVjdC9NYWNoT0Zvcm1hdC5oLgorICBlbnVtIEtpbmRUeSB7IERhdGEgPSAxLCBKdW1wVGFibGU4LCBKdW1wVGFibGUxNiwgSnVtcFRhYmxlMzIgfSBLaW5kOworICBNQ1N5bWJvbCAqU3RhcnQ7CisgIE1DU3ltYm9sICpFbmQ7Cit9OworCitjbGFzcyBNQ0Fzc2VtYmxlciB7CisgIGZyaWVuZCBjbGFzcyBNQ0FzbUxheW91dDsKKworcHVibGljOgorICB1c2luZyBTZWN0aW9uTGlzdFR5cGUgPSBzdGQ6OnZlY3RvcjxNQ1NlY3Rpb24gKj47CisgIHVzaW5nIFN5bWJvbERhdGFMaXN0VHlwZSA9IHN0ZDo6dmVjdG9yPGNvbnN0IE1DU3ltYm9sICo+OworCisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gcG9pbnRlZV9pdGVyYXRvcjxTZWN0aW9uTGlzdFR5cGU6OmNvbnN0X2l0ZXJhdG9yPjsKKyAgdXNpbmcgaXRlcmF0b3IgPSBwb2ludGVlX2l0ZXJhdG9yPFNlY3Rpb25MaXN0VHlwZTo6aXRlcmF0b3I+OworCisgIHVzaW5nIGNvbnN0X3N5bWJvbF9pdGVyYXRvciA9CisgICAgICBwb2ludGVlX2l0ZXJhdG9yPFN5bWJvbERhdGFMaXN0VHlwZTo6Y29uc3RfaXRlcmF0b3I+OworICB1c2luZyBzeW1ib2xfaXRlcmF0b3IgPSBwb2ludGVlX2l0ZXJhdG9yPFN5bWJvbERhdGFMaXN0VHlwZTo6aXRlcmF0b3I+OworCisgIHVzaW5nIHN5bWJvbF9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPHN5bWJvbF9pdGVyYXRvcj47CisgIHVzaW5nIGNvbnN0X3N5bWJvbF9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPGNvbnN0X3N5bWJvbF9pdGVyYXRvcj47CisKKyAgdXNpbmcgY29uc3RfaW5kaXJlY3Rfc3ltYm9sX2l0ZXJhdG9yID0KKyAgICAgIHN0ZDo6dmVjdG9yPEluZGlyZWN0U3ltYm9sRGF0YT46OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBpbmRpcmVjdF9zeW1ib2xfaXRlcmF0b3IgPSBzdGQ6OnZlY3RvcjxJbmRpcmVjdFN5bWJvbERhdGE+OjppdGVyYXRvcjsKKworICB1c2luZyBjb25zdF9kYXRhX3JlZ2lvbl9pdGVyYXRvciA9CisgICAgICBzdGQ6OnZlY3RvcjxEYXRhUmVnaW9uRGF0YT46OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBkYXRhX3JlZ2lvbl9pdGVyYXRvciA9IHN0ZDo6dmVjdG9yPERhdGFSZWdpb25EYXRhPjo6aXRlcmF0b3I7CisKKyAgLy8vIE1hY2hPIHNwZWNpZmljIGRlcGxveW1lbnQgdGFyZ2V0IHZlcnNpb24gaW5mby4KKyAgLy8gQSBNYWpvciB2ZXJzaW9uIG9mIDAgaW5kaWNhdGVzIHRoYXQgbm8gdmVyc2lvbiBpbmZvcm1hdGlvbiB3YXMgc3VwcGxpZWQKKyAgLy8gYW5kIHNvIHRoZSBjb3JyZXNwb25kaW5nIGxvYWQgY29tbWFuZCBzaG91bGQgbm90IGJlIGVtaXR0ZWQuCisgIHVzaW5nIFZlcnNpb25JbmZvVHlwZSA9IHN0cnVjdCB7CisgICAgYm9vbCBFbWl0QnVpbGRWZXJzaW9uOworICAgIHVuaW9uIHsKKyAgICAgIE1DVmVyc2lvbk1pblR5cGUgVHlwZTsgICAgICAgICAgLy8vPCBVc2VkIHdoZW4gRW1pdEJ1aWxkVmVyc2lvbj09ZmFsc2UuCisgICAgICBNYWNoTzo6UGxhdGZvcm1UeXBlIFBsYXRmb3JtOyAgIC8vLzwgVXNlZCB3aGVuIEVtaXRCdWlsZFZlcnNpb249PXRydWUuCisgICAgfSBUeXBlT3JQbGF0Zm9ybTsKKyAgICB1bnNpZ25lZCBNYWpvcjsKKyAgICB1bnNpZ25lZCBNaW5vcjsKKyAgICB1bnNpZ25lZCBVcGRhdGU7CisgIH07CisKK3ByaXZhdGU6CisgIE1DQ29udGV4dCAmQ29udGV4dDsKKworICBNQ0FzbUJhY2tlbmQgJkJhY2tlbmQ7CisKKyAgTUNDb2RlRW1pdHRlciAmRW1pdHRlcjsKKworICBNQ09iamVjdFdyaXRlciAmV3JpdGVyOworCisgIFNlY3Rpb25MaXN0VHlwZSBTZWN0aW9uczsKKworICBTeW1ib2xEYXRhTGlzdFR5cGUgU3ltYm9sczsKKworICBzdGQ6OnZlY3RvcjxJbmRpcmVjdFN5bWJvbERhdGE+IEluZGlyZWN0U3ltYm9sczsKKworICBzdGQ6OnZlY3RvcjxEYXRhUmVnaW9uRGF0YT4gRGF0YVJlZ2lvbnM7CisKKyAgLy8vIFRoZSBsaXN0IG9mIGxpbmtlciBvcHRpb25zIHRvIHByb3BhZ2F0ZSBpbnRvIHRoZSBvYmplY3QgZmlsZS4KKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiBMaW5rZXJPcHRpb25zOworCisgIC8vLyBMaXN0IG9mIGRlY2xhcmVkIGZpbGUgbmFtZXMKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEZpbGVOYW1lczsKKworICBNQ0R3YXJmTGluZVRhYmxlUGFyYW1zIExUUGFyYW1zOworCisgIC8vLyBUaGUgc2V0IG9mIGZ1bmN0aW9uIHN5bWJvbHMgZm9yIHdoaWNoIGEgLnRodW1iX2Z1bmMgZGlyZWN0aXZlIGhhcworICAvLy8gYmVlbiBzZWVuLgorICAvLworICAvLyBGSVhNRTogV2UgcmVhbGx5IHdvdWxkIGxpa2UgdGhpcyBpbiB0YXJnZXQgc3BlY2lmaWMgY29kZSByYXRoZXIgdGhhbgorICAvLyBoZXJlLiBNYXliZSB3aGVuIHRoZSByZWxvY2F0aW9uIHN0dWZmIG1vdmVzIHRvIHRhcmdldCBzcGVjaWZpYywKKyAgLy8gdGhpcyBjYW4gZ28gd2l0aCBpdD8gVGhlIHN0cmVhbWVyIHdvdWxkIG5lZWQgc29tZSB0YXJnZXQgc3BlY2lmaWMKKyAgLy8gcmVmYWN0b3JpbmcgdG9vLgorICBtdXRhYmxlIFNtYWxsUHRyU2V0PGNvbnN0IE1DU3ltYm9sICosIDMyPiBUaHVtYkZ1bmNzOworCisgIC8vLyBcYnJpZWYgVGhlIGJ1bmRsZSBhbGlnbm1lbnQgc2l6ZSBjdXJyZW50bHkgc2V0IGluIHRoZSBhc3NlbWJsZXIuCisgIC8vLworICAvLy8gQnkgZGVmYXVsdCBpdCdzIDAsIHdoaWNoIG1lYW5zIGJ1bmRsaW5nIGlzIGRpc2FibGVkLgorICB1bnNpZ25lZCBCdW5kbGVBbGlnblNpemU7CisKKyAgYm9vbCBSZWxheEFsbCA6IDE7CisgIGJvb2wgU3Vic2VjdGlvbnNWaWFTeW1ib2xzIDogMTsKKyAgYm9vbCBJbmNyZW1lbnRhbExpbmtlckNvbXBhdGlibGUgOiAxOworCisgIC8vLyBFTEYgc3BlY2lmaWMgZV9oZWFkZXIgZmxhZ3MKKyAgLy8gSXQgd291bGQgYmUgZ29vZCBpZiB0aGVyZSB3ZXJlIGFuIE1DRUxGQXNzZW1ibGVyIGNsYXNzIHRvIGhvbGQgdGhpcy4KKyAgLy8gRUxGIGhlYWRlciBmbGFncyBhcmUgdXNlZCBib3RoIGJ5IHRoZSBpbnRlZ3JhdGVkIGFuZCBzdGFuZGFsb25lIGFzc2VtYmxlcnMuCisgIC8vIEFjY2VzcyB0byB0aGUgZmxhZ3MgaXMgbmVjZXNzYXJ5IGluIGNhc2VzIHdoZXJlIGFzc2VtYmxlciBkaXJlY3RpdmVzIGFmZmVjdAorICAvLyB3aGljaCBmbGFncyB0byBiZSBzZXQuCisgIHVuc2lnbmVkIEVMRkhlYWRlckVGbGFnczsKKworICAvLy8gVXNlZCB0byBjb21tdW5pY2F0ZSBMaW5rZXIgT3B0aW1pemF0aW9uIEhpbnQgaW5mb3JtYXRpb24gYmV0d2VlbgorICAvLy8gdGhlIFN0cmVhbWVyIGFuZCB0aGUgLm8gd3JpdGVyCisgIE1DTE9IQ29udGFpbmVyIExPSENvbnRhaW5lcjsKKworICBWZXJzaW9uSW5mb1R5cGUgVmVyc2lvbkluZm87CisKKyAgLy8vIEV2YWx1YXRlIGEgZml4dXAgdG8gYSByZWxvY2F0YWJsZSBleHByZXNzaW9uIGFuZCB0aGUgdmFsdWUgd2hpY2ggc2hvdWxkIGJlCisgIC8vLyBwbGFjZWQgaW50byB0aGUgZml4dXAuCisgIC8vLworICAvLy8gXHBhcmFtIExheW91dCBUaGUgbGF5b3V0IHRvIHVzZSBmb3IgZXZhbHVhdGlvbi4KKyAgLy8vIFxwYXJhbSBGaXh1cCBUaGUgZml4dXAgdG8gZXZhbHVhdGUuCisgIC8vLyBccGFyYW0gREYgVGhlIGZyYWdtZW50IHRoZSBmaXh1cCBpcyBpbnNpZGUuCisgIC8vLyBccGFyYW0gVGFyZ2V0IFtvdXRdIE9uIHJldHVybiwgdGhlIHJlbG9jYXRhYmxlIGV4cHJlc3Npb24gdGhlIGZpeHVwCisgIC8vLyBldmFsdWF0ZXMgdG8uCisgIC8vLyBccGFyYW0gVmFsdWUgW291dF0gT24gcmV0dXJuLCB0aGUgdmFsdWUgb2YgdGhlIGZpeHVwIGFzIGN1cnJlbnRseSBsYWlkCisgIC8vLyBvdXQuCisgIC8vLyBccmV0dXJuIFdoZXRoZXIgdGhlIGZpeHVwIHZhbHVlIHdhcyBmdWxseSByZXNvbHZlZC4gVGhpcyBpcyB0cnVlIGlmIHRoZQorICAvLy8gXHAgVmFsdWUgcmVzdWx0IGlzIGZpeGVkLCBvdGhlcndpc2UgdGhlIHZhbHVlIG1heSBjaGFuZ2UgZHVlIHRvCisgIC8vLyByZWxvY2F0aW9uLgorICBib29sIGV2YWx1YXRlRml4dXAoY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCwgY29uc3QgTUNGaXh1cCAmRml4dXAsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZyYWdtZW50ICpERiwgTUNWYWx1ZSAmVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgJlZhbHVlKSBjb25zdDsKKworICAvLy8gQ2hlY2sgd2hldGhlciBhIGZpeHVwIGNhbiBiZSBzYXRpc2ZpZWQsIG9yIHdoZXRoZXIgaXQgbmVlZHMgdG8gYmUgcmVsYXhlZAorICAvLy8gKGluY3JlYXNlZCBpbiBzaXplLCBpbiBvcmRlciB0byBob2xkIGl0cyB2YWx1ZSBjb3JyZWN0bHkpLgorICBib29sIGZpeHVwTmVlZHNSZWxheGF0aW9uKGNvbnN0IE1DRml4dXAgJkZpeHVwLCBjb25zdCBNQ1JlbGF4YWJsZUZyYWdtZW50ICpERiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdDsKKworICAvLy8gQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gZnJhZ21lbnQgbmVlZHMgcmVsYXhhdGlvbi4KKyAgYm9vbCBmcmFnbWVudE5lZWRzUmVsYXhhdGlvbihjb25zdCBNQ1JlbGF4YWJsZUZyYWdtZW50ICpJRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFBlcmZvcm0gb25lIGxheW91dCBpdGVyYXRpb24gYW5kIHJldHVybiB0cnVlIGlmIGFueSBvZmZzZXRzCisgIC8vLyB3ZXJlIGFkanVzdGVkLgorICBib29sIGxheW91dE9uY2UoTUNBc21MYXlvdXQgJkxheW91dCk7CisKKyAgLy8vIFxicmllZiBQZXJmb3JtIG9uZSBsYXlvdXQgaXRlcmF0aW9uIG9mIHRoZSBnaXZlbiBzZWN0aW9uIGFuZCByZXR1cm4gdHJ1ZQorICAvLy8gaWYgYW55IG9mZnNldHMgd2VyZSBhZGp1c3RlZC4KKyAgYm9vbCBsYXlvdXRTZWN0aW9uT25jZShNQ0FzbUxheW91dCAmTGF5b3V0LCBNQ1NlY3Rpb24gJlNlYyk7CisKKyAgYm9vbCByZWxheEluc3RydWN0aW9uKE1DQXNtTGF5b3V0ICZMYXlvdXQsIE1DUmVsYXhhYmxlRnJhZ21lbnQgJklGKTsKKworICBib29sIHJlbGF4UGFkZGluZ0ZyYWdtZW50KE1DQXNtTGF5b3V0ICZMYXlvdXQsIE1DUGFkZGluZ0ZyYWdtZW50ICZQRik7CisKKyAgYm9vbCByZWxheExFQihNQ0FzbUxheW91dCAmTGF5b3V0LCBNQ0xFQkZyYWdtZW50ICZJRik7CisKKyAgYm9vbCByZWxheER3YXJmTGluZUFkZHIoTUNBc21MYXlvdXQgJkxheW91dCwgTUNEd2FyZkxpbmVBZGRyRnJhZ21lbnQgJkRGKTsKKyAgYm9vbCByZWxheER3YXJmQ2FsbEZyYW1lRnJhZ21lbnQoTUNBc21MYXlvdXQgJkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNEd2FyZkNhbGxGcmFtZUZyYWdtZW50ICZERik7CisgIGJvb2wgcmVsYXhDVklubGluZUxpbmVUYWJsZShNQ0FzbUxheW91dCAmTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDVklubGluZUxpbmVUYWJsZUZyYWdtZW50ICZERik7CisgIGJvb2wgcmVsYXhDVkRlZlJhbmdlKE1DQXNtTGF5b3V0ICZMYXlvdXQsIE1DQ1ZEZWZSYW5nZUZyYWdtZW50ICZERik7CisKKyAgLy8vIGZpbmlzaExheW91dCAtIEZpbmFsaXplIGEgbGF5b3V0LCBpbmNsdWRpbmcgZnJhZ21lbnQgbG93ZXJpbmcuCisgIHZvaWQgZmluaXNoTGF5b3V0KE1DQXNtTGF5b3V0ICZMYXlvdXQpOworCisgIHN0ZDo6dHVwbGU8TUNWYWx1ZSwgdWludDY0X3QsIGJvb2w+CisgIGhhbmRsZUZpeHVwKGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQsIE1DRnJhZ21lbnQgJkYsIGNvbnN0IE1DRml4dXAgJkZpeHVwKTsKKworcHVibGljOgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8U3RyaW5nUmVmLCBjb25zdCBNQ1N5bWJvbCAqPj4gU3ltdmVyczsKKworICAvLy8gQ29uc3RydWN0IGEgbmV3IGFzc2VtYmxlciBpbnN0YW5jZS4KKyAgLy8KKyAgLy8gRklYTUU6IEhvdyBhcmUgd2UgZ29pbmcgdG8gcGFyYW1ldGVyaXplIHRoaXM/IFR3byBvYnZpb3VzIG9wdGlvbnMgYXJlIHN0YXkKKyAgLy8gY29uY3JldGUgYW5kIHJlcXVpcmUgY2xpZW50cyB0byBwYXNzIGluIGEgdGFyZ2V0IGxpa2Ugb2JqZWN0LiBUaGUgb3RoZXIKKyAgLy8gb3B0aW9uIGlzIHRvIG1ha2UgdGhpcyBhYnN0cmFjdCwgYW5kIGhhdmUgdGFyZ2V0cyBwcm92aWRlIGNvbmNyZXRlCisgIC8vIGltcGxlbWVudGF0aW9ucyBhcyB3ZSBkbyB3aXRoIEFzbVBhcnNlci4KKyAgTUNBc3NlbWJsZXIoTUNDb250ZXh0ICZDb250ZXh0LCBNQ0FzbUJhY2tlbmQgJkJhY2tlbmQsCisgICAgICAgICAgICAgIE1DQ29kZUVtaXR0ZXIgJkVtaXR0ZXIsIE1DT2JqZWN0V3JpdGVyICZXcml0ZXIpOworICBNQ0Fzc2VtYmxlcihjb25zdCBNQ0Fzc2VtYmxlciAmKSA9IGRlbGV0ZTsKKyAgTUNBc3NlbWJsZXIgJm9wZXJhdG9yPShjb25zdCBNQ0Fzc2VtYmxlciAmKSA9IGRlbGV0ZTsKKyAgfk1DQXNzZW1ibGVyKCk7CisKKyAgLy8vIENvbXB1dGUgdGhlIGVmZmVjdGl2ZSBmcmFnbWVudCBzaXplIGFzc3VtaW5nIGl0IGlzIGxhaWQgb3V0IGF0IHRoZSBnaXZlbgorICAvLy8gXHAgU2VjdGlvbkFkZHJlc3MgYW5kIFxwIEZyYWdtZW50T2Zmc2V0LgorICB1aW50NjRfdCBjb21wdXRlRnJhZ21lbnRTaXplKGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGcmFnbWVudCAmRikgY29uc3Q7CisKKyAgLy8vIEZpbmQgdGhlIHN5bWJvbCB3aGljaCBkZWZpbmVzIHRoZSBhdG9tIGNvbnRhaW5pbmcgdGhlIGdpdmVuIHN5bWJvbCwgb3IKKyAgLy8vIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCBzeW1ib2wuCisgIGNvbnN0IE1DU3ltYm9sICpnZXRBdG9tKGNvbnN0IE1DU3ltYm9sICZTKSBjb25zdDsKKworICAvLy8gQ2hlY2sgd2hldGhlciBhIHBhcnRpY3VsYXIgc3ltYm9sIGlzIHZpc2libGUgdG8gdGhlIGxpbmtlciBhbmQgaXMgcmVxdWlyZWQKKyAgLy8vIGluIHRoZSBzeW1ib2wgdGFibGUsIG9yIHdoZXRoZXIgaXQgY2FuIGJlIGRpc2NhcmRlZCBieSB0aGUgYXNzZW1ibGVyLiBUaGlzCisgIC8vLyBhbHNvIGVmZmVjdHMgd2hldGhlciB0aGUgYXNzZW1ibGVyIHRyZWF0cyB0aGUgbGFiZWwgYXMgcG90ZW50aWFsbHkKKyAgLy8vIGRlZmluaW5nIGEgc2VwYXJhdGUgYXRvbS4KKyAgYm9vbCBpc1N5bWJvbExpbmtlclZpc2libGUoY29uc3QgTUNTeW1ib2wgJlNEKSBjb25zdDsKKworICAvLy8gRW1pdCB0aGUgc2VjdGlvbiBjb250ZW50cyB1c2luZyB0aGUgZ2l2ZW4gb2JqZWN0IHdyaXRlci4KKyAgdm9pZCB3cml0ZVNlY3Rpb25EYXRhKGNvbnN0IE1DU2VjdGlvbiAqU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQpIGNvbnN0OworCisgIC8vLyBDaGVjayB3aGV0aGVyIGEgZ2l2ZW4gc3ltYm9sIGhhcyBiZWVuIGZsYWdnZWQgd2l0aCAudGh1bWJfZnVuYy4KKyAgYm9vbCBpc1RodW1iRnVuYyhjb25zdCBNQ1N5bWJvbCAqRnVuYykgY29uc3Q7CisKKyAgLy8vIEZsYWcgYSBmdW5jdGlvbiBzeW1ib2wgYXMgdGhlIHRhcmdldCBvZiBhIC50aHVtYl9mdW5jIGRpcmVjdGl2ZS4KKyAgdm9pZCBzZXRJc1RodW1iRnVuYyhjb25zdCBNQ1N5bWJvbCAqRnVuYykgeyBUaHVtYkZ1bmNzLmluc2VydChGdW5jKTsgfQorCisgIC8vLyBFTEYgZV9oZWFkZXIgZmxhZ3MKKyAgdW5zaWduZWQgZ2V0RUxGSGVhZGVyRUZsYWdzKCkgY29uc3QgeyByZXR1cm4gRUxGSGVhZGVyRUZsYWdzOyB9CisgIHZvaWQgc2V0RUxGSGVhZGVyRUZsYWdzKHVuc2lnbmVkIEZsYWdzKSB7IEVMRkhlYWRlckVGbGFncyA9IEZsYWdzOyB9CisKKyAgLy8vIE1hY2hPIGRlcGxveW1lbnQgdGFyZ2V0IHZlcnNpb24gaW5mb3JtYXRpb24uCisgIGNvbnN0IFZlcnNpb25JbmZvVHlwZSAmZ2V0VmVyc2lvbkluZm8oKSBjb25zdCB7IHJldHVybiBWZXJzaW9uSW5mbzsgfQorICB2b2lkIHNldFZlcnNpb25NaW4oTUNWZXJzaW9uTWluVHlwZSBUeXBlLCB1bnNpZ25lZCBNYWpvciwgdW5zaWduZWQgTWlub3IsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBVcGRhdGUpIHsKKyAgICBWZXJzaW9uSW5mby5FbWl0QnVpbGRWZXJzaW9uID0gZmFsc2U7CisgICAgVmVyc2lvbkluZm8uVHlwZU9yUGxhdGZvcm0uVHlwZSA9IFR5cGU7CisgICAgVmVyc2lvbkluZm8uTWFqb3IgPSBNYWpvcjsKKyAgICBWZXJzaW9uSW5mby5NaW5vciA9IE1pbm9yOworICAgIFZlcnNpb25JbmZvLlVwZGF0ZSA9IFVwZGF0ZTsKKyAgfQorICB2b2lkIHNldEJ1aWxkVmVyc2lvbihNYWNoTzo6UGxhdGZvcm1UeXBlIFBsYXRmb3JtLCB1bnNpZ25lZCBNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWlub3IsIHVuc2lnbmVkIFVwZGF0ZSkgeworICAgIFZlcnNpb25JbmZvLkVtaXRCdWlsZFZlcnNpb24gPSB0cnVlOworICAgIFZlcnNpb25JbmZvLlR5cGVPclBsYXRmb3JtLlBsYXRmb3JtID0gUGxhdGZvcm07CisgICAgVmVyc2lvbkluZm8uTWFqb3IgPSBNYWpvcjsKKyAgICBWZXJzaW9uSW5mby5NaW5vciA9IE1pbm9yOworICAgIFZlcnNpb25JbmZvLlVwZGF0ZSA9IFVwZGF0ZTsKKyAgfQorCisgIC8vLyBSZXVzZSBhbiBhc3NlbWJsZXIgaW5zdGFuY2UKKyAgLy8vCisgIHZvaWQgcmVzZXQoKTsKKworICBNQ0NvbnRleHQgJmdldENvbnRleHQoKSBjb25zdCB7IHJldHVybiBDb250ZXh0OyB9CisKKyAgTUNBc21CYWNrZW5kICZnZXRCYWNrZW5kKCkgY29uc3QgeyByZXR1cm4gQmFja2VuZDsgfQorCisgIE1DQ29kZUVtaXR0ZXIgJmdldEVtaXR0ZXIoKSBjb25zdCB7IHJldHVybiBFbWl0dGVyOyB9CisKKyAgTUNPYmplY3RXcml0ZXIgJmdldFdyaXRlcigpIGNvbnN0IHsgcmV0dXJuIFdyaXRlcjsgfQorCisgIE1DRHdhcmZMaW5lVGFibGVQYXJhbXMgZ2V0RFdBUkZMaW5ldGFibGVQYXJhbXMoKSBjb25zdCB7IHJldHVybiBMVFBhcmFtczsgfQorICB2b2lkIHNldERXQVJGTGluZXRhYmxlUGFyYW1zKE1DRHdhcmZMaW5lVGFibGVQYXJhbXMgUCkgeyBMVFBhcmFtcyA9IFA7IH0KKworICAvLy8gRmluaXNoIC0gRG8gZmluYWwgcHJvY2Vzc2luZyBhbmQgd3JpdGUgdGhlIG9iamVjdCB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgLy8vIFxwIFdyaXRlciBpcyB1c2VkIGZvciBjdXN0b20gb2JqZWN0IHdyaXRlciAoYXMgdGhlIE1DSklUIGRvZXMpLAorICAvLy8gaWYgbm90IHNwZWNpZmllZCBpdCBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZnJvbSBiYWNrZW5kLgorICB2b2lkIEZpbmlzaCgpOworCisgIC8vIExheW91dCBhbGwgc2VjdGlvbiBhbmQgcHJlcGFyZSB0aGVtIGZvciBlbWlzc2lvbi4KKyAgdm9pZCBsYXlvdXQoTUNBc21MYXlvdXQgJkxheW91dCk7CisKKyAgLy8gRklYTUU6IFRoaXMgZG9lcyBub3QgYmVsb25nIGhlcmUuCisgIGJvb2wgZ2V0U3Vic2VjdGlvbnNWaWFTeW1ib2xzKCkgY29uc3QgeyByZXR1cm4gU3Vic2VjdGlvbnNWaWFTeW1ib2xzOyB9CisgIHZvaWQgc2V0U3Vic2VjdGlvbnNWaWFTeW1ib2xzKGJvb2wgVmFsdWUpIHsgU3Vic2VjdGlvbnNWaWFTeW1ib2xzID0gVmFsdWU7IH0KKworICBib29sIGlzSW5jcmVtZW50YWxMaW5rZXJDb21wYXRpYmxlKCkgY29uc3QgeworICAgIHJldHVybiBJbmNyZW1lbnRhbExpbmtlckNvbXBhdGlibGU7CisgIH0KKyAgdm9pZCBzZXRJbmNyZW1lbnRhbExpbmtlckNvbXBhdGlibGUoYm9vbCBWYWx1ZSkgeworICAgIEluY3JlbWVudGFsTGlua2VyQ29tcGF0aWJsZSA9IFZhbHVlOworICB9CisKKyAgYm9vbCBnZXRSZWxheEFsbCgpIGNvbnN0IHsgcmV0dXJuIFJlbGF4QWxsOyB9CisgIHZvaWQgc2V0UmVsYXhBbGwoYm9vbCBWYWx1ZSkgeyBSZWxheEFsbCA9IFZhbHVlOyB9CisKKyAgYm9vbCBpc0J1bmRsaW5nRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIEJ1bmRsZUFsaWduU2l6ZSAhPSAwOyB9CisKKyAgdW5zaWduZWQgZ2V0QnVuZGxlQWxpZ25TaXplKCkgY29uc3QgeyByZXR1cm4gQnVuZGxlQWxpZ25TaXplOyB9CisKKyAgdm9pZCBzZXRCdW5kbGVBbGlnblNpemUodW5zaWduZWQgU2l6ZSkgeworICAgIGFzc2VydCgoU2l6ZSA9PSAwIHx8ICEoU2l6ZSAmIChTaXplIC0gMSkpKSAmJgorICAgICAgICAgICAiRXhwZWN0IGEgcG93ZXItb2YtdHdvIGJ1bmRsZSBhbGlnbiBzaXplIik7CisgICAgQnVuZGxlQWxpZ25TaXplID0gU2l6ZTsKKyAgfQorCisgIC8vLyBcbmFtZSBTZWN0aW9uIExpc3QgQWNjZXNzCisgIC8vLyBAeworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gU2VjdGlvbnMuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFNlY3Rpb25zLmJlZ2luKCk7IH0KKworICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBTZWN0aW9ucy5lbmQoKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBTZWN0aW9ucy5lbmQoKTsgfQorCisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gU2VjdGlvbnMuc2l6ZSgpOyB9CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBTeW1ib2wgTGlzdCBBY2Nlc3MKKyAgLy8vIEB7CisgIHN5bWJvbF9pdGVyYXRvciBzeW1ib2xfYmVnaW4oKSB7IHJldHVybiBTeW1ib2xzLmJlZ2luKCk7IH0KKyAgY29uc3Rfc3ltYm9sX2l0ZXJhdG9yIHN5bWJvbF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIFN5bWJvbHMuYmVnaW4oKTsgfQorCisgIHN5bWJvbF9pdGVyYXRvciBzeW1ib2xfZW5kKCkgeyByZXR1cm4gU3ltYm9scy5lbmQoKTsgfQorICBjb25zdF9zeW1ib2xfaXRlcmF0b3Igc3ltYm9sX2VuZCgpIGNvbnN0IHsgcmV0dXJuIFN5bWJvbHMuZW5kKCk7IH0KKworICBzeW1ib2xfcmFuZ2Ugc3ltYm9scygpIHsgcmV0dXJuIG1ha2VfcmFuZ2Uoc3ltYm9sX2JlZ2luKCksIHN5bWJvbF9lbmQoKSk7IH0KKyAgY29uc3Rfc3ltYm9sX3JhbmdlIHN5bWJvbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2Uoc3ltYm9sX2JlZ2luKCksIHN5bWJvbF9lbmQoKSk7CisgIH0KKworICBzaXplX3Qgc3ltYm9sX3NpemUoKSBjb25zdCB7IHJldHVybiBTeW1ib2xzLnNpemUoKTsgfQorCisgIC8vLyBAfQorICAvLy8gXG5hbWUgSW5kaXJlY3QgU3ltYm9sIExpc3QgQWNjZXNzCisgIC8vLyBAeworCisgIC8vIEZJWE1FOiBUaGlzIGlzIGEgdG90YWwgaGFjaywgdGhpcyBzaG91bGQgbm90IGJlIGhlcmUuIE9uY2UgdGhpbmdzIGFyZQorICAvLyBmYWN0b3JlZCBzbyB0aGF0IHRoZSBzdHJlYW1lciBoYXMgZGlyZWN0IGFjY2VzcyB0byB0aGUgLm8gd3JpdGVyLCBpdCBjYW4KKyAgLy8gZGlzYXBwZWFyLgorICBzdGQ6OnZlY3RvcjxJbmRpcmVjdFN5bWJvbERhdGE+ICZnZXRJbmRpcmVjdFN5bWJvbHMoKSB7CisgICAgcmV0dXJuIEluZGlyZWN0U3ltYm9sczsKKyAgfQorCisgIGluZGlyZWN0X3N5bWJvbF9pdGVyYXRvciBpbmRpcmVjdF9zeW1ib2xfYmVnaW4oKSB7CisgICAgcmV0dXJuIEluZGlyZWN0U3ltYm9scy5iZWdpbigpOworICB9CisgIGNvbnN0X2luZGlyZWN0X3N5bWJvbF9pdGVyYXRvciBpbmRpcmVjdF9zeW1ib2xfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIEluZGlyZWN0U3ltYm9scy5iZWdpbigpOworICB9CisKKyAgaW5kaXJlY3Rfc3ltYm9sX2l0ZXJhdG9yIGluZGlyZWN0X3N5bWJvbF9lbmQoKSB7CisgICAgcmV0dXJuIEluZGlyZWN0U3ltYm9scy5lbmQoKTsKKyAgfQorICBjb25zdF9pbmRpcmVjdF9zeW1ib2xfaXRlcmF0b3IgaW5kaXJlY3Rfc3ltYm9sX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5kaXJlY3RTeW1ib2xzLmVuZCgpOworICB9CisKKyAgc2l6ZV90IGluZGlyZWN0X3N5bWJvbF9zaXplKCkgY29uc3QgeyByZXR1cm4gSW5kaXJlY3RTeW1ib2xzLnNpemUoKTsgfQorCisgIC8vLyBAfQorICAvLy8gXG5hbWUgTGlua2VyIE9wdGlvbiBMaXN0IEFjY2VzcworICAvLy8gQHsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+ICZnZXRMaW5rZXJPcHRpb25zKCkgeworICAgIHJldHVybiBMaW5rZXJPcHRpb25zOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBEYXRhIFJlZ2lvbiBMaXN0IEFjY2VzcworICAvLy8gQHsKKworICAvLyBGSVhNRTogVGhpcyBpcyBhIHRvdGFsIGhhY2ssIHRoaXMgc2hvdWxkIG5vdCBiZSBoZXJlLiBPbmNlIHRoaW5ncyBhcmUKKyAgLy8gZmFjdG9yZWQgc28gdGhhdCB0aGUgc3RyZWFtZXIgaGFzIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIC5vIHdyaXRlciwgaXQgY2FuCisgIC8vIGRpc2FwcGVhci4KKyAgc3RkOjp2ZWN0b3I8RGF0YVJlZ2lvbkRhdGE+ICZnZXREYXRhUmVnaW9ucygpIHsgcmV0dXJuIERhdGFSZWdpb25zOyB9CisKKyAgZGF0YV9yZWdpb25faXRlcmF0b3IgZGF0YV9yZWdpb25fYmVnaW4oKSB7IHJldHVybiBEYXRhUmVnaW9ucy5iZWdpbigpOyB9CisgIGNvbnN0X2RhdGFfcmVnaW9uX2l0ZXJhdG9yIGRhdGFfcmVnaW9uX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBEYXRhUmVnaW9ucy5iZWdpbigpOworICB9CisKKyAgZGF0YV9yZWdpb25faXRlcmF0b3IgZGF0YV9yZWdpb25fZW5kKCkgeyByZXR1cm4gRGF0YVJlZ2lvbnMuZW5kKCk7IH0KKyAgY29uc3RfZGF0YV9yZWdpb25faXRlcmF0b3IgZGF0YV9yZWdpb25fZW5kKCkgY29uc3QgeworICAgIHJldHVybiBEYXRhUmVnaW9ucy5lbmQoKTsKKyAgfQorCisgIHNpemVfdCBkYXRhX3JlZ2lvbl9zaXplKCkgY29uc3QgeyByZXR1cm4gRGF0YVJlZ2lvbnMuc2l6ZSgpOyB9CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBEYXRhIFJlZ2lvbiBMaXN0IEFjY2VzcworICAvLy8gQHsKKworICAvLyBGSVhNRTogVGhpcyBpcyBhIHRvdGFsIGhhY2ssIHRoaXMgc2hvdWxkIG5vdCBiZSBoZXJlLiBPbmNlIHRoaW5ncyBhcmUKKyAgLy8gZmFjdG9yZWQgc28gdGhhdCB0aGUgc3RyZWFtZXIgaGFzIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIC5vIHdyaXRlciwgaXQgY2FuCisgIC8vIGRpc2FwcGVhci4KKyAgTUNMT0hDb250YWluZXIgJmdldExPSENvbnRhaW5lcigpIHsgcmV0dXJuIExPSENvbnRhaW5lcjsgfQorICBjb25zdCBNQ0xPSENvbnRhaW5lciAmZ2V0TE9IQ29udGFpbmVyKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PE1DQXNzZW1ibGVyICo+KHRoaXMpLT5nZXRMT0hDb250YWluZXIoKTsKKyAgfQorICAvLy8gQH0KKyAgLy8vIFxuYW1lIEJhY2tlbmQgRGF0YSBBY2Nlc3MKKyAgLy8vIEB7CisKKyAgYm9vbCByZWdpc3RlclNlY3Rpb24oTUNTZWN0aW9uICZTZWN0aW9uKTsKKworICB2b2lkIHJlZ2lzdGVyU3ltYm9sKGNvbnN0IE1DU3ltYm9sICZTeW1ib2wsIGJvb2wgKkNyZWF0ZWQgPSBudWxscHRyKTsKKworICBBcnJheVJlZjxzdGQ6OnN0cmluZz4gZ2V0RmlsZU5hbWVzKCkgeyByZXR1cm4gRmlsZU5hbWVzOyB9CisKKyAgdm9pZCBhZGRGaWxlTmFtZShTdHJpbmdSZWYgRmlsZU5hbWUpIHsKKyAgICBpZiAoIWlzX2NvbnRhaW5lZChGaWxlTmFtZXMsIEZpbGVOYW1lKSkKKyAgICAgIEZpbGVOYW1lcy5wdXNoX2JhY2soRmlsZU5hbWUpOworICB9CisKKyAgLy8vIFxicmllZiBXcml0ZSB0aGUgbmVjZXNzYXJ5IGJ1bmRsZSBwYWRkaW5nIHRvIHRoZSBnaXZlbiBvYmplY3Qgd3JpdGVyLgorICAvLy8gRXhwZWN0cyBhIGZyYWdtZW50IFxwIEYgY29udGFpbmluZyBpbnN0cnVjdGlvbnMgYW5kIGl0cyBzaXplIFxwIEZTaXplLgorICB2b2lkIHdyaXRlRnJhZ21lbnRQYWRkaW5nKGNvbnN0IE1DRnJhZ21lbnQgJkYsIHVpbnQ2NF90IEZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DT2JqZWN0V3JpdGVyICpPVykgY29uc3Q7CisKKyAgLy8vIEB9CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCisvLy8gXGJyaWVmIENvbXB1dGUgdGhlIGFtb3VudCBvZiBwYWRkaW5nIHJlcXVpcmVkIGJlZm9yZSB0aGUgZnJhZ21lbnQgXHAgRiB0bworLy8vIG9iZXkgYnVuZGxpbmcgcmVzdHJpY3Rpb25zLCB3aGVyZSBccCBGT2Zmc2V0IGlzIHRoZSBmcmFnbWVudCdzIG9mZnNldCBpbgorLy8vIGl0cyBzZWN0aW9uIGFuZCBccCBGU2l6ZSBpcyB0aGUgZnJhZ21lbnQncyBzaXplLgordWludDY0X3QgY29tcHV0ZUJ1bmRsZVBhZGRpbmcoY29uc3QgTUNBc3NlbWJsZXIgJkFzc2VtYmxlciwgY29uc3QgTUNGcmFnbWVudCAqRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEZPZmZzZXQsIHVpbnQ2NF90IEZTaXplKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNBU1NFTUJMRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0NvZGVFbWl0dGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQ29kZUVtaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWIwYjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0NvZGVFbWl0dGVyLmgKQEAgLTAsMCArMSw0MyBAQAorLy89PT0tIGxsdm0vTUMvTUNDb2RlRW1pdHRlci5oIC0gSW5zdHJ1Y3Rpb24gRW5jb2RpbmcgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DQ09ERUVNSVRURVJfSAorI2RlZmluZSBMTFZNX01DX01DQ09ERUVNSVRURVJfSAorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DRml4dXA7CitjbGFzcyBNQ0luc3Q7CitjbGFzcyBNQ1N1YnRhcmdldEluZm87CitjbGFzcyByYXdfb3N0cmVhbTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKKworLy8vIE1DQ29kZUVtaXR0ZXIgLSBHZW5lcmljIGluc3RydWN0aW9uIGVuY29kaW5nIGludGVyZmFjZS4KK2NsYXNzIE1DQ29kZUVtaXR0ZXIgeworcHJvdGVjdGVkOiAvLyBDYW4gb25seSBjcmVhdGUgc3ViY2xhc3Nlcy4KKyAgTUNDb2RlRW1pdHRlcigpOworCitwdWJsaWM6CisgIE1DQ29kZUVtaXR0ZXIoY29uc3QgTUNDb2RlRW1pdHRlciAmKSA9IGRlbGV0ZTsKKyAgTUNDb2RlRW1pdHRlciAmb3BlcmF0b3I9KGNvbnN0IE1DQ29kZUVtaXR0ZXIgJikgPSBkZWxldGU7CisgIHZpcnR1YWwgfk1DQ29kZUVtaXR0ZXIoKTsKKworICAvLy8gTGlmZXRpbWUgbWFuYWdlbWVudAorICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSB7fQorCisgIC8vLyBFbmNvZGVJbnN0cnVjdGlvbiAtIEVuY29kZSB0aGUgZ2l2ZW4gXHAgSW5zdCB0byBieXRlcyBvbiB0aGUgb3V0cHV0CisgIC8vLyBzdHJlYW0gXHAgT1MuCisgIHZpcnR1YWwgdm9pZCBlbmNvZGVJbnN0cnVjdGlvbihjb25zdCBNQ0luc3QgJkluc3QsIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNQ0ZpeHVwPiAmRml4dXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEkpIGNvbnN0ID0gMDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DQ09ERUVNSVRURVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0NvZGVQYWRkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNDb2RlUGFkZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3NzJiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNDb2RlUGFkZGVyLmgKQEAgLTAsMCArMSwyNDMgQEAKKy8vPT09LSBsbHZtL01DL0NvZGVQYWRkZXIuaCAtIE1DIENvZGUgUGFkZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0NPREVQQURERVJfSAorI2RlZmluZSBMTFZNX01DX01DQ09ERVBBRERFUl9ICisKKyNpbmNsdWRlICJNQ0ZyYWdtZW50LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNBc21MYXlvdXQ7CitjbGFzcyBNQ0NvZGVQYWRkaW5nUG9saWN5OworY2xhc3MgTUNGcmFnbWVudDsKK2NsYXNzIE1DSW5zdDsKK2NsYXNzIE1DT2JqZWN0U3RyZWFtZXI7CitjbGFzcyBNQ1NlY3Rpb247CisKK3R5cGVkZWYgU21hbGxWZWN0b3I8Y29uc3QgTUNQYWRkaW5nRnJhZ21lbnQgKiwgOD4gTUNQRlJhbmdlOworCitzdHJ1Y3QgTUNDb2RlUGFkZGluZ0NvbnRleHQgeworICBib29sIElzUGFkZGluZ0FjdGl2ZTsKKyAgYm9vbCBJc0Jhc2ljQmxvY2tJbnNpZGVJbm5lcm1vc3RMb29wOworICBib29sIElzQmFzaWNCbG9ja1JlYWNoYWJsZVZpYUZhbGx0aHJvdWdoOworICBib29sIElzQmFzaWNCbG9ja1JlYWNoYWJsZVZpYUJyYW5jaDsKK307CisKKy8vLyBUYXJnZXQtaW5kZXBlbmRlbnQgYmFzZSBjbGFzcyBpbmNoYXJnZSBvZiBhbGwgY29kZSBwYWRkaW5nIGRlY2lzaW9ucyBmb3IgYQorLy8vIHRhcmdldC4gRHVyaW5nIGVuY29kaW5nIGl0IGRldGVybWluZXMgaWYgYW5kIHdoZXJlIE1DUGFkZGluZ0ZyYWdtZW50cyB3aWxsCisvLy8gYmUgbG9jYXRlZCwgYXMgbGF0ZXIgb24sIHdoZW4gbGF5b3V0IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSwgaXQgZGV0ZXJtaW5lcworLy8vIHRoZWlyIHNpemVzLgorY2xhc3MgTUNDb2RlUGFkZGVyIHsKKyAgTUNDb2RlUGFkZGVyKGNvbnN0IE1DQ29kZVBhZGRlciAmKSA9IGRlbGV0ZTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTUNDb2RlUGFkZGVyICYpID0gZGVsZXRlOworCisgIC8vLyBEZXRlcm1pbmVzIGlmIHRoZSBNQ0NvZGVQYWRkaW5nUG9saWNpZXMgYXJlIGFjdGl2ZS4KKyAgYm9vbCBBcmVQb2xpY2llc0FjdGl2ZTsKKworICAvLy8gQWxsIHRoZSBzdXBwb3J0ZWQgTUNDb2RlUGFkZGluZ1BvbGljaWVzLgorICBTbWFsbFB0clNldDxNQ0NvZGVQYWRkaW5nUG9saWN5ICosIDQ+IENvZGVQYWRkaW5nUG9saWNpZXM7CisKKyAgLy8vIEEgcG9pbnRlciB0byB0aGUgZnJhZ21lbnQgb2YgdGhlIGluc3RydWN0aW9uIHdob3NlIHBhZGRpbmcgaXMgY3VycmVudGx5CisgIC8vLyBkb25lIGZvci4KKyAgTUNQYWRkaW5nRnJhZ21lbnQgKkN1cnJIYW5kbGVkSW5zdEZyYWdtZW50OworCisgIC8vLyBBIG1hcCBob2xkaW5nIHRoZSBqdXJpc2RpY3Rpb24gZm9yIGVhY2ggcGFkZGluZyBmcmFnbWVudC4gS2V5OiBwYWRkaW5nCisgIC8vLyBmcmFnbWVudC4gVmFsdWU6IFRoZSBmcmFnbWVudCdzIGp1cmlzZGljdGlvbi4gQSBqdXJpc2RpY3Rpb24gaXMgYSB2ZWN0b3IKKyAgLy8vIG9mIHBhZGRpbmcgZnJhZ21lbnRzIHdob3NlIGNvbmRpdGlvbnMgYXJlIGJlaW5nIGNvbnRyb2xsZWQgYnkgYW5vdGhlcgorICAvLy8gZnJhZ21lbnQsIHRoZSBrZXkgZnJhZ21lbnQuCisgIERlbnNlTWFwPE1DUGFkZGluZ0ZyYWdtZW50ICosIE1DUEZSYW5nZT4gRnJhZ21lbnRUb0p1cmlzZGljdGlvbjsKKyAgTUNQRlJhbmdlICZnZXRKdXJpc2RpY3Rpb24oTUNQYWRkaW5nRnJhZ21lbnQgKkZyYWdtZW50LCBNQ0FzbUxheW91dCAmTGF5b3V0KTsKKworICAvLy8gQSBtYXAgaG9sZGluZyB0aGUgbWF4aW1hbCBpbnN0cnVjdGlvbiB3aW5kb3cgc2l6ZSByZWxldmFudCBmb3IgYSBwYWRkaW5nCisgIC8vLyBmcmFnbWVudC4KKyAgRGVuc2VNYXA8TUNQYWRkaW5nRnJhZ21lbnQgKiwgdWludDY0X3Q+IEZyYWdtZW50VG9NYXhXaW5kb3dTaXplOworICB1aW50NjRfdCBnZXRNYXhXaW5kb3dTaXplKE1DUGFkZGluZ0ZyYWdtZW50ICpGcmFnbWVudCwgTUNBc21MYXlvdXQgJkxheW91dCk7CisKK3Byb3RlY3RlZDoKKyAgLy8vIFRoZSBjdXJyZW50IHN0cmVhbWVyLCB1c2VkIHRvIHN0cmVhbSBjb2RlIHBhZGRpbmcuCisgIE1DT2JqZWN0U3RyZWFtZXIgKk9TOworCisgIGJvb2wgYWRkUG9saWN5KE1DQ29kZVBhZGRpbmdQb2xpY3kgKlBvbGljeSk7CisKKyAgdmlydHVhbCBib29sCisgIGJhc2ljQmxvY2tSZXF1aXJlc0luc2VydGlvblBvaW50KGNvbnN0IE1DQ29kZVBhZGRpbmdDb250ZXh0ICZDb250ZXh0KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdmlydHVhbCBib29sIGluc3RydWN0aW9uUmVxdWlyZXNJbnNlcnRpb25Qb2ludChjb25zdCBNQ0luc3QgJkluc3QpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgdXNlUG9saWNpZXNGb3JCYXNpY0Jsb2NrKGNvbnN0IE1DQ29kZVBhZGRpbmdDb250ZXh0ICZDb250ZXh0KSB7CisgICAgcmV0dXJuIENvbnRleHQuSXNQYWRkaW5nQWN0aXZlOworICB9CisKK3B1YmxpYzoKKyAgTUNDb2RlUGFkZGVyKCkKKyAgICAgIDogQXJlUG9saWNpZXNBY3RpdmUoZmFsc2UpLCBDdXJySGFuZGxlZEluc3RGcmFnbWVudChudWxscHRyKSwKKyAgICAgICAgT1MobnVsbHB0cikge30KKyAgdmlydHVhbCB+TUNDb2RlUGFkZGVyKCk7CisKKyAgLy8vIEhhbmRsZXMgYWxsIHRhcmdldCByZWxhdGVkIGNvZGUgcGFkZGluZyB3aGVuIHN0YXJ0aW5nIHRvIHdyaXRlIGEgbmV3CisgIC8vLyBiYXNpYyBibG9jayB0byBhbiBvYmplY3QgZmlsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gT1MgVGhlIHN0cmVhbWVyIHVzZWQgZm9yIHdyaXRpbmcgdGhlIHBhZGRpbmcgZGF0YSBhbmQgZnVuY3Rpb24uCisgIC8vLyBccGFyYW0gQ29udGV4dCB0aGUgY29udGV4dCBvZiB0aGUgcGFkZGluZywgRW1iZWRzIHRoZSBiYXNpYyBibG9jaydzCisgIC8vLyBwYXJhbWV0ZXJzLgorICB2b2lkIGhhbmRsZUJhc2ljQmxvY2tTdGFydChNQ09iamVjdFN0cmVhbWVyICpPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNDb2RlUGFkZGluZ0NvbnRleHQgJkNvbnRleHQpOworICAvLy8gSGFuZGxlcyBhbGwgdGFyZ2V0IHJlbGF0ZWQgY29kZSBwYWRkaW5nIHdoZW4gZG9uZSB3cml0aW5nIGEgYmxvY2sgdG8gYW4KKyAgLy8vIG9iamVjdCBmaWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSBwYWRkaW5nLCBFbWJlZHMgdGhlIGJhc2ljIGJsb2NrJ3MKKyAgLy8vIHBhcmFtZXRlcnMuCisgIHZvaWQgaGFuZGxlQmFzaWNCbG9ja0VuZChjb25zdCBNQ0NvZGVQYWRkaW5nQ29udGV4dCAmQ29udGV4dCk7CisgIC8vLyBIYW5kbGVzIGFsbCB0YXJnZXQgcmVsYXRlZCBjb2RlIHBhZGRpbmcgYmVmb3JlIHdyaXRpbmcgYSBuZXcgaW5zdHJ1Y3Rpb24KKyAgLy8vIHRvIGFuIG9iamVjdCBmaWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJbnN0IHRoZSBpbnN0cnVjdGlvbi4KKyAgdm9pZCBoYW5kbGVJbnN0cnVjdGlvbkJlZ2luKGNvbnN0IE1DSW5zdCAmSW5zdCk7CisgIC8vLyBIYW5kbGVzIGFsbCB0YXJnZXQgcmVsYXRlZCBjb2RlIHBhZGRpbmcgYWZ0ZXIgd3JpdGluZyBhbiBpbnN0cnVjdGlvbiB0byBhbgorICAvLy8gb2JqZWN0IGZpbGUuCisgIC8vLworICAvLy8gXHBhcmFtIEluc3QgdGhlIGluc3RydWN0aW9uLgorICB2b2lkIGhhbmRsZUluc3RydWN0aW9uRW5kKGNvbnN0IE1DSW5zdCAmSW5zdCk7CisKKyAgLy8vIFJlbGF4ZXMgYSBmcmFnbWVudCAoY2hhbmdlcyB0aGUgc2l6ZSBvZiB0aGUgcGFkZGluZykgYWNjb3JkaW5nIHRvIHRhcmdldAorICAvLy8gcmVxdWlyZW1lbnRzLiBUaGUgbmV3IHNpemUgY29tcHV0YXRpb24gaXMgZG9uZSB3LnIudCBhIGxheW91dC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRnJhZ21lbnQgVGhlIGZyYWdtZW50IHRvIHJlbGF4LgorICAvLy8gXHBhcmFtIExheW91dCBDb2RlIGxheW91dCBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmZiBhbnkgcmVsYXhhdGlvbiBvY2N1cnJlZC4KKyAgYm9vbCByZWxheEZyYWdtZW50KE1DUGFkZGluZ0ZyYWdtZW50ICpGcmFnbWVudCwgTUNBc21MYXlvdXQgJkxheW91dCk7Cit9OworCisvLy8gVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBwYWRkaW5nIHBvbGljaWVzLCBpLmUuIGEgcnVsZSBvciBzZXQgb2YgcnVsZXMgdG8gcGFkCisvLy8gdGhlIGdlbmVyYXRlZCBjb2RlLgorY2xhc3MgTUNDb2RlUGFkZGluZ1BvbGljeSB7CisgIE1DQ29kZVBhZGRpbmdQb2xpY3koKSA9IGRlbGV0ZTsKKyAgTUNDb2RlUGFkZGluZ1BvbGljeShjb25zdCBNQ0NvZGVQYWRkaW5nUG9saWN5ICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBNQ0NvZGVQYWRkaW5nUG9saWN5ICYpID0gZGVsZXRlOworCitwcm90ZWN0ZWQ6CisgIC8vLyBBIG1hc2sgaG9sZGluZyB0aGUga2luZCBvZiB0aGlzIHBvbGljeSwgaS5lLiBvbmx5IHRoZSBpJ3RoIGJpdCB3aWxsIGJlIHNldAorICAvLy8gd2hlcmUgaSBpcyB0aGUga2luZCBudW1iZXIuCisgIGNvbnN0IHVpbnQ2NF90IEtpbmRNYXNrOworICAvLy8gSW5zdHJ1Y3Rpb24gd2luZG93IHNpemUgcmVsZXZhbnQgdG8gdGhpcyBwb2xpY3kuCisgIGNvbnN0IHVpbnQ2NF90IFdpbmRvd1NpemU7CisgIC8vLyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGljaCBieXRlIG9mIHRoZSBpbnN0cnVjdGlvbiBkZXRlcm1pZXMgaXRzCisgIC8vLyBpbnN0cnVjdGlvbiB3aW5kb3cuIElmIHRydWUgLSB0aGUgbGFzdCBieXRlIG9mIHRoZSBpbnN0cnVjdGlvbnMsIG8udy4gLQorICAvLy8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGluc3RydWN0aW9uLgorICBjb25zdCBib29sIEluc3RCeXRlSXNMYXN0Qnl0ZTsKKworICBNQ0NvZGVQYWRkaW5nUG9saWN5KHVpbnQ2NF90IEtpbmQsIHVpbnQ2NF90IFdpbmRvd1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbnN0Qnl0ZUlzTGFzdEJ5dGUpCisgICAgICA6IEtpbmRNYXNrKFVJTlQ2NF9DKDEpIDw8IEtpbmQpLCBXaW5kb3dTaXplKFdpbmRvd1NpemUpLAorICAgICAgICBJbnN0Qnl0ZUlzTGFzdEJ5dGUoSW5zdEJ5dGVJc0xhc3RCeXRlKSB7fQorCisgIC8vLyBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBjb25zZWN1dGl2ZSBmcmFnbWVudCBvZiBhIGdpdmVuCisgIC8vLyBmcmFnbWVudC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRnJhZ21lbnQgVGhlIGZyYWdtZW50IHdob3NlIGNvbnNlY3V0aXZlIG9mZnNldCB3aWxsIGJlIGNvbXB1dGVkLgorICAvLy8gXHBhcmFtIExheW91dCBDb2RlIGxheW91dCBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBjb25zZWN1dGl2ZSBmcmFnbWVudCBvZiBccCBGcmFnbWVudC4KKyAgc3RhdGljIHVpbnQ2NF90IGdldE5leHRGcmFnbWVudE9mZnNldChjb25zdCBNQ0ZyYWdtZW50ICpGcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KTsKKyAgLy8vIFJldHVybnMgdGhlIGluc3RydWN0aW9uIGJ5dGUgb2YgYW4gaW5zdHJ1Y3Rpb24gcG9pbnRlZCBieSBhIGdpdmVuCisgIC8vLyBNQ1BhZGRpbmdGcmFnbWVudC4gQW4gaW5zdHJ1Y3Rpb24gYnl0ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgYnl0ZSBvZiBhbgorICAvLy8gaW5zdHJ1Y3Rpb24gd2hpY2ggZGV0ZXJtaW5lcyBpdHMgaW5zdHJ1Y3Rpb24gd2luZG93LgorICAvLy8KKyAgLy8vIFxwYXJhbSBGcmFnbWVudCBUaGUgZnJhZ21lbnQgcG9pbnRpbmcgdG8gdGhlIGluc3RydWN0aW9uLgorICAvLy8gXHBhcmFtIExheW91dCBDb2RlIGxheW91dCBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgaW5zdHJ1Y3Rpb24gYnl0ZSBvZiBhbiBpbnN0cnVjdGlvbiBwb2ludGVkIGJ5IFxwIEZyYWdtZW50LgorICB1aW50NjRfdCBnZXRGcmFnbWVudEluc3RCeXRlKGNvbnN0IE1DUGFkZGluZ0ZyYWdtZW50ICpGcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdDsKKyAgdWludDY0X3QgY29tcHV0ZVdpbmRvd0VuZEFkZHJlc3MoY29uc3QgTUNQYWRkaW5nRnJhZ21lbnQgKkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXQsIE1DQXNtTGF5b3V0ICZMYXlvdXQpIGNvbnN0OworCisgIC8vLyBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgcGVuYWx0eSB3ZWlnaHQgb2YgYSBmaXJzdCBpbnN0cnVjdGlvbiB3aW5kb3cgaW4gYQorICAvLy8gcmFuZ2UuIFRoaXMgcmVxdWlyZXMgYSBzcGVjaWFsIGZ1bmN0aW9uIHNpbmNlIHRoZSBmaXJzdCB3aW5kb3cgZG9lcyBub3QKKyAgLy8vIGNvbnRhaW4gYWxsIHRoZSBwYWRkaW5nIGZyYWdtZW50cyBpbiB0aGF0IHdpbmRvdy4gSXQgb25seSBjb250YWlucyBhbGwgdGhlCisgIC8vLyBwYWRkaW5nIGZyYWdtZW50cyBzdGFydGluZyBmcm9tIHRoZSByZWxldmFudCBpbnNlcnRpb24gcG9pbnQuCisgIC8vLworICAvLy8gXHBhcmFtIFdpbmRvdyBUaGUgZmlyc3Qgd2luZG93LgorICAvLy8gXHBhcmFtIE9mZnNldCBUaGUgb2Zmc2V0IG9mIHRoZSBwYXJlbnQgc2VjdGlvbiByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgIC8vLyBvZiB0aGUgZmlsZSwgbW9kIHRoZSB3aW5kb3cgc2l6ZS4KKyAgLy8vIFxwYXJhbSBMYXlvdXQgQ29kZSBsYXlvdXQgaW5mb3JtYXRpb24uCisgIC8vLworICAvLy8gXHJldHVybnMgdGhlIHBlbmFsdHkgd2VpZ2h0IG9mIGEgZmlyc3QgaW5zdHJ1Y3Rpb24gd2luZG93IGluIGEgcmFuZ2UsIFxwCisgIC8vLyBXaW5kb3cuCisgIGRvdWJsZSBjb21wdXRlRmlyc3RXaW5kb3dQZW5hbHR5V2VpZ2h0KGNvbnN0IE1DUEZSYW5nZSAmV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQXNtTGF5b3V0ICZMYXlvdXQpIGNvbnN0OworICAvLy8gQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIHBlbmFsdHkgY2F1c2VkIGJ5IGFuIGluc3RydWN0aW9uIHdpbmRvdy4KKyAgLy8vCisgIC8vLyBccGFyYW0gV2luZG93IFRoZSBpbnN0cnVjdGlvbiB3aW5kb3cuCisgIC8vLyBccGFyYW0gT2Zmc2V0IFRoZSBvZmZzZXQgb2YgdGhlIHBhcmVudCBzZWN0aW9uIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgLy8vIG9mIHRoZSBmaWxlLCBtb2QgdGhlIHdpbmRvdyBzaXplLgorICAvLy8gXHBhcmFtIExheW91dCBDb2RlIGxheW91dCBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgcGVuYWx0eSBjYXVzZWQgYnkgXHAgV2luZG93LgorICB2aXJ0dWFsIGRvdWJsZSBjb21wdXRlV2luZG93UGVuYWx0eVdlaWdodChjb25zdCBNQ1BGUmFuZ2UgJldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdCA9IDA7CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+TUNDb2RlUGFkZGluZ1BvbGljeSgpIHt9CisKKyAgLy8vIFJldHVybnMgdGhlIGtpbmQgbWFzayBvZiB0aGlzIHBvbGljeSAtICBBIG1hc2sgaG9sZGluZyB0aGUga2luZCBvZiB0aGlzCisgIC8vLyBwb2xpY3ksIGkuZS4gb25seSB0aGUgaSd0aCBiaXQgd2lsbCBiZSBzZXQgd2hlcmUgaSBpcyB0aGUga2luZCBudW1iZXIuCisgIHVpbnQ2NF90IGdldEtpbmRNYXNrKCkgY29uc3QgeyByZXR1cm4gS2luZE1hc2s7IH0KKyAgLy8vIFJldHVybnMgdGhlIGluc3RydWN0aW9uIHdpbmRvdyBzaXplIHJlbGV2YW50IHRvIHRoaXMgcG9saWN5LgorICB1aW50NjRfdCBnZXRXaW5kb3dTaXplKCkgY29uc3QgeyByZXR1cm4gV2luZG93U2l6ZTsgfQorICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBsYXN0IGJ5dGUgb2YgYW4gaW5zdHJ1Y3Rpb24gZGV0ZXJtaW5lcyBpdHMgaW5zdHJ1Y3Rpb24KKyAgLy8vIHdpbmRvdywgb3IgZmFsc2UgaWYgdGhlIGZpcnN0IG9mIGFuIGluc3RydWN0aW9uIGRldGVybWluZXMgaXQuCisgIGJvb2wgaXNJbnN0Qnl0ZUxhc3RCeXRlKCkgY29uc3QgeyByZXR1cm4gSW5zdEJ5dGVJc0xhc3RCeXRlOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBwb2xpY3kgbmVlZHMgcGFkZGluZyBmb3IgYSBnaXZlbiBiYXNpYyBibG9jay4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ29udGV4dCB0aGUgY29udGV4dCBvZiB0aGUgcGFkZGluZywgRW1iZWRzIHRoZSBiYXNpYyBibG9jaydzCisgIC8vLyBwYXJhbWV0ZXJzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWZmIHRoaXMgcG9saWN5IG5lZWRzIHBhZGRpbmcgZm9yIHRoZSBiYXNpYyBibG9jay4KKyAgdmlydHVhbCBib29sCisgIGJhc2ljQmxvY2tSZXF1aXJlc1BhZGRpbmdGcmFnbWVudChjb25zdCBNQ0NvZGVQYWRkaW5nQ29udGV4dCAmQ29udGV4dCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIHBvbGljeSBuZWVkcyBwYWRkaW5nIGZvciBhIGdpdmVuIGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJbnN0IFRoZSBnaXZlbiBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmZiB0aGlzIHBvbGljeSBuZWVkcyBwYWRkaW5nIGZvciBccCBJbnN0LgorICB2aXJ0dWFsIGJvb2wgaW5zdHJ1Y3Rpb25SZXF1aXJlc1BhZGRpbmdGcmFnbWVudChjb25zdCBNQ0luc3QgJkluc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8vIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBwZW5hbHR5IGNhdXNlZCBieSBhIHJhbmdlIG9mIGluc3RydWN0aW9uIHdpbmRvd3MuCisgIC8vLyBUaGUgd2VpZ2h0IGlzIGNvbXB1dGVkIGZvciBlYWNoIHdpbmRvdyBzZXBhcmVsdHkgYW5kIHRoZW4gYWNjdW11bGF0ZWQuCisgIC8vLworICAvLy8gXHBhcmFtIFJhbmdlIFRoZSByYW5nZS4KKyAgLy8vIFxwYXJhbSBPZmZzZXQgVGhlIG9mZnNldCBvZiB0aGUgcGFyZW50IHNlY3Rpb24gcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAvLy8gb2YgdGhlIGZpbGUsIG1vZCB0aGUgd2luZG93IHNpemUuCisgIC8vLyBccGFyYW0gTGF5b3V0IENvZGUgbGF5b3V0IGluZm9ybWF0aW9uLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSBwZW5hbHR5IGNhdXNlZCBieSBccCBSYW5nZS4KKyAgZG91YmxlIGNvbXB1dGVSYW5nZVBlbmFsdHlXZWlnaHQoY29uc3QgTUNQRlJhbmdlICZSYW5nZSwgdWludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdDsKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNDT0RFUEFEREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNDb2RlVmlldy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0NvZGVWaWV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhmMTQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNDb2RlVmlldy5oCkBAIC0wLDAgKzEsMzAxIEBACisvLz09PS0gTUNDb2RlVmlldy5oIC0gTWFjaGluZSBDb2RlIENvZGVWaWV3IHN1cHBvcnQgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEhvbGRzIHN0YXRlIGZyb20gLmN2X2ZpbGUgYW5kIC5jdl9sb2MgZGlyZWN0aXZlcyBmb3IgbGF0ZXIgZW1pc3Npb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DQ09ERVZJRVdfSAorI2RlZmluZSBMTFZNX01DX01DQ09ERVZJRVdfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0ZyYWdtZW50LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ09iamVjdFN0cmVhbWVyLmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNPYmplY3RTdHJlYW1lcjsKK2NsYXNzIE1DU3RyZWFtZXI7CitjbGFzcyBDb2RlVmlld0NvbnRleHQ7CisKKy8vLyBcYnJpZWYgSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IHRoZSBpbmZvcm1hdGlvbiBmcm9tIGEKKy8vLyAuY3ZfbG9jIGRpcmVjdGl2ZS4KK2NsYXNzIE1DQ1ZMb2MgeworICB1aW50MzJfdCBGdW5jdGlvbklkOworICB1aW50MzJfdCBGaWxlTnVtOworICB1aW50MzJfdCBMaW5lOworICB1aW50MTZfdCBDb2x1bW47CisgIHVpbnQxNl90IFByb2xvZ3VlRW5kIDogMTsKKyAgdWludDE2X3QgSXNTdG10IDogMTsKKworcHJpdmF0ZTogLy8gQ29kZVZpZXdDb250ZXh0IG1hbmFnZXMgdGhlc2UKKyAgZnJpZW5kIGNsYXNzIENvZGVWaWV3Q29udGV4dDsKKyAgTUNDVkxvYyh1bnNpZ25lZCBmdW5jdGlvbmlkLCB1bnNpZ25lZCBmaWxlTnVtLCB1bnNpZ25lZCBsaW5lLCB1bnNpZ25lZCBjb2x1bW4sCisgICAgICAgICAgYm9vbCBwcm9sb2d1ZWVuZCwgYm9vbCBpc3N0bXQpCisgICAgICA6IEZ1bmN0aW9uSWQoZnVuY3Rpb25pZCksIEZpbGVOdW0oZmlsZU51bSksIExpbmUobGluZSksIENvbHVtbihjb2x1bW4pLAorICAgICAgICBQcm9sb2d1ZUVuZChwcm9sb2d1ZWVuZCksIElzU3RtdChpc3N0bXQpIHt9CisKKyAgLy8gQWxsb3cgdGhlIGRlZmF1bHQgY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvciB0byBiZSB1c2VkCisgIC8vIGZvciBhbiBNQ0NWTG9jIG9iamVjdC4KKworcHVibGljOgorICB1bnNpZ25lZCBnZXRGdW5jdGlvbklkKCkgY29uc3QgeyByZXR1cm4gRnVuY3Rpb25JZDsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBGaWxlTnVtIG9mIHRoaXMgTUNDVkxvYy4KKyAgdW5zaWduZWQgZ2V0RmlsZU51bSgpIGNvbnN0IHsgcmV0dXJuIEZpbGVOdW07IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgTGluZSBvZiB0aGlzIE1DQ1ZMb2MuCisgIHVuc2lnbmVkIGdldExpbmUoKSBjb25zdCB7IHJldHVybiBMaW5lOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIENvbHVtbiBvZiB0aGlzIE1DQ1ZMb2MuCisgIHVuc2lnbmVkIGdldENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIENvbHVtbjsgfQorCisgIGJvb2wgaXNQcm9sb2d1ZUVuZCgpIGNvbnN0IHsgcmV0dXJuIFByb2xvZ3VlRW5kOyB9CisgIGJvb2wgaXNTdG10KCkgY29uc3QgeyByZXR1cm4gSXNTdG10OyB9CisKKyAgdm9pZCBzZXRGdW5jdGlvbklkKHVuc2lnbmVkIEZJRCkgeyBGdW5jdGlvbklkID0gRklEOyB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIEZpbGVOdW0gb2YgdGhpcyBNQ0NWTG9jLgorICB2b2lkIHNldEZpbGVOdW0odW5zaWduZWQgZmlsZU51bSkgeyBGaWxlTnVtID0gZmlsZU51bTsgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBMaW5lIG9mIHRoaXMgTUNDVkxvYy4KKyAgdm9pZCBzZXRMaW5lKHVuc2lnbmVkIGxpbmUpIHsgTGluZSA9IGxpbmU7IH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgQ29sdW1uIG9mIHRoaXMgTUNDVkxvYy4KKyAgdm9pZCBzZXRDb2x1bW4odW5zaWduZWQgY29sdW1uKSB7CisgICAgYXNzZXJ0KGNvbHVtbiA8PSBVSU5UMTZfTUFYKTsKKyAgICBDb2x1bW4gPSBjb2x1bW47CisgIH0KKworICB2b2lkIHNldFByb2xvZ3VlRW5kKGJvb2wgUEUpIHsgUHJvbG9ndWVFbmQgPSBQRTsgfQorICB2b2lkIHNldElzU3RtdChib29sIElTKSB7IElzU3RtdCA9IElTOyB9Cit9OworCisvLy8gXGJyaWVmIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCB0aGUgbGluZSBpbmZvcm1hdGlvbiBmb3IKKy8vLyB0aGUgQ29kZVZpZXcgbGluZSB0YWJsZSBlbnRyaWVzLiAgV2hpY2ggaXMgY3JlYXRlZCBhZnRlciBhIG1hY2hpbmUKKy8vLyBpbnN0cnVjdGlvbiBpcyBhc3NlbWJsZWQgYW5kIHVzZXMgYW4gYWRkcmVzcyBmcm9tIGEgdGVtcG9yYXJ5IGxhYmVsCisvLy8gY3JlYXRlZCBhdCB0aGUgY3VycmVudCBhZGRyZXNzIGluIHRoZSBjdXJyZW50IHNlY3Rpb24gYW5kIHRoZSBpbmZvIGZyb20KKy8vLyB0aGUgbGFzdCAuY3ZfbG9jIGRpcmVjdGl2ZSBzZWVuIGFzIHN0b3JlZCBpbiB0aGUgY29udGV4dC4KK2NsYXNzIE1DQ1ZMaW5lRW50cnkgOiBwdWJsaWMgTUNDVkxvYyB7CisgIGNvbnN0IE1DU3ltYm9sICpMYWJlbDsKKworcHJpdmF0ZToKKyAgLy8gQWxsb3cgdGhlIGRlZmF1bHQgY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvciB0byBiZSB1c2VkCisgIC8vIGZvciBhbiBNQ0NWTGluZUVudHJ5IG9iamVjdC4KKworcHVibGljOgorICAvLyBDb25zdHJ1Y3RvciB0byBjcmVhdGUgYW4gTUNDVkxpbmVFbnRyeSBnaXZlbiBhIHN5bWJvbCBhbmQgdGhlIGR3YXJmIGxvYy4KKyAgTUNDVkxpbmVFbnRyeShjb25zdCBNQ1N5bWJvbCAqTGFiZWwsIGNvbnN0IE1DQ1ZMb2MgbG9jKQorICAgICAgOiBNQ0NWTG9jKGxvYyksIExhYmVsKExhYmVsKSB7fQorCisgIGNvbnN0IE1DU3ltYm9sICpnZXRMYWJlbCgpIGNvbnN0IHsgcmV0dXJuIExhYmVsOyB9CisKKyAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBhbiBpbnN0cnVjdGlvbiBpcyBhc3NlbWJsZWQgaW50byB0aGUgc3BlY2lmaWVkCisgIC8vIHNlY3Rpb24gYW5kIGlmIHRoZXJlIGlzIGluZm9ybWF0aW9uIGZyb20gdGhlIGxhc3QgLmN2X2xvYyBkaXJlY3RpdmUgdGhhdAorICAvLyBoYXMgeWV0IHRvIGhhdmUgYSBsaW5lIGVudHJ5IG1hZGUgZm9yIGl0IGlzIG1hZGUuCisgIHN0YXRpYyB2b2lkIE1ha2UoTUNPYmplY3RTdHJlYW1lciAqTUNPUyk7Cit9OworCisvLy8gSW5mb3JtYXRpb24gZGVzY3JpYmluZyBhIGZ1bmN0aW9uIG9yIGlubGluZWQgY2FsbCBzaXRlIGludHJvZHVjZWQgYnkKKy8vLyAuY3ZfZnVuY19pZCBvciAuY3ZfaW5saW5lX3NpdGVfaWQuIEFjY3VtdWxhdGVzIGluZm9ybWF0aW9uIGZyb20gLmN2X2xvYworLy8vIGRpcmVjdGl2ZXMgdXNlZCB3aXRoIHRoaXMgZnVuY3Rpb24ncyBpZCBvciB0aGUgaWQgb2YgYW4gaW5saW5lZCBjYWxsIHNpdGUKKy8vLyB3aXRoaW4gdGhpcyBmdW5jdGlvbiBvciBpbmxpbmVkIGNhbGwgc2l0ZS4KK3N0cnVjdCBNQ0NWRnVuY3Rpb25JbmZvIHsKKyAgLy8vIElmIHRoaXMgcmVwcmVzZW50cyBhbiBpbmxpbmVkIGNhbGwgc2l0ZSwgdGhlbiBQYXJlbnRGdW5jSWRQbHVzT25lIHdpbGwgYmUKKyAgLy8vIHRoZSBwYXJlbnQgZnVuY3Rpb24gaWQgcGx1cyBvbmUuIElmIHRoaXMgcmVwcmVzZW50cyBhIG5vcm1hbCBmdW5jdGlvbiwKKyAgLy8vIHRoZW4gdGhlcmUgaXMgbm8gcGFyZW50LCBhbmQgUGFyZW50RnVuY0lkUGx1c09uZSB3aWxsIGJlIEZ1bmN0aW9uU2VudGluZWwuCisgIC8vLyBJZiB0aGlzIHN0cnVjdCBpcyBhbiB1bmFsbG9jYXRlZCBzbG90IGluIHRoZSBmdW5jdGlvbiBpbmZvIHZlY3RvciwgdGhlbgorICAvLy8gUGFyZW50RnVuY0lkUGx1c09uZSB3aWxsIGJlIHplcm8uCisgIHVuc2lnbmVkIFBhcmVudEZ1bmNJZFBsdXNPbmUgPSAwOworCisgIGVudW0gOiB1bnNpZ25lZCB7IEZ1bmN0aW9uU2VudGluZWwgPSB+MFUgfTsKKworICBzdHJ1Y3QgTGluZUluZm8geworICAgIHVuc2lnbmVkIEZpbGU7CisgICAgdW5zaWduZWQgTGluZTsKKyAgICB1bnNpZ25lZCBDb2w7CisgIH07CisKKyAgTGluZUluZm8gSW5saW5lZEF0OworCisgIC8vLyBUaGUgc2VjdGlvbiBvZiB0aGUgZmlyc3QgLmN2X2xvYyBkaXJlY3RpdmUgdXNlZCBmb3IgdGhpcyBmdW5jdGlvbiwgb3IgbnVsbAorICAvLy8gaWYgbm9uZSBoYXMgYmVlbiBzZWVuIHlldC4KKyAgTUNTZWN0aW9uICpTZWN0aW9uID0gbnVsbHB0cjsKKworICAvLy8gTWFwIGZyb20gaW5saW5lZCBjYWxsIHNpdGUgaWQgdG8gdGhlIGlubGluZWQgYXQgbG9jYXRpb24gdG8gdXNlIGZvciB0aGF0CisgIC8vLyBjYWxsIHNpdGUuIENhbGwgY2hhaW5zIGFyZSBjb2xsYXBzZWQsIHNvIGZvciB0aGUgY2FsbCBjaGFpbiAnZiAtPiBnIC0+IGgnLAorICAvLy8gdGhlIElubGluZWRBdE1hcCBvZiAnZicgd2lsbCBjb250YWluIGVudHJpZXMgZm9yICdnJyBhbmQgJ2gnIHRoYXQgYm90aAorICAvLy8gbGlzdCB0aGUgbGluZSBpbmZvIGZvciB0aGUgJ2cnIGNhbGwgc2l0ZS4KKyAgRGVuc2VNYXA8dW5zaWduZWQsIExpbmVJbmZvPiBJbmxpbmVkQXRNYXA7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGZ1bmN0aW9uIGluZm8gaGFzIG5vdCB5ZXQgYmVlbiB1c2VkIGluIGEKKyAgLy8vIC5jdl9mdW5jX2lkIG9yIC5jdl9pbmxpbmVfc2l0ZV9pZCBkaXJlY3RpdmUuCisgIGJvb2wgaXNVbmFsbG9jYXRlZEZ1bmN0aW9uSW5mbygpIGNvbnN0IHsgcmV0dXJuIFBhcmVudEZ1bmNJZFBsdXNPbmUgPT0gMDsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyByZXByZXNlbnRzIGFuIGlubGluZWQgY2FsbCBzaXRlLCBtZWFuaW5nCisgIC8vLyBQYXJlbnRGdW5jSWRQbHVzT25lIGlzIG5laXRoZXIgemVybyBub3IgfjBVLgorICBib29sIGlzSW5saW5lZENhbGxTaXRlKCkgY29uc3QgeworICAgIHJldHVybiAhaXNVbmFsbG9jYXRlZEZ1bmN0aW9uSW5mbygpICYmCisgICAgICAgICAgIFBhcmVudEZ1bmNJZFBsdXNPbmUgIT0gRnVuY3Rpb25TZW50aW5lbDsKKyAgfQorCisgIHVuc2lnbmVkIGdldFBhcmVudEZ1bmNJZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNJbmxpbmVkQ2FsbFNpdGUoKSk7CisgICAgcmV0dXJuIFBhcmVudEZ1bmNJZFBsdXNPbmUgLSAxOworICB9Cit9OworCisvLy8gSG9sZHMgc3RhdGUgZnJvbSAuY3ZfZmlsZSBhbmQgLmN2X2xvYyBkaXJlY3RpdmVzIGZvciBsYXRlciBlbWlzc2lvbi4KK2NsYXNzIENvZGVWaWV3Q29udGV4dCB7CitwdWJsaWM6CisgIENvZGVWaWV3Q29udGV4dCgpOworICB+Q29kZVZpZXdDb250ZXh0KCk7CisKKyAgYm9vbCBpc1ZhbGlkRmlsZU51bWJlcih1bnNpZ25lZCBGaWxlTnVtYmVyKSBjb25zdDsKKyAgYm9vbCBhZGRGaWxlKE1DU3RyZWFtZXIgJk9TLCB1bnNpZ25lZCBGaWxlTnVtYmVyLCBTdHJpbmdSZWYgRmlsZW5hbWUsCisgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiBDaGVja3N1bUJ5dGVzLCB1aW50OF90IENoZWNrc3VtS2luZCk7CisKKyAgLy8vIFJlY29yZHMgdGhlIGZ1bmN0aW9uIGlkIG9mIGEgbm9ybWFsIGZ1bmN0aW9uLiBSZXR1cm5zIGZhbHNlIGlmIHRoZQorICAvLy8gZnVuY3Rpb24gaWQgaGFzIGFscmVhZHkgYmVlbiB1c2VkLCBhbmQgdHJ1ZSBvdGhlcndpc2UuCisgIGJvb2wgcmVjb3JkRnVuY3Rpb25JZCh1bnNpZ25lZCBGdW5jSWQpOworCisgIC8vLyBSZWNvcmRzIHRoZSBmdW5jdGlvbiBpZCBvZiBhbiBpbmxpbmVkIGNhbGwgc2l0ZS4gUmVjb3JkcyB0aGUgImlubGluZWQgYXQiCisgIC8vLyBsb2NhdGlvbiBpbmZvIG9mIHRoZSBjYWxsIHNpdGUsIGluY2x1ZGluZyB3aGF0IGZ1bmN0aW9uIG9yIGlubGluZWQgY2FsbAorICAvLy8gc2l0ZSBpdCB3YXMgaW5saW5lZCBpbnRvLiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBmdW5jdGlvbiBpZCBoYXMgYWxyZWFkeQorICAvLy8gYmVlbiB1c2VkLCBhbmQgdHJ1ZSBvdGhlcndpc2UuCisgIGJvb2wgcmVjb3JkSW5saW5lZENhbGxTaXRlSWQodW5zaWduZWQgRnVuY0lkLCB1bnNpZ25lZCBJQUZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUFGaWxlLCB1bnNpZ25lZCBJQUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUFDb2wpOworCisgIC8vLyBSZXRyZWl2ZSB0aGUgZnVuY3Rpb24gaW5mbyBpZiB0aGlzIGlzIGEgdmFsaWQgZnVuY3Rpb24gaWQsIG9yIG51bGxwdHIuCisgIE1DQ1ZGdW5jdGlvbkluZm8gKmdldENWRnVuY3Rpb25JbmZvKHVuc2lnbmVkIEZ1bmNJZCk7CisKKyAgLy8vIFNhdmVzIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjdXJyZW50bHkgcGFyc2VkIC5jdl9sb2MgZGlyZWN0aXZlCisgIC8vLyBhbmQgc2V0cyBDVkxvY1NlZW4uICBXaGVuIHRoZSBuZXh0IGluc3RydWN0aW9uIGlzIGFzc2VtYmxlZCBhbiBlbnRyeQorICAvLy8gaW4gdGhlIGxpbmUgbnVtYmVyIHRhYmxlIHdpdGggdGhpcyBpbmZvcm1hdGlvbiBhbmQgdGhlIGFkZHJlc3Mgb2YgdGhlCisgIC8vLyBpbnN0cnVjdGlvbiB3aWxsIGJlIGNyZWF0ZWQuCisgIHZvaWQgc2V0Q3VycmVudENWTG9jKHVuc2lnbmVkIEZ1bmN0aW9uSWQsIHVuc2lnbmVkIEZpbGVObywgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sdW1uLCBib29sIFByb2xvZ3VlRW5kLCBib29sIElzU3RtdCkgeworICAgIEN1cnJlbnRDVkxvYy5zZXRGdW5jdGlvbklkKEZ1bmN0aW9uSWQpOworICAgIEN1cnJlbnRDVkxvYy5zZXRGaWxlTnVtKEZpbGVObyk7CisgICAgQ3VycmVudENWTG9jLnNldExpbmUoTGluZSk7CisgICAgQ3VycmVudENWTG9jLnNldENvbHVtbihDb2x1bW4pOworICAgIEN1cnJlbnRDVkxvYy5zZXRQcm9sb2d1ZUVuZChQcm9sb2d1ZUVuZCk7CisgICAgQ3VycmVudENWTG9jLnNldElzU3RtdChJc1N0bXQpOworICAgIENWTG9jU2VlbiA9IHRydWU7CisgIH0KKworICBib29sIGdldENWTG9jU2VlbigpIHsgcmV0dXJuIENWTG9jU2VlbjsgfQorICB2b2lkIGNsZWFyQ1ZMb2NTZWVuKCkgeyBDVkxvY1NlZW4gPSBmYWxzZTsgfQorCisgIGNvbnN0IE1DQ1ZMb2MgJmdldEN1cnJlbnRDVkxvYygpIHsgcmV0dXJuIEN1cnJlbnRDVkxvYzsgfQorCisgIGJvb2wgaXNWYWxpZENWRmlsZU51bWJlcih1bnNpZ25lZCBGaWxlTnVtYmVyKTsKKworICAvLy8gXGJyaWVmIEFkZCBhIGxpbmUgZW50cnkuCisgIHZvaWQgYWRkTGluZUVudHJ5KGNvbnN0IE1DQ1ZMaW5lRW50cnkgJkxpbmVFbnRyeSk7CisKKyAgc3RkOjp2ZWN0b3I8TUNDVkxpbmVFbnRyeT4gZ2V0RnVuY3Rpb25MaW5lRW50cmllcyh1bnNpZ25lZCBGdW5jSWQpOworCisgIHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gZ2V0TGluZUV4dGVudCh1bnNpZ25lZCBGdW5jSWQpOworCisgIEFycmF5UmVmPE1DQ1ZMaW5lRW50cnk+IGdldExpbmVzRm9yRXh0ZW50KHNpemVfdCBMLCBzaXplX3QgUik7CisKKyAgLy8vIEVtaXRzIGEgbGluZSB0YWJsZSBzdWJzdHJlYW0uCisgIHZvaWQgZW1pdExpbmVUYWJsZUZvckZ1bmN0aW9uKE1DT2JqZWN0U3RyZWFtZXIgJk9TLCB1bnNpZ25lZCBGdW5jSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICpGdW5jQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICpGdW5jRW5kKTsKKworICB2b2lkIGVtaXRJbmxpbmVMaW5lVGFibGVGb3JGdW5jdGlvbihNQ09iamVjdFN0cmVhbWVyICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUHJpbWFyeUZ1bmN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNvdXJjZUZpbGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU291cmNlTGluZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKkZuU3RhcnRTeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICpGbkVuZFN5bSk7CisKKyAgLy8vIEVuY29kZXMgdGhlIGJpbmFyeSBhbm5vdGF0aW9ucyBvbmNlIHdlIGhhdmUgYSBsYXlvdXQuCisgIHZvaWQgZW5jb2RlSW5saW5lTGluZVRhYmxlKE1DQXNtTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ1ZJbmxpbmVMaW5lVGFibGVGcmFnbWVudCAmRik7CisKKyAgdm9pZAorICBlbWl0RGVmUmFuZ2UoTUNPYmplY3RTdHJlYW1lciAmT1MsCisgICAgICAgICAgICAgICBBcnJheVJlZjxzdGQ6OnBhaXI8Y29uc3QgTUNTeW1ib2wgKiwgY29uc3QgTUNTeW1ib2wgKj4+IFJhbmdlcywKKyAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaXhlZFNpemVQb3J0aW9uKTsKKworICB2b2lkIGVuY29kZURlZlJhbmdlKE1DQXNtTGF5b3V0ICZMYXlvdXQsIE1DQ1ZEZWZSYW5nZUZyYWdtZW50ICZGKTsKKworICAvLy8gRW1pdHMgdGhlIHN0cmluZyB0YWJsZSBzdWJzdHJlYW0uCisgIHZvaWQgZW1pdFN0cmluZ1RhYmxlKE1DT2JqZWN0U3RyZWFtZXIgJk9TKTsKKworICAvLy8gRW1pdHMgdGhlIGZpbGUgY2hlY2tzdW0gc3Vic3RyZWFtLgorICB2b2lkIGVtaXRGaWxlQ2hlY2tzdW1zKE1DT2JqZWN0U3RyZWFtZXIgJk9TKTsKKworICAvLy8gRW1pdHMgdGhlIG9mZnNldCBpbnRvIHRoZSBjaGVja3N1bSB0YWJsZSBvZiB0aGUgZ2l2ZW4gZmlsZSBudW1iZXIuCisgIHZvaWQgZW1pdEZpbGVDaGVja3N1bU9mZnNldChNQ09iamVjdFN0cmVhbWVyICZPUywgdW5zaWduZWQgRmlsZU5vKTsKKworICAvLy8gQWRkIHNvbWV0aGluZyB0byB0aGUgc3RyaW5nIHRhYmxlLiAgUmV0dXJucyB0aGUgZmluYWwgc3RyaW5nIGFzIHdlbGwgYXMKKyAgLy8vIG9mZnNldCBpbnRvIHRoZSBzdHJpbmcgdGFibGUuCisgIHN0ZDo6cGFpcjxTdHJpbmdSZWYsIHVuc2lnbmVkPiBhZGRUb1N0cmluZ1RhYmxlKFN0cmluZ1JlZiBTKTsKKworcHJpdmF0ZToKKyAgLy8vIFRoZSBjdXJyZW50IENvZGVWaWV3IGxpbmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGFzdCAuY3ZfbG9jIGRpcmVjdGl2ZS4KKyAgTUNDVkxvYyBDdXJyZW50Q1ZMb2MgPSBNQ0NWTG9jKDAsIDAsIDAsIDAsIGZhbHNlLCB0cnVlKTsKKyAgYm9vbCBDVkxvY1NlZW4gPSBmYWxzZTsKKworICAvLy8gTWFwIGZyb20gc3RyaW5nIHRvIHN0cmluZyB0YWJsZSBvZmZzZXQuCisgIFN0cmluZ01hcDx1bnNpZ25lZD4gU3RyaW5nVGFibGU7CisKKyAgLy8vIFRoZSBmcmFnbWVudCB0aGF0IHVsdGltYXRlbHkgaG9sZHMgb3VyIHN0cmluZ3MuCisgIE1DRGF0YUZyYWdtZW50ICpTdHJUYWJGcmFnbWVudCA9IG51bGxwdHI7CisgIGJvb2wgSW5zZXJ0ZWRTdHJUYWJGcmFnbWVudCA9IGZhbHNlOworCisgIE1DRGF0YUZyYWdtZW50ICpnZXRTdHJpbmdUYWJsZUZyYWdtZW50KCk7CisKKyAgLy8vIEdldCBhIHN0cmluZyB0YWJsZSBvZmZzZXQuCisgIHVuc2lnbmVkIGdldFN0cmluZ1RhYmxlT2Zmc2V0KFN0cmluZ1JlZiBTKTsKKworICBzdHJ1Y3QgRmlsZUluZm8geworICAgIHVuc2lnbmVkIFN0cmluZ1RhYmxlT2Zmc2V0OworCisgICAgLy8gSW5kaWNhdGVzIGlmIHRoaXMgRmlsZUluZm8gY29ycmVzcG9uZHMgdG8gYW4gYWN0dWFsIGZpbGUsIG9yIGhhc24ndCBiZWVuCisgICAgLy8gc2V0IHlldC4KKyAgICBib29sIEFzc2lnbmVkID0gZmFsc2U7CisKKyAgICB1aW50OF90IENoZWNrc3VtS2luZDsKKworICAgIEFycmF5UmVmPHVpbnQ4X3Q+IENoZWNrc3VtOworCisgICAgLy8gQ2hlY2tzdW0gb2Zmc2V0IHN0b3JlZCBhcyBhIHN5bWJvbCBiZWNhdXNlIGl0IG1pZ2h0IGJlIHJlcXVlc3RlZAorICAgIC8vIGJlZm9yZSBpdCBoYXMgYmVlbiBjYWxjdWxhdGVkLCBzbyBhIGZpeHVwIG1heSBiZSBuZWVkZWQuCisgICAgTUNTeW1ib2wgKkNoZWNrc3VtVGFibGVPZmZzZXQ7CisgIH07CisKKyAgLy8vIEFycmF5IHN0b3JpbmcgYWRkZWQgZmlsZSBpbmZvcm1hdGlvbi4KKyAgU21hbGxWZWN0b3I8RmlsZUluZm8sIDQ+IEZpbGVzOworCisgIC8vLyBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBhbmQgbGFzdCAuY3ZfbG9jIGRpcmVjdGl2ZSBmb3IgYSBnaXZlbiBmdW5jdGlvbgorICAvLy8gaWQuCisgIHN0ZDo6bWFwPHVuc2lnbmVkLCBzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+PiBNQ0NWTGluZVN0YXJ0U3RvcDsKKworICAvLy8gQSBjb2xsZWN0aW9uIG9mIE1DQ1ZMaW5lRW50cnkgZm9yIGVhY2ggc2VjdGlvbi4KKyAgc3RkOjp2ZWN0b3I8TUNDVkxpbmVFbnRyeT4gTUNDVkxpbmVzOworCisgIC8vLyBBbGwga25vd24gZnVuY3Rpb25zIGFuZCBpbmxpbmVkIGNhbGwgc2l0ZXMsIGluZGV4ZWQgYnkgZnVuY3Rpb24gaWQuCisgIHN0ZDo6dmVjdG9yPE1DQ1ZGdW5jdGlvbkluZm8+IEZ1bmN0aW9uczsKKworICAvLy8gSW5kaWNhdGUgd2hldGhlciB3ZSBoYXZlIGFscmVhZHkgbGFpZCBvdXQgdGhlIGNoZWNrc3VtIHRhYmxlIGFkZHJlc3NlcyBvcgorICAvLy8gbm90LgorICBib29sIENoZWNrc3VtT2Zmc2V0c0Fzc2lnbmVkID0gZmFsc2U7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQ29udGV4dC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTEwZmZkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0NvbnRleHQuaApAQCAtMCwwICsxLDcyMiBAQAorLy89PT0tIE1DQ29udGV4dC5oIC0gTWFjaGluZSBDb2RlIENvbnRleHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DQ09OVEVYVF9ICisjZGVmaW5lIExMVk1fTUNfTUNDT05URVhUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21NYWNyby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNEd2FyZi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTdWJ0YXJnZXRJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9TZWN0aW9uS2luZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTUQ1LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgQ29kZVZpZXdDb250ZXh0OworICBjbGFzcyBNQ0FzbUluZm87CisgIGNsYXNzIE1DTGFiZWw7CisgIGNsYXNzIE1DT2JqZWN0RmlsZUluZm87CisgIGNsYXNzIE1DUmVnaXN0ZXJJbmZvOworICBjbGFzcyBNQ1NlY3Rpb247CisgIGNsYXNzIE1DU2VjdGlvbkNPRkY7CisgIGNsYXNzIE1DU2VjdGlvbkVMRjsKKyAgY2xhc3MgTUNTZWN0aW9uTWFjaE87CisgIGNsYXNzIE1DU2VjdGlvbldhc207CisgIGNsYXNzIE1DU3RyZWFtZXI7CisgIGNsYXNzIE1DU3ltYm9sOworICBjbGFzcyBNQ1N5bWJvbEVMRjsKKyAgY2xhc3MgTUNTeW1ib2xXYXNtOworICBjbGFzcyBTTUxvYzsKKyAgY2xhc3MgU291cmNlTWdyOworCisgIC8vLyBDb250ZXh0IG9iamVjdCBmb3IgbWFjaGluZSBjb2RlIG9iamVjdHMuICBUaGlzIGNsYXNzIG93bnMgYWxsIG9mIHRoZQorICAvLy8gc2VjdGlvbnMgdGhhdCBpdCBjcmVhdGVzLgorICAvLy8KKyAgY2xhc3MgTUNDb250ZXh0IHsKKyAgcHVibGljOgorICAgIHVzaW5nIFN5bWJvbFRhYmxlID0gU3RyaW5nTWFwPE1DU3ltYm9sICosIEJ1bXBQdHJBbGxvY2F0b3IgJj47CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gVGhlIFNvdXJjZU1nciBmb3IgdGhpcyBvYmplY3QsIGlmIGFueS4KKyAgICBjb25zdCBTb3VyY2VNZ3IgKlNyY01ncjsKKworICAgIC8vLyBUaGUgU291cmNlTWdyIGZvciBpbmxpbmUgYXNzZW1ibHksIGlmIGFueS4KKyAgICBTb3VyY2VNZ3IgKklubGluZVNyY01ncjsKKworICAgIC8vLyBUaGUgTUNBc21JbmZvIGZvciB0aGlzIHRhcmdldC4KKyAgICBjb25zdCBNQ0FzbUluZm8gKk1BSTsKKworICAgIC8vLyBUaGUgTUNSZWdpc3RlckluZm8gZm9yIHRoaXMgdGFyZ2V0LgorICAgIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICpNUkk7CisKKyAgICAvLy8gVGhlIE1DT2JqZWN0RmlsZUluZm8gZm9yIHRoaXMgdGFyZ2V0LgorICAgIGNvbnN0IE1DT2JqZWN0RmlsZUluZm8gKk1PRkk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29kZVZpZXdDb250ZXh0PiBDVkNvbnRleHQ7CisKKyAgICAvLy8gQWxsb2NhdG9yIG9iamVjdCB1c2VkIGZvciBjcmVhdGluZyBtYWNoaW5lIGNvZGUgb2JqZWN0cy4KKyAgICAvLy8KKyAgICAvLy8gV2UgdXNlIGEgYnVtcCBwb2ludGVyIGFsbG9jYXRvciB0byBhdm9pZCB0aGUgbmVlZCB0byB0cmFjayBhbGwgYWxsb2NhdGVkCisgICAgLy8vIG9iamVjdHMuCisgICAgQnVtcFB0ckFsbG9jYXRvciBBbGxvY2F0b3I7CisKKyAgICBTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3I8TUNTZWN0aW9uQ09GRj4gQ09GRkFsbG9jYXRvcjsKKyAgICBTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3I8TUNTZWN0aW9uRUxGPiBFTEZBbGxvY2F0b3I7CisgICAgU3BlY2lmaWNCdW1wUHRyQWxsb2NhdG9yPE1DU2VjdGlvbk1hY2hPPiBNYWNoT0FsbG9jYXRvcjsKKyAgICBTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3I8TUNTZWN0aW9uV2FzbT4gV2FzbUFsbG9jYXRvcjsKKworICAgIC8vLyBCaW5kaW5ncyBvZiBuYW1lcyB0byBzeW1ib2xzLgorICAgIFN5bWJvbFRhYmxlIFN5bWJvbHM7CisKKyAgICAvLy8gQSBtYXBwaW5nIGZyb20gYSBsb2NhbCBsYWJlbCBudW1iZXIgYW5kIGFuIGluc3RhbmNlIGNvdW50IHRvIGEgc3ltYm9sLgorICAgIC8vLyBGb3IgZXhhbXBsZSwgaW4gdGhlIGFzc2VtYmx5CisgICAgLy8vICAgICAxOgorICAgIC8vLyAgICAgMjoKKyAgICAvLy8gICAgIDE6CisgICAgLy8vIFdlIGhhdmUgdGhyZWUgbGFiZWxzIHJlcHJlc2VudGVkIGJ5IHRoZSBwYWlycyAoMSwgMCksICgyLCAwKSBhbmQgKDEsIDEpCisgICAgRGVuc2VNYXA8c3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4sIE1DU3ltYm9sICo+IExvY2FsU3ltYm9sczsKKworICAgIC8vLyBLZWVwcyB0cmFja3Mgb2YgbmFtZXMgdGhhdCB3ZXJlIHVzZWQgYm90aCBmb3IgdXNlZCBkZWNsYXJlZCBhbmQKKyAgICAvLy8gYXJ0aWZpY2lhbCBzeW1ib2xzLiBUaGUgdmFsdWUgaXMgInRydWUiIGlmIHRoZSBuYW1lIGhhcyBiZWVuIHVzZWQgZm9yIGEKKyAgICAvLy8gbm9uLXNlY3Rpb24gc3ltYm9sICh0aGVyZSBjYW4gYmUgYXQgbW9zdCBvbmUgb2YgdGhvc2UsIHBsdXMgYW4gdW5saW1pdGVkCisgICAgLy8vIG51bWJlciBvZiBzZWN0aW9uIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lKS4KKyAgICBTdHJpbmdNYXA8Ym9vbCwgQnVtcFB0ckFsbG9jYXRvciAmPiBVc2VkTmFtZXM7CisKKyAgICAvLy8gVGhlIG5leHQgSUQgdG8gZG9sZSBvdXQgdG8gYW4gdW5uYW1lZCBhc3NlbWJsZXIgdGVtcG9yYXJ5IHN5bWJvbCB3aXRoCisgICAgLy8vIGEgZ2l2ZW4gcHJlZml4LgorICAgIFN0cmluZ01hcDx1bnNpZ25lZD4gTmV4dElEOworCisgICAgLy8vIEluc3RhbmNlcyBvZiBkaXJlY3Rpb25hbCBsb2NhbCBsYWJlbHMuCisgICAgRGVuc2VNYXA8dW5zaWduZWQsIE1DTGFiZWwgKj4gSW5zdGFuY2VzOworICAgIC8vLyBOZXh0SW5zdGFuY2UoKSBjcmVhdGVzIHRoZSBuZXh0IGluc3RhbmNlIG9mIHRoZSBkaXJlY3Rpb25hbCBsb2NhbCBsYWJlbAorICAgIC8vLyBmb3IgdGhlIExvY2FsTGFiZWxWYWwgYW5kIGFkZHMgaXQgdG8gdGhlIG1hcCBpZiBuZWVkZWQuCisgICAgdW5zaWduZWQgTmV4dEluc3RhbmNlKHVuc2lnbmVkIExvY2FsTGFiZWxWYWwpOworICAgIC8vLyBHZXRJbnN0YW5jZSgpIGdldHMgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIGRpcmVjdGlvbmFsIGxvY2FsIGxhYmVsCisgICAgLy8vIGZvciB0aGUgTG9jYWxMYWJlbFZhbCBhbmQgYWRkcyBpdCB0byB0aGUgbWFwIGlmIG5lZWRlZC4KKyAgICB1bnNpZ25lZCBHZXRJbnN0YW5jZSh1bnNpZ25lZCBMb2NhbExhYmVsVmFsKTsKKworICAgIC8vLyBUaGUgZmlsZSBuYW1lIG9mIHRoZSBsb2cgZmlsZSBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgIC8vLyBBU19TRUNVUkVfTE9HX0ZJTEUuICBXaGljaCBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIC5zZWN1cmVfbG9nX3VuaXF1ZQorICAgIC8vLyBkaXJlY3RpdmUgaXMgdXNlZCBvciBpdCBpcyBhbiBlcnJvci4KKyAgICBjaGFyICpTZWN1cmVMb2dGaWxlOworICAgIC8vLyBUaGUgc3RyZWFtIHRoYXQgZ2V0cyB3cml0dGVuIHRvIGZvciB0aGUgLnNlY3VyZV9sb2dfdW5pcXVlIGRpcmVjdGl2ZS4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8cmF3X2ZkX29zdHJlYW0+IFNlY3VyZUxvZzsKKyAgICAvLy8gQm9vbGVhbiB0b2dnbGVkIHdoZW4gLnNlY3VyZV9sb2dfdW5pcXVlIC8gLnNlY3VyZV9sb2dfcmVzZXQgaXMgc2VlbiB0bworICAgIC8vLyBjYXRjaCBlcnJvcnMgaWYgLnNlY3VyZV9sb2dfdW5pcXVlIGFwcGVhcnMgdHdpY2Ugd2l0aG91dAorICAgIC8vLyAuc2VjdXJlX2xvZ19yZXNldCBhcHBlYXJpbmcgYmV0d2VlbiB0aGVtLgorICAgIGJvb2wgU2VjdXJlTG9nVXNlZCA9IGZhbHNlOworCisgICAgLy8vIFRoZSBjb21waWxhdGlvbiBkaXJlY3RvcnkgdG8gdXNlIGZvciBEV19BVF9jb21wX2Rpci4KKyAgICBTbWFsbFN0cmluZzwxMjg+IENvbXBpbGF0aW9uRGlyOworCisgICAgLy8vIFRoZSBtYWluIGZpbGUgbmFtZSBpZiBwYXNzZWQgaW4gZXhwbGljaXRseS4KKyAgICBzdGQ6OnN0cmluZyBNYWluRmlsZU5hbWU7CisKKyAgICAvLy8gVGhlIGR3YXJmIGZpbGUgYW5kIGRpcmVjdG9yeSB0YWJsZXMgZnJvbSB0aGUgZHdhcmYgLmZpbGUgZGlyZWN0aXZlLgorICAgIC8vLyBXZSBub3cgZW1pdCBhIGxpbmUgdGFibGUgZm9yIGVhY2ggY29tcGlsZSB1bml0LiBUbyByZWR1Y2UgdGhlIHByb2xvZ3VlCisgICAgLy8vIHNpemUgb2YgZWFjaCBsaW5lIHRhYmxlLCB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHVzZWQgYnkgZWFjaCBjb21waWxlCisgICAgLy8vIHVuaXQgYXJlIHNlcGFyYXRlZC4KKyAgICBzdGQ6Om1hcDx1bnNpZ25lZCwgTUNEd2FyZkxpbmVUYWJsZT4gTUNEd2FyZkxpbmVUYWJsZXNDVU1hcDsKKworICAgIC8vLyBUaGUgY3VycmVudCBkd2FyZiBsaW5lIGluZm9ybWF0aW9uIGZyb20gdGhlIGxhc3QgZHdhcmYgLmxvYyBkaXJlY3RpdmUuCisgICAgTUNEd2FyZkxvYyBDdXJyZW50RHdhcmZMb2M7CisgICAgYm9vbCBEd2FyZkxvY1NlZW4gPSBmYWxzZTsKKworICAgIC8vLyBHZW5lcmF0ZSBkd2FyZiBkZWJ1Z2dpbmcgaW5mbyBmb3IgYXNzZW1ibHkgc291cmNlIGZpbGVzLgorICAgIGJvb2wgR2VuRHdhcmZGb3JBc3NlbWJseSA9IGZhbHNlOworCisgICAgLy8vIFRoZSBjdXJyZW50IGR3YXJmIGZpbGUgbnVtYmVyIHdoZW4gZ2VuZXJhdGUgZHdhcmYgZGVidWdnaW5nIGluZm8gZm9yCisgICAgLy8vIGFzc2VtYmx5IHNvdXJjZSBmaWxlcy4KKyAgICB1bnNpZ25lZCBHZW5Ed2FyZkZpbGVOdW1iZXIgPSAwOworCisgICAgLy8vIFNlY3Rpb25zIGZvciBnZW5lcmF0aW5nIHRoZSAuZGVidWdfcmFuZ2VzIGFuZCAuZGVidWdfYXJhbmdlcyBzZWN0aW9ucy4KKyAgICBTZXRWZWN0b3I8TUNTZWN0aW9uICo+IFNlY3Rpb25zRm9yUmFuZ2VzOworCisgICAgLy8vIFRoZSBpbmZvcm1hdGlvbiBnYXRoZXJlZCBmcm9tIGxhYmVscyB0aGF0IHdpbGwgaGF2ZSBkd2FyZiBsYWJlbAorICAgIC8vLyBlbnRyaWVzIHdoZW4gZ2VuZXJhdGluZyBkd2FyZiBhc3NlbWJseSBzb3VyY2UgZmlsZXMuCisgICAgc3RkOjp2ZWN0b3I8TUNHZW5Ed2FyZkxhYmVsRW50cnk+IE1DR2VuRHdhcmZMYWJlbEVudHJpZXM7CisKKyAgICAvLy8gVGhlIHN0cmluZyB0byBlbWJlZCBpbiB0aGUgZGVidWcgaW5mb3JtYXRpb24gZm9yIHRoZSBjb21waWxlIHVuaXQsIGlmCisgICAgLy8vIG5vbi1lbXB0eS4KKyAgICBTdHJpbmdSZWYgRHdhcmZEZWJ1Z0ZsYWdzOworCisgICAgLy8vIFRoZSBzdHJpbmcgdG8gZW1iZWQgaW4gYXMgdGhlIGR3YXJmIEFUX3Byb2R1Y2VyIGZvciB0aGUgY29tcGlsZSB1bml0LCBpZgorICAgIC8vLyBub24tZW1wdHkuCisgICAgU3RyaW5nUmVmIER3YXJmRGVidWdQcm9kdWNlcjsKKworICAgIC8vLyBUaGUgbWF4aW11bSB2ZXJzaW9uIG9mIGR3YXJmIHRoYXQgd2Ugc2hvdWxkIGVtaXQuCisgICAgdWludDE2X3QgRHdhcmZWZXJzaW9uID0gNDsKKworICAgIC8vLyBIb25vciB0ZW1wb3JhcnkgbGFiZWxzLCB0aGlzIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHNlbWFudGljCisgICAgLy8vIGRpZmZlcmVuY2VzIGJldHdlZW4gdGVtcG9yYXJ5IGFuZCBub24tdGVtcG9yYXJ5IGxhYmVscyAocHJpbWFyaWx5IG9uCisgICAgLy8vIERhcndpbikuCisgICAgYm9vbCBBbGxvd1RlbXBvcmFyeUxhYmVscyA9IHRydWU7CisgICAgYm9vbCBVc2VOYW1lc09uVGVtcExhYmVscyA9IHRydWU7CisKKyAgICAvLy8gVGhlIENvbXBpbGUgVW5pdCBJRCB0aGF0IHdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZy4KKyAgICB1bnNpZ25lZCBEd2FyZkNvbXBpbGVVbml0SUQgPSAwOworCisgICAgc3RydWN0IEVMRlNlY3Rpb25LZXkgeworICAgICAgc3RkOjpzdHJpbmcgU2VjdGlvbk5hbWU7CisgICAgICBTdHJpbmdSZWYgR3JvdXBOYW1lOworICAgICAgdW5zaWduZWQgVW5pcXVlSUQ7CisKKyAgICAgIEVMRlNlY3Rpb25LZXkoU3RyaW5nUmVmIFNlY3Rpb25OYW1lLCBTdHJpbmdSZWYgR3JvdXBOYW1lLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBVbmlxdWVJRCkKKyAgICAgICAgICA6IFNlY3Rpb25OYW1lKFNlY3Rpb25OYW1lKSwgR3JvdXBOYW1lKEdyb3VwTmFtZSksIFVuaXF1ZUlEKFVuaXF1ZUlEKSB7CisgICAgICB9CisKKyAgICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEVMRlNlY3Rpb25LZXkgJk90aGVyKSBjb25zdCB7CisgICAgICAgIGlmIChTZWN0aW9uTmFtZSAhPSBPdGhlci5TZWN0aW9uTmFtZSkKKyAgICAgICAgICByZXR1cm4gU2VjdGlvbk5hbWUgPCBPdGhlci5TZWN0aW9uTmFtZTsKKyAgICAgICAgaWYgKEdyb3VwTmFtZSAhPSBPdGhlci5Hcm91cE5hbWUpCisgICAgICAgICAgcmV0dXJuIEdyb3VwTmFtZSA8IE90aGVyLkdyb3VwTmFtZTsKKyAgICAgICAgcmV0dXJuIFVuaXF1ZUlEIDwgT3RoZXIuVW5pcXVlSUQ7CisgICAgICB9CisgICAgfTsKKworICAgIHN0cnVjdCBDT0ZGU2VjdGlvbktleSB7CisgICAgICBzdGQ6OnN0cmluZyBTZWN0aW9uTmFtZTsKKyAgICAgIFN0cmluZ1JlZiBHcm91cE5hbWU7CisgICAgICBpbnQgU2VsZWN0aW9uS2V5OworICAgICAgdW5zaWduZWQgVW5pcXVlSUQ7CisKKyAgICAgIENPRkZTZWN0aW9uS2V5KFN0cmluZ1JlZiBTZWN0aW9uTmFtZSwgU3RyaW5nUmVmIEdyb3VwTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBTZWxlY3Rpb25LZXksIHVuc2lnbmVkIFVuaXF1ZUlEKQorICAgICAgICAgIDogU2VjdGlvbk5hbWUoU2VjdGlvbk5hbWUpLCBHcm91cE5hbWUoR3JvdXBOYW1lKSwKKyAgICAgICAgICAgIFNlbGVjdGlvbktleShTZWxlY3Rpb25LZXkpLCBVbmlxdWVJRChVbmlxdWVJRCkge30KKworICAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQ09GRlNlY3Rpb25LZXkgJk90aGVyKSBjb25zdCB7CisgICAgICAgIGlmIChTZWN0aW9uTmFtZSAhPSBPdGhlci5TZWN0aW9uTmFtZSkKKyAgICAgICAgICByZXR1cm4gU2VjdGlvbk5hbWUgPCBPdGhlci5TZWN0aW9uTmFtZTsKKyAgICAgICAgaWYgKEdyb3VwTmFtZSAhPSBPdGhlci5Hcm91cE5hbWUpCisgICAgICAgICAgcmV0dXJuIEdyb3VwTmFtZSA8IE90aGVyLkdyb3VwTmFtZTsKKyAgICAgICAgaWYgKFNlbGVjdGlvbktleSAhPSBPdGhlci5TZWxlY3Rpb25LZXkpCisgICAgICAgICAgcmV0dXJuIFNlbGVjdGlvbktleSA8IE90aGVyLlNlbGVjdGlvbktleTsKKyAgICAgICAgcmV0dXJuIFVuaXF1ZUlEIDwgT3RoZXIuVW5pcXVlSUQ7CisgICAgICB9CisgICAgfTsKKworICAgIHN0cnVjdCBXYXNtU2VjdGlvbktleSB7CisgICAgICBzdGQ6OnN0cmluZyBTZWN0aW9uTmFtZTsKKyAgICAgIFN0cmluZ1JlZiBHcm91cE5hbWU7CisgICAgICB1bnNpZ25lZCBVbmlxdWVJRDsKKworICAgICAgV2FzbVNlY3Rpb25LZXkoU3RyaW5nUmVmIFNlY3Rpb25OYW1lLCBTdHJpbmdSZWYgR3JvdXBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVW5pcXVlSUQpCisgICAgICAgICAgOiBTZWN0aW9uTmFtZShTZWN0aW9uTmFtZSksIEdyb3VwTmFtZShHcm91cE5hbWUpLCBVbmlxdWVJRChVbmlxdWVJRCkgeworICAgICAgfQorCisgICAgICBib29sIG9wZXJhdG9yPChjb25zdCBXYXNtU2VjdGlvbktleSAmT3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKFNlY3Rpb25OYW1lICE9IE90aGVyLlNlY3Rpb25OYW1lKQorICAgICAgICAgIHJldHVybiBTZWN0aW9uTmFtZSA8IE90aGVyLlNlY3Rpb25OYW1lOworICAgICAgICBpZiAoR3JvdXBOYW1lICE9IE90aGVyLkdyb3VwTmFtZSkKKyAgICAgICAgICByZXR1cm4gR3JvdXBOYW1lIDwgT3RoZXIuR3JvdXBOYW1lOworICAgICAgICByZXR1cm4gVW5pcXVlSUQgPCBPdGhlci5VbmlxdWVJRDsKKyAgICAgIH0KKyAgICB9OworCisgICAgU3RyaW5nTWFwPE1DU2VjdGlvbk1hY2hPICo+IE1hY2hPVW5pcXVpbmdNYXA7CisgICAgc3RkOjptYXA8RUxGU2VjdGlvbktleSwgTUNTZWN0aW9uRUxGICo+IEVMRlVuaXF1aW5nTWFwOworICAgIHN0ZDo6bWFwPENPRkZTZWN0aW9uS2V5LCBNQ1NlY3Rpb25DT0ZGICo+IENPRkZVbmlxdWluZ01hcDsKKyAgICBzdGQ6Om1hcDxXYXNtU2VjdGlvbktleSwgTUNTZWN0aW9uV2FzbSAqPiBXYXNtVW5pcXVpbmdNYXA7CisgICAgU3RyaW5nTWFwPGJvb2w+IFJlbFNlY05hbWVzOworCisgICAgU3BlY2lmaWNCdW1wUHRyQWxsb2NhdG9yPE1DU3VidGFyZ2V0SW5mbz4gTUNTdWJ0YXJnZXRBbGxvY2F0b3I7CisKKyAgICAvLy8gRG8gYXV0b21hdGljIHJlc2V0IGluIGRlc3RydWN0b3IKKyAgICBib29sIEF1dG9SZXNldDsKKworICAgIGJvb2wgSGFkRXJyb3IgPSBmYWxzZTsKKworICAgIE1DU3ltYm9sICpjcmVhdGVTeW1ib2xJbXBsKGNvbnN0IFN0cmluZ01hcEVudHJ5PGJvb2w+ICpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ2FuQmVVbm5hbWVkKTsKKyAgICBNQ1N5bWJvbCAqY3JlYXRlU3ltYm9sKFN0cmluZ1JlZiBOYW1lLCBib29sIEFsd2F5c0FkZFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNUZW1wb3JhcnkpOworCisgICAgTUNTeW1ib2wgKmdldE9yQ3JlYXRlRGlyZWN0aW9uYWxMb2NhbFN5bWJvbCh1bnNpZ25lZCBMb2NhbExhYmVsVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5zdGFuY2UpOworCisgICAgTUNTZWN0aW9uRUxGICpjcmVhdGVFTEZTZWN0aW9uSW1wbChTdHJpbmdSZWYgU2VjdGlvbiwgdW5zaWduZWQgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzLCBTZWN0aW9uS2luZCBLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRW50cnlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2xFTEYgKkdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVW5pcXVlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbEVMRiAqQXNzb2NpYXRlZCk7CisKKyAgICAvLy8gXGJyaWVmIE1hcCBvZiBjdXJyZW50bHkgZGVmaW5lZCBtYWNyb3MuCisgICAgU3RyaW5nTWFwPE1DQXNtTWFjcm8+IE1hY3JvTWFwOworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBNQ0NvbnRleHQoY29uc3QgTUNBc21JbmZvICpNQUksIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICpNUkksCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DT2JqZWN0RmlsZUluZm8gKk1PRkksCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1nciAqTWdyID0gbnVsbHB0ciwgYm9vbCBEb0F1dG9SZXNldCA9IHRydWUpOworICAgIE1DQ29udGV4dChjb25zdCBNQ0NvbnRleHQgJikgPSBkZWxldGU7CisgICAgTUNDb250ZXh0ICZvcGVyYXRvcj0oY29uc3QgTUNDb250ZXh0ICYpID0gZGVsZXRlOworICAgIH5NQ0NvbnRleHQoKTsKKworICAgIGNvbnN0IFNvdXJjZU1nciAqZ2V0U291cmNlTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIFNyY01ncjsgfQorCisgICAgdm9pZCBzZXRJbmxpbmVTb3VyY2VNYW5hZ2VyKFNvdXJjZU1nciAqU00pIHsgSW5saW5lU3JjTWdyID0gU007IH0KKworICAgIGNvbnN0IE1DQXNtSW5mbyAqZ2V0QXNtSW5mbygpIGNvbnN0IHsgcmV0dXJuIE1BSTsgfQorCisgICAgY29uc3QgTUNSZWdpc3RlckluZm8gKmdldFJlZ2lzdGVySW5mbygpIGNvbnN0IHsgcmV0dXJuIE1SSTsgfQorCisgICAgY29uc3QgTUNPYmplY3RGaWxlSW5mbyAqZ2V0T2JqZWN0RmlsZUluZm8oKSBjb25zdCB7IHJldHVybiBNT0ZJOyB9CisKKyAgICBDb2RlVmlld0NvbnRleHQgJmdldENWQ29udGV4dCgpOworCisgICAgdm9pZCBzZXRBbGxvd1RlbXBvcmFyeUxhYmVscyhib29sIFZhbHVlKSB7IEFsbG93VGVtcG9yYXJ5TGFiZWxzID0gVmFsdWU7IH0KKyAgICB2b2lkIHNldFVzZU5hbWVzT25UZW1wTGFiZWxzKGJvb2wgVmFsdWUpIHsgVXNlTmFtZXNPblRlbXBMYWJlbHMgPSBWYWx1ZTsgfQorCisgICAgLy8vIFxuYW1lIE1vZHVsZSBMaWZldGltZSBNYW5hZ2VtZW50CisgICAgLy8vIEB7CisKKyAgICAvLy8gcmVzZXQgLSByZXR1cm4gb2JqZWN0IHRvIHJpZ2h0IGFmdGVyIGNvbnN0cnVjdGlvbiBzdGF0ZSB0byBwcmVwYXJlCisgICAgLy8vIHRvIHByb2Nlc3MgYSBuZXcgbW9kdWxlCisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8vIEB9CisKKyAgICAvLy8gXG5hbWUgU3ltYm9sIE1hbmFnZW1lbnQKKyAgICAvLy8gQHsKKworICAgIC8vLyBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBsaW5rZXIgdGVtcG9yYXJ5IHN5bWJvbCB3aXRoIGEgdW5pcXVlIGJ1dAorICAgIC8vLyB1bnNwZWNpZmllZCBuYW1lLgorICAgIE1DU3ltYm9sICpjcmVhdGVMaW5rZXJQcml2YXRlVGVtcFN5bWJvbCgpOworCisgICAgLy8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IGFzc2VtYmxlciB0ZW1wb3Jhcnkgc3ltYm9sIHdpdGggYSB1bmlxdWUgYnV0CisgICAgLy8vIHVuc3BlY2lmaWVkIG5hbWUuCisgICAgTUNTeW1ib2wgKmNyZWF0ZVRlbXBTeW1ib2woYm9vbCBDYW5CZVVubmFtZWQgPSB0cnVlKTsKKworICAgIE1DU3ltYm9sICpjcmVhdGVUZW1wU3ltYm9sKGNvbnN0IFR3aW5lICZOYW1lLCBib29sIEFsd2F5c0FkZFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENhbkJlVW5uYW1lZCA9IHRydWUpOworCisgICAgLy8vIENyZWF0ZSB0aGUgZGVmaW5pdGlvbiBvZiBhIGRpcmVjdGlvbmFsIGxvY2FsIHN5bWJvbCBmb3IgbnVtYmVyZWQgbGFiZWwKKyAgICAvLy8gKHVzZWQgZm9yICIxOiIgZGVmaW5pdGlvbnMpLgorICAgIE1DU3ltYm9sICpjcmVhdGVEaXJlY3Rpb25hbExvY2FsU3ltYm9sKHVuc2lnbmVkIExvY2FsTGFiZWxWYWwpOworCisgICAgLy8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgZGlyZWN0aW9uYWwgbG9jYWwgc3ltYm9sIGZvciBudW1iZXJlZCBsYWJlbCAodXNlZAorICAgIC8vLyBmb3IgIjFiIiBvciAxZiIgcmVmZXJlbmNlcykuCisgICAgTUNTeW1ib2wgKmdldERpcmVjdGlvbmFsTG9jYWxTeW1ib2wodW5zaWduZWQgTG9jYWxMYWJlbFZhbCwgYm9vbCBCZWZvcmUpOworCisgICAgLy8vIExvb2t1cCB0aGUgc3ltYm9sIGluc2lkZSB3aXRoIHRoZSBzcGVjaWZpZWQgXHAgTmFtZS4gIElmIGl0IGV4aXN0cywKKyAgICAvLy8gcmV0dXJuIGl0LiAgSWYgbm90LCBjcmVhdGUgYSBmb3J3YXJkIHJlZmVyZW5jZSBhbmQgcmV0dXJuIGl0LgorICAgIC8vLworICAgIC8vLyBccGFyYW0gTmFtZSAtIFRoZSBzeW1ib2wgbmFtZSwgd2hpY2ggbXVzdCBiZSB1bmlxdWUgYWNyb3NzIGFsbCBzeW1ib2xzLgorICAgIE1DU3ltYm9sICpnZXRPckNyZWF0ZVN5bWJvbChjb25zdCBUd2luZSAmTmFtZSk7CisKKyAgICAvLy8gR2V0cyBhIHN5bWJvbCB0aGF0IHdpbGwgYmUgZGVmaW5lZCB0byB0aGUgZmluYWwgc3RhY2sgb2Zmc2V0IG9mIGEgbG9jYWwKKyAgICAvLy8gdmFyaWFibGUgYWZ0ZXIgY29kZWdlbi4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIElkeCAtIFRoZSBpbmRleCBvZiBhIGxvY2FsIHZhcmlhYmxlIHBhc3NlZCB0byBAbGx2bS5sb2NhbGVzY2FwZS4KKyAgICBNQ1N5bWJvbCAqZ2V0T3JDcmVhdGVGcmFtZUFsbG9jU3ltYm9sKFN0cmluZ1JlZiBGdW5jTmFtZSwgdW5zaWduZWQgSWR4KTsKKworICAgIE1DU3ltYm9sICpnZXRPckNyZWF0ZVBhcmVudEZyYW1lT2Zmc2V0U3ltYm9sKFN0cmluZ1JlZiBGdW5jTmFtZSk7CisKKyAgICBNQ1N5bWJvbCAqZ2V0T3JDcmVhdGVMU0RBU3ltYm9sKFN0cmluZ1JlZiBGdW5jTmFtZSk7CisKKyAgICAvLy8gR2V0IHRoZSBzeW1ib2wgZm9yIFxwIE5hbWUsIG9yIG51bGwuCisgICAgTUNTeW1ib2wgKmxvb2t1cFN5bWJvbChjb25zdCBUd2luZSAmTmFtZSkgY29uc3Q7CisKKyAgICAvLy8gU2V0IHZhbHVlIGZvciBhIHN5bWJvbC4KKyAgICB2b2lkIHNldFN5bWJvbFZhbHVlKE1DU3RyZWFtZXIgJlN0cmVhbWVyLCBTdHJpbmdSZWYgU3ltLCB1aW50NjRfdCBWYWwpOworCisgICAgLy8vIGdldFN5bWJvbHMgLSBHZXQgYSByZWZlcmVuY2UgZm9yIHRoZSBzeW1ib2wgdGFibGUgZm9yIGNsaWVudHMgdGhhdAorICAgIC8vLyB3YW50IHRvLCBmb3IgZXhhbXBsZSwgaXRlcmF0ZSBvdmVyIGFsbCBzeW1ib2xzLiAnY29uc3QnIGJlY2F1c2Ugd2UKKyAgICAvLy8gc3RpbGwgd2FudCBhbnkgbW9kaWZpY2F0aW9ucyB0byB0aGUgdGFibGUgaXRzZWxmIHRvIHVzZSB0aGUgTUNDb250ZXh0CisgICAgLy8vIEFQSXMuCisgICAgY29uc3QgU3ltYm9sVGFibGUgJmdldFN5bWJvbHMoKSBjb25zdCB7IHJldHVybiBTeW1ib2xzOyB9CisKKyAgICAvLy8gQH0KKworICAgIC8vLyBcbmFtZSBTZWN0aW9uIE1hbmFnZW1lbnQKKyAgICAvLy8gQHsKKworICAgIGVudW0gOiB1bnNpZ25lZCB7CisgICAgICAvLy8gUGFzcyB0aGlzIHZhbHVlIGFzIHRoZSBVbmlxdWVJRCBkdXJpbmcgc2VjdGlvbiBjcmVhdGlvbiB0byBnZXQgdGhlCisgICAgICAvLy8gZ2VuZXJpYyBzZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGNoYXJhY3RlcmlzdGljcy4gVGhlIHVzdWFsCisgICAgICAvLy8gc2VjdGlvbnMgc3VjaCBhcyAudGV4dCB1c2UgdGhpcyBJRC4KKyAgICAgIEdlbmVyaWNTZWN0aW9uSUQgPSB+MFUKKyAgICB9OworCisgICAgLy8vIFJldHVybiB0aGUgTUNTZWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIG1hY2gtbyBzZWN0aW9uLiAgVGhpcyByZXF1aXJlcworICAgIC8vLyB0aGUgb3BlcmFuZHMgdG8gYmUgdmFsaWQuCisgICAgTUNTZWN0aW9uTWFjaE8gKmdldE1hY2hPU2VjdGlvbihTdHJpbmdSZWYgU2VnbWVudCwgU3RyaW5nUmVmIFNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUeXBlQW5kQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlc2VydmVkMiwgU2VjdGlvbktpbmQgSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkJlZ2luU3ltTmFtZSA9IG51bGxwdHIpOworCisgICAgTUNTZWN0aW9uTWFjaE8gKmdldE1hY2hPU2VjdGlvbihTdHJpbmdSZWYgU2VnbWVudCwgU3RyaW5nUmVmIFNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUeXBlQW5kQXR0cmlidXRlcywgU2VjdGlvbktpbmQgSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkJlZ2luU3ltTmFtZSA9IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBnZXRNYWNoT1NlY3Rpb24oU2VnbWVudCwgU2VjdGlvbiwgVHlwZUFuZEF0dHJpYnV0ZXMsIDAsIEssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlZ2luU3ltTmFtZSk7CisgICAgfQorCisgICAgTUNTZWN0aW9uRUxGICpnZXRFTEZTZWN0aW9uKGNvbnN0IFR3aW5lICZTZWN0aW9uLCB1bnNpZ25lZCBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGbGFncykgeworICAgICAgcmV0dXJuIGdldEVMRlNlY3Rpb24oU2VjdGlvbiwgVHlwZSwgRmxhZ3MsIDAsICIiKTsKKyAgICB9CisKKyAgICBNQ1NlY3Rpb25FTEYgKmdldEVMRlNlY3Rpb24oY29uc3QgVHdpbmUgJlNlY3Rpb24sIHVuc2lnbmVkIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzLCB1bnNpZ25lZCBFbnRyeVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZHcm91cCkgeworICAgICAgcmV0dXJuIGdldEVMRlNlY3Rpb24oU2VjdGlvbiwgVHlwZSwgRmxhZ3MsIEVudHJ5U2l6ZSwgR3JvdXAsIH4wKTsKKyAgICB9CisKKyAgICBNQ1NlY3Rpb25FTEYgKmdldEVMRlNlY3Rpb24oY29uc3QgVHdpbmUgJlNlY3Rpb24sIHVuc2lnbmVkIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzLCB1bnNpZ25lZCBFbnRyeVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZHcm91cCwgdW5zaWduZWQgVW5pcXVlSUQpIHsKKyAgICAgIHJldHVybiBnZXRFTEZTZWN0aW9uKFNlY3Rpb24sIFR5cGUsIEZsYWdzLCBFbnRyeVNpemUsIEdyb3VwLCBVbmlxdWVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIH0KKworICAgIE1DU2VjdGlvbkVMRiAqZ2V0RUxGU2VjdGlvbihjb25zdCBUd2luZSAmU2VjdGlvbiwgdW5zaWduZWQgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmxhZ3MsIHVuc2lnbmVkIEVudHJ5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJkdyb3VwLCB1bnNpZ25lZCBVbmlxdWVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2xFTEYgKkFzc29jaWF0ZWQpOworCisgICAgTUNTZWN0aW9uRUxGICpnZXRFTEZTZWN0aW9uKGNvbnN0IFR3aW5lICZTZWN0aW9uLCB1bnNpZ25lZCBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGbGFncywgdW5zaWduZWQgRW50cnlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbEVMRiAqR3JvdXAsIHVuc2lnbmVkIFVuaXF1ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbEVMRiAqQXNzb2NpYXRlZCk7CisKKyAgICAvLy8gR2V0IGEgc2VjdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBncm91cCBpZGVudGlmaWVyLiBUaGlzIHNlY3Rpb24gaXMKKyAgICAvLy8gbmFtZWQgYnkgY29uY2F0ZW5hdGluZyBccCBQcmVmaXggd2l0aCAnLicgdGhlbiBccCBTdWZmaXguIFRoZSBccCBUeXBlCisgICAgLy8vIGRlc2NyaWJlcyB0aGUgdHlwZSBvZiB0aGUgc2VjdGlvbiBhbmQgXHAgRmxhZ3MgYXJlIHVzZWQgdG8gZnVydGhlcgorICAgIC8vLyBjb25maWd1cmUgdGhpcyBuYW1lZCBzZWN0aW9uLgorICAgIE1DU2VjdGlvbkVMRiAqZ2V0RUxGTmFtZWRTZWN0aW9uKGNvbnN0IFR3aW5lICZQcmVmaXgsIGNvbnN0IFR3aW5lICZTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVHlwZSwgdW5zaWduZWQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRW50cnlTaXplID0gMCk7CisKKyAgICBNQ1NlY3Rpb25FTEYgKmNyZWF0ZUVMRlJlbFNlY3Rpb24oY29uc3QgVHdpbmUgJk5hbWUsIHVuc2lnbmVkIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzLCB1bnNpZ25lZCBFbnRyeVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sRUxGICpHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTZWN0aW9uRUxGICpSZWxJbmZvU2VjdGlvbik7CisKKyAgICB2b2lkIHJlbmFtZUVMRlNlY3Rpb24oTUNTZWN0aW9uRUxGICpTZWN0aW9uLCBTdHJpbmdSZWYgTmFtZSk7CisKKyAgICBNQ1NlY3Rpb25FTEYgKmNyZWF0ZUVMRkdyb3VwU2VjdGlvbihjb25zdCBNQ1N5bWJvbEVMRiAqR3JvdXApOworCisgICAgTUNTZWN0aW9uQ09GRiAqZ2V0Q09GRlNlY3Rpb24oU3RyaW5nUmVmIFNlY3Rpb24sIHVuc2lnbmVkIENoYXJhY3RlcmlzdGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZCBLaW5kLCBTdHJpbmdSZWYgQ09NREFUU3ltTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFVuaXF1ZUlEID0gR2VuZXJpY1NlY3Rpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpCZWdpblN5bU5hbWUgPSBudWxscHRyKTsKKworICAgIE1DU2VjdGlvbkNPRkYgKmdldENPRkZTZWN0aW9uKFN0cmluZ1JlZiBTZWN0aW9uLCB1bnNpZ25lZCBDaGFyYWN0ZXJpc3RpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbktpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpCZWdpblN5bU5hbWUgPSBudWxscHRyKTsKKworICAgIE1DU2VjdGlvbkNPRkYgKmdldENPRkZTZWN0aW9uKFN0cmluZ1JlZiBTZWN0aW9uKTsKKworICAgIC8vLyBHZXRzIG9yIGNyZWF0ZXMgYSBzZWN0aW9uIGVxdWl2YWxlbnQgdG8gU2VjIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgIC8vLyBzZWN0aW9uIGNvbnRhaW5pbmcgS2V5U3ltLiBGb3IgZXhhbXBsZSwgdG8gY3JlYXRlIGEgZGVidWcgaW5mbyBzZWN0aW9uCisgICAgLy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBpbmxpbmUgZnVuY3Rpb24sIHBhc3MgdGhlIG5vcm1hbCBkZWJ1ZyBpbmZvIHNlY3Rpb24KKyAgICAvLy8gYXMgU2VjIGFuZCB0aGUgZnVuY3Rpb24gc3ltYm9sIGFzIEtleVN5bS4KKyAgICBNQ1NlY3Rpb25DT0ZGICoKKyAgICBnZXRBc3NvY2lhdGl2ZUNPRkZTZWN0aW9uKE1DU2VjdGlvbkNPRkYgKlNlYywgY29uc3QgTUNTeW1ib2wgKktleVN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFVuaXF1ZUlEID0gR2VuZXJpY1NlY3Rpb25JRCk7CisKKyAgICBNQ1NlY3Rpb25XYXNtICpnZXRXYXNtU2VjdGlvbihjb25zdCBUd2luZSAmU2VjdGlvbiwgU2VjdGlvbktpbmQgSykgeworICAgICAgcmV0dXJuIGdldFdhc21TZWN0aW9uKFNlY3Rpb24sIEssIG51bGxwdHIpOworICAgIH0KKworICAgIE1DU2VjdGlvbldhc20gKmdldFdhc21TZWN0aW9uKGNvbnN0IFR3aW5lICZTZWN0aW9uLCBTZWN0aW9uS2luZCBLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkJlZ2luU3ltTmFtZSkgeworICAgICAgcmV0dXJuIGdldFdhc21TZWN0aW9uKFNlY3Rpb24sIEssICIiLCB+MCwgQmVnaW5TeW1OYW1lKTsKKyAgICB9CisKKyAgICBNQ1NlY3Rpb25XYXNtICpnZXRXYXNtU2VjdGlvbihjb25zdCBUd2luZSAmU2VjdGlvbiwgU2VjdGlvbktpbmQgSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmR3JvdXAsIHVuc2lnbmVkIFVuaXF1ZUlEKSB7CisgICAgICByZXR1cm4gZ2V0V2FzbVNlY3Rpb24oU2VjdGlvbiwgSywgR3JvdXAsIFVuaXF1ZUlELCBudWxscHRyKTsKKyAgICB9CisKKyAgICBNQ1NlY3Rpb25XYXNtICpnZXRXYXNtU2VjdGlvbihjb25zdCBUd2luZSAmU2VjdGlvbiwgU2VjdGlvbktpbmQgSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmR3JvdXAsIHVuc2lnbmVkIFVuaXF1ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkJlZ2luU3ltTmFtZSk7CisKKyAgICBNQ1NlY3Rpb25XYXNtICpnZXRXYXNtU2VjdGlvbihjb25zdCBUd2luZSAmU2VjdGlvbiwgU2VjdGlvbktpbmQgSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbFdhc20gKkdyb3VwLCB1bnNpZ25lZCBVbmlxdWVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpCZWdpblN5bU5hbWUpOworCisgICAgLy8gQ3JlYXRlIGFuZCBzYXZlIGEgY29weSBvZiBTVEkgYW5kIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgY29weS4KKyAgICBNQ1N1YnRhcmdldEluZm8gJmdldFN1YnRhcmdldENvcHkoY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEkpOworCisgICAgLy8vIEB9CisKKyAgICAvLy8gXG5hbWUgRHdhcmYgTWFuYWdlbWVudAorICAgIC8vLyBAeworCisgICAgLy8vIFxicmllZiBHZXQgdGhlIGNvbXBpbGF0aW9uIGRpcmVjdG9yeSBmb3IgRFdfQVRfY29tcF9kaXIKKyAgICAvLy8gVGhlIGNvbXBpbGF0aW9uIGRpcmVjdG9yeSBzaG91bGQgYmUgc2V0IHdpdGggXGMgc2V0Q29tcGlsYXRpb25EaXIgYmVmb3JlCisgICAgLy8vIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gSWYgaXQgaXMgdW5zZXQsIGFuIGVtcHR5IHN0cmluZyB3aWxsIGJlIHJldHVybmVkLgorICAgIFN0cmluZ1JlZiBnZXRDb21waWxhdGlvbkRpcigpIGNvbnN0IHsgcmV0dXJuIENvbXBpbGF0aW9uRGlyOyB9CisKKyAgICAvLy8gXGJyaWVmIFNldCB0aGUgY29tcGlsYXRpb24gZGlyZWN0b3J5IGZvciBEV19BVF9jb21wX2RpcgorICAgIHZvaWQgc2V0Q29tcGlsYXRpb25EaXIoU3RyaW5nUmVmIFMpIHsgQ29tcGlsYXRpb25EaXIgPSBTLnN0cigpOyB9CisKKyAgICAvLy8gXGJyaWVmIEdldCB0aGUgbWFpbiBmaWxlIG5hbWUgZm9yIHVzZSBpbiBlcnJvciBtZXNzYWdlcyBhbmQgZGVidWcKKyAgICAvLy8gaW5mby4gVGhpcyBjYW4gYmUgc2V0IHRvIGVuc3VyZSB3ZSd2ZSBnb3QgdGhlIGNvcnJlY3QgZmlsZSBuYW1lCisgICAgLy8vIGFmdGVyIHByZXByb2Nlc3Npbmcgb3IgZm9yIC1zYXZlLXRlbXBzLgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRNYWluRmlsZU5hbWUoKSBjb25zdCB7IHJldHVybiBNYWluRmlsZU5hbWU7IH0KKworICAgIC8vLyBcYnJpZWYgU2V0IHRoZSBtYWluIGZpbGUgbmFtZSBhbmQgb3ZlcnJpZGUgdGhlIGRlZmF1bHQuCisgICAgdm9pZCBzZXRNYWluRmlsZU5hbWUoU3RyaW5nUmVmIFMpIHsgTWFpbkZpbGVOYW1lID0gUzsgfQorCisgICAgLy8vIENyZWF0ZXMgYW4gZW50cnkgaW4gdGhlIGR3YXJmIGZpbGUgYW5kIGRpcmVjdG9yeSB0YWJsZXMuCisgICAgRXhwZWN0ZWQ8dW5zaWduZWQ+IGdldER3YXJmRmlsZShTdHJpbmdSZWYgRGlyZWN0b3J5LCBTdHJpbmdSZWYgRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGaWxlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUQ1OjpNRDVSZXN1bHQgKkNoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8U3RyaW5nUmVmPiBTb3VyY2UsIHVuc2lnbmVkIENVSUQpOworCisgICAgYm9vbCBpc1ZhbGlkRHdhcmZGaWxlTnVtYmVyKHVuc2lnbmVkIEZpbGVOdW1iZXIsIHVuc2lnbmVkIENVSUQgPSAwKTsKKworICAgIGNvbnN0IHN0ZDo6bWFwPHVuc2lnbmVkLCBNQ0R3YXJmTGluZVRhYmxlPiAmZ2V0TUNEd2FyZkxpbmVUYWJsZXMoKSBjb25zdCB7CisgICAgICByZXR1cm4gTUNEd2FyZkxpbmVUYWJsZXNDVU1hcDsKKyAgICB9CisKKyAgICBNQ0R3YXJmTGluZVRhYmxlICZnZXRNQ0R3YXJmTGluZVRhYmxlKHVuc2lnbmVkIENVSUQpIHsKKyAgICAgIHJldHVybiBNQ0R3YXJmTGluZVRhYmxlc0NVTWFwW0NVSURdOworICAgIH0KKworICAgIGNvbnN0IE1DRHdhcmZMaW5lVGFibGUgJmdldE1DRHdhcmZMaW5lVGFibGUodW5zaWduZWQgQ1VJRCkgY29uc3QgeworICAgICAgYXV0byBJID0gTUNEd2FyZkxpbmVUYWJsZXNDVU1hcC5maW5kKENVSUQpOworICAgICAgYXNzZXJ0KEkgIT0gTUNEd2FyZkxpbmVUYWJsZXNDVU1hcC5lbmQoKSk7CisgICAgICByZXR1cm4gSS0+c2Vjb25kOworICAgIH0KKworICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNQ0R3YXJmRmlsZT4gJmdldE1DRHdhcmZGaWxlcyh1bnNpZ25lZCBDVUlEID0gMCkgeworICAgICAgcmV0dXJuIGdldE1DRHdhcmZMaW5lVGFibGUoQ1VJRCkuZ2V0TUNEd2FyZkZpbGVzKCk7CisgICAgfQorCisgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPHN0ZDo6c3RyaW5nPiAmZ2V0TUNEd2FyZkRpcnModW5zaWduZWQgQ1VJRCA9IDApIHsKKyAgICAgIHJldHVybiBnZXRNQ0R3YXJmTGluZVRhYmxlKENVSUQpLmdldE1DRHdhcmZEaXJzKCk7CisgICAgfQorCisgICAgYm9vbCBoYXNNQ0xpbmVTZWN0aW9ucygpIGNvbnN0IHsKKyAgICAgIGZvciAoY29uc3QgYXV0byAmVGFibGUgOiBNQ0R3YXJmTGluZVRhYmxlc0NVTWFwKQorICAgICAgICBpZiAoIVRhYmxlLnNlY29uZC5nZXRNQ0R3YXJmRmlsZXMoKS5lbXB0eSgpIHx8IFRhYmxlLnNlY29uZC5nZXRMYWJlbCgpKQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVuc2lnbmVkIGdldER3YXJmQ29tcGlsZVVuaXRJRCgpIHsgcmV0dXJuIER3YXJmQ29tcGlsZVVuaXRJRDsgfQorCisgICAgdm9pZCBzZXREd2FyZkNvbXBpbGVVbml0SUQodW5zaWduZWQgQ1VJbmRleCkgeworICAgICAgRHdhcmZDb21waWxlVW5pdElEID0gQ1VJbmRleDsKKyAgICB9CisKKyAgICAvLy8gU3BlY2lmaWVzIHRoZSAicm9vdCIgZmlsZSBhbmQgZGlyZWN0b3J5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LgorICAgIC8vLyBUaGVzZSBhcmUgImZpbGUgMCIgYW5kICJkaXJlY3RvcnkgMCIgaW4gRFdBUkYgdjUuCisgICAgdm9pZCBzZXRNQ0xpbmVUYWJsZVJvb3RGaWxlKHVuc2lnbmVkIENVSUQsIFN0cmluZ1JlZiBDb21waWxhdGlvbkRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVuYW1lLCBNRDU6Ok1ENVJlc3VsdCAqQ2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPFN0cmluZ1JlZj4gU291cmNlKSB7CisgICAgICBnZXRNQ0R3YXJmTGluZVRhYmxlKENVSUQpLnNldFJvb3RGaWxlKENvbXBpbGF0aW9uRGlyLCBGaWxlbmFtZSwgQ2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSk7CisgICAgfQorCisgICAgLy8vIFNhdmVzIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjdXJyZW50bHkgcGFyc2VkIGR3YXJmIC5sb2MgZGlyZWN0aXZlCisgICAgLy8vIGFuZCBzZXRzIER3YXJmTG9jU2Vlbi4gIFdoZW4gdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgYXNzZW1ibGVkIGFuIGVudHJ5CisgICAgLy8vIGluIHRoZSBsaW5lIG51bWJlciB0YWJsZSB3aXRoIHRoaXMgaW5mb3JtYXRpb24gYW5kIHRoZSBhZGRyZXNzIG9mIHRoZQorICAgIC8vLyBpbnN0cnVjdGlvbiB3aWxsIGJlIGNyZWF0ZWQuCisgICAgdm9pZCBzZXRDdXJyZW50RHdhcmZMb2ModW5zaWduZWQgRmlsZU51bSwgdW5zaWduZWQgTGluZSwgdW5zaWduZWQgQ29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzLCB1bnNpZ25lZCBJc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGlzY3JpbWluYXRvcikgeworICAgICAgQ3VycmVudER3YXJmTG9jLnNldEZpbGVOdW0oRmlsZU51bSk7CisgICAgICBDdXJyZW50RHdhcmZMb2Muc2V0TGluZShMaW5lKTsKKyAgICAgIEN1cnJlbnREd2FyZkxvYy5zZXRDb2x1bW4oQ29sdW1uKTsKKyAgICAgIEN1cnJlbnREd2FyZkxvYy5zZXRGbGFncyhGbGFncyk7CisgICAgICBDdXJyZW50RHdhcmZMb2Muc2V0SXNhKElzYSk7CisgICAgICBDdXJyZW50RHdhcmZMb2Muc2V0RGlzY3JpbWluYXRvcihEaXNjcmltaW5hdG9yKTsKKyAgICAgIER3YXJmTG9jU2VlbiA9IHRydWU7CisgICAgfQorCisgICAgdm9pZCBjbGVhckR3YXJmTG9jU2VlbigpIHsgRHdhcmZMb2NTZWVuID0gZmFsc2U7IH0KKworICAgIGJvb2wgZ2V0RHdhcmZMb2NTZWVuKCkgeyByZXR1cm4gRHdhcmZMb2NTZWVuOyB9CisgICAgY29uc3QgTUNEd2FyZkxvYyAmZ2V0Q3VycmVudER3YXJmTG9jKCkgeyByZXR1cm4gQ3VycmVudER3YXJmTG9jOyB9CisKKyAgICBib29sIGdldEdlbkR3YXJmRm9yQXNzZW1ibHkoKSB7IHJldHVybiBHZW5Ed2FyZkZvckFzc2VtYmx5OyB9CisgICAgdm9pZCBzZXRHZW5Ed2FyZkZvckFzc2VtYmx5KGJvb2wgVmFsdWUpIHsgR2VuRHdhcmZGb3JBc3NlbWJseSA9IFZhbHVlOyB9CisgICAgdW5zaWduZWQgZ2V0R2VuRHdhcmZGaWxlTnVtYmVyKCkgeyByZXR1cm4gR2VuRHdhcmZGaWxlTnVtYmVyOyB9CisKKyAgICB2b2lkIHNldEdlbkR3YXJmRmlsZU51bWJlcih1bnNpZ25lZCBGaWxlTnVtYmVyKSB7CisgICAgICBHZW5Ed2FyZkZpbGVOdW1iZXIgPSBGaWxlTnVtYmVyOworICAgIH0KKworICAgIGNvbnN0IFNldFZlY3RvcjxNQ1NlY3Rpb24gKj4gJmdldEdlbkR3YXJmU2VjdGlvblN5bXMoKSB7CisgICAgICByZXR1cm4gU2VjdGlvbnNGb3JSYW5nZXM7CisgICAgfQorCisgICAgYm9vbCBhZGRHZW5Ed2FyZlNlY3Rpb24oTUNTZWN0aW9uICpTZWMpIHsKKyAgICAgIHJldHVybiBTZWN0aW9uc0ZvclJhbmdlcy5pbnNlcnQoU2VjKTsKKyAgICB9CisKKyAgICB2b2lkIGZpbmFsaXplRHdhcmZTZWN0aW9ucyhNQ1N0cmVhbWVyICZNQ09TKTsKKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1DR2VuRHdhcmZMYWJlbEVudHJ5PiAmZ2V0TUNHZW5Ed2FyZkxhYmVsRW50cmllcygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBNQ0dlbkR3YXJmTGFiZWxFbnRyaWVzOworICAgIH0KKworICAgIHZvaWQgYWRkTUNHZW5Ed2FyZkxhYmVsRW50cnkoY29uc3QgTUNHZW5Ed2FyZkxhYmVsRW50cnkgJkUpIHsKKyAgICAgIE1DR2VuRHdhcmZMYWJlbEVudHJpZXMucHVzaF9iYWNrKEUpOworICAgIH0KKworICAgIHZvaWQgc2V0RHdhcmZEZWJ1Z0ZsYWdzKFN0cmluZ1JlZiBTKSB7IER3YXJmRGVidWdGbGFncyA9IFM7IH0KKyAgICBTdHJpbmdSZWYgZ2V0RHdhcmZEZWJ1Z0ZsYWdzKCkgeyByZXR1cm4gRHdhcmZEZWJ1Z0ZsYWdzOyB9CisKKyAgICB2b2lkIHNldER3YXJmRGVidWdQcm9kdWNlcihTdHJpbmdSZWYgUykgeyBEd2FyZkRlYnVnUHJvZHVjZXIgPSBTOyB9CisgICAgU3RyaW5nUmVmIGdldER3YXJmRGVidWdQcm9kdWNlcigpIHsgcmV0dXJuIER3YXJmRGVidWdQcm9kdWNlcjsgfQorCisgICAgZHdhcmY6OkR3YXJmRm9ybWF0IGdldER3YXJmRm9ybWF0KCkgY29uc3QgeworICAgICAgLy8gVE9ETzogU3VwcG9ydCBEV0FSRjY0CisgICAgICByZXR1cm4gZHdhcmY6OkRXQVJGMzI7CisgICAgfQorCisgICAgdm9pZCBzZXREd2FyZlZlcnNpb24odWludDE2X3QgdikgeyBEd2FyZlZlcnNpb24gPSB2OyB9CisgICAgdWludDE2X3QgZ2V0RHdhcmZWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZWZXJzaW9uOyB9CisKKyAgICAvLy8gQH0KKworICAgIGNoYXIgKmdldFNlY3VyZUxvZ0ZpbGUoKSB7IHJldHVybiBTZWN1cmVMb2dGaWxlOyB9CisgICAgcmF3X2ZkX29zdHJlYW0gKmdldFNlY3VyZUxvZygpIHsgcmV0dXJuIFNlY3VyZUxvZy5nZXQoKTsgfQorCisgICAgdm9pZCBzZXRTZWN1cmVMb2coc3RkOjp1bmlxdWVfcHRyPHJhd19mZF9vc3RyZWFtPiBWYWx1ZSkgeworICAgICAgU2VjdXJlTG9nID0gc3RkOjptb3ZlKFZhbHVlKTsKKyAgICB9CisKKyAgICBib29sIGdldFNlY3VyZUxvZ1VzZWQoKSB7IHJldHVybiBTZWN1cmVMb2dVc2VkOyB9CisgICAgdm9pZCBzZXRTZWN1cmVMb2dVc2VkKGJvb2wgVmFsdWUpIHsgU2VjdXJlTG9nVXNlZCA9IFZhbHVlOyB9CisKKyAgICB2b2lkICphbGxvY2F0ZSh1bnNpZ25lZCBTaXplLCB1bnNpZ25lZCBBbGlnbiA9IDgpIHsKKyAgICAgIHJldHVybiBBbGxvY2F0b3IuQWxsb2NhdGUoU2l6ZSwgQWxpZ24pOworICAgIH0KKworICAgIHZvaWQgZGVhbGxvY2F0ZSh2b2lkICpQdHIpIHt9CisKKyAgICBib29sIGhhZEVycm9yKCkgeyByZXR1cm4gSGFkRXJyb3I7IH0KKyAgICB2b2lkIHJlcG9ydEVycm9yKFNNTG9jIEwsIGNvbnN0IFR3aW5lICZNc2cpOworICAgIC8vIFVucmVjb3ZlcmFibGUgZXJyb3IgaGFzIG9jY3VycmVkLiBEaXNwbGF5IHRoZSBiZXN0IGRpYWdub3N0aWMgd2UgY2FuCisgICAgLy8gYW5kIGJhaWwgdmlhIGV4aXQoMSkuIEZvciBub3csIG1vc3QgTUMgYmFja2VuZCBlcnJvcnMgYXJlIHVucmVjb3ZlcmFibGUuCisgICAgLy8gRklYTUU6IFdlIHNob3VsZCByZWFsbHkgZG8gc29tZXRoaW5nIGFib3V0IHRoYXQuCisgICAgTExWTV9BVFRSSUJVVEVfTk9SRVRVUk4gdm9pZCByZXBvcnRGYXRhbEVycm9yKFNNTG9jIEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZNc2cpOworCisgICAgY29uc3QgTUNBc21NYWNybyAqbG9va3VwTWFjcm8oU3RyaW5nUmVmIE5hbWUpIHsKKyAgICAgIFN0cmluZ01hcDxNQ0FzbU1hY3JvPjo6aXRlcmF0b3IgSSA9IE1hY3JvTWFwLmZpbmQoTmFtZSk7CisgICAgICByZXR1cm4gKEkgPT0gTWFjcm9NYXAuZW5kKCkpID8gbnVsbHB0ciA6ICZJLT5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgZGVmaW5lTWFjcm8oU3RyaW5nUmVmIE5hbWUsIE1DQXNtTWFjcm8gTWFjcm8pIHsKKyAgICAgIE1hY3JvTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihOYW1lLCBzdGQ6Om1vdmUoTWFjcm8pKSk7CisgICAgfQorCisgICAgdm9pZCB1bmRlZmluZU1hY3JvKFN0cmluZ1JlZiBOYW1lKSB7IE1hY3JvTWFwLmVyYXNlKE5hbWUpOyB9CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKy8vIG9wZXJhdG9yIG5ldyBhbmQgZGVsZXRlIGFyZW4ndCBhbGxvd2VkIGluc2lkZSBuYW1lc3BhY2VzLgorLy8gVGhlIHRocm93IHNwZWNpZmljYXRpb25zIGFyZSBtYW5kYXRlZCBieSB0aGUgc3RhbmRhcmQuCisvLy8gXGJyaWVmIFBsYWNlbWVudCBuZXcgZm9yIHVzaW5nIHRoZSBNQ0NvbnRleHQncyBhbGxvY2F0b3IuCisvLy8KKy8vLyBUaGlzIHBsYWNlbWVudCBmb3JtIG9mIG9wZXJhdG9yIG5ldyB1c2VzIHRoZSBNQ0NvbnRleHQncyBhbGxvY2F0b3IgZm9yCisvLy8gb2J0YWluaW5nIG1lbW9yeS4gSXQgaXMgYSBub24tdGhyb3dpbmcgbmV3LCB3aGljaCBtZWFucyB0aGF0IGl0IHJldHVybnMKKy8vLyBudWxsIG9uIGVycm9yLiAoSWYgdGhhdCBpcyB3aGF0IHRoZSBhbGxvY2F0b3IgZG9lcy4gVGhlIGN1cnJlbnQgZG9lcywgc28gaWYKKy8vLyB0aGlzIGV2ZXIgY2hhbmdlcywgdGhpcyBvcGVyYXRvciB3aWxsIGhhdmUgdG8gYmUgY2hhbmdlZCwgdG9vLikKKy8vLyBVc2FnZSBsb29rcyBsaWtlIHRoaXMgKGFzc3VtaW5nIHRoZXJlJ3MgYW4gTUNDb250ZXh0ICdDb250ZXh0JyBpbiBzY29wZSk6CisvLy8gXGNvZGUKKy8vLyAvLyBEZWZhdWx0IGFsaWdubWVudCAoOCkKKy8vLyBJbnRlZ2VyTGl0ZXJhbCAqRXggPSBuZXcgKENvbnRleHQpIEludGVnZXJMaXRlcmFsKGFyZ3VtZW50cyk7CisvLy8gLy8gU3BlY2lmaWMgYWxpZ25tZW50CisvLy8gSW50ZWdlckxpdGVyYWwgKkV4MiA9IG5ldyAoQ29udGV4dCwgNCkgSW50ZWdlckxpdGVyYWwoYXJndW1lbnRzKTsKKy8vLyBcZW5kY29kZQorLy8vIFBsZWFzZSBub3RlIHRoYXQgeW91IGNhbm5vdCB1c2UgZGVsZXRlIG9uIHRoZSBwb2ludGVyOyBpdCBtdXN0IGJlCisvLy8gZGVhbGxvY2F0ZWQgdXNpbmcgYW4gZXhwbGljaXQgZGVzdHJ1Y3RvciBjYWxsIGZvbGxvd2VkIGJ5CisvLy8gXGMgQ29udGV4dC5EZWFsbG9jYXRlKFB0cikuCisvLy8KKy8vLyBccGFyYW0gQnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZS4gQ2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIuCisvLy8gXHBhcmFtIEMgVGhlIE1DQ29udGV4dCB0aGF0IHByb3ZpZGVzIHRoZSBhbGxvY2F0b3IuCisvLy8gXHBhcmFtIEFsaWdubWVudCBUaGUgYWxpZ25tZW50IG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IChpZiB0aGUgdW5kZXJseWluZworLy8vICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yIHN1cHBvcnRzIGl0KS4KKy8vLyBccmV0dXJuIFRoZSBhbGxvY2F0ZWQgbWVtb3J5LiBDb3VsZCBiZSBOVUxMLgoraW5saW5lIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgQnl0ZXMsIGxsdm06Ok1DQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEFsaWdubWVudCA9IDgpIG5vZXhjZXB0IHsKKyAgcmV0dXJuIEMuYWxsb2NhdGUoQnl0ZXMsIEFsaWdubWVudCk7Cit9CisvLy8gXGJyaWVmIFBsYWNlbWVudCBkZWxldGUgY29tcGFuaW9uIHRvIHRoZSBuZXcgYWJvdmUuCisvLy8KKy8vLyBUaGlzIG9wZXJhdG9yIGlzIGp1c3QgYSBjb21wYW5pb24gdG8gdGhlIG5ldyBhYm92ZS4gVGhlcmUgaXMgbm8gd2F5IG9mCisvLy8gaW52b2tpbmcgaXQgZGlyZWN0bHk7IHNlZSB0aGUgbmV3IG9wZXJhdG9yIGZvciBtb3JlIGRldGFpbHMuIFRoaXMgb3BlcmF0b3IKKy8vLyBpcyBjYWxsZWQgaW1wbGljaXRseSBieSB0aGUgY29tcGlsZXIgaWYgYSBwbGFjZW1lbnQgbmV3IGV4cHJlc3Npb24gdXNpbmcKKy8vLyB0aGUgTUNDb250ZXh0IHRocm93cyBpbiB0aGUgb2JqZWN0IGNvbnN0cnVjdG9yLgoraW5saW5lIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKlB0ciwgbGx2bTo6TUNDb250ZXh0ICZDLCBzaXplX3QpIG5vZXhjZXB0IHsKKyAgQy5kZWFsbG9jYXRlKFB0cik7Cit9CisKKy8vLyBUaGlzIHBsYWNlbWVudCBmb3JtIG9mIG9wZXJhdG9yIG5ld1tdIHVzZXMgdGhlIE1DQ29udGV4dCdzIGFsbG9jYXRvciBmb3IKKy8vLyBvYnRhaW5pbmcgbWVtb3J5LiBJdCBpcyBhIG5vbi10aHJvd2luZyBuZXdbXSwgd2hpY2ggbWVhbnMgdGhhdCBpdCByZXR1cm5zCisvLy8gbnVsbCBvbiBlcnJvci4KKy8vLyBVc2FnZSBsb29rcyBsaWtlIHRoaXMgKGFzc3VtaW5nIHRoZXJlJ3MgYW4gTUNDb250ZXh0ICdDb250ZXh0JyBpbiBzY29wZSk6CisvLy8gXGNvZGUKKy8vLyAvLyBEZWZhdWx0IGFsaWdubWVudCAoOCkKKy8vLyBjaGFyICpkYXRhID0gbmV3IChDb250ZXh0KSBjaGFyWzEwXTsKKy8vLyAvLyBTcGVjaWZpYyBhbGlnbm1lbnQKKy8vLyBjaGFyICpkYXRhID0gbmV3IChDb250ZXh0LCA0KSBjaGFyWzEwXTsKKy8vLyBcZW5kY29kZQorLy8vIFBsZWFzZSBub3RlIHRoYXQgeW91IGNhbm5vdCB1c2UgZGVsZXRlIG9uIHRoZSBwb2ludGVyOyBpdCBtdXN0IGJlCisvLy8gZGVhbGxvY2F0ZWQgdXNpbmcgYW4gZXhwbGljaXQgZGVzdHJ1Y3RvciBjYWxsIGZvbGxvd2VkIGJ5CisvLy8gXGMgQ29udGV4dC5EZWFsbG9jYXRlKFB0cikuCisvLy8KKy8vLyBccGFyYW0gQnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZS4gQ2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIuCisvLy8gXHBhcmFtIEMgVGhlIE1DQ29udGV4dCB0aGF0IHByb3ZpZGVzIHRoZSBhbGxvY2F0b3IuCisvLy8gXHBhcmFtIEFsaWdubWVudCBUaGUgYWxpZ25tZW50IG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IChpZiB0aGUgdW5kZXJseWluZworLy8vICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yIHN1cHBvcnRzIGl0KS4KKy8vLyBccmV0dXJuIFRoZSBhbGxvY2F0ZWQgbWVtb3J5LiBDb3VsZCBiZSBOVUxMLgoraW5saW5lIHZvaWQgKm9wZXJhdG9yIG5ld1tdKHNpemVfdCBCeXRlcywgbGx2bTo6TUNDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBBbGlnbm1lbnQgPSA4KSBub2V4Y2VwdCB7CisgIHJldHVybiBDLmFsbG9jYXRlKEJ5dGVzLCBBbGlnbm1lbnQpOworfQorCisvLy8gXGJyaWVmIFBsYWNlbWVudCBkZWxldGVbXSBjb21wYW5pb24gdG8gdGhlIG5ld1tdIGFib3ZlLgorLy8vCisvLy8gVGhpcyBvcGVyYXRvciBpcyBqdXN0IGEgY29tcGFuaW9uIHRvIHRoZSBuZXdbXSBhYm92ZS4gVGhlcmUgaXMgbm8gd2F5IG9mCisvLy8gaW52b2tpbmcgaXQgZGlyZWN0bHk7IHNlZSB0aGUgbmV3W10gb3BlcmF0b3IgZm9yIG1vcmUgZGV0YWlscy4gVGhpcyBvcGVyYXRvcgorLy8vIGlzIGNhbGxlZCBpbXBsaWNpdGx5IGJ5IHRoZSBjb21waWxlciBpZiBhIHBsYWNlbWVudCBuZXdbXSBleHByZXNzaW9uIHVzaW5nCisvLy8gdGhlIE1DQ29udGV4dCB0aHJvd3MgaW4gdGhlIG9iamVjdCBjb25zdHJ1Y3Rvci4KK2lubGluZSB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQgKlB0ciwgbGx2bTo6TUNDb250ZXh0ICZDKSBub2V4Y2VwdCB7CisgIEMuZGVhbGxvY2F0ZShQdHIpOworfQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ0NPTlRFWFRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0RpcmVjdGl2ZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNEaXJlY3RpdmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3NGIxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNEaXJlY3RpdmVzLmgKQEAgLTAsMCArMSw3MyBAQAorLy89PT0tIE1DRGlyZWN0aXZlcy5oIC0gRW51bXMgZm9yIGRpcmVjdGl2ZXMgb24gdmFyaW91cyB0YXJnZXRzIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB2YXJpb3VzIGVudW1zIHRoYXQgcmVwcmVzZW50IHRhcmdldC1zcGVjaWZpYyBkaXJlY3RpdmVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0RJUkVDVElWRVNfSAorI2RlZmluZSBMTFZNX01DX01DRElSRUNUSVZFU19ICisKK25hbWVzcGFjZSBsbHZtIHsKKworZW51bSBNQ1N5bWJvbEF0dHIgeworICBNQ1NBX0ludmFsaWQgPSAwLCAgICAvLy88IE5vdCBhIHZhbGlkIGRpcmVjdGl2ZS4KKworICAvLyBWYXJpb3VzIGRpcmVjdGl2ZXMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgorICBNQ1NBX0VMRl9UeXBlRnVuY3Rpb24sICAgIC8vLzwgLnR5cGUgX2ZvbywgU1RUX0ZVTkMgICMgYWthIEBmdW5jdGlvbgorICBNQ1NBX0VMRl9UeXBlSW5kRnVuY3Rpb24sIC8vLzwgLnR5cGUgX2ZvbywgU1RUX0dOVV9JRlVOQworICBNQ1NBX0VMRl9UeXBlT2JqZWN0LCAgICAgIC8vLzwgLnR5cGUgX2ZvbywgU1RUX09CSkVDVCAgIyBha2EgQG9iamVjdAorICBNQ1NBX0VMRl9UeXBlVExTLCAgICAgICAgIC8vLzwgLnR5cGUgX2ZvbywgU1RUX1RMUyAgICAgIyBha2EgQHRsc19vYmplY3QKKyAgTUNTQV9FTEZfVHlwZUNvbW1vbiwgICAgICAvLy88IC50eXBlIF9mb28sIFNUVF9DT01NT04gICMgYWthIEBjb21tb24KKyAgTUNTQV9FTEZfVHlwZU5vVHlwZSwgICAgICAvLy88IC50eXBlIF9mb28sIFNUVF9OT1RZUEUgICMgYWthIEBub3R5cGUKKyAgTUNTQV9FTEZfVHlwZUdudVVuaXF1ZU9iamVjdCwgLy8vIC50eXBlIF9mb28sIEBnbnVfdW5pcXVlX29iamVjdAorICBNQ1NBX0dsb2JhbCwgICAgICAgICAgICAgIC8vLzwgLmdsb2JsCisgIE1DU0FfSGlkZGVuLCAgICAgICAgICAgICAgLy8vPCAuaGlkZGVuIChFTEYpCisgIE1DU0FfSW5kaXJlY3RTeW1ib2wsICAgICAgLy8vPCAuaW5kaXJlY3Rfc3ltYm9sIChNYWNoTykKKyAgTUNTQV9JbnRlcm5hbCwgICAgICAgICAgICAvLy88IC5pbnRlcm5hbCAoRUxGKQorICBNQ1NBX0xhenlSZWZlcmVuY2UsICAgICAgIC8vLzwgLmxhenlfcmVmZXJlbmNlIChNYWNoTykKKyAgTUNTQV9Mb2NhbCwgICAgICAgICAgICAgICAvLy88IC5sb2NhbCAoRUxGKQorICBNQ1NBX05vRGVhZFN0cmlwLCAgICAgICAgIC8vLzwgLm5vX2RlYWRfc3RyaXAgKE1hY2hPKQorICBNQ1NBX1N5bWJvbFJlc29sdmVyLCAgICAgIC8vLzwgLnN5bWJvbF9yZXNvbHZlciAoTWFjaE8pCisgIE1DU0FfQWx0RW50cnksICAgICAgICAgICAgLy8vPCAuYWx0X2VudHJ5IChNYWNoTykKKyAgTUNTQV9Qcml2YXRlRXh0ZXJuLCAgICAgICAvLy88IC5wcml2YXRlX2V4dGVybiAoTWFjaE8pCisgIE1DU0FfUHJvdGVjdGVkLCAgICAgICAgICAgLy8vPCAucHJvdGVjdGVkIChFTEYpCisgIE1DU0FfUmVmZXJlbmNlLCAgICAgICAgICAgLy8vPCAucmVmZXJlbmNlIChNYWNoTykKKyAgTUNTQV9XZWFrLCAgICAgICAgICAgICAgICAvLy88IC53ZWFrCisgIE1DU0FfV2Vha0RlZmluaXRpb24sICAgICAgLy8vPCAud2Vha19kZWZpbml0aW9uIChNYWNoTykKKyAgTUNTQV9XZWFrUmVmZXJlbmNlLCAgICAgICAvLy88IC53ZWFrX3JlZmVyZW5jZSAoTWFjaE8pCisgIE1DU0FfV2Vha0RlZkF1dG9Qcml2YXRlICAgLy8vPCAud2Vha19kZWZfY2FuX2JlX2hpZGRlbiAoTWFjaE8pCit9OworCitlbnVtIE1DQXNzZW1ibGVyRmxhZyB7CisgIE1DQUZfU3ludGF4VW5pZmllZCwgICAgICAgICAvLy88IC5zeW50YXggKEFSTS9FTEYpCisgIE1DQUZfU3Vic2VjdGlvbnNWaWFTeW1ib2xzLCAvLy88IC5zdWJzZWN0aW9uc192aWFfc3ltYm9scyAoTWFjaE8pCisgIE1DQUZfQ29kZTE2LCAgICAgICAgICAgICAgICAvLy88IC5jb2RlMTYgKFg4NikgLyAuY29kZSAxNiAoQVJNKQorICBNQ0FGX0NvZGUzMiwgICAgICAgICAgICAgICAgLy8vPCAuY29kZTMyIChYODYpIC8gLmNvZGUgMzIgKEFSTSkKKyAgTUNBRl9Db2RlNjQgICAgICAgICAgICAgICAgIC8vLzwgLmNvZGU2NCAoWDg2KQorfTsKKworZW51bSBNQ0RhdGFSZWdpb25UeXBlIHsKKyAgTUNEUl9EYXRhUmVnaW9uLCAgICAgICAgICAgIC8vLzwgLmRhdGFfcmVnaW9uCisgIE1DRFJfRGF0YVJlZ2lvbkpUOCwgICAgICAgICAvLy88IC5kYXRhX3JlZ2lvbiBqdDgKKyAgTUNEUl9EYXRhUmVnaW9uSlQxNiwgICAgICAgIC8vLzwgLmRhdGFfcmVnaW9uIGp0MTYKKyAgTUNEUl9EYXRhUmVnaW9uSlQzMiwgICAgICAgIC8vLzwgLmRhdGFfcmVnaW9uIGp0MzIKKyAgTUNEUl9EYXRhUmVnaW9uRW5kICAgICAgICAgIC8vLzwgLmVuZF9kYXRhX3JlZ2lvbgorfTsKKworZW51bSBNQ1ZlcnNpb25NaW5UeXBlIHsKKyAgTUNWTV9JT1NWZXJzaW9uTWluLCAgICAgICAgIC8vLzwgLmlvc192ZXJzaW9uX21pbgorICBNQ1ZNX09TWFZlcnNpb25NaW4sICAgICAgICAgLy8vPCAubWFjb3N4X3ZlcnNpb25fbWluCisgIE1DVk1fVHZPU1ZlcnNpb25NaW4sICAgICAgICAvLy88IC50dm9zX3ZlcnNpb25fbWluCisgIE1DVk1fV2F0Y2hPU1ZlcnNpb25NaW4sICAgICAvLy88IC53YXRjaG9zX3ZlcnNpb25fbWluCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNEaXNhc3NlbWJsZXIvTUNEaXNhc3NlbWJsZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNEaXNhc3NlbWJsZXIvTUNEaXNhc3NlbWJsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjA5YzA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0Rpc2Fzc2VtYmxlci9NQ0Rpc2Fzc2VtYmxlci5oCkBAIC0wLDAgKzEsMTE1IEBACisvLz09PS0gbGx2bS9NQy9NQ0Rpc2Fzc2VtYmxlci5oIC0gRGlzYXNzZW1ibGVyIGludGVyZmFjZSAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNESVNBU1NFTUJMRVJfTUNESVNBU1NFTUJMRVJfSAorI2RlZmluZSBMTFZNX01DX01DRElTQVNTRU1CTEVSX01DRElTQVNTRU1CTEVSX0gKKworI2luY2x1ZGUgImxsdm0vTUMvTUNEaXNhc3NlbWJsZXIvTUNTeW1ib2xpemVyLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEFycmF5UmVmOworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNJbnN0OworY2xhc3MgTUNTdWJ0YXJnZXRJbmZvOworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vLyBTdXBlcmNsYXNzIGZvciBhbGwgZGlzYXNzZW1ibGVycy4gQ29uc3VtZXMgYSBtZW1vcnkgcmVnaW9uIGFuZCBwcm92aWRlcyBhbgorLy8vIGFycmF5IG9mIGFzc2VtYmx5IGluc3RydWN0aW9ucy4KK2NsYXNzIE1DRGlzYXNzZW1ibGVyIHsKK3B1YmxpYzoKKyAgLy8vIFRlcm5hcnkgZGVjb2RlIHN0YXR1cy4gTW9zdCBiYWNrZW5kcyB3aWxsIGp1c3QgdXNlIEZhaWwgYW5kCisgIC8vLyBTdWNjZXNzLCBob3dldmVyIHNvbWUgaGF2ZSBhIGNvbmNlcHQgb2YgYW4gaW5zdHJ1Y3Rpb24gd2l0aAorICAvLy8gdW5kZXJzdGFuZGFibGUgc2VtYW50aWNzIGJ1dCB3aGljaCBpcyBhcmNoaXRlY3R1cmFsbHkKKyAgLy8vIGluY29ycmVjdC4gQW4gZXhhbXBsZSBvZiB0aGlzIGlzIEFSTSBVTlBSRURJQ1RBQkxFIGluc3RydWN0aW9ucworICAvLy8gd2hpY2ggYXJlIGRpc2Fzc2VtYmxhYmxlIGJ1dCBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3VyLgorICAvLy8KKyAgLy8vIEJlY2F1c2UgaXQgbWFrZXMgc2Vuc2UgdG8gZGlzYXNzZW1ibGUgdGhlc2UgaW5zdHJ1Y3Rpb25zLCB0aGVyZQorICAvLy8gaXMgYSAic29mdCBmYWlsIiBmYWlsdXJlIG1vZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIE1DSW5zdCYgaXMKKyAgLy8vIHZhbGlkIGJ1dCBhcmNoaXRlY3R1cmFsbHkgaW5jb3JyZWN0LgorICAvLy8KKyAgLy8vIFRoZSBlbnVtIG51bWJlcnMgYXJlIGRlbGliZXJhdGVseSBjaG9zZW4gc3VjaCB0aGF0IHJlZHVjdGlvbgorICAvLy8gZnJvbSBTdWNjZXNzLT5Tb2Z0RmFpbCAtPkZhaWwgY2FuIGJlIGRvbmUgd2l0aCBhIHNpbXBsZQorICAvLy8gYml0d2lzZS1BTkQ6CisgIC8vLworICAvLy8gICBMRUZUICYgVE9QID0gIHwgU3VjY2VzcyAgICAgICBVbnByZWRpY3RhYmxlICAgRmFpbAorICAvLy8gICAtLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLy8gICBTdWNjZXNzICAgICAgIHwgU3VjY2VzcyAgICAgICBVbnByZWRpY3RhYmxlICAgRmFpbAorICAvLy8gICBVbnByZWRpY3RhYmxlIHwgVW5wcmVkaWN0YWJsZSBVbnByZWRpY3RhYmxlICAgRmFpbAorICAvLy8gICBGYWlsICAgICAgICAgIHwgRmFpbCAgICAgICAgICBGYWlsICAgICAgICAgICAgRmFpbAorICAvLy8KKyAgLy8vIEFuIGVhc3kgd2F5IG9mIGVuY29kaW5nIHRoaXMgaXMgYXMgMGIxMSwgMGIwMSwgMGIwMCBmb3IKKyAgLy8vIFN1Y2Nlc3MsIFNvZnRGYWlsLCBGYWlsIHJlc3BlY3RpdmVseS4KKyAgZW51bSBEZWNvZGVTdGF0dXMgeworICAgIEZhaWwgPSAwLAorICAgIFNvZnRGYWlsID0gMSwKKyAgICBTdWNjZXNzID0gMworICB9OworCisgIE1DRGlzYXNzZW1ibGVyKGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJLCBNQ0NvbnRleHQgJkN0eCkKKyAgICA6IEN0eChDdHgpLCBTVEkoU1RJKSB7fQorCisgIHZpcnR1YWwgfk1DRGlzYXNzZW1ibGVyKCk7CisKKyAgLy8vIFJldHVybnMgdGhlIGRpc2Fzc2VtYmx5IG9mIGEgc2luZ2xlIGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJbnN0ciAgICAtIEFuIE1DSW5zdCB0byBwb3B1bGF0ZSB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUKKyAgLy8vICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLgorICAvLy8gXHBhcmFtIFNpemUgICAgIC0gQSB2YWx1ZSB0byBwb3B1bGF0ZSB3aXRoIHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiwgb3IKKyAgLy8vICAgICAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBkZWNvZGUKKyAgLy8vICAgICAgICAgICAgICAgICAgIGFuIGludmFsaWQgaW5zdHJ1Y3Rpb24uCisgIC8vLyBccGFyYW0gQWRkcmVzcyAgLSBUaGUgYWRkcmVzcywgaW4gdGhlIG1lbW9yeSBzcGFjZSBvZiByZWdpb24sIG9mIHRoZSBmaXJzdAorICAvLy8gICAgICAgICAgICAgICAgICAgYnl0ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgIC8vLyBccGFyYW0gQnl0ZXMgICAgLSBBIHJlZmVyZW5jZSB0byB0aGUgYWN0dWFsIGJ5dGVzIG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgLy8vIFxwYXJhbSBWU3RyZWFtICAtIFRoZSBzdHJlYW0gdG8gcHJpbnQgd2FybmluZ3MgYW5kIGRpYWdub3N0aWMgbWVzc2FnZXMgb24uCisgIC8vLyBccGFyYW0gQ1N0cmVhbSAgLSBUaGUgc3RyZWFtIHRvIHByaW50IGNvbW1lbnRzIGFuZCBhbm5vdGF0aW9ucyBvbi4KKyAgLy8vIFxyZXR1cm4gICAgICAgICAtIE1DRGlzYXNzZW1ibGVyOjpTdWNjZXNzIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyB2YWxpZCwKKyAgLy8vICAgICAgICAgICAgICAgICAgIE1DRGlzYXNzZW1ibGVyOjpTb2Z0RmFpbCBpZiB0aGUgaW5zdHJ1Y3Rpb24gd2FzCisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYXNzZW1ibGFibGUgYnV0IGludmFsaWQsCisgIC8vLyAgICAgICAgICAgICAgICAgICBNQ0Rpc2Fzc2VtYmxlcjo6RmFpbCBpZiB0aGUgaW5zdHJ1Y3Rpb24gd2FzIGludmFsaWQuCisgIHZpcnR1YWwgRGVjb2RlU3RhdHVzIGdldEluc3RydWN0aW9uKE1DSW5zdCAmSW5zdHIsIHVpbnQ2NF90ICZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiBCeXRlcywgdWludDY0X3QgQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJlZTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZDU3RyZWFtKSBjb25zdCA9IDA7CisKK3ByaXZhdGU6CisgIE1DQ29udGV4dCAmQ3R4OworCitwcm90ZWN0ZWQ6CisgIC8vIFN1YnRhcmdldCBpbmZvcm1hdGlvbiwgZm9yIGluc3RydWN0aW9uIGRlY29kaW5nIHByZWRpY2F0ZXMgaWYgcmVxdWlyZWQuCisgIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJOworICBzdGQ6OnVuaXF1ZV9wdHI8TUNTeW1ib2xpemVyPiBTeW1ib2xpemVyOworCitwdWJsaWM6CisgIC8vIEhlbHBlcnMgYXJvdW5kIE1DU3ltYm9saXplcgorICBib29sIHRyeUFkZGluZ1N5bWJvbGljT3BlcmFuZChNQ0luc3QgJkluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEFkZHJlc3MsIGJvb2wgSXNCcmFuY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldCwgdWludDY0X3QgSW5zdFNpemUpIGNvbnN0OworCisgIHZvaWQgdHJ5QWRkaW5nUGNMb2FkUmVmZXJlbmNlQ29tbWVudChpbnQ2NF90IFZhbHVlLCB1aW50NjRfdCBBZGRyZXNzKSBjb25zdDsKKworICAvLy8gU2V0IFxwIFN5bXplciBhcyB0aGUgY3VycmVudCBzeW1ib2xpemVyLgorICAvLy8gVGhpcyB0YWtlcyBvd25lcnNoaXAgb2YgXHAgU3ltemVyLCBhbmQgZGVsZXRlcyB0aGUgcHJldmlvdXNseSBzZXQgb25lLgorICB2b2lkIHNldFN5bWJvbGl6ZXIoc3RkOjp1bmlxdWVfcHRyPE1DU3ltYm9saXplcj4gU3ltemVyKTsKKworICBNQ0NvbnRleHQmIGdldENvbnRleHQoKSBjb25zdCB7IHJldHVybiBDdHg7IH0KKworICBjb25zdCBNQ1N1YnRhcmdldEluZm8mIGdldFN1YnRhcmdldEluZm8oKSBjb25zdCB7IHJldHVybiBTVEk7IH0KKworICAvLyBNYXJrZWQgbXV0YWJsZSBiZWNhdXNlIHdlIGNhY2hlIGl0IGluc2lkZSB0aGUgZGlzYXNzZW1ibGVyLCByYXRoZXIgdGhhbgorICAvLyBoYXZpbmcgdG8gcGFzcyBpdCBhcm91bmQgYXMgYW4gYXJndW1lbnQgdGhyb3VnaCBhbGwgdGhlIGF1dG9nZW5lcmF0ZWQgY29kZS4KKyAgbXV0YWJsZSByYXdfb3N0cmVhbSAqQ29tbWVudFN0cmVhbSA9IG51bGxwdHI7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ0RJU0FTU0VNQkxFUl9NQ0RJU0FTU0VNQkxFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRGlzYXNzZW1ibGVyL01DRXh0ZXJuYWxTeW1ib2xpemVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRGlzYXNzZW1ibGVyL01DRXh0ZXJuYWxTeW1ib2xpemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzZTVkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNEaXNhc3NlbWJsZXIvTUNFeHRlcm5hbFN5bWJvbGl6ZXIuaApAQCAtMCwwICsxLDU4IEBACisvLz09PS0tIGxsdm0vTUMvTUNFeHRlcm5hbFN5bWJvbGl6ZXIuaCAtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIE1DRXh0ZXJuYWxTeW1ib2xpemVyIGNsYXNzLCB3aGljaAorLy8gZW5hYmxlcyBsaWJyYXJ5IHVzZXJzIHRvIHByb3ZpZGUgY2FsbGJhY2tzICh0aHJvdWdoIHRoZSBDIEFQSSkgdG8gZG8gdGhlCisvLyBzeW1ib2xpemF0aW9uIGV4dGVybmFsbHkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DRElTQVNTRU1CTEVSX01DRVhURVJOQUxTWU1CT0xJWkVSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0RJU0FTU0VNQkxFUl9NQ0VYVEVSTkFMU1lNQk9MSVpFUl9ICisKKyNpbmNsdWRlICJsbHZtLWMvRGlzYXNzZW1ibGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0Rpc2Fzc2VtYmxlci9NQ1N5bWJvbGl6ZXIuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBTeW1ib2xpemUgdXNpbmcgdXNlci1wcm92aWRlZCwgQyBBUEksIGNhbGxiYWNrcy4KKy8vLworLy8vIFNlZSBsbHZtLWMvRGlzYXNzZW1ibGVyLmguCitjbGFzcyBNQ0V4dGVybmFsU3ltYm9saXplciA6IHB1YmxpYyBNQ1N5bWJvbGl6ZXIgeworcHJvdGVjdGVkOgorICAvLy8gXG5hbWUgSG9va3MgZm9yIHN5bWJvbGljIGRpc2Fzc2VtYmx5IHZpYSB0aGUgcHVibGljICdDJyBpbnRlcmZhY2UuCisgIC8vLyBAeworICAvLy8gVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24gZm9yIG9wZXJhbmRzLgorICBMTFZNT3BJbmZvQ2FsbGJhY2sgR2V0T3BJbmZvOworICAvLy8gVGhlIGZ1bmN0aW9uIHRvIGxvb2t1cCBhIHN5bWJvbCBuYW1lLgorICBMTFZNU3ltYm9sTG9va3VwQ2FsbGJhY2sgU3ltYm9sTG9va1VwOworICAvLy8gVGhlIHBvaW50ZXIgdG8gdGhlIGJsb2NrIG9mIHN5bWJvbGljIGluZm9ybWF0aW9uIGZvciBhYm92ZSBjYWxsIGJhY2suCisgIHZvaWQgKkRpc0luZm87CisgIC8vLyBAfQorCitwdWJsaWM6CisgIE1DRXh0ZXJuYWxTeW1ib2xpemVyKE1DQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TUNSZWxvY2F0aW9uSW5mbz4gUmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgTExWTU9wSW5mb0NhbGxiYWNrIGdldE9wSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgTExWTVN5bWJvbExvb2t1cENhbGxiYWNrIHN5bWJvbExvb2tVcCwgdm9pZCAqZGlzSW5mbykKKyAgICA6IE1DU3ltYm9saXplcihDdHgsIHN0ZDo6bW92ZShSZWxJbmZvKSksIEdldE9wSW5mbyhnZXRPcEluZm8pLAorICAgICAgU3ltYm9sTG9va1VwKHN5bWJvbExvb2tVcCksIERpc0luZm8oZGlzSW5mbykge30KKworICBib29sIHRyeUFkZGluZ1N5bWJvbGljT3BlcmFuZChNQ0luc3QgJk1JLCByYXdfb3N0cmVhbSAmQ29tbWVudFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBWYWx1ZSwgdWludDY0X3QgQWRkcmVzcywgYm9vbCBJc0JyYW5jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0LCB1aW50NjRfdCBJbnN0U2l6ZSkgb3ZlcnJpZGU7CisgIHZvaWQgdHJ5QWRkaW5nUGNMb2FkUmVmZXJlbmNlQ29tbWVudChyYXdfb3N0cmVhbSAmQ29tbWVudFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBBZGRyZXNzKSBvdmVycmlkZTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRGlzYXNzZW1ibGVyL01DUmVsb2NhdGlvbkluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNEaXNhc3NlbWJsZXIvTUNSZWxvY2F0aW9uSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MzZlODgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRGlzYXNzZW1ibGVyL01DUmVsb2NhdGlvbkluZm8uaApAQCAtMCwwICsxLDQ1IEBACisvLz09PS0gbGx2bS9NQy9NQ1JlbG9jYXRpb25JbmZvLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgTUNSZWxvY2F0aW9uSW5mbyBjbGFzcywgd2hpY2ggcHJvdmlkZXMgbWV0aG9kcyB0bworLy8gY3JlYXRlIE1DRXhwcnMgZnJvbSByZWxvY2F0aW9ucywgZWl0aGVyIGZvdW5kIGluIGFuIG9iamVjdDo6T2JqZWN0RmlsZQorLy8gKG9iamVjdDo6UmVsb2NhdGlvblJlZiksIG9yIHByb3ZpZGVkIHRocm91Z2ggdGhlIEMgQVBJLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0RJU0FTU0VNQkxFUl9NQ1JFTE9DQVRJT05JTkZPX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0RJU0FTU0VNQkxFUl9NQ1JFTE9DQVRJT05JTkZPX0gKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBNQ0V4cHI7CisKKy8vLyBcYnJpZWYgQ3JlYXRlIE1DRXhwcnMgZnJvbSByZWxvY2F0aW9ucyBmb3VuZCBpbiBhbiBvYmplY3QgZmlsZS4KK2NsYXNzIE1DUmVsb2NhdGlvbkluZm8geworcHJvdGVjdGVkOgorICBNQ0NvbnRleHQgJkN0eDsKKworcHVibGljOgorICBNQ1JlbG9jYXRpb25JbmZvKE1DQ29udGV4dCAmQ3R4KTsKKyAgTUNSZWxvY2F0aW9uSW5mbyhjb25zdCBNQ1JlbG9jYXRpb25JbmZvICYpID0gZGVsZXRlOworICBNQ1JlbG9jYXRpb25JbmZvICZvcGVyYXRvcj0oY29uc3QgTUNSZWxvY2F0aW9uSW5mbyAmKSA9IGRlbGV0ZTsKKyAgdmlydHVhbCB+TUNSZWxvY2F0aW9uSW5mbygpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIE1DRXhwciBmb3IgdGhlIHRhcmdldC1zcGVjaWZpYyBccCBWYXJpYW50S2luZC4KKyAgLy8vIFRoZSBWYXJpYW50S2luZHMgYXJlIGRlZmluZWQgaW4gbGx2bS1jL0Rpc2Fzc2VtYmxlci5oLgorICAvLy8gVXNlZCBieSBNQ0V4dGVybmFsU3ltYm9saXplci4KKyAgLy8vIFxyZXR1cm5zIElmIHBvc3NpYmxlLCBhbiBNQ0V4cHIgY29ycmVzcG9uZGluZyB0byBWYXJpYW50S2luZCwgZWxzZSAwLgorICB2aXJ0dWFsIGNvbnN0IE1DRXhwciAqY3JlYXRlRXhwckZvckNBUElWYXJpYW50S2luZChjb25zdCBNQ0V4cHIgKlN1YkV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZhcmlhbnRLaW5kKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DRElTQVNTRU1CTEVSX01DUkVMT0NBVElPTklORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0Rpc2Fzc2VtYmxlci9NQ1N5bWJvbGl6ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNEaXNhc3NlbWJsZXIvTUNTeW1ib2xpemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg1Y2Y1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNEaXNhc3NlbWJsZXIvTUNTeW1ib2xpemVyLmgKQEAgLTAsMCArMSw4MyBAQAorLy89PT0tIGxsdm0vTUMvTUNTeW1ib2xpemVyLmggLSBNQ1N5bWJvbGl6ZXIgY2xhc3MgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBNQ1N5bWJvbGl6ZXIgY2xhc3MsIHdoaWNoIGlzIHVzZWQKKy8vIHRvIHN5bWJvbGl6ZSBpbnN0cnVjdGlvbnMgZGVjb2RlZCBmcm9tIGFuIG9iamVjdCwgdGhhdCBpcywgdHJhbnNmb3JtIHRoZWlyCisvLyBpbW1lZGlhdGUgb3BlcmFuZHMgdG8gTUNFeHBycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNESVNBU1NFTUJMRVJfTUNTWU1CT0xJWkVSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0RJU0FTU0VNQkxFUl9NQ1NZTUJPTElaRVJfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0Rpc2Fzc2VtYmxlci9NQ1JlbG9jYXRpb25JbmZvLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DSW5zdDsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gXGJyaWVmIFN5bWJvbGl6ZSBhbmQgYW5ub3RhdGUgZGlzYXNzZW1ibGVkIGluc3RydWN0aW9ucy4KKy8vLworLy8vIEZvciBub3cgdGhpcyBtaW1pY3MgdGhlIG9sZCBzeW1ib2xpemF0aW9uIGxvZ2ljIChmcm9tIGJvdGggQVJNIGFuZCB4ODYpLCB0aGF0CisvLy8gcmVsaWVkIG9uIHVzZXItcHJvdmlkZWQgKEMgQVBJKSBjYWxsYmFja3MgdG8gZG8gdGhlIGFjdHVhbCBzeW1ib2wgbG9va3VwIGluCisvLy8gdGhlIG9iamVjdCBmaWxlLiBUaGlzIHdhcyBtb3ZlZCB0byBNQ0V4dGVybmFsU3ltYm9saXplci4KKy8vLyBBIGJldHRlciBBUEkgd291bGQgbm90IHJlbHkgb24gYWN0dWFsbHkgY2FsbGluZyB0aGUgdHdvIG1ldGhvZHMgaGVyZSBmcm9tCisvLy8gaW5zaWRlIGVhY2ggZGlzYXNzZW1ibGVyLCBidXQgd291bGQgdXNlIHRoZSBpbnN0ciBpbmZvIHRvIGRldGVybWluZSB3aGF0CisvLy8gb3BlcmFuZHMgYXJlIGFjdHVhbGx5IHN5bWJvbGl6YWJsZSwgYW5kIGluIHdoYXQgd2F5LiBJIGRvbid0IHRoaW5rIHRoaXMKKy8vLyBpbmZvcm1hdGlvbiBleGlzdHMgcmlnaHQgbm93LgorY2xhc3MgTUNTeW1ib2xpemVyIHsKK3Byb3RlY3RlZDoKKyAgTUNDb250ZXh0ICZDdHg7CisgIHN0ZDo6dW5pcXVlX3B0cjxNQ1JlbG9jYXRpb25JbmZvPiBSZWxJbmZvOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIE1DU3ltYm9saXplciwgdGFraW5nIG93bmVyc2hpcCBvZiBccCBSZWxJbmZvLgorICBNQ1N5bWJvbGl6ZXIoTUNDb250ZXh0ICZDdHgsIHN0ZDo6dW5pcXVlX3B0cjxNQ1JlbG9jYXRpb25JbmZvPiBSZWxJbmZvKQorICAgIDogQ3R4KEN0eCksIFJlbEluZm8oc3RkOjptb3ZlKFJlbEluZm8pKSB7CisgIH0KKworICBNQ1N5bWJvbGl6ZXIoY29uc3QgTUNTeW1ib2xpemVyICYpID0gZGVsZXRlOworICBNQ1N5bWJvbGl6ZXIgJm9wZXJhdG9yPShjb25zdCBNQ1N5bWJvbGl6ZXIgJikgPSBkZWxldGU7CisgIHZpcnR1YWwgfk1DU3ltYm9saXplcigpOworCisgIC8vLyBcYnJpZWYgVHJ5IHRvIGFkZCBhIHN5bWJvbGljIG9wZXJhbmQgaW5zdGVhZCBvZiBccCBWYWx1ZSB0byB0aGUgTUNJbnN0LgorICAvLy8KKyAgLy8vIEluc3RlYWQgb2YgaGF2aW5nIGEgZGlmZmljdWx0IHRvIHJlYWQgaW1tZWRpYXRlLCBhIHN5bWJvbGljIG9wZXJhbmQgd291bGQKKyAgLy8vIHJlcHJlc2VudCB0aGlzIGltbWVkaWF0ZSBpbiBhIG1vcmUgdW5kZXJzdGFuZGFibGUgd2F5LCBmb3IgaW5zdGFuY2UgYXMgYQorICAvLy8gc3ltYm9sIG9yIGFuIG9mZnNldCBmcm9tIGEgc3ltYm9sLiBSZWxvY2F0aW9ucyBjYW4gYWxzbyBiZSB1c2VkIHRvIGVucmljaAorICAvLy8gdGhlIHN5bWJvbGljIGV4cHJlc3Npb24uCisgIC8vLyBccGFyYW0gSW5zdCAgICAgIC0gVGhlIE1DSW5zdCB3aGVyZSB0byBpbnNlcnQgdGhlIHN5bWJvbGljIG9wZXJhbmQuCisgIC8vLyBccGFyYW0gY1N0cmVhbSAgIC0gU3RyZWFtIHRvIHByaW50IGNvbW1lbnRzIGFuZCBhbm5vdGF0aW9ucyBvbi4KKyAgLy8vIFxwYXJhbSBWYWx1ZSAgICAgLSBPcGVyYW5kIHZhbHVlLCBwYy1hZGp1c3RlZCBieSB0aGUgY2FsbGVyIGlmIG5lY2Vzc2FyeS4KKyAgLy8vIFxwYXJhbSBBZGRyZXNzICAgLSBMb2FkIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uLgorICAvLy8gXHBhcmFtIElzQnJhbmNoICAtIElzIHRoZSBpbnN0cnVjdGlvbiBhIGJyYW5jaD8KKyAgLy8vIFxwYXJhbSBPZmZzZXQgICAgLSBCeXRlIG9mZnNldCBvZiB0aGUgb3BlcmFuZCBpbnNpZGUgdGhlIGluc3QuCisgIC8vLyBccGFyYW0gSW5zdFNpemUgIC0gU2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gaW4gYnl0ZXMuCisgIC8vLyBccmV0dXJuIFdoZXRoZXIgYSBzeW1ib2xpYyBvcGVyYW5kIHdhcyBhZGRlZC4KKyAgdmlydHVhbCBib29sIHRyeUFkZGluZ1N5bWJvbGljT3BlcmFuZChNQ0luc3QgJkluc3QsIHJhd19vc3RyZWFtICZjU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgVmFsdWUsIHVpbnQ2NF90IEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0JyYW5jaCwgdWludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEluc3RTaXplKSA9IDA7CisKKyAgLy8vIFxicmllZiBUcnkgdG8gYWRkIGEgY29tbWVudCBvbiB0aGUgUEMtcmVsYXRpdmUgbG9hZC4KKyAgLy8vIEZvciBpbnN0YW5jZSwgaW4gTWFjaC1PLCB0aGlzIGlzIHVzZWQgdG8gYWRkIGFubm90YXRpb25zIHRvIGluc3RydWN0aW9ucworICAvLy8gdGhhdCB1c2UgQyBzdHJpbmcgbGl0ZXJhbHMsIGFzIGZvdW5kIGluIF9fY3N0cmluZy4KKyAgdmlydHVhbCB2b2lkIHRyeUFkZGluZ1BjTG9hZFJlZmVyZW5jZUNvbW1lbnQocmF3X29zdHJlYW0gJmNTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEFkZHJlc3MpID0gMDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DRElTQVNTRU1CTEVSX01DU1lNQk9MSVpFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRHdhcmYuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNEd2FyZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZGIxNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRHdhcmYuaApAQCAtMCwwICsxLDU3OCBAQAorLy89PT0tIE1DRHdhcmYuaCAtIE1hY2hpbmUgQ29kZSBEd2FyZiBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBNQ0R3YXJmRmlsZSB0byBzdXBwb3J0IHRoZSBkd2FyZgorLy8gLmZpbGUgZGlyZWN0aXZlIGFuZCB0aGUgLmxvYyBkaXJlY3RpdmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DRFdBUkZfSAorI2RlZmluZSBMTFZNX01DX01DRFdBUkZfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvTWFwVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01ENS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEFycmF5UmVmOworY2xhc3MgTUNBc21CYWNrZW5kOworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNEd2FyZkxpbmVTdHI7CitjbGFzcyBNQ09iamVjdFN0cmVhbWVyOworY2xhc3MgTUNTdHJlYW1lcjsKK2NsYXNzIE1DU3ltYm9sOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBTTUxvYzsKK2NsYXNzIFNvdXJjZU1ncjsKKworLy8vIFxicmllZiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgdGhlIG5hbWUgb2YgdGhlIGR3YXJmCisvLy8gLmZpbGUgZGlyZWN0aXZlIGFuZCBpdHMgYXNzb2NpYXRlZCBkd2FyZiBmaWxlIG51bWJlciBpbiB0aGUgTUMgZmlsZSwKKy8vLyBhbmQgTUNEd2FyZkZpbGUncyBhcmUgY3JlYXRlZCBhbmQgdW5pcXVlZCBieSB0aGUgTUNDb250ZXh0IGNsYXNzIHdoZXJlCisvLy8gdGhlIGZpbGUgbnVtYmVyIGZvciBlYWNoIGlzIGl0cyBpbmRleCBpbnRvIHRoZSB2ZWN0b3Igb2YgRHdhcmZGaWxlcyAobm90ZQorLy8vIGluZGV4IDAgaXMgbm90IHVzZWQgYW5kIG5vdCBhIHZhbGlkIGR3YXJmIGZpbGUgbnVtYmVyKS4KK3N0cnVjdCBNQ0R3YXJmRmlsZSB7CisgIC8vIFxicmllZiBUaGUgYmFzZSBuYW1lIG9mIHRoZSBmaWxlIHdpdGhvdXQgaXRzIGRpcmVjdG9yeSBwYXRoLgorICBzdGQ6OnN0cmluZyBOYW1lOworCisgIC8vIFxicmllZiBUaGUgaW5kZXggaW50byB0aGUgbGlzdCBvZiBkaXJlY3RvcnkgbmFtZXMgZm9yIHRoaXMgZmlsZSBuYW1lLgorICB1bnNpZ25lZCBEaXJJbmRleDsKKworICAvLy8gVGhlIE1ENSBjaGVja3N1bSwgaWYgdGhlcmUgaXMgb25lLiBOb24tb3duaW5nIHBvaW50ZXIgdG8gZGF0YSBhbGxvY2F0ZWQKKyAgLy8vIGluIE1DQ29udGV4dC4KKyAgTUQ1OjpNRDVSZXN1bHQgKkNoZWNrc3VtID0gbnVsbHB0cjsKKworICAvLy8gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBmaWxlLiBOb24tb3duaW5nIHJlZmVyZW5jZSB0byBkYXRhIGFsbG9jYXRlZCBpbgorICAvLy8gTUNDb250ZXh0LgorICBPcHRpb25hbDxTdHJpbmdSZWY+IFNvdXJjZTsKK307CisKKy8vLyBcYnJpZWYgSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IHRoZSBpbmZvcm1hdGlvbiBmcm9tIGEKKy8vLyBkd2FyZiAubG9jIGRpcmVjdGl2ZS4KK2NsYXNzIE1DRHdhcmZMb2MgeworICB1aW50MzJfdCBGaWxlTnVtOworICB1aW50MzJfdCBMaW5lOworICB1aW50MTZfdCBDb2x1bW47CisgIC8vIEZsYWdzIChzZWUgI2RlZmluZSdzIGJlbG93KQorICB1aW50OF90IEZsYWdzOworICB1aW50OF90IElzYTsKKyAgdWludDMyX3QgRGlzY3JpbWluYXRvcjsKKworLy8gRmxhZyB0aGF0IGluZGljYXRlcyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgaXNfc3RtdF9zdGFydCBmbGFnLgorI2RlZmluZSBEV0FSRjJfTElORV9ERUZBVUxUX0lTX1NUTVQgMQorCisjZGVmaW5lIERXQVJGMl9GTEFHX0lTX1NUTVQgKDEgPDwgMCkKKyNkZWZpbmUgRFdBUkYyX0ZMQUdfQkFTSUNfQkxPQ0sgKDEgPDwgMSkKKyNkZWZpbmUgRFdBUkYyX0ZMQUdfUFJPTE9HVUVfRU5EICgxIDw8IDIpCisjZGVmaW5lIERXQVJGMl9GTEFHX0VQSUxPR1VFX0JFR0lOICgxIDw8IDMpCisKK3ByaXZhdGU6IC8vIE1DQ29udGV4dCBtYW5hZ2VzIHRoZXNlCisgIGZyaWVuZCBjbGFzcyBNQ0NvbnRleHQ7CisgIGZyaWVuZCBjbGFzcyBNQ0R3YXJmTGluZUVudHJ5OworCisgIE1DRHdhcmZMb2ModW5zaWduZWQgZmlsZU51bSwgdW5zaWduZWQgbGluZSwgdW5zaWduZWQgY29sdW1uLCB1bnNpZ25lZCBmbGFncywKKyAgICAgICAgICAgICB1bnNpZ25lZCBpc2EsIHVuc2lnbmVkIGRpc2NyaW1pbmF0b3IpCisgICAgICA6IEZpbGVOdW0oZmlsZU51bSksIExpbmUobGluZSksIENvbHVtbihjb2x1bW4pLCBGbGFncyhmbGFncyksIElzYShpc2EpLAorICAgICAgICBEaXNjcmltaW5hdG9yKGRpc2NyaW1pbmF0b3IpIHt9CisKKyAgLy8gQWxsb3cgdGhlIGRlZmF1bHQgY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvciB0byBiZSB1c2VkCisgIC8vIGZvciBhbiBNQ0R3YXJmTG9jIG9iamVjdC4KKworcHVibGljOgorICAvLy8gXGJyaWVmIEdldCB0aGUgRmlsZU51bSBvZiB0aGlzIE1DRHdhcmZMb2MuCisgIHVuc2lnbmVkIGdldEZpbGVOdW0oKSBjb25zdCB7IHJldHVybiBGaWxlTnVtOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIExpbmUgb2YgdGhpcyBNQ0R3YXJmTG9jLgorICB1bnNpZ25lZCBnZXRMaW5lKCkgY29uc3QgeyByZXR1cm4gTGluZTsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBDb2x1bW4gb2YgdGhpcyBNQ0R3YXJmTG9jLgorICB1bnNpZ25lZCBnZXRDb2x1bW4oKSBjb25zdCB7IHJldHVybiBDb2x1bW47IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgRmxhZ3Mgb2YgdGhpcyBNQ0R3YXJmTG9jLgorICB1bnNpZ25lZCBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIEZsYWdzOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIElzYSBvZiB0aGlzIE1DRHdhcmZMb2MuCisgIHVuc2lnbmVkIGdldElzYSgpIGNvbnN0IHsgcmV0dXJuIElzYTsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBEaXNjcmltaW5hdG9yIG9mIHRoaXMgTUNEd2FyZkxvYy4KKyAgdW5zaWduZWQgZ2V0RGlzY3JpbWluYXRvcigpIGNvbnN0IHsgcmV0dXJuIERpc2NyaW1pbmF0b3I7IH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgRmlsZU51bSBvZiB0aGlzIE1DRHdhcmZMb2MuCisgIHZvaWQgc2V0RmlsZU51bSh1bnNpZ25lZCBmaWxlTnVtKSB7IEZpbGVOdW0gPSBmaWxlTnVtOyB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIExpbmUgb2YgdGhpcyBNQ0R3YXJmTG9jLgorICB2b2lkIHNldExpbmUodW5zaWduZWQgbGluZSkgeyBMaW5lID0gbGluZTsgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBDb2x1bW4gb2YgdGhpcyBNQ0R3YXJmTG9jLgorICB2b2lkIHNldENvbHVtbih1bnNpZ25lZCBjb2x1bW4pIHsKKyAgICBhc3NlcnQoY29sdW1uIDw9IFVJTlQxNl9NQVgpOworICAgIENvbHVtbiA9IGNvbHVtbjsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBGbGFncyBvZiB0aGlzIE1DRHdhcmZMb2MuCisgIHZvaWQgc2V0RmxhZ3ModW5zaWduZWQgZmxhZ3MpIHsKKyAgICBhc3NlcnQoZmxhZ3MgPD0gVUlOVDhfTUFYKTsKKyAgICBGbGFncyA9IGZsYWdzOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIElzYSBvZiB0aGlzIE1DRHdhcmZMb2MuCisgIHZvaWQgc2V0SXNhKHVuc2lnbmVkIGlzYSkgeworICAgIGFzc2VydChpc2EgPD0gVUlOVDhfTUFYKTsKKyAgICBJc2EgPSBpc2E7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgRGlzY3JpbWluYXRvciBvZiB0aGlzIE1DRHdhcmZMb2MuCisgIHZvaWQgc2V0RGlzY3JpbWluYXRvcih1bnNpZ25lZCBkaXNjcmltaW5hdG9yKSB7CisgICAgRGlzY3JpbWluYXRvciA9IGRpc2NyaW1pbmF0b3I7CisgIH0KK307CisKKy8vLyBcYnJpZWYgSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IHRoZSBsaW5lIGluZm9ybWF0aW9uIGZvcgorLy8vIHRoZSBkd2FyZiBsaW5lIHRhYmxlIGVudHJpZXMuICBXaGljaCBpcyBjcmVhdGVkIGFmdGVyIGEgbWFjaGluZQorLy8vIGluc3RydWN0aW9uIGlzIGFzc2VtYmxlZCBhbmQgdXNlcyBhbiBhZGRyZXNzIGZyb20gYSB0ZW1wb3JhcnkgbGFiZWwKKy8vLyBjcmVhdGVkIGF0IHRoZSBjdXJyZW50IGFkZHJlc3MgaW4gdGhlIGN1cnJlbnQgc2VjdGlvbiBhbmQgdGhlIGluZm8gZnJvbQorLy8vIHRoZSBsYXN0IC5sb2MgZGlyZWN0aXZlIHNlZW4gYXMgc3RvcmVkIGluIHRoZSBjb250ZXh0LgorY2xhc3MgTUNEd2FyZkxpbmVFbnRyeSA6IHB1YmxpYyBNQ0R3YXJmTG9jIHsKKyAgTUNTeW1ib2wgKkxhYmVsOworCitwcml2YXRlOgorICAvLyBBbGxvdyB0aGUgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yIHRvIGJlIHVzZWQKKyAgLy8gZm9yIGFuIE1DRHdhcmZMaW5lRW50cnkgb2JqZWN0LgorCitwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhbiBNQ0R3YXJmTGluZUVudHJ5IGdpdmVuIGEgc3ltYm9sIGFuZCB0aGUgZHdhcmYgbG9jLgorICBNQ0R3YXJmTGluZUVudHJ5KE1DU3ltYm9sICpsYWJlbCwgY29uc3QgTUNEd2FyZkxvYyBsb2MpCisgICAgICA6IE1DRHdhcmZMb2MobG9jKSwgTGFiZWwobGFiZWwpIHt9CisKKyAgTUNTeW1ib2wgKmdldExhYmVsKCkgY29uc3QgeyByZXR1cm4gTGFiZWw7IH0KKworICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuIGluc3RydWN0aW9uIGlzIGFzc2VtYmxlZCBpbnRvIHRoZSBzcGVjaWZpZWQKKyAgLy8gc2VjdGlvbiBhbmQgaWYgdGhlcmUgaXMgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGFzdCAubG9jIGRpcmVjdGl2ZSB0aGF0CisgIC8vIGhhcyB5ZXQgdG8gaGF2ZSBhIGxpbmUgZW50cnkgbWFkZSBmb3IgaXQgaXMgbWFkZS4KKyAgc3RhdGljIHZvaWQgTWFrZShNQ09iamVjdFN0cmVhbWVyICpNQ09TLCBNQ1NlY3Rpb24gKlNlY3Rpb24pOworfTsKKworLy8vIFxicmllZiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgdGhlIGxpbmUgaW5mb3JtYXRpb24gZm9yIGEgY29tcGlsZQorLy8vIHVuaXQgd2hlcmUgbWFjaGluZSBpbnN0cnVjdGlvbnMgaGF2ZSBiZWVuIGFzc2VtYmxlZCBhZnRlciBzZWVpbmcgLmxvYworLy8vIGRpcmVjdGl2ZXMuICBUaGlzIGlzIHRoZSBpbmZvcm1hdGlvbiB1c2VkIHRvIGJ1aWxkIHRoZSBkd2FyZiBsaW5lCisvLy8gdGFibGUgZm9yIGEgc2VjdGlvbi4KK2NsYXNzIE1DTGluZVNlY3Rpb24geworcHVibGljOgorICAvLyBcYnJpZWYgQWRkIGFuIGVudHJ5IHRvIHRoaXMgTUNMaW5lU2VjdGlvbidzIGxpbmUgZW50cmllcy4KKyAgdm9pZCBhZGRMaW5lRW50cnkoY29uc3QgTUNEd2FyZkxpbmVFbnRyeSAmTGluZUVudHJ5LCBNQ1NlY3Rpb24gKlNlYykgeworICAgIE1DTGluZURpdmlzaW9uc1tTZWNdLnB1c2hfYmFjayhMaW5lRW50cnkpOworICB9CisKKyAgdXNpbmcgTUNEd2FyZkxpbmVFbnRyeUNvbGxlY3Rpb24gPSBzdGQ6OnZlY3RvcjxNQ0R3YXJmTGluZUVudHJ5PjsKKyAgdXNpbmcgaXRlcmF0b3IgPSBNQ0R3YXJmTGluZUVudHJ5Q29sbGVjdGlvbjo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gTUNEd2FyZkxpbmVFbnRyeUNvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBNQ0xpbmVEaXZpc2lvbk1hcCA9IE1hcFZlY3RvcjxNQ1NlY3Rpb24gKiwgTUNEd2FyZkxpbmVFbnRyeUNvbGxlY3Rpb24+OworCitwcml2YXRlOgorICAvLyBBIGNvbGxlY3Rpb24gb2YgTUNEd2FyZkxpbmVFbnRyeSBmb3IgZWFjaCBzZWN0aW9uLgorICBNQ0xpbmVEaXZpc2lvbk1hcCBNQ0xpbmVEaXZpc2lvbnM7CisKK3B1YmxpYzoKKyAgLy8gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiBNQ0R3YXJmTGluZUVudHJ5IGZvciBhIGdpdmVuIENvbXBpbGUgVW5pdCBJRC4KKyAgY29uc3QgTUNMaW5lRGl2aXNpb25NYXAgJmdldE1DTGluZUVudHJpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIE1DTGluZURpdmlzaW9uczsKKyAgfQorfTsKKworc3RydWN0IE1DRHdhcmZMaW5lVGFibGVQYXJhbXMgeworICAvLy8gRmlyc3Qgc3BlY2lhbCBsaW5lIG9wY29kZSAtIGxlYXZlIHJvb20gZm9yIHRoZSBzdGFuZGFyZCBvcGNvZGVzLgorICAvLy8gTm90ZTogSWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoaXMsIHlvdSdsbCBoYXZlIHRvIHVwZGF0ZSB0aGUKKyAgLy8vICJTdGFuZGFyZE9wY29kZUxlbmd0aHMiIHRhYmxlIHRoYXQgaXMgZW1pdHRlZCBpbgorICAvLy8gXGMgRW1pdCgpLgorICB1aW50OF90IERXQVJGMkxpbmVPcGNvZGVCYXNlID0gMTM7CisgIC8vLyBNaW5pbXVtIGxpbmUgb2Zmc2V0IGluIGEgc3BlY2lhbCBsaW5lIGluZm8uIG9wY29kZS4gIFRoZSB2YWx1ZQorICAvLy8gLTUgd2FzIGNob3NlbiB0byBnaXZlIGEgcmVhc29uYWJsZSByYW5nZSBvZiB2YWx1ZXMuCisgIGludDhfdCBEV0FSRjJMaW5lQmFzZSA9IC01OworICAvLy8gUmFuZ2Ugb2YgbGluZSBvZmZzZXRzIGluIGEgc3BlY2lhbCBsaW5lIGluZm8uIG9wY29kZS4KKyAgdWludDhfdCBEV0FSRjJMaW5lUmFuZ2UgPSAxNDsKK307CisKK3N0cnVjdCBNQ0R3YXJmTGluZVRhYmxlSGVhZGVyIHsKKyAgTUNTeW1ib2wgKkxhYmVsID0gbnVsbHB0cjsKKyAgU21hbGxWZWN0b3I8c3RkOjpzdHJpbmcsIDM+IE1DRHdhcmZEaXJzOworICBTbWFsbFZlY3RvcjxNQ0R3YXJmRmlsZSwgMz4gTUNEd2FyZkZpbGVzOworICBTdHJpbmdNYXA8dW5zaWduZWQ+IFNvdXJjZUlkTWFwOworICBTdHJpbmdSZWYgQ29tcGlsYXRpb25EaXI7CisgIE1DRHdhcmZGaWxlIFJvb3RGaWxlOworICBib29sIEhhc01ENSA9IGZhbHNlOworICBib29sIEhhc1NvdXJjZSA9IGZhbHNlOworCisgIE1DRHdhcmZMaW5lVGFibGVIZWFkZXIoKSA9IGRlZmF1bHQ7CisKKyAgRXhwZWN0ZWQ8dW5zaWduZWQ+IHRyeUdldEZpbGUoU3RyaW5nUmVmICZEaXJlY3RvcnksIFN0cmluZ1JlZiAmRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ENTo6TUQ1UmVzdWx0ICpDaGVja3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8U3RyaW5nUmVmPiAmU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGaWxlTnVtYmVyID0gMCk7CisgIHN0ZDo6cGFpcjxNQ1N5bWJvbCAqLCBNQ1N5bWJvbCAqPgorICBFbWl0KE1DU3RyZWFtZXIgKk1DT1MsIE1DRHdhcmZMaW5lVGFibGVQYXJhbXMgUGFyYW1zLAorICAgICAgIE9wdGlvbmFsPE1DRHdhcmZMaW5lU3RyPiAmTGluZVN0cikgY29uc3Q7CisgIHN0ZDo6cGFpcjxNQ1N5bWJvbCAqLCBNQ1N5bWJvbCAqPgorICBFbWl0KE1DU3RyZWFtZXIgKk1DT1MsIE1DRHdhcmZMaW5lVGFibGVQYXJhbXMgUGFyYW1zLAorICAgICAgIEFycmF5UmVmPGNoYXI+IFNwZWNpYWxPcGNvZGVMZW5ndGhzLAorICAgICAgIE9wdGlvbmFsPE1DRHdhcmZMaW5lU3RyPiAmTGluZVN0cikgY29uc3Q7CisKK3ByaXZhdGU6CisgIHZvaWQgZW1pdFYyRmlsZURpclRhYmxlcyhNQ1N0cmVhbWVyICpNQ09TKSBjb25zdDsKKyAgdm9pZCBlbWl0VjVGaWxlRGlyVGFibGVzKE1DU3RyZWFtZXIgKk1DT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxNQ0R3YXJmTGluZVN0cj4gJkxpbmVTdHIpIGNvbnN0OworfTsKKworY2xhc3MgTUNEd2FyZkR3b0xpbmVUYWJsZSB7CisgIE1DRHdhcmZMaW5lVGFibGVIZWFkZXIgSGVhZGVyOworCitwdWJsaWM6CisgIHZvaWQgbWF5YmVTZXRSb290RmlsZShTdHJpbmdSZWYgRGlyZWN0b3J5LCBTdHJpbmdSZWYgRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBNRDU6Ok1ENVJlc3VsdCAqQ2hlY2tzdW0sIE9wdGlvbmFsPFN0cmluZ1JlZj4gU291cmNlKSB7CisgICAgaWYgKCFIZWFkZXIuUm9vdEZpbGUuTmFtZS5lbXB0eSgpKQorICAgICAgcmV0dXJuOworICAgIEhlYWRlci5Db21waWxhdGlvbkRpciA9IERpcmVjdG9yeTsKKyAgICBIZWFkZXIuUm9vdEZpbGUuTmFtZSA9IEZpbGVOYW1lOworICAgIEhlYWRlci5Sb290RmlsZS5EaXJJbmRleCA9IDA7CisgICAgSGVhZGVyLlJvb3RGaWxlLkNoZWNrc3VtID0gQ2hlY2tzdW07CisgICAgSGVhZGVyLlJvb3RGaWxlLlNvdXJjZSA9IFNvdXJjZTsKKyAgICBIZWFkZXIuSGFzTUQ1ID0gKENoZWNrc3VtICE9IG51bGxwdHIpOworICAgIEhlYWRlci5IYXNTb3VyY2UgPSBTb3VyY2UuaGFzVmFsdWUoKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldEZpbGUoU3RyaW5nUmVmIERpcmVjdG9yeSwgU3RyaW5nUmVmIEZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgIE1ENTo6TUQ1UmVzdWx0ICpDaGVja3N1bSwgT3B0aW9uYWw8U3RyaW5nUmVmPiBTb3VyY2UpIHsKKyAgICByZXR1cm4gY2FudEZhaWwoSGVhZGVyLnRyeUdldEZpbGUoRGlyZWN0b3J5LCBGaWxlTmFtZSwgQ2hlY2tzdW0sIFNvdXJjZSkpOworICB9CisKKyAgdm9pZCBFbWl0KE1DU3RyZWFtZXIgJk1DT1MsIE1DRHdhcmZMaW5lVGFibGVQYXJhbXMgUGFyYW1zLAorICAgICAgICAgICAgTUNTZWN0aW9uICpTZWN0aW9uKSBjb25zdDsKK307CisKK2NsYXNzIE1DRHdhcmZMaW5lVGFibGUgeworICBNQ0R3YXJmTGluZVRhYmxlSGVhZGVyIEhlYWRlcjsKKyAgTUNMaW5lU2VjdGlvbiBNQ0xpbmVTZWN0aW9uczsKKworcHVibGljOgorICAvLyBUaGlzIGVtaXRzIHRoZSBEd2FyZiBmaWxlIGFuZCB0aGUgbGluZSB0YWJsZXMgZm9yIGFsbCBDb21waWxlIFVuaXRzLgorICBzdGF0aWMgdm9pZCBFbWl0KE1DT2JqZWN0U3RyZWFtZXIgKk1DT1MsIE1DRHdhcmZMaW5lVGFibGVQYXJhbXMgUGFyYW1zKTsKKworICAvLyBUaGlzIGVtaXRzIHRoZSBEd2FyZiBmaWxlIGFuZCB0aGUgbGluZSB0YWJsZXMgZm9yIGEgZ2l2ZW4gQ29tcGlsZSBVbml0LgorICB2b2lkIEVtaXRDVShNQ09iamVjdFN0cmVhbWVyICpNQ09TLCBNQ0R3YXJmTGluZVRhYmxlUGFyYW1zIFBhcmFtcywKKyAgICAgICAgICAgICAgT3B0aW9uYWw8TUNEd2FyZkxpbmVTdHI+ICZMaW5lU3RyKSBjb25zdDsKKworICBFeHBlY3RlZDx1bnNpZ25lZD4gdHJ5R2V0RmlsZShTdHJpbmdSZWYgJkRpcmVjdG9yeSwgU3RyaW5nUmVmICZGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUQ1OjpNRDVSZXN1bHQgKkNoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxTdHJpbmdSZWY+IFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmlsZU51bWJlciA9IDApOworICB1bnNpZ25lZCBnZXRGaWxlKFN0cmluZ1JlZiAmRGlyZWN0b3J5LCBTdHJpbmdSZWYgJkZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgIE1ENTo6TUQ1UmVzdWx0ICpDaGVja3N1bSwgT3B0aW9uYWw8U3RyaW5nUmVmPiAmU291cmNlLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZpbGVOdW1iZXIgPSAwKSB7CisgICAgcmV0dXJuIGNhbnRGYWlsKHRyeUdldEZpbGUoRGlyZWN0b3J5LCBGaWxlTmFtZSwgQ2hlY2tzdW0sIFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlTnVtYmVyKSk7CisgIH0KKworICB2b2lkIHNldFJvb3RGaWxlKFN0cmluZ1JlZiBEaXJlY3RvcnksIFN0cmluZ1JlZiBGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICBNRDU6Ok1ENVJlc3VsdCAqQ2hlY2tzdW0sIE9wdGlvbmFsPFN0cmluZ1JlZj4gU291cmNlKSB7CisgICAgSGVhZGVyLkNvbXBpbGF0aW9uRGlyID0gRGlyZWN0b3J5OworICAgIEhlYWRlci5Sb290RmlsZS5OYW1lID0gRmlsZU5hbWU7CisgICAgSGVhZGVyLlJvb3RGaWxlLkRpckluZGV4ID0gMDsKKyAgICBIZWFkZXIuUm9vdEZpbGUuQ2hlY2tzdW0gPSBDaGVja3N1bTsKKyAgICBIZWFkZXIuUm9vdEZpbGUuU291cmNlID0gU291cmNlOworICAgIEhlYWRlci5IYXNNRDUgPSAoQ2hlY2tzdW0gIT0gbnVsbHB0cik7CisgICAgSGVhZGVyLkhhc1NvdXJjZSA9IFNvdXJjZS5oYXNWYWx1ZSgpOworICB9CisKKyAgTUNTeW1ib2wgKmdldExhYmVsKCkgY29uc3QgeworICAgIHJldHVybiBIZWFkZXIuTGFiZWw7CisgIH0KKworICB2b2lkIHNldExhYmVsKE1DU3ltYm9sICpMYWJlbCkgeworICAgIEhlYWRlci5MYWJlbCA9IExhYmVsOworICB9CisKKyAgY29uc3QgU21hbGxWZWN0b3JJbXBsPHN0ZDo6c3RyaW5nPiAmZ2V0TUNEd2FyZkRpcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIEhlYWRlci5NQ0R3YXJmRGlyczsKKyAgfQorCisgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnN0cmluZz4gJmdldE1DRHdhcmZEaXJzKCkgeworICAgIHJldHVybiBIZWFkZXIuTUNEd2FyZkRpcnM7CisgIH0KKworICBjb25zdCBTbWFsbFZlY3RvckltcGw8TUNEd2FyZkZpbGU+ICZnZXRNQ0R3YXJmRmlsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEhlYWRlci5NQ0R3YXJmRmlsZXM7CisgIH0KKworICBTbWFsbFZlY3RvckltcGw8TUNEd2FyZkZpbGU+ICZnZXRNQ0R3YXJmRmlsZXMoKSB7CisgICAgcmV0dXJuIEhlYWRlci5NQ0R3YXJmRmlsZXM7CisgIH0KKworICBjb25zdCBNQ0xpbmVTZWN0aW9uICZnZXRNQ0xpbmVTZWN0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gTUNMaW5lU2VjdGlvbnM7CisgIH0KKyAgTUNMaW5lU2VjdGlvbiAmZ2V0TUNMaW5lU2VjdGlvbnMoKSB7CisgICAgcmV0dXJuIE1DTGluZVNlY3Rpb25zOworICB9Cit9OworCitjbGFzcyBNQ0R3YXJmTGluZUFkZHIgeworcHVibGljOgorICAvLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBlbmNvZGUgYSBEd2FyZiBwYWlyIG9mIExpbmVEZWx0YSBhbmQgQWRkckRlbHRhcy4KKyAgc3RhdGljIHZvaWQgRW5jb2RlKE1DQ29udGV4dCAmQ29udGV4dCwgTUNEd2FyZkxpbmVUYWJsZVBhcmFtcyBQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IExpbmVEZWx0YSwgdWludDY0X3QgQWRkckRlbHRhLCByYXdfb3N0cmVhbSAmT1MpOworCisgIC8vLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGVtaXQgdGhlIGVuY29kaW5nIHRvIGEgc3RyZWFtZXIuCisgIHN0YXRpYyB2b2lkIEVtaXQoTUNTdHJlYW1lciAqTUNPUywgTUNEd2FyZkxpbmVUYWJsZVBhcmFtcyBQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgaW50NjRfdCBMaW5lRGVsdGEsIHVpbnQ2NF90IEFkZHJEZWx0YSk7Cit9OworCitjbGFzcyBNQ0dlbkR3YXJmSW5mbyB7CitwdWJsaWM6CisgIC8vCisgIC8vIFdoZW4gZ2VuZXJhdGluZyBkd2FyZiBmb3IgYXNzZW1ibHkgc291cmNlIGZpbGVzIHRoaXMgZW1pdHMgdGhlIER3YXJmCisgIC8vIHNlY3Rpb25zLgorICAvLworICBzdGF0aWMgdm9pZCBFbWl0KE1DU3RyZWFtZXIgKk1DT1MpOworfTsKKworLy8gV2hlbiBnZW5lcmF0aW5nIGR3YXJmIGZvciBhc3NlbWJseSBzb3VyY2UgZmlsZXMgdGhpcyBpcyB0aGUgaW5mbyB0aGF0IGlzCisvLyBuZWVkZWQgdG8gYmUgZ2F0aGVyZWQgZm9yIGVhY2ggc3ltYm9sIHRoYXQgd2lsbCBoYXZlIGEgZHdhcmYgbGFiZWwuCitjbGFzcyBNQ0dlbkR3YXJmTGFiZWxFbnRyeSB7Citwcml2YXRlOgorICAvLyBOYW1lIG9mIHRoZSBzeW1ib2wgd2l0aG91dCBhIGxlYWRpbmcgdW5kZXJiYXIsIGlmIGFueS4KKyAgU3RyaW5nUmVmIE5hbWU7CisgIC8vIFRoZSBkd2FyZiBmaWxlIG51bWJlciB0aGlzIHN5bWJvbCBpcyBpbi4KKyAgdW5zaWduZWQgRmlsZU51bWJlcjsKKyAgLy8gVGhlIGxpbmUgbnVtYmVyIHRoaXMgc3ltYm9sIGlzIGF0LgorICB1bnNpZ25lZCBMaW5lTnVtYmVyOworICAvLyBUaGUgbG93X3BjIGZvciB0aGUgZHdhcmYgbGFiZWwgaXMgdGFrZW4gZnJvbSB0aGlzIHN5bWJvbC4KKyAgTUNTeW1ib2wgKkxhYmVsOworCitwdWJsaWM6CisgIE1DR2VuRHdhcmZMYWJlbEVudHJ5KFN0cmluZ1JlZiBuYW1lLCB1bnNpZ25lZCBmaWxlTnVtYmVyLCB1bnNpZ25lZCBsaW5lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICBNQ1N5bWJvbCAqbGFiZWwpCisgICAgICA6IE5hbWUobmFtZSksIEZpbGVOdW1iZXIoZmlsZU51bWJlciksIExpbmVOdW1iZXIobGluZU51bWJlciksCisgICAgICAgIExhYmVsKGxhYmVsKSB7fQorCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorICB1bnNpZ25lZCBnZXRGaWxlTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gRmlsZU51bWJlcjsgfQorICB1bnNpZ25lZCBnZXRMaW5lTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gTGluZU51bWJlcjsgfQorICBNQ1N5bWJvbCAqZ2V0TGFiZWwoKSBjb25zdCB7IHJldHVybiBMYWJlbDsgfQorCisgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gbGFiZWwgaXMgY3JlYXRlZCB3aGVuIHdlIGFyZSBnZW5lcmF0aW5nIGR3YXJmIGZvcgorICAvLyBhc3NlbWJseSBzb3VyY2UgZmlsZXMuCisgIHN0YXRpYyB2b2lkIE1ha2UoTUNTeW1ib2wgKlN5bWJvbCwgTUNTdHJlYW1lciAqTUNPUywgU291cmNlTWdyICZTcmNNZ3IsCisgICAgICAgICAgICAgICAgICAgU01Mb2MgJkxvYyk7Cit9OworCitjbGFzcyBNQ0NGSUluc3RydWN0aW9uIHsKK3B1YmxpYzoKKyAgZW51bSBPcFR5cGUgeworICAgIE9wU2FtZVZhbHVlLAorICAgIE9wUmVtZW1iZXJTdGF0ZSwKKyAgICBPcFJlc3RvcmVTdGF0ZSwKKyAgICBPcE9mZnNldCwKKyAgICBPcERlZkNmYVJlZ2lzdGVyLAorICAgIE9wRGVmQ2ZhT2Zmc2V0LAorICAgIE9wRGVmQ2ZhLAorICAgIE9wUmVsT2Zmc2V0LAorICAgIE9wQWRqdXN0Q2ZhT2Zmc2V0LAorICAgIE9wRXNjYXBlLAorICAgIE9wUmVzdG9yZSwKKyAgICBPcFVuZGVmaW5lZCwKKyAgICBPcFJlZ2lzdGVyLAorICAgIE9wV2luZG93U2F2ZSwKKyAgICBPcEdudUFyZ3NTaXplCisgIH07CisKK3ByaXZhdGU6CisgIE9wVHlwZSBPcGVyYXRpb247CisgIE1DU3ltYm9sICpMYWJlbDsKKyAgdW5zaWduZWQgUmVnaXN0ZXI7CisgIHVuaW9uIHsKKyAgICBpbnQgT2Zmc2V0OworICAgIHVuc2lnbmVkIFJlZ2lzdGVyMjsKKyAgfTsKKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gVmFsdWVzOworCisgIE1DQ0ZJSW5zdHJ1Y3Rpb24oT3BUeXBlIE9wLCBNQ1N5bWJvbCAqTCwgdW5zaWduZWQgUiwgaW50IE8sIFN0cmluZ1JlZiBWKQorICAgICAgOiBPcGVyYXRpb24oT3ApLCBMYWJlbChMKSwgUmVnaXN0ZXIoUiksIE9mZnNldChPKSwKKyAgICAgICAgVmFsdWVzKFYuYmVnaW4oKSwgVi5lbmQoKSkgeworICAgIGFzc2VydChPcCAhPSBPcFJlZ2lzdGVyKTsKKyAgfQorCisgIE1DQ0ZJSW5zdHJ1Y3Rpb24oT3BUeXBlIE9wLCBNQ1N5bWJvbCAqTCwgdW5zaWduZWQgUjEsIHVuc2lnbmVkIFIyKQorICAgICAgOiBPcGVyYXRpb24oT3ApLCBMYWJlbChMKSwgUmVnaXN0ZXIoUjEpLCBSZWdpc3RlcjIoUjIpIHsKKyAgICBhc3NlcnQoT3AgPT0gT3BSZWdpc3Rlcik7CisgIH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIC5jZmlfZGVmX2NmYSBkZWZpbmVzIGEgcnVsZSBmb3IgY29tcHV0aW5nIENGQSBhczogdGFrZSBhZGRyZXNzIGZyb20KKyAgLy8vIFJlZ2lzdGVyIGFuZCBhZGQgT2Zmc2V0IHRvIGl0LgorICBzdGF0aWMgTUNDRklJbnN0cnVjdGlvbiBjcmVhdGVEZWZDZmEoTUNTeW1ib2wgKkwsIHVuc2lnbmVkIFJlZ2lzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE9mZnNldCkgeworICAgIHJldHVybiBNQ0NGSUluc3RydWN0aW9uKE9wRGVmQ2ZhLCBMLCBSZWdpc3RlciwgLU9mZnNldCwgIiIpOworICB9CisKKyAgLy8vIFxicmllZiAuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIgbW9kaWZpZXMgYSBydWxlIGZvciBjb21wdXRpbmcgQ0ZBLiBGcm9tIG5vdworICAvLy8gb24gUmVnaXN0ZXIgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIG9sZCBvbmUuIE9mZnNldCByZW1haW5zIHRoZSBzYW1lLgorICBzdGF0aWMgTUNDRklJbnN0cnVjdGlvbiBjcmVhdGVEZWZDZmFSZWdpc3RlcihNQ1N5bWJvbCAqTCwgdW5zaWduZWQgUmVnaXN0ZXIpIHsKKyAgICByZXR1cm4gTUNDRklJbnN0cnVjdGlvbihPcERlZkNmYVJlZ2lzdGVyLCBMLCBSZWdpc3RlciwgMCwgIiIpOworICB9CisKKyAgLy8vIFxicmllZiAuY2ZpX2RlZl9jZmFfb2Zmc2V0IG1vZGlmaWVzIGEgcnVsZSBmb3IgY29tcHV0aW5nIENGQS4gUmVnaXN0ZXIKKyAgLy8vIHJlbWFpbnMgdGhlIHNhbWUsIGJ1dCBvZmZzZXQgaXMgbmV3LiBOb3RlIHRoYXQgaXQgaXMgdGhlIGFic29sdXRlIG9mZnNldAorICAvLy8gdGhhdCB3aWxsIGJlIGFkZGVkIHRvIGEgZGVmaW5lZCByZWdpc3RlciB0byB0aGUgY29tcHV0ZSBDRkEgYWRkcmVzcy4KKyAgc3RhdGljIE1DQ0ZJSW5zdHJ1Y3Rpb24gY3JlYXRlRGVmQ2ZhT2Zmc2V0KE1DU3ltYm9sICpMLCBpbnQgT2Zmc2V0KSB7CisgICAgcmV0dXJuIE1DQ0ZJSW5zdHJ1Y3Rpb24oT3BEZWZDZmFPZmZzZXQsIEwsIDAsIC1PZmZzZXQsICIiKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgLmNmaV9hZGp1c3RfY2ZhX29mZnNldCBTYW1lIGFzIC5jZmlfZGVmX2NmYV9vZmZzZXQsIGJ1dAorICAvLy8gT2Zmc2V0IGlzIGEgcmVsYXRpdmUgdmFsdWUgdGhhdCBpcyBhZGRlZC9zdWJ0cmFjdGVkIGZyb20gdGhlIHByZXZpb3VzCisgIC8vLyBvZmZzZXQuCisgIHN0YXRpYyBNQ0NGSUluc3RydWN0aW9uIGNyZWF0ZUFkanVzdENmYU9mZnNldChNQ1N5bWJvbCAqTCwgaW50IEFkanVzdG1lbnQpIHsKKyAgICByZXR1cm4gTUNDRklJbnN0cnVjdGlvbihPcEFkanVzdENmYU9mZnNldCwgTCwgMCwgQWRqdXN0bWVudCwgIiIpOworICB9CisKKyAgLy8vIFxicmllZiAuY2ZpX29mZnNldCBQcmV2aW91cyB2YWx1ZSBvZiBSZWdpc3RlciBpcyBzYXZlZCBhdCBvZmZzZXQgT2Zmc2V0CisgIC8vLyBmcm9tIENGQS4KKyAgc3RhdGljIE1DQ0ZJSW5zdHJ1Y3Rpb24gY3JlYXRlT2Zmc2V0KE1DU3ltYm9sICpMLCB1bnNpZ25lZCBSZWdpc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBPZmZzZXQpIHsKKyAgICByZXR1cm4gTUNDRklJbnN0cnVjdGlvbihPcE9mZnNldCwgTCwgUmVnaXN0ZXIsIE9mZnNldCwgIiIpOworICB9CisKKyAgLy8vIFxicmllZiAuY2ZpX3JlbF9vZmZzZXQgUHJldmlvdXMgdmFsdWUgb2YgUmVnaXN0ZXIgaXMgc2F2ZWQgYXQgb2Zmc2V0CisgIC8vLyBPZmZzZXQgZnJvbSB0aGUgY3VycmVudCBDRkEgcmVnaXN0ZXIuIFRoaXMgaXMgdHJhbnNmb3JtZWQgdG8gLmNmaV9vZmZzZXQKKyAgLy8vIHVzaW5nIHRoZSBrbm93biBkaXNwbGFjZW1lbnQgb2YgdGhlIENGQSByZWdpc3RlciBmcm9tIHRoZSBDRkEuCisgIHN0YXRpYyBNQ0NGSUluc3RydWN0aW9uIGNyZWF0ZVJlbE9mZnNldChNQ1N5bWJvbCAqTCwgdW5zaWduZWQgUmVnaXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgT2Zmc2V0KSB7CisgICAgcmV0dXJuIE1DQ0ZJSW5zdHJ1Y3Rpb24oT3BSZWxPZmZzZXQsIEwsIFJlZ2lzdGVyLCBPZmZzZXQsICIiKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgLmNmaV9yZWdpc3RlciBQcmV2aW91cyB2YWx1ZSBvZiBSZWdpc3RlcjEgaXMgc2F2ZWQgaW4KKyAgLy8vIHJlZ2lzdGVyIFJlZ2lzdGVyMi4KKyAgc3RhdGljIE1DQ0ZJSW5zdHJ1Y3Rpb24gY3JlYXRlUmVnaXN0ZXIoTUNTeW1ib2wgKkwsIHVuc2lnbmVkIFJlZ2lzdGVyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnaXN0ZXIyKSB7CisgICAgcmV0dXJuIE1DQ0ZJSW5zdHJ1Y3Rpb24oT3BSZWdpc3RlciwgTCwgUmVnaXN0ZXIxLCBSZWdpc3RlcjIpOworICB9CisKKyAgLy8vIFxicmllZiAuY2ZpX3dpbmRvd19zYXZlIFNQQVJDIHJlZ2lzdGVyIHdpbmRvdyBpcyBzYXZlZC4KKyAgc3RhdGljIE1DQ0ZJSW5zdHJ1Y3Rpb24gY3JlYXRlV2luZG93U2F2ZShNQ1N5bWJvbCAqTCkgeworICAgIHJldHVybiBNQ0NGSUluc3RydWN0aW9uKE9wV2luZG93U2F2ZSwgTCwgMCwgMCwgIiIpOworICB9CisKKyAgLy8vIFxicmllZiAuY2ZpX3Jlc3RvcmUgc2F5cyB0aGF0IHRoZSBydWxlIGZvciBSZWdpc3RlciBpcyBub3cgdGhlIHNhbWUgYXMgaXQKKyAgLy8vIHdhcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmdW5jdGlvbiwgYWZ0ZXIgYWxsIGluaXRpYWwgaW5zdHJ1Y3Rpb25zIGFkZGVkCisgIC8vLyBieSAuY2ZpX3N0YXJ0cHJvYyB3ZXJlIGV4ZWN1dGVkLgorICBzdGF0aWMgTUNDRklJbnN0cnVjdGlvbiBjcmVhdGVSZXN0b3JlKE1DU3ltYm9sICpMLCB1bnNpZ25lZCBSZWdpc3RlcikgeworICAgIHJldHVybiBNQ0NGSUluc3RydWN0aW9uKE9wUmVzdG9yZSwgTCwgUmVnaXN0ZXIsIDAsICIiKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgLmNmaV91bmRlZmluZWQgRnJvbSBub3cgb24gdGhlIHByZXZpb3VzIHZhbHVlIG9mIFJlZ2lzdGVyIGNhbid0IGJlCisgIC8vLyByZXN0b3JlZCBhbnltb3JlLgorICBzdGF0aWMgTUNDRklJbnN0cnVjdGlvbiBjcmVhdGVVbmRlZmluZWQoTUNTeW1ib2wgKkwsIHVuc2lnbmVkIFJlZ2lzdGVyKSB7CisgICAgcmV0dXJuIE1DQ0ZJSW5zdHJ1Y3Rpb24oT3BVbmRlZmluZWQsIEwsIFJlZ2lzdGVyLCAwLCAiIik7CisgIH0KKworICAvLy8gXGJyaWVmIC5jZmlfc2FtZV92YWx1ZSBDdXJyZW50IHZhbHVlIG9mIFJlZ2lzdGVyIGlzIHRoZSBzYW1lIGFzIGluIHRoZQorICAvLy8gcHJldmlvdXMgZnJhbWUuIEkuZS4sIG5vIHJlc3RvcmF0aW9uIGlzIG5lZWRlZC4KKyAgc3RhdGljIE1DQ0ZJSW5zdHJ1Y3Rpb24gY3JlYXRlU2FtZVZhbHVlKE1DU3ltYm9sICpMLCB1bnNpZ25lZCBSZWdpc3RlcikgeworICAgIHJldHVybiBNQ0NGSUluc3RydWN0aW9uKE9wU2FtZVZhbHVlLCBMLCBSZWdpc3RlciwgMCwgIiIpOworICB9CisKKyAgLy8vIFxicmllZiAuY2ZpX3JlbWVtYmVyX3N0YXRlIFNhdmUgYWxsIGN1cnJlbnQgcnVsZXMgZm9yIGFsbCByZWdpc3RlcnMuCisgIHN0YXRpYyBNQ0NGSUluc3RydWN0aW9uIGNyZWF0ZVJlbWVtYmVyU3RhdGUoTUNTeW1ib2wgKkwpIHsKKyAgICByZXR1cm4gTUNDRklJbnN0cnVjdGlvbihPcFJlbWVtYmVyU3RhdGUsIEwsIDAsIDAsICIiKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgLmNmaV9yZXN0b3JlX3N0YXRlIFJlc3RvcmUgdGhlIHByZXZpb3VzbHkgc2F2ZWQgc3RhdGUuCisgIHN0YXRpYyBNQ0NGSUluc3RydWN0aW9uIGNyZWF0ZVJlc3RvcmVTdGF0ZShNQ1N5bWJvbCAqTCkgeworICAgIHJldHVybiBNQ0NGSUluc3RydWN0aW9uKE9wUmVzdG9yZVN0YXRlLCBMLCAwLCAwLCAiIik7CisgIH0KKworICAvLy8gXGJyaWVmIC5jZmlfZXNjYXBlIEFsbG93cyB0aGUgdXNlciB0byBhZGQgYXJiaXRyYXJ5IGJ5dGVzIHRvIHRoZSB1bndpbmQKKyAgLy8vIGluZm8uCisgIHN0YXRpYyBNQ0NGSUluc3RydWN0aW9uIGNyZWF0ZUVzY2FwZShNQ1N5bWJvbCAqTCwgU3RyaW5nUmVmIFZhbHMpIHsKKyAgICByZXR1cm4gTUNDRklJbnN0cnVjdGlvbihPcEVzY2FwZSwgTCwgMCwgMCwgVmFscyk7CisgIH0KKworICAvLy8gXGJyaWVmIEEgc3BlY2lhbCB3cmFwcGVyIGZvciAuY2ZpX2VzY2FwZSB0aGF0IGluZGljYXRlcyBHTlVfQVJHU19TSVpFCisgIHN0YXRpYyBNQ0NGSUluc3RydWN0aW9uIGNyZWF0ZUdudUFyZ3NTaXplKE1DU3ltYm9sICpMLCBpbnQgU2l6ZSkgeworICAgIHJldHVybiBNQ0NGSUluc3RydWN0aW9uKE9wR251QXJnc1NpemUsIEwsIDAsIFNpemUsICIiKTsKKyAgfQorCisgIE9wVHlwZSBnZXRPcGVyYXRpb24oKSBjb25zdCB7IHJldHVybiBPcGVyYXRpb247IH0KKyAgTUNTeW1ib2wgKmdldExhYmVsKCkgY29uc3QgeyByZXR1cm4gTGFiZWw7IH0KKworICB1bnNpZ25lZCBnZXRSZWdpc3RlcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoT3BlcmF0aW9uID09IE9wRGVmQ2ZhIHx8IE9wZXJhdGlvbiA9PSBPcE9mZnNldCB8fAorICAgICAgICAgICBPcGVyYXRpb24gPT0gT3BSZXN0b3JlIHx8IE9wZXJhdGlvbiA9PSBPcFVuZGVmaW5lZCB8fAorICAgICAgICAgICBPcGVyYXRpb24gPT0gT3BTYW1lVmFsdWUgfHwgT3BlcmF0aW9uID09IE9wRGVmQ2ZhUmVnaXN0ZXIgfHwKKyAgICAgICAgICAgT3BlcmF0aW9uID09IE9wUmVsT2Zmc2V0IHx8IE9wZXJhdGlvbiA9PSBPcFJlZ2lzdGVyKTsKKyAgICByZXR1cm4gUmVnaXN0ZXI7CisgIH0KKworICB1bnNpZ25lZCBnZXRSZWdpc3RlcjIoKSBjb25zdCB7CisgICAgYXNzZXJ0KE9wZXJhdGlvbiA9PSBPcFJlZ2lzdGVyKTsKKyAgICByZXR1cm4gUmVnaXN0ZXIyOworICB9CisKKyAgaW50IGdldE9mZnNldCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoT3BlcmF0aW9uID09IE9wRGVmQ2ZhIHx8IE9wZXJhdGlvbiA9PSBPcE9mZnNldCB8fAorICAgICAgICAgICBPcGVyYXRpb24gPT0gT3BSZWxPZmZzZXQgfHwgT3BlcmF0aW9uID09IE9wRGVmQ2ZhT2Zmc2V0IHx8CisgICAgICAgICAgIE9wZXJhdGlvbiA9PSBPcEFkanVzdENmYU9mZnNldCB8fCBPcGVyYXRpb24gPT0gT3BHbnVBcmdzU2l6ZSk7CisgICAgcmV0dXJuIE9mZnNldDsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRWYWx1ZXMoKSBjb25zdCB7CisgICAgYXNzZXJ0KE9wZXJhdGlvbiA9PSBPcEVzY2FwZSk7CisgICAgcmV0dXJuIFN0cmluZ1JlZigmVmFsdWVzWzBdLCBWYWx1ZXMuc2l6ZSgpKTsKKyAgfQorfTsKKworc3RydWN0IE1DRHdhcmZGcmFtZUluZm8geworICBNQ0R3YXJmRnJhbWVJbmZvKCkgPSBkZWZhdWx0OworCisgIE1DU3ltYm9sICpCZWdpbiA9IG51bGxwdHI7CisgIE1DU3ltYm9sICpFbmQgPSBudWxscHRyOworICBjb25zdCBNQ1N5bWJvbCAqUGVyc29uYWxpdHkgPSBudWxscHRyOworICBjb25zdCBNQ1N5bWJvbCAqTHNkYSA9IG51bGxwdHI7CisgIHN0ZDo6dmVjdG9yPE1DQ0ZJSW5zdHJ1Y3Rpb24+IEluc3RydWN0aW9uczsKKyAgdW5zaWduZWQgQ3VycmVudENmYVJlZ2lzdGVyID0gMDsKKyAgdW5zaWduZWQgUGVyc29uYWxpdHlFbmNvZGluZyA9IDA7CisgIHVuc2lnbmVkIExzZGFFbmNvZGluZyA9IDA7CisgIHVpbnQzMl90IENvbXBhY3RVbndpbmRFbmNvZGluZyA9IDA7CisgIGJvb2wgSXNTaWduYWxGcmFtZSA9IGZhbHNlOworICBib29sIElzU2ltcGxlID0gZmFsc2U7CisgIHVuc2lnbmVkIFJBUmVnID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KElOVF9NQVgpOworfTsKKworY2xhc3MgTUNEd2FyZkZyYW1lRW1pdHRlciB7CitwdWJsaWM6CisgIC8vCisgIC8vIFRoaXMgZW1pdHMgdGhlIGZyYW1lIGluZm8gc2VjdGlvbi4KKyAgLy8KKyAgc3RhdGljIHZvaWQgRW1pdChNQ09iamVjdFN0cmVhbWVyICZzdHJlYW1lciwgTUNBc21CYWNrZW5kICpNQUIsIGJvb2wgaXNFSCk7CisgIHN0YXRpYyB2b2lkIEVtaXRBZHZhbmNlTG9jKE1DT2JqZWN0U3RyZWFtZXIgJlN0cmVhbWVyLCB1aW50NjRfdCBBZGRyRGVsdGEpOworICBzdGF0aWMgdm9pZCBFbmNvZGVBZHZhbmNlTG9jKE1DQ29udGV4dCAmQ29udGV4dCwgdWludDY0X3QgQWRkckRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUyk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ0RXQVJGX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNFTEZPYmplY3RXcml0ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNFTEZPYmplY3RXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDhkMTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0VMRk9iamVjdFdyaXRlci5oCkBAIC0wLDAgKzEsMTQ2IEBACisvLz09PS0gbGx2bS9NQy9NQ0VMRk9iamVjdFdyaXRlci5oIC0gRUxGIE9iamVjdCBXcml0ZXIgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNFTEZPQkpFQ1RXUklURVJfSAorI2RlZmluZSBMTFZNX01DX01DRUxGT0JKRUNUV1JJVEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0VMRi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNBc3NlbWJsZXI7CitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBNQ0ZpeHVwOworY2xhc3MgTUNPYmplY3RXcml0ZXI7CitjbGFzcyBNQ1N5bWJvbDsKK2NsYXNzIE1DU3ltYm9sRUxGOworY2xhc3MgTUNWYWx1ZTsKKworc3RydWN0IEVMRlJlbG9jYXRpb25FbnRyeSB7CisgIHVpbnQ2NF90IE9mZnNldDsgLy8gV2hlcmUgaXMgdGhlIHJlbG9jYXRpb24uCisgIGNvbnN0IE1DU3ltYm9sRUxGICpTeW1ib2w7IC8vIFRoZSBzeW1ib2wgdG8gcmVsb2NhdGUgd2l0aC4KKyAgdW5zaWduZWQgVHlwZTsgICAvLyBUaGUgdHlwZSBvZiB0aGUgcmVsb2NhdGlvbi4KKyAgdWludDY0X3QgQWRkZW5kOyAvLyBUaGUgYWRkZW5kIHRvIHVzZS4KKyAgY29uc3QgTUNTeW1ib2xFTEYgKk9yaWdpbmFsU3ltYm9sOyAvLyBUaGUgb3JpZ2luYWwgdmFsdWUgb2YgU3ltYm9sIGlmIHdlIGNoYW5nZWQgaXQuCisgIHVpbnQ2NF90IE9yaWdpbmFsQWRkZW5kOyAvLyBUaGUgb3JpZ2luYWwgdmFsdWUgb2YgYWRkZW5kLgorCisgIEVMRlJlbG9jYXRpb25FbnRyeSh1aW50NjRfdCBPZmZzZXQsIGNvbnN0IE1DU3ltYm9sRUxGICpTeW1ib2wsIHVuc2lnbmVkIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBBZGRlbmQsIGNvbnN0IE1DU3ltYm9sRUxGICpPcmlnaW5hbFN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9yaWdpbmFsQWRkZW5kKQorICAgICAgOiBPZmZzZXQoT2Zmc2V0KSwgU3ltYm9sKFN5bWJvbCksIFR5cGUoVHlwZSksIEFkZGVuZChBZGRlbmQpLAorICAgICAgICBPcmlnaW5hbFN5bWJvbChPcmlnaW5hbFN5bWJvbCksIE9yaWdpbmFsQWRkZW5kKE9yaWdpbmFsQWRkZW5kKSB7fQorCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk91dCkgY29uc3QgeworICAgIE91dCA8PCAiT2ZmPSIgPDwgT2Zmc2V0IDw8ICIsIFN5bT0iIDw8IFN5bWJvbCA8PCAiLCBUeXBlPSIgPDwgVHlwZQorICAgICAgICA8PCAiLCBBZGRlbmQ9IiA8PCBBZGRlbmQgPDwgIiwgT3JpZ2luYWxTeW1ib2w9IiA8PCBPcmlnaW5hbFN5bWJvbAorICAgICAgICA8PCAiLCBPcmlnaW5hbEFkZGVuZD0iIDw8IE9yaWdpbmFsQWRkZW5kOworICB9CisKKyAgdm9pZCBkdW1wKCkgY29uc3QgeyBwcmludChlcnJzKCkpOyB9Cit9OworCitjbGFzcyBNQ0VMRk9iamVjdFRhcmdldFdyaXRlciB7CisgIGNvbnN0IHVpbnQ4X3QgT1NBQkk7CisgIGNvbnN0IHVpbnQxNl90IEVNYWNoaW5lOworICBjb25zdCB1bnNpZ25lZCBIYXNSZWxvY2F0aW9uQWRkZW5kIDogMTsKKyAgY29uc3QgdW5zaWduZWQgSXM2NEJpdCA6IDE7CisKK3Byb3RlY3RlZDoKKyAgTUNFTEZPYmplY3RUYXJnZXRXcml0ZXIoYm9vbCBJczY0Qml0XywgdWludDhfdCBPU0FCSV8sIHVpbnQxNl90IEVNYWNoaW5lXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNSZWxvY2F0aW9uQWRkZW5kKTsKKworcHVibGljOgorICB2aXJ0dWFsIH5NQ0VMRk9iamVjdFRhcmdldFdyaXRlcigpID0gZGVmYXVsdDsKKworICBzdGF0aWMgdWludDhfdCBnZXRPU0FCSShUcmlwbGU6Ok9TVHlwZSBPU1R5cGUpIHsKKyAgICBzd2l0Y2ggKE9TVHlwZSkgeworICAgICAgY2FzZSBUcmlwbGU6OkNsb3VkQUJJOgorICAgICAgICByZXR1cm4gRUxGOjpFTEZPU0FCSV9DTE9VREFCSTsKKyAgICAgIGNhc2UgVHJpcGxlOjpQUzQ6CisgICAgICBjYXNlIFRyaXBsZTo6RnJlZUJTRDoKKyAgICAgICAgcmV0dXJuIEVMRjo6RUxGT1NBQklfRlJFRUJTRDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBFTEY6OkVMRk9TQUJJX05PTkU7CisgICAgfQorICB9CisKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRSZWxvY1R5cGUoTUNDb250ZXh0ICZDdHgsIGNvbnN0IE1DVmFsdWUgJlRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGaXh1cCAmRml4dXAsIGJvb2wgSXNQQ1JlbCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgYm9vbCBuZWVkc1JlbG9jYXRlV2l0aFN5bWJvbChjb25zdCBNQ1N5bWJvbCAmU3ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVHlwZSkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIHNvcnRSZWxvY3MoY29uc3QgTUNBc3NlbWJsZXIgJkFzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RUxGUmVsb2NhdGlvbkVudHJ5PiAmUmVsb2NzKTsKKworICAvLy8gXG5hbWUgQWNjZXNzb3JzCisgIC8vLyBAeworICB1aW50OF90IGdldE9TQUJJKCkgY29uc3QgeyByZXR1cm4gT1NBQkk7IH0KKyAgdWludDE2X3QgZ2V0RU1hY2hpbmUoKSBjb25zdCB7IHJldHVybiBFTWFjaGluZTsgfQorICBib29sIGhhc1JlbG9jYXRpb25BZGRlbmQoKSBjb25zdCB7IHJldHVybiBIYXNSZWxvY2F0aW9uQWRkZW5kOyB9CisgIGJvb2wgaXM2NEJpdCgpIGNvbnN0IHsgcmV0dXJuIElzNjRCaXQ7IH0KKyAgLy8vIEB9CisKKyAgLy8gSW5zdGVhZCBvZiBjaGFuZ2luZyBldmVyeW9uZSdzIEFQSSB3ZSBwYWNrIHRoZSBONjQgVHlwZSBmaWVsZHMKKyAgLy8gaW50byB0aGUgZXhpc3RpbmcgMzIgYml0IGRhdGEgdW5zaWduZWQuCisjZGVmaW5lIFJfVFlQRV9TSElGVCAwCisjZGVmaW5lIFJfVFlQRV9NQVNLIDB4ZmZmZmZmMDAKKyNkZWZpbmUgUl9UWVBFMl9TSElGVCA4CisjZGVmaW5lIFJfVFlQRTJfTUFTSyAweGZmZmYwMGZmCisjZGVmaW5lIFJfVFlQRTNfU0hJRlQgMTYKKyNkZWZpbmUgUl9UWVBFM19NQVNLIDB4ZmYwMGZmZmYKKyNkZWZpbmUgUl9TU1lNX1NISUZUIDI0CisjZGVmaW5lIFJfU1NZTV9NQVNLIDB4MDBmZmZmZmYKKworICAvLyBONjQgcmVsb2NhdGlvbiB0eXBlIGFjY2Vzc29ycworICB1aW50OF90IGdldFJUeXBlKHVpbnQzMl90IFR5cGUpIGNvbnN0IHsKKyAgICByZXR1cm4gKHVuc2lnbmVkKSgoVHlwZSA+PiBSX1RZUEVfU0hJRlQpICYgMHhmZik7CisgIH0KKyAgdWludDhfdCBnZXRSVHlwZTIodWludDMyX3QgVHlwZSkgY29uc3QgeworICAgIHJldHVybiAodW5zaWduZWQpKChUeXBlID4+IFJfVFlQRTJfU0hJRlQpICYgMHhmZik7CisgIH0KKyAgdWludDhfdCBnZXRSVHlwZTModWludDMyX3QgVHlwZSkgY29uc3QgeworICAgIHJldHVybiAodW5zaWduZWQpKChUeXBlID4+IFJfVFlQRTNfU0hJRlQpICYgMHhmZik7CisgIH0KKyAgdWludDhfdCBnZXRSU3N5bSh1aW50MzJfdCBUeXBlKSBjb25zdCB7CisgICAgcmV0dXJuICh1bnNpZ25lZCkoKFR5cGUgPj4gUl9TU1lNX1NISUZUKSAmIDB4ZmYpOworICB9CisKKyAgLy8gTjY0IHJlbG9jYXRpb24gdHlwZSBzZXR0aW5nCisgIHVuc2lnbmVkIHNldFJUeXBlKHVuc2lnbmVkIFZhbHVlLCB1bnNpZ25lZCBUeXBlKSBjb25zdCB7CisgICAgcmV0dXJuICgoVHlwZSAmIFJfVFlQRV9NQVNLKSB8ICgoVmFsdWUgJiAweGZmKSA8PCBSX1RZUEVfU0hJRlQpKTsKKyAgfQorICB1bnNpZ25lZCBzZXRSVHlwZTIodW5zaWduZWQgVmFsdWUsIHVuc2lnbmVkIFR5cGUpIGNvbnN0IHsKKyAgICByZXR1cm4gKFR5cGUgJiBSX1RZUEUyX01BU0spIHwgKChWYWx1ZSAmIDB4ZmYpIDw8IFJfVFlQRTJfU0hJRlQpOworICB9CisgIHVuc2lnbmVkIHNldFJUeXBlMyh1bnNpZ25lZCBWYWx1ZSwgdW5zaWduZWQgVHlwZSkgY29uc3QgeworICAgIHJldHVybiAoVHlwZSAmIFJfVFlQRTNfTUFTSykgfCAoKFZhbHVlICYgMHhmZikgPDwgUl9UWVBFM19TSElGVCk7CisgIH0KKyAgdW5zaWduZWQgc2V0UlNzeW0odW5zaWduZWQgVmFsdWUsIHVuc2lnbmVkIFR5cGUpIGNvbnN0IHsKKyAgICByZXR1cm4gKFR5cGUgJiBSX1NTWU1fTUFTSykgfCAoKFZhbHVlICYgMHhmZikgPDwgUl9TU1lNX1NISUZUKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBuZXcgRUxGIHdyaXRlciBpbnN0YW5jZS4KKy8vLworLy8vIFxwYXJhbSBNT1RXIC0gVGhlIHRhcmdldCBzcGVjaWZpYyBFTEYgd3JpdGVyIHN1YmNsYXNzLgorLy8vIFxwYXJhbSBPUyAtIFRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uCisvLy8gXHJldHVybnMgVGhlIGNvbnN0cnVjdGVkIG9iamVjdCB3cml0ZXIuCitzdGQ6OnVuaXF1ZV9wdHI8TUNPYmplY3RXcml0ZXI+CitjcmVhdGVFTEZPYmplY3RXcml0ZXIoc3RkOjp1bmlxdWVfcHRyPE1DRUxGT2JqZWN0VGFyZ2V0V3JpdGVyPiBNT1RXLAorICAgICAgICAgICAgICAgICAgICAgIHJhd19wd3JpdGVfc3RyZWFtICZPUywgYm9vbCBJc0xpdHRsZUVuZGlhbik7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DRUxGT0JKRUNUV1JJVEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNFTEZTdHJlYW1lci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0VMRlN0cmVhbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYyM2NkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNFTEZTdHJlYW1lci5oCkBAIC0wLDAgKzEsMTAyIEBACisvLz09PS0gTUNFTEZTdHJlYW1lci5oIC0gTUNTdHJlYW1lciBFTEYgT2JqZWN0IEZpbGUgSW50ZXJmYWNlIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNFTEZTVFJFQU1FUl9ICisjZGVmaW5lIExMVk1fTUNfTUNFTEZTVFJFQU1FUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNEaXJlY3RpdmVzLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ09iamVjdFN0cmVhbWVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNBc21CYWNrZW5kOworY2xhc3MgTUNDb2RlRW1pdHRlcjsKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIE1DSW5zdDsKKworY2xhc3MgTUNFTEZTdHJlYW1lciA6IHB1YmxpYyBNQ09iamVjdFN0cmVhbWVyIHsKK3B1YmxpYzoKKyAgTUNFTEZTdHJlYW1lcihNQ0NvbnRleHQgJkNvbnRleHQsIHN0ZDo6dW5pcXVlX3B0cjxNQ0FzbUJhY2tlbmQ+IFRBQiwKKyAgICAgICAgICAgICAgICByYXdfcHdyaXRlX3N0cmVhbSAmT1MsIHN0ZDo6dW5pcXVlX3B0cjxNQ0NvZGVFbWl0dGVyPiBFbWl0dGVyKTsKKworICB+TUNFTEZTdHJlYW1lcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAvLy8gc3RhdGUgbWFuYWdlbWVudAorICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGUgeworICAgIFNlZW5JZGVudCA9IGZhbHNlOworICAgIEJ1bmRsZUdyb3Vwcy5jbGVhcigpOworICAgIE1DT2JqZWN0U3RyZWFtZXI6OnJlc2V0KCk7CisgIH0KKworICAvLy8gXG5hbWUgTUNTdHJlYW1lciBJbnRlcmZhY2UKKyAgLy8vIEB7CisKKyAgdm9pZCBJbml0U2VjdGlvbnMoYm9vbCBOb0V4ZWNTdGFjaykgb3ZlcnJpZGU7CisgIHZvaWQgQ2hhbmdlU2VjdGlvbihNQ1NlY3Rpb24gKlNlY3Rpb24sIGNvbnN0IE1DRXhwciAqU3Vic2VjdGlvbikgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdExhYmVsKE1DU3ltYm9sICpTeW1ib2wsIFNNTG9jIExvYyA9IFNNTG9jKCkpIG92ZXJyaWRlOworICB2b2lkIEVtaXRMYWJlbChNQ1N5bWJvbCAqU3ltYm9sLCBTTUxvYyBMb2MsIE1DRnJhZ21lbnQgKkYpIG92ZXJyaWRlOworICB2b2lkIEVtaXRBc3NlbWJsZXJGbGFnKE1DQXNzZW1ibGVyRmxhZyBGbGFnKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0VGh1bWJGdW5jKE1DU3ltYm9sICpGdW5jKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0V2Vha1JlZmVyZW5jZShNQ1N5bWJvbCAqQWxpYXMsIGNvbnN0IE1DU3ltYm9sICpTeW1ib2wpIG92ZXJyaWRlOworICBib29sIEVtaXRTeW1ib2xBdHRyaWJ1dGUoTUNTeW1ib2wgKlN5bWJvbCwgTUNTeW1ib2xBdHRyIEF0dHJpYnV0ZSkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdFN5bWJvbERlc2MoTUNTeW1ib2wgKlN5bWJvbCwgdW5zaWduZWQgRGVzY1ZhbHVlKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0Q29tbW9uU3ltYm9sKE1DU3ltYm9sICpTeW1ib2wsIHVpbnQ2NF90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlQWxpZ25tZW50KSBvdmVycmlkZTsKKworICB2b2lkIGVtaXRFTEZTaXplKE1DU3ltYm9sICpTeW1ib2wsIGNvbnN0IE1DRXhwciAqVmFsdWUpIG92ZXJyaWRlOworICB2b2lkIGVtaXRFTEZTeW12ZXJEaXJlY3RpdmUoU3RyaW5nUmVmIEFsaWFzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICpBbGlhc2VlKSBvdmVycmlkZTsKKworICB2b2lkIEVtaXRMb2NhbENvbW1vblN5bWJvbChNQ1N5bWJvbCAqU3ltYm9sLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlQWxpZ25tZW50KSBvdmVycmlkZTsKKworICB2b2lkIEVtaXRaZXJvZmlsbChNQ1NlY3Rpb24gKlNlY3Rpb24sIE1DU3ltYm9sICpTeW1ib2wgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplID0gMCwgdW5zaWduZWQgQnl0ZUFsaWdubWVudCA9IDApIG92ZXJyaWRlOworICB2b2lkIEVtaXRUQlNTU3ltYm9sKE1DU2VjdGlvbiAqU2VjdGlvbiwgTUNTeW1ib2wgKlN5bWJvbCwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlQWxpZ25tZW50ID0gMCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdFZhbHVlSW1wbChjb25zdCBNQ0V4cHIgKlZhbHVlLCB1bnNpZ25lZCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgU01Mb2MgTG9jID0gU01Mb2MoKSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBFbWl0SWRlbnQoU3RyaW5nUmVmIElkZW50U3RyaW5nKSBvdmVycmlkZTsKKworICB2b2lkIEVtaXRWYWx1ZVRvQWxpZ25tZW50KHVuc2lnbmVkLCBpbnQ2NF90LCB1bnNpZ25lZCwgdW5zaWduZWQpIG92ZXJyaWRlOworCisgIHZvaWQgRmluaXNoSW1wbCgpIG92ZXJyaWRlOworCisgIHZvaWQgRW1pdEJ1bmRsZUFsaWduTW9kZSh1bnNpZ25lZCBBbGlnblBvdzIpIG92ZXJyaWRlOworICB2b2lkIEVtaXRCdW5kbGVMb2NrKGJvb2wgQWxpZ25Ub0VuZCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdEJ1bmRsZVVubG9jaygpIG92ZXJyaWRlOworCitwcml2YXRlOgorICBib29sIGlzQnVuZGxlTG9ja2VkKCkgY29uc3Q7CisgIHZvaWQgRW1pdEluc3RUb0ZyYWdtZW50KGNvbnN0IE1DSW5zdCAmSW5zdCwgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICYpIG92ZXJyaWRlOworICB2b2lkIEVtaXRJbnN0VG9EYXRhKGNvbnN0IE1DSW5zdCAmSW5zdCwgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICYpIG92ZXJyaWRlOworCisgIHZvaWQgZml4U3ltYm9sc0luVExTRml4dXBzKGNvbnN0IE1DRXhwciAqZXhwcik7CisKKyAgLy8vIFxicmllZiBNZXJnZSB0aGUgY29udGVudCBvZiB0aGUgZnJhZ21lbnQgXHAgRUYgaW50byB0aGUgZnJhZ21lbnQgXHAgREYuCisgIHZvaWQgbWVyZ2VGcmFnbWVudChNQ0RhdGFGcmFnbWVudCAqLCBNQ0RhdGFGcmFnbWVudCAqKTsKKworICBib29sIFNlZW5JZGVudCA9IGZhbHNlOworCisgIC8vLyBCdW5kbGVHcm91cHMgLSBUaGUgc3RhY2sgb2YgZnJhZ21lbnRzIGhvbGRpbmcgdGhlIGJ1bmRsZS1sb2NrZWQKKyAgLy8vIGluc3RydWN0aW9ucy4KKyAgU21hbGxWZWN0b3I8TUNEYXRhRnJhZ21lbnQgKiwgND4gQnVuZGxlR3JvdXBzOworfTsKKworTUNFTEZTdHJlYW1lciAqY3JlYXRlQVJNRUxGU3RyZWFtZXIoTUNDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1DQXNtQmFja2VuZD4gVEFCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X3B3cml0ZV9zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1DQ29kZUVtaXR0ZXI+IEVtaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJlbGF4QWxsLCBib29sIElzVGh1bWIpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ0VMRlNUUkVBTUVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNFeHByLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRXhwci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYmJlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRXhwci5oCkBAIC0wLDAgKzEsNTk1IEBACisvLz09PS0gTUNFeHByLmggLSBBc3NlbWJseSBMZXZlbCBFeHByZXNzaW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNFWFBSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0VYUFJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU01Mb2MuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DQXNtSW5mbzsKK2NsYXNzIE1DQXNtTGF5b3V0OworY2xhc3MgTUNBc3NlbWJsZXI7CitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBNQ0ZpeHVwOworY2xhc3MgTUNGcmFnbWVudDsKK2NsYXNzIE1DU2VjdGlvbjsKK2NsYXNzIE1DU3RyZWFtZXI7CitjbGFzcyBNQ1N5bWJvbDsKK2NsYXNzIE1DVmFsdWU7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFN0cmluZ1JlZjsKKwordXNpbmcgU2VjdGlvbkFkZHJNYXAgPSBEZW5zZU1hcDxjb25zdCBNQ1NlY3Rpb24gKiwgdWludDY0X3Q+OworCisvLy8gXGJyaWVmIEJhc2UgY2xhc3MgZm9yIHRoZSBmdWxsIHJhbmdlIG9mIGFzc2VtYmxlciBleHByZXNzaW9ucyB3aGljaCBhcmUKKy8vLyBuZWVkZWQgZm9yIHBhcnNpbmcuCitjbGFzcyBNQ0V4cHIgeworcHVibGljOgorICBlbnVtIEV4cHJLaW5kIHsKKyAgICBCaW5hcnksICAgIC8vLzwgQmluYXJ5IGV4cHJlc3Npb25zLgorICAgIENvbnN0YW50LCAgLy8vPCBDb25zdGFudCBleHByZXNzaW9ucy4KKyAgICBTeW1ib2xSZWYsIC8vLzwgUmVmZXJlbmNlcyB0byBsYWJlbHMgYW5kIGFzc2lnbmVkIGV4cHJlc3Npb25zLgorICAgIFVuYXJ5LCAgICAgLy8vPCBVbmFyeSBleHByZXNzaW9ucy4KKyAgICBUYXJnZXQgICAgIC8vLzwgVGFyZ2V0IHNwZWNpZmljIGV4cHJlc3Npb24uCisgIH07CisKK3ByaXZhdGU6CisgIEV4cHJLaW5kIEtpbmQ7CisgIFNNTG9jIExvYzsKKworICBib29sIGV2YWx1YXRlQXNBYnNvbHV0ZShpbnQ2NF90ICZSZXMsIGNvbnN0IE1DQXNzZW1ibGVyICpBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICpMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlY3Rpb25BZGRyTWFwICpBZGRycykgY29uc3Q7CisKKyAgYm9vbCBldmFsdWF0ZUFzQWJzb2x1dGUoaW50NjRfdCAmUmVzLCBjb25zdCBNQ0Fzc2VtYmxlciAqQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAqTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWN0aW9uQWRkck1hcCAqQWRkcnMsIGJvb2wgSW5TZXQpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IE1DRXhwcihFeHByS2luZCBLaW5kLCBTTUxvYyBMb2MpIDogS2luZChLaW5kKSwgTG9jKExvYykge30KKworICBib29sIGV2YWx1YXRlQXNSZWxvY2F0YWJsZUltcGwoTUNWYWx1ZSAmUmVzLCBjb25zdCBNQ0Fzc2VtYmxlciAqQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21MYXlvdXQgKkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRml4dXAgKkZpeHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VjdGlvbkFkZHJNYXAgKkFkZHJzLCBib29sIEluU2V0KSBjb25zdDsKKworcHVibGljOgorICBNQ0V4cHIoY29uc3QgTUNFeHByICYpID0gZGVsZXRlOworICBNQ0V4cHIgJm9wZXJhdG9yPShjb25zdCBNQ0V4cHIgJikgPSBkZWxldGU7CisKKyAgLy8vIFxuYW1lIEFjY2Vzc29ycworICAvLy8gQHsKKworICBFeHByS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorICBTTUxvYyBnZXRMb2MoKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIFV0aWxpdHkgTWV0aG9kcworICAvLy8gQHsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTUNBc21JbmZvICpNQUksCisgICAgICAgICAgICAgYm9vbCBJblBhcmVucyA9IGZhbHNlKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBFeHByZXNzaW9uIEV2YWx1YXRpb24KKyAgLy8vIEB7CisKKyAgLy8vIFxicmllZiBUcnkgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gdG8gYW4gYWJzb2x1dGUgdmFsdWUuCisgIC8vLworICAvLy8gXHBhcmFtIFJlcyAtIFRoZSBhYnNvbHV0ZSB2YWx1ZSwgaWYgZXZhbHVhdGlvbiBzdWNjZWVkcy4KKyAgLy8vIFxwYXJhbSBMYXlvdXQgLSBUaGUgYXNzZW1ibGVyIGxheW91dCBvYmplY3QgdG8gdXNlIGZvciBldmFsdWF0aW5nIHN5bWJvbAorICAvLy8gdmFsdWVzLiBJZiBub3QgZ2l2ZW4sIHRoZW4gb25seSBub24tc3ltYm9saWMgZXhwcmVzc2lvbnMgd2lsbCBiZQorICAvLy8gZXZhbHVhdGVkLgorICAvLy8gXHJldHVybiAtIFRydWUgb24gc3VjY2Vzcy4KKyAgYm9vbCBldmFsdWF0ZUFzQWJzb2x1dGUoaW50NjRfdCAmUmVzLCBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWN0aW9uQWRkck1hcCAmQWRkcnMpIGNvbnN0OworICBib29sIGV2YWx1YXRlQXNBYnNvbHV0ZShpbnQ2NF90ICZSZXMpIGNvbnN0OworICBib29sIGV2YWx1YXRlQXNBYnNvbHV0ZShpbnQ2NF90ICZSZXMsIGNvbnN0IE1DQXNzZW1ibGVyICZBc20pIGNvbnN0OworICBib29sIGV2YWx1YXRlQXNBYnNvbHV0ZShpbnQ2NF90ICZSZXMsIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQpIGNvbnN0OworCisgIGJvb2wgZXZhbHVhdGVLbm93bkFic29sdXRlKGludDY0X3QgJlJlcywgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUcnkgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gdG8gYSByZWxvY2F0YWJsZSB2YWx1ZSwgaS5lLiBhbgorICAvLy8gZXhwcmVzc2lvbiBvZiB0aGUgZml4ZWQgZm9ybSAoYSAtIGIgKyBjb25zdGFudCkuCisgIC8vLworICAvLy8gXHBhcmFtIFJlcyAtIFRoZSByZWxvY2F0YWJsZSB2YWx1ZSwgaWYgZXZhbHVhdGlvbiBzdWNjZWVkcy4KKyAgLy8vIFxwYXJhbSBMYXlvdXQgLSBUaGUgYXNzZW1ibGVyIGxheW91dCBvYmplY3QgdG8gdXNlIGZvciBldmFsdWF0aW5nIHZhbHVlcy4KKyAgLy8vIFxwYXJhbSBGaXh1cCAtIFRoZSBGaXh1cCBvYmplY3QgaWYgYXZhaWxhYmxlLgorICAvLy8gXHJldHVybiAtIFRydWUgb24gc3VjY2Vzcy4KKyAgYm9vbCBldmFsdWF0ZUFzUmVsb2NhdGFibGUoTUNWYWx1ZSAmUmVzLCBjb25zdCBNQ0FzbUxheW91dCAqTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZpeHVwICpGaXh1cCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUcnkgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gdG8gdGhlIGZvcm0gKGEgLSBiICsgY29uc3RhbnQpIHdoZXJlCisgIC8vLyBuZWl0aGVyIGEgbm9yIGIgYXJlIHZhcmlhYmxlcy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGEgbW9yZSBhZ2dyZXNzaXZlIHZhcmlhbnQgb2YgZXZhbHVhdGVBc1JlbG9jYXRhYmxlLiBUaGUgaW50ZW5kZWQKKyAgLy8vIHVzZSBpcyBmb3Igd2hlbiByZWxvY2F0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSwgbGlrZSB0aGUgLnNpemUgZGlyZWN0aXZlLgorICBib29sIGV2YWx1YXRlQXNWYWx1ZShNQ1ZhbHVlICZSZXMsIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRmluZCB0aGUgImFzc29jaWF0ZWQgc2VjdGlvbiIgZm9yIHRoaXMgZXhwcmVzc2lvbiwgd2hpY2ggaXMKKyAgLy8vIGN1cnJlbnRseSBkZWZpbmVkIGFzIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIGZvciBjb25zdGFudHMsIG9yCisgIC8vLyBvdGhlcndpc2UgdGhlIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBmaXJzdCBkZWZpbmVkIHN5bWJvbCBpbiB0aGUKKyAgLy8vIGV4cHJlc3Npb24uCisgIE1DRnJhZ21lbnQgKmZpbmRBc3NvY2lhdGVkRnJhZ21lbnQoKSBjb25zdDsKKworICAvLy8gQH0KK307CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1DRXhwciAmRSkgeworICBFLnByaW50KE9TLCBudWxscHRyKTsKKyAgcmV0dXJuIE9TOworfQorCisvLy8vIFxicmllZiAgUmVwcmVzZW50IGEgY29uc3RhbnQgaW50ZWdlciBleHByZXNzaW9uLgorY2xhc3MgTUNDb25zdGFudEV4cHIgOiBwdWJsaWMgTUNFeHByIHsKKyAgaW50NjRfdCBWYWx1ZTsKKworICBleHBsaWNpdCBNQ0NvbnN0YW50RXhwcihpbnQ2NF90IFZhbHVlKQorICAgICAgOiBNQ0V4cHIoTUNFeHByOjpDb25zdGFudCwgU01Mb2MoKSksIFZhbHVlKFZhbHVlKSB7fQorCitwdWJsaWM6CisgIC8vLyBcbmFtZSBDb25zdHJ1Y3Rpb24KKyAgLy8vIEB7CisKKyAgc3RhdGljIGNvbnN0IE1DQ29uc3RhbnRFeHByICpjcmVhdGUoaW50NjRfdCBWYWx1ZSwgTUNDb250ZXh0ICZDdHgpOworCisgIC8vLyBAfQorICAvLy8gXG5hbWUgQWNjZXNzb3JzCisgIC8vLyBAeworCisgIGludDY0X3QgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorCisgIC8vLyBAfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNFeHByICpFKSB7CisgICAgcmV0dXJuIEUtPmdldEtpbmQoKSA9PSBNQ0V4cHI6OkNvbnN0YW50OworICB9Cit9OworCisvLy8gXGJyaWVmICBSZXByZXNlbnQgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZnJvbSBpbnNpZGUgYW4gZXhwcmVzc2lvbi4KKy8vLworLy8vIEEgc3ltYm9sIHJlZmVyZW5jZSBpbiBhbiBleHByZXNzaW9uIG1heSBiZSBhIHVzZSBvZiBhIGxhYmVsLCBhIHVzZSBvZiBhbgorLy8vIGFzc2VtYmxlciB2YXJpYWJsZSAoZGVmaW5lZCBjb25zdGFudCksIG9yIGNvbnN0aXR1dGUgYW4gaW1wbGljaXQgZGVmaW5pdGlvbgorLy8vIG9mIHRoZSBzeW1ib2wgYXMgZXh0ZXJuYWwuCitjbGFzcyBNQ1N5bWJvbFJlZkV4cHIgOiBwdWJsaWMgTUNFeHByIHsKK3B1YmxpYzoKKyAgZW51bSBWYXJpYW50S2luZCA6IHVpbnQxNl90IHsKKyAgICBWS19Ob25lLAorICAgIFZLX0ludmFsaWQsCisKKyAgICBWS19HT1QsCisgICAgVktfR09UT0ZGLAorICAgIFZLX0dPVFJFTCwKKyAgICBWS19HT1RQQ1JFTCwKKyAgICBWS19HT1RUUE9GRiwKKyAgICBWS19JTkROVFBPRkYsCisgICAgVktfTlRQT0ZGLAorICAgIFZLX0dPVE5UUE9GRiwKKyAgICBWS19QTFQsCisgICAgVktfVExTR0QsCisgICAgVktfVExTTEQsCisgICAgVktfVExTTERNLAorICAgIFZLX1RQT0ZGLAorICAgIFZLX0RUUE9GRiwKKyAgICBWS19UTFNDQUxMLCAgIC8vIHN5bWJvbCh0bHNjYWxsKQorICAgIFZLX1RMU0RFU0MsICAgLy8gc3ltYm9sKHRsc2Rlc2MpCisgICAgVktfVExWUCwgICAgICAvLyBNYWNoLU8gdGhyZWFkIGxvY2FsIHZhcmlhYmxlIHJlbG9jYXRpb25zCisgICAgVktfVExWUFBBR0UsCisgICAgVktfVExWUFBBR0VPRkYsCisgICAgVktfUEFHRSwKKyAgICBWS19QQUdFT0ZGLAorICAgIFZLX0dPVFBBR0UsCisgICAgVktfR09UUEFHRU9GRiwKKyAgICBWS19TRUNSRUwsCisgICAgVktfU0laRSwgICAgICAvLyBzeW1ib2xAU0laRQorICAgIFZLX1dFQUtSRUYsICAgLy8gVGhlIGxpbmsgYmV0d2VlbiB0aGUgc3ltYm9scyBpbiAud2Vha3JlZiBmb28sIGJhcgorCisgICAgVktfWDg2X0FCUzgsCisKKyAgICBWS19BUk1fTk9ORSwKKyAgICBWS19BUk1fR09UX1BSRUwsCisgICAgVktfQVJNX1RBUkdFVDEsCisgICAgVktfQVJNX1RBUkdFVDIsCisgICAgVktfQVJNX1BSRUwzMSwKKyAgICBWS19BUk1fU0JSRUwsICAgICAgICAgIC8vIHN5bWJvbChzYnJlbCkKKyAgICBWS19BUk1fVExTTERPLCAgICAgICAgIC8vIHN5bWJvbCh0bHNsZG8pCisgICAgVktfQVJNX1RMU0RFU0NTRVEsCisKKyAgICBWS19BVlJfTk9ORSwKKyAgICBWS19BVlJfTE84LAorICAgIFZLX0FWUl9ISTgsCisgICAgVktfQVZSX0hMTzgsCisgICAgVktfQVZSX0RJRkY4LAorICAgIFZLX0FWUl9ESUZGMTYsCisgICAgVktfQVZSX0RJRkYzMiwKKworICAgIFZLX1BQQ19MTywgICAgICAgICAgICAgLy8gc3ltYm9sQGwKKyAgICBWS19QUENfSEksICAgICAgICAgICAgIC8vIHN5bWJvbEBoCisgICAgVktfUFBDX0hBLCAgICAgICAgICAgICAvLyBzeW1ib2xAaGEKKyAgICBWS19QUENfSElHSEVSLCAgICAgICAgIC8vIHN5bWJvbEBoaWdoZXIKKyAgICBWS19QUENfSElHSEVSQSwgICAgICAgIC8vIHN5bWJvbEBoaWdoZXJhCisgICAgVktfUFBDX0hJR0hFU1QsICAgICAgICAvLyBzeW1ib2xAaGlnaGVzdAorICAgIFZLX1BQQ19ISUdIRVNUQSwgICAgICAgLy8gc3ltYm9sQGhpZ2hlc3RhCisgICAgVktfUFBDX0dPVF9MTywgICAgICAgICAvLyBzeW1ib2xAZ290QGwKKyAgICBWS19QUENfR09UX0hJLCAgICAgICAgIC8vIHN5bWJvbEBnb3RAaAorICAgIFZLX1BQQ19HT1RfSEEsICAgICAgICAgLy8gc3ltYm9sQGdvdEBoYQorICAgIFZLX1BQQ19UT0NCQVNFLCAgICAgICAgLy8gc3ltYm9sQHRvY2Jhc2UKKyAgICBWS19QUENfVE9DLCAgICAgICAgICAgIC8vIHN5bWJvbEB0b2MKKyAgICBWS19QUENfVE9DX0xPLCAgICAgICAgIC8vIHN5bWJvbEB0b2NAbAorICAgIFZLX1BQQ19UT0NfSEksICAgICAgICAgLy8gc3ltYm9sQHRvY0BoCisgICAgVktfUFBDX1RPQ19IQSwgICAgICAgICAvLyBzeW1ib2xAdG9jQGhhCisgICAgVktfUFBDX0RUUE1PRCwgICAgICAgICAvLyBzeW1ib2xAZHRwbW9kCisgICAgVktfUFBDX1RQUkVMX0xPLCAgICAgICAvLyBzeW1ib2xAdHByZWxAbAorICAgIFZLX1BQQ19UUFJFTF9ISSwgICAgICAgLy8gc3ltYm9sQHRwcmVsQGgKKyAgICBWS19QUENfVFBSRUxfSEEsICAgICAgIC8vIHN5bWJvbEB0cHJlbEBoYQorICAgIFZLX1BQQ19UUFJFTF9ISUdIRVIsICAgLy8gc3ltYm9sQHRwcmVsQGhpZ2hlcgorICAgIFZLX1BQQ19UUFJFTF9ISUdIRVJBLCAgLy8gc3ltYm9sQHRwcmVsQGhpZ2hlcmEKKyAgICBWS19QUENfVFBSRUxfSElHSEVTVCwgIC8vIHN5bWJvbEB0cHJlbEBoaWdoZXN0CisgICAgVktfUFBDX1RQUkVMX0hJR0hFU1RBLCAvLyBzeW1ib2xAdHByZWxAaGlnaGVzdGEKKyAgICBWS19QUENfRFRQUkVMX0xPLCAgICAgIC8vIHN5bWJvbEBkdHByZWxAbAorICAgIFZLX1BQQ19EVFBSRUxfSEksICAgICAgLy8gc3ltYm9sQGR0cHJlbEBoCisgICAgVktfUFBDX0RUUFJFTF9IQSwgICAgICAvLyBzeW1ib2xAZHRwcmVsQGhhCisgICAgVktfUFBDX0RUUFJFTF9ISUdIRVIsICAvLyBzeW1ib2xAZHRwcmVsQGhpZ2hlcgorICAgIFZLX1BQQ19EVFBSRUxfSElHSEVSQSwgLy8gc3ltYm9sQGR0cHJlbEBoaWdoZXJhCisgICAgVktfUFBDX0RUUFJFTF9ISUdIRVNULCAvLyBzeW1ib2xAZHRwcmVsQGhpZ2hlc3QKKyAgICBWS19QUENfRFRQUkVMX0hJR0hFU1RBLC8vIHN5bWJvbEBkdHByZWxAaGlnaGVzdGEKKyAgICBWS19QUENfR09UX1RQUkVMLCAgICAgIC8vIHN5bWJvbEBnb3RAdHByZWwKKyAgICBWS19QUENfR09UX1RQUkVMX0xPLCAgIC8vIHN5bWJvbEBnb3RAdHByZWxAbAorICAgIFZLX1BQQ19HT1RfVFBSRUxfSEksICAgLy8gc3ltYm9sQGdvdEB0cHJlbEBoCisgICAgVktfUFBDX0dPVF9UUFJFTF9IQSwgICAvLyBzeW1ib2xAZ290QHRwcmVsQGhhCisgICAgVktfUFBDX0dPVF9EVFBSRUwsICAgICAvLyBzeW1ib2xAZ290QGR0cHJlbAorICAgIFZLX1BQQ19HT1RfRFRQUkVMX0xPLCAgLy8gc3ltYm9sQGdvdEBkdHByZWxAbAorICAgIFZLX1BQQ19HT1RfRFRQUkVMX0hJLCAgLy8gc3ltYm9sQGdvdEBkdHByZWxAaAorICAgIFZLX1BQQ19HT1RfRFRQUkVMX0hBLCAgLy8gc3ltYm9sQGdvdEBkdHByZWxAaGEKKyAgICBWS19QUENfVExTLCAgICAgICAgICAgIC8vIHN5bWJvbEB0bHMKKyAgICBWS19QUENfR09UX1RMU0dELCAgICAgIC8vIHN5bWJvbEBnb3RAdGxzZ2QKKyAgICBWS19QUENfR09UX1RMU0dEX0xPLCAgIC8vIHN5bWJvbEBnb3RAdGxzZ2RAbAorICAgIFZLX1BQQ19HT1RfVExTR0RfSEksICAgLy8gc3ltYm9sQGdvdEB0bHNnZEBoCisgICAgVktfUFBDX0dPVF9UTFNHRF9IQSwgICAvLyBzeW1ib2xAZ290QHRsc2dkQGhhCisgICAgVktfUFBDX1RMU0dELCAgICAgICAgICAvLyBzeW1ib2xAdGxzZ2QKKyAgICBWS19QUENfR09UX1RMU0xELCAgICAgIC8vIHN5bWJvbEBnb3RAdGxzbGQKKyAgICBWS19QUENfR09UX1RMU0xEX0xPLCAgIC8vIHN5bWJvbEBnb3RAdGxzbGRAbAorICAgIFZLX1BQQ19HT1RfVExTTERfSEksICAgLy8gc3ltYm9sQGdvdEB0bHNsZEBoCisgICAgVktfUFBDX0dPVF9UTFNMRF9IQSwgICAvLyBzeW1ib2xAZ290QHRsc2xkQGhhCisgICAgVktfUFBDX1RMU0xELCAgICAgICAgICAvLyBzeW1ib2xAdGxzbGQKKyAgICBWS19QUENfTE9DQUwsICAgICAgICAgIC8vIHN5bWJvbEBsb2NhbAorCisgICAgVktfQ09GRl9JTUdSRUwzMiwgLy8gc3ltYm9sQGltZ3JlbCAoaW1hZ2UtcmVsYXRpdmUpCisKKyAgICBWS19IZXhhZ29uX1BDUkVMLAorICAgIFZLX0hleGFnb25fTE8xNiwKKyAgICBWS19IZXhhZ29uX0hJMTYsCisgICAgVktfSGV4YWdvbl9HUFJFTCwKKyAgICBWS19IZXhhZ29uX0dEX0dPVCwKKyAgICBWS19IZXhhZ29uX0xEX0dPVCwKKyAgICBWS19IZXhhZ29uX0dEX1BMVCwKKyAgICBWS19IZXhhZ29uX0xEX1BMVCwKKyAgICBWS19IZXhhZ29uX0lFLAorICAgIFZLX0hleGFnb25fSUVfR09ULAorCisgICAgVktfV2ViQXNzZW1ibHlfRlVOQ1RJT04sIC8vIEZ1bmN0aW9uIHRhYmxlIGluZGV4LCByYXRoZXIgdGhhbiB2aXJ0dWFsIGFkZHIKKyAgICBWS19XZWJBc3NlbWJseV9UWVBFSU5ERVgsLy8gVHlwZSB0YWJsZSBpbmRleAorCisgICAgVktfQU1ER1BVX0dPVFBDUkVMMzJfTE8sIC8vIHN5bWJvbEBnb3RwY3JlbDMyQGxvCisgICAgVktfQU1ER1BVX0dPVFBDUkVMMzJfSEksIC8vIHN5bWJvbEBnb3RwY3JlbDMyQGhpCisgICAgVktfQU1ER1BVX1JFTDMyX0xPLCAgICAgIC8vIHN5bWJvbEByZWwzMkBsbworICAgIFZLX0FNREdQVV9SRUwzMl9ISSwgICAgICAvLyBzeW1ib2xAcmVsMzJAaGkKKworICAgIFZLX1RQUkVMLAorICAgIFZLX0RUUFJFTAorICB9OworCitwcml2YXRlOgorICAvLy8gVGhlIHN5bWJvbCByZWZlcmVuY2UgbW9kaWZpZXIuCisgIGNvbnN0IFZhcmlhbnRLaW5kIEtpbmQ7CisKKyAgLy8vIFNwZWNpZmllcyBob3cgdGhlIHZhcmlhbnQga2luZCBzaG91bGQgYmUgcHJpbnRlZC4KKyAgY29uc3QgdW5zaWduZWQgVXNlUGFyZW5zRm9yU3ltYm9sVmFyaWFudCA6IDE7CisKKyAgLy8gRklYTUU6IFJlbW92ZSB0aGlzIGJpdC4KKyAgY29uc3QgdW5zaWduZWQgSGFzU3Vic2VjdGlvbnNWaWFTeW1ib2xzIDogMTsKKworICAvLy8gVGhlIHN5bWJvbCBiZWluZyByZWZlcmVuY2VkLgorICBjb25zdCBNQ1N5bWJvbCAqU3ltYm9sOworCisgIGV4cGxpY2l0IE1DU3ltYm9sUmVmRXhwcihjb25zdCBNQ1N5bWJvbCAqU3ltYm9sLCBWYXJpYW50S2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21JbmZvICpNQUksIFNNTG9jIExvYyA9IFNNTG9jKCkpOworCitwdWJsaWM6CisgIC8vLyBcbmFtZSBDb25zdHJ1Y3Rpb24KKyAgLy8vIEB7CisKKyAgc3RhdGljIGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqY3JlYXRlKGNvbnN0IE1DU3ltYm9sICpTeW1ib2wsIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIE1DU3ltYm9sUmVmRXhwcjo6Y3JlYXRlKFN5bWJvbCwgVktfTm9uZSwgQ3R4KTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBNQ1N5bWJvbFJlZkV4cHIgKmNyZWF0ZShjb25zdCBNQ1N5bWJvbCAqU3ltYm9sLCBWYXJpYW50S2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgsIFNNTG9jIExvYyA9IFNNTG9jKCkpOworICBzdGF0aWMgY29uc3QgTUNTeW1ib2xSZWZFeHByICpjcmVhdGUoU3RyaW5nUmVmIE5hbWUsIFZhcmlhbnRLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCk7CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisKKyAgY29uc3QgTUNTeW1ib2wgJmdldFN5bWJvbCgpIGNvbnN0IHsgcmV0dXJuICpTeW1ib2w7IH0KKworICBWYXJpYW50S2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorCisgIHZvaWQgcHJpbnRWYXJpYW50S2luZChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIGJvb2wgaGFzU3Vic2VjdGlvbnNWaWFTeW1ib2xzKCkgY29uc3QgeyByZXR1cm4gSGFzU3Vic2VjdGlvbnNWaWFTeW1ib2xzOyB9CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBTdGF0aWMgVXRpbGl0eSBGdW5jdGlvbnMKKyAgLy8vIEB7CisKKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRWYXJpYW50S2luZE5hbWUoVmFyaWFudEtpbmQgS2luZCk7CisKKyAgc3RhdGljIFZhcmlhbnRLaW5kIGdldFZhcmlhbnRLaW5kRm9yTmFtZShTdHJpbmdSZWYgTmFtZSk7CisKKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0V4cHIgKkUpIHsKKyAgICByZXR1cm4gRS0+Z2V0S2luZCgpID09IE1DRXhwcjo6U3ltYm9sUmVmOworICB9Cit9OworCisvLy8gXGJyaWVmIFVuYXJ5IGFzc2VtYmxlciBleHByZXNzaW9ucy4KK2NsYXNzIE1DVW5hcnlFeHByIDogcHVibGljIE1DRXhwciB7CitwdWJsaWM6CisgIGVudW0gT3Bjb2RlIHsKKyAgICBMTm90LCAgLy8vPCBMb2dpY2FsIG5lZ2F0aW9uLgorICAgIE1pbnVzLCAvLy88IFVuYXJ5IG1pbnVzLgorICAgIE5vdCwgICAvLy88IEJpdHdpc2UgbmVnYXRpb24uCisgICAgUGx1cyAgIC8vLzwgVW5hcnkgcGx1cy4KKyAgfTsKKworcHJpdmF0ZToKKyAgT3Bjb2RlIE9wOworICBjb25zdCBNQ0V4cHIgKkV4cHI7CisKKyAgTUNVbmFyeUV4cHIoT3Bjb2RlIE9wLCBjb25zdCBNQ0V4cHIgKkV4cHIsIFNNTG9jIExvYykKKyAgICAgIDogTUNFeHByKE1DRXhwcjo6VW5hcnksIExvYyksIE9wKE9wKSwgRXhwcihFeHByKSB7fQorCitwdWJsaWM6CisgIC8vLyBcbmFtZSBDb25zdHJ1Y3Rpb24KKyAgLy8vIEB7CisKKyAgc3RhdGljIGNvbnN0IE1DVW5hcnlFeHByICpjcmVhdGUoT3Bjb2RlIE9wLCBjb25zdCBNQ0V4cHIgKkV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4LCBTTUxvYyBMb2MgPSBTTUxvYygpKTsKKworICBzdGF0aWMgY29uc3QgTUNVbmFyeUV4cHIgKmNyZWF0ZUxOb3QoY29uc3QgTUNFeHByICpFeHByLCBNQ0NvbnRleHQgJkN0eCwgU01Mb2MgTG9jID0gU01Mb2MoKSkgeworICAgIHJldHVybiBjcmVhdGUoTE5vdCwgRXhwciwgQ3R4LCBMb2MpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DVW5hcnlFeHByICpjcmVhdGVNaW51cyhjb25zdCBNQ0V4cHIgKkV4cHIsIE1DQ29udGV4dCAmQ3R4LCBTTUxvYyBMb2MgPSBTTUxvYygpKSB7CisgICAgcmV0dXJuIGNyZWF0ZShNaW51cywgRXhwciwgQ3R4LCBMb2MpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DVW5hcnlFeHByICpjcmVhdGVOb3QoY29uc3QgTUNFeHByICpFeHByLCBNQ0NvbnRleHQgJkN0eCwgU01Mb2MgTG9jID0gU01Mb2MoKSkgeworICAgIHJldHVybiBjcmVhdGUoTm90LCBFeHByLCBDdHgsIExvYyk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNVbmFyeUV4cHIgKmNyZWF0ZVBsdXMoY29uc3QgTUNFeHByICpFeHByLCBNQ0NvbnRleHQgJkN0eCwgU01Mb2MgTG9jID0gU01Mb2MoKSkgeworICAgIHJldHVybiBjcmVhdGUoUGx1cywgRXhwciwgQ3R4LCBMb2MpOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGtpbmQgb2YgdGhpcyB1bmFyeSBleHByZXNzaW9uLgorICBPcGNvZGUgZ2V0T3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gT3A7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgY2hpbGQgb2YgdGhpcyB1bmFyeSBleHByZXNzaW9uLgorICBjb25zdCBNQ0V4cHIgKmdldFN1YkV4cHIoKSBjb25zdCB7IHJldHVybiBFeHByOyB9CisKKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0V4cHIgKkUpIHsKKyAgICByZXR1cm4gRS0+Z2V0S2luZCgpID09IE1DRXhwcjo6VW5hcnk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQmluYXJ5IGFzc2VtYmxlciBleHByZXNzaW9ucy4KK2NsYXNzIE1DQmluYXJ5RXhwciA6IHB1YmxpYyBNQ0V4cHIgeworcHVibGljOgorICBlbnVtIE9wY29kZSB7CisgICAgQWRkLCAgLy8vPCBBZGRpdGlvbi4KKyAgICBBbmQsICAvLy88IEJpdHdpc2UgYW5kLgorICAgIERpdiwgIC8vLzwgU2lnbmVkIGRpdmlzaW9uLgorICAgIEVRLCAgIC8vLzwgRXF1YWxpdHkgY29tcGFyaXNvbi4KKyAgICBHVCwgICAvLy88IFNpZ25lZCBncmVhdGVyIHRoYW4gY29tcGFyaXNvbiAocmVzdWx0IGlzIGVpdGhlciAwIG9yIHNvbWUKKyAgICAgICAgICAvLy88IHRhcmdldC1zcGVjaWZpYyBub24temVybyB2YWx1ZSkKKyAgICBHVEUsICAvLy88IFNpZ25lZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvbiAocmVzdWx0IGlzIGVpdGhlciAwIG9yCisgICAgICAgICAgLy8vPCBzb21lIHRhcmdldC1zcGVjaWZpYyBub24temVybyB2YWx1ZSkuCisgICAgTEFuZCwgLy8vPCBMb2dpY2FsIGFuZC4KKyAgICBMT3IsICAvLy88IExvZ2ljYWwgb3IuCisgICAgTFQsICAgLy8vPCBTaWduZWQgbGVzcyB0aGFuIGNvbXBhcmlzb24gKHJlc3VsdCBpcyBlaXRoZXIgMCBvcgorICAgICAgICAgIC8vLzwgc29tZSB0YXJnZXQtc3BlY2lmaWMgbm9uLXplcm8gdmFsdWUpLgorICAgIExURSwgIC8vLzwgU2lnbmVkIGxlc3MgdGhhbiBvciBlcXVhbCBjb21wYXJpc29uIChyZXN1bHQgaXMgZWl0aGVyIDAgb3IKKyAgICAgICAgICAvLy88IHNvbWUgdGFyZ2V0LXNwZWNpZmljIG5vbi16ZXJvIHZhbHVlKS4KKyAgICBNb2QsICAvLy88IFNpZ25lZCByZW1haW5kZXIuCisgICAgTXVsLCAgLy8vPCBNdWx0aXBsaWNhdGlvbi4KKyAgICBORSwgICAvLy88IEluZXF1YWxpdHkgY29tcGFyaXNvbi4KKyAgICBPciwgICAvLy88IEJpdHdpc2Ugb3IuCisgICAgU2hsLCAgLy8vPCBTaGlmdCBsZWZ0LgorICAgIEFTaHIsIC8vLzwgQXJpdGhtZXRpYyBzaGlmdCByaWdodC4KKyAgICBMU2hyLCAvLy88IExvZ2ljYWwgc2hpZnQgcmlnaHQuCisgICAgU3ViLCAgLy8vPCBTdWJ0cmFjdGlvbi4KKyAgICBYb3IgICAvLy88IEJpdHdpc2UgZXhjbHVzaXZlIG9yLgorICB9OworCitwcml2YXRlOgorICBPcGNvZGUgT3A7CisgIGNvbnN0IE1DRXhwciAqTEhTLCAqUkhTOworCisgIE1DQmluYXJ5RXhwcihPcGNvZGUgT3AsIGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgIFNNTG9jIExvYyA9IFNNTG9jKCkpCisgICAgICA6IE1DRXhwcihNQ0V4cHI6OkJpbmFyeSwgTG9jKSwgT3AoT3ApLCBMSFMoTEhTKSwgUkhTKFJIUykge30KKworcHVibGljOgorICAvLy8gXG5hbWUgQ29uc3RydWN0aW9uCisgIC8vLyBAeworCisgIHN0YXRpYyBjb25zdCBNQ0JpbmFyeUV4cHIgKmNyZWF0ZShPcGNvZGUgT3AsIGNvbnN0IE1DRXhwciAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNFeHByICpSSFMsIE1DQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01Mb2MgTG9jID0gU01Mb2MoKSk7CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlQWRkKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShBZGQsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlQW5kKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShBbmQsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlRGl2KGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShEaXYsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlRVEoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgeworICAgIHJldHVybiBjcmVhdGUoRVEsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlR1QoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgeworICAgIHJldHVybiBjcmVhdGUoR1QsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlR1RFKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShHVEUsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlTEFuZChjb25zdCBNQ0V4cHIgKkxIUywgY29uc3QgTUNFeHByICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gY3JlYXRlKExBbmQsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlTE9yKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShMT3IsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlTFQoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgeworICAgIHJldHVybiBjcmVhdGUoTFQsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlTFRFKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShMVEUsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlTW9kKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShNb2QsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlTXVsKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShNdWwsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlTkUoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgeworICAgIHJldHVybiBjcmVhdGUoTkUsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlT3IoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgeworICAgIHJldHVybiBjcmVhdGUoT3IsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlU2hsKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShTaGwsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlQVNocihjb25zdCBNQ0V4cHIgKkxIUywgY29uc3QgTUNFeHByICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgeworICAgIHJldHVybiBjcmVhdGUoQVNociwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpjcmVhdGVMU2hyKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShMU2hyLCBMSFMsIFJIUywgQ3R4KTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBNQ0JpbmFyeUV4cHIgKmNyZWF0ZVN1Yihjb25zdCBNQ0V4cHIgKkxIUywgY29uc3QgTUNFeHByICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgeworICAgIHJldHVybiBjcmVhdGUoU3ViLCBMSFMsIFJIUywgQ3R4KTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBNQ0JpbmFyeUV4cHIgKmNyZWF0ZVhvcihjb25zdCBNQ0V4cHIgKkxIUywgY29uc3QgTUNFeHByICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgeworICAgIHJldHVybiBjcmVhdGUoWG9yLCBMSFMsIFJIUywgQ3R4KTsKKyAgfQorCisgIC8vLyBAfQorICAvLy8gXG5hbWUgQWNjZXNzb3JzCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBraW5kIG9mIHRoaXMgYmluYXJ5IGV4cHJlc3Npb24uCisgIE9wY29kZSBnZXRPcGNvZGUoKSBjb25zdCB7IHJldHVybiBPcDsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBsZWZ0LWhhbmQgc2lkZSBleHByZXNzaW9uIG9mIHRoZSBiaW5hcnkgb3BlcmF0b3IuCisgIGNvbnN0IE1DRXhwciAqZ2V0TEhTKCkgY29uc3QgeyByZXR1cm4gTEhTOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHJpZ2h0LWhhbmQgc2lkZSBleHByZXNzaW9uIG9mIHRoZSBiaW5hcnkgb3BlcmF0b3IuCisgIGNvbnN0IE1DRXhwciAqZ2V0UkhTKCkgY29uc3QgeyByZXR1cm4gUkhTOyB9CisKKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0V4cHIgKkUpIHsKKyAgICByZXR1cm4gRS0+Z2V0S2luZCgpID09IE1DRXhwcjo6QmluYXJ5OworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHBvaW50IGZvciB0YXJnZXQtc3BlY2lmaWMgTUNFeHByIHN1YmNsYXNzZXMgdG8KKy8vLyBpbXBsZW1lbnQuCisvLy8KKy8vLyBOT1RFOiBBbGwgc3ViY2xhc3NlcyBhcmUgcmVxdWlyZWQgdG8gaGF2ZSB0cml2aWFsIGRlc3RydWN0b3JzIGJlY2F1c2UKKy8vLyBNQ0V4cHJzIGFyZSBidW1wIHBvaW50ZXIgYWxsb2NhdGVkIGFuZCBub3QgZGVzdHJ1Y3RlZC4KK2NsYXNzIE1DVGFyZ2V0RXhwciA6IHB1YmxpYyBNQ0V4cHIgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3Byb3RlY3RlZDoKKyAgTUNUYXJnZXRFeHByKCkgOiBNQ0V4cHIoVGFyZ2V0LCBTTUxvYygpKSB7fQorICB2aXJ0dWFsIH5NQ1RhcmdldEV4cHIoKSA9IGRlZmF1bHQ7CisKK3B1YmxpYzoKKyAgdmlydHVhbCB2b2lkIHByaW50SW1wbChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1DQXNtSW5mbyAqTUFJKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBldmFsdWF0ZUFzUmVsb2NhdGFibGVJbXBsKE1DVmFsdWUgJlJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21MYXlvdXQgKkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGaXh1cCAqRml4dXApIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIHZpc2l0VXNlZEV4cHIoTUNTdHJlYW1lciYgU3RyZWFtZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBNQ0ZyYWdtZW50ICpmaW5kQXNzb2NpYXRlZEZyYWdtZW50KCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgdm9pZCBmaXhFTEZTeW1ib2xzSW5UTFNGaXh1cHMoTUNBc3NlbWJsZXIgJikgY29uc3QgPSAwOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNFeHByICpFKSB7CisgICAgcmV0dXJuIEUtPmdldEtpbmQoKSA9PSBNQ0V4cHI6OlRhcmdldDsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNFWFBSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNGaXhlZExlbkRpc2Fzc2VtYmxlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0ZpeGVkTGVuRGlzYXNzZW1ibGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQzNGQ5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNGaXhlZExlbkRpc2Fzc2VtYmxlci5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vPT09LS0gbGx2bS9NQy9NQ0ZpeGVkTGVuRGlzYXNzZW1ibGVyLmggLSBEZWNvZGVyIGRyaXZlciAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGaXhlZCBsZW5ndGggZGlzYXNzZW1ibGVyIGRlY29kZXIgc3RhdGUgbWFjaGluZSBkcml2ZXIuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX01DX01DRklYRURMRU5ESVNBU1NFTUJMRVJfSAorI2RlZmluZSBMTFZNX01DX01DRklYRURMRU5ESVNBU1NFTUJMRVJfSAorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBNQ0QgeworLy8gRGlzYXNzZW1ibGVyIHN0YXRlIG1hY2hpbmUgb3Bjb2Rlcy4KK2VudW0gRGVjb2Rlck9wcyB7CisgIE9QQ19FeHRyYWN0RmllbGQgPSAxLCAvLyBPUENfRXh0cmFjdEZpZWxkKHVpbnQ4X3QgU3RhcnQsIHVpbnQ4X3QgTGVuKQorICBPUENfRmlsdGVyVmFsdWUsICAgICAgLy8gT1BDX0ZpbHRlclZhbHVlKHVsZWIxMjggVmFsLCB1aW50MTZfdCBOdW1Ub1NraXApCisgIE9QQ19DaGVja0ZpZWxkLCAgICAgICAvLyBPUENfQ2hlY2tGaWVsZCh1aW50OF90IFN0YXJ0LCB1aW50OF90IExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIHVsZWIxMjggVmFsLCB1aW50MTZfdCBOdW1Ub1NraXApCisgIE9QQ19DaGVja1ByZWRpY2F0ZSwgICAvLyBPUENfQ2hlY2tQcmVkaWNhdGUodWxlYjEyOCBQSWR4LCB1aW50MTZfdCBOdW1Ub1NraXApCisgIE9QQ19EZWNvZGUsICAgICAgICAgICAvLyBPUENfRGVjb2RlKHVsZWIxMjggT3Bjb2RlLCB1bGViMTI4IERJZHgpCisgIE9QQ19UcnlEZWNvZGUsICAgICAgICAvLyBPUENfVHJ5RGVjb2RlKHVsZWIxMjggT3Bjb2RlLCB1bGViMTI4IERJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIHVpbnQxNl90IE51bVRvU2tpcCkKKyAgT1BDX1NvZnRGYWlsLCAgICAgICAgIC8vIE9QQ19Tb2Z0RmFpbCh1bGViMTI4IFBNYXNrLCB1bGViMTI4IE5NYXNrKQorICBPUENfRmFpbCAgICAgICAgICAgICAgLy8gT1BDX0ZhaWwoKQorfTsKKworfSAvLyBuYW1lc3BhY2UgTUNEZWNvZGUKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRml4dXAuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNGaXh1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MzA4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRml4dXAuaApAQCAtMCwwICsxLDExNyBAQAorLy89PT0tLSBsbHZtL01DL01DRml4dXAuaCAtIEluc3RydWN0aW9uIFJlbG9jYXRpb24gYW5kIFBhdGNoaW5nIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DRklYVVBfSAorI2RlZmluZSBMTFZNX01DX01DRklYVVBfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0V4cHIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU01Mb2MuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNQ0V4cHI7CisKKy8vLyBcYnJpZWYgRXh0ZW5zaWJsZSBlbnVtZXJhdGlvbiB0byByZXByZXNlbnQgdGhlIHR5cGUgb2YgYSBmaXh1cC4KK2VudW0gTUNGaXh1cEtpbmQgeworICBGS19EYXRhXzEgPSAwLCAvLy88IEEgb25lLWJ5dGUgZml4dXAuCisgIEZLX0RhdGFfMiwgICAgIC8vLzwgQSB0d28tYnl0ZSBmaXh1cC4KKyAgRktfRGF0YV80LCAgICAgLy8vPCBBIGZvdXItYnl0ZSBmaXh1cC4KKyAgRktfRGF0YV84LCAgICAgLy8vPCBBIGVpZ2h0LWJ5dGUgZml4dXAuCisgIEZLX1BDUmVsXzEsICAgIC8vLzwgQSBvbmUtYnl0ZSBwYyByZWxhdGl2ZSBmaXh1cC4KKyAgRktfUENSZWxfMiwgICAgLy8vPCBBIHR3by1ieXRlIHBjIHJlbGF0aXZlIGZpeHVwLgorICBGS19QQ1JlbF80LCAgICAvLy88IEEgZm91ci1ieXRlIHBjIHJlbGF0aXZlIGZpeHVwLgorICBGS19QQ1JlbF84LCAgICAvLy88IEEgZWlnaHQtYnl0ZSBwYyByZWxhdGl2ZSBmaXh1cC4KKyAgRktfR1BSZWxfMSwgICAgLy8vPCBBIG9uZS1ieXRlIGdwIHJlbGF0aXZlIGZpeHVwLgorICBGS19HUFJlbF8yLCAgICAvLy88IEEgdHdvLWJ5dGUgZ3AgcmVsYXRpdmUgZml4dXAuCisgIEZLX0dQUmVsXzQsICAgIC8vLzwgQSBmb3VyLWJ5dGUgZ3AgcmVsYXRpdmUgZml4dXAuCisgIEZLX0dQUmVsXzgsICAgIC8vLzwgQSBlaWdodC1ieXRlIGdwIHJlbGF0aXZlIGZpeHVwLgorICBGS19EVFBSZWxfNCwgICAvLy88IEEgZm91ci1ieXRlIGR0cCByZWxhdGl2ZSBmaXh1cC4KKyAgRktfRFRQUmVsXzgsICAgLy8vPCBBIGVpZ2h0LWJ5dGUgZHRwIHJlbGF0aXZlIGZpeHVwLgorICBGS19UUFJlbF80LCAgICAvLy88IEEgZm91ci1ieXRlIHRwIHJlbGF0aXZlIGZpeHVwLgorICBGS19UUFJlbF84LCAgICAvLy88IEEgZWlnaHQtYnl0ZSB0cCByZWxhdGl2ZSBmaXh1cC4KKyAgRktfU2VjUmVsXzEsICAgLy8vPCBBIG9uZS1ieXRlIHNlY3Rpb24gcmVsYXRpdmUgZml4dXAuCisgIEZLX1NlY1JlbF8yLCAgIC8vLzwgQSB0d28tYnl0ZSBzZWN0aW9uIHJlbGF0aXZlIGZpeHVwLgorICBGS19TZWNSZWxfNCwgICAvLy88IEEgZm91ci1ieXRlIHNlY3Rpb24gcmVsYXRpdmUgZml4dXAuCisgIEZLX1NlY1JlbF84LCAgIC8vLzwgQSBlaWdodC1ieXRlIHNlY3Rpb24gcmVsYXRpdmUgZml4dXAuCisKKyAgRmlyc3RUYXJnZXRGaXh1cEtpbmQgPSAxMjgsCisKKyAgLy8gTGltaXQgcmFuZ2Ugb2YgdGFyZ2V0IGZpeHVwcywgaW4gY2FzZSB3ZSB3YW50IHRvIHBhY2sgbW9yZSBlZmZpY2llbnRseQorICAvLyBsYXRlci4KKyAgTWF4VGFyZ2V0Rml4dXBLaW5kID0gKDEgPDwgOCkKK307CisKKy8vLyBcYnJpZWYgRW5jb2RlIGluZm9ybWF0aW9uIG9uIGEgc2luZ2xlIG9wZXJhdGlvbiB0byBwZXJmb3JtIG9uIGEgYnl0ZQorLy8vIHNlcXVlbmNlIChlLmcuLCBhbiBlbmNvZGVkIGluc3RydWN0aW9uKSB3aGljaCByZXF1aXJlcyBhc3NlbWJsZS0gb3IgcnVuLQorLy8vIHRpbWUgcGF0Y2hpbmcuCisvLy8KKy8vLyBGaXh1cHMgYXJlIHVzZWQgYW55IHRpbWUgdGhlIHRhcmdldCBpbnN0cnVjdGlvbiBlbmNvZGVyIG5lZWRzIHRvIHJlcHJlc2VudAorLy8vIHNvbWUgdmFsdWUgaW4gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgbm90IHlldCBjb25jcmV0ZS4gVGhlIGVuY29kZXIgd2lsbAorLy8vIGVuY29kZSB0aGUgaW5zdHJ1Y3Rpb24gYXNzdW1pbmcgdGhlIHZhbHVlIGlzIDAsIGFuZCBlbWl0IGEgZml4dXAgd2hpY2gKKy8vLyBjb21tdW5pY2F0ZXMgdG8gdGhlIGFzc2VtYmxlciBiYWNrZW5kIGhvdyBpdCBzaG91bGQgcmV3cml0ZSB0aGUgZW5jb2RlZAorLy8vIHZhbHVlLgorLy8vCisvLy8gRHVyaW5nIHRoZSBwcm9jZXNzIG9mIHJlbGF4YXRpb24sIHRoZSBhc3NlbWJsZXIgd2lsbCBhcHBseSBmaXh1cHMgYXMKKy8vLyBzeW1ib2xpYyB2YWx1ZXMgYmVjb21lIGNvbmNyZXRlLiBXaGVuIHJlbGF4YXRpb24gaXMgY29tcGxldGUsIGFueSByZW1haW5pbmcKKy8vLyBmaXh1cHMgYmVjb21lIHJlbG9jYXRpb25zIGluIHRoZSBvYmplY3QgZmlsZSAob3IgZXJyb3JzLCBpZiB0aGUgZml4dXAgY2Fubm90CisvLy8gYmUgZW5jb2RlZCBvbiB0aGUgdGFyZ2V0KS4KK2NsYXNzIE1DRml4dXAgeworICAvLy8gVGhlIHZhbHVlIHRvIHB1dCBpbnRvIHRoZSBmaXh1cCBsb2NhdGlvbi4gVGhlIGV4YWN0IGludGVycHJldGF0aW9uIG9mIHRoZQorICAvLy8gZXhwcmVzc2lvbiBpcyB0YXJnZXQgZGVwZW5kZW50LCB1c3VhbGx5IGl0IHdpbGwgYmUgb25lIG9mIHRoZSBvcGVyYW5kcyB0bworICAvLy8gYW4gaW5zdHJ1Y3Rpb24gb3IgYW4gYXNzZW1ibGVyIGRpcmVjdGl2ZS4KKyAgY29uc3QgTUNFeHByICpWYWx1ZTsKKworICAvLy8gVGhlIGJ5dGUgaW5kZXggb2Ygc3RhcnQgb2YgdGhlIHJlbG9jYXRpb24gaW5zaWRlIHRoZSBNQ0ZyYWdtZW50LgorICB1aW50MzJfdCBPZmZzZXQ7CisKKyAgLy8vIFRoZSB0YXJnZXQgZGVwZW5kZW50IGtpbmQgb2YgZml4dXAgaXRlbSB0aGlzIGlzLiBUaGUga2luZCBpcyB1c2VkIHRvCisgIC8vLyBkZXRlcm1pbmUgaG93IHRoZSBvcGVyYW5kIHZhbHVlIHNob3VsZCBiZSBlbmNvZGVkIGludG8gdGhlIGluc3RydWN0aW9uLgorICB1bnNpZ25lZCBLaW5kOworCisgIC8vLyBUaGUgc291cmNlIGxvY2F0aW9uIHdoaWNoIGdhdmUgcmlzZSB0byB0aGUgZml4dXAsIGlmIGFueS4KKyAgU01Mb2MgTG9jOworcHVibGljOgorICBzdGF0aWMgTUNGaXh1cCBjcmVhdGUodWludDMyX3QgT2Zmc2V0LCBjb25zdCBNQ0V4cHIgKlZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgTUNGaXh1cEtpbmQgS2luZCwgU01Mb2MgTG9jID0gU01Mb2MoKSkgeworICAgIGFzc2VydCh1bnNpZ25lZChLaW5kKSA8IE1heFRhcmdldEZpeHVwS2luZCAmJiAiS2luZCBvdXQgb2YgcmFuZ2UhIik7CisgICAgTUNGaXh1cCBGSTsKKyAgICBGSS5WYWx1ZSA9IFZhbHVlOworICAgIEZJLk9mZnNldCA9IE9mZnNldDsKKyAgICBGSS5LaW5kID0gdW5zaWduZWQoS2luZCk7CisgICAgRkkuTG9jID0gTG9jOworICAgIHJldHVybiBGSTsKKyAgfQorCisgIE1DRml4dXBLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBNQ0ZpeHVwS2luZChLaW5kKTsgfQorCisgIHVpbnQzMl90IGdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIE9mZnNldDsgfQorICB2b2lkIHNldE9mZnNldCh1aW50MzJfdCBWYWx1ZSkgeyBPZmZzZXQgPSBWYWx1ZTsgfQorCisgIGNvbnN0IE1DRXhwciAqZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBnZW5lcmljIGZpeHVwIGtpbmQgZm9yIGEgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gc2l6ZS4gSXQKKyAgLy8vIGlzIGFuIGVycm9yIHRvIHBhc3MgYW4gdW5zdXBwb3J0ZWQgc2l6ZS4KKyAgc3RhdGljIE1DRml4dXBLaW5kIGdldEtpbmRGb3JTaXplKHVuc2lnbmVkIFNpemUsIGJvb2wgaXNQQ1JlbCkgeworICAgIHN3aXRjaCAoU2l6ZSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgZ2VuZXJpYyBmaXh1cCBzaXplISIpOworICAgIGNhc2UgMTogcmV0dXJuIGlzUENSZWwgPyBGS19QQ1JlbF8xIDogRktfRGF0YV8xOworICAgIGNhc2UgMjogcmV0dXJuIGlzUENSZWwgPyBGS19QQ1JlbF8yIDogRktfRGF0YV8yOworICAgIGNhc2UgNDogcmV0dXJuIGlzUENSZWwgPyBGS19QQ1JlbF80IDogRktfRGF0YV80OworICAgIGNhc2UgODogcmV0dXJuIGlzUENSZWwgPyBGS19QQ1JlbF84IDogRktfRGF0YV84OworICAgIH0KKyAgfQorCisgIFNNTG9jIGdldExvYygpIGNvbnN0IHsgcmV0dXJuIExvYzsgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRml4dXBLaW5kSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0ZpeHVwS2luZEluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODE4M2JkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0ZpeHVwS2luZEluZm8uaApAQCAtMCwwICsxLDQzIEBACisvLz09PS0tIGxsdm0vTUMvTUNGaXh1cEtpbmRJbmZvLmggLSBGaXh1cCBEZXNjcmlwdG9ycyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNGSVhVUEtJTkRJTkZPX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0ZJWFVQS0lORElORk9fSAorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgVGFyZ2V0IGluZGVwZW5kZW50IGluZm9ybWF0aW9uIG9uIGEgZml4dXAga2luZC4KK3N0cnVjdCBNQ0ZpeHVwS2luZEluZm8geworICBlbnVtIEZpeHVwS2luZEZsYWdzIHsKKyAgICAvLy8gSXMgdGhpcyBmaXh1cCBraW5kIFBDcmVsYXRpdmU/IFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyIGJhY2tlbmQgdG8KKyAgICAvLy8gZXZhbHVhdGUgZml4dXAgdmFsdWVzIGluIGEgdGFyZ2V0IGluZGVwZW5kZW50IG1hbm5lciB3aGVuIHBvc3NpYmxlLgorICAgIEZLRl9Jc1BDUmVsID0gKDEgPDwgMCksCisKKyAgICAvLy8gU2hvdWxkIHRoaXMgZml4dXAga2luZCBmb3JjZSBhIDQtYnl0ZSBhbGlnbmVkIGVmZmVjdGl2ZSBQQyB2YWx1ZT8KKyAgICBGS0ZfSXNBbGlnbmVkRG93blRvMzJCaXRzID0gKDEgPDwgMSkKKyAgfTsKKworICAvLy8gQSB0YXJnZXQgc3BlY2lmaWMgbmFtZSBmb3IgdGhlIGZpeHVwIGtpbmQuIFRoZSBuYW1lcyB3aWxsIGJlIHVuaXF1ZSBmb3IKKyAgLy8vIGRpc3RpbmN0IGtpbmRzIG9uIGFueSBnaXZlbiB0YXJnZXQuCisgIGNvbnN0IGNoYXIgKk5hbWU7CisKKyAgLy8vIFRoZSBiaXQgb2Zmc2V0IHRvIHdyaXRlIHRoZSByZWxvY2F0aW9uIGludG8uCisgIHVuc2lnbmVkIFRhcmdldE9mZnNldDsKKworICAvLy8gVGhlIG51bWJlciBvZiBiaXRzIHdyaXR0ZW4gYnkgdGhpcyBmaXh1cC4gVGhlIGJpdHMgYXJlIGFzc3VtZWQgdG8gYmUKKyAgLy8vIGNvbnRpZ3VvdXMuCisgIHVuc2lnbmVkIFRhcmdldFNpemU7CisKKyAgLy8vIEZsYWdzIGRlc2NyaWJpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGlzIGZpeHVwIGtpbmQuCisgIHVuc2lnbmVkIEZsYWdzOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRnJhZ21lbnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNGcmFnbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YzM2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRnJhZ21lbnQuaApAQCAtMCwwICsxLDY2NiBAQAorLy89PT0tIE1DRnJhZ21lbnQuaCAtIEZyYWdtZW50IHR5cGUgaGllcmFyY2h5IC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DRlJBR01FTlRfSAorI2RlZmluZSBMTFZNX01DX01DRlJBR01FTlRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNGaXh1cC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU01Mb2MuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNTZWN0aW9uOworY2xhc3MgTUNTdWJ0YXJnZXRJbmZvOworY2xhc3MgTUNTeW1ib2w7CisKK2NsYXNzIE1DRnJhZ21lbnQgOiBwdWJsaWMgaWxpc3Rfbm9kZV93aXRoX3BhcmVudDxNQ0ZyYWdtZW50LCBNQ1NlY3Rpb24+IHsKKyAgZnJpZW5kIGNsYXNzIE1DQXNtTGF5b3V0OworCitwdWJsaWM6CisgIGVudW0gRnJhZ21lbnRUeXBlIDogdWludDhfdCB7CisgICAgRlRfQWxpZ24sCisgICAgRlRfRGF0YSwKKyAgICBGVF9Db21wYWN0RW5jb2RlZEluc3QsCisgICAgRlRfRmlsbCwKKyAgICBGVF9SZWxheGFibGUsCisgICAgRlRfT3JnLAorICAgIEZUX0R3YXJmLAorICAgIEZUX0R3YXJmRnJhbWUsCisgICAgRlRfTEVCLAorICAgIEZUX1BhZGRpbmcsCisgICAgRlRfU3ltYm9sSWQsCisgICAgRlRfQ1ZJbmxpbmVMaW5lcywKKyAgICBGVF9DVkRlZlJhbmdlLAorICAgIEZUX0R1bW15CisgIH07CisKK3ByaXZhdGU6CisgIEZyYWdtZW50VHlwZSBLaW5kOworCitwcm90ZWN0ZWQ6CisgIGJvb2wgSGFzSW5zdHJ1Y3Rpb25zOworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIFNob3VsZCB0aGlzIGZyYWdtZW50IGJlIGFsaWduZWQgdG8gdGhlIGVuZCBvZiBhIGJ1bmRsZT8KKyAgYm9vbCBBbGlnblRvQnVuZGxlRW5kOworCisgIHVpbnQ4X3QgQnVuZGxlUGFkZGluZzsKKworICAvLy8gTGF5b3V0T3JkZXIgLSBUaGUgbGF5b3V0IG9yZGVyIG9mIHRoaXMgZnJhZ21lbnQuCisgIHVuc2lnbmVkIExheW91dE9yZGVyOworCisgIC8vLyBUaGUgZGF0YSBmb3IgdGhlIHNlY3Rpb24gdGhpcyBmcmFnbWVudCBpcyBpbi4KKyAgTUNTZWN0aW9uICpQYXJlbnQ7CisKKyAgLy8vIEF0b20gLSBUaGUgYXRvbSB0aGlzIGZyYWdtZW50IGlzIGluLCBhcyByZXByZXNlbnRlZCBieSBpdCdzIGRlZmluaW5nCisgIC8vLyBzeW1ib2wuCisgIGNvbnN0IE1DU3ltYm9sICpBdG9tOworCisgIC8vLyBcbmFtZSBBc3NlbWJsZXIgQmFja2VuZCBEYXRhCisgIC8vLyBAeworICAvLworICAvLyBGSVhNRTogVGhpcyBjb3VsZCBhbGwgYmUga2VwdCBwcml2YXRlIHRvIHRoZSBhc3NlbWJsZXIgaW1wbGVtZW50YXRpb24uCisKKyAgLy8vIE9mZnNldCAtIFRoZSBvZmZzZXQgb2YgdGhpcyBmcmFnbWVudCBpbiBpdHMgc2VjdGlvbi4gVGhpcyBpcyB+MCB1bnRpbAorICAvLy8gaW5pdGlhbGl6ZWQuCisgIHVpbnQ2NF90IE9mZnNldDsKKworICAvLy8gQH0KKworcHJvdGVjdGVkOgorICBNQ0ZyYWdtZW50KEZyYWdtZW50VHlwZSBLaW5kLCBib29sIEhhc0luc3RydWN0aW9ucywKKyAgICAgICAgICAgICB1aW50OF90IEJ1bmRsZVBhZGRpbmcsIE1DU2VjdGlvbiAqUGFyZW50ID0gbnVsbHB0cik7CisKKyAgfk1DRnJhZ21lbnQoKTsKKworcHVibGljOgorICBNQ0ZyYWdtZW50KCkgPSBkZWxldGU7CisgIE1DRnJhZ21lbnQoY29uc3QgTUNGcmFnbWVudCAmKSA9IGRlbGV0ZTsKKyAgTUNGcmFnbWVudCAmb3BlcmF0b3I9KGNvbnN0IE1DRnJhZ21lbnQgJikgPSBkZWxldGU7CisKKyAgLy8vIERlc3Ryb3lzIHRoZSBjdXJyZW50IGZyYWdtZW50LgorICAvLy8KKyAgLy8vIFRoaXMgbXVzdCBiZSB1c2VkIGluc3RlYWQgb2YgZGVsZXRlIGFzIE1DRnJhZ21lbnQgaXMgbm9uLXZpcnR1YWwuCisgIC8vLyBUaGlzIG1ldGhvZCB3aWxsIGRpc3BhdGNoIHRvIHRoZSBhcHByb3ByaWF0ZSBzdWJjbGFzcy4KKyAgdm9pZCBkZXN0cm95KCk7CisKKyAgRnJhZ21lbnRUeXBlIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgTUNTZWN0aW9uICpnZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBQYXJlbnQ7IH0KKyAgdm9pZCBzZXRQYXJlbnQoTUNTZWN0aW9uICpWYWx1ZSkgeyBQYXJlbnQgPSBWYWx1ZTsgfQorCisgIGNvbnN0IE1DU3ltYm9sICpnZXRBdG9tKCkgY29uc3QgeyByZXR1cm4gQXRvbTsgfQorICB2b2lkIHNldEF0b20oY29uc3QgTUNTeW1ib2wgKlZhbHVlKSB7IEF0b20gPSBWYWx1ZTsgfQorCisgIHVuc2lnbmVkIGdldExheW91dE9yZGVyKCkgY29uc3QgeyByZXR1cm4gTGF5b3V0T3JkZXI7IH0KKyAgdm9pZCBzZXRMYXlvdXRPcmRlcih1bnNpZ25lZCBWYWx1ZSkgeyBMYXlvdXRPcmRlciA9IFZhbHVlOyB9CisKKyAgLy8vIFxicmllZiBEb2VzIHRoaXMgZnJhZ21lbnQgaGF2ZSBpbnN0cnVjdGlvbnMgZW1pdHRlZCBpbnRvIGl0PyBCeSBkZWZhdWx0CisgIC8vLyB0aGlzIGlzIGZhbHNlLCBidXQgc3BlY2lmaWMgZnJhZ21lbnQgdHlwZXMgbWF5IHNldCBpdCB0byB0cnVlLgorICBib29sIGhhc0luc3RydWN0aW9ucygpIGNvbnN0IHsgcmV0dXJuIEhhc0luc3RydWN0aW9uczsgfQorCisgIC8vLyBcYnJpZWYgU2hvdWxkIHRoaXMgZnJhZ21lbnQgYmUgcGxhY2VkIGF0IHRoZSBlbmQgb2YgYW4gYWxpZ25lZCBidW5kbGU/CisgIGJvb2wgYWxpZ25Ub0J1bmRsZUVuZCgpIGNvbnN0IHsgcmV0dXJuIEFsaWduVG9CdW5kbGVFbmQ7IH0KKyAgdm9pZCBzZXRBbGlnblRvQnVuZGxlRW5kKGJvb2wgVikgeyBBbGlnblRvQnVuZGxlRW5kID0gVjsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBwYWRkaW5nIHNpemUgdGhhdCBtdXN0IGJlIGluc2VydGVkIGJlZm9yZSB0aGlzIGZyYWdtZW50LgorICAvLy8gVXNlZCBmb3IgYnVuZGxpbmcuIEJ5IGRlZmF1bHQsIG5vIHBhZGRpbmcgaXMgaW5zZXJ0ZWQuCisgIC8vLyBOb3RlIHRoYXQgcGFkZGluZyBzaXplIGlzIHJlc3RyaWN0ZWQgdG8gOCBiaXRzLiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbgorICAvLy8gdG8gcmVkdWNlIHRoZSBhbW91bnQgb2Ygc3BhY2UgdXNlZCBmb3IgZWFjaCBmcmFnbWVudC4gSW4gcHJhY3RpY2UsIGxhcmdlcgorICAvLy8gcGFkZGluZyBzaG91bGQgbmV2ZXIgYmUgcmVxdWlyZWQuCisgIHVpbnQ4X3QgZ2V0QnVuZGxlUGFkZGluZygpIGNvbnN0IHsgcmV0dXJuIEJ1bmRsZVBhZGRpbmc7IH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgcGFkZGluZyBzaXplIGZvciB0aGlzIGZyYWdtZW50LiBCeSBkZWZhdWx0IGl0J3MgYSBuby1vcCwKKyAgLy8vIGFuZCBvbmx5IHNvbWUgZnJhZ21lbnRzIGhhdmUgYSBtZWFuaW5nZnVsIGltcGxlbWVudGF0aW9uLgorICB2b2lkIHNldEJ1bmRsZVBhZGRpbmcodWludDhfdCBOKSB7IEJ1bmRsZVBhZGRpbmcgPSBOOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBnaXZlbiBmcmdtZW50IGhhcyBGVF9EdW1teSB0eXBlLgorICBib29sIGlzRHVtbXkoKSBjb25zdCB7IHJldHVybiBLaW5kID09IEZUX0R1bW15OyB9CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCitjbGFzcyBNQ0R1bW15RnJhZ21lbnQgOiBwdWJsaWMgTUNGcmFnbWVudCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IE1DRHVtbXlGcmFnbWVudChNQ1NlY3Rpb24gKlNlYykKKyAgICAgIDogTUNGcmFnbWVudChGVF9EdW1teSwgZmFsc2UsIDAsIFNlYykge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRnJhZ21lbnQgKkYpIHsgcmV0dXJuIEYtPmdldEtpbmQoKSA9PSBGVF9EdW1teTsgfQorfTsKKworLy8vIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBmcmFnbWVudHMgdGhhdCBjb250YWluIGVuY29kZWQgaW5zdHJ1Y3Rpb25zIGFuZC9vcgorLy8vIGRhdGEuCisvLy8KK2NsYXNzIE1DRW5jb2RlZEZyYWdtZW50IDogcHVibGljIE1DRnJhZ21lbnQgeworcHJvdGVjdGVkOgorICBNQ0VuY29kZWRGcmFnbWVudChNQ0ZyYWdtZW50OjpGcmFnbWVudFR5cGUgRlR5cGUsIGJvb2wgSGFzSW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb24gKlNlYykKKyAgICAgIDogTUNGcmFnbWVudChGVHlwZSwgSGFzSW5zdHJ1Y3Rpb25zLCAwLCBTZWMpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0ZyYWdtZW50ICpGKSB7CisgICAgTUNGcmFnbWVudDo6RnJhZ21lbnRUeXBlIEtpbmQgPSBGLT5nZXRLaW5kKCk7CisgICAgc3dpdGNoIChLaW5kKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIE1DRnJhZ21lbnQ6OkZUX1JlbGF4YWJsZToKKyAgICBjYXNlIE1DRnJhZ21lbnQ6OkZUX0NvbXBhY3RFbmNvZGVkSW5zdDoKKyAgICBjYXNlIE1DRnJhZ21lbnQ6OkZUX0RhdGE6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KK307CisKKy8vLyBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBlbmNvZGVkIGluc3RydWN0aW9ucyBhbmQvb3IKKy8vLyBkYXRhLgorLy8vCit0ZW1wbGF0ZTx1bnNpZ25lZCBDb250ZW50c1NpemU+CitjbGFzcyBNQ0VuY29kZWRGcmFnbWVudFdpdGhDb250ZW50cyA6IHB1YmxpYyBNQ0VuY29kZWRGcmFnbWVudCB7CisgIFNtYWxsVmVjdG9yPGNoYXIsIENvbnRlbnRzU2l6ZT4gQ29udGVudHM7CisKK3Byb3RlY3RlZDoKKyAgTUNFbmNvZGVkRnJhZ21lbnRXaXRoQ29udGVudHMoTUNGcmFnbWVudDo6RnJhZ21lbnRUeXBlIEZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc0luc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uICpTZWMpCisgICAgICA6IE1DRW5jb2RlZEZyYWdtZW50KEZUeXBlLCBIYXNJbnN0cnVjdGlvbnMsIFNlYykge30KKworcHVibGljOgorICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJmdldENvbnRlbnRzKCkgeyByZXR1cm4gQ29udGVudHM7IH0KKyAgY29uc3QgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZnZXRDb250ZW50cygpIGNvbnN0IHsgcmV0dXJuIENvbnRlbnRzOyB9Cit9OworCisvLy8gSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gZW5jb2RlZCBpbnN0cnVjdGlvbnMgYW5kL29yCisvLy8gZGF0YSBhbmQgYWxzbyBoYXZlIGZpeHVwcyByZWdpc3RlcmVkLgorLy8vCit0ZW1wbGF0ZTx1bnNpZ25lZCBDb250ZW50c1NpemUsIHVuc2lnbmVkIEZpeHVwc1NpemU+CitjbGFzcyBNQ0VuY29kZWRGcmFnbWVudFdpdGhGaXh1cHMgOgorICBwdWJsaWMgTUNFbmNvZGVkRnJhZ21lbnRXaXRoQ29udGVudHM8Q29udGVudHNTaXplPiB7CisKKyAgLy8vIEZpeHVwcyAtIFRoZSBsaXN0IG9mIGZpeHVwcyBpbiB0aGlzIGZyYWdtZW50LgorICBTbWFsbFZlY3RvcjxNQ0ZpeHVwLCBGaXh1cHNTaXplPiBGaXh1cHM7CisKK3Byb3RlY3RlZDoKKyAgTUNFbmNvZGVkRnJhZ21lbnRXaXRoRml4dXBzKE1DRnJhZ21lbnQ6OkZyYWdtZW50VHlwZSBGVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzSW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uICpTZWMpCisgICAgICA6IE1DRW5jb2RlZEZyYWdtZW50V2l0aENvbnRlbnRzPENvbnRlbnRzU2l6ZT4oRlR5cGUsIEhhc0luc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWMpIHt9CisKK3B1YmxpYzoKKyAgdXNpbmcgY29uc3RfZml4dXBfaXRlcmF0b3IgPSBTbWFsbFZlY3RvckltcGw8TUNGaXh1cD46OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBmaXh1cF9pdGVyYXRvciA9IFNtYWxsVmVjdG9ySW1wbDxNQ0ZpeHVwPjo6aXRlcmF0b3I7CisKKyAgU21hbGxWZWN0b3JJbXBsPE1DRml4dXA+ICZnZXRGaXh1cHMoKSB7IHJldHVybiBGaXh1cHM7IH0KKyAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1DRml4dXA+ICZnZXRGaXh1cHMoKSBjb25zdCB7IHJldHVybiBGaXh1cHM7IH0KKworICBmaXh1cF9pdGVyYXRvciBmaXh1cF9iZWdpbigpIHsgcmV0dXJuIEZpeHVwcy5iZWdpbigpOyB9CisgIGNvbnN0X2ZpeHVwX2l0ZXJhdG9yIGZpeHVwX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gRml4dXBzLmJlZ2luKCk7IH0KKworICBmaXh1cF9pdGVyYXRvciBmaXh1cF9lbmQoKSB7IHJldHVybiBGaXh1cHMuZW5kKCk7IH0KKyAgY29uc3RfZml4dXBfaXRlcmF0b3IgZml4dXBfZW5kKCkgY29uc3QgeyByZXR1cm4gRml4dXBzLmVuZCgpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0ZyYWdtZW50ICpGKSB7CisgICAgTUNGcmFnbWVudDo6RnJhZ21lbnRUeXBlIEtpbmQgPSBGLT5nZXRLaW5kKCk7CisgICAgcmV0dXJuIEtpbmQgPT0gTUNGcmFnbWVudDo6RlRfUmVsYXhhYmxlIHx8IEtpbmQgPT0gTUNGcmFnbWVudDo6RlRfRGF0YSB8fAorICAgICAgICAgICBLaW5kID09IE1DRnJhZ21lbnQ6OkZUX0NWRGVmUmFuZ2U7CisgIH0KK307CisKKy8vLyBGcmFnbWVudCBmb3IgZGF0YSBhbmQgZW5jb2RlZCBpbnN0cnVjdGlvbnMuCisvLy8KK2NsYXNzIE1DRGF0YUZyYWdtZW50IDogcHVibGljIE1DRW5jb2RlZEZyYWdtZW50V2l0aEZpeHVwczwzMiwgND4geworcHVibGljOgorICBNQ0RhdGFGcmFnbWVudChNQ1NlY3Rpb24gKlNlYyA9IG51bGxwdHIpCisgICAgICA6IE1DRW5jb2RlZEZyYWdtZW50V2l0aEZpeHVwczwzMiwgND4oRlRfRGF0YSwgZmFsc2UsIFNlYykge30KKworICB2b2lkIHNldEhhc0luc3RydWN0aW9ucyhib29sIFYpIHsgSGFzSW5zdHJ1Y3Rpb25zID0gVjsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNGcmFnbWVudCAqRikgeworICAgIHJldHVybiBGLT5nZXRLaW5kKCkgPT0gTUNGcmFnbWVudDo6RlRfRGF0YTsKKyAgfQorfTsKKworLy8vIFRoaXMgaXMgYSBjb21wYWN0IChtZW1vcnktc2l6ZS13aXNlKSBmcmFnbWVudCBmb3IgaG9sZGluZyBhbiBlbmNvZGVkCisvLy8gaW5zdHJ1Y3Rpb24gKG5vbi1yZWxheGFibGUpIHRoYXQgaGFzIG5vIGZpeHVwcyByZWdpc3RlcmVkLiBXaGVuIGFwcGxpY2FibGUsCisvLy8gaXQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBNQ0RhdGFGcmFnbWVudCBhbmQgbGVhZCB0byBsb3dlciBtZW1vcnkKKy8vLyBjb25zdW1wdGlvbi4KKy8vLworY2xhc3MgTUNDb21wYWN0RW5jb2RlZEluc3RGcmFnbWVudCA6IHB1YmxpYyBNQ0VuY29kZWRGcmFnbWVudFdpdGhDb250ZW50czw0PiB7CitwdWJsaWM6CisgIE1DQ29tcGFjdEVuY29kZWRJbnN0RnJhZ21lbnQoTUNTZWN0aW9uICpTZWMgPSBudWxscHRyKQorICAgICAgOiBNQ0VuY29kZWRGcmFnbWVudFdpdGhDb250ZW50cyhGVF9Db21wYWN0RW5jb2RlZEluc3QsIHRydWUsIFNlYykgeworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0ZyYWdtZW50ICpGKSB7CisgICAgcmV0dXJuIEYtPmdldEtpbmQoKSA9PSBNQ0ZyYWdtZW50OjpGVF9Db21wYWN0RW5jb2RlZEluc3Q7CisgIH0KK307CisKKy8vLyBBIHJlbGF4YWJsZSBmcmFnbWVudCBob2xkcyBvbiB0byBpdHMgTUNJbnN0LCBzaW5jZSBpdCBtYXkgbmVlZCB0byBiZQorLy8vIHJlbGF4ZWQgZHVyaW5nIHRoZSBhc3NlbWJsZXIgbGF5b3V0IGFuZCByZWxheGF0aW9uIHN0YWdlLgorLy8vCitjbGFzcyBNQ1JlbGF4YWJsZUZyYWdtZW50IDogcHVibGljIE1DRW5jb2RlZEZyYWdtZW50V2l0aEZpeHVwczw4LCAxPiB7CisKKyAgLy8vIEluc3QgLSBUaGUgaW5zdHJ1Y3Rpb24gdGhpcyBpcyBhIGZyYWdtZW50IGZvci4KKyAgTUNJbnN0IEluc3Q7CisKKyAgLy8vIFNUSSAtIFRoZSBNQ1N1YnRhcmdldEluZm8gaW4gZWZmZWN0IHdoZW4gdGhlIGluc3RydWN0aW9uIHdhcyBlbmNvZGVkLgorICBjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSTsKKworcHVibGljOgorICBNQ1JlbGF4YWJsZUZyYWdtZW50KGNvbnN0IE1DSW5zdCAmSW5zdCwgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEksCisgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uICpTZWMgPSBudWxscHRyKQorICAgICAgOiBNQ0VuY29kZWRGcmFnbWVudFdpdGhGaXh1cHMoRlRfUmVsYXhhYmxlLCB0cnVlLCBTZWMpLAorICAgICAgICBJbnN0KEluc3QpLCBTVEkoU1RJKSB7fQorCisgIGNvbnN0IE1DSW5zdCAmZ2V0SW5zdCgpIGNvbnN0IHsgcmV0dXJuIEluc3Q7IH0KKyAgdm9pZCBzZXRJbnN0KGNvbnN0IE1DSW5zdCAmVmFsdWUpIHsgSW5zdCA9IFZhbHVlOyB9CisKKyAgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZnZXRTdWJ0YXJnZXRJbmZvKCkgeyByZXR1cm4gU1RJOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0ZyYWdtZW50ICpGKSB7CisgICAgcmV0dXJuIEYtPmdldEtpbmQoKSA9PSBNQ0ZyYWdtZW50OjpGVF9SZWxheGFibGU7CisgIH0KK307CisKK2NsYXNzIE1DQWxpZ25GcmFnbWVudCA6IHB1YmxpYyBNQ0ZyYWdtZW50IHsKKyAgLy8vIEFsaWdubWVudCAtIFRoZSBhbGlnbm1lbnQgdG8gZW5zdXJlLCBpbiBieXRlcy4KKyAgdW5zaWduZWQgQWxpZ25tZW50OworCisgIC8vLyBFbWl0Tm9wcyAtIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCAob3B0aW1hbCkgTk9QcyBzaG91bGQgYmUgZW1pdHRlZCBpbnN0ZWFkCisgIC8vLyBvZiB1c2luZyB0aGUgcHJvdmlkZWQgdmFsdWUuIFRoZSBleGFjdCBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIGZsYWcgaXMKKyAgLy8vIHRhcmdldCBkZXBlbmRlbnQuCisgIGJvb2wgRW1pdE5vcHMgOiAxOworCisgIC8vLyBWYWx1ZSAtIFZhbHVlIHRvIHVzZSBmb3IgZmlsbGluZyBwYWRkaW5nIGJ5dGVzLgorICBpbnQ2NF90IFZhbHVlOworCisgIC8vLyBWYWx1ZVNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgaW50ZWdlciAoaW4gYnl0ZXMpIG9mIFxwIFZhbHVlLgorICB1bnNpZ25lZCBWYWx1ZVNpemU7CisKKyAgLy8vIE1heEJ5dGVzVG9FbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGVtaXQ7IGlmIHRoZSBhbGlnbm1lbnQKKyAgLy8vIGNhbm5vdCBiZSBzYXRpc2ZpZWQgaW4gdGhpcyB3aWR0aCB0aGVuIHRoaXMgZnJhZ21lbnQgaXMgaWdub3JlZC4KKyAgdW5zaWduZWQgTWF4Qnl0ZXNUb0VtaXQ7CisKK3B1YmxpYzoKKyAgTUNBbGlnbkZyYWdtZW50KHVuc2lnbmVkIEFsaWdubWVudCwgaW50NjRfdCBWYWx1ZSwgdW5zaWduZWQgVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4Qnl0ZXNUb0VtaXQsIE1DU2VjdGlvbiAqU2VjID0gbnVsbHB0cikKKyAgICAgIDogTUNGcmFnbWVudChGVF9BbGlnbiwgZmFsc2UsIDAsIFNlYyksIEFsaWdubWVudChBbGlnbm1lbnQpLAorICAgICAgICBFbWl0Tm9wcyhmYWxzZSksIFZhbHVlKFZhbHVlKSwKKyAgICAgICAgVmFsdWVTaXplKFZhbHVlU2l6ZSksIE1heEJ5dGVzVG9FbWl0KE1heEJ5dGVzVG9FbWl0KSB7fQorCisgIC8vLyBcbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisKKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gQWxpZ25tZW50OyB9CisKKyAgaW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgdW5zaWduZWQgZ2V0VmFsdWVTaXplKCkgY29uc3QgeyByZXR1cm4gVmFsdWVTaXplOyB9CisKKyAgdW5zaWduZWQgZ2V0TWF4Qnl0ZXNUb0VtaXQoKSBjb25zdCB7IHJldHVybiBNYXhCeXRlc1RvRW1pdDsgfQorCisgIGJvb2wgaGFzRW1pdE5vcHMoKSBjb25zdCB7IHJldHVybiBFbWl0Tm9wczsgfQorICB2b2lkIHNldEVtaXROb3BzKGJvb2wgVmFsdWUpIHsgRW1pdE5vcHMgPSBWYWx1ZTsgfQorCisgIC8vLyBAfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNGcmFnbWVudCAqRikgeworICAgIHJldHVybiBGLT5nZXRLaW5kKCkgPT0gTUNGcmFnbWVudDo6RlRfQWxpZ247CisgIH0KK307CisKKy8vLyBGcmFnbWVudCBmb3IgYWRkaW5nIHJlcXVpcmVkIHBhZGRpbmcuCisvLy8gVGhpcyBmcmFnbWVudCBpcyBhbHdheXMgaW5zZXJ0ZWQgYmVmb3JlIGFuIGluc3RydWN0aW9uLCBhbmQgaG9sZHMgdGhhdAorLy8vIGluc3RydWN0aW9uIGFzIGNvbnRleHQgaW5mb3JtYXRpb24gKGFzIHdlbGwgYXMgYSBtYXNrIG9mIGtpbmRzKSBmb3IKKy8vLyBkZXRlcm1pbmluZyB0aGUgcGFkZGluZyBzaXplLgorLy8vCitjbGFzcyBNQ1BhZGRpbmdGcmFnbWVudCA6IHB1YmxpYyBNQ0ZyYWdtZW50IHsKKyAgLy8vIEEgbWFzayBjb250YWluaW5nIGFsbCB0aGUga2luZHMgcmVsZXZhbnQgdG8gdGhpcyBmcmFnbWVudC4gaS5lLiB0aGUgaSd0aAorICAvLy8gYml0IHdpbGwgYmUgc2V0IGlmZiBraW5kIGkgaXMgcmVsZXZhbnQgdG8gdGhpcyBmcmFnbWVudC4KKyAgdWludDY0X3QgUGFkZGluZ1BvbGljaWVzTWFzazsKKyAgLy8vIEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgZnJhZ21lbnQgd2lsbCBhY3R1YWxseSBob2xkIHBhZGRpbmcuIElmIGl0cworICAvLy8gdmFsdWUgaXMgZmFsc2UsIHRoZW4gdGhpcyBmcmFnbWVudCBzZXJ2ZXMgb25seSBhcyBhIHBsYWNlaG9sZGVyLAorICAvLy8gY29udGFpbmluZyBkYXRhIHRvIGFzc2lzdCBvdGhlciBpbnNlcnRpb24gcG9pbnQgaW4gdGhlaXIgZGVjaXNpb24gbWFraW5nLgorICBib29sIElzSW5zZXJ0aW9uUG9pbnQ7CisKKyAgdWludDY0X3QgU2l6ZTsKKworICBzdHJ1Y3QgTUNJbnN0SW5mbyB7CisgICAgYm9vbCBJc0luaXRpYWxpemVkOworICAgIE1DSW5zdCBJbnN0OworICAgIC8vLyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVkIGJ5IHRoaXMgZnJhZ21lbnQgaXMKKyAgICAvLy8gYSBmaXhlZCBzaXplIGluc3RydWN0aW9uIG9yIGEgcmVsYXhhYmxlIGluc3RydWN0aW9uIGhlbGQgYnkgYQorICAgIC8vLyBNQ1JlbGF4YWJsZUZyYWdtZW50LgorICAgIGJvb2wgSXNJbW11dGFibGVTaXplZEluc3Q7CisgICAgdW5pb24geworICAgICAgLy8vIElmIHRoZSBpbnN0cnVjdGlvbiBpcyBhIGZpeGVkIHNpemUgaW5zdHJ1Y3Rpb24sIGhvbGQgaXRzIHNpemUuCisgICAgICBzaXplX3QgSW5zdFNpemU7CisgICAgICAvLy8gT3RoZXJ3aXNlLCBob2xkIGEgcG9pbnRlciB0byB0aGUgTUNSZWxheGFibGVGcmFnbWVudCBob2xkaW5nIGl0LgorICAgICAgTUNSZWxheGFibGVGcmFnbWVudCAqSW5zdEZyYWdtZW50OworICAgIH07CisgIH07CisgIE1DSW5zdEluZm8gSW5zdEluZm87CisKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IFBGS19Ob25lID0gVUlOVDY0X0MoMCk7CisKKyAgZW51bSBNQ1BhZGRpbmdGcmFnbWVudEtpbmQgeworICAgIC8vIHZhbHVlcyAwLTcgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdGFyZ2V0IGluZGVwZW5kZXQgdmFsdWVzLgorCisgICAgRmlyc3RUYXJnZXRQZXJmTm9wRnJhZ21lbnRLaW5kID0gOCwKKworICAgIC8vLyBMaW1pdCByYW5nZSBvZiB0YXJnZXQgTUNQZXJmTm9wRnJhZ21lbnQga2luZHMgdG8gZml0IGluIHVpbnQ2NF90CisgICAgTWF4VGFyZ2V0UGVyZk5vcEZyYWdtZW50S2luZCA9IDYzCisgIH07CisKKyAgTUNQYWRkaW5nRnJhZ21lbnQoTUNTZWN0aW9uICpTZWMgPSBudWxscHRyKQorICAgICAgOiBNQ0ZyYWdtZW50KEZUX1BhZGRpbmcsIGZhbHNlLCAwLCBTZWMpLCBQYWRkaW5nUG9saWNpZXNNYXNrKFBGS19Ob25lKSwKKyAgICAgICAgSXNJbnNlcnRpb25Qb2ludChmYWxzZSksIFNpemUoVUlOVDY0X0MoMCkpLAorICAgICAgICBJbnN0SW5mbyh7ZmFsc2UsIE1DSW5zdCgpLCBmYWxzZSwgezB9fSkge30KKworICBib29sIGlzSW5zZXJ0aW9uUG9pbnQoKSBjb25zdCB7IHJldHVybiBJc0luc2VydGlvblBvaW50OyB9CisgIHZvaWQgc2V0QXNJbnNlcnRpb25Qb2ludCgpIHsgSXNJbnNlcnRpb25Qb2ludCA9IHRydWU7IH0KKyAgdWludDY0X3QgZ2V0UGFkZGluZ1BvbGljaWVzTWFzaygpIGNvbnN0IHsgcmV0dXJuIFBhZGRpbmdQb2xpY2llc01hc2s7IH0KKyAgdm9pZCBzZXRQYWRkaW5nUG9saWNpZXNNYXNrKHVpbnQ2NF90IFZhbHVlKSB7IFBhZGRpbmdQb2xpY2llc01hc2sgPSBWYWx1ZTsgfQorICBib29sIGhhc1BhZGRpbmdQb2xpY3kodWludDY0X3QgUG9saWN5TWFzaykgY29uc3QgeworICAgIGFzc2VydChpc1Bvd2VyT2YyXzY0KFBvbGljeU1hc2spICYmCisgICAgICAgICAgICJQb2xpY3kgbWFzayBtdXN0IGNvbnRhaW4gZXhhY3RseSBvbmUgcG9saWN5Iik7CisgICAgcmV0dXJuIChnZXRQYWRkaW5nUG9saWNpZXNNYXNrKCkgJiBQb2xpY3lNYXNrKSAhPSBQRktfTm9uZTsKKyAgfQorICBjb25zdCBNQ0luc3QgJmdldEluc3QoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzSW5zdHJ1Y3Rpb25Jbml0aWFsaXplZCgpICYmICJGcmFnbWVudCBoYXMgbm8gaW5zdHJ1Y3Rpb24hIik7CisgICAgcmV0dXJuIEluc3RJbmZvLkluc3Q7CisgIH0KKyAgc2l6ZV90IGdldEluc3RTaXplKCkgY29uc3QgeworICAgIGFzc2VydChpc0luc3RydWN0aW9uSW5pdGlhbGl6ZWQoKSAmJiAiRnJhZ21lbnQgaGFzIG5vIGluc3RydWN0aW9uISIpOworICAgIGlmIChJbnN0SW5mby5Jc0ltbXV0YWJsZVNpemVkSW5zdCkKKyAgICAgIHJldHVybiBJbnN0SW5mby5JbnN0U2l6ZTsKKyAgICBhc3NlcnQoSW5zdEluZm8uSW5zdEZyYWdtZW50ICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgIk11c3QgaGF2ZSBhIHZhbGlkIEluc3RGcmFnbWVudCB0byByZXRyaWV2ZSBJbnN0U2l6ZSBmcm9tIik7CisgICAgcmV0dXJuIEluc3RJbmZvLkluc3RGcmFnbWVudC0+Z2V0Q29udGVudHMoKS5zaXplKCk7CisgIH0KKyAgdm9pZCBzZXRJbnN0QW5kSW5zdFNpemUoY29uc3QgTUNJbnN0ICZJbnN0LCBzaXplX3QgSW5zdFNpemUpIHsKKwlJbnN0SW5mby5Jc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICBJbnN0SW5mby5Jc0ltbXV0YWJsZVNpemVkSW5zdCA9IHRydWU7CisgICAgSW5zdEluZm8uSW5zdCA9IEluc3Q7CisgICAgSW5zdEluZm8uSW5zdFNpemUgPSBJbnN0U2l6ZTsKKyAgfQorICB2b2lkIHNldEluc3RBbmRJbnN0RnJhZ21lbnQoY29uc3QgTUNJbnN0ICZJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNSZWxheGFibGVGcmFnbWVudCAqSW5zdEZyYWdtZW50KSB7CisgICAgSW5zdEluZm8uSXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgSW5zdEluZm8uSXNJbW11dGFibGVTaXplZEluc3QgPSBmYWxzZTsKKyAgICBJbnN0SW5mby5JbnN0ID0gSW5zdDsKKyAgICBJbnN0SW5mby5JbnN0RnJhZ21lbnQgPSBJbnN0RnJhZ21lbnQ7CisgIH0KKyAgdWludDY0X3QgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKyAgdm9pZCBzZXRTaXplKHVpbnQ2NF90IFZhbHVlKSB7IFNpemUgPSBWYWx1ZTsgfQorICBib29sIGlzSW5zdHJ1Y3Rpb25Jbml0aWFsaXplZCgpIGNvbnN0IHsgcmV0dXJuIEluc3RJbmZvLklzSW5pdGlhbGl6ZWQ7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRnJhZ21lbnQgKkYpIHsKKyAgICByZXR1cm4gRi0+Z2V0S2luZCgpID09IE1DRnJhZ21lbnQ6OkZUX1BhZGRpbmc7CisgIH0KK307CisKK2NsYXNzIE1DRmlsbEZyYWdtZW50IDogcHVibGljIE1DRnJhZ21lbnQgeworICAvLy8gVmFsdWUgdG8gdXNlIGZvciBmaWxsaW5nIGJ5dGVzLgorICB1aW50OF90IFZhbHVlOworCisgIC8vLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGluc2VydC4KKyAgY29uc3QgTUNFeHByICZTaXplOworCisgIC8vLyBTb3VyY2UgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSB0aGF0IHRoaXMgZnJhZ21lbnQgd2FzIGNyZWF0ZWQgZm9yLgorICBTTUxvYyBMb2M7CisKK3B1YmxpYzoKKyAgTUNGaWxsRnJhZ21lbnQodWludDhfdCBWYWx1ZSwgY29uc3QgTUNFeHByICZTaXplLCBTTUxvYyBMb2MsCisgICAgICAgICAgICAgICAgIE1DU2VjdGlvbiAqU2VjID0gbnVsbHB0cikKKyAgICAgIDogTUNGcmFnbWVudChGVF9GaWxsLCBmYWxzZSwgMCwgU2VjKSwgVmFsdWUoVmFsdWUpLCBTaXplKFNpemUpLCBMb2MoTG9jKSB7CisgIH0KKworICB1aW50OF90IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKyAgY29uc3QgTUNFeHByICZnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorCisgIFNNTG9jIGdldExvYygpIGNvbnN0IHsgcmV0dXJuIExvYzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNGcmFnbWVudCAqRikgeworICAgIHJldHVybiBGLT5nZXRLaW5kKCkgPT0gTUNGcmFnbWVudDo6RlRfRmlsbDsKKyAgfQorfTsKKworY2xhc3MgTUNPcmdGcmFnbWVudCA6IHB1YmxpYyBNQ0ZyYWdtZW50IHsKKyAgLy8vIFRoZSBvZmZzZXQgdGhpcyBmcmFnbWVudCBzaG91bGQgc3RhcnQgYXQuCisgIGNvbnN0IE1DRXhwciAqT2Zmc2V0OworCisgIC8vLyBWYWx1ZSB0byB1c2UgZm9yIGZpbGxpbmcgYnl0ZXMuCisgIGludDhfdCBWYWx1ZTsKKworICAvLy8gU291cmNlIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUgdGhhdCB0aGlzIGZyYWdtZW50IHdhcyBjcmVhdGVkIGZvci4KKyAgU01Mb2MgTG9jOworCitwdWJsaWM6CisgIE1DT3JnRnJhZ21lbnQoY29uc3QgTUNFeHByICZPZmZzZXQsIGludDhfdCBWYWx1ZSwgU01Mb2MgTG9jLAorICAgICAgICAgICAgICAgIE1DU2VjdGlvbiAqU2VjID0gbnVsbHB0cikKKyAgICAgIDogTUNGcmFnbWVudChGVF9PcmcsIGZhbHNlLCAwLCBTZWMpLCBPZmZzZXQoJk9mZnNldCksIFZhbHVlKFZhbHVlKSwgTG9jKExvYykge30KKworICAvLy8gXG5hbWUgQWNjZXNzb3JzCisgIC8vLyBAeworCisgIGNvbnN0IE1DRXhwciAmZ2V0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gKk9mZnNldDsgfQorCisgIHVpbnQ4X3QgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorCisgIFNNTG9jIGdldExvYygpIGNvbnN0IHsgcmV0dXJuIExvYzsgfQorCisgIC8vLyBAfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNGcmFnbWVudCAqRikgeworICAgIHJldHVybiBGLT5nZXRLaW5kKCkgPT0gTUNGcmFnbWVudDo6RlRfT3JnOworICB9Cit9OworCitjbGFzcyBNQ0xFQkZyYWdtZW50IDogcHVibGljIE1DRnJhZ21lbnQgeworICAvLy8gVmFsdWUgLSBUaGUgdmFsdWUgdGhpcyBmcmFnbWVudCBzaG91bGQgY29udGFpbi4KKyAgY29uc3QgTUNFeHByICpWYWx1ZTsKKworICAvLy8gSXNTaWduZWQgLSBUcnVlIGlmIHRoaXMgaXMgYSBzbGViMTI4LCBmYWxzZSBpZiB1bGViMTI4LgorICBib29sIElzU2lnbmVkOworCisgIFNtYWxsU3RyaW5nPDg+IENvbnRlbnRzOworCitwdWJsaWM6CisgIE1DTEVCRnJhZ21lbnQoY29uc3QgTUNFeHByICZWYWx1ZV8sIGJvb2wgSXNTaWduZWRfLCBNQ1NlY3Rpb24gKlNlYyA9IG51bGxwdHIpCisgICAgICA6IE1DRnJhZ21lbnQoRlRfTEVCLCBmYWxzZSwgMCwgU2VjKSwgVmFsdWUoJlZhbHVlXyksIElzU2lnbmVkKElzU2lnbmVkXykgeworICAgIENvbnRlbnRzLnB1c2hfYmFjaygwKTsKKyAgfQorCisgIC8vLyBcbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisKKyAgY29uc3QgTUNFeHByICZnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuICpWYWx1ZTsgfQorCisgIGJvb2wgaXNTaWduZWQoKSBjb25zdCB7IHJldHVybiBJc1NpZ25lZDsgfQorCisgIFNtYWxsU3RyaW5nPDg+ICZnZXRDb250ZW50cygpIHsgcmV0dXJuIENvbnRlbnRzOyB9CisgIGNvbnN0IFNtYWxsU3RyaW5nPDg+ICZnZXRDb250ZW50cygpIGNvbnN0IHsgcmV0dXJuIENvbnRlbnRzOyB9CisKKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0ZyYWdtZW50ICpGKSB7CisgICAgcmV0dXJuIEYtPmdldEtpbmQoKSA9PSBNQ0ZyYWdtZW50OjpGVF9MRUI7CisgIH0KK307CisKK2NsYXNzIE1DRHdhcmZMaW5lQWRkckZyYWdtZW50IDogcHVibGljIE1DRnJhZ21lbnQgeworICAvLy8gTGluZURlbHRhIC0gdGhlIHZhbHVlIG9mIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBsaW5lIG51bWJlcnMKKyAgLy8vIGJldHdlZW4gdHdvIC5sb2MgZHdhcmYgZGlyZWN0aXZlcy4KKyAgaW50NjRfdCBMaW5lRGVsdGE7CisKKyAgLy8vIEFkZHJEZWx0YSAtIFRoZSBleHByZXNzaW9uIGZvciB0aGUgZGlmZmVyZW5jZSBvZiB0aGUgdHdvIHN5bWJvbHMgdGhhdAorICAvLy8gbWFrZSB1cCB0aGUgYWRkcmVzcyBkZWx0YSBiZXR3ZWVuIHR3byAubG9jIGR3YXJmIGRpcmVjdGl2ZXMuCisgIGNvbnN0IE1DRXhwciAqQWRkckRlbHRhOworCisgIFNtYWxsU3RyaW5nPDg+IENvbnRlbnRzOworCitwdWJsaWM6CisgIE1DRHdhcmZMaW5lQWRkckZyYWdtZW50KGludDY0X3QgTGluZURlbHRhLCBjb25zdCBNQ0V4cHIgJkFkZHJEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uICpTZWMgPSBudWxscHRyKQorICAgICAgOiBNQ0ZyYWdtZW50KEZUX0R3YXJmLCBmYWxzZSwgMCwgU2VjKSwgTGluZURlbHRhKExpbmVEZWx0YSksCisgICAgICAgIEFkZHJEZWx0YSgmQWRkckRlbHRhKSB7CisgICAgQ29udGVudHMucHVzaF9iYWNrKDApOworICB9CisKKyAgLy8vIFxuYW1lIEFjY2Vzc29ycworICAvLy8gQHsKKworICBpbnQ2NF90IGdldExpbmVEZWx0YSgpIGNvbnN0IHsgcmV0dXJuIExpbmVEZWx0YTsgfQorCisgIGNvbnN0IE1DRXhwciAmZ2V0QWRkckRlbHRhKCkgY29uc3QgeyByZXR1cm4gKkFkZHJEZWx0YTsgfQorCisgIFNtYWxsU3RyaW5nPDg+ICZnZXRDb250ZW50cygpIHsgcmV0dXJuIENvbnRlbnRzOyB9CisgIGNvbnN0IFNtYWxsU3RyaW5nPDg+ICZnZXRDb250ZW50cygpIGNvbnN0IHsgcmV0dXJuIENvbnRlbnRzOyB9CisKKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0ZyYWdtZW50ICpGKSB7CisgICAgcmV0dXJuIEYtPmdldEtpbmQoKSA9PSBNQ0ZyYWdtZW50OjpGVF9Ed2FyZjsKKyAgfQorfTsKKworY2xhc3MgTUNEd2FyZkNhbGxGcmFtZUZyYWdtZW50IDogcHVibGljIE1DRnJhZ21lbnQgeworICAvLy8gQWRkckRlbHRhIC0gVGhlIGV4cHJlc3Npb24gZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHRoZSB0d28gc3ltYm9scyB0aGF0CisgIC8vLyBtYWtlIHVwIHRoZSBhZGRyZXNzIGRlbHRhIGJldHdlZW4gdHdvIC5jZmlfKiBkd2FyZiBkaXJlY3RpdmVzLgorICBjb25zdCBNQ0V4cHIgKkFkZHJEZWx0YTsKKworICBTbWFsbFN0cmluZzw4PiBDb250ZW50czsKKworcHVibGljOgorICBNQ0R3YXJmQ2FsbEZyYW1lRnJhZ21lbnQoY29uc3QgTUNFeHByICZBZGRyRGVsdGEsIE1DU2VjdGlvbiAqU2VjID0gbnVsbHB0cikKKyAgICAgIDogTUNGcmFnbWVudChGVF9Ed2FyZkZyYW1lLCBmYWxzZSwgMCwgU2VjKSwgQWRkckRlbHRhKCZBZGRyRGVsdGEpIHsKKyAgICBDb250ZW50cy5wdXNoX2JhY2soMCk7CisgIH0KKworICAvLy8gXG5hbWUgQWNjZXNzb3JzCisgIC8vLyBAeworCisgIGNvbnN0IE1DRXhwciAmZ2V0QWRkckRlbHRhKCkgY29uc3QgeyByZXR1cm4gKkFkZHJEZWx0YTsgfQorCisgIFNtYWxsU3RyaW5nPDg+ICZnZXRDb250ZW50cygpIHsgcmV0dXJuIENvbnRlbnRzOyB9CisgIGNvbnN0IFNtYWxsU3RyaW5nPDg+ICZnZXRDb250ZW50cygpIGNvbnN0IHsgcmV0dXJuIENvbnRlbnRzOyB9CisKKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0ZyYWdtZW50ICpGKSB7CisgICAgcmV0dXJuIEYtPmdldEtpbmQoKSA9PSBNQ0ZyYWdtZW50OjpGVF9Ed2FyZkZyYW1lOworICB9Cit9OworCisvLy8gUmVwcmVzZW50cyBhIHN5bWJvbCB0YWJsZSBpbmRleCBmcmFnbWVudC4KK2NsYXNzIE1DU3ltYm9sSWRGcmFnbWVudCA6IHB1YmxpYyBNQ0ZyYWdtZW50IHsKKyAgY29uc3QgTUNTeW1ib2wgKlN5bTsKKworcHVibGljOgorICBNQ1N5bWJvbElkRnJhZ21lbnQoY29uc3QgTUNTeW1ib2wgKlN5bSwgTUNTZWN0aW9uICpTZWMgPSBudWxscHRyKQorICAgICAgOiBNQ0ZyYWdtZW50KEZUX1N5bWJvbElkLCBmYWxzZSwgMCwgU2VjKSwgU3ltKFN5bSkge30KKworICAvLy8gXG5hbWUgQWNjZXNzb3JzCisgIC8vLyBAeworCisgIGNvbnN0IE1DU3ltYm9sICpnZXRTeW1ib2woKSB7IHJldHVybiBTeW07IH0KKyAgY29uc3QgTUNTeW1ib2wgKmdldFN5bWJvbCgpIGNvbnN0IHsgcmV0dXJuIFN5bTsgfQorCisgIC8vLyBAfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNGcmFnbWVudCAqRikgeworICAgIHJldHVybiBGLT5nZXRLaW5kKCkgPT0gTUNGcmFnbWVudDo6RlRfU3ltYm9sSWQ7CisgIH0KK307CisKKy8vLyBGcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIGJpbmFyeSBhbm5vdGF0aW9ucyBwcm9kdWNlZCBieSB0aGUKKy8vLyAuY3ZfaW5saW5lX2xpbmV0YWJsZSBkaXJlY3RpdmUuCitjbGFzcyBNQ0NWSW5saW5lTGluZVRhYmxlRnJhZ21lbnQgOiBwdWJsaWMgTUNGcmFnbWVudCB7CisgIHVuc2lnbmVkIFNpdGVGdW5jSWQ7CisgIHVuc2lnbmVkIFN0YXJ0RmlsZUlkOworICB1bnNpZ25lZCBTdGFydExpbmVOdW07CisgIGNvbnN0IE1DU3ltYm9sICpGblN0YXJ0U3ltOworICBjb25zdCBNQ1N5bWJvbCAqRm5FbmRTeW07CisgIFNtYWxsU3RyaW5nPDg+IENvbnRlbnRzOworCisgIC8vLyBDb2RlVmlld0NvbnRleHQgaGFzIHRoZSByZWFsIGtub3dsZWRnZSBhYm91dCB0aGlzIGZvcm1hdCwgc28gbGV0IGl0IGFjY2VzcworICAvLy8gb3VyIG1lbWJlcnMuCisgIGZyaWVuZCBjbGFzcyBDb2RlVmlld0NvbnRleHQ7CisKK3B1YmxpYzoKKyAgTUNDVklubGluZUxpbmVUYWJsZUZyYWdtZW50KHVuc2lnbmVkIFNpdGVGdW5jSWQsIHVuc2lnbmVkIFN0YXJ0RmlsZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3RhcnRMaW5lTnVtLCBjb25zdCBNQ1N5bWJvbCAqRm5TdGFydFN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICpGbkVuZFN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbiAqU2VjID0gbnVsbHB0cikKKyAgICAgIDogTUNGcmFnbWVudChGVF9DVklubGluZUxpbmVzLCBmYWxzZSwgMCwgU2VjKSwgU2l0ZUZ1bmNJZChTaXRlRnVuY0lkKSwKKyAgICAgICAgU3RhcnRGaWxlSWQoU3RhcnRGaWxlSWQpLCBTdGFydExpbmVOdW0oU3RhcnRMaW5lTnVtKSwKKyAgICAgICAgRm5TdGFydFN5bShGblN0YXJ0U3ltKSwgRm5FbmRTeW0oRm5FbmRTeW0pIHt9CisKKyAgLy8vIFxuYW1lIEFjY2Vzc29ycworICAvLy8gQHsKKworICBjb25zdCBNQ1N5bWJvbCAqZ2V0Rm5TdGFydFN5bSgpIGNvbnN0IHsgcmV0dXJuIEZuU3RhcnRTeW07IH0KKyAgY29uc3QgTUNTeW1ib2wgKmdldEZuRW5kU3ltKCkgY29uc3QgeyByZXR1cm4gRm5FbmRTeW07IH0KKworICBTbWFsbFN0cmluZzw4PiAmZ2V0Q29udGVudHMoKSB7IHJldHVybiBDb250ZW50czsgfQorICBjb25zdCBTbWFsbFN0cmluZzw4PiAmZ2V0Q29udGVudHMoKSBjb25zdCB7IHJldHVybiBDb250ZW50czsgfQorCisgIC8vLyBAfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNGcmFnbWVudCAqRikgeworICAgIHJldHVybiBGLT5nZXRLaW5kKCkgPT0gTUNGcmFnbWVudDo6RlRfQ1ZJbmxpbmVMaW5lczsKKyAgfQorfTsKKworLy8vIEZyYWdtZW50IHJlcHJlc2VudGluZyB0aGUgLmN2X2RlZl9yYW5nZSBkaXJlY3RpdmUuCitjbGFzcyBNQ0NWRGVmUmFuZ2VGcmFnbWVudCA6IHB1YmxpYyBNQ0VuY29kZWRGcmFnbWVudFdpdGhGaXh1cHM8MzIsIDQ+IHsKKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPGNvbnN0IE1DU3ltYm9sICosIGNvbnN0IE1DU3ltYm9sICo+LCAyPiBSYW5nZXM7CisgIFNtYWxsU3RyaW5nPDMyPiBGaXhlZFNpemVQb3J0aW9uOworCisgIC8vLyBDb2RlVmlld0NvbnRleHQgaGFzIHRoZSByZWFsIGtub3dsZWRnZSBhYm91dCB0aGlzIGZvcm1hdCwgc28gbGV0IGl0IGFjY2VzcworICAvLy8gb3VyIG1lbWJlcnMuCisgIGZyaWVuZCBjbGFzcyBDb2RlVmlld0NvbnRleHQ7CisKK3B1YmxpYzoKKyAgTUNDVkRlZlJhbmdlRnJhZ21lbnQoCisgICAgICBBcnJheVJlZjxzdGQ6OnBhaXI8Y29uc3QgTUNTeW1ib2wgKiwgY29uc3QgTUNTeW1ib2wgKj4+IFJhbmdlcywKKyAgICAgIFN0cmluZ1JlZiBGaXhlZFNpemVQb3J0aW9uLCBNQ1NlY3Rpb24gKlNlYyA9IG51bGxwdHIpCisgICAgICA6IE1DRW5jb2RlZEZyYWdtZW50V2l0aEZpeHVwczwzMiwgND4oRlRfQ1ZEZWZSYW5nZSwgZmFsc2UsIFNlYyksCisgICAgICAgIFJhbmdlcyhSYW5nZXMuYmVnaW4oKSwgUmFuZ2VzLmVuZCgpKSwKKyAgICAgICAgRml4ZWRTaXplUG9ydGlvbihGaXhlZFNpemVQb3J0aW9uKSB7fQorCisgIC8vLyBcbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisgIEFycmF5UmVmPHN0ZDo6cGFpcjxjb25zdCBNQ1N5bWJvbCAqLCBjb25zdCBNQ1N5bWJvbCAqPj4gZ2V0UmFuZ2VzKCkgY29uc3QgeworICAgIHJldHVybiBSYW5nZXM7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0Rml4ZWRTaXplUG9ydGlvbigpIGNvbnN0IHsgcmV0dXJuIEZpeGVkU2l6ZVBvcnRpb247IH0KKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0ZyYWdtZW50ICpGKSB7CisgICAgcmV0dXJuIEYtPmdldEtpbmQoKSA9PSBNQ0ZyYWdtZW50OjpGVF9DVkRlZlJhbmdlOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ0ZSQUdNRU5UX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNJbnN0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DSW5zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMjhmZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DSW5zdC5oCkBAIC0wLDAgKzEsMjIzIEBACisvLz09PS0gbGx2bS9NQy9NQ0luc3QuaCAtIE1DSW5zdCBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIE1DSW5zdCBhbmQgTUNPcGVyYW5kIGNsYXNzZXMsIHdoaWNoCisvLyBpcyB0aGUgYmFzaWMgcmVwcmVzZW50YXRpb24gdXNlZCB0byByZXByZXNlbnQgbG93LWxldmVsIG1hY2hpbmUgY29kZQorLy8gaW5zdHJ1Y3Rpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0lOU1RfSAorI2RlZmluZSBMTFZNX01DX01DSU5TVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TTUxvYy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIE1DSW5zdDsKK2NsYXNzIE1DSW5zdFByaW50ZXI7CitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIFxicmllZiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgb3BlcmFuZHMgb2YgdGhlIE1DSW5zdCBjbGFzcy4KKy8vLyBUaGlzIGlzIGEgc2ltcGxlIGRpc2NyaW1pbmF0ZWQgdW5pb24uCitjbGFzcyBNQ09wZXJhbmQgeworICBlbnVtIE1hY2hpbmVPcGVyYW5kVHlwZSA6IHVuc2lnbmVkIGNoYXIgeworICAgIGtJbnZhbGlkLCAgICAgLy8vPCBVbmluaXRpYWxpemVkLgorICAgIGtSZWdpc3RlciwgICAgLy8vPCBSZWdpc3RlciBvcGVyYW5kLgorICAgIGtJbW1lZGlhdGUsICAgLy8vPCBJbW1lZGlhdGUgb3BlcmFuZC4KKyAgICBrRlBJbW1lZGlhdGUsIC8vLzwgRmxvYXRpbmctcG9pbnQgaW1tZWRpYXRlIG9wZXJhbmQuCisgICAga0V4cHIsICAgICAgICAvLy88IFJlbG9jYXRhYmxlIGltbWVkaWF0ZSBvcGVyYW5kLgorICAgIGtJbnN0ICAgICAgICAgLy8vPCBTdWItaW5zdHJ1Y3Rpb24gb3BlcmFuZC4KKyAgfTsKKyAgTWFjaGluZU9wZXJhbmRUeXBlIEtpbmQgPSBrSW52YWxpZDsKKworICB1bmlvbiB7CisgICAgdW5zaWduZWQgUmVnVmFsOworICAgIGludDY0X3QgSW1tVmFsOworICAgIGRvdWJsZSBGUEltbVZhbDsKKyAgICBjb25zdCBNQ0V4cHIgKkV4cHJWYWw7CisgICAgY29uc3QgTUNJbnN0ICpJbnN0VmFsOworICB9OworCitwdWJsaWM6CisgIE1DT3BlcmFuZCgpIDogRlBJbW1WYWwoMC4wKSB7fQorCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgIT0ga0ludmFsaWQ7IH0KKyAgYm9vbCBpc1JlZygpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0ga1JlZ2lzdGVyOyB9CisgIGJvb2wgaXNJbW0oKSBjb25zdCB7IHJldHVybiBLaW5kID09IGtJbW1lZGlhdGU7IH0KKyAgYm9vbCBpc0ZQSW1tKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBrRlBJbW1lZGlhdGU7IH0KKyAgYm9vbCBpc0V4cHIoKSBjb25zdCB7IHJldHVybiBLaW5kID09IGtFeHByOyB9CisgIGJvb2wgaXNJbnN0KCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBrSW5zdDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgcmVnaXN0ZXIgbnVtYmVyLgorICB1bnNpZ25lZCBnZXRSZWcoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzUmVnKCkgJiYgIlRoaXMgaXMgbm90IGEgcmVnaXN0ZXIgb3BlcmFuZCEiKTsKKyAgICByZXR1cm4gUmVnVmFsOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIHJlZ2lzdGVyIG51bWJlci4KKyAgdm9pZCBzZXRSZWcodW5zaWduZWQgUmVnKSB7CisgICAgYXNzZXJ0KGlzUmVnKCkgJiYgIlRoaXMgaXMgbm90IGEgcmVnaXN0ZXIgb3BlcmFuZCEiKTsKKyAgICBSZWdWYWwgPSBSZWc7CisgIH0KKworICBpbnQ2NF90IGdldEltbSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNJbW0oKSAmJiAiVGhpcyBpcyBub3QgYW4gaW1tZWRpYXRlIik7CisgICAgcmV0dXJuIEltbVZhbDsKKyAgfQorCisgIHZvaWQgc2V0SW1tKGludDY0X3QgVmFsKSB7CisgICAgYXNzZXJ0KGlzSW1tKCkgJiYgIlRoaXMgaXMgbm90IGFuIGltbWVkaWF0ZSIpOworICAgIEltbVZhbCA9IFZhbDsKKyAgfQorCisgIGRvdWJsZSBnZXRGUEltbSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNGUEltbSgpICYmICJUaGlzIGlzIG5vdCBhbiBGUCBpbW1lZGlhdGUiKTsKKyAgICByZXR1cm4gRlBJbW1WYWw7CisgIH0KKworICB2b2lkIHNldEZQSW1tKGRvdWJsZSBWYWwpIHsKKyAgICBhc3NlcnQoaXNGUEltbSgpICYmICJUaGlzIGlzIG5vdCBhbiBGUCBpbW1lZGlhdGUiKTsKKyAgICBGUEltbVZhbCA9IFZhbDsKKyAgfQorCisgIGNvbnN0IE1DRXhwciAqZ2V0RXhwcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNFeHByKCkgJiYgIlRoaXMgaXMgbm90IGFuIGV4cHJlc3Npb24iKTsKKyAgICByZXR1cm4gRXhwclZhbDsKKyAgfQorCisgIHZvaWQgc2V0RXhwcihjb25zdCBNQ0V4cHIgKlZhbCkgeworICAgIGFzc2VydChpc0V4cHIoKSAmJiAiVGhpcyBpcyBub3QgYW4gZXhwcmVzc2lvbiIpOworICAgIEV4cHJWYWwgPSBWYWw7CisgIH0KKworICBjb25zdCBNQ0luc3QgKmdldEluc3QoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzSW5zdCgpICYmICJUaGlzIGlzIG5vdCBhIHN1Yi1pbnN0cnVjdGlvbiIpOworICAgIHJldHVybiBJbnN0VmFsOworICB9CisKKyAgdm9pZCBzZXRJbnN0KGNvbnN0IE1DSW5zdCAqVmFsKSB7CisgICAgYXNzZXJ0KGlzSW5zdCgpICYmICJUaGlzIGlzIG5vdCBhIHN1Yi1pbnN0cnVjdGlvbiIpOworICAgIEluc3RWYWwgPSBWYWw7CisgIH0KKworICBzdGF0aWMgTUNPcGVyYW5kIGNyZWF0ZVJlZyh1bnNpZ25lZCBSZWcpIHsKKyAgICBNQ09wZXJhbmQgT3A7CisgICAgT3AuS2luZCA9IGtSZWdpc3RlcjsKKyAgICBPcC5SZWdWYWwgPSBSZWc7CisgICAgcmV0dXJuIE9wOworICB9CisKKyAgc3RhdGljIE1DT3BlcmFuZCBjcmVhdGVJbW0oaW50NjRfdCBWYWwpIHsKKyAgICBNQ09wZXJhbmQgT3A7CisgICAgT3AuS2luZCA9IGtJbW1lZGlhdGU7CisgICAgT3AuSW1tVmFsID0gVmFsOworICAgIHJldHVybiBPcDsKKyAgfQorCisgIHN0YXRpYyBNQ09wZXJhbmQgY3JlYXRlRlBJbW0oZG91YmxlIFZhbCkgeworICAgIE1DT3BlcmFuZCBPcDsKKyAgICBPcC5LaW5kID0ga0ZQSW1tZWRpYXRlOworICAgIE9wLkZQSW1tVmFsID0gVmFsOworICAgIHJldHVybiBPcDsKKyAgfQorCisgIHN0YXRpYyBNQ09wZXJhbmQgY3JlYXRlRXhwcihjb25zdCBNQ0V4cHIgKlZhbCkgeworICAgIE1DT3BlcmFuZCBPcDsKKyAgICBPcC5LaW5kID0ga0V4cHI7CisgICAgT3AuRXhwclZhbCA9IFZhbDsKKyAgICByZXR1cm4gT3A7CisgIH0KKworICBzdGF0aWMgTUNPcGVyYW5kIGNyZWF0ZUluc3QoY29uc3QgTUNJbnN0ICpWYWwpIHsKKyAgICBNQ09wZXJhbmQgT3A7CisgICAgT3AuS2luZCA9IGtJbnN0OworICAgIE9wLkluc3RWYWwgPSBWYWw7CisgICAgcmV0dXJuIE9wOworICB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc1BvZExpa2U8TUNPcGVyYW5kPiB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworLy8vIFxicmllZiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBzaW5nbGUgbG93LWxldmVsIG1hY2hpbmUKKy8vLyBpbnN0cnVjdGlvbi4KK2NsYXNzIE1DSW5zdCB7CisgIHVuc2lnbmVkIE9wY29kZSA9IDA7CisgIFNNTG9jIExvYzsKKyAgU21hbGxWZWN0b3I8TUNPcGVyYW5kLCA4PiBPcGVyYW5kczsKKyAgLy8gVGhlc2UgZmxhZ3MgY291bGQgYmUgdXNlZCB0byBwYXNzIHNvbWUgaW5mbyBmcm9tIG9uZSB0YXJnZXQgc3ViY29tcG9uZW50CisgIC8vIHRvIGFub3RoZXIsIGZvciBleGFtcGxlLCBmcm9tIGRpc2Fzc2VtYmxlciB0byBhc20gcHJpbnRlci4gVGhlIHZhbHVlcyBvZgorICAvLyB0aGUgZmxhZ3MgaGF2ZSBhbnkgc2Vuc2Ugb24gdGFyZ2V0IGxldmVsIG9ubHkgKGUuZy4gcHJlZml4ZXMgb24geDg2KS4KKyAgdW5zaWduZWQgRmxhZ3MgPSAwOworCitwdWJsaWM6CisgIE1DSW5zdCgpID0gZGVmYXVsdDsKKworICB2b2lkIHNldE9wY29kZSh1bnNpZ25lZCBPcCkgeyBPcGNvZGUgPSBPcDsgfQorICB1bnNpZ25lZCBnZXRPcGNvZGUoKSBjb25zdCB7IHJldHVybiBPcGNvZGU7IH0KKworICB2b2lkIHNldEZsYWdzKHVuc2lnbmVkIEYpIHsgRmxhZ3MgPSBGOyB9CisgIHVuc2lnbmVkIGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gRmxhZ3M7IH0KKworICB2b2lkIHNldExvYyhTTUxvYyBsb2MpIHsgTG9jID0gbG9jOyB9CisgIFNNTG9jIGdldExvYygpIGNvbnN0IHsgcmV0dXJuIExvYzsgfQorCisgIGNvbnN0IE1DT3BlcmFuZCAmZ2V0T3BlcmFuZCh1bnNpZ25lZCBpKSBjb25zdCB7IHJldHVybiBPcGVyYW5kc1tpXTsgfQorICBNQ09wZXJhbmQgJmdldE9wZXJhbmQodW5zaWduZWQgaSkgeyByZXR1cm4gT3BlcmFuZHNbaV07IH0KKyAgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdCB7IHJldHVybiBPcGVyYW5kcy5zaXplKCk7IH0KKworICB2b2lkIGFkZE9wZXJhbmQoY29uc3QgTUNPcGVyYW5kICZPcCkgeyBPcGVyYW5kcy5wdXNoX2JhY2soT3ApOyB9CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBTbWFsbFZlY3RvckltcGw8TUNPcGVyYW5kPjo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gU21hbGxWZWN0b3JJbXBsPE1DT3BlcmFuZD46OmNvbnN0X2l0ZXJhdG9yOworCisgIHZvaWQgY2xlYXIoKSB7IE9wZXJhbmRzLmNsZWFyKCk7IH0KKyAgdm9pZCBlcmFzZShpdGVyYXRvciBJKSB7IE9wZXJhbmRzLmVyYXNlKEkpOyB9CisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gT3BlcmFuZHMuc2l6ZSgpOyB9CisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gT3BlcmFuZHMuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIE9wZXJhbmRzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gT3BlcmFuZHMuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gT3BlcmFuZHMuZW5kKCk7IH0KKworICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgSSwgY29uc3QgTUNPcGVyYW5kICZPcCkgeworICAgIHJldHVybiBPcGVyYW5kcy5pbnNlcnQoSSwgT3ApOworICB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIER1bXAgdGhlIE1DSW5zdCBhcyBwcmV0dGlseSBhcyBwb3NzaWJsZSB1c2luZyB0aGUgYWRkaXRpb25hbCBNQworICAvLy8gc3RydWN0dXJlcywgaWYgZ2l2ZW4uIE9wZXJhdG9ycyBhcmUgc2VwYXJhdGVkIGJ5IHRoZSBccCBTZXBhcmF0b3IKKyAgLy8vIHN0cmluZy4KKyAgdm9pZCBkdW1wX3ByZXR0eShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1DSW5zdFByaW50ZXIgKlByaW50ZXIgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTZXBhcmF0b3IgPSAiICIpIGNvbnN0OworfTsKKworaW5saW5lIHJhd19vc3RyZWFtJiBvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTUNPcGVyYW5kICZNTykgeworICBNTy5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworaW5saW5lIHJhd19vc3RyZWFtJiBvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTUNJbnN0ICZNSSkgeworICBNSS5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNJTlNUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNJbnN0QnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3RCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA2MDliZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNJbnN0QnVpbGRlci5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vPT09LS0gbGx2bS9NQy9NQ0luc3RCdWlsZGVyLmggLSBTaW1wbGlmeSBjcmVhdGlvbiBvZiBNQ0luc3RzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBNQ0luc3RCdWlsZGVyIGNsYXNzIGZvciBjb252ZW5pZW50IGNyZWF0aW9uIG9mCisvLyBNQ0luc3RzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0lOU1RCVUlMREVSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0lOU1RCVUlMREVSX0gKKworI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0LmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNJbnN0QnVpbGRlciB7CisgIE1DSW5zdCBJbnN0OworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbmV3IE1DSW5zdEJ1aWxkZXIgZm9yIGFuIE1DSW5zdCB3aXRoIGEgc3BlY2lmaWMgb3Bjb2RlLgorICBNQ0luc3RCdWlsZGVyKHVuc2lnbmVkIE9wY29kZSkgeworICAgIEluc3Quc2V0T3Bjb2RlKE9wY29kZSk7CisgIH0KKworICAvLy8gXGJyaWVmIEFkZCBhIG5ldyByZWdpc3RlciBvcGVyYW5kLgorICBNQ0luc3RCdWlsZGVyICZhZGRSZWcodW5zaWduZWQgUmVnKSB7CisgICAgSW5zdC5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Y3JlYXRlUmVnKFJlZykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IGludGVnZXIgaW1tZWRpYXRlIG9wZXJhbmQuCisgIE1DSW5zdEJ1aWxkZXIgJmFkZEltbShpbnQ2NF90IFZhbCkgeworICAgIEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OmNyZWF0ZUltbShWYWwpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIEFkZCBhIG5ldyBmbG9hdGluZyBwb2ludCBpbW1lZGlhdGUgb3BlcmFuZC4KKyAgTUNJbnN0QnVpbGRlciAmYWRkRlBJbW0oZG91YmxlIFZhbCkgeworICAgIEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OmNyZWF0ZUZQSW1tKFZhbCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IE1DRXhwciBvcGVyYW5kLgorICBNQ0luc3RCdWlsZGVyICZhZGRFeHByKGNvbnN0IE1DRXhwciAqVmFsKSB7CisgICAgSW5zdC5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Y3JlYXRlRXhwcihWYWwpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIEFkZCBhIG5ldyBNQ0luc3Qgb3BlcmFuZC4KKyAgTUNJbnN0QnVpbGRlciAmYWRkSW5zdChjb25zdCBNQ0luc3QgKlZhbCkgeworICAgIEluc3QuYWRkT3BlcmFuZChNQ09wZXJhbmQ6OmNyZWF0ZUluc3QoVmFsKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBBZGQgYW4gb3BlcmFuZC4KKyAgTUNJbnN0QnVpbGRlciAmYWRkT3BlcmFuZChjb25zdCBNQ09wZXJhbmQgJk9wKSB7CisgICAgSW5zdC5hZGRPcGVyYW5kKE9wKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBvcGVyYXRvciBNQ0luc3QmKCkgeworICAgIHJldHVybiBJbnN0OworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNJbnN0UHJpbnRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3RQcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY5NDAzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNJbnN0UHJpbnRlci5oCkBAIC0wLDAgKzEsMTA5IEBACisvLz09PS0gTUNJbnN0UHJpbnRlci5oIC0gTUNJbnN0IHRvIHRhcmdldCBhc3NlbWJseSBzeW50YXggLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNJTlNUUFJJTlRFUl9ICisjZGVmaW5lIExMVk1fTUNfTUNJTlNUUFJJTlRFUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0LmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CitjbGFzcyBNQ0FzbUluZm87CitjbGFzcyBNQ0luc3Q7CitjbGFzcyBNQ0luc3RySW5mbzsKK2NsYXNzIE1DUmVnaXN0ZXJJbmZvOworY2xhc3MgTUNTdWJ0YXJnZXRJbmZvOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBTdHJpbmdSZWY7CisKKy8vLyBDb252ZXJ0IGBCeXRlcycgdG8gYSBoZXggc3RyaW5nIGFuZCBvdXRwdXQgdG8gYE9TJwordm9pZCBkdW1wQnl0ZXMoQXJyYXlSZWY8dWludDhfdD4gQnl0ZXMsIHJhd19vc3RyZWFtICZPUyk7CisKK25hbWVzcGFjZSBIZXhTdHlsZSB7CisKK2VudW0gU3R5bGUgeworICBDLCAgLy8vPCAweGZmCisgIEFzbSAvLy88IDBmZmgKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBIZXhTdHlsZQorCisvLy8gXGJyaWVmIFRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgYSB0YXJnZXQgYXNzZW1ibHkgbGFuZ3VhZ2UgcHJpbnRlciB0aGF0CisvLy8gY29udmVydHMgYW4gTUNJbnN0IHRvIHZhbGlkIHRhcmdldCBhc3NlbWJseSBzeW50YXguCitjbGFzcyBNQ0luc3RQcmludGVyIHsKK3Byb3RlY3RlZDoKKyAgLy8vIFxicmllZiBBIHN0cmVhbSB0aGF0IGNvbW1lbnRzIGNhbiBiZSBlbWl0dGVkIHRvIGlmIGRlc2lyZWQuICBFYWNoIGNvbW1lbnQKKyAgLy8vIG11c3QgZW5kIHdpdGggYSBuZXdsaW5lLiAgVGhpcyB3aWxsIGJlIG51bGwgaWYgdmVyYm9zZSBhc3NlbWJseSBlbWlzc2lvbgorICAvLy8gaXMgZGlzYWJsZS4KKyAgcmF3X29zdHJlYW0gKkNvbW1lbnRTdHJlYW0gPSBudWxscHRyOworICBjb25zdCBNQ0FzbUluZm8gJk1BSTsKKyAgY29uc3QgTUNJbnN0ckluZm8gJk1JSTsKKyAgY29uc3QgTUNSZWdpc3RlckluZm8gJk1SSTsKKworICAvLy8gVHJ1ZSBpZiB3ZSBhcmUgcHJpbnRpbmcgbWFya2VkIHVwIGFzc2VtYmx5LgorICBib29sIFVzZU1hcmt1cCA9IGZhbHNlOworCisgIC8vLyBUcnVlIGlmIHdlIGFyZSBwcmludGluZyBpbW1lZGlhdGVzIGFzIGhleC4KKyAgYm9vbCBQcmludEltbUhleCA9IGZhbHNlOworCisgIC8vLyBXaGljaCBzdHlsZSB0byB1c2UgZm9yIHByaW50aW5nIGhleGFkZWNpbWFsIHZhbHVlcy4KKyAgSGV4U3R5bGU6OlN0eWxlIFByaW50SGV4U3R5bGUgPSBIZXhTdHlsZTo6QzsKKworICAvLy8gVXRpbGl0eSBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgYW5ub3RhdGlvbnMuCisgIHZvaWQgcHJpbnRBbm5vdGF0aW9uKHJhd19vc3RyZWFtICZPUywgU3RyaW5nUmVmIEFubm90KTsKKworcHVibGljOgorICBNQ0luc3RQcmludGVyKGNvbnN0IE1DQXNtSW5mbyAmbWFpLCBjb25zdCBNQ0luc3RySW5mbyAmbWlpLAorICAgICAgICAgICAgICAgIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICZtcmkpIDogTUFJKG1haSksIE1JSShtaWkpLCBNUkkobXJpKSB7fQorCisgIHZpcnR1YWwgfk1DSW5zdFByaW50ZXIoKTsKKworICAvLy8gXGJyaWVmIFNwZWNpZnkgYSBzdHJlYW0gdG8gZW1pdCBjb21tZW50cyB0by4KKyAgdm9pZCBzZXRDb21tZW50U3RyZWFtKHJhd19vc3RyZWFtICZPUykgeyBDb21tZW50U3RyZWFtID0gJk9TOyB9CisKKyAgLy8vIFxicmllZiBQcmludCB0aGUgc3BlY2lmaWVkIE1DSW5zdCB0byB0aGUgc3BlY2lmaWVkIHJhd19vc3RyZWFtLgorICB2aXJ0dWFsIHZvaWQgcHJpbnRJbnN0KGNvbnN0IE1DSW5zdCAqTUksIHJhd19vc3RyZWFtICZPUywgU3RyaW5nUmVmIEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJKSA9IDA7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBvcGNvZGUgZW51bSAoZS5nLiAiTU9WMzJyaSIpIG9yCisgIC8vLyBlbXB0eSBpZiB3ZSBjYW4ndCByZXNvbHZlIGl0LgorICBTdHJpbmdSZWYgZ2V0T3Bjb2RlTmFtZSh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUHJpbnQgdGhlIGFzc2VtYmxlciByZWdpc3RlciBuYW1lLgorICB2aXJ0dWFsIHZvaWQgcHJpbnRSZWdOYW1lKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgUmVnTm8pIGNvbnN0OworCisgIGJvb2wgZ2V0VXNlTWFya3VwKCkgY29uc3QgeyByZXR1cm4gVXNlTWFya3VwOyB9CisgIHZvaWQgc2V0VXNlTWFya3VwKGJvb2wgVmFsdWUpIHsgVXNlTWFya3VwID0gVmFsdWU7IH0KKworICAvLy8gVXRpbGl0eSBmdW5jdGlvbnMgdG8gbWFrZSBhZGRpbmcgbWFyayB1cHMgc2ltcGxlci4KKyAgU3RyaW5nUmVmIG1hcmt1cChTdHJpbmdSZWYgcykgY29uc3Q7CisgIFN0cmluZ1JlZiBtYXJrdXAoU3RyaW5nUmVmIGEsIFN0cmluZ1JlZiBiKSBjb25zdDsKKworICBib29sIGdldFByaW50SW1tSGV4KCkgY29uc3QgeyByZXR1cm4gUHJpbnRJbW1IZXg7IH0KKyAgdm9pZCBzZXRQcmludEltbUhleChib29sIFZhbHVlKSB7IFByaW50SW1tSGV4ID0gVmFsdWU7IH0KKworICBIZXhTdHlsZTo6U3R5bGUgZ2V0UHJpbnRIZXhTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIFByaW50SGV4U3R5bGU7IH0KKyAgdm9pZCBzZXRQcmludEhleFN0eWxlKEhleFN0eWxlOjpTdHlsZSBWYWx1ZSkgeyBQcmludEhleFN0eWxlID0gVmFsdWU7IH0KKworICAvLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBwcmludCBpbW1lZGlhdGVzIGluIGRlY2ltYWwgb3IgaGV4LgorICBmb3JtYXRfb2JqZWN0PGludDY0X3Q+IGZvcm1hdEltbShpbnQ2NF90IFZhbHVlKSBjb25zdCB7CisgICAgcmV0dXJuIFByaW50SW1tSGV4ID8gZm9ybWF0SGV4KFZhbHVlKSA6IGZvcm1hdERlYyhWYWx1ZSk7CisgIH0KKworICAvLy8gVXRpbGl0eSBmdW5jdGlvbnMgdG8gcHJpbnQgZGVjaW1hbC9oZXhhZGVjaW1hbCB2YWx1ZXMuCisgIGZvcm1hdF9vYmplY3Q8aW50NjRfdD4gZm9ybWF0RGVjKGludDY0X3QgVmFsdWUpIGNvbnN0OworICBmb3JtYXRfb2JqZWN0PGludDY0X3Q+IGZvcm1hdEhleChpbnQ2NF90IFZhbHVlKSBjb25zdDsKKyAgZm9ybWF0X29iamVjdDx1aW50NjRfdD4gZm9ybWF0SGV4KHVpbnQ2NF90IFZhbHVlKSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DSU5TVFBSSU5URVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3RyQW5hbHlzaXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNJbnN0ckFuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzZTFkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNJbnN0ckFuYWx5c2lzLmgKQEAgLTAsMCArMSw3MiBAQAorLy89PT0tIGxsdm0vTUMvTUNJbnN0ckFuYWx5c2lzLmggLSBJbnN0ckRlc2MgdGFyZ2V0IGhvb2tzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgTUNJbnN0ckFuYWx5c2lzIGNsYXNzIHdoaWNoIHRoZSBNQ1RhcmdldERlc2NzIGNhbgorLy8gZGVyaXZlIGZyb20gdG8gZ2l2ZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIE1DLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0lOU1RSQU5BTFlTSVNfSAorI2RlZmluZSBMTFZNX01DX01DSU5TVFJBTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL01DL01DSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0ckRlc2MuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DSW5zdHJJbmZvLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0luc3RyQW5hbHlzaXMgeworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgVGFyZ2V0OworCisgIGNvbnN0IE1DSW5zdHJJbmZvICpJbmZvOworCitwdWJsaWM6CisgIE1DSW5zdHJBbmFseXNpcyhjb25zdCBNQ0luc3RySW5mbyAqSW5mbykgOiBJbmZvKEluZm8pIHt9CisgIHZpcnR1YWwgfk1DSW5zdHJBbmFseXNpcygpID0gZGVmYXVsdDsKKworICB2aXJ0dWFsIGJvb2wgaXNCcmFuY2goY29uc3QgTUNJbnN0ICZJbnN0KSBjb25zdCB7CisgICAgcmV0dXJuIEluZm8tPmdldChJbnN0LmdldE9wY29kZSgpKS5pc0JyYW5jaCgpOworICB9CisKKyAgdmlydHVhbCBib29sIGlzQ29uZGl0aW9uYWxCcmFuY2goY29uc3QgTUNJbnN0ICZJbnN0KSBjb25zdCB7CisgICAgcmV0dXJuIEluZm8tPmdldChJbnN0LmdldE9wY29kZSgpKS5pc0NvbmRpdGlvbmFsQnJhbmNoKCk7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgaXNVbmNvbmRpdGlvbmFsQnJhbmNoKGNvbnN0IE1DSW5zdCAmSW5zdCkgY29uc3QgeworICAgIHJldHVybiBJbmZvLT5nZXQoSW5zdC5nZXRPcGNvZGUoKSkuaXNVbmNvbmRpdGlvbmFsQnJhbmNoKCk7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgaXNJbmRpcmVjdEJyYW5jaChjb25zdCBNQ0luc3QgJkluc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5mby0+Z2V0KEluc3QuZ2V0T3Bjb2RlKCkpLmlzSW5kaXJlY3RCcmFuY2goKTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBpc0NhbGwoY29uc3QgTUNJbnN0ICZJbnN0KSBjb25zdCB7CisgICAgcmV0dXJuIEluZm8tPmdldChJbnN0LmdldE9wY29kZSgpKS5pc0NhbGwoKTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBpc1JldHVybihjb25zdCBNQ0luc3QgJkluc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5mby0+Z2V0KEluc3QuZ2V0T3Bjb2RlKCkpLmlzUmV0dXJuKCk7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgaXNUZXJtaW5hdG9yKGNvbnN0IE1DSW5zdCAmSW5zdCkgY29uc3QgeworICAgIHJldHVybiBJbmZvLT5nZXQoSW5zdC5nZXRPcGNvZGUoKSkuaXNUZXJtaW5hdG9yKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdpdmVuIGEgYnJhbmNoIGluc3RydWN0aW9uIHRyeSB0byBnZXQgdGhlIGFkZHJlc3MgdGhlIGJyYW5jaAorICAvLy8gdGFyZ2V0cy4gUmV0dXJuIHRydWUgb24gc3VjY2VzcywgYW5kIHRoZSBhZGRyZXNzIGluIFRhcmdldC4KKyAgdmlydHVhbCBib29sCisgIGV2YWx1YXRlQnJhbmNoKGNvbnN0IE1DSW5zdCAmSW5zdCwgdWludDY0X3QgQWRkciwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgdWludDY0X3QgJlRhcmdldCkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ0lOU1RSQU5BTFlTSVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3RyRGVzYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3RyRGVzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNGM3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DSW5zdHJEZXNjLmgKQEAgLTAsMCArMSw1OTEgQEAKKy8vPT09LS0gbGx2bS9NQy9NQ0luc3RyRGVzYy5oIC0gSW5zdHJ1Y3Rpb24gRGVzY3JpcHRvcnMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNQ09wZXJhbmRJbmZvIGFuZCBNQ0luc3RyRGVzYyBjbGFzc2VzLCB3aGljaAorLy8gYXJlIHVzZWQgdG8gZGVzY3JpYmUgdGFyZ2V0IGluc3RydWN0aW9ucyBhbmQgdGhlaXIgb3BlcmFuZHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DSU5TVFJERVNDX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0lOU1RSREVTQ19ICisKKyNpbmNsdWRlICJsbHZtL01DL01DUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBNQ0luc3Q7CisgIGNsYXNzIE1DU3VidGFyZ2V0SW5mbzsKKyAgY2xhc3MgRmVhdHVyZUJpdHNldDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hY2hpbmUgT3BlcmFuZCBGbGFncyBhbmQgRGVzY3JpcHRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK25hbWVzcGFjZSBNQ09JIHsKKy8vIE9wZXJhbmQgY29uc3RyYWludHMKK2VudW0gT3BlcmFuZENvbnN0cmFpbnQgeworICBUSUVEX1RPID0gMCwgIC8vIE11c3QgYmUgYWxsb2NhdGVkIHRoZSBzYW1lIHJlZ2lzdGVyIGFzLgorICBFQVJMWV9DTE9CQkVSIC8vIE9wZXJhbmQgaXMgYW4gZWFybHkgY2xvYmJlciByZWdpc3RlciBvcGVyYW5kCit9OworCisvLy8gXGJyaWVmIFRoZXNlIGFyZSBmbGFncyBzZXQgb24gb3BlcmFuZHMsIGJ1dCBzaG91bGQgYmUgY29uc2lkZXJlZAorLy8vIHByaXZhdGUsIGFsbCBhY2Nlc3Mgc2hvdWxkIGdvIHRocm91Z2ggdGhlIE1DT3BlcmFuZEluZm8gYWNjZXNzb3JzLgorLy8vIFNlZSB0aGUgYWNjZXNzb3JzIGZvciBhIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlc2UgYXJlLgorZW51bSBPcGVyYW5kRmxhZ3MgeyBMb29rdXBQdHJSZWdDbGFzcyA9IDAsIFByZWRpY2F0ZSwgT3B0aW9uYWxEZWYgfTsKKworLy8vIFxicmllZiBPcGVyYW5kcyBhcmUgdGFnZ2VkIHdpdGggb25lIG9mIHRoZSB2YWx1ZXMgb2YgdGhpcyBlbnVtLgorZW51bSBPcGVyYW5kVHlwZSB7CisgIE9QRVJBTkRfVU5LTk9XTiA9IDAsCisgIE9QRVJBTkRfSU1NRURJQVRFID0gMSwKKyAgT1BFUkFORF9SRUdJU1RFUiA9IDIsCisgIE9QRVJBTkRfTUVNT1JZID0gMywKKyAgT1BFUkFORF9QQ1JFTCA9IDQsCisKKyAgT1BFUkFORF9GSVJTVF9HRU5FUklDID0gNiwKKyAgT1BFUkFORF9HRU5FUklDXzAgPSA2LAorICBPUEVSQU5EX0dFTkVSSUNfMSA9IDcsCisgIE9QRVJBTkRfR0VORVJJQ18yID0gOCwKKyAgT1BFUkFORF9HRU5FUklDXzMgPSA5LAorICBPUEVSQU5EX0dFTkVSSUNfNCA9IDEwLAorICBPUEVSQU5EX0dFTkVSSUNfNSA9IDExLAorICBPUEVSQU5EX0xBU1RfR0VORVJJQyA9IDExLAorCisgIE9QRVJBTkRfRklSU1RfVEFSR0VUID0gMTIsCit9OworCitlbnVtIEdlbmVyaWNPcGVyYW5kVHlwZSB7Cit9OworCit9CisKKy8vLyBcYnJpZWYgVGhpcyBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3BlcmFuZCBvZiBhIG1hY2hpbmUgaW5zdHJ1Y3Rpb24sCisvLy8gaW5kaWNhdGluZyB0aGUgcmVnaXN0ZXIgY2xhc3MgZm9yIHJlZ2lzdGVyIG9wZXJhbmRzLCBldGMuCitjbGFzcyBNQ09wZXJhbmRJbmZvIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBUaGlzIHNwZWNpZmllcyB0aGUgcmVnaXN0ZXIgY2xhc3MgZW51bWVyYXRpb24gb2YgdGhlIG9wZXJhbmQKKyAgLy8vIGlmIHRoZSBvcGVyYW5kIGlzIGEgcmVnaXN0ZXIuICBJZiBpc0xvb2t1cFB0clJlZ0NsYXNzIGlzIHNldCwgdGhlbiB0aGlzIGlzCisgIC8vLyBhbiBpbmRleCB0aGF0IGlzIHBhc3NlZCB0byBUYXJnZXRSZWdpc3RlckluZm86OmdldFBvaW50ZXJSZWdDbGFzcyh4KSB0bworICAvLy8gZ2V0IGEgZHluYW1pYyByZWdpc3RlciBjbGFzcy4KKyAgaW50MTZfdCBSZWdDbGFzczsKKworICAvLy8gXGJyaWVmIFRoZXNlIGFyZSBmbGFncyBmcm9tIHRoZSBNQ09JOjpPcGVyYW5kRmxhZ3MgZW51bS4KKyAgdWludDhfdCBGbGFnczsKKworICAvLy8gXGJyaWVmIEluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIHRoZSBvcGVyYW5kLgorICB1aW50OF90IE9wZXJhbmRUeXBlOworICAvLy8gXGJyaWVmIFRoZSBsb3dlciAxNiBiaXRzIGFyZSB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggY29uc3RyYWludHMgYXJlIHNldC4KKyAgLy8vIFRoZSBoaWdoZXIgMTYgYml0cyBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZSB2YWx1ZSBvZiBjb25zdHJhaW50cyAoNCBiaXRzCisgIC8vLyBlYWNoKS4KKyAgdWludDMyX3QgQ29uc3RyYWludHM7CisKKyAgLy8vIFxicmllZiBTZXQgaWYgdGhpcyBvcGVyYW5kIGlzIGEgcG9pbnRlciB2YWx1ZSBhbmQgaXQgcmVxdWlyZXMgYSBjYWxsYmFjaworICAvLy8gdG8gbG9vayB1cCBpdHMgcmVnaXN0ZXIgY2xhc3MuCisgIGJvb2wgaXNMb29rdXBQdHJSZWdDbGFzcygpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMSA8PCBNQ09JOjpMb29rdXBQdHJSZWdDbGFzcyk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCBpZiB0aGlzIGlzIG9uZSBvZiB0aGUgb3BlcmFuZHMgdGhhdCBtYWRlIHVwIG9mIHRoZSBwcmVkaWNhdGUKKyAgLy8vIG9wZXJhbmQgdGhhdCBjb250cm9scyBhbiBpc1ByZWRpY2FibGUoKSBpbnN0cnVjdGlvbi4KKyAgYm9vbCBpc1ByZWRpY2F0ZSgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDEgPDwgTUNPSTo6UHJlZGljYXRlKTsgfQorCisgIC8vLyBcYnJpZWYgU2V0IGlmIHRoaXMgb3BlcmFuZCBpcyBhIG9wdGlvbmFsIGRlZi4KKyAgYm9vbCBpc09wdGlvbmFsRGVmKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMSA8PCBNQ09JOjpPcHRpb25hbERlZik7IH0KKworICBib29sIGlzR2VuZXJpY1R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIE9wZXJhbmRUeXBlID49IE1DT0k6Ok9QRVJBTkRfRklSU1RfR0VORVJJQyAmJgorICAgICAgICAgICBPcGVyYW5kVHlwZSA8PSBNQ09JOjpPUEVSQU5EX0xBU1RfR0VORVJJQzsKKyAgfQorCisgIHVuc2lnbmVkIGdldEdlbmVyaWNUeXBlSW5kZXgoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzR2VuZXJpY1R5cGUoKSAmJiAibm9uLWdlbmVyaWMgdHlwZXMgZG9uJ3QgaGF2ZSBhbiBpbmRleCIpOworICAgIHJldHVybiBPcGVyYW5kVHlwZSAtIE1DT0k6Ok9QRVJBTkRfRklSU1RfR0VORVJJQzsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hY2hpbmUgSW5zdHJ1Y3Rpb24gRmxhZ3MgYW5kIERlc2NyaXB0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCituYW1lc3BhY2UgTUNJRCB7CisvLy8gXGJyaWVmIFRoZXNlIHNob3VsZCBiZSBjb25zaWRlcmVkIHByaXZhdGUgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQorLy8vIE1DSW5zdHJEZXNjIGNsYXNzLiAgQ2xpZW50cyBzaG91bGQgdXNlIHRoZSBwcmVkaWNhdGUgbWV0aG9kcyBvbiBNQ0luc3RyRGVzYywKKy8vLyBub3QgdXNlIHRoZXNlIGRpcmVjdGx5LiAgVGhlc2UgYWxsIGNvcnJlc3BvbmQgdG8gYml0ZmllbGRzIGluIHRoZQorLy8vIE1DSW5zdHJEZXNjOjpGbGFncyBmaWVsZC4KK2VudW0gRmxhZyB7CisgIFZhcmlhZGljID0gMCwKKyAgSGFzT3B0aW9uYWxEZWYsCisgIFBzZXVkbywKKyAgUmV0dXJuLAorICBDYWxsLAorICBCYXJyaWVyLAorICBUZXJtaW5hdG9yLAorICBCcmFuY2gsCisgIEluZGlyZWN0QnJhbmNoLAorICBDb21wYXJlLAorICBNb3ZlSW1tLAorICBCaXRjYXN0LAorICBTZWxlY3QsCisgIERlbGF5U2xvdCwKKyAgRm9sZGFibGVBc0xvYWQsCisgIE1heUxvYWQsCisgIE1heVN0b3JlLAorICBQcmVkaWNhYmxlLAorICBOb3REdXBsaWNhYmxlLAorICBVbm1vZGVsZWRTaWRlRWZmZWN0cywKKyAgQ29tbXV0YWJsZSwKKyAgQ29udmVydGlibGVUbzNBZGRyLAorICBVc2VzQ3VzdG9tSW5zZXJ0ZXIsCisgIEhhc1Bvc3RJU2VsSG9vaywKKyAgUmVtYXRlcmlhbGl6YWJsZSwKKyAgQ2hlYXBBc0FNb3ZlLAorICBFeHRyYVNyY1JlZ0FsbG9jUmVxLAorICBFeHRyYURlZlJlZ0FsbG9jUmVxLAorICBSZWdTZXF1ZW5jZSwKKyAgRXh0cmFjdFN1YnJlZywKKyAgSW5zZXJ0U3VicmVnLAorICBDb252ZXJnZW50LAorICBBZGQKK307Cit9CisKKy8vLyBcYnJpZWYgRGVzY3JpYmUgcHJvcGVydGllcyB0aGF0IGFyZSB0cnVlIG9mIGVhY2ggaW5zdHJ1Y3Rpb24gaW4gdGhlIHRhcmdldAorLy8vIGRlc2NyaXB0aW9uIGZpbGUuICBUaGlzIGNhcHR1cmVzIGluZm9ybWF0aW9uIGFib3V0IHNpZGUgZWZmZWN0cywgcmVnaXN0ZXIKKy8vLyB1c2UgYW5kIG1hbnkgb3RoZXIgdGhpbmdzLiAgVGhlcmUgaXMgb25lIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0IGZvciBlYWNoCisvLy8gdGFyZ2V0IGluc3RydWN0aW9uIGNsYXNzLCBhbmQgdGhlIE1hY2hpbmVJbnN0ciBjbGFzcyBwb2ludHMgdG8gdGhpcyBzdHJ1Y3QKKy8vLyBkaXJlY3RseSB0byBkZXNjcmliZSBpdHNlbGYuCitjbGFzcyBNQ0luc3RyRGVzYyB7CitwdWJsaWM6CisgIHVuc2lnbmVkIHNob3J0IE9wY29kZTsgICAgICAgICAvLyBUaGUgb3Bjb2RlIG51bWJlcgorICB1bnNpZ25lZCBzaG9ydCBOdW1PcGVyYW5kczsgICAgLy8gTnVtIG9mIGFyZ3MgKG1heSBiZSBtb3JlIGlmIHZhcmlhYmxlX29wcykKKyAgdW5zaWduZWQgY2hhciBOdW1EZWZzOyAgICAgICAgIC8vIE51bSBvZiBhcmdzIHRoYXQgYXJlIGRlZmluaXRpb25zCisgIHVuc2lnbmVkIGNoYXIgU2l6ZTsgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gZW5jb2RpbmcuCisgIHVuc2lnbmVkIHNob3J0IFNjaGVkQ2xhc3M7ICAgICAvLyBlbnVtIGlkZW50aWZ5aW5nIGluc3RyIHNjaGVkIGNsYXNzCisgIHVpbnQ2NF90IEZsYWdzOyAgICAgICAgICAgICAgICAvLyBGbGFncyBpZGVudGlmeWluZyBtYWNoaW5lIGluc3RyIGNsYXNzCisgIHVpbnQ2NF90IFRTRmxhZ3M7ICAgICAgICAgICAgICAvLyBUYXJnZXQgU3BlY2lmaWMgRmxhZyB2YWx1ZXMKKyAgY29uc3QgTUNQaHlzUmVnICpJbXBsaWNpdFVzZXM7IC8vIFJlZ2lzdGVycyBpbXBsaWNpdGx5IHJlYWQgYnkgdGhpcyBpbnN0cgorICBjb25zdCBNQ1BoeXNSZWcgKkltcGxpY2l0RGVmczsgLy8gUmVnaXN0ZXJzIGltcGxpY2l0bHkgZGVmaW5lZCBieSB0aGlzIGluc3RyCisgIGNvbnN0IE1DT3BlcmFuZEluZm8gKk9wSW5mbzsgICAvLyAnTnVtT3BlcmFuZHMnIGVudHJpZXMgYWJvdXQgb3BlcmFuZHMKKyAgLy8gU3VidGFyZ2V0IGZlYXR1cmUgdGhhdCB0aGlzIGlzIGRlcHJlY2F0ZWQgb24sIGlmIGFueQorICAvLyAtMSBpbXBsaWVzIHRoaXMgaXMgbm90IGRlcHJlY2F0ZWQgYnkgYW55IHNpbmdsZSBmZWF0dXJlLiBJdCBtYXkgc3RpbGwgYmUKKyAgLy8gZGVwcmVjYXRlZCBkdWUgdG8gYSAiY29tcGxleCIgcmVhc29uLCBiZWxvdy4KKyAgaW50NjRfdCBEZXByZWNhdGVkRmVhdHVyZTsKKworICAvLyBBIGNvbXBsZXggbWV0aG9kIHRvIGRldGVybWluZSBpcyBhIGNlcnRhaW4gaXMgZGVwcmVjYXRlZCBvciBub3QsIGFuZCByZXR1cm4KKyAgLy8gdGhlIHJlYXNvbiBmb3IgZGVwcmVjYXRpb24uCisgIGJvb2wgKCpDb21wbGV4RGVwcmVjYXRpb25JbmZvKShNQ0luc3QgJiwgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpYyBjb25zdHJhaW50IGlmCisgIC8vLyBpdCBpcyBzZXQuIFJldHVybnMgLTEgaWYgaXQgaXMgbm90IHNldC4KKyAgaW50IGdldE9wZXJhbmRDb25zdHJhaW50KHVuc2lnbmVkIE9wTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNPSTo6T3BlcmFuZENvbnN0cmFpbnQgQ29uc3RyYWludCkgY29uc3QgeworICAgIGlmIChPcE51bSA8IE51bU9wZXJhbmRzICYmCisgICAgICAgIChPcEluZm9bT3BOdW1dLkNvbnN0cmFpbnRzICYgKDEgPDwgQ29uc3RyYWludCkpKSB7CisgICAgICB1bnNpZ25lZCBQb3MgPSAxNiArIENvbnN0cmFpbnQgKiA0OworICAgICAgcmV0dXJuIChpbnQpKE9wSW5mb1tPcE51bV0uQ29uc3RyYWludHMgPj4gUG9zKSAmIDB4ZjsKKyAgICB9CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgYSBjZXJ0YWluIGluc3RydWN0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kIGlmIHNvCisgIC8vLyByZXR1cm5zIHRoZSByZWFzb24gaW4gXHAgSW5mby4KKyAgYm9vbCBnZXREZXByZWNhdGVkSW5mbyhNQ0luc3QgJk1JLCBjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmSW5mbykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG9wY29kZSBudW1iZXIgZm9yIHRoaXMgZGVzY3JpcHRvci4KKyAgdW5zaWduZWQgZ2V0T3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gT3Bjb2RlOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBkZWNsYXJlZCBNYWNoaW5lT3BlcmFuZHMgZm9yIHRoaXMKKyAgLy8vIE1hY2hpbmVJbnN0cnVjdGlvbi4gIE5vdGUgdGhhdCB2YXJpYWRpYyAoaXNWYXJpYWRpYygpIHJldHVybnMgdHJ1ZSkKKyAgLy8vIGluc3RydWN0aW9ucyBtYXkgaGF2ZSBhZGRpdGlvbmFsIG9wZXJhbmRzIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QsIGFuZCBub3RlCisgIC8vLyB0aGF0IHRoZSBtYWNoaW5lIGluc3RydWN0aW9uIG1heSBpbmNsdWRlIGltcGxpY2l0IHJlZ2lzdGVyIGRlZi91c2VzIGFzCisgIC8vLyB3ZWxsLgorICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgcmV0dXJuIE51bU9wZXJhbmRzOyB9CisKKyAgdXNpbmcgY29uc3Rfb3BJbmZvX2l0ZXJhdG9yID0gY29uc3QgTUNPcGVyYW5kSW5mbyAqOworCisgIGNvbnN0X29wSW5mb19pdGVyYXRvciBvcEluZm9fYmVnaW4oKSBjb25zdCB7IHJldHVybiBPcEluZm87IH0KKyAgY29uc3Rfb3BJbmZvX2l0ZXJhdG9yIG9wSW5mb19lbmQoKSBjb25zdCB7IHJldHVybiBPcEluZm8gKyBOdW1PcGVyYW5kczsgfQorCisgIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X29wSW5mb19pdGVyYXRvcj4gb3BlcmFuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2Uob3BJbmZvX2JlZ2luKCksIG9wSW5mb19lbmQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIE1hY2hpbmVPcGVyYW5kcyB0aGF0IGFyZSByZWdpc3RlcgorICAvLy8gZGVmaW5pdGlvbnMuICBSZWdpc3RlciBkZWZpbml0aW9ucyBhbHdheXMgb2NjdXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQorICAvLy8gbWFjaGluZSBvcGVyYW5kIGxpc3QuICBUaGlzIGlzIHRoZSBudW1iZXIgb2YgIm91dHMiIGluIHRoZSAudGQgZmlsZSwKKyAgLy8vIGFuZCBkb2VzIG5vdCBpbmNsdWRlIGltcGxpY2l0IGRlZnMuCisgIHVuc2lnbmVkIGdldE51bURlZnMoKSBjb25zdCB7IHJldHVybiBOdW1EZWZzOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gZmxhZ3Mgb2YgdGhpcyBpbnN0cnVjdGlvbi4KKyAgdWludDY0X3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBGbGFnczsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBjYW4gaGF2ZSBhIHZhcmlhYmxlIG51bWJlciBvZgorICAvLy8gb3BlcmFuZHMuICBJbiB0aGlzIGNhc2UsIHRoZSB2YXJpYWJsZSBvcGVyYW5kcyB3aWxsIGJlIGFmdGVyIHRoZSBub3JtYWwKKyAgLy8vIG9wZXJhbmRzIGJ1dCBiZWZvcmUgdGhlIGltcGxpY2l0IGRlZmluaXRpb25zIGFuZCB1c2VzIChpZiBhbnkgYXJlCisgIC8vLyBwcmVzZW50KS4KKyAgYm9vbCBpc1ZhcmlhZGljKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpWYXJpYWRpYyk7IH0KKworICAvLy8gXGJyaWVmIFNldCBpZiB0aGlzIGluc3RydWN0aW9uIGhhcyBhbiBvcHRpb25hbCBkZWZpbml0aW9uLCBlLmcuCisgIC8vLyBBUk0gaW5zdHJ1Y3Rpb25zIHdoaWNoIGNhbiBzZXQgY29uZGl0aW9uIGNvZGUgaWYgJ3MnIGJpdCBpcyBzZXQuCisgIGJvb2wgaGFzT3B0aW9uYWxEZWYoKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6Okhhc09wdGlvbmFsRGVmKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHBzZXVkbyBpbnN0cnVjdGlvbiB0aGF0IGRvZXNuJ3QKKyAgLy8vIGNvcnJlc3BvbmQgdG8gYSByZWFsIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uCisgIGJvb2wgaXNQc2V1ZG8oKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OlBzZXVkbyk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhIHJldHVybi4KKyAgYm9vbCBpc1JldHVybigpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6UmV0dXJuKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGFuIGFkZCBpbnN0cnVjdGlvbi4KKyAgYm9vbCBpc0FkZCgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6QWRkKTsgfQorCisgIC8vLyBcYnJpZWYgIFJldHVybiB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhIGNhbGwuCisgIGJvb2wgaXNDYWxsKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpDYWxsKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gc3RvcHMgY29udHJvbCBmbG93CisgIC8vLyBmcm9tIGV4ZWN1dGluZyB0aGUgaW5zdHJ1Y3Rpb24gaW1tZWRpYXRlbHkgZm9sbG93aW5nIGl0LiAgRXhhbXBsZXMgaW5jbHVkZQorICAvLy8gdW5jb25kaXRpb25hbCBicmFuY2hlcyBhbmQgcmV0dXJuIGluc3RydWN0aW9ucy4KKyAgYm9vbCBpc0JhcnJpZXIoKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OkJhcnJpZXIpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBwYXJ0IG9mIHRoZSB0ZXJtaW5hdG9yIGZvcgorICAvLy8gYSBiYXNpYyBibG9jay4gIFR5cGljYWxseSB0aGlzIGlzIHRoaW5ncyBsaWtlIHJldHVybiBhbmQgYnJhbmNoCisgIC8vLyBpbnN0cnVjdGlvbnMuCisgIC8vLworICAvLy8gVmFyaW91cyBwYXNzZXMgdXNlIHRoaXMgdG8gaW5zZXJ0IGNvZGUgaW50byB0aGUgYm90dG9tIG9mIGEgYmFzaWMgYmxvY2ssCisgIC8vLyBidXQgYmVmb3JlIGNvbnRyb2wgZmxvdyBvY2N1cnMuCisgIGJvb2wgaXNUZXJtaW5hdG9yKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpUZXJtaW5hdG9yKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBjb25kaXRpb25hbCwgdW5jb25kaXRpb25hbCwgb3IKKyAgLy8vIGluZGlyZWN0IGJyYW5jaC4gIFByZWRpY2F0ZXMgYmVsb3cgY2FuIGJlIHVzZWQgdG8gZGlzY3JpbWluYXRlIGJldHdlZW4KKyAgLy8vIHRoZXNlIGNhc2VzLCBhbmQgdGhlIFRhcmdldEluc3RySW5mbzo6QW5hbHl6ZUJyYW5jaCBtZXRob2QgY2FuIGJlIHVzZWQgdG8KKyAgLy8vIGdldCBtb3JlIGluZm9ybWF0aW9uLgorICBib29sIGlzQnJhbmNoKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpCcmFuY2gpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIGluZGlyZWN0IGJyYW5jaCwgc3VjaCBhcyBhCisgIC8vLyBicmFuY2ggdGhyb3VnaCBhIHJlZ2lzdGVyLgorICBib29sIGlzSW5kaXJlY3RCcmFuY2goKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OkluZGlyZWN0QnJhbmNoKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGJyYW5jaCB3aGljaCBtYXkgZmFsbAorICAvLy8gdGhyb3VnaCB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiBvciBtYXkgdHJhbnNmZXIgY29udHJvbCBmbG93IHRvIHNvbWUgb3RoZXIKKyAgLy8vIGJsb2NrLiAgVGhlIFRhcmdldEluc3RySW5mbzo6QW5hbHl6ZUJyYW5jaCBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZ2V0IG1vcmUKKyAgLy8vIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYnJhbmNoLgorICBib29sIGlzQ29uZGl0aW9uYWxCcmFuY2goKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQnJhbmNoKCkgJiAhaXNCYXJyaWVyKCkgJiAhaXNJbmRpcmVjdEJyYW5jaCgpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgYnJhbmNoIHdoaWNoIGFsd2F5cworICAvLy8gdHJhbnNmZXJzIGNvbnRyb2wgZmxvdyB0byBzb21lIG90aGVyIGJsb2NrLiAgVGhlCisgIC8vLyBUYXJnZXRJbnN0ckluZm86OkFuYWx5emVCcmFuY2ggbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGdldCBtb3JlIGluZm9ybWF0aW9uCisgIC8vLyBhYm91dCB0aGlzIGJyYW5jaC4KKyAgYm9vbCBpc1VuY29uZGl0aW9uYWxCcmFuY2goKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQnJhbmNoKCkgJiBpc0JhcnJpZXIoKSAmICFpc0luZGlyZWN0QnJhbmNoKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBicmFuY2ggb3IgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZGlyZWN0bHkKKyAgLy8vIHdyaXRlcyB0byB0aGUgcHJvZ3JhbSBjb3VudGVyLiBDb25zaWRlcmVkICdtYXknIGFmZmVjdCByYXRoZXIgdGhhbgorICAvLy8gJ2RvZXMnIGFmZmVjdCBhcyB0aGluZ3MgbGlrZSBwcmVkaWNhdGlvbiBhcmUgbm90IHRha2VuIGludG8gYWNjb3VudC4KKyAgYm9vbCBtYXlBZmZlY3RDb250cm9sRmxvdyhjb25zdCBNQ0luc3QgJk1JLCBjb25zdCBNQ1JlZ2lzdGVySW5mbyAmUkkpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBoYXMgYSBwcmVkaWNhdGUgb3BlcmFuZAorICAvLy8gdGhhdCBjb250cm9scyBleGVjdXRpb24uIEl0IG1heSBiZSBzZXQgdG8gJ2Fsd2F5cycsIG9yIG1heSBiZSBzZXQgdG8gb3RoZXIKKyAgLy8vIHZhbHVlcy4gVGhlcmUgYXJlIHZhcmlvdXMgbWV0aG9kcyBpbiBUYXJnZXRJbnN0ckluZm8gdGhhdCBjYW4gYmUgdXNlZCB0bworICAvLy8gY29udHJvbCBhbmQgbW9kaWZ5IHRoZSBwcmVkaWNhdGUgaW4gdGhpcyBpbnN0cnVjdGlvbi4KKyAgYm9vbCBpc1ByZWRpY2FibGUoKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OlByZWRpY2FibGUpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGlzIGEgY29tcGFyaXNvbi4KKyAgYm9vbCBpc0NvbXBhcmUoKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OkNvbXBhcmUpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGlzIGEgbW92ZSBpbW1lZGlhdGUKKyAgLy8vIChpbmNsdWRpbmcgY29uZGl0aW9uYWwgbW92ZXMpIGluc3RydWN0aW9uLgorICBib29sIGlzTW92ZUltbWVkaWF0ZSgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6TW92ZUltbSk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgYSBiaXRjYXN0IGluc3RydWN0aW9uLgorICBib29sIGlzQml0Y2FzdCgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6Qml0Y2FzdCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBzZWxlY3QgaW5zdHJ1Y3Rpb24uCisgIGJvb2wgaXNTZWxlY3QoKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OlNlbGVjdCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gY2Fubm90IGJlIHNhZmVseQorICAvLy8gZHVwbGljYXRlZC4gIEZvciBleGFtcGxlLCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGEgdW5pcXVlIGxhYmVscyBhdHRhY2hlZAorICAvLy8gdG8gaXQsIGR1cGxpY2F0aW5nIGl0IHdvdWxkIGNhdXNlIG11bHRpcGxlIGRlZmluaXRpb24gZXJyb3JzLgorICBib29sIGlzTm90RHVwbGljYWJsZSgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6Tm90RHVwbGljYWJsZSk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIGhhcyBhIGRlbGF5IHNsb3Qgd2hpY2gKKyAgLy8vIG11c3QgYmUgZmlsbGVkIGJ5IHRoZSBjb2RlIGdlbmVyYXRvci4KKyAgYm9vbCBoYXNEZWxheVNsb3QoKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OkRlbGF5U2xvdCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGZvciBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gYmUgZm9sZGVkIGFzIG1lbW9yeSBvcGVyYW5kcworICAvLy8gaW4gb3RoZXIgaW5zdHJ1Y3Rpb25zLiBUaGUgbW9zdCBjb21tb24gdXNlIGZvciB0aGlzIGlzIGluc3RydWN0aW9ucyB0aGF0CisgIC8vLyBhcmUgc2ltcGxlIGxvYWRzIGZyb20gbWVtb3J5IHRoYXQgZG9uJ3QgbW9kaWZ5IHRoZSBsb2FkZWQgdmFsdWUgaW4gYW55CisgIC8vLyB3YXksIGJ1dCBpdCBjYW4gYWxzbyBiZSB1c2VkIGZvciBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gYmUgZXhwcmVzc2VkIGFzCisgIC8vLyBjb25zdGFudC1wb29sIGxvYWRzLCBzdWNoIGFzIFZfU0VUQUxMT05FUyBvbiB4ODYsIHRvIGFsbG93IHRoZW0gdG8gYmUKKyAgLy8vIGZvbGRlZCB3aGVuIGl0IGlzIGJlbmVmaWNpYWwuICBUaGlzIHNob3VsZCBvbmx5IGJlIHNldCBvbiBpbnN0cnVjdGlvbnMKKyAgLy8vIHRoYXQgcmV0dXJuIGEgdmFsdWUgaW4gdGhlaXIgb25seSB2aXJ0dWFsIHJlZ2lzdGVyIGRlZmluaXRpb24uCisgIGJvb2wgY2FuRm9sZEFzTG9hZCgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6Rm9sZGFibGVBc0xvYWQpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGJlaGF2ZXMKKyAgLy8vIHRoZSBzYW1lIHdheSBhcyB0aGUgZ2VuZXJpYyBSRUdfU0VRVUVOQ0UgaW5zdHJ1Y3Rpb25zLgorICAvLy8gRS5nLiwgb24gQVJNLAorICAvLy8gZFggVk1PVkRSUiByWSwgcloKKyAgLy8vIGlzIGVxdWl2YWxlbnQgdG8KKyAgLy8vIGRYID0gUkVHX1NFUVVFTkNFIHJZLCBzc3ViXzAsIHJaLCBzc3ViXzEuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IGZvciB0aGUgb3B0aW1pemVycyB0byBiZSBhYmxlIHRvIHRha2UgYWR2YW50YWdlIG9mCisgIC8vLyB0aGlzIHByb3BlcnR5LCBUYXJnZXRJbnN0ckluZm86OmdldFJlZ1NlcXVlbmNlTGlrZUlucHV0cyBoYXMgdG8gYmUKKyAgLy8vIG92ZXJyaWRlIGFjY29yZGluZ2x5LgorICBib29sIGlzUmVnU2VxdWVuY2VMaWtlKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpSZWdTZXF1ZW5jZSk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gYmVoYXZlcworICAvLy8gdGhlIHNhbWUgd2F5IGFzIHRoZSBnZW5lcmljIEVYVFJBQ1RfU1VCUkVHIGluc3RydWN0aW9ucy4KKyAgLy8vIEUuZy4sIG9uIEFSTSwKKyAgLy8vIHJYLCByWSBWTU9WUlJEIGRaCisgIC8vLyBpcyBlcXVpdmFsZW50IHRvIHR3byBFWFRSQUNUX1NVQlJFRzoKKyAgLy8vIHJYID0gRVhUUkFDVF9TVUJSRUcgZFosIHNzdWJfMAorICAvLy8gclkgPSBFWFRSQUNUX1NVQlJFRyBkWiwgc3N1Yl8xCisgIC8vLworICAvLy8gTm90ZSB0aGF0IGZvciB0aGUgb3B0aW1pemVycyB0byBiZSBhYmxlIHRvIHRha2UgYWR2YW50YWdlIG9mCisgIC8vLyB0aGlzIHByb3BlcnR5LCBUYXJnZXRJbnN0ckluZm86OmdldEV4dHJhY3RTdWJyZWdMaWtlSW5wdXRzIGhhcyB0byBiZQorICAvLy8gb3ZlcnJpZGUgYWNjb3JkaW5nbHkuCisgIGJvb2wgaXNFeHRyYWN0U3VicmVnTGlrZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpFeHRyYWN0U3VicmVnKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBiZWhhdmVzCisgIC8vLyB0aGUgc2FtZSB3YXkgYXMgdGhlIGdlbmVyaWMgSU5TRVJUX1NVQlJFRyBpbnN0cnVjdGlvbnMuCisgIC8vLyBFLmcuLCBvbiBBUk0sCisgIC8vLyBkWCA9IFZTRVRMTmkzMiBkWSwgclosIEltbQorICAvLy8gaXMgZXF1aXZhbGVudCB0byBhIElOU0VSVF9TVUJSRUc6CisgIC8vLyBkWCA9IElOU0VSVF9TVUJSRUcgZFksIHJaLCB0cmFuc2xhdGVJbW1Ub1N1YklkeChJbW0pCisgIC8vLworICAvLy8gTm90ZSB0aGF0IGZvciB0aGUgb3B0aW1pemVycyB0byBiZSBhYmxlIHRvIHRha2UgYWR2YW50YWdlIG9mCisgIC8vLyB0aGlzIHByb3BlcnR5LCBUYXJnZXRJbnN0ckluZm86OmdldEluc2VydFN1YnJlZ0xpa2VJbnB1dHMgaGFzIHRvIGJlCisgIC8vLyBvdmVycmlkZSBhY2NvcmRpbmdseS4KKyAgYm9vbCBpc0luc2VydFN1YnJlZ0xpa2UoKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6Okluc2VydFN1YnJlZyk7IH0KKworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBjb252ZXJnZW50LgorICAvLy8KKyAgLy8vIENvbnZlcmdlbnQgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgbWFkZSBjb250cm9sLWRlcGVuZGVudCBvbiBhbnkKKyAgLy8vIGFkZGl0aW9uYWwgdmFsdWVzLgorICBib29sIGlzQ29udmVyZ2VudCgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6Q29udmVyZ2VudCk7IH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gU2lkZSBFZmZlY3QgQW5hbHlzaXMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGNvdWxkIHBvc3NpYmx5IHJlYWQgbWVtb3J5LgorICAvLy8gSW5zdHJ1Y3Rpb25zIHdpdGggdGhpcyBmbGFnIHNldCBhcmUgbm90IG5lY2Vzc2FyaWx5IHNpbXBsZSBsb2FkCisgIC8vLyBpbnN0cnVjdGlvbnMsIHRoZXkgbWF5IGxvYWQgYSB2YWx1ZSBhbmQgbW9kaWZ5IGl0LCBmb3IgZXhhbXBsZS4KKyAgYm9vbCBtYXlMb2FkKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpNYXlMb2FkKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBjb3VsZCBwb3NzaWJseSBtb2RpZnkgbWVtb3J5LgorICAvLy8gSW5zdHJ1Y3Rpb25zIHdpdGggdGhpcyBmbGFnIHNldCBhcmUgbm90IG5lY2Vzc2FyaWx5IHNpbXBsZSBzdG9yZQorICAvLy8gaW5zdHJ1Y3Rpb25zLCB0aGV5IG1heSBzdG9yZSBhIG1vZGlmaWVkIHZhbHVlIGJhc2VkIG9uIHRoZWlyIG9wZXJhbmRzLCBvcgorICAvLy8gbWF5IG5vdCBhY3R1YWxseSBtb2RpZnkgYW55dGhpbmcsIGZvciBleGFtcGxlLgorICBib29sIG1heVN0b3JlKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpNYXlTdG9yZSk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIHNpZGUKKyAgLy8vIGVmZmVjdHMgdGhhdCBhcmUgbm90IG1vZGVsZWQgYnkgb3RoZXIgZmxhZ3MuICBUaGlzIGRvZXMgbm90IHJldHVybiB0cnVlCisgIC8vLyBmb3IgaW5zdHJ1Y3Rpb25zIHdob3NlIGVmZmVjdHMgYXJlIGNhcHR1cmVkIGJ5OgorICAvLy8KKyAgLy8vICAxLiBUaGVpciBvcGVyYW5kIGxpc3QgYW5kIGltcGxpY2l0IGRlZmluaXRpb24vdXNlIGxpc3QuICBSZWdpc3RlciB1c2UvZGVmCisgIC8vLyAgICAgaW5mbyBpcyBleHBsaWNpdCBmb3IgaW5zdHJ1Y3Rpb25zLgorICAvLy8gIDIuIE1lbW9yeSBhY2Nlc3Nlcy4gIFVzZSBtYXlMb2FkL21heVN0b3JlLgorICAvLy8gIDMuIENhbGxpbmcsIGJyYW5jaGluZywgcmV0dXJuaW5nOiB1c2UgaXNDYWxsL2lzUmV0dXJuL2lzQnJhbmNoLgorICAvLy8KKyAgLy8vIEV4YW1wbGVzIG9mIHNpZGUgZWZmZWN0cyB3b3VsZCBiZSBtb2RpZnlpbmcgJ2ludmlzaWJsZScgbWFjaGluZSBzdGF0ZSBsaWtlCisgIC8vLyBhIGNvbnRyb2wgcmVnaXN0ZXIsIGZsdXNoaW5nIGEgY2FjaGUsIG1vZGlmeWluZyBhIHJlZ2lzdGVyIGludmlzaWJsZSB0bworICAvLy8gTExWTSwgZXRjLgorICBib29sIGhhc1VubW9kZWxlZFNpZGVFZmZlY3RzKCkgY29uc3QgeworICAgIHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OlVubW9kZWxlZFNpZGVFZmZlY3RzKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBGbGFncyB0aGF0IGluZGljYXRlIHdoZXRoZXIgYW4gaW5zdHJ1Y3Rpb24gY2FuIGJlIG1vZGlmaWVkIGJ5IGEgbWV0aG9kLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgbWF5IGJlIGEgMi0gb3IgMy1hZGRyZXNzIGluc3RydWN0aW9uIChvZiB0aGUKKyAgLy8vIGZvcm0gIlggPSBvcCBZLCBaLCAuLi4iKSwgd2hpY2ggcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0IGlmIFkgYW5kIFogYXJlCisgIC8vLyBleGNoYW5nZWQuICBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIHRoZQorICAvLy8gVGFyZ2V0SW5zdHJJbmZvOjpjb21tdXRlSW5zdHJ1Y3Rpb24gbWV0aG9kIG1heSBiZSB1c2VkIHRvIGhhY2sgb24gdGhlCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBmbGFnIG1heSBiZSBzZXQgb24gaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIG9ubHkgY29tbXV0YWJsZQorICAvLy8gc29tZXRpbWVzLiAgSW4gdGhlc2UgY2FzZXMsIHRoZSBjYWxsIHRvIGNvbW11dGVJbnN0cnVjdGlvbiB3aWxsIGZhaWwuCisgIC8vLyBBbHNvIG5vdGUgdGhhdCBzb21lIGluc3RydWN0aW9ucyByZXF1aXJlIG5vbi10cml2aWFsIG1vZGlmaWNhdGlvbiB0bworICAvLy8gY29tbXV0ZSB0aGVtLgorICBib29sIGlzQ29tbXV0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6Q29tbXV0YWJsZSk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSAyLWFkZHJlc3MgaW5zdHJ1Y3Rpb24gd2hpY2ggY2FuIGJlIGNoYW5nZWQKKyAgLy8vIGludG8gYSAzLWFkZHJlc3MgaW5zdHJ1Y3Rpb24gaWYgbmVlZGVkLiAgRG9pbmcgdGhpcyB0cmFuc2Zvcm1hdGlvbiBjYW4gYmUKKyAgLy8vIHByb2ZpdGFibGUgaW4gdGhlIHJlZ2lzdGVyIGFsbG9jYXRvciwgYmVjYXVzZSBpdCBtZWFucyB0aGF0IHRoZQorICAvLy8gaW5zdHJ1Y3Rpb24gY2FuIHVzZSBhIDItYWRkcmVzcyBmb3JtIGlmIHBvc3NpYmxlLCBidXQgZGVncmFkZSBpbnRvIGEgbGVzcworICAvLy8gZWZmaWNpZW50IGZvcm0gaWYgdGhlIHNvdXJjZSBhbmQgZGVzdCByZWdpc3RlciBjYW5ub3QgYmUgYXNzaWduZWQgdG8gdGhlCisgIC8vLyBzYW1lIHJlZ2lzdGVyLiAgRm9yIGV4YW1wbGUsIHRoaXMgYWxsb3dzIHRoZSB4ODYgYmFja2VuZCB0byB0dXJuIGEgInNobAorICAvLy8gcmVnLCAzIiBpbnN0cnVjdGlvbiBpbnRvIGFuIExFQSBpbnN0cnVjdGlvbiwgd2hpY2ggaXMgdGhlIHNhbWUgc3BlZWQgYXMKKyAgLy8vIHRoZSBzaGlmdCBidXQgaGFzIGJpZ2dlciBjb2RlIHNpemUuCisgIC8vLworICAvLy8gSWYgdGhpcyByZXR1cm5zIHRydWUsIHRoZW4gdGhlIHRhcmdldCBtdXN0IGltcGxlbWVudCB0aGUKKyAgLy8vIFRhcmdldEluc3RySW5mbzo6Y29udmVydFRvVGhyZWVBZGRyZXNzIG1ldGhvZCBmb3IgdGhpcyBpbnN0cnVjdGlvbiwgd2hpY2gKKyAgLy8vIGlzIGFsbG93ZWQgdG8gZmFpbCBpZiB0aGUgdHJhbnNmb3JtYXRpb24gaXNuJ3QgdmFsaWQgZm9yIHRoaXMgc3BlY2lmaWMKKyAgLy8vIGluc3RydWN0aW9uIChlLmcuIHNobCByZWcsIDQgb24geDg2KS4KKyAgLy8vCisgIGJvb2wgaXNDb252ZXJ0aWJsZVRvM0FkZHIoKSBjb25zdCB7CisgICAgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6Q29udmVydGlibGVUbzNBZGRyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiByZXF1aXJlcyBjdXN0b20gaW5zZXJ0aW9uIHN1cHBvcnQKKyAgLy8vIHdoZW4gdGhlIERBRyBzY2hlZHVsZXIgaXMgaW5zZXJ0aW5nIGl0IGludG8gYSBtYWNoaW5lIGJhc2ljIGJsb2NrLiAgSWYKKyAgLy8vIHRoaXMgaXMgdHJ1ZSBmb3IgdGhlIGluc3RydWN0aW9uLCBpdCBiYXNpY2FsbHkgbWVhbnMgdGhhdCBpdCBpcyBhIHBzZXVkbworICAvLy8gaW5zdHJ1Y3Rpb24gdXNlZCBhdCBTZWxlY3Rpb25EQUcgdGltZSB0aGF0IGlzIGV4cGFuZGVkIG91dCBpbnRvIG1hZ2ljIGNvZGUKKyAgLy8vIGJ5IHRoZSB0YXJnZXQgd2hlbiBNYWNoaW5lSW5zdHJzIGFyZSBmb3JtZWQuCisgIC8vLworICAvLy8gSWYgdGhpcyBpcyB0cnVlLCB0aGUgVGFyZ2V0TG93ZXJpbmdJbmZvOjpJbnNlcnRBdEVuZE9mQmFzaWNCbG9jayBtZXRob2QKKyAgLy8vIGlzIHVzZWQgdG8gaW5zZXJ0IHRoaXMgaW50byB0aGUgTWFjaGluZUJhc2ljQmxvY2suCisgIGJvb2wgdXNlc0N1c3RvbUluc2VydGlvbkhvb2soKSBjb25zdCB7CisgICAgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6VXNlc0N1c3RvbUluc2VydGVyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiByZXF1aXJlcyAqYWRqdXN0bWVudCogYWZ0ZXIKKyAgLy8vIGluc3RydWN0aW9uIHNlbGVjdGlvbiBieSBjYWxsaW5nIGEgdGFyZ2V0IGhvb2suIEZvciBleGFtcGxlLCB0aGlzIGNhbiBiZQorICAvLy8gdXNlZCB0byBmaWxsIGluIEFSTSAncycgb3B0aW9uYWwgb3BlcmFuZCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUKKyAgLy8vIGNvbmRpdGlvbmFsIGZsYWcgcmVnaXN0ZXIgaXMgdXNlZC4KKyAgYm9vbCBoYXNQb3N0SVNlbEhvb2soKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6Okhhc1Bvc3RJU2VsSG9vayk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGlzIGEgY2FuZGlkYXRlIGZvciByZW1hdC4gVGhpcworICAvLy8gZmxhZyBpcyBvbmx5IHVzZWQgaW4gVGFyZ2V0SW5zdHJJbmZvIG1ldGhvZCBpc1RyaXZpYWxseVJlbWF0ZXJpYWxpemFibGUuCisgIC8vLworICAvLy8gSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlIGlzUmVhbGx5VHJpdmlhbGx5UmVNYXRlcmlhbGl6YWJsZSgpCisgIC8vLyBvciBpc1JlYWxseVRyaXZpYWxseVJlTWF0ZXJpYWxpemFibGVHZW5lcmljIG1ldGhvZHMgYXJlIGNhbGxlZCB0byB2ZXJpZnkKKyAgLy8vIHRoZSBpbnN0cnVjdGlvbiBpcyByZWFsbHkgcmVtYXRhYmxlLgorICBib29sIGlzUmVtYXRlcmlhbGl6YWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpSZW1hdGVyaWFsaXphYmxlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIHRoZSBzYW1lIGNvc3QgKG9yIGxlc3MpIHRoYW4gYQorICAvLy8gbW92ZSBpbnN0cnVjdGlvbi4gVGhpcyBpcyB1c2VmdWwgZHVyaW5nIGNlcnRhaW4gdHlwZXMgb2Ygb3B0aW1pemF0aW9ucworICAvLy8gKGUuZy4sIHJlbWF0IGR1cmluZyB0d28tYWRkcmVzcyBjb252ZXJzaW9uIG9yIG1hY2hpbmUgbGljbSkgd2hlcmUgd2Ugd291bGQKKyAgLy8vIGxpa2UgdG8gcmVtYXQgb3IgaG9pc3QgdGhlIGluc3RydWN0aW9uLCBidXQgbm90IGlmIGl0IGNvc3RzIG1vcmUgdGhhbgorICAvLy8gbW92aW5nIHRoZSBpbnN0cnVjdGlvbiBpbnRvIHRoZSBhcHByb3ByaWF0ZSByZWdpc3Rlci4gTm90ZSwgd2UgYXJlIG5vdAorICAvLy8gbWFya2luZyBjb3BpZXMgZnJvbSBhbmQgdG8gdGhlIHNhbWUgcmVnaXN0ZXIgY2xhc3Mgd2l0aCB0aGlzIGZsYWcuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgY291bGQgYmUgY2FsbGVkIGJ5IGludGVyZmFjZSBUYXJnZXRJbnN0ckluZm86OmlzQXNDaGVhcEFzQU1vdmUKKyAgLy8vIGZvciBkaWZmZXJlbnQgc3VidGFyZ2V0cy4KKyAgYm9vbCBpc0FzQ2hlYXBBc0FNb3ZlKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpDaGVhcEFzQU1vdmUpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBzb3VyY2Ugb3BlcmFuZHMgaGF2ZSBzcGVjaWFsCisgIC8vLyByZWdpc3RlciBhbGxvY2F0aW9uIHJlcXVpcmVtZW50cyB0aGF0IGFyZSBub3QgY2FwdHVyZWQgYnkgdGhlIG9wZXJhbmQKKyAgLy8vIHJlZ2lzdGVyIGNsYXNzZXMuIGUuZy4gQVJNOjpTVFJEJ3MgdHdvIHNvdXJjZSByZWdpc3RlcnMgbXVzdCBiZSBhbiBldmVuIC8KKyAgLy8vIG9kZCBwYWlyLCBBUk06OlNUTSByZWdpc3RlcnMgaGF2ZSB0byBiZSBpbiBhc2NlbmRpbmcgb3JkZXIuICBQb3N0LXJlZ2lzdGVyCisgIC8vLyBhbGxvY2F0aW9uIHBhc3NlcyBzaG91bGQgbm90IGF0dGVtcHQgdG8gY2hhbmdlIGFsbG9jYXRpb25zIGZvciBzb3VyY2VzIG9mCisgIC8vLyBpbnN0cnVjdGlvbnMgd2l0aCB0aGlzIGZsYWcuCisgIGJvb2wgaGFzRXh0cmFTcmNSZWdBbGxvY1JlcSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpFeHRyYVNyY1JlZ0FsbG9jUmVxKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gZGVmIG9wZXJhbmRzIGhhdmUgc3BlY2lhbCByZWdpc3RlcgorICAvLy8gYWxsb2NhdGlvbiByZXF1aXJlbWVudHMgdGhhdCBhcmUgbm90IGNhcHR1cmVkIGJ5IHRoZSBvcGVyYW5kIHJlZ2lzdGVyCisgIC8vLyBjbGFzc2VzLiBlLmcuIEFSTTo6TERSRCdzIHR3byBkZWYgcmVnaXN0ZXJzIG11c3QgYmUgYW4gZXZlbiAvIG9kZCBwYWlyLAorICAvLy8gQVJNOjpMRE0gcmVnaXN0ZXJzIGhhdmUgdG8gYmUgaW4gYXNjZW5kaW5nIG9yZGVyLiAgUG9zdC1yZWdpc3RlcgorICAvLy8gYWxsb2NhdGlvbiBwYXNzZXMgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGNoYW5nZSBhbGxvY2F0aW9ucyBmb3IgZGVmaW5pdGlvbnMKKyAgLy8vIG9mIGluc3RydWN0aW9ucyB3aXRoIHRoaXMgZmxhZy4KKyAgYm9vbCBoYXNFeHRyYURlZlJlZ0FsbG9jUmVxKCkgY29uc3QgeworICAgIHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OkV4dHJhRGVmUmVnQWxsb2NSZXEpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSBsaXN0IG9mIHJlZ2lzdGVycyB0aGF0IGFyZSBwb3RlbnRpYWxseSByZWFkIGJ5IGFueQorICAvLy8gaW5zdGFuY2Ugb2YgdGhpcyBtYWNoaW5lIGluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGUsIG9uIFg4NiwgdGhlICJhZGMiCisgIC8vLyBpbnN0cnVjdGlvbiBhZGRzIHR3byByZWdpc3RlciBvcGVyYW5kcyBhbmQgYWRkcyB0aGUgY2FycnkgYml0IGluIGZyb20gdGhlCisgIC8vLyBmbGFncyByZWdpc3Rlci4gIEluIHRoaXMgY2FzZSwgdGhlIGluc3RydWN0aW9uIGlzIG1hcmtlZCBhcyBpbXBsaWNpdGx5CisgIC8vLyByZWFkaW5nIHRoZSBmbGFncy4gIExpa2V3aXNlLCB0aGUgdmFyaWFibGUgc2hpZnQgaW5zdHJ1Y3Rpb24gb24gWDg2IGlzCisgIC8vLyBtYXJrZWQgYXMgaW1wbGljaXRseSByZWFkaW5nIHRoZSAnQ0wnIHJlZ2lzdGVyLCB3aGljaCBpdCBhbHdheXMgZG9lcy4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIG51bGwgaWYgdGhlIGluc3RydWN0aW9uIGhhcyBubyBpbXBsaWNpdCB1c2VzLgorICBjb25zdCBNQ1BoeXNSZWcgKmdldEltcGxpY2l0VXNlcygpIGNvbnN0IHsgcmV0dXJuIEltcGxpY2l0VXNlczsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgaW1wbGljaXQgdXNlcyB0aGlzIGluc3RydWN0aW9uIGhhcy4KKyAgdW5zaWduZWQgZ2V0TnVtSW1wbGljaXRVc2VzKCkgY29uc3QgeworICAgIGlmICghSW1wbGljaXRVc2VzKQorICAgICAgcmV0dXJuIDA7CisgICAgdW5zaWduZWQgaSA9IDA7CisgICAgZm9yICg7IEltcGxpY2l0VXNlc1tpXTsgKytpKSAvKmVtcHR5Ki8KKyAgICAgIDsKKyAgICByZXR1cm4gaTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgbGlzdCBvZiByZWdpc3RlcnMgdGhhdCBhcmUgcG90ZW50aWFsbHkgd3JpdHRlbiBieSBhbnkKKyAgLy8vIGluc3RhbmNlIG9mIHRoaXMgbWFjaGluZSBpbnN0cnVjdGlvbi4gIEZvciBleGFtcGxlLCBvbiBYODYsIG1hbnkKKyAgLy8vIGluc3RydWN0aW9ucyBpbXBsaWNpdGx5IHNldCB0aGUgZmxhZ3MgcmVnaXN0ZXIuICBJbiB0aGlzIGNhc2UsIHRoZXkgYXJlCisgIC8vLyBtYXJrZWQgYXMgc2V0dGluZyB0aGUgRkxBR1MuICBMaWtld2lzZSwgbWFueSBpbnN0cnVjdGlvbnMgYWx3YXlzIGRlcG9zaXQKKyAgLy8vIHRoZWlyIHJlc3VsdCBpbiBhIHBoeXNpY2FsIHJlZ2lzdGVyLiAgRm9yIGV4YW1wbGUsIHRoZSBYODYgZGl2aWRlCisgIC8vLyBpbnN0cnVjdGlvbiBhbHdheXMgZGVwb3NpdHMgdGhlIHF1b3RpZW50IGFuZCByZW1haW5kZXIgaW4gdGhlIEVBWC9FRFgKKyAgLy8vIHJlZ2lzdGVycy4gIEZvciB0aGF0IGluc3RydWN0aW9uLCB0aGlzIHdpbGwgcmV0dXJuIGEgbGlzdCBjb250YWluaW5nIHRoZQorICAvLy8gRUFYL0VEWC9FRkxBR1MgcmVnaXN0ZXJzLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIG5vIGltcGxpY2l0IGRlZnMuCisgIGNvbnN0IE1DUGh5c1JlZyAqZ2V0SW1wbGljaXREZWZzKCkgY29uc3QgeyByZXR1cm4gSW1wbGljaXREZWZzOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBpbXBsaWNpdCBkZWZzIHRoaXMgaW5zdHJ1Y3QgaGFzLgorICB1bnNpZ25lZCBnZXROdW1JbXBsaWNpdERlZnMoKSBjb25zdCB7CisgICAgaWYgKCFJbXBsaWNpdERlZnMpCisgICAgICByZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBpID0gMDsKKyAgICBmb3IgKDsgSW1wbGljaXREZWZzW2ldOyArK2kpIC8qZW1wdHkqLworICAgICAgOworICAgIHJldHVybiBpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGltcGxpY2l0bHkKKyAgLy8vIHVzZXMgdGhlIHNwZWNpZmllZCBwaHlzaWNhbCByZWdpc3Rlci4KKyAgYm9vbCBoYXNJbXBsaWNpdFVzZU9mUGh5c1JlZyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICBpZiAoY29uc3QgTUNQaHlzUmVnICpJbXBVc2VzID0gSW1wbGljaXRVc2VzKQorICAgICAgZm9yICg7ICpJbXBVc2VzOyArK0ltcFVzZXMpCisgICAgICAgIGlmICgqSW1wVXNlcyA9PSBSZWcpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGltcGxpY2l0bHkKKyAgLy8vIGRlZmluZXMgdGhlIHNwZWNpZmllZCBwaHlzaWNhbCByZWdpc3Rlci4KKyAgYm9vbCBoYXNJbXBsaWNpdERlZk9mUGh5c1JlZyh1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNSZWdpc3RlckluZm8gKk1SSSA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzY2hlZHVsaW5nIGNsYXNzIGZvciB0aGlzIGluc3RydWN0aW9uLiAgVGhlCisgIC8vLyBzY2hlZHVsaW5nIGNsYXNzIGlzIGFuIGluZGV4IGludG8gdGhlIEluc3RySXRpbmVyYXJ5RGF0YSB0YWJsZS4gIFRoaXMKKyAgLy8vIHJldHVybnMgemVybyBpZiB0aGVyZSBpcyBubyBrbm93biBzY2hlZHVsaW5nIGluZm9ybWF0aW9uIGZvciB0aGUKKyAgLy8vIGluc3RydWN0aW9uLgorICB1bnNpZ25lZCBnZXRTY2hlZENsYXNzKCkgY29uc3QgeyByZXR1cm4gU2NoZWRDbGFzczsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGVuY29kaW5nIG9mIHRoaXMgaW5zdHJ1Y3Rpb24sCisgIC8vLyBvciB6ZXJvIGlmIHRoZSBlbmNvZGluZyBzaXplIGNhbm5vdCBiZSBrbm93biBmcm9tIHRoZSBvcGNvZGUuCisgIHVuc2lnbmVkIGdldFNpemUoKSBjb25zdCB7IHJldHVybiBTaXplOyB9CisKKyAgLy8vIFxicmllZiBGaW5kIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb3BlcmFuZCBpbiB0aGUKKyAgLy8vIG9wZXJhbmQgbGlzdCB0aGF0IGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwcmVkaWNhdGUuIEl0IHJldHVybnMgLTEgaWYKKyAgLy8vIG5vbmUgaXMgZm91bmQuCisgIGludCBmaW5kRmlyc3RQcmVkT3BlcmFuZElkeCgpIGNvbnN0IHsKKyAgICBpZiAoaXNQcmVkaWNhYmxlKCkpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgaWYgKE9wSW5mb1tpXS5pc1ByZWRpY2F0ZSgpKQorICAgICAgICAgIHJldHVybiBpOworICAgIH0KKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gZGVmaW5lcyB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsCisgIC8vLyByZWdpc3RlciwgZWl0aGVyIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseS4KKyAgYm9vbCBoYXNEZWZPZlBoeXNSZWcoY29uc3QgTUNJbnN0ICZNSSwgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1JlZ2lzdGVySW5mbyAmUkkpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DSW5zdHJJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DSW5zdHJJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBmMWYzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNJbnN0ckluZm8uaApAQCAtMCwwICsxLDU5IEBACisvLz09PS0tIGxsdm0vTUMvTUNJbnN0ckluZm8uaCAtIFRhcmdldCBJbnN0cnVjdGlvbiBJbmZvIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHRhcmdldCBtYWNoaW5lIGluc3RydWN0aW9uIHNldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNJTlNUUklORk9fSAorI2RlZmluZSBMTFZNX01DX01DSU5TVFJJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0ckRlc2MuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gXGJyaWVmIEludGVyZmFjZSB0byBkZXNjcmlwdGlvbiBvZiBtYWNoaW5lIGluc3RydWN0aW9uIHNldC4KK2NsYXNzIE1DSW5zdHJJbmZvIHsKKyAgY29uc3QgTUNJbnN0ckRlc2MgKkRlc2M7ICAgICAgICAgIC8vIFJhdyBhcnJheSB0byBhbGxvdyBzdGF0aWMgaW5pdCduCisgIGNvbnN0IHVuc2lnbmVkICpJbnN0ck5hbWVJbmRpY2VzOyAvLyBBcnJheSBmb3IgbmFtZSBpbmRpY2VzIGluIEluc3RyTmFtZURhdGEKKyAgY29uc3QgY2hhciAqSW5zdHJOYW1lRGF0YTsgICAgICAgIC8vIEluc3RydWN0aW9uIG5hbWUgc3RyaW5nIHBvb2wKKyAgdW5zaWduZWQgTnVtT3Bjb2RlczsgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBkZXNjIGFycmF5CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBJbml0aWFsaXplIE1DSW5zdHJJbmZvLCBjYWxsZWQgYnkgVGFibGVHZW4gYXV0by1nZW5lcmF0ZWQgcm91dGluZXMuCisgIC8vLyAqRE8gTk9UIFVTRSouCisgIHZvaWQgSW5pdE1DSW5zdHJJbmZvKGNvbnN0IE1DSW5zdHJEZXNjICpELCBjb25zdCB1bnNpZ25lZCAqTkksIGNvbnN0IGNoYXIgKk5ELAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOTykgeworICAgIERlc2MgPSBEOworICAgIEluc3RyTmFtZUluZGljZXMgPSBOSTsKKyAgICBJbnN0ck5hbWVEYXRhID0gTkQ7CisgICAgTnVtT3Bjb2RlcyA9IE5POworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtT3Bjb2RlcygpIGNvbnN0IHsgcmV0dXJuIE51bU9wY29kZXM7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbWFjaGluZSBpbnN0cnVjdGlvbiBkZXNjcmlwdG9yIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCisgIC8vLyBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgorICBjb25zdCBNQ0luc3RyRGVzYyAmZ2V0KHVuc2lnbmVkIE9wY29kZSkgY29uc3QgeworICAgIGFzc2VydChPcGNvZGUgPCBOdW1PcGNvZGVzICYmICJJbnZhbGlkIG9wY29kZSEiKTsKKyAgICByZXR1cm4gRGVzY1tPcGNvZGVdOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBuYW1lIGZvciB0aGUgaW5zdHJ1Y3Rpb25zIHdpdGggdGhlIGdpdmVuIG9wY29kZS4KKyAgU3RyaW5nUmVmIGdldE5hbWUodW5zaWduZWQgT3Bjb2RlKSBjb25zdCB7CisgICAgYXNzZXJ0KE9wY29kZSA8IE51bU9wY29kZXMgJiYgIkludmFsaWQgb3Bjb2RlISIpOworICAgIHJldHVybiBTdHJpbmdSZWYoJkluc3RyTmFtZURhdGFbSW5zdHJOYW1lSW5kaWNlc1tPcGNvZGVdXSk7CisgIH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3RySXRpbmVyYXJpZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNJbnN0ckl0aW5lcmFyaWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA4MjRlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNJbnN0ckl0aW5lcmFyaWVzLmgKQEAgLTAsMCArMSwyMzUgQEAKKy8vPT09LSBsbHZtL01DL01DSW5zdHJJdGluZXJhcmllcy5oIC0gU2NoZWR1bGluZyAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlcyB1c2VkIGZvciBpbnN0cnVjdGlvbgorLy8gaXRpbmVyYXJpZXMsIHN0YWdlcywgYW5kIG9wZXJhbmQgcmVhZHMvd3JpdGVzLiAgVGhpcyBpcyB1c2VkIGJ5CisvLyBzY2hlZHVsZXJzIHRvIGRldGVybWluZSBpbnN0cnVjdGlvbiBzdGFnZXMgYW5kIGxhdGVuY2llcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNJTlNUUklUSU5FUkFSSUVTX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0lOU1RSSVRJTkVSQVJJRVNfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NjaGVkdWxlLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gVGhlc2UgdmFsdWVzIHJlcHJlc2VudCBhIG5vbi1waXBlbGluZWQgc3RlcCBpbgorLy8vIHRoZSBleGVjdXRpb24gb2YgYW4gaW5zdHJ1Y3Rpb24uICBDeWNsZXMgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mCisvLy8gZGlzY3JldGUgdGltZSBzbG90cyBuZWVkZWQgdG8gY29tcGxldGUgdGhlIHN0YWdlLiAgVW5pdHMgcmVwcmVzZW50CisvLy8gdGhlIGNob2ljZSBvZiBmdW5jdGlvbmFsIHVuaXRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tcGxldGUgdGhlCisvLy8gc3RhZ2UuICBFZy4gSW50VW5pdDEsIEludFVuaXQyLiBOZXh0Q3ljbGVzIGluZGljYXRlcyBob3cgbWFueQorLy8vIGN5Y2xlcyBzaG91bGQgZWxhcHNlIGZyb20gdGhlIHN0YXJ0IG9mIHRoaXMgc3RhZ2UgdG8gdGhlIHN0YXJ0IG9mCisvLy8gdGhlIG5leHQgc3RhZ2UgaW4gdGhlIGl0aW5lcmFyeS4gQSB2YWx1ZSBvZiAtMSBpbmRpY2F0ZXMgdGhhdCB0aGUKKy8vLyBuZXh0IHN0YWdlIHNob3VsZCBzdGFydCBpbW1lZGlhdGVseSBhZnRlciB0aGUgY3VycmVudCBvbmUuCisvLy8gRm9yIGV4YW1wbGU6CisvLy8KKy8vLyAgIHsgMSwgeCwgLTEgfQorLy8vICAgICAgaW5kaWNhdGVzIHRoYXQgdGhlIHN0YWdlIG9jY3VwaWVzIEZVIHggZm9yIDEgY3ljbGUgYW5kIHRoYXQKKy8vLyAgICAgIHRoZSBuZXh0IHN0YWdlIHN0YXJ0cyBpbW1lZGlhdGVseSBhZnRlciB0aGlzIG9uZS4KKy8vLworLy8vICAgeyAyLCB4fHksIDEgfQorLy8vICAgICAgaW5kaWNhdGVzIHRoYXQgdGhlIHN0YWdlIG9jY3VwaWVzIGVpdGhlciBGVSB4IG9yIEZVIHkgZm9yIDIKKy8vLyAgICAgIGNvbnNlY3V0aXZlIGN5Y2xlcyBhbmQgdGhhdCB0aGUgbmV4dCBzdGFnZSBzdGFydHMgb25lIGN5Y2xlCisvLy8gICAgICBhZnRlciB0aGlzIHN0YWdlIHN0YXJ0cy4gVGhhdCBpcywgdGhlIHN0YWdlIHJlcXVpcmVtZW50cworLy8vICAgICAgb3ZlcmxhcCBpbiB0aW1lLgorLy8vCisvLy8gICB7IDEsIHgsIDAgfQorLy8vICAgICAgaW5kaWNhdGVzIHRoYXQgdGhlIHN0YWdlIG9jY3VwaWVzIEZVIHggZm9yIDEgY3ljbGUgYW5kIHRoYXQKKy8vLyAgICAgIHRoZSBuZXh0IHN0YWdlIHN0YXJ0cyBpbiB0aGlzIHNhbWUgY3ljbGUuIFRoaXMgY2FuIGJlIHVzZWQgdG8KKy8vLyAgICAgIGluZGljYXRlIHRoYXQgdGhlIGluc3RydWN0aW9uIHJlcXVpcmVzIG11bHRpcGxlIHN0YWdlcyBhdCB0aGUKKy8vLyAgICAgIHNhbWUgdGltZS4KKy8vLworLy8vIEZVIHJlc2VydmF0aW9uIGNhbiBiZSBvZiB0d28gZGlmZmVyZW50IGtpbmRzOgorLy8vICAtIEZVcyB3aGljaCBpbnN0cnVjdGlvbiBhY3R1YWxseSByZXF1aXJlcworLy8vICAtIEZVcyB3aGljaCBpbnN0cnVjdGlvbiBqdXN0IHJlc2VydmVzLiBSZXNlcnZlZCB1bml0IGlzIG5vdCBhdmFpbGFibGUgZm9yCisvLy8gICAgZXhlY3V0aW9uIG9mIG90aGVyIGluc3RydWN0aW9uLiBIb3dldmVyLCBzZXZlcmFsIGluc3RydWN0aW9ucyBjYW4gcmVzZXJ2ZQorLy8vICAgIHRoZSBzYW1lIHVuaXQgc2V2ZXJhbCB0aW1lcy4KKy8vLyBTdWNoIHR3byB0eXBlcyBvZiB1bml0cyByZXNlcnZhdGlvbiBpcyB1c2VkIHRvIG1vZGVsIGluc3RydWN0aW9uIGRvbWFpbgorLy8vIGNoYW5nZSBzdGFsbHMsIEZVcyB1c2luZyB0aGUgc2FtZSByZXNvdXJjZSAoZS5nLiBzYW1lIHJlZ2lzdGVyIGZpbGUpLCBldGMuCisKK3N0cnVjdCBJbnN0clN0YWdlIHsKKyAgZW51bSBSZXNlcnZhdGlvbktpbmRzIHsKKyAgICBSZXF1aXJlZCA9IDAsCisgICAgUmVzZXJ2ZWQgPSAxCisgIH07CisKKyAgdW5zaWduZWQgQ3ljbGVzXzsgIC8vLzwgTGVuZ3RoIG9mIHN0YWdlIGluIG1hY2hpbmUgY3ljbGVzCisgIHVuc2lnbmVkIFVuaXRzXzsgICAvLy88IENob2ljZSBvZiBmdW5jdGlvbmFsIHVuaXRzCisgIGludCBOZXh0Q3ljbGVzXzsgICAvLy88IE51bWJlciBvZiBtYWNoaW5lIGN5Y2xlcyB0byBuZXh0IHN0YWdlCisgIFJlc2VydmF0aW9uS2luZHMgS2luZF87IC8vLzwgS2luZCBvZiB0aGUgRlUgcmVzZXJ2YXRpb24KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBjeWNsZXMgdGhlIHN0YWdlIGlzIG9jY3VwaWVkLgorICB1bnNpZ25lZCBnZXRDeWNsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEN5Y2xlc187CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGNob2ljZSBvZiBGVXMuCisgIHVuc2lnbmVkIGdldFVuaXRzKCkgY29uc3QgeworICAgIHJldHVybiBVbml0c187CisgIH0KKworICBSZXNlcnZhdGlvbktpbmRzIGdldFJlc2VydmF0aW9uS2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gS2luZF87CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBjeWNsZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhpcyBzdGFnZSB0byB0aGUKKyAgLy8vIHN0YXJ0IG9mIHRoZSBuZXh0IHN0YWdlIGluIHRoZSBpdGluZXJhcnkKKyAgdW5zaWduZWQgZ2V0TmV4dEN5Y2xlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKE5leHRDeWNsZXNfID49IDApID8gKHVuc2lnbmVkKU5leHRDeWNsZXNfIDogQ3ljbGVzXzsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBBbiBpdGluZXJhcnkgcmVwcmVzZW50cyB0aGUgc2NoZWR1bGluZyBpbmZvcm1hdGlvbiBmb3IgYW4gaW5zdHJ1Y3Rpb24uCisvLy8gVGhpcyBpbmNsdWRlcyBhIHNldCBvZiBzdGFnZXMgb2NjdXBpZWQgYnkgdGhlIGluc3RydWN0aW9uIGFuZCB0aGUgcGlwZWxpbmUKKy8vLyBjeWNsZSBpbiB3aGljaCBvcGVyYW5kcyBhcmUgcmVhZCBhbmQgd3JpdHRlbi4KKy8vLworc3RydWN0IEluc3RySXRpbmVyYXJ5IHsKKyAgaW50MTZfdCAgTnVtTWljcm9PcHM7ICAgICAgICAvLy88ICMgb2YgbWljcm8tb3BzLCAtMSBtZWFucyBpdCdzIHZhcmlhYmxlCisgIHVpbnQxNl90IEZpcnN0U3RhZ2U7ICAgICAgICAgLy8vPCBJbmRleCBvZiBmaXJzdCBzdGFnZSBpbiBpdGluZXJhcnkKKyAgdWludDE2X3QgTGFzdFN0YWdlOyAgICAgICAgICAvLy88IEluZGV4IG9mIGxhc3QgKyAxIHN0YWdlIGluIGl0aW5lcmFyeQorICB1aW50MTZfdCBGaXJzdE9wZXJhbmRDeWNsZTsgIC8vLzwgSW5kZXggb2YgZmlyc3Qgb3BlcmFuZCByZC93cgorICB1aW50MTZfdCBMYXN0T3BlcmFuZEN5Y2xlOyAgIC8vLzwgSW5kZXggb2YgbGFzdCArIDEgb3BlcmFuZCByZC93cgorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBJdGluZXJhcnkgZGF0YSBzdXBwbGllZCBieSBhIHN1YnRhcmdldCB0byBiZSB1c2VkIGJ5IGEgdGFyZ2V0LgorLy8vCitjbGFzcyBJbnN0ckl0aW5lcmFyeURhdGEgeworcHVibGljOgorICBNQ1NjaGVkTW9kZWwgU2NoZWRNb2RlbCA9CisgICAgICBNQ1NjaGVkTW9kZWw6OkdldERlZmF1bHRTY2hlZE1vZGVsKCk7IC8vLzwgQmFzaWMgbWFjaGluZSBwcm9wZXJ0aWVzLgorICBjb25zdCBJbnN0clN0YWdlICpTdGFnZXMgPSBudWxscHRyOyAgICAgICAvLy88IEFycmF5IG9mIHN0YWdlcyBzZWxlY3RlZAorICBjb25zdCB1bnNpZ25lZCAqT3BlcmFuZEN5Y2xlcyA9IG51bGxwdHI7IC8vLzwgQXJyYXkgb2Ygb3BlcmFuZCBjeWNsZXMgc2VsZWN0ZWQKKyAgY29uc3QgdW5zaWduZWQgKkZvcndhcmRpbmdzID0gbnVsbHB0cjsgLy8vPCBBcnJheSBvZiBwaXBlbGluZSBmb3J3YXJkaW5nIHBhdGhzCisgIGNvbnN0IEluc3RySXRpbmVyYXJ5ICpJdGluZXJhcmllcyA9CisgICAgICBudWxscHRyOyAvLy88IEFycmF5IG9mIGl0aW5lcmFyaWVzIHNlbGVjdGVkCisKKyAgSW5zdHJJdGluZXJhcnlEYXRhKCkgPSBkZWZhdWx0OworICBJbnN0ckl0aW5lcmFyeURhdGEoY29uc3QgTUNTY2hlZE1vZGVsICZTTSwgY29uc3QgSW5zdHJTdGFnZSAqUywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkICpPUywgY29uc3QgdW5zaWduZWQgKkYpCisgICAgOiBTY2hlZE1vZGVsKFNNKSwgU3RhZ2VzKFMpLCBPcGVyYW5kQ3ljbGVzKE9TKSwgRm9yd2FyZGluZ3MoRiksCisgICAgICBJdGluZXJhcmllcyhTY2hlZE1vZGVsLkluc3RySXRpbmVyYXJpZXMpIHt9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG5vIGl0aW5lcmFyaWVzLgorICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBJdGluZXJhcmllcyA9PSBudWxscHRyOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIGluZGV4IGlzIGZvciB0aGUgZW5kIG1hcmtlciBpdGluZXJhcnkuCisgIGJvb2wgaXNFbmRNYXJrZXIodW5zaWduZWQgSXRpbkNsYXNzSW5keCkgY29uc3QgeworICAgIHJldHVybiAoKEl0aW5lcmFyaWVzW0l0aW5DbGFzc0luZHhdLkZpcnN0U3RhZ2UgPT0gVUlOVDE2X01BWCkgJiYKKyAgICAgICAgICAgIChJdGluZXJhcmllc1tJdGluQ2xhc3NJbmR4XS5MYXN0U3RhZ2UgPT0gVUlOVDE2X01BWCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGZpcnN0IHN0YWdlIG9mIHRoZSBpdGluZXJhcnkuCisgIGNvbnN0IEluc3RyU3RhZ2UgKmJlZ2luU3RhZ2UodW5zaWduZWQgSXRpbkNsYXNzSW5keCkgY29uc3QgeworICAgIHVuc2lnbmVkIFN0YWdlSWR4ID0gSXRpbmVyYXJpZXNbSXRpbkNsYXNzSW5keF0uRmlyc3RTdGFnZTsKKyAgICByZXR1cm4gU3RhZ2VzICsgU3RhZ2VJZHg7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbGFzdCsxIHN0YWdlIG9mIHRoZSBpdGluZXJhcnkuCisgIGNvbnN0IEluc3RyU3RhZ2UgKmVuZFN0YWdlKHVuc2lnbmVkIEl0aW5DbGFzc0luZHgpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBTdGFnZUlkeCA9IEl0aW5lcmFyaWVzW0l0aW5DbGFzc0luZHhdLkxhc3RTdGFnZTsKKyAgICByZXR1cm4gU3RhZ2VzICsgU3RhZ2VJZHg7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdG90YWwgc3RhZ2UgbGF0ZW5jeSBvZiB0aGUgZ2l2ZW4gY2xhc3MuICBUaGUgbGF0ZW5jeSBpcworICAvLy8gdGhlIG1heGltdW0gY29tcGxldGlvbiB0aW1lIGZvciBhbnkgc3RhZ2UgaW4gdGhlIGl0aW5lcmFyeS4gIElmIG5vIHN0YWdlcworICAvLy8gZXhpc3QsIGl0IGRlZmF1bHRzIHRvIG9uZSBjeWNsZS4KKyAgdW5zaWduZWQgZ2V0U3RhZ2VMYXRlbmN5KHVuc2lnbmVkIEl0aW5DbGFzc0luZHgpIGNvbnN0IHsKKyAgICAvLyBJZiB0aGUgdGFyZ2V0IGRvZXNuJ3QgcHJvdmlkZSBpdGluZXJhcnkgaW5mb3JtYXRpb24sIHVzZSBhIHNpbXBsZQorICAgIC8vIG5vbi16ZXJvIGRlZmF1bHQgdmFsdWUgZm9yIGFsbCBpbnN0cnVjdGlvbnMuCisgICAgaWYgKGlzRW1wdHkoKSkKKyAgICAgIHJldHVybiAxOworCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGNvbXBsZXRpb24gdGltZSBmb3IgYW55IHN0YWdlLgorICAgIHVuc2lnbmVkIExhdGVuY3kgPSAwLCBTdGFydEN5Y2xlID0gMDsKKyAgICBmb3IgKGNvbnN0IEluc3RyU3RhZ2UgKklTID0gYmVnaW5TdGFnZShJdGluQ2xhc3NJbmR4KSwKKyAgICAgICAgICAgKkUgPSBlbmRTdGFnZShJdGluQ2xhc3NJbmR4KTsgSVMgIT0gRTsgKytJUykgeworICAgICAgTGF0ZW5jeSA9IHN0ZDo6bWF4KExhdGVuY3ksIFN0YXJ0Q3ljbGUgKyBJUy0+Z2V0Q3ljbGVzKCkpOworICAgICAgU3RhcnRDeWNsZSArPSBJUy0+Z2V0TmV4dEN5Y2xlcygpOworICAgIH0KKyAgICByZXR1cm4gTGF0ZW5jeTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBjeWNsZSBmb3IgdGhlIGdpdmVuIGNsYXNzIGFuZCBvcGVyYW5kLiAgUmV0dXJuIC0xIGlmIG5vCisgIC8vLyBjeWNsZSBpcyBzcGVjaWZpZWQgZm9yIHRoZSBvcGVyYW5kLgorICBpbnQgZ2V0T3BlcmFuZEN5Y2xlKHVuc2lnbmVkIEl0aW5DbGFzc0luZHgsIHVuc2lnbmVkIE9wZXJhbmRJZHgpIGNvbnN0IHsKKyAgICBpZiAoaXNFbXB0eSgpKQorICAgICAgcmV0dXJuIC0xOworCisgICAgdW5zaWduZWQgRmlyc3RJZHggPSBJdGluZXJhcmllc1tJdGluQ2xhc3NJbmR4XS5GaXJzdE9wZXJhbmRDeWNsZTsKKyAgICB1bnNpZ25lZCBMYXN0SWR4ID0gSXRpbmVyYXJpZXNbSXRpbkNsYXNzSW5keF0uTGFzdE9wZXJhbmRDeWNsZTsKKyAgICBpZiAoKEZpcnN0SWR4ICsgT3BlcmFuZElkeCkgPj0gTGFzdElkeCkKKyAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiAoaW50KU9wZXJhbmRDeWNsZXNbRmlyc3RJZHggKyBPcGVyYW5kSWR4XTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSBwaXBlbGluZSBmb3J3YXJkaW5nIGJldHdlZW4gaW5zdHJ1Y3Rpb25zCisgIC8vLyBvZiBpdGluZXJhcnkgY2xhc3NlcyBEZWZDbGFzcyBhbmQgVXNlQ2xhc3NlcyBzbyB0aGF0IHZhbHVlIHByb2R1Y2VkIGJ5IGFuCisgIC8vLyBpbnN0cnVjdGlvbiBvZiBpdGluZXJhcnkgY2xhc3MgRGVmQ2xhc3MsIG9wZXJhbmQgaW5kZXggRGVmSWR4IGNhbiBiZQorICAvLy8gYnlwYXNzZWQgd2hlbiBpdCdzIHJlYWQgYnkgYW4gaW5zdHJ1Y3Rpb24gb2YgaXRpbmVyYXJ5IGNsYXNzIFVzZUNsYXNzLAorICAvLy8gb3BlcmFuZCBpbmRleCBVc2VJZHguCisgIGJvb2wgaGFzUGlwZWxpbmVGb3J3YXJkaW5nKHVuc2lnbmVkIERlZkNsYXNzLCB1bnNpZ25lZCBEZWZJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFVzZUNsYXNzLCB1bnNpZ25lZCBVc2VJZHgpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBGaXJzdERlZklkeCA9IEl0aW5lcmFyaWVzW0RlZkNsYXNzXS5GaXJzdE9wZXJhbmRDeWNsZTsKKyAgICB1bnNpZ25lZCBMYXN0RGVmSWR4ID0gSXRpbmVyYXJpZXNbRGVmQ2xhc3NdLkxhc3RPcGVyYW5kQ3ljbGU7CisgICAgaWYgKChGaXJzdERlZklkeCArIERlZklkeCkgPj0gTGFzdERlZklkeCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoRm9yd2FyZGluZ3NbRmlyc3REZWZJZHggKyBEZWZJZHhdID09IDApCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB1bnNpZ25lZCBGaXJzdFVzZUlkeCA9IEl0aW5lcmFyaWVzW1VzZUNsYXNzXS5GaXJzdE9wZXJhbmRDeWNsZTsKKyAgICB1bnNpZ25lZCBMYXN0VXNlSWR4ID0gSXRpbmVyYXJpZXNbVXNlQ2xhc3NdLkxhc3RPcGVyYW5kQ3ljbGU7CisgICAgaWYgKChGaXJzdFVzZUlkeCArIFVzZUlkeCkgPj0gTGFzdFVzZUlkeCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBGb3J3YXJkaW5nc1tGaXJzdERlZklkeCArIERlZklkeF0gPT0KKyAgICAgIEZvcndhcmRpbmdzW0ZpcnN0VXNlSWR4ICsgVXNlSWR4XTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSB1c2Ugb3BlcmFuZCBsYXRlbmN5IG9mIGEgZ2l2ZW4gaXRpbmVyYXJ5CisgIC8vLyBjbGFzcyBhbmQgb3BlcmFuZCBpbmRleCBpZiB0aGUgdmFsdWUgaXMgcHJvZHVjZWQgYnkgYW4gaW5zdHJ1Y3Rpb24gb2YgdGhlCisgIC8vLyBzcGVjaWZpZWQgaXRpbmVyYXJ5IGNsYXNzIGFuZCBkZWYgb3BlcmFuZCBpbmRleC4KKyAgaW50IGdldE9wZXJhbmRMYXRlbmN5KHVuc2lnbmVkIERlZkNsYXNzLCB1bnNpZ25lZCBEZWZJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBVc2VDbGFzcywgdW5zaWduZWQgVXNlSWR4KSBjb25zdCB7CisgICAgaWYgKGlzRW1wdHkoKSkKKyAgICAgIHJldHVybiAtMTsKKworICAgIGludCBEZWZDeWNsZSA9IGdldE9wZXJhbmRDeWNsZShEZWZDbGFzcywgRGVmSWR4KTsKKyAgICBpZiAoRGVmQ3ljbGUgPT0gLTEpCisgICAgICByZXR1cm4gLTE7CisKKyAgICBpbnQgVXNlQ3ljbGUgPSBnZXRPcGVyYW5kQ3ljbGUoVXNlQ2xhc3MsIFVzZUlkeCk7CisgICAgaWYgKFVzZUN5Y2xlID09IC0xKQorICAgICAgcmV0dXJuIC0xOworCisgICAgVXNlQ3ljbGUgPSBEZWZDeWNsZSAtIFVzZUN5Y2xlICsgMTsKKyAgICBpZiAoVXNlQ3ljbGUgPiAwICYmCisgICAgICAgIGhhc1BpcGVsaW5lRm9yd2FyZGluZyhEZWZDbGFzcywgRGVmSWR4LCBVc2VDbGFzcywgVXNlSWR4KSkKKyAgICAgIC8vIEZJWE1FOiBUaGlzIGFzc3VtZXMgb25lIGN5Y2xlIGJlbmVmaXQgZm9yIGV2ZXJ5IHBpcGVsaW5lIGZvcndhcmRpbmcuCisgICAgICAtLVVzZUN5Y2xlOworICAgIHJldHVybiBVc2VDeWNsZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgbWljcm8tb3BzIHRoYXQgdGhlIGdpdmVuIGNsYXNzIGRlY29kZXMgdG8uCisgIC8vLyBSZXR1cm4gLTEgZm9yIGNsYXNzZXMgdGhhdCByZXF1aXJlIGR5bmFtaWMgbG9va3VwIHZpYSBUYXJnZXRJbnN0ckluZm8uCisgIGludCBnZXROdW1NaWNyb09wcyh1bnNpZ25lZCBJdGluQ2xhc3NJbmR4KSBjb25zdCB7CisgICAgaWYgKGlzRW1wdHkoKSkKKyAgICAgIHJldHVybiAxOworICAgIHJldHVybiBJdGluZXJhcmllc1tJdGluQ2xhc3NJbmR4XS5OdW1NaWNyb09wczsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNJTlNUUklUSU5FUkFSSUVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNMYWJlbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0xhYmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1NzlmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNMYWJlbC5oCkBAIC0wLDAgKzEsNTcgQEAKKy8vPT09LSBNQ0xhYmVsLmggLSBNYWNoaW5lIENvZGUgRGlyZWN0aW9uYWwgTG9jYWwgTGFiZWxzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgTUNMYWJlbCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNMQUJFTF9ICisjZGVmaW5lIExMVk1fTUNfTUNMQUJFTF9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vLyBcYnJpZWYgSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgbGFiZWwgbmFtZSBpbiB0aGUgTUMgZmlsZSwKKy8vLyBhbmQgTUNMYWJlbCBhcmUgY3JlYXRlZCBhbmQgdW5pcXVlZCBieSB0aGUgTUNDb250ZXh0IGNsYXNzLiAgTUNMYWJlbAorLy8vIHNob3VsZCBvbmx5IGJlIGNvbnN0cnVjdGVkIGZvciB2YWxpZCBpbnN0YW5jZXMgaW4gdGhlIG9iamVjdCBmaWxlLgorY2xhc3MgTUNMYWJlbCB7CisgIC8vIFxicmllZiBUaGUgaW5zdGFuY2UgbnVtYmVyIG9mIHRoaXMgRGlyZWN0aW9uYWwgTG9jYWwgTGFiZWwuCisgIHVuc2lnbmVkIEluc3RhbmNlOworCitwcml2YXRlOiAvLyBNQ0NvbnRleHQgY3JlYXRlcyBhbmQgdW5pcXVlcyB0aGVzZS4KKyAgZnJpZW5kIGNsYXNzIE1DQ29udGV4dDsKKworICBNQ0xhYmVsKHVuc2lnbmVkIGluc3RhbmNlKSA6IEluc3RhbmNlKGluc3RhbmNlKSB7fQorCitwdWJsaWM6CisgIE1DTGFiZWwoY29uc3QgTUNMYWJlbCAmKSA9IGRlbGV0ZTsKKyAgTUNMYWJlbCAmb3BlcmF0b3I9KGNvbnN0IE1DTGFiZWwgJikgPSBkZWxldGU7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhpcyBEaXJlY3Rpb25hbCBMb2NhbCBMYWJlbC4KKyAgdW5zaWduZWQgZ2V0SW5zdGFuY2UoKSBjb25zdCB7IHJldHVybiBJbnN0YW5jZTsgfQorCisgIC8vLyBcYnJpZWYgSW5jcmVtZW50IHRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoaXMgRGlyZWN0aW9uYWwgTG9jYWwgTGFiZWwuCisgIHVuc2lnbmVkIGluY0luc3RhbmNlKCkgeyByZXR1cm4gKytJbnN0YW5jZTsgfQorCisgIC8vLyBcYnJpZWYgUHJpbnQgdGhlIHZhbHVlIHRvIHRoZSBzdHJlYW0gXHAgT1MuCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFByaW50IHRoZSB2YWx1ZSB0byBzdGRlcnIuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTUNMYWJlbCAmTGFiZWwpIHsKKyAgTGFiZWwucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DTEFCRUxfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0xpbmtlck9wdGltaXphdGlvbkhpbnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNMaW5rZXJPcHRpbWl6YXRpb25IaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBmZDA3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNMaW5rZXJPcHRpbWl6YXRpb25IaW50LmgKQEAgLTAsMCArMSwxODcgQEAKKy8vPT09LSBNQ0xpbmtlck9wdGltaXphdGlvbkhpbnQuaCAtIExPSCBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBzb21lIGhlbHBlcnMgY2xhc3NlcyB0byBoYW5kbGUgTGlua2VyIE9wdGltaXphdGlvbiBIaW50CisvLyAoTE9IKS4KKy8vCisvLyBGSVhNRTogTE9IIGludGVyZmFjZSBzdXBwb3J0cyBvbmx5IE1hY2hPIGZvcm1hdCBhdCB0aGUgbW9tZW50LgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DTElOS0VST1BUSU1JWkFUSU9OSElOVF9ICisjZGVmaW5lIExMVk1fTUNfTUNMSU5LRVJPUFRJTUlaQVRJT05ISU5UX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU3dpdGNoLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hPYmplY3RXcml0ZXI7CitjbGFzcyBNQ0FzbUxheW91dDsKK2NsYXNzIE1DU3ltYm9sOworCisvLy8gTGlua2VyIE9wdGltaXphdGlvbiBIaW50IFR5cGUuCitlbnVtIE1DTE9IVHlwZSB7CisgIE1DTE9IX0FkcnBBZHJwID0gMHgxdSwgICAgICAvLy88IEFkcnAgeFksIF92MUBQQUdFIC0+IEFkcnAgeFksIF92MkBQQUdFLgorICBNQ0xPSF9BZHJwTGRyID0gMHgydSwgICAgICAgLy8vPCBBZHJwIF92QFBBR0UgLT4gTGRyIF92QFBBR0VPRkYuCisgIE1DTE9IX0FkcnBBZGRMZHIgPSAweDN1LCAgICAvLy88IEFkcnAgX3ZAUEFHRSAtPiBBZGQgX3ZAUEFHRU9GRiAtPiBMZHIuCisgIE1DTE9IX0FkcnBMZHJHb3RMZHIgPSAweDR1LCAvLy88IEFkcnAgX3ZAR09UUEFHRSAtPiBMZHIgX3ZAR09UUEFHRU9GRiAtPiBMZHIuCisgIE1DTE9IX0FkcnBBZGRTdHIgPSAweDV1LCAgICAvLy88IEFkcnAgX3ZAUEFHRSAtPiBBZGQgX3ZAUEFHRU9GRiAtPiBTdHIuCisgIE1DTE9IX0FkcnBMZHJHb3RTdHIgPSAweDZ1LCAvLy88IEFkcnAgX3ZAR09UUEFHRSAtPiBMZHIgX3ZAR09UUEFHRU9GRiAtPiBTdHIuCisgIE1DTE9IX0FkcnBBZGQgPSAweDd1LCAgICAgICAvLy88IEFkcnAgX3ZAUEFHRSAtPiBBZGQgX3ZAUEFHRU9GRi4KKyAgTUNMT0hfQWRycExkckdvdCA9IDB4OHUgICAgIC8vLzwgQWRycCBfdkBHT1RQQUdFIC0+IExkciBfdkBHT1RQQUdFT0ZGLgorfTsKKworc3RhdGljIGlubGluZSBTdHJpbmdSZWYgTUNMT0hEaXJlY3RpdmVOYW1lKCkgeworICByZXR1cm4gU3RyaW5nUmVmKCIubG9oIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkTUNMT0hUeXBlKHVuc2lnbmVkIEtpbmQpIHsKKyAgcmV0dXJuIEtpbmQgPj0gTUNMT0hfQWRycEFkcnAgJiYgS2luZCA8PSBNQ0xPSF9BZHJwTGRyR290OworfQorCitzdGF0aWMgaW5saW5lIGludCBNQ0xPSE5hbWVUb0lkKFN0cmluZ1JlZiBOYW1lKSB7CisjZGVmaW5lIE1DTE9IQ2FzZU5hbWVUb0lkKE5hbWUpICAgICAuQ2FzZSgjTmFtZSwgTUNMT0hfICMjIE5hbWUpCisgIHJldHVybiBTdHJpbmdTd2l0Y2g8aW50PihOYW1lKQorICAgIE1DTE9IQ2FzZU5hbWVUb0lkKEFkcnBBZHJwKQorICAgIE1DTE9IQ2FzZU5hbWVUb0lkKEFkcnBMZHIpCisgICAgTUNMT0hDYXNlTmFtZVRvSWQoQWRycEFkZExkcikKKyAgICBNQ0xPSENhc2VOYW1lVG9JZChBZHJwTGRyR290TGRyKQorICAgIE1DTE9IQ2FzZU5hbWVUb0lkKEFkcnBBZGRTdHIpCisgICAgTUNMT0hDYXNlTmFtZVRvSWQoQWRycExkckdvdFN0cikKKyAgICBNQ0xPSENhc2VOYW1lVG9JZChBZHJwQWRkKQorICAgIE1DTE9IQ2FzZU5hbWVUb0lkKEFkcnBMZHJHb3QpCisgICAgLkRlZmF1bHQoLTEpOworfQorCitzdGF0aWMgaW5saW5lIFN0cmluZ1JlZiBNQ0xPSElkVG9OYW1lKE1DTE9IVHlwZSBLaW5kKSB7CisjZGVmaW5lIE1DTE9IQ2FzZUlkVG9OYW1lKE5hbWUpICAgICAgY2FzZSBNQ0xPSF8gIyMgTmFtZTogcmV0dXJuIFN0cmluZ1JlZigjTmFtZSk7CisgIHN3aXRjaCAoS2luZCkgeworICAgIE1DTE9IQ2FzZUlkVG9OYW1lKEFkcnBBZHJwKTsKKyAgICBNQ0xPSENhc2VJZFRvTmFtZShBZHJwTGRyKTsKKyAgICBNQ0xPSENhc2VJZFRvTmFtZShBZHJwQWRkTGRyKTsKKyAgICBNQ0xPSENhc2VJZFRvTmFtZShBZHJwTGRyR290TGRyKTsKKyAgICBNQ0xPSENhc2VJZFRvTmFtZShBZHJwQWRkU3RyKTsKKyAgICBNQ0xPSENhc2VJZFRvTmFtZShBZHJwTGRyR290U3RyKTsKKyAgICBNQ0xPSENhc2VJZFRvTmFtZShBZHJwQWRkKTsKKyAgICBNQ0xPSENhc2VJZFRvTmFtZShBZHJwTGRyR290KTsKKyAgfQorICByZXR1cm4gU3RyaW5nUmVmKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IE1DTE9ISWRUb05iQXJncyhNQ0xPSFR5cGUgS2luZCkgeworICBzd2l0Y2ggKEtpbmQpIHsKKyAgICAvLyBMT0ggd2l0aCB0d28gYXJndW1lbnRzCisgIGNhc2UgTUNMT0hfQWRycEFkcnA6CisgIGNhc2UgTUNMT0hfQWRycExkcjoKKyAgY2FzZSBNQ0xPSF9BZHJwQWRkOgorICBjYXNlIE1DTE9IX0FkcnBMZHJHb3Q6CisgICAgcmV0dXJuIDI7CisgICAgLy8gTE9IIHdpdGggdGhyZWUgYXJndW1lbnRzCisgIGNhc2UgTUNMT0hfQWRycEFkZExkcjoKKyAgY2FzZSBNQ0xPSF9BZHJwTGRyR290TGRyOgorICBjYXNlIE1DTE9IX0FkcnBBZGRTdHI6CisgIGNhc2UgTUNMT0hfQWRycExkckdvdFN0cjoKKyAgICByZXR1cm4gMzsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKKy8vLyBTdG9yZSBMaW5rZXIgT3B0aW1pemF0aW9uIEhpbnQgaW5mb3JtYXRpb24gKExPSCkuCitjbGFzcyBNQ0xPSERpcmVjdGl2ZSB7CisgIE1DTE9IVHlwZSBLaW5kOworCisgIC8vLyBBcmd1bWVudHMgb2YgdGhpcyBkaXJlY3RpdmUuIE9yZGVyIG1hdHRlcnMuCisgIFNtYWxsVmVjdG9yPE1DU3ltYm9sICosIDM+IEFyZ3M7CisKKyAgLy8vIEVtaXQgdGhpcyBkaXJlY3RpdmUgaW4gXHAgT3V0U3RyZWFtIHVzaW5nIHRoZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUKKyAgLy8vIGluIHRoZSBnaXZlbiBccCBPYmpXcml0ZXIgYW5kIFxwIExheW91dCB0byBnZXQgdGhlIGFkZHJlc3Mgb2YgdGhlCisgIC8vLyBhcmd1bWVudHMgd2l0aGluIHRoZSBvYmplY3QgZmlsZS4KKyAgdm9pZCBlbWl0X2ltcGwocmF3X29zdHJlYW0gJk91dFN0cmVhbSwgY29uc3QgTWFjaE9iamVjdFdyaXRlciAmT2JqV3JpdGVyLAorICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdDsKKworcHVibGljOgorICB1c2luZyBMT0hBcmdzID0gU21hbGxWZWN0b3JJbXBsPE1DU3ltYm9sICo+OworCisgIE1DTE9IRGlyZWN0aXZlKE1DTE9IVHlwZSBLaW5kLCBjb25zdCBMT0hBcmdzICZBcmdzKQorICAgICAgOiBLaW5kKEtpbmQpLCBBcmdzKEFyZ3MuYmVnaW4oKSwgQXJncy5lbmQoKSkgeworICAgIGFzc2VydChpc1ZhbGlkTUNMT0hUeXBlKEtpbmQpICYmICJJbnZhbGlkIExPSCBkaXJlY3RpdmUgdHlwZSEiKTsKKyAgfQorCisgIE1DTE9IVHlwZSBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorCisgIGNvbnN0IExPSEFyZ3MgJmdldEFyZ3MoKSBjb25zdCB7IHJldHVybiBBcmdzOyB9CisKKyAgLy8vIEVtaXQgdGhpcyBkaXJlY3RpdmUgYXM6CisgIC8vLyA8a2luZCwgbnVtQXJncywgYWRkcjEsIC4uLiwgYWRkck4+CisgIHZvaWQgZW1pdChNYWNoT2JqZWN0V3JpdGVyICZPYmpXcml0ZXIsIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhpcyBkaXJlY3RpdmUgaWYgZW1pdHRlZCBpbiBccCBPYmpXcml0ZXIgd2l0aAorICAvLy8gdGhlIGdpdmVuIFxwIExheW91dC4KKyAgdWludDY0X3QgZ2V0RW1pdFNpemUoY29uc3QgTWFjaE9iamVjdFdyaXRlciAmT2JqV3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdDsKK307CisKK2NsYXNzIE1DTE9IQ29udGFpbmVyIHsKKyAgLy8vIEtlZXAgdHJhY2sgb2YgdGhlIGVtaXQgc2l6ZSBvZiBhbGwgdGhlIExPSHMuCisgIG11dGFibGUgdWludDY0X3QgRW1pdFNpemUgPSAwOworCisgIC8vLyBLZWVwIHRyYWNrIG9mIGFsbCBMT0ggZGlyZWN0aXZlcy4KKyAgU21hbGxWZWN0b3I8TUNMT0hEaXJlY3RpdmUsIDMyPiBEaXJlY3RpdmVzOworCitwdWJsaWM6CisgIHVzaW5nIExPSERpcmVjdGl2ZXMgPSBTbWFsbFZlY3RvckltcGw8TUNMT0hEaXJlY3RpdmU+OworCisgIE1DTE9IQ29udGFpbmVyKCkgPSBkZWZhdWx0OworCisgIC8vLyBDb25zdCBhY2Nlc3NvciB0byB0aGUgZGlyZWN0aXZlcy4KKyAgY29uc3QgTE9IRGlyZWN0aXZlcyAmZ2V0RGlyZWN0aXZlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gRGlyZWN0aXZlczsKKyAgfQorCisgIC8vLyBBZGQgdGhlIGRpcmVjdGl2ZSBvZiB0aGUgZ2l2ZW4ga2luZCBccCBLaW5kIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cworICAvLy8gXHAgQXJncyB0byB0aGUgY29udGFpbmVyLgorICB2b2lkIGFkZERpcmVjdGl2ZShNQ0xPSFR5cGUgS2luZCwgY29uc3QgTUNMT0hEaXJlY3RpdmU6OkxPSEFyZ3MgJkFyZ3MpIHsKKyAgICBEaXJlY3RpdmVzLnB1c2hfYmFjayhNQ0xPSERpcmVjdGl2ZShLaW5kLCBBcmdzKSk7CisgIH0KKworICAvLy8gR2V0IHRoZSBzaXplIG9mIHRoZSBkaXJlY3RpdmVzIGlmIGVtaXR0ZWQuCisgIHVpbnQ2NF90IGdldEVtaXRTaXplKGNvbnN0IE1hY2hPYmplY3RXcml0ZXIgJk9ialdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCkgY29uc3QgeworICAgIGlmICghRW1pdFNpemUpIHsKKyAgICAgIGZvciAoY29uc3QgTUNMT0hEaXJlY3RpdmUgJkQgOiBEaXJlY3RpdmVzKQorICAgICAgICBFbWl0U2l6ZSArPSBELmdldEVtaXRTaXplKE9ialdyaXRlciwgTGF5b3V0KTsKKyAgICB9CisgICAgcmV0dXJuIEVtaXRTaXplOworICB9CisKKyAgLy8vIEVtaXQgYWxsIExpbmtlciBPcHRpbWl6YXRpb24gSGludCBpbiBvbmUgYmlnIHRhYmxlLgorICAvLy8gRWFjaCBsaW5lIG9mIHRoZSB0YWJsZSBpcyBlbWl0dGVkIGJ5IExPSERpcmVjdGl2ZTo6ZW1pdC4KKyAgdm9pZCBlbWl0KE1hY2hPYmplY3RXcml0ZXIgJk9ialdyaXRlciwgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCkgY29uc3QgeworICAgIGZvciAoY29uc3QgTUNMT0hEaXJlY3RpdmUgJkQgOiBEaXJlY3RpdmVzKQorICAgICAgRC5lbWl0KE9ialdyaXRlciwgTGF5b3V0KTsKKyAgfQorCisgIHZvaWQgcmVzZXQoKSB7CisgICAgRGlyZWN0aXZlcy5jbGVhcigpOworICAgIEVtaXRTaXplID0gMDsKKyAgfQorfTsKKworLy8gQWRkIHR5cGVzIGZvciBzcGVjaWFsaXplZCB0ZW1wbGF0ZSB1c2luZyBNQ1N5bWJvbC4KK3VzaW5nIE1DTE9IQXJncyA9IE1DTE9IRGlyZWN0aXZlOjpMT0hBcmdzOwordXNpbmcgTUNMT0hEaXJlY3RpdmVzID0gTUNMT0hDb250YWluZXI6OkxPSERpcmVjdGl2ZXM7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DTElOS0VST1BUSU1JWkFUSU9OSElOVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DTWFjaE9iamVjdFdyaXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ01hY2hPYmplY3RXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTQ4NjlmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ01hY2hPYmplY3RXcml0ZXIuaApAQCAtMCwwICsxLDI3OSBAQAorLy89PT0tIGxsdm0vTUMvTUNNYWNoT2JqZWN0V3JpdGVyLmggLSBNYWNoIE9iamVjdCBXcml0ZXIgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DTUFDSE9CSkVDVFdSSVRFUl9ICisjZGVmaW5lIExMVk1fTUNfTUNNQUNIT0JKRUNUV1JJVEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvTWFjaE8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRXhwci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNPYmplY3RXcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vTUMvU3RyaW5nVGFibGVCdWlsZGVyLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoT2JqZWN0V3JpdGVyOworCitjbGFzcyBNQ01hY2hPYmplY3RUYXJnZXRXcml0ZXIgeworICBjb25zdCB1bnNpZ25lZCBJczY0Qml0IDogMTsKKyAgY29uc3QgdWludDMyX3QgQ1BVVHlwZTsKKyAgY29uc3QgdWludDMyX3QgQ1BVU3VidHlwZTsKKyAgdW5zaWduZWQgTG9jYWxEaWZmZXJlbmNlX1JJVDsKKworcHJvdGVjdGVkOgorICBNQ01hY2hPYmplY3RUYXJnZXRXcml0ZXIoYm9vbCBJczY0Qml0XywgdWludDMyX3QgQ1BVVHlwZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDUFVTdWJ0eXBlXyk7CisKKyAgdm9pZCBzZXRMb2NhbERpZmZlcmVuY2VSZWxvY2F0aW9uVHlwZSh1bnNpZ25lZCBUeXBlKSB7CisgICAgTG9jYWxEaWZmZXJlbmNlX1JJVCA9IFR5cGU7CisgIH0KKworcHVibGljOgorICB2aXJ0dWFsIH5NQ01hY2hPYmplY3RUYXJnZXRXcml0ZXIoKTsKKworICAvLy8gXG5hbWUgTGlmZXRpbWUgTWFuYWdlbWVudAorICAvLy8gQHsKKworICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSB7fQorCisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisKKyAgYm9vbCBpczY0Qml0KCkgY29uc3QgeyByZXR1cm4gSXM2NEJpdDsgfQorICB1aW50MzJfdCBnZXRDUFVUeXBlKCkgY29uc3QgeyByZXR1cm4gQ1BVVHlwZTsgfQorICB1aW50MzJfdCBnZXRDUFVTdWJ0eXBlKCkgY29uc3QgeyByZXR1cm4gQ1BVU3VidHlwZTsgfQorICB1bnNpZ25lZCBnZXRMb2NhbERpZmZlcmVuY2VSZWxvY2F0aW9uVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTG9jYWxEaWZmZXJlbmNlX1JJVDsKKyAgfQorCisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBBUEkKKyAgLy8vIEB7CisKKyAgdmlydHVhbCB2b2lkIHJlY29yZFJlbG9jYXRpb24oTWFjaE9iamVjdFdyaXRlciAqV3JpdGVyLCBNQ0Fzc2VtYmxlciAmQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZyYWdtZW50ICpGcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGaXh1cCAmRml4dXAsIE1DVmFsdWUgVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAmRml4ZWRWYWx1ZSkgPSAwOworCisgIC8vLyBAfQorfTsKKworY2xhc3MgTWFjaE9iamVjdFdyaXRlciA6IHB1YmxpYyBNQ09iamVjdFdyaXRlciB7CisgIC8vLyBIZWxwZXIgc3RydWN0IGZvciBjb250YWluaW5nIHNvbWUgcHJlY29tcHV0ZWQgaW5mb3JtYXRpb24gb24gc3ltYm9scy4KKyAgc3RydWN0IE1hY2hTeW1ib2xEYXRhIHsKKyAgICBjb25zdCBNQ1N5bWJvbCAqU3ltYm9sOworICAgIHVpbnQ2NF90IFN0cmluZ0luZGV4OworICAgIHVpbnQ4X3QgU2VjdGlvbkluZGV4OworCisgICAgLy8gU3VwcG9ydCBsZXhpY29ncmFwaGljIHNvcnRpbmcuCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgTWFjaFN5bWJvbERhdGEgJlJIUykgY29uc3Q7CisgIH07CisKKyAgLy8vIFRoZSB0YXJnZXQgc3BlY2lmaWMgTWFjaC1PIHdyaXRlciBpbnN0YW5jZS4KKyAgc3RkOjp1bmlxdWVfcHRyPE1DTWFjaE9iamVjdFRhcmdldFdyaXRlcj4gVGFyZ2V0T2JqZWN0V3JpdGVyOworCisgIC8vLyBcbmFtZSBSZWxvY2F0aW9uIERhdGEKKyAgLy8vIEB7CisKKyAgc3RydWN0IFJlbEFuZFN5bWJvbCB7CisgICAgY29uc3QgTUNTeW1ib2wgKlN5bTsKKyAgICBNYWNoTzo6YW55X3JlbG9jYXRpb25faW5mbyBNUkU7CisgICAgUmVsQW5kU3ltYm9sKGNvbnN0IE1DU3ltYm9sICpTeW0sIGNvbnN0IE1hY2hPOjphbnlfcmVsb2NhdGlvbl9pbmZvICZNUkUpCisgICAgICAgIDogU3ltKFN5bSksIE1SRShNUkUpIHt9CisgIH07CisKKyAgRGVuc2VNYXA8Y29uc3QgTUNTZWN0aW9uICosIHN0ZDo6dmVjdG9yPFJlbEFuZFN5bWJvbD4+IFJlbG9jYXRpb25zOworICBEZW5zZU1hcDxjb25zdCBNQ1NlY3Rpb24gKiwgdW5zaWduZWQ+IEluZGlyZWN0U3ltQmFzZTsKKworICBTZWN0aW9uQWRkck1hcCBTZWN0aW9uQWRkcmVzczsKKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIFN5bWJvbCBUYWJsZSBEYXRhCisgIC8vLyBAeworCisgIFN0cmluZ1RhYmxlQnVpbGRlciBTdHJpbmdUYWJsZXtTdHJpbmdUYWJsZUJ1aWxkZXI6Ok1hY2hPfTsKKyAgc3RkOjp2ZWN0b3I8TWFjaFN5bWJvbERhdGE+IExvY2FsU3ltYm9sRGF0YTsKKyAgc3RkOjp2ZWN0b3I8TWFjaFN5bWJvbERhdGE+IEV4dGVybmFsU3ltYm9sRGF0YTsKKyAgc3RkOjp2ZWN0b3I8TWFjaFN5bWJvbERhdGE+IFVuZGVmaW5lZFN5bWJvbERhdGE7CisKKyAgLy8vIEB9CisKKyAgTWFjaFN5bWJvbERhdGEgKmZpbmRTeW1ib2xEYXRhKGNvbnN0IE1DU3ltYm9sICZTeW0pOworCitwdWJsaWM6CisgIE1hY2hPYmplY3RXcml0ZXIoc3RkOjp1bmlxdWVfcHRyPE1DTWFjaE9iamVjdFRhcmdldFdyaXRlcj4gTU9UVywKKyAgICAgICAgICAgICAgICAgICByYXdfcHdyaXRlX3N0cmVhbSAmT1MsIGJvb2wgSXNMaXR0bGVFbmRpYW4pCisgICAgICA6IE1DT2JqZWN0V3JpdGVyKE9TLCBJc0xpdHRsZUVuZGlhbiksCisgICAgICAgIFRhcmdldE9iamVjdFdyaXRlcihzdGQ6Om1vdmUoTU9UVykpIHt9CisKKyAgY29uc3QgTUNTeW1ib2wgJmZpbmRBbGlhc2VkU3ltYm9sKGNvbnN0IE1DU3ltYm9sICZTeW0pIGNvbnN0OworCisgIC8vLyBcbmFtZSBMaWZldGltZSBtYW5hZ2VtZW50IE1ldGhvZHMKKyAgLy8vIEB7CisKKyAgdm9pZCByZXNldCgpIG92ZXJyaWRlOworCisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBVdGlsaXR5IE1ldGhvZHMKKyAgLy8vIEB7CisKKyAgYm9vbCBpc0ZpeHVwS2luZFBDUmVsKGNvbnN0IE1DQXNzZW1ibGVyICZBc20sIHVuc2lnbmVkIEtpbmQpOworCisgIFNlY3Rpb25BZGRyTWFwICZnZXRTZWN0aW9uQWRkcmVzc01hcCgpIHsgcmV0dXJuIFNlY3Rpb25BZGRyZXNzOyB9CisKKyAgdWludDY0X3QgZ2V0U2VjdGlvbkFkZHJlc3MoY29uc3QgTUNTZWN0aW9uICpTZWMpIGNvbnN0IHsKKyAgICByZXR1cm4gU2VjdGlvbkFkZHJlc3MubG9va3VwKFNlYyk7CisgIH0KKyAgdWludDY0X3QgZ2V0U3ltYm9sQWRkcmVzcyhjb25zdCBNQ1N5bWJvbCAmUywgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCkgY29uc3Q7CisKKyAgdWludDY0X3QgZ2V0RnJhZ21lbnRBZGRyZXNzKGNvbnN0IE1DRnJhZ21lbnQgKkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCkgY29uc3Q7CisKKyAgdWludDY0X3QgZ2V0UGFkZGluZ1NpemUoY29uc3QgTUNTZWN0aW9uICpTRCwgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCkgY29uc3Q7CisKKyAgYm9vbCBkb2VzU3ltYm9sUmVxdWlyZUV4dGVyblJlbG9jYXRpb24oY29uc3QgTUNTeW1ib2wgJlMpOworCisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBUYXJnZXQgV3JpdGVyIFByb3h5IEFjY2Vzc29ycworICAvLy8gQHsKKworICBib29sIGlzNjRCaXQoKSBjb25zdCB7IHJldHVybiBUYXJnZXRPYmplY3RXcml0ZXItPmlzNjRCaXQoKTsgfQorICBib29sIGlzWDg2XzY0KCkgY29uc3QgeworICAgIHVpbnQzMl90IENQVVR5cGUgPSBUYXJnZXRPYmplY3RXcml0ZXItPmdldENQVVR5cGUoKTsKKyAgICByZXR1cm4gQ1BVVHlwZSA9PSBNYWNoTzo6Q1BVX1RZUEVfWDg2XzY0OworICB9CisKKyAgLy8vIEB9CisKKyAgdm9pZCB3cml0ZUhlYWRlcihNYWNoTzo6SGVhZGVyRmlsZVR5cGUgVHlwZSwgdW5zaWduZWQgTnVtTG9hZENvbW1hbmRzLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExvYWRDb21tYW5kc1NpemUsIGJvb2wgU3Vic2VjdGlvbnNWaWFTeW1ib2xzKTsKKworICAvLy8gV3JpdGUgYSBzZWdtZW50IGxvYWQgY29tbWFuZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gTnVtU2VjdGlvbnMgVGhlIG51bWJlciBvZiBzZWN0aW9ucyBpbiB0aGlzIHNlZ21lbnQuCisgIC8vLyBccGFyYW0gU2VjdGlvbkRhdGFTaXplIFRoZSB0b3RhbCBzaXplIG9mIHRoZSBzZWN0aW9ucy4KKyAgdm9pZCB3cml0ZVNlZ21lbnRMb2FkQ29tbWFuZChTdHJpbmdSZWYgTmFtZSwgdW5zaWduZWQgTnVtU2VjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVk1BZGRyLCB1aW50NjRfdCBWTVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2VjdGlvbkRhdGFTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTZWN0aW9uRGF0YVNpemUsIHVpbnQzMl90IE1heFByb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5pdFByb3QpOworCisgIHZvaWQgd3JpdGVTZWN0aW9uKGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQsIGNvbnN0IE1DU2VjdGlvbiAmU2VjLAorICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBWTUFkZHIsIHVpbnQ2NF90IEZpbGVPZmZzZXQsIHVuc2lnbmVkIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBSZWxvY2F0aW9uc1N0YXJ0LCB1bnNpZ25lZCBOdW1SZWxvY2F0aW9ucyk7CisKKyAgdm9pZCB3cml0ZVN5bXRhYkxvYWRDb21tYW5kKHVpbnQzMl90IFN5bWJvbE9mZnNldCwgdWludDMyX3QgTnVtU3ltYm9scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFN0cmluZ1RhYmxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU3RyaW5nVGFibGVTaXplKTsKKworICB2b2lkIHdyaXRlRHlzeW10YWJMb2FkQ29tbWFuZCgKKyAgICAgIHVpbnQzMl90IEZpcnN0TG9jYWxTeW1ib2wsIHVpbnQzMl90IE51bUxvY2FsU3ltYm9scywKKyAgICAgIHVpbnQzMl90IEZpcnN0RXh0ZXJuYWxTeW1ib2wsIHVpbnQzMl90IE51bUV4dGVybmFsU3ltYm9scywKKyAgICAgIHVpbnQzMl90IEZpcnN0VW5kZWZpbmVkU3ltYm9sLCB1aW50MzJfdCBOdW1VbmRlZmluZWRTeW1ib2xzLAorICAgICAgdWludDMyX3QgSW5kaXJlY3RTeW1ib2xPZmZzZXQsIHVpbnQzMl90IE51bUluZGlyZWN0U3ltYm9scyk7CisKKyAgdm9pZCB3cml0ZU5saXN0KE1hY2hTeW1ib2xEYXRhICZNU0QsIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQpOworCisgIHZvaWQgd3JpdGVMaW5rZWRpdExvYWRDb21tYW5kKHVpbnQzMl90IFR5cGUsIHVpbnQzMl90IERhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERhdGFTaXplKTsKKworICB2b2lkIHdyaXRlTGlua2VyT3B0aW9uc0xvYWRDb21tYW5kKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmT3B0aW9ucyk7CisKKyAgLy8gRklYTUU6IFdlIHJlYWxseSBuZWVkIHRvIGltcHJvdmUgdGhlIHJlbG9jYXRpb24gdmFsaWRhdGlvbi4gQmFzaWNhbGx5LCB3ZQorICAvLyB3YW50IHRvIGltcGxlbWVudCBhIHNlcGFyYXRlIGNvbXB1dGF0aW9uIHdoaWNoIGV2YWx1YXRlcyB0aGUgcmVsb2NhdGlvbgorICAvLyBlbnRyeSBhcyB0aGUgbGlua2VyIHdvdWxkLCBhbmQgdmVyaWZpZXMgdGhhdCB0aGUgcmVzdWx0YW50IGZpeHVwIHZhbHVlIGlzCisgIC8vIGV4YWN0bHkgd2hhdCB0aGUgZW5jb2RlciB3YW50ZWQuIFRoaXMgd2lsbCBjYXRjaCBzZXZlcmFsIGNsYXNzZXMgb2YKKyAgLy8gcHJvYmxlbXM6CisgIC8vCisgIC8vICAtIFJlbG9jYXRpb24gZW50cnkgYnVncywgdGhlIHR3byBhbGdvcml0aG1zIGFyZSB1bmxpa2VseSB0byBoYXZlIHRoZSBzYW1lCisgIC8vICAgIGV4YWN0IGJ1Zy4KKyAgLy8KKyAgLy8gIC0gUmVsYXhhdGlvbiBpc3N1ZXMsIHdoZXJlIHdlIGZvcmdldCB0byByZWxheCBzb21ldGhpbmcuCisgIC8vCisgIC8vICAtIElucHV0IGVycm9ycywgd2hlcmUgc29tZXRoaW5nIGNhbm5vdCBiZSBjb3JyZWN0bHkgZW5jb2RlZC4gJ2FzJyBhbGxvd3MKKyAgLy8gICAgdGhlc2UgdGhyb3VnaCBpbiBtYW55IGNhc2VzLgorCisgIC8vIEFkZCBhIHJlbG9jYXRpb24gdG8gYmUgb3V0cHV0IGluIHRoZSBvYmplY3QgZmlsZS4gQXQgdGhlIHRpbWUgdGhpcyBpcworICAvLyBjYWxsZWQsIHRoZSBzeW1ib2wgaW5kZXhlcyBhcmUgbm90IGtub3csIHNvIGlmIHRoZSByZWxvY2F0aW9uIHJlZmVycworICAvLyB0byBhIHN5bWJvbCBpdCBzaG91bGQgYmUgcGFzc2VkIGFzIFxwIFJlbFN5bWJvbCBzbyB0aGF0IGl0IGNhbiBiZSB1cGRhdGVkCisgIC8vIGFmdGVyd2FyZHMuIElmIHRoZSByZWxvY2F0aW9uIGRvZXNuJ3QgcmVmZXIgdG8gYSBzeW1ib2wsIG51bGxwdHIgc2hvdWxkIGJlCisgIC8vIHVzZWQuCisgIHZvaWQgYWRkUmVsb2NhdGlvbihjb25zdCBNQ1N5bWJvbCAqUmVsU3ltYm9sLCBjb25zdCBNQ1NlY3Rpb24gKlNlYywKKyAgICAgICAgICAgICAgICAgICAgIE1hY2hPOjphbnlfcmVsb2NhdGlvbl9pbmZvICZNUkUpIHsKKyAgICBSZWxBbmRTeW1ib2wgUChSZWxTeW1ib2wsIE1SRSk7CisgICAgUmVsb2NhdGlvbnNbU2VjXS5wdXNoX2JhY2soUCk7CisgIH0KKworICB2b2lkIHJlY29yZFNjYXR0ZXJlZFJlbG9jYXRpb24oY29uc3QgTUNBc3NlbWJsZXIgJkFzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZyYWdtZW50ICpGcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRml4dXAgJkZpeHVwLCBNQ1ZhbHVlIFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExvZzJTaXplLCB1aW50NjRfdCAmRml4ZWRWYWx1ZSk7CisKKyAgdm9pZCByZWNvcmRUTFZQUmVsb2NhdGlvbihjb25zdCBNQ0Fzc2VtYmxlciAmQXNtLCBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRnJhZ21lbnQgKkZyYWdtZW50LCBjb25zdCBNQ0ZpeHVwICZGaXh1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1ZhbHVlIFRhcmdldCwgdWludDY0X3QgJkZpeGVkVmFsdWUpOworCisgIHZvaWQgcmVjb3JkUmVsb2NhdGlvbihNQ0Fzc2VtYmxlciAmQXNtLCBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGcmFnbWVudCAqRnJhZ21lbnQsIGNvbnN0IE1DRml4dXAgJkZpeHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgTUNWYWx1ZSBUYXJnZXQsIHVpbnQ2NF90ICZGaXhlZFZhbHVlKSBvdmVycmlkZTsKKworICB2b2lkIGJpbmRJbmRpcmVjdFN5bWJvbHMoTUNBc3NlbWJsZXIgJkFzbSk7CisKKyAgLy8vIENvbXB1dGUgdGhlIHN5bWJvbCB0YWJsZSBkYXRhLgorICB2b2lkIGNvbXB1dGVTeW1ib2xUYWJsZShNQ0Fzc2VtYmxlciAmQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYWNoU3ltYm9sRGF0YT4gJkxvY2FsU3ltYm9sRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaFN5bWJvbERhdGE+ICZFeHRlcm5hbFN5bWJvbERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hY2hTeW1ib2xEYXRhPiAmVW5kZWZpbmVkU3ltYm9sRGF0YSk7CisKKyAgdm9pZCBjb21wdXRlU2VjdGlvbkFkZHJlc3Nlcyhjb25zdCBNQ0Fzc2VtYmxlciAmQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQpOworCisgIHZvaWQgZXhlY3V0ZVBvc3RMYXlvdXRCaW5kaW5nKE1DQXNzZW1ibGVyICZBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQpIG92ZXJyaWRlOworCisgIGJvb2wgaXNTeW1ib2xSZWZEaWZmZXJlbmNlRnVsbHlSZXNvbHZlZEltcGwoY29uc3QgTUNBc3NlbWJsZXIgJkFzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAmQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAmQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluU2V0KSBjb25zdCBvdmVycmlkZTsKKworICBib29sIGlzU3ltYm9sUmVmRGlmZmVyZW5jZUZ1bGx5UmVzb2x2ZWRJbXBsKGNvbnN0IE1DQXNzZW1ibGVyICZBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgJlN5bUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGcmFnbWVudCAmRkIsIGJvb2wgSW5TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1BDUmVsKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIHdyaXRlT2JqZWN0KE1DQXNzZW1ibGVyICZBc20sIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQpIG92ZXJyaWRlOworfTsKKworLy8vIENvbnN0cnVjdCBhIG5ldyBNYWNoLU8gd3JpdGVyIGluc3RhbmNlLgorLy8vCisvLy8gVGhpcyByb3V0aW5lIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgdGFyZ2V0IHdyaXRlciBzdWJjbGFzcy4KKy8vLworLy8vIFxwYXJhbSBNT1RXIC0gVGhlIHRhcmdldCBzcGVjaWZpYyBNYWNoLU8gd3JpdGVyIHN1YmNsYXNzLgorLy8vIFxwYXJhbSBPUyAtIFRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uCisvLy8gXHJldHVybnMgVGhlIGNvbnN0cnVjdGVkIG9iamVjdCB3cml0ZXIuCitzdGQ6OnVuaXF1ZV9wdHI8TUNPYmplY3RXcml0ZXI+CitjcmVhdGVNYWNoT2JqZWN0V3JpdGVyKHN0ZDo6dW5pcXVlX3B0cjxNQ01hY2hPYmplY3RUYXJnZXRXcml0ZXI+IE1PVFcsCisgICAgICAgICAgICAgICAgICAgICAgIHJhd19wd3JpdGVfc3RyZWFtICZPUywgYm9vbCBJc0xpdHRsZUVuZGlhbik7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DTUFDSE9CSkVDVFdSSVRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DT2JqZWN0RmlsZUluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNPYmplY3RGaWxlSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OWYyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DT2JqZWN0RmlsZUluZm8uaApAQCAtMCwwICsxLDM4MyBAQAorLy89PT0tLSBsbHZtL01DL01DT2JqZWN0RmlsZUluZm8uaCAtIE9iamVjdCBGaWxlIEluZm8gLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIGNvbW1vbiBvYmplY3QgZmlsZSBmb3JtYXRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ09CSkVDVEZJTEVJTkZPX0gKKyNkZWZpbmUgTExWTV9NQ19NQ09CSkVDVEZJTEVJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db2RlR2VuLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DU2VjdGlvbjsKKworY2xhc3MgTUNPYmplY3RGaWxlSW5mbyB7Citwcm90ZWN0ZWQ6CisgIC8vLyBUcnVlIGlmIC5jb21tIHN1cHBvcnRzIGFsaWdubWVudC4gIFRoaXMgaXMgYSBoYWNrIGZvciBhcyBsb25nIGFzIHdlCisgIC8vLyBzdXBwb3J0IDEwLjQgVGlnZXIsIHdob3NlIGFzc2VtYmxlciBkb2Vzbid0IHN1cHBvcnQgYWxpZ25tZW50IG9uIGNvbW0uCisgIGJvb2wgQ29tbURpcmVjdGl2ZVN1cHBvcnRzQWxpZ25tZW50OworCisgIC8vLyBUcnVlIGlmIHRhcmdldCBvYmplY3QgZmlsZSBzdXBwb3J0cyBhIHdlYWtfZGVmaW5pdGlvbiBvZiBjb25zdGFudCAwIGZvciBhbgorICAvLy8gb21pdHRlZCBFSCBmcmFtZS4KKyAgYm9vbCBTdXBwb3J0c1dlYWtPbWl0dGVkRUhGcmFtZTsKKworICAvLy8gVHJ1ZSBpZiB0aGUgdGFyZ2V0IG9iamVjdCBmaWxlIHN1cHBvcnRzIGVtaXR0aW5nIGEgY29tcGFjdCB1bndpbmQgc2VjdGlvbgorICAvLy8gd2l0aG91dCBhbiBhc3NvY2lhdGVkIEVIIGZyYW1lIHNlY3Rpb24uCisgIGJvb2wgU3VwcG9ydHNDb21wYWN0VW53aW5kV2l0aG91dEVIRnJhbWU7CisKKyAgLy8vIE9taXREd2FyZklmSGF2ZUNvbXBhY3RVbndpbmQgLSBUcnVlIGlmIHRoZSB0YXJnZXQgb2JqZWN0IGZpbGUKKyAgLy8vIHN1cHBvcnRzIGhhdmluZyBzb21lIGZ1bmN0aW9ucyB3aXRoIGNvbXBhY3QgdW53aW5kIGFuZCBvdGhlciB3aXRoCisgIC8vLyBkd2FyZiB1bndpbmQuCisgIGJvb2wgT21pdER3YXJmSWZIYXZlQ29tcGFjdFVud2luZDsKKworICAvLy8gUGVyc29uYWxpdHlFbmNvZGluZywgTFNEQUVuY29kaW5nLCBUVHlwZUVuY29kaW5nIC0gU29tZSBlbmNvZGluZyB2YWx1ZXMKKyAgLy8vIGZvciBFSC4KKyAgdW5zaWduZWQgUGVyc29uYWxpdHlFbmNvZGluZzsKKyAgdW5zaWduZWQgTFNEQUVuY29kaW5nOworICB1bnNpZ25lZCBGREVDRklFbmNvZGluZzsKKyAgdW5zaWduZWQgVFR5cGVFbmNvZGluZzsKKworICAvLy8gQ29tcGFjdCB1bndpbmQgZW5jb2RpbmcgaW5kaWNhdGluZyB0aGF0IHdlIHNob3VsZCBlbWl0IG9ubHkgYW4gRUggZnJhbWUuCisgIHVuc2lnbmVkIENvbXBhY3RVbndpbmREd2FyZkVIRnJhbWVPbmx5OworCisgIC8vLyBTZWN0aW9uIGRpcmVjdGl2ZSBmb3Igc3RhbmRhcmQgdGV4dC4KKyAgTUNTZWN0aW9uICpUZXh0U2VjdGlvbjsKKworICAvLy8gU2VjdGlvbiBkaXJlY3RpdmUgZm9yIHN0YW5kYXJkIGRhdGEuCisgIE1DU2VjdGlvbiAqRGF0YVNlY3Rpb247CisKKyAgLy8vIFNlY3Rpb24gdGhhdCBpcyBkZWZhdWx0IGluaXRpYWxpemVkIHRvIHplcm8uCisgIE1DU2VjdGlvbiAqQlNTU2VjdGlvbjsKKworICAvLy8gU2VjdGlvbiB0aGF0IGlzIHJlYWRvbmx5IGFuZCBjYW4gY29udGFpbiBhcmJpdHJhcnkgaW5pdGlhbGl6ZWQgZGF0YS4KKyAgLy8vIFRhcmdldHMgYXJlIG5vdCByZXF1aXJlZCB0byBoYXZlIGEgcmVhZG9ubHkgc2VjdGlvbi4gSWYgdGhleSBkb24ndCwKKyAgLy8vIHZhcmlvdXMgYml0cyBvZiBjb2RlIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBkYXRhIHNlY3Rpb24gZm9yCisgIC8vLyBjb25zdGFudHMuCisgIE1DU2VjdGlvbiAqUmVhZE9ubHlTZWN0aW9uOworCisgIC8vLyBJZiBleGNlcHRpb24gaGFuZGxpbmcgaXMgc3VwcG9ydGVkIGJ5IHRoZSB0YXJnZXQsIHRoaXMgaXMgdGhlIHNlY3Rpb24gdGhlCisgIC8vLyBMYW5ndWFnZSBTcGVjaWZpYyBEYXRhIEFyZWEgaW5mb3JtYXRpb24gaXMgZW1pdHRlZCB0by4KKyAgTUNTZWN0aW9uICpMU0RBU2VjdGlvbjsKKworICAvLy8gSWYgZXhjZXB0aW9uIGhhbmRsaW5nIGlzIHN1cHBvcnRlZCBieSB0aGUgdGFyZ2V0IGFuZCB0aGUgdGFyZ2V0IGNhbgorICAvLy8gc3VwcG9ydCBhIGNvbXBhY3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIENJRSBhbmQgRkRFLCB0aGlzIGlzIHRoZSBzZWN0aW9uCisgIC8vLyB0byBlbWl0IHRoZW0gaW50by4KKyAgTUNTZWN0aW9uICpDb21wYWN0VW53aW5kU2VjdGlvbjsKKworICAvLyBEd2FyZiBzZWN0aW9ucyBmb3IgZGVidWcgaW5mby4gIElmIGEgdGFyZ2V0IHN1cHBvcnRzIGRlYnVnIGluZm8sIHRoZXNlIG11c3QKKyAgLy8gYmUgc2V0LgorICBNQ1NlY3Rpb24gKkR3YXJmQWJicmV2U2VjdGlvbjsKKyAgTUNTZWN0aW9uICpEd2FyZkluZm9TZWN0aW9uOworICBNQ1NlY3Rpb24gKkR3YXJmTGluZVNlY3Rpb247CisgIE1DU2VjdGlvbiAqRHdhcmZMaW5lU3RyU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpEd2FyZkZyYW1lU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpEd2FyZlB1YlR5cGVzU2VjdGlvbjsKKyAgY29uc3QgTUNTZWN0aW9uICpEd2FyZkRlYnVnSW5saW5lU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpEd2FyZlN0clNlY3Rpb247CisgIE1DU2VjdGlvbiAqRHdhcmZMb2NTZWN0aW9uOworICBNQ1NlY3Rpb24gKkR3YXJmQVJhbmdlc1NlY3Rpb247CisgIE1DU2VjdGlvbiAqRHdhcmZSYW5nZXNTZWN0aW9uOworICBNQ1NlY3Rpb24gKkR3YXJmTWFjaW5mb1NlY3Rpb247CisgIC8vIFRoZSBwdWJuYW1lcyBzZWN0aW9uIGlzIG5vIGxvbmdlciBnZW5lcmF0ZWQgYnkgZGVmYXVsdC4gIFRoZSBnZW5lcmF0aW9uCisgIC8vIGNhbiBiZSBlbmFibGVkIGJ5IGEgY29tcGlsZXIgZmxhZy4KKyAgTUNTZWN0aW9uICpEd2FyZlB1Yk5hbWVzU2VjdGlvbjsKKworICAvLy8gRFdBUkY1IEV4cGVyaW1lbnRhbCBEZWJ1ZyBJbmZvIFNlY3Rpb25zCisgIC8vLyBEd2FyZkFjY2VsTmFtZXNTZWN0aW9uLCBEd2FyZkFjY2VsT2JqQ1NlY3Rpb24sCisgIC8vLyBEd2FyZkFjY2VsTmFtZXNwYWNlU2VjdGlvbiwgRHdhcmZBY2NlbFR5cGVzU2VjdGlvbiAtCisgIC8vLyBJZiB3ZSB1c2UgdGhlIERXQVJGIGFjY2VsZXJhdGVkIGhhc2ggdGFibGVzIHRoZW4gd2Ugd2FudCB0byBlbWl0IHRoZXNlCisgIC8vLyBzZWN0aW9ucy4KKyAgTUNTZWN0aW9uICpEd2FyZkFjY2VsTmFtZXNTZWN0aW9uOworICBNQ1NlY3Rpb24gKkR3YXJmQWNjZWxPYmpDU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpEd2FyZkFjY2VsTmFtZXNwYWNlU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpEd2FyZkFjY2VsVHlwZXNTZWN0aW9uOworCisgIC8vIFRoZXNlIGFyZSB1c2VkIGZvciB0aGUgRmlzc2lvbiBzZXBhcmF0ZSBkZWJ1ZyBpbmZvcm1hdGlvbiBmaWxlcy4KKyAgTUNTZWN0aW9uICpEd2FyZkluZm9EV09TZWN0aW9uOworICBNQ1NlY3Rpb24gKkR3YXJmVHlwZXNEV09TZWN0aW9uOworICBNQ1NlY3Rpb24gKkR3YXJmQWJicmV2RFdPU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpEd2FyZlN0ckRXT1NlY3Rpb247CisgIE1DU2VjdGlvbiAqRHdhcmZMaW5lRFdPU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpEd2FyZkxvY0RXT1NlY3Rpb247CisgIE1DU2VjdGlvbiAqRHdhcmZTdHJPZmZEV09TZWN0aW9uOworCisgIC8vLyBUaGUgRFdBUkYgdjUgc3RyaW5nIG9mZnNldCBhbmQgYWRkcmVzcyB0YWJsZSBzZWN0aW9ucy4KKyAgTUNTZWN0aW9uICpEd2FyZlN0ck9mZlNlY3Rpb247CisgIE1DU2VjdGlvbiAqRHdhcmZBZGRyU2VjdGlvbjsKKworICAvLyBUaGVzZSBhcmUgZm9yIEZpc3Npb24gRFdQIGZpbGVzLgorICBNQ1NlY3Rpb24gKkR3YXJmQ1VJbmRleFNlY3Rpb247CisgIE1DU2VjdGlvbiAqRHdhcmZUVUluZGV4U2VjdGlvbjsKKworICAvLy8gU2VjdGlvbiBmb3IgbmV3ZXIgZ251IHB1Ym5hbWVzLgorICBNQ1NlY3Rpb24gKkR3YXJmR251UHViTmFtZXNTZWN0aW9uOworICAvLy8gU2VjdGlvbiBmb3IgbmV3ZXIgZ251IHB1YnR5cGVzLgorICBNQ1NlY3Rpb24gKkR3YXJmR251UHViVHlwZXNTZWN0aW9uOworCisgIC8vIFNlY3Rpb24gZm9yIFN3aWZ0IEFTVAorICBNQ1NlY3Rpb24gKkR3YXJmU3dpZnRBU1RTZWN0aW9uOworCisgIE1DU2VjdGlvbiAqQ09GRkRlYnVnU3ltYm9sc1NlY3Rpb247CisgIE1DU2VjdGlvbiAqQ09GRkRlYnVnVHlwZXNTZWN0aW9uOworICBNQ1NlY3Rpb24gKkNPRkZHbG9iYWxUeXBlSGFzaGVzU2VjdGlvbjsKKworICAvLy8gRXh0cmEgVExTIFZhcmlhYmxlIERhdGEgc2VjdGlvbi4KKyAgLy8vCisgIC8vLyBJZiB0aGUgdGFyZ2V0IG5lZWRzIHRvIHB1dCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBhIFRMUyB2YXJpYWJsZSwKKyAgLy8vIGl0J2xsIGdvIGhlcmUuCisgIE1DU2VjdGlvbiAqVExTRXh0cmFEYXRhU2VjdGlvbjsKKworICAvLy8gU2VjdGlvbiBkaXJlY3RpdmUgZm9yIFRocmVhZCBMb2NhbCBkYXRhLiBFTEYsIE1hY2hPLCBDT0ZGLCBhbmQgV2FzbS4KKyAgTUNTZWN0aW9uICpUTFNEYXRhU2VjdGlvbjsgLy8gRGVmYXVsdHMgdG8gIi50ZGF0YSIuCisKKyAgLy8vIFNlY3Rpb24gZGlyZWN0aXZlIGZvciBUaHJlYWQgTG9jYWwgdW5pbml0aWFsaXplZCBkYXRhLgorICAvLy8KKyAgLy8vIE51bGwgaWYgdGhpcyB0YXJnZXQgZG9lc24ndCBzdXBwb3J0IGEgQlNTIHNlY3Rpb24uIEVMRiBhbmQgTWFjaE8gb25seS4KKyAgTUNTZWN0aW9uICpUTFNCU1NTZWN0aW9uOyAvLyBEZWZhdWx0cyB0byAiLnRic3MiLgorCisgIC8vLyBTdGFja01hcCBzZWN0aW9uLgorICBNQ1NlY3Rpb24gKlN0YWNrTWFwU2VjdGlvbjsKKworICAvLy8gRmF1bHRNYXAgc2VjdGlvbi4KKyAgTUNTZWN0aW9uICpGYXVsdE1hcFNlY3Rpb247CisKKyAgLy8vIEVIIGZyYW1lIHNlY3Rpb24uCisgIC8vLworICAvLy8gSXQgaXMgaW5pdGlhbGl6ZWQgb24gZGVtYW5kIHNvIGl0IGNhbiBiZSBvdmVyd3JpdHRlbiAod2l0aCB1bmlxdWluZykuCisgIE1DU2VjdGlvbiAqRUhGcmFtZVNlY3Rpb247CisKKyAgLy8vIFNlY3Rpb24gY29udGFpbmluZyBtZXRhZGF0YSBvbiBmdW5jdGlvbiBzdGFjayBzaXplcy4KKyAgTUNTZWN0aW9uICpTdGFja1NpemVzU2VjdGlvbjsKKworICAvLyBFTEYgc3BlY2lmaWMgc2VjdGlvbnMuCisgIE1DU2VjdGlvbiAqRGF0YVJlbFJPU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpNZXJnZWFibGVDb25zdDRTZWN0aW9uOworICBNQ1NlY3Rpb24gKk1lcmdlYWJsZUNvbnN0OFNlY3Rpb247CisgIE1DU2VjdGlvbiAqTWVyZ2VhYmxlQ29uc3QxNlNlY3Rpb247CisgIE1DU2VjdGlvbiAqTWVyZ2VhYmxlQ29uc3QzMlNlY3Rpb247CisKKyAgLy8gTWFjaE8gc3BlY2lmaWMgc2VjdGlvbnMuCisKKyAgLy8vIFNlY3Rpb24gZm9yIHRocmVhZCBsb2NhbCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24uCisgIC8vLworICAvLy8gQ29udGFpbnMgdGhlIHNvdXJjZSBjb2RlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLCB2aXNpYmlsaXR5IGFuZCBhIHBvaW50ZXIgdG8KKyAgLy8vIHRoZSBpbml0aWFsIHZhbHVlICgudGRhdGEgb3IgLnRic3MpLgorICBNQ1NlY3Rpb24gKlRMU1RMVlNlY3Rpb247IC8vIERlZmF1bHRzIHRvICIudGx2Ii4KKworICAvLy8gU2VjdGlvbiBmb3IgdGhyZWFkIGxvY2FsIGRhdGEgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLgorICBjb25zdCBNQ1NlY3Rpb24gKlRMU1RocmVhZEluaXRTZWN0aW9uOyAvLyBEZWZhdWx0cyB0byAiLnRocmVhZF9pbml0X2Z1bmMiLgorCisgIE1DU2VjdGlvbiAqQ1N0cmluZ1NlY3Rpb247CisgIE1DU2VjdGlvbiAqVVN0cmluZ1NlY3Rpb247CisgIE1DU2VjdGlvbiAqVGV4dENvYWxTZWN0aW9uOworICBNQ1NlY3Rpb24gKkNvbnN0VGV4dENvYWxTZWN0aW9uOworICBNQ1NlY3Rpb24gKkNvbnN0RGF0YVNlY3Rpb247CisgIE1DU2VjdGlvbiAqRGF0YUNvYWxTZWN0aW9uOworICBNQ1NlY3Rpb24gKkRhdGFDb21tb25TZWN0aW9uOworICBNQ1NlY3Rpb24gKkRhdGFCU1NTZWN0aW9uOworICBNQ1NlY3Rpb24gKkZvdXJCeXRlQ29uc3RhbnRTZWN0aW9uOworICBNQ1NlY3Rpb24gKkVpZ2h0Qnl0ZUNvbnN0YW50U2VjdGlvbjsKKyAgTUNTZWN0aW9uICpTaXh0ZWVuQnl0ZUNvbnN0YW50U2VjdGlvbjsKKyAgTUNTZWN0aW9uICpMYXp5U3ltYm9sUG9pbnRlclNlY3Rpb247CisgIE1DU2VjdGlvbiAqTm9uTGF6eVN5bWJvbFBvaW50ZXJTZWN0aW9uOworICBNQ1NlY3Rpb24gKlRocmVhZExvY2FsUG9pbnRlclNlY3Rpb247CisKKyAgLy8vIENPRkYgc3BlY2lmaWMgc2VjdGlvbnMuCisgIE1DU2VjdGlvbiAqRHJlY3R2ZVNlY3Rpb247CisgIE1DU2VjdGlvbiAqUERhdGFTZWN0aW9uOworICBNQ1NlY3Rpb24gKlhEYXRhU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpTWERhdGFTZWN0aW9uOworICBNQ1NlY3Rpb24gKkdGSURzU2VjdGlvbjsKKworcHVibGljOgorICB2b2lkIEluaXRNQ09iamVjdEZpbGVJbmZvKGNvbnN0IFRyaXBsZSAmVFQsIGJvb2wgUElDLCBNQ0NvbnRleHQgJmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIExhcmdlQ29kZU1vZGVsID0gZmFsc2UpOworCisgIGJvb2wgZ2V0U3VwcG9ydHNXZWFrT21pdHRlZEVIRnJhbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIFN1cHBvcnRzV2Vha09taXR0ZWRFSEZyYW1lOworICB9CisgIGJvb2wgZ2V0U3VwcG9ydHNDb21wYWN0VW53aW5kV2l0aG91dEVIRnJhbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIFN1cHBvcnRzQ29tcGFjdFVud2luZFdpdGhvdXRFSEZyYW1lOworICB9CisgIGJvb2wgZ2V0T21pdER3YXJmSWZIYXZlQ29tcGFjdFVud2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gT21pdER3YXJmSWZIYXZlQ29tcGFjdFVud2luZDsKKyAgfQorCisgIGJvb2wgZ2V0Q29tbURpcmVjdGl2ZVN1cHBvcnRzQWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBDb21tRGlyZWN0aXZlU3VwcG9ydHNBbGlnbm1lbnQ7CisgIH0KKworICB1bnNpZ25lZCBnZXRQZXJzb25hbGl0eUVuY29kaW5nKCkgY29uc3QgeyByZXR1cm4gUGVyc29uYWxpdHlFbmNvZGluZzsgfQorICB1bnNpZ25lZCBnZXRMU0RBRW5jb2RpbmcoKSBjb25zdCB7IHJldHVybiBMU0RBRW5jb2Rpbmc7IH0KKyAgdW5zaWduZWQgZ2V0RkRFRW5jb2RpbmcoKSBjb25zdCB7IHJldHVybiBGREVDRklFbmNvZGluZzsgfQorICB1bnNpZ25lZCBnZXRUVHlwZUVuY29kaW5nKCkgY29uc3QgeyByZXR1cm4gVFR5cGVFbmNvZGluZzsgfQorCisgIHVuc2lnbmVkIGdldENvbXBhY3RVbndpbmREd2FyZkVIRnJhbWVPbmx5KCkgY29uc3QgeworICAgIHJldHVybiBDb21wYWN0VW53aW5kRHdhcmZFSEZyYW1lT25seTsKKyAgfQorCisgIE1DU2VjdGlvbiAqZ2V0VGV4dFNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBUZXh0U2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldERhdGFTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRGF0YVNlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXRCU1NTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gQlNTU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldFJlYWRPbmx5U2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIFJlYWRPbmx5U2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldExTREFTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gTFNEQVNlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXRDb21wYWN0VW53aW5kU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIENvbXBhY3RVbndpbmRTZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0RHdhcmZBYmJyZXZTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZBYmJyZXZTZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0RHdhcmZJbmZvU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmSW5mb1NlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZkxpbmVTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZMaW5lU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldER3YXJmTGluZVN0clNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZkxpbmVTdHJTZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0RHdhcmZGcmFtZVNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZkZyYW1lU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldER3YXJmUHViTmFtZXNTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZQdWJOYW1lc1NlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZlB1YlR5cGVzU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmUHViVHlwZXNTZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0RHdhcmZHbnVQdWJOYW1lc1NlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIER3YXJmR251UHViTmFtZXNTZWN0aW9uOworICB9CisgIE1DU2VjdGlvbiAqZ2V0RHdhcmZHbnVQdWJUeXBlc1NlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIER3YXJmR251UHViVHlwZXNTZWN0aW9uOworICB9CisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0RHdhcmZEZWJ1Z0lubGluZVNlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIER3YXJmRGVidWdJbmxpbmVTZWN0aW9uOworICB9CisgIE1DU2VjdGlvbiAqZ2V0RHdhcmZTdHJTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZTdHJTZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0RHdhcmZMb2NTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZMb2NTZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0RHdhcmZBUmFuZ2VzU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmQVJhbmdlc1NlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZlJhbmdlc1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZlJhbmdlc1NlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZk1hY2luZm9TZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZNYWNpbmZvU2VjdGlvbjsgfQorCisgIC8vIERXQVJGNSBFeHBlcmltZW50YWwgRGVidWcgSW5mbyBTZWN0aW9ucworICBNQ1NlY3Rpb24gKmdldER3YXJmQWNjZWxOYW1lc1NlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIER3YXJmQWNjZWxOYW1lc1NlY3Rpb247CisgIH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZkFjY2VsT2JqQ1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZkFjY2VsT2JqQ1NlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZkFjY2VsTmFtZXNwYWNlU2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gRHdhcmZBY2NlbE5hbWVzcGFjZVNlY3Rpb247CisgIH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZkFjY2VsVHlwZXNTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBEd2FyZkFjY2VsVHlwZXNTZWN0aW9uOworICB9CisgIE1DU2VjdGlvbiAqZ2V0RHdhcmZJbmZvRFdPU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmSW5mb0RXT1NlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZlR5cGVzU2VjdGlvbih1aW50NjRfdCBIYXNoKSBjb25zdDsKKyAgTUNTZWN0aW9uICpnZXREd2FyZlR5cGVzRFdPU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmVHlwZXNEV09TZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0RHdhcmZBYmJyZXZEV09TZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZBYmJyZXZEV09TZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0RHdhcmZTdHJEV09TZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZTdHJEV09TZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0RHdhcmZMaW5lRFdPU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmTGluZURXT1NlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZkxvY0RXT1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZkxvY0RXT1NlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZlN0ck9mZkRXT1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZlN0ck9mZkRXT1NlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZlN0ck9mZlNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZlN0ck9mZlNlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZkFkZHJTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZBZGRyU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldER3YXJmQ1VJbmRleFNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZkNVSW5kZXhTZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0RHdhcmZUVUluZGV4U2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmVFVJbmRleFNlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZlN3aWZ0QVNUU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmU3dpZnRBU1RTZWN0aW9uOyB9CisKKyAgTUNTZWN0aW9uICpnZXRDT0ZGRGVidWdTeW1ib2xzU2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gQ09GRkRlYnVnU3ltYm9sc1NlY3Rpb247CisgIH0KKyAgTUNTZWN0aW9uICpnZXRDT0ZGRGVidWdUeXBlc1NlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIENPRkZEZWJ1Z1R5cGVzU2VjdGlvbjsKKyAgfQorICBNQ1NlY3Rpb24gKmdldENPRkZHbG9iYWxUeXBlSGFzaGVzU2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gQ09GRkdsb2JhbFR5cGVIYXNoZXNTZWN0aW9uOworICB9CisKKyAgTUNTZWN0aW9uICpnZXRUTFNFeHRyYURhdGFTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gVExTRXh0cmFEYXRhU2VjdGlvbjsgfQorICBjb25zdCBNQ1NlY3Rpb24gKmdldFRMU0RhdGFTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gVExTRGF0YVNlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXRUTFNCU1NTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gVExTQlNTU2VjdGlvbjsgfQorCisgIE1DU2VjdGlvbiAqZ2V0U3RhY2tNYXBTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gU3RhY2tNYXBTZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0RmF1bHRNYXBTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRmF1bHRNYXBTZWN0aW9uOyB9CisKKyAgTUNTZWN0aW9uICpnZXRTdGFja1NpemVzU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIFN0YWNrU2l6ZXNTZWN0aW9uOyB9CisKKyAgLy8gRUxGIHNwZWNpZmljIHNlY3Rpb25zLgorICBNQ1NlY3Rpb24gKmdldERhdGFSZWxST1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEYXRhUmVsUk9TZWN0aW9uOyB9CisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0TWVyZ2VhYmxlQ29uc3Q0U2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gTWVyZ2VhYmxlQ29uc3Q0U2VjdGlvbjsKKyAgfQorICBjb25zdCBNQ1NlY3Rpb24gKmdldE1lcmdlYWJsZUNvbnN0OFNlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIE1lcmdlYWJsZUNvbnN0OFNlY3Rpb247CisgIH0KKyAgY29uc3QgTUNTZWN0aW9uICpnZXRNZXJnZWFibGVDb25zdDE2U2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gTWVyZ2VhYmxlQ29uc3QxNlNlY3Rpb247CisgIH0KKyAgY29uc3QgTUNTZWN0aW9uICpnZXRNZXJnZWFibGVDb25zdDMyU2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gTWVyZ2VhYmxlQ29uc3QzMlNlY3Rpb247CisgIH0KKworICAvLyBNYWNoTyBzcGVjaWZpYyBzZWN0aW9ucy4KKyAgY29uc3QgTUNTZWN0aW9uICpnZXRUTFNUTFZTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gVExTVExWU2VjdGlvbjsgfQorICBjb25zdCBNQ1NlY3Rpb24gKmdldFRMU1RocmVhZEluaXRTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBUTFNUaHJlYWRJbml0U2VjdGlvbjsKKyAgfQorICBjb25zdCBNQ1NlY3Rpb24gKmdldENTdHJpbmdTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gQ1N0cmluZ1NlY3Rpb247IH0KKyAgY29uc3QgTUNTZWN0aW9uICpnZXRVU3RyaW5nU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIFVTdHJpbmdTZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0VGV4dENvYWxTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gVGV4dENvYWxTZWN0aW9uOyB9CisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0Q29uc3RUZXh0Q29hbFNlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0VGV4dENvYWxTZWN0aW9uOworICB9CisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0Q29uc3REYXRhU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIENvbnN0RGF0YVNlY3Rpb247IH0KKyAgY29uc3QgTUNTZWN0aW9uICpnZXREYXRhQ29hbFNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEYXRhQ29hbFNlY3Rpb247IH0KKyAgY29uc3QgTUNTZWN0aW9uICpnZXREYXRhQ29tbW9uU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIERhdGFDb21tb25TZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0RGF0YUJTU1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEYXRhQlNTU2VjdGlvbjsgfQorICBjb25zdCBNQ1NlY3Rpb24gKmdldEZvdXJCeXRlQ29uc3RhbnRTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBGb3VyQnl0ZUNvbnN0YW50U2VjdGlvbjsKKyAgfQorICBjb25zdCBNQ1NlY3Rpb24gKmdldEVpZ2h0Qnl0ZUNvbnN0YW50U2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gRWlnaHRCeXRlQ29uc3RhbnRTZWN0aW9uOworICB9CisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0U2l4dGVlbkJ5dGVDb25zdGFudFNlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIFNpeHRlZW5CeXRlQ29uc3RhbnRTZWN0aW9uOworICB9CisgIE1DU2VjdGlvbiAqZ2V0TGF6eVN5bWJvbFBvaW50ZXJTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBMYXp5U3ltYm9sUG9pbnRlclNlY3Rpb247CisgIH0KKyAgTUNTZWN0aW9uICpnZXROb25MYXp5U3ltYm9sUG9pbnRlclNlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIE5vbkxhenlTeW1ib2xQb2ludGVyU2VjdGlvbjsKKyAgfQorICBNQ1NlY3Rpb24gKmdldFRocmVhZExvY2FsUG9pbnRlclNlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIFRocmVhZExvY2FsUG9pbnRlclNlY3Rpb247CisgIH0KKworICAvLyBDT0ZGIHNwZWNpZmljIHNlY3Rpb25zLgorICBNQ1NlY3Rpb24gKmdldERyZWN0dmVTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHJlY3R2ZVNlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXRQRGF0YVNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBQRGF0YVNlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXRYRGF0YVNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBYRGF0YVNlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXRTWERhdGFTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gU1hEYXRhU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldEdGSURzU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIEdGSURzU2VjdGlvbjsgfQorCisgIE1DU2VjdGlvbiAqZ2V0RUhGcmFtZVNlY3Rpb24oKSB7CisgICAgcmV0dXJuIEVIRnJhbWVTZWN0aW9uOworICB9CisKKyAgZW51bSBFbnZpcm9ubWVudCB7IElzTWFjaE8sIElzRUxGLCBJc0NPRkYsIElzV2FzbSB9OworICBFbnZpcm9ubWVudCBnZXRPYmplY3RGaWxlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIEVudjsgfQorCisgIGJvb2wgaXNQb3NpdGlvbkluZGVwZW5kZW50KCkgY29uc3QgeyByZXR1cm4gUG9zaXRpb25JbmRlcGVuZGVudDsgfQorCitwcml2YXRlOgorICBFbnZpcm9ubWVudCBFbnY7CisgIGJvb2wgUG9zaXRpb25JbmRlcGVuZGVudDsKKyAgTUNDb250ZXh0ICpDdHg7CisgIFRyaXBsZSBUVDsKKworICB2b2lkIGluaXRNYWNoT01DT2JqZWN0RmlsZUluZm8oY29uc3QgVHJpcGxlICZUKTsKKyAgdm9pZCBpbml0RUxGTUNPYmplY3RGaWxlSW5mbyhjb25zdCBUcmlwbGUgJlQsIGJvb2wgTGFyZ2UpOworICB2b2lkIGluaXRDT0ZGTUNPYmplY3RGaWxlSW5mbyhjb25zdCBUcmlwbGUgJlQpOworICB2b2lkIGluaXRXYXNtTUNPYmplY3RGaWxlSW5mbyhjb25zdCBUcmlwbGUgJlQpOworCitwdWJsaWM6CisgIGNvbnN0IFRyaXBsZSAmZ2V0VGFyZ2V0VHJpcGxlKCkgY29uc3QgeyByZXR1cm4gVFQ7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ09iamVjdFN0cmVhbWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DT2JqZWN0U3RyZWFtZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTliNGFjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ09iamVjdFN0cmVhbWVyLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8vPT09LSBNQ09iamVjdFN0cmVhbWVyLmggLSBNQ1N0cmVhbWVyIE9iamVjdCBGaWxlIEludGVyZmFjZSAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ09CSkVDVFNUUkVBTUVSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ09CSkVDVFNUUkVBTUVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0Fzc2VtYmxlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N0cmVhbWVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1DQXNzZW1ibGVyOworY2xhc3MgTUNDb2RlRW1pdHRlcjsKK2NsYXNzIE1DU3VidGFyZ2V0SW5mbzsKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIE1DRnJhZ21lbnQ7CitjbGFzcyBNQ0RhdGFGcmFnbWVudDsKK2NsYXNzIE1DQXNtQmFja2VuZDsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgcmF3X3B3cml0ZV9zdHJlYW07CisKKy8vLyBcYnJpZWYgU3RyZWFtaW5nIG9iamVjdCBmaWxlIGdlbmVyYXRpb24gaW50ZXJmYWNlLgorLy8vCisvLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUNTdHJlYW1lciBpbnRlcmZhY2Ugd2hpY2ggaXMKKy8vLyBzdWl0YWJsZSBmb3IgdXNlIHdpdGggdGhlIGFzc2VtYmxlciBiYWNrZW5kLiBTcGVjaWZpYyBvYmplY3QgZmlsZSBmb3JtYXRzCisvLy8gYXJlIGV4cGVjdGVkIHRvIHN1YmNsYXNzIHRoaXMgaW50ZXJmYWNlIHRvIGltcGxlbWVudCBkaXJlY3RpdmVzIHNwZWNpZmljCisvLy8gdG8gdGhhdCBmaWxlIGZvcm1hdCBvciBjdXN0b20gc2VtYW50aWNzIGV4cGVjdGVkIGJ5IHRoZSBvYmplY3Qgd3JpdGVyCisvLy8gaW1wbGVtZW50YXRpb24uCitjbGFzcyBNQ09iamVjdFN0cmVhbWVyIDogcHVibGljIE1DU3RyZWFtZXIgeworICBzdGQ6OnVuaXF1ZV9wdHI8TUNPYmplY3RXcml0ZXI+IE9iamVjdFdyaXRlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPE1DQXNtQmFja2VuZD4gVEFCOworICBzdGQ6OnVuaXF1ZV9wdHI8TUNDb2RlRW1pdHRlcj4gRW1pdHRlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPE1DQXNzZW1ibGVyPiBBc3NlbWJsZXI7CisgIE1DU2VjdGlvbjo6aXRlcmF0b3IgQ3VySW5zZXJ0aW9uUG9pbnQ7CisgIGJvb2wgRW1pdEVIRnJhbWU7CisgIGJvb2wgRW1pdERlYnVnRnJhbWU7CisgIFNtYWxsVmVjdG9yPE1DU3ltYm9sICosIDI+IFBlbmRpbmdMYWJlbHM7CisKKyAgdmlydHVhbCB2b2lkIEVtaXRJbnN0VG9EYXRhKGNvbnN0IE1DSW5zdCAmSW5zdCwgY29uc3QgTUNTdWJ0YXJnZXRJbmZvJikgPSAwOworICB2b2lkIEVtaXRDRklTdGFydFByb2NJbXBsKE1DRHdhcmZGcmFtZUluZm8gJkZyYW1lKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0Q0ZJRW5kUHJvY0ltcGwoTUNEd2FyZkZyYW1lSW5mbyAmRnJhbWUpIG92ZXJyaWRlOworICBNQ1N5bWJvbCAqRW1pdENGSUxhYmVsKCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdEluc3RydWN0aW9uSW1wbChjb25zdCBNQ0luc3QgJkluc3QsIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJKTsKKworcHJvdGVjdGVkOgorICBNQ09iamVjdFN0cmVhbWVyKE1DQ29udGV4dCAmQ29udGV4dCwgc3RkOjp1bmlxdWVfcHRyPE1DQXNtQmFja2VuZD4gVEFCLAorICAgICAgICAgICAgICAgICAgIHJhd19wd3JpdGVfc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TUNDb2RlRW1pdHRlcj4gRW1pdHRlcik7CisgIH5NQ09iamVjdFN0cmVhbWVyKCk7CisKK3B1YmxpYzoKKyAgLy8vIHN0YXRlIG1hbmFnZW1lbnQKKyAgdm9pZCByZXNldCgpIG92ZXJyaWRlOworCisgIC8vLyBPYmplY3Qgc3RyZWFtZXJzIHJlcXVpcmUgdGhlIGludGVncmF0ZWQgYXNzZW1ibGVyLgorICBib29sIGlzSW50ZWdyYXRlZEFzc2VtYmxlclJlcXVpcmVkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHZvaWQgRW1pdEZyYW1lcyhNQ0FzbUJhY2tlbmQgKk1BQik7CisgIHZvaWQgRW1pdENGSVNlY3Rpb25zKGJvb2wgRUgsIGJvb2wgRGVidWcpIG92ZXJyaWRlOworCisgIE1DRnJhZ21lbnQgKmdldEN1cnJlbnRGcmFnbWVudCgpIGNvbnN0OworCisgIHZvaWQgaW5zZXJ0KE1DRnJhZ21lbnQgKkYpIHsKKyAgICBmbHVzaFBlbmRpbmdMYWJlbHMoRik7CisgICAgTUNTZWN0aW9uICpDdXJTZWN0aW9uID0gZ2V0Q3VycmVudFNlY3Rpb25Pbmx5KCk7CisgICAgQ3VyU2VjdGlvbi0+Z2V0RnJhZ21lbnRMaXN0KCkuaW5zZXJ0KEN1ckluc2VydGlvblBvaW50LCBGKTsKKyAgICBGLT5zZXRQYXJlbnQoQ3VyU2VjdGlvbik7CisgIH0KKworICAvLy8gR2V0IGEgZGF0YSBmcmFnbWVudCB0byB3cml0ZSBpbnRvLCBjcmVhdGluZyBhIG5ldyBvbmUgaWYgdGhlIGN1cnJlbnQKKyAgLy8vIGZyYWdtZW50IGlzIG5vdCBhIGRhdGEgZnJhZ21lbnQuCisgIE1DRGF0YUZyYWdtZW50ICpnZXRPckNyZWF0ZURhdGFGcmFnbWVudCgpOworICBNQ1BhZGRpbmdGcmFnbWVudCAqZ2V0T3JDcmVhdGVQYWRkaW5nRnJhZ21lbnQoKTsKKworcHJvdGVjdGVkOgorICBib29sIGNoYW5nZVNlY3Rpb25JbXBsKE1DU2VjdGlvbiAqU2VjdGlvbiwgY29uc3QgTUNFeHByICpTdWJzZWN0aW9uKTsKKworICAvLy8gSWYgYW55IGxhYmVscyBoYXZlIGJlZW4gZW1pdHRlZCBidXQgbm90IGFzc2lnbmVkIGZyYWdtZW50cywgZW5zdXJlIHRoYXQKKyAgLy8vIHRoZXkgZ2V0IGFzc2lnbmVkLCBlaXRoZXIgdG8gRiBpZiBwb3NzaWJsZSBvciB0byBhIG5ldyBkYXRhIGZyYWdtZW50LgorICAvLy8gT3B0aW9uYWxseSwgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBwcm92aWRlIGFuIG9mZnNldCBccCBGT2Zmc2V0LCB3aGljaAorICAvLy8gd2lsbCBiZSB1c2VkIGFzIGEgc3ltYm9sIG9mZnNldCB3aXRoaW4gdGhlIGZyYWdtZW50LgorICB2b2lkIGZsdXNoUGVuZGluZ0xhYmVscyhNQ0ZyYWdtZW50ICpGLCB1aW50NjRfdCBGT2Zmc2V0ID0gMCk7CisKK3B1YmxpYzoKKyAgdm9pZCB2aXNpdFVzZWRTeW1ib2woY29uc3QgTUNTeW1ib2wgJlN5bSkgb3ZlcnJpZGU7CisKKyAgTUNBc3NlbWJsZXIgJmdldEFzc2VtYmxlcigpIHsgcmV0dXJuICpBc3NlbWJsZXI7IH0KKworICAvLy8gXG5hbWUgTUNTdHJlYW1lciBJbnRlcmZhY2UKKyAgLy8vIEB7CisKKyAgdm9pZCBFbWl0TGFiZWwoTUNTeW1ib2wgKlN5bWJvbCwgU01Mb2MgTG9jID0gU01Mb2MoKSkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBFbWl0TGFiZWwoTUNTeW1ib2wgKlN5bWJvbCwgU01Mb2MgTG9jLCBNQ0ZyYWdtZW50ICpGKTsKKyAgdm9pZCBFbWl0QXNzaWdubWVudChNQ1N5bWJvbCAqU3ltYm9sLCBjb25zdCBNQ0V4cHIgKlZhbHVlKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0VmFsdWVJbXBsKGNvbnN0IE1DRXhwciAqVmFsdWUsIHVuc2lnbmVkIFNpemUsCisgICAgICAgICAgICAgICAgICAgICBTTUxvYyBMb2MgPSBTTUxvYygpKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0VUxFQjEyOFZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUpIG92ZXJyaWRlOworICB2b2lkIEVtaXRTTEVCMTI4VmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdFdlYWtSZWZlcmVuY2UoTUNTeW1ib2wgKkFsaWFzLCBjb25zdCBNQ1N5bWJvbCAqU3ltYm9sKSBvdmVycmlkZTsKKyAgdm9pZCBDaGFuZ2VTZWN0aW9uKE1DU2VjdGlvbiAqU2VjdGlvbiwgY29uc3QgTUNFeHByICpTdWJzZWN0aW9uKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0SW5zdHJ1Y3Rpb24oY29uc3QgTUNJbnN0ICZJbnN0LCBjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCA9IGZhbHNlKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIEVtaXQgYW4gaW5zdHJ1Y3Rpb24gdG8gYSBzcGVjaWFsIGZyYWdtZW50LCBiZWNhdXNlIHRoaXMgaW5zdHJ1Y3Rpb24KKyAgLy8vIGNhbiBjaGFuZ2UgaXRzIHNpemUgZHVyaW5nIHJlbGF4YXRpb24uCisgIHZpcnR1YWwgdm9pZCBFbWl0SW5zdFRvRnJhZ21lbnQoY29uc3QgTUNJbnN0ICZJbnN0LCBjb25zdCBNQ1N1YnRhcmdldEluZm8gJik7CisKKyAgdm9pZCBFbWl0QnVuZGxlQWxpZ25Nb2RlKHVuc2lnbmVkIEFsaWduUG93Mikgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdEJ1bmRsZUxvY2soYm9vbCBBbGlnblRvRW5kKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0QnVuZGxlVW5sb2NrKCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdEJ5dGVzKFN0cmluZ1JlZiBEYXRhKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0VmFsdWVUb0FsaWdubWVudCh1bnNpZ25lZCBCeXRlQWxpZ25tZW50LCBpbnQ2NF90IFZhbHVlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWYWx1ZVNpemUgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heEJ5dGVzVG9FbWl0ID0gMCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdENvZGVBbGlnbm1lbnQodW5zaWduZWQgQnl0ZUFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXhCeXRlc1RvRW1pdCA9IDApIG92ZXJyaWRlOworICB2b2lkIGVtaXRWYWx1ZVRvT2Zmc2V0KGNvbnN0IE1DRXhwciAqT2Zmc2V0LCB1bnNpZ25lZCBjaGFyIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jIExvYykgb3ZlcnJpZGU7CisgIHZvaWQKKyAgRW1pdENvZGVQYWRkaW5nQmFzaWNCbG9ja1N0YXJ0KGNvbnN0IE1DQ29kZVBhZGRpbmdDb250ZXh0ICZDb250ZXh0KSBvdmVycmlkZTsKKyAgdm9pZAorICBFbWl0Q29kZVBhZGRpbmdCYXNpY0Jsb2NrRW5kKGNvbnN0IE1DQ29kZVBhZGRpbmdDb250ZXh0ICZDb250ZXh0KSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0RHdhcmZMb2NEaXJlY3RpdmUodW5zaWduZWQgRmlsZU5vLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2x1bW4sIHVuc2lnbmVkIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJc2EsIHVuc2lnbmVkIERpc2NyaW1pbmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlTmFtZSkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdER3YXJmQWR2YW5jZUxpbmVBZGRyKGludDY0X3QgTGluZURlbHRhLCBjb25zdCBNQ1N5bWJvbCAqTGFzdExhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBvaW50ZXJTaXplKTsKKyAgdm9pZCBFbWl0RHdhcmZBZHZhbmNlRnJhbWVBZGRyKGNvbnN0IE1DU3ltYm9sICpMYXN0TGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqTGFiZWwpOworICB2b2lkIEVtaXRDVkxvY0RpcmVjdGl2ZSh1bnNpZ25lZCBGdW5jdGlvbklkLCB1bnNpZ25lZCBGaWxlTm8sIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbHVtbiwgYm9vbCBQcm9sb2d1ZUVuZCwgYm9vbCBJc1N0bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlTmFtZSwgU01Mb2MgTG9jKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0Q1ZMaW5ldGFibGVEaXJlY3RpdmUodW5zaWduZWQgRnVuY3Rpb25JZCwgY29uc3QgTUNTeW1ib2wgKkJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqRW5kKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0Q1ZJbmxpbmVMaW5ldGFibGVEaXJlY3RpdmUodW5zaWduZWQgUHJpbWFyeUZ1bmN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNvdXJjZUZpbGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU291cmNlTGluZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKkZuU3RhcnRTeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICpGbkVuZFN5bSkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdENWRGVmUmFuZ2VEaXJlY3RpdmUoCisgICAgICBBcnJheVJlZjxzdGQ6OnBhaXI8Y29uc3QgTUNTeW1ib2wgKiwgY29uc3QgTUNTeW1ib2wgKj4+IFJhbmdlcywKKyAgICAgIFN0cmluZ1JlZiBGaXhlZFNpemVQb3J0aW9uKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0Q1ZTdHJpbmdUYWJsZURpcmVjdGl2ZSgpIG92ZXJyaWRlOworICB2b2lkIEVtaXRDVkZpbGVDaGVja3N1bXNEaXJlY3RpdmUoKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0Q1ZGaWxlQ2hlY2tzdW1PZmZzZXREaXJlY3RpdmUodW5zaWduZWQgRmlsZU5vKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0RFRQUmVsMzJWYWx1ZShjb25zdCBNQ0V4cHIgKlZhbHVlKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0RFRQUmVsNjRWYWx1ZShjb25zdCBNQ0V4cHIgKlZhbHVlKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0VFBSZWwzMlZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUpIG92ZXJyaWRlOworICB2b2lkIEVtaXRUUFJlbDY0VmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdEdQUmVsMzJWYWx1ZShjb25zdCBNQ0V4cHIgKlZhbHVlKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0R1BSZWw2NFZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUpIG92ZXJyaWRlOworICBib29sIEVtaXRSZWxvY0RpcmVjdGl2ZShjb25zdCBNQ0V4cHIgJk9mZnNldCwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRXhwciAqRXhwciwgU01Mb2MgTG9jKSBvdmVycmlkZTsKKyAgdXNpbmcgTUNTdHJlYW1lcjo6ZW1pdEZpbGw7CisgIHZvaWQgZW1pdEZpbGwoY29uc3QgTUNFeHByICZOdW1CeXRlcywgdWludDY0X3QgRmlsbFZhbHVlLAorICAgICAgICAgICAgICAgIFNNTG9jIExvYyA9IFNNTG9jKCkpIG92ZXJyaWRlOworICB2b2lkIGVtaXRGaWxsKGNvbnN0IE1DRXhwciAmTnVtVmFsdWVzLCBpbnQ2NF90IFNpemUsIGludDY0X3QgRXhwciwKKyAgICAgICAgICAgICAgICBTTUxvYyBMb2MgPSBTTUxvYygpKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0RmlsZURpcmVjdGl2ZShTdHJpbmdSZWYgRmlsZW5hbWUpIG92ZXJyaWRlOworCisgIHZvaWQgRmluaXNoSW1wbCgpIG92ZXJyaWRlOworCisgIC8vLyBFbWl0IHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHN5bWJvbHMgaWYgcG9zc2libGUuCisgIC8vLworICAvLy8gRW1pdCB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFxjIEhpIGFuZCBcYyBMbywgYXMgbG9uZyBhcyB3ZSBjYW4KKyAgLy8vIGNvbXB1dGUgaXQuICBDdXJyZW50bHksIHRoYXQgcmVxdWlyZXMgdGhhdCBib3RoIHN5bWJvbHMgYXJlIGluIHRoZSBzYW1lCisgIC8vLyBkYXRhIGZyYWdtZW50LiAgT3RoZXJ3aXNlLCBkbyBub3RoaW5nIGFuZCByZXR1cm4gXGMgZmFsc2UuCisgIC8vLworICAvLy8gXHByZSBPZmZzZXQgb2YgXGMgSGkgaXMgZ3JlYXRlciB0aGFuIHRoZSBvZmZzZXQgXGMgTG8uCisgIHZvaWQgZW1pdEFic29sdXRlU3ltYm9sRGlmZihjb25zdCBNQ1N5bWJvbCAqSGksIGNvbnN0IE1DU3ltYm9sICpMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNpemUpIG92ZXJyaWRlOworCisgIHZvaWQgZW1pdEFic29sdXRlU3ltYm9sRGlmZkFzVUxFQjEyOChjb25zdCBNQ1N5bWJvbCAqSGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqTG8pIG92ZXJyaWRlOworCisgIGJvb2wgbWF5SGF2ZUluc3RydWN0aW9ucyhNQ1NlY3Rpb24gJlNlYykgY29uc3Qgb3ZlcnJpZGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNPYmplY3RXcml0ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNPYmplY3RXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDkwNjkwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ09iamVjdFdyaXRlci5oCkBAIC0wLDAgKzEsMjAwIEBACisvLz09PS0gbGx2bS9NQy9NQ09iamVjdFdyaXRlci5oIC0gT2JqZWN0IEZpbGUgV3JpdGVyIEludGVyZmFjZSAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNPQkpFQ1RXUklURVJfSAorI2RlZmluZSBMTFZNX01DX01DT0JKRUNUV1JJVEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW5TdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNBc21MYXlvdXQ7CitjbGFzcyBNQ0Fzc2VtYmxlcjsKK2NsYXNzIE1DRml4dXA7CitjbGFzcyBNQ0ZyYWdtZW50OworY2xhc3MgTUNTeW1ib2w7CitjbGFzcyBNQ1N5bWJvbFJlZkV4cHI7CitjbGFzcyBNQ1ZhbHVlOworCisvLy8gRGVmaW5lcyB0aGUgb2JqZWN0IGZpbGUgYW5kIHRhcmdldCBpbmRlcGVuZGVudCBpbnRlcmZhY2VzIHVzZWQgYnkgdGhlCisvLy8gYXNzZW1ibGVyIGJhY2tlbmQgdG8gd3JpdGUgbmF0aXZlIGZpbGUgZm9ybWF0IG9iamVjdCBmaWxlcy4KKy8vLworLy8vIFRoZSBvYmplY3Qgd3JpdGVyIGNvbnRhaW5zIGEgZmV3IGNhbGxiYWNrcyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIgdG8gYWxsb3cKKy8vLyB0aGUgb2JqZWN0IHdyaXRlciB0byBtb2RpZnkgdGhlIGFzc2VtYmxlciBkYXRhIHN0cnVjdHVyZXMgYXQgYXBwcm9wcmlhdGUKKy8vLyBwb2ludHMuIE9uY2UgYXNzZW1ibHkgaXMgY29tcGxldGUsIHRoZSBvYmplY3Qgd3JpdGVyIGlzIGdpdmVuIHRoZQorLy8vIE1DQXNzZW1ibGVyIGluc3RhbmNlLCB3aGljaCBjb250YWlucyBhbGwgdGhlIHN5bWJvbCBhbmQgc2VjdGlvbiBkYXRhIHdoaWNoCisvLy8gc2hvdWxkIGJlIGVtaXR0ZWQgYXMgcGFydCBvZiB3cml0ZU9iamVjdCgpLgorLy8vCisvLy8gVGhlIG9iamVjdCB3cml0ZXIgYWxzbyBjb250YWlucyBhIG51bWJlciBvZiBoZWxwZXIgbWV0aG9kcyBmb3Igd3JpdGluZworLy8vIGJpbmFyeSBkYXRhIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorY2xhc3MgTUNPYmplY3RXcml0ZXIgeworICByYXdfcHdyaXRlX3N0cmVhbSAqT1M7CisKK3Byb3RlY3RlZDoKKyAgdW5zaWduZWQgSXNMaXR0bGVFbmRpYW4gOiAxOworCisgIC8vIENhbiBvbmx5IGNyZWF0ZSBzdWJjbGFzc2VzLgorICBNQ09iamVjdFdyaXRlcihyYXdfcHdyaXRlX3N0cmVhbSAmT1MsIGJvb2wgSXNMaXR0bGVFbmRpYW4pCisgICAgICA6IE9TKCZPUyksIElzTGl0dGxlRW5kaWFuKElzTGl0dGxlRW5kaWFuKSB7fQorCisgIHVuc2lnbmVkIGdldEluaXRpYWxPZmZzZXQoKSB7CisgICAgcmV0dXJuIE9TLT50ZWxsKCk7CisgIH0KKworcHVibGljOgorICBNQ09iamVjdFdyaXRlcihjb25zdCBNQ09iamVjdFdyaXRlciAmKSA9IGRlbGV0ZTsKKyAgTUNPYmplY3RXcml0ZXIgJm9wZXJhdG9yPShjb25zdCBNQ09iamVjdFdyaXRlciAmKSA9IGRlbGV0ZTsKKyAgdmlydHVhbCB+TUNPYmplY3RXcml0ZXIoKTsKKworICAvLy8gbGlmZXRpbWUgbWFuYWdlbWVudAorICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSB7fQorCisgIGJvb2wgaXNMaXR0bGVFbmRpYW4oKSBjb25zdCB7IHJldHVybiBJc0xpdHRsZUVuZGlhbjsgfQorCisgIHJhd19wd3JpdGVfc3RyZWFtICZnZXRTdHJlYW0oKSB7IHJldHVybiAqT1M7IH0KKyAgdm9pZCBzZXRTdHJlYW0ocmF3X3B3cml0ZV9zdHJlYW0gJk5ld09TKSB7IE9TID0gJk5ld09TOyB9CisKKyAgLy8vIFxuYW1lIEhpZ2gtTGV2ZWwgQVBJCisgIC8vLyBAeworCisgIC8vLyBQZXJmb3JtIGFueSBsYXRlIGJpbmRpbmcgb2Ygc3ltYm9scyAoZm9yIGV4YW1wbGUsIHRvIGFzc2lnbiBzeW1ib2wKKyAgLy8vIGluZGljZXMgZm9yIHVzZSB3aGVuIGdlbmVyYXRpbmcgcmVsb2NhdGlvbnMpLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIGFzc2VtYmxlciBhZnRlciBsYXlvdXQgYW5kIHJlbGF4YXRpb24gaXMKKyAgLy8vIGNvbXBsZXRlLgorICB2aXJ0dWFsIHZvaWQgZXhlY3V0ZVBvc3RMYXlvdXRCaW5kaW5nKE1DQXNzZW1ibGVyICZBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCkgPSAwOworCisgIC8vLyBSZWNvcmQgYSByZWxvY2F0aW9uIGVudHJ5LgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIGFzc2VtYmxlciBhZnRlciBsYXlvdXQgYW5kIHJlbGF4YXRpb24sIGFuZAorICAvLy8gcG9zdCBsYXlvdXQgYmluZGluZy4gVGhlIGltcGxlbWVudGF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBzdG9yaW5nCisgIC8vLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVsb2NhdGlvbiBzbyB0aGF0IGl0IGNhbiBiZSBlbWl0dGVkIGR1cmluZworICAvLy8gd3JpdGVPYmplY3QoKS4KKyAgdmlydHVhbCB2b2lkIHJlY29yZFJlbG9jYXRpb24oTUNBc3NlbWJsZXIgJkFzbSwgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGcmFnbWVudCAqRnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRml4dXAgJkZpeHVwLCBNQ1ZhbHVlIFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgJkZpeGVkVmFsdWUpID0gMDsKKworICAvLy8gQ2hlY2sgd2hldGhlciB0aGUgZGlmZmVyZW5jZSAoQSAtIEIpIGJldHdlZW4gdHdvIHN5bWJvbCByZWZlcmVuY2VzIGlzCisgIC8vLyBmdWxseSByZXNvbHZlZC4KKyAgLy8vCisgIC8vLyBDbGllbnRzIGFyZSBub3QgcmVxdWlyZWQgdG8gYW5zd2VyIHByZWNpc2VseSBhbmQgbWF5IGNvbnNlcnZhdGl2ZWx5IHJldHVybgorICAvLy8gZmFsc2UsIGV2ZW4gd2hlbiBhIGRpZmZlcmVuY2UgaXMgZnVsbHkgcmVzb2x2ZWQuCisgIGJvb2wgaXNTeW1ib2xSZWZEaWZmZXJlbmNlRnVsbHlSZXNvbHZlZChjb25zdCBNQ0Fzc2VtYmxlciAmQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2xSZWZFeHByICpBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2xSZWZFeHByICpCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJblNldCkgY29uc3Q7CisKKyAgdmlydHVhbCBib29sIGlzU3ltYm9sUmVmRGlmZmVyZW5jZUZ1bGx5UmVzb2x2ZWRJbXBsKGNvbnN0IE1DQXNzZW1ibGVyICZBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAmQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICZCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJblNldCkgY29uc3Q7CisKKyAgdmlydHVhbCBib29sIGlzU3ltYm9sUmVmRGlmZmVyZW5jZUZ1bGx5UmVzb2x2ZWRJbXBsKGNvbnN0IE1DQXNzZW1ibGVyICZBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAmU3ltQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRnJhZ21lbnQgJkZCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJblNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNQQ1JlbCkgY29uc3Q7CisKKyAgLy8vIFdyaXRlIHRoZSBvYmplY3QgZmlsZS4KKyAgLy8vCisgIC8vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJsZXIgYWZ0ZXIgbGF5b3V0IGFuZCByZWxheGF0aW9uIGlzCisgIC8vLyBjb21wbGV0ZSwgZml4dXBzIGhhdmUgYmVlbiBldmFsdWF0ZWQgYW5kIGFwcGxpZWQsIGFuZCByZWxvY2F0aW9ucworICAvLy8gZ2VuZXJhdGVkLgorICB2aXJ0dWFsIHZvaWQgd3JpdGVPYmplY3QoTUNBc3NlbWJsZXIgJkFzbSwgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCkgPSAwOworCisgIC8vLyBAfQorICAvLy8gXG5hbWUgQmluYXJ5IE91dHB1dAorICAvLy8gQHsKKworICB2b2lkIHdyaXRlOCh1aW50OF90IFZhbHVlKSB7ICpPUyA8PCBjaGFyKFZhbHVlKTsgfQorCisgIHZvaWQgd3JpdGVMRTE2KHVpbnQxNl90IFZhbHVlKSB7CisgICAgc3VwcG9ydDo6ZW5kaWFuOjpXcml0ZXI8c3VwcG9ydDo6bGl0dGxlPigqT1MpLndyaXRlKFZhbHVlKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMRTMyKHVpbnQzMl90IFZhbHVlKSB7CisgICAgc3VwcG9ydDo6ZW5kaWFuOjpXcml0ZXI8c3VwcG9ydDo6bGl0dGxlPigqT1MpLndyaXRlKFZhbHVlKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMRTY0KHVpbnQ2NF90IFZhbHVlKSB7CisgICAgc3VwcG9ydDo6ZW5kaWFuOjpXcml0ZXI8c3VwcG9ydDo6bGl0dGxlPigqT1MpLndyaXRlKFZhbHVlKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCRTE2KHVpbnQxNl90IFZhbHVlKSB7CisgICAgc3VwcG9ydDo6ZW5kaWFuOjpXcml0ZXI8c3VwcG9ydDo6YmlnPigqT1MpLndyaXRlKFZhbHVlKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCRTMyKHVpbnQzMl90IFZhbHVlKSB7CisgICAgc3VwcG9ydDo6ZW5kaWFuOjpXcml0ZXI8c3VwcG9ydDo6YmlnPigqT1MpLndyaXRlKFZhbHVlKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCRTY0KHVpbnQ2NF90IFZhbHVlKSB7CisgICAgc3VwcG9ydDo6ZW5kaWFuOjpXcml0ZXI8c3VwcG9ydDo6YmlnPigqT1MpLndyaXRlKFZhbHVlKTsKKyAgfQorCisgIHZvaWQgd3JpdGUxNih1aW50MTZfdCBWYWx1ZSkgeworICAgIGlmIChJc0xpdHRsZUVuZGlhbikKKyAgICAgIHdyaXRlTEUxNihWYWx1ZSk7CisgICAgZWxzZQorICAgICAgd3JpdGVCRTE2KFZhbHVlKTsKKyAgfQorCisgIHZvaWQgd3JpdGUzMih1aW50MzJfdCBWYWx1ZSkgeworICAgIGlmIChJc0xpdHRsZUVuZGlhbikKKyAgICAgIHdyaXRlTEUzMihWYWx1ZSk7CisgICAgZWxzZQorICAgICAgd3JpdGVCRTMyKFZhbHVlKTsKKyAgfQorCisgIHZvaWQgd3JpdGU2NCh1aW50NjRfdCBWYWx1ZSkgeworICAgIGlmIChJc0xpdHRsZUVuZGlhbikKKyAgICAgIHdyaXRlTEU2NChWYWx1ZSk7CisgICAgZWxzZQorICAgICAgd3JpdGVCRTY0KFZhbHVlKTsKKyAgfQorCisgIHZvaWQgV3JpdGVaZXJvcyh1bnNpZ25lZCBOKSB7CisgICAgY29uc3QgY2hhciBaZXJvc1sxNl0gPSB7MH07CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTiAvIDE2OyBpICE9IGU7ICsraSkKKyAgICAgICpPUyA8PCBTdHJpbmdSZWYoWmVyb3MsIDE2KTsKKworICAgICpPUyA8PCBTdHJpbmdSZWYoWmVyb3MsIE4gJSAxNik7CisgIH0KKworICB2b2lkIHdyaXRlQnl0ZXMoY29uc3QgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZCeXRlVmVjLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgWmVyb0ZpbGxTaXplID0gMCkgeworICAgIHdyaXRlQnl0ZXMoU3RyaW5nUmVmKEJ5dGVWZWMuZGF0YSgpLCBCeXRlVmVjLnNpemUoKSksIFplcm9GaWxsU2l6ZSk7CisgIH0KKworICB2b2lkIHdyaXRlQnl0ZXMoU3RyaW5nUmVmIFN0ciwgdW5zaWduZWQgWmVyb0ZpbGxTaXplID0gMCkgeworICAgIC8vIFRPRE86IHRoaXMgdmVyc2lvbiBtYXkgbmVlZCB0byBnbyBhd2F5IG9uY2UgYWxsIGZyYWdtZW50IGNvbnRlbnRzIGFyZQorICAgIC8vIGNvbnZlcnRlZCB0byBTbWFsbFZlY3RvcjxjaGFyLCBOPgorICAgIGFzc2VydCgKKyAgICAgICAgKFplcm9GaWxsU2l6ZSA9PSAwIHx8IFN0ci5zaXplKCkgPD0gWmVyb0ZpbGxTaXplKSAmJgorICAgICAgICAiZGF0YSBzaXplIGdyZWF0ZXIgdGhhbiBmaWxsIHNpemUsIHVuZXhwZWN0ZWQgbGFyZ2Ugd3JpdGUgd2lsbCBvY2N1ciIpOworICAgICpPUyA8PCBTdHI7CisgICAgaWYgKFplcm9GaWxsU2l6ZSkKKyAgICAgIFdyaXRlWmVyb3MoWmVyb0ZpbGxTaXplIC0gU3RyLnNpemUoKSk7CisgIH0KKworICAvLy8gQH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DT0JKRUNUV1JJVEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvQXNtQ29uZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9Bc21Db25kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU3YmZjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvQXNtQ29uZC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09LSBBc21Db25kLmggLSBBc3NlbWJseSBmaWxlIGNvbmRpdGlvbmFsIGFzc2VtYmx5ICAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1BBUlNFUl9BU01DT05EX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1BBUlNFUl9BU01DT05EX0gKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQXNtQ29uZCAtIENsYXNzIHRvIHN1cHBvcnQgY29uZGl0aW9uYWwgYXNzZW1ibHkKKy8vLworLy8vIFRoZSBjb25kaXRpb25hbCBhc3NlbWJseSBmZWF0dXJlICguaWYsIC5lbHNlLCAuZWxzZWlmIGFuZCAuZW5kaWYpIGlzCisvLy8gaW1wbGVtZW50ZWQgd2l0aCBBc21Db25kIHRoYXQgdGVsbHMgdXMgd2hhdCB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiAKKy8vLyBwcm9jZXNzaW5nLiAgSWdub3JlIGNhbiBiZSBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4gIFdoZW4gdHJ1ZSB3ZSBhcmUgaWdub3JpbmcKKy8vLyB0aGUgYmxvY2sgb2YgY29kZSBpbiB0aGUgbWlkZGxlIG9mIGEgY29uZGl0aW9uYWwuCisKK2NsYXNzIEFzbUNvbmQgeworcHVibGljOgorICBlbnVtIENvbmRpdGlvbmFsQXNzZW1ibHlUeXBlIHsKKyAgICBOb0NvbmQsICAgICAvLyBubyBjb25kaXRpb25hbCBpcyBiZWluZyBwcm9jZXNzZWQKKyAgICBJZkNvbmQsICAgICAvLyBpbnNpZGUgaWYgY29uZGl0aW9uYWwKKyAgICBFbHNlSWZDb25kLCAvLyBpbnNpZGUgZWxzZWlmIGNvbmRpdGlvbmFsCisgICAgRWxzZUNvbmQgICAgLy8gaW5zaWRlIGVsc2UgY29uZGl0aW9uYWwKKyAgfTsKKworICBDb25kaXRpb25hbEFzc2VtYmx5VHlwZSBUaGVDb25kID0gTm9Db25kOworICBib29sIENvbmRNZXQgPSBmYWxzZTsKKyAgYm9vbCBJZ25vcmUgPSBmYWxzZTsKKworICBBc21Db25kKCkgPSBkZWZhdWx0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNQQVJTRVJfQVNNQ09ORF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL0FzbUxleGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL0FzbUxleGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3MTgzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvQXNtTGV4ZXIuaApAQCAtMCwwICsxLDc2IEBACisvLz09PS0gQXNtTGV4ZXIuaCAtIExleGVyIGZvciBBc3NlbWJseSBGaWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgY2xhc3MgZGVjbGFyZXMgdGhlIGxleGVyIGZvciBhc3NlbWJseSBmaWxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNQQVJTRVJfQVNNTEVYRVJfSAorI2RlZmluZSBMTFZNX01DX01DUEFSU0VSX0FTTUxFWEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNQYXJzZXIvTUNBc21MZXhlci5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0FzbUluZm87CisKKy8vLyBBc21MZXhlciAtIExleGVyIGNsYXNzIGZvciBhc3NlbWJseSBmaWxlcy4KK2NsYXNzIEFzbUxleGVyIDogcHVibGljIE1DQXNtTGV4ZXIgeworICBjb25zdCBNQ0FzbUluZm8gJk1BSTsKKworICBjb25zdCBjaGFyICpDdXJQdHIgPSBudWxscHRyOworICBTdHJpbmdSZWYgQ3VyQnVmOworICBib29sIElzQXRTdGFydE9mTGluZSA9IHRydWU7CisgIGJvb2wgSXNBdFN0YXJ0T2ZTdGF0ZW1lbnQgPSB0cnVlOworICBib29sIElzUGFyc2luZ01TSW5saW5lQXNtID0gZmFsc2U7CisgIGJvb2wgSXNQZWVraW5nID0gZmFsc2U7CisKK3Byb3RlY3RlZDoKKyAgLy8vIExleFRva2VuIC0gUmVhZCB0aGUgbmV4dCB0b2tlbiBhbmQgcmV0dXJuIGl0cyBjb2RlLgorICBBc21Ub2tlbiBMZXhUb2tlbigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIEFzbUxleGVyKGNvbnN0IE1DQXNtSW5mbyAmTUFJKTsKKyAgQXNtTGV4ZXIoY29uc3QgQXNtTGV4ZXIgJikgPSBkZWxldGU7CisgIEFzbUxleGVyICZvcGVyYXRvcj0oY29uc3QgQXNtTGV4ZXIgJikgPSBkZWxldGU7CisgIH5Bc21MZXhlcigpIG92ZXJyaWRlOworCisgIHZvaWQgc2V0QnVmZmVyKFN0cmluZ1JlZiBCdWYsIGNvbnN0IGNoYXIgKnB0ciA9IG51bGxwdHIpOworICB2b2lkIHNldFBhcnNpbmdNU0lubGluZUFzbShib29sIFYpIHsgSXNQYXJzaW5nTVNJbmxpbmVBc20gPSBWOyB9CisKKyAgU3RyaW5nUmVmIExleFVudGlsRW5kT2ZTdGF0ZW1lbnQoKSBvdmVycmlkZTsKKworICBzaXplX3QgcGVla1Rva2VucyhNdXRhYmxlQXJyYXlSZWY8QXNtVG9rZW4+IEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRTa2lwU3BhY2UgPSB0cnVlKSBvdmVycmlkZTsKKworICBjb25zdCBNQ0FzbUluZm8gJmdldE1BSSgpIGNvbnN0IHsgcmV0dXJuIE1BSTsgfQorCitwcml2YXRlOgorICBib29sIGlzQXRTdGFydE9mQ29tbWVudChjb25zdCBjaGFyICpQdHIpOworICBib29sIGlzQXRTdGF0ZW1lbnRTZXBhcmF0b3IoY29uc3QgY2hhciAqUHRyKTsKKyAgaW50IGdldE5leHRDaGFyKCk7CisgIEFzbVRva2VuIFJldHVybkVycm9yKGNvbnN0IGNoYXIgKkxvYywgY29uc3Qgc3RkOjpzdHJpbmcgJk1zZyk7CisKKyAgQXNtVG9rZW4gTGV4SWRlbnRpZmllcigpOworICBBc21Ub2tlbiBMZXhTbGFzaCgpOworICBBc21Ub2tlbiBMZXhMaW5lQ29tbWVudCgpOworICBBc21Ub2tlbiBMZXhEaWdpdCgpOworICBBc21Ub2tlbiBMZXhTaW5nbGVRdW90ZSgpOworICBBc21Ub2tlbiBMZXhRdW90ZSgpOworICBBc21Ub2tlbiBMZXhGbG9hdExpdGVyYWwoKTsKKyAgQXNtVG9rZW4gTGV4SGV4RmxvYXRMaXRlcmFsKGJvb2wgTm9JbnREaWdpdHMpOworCisgIFN0cmluZ1JlZiBMZXhVbnRpbEVuZE9mTGluZSgpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNQQVJTRVJfQVNNTEVYRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9NQ0FzbUxleGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL01DQXNtTGV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDU1MGIzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9NQ0FzbUxleGVyLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8vPT09LSBsbHZtL01DL01DQXNtTGV4ZXIuaCAtIEFic3RyYWN0IEFzbSBMZXhlciBJbnRlcmZhY2UgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1BBUlNFUl9NQ0FTTUxFWEVSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1BBUlNFUl9NQ0FTTUxFWEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtTWFjcm8uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBIGNhbGxiYWNrIGNsYXNzIHdoaWNoIGlzIG5vdGlmaWVkIG9mIGVhY2ggY29tbWVudCBpbiBhbiBhc3NlbWJseSBmaWxlIGFzCisvLy8gaXQgaXMgbGV4ZWQuCitjbGFzcyBBc21Db21tZW50Q29uc3VtZXIgeworcHVibGljOgorICB2aXJ0dWFsIH5Bc21Db21tZW50Q29uc3VtZXIoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB3aGVuIGEgY29tbWVudCBpcyBsZXhlZC4gTG9jIGlzIHRoZSBzdGFydCBvZiB0aGUKKyAgLy8vIGNvbW1lbnQgdGV4dCAoZXhjbHVkaW5nIHRoZSBjb21tZW50LXN0YXJ0IG1hcmtlcikuIENvbW1lbnRUZXh0IGlzIHRoZSB0ZXh0CisgIC8vLyBvZiB0aGUgY29tbWVudCwgZXhjbHVkaW5nIHRoZSBjb21tZW50IHN0YXJ0IGFuZCBlbmQgbWFya2VycywgYW5kIHRoZQorICAvLy8gbmV3bGluZSBmb3Igc2luZ2xlLWxpbmUgY29tbWVudHMuCisgIHZpcnR1YWwgdm9pZCBIYW5kbGVDb21tZW50KFNNTG9jIExvYywgU3RyaW5nUmVmIENvbW1lbnRUZXh0KSA9IDA7Cit9OworCisKKy8vLyBHZW5lcmljIGFzc2VtYmxlciBsZXhlciBpbnRlcmZhY2UsIGZvciB1c2UgYnkgdGFyZ2V0IHNwZWNpZmljIGFzc2VtYmx5CisvLy8gbGV4ZXJzLgorY2xhc3MgTUNBc21MZXhlciB7CisgIC8vLyBUaGUgY3VycmVudCB0b2tlbiwgc3RvcmVkIGluIHRoZSBiYXNlIGNsYXNzIGZvciBmYXN0ZXIgYWNjZXNzLgorICBTbWFsbFZlY3RvcjxBc21Ub2tlbiwgMT4gQ3VyVG9rOworCisgIC8vLyBUaGUgbG9jYXRpb24gYW5kIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50IGVycm9yCisgIFNNTG9jIEVyckxvYzsKKyAgc3RkOjpzdHJpbmcgRXJyOworCitwcm90ZWN0ZWQ6IC8vIENhbiBvbmx5IGNyZWF0ZSBzdWJjbGFzc2VzLgorICBjb25zdCBjaGFyICpUb2tTdGFydCA9IG51bGxwdHI7CisgIGJvb2wgU2tpcFNwYWNlID0gdHJ1ZTsKKyAgYm9vbCBBbGxvd0F0SW5JZGVudGlmaWVyOworICBib29sIElzQXRTdGFydE9mU3RhdGVtZW50ID0gdHJ1ZTsKKyAgQXNtQ29tbWVudENvbnN1bWVyICpDb21tZW50Q29uc3VtZXIgPSBudWxscHRyOworCisgIGJvb2wgQWx0TWFjcm9Nb2RlOworICBNQ0FzbUxleGVyKCk7CisKKyAgdmlydHVhbCBBc21Ub2tlbiBMZXhUb2tlbigpID0gMDsKKworICB2b2lkIFNldEVycm9yKFNNTG9jIGVyckxvYywgY29uc3Qgc3RkOjpzdHJpbmcgJmVycikgeworICAgIEVyckxvYyA9IGVyckxvYzsKKyAgICBFcnIgPSBlcnI7CisgIH0KKworcHVibGljOgorICBNQ0FzbUxleGVyKGNvbnN0IE1DQXNtTGV4ZXIgJikgPSBkZWxldGU7CisgIE1DQXNtTGV4ZXIgJm9wZXJhdG9yPShjb25zdCBNQ0FzbUxleGVyICYpID0gZGVsZXRlOworICB2aXJ0dWFsIH5NQ0FzbUxleGVyKCk7CisKKyAgYm9vbCBJc2FBbHRNYWNyb01vZGUoKSB7CisgICAgcmV0dXJuIEFsdE1hY3JvTW9kZTsKKyAgfQorCisgIHZvaWQgU2V0QWx0TWFjcm9Nb2RlKGJvb2wgQWx0TWFjcm9TZXQpIHsKKyAgICBBbHRNYWNyb01vZGUgPSBBbHRNYWNyb1NldDsKKyAgfQorCisgIC8vLyBDb25zdW1lIHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIGlucHV0IHN0cmVhbSBhbmQgcmV0dXJuIGl0LgorICAvLy8KKyAgLy8vIFRoZSBsZXhlciB3aWxsIGNvbnRpbnVvc2x5IHJldHVybiB0aGUgZW5kLW9mLWZpbGUgdG9rZW4gb25jZSB0aGUgZW5kIG9mCisgIC8vLyB0aGUgbWFpbiBpbnB1dCBmaWxlIGhhcyBiZWVuIHJlYWNoZWQuCisgIGNvbnN0IEFzbVRva2VuICZMZXgoKSB7CisgICAgYXNzZXJ0KCFDdXJUb2suZW1wdHkoKSk7CisgICAgLy8gTWFyayBpZiB3ZSBwYXJzaW5nIG91dCBhIEVuZE9mU3RhdGVtZW50LgorICAgIElzQXRTdGFydE9mU3RhdGVtZW50ID0gQ3VyVG9rLmZyb250KCkuZ2V0S2luZCgpID09IEFzbVRva2VuOjpFbmRPZlN0YXRlbWVudDsKKyAgICBDdXJUb2suZXJhc2UoQ3VyVG9rLmJlZ2luKCkpOworICAgIC8vIExleFRva2VuIG1heSBnZW5lcmF0ZSBtdWx0aXBsZSB0b2tlbnMgdmlhIFVuTGV4IGJ1dCB3aWxsIGFsd2F5cyByZXR1cm4KKyAgICAvLyB0aGUgZmlyc3Qgb25lLiBQbGFjZSByZXR1cm5lZCB2YWx1ZSBhdCBoZWFkIG9mIEN1clRvayB2ZWN0b3IuCisgICAgaWYgKEN1clRvay5lbXB0eSgpKSB7CisgICAgICBBc21Ub2tlbiBUID0gTGV4VG9rZW4oKTsKKyAgICAgIEN1clRvay5pbnNlcnQoQ3VyVG9rLmJlZ2luKCksIFQpOworICAgIH0KKyAgICByZXR1cm4gQ3VyVG9rLmZyb250KCk7CisgIH0KKworICB2b2lkIFVuTGV4KEFzbVRva2VuIGNvbnN0ICZUb2tlbikgeworICAgIElzQXRTdGFydE9mU3RhdGVtZW50ID0gZmFsc2U7CisgICAgQ3VyVG9rLmluc2VydChDdXJUb2suYmVnaW4oKSwgVG9rZW4pOworICB9CisKKyAgYm9vbCBpc0F0U3RhcnRPZlN0YXRlbWVudCgpIHsgcmV0dXJuIElzQXRTdGFydE9mU3RhdGVtZW50OyB9CisKKyAgdmlydHVhbCBTdHJpbmdSZWYgTGV4VW50aWxFbmRPZlN0YXRlbWVudCgpID0gMDsKKworICAvLy8gR2V0IHRoZSBjdXJyZW50IHNvdXJjZSBsb2NhdGlvbi4KKyAgU01Mb2MgZ2V0TG9jKCkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgY3VycmVudCAobGFzdCkgbGV4ZWQgdG9rZW4uCisgIGNvbnN0IEFzbVRva2VuICZnZXRUb2soKSBjb25zdCB7CisgICAgcmV0dXJuIEN1clRva1swXTsKKyAgfQorCisgIC8vLyBMb29rIGFoZWFkIGF0IHRoZSBuZXh0IHRva2VuIHRvIGJlIGxleGVkLgorICBjb25zdCBBc21Ub2tlbiBwZWVrVG9rKGJvb2wgU2hvdWxkU2tpcFNwYWNlID0gdHJ1ZSkgeworICAgIEFzbVRva2VuIFRvazsKKworICAgIE11dGFibGVBcnJheVJlZjxBc21Ub2tlbj4gQnVmKFRvayk7CisgICAgc2l6ZV90IFJlYWRDb3VudCA9IHBlZWtUb2tlbnMoQnVmLCBTaG91bGRTa2lwU3BhY2UpOworCisgICAgYXNzZXJ0KFJlYWRDb3VudCA9PSAxKTsKKyAgICAodm9pZClSZWFkQ291bnQ7CisKKyAgICByZXR1cm4gVG9rOworICB9CisKKyAgLy8vIExvb2sgYWhlYWQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiB0b2tlbnMuCisgIHZpcnR1YWwgc2l6ZV90IHBlZWtUb2tlbnMoTXV0YWJsZUFycmF5UmVmPEFzbVRva2VuPiBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRTa2lwU3BhY2UgPSB0cnVlKSA9IDA7CisKKyAgLy8vIEdldCB0aGUgY3VycmVudCBlcnJvciBsb2NhdGlvbgorICBTTUxvYyBnZXRFcnJMb2MoKSB7CisgICAgcmV0dXJuIEVyckxvYzsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGN1cnJlbnQgZXJyb3Igc3RyaW5nCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRFcnIoKSB7CisgICAgcmV0dXJuIEVycjsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGtpbmQgb2YgY3VycmVudCB0b2tlbi4KKyAgQXNtVG9rZW46OlRva2VuS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0VG9rKCkuZ2V0S2luZCgpOyB9CisKKyAgLy8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHRva2VuIGhhcyBraW5kIFxwIEsuCisgIGJvb2wgaXMoQXNtVG9rZW46OlRva2VuS2luZCBLKSBjb25zdCB7IHJldHVybiBnZXRUb2soKS5pcyhLKTsgfQorCisgIC8vLyBDaGVjayBpZiB0aGUgY3VycmVudCB0b2tlbiBoYXMga2luZCBccCBLLgorICBib29sIGlzTm90KEFzbVRva2VuOjpUb2tlbktpbmQgSykgY29uc3QgeyByZXR1cm4gZ2V0VG9rKCkuaXNOb3QoSyk7IH0KKworICAvLy8gU2V0IHdoZXRoZXIgc3BhY2VzIHNob3VsZCBiZSBpZ25vcmVkIGJ5IHRoZSBsZXhlcgorICB2b2lkIHNldFNraXBTcGFjZShib29sIHZhbCkgeyBTa2lwU3BhY2UgPSB2YWw7IH0KKworICBib29sIGdldEFsbG93QXRJbklkZW50aWZpZXIoKSB7IHJldHVybiBBbGxvd0F0SW5JZGVudGlmaWVyOyB9CisgIHZvaWQgc2V0QWxsb3dBdEluSWRlbnRpZmllcihib29sIHYpIHsgQWxsb3dBdEluSWRlbnRpZmllciA9IHY7IH0KKworICB2b2lkIHNldENvbW1lbnRDb25zdW1lcihBc21Db21tZW50Q29uc3VtZXIgKkNvbW1lbnRDb25zdW1lcikgeworICAgIHRoaXMtPkNvbW1lbnRDb25zdW1lciA9IENvbW1lbnRDb25zdW1lcjsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNQQVJTRVJfTUNBU01MRVhFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL01DQXNtUGFyc2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL01DQXNtUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3OWM0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvTUNBc21QYXJzZXIuaApAQCAtMCwwICsxLDMxMyBAQAorLy89PT0tIGxsdm0vTUMvTUNBc21QYXJzZXIuaCAtIEFic3RyYWN0IEFzbSBQYXJzZXIgSW50ZXJmYWNlIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DUEFSU0VSX01DQVNNUEFSU0VSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1BBUlNFUl9NQ0FTTVBBUlNFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ0FzbUxleGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NNTG9jLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0FzbUluZm87CitjbGFzcyBNQ0FzbVBhcnNlckV4dGVuc2lvbjsKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIE1DSW5zdFByaW50ZXI7CitjbGFzcyBNQ0luc3RySW5mbzsKK2NsYXNzIE1DU3RyZWFtZXI7CitjbGFzcyBNQ1RhcmdldEFzbVBhcnNlcjsKK2NsYXNzIFNvdXJjZU1ncjsKKworc3RydWN0IElubGluZUFzbUlkZW50aWZpZXJJbmZvIHsKKyAgZW51bSBJZEtpbmQgeworICAgIElLX0ludmFsaWQsICAvLyBJbml0aWFsIHN0YXRlLiBVbmV4cGVjdGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBwYXJzaW5nLgorICAgIElLX0xhYmVsLCAgICAvLyBGdW5jdGlvbi9MYWJlbCByZWZlcmVuY2UuCisgICAgSUtfRW51bVZhbCwgIC8vIFZhbHVlIG9mIGVudW1lcmF0aW9uIHR5cGUuCisgICAgSUtfVmFyICAgICAgIC8vIFZhcmlhYmxlLgorICB9OworICAvLyBSZXByZXNlbnRzIGFuIEVudW0gdmFsdWUKKyAgc3RydWN0IEVudW1JZGVudGlmaWVyIHsKKyAgICBpbnQ2NF90IEVudW1WYWw7CisgIH07CisgIC8vIFJlcHJlc2VudHMgYSBsYWJlbC9mdW5jdGlvbiByZWZlcmVuY2UKKyAgc3RydWN0IExhYmVsSWRlbnRpZmllciB7CisgICAgdm9pZCAqRGVjbDsKKyAgfTsKKyAgLy8gUmVwcmVzZW50cyBhIHZhcmlhYmxlCisgIHN0cnVjdCBWYXJpYWJsZUlkZW50aWZpZXIgeworICAgIHZvaWQgKkRlY2w7CisgICAgYm9vbCBJc0dsb2JhbExWOworICAgIHVuc2lnbmVkIExlbmd0aDsKKyAgICB1bnNpZ25lZCBTaXplOworICAgIHVuc2lnbmVkIFR5cGU7CisgIH07CisgIC8vIEFuIElubGluZUFzbSBpZGVudGlmaWVyIGNhbiBvbmx5IGJlIG9uZSBvZiB0aG9zZQorICB1bmlvbiB7CisgICAgRW51bUlkZW50aWZpZXIgRW51bTsKKyAgICBMYWJlbElkZW50aWZpZXIgTGFiZWw7CisgICAgVmFyaWFibGVJZGVudGlmaWVyIFZhcjsKKyAgfTsKKyAgYm9vbCBpc0tpbmQoSWRLaW5kIGtpbmQpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0ga2luZDsgfQorICAvLyBJbml0aWFsaXplcnMKKyAgdm9pZCBzZXRFbnVtKGludDY0X3QgZW51bVZhbCkgeworICAgIGFzc2VydChpc0tpbmQoSUtfSW52YWxpZCkgJiYgInNob3VsZCBiZSBpbml0aWFsaXplZCBvbmx5IG9uY2UiKTsKKyAgICBLaW5kID0gSUtfRW51bVZhbDsKKyAgICBFbnVtLkVudW1WYWwgPSBlbnVtVmFsOworICB9CisgIHZvaWQgc2V0TGFiZWwodm9pZCAqZGVjbCkgeworICAgIGFzc2VydChpc0tpbmQoSUtfSW52YWxpZCkgJiYgInNob3VsZCBiZSBpbml0aWFsaXplZCBvbmx5IG9uY2UiKTsKKyAgICBLaW5kID0gSUtfTGFiZWw7CisgICAgTGFiZWwuRGVjbCA9IGRlY2w7CisgIH0KKyAgdm9pZCBzZXRWYXIodm9pZCAqZGVjbCwgYm9vbCBpc0dsb2JhbExWLCB1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCB0eXBlKSB7CisgICAgYXNzZXJ0KGlzS2luZChJS19JbnZhbGlkKSAmJiAic2hvdWxkIGJlIGluaXRpYWxpemVkIG9ubHkgb25jZSIpOworICAgIEtpbmQgPSBJS19WYXI7CisgICAgVmFyLkRlY2wgPSBkZWNsOworICAgIFZhci5Jc0dsb2JhbExWID0gaXNHbG9iYWxMVjsKKyAgICBWYXIuU2l6ZSA9IHNpemU7CisgICAgVmFyLlR5cGUgPSB0eXBlOworICAgIFZhci5MZW5ndGggPSBzaXplIC8gdHlwZTsKKyAgfQorICBJbmxpbmVBc21JZGVudGlmaWVySW5mbygpIDogS2luZChJS19JbnZhbGlkKSB7fQorCitwcml2YXRlOgorICAvLyBEaXNjcmltaW5hdGUgdXNpbmcgdGhlIGN1cnJlbnQga2luZC4KKyAgSWRLaW5kIEtpbmQ7Cit9OworCisvLy8gXGJyaWVmIEdlbmVyaWMgU2VtYSBjYWxsYmFjayBmb3IgYXNzZW1ibHkgcGFyc2VyLgorY2xhc3MgTUNBc21QYXJzZXJTZW1hQ2FsbGJhY2sgeworcHVibGljOgorICB2aXJ0dWFsIH5NQ0FzbVBhcnNlclNlbWFDYWxsYmFjaygpOworCisgIHZpcnR1YWwgdm9pZCBMb29rdXBJbmxpbmVBc21JZGVudGlmaWVyKFN0cmluZ1JlZiAmTGluZUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5saW5lQXNtSWRlbnRpZmllckluZm8gJkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNVbmV2YWx1YXRlZENvbnRleHQpID0gMDsKKyAgdmlydHVhbCBTdHJpbmdSZWYgTG9va3VwSW5saW5lQXNtTGFiZWwoU3RyaW5nUmVmIElkZW50aWZpZXIsIFNvdXJjZU1nciAmU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jIExvY2F0aW9uLCBib29sIENyZWF0ZSkgPSAwOworICB2aXJ0dWFsIGJvb2wgTG9va3VwSW5saW5lQXNtRmllbGQoU3RyaW5nUmVmIEJhc2UsIFN0cmluZ1JlZiBNZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmT2Zmc2V0KSA9IDA7Cit9OworCisvLy8gXGJyaWVmIEdlbmVyaWMgYXNzZW1ibGVyIHBhcnNlciBpbnRlcmZhY2UsIGZvciB1c2UgYnkgdGFyZ2V0IHNwZWNpZmljCisvLy8gYXNzZW1ibHkgcGFyc2Vycy4KK2NsYXNzIE1DQXNtUGFyc2VyIHsKK3B1YmxpYzoKKyAgdXNpbmcgRGlyZWN0aXZlSGFuZGxlciA9IGJvb2wgKCopKE1DQXNtUGFyc2VyRXh0ZW5zaW9uKiwgU3RyaW5nUmVmLCBTTUxvYyk7CisgIHVzaW5nIEV4dGVuc2lvbkRpcmVjdGl2ZUhhbmRsZXIgPQorICAgICAgc3RkOjpwYWlyPE1DQXNtUGFyc2VyRXh0ZW5zaW9uKiwgRGlyZWN0aXZlSGFuZGxlcj47CisKKyAgc3RydWN0IE1DUGVuZGluZ0Vycm9yIHsKKyAgICBTTUxvYyBMb2M7CisgICAgU21hbGxTdHJpbmc8NjQ+IE1zZzsKKyAgICBTTVJhbmdlIFJhbmdlOworICB9OworCitwcml2YXRlOgorICBNQ1RhcmdldEFzbVBhcnNlciAqVGFyZ2V0UGFyc2VyID0gbnVsbHB0cjsKKworICB1bnNpZ25lZCBTaG93UGFyc2VkT3BlcmFuZHMgOiAxOworCitwcm90ZWN0ZWQ6IC8vIENhbiBvbmx5IGNyZWF0ZSBzdWJjbGFzc2VzLgorICBNQ0FzbVBhcnNlcigpOworCisgIC8vLyBGbGFnIHRyYWNraW5nIHdoZXRoZXIgYW55IGVycm9ycyBoYXZlIGJlZW4gZW5jb3VudGVyZWQuCisgIGJvb2wgSGFkRXJyb3IgPSBmYWxzZTsKKyAgLy8vIEVuYWJsZSBwcmludCBbbGF0ZW5jeTp0aHJvdWdocHV0XSBpbiBvdXRwdXQgZmlsZS4KKyAgYm9vbCBFbmFibGVQcmludFNjaGVkSW5mbyA9IGZhbHNlOworCisgIFNtYWxsVmVjdG9yPE1DUGVuZGluZ0Vycm9yLCAxPiBQZW5kaW5nRXJyb3JzOworCitwdWJsaWM6CisgIE1DQXNtUGFyc2VyKGNvbnN0IE1DQXNtUGFyc2VyICYpID0gZGVsZXRlOworICBNQ0FzbVBhcnNlciAmb3BlcmF0b3I9KGNvbnN0IE1DQXNtUGFyc2VyICYpID0gZGVsZXRlOworICB2aXJ0dWFsIH5NQ0FzbVBhcnNlcigpOworCisgIHZpcnR1YWwgdm9pZCBhZGREaXJlY3RpdmVIYW5kbGVyKFN0cmluZ1JlZiBEaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkRpcmVjdGl2ZUhhbmRsZXIgSGFuZGxlcikgPSAwOworCisgIHZpcnR1YWwgdm9pZCBhZGRBbGlhc0ZvckRpcmVjdGl2ZShTdHJpbmdSZWYgRGlyZWN0aXZlLCBTdHJpbmdSZWYgQWxpYXMpID0gMDsKKworICB2aXJ0dWFsIFNvdXJjZU1nciAmZ2V0U291cmNlTWFuYWdlcigpID0gMDsKKworICB2aXJ0dWFsIE1DQXNtTGV4ZXIgJmdldExleGVyKCkgPSAwOworICBjb25zdCBNQ0FzbUxleGVyICZnZXRMZXhlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxNQ0FzbVBhcnNlcio+KHRoaXMpLT5nZXRMZXhlcigpOworICB9CisKKyAgdmlydHVhbCBNQ0NvbnRleHQgJmdldENvbnRleHQoKSA9IDA7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG91dHB1dCBzdHJlYW1lciBmb3IgdGhlIGFzc2VtYmxlci4KKyAgdmlydHVhbCBNQ1N0cmVhbWVyICZnZXRTdHJlYW1lcigpID0gMDsKKworICBNQ1RhcmdldEFzbVBhcnNlciAmZ2V0VGFyZ2V0UGFyc2VyKCkgY29uc3QgeyByZXR1cm4gKlRhcmdldFBhcnNlcjsgfQorICB2b2lkIHNldFRhcmdldFBhcnNlcihNQ1RhcmdldEFzbVBhcnNlciAmUCk7CisKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRBc3NlbWJsZXJEaWFsZWN0KCkgeyByZXR1cm4gMDt9CisgIHZpcnR1YWwgdm9pZCBzZXRBc3NlbWJsZXJEaWFsZWN0KHVuc2lnbmVkIGkpIHsgfQorCisgIGJvb2wgZ2V0U2hvd1BhcnNlZE9wZXJhbmRzKCkgY29uc3QgeyByZXR1cm4gU2hvd1BhcnNlZE9wZXJhbmRzOyB9CisgIHZvaWQgc2V0U2hvd1BhcnNlZE9wZXJhbmRzKGJvb2wgVmFsdWUpIHsgU2hvd1BhcnNlZE9wZXJhbmRzID0gVmFsdWU7IH0KKworICB2b2lkIHNldEVuYWJsZVByaW50U2NoZWRJbmZvKGJvb2wgVmFsdWUpIHsgRW5hYmxlUHJpbnRTY2hlZEluZm8gPSBWYWx1ZTsgfQorICBib29sIHNob3VsZFByaW50U2NoZWRJbmZvKCkgeyByZXR1cm4gRW5hYmxlUHJpbnRTY2hlZEluZm87IH0KKworICAvLy8gXGJyaWVmIFJ1biB0aGUgcGFyc2VyIG9uIHRoZSBpbnB1dCBzb3VyY2UgYnVmZmVyLgorICB2aXJ0dWFsIGJvb2wgUnVuKGJvb2wgTm9Jbml0aWFsVGV4dFNlY3Rpb24sIGJvb2wgTm9GaW5hbGl6ZSA9IGZhbHNlKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIHNldFBhcnNpbmdJbmxpbmVBc20oYm9vbCBWKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1BhcnNpbmdJbmxpbmVBc20oKSA9IDA7CisKKyAgLy8vIFxicmllZiBQYXJzZSBNUy1zdHlsZSBpbmxpbmUgYXNzZW1ibHkuCisgIHZpcnR1YWwgYm9vbCBwYXJzZU1TSW5saW5lQXNtKAorICAgICAgdm9pZCAqQXNtTG9jLCBzdGQ6OnN0cmluZyAmQXNtU3RyaW5nLCB1bnNpZ25lZCAmTnVtT3V0cHV0cywKKyAgICAgIHVuc2lnbmVkICZOdW1JbnB1dHMsIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8dm9pZCAqLCBib29sPj4gJk9wRGVjbHMsCisgICAgICBTbWFsbFZlY3RvckltcGw8c3RkOjpzdHJpbmc+ICZDb25zdHJhaW50cywKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnN0cmluZz4gJkNsb2JiZXJzLCBjb25zdCBNQ0luc3RySW5mbyAqTUlJLAorICAgICAgY29uc3QgTUNJbnN0UHJpbnRlciAqSVAsIE1DQXNtUGFyc2VyU2VtYUNhbGxiYWNrICZTSSkgPSAwOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIG5vdGUgYXQgdGhlIGxvY2F0aW9uIFxwIEwsIHdpdGggdGhlIG1lc3NhZ2UgXHAgTXNnLgorICB2aXJ0dWFsIHZvaWQgTm90ZShTTUxvYyBMLCBjb25zdCBUd2luZSAmTXNnLCBTTVJhbmdlIFJhbmdlID0gTm9uZSkgPSAwOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIHdhcm5pbmcgYXQgdGhlIGxvY2F0aW9uIFxwIEwsIHdpdGggdGhlIG1lc3NhZ2UgXHAgTXNnLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVGhlIHJldHVybiB2YWx1ZSBpcyB0cnVlLCBpZiB3YXJuaW5ncyBhcmUgZmF0YWwuCisgIHZpcnR1YWwgYm9vbCBXYXJuaW5nKFNNTG9jIEwsIGNvbnN0IFR3aW5lICZNc2csIFNNUmFuZ2UgUmFuZ2UgPSBOb25lKSA9IDA7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYW4gZXJyb3IgYXQgdGhlIGxvY2F0aW9uIFxwIEwsIHdpdGggdGhlIG1lc3NhZ2UgXHAgTXNnLiBUaGlzCisgIC8vLyBtYXkgYmUgbW9kaWZpZWQgYmVmb3JlIGJlaW5nIGVtaXR0ZWQuCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFsd2F5cyB0cnVlLCBhcyBhbiBpZGlvbWF0aWMgY29udmVuaWVuY2UgdG8KKyAgLy8vIGNsaWVudHMuCisgIGJvb2wgRXJyb3IoU01Mb2MgTCwgY29uc3QgVHdpbmUgJk1zZywgU01SYW5nZSBSYW5nZSA9IE5vbmUpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhbiBlcnJvciBhdCB0aGUgbG9jYXRpb24gXHAgTCwgd2l0aCB0aGUgbWVzc2FnZSBccCBNc2cuCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFsd2F5cyB0cnVlLCBhcyBhbiBpZGlvbWF0aWMgY29udmVuaWVuY2UgdG8KKyAgLy8vIGNsaWVudHMuCisgIHZpcnR1YWwgYm9vbCBwcmludEVycm9yKFNNTG9jIEwsIGNvbnN0IFR3aW5lICZNc2csIFNNUmFuZ2UgUmFuZ2UgPSBOb25lKSA9IDA7CisKKyAgYm9vbCBoYXNQZW5kaW5nRXJyb3IoKSB7IHJldHVybiAhUGVuZGluZ0Vycm9ycy5lbXB0eSgpOyB9CisKKyAgYm9vbCBwcmludFBlbmRpbmdFcnJvcnMoKSB7CisgICAgYm9vbCBydiA9ICFQZW5kaW5nRXJyb3JzLmVtcHR5KCk7CisgICAgZm9yIChhdXRvIEVyciA6IFBlbmRpbmdFcnJvcnMpIHsKKyAgICAgIHByaW50RXJyb3IoRXJyLkxvYywgVHdpbmUoRXJyLk1zZyksIEVyci5SYW5nZSk7CisgICAgfQorICAgIFBlbmRpbmdFcnJvcnMuY2xlYXIoKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICBib29sIGFkZEVycm9yU3VmZml4KGNvbnN0IFR3aW5lICZTdWZmaXgpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBuZXh0IEFzbVRva2VuIGluIHRoZSBzdHJlYW0sIHBvc3NpYmx5IGhhbmRsaW5nIGZpbGUKKyAgLy8vIGluY2x1c2lvbiBmaXJzdC4KKyAgdmlydHVhbCBjb25zdCBBc21Ub2tlbiAmTGV4KCkgPSAwOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBjdXJyZW50IEFzbVRva2VuIGZyb20gdGhlIHN0cmVhbS4KKyAgY29uc3QgQXNtVG9rZW4gJmdldFRvaygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmVwb3J0IGFuIGVycm9yIGF0IHRoZSBjdXJyZW50IGxleGVyIGxvY2F0aW9uLgorICBib29sIFRva0Vycm9yKGNvbnN0IFR3aW5lICZNc2csIFNNUmFuZ2UgUmFuZ2UgPSBOb25lKTsKKworICBib29sIHBhcnNlVG9rZW5Mb2MoU01Mb2MgJkxvYyk7CisgIGJvb2wgcGFyc2VUb2tlbihBc21Ub2tlbjo6VG9rZW5LaW5kIFQsIGNvbnN0IFR3aW5lICZNc2cgPSAidW5leHBlY3RlZCB0b2tlbiIpOworICAvLy8gXGJyaWVmIEF0dGVtcHQgdG8gcGFyc2UgYW5kIGNvbnN1bWUgdG9rZW4sIHJldHVybmluZyB0cnVlIG9uCisgIC8vLyBzdWNjZXNzLgorICBib29sIHBhcnNlT3B0aW9uYWxUb2tlbihBc21Ub2tlbjo6VG9rZW5LaW5kIFQpOworCisgIGJvb2wgcGFyc2VFT0woY29uc3QgVHdpbmUgJkVyck1zZyk7CisKKyAgYm9vbCBwYXJzZU1hbnkoZnVuY3Rpb25fcmVmPGJvb2woKT4gcGFyc2VPbmUsIGJvb2wgaGFzQ29tbWEgPSB0cnVlKTsKKworICBib29sIHBhcnNlSW50VG9rZW4oaW50NjRfdCAmViwgY29uc3QgVHdpbmUgJkVyck1zZyk7CisKKyAgYm9vbCBjaGVjayhib29sIFAsIGNvbnN0IFR3aW5lICZNc2cpOworICBib29sIGNoZWNrKGJvb2wgUCwgU01Mb2MgTG9jLCBjb25zdCBUd2luZSAmTXNnKTsKKworICAvLy8gXGJyaWVmIFBhcnNlIGFuIGlkZW50aWZpZXIgb3Igc3RyaW5nIChhcyBhIHF1b3RlZCBpZGVudGlmaWVyKSBhbmQgc2V0IFxwCisgIC8vLyBSZXMgdG8gdGhlIGlkZW50aWZpZXIgY29udGVudHMuCisgIHZpcnR1YWwgYm9vbCBwYXJzZUlkZW50aWZpZXIoU3RyaW5nUmVmICZSZXMpID0gMDsKKworICAvLy8gXGJyaWVmIFBhcnNlIHVwIHRvIHRoZSBlbmQgb2Ygc3RhdGVtZW50IGFuZCByZXR1cm4gdGhlIGNvbnRlbnRzIGZyb20gdGhlCisgIC8vLyBjdXJyZW50IHRva2VuIHVudGlsIHRoZSBlbmQgb2YgdGhlIHN0YXRlbWVudDsgdGhlIGN1cnJlbnQgdG9rZW4gb24gZXhpdAorICAvLy8gd2lsbCBiZSBlaXRoZXIgdGhlIEVuZE9mU3RhdGVtZW50IG9yIEVPRi4KKyAgdmlydHVhbCBTdHJpbmdSZWYgcGFyc2VTdHJpbmdUb0VuZE9mU3RhdGVtZW50KCkgPSAwOworCisgIC8vLyBcYnJpZWYgUGFyc2UgdGhlIGN1cnJlbnQgdG9rZW4gYXMgYSBzdHJpbmcgd2hpY2ggbWF5IGluY2x1ZGUgZXNjYXBlZAorICAvLy8gY2hhcmFjdGVycyBhbmQgcmV0dXJuIHRoZSBzdHJpbmcgY29udGVudHMuCisgIHZpcnR1YWwgYm9vbCBwYXJzZUVzY2FwZWRTdHJpbmcoc3RkOjpzdHJpbmcgJkRhdGEpID0gMDsKKworICAvLy8gXGJyaWVmIFNraXAgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzdGF0ZW1lbnQsIGZvciBlcnJvciByZWNvdmVyeS4KKyAgdmlydHVhbCB2b2lkIGVhdFRvRW5kT2ZTdGF0ZW1lbnQoKSA9IDA7CisKKyAgLy8vIFxicmllZiBQYXJzZSBhbiBhcmJpdHJhcnkgZXhwcmVzc2lvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gUmVzIC0gVGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLiBUaGUgcmVzdWx0IGlzIHVuZGVmaW5lZAorICAvLy8gb24gZXJyb3IuCisgIC8vLyBccmV0dXJuIC0gRmFsc2Ugb24gc3VjY2Vzcy4KKyAgdmlydHVhbCBib29sIHBhcnNlRXhwcmVzc2lvbihjb25zdCBNQ0V4cHIgKiZSZXMsIFNNTG9jICZFbmRMb2MpID0gMDsKKyAgYm9vbCBwYXJzZUV4cHJlc3Npb24oY29uc3QgTUNFeHByIComUmVzKTsKKworICAvLy8gXGJyaWVmIFBhcnNlIGEgcHJpbWFyeSBleHByZXNzaW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSZXMgLSBUaGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uIFRoZSByZXN1bHQgaXMgdW5kZWZpbmVkCisgIC8vLyBvbiBlcnJvci4KKyAgLy8vIFxyZXR1cm4gLSBGYWxzZSBvbiBzdWNjZXNzLgorICB2aXJ0dWFsIGJvb2wgcGFyc2VQcmltYXJ5RXhwcihjb25zdCBNQ0V4cHIgKiZSZXMsIFNNTG9jICZFbmRMb2MpID0gMDsKKworICAvLy8gXGJyaWVmIFBhcnNlIGFuIGFyYml0cmFyeSBleHByZXNzaW9uLCBhc3N1bWluZyB0aGF0IGFuIGluaXRpYWwgJygnIGhhcworICAvLy8gYWxyZWFkeSBiZWVuIGNvbnN1bWVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSZXMgLSBUaGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uIFRoZSByZXN1bHQgaXMgdW5kZWZpbmVkCisgIC8vLyBvbiBlcnJvci4KKyAgLy8vIFxyZXR1cm4gLSBGYWxzZSBvbiBzdWNjZXNzLgorICB2aXJ0dWFsIGJvb2wgcGFyc2VQYXJlbkV4cHJlc3Npb24oY29uc3QgTUNFeHByIComUmVzLCBTTUxvYyAmRW5kTG9jKSA9IDA7CisKKyAgLy8vIFxicmllZiBQYXJzZSBhbiBleHByZXNzaW9uIHdoaWNoIG11c3QgZXZhbHVhdGUgdG8gYW4gYWJzb2x1dGUgdmFsdWUuCisgIC8vLworICAvLy8gXHBhcmFtIFJlcyAtIFRoZSB2YWx1ZSBvZiB0aGUgYWJzb2x1dGUgZXhwcmVzc2lvbi4gVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQKKyAgLy8vIG9uIGVycm9yLgorICAvLy8gXHJldHVybiAtIEZhbHNlIG9uIHN1Y2Nlc3MuCisgIHZpcnR1YWwgYm9vbCBwYXJzZUFic29sdXRlRXhwcmVzc2lvbihpbnQ2NF90ICZSZXMpID0gMDsKKworICAvLy8gXGJyaWVmIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBzZWN0aW9uIHNldCBpbiB0aGUgc3RyZWFtZXIuIE90aGVyd2lzZSwKKyAgLy8vIHJlcG9ydCBhbiBlcnJvciBhbmQgc3dpdGNoIHRvIC50ZXh0LgorICAvLy8gXHJldHVybiAtIEZhbHNlIG9uIHN1Y2Nlc3MuCisgIHZpcnR1YWwgYm9vbCBjaGVja0ZvclZhbGlkU2VjdGlvbigpID0gMDsKKworICAvLy8gXGJyaWVmIFBhcnNlIGFuIGFyYml0cmFyeSBleHByZXNzaW9uIG9mIGEgc3BlY2lmaWVkIHBhcmVudGhlc2lzIGRlcHRoLAorICAvLy8gYXNzdW1pbmcgdGhhdCB0aGUgaW5pdGlhbCAnKCcgY2hhcmFjdGVycyBoYXZlIGFscmVhZHkgYmVlbiBjb25zdW1lZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gUGFyZW5EZXB0aCAtIFNwZWNpZmllcyBob3cgbWFueSB0cmFpbGluZyBleHByZXNzaW9ucyBvdXRzaWRlIHRoZQorICAvLy8gY3VycmVudCBwYXJlbnRoZXNlcyB3ZSBoYXZlIHRvIHBhcnNlLgorICAvLy8gXHBhcmFtIFJlcyAtIFRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbi4gVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQKKyAgLy8vIG9uIGVycm9yLgorICAvLy8gXHJldHVybiAtIEZhbHNlIG9uIHN1Y2Nlc3MuCisgIHZpcnR1YWwgYm9vbCBwYXJzZVBhcmVuRXhwck9mRGVwdGgodW5zaWduZWQgUGFyZW5EZXB0aCwgY29uc3QgTUNFeHByIComUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jICZFbmRMb2MpID0gMDsKK307CisKKy8vLyBcYnJpZWYgQ3JlYXRlIGFuIE1DQXNtUGFyc2VyIGluc3RhbmNlLgorTUNBc21QYXJzZXIgKmNyZWF0ZU1DQXNtUGFyc2VyKFNvdXJjZU1nciAmLCBNQ0NvbnRleHQgJiwgTUNTdHJlYW1lciAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtSW5mbyAmLCB1bnNpZ25lZCBDQiA9IDApOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ1BBUlNFUl9NQ0FTTVBBUlNFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL01DQXNtUGFyc2VyRXh0ZW5zaW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL01DQXNtUGFyc2VyRXh0ZW5zaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiOGQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvTUNBc21QYXJzZXJFeHRlbnNpb24uaApAQCAtMCwwICsxLDEyMSBAQAorLy89PT0tIGxsdm0vTUMvTUNBc21QYXJzZXJFeHRlbnNpb24uaCAtIEFzbSBQYXJzZXIgSG9va3MgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DUEFSU0VSX01DQVNNUEFSU0VSRVhURU5TSU9OX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1BBUlNFUl9NQ0FTTVBBUlNFUkVYVEVOU0lPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUGFyc2VyL01DQXNtTGV4ZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUGFyc2VyL01DQXNtUGFyc2VyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NNTG9jLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVHdpbmU7CisKKy8vLyBcYnJpZWYgR2VuZXJpYyBpbnRlcmZhY2UgZm9yIGV4dGVuZGluZyB0aGUgTUNBc21QYXJzZXIsCisvLy8gd2hpY2ggaXMgaW1wbGVtZW50ZWQgYnkgdGFyZ2V0IGFuZCBvYmplY3QgZmlsZSBhc3NlbWJseSBwYXJzZXIKKy8vLyBpbXBsZW1lbnRhdGlvbnMuCitjbGFzcyBNQ0FzbVBhcnNlckV4dGVuc2lvbiB7CisgIE1DQXNtUGFyc2VyICpQYXJzZXI7CisKK3Byb3RlY3RlZDoKKyAgTUNBc21QYXJzZXJFeHRlbnNpb24oKTsKKworICAvLyBIZWxwZXIgdGVtcGxhdGUgZm9yIGltcGxlbWVudGluZyBzdGF0aWMgZGlzcGF0Y2ggZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIChUOjoqSGFuZGxlcikoU3RyaW5nUmVmLCBTTUxvYyk+CisgIHN0YXRpYyBib29sIEhhbmRsZURpcmVjdGl2ZShNQ0FzbVBhcnNlckV4dGVuc2lvbiAqVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jIERpcmVjdGl2ZUxvYykgeworICAgIFQgKk9iaiA9IHN0YXRpY19jYXN0PFQqPihUYXJnZXQpOworICAgIHJldHVybiAoT2JqLT4qSGFuZGxlcikoRGlyZWN0aXZlLCBEaXJlY3RpdmVMb2MpOworICB9CisKKyAgYm9vbCBCcmFja2V0RXhwcmVzc2lvbnNTdXBwb3J0ZWQgPSBmYWxzZTsKKworcHVibGljOgorICBNQ0FzbVBhcnNlckV4dGVuc2lvbihjb25zdCBNQ0FzbVBhcnNlckV4dGVuc2lvbiAmKSA9IGRlbGV0ZTsKKyAgTUNBc21QYXJzZXJFeHRlbnNpb24gJm9wZXJhdG9yPShjb25zdCBNQ0FzbVBhcnNlckV4dGVuc2lvbiAmKSA9IGRlbGV0ZTsKKyAgdmlydHVhbCB+TUNBc21QYXJzZXJFeHRlbnNpb24oKTsKKworICAvLy8gXGJyaWVmIEluaXRpYWxpemUgdGhlIGV4dGVuc2lvbiBmb3IgcGFyc2luZyB1c2luZyB0aGUgZ2l2ZW4gXHAgUGFyc2VyLgorICAvLy8gVGhlIGV4dGVuc2lvbiBzaG91bGQgdXNlIHRoZSBBc21QYXJzZXIgaW50ZXJmYWNlcyB0byByZWdpc3RlciBpdHMKKyAgLy8vIHBhcnNpbmcgcm91dGluZXMuCisgIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKE1DQXNtUGFyc2VyICZQYXJzZXIpOworCisgIC8vLyBcbmFtZSBNQ0FzbVBhcnNlciBQcm94eSBJbnRlcmZhY2VzCisgIC8vLyBAeworCisgIE1DQ29udGV4dCAmZ2V0Q29udGV4dCgpIHsgcmV0dXJuIGdldFBhcnNlcigpLmdldENvbnRleHQoKTsgfQorCisgIE1DQXNtTGV4ZXIgJmdldExleGVyKCkgeyByZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0TGV4ZXIoKTsgfQorICBjb25zdCBNQ0FzbUxleGVyICZnZXRMZXhlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxNQ0FzbVBhcnNlckV4dGVuc2lvbiAqPih0aGlzKS0+Z2V0TGV4ZXIoKTsKKyAgfQorCisgIE1DQXNtUGFyc2VyICZnZXRQYXJzZXIoKSB7IHJldHVybiAqUGFyc2VyOyB9CisgIGNvbnN0IE1DQXNtUGFyc2VyICZnZXRQYXJzZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TUNBc21QYXJzZXJFeHRlbnNpb24qPih0aGlzKS0+Z2V0UGFyc2VyKCk7CisgIH0KKworICBTb3VyY2VNZ3IgJmdldFNvdXJjZU1hbmFnZXIoKSB7IHJldHVybiBnZXRQYXJzZXIoKS5nZXRTb3VyY2VNYW5hZ2VyKCk7IH0KKyAgTUNTdHJlYW1lciAmZ2V0U3RyZWFtZXIoKSB7IHJldHVybiBnZXRQYXJzZXIoKS5nZXRTdHJlYW1lcigpOyB9CisKKyAgYm9vbCBXYXJuaW5nKFNNTG9jIEwsIGNvbnN0IFR3aW5lICZNc2cpIHsKKyAgICByZXR1cm4gZ2V0UGFyc2VyKCkuV2FybmluZyhMLCBNc2cpOworICB9CisKKyAgYm9vbCBFcnJvcihTTUxvYyBMLCBjb25zdCBUd2luZSAmTXNnLCBTTVJhbmdlIFJhbmdlID0gU01SYW5nZSgpKSB7CisgICAgcmV0dXJuIGdldFBhcnNlcigpLkVycm9yKEwsIE1zZywgUmFuZ2UpOworICB9CisKKyAgdm9pZCBOb3RlKFNNTG9jIEwsIGNvbnN0IFR3aW5lICZNc2cpIHsKKyAgICBnZXRQYXJzZXIoKS5Ob3RlKEwsIE1zZyk7CisgIH0KKworICBib29sIFRva0Vycm9yKGNvbnN0IFR3aW5lICZNc2cpIHsKKyAgICByZXR1cm4gZ2V0UGFyc2VyKCkuVG9rRXJyb3IoTXNnKTsKKyAgfQorCisgIGNvbnN0IEFzbVRva2VuICZMZXgoKSB7IHJldHVybiBnZXRQYXJzZXIoKS5MZXgoKTsgfQorICBjb25zdCBBc21Ub2tlbiAmZ2V0VG9rKCkgeyByZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0VG9rKCk7IH0KKyAgYm9vbCBwYXJzZVRva2VuKEFzbVRva2VuOjpUb2tlbktpbmQgVCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZNc2cgPSAidW5leHBlY3RlZCB0b2tlbiIpIHsKKyAgICByZXR1cm4gZ2V0UGFyc2VyKCkucGFyc2VUb2tlbihULCBNc2cpOworICB9CisKKyAgYm9vbCBwYXJzZU1hbnkoZnVuY3Rpb25fcmVmPGJvb2woKT4gcGFyc2VPbmUsIGJvb2wgaGFzQ29tbWEgPSB0cnVlKSB7CisgICAgcmV0dXJuIGdldFBhcnNlcigpLnBhcnNlTWFueShwYXJzZU9uZSwgaGFzQ29tbWEpOworICB9CisKKyAgYm9vbCBwYXJzZU9wdGlvbmFsVG9rZW4oQXNtVG9rZW46OlRva2VuS2luZCBUKSB7CisgICAgcmV0dXJuIGdldFBhcnNlcigpLnBhcnNlT3B0aW9uYWxUb2tlbihUKTsKKyAgfQorCisgIGJvb2wgY2hlY2soYm9vbCBQLCBjb25zdCBUd2luZSAmTXNnKSB7CisgICAgcmV0dXJuIGdldFBhcnNlcigpLmNoZWNrKFAsIE1zZyk7CisgIH0KKworICBib29sIGNoZWNrKGJvb2wgUCwgU01Mb2MgTG9jLCBjb25zdCBUd2luZSAmTXNnKSB7CisgICAgcmV0dXJuIGdldFBhcnNlcigpLmNoZWNrKFAsIExvYywgTXNnKTsKKyAgfQorCisgIGJvb2wgYWRkRXJyb3JTdWZmaXgoY29uc3QgVHdpbmUgJlN1ZmZpeCkgeworICAgIHJldHVybiBnZXRQYXJzZXIoKS5hZGRFcnJvclN1ZmZpeChTdWZmaXgpOworICB9CisKKyAgYm9vbCBIYXNCcmFja2V0RXhwcmVzc2lvbnMoKSBjb25zdCB7IHJldHVybiBCcmFja2V0RXhwcmVzc2lvbnNTdXBwb3J0ZWQ7IH0KKworICAvLy8gQH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DUEFSU0VSX01DQVNNUEFSU0VSRVhURU5TSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvTUNBc21QYXJzZXJVdGlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9NQ0FzbVBhcnNlclV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxNzNiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvTUNBc21QYXJzZXJVdGlscy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vPT09LSBsbHZtL01DL01DQXNtUGFyc2VyVXRpbHMuaCAtIEFzbSBQYXJzZXIgVXRpbGl0aWVzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1BBUlNFUl9NQ0FTTVBBUlNFUlVUSUxTX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1BBUlNFUl9NQ0FTTVBBUlNFUlVUSUxTX0gKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0FzbVBhcnNlcjsKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIE1DU3ltYm9sOworY2xhc3MgU3RyaW5nUmVmOworCituYW1lc3BhY2UgTUNQYXJzZXJVdGlscyB7CisKKy8vLyBQYXJzZSBhIHZhbHVlIGV4cHJlc3Npb24gYW5kIHJldHVybiB3aGV0aGVyIGl0IGNhbiBiZSBhc3NpZ25lZCB0byBhIHN5bWJvbAorLy8vIHdpdGggdGhlIGdpdmVuIG5hbWUuCisvLy8KKy8vLyBPbiBzdWNjZXNzLCByZXR1cm5zIGZhbHNlIGFuZCBzZXRzIHRoZSBTeW1ib2wgYW5kIFZhbHVlIG91dHB1dCBwYXJhbWV0ZXJzLgorYm9vbCBwYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKFN0cmluZ1JlZiBOYW1lLCBib29sIGFsbG93X3JlZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQXNtUGFyc2VyICZQYXJzZXIsIE1DU3ltYm9sIComU3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRXhwciAqJlZhbHVlKTsKKworfSAvLyBuYW1lc3BhY2UgTUNQYXJzZXJVdGlscworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DUEFSU0VSX01DQVNNUEFSU0VSVVRJTFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9NQ1BhcnNlZEFzbU9wZXJhbmQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvTUNQYXJzZWRBc21PcGVyYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmNzZhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvTUNQYXJzZWRBc21PcGVyYW5kLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8vPT09LSBsbHZtL01DL01DUGFyc2VkQXNtT3BlcmFuZC5oIC0gQXNtIFBhcnNlciBPcGVyYW5kIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1BBUlNFUl9NQ1BBUlNFREFTTU9QRVJBTkRfSAorI2RlZmluZSBMTFZNX01DX01DUEFSU0VSX01DUEFSU0VEQVNNT1BFUkFORF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU01Mb2MuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vLyBNQ1BhcnNlZEFzbU9wZXJhbmQgLSBUaGlzIGFic3RyYWN0IGNsYXNzIHJlcHJlc2VudHMgYSBzb3VyY2UtbGV2ZWwgYXNzZW1ibHkKKy8vLyBpbnN0cnVjdGlvbiBvcGVyYW5kLiAgSXQgc2hvdWxkIGJlIHN1YmNsYXNzZWQgYnkgdGFyZ2V0LXNwZWNpZmljIGNvZGUuICBUaGlzCisvLy8gYmFzZSBjbGFzcyBpcyB1c2VkIGJ5IHRhcmdldC1pbmRlcGVuZGVudCBjbGllbnRzIGFuZCBpcyB0aGUgaW50ZXJmYWNlCisvLy8gYmV0d2VlbiBwYXJzaW5nIGFuIGFzbSBpbnN0cnVjdGlvbiBhbmQgcmVjb2duaXppbmcgaXQuCitjbGFzcyBNQ1BhcnNlZEFzbU9wZXJhbmQgeworICAvLy8gTUNPcGVyYW5kTnVtIC0gVGhlIGNvcnJlc3BvbmRpbmcgTUNJbnN0IG9wZXJhbmQgbnVtYmVyLiAgT25seSB2YWxpZCB3aGVuCisgIC8vLyBwYXJzaW5nIE1TLXN0eWxlIGlubGluZSBhc3NlbWJseS4KKyAgdW5zaWduZWQgTUNPcGVyYW5kTnVtOworCisgIC8vLyBDb25zdHJhaW50IC0gVGhlIGNvbnN0cmFpbnQgb24gdGhpcyBvcGVyYW5kLiAgT25seSB2YWxpZCB3aGVuIHBhcnNpbmcKKyAgLy8vIE1TLXN0eWxlIGlubGluZSBhc3NlbWJseS4KKyAgc3RkOjpzdHJpbmcgQ29uc3RyYWludDsKKworcHJvdGVjdGVkOgorICAvLyBUaGlzIG9ubHkgc2VlbXMgdG8gbmVlZCB0byBiZSBtb3ZhYmxlIChieSBBUk1PcGVyYW5kKSBidXQgQVJNT3BlcmFuZCBoYXMKKyAgLy8gbG90cyBvZiBtZW1iZXJzIGFuZCBNU1ZDIGRvZXNuJ3Qgc3VwcG9ydCBkZWZhdWx0ZWQgbW92ZSBvcHMsIHNvIHRvIGF2b2lkCisgIC8vIHRoYXQgdmVyYm9zaXR5LCBqdXN0IHJlbHkgb24gZGVmYXVsdGVkIGNvcHkgb3BzLiBJdCdzIG9ubHkgdGhlIENvbnN0cmFpbnQKKyAgLy8gc3RyaW5nIG1lbWJlciB0aGF0IHdvdWxkIGJlbmVmaXQgZnJvbSBtb3ZlbWVudCBhbnl3YXkuCisgIE1DUGFyc2VkQXNtT3BlcmFuZCgpID0gZGVmYXVsdDsKKyAgTUNQYXJzZWRBc21PcGVyYW5kKGNvbnN0IE1DUGFyc2VkQXNtT3BlcmFuZCAmUkhTKSA9IGRlZmF1bHQ7CisgIE1DUGFyc2VkQXNtT3BlcmFuZCAmb3BlcmF0b3I9KGNvbnN0IE1DUGFyc2VkQXNtT3BlcmFuZCAmKSA9IGRlZmF1bHQ7CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+TUNQYXJzZWRBc21PcGVyYW5kKCkgPSBkZWZhdWx0OworCisgIHZvaWQgc2V0Q29uc3RyYWludChTdHJpbmdSZWYgQykgeyBDb25zdHJhaW50ID0gQy5zdHIoKTsgfQorICBTdHJpbmdSZWYgZ2V0Q29uc3RyYWludCgpIHsgcmV0dXJuIENvbnN0cmFpbnQ7IH0KKworICB2b2lkIHNldE1DT3BlcmFuZE51bSAodW5zaWduZWQgT3BOdW0pIHsgTUNPcGVyYW5kTnVtID0gT3BOdW07IH0KKyAgdW5zaWduZWQgZ2V0TUNPcGVyYW5kTnVtKCkgeyByZXR1cm4gTUNPcGVyYW5kTnVtOyB9CisKKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0U3ltTmFtZSgpIHsgcmV0dXJuIFN0cmluZ1JlZigpOyB9CisgIHZpcnR1YWwgdm9pZCAqZ2V0T3BEZWNsKCkgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgIC8vLyBpc1Rva2VuIC0gSXMgdGhpcyBhIHRva2VuIG9wZXJhbmQ/CisgIHZpcnR1YWwgYm9vbCBpc1Rva2VuKCkgY29uc3QgPSAwOworICAvLy8gaXNJbW0gLSBJcyB0aGlzIGFuIGltbWVkaWF0ZSBvcGVyYW5kPworICB2aXJ0dWFsIGJvb2wgaXNJbW0oKSBjb25zdCA9IDA7CisgIC8vLyBpc1JlZyAtIElzIHRoaXMgYSByZWdpc3RlciBvcGVyYW5kPworICB2aXJ0dWFsIGJvb2wgaXNSZWcoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0UmVnKCkgY29uc3QgPSAwOworCisgIC8vLyBpc01lbSAtIElzIHRoaXMgYSBtZW1vcnkgb3BlcmFuZD8KKyAgdmlydHVhbCBib29sIGlzTWVtKCkgY29uc3QgPSAwOworCisgIC8vLyBnZXRTdGFydExvYyAtIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IHRva2VuIG9mIHRoaXMgb3BlcmFuZC4KKyAgdmlydHVhbCBTTUxvYyBnZXRTdGFydExvYygpIGNvbnN0ID0gMDsKKyAgLy8vIGdldEVuZExvYyAtIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgdG9rZW4gb2YgdGhpcyBvcGVyYW5kLgorICB2aXJ0dWFsIFNNTG9jIGdldEVuZExvYygpIGNvbnN0ID0gMDsKKworICAvLy8gbmVlZEFkZHJlc3NPZiAtIERvIHdlIG5lZWQgdG8gZW1pdCBjb2RlIHRvIGdldCB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgLy8vIHZhcmlhYmxlL2xhYmVsPyAgIE9ubHkgdmFsaWQgd2hlbiBwYXJzaW5nIE1TLXN0eWxlIGlubGluZSBhc3NlbWJseS4KKyAgdmlydHVhbCBib29sIG5lZWRBZGRyZXNzT2YoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBpc09mZnNldE9mIC0gRG8gd2UgbmVlZCB0byBlbWl0IGNvZGUgdG8gZ2V0IHRoZSBvZmZzZXQgb2YgdGhlIHZhcmlhYmxlLAorICAvLy8gcmF0aGVyIHRoZW4gdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZT8gICBPbmx5IHZhbGlkIHdoZW4gcGFyc2luZyBNUy1zdHlsZQorICAvLy8gaW5saW5lIGFzc2VtYmx5LgorICB2aXJ0dWFsIGJvb2wgaXNPZmZzZXRPZigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIGdldE9mZnNldE9mTG9jIC0gR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgb2Zmc2V0IG9wZXJhdG9yLgorICB2aXJ0dWFsIFNNTG9jIGdldE9mZnNldE9mTG9jKCkgY29uc3QgeyByZXR1cm4gU01Mb2MoKTsgfQorCisgIC8vLyBwcmludCAtIFByaW50IGEgZGVidWcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9wZXJhbmQgdG8gdGhlIGdpdmVuIHN0cmVhbS4KKyAgdmlydHVhbCB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgPSAwOworCisgIC8vLyBkdW1wIC0gUHJpbnQgdG8gdGhlIGRlYnVnIHN0cmVhbS4KKyAgdmlydHVhbCB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBEZWJ1Z2dpbmcgU3VwcG9ydAorCitpbmxpbmUgcmF3X29zdHJlYW0mIG9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNQ1BhcnNlZEFzbU9wZXJhbmQgJk1PKSB7CisgIE1PLnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ1BBUlNFUl9NQ1BBUlNFREFTTU9QRVJBTkRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9NQ1RhcmdldEFzbVBhcnNlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9NQ1RhcmdldEFzbVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Mjg3OTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL01DVGFyZ2V0QXNtUGFyc2VyLmgKQEAgLTAsMCArMSw0MzIgQEAKKy8vPT09LSBsbHZtL01DL01DVGFyZ2V0QXNtUGFyc2VyLmggLSBUYXJnZXQgQXNzZW1ibHkgUGFyc2VyIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1BBUlNFUl9NQ1RBUkdFVEFTTVBBUlNFUl9ICisjZGVmaW5lIExMVk1fTUNfTUNQQVJTRVJfTUNUQVJHRVRBU01QQVJTRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0V4cHIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DSW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ0FzbUxleGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ0FzbVBhcnNlckV4dGVuc2lvbi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNUYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NNTG9jLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNJbnN0OworY2xhc3MgTUNQYXJzZWRBc21PcGVyYW5kOworY2xhc3MgTUNTdHJlYW1lcjsKK2NsYXNzIE1DU3VidGFyZ2V0SW5mbzsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBTbWFsbFZlY3RvckltcGw7CisKK3VzaW5nIE9wZXJhbmRWZWN0b3IgPSBTbWFsbFZlY3RvckltcGw8c3RkOjp1bmlxdWVfcHRyPE1DUGFyc2VkQXNtT3BlcmFuZD4+OworCitlbnVtIEFzbVJld3JpdGVLaW5kIHsKKyAgQU9LX0FsaWduLCAgICAgICAgICAvLyBSZXdyaXRlIGFsaWduIGFzIC5hbGlnbi4KKyAgQU9LX0VWRU4sICAgICAgICAgICAvLyBSZXdyaXRlIGV2ZW4gYXMgLmV2ZW4uCisgIEFPS19FbWl0LCAgICAgICAgICAgLy8gUmV3cml0ZSBfZW1pdCBhcyAuYnl0ZS4KKyAgQU9LX0lucHV0LCAgICAgICAgICAvLyBSZXdyaXRlIGluIHRlcm1zIG9mICROLgorICBBT0tfT3V0cHV0LCAgICAgICAgIC8vIFJld3JpdGUgaW4gdGVybXMgb2YgJE4uCisgIEFPS19TaXplRGlyZWN0aXZlLCAgLy8gQWRkIGEgc2l6aW5nIGRpcmVjdGl2ZSAoZS5nLiwgZHdvcmQgcHRyKS4KKyAgQU9LX0xhYmVsLCAgICAgICAgICAvLyBSZXdyaXRlIGxvY2FsIGxhYmVscy4KKyAgQU9LX0VuZE9mU3RhdGVtZW50LCAvLyBBZGQgRW5kT2ZTdGF0ZW1lbnQgKGUuZy4sICJcblx0IikuCisgIEFPS19Ta2lwLCAgICAgICAgICAgLy8gU2tpcCBlbWlzc2lvbiAoZS5nLiwgb2Zmc2V0L3R5cGUgb3BlcmF0b3JzKS4KKyAgQU9LX0ludGVsRXhwciAgICAgICAvLyBTaXplRGlyZWN0aXZlIFN5bURpc3AgW0Jhc2VSZWcgKyBJbmRleFJlZyAqIFNjYWxlICsgSW1tRGlzcF0KK307CisKK2NvbnN0IGNoYXIgQXNtUmV3cml0ZVByZWNlZGVuY2UgW10gPSB7CisgIDIsIC8vIEFPS19BbGlnbgorICAyLCAvLyBBT0tfRVZFTgorICAyLCAvLyBBT0tfRW1pdAorICAzLCAvLyBBT0tfSW5wdXQKKyAgMywgLy8gQU9LX091dHB1dAorICA1LCAvLyBBT0tfU2l6ZURpcmVjdGl2ZQorICAxLCAvLyBBT0tfTGFiZWwKKyAgNSwgLy8gQU9LX0VuZE9mU3RhdGVtZW50CisgIDIsIC8vIEFPS19Ta2lwCisgIDIgIC8vIEFPS19JbnRlbEV4cHIKK307CisKKy8vIFJlcHJlc250IHRoZSB2YXJpb3VzIHBhcnRzIHdoaWNoIG1ha2VzIHVwIGFuIGludGVsIGV4cHJlc3Npb24sCisvLyB1c2VkIGZvciBlbWl0dGluZyBjb21wb3VuZCBpbnRlbCBleHByZXNzaW9ucworc3RydWN0IEludGVsRXhwciB7CisgIGJvb2wgTmVlZEJyYWNzOworICBpbnQ2NF90IEltbTsKKyAgU3RyaW5nUmVmIEJhc2VSZWc7CisgIFN0cmluZ1JlZiBJbmRleFJlZzsKKyAgdW5zaWduZWQgU2NhbGU7CisKKyAgSW50ZWxFeHByKGJvb2wgbmVlZEJyYWNzID0gZmFsc2UpIDogTmVlZEJyYWNzKG5lZWRCcmFjcyksIEltbSgwKSwKKyAgICBCYXNlUmVnKFN0cmluZ1JlZigpKSwgSW5kZXhSZWcoU3RyaW5nUmVmKCkpLAorICAgIFNjYWxlKDEpIHt9CisgIC8vIENvbXB1bmQgaW1tZWRpYXRlIGV4cHJlc3Npb24KKyAgSW50ZWxFeHByKGludDY0X3QgaW1tLCBib29sIG5lZWRCcmFjcykgOiBJbnRlbEV4cHIobmVlZEJyYWNzKSB7CisgICAgSW1tID0gaW1tOworICB9CisgIC8vIFtSZWcgKyBJbW1lZGlhdGVFeHByZXNzaW9uXQorICAvLyBXZSBkb24ndCBib3RoZXIgdG8gZW1pdCBhbiBpbW1lZGlhdGUgZXhwcmVzc2lvbiBldmFsdWF0ZWQgdG8gemVybworICBJbnRlbEV4cHIoU3RyaW5nUmVmIHJlZywgaW50NjRfdCBpbW0gPSAwLCB1bnNpZ25lZCBzY2FsZSA9IDAsCisgICAgYm9vbCBuZWVkQnJhY3MgPSB0cnVlKSA6CisgICAgSW50ZWxFeHByKGltbSwgbmVlZEJyYWNzKSB7CisgICAgSW5kZXhSZWcgPSByZWc7CisgICAgaWYgKHNjYWxlKQorICAgICAgU2NhbGUgPSBzY2FsZTsKKyAgfQorICAvLyBbQmFzZVJlZyArIEluZGV4UmVnICogU2NhbGVFeHByZXNzaW9uICsgSW1tZWRpYXRlRXhwcmVzc2lvbl0KKyAgSW50ZWxFeHByKFN0cmluZ1JlZiBiYXNlUmVnLCBTdHJpbmdSZWYgaW5kZXhSZWcsIHVuc2lnbmVkIHNjYWxlID0gMCwKKyAgICBpbnQ2NF90IGltbSA9IDAsIGJvb2wgbmVlZEJyYWNzID0gdHJ1ZSkgOgorICAgIEludGVsRXhwcihpbmRleFJlZywgaW1tLCBzY2FsZSwgbmVlZEJyYWNzKSB7CisgICAgQmFzZVJlZyA9IGJhc2VSZWc7CisgIH0KKyAgYm9vbCBoYXNCYXNlUmVnKCkgY29uc3QgeworICAgIHJldHVybiBCYXNlUmVnLnNpemUoKTsKKyAgfQorICBib29sIGhhc0luZGV4UmVnKCkgY29uc3QgeworICAgIHJldHVybiBJbmRleFJlZy5zaXplKCk7CisgIH0KKyAgYm9vbCBoYXNSZWdzKCkgY29uc3QgeworICAgIHJldHVybiBoYXNCYXNlUmVnKCkgfHwgaGFzSW5kZXhSZWcoKTsKKyAgfQorICBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgcmV0dXJuIChTY2FsZSA9PSAxKSB8fAorICAgICAgICAgICAoaGFzSW5kZXhSZWcoKSAmJiAoU2NhbGUgPT0gMiB8fCBTY2FsZSA9PSA0IHx8IFNjYWxlID09IDgpKTsKKyAgfQorfTsKKworc3RydWN0IEFzbVJld3JpdGUgeworICBBc21SZXdyaXRlS2luZCBLaW5kOworICBTTUxvYyBMb2M7CisgIHVuc2lnbmVkIExlbjsKKyAgaW50NjRfdCBWYWw7CisgIFN0cmluZ1JlZiBMYWJlbDsKKyAgSW50ZWxFeHByIEludGVsRXhwOworCitwdWJsaWM6CisgIEFzbVJld3JpdGUoQXNtUmV3cml0ZUtpbmQga2luZCwgU01Mb2MgbG9jLCB1bnNpZ25lZCBsZW4gPSAwLCBpbnQ2NF90IHZhbCA9IDApCisgICAgOiBLaW5kKGtpbmQpLCBMb2MobG9jKSwgTGVuKGxlbiksIFZhbCh2YWwpIHt9CisgIEFzbVJld3JpdGUoQXNtUmV3cml0ZUtpbmQga2luZCwgU01Mb2MgbG9jLCB1bnNpZ25lZCBsZW4sIFN0cmluZ1JlZiBsYWJlbCkKKyAgICA6IEFzbVJld3JpdGUoa2luZCwgbG9jLCBsZW4pIHsgTGFiZWwgPSBsYWJlbDsgfQorICBBc21SZXdyaXRlKFNNTG9jIGxvYywgdW5zaWduZWQgbGVuLCBJbnRlbEV4cHIgZXhwKQorICAgIDogQXNtUmV3cml0ZShBT0tfSW50ZWxFeHByLCBsb2MsIGxlbikgeyBJbnRlbEV4cCA9IGV4cDsgfQorfTsKKworc3RydWN0IFBhcnNlSW5zdHJ1Y3Rpb25JbmZvIHsKKyAgU21hbGxWZWN0b3JJbXBsPEFzbVJld3JpdGU+ICpBc21SZXdyaXRlcyA9IG51bGxwdHI7CisKKyAgUGFyc2VJbnN0cnVjdGlvbkluZm8oKSA9IGRlZmF1bHQ7CisgIFBhcnNlSW5zdHJ1Y3Rpb25JbmZvKFNtYWxsVmVjdG9ySW1wbDxBc21SZXdyaXRlPiAqcmV3cml0ZXMpCisgICAgOiBBc21SZXdyaXRlcyhyZXdyaXRlcykge30KK307CisKK2VudW0gT3BlcmFuZE1hdGNoUmVzdWx0VHkgeworICBNYXRjaE9wZXJhbmRfU3VjY2VzcywgIC8vIG9wZXJhbmQgbWF0Y2hlZCBzdWNjZXNzZnVsbHkKKyAgTWF0Y2hPcGVyYW5kX05vTWF0Y2gsICAvLyBvcGVyYW5kIGRpZCBub3QgbWF0Y2gKKyAgTWF0Y2hPcGVyYW5kX1BhcnNlRmFpbCAvLyBvcGVyYW5kIG1hdGNoZWQgYnV0IGhhZCBlcnJvcnMKK307CisKKy8vIFdoZW4gbWF0Y2hpbmcgb2YgYW4gYXNzZW1ibHkgaW5zdHJ1Y3Rpb24gZmFpbHMsIHRoZXJlIG1heSBiZSBtdWx0aXBsZQorLy8gZW5jb2RpbmdzIHRoYXQgYXJlIGNsb3NlIHRvIGJlaW5nIGEgbWF0Y2guIEl0J3Mgb2Z0ZW4gYW1iaWd1b3VzIHdoaWNoIG9uZQorLy8gdGhlIHByb2dyYW1tZXIgaW50ZW5kZWQgdG8gdXNlLCBzbyB3ZSB3YW50IHRvIHJlcG9ydCBhbiBlcnJvciB3aGljaCBtZW50aW9ucworLy8gZWFjaCBvZiB0aGVzZSAibmVhci1taXNzIiBlbmNvZGluZ3MuIFRoaXMgc3RydWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0CisvLyBvbmUgc3VjaCBlbmNvZGluZywgYW5kIHdoeSBpdCBkaWQgbm90IG1hdGNoIHRoZSBwYXJzZWQgaW5zdHJ1Y3Rpb24uCitjbGFzcyBOZWFyTWlzc0luZm8geworcHVibGljOgorICBlbnVtIE5lYXJNaXNzS2luZCB7CisgICAgTm9OZWFyTWlzcywKKyAgICBOZWFyTWlzc09wZXJhbmQsCisgICAgTmVhck1pc3NGZWF0dXJlLAorICAgIE5lYXJNaXNzUHJlZGljYXRlLAorICAgIE5lYXJNaXNzVG9vRmV3T3BlcmFuZHMsCisgIH07CisKKyAgLy8gVGhlIGVuY29kaW5nIGlzIHZhbGlkIGZvciB0aGUgcGFyc2VkIGFzc2VtYmx5IHN0cmluZy4gVGhpcyBpcyBvbmx5IHVzZWQKKyAgLy8gaW50ZXJuYWxseSB0byB0aGUgdGFibGUtZ2VuZXJhdGVkIGFzc2VtYmx5IG1hdGNoZXIuCisgIHN0YXRpYyBOZWFyTWlzc0luZm8gZ2V0U3VjY2VzcygpIHsgcmV0dXJuIE5lYXJNaXNzSW5mbygpOyB9CisKKyAgLy8gVGhlIGluc3RydWN0aW9uIGVuY29kaW5nIGlzIG5vdCB2YWxpZCBiZWNhdXNlIGl0IHJlcXVpcmVzIHNvbWUgdGFyZ2V0CisgIC8vIGZlYXR1cmVzIHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgZW5hYmxlZC4gTWlzc2luZ0ZlYXR1cmVzIGhhcyBhIGJpdCBzZXQgZm9yCisgIC8vIGVhY2ggZmVhdHVyZSB0aGF0IHRoZSBlbmNvZGluZyBuZWVkcyBidXQgd2hpY2ggaXMgbm90IGVuYWJsZWQuCisgIHN0YXRpYyBOZWFyTWlzc0luZm8gZ2V0TWlzc2VkRmVhdHVyZSh1aW50NjRfdCBNaXNzaW5nRmVhdHVyZXMpIHsKKyAgICBOZWFyTWlzc0luZm8gUmVzdWx0OworICAgIFJlc3VsdC5LaW5kID0gTmVhck1pc3NGZWF0dXJlOworICAgIFJlc3VsdC5GZWF0dXJlcyA9IE1pc3NpbmdGZWF0dXJlczsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgLy8gVGhlIGluc3RydWN0aW9uIGVuY29kaW5nIGlzIG5vdCB2YWxpZCBiZWNhdXNlIHRoZSB0YXJnZXQtc3BlY2lmaWMKKyAgLy8gcHJlZGljYXRlIGZ1bmN0aW9uIHJldHVybmVkIGFuIGVycm9yIGNvZGUuIEZhaWx1cmVDb2RlIGlzIHRoZQorICAvLyB0YXJnZXQtc3BlY2lmaWMgZXJyb3IgY29kZSByZXR1cm5lZCBieSB0aGUgcHJlZGljYXRlLgorICBzdGF0aWMgTmVhck1pc3NJbmZvIGdldE1pc3NlZFByZWRpY2F0ZSh1bnNpZ25lZCBGYWlsdXJlQ29kZSkgeworICAgIE5lYXJNaXNzSW5mbyBSZXN1bHQ7CisgICAgUmVzdWx0LktpbmQgPSBOZWFyTWlzc1ByZWRpY2F0ZTsKKyAgICBSZXN1bHQuUHJlZGljYXRlRXJyb3IgPSBGYWlsdXJlQ29kZTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgLy8gVGhlIGluc3RydWN0aW9uIGVuY29kaW5nIGlzIG5vdCB2YWxpZCBiZWNhdXNlIG9uZSAoYW5kIG9ubHkgb25lKSBwYXJzZWQKKyAgLy8gb3BlcmFuZCBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4gT3BlcmFuZEVycm9yIGlzIHRoZSBlcnJvciBjb2RlCisgIC8vIHJlbGF0aW5nIHRvIHRoZSBvcGVyYW5kIGNsYXNzIGV4cGVjdGVkIGJ5IHRoZSBlbmNvZGluZy4gT3BlcmFuZENsYXNzIGlzCisgIC8vIHRoZSB0eXBlIG9mIHRoZSBleHBlY3RlZCBvcGVyYW5kLiBPcGNvZGUgaXMgdGhlIG9wY29kZSBvZiB0aGUgZW5jb2RpbmcuCisgIC8vIE9wZXJhbmRJbmRleCBpcyB0aGUgaW5kZXggaW50byB0aGUgcGFyc2VkIG9wZXJhbmQgbGlzdC4KKyAgc3RhdGljIE5lYXJNaXNzSW5mbyBnZXRNaXNzZWRPcGVyYW5kKHVuc2lnbmVkIE9wZXJhbmRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wZXJhbmRDbGFzcywgdW5zaWduZWQgT3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BlcmFuZEluZGV4KSB7CisgICAgTmVhck1pc3NJbmZvIFJlc3VsdDsKKyAgICBSZXN1bHQuS2luZCA9IE5lYXJNaXNzT3BlcmFuZDsKKyAgICBSZXN1bHQuTWlzc2VkT3BlcmFuZC5FcnJvciA9IE9wZXJhbmRFcnJvcjsKKyAgICBSZXN1bHQuTWlzc2VkT3BlcmFuZC5DbGFzcyA9IE9wZXJhbmRDbGFzczsKKyAgICBSZXN1bHQuTWlzc2VkT3BlcmFuZC5PcGNvZGUgPSBPcGNvZGU7CisgICAgUmVzdWx0Lk1pc3NlZE9wZXJhbmQuSW5kZXggPSBPcGVyYW5kSW5kZXg7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIC8vIFRoZSBpbnN0cnVjdGlvbiBlbmNvZGluZyBpcyBub3QgdmFsaWQgYmVjYXVzZSBpdCBleHBlY3RzIG1vcmUgb3BlcmFuZHMKKyAgLy8gdGhhbiB3ZXJlIHBhcnNlZC4gT3BlcmFuZENsYXNzIGlzIHRoZSBjbGFzcyBvZiB0aGUgZXhwZWN0ZWQgb3BlcmFuZCB0aGF0CisgIC8vIHdhcyBub3QgcHJvdmlkZWQuIE9wY29kZSBpcyB0aGUgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcuCisgIHN0YXRpYyBOZWFyTWlzc0luZm8gZ2V0VG9vRmV3T3BlcmFuZHModW5zaWduZWQgT3BlcmFuZENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wY29kZSkgeworICAgIE5lYXJNaXNzSW5mbyBSZXN1bHQ7CisgICAgUmVzdWx0LktpbmQgPSBOZWFyTWlzc1Rvb0Zld09wZXJhbmRzOworICAgIFJlc3VsdC5Ub29GZXdPcGVyYW5kcy5DbGFzcyA9IE9wZXJhbmRDbGFzczsKKyAgICBSZXN1bHQuVG9vRmV3T3BlcmFuZHMuT3Bjb2RlID0gT3Bjb2RlOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gS2luZCAhPSBOb05lYXJNaXNzOyB9CisKKyAgTmVhck1pc3NLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgLy8gRmVhdHVyZSBmbGFncyByZXF1aXJlZCBieSB0aGUgaW5zdHJ1Y3Rpb24sIHRoYXQgdGhlIGN1cnJlbnQgdGFyZ2V0IGRvZXMKKyAgLy8gbm90IGhhdmUuCisgIHVpbnQ2NF90IGdldEZlYXR1cmVzKCkgY29uc3QgeworICAgIGFzc2VydChLaW5kID09IE5lYXJNaXNzRmVhdHVyZSk7CisgICAgcmV0dXJuIEZlYXR1cmVzOworICB9CisgIC8vIEVycm9yIGNvZGUgcmV0dXJuZWQgYnkgdGhlIHRhcmdldCBwcmVkaWNhdGUgd2hlbiB2YWxpZGF0aW5nIHRoaXMKKyAgLy8gaW5zdHJ1Y3Rpb24gZW5jb2RpbmcuCisgIHVuc2lnbmVkIGdldFByZWRpY2F0ZUVycm9yKCkgY29uc3QgeworICAgIGFzc2VydChLaW5kID09IE5lYXJNaXNzUHJlZGljYXRlKTsKKyAgICByZXR1cm4gUHJlZGljYXRlRXJyb3I7CisgIH0KKyAgLy8gTWF0Y2hDbGFzc0tpbmQgb2YgdGhlIG9wZXJhbmQgdGhhdCB3ZSBleHBlY3RlZCB0byBzZWUuCisgIHVuc2lnbmVkIGdldE9wZXJhbmRDbGFzcygpIGNvbnN0IHsKKyAgICBhc3NlcnQoS2luZCA9PSBOZWFyTWlzc09wZXJhbmQgfHwgS2luZCA9PSBOZWFyTWlzc1Rvb0Zld09wZXJhbmRzKTsKKyAgICByZXR1cm4gTWlzc2VkT3BlcmFuZC5DbGFzczsKKyAgfQorICAvLyBPcGNvZGUgb2YgdGhlIGVuY29kaW5nIHdlIHdlcmUgdHJ5aW5nIHRvIG1hdGNoLgorICB1bnNpZ25lZCBnZXRPcGNvZGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KEtpbmQgPT0gTmVhck1pc3NPcGVyYW5kIHx8IEtpbmQgPT0gTmVhck1pc3NUb29GZXdPcGVyYW5kcyk7CisgICAgcmV0dXJuIE1pc3NlZE9wZXJhbmQuT3Bjb2RlOworICB9CisgIC8vIEVycm9yIGNvZGUgcmV0dXJuZWQgd2hlbiB2YWxpZGF0aW5nIHRoZSBvcGVyYW5kLgorICB1bnNpZ25lZCBnZXRPcGVyYW5kRXJyb3IoKSBjb25zdCB7CisgICAgYXNzZXJ0KEtpbmQgPT0gTmVhck1pc3NPcGVyYW5kKTsKKyAgICByZXR1cm4gTWlzc2VkT3BlcmFuZC5FcnJvcjsKKyAgfQorICAvLyBJbmRleCBvZiB0aGUgYWN0dWFsIG9wZXJhbmQgd2Ugd2VyZSB0cnlpbmcgdG8gbWF0Y2ggaW4gdGhlIGxpc3Qgb2YgcGFyc2VkCisgIC8vIG9wZXJhbmRzLgorICB1bnNpZ25lZCBnZXRPcGVyYW5kSW5kZXgoKSBjb25zdCB7CisgICAgYXNzZXJ0KEtpbmQgPT0gTmVhck1pc3NPcGVyYW5kKTsKKyAgICByZXR1cm4gTWlzc2VkT3BlcmFuZC5JbmRleDsKKyAgfQorCitwcml2YXRlOgorICBOZWFyTWlzc0tpbmQgS2luZDsKKworICAvLyBUaGVzZSB0d28gc3RydWN0cyBzaGFyZSBhIGNvbW1vbiBwcmVmaXgsIHNvIHdlIGNhbiBzYWZlbHkgcmVseSBvbiB0aGUgZmFjdAorICAvLyB0aGF0IHRoZXkgb3ZlcmxhcCBpbiB0aGUgdW5pb24uCisgIHN0cnVjdCBNaXNzZWRPcEluZm8geworICAgIHVuc2lnbmVkIENsYXNzOworICAgIHVuc2lnbmVkIE9wY29kZTsKKyAgICB1bnNpZ25lZCBFcnJvcjsKKyAgICB1bnNpZ25lZCBJbmRleDsKKyAgfTsKKworICBzdHJ1Y3QgVG9vRmV3T3BlcmFuZHNJbmZvIHsKKyAgICB1bnNpZ25lZCBDbGFzczsKKyAgICB1bnNpZ25lZCBPcGNvZGU7CisgIH07CisKKyAgdW5pb24geworICAgIHVpbnQ2NF90IEZlYXR1cmVzOworICAgIHVuc2lnbmVkIFByZWRpY2F0ZUVycm9yOworICAgIE1pc3NlZE9wSW5mbyBNaXNzZWRPcGVyYW5kOworICAgIFRvb0Zld09wZXJhbmRzSW5mbyBUb29GZXdPcGVyYW5kczsKKyAgfTsKKworICBOZWFyTWlzc0luZm8oKSA6IEtpbmQoTm9OZWFyTWlzcykge30KK307CisKKy8vLyBNQ1RhcmdldEFzbVBhcnNlciAtIEdlbmVyaWMgaW50ZXJmYWNlIHRvIHRhcmdldCBzcGVjaWZpYyBhc3NlbWJseSBwYXJzZXJzLgorY2xhc3MgTUNUYXJnZXRBc21QYXJzZXIgOiBwdWJsaWMgTUNBc21QYXJzZXJFeHRlbnNpb24geworcHVibGljOgorICBlbnVtIE1hdGNoUmVzdWx0VHkgeworICAgIE1hdGNoX0ludmFsaWRPcGVyYW5kLAorICAgIE1hdGNoX0ludmFsaWRUaWVkT3BlcmFuZCwKKyAgICBNYXRjaF9NaXNzaW5nRmVhdHVyZSwKKyAgICBNYXRjaF9NbmVtb25pY0ZhaWwsCisgICAgTWF0Y2hfU3VjY2VzcywKKyAgICBNYXRjaF9OZWFyTWlzc2VzLAorICAgIEZJUlNUX1RBUkdFVF9NQVRDSF9SRVNVTFRfVFkKKyAgfTsKKworcHJvdGVjdGVkOiAvLyBDYW4gb25seSBjcmVhdGUgc3ViY2xhc3Nlcy4KKyAgTUNUYXJnZXRBc21QYXJzZXIoTUNUYXJnZXRPcHRpb25zIGNvbnN0ICYsIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0luc3RySW5mbyAmTUlJKTsKKworICAvLy8gQ3JlYXRlIGEgY29weSBvZiBTVEkgYW5kIHJldHVybiBhIG5vbi1jb25zdCByZWZlcmVuY2UgdG8gaXQuCisgIE1DU3VidGFyZ2V0SW5mbyAmY29weVNUSSgpOworCisgIC8vLyBBdmFpbGFibGVGZWF0dXJlcyAtIFRoZSBjdXJyZW50IHNldCBvZiBhdmFpbGFibGUgZmVhdHVyZXMuCisgIHVpbnQ2NF90IEF2YWlsYWJsZUZlYXR1cmVzID0gMDsKKworICAvLy8gUGFyc2luZ0lubGluZUFzbSAtIEFyZSB3ZSBwYXJzaW5nIG1zLXN0eWxlIGlubGluZSBhc3NlbWJseT8KKyAgYm9vbCBQYXJzaW5nSW5saW5lQXNtID0gZmFsc2U7CisKKyAgLy8vIFNlbWFDYWxsYmFjayAtIFRoZSBTZW1hIGNhbGxiYWNrIGltcGxlbWVudGF0aW9uLiAgTXVzdCBiZSBzZXQgd2hlbiBwYXJzaW5nCisgIC8vLyBtcy1zdHlsZSBpbmxpbmUgYXNzZW1ibHkuCisgIE1DQXNtUGFyc2VyU2VtYUNhbGxiYWNrICpTZW1hQ2FsbGJhY2s7CisKKyAgLy8vIFNldCBvZiBvcHRpb25zIHdoaWNoIGFmZmVjdHMgaW5zdHJ1bWVudGF0aW9uIG9mIGlubGluZSBhc3NlbWJseS4KKyAgTUNUYXJnZXRPcHRpb25zIE1DT3B0aW9uczsKKworICAvLy8gQ3VycmVudCBTVEkuCisgIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAqU1RJOworCisgIGNvbnN0IE1DSW5zdHJJbmZvICZNSUk7CisKK3B1YmxpYzoKKyAgTUNUYXJnZXRBc21QYXJzZXIoY29uc3QgTUNUYXJnZXRBc21QYXJzZXIgJikgPSBkZWxldGU7CisgIE1DVGFyZ2V0QXNtUGFyc2VyICZvcGVyYXRvcj0oY29uc3QgTUNUYXJnZXRBc21QYXJzZXIgJikgPSBkZWxldGU7CisKKyAgfk1DVGFyZ2V0QXNtUGFyc2VyKCkgb3ZlcnJpZGU7CisKKyAgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZnZXRTVEkoKSBjb25zdDsKKworICB1aW50NjRfdCBnZXRBdmFpbGFibGVGZWF0dXJlcygpIGNvbnN0IHsgcmV0dXJuIEF2YWlsYWJsZUZlYXR1cmVzOyB9CisgIHZvaWQgc2V0QXZhaWxhYmxlRmVhdHVyZXModWludDY0X3QgVmFsdWUpIHsgQXZhaWxhYmxlRmVhdHVyZXMgPSBWYWx1ZTsgfQorCisgIGJvb2wgaXNQYXJzaW5nSW5saW5lQXNtICgpIHsgcmV0dXJuIFBhcnNpbmdJbmxpbmVBc207IH0KKyAgdm9pZCBzZXRQYXJzaW5nSW5saW5lQXNtIChib29sIFZhbHVlKSB7IFBhcnNpbmdJbmxpbmVBc20gPSBWYWx1ZTsgfQorCisgIE1DVGFyZ2V0T3B0aW9ucyBnZXRUYXJnZXRPcHRpb25zKCkgY29uc3QgeyByZXR1cm4gTUNPcHRpb25zOyB9CisKKyAgdm9pZCBzZXRTZW1hQ2FsbGJhY2soTUNBc21QYXJzZXJTZW1hQ2FsbGJhY2sgKkNhbGxiYWNrKSB7CisgICAgU2VtYUNhbGxiYWNrID0gQ2FsbGJhY2s7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgUGFyc2VSZWdpc3Rlcih1bnNpZ25lZCAmUmVnTm8sIFNNTG9jICZTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01Mb2MgJkVuZExvYykgPSAwOworCisgIC8vLyBTZXRzIGZyYW1lIHJlZ2lzdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgTWFjaGluZUZ1bmN0aW9uLgorICB2aXJ0dWFsIHZvaWQgU2V0RnJhbWVSZWdpc3Rlcih1bnNpZ25lZCBSZWdObykge30KKworICAvLy8gUGFyc2VJbnN0cnVjdGlvbiAtIFBhcnNlIG9uZSBhc3NlbWJseSBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGUgcGFyc2VyIGlzIHBvc2l0aW9uZWQgZm9sbG93aW5nIHRoZSBpbnN0cnVjdGlvbiBuYW1lLiBUaGUgdGFyZ2V0CisgIC8vLyBzcGVjaWZpYyBpbnN0cnVjdGlvbiBwYXJzZXIgc2hvdWxkIHBhcnNlIHRoZSBlbnRpcmUgaW5zdHJ1Y3Rpb24gYW5kCisgIC8vLyBjb25zdHJ1Y3QgdGhlIGFwcHJvcHJpYXRlIE1DSW5zdCwgb3IgZW1pdCBhbiBlcnJvci4gT24gc3VjY2VzcywgdGhlIGVudGlyZQorICAvLy8gbGluZSBzaG91bGQgYmUgcGFyc2VkIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGVuZC1vZi1zdGF0ZW1lbnQgdG9rZW4uIE9uCisgIC8vLyBmYWlsdXJlLCB0aGUgcGFyc2VyIGlzIG5vdCByZXF1aXJlZCB0byByZWFkIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCisgIC8vCisgIC8vLyBccGFyYW0gTmFtZSAtIFRoZSBpbnN0cnVjdGlvbiBuYW1lLgorICAvLy8gXHBhcmFtIE5hbWVMb2MgLSBUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBuYW1lLgorICAvLy8gXHBhcmFtIE9wZXJhbmRzIFtvdXRdIC0gVGhlIGxpc3Qgb2YgcGFyc2VkIG9wZXJhbmRzLCB0aGlzIHJldHVybnMKKyAgLy8vICAgICAgICBvd25lcnNoaXAgb2YgdGhlbSB0byB0aGUgY2FsbGVyLgorICAvLy8gXHJldHVybiBUcnVlIG9uIGZhaWx1cmUuCisgIHZpcnR1YWwgYm9vbCBQYXJzZUluc3RydWN0aW9uKFBhcnNlSW5zdHJ1Y3Rpb25JbmZvICZJbmZvLCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01Mb2MgTmFtZUxvYywgT3BlcmFuZFZlY3RvciAmT3BlcmFuZHMpID0gMDsKKyAgdmlydHVhbCBib29sIFBhcnNlSW5zdHJ1Y3Rpb24oUGFyc2VJbnN0cnVjdGlvbkluZm8gJkluZm8sIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc21Ub2tlbiBUb2tlbiwgT3BlcmFuZFZlY3RvciAmT3BlcmFuZHMpIHsKKyAgICByZXR1cm4gUGFyc2VJbnN0cnVjdGlvbihJbmZvLCBOYW1lLCBUb2tlbi5nZXRMb2MoKSwgT3BlcmFuZHMpOworICB9CisKKyAgLy8vIFBhcnNlRGlyZWN0aXZlIC0gUGFyc2UgYSB0YXJnZXQgc3BlY2lmaWMgYXNzZW1ibGVyIGRpcmVjdGl2ZQorICAvLy8KKyAgLy8vIFRoZSBwYXJzZXIgaXMgcG9zaXRpb25lZCBmb2xsb3dpbmcgdGhlIGRpcmVjdGl2ZSBuYW1lLiAgVGhlIHRhcmdldAorICAvLy8gc3BlY2lmaWMgZGlyZWN0aXZlIHBhcnNlciBzaG91bGQgcGFyc2UgdGhlIGVudGlyZSBkaXJlY3RpdmUgZG9pbmcgb3IKKyAgLy8vIHJlY29yZGluZyBhbnkgdGFyZ2V0IHNwZWNpZmljIHdvcmssIG9yIHJldHVybiB0cnVlIGFuZCBkbyBub3RoaW5nIGlmIHRoZQorICAvLy8gZGlyZWN0aXZlIGlzIG5vdCB0YXJnZXQgc3BlY2lmaWMuIElmIHRoZSBkaXJlY3RpdmUgaXMgc3BlY2lmaWMgZm9yCisgIC8vLyB0aGUgdGFyZ2V0LCB0aGUgZW50aXJlIGxpbmUgaXMgcGFyc2VkIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlCisgIC8vLyBlbmQtb2Ytc3RhdGVtZW50IHRva2VuIGFuZCBmYWxzZSBpcyByZXR1cm5lZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRGlyZWN0aXZlSUQgLSB0aGUgaWRlbnRpZmllciB0b2tlbiBvZiB0aGUgZGlyZWN0aXZlLgorICB2aXJ0dWFsIGJvb2wgUGFyc2VEaXJlY3RpdmUoQXNtVG9rZW4gRGlyZWN0aXZlSUQpID0gMDsKKworICAvLy8gTWF0Y2hBbmRFbWl0SW5zdHJ1Y3Rpb24gLSBSZWNvZ25pemUgYSBzZXJpZXMgb2Ygb3BlcmFuZHMgb2YgYSBwYXJzZWQKKyAgLy8vIGluc3RydWN0aW9uIGFzIGFuIGFjdHVhbCBNQ0luc3QgYW5kIGVtaXQgaXQgdG8gdGhlIHNwZWNpZmllZCBNQ1N0cmVhbWVyLgorICAvLy8gVGhpcyByZXR1cm5zIGZhbHNlIG9uIHN1Y2Nlc3MgYW5kIHJldHVybnMgdHJ1ZSBvbiBmYWlsdXJlIHRvIG1hdGNoLgorICAvLy8KKyAgLy8vIE9uIGZhaWx1cmUsIHRoZSB0YXJnZXQgcGFyc2VyIGlzIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBhIGRpYWdub3N0aWMKKyAgLy8vIGV4cGxhaW5pbmcgdGhlIG1hdGNoIGZhaWx1cmUuCisgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEVtaXRJbnN0cnVjdGlvbihTTUxvYyBJRExvYywgdW5zaWduZWQgJk9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhbmRWZWN0b3IgJk9wZXJhbmRzLCBNQ1N0cmVhbWVyICZPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAmRXJyb3JJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNYXRjaGluZ0lubGluZUFzbSkgPSAwOworCisgIC8vLyBBbGxvd3MgdGFyZ2V0cyB0byBsZXQgcmVnaXN0ZXJzIG9wdCBvdXQgb2YgY2xvYmJlciBsaXN0cy4KKyAgdmlydHVhbCBib29sIE9taXRSZWdpc3RlckZyb21DbG9iYmVyTGlzdHModW5zaWduZWQgUmVnTm8pIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIEFsbG93IGEgdGFyZ2V0IHRvIGFkZCBzcGVjaWFsIGNhc2Ugb3BlcmFuZCBtYXRjaGluZyBmb3IgdGhpbmdzIHRoYXQKKyAgLy8vIHRibGdlbiBkb2Vzbid0L2Nhbid0IGhhbmRsZSBlZmZlY3RpdmVseS4gRm9yIGV4YW1wbGUsIGxpdGVyYWwKKyAgLy8vIGltbWVkaWF0ZXMgb24gQVJNLiBUYWJsZUdlbiBleHBlY3RzIGEgdG9rZW4gb3BlcmFuZCwgYnV0IHRoZSBwYXJzZXIKKyAgLy8vIHdpbGwgcmVjb2duaXplIHRoZW0gYXMgaW1tZWRpYXRlcy4KKyAgdmlydHVhbCB1bnNpZ25lZCB2YWxpZGF0ZVRhcmdldE9wZXJhbmRDbGFzcyhNQ1BhcnNlZEFzbU9wZXJhbmQgJk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEtpbmQpIHsKKyAgICByZXR1cm4gTWF0Y2hfSW52YWxpZE9wZXJhbmQ7CisgIH0KKworICAvLy8gVmFsaWRhdGUgdGhlIGluc3RydWN0aW9uIG1hdGNoIGFnYWluc3QgYW55IGNvbXBsZXggdGFyZ2V0IHByZWRpY2F0ZXMKKyAgLy8vIGJlZm9yZSByZW5kZXJpbmcgYW55IG9wZXJhbmRzIHRvIGl0LgorICB2aXJ0dWFsIHVuc2lnbmVkCisgIGNoZWNrRWFybHlUYXJnZXRNYXRjaFByZWRpY2F0ZShNQ0luc3QgJkluc3QsIGNvbnN0IE9wZXJhbmRWZWN0b3IgJk9wZXJhbmRzKSB7CisgICAgcmV0dXJuIE1hdGNoX1N1Y2Nlc3M7CisgIH0KKworICAvLy8gY2hlY2tUYXJnZXRNYXRjaFByZWRpY2F0ZSAtIFZhbGlkYXRlIHRoZSBpbnN0cnVjdGlvbiBtYXRjaCBhZ2FpbnN0CisgIC8vLyBhbnkgY29tcGxleCB0YXJnZXQgcHJlZGljYXRlcyBub3QgZXhwcmVzc2libGUgdmlhIG1hdGNoIGNsYXNzZXMuCisgIHZpcnR1YWwgdW5zaWduZWQgY2hlY2tUYXJnZXRNYXRjaFByZWRpY2F0ZShNQ0luc3QgJkluc3QpIHsKKyAgICByZXR1cm4gTWF0Y2hfU3VjY2VzczsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBjb252ZXJ0VG9NYXBBbmRDb25zdHJhaW50cyh1bnNpZ25lZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3BlcmFuZFZlY3RvciAmT3BlcmFuZHMpID0gMDsKKworICAvLyBSZXR1cm4gd2hldGhlciB0aGlzIHBhcnNlciB1c2VzIGFzc2lnbm1lbnQgc3RhdGVtZW50cyB3aXRoIGVxdWFscyB0b2tlbnMKKyAgdmlydHVhbCBib29sIGVxdWFsSXNBc21Bc3NpZ25tZW50KCkgeyByZXR1cm4gdHJ1ZTsgfTsKKyAgLy8gUmV0dXJuIHdoZXRoZXIgdGhpcyBzdGFydCBvZiBzdGF0ZW1lbnQgaWRlbnRpZmllciBpcyBhIGxhYmVsCisgIHZpcnR1YWwgYm9vbCBpc0xhYmVsKEFzbVRva2VuICZUb2tlbikgeyByZXR1cm4gdHJ1ZTsgfTsKKyAgLy8gUmV0dXJuIHdoZXRoZXIgdGhpcyBwYXJzZXIgYWNjZXB0IHN0YXIgYXMgc3RhcnQgb2Ygc3RhdGVtZW50CisgIHZpcnR1YWwgYm9vbCBzdGFySXNTdGFydE9mU3RhdGVtZW50KCkgeyByZXR1cm4gZmFsc2U7IH07CisKKyAgdmlydHVhbCBjb25zdCBNQ0V4cHIgKmFwcGx5TW9kaWZpZXJUb0V4cHIoY29uc3QgTUNFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1N5bWJvbFJlZkV4cHI6OlZhcmlhbnRLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgdmlydHVhbCB2b2lkIG9uTGFiZWxQYXJzZWQoTUNTeW1ib2wgKlN5bWJvbCkge30KKworICAvLy8gRW5zdXJlIHRoYXQgYWxsIHByZXZpb3VzbHkgcGFyc2VkIGluc3RydWN0aW9ucyBoYXZlIGJlZW4gZW1pdHRlZCB0byB0aGUKKyAgLy8vIG91dHB1dCBzdHJlYW1lciwgaWYgdGhlIHRhcmdldCBkb2VzIG5vdCBlbWl0IHRoZW0gaW1tZWRpYXRlbHkuCisgIHZpcnR1YWwgdm9pZCBmbHVzaFBlbmRpbmdJbnN0cnVjdGlvbnMoTUNTdHJlYW1lciAmT3V0KSB7fQorCisgIHZpcnR1YWwgY29uc3QgTUNFeHByICpjcmVhdGVUYXJnZXRVbmFyeUV4cHIoY29uc3QgTUNFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzbVRva2VuOjpUb2tlbktpbmQgT3BlcmF0b3JUb2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgeworICAgIHJldHVybiBudWxscHRyOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ1BBUlNFUl9NQ1RBUkdFVEFTTVBBUlNFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DUmVnaXN0ZXJJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DUmVnaXN0ZXJJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3YzllZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNSZWdpc3RlckluZm8uaApAQCAtMCwwICsxLDczNCBAQAorLy89PT0tIE1DL01DUmVnaXN0ZXJJbmZvLmggLSBUYXJnZXQgUmVnaXN0ZXIgRGVzY3JpcHRpb24gLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIGFuIGFic3RyYWN0IGludGVyZmFjZSB1c2VkIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBhCisvLyB0YXJnZXQgbWFjaGluZXMgcmVnaXN0ZXIgZmlsZS4gIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBmb3IgYSB2YXJpZXR5IG9mCisvLyBwdXJwb3NlZCwgZXNwZWNpYWxseSByZWdpc3RlciBhbGxvY2F0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1JFR0lTVEVSSU5GT19ICisjZGVmaW5lIExMVk1fTUNfTUNSRUdJU1RFUklORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTGFuZUJpdG1hc2suaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQW4gdW5zaWduZWQgaW50ZWdlciB0eXBlIGxhcmdlIGVub3VnaCB0byByZXByZXNlbnQgYWxsIHBoeXNpY2FsIHJlZ2lzdGVycywKKy8vLyBidXQgbm90IG5lY2Vzc2FyaWx5IHZpcnR1YWwgcmVnaXN0ZXJzLgordXNpbmcgTUNQaHlzUmVnID0gdWludDE2X3Q7CisKKy8vLyBNQ1JlZ2lzdGVyQ2xhc3MgLSBCYXNlIGNsYXNzIG9mIFRhcmdldFJlZ2lzdGVyQ2xhc3MuCitjbGFzcyBNQ1JlZ2lzdGVyQ2xhc3MgeworcHVibGljOgorICB1c2luZyBpdGVyYXRvciA9IGNvbnN0IE1DUGh5c1JlZyo7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gY29uc3QgTUNQaHlzUmVnKjsKKworICBjb25zdCBpdGVyYXRvciBSZWdzQmVnaW47CisgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IFJlZ1NldDsKKyAgY29uc3QgdWludDMyX3QgTmFtZUlkeDsKKyAgY29uc3QgdWludDE2X3QgUmVnc1NpemU7CisgIGNvbnN0IHVpbnQxNl90IFJlZ1NldFNpemU7CisgIGNvbnN0IHVpbnQxNl90IElEOworICBjb25zdCB1aW50MTZfdCBQaHlzUmVnU2l6ZTsKKyAgY29uc3QgaW50OF90IENvcHlDb3N0OworICBjb25zdCBib29sIEFsbG9jYXRhYmxlOworCisgIC8vLyBnZXRJRCgpIC0gUmV0dXJuIHRoZSByZWdpc3RlciBjbGFzcyBJRCBudW1iZXIuCisgIC8vLworICB1bnNpZ25lZCBnZXRJRCgpIGNvbnN0IHsgcmV0dXJuIElEOyB9CisKKyAgLy8vIGJlZ2luL2VuZCAtIFJldHVybiBhbGwgb2YgdGhlIHJlZ2lzdGVycyBpbiB0aGlzIGNsYXNzLgorICAvLy8KKyAgaXRlcmF0b3IgICAgICAgYmVnaW4oKSBjb25zdCB7IHJldHVybiBSZWdzQmVnaW47IH0KKyAgaXRlcmF0b3IgICAgICAgICBlbmQoKSBjb25zdCB7IHJldHVybiBSZWdzQmVnaW4gKyBSZWdzU2l6ZTsgfQorCisgIC8vLyBnZXROdW1SZWdzIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIGluIHRoaXMgY2xhc3MuCisgIC8vLworICB1bnNpZ25lZCBnZXROdW1SZWdzKCkgY29uc3QgeyByZXR1cm4gUmVnc1NpemU7IH0KKworICAvLy8gZ2V0UmVnaXN0ZXIgLSBSZXR1cm4gdGhlIHNwZWNpZmllZCByZWdpc3RlciBpbiB0aGUgY2xhc3MuCisgIC8vLworICB1bnNpZ25lZCBnZXRSZWdpc3Rlcih1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBnZXROdW1SZWdzKCkgJiYgIlJlZ2lzdGVyIG51bWJlciBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIFJlZ3NCZWdpbltpXTsKKyAgfQorCisgIC8vLyBjb250YWlucyAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgaXMgaW5jbHVkZWQgaW4gdGhpcworICAvLy8gcmVnaXN0ZXIgY2xhc3MuICBUaGlzIGRvZXMgbm90IGluY2x1ZGUgdmlydHVhbCByZWdpc3RlcnMuCisgIGJvb2wgY29udGFpbnModW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgdW5zaWduZWQgSW5CeXRlID0gUmVnICUgODsKKyAgICB1bnNpZ25lZCBCeXRlID0gUmVnIC8gODsKKyAgICBpZiAoQnl0ZSA+PSBSZWdTZXRTaXplKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAoUmVnU2V0W0J5dGVdICYgKDEgPDwgSW5CeXRlKSkgIT0gMDsKKyAgfQorCisgIC8vLyBjb250YWlucyAtIFJldHVybiB0cnVlIGlmIGJvdGggcmVnaXN0ZXJzIGFyZSBpbiB0aGlzIGNsYXNzLgorICBib29sIGNvbnRhaW5zKHVuc2lnbmVkIFJlZzEsIHVuc2lnbmVkIFJlZzIpIGNvbnN0IHsKKyAgICByZXR1cm4gY29udGFpbnMoUmVnMSkgJiYgY29udGFpbnMoUmVnMik7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBwaHlzaWNhbCByZWdpc3RlciBpbiBieXRlcy4KKyAgdW5zaWduZWQgZ2V0UGh5c1JlZ1NpemUoKSBjb25zdCB7IHJldHVybiBQaHlzUmVnU2l6ZTsgfQorICAvLy8gVGVtcG9yYXJ5IGZ1bmN0aW9uIHRvIGFsbG93IG91dC1vZi10cmVlIHRhcmdldHMgdG8gc3dpdGNoLgorICB1bnNpZ25lZCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gZ2V0UGh5c1JlZ1NpemUoKTsgfQorCisgIC8vLyBnZXRDb3B5Q29zdCAtIFJldHVybiB0aGUgY29zdCBvZiBjb3B5aW5nIGEgdmFsdWUgYmV0d2VlbiB0d28gcmVnaXN0ZXJzIGluCisgIC8vLyB0aGlzIGNsYXNzLiBBIG5lZ2F0aXZlIG51bWJlciBtZWFucyB0aGUgcmVnaXN0ZXIgY2xhc3MgaXMgdmVyeSBleHBlbnNpdmUKKyAgLy8vIHRvIGNvcHkgZS5nLiBzdGF0dXMgZmxhZyByZWdpc3RlciBjbGFzc2VzLgorICBpbnQgZ2V0Q29weUNvc3QoKSBjb25zdCB7IHJldHVybiBDb3B5Q29zdDsgfQorCisgIC8vLyBpc0FsbG9jYXRhYmxlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyByZWdpc3RlciBjbGFzcyBtYXkgYmUgdXNlZCB0byBjcmVhdGUKKyAgLy8vIHZpcnR1YWwgcmVnaXN0ZXJzLgorICBib29sIGlzQWxsb2NhdGFibGUoKSBjb25zdCB7IHJldHVybiBBbGxvY2F0YWJsZTsgfQorfTsKKworLy8vIE1DUmVnaXN0ZXJEZXNjIC0gVGhpcyByZWNvcmQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyCisvLy8gcmVnaXN0ZXIuICBUaGUgU3ViUmVncyBmaWVsZCBpcyBhIHplcm8gdGVybWluYXRlZCBhcnJheSBvZiByZWdpc3RlcnMgdGhhdAorLy8vIGFyZSBzdWItcmVnaXN0ZXJzIG9mIHRoZSBzcGVjaWZpYyByZWdpc3RlciwgZS5nLiBBTCwgQUggYXJlIHN1Yi1yZWdpc3RlcnMKKy8vLyBvZiBBWC4gVGhlIFN1cGVyUmVncyBmaWVsZCBpcyBhIHplcm8gdGVybWluYXRlZCBhcnJheSBvZiByZWdpc3RlcnMgdGhhdCBhcmUKKy8vLyBzdXBlci1yZWdpc3RlcnMgb2YgdGhlIHNwZWNpZmljIHJlZ2lzdGVyLCBlLmcuIFJBWCwgRUFYLCBhcmUKKy8vLyBzdXBlci1yZWdpc3RlcnMgb2YgQVguCisvLy8KK3N0cnVjdCBNQ1JlZ2lzdGVyRGVzYyB7CisgIHVpbnQzMl90IE5hbWU7ICAgICAgLy8gUHJpbnRhYmxlIG5hbWUgZm9yIHRoZSByZWcgKGZvciBkZWJ1Z2dpbmcpCisgIHVpbnQzMl90IFN1YlJlZ3M7ICAgLy8gU3ViLXJlZ2lzdGVyIHNldCwgZGVzY3JpYmVkIGFib3ZlCisgIHVpbnQzMl90IFN1cGVyUmVnczsgLy8gU3VwZXItcmVnaXN0ZXIgc2V0LCBkZXNjcmliZWQgYWJvdmUKKworICAvLyBPZmZzZXQgaW50byBNQ1JJOjpTdWJSZWdJbmRpY2VzIG9mIGEgbGlzdCBvZiBzdWItcmVnaXN0ZXIgaW5kaWNlcyBmb3IgZWFjaAorICAvLyBzdWItcmVnaXN0ZXIgaW4gU3ViUmVncy4KKyAgdWludDMyX3QgU3ViUmVnSW5kaWNlczsKKworICAvLyBSZWdVbml0cyAtIFBvaW50cyB0byB0aGUgbGlzdCBvZiByZWdpc3RlciB1bml0cy4gVGhlIGxvdyA0IGJpdHMgaG9sZHMgdGhlCisgIC8vIFNjYWxlLCB0aGUgaGlnaCBiaXRzIGhvbGQgYW4gb2Zmc2V0IGludG8gRGlmZkxpc3RzLiBTZWUgTUNSZWdVbml0SXRlcmF0b3IuCisgIHVpbnQzMl90IFJlZ1VuaXRzOworCisgIC8vLyBJbmRleCBpbnRvIGxpc3Qgd2l0aCBsYW5lIG1hc2sgc2VxdWVuY2VzLiBUaGUgc2VxdWVuY2UgY29udGFpbnMgYSBsYW5lbWFzaworICAvLy8gZm9yIGV2ZXJ5IHJlZ2lzdGVyIHVuaXQuCisgIHVpbnQxNl90IFJlZ1VuaXRMYW5lTWFza3M7Cit9OworCisvLy8gTUNSZWdpc3RlckluZm8gYmFzZSBjbGFzcyAtIFdlIGFzc3VtZSB0aGF0IHRoZSB0YXJnZXQgZGVmaW5lcyBhIHN0YXRpYworLy8vIGFycmF5IG9mIE1DUmVnaXN0ZXJEZXNjIG9iamVjdHMgdGhhdCByZXByZXNlbnQgYWxsIG9mIHRoZSBtYWNoaW5lCisvLy8gcmVnaXN0ZXJzIHRoYXQgdGhlIHRhcmdldCBoYXMuICBBcyBzdWNoLCB3ZSBzaW1wbHkgaGF2ZSB0byB0cmFjayBhIHBvaW50ZXIKKy8vLyB0byB0aGlzIGFycmF5IHNvIHRoYXQgd2UgY2FuIHR1cm4gcmVnaXN0ZXIgbnVtYmVyIGludG8gYSByZWdpc3RlcgorLy8vIGRlc2NyaXB0b3IuCisvLy8KKy8vLyBOb3RlIHRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gYmUgYSBiYXNlIGNsYXNzIG9mIFRhcmdldFJlZ2lzdGVySW5mbywgd2hpY2gKKy8vLyBpcyB0aGUgaW50ZXJmYWNlIHVzZWQgYnkgY29kZWdlbi4gSG93ZXZlciwgc3BlY2lmaWMgdGFyZ2V0cyAqc2hvdWxkIG5ldmVyKgorLy8vIHNwZWNpYWxpemUgdGhpcyBjbGFzcy4gTUNSZWdpc3RlckluZm8gc2hvdWxkIG9ubHkgY29udGFpbiBnZXR0ZXJzIHRvIGFjY2VzcworLy8vIFRhYmxlR2VuIGdlbmVyYXRlZCBwaHlzaWNhbCByZWdpc3RlciBkYXRhLiBJdCBtdXN0IG5vdCBiZSBleHRlbmRlZCB3aXRoCisvLy8gdmlydHVhbCBtZXRob2RzLgorLy8vCitjbGFzcyBNQ1JlZ2lzdGVySW5mbyB7CitwdWJsaWM6CisgIHVzaW5nIHJlZ2NsYXNzX2l0ZXJhdG9yID0gY29uc3QgTUNSZWdpc3RlckNsYXNzICo7CisKKyAgLy8vIER3YXJmTExWTVJlZ1BhaXIgLSBFbWl0dGVkIGJ5IHRhYmxlZ2VuIHNvIER3YXJmPC0+TExWTSByZWcgbWFwcGluZ3MgY2FuIGJlCisgIC8vLyBwZXJmb3JtZWQgd2l0aCBhIGJpbmFyeSBzZWFyY2guCisgIHN0cnVjdCBEd2FyZkxMVk1SZWdQYWlyIHsKKyAgICB1bnNpZ25lZCBGcm9tUmVnOworICAgIHVuc2lnbmVkIFRvUmVnOworCisgICAgYm9vbCBvcGVyYXRvcjwoRHdhcmZMTFZNUmVnUGFpciBSSFMpIGNvbnN0IHsgcmV0dXJuIEZyb21SZWcgPCBSSFMuRnJvbVJlZzsgfQorICB9OworCisgIC8vLyBTdWJSZWdDb3ZlcmVkQml0cyAtIEVtaXR0ZWQgYnkgdGFibGVnZW46IGJpdCByYW5nZSBjb3ZlcmVkIGJ5IGEgc3VicmVnCisgIC8vLyBpbmRleCwgLTEgaW4gYW55IGJlaW5nIGludmFsaWQuCisgIHN0cnVjdCBTdWJSZWdDb3ZlcmVkQml0cyB7CisgICAgdWludDE2X3QgT2Zmc2V0OworICAgIHVpbnQxNl90IFNpemU7CisgIH07CisKK3ByaXZhdGU6CisgIGNvbnN0IE1DUmVnaXN0ZXJEZXNjICpEZXNjOyAgICAgICAgICAgICAgICAgLy8gUG9pbnRlciB0byB0aGUgZGVzY3JpcHRvciBhcnJheQorICB1bnNpZ25lZCBOdW1SZWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBhcnJheQorICB1bnNpZ25lZCBSQVJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBhZGRyZXNzIHJlZ2lzdGVyCisgIHVuc2lnbmVkIFBDUmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvZ3JhbSBjb3VudGVyIHJlZ2lzdGVyCisgIGNvbnN0IE1DUmVnaXN0ZXJDbGFzcyAqQ2xhc3NlczsgICAgICAgICAgICAgLy8gUG9pbnRlciB0byB0aGUgcmVnY2xhc3MgYXJyYXkKKyAgdW5zaWduZWQgTnVtQ2xhc3NlczsgICAgICAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgYXJyYXkKKyAgdW5zaWduZWQgTnVtUmVnVW5pdHM7ICAgICAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgcmVndW5pdHMuCisgIGNvbnN0IE1DUGh5c1JlZyAoKlJlZ1VuaXRSb290cylbMl07ICAgICAgICAgLy8gUG9pbnRlciB0byByZWd1bml0IHJvb3QgdGFibGUuCisgIGNvbnN0IE1DUGh5c1JlZyAqRGlmZkxpc3RzOyAgICAgICAgICAgICAgICAgLy8gUG9pbnRlciB0byB0aGUgZGlmZmxpc3RzIGFycmF5CisgIGNvbnN0IExhbmVCaXRtYXNrICpSZWdVbml0TWFza1NlcXVlbmNlczsgICAgLy8gUG9pbnRlciB0byBsYW5lIG1hc2sgc2VxdWVuY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHJlZ2lzdGVyIHVuaXRzLgorICBjb25zdCBjaGFyICpSZWdTdHJpbmdzOyAgICAgICAgICAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gdGhlIHN0cmluZyB0YWJsZS4KKyAgY29uc3QgY2hhciAqUmVnQ2xhc3NTdHJpbmdzOyAgICAgICAgICAgICAgICAvLyBQb2ludGVyIHRvIHRoZSBjbGFzcyBzdHJpbmdzLgorICBjb25zdCB1aW50MTZfdCAqU3ViUmVnSW5kaWNlczsgICAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gdGhlIHN1YnJlZyBsb29rdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcnJheS4KKyAgY29uc3QgU3ViUmVnQ292ZXJlZEJpdHMgKlN1YlJlZ0lkeFJhbmdlczsgICAvLyBQb2ludGVyIHRvIHRoZSBzdWJyZWcgY292ZXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdCByYW5nZXMgYXJyYXkuCisgIHVuc2lnbmVkIE51bVN1YlJlZ0luZGljZXM7ICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHN1YnJlZyBpbmRpY2VzLgorICBjb25zdCB1aW50MTZfdCAqUmVnRW5jb2RpbmdUYWJsZTsgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gYXJyYXkgb2YgcmVnaXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmNvZGluZ3MuCisKKyAgdW5zaWduZWQgTDJEd2FyZlJlZ3NTaXplOworICB1bnNpZ25lZCBFSEwyRHdhcmZSZWdzU2l6ZTsKKyAgdW5zaWduZWQgRHdhcmYyTFJlZ3NTaXplOworICB1bnNpZ25lZCBFSER3YXJmMkxSZWdzU2l6ZTsKKyAgY29uc3QgRHdhcmZMTFZNUmVnUGFpciAqTDJEd2FyZlJlZ3M7ICAgICAgICAvLyBMTFZNIHRvIER3YXJmIHJlZ3MgbWFwcGluZworICBjb25zdCBEd2FyZkxMVk1SZWdQYWlyICpFSEwyRHdhcmZSZWdzOyAgICAgIC8vIExMVk0gdG8gRHdhcmYgcmVncyBtYXBwaW5nIEVICisgIGNvbnN0IER3YXJmTExWTVJlZ1BhaXIgKkR3YXJmMkxSZWdzOyAgICAgICAgLy8gRHdhcmYgdG8gTExWTSByZWdzIG1hcHBpbmcKKyAgY29uc3QgRHdhcmZMTFZNUmVnUGFpciAqRUhEd2FyZjJMUmVnczsgICAgICAvLyBEd2FyZiB0byBMTFZNIHJlZ3MgbWFwcGluZyBFSAorICBEZW5zZU1hcDx1bnNpZ25lZCwgaW50PiBMMlNFSFJlZ3M7ICAgICAgICAgIC8vIExMVk0gdG8gU0VIIHJlZ3MgbWFwcGluZworICBEZW5zZU1hcDx1bnNpZ25lZCwgaW50PiBMMkNWUmVnczsgICAgICAgICAgIC8vIExMVk0gdG8gQ1YgcmVncyBtYXBwaW5nCisKK3B1YmxpYzoKKyAgLy8vIERpZmZMaXN0SXRlcmF0b3IgLSBCYXNlIGl0ZXJhdG9yIGNsYXNzIHRoYXQgY2FuIHRyYXZlcnNlIHRoZQorICAvLy8gZGlmZmVyZW50aWFsbHkgZW5jb2RlZCByZWdpc3RlciBhbmQgcmVndW5pdCBsaXN0cyBpbiBEaWZmTGlzdHMuCisgIC8vLyBEb24ndCB1c2UgdGhpcyBjbGFzcyBkaXJlY3RseSwgdXNlIG9uZSBvZiB0aGUgc3BlY2lhbGl6ZWQgc3ViLWNsYXNzZXMKKyAgLy8vIGRlZmluZWQgYmVsb3cuCisgIGNsYXNzIERpZmZMaXN0SXRlcmF0b3IgeworICAgIHVpbnQxNl90IFZhbCA9IDA7CisgICAgY29uc3QgTUNQaHlzUmVnICpMaXN0ID0gbnVsbHB0cjsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8vIENyZWF0ZSBhbiBpbnZhbGlkIGl0ZXJhdG9yLiBDYWxsIGluaXQoKSB0byBwb2ludCB0byBzb21ldGhpbmcgdXNlZnVsLgorICAgIERpZmZMaXN0SXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gaW5pdCAtIFBvaW50IHRoZSBpdGVyYXRvciB0byBJbml0VmFsLCBkZWNvZGluZyBzdWJzZXF1ZW50IHZhbHVlcyBmcm9tCisgICAgLy8vIERpZmZMaXN0LiBUaGUgaXRlcmF0b3Igd2lsbCBpbml0aWFsbHkgcG9pbnQgdG8gSW5pdFZhbCwgc3ViLWNsYXNzZXMgYXJlCisgICAgLy8vIHJlc3BvbnNpYmxlIGZvciBza2lwcGluZyB0aGUgc2VlZCB2YWx1ZSBpZiBpdCBpcyBub3QgcGFydCBvZiB0aGUgbGlzdC4KKyAgICB2b2lkIGluaXQoTUNQaHlzUmVnIEluaXRWYWwsIGNvbnN0IE1DUGh5c1JlZyAqRGlmZkxpc3QpIHsKKyAgICAgIFZhbCA9IEluaXRWYWw7CisgICAgICBMaXN0ID0gRGlmZkxpc3Q7CisgICAgfQorCisgICAgLy8vIGFkdmFuY2UgLSBNb3ZlIHRvIHRoZSBuZXh0IGxpc3QgcG9zaXRpb24sIHJldHVybiB0aGUgYXBwbGllZAorICAgIC8vLyBkaWZmZXJlbnRpYWwuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZGV0ZWN0IHRoZSBlbmQgb2YgdGhlIGxpc3QsIHRoYXQKKyAgICAvLy8gaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IChieSBjaGVja2luZyBmb3IgYSAwIHJldHVybiB2YWx1ZSkuCisgICAgdW5zaWduZWQgYWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIkNhbm5vdCBtb3ZlIG9mZiB0aGUgZW5kIG9mIHRoZSBsaXN0LiIpOworICAgICAgTUNQaHlzUmVnIEQgPSAqTGlzdCsrOworICAgICAgVmFsICs9IEQ7CisgICAgICByZXR1cm4gRDsKKyAgICB9CisKKyAgcHVibGljOgorICAgIC8vLyBpc1ZhbGlkIC0gcmV0dXJucyB0cnVlIGlmIHRoaXMgaXRlcmF0b3IgaXMgbm90IHlldCBhdCB0aGUgZW5kLgorICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIExpc3Q7IH0KKworICAgIC8vLyBEZXJlZmVyZW5jZSB0aGUgaXRlcmF0b3IgdG8gZ2V0IHRoZSB2YWx1ZSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgICB1bnNpZ25lZCBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKworICAgIC8vLyBQcmUtaW5jcmVtZW50IHRvIG1vdmUgdG8gdGhlIG5leHQgcG9zaXRpb24uCisgICAgdm9pZCBvcGVyYXRvcisrKCkgeworICAgICAgLy8gVGhlIGVuZCBvZiB0aGUgbGlzdCBpcyBlbmNvZGVkIGFzIGEgMCBkaWZmZXJlbnRpYWwuCisgICAgICBpZiAoIWFkdmFuY2UoKSkKKyAgICAgICAgTGlzdCA9IG51bGxwdHI7CisgICAgfQorICB9OworCisgIC8vIFRoZXNlIGl0ZXJhdG9ycyBhcmUgYWxsb3dlZCB0byBzdWItY2xhc3MgRGlmZkxpc3RJdGVyYXRvciBhbmQgYWNjZXNzCisgIC8vIGludGVybmFsIGxpc3QgcG9pbnRlcnMuCisgIGZyaWVuZCBjbGFzcyBNQ1N1YlJlZ0l0ZXJhdG9yOworICBmcmllbmQgY2xhc3MgTUNTdWJSZWdJbmRleEl0ZXJhdG9yOworICBmcmllbmQgY2xhc3MgTUNTdXBlclJlZ0l0ZXJhdG9yOworICBmcmllbmQgY2xhc3MgTUNSZWdVbml0SXRlcmF0b3I7CisgIGZyaWVuZCBjbGFzcyBNQ1JlZ1VuaXRNYXNrSXRlcmF0b3I7CisgIGZyaWVuZCBjbGFzcyBNQ1JlZ1VuaXRSb290SXRlcmF0b3I7CisKKyAgLy8vIFxicmllZiBJbml0aWFsaXplIE1DUmVnaXN0ZXJJbmZvLCBjYWxsZWQgYnkgVGFibGVHZW4KKyAgLy8vIGF1dG8tZ2VuZXJhdGVkIHJvdXRpbmVzLiAqRE8gTk9UIFVTRSouCisgIHZvaWQgSW5pdE1DUmVnaXN0ZXJJbmZvKGNvbnN0IE1DUmVnaXN0ZXJEZXNjICpELCB1bnNpZ25lZCBOUiwgdW5zaWduZWQgUkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBDLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1JlZ2lzdGVyQ2xhc3MgKkMsIHVuc2lnbmVkIE5DLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1BoeXNSZWcgKCpSVVJvb3RzKVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTlJVLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1BoeXNSZWcgKkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5lQml0bWFzayAqUlVNUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqU3RyaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqQ2xhc3NTdHJpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqU3ViSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ViUmVnQ292ZXJlZEJpdHMgKlN1YklkeFJhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKlJFVCkgeworICAgIERlc2MgPSBEOworICAgIE51bVJlZ3MgPSBOUjsKKyAgICBSQVJlZyA9IFJBOworICAgIFBDUmVnID0gUEM7CisgICAgQ2xhc3NlcyA9IEM7CisgICAgRGlmZkxpc3RzID0gREw7CisgICAgUmVnVW5pdE1hc2tTZXF1ZW5jZXMgPSBSVU1TOworICAgIFJlZ1N0cmluZ3MgPSBTdHJpbmdzOworICAgIFJlZ0NsYXNzU3RyaW5ncyA9IENsYXNzU3RyaW5nczsKKyAgICBOdW1DbGFzc2VzID0gTkM7CisgICAgUmVnVW5pdFJvb3RzID0gUlVSb290czsKKyAgICBOdW1SZWdVbml0cyA9IE5SVTsKKyAgICBTdWJSZWdJbmRpY2VzID0gU3ViSW5kaWNlczsKKyAgICBOdW1TdWJSZWdJbmRpY2VzID0gTnVtSW5kaWNlczsKKyAgICBTdWJSZWdJZHhSYW5nZXMgPSBTdWJJZHhSYW5nZXM7CisgICAgUmVnRW5jb2RpbmdUYWJsZSA9IFJFVDsKKworICAgIC8vIEluaXRpYWxpemUgRFdBUkYgcmVnaXN0ZXIgbWFwcGluZyB2YXJpYWJsZXMKKyAgICBFSEwyRHdhcmZSZWdzID0gbnVsbHB0cjsKKyAgICBFSEwyRHdhcmZSZWdzU2l6ZSA9IDA7CisgICAgTDJEd2FyZlJlZ3MgPSBudWxscHRyOworICAgIEwyRHdhcmZSZWdzU2l6ZSA9IDA7CisgICAgRUhEd2FyZjJMUmVncyA9IG51bGxwdHI7CisgICAgRUhEd2FyZjJMUmVnc1NpemUgPSAwOworICAgIER3YXJmMkxSZWdzID0gbnVsbHB0cjsKKyAgICBEd2FyZjJMUmVnc1NpemUgPSAwOworICB9CisKKyAgLy8vIFxicmllZiBVc2VkIHRvIGluaXRpYWxpemUgTExWTSByZWdpc3RlciB0byBEd2FyZgorICAvLy8gcmVnaXN0ZXIgbnVtYmVyIG1hcHBpbmcuIENhbGxlZCBieSBUYWJsZUdlbiBhdXRvLWdlbmVyYXRlZCByb3V0aW5lcy4KKyAgLy8vICpETyBOT1QgVVNFKi4KKyAgdm9pZCBtYXBMTFZNUmVnc1RvRHdhcmZSZWdzKGNvbnN0IER3YXJmTExWTVJlZ1BhaXIgKk1hcCwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFSCkgeworICAgIGlmIChpc0VIKSB7CisgICAgICBFSEwyRHdhcmZSZWdzID0gTWFwOworICAgICAgRUhMMkR3YXJmUmVnc1NpemUgPSBTaXplOworICAgIH0gZWxzZSB7CisgICAgICBMMkR3YXJmUmVncyA9IE1hcDsKKyAgICAgIEwyRHdhcmZSZWdzU2l6ZSA9IFNpemU7CisgICAgfQorICB9CisKKyAgLy8vIFxicmllZiBVc2VkIHRvIGluaXRpYWxpemUgRHdhcmYgcmVnaXN0ZXIgdG8gTExWTQorICAvLy8gcmVnaXN0ZXIgbnVtYmVyIG1hcHBpbmcuIENhbGxlZCBieSBUYWJsZUdlbiBhdXRvLWdlbmVyYXRlZCByb3V0aW5lcy4KKyAgLy8vICpETyBOT1QgVVNFKi4KKyAgdm9pZCBtYXBEd2FyZlJlZ3NUb0xMVk1SZWdzKGNvbnN0IER3YXJmTExWTVJlZ1BhaXIgKk1hcCwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFSCkgeworICAgIGlmIChpc0VIKSB7CisgICAgICBFSER3YXJmMkxSZWdzID0gTWFwOworICAgICAgRUhEd2FyZjJMUmVnc1NpemUgPSBTaXplOworICAgIH0gZWxzZSB7CisgICAgICBEd2FyZjJMUmVncyA9IE1hcDsKKyAgICAgIER3YXJmMkxSZWdzU2l6ZSA9IFNpemU7CisgICAgfQorICB9CisKKyAgLy8vIG1hcExMVk1SZWdUb1NFSFJlZyAtIFVzZWQgdG8gaW5pdGlhbGl6ZSBMTFZNIHJlZ2lzdGVyIHRvIFNFSCByZWdpc3RlcgorICAvLy8gbnVtYmVyIG1hcHBpbmcuIEJ5IGRlZmF1bHQgdGhlIFNFSCByZWdpc3RlciBudW1iZXIgaXMganVzdCB0aGUgc2FtZQorICAvLy8gYXMgdGhlIExMVk0gcmVnaXN0ZXIgbnVtYmVyLgorICAvLy8gRklYTUU6IFRhYmxlR2VuIHRoZXNlIG51bWJlcnMuIEN1cnJlbnRseSB0aGlzIHJlcXVpcmVzIHRhcmdldCBzcGVjaWZpYworICAvLy8gaW5pdGlhbGl6YXRpb24gY29kZS4KKyAgdm9pZCBtYXBMTFZNUmVnVG9TRUhSZWcodW5zaWduZWQgTExWTVJlZywgaW50IFNFSFJlZykgeworICAgIEwyU0VIUmVnc1tMTFZNUmVnXSA9IFNFSFJlZzsKKyAgfQorCisgIHZvaWQgbWFwTExWTVJlZ1RvQ1ZSZWcodW5zaWduZWQgTExWTVJlZywgaW50IENWUmVnKSB7CisgICAgTDJDVlJlZ3NbTExWTVJlZ10gPSBDVlJlZzsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgcmVnaXN0ZXIgd2hlcmUgdGhlIHJldHVybgorICAvLy8gYWRkcmVzcyBjYW4gYmUgZm91bmQuCisgIHVuc2lnbmVkIGdldFJBUmVnaXN0ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFJBUmVnOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgcmVnaXN0ZXIgd2hpY2ggaXMgdGhlIHByb2dyYW0gY291bnRlci4KKyAgdW5zaWduZWQgZ2V0UHJvZ3JhbUNvdW50ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFBDUmVnOworICB9CisKKyAgY29uc3QgTUNSZWdpc3RlckRlc2MgJm9wZXJhdG9yW10odW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICBhc3NlcnQoUmVnTm8gPCBOdW1SZWdzICYmCisgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIGFjY2VzcyByZWNvcmQgZm9yIGludmFsaWQgcmVnaXN0ZXIgbnVtYmVyISIpOworICAgIHJldHVybiBEZXNjW1JlZ05vXTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUHJvdmlkZSBhIGdldCBtZXRob2QsIGVxdWl2YWxlbnQgdG8gW10sIGJ1dCBtb3JlIHVzZWZ1bCB3aXRoIGEKKyAgLy8vIHBvaW50ZXIgdG8gdGhpcyBvYmplY3QuCisgIGNvbnN0IE1DUmVnaXN0ZXJEZXNjICZnZXQodW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gb3BlcmF0b3JbXShSZWdObyk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlciBvZiBzdWItcmVnaXN0ZXIgIkluZGV4IgorICAvLy8gZm9yIHBoeXNpY2FsIHJlZ2lzdGVyIFJlZ05vLiBSZXR1cm4gemVybyBpZiB0aGUgc3ViLXJlZ2lzdGVyIGRvZXMgbm90CisgIC8vLyBleGlzdC4KKyAgdW5zaWduZWQgZ2V0U3ViUmVnKHVuc2lnbmVkIFJlZywgdW5zaWduZWQgSWR4KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiBhIHN1cGVyLXJlZ2lzdGVyIG9mIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIKKyAgLy8vIFJlZyBzbyBpdHMgc3ViLXJlZ2lzdGVyIG9mIGluZGV4IFN1YklkeCBpcyBSZWcuCisgIHVuc2lnbmVkIGdldE1hdGNoaW5nU3VwZXJSZWcodW5zaWduZWQgUmVnLCB1bnNpZ25lZCBTdWJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNSZWdpc3RlckNsYXNzICpSQykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBGb3IgYSBnaXZlbiByZWdpc3RlciBwYWlyLCByZXR1cm4gdGhlIHN1Yi1yZWdpc3RlciBpbmRleAorICAvLy8gaWYgdGhlIHNlY29uZCByZWdpc3RlciBpcyBhIHN1Yi1yZWdpc3RlciBvZiB0aGUgZmlyc3QuIFJldHVybiB6ZXJvCisgIC8vLyBvdGhlcndpc2UuCisgIHVuc2lnbmVkIGdldFN1YlJlZ0luZGV4KHVuc2lnbmVkIFJlZ05vLCB1bnNpZ25lZCBTdWJSZWdObykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHNpemUgb2YgdGhlIGJpdCByYW5nZSBjb3ZlcmVkIGJ5IGEgc3ViLXJlZ2lzdGVyIGluZGV4LgorICAvLy8gSWYgdGhlIGluZGV4IGlzbid0IGNvbnRpbnVvdXMsIHJldHVybiB0aGUgc3VtIG9mIHRoZSBzaXplcyBvZiBpdHMgcGFydHMuCisgIC8vLyBJZiB0aGUgaW5kZXggaXMgdXNlZCB0byBhY2Nlc3Mgc3VicmVnaXN0ZXJzIG9mIGRpZmZlcmVudCBzaXplcywgcmV0dXJuIC0xLgorICB1bnNpZ25lZCBnZXRTdWJSZWdJZHhTaXplKHVuc2lnbmVkIElkeCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG9mZnNldCBvZiB0aGUgYml0IHJhbmdlIGNvdmVyZWQgYnkgYSBzdWItcmVnaXN0ZXIgaW5kZXguCisgIC8vLyBJZiBhbiBPZmZzZXQgZG9lc24ndCBtYWtlIHNlbnNlICh0aGUgaW5kZXggaXNuJ3QgY29udGludW91cywgb3IgaXMgdXNlZCB0bworICAvLy8gYWNjZXNzIHN1Yi1yZWdpc3RlcnMgYXQgZGlmZmVyZW50IG9mZnNldHMpLCByZXR1cm4gLTEuCisgIHVuc2lnbmVkIGdldFN1YlJlZ0lkeE9mZnNldCh1bnNpZ25lZCBJZHgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBodW1hbi1yZWFkYWJsZSBzeW1ib2xpYyB0YXJnZXQtc3BlY2lmaWMgbmFtZSBmb3IgdGhlCisgIC8vLyBzcGVjaWZpZWQgcGh5c2ljYWwgcmVnaXN0ZXIuCisgIGNvbnN0IGNoYXIgKmdldE5hbWUodW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gUmVnU3RyaW5ncyArIGdldChSZWdObykuTmFtZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIHRoaXMgdGFyZ2V0IGhhcyAodXNlZnVsIGZvcgorICAvLy8gc2l6aW5nIGFycmF5cyBob2xkaW5nIHBlciByZWdpc3RlciBpbmZvcm1hdGlvbikKKyAgdW5zaWduZWQgZ2V0TnVtUmVncygpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtUmVnczsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3ViLXJlZ2lzdGVyIGluZGljZXMKKyAgLy8vIHVuZGVyc3Rvb2QgYnkgdGhlIHRhcmdldC4gSW5kZXggMCBpcyByZXNlcnZlZCBmb3IgdGhlIG5vLW9wIHN1Yi1yZWdpc3RlciwKKyAgLy8vIHdoaWxlIDEgdG8gZ2V0TnVtU3ViUmVnSW5kaWNlcygpIC0gMSByZXByZXNlbnQgcmVhbCBzdWItcmVnaXN0ZXJzLgorICB1bnNpZ25lZCBnZXROdW1TdWJSZWdJbmRpY2VzKCkgY29uc3QgeworICAgIHJldHVybiBOdW1TdWJSZWdJbmRpY2VzOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiAobmF0aXZlKSByZWdpc3RlciB1bml0cyBpbiB0aGUKKyAgLy8vIHRhcmdldC4gUmVnaXN0ZXIgdW5pdHMgYXJlIG51bWJlcmVkIGZyb20gMCB0byBnZXROdW1SZWdVbml0cygpIC0gMS4gVGhleQorICAvLy8gY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggTUNSZWdVbml0SXRlcmF0b3IgZGVmaW5lZCBiZWxvdy4KKyAgdW5zaWduZWQgZ2V0TnVtUmVnVW5pdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIE51bVJlZ1VuaXRzOworICB9CisKKyAgLy8vIFxicmllZiBNYXAgYSB0YXJnZXQgcmVnaXN0ZXIgdG8gYW4gZXF1aXZhbGVudCBkd2FyZiByZWdpc3RlcgorICAvLy8gbnVtYmVyLiAgUmV0dXJucyAtMSBpZiB0aGVyZSBpcyBubyBlcXVpdmFsZW50IHZhbHVlLiAgVGhlIHNlY29uZAorICAvLy8gcGFyYW1ldGVyIGFsbG93cyB0YXJnZXRzIHRvIHVzZSBkaWZmZXJlbnQgbnVtYmVyaW5ncyBmb3IgRUggaW5mbyBhbmQKKyAgLy8vIGRlYnVnZ2luZyBpbmZvLgorICBpbnQgZ2V0RHdhcmZSZWdOdW0odW5zaWduZWQgUmVnTnVtLCBib29sIGlzRUgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgTWFwIGEgZHdhcmYgcmVnaXN0ZXIgYmFjayB0byBhIHRhcmdldCByZWdpc3Rlci4KKyAgaW50IGdldExMVk1SZWdOdW0odW5zaWduZWQgUmVnTnVtLCBib29sIGlzRUgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgTWFwIGEgRFdBUkYgRUggcmVnaXN0ZXIgYmFjayB0byBhIHRhcmdldCByZWdpc3RlciAoc2FtZSBhcworICAvLy8gZ2V0TExWTVJlZ051bShSZWdOdW0sIHRydWUpKSBidXQgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIG1hcHBpbmcsCisgIC8vLyByYXRoZXIgdGhhbiBhc3NlcnRpbmcgdGhhdCB0aGVyZSBtdXN0IGJlIG9uZS4KKyAgaW50IGdldExMVk1SZWdOdW1Gcm9tRUgodW5zaWduZWQgUmVnTnVtKSBjb25zdDsKKworICAvLy8gXGJyaWVmIE1hcCBhIHRhcmdldCBFSCByZWdpc3RlciBudW1iZXIgdG8gYW4gZXF1aXZhbGVudCBEV0FSRiByZWdpc3RlcgorICAvLy8gbnVtYmVyLgorICBpbnQgZ2V0RHdhcmZSZWdOdW1Gcm9tRHdhcmZFSFJlZ051bSh1bnNpZ25lZCBSZWdOdW0pIGNvbnN0OworCisgIC8vLyBcYnJpZWYgTWFwIGEgdGFyZ2V0IHJlZ2lzdGVyIHRvIGFuIGVxdWl2YWxlbnQgU0VIIHJlZ2lzdGVyCisgIC8vLyBudW1iZXIuICBSZXR1cm5zIExMVk0gcmVnaXN0ZXIgbnVtYmVyIGlmIHRoZXJlIGlzIG5vIGVxdWl2YWxlbnQgdmFsdWUuCisgIGludCBnZXRTRUhSZWdOdW0odW5zaWduZWQgUmVnTnVtKSBjb25zdDsKKworICAvLy8gXGJyaWVmIE1hcCBhIHRhcmdldCByZWdpc3RlciB0byBhbiBlcXVpdmFsZW50IENvZGVWaWV3IHJlZ2lzdGVyCisgIC8vLyBudW1iZXIuCisgIGludCBnZXRDb2RlVmlld1JlZ051bSh1bnNpZ25lZCBSZWdOdW0pIGNvbnN0OworCisgIHJlZ2NsYXNzX2l0ZXJhdG9yIHJlZ2NsYXNzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gQ2xhc3NlczsgfQorICByZWdjbGFzc19pdGVyYXRvciByZWdjbGFzc19lbmQoKSBjb25zdCB7IHJldHVybiBDbGFzc2VzK051bUNsYXNzZXM7IH0KKyAgaXRlcmF0b3JfcmFuZ2U8cmVnY2xhc3NfaXRlcmF0b3I+IHJlZ2NsYXNzZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UocmVnY2xhc3NfYmVnaW4oKSwgcmVnY2xhc3NfZW5kKCkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtUmVnQ2xhc3NlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKHVuc2lnbmVkKShyZWdjbGFzc19lbmQoKS1yZWdjbGFzc19iZWdpbigpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgcmVnaXN0ZXIgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnVtZXJhdGlvbgorICAvLy8gdmFsdWUuICBTZWUgY2xhc3MgTUNPcGVyYW5kSW5mby4KKyAgY29uc3QgTUNSZWdpc3RlckNsYXNzJiBnZXRSZWdDbGFzcyh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBnZXROdW1SZWdDbGFzc2VzKCkgJiYgIlJlZ2lzdGVyIENsYXNzIElEIG91dCBvZiByYW5nZSIpOworICAgIHJldHVybiBDbGFzc2VzW2ldOworICB9CisKKyAgY29uc3QgY2hhciAqZ2V0UmVnQ2xhc3NOYW1lKGNvbnN0IE1DUmVnaXN0ZXJDbGFzcyAqQ2xhc3MpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVnQ2xhc3NTdHJpbmdzICsgQ2xhc3MtPk5hbWVJZHg7CisgIH0KKworICAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBlbmNvZGluZyBmb3IgUmVnTm8KKyAgdWludDE2X3QgZ2V0RW5jb2RpbmdWYWx1ZSh1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIGFzc2VydChSZWdObyA8IE51bVJlZ3MgJiYKKyAgICAgICAgICAgIkF0dGVtcHRpbmcgdG8gZ2V0IGVuY29kaW5nIGZvciBpbnZhbGlkIHJlZ2lzdGVyIG51bWJlciEiKTsKKyAgICByZXR1cm4gUmVnRW5jb2RpbmdUYWJsZVtSZWdOb107CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBSZWdCIGlzIGEgc3ViLXJlZ2lzdGVyIG9mIFJlZ0EuCisgIGJvb2wgaXNTdWJSZWdpc3Rlcih1bnNpZ25lZCBSZWdBLCB1bnNpZ25lZCBSZWdCKSBjb25zdCB7CisgICAgcmV0dXJuIGlzU3VwZXJSZWdpc3RlcihSZWdCLCBSZWdBKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIFJlZ0IgaXMgYSBzdXBlci1yZWdpc3RlciBvZiBSZWdBLgorICBib29sIGlzU3VwZXJSZWdpc3Rlcih1bnNpZ25lZCBSZWdBLCB1bnNpZ25lZCBSZWdCKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBSZWdCIGlzIGEgc3ViLXJlZ2lzdGVyIG9mIFJlZ0Egb3IgaWYgUmVnQiA9PSBSZWdBLgorICBib29sIGlzU3ViUmVnaXN0ZXJFcSh1bnNpZ25lZCBSZWdBLCB1bnNpZ25lZCBSZWdCKSBjb25zdCB7CisgICAgcmV0dXJuIGlzU3VwZXJSZWdpc3RlckVxKFJlZ0IsIFJlZ0EpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgUmVnQiBpcyBhIHN1cGVyLXJlZ2lzdGVyIG9mIFJlZ0Egb3IgaWYKKyAgLy8vIFJlZ0IgPT0gUmVnQS4KKyAgYm9vbCBpc1N1cGVyUmVnaXN0ZXJFcSh1bnNpZ25lZCBSZWdBLCB1bnNpZ25lZCBSZWdCKSBjb25zdCB7CisgICAgcmV0dXJuIFJlZ0EgPT0gUmVnQiB8fCBpc1N1cGVyUmVnaXN0ZXIoUmVnQSwgUmVnQik7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBSZWdCIGlzIGEgc3VwZXItcmVnaXN0ZXIgb3Igc3ViLXJlZ2lzdGVyIG9mIFJlZ0EKKyAgLy8vIG9yIGlmIFJlZ0IgPT0gUmVnQS4KKyAgYm9vbCBpc1N1cGVyT3JTdWJSZWdpc3RlckVxKHVuc2lnbmVkIFJlZ0EsIHVuc2lnbmVkIFJlZ0IpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNTdWJSZWdpc3RlckVxKFJlZ0EsIFJlZ0IpIHx8IGlzU3VwZXJSZWdpc3RlcihSZWdBLCBSZWdCKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciBMaXN0IEl0ZXJhdG9ycworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gTUNSZWdpc3RlckluZm8gcHJvdmlkZXMgbGlzdHMgb2Ygc3VwZXItcmVnaXN0ZXJzLCBzdWItcmVnaXN0ZXJzLCBhbmQKKy8vIGFsaWFzaW5nIHJlZ2lzdGVycy4gVXNlIHRoZXNlIGl0ZXJhdG9yIGNsYXNzZXMgdG8gdHJhdmVyc2UgdGhlIGxpc3RzLgorCisvLy8gTUNTdWJSZWdJdGVyYXRvciBlbnVtZXJhdGVzIGFsbCBzdWItcmVnaXN0ZXJzIG9mIFJlZy4KKy8vLyBJZiBJbmNsdWRlU2VsZiBpcyBzZXQsIFJlZyBpdHNlbGYgaXMgaW5jbHVkZWQgaW4gdGhlIGxpc3QuCitjbGFzcyBNQ1N1YlJlZ0l0ZXJhdG9yIDogcHVibGljIE1DUmVnaXN0ZXJJbmZvOjpEaWZmTGlzdEl0ZXJhdG9yIHsKK3B1YmxpYzoKKyAgTUNTdWJSZWdJdGVyYXRvcih1bnNpZ25lZCBSZWcsIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICpNQ1JJLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlU2VsZiA9IGZhbHNlKSB7CisgICAgaW5pdChSZWcsIE1DUkktPkRpZmZMaXN0cyArIE1DUkktPmdldChSZWcpLlN1YlJlZ3MpOworICAgIC8vIEluaXRpYWxseSwgdGhlIGl0ZXJhdG9yIHBvaW50cyB0byBSZWcgaXRzZWxmLgorICAgIGlmICghSW5jbHVkZVNlbGYpCisgICAgICArKyp0aGlzOworICB9Cit9OworCisvLy8gSXRlcmF0b3IgdGhhdCBlbnVtZXJhdGVzIHRoZSBzdWItcmVnaXN0ZXJzIG9mIGEgUmVnIGFuZCB0aGUgYXNzb2NpYXRlZAorLy8vIHN1Yi1yZWdpc3RlciBpbmRpY2VzLgorY2xhc3MgTUNTdWJSZWdJbmRleEl0ZXJhdG9yIHsKKyAgTUNTdWJSZWdJdGVyYXRvciBTUkl0ZXI7CisgIGNvbnN0IHVpbnQxNl90ICpTUkluZGV4OworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3RzIGFuIGl0ZXJhdG9yIHRoYXQgdHJhdmVyc2VzIHN1YnJlZ2lzdGVycyBhbmQgdGhlaXIKKyAgLy8vIGFzc29jaWF0ZWQgc3VicmVnaXN0ZXIgaW5kaWNlcy4KKyAgTUNTdWJSZWdJbmRleEl0ZXJhdG9yKHVuc2lnbmVkIFJlZywgY29uc3QgTUNSZWdpc3RlckluZm8gKk1DUkkpCisgICAgOiBTUkl0ZXIoUmVnLCBNQ1JJKSB7CisgICAgU1JJbmRleCA9IE1DUkktPlN1YlJlZ0luZGljZXMgKyBNQ1JJLT5nZXQoUmVnKS5TdWJSZWdJbmRpY2VzOworICB9CisKKyAgLy8vIFJldHVybnMgY3VycmVudCBzdWItcmVnaXN0ZXIuCisgIHVuc2lnbmVkIGdldFN1YlJlZygpIGNvbnN0IHsKKyAgICByZXR1cm4gKlNSSXRlcjsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHN1Yi1yZWdpc3RlciBpbmRleCBvZiB0aGUgY3VycmVudCBzdWItcmVnaXN0ZXIuCisgIHVuc2lnbmVkIGdldFN1YlJlZ0luZGV4KCkgY29uc3QgeworICAgIHJldHVybiAqU1JJbmRleDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpdGVyYXRvciBpcyBub3QgeWV0IGF0IHRoZSBlbmQuCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIFNSSXRlci5pc1ZhbGlkKCk7IH0KKworICAvLy8gTW92ZXMgdG8gdGhlIG5leHQgcG9zaXRpb24uCisgIHZvaWQgb3BlcmF0b3IrKygpIHsKKyAgICArK1NSSXRlcjsKKyAgICArK1NSSW5kZXg7CisgIH0KK307CisKKy8vLyBNQ1N1cGVyUmVnSXRlcmF0b3IgZW51bWVyYXRlcyBhbGwgc3VwZXItcmVnaXN0ZXJzIG9mIFJlZy4KKy8vLyBJZiBJbmNsdWRlU2VsZiBpcyBzZXQsIFJlZyBpdHNlbGYgaXMgaW5jbHVkZWQgaW4gdGhlIGxpc3QuCitjbGFzcyBNQ1N1cGVyUmVnSXRlcmF0b3IgOiBwdWJsaWMgTUNSZWdpc3RlckluZm86OkRpZmZMaXN0SXRlcmF0b3IgeworcHVibGljOgorICBNQ1N1cGVyUmVnSXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgTUNTdXBlclJlZ0l0ZXJhdG9yKHVuc2lnbmVkIFJlZywgY29uc3QgTUNSZWdpc3RlckluZm8gKk1DUkksCisgICAgICAgICAgICAgICAgICAgICBib29sIEluY2x1ZGVTZWxmID0gZmFsc2UpIHsKKyAgICBpbml0KFJlZywgTUNSSS0+RGlmZkxpc3RzICsgTUNSSS0+Z2V0KFJlZykuU3VwZXJSZWdzKTsKKyAgICAvLyBJbml0aWFsbHksIHRoZSBpdGVyYXRvciBwb2ludHMgdG8gUmVnIGl0c2VsZi4KKyAgICBpZiAoIUluY2x1ZGVTZWxmKQorICAgICAgKysqdGhpczsKKyAgfQorfTsKKworLy8gRGVmaW5pdGlvbiBmb3IgaXNTdXBlclJlZ2lzdGVyLiBQdXQgaXQgZG93biBoZXJlIHNpbmNlIGl0IG5lZWRzIHRoZQorLy8gaXRlcmF0b3IgZGVmaW5lZCBhYm92ZSBpbiBhZGRpdGlvbiB0byB0aGUgTUNSZWdpc3RlckluZm8gY2xhc3MgaXRzZWxmLgoraW5saW5lIGJvb2wgTUNSZWdpc3RlckluZm86OmlzU3VwZXJSZWdpc3Rlcih1bnNpZ25lZCBSZWdBLCB1bnNpZ25lZCBSZWdCKSBjb25zdHsKKyAgZm9yIChNQ1N1cGVyUmVnSXRlcmF0b3IgSShSZWdBLCB0aGlzKTsgSS5pc1ZhbGlkKCk7ICsrSSkKKyAgICBpZiAoKkkgPT0gUmVnQikKKyAgICAgIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciBVbml0cworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gUmVnaXN0ZXIgdW5pdHMgYXJlIHVzZWQgdG8gY29tcHV0ZSByZWdpc3RlciBhbGlhc2luZy4gRXZlcnkgcmVnaXN0ZXIgaGFzIGF0CisvLyBsZWFzdCBvbmUgcmVnaXN0ZXIgdW5pdCwgYnV0IGl0IGNhbiBoYXZlIG1vcmUuIFR3byByZWdpc3RlcnMgb3ZlcmxhcCBpZiBhbmQKKy8vIG9ubHkgaWYgdGhleSBoYXZlIGEgY29tbW9uIHJlZ2lzdGVyIHVuaXQuCisvLworLy8gQSB0YXJnZXQgd2l0aCBhIGNvbXBsaWNhdGVkIHN1Yi1yZWdpc3RlciBzdHJ1Y3R1cmUgd2lsbCB0eXBpY2FsbHkgaGF2ZSBtYW55CisvLyBmZXdlciByZWdpc3RlciB1bml0cyB0aGFuIGFjdHVhbCByZWdpc3RlcnMuIE1DUkk6OmdldE51bVJlZ1VuaXRzKCkgcmV0dXJucworLy8gdGhlIG51bWJlciBvZiByZWdpc3RlciB1bml0cyBpbiB0aGUgdGFyZ2V0LgorCisvLyBNQ1JlZ1VuaXRJdGVyYXRvciBlbnVtZXJhdGVzIGEgbGlzdCBvZiByZWdpc3RlciB1bml0cyBmb3IgUmVnLiBUaGUgbGlzdCBpcworLy8gaW4gYXNjZW5kaW5nIG51bWVyaWNhbCBvcmRlci4KK2NsYXNzIE1DUmVnVW5pdEl0ZXJhdG9yIDogcHVibGljIE1DUmVnaXN0ZXJJbmZvOjpEaWZmTGlzdEl0ZXJhdG9yIHsKK3B1YmxpYzoKKyAgLy8vIE1DUmVnVW5pdEl0ZXJhdG9yIC0gQ3JlYXRlIGFuIGl0ZXJhdG9yIHRoYXQgdHJhdmVyc2VzIHRoZSByZWdpc3RlciB1bml0cworICAvLy8gaW4gUmVnLgorICBNQ1JlZ1VuaXRJdGVyYXRvcigpID0gZGVmYXVsdDsKKworICBNQ1JlZ1VuaXRJdGVyYXRvcih1bnNpZ25lZCBSZWcsIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICpNQ1JJKSB7CisgICAgYXNzZXJ0KFJlZyAmJiAiTnVsbCByZWdpc3RlciBoYXMgbm8gcmVndW5pdHMiKTsKKyAgICAvLyBEZWNvZGUgdGhlIFJlZ1VuaXRzIE1DUmVnaXN0ZXJEZXNjIGZpZWxkLgorICAgIHVuc2lnbmVkIFJVID0gTUNSSS0+Z2V0KFJlZykuUmVnVW5pdHM7CisgICAgdW5zaWduZWQgU2NhbGUgPSBSVSAmIDE1OworICAgIHVuc2lnbmVkIE9mZnNldCA9IFJVID4+IDQ7CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBpdGVyYXRvciB0byBSZWcgKiBTY2FsZSwgYW5kIHRoZSBMaXN0IHBvaW50ZXIgdG8KKyAgICAvLyBEaWZmTGlzdHMgKyBPZmZzZXQuCisgICAgaW5pdChSZWcgKiBTY2FsZSwgTUNSSS0+RGlmZkxpc3RzICsgT2Zmc2V0KTsKKworICAgIC8vIFRoYXQgbWF5IG5vdCBiZSBhIHZhbGlkIHVuaXQsIHdlIG5lZWQgdG8gYWR2YW5jZSBieSBvbmUgdG8gZ2V0IHRoZSByZWFsCisgICAgLy8gdW5pdCBudW1iZXIuIFRoZSBmaXJzdCBkaWZmZXJlbnRpYWwgY2FuIGJlIDAgd2hpY2ggd291bGQgbm9ybWFsbHkKKyAgICAvLyB0ZXJtaW5hdGUgdGhlIGxpc3QsIGJ1dCBzaW5jZSB3ZSBrbm93IGV2ZXJ5IHJlZ2lzdGVyIGhhcyBhdCBsZWFzdCBvbmUKKyAgICAvLyB1bml0LCB3ZSBjYW4gYWxsb3cgYSAwIGRpZmZlcmVudGlhbCBoZXJlLgorICAgIGFkdmFuY2UoKTsKKyAgfQorfTsKKworLy8vIE1DUmVnVW5pdE1hc2tJdGVyYXRvciBlbnVtZXJhdGVzIGEgbGlzdCBvZiByZWdpc3RlciB1bml0cyBhbmQgdGhlaXIKKy8vLyBhc3NvY2lhdGVkIGxhbmUgbWFza3MgZm9yIFJlZy4gVGhlIHJlZ2lzdGVyIHVuaXRzIGFyZSBpbiBhc2NlbmRpbmcKKy8vLyBudW1lcmljYWwgb3JkZXIuCitjbGFzcyBNQ1JlZ1VuaXRNYXNrSXRlcmF0b3IgeworICBNQ1JlZ1VuaXRJdGVyYXRvciBSVUl0ZXI7CisgIGNvbnN0IExhbmVCaXRtYXNrICpNYXNrTGlzdEl0ZXI7CisKK3B1YmxpYzoKKyAgTUNSZWdVbml0TWFza0l0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgIC8vLyBDb25zdHJ1Y3RzIGFuIGl0ZXJhdG9yIHRoYXQgdHJhdmVyc2VzIHRoZSByZWdpc3RlciB1bml0cyBhbmQgdGhlaXIKKyAgLy8vIGFzc29jaWF0ZWQgTGFuZU1hc2tzIGluIFJlZy4KKyAgTUNSZWdVbml0TWFza0l0ZXJhdG9yKHVuc2lnbmVkIFJlZywgY29uc3QgTUNSZWdpc3RlckluZm8gKk1DUkkpCisgICAgOiBSVUl0ZXIoUmVnLCBNQ1JJKSB7CisgICAgICB1aW50MTZfdCBJZHggPSBNQ1JJLT5nZXQoUmVnKS5SZWdVbml0TGFuZU1hc2tzOworICAgICAgTWFza0xpc3RJdGVyID0gJk1DUkktPlJlZ1VuaXRNYXNrU2VxdWVuY2VzW0lkeF07CisgIH0KKworICAvLy8gUmV0dXJucyBhIChSZWdVbml0LCBMYW5lTWFzaykgcGFpci4KKyAgc3RkOjpwYWlyPHVuc2lnbmVkLExhbmVCaXRtYXNrPiBvcGVyYXRvciooKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKCpSVUl0ZXIsICpNYXNrTGlzdEl0ZXIpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGl0ZXJhdG9yIGlzIG5vdCB5ZXQgYXQgdGhlIGVuZC4KKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gUlVJdGVyLmlzVmFsaWQoKTsgfQorCisgIC8vLyBNb3ZlcyB0byB0aGUgbmV4dCBwb3NpdGlvbi4KKyAgdm9pZCBvcGVyYXRvcisrKCkgeworICAgICsrTWFza0xpc3RJdGVyOworICAgICsrUlVJdGVyOworICB9Cit9OworCisvLyBFYWNoIHJlZ2lzdGVyIHVuaXQgaGFzIG9uZSBvciB0d28gcm9vdCByZWdpc3RlcnMuIFRoZSBjb21wbGV0ZSBzZXQgb2YKKy8vIHJlZ2lzdGVycyBjb250YWluaW5nIGEgcmVnaXN0ZXIgdW5pdCBpcyB0aGUgdW5pb24gb2YgdGhlIHJvb3RzIGFuZCB0aGVpcgorLy8gc3VwZXItcmVnaXN0ZXJzLiBBbGwgcmVnaXN0ZXJzIGFsaWFzaW5nIFVuaXQgY2FuIGJlIHZpc2l0ZWQgbGlrZSB0aGlzOgorLy8KKy8vICAgZm9yIChNQ1JlZ1VuaXRSb290SXRlcmF0b3IgUkkoVW5pdCwgTUNSSSk7IFJJLmlzVmFsaWQoKTsgKytSSSkgeworLy8gICAgIGZvciAoTUNTdXBlclJlZ0l0ZXJhdG9yIFNJKCpSSSwgTUNSSSwgdHJ1ZSk7IFNJLmlzVmFsaWQoKTsgKytTSSkKKy8vICAgICAgIHZpc2l0KCpTSSk7CisvLyAgICB9CisKKy8vLyBNQ1JlZ1VuaXRSb290SXRlcmF0b3IgZW51bWVyYXRlcyB0aGUgcm9vdCByZWdpc3RlcnMgb2YgYSByZWdpc3RlciB1bml0LgorY2xhc3MgTUNSZWdVbml0Um9vdEl0ZXJhdG9yIHsKKyAgdWludDE2X3QgUmVnMCA9IDA7CisgIHVpbnQxNl90IFJlZzEgPSAwOworCitwdWJsaWM6CisgIE1DUmVnVW5pdFJvb3RJdGVyYXRvcigpID0gZGVmYXVsdDsKKworICBNQ1JlZ1VuaXRSb290SXRlcmF0b3IodW5zaWduZWQgUmVnVW5pdCwgY29uc3QgTUNSZWdpc3RlckluZm8gKk1DUkkpIHsKKyAgICBhc3NlcnQoUmVnVW5pdCA8IE1DUkktPmdldE51bVJlZ1VuaXRzKCkgJiYgIkludmFsaWQgcmVnaXN0ZXIgdW5pdCIpOworICAgIFJlZzAgPSBNQ1JJLT5SZWdVbml0Um9vdHNbUmVnVW5pdF1bMF07CisgICAgUmVnMSA9IE1DUkktPlJlZ1VuaXRSb290c1tSZWdVbml0XVsxXTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGVyZWZlcmVuY2UgdG8gZ2V0IHRoZSBjdXJyZW50IHJvb3QgcmVnaXN0ZXIuCisgIHVuc2lnbmVkIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVnMDsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2hlY2sgaWYgdGhlIGl0ZXJhdG9yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVnMDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUHJlaW5jcmVtZW50IHRvIG1vdmUgdG8gdGhlIG5leHQgcm9vdCByZWdpc3Rlci4KKyAgdm9pZCBvcGVyYXRvcisrKCkgeworICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIkNhbm5vdCBtb3ZlIG9mZiB0aGUgZW5kIG9mIHRoZSBsaXN0LiIpOworICAgIFJlZzAgPSBSZWcxOworICAgIFJlZzEgPSAwOworICB9Cit9OworCisvLy8gTUNSZWdBbGlhc0l0ZXJhdG9yIGVudW1lcmF0ZXMgYWxsIHJlZ2lzdGVycyBhbGlhc2luZyBSZWcuICBJZiBJbmNsdWRlU2VsZiBpcworLy8vIHNldCwgUmVnIGl0c2VsZiBpcyBpbmNsdWRlZCBpbiB0aGUgbGlzdC4gIFRoaXMgaXRlcmF0b3IgZG9lcyBub3QgZ3VhcmFudGVlCisvLy8gYW55IG9yZGVyaW5nIG9yIHRoYXQgZW50cmllcyBhcmUgdW5pcXVlLgorY2xhc3MgTUNSZWdBbGlhc0l0ZXJhdG9yIHsKK3ByaXZhdGU6CisgIHVuc2lnbmVkIFJlZzsKKyAgY29uc3QgTUNSZWdpc3RlckluZm8gKk1DUkk7CisgIGJvb2wgSW5jbHVkZVNlbGY7CisKKyAgTUNSZWdVbml0SXRlcmF0b3IgUkk7CisgIE1DUmVnVW5pdFJvb3RJdGVyYXRvciBSUkk7CisgIE1DU3VwZXJSZWdJdGVyYXRvciBTSTsKKworcHVibGljOgorICBNQ1JlZ0FsaWFzSXRlcmF0b3IodW5zaWduZWQgUmVnLCBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqTUNSSSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5jbHVkZVNlbGYpCisgICAgOiBSZWcoUmVnKSwgTUNSSShNQ1JJKSwgSW5jbHVkZVNlbGYoSW5jbHVkZVNlbGYpIHsKKyAgICAvLyBJbml0aWFsaXplIHRoZSBpdGVyYXRvcnMuCisgICAgZm9yIChSSSA9IE1DUmVnVW5pdEl0ZXJhdG9yKFJlZywgTUNSSSk7IFJJLmlzVmFsaWQoKTsgKytSSSkgeworICAgICAgZm9yIChSUkkgPSBNQ1JlZ1VuaXRSb290SXRlcmF0b3IoKlJJLCBNQ1JJKTsgUlJJLmlzVmFsaWQoKTsgKytSUkkpIHsKKyAgICAgICAgZm9yIChTSSA9IE1DU3VwZXJSZWdJdGVyYXRvcigqUlJJLCBNQ1JJLCB0cnVlKTsgU0kuaXNWYWxpZCgpOyArK1NJKSB7CisgICAgICAgICAgaWYgKCEoIUluY2x1ZGVTZWxmICYmIFJlZyA9PSAqU0kpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gUkkuaXNWYWxpZCgpOyB9CisKKyAgdW5zaWduZWQgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGFzc2VydChTSS5pc1ZhbGlkKCkgJiYgIkNhbm5vdCBkZXJlZmVyZW5jZSBhbiBpbnZhbGlkIGl0ZXJhdG9yLiIpOworICAgIHJldHVybiAqU0k7CisgIH0KKworICB2b2lkIGFkdmFuY2UoKSB7CisgICAgLy8gQXNzdW1pbmcgU0kgaXMgdmFsaWQuCisgICAgKytTSTsKKyAgICBpZiAoU0kuaXNWYWxpZCgpKSByZXR1cm47CisKKyAgICArK1JSSTsKKyAgICBpZiAoUlJJLmlzVmFsaWQoKSkgeworICAgICAgU0kgPSBNQ1N1cGVyUmVnSXRlcmF0b3IoKlJSSSwgTUNSSSwgdHJ1ZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgKytSSTsKKyAgICBpZiAoUkkuaXNWYWxpZCgpKSB7CisgICAgICBSUkkgPSBNQ1JlZ1VuaXRSb290SXRlcmF0b3IoKlJJLCBNQ1JJKTsKKyAgICAgIFNJID0gTUNTdXBlclJlZ0l0ZXJhdG9yKCpSUkksIE1DUkksIHRydWUpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlcmF0b3IrKygpIHsKKyAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJDYW5ub3QgbW92ZSBvZmYgdGhlIGVuZCBvZiB0aGUgbGlzdC4iKTsKKyAgICBkbyBhZHZhbmNlKCk7CisgICAgd2hpbGUgKCFJbmNsdWRlU2VsZiAmJiBpc1ZhbGlkKCkgJiYgKlNJID09IFJlZyk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DUkVHSVNURVJJTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTY2hlZHVsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1NjaGVkdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJmOGVmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTY2hlZHVsZS5oCkBAIC0wLDAgKzEsMjQ3IEBACisvLz09PS0tIGxsdm0vTUMvTUNTY2hlZHVsZS5oIC0gU2NoZWR1bGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBjbGFzc2VzIHVzZWQgdG8gZGVzY3JpYmUgYSBzdWJ0YXJnZXQncyBtYWNoaW5lIG1vZGVsCisvLyBmb3Igc2NoZWR1bGluZyBhbmQgb3RoZXIgaW5zdHJ1Y3Rpb24gY29zdCBoZXVyaXN0aWNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1NDSEVEVUxFX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1NDSEVEVUxFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworc3RydWN0IEluc3RySXRpbmVyYXJ5OworY2xhc3MgTUNTdWJ0YXJnZXRJbmZvOworCisvLy8gRGVmaW5lIGEga2luZCBvZiBwcm9jZXNzb3IgcmVzb3VyY2UgdGhhdCB3aWxsIGJlIG1vZGVsZWQgYnkgdGhlIHNjaGVkdWxlci4KK3N0cnVjdCBNQ1Byb2NSZXNvdXJjZURlc2MgeworICBjb25zdCBjaGFyICpOYW1lOworICB1bnNpZ25lZCBOdW1Vbml0czsgLy8gTnVtYmVyIG9mIHJlc291cmNlIG9mIHRoaXMga2luZAorICB1bnNpZ25lZCBTdXBlcklkeDsgLy8gSW5kZXggb2YgdGhlIHJlc291cmNlcyBraW5kIHRoYXQgY29udGFpbnMgdGhpcyBraW5kLgorCisgIC8vIE51bWJlciBvZiByZXNvdXJjZXMgdGhhdCBtYXkgYmUgYnVmZmVyZWQuCisgIC8vCisgIC8vIEJ1ZmZlcmVkIHJlc291cmNlcyAoQnVmZmVyU2l6ZSAhPSAwKSBtYXkgYmUgY29uc3VtZWQgYXQgc29tZSBpbmRldGVybWluYXRlCisgIC8vIGN5Y2xlIGFmdGVyIGRpc3BhdGNoLiBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciBvdXQtb2Ytb3JkZXIgY3B1cyB3aGVuCisgIC8vIGluc3RydWN0aW9ucyB0aGF0IHVzZSB0aGlzIHJlc291cmNlIGNhbiBiZSBidWZmZXJlZCBpbiBhIHJlc2VydmF0b24KKyAgLy8gc3RhdGlvbi4KKyAgLy8KKyAgLy8gVW5idWZmZXJlZCByZXNvdXJjZXMgKEJ1ZmZlclNpemUgPT0gMCkgYWx3YXlzIGNvbnN1bWUgdGhlaXIgcmVzb3VyY2Ugc29tZQorICAvLyBmaXhlZCBudW1iZXIgb2YgY3ljbGVzIGFmdGVyIGRpc3BhdGNoLiBJZiBhIHJlc291cmNlIGlzIHVuYnVmZmVyZWQsIHRoZW4KKyAgLy8gdGhlIHNjaGVkdWxlciB3aWxsIGF2b2lkIHNjaGVkdWxpbmcgaW5zdHJ1Y3Rpb25zIHdpdGggY29uZmxpY3RpbmcgcmVzb3VyY2VzCisgIC8vIGluIHRoZSBzYW1lIGN5Y2xlLiBUaGlzIGlzIGZvciBpbi1vcmRlciBjcHVzLCBvciB0aGUgaW4tb3JkZXIgcG9ydGlvbiBvZgorICAvLyBhbiBvdXQtb2Ytb3JkZXIgY3B1cy4KKyAgaW50IEJ1ZmZlclNpemU7CisKKyAgLy8gSWYgdGhlIHJlc291cmNlIGhhcyBzdWItdW5pdHMsIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiBhbiBhcnJheQorICAvLyBvZiBgTnVtVW5pdHNgIGVsZW1lbnRzIGNvbnRhaW5pbmcgdGhlIFByb2NSZXNvdXJjZUlkeCBvZiB0aGUgc3ViIHVuaXRzLgorICAvLyBudWxscHRyIGlmIHRoZSByZXNvdXJjZSBkb2VzIG5vdCBoYXZlIHN1Yi11bml0cy4KKyAgY29uc3QgdW5zaWduZWQgKlN1YlVuaXRzSWR4QmVnaW47CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1DUHJvY1Jlc291cmNlRGVzYyAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtVW5pdHMgPT0gT3RoZXIuTnVtVW5pdHMgJiYgU3VwZXJJZHggPT0gT3RoZXIuU3VwZXJJZHgKKyAgICAgICYmIEJ1ZmZlclNpemUgPT0gT3RoZXIuQnVmZmVyU2l6ZTsKKyAgfQorfTsKKworLy8vIElkZW50aWZ5IG9uZSBvZiB0aGUgcHJvY2Vzc29yIHJlc291cmNlIGtpbmRzIGNvbnN1bWVkIGJ5IGEgcGFydGljdWxhcgorLy8vIHNjaGVkdWxpbmcgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGN5Y2xlcy4KK3N0cnVjdCBNQ1dyaXRlUHJvY1Jlc0VudHJ5IHsKKyAgdWludDE2X3QgUHJvY1Jlc291cmNlSWR4OworICB1aW50MTZfdCBDeWNsZXM7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1DV3JpdGVQcm9jUmVzRW50cnkgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIFByb2NSZXNvdXJjZUlkeCA9PSBPdGhlci5Qcm9jUmVzb3VyY2VJZHggJiYgQ3ljbGVzID09IE90aGVyLkN5Y2xlczsKKyAgfQorfTsKKworLy8vIFNwZWNpZnkgdGhlIGxhdGVuY3kgaW4gY3B1IGN5Y2xlcyBmb3IgYSBwYXJ0aWN1bGFyIHNjaGVkdWxpbmcgY2xhc3MgYW5kIGRlZgorLy8vIGluZGV4LiAtMSBpbmRpY2F0ZXMgYW4gaW52YWxpZCBsYXRlbmN5LiBIZXVyaXN0aWNzIHdvdWxkIHR5cGljYWxseSBjb25zaWRlcgorLy8vIGFuIGluc3RydWN0aW9uIHdpdGggaW52YWxpZCBsYXRlbmN5IHRvIGhhdmUgaW5maW5pdGUgbGF0ZW5jeS4gIEFsc28gaWRlbnRpZnkKKy8vLyB0aGUgV3JpdGVSZXNvdXJjZXMgb2YgdGhpcyBkZWYuIFdoZW4gdGhlIG9wZXJhbmQgZXhwYW5kcyB0byBhIHNlcXVlbmNlIG9mCisvLy8gd3JpdGVzLCB0aGlzIElEIGlzIHRoZSBsYXN0IHdyaXRlIGluIHRoZSBzZXF1ZW5jZS4KK3N0cnVjdCBNQ1dyaXRlTGF0ZW5jeUVudHJ5IHsKKyAgaW50MTZfdCBDeWNsZXM7CisgIHVpbnQxNl90IFdyaXRlUmVzb3VyY2VJRDsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTUNXcml0ZUxhdGVuY3lFbnRyeSAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3ljbGVzID09IE90aGVyLkN5Y2xlcyAmJiBXcml0ZVJlc291cmNlSUQgPT0gT3RoZXIuV3JpdGVSZXNvdXJjZUlEOworICB9Cit9OworCisvLy8gU3BlY2lmeSB0aGUgbnVtYmVyIG9mIGN5Y2xlcyBhbGxvd2VkIGFmdGVyIGluc3RydWN0aW9uIGlzc3VlIGJlZm9yZSBhCisvLy8gcGFydGljdWxhciB1c2Ugb3BlcmFuZCByZWFkcyBpdHMgcmVnaXN0ZXJzLiBUaGlzIGVmZmVjdGl2ZWx5IHJlZHVjZXMgdGhlCisvLy8gd3JpdGUncyBsYXRlbmN5LiBIZXJlIHdlIGFsbG93IG5lZ2F0aXZlIGN5Y2xlcyBmb3IgY29ybmVyIGNhc2VzIHdoZXJlCisvLy8gbGF0ZW5jeSBpbmNyZWFzZXMuIFRoaXMgcnVsZSBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgZW50cnkncyBXcml0ZVJlc291cmNlCisvLy8gbWF0Y2hlcyB0aGUgd3JpdGUncyBXcml0ZVJlc291cmNlLgorLy8vCisvLy8gTUNSZWFkQWR2YW5jZUVudHJpZXMgYXJlIHNvcnRlZCBmaXJzdCBieSBvcGVyYW5kIGluZGV4IChVc2VJZHgpLCB0aGVuIGJ5CisvLy8gV3JpdGVSZXNvdXJjZUlkeC4KK3N0cnVjdCBNQ1JlYWRBZHZhbmNlRW50cnkgeworICB1bnNpZ25lZCBVc2VJZHg7CisgIHVuc2lnbmVkIFdyaXRlUmVzb3VyY2VJRDsKKyAgaW50IEN5Y2xlczsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTUNSZWFkQWR2YW5jZUVudHJ5ICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBVc2VJZHggPT0gT3RoZXIuVXNlSWR4ICYmIFdyaXRlUmVzb3VyY2VJRCA9PSBPdGhlci5Xcml0ZVJlc291cmNlSUQKKyAgICAgICYmIEN5Y2xlcyA9PSBPdGhlci5DeWNsZXM7CisgIH0KK307CisKKy8vLyBTdW1tYXJpemUgdGhlIHNjaGVkdWxpbmcgcmVzb3VyY2VzIHJlcXVpcmVkIGZvciBhbiBpbnN0cnVjdGlvbiBvZiBhCisvLy8gcGFydGljdWxhciBzY2hlZHVsaW5nIGNsYXNzLgorLy8vCisvLy8gRGVmaW5lZCBhcyBhbiBhZ2dyZWdhdGUgc3RydWN0IGZvciBjcmVhdGluZyB0YWJsZXMgd2l0aCBpbml0aWFsaXplciBsaXN0cy4KK3N0cnVjdCBNQ1NjaGVkQ2xhc3NEZXNjIHsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IEludmFsaWROdW1NaWNyb09wcyA9ICgxVSA8PCAxNCkgLSAxOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgVmFyaWFudE51bU1pY3JvT3BzID0gSW52YWxpZE51bU1pY3JvT3BzIC0gMTsKKworI2lmICFkZWZpbmVkKE5ERUJVRykgfHwgZGVmaW5lZChMTFZNX0VOQUJMRV9EVU1QKQorICBjb25zdCBjaGFyKiBOYW1lOworI2VuZGlmCisgIHVpbnQxNl90IE51bU1pY3JvT3BzIDogMTQ7CisgIGJvb2wgICAgIEJlZ2luR3JvdXAgOiAxOworICBib29sICAgICBFbmRHcm91cCA6IDE7CisgIHVpbnQxNl90IFdyaXRlUHJvY1Jlc0lkeDsgLy8gRmlyc3QgaW5kZXggaW50byBXcml0ZVByb2NSZXNUYWJsZS4KKyAgdWludDE2X3QgTnVtV3JpdGVQcm9jUmVzRW50cmllczsKKyAgdWludDE2X3QgV3JpdGVMYXRlbmN5SWR4OyAvLyBGaXJzdCBpbmRleCBpbnRvIFdyaXRlTGF0ZW5jeVRhYmxlLgorICB1aW50MTZfdCBOdW1Xcml0ZUxhdGVuY3lFbnRyaWVzOworICB1aW50MTZfdCBSZWFkQWR2YW5jZUlkeDsgLy8gRmlyc3QgaW5kZXggaW50byBSZWFkQWR2YW5jZVRhYmxlLgorICB1aW50MTZfdCBOdW1SZWFkQWR2YW5jZUVudHJpZXM7CisKKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgIHJldHVybiBOdW1NaWNyb09wcyAhPSBJbnZhbGlkTnVtTWljcm9PcHM7CisgIH0KKyAgYm9vbCBpc1ZhcmlhbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIE51bU1pY3JvT3BzID09IFZhcmlhbnROdW1NaWNyb09wczsKKyAgfQorfTsKKworLy8vIE1hY2hpbmUgbW9kZWwgZm9yIHNjaGVkdWxpbmcsIGJ1bmRsaW5nLCBhbmQgaGV1cmlzdGljcy4KKy8vLworLy8vIFRoZSBtYWNoaW5lIG1vZGVsIGRpcmVjdGx5IHByb3ZpZGVzIGJhc2ljIGluZm9ybWF0aW9uIGFib3V0IHRoZQorLy8vIG1pY3JvYXJjaGl0ZWN0dXJlIHRvIHRoZSBzY2hlZHVsZXIgaW4gdGhlIGZvcm0gb2YgcHJvcGVydGllcy4gSXQgYWxzbworLy8vIG9wdGlvbmFsbHkgcmVmZXJzIHRvIHNjaGVkdWxlciByZXNvdXJjZSB0YWJsZXMgYW5kIGl0aW5lcmFyeQorLy8vIHRhYmxlcy4gU2NoZWR1bGVyIHJlc291cmNlIHRhYmxlcyBtb2RlbCB0aGUgbGF0ZW5jeSBhbmQgY29zdCBmb3IgZWFjaAorLy8vIGluc3RydWN0aW9uIHR5cGUuIEl0aW5lcmFyeSB0YWJsZXMgYXJlIGFuIGluZGVwZW5kZW50IG1lY2hhbmlzbSB0aGF0CisvLy8gcHJvdmlkZXMgYSBkZXRhaWxlZCByZXNlcnZhdGlvbiB0YWJsZSBkZXNjcmliaW5nIGVhY2ggY3ljbGUgb2YgaW5zdHJ1Y3Rpb24KKy8vLyBleGVjdXRpb24uIFN1YnRhcmdldHMgbWF5IGRlZmluZSBhbnkgb3IgYWxsIG9mIHRoZSBhYm92ZSBjYXRlZ29yaWVzIG9mIGRhdGEKKy8vLyBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgQ1BVIGFuZCBzZWxlY3RlZCBzY2hlZHVsZXIuCitzdHJ1Y3QgTUNTY2hlZE1vZGVsIHsKKyAgLy8gSXNzdWVXaWR0aCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgbWF5IGJlIHNjaGVkdWxlZCBpbgorICAvLyB0aGUgc2FtZSBwZXItY3ljbGUgZ3JvdXAuCisgIHVuc2lnbmVkIElzc3VlV2lkdGg7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBEZWZhdWx0SXNzdWVXaWR0aCA9IDE7CisKKyAgLy8gTWljcm9PcEJ1ZmZlclNpemUgaXMgdGhlIG51bWJlciBvZiBtaWNyby1vcHMgdGhhdCB0aGUgcHJvY2Vzc29yIG1heSBidWZmZXIKKyAgLy8gZm9yIG91dC1vZi1vcmRlciBleGVjdXRpb24uCisgIC8vCisgIC8vICIwIiBtZWFucyBvcGVyYXRpb25zIHRoYXQgYXJlIG5vdCByZWFkeSBpbiB0aGlzIGN5Y2xlIGFyZSBub3QgY29uc2lkZXJlZAorICAvLyBmb3Igc2NoZWR1bGluZyAodGhleSBnbyBpbiB0aGUgcGVuZGluZyBxdWV1ZSkuIExhdGVuY3kgaXMgcGFyYW1vdW50LiBUaGlzCisgIC8vIG1heSBiZSBtb3JlIGVmZmljaWVudCBpZiBtYW55IGluc3RydWN0aW9ucyBhcmUgcGVuZGluZyBpbiBhIHNjaGVkdWxlLgorICAvLworICAvLyAiMSIgbWVhbnMgYWxsIGluc3RydWN0aW9ucyBhcmUgY29uc2lkZXJlZCBmb3Igc2NoZWR1bGluZyByZWdhcmRsZXNzIG9mCisgIC8vIHdoZXRoZXIgdGhleSBhcmUgcmVhZHkgaW4gdGhpcyBjeWNsZS4gTGF0ZW5jeSBzdGlsbCBjYXVzZXMgaXNzdWUgc3RhbGxzLAorICAvLyBidXQgd2UgYmFsYW5jZSB0aG9zZSBzdGFsbHMgYWdhaW5zdCBvdGhlciBoZXVyaXN0aWNzLgorICAvLworICAvLyAiPiAxIiBtZWFucyB0aGUgcHJvY2Vzc29yIGlzIG91dC1vZi1vcmRlci4gVGhpcyBpcyBhIG1hY2hpbmUgaW5kZXBlbmRlbnQKKyAgLy8gZXN0aW1hdGUgb2YgaGlnaGx5IG1hY2hpbmUgc3BlY2lmaWMgY2hhcmFjdGVyaXN0aWNzIHN1Y2ggYXMgdGhlIHJlZ2lzdGVyCisgIC8vIHJlbmFtaW5nIHBvb2wgYW5kIHJlb3JkZXIgYnVmZmVyLgorICB1bnNpZ25lZCBNaWNyb09wQnVmZmVyU2l6ZTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIERlZmF1bHRNaWNyb09wQnVmZmVyU2l6ZSA9IDA7CisKKyAgLy8gTG9vcE1pY3JvT3BCdWZmZXJTaXplIGlzIHRoZSBudW1iZXIgb2YgbWljcm8tb3BzIHRoYXQgdGhlIHByb2Nlc3NvciBtYXkKKyAgLy8gYnVmZmVyIGZvciBvcHRpbWl6ZWQgbG9vcCBleGVjdXRpb24uIE1vcmUgZ2VuZXJhbGx5LCB0aGlzIHJlcHJlc2VudHMgdGhlCisgIC8vIG9wdGltYWwgbnVtYmVyIG9mIG1pY3JvLW9wcyBpbiBhIGxvb3AgYm9keS4gQSBsb29wIG1heSBiZSBwYXJ0aWFsbHkKKyAgLy8gdW5yb2xsZWQgdG8gYnJpbmcgdGhlIGNvdW50IG9mIG1pY3JvLW9wcyBpbiB0aGUgbG9vcCBib2R5IGNsb3NlciB0byB0aGlzCisgIC8vIG51bWJlci4KKyAgdW5zaWduZWQgTG9vcE1pY3JvT3BCdWZmZXJTaXplOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgRGVmYXVsdExvb3BNaWNyb09wQnVmZmVyU2l6ZSA9IDA7CisKKyAgLy8gTG9hZExhdGVuY3kgaXMgdGhlIGV4cGVjdGVkIGxhdGVuY3kgb2YgbG9hZCBpbnN0cnVjdGlvbnMuCisgIHVuc2lnbmVkIExvYWRMYXRlbmN5OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgRGVmYXVsdExvYWRMYXRlbmN5ID0gNDsKKworICAvLyBIaWdoTGF0ZW5jeSBpcyB0aGUgZXhwZWN0ZWQgbGF0ZW5jeSBvZiAidmVyeSBoaWdoIGxhdGVuY3kiIG9wZXJhdGlvbnMuCisgIC8vIFNlZSBUYXJnZXRJbnN0ckluZm86OmlzSGlnaExhdGVuY3lEZWYoKS4KKyAgLy8gQnkgZGVmYXVsdCwgdGhpcyBpcyBzZXQgdG8gYW4gYXJiaXRyYXJpbHkgaGlnaCBudW1iZXIgb2YgY3ljbGVzCisgIC8vIGxpa2VseSB0byBoYXZlIHNvbWUgaW1wYWN0IG9uIHNjaGVkdWxpbmcgaGV1cmlzdGljcy4KKyAgdW5zaWduZWQgSGlnaExhdGVuY3k7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBEZWZhdWx0SGlnaExhdGVuY3kgPSAxMDsKKworICAvLyBNaXNwcmVkaWN0UGVuYWx0eSBpcyB0aGUgdHlwaWNhbCBudW1iZXIgb2YgZXh0cmEgY3ljbGVzIHRoZSBwcm9jZXNzb3IKKyAgLy8gdGFrZXMgdG8gcmVjb3ZlciBmcm9tIGEgYnJhbmNoIG1pc3ByZWRpY3Rpb24uCisgIHVuc2lnbmVkIE1pc3ByZWRpY3RQZW5hbHR5OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgRGVmYXVsdE1pc3ByZWRpY3RQZW5hbHR5ID0gMTA7CisKKyAgYm9vbCBQb3N0UkFTY2hlZHVsZXI7IC8vIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UKKworICBib29sIENvbXBsZXRlTW9kZWw7CisKKyAgdW5zaWduZWQgUHJvY0lEOworICBjb25zdCBNQ1Byb2NSZXNvdXJjZURlc2MgKlByb2NSZXNvdXJjZVRhYmxlOworICBjb25zdCBNQ1NjaGVkQ2xhc3NEZXNjICpTY2hlZENsYXNzVGFibGU7CisgIHVuc2lnbmVkIE51bVByb2NSZXNvdXJjZUtpbmRzOworICB1bnNpZ25lZCBOdW1TY2hlZENsYXNzZXM7CisgIC8vIEluc3RydWN0aW9uIGl0aW5lcmFyeSB0YWJsZXMgdXNlZCBieSBJbnN0ckl0aW5lcmFyeURhdGEuCisgIGZyaWVuZCBjbGFzcyBJbnN0ckl0aW5lcmFyeURhdGE7CisgIGNvbnN0IEluc3RySXRpbmVyYXJ5ICpJbnN0ckl0aW5lcmFyaWVzOworCisgIHVuc2lnbmVkIGdldFByb2Nlc3NvcklEKCkgY29uc3QgeyByZXR1cm4gUHJvY0lEOyB9CisKKyAgLy8vIERvZXMgdGhpcyBtYWNoaW5lIG1vZGVsIGluY2x1ZGUgaW5zdHJ1Y3Rpb24tbGV2ZWwgc2NoZWR1bGluZy4KKyAgYm9vbCBoYXNJbnN0clNjaGVkTW9kZWwoKSBjb25zdCB7IHJldHVybiBTY2hlZENsYXNzVGFibGU7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBtYWNoaW5lIG1vZGVsIGRhdGEgZm9yIGFsbCBpbnN0cnVjdGlvbnMgd2l0aCBhCisgIC8vLyBzY2hlZHVsaW5nIGNsYXNzIChpdGluZXJhcnkgY2xhc3Mgb3IgU2NoZWRSVyBsaXN0KS4KKyAgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3QgeyByZXR1cm4gQ29tcGxldGVNb2RlbDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBtYWNoaW5lIHN1cHBvcnRzIG91dCBvZiBvcmRlciBleGVjdXRpb24uCisgIGJvb2wgaXNPdXRPZk9yZGVyKCkgY29uc3QgeyByZXR1cm4gTWljcm9PcEJ1ZmZlclNpemUgPiAxOyB9CisKKyAgdW5zaWduZWQgZ2V0TnVtUHJvY1Jlc291cmNlS2luZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIE51bVByb2NSZXNvdXJjZUtpbmRzOworICB9CisKKyAgY29uc3QgTUNQcm9jUmVzb3VyY2VEZXNjICpnZXRQcm9jUmVzb3VyY2UodW5zaWduZWQgUHJvY1Jlc291cmNlSWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KGhhc0luc3RyU2NoZWRNb2RlbCgpICYmICJObyBzY2hlZHVsaW5nIG1hY2hpbmUgbW9kZWwiKTsKKworICAgIGFzc2VydChQcm9jUmVzb3VyY2VJZHggPCBOdW1Qcm9jUmVzb3VyY2VLaW5kcyAmJiAiYmFkIHByb2MgcmVzb3VyY2UgaWR4Iik7CisgICAgcmV0dXJuICZQcm9jUmVzb3VyY2VUYWJsZVtQcm9jUmVzb3VyY2VJZHhdOworICB9CisKKyAgY29uc3QgTUNTY2hlZENsYXNzRGVzYyAqZ2V0U2NoZWRDbGFzc0Rlc2ModW5zaWduZWQgU2NoZWRDbGFzc0lkeCkgY29uc3QgeworICAgIGFzc2VydChoYXNJbnN0clNjaGVkTW9kZWwoKSAmJiAiTm8gc2NoZWR1bGluZyBtYWNoaW5lIG1vZGVsIik7CisKKyAgICBhc3NlcnQoU2NoZWRDbGFzc0lkeCA8IE51bVNjaGVkQ2xhc3NlcyAmJiAiYmFkIHNjaGVkdWxpbmcgY2xhc3MgaWR4Iik7CisgICAgcmV0dXJuICZTY2hlZENsYXNzVGFibGVbU2NoZWRDbGFzc0lkeF07CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbGF0ZW5jeSB2YWx1ZSBmb3IgdGhlIHNjaGVkdWxpbmcgY2xhc3MuCisgIHN0YXRpYyBpbnQgY29tcHV0ZUluc3RyTGF0ZW5jeShjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU2NoZWRDbGFzc0Rlc2MgJlNDRGVzYyk7CisKKyAgLy8vIFJldHVybnMgdGhlIHJlY2lwcm9jYWwgdGhyb3VnaHB1dCBpbmZvcm1hdGlvbiBmcm9tIGEgTUNTY2hlZENsYXNzRGVzYy4KKyAgc3RhdGljIE9wdGlvbmFsPGRvdWJsZT4KKyAgZ2V0UmVjaXByb2NhbFRocm91Z2hwdXQoY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU2NoZWRDbGFzc0Rlc2MgJlNDRGVzYyk7CisKKyAgLy8vIFJldHVybnMgdGhlIGRlZmF1bHQgaW5pdGlhbGl6ZWQgbW9kZWwuCisgIHN0YXRpYyBjb25zdCBNQ1NjaGVkTW9kZWwgJkdldERlZmF1bHRTY2hlZE1vZGVsKCkgeyByZXR1cm4gRGVmYXVsdDsgfQorICBzdGF0aWMgY29uc3QgTUNTY2hlZE1vZGVsIERlZmF1bHQ7Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTZWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU2VjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NzFiMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU2VjdGlvbi5oCkBAIC0wLDAgKzEsMTg3IEBACisvLz09PS0gTUNTZWN0aW9uLmggLSBNYWNoaW5lIENvZGUgU2VjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgTUNTZWN0aW9uIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1NFQ1RJT05fSAorI2RlZmluZSBMTFZNX01DX01DU0VDVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0ZyYWdtZW50LmgiCisjaW5jbHVkZSAibGx2bS9NQy9TZWN0aW9uS2luZC5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0FzbUluZm87CitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBNQ0V4cHI7CitjbGFzcyBNQ1N5bWJvbDsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgVHJpcGxlOworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaWxpc3RfYWxsb2NfdHJhaXRzPE1DRnJhZ21lbnQ+IHsKKyAgc3RhdGljIHZvaWQgZGVsZXRlTm9kZShNQ0ZyYWdtZW50ICpWKTsKK307CisKKy8vLyBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB1bmlxdWVkIGlkZW50aWZpZXIgZm9yIGEgc2VjdGlvbiBpbiB0aGUKKy8vLyBjdXJyZW50IHRyYW5zbGF0aW9uIHVuaXQuICBUaGUgTUNDb250ZXh0IGNsYXNzIHVuaXF1ZXMgYW5kIGNyZWF0ZXMgdGhlc2UuCitjbGFzcyBNQ1NlY3Rpb24geworcHVibGljOgorICBlbnVtIFNlY3Rpb25WYXJpYW50IHsgU1ZfQ09GRiA9IDAsIFNWX0VMRiwgU1ZfTWFjaE8sIFNWX1dhc20gfTsKKworICAvLy8gXGJyaWVmIEV4cHJlc3MgdGhlIHN0YXRlIG9mIGJ1bmRsZSBsb2NrZWQgZ3JvdXBzIHdoaWxlIGVtaXR0aW5nIGNvZGUuCisgIGVudW0gQnVuZGxlTG9ja1N0YXRlVHlwZSB7CisgICAgTm90QnVuZGxlTG9ja2VkLAorICAgIEJ1bmRsZUxvY2tlZCwKKyAgICBCdW5kbGVMb2NrZWRBbGlnblRvRW5kCisgIH07CisKKyAgdXNpbmcgRnJhZ21lbnRMaXN0VHlwZSA9IGlwbGlzdDxNQ0ZyYWdtZW50PjsKKworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IEZyYWdtZW50TGlzdFR5cGU6OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBpdGVyYXRvciA9IEZyYWdtZW50TGlzdFR5cGU6Oml0ZXJhdG9yOworCisgIHVzaW5nIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgPSBGcmFnbWVudExpc3RUeXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICB1c2luZyByZXZlcnNlX2l0ZXJhdG9yID0gRnJhZ21lbnRMaXN0VHlwZTo6cmV2ZXJzZV9pdGVyYXRvcjsKKworcHJpdmF0ZToKKyAgTUNTeW1ib2wgKkJlZ2luOworICBNQ1N5bWJvbCAqRW5kID0gbnVsbHB0cjsKKyAgLy8vIFRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb2YgdGhpcyBzZWN0aW9uLgorICB1bnNpZ25lZCBBbGlnbm1lbnQgPSAxOworICAvLy8gVGhlIHNlY3Rpb24gaW5kZXggaW4gdGhlIGFzc2VtYmxlcnMgc2VjdGlvbiBsaXN0LgorICB1bnNpZ25lZCBPcmRpbmFsID0gMDsKKyAgLy8vIFRoZSBpbmRleCBvZiB0aGlzIHNlY3Rpb24gaW4gdGhlIGxheW91dCBvcmRlci4KKyAgdW5zaWduZWQgTGF5b3V0T3JkZXI7CisKKyAgLy8vIFxicmllZiBLZWVwaW5nIHRyYWNrIG9mIGJ1bmRsZS1sb2NrZWQgc3RhdGUuCisgIEJ1bmRsZUxvY2tTdGF0ZVR5cGUgQnVuZGxlTG9ja1N0YXRlID0gTm90QnVuZGxlTG9ja2VkOworCisgIC8vLyBcYnJpZWYgQ3VycmVudCBuZXN0aW5nIGRlcHRoIG9mIGJ1bmRsZV9sb2NrIGRpcmVjdGl2ZXMuCisgIHVuc2lnbmVkIEJ1bmRsZUxvY2tOZXN0aW5nRGVwdGggPSAwOworCisgIC8vLyBcYnJpZWYgV2UndmUgc2VlbiBhIGJ1bmRsZV9sb2NrIGRpcmVjdGl2ZSBidXQgbm90IGl0cyBmaXJzdCBpbnN0cnVjdGlvbgorICAvLy8geWV0LgorICBib29sIEJ1bmRsZUdyb3VwQmVmb3JlRmlyc3RJbnN0IDogMTsKKworICAvLy8gV2hldGhlciB0aGlzIHNlY3Rpb24gaGFzIGhhZCBpbnN0cnVjdGlvbnMgZW1pdHRlZCBpbnRvIGl0LgorICBib29sIEhhc0luc3RydWN0aW9ucyA6IDE7CisKKyAgYm9vbCBJc1JlZ2lzdGVyZWQgOiAxOworCisgIE1DRHVtbXlGcmFnbWVudCBEdW1teUZyYWdtZW50OworCisgIEZyYWdtZW50TGlzdFR5cGUgRnJhZ21lbnRzOworCisgIC8vLyBNYXBwaW5nIGZyb20gc3Vic2VjdGlvbiBudW1iZXIgdG8gaW5zZXJ0aW9uIHBvaW50IGZvciBzdWJzZWN0aW9uIG51bWJlcnMKKyAgLy8vIGJlbG93IHRoYXQgbnVtYmVyLgorICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIE1DRnJhZ21lbnQgKj4sIDE+IFN1YnNlY3Rpb25GcmFnbWVudE1hcDsKKworcHJvdGVjdGVkOgorICBTZWN0aW9uVmFyaWFudCBWYXJpYW50OworICBTZWN0aW9uS2luZCBLaW5kOworCisgIE1DU2VjdGlvbihTZWN0aW9uVmFyaWFudCBWLCBTZWN0aW9uS2luZCBLLCBNQ1N5bWJvbCAqQmVnaW4pOworICB+TUNTZWN0aW9uKCk7CisKK3B1YmxpYzoKKyAgTUNTZWN0aW9uKGNvbnN0IE1DU2VjdGlvbiAmKSA9IGRlbGV0ZTsKKyAgTUNTZWN0aW9uICZvcGVyYXRvcj0oY29uc3QgTUNTZWN0aW9uICYpID0gZGVsZXRlOworCisgIFNlY3Rpb25LaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgU2VjdGlvblZhcmlhbnQgZ2V0VmFyaWFudCgpIGNvbnN0IHsgcmV0dXJuIFZhcmlhbnQ7IH0KKworICBNQ1N5bWJvbCAqZ2V0QmVnaW5TeW1ib2woKSB7IHJldHVybiBCZWdpbjsgfQorICBjb25zdCBNQ1N5bWJvbCAqZ2V0QmVnaW5TeW1ib2woKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TUNTZWN0aW9uICo+KHRoaXMpLT5nZXRCZWdpblN5bWJvbCgpOworICB9CisgIHZvaWQgc2V0QmVnaW5TeW1ib2woTUNTeW1ib2wgKlN5bSkgeworICAgIGFzc2VydCghQmVnaW4pOworICAgIEJlZ2luID0gU3ltOworICB9CisgIE1DU3ltYm9sICpnZXRFbmRTeW1ib2woTUNDb250ZXh0ICZDdHgpOworICBib29sIGhhc0VuZGVkKCkgY29uc3Q7CisKKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gQWxpZ25tZW50OyB9CisgIHZvaWQgc2V0QWxpZ25tZW50KHVuc2lnbmVkIFZhbHVlKSB7IEFsaWdubWVudCA9IFZhbHVlOyB9CisKKyAgdW5zaWduZWQgZ2V0T3JkaW5hbCgpIGNvbnN0IHsgcmV0dXJuIE9yZGluYWw7IH0KKyAgdm9pZCBzZXRPcmRpbmFsKHVuc2lnbmVkIFZhbHVlKSB7IE9yZGluYWwgPSBWYWx1ZTsgfQorCisgIHVuc2lnbmVkIGdldExheW91dE9yZGVyKCkgY29uc3QgeyByZXR1cm4gTGF5b3V0T3JkZXI7IH0KKyAgdm9pZCBzZXRMYXlvdXRPcmRlcih1bnNpZ25lZCBWYWx1ZSkgeyBMYXlvdXRPcmRlciA9IFZhbHVlOyB9CisKKyAgQnVuZGxlTG9ja1N0YXRlVHlwZSBnZXRCdW5kbGVMb2NrU3RhdGUoKSBjb25zdCB7IHJldHVybiBCdW5kbGVMb2NrU3RhdGU7IH0KKyAgdm9pZCBzZXRCdW5kbGVMb2NrU3RhdGUoQnVuZGxlTG9ja1N0YXRlVHlwZSBOZXdTdGF0ZSk7CisgIGJvb2wgaXNCdW5kbGVMb2NrZWQoKSBjb25zdCB7IHJldHVybiBCdW5kbGVMb2NrU3RhdGUgIT0gTm90QnVuZGxlTG9ja2VkOyB9CisKKyAgYm9vbCBpc0J1bmRsZUdyb3VwQmVmb3JlRmlyc3RJbnN0KCkgY29uc3QgeworICAgIHJldHVybiBCdW5kbGVHcm91cEJlZm9yZUZpcnN0SW5zdDsKKyAgfQorICB2b2lkIHNldEJ1bmRsZUdyb3VwQmVmb3JlRmlyc3RJbnN0KGJvb2wgSXNGaXJzdCkgeworICAgIEJ1bmRsZUdyb3VwQmVmb3JlRmlyc3RJbnN0ID0gSXNGaXJzdDsKKyAgfQorCisgIGJvb2wgaGFzSW5zdHJ1Y3Rpb25zKCkgY29uc3QgeyByZXR1cm4gSGFzSW5zdHJ1Y3Rpb25zOyB9CisgIHZvaWQgc2V0SGFzSW5zdHJ1Y3Rpb25zKGJvb2wgVmFsdWUpIHsgSGFzSW5zdHJ1Y3Rpb25zID0gVmFsdWU7IH0KKworICBib29sIGlzUmVnaXN0ZXJlZCgpIGNvbnN0IHsgcmV0dXJuIElzUmVnaXN0ZXJlZDsgfQorICB2b2lkIHNldElzUmVnaXN0ZXJlZChib29sIFZhbHVlKSB7IElzUmVnaXN0ZXJlZCA9IFZhbHVlOyB9CisKKyAgTUNTZWN0aW9uOjpGcmFnbWVudExpc3RUeXBlICZnZXRGcmFnbWVudExpc3QoKSB7IHJldHVybiBGcmFnbWVudHM7IH0KKyAgY29uc3QgTUNTZWN0aW9uOjpGcmFnbWVudExpc3RUeXBlICZnZXRGcmFnbWVudExpc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TUNTZWN0aW9uICo+KHRoaXMpLT5nZXRGcmFnbWVudExpc3QoKTsKKyAgfQorCisgIC8vLyBTdXBwb3J0IGZvciBNQ0ZyYWdtZW50OjpnZXROZXh0Tm9kZSgpLgorICBzdGF0aWMgRnJhZ21lbnRMaXN0VHlwZSBNQ1NlY3Rpb246OipnZXRTdWJsaXN0QWNjZXNzKE1DRnJhZ21lbnQgKikgeworICAgIHJldHVybiAmTUNTZWN0aW9uOjpGcmFnbWVudHM7CisgIH0KKworICBjb25zdCBNQ0R1bW15RnJhZ21lbnQgJmdldER1bW15RnJhZ21lbnQoKSBjb25zdCB7IHJldHVybiBEdW1teUZyYWdtZW50OyB9CisgIE1DRHVtbXlGcmFnbWVudCAmZ2V0RHVtbXlGcmFnbWVudCgpIHsgcmV0dXJuIER1bW15RnJhZ21lbnQ7IH0KKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIEZyYWdtZW50cy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gRnJhZ21lbnRzLmJlZ2luKCk7IH0KKworICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBGcmFnbWVudHMuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gRnJhZ21lbnRzLmVuZCgpOyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiBGcmFnbWVudHMucmJlZ2luKCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiBGcmFnbWVudHMucmJlZ2luKCk7IH0KKworICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiBGcmFnbWVudHMucmVuZCgpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0ICB7IHJldHVybiBGcmFnbWVudHMucmVuZCgpOyB9CisKKyAgTUNTZWN0aW9uOjppdGVyYXRvciBnZXRTdWJzZWN0aW9uSW5zZXJ0aW9uUG9pbnQodW5zaWduZWQgU3Vic2VjdGlvbik7CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIFByaW50U3dpdGNoVG9TZWN0aW9uKGNvbnN0IE1DQXNtSW5mbyAmTUFJLCBjb25zdCBUcmlwbGUgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0V4cHIgKlN1YnNlY3Rpb24pIGNvbnN0ID0gMDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgYSAuYWxpZ24gZGlyZWN0aXZlIHNob3VsZCB1c2UgIm9wdGltaXplZCBub3BzIiB0byBmaWxsCisgIC8vLyBpbnN0ZWFkIG9mIDBzLgorICB2aXJ0dWFsIGJvb2wgVXNlQ29kZUFsaWduKCkgY29uc3QgPSAwOworCisgIC8vLyBDaGVjayB3aGV0aGVyIHRoaXMgc2VjdGlvbiBpcyAidmlydHVhbCIsIHRoYXQgaXMgaGFzIG5vIGFjdHVhbCBvYmplY3QKKyAgLy8vIGZpbGUgY29udGVudHMuCisgIHZpcnR1YWwgYm9vbCBpc1ZpcnR1YWxTZWN0aW9uKCkgY29uc3QgPSAwOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNTRUNUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTZWN0aW9uQ09GRi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1NlY3Rpb25DT0ZGLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiOWY4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTZWN0aW9uQ09GRi5oCkBAIC0wLDAgKzEsMTAwIEBACisvLz09PS0gTUNTZWN0aW9uQ09GRi5oIC0gQ09GRiBNYWNoaW5lIENvZGUgU2VjdGlvbnMgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgTUNTZWN0aW9uQ09GRiBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNTRUNUSU9OQ09GRl9ICisjZGVmaW5lIExMVk1fTUNfTUNTRUNUSU9OQ09GRl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vTUMvU2VjdGlvbktpbmQuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DU3ltYm9sOworCisvLy8gVGhpcyByZXByZXNlbnRzIGEgc2VjdGlvbiBvbiBXaW5kb3dzCitjbGFzcyBNQ1NlY3Rpb25DT0ZGIGZpbmFsIDogcHVibGljIE1DU2VjdGlvbiB7CisgIC8vIFRoZSBtZW1vcnkgZm9yIHRoaXMgc3RyaW5nIGlzIHN0b3JlZCBpbiB0aGUgc2FtZSBNQ0NvbnRleHQgYXMgKnRoaXMuCisgIFN0cmluZ1JlZiBTZWN0aW9uTmFtZTsKKworICAvLyBGSVhNRTogVGhlIGZvbGxvd2luZyBmaWVsZHMgc2hvdWxkIG5vdCBiZSBtdXRhYmxlLCBidXQgYXJlIGZvciBub3cgc28gdGhlCisgIC8vIGFzbSBwYXJzZXIgY2FuIGhvbm9yIHRoZSAubGlua29uY2UgZGlyZWN0aXZlLgorCisgIC8vLyBUaGlzIGlzIHRoZSBDaGFyYWN0ZXJpc3RpY3MgZmllbGQgb2YgYSBzZWN0aW9uLCBkcmF3biBmcm9tIHRoZSBlbnVtcworICAvLy8gYmVsb3cuCisgIG11dGFibGUgdW5zaWduZWQgQ2hhcmFjdGVyaXN0aWNzOworCisgIC8vLyBUaGUgdW5pcXVlIElEcyB1c2VkIHdpdGggdGhlIC5wZGF0YSBhbmQgLnhkYXRhIHNlY3Rpb25zIGNyZWF0ZWQgaW50ZXJuYWxseQorICAvLy8gYnkgdGhlIGFzc2VtYmxlci4gVGhpcyBJRCBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGZvciBldmVyeSAudGV4dCBzZWN0aW9uLAorICAvLy8gdGhlcmUgaXMgZXhhY3RseSBvbmUgLnBkYXRhIGFuZCBvbmUgLnhkYXRhIHNlY3Rpb24sIHdoaWNoIGlzIHJlcXVpcmVkIGJ5CisgIC8vLyB0aGUgTWljcm9zb2Z0IGluY3JlbWVudGFsIGxpbmtlci4gVGhpcyBkYXRhIGlzIG11dGFibGUgYmVjYXVzZSB0aGlzIElEIGlzCisgIC8vLyBub3Qgbm90aW9uYWxseSBwYXJ0IG9mIHRoZSBzZWN0aW9uLgorICBtdXRhYmxlIHVuc2lnbmVkIFdpbkNGSVNlY3Rpb25JRCA9IH4wVTsKKworICAvLy8gVGhlIENPTURBVCBzeW1ib2wgb2YgdGhpcyBzZWN0aW9uLiBPbmx5IHZhbGlkIGlmIHRoaXMgaXMgYSBDT01EQVQgc2VjdGlvbi4KKyAgLy8vIFR3byBDT01EQVQgc2VjdGlvbnMgYXJlIG1lcmdlZCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgQ09NREFUIHN5bWJvbC4KKyAgTUNTeW1ib2wgKkNPTURBVFN5bWJvbDsKKworICAvLy8gVGhpcyBpcyB0aGUgU2VsZWN0aW9uIGZpZWxkIGZvciB0aGUgc2VjdGlvbiBzeW1ib2wsIGlmIGl0IGlzIGEgQ09NREFUCisgIC8vLyBzZWN0aW9uIChDaGFyYWN0ZXJpc3RpY3MgJiBJTUFHRV9TQ05fTE5LX0NPTURBVCkgIT0gMAorICBtdXRhYmxlIGludCBTZWxlY3Rpb247CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBNQ0NvbnRleHQ7CisgIE1DU2VjdGlvbkNPRkYoU3RyaW5nUmVmIFNlY3Rpb24sIHVuc2lnbmVkIENoYXJhY3RlcmlzdGljcywKKyAgICAgICAgICAgICAgICBNQ1N5bWJvbCAqQ09NREFUU3ltYm9sLCBpbnQgU2VsZWN0aW9uLCBTZWN0aW9uS2luZCBLLAorICAgICAgICAgICAgICAgIE1DU3ltYm9sICpCZWdpbikKKyAgICAgIDogTUNTZWN0aW9uKFNWX0NPRkYsIEssIEJlZ2luKSwgU2VjdGlvbk5hbWUoU2VjdGlvbiksCisgICAgICAgIENoYXJhY3RlcmlzdGljcyhDaGFyYWN0ZXJpc3RpY3MpLCBDT01EQVRTeW1ib2woQ09NREFUU3ltYm9sKSwKKyAgICAgICAgU2VsZWN0aW9uKFNlbGVjdGlvbikgeworICAgIGFzc2VydCgoQ2hhcmFjdGVyaXN0aWNzICYgMHgwMEYwMDAwMCkgPT0gMCAmJgorICAgICAgICAgICAiYWxpZ25tZW50IG11c3Qgbm90IGJlIHNldCB1cG9uIHNlY3Rpb24gY3JlYXRpb24iKTsKKyAgfQorCitwdWJsaWM6CisgIH5NQ1NlY3Rpb25DT0ZGKCk7CisKKyAgLy8vIERlY2lkZXMgd2hldGhlciBhICcuc2VjdGlvbicgZGlyZWN0aXZlIHNob3VsZCBiZSBwcmludGVkIGJlZm9yZSB0aGUKKyAgLy8vIHNlY3Rpb24gbmFtZQorICBib29sIFNob3VsZE9taXRTZWN0aW9uRGlyZWN0aXZlKFN0cmluZ1JlZiBOYW1lLCBjb25zdCBNQ0FzbUluZm8gJk1BSSkgY29uc3Q7CisKKyAgU3RyaW5nUmVmIGdldFNlY3Rpb25OYW1lKCkgY29uc3QgeyByZXR1cm4gU2VjdGlvbk5hbWU7IH0KKyAgdW5zaWduZWQgZ2V0Q2hhcmFjdGVyaXN0aWNzKCkgY29uc3QgeyByZXR1cm4gQ2hhcmFjdGVyaXN0aWNzOyB9CisgIE1DU3ltYm9sICpnZXRDT01EQVRTeW1ib2woKSBjb25zdCB7IHJldHVybiBDT01EQVRTeW1ib2w7IH0KKyAgaW50IGdldFNlbGVjdGlvbigpIGNvbnN0IHsgcmV0dXJuIFNlbGVjdGlvbjsgfQorCisgIHZvaWQgc2V0U2VsZWN0aW9uKGludCBTZWxlY3Rpb24pIGNvbnN0OworCisgIHZvaWQgUHJpbnRTd2l0Y2hUb1NlY3Rpb24oY29uc3QgTUNBc21JbmZvICZNQUksIGNvbnN0IFRyaXBsZSAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNFeHByICpTdWJzZWN0aW9uKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBVc2VDb2RlQWxpZ24oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1ZpcnR1YWxTZWN0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdW5zaWduZWQgZ2V0T3JBc3NpZ25XaW5DRklTZWN0aW9uSUQodW5zaWduZWQgKk5leHRJRCkgY29uc3QgeworICAgIGlmIChXaW5DRklTZWN0aW9uSUQgPT0gfjBVKQorICAgICAgV2luQ0ZJU2VjdGlvbklEID0gKCpOZXh0SUQpKys7CisgICAgcmV0dXJuIFdpbkNGSVNlY3Rpb25JRDsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzSW1wbGljaXRseURpc2NhcmRhYmxlKFN0cmluZ1JlZiBOYW1lKSB7CisgICAgcmV0dXJuIE5hbWUuc3RhcnRzd2l0aCgiLmRlYnVnIik7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DU2VjdGlvbiAqUykgeyByZXR1cm4gUy0+Z2V0VmFyaWFudCgpID09IFNWX0NPRkY7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DU0VDVElPTkNPRkZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1NlY3Rpb25FTEYuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTZWN0aW9uRUxGLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjMjg5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTZWN0aW9uRUxGLmgKQEAgLTAsMCArMSw5OSBAQAorLy89PT0tIE1DU2VjdGlvbkVMRi5oIC0gRUxGIE1hY2hpbmUgQ29kZSBTZWN0aW9ucyAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1DU2VjdGlvbkVMRiBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNTRUNUSU9ORUxGX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1NFQ1RJT05FTEZfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sRUxGLmgiCisjaW5jbHVkZSAibGx2bS9NQy9TZWN0aW9uS2luZC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DU3ltYm9sOworCisvLy8gVGhpcyByZXByZXNlbnRzIGEgc2VjdGlvbiBvbiBsaW51eCwgbG90cyBvZiB1bml4IHZhcmlhbnRzIGFuZCBzb21lIGJhcmUKKy8vLyBtZXRhbCBzeXN0ZW1zLgorY2xhc3MgTUNTZWN0aW9uRUxGIGZpbmFsIDogcHVibGljIE1DU2VjdGlvbiB7CisgIC8vLyBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uLiAgVGhlIHJlZmVyZW5jZWQgbWVtb3J5IGlzIG93bmVkIGJ5CisgIC8vLyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVFTEYncyBFTEZVbmlxdWVNYXAuCisgIFN0cmluZ1JlZiBTZWN0aW9uTmFtZTsKKworICAvLy8gVGhpcyBpcyB0aGUgc2hfdHlwZSBmaWVsZCBvZiBhIHNlY3Rpb24sIGRyYXduIGZyb20gdGhlIGVudW1zIGJlbG93LgorICB1bnNpZ25lZCBUeXBlOworCisgIC8vLyBUaGlzIGlzIHRoZSBzaF9mbGFncyBmaWVsZCBvZiBhIHNlY3Rpb24sIGRyYXduIGZyb20gdGhlIGVudW1zIGJlbG93LgorICB1bnNpZ25lZCBGbGFnczsKKworICB1bnNpZ25lZCBVbmlxdWVJRDsKKworICAvLy8gVGhlIHNpemUgb2YgZWFjaCBlbnRyeSBpbiB0aGlzIHNlY3Rpb24uIFRoaXMgc2l6ZSBvbmx5IG1ha2VzIHNlbnNlIGZvcgorICAvLy8gc2VjdGlvbnMgdGhhdCBjb250YWluIGZpeGVkLXNpemVkIGVudHJpZXMuIElmIGEgc2VjdGlvbiBkb2VzIG5vdCBjb250YWluCisgIC8vLyBmaXhlZC1zaXplZCBlbnRyaWVzICdFbnRyeVNpemUnIHdpbGwgYmUgMC4KKyAgdW5zaWduZWQgRW50cnlTaXplOworCisgIGNvbnN0IE1DU3ltYm9sRUxGICpHcm91cDsKKworICAvLy8gc2hfaW5mbyBmb3IgU0hGX0xJTktfT1JERVIgKGNhbiBiZSBudWxsKS4KKyAgY29uc3QgTUNTeW1ib2wgKkFzc29jaWF0ZWRTeW1ib2w7CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBNQ0NvbnRleHQ7CisKKyAgTUNTZWN0aW9uRUxGKFN0cmluZ1JlZiBTZWN0aW9uLCB1bnNpZ25lZCB0eXBlLCB1bnNpZ25lZCBmbGFncywgU2VjdGlvbktpbmQgSywKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIGVudHJ5U2l6ZSwgY29uc3QgTUNTeW1ib2xFTEYgKmdyb3VwLCB1bnNpZ25lZCBVbmlxdWVJRCwKKyAgICAgICAgICAgICAgIE1DU3ltYm9sICpCZWdpbiwgY29uc3QgTUNTeW1ib2xFTEYgKkFzc29jaWF0ZWRTeW1ib2wpCisgICAgICA6IE1DU2VjdGlvbihTVl9FTEYsIEssIEJlZ2luKSwgU2VjdGlvbk5hbWUoU2VjdGlvbiksIFR5cGUodHlwZSksCisgICAgICAgIEZsYWdzKGZsYWdzKSwgVW5pcXVlSUQoVW5pcXVlSUQpLCBFbnRyeVNpemUoZW50cnlTaXplKSwgR3JvdXAoZ3JvdXApLAorICAgICAgICBBc3NvY2lhdGVkU3ltYm9sKEFzc29jaWF0ZWRTeW1ib2wpIHsKKyAgICBpZiAoR3JvdXApCisgICAgICBHcm91cC0+c2V0SXNTaWduYXR1cmUoKTsKKyAgfQorCisgIHZvaWQgc2V0U2VjdGlvbk5hbWUoU3RyaW5nUmVmIE5hbWUpIHsgU2VjdGlvbk5hbWUgPSBOYW1lOyB9CisKK3B1YmxpYzoKKyAgfk1DU2VjdGlvbkVMRigpOworCisgIC8vLyBEZWNpZGVzIHdoZXRoZXIgYSAnLnNlY3Rpb24nIGRpcmVjdGl2ZSBzaG91bGQgYmUgcHJpbnRlZCBiZWZvcmUgdGhlCisgIC8vLyBzZWN0aW9uIG5hbWUKKyAgYm9vbCBTaG91bGRPbWl0U2VjdGlvbkRpcmVjdGl2ZShTdHJpbmdSZWYgTmFtZSwgY29uc3QgTUNBc21JbmZvICZNQUkpIGNvbnN0OworCisgIFN0cmluZ1JlZiBnZXRTZWN0aW9uTmFtZSgpIGNvbnN0IHsgcmV0dXJuIFNlY3Rpb25OYW1lOyB9CisgIHVuc2lnbmVkIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBUeXBlOyB9CisgIHVuc2lnbmVkIGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gRmxhZ3M7IH0KKyAgdW5zaWduZWQgZ2V0RW50cnlTaXplKCkgY29uc3QgeyByZXR1cm4gRW50cnlTaXplOyB9CisgIHZvaWQgc2V0RmxhZ3ModW5zaWduZWQgRikgeyBGbGFncyA9IEY7IH0KKyAgY29uc3QgTUNTeW1ib2xFTEYgKmdldEdyb3VwKCkgY29uc3QgeyByZXR1cm4gR3JvdXA7IH0KKworICB2b2lkIFByaW50U3dpdGNoVG9TZWN0aW9uKGNvbnN0IE1DQXNtSW5mbyAmTUFJLCBjb25zdCBUcmlwbGUgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRXhwciAqU3Vic2VjdGlvbikgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgVXNlQ29kZUFsaWduKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNWaXJ0dWFsU2VjdGlvbigpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgaXNVbmlxdWUoKSBjb25zdCB7IHJldHVybiBVbmlxdWVJRCAhPSB+MFU7IH0KKyAgdW5zaWduZWQgZ2V0VW5pcXVlSUQoKSBjb25zdCB7IHJldHVybiBVbmlxdWVJRDsgfQorCisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0QXNzb2NpYXRlZFNlY3Rpb24oKSBjb25zdCB7IHJldHVybiAmQXNzb2NpYXRlZFN5bWJvbC0+Z2V0U2VjdGlvbigpOyB9CisgIGNvbnN0IE1DU3ltYm9sICpnZXRBc3NvY2lhdGVkU3ltYm9sKCkgY29uc3QgeyByZXR1cm4gQXNzb2NpYXRlZFN5bWJvbDsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNTZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPmdldFZhcmlhbnQoKSA9PSBTVl9FTEY7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DU0VDVElPTkVMRl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU2VjdGlvbk1hY2hPLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU2VjdGlvbk1hY2hPLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkYjA5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTZWN0aW9uTWFjaE8uaApAQCAtMCwwICsxLDkyIEBACisvLz09PS0gTUNTZWN0aW9uTWFjaE8uaCAtIE1hY2hPIE1hY2hpbmUgQ29kZSBTZWN0aW9ucyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgTUNTZWN0aW9uTWFjaE8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DU0VDVElPTk1BQ0hPX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1NFQ1RJT05NQUNIT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9NYWNoTy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFRoaXMgcmVwcmVzZW50cyBhIHNlY3Rpb24gb24gYSBNYWNoLU8gc3lzdGVtICh1c2VkIGJ5IE1hYyBPUyBYKS4gIE9uIGEgTWFjCisvLy8gc3lzdGVtLCB0aGVzZSBhcmUgYWxzbyBkZXNjcmliZWQgaW4gL3Vzci9pbmNsdWRlL21hY2gtby9sb2FkZXIuaC4KK2NsYXNzIE1DU2VjdGlvbk1hY2hPIGZpbmFsIDogcHVibGljIE1DU2VjdGlvbiB7CisgIGNoYXIgU2VnbWVudE5hbWVbMTZdOyAgLy8gTm90IG5lY2Vzc2FyaWx5IG51bGwgdGVybWluYXRlZCEKKyAgY2hhciBTZWN0aW9uTmFtZVsxNl07ICAvLyBOb3QgbmVjZXNzYXJpbHkgbnVsbCB0ZXJtaW5hdGVkIQorCisgIC8vLyBUaGlzIGlzIHRoZSBTRUNUSU9OX1RZUEUgYW5kIFNFQ1RJT05fQVRUUklCVVRFUyBmaWVsZCBvZiBhIHNlY3Rpb24sIGRyYXduCisgIC8vLyBmcm9tIHRoZSBlbnVtcyBiZWxvdy4KKyAgdW5zaWduZWQgVHlwZUFuZEF0dHJpYnV0ZXM7CisKKyAgLy8vIFRoZSAncmVzZXJ2ZWQyJyBmaWVsZCBvZiBhIHNlY3Rpb24sIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBzaXplIG9mIHN0dWJzLAorICAvLy8gZm9yIGV4YW1wbGUuCisgIHVuc2lnbmVkIFJlc2VydmVkMjsKKworICBNQ1NlY3Rpb25NYWNoTyhTdHJpbmdSZWYgU2VnbWVudCwgU3RyaW5nUmVmIFNlY3Rpb24sIHVuc2lnbmVkIFRBQSwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgcmVzZXJ2ZWQyLCBTZWN0aW9uS2luZCBLLCBNQ1N5bWJvbCAqQmVnaW4pOworICBmcmllbmQgY2xhc3MgTUNDb250ZXh0OworcHVibGljOgorCisgIFN0cmluZ1JlZiBnZXRTZWdtZW50TmFtZSgpIGNvbnN0IHsKKyAgICAvLyBTZWdtZW50TmFtZSBpcyBub3QgbmVjZXNzYXJpbHkgbnVsbCB0ZXJtaW5hdGVkIQorICAgIGlmIChTZWdtZW50TmFtZVsxNV0pCisgICAgICByZXR1cm4gU3RyaW5nUmVmKFNlZ21lbnROYW1lLCAxNik7CisgICAgcmV0dXJuIFN0cmluZ1JlZihTZWdtZW50TmFtZSk7CisgIH0KKyAgU3RyaW5nUmVmIGdldFNlY3Rpb25OYW1lKCkgY29uc3QgeworICAgIC8vIFNlY3Rpb25OYW1lIGlzIG5vdCBuZWNlc3NhcmlseSBudWxsIHRlcm1pbmF0ZWQhCisgICAgaWYgKFNlY3Rpb25OYW1lWzE1XSkKKyAgICAgIHJldHVybiBTdHJpbmdSZWYoU2VjdGlvbk5hbWUsIDE2KTsKKyAgICByZXR1cm4gU3RyaW5nUmVmKFNlY3Rpb25OYW1lKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFR5cGVBbmRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gVHlwZUFuZEF0dHJpYnV0ZXM7IH0KKyAgdW5zaWduZWQgZ2V0U3R1YlNpemUoKSBjb25zdCB7IHJldHVybiBSZXNlcnZlZDI7IH0KKworICBNYWNoTzo6U2VjdGlvblR5cGUgZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TWFjaE86OlNlY3Rpb25UeXBlPihUeXBlQW5kQXR0cmlidXRlcyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaE86OlNFQ1RJT05fVFlQRSk7CisgIH0KKyAgYm9vbCBoYXNBdHRyaWJ1dGUodW5zaWduZWQgVmFsdWUpIGNvbnN0IHsKKyAgICByZXR1cm4gKFR5cGVBbmRBdHRyaWJ1dGVzICYgVmFsdWUpICE9IDA7CisgIH0KKworICAvLy8gUGFyc2UgdGhlIHNlY3Rpb24gc3BlY2lmaWVyIGluZGljYXRlZCBieSAiU3BlYyIuIFRoaXMgaXMgYSBzdHJpbmcgdGhhdCBjYW4KKyAgLy8vIGFwcGVhciBhZnRlciBhIC5zZWN0aW9uIGRpcmVjdGl2ZSBpbiBhIG1hY2gtbyBmbGF2b3JlZCAucyBmaWxlLiAgSWYKKyAgLy8vIHN1Y2Nlc3NmdWwsIHRoaXMgZmlsbHMgaW4gdGhlIHNwZWNpZmllZCBPdXQgcGFyYW1ldGVycyBhbmQgcmV0dXJucyBhbgorICAvLy8gZW1wdHkgc3RyaW5nLiAgV2hlbiBhbiBpbnZhbGlkIHNlY3Rpb24gc3BlY2lmaWVyIGlzIHByZXNlbnQsIHRoaXMgcmV0dXJucworICAvLy8gYSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgcHJvYmxlbS4gSWYgbm8gVEFBIHdhcyBwYXJzZWQsIFRBQSBpcyBub3QgYWx0ZXJlZCwKKyAgLy8vIGFuZCBUQUFXYXNTZXQgYmVjb21lcyBmYWxzZS4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIFBhcnNlU2VjdGlvblNwZWNpZmllcihTdHJpbmdSZWYgU3BlYywgICAgICAgLy8gSW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICZTZWdtZW50LCAgIC8vIE91dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgJlNlY3Rpb24sICAgLy8gT3V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICAmVEFBLCAgICAgICAvLyBPdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICZUQUFQYXJzZWQsIC8vIE91dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgJlN0dWJTaXplKTsgLy8gT3V0LgorCisgIHZvaWQgUHJpbnRTd2l0Y2hUb1NlY3Rpb24oY29uc3QgTUNBc21JbmZvICZNQUksIGNvbnN0IFRyaXBsZSAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNFeHByICpTdWJzZWN0aW9uKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBVc2VDb2RlQWxpZ24oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1ZpcnR1YWxTZWN0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ1NlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+Z2V0VmFyaWFudCgpID09IFNWX01hY2hPOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTZWN0aW9uV2FzbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1NlY3Rpb25XYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI0Y2Q3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTZWN0aW9uV2FzbS5oCkBAIC0wLDAgKzEsODggQEAKKy8vPT09LSBNQ1NlY3Rpb25XYXNtLmggLSBXYXNtIE1hY2hpbmUgQ29kZSBTZWN0aW9ucyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBNQ1NlY3Rpb25XYXNtIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1NFQ1RJT05XQVNNX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1NFQ1RJT05XQVNNX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sV2FzbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DU3ltYm9sOworCisvLy8gVGhpcyByZXByZXNlbnRzIGEgc2VjdGlvbiBvbiB3YXNtLgorY2xhc3MgTUNTZWN0aW9uV2FzbSBmaW5hbCA6IHB1YmxpYyBNQ1NlY3Rpb24geworICAvLy8gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbi4gIFRoZSByZWZlcmVuY2VkIG1lbW9yeSBpcyBvd25lZCBieQorICAvLy8gVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlV2FzbSdzIFdhc21VbmlxdWVNYXAuCisgIFN0cmluZ1JlZiBTZWN0aW9uTmFtZTsKKworICB1bnNpZ25lZCBVbmlxdWVJRDsKKworICBjb25zdCBNQ1N5bWJvbFdhc20gKkdyb3VwOworCisgIC8vIFRoZSBvZmZzZXQgb2YgdGhlIE1DIGZ1bmN0aW9uL2RhdGEgc2VjdGlvbiBpbiB0aGUgd2FzbSBjb2RlL2RhdGEgc2VjdGlvbi4KKyAgLy8gRm9yIGRhdGEgcmVsb2NhdGlvbnMgdGhlIG9mZnNldCBpcyByZWxhdGl2ZSB0byBzdGFydCBvZiB0aGUgZGF0YSBwYXlsb2FkCisgIC8vIGl0c2VsZiBhbmQgZG9lcyBub3QgaW5jbHVkZSB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBoZWFkZXIuCisgIHVpbnQ2NF90IFNlY3Rpb25PZmZzZXQgPSAwOworCisgIC8vIEZvciBkYXRhIHNlY3Rpb25zLCB0aGlzIGlzIHRoZSBpbmRleCBvZiBvZiB0aGUgY29ycmVzcG9uZGluZyB3YXNtIGRhdGEKKyAgLy8gc2VnbWVudAorICB1aW50MzJfdCBTZWdtZW50SW5kZXggPSAwOworCisgIGZyaWVuZCBjbGFzcyBNQ0NvbnRleHQ7CisgIE1DU2VjdGlvbldhc20oU3RyaW5nUmVmIFNlY3Rpb24sIFNlY3Rpb25LaW5kIEssIGNvbnN0IE1DU3ltYm9sV2FzbSAqZ3JvdXAsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgVW5pcXVlSUQsIE1DU3ltYm9sICpCZWdpbikKKyAgICAgIDogTUNTZWN0aW9uKFNWX1dhc20sIEssIEJlZ2luKSwgU2VjdGlvbk5hbWUoU2VjdGlvbiksIFVuaXF1ZUlEKFVuaXF1ZUlEKSwKKyAgICAgICAgR3JvdXAoZ3JvdXApIHt9CisKKyAgdm9pZCBzZXRTZWN0aW9uTmFtZShTdHJpbmdSZWYgTmFtZSkgeyBTZWN0aW9uTmFtZSA9IE5hbWU7IH0KKworcHVibGljOgorICB+TUNTZWN0aW9uV2FzbSgpOworCisgIC8vLyBEZWNpZGVzIHdoZXRoZXIgYSAnLnNlY3Rpb24nIGRpcmVjdGl2ZSBzaG91bGQgYmUgcHJpbnRlZCBiZWZvcmUgdGhlCisgIC8vLyBzZWN0aW9uIG5hbWUKKyAgYm9vbCBTaG91bGRPbWl0U2VjdGlvbkRpcmVjdGl2ZShTdHJpbmdSZWYgTmFtZSwgY29uc3QgTUNBc21JbmZvICZNQUkpIGNvbnN0OworCisgIFN0cmluZ1JlZiBnZXRTZWN0aW9uTmFtZSgpIGNvbnN0IHsgcmV0dXJuIFNlY3Rpb25OYW1lOyB9CisgIGNvbnN0IE1DU3ltYm9sV2FzbSAqZ2V0R3JvdXAoKSBjb25zdCB7IHJldHVybiBHcm91cDsgfQorCisgIHZvaWQgUHJpbnRTd2l0Y2hUb1NlY3Rpb24oY29uc3QgTUNBc21JbmZvICZNQUksIGNvbnN0IFRyaXBsZSAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNFeHByICpTdWJzZWN0aW9uKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBVc2VDb2RlQWxpZ24oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1ZpcnR1YWxTZWN0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBpc1dhc21EYXRhKCkgY29uc3QgeworICAgIHJldHVybiBLaW5kLmlzR2xvYmFsV3JpdGVhYmxlRGF0YSgpIHx8IEtpbmQuaXNSZWFkT25seSgpOworICB9CisKKyAgYm9vbCBpc1VuaXF1ZSgpIGNvbnN0IHsgcmV0dXJuIFVuaXF1ZUlEICE9IH4wVTsgfQorICB1bnNpZ25lZCBnZXRVbmlxdWVJRCgpIGNvbnN0IHsgcmV0dXJuIFVuaXF1ZUlEOyB9CisKKyAgdWludDY0X3QgZ2V0U2VjdGlvbk9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIFNlY3Rpb25PZmZzZXQ7IH0KKyAgdm9pZCBzZXRTZWN0aW9uT2Zmc2V0KHVpbnQ2NF90IE9mZnNldCkgeyBTZWN0aW9uT2Zmc2V0ID0gT2Zmc2V0OyB9CisKKyAgdWludDMyX3QgZ2V0U2VnbWVudEluZGV4KCkgY29uc3QgeyByZXR1cm4gU2VnbWVudEluZGV4OyB9CisgIHZvaWQgc2V0U2VnbWVudEluZGV4KHVpbnQzMl90IEluZGV4KSB7IFNlZ21lbnRJbmRleCA9IEluZGV4OyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ1NlY3Rpb24gKlMpIHsgcmV0dXJuIFMtPmdldFZhcmlhbnQoKSA9PSBTVl9XYXNtOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTdHJlYW1lci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1N0cmVhbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgyYTgzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTdHJlYW1lci5oCkBAIC0wLDAgKzEsOTc1IEBACisvLz09PS0gTUNTdHJlYW1lci5oIC0gSGlnaC1sZXZlbCBTdHJlYW1pbmcgTWFjaGluZSBDb2RlIE91dHB1dCAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgTUNTdHJlYW1lciBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNTVFJFQU1FUl9ICisjZGVmaW5lIExMVk1fTUNfTUNTVFJFQU1FUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNEaXJlY3RpdmVzLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0xpbmtlck9wdGltaXphdGlvbkhpbnQuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1dpbkVILmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01ENS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TTUxvYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9UYXJnZXRQYXJzZXIuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc3NlbWJsZXJDb25zdGFudFBvb2xzOworY2xhc3MgZm9ybWF0dGVkX3Jhd19vc3RyZWFtOworY2xhc3MgTUNBc21CYWNrZW5kOworY2xhc3MgTUNDb2RlRW1pdHRlcjsKK3N0cnVjdCBNQ0NvZGVQYWRkaW5nQ29udGV4dDsKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIE1DSW5zdDsKK2NsYXNzIE1DSW5zdFByaW50ZXI7CitjbGFzcyBNQ1NlY3Rpb247CitjbGFzcyBNQ1N0cmVhbWVyOworY2xhc3MgTUNTeW1ib2xSZWZFeHByOworY2xhc3MgTUNTdWJ0YXJnZXRJbmZvOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBUd2luZTsKKwordXNpbmcgTUNTZWN0aW9uU3ViUGFpciA9IHN0ZDo6cGFpcjxNQ1NlY3Rpb24gKiwgY29uc3QgTUNFeHByICo+OworCisvLy8gVGFyZ2V0IHNwZWNpZmljIHN0cmVhbWVyIGludGVyZmFjZS4gVGhpcyBpcyB1c2VkIHNvIHRoYXQgdGFyZ2V0cyBjYW4KKy8vLyBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgdGFyZ2V0IHNwZWNpZmljIGFzc2VtYmx5IGRpcmVjdGl2ZXMuCisvLy8KKy8vLyBJZiB0YXJnZXQgZm9vIHdhbnRzIHRvIHVzZSB0aGlzLCBpdCBzaG91bGQgaW1wbGVtZW50IDMgY2xhc3NlczoKKy8vLyAqIEZvb1RhcmdldFN0cmVhbWVyIDogcHVibGljIE1DVGFyZ2V0U3RyZWFtZXIKKy8vLyAqIEZvb1RhcmdldEFzbVN0cmVhbWVyIDogcHVibGljIEZvb1RhcmdldFN0cmVhbWVyCisvLy8gKiBGb29UYXJnZXRFTEZTdHJlYW1lciA6IHB1YmxpYyBGb29UYXJnZXRTdHJlYW1lcgorLy8vCisvLy8gRm9vVGFyZ2V0U3RyZWFtZXIgc2hvdWxkIGhhdmUgYSBwdXJlIHZpcnR1YWwgbWV0aG9kIGZvciBlYWNoIGRpcmVjdGl2ZS4gRm9yCisvLy8gZXhhbXBsZSwgZm9yIGEgIi5iYXIgc3ltYm9sX25hbWUiIGRpcmVjdGl2ZSwgaXQgc2hvdWxkIGhhdmUKKy8vLyB2aXJ0dWFsIGVtaXRCYXIoY29uc3QgTUNTeW1ib2wgJlN5bWJvbCkgPSAwOworLy8vCisvLy8gVGhlIEZvb1RhcmdldEFzbVN0cmVhbWVyIGFuZCBGb29UYXJnZXRFTEZTdHJlYW1lciBjbGFzc2VzIGltcGxlbWVudCB0aGUKKy8vLyBtZXRob2QuIFRoZSBhc3NlbWJseSBzdHJlYW1lciBqdXN0IHByaW50cyAiLmJhciBzeW1ib2xfbmFtZSIuIFRoZSBvYmplY3QKKy8vLyBzdHJlYW1lciBkb2VzIHdoYXRldmVyIGlzIG5lZWRlZCB0byBpbXBsZW1lbnQgLmJhciBpbiB0aGUgb2JqZWN0IGZpbGUuCisvLy8KKy8vLyBJbiB0aGUgYXNzZW1ibHkgcHJpbnRlciBhbmQgcGFyc2VyIHRoZSB0YXJnZXQgc3RyZWFtZXIgY2FuIGJlIHVzZWQgYnkKKy8vLyBjYWxsaW5nIGdldFRhcmdldFN0cmVhbWVyIGFuZCBjYXN0aW5nIGl0IHRvIEZvb1RhcmdldFN0cmVhbWVyOgorLy8vCisvLy8gTUNUYXJnZXRTdHJlYW1lciAmVFMgPSBPdXRTdHJlYW1lci5nZXRUYXJnZXRTdHJlYW1lcigpOworLy8vIEZvb1RhcmdldFN0cmVhbWVyICZBVFMgPSBzdGF0aWNfY2FzdDxGb29UYXJnZXRTdHJlYW1lciAmPihUUyk7CisvLy8KKy8vLyBUaGUgYmFzZSBjbGFzc2VzIEZvb1RhcmdldEFzbVN0cmVhbWVyIGFuZCBGb29UYXJnZXRFTEZTdHJlYW1lciBzaG91bGQKKy8vLyAqbmV2ZXIqIGJlIHRyZWF0ZWQgZGlmZmVyZW50bHkuIENhbGxlcnMgc2hvdWxkIGFsd2F5cyB0YWxrIHRvIGEKKy8vLyBGb29UYXJnZXRTdHJlYW1lci4KK2NsYXNzIE1DVGFyZ2V0U3RyZWFtZXIgeworcHJvdGVjdGVkOgorICBNQ1N0cmVhbWVyICZTdHJlYW1lcjsKKworcHVibGljOgorICBNQ1RhcmdldFN0cmVhbWVyKE1DU3RyZWFtZXIgJlMpOworICB2aXJ0dWFsIH5NQ1RhcmdldFN0cmVhbWVyKCk7CisKKyAgTUNTdHJlYW1lciAmZ2V0U3RyZWFtZXIoKSB7IHJldHVybiBTdHJlYW1lcjsgfQorCisgIC8vIEFsbG93IGEgdGFyZ2V0IHRvIGFkZCBiZWhhdmlvciB0byB0aGUgRW1pdExhYmVsIG9mIE1DU3RyZWFtZXIuCisgIHZpcnR1YWwgdm9pZCBlbWl0TGFiZWwoTUNTeW1ib2wgKlN5bWJvbCk7CisgIC8vIEFsbG93IGEgdGFyZ2V0IHRvIGFkZCBiZWhhdmlvciB0byB0aGUgZW1pdEFzc2lnbm1lbnQgb2YgTUNTdHJlYW1lci4KKyAgdmlydHVhbCB2b2lkIGVtaXRBc3NpZ25tZW50KE1DU3ltYm9sICpTeW1ib2wsIGNvbnN0IE1DRXhwciAqVmFsdWUpOworCisgIHZpcnR1YWwgdm9pZCBwcmV0dHlQcmludEFzbShNQ0luc3RQcmludGVyICZJbnN0UHJpbnRlciwgcmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNJbnN0ICZJbnN0LCBjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSk7CisKKyAgdmlydHVhbCB2b2lkIGVtaXREd2FyZkZpbGVEaXJlY3RpdmUoU3RyaW5nUmVmIERpcmVjdGl2ZSk7CisKKyAgLy8vIFVwZGF0ZSBzdHJlYW1lciBmb3IgYSBuZXcgYWN0aXZlIHNlY3Rpb24uCisgIC8vLworICAvLy8gVGhpcyBpcyBjYWxsZWQgYnkgUG9wU2VjdGlvbiBhbmQgU3dpdGNoU2VjdGlvbiwgaWYgdGhlIGN1cnJlbnQKKyAgLy8vIHNlY3Rpb24gY2hhbmdlcy4KKyAgdmlydHVhbCB2b2lkIGNoYW5nZVNlY3Rpb24oY29uc3QgTUNTZWN0aW9uICpDdXJTZWN0aW9uLCBNQ1NlY3Rpb24gKlNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRXhwciAqU3ViU2VjdGlvbiwgcmF3X29zdHJlYW0gJk9TKTsKKworICB2aXJ0dWFsIHZvaWQgZW1pdFZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUpOworCisgIHZpcnR1YWwgdm9pZCBmaW5pc2goKTsKK307CisKKy8vIEZJWE1FOiBkZWNsYXJlZCBoZXJlIGJlY2F1c2UgaXQgaXMgdXNlZCBmcm9tCisvLyBsaWIvQ29kZUdlbi9Bc21QcmludGVyL0FSTUV4Y2VwdGlvbi5jcHAuCitjbGFzcyBBUk1UYXJnZXRTdHJlYW1lciA6IHB1YmxpYyBNQ1RhcmdldFN0cmVhbWVyIHsKK3B1YmxpYzoKKyAgQVJNVGFyZ2V0U3RyZWFtZXIoTUNTdHJlYW1lciAmUyk7CisgIH5BUk1UYXJnZXRTdHJlYW1lcigpIG92ZXJyaWRlOworCisgIHZpcnR1YWwgdm9pZCBlbWl0Rm5TdGFydCgpOworICB2aXJ0dWFsIHZvaWQgZW1pdEZuRW5kKCk7CisgIHZpcnR1YWwgdm9pZCBlbWl0Q2FudFVud2luZCgpOworICB2aXJ0dWFsIHZvaWQgZW1pdFBlcnNvbmFsaXR5KGNvbnN0IE1DU3ltYm9sICpQZXJzb25hbGl0eSk7CisgIHZpcnR1YWwgdm9pZCBlbWl0UGVyc29uYWxpdHlJbmRleCh1bnNpZ25lZCBJbmRleCk7CisgIHZpcnR1YWwgdm9pZCBlbWl0SGFuZGxlckRhdGEoKTsKKyAgdmlydHVhbCB2b2lkIGVtaXRTZXRGUCh1bnNpZ25lZCBGcFJlZywgdW5zaWduZWQgU3BSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBPZmZzZXQgPSAwKTsKKyAgdmlydHVhbCB2b2lkIGVtaXRNb3ZTUCh1bnNpZ25lZCBSZWcsIGludDY0X3QgT2Zmc2V0ID0gMCk7CisgIHZpcnR1YWwgdm9pZCBlbWl0UGFkKGludDY0X3QgT2Zmc2V0KTsKKyAgdmlydHVhbCB2b2lkIGVtaXRSZWdTYXZlKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD4gJlJlZ0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmVjdG9yKTsKKyAgdmlydHVhbCB2b2lkIGVtaXRVbndpbmRSYXcoaW50NjRfdCBTdGFja09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPHVpbnQ4X3Q+ICZPcGNvZGVzKTsKKworICB2aXJ0dWFsIHZvaWQgc3dpdGNoVmVuZG9yKFN0cmluZ1JlZiBWZW5kb3IpOworICB2aXJ0dWFsIHZvaWQgZW1pdEF0dHJpYnV0ZSh1bnNpZ25lZCBBdHRyaWJ1dGUsIHVuc2lnbmVkIFZhbHVlKTsKKyAgdmlydHVhbCB2b2lkIGVtaXRUZXh0QXR0cmlidXRlKHVuc2lnbmVkIEF0dHJpYnV0ZSwgU3RyaW5nUmVmIFN0cmluZyk7CisgIHZpcnR1YWwgdm9pZCBlbWl0SW50VGV4dEF0dHJpYnV0ZSh1bnNpZ25lZCBBdHRyaWJ1dGUsIHVuc2lnbmVkIEludFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFN0cmluZ1ZhbHVlID0gIiIpOworICB2aXJ0dWFsIHZvaWQgZW1pdEZQVSh1bnNpZ25lZCBGUFUpOworICB2aXJ0dWFsIHZvaWQgZW1pdEFyY2goQVJNOjpBcmNoS2luZCBBcmNoKTsKKyAgdmlydHVhbCB2b2lkIGVtaXRBcmNoRXh0ZW5zaW9uKHVuc2lnbmVkIEFyY2hFeHQpOworICB2aXJ0dWFsIHZvaWQgZW1pdE9iamVjdEFyY2goQVJNOjpBcmNoS2luZCBBcmNoKTsKKyAgdm9pZCBlbWl0VGFyZ2V0QXR0cmlidXRlcyhjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSk7CisgIHZpcnR1YWwgdm9pZCBmaW5pc2hBdHRyaWJ1dGVTZWN0aW9uKCk7CisgIHZpcnR1YWwgdm9pZCBlbWl0SW5zdCh1aW50MzJfdCBJbnN0LCBjaGFyIFN1ZmZpeCA9ICdcMCcpOworCisgIHZpcnR1YWwgdm9pZCBBbm5vdGF0ZVRMU0Rlc2NyaXB0b3JTZXF1ZW5jZShjb25zdCBNQ1N5bWJvbFJlZkV4cHIgKlNSRSk7CisKKyAgdmlydHVhbCB2b2lkIGVtaXRUaHVtYlNldChNQ1N5bWJvbCAqU3ltYm9sLCBjb25zdCBNQ0V4cHIgKlZhbHVlKTsKKworICB2b2lkIGZpbmlzaCgpIG92ZXJyaWRlOworCisgIC8vLyBSZXNldCBhbnkgc3RhdGUgYmV0d2VlbiBvYmplY3QgZW1pc3Npb25zLCBpLmUuIHRoZSBlcXVpdmFsZW50IG9mCisgIC8vLyBNQ1N0cmVhbWVyJ3MgcmVzZXQgbWV0aG9kLgorICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKworICAvLy8gQ2FsbGJhY2sgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGxkcj0gcHNldWRvLgorICAvLy8gQWRkIGEgbmV3IGVudHJ5IHRvIHRoZSBjb25zdGFudCBwb29sIGZvciB0aGUgY3VycmVudCBzZWN0aW9uIGFuZCByZXR1cm4gYW4KKyAgLy8vIE1DRXhwciB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjb25zdGFudCBwb29sIGxvY2F0aW9uLgorICBjb25zdCBNQ0V4cHIgKmFkZENvbnN0YW50UG9vbEVudHJ5KGNvbnN0IE1DRXhwciAqLCBTTUxvYyBMb2MpOworCisgIC8vLyBDYWxsYmFjayB1c2VkIHRvIGltcGxlbW50IHRoZSAubHRvcmcgZGlyZWN0aXZlLgorICAvLy8gRW1pdCBjb250ZW50cyBvZiBjb25zdGFudCBwb29sIGZvciB0aGUgY3VycmVudCBzZWN0aW9uLgorICB2b2lkIGVtaXRDdXJyZW50Q29uc3RhbnRQb29sKCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxBc3NlbWJsZXJDb25zdGFudFBvb2xzPiBDb25zdGFudFBvb2xzOworfTsKKworLy8vIFxicmllZiBTdHJlYW1pbmcgbWFjaGluZSBjb2RlIGdlbmVyYXRpb24gaW50ZXJmYWNlLgorLy8vCisvLy8gVGhpcyBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhIHByb2dyYW1hdGljIGludGVyZmFjZSB0aGF0IGlzIHZlcnkKKy8vLyBzaW1pbGFyIHRvIHRoZSBsZXZlbCB0aGF0IGFuIGFzc2VtYmxlciAucyBmaWxlIHByb3ZpZGVzLiAgSXQgaGFzIGNhbGxiYWNrcworLy8vIHRvIGVtaXQgYnl0ZXMsIGhhbmRsZSBkaXJlY3RpdmVzLCBldGMuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UKKy8vLyByZXRhaW5zIHN0YXRlIHRvIGtub3cgd2hhdCB0aGUgY3VycmVudCBzZWN0aW9uIGlzIGV0Yy4KKy8vLworLy8vIFRoZXJlIGFyZSBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBpbnRlcmZhY2U6IG9uZSBmb3Igd3JpdGluZyBvdXQKKy8vLyBhIC5zIGZpbGUsIGFuZCBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3cml0ZSBvdXQgLm8gZmlsZXMgb2YgdmFyaW91cyBmb3JtYXRzLgorLy8vCitjbGFzcyBNQ1N0cmVhbWVyIHsKKyAgTUNDb250ZXh0ICZDb250ZXh0OworICBzdGQ6OnVuaXF1ZV9wdHI8TUNUYXJnZXRTdHJlYW1lcj4gVGFyZ2V0U3RyZWFtZXI7CisKKyAgc3RkOjp2ZWN0b3I8TUNEd2FyZkZyYW1lSW5mbz4gRHdhcmZGcmFtZUluZm9zOworICBNQ0R3YXJmRnJhbWVJbmZvICpnZXRDdXJyZW50RHdhcmZGcmFtZUluZm8oKTsKKworICAvLy8gU2ltaWxhciB0byBEd2FyZkZyYW1lSW5mb3MsIGJ1dCBmb3IgU0VIIHVud2luZCBpbmZvLiBDaGFpbmVkIGZyYW1lcyBtYXkKKyAgLy8vIHJlZmVyIHRvIGVhY2ggb3RoZXIsIHNvIHVzZSBzdGQ6OnVuaXF1ZV9wdHIgdG8gcHJvdmlkZSBwb2ludGVyIHN0YWJpbGl0eS4KKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFdpbkVIOjpGcmFtZUluZm8+PiBXaW5GcmFtZUluZm9zOworCisgIFdpbkVIOjpGcmFtZUluZm8gKkN1cnJlbnRXaW5GcmFtZUluZm87CisKKyAgLy8vIFJldHJlaXZlIHRoZSBjdXJyZW50IGZyYW1lIGluZm8gaWYgb25lIGlzIGF2YWlsYWJsZSBhbmQgaXQgaXMgbm90IHlldAorICAvLy8gY2xvc2VkLiBPdGhlcndpc2UsIGlzc3VlIGFuIGVycm9yIGFuZCByZXR1cm4gbnVsbC4KKyAgV2luRUg6OkZyYW1lSW5mbyAqRW5zdXJlVmFsaWRXaW5GcmFtZUluZm8oU01Mb2MgTG9jKTsKKworICAvLy8gXGJyaWVmIFRyYWNrcyBhbiBpbmRleCB0byByZXByZXNlbnQgdGhlIG9yZGVyIGEgc3ltYm9sIHdhcyBlbWl0dGVkIGluLgorICAvLy8gWmVybyBtZWFucyB3ZSBkaWQgbm90IGVtaXQgdGhhdCBzeW1ib2wuCisgIERlbnNlTWFwPGNvbnN0IE1DU3ltYm9sICosIHVuc2lnbmVkPiBTeW1ib2xPcmRlcmluZzsKKworICAvLy8gXGJyaWVmIFRoaXMgaXMgc3RhY2sgb2YgY3VycmVudCBhbmQgcHJldmlvdXMgc2VjdGlvbiB2YWx1ZXMgc2F2ZWQgYnkKKyAgLy8vIFB1c2hTZWN0aW9uLgorICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8TUNTZWN0aW9uU3ViUGFpciwgTUNTZWN0aW9uU3ViUGFpcj4sIDQ+IFNlY3Rpb25TdGFjazsKKworICAvLy8gVGhlIG5leHQgdW5pcXVlIElEIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEgV2luQ0ZJLXJlbGF0ZWQgc2VjdGlvbiAoLnBkYXRhCisgIC8vLyBvciAueGRhdGEpLiBUaGlzIElEIGVuc3VyZXMgdGhhdCB3ZSBoYXZlIGEgb25lLXRvLW9uZSBtYXBwaW5nIGZyb20KKyAgLy8vIGNvZGUgc2VjdGlvbiB0byB1bndpbmQgaW5mbyBzZWN0aW9uLCB3aGljaCBNU1ZDJ3MgaW5jcmVtZW50YWwgbGlua2VyCisgIC8vLyByZXF1aXJlcy4KKyAgdW5zaWduZWQgTmV4dFdpbkNGSUlEID0gMDsKKworcHJvdGVjdGVkOgorICBNQ1N0cmVhbWVyKE1DQ29udGV4dCAmQ3R4KTsKKworICB2aXJ0dWFsIHZvaWQgRW1pdENGSVN0YXJ0UHJvY0ltcGwoTUNEd2FyZkZyYW1lSW5mbyAmRnJhbWUpOworICB2aXJ0dWFsIHZvaWQgRW1pdENGSUVuZFByb2NJbXBsKE1DRHdhcmZGcmFtZUluZm8gJkN1ckZyYW1lKTsKKworICAvLy8gV2hlbiBlbWl0dGluZyBhbiBvYmplY3QgZmlsZSwgY3JlYXRlIGFuZCBlbWl0IGEgcmVhbCBsYWJlbC4gV2hlbiBlbWl0dGluZworICAvLy8gdGV4dHVhbCBhc3NlbWJseSwgdGhpcyBzaG91bGQgZG8gbm90aGluZyB0byBhdm9pZCBwb2xsdXRpbmcgb3VyIG91dHB1dC4KKyAgdmlydHVhbCBNQ1N5bWJvbCAqRW1pdENGSUxhYmVsKCk7CisKKyAgV2luRUg6OkZyYW1lSW5mbyAqZ2V0Q3VycmVudFdpbkZyYW1lSW5mbygpIHsKKyAgICByZXR1cm4gQ3VycmVudFdpbkZyYW1lSW5mbzsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBFbWl0V2luZG93c1Vud2luZFRhYmxlcygpOworCisgIHZpcnR1YWwgdm9pZCBFbWl0UmF3VGV4dEltcGwoU3RyaW5nUmVmIFN0cmluZyk7CisKK3B1YmxpYzoKKyAgTUNTdHJlYW1lcihjb25zdCBNQ1N0cmVhbWVyICYpID0gZGVsZXRlOworICBNQ1N0cmVhbWVyICZvcGVyYXRvcj0oY29uc3QgTUNTdHJlYW1lciAmKSA9IGRlbGV0ZTsKKyAgdmlydHVhbCB+TUNTdHJlYW1lcigpOworCisgIHZvaWQgdmlzaXRVc2VkRXhwcihjb25zdCBNQ0V4cHIgJkV4cHIpOworICB2aXJ0dWFsIHZvaWQgdmlzaXRVc2VkU3ltYm9sKGNvbnN0IE1DU3ltYm9sICZTeW0pOworCisgIHZvaWQgc2V0VGFyZ2V0U3RyZWFtZXIoTUNUYXJnZXRTdHJlYW1lciAqVFMpIHsKKyAgICBUYXJnZXRTdHJlYW1lci5yZXNldChUUyk7CisgIH0KKworICAvLy8gU3RhdGUgbWFuYWdlbWVudAorICAvLy8KKyAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisKKyAgTUNDb250ZXh0ICZnZXRDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQ29udGV4dDsgfQorCisgIE1DVGFyZ2V0U3RyZWFtZXIgKmdldFRhcmdldFN0cmVhbWVyKCkgeworICAgIHJldHVybiBUYXJnZXRTdHJlYW1lci5nZXQoKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUZyYW1lSW5mb3MoKSB7IHJldHVybiBEd2FyZkZyYW1lSW5mb3Muc2l6ZSgpOyB9CisgIEFycmF5UmVmPE1DRHdhcmZGcmFtZUluZm8+IGdldER3YXJmRnJhbWVJbmZvcygpIGNvbnN0IHsKKyAgICByZXR1cm4gRHdhcmZGcmFtZUluZm9zOworICB9CisKKyAgYm9vbCBoYXNVbmZpbmlzaGVkRHdhcmZGcmFtZUluZm8oKTsKKworICB1bnNpZ25lZCBnZXROdW1XaW5GcmFtZUluZm9zKCkgeyByZXR1cm4gV2luRnJhbWVJbmZvcy5zaXplKCk7IH0KKyAgQXJyYXlSZWY8c3RkOjp1bmlxdWVfcHRyPFdpbkVIOjpGcmFtZUluZm8+PiBnZXRXaW5GcmFtZUluZm9zKCkgY29uc3QgeworICAgIHJldHVybiBXaW5GcmFtZUluZm9zOworICB9CisKKyAgdm9pZCBnZW5lcmF0ZUNvbXBhY3RVbndpbmRFbmNvZGluZ3MoTUNBc21CYWNrZW5kICpNQUIpOworCisgIC8vLyBcbmFtZSBBc3NlbWJseSBGaWxlIEZvcm1hdHRpbmcuCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBzdHJlYW1lciBzdXBwb3J0cyB2ZXJib3NlIGFzc2VtYmx5IGFuZCBpZiBpdCBpcworICAvLy8gZW5hYmxlZC4KKyAgdmlydHVhbCBib29sIGlzVmVyYm9zZUFzbSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFzbSBzdHJlYW1lciBzdXBwb3J0cyBlbWl0dGluZyB1bmZvcm1hdHRlZCB0ZXh0CisgIC8vLyB0byB0aGUgLnMgZmlsZSB3aXRoIEVtaXRSYXdUZXh0LgorICB2aXJ0dWFsIGJvb2wgaGFzUmF3VGV4dFN1cHBvcnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBcYnJpZWYgSXMgdGhlIGludGVncmF0ZWQgYXNzZW1ibGVyIHJlcXVpcmVkIGZvciB0aGlzIHN0cmVhbWVyIHRvIGZ1bmN0aW9uCisgIC8vLyBjb3JyZWN0bHk/CisgIHZpcnR1YWwgYm9vbCBpc0ludGVncmF0ZWRBc3NlbWJsZXJSZXF1aXJlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFxicmllZiBBZGQgYSB0ZXh0dWFsIGNvbW1lbnQuCisgIC8vLworICAvLy8gVHlwaWNhbGx5IGZvciBjb21tZW50cyB0aGF0IGNhbiBiZSBlbWl0dGVkIHRvIHRoZSBnZW5lcmF0ZWQgLnMKKyAgLy8vIGZpbGUgaWYgYXBwbGljYWJsZSBhcyBhIFFvSSBpc3N1ZSB0byBtYWtlIHRoZSBvdXRwdXQgb2YgdGhlIGNvbXBpbGVyCisgIC8vLyBtb3JlIHJlYWRhYmxlLiAgVGhpcyBvbmx5IGFmZmVjdHMgdGhlIE1DQXNtU3RyZWFtZXIsIGFuZCBvbmx5IHdoZW4KKyAgLy8vIHZlcmJvc2UgYXNzZW1ibHkgb3V0cHV0IGlzIGVuYWJsZWQuCisgIC8vLworICAvLy8gSWYgdGhlIGNvbW1lbnQgaW5jbHVkZXMgZW1iZWRkZWQgXG4ncywgdGhleSB3aWxsIGVhY2ggZ2V0IHRoZSBjb21tZW50CisgIC8vLyBwcmVmaXggYXMgYXBwcm9wcmlhdGUuICBUaGUgYWRkZWQgY29tbWVudCBzaG91bGQgbm90IGVuZCB3aXRoIGEgXG4uCisgIC8vLyBCeSBkZWZhdWx0LCBlYWNoIGNvbW1lbnQgaXMgdGVybWluYXRlZCB3aXRoIGFuIGVuZCBvZiBsaW5lLCBpLmUuIHRoZQorICAvLy8gRU9MIHBhcmFtIGlzIHNldCB0byB0cnVlIGJ5IGRlZmF1bHQuIElmIG9uZSBwcmVmZXJzIG5vdCB0byBlbmQgdGhlIAorICAvLy8gY29tbWVudCB3aXRoIGEgbmV3IGxpbmUgdGhlbiB0aGUgRU9MIHBhcmFtIHNob3VsZCBiZSBwYXNzZWQgCisgIC8vLyB3aXRoIGEgZmFsc2UgdmFsdWUuCisgIHZpcnR1YWwgdm9pZCBBZGRDb21tZW50KGNvbnN0IFR3aW5lICZULCBib29sIEVPTCA9IHRydWUpIHt9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSByYXdfb3N0cmVhbSB0aGF0IGNvbW1lbnRzIGNhbiBiZSB3cml0dGVuIHRvLiBVbmxpa2UKKyAgLy8vIEFkZENvbW1lbnQsIHlvdSBhcmUgcmVxdWlyZWQgdG8gdGVybWluYXRlIGNvbW1lbnRzIHdpdGggXG4gaWYgeW91IHVzZSB0aGlzCisgIC8vLyBtZXRob2QuCisgIHZpcnR1YWwgcmF3X29zdHJlYW0gJkdldENvbW1lbnRPUygpOworCisgIC8vLyBcYnJpZWYgUHJpbnQgVCBhbmQgcHJlZml4IGl0IHdpdGggdGhlIGNvbW1lbnQgc3RyaW5nIChub3JtYWxseSAjKSBhbmQKKyAgLy8vIG9wdGlvbmFsbHkgYSB0YWIuIFRoaXMgcHJpbnRzIHRoZSBjb21tZW50IGltbWVkaWF0ZWx5LCBub3QgYXQgdGhlIGVuZCBvZgorICAvLy8gdGhlIGN1cnJlbnQgbGluZS4gSXQgaXMgYmFzaWNhbGx5IGEgc2FmZSB2ZXJzaW9uIG9mIEVtaXRSYXdUZXh0OiBzaW5jZSBpdAorICAvLy8gb25seSBwcmludHMgY29tbWVudHMsIHRoZSBvYmplY3Qgc3RyZWFtZXIgaWdub3JlcyBpdCBpbnN0ZWFkIG9mIGFzc2VydGluZy4KKyAgdmlydHVhbCB2b2lkIGVtaXRSYXdDb21tZW50KGNvbnN0IFR3aW5lICZULCBib29sIFRhYlByZWZpeCA9IHRydWUpOworCisgIC8vLyBcYnJpZWYgQWRkIGV4cGxpY2l0IGNvbW1lbnQgVC4gVCBpcyByZXF1aXJlZCB0byBiZSBhIHZhbGlkCisgIC8vLyBjb21tZW50IGluIHRoZSBvdXRwdXQgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgZXNjYXBlZC4KKyAgdmlydHVhbCB2b2lkIGFkZEV4cGxpY2l0Q29tbWVudChjb25zdCBUd2luZSAmVCk7CisKKyAgLy8vIFxicmllZiBFbWl0IGFkZGVkIGV4cGxpY2l0IGNvbW1lbnRzLgorICB2aXJ0dWFsIHZvaWQgZW1pdEV4cGxpY2l0Q29tbWVudHMoKTsKKworICAvLy8gQWRkQmxhbmtMaW5lIC0gRW1pdCBhIGJsYW5rIGxpbmUgdG8gYSAucyBmaWxlIHRvIHByZXR0eSBpdCB1cC4KKyAgdmlydHVhbCB2b2lkIEFkZEJsYW5rTGluZSgpIHt9CisKKyAgLy8vIEB9CisKKyAgLy8vIFxuYW1lIFN5bWJvbCAmIFNlY3Rpb24gTWFuYWdlbWVudAorICAvLy8gQHsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgY3VycmVudCBzZWN0aW9uIHRoYXQgdGhlIHN0cmVhbWVyIGlzIGVtaXR0aW5nIGNvZGUgdG8uCisgIE1DU2VjdGlvblN1YlBhaXIgZ2V0Q3VycmVudFNlY3Rpb24oKSBjb25zdCB7CisgICAgaWYgKCFTZWN0aW9uU3RhY2suZW1wdHkoKSkKKyAgICAgIHJldHVybiBTZWN0aW9uU3RhY2suYmFjaygpLmZpcnN0OworICAgIHJldHVybiBNQ1NlY3Rpb25TdWJQYWlyKCk7CisgIH0KKyAgTUNTZWN0aW9uICpnZXRDdXJyZW50U2VjdGlvbk9ubHkoKSBjb25zdCB7IHJldHVybiBnZXRDdXJyZW50U2VjdGlvbigpLmZpcnN0OyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHByZXZpb3VzIHNlY3Rpb24gdGhhdCB0aGUgc3RyZWFtZXIgaXMgZW1pdHRpbmcgY29kZSB0by4KKyAgTUNTZWN0aW9uU3ViUGFpciBnZXRQcmV2aW91c1NlY3Rpb24oKSBjb25zdCB7CisgICAgaWYgKCFTZWN0aW9uU3RhY2suZW1wdHkoKSkKKyAgICAgIHJldHVybiBTZWN0aW9uU3RhY2suYmFjaygpLnNlY29uZDsKKyAgICByZXR1cm4gTUNTZWN0aW9uU3ViUGFpcigpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGFuIGluZGV4IHRvIHJlcHJlc2VudCB0aGUgb3JkZXIgYSBzeW1ib2wgd2FzIGVtaXR0ZWQgaW4uCisgIC8vLyAoemVybyBpZiB3ZSBkaWQgbm90IGVtaXQgdGhhdCBzeW1ib2wpCisgIHVuc2lnbmVkIEdldFN5bWJvbE9yZGVyKGNvbnN0IE1DU3ltYm9sICpTeW0pIGNvbnN0IHsKKyAgICByZXR1cm4gU3ltYm9sT3JkZXJpbmcubG9va3VwKFN5bSk7CisgIH0KKworICAvLy8gXGJyaWVmIFVwZGF0ZSBzdHJlYW1lciBmb3IgYSBuZXcgYWN0aXZlIHNlY3Rpb24uCisgIC8vLworICAvLy8gVGhpcyBpcyBjYWxsZWQgYnkgUG9wU2VjdGlvbiBhbmQgU3dpdGNoU2VjdGlvbiwgaWYgdGhlIGN1cnJlbnQKKyAgLy8vIHNlY3Rpb24gY2hhbmdlcy4KKyAgdmlydHVhbCB2b2lkIENoYW5nZVNlY3Rpb24oTUNTZWN0aW9uICosIGNvbnN0IE1DRXhwciAqKTsKKworICAvLy8gXGJyaWVmIFNhdmUgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHNlY3Rpb24gb24gdGhlIHNlY3Rpb24gc3RhY2suCisgIHZvaWQgUHVzaFNlY3Rpb24oKSB7CisgICAgU2VjdGlvblN0YWNrLnB1c2hfYmFjaygKKyAgICAgICAgc3RkOjptYWtlX3BhaXIoZ2V0Q3VycmVudFNlY3Rpb24oKSwgZ2V0UHJldmlvdXNTZWN0aW9uKCkpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVzdG9yZSB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc2VjdGlvbiBmcm9tIHRoZSBzZWN0aW9uIHN0YWNrLgorICAvLy8gQ2FsbHMgQ2hhbmdlU2VjdGlvbiBhcyBuZWVkZWQuCisgIC8vLworICAvLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUgc3RhY2sgd2FzIGVtcHR5LgorICBib29sIFBvcFNlY3Rpb24oKSB7CisgICAgaWYgKFNlY3Rpb25TdGFjay5zaXplKCkgPD0gMSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBhdXRvIEkgPSBTZWN0aW9uU3RhY2suZW5kKCk7CisgICAgLS1JOworICAgIE1DU2VjdGlvblN1YlBhaXIgT2xkU2VjdGlvbiA9IEktPmZpcnN0OworICAgIC0tSTsKKyAgICBNQ1NlY3Rpb25TdWJQYWlyIE5ld1NlY3Rpb24gPSBJLT5maXJzdDsKKworICAgIGlmIChPbGRTZWN0aW9uICE9IE5ld1NlY3Rpb24pCisgICAgICBDaGFuZ2VTZWN0aW9uKE5ld1NlY3Rpb24uZmlyc3QsIE5ld1NlY3Rpb24uc2Vjb25kKTsKKyAgICBTZWN0aW9uU3RhY2sucG9wX2JhY2soKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgU3ViU2VjdGlvbihjb25zdCBNQ0V4cHIgKlN1YnNlY3Rpb24pIHsKKyAgICBpZiAoU2VjdGlvblN0YWNrLmVtcHR5KCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBTd2l0Y2hTZWN0aW9uKFNlY3Rpb25TdGFjay5iYWNrKCkuZmlyc3QuZmlyc3QsIFN1YnNlY3Rpb24pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFNldCB0aGUgY3VycmVudCBzZWN0aW9uIHdoZXJlIGNvZGUgaXMgYmVpbmcgZW1pdHRlZCB0byBccCBTZWN0aW9uLiAgVGhpcworICAvLy8gaXMgcmVxdWlyZWQgdG8gdXBkYXRlIEN1clNlY3Rpb24uCisgIC8vLworICAvLy8gVGhpcyBjb3JyZXNwb25kcyB0byBhc3NlbWJsZXIgZGlyZWN0aXZlcyBsaWtlIC5zZWN0aW9uLCAudGV4dCwgZXRjLgorICB2aXJ0dWFsIHZvaWQgU3dpdGNoU2VjdGlvbihNQ1NlY3Rpb24gKlNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRXhwciAqU3Vic2VjdGlvbiA9IG51bGxwdHIpOworCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBjdXJyZW50IHNlY3Rpb24gd2hlcmUgY29kZSBpcyBiZWluZyBlbWl0dGVkIHRvIFxwIFNlY3Rpb24uCisgIC8vLyBUaGlzIGlzIHJlcXVpcmVkIHRvIHVwZGF0ZSBDdXJTZWN0aW9uLiBUaGlzIHZlcnNpb24gZG9lcyBub3QgY2FsbAorICAvLy8gQ2hhbmdlU2VjdGlvbi4KKyAgdm9pZCBTd2l0Y2hTZWN0aW9uTm9DaGFuZ2UoTUNTZWN0aW9uICpTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0V4cHIgKlN1YnNlY3Rpb24gPSBudWxscHRyKSB7CisgICAgYXNzZXJ0KFNlY3Rpb24gJiYgIkNhbm5vdCBzd2l0Y2ggdG8gYSBudWxsIHNlY3Rpb24hIik7CisgICAgTUNTZWN0aW9uU3ViUGFpciBjdXJTZWN0aW9uID0gU2VjdGlvblN0YWNrLmJhY2soKS5maXJzdDsKKyAgICBTZWN0aW9uU3RhY2suYmFjaygpLnNlY29uZCA9IGN1clNlY3Rpb247CisgICAgaWYgKE1DU2VjdGlvblN1YlBhaXIoU2VjdGlvbiwgU3Vic2VjdGlvbikgIT0gY3VyU2VjdGlvbikKKyAgICAgIFNlY3Rpb25TdGFjay5iYWNrKCkuZmlyc3QgPSBNQ1NlY3Rpb25TdWJQYWlyKFNlY3Rpb24sIFN1YnNlY3Rpb24pOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgdGhlIGRlZmF1bHQgc2VjdGlvbnMgYW5kIHNldCB0aGUgaW5pdGlhbCBvbmUuCisgIHZpcnR1YWwgdm9pZCBJbml0U2VjdGlvbnMoYm9vbCBOb0V4ZWNTdGFjayk7CisKKyAgTUNTeW1ib2wgKmVuZFNlY3Rpb24oTUNTZWN0aW9uICpTZWN0aW9uKTsKKworICAvLy8gXGJyaWVmIFNldHMgdGhlIHN5bWJvbCdzIHNlY3Rpb24uCisgIC8vLworICAvLy8gRWFjaCBlbWl0dGVkIHN5bWJvbCB3aWxsIGJlIHRyYWNrZWQgaW4gdGhlIG9yZGVyaW5nIHRhYmxlLAorICAvLy8gc28gd2UgY2FuIHNvcnQgb24gdGhlbSBsYXRlci4KKyAgdm9pZCBBc3NpZ25GcmFnbWVudChNQ1N5bWJvbCAqU3ltYm9sLCBNQ0ZyYWdtZW50ICpGcmFnbWVudCk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgbGFiZWwgZm9yIFxwIFN5bWJvbCBpbnRvIHRoZSBjdXJyZW50IHNlY3Rpb24uCisgIC8vLworICAvLy8gVGhpcyBjb3JyZXNwb25kcyB0byBhbiBhc3NlbWJsZXIgc3RhdGVtZW50IHN1Y2ggYXM6CisgIC8vLyAgIGZvbzoKKyAgLy8vCisgIC8vLyBccGFyYW0gU3ltYm9sIC0gVGhlIHN5bWJvbCB0byBlbWl0LiBBIGdpdmVuIHN5bWJvbCBzaG91bGQgb25seSBiZQorICAvLy8gZW1pdHRlZCBhcyBhIGxhYmVsIG9uY2UsIGFuZCBzeW1ib2xzIGVtaXR0ZWQgYXMgYSBsYWJlbCBzaG91bGQgbmV2ZXIgYmUKKyAgLy8vIHVzZWQgaW4gYW4gYXNzaWdubWVudC4KKyAgLy8gRklYTUU6IFRoZXNlIGVtaXNzaW9uIGFyZSBub24tY29uc3QgYmVjYXVzZSB3ZSBtdXRhdGUgdGhlIHN5bWJvbCB0bworICAvLyBhZGQgdGhlIHNlY3Rpb24gd2UncmUgZW1pdHRpbmcgaXQgdG8gbGF0ZXIuCisgIHZpcnR1YWwgdm9pZCBFbWl0TGFiZWwoTUNTeW1ib2wgKlN5bWJvbCwgU01Mb2MgTG9jID0gU01Mb2MoKSk7CisKKyAgdmlydHVhbCB2b2lkIEVtaXRFSFN5bUF0dHJpYnV0ZXMoY29uc3QgTUNTeW1ib2wgKlN5bWJvbCwgTUNTeW1ib2wgKkVIU3ltYm9sKTsKKworICAvLy8gXGJyaWVmIE5vdGUgaW4gdGhlIG91dHB1dCB0aGUgc3BlY2lmaWVkIFxwIEZsYWcuCisgIHZpcnR1YWwgdm9pZCBFbWl0QXNzZW1ibGVyRmxhZyhNQ0Fzc2VtYmxlckZsYWcgRmxhZyk7CisKKyAgLy8vIFxicmllZiBFbWl0IHRoZSBnaXZlbiBsaXN0IFxwIE9wdGlvbnMgb2Ygc3RyaW5ncyBhcyBsaW5rZXIKKyAgLy8vIG9wdGlvbnMgaW50byB0aGUgb3V0cHV0LgorICB2aXJ0dWFsIHZvaWQgRW1pdExpbmtlck9wdGlvbnMoQXJyYXlSZWY8c3RkOjpzdHJpbmc+IEtpbmQpIHt9CisKKyAgLy8vIFxicmllZiBOb3RlIGluIHRoZSBvdXRwdXQgdGhlIHNwZWNpZmllZCByZWdpb24gXHAgS2luZC4KKyAgdmlydHVhbCB2b2lkIEVtaXREYXRhUmVnaW9uKE1DRGF0YVJlZ2lvblR5cGUgS2luZCkge30KKworICAvLy8gXGJyaWVmIFNwZWNpZnkgdGhlIE1hY2gtTyBtaW5pbXVtIGRlcGxveW1lbnQgdGFyZ2V0IHZlcnNpb24uCisgIHZpcnR1YWwgdm9pZCBFbWl0VmVyc2lvbk1pbihNQ1ZlcnNpb25NaW5UeXBlIFR5cGUsIHVuc2lnbmVkIE1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWlub3IsIHVuc2lnbmVkIFVwZGF0ZSkge30KKworICAvLy8gRW1pdC9TcGVjaWZ5IE1hY2gtTyBidWlsZCB2ZXJzaW9uIGNvbW1hbmQuCisgIC8vLyBccCBQbGF0Zm9ybSBzaG91bGQgYmUgb25lIG9mIE1hY2hPOjpQbGF0Zm9ybVR5cGUuCisgIHZpcnR1YWwgdm9pZCBFbWl0QnVpbGRWZXJzaW9uKHVuc2lnbmVkIFBsYXRmb3JtLCB1bnNpZ25lZCBNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWlub3IsIHVuc2lnbmVkIFVwZGF0ZSkge30KKworICB2b2lkIEVtaXRWZXJzaW9uRm9yVGFyZ2V0KGNvbnN0IFRyaXBsZSAmVGFyZ2V0KTsKKworICAvLy8gXGJyaWVmIE5vdGUgaW4gdGhlIG91dHB1dCB0aGF0IHRoZSBzcGVjaWZpZWQgXHAgRnVuYyBpcyBhIFRodW1iIG1vZGUKKyAgLy8vIGZ1bmN0aW9uIChBUk0gdGFyZ2V0IG9ubHkpLgorICB2aXJ0dWFsIHZvaWQgRW1pdFRodW1iRnVuYyhNQ1N5bWJvbCAqRnVuYyk7CisKKyAgLy8vIFxicmllZiBFbWl0IGFuIGFzc2lnbm1lbnQgb2YgXHAgVmFsdWUgdG8gXHAgU3ltYm9sLgorICAvLy8KKyAgLy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gYW4gYXNzZW1ibGVyIHN0YXRlbWVudCBzdWNoIGFzOgorICAvLy8gIHN5bWJvbCA9IHZhbHVlCisgIC8vLworICAvLy8gVGhlIGFzc2lnbm1lbnQgZ2VuZXJhdGVzIG5vIGNvZGUsIGJ1dCBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGJpbmRpbmcgdGhlCisgIC8vLyB2YWx1ZSBpbiB0aGUgY3VycmVudCBjb250ZXh0LiBGb3IgdGhlIGFzc2VtYmx5IHN0cmVhbWVyLCB0aGlzIHByaW50cyB0aGUKKyAgLy8vIGJpbmRpbmcgaW50byB0aGUgLnMgZmlsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3ltYm9sIC0gVGhlIHN5bWJvbCBiZWluZyBhc3NpZ25lZCB0by4KKyAgLy8vIFxwYXJhbSBWYWx1ZSAtIFRoZSB2YWx1ZSBmb3IgdGhlIHN5bWJvbC4KKyAgdmlydHVhbCB2b2lkIEVtaXRBc3NpZ25tZW50KE1DU3ltYm9sICpTeW1ib2wsIGNvbnN0IE1DRXhwciAqVmFsdWUpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhbiB3ZWFrIHJlZmVyZW5jZSBmcm9tIFxwIEFsaWFzIHRvIFxwIFN5bWJvbC4KKyAgLy8vCisgIC8vLyBUaGlzIGNvcnJlc3BvbmRzIHRvIGFuIGFzc2VtYmxlciBzdGF0ZW1lbnQgc3VjaCBhczoKKyAgLy8vICAud2Vha3JlZiBhbGlhcywgc3ltYm9sCisgIC8vLworICAvLy8gXHBhcmFtIEFsaWFzIC0gVGhlIGFsaWFzIHRoYXQgaXMgYmVpbmcgY3JlYXRlZC4KKyAgLy8vIFxwYXJhbSBTeW1ib2wgLSBUaGUgc3ltYm9sIGJlaW5nIGFsaWFzZWQuCisgIHZpcnR1YWwgdm9pZCBFbWl0V2Vha1JlZmVyZW5jZShNQ1N5bWJvbCAqQWxpYXMsIGNvbnN0IE1DU3ltYm9sICpTeW1ib2wpOworCisgIC8vLyBcYnJpZWYgQWRkIHRoZSBnaXZlbiBccCBBdHRyaWJ1dGUgdG8gXHAgU3ltYm9sLgorICB2aXJ0dWFsIGJvb2wgRW1pdFN5bWJvbEF0dHJpYnV0ZShNQ1N5bWJvbCAqU3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1N5bWJvbEF0dHIgQXR0cmlidXRlKSA9IDA7CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIFxwIERlc2NWYWx1ZSBmb3IgdGhlIFxwIFN5bWJvbC4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3ltYm9sIC0gVGhlIHN5bWJvbCB0byBoYXZlIGl0cyBuX2Rlc2MgZmllbGQgc2V0LgorICAvLy8gXHBhcmFtIERlc2NWYWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQgaW50byB0aGUgbl9kZXNjIGZpZWxkLgorICB2aXJ0dWFsIHZvaWQgRW1pdFN5bWJvbERlc2MoTUNTeW1ib2wgKlN5bWJvbCwgdW5zaWduZWQgRGVzY1ZhbHVlKTsKKworICAvLy8gXGJyaWVmIFN0YXJ0IGVtaXR0aW5nIENPRkYgc3ltYm9sIGRlZmluaXRpb24KKyAgLy8vCisgIC8vLyBccGFyYW0gU3ltYm9sIC0gVGhlIHN5bWJvbCB0byBoYXZlIGl0cyBFeHRlcm5hbCAmIFR5cGUgZmllbGRzIHNldC4KKyAgdmlydHVhbCB2b2lkIEJlZ2luQ09GRlN5bWJvbERlZihjb25zdCBNQ1N5bWJvbCAqU3ltYm9sKTsKKworICAvLy8gXGJyaWVmIEVtaXQgdGhlIHN0b3JhZ2UgY2xhc3Mgb2YgdGhlIHN5bWJvbC4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RvcmFnZUNsYXNzIC0gVGhlIHN0b3JhZ2UgY2xhc3MgdGhlIHN5bWJvbCBzaG91bGQgaGF2ZS4KKyAgdmlydHVhbCB2b2lkIEVtaXRDT0ZGU3ltYm9sU3RvcmFnZUNsYXNzKGludCBTdG9yYWdlQ2xhc3MpOworCisgIC8vLyBcYnJpZWYgRW1pdCB0aGUgdHlwZSBvZiB0aGUgc3ltYm9sLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUeXBlIC0gQSBDT0ZGIHR5cGUgaWRlbnRpZmllciAoc2VlIENPRkY6OlN5bWJvbFR5cGUgaW4gWDg2Q09GRi5oKQorICB2aXJ0dWFsIHZvaWQgRW1pdENPRkZTeW1ib2xUeXBlKGludCBUeXBlKTsKKworICAvLy8gXGJyaWVmIE1hcmtzIHRoZSBlbmQgb2YgdGhlIHN5bWJvbCBkZWZpbml0aW9uLgorICB2aXJ0dWFsIHZvaWQgRW5kQ09GRlN5bWJvbERlZigpOworCisgIHZpcnR1YWwgdm9pZCBFbWl0Q09GRlNhZmVTRUgoTUNTeW1ib2wgY29uc3QgKlN5bWJvbCk7CisKKyAgLy8vIFxicmllZiBFbWl0cyB0aGUgc3ltYm9sIHRhYmxlIGluZGV4IG9mIGEgU3ltYm9sIGludG8gdGhlIGN1cnJlbnQgc2VjdGlvbi4KKyAgdmlydHVhbCB2b2lkIEVtaXRDT0ZGU3ltYm9sSW5kZXgoTUNTeW1ib2wgY29uc3QgKlN5bWJvbCk7CisKKyAgLy8vIFxicmllZiBFbWl0cyBhIENPRkYgc2VjdGlvbiBpbmRleC4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3ltYm9sIC0gU3ltYm9sIHRoZSBzZWN0aW9uIG51bWJlciByZWxvY2F0aW9uIHNob3VsZCBwb2ludCB0by4KKyAgdmlydHVhbCB2b2lkIEVtaXRDT0ZGU2VjdGlvbkluZGV4KE1DU3ltYm9sIGNvbnN0ICpTeW1ib2wpOworCisgIC8vLyBcYnJpZWYgRW1pdHMgYSBDT0ZGIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3ltYm9sIC0gU3ltYm9sIHRoZSBzZWN0aW9uIHJlbGF0aXZlIHJlbG9jYXRpb24gc2hvdWxkIHBvaW50IHRvLgorICB2aXJ0dWFsIHZvaWQgRW1pdENPRkZTZWNSZWwzMihNQ1N5bWJvbCBjb25zdCAqU3ltYm9sLCB1aW50NjRfdCBPZmZzZXQpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhbiBFTEYgLnNpemUgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gYW4gYXNzZW1ibGVyIHN0YXRlbWVudCBzdWNoIGFzOgorICAvLy8gIC5zaXplIHN5bWJvbCwgZXhwcmVzc2lvbgorICB2aXJ0dWFsIHZvaWQgZW1pdEVMRlNpemUoTUNTeW1ib2wgKlN5bWJvbCwgY29uc3QgTUNFeHByICpWYWx1ZSk7CisKKyAgLy8vIFxicmllZiBFbWl0IGFuIEVMRiAuc3ltdmVyIGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBUaGlzIGNvcnJlc3BvbmRzIHRvIGFuIGFzc2VtYmxlciBzdGF0ZW1lbnQgc3VjaCBhczoKKyAgLy8vICAuc3ltdmVyIF9zdGFydCwgZm9vQEBTT01FX1ZFUlNJT04KKyAgLy8vIFxwYXJhbSBBbGlhc05hbWUgLSBUaGUgdmVyc2lvbmVkIGFsaWFzIChpLmUuICJmb29AQFNPTUVfVkVSU0lPTiIpCisgIC8vLyBccGFyYW0gQWxpYXNlZSAtIFRoZSBhbGlhc2VkIHN5bWJvbCAoaS5lLiAiX3N0YXJ0IikKKyAgdmlydHVhbCB2b2lkIGVtaXRFTEZTeW12ZXJEaXJlY3RpdmUoU3RyaW5nUmVmIEFsaWFzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKkFsaWFzZWUpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIExpbmtlciBPcHRpbWl6YXRpb24gSGludCAoTE9IKSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQXJncyAtIEFyZ3VtZW50cyBvZiB0aGUgTE9ILgorICB2aXJ0dWFsIHZvaWQgRW1pdExPSERpcmVjdGl2ZShNQ0xPSFR5cGUgS2luZCwgY29uc3QgTUNMT0hBcmdzICZBcmdzKSB7fQorCisgIC8vLyBcYnJpZWYgRW1pdCBhIGNvbW1vbiBzeW1ib2wuCisgIC8vLworICAvLy8gXHBhcmFtIFN5bWJvbCAtIFRoZSBjb21tb24gc3ltYm9sIHRvIGVtaXQuCisgIC8vLyBccGFyYW0gU2l6ZSAtIFRoZSBzaXplIG9mIHRoZSBjb21tb24gc3ltYm9sLgorICAvLy8gXHBhcmFtIEJ5dGVBbGlnbm1lbnQgLSBUaGUgYWxpZ25tZW50IG9mIHRoZSBzeW1ib2wgaWYKKyAgLy8vIG5vbi16ZXJvLiBUaGlzIG11c3QgYmUgYSBwb3dlciBvZiAyLgorICB2aXJ0dWFsIHZvaWQgRW1pdENvbW1vblN5bWJvbChNQ1N5bWJvbCAqU3ltYm9sLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlQWxpZ25tZW50KSA9IDA7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgbG9jYWwgY29tbW9uICgubGNvbW0pIHN5bWJvbC4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3ltYm9sIC0gVGhlIGNvbW1vbiBzeW1ib2wgdG8gZW1pdC4KKyAgLy8vIFxwYXJhbSBTaXplIC0gVGhlIHNpemUgb2YgdGhlIGNvbW1vbiBzeW1ib2wuCisgIC8vLyBccGFyYW0gQnl0ZUFsaWdubWVudCAtIFRoZSBhbGlnbm1lbnQgb2YgdGhlIGNvbW1vbiBzeW1ib2wgaW4gYnl0ZXMuCisgIHZpcnR1YWwgdm9pZCBFbWl0TG9jYWxDb21tb25TeW1ib2woTUNTeW1ib2wgKlN5bWJvbCwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlQWxpZ25tZW50KTsKKworICAvLy8gXGJyaWVmIEVtaXQgdGhlIHplcm9maWxsIHNlY3Rpb24gYW5kIGFuIG9wdGlvbmFsIHN5bWJvbC4KKyAgLy8vCisgIC8vLyBccGFyYW0gU2VjdGlvbiAtIFRoZSB6ZXJvZmlsbCBzZWN0aW9uIHRvIGNyZWF0ZSBhbmQgb3IgdG8gcHV0IHRoZSBzeW1ib2wKKyAgLy8vIFxwYXJhbSBTeW1ib2wgLSBUaGUgemVyb2ZpbGwgc3ltYm9sIHRvIGVtaXQsIGlmIG5vbi1OVUxMLgorICAvLy8gXHBhcmFtIFNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgemVyb2ZpbGwgc3ltYm9sLgorICAvLy8gXHBhcmFtIEJ5dGVBbGlnbm1lbnQgLSBUaGUgYWxpZ25tZW50IG9mIHRoZSB6ZXJvZmlsbCBzeW1ib2wgaWYKKyAgLy8vIG5vbi16ZXJvLiBUaGlzIG11c3QgYmUgYSBwb3dlciBvZiAyIG9uIHNvbWUgdGFyZ2V0cy4KKyAgdmlydHVhbCB2b2lkIEVtaXRaZXJvZmlsbChNQ1NlY3Rpb24gKlNlY3Rpb24sIE1DU3ltYm9sICpTeW1ib2wgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUgPSAwLCB1bnNpZ25lZCBCeXRlQWxpZ25tZW50ID0gMCkgPSAwOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIHRocmVhZCBsb2NhbCBic3MgKC50YnNzKSBzeW1ib2wuCisgIC8vLworICAvLy8gXHBhcmFtIFNlY3Rpb24gLSBUaGUgdGhyZWFkIGxvY2FsIGNvbW1vbiBzZWN0aW9uLgorICAvLy8gXHBhcmFtIFN5bWJvbCAtIFRoZSB0aHJlYWQgbG9jYWwgY29tbW9uIHN5bWJvbCB0byBlbWl0LgorICAvLy8gXHBhcmFtIFNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sLgorICAvLy8gXHBhcmFtIEJ5dGVBbGlnbm1lbnQgLSBUaGUgYWxpZ25tZW50IG9mIHRoZSB0aHJlYWQgbG9jYWwgY29tbW9uIHN5bWJvbAorICAvLy8gaWYgbm9uLXplcm8uICBUaGlzIG11c3QgYmUgYSBwb3dlciBvZiAyIG9uIHNvbWUgdGFyZ2V0cy4KKyAgdmlydHVhbCB2b2lkIEVtaXRUQlNTU3ltYm9sKE1DU2VjdGlvbiAqU2VjdGlvbiwgTUNTeW1ib2wgKlN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUsIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQgPSAwKTsKKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIEdlbmVyYXRpbmcgRGF0YQorICAvLy8gQHsKKworICAvLy8gXGJyaWVmIEVtaXQgdGhlIGJ5dGVzIGluIFxwIERhdGEgaW50byB0aGUgb3V0cHV0LgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgc3VjaCBhcyAuYnl0ZSwgLmFzY2lpLAorICAvLy8gZXRjLgorICB2aXJ0dWFsIHZvaWQgRW1pdEJ5dGVzKFN0cmluZ1JlZiBEYXRhKTsKKworICAvLy8gRnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0byBFbWl0Qnl0ZXMuIFdoZW4gZW1pdHRpbmcgdGV4dHVhbCBhc3NlbWJseSwgdGhpcworICAvLy8gbWV0aG9kIHVzZXMgLmJ5dGUgZGlyZWN0aXZlcyBpbnN0ZWFkIG9mIC5hc2NpaSBvciAuYXNjaXogZm9yIHJlYWRhYmlsaXR5LgorICB2aXJ0dWFsIHZvaWQgRW1pdEJpbmFyeURhdGEoU3RyaW5nUmVmIERhdGEpOworCisgIC8vLyBcYnJpZWYgRW1pdCB0aGUgZXhwcmVzc2lvbiBccCBWYWx1ZSBpbnRvIHRoZSBvdXRwdXQgYXMgYSBuYXRpdmUKKyAgLy8vIGludGVnZXIgb2YgdGhlIGdpdmVuIFxwIFNpemUgYnl0ZXMuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCBhc3NlbWJsZXIgZGlyZWN0aXZlcyBzdWNoIGFzIC53b3JkLCAucXVhZCwKKyAgLy8vIGV0Yy4KKyAgLy8vCisgIC8vLyBccGFyYW0gVmFsdWUgLSBUaGUgdmFsdWUgdG8gZW1pdC4KKyAgLy8vIFxwYXJhbSBTaXplIC0gVGhlIHNpemUgb2YgdGhlIGludGVnZXIgKGluIGJ5dGVzKSB0byBlbWl0LiBUaGlzIG11c3QKKyAgLy8vIG1hdGNoIGEgbmF0aXZlIG1hY2hpbmUgd2lkdGguCisgIC8vLyBccGFyYW0gTG9jIC0gVGhlIGxvY2F0aW9uIG9mIHRoZSBleHByZXNzaW9uIGZvciBlcnJvciByZXBvcnRpbmcuCisgIHZpcnR1YWwgdm9pZCBFbWl0VmFsdWVJbXBsKGNvbnN0IE1DRXhwciAqVmFsdWUsIHVuc2lnbmVkIFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jIExvYyA9IFNNTG9jKCkpOworCisgIHZvaWQgRW1pdFZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUsIHVuc2lnbmVkIFNpemUsIFNNTG9jIExvYyA9IFNNTG9jKCkpOworCisgIC8vLyBcYnJpZWYgU3BlY2lhbCBjYXNlIG9mIEVtaXRWYWx1ZSB0aGF0IGF2b2lkcyB0aGUgY2xpZW50IGhhdmluZworICAvLy8gdG8gcGFzcyBpbiBhIE1DRXhwciBmb3IgY29uc3RhbnQgaW50ZWdlcnMuCisgIHZpcnR1YWwgdm9pZCBFbWl0SW50VmFsdWUodWludDY0X3QgVmFsdWUsIHVuc2lnbmVkIFNpemUpOworCisgIHZpcnR1YWwgdm9pZCBFbWl0VUxFQjEyOFZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUpOworCisgIHZpcnR1YWwgdm9pZCBFbWl0U0xFQjEyOFZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUpOworCisgIC8vLyBcYnJpZWYgU3BlY2lhbCBjYXNlIG9mIEVtaXRVTEVCMTI4VmFsdWUgdGhhdCBhdm9pZHMgdGhlIGNsaWVudCBoYXZpbmcgdG8KKyAgLy8vIHBhc3MgaW4gYSBNQ0V4cHIgZm9yIGNvbnN0YW50IGludGVnZXJzLgorICB2b2lkIEVtaXRVTEVCMTI4SW50VmFsdWUodWludDY0X3QgVmFsdWUpOworCisgIC8vLyBcYnJpZWYgU3BlY2lhbCBjYXNlIG9mIEVtaXRTTEVCMTI4VmFsdWUgdGhhdCBhdm9pZHMgdGhlIGNsaWVudCBoYXZpbmcgdG8KKyAgLy8vIHBhc3MgaW4gYSBNQ0V4cHIgZm9yIGNvbnN0YW50IGludGVnZXJzLgorICB2b2lkIEVtaXRTTEVCMTI4SW50VmFsdWUoaW50NjRfdCBWYWx1ZSk7CisKKyAgLy8vIFxicmllZiBTcGVjaWFsIGNhc2Ugb2YgRW1pdFZhbHVlIHRoYXQgYXZvaWRzIHRoZSBjbGllbnQgaGF2aW5nIHRvIHBhc3MgaW4KKyAgLy8vIGEgTUNFeHByIGZvciBNQ1N5bWJvbHMuCisgIHZvaWQgRW1pdFN5bWJvbFZhbHVlKGNvbnN0IE1DU3ltYm9sICpTeW0sIHVuc2lnbmVkIFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNTZWN0aW9uUmVsYXRpdmUgPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBFbWl0IHRoZSBleHByZXNzaW9uIFxwIFZhbHVlIGludG8gdGhlIG91dHB1dCBhcyBhIGR0cHJlbAorICAvLy8gKDY0LWJpdCBEVFAgcmVsYXRpdmUpIHZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgc3VjaCBhcyAuZHRwcmVsZHdvcmQgb24KKyAgLy8vIHRhcmdldHMgdGhhdCBzdXBwb3J0IHRoZW0uCisgIHZpcnR1YWwgdm9pZCBFbWl0RFRQUmVsNjRWYWx1ZShjb25zdCBNQ0V4cHIgKlZhbHVlKTsKKworICAvLy8gXGJyaWVmIEVtaXQgdGhlIGV4cHJlc3Npb24gXHAgVmFsdWUgaW50byB0aGUgb3V0cHV0IGFzIGEgZHRwcmVsCisgIC8vLyAoMzItYml0IERUUCByZWxhdGl2ZSkgdmFsdWUuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCBhc3NlbWJsZXIgZGlyZWN0aXZlcyBzdWNoIGFzIC5kdHByZWx3b3JkIG9uCisgIC8vLyB0YXJnZXRzIHRoYXQgc3VwcG9ydCB0aGVtLgorICB2aXJ0dWFsIHZvaWQgRW1pdERUUFJlbDMyVmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSk7CisKKyAgLy8vIFxicmllZiBFbWl0IHRoZSBleHByZXNzaW9uIFxwIFZhbHVlIGludG8gdGhlIG91dHB1dCBhcyBhIHRwcmVsCisgIC8vLyAoNjQtYml0IFRQIHJlbGF0aXZlKSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IGFzc2VtYmxlciBkaXJlY3RpdmVzIHN1Y2ggYXMgLnRwcmVsZHdvcmQgb24KKyAgLy8vIHRhcmdldHMgdGhhdCBzdXBwb3J0IHRoZW0uCisgIHZpcnR1YWwgdm9pZCBFbWl0VFBSZWw2NFZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUpOworCisgIC8vLyBcYnJpZWYgRW1pdCB0aGUgZXhwcmVzc2lvbiBccCBWYWx1ZSBpbnRvIHRoZSBvdXRwdXQgYXMgYSB0cHJlbAorICAvLy8gKDMyLWJpdCBUUCByZWxhdGl2ZSkgdmFsdWUuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCBhc3NlbWJsZXIgZGlyZWN0aXZlcyBzdWNoIGFzIC50cHJlbHdvcmQgb24KKyAgLy8vIHRhcmdldHMgdGhhdCBzdXBwb3J0IHRoZW0uCisgIHZpcnR1YWwgdm9pZCBFbWl0VFBSZWwzMlZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUpOworCisgIC8vLyBcYnJpZWYgRW1pdCB0aGUgZXhwcmVzc2lvbiBccCBWYWx1ZSBpbnRvIHRoZSBvdXRwdXQgYXMgYSBncHJlbDY0ICg2NC1iaXQKKyAgLy8vIEdQIHJlbGF0aXZlKSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IGFzc2VtYmxlciBkaXJlY3RpdmVzIHN1Y2ggYXMgLmdwZHdvcmQgb24KKyAgLy8vIHRhcmdldHMgdGhhdCBzdXBwb3J0IHRoZW0uCisgIHZpcnR1YWwgdm9pZCBFbWl0R1BSZWw2NFZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUpOworCisgIC8vLyBcYnJpZWYgRW1pdCB0aGUgZXhwcmVzc2lvbiBccCBWYWx1ZSBpbnRvIHRoZSBvdXRwdXQgYXMgYSBncHJlbDMyICgzMi1iaXQKKyAgLy8vIEdQIHJlbGF0aXZlKSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IGFzc2VtYmxlciBkaXJlY3RpdmVzIHN1Y2ggYXMgLmdwcmVsMzIgb24KKyAgLy8vIHRhcmdldHMgdGhhdCBzdXBwb3J0IHRoZW0uCisgIHZpcnR1YWwgdm9pZCBFbWl0R1BSZWwzMlZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUpOworCisgIC8vLyBcYnJpZWYgRW1pdCBOdW1CeXRlcyBieXRlcyB3b3J0aCBvZiB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IEZpbGxWYWx1ZS4KKyAgLy8vIFRoaXMgaW1wbGVtZW50cyBkaXJlY3RpdmVzIHN1Y2ggYXMgJy5zcGFjZScuCisgIHZvaWQgZW1pdEZpbGwodWludDY0X3QgTnVtQnl0ZXMsIHVpbnQ4X3QgRmlsbFZhbHVlKTsKKworICAvLy8gXGJyaWVmIEVtaXQgXHAgU2l6ZSBieXRlcyB3b3J0aCBvZiB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IFxwIEZpbGxWYWx1ZS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IGFzc2VtYmxlciBkaXJlY3RpdmVzIHN1Y2ggYXMgLnNwYWNlIG9yIC5za2lwLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOdW1CeXRlcyAtIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZW1pdC4KKyAgLy8vIFxwYXJhbSBGaWxsVmFsdWUgLSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gZmlsbGluZyBieXRlcy4KKyAgLy8vIFxwYXJhbSBMb2MgLSBUaGUgbG9jYXRpb24gb2YgdGhlIGV4cHJlc3Npb24gZm9yIGVycm9yIHJlcG9ydGluZy4KKyAgdmlydHVhbCB2b2lkIGVtaXRGaWxsKGNvbnN0IE1DRXhwciAmTnVtQnl0ZXMsIHVpbnQ2NF90IEZpbGxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jIExvYyA9IFNNTG9jKCkpOworCisgIC8vLyBcYnJpZWYgRW1pdCBccCBOdW1WYWx1ZXMgY29waWVzIG9mIFxwIFNpemUgYnl0ZXMuIEVhY2ggXHAgU2l6ZSBieXRlcyBpcworICAvLy8gdGFrZW4gZnJvbSB0aGUgbG93ZXN0IG9yZGVyIDQgYnl0ZXMgb2YgXHAgRXhwciBleHByZXNzaW9uLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgc3VjaCBhcyAuZmlsbC4KKyAgLy8vCisgIC8vLyBccGFyYW0gTnVtVmFsdWVzIC0gVGhlIG51bWJlciBvZiBjb3BpZXMgb2YgXHAgU2l6ZSBieXRlcyB0byBlbWl0LgorICAvLy8gXHBhcmFtIFNpemUgLSBUaGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIGVhY2ggcmVwZWF0ZWQgdmFsdWUuCisgIC8vLyBccGFyYW0gRXhwciAtIFRoZSBleHByZXNzaW9uIGZyb20gd2hpY2ggXHAgU2l6ZSBieXRlcyBhcmUgdXNlZC4KKyAgdmlydHVhbCB2b2lkIGVtaXRGaWxsKGNvbnN0IE1DRXhwciAmTnVtVmFsdWVzLCBpbnQ2NF90IFNpemUsIGludDY0X3QgRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jIExvYyA9IFNNTG9jKCkpOworCisgIC8vLyBcYnJpZWYgRW1pdCBOdW1CeXRlcyB3b3J0aCBvZiB6ZXJvcy4KKyAgLy8vIFRoaXMgZnVuY3Rpb24gcHJvcGVybHkgaGFuZGxlcyBkYXRhIGluIHZpcnR1YWwgc2VjdGlvbnMuCisgIHZvaWQgRW1pdFplcm9zKHVpbnQ2NF90IE51bUJ5dGVzKTsKKworICAvLy8gXGJyaWVmIEVtaXQgc29tZSBudW1iZXIgb2YgY29waWVzIG9mIFxwIFZhbHVlIHVudGlsIHRoZSBieXRlIGFsaWdubWVudCBccAorICAvLy8gQnl0ZUFsaWdubWVudCBpcyByZWFjaGVkLgorICAvLy8KKyAgLy8vIElmIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZCB0byBlbWl0IGZvciB0aGUgYWxpZ25tZW50IGlzIG5vdCBhIG11bHRpcGxlCisgIC8vLyBvZiBccCBWYWx1ZVNpemUsIHRoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBlbWl0dGVkIGZpbGwgYnl0ZXMgaXMKKyAgLy8vIHVuZGVmaW5lZC4KKyAgLy8vCisgIC8vLyBUaGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSAuYWxpZ24gYXNzZW1ibGVyIGRpcmVjdGl2ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQnl0ZUFsaWdubWVudCAtIFRoZSBhbGlnbm1lbnQgdG8gcmVhY2guIFRoaXMgbXVzdCBiZSBhIHBvd2VyIG9mCisgIC8vLyB0d28gb24gc29tZSB0YXJnZXRzLgorICAvLy8gXHBhcmFtIFZhbHVlIC0gVGhlIHZhbHVlIHRvIHVzZSB3aGVuIGZpbGxpbmcgYnl0ZXMuCisgIC8vLyBccGFyYW0gVmFsdWVTaXplIC0gVGhlIHNpemUgb2YgdGhlIGludGVnZXIgKGluIGJ5dGVzKSB0byBlbWl0IGZvcgorICAvLy8gXHAgVmFsdWUuIFRoaXMgbXVzdCBtYXRjaCBhIG5hdGl2ZSBtYWNoaW5lIHdpZHRoLgorICAvLy8gXHBhcmFtIE1heEJ5dGVzVG9FbWl0IC0gVGhlIG1heGltdW0gbnVtYmVycyBvZiBieXRlcyB0byBlbWl0LCBvciAwLiBJZgorICAvLy8gdGhlIGFsaWdubWVudCBjYW5ub3QgYmUgcmVhY2hlZCBpbiB0aGlzIG1hbnkgYnl0ZXMsIG5vIGJ5dGVzIGFyZQorICAvLy8gZW1pdHRlZC4KKyAgdmlydHVhbCB2b2lkIEVtaXRWYWx1ZVRvQWxpZ25tZW50KHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQsIGludDY0X3QgVmFsdWUgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmFsdWVTaXplID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heEJ5dGVzVG9FbWl0ID0gMCk7CisKKyAgLy8vIFxicmllZiBFbWl0IG5vcHMgdW50aWwgdGhlIGJ5dGUgYWxpZ25tZW50IFxwIEJ5dGVBbGlnbm1lbnQgaXMgcmVhY2hlZC4KKyAgLy8vCisgIC8vLyBUaGlzIHVzZWQgdG8gYWxpZ24gY29kZSB3aGVyZSB0aGUgYWxpZ25tZW50IGJ5dGVzIG1heSBiZSBleGVjdXRlZC4gIFRoaXMKKyAgLy8vIGNhbiBlbWl0IGRpZmZlcmVudCBieXRlcyBmb3IgZGlmZmVyZW50IHNpemVzIHRvIG9wdGltaXplIGV4ZWN1dGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gQnl0ZUFsaWdubWVudCAtIFRoZSBhbGlnbm1lbnQgdG8gcmVhY2guIFRoaXMgbXVzdCBiZSBhIHBvd2VyIG9mCisgIC8vLyB0d28gb24gc29tZSB0YXJnZXRzLgorICAvLy8gXHBhcmFtIE1heEJ5dGVzVG9FbWl0IC0gVGhlIG1heGltdW0gbnVtYmVycyBvZiBieXRlcyB0byBlbWl0LCBvciAwLiBJZgorICAvLy8gdGhlIGFsaWdubWVudCBjYW5ub3QgYmUgcmVhY2hlZCBpbiB0aGlzIG1hbnkgYnl0ZXMsIG5vIGJ5dGVzIGFyZQorICAvLy8gZW1pdHRlZC4KKyAgdmlydHVhbCB2b2lkIEVtaXRDb2RlQWxpZ25tZW50KHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXhCeXRlc1RvRW1pdCA9IDApOworCisgIC8vLyBcYnJpZWYgRW1pdCBzb21lIG51bWJlciBvZiBjb3BpZXMgb2YgXHAgVmFsdWUgdW50aWwgdGhlIGJ5dGUgb2Zmc2V0IFxwCisgIC8vLyBPZmZzZXQgaXMgcmVhY2hlZC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IGFzc2VtYmxlciBkaXJlY3RpdmVzIHN1Y2ggYXMgLm9yZy4KKyAgLy8vCisgIC8vLyBccGFyYW0gT2Zmc2V0IC0gVGhlIG9mZnNldCB0byByZWFjaC4gVGhpcyBtYXkgYmUgYW4gZXhwcmVzc2lvbiwgYnV0IHRoZQorICAvLy8gZXhwcmVzc2lvbiBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBzZWN0aW9uLgorICAvLy8gXHBhcmFtIFZhbHVlIC0gVGhlIHZhbHVlIHRvIHVzZSB3aGVuIGZpbGxpbmcgYnl0ZXMuCisgIHZpcnR1YWwgdm9pZCBlbWl0VmFsdWVUb09mZnNldChjb25zdCBNQ0V4cHIgKk9mZnNldCwgdW5zaWduZWQgY2hhciBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jIExvYyk7CisKKyAgdmlydHVhbCB2b2lkCisgIEVtaXRDb2RlUGFkZGluZ0Jhc2ljQmxvY2tTdGFydChjb25zdCBNQ0NvZGVQYWRkaW5nQ29udGV4dCAmQ29udGV4dCkge30KKworICB2aXJ0dWFsIHZvaWQKKyAgRW1pdENvZGVQYWRkaW5nQmFzaWNCbG9ja0VuZChjb25zdCBNQ0NvZGVQYWRkaW5nQ29udGV4dCAmQ29udGV4dCkge30KKworICAvLy8gQH0KKworICAvLy8gXGJyaWVmIFN3aXRjaCB0byBhIG5ldyBsb2dpY2FsIGZpbGUuICBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSAnLmZpbGUKKyAgLy8vICJmb28uYyInIGFzc2VtYmxlciBkaXJlY3RpdmUuCisgIHZpcnR1YWwgdm9pZCBFbWl0RmlsZURpcmVjdGl2ZShTdHJpbmdSZWYgRmlsZW5hbWUpOworCisgIC8vLyBcYnJpZWYgRW1pdCB0aGUgImlkZW50aWZpZXJzIiBkaXJlY3RpdmUuICBUaGlzIGltcGxlbWVudHMgdGhlCisgIC8vLyAnLmlkZW50ICJ2ZXJzaW9uIGZvbyInIGFzc2VtYmxlciBkaXJlY3RpdmUuCisgIHZpcnR1YWwgdm9pZCBFbWl0SWRlbnQoU3RyaW5nUmVmIElkZW50U3RyaW5nKSB7fQorCisgIC8vLyBcYnJpZWYgQXNzb2NpYXRlIGEgZmlsZW5hbWUgd2l0aCBhIHNwZWNpZmllZCBsb2dpY2FsIGZpbGUgbnVtYmVyLiAgVGhpcworICAvLy8gaW1wbGVtZW50cyB0aGUgRFdBUkYyICcuZmlsZSA0ICJmb28uYyInIGFzc2VtYmxlciBkaXJlY3RpdmUuCisgIHVuc2lnbmVkIEVtaXREd2FyZkZpbGVEaXJlY3RpdmUodW5zaWduZWQgRmlsZU5vLCBTdHJpbmdSZWYgRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRDU6Ok1ENVJlc3VsdCAqQ2hlY2tzdW0gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPFN0cmluZ1JlZj4gU291cmNlID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDVUlEID0gMCkgeworICAgIHJldHVybiBjYW50RmFpbCgKKyAgICAgICAgdHJ5RW1pdER3YXJmRmlsZURpcmVjdGl2ZShGaWxlTm8sIERpcmVjdG9yeSwgRmlsZW5hbWUsIENoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSwgQ1VJRCkpOworICB9CisKKyAgLy8vIEFzc29jaWF0ZSBhIGZpbGVuYW1lIHdpdGggYSBzcGVjaWZpZWQgbG9naWNhbCBmaWxlIG51bWJlci4KKyAgLy8vIEFsc28gYXNzb2NpYXRlIGEgZGlyZWN0b3J5LCBvcHRpb25hbCBjaGVja3N1bSwgYW5kIG9wdGlvbmFsIHNvdXJjZQorICAvLy8gdGV4dCB3aXRoIHRoZSBsb2dpY2FsIGZpbGUuICBUaGlzIGltcGxlbWVudHMgdGhlIERXQVJGMgorICAvLy8gJy5maWxlIDQgImRpci9mb28uYyInIGFzc2VtYmxlciBkaXJlY3RpdmUsIGFuZCB0aGUgRFdBUkY1CisgIC8vLyAnLmZpbGUgNCAiZGlyL2Zvby5jIiBtZDUgIi4uLiIgc291cmNlICIuLi4iJyBhc3NlbWJsZXIgZGlyZWN0aXZlLgorICB2aXJ0dWFsIEV4cGVjdGVkPHVuc2lnbmVkPiB0cnlFbWl0RHdhcmZGaWxlRGlyZWN0aXZlKAorICAgICAgdW5zaWduZWQgRmlsZU5vLCBTdHJpbmdSZWYgRGlyZWN0b3J5LCBTdHJpbmdSZWYgRmlsZW5hbWUsCisgICAgICBNRDU6Ok1ENVJlc3VsdCAqQ2hlY2tzdW0gPSBudWxscHRyLCBPcHRpb25hbDxTdHJpbmdSZWY+IFNvdXJjZSA9IE5vbmUsCisgICAgICB1bnNpZ25lZCBDVUlEID0gMCk7CisKKyAgLy8vIFNwZWNpZnkgdGhlICJyb290IiBmaWxlIG9mIHRoZSBjb21waWxhdGlvbiwgdXNpbmcgdGhlICIuZmlsZSAwIiBleHRlbnNpb24uCisgIHZpcnR1YWwgdm9pZCBlbWl0RHdhcmZGaWxlMERpcmVjdGl2ZShTdHJpbmdSZWYgRGlyZWN0b3J5LCBTdHJpbmdSZWYgRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRDU6Ok1ENVJlc3VsdCAqQ2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxTdHJpbmdSZWY+IFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENVSUQgPSAwKTsKKworICAvLy8gXGJyaWVmIFRoaXMgaW1wbGVtZW50cyB0aGUgRFdBUkYyICcubG9jIGZpbGVubyBsaW5lbm8gLi4uJyBhc3NlbWJsZXIKKyAgLy8vIGRpcmVjdGl2ZS4KKyAgdmlydHVhbCB2b2lkIEVtaXREd2FyZkxvY0RpcmVjdGl2ZSh1bnNpZ25lZCBGaWxlTm8sIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sdW1uLCB1bnNpZ25lZCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJc2EsIHVuc2lnbmVkIERpc2NyaW1pbmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVOYW1lKTsKKworICAvLy8gQXNzb2NpYXRlIGEgZmlsZW5hbWUgd2l0aCBhIHNwZWNpZmllZCBsb2dpY2FsIGZpbGUgbnVtYmVyLCBhbmQgYWxzbworICAvLy8gc3BlY2lmeSB0aGF0IGZpbGUncyBjaGVja3N1bSBpbmZvcm1hdGlvbi4gIFRoaXMgaW1wbGVtZW50cyB0aGUgJy5jdl9maWxlIDQKKyAgLy8vICJmb28uYyInIGFzc2VtYmxlciBkaXJlY3RpdmUuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgorICB2aXJ0dWFsIGJvb2wgRW1pdENWRmlsZURpcmVjdGl2ZSh1bnNpZ25lZCBGaWxlTm8sIFN0cmluZ1JlZiBGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gQ2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENoZWNrc3VtS2luZCk7CisKKyAgLy8vIFxicmllZiBJbnRyb2R1Y2VzIGEgZnVuY3Rpb24gaWQgZm9yIHVzZSB3aXRoIC5jdl9sb2MuCisgIHZpcnR1YWwgYm9vbCBFbWl0Q1ZGdW5jSWREaXJlY3RpdmUodW5zaWduZWQgRnVuY3Rpb25JZCk7CisKKyAgLy8vIFxicmllZiBJbnRyb2R1Y2VzIGFuIGlubGluZSBjYWxsIHNpdGUgaWQgZm9yIHVzZSB3aXRoIC5jdl9sb2MuIEluY2x1ZGVzCisgIC8vLyBleHRyYSBpbmZvcm1hdGlvbiBmb3IgaW5saW5lIGxpbmUgdGFibGUgZ2VuZXJhdGlvbi4KKyAgdmlydHVhbCBib29sIEVtaXRDVklubGluZVNpdGVJZERpcmVjdGl2ZSh1bnNpZ25lZCBGdW5jdGlvbklkLCB1bnNpZ25lZCBJQUZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUFGaWxlLCB1bnNpZ25lZCBJQUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUFDb2wsIFNNTG9jIExvYyk7CisKKyAgLy8vIFxicmllZiBUaGlzIGltcGxlbWVudHMgdGhlIENvZGVWaWV3ICcuY3ZfbG9jJyBhc3NlbWJsZXIgZGlyZWN0aXZlLgorICB2aXJ0dWFsIHZvaWQgRW1pdENWTG9jRGlyZWN0aXZlKHVuc2lnbmVkIEZ1bmN0aW9uSWQsIHVuc2lnbmVkIEZpbGVObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lLCB1bnNpZ25lZCBDb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQcm9sb2d1ZUVuZCwgYm9vbCBJc1N0bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVOYW1lLCBTTUxvYyBMb2MpOworCisgIC8vLyBcYnJpZWYgVGhpcyBpbXBsZW1lbnRzIHRoZSBDb2RlVmlldyAnLmN2X2xpbmV0YWJsZScgYXNzZW1ibGVyIGRpcmVjdGl2ZS4KKyAgdmlydHVhbCB2b2lkIEVtaXRDVkxpbmV0YWJsZURpcmVjdGl2ZSh1bnNpZ25lZCBGdW5jdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICpGblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICpGbkVuZCk7CisKKyAgLy8vIFxicmllZiBUaGlzIGltcGxlbWVudHMgdGhlIENvZGVWaWV3ICcuY3ZfaW5saW5lX2xpbmV0YWJsZScgYXNzZW1ibGVyCisgIC8vLyBkaXJlY3RpdmUuCisgIHZpcnR1YWwgdm9pZCBFbWl0Q1ZJbmxpbmVMaW5ldGFibGVEaXJlY3RpdmUodW5zaWduZWQgUHJpbWFyeUZ1bmN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU291cmNlRmlsZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNvdXJjZUxpbmVOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKkZuU3RhcnRTeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKkZuRW5kU3ltKTsKKworICAvLy8gXGJyaWVmIFRoaXMgaW1wbGVtZW50cyB0aGUgQ29kZVZpZXcgJy5jdl9kZWZfcmFuZ2UnIGFzc2VtYmxlcgorICAvLy8gZGlyZWN0aXZlLgorICB2aXJ0dWFsIHZvaWQgRW1pdENWRGVmUmFuZ2VEaXJlY3RpdmUoCisgICAgICBBcnJheVJlZjxzdGQ6OnBhaXI8Y29uc3QgTUNTeW1ib2wgKiwgY29uc3QgTUNTeW1ib2wgKj4+IFJhbmdlcywKKyAgICAgIFN0cmluZ1JlZiBGaXhlZFNpemVQb3J0aW9uKTsKKworICAvLy8gXGJyaWVmIFRoaXMgaW1wbGVtZW50cyB0aGUgQ29kZVZpZXcgJy5jdl9zdHJpbmd0YWJsZScgYXNzZW1ibGVyIGRpcmVjdGl2ZS4KKyAgdmlydHVhbCB2b2lkIEVtaXRDVlN0cmluZ1RhYmxlRGlyZWN0aXZlKCkge30KKworICAvLy8gXGJyaWVmIFRoaXMgaW1wbGVtZW50cyB0aGUgQ29kZVZpZXcgJy5jdl9maWxlY2hlY2tzdW1zJyBhc3NlbWJsZXIgZGlyZWN0aXZlLgorICB2aXJ0dWFsIHZvaWQgRW1pdENWRmlsZUNoZWNrc3Vtc0RpcmVjdGl2ZSgpIHt9CisKKyAgLy8vIFRoaXMgaW1wbGVtZW50cyB0aGUgQ29kZVZpZXcgJy5jdl9maWxlY2hlY2tzdW1vZmZzZXQnIGFzc2VtYmxlcgorICAvLy8gZGlyZWN0aXZlLgorICB2aXJ0dWFsIHZvaWQgRW1pdENWRmlsZUNoZWNrc3VtT2Zmc2V0RGlyZWN0aXZlKHVuc2lnbmVkIEZpbGVObykge30KKworICAvLy8gVGhpcyBpbXBsZW1lbnRzIHRoZSBDb2RlVmlldyAnLmN2X2Zwb19kYXRhJyBhc3NlbWJsZXIgZGlyZWN0aXZlLgorICB2aXJ0dWFsIHZvaWQgRW1pdENWRlBPRGF0YShjb25zdCBNQ1N5bWJvbCAqUHJvY1N5bSwgU01Mb2MgTG9jID0ge30pIHt9CisKKyAgLy8vIEVtaXQgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gc3ltYm9scy4KKyAgLy8vCisgIC8vLyBccHJlIE9mZnNldCBvZiBcYyBIaSBpcyBncmVhdGVyIHRoYW4gdGhlIG9mZnNldCBcYyBMby4KKyAgdmlydHVhbCB2b2lkIGVtaXRBYnNvbHV0ZVN5bWJvbERpZmYoY29uc3QgTUNTeW1ib2wgKkhpLCBjb25zdCBNQ1N5bWJvbCAqTG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNpemUpOworCisgIC8vLyBFbWl0IHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHN5bWJvbHMgZW5jb2RlZCB3aXRoIFVMRUIxMjguCisgIHZpcnR1YWwgdm9pZCBlbWl0QWJzb2x1dGVTeW1ib2xEaWZmQXNVTEVCMTI4KGNvbnN0IE1DU3ltYm9sICpIaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKkxvKTsKKworICB2aXJ0dWFsIE1DU3ltYm9sICpnZXREd2FyZkxpbmVUYWJsZVN5bWJvbCh1bnNpZ25lZCBDVUlEKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRDRklTZWN0aW9ucyhib29sIEVILCBib29sIERlYnVnKTsKKyAgdm9pZCBFbWl0Q0ZJU3RhcnRQcm9jKGJvb2wgSXNTaW1wbGUpOworICB2b2lkIEVtaXRDRklFbmRQcm9jKCk7CisgIHZpcnR1YWwgdm9pZCBFbWl0Q0ZJRGVmQ2ZhKGludDY0X3QgUmVnaXN0ZXIsIGludDY0X3QgT2Zmc2V0KTsKKyAgdmlydHVhbCB2b2lkIEVtaXRDRklEZWZDZmFPZmZzZXQoaW50NjRfdCBPZmZzZXQpOworICB2aXJ0dWFsIHZvaWQgRW1pdENGSURlZkNmYVJlZ2lzdGVyKGludDY0X3QgUmVnaXN0ZXIpOworICB2aXJ0dWFsIHZvaWQgRW1pdENGSU9mZnNldChpbnQ2NF90IFJlZ2lzdGVyLCBpbnQ2NF90IE9mZnNldCk7CisgIHZpcnR1YWwgdm9pZCBFbWl0Q0ZJUGVyc29uYWxpdHkoY29uc3QgTUNTeW1ib2wgKlN5bSwgdW5zaWduZWQgRW5jb2RpbmcpOworICB2aXJ0dWFsIHZvaWQgRW1pdENGSUxzZGEoY29uc3QgTUNTeW1ib2wgKlN5bSwgdW5zaWduZWQgRW5jb2RpbmcpOworICB2aXJ0dWFsIHZvaWQgRW1pdENGSVJlbWVtYmVyU3RhdGUoKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRDRklSZXN0b3JlU3RhdGUoKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRDRklTYW1lVmFsdWUoaW50NjRfdCBSZWdpc3Rlcik7CisgIHZpcnR1YWwgdm9pZCBFbWl0Q0ZJUmVzdG9yZShpbnQ2NF90IFJlZ2lzdGVyKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRDRklSZWxPZmZzZXQoaW50NjRfdCBSZWdpc3RlciwgaW50NjRfdCBPZmZzZXQpOworICB2aXJ0dWFsIHZvaWQgRW1pdENGSUFkanVzdENmYU9mZnNldChpbnQ2NF90IEFkanVzdG1lbnQpOworICB2aXJ0dWFsIHZvaWQgRW1pdENGSUVzY2FwZShTdHJpbmdSZWYgVmFsdWVzKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRDRklSZXR1cm5Db2x1bW4oaW50NjRfdCBSZWdpc3Rlcik7CisgIHZpcnR1YWwgdm9pZCBFbWl0Q0ZJR251QXJnc1NpemUoaW50NjRfdCBTaXplKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRDRklTaWduYWxGcmFtZSgpOworICB2aXJ0dWFsIHZvaWQgRW1pdENGSVVuZGVmaW5lZChpbnQ2NF90IFJlZ2lzdGVyKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRDRklSZWdpc3RlcihpbnQ2NF90IFJlZ2lzdGVyMSwgaW50NjRfdCBSZWdpc3RlcjIpOworICB2aXJ0dWFsIHZvaWQgRW1pdENGSVdpbmRvd1NhdmUoKTsKKworICB2aXJ0dWFsIHZvaWQgRW1pdFdpbkNGSVN0YXJ0UHJvYyhjb25zdCBNQ1N5bWJvbCAqU3ltYm9sLCBTTUxvYyBMb2MgPSBTTUxvYygpKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRXaW5DRklFbmRQcm9jKFNNTG9jIExvYyA9IFNNTG9jKCkpOworICB2aXJ0dWFsIHZvaWQgRW1pdFdpbkNGSVN0YXJ0Q2hhaW5lZChTTUxvYyBMb2MgPSBTTUxvYygpKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRXaW5DRklFbmRDaGFpbmVkKFNNTG9jIExvYyA9IFNNTG9jKCkpOworICB2aXJ0dWFsIHZvaWQgRW1pdFdpbkNGSVB1c2hSZWcodW5zaWduZWQgUmVnaXN0ZXIsIFNNTG9jIExvYyA9IFNNTG9jKCkpOworICB2aXJ0dWFsIHZvaWQgRW1pdFdpbkNGSVNldEZyYW1lKHVuc2lnbmVkIFJlZ2lzdGVyLCB1bnNpZ25lZCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01Mb2MgTG9jID0gU01Mb2MoKSk7CisgIHZpcnR1YWwgdm9pZCBFbWl0V2luQ0ZJQWxsb2NTdGFjayh1bnNpZ25lZCBTaXplLCBTTUxvYyBMb2MgPSBTTUxvYygpKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRXaW5DRklTYXZlUmVnKHVuc2lnbmVkIFJlZ2lzdGVyLCB1bnNpZ25lZCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUxvYyBMb2MgPSBTTUxvYygpKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRXaW5DRklTYXZlWE1NKHVuc2lnbmVkIFJlZ2lzdGVyLCB1bnNpZ25lZCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUxvYyBMb2MgPSBTTUxvYygpKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRXaW5DRklQdXNoRnJhbWUoYm9vbCBDb2RlLCBTTUxvYyBMb2MgPSBTTUxvYygpKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRXaW5DRklFbmRQcm9sb2coU01Mb2MgTG9jID0gU01Mb2MoKSk7CisgIHZpcnR1YWwgdm9pZCBFbWl0V2luRUhIYW5kbGVyKGNvbnN0IE1DU3ltYm9sICpTeW0sIGJvb2wgVW53aW5kLCBib29sIEV4Y2VwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01Mb2MgTG9jID0gU01Mb2MoKSk7CisgIHZpcnR1YWwgdm9pZCBFbWl0V2luRUhIYW5kbGVyRGF0YShTTUxvYyBMb2MgPSBTTUxvYygpKTsKKworICAvLy8gR2V0IHRoZSAucGRhdGEgc2VjdGlvbiB1c2VkIGZvciB0aGUgZ2l2ZW4gc2VjdGlvbi4gVHlwaWNhbGx5IHRoZSBnaXZlbgorICAvLy8gc2VjdGlvbiBpcyBlaXRoZXIgdGhlIG1haW4gLnRleHQgc2VjdGlvbiBvciBzb21lIG90aGVyIENPTURBVCAudGV4dAorICAvLy8gc2VjdGlvbiwgYnV0IGl0IG1heSBiZSBhbnkgc2VjdGlvbiBjb250YWluaW5nIGNvZGUuCisgIE1DU2VjdGlvbiAqZ2V0QXNzb2NpYXRlZFBEYXRhU2VjdGlvbihjb25zdCBNQ1NlY3Rpb24gKlRleHRTZWMpOworCisgIC8vLyBHZXQgdGhlIC54ZGF0YSBzZWN0aW9uIHVzZWQgZm9yIHRoZSBnaXZlbiBzZWN0aW9uLgorICBNQ1NlY3Rpb24gKmdldEFzc29jaWF0ZWRYRGF0YVNlY3Rpb24oY29uc3QgTUNTZWN0aW9uICpUZXh0U2VjKTsKKworICB2aXJ0dWFsIHZvaWQgRW1pdFN5bnRheERpcmVjdGl2ZSgpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIC5yZWxvYyBkaXJlY3RpdmUuCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHJlbG9jYXRpb24gY291bGQgbm90IGJlIGVtaXR0ZWQgYmVjYXVzZSBOYW1lIGlzIG5vdAorICAvLy8ga25vd24uCisgIHZpcnR1YWwgYm9vbCBFbWl0UmVsb2NEaXJlY3RpdmUoY29uc3QgTUNFeHByICZPZmZzZXQsIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRXhwciAqRXhwciwgU01Mb2MgTG9jKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gXGJyaWVmIEVtaXQgdGhlIGdpdmVuIFxwIEluc3RydWN0aW9uIGludG8gdGhlIGN1cnJlbnQgc2VjdGlvbi4KKyAgLy8vIFByaW50U2NoZWRJbmZvID09IHRydWUgdGhlbiBzY2hlZHVsIGNvbW1lbnQgc2hvdWxkIGJlIGFkZGVkIHRvIG91dHB1dAorICB2aXJ0dWFsIHZvaWQgRW1pdEluc3RydWN0aW9uKGNvbnN0IE1DSW5zdCAmSW5zdCwgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQcmludFNjaGVkSW5mbyA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIFNldCB0aGUgYnVuZGxlIGFsaWdubWVudCBtb2RlIGZyb20gbm93IG9uIGluIHRoZSBzZWN0aW9uLgorICAvLy8gVGhlIGFyZ3VtZW50IGlzIHRoZSBwb3dlciBvZiAyIHRvIHdoaWNoIHRoZSBhbGlnbm1lbnQgaXMgc2V0LiBUaGUKKyAgLy8vIHZhbHVlIDAgbWVhbnMgdHVybiB0aGUgYnVuZGxlIGFsaWdubWVudCBvZmYuCisgIHZpcnR1YWwgdm9pZCBFbWl0QnVuZGxlQWxpZ25Nb2RlKHVuc2lnbmVkIEFsaWduUG93Mik7CisKKyAgLy8vIFxicmllZiBUaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyBhcmUgYSBidW5kbGUtbG9ja2VkIGdyb3VwLgorICAvLy8KKyAgLy8vIFxwYXJhbSBBbGlnblRvRW5kIC0gSWYgdHJ1ZSwgdGhlIGJ1bmRsZS1sb2NrZWQgZ3JvdXAgd2lsbCBiZSBhbGlnbmVkIHRvCisgIC8vLyAgICAgICAgICAgICAgICAgICAgIHRoZSBlbmQgb2YgYSBidW5kbGUuCisgIHZpcnR1YWwgdm9pZCBFbWl0QnVuZGxlTG9jayhib29sIEFsaWduVG9FbmQpOworCisgIC8vLyBcYnJpZWYgRW5kcyBhIGJ1bmRsZS1sb2NrZWQgZ3JvdXAuCisgIHZpcnR1YWwgdm9pZCBFbWl0QnVuZGxlVW5sb2NrKCk7CisKKyAgLy8vIFxicmllZiBJZiB0aGlzIGZpbGUgaXMgYmFja2VkIGJ5IGEgYXNzZW1ibHkgc3RyZWFtZXIsIHRoaXMgZHVtcHMgdGhlCisgIC8vLyBzcGVjaWZpZWQgc3RyaW5nIGluIHRoZSBvdXRwdXQgLnMgZmlsZS4gIFRoaXMgY2FwYWJpbGl0eSBpcyBpbmRpY2F0ZWQgYnkKKyAgLy8vIHRoZSBoYXNSYXdUZXh0U3VwcG9ydCgpIHByZWRpY2F0ZS4gIEJ5IGRlZmF1bHQgdGhpcyBhYm9ydHMuCisgIHZvaWQgRW1pdFJhd1RleHQoY29uc3QgVHdpbmUgJlN0cmluZyk7CisKKyAgLy8vIFxicmllZiBTdHJlYW1lciBzcGVjaWZpYyBmaW5hbGl6YXRpb24uCisgIHZpcnR1YWwgdm9pZCBGaW5pc2hJbXBsKCk7CisgIC8vLyBcYnJpZWYgRmluaXNoIGVtaXNzaW9uIG9mIG1hY2hpbmUgY29kZS4KKyAgdm9pZCBGaW5pc2goKTsKKworICB2aXJ0dWFsIGJvb2wgbWF5SGF2ZUluc3RydWN0aW9ucyhNQ1NlY3Rpb24gJlNlYykgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworLy8vIENyZWF0ZSBhIGR1bW15IG1hY2hpbmUgY29kZSBzdHJlYW1lciwgd2hpY2ggZG9lcyBub3RoaW5nLiBUaGlzIGlzIHVzZWZ1bCBmb3IKKy8vLyB0aW1pbmcgdGhlIGFzc2VtYmxlciBmcm9udCBlbmQuCitNQ1N0cmVhbWVyICpjcmVhdGVOdWxsU3RyZWFtZXIoTUNDb250ZXh0ICZDdHgpOworCisvLy8gQ3JlYXRlIGEgbWFjaGluZSBjb2RlIHN0cmVhbWVyIHdoaWNoIHdpbGwgcHJpbnQgb3V0IGFzc2VtYmx5IGZvciB0aGUgbmF0aXZlCisvLy8gdGFyZ2V0LCBzdWl0YWJsZSBmb3IgY29tcGlsaW5nIHdpdGggYSBuYXRpdmUgYXNzZW1ibGVyLgorLy8vCisvLy8gXHBhcmFtIEluc3RQcmludCAtIElmIGdpdmVuLCB0aGUgaW5zdHJ1Y3Rpb24gcHJpbnRlciB0byB1c2UuIElmIG5vdCBnaXZlbgorLy8vIHRoZSBNQ0luc3QgcmVwcmVzZW50YXRpb24gd2lsbCBiZSBwcmludGVkLiAgVGhpcyBtZXRob2QgdGFrZXMgb3duZXJzaGlwIG9mCisvLy8gSW5zdFByaW50LgorLy8vCisvLy8gXHBhcmFtIENFIC0gSWYgZ2l2ZW4sIGEgY29kZSBlbWl0dGVyIHRvIHVzZSB0byBzaG93IHRoZSBpbnN0cnVjdGlvbgorLy8vIGVuY29kaW5nIGlubGluZSB3aXRoIHRoZSBhc3NlbWJseS4gVGhpcyBtZXRob2QgdGFrZXMgb3duZXJzaGlwIG9mIFxwIENFLgorLy8vCisvLy8gXHBhcmFtIFRBQiAtIElmIGdpdmVuLCBhIHRhcmdldCBhc20gYmFja2VuZCB0byB1c2UgdG8gc2hvdyB0aGUgZml4dXAKKy8vLyBpbmZvcm1hdGlvbiBpbiBjb25qdW5jdGlvbiB3aXRoIGVuY29kaW5nIGluZm9ybWF0aW9uLiBUaGlzIG1ldGhvZCB0YWtlcworLy8vIG93bmVyc2hpcCBvZiBccCBUQUIuCisvLy8KKy8vLyBccGFyYW0gU2hvd0luc3QgLSBXaGV0aGVyIHRvIHNob3cgdGhlIE1DSW5zdCByZXByZXNlbnRhdGlvbiBpbmxpbmUgd2l0aAorLy8vIHRoZSBhc3NlbWJseS4KK01DU3RyZWFtZXIgKmNyZWF0ZUFzbVN0cmVhbWVyKE1DQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGZvcm1hdHRlZF9yYXdfb3N0cmVhbT4gT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmVyYm9zZUFzbSwgYm9vbCB1c2VEd2FyZkRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DSW5zdFByaW50ZXIgKkluc3RQcmludCwgTUNDb2RlRW1pdHRlciAqQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FzbUJhY2tlbmQgKlRBQiwgYm9vbCBTaG93SW5zdCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DU1RSRUFNRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1N1YnRhcmdldEluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTdWJ0YXJnZXRJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyYjI0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTdWJ0YXJnZXRJbmZvLmgKQEAgLTAsMCArMSwxODEgQEAKKy8vPT09LSBsbHZtL01DL01DU3VidGFyZ2V0SW5mby5oIC0gU3VidGFyZ2V0IEluZm9ybWF0aW9uIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgc3VidGFyZ2V0IG9wdGlvbnMgb2YgYSBUYXJnZXQgbWFjaGluZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNTVUJUQVJHRVRJTkZPX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1NVQlRBUkdFVElORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DSW5zdHJJdGluZXJhcmllcy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTY2hlZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vTUMvU3VidGFyZ2V0RmVhdHVyZS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIE1DSW5zdDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIEdlbmVyaWMgYmFzZSBjbGFzcyBmb3IgYWxsIHRhcmdldCBzdWJ0YXJnZXRzLgorLy8vCitjbGFzcyBNQ1N1YnRhcmdldEluZm8geworICBUcmlwbGUgVGFyZ2V0VHJpcGxlOworICBzdGQ6OnN0cmluZyBDUFU7IC8vIENQVSBiZWluZyB0YXJnZXRlZC4KKyAgQXJyYXlSZWY8U3VidGFyZ2V0RmVhdHVyZUtWPiBQcm9jRmVhdHVyZXM7ICAvLyBQcm9jZXNzb3IgZmVhdHVyZSBsaXN0CisgIEFycmF5UmVmPFN1YnRhcmdldEZlYXR1cmVLVj4gUHJvY0Rlc2M7ICAvLyBQcm9jZXNzb3IgZGVzY3JpcHRpb25zCisKKyAgLy8gU2NoZWR1bGVyIG1hY2hpbmUgbW9kZWwKKyAgY29uc3QgU3VidGFyZ2V0SW5mb0tWICpQcm9jU2NoZWRNb2RlbHM7CisgIGNvbnN0IE1DV3JpdGVQcm9jUmVzRW50cnkgKldyaXRlUHJvY1Jlc1RhYmxlOworICBjb25zdCBNQ1dyaXRlTGF0ZW5jeUVudHJ5ICpXcml0ZUxhdGVuY3lUYWJsZTsKKyAgY29uc3QgTUNSZWFkQWR2YW5jZUVudHJ5ICpSZWFkQWR2YW5jZVRhYmxlOworICBjb25zdCBNQ1NjaGVkTW9kZWwgKkNQVVNjaGVkTW9kZWw7CisKKyAgY29uc3QgSW5zdHJTdGFnZSAqU3RhZ2VzOyAgICAgICAgICAgIC8vIEluc3RydWN0aW9uIGl0aW5lcmFyeSBzdGFnZXMKKyAgY29uc3QgdW5zaWduZWQgKk9wZXJhbmRDeWNsZXM7ICAgICAgIC8vIEl0aW5lcmFyeSBvcGVyYW5kIGN5Y2xlcworICBjb25zdCB1bnNpZ25lZCAqRm9yd2FyZGluZ1BhdGhzOworICBGZWF0dXJlQml0c2V0IEZlYXR1cmVCaXRzOyAgICAgICAgICAgLy8gRmVhdHVyZSBiaXRzIGZvciBjdXJyZW50IENQVSArIEZTCisKK3B1YmxpYzoKKyAgTUNTdWJ0YXJnZXRJbmZvKGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmKSA9IGRlZmF1bHQ7CisgIE1DU3VidGFyZ2V0SW5mbyhjb25zdCBUcmlwbGUgJlRULCBTdHJpbmdSZWYgQ1BVLCBTdHJpbmdSZWYgRlMsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTdWJ0YXJnZXRGZWF0dXJlS1Y+IFBGLAorICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U3VidGFyZ2V0RmVhdHVyZUtWPiBQRCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFN1YnRhcmdldEluZm9LViAqUHJvY1NjaGVkLAorICAgICAgICAgICAgICAgICAgY29uc3QgTUNXcml0ZVByb2NSZXNFbnRyeSAqV1BSLCBjb25zdCBNQ1dyaXRlTGF0ZW5jeUVudHJ5ICpXTCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IE1DUmVhZEFkdmFuY2VFbnRyeSAqUkEsIGNvbnN0IEluc3RyU3RhZ2UgKklTLAorICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgKk9DLCBjb25zdCB1bnNpZ25lZCAqRlApOworICBNQ1N1YnRhcmdldEluZm8oKSA9IGRlbGV0ZTsKKyAgTUNTdWJ0YXJnZXRJbmZvICZvcGVyYXRvcj0oY29uc3QgTUNTdWJ0YXJnZXRJbmZvICYpID0gZGVsZXRlOworICBNQ1N1YnRhcmdldEluZm8gJm9wZXJhdG9yPShNQ1N1YnRhcmdldEluZm8gJiYpID0gZGVsZXRlOworICB2aXJ0dWFsIH5NQ1N1YnRhcmdldEluZm8oKSA9IGRlZmF1bHQ7CisKKyAgY29uc3QgVHJpcGxlICZnZXRUYXJnZXRUcmlwbGUoKSBjb25zdCB7IHJldHVybiBUYXJnZXRUcmlwbGU7IH0KKyAgU3RyaW5nUmVmIGdldENQVSgpIGNvbnN0IHsgcmV0dXJuIENQVTsgfQorCisgIGNvbnN0IEZlYXR1cmVCaXRzZXQmIGdldEZlYXR1cmVCaXRzKCkgY29uc3QgeyByZXR1cm4gRmVhdHVyZUJpdHM7IH0KKyAgdm9pZCBzZXRGZWF0dXJlQml0cyhjb25zdCBGZWF0dXJlQml0c2V0ICZGZWF0dXJlQml0c18pIHsKKyAgICBGZWF0dXJlQml0cyA9IEZlYXR1cmVCaXRzXzsKKyAgfQorCisgIGJvb2wgaGFzRmVhdHVyZSh1bnNpZ25lZCBGZWF0dXJlKSBjb25zdCB7CisgICAgcmV0dXJuIEZlYXR1cmVCaXRzW0ZlYXR1cmVdOworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8vIEluaXRpYWxpemUgdGhlIHNjaGVkdWxpbmcgbW9kZWwgYW5kIGZlYXR1cmUgYml0cy4KKyAgLy8vCisgIC8vLyBGSVhNRTogRmluZCBhIHdheSB0byBzdGljayB0aGlzIGluIHRoZSBjb25zdHJ1Y3Rvciwgc2luY2UgaXQgc2hvdWxkIG9ubHkKKyAgLy8vIGJlIGNhbGxlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgIHZvaWQgSW5pdE1DUHJvY2Vzc29ySW5mbyhTdHJpbmdSZWYgQ1BVLCBTdHJpbmdSZWYgRlMpOworCitwdWJsaWM6CisgIC8vLyBTZXQgdGhlIGZlYXR1cmVzIHRvIHRoZSBkZWZhdWx0IGZvciB0aGUgZ2l2ZW4gQ1BVIHdpdGggYW4gYXBwZW5kZWQgZmVhdHVyZQorICAvLy8gc3RyaW5nLgorICB2b2lkIHNldERlZmF1bHRGZWF0dXJlcyhTdHJpbmdSZWYgQ1BVLCBTdHJpbmdSZWYgRlMpOworCisgIC8vLyBUb2dnbGUgYSBmZWF0dXJlIGFuZCByZXR1cm4gdGhlIHJlLWNvbXB1dGVkIGZlYXR1cmUgYml0cy4KKyAgLy8vIFRoaXMgdmVyc2lvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGltcGxpZWQgYml0cy4KKyAgRmVhdHVyZUJpdHNldCBUb2dnbGVGZWF0dXJlKHVpbnQ2NF90IEZCKTsKKworICAvLy8gVG9nZ2xlIGEgZmVhdHVyZSBhbmQgcmV0dXJuIHRoZSByZS1jb21wdXRlZCBmZWF0dXJlIGJpdHMuCisgIC8vLyBUaGlzIHZlcnNpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBpbXBsaWVkIGJpdHMuCisgIEZlYXR1cmVCaXRzZXQgVG9nZ2xlRmVhdHVyZShjb25zdCBGZWF0dXJlQml0c2V0JiBGQik7CisKKyAgLy8vIFRvZ2dsZSBhIHNldCBvZiBmZWF0dXJlcyBhbmQgcmV0dXJuIHRoZSByZS1jb21wdXRlZCBmZWF0dXJlIGJpdHMuCisgIC8vLyBUaGlzIHZlcnNpb24gd2lsbCBhbHNvIGNoYW5nZSBhbGwgaW1wbGllZCBiaXRzLgorICBGZWF0dXJlQml0c2V0IFRvZ2dsZUZlYXR1cmUoU3RyaW5nUmVmIEZTKTsKKworICAvLy8gQXBwbHkgYSBmZWF0dXJlIGZsYWcgYW5kIHJldHVybiB0aGUgcmUtY29tcHV0ZWQgZmVhdHVyZSBiaXRzLCBpbmNsdWRpbmcKKyAgLy8vIGFsbCBmZWF0dXJlIGJpdHMgaW1wbGllZCBieSB0aGUgZmxhZy4KKyAgRmVhdHVyZUJpdHNldCBBcHBseUZlYXR1cmVGbGFnKFN0cmluZ1JlZiBGUyk7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgdGhlIHN1YnRhcmdldCBmZWF0dXJlcyBhcmUgZW5hYmxlZC9kaXNhYmxlZCBhcyBwZXIKKyAgLy8vIHRoZSBwcm92aWRlZCBzdHJpbmcsIGlnbm9yaW5nIGFsbCBvdGhlciBmZWF0dXJlcy4KKyAgYm9vbCBjaGVja0ZlYXR1cmVzKFN0cmluZ1JlZiBGUykgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgbWFjaGluZSBtb2RlbCBvZiBhIENQVS4KKyAgY29uc3QgTUNTY2hlZE1vZGVsICZnZXRTY2hlZE1vZGVsRm9yQ1BVKFN0cmluZ1JlZiBDUFUpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIG1hY2hpbmUgbW9kZWwgZm9yIHRoaXMgc3VidGFyZ2V0J3MgQ1BVLgorICBjb25zdCBNQ1NjaGVkTW9kZWwgJmdldFNjaGVkTW9kZWwoKSBjb25zdCB7IHJldHVybiAqQ1BVU2NoZWRNb2RlbDsgfQorCisgIC8vLyBSZXR1cm4gYW4gaXRlcmF0b3IgYXQgdGhlIGZpcnN0IHByb2Nlc3MgcmVzb3VyY2UgY29uc3VtZWQgYnkgdGhlIGdpdmVuCisgIC8vLyBzY2hlZHVsaW5nIGNsYXNzLgorICBjb25zdCBNQ1dyaXRlUHJvY1Jlc0VudHJ5ICpnZXRXcml0ZVByb2NSZXNCZWdpbigKKyAgICBjb25zdCBNQ1NjaGVkQ2xhc3NEZXNjICpTQykgY29uc3QgeworICAgIHJldHVybiAmV3JpdGVQcm9jUmVzVGFibGVbU0MtPldyaXRlUHJvY1Jlc0lkeF07CisgIH0KKyAgY29uc3QgTUNXcml0ZVByb2NSZXNFbnRyeSAqZ2V0V3JpdGVQcm9jUmVzRW5kKAorICAgIGNvbnN0IE1DU2NoZWRDbGFzc0Rlc2MgKlNDKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFdyaXRlUHJvY1Jlc0JlZ2luKFNDKSArIFNDLT5OdW1Xcml0ZVByb2NSZXNFbnRyaWVzOworICB9CisKKyAgY29uc3QgTUNXcml0ZUxhdGVuY3lFbnRyeSAqZ2V0V3JpdGVMYXRlbmN5RW50cnkoY29uc3QgTUNTY2hlZENsYXNzRGVzYyAqU0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlZklkeCkgY29uc3QgeworICAgIGFzc2VydChEZWZJZHggPCBTQy0+TnVtV3JpdGVMYXRlbmN5RW50cmllcyAmJgorICAgICAgICAgICAiTWFjaGluZU1vZGVsIGRvZXMgbm90IHNwZWNpZnkgYSBXcml0ZVJlc291cmNlIGZvciBEZWZJZHgiKTsKKworICAgIHJldHVybiAmV3JpdGVMYXRlbmN5VGFibGVbU0MtPldyaXRlTGF0ZW5jeUlkeCArIERlZklkeF07CisgIH0KKworICBpbnQgZ2V0UmVhZEFkdmFuY2VDeWNsZXMoY29uc3QgTUNTY2hlZENsYXNzRGVzYyAqU0MsIHVuc2lnbmVkIFVzZUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFdyaXRlUmVzSUQpIGNvbnN0IHsKKyAgICAvLyBUT0RPOiBUaGUgbnVtYmVyIG9mIHJlYWQgYWR2YW5jZSBlbnRyaWVzIGluIGEgY2xhc3MgY2FuIGJlIHNpZ25pZmljYW50CisgICAgLy8gKH41MCkuIENvbnNpZGVyIGNvbXByZXNzaW5nIHRoZSBXcml0ZUlEIGludG8gYSBkZW5zZSBJRCBvZiB0aG9zZSB0aGF0IGFyZQorICAgIC8vIHVzZWQgYnkgUmVhZEFkdmFuY2UgYW5kIHJlcHJlc2VudGluZyB0aGVtIGFzIGEgYml0c2V0LgorICAgIGZvciAoY29uc3QgTUNSZWFkQWR2YW5jZUVudHJ5ICpJID0gJlJlYWRBZHZhbmNlVGFibGVbU0MtPlJlYWRBZHZhbmNlSWR4XSwKKyAgICAgICAgICAgKkUgPSBJICsgU0MtPk51bVJlYWRBZHZhbmNlRW50cmllczsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmIChJLT5Vc2VJZHggPCBVc2VJZHgpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKEktPlVzZUlkeCA+IFVzZUlkeCkKKyAgICAgICAgYnJlYWs7CisgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBXcml0ZVJlc0lkeCBtYXRjaCwgd2hpY2ggaGFzIHRoZSBoaWdoZXN0IGN5Y2xlIGNvdW50LgorICAgICAgaWYgKCFJLT5Xcml0ZVJlc291cmNlSUQgfHwgSS0+V3JpdGVSZXNvdXJjZUlEID09IFdyaXRlUmVzSUQpIHsKKyAgICAgICAgcmV0dXJuIEktPkN5Y2xlczsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gR2V0IHNjaGVkdWxpbmcgaXRpbmVyYXJ5IG9mIGEgQ1BVLgorICBJbnN0ckl0aW5lcmFyeURhdGEgZ2V0SW5zdHJJdGluZXJhcnlGb3JDUFUoU3RyaW5nUmVmIENQVSkgY29uc3Q7CisKKyAgLy8vIEluaXRpYWxpemUgYW4gSW5zdHJJdGluZXJhcnlEYXRhIGluc3RhbmNlLgorICB2b2lkIGluaXRJbnN0ckl0aW5zKEluc3RySXRpbmVyYXJ5RGF0YSAmSW5zdHJJdGlucykgY29uc3Q7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgdGhlIENQVSBzdHJpbmcgaXMgdmFsaWQuCisgIGJvb2wgaXNDUFVTdHJpbmdWYWxpZChTdHJpbmdSZWYgQ1BVKSBjb25zdCB7CisgICAgYXV0byBGb3VuZCA9IHN0ZDo6bG93ZXJfYm91bmQoUHJvY0Rlc2MuYmVnaW4oKSwgUHJvY0Rlc2MuZW5kKCksIENQVSk7CisgICAgcmV0dXJuIEZvdW5kICE9IFByb2NEZXNjLmVuZCgpICYmIFN0cmluZ1JlZihGb3VuZC0+S2V5KSA9PSBDUFU7CisgIH0KKworICAvLy8gUmV0dXJucyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygc2NoZWR1bGVyIGNvbW1lbnQKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRTY2hlZEluZm9TdHIoY29uc3QgTWFjaGluZUluc3RyICZNSSkgY29uc3QgeworICAgIHJldHVybiB7fTsKKyAgfQorCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0U2NoZWRJbmZvU3RyKE1DSW5zdCBjb25zdCAmTUNJKSBjb25zdCB7CisgICAgcmV0dXJuIHt9OworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ1NVQlRBUkdFVElORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1N5bWJvbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1N5bWJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOGZjMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU3ltYm9sLmgKQEAgLTAsMCArMSw0MjcgQEAKKy8vPT09LSBNQ1N5bWJvbC5oIC0gTWFjaGluZSBDb2RlIFN5bWJvbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgTUNTeW1ib2wgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DU1lNQk9MX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1NZTUJPTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNGcmFnbWVudC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0FzbUluZm87CitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBNQ0V4cHI7CitjbGFzcyBNQ1NlY3Rpb247CitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIE1DU3ltYm9sIC0gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgc3ltYm9sIG5hbWUgaW4gdGhlIE1DIGZpbGUsCisvLy8gYW5kIE1DU3ltYm9scyBhcmUgY3JlYXRlZCBhbmQgdW5pcXVlZCBieSB0aGUgTUNDb250ZXh0IGNsYXNzLiAgTUNTeW1ib2xzCisvLy8gc2hvdWxkIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aCB2YWxpZCBuYW1lcyBmb3IgdGhlIG9iamVjdCBmaWxlLgorLy8vCisvLy8gSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkL2VtaXR0ZWQgaW50byB0aGUgY3VycmVudCB0cmFuc2xhdGlvbiB1bml0LCB0aGUKKy8vLyBTZWN0aW9uIG1lbWJlciBpcyBzZXQgdG8gaW5kaWNhdGUgd2hhdCBzZWN0aW9uIGl0IGxpdmVzIGluLiAgT3RoZXJ3aXNlLCBpZgorLy8vIGl0IGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIGVudGl0eSwgaXQgaGFzIGEgbnVsbCBzZWN0aW9uLgorY2xhc3MgTUNTeW1ib2wgeworcHJvdGVjdGVkOgorICAvLy8gVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC4gIElmIGl0IGlzIGFueSB2YWx1ZSBvdGhlciB0aGFuIHVuc2V0IHRoZW4gdGhpcworICAvLy8gY2xhc3MgaXMgYWN0dWFsbHkgb25lIG9mIHRoZSBhcHByb3ByaWF0ZSBzdWJjbGFzc2VzIG9mIE1DU3ltYm9sLgorICBlbnVtIFN5bWJvbEtpbmQgeworICAgIFN5bWJvbEtpbmRVbnNldCwKKyAgICBTeW1ib2xLaW5kQ09GRiwKKyAgICBTeW1ib2xLaW5kRUxGLAorICAgIFN5bWJvbEtpbmRNYWNoTywKKyAgICBTeW1ib2xLaW5kV2FzbSwKKyAgfTsKKworICAvLy8gQSBzeW1ib2wgY2FuIGNvbnRhaW4gYW4gT2Zmc2V0LCBvciBWYWx1ZSwgb3IgYmUgQ29tbW9uLCBidXQgbmV2ZXIgbW9yZQorICAvLy8gdGhhbiBvbmUgb2YgdGhlc2UuCisgIGVudW0gQ29udGVudHMgOiB1aW50OF90IHsKKyAgICBTeW1Db250ZW50c1Vuc2V0LAorICAgIFN5bUNvbnRlbnRzT2Zmc2V0LAorICAgIFN5bUNvbnRlbnRzVmFyaWFibGUsCisgICAgU3ltQ29udGVudHNDb21tb24sCisgIH07CisKKyAgLy8gU3BlY2lhbCBzZW50aW5hbCB2YWx1ZSBmb3IgdGhlIGFic29sdXRlIHBzZXVkbyBmcmFnbWVudC4KKyAgc3RhdGljIE1DRnJhZ21lbnQgKkFic29sdXRlUHNldWRvRnJhZ21lbnQ7CisKKyAgLy8vIElmIGEgc3ltYm9sIGhhcyBhIEZyYWdtZW50LCB0aGUgc2VjdGlvbiBpcyBpbXBsaWVkLCBzbyB3ZSBvbmx5IG5lZWQKKyAgLy8vIG9uZSBwb2ludGVyLgorICAvLy8gVGhlIHNwZWNpYWwgQWJzb2x1dGVQc2V1ZG9GcmFnbWVudCB2YWx1ZSBpcyBmb3IgYWJzb2x1dGUgc3ltYm9scy4KKyAgLy8vIElmIHRoaXMgaXMgYSB2YXJpYWJsZSBzeW1ib2wsIHRoaXMgY2FjaGVzIHRoZSB2YXJpYWJsZSB2YWx1ZSdzIGZyYWdtZW50LgorICAvLy8gRklYTUU6IFdlIG1pZ2h0IGJlIGFibGUgdG8gc2ltcGxpZnkgdGhpcyBieSBoYXZpbmcgdGhlIGFzbSBzdHJlYW1lciBjcmVhdGUKKyAgLy8vIGR1bW15IGZyYWdtZW50cy4KKyAgLy8vIElmIHRoaXMgaXMgYSBzZWN0aW9uLCB0aGVuIGl0IGdpdmVzIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpbi4gVGhpcyBpcyBudWxsCisgIC8vLyBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuCisgIC8vLworICAvLy8gSWYgdGhpcyBpcyBhIGZyYWdtZW50LCB0aGVuIGl0IGdpdmVzIHRoZSBmcmFnbWVudCB0aGlzIHN5bWJvbCdzIHZhbHVlIGlzCisgIC8vLyByZWxhdGl2ZSB0bywgaWYgYW55LgorICAvLy8KKyAgLy8vIEZvciB0aGUgJ0hhc05hbWUnIGludGVnZXIsIHRoaXMgaXMgdHJ1ZSBpZiB0aGlzIHN5bWJvbCBpcyBuYW1lZC4KKyAgLy8vIEEgbmFtZWQgc3ltYm9sIHdpbGwgaGF2ZSBhIHBvaW50ZXIgdG8gdGhlIG5hbWUgYWxsb2NhdGVkIGluIHRoZSBieXRlcworICAvLy8gaW1tZWRpYXRlbHkgcHJpb3IgdG8gdGhlIE1DU3ltYm9sLgorICBtdXRhYmxlIFBvaW50ZXJJbnRQYWlyPE1DRnJhZ21lbnQgKiwgMT4gRnJhZ21lbnRBbmRIYXNOYW1lOworCisgIC8vLyBJc1RlbXBvcmFyeSAtIFRydWUgaWYgdGhpcyBpcyBhbiBhc3NlbWJsZXIgdGVtcG9yYXJ5IGxhYmVsLCB3aGljaAorICAvLy8gdHlwaWNhbGx5IGRvZXMgbm90IHN1cnZpdmUgaW4gdGhlIC5vIGZpbGUncyBzeW1ib2wgdGFibGUuICBVc3VhbGx5CisgIC8vLyAiTGZvbyIgb3IgIi5mb28iLgorICB1bnNpZ25lZCBJc1RlbXBvcmFyeSA6IDE7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoaXMgc3ltYm9sIGNhbiBiZSByZWRlZmluZWQuCisgIHVuc2lnbmVkIElzUmVkZWZpbmFibGUgOiAxOworCisgIC8vLyBJc1VzZWQgLSBUcnVlIGlmIHRoaXMgc3ltYm9sIGhhcyBiZWVuIHVzZWQuCisgIG11dGFibGUgdW5zaWduZWQgSXNVc2VkIDogMTsKKworICBtdXRhYmxlIHVuc2lnbmVkIElzUmVnaXN0ZXJlZCA6IDE7CisKKyAgLy8vIFRoaXMgc3ltYm9sIGlzIHZpc2libGUgb3V0c2lkZSB0aGlzIHRyYW5zbGF0aW9uIHVuaXQuCisgIG11dGFibGUgdW5zaWduZWQgSXNFeHRlcm5hbCA6IDE7CisKKyAgLy8vIFRoaXMgc3ltYm9sIGlzIHByaXZhdGUgZXh0ZXJuLgorICBtdXRhYmxlIHVuc2lnbmVkIElzUHJpdmF0ZUV4dGVybiA6IDE7CisKKyAgLy8vIExMVk0gUlRUSSBkaXNjcmltaW5hdG9yLiBUaGlzIGlzIGFjdHVhbGx5IGEgU3ltYm9sS2luZCBlbnVtZXJhdG9yLCBidXQgaXMKKyAgLy8vIHVuc2lnbmVkIHRvIGF2b2lkIHNpZ24gZXh0ZW5zaW9uIGFuZCBhY2hpZXZlIGJldHRlciBiaXRwYWNraW5nIHdpdGggTVNWQy4KKyAgdW5zaWduZWQgS2luZCA6IDM7CisKKyAgLy8vIFRydWUgaWYgd2UgaGF2ZSBjcmVhdGVkIGEgcmVsb2NhdGlvbiB0aGF0IHVzZXMgdGhpcyBzeW1ib2wuCisgIG11dGFibGUgdW5zaWduZWQgSXNVc2VkSW5SZWxvYyA6IDE7CisKKyAgLy8vIFRoaXMgaXMgYWN0dWFsbHkgYSBDb250ZW50cyBlbnVtZXJhdG9yLCBidXQgaXMgdW5zaWduZWQgdG8gYXZvaWQgc2lnbgorICAvLy8gZXh0ZW5zaW9uIGFuZCBhY2hpZXZlIGJldHRlciBiaXRwYWNraW5nIHdpdGggTVNWQy4KKyAgdW5zaWduZWQgU3ltYm9sQ29udGVudHMgOiAyOworCisgIC8vLyBUaGUgYWxpZ25tZW50IG9mIHRoZSBzeW1ib2wsIGlmIGl0IGlzICdjb21tb24nLCBvciAtMS4KKyAgLy8vCisgIC8vLyBUaGUgYWxpZ25tZW50IGlzIHN0b3JlZCBhcyBsb2cyKGFsaWduKSArIDEuICBUaGlzIGFsbG93cyBhbGwgdmFsdWVzIGZyb20KKyAgLy8vIDAgdG8gMl4zMSB0byBiZSBzdG9yZWQgd2hpY2ggaXMgZXZlcnkgcG93ZXIgb2YgMiByZXByZXNlbnRhYmxlIGJ5IGFuCisgIC8vLyB1bnNpZ25lZC4KKyAgZW51bSA6IHVuc2lnbmVkIHsgTnVtQ29tbW9uQWxpZ25tZW50Qml0cyA9IDUgfTsKKyAgdW5zaWduZWQgQ29tbW9uQWxpZ25Mb2cyIDogTnVtQ29tbW9uQWxpZ25tZW50Qml0czsKKworICAvLy8gVGhlIEZsYWdzIGZpZWxkIGlzIHVzZWQgYnkgb2JqZWN0IGZpbGUgaW1wbGVtZW50YXRpb25zIHRvIHN0b3JlCisgIC8vLyBhZGRpdGlvbmFsIHBlciBzeW1ib2wgaW5mb3JtYXRpb24gd2hpY2ggaXMgbm90IGVhc2lseSBjbGFzc2lmaWVkLgorICBlbnVtIDogdW5zaWduZWQgeyBOdW1GbGFnc0JpdHMgPSAxNiB9OworICBtdXRhYmxlIHVpbnQzMl90IEZsYWdzIDogTnVtRmxhZ3NCaXRzOworCisgIC8vLyBJbmRleCBmaWVsZCwgZm9yIHVzZSBieSB0aGUgb2JqZWN0IGZpbGUgaW1wbGVtZW50YXRpb24uCisgIG11dGFibGUgdWludDMyX3QgSW5kZXggPSAwOworCisgIHVuaW9uIHsKKyAgICAvLy8gVGhlIG9mZnNldCB0byBhcHBseSB0byB0aGUgZnJhZ21lbnQgYWRkcmVzcyB0byBmb3JtIHRoaXMgc3ltYm9sJ3MgdmFsdWUuCisgICAgdWludDY0X3QgT2Zmc2V0OworCisgICAgLy8vIFRoZSBzaXplIG9mIHRoZSBzeW1ib2wsIGlmIGl0IGlzICdjb21tb24nLgorICAgIHVpbnQ2NF90IENvbW1vblNpemU7CisKKyAgICAvLy8gSWYgbm9uLW51bGwsIHRoZSB2YWx1ZSBmb3IgYSB2YXJpYWJsZSBzeW1ib2wuCisgICAgY29uc3QgTUNFeHByICpWYWx1ZTsKKyAgfTsKKworICAvLyBNQ0NvbnRleHQgY3JlYXRlcyBhbmQgdW5pcXVlcyB0aGVzZS4KKyAgZnJpZW5kIGNsYXNzIE1DRXhwcjsKKyAgZnJpZW5kIGNsYXNzIE1DQ29udGV4dDsKKworICAvLy8gXGJyaWVmIFRoZSBuYW1lIGZvciBhIHN5bWJvbC4KKyAgLy8vIE1DU3ltYm9sIGNvbnRhaW5zIGEgdWludDY0X3Qgc28gaXMgcHJvYmFibHkgYWxpZ25lZCB0byA4LiAgT24gYSAzMi1iaXQKKyAgLy8vIHN5c3RlbSwgdGhlIG5hbWUgaXMgYSBwb2ludGVyIHNvIGlzbid0IGdvaW5nIHRvIHNhdGlzZnkgdGhlIDggYnl0ZQorICAvLy8gYWxpZ25tZW50IG9mIHVpbnQ2NF90LiAgQWNjb3VudCBmb3IgdGhhdCBoZXJlLgorICB1c2luZyBOYW1lRW50cnlTdG9yYWdlVHkgPSB1bmlvbiB7CisgICAgY29uc3QgU3RyaW5nTWFwRW50cnk8Ym9vbD4gKk5hbWVFbnRyeTsKKyAgICB1aW50NjRfdCBBbGlnbm1lbnRQYWRkaW5nOworICB9OworCisgIE1DU3ltYm9sKFN5bWJvbEtpbmQgS2luZCwgY29uc3QgU3RyaW5nTWFwRW50cnk8Ym9vbD4gKk5hbWUsIGJvb2wgaXNUZW1wb3JhcnkpCisgICAgICA6IElzVGVtcG9yYXJ5KGlzVGVtcG9yYXJ5KSwgSXNSZWRlZmluYWJsZShmYWxzZSksIElzVXNlZChmYWxzZSksCisgICAgICAgIElzUmVnaXN0ZXJlZChmYWxzZSksIElzRXh0ZXJuYWwoZmFsc2UpLCBJc1ByaXZhdGVFeHRlcm4oZmFsc2UpLAorICAgICAgICBLaW5kKEtpbmQpLCBJc1VzZWRJblJlbG9jKGZhbHNlKSwgU3ltYm9sQ29udGVudHMoU3ltQ29udGVudHNVbnNldCksCisgICAgICAgIENvbW1vbkFsaWduTG9nMigwKSwgRmxhZ3MoMCkgeworICAgIE9mZnNldCA9IDA7CisgICAgRnJhZ21lbnRBbmRIYXNOYW1lLnNldEludCghIU5hbWUpOworICAgIGlmIChOYW1lKQorICAgICAgZ2V0TmFtZUVudHJ5UHRyKCkgPSBOYW1lOworICB9CisKKyAgLy8gUHJvdmlkZSBjdXN0b20gbmV3L2RlbGV0ZSBhcyB3ZSB3aWxsIG9ubHkgYWxsb2NhdGUgc3BhY2UgZm9yIGEgbmFtZQorICAvLyBpZiB3ZSBuZWVkIG9uZS4KKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzLCBjb25zdCBTdHJpbmdNYXBFbnRyeTxib29sPiAqTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KTsKKworcHJpdmF0ZToKKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqKTsKKyAgLy8vIFxicmllZiBQbGFjZW1lbnQgZGVsZXRlIC0gcmVxdWlyZWQgYnkgc3RkLCBidXQgbmV2ZXIgY2FsbGVkLgorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgdW5zaWduZWQpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJDb25zdHJ1Y3RvciB0aHJvd3M/Iik7CisgIH0KKyAgLy8vIFxicmllZiBQbGFjZW1lbnQgZGVsZXRlIC0gcmVxdWlyZWQgYnkgc3RkLCBidXQgbmV2ZXIgY2FsbGVkLgorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgdW5zaWduZWQsIGJvb2wpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJDb25zdHJ1Y3RvciB0aHJvd3M/Iik7CisgIH0KKworICBNQ1NlY3Rpb24gKmdldFNlY3Rpb25QdHIoKSBjb25zdCB7CisgICAgaWYgKE1DRnJhZ21lbnQgKkYgPSBnZXRGcmFnbWVudCgpKSB7CisgICAgICBhc3NlcnQoRiAhPSBBYnNvbHV0ZVBzZXVkb0ZyYWdtZW50KTsKKyAgICAgIHJldHVybiBGLT5nZXRQYXJlbnQoKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgbmFtZSBmaWVsZC4gIFJlcXVpcmVzIHRoYXQgd2UgaGF2ZSBhIG5hbWUKKyAgY29uc3QgU3RyaW5nTWFwRW50cnk8Ym9vbD4gKiZnZXROYW1lRW50cnlQdHIoKSB7CisgICAgYXNzZXJ0KEZyYWdtZW50QW5kSGFzTmFtZS5nZXRJbnQoKSAmJiAiTmFtZSBpcyByZXF1aXJlZCIpOworICAgIE5hbWVFbnRyeVN0b3JhZ2VUeSAqTmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TmFtZUVudHJ5U3RvcmFnZVR5ICo+KHRoaXMpOworICAgIHJldHVybiAoKihOYW1lIC0gMSkpLk5hbWVFbnRyeTsKKyAgfQorICBjb25zdCBTdHJpbmdNYXBFbnRyeTxib29sPiAqJmdldE5hbWVFbnRyeVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxNQ1N5bWJvbCo+KHRoaXMpLT5nZXROYW1lRW50cnlQdHIoKTsKKyAgfQorCitwdWJsaWM6CisgIE1DU3ltYm9sKGNvbnN0IE1DU3ltYm9sICYpID0gZGVsZXRlOworICBNQ1N5bWJvbCAmb3BlcmF0b3I9KGNvbnN0IE1DU3ltYm9sICYpID0gZGVsZXRlOworCisgIC8vLyBnZXROYW1lIC0gR2V0IHRoZSBzeW1ib2wgbmFtZS4KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7CisgICAgaWYgKCFGcmFnbWVudEFuZEhhc05hbWUuZ2V0SW50KCkpCisgICAgICByZXR1cm4gU3RyaW5nUmVmKCk7CisKKyAgICByZXR1cm4gZ2V0TmFtZUVudHJ5UHRyKCktPmZpcnN0KCk7CisgIH0KKworICBib29sIGlzUmVnaXN0ZXJlZCgpIGNvbnN0IHsgcmV0dXJuIElzUmVnaXN0ZXJlZDsgfQorICB2b2lkIHNldElzUmVnaXN0ZXJlZChib29sIFZhbHVlKSBjb25zdCB7IElzUmVnaXN0ZXJlZCA9IFZhbHVlOyB9CisKKyAgdm9pZCBzZXRVc2VkSW5SZWxvYygpIGNvbnN0IHsgSXNVc2VkSW5SZWxvYyA9IHRydWU7IH0KKyAgYm9vbCBpc1VzZWRJblJlbG9jKCkgY29uc3QgeyByZXR1cm4gSXNVc2VkSW5SZWxvYzsgfQorCisgIC8vLyBcbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisKKyAgLy8vIGlzVGVtcG9yYXJ5IC0gQ2hlY2sgaWYgdGhpcyBpcyBhbiBhc3NlbWJsZXIgdGVtcG9yYXJ5IHN5bWJvbC4KKyAgYm9vbCBpc1RlbXBvcmFyeSgpIGNvbnN0IHsgcmV0dXJuIElzVGVtcG9yYXJ5OyB9CisKKyAgLy8vIGlzVXNlZCAtIENoZWNrIGlmIHRoaXMgaXMgdXNlZC4KKyAgYm9vbCBpc1VzZWQoKSBjb25zdCB7IHJldHVybiBJc1VzZWQ7IH0KKworICAvLy8gXGJyaWVmIENoZWNrIGlmIHRoaXMgc3ltYm9sIGlzIHJlZGVmaW5hYmxlLgorICBib29sIGlzUmVkZWZpbmFibGUoKSBjb25zdCB7IHJldHVybiBJc1JlZGVmaW5hYmxlOyB9CisgIC8vLyBcYnJpZWYgTWFyayB0aGlzIHN5bWJvbCBhcyByZWRlZmluYWJsZS4KKyAgdm9pZCBzZXRSZWRlZmluYWJsZShib29sIFZhbHVlKSB7IElzUmVkZWZpbmFibGUgPSBWYWx1ZTsgfQorICAvLy8gXGJyaWVmIFByZXBhcmUgdGhpcyBzeW1ib2wgdG8gYmUgcmVkZWZpbmVkLgorICB2b2lkIHJlZGVmaW5lSWZQb3NzaWJsZSgpIHsKKyAgICBpZiAoSXNSZWRlZmluYWJsZSkgeworICAgICAgaWYgKFN5bWJvbENvbnRlbnRzID09IFN5bUNvbnRlbnRzVmFyaWFibGUpIHsKKyAgICAgICAgVmFsdWUgPSBudWxscHRyOworICAgICAgICBTeW1ib2xDb250ZW50cyA9IFN5bUNvbnRlbnRzVW5zZXQ7CisgICAgICB9CisgICAgICBzZXRVbmRlZmluZWQoKTsKKyAgICAgIElzUmVkZWZpbmFibGUgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIEFzc29jaWF0ZWQgU2VjdGlvbnMKKyAgLy8vIEB7CisKKyAgLy8vIGlzRGVmaW5lZCAtIENoZWNrIGlmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQgKGkuZS4sIGl0IGhhcyBhbiBhZGRyZXNzKS4KKyAgLy8vCisgIC8vLyBEZWZpbmVkIHN5bWJvbHMgYXJlIGVpdGhlciBhYnNvbHV0ZSBvciBpbiBzb21lIHNlY3Rpb24uCisgIGJvb2wgaXNEZWZpbmVkKCkgY29uc3QgeyByZXR1cm4gIWlzVW5kZWZpbmVkKCk7IH0KKworICAvLy8gaXNJblNlY3Rpb24gLSBDaGVjayBpZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIHNvbWUgc2VjdGlvbiAoaS5lLiwgaXQKKyAgLy8vIGlzIGRlZmluZWQgYnV0IG5vdCBhYnNvbHV0ZSkuCisgIGJvb2wgaXNJblNlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRGVmaW5lZCgpICYmICFpc0Fic29sdXRlKCk7CisgIH0KKworICAvLy8gaXNVbmRlZmluZWQgLSBDaGVjayBpZiB0aGlzIHN5bWJvbCB1bmRlZmluZWQgKGkuZS4sIGltcGxpY2l0bHkgZGVmaW5lZCkuCisgIGJvb2wgaXNVbmRlZmluZWQoYm9vbCBTZXRVc2VkID0gdHJ1ZSkgY29uc3QgeworICAgIHJldHVybiBnZXRGcmFnbWVudChTZXRVc2VkKSA9PSBudWxscHRyOworICB9CisKKyAgLy8vIGlzQWJzb2x1dGUgLSBDaGVjayBpZiB0aGlzIGlzIGFuIGFic29sdXRlIHN5bWJvbC4KKyAgYm9vbCBpc0Fic29sdXRlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRGcmFnbWVudCgpID09IEFic29sdXRlUHNldWRvRnJhZ21lbnQ7CisgIH0KKworICAvLy8gR2V0IHRoZSBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIGRlZmluZWQsIG5vbi1hYnNvbHV0ZSBzeW1ib2wuCisgIE1DU2VjdGlvbiAmZ2V0U2VjdGlvbigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNJblNlY3Rpb24oKSAmJiAiSW52YWxpZCBhY2Nlc3NvciEiKTsKKyAgICByZXR1cm4gKmdldFNlY3Rpb25QdHIoKTsKKyAgfQorCisgIC8vLyBNYXJrIHRoZSBzeW1ib2wgYXMgZGVmaW5lZCBpbiB0aGUgZnJhZ21lbnQgXHAgRi4KKyAgdm9pZCBzZXRGcmFnbWVudChNQ0ZyYWdtZW50ICpGKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpc1ZhcmlhYmxlKCkgJiYgIkNhbm5vdCBzZXQgZnJhZ21lbnQgb2YgdmFyaWFibGUiKTsKKyAgICBGcmFnbWVudEFuZEhhc05hbWUuc2V0UG9pbnRlcihGKTsKKyAgfQorCisgIC8vLyBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLgorICB2b2lkIHNldFVuZGVmaW5lZCgpIHsgRnJhZ21lbnRBbmRIYXNOYW1lLnNldFBvaW50ZXIobnVsbHB0cik7IH0KKworICBib29sIGlzRUxGKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBTeW1ib2xLaW5kRUxGOyB9CisKKyAgYm9vbCBpc0NPRkYoKSBjb25zdCB7IHJldHVybiBLaW5kID09IFN5bWJvbEtpbmRDT0ZGOyB9CisKKyAgYm9vbCBpc01hY2hPKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBTeW1ib2xLaW5kTWFjaE87IH0KKworICBib29sIGlzV2FzbSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gU3ltYm9sS2luZFdhc207IH0KKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIFZhcmlhYmxlIFN5bWJvbHMKKyAgLy8vIEB7CisKKyAgLy8vIGlzVmFyaWFibGUgLSBDaGVjayBpZiB0aGlzIGlzIGEgdmFyaWFibGUgc3ltYm9sLgorICBib29sIGlzVmFyaWFibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIFN5bWJvbENvbnRlbnRzID09IFN5bUNvbnRlbnRzVmFyaWFibGU7CisgIH0KKworICAvLy8gZ2V0VmFyaWFibGVWYWx1ZSAtIEdldCB0aGUgdmFsdWUgZm9yIHZhcmlhYmxlIHN5bWJvbHMuCisgIGNvbnN0IE1DRXhwciAqZ2V0VmFyaWFibGVWYWx1ZShib29sIFNldFVzZWQgPSB0cnVlKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzVmFyaWFibGUoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciEiKTsKKyAgICBJc1VzZWQgfD0gU2V0VXNlZDsKKyAgICByZXR1cm4gVmFsdWU7CisgIH0KKworICB2b2lkIHNldFZhcmlhYmxlVmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSk7CisKKyAgLy8vIEB9CisKKyAgLy8vIEdldCB0aGUgKGltcGxlbWVudGF0aW9uIGRlZmluZWQpIGluZGV4LgorICB1aW50MzJfdCBnZXRJbmRleCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5kZXg7CisgIH0KKworICAvLy8gU2V0IHRoZSAoaW1wbGVtZW50YXRpb24gZGVmaW5lZCkgaW5kZXguCisgIHZvaWQgc2V0SW5kZXgodWludDMyX3QgVmFsdWUpIGNvbnN0IHsKKyAgICBJbmRleCA9IFZhbHVlOworICB9CisKKyAgdWludDY0X3QgZ2V0T2Zmc2V0KCkgY29uc3QgeworICAgIGFzc2VydCgoU3ltYm9sQ29udGVudHMgPT0gU3ltQ29udGVudHNVbnNldCB8fAorICAgICAgICAgICAgU3ltYm9sQ29udGVudHMgPT0gU3ltQ29udGVudHNPZmZzZXQpICYmCisgICAgICAgICAgICJDYW5ub3QgZ2V0IG9mZnNldCBmb3IgYSBjb21tb24vdmFyaWFibGUgc3ltYm9sIik7CisgICAgcmV0dXJuIE9mZnNldDsKKyAgfQorICB2b2lkIHNldE9mZnNldCh1aW50NjRfdCBWYWx1ZSkgeworICAgIGFzc2VydCgoU3ltYm9sQ29udGVudHMgPT0gU3ltQ29udGVudHNVbnNldCB8fAorICAgICAgICAgICAgU3ltYm9sQ29udGVudHMgPT0gU3ltQ29udGVudHNPZmZzZXQpICYmCisgICAgICAgICAgICJDYW5ub3Qgc2V0IG9mZnNldCBmb3IgYSBjb21tb24vdmFyaWFibGUgc3ltYm9sIik7CisgICAgT2Zmc2V0ID0gVmFsdWU7CisgICAgU3ltYm9sQ29udGVudHMgPSBTeW1Db250ZW50c09mZnNldDsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHNpemUgb2YgYSAnY29tbW9uJyBzeW1ib2wuCisgIHVpbnQ2NF90IGdldENvbW1vblNpemUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQ29tbW9uKCkgJiYgIk5vdCBhICdjb21tb24nIHN5bWJvbCEiKTsKKyAgICByZXR1cm4gQ29tbW9uU2l6ZTsKKyAgfQorCisgIC8vLyBNYXJrIHRoaXMgc3ltYm9sIGFzIGJlaW5nICdjb21tb24nLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTaXplIC0gVGhlIHNpemUgb2YgdGhlIHN5bWJvbC4KKyAgLy8vIFxwYXJhbSBBbGlnbiAtIFRoZSBhbGlnbm1lbnQgb2YgdGhlIHN5bWJvbC4KKyAgdm9pZCBzZXRDb21tb24odWludDY0X3QgU2l6ZSwgdW5zaWduZWQgQWxpZ24pIHsKKyAgICBhc3NlcnQoZ2V0T2Zmc2V0KCkgPT0gMCk7CisgICAgQ29tbW9uU2l6ZSA9IFNpemU7CisgICAgU3ltYm9sQ29udGVudHMgPSBTeW1Db250ZW50c0NvbW1vbjsKKworICAgIGFzc2VydCgoIUFsaWduIHx8IGlzUG93ZXJPZjJfMzIoQWxpZ24pKSAmJgorICAgICAgICAgICAiQWxpZ25tZW50IG11c3QgYmUgYSBwb3dlciBvZiAyIik7CisgICAgdW5zaWduZWQgTG9nMkFsaWduID0gTG9nMl8zMihBbGlnbikgKyAxOworICAgIGFzc2VydChMb2cyQWxpZ24gPCAoMVUgPDwgTnVtQ29tbW9uQWxpZ25tZW50Qml0cykgJiYKKyAgICAgICAgICAgIk91dCBvZiByYW5nZSBhbGlnbm1lbnQiKTsKKyAgICBDb21tb25BbGlnbkxvZzIgPSBMb2cyQWxpZ247CisgIH0KKworICAvLy8gIFJldHVybiB0aGUgYWxpZ25tZW50IG9mIGEgJ2NvbW1vbicgc3ltYm9sLgorICB1bnNpZ25lZCBnZXRDb21tb25BbGlnbm1lbnQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQ29tbW9uKCkgJiYgIk5vdCBhICdjb21tb24nIHN5bWJvbCEiKTsKKyAgICByZXR1cm4gQ29tbW9uQWxpZ25Mb2cyID8gKDFVIDw8IChDb21tb25BbGlnbkxvZzIgLSAxKSkgOiAwOworICB9CisKKyAgLy8vIERlY2xhcmUgdGhpcyBzeW1ib2wgYXMgYmVpbmcgJ2NvbW1vbicuCisgIC8vLworICAvLy8gXHBhcmFtIFNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sLgorICAvLy8gXHBhcmFtIEFsaWduIC0gVGhlIGFsaWdubWVudCBvZiB0aGUgc3ltYm9sLgorICAvLy8gXHJldHVybiBUcnVlIGlmIHN5bWJvbCB3YXMgYWxyZWFkeSBkZWNsYXJlZCBhcyBhIGRpZmZlcmVudCB0eXBlCisgIGJvb2wgZGVjbGFyZUNvbW1vbih1aW50NjRfdCBTaXplLCB1bnNpZ25lZCBBbGlnbikgeworICAgIGFzc2VydChpc0NvbW1vbigpIHx8IGdldE9mZnNldCgpID09IDApOworICAgIGlmKGlzQ29tbW9uKCkpIHsKKyAgICAgIGlmKENvbW1vblNpemUgIT0gU2l6ZSB8fCBnZXRDb21tb25BbGlnbm1lbnQoKSAhPSBBbGlnbikKKyAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UKKyAgICAgIHNldENvbW1vbihTaXplLCBBbGlnbik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIElzIHRoaXMgYSAnY29tbW9uJyBzeW1ib2wuCisgIGJvb2wgaXNDb21tb24oKSBjb25zdCB7CisgICAgcmV0dXJuIFN5bWJvbENvbnRlbnRzID09IFN5bUNvbnRlbnRzQ29tbW9uOworICB9CisKKyAgTUNGcmFnbWVudCAqZ2V0RnJhZ21lbnQoYm9vbCBTZXRVc2VkID0gdHJ1ZSkgY29uc3QgeworICAgIE1DRnJhZ21lbnQgKkZyYWdtZW50ID0gRnJhZ21lbnRBbmRIYXNOYW1lLmdldFBvaW50ZXIoKTsKKyAgICBpZiAoRnJhZ21lbnQgfHwgIWlzVmFyaWFibGUoKSkKKyAgICAgIHJldHVybiBGcmFnbWVudDsKKyAgICBGcmFnbWVudCA9IGdldFZhcmlhYmxlVmFsdWUoU2V0VXNlZCktPmZpbmRBc3NvY2lhdGVkRnJhZ21lbnQoKTsKKyAgICBGcmFnbWVudEFuZEhhc05hbWUuc2V0UG9pbnRlcihGcmFnbWVudCk7CisgICAgcmV0dXJuIEZyYWdtZW50OworICB9CisKKyAgYm9vbCBpc0V4dGVybmFsKCkgY29uc3QgeyByZXR1cm4gSXNFeHRlcm5hbDsgfQorICB2b2lkIHNldEV4dGVybmFsKGJvb2wgVmFsdWUpIGNvbnN0IHsgSXNFeHRlcm5hbCA9IFZhbHVlOyB9CisKKyAgYm9vbCBpc1ByaXZhdGVFeHRlcm4oKSBjb25zdCB7IHJldHVybiBJc1ByaXZhdGVFeHRlcm47IH0KKyAgdm9pZCBzZXRQcml2YXRlRXh0ZXJuKGJvb2wgVmFsdWUpIHsgSXNQcml2YXRlRXh0ZXJuID0gVmFsdWU7IH0KKworICAvLy8gcHJpbnQgLSBQcmludCB0aGUgdmFsdWUgdG8gdGhlIHN0cmVhbSBccCBPUy4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1DQXNtSW5mbyAqTUFJKSBjb25zdDsKKworICAvLy8gZHVtcCAtIFByaW50IHRoZSB2YWx1ZSB0byBzdGRlcnIuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIC8vLyBHZXQgdGhlIChpbXBsZW1lbnRhdGlvbiBkZWZpbmVkKSBzeW1ib2wgZmxhZ3MuCisgIHVpbnQzMl90IGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gRmxhZ3M7IH0KKworICAvLy8gU2V0IHRoZSAoaW1wbGVtZW50YXRpb24gZGVmaW5lZCkgc3ltYm9sIGZsYWdzLgorICB2b2lkIHNldEZsYWdzKHVpbnQzMl90IFZhbHVlKSBjb25zdCB7CisgICAgYXNzZXJ0KFZhbHVlIDwgKDFVIDw8IE51bUZsYWdzQml0cykgJiYgIk91dCBvZiByYW5nZSBmbGFncyIpOworICAgIEZsYWdzID0gVmFsdWU7CisgIH0KKworICAvLy8gTW9kaWZ5IHRoZSBmbGFncyB2aWEgYSBtYXNrCisgIHZvaWQgbW9kaWZ5RmxhZ3ModWludDMyX3QgVmFsdWUsIHVpbnQzMl90IE1hc2spIGNvbnN0IHsKKyAgICBhc3NlcnQoVmFsdWUgPCAoMVUgPDwgTnVtRmxhZ3NCaXRzKSAmJiAiT3V0IG9mIHJhbmdlIGZsYWdzIik7CisgICAgRmxhZ3MgPSAoRmxhZ3MgJiB+TWFzaykgfCBWYWx1ZTsKKyAgfQorfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTUNTeW1ib2wgJlN5bSkgeworICBTeW0ucHJpbnQoT1MsIG51bGxwdHIpOworICByZXR1cm4gT1M7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DU1lNQk9MX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTeW1ib2xDT0ZGLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU3ltYm9sQ09GRi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MThjMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU3ltYm9sQ09GRi5oCkBAIC0wLDAgKzEsNjcgQEAKKy8vPT09LSBNQ1N5bWJvbENPRkYuaCAtICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1NZTUJPTENPRkZfSAorI2RlZmluZSBMTFZNX01DX01DU1lNQk9MQ09GRl9ICisKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ1N5bWJvbENPRkYgOiBwdWJsaWMgTUNTeW1ib2wgeworICAvLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgZV90eXBlIGZpZWxkIG9mIHRoZSBDT0ZGIHN5bWJvbC4KKyAgbXV0YWJsZSB1aW50MTZfdCBUeXBlID0gMDsKKworICBlbnVtIFN5bWJvbEZsYWdzIDogdWludDE2X3QgeworICAgIFNGX0NsYXNzTWFzayA9IDB4MDBGRiwKKyAgICBTRl9DbGFzc1NoaWZ0ID0gMCwKKworICAgIFNGX1dlYWtFeHRlcm5hbCA9IDB4MDEwMCwKKyAgICBTRl9TYWZlU0VIID0gMHgwMjAwLAorICB9OworCitwdWJsaWM6CisgIE1DU3ltYm9sQ09GRihjb25zdCBTdHJpbmdNYXBFbnRyeTxib29sPiAqTmFtZSwgYm9vbCBpc1RlbXBvcmFyeSkKKyAgICAgIDogTUNTeW1ib2woU3ltYm9sS2luZENPRkYsIE5hbWUsIGlzVGVtcG9yYXJ5KSB7fQorCisgIHVpbnQxNl90IGdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIFR5cGU7CisgIH0KKyAgdm9pZCBzZXRUeXBlKHVpbnQxNl90IFR5KSBjb25zdCB7CisgICAgVHlwZSA9IFR5OworICB9CisKKyAgdWludDE2X3QgZ2V0Q2xhc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRGbGFncygpICYgU0ZfQ2xhc3NNYXNrKSA+PiBTRl9DbGFzc1NoaWZ0OworICB9CisgIHZvaWQgc2V0Q2xhc3ModWludDE2X3QgU3RvcmFnZUNsYXNzKSBjb25zdCB7CisgICAgbW9kaWZ5RmxhZ3MoU3RvcmFnZUNsYXNzIDw8IFNGX0NsYXNzU2hpZnQsIFNGX0NsYXNzTWFzayk7CisgIH0KKworICBib29sIGlzV2Vha0V4dGVybmFsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRGbGFncygpICYgU0ZfV2Vha0V4dGVybmFsOworICB9CisgIHZvaWQgc2V0SXNXZWFrRXh0ZXJuYWwoKSBjb25zdCB7CisgICAgbW9kaWZ5RmxhZ3MoU0ZfV2Vha0V4dGVybmFsLCBTRl9XZWFrRXh0ZXJuYWwpOworICB9CisKKyAgYm9vbCBpc1NhZmVTRUgoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEZsYWdzKCkgJiBTRl9TYWZlU0VIOworICB9CisgIHZvaWQgc2V0SXNTYWZlU0VIKCkgY29uc3QgeworICAgIG1vZGlmeUZsYWdzKFNGX1NhZmVTRUgsIFNGX1NhZmVTRUgpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ1N5bWJvbCAqUykgeyByZXR1cm4gUy0+aXNDT0ZGKCk7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DU1lNQk9MQ09GRl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU3ltYm9sRUxGLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU3ltYm9sRUxGLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjZDIyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTeW1ib2xFTEYuaApAQCAtMCwwICsxLDU0IEBACisvLz09PS0gTUNTeW1ib2xFTEYuaCAtICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX01DX01DU1lNQk9MRUxGX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1NZTUJPTEVMRl9ICisKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1DU3ltYm9sRUxGIDogcHVibGljIE1DU3ltYm9sIHsKKyAgLy8vIEFuIGV4cHJlc3Npb24gZGVzY3JpYmluZyBob3cgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIGEgc3ltYm9sLiBJZiBhCisgIC8vLyBzeW1ib2wgaGFzIG5vIHNpemUgdGhpcyBmaWVsZCB3aWxsIGJlIE5VTEwuCisgIGNvbnN0IE1DRXhwciAqU3ltYm9sU2l6ZSA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgTUNTeW1ib2xFTEYoY29uc3QgU3RyaW5nTWFwRW50cnk8Ym9vbD4gKk5hbWUsIGJvb2wgaXNUZW1wb3JhcnkpCisgICAgICA6IE1DU3ltYm9sKFN5bWJvbEtpbmRFTEYsIE5hbWUsIGlzVGVtcG9yYXJ5KSB7fQorICB2b2lkIHNldFNpemUoY29uc3QgTUNFeHByICpTUykgeyBTeW1ib2xTaXplID0gU1M7IH0KKworICBjb25zdCBNQ0V4cHIgKmdldFNpemUoKSBjb25zdCB7IHJldHVybiBTeW1ib2xTaXplOyB9CisKKyAgdm9pZCBzZXRWaXNpYmlsaXR5KHVuc2lnbmVkIFZpc2liaWxpdHkpOworICB1bnNpZ25lZCBnZXRWaXNpYmlsaXR5KCkgY29uc3Q7CisKKyAgdm9pZCBzZXRPdGhlcih1bnNpZ25lZCBPdGhlcik7CisgIHVuc2lnbmVkIGdldE90aGVyKCkgY29uc3Q7CisKKyAgdm9pZCBzZXRUeXBlKHVuc2lnbmVkIFR5cGUpIGNvbnN0OworICB1bnNpZ25lZCBnZXRUeXBlKCkgY29uc3Q7CisKKyAgdm9pZCBzZXRCaW5kaW5nKHVuc2lnbmVkIEJpbmRpbmcpIGNvbnN0OworICB1bnNpZ25lZCBnZXRCaW5kaW5nKCkgY29uc3Q7CisKKyAgYm9vbCBpc0JpbmRpbmdTZXQoKSBjb25zdDsKKworICB2b2lkIHNldElzV2Vha3JlZlVzZWRJblJlbG9jKCkgY29uc3Q7CisgIGJvb2wgaXNXZWFrcmVmVXNlZEluUmVsb2MoKSBjb25zdDsKKworICB2b2lkIHNldElzU2lnbmF0dXJlKCkgY29uc3Q7CisgIGJvb2wgaXNTaWduYXR1cmUoKSBjb25zdDsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DU3ltYm9sICpTKSB7IHJldHVybiBTLT5pc0VMRigpOyB9CisKK3ByaXZhdGU6CisgIHZvaWQgc2V0SXNCaW5kaW5nU2V0KCkgY29uc3Q7Cit9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTeW1ib2xNYWNoTy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1N5bWJvbE1hY2hPLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyMjBlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTeW1ib2xNYWNoTy5oCkBAIC0wLDAgKzEsMTM2IEBACisvLz09PS0gTUNTeW1ib2xNYWNoTy5oIC0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX01DX01DU1lNQk9MTUFDSE9fSAorI2RlZmluZSBMTFZNX01DX01DU1lNQk9MTUFDSE9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1DU3ltYm9sTWFjaE8gOiBwdWJsaWMgTUNTeW1ib2wgeworICAvLy8gXGJyaWVmIFdlIHN0b3JlIHRoZSB2YWx1ZSBmb3IgdGhlICdkZXNjJyBzeW1ib2wgZmllbGQgaW4gdGhlCisgIC8vLyBsb3dlc3QgMTYgYml0cyBvZiB0aGUgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBmbGFncy4KKyAgZW51bSBNYWNoT1N5bWJvbEZsYWdzIDogdWludDE2X3QgeyAvLyBTZWUgPG1hY2gtby9ubGlzdC5oPi4KKyAgICBTRl9EZXNjRmxhZ3NNYXNrICAgICAgICAgICAgICAgICAgICAgICAgPSAweEZGRkYsCisKKyAgICAvLyBSZWZlcmVuY2UgdHlwZSBmbGFncy4KKyAgICBTRl9SZWZlcmVuY2VUeXBlTWFzayAgICAgICAgICAgICAgICAgICAgPSAweDAwMDcsCisgICAgU0ZfUmVmZXJlbmNlVHlwZVVuZGVmaW5lZE5vbkxhenkgICAgICAgID0gMHgwMDAwLAorICAgIFNGX1JlZmVyZW5jZVR5cGVVbmRlZmluZWRMYXp5ICAgICAgICAgICA9IDB4MDAwMSwKKyAgICBTRl9SZWZlcmVuY2VUeXBlRGVmaW5lZCAgICAgICAgICAgICAgICAgPSAweDAwMDIsCisgICAgU0ZfUmVmZXJlbmNlVHlwZVByaXZhdGVEZWZpbmVkICAgICAgICAgID0gMHgwMDAzLAorICAgIFNGX1JlZmVyZW5jZVR5cGVQcml2YXRlVW5kZWZpbmVkTm9uTGF6eSA9IDB4MDAwNCwKKyAgICBTRl9SZWZlcmVuY2VUeXBlUHJpdmF0ZVVuZGVmaW5lZExhenkgICAgPSAweDAwMDUsCisKKyAgICAvLyBPdGhlciAnZGVzYycgZmxhZ3MuCisgICAgU0ZfVGh1bWJGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA4LAorICAgIFNGX05vRGVhZFN0cmlwICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAyMCwKKyAgICBTRl9XZWFrUmVmZXJlbmNlICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwNDAsCisgICAgU0ZfV2Vha0RlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDgwLAorICAgIFNGX1N5bWJvbFJlc29sdmVyICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDEwMCwKKyAgICBTRl9BbHRFbnRyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDAsCisKKyAgICAvLyBDb21tb24gYWxpZ25tZW50CisgICAgU0ZfQ29tbW9uQWxpZ25tZW50TWFzayAgICAgICAgICAgICAgICAgID0gMHhGMEZGLAorICAgIFNGX0NvbW1vbkFsaWdubWVudFNoaWZ0ICAgICAgICAgICAgICAgICA9IDgKKyAgfTsKKworcHVibGljOgorICBNQ1N5bWJvbE1hY2hPKGNvbnN0IFN0cmluZ01hcEVudHJ5PGJvb2w+ICpOYW1lLCBib29sIGlzVGVtcG9yYXJ5KQorICAgICAgOiBNQ1N5bWJvbChTeW1ib2xLaW5kTWFjaE8sIE5hbWUsIGlzVGVtcG9yYXJ5KSB7fQorCisgIC8vIFJlZmVyZW5jZSB0eXBlIG1ldGhvZHMuCisKKyAgdm9pZCBjbGVhclJlZmVyZW5jZVR5cGUoKSBjb25zdCB7CisgICAgbW9kaWZ5RmxhZ3MoMCwgU0ZfUmVmZXJlbmNlVHlwZU1hc2spOworICB9CisKKyAgdm9pZCBzZXRSZWZlcmVuY2VUeXBlVW5kZWZpbmVkTGF6eShib29sIFZhbHVlKSBjb25zdCB7CisgICAgbW9kaWZ5RmxhZ3MoVmFsdWUgPyBTRl9SZWZlcmVuY2VUeXBlVW5kZWZpbmVkTGF6eSA6IDAsCisgICAgICAgICAgICAgICAgU0ZfUmVmZXJlbmNlVHlwZVVuZGVmaW5lZExhenkpOworICB9CisKKyAgLy8gT3RoZXIgJ2Rlc2MnIG1ldGhvZHMuCisKKyAgdm9pZCBzZXRUaHVtYkZ1bmMoKSBjb25zdCB7CisgICAgbW9kaWZ5RmxhZ3MoU0ZfVGh1bWJGdW5jLCBTRl9UaHVtYkZ1bmMpOworICB9CisKKyAgYm9vbCBpc05vRGVhZFN0cmlwKCkgY29uc3QgeworICAgIHJldHVybiBnZXRGbGFncygpICYgU0ZfTm9EZWFkU3RyaXA7CisgIH0KKyAgdm9pZCBzZXROb0RlYWRTdHJpcCgpIGNvbnN0IHsKKyAgICBtb2RpZnlGbGFncyhTRl9Ob0RlYWRTdHJpcCwgU0ZfTm9EZWFkU3RyaXApOworICB9CisKKyAgYm9vbCBpc1dlYWtSZWZlcmVuY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEZsYWdzKCkgJiBTRl9XZWFrUmVmZXJlbmNlOworICB9CisgIHZvaWQgc2V0V2Vha1JlZmVyZW5jZSgpIGNvbnN0IHsKKyAgICBtb2RpZnlGbGFncyhTRl9XZWFrUmVmZXJlbmNlLCBTRl9XZWFrUmVmZXJlbmNlKTsKKyAgfQorCisgIGJvb2wgaXNXZWFrRGVmaW5pdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RmxhZ3MoKSAmIFNGX1dlYWtEZWZpbml0aW9uOworICB9CisgIHZvaWQgc2V0V2Vha0RlZmluaXRpb24oKSBjb25zdCB7CisgICAgbW9kaWZ5RmxhZ3MoU0ZfV2Vha0RlZmluaXRpb24sIFNGX1dlYWtEZWZpbml0aW9uKTsKKyAgfQorCisgIGJvb2wgaXNTeW1ib2xSZXNvbHZlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RmxhZ3MoKSAmIFNGX1N5bWJvbFJlc29sdmVyOworICB9CisgIHZvaWQgc2V0U3ltYm9sUmVzb2x2ZXIoKSBjb25zdCB7CisgICAgbW9kaWZ5RmxhZ3MoU0ZfU3ltYm9sUmVzb2x2ZXIsIFNGX1N5bWJvbFJlc29sdmVyKTsKKyAgfQorCisgIHZvaWQgc2V0QWx0RW50cnkoKSBjb25zdCB7CisgICAgbW9kaWZ5RmxhZ3MoU0ZfQWx0RW50cnksIFNGX0FsdEVudHJ5KTsKKyAgfQorCisgIGJvb2wgaXNBbHRFbnRyeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RmxhZ3MoKSAmIFNGX0FsdEVudHJ5OworICB9CisKKyAgdm9pZCBzZXREZXNjKHVuc2lnbmVkIFZhbHVlKSBjb25zdCB7CisgICAgYXNzZXJ0KFZhbHVlID09IChWYWx1ZSAmIFNGX0Rlc2NGbGFnc01hc2spICYmCisgICAgICAgICAgICJJbnZhbGlkIC5kZXNjIHZhbHVlISIpOworICAgIHNldEZsYWdzKFZhbHVlICYgU0ZfRGVzY0ZsYWdzTWFzayk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgZW5jb2RlZCB2YWx1ZSBvZiB0aGUgZmxhZ3MgYXMgdGhleSB3aWxsIGJlIGVtaXR0ZWQgaW4gdG8KKyAgLy8vIHRoZSBNYWNoTyBiaW5hcnkKKyAgdWludDE2X3QgZ2V0RW5jb2RlZEZsYWdzKGJvb2wgRW5jb2RlQXNBbHRFbnRyeSkgY29uc3QgeworICAgIHVpbnQxNl90IEZsYWdzID0gZ2V0RmxhZ3MoKTsKKworICAgIC8vIENvbW1vbiBhbGlnbm1lbnQgaXMgcGFja2VkIGludG8gdGhlICdkZXNjJyBiaXRzLgorICAgIGlmIChpc0NvbW1vbigpKSB7CisgICAgICBpZiAodW5zaWduZWQgQWxpZ24gPSBnZXRDb21tb25BbGlnbm1lbnQoKSkgeworICAgICAgICB1bnNpZ25lZCBMb2cyU2l6ZSA9IExvZzJfMzIoQWxpZ24pOworICAgICAgICBhc3NlcnQoKDFVIDw8IExvZzJTaXplKSA9PSBBbGlnbiAmJiAiSW52YWxpZCAnY29tbW9uJyBhbGlnbm1lbnQhIik7CisgICAgICAgIGlmIChMb2cyU2l6ZSA+IDE1KQorICAgICAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiaW52YWxpZCAnY29tbW9uJyBhbGlnbm1lbnQgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUd2luZShBbGlnbikgKyAiJyBmb3IgJyIgKyBnZXROYW1lKCkgKyAiJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgRmxhZ3MgPSAoRmxhZ3MgJiBTRl9Db21tb25BbGlnbm1lbnRNYXNrKSB8CisgICAgICAgICAgICAgICAgKExvZzJTaXplIDw8IFNGX0NvbW1vbkFsaWdubWVudFNoaWZ0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoRW5jb2RlQXNBbHRFbnRyeSkKKyAgICAgIEZsYWdzIHw9IFNGX0FsdEVudHJ5OworCisgICAgcmV0dXJuIEZsYWdzOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ1N5bWJvbCAqUykgeyByZXR1cm4gUy0+aXNNYWNoTygpOyB9Cit9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTeW1ib2xXYXNtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU3ltYm9sV2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZWFkYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU3ltYm9sV2FzbS5oCkBAIC0wLDAgKzEsOTYgQEAKKy8vPT09LSBNQ1N5bWJvbFdhc20uaCAtICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fTUNfTUNTWU1CT0xXQVNNX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1NZTUJPTFdBU01fSAorCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvV2FzbS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ1N5bWJvbFdhc20gOiBwdWJsaWMgTUNTeW1ib2wgeworICB3YXNtOjpXYXNtU3ltYm9sVHlwZSBUeXBlID0gd2FzbTo6V0FTTV9TWU1CT0xfVFlQRV9EQVRBOworICBib29sIElzV2VhayA9IGZhbHNlOworICBib29sIElzSGlkZGVuID0gZmFsc2U7CisgIGJvb2wgSXNDb21kYXQgPSBmYWxzZTsKKyAgc3RkOjpzdHJpbmcgTW9kdWxlTmFtZTsKKyAgU21hbGxWZWN0b3I8d2FzbTo6VmFsVHlwZSwgMT4gUmV0dXJuczsKKyAgU21hbGxWZWN0b3I8d2FzbTo6VmFsVHlwZSwgND4gUGFyYW1zOworICB3YXNtOjpXYXNtR2xvYmFsVHlwZSBHbG9iYWxUeXBlOworICBib29sIFBhcmFtc1NldCA9IGZhbHNlOworICBib29sIFJldHVybnNTZXQgPSBmYWxzZTsKKyAgYm9vbCBHbG9iYWxUeXBlU2V0ID0gZmFsc2U7CisKKyAgLy8vIEFuIGV4cHJlc3Npb24gZGVzY3JpYmluZyBob3cgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIGEgc3ltYm9sLiBJZiBhCisgIC8vLyBzeW1ib2wgaGFzIG5vIHNpemUgdGhpcyBmaWVsZCB3aWxsIGJlIE5VTEwuCisgIGNvbnN0IE1DRXhwciAqU3ltYm9sU2l6ZSA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgLy8gVXNlIGEgbW9kdWxlIG5hbWUgb2YgImVudiIgZm9yIG5vdywgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyB0b29scy4KKyAgLy8gVGhpcyBpcyB0ZW1wb3JhcnksIGFuZCBtYXkgY2hhbmdlLCBhcyB0aGUgQUJJIGlzIG5vdCB5ZXQgc3RhYmxlLgorICBNQ1N5bWJvbFdhc20oY29uc3QgU3RyaW5nTWFwRW50cnk8Ym9vbD4gKk5hbWUsIGJvb2wgaXNUZW1wb3JhcnkpCisgICAgICA6IE1DU3ltYm9sKFN5bWJvbEtpbmRXYXNtLCBOYW1lLCBpc1RlbXBvcmFyeSksCisgICAgICAgIE1vZHVsZU5hbWUoImVudiIpIHt9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNTeW1ib2wgKlMpIHsgcmV0dXJuIFMtPmlzV2FzbSgpOyB9CisKKyAgY29uc3QgTUNFeHByICpnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gU3ltYm9sU2l6ZTsgfQorICB2b2lkIHNldFNpemUoY29uc3QgTUNFeHByICpTUykgeyBTeW1ib2xTaXplID0gU1M7IH0KKworICBib29sIGlzRnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBUeXBlID09IHdhc206OldBU01fU1lNQk9MX1RZUEVfRlVOQ1RJT047IH0KKyAgYm9vbCBpc0RhdGEoKSBjb25zdCB7IHJldHVybiBUeXBlID09IHdhc206OldBU01fU1lNQk9MX1RZUEVfREFUQTsgfQorICBib29sIGlzR2xvYmFsKCkgY29uc3QgeyByZXR1cm4gVHlwZSA9PSB3YXNtOjpXQVNNX1NZTUJPTF9UWVBFX0dMT0JBTDsgfQorICB3YXNtOjpXYXNtU3ltYm9sVHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVHlwZTsgfQorICB2b2lkIHNldFR5cGUod2FzbTo6V2FzbVN5bWJvbFR5cGUgdHlwZSkgeyBUeXBlID0gdHlwZTsgfQorCisgIGJvb2wgaXNXZWFrKCkgY29uc3QgeyByZXR1cm4gSXNXZWFrOyB9CisgIHZvaWQgc2V0V2Vhayhib29sIGlzV2VhaykgeyBJc1dlYWsgPSBpc1dlYWs7IH0KKworICBib29sIGlzSGlkZGVuKCkgY29uc3QgeyByZXR1cm4gSXNIaWRkZW47IH0KKyAgdm9pZCBzZXRIaWRkZW4oYm9vbCBpc0hpZGRlbikgeyBJc0hpZGRlbiA9IGlzSGlkZGVuOyB9CisKKyAgYm9vbCBpc0NvbWRhdCgpIGNvbnN0IHsgcmV0dXJuIElzQ29tZGF0OyB9CisgIHZvaWQgc2V0Q29tZGF0KGJvb2wgaXNDb21kYXQpIHsgSXNDb21kYXQgPSBpc0NvbWRhdDsgfQorCisgIGNvbnN0IFN0cmluZ1JlZiBnZXRNb2R1bGVOYW1lKCkgY29uc3QgeyByZXR1cm4gTW9kdWxlTmFtZTsgfQorICB2b2lkIHNldE1vZHVsZU5hbWUoU3RyaW5nUmVmIE5hbWUpIHsgTW9kdWxlTmFtZSA9IE5hbWU7IH0KKworICBjb25zdCBTbWFsbFZlY3Rvcjx3YXNtOjpWYWxUeXBlLCAxPiAmZ2V0UmV0dXJucygpIGNvbnN0IHsKKyAgICBhc3NlcnQoUmV0dXJuc1NldCk7CisgICAgcmV0dXJuIFJldHVybnM7CisgIH0KKworICB2b2lkIHNldFJldHVybnMoU21hbGxWZWN0b3JJbXBsPHdhc206OlZhbFR5cGU+ICYmUmV0cykgeworICAgIFJldHVybnNTZXQgPSB0cnVlOworICAgIFJldHVybnMgPSBzdGQ6Om1vdmUoUmV0cyk7CisgIH0KKworICBjb25zdCBTbWFsbFZlY3Rvcjx3YXNtOjpWYWxUeXBlLCA0PiAmZ2V0UGFyYW1zKCkgY29uc3QgeworICAgIGFzc2VydChQYXJhbXNTZXQpOworICAgIHJldHVybiBQYXJhbXM7CisgIH0KKworICB2b2lkIHNldFBhcmFtcyhTbWFsbFZlY3RvckltcGw8d2FzbTo6VmFsVHlwZT4gJiZQYXJzKSB7CisgICAgUGFyYW1zU2V0ID0gdHJ1ZTsKKyAgICBQYXJhbXMgPSBzdGQ6Om1vdmUoUGFycyk7CisgIH0KKworICBjb25zdCB3YXNtOjpXYXNtR2xvYmFsVHlwZSAmZ2V0R2xvYmFsVHlwZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoR2xvYmFsVHlwZVNldCk7CisgICAgcmV0dXJuIEdsb2JhbFR5cGU7CisgIH0KKworICB2b2lkIHNldEdsb2JhbFR5cGUod2FzbTo6V2FzbUdsb2JhbFR5cGUgR1QpIHsKKyAgICBHbG9iYWxUeXBlU2V0ID0gdHJ1ZTsKKyAgICBHbG9iYWxUeXBlID0gR1Q7CisgIH0KK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ1NZTUJPTFdBU01fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1RhcmdldE9wdGlvbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNUYXJnZXRPcHRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkMzMwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNUYXJnZXRPcHRpb25zLmgKQEAgLTAsMCArMSw4MCBAQAorLy89PT0tIE1DVGFyZ2V0T3B0aW9ucy5oIC0gTUMgVGFyZ2V0IE9wdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DVEFSR0VUT1BUSU9OU19ICisjZGVmaW5lIExMVk1fTUNfTUNUQVJHRVRPUFRJT05TX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworZW51bSBjbGFzcyBFeGNlcHRpb25IYW5kbGluZyB7CisgIE5vbmUsICAgICAvLy8gTm8gZXhjZXB0aW9uIHN1cHBvcnQKKyAgRHdhcmZDRkksIC8vLyBEV0FSRi1saWtlIGluc3RydWN0aW9uIGJhc2VkIGV4Y2VwdGlvbnMKKyAgU2pMaiwgICAgIC8vLyBzZXRqbXAvbG9uZ2ptcCBiYXNlZCBleGNlcHRpb25zCisgIEFSTSwgICAgICAvLy8gQVJNIEVIQUJJCisgIFdpbkVILCAgICAvLy8gV2luZG93cyBFeGNlcHRpb24gSGFuZGxpbmcKKyAgV2FzbSwgICAgIC8vLyBXZWJBc3NlbWJseSBFeGNlcHRpb24gSGFuZGxpbmcKK307CisKK2VudW0gY2xhc3MgRGVidWdDb21wcmVzc2lvblR5cGUgeworICBOb25lLCAvLy8gTm8gY29tcHJlc3Npb24KKyAgR05VLCAgLy8vIHpsaWItZ251IHN0eWxlIGNvbXByZXNzaW9uCisgIFosICAgIC8vLyB6bGliIHN0eWxlIGNvbXBsZXNzaW9uCit9OworCitjbGFzcyBTdHJpbmdSZWY7CisKK2NsYXNzIE1DVGFyZ2V0T3B0aW9ucyB7CitwdWJsaWM6CisgIGVudW0gQXNtSW5zdHJ1bWVudGF0aW9uIHsKKyAgICBBc21JbnN0cnVtZW50YXRpb25Ob25lLAorICAgIEFzbUluc3RydW1lbnRhdGlvbkFkZHJlc3MKKyAgfTsKKworICAvLy8gRW5hYmxlcyBBZGRyZXNzU2FuaXRpemVyIGluc3RydW1lbnRhdGlvbiBhdCBtYWNoaW5lIGxldmVsLgorICBib29sIFNhbml0aXplQWRkcmVzcyA6IDE7CisKKyAgYm9vbCBNQ1JlbGF4QWxsIDogMTsKKyAgYm9vbCBNQ05vRXhlY1N0YWNrIDogMTsKKyAgYm9vbCBNQ0ZhdGFsV2FybmluZ3MgOiAxOworICBib29sIE1DTm9XYXJuIDogMTsKKyAgYm9vbCBNQ05vRGVwcmVjYXRlZFdhcm4gOiAxOworICBib29sIE1DU2F2ZVRlbXBMYWJlbHMgOiAxOworICBib29sIE1DVXNlRHdhcmZEaXJlY3RvcnkgOiAxOworICBib29sIE1DSW5jcmVtZW50YWxMaW5rZXJDb21wYXRpYmxlIDogMTsKKyAgYm9vbCBNQ1BJRUNvcHlSZWxvY2F0aW9ucyA6IDE7CisgIGJvb2wgU2hvd01DRW5jb2RpbmcgOiAxOworICBib29sIFNob3dNQ0luc3QgOiAxOworICBib29sIEFzbVZlcmJvc2UgOiAxOworCisgIC8vLyBQcmVzZXJ2ZSBDb21tZW50cyBpbiBBc3NlbWJseS4KKyAgYm9vbCBQcmVzZXJ2ZUFzbUNvbW1lbnRzIDogMTsKKworICBpbnQgRHdhcmZWZXJzaW9uID0gMDsKKworICBzdGQ6OnN0cmluZyBBQklOYW1lOworICBzdGQ6OnN0cmluZyBTcGxpdER3YXJmRmlsZTsKKworICAvLy8gQWRkaXRpb25hbCBwYXRocyB0byBzZWFyY2ggZm9yIGAuaW5jbHVkZWAgZGlyZWN0aXZlcyB3aGVuIHVzaW5nIHRoZQorICAvLy8gaW50ZWdyYXRlZCBhc3NlbWJsZXIuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBJQVNTZWFyY2hQYXRoczsKKworICBNQ1RhcmdldE9wdGlvbnMoKTsKKworICAvLy8gZ2V0QUJJTmFtZSAtIElmIHRoaXMgcmV0dXJucyBhIG5vbi1lbXB0eSBzdHJpbmcgdGhpcyByZXByZXNlbnRzIHRoZQorICAvLy8gdGV4dHVhbCBuYW1lIG9mIHRoZSBBQkkgdGhhdCB3ZSB3YW50IHRoZSBiYWNrZW5kIHRvIHVzZSwgZS5nLiBvMzIsIG9yCisgIC8vLyBhYXBjcy1saW51eC4KKyAgU3RyaW5nUmVmIGdldEFCSU5hbWUoKSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DVEFSR0VUT1BUSU9OU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DVGFyZ2V0T3B0aW9uc0NvbW1hbmRGbGFncy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DVGFyZ2V0T3B0aW9uc0NvbW1hbmRGbGFncy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE3MmZhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNUYXJnZXRPcHRpb25zQ29tbWFuZEZsYWdzLmRlZgpAQCAtMCwwICsxLDgwIEBACisvLz09PS0tIE1DVGFyZ2V0T3B0aW9uc0NvbW1hbmRGbGFncy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIG1hY2hpbmUgY29kZS1zcGVjaWZpYyBmbGFncyB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbgorLy8gZGlmZmVyZW50IGNvbW1hbmQgbGluZSB0b29scy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNUQVJHRVRPUFRJT05TQ09NTUFOREZMQUdTX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1RBUkdFVE9QVElPTlNDT01NQU5ERkxBR1NfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitzdGF0aWMgY2w6Om9wdDxNQ1RhcmdldE9wdGlvbnM6OkFzbUluc3RydW1lbnRhdGlvbj4gQXNtSW5zdHJ1bWVudGF0aW9uKAorICAgICJhc20taW5zdHJ1bWVudGF0aW9uIiwgY2w6OmRlc2MoIkluc3RydW1lbnRhdGlvbiBvZiBpbmxpbmUgYXNzZW1ibHkgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhc3NlbWJseSBzb3VyY2UgZmlsZXMiKSwKKyAgICBjbDo6aW5pdChNQ1RhcmdldE9wdGlvbnM6OkFzbUluc3RydW1lbnRhdGlvbk5vbmUpLAorICAgIGNsOjp2YWx1ZXMoY2xFbnVtVmFsTihNQ1RhcmdldE9wdGlvbnM6OkFzbUluc3RydW1lbnRhdGlvbk5vbmUsICJub25lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIGluc3RydW1lbnRhdGlvbiBhdCBhbGwiKSwKKyAgICAgICAgICAgICAgIGNsRW51bVZhbE4oTUNUYXJnZXRPcHRpb25zOjpBc21JbnN0cnVtZW50YXRpb25BZGRyZXNzLCAiYWRkcmVzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0cnVtZW50IGluc3RydWN0aW9ucyB3aXRoIG1lbW9yeSBhcmd1bWVudHMiKSkpOworCitzdGF0aWMgY2w6Om9wdDxib29sPiBSZWxheEFsbCgibWMtcmVsYXgtYWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIldoZW4gdXNlZCB3aXRoIGZpbGV0eXBlPW9iaiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVsYXggYWxsIGZpeHVwcyBpbiB0aGUgZW1pdHRlZCBvYmplY3QgZmlsZSIpKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4gSW5jcmVtZW50YWxMaW5rZXJDb21wYXRpYmxlKAorICAgICJpbmNyZW1lbnRhbC1saW5rZXItY29tcGF0aWJsZSIsCisgICAgY2w6OmRlc2MoCisgICAgICAgICJXaGVuIHVzZWQgd2l0aCBmaWxldHlwZT1vYmosICIKKyAgICAgICAgImVtaXQgYW4gb2JqZWN0IGZpbGUgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBhbiBpbmNyZW1lbnRhbCBsaW5rZXIiKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IFBJRUNvcHlSZWxvY2F0aW9ucygicGllLWNvcHktcmVsb2NhdGlvbnMiLCBjbDo6ZGVzYygiUElFIENvcHkgUmVsb2NhdGlvbnMiKSk7CisKK3N0YXRpYyBjbDo6b3B0PGludD4gRHdhcmZWZXJzaW9uKCJkd2FyZi12ZXJzaW9uIiwgY2w6OmRlc2MoIkR3YXJmIHZlcnNpb24iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmluaXQoMCkpOworCitzdGF0aWMgY2w6Om9wdDxib29sPiBTaG93TUNJbnN0KCJhc20tc2hvdy1pbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiRW1pdCBpbnRlcm5hbCBpbnN0cnVjdGlvbiByZXByZXNlbnRhdGlvbiB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFzc2VtYmx5IGZpbGUiKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IEZhdGFsV2FybmluZ3MoImZhdGFsLXdhcm5pbmdzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiVHJlYXQgd2FybmluZ3MgYXMgZXJyb3JzIikpOworCitzdGF0aWMgY2w6Om9wdDxib29sPiBOb1dhcm4oIm5vLXdhcm4iLCBjbDo6ZGVzYygiU3VwcHJlc3MgYWxsIHdhcm5pbmdzIikpOworc3RhdGljIGNsOjphbGlhcyBOb1dhcm5XKCJXIiwgY2w6OmRlc2MoIkFsaWFzIGZvciAtLW5vLXdhcm4iKSwgY2w6OmFsaWFzb3B0KE5vV2FybikpOworCitzdGF0aWMgY2w6Om9wdDxib29sPiBOb0RlcHJlY2F0ZWRXYXJuKCJuby1kZXByZWNhdGVkLXdhcm4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJTdXBwcmVzcyBhbGwgZGVwcmVjYXRlZCB3YXJuaW5ncyIpKTsKKworc3RhdGljIGNsOjpvcHQ8c3RkOjpzdHJpbmc+CitBQklOYW1lKCJ0YXJnZXQtYWJpIiwgY2w6OkhpZGRlbiwKKyAgICAgICAgY2w6OmRlc2MoIlRoZSBuYW1lIG9mIHRoZSBBQkkgdG8gYmUgdGFyZ2V0ZWQgZnJvbSB0aGUgYmFja2VuZC4iKSwKKyAgICAgICAgY2w6OmluaXQoIiIpKTsKKworc3RhdGljIE1DVGFyZ2V0T3B0aW9ucyBJbml0TUNUYXJnZXRPcHRpb25zRnJvbUZsYWdzKCkgeworICBNQ1RhcmdldE9wdGlvbnMgT3B0aW9uczsKKyAgT3B0aW9ucy5TYW5pdGl6ZUFkZHJlc3MgPQorICAgICAgKEFzbUluc3RydW1lbnRhdGlvbiA9PSBNQ1RhcmdldE9wdGlvbnM6OkFzbUluc3RydW1lbnRhdGlvbkFkZHJlc3MpOworICBPcHRpb25zLk1DUmVsYXhBbGwgPSBSZWxheEFsbDsKKyAgT3B0aW9ucy5NQ0luY3JlbWVudGFsTGlua2VyQ29tcGF0aWJsZSA9IEluY3JlbWVudGFsTGlua2VyQ29tcGF0aWJsZTsKKyAgT3B0aW9ucy5NQ1BJRUNvcHlSZWxvY2F0aW9ucyA9IFBJRUNvcHlSZWxvY2F0aW9uczsKKyAgT3B0aW9ucy5Ed2FyZlZlcnNpb24gPSBEd2FyZlZlcnNpb247CisgIE9wdGlvbnMuU2hvd01DSW5zdCA9IFNob3dNQ0luc3Q7CisgIE9wdGlvbnMuQUJJTmFtZSA9IEFCSU5hbWU7CisgIE9wdGlvbnMuTUNGYXRhbFdhcm5pbmdzID0gRmF0YWxXYXJuaW5nczsKKyAgT3B0aW9ucy5NQ05vV2FybiA9IE5vV2FybjsKKyAgT3B0aW9ucy5NQ05vRGVwcmVjYXRlZFdhcm4gPSBOb0RlcHJlY2F0ZWRXYXJuOworICByZXR1cm4gT3B0aW9uczsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DVmFsdWUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNWYWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjIzZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DVmFsdWUuaApAQCAtMCwwICsxLDg3IEBACisvLz09PS0tIGxsdm0vTUMvTUNWYWx1ZS5oIC0gTUNWYWx1ZSBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIE1DVmFsdWUgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DVkFMVUVfSAorI2RlZmluZSBMTFZNX01DX01DVkFMVUVfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0V4cHIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1DQXNtSW5mbzsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyBhbiAiYXNzZW1ibGVyIGltbWVkaWF0ZSIuCisvLy8KKy8vLyAgSW4gaXRzIG1vc3QgZ2VuZXJhbCBmb3JtLCB0aGlzIGNhbiBob2xkICI6S2luZDooU3ltYm9sQSAtIFN5bWJvbEIgKworLy8vICBpbW02NCkiLiAgTm90IGFsbCB0YXJnZXRzIHN1cHBvcnRzIHJlbG9jYXRpb25zIG9mIHRoaXMgZ2VuZXJhbCBmb3JtLCBidXQgd2UKKy8vLyAgbmVlZCB0byByZXByZXNlbnQgdGhpcyBhbnl3YXkuCisvLy8KKy8vLyBJbiBnZW5lcmFsIGJvdGggU3ltYm9sQSBhbmQgU3ltYm9sQiB3aWxsIGFsc28gaGF2ZSBhIG1vZGlmaWVyCisvLy8gYW5hbG9nb3VzIHRvIHRoZSB0b3AtbGV2ZWwgS2luZC4gQ3VycmVudCB0YXJnZXRzIGFyZSBub3QgZXhwZWN0ZWQKKy8vLyB0byBtYWtlIHVzZSBvZiBib3RoIHRob3VnaC4gVGhlIGNob2ljZSBjb21lcyBkb3duIHRvIHdoZXRoZXIKKy8vLyByZWxvY2F0aW9uIG1vZGlmaWVycyBhcHBseSB0byB0aGUgY2xvc2VzdCBzeW1ib2wgb3IgdGhlIHdob2xlCisvLy8gZXhwcmVzc2lvbi4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIGNsYXNzIG11c3QgcmVtYWluIGEgc2ltcGxlIFBPRCB2YWx1ZSBjbGFzcywgYmVjYXVzZSB3ZSBuZWVkCisvLy8gaXQgdG8gbGl2ZSBpbiB1bmlvbnMgZXRjLgorY2xhc3MgTUNWYWx1ZSB7CisgIGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqU3ltQSA9IG51bGxwdHIsICpTeW1CID0gbnVsbHB0cjsKKyAgaW50NjRfdCBDc3QgPSAwOworICB1aW50MzJfdCBSZWZLaW5kID0gMDsKKworcHVibGljOgorICBNQ1ZhbHVlKCkgPSBkZWZhdWx0OworICBpbnQ2NF90IGdldENvbnN0YW50KCkgY29uc3QgeyByZXR1cm4gQ3N0OyB9CisgIGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqZ2V0U3ltQSgpIGNvbnN0IHsgcmV0dXJuIFN5bUE7IH0KKyAgY29uc3QgTUNTeW1ib2xSZWZFeHByICpnZXRTeW1CKCkgY29uc3QgeyByZXR1cm4gU3ltQjsgfQorICB1aW50MzJfdCBnZXRSZWZLaW5kKCkgY29uc3QgeyByZXR1cm4gUmVmS2luZDsgfQorCisgIC8vLyBcYnJpZWYgSXMgdGhpcyBhbiBhYnNvbHV0ZSAoYXMgb3Bwb3NlZCB0byByZWxvY2F0YWJsZSkgdmFsdWUuCisgIGJvb2wgaXNBYnNvbHV0ZSgpIGNvbnN0IHsgcmV0dXJuICFTeW1BICYmICFTeW1COyB9CisKKyAgLy8vIFxicmllZiBQcmludCB0aGUgdmFsdWUgdG8gdGhlIHN0cmVhbSBccCBPUy4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUHJpbnQgdGhlIHZhbHVlIHRvIHN0ZGVyci4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgTUNTeW1ib2xSZWZFeHByOjpWYXJpYW50S2luZCBnZXRBY2Nlc3NWYXJpYW50KCkgY29uc3Q7CisKKyAgc3RhdGljIE1DVmFsdWUgZ2V0KGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqU3ltQSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqU3ltQiA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IFZhbCA9IDAsIHVpbnQzMl90IFJlZktpbmQgPSAwKSB7CisgICAgTUNWYWx1ZSBSOworICAgIFIuQ3N0ID0gVmFsOworICAgIFIuU3ltQSA9IFN5bUE7CisgICAgUi5TeW1CID0gU3ltQjsKKyAgICBSLlJlZktpbmQgPSBSZWZLaW5kOworICAgIHJldHVybiBSOworICB9CisKKyAgc3RhdGljIE1DVmFsdWUgZ2V0KGludDY0X3QgVmFsKSB7CisgICAgTUNWYWx1ZSBSOworICAgIFIuQ3N0ID0gVmFsOworICAgIFIuU3ltQSA9IG51bGxwdHI7CisgICAgUi5TeW1CID0gbnVsbHB0cjsKKyAgICBSLlJlZktpbmQgPSAwOworICAgIHJldHVybiBSOworICB9CisKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1dhc21PYmplY3RXcml0ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNXYXNtT2JqZWN0V3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRkNWViOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNXYXNtT2JqZWN0V3JpdGVyLmgKQEAgLTAsMCArMSw1MyBAQAorLy89PT0tLSBsbHZtL01DL01DV2FzbU9iamVjdFdyaXRlci5oIC0gV2FzbSBPYmplY3QgV3JpdGVyIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DV0FTTU9CSkVDVFdSSVRFUl9ICisjZGVmaW5lIExMVk1fTUNfTUNXQVNNT0JKRUNUV1JJVEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L1dhc20uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNGaXh1cDsKK2NsYXNzIE1DT2JqZWN0V3JpdGVyOworY2xhc3MgTUNWYWx1ZTsKK2NsYXNzIHJhd19wd3JpdGVfc3RyZWFtOworCitjbGFzcyBNQ1dhc21PYmplY3RUYXJnZXRXcml0ZXIgeworICBjb25zdCB1bnNpZ25lZCBJczY0Qml0IDogMTsKKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBNQ1dhc21PYmplY3RUYXJnZXRXcml0ZXIoYm9vbCBJczY0Qml0Xyk7CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+TUNXYXNtT2JqZWN0VGFyZ2V0V3JpdGVyKCk7CisKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRSZWxvY1R5cGUoY29uc3QgTUNWYWx1ZSAmVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZpeHVwICZGaXh1cCkgY29uc3QgPSAwOworCisgIC8vLyBcbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisgIGJvb2wgaXM2NEJpdCgpIGNvbnN0IHsgcmV0dXJuIElzNjRCaXQ7IH0KKyAgLy8vIEB9Cit9OworCisvLy8gXGJyaWVmIENvbnN0cnVjdCBhIG5ldyBXYXNtIHdyaXRlciBpbnN0YW5jZS4KKy8vLworLy8vIFxwYXJhbSBNT1RXIC0gVGhlIHRhcmdldCBzcGVjaWZpYyBXYXNtIHdyaXRlciBzdWJjbGFzcy4KKy8vLyBccGFyYW0gT1MgLSBUaGUgc3RyZWFtIHRvIHdyaXRlIHRvLgorLy8vIFxyZXR1cm5zIFRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd3JpdGVyLgorc3RkOjp1bmlxdWVfcHRyPE1DT2JqZWN0V3JpdGVyPgorY3JlYXRlV2FzbU9iamVjdFdyaXRlcihzdGQ6OnVuaXF1ZV9wdHI8TUNXYXNtT2JqZWN0VGFyZ2V0V3JpdGVyPiBNT1RXLAorICAgICAgICAgICAgICAgICAgICAgICByYXdfcHdyaXRlX3N0cmVhbSAmT1MpOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNXYXNtU3RyZWFtZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNXYXNtU3RyZWFtZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGQ0NTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1dhc21TdHJlYW1lci5oCkBAIC0wLDAgKzEsODQgQEAKKy8vPT09LSBNQ1dhc21TdHJlYW1lci5oIC0gTUNTdHJlYW1lciBXYXNtIE9iamVjdCBGaWxlIEludGVyZmFjZSAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1dBU01TVFJFQU1FUl9ICisjZGVmaW5lIExMVk1fTUNfTUNXQVNNU1RSRUFNRVJfSAorCisjaW5jbHVkZSAiTUNBc21CYWNrZW5kLmgiCisjaW5jbHVkZSAiTUNDb2RlRW1pdHRlci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0RpcmVjdGl2ZXMuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DT2JqZWN0U3RyZWFtZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL1NlY3Rpb25LaW5kLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNQ0Fzc2VtYmxlcjsKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIE1DSW5zdDsKK2NsYXNzIHJhd19vc3RyZWFtOworCitjbGFzcyBNQ1dhc21TdHJlYW1lciA6IHB1YmxpYyBNQ09iamVjdFN0cmVhbWVyIHsKK3B1YmxpYzoKKyAgTUNXYXNtU3RyZWFtZXIoTUNDb250ZXh0ICZDb250ZXh0LCBzdGQ6OnVuaXF1ZV9wdHI8TUNBc21CYWNrZW5kPiBUQUIsCisgICAgICAgICAgICAgICAgIHJhd19wd3JpdGVfc3RyZWFtICZPUywgc3RkOjp1bmlxdWVfcHRyPE1DQ29kZUVtaXR0ZXI+IEVtaXR0ZXIpCisgICAgICA6IE1DT2JqZWN0U3RyZWFtZXIoQ29udGV4dCwgc3RkOjptb3ZlKFRBQiksIE9TLCBzdGQ6Om1vdmUoRW1pdHRlcikpLAorICAgICAgICBTZWVuSWRlbnQoZmFsc2UpIHt9CisKKyAgfk1DV2FzbVN0cmVhbWVyKCkgb3ZlcnJpZGU7CisKKyAgLy8vIHN0YXRlIG1hbmFnZW1lbnQKKyAgdm9pZCByZXNldCgpIG92ZXJyaWRlIHsKKyAgICBTZWVuSWRlbnQgPSBmYWxzZTsKKyAgICBNQ09iamVjdFN0cmVhbWVyOjpyZXNldCgpOworICB9CisKKyAgLy8vIFxuYW1lIE1DU3RyZWFtZXIgSW50ZXJmYWNlCisgIC8vLyBAeworCisgIHZvaWQgQ2hhbmdlU2VjdGlvbihNQ1NlY3Rpb24gKlNlY3Rpb24sIGNvbnN0IE1DRXhwciAqU3Vic2VjdGlvbikgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdEFzc2VtYmxlckZsYWcoTUNBc3NlbWJsZXJGbGFnIEZsYWcpIG92ZXJyaWRlOworICB2b2lkIEVtaXRUaHVtYkZ1bmMoTUNTeW1ib2wgKkZ1bmMpIG92ZXJyaWRlOworICB2b2lkIEVtaXRXZWFrUmVmZXJlbmNlKE1DU3ltYm9sICpBbGlhcywgY29uc3QgTUNTeW1ib2wgKlN5bWJvbCkgb3ZlcnJpZGU7CisgIGJvb2wgRW1pdFN5bWJvbEF0dHJpYnV0ZShNQ1N5bWJvbCAqU3ltYm9sLCBNQ1N5bWJvbEF0dHIgQXR0cmlidXRlKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0U3ltYm9sRGVzYyhNQ1N5bWJvbCAqU3ltYm9sLCB1bnNpZ25lZCBEZXNjVmFsdWUpIG92ZXJyaWRlOworICB2b2lkIEVtaXRDb21tb25TeW1ib2woTUNTeW1ib2wgKlN5bWJvbCwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQpIG92ZXJyaWRlOworCisgIHZvaWQgZW1pdEVMRlNpemUoTUNTeW1ib2wgKlN5bWJvbCwgY29uc3QgTUNFeHByICpWYWx1ZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBFbWl0TG9jYWxDb21tb25TeW1ib2woTUNTeW1ib2wgKlN5bWJvbCwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQnl0ZUFsaWdubWVudCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBFbWl0WmVyb2ZpbGwoTUNTZWN0aW9uICpTZWN0aW9uLCBNQ1N5bWJvbCAqU3ltYm9sID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSA9IDAsIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQgPSAwKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0VEJTU1N5bWJvbChNQ1NlY3Rpb24gKlNlY3Rpb24sIE1DU3ltYm9sICpTeW1ib2wsIHVpbnQ2NF90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQnl0ZUFsaWdubWVudCA9IDApIG92ZXJyaWRlOworICB2b2lkIEVtaXRWYWx1ZUltcGwoY29uc3QgTUNFeHByICpWYWx1ZSwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIFNNTG9jIExvYyA9IFNNTG9jKCkpIG92ZXJyaWRlOworCisgIHZvaWQgRW1pdElkZW50KFN0cmluZ1JlZiBJZGVudFN0cmluZykgb3ZlcnJpZGU7CisKKyAgdm9pZCBFbWl0VmFsdWVUb0FsaWdubWVudCh1bnNpZ25lZCwgaW50NjRfdCwgdW5zaWduZWQsIHVuc2lnbmVkKSBvdmVycmlkZTsKKworICB2b2lkIEZpbmlzaEltcGwoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgdm9pZCBFbWl0SW5zdFRvRnJhZ21lbnQoY29uc3QgTUNJbnN0ICZJbnN0LCBjb25zdCBNQ1N1YnRhcmdldEluZm8gJikgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdEluc3RUb0RhdGEoY29uc3QgTUNJbnN0ICZJbnN0LCBjb25zdCBNQ1N1YnRhcmdldEluZm8gJikgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBNZXJnZSB0aGUgY29udGVudCBvZiB0aGUgZnJhZ21lbnQgXHAgRUYgaW50byB0aGUgZnJhZ21lbnQgXHAgREYuCisgIHZvaWQgbWVyZ2VGcmFnbWVudChNQ0RhdGFGcmFnbWVudCAqLCBNQ0RhdGFGcmFnbWVudCAqKTsKKworICBib29sIFNlZW5JZGVudDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1dpbjY0RUguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNXaW42NEVILmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNlYTczOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNXaW42NEVILmgKQEAgLTAsMCArMSw2MiBAQAorLy89PT0tIE1DV2luNjRFSC5oIC0gTWFjaGluZSBDb2RlIFdpbjY0IEVIIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgZGVjbGFyYXRpb25zIHRvIHN1cHBvcnQgdGhlIFdpbjY0IEV4Y2VwdGlvbiBIYW5kbGluZworLy8gc2NoZW1lIGluIE1DLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1dJTjY0RUhfSAorI2RlZmluZSBMTFZNX01DX01DV0lONjRFSF9ICisKKyNpbmNsdWRlICJsbHZtL01DL01DV2luRUguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvV2luNjRFSC5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNQ1N0cmVhbWVyOworY2xhc3MgTUNTeW1ib2w7CisKK25hbWVzcGFjZSBXaW42NEVIIHsKK3N0cnVjdCBJbnN0cnVjdGlvbiB7CisgIHN0YXRpYyBXaW5FSDo6SW5zdHJ1Y3Rpb24gUHVzaE5vblZvbChNQ1N5bWJvbCAqTCwgdW5zaWduZWQgUmVnKSB7CisgICAgcmV0dXJuIFdpbkVIOjpJbnN0cnVjdGlvbihXaW42NEVIOjpVT1BfUHVzaE5vblZvbCwgTCwgUmVnLCAtMSk7CisgIH0KKyAgc3RhdGljIFdpbkVIOjpJbnN0cnVjdGlvbiBBbGxvYyhNQ1N5bWJvbCAqTCwgdW5zaWduZWQgU2l6ZSkgeworICAgIHJldHVybiBXaW5FSDo6SW5zdHJ1Y3Rpb24oU2l6ZSA+IDEyOCA/IFVPUF9BbGxvY0xhcmdlIDogVU9QX0FsbG9jU21hbGwsIEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgU2l6ZSk7CisgIH0KKyAgc3RhdGljIFdpbkVIOjpJbnN0cnVjdGlvbiBQdXNoTWFjaEZyYW1lKE1DU3ltYm9sICpMLCBib29sIENvZGUpIHsKKyAgICByZXR1cm4gV2luRUg6Okluc3RydWN0aW9uKFVPUF9QdXNoTWFjaEZyYW1lLCBMLCAtMSwgQ29kZSA/IDEgOiAwKTsKKyAgfQorICBzdGF0aWMgV2luRUg6Okluc3RydWN0aW9uIFNhdmVOb25Wb2woTUNTeW1ib2wgKkwsIHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9mZnNldCkgeworICAgIHJldHVybiBXaW5FSDo6SW5zdHJ1Y3Rpb24oT2Zmc2V0ID4gNTEyICogMTAyNCAtIDggPyBVT1BfU2F2ZU5vblZvbEJpZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBVT1BfU2F2ZU5vblZvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwsIFJlZywgT2Zmc2V0KTsKKyAgfQorICBzdGF0aWMgV2luRUg6Okluc3RydWN0aW9uIFNhdmVYTU0oTUNTeW1ib2wgKkwsIHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9mZnNldCkgeworICAgIHJldHVybiBXaW5FSDo6SW5zdHJ1Y3Rpb24oT2Zmc2V0ID4gNTEyICogMTAyNCAtIDggPyBVT1BfU2F2ZVhNTTEyOEJpZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBVT1BfU2F2ZVhNTTEyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwsIFJlZywgT2Zmc2V0KTsKKyAgfQorICBzdGF0aWMgV2luRUg6Okluc3RydWN0aW9uIFNldEZQUmVnKE1DU3ltYm9sICpMLCB1bnNpZ25lZCBSZWcsIHVuc2lnbmVkIE9mZikgeworICAgIHJldHVybiBXaW5FSDo6SW5zdHJ1Y3Rpb24oVU9QX1NldEZQUmVnLCBMLCBSZWcsIE9mZik7CisgIH0KK307CisKK2NsYXNzIFVud2luZEVtaXR0ZXIgOiBwdWJsaWMgV2luRUg6OlVud2luZEVtaXR0ZXIgeworcHVibGljOgorICB2b2lkIEVtaXQoTUNTdHJlYW1lciAmU3RyZWFtZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEVtaXRVbndpbmRJbmZvKE1DU3RyZWFtZXIgJlN0cmVhbWVyLCBXaW5FSDo6RnJhbWVJbmZvICpGSSkgY29uc3Qgb3ZlcnJpZGU7Cit9OworfQorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DV2luQ09GRk9iamVjdFdyaXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1dpbkNPRkZPYmplY3RXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjM0YmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1dpbkNPRkZPYmplY3RXcml0ZXIuaApAQCAtMCwwICsxLDUyIEBACisvLz09PS0gbGx2bS9NQy9NQ1dpbkNPRkZPYmplY3RXcml0ZXIuaCAtIFdpbiBDT0ZGIE9iamVjdCBXcml0ZXIgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNXSU5DT0ZGT0JKRUNUV1JJVEVSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1dJTkNPRkZPQkpFQ1RXUklURVJfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DQXNtQmFja2VuZDsKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DRml4dXA7CitjbGFzcyBNQ09iamVjdFdyaXRlcjsKK2NsYXNzIE1DVmFsdWU7CitjbGFzcyByYXdfcHdyaXRlX3N0cmVhbTsKKworICBjbGFzcyBNQ1dpbkNPRkZPYmplY3RUYXJnZXRXcml0ZXIgeworICAgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworICAgIGNvbnN0IHVuc2lnbmVkIE1hY2hpbmU7CisKKyAgcHJvdGVjdGVkOgorICAgIE1DV2luQ09GRk9iamVjdFRhcmdldFdyaXRlcih1bnNpZ25lZCBNYWNoaW5lXyk7CisKKyAgcHVibGljOgorICAgIHZpcnR1YWwgfk1DV2luQ09GRk9iamVjdFRhcmdldFdyaXRlcigpID0gZGVmYXVsdDsKKworICAgIHVuc2lnbmVkIGdldE1hY2hpbmUoKSBjb25zdCB7IHJldHVybiBNYWNoaW5lOyB9CisgICAgdmlydHVhbCB1bnNpZ25lZCBnZXRSZWxvY1R5cGUoTUNDb250ZXh0ICZDdHgsIGNvbnN0IE1DVmFsdWUgJlRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZpeHVwICZGaXh1cCwgYm9vbCBJc0Nyb3NzU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUJhY2tlbmQgJk1BQikgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCByZWNvcmRSZWxvY2F0aW9uKGNvbnN0IE1DRml4dXAgJikgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICB9OworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgbmV3IFdpbiBDT0ZGIHdyaXRlciBpbnN0YW5jZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTU9UVyAtIFRoZSB0YXJnZXQgc3BlY2lmaWMgV2luQ09GRiB3cml0ZXIgc3ViY2xhc3MuCisgIC8vLyBccGFyYW0gT1MgLSBUaGUgc3RyZWFtIHRvIHdyaXRlIHRvLgorICAvLy8gXHJldHVybnMgVGhlIGNvbnN0cnVjdGVkIG9iamVjdCB3cml0ZXIuCisgIHN0ZDo6dW5pcXVlX3B0cjxNQ09iamVjdFdyaXRlcj4KKyAgY3JlYXRlV2luQ09GRk9iamVjdFdyaXRlcihzdGQ6OnVuaXF1ZV9wdHI8TUNXaW5DT0ZGT2JqZWN0VGFyZ2V0V3JpdGVyPiBNT1RXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19wd3JpdGVfc3RyZWFtICZPUyk7Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ1dJTkNPRkZPQkpFQ1RXUklURVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1dpbkNPRkZTdHJlYW1lci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1dpbkNPRkZTdHJlYW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYzE3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DV2luQ09GRlN0cmVhbWVyLmgKQEAgLTAsMCArMSw4MSBAQAorLy89PT0tIE1DV2luQ09GRlN0cmVhbWVyLmggLSBDT0ZGIE9iamVjdCBGaWxlIEludGVyZmFjZSAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DV0lOQ09GRlNUUkVBTUVSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1dJTkNPRkZTVFJFQU1FUl9ICisKKyNpbmNsdWRlICJsbHZtL01DL01DRGlyZWN0aXZlcy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNPYmplY3RTdHJlYW1lci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DQXNtQmFja2VuZDsKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DQ29kZUVtaXR0ZXI7CitjbGFzcyBNQ0luc3Q7CitjbGFzcyBNQ1NlY3Rpb247CitjbGFzcyBNQ1N1YnRhcmdldEluZm87CitjbGFzcyBNQ1N5bWJvbDsKK2NsYXNzIFN0cmluZ1JlZjsKK2NsYXNzIHJhd19wd3JpdGVfc3RyZWFtOworCitjbGFzcyBNQ1dpbkNPRkZTdHJlYW1lciA6IHB1YmxpYyBNQ09iamVjdFN0cmVhbWVyIHsKK3B1YmxpYzoKKyAgTUNXaW5DT0ZGU3RyZWFtZXIoTUNDb250ZXh0ICZDb250ZXh0LCBzdGQ6OnVuaXF1ZV9wdHI8TUNBc21CYWNrZW5kPiBNQUIsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ0NvZGVFbWl0dGVyPiBDRSwgcmF3X3B3cml0ZV9zdHJlYW0gJk9TKTsKKworICAvLy8gc3RhdGUgbWFuYWdlbWVudAorICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGUgeworICAgIEN1clN5bWJvbCA9IG51bGxwdHI7CisgICAgTUNPYmplY3RTdHJlYW1lcjo6cmVzZXQoKTsKKyAgfQorCisgIC8vLyBcbmFtZSBNQ1N0cmVhbWVyIGludGVyZmFjZQorICAvLy8gXHsKKworICB2b2lkIEluaXRTZWN0aW9ucyhib29sIE5vRXhlY1N0YWNrKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0TGFiZWwoTUNTeW1ib2wgKlN5bWJvbCwgU01Mb2MgTG9jID0gU01Mb2MoKSkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdEFzc2VtYmxlckZsYWcoTUNBc3NlbWJsZXJGbGFnIEZsYWcpIG92ZXJyaWRlOworICB2b2lkIEVtaXRUaHVtYkZ1bmMoTUNTeW1ib2wgKkZ1bmMpIG92ZXJyaWRlOworICBib29sIEVtaXRTeW1ib2xBdHRyaWJ1dGUoTUNTeW1ib2wgKlN5bWJvbCwgTUNTeW1ib2xBdHRyIEF0dHJpYnV0ZSkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdFN5bWJvbERlc2MoTUNTeW1ib2wgKlN5bWJvbCwgdW5zaWduZWQgRGVzY1ZhbHVlKSBvdmVycmlkZTsKKyAgdm9pZCBCZWdpbkNPRkZTeW1ib2xEZWYoTUNTeW1ib2wgY29uc3QgKlN5bWJvbCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdENPRkZTeW1ib2xTdG9yYWdlQ2xhc3MoaW50IFN0b3JhZ2VDbGFzcykgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdENPRkZTeW1ib2xUeXBlKGludCBUeXBlKSBvdmVycmlkZTsKKyAgdm9pZCBFbmRDT0ZGU3ltYm9sRGVmKCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdENPRkZTYWZlU0VIKE1DU3ltYm9sIGNvbnN0ICpTeW1ib2wpIG92ZXJyaWRlOworICB2b2lkIEVtaXRDT0ZGU3ltYm9sSW5kZXgoTUNTeW1ib2wgY29uc3QgKlN5bWJvbCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdENPRkZTZWN0aW9uSW5kZXgoTUNTeW1ib2wgY29uc3QgKlN5bWJvbCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdENPRkZTZWNSZWwzMihNQ1N5bWJvbCBjb25zdCAqU3ltYm9sLCB1aW50NjRfdCBPZmZzZXQpIG92ZXJyaWRlOworICB2b2lkIEVtaXRDb21tb25TeW1ib2woTUNTeW1ib2wgKlN5bWJvbCwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQpIG92ZXJyaWRlOworICB2b2lkIEVtaXRMb2NhbENvbW1vblN5bWJvbChNQ1N5bWJvbCAqU3ltYm9sLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlQWxpZ25tZW50KSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0WmVyb2ZpbGwoTUNTZWN0aW9uICpTZWN0aW9uLCBNQ1N5bWJvbCAqU3ltYm9sLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlQWxpZ25tZW50KSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0VEJTU1N5bWJvbChNQ1NlY3Rpb24gKlNlY3Rpb24sIE1DU3ltYm9sICpTeW1ib2wsIHVpbnQ2NF90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQnl0ZUFsaWdubWVudCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdElkZW50KFN0cmluZ1JlZiBJZGVudFN0cmluZykgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdFdpbkVISGFuZGxlckRhdGEoU01Mb2MgTG9jKSBvdmVycmlkZTsKKyAgdm9pZCBGaW5pc2hJbXBsKCkgb3ZlcnJpZGU7CisKKyAgLy8vIFx9CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgTUNTeW1ib2wgKkN1clN5bWJvbDsKKworICB2b2lkIEVtaXRJbnN0VG9EYXRhKGNvbnN0IE1DSW5zdCAmSW5zdCwgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEkpIG92ZXJyaWRlOworCitwcml2YXRlOgorICB2b2lkIEVycm9yKGNvbnN0IFR3aW5lICZNc2cpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNXSU5DT0ZGU1RSRUFNRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1dpbkVILmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DV2luRUguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2E1MmE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1dpbkVILmgKQEAgLTAsMCArMSw2NyBAQAorLy89PT0tIE1DV2luRUguaCAtIFdpbmRvd3MgVW53aW5kaW5nIFN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DV0lORUhfSAorI2RlZmluZSBMTFZNX01DX01DV0lORUhfSAorCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNQ1NlY3Rpb247CitjbGFzcyBNQ1N0cmVhbWVyOworY2xhc3MgTUNTeW1ib2w7CisKK25hbWVzcGFjZSBXaW5FSCB7CitzdHJ1Y3QgSW5zdHJ1Y3Rpb24geworICBjb25zdCBNQ1N5bWJvbCAqTGFiZWw7CisgIGNvbnN0IHVuc2lnbmVkIE9mZnNldDsKKyAgY29uc3QgdW5zaWduZWQgUmVnaXN0ZXI7CisgIGNvbnN0IHVuc2lnbmVkIE9wZXJhdGlvbjsKKworICBJbnN0cnVjdGlvbih1bnNpZ25lZCBPcCwgTUNTeW1ib2wgKkwsIHVuc2lnbmVkIFJlZywgdW5zaWduZWQgT2ZmKQorICAgIDogTGFiZWwoTCksIE9mZnNldChPZmYpLCBSZWdpc3RlcihSZWcpLCBPcGVyYXRpb24oT3ApIHt9Cit9OworCitzdHJ1Y3QgRnJhbWVJbmZvIHsKKyAgY29uc3QgTUNTeW1ib2wgKkJlZ2luID0gbnVsbHB0cjsKKyAgY29uc3QgTUNTeW1ib2wgKkVuZCA9IG51bGxwdHI7CisgIGNvbnN0IE1DU3ltYm9sICpFeGNlcHRpb25IYW5kbGVyID0gbnVsbHB0cjsKKyAgY29uc3QgTUNTeW1ib2wgKkZ1bmN0aW9uID0gbnVsbHB0cjsKKyAgY29uc3QgTUNTeW1ib2wgKlByb2xvZ0VuZCA9IG51bGxwdHI7CisgIGNvbnN0IE1DU3ltYm9sICpTeW1ib2wgPSBudWxscHRyOworICBjb25zdCBNQ1NlY3Rpb24gKlRleHRTZWN0aW9uID0gbnVsbHB0cjsKKworICBib29sIEhhbmRsZXNVbndpbmQgPSBmYWxzZTsKKyAgYm9vbCBIYW5kbGVzRXhjZXB0aW9ucyA9IGZhbHNlOworCisgIGludCBMYXN0RnJhbWVJbnN0ID0gLTE7CisgIGNvbnN0IEZyYW1lSW5mbyAqQ2hhaW5lZFBhcmVudCA9IG51bGxwdHI7CisgIHN0ZDo6dmVjdG9yPEluc3RydWN0aW9uPiBJbnN0cnVjdGlvbnM7CisKKyAgRnJhbWVJbmZvKCkgPSBkZWZhdWx0OworICBGcmFtZUluZm8oY29uc3QgTUNTeW1ib2wgKkZ1bmN0aW9uLCBjb25zdCBNQ1N5bWJvbCAqQmVnaW5GdW5jRUhMYWJlbCkKKyAgICAgIDogQmVnaW4oQmVnaW5GdW5jRUhMYWJlbCksIEZ1bmN0aW9uKEZ1bmN0aW9uKSB7fQorICBGcmFtZUluZm8oY29uc3QgTUNTeW1ib2wgKkZ1bmN0aW9uLCBjb25zdCBNQ1N5bWJvbCAqQmVnaW5GdW5jRUhMYWJlbCwKKyAgICAgICAgICAgIGNvbnN0IEZyYW1lSW5mbyAqQ2hhaW5lZFBhcmVudCkKKyAgICAgIDogQmVnaW4oQmVnaW5GdW5jRUhMYWJlbCksIEZ1bmN0aW9uKEZ1bmN0aW9uKSwKKyAgICAgICAgQ2hhaW5lZFBhcmVudChDaGFpbmVkUGFyZW50KSB7fQorfTsKKworY2xhc3MgVW53aW5kRW1pdHRlciB7CitwdWJsaWM6CisgIHZpcnR1YWwgflVud2luZEVtaXR0ZXIoKTsKKworICAvLy8gVGhpcyBlbWl0cyB0aGUgdW53aW5kIGluZm8gc2VjdGlvbnMgKC5wZGF0YSBhbmQgLnhkYXRhIGluIFBFL0NPRkYpLgorICB2aXJ0dWFsIHZvaWQgRW1pdChNQ1N0cmVhbWVyICZTdHJlYW1lcikgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgRW1pdFVud2luZEluZm8oTUNTdHJlYW1lciAmU3RyZWFtZXIsIEZyYW1lSW5mbyAqRkkpIGNvbnN0ID0gMDsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NYWNoaW5lTG9jYXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTWFjaGluZUxvY2F0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlZDY2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTWFjaGluZUxvY2F0aW9uLmgKQEAgLTAsMCArMSw1OSBAQAorLy89PT0tIGxsdm0vTUMvTWFjaGluZUxvY2F0aW9uLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoZSBNYWNoaW5lTG9jYXRpb24gY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgYSBzaW1wbGUgbG9jYXRpb24gaW4gYSBtYWNoaW5lCisvLyBmcmFtZS4gIExvY2F0aW9ucyB3aWxsIGJlIG9uZSBvZiB0d28gZm9ybXM7IGEgcmVnaXN0ZXIgb3IgYW4gYWRkcmVzcyBmb3JtZWQKKy8vIGZyb20gYSBiYXNlIGFkZHJlc3MgcGx1cyBhbiBvZmZzZXQuICBSZWdpc3RlciBpbmRpcmVjdGlvbiBjYW4gYmUgc3BlY2lmaWVkIGJ5CisvLyBleHBsaWNpdGx5IHBhc3NpbmcgYW4gb2Zmc2V0IHRvIHRoZSBjb25zdHJ1Y3Rvci4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQUNISU5FTE9DQVRJT05fSAorI2RlZmluZSBMTFZNX01DX01BQ0hJTkVMT0NBVElPTl9ICisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZUxvY2F0aW9uIHsKK3ByaXZhdGU6CisgIGJvb2wgSXNSZWdpc3RlciA9IGZhbHNlOyAgICAgICAgICAgICAgLy8vPCBUcnVlIGlmIGxvY2F0aW9uIGlzIGEgcmVnaXN0ZXIuCisgIHVuc2lnbmVkIFJlZ2lzdGVyID0gMDsgICAgICAgICAgICAgICAgLy8vPCBnY2MvZ2RiIHJlZ2lzdGVyIG51bWJlci4KKworcHVibGljOgorICBlbnVtIDogdWludDMyX3QgeworICAgIC8vIFRoZSB0YXJnZXQgcmVnaXN0ZXIgbnVtYmVyIGZvciBhbiBhYnN0cmFjdCBmcmFtZSBwb2ludGVyLiBUaGUgdmFsdWUgaXMKKyAgICAvLyBhbiBhcmJpdHJhcnkgdmFsdWUgdGhhdCBkb2Vzbid0IGNvbGxpZGUgd2l0aCBhbnkgcmVhbCB0YXJnZXQgcmVnaXN0ZXIuCisgICAgVmlydHVhbEZQID0gfjBVCisgIH07CisKKyAgTWFjaGluZUxvY2F0aW9uKCkgPSBkZWZhdWx0OworICAvLy8gQ3JlYXRlIGEgZGlyZWN0IHJlZ2lzdGVyIGxvY2F0aW9uLgorICBleHBsaWNpdCBNYWNoaW5lTG9jYXRpb24odW5zaWduZWQgUiwgYm9vbCBJbmRpcmVjdCA9IGZhbHNlKQorICAgICAgOiBJc1JlZ2lzdGVyKCFJbmRpcmVjdCksIFJlZ2lzdGVyKFIpIHt9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hY2hpbmVMb2NhdGlvbiAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gSXNSZWdpc3RlciA9PSBPdGhlci5Jc1JlZ2lzdGVyICYmIFJlZ2lzdGVyID09IE90aGVyLlJlZ2lzdGVyOworICB9CisKKyAgLy8gQWNjZXNzb3JzLgorICAvLy8gXHJldHVybiB0cnVlIGlmZiB0aGlzIGlzIGEgcmVnaXN0ZXItaW5kaXJlY3QgbG9jYXRpb24uCisgIGJvb2wgaXNJbmRpcmVjdCgpICAgICAgY29uc3QgeyByZXR1cm4gIUlzUmVnaXN0ZXI7IH0KKyAgYm9vbCBpc1JlZygpICAgICAgICAgICBjb25zdCB7IHJldHVybiBJc1JlZ2lzdGVyOyB9CisgIHVuc2lnbmVkIGdldFJlZygpICAgICAgY29uc3QgeyByZXR1cm4gUmVnaXN0ZXI7IH0KKyAgdm9pZCBzZXRJc1JlZ2lzdGVyKGJvb2wgSXMpICB7IElzUmVnaXN0ZXIgPSBJczsgfQorICB2b2lkIHNldFJlZ2lzdGVyKHVuc2lnbmVkIFIpIHsgUmVnaXN0ZXIgPSBSOyB9Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1hY2hpbmVMb2NhdGlvbiAmTEhTLCBjb25zdCBNYWNoaW5lTG9jYXRpb24gJlJIUykgeworICByZXR1cm4gIShMSFMgPT0gUkhTKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUFDSElORUxPQ0FUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvU2VjdGlvbktpbmQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvU2VjdGlvbktpbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmViOWVjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9TZWN0aW9uS2luZC5oCkBAIC0wLDAgKzEsMjA4IEBACisvLz09PS0tIGxsdm0vTUMvU2VjdGlvbktpbmQuaCAtIENsYXNzaWZpY2F0aW9uIG9mIHNlY3Rpb25zIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfU0VDVElPTktJTkRfSAorI2RlZmluZSBMTFZNX01DX1NFQ1RJT05LSU5EX0gKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gU2VjdGlvbktpbmQgLSBUaGlzIGlzIGEgc2ltcGxlIFBPRCB2YWx1ZSB0aGF0IGNsYXNzaWZpZXMgdGhlIHByb3BlcnRpZXMgb2YKKy8vLyBhIHNlY3Rpb24uICBBIHNlY3Rpb24gaXMgY2xhc3NpZmllZCBpbnRvIHRoZSBkZWVwZXN0IHBvc3NpYmxlCisvLy8gY2xhc3NpZmljYXRpb24sIGFuZCB0aGVuIHRoZSB0YXJnZXQgbWFwcyB0aGVtIG9udG8gdGhlaXIgc2VjdGlvbnMgYmFzZWQgb24KKy8vLyB3aGF0IGNhcGFiaWxpdGllcyB0aGV5IGhhdmUuCisvLy8KKy8vLyBUaGUgY29tbWVudHMgYmVsb3cgZGVzY3JpYmUgdGhlc2UgYXMgaWYgdGhleSB3ZXJlIGFuIGluaGVyaXRhbmNlIGhpZXJhcmNoeQorLy8vIGluIG9yZGVyIHRvIGV4cGxhaW4gdGhlIHByZWRpY2F0ZXMgYmVsb3cuCisvLy8KK2NsYXNzIFNlY3Rpb25LaW5kIHsKKyAgZW51bSBLaW5kIHsKKyAgICAvLy8gTWV0YWRhdGEgLSBEZWJ1ZyBpbmZvIHNlY3Rpb25zIG9yIG90aGVyIG1ldGFkYXRhLgorICAgIE1ldGFkYXRhLAorCisgICAgLy8vIFRleHQgLSBUZXh0IHNlY3Rpb24sIHVzZWQgZm9yIGZ1bmN0aW9ucyBhbmQgb3RoZXIgZXhlY3V0YWJsZSBjb2RlLgorICAgIFRleHQsCisKKyAgICAgICAgICAgLy8vIEV4ZWN1dGVPbmx5LCBUZXh0IHNlY3Rpb24gdGhhdCBpcyBub3QgcmVhZGFibGUuCisgICAgICAgICAgIEV4ZWN1dGVPbmx5LAorCisgICAgLy8vIFJlYWRPbmx5IC0gRGF0YSB0aGF0IGlzIG5ldmVyIHdyaXR0ZW4gdG8gYXQgcHJvZ3JhbSBydW50aW1lIGJ5IHRoZQorICAgIC8vLyBwcm9ncmFtIG9yIHRoZSBkeW5hbWljIGxpbmtlci4gIFRoaW5ncyBpbiB0aGUgdG9wLWxldmVsIHJlYWRvbmx5CisgICAgLy8vIFNlY3Rpb25LaW5kIGFyZSBub3QgbWVyZ2VhYmxlLgorICAgIFJlYWRPbmx5LAorCisgICAgICAgIC8vLyBNZXJnYWJsZUNTdHJpbmcgLSBBbnkgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB3aGljaCBhbGxvd3MgbWVyZ2luZy4KKyAgICAgICAgLy8vIFRoZXNlIHZhbHVlcyBhcmUga25vd24gdG8gZW5kIGluIGEgbnVsIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSwKKyAgICAgICAgLy8vIG5vdCBvdGhlcndpc2UgY29udGFpbiBhIG51bCB2YWx1ZSwgYW5kIGJlIG1lcmdhYmxlLiAgVGhpcyBhbGxvd3MgdGhlCisgICAgICAgIC8vLyBsaW5rZXIgdG8gdW5pcXVlIHRoZSBzdHJpbmdzIGlmIGl0IHNvIGRlc2lyZXMuCisKKyAgICAgICAgICAgLy8vIE1lcmdlYWJsZTFCeXRlQ1N0cmluZyAtIDEgYnl0ZSBtZXJnYWJsZSwgbnVsbCB0ZXJtaW5hdGVkLCBzdHJpbmcuCisgICAgICAgICAgIE1lcmdlYWJsZTFCeXRlQ1N0cmluZywKKworICAgICAgICAgICAvLy8gTWVyZ2VhYmxlMkJ5dGVDU3RyaW5nIC0gMiBieXRlIG1lcmdhYmxlLCBudWxsIHRlcm1pbmF0ZWQsIHN0cmluZy4KKyAgICAgICAgICAgTWVyZ2VhYmxlMkJ5dGVDU3RyaW5nLAorCisgICAgICAgICAgIC8vLyBNZXJnZWFibGU0Qnl0ZUNTdHJpbmcgLSA0IGJ5dGUgbWVyZ2FibGUsIG51bGwgdGVybWluYXRlZCwgc3RyaW5nLgorICAgICAgICAgICBNZXJnZWFibGU0Qnl0ZUNTdHJpbmcsCisKKyAgICAgICAgLy8vIE1lcmdlYWJsZUNvbnN0IC0gVGhlc2UgYXJlIHNlY3Rpb25zIGZvciBtZXJnaW5nIGZpeGVkLWxlbmd0aAorICAgICAgICAvLy8gY29uc3RhbnRzIHRvZ2V0aGVyLiAgRm9yIGV4YW1wbGUsIHRoaXMgY2FuIGJlIHVzZWQgdG8gdW5pcXVlCisgICAgICAgIC8vLyBjb25zdGFudCBwb29sIGVudHJpZXMgZXRjLgorCisgICAgICAgICAgICAvLy8gTWVyZ2VhYmxlQ29uc3Q0IC0gVGhpcyBpcyBhIHNlY3Rpb24gdXNlZCBieSA0LWJ5dGUgY29uc3RhbnRzLAorICAgICAgICAgICAgLy8vIGZvciBleGFtcGxlLCBmbG9hdHMuCisgICAgICAgICAgICBNZXJnZWFibGVDb25zdDQsCisKKyAgICAgICAgICAgIC8vLyBNZXJnZWFibGVDb25zdDggLSBUaGlzIGlzIGEgc2VjdGlvbiB1c2VkIGJ5IDgtYnl0ZSBjb25zdGFudHMsCisgICAgICAgICAgICAvLy8gZm9yIGV4YW1wbGUsIGRvdWJsZXMuCisgICAgICAgICAgICBNZXJnZWFibGVDb25zdDgsCisKKyAgICAgICAgICAgIC8vLyBNZXJnZWFibGVDb25zdDE2IC0gVGhpcyBpcyBhIHNlY3Rpb24gdXNlZCBieSAxNi1ieXRlIGNvbnN0YW50cywKKyAgICAgICAgICAgIC8vLyBmb3IgZXhhbXBsZSwgdmVjdG9ycy4KKyAgICAgICAgICAgIE1lcmdlYWJsZUNvbnN0MTYsCisKKyAgICAgICAgICAgIC8vLyBNZXJnZWFibGVDb25zdDMyIC0gVGhpcyBpcyBhIHNlY3Rpb24gdXNlZCBieSAzMi1ieXRlIGNvbnN0YW50cywKKyAgICAgICAgICAgIC8vLyBmb3IgZXhhbXBsZSwgdmVjdG9ycy4KKyAgICAgICAgICAgIE1lcmdlYWJsZUNvbnN0MzIsCisKKyAgICAvLy8gV3JpdGVhYmxlIC0gVGhpcyBpcyB0aGUgYmFzZSBvZiBhbGwgc2VnbWVudHMgdGhhdCBuZWVkIHRvIGJlIHdyaXR0ZW4KKyAgICAvLy8gdG8gZHVyaW5nIHByb2dyYW0gcnVudGltZS4KKworICAgICAgIC8vLyBUaHJlYWRMb2NhbCAtIFRoaXMgaXMgdGhlIGJhc2Ugb2YgYWxsIFRMUyBzZWdtZW50cy4gIEFsbCBUTFMKKyAgICAgICAvLy8gb2JqZWN0cyBtdXN0IGJlIHdyaXRlYWJsZSwgb3RoZXJ3aXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBmb3IgdGhlbSB0bworICAgICAgIC8vLyBiZSB0aHJlYWQgbG9jYWwhCisKKyAgICAgICAgICAgLy8vIFRocmVhZEJTUyAtIFplcm8taW5pdGlhbGl6ZWQgVExTIGRhdGEgb2JqZWN0cy4KKyAgICAgICAgICAgVGhyZWFkQlNTLAorCisgICAgICAgICAgIC8vLyBUaHJlYWREYXRhIC0gSW5pdGlhbGl6ZWQgVExTIGRhdGEgb2JqZWN0cy4KKyAgICAgICAgICAgVGhyZWFkRGF0YSwKKworICAgICAgIC8vLyBHbG9iYWxXcml0ZWFibGVEYXRhIC0gV3JpdGVhYmxlIGRhdGEgdGhhdCBpcyBnbG9iYWwgKG5vdCB0aHJlYWQKKyAgICAgICAvLy8gbG9jYWwpLgorCisgICAgICAgICAgIC8vLyBCU1MgLSBaZXJvIGluaXRpYWxpemVkIHdyaXRlYWJsZSBkYXRhLgorICAgICAgICAgICBCU1MsCisKKyAgICAgICAgICAgICAgIC8vLyBCU1NMb2NhbCAtIFRoaXMgaXMgQlNTICh6ZXJvIGluaXRpYWxpemVkIGFuZCB3cml0YWJsZSkgZGF0YQorICAgICAgICAgICAgICAgLy8vIHdoaWNoIGhhcyBsb2NhbCBsaW5rYWdlLgorICAgICAgICAgICAgICAgQlNTTG9jYWwsCisKKyAgICAgICAgICAgICAgIC8vLyBCU1NFeHRlcm4gLSBUaGlzIGlzIEJTUyBkYXRhIHdpdGggbm9ybWFsIGV4dGVybmFsIGxpbmthZ2UuCisgICAgICAgICAgICAgICBCU1NFeHRlcm4sCisKKyAgICAgICAgICAgLy8vIENvbW1vbiAtIERhdGEgd2l0aCBjb21tb24gbGlua2FnZS4gIFRoZXNlIHJlcHJlc2VudCB0ZW50YXRpdmUKKyAgICAgICAgICAgLy8vIGRlZmluaXRpb25zLCB3aGljaCBhbHdheXMgaGF2ZSBhIHplcm8gaW5pdGlhbGl6ZXIgYW5kIGFyZSBuZXZlcgorICAgICAgICAgICAvLy8gbWFya2VkICdjb25zdGFudCcuCisgICAgICAgICAgIENvbW1vbiwKKworICAgICAgICAgICAvLy8gVGhpcyBpcyB3cml0ZWFibGUgZGF0YSB0aGF0IGhhcyBhIG5vbi16ZXJvIGluaXRpYWxpemVyLgorICAgICAgICAgICBEYXRhLAorCisgICAgICAgICAgIC8vLyBSZWFkT25seVdpdGhSZWwgLSBUaGVzZSBhcmUgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0IGFyZSBuZXZlcgorICAgICAgICAgICAvLy8gd3JpdHRlbiB0byBieSB0aGUgcHJvZ3JhbSwgYnV0IHRoYXQgaGF2ZSByZWxvY2F0aW9ucywgc28gdGhleQorICAgICAgICAgICAvLy8gbXVzdCBiZSBzdHVjayBpbiBhIHdyaXRlYWJsZSBzZWN0aW9uIHNvIHRoYXQgdGhlIGR5bmFtaWMgbGlua2VyCisgICAgICAgICAgIC8vLyBjYW4gd3JpdGUgdG8gdGhlbS4gIElmIGl0IGNob29zZXMgdG8sIHRoZSBkeW5hbWljIGxpbmtlciBjYW4KKyAgICAgICAgICAgLy8vIG1hcmsgdGhlIHBhZ2VzIHRoZXNlIGdsb2JhbHMgZW5kIHVwIG9uIGFzIHJlYWQtb25seSBhZnRlciBpdCBpcworICAgICAgICAgICAvLy8gZG9uZSB3aXRoIGl0cyByZWxvY2F0aW9uIHBoYXNlLgorICAgICAgICAgICBSZWFkT25seVdpdGhSZWwKKyAgfSBLIDogODsKK3B1YmxpYzoKKworICBib29sIGlzTWV0YWRhdGEoKSBjb25zdCB7IHJldHVybiBLID09IE1ldGFkYXRhOyB9CisKKyAgYm9vbCBpc1RleHQoKSBjb25zdCB7IHJldHVybiBLID09IFRleHQgfHwgSyA9PSBFeGVjdXRlT25seTsgfQorCisgIGJvb2wgaXNFeGVjdXRlT25seSgpIGNvbnN0IHsgcmV0dXJuIEsgPT0gRXhlY3V0ZU9ubHk7IH0KKworICBib29sIGlzUmVhZE9ubHkoKSBjb25zdCB7CisgICAgcmV0dXJuIEsgPT0gUmVhZE9ubHkgfHwgaXNNZXJnZWFibGVDU3RyaW5nKCkgfHwKKyAgICAgICAgICAgaXNNZXJnZWFibGVDb25zdCgpOworICB9CisKKyAgYm9vbCBpc01lcmdlYWJsZUNTdHJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIEsgPT0gTWVyZ2VhYmxlMUJ5dGVDU3RyaW5nIHx8IEsgPT0gTWVyZ2VhYmxlMkJ5dGVDU3RyaW5nIHx8CisgICAgICAgICAgIEsgPT0gTWVyZ2VhYmxlNEJ5dGVDU3RyaW5nOworICB9CisgIGJvb2wgaXNNZXJnZWFibGUxQnl0ZUNTdHJpbmcoKSBjb25zdCB7IHJldHVybiBLID09IE1lcmdlYWJsZTFCeXRlQ1N0cmluZzsgfQorICBib29sIGlzTWVyZ2VhYmxlMkJ5dGVDU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gSyA9PSBNZXJnZWFibGUyQnl0ZUNTdHJpbmc7IH0KKyAgYm9vbCBpc01lcmdlYWJsZTRCeXRlQ1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIEsgPT0gTWVyZ2VhYmxlNEJ5dGVDU3RyaW5nOyB9CisKKyAgYm9vbCBpc01lcmdlYWJsZUNvbnN0KCkgY29uc3QgeworICAgIHJldHVybiBLID09IE1lcmdlYWJsZUNvbnN0NCB8fCBLID09IE1lcmdlYWJsZUNvbnN0OCB8fAorICAgICAgICAgICBLID09IE1lcmdlYWJsZUNvbnN0MTYgfHwgSyA9PSBNZXJnZWFibGVDb25zdDMyOworICB9CisgIGJvb2wgaXNNZXJnZWFibGVDb25zdDQoKSBjb25zdCB7IHJldHVybiBLID09IE1lcmdlYWJsZUNvbnN0NDsgfQorICBib29sIGlzTWVyZ2VhYmxlQ29uc3Q4KCkgY29uc3QgeyByZXR1cm4gSyA9PSBNZXJnZWFibGVDb25zdDg7IH0KKyAgYm9vbCBpc01lcmdlYWJsZUNvbnN0MTYoKSBjb25zdCB7IHJldHVybiBLID09IE1lcmdlYWJsZUNvbnN0MTY7IH0KKyAgYm9vbCBpc01lcmdlYWJsZUNvbnN0MzIoKSBjb25zdCB7IHJldHVybiBLID09IE1lcmdlYWJsZUNvbnN0MzI7IH0KKworICBib29sIGlzV3JpdGVhYmxlKCkgY29uc3QgeworICAgIHJldHVybiBpc1RocmVhZExvY2FsKCkgfHwgaXNHbG9iYWxXcml0ZWFibGVEYXRhKCk7CisgIH0KKworICBib29sIGlzVGhyZWFkTG9jYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIEsgPT0gVGhyZWFkRGF0YSB8fCBLID09IFRocmVhZEJTUzsKKyAgfQorCisgIGJvb2wgaXNUaHJlYWRCU1MoKSBjb25zdCB7IHJldHVybiBLID09IFRocmVhZEJTUzsgfQorICBib29sIGlzVGhyZWFkRGF0YSgpIGNvbnN0IHsgcmV0dXJuIEsgPT0gVGhyZWFkRGF0YTsgfQorCisgIGJvb2wgaXNHbG9iYWxXcml0ZWFibGVEYXRhKCkgY29uc3QgeworICAgIHJldHVybiBpc0JTUygpIHx8IGlzQ29tbW9uKCkgfHwgaXNEYXRhKCkgfHwgaXNSZWFkT25seVdpdGhSZWwoKTsKKyAgfQorCisgIGJvb2wgaXNCU1MoKSBjb25zdCB7IHJldHVybiBLID09IEJTUyB8fCBLID09IEJTU0xvY2FsIHx8IEsgPT0gQlNTRXh0ZXJuOyB9CisgIGJvb2wgaXNCU1NMb2NhbCgpIGNvbnN0IHsgcmV0dXJuIEsgPT0gQlNTTG9jYWw7IH0KKyAgYm9vbCBpc0JTU0V4dGVybigpIGNvbnN0IHsgcmV0dXJuIEsgPT0gQlNTRXh0ZXJuOyB9CisKKyAgYm9vbCBpc0NvbW1vbigpIGNvbnN0IHsgcmV0dXJuIEsgPT0gQ29tbW9uOyB9CisKKyAgYm9vbCBpc0RhdGEoKSBjb25zdCB7IHJldHVybiBLID09IERhdGE7IH0KKworICBib29sIGlzUmVhZE9ubHlXaXRoUmVsKCkgY29uc3QgeworICAgIHJldHVybiBLID09IFJlYWRPbmx5V2l0aFJlbDsKKyAgfQorcHJpdmF0ZToKKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldChLaW5kIEspIHsKKyAgICBTZWN0aW9uS2luZCBSZXM7CisgICAgUmVzLksgPSBLOworICAgIHJldHVybiBSZXM7CisgIH0KK3B1YmxpYzoKKworICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0TWV0YWRhdGEoKSB7IHJldHVybiBnZXQoTWV0YWRhdGEpOyB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRUZXh0KCkgeyByZXR1cm4gZ2V0KFRleHQpOyB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRFeGVjdXRlT25seSgpIHsgcmV0dXJuIGdldChFeGVjdXRlT25seSk7IH0KKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldFJlYWRPbmx5KCkgeyByZXR1cm4gZ2V0KFJlYWRPbmx5KTsgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0TWVyZ2VhYmxlMUJ5dGVDU3RyaW5nKCkgeworICAgIHJldHVybiBnZXQoTWVyZ2VhYmxlMUJ5dGVDU3RyaW5nKTsKKyAgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0TWVyZ2VhYmxlMkJ5dGVDU3RyaW5nKCkgeworICAgIHJldHVybiBnZXQoTWVyZ2VhYmxlMkJ5dGVDU3RyaW5nKTsKKyAgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0TWVyZ2VhYmxlNEJ5dGVDU3RyaW5nKCkgeworICAgIHJldHVybiBnZXQoTWVyZ2VhYmxlNEJ5dGVDU3RyaW5nKTsKKyAgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0TWVyZ2VhYmxlQ29uc3Q0KCkgeyByZXR1cm4gZ2V0KE1lcmdlYWJsZUNvbnN0NCk7IH0KKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldE1lcmdlYWJsZUNvbnN0OCgpIHsgcmV0dXJuIGdldChNZXJnZWFibGVDb25zdDgpOyB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRNZXJnZWFibGVDb25zdDE2KCkgeyByZXR1cm4gZ2V0KE1lcmdlYWJsZUNvbnN0MTYpOyB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRNZXJnZWFibGVDb25zdDMyKCkgeyByZXR1cm4gZ2V0KE1lcmdlYWJsZUNvbnN0MzIpOyB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRUaHJlYWRCU1MoKSB7IHJldHVybiBnZXQoVGhyZWFkQlNTKTsgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0VGhyZWFkRGF0YSgpIHsgcmV0dXJuIGdldChUaHJlYWREYXRhKTsgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0QlNTKCkgeyByZXR1cm4gZ2V0KEJTUyk7IH0KKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldEJTU0xvY2FsKCkgeyByZXR1cm4gZ2V0KEJTU0xvY2FsKTsgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0QlNTRXh0ZXJuKCkgeyByZXR1cm4gZ2V0KEJTU0V4dGVybik7IH0KKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldENvbW1vbigpIHsgcmV0dXJuIGdldChDb21tb24pOyB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXREYXRhKCkgeyByZXR1cm4gZ2V0KERhdGEpOyB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRSZWFkT25seVdpdGhSZWwoKSB7IHJldHVybiBnZXQoUmVhZE9ubHlXaXRoUmVsKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL1N0cmluZ1RhYmxlQnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9TdHJpbmdUYWJsZUJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWJjNTVhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9TdHJpbmdUYWJsZUJ1aWxkZXIuaApAQCAtMCwwICsxLDc1IEBACisvLz09PS0gU3RyaW5nVGFibGVCdWlsZGVyLmggLSBTdHJpbmcgdGFibGUgYnVpbGRpbmcgdXRpbGl0eSAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfU1RSSU5HVEFCTEVCVUlMREVSX0gKKyNkZWZpbmUgTExWTV9NQ19TVFJJTkdUQUJMRUJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQ2FjaGVkSGFzaFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gXGJyaWVmIFV0aWxpdHkgZm9yIGJ1aWxkaW5nIHN0cmluZyB0YWJsZXMgd2l0aCBkZWR1cGxpY2F0ZWQgc3VmZml4ZXMuCitjbGFzcyBTdHJpbmdUYWJsZUJ1aWxkZXIgeworcHVibGljOgorICBlbnVtIEtpbmQgeyBFTEYsIFdpbkNPRkYsIE1hY2hPLCBSQVcsIERXQVJGIH07CisKK3ByaXZhdGU6CisgIERlbnNlTWFwPENhY2hlZEhhc2hTdHJpbmdSZWYsIHNpemVfdD4gU3RyaW5nSW5kZXhNYXA7CisgIHNpemVfdCBTaXplID0gMDsKKyAgS2luZCBLOworICB1bnNpZ25lZCBBbGlnbm1lbnQ7CisgIGJvb2wgRmluYWxpemVkID0gZmFsc2U7CisKKyAgdm9pZCBmaW5hbGl6ZVN0cmluZ1RhYmxlKGJvb2wgT3B0aW1pemUpOworICB2b2lkIGluaXRTaXplKCk7CisKK3B1YmxpYzoKKyAgU3RyaW5nVGFibGVCdWlsZGVyKEtpbmQgSywgdW5zaWduZWQgQWxpZ25tZW50ID0gMSk7CisgIH5TdHJpbmdUYWJsZUJ1aWxkZXIoKTsKKworICAvLy8gXGJyaWVmIEFkZCBhIHN0cmluZyB0byB0aGUgYnVpbGRlci4gUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgUyBpbiB0aGUKKyAgLy8vIHRhYmxlLiBUaGUgcG9zaXRpb24gd2lsbCBiZSBjaGFuZ2VkIGlmIGZpbmFsaXplIGlzIHVzZWQuCisgIC8vLyBDYW4gb25seSBiZSB1c2VkIGJlZm9yZSB0aGUgdGFibGUgaXMgZmluYWxpemVkLgorICBzaXplX3QgYWRkKENhY2hlZEhhc2hTdHJpbmdSZWYgUyk7CisgIHNpemVfdCBhZGQoU3RyaW5nUmVmIFMpIHsgcmV0dXJuIGFkZChDYWNoZWRIYXNoU3RyaW5nUmVmKFMpKTsgfQorCisgIC8vLyBcYnJpZWYgQW5hbHl6ZSB0aGUgc3RyaW5ncyBhbmQgYnVpbGQgdGhlIGZpbmFsIHRhYmxlLiBObyBtb3JlIHN0cmluZ3MgY2FuCisgIC8vLyBiZSBhZGRlZCBhZnRlciB0aGlzIHBvaW50LgorICB2b2lkIGZpbmFsaXplKCk7CisKKyAgLy8vIEZpbmFsaXplIHRoZSBzdHJpbmcgdGFibGUgd2l0aG91dCByZW9yZGluZyBpdC4gSW4gdGhpcyBtb2RlLCBvZmZzZXRzCisgIC8vLyByZXR1cm5lZCBieSBhZGQgd2lsbCBzdGlsbCBiZSB2YWxpZC4KKyAgdm9pZCBmaW5hbGl6ZUluT3JkZXIoKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgb2ZmZXN0IG9mIGEgc3RyaW5nIGluIHRoZSBzdHJpbmcgdGFibGUuIENhbiBvbmx5IGJlIHVzZWQKKyAgLy8vIGFmdGVyIHRoZSB0YWJsZSBpcyBmaW5hbGl6ZWQuCisgIHNpemVfdCBnZXRPZmZzZXQoQ2FjaGVkSGFzaFN0cmluZ1JlZiBTKSBjb25zdDsKKyAgc2l6ZV90IGdldE9mZnNldChTdHJpbmdSZWYgUykgY29uc3QgeworICAgIHJldHVybiBnZXRPZmZzZXQoQ2FjaGVkSGFzaFN0cmluZ1JlZihTKSk7CisgIH0KKworICBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKyAgdm9pZCBjbGVhcigpOworCisgIHZvaWQgd3JpdGUocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgdm9pZCB3cml0ZSh1aW50OF90ICpCdWYpIGNvbnN0OworCitwcml2YXRlOgorICBib29sIGlzRmluYWxpemVkKCkgY29uc3QgeyByZXR1cm4gRmluYWxpemVkOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19TVFJJTkdUQUJMRUJVSUxERVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9TdWJ0YXJnZXRGZWF0dXJlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL1N1YnRhcmdldEZlYXR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmM3ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9TdWJ0YXJnZXRGZWF0dXJlLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8vPT09LSBsbHZtL01DL1N1YnRhcmdldEZlYXR1cmUuaCAtIENQVSBjaGFyYWN0ZXJpc3RpY3MgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlIERlZmluZXMgYW5kIG1hbmFnZXMgdXNlciBvciB0b29sIHNwZWNpZmllZCBDUFUgY2hhcmFjdGVyaXN0aWNzLgorLy8vIFRoZSBpbnRlbnQgaXMgdG8gYmUgYWJsZSB0byBwYWNrYWdlIHNwZWNpZmljIGZlYXR1cmVzIHRoYXQgc2hvdWxkIG9yIHNob3VsZAorLy8vIG5vdCBiZSB1c2VkIG9uIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3Nvci4gIEEgdG9vbCwgc3VjaCBhcyBsbGMsIGNvdWxkLCBhcworLy8vIGFzIGV4YW1wbGUsIGdhdGhlciBjaGlwIGluZm8gZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBhIGxvbmcgd2l0aCBmZWF0dXJlcworLy8vIHRoYXQgc2hvdWxkIGJlIHVzZWQgb24gdGhhdCBjaGlwLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19TVUJUQVJHRVRGRUFUVVJFX0gKKyNkZWZpbmUgTExWTV9NQ19TVUJUQVJHRVRGRUFUVVJFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEFycmF5UmVmOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBUcmlwbGU7CisKK2NvbnN0IHVuc2lnbmVkIE1BWF9TVUJUQVJHRVRfRkVBVFVSRVMgPSAxOTI7CisvLy8gQ29udGFpbmVyIGNsYXNzIGZvciBzdWJ0YXJnZXQgZmVhdHVyZXMuCisvLy8gVGhpcyBpcyBjb252ZW5pZW50IGJlY2F1c2Ugc3RkOjpiaXRzZXQgZG9lcyBub3QgaGF2ZSBhIGNvbnN0cnVjdG9yCisvLy8gd2l0aCBhbiBpbml0aWFsaXplciBsaXN0IG9mIHNldCBiaXRzLgorY2xhc3MgRmVhdHVyZUJpdHNldCA6IHB1YmxpYyBzdGQ6OmJpdHNldDxNQVhfU1VCVEFSR0VUX0ZFQVRVUkVTPiB7CitwdWJsaWM6CisgIC8vIENhbm5vdCBpbmhlcml0IGNvbnN0cnVjdG9ycyBiZWNhdXNlIGl0J3Mgbm90IHN1cHBvcnRlZCBieSBWQysrLi4KKyAgRmVhdHVyZUJpdHNldCgpID0gZGVmYXVsdDsKKworICBGZWF0dXJlQml0c2V0KGNvbnN0IGJpdHNldDxNQVhfU1VCVEFSR0VUX0ZFQVRVUkVTPiYgQikgOiBiaXRzZXQoQikge30KKworICBGZWF0dXJlQml0c2V0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx1bnNpZ25lZD4gSW5pdCkgeworICAgIGZvciAoYXV0byBJIDogSW5pdCkKKyAgICAgIHNldChJKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFVzZWQgdG8gcHJvdmlkZSBrZXkgdmFsdWUgcGFpcnMgZm9yIGZlYXR1cmUgYW5kIENQVSBiaXQgZmxhZ3MuCitzdHJ1Y3QgU3VidGFyZ2V0RmVhdHVyZUtWIHsKKyAgY29uc3QgY2hhciAqS2V5OyAgICAgICAgICAgICAgICAgICAgICAvLy88IEstViBrZXkgc3RyaW5nCisgIGNvbnN0IGNoYXIgKkRlc2M7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBIZWxwIGRlc2NyaXB0b3IKKyAgRmVhdHVyZUJpdHNldCBWYWx1ZTsgICAgICAgICAgICAgICAgICAvLy88IEstViBpbnRlZ2VyIHZhbHVlCisgIEZlYXR1cmVCaXRzZXQgSW1wbGllczsgICAgICAgICAgICAgICAgLy8vPCBLLVYgYml0IG1hc2sKKworICAvLy8gQ29tcGFyZSByb3V0aW5lIGZvciBzdGQ6Omxvd2VyX2JvdW5kCisgIGJvb2wgb3BlcmF0b3I8KFN0cmluZ1JlZiBTKSBjb25zdCB7CisgICAgcmV0dXJuIFN0cmluZ1JlZihLZXkpIDwgUzsKKyAgfQorCisgIC8vLyBDb21wYXJlIHJvdXRpbmUgZm9yIHN0ZDo6aXNfc29ydGVkLgorICBib29sIG9wZXJhdG9yPChjb25zdCBTdWJ0YXJnZXRGZWF0dXJlS1YgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIFN0cmluZ1JlZihLZXkpIDwgU3RyaW5nUmVmKE90aGVyLktleSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBVc2VkIHRvIHByb3ZpZGUga2V5IHZhbHVlIHBhaXJzIGZvciBDUFUgYW5kIGFyYml0cmFyeSBwb2ludGVycy4KK3N0cnVjdCBTdWJ0YXJnZXRJbmZvS1YgeworICBjb25zdCBjaGFyICpLZXk7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSy1WIGtleSBzdHJpbmcKKyAgY29uc3Qgdm9pZCAqVmFsdWU7ICAgICAgICAgICAgICAgICAgICAvLy88IEstViBwb2ludGVyIHZhbHVlCisKKyAgLy8vIENvbXBhcmUgcm91dGluZSBmb3Igc3RkOjpsb3dlcl9ib3VuZAorICBib29sIG9wZXJhdG9yPChTdHJpbmdSZWYgUykgY29uc3QgeworICAgIHJldHVybiBTdHJpbmdSZWYoS2V5KSA8IFM7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBNYW5hZ2VzIHRoZSBlbmFibGluZyBhbmQgZGlzYWJsaW5nIG9mIHN1YnRhcmdldCBzcGVjaWZpYyBmZWF0dXJlcy4KKy8vLworLy8vIEZlYXR1cmVzIGFyZSBlbmNvZGVkIGFzIGEgc3RyaW5nIG9mIHRoZSBmb3JtCisvLy8gICAiK2F0dHIxLCthdHRyMiwtYXR0cjMsLi4uLCthdHRyTiIKKy8vLyBBIGNvbW1hIHNlcGFyYXRlcyBlYWNoIGZlYXR1cmUgZnJvbSB0aGUgbmV4dCAoYWxsIGxvd2VyY2FzZS4pCisvLy8gRWFjaCBvZiB0aGUgcmVtYWluaW5nIGZlYXR1cmVzIGlzIHByZWZpeGVkIHdpdGggKyBvciAtIGluZGljYXRpbmcgd2hldGhlcgorLy8vIHRoYXQgZmVhdHVyZSBzaG91bGQgYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBjb250cmFyeSB0byB0aGUgY3B1CisvLy8gc3BlY2lmaWNhdGlvbi4KK2NsYXNzIFN1YnRhcmdldEZlYXR1cmVzIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEZlYXR1cmVzOyAgICAvLy88IFN1YnRhcmdldCBmZWF0dXJlcyBhcyBhIHZlY3RvcgorCitwdWJsaWM6CisgIGV4cGxpY2l0IFN1YnRhcmdldEZlYXR1cmVzKFN0cmluZ1JlZiBJbml0aWFsID0gIiIpOworCisgIC8vLyBSZXR1cm5zIGZlYXR1cmVzIGFzIGEgc3RyaW5nLgorICBzdGQ6OnN0cmluZyBnZXRTdHJpbmcoKSBjb25zdDsKKworICAvLy8gQWRkcyBGZWF0dXJlcy4KKyAgdm9pZCBBZGRGZWF0dXJlKFN0cmluZ1JlZiBTdHJpbmcsIGJvb2wgRW5hYmxlID0gdHJ1ZSk7CisKKyAgLy8vIFRvZ2dsZXMgYSBmZWF0dXJlIGFuZCB1cGRhdGUgdGhlIGZlYXR1cmUgYml0cy4KKyAgc3RhdGljIHZvaWQgVG9nZ2xlRmVhdHVyZShGZWF0dXJlQml0c2V0ICZCaXRzLCBTdHJpbmdSZWYgU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFN1YnRhcmdldEZlYXR1cmVLVj4gRmVhdHVyZVRhYmxlKTsKKworICAvLy8gQXBwbGllcyB0aGUgZmVhdHVyZSBmbGFnIGFuZCB1cGRhdGUgdGhlIGZlYXR1cmUgYml0cy4KKyAgc3RhdGljIHZvaWQgQXBwbHlGZWF0dXJlRmxhZyhGZWF0dXJlQml0c2V0ICZCaXRzLCBTdHJpbmdSZWYgRmVhdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTdWJ0YXJnZXRGZWF0dXJlS1Y+IEZlYXR1cmVUYWJsZSk7CisKKyAgLy8vIFJldHVybnMgZmVhdHVyZSBiaXRzIG9mIGEgQ1BVLgorICBGZWF0dXJlQml0c2V0IGdldEZlYXR1cmVCaXRzKFN0cmluZ1JlZiBDUFUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U3VidGFyZ2V0RmVhdHVyZUtWPiBDUFVUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTdWJ0YXJnZXRGZWF0dXJlS1Y+IEZlYXR1cmVUYWJsZSk7CisKKyAgLy8vIFJldHVybnMgdGhlIHZlY3RvciBvZiBpbmRpdmlkdWFsIHN1YnRhcmdldCBmZWF0dXJlcy4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZnZXRGZWF0dXJlcygpIGNvbnN0IHsgcmV0dXJuIEZlYXR1cmVzOyB9CisKKyAgLy8vIFByaW50cyBmZWF0dXJlIHN0cmluZy4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIC8vIER1bXBzIGZlYXR1cmUgaW5mby4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIEFkZHMgdGhlIGRlZmF1bHQgZmVhdHVyZXMgZm9yIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IHRyaXBsZS4KKyAgdm9pZCBnZXREZWZhdWx0U3VidGFyZ2V0RmVhdHVyZXMoY29uc3QgVHJpcGxlJiBUcmlwbGUpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfU1VCVEFSR0VURkVBVFVSRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9BcmNoaXZlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9BcmNoaXZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExNTEyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0FyY2hpdmUuaApAQCAtMCwwICsxLDI4OSBAQAorLy89PT0tIEFyY2hpdmUuaCAtIGFyIGFyY2hpdmUgZmlsZSBmb3JtYXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGFyIGFyY2hpdmUgZmlsZSBmb3JtYXQgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVF9BUkNISVZFX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RfQVJDSElWRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvQmluYXJ5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nocm9uby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvYmplY3QgeworCitjbGFzcyBBcmNoaXZlOworCitjbGFzcyBBcmNoaXZlTWVtYmVySGVhZGVyIHsKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEFyY2hpdmU7CisKKyAgQXJjaGl2ZU1lbWJlckhlYWRlcihBcmNoaXZlIGNvbnN0ICpQYXJlbnQsIGNvbnN0IGNoYXIgKlJhd0hlYWRlclB0ciwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplLCBFcnJvciAqRXJyKTsKKyAgLy8gQXJjaGl2ZU1lbWJlckhlYWRlcigpID0gZGVmYXVsdDsKKworICAvLy8gR2V0IHRoZSBuYW1lIHdpdGhvdXQgbG9va2luZyB1cCBsb25nIG5hbWVzLgorICBFeHBlY3RlZDxTdHJpbmdSZWY+IGdldFJhd05hbWUoKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBuYW1lIGxvb2tpbmcgdXAgbG9uZyBuYW1lcy4KKyAgRXhwZWN0ZWQ8U3RyaW5nUmVmPiBnZXROYW1lKHVpbnQ2NF90IFNpemUpIGNvbnN0OworCisgIC8vLyBNZW1iZXJzIGFyZSBub3QgbGFyZ2VyIHRoYW4gNEdCLgorICBFeHBlY3RlZDx1aW50MzJfdD4gZ2V0U2l6ZSgpIGNvbnN0OworCisgIEV4cGVjdGVkPHN5czo6ZnM6OnBlcm1zPiBnZXRBY2Nlc3NNb2RlKCkgY29uc3Q7CisgIEV4cGVjdGVkPHN5czo6VGltZVBvaW50PHN0ZDo6Y2hyb25vOjpzZWNvbmRzPj4gZ2V0TGFzdE1vZGlmaWVkKCkgY29uc3Q7CisKKyAgU3RyaW5nUmVmIGdldFJhd0xhc3RNb2RpZmllZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RyaW5nUmVmKEFyTWVtSGRyLT5MYXN0TW9kaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQXJNZW1IZHItPkxhc3RNb2RpZmllZCkpLnJ0cmltKCcgJyk7CisgIH0KKworICBFeHBlY3RlZDx1bnNpZ25lZD4gZ2V0VUlEKCkgY29uc3Q7CisgIEV4cGVjdGVkPHVuc2lnbmVkPiBnZXRHSUQoKSBjb25zdDsKKworICAvLyBUaGlzIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHByaXZhdGUgc3RydWN0IEFyTWVtSGRyVHlwZQorICB1aW50NjRfdCBnZXRTaXplT2YoKSBjb25zdCB7CisgICAgcmV0dXJuIHNpemVvZihBck1lbUhkclR5cGUpOworICB9CisKK3ByaXZhdGU6CisgIHN0cnVjdCBBck1lbUhkclR5cGUgeworICAgIGNoYXIgTmFtZVsxNl07CisgICAgY2hhciBMYXN0TW9kaWZpZWRbMTJdOworICAgIGNoYXIgVUlEWzZdOworICAgIGNoYXIgR0lEWzZdOworICAgIGNoYXIgQWNjZXNzTW9kZVs4XTsKKyAgICBjaGFyIFNpemVbMTBdOyAvLy88IFNpemUgb2YgZGF0YSwgbm90IGluY2x1ZGluZyBoZWFkZXIgb3IgcGFkZGluZy4KKyAgICBjaGFyIFRlcm1pbmF0b3JbMl07CisgIH07CisgIEFyY2hpdmUgY29uc3QgKlBhcmVudDsKKyAgQXJNZW1IZHJUeXBlIGNvbnN0ICpBck1lbUhkcjsKK307CisKK2NsYXNzIEFyY2hpdmUgOiBwdWJsaWMgQmluYXJ5IHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIGNsYXNzIENoaWxkIHsKKyAgICBmcmllbmQgQXJjaGl2ZTsKKyAgICBmcmllbmQgQXJjaGl2ZU1lbWJlckhlYWRlcjsKKworICAgIGNvbnN0IEFyY2hpdmUgKlBhcmVudDsKKyAgICBBcmNoaXZlTWVtYmVySGVhZGVyIEhlYWRlcjsKKyAgICAvLy8gXGJyaWVmIEluY2x1ZGVzIGhlYWRlciBidXQgbm90IHBhZGRpbmcgYnl0ZS4KKyAgICBTdHJpbmdSZWYgRGF0YTsKKyAgICAvLy8gXGJyaWVmIE9mZnNldCBmcm9tIERhdGEgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgorICAgIHVpbnQxNl90IFN0YXJ0T2ZGaWxlOworCisgICAgRXhwZWN0ZWQ8Ym9vbD4gaXNUaGluTWVtYmVyKCkgY29uc3Q7CisKKyAgcHVibGljOgorICAgIENoaWxkKGNvbnN0IEFyY2hpdmUgKlBhcmVudCwgY29uc3QgY2hhciAqU3RhcnQsIEVycm9yICpFcnIpOworICAgIENoaWxkKGNvbnN0IEFyY2hpdmUgKlBhcmVudCwgU3RyaW5nUmVmIERhdGEsIHVpbnQxNl90IFN0YXJ0T2ZGaWxlKTsKKworICAgIGJvb2wgb3BlcmF0b3IgPT0oY29uc3QgQ2hpbGQgJm90aGVyKSBjb25zdCB7CisgICAgICBhc3NlcnQoIVBhcmVudCB8fCAhb3RoZXIuUGFyZW50IHx8IFBhcmVudCA9PSBvdGhlci5QYXJlbnQpOworICAgICAgcmV0dXJuIERhdGEuYmVnaW4oKSA9PSBvdGhlci5EYXRhLmJlZ2luKCk7CisgICAgfQorCisgICAgY29uc3QgQXJjaGl2ZSAqZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gUGFyZW50OyB9CisgICAgRXhwZWN0ZWQ8Q2hpbGQ+IGdldE5leHQoKSBjb25zdDsKKworICAgIEV4cGVjdGVkPFN0cmluZ1JlZj4gZ2V0TmFtZSgpIGNvbnN0OworICAgIEV4cGVjdGVkPHN0ZDo6c3RyaW5nPiBnZXRGdWxsTmFtZSgpIGNvbnN0OworICAgIEV4cGVjdGVkPFN0cmluZ1JlZj4gZ2V0UmF3TmFtZSgpIGNvbnN0IHsgcmV0dXJuIEhlYWRlci5nZXRSYXdOYW1lKCk7IH0KKworICAgIEV4cGVjdGVkPHN5czo6VGltZVBvaW50PHN0ZDo6Y2hyb25vOjpzZWNvbmRzPj4gZ2V0TGFzdE1vZGlmaWVkKCkgY29uc3QgeworICAgICAgcmV0dXJuIEhlYWRlci5nZXRMYXN0TW9kaWZpZWQoKTsKKyAgICB9CisKKyAgICBTdHJpbmdSZWYgZ2V0UmF3TGFzdE1vZGlmaWVkKCkgY29uc3QgeworICAgICAgcmV0dXJuIEhlYWRlci5nZXRSYXdMYXN0TW9kaWZpZWQoKTsKKyAgICB9CisKKyAgICBFeHBlY3RlZDx1bnNpZ25lZD4gZ2V0VUlEKCkgY29uc3QgeyByZXR1cm4gSGVhZGVyLmdldFVJRCgpOyB9CisgICAgRXhwZWN0ZWQ8dW5zaWduZWQ+IGdldEdJRCgpIGNvbnN0IHsgcmV0dXJuIEhlYWRlci5nZXRHSUQoKTsgfQorCisgICAgRXhwZWN0ZWQ8c3lzOjpmczo6cGVybXM+IGdldEFjY2Vzc01vZGUoKSBjb25zdCB7CisgICAgICByZXR1cm4gSGVhZGVyLmdldEFjY2Vzc01vZGUoKTsKKyAgICB9CisKKyAgICAvLy8gXHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYXJjaGl2ZSBtZW1iZXIgd2l0aG91dCB0aGUgaGVhZGVyIG9yIHBhZGRpbmcuCisgICAgRXhwZWN0ZWQ8dWludDY0X3Q+IGdldFNpemUoKSBjb25zdDsKKyAgICAvLy8gXHJldHVybiB0aGUgc2l6ZSBpbiB0aGUgYXJjaGl2ZSBoZWFkZXIgZm9yIHRoaXMgbWVtYmVyLgorICAgIEV4cGVjdGVkPHVpbnQ2NF90PiBnZXRSYXdTaXplKCkgY29uc3Q7CisKKyAgICBFeHBlY3RlZDxTdHJpbmdSZWY+IGdldEJ1ZmZlcigpIGNvbnN0OworICAgIHVpbnQ2NF90IGdldENoaWxkT2Zmc2V0KCkgY29uc3Q7CisKKyAgICBFeHBlY3RlZDxNZW1vcnlCdWZmZXJSZWY+IGdldE1lbW9yeUJ1ZmZlclJlZigpIGNvbnN0OworCisgICAgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPEJpbmFyeT4+CisgICAgZ2V0QXNCaW5hcnkoTExWTUNvbnRleHQgKkNvbnRleHQgPSBudWxscHRyKSBjb25zdDsKKyAgfTsKKworICBjbGFzcyBjaGlsZF9pdGVyYXRvciB7CisgICAgQ2hpbGQgQzsKKyAgICBFcnJvciAqRSA9IG51bGxwdHI7CisKKyAgcHVibGljOgorICAgIGNoaWxkX2l0ZXJhdG9yKCkgOiBDKENoaWxkKG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKSB7fQorICAgIGNoaWxkX2l0ZXJhdG9yKGNvbnN0IENoaWxkICZDLCBFcnJvciAqRSkgOiBDKEMpLCBFKEUpIHt9CisKKyAgICBjb25zdCBDaGlsZCAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZDOyB9CisgICAgY29uc3QgQ2hpbGQgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIEM7IH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjaGlsZF9pdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIElnbm9yZSBlcnJvcnMgaGVyZTogSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGluY3JlbWVudCB0aGVuIGdldE5leHQKKyAgICAgIC8vIHdpbGwgaGF2ZSBiZWVuIHNldCB0byBjaGlsZF9lbmQoKSwgYW5kIHRoZSBmb2xsb3dpbmcgY29tcGFyaXNvbiBzaG91bGQKKyAgICAgIC8vIGRvIHRoZSByaWdodCB0aGluZy4KKyAgICAgIHJldHVybiBDID09IG90aGVyLkM7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNoaWxkX2l0ZXJhdG9yICZvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgIH0KKworICAgIC8vIENvZGUgaW4gbG9vcHMgd2l0aCBjaGlsZF9pdGVyYXRvcnMgbXVzdCBjaGVjayBmb3IgZXJyb3JzIG9uIGVhY2ggbG9vcAorICAgIC8vIGl0ZXJhdGlvbi4gIEFuZCBpZiB0aGVyZSBpcyBhbiBlcnJvciBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisgICAgY2hpbGRfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7IC8vIFByZWluY3JlbWVudAorICAgICAgYXNzZXJ0KEUgJiYgIkNhbid0IGluY3JlbWVudCBpdGVyYXRvciB3aXRoIG5vIEVycm9yIGF0dGFjaGVkIik7CisgICAgICBFcnJvckFzT3V0UGFyYW1ldGVyIEVyckFzT3V0UGFyYW0oRSk7CisgICAgICBpZiAoYXV0byBDaGlsZE9yRXJyID0gQy5nZXROZXh0KCkpCisgICAgICAgIEMgPSAqQ2hpbGRPckVycjsKKyAgICAgIGVsc2UgeworICAgICAgICBDID0gQy5nZXRQYXJlbnQoKS0+Y2hpbGRfZW5kKCkuQzsKKyAgICAgICAgKkUgPSBDaGlsZE9yRXJyLnRha2VFcnJvcigpOworICAgICAgICBFID0gbnVsbHB0cjsKKyAgICAgIH0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgIH07CisKKyAgY2xhc3MgU3ltYm9sIHsKKyAgICBjb25zdCBBcmNoaXZlICpQYXJlbnQ7CisgICAgdWludDMyX3QgU3ltYm9sSW5kZXg7CisgICAgdWludDMyX3QgU3RyaW5nSW5kZXg7IC8vIEV4dHJhIGluZGV4IHRvIHRoZSBzdHJpbmcuCisKKyAgcHVibGljOgorICAgIFN5bWJvbChjb25zdCBBcmNoaXZlICpwLCB1aW50MzJfdCBzeW1pLCB1aW50MzJfdCBzdHJpKQorICAgICAgOiBQYXJlbnQocCkKKyAgICAgICwgU3ltYm9sSW5kZXgoc3ltaSkKKyAgICAgICwgU3RyaW5nSW5kZXgoc3RyaSkge30KKworICAgIGJvb2wgb3BlcmF0b3IgPT0oY29uc3QgU3ltYm9sICZvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIChQYXJlbnQgPT0gb3RoZXIuUGFyZW50KSAmJiAoU3ltYm9sSW5kZXggPT0gb3RoZXIuU3ltYm9sSW5kZXgpOworICAgIH0KKworICAgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3Q7CisgICAgRXhwZWN0ZWQ8Q2hpbGQ+IGdldE1lbWJlcigpIGNvbnN0OworICAgIFN5bWJvbCBnZXROZXh0KCkgY29uc3Q7CisgIH07CisKKyAgY2xhc3Mgc3ltYm9sX2l0ZXJhdG9yIHsKKyAgICBTeW1ib2wgc3ltYm9sOworCisgIHB1YmxpYzoKKyAgICBzeW1ib2xfaXRlcmF0b3IoY29uc3QgU3ltYm9sICZzKSA6IHN5bWJvbChzKSB7fQorCisgICAgY29uc3QgU3ltYm9sICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJnN5bWJvbDsgfQorICAgIGNvbnN0IFN5bWJvbCAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gc3ltYm9sOyB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3Qgc3ltYm9sX2l0ZXJhdG9yICZvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIHN5bWJvbCA9PSBvdGhlci5zeW1ib2w7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHN5bWJvbF9pdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICB9CisKKyAgICBzeW1ib2xfaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7ICAvLyBQcmVpbmNyZW1lbnQKKyAgICAgIHN5bWJvbCA9IHN5bWJvbC5nZXROZXh0KCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICB9OworCisgIEFyY2hpdmUoTWVtb3J5QnVmZmVyUmVmIFNvdXJjZSwgRXJyb3IgJkVycik7CisgIHN0YXRpYyBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8QXJjaGl2ZT4+IGNyZWF0ZShNZW1vcnlCdWZmZXJSZWYgU291cmNlKTsKKworICBlbnVtIEtpbmQgeworICAgIEtfR05VLAorICAgIEtfR05VNjQsCisgICAgS19CU0QsCisgICAgS19EQVJXSU4sCisgICAgS19EQVJXSU42NCwKKyAgICBLX0NPRkYKKyAgfTsKKworICBLaW5kIGtpbmQoKSBjb25zdCB7IHJldHVybiAoS2luZClGb3JtYXQ7IH0KKyAgYm9vbCBpc1RoaW4oKSBjb25zdCB7IHJldHVybiBJc1RoaW47IH0KKworICBjaGlsZF9pdGVyYXRvciBjaGlsZF9iZWdpbihFcnJvciAmRXJyLCBib29sIFNraXBJbnRlcm5hbCA9IHRydWUpIGNvbnN0OworICBjaGlsZF9pdGVyYXRvciBjaGlsZF9lbmQoKSBjb25zdDsKKyAgaXRlcmF0b3JfcmFuZ2U8Y2hpbGRfaXRlcmF0b3I+IGNoaWxkcmVuKEVycm9yICZFcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNraXBJbnRlcm5hbCA9IHRydWUpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShjaGlsZF9iZWdpbihFcnIsIFNraXBJbnRlcm5hbCksIGNoaWxkX2VuZCgpKTsKKyAgfQorCisgIHN5bWJvbF9pdGVyYXRvciBzeW1ib2xfYmVnaW4oKSBjb25zdDsKKyAgc3ltYm9sX2l0ZXJhdG9yIHN5bWJvbF9lbmQoKSBjb25zdDsKKyAgaXRlcmF0b3JfcmFuZ2U8c3ltYm9sX2l0ZXJhdG9yPiBzeW1ib2xzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHN5bWJvbF9iZWdpbigpLCBzeW1ib2xfZW5kKCkpOworICB9CisKKyAgLy8gQ2FzdCBtZXRob2RzLgorICBzdGF0aWMgYm9vbCBjbGFzc29mKEJpbmFyeSBjb25zdCAqdikgeworICAgIHJldHVybiB2LT5pc0FyY2hpdmUoKTsKKyAgfQorCisgIC8vIGNoZWNrIGlmIGEgc3ltYm9sIGlzIGluIHRoZSBhcmNoaXZlCisgIEV4cGVjdGVkPE9wdGlvbmFsPENoaWxkPj4gZmluZFN5bShTdHJpbmdSZWYgbmFtZSkgY29uc3Q7CisKKyAgYm9vbCBpc0VtcHR5KCkgY29uc3Q7CisgIGJvb2wgaGFzU3ltYm9sVGFibGUoKSBjb25zdDsKKyAgU3RyaW5nUmVmIGdldFN5bWJvbFRhYmxlKCkgY29uc3QgeyByZXR1cm4gU3ltYm9sVGFibGU7IH0KKyAgU3RyaW5nUmVmIGdldFN0cmluZ1RhYmxlKCkgY29uc3QgeyByZXR1cm4gU3RyaW5nVGFibGU7IH0KKyAgdWludDMyX3QgZ2V0TnVtYmVyT2ZTeW1ib2xzKCkgY29uc3Q7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4+IHRha2VUaGluQnVmZmVycygpIHsKKyAgICByZXR1cm4gc3RkOjptb3ZlKFRoaW5CdWZmZXJzKTsKKyAgfQorCitwcml2YXRlOgorICBTdHJpbmdSZWYgU3ltYm9sVGFibGU7CisgIFN0cmluZ1JlZiBTdHJpbmdUYWJsZTsKKworICBTdHJpbmdSZWYgRmlyc3RSZWd1bGFyRGF0YTsKKyAgdWludDE2X3QgRmlyc3RSZWd1bGFyU3RhcnRPZkZpbGUgPSAtMTsKKyAgdm9pZCBzZXRGaXJzdFJlZ3VsYXIoY29uc3QgQ2hpbGQgJkMpOworCisgIHVuc2lnbmVkIEZvcm1hdCA6IDM7CisgIHVuc2lnbmVkIElzVGhpbiA6IDE7CisgIG11dGFibGUgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4+IFRoaW5CdWZmZXJzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9iamVjdAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT0JKRUNUX0FSQ0hJVkVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvQXJjaGl2ZVdyaXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvQXJjaGl2ZVdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NWI5NDMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9BcmNoaXZlV3JpdGVyLmgKQEAgLTAsMCArMSw0NyBAQAorLy89PT0tIEFyY2hpdmVXcml0ZXIuaCAtIGFyIGFyY2hpdmUgZmlsZSBmb3JtYXQgd3JpdGVyIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZWNsYXJlcyB0aGUgd3JpdGVBcmNoaXZlIGZ1bmN0aW9uIGZvciB3cml0aW5nIGFuIGFyY2hpdmUgZmlsZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUX0FSQ0hJVkVXUklURVJfSAorI2RlZmluZSBMTFZNX09CSkVDVF9BUkNISVZFV1JJVEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0FyY2hpdmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK3N0cnVjdCBOZXdBcmNoaXZlTWVtYmVyIHsKKyAgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gQnVmOworICBTdHJpbmdSZWYgTWVtYmVyTmFtZTsKKyAgc3lzOjpUaW1lUG9pbnQ8c3RkOjpjaHJvbm86OnNlY29uZHM+IE1vZFRpbWU7CisgIHVuc2lnbmVkIFVJRCA9IDAsIEdJRCA9IDAsIFBlcm1zID0gMDY0NDsKKworICBib29sIElzTmV3ID0gZmFsc2U7CisgIE5ld0FyY2hpdmVNZW1iZXIoKSA9IGRlZmF1bHQ7CisgIE5ld0FyY2hpdmVNZW1iZXIoTWVtb3J5QnVmZmVyUmVmIEJ1ZlJlZik7CisKKyAgc3RhdGljIEV4cGVjdGVkPE5ld0FyY2hpdmVNZW1iZXI+CisgIGdldE9sZE1lbWJlcihjb25zdCBvYmplY3Q6OkFyY2hpdmU6OkNoaWxkICZPbGRNZW1iZXIsIGJvb2wgRGV0ZXJtaW5pc3RpYyk7CisKKyAgc3RhdGljIEV4cGVjdGVkPE5ld0FyY2hpdmVNZW1iZXI+IGdldEZpbGUoU3RyaW5nUmVmIEZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERldGVybWluaXN0aWMpOworfTsKKworRXJyb3Igd3JpdGVBcmNoaXZlKFN0cmluZ1JlZiBBcmNOYW1lLCBBcnJheVJlZjxOZXdBcmNoaXZlTWVtYmVyPiBOZXdNZW1iZXJzLAorICAgICAgICAgICAgICAgICAgIGJvb2wgV3JpdGVTeW10YWIsIG9iamVjdDo6QXJjaGl2ZTo6S2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgIGJvb2wgRGV0ZXJtaW5pc3RpYywgYm9vbCBUaGluLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IE9sZEFyY2hpdmVCdWYgPSBudWxscHRyKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9CaW5hcnkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0JpbmFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlOTM2OTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9CaW5hcnkuaApAQCAtMCwwICsxLDIxOSBAQAorLy89PT0tIEJpbmFyeS5oIC0gQSBnZW5lcmljIGJpbmFyeSBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIEJpbmFyeSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUX0JJTkFSWV9ICisjZGVmaW5lIExMVk1fT0JKRUNUX0JJTkFSWV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBTdHJpbmdSZWY7CisKK25hbWVzcGFjZSBvYmplY3QgeworCitjbGFzcyBCaW5hcnkgeworcHJpdmF0ZToKKyAgdW5zaWduZWQgaW50IFR5cGVJRDsKKworcHJvdGVjdGVkOgorICBNZW1vcnlCdWZmZXJSZWYgRGF0YTsKKworICBCaW5hcnkodW5zaWduZWQgaW50IFR5cGUsIE1lbW9yeUJ1ZmZlclJlZiBTb3VyY2UpOworCisgIGVudW0geworICAgIElEX0FyY2hpdmUsCisgICAgSURfTWFjaE9Vbml2ZXJzYWxCaW5hcnksCisgICAgSURfQ09GRkltcG9ydEZpbGUsCisgICAgSURfSVIsICAgICAgICAgICAgICAgICAvLyBMTFZNIElSCisKKyAgICBJRF9XaW5SZXMsIC8vIFdpbmRvd3MgcmVzb3VyY2UgKC5yZXMpIGZpbGUuCisKKyAgICAvLyBPYmplY3QgYW5kIGNoaWxkcmVuLgorICAgIElEX1N0YXJ0T2JqZWN0cywKKyAgICBJRF9DT0ZGLAorCisgICAgSURfRUxGMzJMLCAvLyBFTEYgMzItYml0LCBsaXR0bGUgZW5kaWFuCisgICAgSURfRUxGMzJCLCAvLyBFTEYgMzItYml0LCBiaWcgZW5kaWFuCisgICAgSURfRUxGNjRMLCAvLyBFTEYgNjQtYml0LCBsaXR0bGUgZW5kaWFuCisgICAgSURfRUxGNjRCLCAvLyBFTEYgNjQtYml0LCBiaWcgZW5kaWFuCisKKyAgICBJRF9NYWNoTzMyTCwgLy8gTWFjaE8gMzItYml0LCBsaXR0bGUgZW5kaWFuCisgICAgSURfTWFjaE8zMkIsIC8vIE1hY2hPIDMyLWJpdCwgYmlnIGVuZGlhbgorICAgIElEX01hY2hPNjRMLCAvLyBNYWNoTyA2NC1iaXQsIGxpdHRsZSBlbmRpYW4KKyAgICBJRF9NYWNoTzY0QiwgLy8gTWFjaE8gNjQtYml0LCBiaWcgZW5kaWFuCisKKyAgICBJRF9XYXNtLAorCisgICAgSURfRW5kT2JqZWN0cworICB9OworCisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldEVMRlR5cGUoYm9vbCBpc0xFLCBib29sIGlzNjRCaXRzKSB7CisgICAgaWYgKGlzTEUpCisgICAgICByZXR1cm4gaXM2NEJpdHMgPyBJRF9FTEY2NEwgOiBJRF9FTEYzMkw7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGlzNjRCaXRzID8gSURfRUxGNjRCIDogSURfRUxGMzJCOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGludCBnZXRNYWNoT1R5cGUoYm9vbCBpc0xFLCBib29sIGlzNjRCaXRzKSB7CisgICAgaWYgKGlzTEUpCisgICAgICByZXR1cm4gaXM2NEJpdHMgPyBJRF9NYWNoTzY0TCA6IElEX01hY2hPMzJMOworICAgIGVsc2UKKyAgICAgIHJldHVybiBpczY0Qml0cyA/IElEX01hY2hPNjRCIDogSURfTWFjaE8zMkI7CisgIH0KKworcHVibGljOgorICBCaW5hcnkoKSA9IGRlbGV0ZTsKKyAgQmluYXJ5KGNvbnN0IEJpbmFyeSAmb3RoZXIpID0gZGVsZXRlOworICB2aXJ0dWFsIH5CaW5hcnkoKTsKKworICBTdHJpbmdSZWYgZ2V0RGF0YSgpIGNvbnN0OworICBTdHJpbmdSZWYgZ2V0RmlsZU5hbWUoKSBjb25zdDsKKyAgTWVtb3J5QnVmZmVyUmVmIGdldE1lbW9yeUJ1ZmZlclJlZigpIGNvbnN0OworCisgIC8vIENhc3QgbWV0aG9kcy4KKyAgdW5zaWduZWQgaW50IGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBUeXBlSUQ7IH0KKworICAvLyBDb252ZW5pZW5jZSBtZXRob2RzCisgIGJvb2wgaXNPYmplY3QoKSBjb25zdCB7CisgICAgcmV0dXJuIFR5cGVJRCA+IElEX1N0YXJ0T2JqZWN0cyAmJiBUeXBlSUQgPCBJRF9FbmRPYmplY3RzOworICB9CisKKyAgYm9vbCBpc1N5bWJvbGljKCkgY29uc3QgeyByZXR1cm4gaXNJUigpIHx8IGlzT2JqZWN0KCkgfHwgaXNDT0ZGSW1wb3J0RmlsZSgpOyB9CisKKyAgYm9vbCBpc0FyY2hpdmUoKSBjb25zdCB7CisgICAgcmV0dXJuIFR5cGVJRCA9PSBJRF9BcmNoaXZlOworICB9CisKKyAgYm9vbCBpc01hY2hPVW5pdmVyc2FsQmluYXJ5KCkgY29uc3QgeworICAgIHJldHVybiBUeXBlSUQgPT0gSURfTWFjaE9Vbml2ZXJzYWxCaW5hcnk7CisgIH0KKworICBib29sIGlzRUxGKCkgY29uc3QgeworICAgIHJldHVybiBUeXBlSUQgPj0gSURfRUxGMzJMICYmIFR5cGVJRCA8PSBJRF9FTEY2NEI7CisgIH0KKworICBib29sIGlzTWFjaE8oKSBjb25zdCB7CisgICAgcmV0dXJuIFR5cGVJRCA+PSBJRF9NYWNoTzMyTCAmJiBUeXBlSUQgPD0gSURfTWFjaE82NEI7CisgIH0KKworICBib29sIGlzQ09GRigpIGNvbnN0IHsKKyAgICByZXR1cm4gVHlwZUlEID09IElEX0NPRkY7CisgIH0KKworICBib29sIGlzV2FzbSgpIGNvbnN0IHsgcmV0dXJuIFR5cGVJRCA9PSBJRF9XYXNtOyB9CisKKyAgYm9vbCBpc0NPRkZJbXBvcnRGaWxlKCkgY29uc3QgeworICAgIHJldHVybiBUeXBlSUQgPT0gSURfQ09GRkltcG9ydEZpbGU7CisgIH0KKworICBib29sIGlzSVIoKSBjb25zdCB7CisgICAgcmV0dXJuIFR5cGVJRCA9PSBJRF9JUjsKKyAgfQorCisgIGJvb2wgaXNMaXR0bGVFbmRpYW4oKSBjb25zdCB7CisgICAgcmV0dXJuICEoVHlwZUlEID09IElEX0VMRjMyQiB8fCBUeXBlSUQgPT0gSURfRUxGNjRCIHx8CisgICAgICAgICAgICAgVHlwZUlEID09IElEX01hY2hPMzJCIHx8IFR5cGVJRCA9PSBJRF9NYWNoTzY0Qik7CisgIH0KKworICBib29sIGlzV2luUmVzKCkgY29uc3QgeyByZXR1cm4gVHlwZUlEID09IElEX1dpblJlczsgfQorCisgIFRyaXBsZTo6T2JqZWN0Rm9ybWF0VHlwZSBnZXRUcmlwbGVPYmplY3RGb3JtYXQoKSBjb25zdCB7CisgICAgaWYgKGlzQ09GRigpKQorICAgICAgcmV0dXJuIFRyaXBsZTo6Q09GRjsKKyAgICBpZiAoaXNNYWNoTygpKQorICAgICAgcmV0dXJuIFRyaXBsZTo6TWFjaE87CisgICAgaWYgKGlzRUxGKCkpCisgICAgICByZXR1cm4gVHJpcGxlOjpFTEY7CisgICAgcmV0dXJuIFRyaXBsZTo6VW5rbm93bk9iamVjdEZvcm1hdDsKKyAgfQorCisgIHN0YXRpYyBzdGQ6OmVycm9yX2NvZGUgY2hlY2tPZmZzZXQoTWVtb3J5QnVmZmVyUmVmIE0sIHVpbnRwdHJfdCBBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90IFNpemUpIHsKKyAgICBpZiAoQWRkciArIFNpemUgPCBBZGRyIHx8IEFkZHIgKyBTaXplIDwgU2l6ZSB8fAorICAgICAgICBBZGRyICsgU2l6ZSA+IHVpbnRwdHJfdChNLmdldEJ1ZmZlckVuZCgpKSB8fAorICAgICAgICBBZGRyIDwgdWludHB0cl90KE0uZ2V0QnVmZmVyU3RhcnQoKSkpIHsKKyAgICAgIHJldHVybiBvYmplY3RfZXJyb3I6OnVuZXhwZWN0ZWRfZW9mOworICAgIH0KKyAgICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKCk7CisgIH0KK307CisKKy8vLyBAYnJpZWYgQ3JlYXRlIGEgQmluYXJ5IGZyb20gU291cmNlLCBhdXRvZGV0ZWN0aW5nIHRoZSBmaWxlIHR5cGUuCisvLy8KKy8vLyBAcGFyYW0gU291cmNlIFRoZSBkYXRhIHRvIGNyZWF0ZSB0aGUgQmluYXJ5IGZyb20uCitFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8QmluYXJ5Pj4gY3JlYXRlQmluYXJ5KE1lbW9yeUJ1ZmZlclJlZiBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICpDb250ZXh0ID0gbnVsbHB0cik7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBPd25pbmdCaW5hcnkgeworICBzdGQ6OnVuaXF1ZV9wdHI8VD4gQmluOworICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBCdWY7CisKK3B1YmxpYzoKKyAgT3duaW5nQmluYXJ5KCk7CisgIE93bmluZ0JpbmFyeShzdGQ6OnVuaXF1ZV9wdHI8VD4gQmluLCBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBCdWYpOworICBPd25pbmdCaW5hcnkoT3duaW5nQmluYXJ5PFQ+JiYgT3RoZXIpOworICBPd25pbmdCaW5hcnk8VD4gJm9wZXJhdG9yPShPd25pbmdCaW5hcnk8VD4gJiZPdGhlcik7CisKKyAgc3RkOjpwYWlyPHN0ZDo6dW5pcXVlX3B0cjxUPiwgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4+IHRha2VCaW5hcnkoKTsKKworICBUKiBnZXRCaW5hcnkoKTsKKyAgY29uc3QgVCogZ2V0QmluYXJ5KCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK093bmluZ0JpbmFyeTxUPjo6T3duaW5nQmluYXJ5KHN0ZDo6dW5pcXVlX3B0cjxUPiBCaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBCdWYpCisgICAgOiBCaW4oc3RkOjptb3ZlKEJpbikpLCBCdWYoc3RkOjptb3ZlKEJ1ZikpIHt9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBPd25pbmdCaW5hcnk8VD46Ok93bmluZ0JpbmFyeSgpID0gZGVmYXVsdDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitPd25pbmdCaW5hcnk8VD46Ok93bmluZ0JpbmFyeShPd25pbmdCaW5hcnkgJiZPdGhlcikKKyAgICA6IEJpbihzdGQ6Om1vdmUoT3RoZXIuQmluKSksIEJ1ZihzdGQ6Om1vdmUoT3RoZXIuQnVmKSkge30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitPd25pbmdCaW5hcnk8VD4gJk93bmluZ0JpbmFyeTxUPjo6b3BlcmF0b3I9KE93bmluZ0JpbmFyeSAmJk90aGVyKSB7CisgIEJpbiA9IHN0ZDo6bW92ZShPdGhlci5CaW4pOworICBCdWYgPSBzdGQ6Om1vdmUoT3RoZXIuQnVmKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6cGFpcjxzdGQ6OnVuaXF1ZV9wdHI8VD4sIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+PgorT3duaW5nQmluYXJ5PFQ+Ojp0YWtlQmluYXJ5KCkgeworICByZXR1cm4gc3RkOjptYWtlX3BhaXIoc3RkOjptb3ZlKEJpbiksIHN0ZDo6bW92ZShCdWYpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQqIE93bmluZ0JpbmFyeTxUPjo6Z2V0QmluYXJ5KCkgeworICByZXR1cm4gQmluLmdldCgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY29uc3QgVCogT3duaW5nQmluYXJ5PFQ+OjpnZXRCaW5hcnkoKSBjb25zdCB7CisgIHJldHVybiBCaW4uZ2V0KCk7Cit9CisKK0V4cGVjdGVkPE93bmluZ0JpbmFyeTxCaW5hcnk+PiBjcmVhdGVCaW5hcnkoU3RyaW5nUmVmIFBhdGgpOworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb2JqZWN0CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX09CSkVDVF9CSU5BUllfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvQ09GRi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvQ09GRi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTAxNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9DT0ZGLmgKQEAgLTAsMCArMSwxMjI2IEBACisvLz09PS0gQ09GRi5oIC0gQ09GRiBvYmplY3QgZmlsZSBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgQ09GRk9iamVjdEZpbGUgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVF9DT0ZGX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RfQ09GRl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0NPRkYuaCIKKyNpbmNsdWRlICJsbHZtL01DL1N1YnRhcmdldEZlYXR1cmUuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9CaW5hcnkuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9DVkRlYnVnUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9PYmplY3RGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeUJ5dGVTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29udmVydFVURi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CisKK25hbWVzcGFjZSBvYmplY3QgeworCitjbGFzcyBCYXNlUmVsb2NSZWY7CitjbGFzcyBEZWxheUltcG9ydERpcmVjdG9yeUVudHJ5UmVmOworY2xhc3MgRXhwb3J0RGlyZWN0b3J5RW50cnlSZWY7CitjbGFzcyBJbXBvcnREaXJlY3RvcnlFbnRyeVJlZjsKK2NsYXNzIEltcG9ydGVkU3ltYm9sUmVmOworY2xhc3MgUmVzb3VyY2VTZWN0aW9uUmVmOworCit1c2luZyBpbXBvcnRfZGlyZWN0b3J5X2l0ZXJhdG9yID0gY29udGVudF9pdGVyYXRvcjxJbXBvcnREaXJlY3RvcnlFbnRyeVJlZj47Cit1c2luZyBkZWxheV9pbXBvcnRfZGlyZWN0b3J5X2l0ZXJhdG9yID0KKyAgICBjb250ZW50X2l0ZXJhdG9yPERlbGF5SW1wb3J0RGlyZWN0b3J5RW50cnlSZWY+OwordXNpbmcgZXhwb3J0X2RpcmVjdG9yeV9pdGVyYXRvciA9IGNvbnRlbnRfaXRlcmF0b3I8RXhwb3J0RGlyZWN0b3J5RW50cnlSZWY+OwordXNpbmcgaW1wb3J0ZWRfc3ltYm9sX2l0ZXJhdG9yID0gY29udGVudF9pdGVyYXRvcjxJbXBvcnRlZFN5bWJvbFJlZj47Cit1c2luZyBiYXNlX3JlbG9jX2l0ZXJhdG9yID0gY29udGVudF9pdGVyYXRvcjxCYXNlUmVsb2NSZWY+OworCisvLy8gVGhlIERPUyBjb21wYXRpYmxlIGhlYWRlciBhdCB0aGUgZnJvbnQgb2YgYWxsIFBFL0NPRkYgZXhlY3V0YWJsZXMuCitzdHJ1Y3QgZG9zX2hlYWRlciB7CisgIGNoYXIgICAgICAgICAgICAgICAgIE1hZ2ljWzJdOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBVc2VkQnl0ZXNJblRoZUxhc3RQYWdlOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBGaWxlU2l6ZUluUGFnZXM7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE51bWJlck9mUmVsb2NhdGlvbkl0ZW1zOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBIZWFkZXJTaXplSW5QYXJhZ3JhcGhzOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNaW5pbXVtRXh0cmFQYXJhZ3JhcGhzOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNYXhpbXVtRXh0cmFQYXJhZ3JhcGhzOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBJbml0aWFsUmVsYXRpdmVTUzsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgSW5pdGlhbFNQOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBDaGVja3N1bTsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgSW5pdGlhbElQOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBJbml0aWFsUmVsYXRpdmVDUzsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgQWRkcmVzc09mUmVsb2NhdGlvblRhYmxlOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBPdmVybGF5TnVtYmVyOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBSZXNlcnZlZFs0XTsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgT0VNaWQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE9FTWluZm87CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFJlc2VydmVkMlsxMF07CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEFkZHJlc3NPZk5ld0V4ZUhlYWRlcjsKK307CisKK3N0cnVjdCBjb2ZmX2ZpbGVfaGVhZGVyIHsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWFjaGluZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTnVtYmVyT2ZTZWN0aW9uczsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVGltZURhdGVTdGFtcDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUG9pbnRlclRvU3ltYm9sVGFibGU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE51bWJlck9mU3ltYm9sczsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgU2l6ZU9mT3B0aW9uYWxIZWFkZXI7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IENoYXJhY3RlcmlzdGljczsKKworICBib29sIGlzSW1wb3J0TGlicmFyeSgpIGNvbnN0IHsgcmV0dXJuIE51bWJlck9mU2VjdGlvbnMgPT0gMHhmZmZmOyB9Cit9OworCitzdHJ1Y3QgY29mZl9iaWdvYmpfZmlsZV9oZWFkZXIgeworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBTaWcxOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBTaWcyOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNYWNoaW5lOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBUaW1lRGF0ZVN0YW1wOworICB1aW50OF90ICAgICAgICAgICAgICBVVUlEWzE2XTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgdW51c2VkMTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgdW51c2VkMjsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgdW51c2VkMzsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgdW51c2VkNDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTnVtYmVyT2ZTZWN0aW9uczsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUG9pbnRlclRvU3ltYm9sVGFibGU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE51bWJlck9mU3ltYm9sczsKK307CisKKy8vLyBUaGUgMzItYml0IFBFIGhlYWRlciB0aGF0IGZvbGxvd3MgdGhlIENPRkYgaGVhZGVyLgorc3RydWN0IHBlMzJfaGVhZGVyIHsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWFnaWM7CisgIHVpbnQ4X3QgTWFqb3JMaW5rZXJWZXJzaW9uOworICB1aW50OF90IE1pbm9yTGlua2VyVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZU9mQ29kZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZU9mSW5pdGlhbGl6ZWREYXRhOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaXplT2ZVbmluaXRpYWxpemVkRGF0YTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQWRkcmVzc09mRW50cnlQb2ludDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQmFzZU9mQ29kZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQmFzZU9mRGF0YTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgSW1hZ2VCYXNlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTZWN0aW9uQWxpZ25tZW50OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBGaWxlQWxpZ25tZW50OworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWFqb3JJbWFnZVZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1pbm9ySW1hZ2VWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNYWpvclN1YnN5c3RlbVZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1pbm9yU3Vic3lzdGVtVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgV2luMzJWZXJzaW9uVmFsdWU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpemVPZkltYWdlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaXplT2ZIZWFkZXJzOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDaGVja1N1bTsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgU3Vic3lzdGVtOworICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgRGxsQ2hhcmFjdGVyaXN0aWNzLgorICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBETExDaGFyYWN0ZXJpc3RpY3M7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpemVPZlN0YWNrUmVzZXJ2ZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZU9mU3RhY2tDb21taXQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpemVPZkhlYXBSZXNlcnZlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaXplT2ZIZWFwQ29tbWl0OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBMb2FkZXJGbGFnczsKKyAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIE51bWJlck9mUnZhQW5kU2l6ZXMuCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE51bWJlck9mUnZhQW5kU2l6ZTsKK307CisKKy8vLyBUaGUgNjQtYml0IFBFIGhlYWRlciB0aGF0IGZvbGxvd3MgdGhlIENPRkYgaGVhZGVyLgorc3RydWN0IHBlMzJwbHVzX2hlYWRlciB7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1hZ2ljOworICB1aW50OF90IE1ham9yTGlua2VyVmVyc2lvbjsKKyAgdWludDhfdCBNaW5vckxpbmtlclZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpemVPZkNvZGU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpemVPZkluaXRpYWxpemVkRGF0YTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZU9mVW5pbml0aWFsaXplZERhdGE7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEFkZHJlc3NPZkVudHJ5UG9pbnQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEJhc2VPZkNvZGU7CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IEltYWdlQmFzZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2VjdGlvbkFsaWdubWVudDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRmlsZUFsaWdubWVudDsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1ham9ySW1hZ2VWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNaW5vckltYWdlVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWFqb3JTdWJzeXN0ZW1WZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNaW5vclN1YnN5c3RlbVZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFdpbjMyVmVyc2lvblZhbHVlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaXplT2ZJbWFnZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZU9mSGVhZGVyczsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQ2hlY2tTdW07CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFN1YnN5c3RlbTsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgRExMQ2hhcmFjdGVyaXN0aWNzOworICBzdXBwb3J0Ojp1bGl0dGxlNjRfdCBTaXplT2ZTdGFja1Jlc2VydmU7CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IFNpemVPZlN0YWNrQ29tbWl0OworICBzdXBwb3J0Ojp1bGl0dGxlNjRfdCBTaXplT2ZIZWFwUmVzZXJ2ZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgU2l6ZU9mSGVhcENvbW1pdDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTG9hZGVyRmxhZ3M7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE51bWJlck9mUnZhQW5kU2l6ZTsKK307CisKK3N0cnVjdCBkYXRhX2RpcmVjdG9yeSB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFJlbGF0aXZlVmlydHVhbEFkZHJlc3M7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpemU7Cit9OworCitzdHJ1Y3QgZGVidWdfZGlyZWN0b3J5IHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQ2hhcmFjdGVyaXN0aWNzOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBUaW1lRGF0ZVN0YW1wOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNYWpvclZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1pbm9yVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVHlwZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZU9mRGF0YTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQWRkcmVzc09mUmF3RGF0YTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUG9pbnRlclRvUmF3RGF0YTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbnRUeT4KK3N0cnVjdCBpbXBvcnRfbG9va3VwX3RhYmxlX2VudHJ5IHsKKyAgSW50VHkgRGF0YTsKKworICBib29sIGlzT3JkaW5hbCgpIGNvbnN0IHsgcmV0dXJuIERhdGEgPCAwOyB9CisKKyAgdWludDE2X3QgZ2V0T3JkaW5hbCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNPcmRpbmFsKCkgJiYgIklMVCBlbnRyeSBpcyBub3QgYW4gb3JkaW5hbCEiKTsKKyAgICByZXR1cm4gRGF0YSAmIDB4RkZGRjsKKyAgfQorCisgIHVpbnQzMl90IGdldEhpbnROYW1lUlZBKCkgY29uc3QgeworICAgIGFzc2VydCghaXNPcmRpbmFsKCkgJiYgIklMVCBlbnRyeSBpcyBub3QgYSBIaW50L05hbWUgUlZBISIpOworICAgIHJldHVybiBEYXRhICYgMHhGRkZGRkZGRjsKKyAgfQorfTsKKwordXNpbmcgaW1wb3J0X2xvb2t1cF90YWJsZV9lbnRyeTMyID0KKyAgICBpbXBvcnRfbG9va3VwX3RhYmxlX2VudHJ5PHN1cHBvcnQ6OmxpdHRsZTMyX3Q+OwordXNpbmcgaW1wb3J0X2xvb2t1cF90YWJsZV9lbnRyeTY0ID0KKyAgICBpbXBvcnRfbG9va3VwX3RhYmxlX2VudHJ5PHN1cHBvcnQ6OmxpdHRsZTY0X3Q+OworCitzdHJ1Y3QgZGVsYXlfaW1wb3J0X2RpcmVjdG9yeV90YWJsZV9lbnRyeSB7CisgIC8vIGR1bXBiaW4gcmVwb3J0cyB0aGlzIGZpZWxkIGFzICJDaGFyYWN0ZXJpc3RpY3MiIGluc3RlYWQgb2YgIkF0dHJpYnV0ZXMiLgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBBdHRyaWJ1dGVzOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBOYW1lOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBNb2R1bGVIYW5kbGU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IERlbGF5SW1wb3J0QWRkcmVzc1RhYmxlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBEZWxheUltcG9ydE5hbWVUYWJsZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQm91bmREZWxheUltcG9ydFRhYmxlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBVbmxvYWREZWxheUltcG9ydFRhYmxlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBUaW1lU3RhbXA7Cit9OworCitzdHJ1Y3QgZXhwb3J0X2RpcmVjdG9yeV90YWJsZV9lbnRyeSB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEV4cG9ydEZsYWdzOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBUaW1lRGF0ZVN0YW1wOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNYWpvclZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1pbm9yVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTmFtZVJWQTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgT3JkaW5hbEJhc2U7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEFkZHJlc3NUYWJsZUVudHJpZXM7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE51bWJlck9mTmFtZVBvaW50ZXJzOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBFeHBvcnRBZGRyZXNzVGFibGVSVkE7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE5hbWVQb2ludGVyUlZBOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBPcmRpbmFsVGFibGVSVkE7Cit9OworCit1bmlvbiBleHBvcnRfYWRkcmVzc190YWJsZV9lbnRyeSB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEV4cG9ydFJWQTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRm9yd2FyZGVyUlZBOworfTsKKwordXNpbmcgZXhwb3J0X25hbWVfcG9pbnRlcl90YWJsZV9lbnRyeSA9IHN1cHBvcnQ6OnVsaXR0bGUzMl90OwordXNpbmcgZXhwb3J0X29yZGluYWxfdGFibGVfZW50cnkgPSBzdXBwb3J0Ojp1bGl0dGxlMTZfdDsKKworc3RydWN0IFN0cmluZ1RhYmxlT2Zmc2V0IHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgWmVyb2VzOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBPZmZzZXQ7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VjdGlvbk51bWJlclR5cGU+CitzdHJ1Y3QgY29mZl9zeW1ib2wgeworICB1bmlvbiB7CisgICAgY2hhciBTaG9ydE5hbWVbQ09GRjo6TmFtZVNpemVdOworICAgIFN0cmluZ1RhYmxlT2Zmc2V0IE9mZnNldDsKKyAgfSBOYW1lOworCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFZhbHVlOworICBTZWN0aW9uTnVtYmVyVHlwZSBTZWN0aW9uTnVtYmVyOworCisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFR5cGU7CisKKyAgdWludDhfdCBTdG9yYWdlQ2xhc3M7CisgIHVpbnQ4X3QgTnVtYmVyT2ZBdXhTeW1ib2xzOworfTsKKwordXNpbmcgY29mZl9zeW1ib2wxNiA9IGNvZmZfc3ltYm9sPHN1cHBvcnQ6OnVsaXR0bGUxNl90PjsKK3VzaW5nIGNvZmZfc3ltYm9sMzIgPSBjb2ZmX3N5bWJvbDxzdXBwb3J0Ojp1bGl0dGxlMzJfdD47CisKKy8vIENvbnRhaW5zIG9ubHkgY29tbW9uIHBhcnRzIG9mIGNvZmZfc3ltYm9sMTYgYW5kIGNvZmZfc3ltYm9sMzIuCitzdHJ1Y3QgY29mZl9zeW1ib2xfZ2VuZXJpYyB7CisgIHVuaW9uIHsKKyAgICBjaGFyIFNob3J0TmFtZVtDT0ZGOjpOYW1lU2l6ZV07CisgICAgU3RyaW5nVGFibGVPZmZzZXQgT2Zmc2V0OworICB9IE5hbWU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFZhbHVlOworfTsKKworc3RydWN0IGNvZmZfYXV4X3NlY3Rpb25fZGVmaW5pdGlvbjsKKworY2xhc3MgQ09GRlN5bWJvbFJlZiB7CitwdWJsaWM6CisgIENPRkZTeW1ib2xSZWYoKSA9IGRlZmF1bHQ7CisgIENPRkZTeW1ib2xSZWYoY29uc3QgY29mZl9zeW1ib2wxNiAqQ1MpIDogQ1MxNihDUykge30KKyAgQ09GRlN5bWJvbFJlZihjb25zdCBjb2ZmX3N5bWJvbDMyICpDUykgOiBDUzMyKENTKSB7fQorCisgIGNvbnN0IHZvaWQgKmdldFJhd1B0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gQ1MxNiA/IHN0YXRpY19jYXN0PGNvbnN0IHZvaWQgKj4oQ1MxNikgOiBDUzMyOworICB9CisKKyAgY29uc3QgY29mZl9zeW1ib2xfZ2VuZXJpYyAqZ2V0R2VuZXJpYygpIGNvbnN0IHsKKyAgICBpZiAoQ1MxNikKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IGNvZmZfc3ltYm9sX2dlbmVyaWMgKj4oQ1MxNik7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY29mZl9zeW1ib2xfZ2VuZXJpYyAqPihDUzMyKTsKKyAgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yPChDT0ZGU3ltYm9sUmVmIEEsIENPRkZTeW1ib2xSZWYgQikgeworICAgIHJldHVybiBBLmdldFJhd1B0cigpIDwgQi5nZXRSYXdQdHIoKTsKKyAgfQorCisgIGJvb2wgaXNCaWdPYmooKSBjb25zdCB7CisgICAgaWYgKENTMTYpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKENTMzIpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJDT0ZGU3ltYm9sUmVmIHBvaW50cyB0byBub3RoaW5nISIpOworICB9CisKKyAgY29uc3QgY2hhciAqZ2V0U2hvcnROYW1lKCkgY29uc3QgeworICAgIHJldHVybiBDUzE2ID8gQ1MxNi0+TmFtZS5TaG9ydE5hbWUgOiBDUzMyLT5OYW1lLlNob3J0TmFtZTsKKyAgfQorCisgIGNvbnN0IFN0cmluZ1RhYmxlT2Zmc2V0ICZnZXRTdHJpbmdUYWJsZU9mZnNldCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNTZXQoKSAmJiAiQ09GRlN5bWJvbFJlZiBwb2ludHMgdG8gbm90aGluZyEiKTsKKyAgICByZXR1cm4gQ1MxNiA/IENTMTYtPk5hbWUuT2Zmc2V0IDogQ1MzMi0+TmFtZS5PZmZzZXQ7CisgIH0KKworICB1aW50MzJfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIENTMTYgPyBDUzE2LT5WYWx1ZSA6IENTMzItPlZhbHVlOyB9CisKKyAgaW50MzJfdCBnZXRTZWN0aW9uTnVtYmVyKCkgY29uc3QgeworICAgIGFzc2VydChpc1NldCgpICYmICJDT0ZGU3ltYm9sUmVmIHBvaW50cyB0byBub3RoaW5nISIpOworICAgIGlmIChDUzE2KSB7CisgICAgICAvLyBSZXNlcnZlZCBzZWN0aW9ucyBhcmUgcmV0dXJuZWQgYXMgbmVnYXRpdmUgbnVtYmVycy4KKyAgICAgIGlmIChDUzE2LT5TZWN0aW9uTnVtYmVyIDw9IENPRkY6Ok1heE51bWJlck9mU2VjdGlvbnMxNikKKyAgICAgICAgcmV0dXJuIENTMTYtPlNlY3Rpb25OdW1iZXI7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MTZfdD4oQ1MxNi0+U2VjdGlvbk51bWJlcik7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihDUzMyLT5TZWN0aW9uTnVtYmVyKTsKKyAgfQorCisgIHVpbnQxNl90IGdldFR5cGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzU2V0KCkgJiYgIkNPRkZTeW1ib2xSZWYgcG9pbnRzIHRvIG5vdGhpbmchIik7CisgICAgcmV0dXJuIENTMTYgPyBDUzE2LT5UeXBlIDogQ1MzMi0+VHlwZTsKKyAgfQorCisgIHVpbnQ4X3QgZ2V0U3RvcmFnZUNsYXNzKCkgY29uc3QgeworICAgIGFzc2VydChpc1NldCgpICYmICJDT0ZGU3ltYm9sUmVmIHBvaW50cyB0byBub3RoaW5nISIpOworICAgIHJldHVybiBDUzE2ID8gQ1MxNi0+U3RvcmFnZUNsYXNzIDogQ1MzMi0+U3RvcmFnZUNsYXNzOworICB9CisKKyAgdWludDhfdCBnZXROdW1iZXJPZkF1eFN5bWJvbHMoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzU2V0KCkgJiYgIkNPRkZTeW1ib2xSZWYgcG9pbnRzIHRvIG5vdGhpbmchIik7CisgICAgcmV0dXJuIENTMTYgPyBDUzE2LT5OdW1iZXJPZkF1eFN5bWJvbHMgOiBDUzMyLT5OdW1iZXJPZkF1eFN5bWJvbHM7CisgIH0KKworICB1aW50OF90IGdldEJhc2VUeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZSgpICYgMHgwRjsgfQorCisgIHVpbnQ4X3QgZ2V0Q29tcGxleFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRUeXBlKCkgJiAweEYwKSA+PiBDT0ZGOjpTQ1RfQ09NUExFWF9UWVBFX1NISUZUOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0IFQgKmdldEF1eCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ1MxNiA/IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCAqPihDUzE2ICsgMSkKKyAgICAgICAgICAgICAgICA6IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCAqPihDUzMyICsgMSk7CisgIH0KKworICBjb25zdCBjb2ZmX2F1eF9zZWN0aW9uX2RlZmluaXRpb24gKmdldFNlY3Rpb25EZWZpbml0aW9uKCkgY29uc3QgeworICAgIGlmICghZ2V0TnVtYmVyT2ZBdXhTeW1ib2xzKCkgfHwKKyAgICAgICAgZ2V0U3RvcmFnZUNsYXNzKCkgIT0gQ09GRjo6SU1BR0VfU1lNX0NMQVNTX1NUQVRJQykKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBnZXRBdXg8Y29mZl9hdXhfc2VjdGlvbl9kZWZpbml0aW9uPigpOworICB9CisKKyAgYm9vbCBpc0Fic29sdXRlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTZWN0aW9uTnVtYmVyKCkgPT0gLTE7CisgIH0KKworICBib29sIGlzRXh0ZXJuYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN0b3JhZ2VDbGFzcygpID09IENPRkY6OklNQUdFX1NZTV9DTEFTU19FWFRFUk5BTDsKKyAgfQorCisgIGJvb2wgaXNDb21tb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRXh0ZXJuYWwoKSAmJiBnZXRTZWN0aW9uTnVtYmVyKCkgPT0gQ09GRjo6SU1BR0VfU1lNX1VOREVGSU5FRCAmJgorICAgICAgICAgICBnZXRWYWx1ZSgpICE9IDA7CisgIH0KKworICBib29sIGlzVW5kZWZpbmVkKCkgY29uc3QgeworICAgIHJldHVybiBpc0V4dGVybmFsKCkgJiYgZ2V0U2VjdGlvbk51bWJlcigpID09IENPRkY6OklNQUdFX1NZTV9VTkRFRklORUQgJiYKKyAgICAgICAgICAgZ2V0VmFsdWUoKSA9PSAwOworICB9CisKKyAgYm9vbCBpc1dlYWtFeHRlcm5hbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3RvcmFnZUNsYXNzKCkgPT0gQ09GRjo6SU1BR0VfU1lNX0NMQVNTX1dFQUtfRVhURVJOQUw7CisgIH0KKworICBib29sIGlzRnVuY3Rpb25EZWZpbml0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBpc0V4dGVybmFsKCkgJiYgZ2V0QmFzZVR5cGUoKSA9PSBDT0ZGOjpJTUFHRV9TWU1fVFlQRV9OVUxMICYmCisgICAgICAgICAgIGdldENvbXBsZXhUeXBlKCkgPT0gQ09GRjo6SU1BR0VfU1lNX0RUWVBFX0ZVTkNUSU9OICYmCisgICAgICAgICAgICFDT0ZGOjppc1Jlc2VydmVkU2VjdGlvbk51bWJlcihnZXRTZWN0aW9uTnVtYmVyKCkpOworICB9CisKKyAgYm9vbCBpc0Z1bmN0aW9uTGluZUluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN0b3JhZ2VDbGFzcygpID09IENPRkY6OklNQUdFX1NZTV9DTEFTU19GVU5DVElPTjsKKyAgfQorCisgIGJvb2wgaXNBbnlVbmRlZmluZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzVW5kZWZpbmVkKCkgfHwgaXNXZWFrRXh0ZXJuYWwoKTsKKyAgfQorCisgIGJvb2wgaXNGaWxlUmVjb3JkKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdG9yYWdlQ2xhc3MoKSA9PSBDT0ZGOjpJTUFHRV9TWU1fQ0xBU1NfRklMRTsKKyAgfQorCisgIGJvb2wgaXNTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdG9yYWdlQ2xhc3MoKSA9PSBDT0ZGOjpJTUFHRV9TWU1fQ0xBU1NfU0VDVElPTjsKKyAgfQorCisgIGJvb2wgaXNTZWN0aW9uRGVmaW5pdGlvbigpIGNvbnN0IHsKKyAgICAvLyBDKysvQ0xJIGNyZWF0ZXMgZXh0ZXJuYWwgQUJTIHN5bWJvbHMgZm9yIG5vbi1jb25zdCBhcHBkb21haW4gZ2xvYmFscy4KKyAgICAvLyBUaGVzZSBhcmUgYWxzbyBmb2xsb3dlZCBieSBhbiBhdXhpbGlhcnkgc2VjdGlvbiBkZWZpbml0aW9uLgorICAgIGJvb2wgaXNBcHBkb21haW5HbG9iYWwgPQorICAgICAgICBnZXRTdG9yYWdlQ2xhc3MoKSA9PSBDT0ZGOjpJTUFHRV9TWU1fQ0xBU1NfRVhURVJOQUwgJiYKKyAgICAgICAgZ2V0U2VjdGlvbk51bWJlcigpID09IENPRkY6OklNQUdFX1NZTV9BQlNPTFVURTsKKyAgICBib29sIGlzT3JkaW5hcnlTZWN0aW9uID0gZ2V0U3RvcmFnZUNsYXNzKCkgPT0gQ09GRjo6SU1BR0VfU1lNX0NMQVNTX1NUQVRJQzsKKyAgICBpZiAoIWdldE51bWJlck9mQXV4U3ltYm9scygpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpc0FwcGRvbWFpbkdsb2JhbCB8fCBpc09yZGluYXJ5U2VjdGlvbjsKKyAgfQorCisgIGJvb2wgaXNDTFJUb2tlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3RvcmFnZUNsYXNzKCkgPT0gQ09GRjo6SU1BR0VfU1lNX0NMQVNTX0NMUl9UT0tFTjsKKyAgfQorCitwcml2YXRlOgorICBib29sIGlzU2V0KCkgY29uc3QgeyByZXR1cm4gQ1MxNiB8fCBDUzMyOyB9CisKKyAgY29uc3QgY29mZl9zeW1ib2wxNiAqQ1MxNiA9IG51bGxwdHI7CisgIGNvbnN0IGNvZmZfc3ltYm9sMzIgKkNTMzIgPSBudWxscHRyOworfTsKKworc3RydWN0IGNvZmZfc2VjdGlvbiB7CisgIGNoYXIgTmFtZVtDT0ZGOjpOYW1lU2l6ZV07CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFZpcnR1YWxTaXplOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBWaXJ0dWFsQWRkcmVzczsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZU9mUmF3RGF0YTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUG9pbnRlclRvUmF3RGF0YTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUG9pbnRlclRvUmVsb2NhdGlvbnM7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFBvaW50ZXJUb0xpbmVudW1iZXJzOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBOdW1iZXJPZlJlbG9jYXRpb25zOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBOdW1iZXJPZkxpbmVudW1iZXJzOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDaGFyYWN0ZXJpc3RpY3M7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHJlbG9jYXRpb25zIGlzIHN0b3JlZCBpbgorICAvLyBWaXJ0dWFsQWRkcmVzcyBmaWVsZCBvZiB0aGUgZmlyc3QgcmVsb2NhdGlvbiB0YWJsZSBlbnRyeS4KKyAgYm9vbCBoYXNFeHRlbmRlZFJlbG9jYXRpb25zKCkgY29uc3QgeworICAgIHJldHVybiAoQ2hhcmFjdGVyaXN0aWNzICYgQ09GRjo6SU1BR0VfU0NOX0xOS19OUkVMT0NfT1ZGTCkgJiYKKyAgICAgICAgICAgTnVtYmVyT2ZSZWxvY2F0aW9ucyA9PSBVSU5UMTZfTUFYOworICB9CisKKyAgdWludDMyX3QgZ2V0QWxpZ25tZW50KCkgY29uc3QgeworICAgIC8vIFRoZSBJTUFHRV9TQ05fVFlQRV9OT19QQUQgYml0IGlzIGEgbGVnYWN5IHdheSBvZiBnZXR0aW5nIHRvCisgICAgLy8gSU1BR0VfU0NOX0FMSUdOXzFCWVRFUy4KKyAgICBpZiAoQ2hhcmFjdGVyaXN0aWNzICYgQ09GRjo6SU1BR0VfU0NOX1RZUEVfTk9fUEFEKQorICAgICAgcmV0dXJuIDE7CisKKyAgICAvLyBCaXQgWzIwOjI0XSBjb250YWlucyBzZWN0aW9uIGFsaWdubWVudC4gQm90aCAwIGFuZCAxIG1lYW4gYWxpZ25tZW50IDEuCisgICAgdWludDMyX3QgU2hpZnQgPSAoQ2hhcmFjdGVyaXN0aWNzID4+IDIwKSAmIDB4RjsKKyAgICBpZiAoU2hpZnQgPiAwKQorICAgICAgcmV0dXJuIDFVIDw8IChTaGlmdCAtIDEpOworICAgIHJldHVybiAxOworICB9Cit9OworCitzdHJ1Y3QgY29mZl9yZWxvY2F0aW9uIHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVmlydHVhbEFkZHJlc3M7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFN5bWJvbFRhYmxlSW5kZXg7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFR5cGU7Cit9OworCitzdHJ1Y3QgY29mZl9hdXhfZnVuY3Rpb25fZGVmaW5pdGlvbiB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFRhZ0luZGV4OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBUb3RhbFNpemU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFBvaW50ZXJUb0xpbmVudW1iZXI7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFBvaW50ZXJUb05leHRGdW5jdGlvbjsKKyAgY2hhciBVbnVzZWQxWzJdOworfTsKKworc3RhdGljX2Fzc2VydChzaXplb2YoY29mZl9hdXhfZnVuY3Rpb25fZGVmaW5pdGlvbikgPT0gMTgsCisgICAgICAgICAgICAgICJhdXhpbGlhcnkgZW50cnkgbXVzdCBiZSAxOCBieXRlcyIpOworCitzdHJ1Y3QgY29mZl9hdXhfYmZfYW5kX2VmX3N5bWJvbCB7CisgIGNoYXIgVW51c2VkMVs0XTsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTGluZW51bWJlcjsKKyAgY2hhciBVbnVzZWQyWzZdOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBQb2ludGVyVG9OZXh0RnVuY3Rpb247CisgIGNoYXIgVW51c2VkM1syXTsKK307CisKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKGNvZmZfYXV4X2JmX2FuZF9lZl9zeW1ib2wpID09IDE4LAorICAgICAgICAgICAgICAiYXV4aWxpYXJ5IGVudHJ5IG11c3QgYmUgMTggYnl0ZXMiKTsKKworc3RydWN0IGNvZmZfYXV4X3dlYWtfZXh0ZXJuYWwgeworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBUYWdJbmRleDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQ2hhcmFjdGVyaXN0aWNzOworICBjaGFyIFVudXNlZDFbMTBdOworfTsKKworc3RhdGljX2Fzc2VydChzaXplb2YoY29mZl9hdXhfd2Vha19leHRlcm5hbCkgPT0gMTgsCisgICAgICAgICAgICAgICJhdXhpbGlhcnkgZW50cnkgbXVzdCBiZSAxOCBieXRlcyIpOworCitzdHJ1Y3QgY29mZl9hdXhfc2VjdGlvbl9kZWZpbml0aW9uIHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTGVuZ3RoOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBOdW1iZXJPZlJlbG9jYXRpb25zOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBOdW1iZXJPZkxpbmVudW1iZXJzOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDaGVja1N1bTsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTnVtYmVyTG93UGFydDsKKyAgdWludDhfdCAgICAgICAgICAgICAgU2VsZWN0aW9uOworICB1aW50OF90ICAgICAgICAgICAgICBVbnVzZWQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE51bWJlckhpZ2hQYXJ0OworICBpbnQzMl90IGdldE51bWJlcihib29sIElzQmlnT2JqKSBjb25zdCB7CisgICAgdWludDMyX3QgTnVtYmVyID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE51bWJlckxvd1BhcnQpOworICAgIGlmIChJc0JpZ09iaikKKyAgICAgIE51bWJlciB8PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTnVtYmVySGlnaFBhcnQpIDw8IDE2OworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihOdW1iZXIpOworICB9Cit9OworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihjb2ZmX2F1eF9zZWN0aW9uX2RlZmluaXRpb24pID09IDE4LAorICAgICAgICAgICAgICAiYXV4aWxpYXJ5IGVudHJ5IG11c3QgYmUgMTggYnl0ZXMiKTsKKworc3RydWN0IGNvZmZfYXV4X2Nscl90b2tlbiB7CisgIHVpbnQ4X3QgICAgICAgICAgICAgIEF1eFR5cGU7CisgIHVpbnQ4X3QgICAgICAgICAgICAgIFJlc2VydmVkOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTeW1ib2xUYWJsZUluZGV4OworICBjaGFyICAgICAgICAgICAgICAgICBNQlpbMTJdOworfTsKKworc3RhdGljX2Fzc2VydChzaXplb2YoY29mZl9hdXhfY2xyX3Rva2VuKSA9PSAxOCwKKyAgICAgICAgICAgICAgImF1eGlsaWFyeSBlbnRyeSBtdXN0IGJlIDE4IGJ5dGVzIik7CisKK3N0cnVjdCBjb2ZmX2ltcG9ydF9oZWFkZXIgeworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBTaWcxOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBTaWcyOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNYWNoaW5lOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBUaW1lRGF0ZVN0YW1wOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaXplT2ZEYXRhOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBPcmRpbmFsSGludDsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgVHlwZUluZm87CisKKyAgaW50IGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBUeXBlSW5mbyAmIDB4MzsgfQorICBpbnQgZ2V0TmFtZVR5cGUoKSBjb25zdCB7IHJldHVybiAoVHlwZUluZm8gPj4gMikgJiAweDc7IH0KK307CisKK3N0cnVjdCBjb2ZmX2ltcG9ydF9kaXJlY3RvcnlfdGFibGVfZW50cnkgeworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBJbXBvcnRMb29rdXBUYWJsZVJWQTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVGltZURhdGVTdGFtcDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRm9yd2FyZGVyQ2hhaW47CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE5hbWVSVkE7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEltcG9ydEFkZHJlc3NUYWJsZVJWQTsKKworICBib29sIGlzTnVsbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW1wb3J0TG9va3VwVGFibGVSVkEgPT0gMCAmJiBUaW1lRGF0ZVN0YW1wID09IDAgJiYKKyAgICAgICAgICAgRm9yd2FyZGVyQ2hhaW4gPT0gMCAmJiBOYW1lUlZBID09IDAgJiYgSW1wb3J0QWRkcmVzc1RhYmxlUlZBID09IDA7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbnRUeT4KK3N0cnVjdCBjb2ZmX3Rsc19kaXJlY3RvcnkgeworICBJbnRUeSBTdGFydEFkZHJlc3NPZlJhd0RhdGE7CisgIEludFR5IEVuZEFkZHJlc3NPZlJhd0RhdGE7CisgIEludFR5IEFkZHJlc3NPZkluZGV4OworICBJbnRUeSBBZGRyZXNzT2ZDYWxsQmFja3M7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpemVPZlplcm9GaWxsOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDaGFyYWN0ZXJpc3RpY3M7CisKKyAgdWludDMyX3QgZ2V0QWxpZ25tZW50KCkgY29uc3QgeworICAgIC8vIEJpdCBbMjA6MjRdIGNvbnRhaW5zIHNlY3Rpb24gYWxpZ25tZW50LgorICAgIHVpbnQzMl90IFNoaWZ0ID0gKENoYXJhY3RlcmlzdGljcyAmIDB4MDBGMDAwMDApID4+IDIwOworICAgIGlmIChTaGlmdCA+IDApCisgICAgICByZXR1cm4gMVUgPDwgKFNoaWZ0IC0gMSk7CisgICAgcmV0dXJuIDA7CisgIH0KK307CisKK3VzaW5nIGNvZmZfdGxzX2RpcmVjdG9yeTMyID0gY29mZl90bHNfZGlyZWN0b3J5PHN1cHBvcnQ6OmxpdHRsZTMyX3Q+OwordXNpbmcgY29mZl90bHNfZGlyZWN0b3J5NjQgPSBjb2ZmX3Rsc19kaXJlY3Rvcnk8c3VwcG9ydDo6bGl0dGxlNjRfdD47CisKKy8vLyBCaXRzIGluIGNvbnRyb2wgZmxvdyBndWFyZCBmbGFncyBhcyB3ZSB1bmRlcnN0YW5kIHRoZW0uCitlbnVtIGNsYXNzIGNvZmZfZ3VhcmRfZmxhZ3MgOiB1aW50MzJfdCB7CisgIENGSW5zdHJ1bWVudGVkID0gMHgwMDAwMDEwMCwKKyAgSGFzRmlkVGFibGUgPSAweDAwMDAwNDAwLAorICBQcm90ZWN0RGVsYXlMb2FkSUFUID0gMHgwMDAwMTAwMCwKKyAgRGVsYXlMb2FkSUFUU2VjdGlvbiA9IDB4MDAwMDIwMDAsIC8vIERlbGF5IGxvYWQgaW4gc2VwYXJhdGUgc2VjdGlvbgorICBIYXNMb25nSm1wVGFibGUgPSAweDAwMDEwMDAwLAorICBGaWRUYWJsZUhhc0ZsYWdzID0gMHgxMDAwMDAwMCwgLy8gSW5kaWNhdGVzIHRoYXQgZmlkIHRhYmxlcyBhcmUgNSBieXRlcworfTsKKworc3RydWN0IGNvZmZfbG9hZF9jb25maWdfY29kZV9pbnRlZ3JpdHkgeworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBGbGFnczsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgQ2F0YWxvZzsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQ2F0YWxvZ09mZnNldDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUmVzZXJ2ZWQ7Cit9OworCisvLy8gMzItYml0IGxvYWQgY29uZmlnIChJTUFHRV9MT0FEX0NPTkZJR19ESVJFQ1RPUlkzMikKK3N0cnVjdCBjb2ZmX2xvYWRfY29uZmlndXJhdGlvbjMyIHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVGltZURhdGVTdGFtcDsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWFqb3JWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNaW5vclZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEdsb2JhbEZsYWdzQ2xlYXI7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEdsb2JhbEZsYWdzU2V0OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDcml0aWNhbFNlY3Rpb25EZWZhdWx0VGltZW91dDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRGVDb21taXRGcmVlQmxvY2tUaHJlc2hvbGQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IERlQ29tbWl0VG90YWxGcmVlVGhyZXNob2xkOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBMb2NrUHJlZml4VGFibGU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE1heGltdW1BbGxvY2F0aW9uU2l6ZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVmlydHVhbE1lbW9yeVRocmVzaG9sZDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUHJvY2Vzc0FmZmluaXR5TWFzazsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUHJvY2Vzc0hlYXBGbGFnczsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgQ1NEVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgRGVwZW5kZW50TG9hZEZsYWdzOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBFZGl0TGlzdDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2VjdXJpdHlDb29raWU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNFSGFuZGxlclRhYmxlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTRUhhbmRsZXJDb3VudDsKKworICAvLyBBZGRlZCBpbiBNU1ZDIDIwMTUgZm9yIC9ndWFyZDpjZi4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgR3VhcmRDRkNoZWNrRnVuY3Rpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEd1YXJkQ0ZDaGVja0Rpc3BhdGNoOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBHdWFyZENGRnVuY3Rpb25UYWJsZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgR3VhcmRDRkZ1bmN0aW9uQ291bnQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEd1YXJkRmxhZ3M7IC8vIGNvZmZfZ3VhcmRfZmxhZ3MKKworICAvLyBBZGRlZCBpbiBNU1ZDIDIwMTcKKyAgY29mZl9sb2FkX2NvbmZpZ19jb2RlX2ludGVncml0eSBDb2RlSW50ZWdyaXR5OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBHdWFyZEFkZHJlc3NUYWtlbklhdEVudHJ5VGFibGU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEd1YXJkQWRkcmVzc1Rha2VuSWF0RW50cnlDb3VudDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgR3VhcmRMb25nSnVtcFRhcmdldFRhYmxlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBHdWFyZExvbmdKdW1wVGFyZ2V0Q291bnQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IER5bmFtaWNWYWx1ZVJlbG9jVGFibGU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IENIUEVNZXRhZGF0YVBvaW50ZXI7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEd1YXJkUkZGYWlsdXJlUm91dGluZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgR3VhcmRSRkZhaWx1cmVSb3V0aW5lRnVuY3Rpb25Qb2ludGVyOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBEeW5hbWljVmFsdWVSZWxvY1RhYmxlT2Zmc2V0OworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBEeW5hbWljVmFsdWVSZWxvY1RhYmxlU2VjdGlvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgUmVzZXJ2ZWQyOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBHdWFyZFJGVmVyaWZ5U3RhY2tQb2ludGVyRnVuY3Rpb25Qb2ludGVyOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBIb3RQYXRjaFRhYmxlT2Zmc2V0OworfTsKKworLy8vIDY0LWJpdCBsb2FkIGNvbmZpZyAoSU1BR0VfTE9BRF9DT05GSUdfRElSRUNUT1JZNjQpCitzdHJ1Y3QgY29mZl9sb2FkX2NvbmZpZ3VyYXRpb242NCB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpemU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFRpbWVEYXRlU3RhbXA7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1ham9yVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWlub3JWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBHbG9iYWxGbGFnc0NsZWFyOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBHbG9iYWxGbGFnc1NldDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQ3JpdGljYWxTZWN0aW9uRGVmYXVsdFRpbWVvdXQ7CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IERlQ29tbWl0RnJlZUJsb2NrVGhyZXNob2xkOworICBzdXBwb3J0Ojp1bGl0dGxlNjRfdCBEZUNvbW1pdFRvdGFsRnJlZVRocmVzaG9sZDsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgTG9ja1ByZWZpeFRhYmxlOworICBzdXBwb3J0Ojp1bGl0dGxlNjRfdCBNYXhpbXVtQWxsb2NhdGlvblNpemU7CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IFZpcnR1YWxNZW1vcnlUaHJlc2hvbGQ7CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IFByb2Nlc3NBZmZpbml0eU1hc2s7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFByb2Nlc3NIZWFwRmxhZ3M7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IENTRFZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IERlcGVuZGVudExvYWRGbGFnczsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgRWRpdExpc3Q7CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IFNlY3VyaXR5Q29va2llOworICBzdXBwb3J0Ojp1bGl0dGxlNjRfdCBTRUhhbmRsZXJUYWJsZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgU0VIYW5kbGVyQ291bnQ7CisKKyAgLy8gQWRkZWQgaW4gTVNWQyAyMDE1IGZvciAvZ3VhcmQ6Y2YuCisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IEd1YXJkQ0ZDaGVja0Z1bmN0aW9uOworICBzdXBwb3J0Ojp1bGl0dGxlNjRfdCBHdWFyZENGQ2hlY2tEaXNwYXRjaDsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgR3VhcmRDRkZ1bmN0aW9uVGFibGU7CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IEd1YXJkQ0ZGdW5jdGlvbkNvdW50OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBHdWFyZEZsYWdzOworCisgIC8vIEFkZGVkIGluIE1TVkMgMjAxNworICBjb2ZmX2xvYWRfY29uZmlnX2NvZGVfaW50ZWdyaXR5IENvZGVJbnRlZ3JpdHk7CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IEd1YXJkQWRkcmVzc1Rha2VuSWF0RW50cnlUYWJsZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgR3VhcmRBZGRyZXNzVGFrZW5JYXRFbnRyeUNvdW50OworICBzdXBwb3J0Ojp1bGl0dGxlNjRfdCBHdWFyZExvbmdKdW1wVGFyZ2V0VGFibGU7CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IEd1YXJkTG9uZ0p1bXBUYXJnZXRDb3VudDsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgRHluYW1pY1ZhbHVlUmVsb2NUYWJsZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgQ0hQRU1ldGFkYXRhUG9pbnRlcjsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgR3VhcmRSRkZhaWx1cmVSb3V0aW5lOworICBzdXBwb3J0Ojp1bGl0dGxlNjRfdCBHdWFyZFJGRmFpbHVyZVJvdXRpbmVGdW5jdGlvblBvaW50ZXI7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IER5bmFtaWNWYWx1ZVJlbG9jVGFibGVPZmZzZXQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IER5bmFtaWNWYWx1ZVJlbG9jVGFibGVTZWN0aW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBSZXNlcnZlZDI7CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IEd1YXJkUkZWZXJpZnlTdGFja1BvaW50ZXJGdW5jdGlvblBvaW50ZXI7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEhvdFBhdGNoVGFibGVPZmZzZXQ7Cit9OworCitzdHJ1Y3QgY29mZl9ydW50aW1lX2Z1bmN0aW9uX3g2NCB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEJlZ2luQWRkcmVzczsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRW5kQWRkcmVzczsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVW53aW5kSW5mb3JtYXRpb247Cit9OworCitzdHJ1Y3QgY29mZl9iYXNlX3JlbG9jX2Jsb2NrX2hlYWRlciB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFBhZ2VSVkE7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEJsb2NrU2l6ZTsKK307CisKK3N0cnVjdCBjb2ZmX2Jhc2VfcmVsb2NfYmxvY2tfZW50cnkgeworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBEYXRhOworCisgIGludCBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gRGF0YSA+PiAxMjsgfQorICBpbnQgZ2V0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gRGF0YSAmICgoMSA8PCAxMikgLSAxKTsgfQorfTsKKworc3RydWN0IGNvZmZfcmVzb3VyY2VfZGlyX2VudHJ5IHsKKyAgdW5pb24geworICAgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE5hbWVPZmZzZXQ7CisgICAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgSUQ7CisgICAgdWludDMyX3QgZ2V0TmFtZU9mZnNldCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBtYXNrVHJhaWxpbmdPbmVzPHVpbnQzMl90PigzMSkgJiBOYW1lT2Zmc2V0OworICAgIH0KKyAgICAvLyBFdmVuIHRob3VnaCB0aGUgUEUvQ09GRiBzcGVjIGRvZXNuJ3QgbWVudGlvbiB0aGlzLCB0aGUgaGlnaCBiaXQgb2YgYSBuYW1lCisgICAgLy8gb2Zmc2V0IGlzIHNldC4KKyAgICB2b2lkIHNldE5hbWVPZmZzZXQodWludDMyX3QgT2Zmc2V0KSB7IE5hbWVPZmZzZXQgPSBPZmZzZXQgfCAoMSA8PCAzMSk7IH0KKyAgfSBJZGVudGlmaWVyOworICB1bmlvbiB7CisgICAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRGF0YUVudHJ5T2Zmc2V0OworICAgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFN1YmRpck9mZnNldDsKKworICAgIGJvb2wgaXNTdWJEaXIoKSBjb25zdCB7IHJldHVybiBTdWJkaXJPZmZzZXQgPj4gMzE7IH0KKyAgICB1aW50MzJfdCB2YWx1ZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBtYXNrVHJhaWxpbmdPbmVzPHVpbnQzMl90PigzMSkgJiBTdWJkaXJPZmZzZXQ7CisgICAgfQorCisgIH0gT2Zmc2V0OworfTsKKworc3RydWN0IGNvZmZfcmVzb3VyY2VfZGF0YV9lbnRyeSB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IERhdGFSVkE7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IERhdGFTaXplOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDb2RlcGFnZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgY29mZl9yZXNvdXJjZV9kaXJfdGFibGUgeworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDaGFyYWN0ZXJpc3RpY3M7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFRpbWVEYXRlU3RhbXA7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1ham9yVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWlub3JWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBOdW1iZXJPZk5hbWVFbnRyaWVzOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBOdW1iZXJPZklERW50cmllczsKK307CisKK3N0cnVjdCBkZWJ1Z19oX2hlYWRlciB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE1hZ2ljOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBIYXNoQWxnb3JpdGhtOworfTsKKworY2xhc3MgQ09GRk9iamVjdEZpbGUgOiBwdWJsaWMgT2JqZWN0RmlsZSB7Citwcml2YXRlOgorICBmcmllbmQgY2xhc3MgSW1wb3J0RGlyZWN0b3J5RW50cnlSZWY7CisgIGZyaWVuZCBjbGFzcyBFeHBvcnREaXJlY3RvcnlFbnRyeVJlZjsKKyAgY29uc3QgY29mZl9maWxlX2hlYWRlciAqQ09GRkhlYWRlcjsKKyAgY29uc3QgY29mZl9iaWdvYmpfZmlsZV9oZWFkZXIgKkNPRkZCaWdPYmpIZWFkZXI7CisgIGNvbnN0IHBlMzJfaGVhZGVyICpQRTMySGVhZGVyOworICBjb25zdCBwZTMycGx1c19oZWFkZXIgKlBFMzJQbHVzSGVhZGVyOworICBjb25zdCBkYXRhX2RpcmVjdG9yeSAqRGF0YURpcmVjdG9yeTsKKyAgY29uc3QgY29mZl9zZWN0aW9uICpTZWN0aW9uVGFibGU7CisgIGNvbnN0IGNvZmZfc3ltYm9sMTYgKlN5bWJvbFRhYmxlMTY7CisgIGNvbnN0IGNvZmZfc3ltYm9sMzIgKlN5bWJvbFRhYmxlMzI7CisgIGNvbnN0IGNoYXIgKlN0cmluZ1RhYmxlOworICB1aW50MzJfdCBTdHJpbmdUYWJsZVNpemU7CisgIGNvbnN0IGNvZmZfaW1wb3J0X2RpcmVjdG9yeV90YWJsZV9lbnRyeSAqSW1wb3J0RGlyZWN0b3J5OworICBjb25zdCBkZWxheV9pbXBvcnRfZGlyZWN0b3J5X3RhYmxlX2VudHJ5ICpEZWxheUltcG9ydERpcmVjdG9yeTsKKyAgdWludDMyX3QgTnVtYmVyT2ZEZWxheUltcG9ydERpcmVjdG9yeTsKKyAgY29uc3QgZXhwb3J0X2RpcmVjdG9yeV90YWJsZV9lbnRyeSAqRXhwb3J0RGlyZWN0b3J5OworICBjb25zdCBjb2ZmX2Jhc2VfcmVsb2NfYmxvY2tfaGVhZGVyICpCYXNlUmVsb2NIZWFkZXI7CisgIGNvbnN0IGNvZmZfYmFzZV9yZWxvY19ibG9ja19oZWFkZXIgKkJhc2VSZWxvY0VuZDsKKyAgY29uc3QgZGVidWdfZGlyZWN0b3J5ICpEZWJ1Z0RpcmVjdG9yeUJlZ2luOworICBjb25zdCBkZWJ1Z19kaXJlY3RvcnkgKkRlYnVnRGlyZWN0b3J5RW5kOworICAvLyBFaXRoZXIgY29mZl9sb2FkX2NvbmZpZ3VyYXRpb24zMiBvciBjb2ZmX2xvYWRfY29uZmlndXJhdGlvbjY0LgorICBjb25zdCB2b2lkICpMb2FkQ29uZmlnID0gbnVsbHB0cjsKKworICBzdGQ6OmVycm9yX2NvZGUgZ2V0U3RyaW5nKHVpbnQzMl90IG9mZnNldCwgU3RyaW5nUmVmICZSZXMpIGNvbnN0OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBjb2ZmX3N5bWJvbF90eXBlPgorICBjb25zdCBjb2ZmX3N5bWJvbF90eXBlICp0b1N5bWIoRGF0YVJlZkltcGwgU3ltYikgY29uc3Q7CisgIGNvbnN0IGNvZmZfc2VjdGlvbiAqdG9TZWMoRGF0YVJlZkltcGwgU2VjKSBjb25zdDsKKyAgY29uc3QgY29mZl9yZWxvY2F0aW9uICp0b1JlbChEYXRhUmVmSW1wbCBSZWwpIGNvbnN0OworCisgIHN0ZDo6ZXJyb3JfY29kZSBpbml0U3ltYm9sVGFibGVQdHIoKTsKKyAgc3RkOjplcnJvcl9jb2RlIGluaXRJbXBvcnRUYWJsZVB0cigpOworICBzdGQ6OmVycm9yX2NvZGUgaW5pdERlbGF5SW1wb3J0VGFibGVQdHIoKTsKKyAgc3RkOjplcnJvcl9jb2RlIGluaXRFeHBvcnRUYWJsZVB0cigpOworICBzdGQ6OmVycm9yX2NvZGUgaW5pdEJhc2VSZWxvY1B0cigpOworICBzdGQ6OmVycm9yX2NvZGUgaW5pdERlYnVnRGlyZWN0b3J5UHRyKCk7CisgIHN0ZDo6ZXJyb3JfY29kZSBpbml0TG9hZENvbmZpZ1B0cigpOworCitwdWJsaWM6CisgIHVpbnRwdHJfdCBnZXRTeW1ib2xUYWJsZSgpIGNvbnN0IHsKKyAgICBpZiAoU3ltYm9sVGFibGUxNikKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oU3ltYm9sVGFibGUxNik7CisgICAgaWYgKFN5bWJvbFRhYmxlMzIpCisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFN5bWJvbFRhYmxlMzIpOworICAgIHJldHVybiB1aW50cHRyX3QoMCk7CisgIH0KKworICB1aW50MTZfdCBnZXRNYWNoaW5lKCkgY29uc3QgeworICAgIGlmIChDT0ZGSGVhZGVyKQorICAgICAgcmV0dXJuIENPRkZIZWFkZXItPk1hY2hpbmU7CisgICAgaWYgKENPRkZCaWdPYmpIZWFkZXIpCisgICAgICByZXR1cm4gQ09GRkJpZ09iakhlYWRlci0+TWFjaGluZTsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJubyBDT0ZGIGhlYWRlciEiKTsKKyAgfQorCisgIHVpbnQxNl90IGdldFNpemVPZk9wdGlvbmFsSGVhZGVyKCkgY29uc3QgeworICAgIGlmIChDT0ZGSGVhZGVyKQorICAgICAgcmV0dXJuIENPRkZIZWFkZXItPmlzSW1wb3J0TGlicmFyeSgpID8gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09GRkhlYWRlci0+U2l6ZU9mT3B0aW9uYWxIZWFkZXI7CisgICAgLy8gYmlnb2JqIGRvZXNuJ3QgaGF2ZSB0aGlzIGZpZWxkLgorICAgIGlmIChDT0ZGQmlnT2JqSGVhZGVyKQorICAgICAgcmV0dXJuIDA7CisgICAgbGx2bV91bnJlYWNoYWJsZSgibm8gQ09GRiBoZWFkZXIhIik7CisgIH0KKworICB1aW50MTZfdCBnZXRDaGFyYWN0ZXJpc3RpY3MoKSBjb25zdCB7CisgICAgaWYgKENPRkZIZWFkZXIpCisgICAgICByZXR1cm4gQ09GRkhlYWRlci0+aXNJbXBvcnRMaWJyYXJ5KCkgPyAwIDogQ09GRkhlYWRlci0+Q2hhcmFjdGVyaXN0aWNzOworICAgIC8vIGJpZ29iaiBkb2Vzbid0IGhhdmUgY2hhcmFjdGVyaXN0aWNzIHRvIHNwZWFrIG9mLAorICAgIC8vIGVkaXRiaW4gd2lsbCBzaWxlbnRseSBsaWUgdG8geW91IGlmIHlvdSBhdHRlbXB0IHRvIHNldCBhbnkuCisgICAgaWYgKENPRkZCaWdPYmpIZWFkZXIpCisgICAgICByZXR1cm4gMDsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJubyBDT0ZGIGhlYWRlciEiKTsKKyAgfQorCisgIHVpbnQzMl90IGdldFRpbWVEYXRlU3RhbXAoKSBjb25zdCB7CisgICAgaWYgKENPRkZIZWFkZXIpCisgICAgICByZXR1cm4gQ09GRkhlYWRlci0+VGltZURhdGVTdGFtcDsKKyAgICBpZiAoQ09GRkJpZ09iakhlYWRlcikKKyAgICAgIHJldHVybiBDT0ZGQmlnT2JqSGVhZGVyLT5UaW1lRGF0ZVN0YW1wOworICAgIGxsdm1fdW5yZWFjaGFibGUoIm5vIENPRkYgaGVhZGVyISIpOworICB9CisKKyAgdWludDMyX3QgZ2V0TnVtYmVyT2ZTZWN0aW9ucygpIGNvbnN0IHsKKyAgICBpZiAoQ09GRkhlYWRlcikKKyAgICAgIHJldHVybiBDT0ZGSGVhZGVyLT5pc0ltcG9ydExpYnJhcnkoKSA/IDAgOiBDT0ZGSGVhZGVyLT5OdW1iZXJPZlNlY3Rpb25zOworICAgIGlmIChDT0ZGQmlnT2JqSGVhZGVyKQorICAgICAgcmV0dXJuIENPRkZCaWdPYmpIZWFkZXItPk51bWJlck9mU2VjdGlvbnM7CisgICAgbGx2bV91bnJlYWNoYWJsZSgibm8gQ09GRiBoZWFkZXIhIik7CisgIH0KKworICB1aW50MzJfdCBnZXRQb2ludGVyVG9TeW1ib2xUYWJsZSgpIGNvbnN0IHsKKyAgICBpZiAoQ09GRkhlYWRlcikKKyAgICAgIHJldHVybiBDT0ZGSGVhZGVyLT5pc0ltcG9ydExpYnJhcnkoKSA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENPRkZIZWFkZXItPlBvaW50ZXJUb1N5bWJvbFRhYmxlOworICAgIGlmIChDT0ZGQmlnT2JqSGVhZGVyKQorICAgICAgcmV0dXJuIENPRkZCaWdPYmpIZWFkZXItPlBvaW50ZXJUb1N5bWJvbFRhYmxlOworICAgIGxsdm1fdW5yZWFjaGFibGUoIm5vIENPRkYgaGVhZGVyISIpOworICB9CisKKyAgdWludDMyX3QgZ2V0UmF3TnVtYmVyT2ZTeW1ib2xzKCkgY29uc3QgeworICAgIGlmIChDT0ZGSGVhZGVyKQorICAgICAgcmV0dXJuIENPRkZIZWFkZXItPmlzSW1wb3J0TGlicmFyeSgpID8gMCA6IENPRkZIZWFkZXItPk51bWJlck9mU3ltYm9sczsKKyAgICBpZiAoQ09GRkJpZ09iakhlYWRlcikKKyAgICAgIHJldHVybiBDT0ZGQmlnT2JqSGVhZGVyLT5OdW1iZXJPZlN5bWJvbHM7CisgICAgbGx2bV91bnJlYWNoYWJsZSgibm8gQ09GRiBoZWFkZXIhIik7CisgIH0KKworICB1aW50MzJfdCBnZXROdW1iZXJPZlN5bWJvbHMoKSBjb25zdCB7CisgICAgaWYgKCFTeW1ib2xUYWJsZTE2ICYmICFTeW1ib2xUYWJsZTMyKQorICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGdldFJhd051bWJlck9mU3ltYm9scygpOworICB9CisKKyAgY29uc3QgY29mZl9sb2FkX2NvbmZpZ3VyYXRpb24zMiAqZ2V0TG9hZENvbmZpZzMyKCkgY29uc3QgeworICAgIGFzc2VydCghaXM2NCgpKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjb2ZmX2xvYWRfY29uZmlndXJhdGlvbjMyICo+KExvYWRDb25maWcpOworICB9CisKKyAgY29uc3QgY29mZl9sb2FkX2NvbmZpZ3VyYXRpb242NCAqZ2V0TG9hZENvbmZpZzY0KCkgY29uc3QgeworICAgIGFzc2VydChpczY0KCkpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IGNvZmZfbG9hZF9jb25maWd1cmF0aW9uNjQgKj4oTG9hZENvbmZpZyk7CisgIH0KKworcHJvdGVjdGVkOgorICB2b2lkIG1vdmVTeW1ib2xOZXh0KERhdGFSZWZJbXBsICZTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgRXhwZWN0ZWQ8U3RyaW5nUmVmPiBnZXRTeW1ib2xOYW1lKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICBFeHBlY3RlZDx1aW50NjRfdD4gZ2V0U3ltYm9sQWRkcmVzcyhEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0U3ltYm9sQWxpZ25tZW50KERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTeW1ib2xWYWx1ZUltcGwoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldENvbW1vblN5bWJvbFNpemVJbXBsKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTeW1ib2xGbGFncyhEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgRXhwZWN0ZWQ8U3ltYm9sUmVmOjpUeXBlPiBnZXRTeW1ib2xUeXBlKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICBFeHBlY3RlZDxzZWN0aW9uX2l0ZXJhdG9yPiBnZXRTeW1ib2xTZWN0aW9uKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIG1vdmVTZWN0aW9uTmV4dChEYXRhUmVmSW1wbCAmU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjplcnJvcl9jb2RlIGdldFNlY3Rpb25OYW1lKERhdGFSZWZJbXBsIFNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAmUmVzKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0U2VjdGlvbkFkZHJlc3MoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0U2VjdGlvbkluZGV4KERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFNlY3Rpb25TaXplKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRTZWN0aW9uQ29udGVudHMoRGF0YVJlZkltcGwgU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAmUmVzKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0U2VjdGlvbkFsaWdubWVudChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2VjdGlvbkNvbXByZXNzZWQoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1NlY3Rpb25UZXh0KERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZWN0aW9uRGF0YShEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2VjdGlvbkJTUyhEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2VjdGlvblZpcnR1YWwoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgcmVsb2NhdGlvbl9pdGVyYXRvciBzZWN0aW9uX3JlbF9iZWdpbihEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICByZWxvY2F0aW9uX2l0ZXJhdG9yIHNlY3Rpb25fcmVsX2VuZChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgbW92ZVJlbG9jYXRpb25OZXh0KERhdGFSZWZJbXBsICZSZWwpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRSZWxvY2F0aW9uT2Zmc2V0KERhdGFSZWZJbXBsIFJlbCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN5bWJvbF9pdGVyYXRvciBnZXRSZWxvY2F0aW9uU3ltYm9sKERhdGFSZWZJbXBsIFJlbCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFJlbG9jYXRpb25UeXBlKERhdGFSZWZJbXBsIFJlbCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0UmVsb2NhdGlvblR5cGVOYW1lKERhdGFSZWZJbXBsIFJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZSZXN1bHQpIGNvbnN0IG92ZXJyaWRlOworCitwdWJsaWM6CisgIENPRkZPYmplY3RGaWxlKE1lbW9yeUJ1ZmZlclJlZiBPYmplY3QsIHN0ZDo6ZXJyb3JfY29kZSAmRUMpOworCisgIGJhc2ljX3N5bWJvbF9pdGVyYXRvciBzeW1ib2xfYmVnaW4oKSBjb25zdCBvdmVycmlkZTsKKyAgYmFzaWNfc3ltYm9sX2l0ZXJhdG9yIHN5bWJvbF9lbmQoKSBjb25zdCBvdmVycmlkZTsKKyAgc2VjdGlvbl9pdGVyYXRvciBzZWN0aW9uX2JlZ2luKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHNlY3Rpb25faXRlcmF0b3Igc2VjdGlvbl9lbmQoKSBjb25zdCBvdmVycmlkZTsKKworICBjb25zdCBjb2ZmX3NlY3Rpb24gKmdldENPRkZTZWN0aW9uKGNvbnN0IFNlY3Rpb25SZWYgJlNlY3Rpb24pIGNvbnN0OworICBDT0ZGU3ltYm9sUmVmIGdldENPRkZTeW1ib2woY29uc3QgRGF0YVJlZkltcGwgJlJlZikgY29uc3Q7CisgIENPRkZTeW1ib2xSZWYgZ2V0Q09GRlN5bWJvbChjb25zdCBTeW1ib2xSZWYgJlN5bWJvbCkgY29uc3Q7CisgIGNvbnN0IGNvZmZfcmVsb2NhdGlvbiAqZ2V0Q09GRlJlbG9jYXRpb24oY29uc3QgUmVsb2NhdGlvblJlZiAmUmVsb2MpIGNvbnN0OworICB1bnNpZ25lZCBnZXRTZWN0aW9uSUQoU2VjdGlvblJlZiBTZWMpIGNvbnN0OworICB1bnNpZ25lZCBnZXRTeW1ib2xTZWN0aW9uSUQoU3ltYm9sUmVmIFN5bSkgY29uc3Q7CisKKyAgdWludDhfdCBnZXRCeXRlc0luQWRkcmVzcygpIGNvbnN0IG92ZXJyaWRlOworICBTdHJpbmdSZWYgZ2V0RmlsZUZvcm1hdE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgVHJpcGxlOjpBcmNoVHlwZSBnZXRBcmNoKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFN1YnRhcmdldEZlYXR1cmVzIGdldEZlYXR1cmVzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gU3VidGFyZ2V0RmVhdHVyZXMoKTsgfQorCisgIGltcG9ydF9kaXJlY3RvcnlfaXRlcmF0b3IgaW1wb3J0X2RpcmVjdG9yeV9iZWdpbigpIGNvbnN0OworICBpbXBvcnRfZGlyZWN0b3J5X2l0ZXJhdG9yIGltcG9ydF9kaXJlY3RvcnlfZW5kKCkgY29uc3Q7CisgIGRlbGF5X2ltcG9ydF9kaXJlY3RvcnlfaXRlcmF0b3IgZGVsYXlfaW1wb3J0X2RpcmVjdG9yeV9iZWdpbigpIGNvbnN0OworICBkZWxheV9pbXBvcnRfZGlyZWN0b3J5X2l0ZXJhdG9yIGRlbGF5X2ltcG9ydF9kaXJlY3RvcnlfZW5kKCkgY29uc3Q7CisgIGV4cG9ydF9kaXJlY3RvcnlfaXRlcmF0b3IgZXhwb3J0X2RpcmVjdG9yeV9iZWdpbigpIGNvbnN0OworICBleHBvcnRfZGlyZWN0b3J5X2l0ZXJhdG9yIGV4cG9ydF9kaXJlY3RvcnlfZW5kKCkgY29uc3Q7CisgIGJhc2VfcmVsb2NfaXRlcmF0b3IgYmFzZV9yZWxvY19iZWdpbigpIGNvbnN0OworICBiYXNlX3JlbG9jX2l0ZXJhdG9yIGJhc2VfcmVsb2NfZW5kKCkgY29uc3Q7CisgIGNvbnN0IGRlYnVnX2RpcmVjdG9yeSAqZGVidWdfZGlyZWN0b3J5X2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBEZWJ1Z0RpcmVjdG9yeUJlZ2luOworICB9CisgIGNvbnN0IGRlYnVnX2RpcmVjdG9yeSAqZGVidWdfZGlyZWN0b3J5X2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRGVidWdEaXJlY3RvcnlFbmQ7CisgIH0KKworICBpdGVyYXRvcl9yYW5nZTxpbXBvcnRfZGlyZWN0b3J5X2l0ZXJhdG9yPiBpbXBvcnRfZGlyZWN0b3JpZXMoKSBjb25zdDsKKyAgaXRlcmF0b3JfcmFuZ2U8ZGVsYXlfaW1wb3J0X2RpcmVjdG9yeV9pdGVyYXRvcj4KKyAgICAgIGRlbGF5X2ltcG9ydF9kaXJlY3RvcmllcygpIGNvbnN0OworICBpdGVyYXRvcl9yYW5nZTxleHBvcnRfZGlyZWN0b3J5X2l0ZXJhdG9yPiBleHBvcnRfZGlyZWN0b3JpZXMoKSBjb25zdDsKKyAgaXRlcmF0b3JfcmFuZ2U8YmFzZV9yZWxvY19pdGVyYXRvcj4gYmFzZV9yZWxvY3MoKSBjb25zdDsKKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3QgZGVidWdfZGlyZWN0b3J5ICo+IGRlYnVnX2RpcmVjdG9yaWVzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGRlYnVnX2RpcmVjdG9yeV9iZWdpbigpLCBkZWJ1Z19kaXJlY3RvcnlfZW5kKCkpOworICB9CisKKyAgY29uc3QgZG9zX2hlYWRlciAqZ2V0RE9TSGVhZGVyKCkgY29uc3QgeworICAgIGlmICghUEUzMkhlYWRlciAmJiAhUEUzMlBsdXNIZWFkZXIpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBkb3NfaGVhZGVyICo+KGJhc2UoKSk7CisgIH0KKyAgc3RkOjplcnJvcl9jb2RlIGdldFBFMzJIZWFkZXIoY29uc3QgcGUzMl9oZWFkZXIgKiZSZXMpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgZ2V0UEUzMlBsdXNIZWFkZXIoY29uc3QgcGUzMnBsdXNfaGVhZGVyIComUmVzKSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGdldERhdGFEaXJlY3RvcnkodWludDMyX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFfZGlyZWN0b3J5IComUmVzKSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGdldFNlY3Rpb24oaW50MzJfdCBpbmRleCwgY29uc3QgY29mZl9zZWN0aW9uIComUmVzKSBjb25zdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgY29mZl9zeW1ib2xfdHlwZT4KKyAgc3RkOjplcnJvcl9jb2RlIGdldFN5bWJvbCh1aW50MzJfdCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2ZmX3N5bWJvbF90eXBlIComUmVzKSBjb25zdCB7CisgICAgaWYgKEluZGV4ID49IGdldE51bWJlck9mU3ltYm9scygpKQorICAgICAgcmV0dXJuIG9iamVjdF9lcnJvcjo6cGFyc2VfZmFpbGVkOworCisgICAgUmVzID0gcmVpbnRlcnByZXRfY2FzdDxjb2ZmX3N5bWJvbF90eXBlICo+KGdldFN5bWJvbFRhYmxlKCkpICsgSW5kZXg7CisgICAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOworICB9CisgIEV4cGVjdGVkPENPRkZTeW1ib2xSZWY+IGdldFN5bWJvbCh1aW50MzJfdCBpbmRleCkgY29uc3QgeworICAgIGlmIChTeW1ib2xUYWJsZTE2KSB7CisgICAgICBjb25zdCBjb2ZmX3N5bWJvbDE2ICpTeW1iID0gbnVsbHB0cjsKKyAgICAgIGlmIChzdGQ6OmVycm9yX2NvZGUgRUMgPSBnZXRTeW1ib2woaW5kZXgsIFN5bWIpKQorICAgICAgICByZXR1cm4gZXJyb3JDb2RlVG9FcnJvcihFQyk7CisgICAgICByZXR1cm4gQ09GRlN5bWJvbFJlZihTeW1iKTsKKyAgICB9CisgICAgaWYgKFN5bWJvbFRhYmxlMzIpIHsKKyAgICAgIGNvbnN0IGNvZmZfc3ltYm9sMzIgKlN5bWIgPSBudWxscHRyOworICAgICAgaWYgKHN0ZDo6ZXJyb3JfY29kZSBFQyA9IGdldFN5bWJvbChpbmRleCwgU3ltYikpCisgICAgICAgIHJldHVybiBlcnJvckNvZGVUb0Vycm9yKEVDKTsKKyAgICAgIHJldHVybiBDT0ZGU3ltYm9sUmVmKFN5bWIpOworICAgIH0KKyAgICByZXR1cm4gZXJyb3JDb2RlVG9FcnJvcihvYmplY3RfZXJyb3I6OnBhcnNlX2ZhaWxlZCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RkOjplcnJvcl9jb2RlIGdldEF1eFN5bWJvbCh1aW50MzJfdCBpbmRleCwgY29uc3QgVCAqJlJlcykgY29uc3QgeworICAgIEV4cGVjdGVkPENPRkZTeW1ib2xSZWY+IFMgPSBnZXRTeW1ib2woaW5kZXgpOworICAgIGlmIChFcnJvciBFID0gUy50YWtlRXJyb3IoKSkKKyAgICAgIHJldHVybiBlcnJvclRvRXJyb3JDb2RlKHN0ZDo6bW92ZShFKSk7CisgICAgUmVzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUICo+KFMtPmdldFJhd1B0cigpKTsKKyAgICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKCk7CisgIH0KKworICBzdGQ6OmVycm9yX2NvZGUgZ2V0U3ltYm9sTmFtZShDT0ZGU3ltYm9sUmVmIFN5bWJvbCwgU3RyaW5nUmVmICZSZXMpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgZ2V0U3ltYm9sTmFtZShjb25zdCBjb2ZmX3N5bWJvbF9nZW5lcmljICpTeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAmUmVzKSBjb25zdDsKKworICBBcnJheVJlZjx1aW50OF90PiBnZXRTeW1ib2xBdXhEYXRhKENPRkZTeW1ib2xSZWYgU3ltYm9sKSBjb25zdDsKKworICBzaXplX3QgZ2V0U3ltYm9sVGFibGVFbnRyeVNpemUoKSBjb25zdCB7CisgICAgaWYgKENPRkZIZWFkZXIpCisgICAgICByZXR1cm4gc2l6ZW9mKGNvZmZfc3ltYm9sMTYpOworICAgIGlmIChDT0ZGQmlnT2JqSGVhZGVyKQorICAgICAgcmV0dXJuIHNpemVvZihjb2ZmX3N5bWJvbDMyKTsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJudWxsIHN5bWJvbCB0YWJsZSBwb2ludGVyISIpOworICB9CisKKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3QgY29mZl9yZWxvY2F0aW9uICo+CisgIGdldFJlbG9jYXRpb25zKGNvbnN0IGNvZmZfc2VjdGlvbiAqU2VjKSBjb25zdDsKKworICBzdGQ6OmVycm9yX2NvZGUgZ2V0U2VjdGlvbk5hbWUoY29uc3QgY29mZl9zZWN0aW9uICpTZWMsIFN0cmluZ1JlZiAmUmVzKSBjb25zdDsKKyAgdWludDY0X3QgZ2V0U2VjdGlvblNpemUoY29uc3QgY29mZl9zZWN0aW9uICpTZWMpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgZ2V0U2VjdGlvbkNvbnRlbnRzKGNvbnN0IGNvZmZfc2VjdGlvbiAqU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+ICZSZXMpIGNvbnN0OworCisgIHVpbnQ2NF90IGdldEltYWdlQmFzZSgpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgZ2V0VmFQdHIodWludDY0X3QgVkEsIHVpbnRwdHJfdCAmUmVzKSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGdldFJ2YVB0cih1aW50MzJfdCBSdmEsIHVpbnRwdHJfdCAmUmVzKSBjb25zdDsKKworICAvLy8gR2l2ZW4gYW4gUlZBIGJhc2UgYW5kIHNpemUsIHJldHVybnMgYSB2YWxpZCBhcnJheSBvZiBieXRlcyBvciBhbiBlcnJvcgorICAvLy8gY29kZSBpZiB0aGUgUlZBIGFuZCBzaXplIGlzIG5vdCBjb250YWluZWQgY29tcGxldGVseSB3aXRoaW4gYSB2YWxpZAorICAvLy8gc2VjdGlvbi4KKyAgc3RkOjplcnJvcl9jb2RlIGdldFJ2YUFuZFNpemVBc0J5dGVzKHVpbnQzMl90IFJWQSwgdWludDMyX3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+ICZDb250ZW50cykgY29uc3Q7CisKKyAgc3RkOjplcnJvcl9jb2RlIGdldEhpbnROYW1lKHVpbnQzMl90IFJ2YSwgdWludDE2X3QgJkhpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgJk5hbWUpIGNvbnN0OworCisgIC8vLyBHZXQgUERCIGluZm9ybWF0aW9uIG91dCBvZiBhIGNvZGV2aWV3IGRlYnVnIGRpcmVjdG9yeSBlbnRyeS4KKyAgc3RkOjplcnJvcl9jb2RlIGdldERlYnVnUERCSW5mbyhjb25zdCBkZWJ1Z19kaXJlY3RvcnkgKkRlYnVnRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGV2aWV3OjpEZWJ1Z0luZm8gKiZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAmUERCRmlsZU5hbWUpIGNvbnN0OworCisgIC8vLyBHZXQgUERCIGluZm9ybWF0aW9uIGZyb20gYW4gZXhlY3V0YWJsZS4gSWYgdGhlIGluZm9ybWF0aW9uIGlzIG5vdCBwcmVzZW50LAorICAvLy8gSW5mbyB3aWxsIGJlIHNldCB0byBudWxscHRyIGFuZCBQREJGaWxlTmFtZSB3aWxsIGJlIGVtcHR5LiBBbiBlcnJvciBpcworICAvLy8gcmV0dXJuZWQgb25seSBvbiBjb3JydXB0IG9iamVjdCBmaWxlcy4gQ29udmVuaWVuY2UgYWNjZXNzb3IgdGhhdCBjYW4gYmUKKyAgLy8vIHVzZWQgaWYgdGhlIGRlYnVnIGRpcmVjdG9yeSBpcyBub3QgYWxyZWFkeSBoYW5keS4KKyAgc3RkOjplcnJvcl9jb2RlIGdldERlYnVnUERCSW5mbyhjb25zdCBjb2Rldmlldzo6RGVidWdJbmZvIComSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgJlBEQkZpbGVOYW1lKSBjb25zdDsKKworICBib29sIGlzUmVsb2NhdGFibGVPYmplY3QoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpczY0KCkgY29uc3QgeyByZXR1cm4gUEUzMlBsdXNIZWFkZXI7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEJpbmFyeSAqdikgeyByZXR1cm4gdi0+aXNDT0ZGKCk7IH0KK307CisKKy8vIFRoZSBpdGVyYXRvciBmb3IgdGhlIGltcG9ydCBkaXJlY3RvcnkgdGFibGUuCitjbGFzcyBJbXBvcnREaXJlY3RvcnlFbnRyeVJlZiB7CitwdWJsaWM6CisgIEltcG9ydERpcmVjdG9yeUVudHJ5UmVmKCkgPSBkZWZhdWx0OworICBJbXBvcnREaXJlY3RvcnlFbnRyeVJlZihjb25zdCBjb2ZmX2ltcG9ydF9kaXJlY3RvcnlfdGFibGVfZW50cnkgKlRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJLCBjb25zdCBDT0ZGT2JqZWN0RmlsZSAqT3duZXIpCisgICAgICA6IEltcG9ydFRhYmxlKFRhYmxlKSwgSW5kZXgoSSksIE93bmluZ09iamVjdChPd25lcikge30KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW1wb3J0RGlyZWN0b3J5RW50cnlSZWYgJk90aGVyKSBjb25zdDsKKyAgdm9pZCBtb3ZlTmV4dCgpOworCisgIGltcG9ydGVkX3N5bWJvbF9pdGVyYXRvciBpbXBvcnRlZF9zeW1ib2xfYmVnaW4oKSBjb25zdDsKKyAgaW1wb3J0ZWRfc3ltYm9sX2l0ZXJhdG9yIGltcG9ydGVkX3N5bWJvbF9lbmQoKSBjb25zdDsKKyAgaXRlcmF0b3JfcmFuZ2U8aW1wb3J0ZWRfc3ltYm9sX2l0ZXJhdG9yPiBpbXBvcnRlZF9zeW1ib2xzKCkgY29uc3Q7CisKKyAgaW1wb3J0ZWRfc3ltYm9sX2l0ZXJhdG9yIGxvb2t1cF90YWJsZV9iZWdpbigpIGNvbnN0OworICBpbXBvcnRlZF9zeW1ib2xfaXRlcmF0b3IgbG9va3VwX3RhYmxlX2VuZCgpIGNvbnN0OworICBpdGVyYXRvcl9yYW5nZTxpbXBvcnRlZF9zeW1ib2xfaXRlcmF0b3I+IGxvb2t1cF90YWJsZV9zeW1ib2xzKCkgY29uc3Q7CisKKyAgc3RkOjplcnJvcl9jb2RlIGdldE5hbWUoU3RyaW5nUmVmICZSZXN1bHQpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgZ2V0SW1wb3J0TG9va3VwVGFibGVSVkEodWludDMyX3QgJlJlc3VsdCkgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRJbXBvcnRBZGRyZXNzVGFibGVSVkEodWludDMyX3QgJlJlc3VsdCkgY29uc3Q7CisKKyAgc3RkOjplcnJvcl9jb2RlCisgIGdldEltcG9ydFRhYmxlRW50cnkoY29uc3QgY29mZl9pbXBvcnRfZGlyZWN0b3J5X3RhYmxlX2VudHJ5IComUmVzdWx0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgY29uc3QgY29mZl9pbXBvcnRfZGlyZWN0b3J5X3RhYmxlX2VudHJ5ICpJbXBvcnRUYWJsZTsKKyAgdWludDMyX3QgSW5kZXg7CisgIGNvbnN0IENPRkZPYmplY3RGaWxlICpPd25pbmdPYmplY3QgPSBudWxscHRyOworfTsKKworY2xhc3MgRGVsYXlJbXBvcnREaXJlY3RvcnlFbnRyeVJlZiB7CitwdWJsaWM6CisgIERlbGF5SW1wb3J0RGlyZWN0b3J5RW50cnlSZWYoKSA9IGRlZmF1bHQ7CisgIERlbGF5SW1wb3J0RGlyZWN0b3J5RW50cnlSZWYoY29uc3QgZGVsYXlfaW1wb3J0X2RpcmVjdG9yeV90YWJsZV9lbnRyeSAqVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJLCBjb25zdCBDT0ZGT2JqZWN0RmlsZSAqT3duZXIpCisgICAgICA6IFRhYmxlKFQpLCBJbmRleChJKSwgT3duaW5nT2JqZWN0KE93bmVyKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEZWxheUltcG9ydERpcmVjdG9yeUVudHJ5UmVmICZPdGhlcikgY29uc3Q7CisgIHZvaWQgbW92ZU5leHQoKTsKKworICBpbXBvcnRlZF9zeW1ib2xfaXRlcmF0b3IgaW1wb3J0ZWRfc3ltYm9sX2JlZ2luKCkgY29uc3Q7CisgIGltcG9ydGVkX3N5bWJvbF9pdGVyYXRvciBpbXBvcnRlZF9zeW1ib2xfZW5kKCkgY29uc3Q7CisgIGl0ZXJhdG9yX3JhbmdlPGltcG9ydGVkX3N5bWJvbF9pdGVyYXRvcj4gaW1wb3J0ZWRfc3ltYm9scygpIGNvbnN0OworCisgIHN0ZDo6ZXJyb3JfY29kZSBnZXROYW1lKFN0cmluZ1JlZiAmUmVzdWx0KSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGdldERlbGF5SW1wb3J0VGFibGUoCisgICAgICBjb25zdCBkZWxheV9pbXBvcnRfZGlyZWN0b3J5X3RhYmxlX2VudHJ5IComUmVzdWx0KSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGdldEltcG9ydEFkZHJlc3MoaW50IEFkZHJJbmRleCwgdWludDY0X3QgJlJlc3VsdCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGNvbnN0IGRlbGF5X2ltcG9ydF9kaXJlY3RvcnlfdGFibGVfZW50cnkgKlRhYmxlOworICB1aW50MzJfdCBJbmRleDsKKyAgY29uc3QgQ09GRk9iamVjdEZpbGUgKk93bmluZ09iamVjdCA9IG51bGxwdHI7Cit9OworCisvLyBUaGUgaXRlcmF0b3IgZm9yIHRoZSBleHBvcnQgZGlyZWN0b3J5IHRhYmxlIGVudHJ5LgorY2xhc3MgRXhwb3J0RGlyZWN0b3J5RW50cnlSZWYgeworcHVibGljOgorICBFeHBvcnREaXJlY3RvcnlFbnRyeVJlZigpID0gZGVmYXVsdDsKKyAgRXhwb3J0RGlyZWN0b3J5RW50cnlSZWYoY29uc3QgZXhwb3J0X2RpcmVjdG9yeV90YWJsZV9lbnRyeSAqVGFibGUsIHVpbnQzMl90IEksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPRkZPYmplY3RGaWxlICpPd25lcikKKyAgICAgIDogRXhwb3J0VGFibGUoVGFibGUpLCBJbmRleChJKSwgT3duaW5nT2JqZWN0KE93bmVyKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFeHBvcnREaXJlY3RvcnlFbnRyeVJlZiAmT3RoZXIpIGNvbnN0OworICB2b2lkIG1vdmVOZXh0KCk7CisKKyAgc3RkOjplcnJvcl9jb2RlIGdldERsbE5hbWUoU3RyaW5nUmVmICZSZXN1bHQpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgZ2V0T3JkaW5hbEJhc2UodWludDMyX3QgJlJlc3VsdCkgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRPcmRpbmFsKHVpbnQzMl90ICZSZXN1bHQpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgZ2V0RXhwb3J0UlZBKHVpbnQzMl90ICZSZXN1bHQpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgZ2V0U3ltYm9sTmFtZShTdHJpbmdSZWYgJlJlc3VsdCkgY29uc3Q7CisKKyAgc3RkOjplcnJvcl9jb2RlIGlzRm9yd2FyZGVyKGJvb2wgJlJlc3VsdCkgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRGb3J3YXJkVG8oU3RyaW5nUmVmICZSZXN1bHQpIGNvbnN0OworCitwcml2YXRlOgorICBjb25zdCBleHBvcnRfZGlyZWN0b3J5X3RhYmxlX2VudHJ5ICpFeHBvcnRUYWJsZTsKKyAgdWludDMyX3QgSW5kZXg7CisgIGNvbnN0IENPRkZPYmplY3RGaWxlICpPd25pbmdPYmplY3QgPSBudWxscHRyOworfTsKKworY2xhc3MgSW1wb3J0ZWRTeW1ib2xSZWYgeworcHVibGljOgorICBJbXBvcnRlZFN5bWJvbFJlZigpID0gZGVmYXVsdDsKKyAgSW1wb3J0ZWRTeW1ib2xSZWYoY29uc3QgaW1wb3J0X2xvb2t1cF90YWJsZV9lbnRyeTMyICpFbnRyeSwgdWludDMyX3QgSSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09GRk9iamVjdEZpbGUgKk93bmVyKQorICAgICAgOiBFbnRyeTMyKEVudHJ5KSwgRW50cnk2NChudWxscHRyKSwgSW5kZXgoSSksIE93bmluZ09iamVjdChPd25lcikge30KKyAgSW1wb3J0ZWRTeW1ib2xSZWYoY29uc3QgaW1wb3J0X2xvb2t1cF90YWJsZV9lbnRyeTY0ICpFbnRyeSwgdWludDMyX3QgSSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09GRk9iamVjdEZpbGUgKk93bmVyKQorICAgICAgOiBFbnRyeTMyKG51bGxwdHIpLCBFbnRyeTY0KEVudHJ5KSwgSW5kZXgoSSksIE93bmluZ09iamVjdChPd25lcikge30KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW1wb3J0ZWRTeW1ib2xSZWYgJk90aGVyKSBjb25zdDsKKyAgdm9pZCBtb3ZlTmV4dCgpOworCisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRTeW1ib2xOYW1lKFN0cmluZ1JlZiAmUmVzdWx0KSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGlzT3JkaW5hbChib29sICZSZXN1bHQpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgZ2V0T3JkaW5hbCh1aW50MTZfdCAmUmVzdWx0KSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGdldEhpbnROYW1lUlZBKHVpbnQzMl90ICZSZXN1bHQpIGNvbnN0OworCitwcml2YXRlOgorICBjb25zdCBpbXBvcnRfbG9va3VwX3RhYmxlX2VudHJ5MzIgKkVudHJ5MzI7CisgIGNvbnN0IGltcG9ydF9sb29rdXBfdGFibGVfZW50cnk2NCAqRW50cnk2NDsKKyAgdWludDMyX3QgSW5kZXg7CisgIGNvbnN0IENPRkZPYmplY3RGaWxlICpPd25pbmdPYmplY3QgPSBudWxscHRyOworfTsKKworY2xhc3MgQmFzZVJlbG9jUmVmIHsKK3B1YmxpYzoKKyAgQmFzZVJlbG9jUmVmKCkgPSBkZWZhdWx0OworICBCYXNlUmVsb2NSZWYoY29uc3QgY29mZl9iYXNlX3JlbG9jX2Jsb2NrX2hlYWRlciAqSGVhZGVyLAorICAgICAgICAgICAgICAgY29uc3QgQ09GRk9iamVjdEZpbGUgKk93bmVyKQorICAgICAgOiBIZWFkZXIoSGVhZGVyKSwgSW5kZXgoMCkge30KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQmFzZVJlbG9jUmVmICZPdGhlcikgY29uc3Q7CisgIHZvaWQgbW92ZU5leHQoKTsKKworICBzdGQ6OmVycm9yX2NvZGUgZ2V0VHlwZSh1aW50OF90ICZUeXBlKSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGdldFJWQSh1aW50MzJfdCAmUmVzdWx0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgY29uc3QgY29mZl9iYXNlX3JlbG9jX2Jsb2NrX2hlYWRlciAqSGVhZGVyOworICB1aW50MzJfdCBJbmRleDsKK307CisKK2NsYXNzIFJlc291cmNlU2VjdGlvblJlZiB7CitwdWJsaWM6CisgIFJlc291cmNlU2VjdGlvblJlZigpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgUmVzb3VyY2VTZWN0aW9uUmVmKFN0cmluZ1JlZiBSZWYpIDogQkJTKFJlZiwgc3VwcG9ydDo6bGl0dGxlKSB7fQorCisgIEV4cGVjdGVkPEFycmF5UmVmPFVURjE2Pj4KKyAgZ2V0RW50cnlOYW1lU3RyaW5nKGNvbnN0IGNvZmZfcmVzb3VyY2VfZGlyX2VudHJ5ICZFbnRyeSk7CisgIEV4cGVjdGVkPGNvbnN0IGNvZmZfcmVzb3VyY2VfZGlyX3RhYmxlICY+CisgIGdldEVudHJ5U3ViRGlyKGNvbnN0IGNvZmZfcmVzb3VyY2VfZGlyX2VudHJ5ICZFbnRyeSk7CisgIEV4cGVjdGVkPGNvbnN0IGNvZmZfcmVzb3VyY2VfZGlyX3RhYmxlICY+IGdldEJhc2VUYWJsZSgpOworCitwcml2YXRlOgorICBCaW5hcnlCeXRlU3RyZWFtIEJCUzsKKworICBFeHBlY3RlZDxjb25zdCBjb2ZmX3Jlc291cmNlX2Rpcl90YWJsZSAmPiBnZXRUYWJsZUF0T2Zmc2V0KHVpbnQzMl90IE9mZnNldCk7CisgIEV4cGVjdGVkPEFycmF5UmVmPFVURjE2Pj4gZ2V0RGlyU3RyaW5nQXRPZmZzZXQodWludDMyX3QgT2Zmc2V0KTsKK307CisKKy8vIENvcnJlc3BvbmRzIHRvIGBfRlBPX0RBVEFgIHN0cnVjdHVyZSBpbiB0aGUgUEUvQ09GRiBzcGVjLgorc3RydWN0IEZwb0RhdGEgeworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBPZmZzZXQ7IC8vIHVsT2ZmU3RhcnQ6IE9mZnNldCAxc3QgYnl0ZSBvZiBmdW5jdGlvbiBjb2RlCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpemU7ICAgLy8gY2JQcm9jU2l6ZTogIyBieXRlcyBpbiBmdW5jdGlvbgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBOdW1Mb2NhbHM7IC8vIGNkd0xvY2FsczogIyBieXRlcyBpbiBsb2NhbHMvNAorICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBOdW1QYXJhbXM7IC8vIGNkd1BhcmFtczogIyBieXRlcyBpbiBwYXJhbXMvNAorICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBBdHRyaWJ1dGVzOworCisgIC8vIGNiUHJvbG9nOiAjIGJ5dGVzIGluIHByb2xvZworICBpbnQgZ2V0UHJvbG9nU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEF0dHJpYnV0ZXMgJiAweEY7IH0KKworICAvLyBjYlJlZ3M6ICMgcmVncyBzYXZlZAorICBpbnQgZ2V0TnVtU2F2ZWRSZWdzKCkgY29uc3QgeyByZXR1cm4gKEF0dHJpYnV0ZXMgPj4gOCkgJiAweDc7IH0KKworICAvLyBmSGFzU0VIOiB0cnVlIGlmIHNlaCBpcyBmdW5jCisgIGJvb2wgaGFzU0VIKCkgY29uc3QgeyByZXR1cm4gKEF0dHJpYnV0ZXMgPj4gOSkgJiAxOyB9CisKKyAgLy8gZlVzZUJQOiB0cnVlIGlmIEVCUCBoYXMgYmVlbiBhbGxvY2F0ZWQKKyAgYm9vbCB1c2VCUCgpIGNvbnN0IHsgcmV0dXJuIChBdHRyaWJ1dGVzID4+IDEwKSAmIDE7IH0KKworICAvLyBjYkZyYW1lOiBmcmFtZSBwb2ludGVyCisgIGludCBnZXRGUCgpIGNvbnN0IHsgcmV0dXJuIEF0dHJpYnV0ZXMgPj4gMTQ7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvYmplY3QKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT0JKRUNUX0NPRkZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvQ09GRkltcG9ydEZpbGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0NPRkZJbXBvcnRGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhNDE2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0NPRkZJbXBvcnRGaWxlLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8vPT09LSBDT0ZGSW1wb3J0RmlsZS5oIC0gQ09GRiBzaG9ydCBpbXBvcnQgZmlsZSBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ09GRiBzaG9ydCBpbXBvcnQgZmlsZSBpcyBhIHNwZWNpYWwga2luZCBvZiBmaWxlIHdoaWNoIGNvbnRhaW5zCisvLyBvbmx5IHN5bWJvbCBuYW1lcyBmb3IgRExMLWV4cG9ydGVkIHN5bWJvbHMuIFRoaXMgY2xhc3MgaW1wbGVtZW50cworLy8gZXhwb3J0aW5nIG9mIFN5bWJvbHMgdG8gY3JlYXRlIGxpYnJhcmllcyBhbmQgYSBTeW1ib2xpY0ZpbGUKKy8vIGludGVyZmFjZSBmb3IgdGhlIGZpbGUgdHlwZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUX0NPRkZfSU1QT1JUX0ZJTEVfSAorI2RlZmluZSBMTFZNX09CSkVDVF9DT0ZGX0lNUE9SVF9GSUxFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvQ09GRi5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0lST2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L09iamVjdEZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9TeW1ib2xpY0ZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvYmplY3QgeworCitjbGFzcyBDT0ZGSW1wb3J0RmlsZSA6IHB1YmxpYyBTeW1ib2xpY0ZpbGUgeworcHVibGljOgorICBDT0ZGSW1wb3J0RmlsZShNZW1vcnlCdWZmZXJSZWYgU291cmNlKQorICAgICAgOiBTeW1ib2xpY0ZpbGUoSURfQ09GRkltcG9ydEZpbGUsIFNvdXJjZSkge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKEJpbmFyeSBjb25zdCAqVikgeyByZXR1cm4gVi0+aXNDT0ZGSW1wb3J0RmlsZSgpOyB9CisKKyAgdm9pZCBtb3ZlU3ltYm9sTmV4dChEYXRhUmVmSW1wbCAmU3ltYikgY29uc3Qgb3ZlcnJpZGUgeyArK1N5bWIucDsgfQorCisgIHN0ZDo6ZXJyb3JfY29kZSBwcmludFN5bWJvbE5hbWUocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBpZiAoU3ltYi5wID09IDApCisgICAgICBPUyA8PCAiX19pbXBfIjsKKyAgICBPUyA8PCBTdHJpbmdSZWYoRGF0YS5nZXRCdWZmZXJTdGFydCgpICsgc2l6ZW9mKGNvZmZfaW1wb3J0X2hlYWRlcikpOworICAgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKKyAgfQorCisgIHVpbnQzMl90IGdldFN5bWJvbEZsYWdzKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gU3ltYm9sUmVmOjpTRl9HbG9iYWw7CisgIH0KKworICBiYXNpY19zeW1ib2xfaXRlcmF0b3Igc3ltYm9sX2JlZ2luKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBCYXNpY1N5bWJvbFJlZihEYXRhUmVmSW1wbCgpLCB0aGlzKTsKKyAgfQorCisgIGJhc2ljX3N5bWJvbF9pdGVyYXRvciBzeW1ib2xfZW5kKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIERhdGFSZWZJbXBsIFN5bWI7CisgICAgU3ltYi5wID0gaXNEYXRhKCkgPyAxIDogMjsKKyAgICByZXR1cm4gQmFzaWNTeW1ib2xSZWYoU3ltYiwgdGhpcyk7CisgIH0KKworICBjb25zdCBjb2ZmX2ltcG9ydF9oZWFkZXIgKmdldENPRkZJbXBvcnRIZWFkZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgb2JqZWN0Ojpjb2ZmX2ltcG9ydF9oZWFkZXIgKj4oCisgICAgICAgIERhdGEuZ2V0QnVmZmVyU3RhcnQoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgYm9vbCBpc0RhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldENPRkZJbXBvcnRIZWFkZXIoKS0+Z2V0VHlwZSgpID09IENPRkY6OklNUE9SVF9EQVRBOworICB9Cit9OworCitzdHJ1Y3QgQ09GRlNob3J0RXhwb3J0IHsKKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgc3RkOjpzdHJpbmcgRXh0TmFtZTsKKyAgc3RkOjpzdHJpbmcgU3ltYm9sTmFtZTsKKworICB1aW50MTZfdCBPcmRpbmFsID0gMDsKKyAgYm9vbCBOb25hbWUgPSBmYWxzZTsKKyAgYm9vbCBEYXRhID0gZmFsc2U7CisgIGJvb2wgUHJpdmF0ZSA9IGZhbHNlOworICBib29sIENvbnN0YW50ID0gZmFsc2U7CisKKyAgYm9vbCBpc1dlYWsoKSB7CisgICAgcmV0dXJuIEV4dE5hbWUuc2l6ZSgpICYmIEV4dE5hbWUgIT0gTmFtZTsKKyAgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgQ09GRlNob3J0RXhwb3J0ICZMLCBjb25zdCBDT0ZGU2hvcnRFeHBvcnQgJlIpIHsKKyAgICByZXR1cm4gTC5OYW1lID09IFIuTmFtZSAmJiBMLkV4dE5hbWUgPT0gUi5FeHROYW1lICYmCisgICAgICAgICAgICBMLk9yZGluYWwgPT0gUi5PcmRpbmFsICYmIEwuTm9uYW1lID09IFIuTm9uYW1lICYmCisgICAgICAgICAgICBMLkRhdGEgPT0gUi5EYXRhICYmIEwuUHJpdmF0ZSA9PSBSLlByaXZhdGU7CisgIH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENPRkZTaG9ydEV4cG9ydCAmTCwgY29uc3QgQ09GRlNob3J0RXhwb3J0ICZSKSB7CisgICAgcmV0dXJuICEoTCA9PSBSKTsKKyAgfQorfTsKKworRXJyb3Igd3JpdGVJbXBvcnRMaWJyYXJ5KFN0cmluZ1JlZiBJbXBvcnROYW1lLCBTdHJpbmdSZWYgUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDT0ZGU2hvcnRFeHBvcnQ+IEV4cG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ09GRjo6TWFjaGluZVR5cGVzIE1hY2hpbmUsIGJvb2wgTWFrZVdlYWtBbGlhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTWluR1cpOworCit9IC8vIG5hbWVzcGFjZSBvYmplY3QKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9DT0ZGTW9kdWxlRGVmaW5pdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvQ09GRk1vZHVsZURlZmluaXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTEzOWEyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvQ09GRk1vZHVsZURlZmluaXRpb24uaApAQCAtMCwwICsxLDUzIEBACisvLz09PS0tLSBDT0ZGTW9kdWxlRGVmaW5pdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFdpbmRvd3Mtc3BlY2lmaWMuCisvLyBBIHBhcnNlciBmb3IgdGhlIG1vZHVsZS1kZWZpbml0aW9uIGZpbGUgKC5kZWYgZmlsZSkuCisvLyBQYXJzZWQgcmVzdWx0cyBhcmUgZGlyZWN0bHkgd3JpdHRlbiB0byBDb25maWcgZ2xvYmFsIHZhcmlhYmxlLgorLy8KKy8vIFRoZSBmb3JtYXQgb2YgbW9kdWxlLWRlZmluaXRpb24gZmlsZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50OgorLy8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS8yOGQ2czc5aC5hc3B4CisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVF9DT0ZGX01PRFVMRV9ERUZJTklUSU9OX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RfQ09GRl9NT0RVTEVfREVGSU5JVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL09iamVjdC9DT0ZGLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvQ09GRkltcG9ydEZpbGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9iamVjdCB7CisKK3N0cnVjdCBDT0ZGTW9kdWxlRGVmaW5pdGlvbiB7CisgIHN0ZDo6dmVjdG9yPENPRkZTaG9ydEV4cG9ydD4gRXhwb3J0czsKKyAgc3RkOjpzdHJpbmcgT3V0cHV0RmlsZTsKKyAgc3RkOjpzdHJpbmcgSW1wb3J0TmFtZTsKKyAgdWludDY0X3QgSW1hZ2VCYXNlID0gMDsKKyAgdWludDY0X3QgU3RhY2tSZXNlcnZlID0gMDsKKyAgdWludDY0X3QgU3RhY2tDb21taXQgPSAwOworICB1aW50NjRfdCBIZWFwUmVzZXJ2ZSA9IDA7CisgIHVpbnQ2NF90IEhlYXBDb21taXQgPSAwOworICB1aW50MzJfdCBNYWpvckltYWdlVmVyc2lvbiA9IDA7CisgIHVpbnQzMl90IE1pbm9ySW1hZ2VWZXJzaW9uID0gMDsKKyAgdWludDMyX3QgTWFqb3JPU1ZlcnNpb24gPSAwOworICB1aW50MzJfdCBNaW5vck9TVmVyc2lvbiA9IDA7Cit9OworCisvLyBtaW5ndyBhbmQgd2luZSBkZWYgZmlsZXMgZG8gbm90IG1hbmdsZSBfIGZvciB4ODYgd2hpY2gKKy8vIGlzIGEgY29uc2VxdWVuY2Ugb2YgbGVnYWN5IGJpbnV0aWxzJyBkbGx0b29sIGZ1bmN0aW9uYWxpdHkuCisvLyBUaGlzIE1pbmd3RGVmIGZsYWcgc2hvdWxkIGJlIHJlbW92ZWQgb25jZSBtaW5ndyBzdG9wcyB0aGlzIHByYXRpY2UuCitFeHBlY3RlZDxDT0ZGTW9kdWxlRGVmaW5pdGlvbj4KK3BhcnNlQ09GRk1vZHVsZURlZmluaXRpb24oTWVtb3J5QnVmZmVyUmVmIE1CLCBDT0ZGOjpNYWNoaW5lVHlwZXMgTWFjaGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNaW5nd0RlZiA9IGZhbHNlKTsKKworfSAvLyBFbmQgbmFtZXNwYWNlIG9iamVjdC4KK30gLy8gRW5kIG5hbWVzcGFjZSBsbHZtLgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0NWRGVidWdSZWNvcmQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0NWRGVidWdSZWNvcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWFkNzJjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvQ1ZEZWJ1Z1JlY29yZC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vPT09LSBDVkRlYnVnUmVjb3JkLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RfQ1ZERUJVR1JFQ09SRF9ICisjZGVmaW5lIExMVk1fT0JKRUNUX0NWREVCVUdSRUNPUkRfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgT01GIHsKK3N0cnVjdCBTaWduYXR1cmUgeworICBlbnVtIElEIDogdWludDMyX3QgeworICAgIFBEQjcwID0gMHg1MzQ0NTM1MiwgLy8gUlNEUworICAgIFBEQjIwID0gMHgzMDMxNDI0ZSwgLy8gTkIxMAorICAgIENWNTAgPSAweDMxMzE0MjRlLCAgLy8gTkIxMQorICAgIENWNDEgPSAweDM5MzA0MjRlLCAgLy8gTkIwOQorICB9OworCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IENWU2lnbmF0dXJlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBPZmZzZXQ7Cit9OworfQorCituYW1lc3BhY2UgY29kZXZpZXcgeworc3RydWN0IFBEQjcwRGVidWdJbmZvIHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQ1ZTaWduYXR1cmU7CisgIHVpbnQ4X3QgU2lnbmF0dXJlWzE2XTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQWdlOworICAvLyBjaGFyIFBEQkZpbGVOYW1lW107Cit9OworCitzdHJ1Y3QgUERCMjBEZWJ1Z0luZm8geworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDVlNpZ25hdHVyZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgT2Zmc2V0OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaWduYXR1cmU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEFnZTsKKyAgLy8gY2hhciBQREJGaWxlTmFtZVtdOworfTsKKwordW5pb24gRGVidWdJbmZvIHsKKyAgc3RydWN0IE9NRjo6U2lnbmF0dXJlIFNpZ25hdHVyZTsKKyAgc3RydWN0IFBEQjIwRGVidWdJbmZvIFBEQjIwOworICBzdHJ1Y3QgUERCNzBEZWJ1Z0luZm8gUERCNzA7Cit9OworfQorfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvRGVjb21wcmVzc29yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9EZWNvbXByZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGU4ODhkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvRGVjb21wcmVzc29yLmgKQEAgLTAsMCArMSw2NyBAQAorLy89PT0tLSBEZWNvbXByZXNzb3IuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09LworCisjaWZuZGVmIExMVk1fT0JKRUNUX0RFQ09NUFJFU1NPUl9ICisjZGVmaW5lIExMVk1fT0JKRUNUX0RFQ09NUFJFU1NPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L09iamVjdEZpbGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9iamVjdCB7CisKKy8vLyBAYnJpZWYgRGVjb21wcmVzc29yIGhlbHBzIHRvIGhhbmRsZSBkZWNvbXByZXNzaW9uIG9mIGNvbXByZXNzZWQgc2VjdGlvbnMuCitjbGFzcyBEZWNvbXByZXNzb3IgeworcHVibGljOgorICAvLy8gQGJyaWVmIENyZWF0ZSBkZWNvbXByZXNzb3Igb2JqZWN0LgorICAvLy8gQHBhcmFtIE5hbWUgICAgICAgIFNlY3Rpb24gbmFtZS4KKyAgLy8vIEBwYXJhbSBEYXRhICAgICAgICBTZWN0aW9uIGNvbnRlbnQuCisgIC8vLyBAcGFyYW0gSXNMRSAgICAgICAgRmxhZyBkZXRlcm1pbmVzIGlmIERhdGEgaXMgaW4gbGl0dGxlIGVuZGlhbiBmb3JtLgorICAvLy8gQHBhcmFtIElzNjRCaXQgICAgIEZsYWcgZGV0ZXJtaW5lcyBpZiBvYmplY3QgaXMgNjQgYml0LgorICBzdGF0aWMgRXhwZWN0ZWQ8RGVjb21wcmVzc29yPiBjcmVhdGUoU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0xFLCBib29sIElzNjRCaXQpOworCisgIC8vLyBAYnJpZWYgUmVzaXplIHRoZSBidWZmZXIgYW5kIHVuY29tcHJlc3Mgc2VjdGlvbiBkYXRhIGludG8gaXQuCisgIC8vLyBAcGFyYW0gT3V0ICAgICAgICAgRGVzdGluYXRpb24gYnVmZmVyLgorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gRXJyb3IgcmVzaXplQW5kRGVjb21wcmVzcyhUICZPdXQpIHsKKyAgICBPdXQucmVzaXplKERlY29tcHJlc3NlZFNpemUpOworICAgIHJldHVybiBkZWNvbXByZXNzKHtPdXQuZGF0YSgpLCAoc2l6ZV90KURlY29tcHJlc3NlZFNpemV9KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgVW5jb21wcmVzcyBzZWN0aW9uIGRhdGEgdG8gcmF3IGJ1ZmZlciBwcm92aWRlZC4KKyAgLy8vIEBwYXJhbSBCdWZmZXIgICAgICBEZXN0aW5hdGlvbiBidWZmZXIuCisgIEVycm9yIGRlY29tcHJlc3MoTXV0YWJsZUFycmF5UmVmPGNoYXI+IEJ1ZmZlcik7CisKKyAgLy8vIEBicmllZiBSZXR1cm4gbWVtb3J5IGJ1ZmZlciBzaXplIHJlcXVpcmVkIGZvciBkZWNvbXByZXNzaW9uLgorICB1aW50NjRfdCBnZXREZWNvbXByZXNzZWRTaXplKCkgeyByZXR1cm4gRGVjb21wcmVzc2VkU2l6ZTsgfQorCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRydWUgaWYgc2VjdGlvbiBpcyBjb21wcmVzc2VkLCBpbmNsdWRpbmcgZ251LXN0eWxlZCBjYXNlLgorICBzdGF0aWMgYm9vbCBpc0NvbXByZXNzZWQoY29uc3Qgb2JqZWN0OjpTZWN0aW9uUmVmICZTZWN0aW9uKTsKKworICAvLy8gQGJyaWVmIFJldHVybiB0cnVlIGlmIHNlY3Rpb24gaXMgYSBFTEYgY29tcHJlc3NlZCBvbmUuCisgIHN0YXRpYyBib29sIGlzQ29tcHJlc3NlZEVMRlNlY3Rpb24odWludDY0X3QgRmxhZ3MsIFN0cmluZ1JlZiBOYW1lKTsKKworICAvLy8gQGJyaWVmIFJldHVybiB0cnVlIGlmIHNlY3Rpb24gbmFtZSBtYXRjaGVzIGdudSBzdHlsZSBjb21wcmVzc2VkIG9uZS4KKyAgc3RhdGljIGJvb2wgaXNHbnVTdHlsZShTdHJpbmdSZWYgTmFtZSk7CisKK3ByaXZhdGU6CisgIERlY29tcHJlc3NvcihTdHJpbmdSZWYgRGF0YSk7CisKKyAgRXJyb3IgY29uc3VtZUNvbXByZXNzZWRHbnVIZWFkZXIoKTsKKyAgRXJyb3IgY29uc3VtZUNvbXByZXNzZWRaTGliSGVhZGVyKGJvb2wgSXM2NEJpdCwgYm9vbCBJc0xpdHRsZUVuZGlhbik7CisKKyAgU3RyaW5nUmVmIFNlY3Rpb25EYXRhOworICB1aW50NjRfdCBEZWNvbXByZXNzZWRTaXplOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9iamVjdAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT0JKRUNUX0RFQ09NUFJFU1NPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9FTEYuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0VMRi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTA0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9FTEYuaApAQCAtMCwwICsxLDYxMSBAQAorLy89PT0tIEVMRi5oIC0gRUxGIG9iamVjdCBmaWxlIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIEVMRkZpbGUgdGVtcGxhdGUgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVF9FTEZfSAorI2RlZmluZSBMTFZNX09CSkVDVF9FTEZfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0VMRi5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0VMRlR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvYmplY3QgeworCitTdHJpbmdSZWYgZ2V0RUxGUmVsb2NhdGlvblR5cGVOYW1lKHVpbnQzMl90IE1hY2hpbmUsIHVpbnQzMl90IFR5cGUpOworU3RyaW5nUmVmIGdldEVMRlNlY3Rpb25UeXBlTmFtZSh1aW50MzJfdCBNYWNoaW5lLCB1aW50MzJfdCBUeXBlKTsKKworLy8gU3ViY2xhc3NlcyBvZiBFTEZGaWxlIG1heSBuZWVkIHRoaXMgZm9yIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KK2lubGluZSBzdGQ6OnBhaXI8dW5zaWduZWQgY2hhciwgdW5zaWduZWQgY2hhcj4KK2dldEVsZkFyY2hUeXBlKFN0cmluZ1JlZiBPYmplY3QpIHsKKyAgaWYgKE9iamVjdC5zaXplKCkgPCBFTEY6OkVJX05JREVOVCkKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoKHVpbnQ4X3QpRUxGOjpFTEZDTEFTU05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KUVMRjo6RUxGREFUQU5PTkUpOworICByZXR1cm4gc3RkOjptYWtlX3BhaXIoKHVpbnQ4X3QpT2JqZWN0W0VMRjo6RUlfQ0xBU1NdLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpT2JqZWN0W0VMRjo6RUlfREFUQV0pOworfQorCitzdGF0aWMgaW5saW5lIEVycm9yIGNyZWF0ZUVycm9yKFN0cmluZ1JlZiBFcnIpIHsKKyAgcmV0dXJuIG1ha2VfZXJyb3I8U3RyaW5nRXJyb3I+KEVyciwgb2JqZWN0X2Vycm9yOjpwYXJzZV9mYWlsZWQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK2NsYXNzIEVMRkZpbGUgeworcHVibGljOgorICBMTFZNX0VMRl9JTVBPUlRfVFlQRVNfRUxGVChFTEZUKQorICB1c2luZyB1aW50WF90ID0gdHlwZW5hbWUgRUxGVDo6dWludDsKKyAgdXNpbmcgRWxmX0VoZHIgPSB0eXBlbmFtZSBFTEZUOjpFaGRyOworICB1c2luZyBFbGZfU2hkciA9IHR5cGVuYW1lIEVMRlQ6OlNoZHI7CisgIHVzaW5nIEVsZl9TeW0gPSB0eXBlbmFtZSBFTEZUOjpTeW07CisgIHVzaW5nIEVsZl9EeW4gPSB0eXBlbmFtZSBFTEZUOjpEeW47CisgIHVzaW5nIEVsZl9QaGRyID0gdHlwZW5hbWUgRUxGVDo6UGhkcjsKKyAgdXNpbmcgRWxmX1JlbCA9IHR5cGVuYW1lIEVMRlQ6OlJlbDsKKyAgdXNpbmcgRWxmX1JlbGEgPSB0eXBlbmFtZSBFTEZUOjpSZWxhOworICB1c2luZyBFbGZfVmVyZGVmID0gdHlwZW5hbWUgRUxGVDo6VmVyZGVmOworICB1c2luZyBFbGZfVmVyZGF1eCA9IHR5cGVuYW1lIEVMRlQ6OlZlcmRhdXg7CisgIHVzaW5nIEVsZl9WZXJuZWVkID0gdHlwZW5hbWUgRUxGVDo6VmVybmVlZDsKKyAgdXNpbmcgRWxmX1Zlcm5hdXggPSB0eXBlbmFtZSBFTEZUOjpWZXJuYXV4OworICB1c2luZyBFbGZfVmVyc3ltID0gdHlwZW5hbWUgRUxGVDo6VmVyc3ltOworICB1c2luZyBFbGZfSGFzaCA9IHR5cGVuYW1lIEVMRlQ6Okhhc2g7CisgIHVzaW5nIEVsZl9HbnVIYXNoID0gdHlwZW5hbWUgRUxGVDo6R251SGFzaDsKKyAgdXNpbmcgRWxmX05oZHIgPSB0eXBlbmFtZSBFTEZUOjpOaGRyOworICB1c2luZyBFbGZfTm90ZSA9IHR5cGVuYW1lIEVMRlQ6Ok5vdGU7CisgIHVzaW5nIEVsZl9Ob3RlX0l0ZXJhdG9yID0gdHlwZW5hbWUgRUxGVDo6Tm90ZUl0ZXJhdG9yOworICB1c2luZyBFbGZfRHluX1JhbmdlID0gdHlwZW5hbWUgRUxGVDo6RHluUmFuZ2U7CisgIHVzaW5nIEVsZl9TaGRyX1JhbmdlID0gdHlwZW5hbWUgRUxGVDo6U2hkclJhbmdlOworICB1c2luZyBFbGZfU3ltX1JhbmdlID0gdHlwZW5hbWUgRUxGVDo6U3ltUmFuZ2U7CisgIHVzaW5nIEVsZl9SZWxfUmFuZ2UgPSB0eXBlbmFtZSBFTEZUOjpSZWxSYW5nZTsKKyAgdXNpbmcgRWxmX1JlbGFfUmFuZ2UgPSB0eXBlbmFtZSBFTEZUOjpSZWxhUmFuZ2U7CisgIHVzaW5nIEVsZl9QaGRyX1JhbmdlID0gdHlwZW5hbWUgRUxGVDo6UGhkclJhbmdlOworCisgIGNvbnN0IHVpbnQ4X3QgKmJhc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihCdWYuZGF0YSgpKTsKKyAgfQorCisgIHNpemVfdCBnZXRCdWZTaXplKCkgY29uc3QgeyByZXR1cm4gQnVmLnNpemUoKTsgfQorCitwcml2YXRlOgorICBTdHJpbmdSZWYgQnVmOworCisgIEVMRkZpbGUoU3RyaW5nUmVmIE9iamVjdCk7CisKK3B1YmxpYzoKKyAgY29uc3QgRWxmX0VoZHIgKmdldEhlYWRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbGZfRWhkciAqPihiYXNlKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIEV4cGVjdGVkPGNvbnN0IFQgKj4gZ2V0RW50cnkodWludDMyX3QgU2VjdGlvbiwgdWludDMyX3QgRW50cnkpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgRXhwZWN0ZWQ8Y29uc3QgVCAqPiBnZXRFbnRyeShjb25zdCBFbGZfU2hkciAqU2VjdGlvbiwgdWludDMyX3QgRW50cnkpIGNvbnN0OworCisgIEV4cGVjdGVkPFN0cmluZ1JlZj4gZ2V0U3RyaW5nVGFibGUoY29uc3QgRWxmX1NoZHIgKlNlY3Rpb24pIGNvbnN0OworICBFeHBlY3RlZDxTdHJpbmdSZWY+IGdldFN0cmluZ1RhYmxlRm9yU3ltdGFiKGNvbnN0IEVsZl9TaGRyICZTZWN0aW9uKSBjb25zdDsKKyAgRXhwZWN0ZWQ8U3RyaW5nUmVmPiBnZXRTdHJpbmdUYWJsZUZvclN5bXRhYihjb25zdCBFbGZfU2hkciAmU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGZfU2hkcl9SYW5nZSBTZWN0aW9ucykgY29uc3Q7CisKKyAgRXhwZWN0ZWQ8QXJyYXlSZWY8RWxmX1dvcmQ+PiBnZXRTSE5EWFRhYmxlKGNvbnN0IEVsZl9TaGRyICZTZWN0aW9uKSBjb25zdDsKKyAgRXhwZWN0ZWQ8QXJyYXlSZWY8RWxmX1dvcmQ+PiBnZXRTSE5EWFRhYmxlKGNvbnN0IEVsZl9TaGRyICZTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxmX1NoZHJfUmFuZ2UgU2VjdGlvbnMpIGNvbnN0OworCisgIFN0cmluZ1JlZiBnZXRSZWxvY2F0aW9uVHlwZU5hbWUodWludDMyX3QgVHlwZSkgY29uc3Q7CisgIHZvaWQgZ2V0UmVsb2NhdGlvblR5cGVOYW1lKHVpbnQzMl90IFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0KSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgc3ltYm9sIGZvciBhIGdpdmVuIHJlbG9jYXRpb24uCisgIEV4cGVjdGVkPGNvbnN0IEVsZl9TeW0gKj4gZ2V0UmVsb2NhdGlvblN5bWJvbChjb25zdCBFbGZfUmVsICpSZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbGZfU2hkciAqU3ltVGFiKSBjb25zdDsKKworICBzdGF0aWMgRXhwZWN0ZWQ8RUxGRmlsZT4gY3JlYXRlKFN0cmluZ1JlZiBPYmplY3QpOworCisgIGJvb2wgaXNNaXBzRUxGNjQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEhlYWRlcigpLT5lX21hY2hpbmUgPT0gRUxGOjpFTV9NSVBTICYmCisgICAgICAgICAgIGdldEhlYWRlcigpLT5nZXRGaWxlQ2xhc3MoKSA9PSBFTEY6OkVMRkNMQVNTNjQ7CisgIH0KKworICBib29sIGlzTWlwczY0RUwoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzTWlwc0VMRjY0KCkgJiYKKyAgICAgICAgICAgZ2V0SGVhZGVyKCktPmdldERhdGFFbmNvZGluZygpID09IEVMRjo6RUxGREFUQTJMU0I7CisgIH0KKworICBFeHBlY3RlZDxFbGZfU2hkcl9SYW5nZT4gc2VjdGlvbnMoKSBjb25zdDsKKworICBFeHBlY3RlZDxFbGZfU3ltX1JhbmdlPiBzeW1ib2xzKGNvbnN0IEVsZl9TaGRyICpTZWMpIGNvbnN0IHsKKyAgICBpZiAoIVNlYykKKyAgICAgIHJldHVybiBtYWtlQXJyYXlSZWY8RWxmX1N5bT4obnVsbHB0ciwgbnVsbHB0cik7CisgICAgcmV0dXJuIGdldFNlY3Rpb25Db250ZW50c0FzQXJyYXk8RWxmX1N5bT4oU2VjKTsKKyAgfQorCisgIEV4cGVjdGVkPEVsZl9SZWxhX1JhbmdlPiByZWxhcyhjb25zdCBFbGZfU2hkciAqU2VjKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFNlY3Rpb25Db250ZW50c0FzQXJyYXk8RWxmX1JlbGE+KFNlYyk7CisgIH0KKworICBFeHBlY3RlZDxFbGZfUmVsX1JhbmdlPiByZWxzKGNvbnN0IEVsZl9TaGRyICpTZWMpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U2VjdGlvbkNvbnRlbnRzQXNBcnJheTxFbGZfUmVsPihTZWMpOworICB9CisKKyAgRXhwZWN0ZWQ8c3RkOjp2ZWN0b3I8RWxmX1JlbGE+PiBhbmRyb2lkX3JlbGFzKGNvbnN0IEVsZl9TaGRyICpTZWMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgSXRlcmF0ZSBvdmVyIHByb2dyYW0gaGVhZGVyIHRhYmxlLgorICBFeHBlY3RlZDxFbGZfUGhkcl9SYW5nZT4gcHJvZ3JhbV9oZWFkZXJzKCkgY29uc3QgeworICAgIGlmIChnZXRIZWFkZXIoKS0+ZV9waG51bSAmJiBnZXRIZWFkZXIoKS0+ZV9waGVudHNpemUgIT0gc2l6ZW9mKEVsZl9QaGRyKSkKKyAgICAgIHJldHVybiBjcmVhdGVFcnJvcigiaW52YWxpZCBlX3BoZW50c2l6ZSIpOworICAgIGlmIChnZXRIZWFkZXIoKS0+ZV9waG9mZiArCisgICAgICAgICAgICAoZ2V0SGVhZGVyKCktPmVfcGhudW0gKiBnZXRIZWFkZXIoKS0+ZV9waGVudHNpemUpID4KKyAgICAgICAgZ2V0QnVmU2l6ZSgpKQorICAgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJwcm9ncmFtIGhlYWRlcnMgbG9uZ2VyIHRoYW4gYmluYXJ5Iik7CisgICAgYXV0byAqQmVnaW4gPQorICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IEVsZl9QaGRyICo+KGJhc2UoKSArIGdldEhlYWRlcigpLT5lX3Bob2ZmKTsKKyAgICByZXR1cm4gbWFrZUFycmF5UmVmKEJlZ2luLCBCZWdpbiArIGdldEhlYWRlcigpLT5lX3BobnVtKTsKKyAgfQorCisgIC8vLyBHZXQgYW4gaXRlcmF0b3Igb3ZlciBub3RlcyBpbiBhIHByb2dyYW0gaGVhZGVyLgorICAvLy8KKyAgLy8vIFRoZSBwcm9ncmFtIGhlYWRlciBtdXN0IGJlIG9mIHR5cGUgXGMgUFRfTk9URS4KKyAgLy8vCisgIC8vLyBccGFyYW0gUGhkciB0aGUgcHJvZ3JhbSBoZWFkZXIgdG8gaXRlcmF0ZSBvdmVyLgorICAvLy8gXHBhcmFtIEVyciBbb3V0XSBhbiBlcnJvciB0byBzdXBwb3J0IGZhbGxpYmxlIGl0ZXJhdGlvbiwgd2hpY2ggc2hvdWxkCisgIC8vLyAgYmUgY2hlY2tlZCBhZnRlciBpdGVyYXRpb24gZW5kcy4KKyAgRWxmX05vdGVfSXRlcmF0b3Igbm90ZXNfYmVnaW4oY29uc3QgRWxmX1BoZHIgJlBoZHIsIEVycm9yICZFcnIpIGNvbnN0IHsKKyAgICBpZiAoUGhkci5wX3R5cGUgIT0gRUxGOjpQVF9OT1RFKSB7CisgICAgICBFcnIgPSBjcmVhdGVFcnJvcigiYXR0ZW1wdCB0byBpdGVyYXRlIG5vdGVzIG9mIG5vbi1ub3RlIHByb2dyYW0gaGVhZGVyIik7CisgICAgICByZXR1cm4gRWxmX05vdGVfSXRlcmF0b3IoRXJyKTsKKyAgICB9CisgICAgaWYgKFBoZHIucF9vZmZzZXQgKyBQaGRyLnBfZmlsZXN6ID4gZ2V0QnVmU2l6ZSgpKSB7CisgICAgICBFcnIgPSBjcmVhdGVFcnJvcigiaW52YWxpZCBwcm9ncmFtIGhlYWRlciBvZmZzZXQvc2l6ZSIpOworICAgICAgcmV0dXJuIEVsZl9Ob3RlX0l0ZXJhdG9yKEVycik7CisgICAgfQorICAgIHJldHVybiBFbGZfTm90ZV9JdGVyYXRvcihiYXNlKCkgKyBQaGRyLnBfb2Zmc2V0LCBQaGRyLnBfZmlsZXN6LCBFcnIpOworICB9CisKKyAgLy8vIEdldCBhbiBpdGVyYXRvciBvdmVyIG5vdGVzIGluIGEgc2VjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGUgc2VjdGlvbiBtdXN0IGJlIG9mIHR5cGUgXGMgU0hUX05PVEUuCisgIC8vLworICAvLy8gXHBhcmFtIFNoZHIgdGhlIHNlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAvLy8gXHBhcmFtIEVyciBbb3V0XSBhbiBlcnJvciB0byBzdXBwb3J0IGZhbGxpYmxlIGl0ZXJhdGlvbiwgd2hpY2ggc2hvdWxkCisgIC8vLyAgYmUgY2hlY2tlZCBhZnRlciBpdGVyYXRpb24gZW5kcy4KKyAgRWxmX05vdGVfSXRlcmF0b3Igbm90ZXNfYmVnaW4oY29uc3QgRWxmX1NoZHIgJlNoZHIsIEVycm9yICZFcnIpIGNvbnN0IHsKKyAgICBpZiAoU2hkci5zaF90eXBlICE9IEVMRjo6U0hUX05PVEUpIHsKKyAgICAgIEVyciA9IGNyZWF0ZUVycm9yKCJhdHRlbXB0IHRvIGl0ZXJhdGUgbm90ZXMgb2Ygbm9uLW5vdGUgc2VjdGlvbiIpOworICAgICAgcmV0dXJuIEVsZl9Ob3RlX0l0ZXJhdG9yKEVycik7CisgICAgfQorICAgIGlmIChTaGRyLnNoX29mZnNldCArIFNoZHIuc2hfc2l6ZSA+IGdldEJ1ZlNpemUoKSkgeworICAgICAgRXJyID0gY3JlYXRlRXJyb3IoImludmFsaWQgc2VjdGlvbiBvZmZzZXQvc2l6ZSIpOworICAgICAgcmV0dXJuIEVsZl9Ob3RlX0l0ZXJhdG9yKEVycik7CisgICAgfQorICAgIHJldHVybiBFbGZfTm90ZV9JdGVyYXRvcihiYXNlKCkgKyBTaGRyLnNoX29mZnNldCwgU2hkci5zaF9zaXplLCBFcnIpOworICB9CisKKyAgLy8vIEdldCB0aGUgZW5kIGl0ZXJhdG9yIGZvciBub3Rlcy4KKyAgRWxmX05vdGVfSXRlcmF0b3Igbm90ZXNfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBFbGZfTm90ZV9JdGVyYXRvcigpOworICB9CisKKyAgLy8vIEdldCBhbiBpdGVyYXRvciByYW5nZSBvdmVyIG5vdGVzIG9mIGEgcHJvZ3JhbSBoZWFkZXIuCisgIC8vLworICAvLy8gVGhlIHByb2dyYW0gaGVhZGVyIG11c3QgYmUgb2YgdHlwZSBcYyBQVF9OT1RFLgorICAvLy8KKyAgLy8vIFxwYXJhbSBQaGRyIHRoZSBwcm9ncmFtIGhlYWRlciB0byBpdGVyYXRlIG92ZXIuCisgIC8vLyBccGFyYW0gRXJyIFtvdXRdIGFuIGVycm9yIHRvIHN1cHBvcnQgZmFsbGlibGUgaXRlcmF0aW9uLCB3aGljaCBzaG91bGQKKyAgLy8vICBiZSBjaGVja2VkIGFmdGVyIGl0ZXJhdGlvbiBlbmRzLgorICBpdGVyYXRvcl9yYW5nZTxFbGZfTm90ZV9JdGVyYXRvcj4gbm90ZXMoY29uc3QgRWxmX1BoZHIgJlBoZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAmRXJyKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2Uobm90ZXNfYmVnaW4oUGhkciwgRXJyKSwgbm90ZXNfZW5kKCkpOworICB9CisKKyAgLy8vIEdldCBhbiBpdGVyYXRvciByYW5nZSBvdmVyIG5vdGVzIG9mIGEgc2VjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGUgc2VjdGlvbiBtdXN0IGJlIG9mIHR5cGUgXGMgU0hUX05PVEUuCisgIC8vLworICAvLy8gXHBhcmFtIFNoZHIgdGhlIHNlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAvLy8gXHBhcmFtIEVyciBbb3V0XSBhbiBlcnJvciB0byBzdXBwb3J0IGZhbGxpYmxlIGl0ZXJhdGlvbiwgd2hpY2ggc2hvdWxkCisgIC8vLyAgYmUgY2hlY2tlZCBhZnRlciBpdGVyYXRpb24gZW5kcy4KKyAgaXRlcmF0b3JfcmFuZ2U8RWxmX05vdGVfSXRlcmF0b3I+IG5vdGVzKGNvbnN0IEVsZl9TaGRyICZTaGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgJkVycikgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKG5vdGVzX2JlZ2luKFNoZHIsIEVyciksIG5vdGVzX2VuZCgpKTsKKyAgfQorCisgIEV4cGVjdGVkPFN0cmluZ1JlZj4gZ2V0U2VjdGlvblN0cmluZ1RhYmxlKEVsZl9TaGRyX1JhbmdlIFNlY3Rpb25zKSBjb25zdDsKKyAgRXhwZWN0ZWQ8dWludDMyX3Q+IGdldFNlY3Rpb25JbmRleChjb25zdCBFbGZfU3ltICpTeW0sIEVsZl9TeW1fUmFuZ2UgU3ltcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFbGZfV29yZD4gU2huZHhUYWJsZSkgY29uc3Q7CisgIEV4cGVjdGVkPGNvbnN0IEVsZl9TaGRyICo+IGdldFNlY3Rpb24oY29uc3QgRWxmX1N5bSAqU3ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVsZl9TaGRyICpTeW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RWxmX1dvcmQ+IFNobmR4VGFibGUpIGNvbnN0OworICBFeHBlY3RlZDxjb25zdCBFbGZfU2hkciAqPiBnZXRTZWN0aW9uKGNvbnN0IEVsZl9TeW0gKlN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGZfU3ltX1JhbmdlIFN5bXRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFbGZfV29yZD4gU2huZHhUYWJsZSkgY29uc3Q7CisgIEV4cGVjdGVkPGNvbnN0IEVsZl9TaGRyICo+IGdldFNlY3Rpb24odWludDMyX3QgSW5kZXgpIGNvbnN0OworCisgIEV4cGVjdGVkPGNvbnN0IEVsZl9TeW0gKj4gZ2V0U3ltYm9sKGNvbnN0IEVsZl9TaGRyICpTZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEluZGV4KSBjb25zdDsKKworICBFeHBlY3RlZDxTdHJpbmdSZWY+IGdldFNlY3Rpb25OYW1lKGNvbnN0IEVsZl9TaGRyICpTZWN0aW9uKSBjb25zdDsKKyAgRXhwZWN0ZWQ8U3RyaW5nUmVmPiBnZXRTZWN0aW9uTmFtZShjb25zdCBFbGZfU2hkciAqU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRG90U2hzdHJ0YWIpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgRXhwZWN0ZWQ8QXJyYXlSZWY8VD4+IGdldFNlY3Rpb25Db250ZW50c0FzQXJyYXkoY29uc3QgRWxmX1NoZHIgKlNlYykgY29uc3Q7CisgIEV4cGVjdGVkPEFycmF5UmVmPHVpbnQ4X3Q+PiBnZXRTZWN0aW9uQ29udGVudHMoY29uc3QgRWxmX1NoZHIgKlNlYykgY29uc3Q7Cit9OworCit1c2luZyBFTEYzMkxFRmlsZSA9IEVMRkZpbGU8RUxGMzJMRT47Cit1c2luZyBFTEY2NExFRmlsZSA9IEVMRkZpbGU8RUxGNjRMRT47Cit1c2luZyBFTEYzMkJFRmlsZSA9IEVMRkZpbGU8RUxGMzJCRT47Cit1c2luZyBFTEY2NEJFRmlsZSA9IEVMRkZpbGU8RUxGNjRCRT47CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgoraW5saW5lIEV4cGVjdGVkPGNvbnN0IHR5cGVuYW1lIEVMRlQ6OlNoZHIgKj4KK2dldFNlY3Rpb24odHlwZW5hbWUgRUxGVDo6U2hkclJhbmdlIFNlY3Rpb25zLCB1aW50MzJfdCBJbmRleCkgeworICBpZiAoSW5kZXggPj0gU2VjdGlvbnMuc2l6ZSgpKQorICAgIHJldHVybiBjcmVhdGVFcnJvcigiaW52YWxpZCBzZWN0aW9uIGluZGV4Iik7CisgIHJldHVybiAmU2VjdGlvbnNbSW5kZXhdOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK2lubGluZSBFeHBlY3RlZDx1aW50MzJfdD4KK2dldEV4dGVuZGVkU3ltYm9sVGFibGVJbmRleChjb25zdCB0eXBlbmFtZSBFTEZUOjpTeW0gKlN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBFTEZUOjpTeW0gKkZpcnN0U3ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHR5cGVuYW1lIEVMRlQ6OldvcmQ+IFNobmR4VGFibGUpIHsKKyAgYXNzZXJ0KFN5bS0+c3Rfc2huZHggPT0gRUxGOjpTSE5fWElOREVYKTsKKyAgdW5zaWduZWQgSW5kZXggPSBTeW0gLSBGaXJzdFN5bTsKKyAgaWYgKEluZGV4ID49IFNobmR4VGFibGUuc2l6ZSgpKQorICAgIHJldHVybiBjcmVhdGVFcnJvcigiaW5kZXggcGFzdCB0aGUgZW5kIG9mIHRoZSBzeW1ib2wgdGFibGUiKTsKKworICAvLyBUaGUgc2l6ZSBvZiB0aGUgdGFibGUgd2FzIGNoZWNrZWQgaW4gZ2V0U0hORFhUYWJsZS4KKyAgcmV0dXJuIFNobmR4VGFibGVbSW5kZXhdOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0V4cGVjdGVkPHVpbnQzMl90PgorRUxGRmlsZTxFTEZUPjo6Z2V0U2VjdGlvbkluZGV4KGNvbnN0IEVsZl9TeW0gKlN5bSwgRWxmX1N5bV9SYW5nZSBTeW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEVsZl9Xb3JkPiBTaG5keFRhYmxlKSBjb25zdCB7CisgIHVpbnQzMl90IEluZGV4ID0gU3ltLT5zdF9zaG5keDsKKyAgaWYgKEluZGV4ID09IEVMRjo6U0hOX1hJTkRFWCkgeworICAgIGF1dG8gRXJyb3JPckluZGV4ID0gZ2V0RXh0ZW5kZWRTeW1ib2xUYWJsZUluZGV4PEVMRlQ+KAorICAgICAgICBTeW0sIFN5bXMuYmVnaW4oKSwgU2huZHhUYWJsZSk7CisgICAgaWYgKCFFcnJvck9ySW5kZXgpCisgICAgICByZXR1cm4gRXJyb3JPckluZGV4LnRha2VFcnJvcigpOworICAgIHJldHVybiAqRXJyb3JPckluZGV4OworICB9CisgIGlmIChJbmRleCA9PSBFTEY6OlNITl9VTkRFRiB8fCBJbmRleCA+PSBFTEY6OlNITl9MT1JFU0VSVkUpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBJbmRleDsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFeHBlY3RlZDxjb25zdCB0eXBlbmFtZSBFTEZUOjpTaGRyICo+CitFTEZGaWxlPEVMRlQ+OjpnZXRTZWN0aW9uKGNvbnN0IEVsZl9TeW0gKlN5bSwgY29uc3QgRWxmX1NoZHIgKlN5bVRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RWxmX1dvcmQ+IFNobmR4VGFibGUpIGNvbnN0IHsKKyAgYXV0byBTeW1zT3JFcnIgPSBzeW1ib2xzKFN5bVRhYik7CisgIGlmICghU3ltc09yRXJyKQorICAgIHJldHVybiBTeW1zT3JFcnIudGFrZUVycm9yKCk7CisgIHJldHVybiBnZXRTZWN0aW9uKFN5bSwgKlN5bXNPckVyciwgU2huZHhUYWJsZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRXhwZWN0ZWQ8Y29uc3QgdHlwZW5hbWUgRUxGVDo6U2hkciAqPgorRUxGRmlsZTxFTEZUPjo6Z2V0U2VjdGlvbihjb25zdCBFbGZfU3ltICpTeW0sIEVsZl9TeW1fUmFuZ2UgU3ltYm9scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RWxmX1dvcmQ+IFNobmR4VGFibGUpIGNvbnN0IHsKKyAgYXV0byBJbmRleE9yRXJyID0gZ2V0U2VjdGlvbkluZGV4KFN5bSwgU3ltYm9scywgU2huZHhUYWJsZSk7CisgIGlmICghSW5kZXhPckVycikKKyAgICByZXR1cm4gSW5kZXhPckVyci50YWtlRXJyb3IoKTsKKyAgdWludDMyX3QgSW5kZXggPSAqSW5kZXhPckVycjsKKyAgaWYgKEluZGV4ID09IDApCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBnZXRTZWN0aW9uKEluZGV4KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitpbmxpbmUgRXhwZWN0ZWQ8Y29uc3QgdHlwZW5hbWUgRUxGVDo6U3ltICo+CitnZXRTeW1ib2wodHlwZW5hbWUgRUxGVDo6U3ltUmFuZ2UgU3ltYm9scywgdWludDMyX3QgSW5kZXgpIHsKKyAgaWYgKEluZGV4ID49IFN5bWJvbHMuc2l6ZSgpKQorICAgIHJldHVybiBjcmVhdGVFcnJvcigiaW52YWxpZCBzeW1ib2wgaW5kZXgiKTsKKyAgcmV0dXJuICZTeW1ib2xzW0luZGV4XTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFeHBlY3RlZDxjb25zdCB0eXBlbmFtZSBFTEZUOjpTeW0gKj4KK0VMRkZpbGU8RUxGVD46OmdldFN5bWJvbChjb25zdCBFbGZfU2hkciAqU2VjLCB1aW50MzJfdCBJbmRleCkgY29uc3QgeworICBhdXRvIFN5bXRhYk9yRXJyID0gc3ltYm9scyhTZWMpOworICBpZiAoIVN5bXRhYk9yRXJyKQorICAgIHJldHVybiBTeW10YWJPckVyci50YWtlRXJyb3IoKTsKKyAgcmV0dXJuIG9iamVjdDo6Z2V0U3ltYm9sPEVMRlQ+KCpTeW10YWJPckVyciwgSW5kZXgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorRXhwZWN0ZWQ8QXJyYXlSZWY8VD4+CitFTEZGaWxlPEVMRlQ+OjpnZXRTZWN0aW9uQ29udGVudHNBc0FycmF5KGNvbnN0IEVsZl9TaGRyICpTZWMpIGNvbnN0IHsKKyAgaWYgKFNlYy0+c2hfZW50c2l6ZSAhPSBzaXplb2YoVCkgJiYgc2l6ZW9mKFQpICE9IDEpCisgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJpbnZhbGlkIHNoX2VudHNpemUiKTsKKworICB1aW50WF90IE9mZnNldCA9IFNlYy0+c2hfb2Zmc2V0OworICB1aW50WF90IFNpemUgPSBTZWMtPnNoX3NpemU7CisKKyAgaWYgKFNpemUgJSBzaXplb2YoVCkpCisgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIHNoX2VudHNpemUiKTsKKyAgaWYgKChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnRYX3Q+OjptYXgoKSAtIE9mZnNldCA8IFNpemUpIHx8CisgICAgICBPZmZzZXQgKyBTaXplID4gQnVmLnNpemUoKSkKKyAgICByZXR1cm4gY3JlYXRlRXJyb3IoImludmFsaWQgc2VjdGlvbiBvZmZzZXQiKTsKKworICBpZiAoT2Zmc2V0ICUgYWxpZ25vZihUKSkKKyAgICByZXR1cm4gY3JlYXRlRXJyb3IoInVuYWxpZ25lZCBkYXRhIik7CisKKyAgY29uc3QgVCAqU3RhcnQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4oYmFzZSgpICsgT2Zmc2V0KTsKKyAgcmV0dXJuIG1ha2VBcnJheVJlZihTdGFydCwgU2l6ZSAvIHNpemVvZihUKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRXhwZWN0ZWQ8QXJyYXlSZWY8dWludDhfdD4+CitFTEZGaWxlPEVMRlQ+OjpnZXRTZWN0aW9uQ29udGVudHMoY29uc3QgRWxmX1NoZHIgKlNlYykgY29uc3QgeworICByZXR1cm4gZ2V0U2VjdGlvbkNvbnRlbnRzQXNBcnJheTx1aW50OF90PihTZWMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK1N0cmluZ1JlZiBFTEZGaWxlPEVMRlQ+OjpnZXRSZWxvY2F0aW9uVHlwZU5hbWUodWludDMyX3QgVHlwZSkgY29uc3QgeworICByZXR1cm4gZ2V0RUxGUmVsb2NhdGlvblR5cGVOYW1lKGdldEhlYWRlcigpLT5lX21hY2hpbmUsIFR5cGUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3ZvaWQgRUxGRmlsZTxFTEZUPjo6Z2V0UmVsb2NhdGlvblR5cGVOYW1lKHVpbnQzMl90IFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlJlc3VsdCkgY29uc3QgeworICBpZiAoIWlzTWlwc0VMRjY0KCkpIHsKKyAgICBTdHJpbmdSZWYgTmFtZSA9IGdldFJlbG9jYXRpb25UeXBlTmFtZShUeXBlKTsKKyAgICBSZXN1bHQuYXBwZW5kKE5hbWUuYmVnaW4oKSwgTmFtZS5lbmQoKSk7CisgIH0gZWxzZSB7CisgICAgLy8gVGhlIE1pcHMgTjY0IEFCSSBhbGxvd3MgdXAgdG8gdGhyZWUgb3BlcmF0aW9ucyB0byBiZSBzcGVjaWZpZWQgcGVyCisgICAgLy8gcmVsb2NhdGlvbiByZWNvcmQuIFVuZm9ydHVuYXRlbHkgdGhlcmUncyBubyBlYXN5IHdheSB0byB0ZXN0IGZvciB0aGUKKyAgICAvLyBwcmVzZW5jZSBvZiBONjQgRUxGcyBhcyB0aGV5IGhhdmUgbm8gc3BlY2lhbCBmbGFnIHRoYXQgaWRlbnRpZmllcyB0aGVtCisgICAgLy8gYXMgYmVpbmcgTjY0LiBXZSBjYW4gc2FmZWx5IGFzc3VtZSBhdCB0aGUgbW9tZW50IHRoYXQgYWxsIE1pcHMKKyAgICAvLyBFTEZDTEFTUzY0IEVMRnMgYXJlIE42NC4gTmV3IE1pcHM2NCBBQklzIHNob3VsZCBwcm92aWRlIGVub3VnaAorICAgIC8vIGluZm9ybWF0aW9uIHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuIG9sZCB2cyBuZXcgQUJJcy4KKyAgICB1aW50OF90IFR5cGUxID0gKFR5cGUgPj4gMCkgJiAweEZGOworICAgIHVpbnQ4X3QgVHlwZTIgPSAoVHlwZSA+PiA4KSAmIDB4RkY7CisgICAgdWludDhfdCBUeXBlMyA9IChUeXBlID4+IDE2KSAmIDB4RkY7CisKKyAgICAvLyBDb25jYXQgYWxsIHRocmVlIHJlbG9jYXRpb24gdHlwZSBuYW1lcy4KKyAgICBTdHJpbmdSZWYgTmFtZSA9IGdldFJlbG9jYXRpb25UeXBlTmFtZShUeXBlMSk7CisgICAgUmVzdWx0LmFwcGVuZChOYW1lLmJlZ2luKCksIE5hbWUuZW5kKCkpOworCisgICAgTmFtZSA9IGdldFJlbG9jYXRpb25UeXBlTmFtZShUeXBlMik7CisgICAgUmVzdWx0LmFwcGVuZCgxLCAnLycpOworICAgIFJlc3VsdC5hcHBlbmQoTmFtZS5iZWdpbigpLCBOYW1lLmVuZCgpKTsKKworICAgIE5hbWUgPSBnZXRSZWxvY2F0aW9uVHlwZU5hbWUoVHlwZTMpOworICAgIFJlc3VsdC5hcHBlbmQoMSwgJy8nKTsKKyAgICBSZXN1bHQuYXBwZW5kKE5hbWUuYmVnaW4oKSwgTmFtZS5lbmQoKSk7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFeHBlY3RlZDxjb25zdCB0eXBlbmFtZSBFTEZUOjpTeW0gKj4KK0VMRkZpbGU8RUxGVD46OmdldFJlbG9jYXRpb25TeW1ib2woY29uc3QgRWxmX1JlbCAqUmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbGZfU2hkciAqU3ltVGFiKSBjb25zdCB7CisgIHVpbnQzMl90IEluZGV4ID0gUmVsLT5nZXRTeW1ib2woaXNNaXBzNjRFTCgpKTsKKyAgaWYgKEluZGV4ID09IDApCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBnZXRFbnRyeTxFbGZfU3ltPihTeW1UYWIsIEluZGV4KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFeHBlY3RlZDxTdHJpbmdSZWY+CitFTEZGaWxlPEVMRlQ+OjpnZXRTZWN0aW9uU3RyaW5nVGFibGUoRWxmX1NoZHJfUmFuZ2UgU2VjdGlvbnMpIGNvbnN0IHsKKyAgdWludDMyX3QgSW5kZXggPSBnZXRIZWFkZXIoKS0+ZV9zaHN0cm5keDsKKyAgaWYgKEluZGV4ID09IEVMRjo6U0hOX1hJTkRFWCkKKyAgICBJbmRleCA9IFNlY3Rpb25zWzBdLnNoX2xpbms7CisKKyAgaWYgKCFJbmRleCkgLy8gbm8gc2VjdGlvbiBzdHJpbmcgdGFibGUuCisgICAgcmV0dXJuICIiOworICBpZiAoSW5kZXggPj0gU2VjdGlvbnMuc2l6ZSgpKQorICAgIHJldHVybiBjcmVhdGVFcnJvcigiaW52YWxpZCBzZWN0aW9uIGluZGV4Iik7CisgIHJldHVybiBnZXRTdHJpbmdUYWJsZSgmU2VjdGlvbnNbSW5kZXhdKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+IEVMRkZpbGU8RUxGVD46OkVMRkZpbGUoU3RyaW5nUmVmIE9iamVjdCkgOiBCdWYoT2JqZWN0KSB7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0V4cGVjdGVkPEVMRkZpbGU8RUxGVD4+IEVMRkZpbGU8RUxGVD46OmNyZWF0ZShTdHJpbmdSZWYgT2JqZWN0KSB7CisgIGlmIChzaXplb2YoRWxmX0VoZHIpID4gT2JqZWN0LnNpemUoKSkKKyAgICByZXR1cm4gY3JlYXRlRXJyb3IoIkludmFsaWQgYnVmZmVyIik7CisgIHJldHVybiBFTEZGaWxlKE9iamVjdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRXhwZWN0ZWQ8dHlwZW5hbWUgRUxGVDo6U2hkclJhbmdlPiBFTEZGaWxlPEVMRlQ+OjpzZWN0aW9ucygpIGNvbnN0IHsKKyAgY29uc3QgdWludFhfdCBTZWN0aW9uVGFibGVPZmZzZXQgPSBnZXRIZWFkZXIoKS0+ZV9zaG9mZjsKKyAgaWYgKFNlY3Rpb25UYWJsZU9mZnNldCA9PSAwKQorICAgIHJldHVybiBBcnJheVJlZjxFbGZfU2hkcj4oKTsKKworICBpZiAoZ2V0SGVhZGVyKCktPmVfc2hlbnRzaXplICE9IHNpemVvZihFbGZfU2hkcikpCisgICAgcmV0dXJuIGNyZWF0ZUVycm9yKAorICAgICAgICAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciBlbnRyeSBzaXplIChlX3NoZW50c2l6ZSkgaW4gRUxGIGhlYWRlciIpOworCisgIGNvbnN0IHVpbnQ2NF90IEZpbGVTaXplID0gQnVmLnNpemUoKTsKKworICBpZiAoU2VjdGlvblRhYmxlT2Zmc2V0ICsgc2l6ZW9mKEVsZl9TaGRyKSA+IEZpbGVTaXplKQorICAgIHJldHVybiBjcmVhdGVFcnJvcigic2VjdGlvbiBoZWFkZXIgdGFibGUgZ29lcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUiKTsKKworICAvLyBJbnZhbGlkIGFkZHJlc3MgYWxpZ25tZW50IG9mIHNlY3Rpb24gaGVhZGVycworICBpZiAoU2VjdGlvblRhYmxlT2Zmc2V0ICYgKGFsaWdub2YoRWxmX1NoZHIpIC0gMSkpCisgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJpbnZhbGlkIGFsaWdubWVudCBvZiBzZWN0aW9uIGhlYWRlcnMiKTsKKworICBjb25zdCBFbGZfU2hkciAqRmlyc3QgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbGZfU2hkciAqPihiYXNlKCkgKyBTZWN0aW9uVGFibGVPZmZzZXQpOworCisgIHVpbnRYX3QgTnVtU2VjdGlvbnMgPSBnZXRIZWFkZXIoKS0+ZV9zaG51bTsKKyAgaWYgKE51bVNlY3Rpb25zID09IDApCisgICAgTnVtU2VjdGlvbnMgPSBGaXJzdC0+c2hfc2l6ZTsKKworICBpZiAoTnVtU2VjdGlvbnMgPiBVSU5UNjRfTUFYIC8gc2l6ZW9mKEVsZl9TaGRyKSkKKyAgICByZXR1cm4gY3JlYXRlRXJyb3IoInNlY3Rpb24gdGFibGUgZ29lcyBwYXN0IHRoZSBlbmQgb2YgZmlsZSIpOworCisgIGNvbnN0IHVpbnQ2NF90IFNlY3Rpb25UYWJsZVNpemUgPSBOdW1TZWN0aW9ucyAqIHNpemVvZihFbGZfU2hkcik7CisKKyAgLy8gU2VjdGlvbiB0YWJsZSBnb2VzIHBhc3QgZW5kIG9mIGZpbGUhCisgIGlmIChTZWN0aW9uVGFibGVPZmZzZXQgKyBTZWN0aW9uVGFibGVTaXplID4gRmlsZVNpemUpCisgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJzZWN0aW9uIHRhYmxlIGdvZXMgcGFzdCB0aGUgZW5kIG9mIGZpbGUiKTsKKworICByZXR1cm4gbWFrZUFycmF5UmVmKEZpcnN0LCBOdW1TZWN0aW9ucyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitFeHBlY3RlZDxjb25zdCBUICo+IEVMRkZpbGU8RUxGVD46OmdldEVudHJ5KHVpbnQzMl90IFNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEVudHJ5KSBjb25zdCB7CisgIGF1dG8gU2VjT3JFcnIgPSBnZXRTZWN0aW9uKFNlY3Rpb24pOworICBpZiAoIVNlY09yRXJyKQorICAgIHJldHVybiBTZWNPckVyci50YWtlRXJyb3IoKTsKKyAgcmV0dXJuIGdldEVudHJ5PFQ+KCpTZWNPckVyciwgRW50cnkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorRXhwZWN0ZWQ8Y29uc3QgVCAqPiBFTEZGaWxlPEVMRlQ+OjpnZXRFbnRyeShjb25zdCBFbGZfU2hkciAqU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRW50cnkpIGNvbnN0IHsKKyAgaWYgKHNpemVvZihUKSAhPSBTZWN0aW9uLT5zaF9lbnRzaXplKQorICAgIHJldHVybiBjcmVhdGVFcnJvcigiaW52YWxpZCBzaF9lbnRzaXplIik7CisgIHNpemVfdCBQb3MgPSBTZWN0aW9uLT5zaF9vZmZzZXQgKyBFbnRyeSAqIHNpemVvZihUKTsKKyAgaWYgKFBvcyArIHNpemVvZihUKSA+IEJ1Zi5zaXplKCkpCisgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJpbnZhbGlkIHNlY3Rpb24gb2Zmc2V0Iik7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4oYmFzZSgpICsgUG9zKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFeHBlY3RlZDxjb25zdCB0eXBlbmFtZSBFTEZUOjpTaGRyICo+CitFTEZGaWxlPEVMRlQ+OjpnZXRTZWN0aW9uKHVpbnQzMl90IEluZGV4KSBjb25zdCB7CisgIGF1dG8gVGFibGVPckVyciA9IHNlY3Rpb25zKCk7CisgIGlmICghVGFibGVPckVycikKKyAgICByZXR1cm4gVGFibGVPckVyci50YWtlRXJyb3IoKTsKKyAgcmV0dXJuIG9iamVjdDo6Z2V0U2VjdGlvbjxFTEZUPigqVGFibGVPckVyciwgSW5kZXgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0V4cGVjdGVkPFN0cmluZ1JlZj4KK0VMRkZpbGU8RUxGVD46OmdldFN0cmluZ1RhYmxlKGNvbnN0IEVsZl9TaGRyICpTZWN0aW9uKSBjb25zdCB7CisgIGlmIChTZWN0aW9uLT5zaF90eXBlICE9IEVMRjo6U0hUX1NUUlRBQikKKyAgICByZXR1cm4gY3JlYXRlRXJyb3IoImludmFsaWQgc2hfdHlwZSBmb3Igc3RyaW5nIHRhYmxlLCBleHBlY3RlZCBTSFRfU1RSVEFCIik7CisgIGF1dG8gViA9IGdldFNlY3Rpb25Db250ZW50c0FzQXJyYXk8Y2hhcj4oU2VjdGlvbik7CisgIGlmICghVikKKyAgICByZXR1cm4gVi50YWtlRXJyb3IoKTsKKyAgQXJyYXlSZWY8Y2hhcj4gRGF0YSA9ICpWOworICBpZiAoRGF0YS5lbXB0eSgpKQorICAgIHJldHVybiBjcmVhdGVFcnJvcigiZW1wdHkgc3RyaW5nIHRhYmxlIik7CisgIGlmIChEYXRhLmJhY2soKSAhPSAnXDAnKQorICAgIHJldHVybiBjcmVhdGVFcnJvcigic3RyaW5nIHRhYmxlIG5vbi1udWxsIHRlcm1pbmF0ZWQiKTsKKyAgcmV0dXJuIFN0cmluZ1JlZihEYXRhLmJlZ2luKCksIERhdGEuc2l6ZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFeHBlY3RlZDxBcnJheVJlZjx0eXBlbmFtZSBFTEZUOjpXb3JkPj4KK0VMRkZpbGU8RUxGVD46OmdldFNITkRYVGFibGUoY29uc3QgRWxmX1NoZHIgJlNlY3Rpb24pIGNvbnN0IHsKKyAgYXV0byBTZWN0aW9uc09yRXJyID0gc2VjdGlvbnMoKTsKKyAgaWYgKCFTZWN0aW9uc09yRXJyKQorICAgIHJldHVybiBTZWN0aW9uc09yRXJyLnRha2VFcnJvcigpOworICByZXR1cm4gZ2V0U0hORFhUYWJsZShTZWN0aW9uLCAqU2VjdGlvbnNPckVycik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRXhwZWN0ZWQ8QXJyYXlSZWY8dHlwZW5hbWUgRUxGVDo6V29yZD4+CitFTEZGaWxlPEVMRlQ+OjpnZXRTSE5EWFRhYmxlKGNvbnN0IEVsZl9TaGRyICZTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGZfU2hkcl9SYW5nZSBTZWN0aW9ucykgY29uc3QgeworICBhc3NlcnQoU2VjdGlvbi5zaF90eXBlID09IEVMRjo6U0hUX1NZTVRBQl9TSE5EWCk7CisgIGF1dG8gVk9yRXJyID0gZ2V0U2VjdGlvbkNvbnRlbnRzQXNBcnJheTxFbGZfV29yZD4oJlNlY3Rpb24pOworICBpZiAoIVZPckVycikKKyAgICByZXR1cm4gVk9yRXJyLnRha2VFcnJvcigpOworICBBcnJheVJlZjxFbGZfV29yZD4gViA9ICpWT3JFcnI7CisgIGF1dG8gU3ltVGFibGVPckVyciA9IG9iamVjdDo6Z2V0U2VjdGlvbjxFTEZUPihTZWN0aW9ucywgU2VjdGlvbi5zaF9saW5rKTsKKyAgaWYgKCFTeW1UYWJsZU9yRXJyKQorICAgIHJldHVybiBTeW1UYWJsZU9yRXJyLnRha2VFcnJvcigpOworICBjb25zdCBFbGZfU2hkciAmU3ltVGFibGUgPSAqKlN5bVRhYmxlT3JFcnI7CisgIGlmIChTeW1UYWJsZS5zaF90eXBlICE9IEVMRjo6U0hUX1NZTVRBQiAmJgorICAgICAgU3ltVGFibGUuc2hfdHlwZSAhPSBFTEY6OlNIVF9EWU5TWU0pCisgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJpbnZhbGlkIHNoX3R5cGUiKTsKKyAgaWYgKFYuc2l6ZSgpICE9IChTeW1UYWJsZS5zaF9zaXplIC8gc2l6ZW9mKEVsZl9TeW0pKSkKKyAgICByZXR1cm4gY3JlYXRlRXJyb3IoImludmFsaWQgc2VjdGlvbiBjb250ZW50cyBzaXplIik7CisgIHJldHVybiBWOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0V4cGVjdGVkPFN0cmluZ1JlZj4KK0VMRkZpbGU8RUxGVD46OmdldFN0cmluZ1RhYmxlRm9yU3ltdGFiKGNvbnN0IEVsZl9TaGRyICZTZWMpIGNvbnN0IHsKKyAgYXV0byBTZWN0aW9uc09yRXJyID0gc2VjdGlvbnMoKTsKKyAgaWYgKCFTZWN0aW9uc09yRXJyKQorICAgIHJldHVybiBTZWN0aW9uc09yRXJyLnRha2VFcnJvcigpOworICByZXR1cm4gZ2V0U3RyaW5nVGFibGVGb3JTeW10YWIoU2VjLCAqU2VjdGlvbnNPckVycik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRXhwZWN0ZWQ8U3RyaW5nUmVmPgorRUxGRmlsZTxFTEZUPjo6Z2V0U3RyaW5nVGFibGVGb3JTeW10YWIoY29uc3QgRWxmX1NoZHIgJlNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZl9TaGRyX1JhbmdlIFNlY3Rpb25zKSBjb25zdCB7CisKKyAgaWYgKFNlYy5zaF90eXBlICE9IEVMRjo6U0hUX1NZTVRBQiAmJiBTZWMuc2hfdHlwZSAhPSBFTEY6OlNIVF9EWU5TWU0pCisgICAgcmV0dXJuIGNyZWF0ZUVycm9yKAorICAgICAgICAiaW52YWxpZCBzaF90eXBlIGZvciBzeW1ib2wgdGFibGUsIGV4cGVjdGVkIFNIVF9TWU1UQUIgb3IgU0hUX0RZTlNZTSIpOworICBhdXRvIFNlY3Rpb25PckVyciA9IG9iamVjdDo6Z2V0U2VjdGlvbjxFTEZUPihTZWN0aW9ucywgU2VjLnNoX2xpbmspOworICBpZiAoIVNlY3Rpb25PckVycikKKyAgICByZXR1cm4gU2VjdGlvbk9yRXJyLnRha2VFcnJvcigpOworICByZXR1cm4gZ2V0U3RyaW5nVGFibGUoKlNlY3Rpb25PckVycik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRXhwZWN0ZWQ8U3RyaW5nUmVmPgorRUxGRmlsZTxFTEZUPjo6Z2V0U2VjdGlvbk5hbWUoY29uc3QgRWxmX1NoZHIgKlNlY3Rpb24pIGNvbnN0IHsKKyAgYXV0byBTZWN0aW9uc09yRXJyID0gc2VjdGlvbnMoKTsKKyAgaWYgKCFTZWN0aW9uc09yRXJyKQorICAgIHJldHVybiBTZWN0aW9uc09yRXJyLnRha2VFcnJvcigpOworICBhdXRvIFRhYmxlID0gZ2V0U2VjdGlvblN0cmluZ1RhYmxlKCpTZWN0aW9uc09yRXJyKTsKKyAgaWYgKCFUYWJsZSkKKyAgICByZXR1cm4gVGFibGUudGFrZUVycm9yKCk7CisgIHJldHVybiBnZXRTZWN0aW9uTmFtZShTZWN0aW9uLCAqVGFibGUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0V4cGVjdGVkPFN0cmluZ1JlZj4gRUxGRmlsZTxFTEZUPjo6Z2V0U2VjdGlvbk5hbWUoY29uc3QgRWxmX1NoZHIgKlNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEb3RTaHN0cnRhYikgY29uc3QgeworICB1aW50MzJfdCBPZmZzZXQgPSBTZWN0aW9uLT5zaF9uYW1lOworICBpZiAoT2Zmc2V0ID09IDApCisgICAgcmV0dXJuIFN0cmluZ1JlZigpOworICBpZiAoT2Zmc2V0ID49IERvdFNoc3RydGFiLnNpemUoKSkKKyAgICByZXR1cm4gY3JlYXRlRXJyb3IoImludmFsaWQgc3RyaW5nIG9mZnNldCIpOworICByZXR1cm4gU3RyaW5nUmVmKERvdFNoc3RydGFiLmRhdGEoKSArIE9mZnNldCk7Cit9CisKKy8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGhhc2ggdmFsdWUgZm9yIGEgc3ltYm9sIGluIHRoZSAuZHluc3ltIHNlY3Rpb24KKy8vLyBOYW1lIG9mIHRoZSBBUEkgcmVtYWlucyBjb25zaXN0ZW50IGFzIHNwZWNpZmllZCBpbiB0aGUgbGliZWxmCisvLy8gUkVGIDogaHR0cDovL3d3dy5zY28uY29tL2RldmVsb3BlcnMvZ2FiaS9sYXRlc3QvY2g1LmR5bmFtaWMuaHRtbCNoYXNoCitpbmxpbmUgdW5zaWduZWQgaGFzaFN5c1YoU3RyaW5nUmVmIFN5bWJvbE5hbWUpIHsKKyAgdW5zaWduZWQgaCA9IDAsIGc7CisgIGZvciAoY2hhciBDIDogU3ltYm9sTmFtZSkgeworICAgIGggPSAoaCA8PCA0KSArIEM7CisgICAgZyA9IGggJiAweGYwMDAwMDAwTDsKKyAgICBpZiAoZyAhPSAwKQorICAgICAgaCBePSBnID4+IDI0OworICAgIGggJj0gfmc7CisgIH0KKyAgcmV0dXJuIGg7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvYmplY3QKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX09CSkVDVF9FTEZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvRUxGT2JqZWN0RmlsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvRUxGT2JqZWN0RmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMDAxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9FTEZPYmplY3RGaWxlLmgKQEAgLTAsMCArMSwxMTIyIEBACisvLz09PS0gRUxGT2JqZWN0RmlsZS5oIC0gRUxGIG9iamVjdCBmaWxlIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgRUxGT2JqZWN0RmlsZSB0ZW1wbGF0ZSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUX0VMRk9CSkVDVEZJTEVfSAorI2RlZmluZSBMTFZNX09CSkVDVF9FTEZPQkpFQ1RGSUxFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0VMRi5oIgorI2luY2x1ZGUgImxsdm0vTUMvU3VidGFyZ2V0RmVhdHVyZS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0JpbmFyeS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0VMRi5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0VMRlR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9PYmplY3RGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvU3ltYm9saWNGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FSTUF0dHJpYnV0ZVBhcnNlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BUk1CdWlsZEF0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb2JqZWN0IHsKKworY2xhc3MgZWxmX3N5bWJvbF9pdGVyYXRvcjsKKworY2xhc3MgRUxGT2JqZWN0RmlsZUJhc2UgOiBwdWJsaWMgT2JqZWN0RmlsZSB7CisgIGZyaWVuZCBjbGFzcyBFTEZSZWxvY2F0aW9uUmVmOworICBmcmllbmQgY2xhc3MgRUxGU2VjdGlvblJlZjsKKyAgZnJpZW5kIGNsYXNzIEVMRlN5bWJvbFJlZjsKKworcHJvdGVjdGVkOgorICBFTEZPYmplY3RGaWxlQmFzZSh1bnNpZ25lZCBpbnQgVHlwZSwgTWVtb3J5QnVmZmVyUmVmIFNvdXJjZSk7CisKKyAgdmlydHVhbCB1aW50MTZfdCBnZXRFTWFjaGluZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50NjRfdCBnZXRTeW1ib2xTaXplKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50OF90IGdldFN5bWJvbE90aGVyKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50OF90IGdldFN5bWJvbEVMRlR5cGUoRGF0YVJlZkltcGwgU3ltYikgY29uc3QgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgZ2V0U2VjdGlvblR5cGUoRGF0YVJlZkltcGwgU2VjKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDY0X3QgZ2V0U2VjdGlvbkZsYWdzKERhdGFSZWZJbXBsIFNlYykgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ2NF90IGdldFNlY3Rpb25PZmZzZXQoRGF0YVJlZkltcGwgU2VjKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBFeHBlY3RlZDxpbnQ2NF90PiBnZXRSZWxvY2F0aW9uQWRkZW5kKERhdGFSZWZJbXBsIFJlbCkgY29uc3QgPSAwOworCitwdWJsaWM6CisgIHVzaW5nIGVsZl9zeW1ib2xfaXRlcmF0b3JfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxlbGZfc3ltYm9sX2l0ZXJhdG9yPjsKKworICB2aXJ0dWFsIGVsZl9zeW1ib2xfaXRlcmF0b3JfcmFuZ2UgZ2V0RHluYW1pY1N5bWJvbEl0ZXJhdG9ycygpIGNvbnN0ID0gMDsKKworICAvLy8gUmV0dXJucyBwbGF0Zm9ybS1zcGVjaWZpYyBvYmplY3QgZmxhZ3MsIGlmIGFueS4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRQbGF0Zm9ybUZsYWdzKCkgY29uc3QgPSAwOworCisgIGVsZl9zeW1ib2xfaXRlcmF0b3JfcmFuZ2Ugc3ltYm9scygpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQmluYXJ5ICp2KSB7IHJldHVybiB2LT5pc0VMRigpOyB9CisKKyAgU3VidGFyZ2V0RmVhdHVyZXMgZ2V0RmVhdHVyZXMoKSBjb25zdCBvdmVycmlkZTsKKworICBTdWJ0YXJnZXRGZWF0dXJlcyBnZXRNSVBTRmVhdHVyZXMoKSBjb25zdDsKKworICBTdWJ0YXJnZXRGZWF0dXJlcyBnZXRBUk1GZWF0dXJlcygpIGNvbnN0OworCisgIFN1YnRhcmdldEZlYXR1cmVzIGdldFJJU0NWRmVhdHVyZXMoKSBjb25zdDsKKworICB2b2lkIHNldEFSTVN1YkFyY2goVHJpcGxlICZUaGVUcmlwbGUpIGNvbnN0IG92ZXJyaWRlOworfTsKKworY2xhc3MgRUxGU2VjdGlvblJlZiA6IHB1YmxpYyBTZWN0aW9uUmVmIHsKK3B1YmxpYzoKKyAgRUxGU2VjdGlvblJlZihjb25zdCBTZWN0aW9uUmVmICZCKSA6IFNlY3Rpb25SZWYoQikgeworICAgIGFzc2VydChpc2E8RUxGT2JqZWN0RmlsZUJhc2U+KFNlY3Rpb25SZWY6OmdldE9iamVjdCgpKSk7CisgIH0KKworICBjb25zdCBFTEZPYmplY3RGaWxlQmFzZSAqZ2V0T2JqZWN0KCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PEVMRk9iamVjdEZpbGVCYXNlPihTZWN0aW9uUmVmOjpnZXRPYmplY3QoKSk7CisgIH0KKworICB1aW50MzJfdCBnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPYmplY3QoKS0+Z2V0U2VjdGlvblR5cGUoZ2V0UmF3RGF0YVJlZkltcGwoKSk7CisgIH0KKworICB1aW50NjRfdCBnZXRGbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T2JqZWN0KCktPmdldFNlY3Rpb25GbGFncyhnZXRSYXdEYXRhUmVmSW1wbCgpKTsKKyAgfQorCisgIHVpbnQ2NF90IGdldE9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T2JqZWN0KCktPmdldFNlY3Rpb25PZmZzZXQoZ2V0UmF3RGF0YVJlZkltcGwoKSk7CisgIH0KK307CisKK2NsYXNzIGVsZl9zZWN0aW9uX2l0ZXJhdG9yIDogcHVibGljIHNlY3Rpb25faXRlcmF0b3IgeworcHVibGljOgorICBlbGZfc2VjdGlvbl9pdGVyYXRvcihjb25zdCBzZWN0aW9uX2l0ZXJhdG9yICZCKSA6IHNlY3Rpb25faXRlcmF0b3IoQikgeworICAgIGFzc2VydChpc2E8RUxGT2JqZWN0RmlsZUJhc2U+KEItPmdldE9iamVjdCgpKSk7CisgIH0KKworICBjb25zdCBFTEZTZWN0aW9uUmVmICpvcGVyYXRvci0+KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBFTEZTZWN0aW9uUmVmICo+KHNlY3Rpb25faXRlcmF0b3I6Om9wZXJhdG9yLT4oKSk7CisgIH0KKworICBjb25zdCBFTEZTZWN0aW9uUmVmICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IEVMRlNlY3Rpb25SZWYgJj4oc2VjdGlvbl9pdGVyYXRvcjo6b3BlcmF0b3IqKCkpOworICB9Cit9OworCitjbGFzcyBFTEZTeW1ib2xSZWYgOiBwdWJsaWMgU3ltYm9sUmVmIHsKK3B1YmxpYzoKKyAgRUxGU3ltYm9sUmVmKGNvbnN0IFN5bWJvbFJlZiAmQikgOiBTeW1ib2xSZWYoQikgeworICAgIGFzc2VydChpc2E8RUxGT2JqZWN0RmlsZUJhc2U+KFN5bWJvbFJlZjo6Z2V0T2JqZWN0KCkpKTsKKyAgfQorCisgIGNvbnN0IEVMRk9iamVjdEZpbGVCYXNlICpnZXRPYmplY3QoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8RUxGT2JqZWN0RmlsZUJhc2U+KEJhc2ljU3ltYm9sUmVmOjpnZXRPYmplY3QoKSk7CisgIH0KKworICB1aW50NjRfdCBnZXRTaXplKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPYmplY3QoKS0+Z2V0U3ltYm9sU2l6ZShnZXRSYXdEYXRhUmVmSW1wbCgpKTsKKyAgfQorCisgIHVpbnQ4X3QgZ2V0T3RoZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9iamVjdCgpLT5nZXRTeW1ib2xPdGhlcihnZXRSYXdEYXRhUmVmSW1wbCgpKTsKKyAgfQorCisgIHVpbnQ4X3QgZ2V0RUxGVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T2JqZWN0KCktPmdldFN5bWJvbEVMRlR5cGUoZ2V0UmF3RGF0YVJlZkltcGwoKSk7CisgIH0KK307CisKK2NsYXNzIGVsZl9zeW1ib2xfaXRlcmF0b3IgOiBwdWJsaWMgc3ltYm9sX2l0ZXJhdG9yIHsKK3B1YmxpYzoKKyAgZWxmX3N5bWJvbF9pdGVyYXRvcihjb25zdCBiYXNpY19zeW1ib2xfaXRlcmF0b3IgJkIpCisgICAgICA6IHN5bWJvbF9pdGVyYXRvcihTeW1ib2xSZWYoQi0+Z2V0UmF3RGF0YVJlZkltcGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0PEVMRk9iamVjdEZpbGVCYXNlPihCLT5nZXRPYmplY3QoKSkpKSB7fQorCisgIGNvbnN0IEVMRlN5bWJvbFJlZiAqb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgRUxGU3ltYm9sUmVmICo+KHN5bWJvbF9pdGVyYXRvcjo6b3BlcmF0b3ItPigpKTsKKyAgfQorCisgIGNvbnN0IEVMRlN5bWJvbFJlZiAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBFTEZTeW1ib2xSZWYgJj4oc3ltYm9sX2l0ZXJhdG9yOjpvcGVyYXRvciooKSk7CisgIH0KK307CisKK2NsYXNzIEVMRlJlbG9jYXRpb25SZWYgOiBwdWJsaWMgUmVsb2NhdGlvblJlZiB7CitwdWJsaWM6CisgIEVMRlJlbG9jYXRpb25SZWYoY29uc3QgUmVsb2NhdGlvblJlZiAmQikgOiBSZWxvY2F0aW9uUmVmKEIpIHsKKyAgICBhc3NlcnQoaXNhPEVMRk9iamVjdEZpbGVCYXNlPihSZWxvY2F0aW9uUmVmOjpnZXRPYmplY3QoKSkpOworICB9CisKKyAgY29uc3QgRUxGT2JqZWN0RmlsZUJhc2UgKmdldE9iamVjdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxFTEZPYmplY3RGaWxlQmFzZT4oUmVsb2NhdGlvblJlZjo6Z2V0T2JqZWN0KCkpOworICB9CisKKyAgRXhwZWN0ZWQ8aW50NjRfdD4gZ2V0QWRkZW5kKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPYmplY3QoKS0+Z2V0UmVsb2NhdGlvbkFkZGVuZChnZXRSYXdEYXRhUmVmSW1wbCgpKTsKKyAgfQorfTsKKworY2xhc3MgZWxmX3JlbG9jYXRpb25faXRlcmF0b3IgOiBwdWJsaWMgcmVsb2NhdGlvbl9pdGVyYXRvciB7CitwdWJsaWM6CisgIGVsZl9yZWxvY2F0aW9uX2l0ZXJhdG9yKGNvbnN0IHJlbG9jYXRpb25faXRlcmF0b3IgJkIpCisgICAgICA6IHJlbG9jYXRpb25faXRlcmF0b3IoUmVsb2NhdGlvblJlZigKKyAgICAgICAgICAgIEItPmdldFJhd0RhdGFSZWZJbXBsKCksIGNhc3Q8RUxGT2JqZWN0RmlsZUJhc2U+KEItPmdldE9iamVjdCgpKSkpIHt9CisKKyAgY29uc3QgRUxGUmVsb2NhdGlvblJlZiAqb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgRUxGUmVsb2NhdGlvblJlZiAqPigKKyAgICAgICAgcmVsb2NhdGlvbl9pdGVyYXRvcjo6b3BlcmF0b3ItPigpKTsKKyAgfQorCisgIGNvbnN0IEVMRlJlbG9jYXRpb25SZWYgJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgRUxGUmVsb2NhdGlvblJlZiAmPigKKyAgICAgICAgcmVsb2NhdGlvbl9pdGVyYXRvcjo6b3BlcmF0b3IqKCkpOworICB9Cit9OworCitpbmxpbmUgRUxGT2JqZWN0RmlsZUJhc2U6OmVsZl9zeW1ib2xfaXRlcmF0b3JfcmFuZ2UKK0VMRk9iamVjdEZpbGVCYXNlOjpzeW1ib2xzKCkgY29uc3QgeworICByZXR1cm4gZWxmX3N5bWJvbF9pdGVyYXRvcl9yYW5nZShzeW1ib2xfYmVnaW4oKSwgc3ltYm9sX2VuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+IGNsYXNzIEVMRk9iamVjdEZpbGUgOiBwdWJsaWMgRUxGT2JqZWN0RmlsZUJhc2UgeworICB1aW50MTZfdCBnZXRFTWFjaGluZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTeW1ib2xTaXplKERhdGFSZWZJbXBsIFN5bSkgY29uc3Qgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTX0VMRlQoRUxGVCkKKworICB1c2luZyB1aW50WF90ID0gdHlwZW5hbWUgRUxGVDo6dWludDsKKworICB1c2luZyBFbGZfU3ltID0gdHlwZW5hbWUgRUxGVDo6U3ltOworICB1c2luZyBFbGZfU2hkciA9IHR5cGVuYW1lIEVMRlQ6OlNoZHI7CisgIHVzaW5nIEVsZl9FaGRyID0gdHlwZW5hbWUgRUxGVDo6RWhkcjsKKyAgdXNpbmcgRWxmX1JlbCA9IHR5cGVuYW1lIEVMRlQ6OlJlbDsKKyAgdXNpbmcgRWxmX1JlbGEgPSB0eXBlbmFtZSBFTEZUOjpSZWxhOworICB1c2luZyBFbGZfRHluID0gdHlwZW5hbWUgRUxGVDo6RHluOworCitwcml2YXRlOgorICBFTEZPYmplY3RGaWxlKE1lbW9yeUJ1ZmZlclJlZiBPYmplY3QsIEVMRkZpbGU8RUxGVD4gRUYsCisgICAgICAgICAgICAgICAgY29uc3QgRWxmX1NoZHIgKkRvdER5blN5bVNlYywgY29uc3QgRWxmX1NoZHIgKkRvdFN5bXRhYlNlYywKKyAgICAgICAgICAgICAgICBBcnJheVJlZjxFbGZfV29yZD4gU2huZHhUYWJsZSk7CisKK3Byb3RlY3RlZDoKKyAgRUxGRmlsZTxFTEZUPiBFRjsKKworICBjb25zdCBFbGZfU2hkciAqRG90RHluU3ltU2VjID0gbnVsbHB0cjsgLy8gRHluYW1pYyBzeW1ib2wgdGFibGUgc2VjdGlvbi4KKyAgY29uc3QgRWxmX1NoZHIgKkRvdFN5bXRhYlNlYyA9IG51bGxwdHI7IC8vIFN5bWJvbCB0YWJsZSBzZWN0aW9uLgorICBBcnJheVJlZjxFbGZfV29yZD4gU2huZHhUYWJsZTsKKworICB2b2lkIG1vdmVTeW1ib2xOZXh0KERhdGFSZWZJbXBsICZTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgRXhwZWN0ZWQ8U3RyaW5nUmVmPiBnZXRTeW1ib2xOYW1lKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICBFeHBlY3RlZDx1aW50NjRfdD4gZ2V0U3ltYm9sQWRkcmVzcyhEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0U3ltYm9sVmFsdWVJbXBsKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTeW1ib2xBbGlnbm1lbnQoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldENvbW1vblN5bWJvbFNpemVJbXBsKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTeW1ib2xGbGFncyhEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDhfdCBnZXRTeW1ib2xPdGhlcihEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDhfdCBnZXRTeW1ib2xFTEZUeXBlKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICBFeHBlY3RlZDxTeW1ib2xSZWY6OlR5cGU+IGdldFN5bWJvbFR5cGUoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIEV4cGVjdGVkPHNlY3Rpb25faXRlcmF0b3I+IGdldFN5bWJvbFNlY3Rpb24oY29uc3QgRWxmX1N5bSAqU3ltYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbGZfU2hkciAqU3ltVGFiKSBjb25zdDsKKyAgRXhwZWN0ZWQ8c2VjdGlvbl9pdGVyYXRvcj4gZ2V0U3ltYm9sU2VjdGlvbihEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIG1vdmVTZWN0aW9uTmV4dChEYXRhUmVmSW1wbCAmU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjplcnJvcl9jb2RlIGdldFNlY3Rpb25OYW1lKERhdGFSZWZJbXBsIFNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAmUmVzKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0U2VjdGlvbkFkZHJlc3MoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0U2VjdGlvbkluZGV4KERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFNlY3Rpb25TaXplKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRTZWN0aW9uQ29udGVudHMoRGF0YVJlZkltcGwgU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAmUmVzKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0U2VjdGlvbkFsaWdubWVudChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2VjdGlvbkNvbXByZXNzZWQoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1NlY3Rpb25UZXh0KERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZWN0aW9uRGF0YShEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2VjdGlvbkJTUyhEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2VjdGlvblZpcnR1YWwoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgcmVsb2NhdGlvbl9pdGVyYXRvciBzZWN0aW9uX3JlbF9iZWdpbihEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICByZWxvY2F0aW9uX2l0ZXJhdG9yIHNlY3Rpb25fcmVsX2VuZChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBzZWN0aW9uX2l0ZXJhdG9yIGdldFJlbG9jYXRlZFNlY3Rpb24oRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIG1vdmVSZWxvY2F0aW9uTmV4dChEYXRhUmVmSW1wbCAmUmVsKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0UmVsb2NhdGlvbk9mZnNldChEYXRhUmVmSW1wbCBSZWwpIGNvbnN0IG92ZXJyaWRlOworICBzeW1ib2xfaXRlcmF0b3IgZ2V0UmVsb2NhdGlvblN5bWJvbChEYXRhUmVmSW1wbCBSZWwpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRSZWxvY2F0aW9uVHlwZShEYXRhUmVmSW1wbCBSZWwpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIGdldFJlbG9jYXRpb25UeXBlTmFtZShEYXRhUmVmSW1wbCBSZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0KSBjb25zdCBvdmVycmlkZTsKKworICB1aW50MzJfdCBnZXRTZWN0aW9uVHlwZShEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTZWN0aW9uRmxhZ3MoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0U2VjdGlvbk9mZnNldChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBTdHJpbmdSZWYgZ2V0UmVsb2NhdGlvblR5cGVOYW1lKHVpbnQzMl90IFR5cGUpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSByZWxvY2F0aW9uIHNlY3Rpb24gdGhhdCBjb250YWlucyBcYSBSZWwuCisgIGNvbnN0IEVsZl9TaGRyICpnZXRSZWxTZWN0aW9uKERhdGFSZWZJbXBsIFJlbCkgY29uc3QgeworICAgIGF1dG8gUmVsU2VjT3JFcnIgPSBFRi5nZXRTZWN0aW9uKFJlbC5kLmEpOworICAgIGlmICghUmVsU2VjT3JFcnIpCisgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoZXJyb3JUb0Vycm9yQ29kZShSZWxTZWNPckVyci50YWtlRXJyb3IoKSkubWVzc2FnZSgpKTsKKyAgICByZXR1cm4gKlJlbFNlY09yRXJyOworICB9CisKKyAgRGF0YVJlZkltcGwgdG9EUkkoY29uc3QgRWxmX1NoZHIgKlN5bVRhYmxlLCB1bnNpZ25lZCBTeW1ib2xOdW0pIGNvbnN0IHsKKyAgICBEYXRhUmVmSW1wbCBEUkk7CisgICAgaWYgKCFTeW1UYWJsZSkgeworICAgICAgRFJJLmQuYSA9IDA7CisgICAgICBEUkkuZC5iID0gMDsKKyAgICAgIHJldHVybiBEUkk7CisgICAgfQorICAgIGFzc2VydChTeW1UYWJsZS0+c2hfdHlwZSA9PSBFTEY6OlNIVF9TWU1UQUIgfHwKKyAgICAgICAgICAgU3ltVGFibGUtPnNoX3R5cGUgPT0gRUxGOjpTSFRfRFlOU1lNKTsKKworICAgIGF1dG8gU2VjdGlvbnNPckVyciA9IEVGLnNlY3Rpb25zKCk7CisgICAgaWYgKCFTZWN0aW9uc09yRXJyKSB7CisgICAgICBEUkkuZC5hID0gMDsKKyAgICAgIERSSS5kLmIgPSAwOworICAgICAgcmV0dXJuIERSSTsKKyAgICB9CisgICAgdWludHB0cl90IFNIVCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PigoKlNlY3Rpb25zT3JFcnIpLmJlZ2luKCkpOworICAgIHVuc2lnbmVkIFN5bVRhYmxlSW5kZXggPQorICAgICAgICAocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFN5bVRhYmxlKSAtIFNIVCkgLyBzaXplb2YoRWxmX1NoZHIpOworCisgICAgRFJJLmQuYSA9IFN5bVRhYmxlSW5kZXg7CisgICAgRFJJLmQuYiA9IFN5bWJvbE51bTsKKyAgICByZXR1cm4gRFJJOworICB9CisKKyAgY29uc3QgRWxmX1NoZHIgKnRvRUxGU2hkckl0ZXIoRGF0YVJlZkltcGwgU2VjKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRWxmX1NoZHIgKj4oU2VjLnApOworICB9CisKKyAgRGF0YVJlZkltcGwgdG9EUkkoY29uc3QgRWxmX1NoZHIgKlNlYykgY29uc3QgeworICAgIERhdGFSZWZJbXBsIERSSTsKKyAgICBEUkkucCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihTZWMpOworICAgIHJldHVybiBEUkk7CisgIH0KKworICBEYXRhUmVmSW1wbCB0b0RSSShjb25zdCBFbGZfRHluICpEeW4pIGNvbnN0IHsKKyAgICBEYXRhUmVmSW1wbCBEUkk7CisgICAgRFJJLnAgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oRHluKTsKKyAgICByZXR1cm4gRFJJOworICB9CisKKyAgYm9vbCBpc0V4cG9ydGVkVG9PdGhlckRTTyhjb25zdCBFbGZfU3ltICpFU3ltKSBjb25zdCB7CisgICAgdW5zaWduZWQgY2hhciBCaW5kaW5nID0gRVN5bS0+Z2V0QmluZGluZygpOworICAgIHVuc2lnbmVkIGNoYXIgVmlzaWJpbGl0eSA9IEVTeW0tPmdldFZpc2liaWxpdHkoKTsKKworICAgIC8vIEEgc3ltYm9sIGlzIGV4cG9ydGVkIGlmIGl0cyBiaW5kaW5nIGlzIGVpdGhlciBHTE9CQUwgb3IgV0VBSywgYW5kIGl0cworICAgIC8vIHZpc2liaWxpdHkgaXMgZWl0aGVyIERFRkFVTFQgb3IgUFJPVEVDVEVELiBBbGwgb3RoZXIgc3ltYm9scyBhcmUgbm90CisgICAgLy8gZXhwb3J0ZWQuCisgICAgcmV0dXJuICgoQmluZGluZyA9PSBFTEY6OlNUQl9HTE9CQUwgfHwgQmluZGluZyA9PSBFTEY6OlNUQl9XRUFLKSAmJgorICAgICAgICAgICAgKFZpc2liaWxpdHkgPT0gRUxGOjpTVFZfREVGQVVMVCB8fAorICAgICAgICAgICAgIFZpc2liaWxpdHkgPT0gRUxGOjpTVFZfUFJPVEVDVEVEKSk7CisgIH0KKworICAvLyBUaGlzIGZsYWcgaXMgdXNlZCBmb3IgY2xhc3NvZiwgdG8gZGlzdGluZ3Vpc2ggRUxGT2JqZWN0RmlsZSBmcm9tCisgIC8vIGl0cyBzdWJjbGFzcy4gSWYgbW9yZSBzdWJjbGFzc2VzIHdpbGwgYmUgY3JlYXRlZCwgdGhpcyBmbGFnIHdpbGwKKyAgLy8gaGF2ZSB0byBiZWNvbWUgYW4gZW51bS4KKyAgYm9vbCBpc0R5bGRFTEZPYmplY3Q7CisKK3B1YmxpYzoKKyAgRUxGT2JqZWN0RmlsZShFTEZPYmplY3RGaWxlPEVMRlQ+ICYmT3RoZXIpOworICBzdGF0aWMgRXhwZWN0ZWQ8RUxGT2JqZWN0RmlsZTxFTEZUPj4gY3JlYXRlKE1lbW9yeUJ1ZmZlclJlZiBPYmplY3QpOworCisgIGNvbnN0IEVsZl9SZWwgKmdldFJlbChEYXRhUmVmSW1wbCBSZWwpIGNvbnN0OworICBjb25zdCBFbGZfUmVsYSAqZ2V0UmVsYShEYXRhUmVmSW1wbCBSZWxhKSBjb25zdDsKKworICBjb25zdCBFbGZfU3ltICpnZXRTeW1ib2woRGF0YVJlZkltcGwgU3ltKSBjb25zdCB7CisgICAgYXV0byBSZXQgPSBFRi50ZW1wbGF0ZSBnZXRFbnRyeTxFbGZfU3ltPihTeW0uZC5hLCBTeW0uZC5iKTsKKyAgICBpZiAoIVJldCkKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcihlcnJvclRvRXJyb3JDb2RlKFJldC50YWtlRXJyb3IoKSkubWVzc2FnZSgpKTsKKyAgICByZXR1cm4gKlJldDsKKyAgfQorCisgIGNvbnN0IEVsZl9TaGRyICpnZXRTZWN0aW9uKERhdGFSZWZJbXBsIFNlYykgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEVsZl9TaGRyICo+KFNlYy5wKTsKKyAgfQorCisgIGJhc2ljX3N5bWJvbF9pdGVyYXRvciBzeW1ib2xfYmVnaW4oKSBjb25zdCBvdmVycmlkZTsKKyAgYmFzaWNfc3ltYm9sX2l0ZXJhdG9yIHN5bWJvbF9lbmQoKSBjb25zdCBvdmVycmlkZTsKKworICBlbGZfc3ltYm9sX2l0ZXJhdG9yIGR5bmFtaWNfc3ltYm9sX2JlZ2luKCkgY29uc3Q7CisgIGVsZl9zeW1ib2xfaXRlcmF0b3IgZHluYW1pY19zeW1ib2xfZW5kKCkgY29uc3Q7CisKKyAgc2VjdGlvbl9pdGVyYXRvciBzZWN0aW9uX2JlZ2luKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHNlY3Rpb25faXRlcmF0b3Igc2VjdGlvbl9lbmQoKSBjb25zdCBvdmVycmlkZTsKKworICBFeHBlY3RlZDxpbnQ2NF90PiBnZXRSZWxvY2F0aW9uQWRkZW5kKERhdGFSZWZJbXBsIFJlbCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdWludDhfdCBnZXRCeXRlc0luQWRkcmVzcygpIGNvbnN0IG92ZXJyaWRlOworICBTdHJpbmdSZWYgZ2V0RmlsZUZvcm1hdE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgVHJpcGxlOjpBcmNoVHlwZSBnZXRBcmNoKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdW5zaWduZWQgZ2V0UGxhdGZvcm1GbGFncygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEVGLmdldEhlYWRlcigpLT5lX2ZsYWdzOyB9CisKKyAgc3RkOjplcnJvcl9jb2RlIGdldEJ1aWxkQXR0cmlidXRlcyhBUk1BdHRyaWJ1dGVQYXJzZXIgJkF0dHJpYnV0ZXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBhdXRvIFNlY3Rpb25zT3JFcnIgPSBFRi5zZWN0aW9ucygpOworICAgIGlmICghU2VjdGlvbnNPckVycikKKyAgICAgIHJldHVybiBlcnJvclRvRXJyb3JDb2RlKFNlY3Rpb25zT3JFcnIudGFrZUVycm9yKCkpOworCisgICAgZm9yIChjb25zdCBFbGZfU2hkciAmU2VjIDogKlNlY3Rpb25zT3JFcnIpIHsKKyAgICAgIGlmIChTZWMuc2hfdHlwZSA9PSBFTEY6OlNIVF9BUk1fQVRUUklCVVRFUykgeworICAgICAgICBhdXRvIEVycm9yT3JDb250ZW50cyA9IEVGLmdldFNlY3Rpb25Db250ZW50cygmU2VjKTsKKyAgICAgICAgaWYgKCFFcnJvck9yQ29udGVudHMpCisgICAgICAgICAgcmV0dXJuIGVycm9yVG9FcnJvckNvZGUoRXJyb3JPckNvbnRlbnRzLnRha2VFcnJvcigpKTsKKworICAgICAgICBhdXRvIENvbnRlbnRzID0gRXJyb3JPckNvbnRlbnRzLmdldCgpOworICAgICAgICBpZiAoQ29udGVudHNbMF0gIT0gQVJNQnVpbGRBdHRyczo6Rm9ybWF0X1ZlcnNpb24gfHwgQ29udGVudHMuc2l6ZSgpID09IDEpCisgICAgICAgICAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOworCisgICAgICAgIEF0dHJpYnV0ZXMuUGFyc2UoQ29udGVudHMsIEVMRlQ6OlRhcmdldEVuZGlhbm5lc3MgPT0gc3VwcG9ydDo6bGl0dGxlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKKyAgfQorCisgIGNvbnN0IEVMRkZpbGU8RUxGVD4gKmdldEVMRkZpbGUoKSBjb25zdCB7IHJldHVybiAmRUY7IH0KKworICBib29sIGlzRHlsZFR5cGUoKSBjb25zdCB7IHJldHVybiBpc0R5bGRFTEZPYmplY3Q7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBCaW5hcnkgKnYpIHsKKyAgICByZXR1cm4gdi0+Z2V0VHlwZSgpID09IGdldEVMRlR5cGUoRUxGVDo6VGFyZ2V0RW5kaWFubmVzcyA9PSBzdXBwb3J0OjpsaXR0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRlQ6OklzNjRCaXRzKTsKKyAgfQorCisgIGVsZl9zeW1ib2xfaXRlcmF0b3JfcmFuZ2UgZ2V0RHluYW1pY1N5bWJvbEl0ZXJhdG9ycygpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgaXNSZWxvY2F0YWJsZU9iamVjdCgpIGNvbnN0IG92ZXJyaWRlOworfTsKKwordXNpbmcgRUxGMzJMRU9iamVjdEZpbGUgPSBFTEZPYmplY3RGaWxlPEVMRjMyTEU+OwordXNpbmcgRUxGNjRMRU9iamVjdEZpbGUgPSBFTEZPYmplY3RGaWxlPEVMRjY0TEU+OwordXNpbmcgRUxGMzJCRU9iamVjdEZpbGUgPSBFTEZPYmplY3RGaWxlPEVMRjMyQkU+OwordXNpbmcgRUxGNjRCRU9iamVjdEZpbGUgPSBFTEZPYmplY3RGaWxlPEVMRjY0QkU+OworCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3ZvaWQgRUxGT2JqZWN0RmlsZTxFTEZUPjo6bW92ZVN5bWJvbE5leHQoRGF0YVJlZkltcGwgJlN5bSkgY29uc3QgeworICArK1N5bS5kLmI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRXhwZWN0ZWQ8U3RyaW5nUmVmPiBFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRTeW1ib2xOYW1lKERhdGFSZWZJbXBsIFN5bSkgY29uc3QgeworICBjb25zdCBFbGZfU3ltICpFU3ltID0gZ2V0U3ltYm9sKFN5bSk7CisgIGF1dG8gU3ltVGFiT3JFcnIgPSBFRi5nZXRTZWN0aW9uKFN5bS5kLmEpOworICBpZiAoIVN5bVRhYk9yRXJyKQorICAgIHJldHVybiBTeW1UYWJPckVyci50YWtlRXJyb3IoKTsKKyAgY29uc3QgRWxmX1NoZHIgKlN5bVRhYmxlU2VjID0gKlN5bVRhYk9yRXJyOworICBhdXRvIFN0clRhYk9yRXJyID0gRUYuZ2V0U2VjdGlvbihTeW1UYWJsZVNlYy0+c2hfbGluayk7CisgIGlmICghU3RyVGFiT3JFcnIpCisgICAgcmV0dXJuIFN0clRhYk9yRXJyLnRha2VFcnJvcigpOworICBjb25zdCBFbGZfU2hkciAqU3RyaW5nVGFibGVTZWMgPSAqU3RyVGFiT3JFcnI7CisgIGF1dG8gU3ltU3RyVGFiT3JFcnIgPSBFRi5nZXRTdHJpbmdUYWJsZShTdHJpbmdUYWJsZVNlYyk7CisgIGlmICghU3ltU3RyVGFiT3JFcnIpCisgICAgcmV0dXJuIFN5bVN0clRhYk9yRXJyLnRha2VFcnJvcigpOworICByZXR1cm4gRVN5bS0+Z2V0TmFtZSgqU3ltU3RyVGFiT3JFcnIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3VpbnQ2NF90IEVMRk9iamVjdEZpbGU8RUxGVD46OmdldFNlY3Rpb25GbGFncyhEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFNlY3Rpb24oU2VjKS0+c2hfZmxhZ3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordWludDMyX3QgRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0U2VjdGlvblR5cGUoRGF0YVJlZkltcGwgU2VjKSBjb25zdCB7CisgIHJldHVybiBnZXRTZWN0aW9uKFNlYyktPnNoX3R5cGU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordWludDY0X3QgRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0U2VjdGlvbk9mZnNldChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFNlY3Rpb24oU2VjKS0+c2hfb2Zmc2V0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3VpbnQ2NF90IEVMRk9iamVjdEZpbGU8RUxGVD46OmdldFN5bWJvbFZhbHVlSW1wbChEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCB7CisgIGNvbnN0IEVsZl9TeW0gKkVTeW0gPSBnZXRTeW1ib2woU3ltYik7CisgIHVpbnQ2NF90IFJldCA9IEVTeW0tPnN0X3ZhbHVlOworICBpZiAoRVN5bS0+c3Rfc2huZHggPT0gRUxGOjpTSE5fQUJTKQorICAgIHJldHVybiBSZXQ7CisKKyAgY29uc3QgRWxmX0VoZHIgKkhlYWRlciA9IEVGLmdldEhlYWRlcigpOworICAvLyBDbGVhciB0aGUgQVJNL1RodW1iIG9yIG1pY3JvTUlQUyBpbmRpY2F0b3IgZmxhZy4KKyAgaWYgKChIZWFkZXItPmVfbWFjaGluZSA9PSBFTEY6OkVNX0FSTSB8fCBIZWFkZXItPmVfbWFjaGluZSA9PSBFTEY6OkVNX01JUFMpICYmCisgICAgICBFU3ltLT5nZXRUeXBlKCkgPT0gRUxGOjpTVFRfRlVOQykKKyAgICBSZXQgJj0gfjE7CisKKyAgcmV0dXJuIFJldDsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFeHBlY3RlZDx1aW50NjRfdD4KK0VMRk9iamVjdEZpbGU8RUxGVD46OmdldFN5bWJvbEFkZHJlc3MoRGF0YVJlZkltcGwgU3ltYikgY29uc3QgeworICB1aW50NjRfdCBSZXN1bHQgPSBnZXRTeW1ib2xWYWx1ZShTeW1iKTsKKyAgY29uc3QgRWxmX1N5bSAqRVN5bSA9IGdldFN5bWJvbChTeW1iKTsKKyAgc3dpdGNoIChFU3ltLT5zdF9zaG5keCkgeworICBjYXNlIEVMRjo6U0hOX0NPTU1PTjoKKyAgY2FzZSBFTEY6OlNITl9VTkRFRjoKKyAgY2FzZSBFTEY6OlNITl9BQlM6CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIGNvbnN0IEVsZl9FaGRyICpIZWFkZXIgPSBFRi5nZXRIZWFkZXIoKTsKKyAgYXV0byBTeW1UYWJPckVyciA9IEVGLmdldFNlY3Rpb24oU3ltYi5kLmEpOworICBpZiAoIVN5bVRhYk9yRXJyKQorICAgIHJldHVybiBTeW1UYWJPckVyci50YWtlRXJyb3IoKTsKKyAgY29uc3QgRWxmX1NoZHIgKlN5bVRhYiA9ICpTeW1UYWJPckVycjsKKworICBpZiAoSGVhZGVyLT5lX3R5cGUgPT0gRUxGOjpFVF9SRUwpIHsKKyAgICBhdXRvIFNlY3Rpb25PckVyciA9IEVGLmdldFNlY3Rpb24oRVN5bSwgU3ltVGFiLCBTaG5keFRhYmxlKTsKKyAgICBpZiAoIVNlY3Rpb25PckVycikKKyAgICAgIHJldHVybiBTZWN0aW9uT3JFcnIudGFrZUVycm9yKCk7CisgICAgY29uc3QgRWxmX1NoZHIgKlNlY3Rpb24gPSAqU2VjdGlvbk9yRXJyOworICAgIGlmIChTZWN0aW9uKQorICAgICAgUmVzdWx0ICs9IFNlY3Rpb24tPnNoX2FkZHI7CisgIH0KKworICByZXR1cm4gUmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3VpbnQzMl90IEVMRk9iamVjdEZpbGU8RUxGVD46OmdldFN5bWJvbEFsaWdubWVudChEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCB7CisgIGNvbnN0IEVsZl9TeW0gKlN5bSA9IGdldFN5bWJvbChTeW1iKTsKKyAgaWYgKFN5bS0+c3Rfc2huZHggPT0gRUxGOjpTSE5fQ09NTU9OKQorICAgIHJldHVybiBTeW0tPnN0X3ZhbHVlOworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+Cit1aW50MTZfdCBFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRFTWFjaGluZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEVGLmdldEhlYWRlcigpLT5lX21hY2hpbmU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordWludDY0X3QgRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0U3ltYm9sU2l6ZShEYXRhUmVmSW1wbCBTeW0pIGNvbnN0IHsKKyAgcmV0dXJuIGdldFN5bWJvbChTeW0pLT5zdF9zaXplOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3VpbnQ2NF90IEVMRk9iamVjdEZpbGU8RUxGVD46OmdldENvbW1vblN5bWJvbFNpemVJbXBsKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFN5bWJvbChTeW1iKS0+c3Rfc2l6ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+Cit1aW50OF90IEVMRk9iamVjdEZpbGU8RUxGVD46OmdldFN5bWJvbE90aGVyKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFN5bWJvbChTeW1iKS0+c3Rfb3RoZXI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordWludDhfdCBFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRTeW1ib2xFTEZUeXBlKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFN5bWJvbChTeW1iKS0+Z2V0VHlwZSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0V4cGVjdGVkPFN5bWJvbFJlZjo6VHlwZT4KK0VMRk9iamVjdEZpbGU8RUxGVD46OmdldFN5bWJvbFR5cGUoRGF0YVJlZkltcGwgU3ltYikgY29uc3QgeworICBjb25zdCBFbGZfU3ltICpFU3ltID0gZ2V0U3ltYm9sKFN5bWIpOworCisgIHN3aXRjaCAoRVN5bS0+Z2V0VHlwZSgpKSB7CisgIGNhc2UgRUxGOjpTVFRfTk9UWVBFOgorICAgIHJldHVybiBTeW1ib2xSZWY6OlNUX1Vua25vd247CisgIGNhc2UgRUxGOjpTVFRfU0VDVElPTjoKKyAgICByZXR1cm4gU3ltYm9sUmVmOjpTVF9EZWJ1ZzsKKyAgY2FzZSBFTEY6OlNUVF9GSUxFOgorICAgIHJldHVybiBTeW1ib2xSZWY6OlNUX0ZpbGU7CisgIGNhc2UgRUxGOjpTVFRfRlVOQzoKKyAgICByZXR1cm4gU3ltYm9sUmVmOjpTVF9GdW5jdGlvbjsKKyAgY2FzZSBFTEY6OlNUVF9PQkpFQ1Q6CisgIGNhc2UgRUxGOjpTVFRfQ09NTU9OOgorICBjYXNlIEVMRjo6U1RUX1RMUzoKKyAgICByZXR1cm4gU3ltYm9sUmVmOjpTVF9EYXRhOworICBkZWZhdWx0OgorICAgIHJldHVybiBTeW1ib2xSZWY6OlNUX090aGVyOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordWludDMyX3QgRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0U3ltYm9sRmxhZ3MoRGF0YVJlZkltcGwgU3ltKSBjb25zdCB7CisgIGNvbnN0IEVsZl9TeW0gKkVTeW0gPSBnZXRTeW1ib2woU3ltKTsKKworICB1aW50MzJfdCBSZXN1bHQgPSBTeW1ib2xSZWY6OlNGX05vbmU7CisKKyAgaWYgKEVTeW0tPmdldEJpbmRpbmcoKSAhPSBFTEY6OlNUQl9MT0NBTCkKKyAgICBSZXN1bHQgfD0gU3ltYm9sUmVmOjpTRl9HbG9iYWw7CisKKyAgaWYgKEVTeW0tPmdldEJpbmRpbmcoKSA9PSBFTEY6OlNUQl9XRUFLKQorICAgIFJlc3VsdCB8PSBTeW1ib2xSZWY6OlNGX1dlYWs7CisKKyAgaWYgKEVTeW0tPnN0X3NobmR4ID09IEVMRjo6U0hOX0FCUykKKyAgICBSZXN1bHQgfD0gU3ltYm9sUmVmOjpTRl9BYnNvbHV0ZTsKKworICBpZiAoRVN5bS0+Z2V0VHlwZSgpID09IEVMRjo6U1RUX0ZJTEUgfHwgRVN5bS0+Z2V0VHlwZSgpID09IEVMRjo6U1RUX1NFQ1RJT04pCisgICAgUmVzdWx0IHw9IFN5bWJvbFJlZjo6U0ZfRm9ybWF0U3BlY2lmaWM7CisKKyAgYXV0byBEb3RTeW10YWJTZWNTeW1zID0gRUYuc3ltYm9scyhEb3RTeW10YWJTZWMpOworICBpZiAoRG90U3ltdGFiU2VjU3ltcyAmJiBFU3ltID09ICgqRG90U3ltdGFiU2VjU3ltcykuYmVnaW4oKSkKKyAgICBSZXN1bHQgfD0gU3ltYm9sUmVmOjpTRl9Gb3JtYXRTcGVjaWZpYzsKKyAgYXV0byBEb3REeW5TeW1TZWNTeW1zID0gRUYuc3ltYm9scyhEb3REeW5TeW1TZWMpOworICBpZiAoRG90RHluU3ltU2VjU3ltcyAmJiBFU3ltID09ICgqRG90RHluU3ltU2VjU3ltcykuYmVnaW4oKSkKKyAgICBSZXN1bHQgfD0gU3ltYm9sUmVmOjpTRl9Gb3JtYXRTcGVjaWZpYzsKKworICBpZiAoRUYuZ2V0SGVhZGVyKCktPmVfbWFjaGluZSA9PSBFTEY6OkVNX0FSTSkgeworICAgIGlmIChFeHBlY3RlZDxTdHJpbmdSZWY+IE5hbWVPckVyciA9IGdldFN5bWJvbE5hbWUoU3ltKSkgeworICAgICAgU3RyaW5nUmVmIE5hbWUgPSAqTmFtZU9yRXJyOworICAgICAgaWYgKE5hbWUuc3RhcnRzd2l0aCgiJGQiKSB8fCBOYW1lLnN0YXJ0c3dpdGgoIiR0IikgfHwKKyAgICAgICAgICBOYW1lLnN0YXJ0c3dpdGgoIiRhIikpCisgICAgICAgIFJlc3VsdCB8PSBTeW1ib2xSZWY6OlNGX0Zvcm1hdFNwZWNpZmljOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUT0RPOiBBY3R1YWxseSByZXBvcnQgZXJyb3JzIGhlbHBmdWxseS4KKyAgICAgIGNvbnN1bWVFcnJvcihOYW1lT3JFcnIudGFrZUVycm9yKCkpOworICAgIH0KKyAgICBpZiAoRVN5bS0+Z2V0VHlwZSgpID09IEVMRjo6U1RUX0ZVTkMgJiYgKEVTeW0tPnN0X3ZhbHVlICYgMSkgPT0gMSkKKyAgICAgIFJlc3VsdCB8PSBTeW1ib2xSZWY6OlNGX1RodW1iOworICB9CisKKyAgaWYgKEVTeW0tPnN0X3NobmR4ID09IEVMRjo6U0hOX1VOREVGKQorICAgIFJlc3VsdCB8PSBTeW1ib2xSZWY6OlNGX1VuZGVmaW5lZDsKKworICBpZiAoRVN5bS0+Z2V0VHlwZSgpID09IEVMRjo6U1RUX0NPTU1PTiB8fCBFU3ltLT5zdF9zaG5keCA9PSBFTEY6OlNITl9DT01NT04pCisgICAgUmVzdWx0IHw9IFN5bWJvbFJlZjo6U0ZfQ29tbW9uOworCisgIGlmIChpc0V4cG9ydGVkVG9PdGhlckRTTyhFU3ltKSkKKyAgICBSZXN1bHQgfD0gU3ltYm9sUmVmOjpTRl9FeHBvcnRlZDsKKworICBpZiAoRVN5bS0+Z2V0VmlzaWJpbGl0eSgpID09IEVMRjo6U1RWX0hJRERFTikKKyAgICBSZXN1bHQgfD0gU3ltYm9sUmVmOjpTRl9IaWRkZW47CisKKyAgcmV0dXJuIFJlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFeHBlY3RlZDxzZWN0aW9uX2l0ZXJhdG9yPgorRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0U3ltYm9sU2VjdGlvbihjb25zdCBFbGZfU3ltICpFU3ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbGZfU2hkciAqU3ltVGFiKSBjb25zdCB7CisgIGF1dG8gRVNlY09yRXJyID0gRUYuZ2V0U2VjdGlvbihFU3ltLCBTeW1UYWIsIFNobmR4VGFibGUpOworICBpZiAoIUVTZWNPckVycikKKyAgICByZXR1cm4gRVNlY09yRXJyLnRha2VFcnJvcigpOworCisgIGNvbnN0IEVsZl9TaGRyICpFU2VjID0gKkVTZWNPckVycjsKKyAgaWYgKCFFU2VjKQorICAgIHJldHVybiBzZWN0aW9uX2VuZCgpOworCisgIERhdGFSZWZJbXBsIFNlYzsKKyAgU2VjLnAgPSByZWludGVycHJldF9jYXN0PGludHB0cl90PihFU2VjKTsKKyAgcmV0dXJuIHNlY3Rpb25faXRlcmF0b3IoU2VjdGlvblJlZihTZWMsIHRoaXMpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFeHBlY3RlZDxzZWN0aW9uX2l0ZXJhdG9yPgorRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0U3ltYm9sU2VjdGlvbihEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCB7CisgIGNvbnN0IEVsZl9TeW0gKlN5bSA9IGdldFN5bWJvbChTeW1iKTsKKyAgYXV0byBTeW1UYWJPckVyciA9IEVGLmdldFNlY3Rpb24oU3ltYi5kLmEpOworICBpZiAoIVN5bVRhYk9yRXJyKQorICAgIHJldHVybiBTeW1UYWJPckVyci50YWtlRXJyb3IoKTsKKyAgY29uc3QgRWxmX1NoZHIgKlN5bVRhYiA9ICpTeW1UYWJPckVycjsKKyAgcmV0dXJuIGdldFN5bWJvbFNlY3Rpb24oU3ltLCBTeW1UYWIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3ZvaWQgRUxGT2JqZWN0RmlsZTxFTEZUPjo6bW92ZVNlY3Rpb25OZXh0KERhdGFSZWZJbXBsICZTZWMpIGNvbnN0IHsKKyAgY29uc3QgRWxmX1NoZHIgKkVTZWMgPSBnZXRTZWN0aW9uKFNlYyk7CisgIFNlYyA9IHRvRFJJKCsrRVNlYyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorc3RkOjplcnJvcl9jb2RlIEVMRk9iamVjdEZpbGU8RUxGVD46OmdldFNlY3Rpb25OYW1lKERhdGFSZWZJbXBsIFNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgJlJlc3VsdCkgY29uc3QgeworICBhdXRvIE5hbWUgPSBFRi5nZXRTZWN0aW9uTmFtZSgmKmdldFNlY3Rpb24oU2VjKSk7CisgIGlmICghTmFtZSkKKyAgICByZXR1cm4gZXJyb3JUb0Vycm9yQ29kZShOYW1lLnRha2VFcnJvcigpKTsKKyAgUmVzdWx0ID0gKk5hbWU7CisgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+Cit1aW50NjRfdCBFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRTZWN0aW9uQWRkcmVzcyhEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFNlY3Rpb24oU2VjKS0+c2hfYWRkcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+Cit1aW50NjRfdCBFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRTZWN0aW9uSW5kZXgoRGF0YVJlZkltcGwgU2VjKSBjb25zdCB7CisgIGF1dG8gU2VjdGlvbnNPckVyciA9IEVGLnNlY3Rpb25zKCk7CisgIGhhbmRsZUFsbEVycm9ycyhzdGQ6Om1vdmUoU2VjdGlvbnNPckVyci50YWtlRXJyb3IoKSksCisgICAgICAgICAgICAgICAgICBbXShjb25zdCBFcnJvckluZm9CYXNlICYpIHsKKyAgICAgICAgICAgICAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgidW5hYmxlIHRvIGdldCBzZWN0aW9uIGluZGV4Iik7CisgICAgICAgICAgICAgICAgICB9KTsKKyAgY29uc3QgRWxmX1NoZHIgKkZpcnN0ID0gU2VjdGlvbnNPckVyci0+YmVnaW4oKTsKKyAgcmV0dXJuIGdldFNlY3Rpb24oU2VjKSAtIEZpcnN0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3VpbnQ2NF90IEVMRk9iamVjdEZpbGU8RUxGVD46OmdldFNlY3Rpb25TaXplKERhdGFSZWZJbXBsIFNlYykgY29uc3QgeworICByZXR1cm4gZ2V0U2VjdGlvbihTZWMpLT5zaF9zaXplOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3N0ZDo6ZXJyb3JfY29kZQorRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0U2VjdGlvbkNvbnRlbnRzKERhdGFSZWZJbXBsIFNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgJlJlc3VsdCkgY29uc3QgeworICBjb25zdCBFbGZfU2hkciAqRVNoZHIgPSBnZXRTZWN0aW9uKFNlYyk7CisgIGlmIChzdGQ6OmVycm9yX2NvZGUgRUMgPQorICAgICAgICAgIGNoZWNrT2Zmc2V0KGdldE1lbW9yeUJ1ZmZlclJlZigpLAorICAgICAgICAgICAgICAgICAgICAgICh1aW50cHRyX3QpYmFzZSgpICsgRVNoZHItPnNoX29mZnNldCwgRVNoZHItPnNoX3NpemUpKQorICAgIHJldHVybiBFQzsKKyAgUmVzdWx0ID0gU3RyaW5nUmVmKChjb25zdCBjaGFyICopYmFzZSgpICsgRVNoZHItPnNoX29mZnNldCwgRVNoZHItPnNoX3NpemUpOworICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordWludDY0X3QgRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0U2VjdGlvbkFsaWdubWVudChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFNlY3Rpb24oU2VjKS0+c2hfYWRkcmFsaWduOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK2Jvb2wgRUxGT2JqZWN0RmlsZTxFTEZUPjo6aXNTZWN0aW9uQ29tcHJlc3NlZChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFNlY3Rpb24oU2VjKS0+c2hfZmxhZ3MgJiBFTEY6OlNIRl9DT01QUkVTU0VEOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK2Jvb2wgRUxGT2JqZWN0RmlsZTxFTEZUPjo6aXNTZWN0aW9uVGV4dChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFNlY3Rpb24oU2VjKS0+c2hfZmxhZ3MgJiBFTEY6OlNIRl9FWEVDSU5TVFI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorYm9vbCBFTEZPYmplY3RGaWxlPEVMRlQ+Ojppc1NlY3Rpb25EYXRhKERhdGFSZWZJbXBsIFNlYykgY29uc3QgeworICBjb25zdCBFbGZfU2hkciAqRVNoZHIgPSBnZXRTZWN0aW9uKFNlYyk7CisgIHJldHVybiBFU2hkci0+c2hfZmxhZ3MgJiAoRUxGOjpTSEZfQUxMT0MgfCBFTEY6OlNIRl9XUklURSkgJiYKKyAgICAgICAgIEVTaGRyLT5zaF90eXBlID09IEVMRjo6U0hUX1BST0dCSVRTOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK2Jvb2wgRUxGT2JqZWN0RmlsZTxFTEZUPjo6aXNTZWN0aW9uQlNTKERhdGFSZWZJbXBsIFNlYykgY29uc3QgeworICBjb25zdCBFbGZfU2hkciAqRVNoZHIgPSBnZXRTZWN0aW9uKFNlYyk7CisgIHJldHVybiBFU2hkci0+c2hfZmxhZ3MgJiAoRUxGOjpTSEZfQUxMT0MgfCBFTEY6OlNIRl9XUklURSkgJiYKKyAgICAgICAgIEVTaGRyLT5zaF90eXBlID09IEVMRjo6U0hUX05PQklUUzsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+Citib29sIEVMRk9iamVjdEZpbGU8RUxGVD46OmlzU2VjdGlvblZpcnR1YWwoRGF0YVJlZkltcGwgU2VjKSBjb25zdCB7CisgIHJldHVybiBnZXRTZWN0aW9uKFNlYyktPnNoX3R5cGUgPT0gRUxGOjpTSFRfTk9CSVRTOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3JlbG9jYXRpb25faXRlcmF0b3IKK0VMRk9iamVjdEZpbGU8RUxGVD46OnNlY3Rpb25fcmVsX2JlZ2luKERhdGFSZWZJbXBsIFNlYykgY29uc3QgeworICBEYXRhUmVmSW1wbCBSZWxEYXRhOworICBhdXRvIFNlY3Rpb25zT3JFcnIgPSBFRi5zZWN0aW9ucygpOworICBpZiAoIVNlY3Rpb25zT3JFcnIpCisgICAgcmV0dXJuIHJlbG9jYXRpb25faXRlcmF0b3IoUmVsb2NhdGlvblJlZigpKTsKKyAgdWludHB0cl90IFNIVCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PigoKlNlY3Rpb25zT3JFcnIpLmJlZ2luKCkpOworICBSZWxEYXRhLmQuYSA9IChTZWMucCAtIFNIVCkgLyBFRi5nZXRIZWFkZXIoKS0+ZV9zaGVudHNpemU7CisgIFJlbERhdGEuZC5iID0gMDsKKyAgcmV0dXJuIHJlbG9jYXRpb25faXRlcmF0b3IoUmVsb2NhdGlvblJlZihSZWxEYXRhLCB0aGlzKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorcmVsb2NhdGlvbl9pdGVyYXRvcgorRUxGT2JqZWN0RmlsZTxFTEZUPjo6c2VjdGlvbl9yZWxfZW5kKERhdGFSZWZJbXBsIFNlYykgY29uc3QgeworICBjb25zdCBFbGZfU2hkciAqUyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRWxmX1NoZHIgKj4oU2VjLnApOworICByZWxvY2F0aW9uX2l0ZXJhdG9yIEJlZ2luID0gc2VjdGlvbl9yZWxfYmVnaW4oU2VjKTsKKyAgaWYgKFMtPnNoX3R5cGUgIT0gRUxGOjpTSFRfUkVMQSAmJiBTLT5zaF90eXBlICE9IEVMRjo6U0hUX1JFTCkKKyAgICByZXR1cm4gQmVnaW47CisgIERhdGFSZWZJbXBsIFJlbERhdGEgPSBCZWdpbi0+Z2V0UmF3RGF0YVJlZkltcGwoKTsKKyAgY29uc3QgRWxmX1NoZHIgKlJlbFNlYyA9IGdldFJlbFNlY3Rpb24oUmVsRGF0YSk7CisKKyAgLy8gRXJyb3IgY2hlY2sgc2hfbGluayBoZXJlIHNvIHRoYXQgZ2V0UmVsb2NhdGlvblN5bWJvbCBjYW4ganVzdCB1c2UgaXQuCisgIGF1dG8gU3ltU2VjT3JFcnIgPSBFRi5nZXRTZWN0aW9uKFJlbFNlYy0+c2hfbGluayk7CisgIGlmICghU3ltU2VjT3JFcnIpCisgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKGVycm9yVG9FcnJvckNvZGUoU3ltU2VjT3JFcnIudGFrZUVycm9yKCkpLm1lc3NhZ2UoKSk7CisKKyAgUmVsRGF0YS5kLmIgKz0gUy0+c2hfc2l6ZSAvIFMtPnNoX2VudHNpemU7CisgIHJldHVybiByZWxvY2F0aW9uX2l0ZXJhdG9yKFJlbG9jYXRpb25SZWYoUmVsRGF0YSwgdGhpcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3NlY3Rpb25faXRlcmF0b3IKK0VMRk9iamVjdEZpbGU8RUxGVD46OmdldFJlbG9jYXRlZFNlY3Rpb24oRGF0YVJlZkltcGwgU2VjKSBjb25zdCB7CisgIGlmIChFRi5nZXRIZWFkZXIoKS0+ZV90eXBlICE9IEVMRjo6RVRfUkVMKQorICAgIHJldHVybiBzZWN0aW9uX2VuZCgpOworCisgIGNvbnN0IEVsZl9TaGRyICpFU2hkciA9IGdldFNlY3Rpb24oU2VjKTsKKyAgdWludFhfdCBUeXBlID0gRVNoZHItPnNoX3R5cGU7CisgIGlmIChUeXBlICE9IEVMRjo6U0hUX1JFTCAmJiBUeXBlICE9IEVMRjo6U0hUX1JFTEEpCisgICAgcmV0dXJuIHNlY3Rpb25fZW5kKCk7CisKKyAgYXV0byBSID0gRUYuZ2V0U2VjdGlvbihFU2hkci0+c2hfaW5mbyk7CisgIGlmICghUikKKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoZXJyb3JUb0Vycm9yQ29kZShSLnRha2VFcnJvcigpKS5tZXNzYWdlKCkpOworICByZXR1cm4gc2VjdGlvbl9pdGVyYXRvcihTZWN0aW9uUmVmKHRvRFJJKCpSKSwgdGhpcykpOworfQorCisvLyBSZWxvY2F0aW9ucwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+Cit2b2lkIEVMRk9iamVjdEZpbGU8RUxGVD46Om1vdmVSZWxvY2F0aW9uTmV4dChEYXRhUmVmSW1wbCAmUmVsKSBjb25zdCB7CisgICsrUmVsLmQuYjsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitzeW1ib2xfaXRlcmF0b3IKK0VMRk9iamVjdEZpbGU8RUxGVD46OmdldFJlbG9jYXRpb25TeW1ib2woRGF0YVJlZkltcGwgUmVsKSBjb25zdCB7CisgIHVpbnQzMl90IHN5bWJvbElkeDsKKyAgY29uc3QgRWxmX1NoZHIgKnNlYyA9IGdldFJlbFNlY3Rpb24oUmVsKTsKKyAgaWYgKHNlYy0+c2hfdHlwZSA9PSBFTEY6OlNIVF9SRUwpCisgICAgc3ltYm9sSWR4ID0gZ2V0UmVsKFJlbCktPmdldFN5bWJvbChFRi5pc01pcHM2NEVMKCkpOworICBlbHNlCisgICAgc3ltYm9sSWR4ID0gZ2V0UmVsYShSZWwpLT5nZXRTeW1ib2woRUYuaXNNaXBzNjRFTCgpKTsKKyAgaWYgKCFzeW1ib2xJZHgpCisgICAgcmV0dXJuIHN5bWJvbF9lbmQoKTsKKworICAvLyBGSVhNRTogZXJyb3IgY2hlY2sgc3ltYm9sSWR4CisgIERhdGFSZWZJbXBsIFN5bWJvbERhdGE7CisgIFN5bWJvbERhdGEuZC5hID0gc2VjLT5zaF9saW5rOworICBTeW1ib2xEYXRhLmQuYiA9IHN5bWJvbElkeDsKKyAgcmV0dXJuIHN5bWJvbF9pdGVyYXRvcihTeW1ib2xSZWYoU3ltYm9sRGF0YSwgdGhpcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3VpbnQ2NF90IEVMRk9iamVjdEZpbGU8RUxGVD46OmdldFJlbG9jYXRpb25PZmZzZXQoRGF0YVJlZkltcGwgUmVsKSBjb25zdCB7CisgIGFzc2VydChFRi5nZXRIZWFkZXIoKS0+ZV90eXBlID09IEVMRjo6RVRfUkVMICYmCisgICAgICAgICAiT25seSByZWxvY2F0YWJsZSBvYmplY3QgZmlsZXMgaGF2ZSByZWxvY2F0aW9uIG9mZnNldHMiKTsKKyAgY29uc3QgRWxmX1NoZHIgKnNlYyA9IGdldFJlbFNlY3Rpb24oUmVsKTsKKyAgaWYgKHNlYy0+c2hfdHlwZSA9PSBFTEY6OlNIVF9SRUwpCisgICAgcmV0dXJuIGdldFJlbChSZWwpLT5yX29mZnNldDsKKworICByZXR1cm4gZ2V0UmVsYShSZWwpLT5yX29mZnNldDsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+Cit1aW50NjRfdCBFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRSZWxvY2F0aW9uVHlwZShEYXRhUmVmSW1wbCBSZWwpIGNvbnN0IHsKKyAgY29uc3QgRWxmX1NoZHIgKnNlYyA9IGdldFJlbFNlY3Rpb24oUmVsKTsKKyAgaWYgKHNlYy0+c2hfdHlwZSA9PSBFTEY6OlNIVF9SRUwpCisgICAgcmV0dXJuIGdldFJlbChSZWwpLT5nZXRUeXBlKEVGLmlzTWlwczY0RUwoKSk7CisgIGVsc2UKKyAgICByZXR1cm4gZ2V0UmVsYShSZWwpLT5nZXRUeXBlKEVGLmlzTWlwczY0RUwoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorU3RyaW5nUmVmIEVMRk9iamVjdEZpbGU8RUxGVD46OmdldFJlbG9jYXRpb25UeXBlTmFtZSh1aW50MzJfdCBUeXBlKSBjb25zdCB7CisgIHJldHVybiBnZXRFTEZSZWxvY2F0aW9uVHlwZU5hbWUoRUYuZ2V0SGVhZGVyKCktPmVfbWFjaGluZSwgVHlwZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordm9pZCBFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRSZWxvY2F0aW9uVHlwZU5hbWUoCisgICAgRGF0YVJlZkltcGwgUmVsLCBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlJlc3VsdCkgY29uc3QgeworICB1aW50MzJfdCB0eXBlID0gZ2V0UmVsb2NhdGlvblR5cGUoUmVsKTsKKyAgRUYuZ2V0UmVsb2NhdGlvblR5cGVOYW1lKHR5cGUsIFJlc3VsdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRXhwZWN0ZWQ8aW50NjRfdD4KK0VMRk9iamVjdEZpbGU8RUxGVD46OmdldFJlbG9jYXRpb25BZGRlbmQoRGF0YVJlZkltcGwgUmVsKSBjb25zdCB7CisgIGlmIChnZXRSZWxTZWN0aW9uKFJlbCktPnNoX3R5cGUgIT0gRUxGOjpTSFRfUkVMQSkKKyAgICByZXR1cm4gY3JlYXRlRXJyb3IoIlNlY3Rpb24gaXMgbm90IFNIVF9SRUxBIik7CisgIHJldHVybiAoaW50NjRfdClnZXRSZWxhKFJlbCktPnJfYWRkZW5kOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK2NvbnN0IHR5cGVuYW1lIEVMRk9iamVjdEZpbGU8RUxGVD46OkVsZl9SZWwgKgorRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0UmVsKERhdGFSZWZJbXBsIFJlbCkgY29uc3QgeworICBhc3NlcnQoZ2V0UmVsU2VjdGlvbihSZWwpLT5zaF90eXBlID09IEVMRjo6U0hUX1JFTCk7CisgIGF1dG8gUmV0ID0gRUYudGVtcGxhdGUgZ2V0RW50cnk8RWxmX1JlbD4oUmVsLmQuYSwgUmVsLmQuYik7CisgIGlmICghUmV0KQorICAgIHJlcG9ydF9mYXRhbF9lcnJvcihlcnJvclRvRXJyb3JDb2RlKFJldC50YWtlRXJyb3IoKSkubWVzc2FnZSgpKTsKKyAgcmV0dXJuICpSZXQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorY29uc3QgdHlwZW5hbWUgRUxGT2JqZWN0RmlsZTxFTEZUPjo6RWxmX1JlbGEgKgorRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0UmVsYShEYXRhUmVmSW1wbCBSZWxhKSBjb25zdCB7CisgIGFzc2VydChnZXRSZWxTZWN0aW9uKFJlbGEpLT5zaF90eXBlID09IEVMRjo6U0hUX1JFTEEpOworICBhdXRvIFJldCA9IEVGLnRlbXBsYXRlIGdldEVudHJ5PEVsZl9SZWxhPihSZWxhLmQuYSwgUmVsYS5kLmIpOworICBpZiAoIVJldCkKKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoZXJyb3JUb0Vycm9yQ29kZShSZXQudGFrZUVycm9yKCkpLm1lc3NhZ2UoKSk7CisgIHJldHVybiAqUmV0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0V4cGVjdGVkPEVMRk9iamVjdEZpbGU8RUxGVD4+CitFTEZPYmplY3RGaWxlPEVMRlQ+OjpjcmVhdGUoTWVtb3J5QnVmZmVyUmVmIE9iamVjdCkgeworICBhdXRvIEVGT3JFcnIgPSBFTEZGaWxlPEVMRlQ+OjpjcmVhdGUoT2JqZWN0LmdldEJ1ZmZlcigpKTsKKyAgaWYgKEVycm9yIEUgPSBFRk9yRXJyLnRha2VFcnJvcigpKQorICAgIHJldHVybiBzdGQ6Om1vdmUoRSk7CisgIGF1dG8gRUYgPSBzdGQ6Om1vdmUoKkVGT3JFcnIpOworCisgIGF1dG8gU2VjdGlvbnNPckVyciA9IEVGLnNlY3Rpb25zKCk7CisgIGlmICghU2VjdGlvbnNPckVycikKKyAgICByZXR1cm4gU2VjdGlvbnNPckVyci50YWtlRXJyb3IoKTsKKworICBjb25zdCBFbGZfU2hkciAqRG90RHluU3ltU2VjID0gbnVsbHB0cjsKKyAgY29uc3QgRWxmX1NoZHIgKkRvdFN5bXRhYlNlYyA9IG51bGxwdHI7CisgIEFycmF5UmVmPEVsZl9Xb3JkPiBTaG5keFRhYmxlOworICBmb3IgKGNvbnN0IEVsZl9TaGRyICZTZWMgOiAqU2VjdGlvbnNPckVycikgeworICAgIHN3aXRjaCAoU2VjLnNoX3R5cGUpIHsKKyAgICBjYXNlIEVMRjo6U0hUX0RZTlNZTTogeworICAgICAgaWYgKERvdER5blN5bVNlYykKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJNb3JlIHRoYW4gb25lIGR5bmFtaWMgc3ltYm9sIHRhYmxlISIpOworICAgICAgRG90RHluU3ltU2VjID0gJlNlYzsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEVMRjo6U0hUX1NZTVRBQjogeworICAgICAgaWYgKERvdFN5bXRhYlNlYykKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJNb3JlIHRoYW4gb25lIHN0YXRpYyBzeW1ib2wgdGFibGUhIik7CisgICAgICBEb3RTeW10YWJTZWMgPSAmU2VjOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRUxGOjpTSFRfU1lNVEFCX1NITkRYOiB7CisgICAgICBhdXRvIFRhYmxlT3JFcnIgPSBFRi5nZXRTSE5EWFRhYmxlKFNlYyk7CisgICAgICBpZiAoIVRhYmxlT3JFcnIpCisgICAgICAgIHJldHVybiBUYWJsZU9yRXJyLnRha2VFcnJvcigpOworICAgICAgU2huZHhUYWJsZSA9ICpUYWJsZU9yRXJyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gRUxGT2JqZWN0RmlsZTxFTEZUPihPYmplY3QsIEVGLCBEb3REeW5TeW1TZWMsIERvdFN5bXRhYlNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2huZHhUYWJsZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRUxGT2JqZWN0RmlsZTxFTEZUPjo6RUxGT2JqZWN0RmlsZShNZW1vcnlCdWZmZXJSZWYgT2JqZWN0LCBFTEZGaWxlPEVMRlQ+IEVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbGZfU2hkciAqRG90RHluU3ltU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbGZfU2hkciAqRG90U3ltdGFiU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFbGZfV29yZD4gU2huZHhUYWJsZSkKKyAgICA6IEVMRk9iamVjdEZpbGVCYXNlKAorICAgICAgICAgIGdldEVMRlR5cGUoRUxGVDo6VGFyZ2V0RW5kaWFubmVzcyA9PSBzdXBwb3J0OjpsaXR0bGUsIEVMRlQ6OklzNjRCaXRzKSwKKyAgICAgICAgICBPYmplY3QpLAorICAgICAgRUYoRUYpLCBEb3REeW5TeW1TZWMoRG90RHluU3ltU2VjKSwgRG90U3ltdGFiU2VjKERvdFN5bXRhYlNlYyksCisgICAgICBTaG5keFRhYmxlKFNobmR4VGFibGUpIHt9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRUxGT2JqZWN0RmlsZTxFTEZUPjo6RUxGT2JqZWN0RmlsZShFTEZPYmplY3RGaWxlPEVMRlQ+ICYmT3RoZXIpCisgICAgOiBFTEZPYmplY3RGaWxlKE90aGVyLkRhdGEsIE90aGVyLkVGLCBPdGhlci5Eb3REeW5TeW1TZWMsCisgICAgICAgICAgICAgICAgICAgIE90aGVyLkRvdFN5bXRhYlNlYywgT3RoZXIuU2huZHhUYWJsZSkge30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitiYXNpY19zeW1ib2xfaXRlcmF0b3IgRUxGT2JqZWN0RmlsZTxFTEZUPjo6c3ltYm9sX2JlZ2luKCkgY29uc3QgeworICBEYXRhUmVmSW1wbCBTeW0gPSB0b0RSSShEb3RTeW10YWJTZWMsIDApOworICByZXR1cm4gYmFzaWNfc3ltYm9sX2l0ZXJhdG9yKFN5bWJvbFJlZihTeW0sIHRoaXMpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitiYXNpY19zeW1ib2xfaXRlcmF0b3IgRUxGT2JqZWN0RmlsZTxFTEZUPjo6c3ltYm9sX2VuZCgpIGNvbnN0IHsKKyAgY29uc3QgRWxmX1NoZHIgKlN5bVRhYiA9IERvdFN5bXRhYlNlYzsKKyAgaWYgKCFTeW1UYWIpCisgICAgcmV0dXJuIHN5bWJvbF9iZWdpbigpOworICBEYXRhUmVmSW1wbCBTeW0gPSB0b0RSSShTeW1UYWIsIFN5bVRhYi0+c2hfc2l6ZSAvIHNpemVvZihFbGZfU3ltKSk7CisgIHJldHVybiBiYXNpY19zeW1ib2xfaXRlcmF0b3IoU3ltYm9sUmVmKFN5bSwgdGhpcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK2VsZl9zeW1ib2xfaXRlcmF0b3IgRUxGT2JqZWN0RmlsZTxFTEZUPjo6ZHluYW1pY19zeW1ib2xfYmVnaW4oKSBjb25zdCB7CisgIERhdGFSZWZJbXBsIFN5bSA9IHRvRFJJKERvdER5blN5bVNlYywgMCk7CisgIHJldHVybiBzeW1ib2xfaXRlcmF0b3IoU3ltYm9sUmVmKFN5bSwgdGhpcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK2VsZl9zeW1ib2xfaXRlcmF0b3IgRUxGT2JqZWN0RmlsZTxFTEZUPjo6ZHluYW1pY19zeW1ib2xfZW5kKCkgY29uc3QgeworICBjb25zdCBFbGZfU2hkciAqU3ltVGFiID0gRG90RHluU3ltU2VjOworICBpZiAoIVN5bVRhYikKKyAgICByZXR1cm4gZHluYW1pY19zeW1ib2xfYmVnaW4oKTsKKyAgRGF0YVJlZkltcGwgU3ltID0gdG9EUkkoU3ltVGFiLCBTeW1UYWItPnNoX3NpemUgLyBzaXplb2YoRWxmX1N5bSkpOworICByZXR1cm4gYmFzaWNfc3ltYm9sX2l0ZXJhdG9yKFN5bWJvbFJlZihTeW0sIHRoaXMpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitzZWN0aW9uX2l0ZXJhdG9yIEVMRk9iamVjdEZpbGU8RUxGVD46OnNlY3Rpb25fYmVnaW4oKSBjb25zdCB7CisgIGF1dG8gU2VjdGlvbnNPckVyciA9IEVGLnNlY3Rpb25zKCk7CisgIGlmICghU2VjdGlvbnNPckVycikKKyAgICByZXR1cm4gc2VjdGlvbl9pdGVyYXRvcihTZWN0aW9uUmVmKCkpOworICByZXR1cm4gc2VjdGlvbl9pdGVyYXRvcihTZWN0aW9uUmVmKHRvRFJJKCgqU2VjdGlvbnNPckVycikuYmVnaW4oKSksIHRoaXMpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitzZWN0aW9uX2l0ZXJhdG9yIEVMRk9iamVjdEZpbGU8RUxGVD46OnNlY3Rpb25fZW5kKCkgY29uc3QgeworICBhdXRvIFNlY3Rpb25zT3JFcnIgPSBFRi5zZWN0aW9ucygpOworICBpZiAoIVNlY3Rpb25zT3JFcnIpCisgICAgcmV0dXJuIHNlY3Rpb25faXRlcmF0b3IoU2VjdGlvblJlZigpKTsKKyAgcmV0dXJuIHNlY3Rpb25faXRlcmF0b3IoU2VjdGlvblJlZih0b0RSSSgoKlNlY3Rpb25zT3JFcnIpLmVuZCgpKSwgdGhpcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3VpbnQ4X3QgRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0Qnl0ZXNJbkFkZHJlc3MoKSBjb25zdCB7CisgIHJldHVybiBFTEZUOjpJczY0Qml0cyA/IDggOiA0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK1N0cmluZ1JlZiBFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRGaWxlRm9ybWF0TmFtZSgpIGNvbnN0IHsKKyAgYm9vbCBJc0xpdHRsZUVuZGlhbiA9IEVMRlQ6OlRhcmdldEVuZGlhbm5lc3MgPT0gc3VwcG9ydDo6bGl0dGxlOworICBzd2l0Y2ggKEVGLmdldEhlYWRlcigpLT5lX2lkZW50W0VMRjo6RUlfQ0xBU1NdKSB7CisgIGNhc2UgRUxGOjpFTEZDTEFTUzMyOgorICAgIHN3aXRjaCAoRUYuZ2V0SGVhZGVyKCktPmVfbWFjaGluZSkgeworICAgIGNhc2UgRUxGOjpFTV8zODY6CisgICAgICByZXR1cm4gIkVMRjMyLWkzODYiOworICAgIGNhc2UgRUxGOjpFTV9JQU1DVToKKyAgICAgIHJldHVybiAiRUxGMzItaWFtY3UiOworICAgIGNhc2UgRUxGOjpFTV9YODZfNjQ6CisgICAgICByZXR1cm4gIkVMRjMyLXg4Ni02NCI7CisgICAgY2FzZSBFTEY6OkVNX0FSTToKKyAgICAgIHJldHVybiAoSXNMaXR0bGVFbmRpYW4gPyAiRUxGMzItYXJtLWxpdHRsZSIgOiAiRUxGMzItYXJtLWJpZyIpOworICAgIGNhc2UgRUxGOjpFTV9BVlI6CisgICAgICByZXR1cm4gIkVMRjMyLWF2ciI7CisgICAgY2FzZSBFTEY6OkVNX0hFWEFHT046CisgICAgICByZXR1cm4gIkVMRjMyLWhleGFnb24iOworICAgIGNhc2UgRUxGOjpFTV9MQU5BSToKKyAgICAgIHJldHVybiAiRUxGMzItbGFuYWkiOworICAgIGNhc2UgRUxGOjpFTV9NSVBTOgorICAgICAgcmV0dXJuICJFTEYzMi1taXBzIjsKKyAgICBjYXNlIEVMRjo6RU1fUFBDOgorICAgICAgcmV0dXJuICJFTEYzMi1wcGMiOworICAgIGNhc2UgRUxGOjpFTV9SSVNDVjoKKyAgICAgIHJldHVybiAiRUxGMzItcmlzY3YiOworICAgIGNhc2UgRUxGOjpFTV9TUEFSQzoKKyAgICBjYXNlIEVMRjo6RU1fU1BBUkMzMlBMVVM6CisgICAgICByZXR1cm4gIkVMRjMyLXNwYXJjIjsKKyAgICBjYXNlIEVMRjo6RU1fV0VCQVNTRU1CTFk6CisgICAgICByZXR1cm4gIkVMRjMyLXdhc20iOworICAgIGNhc2UgRUxGOjpFTV9BTURHUFU6CisgICAgICByZXR1cm4gIkVMRjMyLWFtZGdwdSI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiRUxGMzItdW5rbm93biI7CisgICAgfQorICBjYXNlIEVMRjo6RUxGQ0xBU1M2NDoKKyAgICBzd2l0Y2ggKEVGLmdldEhlYWRlcigpLT5lX21hY2hpbmUpIHsKKyAgICBjYXNlIEVMRjo6RU1fMzg2OgorICAgICAgcmV0dXJuICJFTEY2NC1pMzg2IjsKKyAgICBjYXNlIEVMRjo6RU1fWDg2XzY0OgorICAgICAgcmV0dXJuICJFTEY2NC14ODYtNjQiOworICAgIGNhc2UgRUxGOjpFTV9BQVJDSDY0OgorICAgICAgcmV0dXJuIChJc0xpdHRsZUVuZGlhbiA/ICJFTEY2NC1hYXJjaDY0LWxpdHRsZSIgOiAiRUxGNjQtYWFyY2g2NC1iaWciKTsKKyAgICBjYXNlIEVMRjo6RU1fUFBDNjQ6CisgICAgICByZXR1cm4gIkVMRjY0LXBwYzY0IjsKKyAgICBjYXNlIEVMRjo6RU1fUklTQ1Y6CisgICAgICByZXR1cm4gIkVMRjY0LXJpc2N2IjsKKyAgICBjYXNlIEVMRjo6RU1fUzM5MDoKKyAgICAgIHJldHVybiAiRUxGNjQtczM5MCI7CisgICAgY2FzZSBFTEY6OkVNX1NQQVJDVjk6CisgICAgICByZXR1cm4gIkVMRjY0LXNwYXJjIjsKKyAgICBjYXNlIEVMRjo6RU1fTUlQUzoKKyAgICAgIHJldHVybiAiRUxGNjQtbWlwcyI7CisgICAgY2FzZSBFTEY6OkVNX1dFQkFTU0VNQkxZOgorICAgICAgcmV0dXJuICJFTEY2NC13YXNtIjsKKyAgICBjYXNlIEVMRjo6RU1fQU1ER1BVOgorICAgICAgcmV0dXJuICJFTEY2NC1hbWRncHUiOworICAgIGNhc2UgRUxGOjpFTV9CUEY6CisgICAgICByZXR1cm4gIkVMRjY0LUJQRiI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiRUxGNjQtdW5rbm93biI7CisgICAgfQorICBkZWZhdWx0OgorICAgIC8vIEZJWE1FOiBQcm9wZXIgZXJyb3IgaGFuZGxpbmcuCisgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJJbnZhbGlkIEVMRkNMQVNTISIpOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBUcmlwbGU6OkFyY2hUeXBlIEVMRk9iamVjdEZpbGU8RUxGVD46OmdldEFyY2goKSBjb25zdCB7CisgIGJvb2wgSXNMaXR0bGVFbmRpYW4gPSBFTEZUOjpUYXJnZXRFbmRpYW5uZXNzID09IHN1cHBvcnQ6OmxpdHRsZTsKKyAgc3dpdGNoIChFRi5nZXRIZWFkZXIoKS0+ZV9tYWNoaW5lKSB7CisgIGNhc2UgRUxGOjpFTV8zODY6CisgIGNhc2UgRUxGOjpFTV9JQU1DVToKKyAgICByZXR1cm4gVHJpcGxlOjp4ODY7CisgIGNhc2UgRUxGOjpFTV9YODZfNjQ6CisgICAgcmV0dXJuIFRyaXBsZTo6eDg2XzY0OworICBjYXNlIEVMRjo6RU1fQUFSQ0g2NDoKKyAgICByZXR1cm4gSXNMaXR0bGVFbmRpYW4gPyBUcmlwbGU6OmFhcmNoNjQgOiBUcmlwbGU6OmFhcmNoNjRfYmU7CisgIGNhc2UgRUxGOjpFTV9BUk06CisgICAgcmV0dXJuIFRyaXBsZTo6YXJtOworICBjYXNlIEVMRjo6RU1fQVZSOgorICAgIHJldHVybiBUcmlwbGU6OmF2cjsKKyAgY2FzZSBFTEY6OkVNX0hFWEFHT046CisgICAgcmV0dXJuIFRyaXBsZTo6aGV4YWdvbjsKKyAgY2FzZSBFTEY6OkVNX0xBTkFJOgorICAgIHJldHVybiBUcmlwbGU6OmxhbmFpOworICBjYXNlIEVMRjo6RU1fTUlQUzoKKyAgICBzd2l0Y2ggKEVGLmdldEhlYWRlcigpLT5lX2lkZW50W0VMRjo6RUlfQ0xBU1NdKSB7CisgICAgY2FzZSBFTEY6OkVMRkNMQVNTMzI6CisgICAgICByZXR1cm4gSXNMaXR0bGVFbmRpYW4gPyBUcmlwbGU6Om1pcHNlbCA6IFRyaXBsZTo6bWlwczsKKyAgICBjYXNlIEVMRjo6RUxGQ0xBU1M2NDoKKyAgICAgIHJldHVybiBJc0xpdHRsZUVuZGlhbiA/IFRyaXBsZTo6bWlwczY0ZWwgOiBUcmlwbGU6Om1pcHM2NDsKKyAgICBkZWZhdWx0OgorICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJJbnZhbGlkIEVMRkNMQVNTISIpOworICAgIH0KKyAgY2FzZSBFTEY6OkVNX1BQQzoKKyAgICByZXR1cm4gVHJpcGxlOjpwcGM7CisgIGNhc2UgRUxGOjpFTV9QUEM2NDoKKyAgICByZXR1cm4gSXNMaXR0bGVFbmRpYW4gPyBUcmlwbGU6OnBwYzY0bGUgOiBUcmlwbGU6OnBwYzY0OworICBjYXNlIEVMRjo6RU1fUklTQ1Y6CisgICAgc3dpdGNoIChFRi5nZXRIZWFkZXIoKS0+ZV9pZGVudFtFTEY6OkVJX0NMQVNTXSkgeworICAgIGNhc2UgRUxGOjpFTEZDTEFTUzMyOgorICAgICAgcmV0dXJuIFRyaXBsZTo6cmlzY3YzMjsKKyAgICBjYXNlIEVMRjo6RUxGQ0xBU1M2NDoKKyAgICAgIHJldHVybiBUcmlwbGU6OnJpc2N2NjQ7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiSW52YWxpZCBFTEZDTEFTUyEiKTsKKyAgICB9CisgIGNhc2UgRUxGOjpFTV9TMzkwOgorICAgIHJldHVybiBUcmlwbGU6OnN5c3RlbXo7CisKKyAgY2FzZSBFTEY6OkVNX1NQQVJDOgorICBjYXNlIEVMRjo6RU1fU1BBUkMzMlBMVVM6CisgICAgcmV0dXJuIElzTGl0dGxlRW5kaWFuID8gVHJpcGxlOjpzcGFyY2VsIDogVHJpcGxlOjpzcGFyYzsKKyAgY2FzZSBFTEY6OkVNX1NQQVJDVjk6CisgICAgcmV0dXJuIFRyaXBsZTo6c3BhcmN2OTsKKyAgY2FzZSBFTEY6OkVNX1dFQkFTU0VNQkxZOgorICAgIHN3aXRjaCAoRUYuZ2V0SGVhZGVyKCktPmVfaWRlbnRbRUxGOjpFSV9DTEFTU10pIHsKKyAgICBjYXNlIEVMRjo6RUxGQ0xBU1MzMjogcmV0dXJuIFRyaXBsZTo6d2FzbTMyOworICAgIGNhc2UgRUxGOjpFTEZDTEFTUzY0OiByZXR1cm4gVHJpcGxlOjp3YXNtNjQ7CisgICAgZGVmYXVsdDogcmV0dXJuIFRyaXBsZTo6VW5rbm93bkFyY2g7CisgICAgfQorCisgIGNhc2UgRUxGOjpFTV9BTURHUFU6IHsKKyAgICBpZiAoIUlzTGl0dGxlRW5kaWFuKQorICAgICAgcmV0dXJuIFRyaXBsZTo6VW5rbm93bkFyY2g7CisKKyAgICB1bnNpZ25lZCBNQUNIID0gRUYuZ2V0SGVhZGVyKCktPmVfZmxhZ3MgJiBFTEY6OkVGX0FNREdQVV9NQUNIOworICAgIGlmIChNQUNIID49IEVMRjo6RUZfQU1ER1BVX01BQ0hfUjYwMF9GSVJTVCAmJgorICAgICAgICBNQUNIIDw9IEVMRjo6RUZfQU1ER1BVX01BQ0hfUjYwMF9MQVNUKQorICAgICAgcmV0dXJuIFRyaXBsZTo6cjYwMDsKKyAgICBpZiAoTUFDSCA+PSBFTEY6OkVGX0FNREdQVV9NQUNIX0FNREdDTl9GSVJTVCAmJgorICAgICAgICBNQUNIIDw9IEVMRjo6RUZfQU1ER1BVX01BQ0hfQU1ER0NOX0xBU1QpCisgICAgICByZXR1cm4gVHJpcGxlOjphbWRnY247CisKKyAgICByZXR1cm4gVHJpcGxlOjpVbmtub3duQXJjaDsKKyAgfQorCisgIGNhc2UgRUxGOjpFTV9CUEY6CisgICAgcmV0dXJuIElzTGl0dGxlRW5kaWFuID8gVHJpcGxlOjpicGZlbCA6IFRyaXBsZTo6YnBmZWI7CisKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gVHJpcGxlOjpVbmtub3duQXJjaDsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0VMRk9iamVjdEZpbGVCYXNlOjplbGZfc3ltYm9sX2l0ZXJhdG9yX3JhbmdlCitFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXREeW5hbWljU3ltYm9sSXRlcmF0b3JzKCkgY29uc3QgeworICByZXR1cm4gbWFrZV9yYW5nZShkeW5hbWljX3N5bWJvbF9iZWdpbigpLCBkeW5hbWljX3N5bWJvbF9lbmQoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBib29sIEVMRk9iamVjdEZpbGU8RUxGVD46OmlzUmVsb2NhdGFibGVPYmplY3QoKSBjb25zdCB7CisgIHJldHVybiBFRi5nZXRIZWFkZXIoKS0+ZV90eXBlID09IEVMRjo6RVRfUkVMOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2Ugb2JqZWN0Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RfRUxGT0JKRUNURklMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9FTEZUeXBlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvRUxGVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjBjYTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvRUxGVHlwZXMuaApAQCAtMCwwICsxLDc0MCBAQAorLy89PT0tIEVMRlR5cGVzLmggLSBFbmRpYW4gc3BlY2lmaWMgdHlwZXMgZm9yIEVMRiAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVF9FTEZUWVBFU19ICisjZGVmaW5lIExMVk1fT0JKRUNUX0VMRlRZUEVTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRUxGLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvYmplY3QgeworCit1c2luZyBzdXBwb3J0OjplbmRpYW5uZXNzOworCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4gc3RydWN0IEVsZl9FaGRyX0ltcGw7Cit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4gc3RydWN0IEVsZl9TaGRyX0ltcGw7Cit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4gc3RydWN0IEVsZl9TeW1fSW1wbDsKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBzdHJ1Y3QgRWxmX0R5bl9JbXBsOwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+IHN0cnVjdCBFbGZfUGhkcl9JbXBsOwordGVtcGxhdGUgPGNsYXNzIEVMRlQsIGJvb2wgaXNSZWxhPiBzdHJ1Y3QgRWxmX1JlbF9JbXBsOwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+IHN0cnVjdCBFbGZfVmVyZGVmX0ltcGw7Cit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4gc3RydWN0IEVsZl9WZXJkYXV4X0ltcGw7Cit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4gc3RydWN0IEVsZl9WZXJuZWVkX0ltcGw7Cit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4gc3RydWN0IEVsZl9WZXJuYXV4X0ltcGw7Cit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4gc3RydWN0IEVsZl9WZXJzeW1fSW1wbDsKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBzdHJ1Y3QgRWxmX0hhc2hfSW1wbDsKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBzdHJ1Y3QgRWxmX0dudUhhc2hfSW1wbDsKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBzdHJ1Y3QgRWxmX0NoZHJfSW1wbDsKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBzdHJ1Y3QgRWxmX05oZHJfSW1wbDsKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBjbGFzcyBFbGZfTm90ZV9JbXBsOwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+IGNsYXNzIEVsZl9Ob3RlX0l0ZXJhdG9yX0ltcGw7CisKK3RlbXBsYXRlIDxlbmRpYW5uZXNzIEUsIGJvb2wgSXM2ND4gc3RydWN0IEVMRlR5cGUgeworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5PgorICB1c2luZyBwYWNrZWQgPSBzdXBwb3J0OjpkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8VHksIEUsIDE+OworCitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBlbmRpYW5uZXNzIFRhcmdldEVuZGlhbm5lc3MgPSBFOworICBzdGF0aWMgY29uc3QgYm9vbCBJczY0Qml0cyA9IElzNjQ7CisKKyAgdXNpbmcgdWludCA9IHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8SXM2NCwgdWludDY0X3QsIHVpbnQzMl90Pjo6dHlwZTsKKyAgdXNpbmcgRWhkciA9IEVsZl9FaGRyX0ltcGw8RUxGVHlwZTxFLCBJczY0Pj47CisgIHVzaW5nIFNoZHIgPSBFbGZfU2hkcl9JbXBsPEVMRlR5cGU8RSwgSXM2ND4+OworICB1c2luZyBTeW0gPSBFbGZfU3ltX0ltcGw8RUxGVHlwZTxFLCBJczY0Pj47CisgIHVzaW5nIER5biA9IEVsZl9EeW5fSW1wbDxFTEZUeXBlPEUsIElzNjQ+PjsKKyAgdXNpbmcgUGhkciA9IEVsZl9QaGRyX0ltcGw8RUxGVHlwZTxFLCBJczY0Pj47CisgIHVzaW5nIFJlbCA9IEVsZl9SZWxfSW1wbDxFTEZUeXBlPEUsIElzNjQ+LCBmYWxzZT47CisgIHVzaW5nIFJlbGEgPSBFbGZfUmVsX0ltcGw8RUxGVHlwZTxFLCBJczY0PiwgdHJ1ZT47CisgIHVzaW5nIFZlcmRlZiA9IEVsZl9WZXJkZWZfSW1wbDxFTEZUeXBlPEUsIElzNjQ+PjsKKyAgdXNpbmcgVmVyZGF1eCA9IEVsZl9WZXJkYXV4X0ltcGw8RUxGVHlwZTxFLCBJczY0Pj47CisgIHVzaW5nIFZlcm5lZWQgPSBFbGZfVmVybmVlZF9JbXBsPEVMRlR5cGU8RSwgSXM2ND4+OworICB1c2luZyBWZXJuYXV4ID0gRWxmX1Zlcm5hdXhfSW1wbDxFTEZUeXBlPEUsIElzNjQ+PjsKKyAgdXNpbmcgVmVyc3ltID0gRWxmX1ZlcnN5bV9JbXBsPEVMRlR5cGU8RSwgSXM2ND4+OworICB1c2luZyBIYXNoID0gRWxmX0hhc2hfSW1wbDxFTEZUeXBlPEUsIElzNjQ+PjsKKyAgdXNpbmcgR251SGFzaCA9IEVsZl9HbnVIYXNoX0ltcGw8RUxGVHlwZTxFLCBJczY0Pj47CisgIHVzaW5nIENoZHIgPSBFbGZfQ2hkcl9JbXBsPEVMRlR5cGU8RSwgSXM2ND4+OworICB1c2luZyBOaGRyID0gRWxmX05oZHJfSW1wbDxFTEZUeXBlPEUsIElzNjQ+PjsKKyAgdXNpbmcgTm90ZSA9IEVsZl9Ob3RlX0ltcGw8RUxGVHlwZTxFLCBJczY0Pj47CisgIHVzaW5nIE5vdGVJdGVyYXRvciA9IEVsZl9Ob3RlX0l0ZXJhdG9yX0ltcGw8RUxGVHlwZTxFLCBJczY0Pj47CisgIHVzaW5nIER5blJhbmdlID0gQXJyYXlSZWY8RHluPjsKKyAgdXNpbmcgU2hkclJhbmdlID0gQXJyYXlSZWY8U2hkcj47CisgIHVzaW5nIFN5bVJhbmdlID0gQXJyYXlSZWY8U3ltPjsKKyAgdXNpbmcgUmVsUmFuZ2UgPSBBcnJheVJlZjxSZWw+OworICB1c2luZyBSZWxhUmFuZ2UgPSBBcnJheVJlZjxSZWxhPjsKKyAgdXNpbmcgUGhkclJhbmdlID0gQXJyYXlSZWY8UGhkcj47CisKKyAgdXNpbmcgSGFsZiA9IHBhY2tlZDx1aW50MTZfdD47CisgIHVzaW5nIFdvcmQgPSBwYWNrZWQ8dWludDMyX3Q+OworICB1c2luZyBTd29yZCA9IHBhY2tlZDxpbnQzMl90PjsKKyAgdXNpbmcgWHdvcmQgPSBwYWNrZWQ8dWludDY0X3Q+OworICB1c2luZyBTeHdvcmQgPSBwYWNrZWQ8aW50NjRfdD47CisgIHVzaW5nIEFkZHIgPSBwYWNrZWQ8dWludD47CisgIHVzaW5nIE9mZiA9IHBhY2tlZDx1aW50PjsKK307CisKK3VzaW5nIEVMRjMyTEUgPSBFTEZUeXBlPHN1cHBvcnQ6OmxpdHRsZSwgZmFsc2U+OwordXNpbmcgRUxGMzJCRSA9IEVMRlR5cGU8c3VwcG9ydDo6YmlnLCBmYWxzZT47Cit1c2luZyBFTEY2NExFID0gRUxGVHlwZTxzdXBwb3J0OjpsaXR0bGUsIHRydWU+OwordXNpbmcgRUxGNjRCRSA9IEVMRlR5cGU8c3VwcG9ydDo6YmlnLCB0cnVlPjsKKworLy8gVXNlIGFuIGFsaWdubWVudCBvZiAyIGZvciB0aGUgdHlwZWRlZnMgc2luY2UgdGhhdCBpcyB0aGUgd29yc3QgY2FzZSBmb3IKKy8vIEVMRiBmaWxlcyBpbiBhcmNoaXZlcy4KKworLy8gSSByZWFsbHkgZG9uJ3QgbGlrZSBkb2luZyB0aGlzLCBidXQgdGhlIGFsdGVybmF0aXZlIGlzIGNvcHlwYXN0YS4KKyNkZWZpbmUgTExWTV9FTEZfSU1QT1JUX1RZUEVTX0VMRlQoRUxGVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVzaW5nIEVsZl9BZGRyID0gdHlwZW5hbWUgRUxGVDo6QWRkcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1c2luZyBFbGZfT2ZmID0gdHlwZW5hbWUgRUxGVDo6T2ZmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdXNpbmcgRWxmX0hhbGYgPSB0eXBlbmFtZSBFTEZUOjpIYWxmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVzaW5nIEVsZl9Xb3JkID0gdHlwZW5hbWUgRUxGVDo6V29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1c2luZyBFbGZfU3dvcmQgPSB0eXBlbmFtZSBFTEZUOjpTd29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdXNpbmcgRWxmX1h3b3JkID0gdHlwZW5hbWUgRUxGVDo6WHdvcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVzaW5nIEVsZl9TeHdvcmQgPSB0eXBlbmFtZSBFTEZUOjpTeHdvcmQ7CisKKyNkZWZpbmUgTExWTV9FTEZfQ09NTUEgLAorI2RlZmluZSBMTFZNX0VMRl9JTVBPUlRfVFlQRVMoRSwgVykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTX0VMRlQoRUxGVHlwZTxFIExMVk1fRUxGX0NPTU1BIFc+KQorCisvLyBTZWN0aW9uIGhlYWRlci4KK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBzdHJ1Y3QgRWxmX1NoZHJfQmFzZTsKKwordGVtcGxhdGUgPGVuZGlhbm5lc3MgVGFyZ2V0RW5kaWFubmVzcz4KK3N0cnVjdCBFbGZfU2hkcl9CYXNlPEVMRlR5cGU8VGFyZ2V0RW5kaWFubmVzcywgZmFsc2U+PiB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFUyhUYXJnZXRFbmRpYW5uZXNzLCBmYWxzZSkKKyAgRWxmX1dvcmQgc2hfbmFtZTsgICAgICAvLyBTZWN0aW9uIG5hbWUgKGluZGV4IGludG8gc3RyaW5nIHRhYmxlKQorICBFbGZfV29yZCBzaF90eXBlOyAgICAgIC8vIFNlY3Rpb24gdHlwZSAoU0hUXyopCisgIEVsZl9Xb3JkIHNoX2ZsYWdzOyAgICAgLy8gU2VjdGlvbiBmbGFncyAoU0hGXyopCisgIEVsZl9BZGRyIHNoX2FkZHI7ICAgICAgLy8gQWRkcmVzcyB3aGVyZSBzZWN0aW9uIGlzIHRvIGJlIGxvYWRlZAorICBFbGZfT2ZmIHNoX29mZnNldDsgICAgIC8vIEZpbGUgb2Zmc2V0IG9mIHNlY3Rpb24gZGF0YSwgaW4gYnl0ZXMKKyAgRWxmX1dvcmQgc2hfc2l6ZTsgICAgICAvLyBTaXplIG9mIHNlY3Rpb24sIGluIGJ5dGVzCisgIEVsZl9Xb3JkIHNoX2xpbms7ICAgICAgLy8gU2VjdGlvbiB0eXBlLXNwZWNpZmljIGhlYWRlciB0YWJsZSBpbmRleCBsaW5rCisgIEVsZl9Xb3JkIHNoX2luZm87ICAgICAgLy8gU2VjdGlvbiB0eXBlLXNwZWNpZmljIGV4dHJhIGluZm9ybWF0aW9uCisgIEVsZl9Xb3JkIHNoX2FkZHJhbGlnbjsgLy8gU2VjdGlvbiBhZGRyZXNzIGFsaWdubWVudAorICBFbGZfV29yZCBzaF9lbnRzaXplOyAgIC8vIFNpemUgb2YgcmVjb3JkcyBjb250YWluZWQgd2l0aGluIHRoZSBzZWN0aW9uCit9OworCit0ZW1wbGF0ZSA8ZW5kaWFubmVzcyBUYXJnZXRFbmRpYW5uZXNzPgorc3RydWN0IEVsZl9TaGRyX0Jhc2U8RUxGVHlwZTxUYXJnZXRFbmRpYW5uZXNzLCB0cnVlPj4geworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVMoVGFyZ2V0RW5kaWFubmVzcywgdHJ1ZSkKKyAgRWxmX1dvcmQgc2hfbmFtZTsgICAgICAgLy8gU2VjdGlvbiBuYW1lIChpbmRleCBpbnRvIHN0cmluZyB0YWJsZSkKKyAgRWxmX1dvcmQgc2hfdHlwZTsgICAgICAgLy8gU2VjdGlvbiB0eXBlIChTSFRfKikKKyAgRWxmX1h3b3JkIHNoX2ZsYWdzOyAgICAgLy8gU2VjdGlvbiBmbGFncyAoU0hGXyopCisgIEVsZl9BZGRyIHNoX2FkZHI7ICAgICAgIC8vIEFkZHJlc3Mgd2hlcmUgc2VjdGlvbiBpcyB0byBiZSBsb2FkZWQKKyAgRWxmX09mZiBzaF9vZmZzZXQ7ICAgICAgLy8gRmlsZSBvZmZzZXQgb2Ygc2VjdGlvbiBkYXRhLCBpbiBieXRlcworICBFbGZfWHdvcmQgc2hfc2l6ZTsgICAgICAvLyBTaXplIG9mIHNlY3Rpb24sIGluIGJ5dGVzCisgIEVsZl9Xb3JkIHNoX2xpbms7ICAgICAgIC8vIFNlY3Rpb24gdHlwZS1zcGVjaWZpYyBoZWFkZXIgdGFibGUgaW5kZXggbGluaworICBFbGZfV29yZCBzaF9pbmZvOyAgICAgICAvLyBTZWN0aW9uIHR5cGUtc3BlY2lmaWMgZXh0cmEgaW5mb3JtYXRpb24KKyAgRWxmX1h3b3JkIHNoX2FkZHJhbGlnbjsgLy8gU2VjdGlvbiBhZGRyZXNzIGFsaWdubWVudAorICBFbGZfWHdvcmQgc2hfZW50c2l6ZTsgICAvLyBTaXplIG9mIHJlY29yZHMgY29udGFpbmVkIHdpdGhpbiB0aGUgc2VjdGlvbgorfTsKKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitzdHJ1Y3QgRWxmX1NoZHJfSW1wbCA6IEVsZl9TaGRyX0Jhc2U8RUxGVD4geworICB1c2luZyBFbGZfU2hkcl9CYXNlPEVMRlQ+OjpzaF9lbnRzaXplOworICB1c2luZyBFbGZfU2hkcl9CYXNlPEVMRlQ+OjpzaF9zaXplOworCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgZW50aXRpZXMgdGhpcyBzZWN0aW9uIGNvbnRhaW5zIGlmIGl0IGhhcyBhbnkuCisgIHVuc2lnbmVkIGdldEVudGl0eUNvdW50KCkgY29uc3QgeworICAgIGlmIChzaF9lbnRzaXplID09IDApCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc2hfc2l6ZSAvIHNoX2VudHNpemU7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBzdHJ1Y3QgRWxmX1N5bV9CYXNlOworCit0ZW1wbGF0ZSA8ZW5kaWFubmVzcyBUYXJnZXRFbmRpYW5uZXNzPgorc3RydWN0IEVsZl9TeW1fQmFzZTxFTEZUeXBlPFRhcmdldEVuZGlhbm5lc3MsIGZhbHNlPj4geworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVMoVGFyZ2V0RW5kaWFubmVzcywgZmFsc2UpCisgIEVsZl9Xb3JkIHN0X25hbWU7ICAgICAgIC8vIFN5bWJvbCBuYW1lIChpbmRleCBpbnRvIHN0cmluZyB0YWJsZSkKKyAgRWxmX0FkZHIgc3RfdmFsdWU7ICAgICAgLy8gVmFsdWUgb3IgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN5bWJvbAorICBFbGZfV29yZCBzdF9zaXplOyAgICAgICAvLyBTaXplIG9mIHRoZSBzeW1ib2wKKyAgdW5zaWduZWQgY2hhciBzdF9pbmZvOyAgLy8gU3ltYm9sJ3MgdHlwZSBhbmQgYmluZGluZyBhdHRyaWJ1dGVzCisgIHVuc2lnbmVkIGNoYXIgc3Rfb3RoZXI7IC8vIE11c3QgYmUgemVybzsgcmVzZXJ2ZWQKKyAgRWxmX0hhbGYgc3Rfc2huZHg7ICAgICAgLy8gV2hpY2ggc2VjdGlvbiAoaGVhZGVyIHRhYmxlIGluZGV4KSBpdCdzIGRlZmluZWQgaW4KK307CisKK3RlbXBsYXRlIDxlbmRpYW5uZXNzIFRhcmdldEVuZGlhbm5lc3M+CitzdHJ1Y3QgRWxmX1N5bV9CYXNlPEVMRlR5cGU8VGFyZ2V0RW5kaWFubmVzcywgdHJ1ZT4+IHsKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTKFRhcmdldEVuZGlhbm5lc3MsIHRydWUpCisgIEVsZl9Xb3JkIHN0X25hbWU7ICAgICAgIC8vIFN5bWJvbCBuYW1lIChpbmRleCBpbnRvIHN0cmluZyB0YWJsZSkKKyAgdW5zaWduZWQgY2hhciBzdF9pbmZvOyAgLy8gU3ltYm9sJ3MgdHlwZSBhbmQgYmluZGluZyBhdHRyaWJ1dGVzCisgIHVuc2lnbmVkIGNoYXIgc3Rfb3RoZXI7IC8vIE11c3QgYmUgemVybzsgcmVzZXJ2ZWQKKyAgRWxmX0hhbGYgc3Rfc2huZHg7ICAgICAgLy8gV2hpY2ggc2VjdGlvbiAoaGVhZGVyIHRhYmxlIGluZGV4KSBpdCdzIGRlZmluZWQgaW4KKyAgRWxmX0FkZHIgc3RfdmFsdWU7ICAgICAgLy8gVmFsdWUgb3IgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN5bWJvbAorICBFbGZfWHdvcmQgc3Rfc2l6ZTsgICAgICAvLyBTaXplIG9mIHRoZSBzeW1ib2wKK307CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorc3RydWN0IEVsZl9TeW1fSW1wbCA6IEVsZl9TeW1fQmFzZTxFTEZUPiB7CisgIHVzaW5nIEVsZl9TeW1fQmFzZTxFTEZUPjo6c3RfaW5mbzsKKyAgdXNpbmcgRWxmX1N5bV9CYXNlPEVMRlQ+OjpzdF9zaG5keDsKKyAgdXNpbmcgRWxmX1N5bV9CYXNlPEVMRlQ+OjpzdF9vdGhlcjsKKyAgdXNpbmcgRWxmX1N5bV9CYXNlPEVMRlQ+OjpzdF92YWx1ZTsKKworICAvLyBUaGVzZSBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzIGNvcnJlc3BvbmQgdG8gdGhlIEVMRjMyX1NUX0JJTkQsCisgIC8vIEVMRjMyX1NUX1RZUEUsIGFuZCBFTEYzMl9TVF9JTkZPIG1hY3JvcyBkZWZpbmVkIGluIHRoZSBFTEYgc3BlY2lmaWNhdGlvbjoKKyAgdW5zaWduZWQgY2hhciBnZXRCaW5kaW5nKCkgY29uc3QgeyByZXR1cm4gc3RfaW5mbyA+PiA0OyB9CisgIHVuc2lnbmVkIGNoYXIgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHN0X2luZm8gJiAweDBmOyB9CisgIHVpbnQ2NF90IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gc3RfdmFsdWU7IH0KKyAgdm9pZCBzZXRCaW5kaW5nKHVuc2lnbmVkIGNoYXIgYikgeyBzZXRCaW5kaW5nQW5kVHlwZShiLCBnZXRUeXBlKCkpOyB9CisgIHZvaWQgc2V0VHlwZSh1bnNpZ25lZCBjaGFyIHQpIHsgc2V0QmluZGluZ0FuZFR5cGUoZ2V0QmluZGluZygpLCB0KTsgfQorCisgIHZvaWQgc2V0QmluZGluZ0FuZFR5cGUodW5zaWduZWQgY2hhciBiLCB1bnNpZ25lZCBjaGFyIHQpIHsKKyAgICBzdF9pbmZvID0gKGIgPDwgNCkgKyAodCAmIDB4MGYpOworICB9CisKKyAgLy8vIEFjY2VzcyB0byB0aGUgU1RWX3h4eCBmbGFnIHN0b3JlZCBpbiB0aGUgZmlyc3QgdHdvIGJpdHMgb2Ygc3Rfb3RoZXIuCisgIC8vLyBTVFZfREVGQVVMVDogMAorICAvLy8gU1RWX0lOVEVSTkFMOiAxCisgIC8vLyBTVFZfSElEREVOOiAyCisgIC8vLyBTVFZfUFJPVEVDVEVEOiAzCisgIHVuc2lnbmVkIGNoYXIgZ2V0VmlzaWJpbGl0eSgpIGNvbnN0IHsgcmV0dXJuIHN0X290aGVyICYgMHgzOyB9CisgIHZvaWQgc2V0VmlzaWJpbGl0eSh1bnNpZ25lZCBjaGFyIHYpIHsKKyAgICBhc3NlcnQodiA8IDQgJiYgIkludmFsaWQgdmFsdWUgZm9yIHZpc2liaWxpdHkiKTsKKyAgICBzdF9vdGhlciA9IChzdF9vdGhlciAmIH4weDMpIHwgdjsKKyAgfQorCisgIGJvb2wgaXNBYnNvbHV0ZSgpIGNvbnN0IHsgcmV0dXJuIHN0X3NobmR4ID09IEVMRjo6U0hOX0FCUzsgfQorCisgIGJvb2wgaXNDb21tb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGUoKSA9PSBFTEY6OlNUVF9DT01NT04gfHwgc3Rfc2huZHggPT0gRUxGOjpTSE5fQ09NTU9OOworICB9CisKKyAgYm9vbCBpc0RlZmluZWQoKSBjb25zdCB7IHJldHVybiAhaXNVbmRlZmluZWQoKTsgfQorCisgIGJvb2wgaXNQcm9jZXNzb3JTcGVjaWZpYygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3Rfc2huZHggPj0gRUxGOjpTSE5fTE9QUk9DICYmIHN0X3NobmR4IDw9IEVMRjo6U0hOX0hJUFJPQzsKKyAgfQorCisgIGJvb2wgaXNPU1NwZWNpZmljKCkgY29uc3QgeworICAgIHJldHVybiBzdF9zaG5keCA+PSBFTEY6OlNITl9MT09TICYmIHN0X3NobmR4IDw9IEVMRjo6U0hOX0hJT1M7CisgIH0KKworICBib29sIGlzUmVzZXJ2ZWQoKSBjb25zdCB7CisgICAgLy8gRUxGOjpTSE5fSElSRVNFUlZFIGlzIDB4ZmZmZiBzbyBzdF9zaG5keCA8PSBFTEY6OlNITl9ISVJFU0VSVkUgaXMgYWx3YXlzCisgICAgLy8gdHJ1ZSBhbmQgc29tZSBjb21waWxlcnMgd2FybiBhYm91dCBpdC4KKyAgICByZXR1cm4gc3Rfc2huZHggPj0gRUxGOjpTSE5fTE9SRVNFUlZFOworICB9CisKKyAgYm9vbCBpc1VuZGVmaW5lZCgpIGNvbnN0IHsgcmV0dXJuIHN0X3NobmR4ID09IEVMRjo6U0hOX1VOREVGOyB9CisKKyAgYm9vbCBpc0V4dGVybmFsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRCaW5kaW5nKCkgIT0gRUxGOjpTVEJfTE9DQUw7CisgIH0KKworICBFeHBlY3RlZDxTdHJpbmdSZWY+IGdldE5hbWUoU3RyaW5nUmVmIFN0clRhYikgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0V4cGVjdGVkPFN0cmluZ1JlZj4gRWxmX1N5bV9JbXBsPEVMRlQ+OjpnZXROYW1lKFN0cmluZ1JlZiBTdHJUYWIpIGNvbnN0IHsKKyAgdWludDMyX3QgT2Zmc2V0ID0gdGhpcy0+c3RfbmFtZTsKKyAgaWYgKE9mZnNldCA+PSBTdHJUYWIuc2l6ZSgpKQorICAgIHJldHVybiBlcnJvckNvZGVUb0Vycm9yKG9iamVjdF9lcnJvcjo6cGFyc2VfZmFpbGVkKTsKKyAgcmV0dXJuIFN0cmluZ1JlZihTdHJUYWIuZGF0YSgpICsgT2Zmc2V0KTsKK30KKworLy8vIEVsZl9WZXJzeW06IFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBvZiBlbnRyaWVzIGluIHRoZSBTSFRfR05VX3ZlcnN5bSBzZWN0aW9uCisvLy8gKC5nbnUudmVyc2lvbikuIFRoaXMgc3RydWN0dXJlIGlzIGlkZW50aWNhbCBmb3IgRUxGMzIgYW5kIEVMRjY0LgordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitzdHJ1Y3QgRWxmX1ZlcnN5bV9JbXBsIHsKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTX0VMRlQoRUxGVCkKKyAgRWxmX0hhbGYgdnNfaW5kZXg7IC8vIFZlcnNpb24gaW5kZXggd2l0aCBmbGFncyAoZS5nLiBWRVJTWU1fSElEREVOKQorfTsKKworLy8vIEVsZl9WZXJkZWY6IFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBvZiBlbnRyaWVzIGluIHRoZSBTSFRfR05VX3ZlcmRlZiBzZWN0aW9uCisvLy8gKC5nbnUudmVyc2lvbl9kKS4gVGhpcyBzdHJ1Y3R1cmUgaXMgaWRlbnRpY2FsIGZvciBFTEYzMiBhbmQgRUxGNjQuCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3N0cnVjdCBFbGZfVmVyZGVmX0ltcGwgeworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVNfRUxGVChFTEZUKQorICB1c2luZyBFbGZfVmVyZGF1eCA9IEVsZl9WZXJkYXV4X0ltcGw8RUxGVD47CisgIEVsZl9IYWxmIHZkX3ZlcnNpb247IC8vIFZlcnNpb24gb2YgdGhpcyBzdHJ1Y3R1cmUgKGUuZy4gVkVSX0RFRl9DVVJSRU5UKQorICBFbGZfSGFsZiB2ZF9mbGFnczsgICAvLyBCaXR3aXNlIGZsYWdzIChWRVJfREVGXyopCisgIEVsZl9IYWxmIHZkX25keDsgICAgIC8vIFZlcnNpb24gaW5kZXgsIHVzZWQgaW4gLmdudS52ZXJzaW9uIGVudHJpZXMKKyAgRWxmX0hhbGYgdmRfY250OyAgICAgLy8gTnVtYmVyIG9mIFZlcmRhdXggZW50cmllcworICBFbGZfV29yZCB2ZF9oYXNoOyAgICAvLyBIYXNoIG9mIG5hbWUKKyAgRWxmX1dvcmQgdmRfYXV4OyAgICAgLy8gT2Zmc2V0IHRvIHRoZSBmaXJzdCBWZXJkYXV4IGVudHJ5IChpbiBieXRlcykKKyAgRWxmX1dvcmQgdmRfbmV4dDsgICAgLy8gT2Zmc2V0IHRvIHRoZSBuZXh0IFZlcmRlZiBlbnRyeSAoaW4gYnl0ZXMpCisKKyAgLy8vIEdldCB0aGUgZmlyc3QgVmVyZGF1eCBlbnRyeSBmb3IgdGhpcyBWZXJkZWYuCisgIGNvbnN0IEVsZl9WZXJkYXV4ICpnZXRBdXgoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRWxmX1ZlcmRhdXggKj4oKGNvbnN0IGNoYXIgKil0aGlzICsgdmRfYXV4KTsKKyAgfQorfTsKKworLy8vIEVsZl9WZXJkYXV4OiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgYXV4aWxpYXJ5IGRhdGEgaW4gdGhlIFNIVF9HTlVfdmVyZGVmCisvLy8gc2VjdGlvbiAoLmdudS52ZXJzaW9uX2QpLiBUaGlzIHN0cnVjdHVyZSBpcyBpZGVudGljYWwgZm9yIEVMRjMyIGFuZCBFTEY2NC4KK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorc3RydWN0IEVsZl9WZXJkYXV4X0ltcGwgeworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVNfRUxGVChFTEZUKQorICBFbGZfV29yZCB2ZGFfbmFtZTsgLy8gVmVyc2lvbiBuYW1lIChvZmZzZXQgaW4gc3RyaW5nIHRhYmxlKQorICBFbGZfV29yZCB2ZGFfbmV4dDsgLy8gT2Zmc2V0IHRvIG5leHQgVmVyZGF1eCBlbnRyeSAoaW4gYnl0ZXMpCit9OworCisvLy8gRWxmX1Zlcm5lZWQ6IFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBvZiBlbnRyaWVzIGluIHRoZSBTSFRfR05VX3Zlcm5lZWQKKy8vLyBzZWN0aW9uICguZ251LnZlcnNpb25fcikuIFRoaXMgc3RydWN0dXJlIGlzIGlkZW50aWNhbCBmb3IgRUxGMzIgYW5kIEVMRjY0LgordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitzdHJ1Y3QgRWxmX1Zlcm5lZWRfSW1wbCB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFU19FTEZUKEVMRlQpCisgIEVsZl9IYWxmIHZuX3ZlcnNpb247IC8vIFZlcnNpb24gb2YgdGhpcyBzdHJ1Y3R1cmUgKGUuZy4gVkVSX05FRURfQ1VSUkVOVCkKKyAgRWxmX0hhbGYgdm5fY250OyAgICAgLy8gTnVtYmVyIG9mIGFzc29jaWF0ZWQgVmVybmF1eCBlbnRyaWVzCisgIEVsZl9Xb3JkIHZuX2ZpbGU7ICAgIC8vIExpYnJhcnkgbmFtZSAoc3RyaW5nIHRhYmxlIG9mZnNldCkKKyAgRWxmX1dvcmQgdm5fYXV4OyAgICAgLy8gT2Zmc2V0IHRvIGZpcnN0IFZlcm5hdXggZW50cnkgKGluIGJ5dGVzKQorICBFbGZfV29yZCB2bl9uZXh0OyAgICAvLyBPZmZzZXQgdG8gbmV4dCBWZXJuZWVkIGVudHJ5IChpbiBieXRlcykKK307CisKKy8vLyBFbGZfVmVybmF1eDogVGhpcyBpcyB0aGUgc3RydWN0dXJlIG9mIGF1eGlsaWFyeSBkYXRhIGluIFNIVF9HTlVfdmVybmVlZAorLy8vIHNlY3Rpb24gKC5nbnUudmVyc2lvbl9yKS4gVGhpcyBzdHJ1Y3R1cmUgaXMgaWRlbnRpY2FsIGZvciBFTEYzMiBhbmQgRUxGNjQuCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3N0cnVjdCBFbGZfVmVybmF1eF9JbXBsIHsKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTX0VMRlQoRUxGVCkKKyAgRWxmX1dvcmQgdm5hX2hhc2g7ICAvLyBIYXNoIG9mIGRlcGVuZGVuY3kgbmFtZQorICBFbGZfSGFsZiB2bmFfZmxhZ3M7IC8vIEJpdHdpc2UgRmxhZ3MgKFZFUl9GTEFHXyopCisgIEVsZl9IYWxmIHZuYV9vdGhlcjsgLy8gVmVyc2lvbiBpbmRleCwgdXNlZCBpbiAuZ251LnZlcnNpb24gZW50cmllcworICBFbGZfV29yZCB2bmFfbmFtZTsgIC8vIERlcGVuZGVuY3kgbmFtZQorICBFbGZfV29yZCB2bmFfbmV4dDsgIC8vIE9mZnNldCB0byBuZXh0IFZlcm5hdXggZW50cnkgKGluIGJ5dGVzKQorfTsKKworLy8vIEVsZl9EeW5fQmFzZTogVGhpcyBzdHJ1Y3R1cmUgbWF0Y2hlcyB0aGUgZm9ybSBvZiBlbnRyaWVzIGluIHRoZSBkeW5hbWljCisvLy8gICAgICAgICAgICAgICB0YWJsZSBzZWN0aW9uICguZHluYW1pYykgbG9vayBsaWtlLgordGVtcGxhdGUgPGNsYXNzIEVMRlQ+IHN0cnVjdCBFbGZfRHluX0Jhc2U7CisKK3RlbXBsYXRlIDxlbmRpYW5uZXNzIFRhcmdldEVuZGlhbm5lc3M+CitzdHJ1Y3QgRWxmX0R5bl9CYXNlPEVMRlR5cGU8VGFyZ2V0RW5kaWFubmVzcywgZmFsc2U+PiB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFUyhUYXJnZXRFbmRpYW5uZXNzLCBmYWxzZSkKKyAgRWxmX1N3b3JkIGRfdGFnOworICB1bmlvbiB7CisgICAgRWxmX1dvcmQgZF92YWw7CisgICAgRWxmX0FkZHIgZF9wdHI7CisgIH0gZF91bjsKK307CisKK3RlbXBsYXRlIDxlbmRpYW5uZXNzIFRhcmdldEVuZGlhbm5lc3M+CitzdHJ1Y3QgRWxmX0R5bl9CYXNlPEVMRlR5cGU8VGFyZ2V0RW5kaWFubmVzcywgdHJ1ZT4+IHsKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTKFRhcmdldEVuZGlhbm5lc3MsIHRydWUpCisgIEVsZl9TeHdvcmQgZF90YWc7CisgIHVuaW9uIHsKKyAgICBFbGZfWHdvcmQgZF92YWw7CisgICAgRWxmX0FkZHIgZF9wdHI7CisgIH0gZF91bjsKK307CisKKy8vLyBFbGZfRHluX0ltcGw6IFRoaXMgaW5oZXJpdHMgZnJvbSBFbGZfRHluX0Jhc2UsIGFkZGluZyBnZXR0ZXJzLgordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitzdHJ1Y3QgRWxmX0R5bl9JbXBsIDogRWxmX0R5bl9CYXNlPEVMRlQ+IHsKKyAgdXNpbmcgRWxmX0R5bl9CYXNlPEVMRlQ+OjpkX3RhZzsKKyAgdXNpbmcgRWxmX0R5bl9CYXNlPEVMRlQ+OjpkX3VuOworICB1c2luZyBpbnRYX3QgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPEVMRlQ6OklzNjRCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QsIGludDMyX3Q+Ojp0eXBlOworICB1c2luZyB1aW50WF90ID0gdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxFTEZUOjpJczY0Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsIHVpbnQzMl90Pjo6dHlwZTsKKyAgaW50WF90IGdldFRhZygpIGNvbnN0IHsgcmV0dXJuIGRfdGFnOyB9CisgIHVpbnRYX3QgZ2V0VmFsKCkgY29uc3QgeyByZXR1cm4gZF91bi5kX3ZhbDsgfQorICB1aW50WF90IGdldFB0cigpIGNvbnN0IHsgcmV0dXJuIGRfdW4uZF9wdHI7IH0KK307CisKK3RlbXBsYXRlIDxlbmRpYW5uZXNzIFRhcmdldEVuZGlhbm5lc3M+CitzdHJ1Y3QgRWxmX1JlbF9JbXBsPEVMRlR5cGU8VGFyZ2V0RW5kaWFubmVzcywgZmFsc2U+LCBmYWxzZT4geworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVMoVGFyZ2V0RW5kaWFubmVzcywgZmFsc2UpCisgIHN0YXRpYyBjb25zdCBib29sIElzUmVsYSA9IGZhbHNlOworICBFbGZfQWRkciByX29mZnNldDsgLy8gTG9jYXRpb24gKGZpbGUgYnl0ZSBvZmZzZXQsIG9yIHByb2dyYW0gdmlydHVhbCBhZGRyKQorICBFbGZfV29yZCByX2luZm87ICAgLy8gU3ltYm9sIHRhYmxlIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gdG8gYXBwbHkKKworICB1aW50MzJfdCBnZXRSSW5mbyhib29sIGlzTWlwczY0RUwpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzTWlwczY0RUwpOworICAgIHJldHVybiByX2luZm87CisgIH0KKyAgdm9pZCBzZXRSSW5mbyh1aW50MzJfdCBSLCBib29sIElzTWlwczY0RUwpIHsKKyAgICBhc3NlcnQoIUlzTWlwczY0RUwpOworICAgIHJfaW5mbyA9IFI7CisgIH0KKworICAvLyBUaGVzZSBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzIGNvcnJlc3BvbmQgdG8gdGhlIEVMRjMyX1JfU1lNLCBFTEYzMl9SX1RZUEUsCisgIC8vIGFuZCBFTEYzMl9SX0lORk8gbWFjcm9zIGRlZmluZWQgaW4gdGhlIEVMRiBzcGVjaWZpY2F0aW9uOgorICB1aW50MzJfdCBnZXRTeW1ib2woYm9vbCBpc01pcHM2NEVMKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPmdldFJJbmZvKGlzTWlwczY0RUwpID4+IDg7CisgIH0KKyAgdW5zaWduZWQgY2hhciBnZXRUeXBlKGJvb2wgaXNNaXBzNjRFTCkgY29uc3QgeworICAgIHJldHVybiAodW5zaWduZWQgY2hhcikodGhpcy0+Z2V0UkluZm8oaXNNaXBzNjRFTCkgJiAweDBmZik7CisgIH0KKyAgdm9pZCBzZXRTeW1ib2wodWludDMyX3QgcywgYm9vbCBJc01pcHM2NEVMKSB7CisgICAgc2V0U3ltYm9sQW5kVHlwZShzLCBnZXRUeXBlKElzTWlwczY0RUwpLCBJc01pcHM2NEVMKTsKKyAgfQorICB2b2lkIHNldFR5cGUodW5zaWduZWQgY2hhciB0LCBib29sIElzTWlwczY0RUwpIHsKKyAgICBzZXRTeW1ib2xBbmRUeXBlKGdldFN5bWJvbChJc01pcHM2NEVMKSwgdCwgSXNNaXBzNjRFTCk7CisgIH0KKyAgdm9pZCBzZXRTeW1ib2xBbmRUeXBlKHVpbnQzMl90IHMsIHVuc2lnbmVkIGNoYXIgdCwgYm9vbCBJc01pcHM2NEVMKSB7CisgICAgdGhpcy0+c2V0UkluZm8oKHMgPDwgOCkgKyB0LCBJc01pcHM2NEVMKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGVuZGlhbm5lc3MgVGFyZ2V0RW5kaWFubmVzcz4KK3N0cnVjdCBFbGZfUmVsX0ltcGw8RUxGVHlwZTxUYXJnZXRFbmRpYW5uZXNzLCBmYWxzZT4sIHRydWU+CisgICAgOiBwdWJsaWMgRWxmX1JlbF9JbXBsPEVMRlR5cGU8VGFyZ2V0RW5kaWFubmVzcywgZmFsc2U+LCBmYWxzZT4geworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVMoVGFyZ2V0RW5kaWFubmVzcywgZmFsc2UpCisgIHN0YXRpYyBjb25zdCBib29sIElzUmVsYSA9IHRydWU7CisgIEVsZl9Td29yZCByX2FkZGVuZDsgLy8gQ29tcHV0ZSB2YWx1ZSBmb3IgcmVsb2NhdGFibGUgZmllbGQgYnkgYWRkaW5nIHRoaXMKK307CisKK3RlbXBsYXRlIDxlbmRpYW5uZXNzIFRhcmdldEVuZGlhbm5lc3M+CitzdHJ1Y3QgRWxmX1JlbF9JbXBsPEVMRlR5cGU8VGFyZ2V0RW5kaWFubmVzcywgdHJ1ZT4sIGZhbHNlPiB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFUyhUYXJnZXRFbmRpYW5uZXNzLCB0cnVlKQorICBzdGF0aWMgY29uc3QgYm9vbCBJc1JlbGEgPSBmYWxzZTsKKyAgRWxmX0FkZHIgcl9vZmZzZXQ7IC8vIExvY2F0aW9uIChmaWxlIGJ5dGUgb2Zmc2V0LCBvciBwcm9ncmFtIHZpcnR1YWwgYWRkcikKKyAgRWxmX1h3b3JkIHJfaW5mbzsgIC8vIFN5bWJvbCB0YWJsZSBpbmRleCBhbmQgdHlwZSBvZiByZWxvY2F0aW9uIHRvIGFwcGx5CisKKyAgdWludDY0X3QgZ2V0UkluZm8oYm9vbCBpc01pcHM2NEVMKSBjb25zdCB7CisgICAgdWludDY0X3QgdCA9IHJfaW5mbzsKKyAgICBpZiAoIWlzTWlwczY0RUwpCisgICAgICByZXR1cm4gdDsKKyAgICAvLyBNaXBzNjQgbGl0dGxlIGVuZGlhbiBoYXMgYSAic3BlY2lhbCIgZW5jb2Rpbmcgb2Ygcl9pbmZvLiBJbnN0ZWFkIG9mIG9uZQorICAgIC8vIDY0IGJpdCBsaXR0bGUgZW5kaWFuIG51bWJlciwgaXQgaXMgYSBsaXR0bGUgZW5kaWFuIDMyIGJpdCBudW1iZXIgZm9sbG93ZWQKKyAgICAvLyBieSBhIDMyIGJpdCBiaWcgZW5kaWFuIG51bWJlci4KKyAgICByZXR1cm4gKHQgPDwgMzIpIHwgKCh0ID4+IDgpICYgMHhmZjAwMDAwMCkgfCAoKHQgPj4gMjQpICYgMHgwMGZmMDAwMCkgfAorICAgICAgICAgICAoKHQgPj4gNDApICYgMHgwMDAwZmYwMCkgfCAoKHQgPj4gNTYpICYgMHgwMDAwMDBmZik7CisgIH0KKworICB2b2lkIHNldFJJbmZvKHVpbnQ2NF90IFIsIGJvb2wgSXNNaXBzNjRFTCkgeworICAgIGlmIChJc01pcHM2NEVMKQorICAgICAgcl9pbmZvID0gKFIgPj4gMzIpIHwgKChSICYgMHhmZjAwMDAwMCkgPDwgOCkgfCAoKFIgJiAweDAwZmYwMDAwKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgKChSICYgMHgwMDAwZmYwMCkgPDwgNDApIHwgKChSICYgMHgwMDAwMDBmZikgPDwgNTYpOworICAgIGVsc2UKKyAgICAgIHJfaW5mbyA9IFI7CisgIH0KKworICAvLyBUaGVzZSBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzIGNvcnJlc3BvbmQgdG8gdGhlIEVMRjY0X1JfU1lNLCBFTEY2NF9SX1RZUEUsCisgIC8vIGFuZCBFTEY2NF9SX0lORk8gbWFjcm9zIGRlZmluZWQgaW4gdGhlIEVMRiBzcGVjaWZpY2F0aW9uOgorICB1aW50MzJfdCBnZXRTeW1ib2woYm9vbCBpc01pcHM2NEVMKSBjb25zdCB7CisgICAgcmV0dXJuICh1aW50MzJfdCkodGhpcy0+Z2V0UkluZm8oaXNNaXBzNjRFTCkgPj4gMzIpOworICB9CisgIHVpbnQzMl90IGdldFR5cGUoYm9vbCBpc01pcHM2NEVMKSBjb25zdCB7CisgICAgcmV0dXJuICh1aW50MzJfdCkodGhpcy0+Z2V0UkluZm8oaXNNaXBzNjRFTCkgJiAweGZmZmZmZmZmTCk7CisgIH0KKyAgdm9pZCBzZXRTeW1ib2wodWludDMyX3QgcywgYm9vbCBJc01pcHM2NEVMKSB7CisgICAgc2V0U3ltYm9sQW5kVHlwZShzLCBnZXRUeXBlKElzTWlwczY0RUwpLCBJc01pcHM2NEVMKTsKKyAgfQorICB2b2lkIHNldFR5cGUodWludDMyX3QgdCwgYm9vbCBJc01pcHM2NEVMKSB7CisgICAgc2V0U3ltYm9sQW5kVHlwZShnZXRTeW1ib2woSXNNaXBzNjRFTCksIHQsIElzTWlwczY0RUwpOworICB9CisgIHZvaWQgc2V0U3ltYm9sQW5kVHlwZSh1aW50MzJfdCBzLCB1aW50MzJfdCB0LCBib29sIElzTWlwczY0RUwpIHsKKyAgICB0aGlzLT5zZXRSSW5mbygoKHVpbnQ2NF90KXMgPDwgMzIpICsgKHQgJiAweGZmZmZmZmZmTCksIElzTWlwczY0RUwpOworICB9Cit9OworCit0ZW1wbGF0ZSA8ZW5kaWFubmVzcyBUYXJnZXRFbmRpYW5uZXNzPgorc3RydWN0IEVsZl9SZWxfSW1wbDxFTEZUeXBlPFRhcmdldEVuZGlhbm5lc3MsIHRydWU+LCB0cnVlPgorICAgIDogcHVibGljIEVsZl9SZWxfSW1wbDxFTEZUeXBlPFRhcmdldEVuZGlhbm5lc3MsIHRydWU+LCBmYWxzZT4geworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVMoVGFyZ2V0RW5kaWFubmVzcywgdHJ1ZSkKKyAgc3RhdGljIGNvbnN0IGJvb2wgSXNSZWxhID0gdHJ1ZTsKKyAgRWxmX1N4d29yZCByX2FkZGVuZDsgLy8gQ29tcHV0ZSB2YWx1ZSBmb3IgcmVsb2NhdGFibGUgZmllbGQgYnkgYWRkaW5nIHRoaXMuCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3N0cnVjdCBFbGZfRWhkcl9JbXBsIHsKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTX0VMRlQoRUxGVCkKKyAgdW5zaWduZWQgY2hhciBlX2lkZW50W0VMRjo6RUlfTklERU5UXTsgLy8gRUxGIElkZW50aWZpY2F0aW9uIGJ5dGVzCisgIEVsZl9IYWxmIGVfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGUgb2YgZmlsZSAoc2VlIEVUXyopCisgIEVsZl9IYWxmIGVfbWFjaGluZTsgICAvLyBSZXF1aXJlZCBhcmNoaXRlY3R1cmUgZm9yIHRoaXMgZmlsZSAoc2VlIEVNXyopCisgIEVsZl9Xb3JkIGVfdmVyc2lvbjsgICAvLyBNdXN0IGJlIGVxdWFsIHRvIDEKKyAgRWxmX0FkZHIgZV9lbnRyeTsgICAgIC8vIEFkZHJlc3MgdG8ganVtcCB0byBpbiBvcmRlciB0byBzdGFydCBwcm9ncmFtCisgIEVsZl9PZmYgZV9waG9mZjsgICAgICAvLyBQcm9ncmFtIGhlYWRlciB0YWJsZSdzIGZpbGUgb2Zmc2V0LCBpbiBieXRlcworICBFbGZfT2ZmIGVfc2hvZmY7ICAgICAgLy8gU2VjdGlvbiBoZWFkZXIgdGFibGUncyBmaWxlIG9mZnNldCwgaW4gYnl0ZXMKKyAgRWxmX1dvcmQgZV9mbGFnczsgICAgIC8vIFByb2Nlc3Nvci1zcGVjaWZpYyBmbGFncworICBFbGZfSGFsZiBlX2Voc2l6ZTsgICAgLy8gU2l6ZSBvZiBFTEYgaGVhZGVyLCBpbiBieXRlcworICBFbGZfSGFsZiBlX3BoZW50c2l6ZTsgLy8gU2l6ZSBvZiBhbiBlbnRyeSBpbiB0aGUgcHJvZ3JhbSBoZWFkZXIgdGFibGUKKyAgRWxmX0hhbGYgZV9waG51bTsgICAgIC8vIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBwcm9ncmFtIGhlYWRlciB0YWJsZQorICBFbGZfSGFsZiBlX3NoZW50c2l6ZTsgLy8gU2l6ZSBvZiBhbiBlbnRyeSBpbiB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUKKyAgRWxmX0hhbGYgZV9zaG51bTsgICAgIC8vIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBzZWN0aW9uIGhlYWRlciB0YWJsZQorICBFbGZfSGFsZiBlX3Noc3RybmR4OyAgLy8gU2VjdGlvbiBoZWFkZXIgdGFibGUgaW5kZXggb2Ygc2VjdGlvbiBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJpbmcgdGFibGUKKworICBib29sIGNoZWNrTWFnaWMoKSBjb25zdCB7CisgICAgcmV0dXJuIChtZW1jbXAoZV9pZGVudCwgRUxGOjpFbGZNYWdpYywgc3RybGVuKEVMRjo6RWxmTWFnaWMpKSkgPT0gMDsKKyAgfQorCisgIHVuc2lnbmVkIGNoYXIgZ2V0RmlsZUNsYXNzKCkgY29uc3QgeyByZXR1cm4gZV9pZGVudFtFTEY6OkVJX0NMQVNTXTsgfQorICB1bnNpZ25lZCBjaGFyIGdldERhdGFFbmNvZGluZygpIGNvbnN0IHsgcmV0dXJuIGVfaWRlbnRbRUxGOjpFSV9EQVRBXTsgfQorfTsKKwordGVtcGxhdGUgPGVuZGlhbm5lc3MgVGFyZ2V0RW5kaWFubmVzcz4KK3N0cnVjdCBFbGZfUGhkcl9JbXBsPEVMRlR5cGU8VGFyZ2V0RW5kaWFubmVzcywgZmFsc2U+PiB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFUyhUYXJnZXRFbmRpYW5uZXNzLCBmYWxzZSkKKyAgRWxmX1dvcmQgcF90eXBlOyAgIC8vIFR5cGUgb2Ygc2VnbWVudAorICBFbGZfT2ZmIHBfb2Zmc2V0OyAgLy8gRmlsZU9mZnNldCB3aGVyZSBzZWdtZW50IGlzIGxvY2F0ZWQsIGluIGJ5dGVzCisgIEVsZl9BZGRyIHBfdmFkZHI7ICAvLyBWaXJ0dWFsIEFkZHJlc3Mgb2YgYmVnaW5uaW5nIG9mIHNlZ21lbnQKKyAgRWxmX0FkZHIgcF9wYWRkcjsgIC8vIFBoeXNpY2FsIGFkZHJlc3Mgb2YgYmVnaW5uaW5nIG9mIHNlZ21lbnQgKE9TLXNwZWNpZmljKQorICBFbGZfV29yZCBwX2ZpbGVzejsgLy8gTnVtLiBvZiBieXRlcyBpbiBmaWxlIGltYWdlIG9mIHNlZ21lbnQgKG1heSBiZSB6ZXJvKQorICBFbGZfV29yZCBwX21lbXN6OyAgLy8gTnVtLiBvZiBieXRlcyBpbiBtZW0gaW1hZ2Ugb2Ygc2VnbWVudCAobWF5IGJlIHplcm8pCisgIEVsZl9Xb3JkIHBfZmxhZ3M7ICAvLyBTZWdtZW50IGZsYWdzCisgIEVsZl9Xb3JkIHBfYWxpZ247ICAvLyBTZWdtZW50IGFsaWdubWVudCBjb25zdHJhaW50Cit9OworCit0ZW1wbGF0ZSA8ZW5kaWFubmVzcyBUYXJnZXRFbmRpYW5uZXNzPgorc3RydWN0IEVsZl9QaGRyX0ltcGw8RUxGVHlwZTxUYXJnZXRFbmRpYW5uZXNzLCB0cnVlPj4geworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVMoVGFyZ2V0RW5kaWFubmVzcywgdHJ1ZSkKKyAgRWxmX1dvcmQgcF90eXBlOyAgICAvLyBUeXBlIG9mIHNlZ21lbnQKKyAgRWxmX1dvcmQgcF9mbGFnczsgICAvLyBTZWdtZW50IGZsYWdzCisgIEVsZl9PZmYgcF9vZmZzZXQ7ICAgLy8gRmlsZU9mZnNldCB3aGVyZSBzZWdtZW50IGlzIGxvY2F0ZWQsIGluIGJ5dGVzCisgIEVsZl9BZGRyIHBfdmFkZHI7ICAgLy8gVmlydHVhbCBBZGRyZXNzIG9mIGJlZ2lubmluZyBvZiBzZWdtZW50CisgIEVsZl9BZGRyIHBfcGFkZHI7ICAgLy8gUGh5c2ljYWwgYWRkcmVzcyBvZiBiZWdpbm5pbmcgb2Ygc2VnbWVudCAoT1Mtc3BlY2lmaWMpCisgIEVsZl9Yd29yZCBwX2ZpbGVzejsgLy8gTnVtLiBvZiBieXRlcyBpbiBmaWxlIGltYWdlIG9mIHNlZ21lbnQgKG1heSBiZSB6ZXJvKQorICBFbGZfWHdvcmQgcF9tZW1zejsgIC8vIE51bS4gb2YgYnl0ZXMgaW4gbWVtIGltYWdlIG9mIHNlZ21lbnQgKG1heSBiZSB6ZXJvKQorICBFbGZfWHdvcmQgcF9hbGlnbjsgIC8vIFNlZ21lbnQgYWxpZ25tZW50IGNvbnN0cmFpbnQKK307CisKKy8vIEVMRlQgbmVlZGVkIGZvciBlbmRpYW5uZXNzLgordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitzdHJ1Y3QgRWxmX0hhc2hfSW1wbCB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFU19FTEZUKEVMRlQpCisgIEVsZl9Xb3JkIG5idWNrZXQ7CisgIEVsZl9Xb3JkIG5jaGFpbjsKKworICBBcnJheVJlZjxFbGZfV29yZD4gYnVja2V0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gQXJyYXlSZWY8RWxmX1dvcmQ+KCZuYnVja2V0ICsgMiwgJm5idWNrZXQgKyAyICsgbmJ1Y2tldCk7CisgIH0KKworICBBcnJheVJlZjxFbGZfV29yZD4gY2hhaW5zKCkgY29uc3QgeworICAgIHJldHVybiBBcnJheVJlZjxFbGZfV29yZD4oJm5idWNrZXQgKyAyICsgbmJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnVja2V0ICsgMiArIG5idWNrZXQgKyBuY2hhaW4pOworICB9Cit9OworCisvLyAuZ251Lmhhc2ggc2VjdGlvbgordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitzdHJ1Y3QgRWxmX0dudUhhc2hfSW1wbCB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFU19FTEZUKEVMRlQpCisgIEVsZl9Xb3JkIG5idWNrZXRzOworICBFbGZfV29yZCBzeW1uZHg7CisgIEVsZl9Xb3JkIG1hc2t3b3JkczsKKyAgRWxmX1dvcmQgc2hpZnQyOworCisgIEFycmF5UmVmPEVsZl9PZmY+IGZpbHRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gQXJyYXlSZWY8RWxmX09mZj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbGZfT2ZmICo+KCZzaGlmdDIgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza3dvcmRzKTsKKyAgfQorCisgIEFycmF5UmVmPEVsZl9Xb3JkPiBidWNrZXRzKCkgY29uc3QgeworICAgIHJldHVybiBBcnJheVJlZjxFbGZfV29yZD4oCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRWxmX1dvcmQgKj4oZmlsdGVyKCkuZW5kKCkpLCBuYnVja2V0cyk7CisgIH0KKworICBBcnJheVJlZjxFbGZfV29yZD4gdmFsdWVzKHVuc2lnbmVkIER5bmFtaWNTeW1Db3VudCkgY29uc3QgeworICAgIHJldHVybiBBcnJheVJlZjxFbGZfV29yZD4oYnVja2V0cygpLmVuZCgpLCBEeW5hbWljU3ltQ291bnQgLSBzeW1uZHgpOworICB9Cit9OworCisvLyBDb21wcmVzc2VkIHNlY3Rpb24gaGVhZGVycy4KKy8vIGh0dHA6Ly93d3cuc2NvLmNvbS9kZXZlbG9wZXJzL2dhYmkvbGF0ZXN0L2NoNC5zaGVhZGVyLmh0bWwjY29tcHJlc3Npb25faGVhZGVyCit0ZW1wbGF0ZSA8ZW5kaWFubmVzcyBUYXJnZXRFbmRpYW5uZXNzPgorc3RydWN0IEVsZl9DaGRyX0ltcGw8RUxGVHlwZTxUYXJnZXRFbmRpYW5uZXNzLCBmYWxzZT4+IHsKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTKFRhcmdldEVuZGlhbm5lc3MsIGZhbHNlKQorICBFbGZfV29yZCBjaF90eXBlOworICBFbGZfV29yZCBjaF9zaXplOworICBFbGZfV29yZCBjaF9hZGRyYWxpZ247Cit9OworCit0ZW1wbGF0ZSA8ZW5kaWFubmVzcyBUYXJnZXRFbmRpYW5uZXNzPgorc3RydWN0IEVsZl9DaGRyX0ltcGw8RUxGVHlwZTxUYXJnZXRFbmRpYW5uZXNzLCB0cnVlPj4geworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVMoVGFyZ2V0RW5kaWFubmVzcywgdHJ1ZSkKKyAgRWxmX1dvcmQgY2hfdHlwZTsKKyAgRWxmX1dvcmQgY2hfcmVzZXJ2ZWQ7CisgIEVsZl9Yd29yZCBjaF9zaXplOworICBFbGZfWHdvcmQgY2hfYWRkcmFsaWduOworfTsKKworLy8vIE5vdGUgaGVhZGVyCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3N0cnVjdCBFbGZfTmhkcl9JbXBsIHsKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTX0VMRlQoRUxGVCkKKyAgRWxmX1dvcmQgbl9uYW1lc3o7CisgIEVsZl9Xb3JkIG5fZGVzY3N6OworICBFbGZfV29yZCBuX3R5cGU7CisKKyAgLy8vIFRoZSBhbGlnbm1lbnQgb2YgdGhlIG5hbWUgYW5kIGRlc2NyaXB0b3IuCisgIC8vLworICAvLy8gSW1wbGVtZW50YXRpb25zIGRpZmZlciBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGhlcmU6IGluIHByYWN0aWNlIGFsbAorICAvLy8gdmFyaWFudHMgYWxpZ24gYm90aCB0aGUgbmFtZSBhbmQgZGVzY3JpcHRvciB0byA0LWJ5dGVzLgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEFsaWduID0gNDsKKworICAvLy8gR2V0IHRoZSBzaXplIG9mIHRoZSBub3RlLCBpbmNsdWRpbmcgbmFtZSwgZGVzY3JpcHRvciwgYW5kIHBhZGRpbmcuCisgIHNpemVfdCBnZXRTaXplKCkgY29uc3QgeworICAgIHJldHVybiBzaXplb2YoKnRoaXMpICsgYWxpZ25UbzxBbGlnbj4obl9uYW1lc3opICsgYWxpZ25UbzxBbGlnbj4obl9kZXNjc3opOworICB9Cit9OworCisvLy8gQW4gRUxGIG5vdGUuCisvLy8KKy8vLyBXcmFwcyBhIG5vdGUgaGVhZGVyLCBwcm92aWRpbmcgbWV0aG9kcyBmb3IgYWNjZXNzaW5nIHRoZSBuYW1lIGFuZAorLy8vIGRlc2NyaXB0b3Igc2FmZWx5LgordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitjbGFzcyBFbGZfTm90ZV9JbXBsIHsKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTX0VMRlQoRUxGVCkKKworICBjb25zdCBFbGZfTmhkcl9JbXBsPEVMRlQ+ICZOaGRyOworCisgIHRlbXBsYXRlIDxjbGFzcyBOb3RlSXRlcmF0b3JFTEZUPiBmcmllbmQgY2xhc3MgRWxmX05vdGVfSXRlcmF0b3JfSW1wbDsKKworICBFbGZfTm90ZV9JbXBsKGNvbnN0IEVsZl9OaGRyX0ltcGw8RUxGVD4gJk5oZHIpIDogTmhkcihOaGRyKSB7fQorCitwdWJsaWM6CisgIC8vLyBHZXQgdGhlIG5vdGUncyBuYW1lLCBleGNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIG51bGwgYnl0ZS4KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7CisgICAgaWYgKCFOaGRyLm5fbmFtZXN6KQorICAgICAgcmV0dXJuIFN0cmluZ1JlZigpOworICAgIHJldHVybiBTdHJpbmdSZWYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZOaGRyKSArIHNpemVvZihOaGRyKSwKKyAgICAgICAgICAgICAgICAgICAgIE5oZHIubl9uYW1lc3ogLSAxKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIG5vdGUncyBkZXNjcmlwdG9yLgorICBBcnJheVJlZjxFbGZfV29yZD4gZ2V0RGVzYygpIGNvbnN0IHsKKyAgICBpZiAoIU5oZHIubl9kZXNjc3opCisgICAgICByZXR1cm4gQXJyYXlSZWY8RWxmX1dvcmQ+KCk7CisgICAgcmV0dXJuIEFycmF5UmVmPEVsZl9Xb3JkPigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbGZfV29yZCAqPigKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigmTmhkcikgKyBzaXplb2YoTmhkcikgKworICAgICAgICAgICAgYWxpZ25UbzxFbGZfTmhkcl9JbXBsPEVMRlQ+OjpBbGlnbj4oTmhkci5uX25hbWVzeikpLAorICAgICAgICBOaGRyLm5fZGVzY3N6KTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIG5vdGUncyB0eXBlLgorICBFbGZfV29yZCBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gTmhkci5uX3R5cGU7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorY2xhc3MgRWxmX05vdGVfSXRlcmF0b3JfSW1wbAorICAgIDogc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBFbGZfTm90ZV9JbXBsPEVMRlQ+PiB7CisgIC8vIE5oZHIgYmVpbmcgYSBudWxscHRyIG1hcmtzIHRoZSBlbmQgb2YgaXRlcmF0aW9uLgorICBjb25zdCBFbGZfTmhkcl9JbXBsPEVMRlQ+ICpOaGRyID0gbnVsbHB0cjsKKyAgc2l6ZV90IFJlbWFpbmluZ1NpemUgPSAwdTsKKyAgRXJyb3IgKkVyciA9IG51bGxwdHI7CisKKyAgdGVtcGxhdGUgPGNsYXNzIEVMRkZpbGVFTEZUPiBmcmllbmQgY2xhc3MgRUxGRmlsZTsKKworICAvLyBTdG9wIGl0ZXJhdGlvbiBhbmQgaW5kaWNhdGUgYW4gb3ZlcmZsb3cuCisgIHZvaWQgc3RvcFdpdGhPdmVyZmxvd0Vycm9yKCkgeworICAgIE5oZHIgPSBudWxscHRyOworICAgICpFcnIgPSBtYWtlX2Vycm9yPFN0cmluZ0Vycm9yPigiRUxGIG5vdGUgb3ZlcmZsb3dzIGNvbnRhaW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9lcnJvcjo6cGFyc2VfZmFpbGVkKTsKKyAgfQorCisgIC8vIEFkdmFuY2UgTmhkciBieSBOb3RlU2l6ZSBieXRlcywgc3RhcnRpbmcgZnJvbSBOaGRyUG9zLgorICAvLworICAvLyBBc3N1bWVzIE5vdGVTaXplIDw9IFJlbWFpbmluZ1NpemUuIEVuc3VyZXMgTmhkci0+Z2V0U2l6ZSgpIDw9IFJlbWFpbmluZ1NpemUKKyAgLy8gdXBvbiByZXR1cm5pbmcuIEhhbmRsZXMgc3RvcHBpbmcgaXRlcmF0aW9uIHdoZW4gcmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUKKyAgLy8gY29udGFpbmVyLCBlaXRoZXIgY2xlYW5seSBvciB3aXRoIGFuIG92ZXJmbG93IGVycm9yLgorICB2b2lkIGFkdmFuY2VOaGRyKGNvbnN0IHVpbnQ4X3QgKk5oZHJQb3MsIHNpemVfdCBOb3RlU2l6ZSkgeworICAgIFJlbWFpbmluZ1NpemUgLT0gTm90ZVNpemU7CisgICAgaWYgKFJlbWFpbmluZ1NpemUgPT0gMHUpCisgICAgICBOaGRyID0gbnVsbHB0cjsKKyAgICBlbHNlIGlmIChzaXplb2YoKk5oZHIpID4gUmVtYWluaW5nU2l6ZSkKKyAgICAgIHN0b3BXaXRoT3ZlcmZsb3dFcnJvcigpOworICAgIGVsc2UgeworICAgICAgTmhkciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRWxmX05oZHJfSW1wbDxFTEZUPiAqPihOaGRyUG9zICsgTm90ZVNpemUpOworICAgICAgaWYgKE5oZHItPmdldFNpemUoKSA+IFJlbWFpbmluZ1NpemUpCisgICAgICAgIHN0b3BXaXRoT3ZlcmZsb3dFcnJvcigpOworICAgIH0KKyAgfQorCisgIEVsZl9Ob3RlX0l0ZXJhdG9yX0ltcGwoKSB7fQorICBleHBsaWNpdCBFbGZfTm90ZV9JdGVyYXRvcl9JbXBsKEVycm9yICZFcnIpIDogRXJyKCZFcnIpIHt9CisgIEVsZl9Ob3RlX0l0ZXJhdG9yX0ltcGwoY29uc3QgdWludDhfdCAqU3RhcnQsIHNpemVfdCBTaXplLCBFcnJvciAmRXJyKQorICAgICAgOiBSZW1haW5pbmdTaXplKFNpemUpLCBFcnIoJkVycikgeworICAgIGFzc2VydChTdGFydCAmJiAiRUxGIG5vdGUgaXRlcmF0b3Igc3RhcnRpbmcgYXQgTlVMTCIpOworICAgIGFkdmFuY2VOaGRyKFN0YXJ0LCAwdSk7CisgIH0KKworcHVibGljOgorICBFbGZfTm90ZV9JdGVyYXRvcl9JbXBsICZvcGVyYXRvcisrKCkgeworICAgIGFzc2VydChOaGRyICYmICJpbmNyZW1lbnRlZCBFTEYgbm90ZSBlbmQgaXRlcmF0b3IiKTsKKyAgICBjb25zdCB1aW50OF90ICpOaGRyUG9zID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KE5oZHIpOworICAgIHNpemVfdCBOb3RlU2l6ZSA9IE5oZHItPmdldFNpemUoKTsKKyAgICBhZHZhbmNlTmhkcihOaGRyUG9zLCBOb3RlU2l6ZSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGJvb2wgb3BlcmF0b3I9PShFbGZfTm90ZV9JdGVyYXRvcl9JbXBsIE90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIE5oZHIgPT0gT3RoZXIuTmhkcjsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oRWxmX05vdGVfSXRlcmF0b3JfSW1wbCBPdGhlcikgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IE90aGVyKTsKKyAgfQorICBFbGZfTm90ZV9JbXBsPEVMRlQ+IG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICBhc3NlcnQoTmhkciAmJiAiZGVyZWZlcmVuY2VkIEVMRiBub3RlIGVuZCBpdGVyYXRvciIpOworICAgIHJldHVybiBFbGZfTm90ZV9JbXBsPEVMRlQ+KCpOaGRyKTsKKyAgfQorfTsKKworLy8gTUlQUyAucmVnaW5mbyBzZWN0aW9uCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3N0cnVjdCBFbGZfTWlwc19SZWdJbmZvOworCit0ZW1wbGF0ZSA8c3VwcG9ydDo6ZW5kaWFubmVzcyBUYXJnZXRFbmRpYW5uZXNzPgorc3RydWN0IEVsZl9NaXBzX1JlZ0luZm88RUxGVHlwZTxUYXJnZXRFbmRpYW5uZXNzLCBmYWxzZT4+IHsKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTKFRhcmdldEVuZGlhbm5lc3MsIGZhbHNlKQorICBFbGZfV29yZCByaV9ncHJtYXNrOyAgICAgLy8gYml0LW1hc2sgb2YgdXNlZCBnZW5lcmFsIHJlZ2lzdGVycworICBFbGZfV29yZCByaV9jcHJtYXNrWzRdOyAgLy8gYml0LW1hc2sgb2YgdXNlZCBjby1wcm9jZXNzb3IgcmVnaXN0ZXJzCisgIEVsZl9BZGRyIHJpX2dwX3ZhbHVlOyAgICAvLyBncCByZWdpc3RlciB2YWx1ZQorfTsKKwordGVtcGxhdGUgPHN1cHBvcnQ6OmVuZGlhbm5lc3MgVGFyZ2V0RW5kaWFubmVzcz4KK3N0cnVjdCBFbGZfTWlwc19SZWdJbmZvPEVMRlR5cGU8VGFyZ2V0RW5kaWFubmVzcywgdHJ1ZT4+IHsKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTKFRhcmdldEVuZGlhbm5lc3MsIHRydWUpCisgIEVsZl9Xb3JkIHJpX2dwcm1hc2s7ICAgICAvLyBiaXQtbWFzayBvZiB1c2VkIGdlbmVyYWwgcmVnaXN0ZXJzCisgIEVsZl9Xb3JkIHJpX3BhZDsgICAgICAgICAvLyB1bnVzZWQgcGFkZGluZyBmaWVsZAorICBFbGZfV29yZCByaV9jcHJtYXNrWzRdOyAgLy8gYml0LW1hc2sgb2YgdXNlZCBjby1wcm9jZXNzb3IgcmVnaXN0ZXJzCisgIEVsZl9BZGRyIHJpX2dwX3ZhbHVlOyAgICAvLyBncCByZWdpc3RlciB2YWx1ZQorfTsKKworLy8gLk1JUFMub3B0aW9ucyBzZWN0aW9uCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4gc3RydWN0IEVsZl9NaXBzX09wdGlvbnMgeworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVNfRUxGVChFTEZUKQorICB1aW50OF90IGtpbmQ7ICAgICAvLyBEZXRlcm1pbmVzIGludGVycHJldGF0aW9uIG9mIHZhcmlhYmxlIHBhcnQgb2YgZGVzY3JpcHRvcgorICB1aW50OF90IHNpemU7ICAgICAvLyBCeXRlIHNpemUgb2YgZGVzY3JpcHRvciwgaW5jbHVkaW5nIHRoaXMgaGVhZGVyCisgIEVsZl9IYWxmIHNlY3Rpb247IC8vIFNlY3Rpb24gaGVhZGVyIGluZGV4IG9mIHNlY3Rpb24gYWZmZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgIC8vIG9yIDAgZm9yIGdsb2JhbCBvcHRpb25zCisgIEVsZl9Xb3JkIGluZm87ICAgIC8vIEtpbmQtc3BlY2lmaWMgaW5mb3JtYXRpb24KKworICBFbGZfTWlwc19SZWdJbmZvPEVMRlQ+ICZnZXRSZWdJbmZvKCkgeworICAgIGFzc2VydChraW5kID09IEVMRjo6T0RLX1JFR0lORk8pOworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxFbGZfTWlwc19SZWdJbmZvPEVMRlQ+ICo+KAorICAgICAgICAodWludDhfdCAqKXRoaXMgKyBzaXplb2YoRWxmX01pcHNfT3B0aW9ucykpOworICB9CisgIGNvbnN0IEVsZl9NaXBzX1JlZ0luZm88RUxGVD4gJmdldFJlZ0luZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RWxmX01pcHNfT3B0aW9ucyAqPih0aGlzKS0+Z2V0UmVnSW5mbygpOworICB9Cit9OworCisvLyAuTUlQUy5hYmlmbGFncyBzZWN0aW9uIGNvbnRlbnQKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBzdHJ1Y3QgRWxmX01pcHNfQUJJRmxhZ3MgeworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVNfRUxGVChFTEZUKQorICBFbGZfSGFsZiB2ZXJzaW9uOyAgLy8gVmVyc2lvbiBvZiB0aGUgc3RydWN0dXJlCisgIHVpbnQ4X3QgaXNhX2xldmVsOyAvLyBJU0EgbGV2ZWw6IDEtNSwgMzIsIGFuZCA2NAorICB1aW50OF90IGlzYV9yZXY7ICAgLy8gSVNBIHJldmlzaW9uICgwIGZvciBNSVBTIEkgLSBNSVBTIFYpCisgIHVpbnQ4X3QgZ3ByX3NpemU7ICAvLyBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIHNpemUKKyAgdWludDhfdCBjcHIxX3NpemU7IC8vIENvLXByb2Nlc3NvciAxIHJlZ2lzdGVycyBzaXplCisgIHVpbnQ4X3QgY3ByMl9zaXplOyAvLyBDby1wcm9jZXNzb3IgMiByZWdpc3RlcnMgc2l6ZQorICB1aW50OF90IGZwX2FiaTsgICAgLy8gRmxvYXRpbmctcG9pbnQgQUJJIGZsYWcKKyAgRWxmX1dvcmQgaXNhX2V4dDsgIC8vIFByb2Nlc3Nvci1zcGVjaWZpYyBleHRlbnNpb24KKyAgRWxmX1dvcmQgYXNlczsgICAgIC8vIEFTRXMgZmxhZ3MKKyAgRWxmX1dvcmQgZmxhZ3MxOyAgIC8vIEdlbmVyYWwgZmxhZ3MKKyAgRWxmX1dvcmQgZmxhZ3MyOyAgIC8vIEdlbmVyYWwgZmxhZ3MKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvYmplY3QuCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bS4KKworI2VuZGlmIC8vIExMVk1fT0JKRUNUX0VMRlRZUEVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0Vycm9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9FcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTM4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9FcnJvci5oCkBAIC0wLDAgKzEsOTIgQEAKKy8vPT09LSBFcnJvci5oIC0gc3lzdGVtX2Vycm9yIGV4dGVuc2lvbnMgZm9yIE9iamVjdCAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBkZWNsYXJlcyBhIG5ldyBlcnJvcl9jYXRlZ29yeSBmb3IgdGhlIE9iamVjdCBsaWJyYXJ5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RfRVJST1JfSAorI2RlZmluZSBMTFZNX09CSkVDVF9FUlJPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9iamVjdCB7CisKK2NsYXNzIEJpbmFyeTsKKworY29uc3Qgc3RkOjplcnJvcl9jYXRlZ29yeSAmb2JqZWN0X2NhdGVnb3J5KCk7CisKK2VudW0gY2xhc3Mgb2JqZWN0X2Vycm9yIHsKKyAgLy8gRXJyb3IgY29kZSAwIGlzIGFic2VudC4gVXNlIHN0ZDo6ZXJyb3JfY29kZSgpIGluc3RlYWQuCisgIGFyY2hfbm90X2ZvdW5kID0gMSwKKyAgaW52YWxpZF9maWxlX3R5cGUsCisgIHBhcnNlX2ZhaWxlZCwKKyAgdW5leHBlY3RlZF9lb2YsCisgIHN0cmluZ190YWJsZV9ub25fbnVsbF9lbmQsCisgIGludmFsaWRfc2VjdGlvbl9pbmRleCwKKyAgYml0Y29kZV9zZWN0aW9uX25vdF9mb3VuZCwKKyAgaW52YWxpZF9zeW1ib2xfaW5kZXgsCit9OworCitpbmxpbmUgc3RkOjplcnJvcl9jb2RlIG1ha2VfZXJyb3JfY29kZShvYmplY3RfZXJyb3IgZSkgeworICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKHN0YXRpY19jYXN0PGludD4oZSksIG9iamVjdF9jYXRlZ29yeSgpKTsKK30KKworLy8vIEJhc2UgY2xhc3MgZm9yIGFsbCBlcnJvcnMgaW5kaWNhdGluZyBtYWxmb3JtZWQgYmluYXJ5IGZpbGVzLgorLy8vCisvLy8gSGF2aW5nIGEgc3ViY2xhc3MgZm9yIGFsbCBtYWxmb3JtZWQgYmluYXJ5IGZpbGVzIGFsbG93cyBhcmNoaXZlLXdhbGtpbmcKKy8vLyBjb2RlIHRvIHNraXAgbWFsZm9ybWVkIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRvIHVuZGVyc3RhbmQgZXZlcnkgcG9zc2libGUKKy8vLyB3YXkgdGhhdCBhIGJpbmFyeSBmaWxlIG1pZ2h0IGJlIG1hbGZvcm1lZC4KKy8vLworLy8vIEN1cnJlbnRseSBpbmhlcml0cyBmcm9tIEVDRXJyb3IgZm9yIGVhc3kgaW50ZXJvcGVyYWJpbGl0eSB3aXRoCisvLy8gc3RkOjplcnJvcl9jb2RlLCBidXQgdGhpcyB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KK2NsYXNzIEJpbmFyeUVycm9yIDogcHVibGljIEVycm9ySW5mbzxCaW5hcnlFcnJvciwgRUNFcnJvcj4geworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKyAgQmluYXJ5RXJyb3IoKSB7CisgICAgLy8gRGVmYXVsdCB0byBwYXJzZV9mYWlsZWQsIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggc2V0RXJyb3JDb2RlLgorICAgIHNldEVycm9yQ29kZShtYWtlX2Vycm9yX2NvZGUob2JqZWN0X2Vycm9yOjpwYXJzZV9mYWlsZWQpKTsKKyAgfQorfTsKKworLy8vIEdlbmVyaWMgYmluYXJ5IGVycm9yLgorLy8vCisvLy8gRm9yIGVycm9ycyB0aGF0IGRvbid0IHJlcXVpcmUgdGhlaXIgb3duIHNwZWNpZmljIHN1Yi1lcnJvciAobW9zdCBlcnJvcnMpCisvLy8gdGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBkZXNjcmliZSB0aGUgZXJyb3IgdmlhIGEgc3RyaW5nIG1lc3NhZ2UuCitjbGFzcyBHZW5lcmljQmluYXJ5RXJyb3IgOiBwdWJsaWMgRXJyb3JJbmZvPEdlbmVyaWNCaW5hcnlFcnJvciwgQmluYXJ5RXJyb3I+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIEdlbmVyaWNCaW5hcnlFcnJvcihUd2luZSBNc2cpOworICBHZW5lcmljQmluYXJ5RXJyb3IoVHdpbmUgTXNnLCBvYmplY3RfZXJyb3IgRUNPdmVycmlkZSk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRNZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gTXNnOyB9CisgIHZvaWQgbG9nKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7Citwcml2YXRlOgorICBzdGQ6OnN0cmluZyBNc2c7Cit9OworCisvLy8gaXNOb3RPYmplY3RFcnJvckludmFsaWRGaWxlVHlwZSgpIGlzIHVzZWQgd2hlbiBsb29waW5nIHRocm91Z2ggdGhlIGNoaWxkcmVuCisvLy8gb2YgYW4gYXJjaGl2ZSBhZnRlciBjYWxsaW5nIGdldEFzQmluYXJ5KCkgb24gdGhlIGNoaWxkIGFuZCBpdCByZXR1cm5zIGFuCisvLy8gbGx2bTo6RXJyb3IuICBJbiB0aGUgY2FzZXMgd2Ugd2FudCB0byBsb29wIHRocm91Z2ggdGhlIGNoaWxkcmVuIGFuZCBpZ25vcmUgdGhlCisvLy8gbm9uLW9iamVjdHMgaW4gdGhlIGFyY2hpdmUgdGhpcyBpcyB1c2VkIHRvIHRlc3QgdGhlIGVycm9yIHRvIHNlZSBpZiBhbgorLy8vIGVycm9yKCkgZnVuY3Rpb24gbmVlZHMgdG8gY2FsbGVkIG9uIHRoZSBsbHZtOjpFcnJvci4KK0Vycm9yIGlzTm90T2JqZWN0RXJyb3JJbnZhbGlkRmlsZVR5cGUobGx2bTo6RXJyb3IgRXJyKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9iamVjdC4KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0uCisKK25hbWVzcGFjZSBzdGQgewordGVtcGxhdGUgPD4KK3N0cnVjdCBpc19lcnJvcl9jb2RlX2VudW08bGx2bTo6b2JqZWN0OjpvYmplY3RfZXJyb3I+IDogc3RkOjp0cnVlX3R5cGUge307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvSVJPYmplY3RGaWxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9JUk9iamVjdEZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzI3MWIxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvSVJPYmplY3RGaWxlLmgKQEAgLTAsMCArMSw4MiBAQAorLy89PT0tIElST2JqZWN0RmlsZS5oIC0gTExWTSBJUiBvYmplY3QgZmlsZSBpbXBsZW1lbnRhdGlvbiAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIElST2JqZWN0RmlsZSB0ZW1wbGF0ZSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUX0lST0JKRUNURklMRV9ICisjZGVmaW5lIExMVk1fT0JKRUNUX0lST0JKRUNURklMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9JUlN5bXRhYi5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L01vZHVsZVN5bWJvbFRhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvU3ltYm9saWNGaWxlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEJpdGNvZGVNb2R1bGU7CitjbGFzcyBNYW5nbGVyOworY2xhc3MgTW9kdWxlOworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBUcmlwbGU7CisKK25hbWVzcGFjZSBvYmplY3QgeworY2xhc3MgT2JqZWN0RmlsZTsKKworY2xhc3MgSVJPYmplY3RGaWxlIDogcHVibGljIFN5bWJvbGljRmlsZSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+PiBNb2RzOworICBNb2R1bGVTeW1ib2xUYWJsZSBTeW1UYWI7CisgIElST2JqZWN0RmlsZShNZW1vcnlCdWZmZXJSZWYgT2JqZWN0LAorICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4+IE1vZHMpOworCitwdWJsaWM6CisgIH5JUk9iamVjdEZpbGUoKSBvdmVycmlkZTsKKyAgdm9pZCBtb3ZlU3ltYm9sTmV4dChEYXRhUmVmSW1wbCAmU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6ZXJyb3JfY29kZSBwcmludFN5bWJvbE5hbWUocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTeW1ib2xGbGFncyhEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgYmFzaWNfc3ltYm9sX2l0ZXJhdG9yIHN5bWJvbF9iZWdpbigpIGNvbnN0IG92ZXJyaWRlOworICBiYXNpY19zeW1ib2xfaXRlcmF0b3Igc3ltYm9sX2VuZCgpIGNvbnN0IG92ZXJyaWRlOworCisgIFN0cmluZ1JlZiBnZXRUYXJnZXRUcmlwbGUoKSBjb25zdDsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEJpbmFyeSAqdikgeworICAgIHJldHVybiB2LT5pc0lSKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEZpbmRzIGFuZCByZXR1cm5zIGJpdGNvZGUgZW1iZWRkZWQgaW4gdGhlIGdpdmVuIG9iamVjdCBmaWxlLCBvciBhbgorICAvLy8gZXJyb3IgY29kZSBpZiBub3QgZm91bmQuCisgIHN0YXRpYyBFeHBlY3RlZDxNZW1vcnlCdWZmZXJSZWY+IGZpbmRCaXRjb2RlSW5PYmplY3QoY29uc3QgT2JqZWN0RmlsZSAmT2JqKTsKKworICAvLy8gXGJyaWVmIEZpbmRzIGFuZCByZXR1cm5zIGJpdGNvZGUgaW4gdGhlIGdpdmVuIG1lbW9yeSBidWZmZXIgKHdoaWNoIG1heQorICAvLy8gYmUgZWl0aGVyIGEgYml0Y29kZSBmaWxlIG9yIGEgbmF0aXZlIG9iamVjdCBmaWxlIHdpdGggZW1iZWRkZWQgYml0Y29kZSksCisgIC8vLyBvciBhbiBlcnJvciBjb2RlIGlmIG5vdCBmb3VuZC4KKyAgc3RhdGljIEV4cGVjdGVkPE1lbW9yeUJ1ZmZlclJlZj4KKyAgZmluZEJpdGNvZGVJbk1lbUJ1ZmZlcihNZW1vcnlCdWZmZXJSZWYgT2JqZWN0KTsKKworICBzdGF0aWMgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPElST2JqZWN0RmlsZT4+IGNyZWF0ZShNZW1vcnlCdWZmZXJSZWYgT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQ29udGV4dCAmQ29udGV4dCk7Cit9OworCisvLy8gVGhlIGNvbnRlbnRzIG9mIGEgYml0Y29kZSBmaWxlIGFuZCBpdHMgaXJzeW10YWIuIEFueSB1bmRlcmx5aW5nIGRhdGEKKy8vLyBmb3IgdGhlIGlyc3ltdGFiIGFyZSBvd25lZCBieSBTeW10YWIgYW5kIFN0cnRhYi4KK3N0cnVjdCBJUlN5bXRhYkZpbGUgeworICBzdGQ6OnZlY3RvcjxCaXRjb2RlTW9kdWxlPiBNb2RzOworICBTbWFsbFZlY3RvcjxjaGFyLCAwPiBTeW10YWIsIFN0cnRhYjsKKyAgaXJzeW10YWI6OlJlYWRlciBUaGVSZWFkZXI7Cit9OworCisvLy8gUmVhZHMgYSBiaXRjb2RlIGZpbGUsIGNyZWF0aW5nIGl0cyBpcnN5bXRhYiBpZiBuZWNlc3NhcnkuCitFeHBlY3RlZDxJUlN5bXRhYkZpbGU+IHJlYWRJUlN5bXRhYihNZW1vcnlCdWZmZXJSZWYgTUJSZWYpOworCit9CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9JUlN5bXRhYi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvSVJTeW10YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjZhMDI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvSVJTeW10YWIuaApAQCAtMCwwICsxLDM1OCBAQAorLy89PT0tIElSU3ltdGFiLmggLSBkYXRhIGRlZmluaXRpb25zIGZvciBJUiBzeW1ib2wgdGFibGVzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgZGF0YSBkZWZpbml0aW9ucyBhbmQgYSByZWFkZXIgYW5kIGJ1aWxkZXIgZm9yIGEgc3ltYm9sCisvLyB0YWJsZSBmb3IgTExWTSBJUi4gSXRzIHB1cnBvc2UgaXMgdG8gYWxsb3cgbGlua2VycyBhbmQgb3RoZXIgY29uc3VtZXJzIG9mCisvLyBiaXRjb2RlIGZpbGVzIHRvIGVmZmljaWVudGx5IHJlYWQgdGhlIHN5bWJvbCB0YWJsZSBmb3Igc3ltYm9sIHJlc29sdXRpb24KKy8vIHB1cnBvc2VzIHdpdGhvdXQgbmVlZGluZyB0byBjb25zdHJ1Y3QgYSBtb2R1bGUgaW4gbWVtb3J5LgorLy8KKy8vIEFzIHdpdGggbW9zdCBvYmplY3QgZmlsZXMgdGhlIHN5bWJvbCB0YWJsZSBoYXMgdHdvIHBhcnRzOiB0aGUgc3ltYm9sIHRhYmxlCisvLyBpdHNlbGYgYW5kIGEgc3RyaW5nIHRhYmxlIHdoaWNoIGlzIHJlZmVyZW5jZWQgYnkgdGhlIHN5bWJvbCB0YWJsZS4KKy8vCisvLyBBIHN5bWJvbCB0YWJsZSBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSBiaXRjb2RlIGZpbGUsIHdoaWNoIG1heSBjb25zaXN0IG9mCisvLyBtdWx0aXBsZSBtb2R1bGVzLCBzbyBzeW1ib2wgdGFibGVzIG1heSBsaWtld2lzZSBjb250YWluIHN5bWJvbHMgZm9yIG11bHRpcGxlCisvLyBtb2R1bGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RfSVJTWU1UQUJfSAorI2RlZmluZSBMTFZNX09CSkVDVF9JUlNZTVRBQl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9HbG9iYWxWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L1N5bWJvbGljRmlsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3N0cnVjdCBCaXRjb2RlRmlsZUNvbnRlbnRzOworY2xhc3MgU3RyaW5nVGFibGVCdWlsZGVyOworCituYW1lc3BhY2UgaXJzeW10YWIgeworCituYW1lc3BhY2Ugc3RvcmFnZSB7CisKKy8vIFRoZSBkYXRhIHN0cnVjdHVyZXMgaW4gdGhpcyBuYW1lc3BhY2UgZGVmaW5lIHRoZSBsb3ctbGV2ZWwgc2VyaWFsaXphdGlvbgorLy8gZm9ybWF0LiBDbGllbnRzIHRoYXQganVzdCB3YW50IHRvIHJlYWQgYSBzeW1ib2wgdGFibGUgc2hvdWxkIHVzZSB0aGUKKy8vIGlyc3ltdGFiOjpSZWFkZXIgY2xhc3MuCisKK3VzaW5nIFdvcmQgPSBzdXBwb3J0Ojp1bGl0dGxlMzJfdDsKKworLy8vIEEgcmVmZXJlbmNlIHRvIGEgc3RyaW5nIGluIHRoZSBzdHJpbmcgdGFibGUuCitzdHJ1Y3QgU3RyIHsKKyAgV29yZCBPZmZzZXQsIFNpemU7CisKKyAgU3RyaW5nUmVmIGdldChTdHJpbmdSZWYgU3RydGFiKSBjb25zdCB7CisgICAgcmV0dXJuIHtTdHJ0YWIuZGF0YSgpICsgT2Zmc2V0LCBTaXplfTsKKyAgfQorfTsKKworLy8vIEEgcmVmZXJlbmNlIHRvIGEgcmFuZ2Ugb2Ygb2JqZWN0cyBpbiB0aGUgc3ltYm9sIHRhYmxlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBSYW5nZSB7CisgIFdvcmQgT2Zmc2V0LCBTaXplOworCisgIEFycmF5UmVmPFQ+IGdldChTdHJpbmdSZWYgU3ltdGFiKSBjb25zdCB7CisgICAgcmV0dXJuIHtyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4oU3ltdGFiLmRhdGEoKSArIE9mZnNldCksIFNpemV9OworICB9Cit9OworCisvLy8gRGVzY3JpYmVzIHRoZSByYW5nZSBvZiBhIHBhcnRpY3VsYXIgbW9kdWxlJ3Mgc3ltYm9scyB3aXRoaW4gdGhlIHN5bWJvbAorLy8vIHRhYmxlLgorc3RydWN0IE1vZHVsZSB7CisgIFdvcmQgQmVnaW4sIEVuZDsKKworICAvLy8gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBVbmNvbW1vbiBmb3IgdGhpcyBNb2R1bGUuCisgIFdvcmQgVW5jQmVnaW47Cit9OworCisvLy8gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGFuIElSIGNvbWRhdC4KK3N0cnVjdCBDb21kYXQgeworICBTdHIgTmFtZTsKK307CisKKy8vLyBDb250YWlucyB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIGJ5IGxpbmtlcnMgZm9yIHN5bWJvbCByZXNvbHV0aW9uLCBhcyB3ZWxsIGFzCisvLy8gYnkgdGhlIExUTyBpbXBsZW1lbnRhdGlvbiBpdHNlbGYuCitzdHJ1Y3QgU3ltYm9sIHsKKyAgLy8vIFRoZSBtYW5nbGVkIHN5bWJvbCBuYW1lLgorICBTdHIgTmFtZTsKKworICAvLy8gVGhlIHVubWFuZ2xlZCBzeW1ib2wgbmFtZSwgb3IgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGlzIGlzIG5vdCBhbiBJUgorICAvLy8gc3ltYm9sLgorICBTdHIgSVJOYW1lOworCisgIC8vLyBUaGUgaW5kZXggaW50byBIZWFkZXI6OkNvbWRhdHMsIG9yIC0xIGlmIG5vdCBhIGNvbWRhdCBtZW1iZXIuCisgIFdvcmQgQ29tZGF0SW5kZXg7CisKKyAgV29yZCBGbGFnczsKKyAgZW51bSBGbGFnQml0cyB7CisgICAgRkJfdmlzaWJpbGl0eSwgLy8gMiBiaXRzCisgICAgRkJfaGFzX3VuY29tbW9uID0gRkJfdmlzaWJpbGl0eSArIDIsCisgICAgRkJfdW5kZWZpbmVkLAorICAgIEZCX3dlYWssCisgICAgRkJfY29tbW9uLAorICAgIEZCX2luZGlyZWN0LAorICAgIEZCX3VzZWQsCisgICAgRkJfdGxzLAorICAgIEZCX21heV9vbWl0LAorICAgIEZCX2dsb2JhbCwKKyAgICBGQl9mb3JtYXRfc3BlY2lmaWMsCisgICAgRkJfdW5uYW1lZF9hZGRyLAorICAgIEZCX2V4ZWN1dGFibGUsCisgIH07Cit9OworCisvLy8gVGhpcyBkYXRhIHN0cnVjdHVyZSBjb250YWlucyByYXJlbHkgdXNlZCBzeW1ib2wgZmllbGRzIGFuZCBpcyBvcHRpb25hbGx5CisvLy8gcmVmZXJlbmNlZCBieSBhIFN5bWJvbC4KK3N0cnVjdCBVbmNvbW1vbiB7CisgIFdvcmQgQ29tbW9uU2l6ZSwgQ29tbW9uQWxpZ247CisKKyAgLy8vIENPRkYtc3BlY2lmaWM6IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdGhhdCBhIHdlYWsgZXh0ZXJuYWwgcmVzb2x2ZXMgdG8KKyAgLy8vIGlmIG5vdCBkZWZpbmVkLgorICBTdHIgQ09GRldlYWtFeHRlcm5GYWxsYmFja05hbWU7CisKKyAgLy8vIFNwZWNpZmllZCBzZWN0aW9uIG5hbWUsIGlmIGFueS4KKyAgU3RyIFNlY3Rpb25OYW1lOworfTsKKworc3RydWN0IEhlYWRlciB7CisgIC8vLyBWZXJzaW9uIG51bWJlciBvZiB0aGUgc3ltdGFiIGZvcm1hdC4gVGhpcyBudW1iZXIgc2hvdWxkIGJlIGluY3JlbWVudGVkCisgIC8vLyB3aGVuIHRoZSBmb3JtYXQgY2hhbmdlcywgYnV0IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgaW5jcmVtZW50ZWQgaWYgYQorICAvLy8gY2hhbmdlIHRvIExMVk0gd291bGQgY2F1c2UgaXQgdG8gY3JlYXRlIGEgZGlmZmVyZW50IHN5bWJvbCB0YWJsZS4KKyAgV29yZCBWZXJzaW9uOworICBlbnVtIHsga0N1cnJlbnRWZXJzaW9uID0gMSB9OworCisgIC8vLyBUaGUgcHJvZHVjZXIncyB2ZXJzaW9uIHN0cmluZyAoTExWTV9WRVJTSU9OX1NUUklORyAiICIgTExWTV9SRVZJU0lPTikuCisgIC8vLyBDb25zdW1lcnMgc2hvdWxkIHJlYnVpbGQgdGhlIHN5bWJvbCB0YWJsZSBmcm9tIElSIGlmIHRoZSBwcm9kdWNlcidzCisgIC8vLyB2ZXJzaW9uIGRvZXMgbm90IG1hdGNoIHRoZSBjb25zdW1lcidzIHZlcnNpb24gZHVlIHRvIHBvdGVudGlhbCBkaWZmZXJlbmNlcworICAvLy8gaW4gc3ltYm9sIHRhYmxlIGZvcm1hdCwgc3ltYm9sIGVudW1lcmF0aW9uIG9yZGVyIGFuZCBzbyBvbi4KKyAgU3RyIFByb2R1Y2VyOworCisgIFJhbmdlPE1vZHVsZT4gTW9kdWxlczsKKyAgUmFuZ2U8Q29tZGF0PiBDb21kYXRzOworICBSYW5nZTxTeW1ib2w+IFN5bWJvbHM7CisgIFJhbmdlPFVuY29tbW9uPiBVbmNvbW1vbnM7CisKKyAgU3RyIFRhcmdldFRyaXBsZSwgU291cmNlRmlsZU5hbWU7CisKKyAgLy8vIENPRkYtc3BlY2lmaWM6IGxpbmtlciBkaXJlY3RpdmVzLgorICBTdHIgQ09GRkxpbmtlck9wdHM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugc3RvcmFnZQorCisvLy8gRmlsbHMgaW4gU3ltdGFiIGFuZCBTdHJ0YWJCdWlsZGVyIHdpdGggYSB2YWxpZCBzeW1ib2wgYW5kIHN0cmluZyB0YWJsZSBmb3IKKy8vLyBNb2RzLgorRXJyb3IgYnVpbGQoQXJyYXlSZWY8TW9kdWxlICo+IE1vZHMsIFNtYWxsVmVjdG9yPGNoYXIsIDA+ICZTeW10YWIsCisgICAgICAgICAgICBTdHJpbmdUYWJsZUJ1aWxkZXIgJlN0cnRhYkJ1aWxkZXIsIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jKTsKKworLy8vIFRoaXMgcmVwcmVzZW50cyBhIHN5bWJvbCB0aGF0IGhhcyBiZWVuIHJlYWQgZnJvbSBhIHN0b3JhZ2U6OlN5bWJvbCBhbmQKKy8vLyBwb3NzaWJseSBhIHN0b3JhZ2U6OlVuY29tbW9uLgorc3RydWN0IFN5bWJvbCB7CisgIC8vIENvcGllZCBmcm9tIHN0b3JhZ2U6OlN5bWJvbC4KKyAgU3RyaW5nUmVmIE5hbWUsIElSTmFtZTsKKyAgaW50IENvbWRhdEluZGV4OworICB1aW50MzJfdCBGbGFnczsKKworICAvLyBDb3BpZWQgZnJvbSBzdG9yYWdlOjpVbmNvbW1vbi4KKyAgdWludDMyX3QgQ29tbW9uU2l6ZSwgQ29tbW9uQWxpZ247CisgIFN0cmluZ1JlZiBDT0ZGV2Vha0V4dGVybkZhbGxiYWNrTmFtZTsKKyAgU3RyaW5nUmVmIFNlY3Rpb25OYW1lOworCisgIC8vLyBSZXR1cm5zIHRoZSBtYW5nbGVkIHN5bWJvbCBuYW1lLgorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICAvLy8gUmV0dXJucyB0aGUgdW5tYW5nbGVkIHN5bWJvbCBuYW1lLCBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoaXMgaXMgbm90IGFuCisgIC8vLyBJUiBzeW1ib2wuCisgIFN0cmluZ1JlZiBnZXRJUk5hbWUoKSBjb25zdCB7IHJldHVybiBJUk5hbWU7IH0KKworICAvLy8gUmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29tZGF0IHRhYmxlIChzZWUgUmVhZGVyOjpnZXRDb21kYXRUYWJsZSgpKSwgb3IKKyAgLy8vIC0xIGlmIG5vdCBhIGNvbWRhdCBtZW1iZXIuCisgIGludCBnZXRDb21kYXRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIENvbWRhdEluZGV4OyB9CisKKyAgdXNpbmcgUyA9IHN0b3JhZ2U6OlN5bWJvbDsKKworICBHbG9iYWxWYWx1ZTo6VmlzaWJpbGl0eVR5cGVzIGdldFZpc2liaWxpdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIEdsb2JhbFZhbHVlOjpWaXNpYmlsaXR5VHlwZXMoKEZsYWdzID4+IFM6OkZCX3Zpc2liaWxpdHkpICYgMyk7CisgIH0KKworICBib29sIGlzVW5kZWZpbmVkKCkgY29uc3QgeyByZXR1cm4gKEZsYWdzID4+IFM6OkZCX3VuZGVmaW5lZCkgJiAxOyB9CisgIGJvb2wgaXNXZWFrKCkgY29uc3QgeyByZXR1cm4gKEZsYWdzID4+IFM6OkZCX3dlYWspICYgMTsgfQorICBib29sIGlzQ29tbW9uKCkgY29uc3QgeyByZXR1cm4gKEZsYWdzID4+IFM6OkZCX2NvbW1vbikgJiAxOyB9CisgIGJvb2wgaXNJbmRpcmVjdCgpIGNvbnN0IHsgcmV0dXJuIChGbGFncyA+PiBTOjpGQl9pbmRpcmVjdCkgJiAxOyB9CisgIGJvb2wgaXNVc2VkKCkgY29uc3QgeyByZXR1cm4gKEZsYWdzID4+IFM6OkZCX3VzZWQpICYgMTsgfQorICBib29sIGlzVExTKCkgY29uc3QgeyByZXR1cm4gKEZsYWdzID4+IFM6OkZCX3RscykgJiAxOyB9CisKKyAgYm9vbCBjYW5CZU9taXR0ZWRGcm9tU3ltYm9sVGFibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIChGbGFncyA+PiBTOjpGQl9tYXlfb21pdCkgJiAxOworICB9CisKKyAgYm9vbCBpc0dsb2JhbCgpIGNvbnN0IHsgcmV0dXJuIChGbGFncyA+PiBTOjpGQl9nbG9iYWwpICYgMTsgfQorICBib29sIGlzRm9ybWF0U3BlY2lmaWMoKSBjb25zdCB7IHJldHVybiAoRmxhZ3MgPj4gUzo6RkJfZm9ybWF0X3NwZWNpZmljKSAmIDE7IH0KKyAgYm9vbCBpc1VubmFtZWRBZGRyKCkgY29uc3QgeyByZXR1cm4gKEZsYWdzID4+IFM6OkZCX3VubmFtZWRfYWRkcikgJiAxOyB9CisgIGJvb2wgaXNFeGVjdXRhYmxlKCkgY29uc3QgeyByZXR1cm4gKEZsYWdzID4+IFM6OkZCX2V4ZWN1dGFibGUpICYgMTsgfQorCisgIHVpbnQ2NF90IGdldENvbW1vblNpemUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQ29tbW9uKCkpOworICAgIHJldHVybiBDb21tb25TaXplOworICB9CisKKyAgdWludDMyX3QgZ2V0Q29tbW9uQWxpZ25tZW50KCkgY29uc3QgeworICAgIGFzc2VydChpc0NvbW1vbigpKTsKKyAgICByZXR1cm4gQ29tbW9uQWxpZ247CisgIH0KKworICAvLy8gQ09GRi1zcGVjaWZpYzogZm9yIHdlYWsgZXh0ZXJuYWxzLCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdGhhdCBpcworICAvLy8gdXNlZCBhcyBhIGZhbGxiYWNrIGlmIHRoZSB3ZWFrIGV4dGVybmFsIHJlbWFpbnMgdW5kZWZpbmVkLgorICBTdHJpbmdSZWYgZ2V0Q09GRldlYWtFeHRlcm5hbEZhbGxiYWNrKCkgY29uc3QgeworICAgIGFzc2VydChpc1dlYWsoKSAmJiBpc0luZGlyZWN0KCkpOworICAgIHJldHVybiBDT0ZGV2Vha0V4dGVybkZhbGxiYWNrTmFtZTsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRTZWN0aW9uTmFtZSgpIGNvbnN0IHsgcmV0dXJuIFNlY3Rpb25OYW1lOyB9Cit9OworCisvLy8gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byByZWFkIGEgU3ltdGFiIGFuZCBTdHJ0YWIgcHJvZHVjZWQgYnkKKy8vLyBpcnN5bXRhYjo6YnVpbGQuCitjbGFzcyBSZWFkZXIgeworICBTdHJpbmdSZWYgU3ltdGFiLCBTdHJ0YWI7CisKKyAgQXJyYXlSZWY8c3RvcmFnZTo6TW9kdWxlPiBNb2R1bGVzOworICBBcnJheVJlZjxzdG9yYWdlOjpDb21kYXQ+IENvbWRhdHM7CisgIEFycmF5UmVmPHN0b3JhZ2U6OlN5bWJvbD4gU3ltYm9sczsKKyAgQXJyYXlSZWY8c3RvcmFnZTo6VW5jb21tb24+IFVuY29tbW9uczsKKworICBTdHJpbmdSZWYgc3RyKHN0b3JhZ2U6OlN0ciBTKSBjb25zdCB7IHJldHVybiBTLmdldChTdHJ0YWIpOyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEFycmF5UmVmPFQ+IHJhbmdlKHN0b3JhZ2U6OlJhbmdlPFQ+IFIpIGNvbnN0IHsKKyAgICByZXR1cm4gUi5nZXQoU3ltdGFiKTsKKyAgfQorCisgIGNvbnN0IHN0b3JhZ2U6OkhlYWRlciAmaGVhZGVyKCkgY29uc3QgeworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdG9yYWdlOjpIZWFkZXIgKj4oU3ltdGFiLmRhdGEoKSk7CisgIH0KKworcHVibGljOgorICBjbGFzcyBTeW1ib2xSZWY7CisKKyAgUmVhZGVyKCkgPSBkZWZhdWx0OworICBSZWFkZXIoU3RyaW5nUmVmIFN5bXRhYiwgU3RyaW5nUmVmIFN0cnRhYikgOiBTeW10YWIoU3ltdGFiKSwgU3RydGFiKFN0cnRhYikgeworICAgIE1vZHVsZXMgPSByYW5nZShoZWFkZXIoKS5Nb2R1bGVzKTsKKyAgICBDb21kYXRzID0gcmFuZ2UoaGVhZGVyKCkuQ29tZGF0cyk7CisgICAgU3ltYm9scyA9IHJhbmdlKGhlYWRlcigpLlN5bWJvbHMpOworICAgIFVuY29tbW9ucyA9IHJhbmdlKGhlYWRlcigpLlVuY29tbW9ucyk7CisgIH0KKworICB1c2luZyBzeW1ib2xfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxvYmplY3Q6OmNvbnRlbnRfaXRlcmF0b3I8U3ltYm9sUmVmPj47CisKKyAgLy8vIFJldHVybnMgdGhlIHN5bWJvbCB0YWJsZSBmb3IgdGhlIGVudGlyZSBiaXRjb2RlIGZpbGUuCisgIC8vLyBUaGUgc3ltYm9scyBlbnVtZXJhdGVkIGJ5IHRoaXMgbWV0aG9kIGFyZSBlcGhlbWVyYWwsIGJ1dCB0aGV5IGNhbiBiZQorICAvLy8gY29waWVkIGludG8gYW4gaXJzeW10YWI6OlN5bWJvbCBvYmplY3QuCisgIHN5bWJvbF9yYW5nZSBzeW1ib2xzKCkgY29uc3Q7CisKKyAgc2l6ZV90IGdldE51bU1vZHVsZXMoKSBjb25zdCB7IHJldHVybiBNb2R1bGVzLnNpemUoKTsgfQorCisgIC8vLyBSZXR1cm5zIGEgc2xpY2Ugb2YgdGhlIHN5bWJvbCB0YWJsZSBmb3IgdGhlIEkndGggbW9kdWxlIGluIHRoZSBmaWxlLgorICAvLy8gVGhlIHN5bWJvbHMgZW51bWVyYXRlZCBieSB0aGlzIG1ldGhvZCBhcmUgZXBoZW1lcmFsLCBidXQgdGhleSBjYW4gYmUKKyAgLy8vIGNvcGllZCBpbnRvIGFuIGlyc3ltdGFiOjpTeW1ib2wgb2JqZWN0LgorICBzeW1ib2xfcmFuZ2UgbW9kdWxlX3N5bWJvbHModW5zaWduZWQgSSkgY29uc3Q7CisKKyAgU3RyaW5nUmVmIGdldFRhcmdldFRyaXBsZSgpIGNvbnN0IHsgcmV0dXJuIHN0cihoZWFkZXIoKS5UYXJnZXRUcmlwbGUpOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIHNvdXJjZSBmaWxlIHBhdGggc3BlY2lmaWVkIGF0IGNvbXBpbGUgdGltZS4KKyAgU3RyaW5nUmVmIGdldFNvdXJjZUZpbGVOYW1lKCkgY29uc3QgeyByZXR1cm4gc3RyKGhlYWRlcigpLlNvdXJjZUZpbGVOYW1lKTsgfQorCisgIC8vLyBSZXR1cm5zIGEgdGFibGUgd2l0aCBhbGwgdGhlIGNvbWRhdHMgdXNlZCBieSB0aGlzIGZpbGUuCisgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gZ2V0Q29tZGF0VGFibGUoKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBDb21kYXRUYWJsZTsKKyAgICBDb21kYXRUYWJsZS5yZXNlcnZlKENvbWRhdHMuc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8gQyA6IENvbWRhdHMpCisgICAgICBDb21kYXRUYWJsZS5wdXNoX2JhY2soc3RyKEMuTmFtZSkpOworICAgIHJldHVybiBDb21kYXRUYWJsZTsKKyAgfQorCisgIC8vLyBDT0ZGLXNwZWNpZmljOiByZXR1cm5zIGxpbmtlciBvcHRpb25zIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgZmlsZS4KKyAgU3RyaW5nUmVmIGdldENPRkZMaW5rZXJPcHRzKCkgY29uc3QgeyByZXR1cm4gc3RyKGhlYWRlcigpLkNPRkZMaW5rZXJPcHRzKTsgfQorfTsKKworLy8vIEVwaGVtZXJhbCBzeW1ib2xzIHByb2R1Y2VkIGJ5IFJlYWRlcjo6c3ltYm9scygpIGFuZAorLy8vIFJlYWRlcjo6bW9kdWxlX3N5bWJvbHMoKS4KK2NsYXNzIFJlYWRlcjo6U3ltYm9sUmVmIDogcHVibGljIFN5bWJvbCB7CisgIGNvbnN0IHN0b3JhZ2U6OlN5bWJvbCAqU3ltSSwgKlN5bUU7CisgIGNvbnN0IHN0b3JhZ2U6OlVuY29tbW9uICpVbmNJOworICBjb25zdCBSZWFkZXIgKlI7CisKKyAgdm9pZCByZWFkKCkgeworICAgIGlmIChTeW1JID09IFN5bUUpCisgICAgICByZXR1cm47CisKKyAgICBOYW1lID0gUi0+c3RyKFN5bUktPk5hbWUpOworICAgIElSTmFtZSA9IFItPnN0cihTeW1JLT5JUk5hbWUpOworICAgIENvbWRhdEluZGV4ID0gU3ltSS0+Q29tZGF0SW5kZXg7CisgICAgRmxhZ3MgPSBTeW1JLT5GbGFnczsKKworICAgIGlmIChGbGFncyAmICgxIDw8IHN0b3JhZ2U6OlN5bWJvbDo6RkJfaGFzX3VuY29tbW9uKSkgeworICAgICAgQ29tbW9uU2l6ZSA9IFVuY0ktPkNvbW1vblNpemU7CisgICAgICBDb21tb25BbGlnbiA9IFVuY0ktPkNvbW1vbkFsaWduOworICAgICAgQ09GRldlYWtFeHRlcm5GYWxsYmFja05hbWUgPSBSLT5zdHIoVW5jSS0+Q09GRldlYWtFeHRlcm5GYWxsYmFja05hbWUpOworICAgICAgU2VjdGlvbk5hbWUgPSBSLT5zdHIoVW5jSS0+U2VjdGlvbk5hbWUpOworICAgIH0gZWxzZQorICAgICAgLy8gUmVzZXQgdGhpcyBmaWVsZCBzbyBpdCBjYW4gYmUgcXVlcmllZCB1bmNvbmRpdGlvbmFsbHkgZm9yIGFsbCBzeW1ib2xzLgorICAgICAgU2VjdGlvbk5hbWUgPSAiIjsKKyAgfQorCitwdWJsaWM6CisgIFN5bWJvbFJlZihjb25zdCBzdG9yYWdlOjpTeW1ib2wgKlN5bUksIGNvbnN0IHN0b3JhZ2U6OlN5bWJvbCAqU3ltRSwKKyAgICAgICAgICAgIGNvbnN0IHN0b3JhZ2U6OlVuY29tbW9uICpVbmNJLCBjb25zdCBSZWFkZXIgKlIpCisgICAgICA6IFN5bUkoU3ltSSksIFN5bUUoU3ltRSksIFVuY0koVW5jSSksIFIoUikgeworICAgIHJlYWQoKTsKKyAgfQorCisgIHZvaWQgbW92ZU5leHQoKSB7CisgICAgKytTeW1JOworICAgIGlmIChGbGFncyAmICgxIDw8IHN0b3JhZ2U6OlN5bWJvbDo6RkJfaGFzX3VuY29tbW9uKSkKKyAgICAgICsrVW5jSTsKKyAgICByZWFkKCk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgU3ltYm9sUmVmICZPdGhlcikgY29uc3QgeyByZXR1cm4gU3ltSSA9PSBPdGhlci5TeW1JOyB9Cit9OworCitpbmxpbmUgUmVhZGVyOjpzeW1ib2xfcmFuZ2UgUmVhZGVyOjpzeW1ib2xzKCkgY29uc3QgeworICByZXR1cm4ge1N5bWJvbFJlZihTeW1ib2xzLmJlZ2luKCksIFN5bWJvbHMuZW5kKCksIFVuY29tbW9ucy5iZWdpbigpLCB0aGlzKSwKKyAgICAgICAgICBTeW1ib2xSZWYoU3ltYm9scy5lbmQoKSwgU3ltYm9scy5lbmQoKSwgbnVsbHB0ciwgdGhpcyl9OworfQorCitpbmxpbmUgUmVhZGVyOjpzeW1ib2xfcmFuZ2UgUmVhZGVyOjptb2R1bGVfc3ltYm9scyh1bnNpZ25lZCBJKSBjb25zdCB7CisgIGNvbnN0IHN0b3JhZ2U6Ok1vZHVsZSAmTSA9IE1vZHVsZXNbSV07CisgIGNvbnN0IHN0b3JhZ2U6OlN5bWJvbCAqTUJlZ2luID0gU3ltYm9scy5iZWdpbigpICsgTS5CZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICpNRW5kID0gU3ltYm9scy5iZWdpbigpICsgTS5FbmQ7CisgIHJldHVybiB7U3ltYm9sUmVmKE1CZWdpbiwgTUVuZCwgVW5jb21tb25zLmJlZ2luKCkgKyBNLlVuY0JlZ2luLCB0aGlzKSwKKyAgICAgICAgICBTeW1ib2xSZWYoTUVuZCwgTUVuZCwgbnVsbHB0ciwgdGhpcyl9OworfQorCisvLy8gVGhlIGNvbnRlbnRzIG9mIHRoZSBpcnN5bXRhYiBpbiBhIGJpdGNvZGUgZmlsZS4gQW55IHVuZGVybHlpbmcgZGF0YSBmb3IgdGhlCisvLy8gaXJzeW10YWIgYXJlIG93bmVkIGJ5IFN5bXRhYiBhbmQgU3RydGFiLgorc3RydWN0IEZpbGVDb250ZW50cyB7CisgIFNtYWxsVmVjdG9yPGNoYXIsIDA+IFN5bXRhYiwgU3RydGFiOworICBSZWFkZXIgVGhlUmVhZGVyOworfTsKKworLy8vIFJlYWRzIHRoZSBjb250ZW50cyBvZiBhIGJpdGNvZGUgZmlsZSwgY3JlYXRpbmcgaXRzIGlyc3ltdGFiIGlmIG5lY2Vzc2FyeS4KK0V4cGVjdGVkPEZpbGVDb250ZW50cz4gcmVhZEJpdGNvZGUoY29uc3QgQml0Y29kZUZpbGVDb250ZW50cyAmQkZDKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGlyc3ltdGFiCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RfSVJTWU1UQUJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvTWFjaE8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L01hY2hPLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkMzQ2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L01hY2hPLmgKQEAgLTAsMCArMSw3MzcgQEAKKy8vPT09LSBNYWNoTy5oIC0gTWFjaE8gb2JqZWN0IGZpbGUgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBNYWNoT09iamVjdEZpbGUgY2xhc3MsIHdoaWNoIGltcGxlbWVudCB0aGUgT2JqZWN0RmlsZQorLy8gaW50ZXJmYWNlIGZvciBNYWNoTyBmaWxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUX01BQ0hPX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RfTUFDSE9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9NYWNoTy5oIgorI2luY2x1ZGUgImxsdm0vTUMvU3VidGFyZ2V0RmVhdHVyZS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0JpbmFyeS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L09iamVjdEZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9TeW1ib2xpY0ZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvYmplY3QgeworCisvLy8gRGljZVJlZiAtIFRoaXMgaXMgYSB2YWx1ZSB0eXBlIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZQorLy8vIGRhdGEgaW4gY29kZSBlbnRyeSBpbiB0aGUgdGFibGUgaW4gYSBNYWNoLU8gb2JqZWN0IGZpbGUuCitjbGFzcyBEaWNlUmVmIHsKKyAgRGF0YVJlZkltcGwgRGljZVBpbXBsOworICBjb25zdCBPYmplY3RGaWxlICpPd25pbmdPYmplY3QgPSBudWxscHRyOworCitwdWJsaWM6CisgIERpY2VSZWYoKSA9IGRlZmF1bHQ7CisgIERpY2VSZWYoRGF0YVJlZkltcGwgRGljZVAsIGNvbnN0IE9iamVjdEZpbGUgKk93bmVyKTsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgRGljZVJlZiAmT3RoZXIpIGNvbnN0OworICBib29sIG9wZXJhdG9yPChjb25zdCBEaWNlUmVmICZPdGhlcikgY29uc3Q7CisKKyAgdm9pZCBtb3ZlTmV4dCgpOworCisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRPZmZzZXQodWludDMyX3QgJlJlc3VsdCkgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRMZW5ndGgodWludDE2X3QgJlJlc3VsdCkgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRLaW5kKHVpbnQxNl90ICZSZXN1bHQpIGNvbnN0OworCisgIERhdGFSZWZJbXBsIGdldFJhd0RhdGFSZWZJbXBsKCkgY29uc3Q7CisgIGNvbnN0IE9iamVjdEZpbGUgKmdldE9iamVjdEZpbGUoKSBjb25zdDsKK307Cit1c2luZyBkaWNlX2l0ZXJhdG9yID0gY29udGVudF9pdGVyYXRvcjxEaWNlUmVmPjsKKworLy8vIEV4cG9ydEVudHJ5IGVuY2Fwc3VsYXRlcyB0aGUgY3VycmVudC1zdGF0ZS1vZi10aGUtd2FsayB1c2VkIHdoZW4gZG9pbmcgYQorLy8vIG5vbi1yZWN1cnNpdmUgd2FsayBvZiB0aGUgdHJpZSBkYXRhIHN0cnVjdHVyZS4gIFRoaXMgYWxsb3dzIHlvdSB0byBpdGVyYXRlCisvLy8gYWNyb3NzIGFsbCBleHBvcnRlZCBzeW1ib2xzIHVzaW5nOgorLy8vICAgICAgRXJyb3IgRXJyOworLy8vICAgICAgZm9yIChjb25zdCBsbHZtOjpvYmplY3Q6OkV4cG9ydEVudHJ5ICZBbkV4cG9ydCA6IE9iai0+ZXhwb3J0cygmRXJyKSkgeworLy8vICAgICAgfQorLy8vICAgICAgaWYgKEVycikgeyByZXBvcnQgZXJyb3IgLi4uCitjbGFzcyBFeHBvcnRFbnRyeSB7CitwdWJsaWM6CisgIEV4cG9ydEVudHJ5KEVycm9yICpFcnIsIGNvbnN0IE1hY2hPT2JqZWN0RmlsZSAqTywgQXJyYXlSZWY8dWludDhfdD4gVHJpZSk7CisKKyAgU3RyaW5nUmVmIG5hbWUoKSBjb25zdDsKKyAgdWludDY0X3QgZmxhZ3MoKSBjb25zdDsKKyAgdWludDY0X3QgYWRkcmVzcygpIGNvbnN0OworICB1aW50NjRfdCBvdGhlcigpIGNvbnN0OworICBTdHJpbmdSZWYgb3RoZXJOYW1lKCkgY29uc3Q7CisgIHVpbnQzMl90IG5vZGVPZmZzZXQoKSBjb25zdDsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgRXhwb3J0RW50cnkgJikgY29uc3Q7CisKKyAgdm9pZCBtb3ZlTmV4dCgpOworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgTWFjaE9PYmplY3RGaWxlOworCisgIHZvaWQgbW92ZVRvRmlyc3QoKTsKKyAgdm9pZCBtb3ZlVG9FbmQoKTsKKyAgdWludDY0X3QgcmVhZFVMRUIxMjgoY29uc3QgdWludDhfdCAqJnAsIGNvbnN0IGNoYXIgKiplcnJvcik7CisgIHZvaWQgcHVzaERvd25VbnRpbEJvdHRvbSgpOworICB2b2lkIHB1c2hOb2RlKHVpbnQ2NF90IE9mZnNldCk7CisKKyAgLy8gUmVwcmVzZW50cyBhIG5vZGUgaW4gdGhlIG1hY2gtbyBleHBvcnRzIHRyaWUuCisgIHN0cnVjdCBOb2RlU3RhdGUgeworICAgIE5vZGVTdGF0ZShjb25zdCB1aW50OF90ICpQdHIpOworCisgICAgY29uc3QgdWludDhfdCAqU3RhcnQ7CisgICAgY29uc3QgdWludDhfdCAqQ3VycmVudDsKKyAgICB1aW50NjRfdCBGbGFncyA9IDA7CisgICAgdWludDY0X3QgQWRkcmVzcyA9IDA7CisgICAgdWludDY0X3QgT3RoZXIgPSAwOworICAgIGNvbnN0IGNoYXIgKkltcG9ydE5hbWUgPSBudWxscHRyOworICAgIHVuc2lnbmVkIENoaWxkQ291bnQgPSAwOworICAgIHVuc2lnbmVkIE5leHRDaGlsZEluZGV4ID0gMDsKKyAgICB1bnNpZ25lZCBQYXJlbnRTdHJpbmdMZW5ndGggPSAwOworICAgIGJvb2wgSXNFeHBvcnROb2RlID0gZmFsc2U7CisgIH07CisgIHVzaW5nIE5vZGVMaXN0ID0gU21hbGxWZWN0b3I8Tm9kZVN0YXRlLCAxNj47CisgIHVzaW5nIG5vZGVfaXRlcmF0b3IgPSBOb2RlTGlzdDo6Y29uc3RfaXRlcmF0b3I7CisKKyAgRXJyb3IgKkU7CisgIGNvbnN0IE1hY2hPT2JqZWN0RmlsZSAqTzsKKyAgQXJyYXlSZWY8dWludDhfdD4gVHJpZTsKKyAgU21hbGxTdHJpbmc8MjU2PiBDdW11bGF0aXZlU3RyaW5nOworICBOb2RlTGlzdCBTdGFjazsKKyAgYm9vbCBEb25lID0gZmFsc2U7CisKKyAgaXRlcmF0b3JfcmFuZ2U8bm9kZV9pdGVyYXRvcj4gbm9kZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoU3RhY2suYmVnaW4oKSwgU3RhY2suZW5kKCkpOworICB9Cit9OwordXNpbmcgZXhwb3J0X2l0ZXJhdG9yID0gY29udGVudF9pdGVyYXRvcjxFeHBvcnRFbnRyeT47CisKKy8vIFNlZ21lbnQgaW5mbyBzbyBTZWdJbmRleC9TZWdPZmZzZXQgcGFpcnMgaW4gYSBNYWNoLU8gQmluZCBvciBSZWJhc2UgZW50cnkKKy8vIGNhbiBiZSBjaGVja2VkIGFuZCB0cmFuc2xhdGVkLiAgT25seSB0aGUgU2VnSW5kZXgvU2VnT2Zmc2V0IHBhaXJzIGZyb20KKy8vIGNoZWNrZWQgZW50cmllcyBhcmUgdG8gYmUgdXNlZCB3aXRoIHRoZSBzZWdtZW50TmFtZSgpLCBzZWN0aW9uTmFtZSgpIGFuZAorLy8gYWRkcmVzcygpIG1ldGhvZHMgYmVsb3cuCitjbGFzcyBCaW5kUmViYXNlU2VnSW5mbyB7CitwdWJsaWM6CisgIEJpbmRSZWJhc2VTZWdJbmZvKGNvbnN0IE1hY2hPT2JqZWN0RmlsZSAqT2JqKTsKKworICAvLyBVc2VkIHRvIGNoZWNrIGEgTWFjaC1PIEJpbmQgb3IgUmViYXNlIGVudHJ5IGZvciBlcnJvcnMgd2hlbiBpdGVyYXRpbmcuCisgIGNvbnN0IGNoYXIgKmNoZWNrU2VnQW5kT2Zmc2V0KGludDMyX3QgU2VnSW5kZXgsIHVpbnQ2NF90IFNlZ09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmRJbnZhbGlkKTsKKyAgY29uc3QgY2hhciAqY2hlY2tDb3VudEFuZFNraXAodWludDMyX3QgQ291bnQsIHVpbnQzMl90IFNraXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgUG9pbnRlclNpemUsIGludDMyX3QgU2VnSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNlZ09mZnNldCk7CisgIC8vIFVzZWQgd2l0aCB2YWxpZCBTZWdJbmRleC9TZWdPZmZzZXQgdmFsdWVzIGZyb20gY2hlY2tlZCBlbnRyaWVzLgorICBTdHJpbmdSZWYgc2VnbWVudE5hbWUoaW50MzJfdCBTZWdJbmRleCk7CisgIFN0cmluZ1JlZiBzZWN0aW9uTmFtZShpbnQzMl90IFNlZ0luZGV4LCB1aW50NjRfdCBTZWdPZmZzZXQpOworICB1aW50NjRfdCBhZGRyZXNzKHVpbnQzMl90IFNlZ0luZGV4LCB1aW50NjRfdCBTZWdPZmZzZXQpOworCitwcml2YXRlOgorICBzdHJ1Y3QgU2VjdGlvbkluZm8geworICAgIHVpbnQ2NF90IEFkZHJlc3M7CisgICAgdWludDY0X3QgU2l6ZTsKKyAgICBTdHJpbmdSZWYgU2VjdGlvbk5hbWU7CisgICAgU3RyaW5nUmVmIFNlZ21lbnROYW1lOworICAgIHVpbnQ2NF90IE9mZnNldEluU2VnbWVudDsKKyAgICB1aW50NjRfdCBTZWdtZW50U3RhcnRBZGRyZXNzOworICAgIGludDMyX3QgU2VnbWVudEluZGV4OworICB9OworICBjb25zdCBTZWN0aW9uSW5mbyAmZmluZFNlY3Rpb24oaW50MzJfdCBTZWdJbmRleCwgdWludDY0X3QgU2VnT2Zmc2V0KTsKKworICBTbWFsbFZlY3RvcjxTZWN0aW9uSW5mbywgMzI+IFNlY3Rpb25zOworICBpbnQzMl90IE1heFNlZ0luZGV4OworfTsKKworLy8vIE1hY2hPUmViYXNlRW50cnkgZW5jYXBzdWxhdGVzIHRoZSBjdXJyZW50IHN0YXRlIGluIHRoZSBkZWNvbXByZXNzaW9uIG9mCisvLy8gcmViYXNpbmcgb3Bjb2Rlcy4gVGhpcyBhbGxvd3MgeW91IHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgY29tcHJlc3NlZCB0YWJsZSBvZgorLy8vIHJlYmFzaW5nIHVzaW5nOgorLy8vICAgIEVycm9yIEVycjsKKy8vLyAgICBmb3IgKGNvbnN0IGxsdm06Om9iamVjdDo6TWFjaE9SZWJhc2VFbnRyeSAmRW50cnkgOiBPYmotPnJlYmFzZVRhYmxlKCZFcnIpKSB7CisvLy8gICAgfQorLy8vICAgIGlmIChFcnIpIHsgcmVwb3J0IGVycm9yIC4uLgorY2xhc3MgTWFjaE9SZWJhc2VFbnRyeSB7CitwdWJsaWM6CisgIE1hY2hPUmViYXNlRW50cnkoRXJyb3IgKkVyciwgY29uc3QgTWFjaE9PYmplY3RGaWxlICpPLAorICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+IG9wY29kZXMsIGJvb2wgaXM2NEJpdCk7CisKKyAgaW50MzJfdCBzZWdtZW50SW5kZXgoKSBjb25zdDsKKyAgdWludDY0X3Qgc2VnbWVudE9mZnNldCgpIGNvbnN0OworICBTdHJpbmdSZWYgdHlwZU5hbWUoKSBjb25zdDsKKyAgU3RyaW5nUmVmIHNlZ21lbnROYW1lKCkgY29uc3Q7CisgIFN0cmluZ1JlZiBzZWN0aW9uTmFtZSgpIGNvbnN0OworICB1aW50NjRfdCBhZGRyZXNzKCkgY29uc3Q7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hY2hPUmViYXNlRW50cnkgJikgY29uc3Q7CisKKyAgdm9pZCBtb3ZlTmV4dCgpOworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgTWFjaE9PYmplY3RGaWxlOworCisgIHZvaWQgbW92ZVRvRmlyc3QoKTsKKyAgdm9pZCBtb3ZlVG9FbmQoKTsKKyAgdWludDY0X3QgcmVhZFVMRUIxMjgoY29uc3QgY2hhciAqKmVycm9yKTsKKworICBFcnJvciAqRTsKKyAgY29uc3QgTWFjaE9PYmplY3RGaWxlICpPOworICBBcnJheVJlZjx1aW50OF90PiBPcGNvZGVzOworICBjb25zdCB1aW50OF90ICpQdHI7CisgIHVpbnQ2NF90IFNlZ21lbnRPZmZzZXQgPSAwOworICBpbnQzMl90IFNlZ21lbnRJbmRleCA9IC0xOworICB1aW50NjRfdCBSZW1haW5pbmdMb29wQ291bnQgPSAwOworICB1aW50NjRfdCBBZHZhbmNlQW1vdW50ID0gMDsKKyAgdWludDhfdCAgUmViYXNlVHlwZSA9IDA7CisgIHVpbnQ4X3QgIFBvaW50ZXJTaXplOworICBib29sICAgICBEb25lID0gZmFsc2U7Cit9OwordXNpbmcgcmViYXNlX2l0ZXJhdG9yID0gY29udGVudF9pdGVyYXRvcjxNYWNoT1JlYmFzZUVudHJ5PjsKKworLy8vIE1hY2hPQmluZEVudHJ5IGVuY2Fwc3VsYXRlcyB0aGUgY3VycmVudCBzdGF0ZSBpbiB0aGUgZGVjb21wcmVzc2lvbiBvZgorLy8vIGJpbmRpbmcgb3Bjb2Rlcy4gVGhpcyBhbGxvd3MgeW91IHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgY29tcHJlc3NlZCB0YWJsZSBvZgorLy8vIGJpbmRpbmdzIHVzaW5nOgorLy8vICAgIEVycm9yIEVycjsKKy8vLyAgICBmb3IgKGNvbnN0IGxsdm06Om9iamVjdDo6TWFjaE9CaW5kRW50cnkgJkVudHJ5IDogT2JqLT5iaW5kVGFibGUoJkVycikpIHsKKy8vLyAgICB9CisvLy8gICAgaWYgKEVycikgeyByZXBvcnQgZXJyb3IgLi4uCitjbGFzcyBNYWNoT0JpbmRFbnRyeSB7CitwdWJsaWM6CisgIGVudW0gY2xhc3MgS2luZCB7IFJlZ3VsYXIsIExhenksIFdlYWsgfTsKKworICBNYWNoT0JpbmRFbnRyeShFcnJvciAqRXJyLCBjb25zdCBNYWNoT09iamVjdEZpbGUgKk8sCisgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+IE9wY29kZXMsIGJvb2wgaXM2NEJpdCwgTWFjaE9CaW5kRW50cnk6OktpbmQpOworCisgIGludDMyX3Qgc2VnbWVudEluZGV4KCkgY29uc3Q7CisgIHVpbnQ2NF90IHNlZ21lbnRPZmZzZXQoKSBjb25zdDsKKyAgU3RyaW5nUmVmIHR5cGVOYW1lKCkgY29uc3Q7CisgIFN0cmluZ1JlZiBzeW1ib2xOYW1lKCkgY29uc3Q7CisgIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CisgIGludDY0X3QgYWRkZW5kKCkgY29uc3Q7CisgIGludCBvcmRpbmFsKCkgY29uc3Q7CisKKyAgU3RyaW5nUmVmIHNlZ21lbnROYW1lKCkgY29uc3Q7CisgIFN0cmluZ1JlZiBzZWN0aW9uTmFtZSgpIGNvbnN0OworICB1aW50NjRfdCBhZGRyZXNzKCkgY29uc3Q7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hY2hPQmluZEVudHJ5ICYpIGNvbnN0OworCisgIHZvaWQgbW92ZU5leHQoKTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIE1hY2hPT2JqZWN0RmlsZTsKKworICB2b2lkIG1vdmVUb0ZpcnN0KCk7CisgIHZvaWQgbW92ZVRvRW5kKCk7CisgIHVpbnQ2NF90IHJlYWRVTEVCMTI4KGNvbnN0IGNoYXIgKiplcnJvcik7CisgIGludDY0X3QgcmVhZFNMRUIxMjgoY29uc3QgY2hhciAqKmVycm9yKTsKKworICBFcnJvciAqRTsKKyAgY29uc3QgTWFjaE9PYmplY3RGaWxlICpPOworICBBcnJheVJlZjx1aW50OF90PiBPcGNvZGVzOworICBjb25zdCB1aW50OF90ICpQdHI7CisgIHVpbnQ2NF90IFNlZ21lbnRPZmZzZXQgPSAwOworICBpbnQzMl90ICBTZWdtZW50SW5kZXggPSAtMTsKKyAgU3RyaW5nUmVmIFN5bWJvbE5hbWU7CisgIGJvb2wgICAgIExpYnJhcnlPcmRpbmFsU2V0ID0gZmFsc2U7CisgIGludCAgICAgIE9yZGluYWwgPSAwOworICB1aW50MzJfdCBGbGFncyA9IDA7CisgIGludDY0X3QgIEFkZGVuZCA9IDA7CisgIHVpbnQ2NF90IFJlbWFpbmluZ0xvb3BDb3VudCA9IDA7CisgIHVpbnQ2NF90IEFkdmFuY2VBbW91bnQgPSAwOworICB1aW50OF90ICBCaW5kVHlwZSA9IDA7CisgIHVpbnQ4X3QgIFBvaW50ZXJTaXplOworICBLaW5kICAgICBUYWJsZUtpbmQ7CisgIGJvb2wgICAgIERvbmUgPSBmYWxzZTsKK307Cit1c2luZyBiaW5kX2l0ZXJhdG9yID0gY29udGVudF9pdGVyYXRvcjxNYWNoT0JpbmRFbnRyeT47CisKK2NsYXNzIE1hY2hPT2JqZWN0RmlsZSA6IHB1YmxpYyBPYmplY3RGaWxlIHsKK3B1YmxpYzoKKyAgc3RydWN0IExvYWRDb21tYW5kSW5mbyB7CisgICAgY29uc3QgY2hhciAqUHRyOyAgICAgIC8vIFdoZXJlIGluIG1lbW9yeSB0aGUgbG9hZCBjb21tYW5kIGlzLgorICAgIE1hY2hPOjpsb2FkX2NvbW1hbmQgQzsgLy8gVGhlIGNvbW1hbmQgaXRzZWxmLgorICB9OworICB1c2luZyBMb2FkQ29tbWFuZExpc3QgPSBTbWFsbFZlY3RvcjxMb2FkQ29tbWFuZEluZm8sIDQ+OworICB1c2luZyBsb2FkX2NvbW1hbmRfaXRlcmF0b3IgPSBMb2FkQ29tbWFuZExpc3Q6OmNvbnN0X2l0ZXJhdG9yOworCisgIHN0YXRpYyBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8TWFjaE9PYmplY3RGaWxlPj4KKyAgY3JlYXRlKE1lbW9yeUJ1ZmZlclJlZiBPYmplY3QsIGJvb2wgSXNMaXR0bGVFbmRpYW4sIGJvb2wgSXM2NEJpdHMsCisgICAgICAgICB1aW50MzJfdCBVbml2ZXJzYWxDcHV0eXBlID0gMCwgdWludDMyX3QgVW5pdmVyc2FsSW5kZXggPSAwKTsKKworICB2b2lkIG1vdmVTeW1ib2xOZXh0KERhdGFSZWZJbXBsICZTeW1iKSBjb25zdCBvdmVycmlkZTsKKworICB1aW50NjRfdCBnZXROVmFsdWUoRGF0YVJlZkltcGwgU3ltKSBjb25zdDsKKyAgRXhwZWN0ZWQ8U3RyaW5nUmVmPiBnZXRTeW1ib2xOYW1lKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vIE1hY2hPIHNwZWNpZmljLgorICBFcnJvciBjaGVja1N5bWJvbFRhYmxlKCkgY29uc3Q7CisKKyAgc3RkOjplcnJvcl9jb2RlIGdldEluZGlyZWN0TmFtZShEYXRhUmVmSW1wbCBTeW1iLCBTdHJpbmdSZWYgJlJlcykgY29uc3Q7CisgIHVuc2lnbmVkIGdldFNlY3Rpb25UeXBlKFNlY3Rpb25SZWYgU2VjKSBjb25zdDsKKworICBFeHBlY3RlZDx1aW50NjRfdD4gZ2V0U3ltYm9sQWRkcmVzcyhEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0U3ltYm9sQWxpZ25tZW50KERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRDb21tb25TeW1ib2xTaXplSW1wbChEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgRXhwZWN0ZWQ8U3ltYm9sUmVmOjpUeXBlPiBnZXRTeW1ib2xUeXBlKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTeW1ib2xGbGFncyhEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgRXhwZWN0ZWQ8c2VjdGlvbl9pdGVyYXRvcj4gZ2V0U3ltYm9sU2VjdGlvbihEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgdW5zaWduZWQgZ2V0U3ltYm9sU2VjdGlvbklEKFN5bWJvbFJlZiBTeW1iKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0U2VjdGlvbklEKFNlY3Rpb25SZWYgU2VjKSBjb25zdDsKKworICB2b2lkIG1vdmVTZWN0aW9uTmV4dChEYXRhUmVmSW1wbCAmU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjplcnJvcl9jb2RlIGdldFNlY3Rpb25OYW1lKERhdGFSZWZJbXBsIFNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAmUmVzKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0U2VjdGlvbkFkZHJlc3MoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0U2VjdGlvbkluZGV4KERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFNlY3Rpb25TaXplKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRTZWN0aW9uQ29udGVudHMoRGF0YVJlZkltcGwgU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAmUmVzKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0U2VjdGlvbkFsaWdubWVudChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2VjdGlvbkNvbXByZXNzZWQoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1NlY3Rpb25UZXh0KERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZWN0aW9uRGF0YShEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2VjdGlvbkJTUyhEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2VjdGlvblZpcnR1YWwoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1NlY3Rpb25CaXRjb2RlKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIFdoZW4gZHN5bXV0aWwgZ2VuZXJhdGVzIHRoZSBjb21wYW5pb24gZmlsZSwgaXQgc3RyaXBzIGFsbCB1bm5lY2Vzc2FyeQorICAvLy8gc2VjdGlvbnMgKGUuZy4gZXZlcnl0aGluZyBpbiB0aGUgX1RFWFQgc2VnbWVudCkgYnkgb21pdHRpbmcgdGhlaXIgYm9keQorICAvLy8gYW5kIHNldHRpbmcgdGhlIG9mZnNldCBpbiB0aGVpciBjb3JyZXNwb25kaW5nIGxvYWQgY29tbWFuZCB0byB6ZXJvLgorICAvLy8KKyAgLy8vIFdoaWxlIHRoZSBsb2FkIGNvbW1hbmQgaXRzZWxmIGlzIHZhbGlkLCByZWFkaW5nIHRoZSBzZWN0aW9uIGNvcnJlc3BvbmRzCisgIC8vLyB0byByZWFkaW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgc3BlY2lmaWVkIGluIHRoZSBsb2FkIGNvbW1hbmQsIHN0YXJ0aW5nCisgIC8vLyBmcm9tIG9mZnNldCAwIChpLmUuIHRoZSBNYWNoLU8gaGVhZGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUpLgorICBib29sIGlzU2VjdGlvblN0cmlwcGVkKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgcmVsb2NhdGlvbl9pdGVyYXRvciBzZWN0aW9uX3JlbF9iZWdpbihEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICByZWxvY2F0aW9uX2l0ZXJhdG9yIHNlY3Rpb25fcmVsX2VuZChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworCisgIHJlbG9jYXRpb25faXRlcmF0b3IgZXh0cmVsX2JlZ2luKCkgY29uc3Q7CisgIHJlbG9jYXRpb25faXRlcmF0b3IgZXh0cmVsX2VuZCgpIGNvbnN0OworICBpdGVyYXRvcl9yYW5nZTxyZWxvY2F0aW9uX2l0ZXJhdG9yPiBleHRlcm5hbF9yZWxvY2F0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShleHRyZWxfYmVnaW4oKSwgZXh0cmVsX2VuZCgpKTsKKyAgfQorCisgIHJlbG9jYXRpb25faXRlcmF0b3IgbG9jcmVsX2JlZ2luKCkgY29uc3Q7CisgIHJlbG9jYXRpb25faXRlcmF0b3IgbG9jcmVsX2VuZCgpIGNvbnN0OworICAKKyAgdm9pZCBtb3ZlUmVsb2NhdGlvbk5leHQoRGF0YVJlZkltcGwgJlJlbCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFJlbG9jYXRpb25PZmZzZXQoRGF0YVJlZkltcGwgUmVsKSBjb25zdCBvdmVycmlkZTsKKyAgc3ltYm9sX2l0ZXJhdG9yIGdldFJlbG9jYXRpb25TeW1ib2woRGF0YVJlZkltcGwgUmVsKSBjb25zdCBvdmVycmlkZTsKKyAgc2VjdGlvbl9pdGVyYXRvciBnZXRSZWxvY2F0aW9uU2VjdGlvbihEYXRhUmVmSW1wbCBSZWwpIGNvbnN0OworICB1aW50NjRfdCBnZXRSZWxvY2F0aW9uVHlwZShEYXRhUmVmSW1wbCBSZWwpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIGdldFJlbG9jYXRpb25UeXBlTmFtZShEYXRhUmVmSW1wbCBSZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0KSBjb25zdCBvdmVycmlkZTsKKyAgdWludDhfdCBnZXRSZWxvY2F0aW9uTGVuZ3RoKERhdGFSZWZJbXBsIFJlbCkgY29uc3Q7CisKKyAgLy8gTWFjaE8gc3BlY2lmaWMuCisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRMaWJyYXJ5U2hvcnROYW1lQnlJbmRleCh1bnNpZ25lZCBJbmRleCwgU3RyaW5nUmVmICYpIGNvbnN0OworICB1aW50MzJfdCBnZXRMaWJyYXJ5Q291bnQoKSBjb25zdDsKKworICBzZWN0aW9uX2l0ZXJhdG9yIGdldFJlbG9jYXRpb25SZWxvY2F0ZWRTZWN0aW9uKHJlbG9jYXRpb25faXRlcmF0b3IgUmVsKSBjb25zdDsKKworICAvLyBUT0RPOiBXb3VsZCBiZSB1c2VmdWwgdG8gaGF2ZSBhbiBpdGVyYXRvciBiYXNlZCB2ZXJzaW9uCisgIC8vIG9mIHRoZSBsb2FkIGNvbW1hbmQgaW50ZXJmYWNlIHRvby4KKworICBiYXNpY19zeW1ib2xfaXRlcmF0b3Igc3ltYm9sX2JlZ2luKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJhc2ljX3N5bWJvbF9pdGVyYXRvciBzeW1ib2xfZW5kKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8gTWFjaE8gc3BlY2lmaWMuCisgIGJhc2ljX3N5bWJvbF9pdGVyYXRvciBnZXRTeW1ib2xCeUluZGV4KHVuc2lnbmVkIEluZGV4KSBjb25zdDsKKyAgdWludDY0X3QgZ2V0U3ltYm9sSW5kZXgoRGF0YVJlZkltcGwgU3ltYikgY29uc3Q7CisKKyAgc2VjdGlvbl9pdGVyYXRvciBzZWN0aW9uX2JlZ2luKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHNlY3Rpb25faXRlcmF0b3Igc2VjdGlvbl9lbmQoKSBjb25zdCBvdmVycmlkZTsKKworICB1aW50OF90IGdldEJ5dGVzSW5BZGRyZXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgU3RyaW5nUmVmIGdldEZpbGVGb3JtYXROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFRyaXBsZTo6QXJjaFR5cGUgZ2V0QXJjaCgpIGNvbnN0IG92ZXJyaWRlOworICBTdWJ0YXJnZXRGZWF0dXJlcyBnZXRGZWF0dXJlcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIFN1YnRhcmdldEZlYXR1cmVzKCk7IH0KKyAgVHJpcGxlIGdldEFyY2hUcmlwbGUoY29uc3QgY2hhciAqKk1jcHVEZWZhdWx0ID0gbnVsbHB0cikgY29uc3Q7CisKKyAgcmVsb2NhdGlvbl9pdGVyYXRvciBzZWN0aW9uX3JlbF9iZWdpbih1bnNpZ25lZCBJbmRleCkgY29uc3Q7CisgIHJlbG9jYXRpb25faXRlcmF0b3Igc2VjdGlvbl9yZWxfZW5kKHVuc2lnbmVkIEluZGV4KSBjb25zdDsKKworICBkaWNlX2l0ZXJhdG9yIGJlZ2luX2RpY2VzKCkgY29uc3Q7CisgIGRpY2VfaXRlcmF0b3IgZW5kX2RpY2VzKCkgY29uc3Q7CisKKyAgbG9hZF9jb21tYW5kX2l0ZXJhdG9yIGJlZ2luX2xvYWRfY29tbWFuZHMoKSBjb25zdDsKKyAgbG9hZF9jb21tYW5kX2l0ZXJhdG9yIGVuZF9sb2FkX2NvbW1hbmRzKCkgY29uc3Q7CisgIGl0ZXJhdG9yX3JhbmdlPGxvYWRfY29tbWFuZF9pdGVyYXRvcj4gbG9hZF9jb21tYW5kcygpIGNvbnN0OworCisgIC8vLyBGb3IgdXNlIGl0ZXJhdGluZyBvdmVyIGFsbCBleHBvcnRlZCBzeW1ib2xzLgorICBpdGVyYXRvcl9yYW5nZTxleHBvcnRfaXRlcmF0b3I+IGV4cG9ydHMoRXJyb3IgJkVycikgY29uc3Q7CisKKyAgLy8vIEZvciB1c2UgZXhhbWluaW5nIGEgdHJpZSBub3QgaW4gYSBNYWNoT09iamVjdEZpbGUuCisgIHN0YXRpYyBpdGVyYXRvcl9yYW5nZTxleHBvcnRfaXRlcmF0b3I+IGV4cG9ydHMoRXJyb3IgJkVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiBUcmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hPT2JqZWN0RmlsZSAqTyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisKKyAgLy8vIEZvciB1c2UgaXRlcmF0aW5nIG92ZXIgYWxsIHJlYmFzZSB0YWJsZSBlbnRyaWVzLgorICBpdGVyYXRvcl9yYW5nZTxyZWJhc2VfaXRlcmF0b3I+IHJlYmFzZVRhYmxlKEVycm9yICZFcnIpOworCisgIC8vLyBGb3IgdXNlIGV4YW1pbmluZyByZWJhc2Ugb3Bjb2RlcyBpbiBhIE1hY2hPT2JqZWN0RmlsZS4KKyAgc3RhdGljIGl0ZXJhdG9yX3JhbmdlPHJlYmFzZV9pdGVyYXRvcj4gcmViYXNlVGFibGUoRXJyb3IgJkVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaE9PYmplY3RGaWxlICpPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiBPcGNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzNjQpOworCisgIC8vLyBGb3IgdXNlIGl0ZXJhdGluZyBvdmVyIGFsbCBiaW5kIHRhYmxlIGVudHJpZXMuCisgIGl0ZXJhdG9yX3JhbmdlPGJpbmRfaXRlcmF0b3I+IGJpbmRUYWJsZShFcnJvciAmRXJyKTsKKworICAvLy8gRm9yIHVzZSBpdGVyYXRpbmcgb3ZlciBhbGwgbGF6eSBiaW5kIHRhYmxlIGVudHJpZXMuCisgIGl0ZXJhdG9yX3JhbmdlPGJpbmRfaXRlcmF0b3I+IGxhenlCaW5kVGFibGUoRXJyb3IgJkVycik7CisKKyAgLy8vIEZvciB1c2UgaXRlcmF0aW5nIG92ZXIgYWxsIHdlYWsgYmluZCB0YWJsZSBlbnRyaWVzLgorICBpdGVyYXRvcl9yYW5nZTxiaW5kX2l0ZXJhdG9yPiB3ZWFrQmluZFRhYmxlKEVycm9yICZFcnIpOworCisgIC8vLyBGb3IgdXNlIGV4YW1pbmluZyBiaW5kIG9wY29kZXMgaW4gYSBNYWNoT09iamVjdEZpbGUuCisgIHN0YXRpYyBpdGVyYXRvcl9yYW5nZTxiaW5kX2l0ZXJhdG9yPiBiaW5kVGFibGUoRXJyb3IgJkVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoT09iamVjdEZpbGUgKk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gT3Bjb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaE9CaW5kRW50cnk6OktpbmQpOworCisgIC8vLyBGb3IgdXNlIHdpdGggYSBTZWdJbmRleCxTZWdPZmZzZXQgcGFpciBpbiBNYWNoT0JpbmRFbnRyeTo6bW92ZU5leHQoKSB0bworICAvLy8gdmFsaWRhdGUgYSBNYWNoT0JpbmRFbnRyeS4KKyAgY29uc3QgY2hhciAqQmluZEVudHJ5Q2hlY2tTZWdBbmRPZmZzZXQoaW50MzJfdCBTZWdJbmRleCwgdWludDY0X3QgU2VnT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuZEludmFsaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluZFJlYmFzZVNlY3Rpb25UYWJsZS0+Y2hlY2tTZWdBbmRPZmZzZXQoU2VnSW5kZXgsIFNlZ09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kSW52YWxpZCk7CisgIH0KKyAgLy8vIEZvciB1c2UgaW4gTWFjaE9CaW5kRW50cnk6Om1vdmVOZXh0KCkgdG8gdmFsaWRhdGUgYSBNYWNoT0JpbmRFbnRyeSBmb3IKKyAgLy8vIHRoZSBCSU5EX09QQ09ERV9ET19CSU5EX1VMRUJfVElNRVNfU0tJUFBJTkdfVUxFQiBvcGNvZGUuCisgIGNvbnN0IGNoYXIgKkJpbmRFbnRyeUNoZWNrQ291bnRBbmRTa2lwKHVpbnQzMl90IENvdW50LCB1aW50MzJfdCBTa2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IFBvaW50ZXJTaXplLCBpbnQzMl90IFNlZ0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTZWdPZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluZFJlYmFzZVNlY3Rpb25UYWJsZS0+Y2hlY2tDb3VudEFuZFNraXAoQ291bnQsIFNraXAsIFBvaW50ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWdJbmRleCwgU2VnT2Zmc2V0KTsKKyAgfQorCisgIC8vLyBGb3IgdXNlIHdpdGggYSBTZWdJbmRleCxTZWdPZmZzZXQgcGFpciBpbiBNYWNoT1JlYmFzZUVudHJ5Ojptb3ZlTmV4dCgpIHRvCisgIC8vLyB2YWxpZGF0ZSBhIE1hY2hPUmViYXNlRW50cnkuCisgIGNvbnN0IGNoYXIgKlJlYmFzZUVudHJ5Q2hlY2tTZWdBbmRPZmZzZXQoaW50MzJfdCBTZWdJbmRleCwgdWludDY0X3QgU2VnT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5kSW52YWxpZCkgY29uc3QgeworICAgIHJldHVybiBCaW5kUmViYXNlU2VjdGlvblRhYmxlLT5jaGVja1NlZ0FuZE9mZnNldChTZWdJbmRleCwgU2VnT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRJbnZhbGlkKTsKKyAgfQorICAvLy8gRm9yIHVzZSBpbiBNYWNoT1JlYmFzZUVudHJ5Ojptb3ZlTmV4dCgpIHRvIHZhbGlkYXRlIGEgTWFjaE9SZWJhc2VFbnRyeSBmb3IKKyAgLy8vIHRoZSBSRUJBU0VfT1BDT0RFX0RPXypfVElNRVMqIG9wY29kZXMuCisgIGNvbnN0IGNoYXIgKlJlYmFzZUVudHJ5Q2hlY2tDb3VudEFuZFNraXAodWludDMyX3QgQ291bnQsIHVpbnQzMl90IFNraXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgUG9pbnRlclNpemUsIGludDMyX3QgU2VnSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNlZ09mZnNldCkgY29uc3QgeworICAgIHJldHVybiBCaW5kUmViYXNlU2VjdGlvblRhYmxlLT5jaGVja0NvdW50QW5kU2tpcChDb3VudCwgU2tpcCwgUG9pbnRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZ0luZGV4LCBTZWdPZmZzZXQpOworICB9CisKKyAgLy8vIEZvciB1c2Ugd2l0aCB0aGUgU2VnSW5kZXggb2YgYSBjaGVja2VkIE1hY2gtTyBCaW5kIG9yIFJlYmFzZSBlbnRyeSB0bworICAvLy8gZ2V0IHRoZSBzZWdtZW50IG5hbWUuCisgIFN0cmluZ1JlZiBCaW5kUmViYXNlU2VnbWVudE5hbWUoaW50MzJfdCBTZWdJbmRleCkgY29uc3QgeworICAgIHJldHVybiBCaW5kUmViYXNlU2VjdGlvblRhYmxlLT5zZWdtZW50TmFtZShTZWdJbmRleCk7CisgIH0KKworICAvLy8gRm9yIHVzZSB3aXRoIGEgU2VnSW5kZXgsU2VnT2Zmc2V0IHBhaXIgZnJvbSBhIGNoZWNrZWQgTWFjaC1PIEJpbmQgb3IKKyAgLy8vIFJlYmFzZSBlbnRyeSB0byBnZXQgdGhlIHNlY3Rpb24gbmFtZS4KKyAgU3RyaW5nUmVmIEJpbmRSZWJhc2VTZWN0aW9uTmFtZSh1aW50MzJfdCBTZWdJbmRleCwgdWludDY0X3QgU2VnT2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmRSZWJhc2VTZWN0aW9uVGFibGUtPnNlY3Rpb25OYW1lKFNlZ0luZGV4LCBTZWdPZmZzZXQpOworICB9CisKKyAgLy8vIEZvciB1c2Ugd2l0aCBhIFNlZ0luZGV4LFNlZ09mZnNldCBwYWlyIGZyb20gYSBjaGVja2VkIE1hY2gtTyBCaW5kIG9yCisgIC8vLyBSZWJhc2UgZW50cnkgdG8gZ2V0IHRoZSBhZGRyZXNzLgorICB1aW50NjRfdCBCaW5kUmViYXNlQWRkcmVzcyh1aW50MzJfdCBTZWdJbmRleCwgdWludDY0X3QgU2VnT2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmRSZWJhc2VTZWN0aW9uVGFibGUtPmFkZHJlc3MoU2VnSW5kZXgsIFNlZ09mZnNldCk7CisgIH0KKworICAvLyBJbiBhIE1hY2hPIGZpbGUsIHNlY3Rpb25zIGhhdmUgYSBzZWdtZW50IG5hbWUuIFRoaXMgaXMgdXNlZCBpbiB0aGUgLm8KKyAgLy8gZmlsZXMuIFRoZXkgaGF2ZSBhIHNpbmdsZSBzZWdtZW50LCBidXQgdGhpcyBmaWVsZCBzcGVjaWZpZXMgd2hpY2ggc2VnbWVudAorICAvLyBhIHNlY3Rpb24gc2hvdWxkIGJlIHB1dCBpbiB0aGUgZmluYWwgb2JqZWN0LgorICBTdHJpbmdSZWYgZ2V0U2VjdGlvbkZpbmFsU2VnbWVudE5hbWUoRGF0YVJlZkltcGwgU2VjKSBjb25zdDsKKworICAvLyBOYW1lcyBhcmUgc3RvcmVkIGFzIDE2IGJ5dGVzLiBUaGVzZSByZXR1cm5zIHRoZSByYXcgMTYgYnl0ZXMgd2l0aG91dAorICAvLyBpbnRlcnByZXRpbmcgdGhlbSBhcyBhIEMgc3RyaW5nLgorICBBcnJheVJlZjxjaGFyPiBnZXRTZWN0aW9uUmF3TmFtZShEYXRhUmVmSW1wbCBTZWMpIGNvbnN0OworICBBcnJheVJlZjxjaGFyPiBnZXRTZWN0aW9uUmF3RmluYWxTZWdtZW50TmFtZShEYXRhUmVmSW1wbCBTZWMpIGNvbnN0OworCisgIC8vIE1hY2hPIHNwZWNpZmljIEluZm8gYWJvdXQgcmVsb2NhdGlvbnMuCisgIGJvb2wgaXNSZWxvY2F0aW9uU2NhdHRlcmVkKGNvbnN0IE1hY2hPOjphbnlfcmVsb2NhdGlvbl9pbmZvICZSRSkgY29uc3Q7CisgIHVuc2lnbmVkIGdldFBsYWluUmVsb2NhdGlvblN5bWJvbE51bSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hPOjphbnlfcmVsb2NhdGlvbl9pbmZvICZSRSkgY29uc3Q7CisgIGJvb2wgZ2V0UGxhaW5SZWxvY2F0aW9uRXh0ZXJuYWwoY29uc3QgTWFjaE86OmFueV9yZWxvY2F0aW9uX2luZm8gJlJFKSBjb25zdDsKKyAgYm9vbCBnZXRTY2F0dGVyZWRSZWxvY2F0aW9uU2NhdHRlcmVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaE86OmFueV9yZWxvY2F0aW9uX2luZm8gJlJFKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0U2NhdHRlcmVkUmVsb2NhdGlvblZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaE86OmFueV9yZWxvY2F0aW9uX2luZm8gJlJFKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0U2NhdHRlcmVkUmVsb2NhdGlvblR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoTzo6YW55X3JlbG9jYXRpb25faW5mbyAmUkUpIGNvbnN0OworICB1bnNpZ25lZCBnZXRBbnlSZWxvY2F0aW9uQWRkcmVzcyhjb25zdCBNYWNoTzo6YW55X3JlbG9jYXRpb25faW5mbyAmUkUpIGNvbnN0OworICB1bnNpZ25lZCBnZXRBbnlSZWxvY2F0aW9uUENSZWwoY29uc3QgTWFjaE86OmFueV9yZWxvY2F0aW9uX2luZm8gJlJFKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0QW55UmVsb2NhdGlvbkxlbmd0aChjb25zdCBNYWNoTzo6YW55X3JlbG9jYXRpb25faW5mbyAmUkUpIGNvbnN0OworICB1bnNpZ25lZCBnZXRBbnlSZWxvY2F0aW9uVHlwZShjb25zdCBNYWNoTzo6YW55X3JlbG9jYXRpb25faW5mbyAmUkUpIGNvbnN0OworICBTZWN0aW9uUmVmIGdldEFueVJlbG9jYXRpb25TZWN0aW9uKGNvbnN0IE1hY2hPOjphbnlfcmVsb2NhdGlvbl9pbmZvICZSRSkgY29uc3Q7CisKKyAgLy8gTWFjaE8gc3BlY2lmaWMgc3RydWN0dXJlcy4KKyAgTWFjaE86OnNlY3Rpb24gZ2V0U2VjdGlvbihEYXRhUmVmSW1wbCBEUkkpIGNvbnN0OworICBNYWNoTzo6c2VjdGlvbl82NCBnZXRTZWN0aW9uNjQoRGF0YVJlZkltcGwgRFJJKSBjb25zdDsKKyAgTWFjaE86OnNlY3Rpb24gZ2V0U2VjdGlvbihjb25zdCBMb2FkQ29tbWFuZEluZm8gJkwsIHVuc2lnbmVkIEluZGV4KSBjb25zdDsKKyAgTWFjaE86OnNlY3Rpb25fNjQgZ2V0U2VjdGlvbjY0KGNvbnN0IExvYWRDb21tYW5kSW5mbyAmTCx1bnNpZ25lZCBJbmRleCkgY29uc3Q7CisgIE1hY2hPOjpubGlzdCBnZXRTeW1ib2xUYWJsZUVudHJ5KERhdGFSZWZJbXBsIERSSSkgY29uc3Q7CisgIE1hY2hPOjpubGlzdF82NCBnZXRTeW1ib2w2NFRhYmxlRW50cnkoRGF0YVJlZkltcGwgRFJJKSBjb25zdDsKKworICBNYWNoTzo6bGlua2VkaXRfZGF0YV9jb21tYW5kCisgIGdldExpbmtlZGl0RGF0YUxvYWRDb21tYW5kKGNvbnN0IExvYWRDb21tYW5kSW5mbyAmTCkgY29uc3Q7CisgIE1hY2hPOjpzZWdtZW50X2NvbW1hbmQKKyAgZ2V0U2VnbWVudExvYWRDb21tYW5kKGNvbnN0IExvYWRDb21tYW5kSW5mbyAmTCkgY29uc3Q7CisgIE1hY2hPOjpzZWdtZW50X2NvbW1hbmRfNjQKKyAgZ2V0U2VnbWVudDY0TG9hZENvbW1hbmQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86Omxpbmtlcl9vcHRpb25fY29tbWFuZAorICBnZXRMaW5rZXJPcHRpb25Mb2FkQ29tbWFuZChjb25zdCBMb2FkQ29tbWFuZEluZm8gJkwpIGNvbnN0OworICBNYWNoTzo6dmVyc2lvbl9taW5fY29tbWFuZAorICBnZXRWZXJzaW9uTWluTG9hZENvbW1hbmQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86Om5vdGVfY29tbWFuZAorICBnZXROb3RlTG9hZENvbW1hbmQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86OmJ1aWxkX3ZlcnNpb25fY29tbWFuZAorICBnZXRCdWlsZFZlcnNpb25Mb2FkQ29tbWFuZChjb25zdCBMb2FkQ29tbWFuZEluZm8gJkwpIGNvbnN0OworICBNYWNoTzo6YnVpbGRfdG9vbF92ZXJzaW9uCisgIGdldEJ1aWxkVG9vbFZlcnNpb24odW5zaWduZWQgaW5kZXgpIGNvbnN0OworICBNYWNoTzo6ZHlsaWJfY29tbWFuZAorICBnZXREeWxpYklETG9hZENvbW1hbmQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86OmR5bGRfaW5mb19jb21tYW5kCisgIGdldER5bGRJbmZvTG9hZENvbW1hbmQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86OmR5bGlua2VyX2NvbW1hbmQKKyAgZ2V0RHlsaW5rZXJDb21tYW5kKGNvbnN0IExvYWRDb21tYW5kSW5mbyAmTCkgY29uc3Q7CisgIE1hY2hPOjp1dWlkX2NvbW1hbmQKKyAgZ2V0VXVpZENvbW1hbmQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86OnJwYXRoX2NvbW1hbmQKKyAgZ2V0UnBhdGhDb21tYW5kKGNvbnN0IExvYWRDb21tYW5kSW5mbyAmTCkgY29uc3Q7CisgIE1hY2hPOjpzb3VyY2VfdmVyc2lvbl9jb21tYW5kCisgIGdldFNvdXJjZVZlcnNpb25Db21tYW5kKGNvbnN0IExvYWRDb21tYW5kSW5mbyAmTCkgY29uc3Q7CisgIE1hY2hPOjplbnRyeV9wb2ludF9jb21tYW5kCisgIGdldEVudHJ5UG9pbnRDb21tYW5kKGNvbnN0IExvYWRDb21tYW5kSW5mbyAmTCkgY29uc3Q7CisgIE1hY2hPOjplbmNyeXB0aW9uX2luZm9fY29tbWFuZAorICBnZXRFbmNyeXB0aW9uSW5mb0NvbW1hbmQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86OmVuY3J5cHRpb25faW5mb19jb21tYW5kXzY0CisgIGdldEVuY3J5cHRpb25JbmZvQ29tbWFuZDY0KGNvbnN0IExvYWRDb21tYW5kSW5mbyAmTCkgY29uc3Q7CisgIE1hY2hPOjpzdWJfZnJhbWV3b3JrX2NvbW1hbmQKKyAgZ2V0U3ViRnJhbWV3b3JrQ29tbWFuZChjb25zdCBMb2FkQ29tbWFuZEluZm8gJkwpIGNvbnN0OworICBNYWNoTzo6c3ViX3VtYnJlbGxhX2NvbW1hbmQKKyAgZ2V0U3ViVW1icmVsbGFDb21tYW5kKGNvbnN0IExvYWRDb21tYW5kSW5mbyAmTCkgY29uc3Q7CisgIE1hY2hPOjpzdWJfbGlicmFyeV9jb21tYW5kCisgIGdldFN1YkxpYnJhcnlDb21tYW5kKGNvbnN0IExvYWRDb21tYW5kSW5mbyAmTCkgY29uc3Q7CisgIE1hY2hPOjpzdWJfY2xpZW50X2NvbW1hbmQKKyAgZ2V0U3ViQ2xpZW50Q29tbWFuZChjb25zdCBMb2FkQ29tbWFuZEluZm8gJkwpIGNvbnN0OworICBNYWNoTzo6cm91dGluZXNfY29tbWFuZAorICBnZXRSb3V0aW5lc0NvbW1hbmQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86OnJvdXRpbmVzX2NvbW1hbmRfNjQKKyAgZ2V0Um91dGluZXNDb21tYW5kNjQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86OnRocmVhZF9jb21tYW5kCisgIGdldFRocmVhZENvbW1hbmQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKworICBNYWNoTzo6YW55X3JlbG9jYXRpb25faW5mbyBnZXRSZWxvY2F0aW9uKERhdGFSZWZJbXBsIFJlbCkgY29uc3Q7CisgIE1hY2hPOjpkYXRhX2luX2NvZGVfZW50cnkgZ2V0RGljZShEYXRhUmVmSW1wbCBSZWwpIGNvbnN0OworICBjb25zdCBNYWNoTzo6bWFjaF9oZWFkZXIgJmdldEhlYWRlcigpIGNvbnN0OworICBjb25zdCBNYWNoTzo6bWFjaF9oZWFkZXJfNjQgJmdldEhlYWRlcjY0KCkgY29uc3Q7CisgIHVpbnQzMl90CisgIGdldEluZGlyZWN0U3ltYm9sVGFibGVFbnRyeShjb25zdCBNYWNoTzo6ZHlzeW10YWJfY29tbWFuZCAmRExDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZXgpIGNvbnN0OworICBNYWNoTzo6ZGF0YV9pbl9jb2RlX2VudHJ5IGdldERhdGFJbkNvZGVUYWJsZUVudHJ5KHVpbnQzMl90IERhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZXgpIGNvbnN0OworICBNYWNoTzo6c3ltdGFiX2NvbW1hbmQgZ2V0U3ltdGFiTG9hZENvbW1hbmQoKSBjb25zdDsKKyAgTWFjaE86OmR5c3ltdGFiX2NvbW1hbmQgZ2V0RHlzeW10YWJMb2FkQ29tbWFuZCgpIGNvbnN0OworICBNYWNoTzo6bGlua2VkaXRfZGF0YV9jb21tYW5kIGdldERhdGFJbkNvZGVMb2FkQ29tbWFuZCgpIGNvbnN0OworICBNYWNoTzo6bGlua2VkaXRfZGF0YV9jb21tYW5kIGdldExpbmtPcHRIaW50c0xvYWRDb21tYW5kKCkgY29uc3Q7CisgIEFycmF5UmVmPHVpbnQ4X3Q+IGdldER5bGRJbmZvUmViYXNlT3Bjb2RlcygpIGNvbnN0OworICBBcnJheVJlZjx1aW50OF90PiBnZXREeWxkSW5mb0JpbmRPcGNvZGVzKCkgY29uc3Q7CisgIEFycmF5UmVmPHVpbnQ4X3Q+IGdldER5bGRJbmZvV2Vha0JpbmRPcGNvZGVzKCkgY29uc3Q7CisgIEFycmF5UmVmPHVpbnQ4X3Q+IGdldER5bGRJbmZvTGF6eUJpbmRPcGNvZGVzKCkgY29uc3Q7CisgIEFycmF5UmVmPHVpbnQ4X3Q+IGdldER5bGRJbmZvRXhwb3J0c1RyaWUoKSBjb25zdDsKKyAgQXJyYXlSZWY8dWludDhfdD4gZ2V0VXVpZCgpIGNvbnN0OworCisgIFN0cmluZ1JlZiBnZXRTdHJpbmdUYWJsZURhdGEoKSBjb25zdDsKKyAgYm9vbCBpczY0Qml0KCkgY29uc3Q7CisgIHZvaWQgUmVhZFVMRUIxMjhzKHVpbnQ2NF90IEluZGV4LCBTbWFsbFZlY3RvckltcGw8dWludDY0X3Q+ICZPdXQpIGNvbnN0OworCisgIHN0YXRpYyBTdHJpbmdSZWYgZ3Vlc3NMaWJyYXJ5U2hvcnROYW1lKFN0cmluZ1JlZiBOYW1lLCBib29sICZpc0ZyYW1ld29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICZTdWZmaXgpOworCisgIHN0YXRpYyBUcmlwbGU6OkFyY2hUeXBlIGdldEFyY2godWludDMyX3QgQ1BVVHlwZSk7CisgIHN0YXRpYyBUcmlwbGUgZ2V0QXJjaFRyaXBsZSh1aW50MzJfdCBDUFVUeXBlLCB1aW50MzJfdCBDUFVTdWJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKk1jcHVEZWZhdWx0ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipBcmNoRmxhZyA9IG51bGxwdHIpOworICBzdGF0aWMgYm9vbCBpc1ZhbGlkQXJjaChTdHJpbmdSZWYgQXJjaEZsYWcpOworICBzdGF0aWMgVHJpcGxlIGdldEhvc3RBcmNoKCk7CisKKyAgYm9vbCBpc1JlbG9jYXRhYmxlT2JqZWN0KCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgU3RyaW5nUmVmIG1hcERlYnVnU2VjdGlvbk5hbWUoU3RyaW5nUmVmIE5hbWUpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgaGFzUGFnZVplcm9TZWdtZW50KCkgY29uc3QgeyByZXR1cm4gSGFzUGFnZVplcm9TZWdtZW50OyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBCaW5hcnkgKnYpIHsKKyAgICByZXR1cm4gdi0+aXNNYWNoTygpOworICB9CisKKyAgc3RhdGljIHVpbnQzMl90CisgIGdldFZlcnNpb25NaW5NYWpvcihNYWNoTzo6dmVyc2lvbl9taW5fY29tbWFuZCAmQywgYm9vbCBTREspIHsKKyAgICB1aW50MzJfdCBWZXJzaW9uT3JTREsgPSAoU0RLKSA/IEMuc2RrIDogQy52ZXJzaW9uOworICAgIHJldHVybiAoVmVyc2lvbk9yU0RLID4+IDE2KSAmIDB4ZmZmZjsKKyAgfQorCisgIHN0YXRpYyB1aW50MzJfdAorICBnZXRWZXJzaW9uTWluTWlub3IoTWFjaE86OnZlcnNpb25fbWluX2NvbW1hbmQgJkMsIGJvb2wgU0RLKSB7CisgICAgdWludDMyX3QgVmVyc2lvbk9yU0RLID0gKFNESykgPyBDLnNkayA6IEMudmVyc2lvbjsKKyAgICByZXR1cm4gKFZlcnNpb25PclNESyA+PiA4KSAmIDB4ZmY7CisgIH0KKworICBzdGF0aWMgdWludDMyX3QKKyAgZ2V0VmVyc2lvbk1pblVwZGF0ZShNYWNoTzo6dmVyc2lvbl9taW5fY29tbWFuZCAmQywgYm9vbCBTREspIHsKKyAgICB1aW50MzJfdCBWZXJzaW9uT3JTREsgPSAoU0RLKSA/IEMuc2RrIDogQy52ZXJzaW9uOworICAgIHJldHVybiBWZXJzaW9uT3JTREsgJiAweGZmOworICB9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldEJ1aWxkUGxhdGZvcm0odWludDMyX3QgcGxhdGZvcm0pIHsKKyAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7CisgICAgY2FzZSBNYWNoTzo6UExBVEZPUk1fTUFDT1M6IHJldHVybiAibWFjb3MiOworICAgIGNhc2UgTWFjaE86OlBMQVRGT1JNX0lPUzogcmV0dXJuICJpb3MiOworICAgIGNhc2UgTWFjaE86OlBMQVRGT1JNX1RWT1M6IHJldHVybiAidHZvcyI7CisgICAgY2FzZSBNYWNoTzo6UExBVEZPUk1fV0FUQ0hPUzogcmV0dXJuICJ3YXRjaG9zIjsKKyAgICBjYXNlIE1hY2hPOjpQTEFURk9STV9CUklER0VPUzogcmV0dXJuICJicmlkZ2VvcyI7CisgICAgZGVmYXVsdDoKKyAgICAgIHN0ZDo6c3RyaW5nIHJldDsKKyAgICAgIHJhd19zdHJpbmdfb3N0cmVhbSBzcyhyZXQpOworICAgICAgc3MgPDwgZm9ybWF0X2hleChwbGF0Zm9ybSwgOCwgdHJ1ZSk7CisgICAgICByZXR1cm4gc3Muc3RyKCk7CisgICAgfQorICB9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldEJ1aWxkVG9vbCh1aW50MzJfdCB0b29scykgeworICAgIHN3aXRjaCAodG9vbHMpIHsKKyAgICBjYXNlIE1hY2hPOjpUT09MX0NMQU5HOiByZXR1cm4gImNsYW5nIjsKKyAgICBjYXNlIE1hY2hPOjpUT09MX1NXSUZUOiByZXR1cm4gInN3aWZ0IjsKKyAgICBjYXNlIE1hY2hPOjpUT09MX0xEOiByZXR1cm4gImxkIjsKKyAgICBkZWZhdWx0OgorICAgICAgc3RkOjpzdHJpbmcgcmV0OworICAgICAgcmF3X3N0cmluZ19vc3RyZWFtIHNzKHJldCk7CisgICAgICBzcyA8PCBmb3JtYXRfaGV4KHRvb2xzLCA4LCB0cnVlKTsKKyAgICAgIHJldHVybiBzcy5zdHIoKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0VmVyc2lvblN0cmluZyh1aW50MzJfdCB2ZXJzaW9uKSB7CisgICAgdWludDMyX3QgbWFqb3IgPSAodmVyc2lvbiA+PiAxNikgJiAweGZmZmY7CisgICAgdWludDMyX3QgbWlub3IgPSAodmVyc2lvbiA+PiA4KSAmIDB4ZmY7CisgICAgdWludDMyX3QgdXBkYXRlID0gdmVyc2lvbiAmIDB4ZmY7CisKKyAgICBTbWFsbFN0cmluZzwzMj4gVmVyc2lvbjsKKyAgICBWZXJzaW9uID0gdXRvc3RyKG1ham9yKSArICIuIiArIHV0b3N0cihtaW5vcik7CisgICAgaWYgKHVwZGF0ZSAhPSAwKQorICAgICAgVmVyc2lvbiArPSAiLiIgKyB1dG9zdHIodXBkYXRlKTsKKyAgICByZXR1cm4gVmVyc2lvbi5zdHIoKTsKKyAgfQorCitwcml2YXRlOgorICBNYWNoT09iamVjdEZpbGUoTWVtb3J5QnVmZmVyUmVmIE9iamVjdCwgYm9vbCBJc0xpdHRsZUVuZGlhbiwgYm9vbCBJczY0Qml0cywKKyAgICAgICAgICAgICAgICAgIEVycm9yICZFcnIsIHVpbnQzMl90IFVuaXZlcnNhbENwdXR5cGUgPSAwLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgVW5pdmVyc2FsSW5kZXggPSAwKTsKKworICB1aW50NjRfdCBnZXRTeW1ib2xWYWx1ZUltcGwoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdW5pb24geworICAgIE1hY2hPOjptYWNoX2hlYWRlcl82NCBIZWFkZXI2NDsKKyAgICBNYWNoTzo6bWFjaF9oZWFkZXIgSGVhZGVyOworICB9OworICB1c2luZyBTZWN0aW9uTGlzdCA9IFNtYWxsVmVjdG9yPGNvbnN0IGNoYXIqLCAxPjsKKyAgU2VjdGlvbkxpc3QgU2VjdGlvbnM7CisgIHVzaW5nIExpYnJhcnlMaXN0ID0gU21hbGxWZWN0b3I8Y29uc3QgY2hhciosIDE+OworICBMaWJyYXJ5TGlzdCBMaWJyYXJpZXM7CisgIExvYWRDb21tYW5kTGlzdCBMb2FkQ29tbWFuZHM7CisgIHVzaW5nIExpYnJhcnlTaG9ydE5hbWUgPSBTbWFsbFZlY3RvcjxTdHJpbmdSZWYsIDE+OworICB1c2luZyBCdWlsZFRvb2xMaXN0ID0gU21hbGxWZWN0b3I8Y29uc3QgY2hhciosIDE+OworICBCdWlsZFRvb2xMaXN0IEJ1aWxkVG9vbHM7CisgIG11dGFibGUgTGlicmFyeVNob3J0TmFtZSBMaWJyYXJpZXNTaG9ydE5hbWVzOworICBzdGQ6OnVuaXF1ZV9wdHI8QmluZFJlYmFzZVNlZ0luZm8+IEJpbmRSZWJhc2VTZWN0aW9uVGFibGU7CisgIGNvbnN0IGNoYXIgKlN5bXRhYkxvYWRDbWQgPSBudWxscHRyOworICBjb25zdCBjaGFyICpEeXN5bXRhYkxvYWRDbWQgPSBudWxscHRyOworICBjb25zdCBjaGFyICpEYXRhSW5Db2RlTG9hZENtZCA9IG51bGxwdHI7CisgIGNvbnN0IGNoYXIgKkxpbmtPcHRIaW50c0xvYWRDbWQgPSBudWxscHRyOworICBjb25zdCBjaGFyICpEeWxkSW5mb0xvYWRDbWQgPSBudWxscHRyOworICBjb25zdCBjaGFyICpVdWlkTG9hZENtZCA9IG51bGxwdHI7CisgIGJvb2wgSGFzUGFnZVplcm9TZWdtZW50ID0gZmFsc2U7Cit9OworCisvLy8gRGljZVJlZgoraW5saW5lIERpY2VSZWY6OkRpY2VSZWYoRGF0YVJlZkltcGwgRGljZVAsIGNvbnN0IE9iamVjdEZpbGUgKk93bmVyKQorICA6IERpY2VQaW1wbChEaWNlUCkgLCBPd25pbmdPYmplY3QoT3duZXIpIHt9CisKK2lubGluZSBib29sIERpY2VSZWY6Om9wZXJhdG9yPT0oY29uc3QgRGljZVJlZiAmT3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIERpY2VQaW1wbCA9PSBPdGhlci5EaWNlUGltcGw7Cit9CisKK2lubGluZSBib29sIERpY2VSZWY6Om9wZXJhdG9yPChjb25zdCBEaWNlUmVmICZPdGhlcikgY29uc3QgeworICByZXR1cm4gRGljZVBpbXBsIDwgT3RoZXIuRGljZVBpbXBsOworfQorCitpbmxpbmUgdm9pZCBEaWNlUmVmOjptb3ZlTmV4dCgpIHsKKyAgY29uc3QgTWFjaE86OmRhdGFfaW5fY29kZV9lbnRyeSAqUCA9CisgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNYWNoTzo6ZGF0YV9pbl9jb2RlX2VudHJ5ICo+KERpY2VQaW1wbC5wKTsKKyAgRGljZVBpbXBsLnAgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oUCArIDEpOworfQorCisvLyBTaW5jZSBhIE1hY2gtTyBkYXRhIGluIGNvZGUgcmVmZXJlbmNlLCBhIERpY2VSZWYsIGNhbiBvbmx5IGJlIGNyZWF0ZWQgd2hlbgorLy8gdGhlIE93bmluZ09iamVjdCBPYmplY3RGaWxlIGlzIGEgTWFjaE9PYmplY3RGaWxlIGEgc3RhdGljX2Nhc3Q8PiBpcyB1c2VkIGZvcgorLy8gdGhlIG1ldGhvZHMgdGhhdCBnZXQgdGhlIHZhbHVlcyBvZiB0aGUgZmllbGRzIG9mIHRoZSByZWZlcmVuY2UuCisKK2lubGluZSBzdGQ6OmVycm9yX2NvZGUgRGljZVJlZjo6Z2V0T2Zmc2V0KHVpbnQzMl90ICZSZXN1bHQpIGNvbnN0IHsKKyAgY29uc3QgTWFjaE9PYmplY3RGaWxlICpNYWNoT09GID0KKyAgICBzdGF0aWNfY2FzdDxjb25zdCBNYWNoT09iamVjdEZpbGUgKj4oT3duaW5nT2JqZWN0KTsKKyAgTWFjaE86OmRhdGFfaW5fY29kZV9lbnRyeSBEaWNlID0gTWFjaE9PRi0+Z2V0RGljZShEaWNlUGltcGwpOworICBSZXN1bHQgPSBEaWNlLm9mZnNldDsKKyAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOworfQorCitpbmxpbmUgc3RkOjplcnJvcl9jb2RlIERpY2VSZWY6OmdldExlbmd0aCh1aW50MTZfdCAmUmVzdWx0KSBjb25zdCB7CisgIGNvbnN0IE1hY2hPT2JqZWN0RmlsZSAqTWFjaE9PRiA9CisgICAgc3RhdGljX2Nhc3Q8Y29uc3QgTWFjaE9PYmplY3RGaWxlICo+KE93bmluZ09iamVjdCk7CisgIE1hY2hPOjpkYXRhX2luX2NvZGVfZW50cnkgRGljZSA9IE1hY2hPT0YtPmdldERpY2UoRGljZVBpbXBsKTsKKyAgUmVzdWx0ID0gRGljZS5sZW5ndGg7CisgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKK30KKworaW5saW5lIHN0ZDo6ZXJyb3JfY29kZSBEaWNlUmVmOjpnZXRLaW5kKHVpbnQxNl90ICZSZXN1bHQpIGNvbnN0IHsKKyAgY29uc3QgTWFjaE9PYmplY3RGaWxlICpNYWNoT09GID0KKyAgICBzdGF0aWNfY2FzdDxjb25zdCBNYWNoT09iamVjdEZpbGUgKj4oT3duaW5nT2JqZWN0KTsKKyAgTWFjaE86OmRhdGFfaW5fY29kZV9lbnRyeSBEaWNlID0gTWFjaE9PRi0+Z2V0RGljZShEaWNlUGltcGwpOworICBSZXN1bHQgPSBEaWNlLmtpbmQ7CisgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKK30KKworaW5saW5lIERhdGFSZWZJbXBsIERpY2VSZWY6OmdldFJhd0RhdGFSZWZJbXBsKCkgY29uc3QgeworICByZXR1cm4gRGljZVBpbXBsOworfQorCitpbmxpbmUgY29uc3QgT2JqZWN0RmlsZSAqRGljZVJlZjo6Z2V0T2JqZWN0RmlsZSgpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdDsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIG9iamVjdAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT0JKRUNUX01BQ0hPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L01hY2hPVW5pdmVyc2FsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9NYWNoT1VuaXZlcnNhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyODM3ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9NYWNoT1VuaXZlcnNhbC5oCkBAIC0wLDAgKzEsMTY4IEBACisvLz09PS0gTWFjaE9Vbml2ZXJzYWwuaCAtIE1hY2gtTyB1bml2ZXJzYWwgYmluYXJpZXMgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBNYWNoLU8gZmF0L3VuaXZlcnNhbCBiaW5hcmllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUX01BQ0hPVU5JVkVSU0FMX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RfTUFDSE9VTklWRVJTQUxfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9NYWNoTy5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0FyY2hpdmUuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9CaW5hcnkuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9NYWNoTy5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBTdHJpbmdSZWY7CisKK25hbWVzcGFjZSBvYmplY3QgeworCitjbGFzcyBNYWNoT1VuaXZlcnNhbEJpbmFyeSA6IHB1YmxpYyBCaW5hcnkgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKKyAgdWludDMyX3QgTWFnaWM7CisgIHVpbnQzMl90IE51bWJlck9mT2JqZWN0czsKK3B1YmxpYzoKKyAgY2xhc3MgT2JqZWN0Rm9yQXJjaCB7CisgICAgY29uc3QgTWFjaE9Vbml2ZXJzYWxCaW5hcnkgKlBhcmVudDsKKyAgICAvLy8gXGJyaWVmIEluZGV4IG9mIG9iamVjdCBpbiB0aGUgdW5pdmVyc2FsIGJpbmFyeS4KKyAgICB1aW50MzJfdCBJbmRleDsKKyAgICAvLy8gXGJyaWVmIERlc2NyaXB0b3Igb2YgdGhlIG9iamVjdC4KKyAgICBNYWNoTzo6ZmF0X2FyY2ggSGVhZGVyOworICAgIE1hY2hPOjpmYXRfYXJjaF82NCBIZWFkZXI2NDsKKworICBwdWJsaWM6CisgICAgT2JqZWN0Rm9yQXJjaChjb25zdCBNYWNoT1VuaXZlcnNhbEJpbmFyeSAqUGFyZW50LCB1aW50MzJfdCBJbmRleCk7CisKKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgUGFyZW50ID0gbnVsbHB0cjsKKyAgICAgIEluZGV4ID0gMDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgT2JqZWN0Rm9yQXJjaCAmT3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoUGFyZW50ID09IE90aGVyLlBhcmVudCkgJiYgKEluZGV4ID09IE90aGVyLkluZGV4KTsKKyAgICB9CisKKyAgICBPYmplY3RGb3JBcmNoIGdldE5leHQoKSBjb25zdCB7IHJldHVybiBPYmplY3RGb3JBcmNoKFBhcmVudCwgSW5kZXggKyAxKTsgfQorICAgIHVpbnQzMl90IGdldENQVVR5cGUoKSBjb25zdCB7CisgICAgICBpZiAoUGFyZW50LT5nZXRNYWdpYygpID09IE1hY2hPOjpGQVRfTUFHSUMpCisgICAgICAgIHJldHVybiBIZWFkZXIuY3B1dHlwZTsKKyAgICAgIGVsc2UgLy8gUGFyZW50LT5nZXRNYWdpYygpID09IE1hY2hPOjpGQVRfTUFHSUNfNjQKKyAgICAgICAgcmV0dXJuIEhlYWRlcjY0LmNwdXR5cGU7CisgICAgfQorICAgIHVpbnQzMl90IGdldENQVVN1YlR5cGUoKSBjb25zdCB7CisgICAgICBpZiAoUGFyZW50LT5nZXRNYWdpYygpID09IE1hY2hPOjpGQVRfTUFHSUMpCisgICAgICAgIHJldHVybiBIZWFkZXIuY3B1c3VidHlwZTsKKyAgICAgIGVsc2UgLy8gUGFyZW50LT5nZXRNYWdpYygpID09IE1hY2hPOjpGQVRfTUFHSUNfNjQKKyAgICAgICAgcmV0dXJuIEhlYWRlcjY0LmNwdXN1YnR5cGU7CisgICAgfQorICAgIHVpbnQzMl90IGdldE9mZnNldCgpIGNvbnN0IHsKKyAgICAgIGlmIChQYXJlbnQtPmdldE1hZ2ljKCkgPT0gTWFjaE86OkZBVF9NQUdJQykKKyAgICAgICAgcmV0dXJuIEhlYWRlci5vZmZzZXQ7CisgICAgICBlbHNlIC8vIFBhcmVudC0+Z2V0TWFnaWMoKSA9PSBNYWNoTzo6RkFUX01BR0lDXzY0CisgICAgICAgIHJldHVybiBIZWFkZXI2NC5vZmZzZXQ7CisgICAgfQorICAgIHVpbnQzMl90IGdldFNpemUoKSBjb25zdCB7CisgICAgICBpZiAoUGFyZW50LT5nZXRNYWdpYygpID09IE1hY2hPOjpGQVRfTUFHSUMpCisgICAgICAgIHJldHVybiBIZWFkZXIuc2l6ZTsKKyAgICAgIGVsc2UgLy8gUGFyZW50LT5nZXRNYWdpYygpID09IE1hY2hPOjpGQVRfTUFHSUNfNjQKKyAgICAgICAgcmV0dXJuIEhlYWRlcjY0LnNpemU7CisgICAgfQorICAgIHVpbnQzMl90IGdldEFsaWduKCkgY29uc3QgeworICAgICAgaWYgKFBhcmVudC0+Z2V0TWFnaWMoKSA9PSBNYWNoTzo6RkFUX01BR0lDKQorICAgICAgICByZXR1cm4gSGVhZGVyLmFsaWduOworICAgICAgZWxzZSAvLyBQYXJlbnQtPmdldE1hZ2ljKCkgPT0gTWFjaE86OkZBVF9NQUdJQ182NAorICAgICAgICByZXR1cm4gSGVhZGVyNjQuYWxpZ247CisgICAgfQorICAgIHVpbnQzMl90IGdldFJlc2VydmVkKCkgY29uc3QgeworICAgICAgaWYgKFBhcmVudC0+Z2V0TWFnaWMoKSA9PSBNYWNoTzo6RkFUX01BR0lDKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIGVsc2UgLy8gUGFyZW50LT5nZXRNYWdpYygpID09IE1hY2hPOjpGQVRfTUFHSUNfNjQKKyAgICAgICAgcmV0dXJuIEhlYWRlcjY0LnJlc2VydmVkOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBnZXRBcmNoRmxhZ05hbWUoKSBjb25zdCB7CisgICAgICBjb25zdCBjaGFyICpNY3B1RGVmYXVsdCwgKkFyY2hGbGFnOworICAgICAgaWYgKFBhcmVudC0+Z2V0TWFnaWMoKSA9PSBNYWNoTzo6RkFUX01BR0lDKSB7CisgICAgICAgIFRyaXBsZSBUID0KKyAgICAgICAgICAgIE1hY2hPT2JqZWN0RmlsZTo6Z2V0QXJjaFRyaXBsZShIZWFkZXIuY3B1dHlwZSwgSGVhZGVyLmNwdXN1YnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1jcHVEZWZhdWx0LCAmQXJjaEZsYWcpOworICAgICAgfSBlbHNlIHsgLy8gUGFyZW50LT5nZXRNYWdpYygpID09IE1hY2hPOjpGQVRfTUFHSUNfNjQKKyAgICAgICAgVHJpcGxlIFQgPQorICAgICAgICAgICAgTWFjaE9PYmplY3RGaWxlOjpnZXRBcmNoVHJpcGxlKEhlYWRlcjY0LmNwdXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyNjQuY3B1c3VidHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWNwdURlZmF1bHQsICZBcmNoRmxhZyk7CisgICAgICB9CisgICAgICBpZiAoQXJjaEZsYWcpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgQXJjaEZsYWdOYW1lKEFyY2hGbGFnKTsKKyAgICAgICAgcmV0dXJuIEFyY2hGbGFnTmFtZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIEFyY2hGbGFnTmFtZSgiIik7CisgICAgICAgIHJldHVybiBBcmNoRmxhZ05hbWU7CisgICAgICB9CisgICAgfQorCisgICAgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPE1hY2hPT2JqZWN0RmlsZT4+IGdldEFzT2JqZWN0RmlsZSgpIGNvbnN0OworCisgICAgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPEFyY2hpdmU+PiBnZXRBc0FyY2hpdmUoKSBjb25zdDsKKyAgfTsKKworICBjbGFzcyBvYmplY3RfaXRlcmF0b3IgeworICAgIE9iamVjdEZvckFyY2ggT2JqOworICBwdWJsaWM6CisgICAgb2JqZWN0X2l0ZXJhdG9yKGNvbnN0IE9iamVjdEZvckFyY2ggJk9iaikgOiBPYmooT2JqKSB7fQorICAgIGNvbnN0IE9iamVjdEZvckFyY2ggKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmT2JqOyB9CisgICAgY29uc3QgT2JqZWN0Rm9yQXJjaCAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gT2JqOyB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3Qgb2JqZWN0X2l0ZXJhdG9yICZPdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIE9iaiA9PSBPdGhlci5PYmo7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBvYmplY3RfaXRlcmF0b3IgJk90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gISgqdGhpcyA9PSBPdGhlcik7CisgICAgfQorCisgICAgb2JqZWN0X2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyAgLy8gUHJlaW5jcmVtZW50CisgICAgICBPYmogPSBPYmouZ2V0TmV4dCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgfTsKKworICBNYWNoT1VuaXZlcnNhbEJpbmFyeShNZW1vcnlCdWZmZXJSZWYgU291Y2UsIEVycm9yICZFcnIpOworICBzdGF0aWMgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPE1hY2hPVW5pdmVyc2FsQmluYXJ5Pj4KKyAgY3JlYXRlKE1lbW9yeUJ1ZmZlclJlZiBTb3VyY2UpOworCisgIG9iamVjdF9pdGVyYXRvciBiZWdpbl9vYmplY3RzKCkgY29uc3QgeworICAgIHJldHVybiBPYmplY3RGb3JBcmNoKHRoaXMsIDApOworICB9CisgIG9iamVjdF9pdGVyYXRvciBlbmRfb2JqZWN0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gT2JqZWN0Rm9yQXJjaChudWxscHRyLCAwKTsKKyAgfQorCisgIGl0ZXJhdG9yX3JhbmdlPG9iamVjdF9pdGVyYXRvcj4gb2JqZWN0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShiZWdpbl9vYmplY3RzKCksIGVuZF9vYmplY3RzKCkpOworICB9CisKKyAgdWludDMyX3QgZ2V0TWFnaWMoKSBjb25zdCB7IHJldHVybiBNYWdpYzsgfQorICB1aW50MzJfdCBnZXROdW1iZXJPZk9iamVjdHMoKSBjb25zdCB7IHJldHVybiBOdW1iZXJPZk9iamVjdHM7IH0KKworICAvLyBDYXN0IG1ldGhvZHMuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoQmluYXJ5IGNvbnN0ICpWKSB7CisgICAgcmV0dXJuIFYtPmlzTWFjaE9Vbml2ZXJzYWxCaW5hcnkoKTsKKyAgfQorCisgIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxNYWNoT09iamVjdEZpbGU+PgorICBnZXRPYmplY3RGb3JBcmNoKFN0cmluZ1JlZiBBcmNoTmFtZSkgY29uc3Q7Cit9OworCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvTW9kdWxlU3ltYm9sVGFibGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L01vZHVsZVN5bWJvbFRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5MzIyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L01vZHVsZVN5bWJvbFRhYmxlLmgKQEAgLTAsMCArMSw2NCBAQAorLy89PT0tIE1vZHVsZVN5bWJvbFRhYmxlLmggLSBzeW1ib2wgdGFibGUgZm9yIGluLW1lbW9yeSBJUiAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzeW1ib2wgdGFibGUgYnVpbHQgZnJvbSBpbi1tZW1vcnkgSVIuIEl0IHByb3ZpZGVzCisvLyBhY2Nlc3MgdG8gR2xvYmFsVmFsdWVzIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHN1Y2ggYWNjZXNzIGlzIHJlcXVpcmVkCisvLyAoZS5nLiBpbiB0aGUgTFRPIGltcGxlbWVudGF0aW9uKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUX01PRFVMRVNZTUJPTFRBQkxFX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RfTU9EVUxFU1lNQk9MVEFCTEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL01hbmdsZXIuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9TeW1ib2xpY0ZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgR2xvYmFsVmFsdWU7CisKK2NsYXNzIE1vZHVsZVN5bWJvbFRhYmxlIHsKK3B1YmxpYzoKKyAgdXNpbmcgQXNtU3ltYm9sID0gc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCB1aW50MzJfdD47CisgIHVzaW5nIFN5bWJvbCA9IFBvaW50ZXJVbmlvbjxHbG9iYWxWYWx1ZSAqLCBBc21TeW1ib2wgKj47CisKK3ByaXZhdGU6CisgIE1vZHVsZSAqRmlyc3RNb2QgPSBudWxscHRyOworCisgIFNwZWNpZmljQnVtcFB0ckFsbG9jYXRvcjxBc21TeW1ib2w+IEFzbVN5bWJvbHM7CisgIHN0ZDo6dmVjdG9yPFN5bWJvbD4gU3ltVGFiOworICBNYW5nbGVyIE1hbmc7CisKK3B1YmxpYzoKKyAgQXJyYXlSZWY8U3ltYm9sPiBzeW1ib2xzKCkgY29uc3QgeyByZXR1cm4gU3ltVGFiOyB9CisgIHZvaWQgYWRkTW9kdWxlKE1vZHVsZSAqTSk7CisKKyAgdm9pZCBwcmludFN5bWJvbE5hbWUocmF3X29zdHJlYW0gJk9TLCBTeW1ib2wgUykgY29uc3Q7CisgIHVpbnQzMl90IGdldFN5bWJvbEZsYWdzKFN5bWJvbCBTKSBjb25zdDsKKworICAvLy8gUGFyc2UgaW5saW5lIEFTTSBhbmQgY29sbGVjdCB0aGUgc3ltYm9scyB0aGF0IGFyZSBkZWZpbmVkIG9yIHJlZmVyZW5jZWQgaW4KKyAgLy8vIHRoZSBjdXJyZW50IG1vZHVsZS4KKyAgLy8vCisgIC8vLyBGb3IgZWFjaCBmb3VuZCBzeW1ib2wsIGNhbGwgXHAgQXNtU3ltYm9sIHdpdGggdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBmb3VuZAorICAvLy8gYW5kIHRoZSBhc3NvY2lhdGVkIGZsYWdzLgorICBzdGF0aWMgdm9pZCBDb2xsZWN0QXNtU3ltYm9scygKKyAgICAgIGNvbnN0IE1vZHVsZSAmTSwKKyAgICAgIGZ1bmN0aW9uX3JlZjx2b2lkKFN0cmluZ1JlZiwgb2JqZWN0OjpCYXNpY1N5bWJvbFJlZjo6RmxhZ3MpPiBBc21TeW1ib2wpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT0JKRUNUX01PRFVMRVNZTUJPTFRBQkxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L09iamVjdEZpbGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L09iamVjdEZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzRhZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvT2JqZWN0RmlsZS5oCkBAIC0wLDAgKzEsNTA3IEBACisvLz09PS0gT2JqZWN0RmlsZS5oIC0gRmlsZSBmb3JtYXQgaW5kZXBlbmRlbnQgb2JqZWN0IGZpbGUgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBhIGZpbGUgZm9ybWF0IGluZGVwZW5kZW50IE9iamVjdEZpbGUgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVF9PQkpFQ1RGSUxFX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RfT0JKRUNURklMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L01hZ2ljLmgiCisjaW5jbHVkZSAibGx2bS9NQy9TdWJ0YXJnZXRGZWF0dXJlLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvQmluYXJ5LmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9TeW1ib2xpY0ZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFSTUF0dHJpYnV0ZVBhcnNlcjsKKworbmFtZXNwYWNlIG9iamVjdCB7CisKK2NsYXNzIENPRkZPYmplY3RGaWxlOworY2xhc3MgTWFjaE9PYmplY3RGaWxlOworY2xhc3MgT2JqZWN0RmlsZTsKK2NsYXNzIFNlY3Rpb25SZWY7CitjbGFzcyBTeW1ib2xSZWY7CitjbGFzcyBzeW1ib2xfaXRlcmF0b3I7CitjbGFzcyBXYXNtT2JqZWN0RmlsZTsKKwordXNpbmcgc2VjdGlvbl9pdGVyYXRvciA9IGNvbnRlbnRfaXRlcmF0b3I8U2VjdGlvblJlZj47CisKKy8vLyBUaGlzIGlzIGEgdmFsdWUgdHlwZSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUgcmVsb2NhdGlvbiBpbiB0aGUgbGlzdAorLy8vIG9mIHJlbG9jYXRpb25zIGluIHRoZSBvYmplY3QgZmlsZS4KK2NsYXNzIFJlbG9jYXRpb25SZWYgeworICBEYXRhUmVmSW1wbCBSZWxvY2F0aW9uUGltcGw7CisgIGNvbnN0IE9iamVjdEZpbGUgKk93bmluZ09iamVjdCA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgUmVsb2NhdGlvblJlZigpID0gZGVmYXVsdDsKKyAgUmVsb2NhdGlvblJlZihEYXRhUmVmSW1wbCBSZWxvY2F0aW9uUCwgY29uc3QgT2JqZWN0RmlsZSAqT3duZXIpOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZWxvY2F0aW9uUmVmICZPdGhlcikgY29uc3Q7CisKKyAgdm9pZCBtb3ZlTmV4dCgpOworCisgIHVpbnQ2NF90IGdldE9mZnNldCgpIGNvbnN0OworICBzeW1ib2xfaXRlcmF0b3IgZ2V0U3ltYm9sKCkgY29uc3Q7CisgIHVpbnQ2NF90IGdldFR5cGUoKSBjb25zdDsKKworICAvLy8gQGJyaWVmIEdldCBhIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgdGhpcyByZWxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgZm9yIGRpc3BsYXkgcHVycG9zZXMgb25seS4KKyAgdm9pZCBnZXRUeXBlTmFtZShTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlJlc3VsdCkgY29uc3Q7CisKKyAgRGF0YVJlZkltcGwgZ2V0UmF3RGF0YVJlZkltcGwoKSBjb25zdDsKKyAgY29uc3QgT2JqZWN0RmlsZSAqZ2V0T2JqZWN0KCkgY29uc3Q7Cit9OworCit1c2luZyByZWxvY2F0aW9uX2l0ZXJhdG9yID0gY29udGVudF9pdGVyYXRvcjxSZWxvY2F0aW9uUmVmPjsKKworLy8vIFRoaXMgaXMgYSB2YWx1ZSB0eXBlIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSBzZWN0aW9uIGluIHRoZSBsaXN0IG9mCisvLy8gc2VjdGlvbnMgaW4gdGhlIG9iamVjdCBmaWxlLgorY2xhc3MgU2VjdGlvblJlZiB7CisgIGZyaWVuZCBjbGFzcyBTeW1ib2xSZWY7CisKKyAgRGF0YVJlZkltcGwgU2VjdGlvblBpbXBsOworICBjb25zdCBPYmplY3RGaWxlICpPd25pbmdPYmplY3QgPSBudWxscHRyOworCitwdWJsaWM6CisgIFNlY3Rpb25SZWYoKSA9IGRlZmF1bHQ7CisgIFNlY3Rpb25SZWYoRGF0YVJlZkltcGwgU2VjdGlvblAsIGNvbnN0IE9iamVjdEZpbGUgKk93bmVyKTsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgU2VjdGlvblJlZiAmT3RoZXIpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgU2VjdGlvblJlZiAmT3RoZXIpIGNvbnN0OworICBib29sIG9wZXJhdG9yPChjb25zdCBTZWN0aW9uUmVmICZPdGhlcikgY29uc3Q7CisKKyAgdm9pZCBtb3ZlTmV4dCgpOworCisgIHN0ZDo6ZXJyb3JfY29kZSBnZXROYW1lKFN0cmluZ1JlZiAmUmVzdWx0KSBjb25zdDsKKyAgdWludDY0X3QgZ2V0QWRkcmVzcygpIGNvbnN0OworICB1aW50NjRfdCBnZXRJbmRleCgpIGNvbnN0OworICB1aW50NjRfdCBnZXRTaXplKCkgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRDb250ZW50cyhTdHJpbmdSZWYgJlJlc3VsdCkgY29uc3Q7CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIGFsaWdubWVudCBvZiB0aGlzIHNlY3Rpb24gYXMgdGhlIGFjdHVhbCB2YWx1ZSAobm90IGxvZyAyKS4KKyAgdWludDY0X3QgZ2V0QWxpZ25tZW50KCkgY29uc3Q7CisKKyAgYm9vbCBpc0NvbXByZXNzZWQoKSBjb25zdDsKKyAgYm9vbCBpc1RleHQoKSBjb25zdDsKKyAgYm9vbCBpc0RhdGEoKSBjb25zdDsKKyAgYm9vbCBpc0JTUygpIGNvbnN0OworICBib29sIGlzVmlydHVhbCgpIGNvbnN0OworICBib29sIGlzQml0Y29kZSgpIGNvbnN0OworICBib29sIGlzU3RyaXBwZWQoKSBjb25zdDsKKworICBib29sIGNvbnRhaW5zU3ltYm9sKFN5bWJvbFJlZiBTKSBjb25zdDsKKworICByZWxvY2F0aW9uX2l0ZXJhdG9yIHJlbG9jYXRpb25fYmVnaW4oKSBjb25zdDsKKyAgcmVsb2NhdGlvbl9pdGVyYXRvciByZWxvY2F0aW9uX2VuZCgpIGNvbnN0OworICBpdGVyYXRvcl9yYW5nZTxyZWxvY2F0aW9uX2l0ZXJhdG9yPiByZWxvY2F0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShyZWxvY2F0aW9uX2JlZ2luKCksIHJlbG9jYXRpb25fZW5kKCkpOworICB9CisgIHNlY3Rpb25faXRlcmF0b3IgZ2V0UmVsb2NhdGVkU2VjdGlvbigpIGNvbnN0OworCisgIERhdGFSZWZJbXBsIGdldFJhd0RhdGFSZWZJbXBsKCkgY29uc3Q7CisgIGNvbnN0IE9iamVjdEZpbGUgKmdldE9iamVjdCgpIGNvbnN0OworfTsKKworLy8vIFRoaXMgaXMgYSB2YWx1ZSB0eXBlIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSBzeW1ib2wgaW4gdGhlIGxpc3Qgb2YKKy8vLyBzeW1ib2xzIGluIHRoZSBvYmplY3QgZmlsZS4KK2NsYXNzIFN5bWJvbFJlZiA6IHB1YmxpYyBCYXNpY1N5bWJvbFJlZiB7CisgIGZyaWVuZCBjbGFzcyBTZWN0aW9uUmVmOworCitwdWJsaWM6CisgIGVudW0gVHlwZSB7CisgICAgU1RfVW5rbm93biwgLy8gVHlwZSBub3Qgc3BlY2lmaWVkCisgICAgU1RfRGF0YSwKKyAgICBTVF9EZWJ1ZywKKyAgICBTVF9GaWxlLAorICAgIFNUX0Z1bmN0aW9uLAorICAgIFNUX090aGVyCisgIH07CisKKyAgU3ltYm9sUmVmKCkgPSBkZWZhdWx0OworICBTeW1ib2xSZWYoRGF0YVJlZkltcGwgU3ltYm9sUCwgY29uc3QgT2JqZWN0RmlsZSAqT3duZXIpOworICBTeW1ib2xSZWYoY29uc3QgQmFzaWNTeW1ib2xSZWYgJkIpIDogQmFzaWNTeW1ib2xSZWYoQikgeworICAgIGFzc2VydChpc2E8T2JqZWN0RmlsZT4oQmFzaWNTeW1ib2xSZWY6OmdldE9iamVjdCgpKSk7CisgIH0KKworICBFeHBlY3RlZDxTdHJpbmdSZWY+IGdldE5hbWUoKSBjb25zdDsKKyAgLy8vIFJldHVybnMgdGhlIHN5bWJvbCB2aXJ0dWFsIGFkZHJlc3MgKGkuZS4gYWRkcmVzcyBhdCB3aGljaCBpdCB3aWxsIGJlCisgIC8vLyBtYXBwZWQpLgorICBFeHBlY3RlZDx1aW50NjRfdD4gZ2V0QWRkcmVzcygpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgZGVwZW5kaW5nIG9uIHRoZSBvYmplY3QgdGhpcyBjYW4gYmUgYW4KKyAgLy8vIG9mZnNldCBvciBhIHZpcnR1YWwgYWRkcmVzcy4KKyAgdWludDY0X3QgZ2V0VmFsdWUoKSBjb25zdDsKKworICAvLy8gQGJyaWVmIEdldCB0aGUgYWxpZ25tZW50IG9mIHRoaXMgc3ltYm9sIGFzIHRoZSBhY3R1YWwgdmFsdWUgKG5vdCBsb2cgMikuCisgIHVpbnQzMl90IGdldEFsaWdubWVudCgpIGNvbnN0OworICB1aW50NjRfdCBnZXRDb21tb25TaXplKCkgY29uc3Q7CisgIEV4cGVjdGVkPFN5bWJvbFJlZjo6VHlwZT4gZ2V0VHlwZSgpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgR2V0IHNlY3Rpb24gdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBpbiByZWZlcmVuY2UgdG8uIFJlc3VsdCBpcworICAvLy8gZW5kX3NlY3Rpb25zKCkgaWYgaXQgaXMgdW5kZWZpbmVkIG9yIGlzIGFuIGFic29sdXRlIHN5bWJvbC4KKyAgRXhwZWN0ZWQ8c2VjdGlvbl9pdGVyYXRvcj4gZ2V0U2VjdGlvbigpIGNvbnN0OworCisgIGNvbnN0IE9iamVjdEZpbGUgKmdldE9iamVjdCgpIGNvbnN0OworfTsKKworY2xhc3Mgc3ltYm9sX2l0ZXJhdG9yIDogcHVibGljIGJhc2ljX3N5bWJvbF9pdGVyYXRvciB7CitwdWJsaWM6CisgIHN5bWJvbF9pdGVyYXRvcihTeW1ib2xSZWYgU3ltKSA6IGJhc2ljX3N5bWJvbF9pdGVyYXRvcihTeW0pIHt9CisgIHN5bWJvbF9pdGVyYXRvcihjb25zdCBiYXNpY19zeW1ib2xfaXRlcmF0b3IgJkIpCisgICAgICA6IGJhc2ljX3N5bWJvbF9pdGVyYXRvcihTeW1ib2xSZWYoQi0+Z2V0UmF3RGF0YVJlZkltcGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0PE9iamVjdEZpbGU+KEItPmdldE9iamVjdCgpKSkpIHt9CisKKyAgY29uc3QgU3ltYm9sUmVmICpvcGVyYXRvci0+KCkgY29uc3QgeworICAgIGNvbnN0IEJhc2ljU3ltYm9sUmVmICZQID0gYmFzaWNfc3ltYm9sX2l0ZXJhdG9yOjpvcGVyYXRvciAqKCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFN5bWJvbFJlZio+KCZQKTsKKyAgfQorCisgIGNvbnN0IFN5bWJvbFJlZiAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGNvbnN0IEJhc2ljU3ltYm9sUmVmICZQID0gYmFzaWNfc3ltYm9sX2l0ZXJhdG9yOjpvcGVyYXRvciAqKCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFN5bWJvbFJlZiY+KFApOworICB9Cit9OworCisvLy8gVGhpcyBjbGFzcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIG9iamVjdCBmaWxlIHR5cGVzLiBDb25jcmV0ZSBpbnN0YW5jZXMKKy8vLyBvZiB0aGlzIG9iamVjdCBhcmUgY3JlYXRlZCBieSBjcmVhdGVPYmplY3RGaWxlLCB3aGljaCBmaWd1cmVzIG91dCB3aGljaCB0eXBlCisvLy8gdG8gY3JlYXRlLgorY2xhc3MgT2JqZWN0RmlsZSA6IHB1YmxpYyBTeW1ib2xpY0ZpbGUgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3Byb3RlY3RlZDoKKyAgT2JqZWN0RmlsZSh1bnNpZ25lZCBpbnQgVHlwZSwgTWVtb3J5QnVmZmVyUmVmIFNvdXJjZSk7CisKKyAgY29uc3QgdWludDhfdCAqYmFzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KERhdGEuZ2V0QnVmZmVyU3RhcnQoKSk7CisgIH0KKworICAvLyBUaGVzZSBmdW5jdGlvbnMgYXJlIGZvciBTeW1ib2xSZWYgdG8gY2FsbCBpbnRlcm5hbGx5LiBUaGUgbWFpbiBnb2FsIG9mCisgIC8vIHRoaXMgaXMgdG8gYWxsb3cgU3ltYm9sUmVmOjpTeW1ib2xQaW1wbCB0byBwb2ludCBkaXJlY3RseSB0byB0aGUgc3ltYm9sCisgIC8vIGVudHJ5IGluIHRoZSBtZW1vcnkgbWFwcGVkIG9iamVjdCBmaWxlLiBTeW1ib2xQaW1wbCBjYW5ub3QgY29udGFpbiBhbnkKKyAgLy8gdmlydHVhbCBmdW5jdGlvbnMgYmVjYXVzZSB0aGVuIGl0IGNvdWxkIG5vdCBwb2ludCBpbnRvIHRoZSBtZW1vcnkgbWFwcGVkCisgIC8vIGZpbGUuCisgIC8vCisgIC8vIEltcGxlbWVudGF0aW9ucyBhc3N1bWUgdGhhdCB0aGUgRGF0YVJlZkltcGwgaXMgdmFsaWQgYW5kIGhhcyBub3QgYmVlbgorICAvLyBtb2RpZmllZCBleHRlcm5hbGx5LiBJdCdzIFVCIG90aGVyd2lzZS4KKyAgZnJpZW5kIGNsYXNzIFN5bWJvbFJlZjsKKworICB2aXJ0dWFsIEV4cGVjdGVkPFN0cmluZ1JlZj4gZ2V0U3ltYm9sTmFtZShEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCA9IDA7CisgIHN0ZDo6ZXJyb3JfY29kZSBwcmludFN5bWJvbE5hbWUocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIEV4cGVjdGVkPHVpbnQ2NF90PiBnZXRTeW1ib2xBZGRyZXNzKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50NjRfdCBnZXRTeW1ib2xWYWx1ZUltcGwoRGF0YVJlZkltcGwgU3ltYikgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFN5bWJvbEFsaWdubWVudChEYXRhUmVmSW1wbCBTeW1iKSBjb25zdDsKKyAgdmlydHVhbCB1aW50NjRfdCBnZXRDb21tb25TeW1ib2xTaXplSW1wbChEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgRXhwZWN0ZWQ8U3ltYm9sUmVmOjpUeXBlPiBnZXRTeW1ib2xUeXBlKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBFeHBlY3RlZDxzZWN0aW9uX2l0ZXJhdG9yPgorICBnZXRTeW1ib2xTZWN0aW9uKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0ID0gMDsKKworICAvLyBTYW1lIGFzIGFib3ZlIGZvciBTZWN0aW9uUmVmLgorICBmcmllbmQgY2xhc3MgU2VjdGlvblJlZjsKKworICB2aXJ0dWFsIHZvaWQgbW92ZVNlY3Rpb25OZXh0KERhdGFSZWZJbXBsICZTZWMpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OmVycm9yX2NvZGUgZ2V0U2VjdGlvbk5hbWUoRGF0YVJlZkltcGwgU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgJlJlcykgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ2NF90IGdldFNlY3Rpb25BZGRyZXNzKERhdGFSZWZJbXBsIFNlYykgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ2NF90IGdldFNlY3Rpb25JbmRleChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50NjRfdCBnZXRTZWN0aW9uU2l6ZShEYXRhUmVmSW1wbCBTZWMpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OmVycm9yX2NvZGUgZ2V0U2VjdGlvbkNvbnRlbnRzKERhdGFSZWZJbXBsIFNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAmUmVzKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDY0X3QgZ2V0U2VjdGlvbkFsaWdubWVudChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzU2VjdGlvbkNvbXByZXNzZWQoRGF0YVJlZkltcGwgU2VjKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1NlY3Rpb25UZXh0KERhdGFSZWZJbXBsIFNlYykgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNTZWN0aW9uRGF0YShEYXRhUmVmSW1wbCBTZWMpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzU2VjdGlvbkJTUyhEYXRhUmVmSW1wbCBTZWMpIGNvbnN0ID0gMDsKKyAgLy8gQSBzZWN0aW9uIGlzICd2aXJ0dWFsJyBpZiBpdHMgY29udGVudHMgYXJlbid0IHByZXNlbnQgaW4gdGhlIG9iamVjdCBpbWFnZS4KKyAgdmlydHVhbCBib29sIGlzU2VjdGlvblZpcnR1YWwoRGF0YVJlZkltcGwgU2VjKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1NlY3Rpb25CaXRjb2RlKERhdGFSZWZJbXBsIFNlYykgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBpc1NlY3Rpb25TdHJpcHBlZChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0OworICB2aXJ0dWFsIHJlbG9jYXRpb25faXRlcmF0b3Igc2VjdGlvbl9yZWxfYmVnaW4oRGF0YVJlZkltcGwgU2VjKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgcmVsb2NhdGlvbl9pdGVyYXRvciBzZWN0aW9uX3JlbF9lbmQoRGF0YVJlZkltcGwgU2VjKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc2VjdGlvbl9pdGVyYXRvciBnZXRSZWxvY2F0ZWRTZWN0aW9uKERhdGFSZWZJbXBsIFNlYykgY29uc3Q7CisKKyAgLy8gU2FtZSBhcyBhYm92ZSBmb3IgUmVsb2NhdGlvblJlZi4KKyAgZnJpZW5kIGNsYXNzIFJlbG9jYXRpb25SZWY7CisgIHZpcnR1YWwgdm9pZCBtb3ZlUmVsb2NhdGlvbk5leHQoRGF0YVJlZkltcGwgJlJlbCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ2NF90IGdldFJlbG9jYXRpb25PZmZzZXQoRGF0YVJlZkltcGwgUmVsKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3ltYm9sX2l0ZXJhdG9yIGdldFJlbG9jYXRpb25TeW1ib2woRGF0YVJlZkltcGwgUmVsKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDY0X3QgZ2V0UmVsb2NhdGlvblR5cGUoRGF0YVJlZkltcGwgUmVsKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBnZXRSZWxvY2F0aW9uVHlwZU5hbWUoRGF0YVJlZkltcGwgUmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0KSBjb25zdCA9IDA7CisKKyAgdWludDY0X3QgZ2V0U3ltYm9sVmFsdWUoRGF0YVJlZkltcGwgU3ltYikgY29uc3Q7CisKK3B1YmxpYzoKKyAgT2JqZWN0RmlsZSgpID0gZGVsZXRlOworICBPYmplY3RGaWxlKGNvbnN0IE9iamVjdEZpbGUgJm90aGVyKSA9IGRlbGV0ZTsKKworICB1aW50NjRfdCBnZXRDb21tb25TeW1ib2xTaXplKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0U3ltYm9sRmxhZ3MoU3ltYikgJiBTeW1ib2xSZWY6OlNGX0NvbW1vbik7CisgICAgcmV0dXJuIGdldENvbW1vblN5bWJvbFNpemVJbXBsKFN5bWIpOworICB9CisKKyAgdXNpbmcgc3ltYm9sX2l0ZXJhdG9yX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8c3ltYm9sX2l0ZXJhdG9yPjsKKyAgc3ltYm9sX2l0ZXJhdG9yX3JhbmdlIHN5bWJvbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHN5bWJvbF9pdGVyYXRvcl9yYW5nZShzeW1ib2xfYmVnaW4oKSwgc3ltYm9sX2VuZCgpKTsKKyAgfQorCisgIHZpcnR1YWwgc2VjdGlvbl9pdGVyYXRvciBzZWN0aW9uX2JlZ2luKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHNlY3Rpb25faXRlcmF0b3Igc2VjdGlvbl9lbmQoKSBjb25zdCA9IDA7CisKKyAgdXNpbmcgc2VjdGlvbl9pdGVyYXRvcl9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPHNlY3Rpb25faXRlcmF0b3I+OworICBzZWN0aW9uX2l0ZXJhdG9yX3JhbmdlIHNlY3Rpb25zKCkgY29uc3QgeworICAgIHJldHVybiBzZWN0aW9uX2l0ZXJhdG9yX3JhbmdlKHNlY3Rpb25fYmVnaW4oKSwgc2VjdGlvbl9lbmQoKSk7CisgIH0KKworICAvLy8gQGJyaWVmIFRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCB0byByZXByZXNlbnQgYW4gYWRkcmVzcyBpbiB0aGlzIG9iamVjdAorICAvLy8gICAgICAgIGZpbGUgZm9ybWF0LgorICB2aXJ0dWFsIHVpbnQ4X3QgZ2V0Qnl0ZXNJbkFkZHJlc3MoKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0RmlsZUZvcm1hdE5hbWUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgVHJpcGxlOjpBcmNoVHlwZSBnZXRBcmNoKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIFN1YnRhcmdldEZlYXR1cmVzIGdldEZlYXR1cmVzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgc2V0QVJNU3ViQXJjaChUcmlwbGUgJlRoZVRyaXBsZSkgY29uc3QgeyB9CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSB0cmlwbGUgZnJvbSB0aGUgZGF0YSBpbiB0aGlzIG9iamVjdCBmaWxlLgorICBUcmlwbGUgbWFrZVRyaXBsZSgpIGNvbnN0OworCisgIHZpcnR1YWwgc3RkOjplcnJvcl9jb2RlCisgICAgZ2V0QnVpbGRBdHRyaWJ1dGVzKEFSTUF0dHJpYnV0ZVBhcnNlciAmQXR0cmlidXRlcykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOworICAgIH0KKworICAvLy8gTWFwcyBhIGRlYnVnIHNlY3Rpb24gbmFtZSB0byBhIHN0YW5kYXJkIERXQVJGIHNlY3Rpb24gbmFtZS4KKyAgdmlydHVhbCBTdHJpbmdSZWYgbWFwRGVidWdTZWN0aW9uTmFtZShTdHJpbmdSZWYgTmFtZSkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorCisgIC8vLyBUcnVlIGlmIHRoaXMgaXMgYSByZWxvY2F0YWJsZSBvYmplY3QgKC5vLy5vYmopLgorICB2aXJ0dWFsIGJvb2wgaXNSZWxvY2F0YWJsZU9iamVjdCgpIGNvbnN0ID0gMDsKKworICAvLy8gQHJldHVybnMgUG9pbnRlciB0byBPYmplY3RGaWxlIHN1YmNsYXNzIHRvIGhhbmRsZSB0aGlzIHR5cGUgb2Ygb2JqZWN0LgorICAvLy8gQHBhcmFtIE9iamVjdFBhdGggVGhlIHBhdGggdG8gdGhlIG9iamVjdCBmaWxlLiBPYmplY3RQYXRoLmlzT2JqZWN0IG11c3QKKyAgLy8vICAgICAgICByZXR1cm4gdHJ1ZS4KKyAgLy8vIEBicmllZiBDcmVhdGUgT2JqZWN0RmlsZSBmcm9tIHBhdGguCisgIHN0YXRpYyBFeHBlY3RlZDxPd25pbmdCaW5hcnk8T2JqZWN0RmlsZT4+CisgIGNyZWF0ZU9iamVjdEZpbGUoU3RyaW5nUmVmIE9iamVjdFBhdGgpOworCisgIHN0YXRpYyBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8T2JqZWN0RmlsZT4+CisgIGNyZWF0ZU9iamVjdEZpbGUoTWVtb3J5QnVmZmVyUmVmIE9iamVjdCwgbGx2bTo6ZmlsZV9tYWdpYyBUeXBlKTsKKyAgc3RhdGljIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxPYmplY3RGaWxlPj4KKyAgY3JlYXRlT2JqZWN0RmlsZShNZW1vcnlCdWZmZXJSZWYgT2JqZWN0KSB7CisgICAgcmV0dXJuIGNyZWF0ZU9iamVjdEZpbGUoT2JqZWN0LCBsbHZtOjpmaWxlX21hZ2ljOjp1bmtub3duKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQmluYXJ5ICp2KSB7CisgICAgcmV0dXJuIHYtPmlzT2JqZWN0KCk7CisgIH0KKworICBzdGF0aWMgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPENPRkZPYmplY3RGaWxlPj4KKyAgY3JlYXRlQ09GRk9iamVjdEZpbGUoTWVtb3J5QnVmZmVyUmVmIE9iamVjdCk7CisKKyAgc3RhdGljIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxPYmplY3RGaWxlPj4KKyAgY3JlYXRlRUxGT2JqZWN0RmlsZShNZW1vcnlCdWZmZXJSZWYgT2JqZWN0KTsKKworICBzdGF0aWMgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPE1hY2hPT2JqZWN0RmlsZT4+CisgIGNyZWF0ZU1hY2hPT2JqZWN0RmlsZShNZW1vcnlCdWZmZXJSZWYgT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVW5pdmVyc2FsQ3B1dHlwZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBVbml2ZXJzYWxJbmRleCA9IDApOworCisgIHN0YXRpYyBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8V2FzbU9iamVjdEZpbGU+PgorICBjcmVhdGVXYXNtT2JqZWN0RmlsZShNZW1vcnlCdWZmZXJSZWYgT2JqZWN0KTsKK307CisKKy8vIElubGluZSBmdW5jdGlvbiBkZWZpbml0aW9ucy4KK2lubGluZSBTeW1ib2xSZWY6OlN5bWJvbFJlZihEYXRhUmVmSW1wbCBTeW1ib2xQLCBjb25zdCBPYmplY3RGaWxlICpPd25lcikKKyAgICA6IEJhc2ljU3ltYm9sUmVmKFN5bWJvbFAsIE93bmVyKSB7fQorCitpbmxpbmUgRXhwZWN0ZWQ8U3RyaW5nUmVmPiBTeW1ib2xSZWY6OmdldE5hbWUoKSBjb25zdCB7CisgIHJldHVybiBnZXRPYmplY3QoKS0+Z2V0U3ltYm9sTmFtZShnZXRSYXdEYXRhUmVmSW1wbCgpKTsKK30KKworaW5saW5lIEV4cGVjdGVkPHVpbnQ2NF90PiBTeW1ib2xSZWY6OmdldEFkZHJlc3MoKSBjb25zdCB7CisgIHJldHVybiBnZXRPYmplY3QoKS0+Z2V0U3ltYm9sQWRkcmVzcyhnZXRSYXdEYXRhUmVmSW1wbCgpKTsKK30KKworaW5saW5lIHVpbnQ2NF90IFN5bWJvbFJlZjo6Z2V0VmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBnZXRPYmplY3QoKS0+Z2V0U3ltYm9sVmFsdWUoZ2V0UmF3RGF0YVJlZkltcGwoKSk7Cit9CisKK2lubGluZSB1aW50MzJfdCBTeW1ib2xSZWY6OmdldEFsaWdubWVudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldE9iamVjdCgpLT5nZXRTeW1ib2xBbGlnbm1lbnQoZ2V0UmF3RGF0YVJlZkltcGwoKSk7Cit9CisKK2lubGluZSB1aW50NjRfdCBTeW1ib2xSZWY6OmdldENvbW1vblNpemUoKSBjb25zdCB7CisgIHJldHVybiBnZXRPYmplY3QoKS0+Z2V0Q29tbW9uU3ltYm9sU2l6ZShnZXRSYXdEYXRhUmVmSW1wbCgpKTsKK30KKworaW5saW5lIEV4cGVjdGVkPHNlY3Rpb25faXRlcmF0b3I+IFN5bWJvbFJlZjo6Z2V0U2VjdGlvbigpIGNvbnN0IHsKKyAgcmV0dXJuIGdldE9iamVjdCgpLT5nZXRTeW1ib2xTZWN0aW9uKGdldFJhd0RhdGFSZWZJbXBsKCkpOworfQorCitpbmxpbmUgRXhwZWN0ZWQ8U3ltYm9sUmVmOjpUeXBlPiBTeW1ib2xSZWY6OmdldFR5cGUoKSBjb25zdCB7CisgIHJldHVybiBnZXRPYmplY3QoKS0+Z2V0U3ltYm9sVHlwZShnZXRSYXdEYXRhUmVmSW1wbCgpKTsKK30KKworaW5saW5lIGNvbnN0IE9iamVjdEZpbGUgKlN5bWJvbFJlZjo6Z2V0T2JqZWN0KCkgY29uc3QgeworICBjb25zdCBTeW1ib2xpY0ZpbGUgKk8gPSBCYXNpY1N5bWJvbFJlZjo6Z2V0T2JqZWN0KCk7CisgIHJldHVybiBjYXN0PE9iamVjdEZpbGU+KE8pOworfQorCisvLy8gU2VjdGlvblJlZgoraW5saW5lIFNlY3Rpb25SZWY6OlNlY3Rpb25SZWYoRGF0YVJlZkltcGwgU2VjdGlvblAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmplY3RGaWxlICpPd25lcikKKyAgOiBTZWN0aW9uUGltcGwoU2VjdGlvblApCisgICwgT3duaW5nT2JqZWN0KE93bmVyKSB7fQorCitpbmxpbmUgYm9vbCBTZWN0aW9uUmVmOjpvcGVyYXRvcj09KGNvbnN0IFNlY3Rpb25SZWYgJk90aGVyKSBjb25zdCB7CisgIHJldHVybiBTZWN0aW9uUGltcGwgPT0gT3RoZXIuU2VjdGlvblBpbXBsOworfQorCitpbmxpbmUgYm9vbCBTZWN0aW9uUmVmOjpvcGVyYXRvciE9KGNvbnN0IFNlY3Rpb25SZWYgJk90aGVyKSBjb25zdCB7CisgIHJldHVybiBTZWN0aW9uUGltcGwgIT0gT3RoZXIuU2VjdGlvblBpbXBsOworfQorCitpbmxpbmUgYm9vbCBTZWN0aW9uUmVmOjpvcGVyYXRvcjwoY29uc3QgU2VjdGlvblJlZiAmT3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIFNlY3Rpb25QaW1wbCA8IE90aGVyLlNlY3Rpb25QaW1wbDsKK30KKworaW5saW5lIHZvaWQgU2VjdGlvblJlZjo6bW92ZU5leHQoKSB7CisgIHJldHVybiBPd25pbmdPYmplY3QtPm1vdmVTZWN0aW9uTmV4dChTZWN0aW9uUGltcGwpOworfQorCitpbmxpbmUgc3RkOjplcnJvcl9jb2RlIFNlY3Rpb25SZWY6OmdldE5hbWUoU3RyaW5nUmVmICZSZXN1bHQpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdC0+Z2V0U2VjdGlvbk5hbWUoU2VjdGlvblBpbXBsLCBSZXN1bHQpOworfQorCitpbmxpbmUgdWludDY0X3QgU2VjdGlvblJlZjo6Z2V0QWRkcmVzcygpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdC0+Z2V0U2VjdGlvbkFkZHJlc3MoU2VjdGlvblBpbXBsKTsKK30KKworaW5saW5lIHVpbnQ2NF90IFNlY3Rpb25SZWY6OmdldEluZGV4KCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5nZXRTZWN0aW9uSW5kZXgoU2VjdGlvblBpbXBsKTsKK30KKworaW5saW5lIHVpbnQ2NF90IFNlY3Rpb25SZWY6OmdldFNpemUoKSBjb25zdCB7CisgIHJldHVybiBPd25pbmdPYmplY3QtPmdldFNlY3Rpb25TaXplKFNlY3Rpb25QaW1wbCk7Cit9CisKK2lubGluZSBzdGQ6OmVycm9yX2NvZGUgU2VjdGlvblJlZjo6Z2V0Q29udGVudHMoU3RyaW5nUmVmICZSZXN1bHQpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdC0+Z2V0U2VjdGlvbkNvbnRlbnRzKFNlY3Rpb25QaW1wbCwgUmVzdWx0KTsKK30KKworaW5saW5lIHVpbnQ2NF90IFNlY3Rpb25SZWY6OmdldEFsaWdubWVudCgpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdC0+Z2V0U2VjdGlvbkFsaWdubWVudChTZWN0aW9uUGltcGwpOworfQorCitpbmxpbmUgYm9vbCBTZWN0aW9uUmVmOjppc0NvbXByZXNzZWQoKSBjb25zdCB7CisgIHJldHVybiBPd25pbmdPYmplY3QtPmlzU2VjdGlvbkNvbXByZXNzZWQoU2VjdGlvblBpbXBsKTsKK30KKworaW5saW5lIGJvb2wgU2VjdGlvblJlZjo6aXNUZXh0KCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5pc1NlY3Rpb25UZXh0KFNlY3Rpb25QaW1wbCk7Cit9CisKK2lubGluZSBib29sIFNlY3Rpb25SZWY6OmlzRGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdC0+aXNTZWN0aW9uRGF0YShTZWN0aW9uUGltcGwpOworfQorCitpbmxpbmUgYm9vbCBTZWN0aW9uUmVmOjppc0JTUygpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdC0+aXNTZWN0aW9uQlNTKFNlY3Rpb25QaW1wbCk7Cit9CisKK2lubGluZSBib29sIFNlY3Rpb25SZWY6OmlzVmlydHVhbCgpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdC0+aXNTZWN0aW9uVmlydHVhbChTZWN0aW9uUGltcGwpOworfQorCitpbmxpbmUgYm9vbCBTZWN0aW9uUmVmOjppc0JpdGNvZGUoKSBjb25zdCB7CisgIHJldHVybiBPd25pbmdPYmplY3QtPmlzU2VjdGlvbkJpdGNvZGUoU2VjdGlvblBpbXBsKTsKK30KKworaW5saW5lIGJvb2wgU2VjdGlvblJlZjo6aXNTdHJpcHBlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdC0+aXNTZWN0aW9uU3RyaXBwZWQoU2VjdGlvblBpbXBsKTsKK30KKworaW5saW5lIHJlbG9jYXRpb25faXRlcmF0b3IgU2VjdGlvblJlZjo6cmVsb2NhdGlvbl9iZWdpbigpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdC0+c2VjdGlvbl9yZWxfYmVnaW4oU2VjdGlvblBpbXBsKTsKK30KKworaW5saW5lIHJlbG9jYXRpb25faXRlcmF0b3IgU2VjdGlvblJlZjo6cmVsb2NhdGlvbl9lbmQoKSBjb25zdCB7CisgIHJldHVybiBPd25pbmdPYmplY3QtPnNlY3Rpb25fcmVsX2VuZChTZWN0aW9uUGltcGwpOworfQorCitpbmxpbmUgc2VjdGlvbl9pdGVyYXRvciBTZWN0aW9uUmVmOjpnZXRSZWxvY2F0ZWRTZWN0aW9uKCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5nZXRSZWxvY2F0ZWRTZWN0aW9uKFNlY3Rpb25QaW1wbCk7Cit9CisKK2lubGluZSBEYXRhUmVmSW1wbCBTZWN0aW9uUmVmOjpnZXRSYXdEYXRhUmVmSW1wbCgpIGNvbnN0IHsKKyAgcmV0dXJuIFNlY3Rpb25QaW1wbDsKK30KKworaW5saW5lIGNvbnN0IE9iamVjdEZpbGUgKlNlY3Rpb25SZWY6OmdldE9iamVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdDsKK30KKworLy8vIFJlbG9jYXRpb25SZWYKK2lubGluZSBSZWxvY2F0aW9uUmVmOjpSZWxvY2F0aW9uUmVmKERhdGFSZWZJbXBsIFJlbG9jYXRpb25QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqZWN0RmlsZSAqT3duZXIpCisgIDogUmVsb2NhdGlvblBpbXBsKFJlbG9jYXRpb25QKQorICAsIE93bmluZ09iamVjdChPd25lcikge30KKworaW5saW5lIGJvb2wgUmVsb2NhdGlvblJlZjo6b3BlcmF0b3I9PShjb25zdCBSZWxvY2F0aW9uUmVmICZPdGhlcikgY29uc3QgeworICByZXR1cm4gUmVsb2NhdGlvblBpbXBsID09IE90aGVyLlJlbG9jYXRpb25QaW1wbDsKK30KKworaW5saW5lIHZvaWQgUmVsb2NhdGlvblJlZjo6bW92ZU5leHQoKSB7CisgIHJldHVybiBPd25pbmdPYmplY3QtPm1vdmVSZWxvY2F0aW9uTmV4dChSZWxvY2F0aW9uUGltcGwpOworfQorCitpbmxpbmUgdWludDY0X3QgUmVsb2NhdGlvblJlZjo6Z2V0T2Zmc2V0KCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5nZXRSZWxvY2F0aW9uT2Zmc2V0KFJlbG9jYXRpb25QaW1wbCk7Cit9CisKK2lubGluZSBzeW1ib2xfaXRlcmF0b3IgUmVsb2NhdGlvblJlZjo6Z2V0U3ltYm9sKCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5nZXRSZWxvY2F0aW9uU3ltYm9sKFJlbG9jYXRpb25QaW1wbCk7Cit9CisKK2lubGluZSB1aW50NjRfdCBSZWxvY2F0aW9uUmVmOjpnZXRUeXBlKCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5nZXRSZWxvY2F0aW9uVHlwZShSZWxvY2F0aW9uUGltcGwpOworfQorCitpbmxpbmUgdm9pZCBSZWxvY2F0aW9uUmVmOjpnZXRUeXBlTmFtZShTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlJlc3VsdCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5nZXRSZWxvY2F0aW9uVHlwZU5hbWUoUmVsb2NhdGlvblBpbXBsLCBSZXN1bHQpOworfQorCitpbmxpbmUgRGF0YVJlZkltcGwgUmVsb2NhdGlvblJlZjo6Z2V0UmF3RGF0YVJlZkltcGwoKSBjb25zdCB7CisgIHJldHVybiBSZWxvY2F0aW9uUGltcGw7Cit9CisKK2lubGluZSBjb25zdCBPYmplY3RGaWxlICpSZWxvY2F0aW9uUmVmOjpnZXRPYmplY3QoKSBjb25zdCB7CisgIHJldHVybiBPd25pbmdPYmplY3Q7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvYmplY3QKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT0JKRUNUX09CSkVDVEZJTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvUmVsb2NWaXNpdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9SZWxvY1Zpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDBlOTM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvUmVsb2NWaXNpdG9yLmgKQEAgLTAsMCArMSwzMjQgQEAKKy8vPT09LSBSZWxvY1Zpc2l0b3IuaCAtIFZpc2l0b3IgZm9yIG9iamVjdCBmaWxlIHJlbG9jYXRpb25zIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGEgd3JhcHBlciBhcm91bmQgYWxsIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgcmVsb2NhdGlvbnMKKy8vIGluIGRpZmZlcmVudCBmaWxlIGZvcm1hdHMsIHN1Y2ggdGhhdCBhIGNsaWVudCBjYW4gaGFuZGxlIHRoZW0gaW4gYSB1bmlmaWVkCisvLyBtYW5uZXIgYnkgb25seSBpbXBsZW1lbnRpbmcgYSBtaW5pbWFsIG51bWJlciBvZiBmdW5jdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVF9SRUxPQ1ZJU0lUT1JfSAorI2RlZmluZSBMTFZNX09CSkVDVF9SRUxPQ1ZJU0lUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRUxGLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvTWFjaE8uaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9DT0ZGLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvRUxGT2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L01hY2hPLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvT2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9iamVjdCB7CisKKy8vLyBAYnJpZWYgQmFzZSBjbGFzcyBmb3Igb2JqZWN0IGZpbGUgcmVsb2NhdGlvbiB2aXNpdG9ycy4KK2NsYXNzIFJlbG9jVmlzaXRvciB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFJlbG9jVmlzaXRvcihjb25zdCBPYmplY3RGaWxlICZPYmopIDogT2JqVG9WaXNpdChPYmopIHt9CisKKyAgLy8gVE9ETzogU2hvdWxkIGhhbmRsZSBtdWx0aXBsZSBhcHBsaWVkIHJlbG9jYXRpb25zIHZpYSBlaXRoZXIgcGFzc2luZyBpbiB0aGUKKyAgLy8gcHJldmlvdXNseSBjb21wdXRlZCB2YWx1ZSBvciBqdXN0IGNvdW50IHBhaXJlZCByZWxvY2F0aW9ucyBhcyBhIHNpbmdsZQorICAvLyB2aXNpdC4KKyAgdWludDY0X3QgdmlzaXQodWludDMyX3QgUmVsLCBSZWxvY2F0aW9uUmVmIFIsIHVpbnQ2NF90IFZhbHVlID0gMCkgeworICAgIGlmIChpc2E8RUxGT2JqZWN0RmlsZUJhc2U+KE9ialRvVmlzaXQpKQorICAgICAgcmV0dXJuIHZpc2l0RUxGKFJlbCwgUiwgVmFsdWUpOworICAgIGlmIChpc2E8Q09GRk9iamVjdEZpbGU+KE9ialRvVmlzaXQpKQorICAgICAgcmV0dXJuIHZpc2l0Q09GRihSZWwsIFIsIFZhbHVlKTsKKyAgICBpZiAoaXNhPE1hY2hPT2JqZWN0RmlsZT4oT2JqVG9WaXNpdCkpCisgICAgICByZXR1cm4gdmlzaXRNYWNoTyhSZWwsIFIsIFZhbHVlKTsKKworICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGJvb2wgZXJyb3IoKSB7IHJldHVybiBIYXNFcnJvcjsgfQorCitwcml2YXRlOgorICBjb25zdCBPYmplY3RGaWxlICZPYmpUb1Zpc2l0OworICBib29sIEhhc0Vycm9yID0gZmFsc2U7CisKKyAgdWludDY0X3QgdmlzaXRFTEYodWludDMyX3QgUmVsLCBSZWxvY2F0aW9uUmVmIFIsIHVpbnQ2NF90IFZhbHVlKSB7CisgICAgaWYgKE9ialRvVmlzaXQuZ2V0Qnl0ZXNJbkFkZHJlc3MoKSA9PSA4KSB7IC8vIDY0LWJpdCBvYmplY3QgZmlsZQorICAgICAgc3dpdGNoIChPYmpUb1Zpc2l0LmdldEFyY2goKSkgeworICAgICAgY2FzZSBUcmlwbGU6Ong4Nl82NDoKKyAgICAgICAgcmV0dXJuIHZpc2l0WDg2XzY0KFJlbCwgUiwgVmFsdWUpOworICAgICAgY2FzZSBUcmlwbGU6OmFhcmNoNjQ6CisgICAgICBjYXNlIFRyaXBsZTo6YWFyY2g2NF9iZToKKyAgICAgICAgcmV0dXJuIHZpc2l0QWFyY2g2NChSZWwsIFIsIFZhbHVlKTsKKyAgICAgIGNhc2UgVHJpcGxlOjpicGZlbDoKKyAgICAgIGNhc2UgVHJpcGxlOjpicGZlYjoKKyAgICAgICAgcmV0dXJuIHZpc2l0QnBmKFJlbCwgUiwgVmFsdWUpOworICAgICAgY2FzZSBUcmlwbGU6Om1pcHM2NGVsOgorICAgICAgY2FzZSBUcmlwbGU6Om1pcHM2NDoKKyAgICAgICAgcmV0dXJuIHZpc2l0TWlwczY0KFJlbCwgUiwgVmFsdWUpOworICAgICAgY2FzZSBUcmlwbGU6OnBwYzY0bGU6CisgICAgICBjYXNlIFRyaXBsZTo6cHBjNjQ6CisgICAgICAgIHJldHVybiB2aXNpdFBQQzY0KFJlbCwgUiwgVmFsdWUpOworICAgICAgY2FzZSBUcmlwbGU6OnN5c3RlbXo6CisgICAgICAgIHJldHVybiB2aXNpdFN5c3RlbXooUmVsLCBSLCBWYWx1ZSk7CisgICAgICBjYXNlIFRyaXBsZTo6c3BhcmN2OToKKyAgICAgICAgcmV0dXJuIHZpc2l0U3BhcmM2NChSZWwsIFIsIFZhbHVlKTsKKyAgICAgIGNhc2UgVHJpcGxlOjphbWRnY246CisgICAgICAgIHJldHVybiB2aXNpdEFtZGdwdShSZWwsIFIsIFZhbHVlKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorCisgICAgLy8gMzItYml0IG9iamVjdCBmaWxlCisgICAgYXNzZXJ0KE9ialRvVmlzaXQuZ2V0Qnl0ZXNJbkFkZHJlc3MoKSA9PSA0ICYmCisgICAgICAgICAgICJJbnZhbGlkIHdvcmQgc2l6ZSBpbiBvYmplY3QgZmlsZSIpOworCisgICAgc3dpdGNoIChPYmpUb1Zpc2l0LmdldEFyY2goKSkgeworICAgIGNhc2UgVHJpcGxlOjp4ODY6CisgICAgICByZXR1cm4gdmlzaXRYODYoUmVsLCBSLCBWYWx1ZSk7CisgICAgY2FzZSBUcmlwbGU6OnBwYzoKKyAgICAgIHJldHVybiB2aXNpdFBQQzMyKFJlbCwgUiwgVmFsdWUpOworICAgIGNhc2UgVHJpcGxlOjphcm06CisgICAgY2FzZSBUcmlwbGU6OmFybWViOgorICAgICAgcmV0dXJuIHZpc2l0QVJNKFJlbCwgUiwgVmFsdWUpOworICAgIGNhc2UgVHJpcGxlOjpsYW5haToKKyAgICAgIHJldHVybiB2aXNpdExhbmFpKFJlbCwgUiwgVmFsdWUpOworICAgIGNhc2UgVHJpcGxlOjptaXBzZWw6CisgICAgY2FzZSBUcmlwbGU6Om1pcHM6CisgICAgICByZXR1cm4gdmlzaXRNaXBzMzIoUmVsLCBSLCBWYWx1ZSk7CisgICAgY2FzZSBUcmlwbGU6OnNwYXJjOgorICAgICAgcmV0dXJuIHZpc2l0U3BhcmMzMihSZWwsIFIsIFZhbHVlKTsKKyAgICBjYXNlIFRyaXBsZTo6aGV4YWdvbjoKKyAgICAgIHJldHVybiB2aXNpdEhleGFnb24oUmVsLCBSLCBWYWx1ZSk7CisgICAgZGVmYXVsdDoKKyAgICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGludDY0X3QgZ2V0RUxGQWRkZW5kKFJlbG9jYXRpb25SZWYgUikgeworICAgIEV4cGVjdGVkPGludDY0X3Q+IEFkZGVuZE9yRXJyID0gRUxGUmVsb2NhdGlvblJlZihSKS5nZXRBZGRlbmQoKTsKKyAgICBoYW5kbGVBbGxFcnJvcnMoQWRkZW5kT3JFcnIudGFrZUVycm9yKCksIFtdKGNvbnN0IEVycm9ySW5mb0Jhc2UgJkVJKSB7CisgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoRUkubWVzc2FnZSgpKTsKKyAgICB9KTsKKyAgICByZXR1cm4gKkFkZGVuZE9yRXJyOworICB9CisKKyAgdWludDY0X3QgdmlzaXRYODZfNjQodWludDMyX3QgUmVsLCBSZWxvY2F0aW9uUmVmIFIsIHVpbnQ2NF90IFZhbHVlKSB7CisgICAgc3dpdGNoIChSZWwpIHsKKyAgICBjYXNlIEVMRjo6Ul9YODZfNjRfTk9ORToKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgRUxGOjpSX1g4Nl82NF82NDoKKyAgICAgIHJldHVybiBWYWx1ZSArIGdldEVMRkFkZGVuZChSKTsKKyAgICBjYXNlIEVMRjo6Ul9YODZfNjRfUEMzMjoKKyAgICAgIHJldHVybiBWYWx1ZSArIGdldEVMRkFkZGVuZChSKSAtIFIuZ2V0T2Zmc2V0KCk7CisgICAgY2FzZSBFTEY6OlJfWDg2XzY0XzMyOgorICAgIGNhc2UgRUxGOjpSX1g4Nl82NF8zMlM6CisgICAgICByZXR1cm4gKFZhbHVlICsgZ2V0RUxGQWRkZW5kKFIpKSAmIDB4RkZGRkZGRkY7CisgICAgfQorICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHVpbnQ2NF90IHZpc2l0QWFyY2g2NCh1aW50MzJfdCBSZWwsIFJlbG9jYXRpb25SZWYgUiwgdWludDY0X3QgVmFsdWUpIHsKKyAgICBzd2l0Y2ggKFJlbCkgeworICAgIGNhc2UgRUxGOjpSX0FBUkNINjRfQUJTMzI6IHsKKyAgICAgIGludDY0X3QgUmVzID0gVmFsdWUgKyBnZXRFTEZBZGRlbmQoUik7CisgICAgICBpZiAoUmVzIDwgSU5UMzJfTUlOIHx8IFJlcyA+IFVJTlQzMl9NQVgpCisgICAgICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oUmVzKTsKKyAgICB9CisgICAgY2FzZSBFTEY6OlJfQUFSQ0g2NF9BQlM2NDoKKyAgICAgIHJldHVybiBWYWx1ZSArIGdldEVMRkFkZGVuZChSKTsKKyAgICB9CisgICAgSGFzRXJyb3IgPSB0cnVlOworICAgIHJldHVybiAwOworICB9CisKKyAgdWludDY0X3QgdmlzaXRCcGYodWludDMyX3QgUmVsLCBSZWxvY2F0aW9uUmVmIFIsIHVpbnQ2NF90IFZhbHVlKSB7CisgICAgc3dpdGNoIChSZWwpIHsKKyAgICBjYXNlIEVMRjo6Ul9CUEZfNjRfMzI6CisgICAgICByZXR1cm4gVmFsdWUgJiAweEZGRkZGRkZGOworICAgIGNhc2UgRUxGOjpSX0JQRl82NF82NDoKKyAgICAgIHJldHVybiBWYWx1ZTsKKyAgICB9CisgICAgSGFzRXJyb3IgPSB0cnVlOworICAgIHJldHVybiAwOworICB9CisKKyAgdWludDY0X3QgdmlzaXRNaXBzNjQodWludDMyX3QgUmVsLCBSZWxvY2F0aW9uUmVmIFIsIHVpbnQ2NF90IFZhbHVlKSB7CisgICAgc3dpdGNoIChSZWwpIHsKKyAgICBjYXNlIEVMRjo6Ul9NSVBTXzMyOgorICAgICAgcmV0dXJuIChWYWx1ZSArIGdldEVMRkFkZGVuZChSKSkgJiAweEZGRkZGRkZGOworICAgIGNhc2UgRUxGOjpSX01JUFNfNjQ6CisgICAgICByZXR1cm4gVmFsdWUgKyBnZXRFTEZBZGRlbmQoUik7CisgICAgY2FzZSBFTEY6OlJfTUlQU19UTFNfRFRQUkVMNjQ6CisgICAgICByZXR1cm4gVmFsdWUgKyBnZXRFTEZBZGRlbmQoUikgLSAweDgwMDA7CisgICAgfQorICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHVpbnQ2NF90IHZpc2l0UFBDNjQodWludDMyX3QgUmVsLCBSZWxvY2F0aW9uUmVmIFIsIHVpbnQ2NF90IFZhbHVlKSB7CisgICAgc3dpdGNoIChSZWwpIHsKKyAgICBjYXNlIEVMRjo6Ul9QUEM2NF9BRERSMzI6CisgICAgICByZXR1cm4gKFZhbHVlICsgZ2V0RUxGQWRkZW5kKFIpKSAmIDB4RkZGRkZGRkY7CisgICAgY2FzZSBFTEY6OlJfUFBDNjRfQUREUjY0OgorICAgICAgcmV0dXJuIFZhbHVlICsgZ2V0RUxGQWRkZW5kKFIpOworICAgIH0KKyAgICBIYXNFcnJvciA9IHRydWU7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1aW50NjRfdCB2aXNpdFN5c3RlbXoodWludDMyX3QgUmVsLCBSZWxvY2F0aW9uUmVmIFIsIHVpbnQ2NF90IFZhbHVlKSB7CisgICAgc3dpdGNoIChSZWwpIHsKKyAgICBjYXNlIEVMRjo6Ul8zOTBfMzI6IHsKKyAgICAgIGludDY0X3QgUmVzID0gVmFsdWUgKyBnZXRFTEZBZGRlbmQoUik7CisgICAgICBpZiAoUmVzIDwgSU5UMzJfTUlOIHx8IFJlcyA+IFVJTlQzMl9NQVgpCisgICAgICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oUmVzKTsKKyAgICB9CisgICAgY2FzZSBFTEY6OlJfMzkwXzY0OgorICAgICAgcmV0dXJuIFZhbHVlICsgZ2V0RUxGQWRkZW5kKFIpOworICAgIH0KKyAgICBIYXNFcnJvciA9IHRydWU7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1aW50NjRfdCB2aXNpdFNwYXJjNjQodWludDMyX3QgUmVsLCBSZWxvY2F0aW9uUmVmIFIsIHVpbnQ2NF90IFZhbHVlKSB7CisgICAgc3dpdGNoIChSZWwpIHsKKyAgICBjYXNlIEVMRjo6Ul9TUEFSQ18zMjoKKyAgICBjYXNlIEVMRjo6Ul9TUEFSQ182NDoKKyAgICBjYXNlIEVMRjo6Ul9TUEFSQ19VQTMyOgorICAgIGNhc2UgRUxGOjpSX1NQQVJDX1VBNjQ6CisgICAgICByZXR1cm4gVmFsdWUgKyBnZXRFTEZBZGRlbmQoUik7CisgICAgfQorICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHVpbnQ2NF90IHZpc2l0QW1kZ3B1KHVpbnQzMl90IFJlbCwgUmVsb2NhdGlvblJlZiBSLCB1aW50NjRfdCBWYWx1ZSkgeworICAgIHN3aXRjaCAoUmVsKSB7CisgICAgY2FzZSBFTEY6OlJfQU1ER1BVX0FCUzMyOgorICAgIGNhc2UgRUxGOjpSX0FNREdQVV9BQlM2NDoKKyAgICAgIHJldHVybiBWYWx1ZSArIGdldEVMRkFkZGVuZChSKTsKKyAgICB9CisgICAgSGFzRXJyb3IgPSB0cnVlOworICAgIHJldHVybiAwOworICB9CisKKyAgdWludDY0X3QgdmlzaXRYODYodWludDMyX3QgUmVsLCBSZWxvY2F0aW9uUmVmIFIsIHVpbnQ2NF90IFZhbHVlKSB7CisgICAgc3dpdGNoIChSZWwpIHsKKyAgICBjYXNlIEVMRjo6Ul8zODZfTk9ORToKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgRUxGOjpSXzM4Nl8zMjoKKyAgICAgIHJldHVybiBWYWx1ZTsKKyAgICBjYXNlIEVMRjo6Ul8zODZfUEMzMjoKKyAgICAgIHJldHVybiBWYWx1ZSAtIFIuZ2V0T2Zmc2V0KCk7CisgICAgfQorICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHVpbnQ2NF90IHZpc2l0UFBDMzIodWludDMyX3QgUmVsLCBSZWxvY2F0aW9uUmVmIFIsIHVpbnQ2NF90IFZhbHVlKSB7CisgICAgaWYgKFJlbCA9PSBFTEY6OlJfUFBDX0FERFIzMikKKyAgICAgIHJldHVybiAoVmFsdWUgKyBnZXRFTEZBZGRlbmQoUikpICYgMHhGRkZGRkZGRjsKKyAgICBIYXNFcnJvciA9IHRydWU7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1aW50NjRfdCB2aXNpdEFSTSh1aW50MzJfdCBSZWwsIFJlbG9jYXRpb25SZWYgUiwgdWludDY0X3QgVmFsdWUpIHsKKyAgICBpZiAoUmVsID09IEVMRjo6Ul9BUk1fQUJTMzIpIHsKKyAgICAgIGlmICgoaW50NjRfdClWYWx1ZSA8IElOVDMyX01JTiB8fCAoaW50NjRfdClWYWx1ZSA+IFVJTlQzMl9NQVgpCisgICAgICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oVmFsdWUpOworICAgIH0KKyAgICBIYXNFcnJvciA9IHRydWU7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1aW50NjRfdCB2aXNpdExhbmFpKHVpbnQzMl90IFJlbCwgUmVsb2NhdGlvblJlZiBSLCB1aW50NjRfdCBWYWx1ZSkgeworICAgIGlmIChSZWwgPT0gRUxGOjpSX0xBTkFJXzMyKQorICAgICAgcmV0dXJuIChWYWx1ZSArIGdldEVMRkFkZGVuZChSKSkgJiAweEZGRkZGRkZGOworICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHVpbnQ2NF90IHZpc2l0TWlwczMyKHVpbnQzMl90IFJlbCwgUmVsb2NhdGlvblJlZiBSLCB1aW50NjRfdCBWYWx1ZSkgeworICAgIC8vIEZJWE1FOiBUYWtlIGluIGFjY291bnQgaW1wbGljaXQgYWRkZW5kcyB0byBnZXQgY29ycmVjdCByZXN1bHRzLgorICAgIGlmIChSZWwgPT0gRUxGOjpSX01JUFNfMzIpCisgICAgICByZXR1cm4gVmFsdWUgJiAweEZGRkZGRkZGOworICAgIGlmIChSZWwgPT0gRUxGOjpSX01JUFNfVExTX0RUUFJFTDMyKQorICAgICAgcmV0dXJuIFZhbHVlICYgMHhGRkZGRkZGRjsKKyAgICBIYXNFcnJvciA9IHRydWU7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1aW50NjRfdCB2aXNpdFNwYXJjMzIodWludDMyX3QgUmVsLCBSZWxvY2F0aW9uUmVmIFIsIHVpbnQ2NF90IFZhbHVlKSB7CisgICAgaWYgKFJlbCA9PSBFTEY6OlJfU1BBUkNfMzIgfHwgUmVsID09IEVMRjo6Ul9TUEFSQ19VQTMyKQorICAgICAgcmV0dXJuIFZhbHVlICsgZ2V0RUxGQWRkZW5kKFIpOworICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHVpbnQ2NF90IHZpc2l0SGV4YWdvbih1aW50MzJfdCBSZWwsIFJlbG9jYXRpb25SZWYgUiwgdWludDY0X3QgVmFsdWUpIHsKKyAgICBpZiAoUmVsID09IEVMRjo6Ul9IRVhfMzIpCisgICAgICByZXR1cm4gVmFsdWUgKyBnZXRFTEZBZGRlbmQoUik7CisgICAgSGFzRXJyb3IgPSB0cnVlOworICAgIHJldHVybiAwOworICB9CisKKyAgdWludDY0X3QgdmlzaXRDT0ZGKHVpbnQzMl90IFJlbCwgUmVsb2NhdGlvblJlZiBSLCB1aW50NjRfdCBWYWx1ZSkgeworICAgIHN3aXRjaCAoT2JqVG9WaXNpdC5nZXRBcmNoKCkpIHsKKyAgICBjYXNlIFRyaXBsZTo6eDg2OgorICAgICAgc3dpdGNoIChSZWwpIHsKKyAgICAgIGNhc2UgQ09GRjo6SU1BR0VfUkVMX0kzODZfU0VDUkVMOgorICAgICAgY2FzZSBDT0ZGOjpJTUFHRV9SRUxfSTM4Nl9ESVIzMjoKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihWYWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFRyaXBsZTo6eDg2XzY0OgorICAgICAgc3dpdGNoIChSZWwpIHsKKyAgICAgIGNhc2UgQ09GRjo6SU1BR0VfUkVMX0FNRDY0X1NFQ1JFTDoKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihWYWx1ZSk7CisgICAgICBjYXNlIENPRkY6OklNQUdFX1JFTF9BTUQ2NF9BRERSNjQ6CisgICAgICAgIHJldHVybiBWYWx1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgICAgSGFzRXJyb3IgPSB0cnVlOworICAgIHJldHVybiAwOworICB9CisKKyAgdWludDY0X3QgdmlzaXRNYWNoTyh1aW50MzJfdCBSZWwsIFJlbG9jYXRpb25SZWYgUiwgdWludDY0X3QgVmFsdWUpIHsKKyAgICBpZiAoT2JqVG9WaXNpdC5nZXRBcmNoKCkgPT0gVHJpcGxlOjp4ODZfNjQgJiYKKyAgICAgICAgUmVsID09IE1hY2hPOjpYODZfNjRfUkVMT0NfVU5TSUdORUQpCisgICAgICByZXR1cm4gVmFsdWU7CisgICAgSGFzRXJyb3IgPSB0cnVlOworICAgIHJldHVybiAwOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb2JqZWN0Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RfUkVMT0NWSVNJVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L1N0YWNrTWFwUGFyc2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9TdGFja01hcFBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1N2RiNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9TdGFja01hcFBhcnNlci5oCkBAIC0wLDAgKzEsNDM5IEBACisvLz09PS0gU3RhY2tNYXBQYXJzZXIuaCAtIFN0YWNrTWFwIFBhcnNpbmcgU3VwcG9ydCAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TVEFDS01BUFBBUlNFUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9TVEFDS01BUFBBUlNFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW5uZXNzPgorY2xhc3MgU3RhY2tNYXBWMlBhcnNlciB7CitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBY2Nlc3NvclQ+CisgIGNsYXNzIEFjY2Vzc29ySXRlcmF0b3IgeworICBwdWJsaWM6CisgICAgQWNjZXNzb3JJdGVyYXRvcihBY2Nlc3NvclQgQSkgOiBBKEEpIHt9CisKKyAgICBBY2Nlc3Nvckl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyBBID0gQS5uZXh0KCk7IHJldHVybiAqdGhpczsgfQorICAgIEFjY2Vzc29ySXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKKyAgICAgIGF1dG8gdG1wID0gKnRoaXM7CisgICAgICArKyp0aGlzOworICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQWNjZXNzb3JJdGVyYXRvciAmT3RoZXIpIHsKKyAgICAgIHJldHVybiBBLlAgPT0gT3RoZXIuQS5QOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBY2Nlc3Nvckl0ZXJhdG9yICZPdGhlcikgeyByZXR1cm4gISgqdGhpcyA9PSBPdGhlcik7IH0KKworICAgIEFjY2Vzc29yVCYgb3BlcmF0b3IqKCkgeyByZXR1cm4gQTsgfQorICAgIEFjY2Vzc29yVCogb3BlcmF0b3ItPigpIHsgcmV0dXJuICZBOyB9CisKKyAgcHJpdmF0ZToKKyAgICBBY2Nlc3NvclQgQTsKKyAgfTsKKworICAvLy8gQWNjZXNzb3IgZm9yIGZ1bmN0aW9uIHJlY29yZHMuCisgIGNsYXNzIEZ1bmN0aW9uQWNjZXNzb3IgeworICAgIGZyaWVuZCBjbGFzcyBTdGFja01hcFYyUGFyc2VyOworCisgIHB1YmxpYzoKKyAgICAvLy8gR2V0IHRoZSBmdW5jdGlvbiBhZGRyZXNzLgorICAgIHVpbnQ2NF90IGdldEZ1bmN0aW9uQWRkcmVzcygpIGNvbnN0IHsKKyAgICAgIHJldHVybiByZWFkPHVpbnQ2NF90PihQKTsKKyAgICB9CisKKyAgICAvLy8gR2V0IHRoZSBmdW5jdGlvbidzIHN0YWNrIHNpemUuCisgICAgdWludDY0X3QgZ2V0U3RhY2tTaXplKCkgY29uc3QgeworICAgICAgcmV0dXJuIHJlYWQ8dWludDY0X3Q+KFAgKyBzaXplb2YodWludDY0X3QpKTsKKyAgICB9CisKKyAgICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgY2FsbHNpdGUgcmVjb3Jkcy4KKyAgICB1aW50NjRfdCBnZXRSZWNvcmRDb3VudCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiByZWFkPHVpbnQ2NF90PihQICsgKDIgKiBzaXplb2YodWludDY0X3QpKSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgRnVuY3Rpb25BY2Nlc3Nvcihjb25zdCB1aW50OF90ICpQKSA6IFAoUCkge30KKworICAgIGNvbnN0IHN0YXRpYyBpbnQgRnVuY3Rpb25BY2Nlc3NvclNpemUgPSAzICogc2l6ZW9mKHVpbnQ2NF90KTsKKworICAgIEZ1bmN0aW9uQWNjZXNzb3IgbmV4dCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBGdW5jdGlvbkFjY2Vzc29yKFAgKyBGdW5jdGlvbkFjY2Vzc29yU2l6ZSk7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqUDsKKyAgfTsKKworICAvLy8gQWNjZXNzb3IgZm9yIGNvbnN0YW50cy4KKyAgY2xhc3MgQ29uc3RhbnRBY2Nlc3NvciB7CisgICAgZnJpZW5kIGNsYXNzIFN0YWNrTWFwVjJQYXJzZXI7CisKKyAgcHVibGljOgorICAgIC8vLyBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgY29uc3RhbnQuCisgICAgdWludDY0X3QgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiByZWFkPHVpbnQ2NF90PihQKTsgfQorCisgIHByaXZhdGU6CisgICAgQ29uc3RhbnRBY2Nlc3Nvcihjb25zdCB1aW50OF90ICpQKSA6IFAoUCkge30KKworICAgIGNvbnN0IHN0YXRpYyBpbnQgQ29uc3RhbnRBY2Nlc3NvclNpemUgPSBzaXplb2YodWludDY0X3QpOworCisgICAgQ29uc3RhbnRBY2Nlc3NvciBuZXh0KCkgY29uc3QgeworICAgICAgcmV0dXJuIENvbnN0YW50QWNjZXNzb3IoUCArIENvbnN0YW50QWNjZXNzb3JTaXplKTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpQOworICB9OworCisgIGVudW0gY2xhc3MgTG9jYXRpb25LaW5kIDogdWludDhfdCB7CisgICAgUmVnaXN0ZXIgPSAxLCBEaXJlY3QgPSAyLCBJbmRpcmVjdCA9IDMsIENvbnN0YW50ID0gNCwgQ29uc3RhbnRJbmRleCA9IDUKKyAgfTsKKworICAvLy8gQWNjZXNzb3IgZm9yIGxvY2F0aW9uIHJlY29yZHMuCisgIGNsYXNzIExvY2F0aW9uQWNjZXNzb3IgeworICAgIGZyaWVuZCBjbGFzcyBTdGFja01hcFYyUGFyc2VyOworICAgIGZyaWVuZCBjbGFzcyBSZWNvcmRBY2Nlc3NvcjsKKworICBwdWJsaWM6CisgICAgLy8vIEdldCB0aGUgS2luZCBmb3IgdGhpcyBsb2NhdGlvbi4KKyAgICBMb2NhdGlvbktpbmQgZ2V0S2luZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMb2NhdGlvbktpbmQoUFtLaW5kT2Zmc2V0XSk7CisgICAgfQorCisgICAgLy8vIEdldCB0aGUgRHdhcmYgcmVnaXN0ZXIgbnVtYmVyIGZvciB0aGlzIGxvY2F0aW9uLgorICAgIHVpbnQxNl90IGdldER3YXJmUmVnTnVtKCkgY29uc3QgeworICAgICAgcmV0dXJuIHJlYWQ8dWludDE2X3Q+KFAgKyBEd2FyZlJlZ051bU9mZnNldCk7CisgICAgfQorCisgICAgLy8vIEdldCB0aGUgc21hbGwtY29uc3RhbnQgZm9yIHRoaXMgbG9jYXRpb24uIChLaW5kIG11c3QgYmUgQ29uc3RhbnQpLgorICAgIHVpbnQzMl90IGdldFNtYWxsQ29uc3RhbnQoKSBjb25zdCB7CisgICAgICBhc3NlcnQoZ2V0S2luZCgpID09IExvY2F0aW9uS2luZDo6Q29uc3RhbnQgJiYgIk5vdCBhIHNtYWxsIGNvbnN0YW50LiIpOworICAgICAgcmV0dXJuIHJlYWQ8dWludDMyX3Q+KFAgKyBTbWFsbENvbnN0YW50T2Zmc2V0KTsKKyAgICB9CisKKyAgICAvLy8gR2V0IHRoZSBjb25zdGFudC1pbmRleCBmb3IgdGhpcyBsb2NhdGlvbi4gKEtpbmQgbXVzdCBiZSBDb25zdGFudEluZGV4KS4KKyAgICB1aW50MzJfdCBnZXRDb25zdGFudEluZGV4KCkgY29uc3QgeworICAgICAgYXNzZXJ0KGdldEtpbmQoKSA9PSBMb2NhdGlvbktpbmQ6OkNvbnN0YW50SW5kZXggJiYKKyAgICAgICAgICAgICAiTm90IGEgY29uc3RhbnQtaW5kZXguIik7CisgICAgICByZXR1cm4gcmVhZDx1aW50MzJfdD4oUCArIFNtYWxsQ29uc3RhbnRPZmZzZXQpOworICAgIH0KKworICAgIC8vLyBHZXQgdGhlIG9mZnNldCBmb3IgdGhpcyBsb2NhdGlvbi4gKEtpbmQgbXVzdCBiZSBEaXJlY3Qgb3IgSW5kaXJlY3QpLgorICAgIGludDMyX3QgZ2V0T2Zmc2V0KCkgY29uc3QgeworICAgICAgYXNzZXJ0KChnZXRLaW5kKCkgPT0gTG9jYXRpb25LaW5kOjpEaXJlY3QgfHwKKyAgICAgICAgICAgICAgZ2V0S2luZCgpID09IExvY2F0aW9uS2luZDo6SW5kaXJlY3QpICYmCisgICAgICAgICAgICAgIk5vdCBkaXJlY3Qgb3IgaW5kaXJlY3QuIik7CisgICAgICByZXR1cm4gcmVhZDxpbnQzMl90PihQICsgU21hbGxDb25zdGFudE9mZnNldCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgTG9jYXRpb25BY2Nlc3Nvcihjb25zdCB1aW50OF90ICpQKSA6IFAoUCkge30KKworICAgIExvY2F0aW9uQWNjZXNzb3IgbmV4dCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMb2NhdGlvbkFjY2Vzc29yKFAgKyBMb2NhdGlvbkFjY2Vzc29yU2l6ZSk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IGludCBLaW5kT2Zmc2V0ID0gMDsKKyAgICBzdGF0aWMgY29uc3QgaW50IER3YXJmUmVnTnVtT2Zmc2V0ID0gS2luZE9mZnNldCArIHNpemVvZih1aW50MTZfdCk7CisgICAgc3RhdGljIGNvbnN0IGludCBTbWFsbENvbnN0YW50T2Zmc2V0ID0gRHdhcmZSZWdOdW1PZmZzZXQgKyBzaXplb2YodWludDE2X3QpOworICAgIHN0YXRpYyBjb25zdCBpbnQgTG9jYXRpb25BY2Nlc3NvclNpemUgPSBzaXplb2YodWludDY0X3QpOworCisgICAgY29uc3QgdWludDhfdCAqUDsKKyAgfTsKKworICAvLy8gQWNjZXNzb3IgZm9yIHN0YWNrbWFwIGxpdmUtb3V0IGZpZWxkcy4KKyAgY2xhc3MgTGl2ZU91dEFjY2Vzc29yIHsKKyAgICBmcmllbmQgY2xhc3MgU3RhY2tNYXBWMlBhcnNlcjsKKyAgICBmcmllbmQgY2xhc3MgUmVjb3JkQWNjZXNzb3I7CisKKyAgcHVibGljOgorICAgIC8vLyBHZXQgdGhlIER3YXJmIHJlZ2lzdGVyIG51bWJlciBmb3IgdGhpcyBsaXZlLW91dC4KKyAgICB1aW50MTZfdCBnZXREd2FyZlJlZ051bSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiByZWFkPHVpbnQxNl90PihQICsgRHdhcmZSZWdOdW1PZmZzZXQpOworICAgIH0KKworICAgIC8vLyBHZXQgdGhlIHNpemUgaW4gYnl0ZXMgb2YgbGl2ZSBbc3ViXXJlZ2lzdGVyLgorICAgIHVuc2lnbmVkIGdldFNpemVJbkJ5dGVzKCkgY29uc3QgeworICAgICAgcmV0dXJuIHJlYWQ8dWludDhfdD4oUCArIFNpemVPZmZzZXQpOworICAgIH0KKworICBwcml2YXRlOgorICAgIExpdmVPdXRBY2Nlc3Nvcihjb25zdCB1aW50OF90ICpQKSA6IFAoUCkge30KKworICAgIExpdmVPdXRBY2Nlc3NvciBuZXh0KCkgY29uc3QgeworICAgICAgcmV0dXJuIExpdmVPdXRBY2Nlc3NvcihQICsgTGl2ZU91dEFjY2Vzc29yU2l6ZSk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IGludCBEd2FyZlJlZ051bU9mZnNldCA9IDA7CisgICAgc3RhdGljIGNvbnN0IGludCBTaXplT2Zmc2V0ID0KKyAgICAgIER3YXJmUmVnTnVtT2Zmc2V0ICsgc2l6ZW9mKHVpbnQxNl90KSArIHNpemVvZih1aW50OF90KTsKKyAgICBzdGF0aWMgY29uc3QgaW50IExpdmVPdXRBY2Nlc3NvclNpemUgPSBzaXplb2YodWludDMyX3QpOworCisgICAgY29uc3QgdWludDhfdCAqUDsKKyAgfTsKKworICAvLy8gQWNjZXNzb3IgZm9yIHN0YWNrbWFwIHJlY29yZHMuCisgIGNsYXNzIFJlY29yZEFjY2Vzc29yIHsKKyAgICBmcmllbmQgY2xhc3MgU3RhY2tNYXBWMlBhcnNlcjsKKworICBwdWJsaWM6CisgICAgdXNpbmcgbG9jYXRpb25faXRlcmF0b3IgPSBBY2Nlc3Nvckl0ZXJhdG9yPExvY2F0aW9uQWNjZXNzb3I+OworICAgIHVzaW5nIGxpdmVvdXRfaXRlcmF0b3IgPSBBY2Nlc3Nvckl0ZXJhdG9yPExpdmVPdXRBY2Nlc3Nvcj47CisKKyAgICAvLy8gR2V0IHRoZSBwYXRjaHBvaW50L3N0YWNrbWFwIElEIGZvciB0aGlzIHJlY29yZC4KKyAgICB1aW50NjRfdCBnZXRJRCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiByZWFkPHVpbnQ2NF90PihQICsgUGF0Y2hwb2ludElET2Zmc2V0KTsKKyAgICB9CisKKyAgICAvLy8gR2V0IHRoZSBpbnN0cnVjdGlvbiBvZmZzZXQgKGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBjb250YWluaW5nIGZ1bmN0aW9uKQorICAgIC8vLyBmb3IgdGhpcyByZWNvcmQuCisgICAgdWludDMyX3QgZ2V0SW5zdHJ1Y3Rpb25PZmZzZXQoKSBjb25zdCB7CisgICAgICByZXR1cm4gcmVhZDx1aW50MzJfdD4oUCArIEluc3RydWN0aW9uT2Zmc2V0T2Zmc2V0KTsKKyAgICB9CisKKyAgICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgbG9jYXRpb25zIGNvbnRhaW5lZCBpbiB0aGlzIHJlY29yZC4KKyAgICB1aW50MTZfdCBnZXROdW1Mb2NhdGlvbnMoKSBjb25zdCB7CisgICAgICByZXR1cm4gcmVhZDx1aW50MTZfdD4oUCArIE51bUxvY2F0aW9uc09mZnNldCk7CisgICAgfQorCisgICAgLy8vIEdldCB0aGUgbG9jYXRpb24gd2l0aCB0aGUgZ2l2ZW4gaW5kZXguCisgICAgTG9jYXRpb25BY2Nlc3NvciBnZXRMb2NhdGlvbih1bnNpZ25lZCBMb2NhdGlvbkluZGV4KSBjb25zdCB7CisgICAgICB1bnNpZ25lZCBMb2NhdGlvbk9mZnNldCA9CisgICAgICAgIExvY2F0aW9uTGlzdE9mZnNldCArIExvY2F0aW9uSW5kZXggKiBMb2NhdGlvblNpemU7CisgICAgICByZXR1cm4gTG9jYXRpb25BY2Nlc3NvcihQICsgTG9jYXRpb25PZmZzZXQpOworICAgIH0KKworICAgIC8vLyBCZWdpbiBpdGVyYXRvciBmb3IgbG9jYXRpb25zLgorICAgIGxvY2F0aW9uX2l0ZXJhdG9yIGxvY2F0aW9uX2JlZ2luKCkgY29uc3QgeworICAgICAgcmV0dXJuIGxvY2F0aW9uX2l0ZXJhdG9yKGdldExvY2F0aW9uKDApKTsKKyAgICB9CisKKyAgICAvLy8gRW5kIGl0ZXJhdG9yIGZvciBsb2NhdGlvbnMuCisgICAgbG9jYXRpb25faXRlcmF0b3IgbG9jYXRpb25fZW5kKCkgY29uc3QgeworICAgICAgcmV0dXJuIGxvY2F0aW9uX2l0ZXJhdG9yKGdldExvY2F0aW9uKGdldE51bUxvY2F0aW9ucygpKSk7CisgICAgfQorCisgICAgLy8vIEl0ZXJhdG9yIHJhbmdlIGZvciBsb2NhdGlvbnMuCisgICAgaXRlcmF0b3JfcmFuZ2U8bG9jYXRpb25faXRlcmF0b3I+IGxvY2F0aW9ucygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBtYWtlX3JhbmdlKGxvY2F0aW9uX2JlZ2luKCksIGxvY2F0aW9uX2VuZCgpKTsKKyAgICB9CisKKyAgICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgbGl2ZW91dHMgY29udGFpbmVkIGluIHRoaXMgcmVjb3JkLgorICAgIHVpbnQxNl90IGdldE51bUxpdmVPdXRzKCkgY29uc3QgeworICAgICAgcmV0dXJuIHJlYWQ8dWludDE2X3Q+KFAgKyBnZXROdW1MaXZlT3V0c09mZnNldCgpKTsKKyAgICB9CisKKyAgICAvLy8gR2V0IHRoZSBsaXZlLW91dCB3aXRoIHRoZSBnaXZlbiBpbmRleC4KKyAgICBMaXZlT3V0QWNjZXNzb3IgZ2V0TGl2ZU91dCh1bnNpZ25lZCBMaXZlT3V0SW5kZXgpIGNvbnN0IHsKKyAgICAgIHVuc2lnbmVkIExpdmVPdXRPZmZzZXQgPQorICAgICAgICBnZXROdW1MaXZlT3V0c09mZnNldCgpICsgc2l6ZW9mKHVpbnQxNl90KSArIExpdmVPdXRJbmRleCAqIExpdmVPdXRTaXplOworICAgICAgcmV0dXJuIExpdmVPdXRBY2Nlc3NvcihQICsgTGl2ZU91dE9mZnNldCk7CisgICAgfQorCisgICAgLy8vIEJlZ2luIGl0ZXJhdG9yIGZvciBsaXZlLW91dHMuCisgICAgbGl2ZW91dF9pdGVyYXRvciBsaXZlb3V0c19iZWdpbigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBsaXZlb3V0X2l0ZXJhdG9yKGdldExpdmVPdXQoMCkpOworICAgIH0KKworICAgIC8vLyBFbmQgaXRlcmF0b3IgZm9yIGxpdmUtb3V0cy4KKyAgICBsaXZlb3V0X2l0ZXJhdG9yIGxpdmVvdXRzX2VuZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBsaXZlb3V0X2l0ZXJhdG9yKGdldExpdmVPdXQoZ2V0TnVtTGl2ZU91dHMoKSkpOworICAgIH0KKworICAgIC8vLyBJdGVyYXRvciByYW5nZSBmb3IgbGl2ZS1vdXRzLgorICAgIGl0ZXJhdG9yX3JhbmdlPGxpdmVvdXRfaXRlcmF0b3I+IGxpdmVvdXRzKCkgY29uc3QgeworICAgICAgcmV0dXJuIG1ha2VfcmFuZ2UobGl2ZW91dHNfYmVnaW4oKSwgbGl2ZW91dHNfZW5kKCkpOworICAgIH0KKworICBwcml2YXRlOgorICAgIFJlY29yZEFjY2Vzc29yKGNvbnN0IHVpbnQ4X3QgKlApIDogUChQKSB7fQorCisgICAgdW5zaWduZWQgZ2V0TnVtTGl2ZU91dHNPZmZzZXQoKSBjb25zdCB7CisgICAgICByZXR1cm4gTG9jYXRpb25MaXN0T2Zmc2V0ICsgTG9jYXRpb25TaXplICogZ2V0TnVtTG9jYXRpb25zKCkgKworICAgICAgICAgICAgIHNpemVvZih1aW50MTZfdCk7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0U2l6ZUluQnl0ZXMoKSBjb25zdCB7CisgICAgICB1bnNpZ25lZCBSZWNvcmRTaXplID0KKyAgICAgICAgZ2V0TnVtTGl2ZU91dHNPZmZzZXQoKSArIHNpemVvZih1aW50MTZfdCkgKyBnZXROdW1MaXZlT3V0cygpICogTGl2ZU91dFNpemU7CisgICAgICByZXR1cm4gKFJlY29yZFNpemUgKyA3KSAmIH4weDc7CisgICAgfQorCisgICAgUmVjb3JkQWNjZXNzb3IgbmV4dCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBSZWNvcmRBY2Nlc3NvcihQICsgZ2V0U2l6ZUluQnl0ZXMoKSk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFBhdGNocG9pbnRJRE9mZnNldCA9IDA7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEluc3RydWN0aW9uT2Zmc2V0T2Zmc2V0ID0KKyAgICAgIFBhdGNocG9pbnRJRE9mZnNldCArIHNpemVvZih1aW50NjRfdCk7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE51bUxvY2F0aW9uc09mZnNldCA9CisgICAgICBJbnN0cnVjdGlvbk9mZnNldE9mZnNldCArIHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YodWludDE2X3QpOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBMb2NhdGlvbkxpc3RPZmZzZXQgPQorICAgICAgTnVtTG9jYXRpb25zT2Zmc2V0ICsgc2l6ZW9mKHVpbnQxNl90KTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgTG9jYXRpb25TaXplID0gc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgTGl2ZU91dFNpemUgPSBzaXplb2YodWludDMyX3QpOworCisgICAgY29uc3QgdWludDhfdCAqUDsKKyAgfTsKKworICAvLy8gQ29uc3RydWN0IGEgcGFyc2VyIGZvciBhIHZlcnNpb24tMiBzdGFja21hcC4gU3RhY2tNYXAgZGF0YSB3aWxsIGJlIHJlYWQKKyAgLy8vIGZyb20gdGhlIGdpdmVuIGFycmF5LgorICBTdGFja01hcFYyUGFyc2VyKEFycmF5UmVmPHVpbnQ4X3Q+IFN0YWNrTWFwU2VjdGlvbikKKyAgICAgIDogU3RhY2tNYXBTZWN0aW9uKFN0YWNrTWFwU2VjdGlvbikgeworICAgIENvbnN0YW50c0xpc3RPZmZzZXQgPSBGdW5jdGlvbkxpc3RPZmZzZXQgKyBnZXROdW1GdW5jdGlvbnMoKSAqIEZ1bmN0aW9uU2l6ZTsKKworICAgIGFzc2VydChTdGFja01hcFNlY3Rpb25bMF0gPT0gMiAmJgorICAgICAgICAgICAiU3RhY2tNYXBWMlBhcnNlciBjYW4gb25seSBwYXJzZSB2ZXJzaW9uIDIgc3RhY2ttYXBzIik7CisKKyAgICB1bnNpZ25lZCBDdXJyZW50UmVjb3JkT2Zmc2V0ID0KKyAgICAgIENvbnN0YW50c0xpc3RPZmZzZXQgKyBnZXROdW1Db25zdGFudHMoKSAqIENvbnN0YW50U2l6ZTsKKworICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBnZXROdW1SZWNvcmRzKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBTdGFja01hcFJlY29yZE9mZnNldHMucHVzaF9iYWNrKEN1cnJlbnRSZWNvcmRPZmZzZXQpOworICAgICAgQ3VycmVudFJlY29yZE9mZnNldCArPQorICAgICAgICBSZWNvcmRBY2Nlc3NvcigmU3RhY2tNYXBTZWN0aW9uW0N1cnJlbnRSZWNvcmRPZmZzZXRdKS5nZXRTaXplSW5CeXRlcygpOworICAgIH0KKyAgfQorCisgIHVzaW5nIGZ1bmN0aW9uX2l0ZXJhdG9yID0gQWNjZXNzb3JJdGVyYXRvcjxGdW5jdGlvbkFjY2Vzc29yPjsKKyAgdXNpbmcgY29uc3RhbnRfaXRlcmF0b3IgPSBBY2Nlc3Nvckl0ZXJhdG9yPENvbnN0YW50QWNjZXNzb3I+OworICB1c2luZyByZWNvcmRfaXRlcmF0b3IgPSBBY2Nlc3Nvckl0ZXJhdG9yPFJlY29yZEFjY2Vzc29yPjsKKworICAvLy8gR2V0IHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIHN0YWNrbWFwLiAoQWx3YXlzIHJldHVybnMgMikuCisgIHVuc2lnbmVkIGdldFZlcnNpb24oKSBjb25zdCB7IHJldHVybiAyOyB9CisKKyAgLy8vIEdldCB0aGUgbnVtYmVyIG9mIGZ1bmN0aW9ucyBpbiB0aGUgc3RhY2sgbWFwLgorICB1aW50MzJfdCBnZXROdW1GdW5jdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlYWQ8dWludDMyX3Q+KCZTdGFja01hcFNlY3Rpb25bTnVtRnVuY3Rpb25zT2Zmc2V0XSk7CisgIH0KKworICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgbGFyZ2UgY29uc3RhbnRzIGluIHRoZSBzdGFjayBtYXAuCisgIHVpbnQzMl90IGdldE51bUNvbnN0YW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVhZDx1aW50MzJfdD4oJlN0YWNrTWFwU2VjdGlvbltOdW1Db25zdGFudHNPZmZzZXRdKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIG51bWJlciBvZiBzdGFja21hcCByZWNvcmRzIGluIHRoZSBzdGFja21hcC4KKyAgdWludDMyX3QgZ2V0TnVtUmVjb3JkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVhZDx1aW50MzJfdD4oJlN0YWNrTWFwU2VjdGlvbltOdW1SZWNvcmRzT2Zmc2V0XSk7CisgIH0KKworICAvLy8gUmV0dXJuIGFuIEZ1bmN0aW9uQWNjZXNzb3IgZm9yIHRoZSBnaXZlbiBmdW5jdGlvbiBpbmRleC4KKyAgRnVuY3Rpb25BY2Nlc3NvciBnZXRGdW5jdGlvbih1bnNpZ25lZCBGdW5jdGlvbkluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIEZ1bmN0aW9uQWNjZXNzb3IoU3RhY2tNYXBTZWN0aW9uLmRhdGEoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RnVuY3Rpb25PZmZzZXQoRnVuY3Rpb25JbmRleCkpOworICB9CisKKyAgLy8vIEJlZ2luIGl0ZXJhdG9yIGZvciBmdW5jdGlvbnMuCisgIGZ1bmN0aW9uX2l0ZXJhdG9yIGZ1bmN0aW9uc19iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZnVuY3Rpb25faXRlcmF0b3IoZ2V0RnVuY3Rpb24oMCkpOworICB9CisKKyAgLy8vIEVuZCBpdGVyYXRvciBmb3IgZnVuY3Rpb25zLgorICBmdW5jdGlvbl9pdGVyYXRvciBmdW5jdGlvbnNfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBmdW5jdGlvbl9pdGVyYXRvcigKKyAgICAgICAgICAgICBGdW5jdGlvbkFjY2Vzc29yKFN0YWNrTWFwU2VjdGlvbi5kYXRhKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RnVuY3Rpb25PZmZzZXQoZ2V0TnVtRnVuY3Rpb25zKCkpKSk7CisgIH0KKworICAvLy8gSXRlcmF0b3IgcmFuZ2UgZm9yIGZ1bmN0aW9ucy4KKyAgaXRlcmF0b3JfcmFuZ2U8ZnVuY3Rpb25faXRlcmF0b3I+IGZ1bmN0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShmdW5jdGlvbnNfYmVnaW4oKSwgZnVuY3Rpb25zX2VuZCgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGxhcmdlIGNvbnN0YW50IGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgQ29uc3RhbnRBY2Nlc3NvciBnZXRDb25zdGFudCh1bnNpZ25lZCBDb25zdGFudEluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50QWNjZXNzb3IoU3RhY2tNYXBTZWN0aW9uLmRhdGEoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uc3RhbnRPZmZzZXQoQ29uc3RhbnRJbmRleCkpOworICB9CisKKyAgLy8vIEJlZ2luIGl0ZXJhdG9yIGZvciBjb25zdGFudHMuCisgIGNvbnN0YW50X2l0ZXJhdG9yIGNvbnN0YW50c19iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RhbnRfaXRlcmF0b3IoZ2V0Q29uc3RhbnQoMCkpOworICB9CisKKyAgLy8vIEVuZCBpdGVyYXRvciBmb3IgY29uc3RhbnRzLgorICBjb25zdGFudF9pdGVyYXRvciBjb25zdGFudHNfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdGFudF9pdGVyYXRvcigKKyAgICAgICAgICAgICBDb25zdGFudEFjY2Vzc29yKFN0YWNrTWFwU2VjdGlvbi5kYXRhKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uc3RhbnRPZmZzZXQoZ2V0TnVtQ29uc3RhbnRzKCkpKSk7CisgIH0KKworICAvLy8gSXRlcmF0b3IgcmFuZ2UgZm9yIGNvbnN0YW50cy4KKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RhbnRfaXRlcmF0b3I+IGNvbnN0YW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShjb25zdGFudHNfYmVnaW4oKSwgY29uc3RhbnRzX2VuZCgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSBSZWNvcmRBY2Nlc3NvciBmb3IgdGhlIGdpdmVuIHJlY29yZCBpbmRleC4KKyAgUmVjb3JkQWNjZXNzb3IgZ2V0UmVjb3JkKHVuc2lnbmVkIFJlY29yZEluZGV4KSBjb25zdCB7CisgICAgc3RkOjpzaXplX3QgUmVjb3JkT2Zmc2V0ID0gU3RhY2tNYXBSZWNvcmRPZmZzZXRzW1JlY29yZEluZGV4XTsKKyAgICByZXR1cm4gUmVjb3JkQWNjZXNzb3IoU3RhY2tNYXBTZWN0aW9uLmRhdGEoKSArIFJlY29yZE9mZnNldCk7CisgIH0KKworICAvLy8gQmVnaW4gaXRlcmF0b3IgZm9yIHJlY29yZHMuCisgIHJlY29yZF9pdGVyYXRvciByZWNvcmRzX2JlZ2luKCkgY29uc3QgeworICAgIGlmIChnZXROdW1SZWNvcmRzKCkgPT0gMCkKKyAgICAgIHJldHVybiByZWNvcmRfaXRlcmF0b3IoUmVjb3JkQWNjZXNzb3IobnVsbHB0cikpOworICAgIHJldHVybiByZWNvcmRfaXRlcmF0b3IoZ2V0UmVjb3JkKDApKTsKKyAgfQorCisgIC8vLyBFbmQgaXRlcmF0b3IgZm9yIHJlY29yZHMuCisgIHJlY29yZF9pdGVyYXRvciByZWNvcmRzX2VuZCgpIGNvbnN0IHsKKyAgICAvLyBSZWNvcmRzIG5lZWQgdG8gYmUgaGFuZGxlZCBzcGVjaWFsbHksIHNpbmNlIHdlIGNhY2hlIHRoZSBzdGFydCBhZGRyZXNzZXMKKyAgICAvLyBmb3IgdGhlbTogV2UgY2FuJ3QganVzdCBjb21wdXRlIHRoZSAxLXBhc3QtdGhlLWVuZCBhZGRyZXNzLCB3ZSBoYXZlIHRvCisgICAgLy8gbG9vayBhdCB0aGUgbGFzdCByZWNvcmQgYW5kIHVzZSB0aGUgJ25leHQnIG1ldGhvZC4KKyAgICBpZiAoZ2V0TnVtUmVjb3JkcygpID09IDApCisgICAgICByZXR1cm4gcmVjb3JkX2l0ZXJhdG9yKFJlY29yZEFjY2Vzc29yKG51bGxwdHIpKTsKKyAgICByZXR1cm4gcmVjb3JkX2l0ZXJhdG9yKGdldFJlY29yZChnZXROdW1SZWNvcmRzKCkgLSAxKS5uZXh0KCkpOworICB9CisKKyAgLy8vIEl0ZXJhdG9yIHJhbmdlIGZvciByZWNvcmRzLgorICBpdGVyYXRvcl9yYW5nZTxyZWNvcmRfaXRlcmF0b3I+IHJlY29yZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UocmVjb3Jkc19iZWdpbigpLCByZWNvcmRzX2VuZCgpKTsKKyAgfQorCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RhdGljIFQgcmVhZChjb25zdCB1aW50OF90ICpQKSB7CisgICAgcmV0dXJuIHN1cHBvcnQ6OmVuZGlhbjo6cmVhZDxULCBFbmRpYW5uZXNzLCAxPihQKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBIZWFkZXJPZmZzZXQgPSAwOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgTnVtRnVuY3Rpb25zT2Zmc2V0ID0gSGVhZGVyT2Zmc2V0ICsgc2l6ZW9mKHVpbnQzMl90KTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE51bUNvbnN0YW50c09mZnNldCA9IE51bUZ1bmN0aW9uc09mZnNldCArIHNpemVvZih1aW50MzJfdCk7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBOdW1SZWNvcmRzT2Zmc2V0ID0gTnVtQ29uc3RhbnRzT2Zmc2V0ICsgc2l6ZW9mKHVpbnQzMl90KTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEZ1bmN0aW9uTGlzdE9mZnNldCA9IE51bVJlY29yZHNPZmZzZXQgKyBzaXplb2YodWludDMyX3QpOworCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBGdW5jdGlvblNpemUgPSAzICogc2l6ZW9mKHVpbnQ2NF90KTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIENvbnN0YW50U2l6ZSA9IHNpemVvZih1aW50NjRfdCk7CisKKyAgc3RkOjpzaXplX3QgZ2V0RnVuY3Rpb25PZmZzZXQodW5zaWduZWQgRnVuY3Rpb25JbmRleCkgY29uc3QgeworICAgIHJldHVybiBGdW5jdGlvbkxpc3RPZmZzZXQgKyBGdW5jdGlvbkluZGV4ICogRnVuY3Rpb25TaXplOworICB9CisKKyAgc3RkOjpzaXplX3QgZ2V0Q29uc3RhbnRPZmZzZXQodW5zaWduZWQgQ29uc3RhbnRJbmRleCkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudHNMaXN0T2Zmc2V0ICsgQ29uc3RhbnRJbmRleCAqIENvbnN0YW50U2l6ZTsKKyAgfQorCisgIEFycmF5UmVmPHVpbnQ4X3Q+IFN0YWNrTWFwU2VjdGlvbjsKKyAgdW5zaWduZWQgQ29uc3RhbnRzTGlzdE9mZnNldDsKKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IFN0YWNrTWFwUmVjb3JkT2Zmc2V0czsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fU1RBQ0tNQVBQQVJTRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvU3ltYm9sU2l6ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvU3ltYm9sU2l6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMWRjODcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9TeW1ib2xTaXplLmgKQEAgLTAsMCArMSwzNCBAQAorLy89PT0tIFN5bWJvbFNpemUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RfU1lNQk9MU0laRV9ICisjZGVmaW5lIExMVk1fT0JKRUNUX1NZTUJPTFNJWkVfSAorCisjaW5jbHVkZSAibGx2bS9PYmplY3QvT2JqZWN0RmlsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb2JqZWN0IHsKKworc3RydWN0IFN5bUVudHJ5IHsKKyAgc3ltYm9sX2l0ZXJhdG9yIEk7CisgIHVpbnQ2NF90IEFkZHJlc3M7CisgIHVuc2lnbmVkIE51bWJlcjsKKyAgdW5zaWduZWQgU2VjdGlvbklEOworfTsKKworaW50IGNvbXBhcmVBZGRyZXNzKGNvbnN0IFN5bUVudHJ5ICpBLCBjb25zdCBTeW1FbnRyeSAqQik7CisKK3N0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxTeW1ib2xSZWYsIHVpbnQ2NF90Pj4KK2NvbXB1dGVTeW1ib2xTaXplcyhjb25zdCBPYmplY3RGaWxlICZPKTsKKworfQorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L1N5bWJvbGljRmlsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvU3ltYm9saWNGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5NTQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L1N5bWJvbGljRmlsZS5oCkBAIC0wLDAgKzEsMjE2IEBACisvLz09PS0gU3ltYm9saWNGaWxlLmggLSBJbnRlcmZhY2UgdGhhdCBvbmx5IHByb3ZpZGVzIHN5bWJvbHMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgU3ltYm9saWNGaWxlIGludGVyZmFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUX1NZTUJPTElDRklMRV9ICisjZGVmaW5lIExMVk1fT0JKRUNUX1NZTUJPTElDRklMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L01hZ2ljLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvQmluYXJ5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0ZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgPGNpbnR0eXBlcz4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9iamVjdCB7CisKK3VuaW9uIERhdGFSZWZJbXBsIHsKKyAgLy8gVGhpcyBlbnRpcmUgdW5pb24gc2hvdWxkIHByb2JhYmx5IGJlIGEKKyAgLy8gY2hhclttYXgoOCwgc2l6ZW9mKHVpbnRwdHJfdCkpXSBhbmQgcmVxdWlyZSB0aGUgaW1wbCB0byBjYXN0LgorICBzdHJ1Y3QgeworICAgIHVpbnQzMl90IGEsIGI7CisgIH0gZDsKKyAgdWludHB0cl90IHA7CisKKyAgRGF0YVJlZkltcGwoKSB7IHN0ZDo6bWVtc2V0KHRoaXMsIDAsIHNpemVvZihEYXRhUmVmSW1wbCkpOyB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT1N0cmVhbT4KK09TdHJlYW0mIG9wZXJhdG9yPDwoT1N0cmVhbSAmT1MsIGNvbnN0IERhdGFSZWZJbXBsICZEKSB7CisgIE9TIDw8ICIoIiA8PCBmb3JtYXQoIjB4JTA4IiBQUkl4UFRSLCBELnApIDw8ICIgKCIgPDwgZm9ybWF0KCIweCUwOHgiLCBELmQuYSkKKyAgICAgPDwgIiwgIiA8PCBmb3JtYXQoIjB4JTA4eCIsIEQuZC5iKSA8PCAiKSkiOworICByZXR1cm4gT1M7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRGF0YVJlZkltcGwgJmEsIGNvbnN0IERhdGFSZWZJbXBsICZiKSB7CisgIC8vIENoZWNrIGJpdHdpc2UgaWRlbnRpY2FsLiBUaGlzIGlzIHRoZSBvbmx5IGxlZ2FsIHdheSB0byBjb21wYXJlIGEgdW5pb24gdy9vCisgIC8vIGtub3dpbmcgd2hpY2ggbWVtYmVyIGlzIGluIHVzZS4KKyAgcmV0dXJuIHN0ZDo6bWVtY21wKCZhLCAmYiwgc2l6ZW9mKERhdGFSZWZJbXBsKSkgPT0gMDsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBEYXRhUmVmSW1wbCAmYSwgY29uc3QgRGF0YVJlZkltcGwgJmIpIHsKKyAgcmV0dXJuICFvcGVyYXRvcj09KGEsIGIpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRGF0YVJlZkltcGwgJmEsIGNvbnN0IERhdGFSZWZJbXBsICZiKSB7CisgIC8vIENoZWNrIGJpdHdpc2UgaWRlbnRpY2FsLiBUaGlzIGlzIHRoZSBvbmx5IGxlZ2FsIHdheSB0byBjb21wYXJlIGEgdW5pb24gdy9vCisgIC8vIGtub3dpbmcgd2hpY2ggbWVtYmVyIGlzIGluIHVzZS4KKyAgcmV0dXJuIHN0ZDo6bWVtY21wKCZhLCAmYiwgc2l6ZW9mKERhdGFSZWZJbXBsKSkgPCAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgY29udGVudF90eXBlPgorY2xhc3MgY29udGVudF9pdGVyYXRvcgorICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgY29udGVudF90eXBlPiB7CisgIGNvbnRlbnRfdHlwZSBDdXJyZW50OworCitwdWJsaWM6CisgIGNvbnRlbnRfaXRlcmF0b3IoY29udGVudF90eXBlIHN5bWIpIDogQ3VycmVudChzdGQ6Om1vdmUoc3ltYikpIHt9CisKKyAgY29uc3QgY29udGVudF90eXBlICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJkN1cnJlbnQ7IH0KKworICBjb25zdCBjb250ZW50X3R5cGUgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIEN1cnJlbnQ7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgY29udGVudF9pdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3VycmVudCA9PSBvdGhlci5DdXJyZW50OworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNvbnRlbnRfaXRlcmF0b3IgJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICB9CisKKyAgY29udGVudF9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsgLy8gcHJlaW5jcmVtZW50CisgICAgQ3VycmVudC5tb3ZlTmV4dCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorfTsKKworY2xhc3MgU3ltYm9saWNGaWxlOworCisvLy8gVGhpcyBpcyBhIHZhbHVlIHR5cGUgY2xhc3MgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIHN5bWJvbCBpbiB0aGUgbGlzdCBvZgorLy8vIHN5bWJvbHMgaW4gdGhlIG9iamVjdCBmaWxlLgorY2xhc3MgQmFzaWNTeW1ib2xSZWYgeworICBEYXRhUmVmSW1wbCBTeW1ib2xQaW1wbDsKKyAgY29uc3QgU3ltYm9saWNGaWxlICpPd25pbmdPYmplY3QgPSBudWxscHRyOworCitwdWJsaWM6CisgIGVudW0gRmxhZ3MgOiB1bnNpZ25lZCB7CisgICAgU0ZfTm9uZSA9IDAsCisgICAgU0ZfVW5kZWZpbmVkID0gMVUgPDwgMCwgICAgICAvLyBTeW1ib2wgaXMgZGVmaW5lZCBpbiBhbm90aGVyIG9iamVjdCBmaWxlCisgICAgU0ZfR2xvYmFsID0gMVUgPDwgMSwgICAgICAgICAvLyBHbG9iYWwgc3ltYm9sCisgICAgU0ZfV2VhayA9IDFVIDw8IDIsICAgICAgICAgICAvLyBXZWFrIHN5bWJvbAorICAgIFNGX0Fic29sdXRlID0gMVUgPDwgMywgICAgICAgLy8gQWJzb2x1dGUgc3ltYm9sCisgICAgU0ZfQ29tbW9uID0gMVUgPDwgNCwgICAgICAgICAvLyBTeW1ib2wgaGFzIGNvbW1vbiBsaW5rYWdlCisgICAgU0ZfSW5kaXJlY3QgPSAxVSA8PCA1LCAgICAgICAvLyBTeW1ib2wgaXMgYW4gYWxpYXMgdG8gYW5vdGhlciBzeW1ib2wKKyAgICBTRl9FeHBvcnRlZCA9IDFVIDw8IDYsICAgICAgIC8vIFN5bWJvbCBpcyB2aXNpYmxlIHRvIG90aGVyIERTT3MKKyAgICBTRl9Gb3JtYXRTcGVjaWZpYyA9IDFVIDw8IDcsIC8vIFNwZWNpZmljIHRvIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChlLmcuIHNlY3Rpb24gc3ltYm9scykKKyAgICBTRl9UaHVtYiA9IDFVIDw8IDgsICAgICAgICAgIC8vIFRodW1iIHN5bWJvbCBpbiBhIDMyLWJpdCBBUk0gYmluYXJ5CisgICAgU0ZfSGlkZGVuID0gMVUgPDwgOSwgICAgICAgICAvLyBTeW1ib2wgaGFzIGhpZGRlbiB2aXNpYmlsaXR5CisgICAgU0ZfQ29uc3QgPSAxVSA8PCAxMCwgICAgICAgICAvLyBTeW1ib2wgdmFsdWUgaXMgY29uc3RhbnQKKyAgICBTRl9FeGVjdXRhYmxlID0gMVUgPDwgMTEsICAgIC8vIFN5bWJvbCBwb2ludHMgdG8gYW4gZXhlY3V0YWJsZSBzZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoSVIgb25seSkKKyAgfTsKKworICBCYXNpY1N5bWJvbFJlZigpID0gZGVmYXVsdDsKKyAgQmFzaWNTeW1ib2xSZWYoRGF0YVJlZkltcGwgU3ltYm9sUCwgY29uc3QgU3ltYm9saWNGaWxlICpPd25lcik7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEJhc2ljU3ltYm9sUmVmICZPdGhlcikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEJhc2ljU3ltYm9sUmVmICZPdGhlcikgY29uc3Q7CisKKyAgdm9pZCBtb3ZlTmV4dCgpOworCisgIHN0ZDo6ZXJyb3JfY29kZSBwcmludE5hbWUocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gR2V0IHN5bWJvbCBmbGFncyAoYml0d2lzZSBPUiBvZiBTeW1ib2xSZWY6OkZsYWdzKQorICB1aW50MzJfdCBnZXRGbGFncygpIGNvbnN0OworCisgIERhdGFSZWZJbXBsIGdldFJhd0RhdGFSZWZJbXBsKCkgY29uc3Q7CisgIGNvbnN0IFN5bWJvbGljRmlsZSAqZ2V0T2JqZWN0KCkgY29uc3Q7Cit9OworCit1c2luZyBiYXNpY19zeW1ib2xfaXRlcmF0b3IgPSBjb250ZW50X2l0ZXJhdG9yPEJhc2ljU3ltYm9sUmVmPjsKKworY2xhc3MgU3ltYm9saWNGaWxlIDogcHVibGljIEJpbmFyeSB7CitwdWJsaWM6CisgIFN5bWJvbGljRmlsZSh1bnNpZ25lZCBpbnQgVHlwZSwgTWVtb3J5QnVmZmVyUmVmIFNvdXJjZSk7CisgIH5TeW1ib2xpY0ZpbGUoKSBvdmVycmlkZTsKKworICAvLyB2aXJ0dWFsIGludGVyZmFjZS4KKyAgdmlydHVhbCB2b2lkIG1vdmVTeW1ib2xOZXh0KERhdGFSZWZJbXBsICZTeW1iKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBzdGQ6OmVycm9yX2NvZGUgcHJpbnRTeW1ib2xOYW1lKHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IGdldFN5bWJvbEZsYWdzKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIGJhc2ljX3N5bWJvbF9pdGVyYXRvciBzeW1ib2xfYmVnaW4oKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBiYXNpY19zeW1ib2xfaXRlcmF0b3Igc3ltYm9sX2VuZCgpIGNvbnN0ID0gMDsKKworICAvLyBjb252ZW5pZW5jZSB3cmFwcGVycy4KKyAgdXNpbmcgYmFzaWNfc3ltYm9sX2l0ZXJhdG9yX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8YmFzaWNfc3ltYm9sX2l0ZXJhdG9yPjsKKyAgYmFzaWNfc3ltYm9sX2l0ZXJhdG9yX3JhbmdlIHN5bWJvbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGJhc2ljX3N5bWJvbF9pdGVyYXRvcl9yYW5nZShzeW1ib2xfYmVnaW4oKSwgc3ltYm9sX2VuZCgpKTsKKyAgfQorCisgIC8vIGNvbnN0cnVjdGlvbiBhdXguCisgIHN0YXRpYyBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8U3ltYm9saWNGaWxlPj4KKyAgY3JlYXRlU3ltYm9saWNGaWxlKE1lbW9yeUJ1ZmZlclJlZiBPYmplY3QsIGxsdm06OmZpbGVfbWFnaWMgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICpDb250ZXh0KTsKKworICBzdGF0aWMgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPFN5bWJvbGljRmlsZT4+CisgIGNyZWF0ZVN5bWJvbGljRmlsZShNZW1vcnlCdWZmZXJSZWYgT2JqZWN0KSB7CisgICAgcmV0dXJuIGNyZWF0ZVN5bWJvbGljRmlsZShPYmplY3QsIGxsdm06OmZpbGVfbWFnaWM6OnVua25vd24sIG51bGxwdHIpOworICB9CisgIHN0YXRpYyBFeHBlY3RlZDxPd25pbmdCaW5hcnk8U3ltYm9saWNGaWxlPj4KKyAgY3JlYXRlU3ltYm9saWNGaWxlKFN0cmluZ1JlZiBPYmplY3RQYXRoKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEJpbmFyeSAqdikgeworICAgIHJldHVybiB2LT5pc1N5bWJvbGljKCk7CisgIH0KK307CisKK2lubGluZSBCYXNpY1N5bWJvbFJlZjo6QmFzaWNTeW1ib2xSZWYoRGF0YVJlZkltcGwgU3ltYm9sUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ltYm9saWNGaWxlICpPd25lcikKKyAgICA6IFN5bWJvbFBpbXBsKFN5bWJvbFApLCBPd25pbmdPYmplY3QoT3duZXIpIHt9CisKK2lubGluZSBib29sIEJhc2ljU3ltYm9sUmVmOjpvcGVyYXRvcj09KGNvbnN0IEJhc2ljU3ltYm9sUmVmICZPdGhlcikgY29uc3QgeworICByZXR1cm4gU3ltYm9sUGltcGwgPT0gT3RoZXIuU3ltYm9sUGltcGw7Cit9CisKK2lubGluZSBib29sIEJhc2ljU3ltYm9sUmVmOjpvcGVyYXRvcjwoY29uc3QgQmFzaWNTeW1ib2xSZWYgJk90aGVyKSBjb25zdCB7CisgIHJldHVybiBTeW1ib2xQaW1wbCA8IE90aGVyLlN5bWJvbFBpbXBsOworfQorCitpbmxpbmUgdm9pZCBCYXNpY1N5bWJvbFJlZjo6bW92ZU5leHQoKSB7CisgIHJldHVybiBPd25pbmdPYmplY3QtPm1vdmVTeW1ib2xOZXh0KFN5bWJvbFBpbXBsKTsKK30KKworaW5saW5lIHN0ZDo6ZXJyb3JfY29kZSBCYXNpY1N5bWJvbFJlZjo6cHJpbnROYW1lKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5wcmludFN5bWJvbE5hbWUoT1MsIFN5bWJvbFBpbXBsKTsKK30KKworaW5saW5lIHVpbnQzMl90IEJhc2ljU3ltYm9sUmVmOjpnZXRGbGFncygpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdC0+Z2V0U3ltYm9sRmxhZ3MoU3ltYm9sUGltcGwpOworfQorCitpbmxpbmUgRGF0YVJlZkltcGwgQmFzaWNTeW1ib2xSZWY6OmdldFJhd0RhdGFSZWZJbXBsKCkgY29uc3QgeworICByZXR1cm4gU3ltYm9sUGltcGw7Cit9CisKK2lubGluZSBjb25zdCBTeW1ib2xpY0ZpbGUgKkJhc2ljU3ltYm9sUmVmOjpnZXRPYmplY3QoKSBjb25zdCB7CisgIHJldHVybiBPd25pbmdPYmplY3Q7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvYmplY3QKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX09CSkVDVF9TWU1CT0xJQ0ZJTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvV2FzbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvV2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OWFjZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9XYXNtLmgKQEAgLTAsMCArMSwyNzggQEAKKy8vPT09LSBXYXNtT2JqZWN0RmlsZS5oIC0gV2FzbSBvYmplY3QgZmlsZSBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBXYXNtT2JqZWN0RmlsZSBjbGFzcywgd2hpY2ggaW1wbGVtZW50cyB0aGUgT2JqZWN0RmlsZQorLy8gaW50ZXJmYWNlIGZvciBXYXNtIGZpbGVzLgorLy8KKy8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL1dlYkFzc2VtYmx5L2Rlc2lnbi9ibG9iL21hc3Rlci9CaW5hcnlFbmNvZGluZy5tZAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RfV0FTTV9ICisjZGVmaW5lIExMVk1fT0JKRUNUX1dBU01fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9XYXNtLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvQmluYXJ5LmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvT2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb2JqZWN0IHsKKworY2xhc3MgV2FzbVN5bWJvbCB7CitwdWJsaWM6CisgIFdhc21TeW1ib2woY29uc3Qgd2FzbTo6V2FzbVN5bWJvbEluZm8gJkluZm8sCisgICAgICAgICAgICAgY29uc3Qgd2FzbTo6V2FzbVNpZ25hdHVyZSAqRnVuY3Rpb25UeXBlLAorICAgICAgICAgICAgIGNvbnN0IHdhc206Oldhc21HbG9iYWxUeXBlICpHbG9iYWxUeXBlKQorICAgICAgOiBJbmZvKEluZm8pLCBGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlKSwgR2xvYmFsVHlwZShHbG9iYWxUeXBlKSB7fQorCisgIGNvbnN0IHdhc206Oldhc21TeW1ib2xJbmZvICZJbmZvOworICBjb25zdCB3YXNtOjpXYXNtU2lnbmF0dXJlICpGdW5jdGlvblR5cGU7CisgIGNvbnN0IHdhc206Oldhc21HbG9iYWxUeXBlICpHbG9iYWxUeXBlOworCisgIGJvb2wgaXNUeXBlRnVuY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIEluZm8uS2luZCA9PSB3YXNtOjpXQVNNX1NZTUJPTF9UWVBFX0ZVTkNUSU9OOworICB9CisKKyAgYm9vbCBpc1R5cGVEYXRhKCkgY29uc3QgeyByZXR1cm4gSW5mby5LaW5kID09IHdhc206OldBU01fU1lNQk9MX1RZUEVfREFUQTsgfQorCisgIGJvb2wgaXNUeXBlR2xvYmFsKCkgY29uc3QgeworICAgIHJldHVybiBJbmZvLktpbmQgPT0gd2FzbTo6V0FTTV9TWU1CT0xfVFlQRV9HTE9CQUw7CisgIH0KKworICBib29sIGlzRGVmaW5lZCgpIGNvbnN0IHsgcmV0dXJuICFpc1VuZGVmaW5lZCgpOyB9CisKKyAgYm9vbCBpc1VuZGVmaW5lZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKEluZm8uRmxhZ3MgJiB3YXNtOjpXQVNNX1NZTUJPTF9VTkRFRklORUQpICE9IDA7CisgIH0KKworICBib29sIGlzQmluZGluZ1dlYWsoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEJpbmRpbmcoKSA9PSB3YXNtOjpXQVNNX1NZTUJPTF9CSU5ESU5HX1dFQUs7CisgIH0KKworICBib29sIGlzQmluZGluZ0dsb2JhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QmluZGluZygpID09IHdhc206OldBU01fU1lNQk9MX0JJTkRJTkdfR0xPQkFMOworICB9CisKKyAgYm9vbCBpc0JpbmRpbmdMb2NhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QmluZGluZygpID09IHdhc206OldBU01fU1lNQk9MX0JJTkRJTkdfTE9DQUw7CisgIH0KKworICB1bnNpZ25lZCBnZXRCaW5kaW5nKCkgY29uc3QgeworICAgIHJldHVybiBJbmZvLkZsYWdzICYgd2FzbTo6V0FTTV9TWU1CT0xfQklORElOR19NQVNLOworICB9CisKKyAgYm9vbCBpc0hpZGRlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmlzaWJpbGl0eSgpID09IHdhc206OldBU01fU1lNQk9MX1ZJU0lCSUxJVFlfSElEREVOOworICB9CisKKyAgdW5zaWduZWQgZ2V0VmlzaWJpbGl0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5mby5GbGFncyAmIHdhc206OldBU01fU1lNQk9MX1ZJU0lCSUxJVFlfTUFTSzsKKyAgfQorCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk91dCkgY29uc3QgeworICAgIE91dCA8PCAiTmFtZT0iIDw8IEluZm8uTmFtZSA8PCAiLCBLaW5kPSIgPDwgSW5mby5LaW5kCisgICAgICAgIDw8ICIsIEZsYWdzPSIgPDwgSW5mby5GbGFnczsKKyAgICBpZiAoIWlzVHlwZURhdGEoKSkgeworICAgICAgT3V0IDw8ICIsIEVsZW1JbmRleD0iIDw8IEluZm8uRWxlbWVudEluZGV4OworICAgIH0gZWxzZSBpZiAoaXNEZWZpbmVkKCkpIHsKKyAgICAgIE91dCA8PCAiLCBTZWdtZW50PSIgPDwgSW5mby5EYXRhUmVmLlNlZ21lbnQ7CisgICAgICBPdXQgPDwgIiwgT2Zmc2V0PSIgPDwgSW5mby5EYXRhUmVmLk9mZnNldDsKKyAgICAgIE91dCA8PCAiLCBTaXplPSIgPDwgSW5mby5EYXRhUmVmLlNpemU7CisgICAgfQorICB9CisKKyNpZiAhZGVmaW5lZChOREVCVUcpIHx8IGRlZmluZWQoTExWTV9FTkFCTEVfRFVNUCkKKyAgTExWTV9EVU1QX01FVEhPRCB2b2lkIGR1bXAoKSBjb25zdCB7IHByaW50KGRiZ3MoKSk7IH0KKyNlbmRpZgorfTsKKworc3RydWN0IFdhc21TZWN0aW9uIHsKKyAgV2FzbVNlY3Rpb24oKSA9IGRlZmF1bHQ7CisKKyAgdWludDMyX3QgVHlwZSA9IDA7IC8vIFNlY3Rpb24gdHlwZSAoU2VlIGJlbG93KQorICB1aW50MzJfdCBPZmZzZXQgPSAwOyAvLyBPZmZzZXQgd2l0aCBpbiB0aGUgZmlsZQorICBTdHJpbmdSZWYgTmFtZTsgLy8gU2VjdGlvbiBuYW1lIChVc2VyLWRlZmluZWQgc2VjdGlvbnMgb25seSkKKyAgQXJyYXlSZWY8dWludDhfdD4gQ29udGVudDsgLy8gU2VjdGlvbiBjb250ZW50CisgIHN0ZDo6dmVjdG9yPHdhc206Oldhc21SZWxvY2F0aW9uPiBSZWxvY2F0aW9uczsgLy8gUmVsb2NhdGlvbnMgZm9yIHRoaXMgc2VjdGlvbgorfTsKKworc3RydWN0IFdhc21TZWdtZW50IHsKKyAgdWludDMyX3QgU2VjdGlvbk9mZnNldDsKKyAgd2FzbTo6V2FzbURhdGFTZWdtZW50IERhdGE7Cit9OworCitjbGFzcyBXYXNtT2JqZWN0RmlsZSA6IHB1YmxpYyBPYmplY3RGaWxlIHsKKworcHVibGljOgorICBXYXNtT2JqZWN0RmlsZShNZW1vcnlCdWZmZXJSZWYgT2JqZWN0LCBFcnJvciAmRXJyKTsKKworICBjb25zdCB3YXNtOjpXYXNtT2JqZWN0SGVhZGVyICZnZXRIZWFkZXIoKSBjb25zdDsKKyAgY29uc3QgV2FzbVN5bWJvbCAmZ2V0V2FzbVN5bWJvbChjb25zdCBEYXRhUmVmSW1wbCAmU3ltYikgY29uc3Q7CisgIGNvbnN0IFdhc21TeW1ib2wgJmdldFdhc21TeW1ib2woY29uc3QgU3ltYm9sUmVmICZTeW1ib2wpIGNvbnN0OworICBjb25zdCBXYXNtU2VjdGlvbiAmZ2V0V2FzbVNlY3Rpb24oY29uc3QgU2VjdGlvblJlZiAmU2VjdGlvbikgY29uc3Q7CisgIGNvbnN0IHdhc206Oldhc21SZWxvY2F0aW9uICZnZXRXYXNtUmVsb2NhdGlvbihjb25zdCBSZWxvY2F0aW9uUmVmJiBSZWYpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQmluYXJ5ICp2KSB7IHJldHVybiB2LT5pc1dhc20oKTsgfQorCisgIEFycmF5UmVmPHdhc206Oldhc21TaWduYXR1cmU+IHR5cGVzKCkgY29uc3QgeyByZXR1cm4gU2lnbmF0dXJlczsgfQorICBBcnJheVJlZjx1aW50MzJfdD4gZnVuY3Rpb25UeXBlcygpIGNvbnN0IHsgcmV0dXJuIEZ1bmN0aW9uVHlwZXM7IH0KKyAgQXJyYXlSZWY8d2FzbTo6V2FzbUltcG9ydD4gaW1wb3J0cygpIGNvbnN0IHsgcmV0dXJuIEltcG9ydHM7IH0KKyAgQXJyYXlSZWY8d2FzbTo6V2FzbVRhYmxlPiB0YWJsZXMoKSBjb25zdCB7IHJldHVybiBUYWJsZXM7IH0KKyAgQXJyYXlSZWY8d2FzbTo6V2FzbUxpbWl0cz4gbWVtb3JpZXMoKSBjb25zdCB7IHJldHVybiBNZW1vcmllczsgfQorICBBcnJheVJlZjx3YXNtOjpXYXNtR2xvYmFsPiBnbG9iYWxzKCkgY29uc3QgeyByZXR1cm4gR2xvYmFsczsgfQorICBBcnJheVJlZjx3YXNtOjpXYXNtRXhwb3J0PiBleHBvcnRzKCkgY29uc3QgeyByZXR1cm4gRXhwb3J0czsgfQorICBBcnJheVJlZjxXYXNtU3ltYm9sPiBzeW1zKCkgY29uc3QgeyByZXR1cm4gU3ltYm9sczsgfQorICBjb25zdCB3YXNtOjpXYXNtTGlua2luZ0RhdGEmIGxpbmtpbmdEYXRhKCkgY29uc3QgeyByZXR1cm4gTGlua2luZ0RhdGE7IH0KKyAgdWludDMyX3QgZ2V0TnVtYmVyT2ZTeW1ib2xzKCkgY29uc3QgeyByZXR1cm4gU3ltYm9scy5zaXplKCk7IH0KKyAgQXJyYXlSZWY8d2FzbTo6V2FzbUVsZW1TZWdtZW50PiBlbGVtZW50cygpIGNvbnN0IHsgcmV0dXJuIEVsZW1TZWdtZW50czsgfQorICBBcnJheVJlZjxXYXNtU2VnbWVudD4gZGF0YVNlZ21lbnRzKCkgY29uc3QgeyByZXR1cm4gRGF0YVNlZ21lbnRzOyB9CisgIEFycmF5UmVmPHdhc206Oldhc21GdW5jdGlvbj4gZnVuY3Rpb25zKCkgY29uc3QgeyByZXR1cm4gRnVuY3Rpb25zOyB9CisgIEFycmF5UmVmPHdhc206Oldhc21GdW5jdGlvbk5hbWU+IGRlYnVnTmFtZXMoKSBjb25zdCB7IHJldHVybiBEZWJ1Z05hbWVzOyB9CisgIHVpbnQzMl90IHN0YXJ0RnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBTdGFydEZ1bmN0aW9uOyB9CisgIHVpbnQzMl90IGdldE51bUltcG9ydGVkR2xvYmFscygpIGNvbnN0IHsgcmV0dXJuIE51bUltcG9ydGVkR2xvYmFsczsgfQorICB1aW50MzJfdCBnZXROdW1JbXBvcnRlZEZ1bmN0aW9ucygpIGNvbnN0IHsgcmV0dXJuIE51bUltcG9ydGVkRnVuY3Rpb25zOyB9CisKKyAgdm9pZCBtb3ZlU3ltYm9sTmV4dChEYXRhUmVmSW1wbCAmU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdWludDMyX3QgZ2V0U3ltYm9sRmxhZ3MoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYmFzaWNfc3ltYm9sX2l0ZXJhdG9yIHN5bWJvbF9iZWdpbigpIGNvbnN0IG92ZXJyaWRlOworCisgIGJhc2ljX3N5bWJvbF9pdGVyYXRvciBzeW1ib2xfZW5kKCkgY29uc3Qgb3ZlcnJpZGU7CisgIEV4cGVjdGVkPFN0cmluZ1JlZj4gZ2V0U3ltYm9sTmFtZShEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKworICBFeHBlY3RlZDx1aW50NjRfdD4gZ2V0U3ltYm9sQWRkcmVzcyhEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0V2FzbVN5bWJvbFZhbHVlKGNvbnN0IFdhc21TeW1ib2wmIFN5bSkgY29uc3Q7CisgIHVpbnQ2NF90IGdldFN5bWJvbFZhbHVlSW1wbChEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0U3ltYm9sQWxpZ25tZW50KERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRDb21tb25TeW1ib2xTaXplSW1wbChEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgRXhwZWN0ZWQ8U3ltYm9sUmVmOjpUeXBlPiBnZXRTeW1ib2xUeXBlKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICBFeHBlY3RlZDxzZWN0aW9uX2l0ZXJhdG9yPiBnZXRTeW1ib2xTZWN0aW9uKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vIE92ZXJyaWRlcyBmcm9tIFNlY3Rpb25SZWYuCisgIHZvaWQgbW92ZVNlY3Rpb25OZXh0KERhdGFSZWZJbXBsICZTZWMpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OmVycm9yX2NvZGUgZ2V0U2VjdGlvbk5hbWUoRGF0YVJlZkltcGwgU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICZSZXMpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTZWN0aW9uQWRkcmVzcyhEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTZWN0aW9uSW5kZXgoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0U2VjdGlvblNpemUoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjplcnJvcl9jb2RlIGdldFNlY3Rpb25Db250ZW50cyhEYXRhUmVmSW1wbCBTZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICZSZXMpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTZWN0aW9uQWxpZ25tZW50KERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZWN0aW9uQ29tcHJlc3NlZChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2VjdGlvblRleHQoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1NlY3Rpb25EYXRhKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZWN0aW9uQlNTKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZWN0aW9uVmlydHVhbChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2VjdGlvbkJpdGNvZGUoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgcmVsb2NhdGlvbl9pdGVyYXRvciBzZWN0aW9uX3JlbF9iZWdpbihEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICByZWxvY2F0aW9uX2l0ZXJhdG9yIHNlY3Rpb25fcmVsX2VuZChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vIE92ZXJyaWRlcyBmcm9tIFJlbG9jYXRpb25SZWYuCisgIHZvaWQgbW92ZVJlbG9jYXRpb25OZXh0KERhdGFSZWZJbXBsICZSZWwpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRSZWxvY2F0aW9uT2Zmc2V0KERhdGFSZWZJbXBsIFJlbCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN5bWJvbF9pdGVyYXRvciBnZXRSZWxvY2F0aW9uU3ltYm9sKERhdGFSZWZJbXBsIFJlbCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFJlbG9jYXRpb25UeXBlKERhdGFSZWZJbXBsIFJlbCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0UmVsb2NhdGlvblR5cGVOYW1lKERhdGFSZWZJbXBsIFJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZSZXN1bHQpIGNvbnN0IG92ZXJyaWRlOworCisgIHNlY3Rpb25faXRlcmF0b3Igc2VjdGlvbl9iZWdpbigpIGNvbnN0IG92ZXJyaWRlOworICBzZWN0aW9uX2l0ZXJhdG9yIHNlY3Rpb25fZW5kKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ4X3QgZ2V0Qnl0ZXNJbkFkZHJlc3MoKSBjb25zdCBvdmVycmlkZTsKKyAgU3RyaW5nUmVmIGdldEZpbGVGb3JtYXROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFRyaXBsZTo6QXJjaFR5cGUgZ2V0QXJjaCgpIGNvbnN0IG92ZXJyaWRlOworICBTdWJ0YXJnZXRGZWF0dXJlcyBnZXRGZWF0dXJlcygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUmVsb2NhdGFibGVPYmplY3QoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgYm9vbCBpc1ZhbGlkRnVuY3Rpb25JbmRleCh1aW50MzJfdCBJbmRleCkgY29uc3Q7CisgIGJvb2wgaXNEZWZpbmVkRnVuY3Rpb25JbmRleCh1aW50MzJfdCBJbmRleCkgY29uc3Q7CisgIGJvb2wgaXNWYWxpZEdsb2JhbEluZGV4KHVpbnQzMl90IEluZGV4KSBjb25zdDsKKyAgYm9vbCBpc0RlZmluZWRHbG9iYWxJbmRleCh1aW50MzJfdCBJbmRleCkgY29uc3Q7CisgIGJvb2wgaXNWYWxpZEZ1bmN0aW9uU3ltYm9sKHVpbnQzMl90IEluZGV4KSBjb25zdDsKKyAgYm9vbCBpc1ZhbGlkR2xvYmFsU3ltYm9sKHVpbnQzMl90IEluZGV4KSBjb25zdDsKKyAgYm9vbCBpc1ZhbGlkRGF0YVN5bWJvbCh1aW50MzJfdCBJbmRleCkgY29uc3Q7CisgIHdhc206Oldhc21GdW5jdGlvbiAmZ2V0RGVmaW5lZEZ1bmN0aW9uKHVpbnQzMl90IEluZGV4KTsKKyAgd2FzbTo6V2FzbUdsb2JhbCAmZ2V0RGVmaW5lZEdsb2JhbCh1aW50MzJfdCBJbmRleCk7CisKKyAgY29uc3QgV2FzbVNlY3Rpb24gJmdldFdhc21TZWN0aW9uKERhdGFSZWZJbXBsIFJlZikgY29uc3Q7CisgIGNvbnN0IHdhc206Oldhc21SZWxvY2F0aW9uICZnZXRXYXNtUmVsb2NhdGlvbihEYXRhUmVmSW1wbCBSZWYpIGNvbnN0OworCisgIFdhc21TZWN0aW9uKiBmaW5kQ3VzdG9tU2VjdGlvbkJ5TmFtZShTdHJpbmdSZWYgTmFtZSk7CisgIFdhc21TZWN0aW9uKiBmaW5kU2VjdGlvbkJ5VHlwZSh1aW50MzJfdCBUeXBlKTsKKworICBjb25zdCB1aW50OF90ICpnZXRQdHIoc2l6ZV90IE9mZnNldCkgY29uc3Q7CisgIEVycm9yIHBhcnNlU2VjdGlvbihXYXNtU2VjdGlvbiAmU2VjKTsKKyAgRXJyb3IgcGFyc2VDdXN0b21TZWN0aW9uKFdhc21TZWN0aW9uICZTZWMsIGNvbnN0IHVpbnQ4X3QgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKkVuZCk7CisKKyAgLy8gU3RhbmRhcmQgc2VjdGlvbiB0eXBlcworICBFcnJvciBwYXJzZVR5cGVTZWN0aW9uKGNvbnN0IHVpbnQ4X3QgKlB0ciwgY29uc3QgdWludDhfdCAqRW5kKTsKKyAgRXJyb3IgcGFyc2VJbXBvcnRTZWN0aW9uKGNvbnN0IHVpbnQ4X3QgKlB0ciwgY29uc3QgdWludDhfdCAqRW5kKTsKKyAgRXJyb3IgcGFyc2VGdW5jdGlvblNlY3Rpb24oY29uc3QgdWludDhfdCAqUHRyLCBjb25zdCB1aW50OF90ICpFbmQpOworICBFcnJvciBwYXJzZVRhYmxlU2VjdGlvbihjb25zdCB1aW50OF90ICpQdHIsIGNvbnN0IHVpbnQ4X3QgKkVuZCk7CisgIEVycm9yIHBhcnNlTWVtb3J5U2VjdGlvbihjb25zdCB1aW50OF90ICpQdHIsIGNvbnN0IHVpbnQ4X3QgKkVuZCk7CisgIEVycm9yIHBhcnNlR2xvYmFsU2VjdGlvbihjb25zdCB1aW50OF90ICpQdHIsIGNvbnN0IHVpbnQ4X3QgKkVuZCk7CisgIEVycm9yIHBhcnNlRXhwb3J0U2VjdGlvbihjb25zdCB1aW50OF90ICpQdHIsIGNvbnN0IHVpbnQ4X3QgKkVuZCk7CisgIEVycm9yIHBhcnNlU3RhcnRTZWN0aW9uKGNvbnN0IHVpbnQ4X3QgKlB0ciwgY29uc3QgdWludDhfdCAqRW5kKTsKKyAgRXJyb3IgcGFyc2VFbGVtU2VjdGlvbihjb25zdCB1aW50OF90ICpQdHIsIGNvbnN0IHVpbnQ4X3QgKkVuZCk7CisgIEVycm9yIHBhcnNlQ29kZVNlY3Rpb24oY29uc3QgdWludDhfdCAqUHRyLCBjb25zdCB1aW50OF90ICpFbmQpOworICBFcnJvciBwYXJzZURhdGFTZWN0aW9uKGNvbnN0IHVpbnQ4X3QgKlB0ciwgY29uc3QgdWludDhfdCAqRW5kKTsKKworICAvLyBDdXN0b20gc2VjdGlvbiB0eXBlcworICBFcnJvciBwYXJzZU5hbWVTZWN0aW9uKGNvbnN0IHVpbnQ4X3QgKlB0ciwgY29uc3QgdWludDhfdCAqRW5kKTsKKyAgRXJyb3IgcGFyc2VMaW5raW5nU2VjdGlvbihjb25zdCB1aW50OF90ICpQdHIsIGNvbnN0IHVpbnQ4X3QgKkVuZCk7CisgIEVycm9yIHBhcnNlTGlua2luZ1NlY3Rpb25TeW10YWIoY29uc3QgdWludDhfdCAqJlB0ciwgY29uc3QgdWludDhfdCAqRW5kKTsKKyAgRXJyb3IgcGFyc2VMaW5raW5nU2VjdGlvbkNvbWRhdChjb25zdCB1aW50OF90IComUHRyLCBjb25zdCB1aW50OF90ICpFbmQpOworICBFcnJvciBwYXJzZVJlbG9jU2VjdGlvbihTdHJpbmdSZWYgTmFtZSwgY29uc3QgdWludDhfdCAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpFbmQpOworCisgIHdhc206Oldhc21PYmplY3RIZWFkZXIgSGVhZGVyOworICBzdGQ6OnZlY3RvcjxXYXNtU2VjdGlvbj4gU2VjdGlvbnM7CisgIHN0ZDo6dmVjdG9yPHdhc206Oldhc21TaWduYXR1cmU+IFNpZ25hdHVyZXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBGdW5jdGlvblR5cGVzOworICBzdGQ6OnZlY3Rvcjx3YXNtOjpXYXNtVGFibGU+IFRhYmxlczsKKyAgc3RkOjp2ZWN0b3I8d2FzbTo6V2FzbUxpbWl0cz4gTWVtb3JpZXM7CisgIHN0ZDo6dmVjdG9yPHdhc206Oldhc21HbG9iYWw+IEdsb2JhbHM7CisgIHN0ZDo6dmVjdG9yPHdhc206Oldhc21JbXBvcnQ+IEltcG9ydHM7CisgIHN0ZDo6dmVjdG9yPHdhc206Oldhc21FeHBvcnQ+IEV4cG9ydHM7CisgIHN0ZDo6dmVjdG9yPHdhc206Oldhc21FbGVtU2VnbWVudD4gRWxlbVNlZ21lbnRzOworICBzdGQ6OnZlY3RvcjxXYXNtU2VnbWVudD4gRGF0YVNlZ21lbnRzOworICBzdGQ6OnZlY3Rvcjx3YXNtOjpXYXNtRnVuY3Rpb24+IEZ1bmN0aW9uczsKKyAgc3RkOjp2ZWN0b3I8V2FzbVN5bWJvbD4gU3ltYm9sczsKKyAgc3RkOjp2ZWN0b3I8d2FzbTo6V2FzbUZ1bmN0aW9uTmFtZT4gRGVidWdOYW1lczsKKyAgdWludDMyX3QgU3RhcnRGdW5jdGlvbiA9IC0xOworICBib29sIEhhc0xpbmtpbmdTZWN0aW9uID0gZmFsc2U7CisgIHdhc206Oldhc21MaW5raW5nRGF0YSBMaW5raW5nRGF0YTsKKyAgdWludDMyX3QgTnVtSW1wb3J0ZWRHbG9iYWxzID0gMDsKKyAgdWludDMyX3QgTnVtSW1wb3J0ZWRGdW5jdGlvbnMgPSAwOworICB1aW50MzJfdCBDb2RlU2VjdGlvbiA9IDA7CisgIHVpbnQzMl90IERhdGFTZWN0aW9uID0gMDsKKyAgdWludDMyX3QgR2xvYmFsU2VjdGlvbiA9IDA7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb2JqZWN0CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0OjpXYXNtU3ltYm9sICZTeW0pIHsKKyAgU3ltLnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RfV0FTTV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9XYXNtVHJhaXRzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9XYXNtVHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJjZDAwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L1dhc21UcmFpdHMuaApAQCAtMCwwICsxLDYzIEBACisvLz09PS0gV2FzbVRyYWl0cy5oIC0gRGVuc2VNYXAgdHJhaXRzIGZvciB0aGUgV2FzbSBzdHJ1Y3R1cmVzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyBsbHZtOjpEZW5zZU1hcEluZm8gdHJhaXRzIGZvciB0aGUgV2FzbSBzdHJ1Y3R1cmVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RfV0FTTVRSQUlUU19ICisjZGVmaW5lIExMVk1fT0JKRUNUX1dBU01UUkFJVFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvSGFzaGluZy5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L1dhc20uaCIKKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IERlbnNlTWFwSW5mbzsKKworLy8gVHJhaXRzIGZvciB1c2luZyBXYXNtU2lnbmF0dXJlIGluIGEgRGVuc2VNYXAuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPHdhc206Oldhc21TaWduYXR1cmU+IHsKKyAgc3RhdGljIHdhc206Oldhc21TaWduYXR1cmUgZ2V0RW1wdHlLZXkoKSB7CisgICAgcmV0dXJuIHdhc206Oldhc21TaWduYXR1cmV7e30sIDF9OworICB9CisgIHN0YXRpYyB3YXNtOjpXYXNtU2lnbmF0dXJlIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gd2FzbTo6V2FzbVNpZ25hdHVyZXt7fSwgMn07CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCB3YXNtOjpXYXNtU2lnbmF0dXJlICZTaWcpIHsKKyAgICB1bnNpZ25lZCBIID0gaGFzaF92YWx1ZShTaWcuUmV0dXJuVHlwZSk7CisgICAgZm9yIChpbnQzMl90IFBhcmFtIDogU2lnLlBhcmFtVHlwZXMpCisgICAgICBIID0gaGFzaF9jb21iaW5lKEgsIFBhcmFtKTsKKyAgICByZXR1cm4gSDsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IHdhc206Oldhc21TaWduYXR1cmUgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YXNtOjpXYXNtU2lnbmF0dXJlICZSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKworLy8gVHJhaXRzIGZvciB1c2luZyBXYXNtR2xvYmFsVHlwZSBpbiBhIERlbnNlTWFwCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPHdhc206Oldhc21HbG9iYWxUeXBlPiB7CisgIHN0YXRpYyB3YXNtOjpXYXNtR2xvYmFsVHlwZSBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gd2FzbTo6V2FzbUdsb2JhbFR5cGV7MSwgdHJ1ZX07CisgIH0KKyAgc3RhdGljIHdhc206Oldhc21HbG9iYWxUeXBlIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gd2FzbTo6V2FzbUdsb2JhbFR5cGV7MiwgdHJ1ZX07CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCB3YXNtOjpXYXNtR2xvYmFsVHlwZSAmR2xvYmFsVHlwZSkgeworICAgIHJldHVybiBoYXNoX2NvbWJpbmUoR2xvYmFsVHlwZS5UeXBlLCBHbG9iYWxUeXBlLk11dGFibGUpOworICB9CisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3Qgd2FzbTo6V2FzbUdsb2JhbFR5cGUgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YXNtOjpXYXNtR2xvYmFsVHlwZSAmUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX09CSkVDVF9XQVNNVFJBSVRTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L1dpbmRvd3NSZXNvdXJjZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvV2luZG93c1Jlc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3N2M4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L1dpbmRvd3NSZXNvdXJjZS5oCkBAIC0wLDAgKzEsMjI3IEBACisvLz09PS0tIFdpbmRvd3NSZXNvdXJjZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKy0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIC5yZXMgZmlsZSBjbGFzcy4gIC5yZXMgZmlsZXMgYXJlIGludGVybWVkaWF0ZQorLy8gcHJvZHVjdHMgb2YgdGhlIHR5cGljYWwgcmVzb3VyY2UtY29tcGlsYXRpb24gcHJvY2VzcyBvbiBXaW5kb3dzLiAgVGhpcworLy8gcHJvY2VzcyBpcyBhcyBmb2xsb3dzOgorLy8KKy8vIC5yYyBmaWxlKHMpIC0tLShyYy5leGUpLS0tPiAucmVzIGZpbGUocykgLS0tKGN2dHJlcy5leGUpLS0tPiBDT0ZGIGZpbGUKKy8vCisvLyAucmMgZmlsZXMgYXJlIGh1bWFuLXJlYWRhYmxlIHNjcmlwdHMgdGhhdCBsaXN0IGFsbCByZXNvdXJjZXMgYSBwcm9ncmFtIHVzZXMuCisvLworLy8gVGhleSBhcmUgY29tcGlsZWQgaW50byAucmVzIGZpbGVzLCB3aGljaCBhcmUgYSBsaXN0IG9mIHRoZSByZXNvdXJjZXMgaW4KKy8vIGJpbmFyeSBmb3JtLgorLy8KKy8vIEZpbmFsbHkgdGhlIGRhdGEgc3RvcmVkIGluIHRoZSAucmVzIGlzIGNvbXBpbGVkIGludG8gYSBDT0ZGIGZpbGUsIHdoZXJlIGl0CisvLyBpcyBvcmdhbml6ZWQgaW4gYSBkaXJlY3RvcnkgdHJlZSBzdHJ1Y3R1cmUgZm9yIG9wdGltaXplZCBhY2Nlc3MgYnkgdGhlCisvLyBwcm9ncmFtIGR1cmluZyBydW50aW1lLgorLy8KKy8vIFJlZjogbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL21zNjQ4MDA3KHY9dnMuODUpLmFzcHgKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JTkNMVURFX0xMVk1fT0JKRUNUX1JFU0ZJTEVfSAorI2RlZmluZSBMTFZNX0lOQ0xVREVfTExWTV9PQkpFQ1RfUkVTRklMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0NPRkYuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9CaW5hcnkuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlCeXRlU3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlYWRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db252ZXJ0VVRGLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TY29wZWRQcmludGVyLmgiCisKKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvYmplY3QgeworCitjbGFzcyBXaW5kb3dzUmVzb3VyY2U7CisKK2NvbnN0IHNpemVfdCBXSU5fUkVTX01BR0lDX1NJWkUgPSAxNjsKK2NvbnN0IHNpemVfdCBXSU5fUkVTX05VTExfRU5UUllfU0laRSA9IDE2OworY29uc3QgdWludDMyX3QgV0lOX1JFU19IRUFERVJfQUxJR05NRU5UID0gNDsKK2NvbnN0IHVpbnQzMl90IFdJTl9SRVNfREFUQV9BTElHTk1FTlQgPSA0OworY29uc3QgdWludDE2X3QgV0lOX1JFU19QVVJFX01PVkVBQkxFID0gMHgwMDMwOworCitzdHJ1Y3QgV2luUmVzSGVhZGVyUHJlZml4IHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRGF0YVNpemU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEhlYWRlclNpemU7Cit9OworCisvLyBUeXBlIGFuZCBOYW1lIG1heSBlYWNoIGVpdGhlciBiZSBhbiBpbnRlZ2VyIElEIG9yIGEgc3RyaW5nLiAgVGhpcyBzdHJ1Y3QgaXMKKy8vIG9ubHkgdXNlZCBpbiB0aGUgY2FzZSB3aGVyZSB0aGV5IGFyZSBib3RoIElEcy4KK3N0cnVjdCBXaW5SZXNJRHMgeworICB1aW50MTZfdCBUeXBlRmxhZzsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgVHlwZUlEOworICB1aW50MTZfdCBOYW1lRmxhZzsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTmFtZUlEOworCisgIHZvaWQgc2V0VHlwZSh1aW50MTZfdCBJRCkgeworICAgIFR5cGVGbGFnID0gMHhmZmZmOworICAgIFR5cGVJRCA9IElEOworICB9CisKKyAgdm9pZCBzZXROYW1lKHVpbnQxNl90IElEKSB7CisgICAgTmFtZUZsYWcgPSAweGZmZmY7CisgICAgTmFtZUlEID0gSUQ7CisgIH0KK307CisKK3N0cnVjdCBXaW5SZXNIZWFkZXJTdWZmaXggeworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBEYXRhVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWVtb3J5RmxhZ3M7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IExhbmd1YWdlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDaGFyYWN0ZXJpc3RpY3M7Cit9OworCitjbGFzcyBFbXB0eVJlc0Vycm9yIDogcHVibGljIEdlbmVyaWNCaW5hcnlFcnJvciB7CitwdWJsaWM6CisgIEVtcHR5UmVzRXJyb3IoVHdpbmUgTXNnLCBvYmplY3RfZXJyb3IgRUNPdmVycmlkZSkKKyAgICAgIDogR2VuZXJpY0JpbmFyeUVycm9yKE1zZywgRUNPdmVycmlkZSkge30KK307CisKK2NsYXNzIFJlc291cmNlRW50cnlSZWYgeworcHVibGljOgorICBFcnJvciBtb3ZlTmV4dChib29sICZFbmQpOworICBib29sIGNoZWNrVHlwZVN0cmluZygpIGNvbnN0IHsgcmV0dXJuIElzU3RyaW5nVHlwZTsgfQorICBBcnJheVJlZjxVVEYxNj4gZ2V0VHlwZVN0cmluZygpIGNvbnN0IHsgcmV0dXJuIFR5cGU7IH0KKyAgdWludDE2X3QgZ2V0VHlwZUlEKCkgY29uc3QgeyByZXR1cm4gVHlwZUlEOyB9CisgIGJvb2wgY2hlY2tOYW1lU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gSXNTdHJpbmdOYW1lOyB9CisgIEFycmF5UmVmPFVURjE2PiBnZXROYW1lU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorICB1aW50MTZfdCBnZXROYW1lSUQoKSBjb25zdCB7IHJldHVybiBOYW1lSUQ7IH0KKyAgdWludDE2X3QgZ2V0RGF0YVZlcnNpb24oKSBjb25zdCB7IHJldHVybiBTdWZmaXgtPkRhdGFWZXJzaW9uOyB9CisgIHVpbnQxNl90IGdldExhbmd1YWdlKCkgY29uc3QgeyByZXR1cm4gU3VmZml4LT5MYW5ndWFnZTsgfQorICB1aW50MTZfdCBnZXRNZW1vcnlGbGFncygpIGNvbnN0IHsgcmV0dXJuIFN1ZmZpeC0+TWVtb3J5RmxhZ3M7IH0KKyAgdWludDE2X3QgZ2V0TWFqb3JWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gU3VmZml4LT5WZXJzaW9uID4+IDE2OyB9CisgIHVpbnQxNl90IGdldE1pbm9yVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIFN1ZmZpeC0+VmVyc2lvbjsgfQorICB1aW50MzJfdCBnZXRDaGFyYWN0ZXJpc3RpY3MoKSBjb25zdCB7IHJldHVybiBTdWZmaXgtPkNoYXJhY3RlcmlzdGljczsgfQorICBBcnJheVJlZjx1aW50OF90PiBnZXREYXRhKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgV2luZG93c1Jlc291cmNlOworCisgIFJlc291cmNlRW50cnlSZWYoQmluYXJ5U3RyZWFtUmVmIFJlZiwgY29uc3QgV2luZG93c1Jlc291cmNlICpPd25lcik7CisgIEVycm9yIGxvYWROZXh0KCk7CisKKyAgc3RhdGljIEV4cGVjdGVkPFJlc291cmNlRW50cnlSZWY+IGNyZWF0ZShCaW5hcnlTdHJlYW1SZWYgUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpbmRvd3NSZXNvdXJjZSAqT3duZXIpOworCisgIEJpbmFyeVN0cmVhbVJlYWRlciBSZWFkZXI7CisgIGJvb2wgSXNTdHJpbmdUeXBlOworICBBcnJheVJlZjxVVEYxNj4gVHlwZTsKKyAgdWludDE2X3QgVHlwZUlEOworICBib29sIElzU3RyaW5nTmFtZTsKKyAgQXJyYXlSZWY8VVRGMTY+IE5hbWU7CisgIHVpbnQxNl90IE5hbWVJRDsKKyAgY29uc3QgV2luUmVzSGVhZGVyU3VmZml4ICpTdWZmaXggPSBudWxscHRyOworICBBcnJheVJlZjx1aW50OF90PiBEYXRhOworfTsKKworY2xhc3MgV2luZG93c1Jlc291cmNlIDogcHVibGljIEJpbmFyeSB7CitwdWJsaWM6CisgIEV4cGVjdGVkPFJlc291cmNlRW50cnlSZWY+IGdldEhlYWRFbnRyeSgpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQmluYXJ5ICpWKSB7IHJldHVybiBWLT5pc1dpblJlcygpOyB9CisKKyAgc3RhdGljIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxXaW5kb3dzUmVzb3VyY2U+PgorICBjcmVhdGVXaW5kb3dzUmVzb3VyY2UoTWVtb3J5QnVmZmVyUmVmIFNvdXJjZSk7CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBSZXNvdXJjZUVudHJ5UmVmOworCisgIFdpbmRvd3NSZXNvdXJjZShNZW1vcnlCdWZmZXJSZWYgU291cmNlKTsKKworICBCaW5hcnlCeXRlU3RyZWFtIEJCUzsKK307CisKK2NsYXNzIFdpbmRvd3NSZXNvdXJjZVBhcnNlciB7CitwdWJsaWM6CisgIGNsYXNzIFRyZWVOb2RlOworICBXaW5kb3dzUmVzb3VyY2VQYXJzZXIoKTsKKyAgRXJyb3IgcGFyc2UoV2luZG93c1Jlc291cmNlICpXUik7CisgIHZvaWQgcHJpbnRUcmVlKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIGNvbnN0IFRyZWVOb2RlICZnZXRUcmVlKCkgY29uc3QgeyByZXR1cm4gUm9vdDsgfQorICBjb25zdCBBcnJheVJlZjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gZ2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuIERhdGE7IH0KKyAgY29uc3QgQXJyYXlSZWY8c3RkOjp2ZWN0b3I8VVRGMTY+PiBnZXRTdHJpbmdUYWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RyaW5nVGFibGU7CisgIH0KKworICBjbGFzcyBUcmVlTm9kZSB7CisgIHB1YmxpYzoKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB1c2luZyBDaGlsZHJlbiA9IHN0ZDo6bWFwPFQsIHN0ZDo6dW5pcXVlX3B0cjxUcmVlTm9kZT4+OworCisgICAgdm9pZCBwcmludChTY29wZWRQcmludGVyICZXcml0ZXIsIFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKyAgICB1aW50MzJfdCBnZXRUcmVlU2l6ZSgpIGNvbnN0OworICAgIHVpbnQzMl90IGdldFN0cmluZ0luZGV4KCkgY29uc3QgeyByZXR1cm4gU3RyaW5nSW5kZXg7IH0KKyAgICB1aW50MzJfdCBnZXREYXRhSW5kZXgoKSBjb25zdCB7IHJldHVybiBEYXRhSW5kZXg7IH0KKyAgICB1aW50MTZfdCBnZXRNYWpvclZlcnNpb24oKSBjb25zdCB7IHJldHVybiBNYWpvclZlcnNpb247IH0KKyAgICB1aW50MTZfdCBnZXRNaW5vclZlcnNpb24oKSBjb25zdCB7IHJldHVybiBNaW5vclZlcnNpb247IH0KKyAgICB1aW50MzJfdCBnZXRDaGFyYWN0ZXJpc3RpY3MoKSBjb25zdCB7IHJldHVybiBDaGFyYWN0ZXJpc3RpY3M7IH0KKyAgICBib29sIGNoZWNrSXNEYXRhTm9kZSgpIGNvbnN0IHsgcmV0dXJuIElzRGF0YU5vZGU7IH0KKyAgICBjb25zdCBDaGlsZHJlbjx1aW50MzJfdD4gJmdldElEQ2hpbGRyZW4oKSBjb25zdCB7IHJldHVybiBJRENoaWxkcmVuOyB9CisgICAgY29uc3QgQ2hpbGRyZW48c3RkOjpzdHJpbmc+ICZnZXRTdHJpbmdDaGlsZHJlbigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTdHJpbmdDaGlsZHJlbjsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgV2luZG93c1Jlc291cmNlUGFyc2VyOworCisgICAgc3RhdGljIHVpbnQzMl90IFN0cmluZ0NvdW50OworICAgIHN0YXRpYyB1aW50MzJfdCBEYXRhQ291bnQ7CisKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFRyZWVOb2RlPiBjcmVhdGVTdHJpbmdOb2RlKCk7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxUcmVlTm9kZT4gY3JlYXRlSUROb2RlKCk7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxUcmVlTm9kZT4gY3JlYXRlRGF0YU5vZGUodWludDE2X3QgTWFqb3JWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IE1pbm9yVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFyYWN0ZXJpc3RpY3MpOworCisgICAgZXhwbGljaXQgVHJlZU5vZGUoYm9vbCBJc1N0cmluZ05vZGUpOworICAgIFRyZWVOb2RlKHVpbnQxNl90IE1ham9yVmVyc2lvbiwgdWludDE2X3QgTWlub3JWZXJzaW9uLAorICAgICAgICAgICAgIHVpbnQzMl90IENoYXJhY3RlcmlzdGljcyk7CisKKyAgICB2b2lkIGFkZEVudHJ5KGNvbnN0IFJlc291cmNlRW50cnlSZWYgJkVudHJ5LCBib29sICZJc05ld1R5cGVTdHJpbmcsCisgICAgICAgICAgICAgICAgICBib29sICZJc05ld05hbWVTdHJpbmcpOworICAgIFRyZWVOb2RlICZhZGRUeXBlTm9kZShjb25zdCBSZXNvdXJjZUVudHJ5UmVmICZFbnRyeSwgYm9vbCAmSXNOZXdUeXBlU3RyaW5nKTsKKyAgICBUcmVlTm9kZSAmYWRkTmFtZU5vZGUoY29uc3QgUmVzb3VyY2VFbnRyeVJlZiAmRW50cnksIGJvb2wgJklzTmV3TmFtZVN0cmluZyk7CisgICAgVHJlZU5vZGUgJmFkZExhbmd1YWdlTm9kZShjb25zdCBSZXNvdXJjZUVudHJ5UmVmICZFbnRyeSk7CisgICAgVHJlZU5vZGUgJmFkZENoaWxkKHVpbnQzMl90IElELCBib29sIElzRGF0YU5vZGUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgTWFqb3JWZXJzaW9uID0gMCwgdWludDE2X3QgTWlub3JWZXJzaW9uID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhcmFjdGVyaXN0aWNzID0gMCk7CisgICAgVHJlZU5vZGUgJmFkZENoaWxkKEFycmF5UmVmPFVURjE2PiBOYW1lUmVmLCBib29sICZJc05ld1N0cmluZyk7CisKKyAgICBib29sIElzRGF0YU5vZGUgPSBmYWxzZTsKKyAgICB1aW50MzJfdCBTdHJpbmdJbmRleDsKKyAgICB1aW50MzJfdCBEYXRhSW5kZXg7CisgICAgQ2hpbGRyZW48dWludDMyX3Q+IElEQ2hpbGRyZW47CisgICAgQ2hpbGRyZW48c3RkOjpzdHJpbmc+IFN0cmluZ0NoaWxkcmVuOworICAgIHVpbnQxNl90IE1ham9yVmVyc2lvbiA9IDA7CisgICAgdWludDE2X3QgTWlub3JWZXJzaW9uID0gMDsKKyAgICB1aW50MzJfdCBDaGFyYWN0ZXJpc3RpY3MgPSAwOworICB9OworCitwcml2YXRlOgorICBUcmVlTm9kZSBSb290OworICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gRGF0YTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8VVRGMTY+PiBTdHJpbmdUYWJsZTsKK307CisKK0V4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+Pgord3JpdGVXaW5kb3dzUmVzb3VyY2VDT0ZGKGxsdm06OkNPRkY6Ok1hY2hpbmVUeXBlcyBNYWNoaW5lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaW5kb3dzUmVzb3VyY2VQYXJzZXIgJlBhcnNlcik7CisKK30gLy8gbmFtZXNwYWNlIG9iamVjdAorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9DT0ZGWUFNTC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0NPRkZZQU1MLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc5NGVhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9DT0ZGWUFNTC5oCkBAIC0wLDAgKzEsMjUwIEBACisvLz09PS0gQ09GRllBTUwuaCAtIENPRkYgWUFNTElPIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBjbGFzc2VzIGZvciBoYW5kbGluZyB0aGUgWUFNTCByZXByZXNlbnRhdGlvbiBvZiBDT0ZGLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RZQU1MX0NPRkZZQU1MX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RZQU1MX0NPRkZZQU1MX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvQ09GRi5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0WUFNTC9Db2RlVmlld1lBTUxEZWJ1Z1NlY3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3RZQU1ML0NvZGVWaWV3WUFNTFR5cGVIYXNoaW5nLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3RZQU1ML0NvZGVWaWV3WUFNTFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3RZQU1ML1lBTUwuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgQ09GRiB7CisKK2lubGluZSBDaGFyYWN0ZXJpc3RpY3Mgb3BlcmF0b3J8KENoYXJhY3RlcmlzdGljcyBhLCBDaGFyYWN0ZXJpc3RpY3MgYikgeworICB1aW50MzJfdCBSZXQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYSkgfCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYik7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDaGFyYWN0ZXJpc3RpY3M+KFJldCk7Cit9CisKK2lubGluZSBTZWN0aW9uQ2hhcmFjdGVyaXN0aWNzIG9wZXJhdG9yfChTZWN0aW9uQ2hhcmFjdGVyaXN0aWNzIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbkNoYXJhY3RlcmlzdGljcyBiKSB7CisgIHVpbnQzMl90IFJldCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhKSB8IHN0YXRpY19jYXN0PHVpbnQzMl90PihiKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFNlY3Rpb25DaGFyYWN0ZXJpc3RpY3M+KFJldCk7Cit9CisKK2lubGluZSBETExDaGFyYWN0ZXJpc3RpY3Mgb3BlcmF0b3J8KERMTENoYXJhY3RlcmlzdGljcyBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRExMQ2hhcmFjdGVyaXN0aWNzIGIpIHsKKyAgdWludDE2X3QgUmV0ID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGEpIHwgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGIpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8RExMQ2hhcmFjdGVyaXN0aWNzPihSZXQpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ09GRgorCisvLyBUaGUgc3RydWN0dXJlIG9mIHRoZSB5YW1sIGZpbGVzIGlzIG5vdCBhbiBleGFjdCAxOjEgbWF0Y2ggdG8gQ09GRi4gSW4gb3JkZXIKKy8vIHRvIHVzZSB5YW1sOjpJTywgd2UgdXNlIHRoZXNlIHN0cnVjdHVyZXMgd2hpY2ggYXJlIGNsb3NlciB0byB0aGUgc291cmNlLgorbmFtZXNwYWNlIENPRkZZQU1MIHsKKworTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQ4X3QsIENPTURBVFR5cGUpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDMyX3QsIFdlYWtFeHRlcm5hbENoYXJhY3RlcmlzdGljcykKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50OF90LCBBdXhTeW1ib2xUeXBlKQorCitzdHJ1Y3QgUmVsb2NhdGlvbiB7CisgIHVpbnQzMl90IFZpcnR1YWxBZGRyZXNzOworICB1aW50MTZfdCBUeXBlOworICBTdHJpbmdSZWYgU3ltYm9sTmFtZTsKK307CisKK3N0cnVjdCBTZWN0aW9uIHsKKyAgQ09GRjo6c2VjdGlvbiBIZWFkZXI7CisgIHVuc2lnbmVkIEFsaWdubWVudCA9IDA7CisgIHlhbWw6OkJpbmFyeVJlZiBTZWN0aW9uRGF0YTsKKyAgc3RkOjp2ZWN0b3I8Q29kZVZpZXdZQU1MOjpZQU1MRGVidWdTdWJzZWN0aW9uPiBEZWJ1Z1M7CisgIHN0ZDo6dmVjdG9yPENvZGVWaWV3WUFNTDo6TGVhZlJlY29yZD4gRGVidWdUOworICBPcHRpb25hbDxDb2RlVmlld1lBTUw6OkRlYnVnSFNlY3Rpb24+IERlYnVnSDsKKyAgc3RkOjp2ZWN0b3I8UmVsb2NhdGlvbj4gUmVsb2NhdGlvbnM7CisgIFN0cmluZ1JlZiBOYW1lOworCisgIFNlY3Rpb24oKTsKK307CisKK3N0cnVjdCBTeW1ib2wgeworICBDT0ZGOjpzeW1ib2wgSGVhZGVyOworICBDT0ZGOjpTeW1ib2xCYXNlVHlwZSBTaW1wbGVUeXBlID0gQ09GRjo6SU1BR0VfU1lNX1RZUEVfTlVMTDsKKyAgQ09GRjo6U3ltYm9sQ29tcGxleFR5cGUgQ29tcGxleFR5cGUgPSBDT0ZGOjpJTUFHRV9TWU1fRFRZUEVfTlVMTDsKKyAgT3B0aW9uYWw8Q09GRjo6QXV4aWxpYXJ5RnVuY3Rpb25EZWZpbml0aW9uPiBGdW5jdGlvbkRlZmluaXRpb247CisgIE9wdGlvbmFsPENPRkY6OkF1eGlsaWFyeWJmQW5kZWZTeW1ib2w+IGJmQW5kZWZTeW1ib2w7CisgIE9wdGlvbmFsPENPRkY6OkF1eGlsaWFyeVdlYWtFeHRlcm5hbD4gV2Vha0V4dGVybmFsOworICBTdHJpbmdSZWYgRmlsZTsKKyAgT3B0aW9uYWw8Q09GRjo6QXV4aWxpYXJ5U2VjdGlvbkRlZmluaXRpb24+IFNlY3Rpb25EZWZpbml0aW9uOworICBPcHRpb25hbDxDT0ZGOjpBdXhpbGlhcnlDTFJUb2tlbj4gQ0xSVG9rZW47CisgIFN0cmluZ1JlZiBOYW1lOworCisgIFN5bWJvbCgpOworfTsKKworc3RydWN0IFBFSGVhZGVyIHsKKyAgQ09GRjo6UEUzMkhlYWRlciBIZWFkZXI7CisgIE9wdGlvbmFsPENPRkY6OkRhdGFEaXJlY3Rvcnk+IERhdGFEaXJlY3Rvcmllc1tDT0ZGOjpOVU1fREFUQV9ESVJFQ1RPUklFU107Cit9OworCitzdHJ1Y3QgT2JqZWN0IHsKKyAgT3B0aW9uYWw8UEVIZWFkZXI+IE9wdGlvbmFsSGVhZGVyOworICBDT0ZGOjpoZWFkZXIgSGVhZGVyOworICBzdGQ6OnZlY3RvcjxTZWN0aW9uPiBTZWN0aW9uczsKKyAgc3RkOjp2ZWN0b3I8U3ltYm9sPiBTeW1ib2xzOworCisgIE9iamVjdCgpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENPRkZZQU1MCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IoQ09GRllBTUw6OlNlY3Rpb24pCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKENPRkZZQU1MOjpTeW1ib2wpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKENPRkZZQU1MOjpSZWxvY2F0aW9uKQorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgeWFtbCB7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8Q09GRllBTUw6OldlYWtFeHRlcm5hbENoYXJhY3RlcmlzdGljcz4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIENPRkZZQU1MOjpXZWFrRXh0ZXJuYWxDaGFyYWN0ZXJpc3RpY3MgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8Q09GRllBTUw6OkF1eFN5bWJvbFR5cGU+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBDT0ZGWUFNTDo6QXV4U3ltYm9sVHlwZSAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxDT0ZGWUFNTDo6Q09NREFUVHlwZT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIENPRkZZQU1MOjpDT01EQVRUeXBlICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPENPRkY6Ok1hY2hpbmVUeXBlcz4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIENPRkY6Ok1hY2hpbmVUeXBlcyAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxDT0ZGOjpTeW1ib2xCYXNlVHlwZT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIENPRkY6OlN5bWJvbEJhc2VUeXBlICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPENPRkY6OlN5bWJvbFN0b3JhZ2VDbGFzcz4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIENPRkY6OlN5bWJvbFN0b3JhZ2VDbGFzcyAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxDT0ZGOjpTeW1ib2xDb21wbGV4VHlwZT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIENPRkY6OlN5bWJvbENvbXBsZXhUeXBlICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPENPRkY6OlJlbG9jYXRpb25UeXBlSTM4Nj4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIENPRkY6OlJlbG9jYXRpb25UeXBlSTM4NiAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxDT0ZGOjpSZWxvY2F0aW9uVHlwZUFNRDY0PiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgQ09GRjo6UmVsb2NhdGlvblR5cGVBTUQ2NCAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxDT0ZGOjpSZWxvY2F0aW9uVHlwZXNBUk0+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBDT0ZGOjpSZWxvY2F0aW9uVHlwZXNBUk0gJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8Q09GRjo6UmVsb2NhdGlvblR5cGVzQVJNNjQ+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBDT0ZGOjpSZWxvY2F0aW9uVHlwZXNBUk02NCAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxDT0ZGOjpXaW5kb3dzU3Vic3lzdGVtPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgQ09GRjo6V2luZG93c1N1YnN5c3RlbSAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJCaXRTZXRUcmFpdHM8Q09GRjo6Q2hhcmFjdGVyaXN0aWNzPiB7CisgIHN0YXRpYyB2b2lkIGJpdHNldChJTyAmSU8sIENPRkY6OkNoYXJhY3RlcmlzdGljcyAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJCaXRTZXRUcmFpdHM8Q09GRjo6U2VjdGlvbkNoYXJhY3RlcmlzdGljcz4geworICBzdGF0aWMgdm9pZCBiaXRzZXQoSU8gJklPLCBDT0ZGOjpTZWN0aW9uQ2hhcmFjdGVyaXN0aWNzICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckJpdFNldFRyYWl0czxDT0ZGOjpETExDaGFyYWN0ZXJpc3RpY3M+IHsKKyAgc3RhdGljIHZvaWQgYml0c2V0KElPICZJTywgQ09GRjo6RExMQ2hhcmFjdGVyaXN0aWNzICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE1hcHBpbmdUcmFpdHM8Q09GRllBTUw6OlJlbG9jYXRpb24+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIENPRkZZQU1MOjpSZWxvY2F0aW9uICZSZWwpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBNYXBwaW5nVHJhaXRzPENPRkZZQU1MOjpQRUhlYWRlcj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgQ09GRllBTUw6OlBFSGVhZGVyICZQSCk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE1hcHBpbmdUcmFpdHM8Q09GRjo6RGF0YURpcmVjdG9yeT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgQ09GRjo6RGF0YURpcmVjdG9yeSAmREQpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBNYXBwaW5nVHJhaXRzPENPRkY6OmhlYWRlcj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgQ09GRjo6aGVhZGVyICZIKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPENPRkY6OkF1eGlsaWFyeUZ1bmN0aW9uRGVmaW5pdGlvbj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgQ09GRjo6QXV4aWxpYXJ5RnVuY3Rpb25EZWZpbml0aW9uICZBRkQpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8Q09GRjo6QXV4aWxpYXJ5YmZBbmRlZlN5bWJvbD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgQ09GRjo6QXV4aWxpYXJ5YmZBbmRlZlN5bWJvbCAmQUFTKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPENPRkY6OkF1eGlsaWFyeVdlYWtFeHRlcm5hbD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgQ09GRjo6QXV4aWxpYXJ5V2Vha0V4dGVybmFsICZBV0UpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8Q09GRjo6QXV4aWxpYXJ5U2VjdGlvbkRlZmluaXRpb24+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIENPRkY6OkF1eGlsaWFyeVNlY3Rpb25EZWZpbml0aW9uICZBU0QpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8Q09GRjo6QXV4aWxpYXJ5Q0xSVG9rZW4+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIENPRkY6OkF1eGlsaWFyeUNMUlRva2VuICZBQ1QpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBNYXBwaW5nVHJhaXRzPENPRkZZQU1MOjpTeW1ib2w+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIENPRkZZQU1MOjpTeW1ib2wgJlMpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBNYXBwaW5nVHJhaXRzPENPRkZZQU1MOjpTZWN0aW9uPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBDT0ZGWUFNTDo6U2VjdGlvbiAmU2VjKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgTWFwcGluZ1RyYWl0czxDT0ZGWUFNTDo6T2JqZWN0PiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBDT0ZGWUFNTDo6T2JqZWN0ICZPYmopOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHlhbWwKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX09CSkVDVFlBTUxfQ09GRllBTUxfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0NvZGVWaWV3WUFNTERlYnVnU2VjdGlvbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9Db2RlVmlld1lBTUxEZWJ1Z1NlY3Rpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyMDAwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9Db2RlVmlld1lBTUxEZWJ1Z1NlY3Rpb25zLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8vPS0gQ29kZVZpZXdZQU1MRGVidWdTZWN0aW9ucy5oIC0gQ29kZVZpZXcgWUFNTElPIGRlYnVnIHNlY3Rpb25zIC0qLSBDKysgLSotPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgY2xhc3NlcyBmb3IgaGFuZGxpbmcgdGhlIFlBTUwgcmVwcmVzZW50YXRpb24gb2YgQ29kZVZpZXcKKy8vIERlYnVnIEluZm8uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVFlBTUxfQ09ERVZJRVdZQU1MREVCVUdTRUNUSU9OU19ICisjZGVmaW5lIExMVk1fT0JKRUNUWUFNTF9DT0RFVklFV1lBTUxERUJVR1NFQ1RJT05TX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N1YnNlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N1YnNlY3Rpb25SZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvWUFNTFRyYWl0cy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBTdHJpbmdzQW5kQ2hlY2tzdW1zOworY2xhc3MgU3RyaW5nc0FuZENoZWNrc3Vtc1JlZjsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3CisKK25hbWVzcGFjZSBDb2RlVmlld1lBTUwgeworCituYW1lc3BhY2UgZGV0YWlsIHsKKworc3RydWN0IFlBTUxTdWJzZWN0aW9uQmFzZTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCitzdHJ1Y3QgWUFNTEZyYW1lRGF0YSB7CisgIHVpbnQzMl90IFJ2YVN0YXJ0OworICB1aW50MzJfdCBDb2RlU2l6ZTsKKyAgdWludDMyX3QgTG9jYWxTaXplOworICB1aW50MzJfdCBQYXJhbXNTaXplOworICB1aW50MzJfdCBNYXhTdGFja1NpemU7CisgIFN0cmluZ1JlZiBGcmFtZUZ1bmM7CisgIHVpbnQzMl90IFByb2xvZ1NpemU7CisgIHVpbnQzMl90IFNhdmVkUmVnc1NpemU7CisgIHVpbnQzMl90IEZsYWdzOworfTsKKworc3RydWN0IFlBTUxDcm9zc01vZHVsZUltcG9ydCB7CisgIFN0cmluZ1JlZiBNb2R1bGVOYW1lOworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gSW1wb3J0SWRzOworfTsKKworc3RydWN0IFNvdXJjZUxpbmVFbnRyeSB7CisgIHVpbnQzMl90IE9mZnNldDsKKyAgdWludDMyX3QgTGluZVN0YXJ0OworICB1aW50MzJfdCBFbmREZWx0YTsKKyAgYm9vbCBJc1N0YXRlbWVudDsKK307CisKK3N0cnVjdCBTb3VyY2VDb2x1bW5FbnRyeSB7CisgIHVpbnQxNl90IFN0YXJ0Q29sdW1uOworICB1aW50MTZfdCBFbmRDb2x1bW47Cit9OworCitzdHJ1Y3QgU291cmNlTGluZUJsb2NrIHsKKyAgU3RyaW5nUmVmIEZpbGVOYW1lOworICBzdGQ6OnZlY3RvcjxTb3VyY2VMaW5lRW50cnk+IExpbmVzOworICBzdGQ6OnZlY3RvcjxTb3VyY2VDb2x1bW5FbnRyeT4gQ29sdW1uczsKK307CisKK3N0cnVjdCBIZXhGb3JtYXR0ZWRTdHJpbmcgeworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBCeXRlczsKK307CisKK3N0cnVjdCBTb3VyY2VGaWxlQ2hlY2tzdW1FbnRyeSB7CisgIFN0cmluZ1JlZiBGaWxlTmFtZTsKKyAgY29kZXZpZXc6OkZpbGVDaGVja3N1bUtpbmQgS2luZDsKKyAgSGV4Rm9ybWF0dGVkU3RyaW5nIENoZWNrc3VtQnl0ZXM7Cit9OworCitzdHJ1Y3QgU291cmNlTGluZUluZm8geworICB1aW50MzJfdCBSZWxvY09mZnNldDsKKyAgdWludDMyX3QgUmVsb2NTZWdtZW50OworICBjb2Rldmlldzo6TGluZUZsYWdzIEZsYWdzOworICB1aW50MzJfdCBDb2RlU2l6ZTsKKyAgc3RkOjp2ZWN0b3I8U291cmNlTGluZUJsb2NrPiBCbG9ja3M7Cit9OworCitzdHJ1Y3QgSW5saW5lZVNpdGUgeworICB1aW50MzJfdCBJbmxpbmVlOworICBTdHJpbmdSZWYgRmlsZU5hbWU7CisgIHVpbnQzMl90IFNvdXJjZUxpbmVOdW07CisgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gRXh0cmFGaWxlczsKK307CisKK3N0cnVjdCBJbmxpbmVlSW5mbyB7CisgIGJvb2wgSGFzRXh0cmFGaWxlczsKKyAgc3RkOjp2ZWN0b3I8SW5saW5lZVNpdGU+IFNpdGVzOworfTsKKworc3RydWN0IFlBTUxEZWJ1Z1N1YnNlY3Rpb24geworICBzdGF0aWMgRXhwZWN0ZWQ8WUFNTERlYnVnU3Vic2VjdGlvbj4KKyAgZnJvbUNvZGVWaWV3U3ViZWN0aW9uKGNvbnN0IGNvZGV2aWV3OjpTdHJpbmdzQW5kQ2hlY2tzdW1zUmVmICZTQywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGV2aWV3OjpEZWJ1Z1N1YnNlY3Rpb25SZWNvcmQgJlNTKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8ZGV0YWlsOjpZQU1MU3Vic2VjdGlvbkJhc2U+IFN1YnNlY3Rpb247Cit9OworCitzdHJ1Y3QgRGVidWdTdWJzZWN0aW9uU3RhdGUge307CisKK0V4cGVjdGVkPHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb2Rldmlldzo6RGVidWdTdWJzZWN0aW9uPj4+Cit0b0NvZGVWaWV3U3Vic2VjdGlvbkxpc3QoQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFlBTUxEZWJ1Z1N1YnNlY3Rpb24+IFN1YnNlY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGV2aWV3OjpTdHJpbmdzQW5kQ2hlY2tzdW1zICZTQyk7CisKK3N0ZDo6dmVjdG9yPFlBTUxEZWJ1Z1N1YnNlY3Rpb24+Citmcm9tRGVidWdTKEFycmF5UmVmPHVpbnQ4X3Q+IERhdGEsIGNvbnN0IGNvZGV2aWV3OjpTdHJpbmdzQW5kQ2hlY2tzdW1zUmVmICZTQyk7CisKK3ZvaWQgaW5pdGlhbGl6ZVN0cmluZ3NBbmRDaGVja3N1bXMoQXJyYXlSZWY8WUFNTERlYnVnU3Vic2VjdGlvbj4gU2VjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGV2aWV3OjpTdHJpbmdzQW5kQ2hlY2tzdW1zICZTQyk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDb2RlVmlld1lBTUwKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworTExWTV9ZQU1MX0RFQ0xBUkVfTUFQUElOR19UUkFJVFMoQ29kZVZpZXdZQU1MOjpZQU1MRGVidWdTdWJzZWN0aW9uKQorCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKENvZGVWaWV3WUFNTDo6WUFNTERlYnVnU3Vic2VjdGlvbikKKworI2VuZGlmIC8vIExMVk1fT0JKRUNUWUFNTF9DT0RFVklFV1lBTUxERUJVR1NFQ1RJT05TX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9Db2RlVmlld1lBTUxTeW1ib2xzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvQ29kZVZpZXdZQU1MU3ltYm9scy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MTE5M2MKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvQ29kZVZpZXdZQU1MU3ltYm9scy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8vPT09LSBDb2RlVmlld1lBTUxTeW1ib2xzLmggLSBDb2RlVmlldyBZQU1MSU8gU3ltYm9sIGltcGxlbWVudGF0aW9uIC0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgY2xhc3NlcyBmb3IgaGFuZGxpbmcgdGhlIFlBTUwgcmVwcmVzZW50YXRpb24gb2YgQ29kZVZpZXcKKy8vIERlYnVnIEluZm8uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVFlBTUxfQ09ERVZJRVdZQU1MU1lNQk9MU19ICisjZGVmaW5lIExMVk1fT0JKRUNUWUFNTF9DT0RFVklFV1lBTUxTWU1CT0xTX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1lBTUxUcmFpdHMuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBDb2RlVmlld1lBTUwgeworCituYW1lc3BhY2UgZGV0YWlsIHsKKworc3RydWN0IFN5bWJvbFJlY29yZEJhc2U7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKworc3RydWN0IFN5bWJvbFJlY29yZCB7CisgIHN0ZDo6c2hhcmVkX3B0cjxkZXRhaWw6OlN5bWJvbFJlY29yZEJhc2U+IFN5bWJvbDsKKworICBjb2Rldmlldzo6Q1ZTeW1ib2wKKyAgdG9Db2RlVmlld1N5bWJvbChCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgY29kZXZpZXc6OkNvZGVWaWV3Q29udGFpbmVyIENvbnRhaW5lcikgY29uc3Q7CisKKyAgc3RhdGljIEV4cGVjdGVkPFN5bWJvbFJlY29yZD4gZnJvbUNvZGVWaWV3U3ltYm9sKGNvZGV2aWV3OjpDVlN5bWJvbCBTeW1ib2wpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENvZGVWaWV3WUFNTAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworTExWTV9ZQU1MX0RFQ0xBUkVfTUFQUElOR19UUkFJVFMoQ29kZVZpZXdZQU1MOjpTeW1ib2xSZWNvcmQpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKENvZGVWaWV3WUFNTDo6U3ltYm9sUmVjb3JkKQorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RZQU1MX0NPREVWSUVXWUFNTFNZTUJPTFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0NvZGVWaWV3WUFNTFR5cGVIYXNoaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvQ29kZVZpZXdZQU1MVHlwZUhhc2hpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjBkOWVmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0NvZGVWaWV3WUFNTFR5cGVIYXNoaW5nLmgKQEAgLTAsMCArMSw2MiBAQAorLy89PS0gQ29kZVZpZXdZQU1MVHlwZUhhc2hpbmcuaCAtIENvZGVWaWV3IFlBTUxJTyBUeXBlIGhhc2hpbmcgLS0tLSotIEMrKy0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBjbGFzc2VzIGZvciBoYW5kbGluZyB0aGUgWUFNTCByZXByZXNlbnRhdGlvbiBvZiBDb2RlVmlldworLy8gRGVidWcgSW5mby4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUWUFNTF9DT0RFVklFV1lBTUxUWVBFSEFTSElOR19ICisjZGVmaW5lIExMVk1fT0JKRUNUWUFNTF9DT0RFVklFV1lBTUxUWVBFSEFTSElOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVIYXNoaW5nLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3RZQU1ML1lBTUwuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1lBTUxUcmFpdHMuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIENvZGVWaWV3WUFNTCB7CisKK3N0cnVjdCBHbG9iYWxIYXNoIHsKKyAgR2xvYmFsSGFzaCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgR2xvYmFsSGFzaChTdHJpbmdSZWYgUykgOiBIYXNoKFMpIHsKKyAgICBhc3NlcnQoUy5zaXplKCkgPT0gMjAgJiYgIkludmFsaWQgaGFzaCBzaXplISIpOworICB9CisgIGV4cGxpY2l0IEdsb2JhbEhhc2goQXJyYXlSZWY8dWludDhfdD4gUykgOiBIYXNoKFMpIHsKKyAgICBhc3NlcnQoUy5zaXplKCkgPT0gMjAgJiYgIkludmFsaWQgaGFzaCBzaXplISIpOworICB9CisgIHlhbWw6OkJpbmFyeVJlZiBIYXNoOworfTsKKworc3RydWN0IERlYnVnSFNlY3Rpb24geworICB1aW50MzJfdCBNYWdpYzsKKyAgdWludDE2X3QgVmVyc2lvbjsKKyAgdWludDE2X3QgSGFzaEFsZ29yaXRobTsKKyAgc3RkOjp2ZWN0b3I8R2xvYmFsSGFzaD4gSGFzaGVzOworfTsKKworRGVidWdIU2VjdGlvbiBmcm9tRGVidWdIKEFycmF5UmVmPHVpbnQ4X3Q+IERlYnVnVCk7CitBcnJheVJlZjx1aW50OF90PiB0b0RlYnVnSChjb25zdCBEZWJ1Z0hTZWN0aW9uICZEZWJ1Z0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW1wUHRyQWxsb2NhdG9yICZBbGxvYyk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDb2RlVmlld1lBTUwKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworTExWTV9ZQU1MX0RFQ0xBUkVfTUFQUElOR19UUkFJVFMoQ29kZVZpZXdZQU1MOjpEZWJ1Z0hTZWN0aW9uKQorTExWTV9ZQU1MX0RFQ0xBUkVfU0NBTEFSX1RSQUlUUyhDb2RlVmlld1lBTUw6Okdsb2JhbEhhc2gsIFF1b3RpbmdUeXBlOjpOb25lKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihDb2RlVmlld1lBTUw6Okdsb2JhbEhhc2gpCisKKyNlbmRpZiAvLyBMTFZNX09CSkVDVFlBTUxfQ09ERVZJRVdZQU1MVFlQRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0NvZGVWaWV3WUFNTFR5cGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvQ29kZVZpZXdZQU1MVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzNiNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0NvZGVWaWV3WUFNTFR5cGVzLmgKQEAgLTAsMCArMSw2OSBAQAorLy89PS0gQ29kZVZpZXdZQU1MVHlwZXMuaCAtIENvZGVWaWV3IFlBTUxJTyBUeXBlIGltcGxlbWVudGF0aW9uIC0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBjbGFzc2VzIGZvciBoYW5kbGluZyB0aGUgWUFNTCByZXByZXNlbnRhdGlvbiBvZiBDb2RlVmlldworLy8gRGVidWcgSW5mby4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUWUFNTF9DT0RFVklFV1lBTUxUWVBFU19ICisjZGVmaW5lIExMVk1fT0JKRUNUWUFNTF9DT0RFVklFV1lBTUxUWVBFU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1lBTUxUcmFpdHMuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIGNvZGV2aWV3IHsKK2NsYXNzIEFwcGVuZGluZ1R5cGVUYWJsZUJ1aWxkZXI7Cit9CisKK25hbWVzcGFjZSBDb2RlVmlld1lBTUwgeworCituYW1lc3BhY2UgZGV0YWlsIHsKKworc3RydWN0IExlYWZSZWNvcmRCYXNlOworc3RydWN0IE1lbWJlclJlY29yZEJhc2U7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKworc3RydWN0IE1lbWJlclJlY29yZCB7CisgIHN0ZDo6c2hhcmVkX3B0cjxkZXRhaWw6Ok1lbWJlclJlY29yZEJhc2U+IE1lbWJlcjsKK307CisKK3N0cnVjdCBMZWFmUmVjb3JkIHsKKyAgc3RkOjpzaGFyZWRfcHRyPGRldGFpbDo6TGVhZlJlY29yZEJhc2U+IExlYWY7CisKKyAgY29kZXZpZXc6OkNWVHlwZQorICB0b0NvZGVWaWV3UmVjb3JkKGNvZGV2aWV3OjpBcHBlbmRpbmdUeXBlVGFibGVCdWlsZGVyICZTZXJpYWxpemVyKSBjb25zdDsKKyAgc3RhdGljIEV4cGVjdGVkPExlYWZSZWNvcmQ+IGZyb21Db2RlVmlld1JlY29yZChjb2Rldmlldzo6Q1ZUeXBlIFR5cGUpOworfTsKKworc3RkOjp2ZWN0b3I8TGVhZlJlY29yZD4gZnJvbURlYnVnVChBcnJheVJlZjx1aW50OF90PiBEZWJ1Z1QpOworQXJyYXlSZWY8dWludDhfdD4gdG9EZWJ1Z1QoQXJyYXlSZWY8TGVhZlJlY29yZD4sIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENvZGVWaWV3WUFNTAorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCitMTFZNX1lBTUxfREVDTEFSRV9TQ0FMQVJfVFJBSVRTKGNvZGV2aWV3OjpHVUlELCBRdW90aW5nVHlwZTo6U2luZ2xlKQorCitMTFZNX1lBTUxfREVDTEFSRV9NQVBQSU5HX1RSQUlUUyhDb2RlVmlld1lBTUw6OkxlYWZSZWNvcmQpCitMTFZNX1lBTUxfREVDTEFSRV9NQVBQSU5HX1RSQUlUUyhDb2RlVmlld1lBTUw6Ok1lbWJlclJlY29yZCkKKworTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihDb2RlVmlld1lBTUw6OkxlYWZSZWNvcmQpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKENvZGVWaWV3WUFNTDo6TWVtYmVyUmVjb3JkKQorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RZQU1MX0NPREVWSUVXWUFNTFRZUEVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9EV0FSRkVtaXR0ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9EV0FSRkVtaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDdkOGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0RXQVJGRW1pdHRlci5oCkBAIC0wLDAgKzEsNDkgQEAKKy8vPT09LS0tIERXQVJGRW1pdHRlci5oIC0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgQ29tbW9uIGRlY2xhcmF0aW9ucyBmb3IgeWFtbDJvYmoKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RZQU1MX0RXQVJGRU1JVFRFUl9ICisjZGVmaW5lIExMVk1fT0JKRUNUWUFNTF9EV0FSRkVNSVRURVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0hvc3QuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCituYW1lc3BhY2UgRFdBUkZZQU1MIHsKKworc3RydWN0IERhdGE7CitzdHJ1Y3QgUHViU2VjdGlvbjsKKwordm9pZCBFbWl0RGVidWdBYmJyZXYocmF3X29zdHJlYW0gJk9TLCBjb25zdCBEYXRhICZESSk7Cit2b2lkIEVtaXREZWJ1Z1N0cihyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IERhdGEgJkRJKTsKKwordm9pZCBFbWl0RGVidWdBcmFuZ2VzKHJhd19vc3RyZWFtICZPUywgY29uc3QgRGF0YSAmREkpOwordm9pZCBFbWl0UHViU2VjdGlvbihyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFB1YlNlY3Rpb24gJlNlY3QsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNMaXR0bGVFbmRpYW4pOwordm9pZCBFbWl0RGVidWdJbmZvKHJhd19vc3RyZWFtICZPUywgY29uc3QgRGF0YSAmREkpOwordm9pZCBFbWl0RGVidWdMaW5lKHJhd19vc3RyZWFtICZPUywgY29uc3QgRGF0YSAmREkpOworCitFeHBlY3RlZDxTdHJpbmdNYXA8c3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4+PgorRW1pdERlYnVnU2VjdGlvbnMoU3RyaW5nUmVmIFlBTUxTdHJpbmcsCisgICAgICAgICAgICAgICAgICBib29sIElzTGl0dGxlRW5kaWFuID0gc3lzOjpJc0xpdHRsZUVuZGlhbkhvc3QpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgRFdBUkZZQU1MCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX09CSkVDVFlBTUxfRFdBUkZFTUlUVEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9EV0FSRllBTUwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9EV0FSRllBTUwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTYyZjBmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0RXQVJGWUFNTC5oCkBAIC0wLDAgKzEsMzA5IEBACisvLz09PS0gRFdBUkZZQU1MLmggLSBEV0FSRiBZQU1MSU8gaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgVGhpcyBmaWxlIGRlY2xhcmVzIGNsYXNzZXMgZm9yIGhhbmRsaW5nIHRoZSBZQU1MIHJlcHJlc2VudGF0aW9uCisvLy8gb2YgRFdBUkYgRGVidWcgSW5mby4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVFlBTUxfRFdBUkZZQU1MX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RZQU1MX0RXQVJGWUFNTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBEV0FSRllBTUwgeworCitzdHJ1Y3QgSW5pdGlhbExlbmd0aCB7CisgIHVpbnQzMl90IFRvdGFsTGVuZ3RoOworICB1aW50NjRfdCBUb3RhbExlbmd0aDY0OworCisgIGJvb2wgaXNEV0FSRjY0KCkgY29uc3QgeyByZXR1cm4gVG90YWxMZW5ndGggPT0gVUlOVDMyX01BWDsgfQorCisgIHVpbnQ2NF90IGdldExlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNEV0FSRjY0KCkgPyBUb3RhbExlbmd0aDY0IDogVG90YWxMZW5ndGg7CisgIH0KKworICB2b2lkIHNldExlbmd0aCh1aW50NjRfdCBMZW4pIHsKKyAgICBpZiAoTGVuID49ICh1aW50NjRfdClVSU5UMzJfTUFYKSB7CisgICAgICBUb3RhbExlbmd0aDY0ID0gTGVuOworICAgICAgVG90YWxMZW5ndGggPSBVSU5UMzJfTUFYOworICAgIH0gZWxzZSB7CisgICAgICBUb3RhbExlbmd0aCA9IExlbjsKKyAgICB9CisgIH0KK307CisKK3N0cnVjdCBBdHRyaWJ1dGVBYmJyZXYgeworICBsbHZtOjpkd2FyZjo6QXR0cmlidXRlIEF0dHJpYnV0ZTsKKyAgbGx2bTo6ZHdhcmY6OkZvcm0gRm9ybTsKKyAgbGx2bTo6eWFtbDo6SGV4NjQgVmFsdWU7IC8vIFNvbWUgRFdBUkY1IGF0dHJpYnV0ZXMgaGF2ZSB2YWx1ZXMKK307CisKK3N0cnVjdCBBYmJyZXYgeworICBsbHZtOjp5YW1sOjpIZXgzMiBDb2RlOworICBsbHZtOjpkd2FyZjo6VGFnIFRhZzsKKyAgbGx2bTo6ZHdhcmY6OkNvbnN0YW50cyBDaGlsZHJlbjsKKyAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlQWJicmV2PiBBdHRyaWJ1dGVzOworfTsKKworc3RydWN0IEFSYW5nZURlc2NyaXB0b3IgeworICBsbHZtOjp5YW1sOjpIZXg2NCBBZGRyZXNzOworICB1aW50NjRfdCBMZW5ndGg7Cit9OworCitzdHJ1Y3QgQVJhbmdlIHsKKyAgSW5pdGlhbExlbmd0aCBMZW5ndGg7CisgIHVpbnQxNl90IFZlcnNpb247CisgIHVpbnQzMl90IEN1T2Zmc2V0OworICB1aW50OF90IEFkZHJTaXplOworICB1aW50OF90IFNlZ1NpemU7CisgIHN0ZDo6dmVjdG9yPEFSYW5nZURlc2NyaXB0b3I+IERlc2NyaXB0b3JzOworfTsKKworc3RydWN0IFB1YkVudHJ5IHsKKyAgbGx2bTo6eWFtbDo6SGV4MzIgRGllT2Zmc2V0OworICBsbHZtOjp5YW1sOjpIZXg4IERlc2NyaXB0b3I7CisgIFN0cmluZ1JlZiBOYW1lOworfTsKKworc3RydWN0IFB1YlNlY3Rpb24geworICBJbml0aWFsTGVuZ3RoIExlbmd0aDsKKyAgdWludDE2X3QgVmVyc2lvbjsKKyAgdWludDMyX3QgVW5pdE9mZnNldDsKKyAgdWludDMyX3QgVW5pdFNpemU7CisgIGJvb2wgSXNHTlVTdHlsZSA9IGZhbHNlOworICBzdGQ6OnZlY3RvcjxQdWJFbnRyeT4gRW50cmllczsKK307CisKK3N0cnVjdCBGb3JtVmFsdWUgeworICBsbHZtOjp5YW1sOjpIZXg2NCBWYWx1ZTsKKyAgU3RyaW5nUmVmIENTdHI7CisgIHN0ZDo6dmVjdG9yPGxsdm06OnlhbWw6OkhleDg+IEJsb2NrRGF0YTsKK307CisKK3N0cnVjdCBFbnRyeSB7CisgIGxsdm06OnlhbWw6OkhleDMyIEFiYnJDb2RlOworICBzdGQ6OnZlY3RvcjxGb3JtVmFsdWU+IFZhbHVlczsKK307CisKK3N0cnVjdCBVbml0IHsKKyAgSW5pdGlhbExlbmd0aCBMZW5ndGg7CisgIHVpbnQxNl90IFZlcnNpb247CisgIGxsdm06OmR3YXJmOjpVbml0VHlwZSBUeXBlOyAvLyBBZGRlZCBpbiBEV0FSRiA1CisgIHVpbnQzMl90IEFiYnJPZmZzZXQ7CisgIHVpbnQ4X3QgQWRkclNpemU7CisgIHN0ZDo6dmVjdG9yPEVudHJ5PiBFbnRyaWVzOworfTsKKworc3RydWN0IEZpbGUgeworICBTdHJpbmdSZWYgTmFtZTsKKyAgdWludDY0X3QgRGlySWR4OworICB1aW50NjRfdCBNb2RUaW1lOworICB1aW50NjRfdCBMZW5ndGg7Cit9OworCitzdHJ1Y3QgTGluZVRhYmxlT3Bjb2RlIHsKKyAgZHdhcmY6OkxpbmVOdW1iZXJPcHMgT3Bjb2RlOworICB1aW50NjRfdCBFeHRMZW47CisgIGR3YXJmOjpMaW5lTnVtYmVyRXh0ZW5kZWRPcHMgU3ViT3Bjb2RlOworICB1aW50NjRfdCBEYXRhOworICBpbnQ2NF90IFNEYXRhOworICBGaWxlIEZpbGVFbnRyeTsKKyAgc3RkOjp2ZWN0b3I8bGx2bTo6eWFtbDo6SGV4OD4gVW5rbm93bk9wY29kZURhdGE7CisgIHN0ZDo6dmVjdG9yPGxsdm06OnlhbWw6OkhleDY0PiBTdGFuZGFyZE9wY29kZURhdGE7Cit9OworCitzdHJ1Y3QgTGluZVRhYmxlIHsKKyAgSW5pdGlhbExlbmd0aCBMZW5ndGg7CisgIHVpbnQxNl90IFZlcnNpb247CisgIHVpbnQ2NF90IFByb2xvZ3VlTGVuZ3RoOworICB1aW50OF90IE1pbkluc3RMZW5ndGg7CisgIHVpbnQ4X3QgTWF4T3BzUGVySW5zdDsKKyAgdWludDhfdCBEZWZhdWx0SXNTdG10OworICB1aW50OF90IExpbmVCYXNlOworICB1aW50OF90IExpbmVSYW5nZTsKKyAgdWludDhfdCBPcGNvZGVCYXNlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTdGFuZGFyZE9wY29kZUxlbmd0aHM7CisgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gSW5jbHVkZURpcnM7CisgIHN0ZDo6dmVjdG9yPEZpbGU+IEZpbGVzOworICBzdGQ6OnZlY3RvcjxMaW5lVGFibGVPcGNvZGU+IE9wY29kZXM7Cit9OworCitzdHJ1Y3QgRGF0YSB7CisgIGJvb2wgSXNMaXR0bGVFbmRpYW47CisgIHN0ZDo6dmVjdG9yPEFiYnJldj4gQWJicmV2RGVjbHM7CisgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gRGVidWdTdHJpbmdzOworICBzdGQ6OnZlY3RvcjxBUmFuZ2U+IEFSYW5nZXM7CisgIFB1YlNlY3Rpb24gUHViTmFtZXM7CisgIFB1YlNlY3Rpb24gUHViVHlwZXM7CisKKyAgUHViU2VjdGlvbiBHTlVQdWJOYW1lczsKKyAgUHViU2VjdGlvbiBHTlVQdWJUeXBlczsKKworICBzdGQ6OnZlY3RvcjxVbml0PiBDb21waWxlVW5pdHM7CisKKyAgc3RkOjp2ZWN0b3I8TGluZVRhYmxlPiBEZWJ1Z0xpbmVzOworCisgIGJvb2wgaXNFbXB0eSgpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIERXQVJGWUFNTAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjp5YW1sOjpIZXg2NCkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6eWFtbDo6SGV4OCkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6RFdBUkZZQU1MOjpBdHRyaWJ1dGVBYmJyZXYpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OkRXQVJGWUFNTDo6QWJicmV2KQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpEV0FSRllBTUw6OkFSYW5nZURlc2NyaXB0b3IpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OkRXQVJGWUFNTDo6QVJhbmdlKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpEV0FSRllBTUw6OlB1YkVudHJ5KQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpEV0FSRllBTUw6OlVuaXQpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OkRXQVJGWUFNTDo6Rm9ybVZhbHVlKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpEV0FSRllBTUw6OkVudHJ5KQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpEV0FSRllBTUw6OkZpbGUpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OkRXQVJGWUFNTDo6TGluZVRhYmxlKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpEV0FSRllBTUw6OkxpbmVUYWJsZU9wY29kZSkKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHlhbWwgeworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxEV0FSRllBTUw6OkRhdGE+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIERXQVJGWUFNTDo6RGF0YSAmRFdBUkYpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8RFdBUkZZQU1MOjpBYmJyZXY+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIERXQVJGWUFNTDo6QWJicmV2ICZBYmJyZXYpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8RFdBUkZZQU1MOjpBdHRyaWJ1dGVBYmJyZXY+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIERXQVJGWUFNTDo6QXR0cmlidXRlQWJicmV2ICZBdHRBYmJyZXYpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8RFdBUkZZQU1MOjpBUmFuZ2VEZXNjcmlwdG9yPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBEV0FSRllBTUw6OkFSYW5nZURlc2NyaXB0b3IgJkRlc2NyaXB0b3IpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8RFdBUkZZQU1MOjpBUmFuZ2U+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIERXQVJGWUFNTDo6QVJhbmdlICZSYW5nZSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxEV0FSRllBTUw6OlB1YkVudHJ5PiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBEV0FSRllBTUw6OlB1YkVudHJ5ICZFbnRyeSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxEV0FSRllBTUw6OlB1YlNlY3Rpb24+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIERXQVJGWUFNTDo6UHViU2VjdGlvbiAmU2VjdGlvbik7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxEV0FSRllBTUw6OlVuaXQ+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIERXQVJGWUFNTDo6VW5pdCAmVW5pdCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxEV0FSRllBTUw6OkVudHJ5PiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBEV0FSRllBTUw6OkVudHJ5ICZFbnRyeSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxEV0FSRllBTUw6OkZvcm1WYWx1ZT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgRFdBUkZZQU1MOjpGb3JtVmFsdWUgJkZvcm1WYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxEV0FSRllBTUw6OkZpbGU+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIERXQVJGWUFNTDo6RmlsZSAmRmlsZSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxEV0FSRllBTUw6OkxpbmVUYWJsZU9wY29kZT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgRFdBUkZZQU1MOjpMaW5lVGFibGVPcGNvZGUgJkxpbmVUYWJsZU9wY29kZSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxEV0FSRllBTUw6OkxpbmVUYWJsZT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgRFdBUkZZQU1MOjpMaW5lVGFibGUgJkxpbmVUYWJsZSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxEV0FSRllBTUw6OkluaXRpYWxMZW5ndGg+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIERXQVJGWUFNTDo6SW5pdGlhbExlbmd0aCAmRFdBUkYpOworfTsKKworI2RlZmluZSBIQU5ETEVfRFdfVEFHKHVudXNlZCwgbmFtZSwgdW51c2VkMiwgdW51c2VkMykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW8uZW51bUNhc2UodmFsdWUsICJEV19UQUdfIiAjbmFtZSwgZHdhcmY6OkRXX1RBR18jI25hbWUpOworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8ZHdhcmY6OlRhZz4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmaW8sIGR3YXJmOjpUYWcgJnZhbHVlKSB7CisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmIgorICAgIGlvLmVudW1GYWxsYmFjazxIZXgxNj4odmFsdWUpOworICB9Cit9OworCisjZGVmaW5lIEhBTkRMRV9EV19MTlModW51c2VkLCBuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpby5lbnVtQ2FzZSh2YWx1ZSwgIkRXX0xOU18iICNuYW1lLCBkd2FyZjo6RFdfTE5TXyMjbmFtZSk7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxkd2FyZjo6TGluZU51bWJlck9wcz4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmaW8sIGR3YXJmOjpMaW5lTnVtYmVyT3BzICZ2YWx1ZSkgeworI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKKyAgICBpby5lbnVtRmFsbGJhY2s8SGV4OD4odmFsdWUpOworICB9Cit9OworCisjZGVmaW5lIEhBTkRMRV9EV19MTkUodW51c2VkLCBuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpby5lbnVtQ2FzZSh2YWx1ZSwgIkRXX0xORV8iICNuYW1lLCBkd2FyZjo6RFdfTE5FXyMjbmFtZSk7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxkd2FyZjo6TGluZU51bWJlckV4dGVuZGVkT3BzPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZpbywgZHdhcmY6OkxpbmVOdW1iZXJFeHRlbmRlZE9wcyAmdmFsdWUpIHsKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYiCisgICAgaW8uZW51bUZhbGxiYWNrPEhleDE2Pih2YWx1ZSk7CisgIH0KK307CisKKyNkZWZpbmUgSEFORExFX0RXX0FUKHVudXNlZCwgbmFtZSwgdW51c2VkMiwgdW51c2VkMykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlvLmVudW1DYXNlKHZhbHVlLCAiRFdfQVRfIiAjbmFtZSwgZHdhcmY6OkRXX0FUXyMjbmFtZSk7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxkd2FyZjo6QXR0cmlidXRlPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZpbywgZHdhcmY6OkF0dHJpYnV0ZSAmdmFsdWUpIHsKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYiCisgICAgaW8uZW51bUZhbGxiYWNrPEhleDE2Pih2YWx1ZSk7CisgIH0KK307CisKKyNkZWZpbmUgSEFORExFX0RXX0ZPUk0odW51c2VkLCBuYW1lLCB1bnVzZWQyLCB1bnVzZWQzKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlvLmVudW1DYXNlKHZhbHVlLCAiRFdfRk9STV8iICNuYW1lLCBkd2FyZjo6RFdfRk9STV8jI25hbWUpOworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8ZHdhcmY6OkZvcm0+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJmlvLCBkd2FyZjo6Rm9ybSAmdmFsdWUpIHsKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYiCisgICAgaW8uZW51bUZhbGxiYWNrPEhleDE2Pih2YWx1ZSk7CisgIH0KK307CisKKyNkZWZpbmUgSEFORExFX0RXX1VUKHVudXNlZCwgbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlvLmVudW1DYXNlKHZhbHVlLCAiRFdfVVRfIiAjbmFtZSwgZHdhcmY6OkRXX1VUXyMjbmFtZSk7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxkd2FyZjo6VW5pdFR5cGU+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJmlvLCBkd2FyZjo6VW5pdFR5cGUgJnZhbHVlKSB7CisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmIgorICAgIGlvLmVudW1GYWxsYmFjazxIZXg4Pih2YWx1ZSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxkd2FyZjo6Q29uc3RhbnRzPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZpbywgZHdhcmY6OkNvbnN0YW50cyAmdmFsdWUpIHsKKyAgICBpby5lbnVtQ2FzZSh2YWx1ZSwgIkRXX0NISUxEUkVOX25vIiwgZHdhcmY6OkRXX0NISUxEUkVOX25vKTsKKyAgICBpby5lbnVtQ2FzZSh2YWx1ZSwgIkRXX0NISUxEUkVOX3llcyIsIGR3YXJmOjpEV19DSElMRFJFTl95ZXMpOworICAgIGlvLmVudW1GYWxsYmFjazxIZXgxNj4odmFsdWUpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgeWFtbAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT0JKRUNUWUFNTF9EV0FSRllBTUxfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0VMRllBTUwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9FTEZZQU1MLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhODM5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9FTEZZQU1MLmgKQEAgLTAsMCArMSwzNzkgQEAKKy8vPT09LSBFTEZZQU1MLmggLSBFTEYgWUFNTElPIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBUaGlzIGZpbGUgZGVjbGFyZXMgY2xhc3NlcyBmb3IgaGFuZGxpbmcgdGhlIFlBTUwgcmVwcmVzZW50YXRpb24KKy8vLyBvZiBFTEYuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RZQU1MX0VMRllBTUxfSAorI2RlZmluZSBMTFZNX09CSkVDVFlBTUxfRUxGWUFNTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdFlBTUwvWUFNTC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgRUxGWUFNTCB7CisKKy8vIFRoZXNlIHR5cGVzIGFyZSBpbnZhcmlhbnQgYWNyb3NzIDMyLzY0LWJpdCBFTEYsIHNvIGZvciBzaW1wbGljaXR5IGp1c3QKKy8vIGRpcmVjdGx5IGdpdmUgdGhlbSB0aGVpciBleGFjdCBzaXplcy4gV2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dAorLy8gZW5kaWFubmVzcyBiZWNhdXNlIHRoZXNlIGFyZSBqdXN0IHRoZSB0eXBlcyBpbiB0aGUgWUFNTElPIHN0cnVjdHVyZXMsCisvLyBhbmQgYXJlIGFwcHJvcHJpYXRlbHkgY29udmVydGVkIHRvIHRoZSBuZWNlc3NhcnkgZW5kaWFubmVzcyB3aGVuCisvLyByZWFkaW5nL2dlbmVyYXRpbmcgYmluYXJ5IG9iamVjdCBmaWxlcy4KKy8vIFRoZSBuYW1pbmcgb2YgdGhlc2UgdHlwZXMgaXMgaW50ZW5kZWQgdG8gYmUgRUxGX1BSRUZJWCwgd2hlcmUgUFJFRklYIGlzCisvLyB0aGUgY29tbW9uIHByZWZpeCBvZiB0aGUgcmVzcGVjdGl2ZSBjb25zdGFudHMuIEUuZy4gRUxGX0VNIGNvcnJlc3BvbmRzCisvLyB0byB0aGUgYGVfbWFjaGluZWAgY29uc3RhbnRzLCBsaWtlIGBFTV9YODZfNjRgLgorLy8gSW4gdGhlIGZ1dHVyZSwgdGhlc2Ugd291bGQgcHJvYmFibHkgYmUgYmV0dGVyIHN1aXRlZCBieSBDKysxMSBlbnVtCisvLyBjbGFzcydzIHdpdGggYXBwcm9wcmlhdGUgZml4ZWQgdW5kZXJseWluZyB0eXBlLgorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQxNl90LCBFTEZfRVQpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDMyX3QsIEVMRl9QVCkKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50MzJfdCwgRUxGX0VNKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQ4X3QsIEVMRl9FTEZDTEFTUykKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50OF90LCBFTEZfRUxGREFUQSkKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50OF90LCBFTEZfRUxGT1NBQkkpCisvLyBKdXN0IHVzZSA2NCwgc2luY2UgaXQgY2FuIGhvbGQgMzItYml0IHZhbHVlcyB0b28uCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDY0X3QsIEVMRl9FRikKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50MzJfdCwgRUxGX1BGKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQzMl90LCBFTEZfU0hUKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQzMl90LCBFTEZfUkVMKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQ4X3QsIEVMRl9SU1MpCisvLyBKdXN0IHVzZSA2NCwgc2luY2UgaXQgY2FuIGhvbGQgMzItYml0IHZhbHVlcyB0b28uCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDY0X3QsIEVMRl9TSEYpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDE2X3QsIEVMRl9TSE4pCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDhfdCwgRUxGX1NUVCkKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50OF90LCBFTEZfU1RWKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQ4X3QsIEVMRl9TVE8pCisKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50OF90LCBNSVBTX0FGTF9SRUcpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDhfdCwgTUlQU19BQklfRlApCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDMyX3QsIE1JUFNfQUZMX0VYVCkKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50MzJfdCwgTUlQU19BRkxfQVNFKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQzMl90LCBNSVBTX0FGTF9GTEFHUzEpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDMyX3QsIE1JUFNfSVNBKQorCisvLyBGb3Igbm93LCBoYXJkY29kZSA2NCBiaXRzIGV2ZXJ5d2hlcmUgdGhhdCAzMiBvciA2NCB3b3VsZCBiZSBuZWVkZWQKKy8vIHNpbmNlIDY0LWJpdCBjYW4gaG9sZCAzMi1iaXQgdmFsdWVzIHRvby4KK3N0cnVjdCBGaWxlSGVhZGVyIHsKKyAgRUxGX0VMRkNMQVNTIENsYXNzOworICBFTEZfRUxGREFUQSBEYXRhOworICBFTEZfRUxGT1NBQkkgT1NBQkk7CisgIEVMRl9FVCBUeXBlOworICBFTEZfRU0gTWFjaGluZTsKKyAgRUxGX0VGIEZsYWdzOworICBsbHZtOjp5YW1sOjpIZXg2NCBFbnRyeTsKK307CisKK3N0cnVjdCBTZWN0aW9uTmFtZSB7CisgIFN0cmluZ1JlZiBTZWN0aW9uOworfTsKKworc3RydWN0IFByb2dyYW1IZWFkZXIgeworICBFTEZfUFQgVHlwZTsKKyAgRUxGX1BGIEZsYWdzOworICBsbHZtOjp5YW1sOjpIZXg2NCBWQWRkcjsKKyAgbGx2bTo6eWFtbDo6SGV4NjQgUEFkZHI7CisgIE9wdGlvbmFsPGxsdm06OnlhbWw6OkhleDY0PiBBbGlnbjsKKyAgc3RkOjp2ZWN0b3I8U2VjdGlvbk5hbWU+IFNlY3Rpb25zOworfTsKKworc3RydWN0IFN5bWJvbCB7CisgIFN0cmluZ1JlZiBOYW1lOworICBFTEZfU1RUIFR5cGU7CisgIFN0cmluZ1JlZiBTZWN0aW9uOworICBPcHRpb25hbDxFTEZfU0hOPiBJbmRleDsKKyAgbGx2bTo6eWFtbDo6SGV4NjQgVmFsdWU7CisgIGxsdm06OnlhbWw6OkhleDY0IFNpemU7CisgIHVpbnQ4X3QgT3RoZXI7Cit9OworCitzdHJ1Y3QgTG9jYWxHbG9iYWxXZWFrU3ltYm9scyB7CisgIHN0ZDo6dmVjdG9yPFN5bWJvbD4gTG9jYWw7CisgIHN0ZDo6dmVjdG9yPFN5bWJvbD4gR2xvYmFsOworICBzdGQ6OnZlY3RvcjxTeW1ib2w+IFdlYWs7Cit9OworCitzdHJ1Y3QgU2VjdGlvbk9yVHlwZSB7CisgIFN0cmluZ1JlZiBzZWN0aW9uTmFtZU9yVHlwZTsKK307CisKK3N0cnVjdCBTZWN0aW9uIHsKKyAgZW51bSBjbGFzcyBTZWN0aW9uS2luZCB7CisgICAgR3JvdXAsCisgICAgUmF3Q29udGVudCwKKyAgICBSZWxvY2F0aW9uLAorICAgIE5vQml0cywKKyAgICBNaXBzQUJJRmxhZ3MKKyAgfTsKKyAgU2VjdGlvbktpbmQgS2luZDsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIEVMRl9TSFQgVHlwZTsKKyAgRUxGX1NIRiBGbGFnczsKKyAgbGx2bTo6eWFtbDo6SGV4NjQgQWRkcmVzczsKKyAgU3RyaW5nUmVmIExpbms7CisgIFN0cmluZ1JlZiBJbmZvOworICBsbHZtOjp5YW1sOjpIZXg2NCBBZGRyZXNzQWxpZ247CisKKyAgU2VjdGlvbihTZWN0aW9uS2luZCBLaW5kKSA6IEtpbmQoS2luZCkge30KKyAgdmlydHVhbCB+U2VjdGlvbigpOworfTsKK3N0cnVjdCBSYXdDb250ZW50U2VjdGlvbiA6IFNlY3Rpb24geworICB5YW1sOjpCaW5hcnlSZWYgQ29udGVudDsKKyAgbGx2bTo6eWFtbDo6SGV4NjQgU2l6ZTsKKworICBSYXdDb250ZW50U2VjdGlvbigpIDogU2VjdGlvbihTZWN0aW9uS2luZDo6UmF3Q29udGVudCkge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+S2luZCA9PSBTZWN0aW9uS2luZDo6UmF3Q29udGVudDsKKyAgfQorfTsKKworc3RydWN0IE5vQml0c1NlY3Rpb24gOiBTZWN0aW9uIHsKKyAgbGx2bTo6eWFtbDo6SGV4NjQgU2l6ZTsKKworICBOb0JpdHNTZWN0aW9uKCkgOiBTZWN0aW9uKFNlY3Rpb25LaW5kOjpOb0JpdHMpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPktpbmQgPT0gU2VjdGlvbktpbmQ6Ok5vQml0czsKKyAgfQorfTsKKworc3RydWN0IEdyb3VwIDogU2VjdGlvbiB7CisgIC8vIE1lbWJlcnMgb2YgYSBncm91cCBjb250YWluIGEgZmxhZyBhbmQgYSBsaXN0IG9mIHNlY3Rpb24gaW5kaWNlcworICAvLyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBncm91cC4KKyAgc3RkOjp2ZWN0b3I8U2VjdGlvbk9yVHlwZT4gTWVtYmVyczsKKworICBHcm91cCgpIDogU2VjdGlvbihTZWN0aW9uS2luZDo6R3JvdXApIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPktpbmQgPT0gU2VjdGlvbktpbmQ6Okdyb3VwOworICB9Cit9OworCitzdHJ1Y3QgUmVsb2NhdGlvbiB7CisgIGxsdm06OnlhbWw6OkhleDY0IE9mZnNldDsKKyAgaW50NjRfdCBBZGRlbmQ7CisgIEVMRl9SRUwgVHlwZTsKKyAgT3B0aW9uYWw8U3RyaW5nUmVmPiBTeW1ib2w7Cit9OworCitzdHJ1Y3QgUmVsb2NhdGlvblNlY3Rpb24gOiBTZWN0aW9uIHsKKyAgc3RkOjp2ZWN0b3I8UmVsb2NhdGlvbj4gUmVsb2NhdGlvbnM7CisKKyAgUmVsb2NhdGlvblNlY3Rpb24oKSA6IFNlY3Rpb24oU2VjdGlvbktpbmQ6OlJlbG9jYXRpb24pIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPktpbmQgPT0gU2VjdGlvbktpbmQ6OlJlbG9jYXRpb247CisgIH0KK307CisKKy8vIFJlcHJlc2VudHMgLk1JUFMuYWJpZmxhZ3Mgc2VjdGlvbgorc3RydWN0IE1pcHNBQklGbGFncyA6IFNlY3Rpb24geworICBsbHZtOjp5YW1sOjpIZXgxNiBWZXJzaW9uOworICBNSVBTX0lTQSBJU0FMZXZlbDsKKyAgbGx2bTo6eWFtbDo6SGV4OCBJU0FSZXZpc2lvbjsKKyAgTUlQU19BRkxfUkVHIEdQUlNpemU7CisgIE1JUFNfQUZMX1JFRyBDUFIxU2l6ZTsKKyAgTUlQU19BRkxfUkVHIENQUjJTaXplOworICBNSVBTX0FCSV9GUCBGcEFCSTsKKyAgTUlQU19BRkxfRVhUIElTQUV4dGVuc2lvbjsKKyAgTUlQU19BRkxfQVNFIEFTRXM7CisgIE1JUFNfQUZMX0ZMQUdTMSBGbGFnczE7CisgIGxsdm06OnlhbWw6OkhleDMyIEZsYWdzMjsKKworICBNaXBzQUJJRmxhZ3MoKSA6IFNlY3Rpb24oU2VjdGlvbktpbmQ6Ok1pcHNBQklGbGFncykge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+S2luZCA9PSBTZWN0aW9uS2luZDo6TWlwc0FCSUZsYWdzOworICB9Cit9OworCitzdHJ1Y3QgT2JqZWN0IHsKKyAgRmlsZUhlYWRlciBIZWFkZXI7CisgIHN0ZDo6dmVjdG9yPFByb2dyYW1IZWFkZXI+IFByb2dyYW1IZWFkZXJzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8U2VjdGlvbj4+IFNlY3Rpb25zOworICAvLyBBbHRob3VnaCBpbiByZWFsaXR5IHRoZSBzeW1ib2xzIHJlc2lkZSBpbiBhIHNlY3Rpb24sIGl0IGlzIGEgbG90CisgIC8vIGNsZWFuZXIgYW5kIG5pY2VyIGlmIHdlIHJlYWQgdGhlbSBmcm9tIHRoZSBZQU1MIGFzIGEgc2VwYXJhdGUKKyAgLy8gdG9wLWxldmVsIGtleSwgd2hpY2ggYXV0b21hdGljYWxseSBlbnN1cmVzIHRoYXQgaW52YXJpYW50cyBsaWtlIHRoZXJlCisgIC8vIGJlaW5nIGEgc2luZ2xlIFNIVF9TWU1UQUIgc2VjdGlvbiBhcmUgdXBoZWxkLgorICBMb2NhbEdsb2JhbFdlYWtTeW1ib2xzIFN5bWJvbHM7CisgIExvY2FsR2xvYmFsV2Vha1N5bWJvbHMgRHluYW1pY1N5bWJvbHM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRUxGWUFNTAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpFTEZZQU1MOjpQcm9ncmFtSGVhZGVyKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6RUxGWUFNTDo6U2VjdGlvbj4pCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OkVMRllBTUw6OlN5bWJvbCkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6RUxGWUFNTDo6UmVsb2NhdGlvbikKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6RUxGWUFNTDo6U2VjdGlvbk9yVHlwZSkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6RUxGWUFNTDo6U2VjdGlvbk5hbWUpCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSB5YW1sIHsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxFTEZZQU1MOjpFTEZfRVQ+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBFTEZZQU1MOjpFTEZfRVQgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxFTEZZQU1MOjpFTEZfUFQ+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBFTEZZQU1MOjpFTEZfUFQgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8RUxGWUFNTDo6RUxGX0VNPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgRUxGWUFNTDo6RUxGX0VNICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPEVMRllBTUw6OkVMRl9FTEZDTEFTUz4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIEVMRllBTUw6OkVMRl9FTEZDTEFTUyAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxFTEZZQU1MOjpFTEZfRUxGREFUQT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIEVMRllBTUw6OkVMRl9FTEZEQVRBICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPEVMRllBTUw6OkVMRl9FTEZPU0FCST4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIEVMRllBTUw6OkVMRl9FTEZPU0FCSSAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJCaXRTZXRUcmFpdHM8RUxGWUFNTDo6RUxGX0VGPiB7CisgIHN0YXRpYyB2b2lkIGJpdHNldChJTyAmSU8sIEVMRllBTUw6OkVMRl9FRiAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckJpdFNldFRyYWl0czxFTEZZQU1MOjpFTEZfUEY+IHsKKyAgc3RhdGljIHZvaWQgYml0c2V0KElPICZJTywgRUxGWUFNTDo6RUxGX1BGICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPEVMRllBTUw6OkVMRl9TSFQ+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBFTEZZQU1MOjpFTEZfU0hUICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckJpdFNldFRyYWl0czxFTEZZQU1MOjpFTEZfU0hGPiB7CisgIHN0YXRpYyB2b2lkIGJpdHNldChJTyAmSU8sIEVMRllBTUw6OkVMRl9TSEYgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxFTEZZQU1MOjpFTEZfU0hOPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgRUxGWUFNTDo6RUxGX1NITiAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxFTEZZQU1MOjpFTEZfU1RUPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgRUxGWUFNTDo6RUxGX1NUVCAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxFTEZZQU1MOjpFTEZfU1RWPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgRUxGWUFNTDo6RUxGX1NUViAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJCaXRTZXRUcmFpdHM8RUxGWUFNTDo6RUxGX1NUTz4geworICBzdGF0aWMgdm9pZCBiaXRzZXQoSU8gJklPLCBFTEZZQU1MOjpFTEZfU1RPICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPEVMRllBTUw6OkVMRl9SRUw+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBFTEZZQU1MOjpFTEZfUkVMICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPEVMRllBTUw6OkVMRl9SU1M+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBFTEZZQU1MOjpFTEZfUlNTICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPEVMRllBTUw6Ok1JUFNfQUZMX1JFRz4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIEVMRllBTUw6Ok1JUFNfQUZMX1JFRyAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxFTEZZQU1MOjpNSVBTX0FCSV9GUD4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIEVMRllBTUw6Ok1JUFNfQUJJX0ZQICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPEVMRllBTUw6Ok1JUFNfQUZMX0VYVD4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIEVMRllBTUw6Ok1JUFNfQUZMX0VYVCAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxFTEZZQU1MOjpNSVBTX0lTQT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIEVMRllBTUw6Ok1JUFNfSVNBICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckJpdFNldFRyYWl0czxFTEZZQU1MOjpNSVBTX0FGTF9BU0U+IHsKKyAgc3RhdGljIHZvaWQgYml0c2V0KElPICZJTywgRUxGWUFNTDo6TUlQU19BRkxfQVNFICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckJpdFNldFRyYWl0czxFTEZZQU1MOjpNSVBTX0FGTF9GTEFHUzE+IHsKKyAgc3RhdGljIHZvaWQgYml0c2V0KElPICZJTywgRUxGWUFNTDo6TUlQU19BRkxfRkxBR1MxICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE1hcHBpbmdUcmFpdHM8RUxGWUFNTDo6RmlsZUhlYWRlcj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgRUxGWUFNTDo6RmlsZUhlYWRlciAmRmlsZUhkcik7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxFTEZZQU1MOjpQcm9ncmFtSGVhZGVyPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBFTEZZQU1MOjpQcm9ncmFtSGVhZGVyICZGaWxlSGRyKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgTWFwcGluZ1RyYWl0czxFTEZZQU1MOjpTeW1ib2w+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIEVMRllBTUw6OlN5bWJvbCAmU3ltYm9sKTsKKyAgc3RhdGljIFN0cmluZ1JlZiB2YWxpZGF0ZShJTyAmSU8sIEVMRllBTUw6OlN5bWJvbCAmU3ltYm9sKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgTWFwcGluZ1RyYWl0czxFTEZZQU1MOjpMb2NhbEdsb2JhbFdlYWtTeW1ib2xzPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBFTEZZQU1MOjpMb2NhbEdsb2JhbFdlYWtTeW1ib2xzICZTeW1ib2xzKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPEVMRllBTUw6OlJlbG9jYXRpb24+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIEVMRllBTUw6OlJlbG9jYXRpb24gJlJlbCk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE1hcHBpbmdUcmFpdHM8c3RkOjp1bmlxdWVfcHRyPEVMRllBTUw6OlNlY3Rpb24+PiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBzdGQ6OnVuaXF1ZV9wdHI8RUxGWUFNTDo6U2VjdGlvbj4gJlNlY3Rpb24pOworICBzdGF0aWMgU3RyaW5nUmVmIHZhbGlkYXRlKElPICZpbywgc3RkOjp1bmlxdWVfcHRyPEVMRllBTUw6OlNlY3Rpb24+ICZTZWN0aW9uKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgTWFwcGluZ1RyYWl0czxFTEZZQU1MOjpPYmplY3Q+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIEVMRllBTUw6Ok9iamVjdCAmT2JqZWN0KTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPEVMRllBTUw6OlNlY3Rpb25PclR5cGU+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIEVMRllBTUw6OlNlY3Rpb25PclR5cGUgJnNlY3Rpb25PclR5cGUpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8RUxGWUFNTDo6U2VjdGlvbk5hbWU+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIEVMRllBTUw6OlNlY3Rpb25OYW1lICZzZWN0aW9uTmFtZSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgeWFtbAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT0JKRUNUWUFNTF9FTEZZQU1MX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9NYWNoT1lBTUwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9NYWNoT1lBTUwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmE4ZjkyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML01hY2hPWUFNTC5oCkBAIC0wLDAgKzEsMzA3IEBACisvLz09PS0gTWFjaE9ZQU1MLmggLSBNYWNoLU8gWUFNTElPIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgVGhpcyBmaWxlIGRlY2xhcmVzIGNsYXNzZXMgZm9yIGhhbmRsaW5nIHRoZSBZQU1MIHJlcHJlc2VudGF0aW9uCisvLy8gb2YgTWFjaC1PLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUWUFNTF9NQUNIT1lBTUxfSAorI2RlZmluZSBMTFZNX09CSkVDVFlBTUxfTUFDSE9ZQU1MX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L01hY2hPLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3RZQU1ML0RXQVJGWUFNTC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgTWFjaE9ZQU1MIHsKKworc3RydWN0IFNlY3Rpb24geworICBjaGFyIHNlY3RuYW1lWzE2XTsKKyAgY2hhciBzZWduYW1lWzE2XTsKKyAgbGx2bTo6eWFtbDo6SGV4NjQgYWRkcjsKKyAgdWludDY0X3Qgc2l6ZTsKKyAgbGx2bTo6eWFtbDo6SGV4MzIgb2Zmc2V0OworICB1aW50MzJfdCBhbGlnbjsKKyAgbGx2bTo6eWFtbDo6SGV4MzIgcmVsb2ZmOworICB1aW50MzJfdCBucmVsb2M7CisgIGxsdm06OnlhbWw6OkhleDMyIGZsYWdzOworICBsbHZtOjp5YW1sOjpIZXgzMiByZXNlcnZlZDE7CisgIGxsdm06OnlhbWw6OkhleDMyIHJlc2VydmVkMjsKKyAgbGx2bTo6eWFtbDo6SGV4MzIgcmVzZXJ2ZWQzOworfTsKKworc3RydWN0IEZpbGVIZWFkZXIgeworICBsbHZtOjp5YW1sOjpIZXgzMiBtYWdpYzsKKyAgbGx2bTo6eWFtbDo6SGV4MzIgY3B1dHlwZTsKKyAgbGx2bTo6eWFtbDo6SGV4MzIgY3B1c3VidHlwZTsKKyAgbGx2bTo6eWFtbDo6SGV4MzIgZmlsZXR5cGU7CisgIHVpbnQzMl90IG5jbWRzOworICB1aW50MzJfdCBzaXplb2ZjbWRzOworICBsbHZtOjp5YW1sOjpIZXgzMiBmbGFnczsKKyAgbGx2bTo6eWFtbDo6SGV4MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgTG9hZENvbW1hbmQgeworICB2aXJ0dWFsIH5Mb2FkQ29tbWFuZCgpOworCisgIGxsdm06Ok1hY2hPOjptYWNob19sb2FkX2NvbW1hbmQgRGF0YTsKKyAgc3RkOjp2ZWN0b3I8U2VjdGlvbj4gU2VjdGlvbnM7CisgIHN0ZDo6dmVjdG9yPE1hY2hPOjpidWlsZF90b29sX3ZlcnNpb24+IFRvb2xzOworICBzdGQ6OnZlY3RvcjxsbHZtOjp5YW1sOjpIZXg4PiBQYXlsb2FkQnl0ZXM7CisgIHN0ZDo6c3RyaW5nIFBheWxvYWRTdHJpbmc7CisgIHVpbnQ2NF90IFplcm9QYWRCeXRlczsKK307CisKK3N0cnVjdCBOTGlzdEVudHJ5IHsKKyAgdWludDMyX3Qgbl9zdHJ4OworICBsbHZtOjp5YW1sOjpIZXg4IG5fdHlwZTsKKyAgdWludDhfdCBuX3NlY3Q7CisgIHVpbnQxNl90IG5fZGVzYzsKKyAgdWludDY0X3Qgbl92YWx1ZTsKK307CisKK3N0cnVjdCBSZWJhc2VPcGNvZGUgeworICBNYWNoTzo6UmViYXNlT3Bjb2RlIE9wY29kZTsKKyAgdWludDhfdCBJbW07CisgIHN0ZDo6dmVjdG9yPHlhbWw6OkhleDY0PiBFeHRyYURhdGE7Cit9OworCitzdHJ1Y3QgQmluZE9wY29kZSB7CisgIE1hY2hPOjpCaW5kT3Bjb2RlIE9wY29kZTsKKyAgdWludDhfdCBJbW07CisgIHN0ZDo6dmVjdG9yPHlhbWw6OkhleDY0PiBVTEVCRXh0cmFEYXRhOworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBTTEVCRXh0cmFEYXRhOworICBTdHJpbmdSZWYgU3ltYm9sOworfTsKKworc3RydWN0IEV4cG9ydEVudHJ5IHsKKyAgdWludDY0X3QgVGVybWluYWxTaXplID0gMDsKKyAgdWludDY0X3QgTm9kZU9mZnNldCA9IDA7CisgIHN0ZDo6c3RyaW5nIE5hbWU7CisgIGxsdm06OnlhbWw6OkhleDY0IEZsYWdzID0gMDsKKyAgbGx2bTo6eWFtbDo6SGV4NjQgQWRkcmVzcyA9IDA7CisgIGxsdm06OnlhbWw6OkhleDY0IE90aGVyID0gMDsKKyAgc3RkOjpzdHJpbmcgSW1wb3J0TmFtZTsKKyAgc3RkOjp2ZWN0b3I8TWFjaE9ZQU1MOjpFeHBvcnRFbnRyeT4gQ2hpbGRyZW47Cit9OworCitzdHJ1Y3QgTGlua0VkaXREYXRhIHsKKyAgc3RkOjp2ZWN0b3I8TWFjaE9ZQU1MOjpSZWJhc2VPcGNvZGU+IFJlYmFzZU9wY29kZXM7CisgIHN0ZDo6dmVjdG9yPE1hY2hPWUFNTDo6QmluZE9wY29kZT4gQmluZE9wY29kZXM7CisgIHN0ZDo6dmVjdG9yPE1hY2hPWUFNTDo6QmluZE9wY29kZT4gV2Vha0JpbmRPcGNvZGVzOworICBzdGQ6OnZlY3RvcjxNYWNoT1lBTUw6OkJpbmRPcGNvZGU+IExhenlCaW5kT3Bjb2RlczsKKyAgTWFjaE9ZQU1MOjpFeHBvcnRFbnRyeSBFeHBvcnRUcmllOworICBzdGQ6OnZlY3RvcjxOTGlzdEVudHJ5PiBOYW1lTGlzdDsKKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBTdHJpbmdUYWJsZTsKKworICBib29sIGlzRW1wdHkoKSBjb25zdDsKK307CisKK3N0cnVjdCBPYmplY3QgeworICBib29sIElzTGl0dGxlRW5kaWFuOworICBGaWxlSGVhZGVyIEhlYWRlcjsKKyAgc3RkOjp2ZWN0b3I8TG9hZENvbW1hbmQ+IExvYWRDb21tYW5kczsKKyAgc3RkOjp2ZWN0b3I8U2VjdGlvbj4gU2VjdGlvbnM7CisgIExpbmtFZGl0RGF0YSBMaW5rRWRpdDsKKyAgRFdBUkZZQU1MOjpEYXRhIERXQVJGOworfTsKKworc3RydWN0IEZhdEhlYWRlciB7CisgIGxsdm06OnlhbWw6OkhleDMyIG1hZ2ljOworICB1aW50MzJfdCBuZmF0X2FyY2g7Cit9OworCitzdHJ1Y3QgRmF0QXJjaCB7CisgIGxsdm06OnlhbWw6OkhleDMyIGNwdXR5cGU7CisgIGxsdm06OnlhbWw6OkhleDMyIGNwdXN1YnR5cGU7CisgIGxsdm06OnlhbWw6OkhleDY0IG9mZnNldDsKKyAgdWludDY0X3Qgc2l6ZTsKKyAgdWludDMyX3QgYWxpZ247CisgIGxsdm06OnlhbWw6OkhleDMyIHJlc2VydmVkOworfTsKKworc3RydWN0IFVuaXZlcnNhbEJpbmFyeSB7CisgIEZhdEhlYWRlciBIZWFkZXI7CisgIHN0ZDo6dmVjdG9yPEZhdEFyY2g+IEZhdEFyY2hzOworICBzdGQ6OnZlY3RvcjxPYmplY3Q+IFNsaWNlczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBNYWNoT1lBTUwKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6TWFjaE9ZQU1MOjpMb2FkQ29tbWFuZCkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6TWFjaE9ZQU1MOjpTZWN0aW9uKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpNYWNoT1lBTUw6OlJlYmFzZU9wY29kZSkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6TWFjaE9ZQU1MOjpCaW5kT3Bjb2RlKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpNYWNoT1lBTUw6OkV4cG9ydEVudHJ5KQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpNYWNoT1lBTUw6Ok5MaXN0RW50cnkpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Ok1hY2hPWUFNTDo6T2JqZWN0KQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpNYWNoT1lBTUw6OkZhdEFyY2gpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Ok1hY2hPOjpidWlsZF90b29sX3ZlcnNpb24pCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSB5YW1sIHsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaE9ZQU1MOjpGaWxlSGVhZGVyPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBNYWNoT1lBTUw6OkZpbGVIZWFkZXIgJkZpbGVIZWFkZXIpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaE9ZQU1MOjpPYmplY3Q+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIE1hY2hPWUFNTDo6T2JqZWN0ICZPYmplY3QpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaE9ZQU1MOjpGYXRIZWFkZXI+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIE1hY2hPWUFNTDo6RmF0SGVhZGVyICZGYXRIZWFkZXIpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaE9ZQU1MOjpGYXRBcmNoPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBNYWNoT1lBTUw6OkZhdEFyY2ggJkZhdEFyY2gpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaE9ZQU1MOjpVbml2ZXJzYWxCaW5hcnk+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIE1hY2hPWUFNTDo6VW5pdmVyc2FsQmluYXJ5ICZVbml2ZXJzYWxCaW5hcnkpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaE9ZQU1MOjpMb2FkQ29tbWFuZD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgTWFjaE9ZQU1MOjpMb2FkQ29tbWFuZCAmTG9hZENvbW1hbmQpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaE9ZQU1MOjpMaW5rRWRpdERhdGE+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIE1hY2hPWUFNTDo6TGlua0VkaXREYXRhICZMaW5rRWRpdERhdGEpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaE9ZQU1MOjpSZWJhc2VPcGNvZGU+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIE1hY2hPWUFNTDo6UmViYXNlT3Bjb2RlICZSZWJhc2VPcGNvZGUpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaE9ZQU1MOjpCaW5kT3Bjb2RlPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBNYWNoT1lBTUw6OkJpbmRPcGNvZGUgJkJpbmRPcGNvZGUpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaE9ZQU1MOjpFeHBvcnRFbnRyeT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgTWFjaE9ZQU1MOjpFeHBvcnRFbnRyeSAmRXhwb3J0RW50cnkpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaE9ZQU1MOjpTZWN0aW9uPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBNYWNoT1lBTUw6OlNlY3Rpb24gJlNlY3Rpb24pOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaE9ZQU1MOjpOTGlzdEVudHJ5PiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBNYWNoT1lBTUw6Ok5MaXN0RW50cnkgJk5MaXN0RW50cnkpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaE86OmJ1aWxkX3Rvb2xfdmVyc2lvbj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgTWFjaE86OmJ1aWxkX3Rvb2xfdmVyc2lvbiAmdG9vbCk7Cit9OworCisjZGVmaW5lIEhBTkRMRV9MT0FEX0NPTU1BTkQoTENOYW1lLCBMQ1ZhbHVlLCBMQ1N0cnVjdCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpby5lbnVtQ2FzZSh2YWx1ZSwgI0xDTmFtZSwgTWFjaE86OkxDTmFtZSk7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxNYWNoTzo6TG9hZENvbW1hbmRUeXBlPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZpbywgTWFjaE86OkxvYWRDb21tYW5kVHlwZSAmdmFsdWUpIHsKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9NYWNoTy5kZWYiCisgICAgaW8uZW51bUZhbGxiYWNrPEhleDMyPih2YWx1ZSk7CisgIH0KK307CisKKyNkZWZpbmUgRU5VTV9DQVNFKEVudW0pIGlvLmVudW1DYXNlKHZhbHVlLCAjRW51bSwgTWFjaE86OkVudW0pOworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8TWFjaE86OlJlYmFzZU9wY29kZT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmaW8sIE1hY2hPOjpSZWJhc2VPcGNvZGUgJnZhbHVlKSB7CisgICAgRU5VTV9DQVNFKFJFQkFTRV9PUENPREVfRE9ORSkKKyAgICBFTlVNX0NBU0UoUkVCQVNFX09QQ09ERV9TRVRfVFlQRV9JTU0pCisgICAgRU5VTV9DQVNFKFJFQkFTRV9PUENPREVfU0VUX1NFR01FTlRfQU5EX09GRlNFVF9VTEVCKQorICAgIEVOVU1fQ0FTRShSRUJBU0VfT1BDT0RFX0FERF9BRERSX1VMRUIpCisgICAgRU5VTV9DQVNFKFJFQkFTRV9PUENPREVfQUREX0FERFJfSU1NX1NDQUxFRCkKKyAgICBFTlVNX0NBU0UoUkVCQVNFX09QQ09ERV9ET19SRUJBU0VfSU1NX1RJTUVTKQorICAgIEVOVU1fQ0FTRShSRUJBU0VfT1BDT0RFX0RPX1JFQkFTRV9VTEVCX1RJTUVTKQorICAgIEVOVU1fQ0FTRShSRUJBU0VfT1BDT0RFX0RPX1JFQkFTRV9BRERfQUREUl9VTEVCKQorICAgIEVOVU1fQ0FTRShSRUJBU0VfT1BDT0RFX0RPX1JFQkFTRV9VTEVCX1RJTUVTX1NLSVBQSU5HX1VMRUIpCisgICAgaW8uZW51bUZhbGxiYWNrPEhleDg+KHZhbHVlKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPE1hY2hPOjpCaW5kT3Bjb2RlPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZpbywgTWFjaE86OkJpbmRPcGNvZGUgJnZhbHVlKSB7CisgICAgRU5VTV9DQVNFKEJJTkRfT1BDT0RFX0RPTkUpCisgICAgRU5VTV9DQVNFKEJJTkRfT1BDT0RFX1NFVF9EWUxJQl9PUkRJTkFMX0lNTSkKKyAgICBFTlVNX0NBU0UoQklORF9PUENPREVfU0VUX0RZTElCX09SRElOQUxfVUxFQikKKyAgICBFTlVNX0NBU0UoQklORF9PUENPREVfU0VUX0RZTElCX1NQRUNJQUxfSU1NKQorICAgIEVOVU1fQ0FTRShCSU5EX09QQ09ERV9TRVRfU1lNQk9MX1RSQUlMSU5HX0ZMQUdTX0lNTSkKKyAgICBFTlVNX0NBU0UoQklORF9PUENPREVfU0VUX1RZUEVfSU1NKQorICAgIEVOVU1fQ0FTRShCSU5EX09QQ09ERV9TRVRfQURERU5EX1NMRUIpCisgICAgRU5VTV9DQVNFKEJJTkRfT1BDT0RFX1NFVF9TRUdNRU5UX0FORF9PRkZTRVRfVUxFQikKKyAgICBFTlVNX0NBU0UoQklORF9PUENPREVfQUREX0FERFJfVUxFQikKKyAgICBFTlVNX0NBU0UoQklORF9PUENPREVfRE9fQklORCkKKyAgICBFTlVNX0NBU0UoQklORF9PUENPREVfRE9fQklORF9BRERfQUREUl9VTEVCKQorICAgIEVOVU1fQ0FTRShCSU5EX09QQ09ERV9ET19CSU5EX0FERF9BRERSX0lNTV9TQ0FMRUQpCisgICAgRU5VTV9DQVNFKEJJTkRfT1BDT0RFX0RPX0JJTkRfVUxFQl9USU1FU19TS0lQUElOR19VTEVCKQorICAgIGlvLmVudW1GYWxsYmFjazxIZXg4Pih2YWx1ZSk7CisgIH0KK307CisKKy8vIFRoaXMgdHJhaXQgaXMgdXNlZCBmb3IgMTYtYnl0ZSBjaGFycyBpbiBNYWNoIHN0cnVjdHVyZXMgdXNlZCBmb3Igc3RyaW5ncwordXNpbmcgY2hhcl8xNiA9IGNoYXJbMTZdOworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyVHJhaXRzPGNoYXJfMTY+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IGNoYXJfMTYgJlZhbCwgdm9pZCAqLCByYXdfb3N0cmVhbSAmT3V0KTsKKyAgc3RhdGljIFN0cmluZ1JlZiBpbnB1dChTdHJpbmdSZWYgU2NhbGFyLCB2b2lkICosIGNoYXJfMTYgJlZhbCk7CisgIHN0YXRpYyBRdW90aW5nVHlwZSBtdXN0UXVvdGUoU3RyaW5nUmVmIFMpOworfTsKKworLy8gVGhpcyB0cmFpdCBpcyB1c2VkIGZvciBVVUlEcy4gSXQgcmVhZHMgYW5kIHdyaXRlcyB0aGVtIG1hdGNoaW5nIG90b29sJ3MKKy8vIGZvcm1hdHRpbmcgc3R5bGUuCit1c2luZyB1dWlkX3QgPSByYXdfb3N0cmVhbTo6dXVpZF90OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyVHJhaXRzPHV1aWRfdD4geworICBzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgdXVpZF90ICZWYWwsIHZvaWQgKiwgcmF3X29zdHJlYW0gJk91dCk7CisgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmIFNjYWxhciwgdm9pZCAqLCB1dWlkX3QgJlZhbCk7CisgIHN0YXRpYyBRdW90aW5nVHlwZSBtdXN0UXVvdGUoU3RyaW5nUmVmIFMpOworfTsKKworLy8gTG9hZCBDb21tYW5kIHN0cnVjdCBtYXBwaW5nIHRyYWl0cworCisjZGVmaW5lIExPQURfQ09NTUFORF9TVFJVQ1QoTENTdHJ1Y3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoTzo6TENTdHJ1Y3Q+IHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgTWFjaE86OkxDU3RydWN0ICZMb2FkQ29tbWFuZCk7ICAgICAgICAgICAgICAgICBcCisgIH07CisKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9NYWNoTy5kZWYiCisKKy8vIEV4dHJhIHN0cnVjdHVyZXMgdXNlZCBieSBsb2FkIGNvbW1hbmRzCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoTzo6ZHlsaWI+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIE1hY2hPOjpkeWxpYiAmTG9hZENvbW1hbmQpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaE86OmZ2bWxpYj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgTWFjaE86OmZ2bWxpYiAmTG9hZENvbW1hbmQpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaE86OnNlY3Rpb24+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIE1hY2hPOjpzZWN0aW9uICZMb2FkQ29tbWFuZCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoTzo6c2VjdGlvbl82ND4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgTWFjaE86OnNlY3Rpb25fNjQgJkxvYWRDb21tYW5kKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSB5YW1sCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX09CSkVDVFlBTUxfTUFDSE9ZQU1MX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9PYmplY3RZQU1MLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvT2JqZWN0WUFNTC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwY2U4NjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvT2JqZWN0WUFNTC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09LSBPYmplY3RZQU1MLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RZQU1MX09CSkVDVFlBTUxfSAorI2RlZmluZSBMTFZNX09CSkVDVFlBTUxfT0JKRUNUWUFNTF9ICisKKyNpbmNsdWRlICJsbHZtL09iamVjdFlBTUwvQ09GRllBTUwuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdFlBTUwvRUxGWUFNTC5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0WUFNTC9NYWNoT1lBTUwuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdFlBTUwvV2FzbVlBTUwuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvWUFNTFRyYWl0cy5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHlhbWwgeworCitjbGFzcyBJTzsKKworc3RydWN0IFlhbWxPYmplY3RGaWxlIHsKKyAgc3RkOjp1bmlxdWVfcHRyPEVMRllBTUw6Ok9iamVjdD4gRWxmOworICBzdGQ6OnVuaXF1ZV9wdHI8Q09GRllBTUw6Ok9iamVjdD4gQ29mZjsKKyAgc3RkOjp1bmlxdWVfcHRyPE1hY2hPWUFNTDo6T2JqZWN0PiBNYWNoTzsKKyAgc3RkOjp1bmlxdWVfcHRyPE1hY2hPWUFNTDo6VW5pdmVyc2FsQmluYXJ5PiBGYXRNYWNoTzsKKyAgc3RkOjp1bmlxdWVfcHRyPFdhc21ZQU1MOjpPYmplY3Q+IFdhc207Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxZYW1sT2JqZWN0RmlsZT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgWWFtbE9iamVjdEZpbGUgJk9iamVjdEZpbGUpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHlhbWwKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX09CSkVDVFlBTUxfT0JKRUNUWUFNTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvV2FzbVlBTUwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9XYXNtWUFNTC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNWU3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvV2FzbVlBTUwuaApAQCAtMCwwICsxLDQ3NiBAQAorLy89PT0tIFdhc21ZQU1MLmggLSBXYXNtIFlBTUxJTyBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIFRoaXMgZmlsZSBkZWNsYXJlcyBjbGFzc2VzIGZvciBoYW5kbGluZyB0aGUgWUFNTCByZXByZXNlbnRhdGlvbgorLy8vIG9mIHdhc20gYmluYXJpZXMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RZQU1MX1dBU01ZQU1MX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RZQU1MX1dBU01ZQU1MX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L1dhc20uaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdFlBTUwvWUFNTC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgV2FzbVlBTUwgeworCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDMyX3QsIFNlY3Rpb25UeXBlKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQzMl90LCBWYWx1ZVR5cGUpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDMyX3QsIFRhYmxlVHlwZSkKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50MzJfdCwgU2lnbmF0dXJlRm9ybSkKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50MzJfdCwgRXhwb3J0S2luZCkKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50MzJfdCwgT3Bjb2RlKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQzMl90LCBSZWxvY1R5cGUpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDMyX3QsIFN5bWJvbEZsYWdzKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQzMl90LCBTeW1ib2xLaW5kKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQzMl90LCBTZWdtZW50RmxhZ3MpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDMyX3QsIExpbWl0RmxhZ3MpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDMyX3QsIENvbWRhdEtpbmQpCisKK3N0cnVjdCBGaWxlSGVhZGVyIHsKKyAgeWFtbDo6SGV4MzIgVmVyc2lvbjsKK307CisKK3N0cnVjdCBMaW1pdHMgeworICBMaW1pdEZsYWdzIEZsYWdzOworICB5YW1sOjpIZXgzMiBJbml0aWFsOworICB5YW1sOjpIZXgzMiBNYXhpbXVtOworfTsKKworc3RydWN0IFRhYmxlIHsKKyAgVGFibGVUeXBlIEVsZW1UeXBlOworICBMaW1pdHMgVGFibGVMaW1pdHM7Cit9OworCitzdHJ1Y3QgRXhwb3J0IHsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIEV4cG9ydEtpbmQgS2luZDsKKyAgdWludDMyX3QgSW5kZXg7Cit9OworCitzdHJ1Y3QgRWxlbVNlZ21lbnQgeworICB1aW50MzJfdCBUYWJsZUluZGV4OworICB3YXNtOjpXYXNtSW5pdEV4cHIgT2Zmc2V0OworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gRnVuY3Rpb25zOworfTsKKworc3RydWN0IEdsb2JhbCB7CisgIHVpbnQzMl90IEluZGV4OworICBWYWx1ZVR5cGUgVHlwZTsKKyAgYm9vbCBNdXRhYmxlOworICB3YXNtOjpXYXNtSW5pdEV4cHIgSW5pdEV4cHI7Cit9OworCitzdHJ1Y3QgSW1wb3J0IHsKKyAgU3RyaW5nUmVmIE1vZHVsZTsKKyAgU3RyaW5nUmVmIEZpZWxkOworICBFeHBvcnRLaW5kIEtpbmQ7CisgIHVuaW9uIHsKKyAgICB1aW50MzJfdCBTaWdJbmRleDsKKyAgICBHbG9iYWwgR2xvYmFsSW1wb3J0OworICAgIFRhYmxlIFRhYmxlSW1wb3J0OworICAgIExpbWl0cyBNZW1vcnk7CisgIH07Cit9OworCitzdHJ1Y3QgTG9jYWxEZWNsIHsKKyAgVmFsdWVUeXBlIFR5cGU7CisgIHVpbnQzMl90IENvdW50OworfTsKKworc3RydWN0IEZ1bmN0aW9uIHsKKyAgdWludDMyX3QgSW5kZXg7CisgIHN0ZDo6dmVjdG9yPExvY2FsRGVjbD4gTG9jYWxzOworICB5YW1sOjpCaW5hcnlSZWYgQm9keTsKK307CisKK3N0cnVjdCBSZWxvY2F0aW9uIHsKKyAgUmVsb2NUeXBlIFR5cGU7CisgIHVpbnQzMl90IEluZGV4OworICB5YW1sOjpIZXgzMiBPZmZzZXQ7CisgIGludDMyX3QgQWRkZW5kOworfTsKKworc3RydWN0IERhdGFTZWdtZW50IHsKKyAgdWludDMyX3QgTWVtb3J5SW5kZXg7CisgIHVpbnQzMl90IFNlY3Rpb25PZmZzZXQ7CisgIHdhc206Oldhc21Jbml0RXhwciBPZmZzZXQ7CisgIHlhbWw6OkJpbmFyeVJlZiBDb250ZW50OworfTsKKworc3RydWN0IE5hbWVFbnRyeSB7CisgIHVpbnQzMl90IEluZGV4OworICBTdHJpbmdSZWYgTmFtZTsKK307CisKK3N0cnVjdCBTZWdtZW50SW5mbyB7CisgIHVpbnQzMl90IEluZGV4OworICBTdHJpbmdSZWYgTmFtZTsKKyAgdWludDMyX3QgQWxpZ25tZW50OworICBTZWdtZW50RmxhZ3MgRmxhZ3M7Cit9OworCitzdHJ1Y3QgU2lnbmF0dXJlIHsKKyAgdWludDMyX3QgSW5kZXg7CisgIFNpZ25hdHVyZUZvcm0gRm9ybSA9IHdhc206OldBU01fVFlQRV9GVU5DOworICBzdGQ6OnZlY3RvcjxWYWx1ZVR5cGU+IFBhcmFtVHlwZXM7CisgIFZhbHVlVHlwZSBSZXR1cm5UeXBlOworfTsKKworc3RydWN0IFN5bWJvbEluZm8geworICB1aW50MzJfdCBJbmRleDsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIFN5bWJvbEtpbmQgS2luZDsKKyAgU3ltYm9sRmxhZ3MgRmxhZ3M7CisgIHVuaW9uIHsKKyAgICB1aW50MzJfdCBFbGVtZW50SW5kZXg7CisgICAgd2FzbTo6V2FzbURhdGFSZWZlcmVuY2UgRGF0YVJlZjsKKyAgfTsKK307CisKK3N0cnVjdCBJbml0RnVuY3Rpb24geworICB1aW50MzJfdCBQcmlvcml0eTsKKyAgdWludDMyX3QgU3ltYm9sOworfTsKKworc3RydWN0IENvbWRhdEVudHJ5IHsKKyAgQ29tZGF0S2luZCBLaW5kOworICB1aW50MzJfdCBJbmRleDsKK307CisKK3N0cnVjdCBDb21kYXQgeworICBTdHJpbmdSZWYgTmFtZTsKKyAgc3RkOjp2ZWN0b3I8Q29tZGF0RW50cnk+IEVudHJpZXM7Cit9OworCitzdHJ1Y3QgU2VjdGlvbiB7CisgIGV4cGxpY2l0IFNlY3Rpb24oU2VjdGlvblR5cGUgU2VjVHlwZSkgOiBUeXBlKFNlY1R5cGUpIHt9CisgIHZpcnR1YWwgflNlY3Rpb24oKTsKKworICBTZWN0aW9uVHlwZSBUeXBlOworICBzdGQ6OnZlY3RvcjxSZWxvY2F0aW9uPiBSZWxvY2F0aW9uczsKK307CisKK3N0cnVjdCBDdXN0b21TZWN0aW9uIDogU2VjdGlvbiB7CisgIGV4cGxpY2l0IEN1c3RvbVNlY3Rpb24oU3RyaW5nUmVmIE5hbWUpCisgICAgICA6IFNlY3Rpb24od2FzbTo6V0FTTV9TRUNfQ1VTVE9NKSwgTmFtZShOYW1lKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU2VjdGlvbiAqUykgeworICAgIHJldHVybiBTLT5UeXBlID09IHdhc206OldBU01fU0VDX0NVU1RPTTsKKyAgfQorCisgIFN0cmluZ1JlZiBOYW1lOworICB5YW1sOjpCaW5hcnlSZWYgUGF5bG9hZDsKK307CisKK3N0cnVjdCBOYW1lU2VjdGlvbiA6IEN1c3RvbVNlY3Rpb24geworICBOYW1lU2VjdGlvbigpIDogQ3VzdG9tU2VjdGlvbigibmFtZSIpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTZWN0aW9uICpTKSB7CisgICAgYXV0byBDID0gZHluX2Nhc3Q8Q3VzdG9tU2VjdGlvbj4oUyk7CisgICAgcmV0dXJuIEMgJiYgQy0+TmFtZSA9PSAibmFtZSI7CisgIH0KKworICBzdGQ6OnZlY3RvcjxOYW1lRW50cnk+IEZ1bmN0aW9uTmFtZXM7Cit9OworCitzdHJ1Y3QgTGlua2luZ1NlY3Rpb24gOiBDdXN0b21TZWN0aW9uIHsKKyAgTGlua2luZ1NlY3Rpb24oKSA6IEN1c3RvbVNlY3Rpb24oImxpbmtpbmciKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU2VjdGlvbiAqUykgeworICAgIGF1dG8gQyA9IGR5bl9jYXN0PEN1c3RvbVNlY3Rpb24+KFMpOworICAgIHJldHVybiBDICYmIEMtPk5hbWUgPT0gImxpbmtpbmciOworICB9CisKKyAgc3RkOjp2ZWN0b3I8U3ltYm9sSW5mbz4gU3ltYm9sVGFibGU7CisgIHN0ZDo6dmVjdG9yPFNlZ21lbnRJbmZvPiBTZWdtZW50SW5mb3M7CisgIHN0ZDo6dmVjdG9yPEluaXRGdW5jdGlvbj4gSW5pdEZ1bmN0aW9uczsKKyAgc3RkOjp2ZWN0b3I8Q29tZGF0PiBDb21kYXRzOworfTsKKworc3RydWN0IFR5cGVTZWN0aW9uIDogU2VjdGlvbiB7CisgIFR5cGVTZWN0aW9uKCkgOiBTZWN0aW9uKHdhc206OldBU01fU0VDX1RZUEUpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPlR5cGUgPT0gd2FzbTo6V0FTTV9TRUNfVFlQRTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPFNpZ25hdHVyZT4gU2lnbmF0dXJlczsKK307CisKK3N0cnVjdCBJbXBvcnRTZWN0aW9uIDogU2VjdGlvbiB7CisgIEltcG9ydFNlY3Rpb24oKSA6IFNlY3Rpb24od2FzbTo6V0FTTV9TRUNfSU1QT1JUKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU2VjdGlvbiAqUykgeworICAgIHJldHVybiBTLT5UeXBlID09IHdhc206OldBU01fU0VDX0lNUE9SVDsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPEltcG9ydD4gSW1wb3J0czsKK307CisKK3N0cnVjdCBGdW5jdGlvblNlY3Rpb24gOiBTZWN0aW9uIHsKKyAgRnVuY3Rpb25TZWN0aW9uKCkgOiBTZWN0aW9uKHdhc206OldBU01fU0VDX0ZVTkNUSU9OKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU2VjdGlvbiAqUykgeworICAgIHJldHVybiBTLT5UeXBlID09IHdhc206OldBU01fU0VDX0ZVTkNUSU9OOworICB9CisKKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IEZ1bmN0aW9uVHlwZXM7Cit9OworCitzdHJ1Y3QgVGFibGVTZWN0aW9uIDogU2VjdGlvbiB7CisgIFRhYmxlU2VjdGlvbigpIDogU2VjdGlvbih3YXNtOjpXQVNNX1NFQ19UQUJMRSkge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+VHlwZSA9PSB3YXNtOjpXQVNNX1NFQ19UQUJMRTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPFRhYmxlPiBUYWJsZXM7Cit9OworCitzdHJ1Y3QgTWVtb3J5U2VjdGlvbiA6IFNlY3Rpb24geworICBNZW1vcnlTZWN0aW9uKCkgOiBTZWN0aW9uKHdhc206OldBU01fU0VDX01FTU9SWSkge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+VHlwZSA9PSB3YXNtOjpXQVNNX1NFQ19NRU1PUlk7CisgIH0KKworICBzdGQ6OnZlY3RvcjxMaW1pdHM+IE1lbW9yaWVzOworfTsKKworc3RydWN0IEdsb2JhbFNlY3Rpb24gOiBTZWN0aW9uIHsKKyAgR2xvYmFsU2VjdGlvbigpIDogU2VjdGlvbih3YXNtOjpXQVNNX1NFQ19HTE9CQUwpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPlR5cGUgPT0gd2FzbTo6V0FTTV9TRUNfR0xPQkFMOworICB9CisKKyAgc3RkOjp2ZWN0b3I8R2xvYmFsPiBHbG9iYWxzOworfTsKKworc3RydWN0IEV4cG9ydFNlY3Rpb24gOiBTZWN0aW9uIHsKKyAgRXhwb3J0U2VjdGlvbigpIDogU2VjdGlvbih3YXNtOjpXQVNNX1NFQ19FWFBPUlQpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPlR5cGUgPT0gd2FzbTo6V0FTTV9TRUNfRVhQT1JUOworICB9CisKKyAgc3RkOjp2ZWN0b3I8RXhwb3J0PiBFeHBvcnRzOworfTsKKworc3RydWN0IFN0YXJ0U2VjdGlvbiA6IFNlY3Rpb24geworICBTdGFydFNlY3Rpb24oKSA6IFNlY3Rpb24od2FzbTo6V0FTTV9TRUNfU1RBUlQpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPlR5cGUgPT0gd2FzbTo6V0FTTV9TRUNfU1RBUlQ7CisgIH0KKworICB1aW50MzJfdCBTdGFydEZ1bmN0aW9uOworfTsKKworc3RydWN0IEVsZW1TZWN0aW9uIDogU2VjdGlvbiB7CisgIEVsZW1TZWN0aW9uKCkgOiBTZWN0aW9uKHdhc206OldBU01fU0VDX0VMRU0pIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPlR5cGUgPT0gd2FzbTo6V0FTTV9TRUNfRUxFTTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPEVsZW1TZWdtZW50PiBTZWdtZW50czsKK307CisKK3N0cnVjdCBDb2RlU2VjdGlvbiA6IFNlY3Rpb24geworICBDb2RlU2VjdGlvbigpIDogU2VjdGlvbih3YXNtOjpXQVNNX1NFQ19DT0RFKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU2VjdGlvbiAqUykgeworICAgIHJldHVybiBTLT5UeXBlID09IHdhc206OldBU01fU0VDX0NPREU7CisgIH0KKworICBzdGQ6OnZlY3RvcjxGdW5jdGlvbj4gRnVuY3Rpb25zOworfTsKKworc3RydWN0IERhdGFTZWN0aW9uIDogU2VjdGlvbiB7CisgIERhdGFTZWN0aW9uKCkgOiBTZWN0aW9uKHdhc206OldBU01fU0VDX0RBVEEpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPlR5cGUgPT0gd2FzbTo6V0FTTV9TRUNfREFUQTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPERhdGFTZWdtZW50PiBTZWdtZW50czsKK307CisKK3N0cnVjdCBPYmplY3QgeworICBGaWxlSGVhZGVyIEhlYWRlcjsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFNlY3Rpb24+PiBTZWN0aW9uczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBXYXNtWUFNTAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6V2FzbVlBTUw6OlNlY3Rpb24+KQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpXYXNtWUFNTDo6U2lnbmF0dXJlKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpXYXNtWUFNTDo6VmFsdWVUeXBlKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpXYXNtWUFNTDo6VGFibGUpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Oldhc21ZQU1MOjpJbXBvcnQpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Oldhc21ZQU1MOjpFeHBvcnQpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Oldhc21ZQU1MOjpFbGVtU2VnbWVudCkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6V2FzbVlBTUw6OkxpbWl0cykKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6V2FzbVlBTUw6OkRhdGFTZWdtZW50KQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpXYXNtWUFNTDo6R2xvYmFsKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpXYXNtWUFNTDo6RnVuY3Rpb24pCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Oldhc21ZQU1MOjpMb2NhbERlY2wpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Oldhc21ZQU1MOjpSZWxvY2F0aW9uKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpXYXNtWUFNTDo6TmFtZUVudHJ5KQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpXYXNtWUFNTDo6U2VnbWVudEluZm8pCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Oldhc21ZQU1MOjpTeW1ib2xJbmZvKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpXYXNtWUFNTDo6SW5pdEZ1bmN0aW9uKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpXYXNtWUFNTDo6Q29tZGF0RW50cnkpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Oldhc21ZQU1MOjpDb21kYXQpCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSB5YW1sIHsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8V2FzbVlBTUw6OkZpbGVIZWFkZXI+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIFdhc21ZQU1MOjpGaWxlSGVhZGVyICZGaWxlSGRyKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPHN0ZDo6dW5pcXVlX3B0cjxXYXNtWUFNTDo6U2VjdGlvbj4+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIHN0ZDo6dW5pcXVlX3B0cjxXYXNtWUFNTDo6U2VjdGlvbj4gJlNlY3Rpb24pOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8V2FzbVlBTUw6Ok9iamVjdD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgV2FzbVlBTUw6Ok9iamVjdCAmT2JqZWN0KTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPFdhc21ZQU1MOjpJbXBvcnQ+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIFdhc21ZQU1MOjpJbXBvcnQgJkltcG9ydCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxXYXNtWUFNTDo6RXhwb3J0PiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBXYXNtWUFNTDo6RXhwb3J0ICZFeHBvcnQpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8V2FzbVlBTUw6Okdsb2JhbD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgV2FzbVlBTUw6Okdsb2JhbCAmR2xvYmFsKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJCaXRTZXRUcmFpdHM8V2FzbVlBTUw6OkxpbWl0RmxhZ3M+IHsKKyAgc3RhdGljIHZvaWQgYml0c2V0KElPICZJTywgV2FzbVlBTUw6OkxpbWl0RmxhZ3MgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJCaXRTZXRUcmFpdHM8V2FzbVlBTUw6OlN5bWJvbEZsYWdzPiB7CisgIHN0YXRpYyB2b2lkIGJpdHNldChJTyAmSU8sIFdhc21ZQU1MOjpTeW1ib2xGbGFncyAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPFdhc21ZQU1MOjpTeW1ib2xLaW5kPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgV2FzbVlBTUw6OlN5bWJvbEtpbmQgJktpbmQpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckJpdFNldFRyYWl0czxXYXNtWUFNTDo6U2VnbWVudEZsYWdzPiB7CisgIHN0YXRpYyB2b2lkIGJpdHNldChJTyAmSU8sIFdhc21ZQU1MOjpTZWdtZW50RmxhZ3MgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxXYXNtWUFNTDo6U2VjdGlvblR5cGU+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBXYXNtWUFNTDo6U2VjdGlvblR5cGUgJlR5cGUpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8V2FzbVlBTUw6OlNpZ25hdHVyZT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgV2FzbVlBTUw6OlNpZ25hdHVyZSAmU2lnbmF0dXJlKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPFdhc21ZQU1MOjpUYWJsZT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgV2FzbVlBTUw6OlRhYmxlICZUYWJsZSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxXYXNtWUFNTDo6TGltaXRzPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBXYXNtWUFNTDo6TGltaXRzICZMaW1pdHMpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8V2FzbVlBTUw6OkZ1bmN0aW9uPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBXYXNtWUFNTDo6RnVuY3Rpb24gJkZ1bmN0aW9uKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPFdhc21ZQU1MOjpSZWxvY2F0aW9uPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBXYXNtWUFNTDo6UmVsb2NhdGlvbiAmUmVsb2NhdGlvbik7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxXYXNtWUFNTDo6TmFtZUVudHJ5PiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBXYXNtWUFNTDo6TmFtZUVudHJ5ICZOYW1lRW50cnkpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8V2FzbVlBTUw6OlNlZ21lbnRJbmZvPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBXYXNtWUFNTDo6U2VnbWVudEluZm8gJlNlZ21lbnRJbmZvKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPFdhc21ZQU1MOjpMb2NhbERlY2w+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIFdhc21ZQU1MOjpMb2NhbERlY2wgJkxvY2FsRGVjbCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czx3YXNtOjpXYXNtSW5pdEV4cHI+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIHdhc206Oldhc21Jbml0RXhwciAmRXhwcik7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxXYXNtWUFNTDo6RGF0YVNlZ21lbnQ+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIFdhc21ZQU1MOjpEYXRhU2VnbWVudCAmU2VnbWVudCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxXYXNtWUFNTDo6RWxlbVNlZ21lbnQ+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIFdhc21ZQU1MOjpFbGVtU2VnbWVudCAmU2VnbWVudCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxXYXNtWUFNTDo6U3ltYm9sSW5mbz4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgV2FzbVlBTUw6OlN5bWJvbEluZm8gJkluZm8pOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8V2FzbVlBTUw6OkluaXRGdW5jdGlvbj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgV2FzbVlBTUw6OkluaXRGdW5jdGlvbiAmSW5pdCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8V2FzbVlBTUw6OkNvbWRhdEtpbmQ+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBXYXNtWUFNTDo6Q29tZGF0S2luZCAmS2luZCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxXYXNtWUFNTDo6Q29tZGF0RW50cnk+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIFdhc21ZQU1MOjpDb21kYXRFbnRyeSAmQ29tZGF0RW50cnkpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8V2FzbVlBTUw6OkNvbWRhdD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgV2FzbVlBTUw6OkNvbWRhdCAmQ29tZGF0KTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxXYXNtWUFNTDo6VmFsdWVUeXBlPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgV2FzbVlBTUw6OlZhbHVlVHlwZSAmVHlwZSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8V2FzbVlBTUw6OkV4cG9ydEtpbmQ+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBXYXNtWUFNTDo6RXhwb3J0S2luZCAmS2luZCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8V2FzbVlBTUw6OlRhYmxlVHlwZT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIFdhc21ZQU1MOjpUYWJsZVR5cGUgJlR5cGUpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPFdhc21ZQU1MOjpPcGNvZGU+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBXYXNtWUFNTDo6T3Bjb2RlICZPcGNvZGUpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPFdhc21ZQU1MOjpSZWxvY1R5cGU+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBXYXNtWUFNTDo6UmVsb2NUeXBlICZLaW5kKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSB5YW1sCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RZQU1MX1dBU01ZQU1MX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9ZQU1MLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvWUFNTC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMjY2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvWUFNTC5oCkBAIC0wLDAgKzEsMTE3IEBACisvLz09PS0gWUFNTC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUWUFNTF9ZQU1MX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RZQU1MX1lBTUxfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvWUFNTFRyYWl0cy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSB5YW1sIHsKKworLy8vIFxicmllZiBTcGVjaWFsaXplZCBZQU1MSU8gc2NhbGFyIHR5cGUgZm9yIHJlcHJlc2VudGluZyBhIGJpbmFyeSBibG9iLgorLy8vCisvLy8gQSB0eXBpY2FsIHVzZSBjYXNlIHdvdWxkIGJlIHRvIHJlcHJlc2VudCB0aGUgY29udGVudCBvZiBhIHNlY3Rpb24gaW4gYQorLy8vIGJpbmFyeSBmaWxlLgorLy8vIFRoaXMgY2xhc3MgaGFzIGN1c3RvbSBZQU1MSU8gdHJhaXRzIGZvciBjb252ZW5pZW50IHJlYWRpbmcgYW5kIHdyaXRpbmcuCisvLy8gSXQgcmVuZGVycyBhcyBhIHN0cmluZyBvZiBoZXggZGlnaXRzIGluIGEgWUFNTCBmaWxlLgorLy8vIEZvciBleGFtcGxlLCBpdCBtaWdodCByZW5kZXIgYXMgYERFQURCRUVGQ0FGRUJBQkVgIChZQU1MIGRvZXMgbm90CisvLy8gcmVxdWlyZSB0aGUgcXVvdGF0aW9uIG1hcmtzLCBzbyBmb3Igc2ltcGxpY2l0eSB3aGVuIG91dHB1dHRpbmcgdGhleSBhcmUKKy8vLyBvbWl0dGVkKS4KKy8vLyBXaGVuIHJlYWRpbmcsIGFueSBzdHJpbmcgd2hvc2UgY29udGVudCBpcyBhbiBldmVuIG51bWJlciBvZiBoZXggZGlnaXRzCisvLy8gd2lsbCBiZSBhY2NlcHRlZC4KKy8vLyBGb3IgZXhhbXBsZSwgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYXJlIGFjY2VwdGFibGU6CisvLy8gYERFQURCRUVGYCwgYCJEZUFEYkVlRiJgLCBgIlx4NDRFQURCRUVGImAgKE5vdGU6ICdceDQ0JyA9PSAnRCcpCisvLy8KKy8vLyBBIHNpZ25pZmljYW50IGFkdmFudGFnZSBvZiB1c2luZyB0aGlzIGNsYXNzIGlzIHRoYXQgaXQgbmV2ZXIgYWxsb2NhdGVzCisvLy8gdGVtcG9yYXJ5IHN0cmluZ3Mgb3IgYnVmZmVycyBmb3IgYW55IG9mIGl0cyBmdW5jdGlvbmFsaXR5LgorLy8vCisvLy8gRXhhbXBsZToKKy8vLworLy8vIFRoZSBZQU1MIG1hcHBpbmc6CisvLy8gXGNvZGUKKy8vLyBGb286IERFQURCRUVGQ0FGRUJBQkUKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gQ291bGQgYmUgbW9kZWxlZCBpbiBZQU1MSU8gYnkgdGhlIHN0cnVjdDoKKy8vLyBcY29kZQorLy8vIHN0cnVjdCBGb29Ib2xkZXIgeworLy8vICAgQmluYXJ5UmVmIEZvbzsKKy8vLyB9OworLy8vIG5hbWVzcGFjZSBsbHZtIHsKKy8vLyBuYW1lc3BhY2UgeWFtbCB7CisvLy8gdGVtcGxhdGUgPD4KKy8vLyBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxGb29Ib2xkZXI+IHsKKy8vLyAgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBGb29Ib2xkZXIgJkZIKSB7CisvLy8gICAgIElPLm1hcFJlcXVpcmVkKCJGb28iLCBGSC5Gb28pOworLy8vICAgfQorLy8vIH07CisvLy8gfSAvLyBlbmQgbmFtZXNwYWNlIHlhbWwKKy8vLyB9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorLy8vIFxlbmRjb2RlCitjbGFzcyBCaW5hcnlSZWYgeworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEJpbmFyeVJlZiAmTEhTLCBjb25zdCBCaW5hcnlSZWYgJlJIUyk7CisKKyAgLy8vIFxicmllZiBFaXRoZXIgcmF3IGJpbmFyeSBkYXRhLCBvciBhIHN0cmluZyBvZiBoZXggYnl0ZXMgKG11c3QgYWx3YXlzCisgIC8vLyBiZSBhbiBldmVuIG51bWJlciBvZiBjaGFyYWN0ZXJzKS4KKyAgQXJyYXlSZWY8dWludDhfdD4gRGF0YTsKKworICAvLy8gXGJyaWVmIERpc2NyaW1pbmF0b3IgYmV0d2VlbiB0aGUgdHdvIHN0YXRlcyBvZiB0aGUgYERhdGFgIG1lbWJlci4KKyAgYm9vbCBEYXRhSXNIZXhTdHJpbmcgPSB0cnVlOworCitwdWJsaWM6CisgIEJpbmFyeVJlZigpID0gZGVmYXVsdDsKKyAgQmluYXJ5UmVmKEFycmF5UmVmPHVpbnQ4X3Q+IERhdGEpIDogRGF0YShEYXRhKSwgRGF0YUlzSGV4U3RyaW5nKGZhbHNlKSB7fQorICBCaW5hcnlSZWYoU3RyaW5nUmVmIERhdGEpCisgICAgICA6IERhdGEocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KERhdGEuZGF0YSgpKSwgRGF0YS5zaXplKCkpIHt9CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIHJlcHJlc2VudGVkIGJ5IHRoaXMgQmluYXJ5UmVmLgorICAvLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd3JpdGVBc0JpbmFyeSgpIHdpbGwgd3JpdGUuCisgIEFycmF5UmVmPHVpbnQ4X3Q+OjpzaXplX3R5cGUgYmluYXJ5X3NpemUoKSBjb25zdCB7CisgICAgaWYgKERhdGFJc0hleFN0cmluZykKKyAgICAgIHJldHVybiBEYXRhLnNpemUoKSAvIDI7CisgICAgcmV0dXJuIERhdGEuc2l6ZSgpOworICB9CisKKyAgLy8vIFxicmllZiBXcml0ZSB0aGUgY29udGVudHMgKHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBiaW5hcnkgb3IgYQorICAvLy8gaGV4IHN0cmluZykgYXMgYmluYXJ5IHRvIHRoZSBnaXZlbiByYXdfb3N0cmVhbS4KKyAgdm9pZCB3cml0ZUFzQmluYXJ5KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBXcml0ZSB0aGUgY29udGVudHMgKHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBiaW5hcnkgb3IgYQorICAvLy8gaGV4IHN0cmluZykgYXMgaGV4IHRvIHRoZSBnaXZlbiByYXdfb3N0cmVhbS4KKyAgLy8vCisgIC8vLyBGb3IgZXhhbXBsZSwgYSBwb3NzaWJsZSBvdXRwdXQgY291bGQgYmUgYERFQURCRUVGQ0FGRUJBQkVgLgorICB2b2lkIHdyaXRlQXNIZXgocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQmluYXJ5UmVmICZMSFMsIGNvbnN0IEJpbmFyeVJlZiAmUkhTKSB7CisgIC8vIFNwZWNpYWwgY2FzZSBmb3IgZGVmYXVsdCBjb25zdHJ1Y3RlZCBCaW5hcnlSZWYuCisgIGlmIChMSFMuRGF0YS5lbXB0eSgpICYmIFJIUy5EYXRhLmVtcHR5KCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIExIUy5EYXRhSXNIZXhTdHJpbmcgPT0gUkhTLkRhdGFJc0hleFN0cmluZyAmJiBMSFMuRGF0YSA9PSBSSFMuRGF0YTsKK30KKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhclRyYWl0czxCaW5hcnlSZWY+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IEJpbmFyeVJlZiAmLCB2b2lkICosIHJhd19vc3RyZWFtICYpOworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiwgdm9pZCAqLCBCaW5hcnlSZWYgJik7CisgIHN0YXRpYyBRdW90aW5nVHlwZSBtdXN0UXVvdGUoU3RyaW5nUmVmIFMpIHsgcmV0dXJuIG5lZWRzUXVvdGVzKFMpOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgeWFtbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RZQU1MX1lBTUxfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PcHRpb24vQXJnLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09wdGlvbi9BcmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTE5YTRhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PcHRpb24vQXJnLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8vPT09LSBBcmcuaCAtIFBhcnNlZCBBcmd1bWVudCBDbGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIHRoZSBsbHZtOjpBcmcgY2xhc3MgZm9yIHBhcnNlZCBhcmd1bWVudHMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PUFRJT05fQVJHX0gKKyNkZWZpbmUgTExWTV9PUFRJT05fQVJHX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9PcHRpb24vT3B0aW9uLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCituYW1lc3BhY2Ugb3B0IHsKKworY2xhc3MgQXJnTGlzdDsKKworLy8vIFxicmllZiBBIGNvbmNyZXRlIGluc3RhbmNlIG9mIGEgcGFydGljdWxhciBkcml2ZXIgb3B0aW9uLgorLy8vCisvLy8gVGhlIEFyZyBjbGFzcyBlbmNvZGVzIGp1c3QgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGJlIGFibGUgdG8KKy8vLyBkZXJpdmUgdGhlIGFyZ3VtZW50IHZhbHVlcyBlZmZpY2llbnRseS4KK2NsYXNzIEFyZyB7Citwcml2YXRlOgorICAvLy8gXGJyaWVmIFRoZSBvcHRpb24gdGhpcyBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZi4KKyAgY29uc3QgT3B0aW9uIE9wdDsKKworICAvLy8gXGJyaWVmIFRoZSBhcmd1bWVudCB0aGlzIGFyZ3VtZW50IHdhcyBkZXJpdmVkIGZyb20gKGR1cmluZyB0b29sIGNoYWluCisgIC8vLyBhcmd1bWVudCB0cmFuc2xhdGlvbiksIGlmIGFueS4KKyAgY29uc3QgQXJnICpCYXNlQXJnOworCisgIC8vLyBcYnJpZWYgSG93IHRoaXMgaW5zdGFuY2Ugb2YgdGhlIG9wdGlvbiB3YXMgc3BlbGxlZC4KKyAgU3RyaW5nUmVmIFNwZWxsaW5nOworCisgIC8vLyBcYnJpZWYgVGhlIGluZGV4IGF0IHdoaWNoIHRoaXMgYXJndW1lbnQgYXBwZWFycyBpbiB0aGUgY29udGFpbmluZworICAvLy8gQXJnTGlzdC4KKyAgdW5zaWduZWQgSW5kZXg7CisKKyAgLy8vIFxicmllZiBXYXMgdGhpcyBhcmd1bWVudCB1c2VkIHRvIGVmZmVjdCBjb21waWxhdGlvbj8KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgZm9yIGdlbmVyYXRpbmcgImFyZ3VtZW50IHVudXNlZCIgZGlhZ25vc3RpY3MuCisgIG11dGFibGUgdW5zaWduZWQgQ2xhaW1lZCA6IDE7CisKKyAgLy8vIFxicmllZiBEb2VzIHRoaXMgYXJndW1lbnQgb3duIGl0cyB2YWx1ZXM/CisgIG11dGFibGUgdW5zaWduZWQgT3duc1ZhbHVlcyA6IDE7CisKKyAgLy8vIFxicmllZiBUaGUgYXJndW1lbnQgdmFsdWVzLCBhcyBDIHN0cmluZ3MuCisgIFNtYWxsVmVjdG9yPGNvbnN0IGNoYXIgKiwgMj4gVmFsdWVzOworCitwdWJsaWM6CisgIEFyZyhjb25zdCBPcHRpb24gT3B0LCBTdHJpbmdSZWYgU3BlbGxpbmcsIHVuc2lnbmVkIEluZGV4LAorICAgICAgY29uc3QgQXJnICpCYXNlQXJnID0gbnVsbHB0cik7CisgIEFyZyhjb25zdCBPcHRpb24gT3B0LCBTdHJpbmdSZWYgU3BlbGxpbmcsIHVuc2lnbmVkIEluZGV4LAorICAgICAgY29uc3QgY2hhciAqVmFsdWUwLCBjb25zdCBBcmcgKkJhc2VBcmcgPSBudWxscHRyKTsKKyAgQXJnKGNvbnN0IE9wdGlvbiBPcHQsIFN0cmluZ1JlZiBTcGVsbGluZywgdW5zaWduZWQgSW5kZXgsCisgICAgICBjb25zdCBjaGFyICpWYWx1ZTAsIGNvbnN0IGNoYXIgKlZhbHVlMSwgY29uc3QgQXJnICpCYXNlQXJnID0gbnVsbHB0cik7CisgIEFyZyhjb25zdCBBcmcgJikgPSBkZWxldGU7CisgIEFyZyAmb3BlcmF0b3I9KGNvbnN0IEFyZyAmKSA9IGRlbGV0ZTsKKyAgfkFyZygpOworCisgIGNvbnN0IE9wdGlvbiAmZ2V0T3B0aW9uKCkgY29uc3QgeyByZXR1cm4gT3B0OyB9CisgIFN0cmluZ1JlZiBnZXRTcGVsbGluZygpIGNvbnN0IHsgcmV0dXJuIFNwZWxsaW5nOyB9CisgIHVuc2lnbmVkIGdldEluZGV4KCkgY29uc3QgeyByZXR1cm4gSW5kZXg7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgYmFzZSBhcmd1bWVudCB3aGljaCBnZW5lcmF0ZWQgdGhpcyBhcmcuCisgIC8vLworICAvLy8gVGhpcyBpcyBlaXRoZXIgdGhlIGFyZ3VtZW50IGl0c2VsZiBvciB0aGUgYXJndW1lbnQgaXQgd2FzCisgIC8vLyBkZXJpdmVkIGZyb20gZHVyaW5nIHRvb2wgY2hhaW4gc3BlY2lmaWMgYXJndW1lbnQgdHJhbnNsYXRpb24uCisgIGNvbnN0IEFyZyAmZ2V0QmFzZUFyZygpIGNvbnN0IHsKKyAgICByZXR1cm4gQmFzZUFyZyA/ICpCYXNlQXJnIDogKnRoaXM7CisgIH0KKyAgdm9pZCBzZXRCYXNlQXJnKGNvbnN0IEFyZyAqQmFzZUFyZykgeyB0aGlzLT5CYXNlQXJnID0gQmFzZUFyZzsgfQorCisgIGJvb2wgZ2V0T3duc1ZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIE93bnNWYWx1ZXM7IH0KKyAgdm9pZCBzZXRPd25zVmFsdWVzKGJvb2wgVmFsdWUpIGNvbnN0IHsgT3duc1ZhbHVlcyA9IFZhbHVlOyB9CisKKyAgYm9vbCBpc0NsYWltZWQoKSBjb25zdCB7IHJldHVybiBnZXRCYXNlQXJnKCkuQ2xhaW1lZDsgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBBcmcgY2xhaW1lZCBiaXQuCisgIHZvaWQgY2xhaW0oKSBjb25zdCB7IGdldEJhc2VBcmcoKS5DbGFpbWVkID0gdHJ1ZTsgfQorCisgIHVuc2lnbmVkIGdldE51bVZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIFZhbHVlcy5zaXplKCk7IH0KKworICBjb25zdCBjaGFyICpnZXRWYWx1ZSh1bnNpZ25lZCBOID0gMCkgY29uc3QgeworICAgIHJldHVybiBWYWx1ZXNbTl07CisgIH0KKworICBTbWFsbFZlY3RvckltcGw8Y29uc3QgY2hhciAqPiAmZ2V0VmFsdWVzKCkgeyByZXR1cm4gVmFsdWVzOyB9CisgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxjb25zdCBjaGFyICo+ICZnZXRWYWx1ZXMoKSBjb25zdCB7IHJldHVybiBWYWx1ZXM7IH0KKworICBib29sIGNvbnRhaW5zVmFsdWUoU3RyaW5nUmVmIFZhbHVlKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bVZhbHVlcygpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChWYWx1ZXNbaV0gPT0gVmFsdWUpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQXBwZW5kIHRoZSBhcmd1bWVudCBvbnRvIHRoZSBnaXZlbiBhcnJheSBhcyBzdHJpbmdzLgorICB2b2lkIHJlbmRlcihjb25zdCBBcmdMaXN0ICZBcmdzLCBBcmdTdHJpbmdMaXN0ICZPdXRwdXQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQXBwZW5kIHRoZSBhcmd1bWVudCwgcmVuZGVyIGFzIGFuIGlucHV0LCBvbnRvIHRoZSBnaXZlbgorICAvLy8gYXJyYXkgYXMgc3RyaW5ncy4KKyAgLy8vCisgIC8vLyBUaGUgZGlzdGluY3Rpb24gaXMgdGhhdCBzb21lIG9wdGlvbnMgb25seSByZW5kZXIgdGhlaXIgdmFsdWVzCisgIC8vLyB3aGVuIHJlbmRlcmVkIGFzIGEgaW5wdXQgKGUuZy4sIFhsaW5rZXIpLgorICB2b2lkIHJlbmRlckFzSW5wdXQoY29uc3QgQXJnTGlzdCAmQXJncywgQXJnU3RyaW5nTGlzdCAmT3V0cHV0KSBjb25zdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSBmb3JtYXR0ZWQgdmVyc2lvbiBvZiB0aGUgYXJndW1lbnQgYW5kCisgIC8vLyBpdHMgdmFsdWVzLCBmb3IgZGVidWdnaW5nIGFuZCBkaWFnbm9zdGljcy4KKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoY29uc3QgQXJnTGlzdCAmQXJncykgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb3B0CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX09QVElPTl9BUkdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PcHRpb24vQXJnTGlzdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PcHRpb24vQXJnTGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MDkyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09wdGlvbi9BcmdMaXN0LmgKQEAgLTAsMCArMSw1MjMgQEAKKy8vPT09LSBBcmdMaXN0LmggLSBBcmd1bWVudCBMaXN0IE1hbmFnZW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PUFRJT05fQVJHTElTVF9ICisjZGVmaW5lIExMVk1fT1BUSU9OX0FSR0xJU1RfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9PcHRpb24vQXJnLmgiCisjaW5jbHVkZSAibGx2bS9PcHRpb24vT3B0U3BlY2lmaWVyLmgiCisjaW5jbHVkZSAibGx2bS9PcHRpb24vT3B0aW9uLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBvcHQgeworCisvLy8gYXJnX2l0ZXJhdG9yIC0gSXRlcmF0ZXMgdGhyb3VnaCBhcmd1bWVudHMgc3RvcmVkIGluc2lkZSBhbiBBcmdMaXN0LgordGVtcGxhdGU8dHlwZW5hbWUgQmFzZUl0ZXIsIHVuc2lnbmVkIE51bU9wdFNwZWNpZmllcnMgPSAwPgorY2xhc3MgYXJnX2l0ZXJhdG9yIHsKKyAgLy8vIFRoZSBjdXJyZW50IGFyZ3VtZW50IGFuZCB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZSB3ZSdyZSBpdGVyYXRpbmcuCisgIEJhc2VJdGVyIEN1cnJlbnQsIEVuZDsKKworICAvLy8gT3B0aW9uYWwgZmlsdGVycyBvbiB0aGUgYXJndW1lbnRzIHdoaWNoIHdpbGwgYmUgbWF0Y2guIFRvIGF2b2lkIGEKKyAgLy8vIHplcm8tc2l6ZWQgYXJyYXksIHdlIHN0b3JlIG9uZSBzcGVjaWZpZXIgZXZlbiBpZiB3ZSdyZSBhc2tlZCBmb3Igbm9uZS4KKyAgT3B0U3BlY2lmaWVyIElkc1tOdW1PcHRTcGVjaWZpZXJzID8gTnVtT3B0U3BlY2lmaWVycyA6IDFdOworCisgIHZvaWQgU2tpcFRvTmV4dEFyZygpIHsKKyAgICBmb3IgKDsgQ3VycmVudCAhPSBFbmQ7ICsrQ3VycmVudCkgeworICAgICAgLy8gU2tpcCBlcmFzZWQgZWxlbWVudHMuCisgICAgICBpZiAoISpDdXJyZW50KQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLy8gRG9uZSBpZiB0aGVyZSBhcmUgbm8gZmlsdGVycy4KKyAgICAgIGlmICghTnVtT3B0U3BlY2lmaWVycykKKyAgICAgICAgcmV0dXJuOworCisgICAgICAvLyBPdGhlcndpc2UgcmVxdWlyZSBhIG1hdGNoLgorICAgICAgY29uc3QgT3B0aW9uICZPID0gKCpDdXJyZW50KS0+Z2V0T3B0aW9uKCk7CisgICAgICBmb3IgKGF1dG8gSWQgOiBJZHMpIHsKKyAgICAgICAgaWYgKCFJZC5pc1ZhbGlkKCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChPLm1hdGNoZXMoSWQpKQorICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB1c2luZyBUcmFpdHMgPSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxCYXNlSXRlcj47CisKK3B1YmxpYzoKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIFRyYWl0czo6dmFsdWVfdHlwZTsKKyAgdXNpbmcgcmVmZXJlbmNlID0gdHlwZW5hbWUgVHJhaXRzOjpyZWZlcmVuY2U7CisgIHVzaW5nIHBvaW50ZXIgPSB0eXBlbmFtZSBUcmFpdHM6OnBvaW50ZXI7CisgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZzsKKyAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gc3RkOjpwdHJkaWZmX3Q7CisKKyAgYXJnX2l0ZXJhdG9yKAorICAgICAgQmFzZUl0ZXIgQ3VycmVudCwgQmFzZUl0ZXIgRW5kLAorICAgICAgY29uc3QgT3B0U3BlY2lmaWVyICgmSWRzKVtOdW1PcHRTcGVjaWZpZXJzID8gTnVtT3B0U3BlY2lmaWVycyA6IDFdID0ge30pCisgICAgICA6IEN1cnJlbnQoQ3VycmVudCksIEVuZChFbmQpIHsKKyAgICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJICE9IE51bU9wdFNwZWNpZmllcnM7ICsrSSkKKyAgICAgIHRoaXMtPklkc1tJXSA9IElkc1tJXTsKKyAgICBTa2lwVG9OZXh0QXJnKCk7CisgIH0KKworICAvLyBGSVhNRTogVGhpcyBjb252ZXJzaW9uIGZ1bmN0aW9uIG1ha2VzIG5vIHNlbnNlLgorICBvcGVyYXRvciBjb25zdCBBcmcqKCkgeyByZXR1cm4gKkN1cnJlbnQ7IH0KKworICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKkN1cnJlbnQ7IH0KKyAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gQ3VycmVudDsgfQorCisgIGFyZ19pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICArK0N1cnJlbnQ7CisgICAgU2tpcFRvTmV4dEFyZygpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGFyZ19pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgIGFyZ19pdGVyYXRvciB0bXAoKnRoaXMpOworICAgICsrKCp0aGlzKTsKKyAgICByZXR1cm4gdG1wOworICB9CisKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShhcmdfaXRlcmF0b3IgTEhTLCBhcmdfaXRlcmF0b3IgUkhTKSB7CisgICAgcmV0dXJuIExIUy5DdXJyZW50ID09IFJIUy5DdXJyZW50OworICB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oYXJnX2l0ZXJhdG9yIExIUywgYXJnX2l0ZXJhdG9yIFJIUykgeworICAgIHJldHVybiAhKExIUyA9PSBSSFMpOworICB9Cit9OworCisvLy8gQXJnTGlzdCAtIE9yZGVyZWQgY29sbGVjdGlvbiBvZiBkcml2ZXIgYXJndW1lbnRzLgorLy8vCisvLy8gVGhlIEFyZ0xpc3QgY2xhc3MgbWFuYWdlcyBhIGxpc3Qgb2YgQXJnIGluc3RhbmNlcyBhcyB3ZWxsIGFzCisvLy8gYXV4aWxpYXJ5IGRhdGEgYW5kIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gYWxsb3cgVG9vbHMgdG8gcXVpY2tseQorLy8vIGNoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgQXJnIGluc3RhbmNlcyBmb3IgYSBwYXJ0aWN1bGFyIE9wdGlvbgorLy8vIGFuZCB0byBpdGVyYXRlIG92ZXIgZ3JvdXBzIG9mIGFyZ3VtZW50cy4KK2NsYXNzIEFyZ0xpc3QgeworcHVibGljOgorICB1c2luZyBhcmdsaXN0X3R5cGUgPSBTbWFsbFZlY3RvcjxBcmcgKiwgMTY+OworICB1c2luZyBpdGVyYXRvciA9IGFyZ19pdGVyYXRvcjxhcmdsaXN0X3R5cGU6Oml0ZXJhdG9yPjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBhcmdfaXRlcmF0b3I8YXJnbGlzdF90eXBlOjpjb25zdF9pdGVyYXRvcj47CisgIHVzaW5nIHJldmVyc2VfaXRlcmF0b3IgPSBhcmdfaXRlcmF0b3I8YXJnbGlzdF90eXBlOjpyZXZlcnNlX2l0ZXJhdG9yPjsKKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciA9CisgICAgICBhcmdfaXRlcmF0b3I8YXJnbGlzdF90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yPjsKKworICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPiB1c2luZyBmaWx0ZXJlZF9pdGVyYXRvciA9CisgICAgICBhcmdfaXRlcmF0b3I8YXJnbGlzdF90eXBlOjpjb25zdF9pdGVyYXRvciwgTj47CisgIHRlbXBsYXRlPHVuc2lnbmVkIE4+IHVzaW5nIGZpbHRlcmVkX3JldmVyc2VfaXRlcmF0b3IgPQorICAgICAgYXJnX2l0ZXJhdG9yPGFyZ2xpc3RfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciwgTj47CisKK3ByaXZhdGU6CisgIC8vLyBUaGUgaW50ZXJuYWwgbGlzdCBvZiBhcmd1bWVudHMuCisgIGFyZ2xpc3RfdHlwZSBBcmdzOworCisgIHVzaW5nIE9wdFJhbmdlID0gc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD47CisgIHN0YXRpYyBPcHRSYW5nZSBlbXB0eVJhbmdlKCkgeyByZXR1cm4gey0xdSwgMHV9OyB9CisKKyAgLy8vIFRoZSBmaXJzdCBhbmQgbGFzdCBpbmRleCBvZiBlYWNoIGRpZmZlcmVudCBPcHRTcGVjaWZpZXIgSUQuCisgIERlbnNlTWFwPHVuc2lnbmVkLCBPcHRSYW5nZT4gT3B0UmFuZ2VzOworCisgIC8vLyBHZXQgdGhlIHJhbmdlIG9mIGluZGV4ZXMgaW4gd2hpY2ggb3B0aW9ucyB3aXRoIHRoZSBzcGVjaWZpZWQgSURzIG1pZ2h0CisgIC8vLyByZXNpZGUsIG9yICgwLCAwKSBpZiB0aGVyZSBhcmUgbm8gc3VjaCBvcHRpb25zLgorICBPcHRSYW5nZSBnZXRSYW5nZShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8T3B0U3BlY2lmaWVyPiBJZHMpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIC8vIE1ha2UgdGhlIGRlZmF1bHQgc3BlY2lhbCBtZW1iZXJzIHByb3RlY3RlZCBzbyB0aGV5IHdvbid0IGJlIHVzZWQgdG8gc2xpY2UKKyAgLy8gZGVyaXZlZCBvYmplY3RzLCBidXQgY2FuIHN0aWxsIGJlIHVzZWQgYnkgZGVyaXZlZCBvYmplY3RzIHRvIGltcGxlbWVudAorICAvLyB0aGVpciBvd24gc3BlY2lhbCBtZW1iZXJzLgorICBBcmdMaXN0KCkgPSBkZWZhdWx0OworCisgIC8vIEV4cGxpY2l0IG1vdmUgb3BlcmF0aW9ucyB0byBlbnN1cmUgdGhlIGNvbnRhaW5lciBpcyBjbGVhcmVkIHBvc3QtbW92ZQorICAvLyBvdGhlcndpc2UgaXQgY291bGQgbGVhZCB0byBhIGRvdWJsZS1kZWxldGUgaW4gdGhlIGNhc2Ugb2YgbW92aW5nIG9mIGFuCisgIC8vIElucHV0QXJnTGlzdCB3aGljaCBkZWxldGVzIHRoZSBjb250ZW50cyBvZiB0aGUgY29udGFpbmVyLiBJZiB3ZSBjb3VsZCBmaXgKKyAgLy8gdXAgdGhlIG93bmVyc2hpcCBoZXJlIChkZWxlZ2F0ZSBzdG9yYWdlL293bmVyc2hpcCB0byB0aGUgZGVyaXZlZCBjbGFzcyBzbworICAvLyBpdCBjYW4gYmUgYSBjb250YWluZXIgb2YgdW5pcXVlX3B0cikgdGhpcyB3b3VsZCBiZSBzaW1wbGVyLgorICBBcmdMaXN0KEFyZ0xpc3QgJiZSSFMpCisgICAgICA6IEFyZ3Moc3RkOjptb3ZlKFJIUy5BcmdzKSksIE9wdFJhbmdlcyhzdGQ6Om1vdmUoUkhTLk9wdFJhbmdlcykpIHsKKyAgICBSSFMuQXJncy5jbGVhcigpOworICAgIFJIUy5PcHRSYW5nZXMuY2xlYXIoKTsKKyAgfQorCisgIEFyZ0xpc3QgJm9wZXJhdG9yPShBcmdMaXN0ICYmUkhTKSB7CisgICAgQXJncyA9IHN0ZDo6bW92ZShSSFMuQXJncyk7CisgICAgUkhTLkFyZ3MuY2xlYXIoKTsKKyAgICBPcHRSYW5nZXMgPSBzdGQ6Om1vdmUoUkhTLk9wdFJhbmdlcyk7CisgICAgUkhTLk9wdFJhbmdlcy5jbGVhcigpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIFByb3RlY3QgdGhlIGR0b3IgdG8gZW5zdXJlIHRoaXMgdHlwZSBpcyBuZXZlciBkZXN0cm95ZWQgcG9seW1vcnBoaWNhbGx5LgorICB+QXJnTGlzdCgpID0gZGVmYXVsdDsKKworICAvLyBJbXBsaWNpdGx5IGNvbnZlcnQgYSB2YWx1ZSB0byBhbiBPcHRTcGVjaWZpZXIuIFVzZWQgdG8gd29yayBhcm91bmQgYSBidWcKKyAgLy8gaW4gTVNWQydzIGltcGxlbWVudGF0aW9uIG9mIG5hcnJvd2luZyBjb252ZXJzaW9uIGNoZWNraW5nLgorICBzdGF0aWMgT3B0U3BlY2lmaWVyIHRvT3B0U3BlY2lmaWVyKE9wdFNwZWNpZmllciBTKSB7IHJldHVybiBTOyB9CisKK3B1YmxpYzoKKyAgLy8vIEBuYW1lIEFyZyBBY2Nlc3MKKyAgLy8vIEB7CisKKyAgLy8vIGFwcGVuZCAtIEFwcGVuZCBccCBBIHRvIHRoZSBhcmcgbGlzdC4KKyAgdm9pZCBhcHBlbmQoQXJnICpBKTsKKworICBjb25zdCBhcmdsaXN0X3R5cGUgJmdldEFyZ3MoKSBjb25zdCB7IHJldHVybiBBcmdzOyB9CisKKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEFyZ3Muc2l6ZSgpOyB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBBcmcgSXRlcmF0aW9uCisgIC8vLyBAeworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4ge0FyZ3MuYmVnaW4oKSwgQXJncy5lbmQoKX07IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4ge0FyZ3MuZW5kKCksIEFyZ3MuZW5kKCl9OyB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiB7QXJncy5yYmVnaW4oKSwgQXJncy5yZW5kKCl9OyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIHtBcmdzLnJlbmQoKSwgQXJncy5yZW5kKCl9OyB9CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiB7QXJncy5iZWdpbigpLCBBcmdzLmVuZCgpfTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiB7QXJncy5lbmQoKSwgQXJncy5lbmQoKX07IH0KKworICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHtBcmdzLnJiZWdpbigpLCBBcmdzLnJlbmQoKX07IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4ge0FyZ3MucmVuZCgpLCBBcmdzLnJlbmQoKX07IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5PcHRTcGVjaWZpZXJzPgorICBpdGVyYXRvcl9yYW5nZTxmaWx0ZXJlZF9pdGVyYXRvcjxzaXplb2YuLi4oT3B0U3BlY2lmaWVycyk+PgorICBmaWx0ZXJlZChPcHRTcGVjaWZpZXJzIC4uLklkcykgY29uc3QgeworICAgIE9wdFJhbmdlIFJhbmdlID0gZ2V0UmFuZ2Uoe3RvT3B0U3BlY2lmaWVyKElkcykuLi59KTsKKyAgICBhdXRvIEIgPSBBcmdzLmJlZ2luKCkgKyBSYW5nZS5maXJzdDsKKyAgICBhdXRvIEUgPSBBcmdzLmJlZ2luKCkgKyBSYW5nZS5zZWNvbmQ7CisgICAgdXNpbmcgSXRlcmF0b3IgPSBmaWx0ZXJlZF9pdGVyYXRvcjxzaXplb2YuLi4oT3B0U3BlY2lmaWVycyk+OworICAgIHJldHVybiBtYWtlX3JhbmdlKEl0ZXJhdG9yKEIsIEUsIHt0b09wdFNwZWNpZmllcihJZHMpLi4ufSksCisgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IoRSwgRSwge3RvT3B0U3BlY2lmaWVyKElkcykuLi59KSk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5PcHRTcGVjaWZpZXJzPgorICBpdGVyYXRvcl9yYW5nZTxmaWx0ZXJlZF9yZXZlcnNlX2l0ZXJhdG9yPHNpemVvZi4uLihPcHRTcGVjaWZpZXJzKT4+CisgIGZpbHRlcmVkX3JldmVyc2UoT3B0U3BlY2lmaWVycyAuLi5JZHMpIGNvbnN0IHsKKyAgICBPcHRSYW5nZSBSYW5nZSA9IGdldFJhbmdlKHt0b09wdFNwZWNpZmllcihJZHMpLi4ufSk7CisgICAgYXV0byBCID0gQXJncy5yZW5kKCkgLSBSYW5nZS5zZWNvbmQ7CisgICAgYXV0byBFID0gQXJncy5yZW5kKCkgLSBSYW5nZS5maXJzdDsKKyAgICB1c2luZyBJdGVyYXRvciA9IGZpbHRlcmVkX3JldmVyc2VfaXRlcmF0b3I8c2l6ZW9mLi4uKE9wdFNwZWNpZmllcnMpPjsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShJdGVyYXRvcihCLCBFLCB7dG9PcHRTcGVjaWZpZXIoSWRzKS4uLn0pLAorICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yKEUsIEUsIHt0b09wdFNwZWNpZmllcihJZHMpLi4ufSkpOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBBcmcgUmVtb3ZhbAorICAvLy8gQHsKKworICAvLy8gZXJhc2VBcmcgLSBSZW1vdmUgYW55IG9wdGlvbiBtYXRjaGluZyBccCBJZC4KKyAgdm9pZCBlcmFzZUFyZyhPcHRTcGVjaWZpZXIgSWQpOworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgQXJnIEFjY2VzcworICAvLy8gQHsKKworICAvLy8gaGFzQXJnIC0gRG9lcyB0aGUgYXJnIGxpc3QgY29udGFpbiBhbnkgb3B0aW9uIG1hdGNoaW5nIFxwIElkLgorICAvLy8KKyAgLy8vIFxwIENsYWltIFdoZXRoZXIgdGhlIGFyZ3VtZW50IHNob3VsZCBiZSBjbGFpbWVkLCBpZiBpdCBleGlzdHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLk9wdFNwZWNpZmllcnM+CisgIGJvb2wgaGFzQXJnTm9DbGFpbShPcHRTcGVjaWZpZXJzIC4uLklkcykgY29uc3QgeworICAgIHJldHVybiBnZXRMYXN0QXJnTm9DbGFpbShJZHMuLi4pICE9IG51bGxwdHI7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uT3B0U3BlY2lmaWVycz4KKyAgYm9vbCBoYXNBcmcoT3B0U3BlY2lmaWVycyAuLi5JZHMpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TGFzdEFyZyhJZHMuLi4pICE9IG51bGxwdHI7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBsYXN0IGFyZ3VtZW50IG1hdGNoaW5nIFxwIElkLCBvciBudWxsLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5PcHRTcGVjaWZpZXJzPgorICBBcmcgKmdldExhc3RBcmcoT3B0U3BlY2lmaWVycyAuLi5JZHMpIGNvbnN0IHsKKyAgICBBcmcgKlJlcyA9IG51bGxwdHI7CisgICAgZm9yIChBcmcgKkEgOiBmaWx0ZXJlZChJZHMuLi4pKSB7CisgICAgICBSZXMgPSBBOworICAgICAgUmVzLT5jbGFpbSgpOworICAgIH0KKyAgICByZXR1cm4gUmVzOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbGFzdCBhcmd1bWVudCBtYXRjaGluZyBccCBJZCwgb3IgbnVsbC4gRG8gbm90ICJjbGFpbSIgdGhlCisgIC8vLyBvcHRpb24gKGRvbid0IG1hcmsgaXQgYXMgaGF2aW5nIGJlZW4gdXNlZCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLk9wdFNwZWNpZmllcnM+CisgIEFyZyAqZ2V0TGFzdEFyZ05vQ2xhaW0oT3B0U3BlY2lmaWVycyAuLi5JZHMpIGNvbnN0IHsKKyAgICBmb3IgKEFyZyAqQSA6IGZpbHRlcmVkX3JldmVyc2UoSWRzLi4uKSkKKyAgICAgIHJldHVybiBBOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIGdldEFyZ1N0cmluZyAtIFJldHVybiB0aGUgaW5wdXQgYXJndW1lbnQgc3RyaW5nIGF0IFxwIEluZGV4LgorICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldEFyZ1N0cmluZyh1bnNpZ25lZCBJbmRleCkgY29uc3QgPSAwOworCisgIC8vLyBnZXROdW1JbnB1dEFyZ1N0cmluZ3MgLSBSZXR1cm4gdGhlIG51bWJlciBvZiBvcmlnaW5hbCBhcmd1bWVudCBzdHJpbmdzLAorICAvLy8gd2hpY2ggYXJlIGd1YXJhbnRlZWQgdG8gYmUgdGhlIGZpcnN0IHN0cmluZ3MgaW4gdGhlIGFyZ3VtZW50IHN0cmluZworICAvLy8gbGlzdC4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXROdW1JbnB1dEFyZ1N0cmluZ3MoKSBjb25zdCA9IDA7CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBBcmd1bWVudCBMb29rdXAgVXRpbGl0aWVzCisgIC8vLyBAeworCisgIC8vLyBnZXRMYXN0QXJnVmFsdWUgLSBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBsYXN0IGFyZ3VtZW50LCBvciBhIGRlZmF1bHQuCisgIFN0cmluZ1JlZiBnZXRMYXN0QXJnVmFsdWUoT3B0U3BlY2lmaWVyIElkLCBTdHJpbmdSZWYgRGVmYXVsdCA9ICIiKSBjb25zdDsKKworICAvLy8gZ2V0QWxsQXJnVmFsdWVzIC0gR2V0IHRoZSB2YWx1ZXMgb2YgYWxsIGluc3RhbmNlcyBvZiB0aGUgZ2l2ZW4gYXJndW1lbnQKKyAgLy8vIGFzIHN0cmluZ3MuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBnZXRBbGxBcmdWYWx1ZXMoT3B0U3BlY2lmaWVyIElkKSBjb25zdDsKKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIFRyYW5zbGF0aW9uIFV0aWxpdGllcworICAvLy8gQHsKKworICAvLy8gaGFzRmxhZyAtIEdpdmVuIGFuIG9wdGlvbiBccCBQb3MgYW5kIGl0cyBuZWdhdGl2ZSBmb3JtIFxwIE5lZywgcmV0dXJuCisgIC8vLyB0cnVlIGlmIHRoZSBvcHRpb24gaXMgcHJlc2VudCwgZmFsc2UgaWYgdGhlIG5lZ2F0aW9uIGlzIHByZXNlbnQsIGFuZAorICAvLy8gXHAgRGVmYXVsdCBpZiBuZWl0aGVyIG9wdGlvbiBpcyBnaXZlbi4gSWYgYm90aCB0aGUgb3B0aW9uIGFuZCBpdHMKKyAgLy8vIG5lZ2F0aW9uIGFyZSBwcmVzZW50LCB0aGUgbGFzdCBvbmUgd2lucy4KKyAgYm9vbCBoYXNGbGFnKE9wdFNwZWNpZmllciBQb3MsIE9wdFNwZWNpZmllciBOZWcsIGJvb2wgRGVmYXVsdD10cnVlKSBjb25zdDsKKworICAvLy8gaGFzRmxhZyAtIEdpdmVuIGFuIG9wdGlvbiBccCBQb3MsIGFuIGFsaWFzIFxwIFBvc0FsaWFzIGFuZCBpdHMgbmVnYXRpdmUKKyAgLy8vIGZvcm0gXHAgTmVnLCByZXR1cm4gdHJ1ZSBpZiB0aGUgb3B0aW9uIG9yIGl0cyBhbGlhcyBpcyBwcmVzZW50LCBmYWxzZSBpZgorICAvLy8gdGhlIG5lZ2F0aW9uIGlzIHByZXNlbnQsIGFuZCBccCBEZWZhdWx0IGlmIG5vbmUgb2YgdGhlIG9wdGlvbnMgYXJlCisgIC8vLyBnaXZlbi4gSWYgbXVsdGlwbGUgb3B0aW9ucyBhcmUgcHJlc2VudCwgdGhlIGxhc3Qgb25lIHdpbnMuCisgIGJvb2wgaGFzRmxhZyhPcHRTcGVjaWZpZXIgUG9zLCBPcHRTcGVjaWZpZXIgUG9zQWxpYXMsIE9wdFNwZWNpZmllciBOZWcsCisgICAgICAgICAgICAgICBib29sIERlZmF1bHQgPSB0cnVlKSBjb25zdDsKKworICAvLy8gQWRkTGFzdEFyZyAtIFJlbmRlciBvbmx5IHRoZSBsYXN0IGFyZ3VtZW50IG1hdGNoIFxwIElkMCwgaWYgcHJlc2VudC4KKyAgdm9pZCBBZGRMYXN0QXJnKEFyZ1N0cmluZ0xpc3QgJk91dHB1dCwgT3B0U3BlY2lmaWVyIElkMCkgY29uc3Q7CisgIHZvaWQgQWRkTGFzdEFyZyhBcmdTdHJpbmdMaXN0ICZPdXRwdXQsIE9wdFNwZWNpZmllciBJZDAsCisgICAgICAgICAgICAgICAgICBPcHRTcGVjaWZpZXIgSWQxKSBjb25zdDsKKworICAvLy8gQWRkQWxsQXJnc0V4Y2VwdCAtIFJlbmRlciBhbGwgYXJndW1lbnRzIG1hdGNoaW5nIGFueSBvZiB0aGUgZ2l2ZW4gaWRzCisgIC8vLyBhbmQgbm90IG1hdGNoaW5nIGFueSBvZiB0aGUgZXhjbHVkZWQgaWRzLgorICB2b2lkIEFkZEFsbEFyZ3NFeGNlcHQoQXJnU3RyaW5nTGlzdCAmT3V0cHV0LCBBcnJheVJlZjxPcHRTcGVjaWZpZXI+IElkcywKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9wdFNwZWNpZmllcj4gRXhjbHVkZUlkcykgY29uc3Q7CisgIC8vLyBBZGRBbGxBcmdzIC0gUmVuZGVyIGFsbCBhcmd1bWVudHMgbWF0Y2hpbmcgYW55IG9mIHRoZSBnaXZlbiBpZHMuCisgIHZvaWQgQWRkQWxsQXJncyhBcmdTdHJpbmdMaXN0ICZPdXRwdXQsIEFycmF5UmVmPE9wdFNwZWNpZmllcj4gSWRzKSBjb25zdDsKKworICAvLy8gQWRkQWxsQXJncyAtIFJlbmRlciBhbGwgYXJndW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBpZHMuCisgIHZvaWQgQWRkQWxsQXJncyhBcmdTdHJpbmdMaXN0ICZPdXRwdXQsIE9wdFNwZWNpZmllciBJZDAsCisgICAgICAgICAgICAgICAgICBPcHRTcGVjaWZpZXIgSWQxID0gMFUsIE9wdFNwZWNpZmllciBJZDIgPSAwVSkgY29uc3Q7CisKKyAgLy8vIEFkZEFsbEFyZ1ZhbHVlcyAtIFJlbmRlciB0aGUgYXJndW1lbnQgdmFsdWVzIG9mIGFsbCBhcmd1bWVudHMKKyAgLy8vIG1hdGNoaW5nIHRoZSBnaXZlbiBpZHMuCisgIHZvaWQgQWRkQWxsQXJnVmFsdWVzKEFyZ1N0cmluZ0xpc3QgJk91dHB1dCwgT3B0U3BlY2lmaWVyIElkMCwKKyAgICAgICAgICAgICAgICAgICAgICAgT3B0U3BlY2lmaWVyIElkMSA9IDBVLCBPcHRTcGVjaWZpZXIgSWQyID0gMFUpIGNvbnN0OworCisgIC8vLyBBZGRBbGxBcmdzVHJhbnNsYXRlZCAtIFJlbmRlciBhbGwgdGhlIGFyZ3VtZW50cyBtYXRjaGluZyB0aGUKKyAgLy8vIGdpdmVuIGlkcywgYnV0IGZvcmNlZCB0byBzZXBhcmF0ZSBhcmdzIGFuZCB1c2luZyB0aGUgcHJvdmlkZWQKKyAgLy8vIG5hbWUgaW5zdGVhZCBvZiB0aGUgZmlyc3Qgb3B0aW9uIHZhbHVlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBKb2luZWQgLSBJZiB0cnVlLCByZW5kZXIgdGhlIGFyZ3VtZW50IGFzIGpvaW5lZCB3aXRoCisgIC8vLyB0aGUgb3B0aW9uIHNwZWNpZmllci4KKyAgdm9pZCBBZGRBbGxBcmdzVHJhbnNsYXRlZChBcmdTdHJpbmdMaXN0ICZPdXRwdXQsIE9wdFNwZWNpZmllciBJZDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqVHJhbnNsYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBKb2luZWQgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIENsYWltQWxsQXJncyAtIENsYWltIGFsbCBhcmd1bWVudHMgd2hpY2ggbWF0Y2ggdGhlIGdpdmVuCisgIC8vLyBvcHRpb24gaWQuCisgIHZvaWQgQ2xhaW1BbGxBcmdzKE9wdFNwZWNpZmllciBJZDApIGNvbnN0OworCisgIC8vLyBDbGFpbUFsbEFyZ3MgLSBDbGFpbSBhbGwgYXJndW1lbnRzLgorICAvLy8KKyAgdm9pZCBDbGFpbUFsbEFyZ3MoKSBjb25zdDsKKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIEFyZyBTeW50aGVzaXMKKyAgLy8vIEB7CisKKyAgLy8vIENvbnN0cnVjdCBhIGNvbnN0YW50IHN0cmluZyBwb2ludGVyIHdob3NlCisgIC8vLyBsaWZldGltZSB3aWxsIG1hdGNoIHRoYXQgb2YgdGhlIEFyZ0xpc3QuCisgIHZpcnR1YWwgY29uc3QgY2hhciAqTWFrZUFyZ1N0cmluZ1JlZihTdHJpbmdSZWYgU3RyKSBjb25zdCA9IDA7CisgIGNvbnN0IGNoYXIgKk1ha2VBcmdTdHJpbmcoY29uc3QgVHdpbmUgJlN0cikgY29uc3QgeworICAgIFNtYWxsU3RyaW5nPDI1Nj4gQnVmOworICAgIHJldHVybiBNYWtlQXJnU3RyaW5nUmVmKFN0ci50b1N0cmluZ1JlZihCdWYpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIGFyZyBzdHJpbmcgZm9yIChccCBMSFMgKyBccCBSSFMpLCByZXVzaW5nIHRoZQorICAvLy8gc3RyaW5nIGF0IFxwIEluZGV4IGlmIHBvc3NpYmxlLgorICBjb25zdCBjaGFyICpHZXRPck1ha2VKb2luZWRBcmdTdHJpbmcodW5zaWduZWQgSW5kZXgsIFN0cmluZ1JlZiBMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFJIUykgY29uc3Q7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBAfQorfTsKKworY2xhc3MgSW5wdXRBcmdMaXN0IGZpbmFsIDogcHVibGljIEFyZ0xpc3QgeworcHJpdmF0ZToKKyAgLy8vIExpc3Qgb2YgYXJndW1lbnQgc3RyaW5ncyB1c2VkIGJ5IHRoZSBjb250YWluZWQgQXJncy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIG11dGFibGUgc2luY2Ugd2UgdHJlYXQgdGhlIEFyZ0xpc3QgYXMgYmVpbmcgdGhlIGxpc3QKKyAgLy8vIG9mIEFyZ3MsIGFuZCBhbGxvdyByb3V0aW5lcyB0byBhZGQgbmV3IHN0cmluZ3MgKHRvIGhhdmUgYQorICAvLy8gY29udmVuaWVudCBwbGFjZSB0byBzdG9yZSB0aGUgbWVtb3J5KSB2aWEgTWFrZUluZGV4LgorICBtdXRhYmxlIEFyZ1N0cmluZ0xpc3QgQXJnU3RyaW5nczsKKworICAvLy8gU3RyaW5ncyBmb3Igc3ludGhlc2l6ZWQgYXJndW1lbnRzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgbXV0YWJsZSBzaW5jZSB3ZSB0cmVhdCB0aGUgQXJnTGlzdCBhcyBiZWluZyB0aGUgbGlzdAorICAvLy8gb2YgQXJncywgYW5kIGFsbG93IHJvdXRpbmVzIHRvIGFkZCBuZXcgc3RyaW5ncyAodG8gaGF2ZSBhCisgIC8vLyBjb252ZW5pZW50IHBsYWNlIHRvIHN0b3JlIHRoZSBtZW1vcnkpIHZpYSBNYWtlSW5kZXguCisgIG11dGFibGUgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBTeW50aGVzaXplZFN0cmluZ3M7CisKKyAgLy8vIFRoZSBudW1iZXIgb2Ygb3JpZ2luYWwgaW5wdXQgYXJndW1lbnQgc3RyaW5ncy4KKyAgdW5zaWduZWQgTnVtSW5wdXRBcmdTdHJpbmdzOworCisgIC8vLyBSZWxlYXNlIGFsbG9jYXRlZCBhcmd1bWVudHMuCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpOworCitwdWJsaWM6CisgIElucHV0QXJnTGlzdCgpIDogTnVtSW5wdXRBcmdTdHJpbmdzKDApIHt9CisKKyAgSW5wdXRBcmdMaXN0KGNvbnN0IGNoYXIqIGNvbnN0ICpBcmdCZWdpbiwgY29uc3QgY2hhciogY29uc3QgKkFyZ0VuZCk7CisKKyAgSW5wdXRBcmdMaXN0KElucHV0QXJnTGlzdCAmJlJIUykKKyAgICAgIDogQXJnTGlzdChzdGQ6Om1vdmUoUkhTKSksIEFyZ1N0cmluZ3Moc3RkOjptb3ZlKFJIUy5BcmdTdHJpbmdzKSksCisgICAgICAgIFN5bnRoZXNpemVkU3RyaW5ncyhzdGQ6Om1vdmUoUkhTLlN5bnRoZXNpemVkU3RyaW5ncykpLAorICAgICAgICBOdW1JbnB1dEFyZ1N0cmluZ3MoUkhTLk51bUlucHV0QXJnU3RyaW5ncykge30KKworICBJbnB1dEFyZ0xpc3QgJm9wZXJhdG9yPShJbnB1dEFyZ0xpc3QgJiZSSFMpIHsKKyAgICByZWxlYXNlTWVtb3J5KCk7CisgICAgQXJnTGlzdDo6b3BlcmF0b3I9KHN0ZDo6bW92ZShSSFMpKTsKKyAgICBBcmdTdHJpbmdzID0gc3RkOjptb3ZlKFJIUy5BcmdTdHJpbmdzKTsKKyAgICBTeW50aGVzaXplZFN0cmluZ3MgPSBzdGQ6Om1vdmUoUkhTLlN5bnRoZXNpemVkU3RyaW5ncyk7CisgICAgTnVtSW5wdXRBcmdTdHJpbmdzID0gUkhTLk51bUlucHV0QXJnU3RyaW5nczsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB+SW5wdXRBcmdMaXN0KCkgeyByZWxlYXNlTWVtb3J5KCk7IH0KKworICBjb25zdCBjaGFyICpnZXRBcmdTdHJpbmcodW5zaWduZWQgSW5kZXgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gQXJnU3RyaW5nc1tJbmRleF07CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1JbnB1dEFyZ1N0cmluZ3MoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIE51bUlucHV0QXJnU3RyaW5nczsKKyAgfQorCisgIC8vLyBAbmFtZSBBcmcgU3ludGhlc2lzCisgIC8vLyBAeworCitwdWJsaWM6CisgIC8vLyBNYWtlSW5kZXggLSBHZXQgYW4gaW5kZXggZm9yIHRoZSBnaXZlbiBzdHJpbmcocykuCisgIHVuc2lnbmVkIE1ha2VJbmRleChTdHJpbmdSZWYgU3RyaW5nMCkgY29uc3Q7CisgIHVuc2lnbmVkIE1ha2VJbmRleChTdHJpbmdSZWYgU3RyaW5nMCwgU3RyaW5nUmVmIFN0cmluZzEpIGNvbnN0OworCisgIHVzaW5nIEFyZ0xpc3Q6Ok1ha2VBcmdTdHJpbmc7CisgIGNvbnN0IGNoYXIgKk1ha2VBcmdTdHJpbmdSZWYoU3RyaW5nUmVmIFN0cikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIEB9Cit9OworCisvLy8gRGVyaXZlZEFyZ0xpc3QgLSBBbiBvcmRlcmVkIGNvbGxlY3Rpb24gb2YgZHJpdmVyIGFyZ3VtZW50cywKKy8vLyB3aG9zZSBzdG9yYWdlIG1heSBiZSBpbiBhbm90aGVyIGFyZ3VtZW50IGxpc3QuCitjbGFzcyBEZXJpdmVkQXJnTGlzdCBmaW5hbCA6IHB1YmxpYyBBcmdMaXN0IHsKKyAgY29uc3QgSW5wdXRBcmdMaXN0ICZCYXNlQXJnczsKKworICAvLy8gVGhlIGxpc3Qgb2YgYXJndW1lbnRzIHdlIHN5bnRoZXNpemVkLgorICBtdXRhYmxlIFNtYWxsVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBcmc+LCAxNj4gU3ludGhlc2l6ZWRBcmdzOworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3QgYSBuZXcgZGVyaXZlZCBhcmcgbGlzdCBmcm9tIFxwIEJhc2VBcmdzLgorICBEZXJpdmVkQXJnTGlzdChjb25zdCBJbnB1dEFyZ0xpc3QgJkJhc2VBcmdzKTsKKworICBjb25zdCBjaGFyICpnZXRBcmdTdHJpbmcodW5zaWduZWQgSW5kZXgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gQmFzZUFyZ3MuZ2V0QXJnU3RyaW5nKEluZGV4KTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUlucHV0QXJnU3RyaW5ncygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gQmFzZUFyZ3MuZ2V0TnVtSW5wdXRBcmdTdHJpbmdzKCk7CisgIH0KKworICBjb25zdCBJbnB1dEFyZ0xpc3QgJmdldEJhc2VBcmdzKCkgY29uc3QgeworICAgIHJldHVybiBCYXNlQXJnczsKKyAgfQorCisgIC8vLyBAbmFtZSBBcmcgU3ludGhlc2lzCisgIC8vLyBAeworCisgIC8vLyBBZGRTeW50aGVzaXplZEFyZyAtIEFkZCBhIGFyZ3VtZW50IHRvIHRoZSBsaXN0IG9mIHN5bnRoZXNpemVkIGFyZ3VtZW50cworICAvLy8gKHRvIGJlIGZyZWVkKS4KKyAgdm9pZCBBZGRTeW50aGVzaXplZEFyZyhBcmcgKkEpOworCisgIHVzaW5nIEFyZ0xpc3Q6Ok1ha2VBcmdTdHJpbmc7CisgIGNvbnN0IGNoYXIgKk1ha2VBcmdTdHJpbmdSZWYoU3RyaW5nUmVmIFN0cikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIEFkZEZsYWdBcmcgLSBDb25zdHJ1Y3QgYSBuZXcgRmxhZ0FyZyBmb3IgdGhlIGdpdmVuIG9wdGlvbiBccCBJZCBhbmQKKyAgLy8vIGFwcGVuZCBpdCB0byB0aGUgYXJndW1lbnQgbGlzdC4KKyAgdm9pZCBBZGRGbGFnQXJnKGNvbnN0IEFyZyAqQmFzZUFyZywgY29uc3QgT3B0aW9uIE9wdCkgeworICAgIGFwcGVuZChNYWtlRmxhZ0FyZyhCYXNlQXJnLCBPcHQpKTsKKyAgfQorCisgIC8vLyBBZGRQb3NpdGlvbmFsQXJnIC0gQ29uc3RydWN0IGEgbmV3IFBvc2l0aW9uYWwgYXJnIGZvciB0aGUgZ2l2ZW4gb3B0aW9uCisgIC8vLyBccCBJZCwgd2l0aCB0aGUgcHJvdmlkZWQgXHAgVmFsdWUgYW5kIGFwcGVuZCBpdCB0byB0aGUgYXJndW1lbnQKKyAgLy8vIGxpc3QuCisgIHZvaWQgQWRkUG9zaXRpb25hbEFyZyhjb25zdCBBcmcgKkJhc2VBcmcsIGNvbnN0IE9wdGlvbiBPcHQsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVmFsdWUpIHsKKyAgICBhcHBlbmQoTWFrZVBvc2l0aW9uYWxBcmcoQmFzZUFyZywgT3B0LCBWYWx1ZSkpOworICB9CisKKyAgLy8vIEFkZFNlcGFyYXRlQXJnIC0gQ29uc3RydWN0IGEgbmV3IFBvc2l0aW9uYWwgYXJnIGZvciB0aGUgZ2l2ZW4gb3B0aW9uCisgIC8vLyBccCBJZCwgd2l0aCB0aGUgcHJvdmlkZWQgXHAgVmFsdWUgYW5kIGFwcGVuZCBpdCB0byB0aGUgYXJndW1lbnQKKyAgLy8vIGxpc3QuCisgIHZvaWQgQWRkU2VwYXJhdGVBcmcoY29uc3QgQXJnICpCYXNlQXJnLCBjb25zdCBPcHRpb24gT3B0LAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBWYWx1ZSkgeworICAgIGFwcGVuZChNYWtlU2VwYXJhdGVBcmcoQmFzZUFyZywgT3B0LCBWYWx1ZSkpOworICB9CisKKyAgLy8vIEFkZEpvaW5lZEFyZyAtIENvbnN0cnVjdCBhIG5ldyBQb3NpdGlvbmFsIGFyZyBmb3IgdGhlIGdpdmVuIG9wdGlvbgorICAvLy8gXHAgSWQsIHdpdGggdGhlIHByb3ZpZGVkIFxwIFZhbHVlIGFuZCBhcHBlbmQgaXQgdG8gdGhlIGFyZ3VtZW50IGxpc3QuCisgIHZvaWQgQWRkSm9pbmVkQXJnKGNvbnN0IEFyZyAqQmFzZUFyZywgY29uc3QgT3B0aW9uIE9wdCwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFZhbHVlKSB7CisgICAgYXBwZW5kKE1ha2VKb2luZWRBcmcoQmFzZUFyZywgT3B0LCBWYWx1ZSkpOworICB9CisKKyAgLy8vIE1ha2VGbGFnQXJnIC0gQ29uc3RydWN0IGEgbmV3IEZsYWdBcmcgZm9yIHRoZSBnaXZlbiBvcHRpb24gXHAgSWQuCisgIEFyZyAqTWFrZUZsYWdBcmcoY29uc3QgQXJnICpCYXNlQXJnLCBjb25zdCBPcHRpb24gT3B0KSBjb25zdDsKKworICAvLy8gTWFrZVBvc2l0aW9uYWxBcmcgLSBDb25zdHJ1Y3QgYSBuZXcgUG9zaXRpb25hbCBhcmcgZm9yIHRoZQorICAvLy8gZ2l2ZW4gb3B0aW9uIFxwIElkLCB3aXRoIHRoZSBwcm92aWRlZCBccCBWYWx1ZS4KKyAgQXJnICpNYWtlUG9zaXRpb25hbEFyZyhjb25zdCBBcmcgKkJhc2VBcmcsIGNvbnN0IE9wdGlvbiBPcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBWYWx1ZSkgY29uc3Q7CisKKyAgLy8vIE1ha2VTZXBhcmF0ZUFyZyAtIENvbnN0cnVjdCBhIG5ldyBQb3NpdGlvbmFsIGFyZyBmb3IgdGhlCisgIC8vLyBnaXZlbiBvcHRpb24gXHAgSWQsIHdpdGggdGhlIHByb3ZpZGVkIFxwIFZhbHVlLgorICBBcmcgKk1ha2VTZXBhcmF0ZUFyZyhjb25zdCBBcmcgKkJhc2VBcmcsIGNvbnN0IE9wdGlvbiBPcHQsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVmFsdWUpIGNvbnN0OworCisgIC8vLyBNYWtlSm9pbmVkQXJnIC0gQ29uc3RydWN0IGEgbmV3IFBvc2l0aW9uYWwgYXJnIGZvciB0aGUKKyAgLy8vIGdpdmVuIG9wdGlvbiBccCBJZCwgd2l0aCB0aGUgcHJvdmlkZWQgXHAgVmFsdWUuCisgIEFyZyAqTWFrZUpvaW5lZEFyZyhjb25zdCBBcmcgKkJhc2VBcmcsIGNvbnN0IE9wdGlvbiBPcHQsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFZhbHVlKSBjb25zdDsKKworICAvLy8gQH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvcHQKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT1BUSU9OX0FSR0xJU1RfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PcHRpb24vT3B0UGFyc2VyLnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PcHRpb24vT3B0UGFyc2VyLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMzczNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09wdGlvbi9PcHRQYXJzZXIudGQKQEAgLTAsMCArMSwxMzkgQEAKKy8vPT09LS0tIE9wdFBhcnNlci50ZCAtIENvbW1vbiBPcHRpb24gUGFyc2luZyBJbnRlcmZhY2VzIC0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBjb21tb24gaW50ZXJmYWNlcyB1c2VkIGJ5IHRoZSBvcHRpb24gcGFyc2luZyBUYWJsZUdlbgorLy8gIGJhY2tlbmQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gRGVmaW5lIHRoZSBraW5kcyBvZiBvcHRpb25zLgorCitjbGFzcyBPcHRpb25LaW5kPHN0cmluZyBuYW1lLCBpbnQgcHJlY2VkZW5jZSA9IDAsIGJpdCBzZW50aW5lbCA9IDA+IHsKKyAgc3RyaW5nIE5hbWUgPSBuYW1lOworICAvLyBUaGUga2luZCBwcmVjZWRlbmNlLCBraW5kcyB3aXRoIGxvd2VyIHByZWNlZGVuY2UgYXJlIG1hdGNoZWQgZmlyc3QuCisgIGludCBQcmVjZWRlbmNlID0gcHJlY2VkZW5jZTsKKyAgLy8gSW5kaWNhdGUgYSBzZW50aW5lbCBvcHRpb24uCisgIGJpdCBTZW50aW5lbCA9IHNlbnRpbmVsOworfQorCisvLyBBbiBvcHRpb24gZ3JvdXAuCitkZWYgS0lORF9HUk9VUCA6IE9wdGlvbktpbmQ8Ikdyb3VwIj47CisvLyBUaGUgaW5wdXQgb3B0aW9uIGtpbmQuCitkZWYgS0lORF9JTlBVVCA6IE9wdGlvbktpbmQ8IklucHV0IiwgMSwgMT47CisvLyBUaGUgdW5rbm93biBvcHRpb24ga2luZC4KK2RlZiBLSU5EX1VOS05PV04gOiBPcHRpb25LaW5kPCJVbmtub3duIiwgMiwgMT47CisvLyBBIGZsYWcgd2l0aCBubyB2YWx1ZXMuCitkZWYgS0lORF9GTEFHIDogT3B0aW9uS2luZDwiRmxhZyI+OworLy8gQW4gb3B0aW9uIHdoaWNoIHByZWZpeGVzIGl0cyAoc2luZ2xlKSB2YWx1ZS4KK2RlZiBLSU5EX0pPSU5FRCA6IE9wdGlvbktpbmQ8IkpvaW5lZCIsIDE+OworLy8gQW4gb3B0aW9uIHdoaWNoIGlzIGZvbGxvd2VkIGJ5IGl0cyB2YWx1ZS4KK2RlZiBLSU5EX1NFUEFSQVRFIDogT3B0aW9uS2luZDwiU2VwYXJhdGUiPjsKKy8vIEFuIG9wdGlvbiBmb2xsb3dlZCBieSBpdHMgdmFsdWVzLCB3aGljaCBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KK2RlZiBLSU5EX0NPTU1BSk9JTkVEIDogT3B0aW9uS2luZDwiQ29tbWFKb2luZWQiPjsKKy8vIEFuIG9wdGlvbiB3aGljaCBpcyB3aGljaCB0YWtlcyBtdWx0aXBsZSAoc2VwYXJhdGUpIGFyZ3VtZW50cy4KK2RlZiBLSU5EX01VTFRJQVJHIDogT3B0aW9uS2luZDwiTXVsdGlBcmciPjsKKy8vIEFuIG9wdGlvbiB3aGljaCBpcyBlaXRoZXIgam9pbmVkIHRvIGl0cyAobm9uLWVtcHR5KSB2YWx1ZSwgb3IgZm9sbG93ZWQgYnkgaXRzCisvLyB2YWx1ZS4KK2RlZiBLSU5EX0pPSU5FRF9PUl9TRVBBUkFURSA6IE9wdGlvbktpbmQ8IkpvaW5lZE9yU2VwYXJhdGUiPjsKKy8vIEFuIG9wdGlvbiB3aGljaCBpcyBib3RoIGpvaW5lZCB0byBpdHMgKGZpcnN0KSB2YWx1ZSwgYW5kIGZvbGxvd2VkIGJ5IGl0cworLy8gKHNlY29uZCkgdmFsdWUuCitkZWYgS0lORF9KT0lORURfQU5EX1NFUEFSQVRFIDogT3B0aW9uS2luZDwiSm9pbmVkQW5kU2VwYXJhdGUiPjsKKy8vIEFuIG9wdGlvbiB3aGljaCBjb25zdW1lcyBhbGwgcmVtYWluaW5nIGFyZ3VtZW50cyBpZiB0aGVyZSBhcmUgYW55LgorZGVmIEtJTkRfUkVNQUlOSU5HX0FSR1MgOiBPcHRpb25LaW5kPCJSZW1haW5pbmdBcmdzIj47CisvLyBBbiBvcHRpb24gd2hpY2ggY29uc3VtZXMgYW4gb3B0aW9uYWwgam9pbmVkIGFyZ3VtZW50IGFuZCBhbnkgb3RoZXIgcmVtYWluaW5nCisvLyBhcmd1bWVudHMuCitkZWYgS0lORF9SRU1BSU5JTkdfQVJHU19KT0lORUQgOiBPcHRpb25LaW5kPCJSZW1haW5pbmdBcmdzSm9pbmVkIj47CisKKy8vIERlZmluZSB0aGUgb3B0aW9uIGZsYWdzLgorCitjbGFzcyBPcHRpb25GbGFnIHt9CisKKy8vIEhlbHBIaWRkZW4gLSBUaGUgb3B0aW9uIHNob3VsZCBub3QgYmUgZGlzcGxheWVkIGluIC0taGVscCwgZXZlbiBpZiBpdCBoYXMKKy8vIGhlbHAgdGV4dC4gQ2xpZW50cyAqY2FuKiB1c2UgdGhpcyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBPcHRUYWJsZTo6UHJpbnRIZWxwCisvLyBhcmd1bWVudHMgdG8gaW1wbGVtZW50IGhpZGRlbiBoZWxwIGdyb3Vwcy4KK2RlZiBIZWxwSGlkZGVuIDogT3B0aW9uRmxhZzsKKworLy8gUmVuZGVyQXNJbnB1dCAtIFRoZSBvcHRpb24gc2hvdWxkIG5vdCByZW5kZXIgdGhlIG5hbWUgd2hlbiByZW5kZXJlZCBhcyBhbgorLy8gaW5wdXQgKGkuZS4sIHRoZSBvcHRpb24gaXMgcmVuZGVyZWQgYXMgdmFsdWVzKS4KK2RlZiBSZW5kZXJBc0lucHV0IDogT3B0aW9uRmxhZzsKKworLy8gUmVuZGVySm9pbmVkIC0gVGhlIG9wdGlvbiBzaG91bGQgYmUgcmVuZGVyZWQgam9pbmVkLCBldmVuIGlmIHNlcGFyYXRlIChvbmx5CisvLyBzZW5zaWJsZSBvbiBzaW5nbGUgdmFsdWUgc2VwYXJhdGUgb3B0aW9ucykuCitkZWYgUmVuZGVySm9pbmVkIDogT3B0aW9uRmxhZzsKKworLy8gUmVuZGVyU2VwYXJhdGUgLSBUaGUgb3B0aW9uIHNob3VsZCBiZSByZW5kZXJlZCBzZXBhcmF0ZWx5LCBldmVuIGlmIGpvaW5lZAorLy8gKG9ubHkgc2Vuc2libGUgb24gam9pbmVkIG9wdGlvbnMpLgorZGVmIFJlbmRlclNlcGFyYXRlIDogT3B0aW9uRmxhZzsKKworLy8gRGVmaW5lIHRoZSBvcHRpb24gZ3JvdXAgY2xhc3MuCisKK2NsYXNzIE9wdGlvbkdyb3VwPHN0cmluZyBuYW1lPiB7CisgIHN0cmluZyBFbnVtTmFtZSA9ID87IC8vIFVzZXMgdGhlIGRlZiBuYW1lIGlmIHVuZGVmaW5lZC4KKyAgc3RyaW5nIE5hbWUgPSBuYW1lOworICBzdHJpbmcgSGVscFRleHQgPSA/OworICBPcHRpb25Hcm91cCBHcm91cCA9ID87CisgIGxpc3Q8T3B0aW9uRmxhZz4gRmxhZ3MgPSBbXTsKK30KKworLy8gRGVmaW5lIHRoZSBvcHRpb24gY2xhc3MuCisKK2NsYXNzIE9wdGlvbjxsaXN0PHN0cmluZz4gcHJlZml4ZXMsIHN0cmluZyBuYW1lLCBPcHRpb25LaW5kIGtpbmQ+IHsKKyAgc3RyaW5nIEVudW1OYW1lID0gPzsgLy8gVXNlcyB0aGUgZGVmIG5hbWUgaWYgdW5kZWZpbmVkLgorICBsaXN0PHN0cmluZz4gUHJlZml4ZXMgPSBwcmVmaXhlczsKKyAgc3RyaW5nIE5hbWUgPSBuYW1lOworICBPcHRpb25LaW5kIEtpbmQgPSBraW5kOworICAvLyBVc2VkIGJ5IE11bHRpQXJnIG9wdGlvbiBraW5kLgorICBpbnQgTnVtQXJncyA9IDA7CisgIHN0cmluZyBIZWxwVGV4dCA9ID87CisgIHN0cmluZyBNZXRhVmFyTmFtZSA9ID87CisgIHN0cmluZyBWYWx1ZXMgPSA/OworICBjb2RlIFZhbHVlc0NvZGUgPSA/OworICBsaXN0PE9wdGlvbkZsYWc+IEZsYWdzID0gW107CisgIE9wdGlvbkdyb3VwIEdyb3VwID0gPzsKKyAgT3B0aW9uIEFsaWFzID0gPzsKKyAgbGlzdDxzdHJpbmc+IEFsaWFzQXJncyA9IFtdOworfQorCisvLyBIZWxwZXJzIGZvciBkZWZpbmluZyBvcHRpb25zLgorCitjbGFzcyBGbGFnPGxpc3Q8c3RyaW5nPiBwcmVmaXhlcywgc3RyaW5nIG5hbWU+CisgIDogT3B0aW9uPHByZWZpeGVzLCBuYW1lLCBLSU5EX0ZMQUc+OworY2xhc3MgSm9pbmVkPGxpc3Q8c3RyaW5nPiBwcmVmaXhlcywgc3RyaW5nIG5hbWU+CisgIDogT3B0aW9uPHByZWZpeGVzLCBuYW1lLCBLSU5EX0pPSU5FRD47CitjbGFzcyBTZXBhcmF0ZTxsaXN0PHN0cmluZz4gcHJlZml4ZXMsIHN0cmluZyBuYW1lPgorICA6IE9wdGlvbjxwcmVmaXhlcywgbmFtZSwgS0lORF9TRVBBUkFURT47CitjbGFzcyBDb21tYUpvaW5lZDxsaXN0PHN0cmluZz4gcHJlZml4ZXMsIHN0cmluZyBuYW1lPgorICA6IE9wdGlvbjxwcmVmaXhlcywgbmFtZSwgS0lORF9DT01NQUpPSU5FRD47CitjbGFzcyBNdWx0aUFyZzxsaXN0PHN0cmluZz4gcHJlZml4ZXMsIHN0cmluZyBuYW1lLCBpbnQgbnVtYXJncz4KKyAgOiBPcHRpb248cHJlZml4ZXMsIG5hbWUsIEtJTkRfTVVMVElBUkc+IHsKKyAgaW50IE51bUFyZ3MgPSBudW1hcmdzOworfQorY2xhc3MgSm9pbmVkT3JTZXBhcmF0ZTxsaXN0PHN0cmluZz4gcHJlZml4ZXMsIHN0cmluZyBuYW1lPgorICA6IE9wdGlvbjxwcmVmaXhlcywgbmFtZSwgS0lORF9KT0lORURfT1JfU0VQQVJBVEU+OworY2xhc3MgSm9pbmVkQW5kU2VwYXJhdGU8bGlzdDxzdHJpbmc+IHByZWZpeGVzLCBzdHJpbmcgbmFtZT4KKyAgOiBPcHRpb248cHJlZml4ZXMsIG5hbWUsIEtJTkRfSk9JTkVEX0FORF9TRVBBUkFURT47CisKKy8vIE1peC1pbnMgZm9yIGFkZGluZyBvcHRpb25hbCBhdHRyaWJ1dGVzLgorCitjbGFzcyBBbGlhczxPcHRpb24gYWxpYXM+IHsgT3B0aW9uIEFsaWFzID0gYWxpYXM7IH0KK2NsYXNzIEFsaWFzQXJnczxsaXN0PHN0cmluZz4gYWxpYXNhcmdzPiB7IGxpc3Q8c3RyaW5nPiBBbGlhc0FyZ3MgPSBhbGlhc2FyZ3M7IH0KK2NsYXNzIEVudW1OYW1lPHN0cmluZyBuYW1lPiB7IHN0cmluZyBFbnVtTmFtZSA9IG5hbWU7IH0KK2NsYXNzIEZsYWdzPGxpc3Q8T3B0aW9uRmxhZz4gZmxhZ3M+IHsgbGlzdDxPcHRpb25GbGFnPiBGbGFncyA9IGZsYWdzOyB9CitjbGFzcyBHcm91cDxPcHRpb25Hcm91cCBncm91cD4geyBPcHRpb25Hcm91cCBHcm91cCA9IGdyb3VwOyB9CitjbGFzcyBIZWxwVGV4dDxzdHJpbmcgdGV4dD4geyBzdHJpbmcgSGVscFRleHQgPSB0ZXh0OyB9CitjbGFzcyBNZXRhVmFyTmFtZTxzdHJpbmcgbmFtZT4geyBzdHJpbmcgTWV0YVZhck5hbWUgPSBuYW1lOyB9CitjbGFzcyBWYWx1ZXM8c3RyaW5nIHZhbHVlPiB7IHN0cmluZyBWYWx1ZXMgPSB2YWx1ZTsgfQorY2xhc3MgVmFsdWVzQ29kZTxjb2RlIHZhbHVlY29kZT4geyBjb2RlIFZhbHVlc0NvZGUgPSB2YWx1ZWNvZGU7IH0KKworLy8gUHJlZGVmaW5lZCBvcHRpb25zLgorCisvLyBGSVhNRTogSGF2ZSBnZW5lcmF0b3IgdmFsaWRhdGUgdGhhdCB0aGVzZSBhcHBlYXIgaW4gY29ycmVjdCBwb3NpdGlvbiAoYW5kCisvLyBhcmVuJ3QgZHVwbGljYXRlZCkuCitkZWYgSU5QVVQgOiBPcHRpb248W10sICI8aW5wdXQ+IiwgS0lORF9JTlBVVD47CitkZWYgVU5LTk9XTiA6IE9wdGlvbjxbXSwgIjx1bmtub3duPiIsIEtJTkRfVU5LTk9XTj47CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09wdGlvbi9PcHRTcGVjaWZpZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT3B0aW9uL09wdFNwZWNpZmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YzNjZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09wdGlvbi9PcHRTcGVjaWZpZXIuaApAQCAtMCwwICsxLDM5IEBACisvLz09PS0gT3B0U3BlY2lmaWVyLmggLSBPcHRpb24gU3BlY2lmaWVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT1BUSU9OX09QVFNQRUNJRklFUl9ICisjZGVmaW5lIExMVk1fT1BUSU9OX09QVFNQRUNJRklFUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvcHQgeworCitjbGFzcyBPcHRpb247CisKKy8vLyBPcHRTcGVjaWZpZXIgLSBXcmFwcGVyIGNsYXNzIGZvciBhYnN0cmFjdGluZyByZWZlcmVuY2VzIHRvIG9wdGlvbiBJRHMuCitjbGFzcyBPcHRTcGVjaWZpZXIgeworICB1bnNpZ25lZCBJRCA9IDA7CisKK3B1YmxpYzoKKyAgT3B0U3BlY2lmaWVyKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBPcHRTcGVjaWZpZXIoYm9vbCkgPSBkZWxldGU7CisgIC8qaW1wbGljaXQqLyBPcHRTcGVjaWZpZXIodW5zaWduZWQgSUQpIDogSUQoSUQpIHt9CisgIC8qaW1wbGljaXQqLyBPcHRTcGVjaWZpZXIoY29uc3QgT3B0aW9uICpPcHQpOworCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIElEICE9IDA7IH0KKworICB1bnNpZ25lZCBnZXRJRCgpIGNvbnN0IHsgcmV0dXJuIElEOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KE9wdFNwZWNpZmllciBPcHQpIGNvbnN0IHsgcmV0dXJuIElEID09IE9wdC5nZXRJRCgpOyB9CisgIGJvb2wgb3BlcmF0b3IhPShPcHRTcGVjaWZpZXIgT3B0KSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IE9wdCk7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvcHQKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX09QVElPTl9PUFRTUEVDSUZJRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PcHRpb24vT3B0VGFibGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT3B0aW9uL09wdFRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiOWJiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT3B0aW9uL09wdFRhYmxlLmgKQEAgLTAsMCArMSwyNDEgQEAKKy8vPT09LSBPcHRUYWJsZS5oIC0gT3B0aW9uIFRhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PUFRJT05fT1BUVEFCTEVfSAorI2RlZmluZSBMTFZNX09QVElPTl9PUFRUQUJMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vT3B0aW9uL09wdFNwZWNpZmllci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIG9wdCB7CisKK2NsYXNzIEFyZzsKK2NsYXNzIEFyZ0xpc3Q7CitjbGFzcyBJbnB1dEFyZ0xpc3Q7CitjbGFzcyBPcHRpb247CisKKy8vLyBcYnJpZWYgUHJvdmlkZSBhY2Nlc3MgdG8gdGhlIE9wdGlvbiBpbmZvIHRhYmxlLgorLy8vCisvLy8gVGhlIE9wdFRhYmxlIGNsYXNzIHByb3ZpZGVzIGEgbGF5ZXIgb2YgaW5kaXJlY3Rpb24gd2hpY2ggYWxsb3dzIE9wdGlvbgorLy8vIGluc3RhbmNlIHRvIGJlIGNyZWF0ZWQgbGF6aWx5LiBJbiB0aGUgY29tbW9uIGNhc2UsIG9ubHkgYSBmZXcgb3B0aW9ucyB3aWxsCisvLy8gYmUgbmVlZGVkIGF0IHJ1bnRpbWU7IHRoZSBPcHRUYWJsZSBjbGFzcyBtYWludGFpbnMgZW5vdWdoIGluZm9ybWF0aW9uIHRvCisvLy8gcGFyc2UgY29tbWFuZCBsaW5lcyB3aXRob3V0IGluc3RhbnRpYXRpbmcgT3B0aW9ucywgd2hpbGUgbGV0dGluZyBvdGhlcgorLy8vIHBhcnRzIG9mIHRoZSBkcml2ZXIgc3RpbGwgdXNlIE9wdGlvbiBpbnN0YW5jZXMgd2hlcmUgY29udmVuaWVudC4KK2NsYXNzIE9wdFRhYmxlIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBFbnRyeSBmb3IgYSBzaW5nbGUgb3B0aW9uIGluc3RhbmNlIGluIHRoZSBvcHRpb24gZGF0YSB0YWJsZS4KKyAgc3RydWN0IEluZm8geworICAgIC8vLyBBIG51bGwgdGVybWluYXRlZCBhcnJheSBvZiBwcmVmaXggc3RyaW5ncyB0byBhcHBseSB0byBuYW1lIHdoaWxlCisgICAgLy8vIG1hdGNoaW5nLgorICAgIGNvbnN0IGNoYXIgKmNvbnN0ICpQcmVmaXhlczsKKyAgICBjb25zdCBjaGFyICpOYW1lOworICAgIGNvbnN0IGNoYXIgKkhlbHBUZXh0OworICAgIGNvbnN0IGNoYXIgKk1ldGFWYXI7CisgICAgdW5zaWduZWQgSUQ7CisgICAgdW5zaWduZWQgY2hhciBLaW5kOworICAgIHVuc2lnbmVkIGNoYXIgUGFyYW07CisgICAgdW5zaWduZWQgc2hvcnQgRmxhZ3M7CisgICAgdW5zaWduZWQgc2hvcnQgR3JvdXBJRDsKKyAgICB1bnNpZ25lZCBzaG9ydCBBbGlhc0lEOworICAgIGNvbnN0IGNoYXIgKkFsaWFzQXJnczsKKyAgICBjb25zdCBjaGFyICpWYWx1ZXM7CisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgVGhlIG9wdGlvbiBpbmZvcm1hdGlvbiB0YWJsZS4KKyAgc3RkOjp2ZWN0b3I8SW5mbz4gT3B0aW9uSW5mb3M7CisgIGJvb2wgSWdub3JlQ2FzZTsKKworICB1bnNpZ25lZCBUaGVJbnB1dE9wdGlvbklEID0gMDsKKyAgdW5zaWduZWQgVGhlVW5rbm93bk9wdGlvbklEID0gMDsKKworICAvLy8gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvcHRpb24gd2hpY2ggY2FuIGJlIHBhcnNlZCAoaS5lLiwgaXMgbm90IGEKKyAgLy8vIHNwZWNpYWwgb3B0aW9uIGxpa2UgJ2lucHV0JyBvciAndW5rbm93bicsIGFuZCBpcyBub3QgYW4gb3B0aW9uIGdyb3VwKS4KKyAgdW5zaWduZWQgRmlyc3RTZWFyY2hhYmxlSW5kZXggPSAwOworCisgIC8vLyBUaGUgdW5pb24gb2YgYWxsIG9wdGlvbiBwcmVmaXhlcy4gSWYgYW4gYXJndW1lbnQgZG9lcyBub3QgYmVnaW4gd2l0aAorICAvLy8gb25lIG9mIHRoZXNlLCBpdCBpcyBhbiBpbnB1dC4KKyAgU3RyaW5nU2V0PD4gUHJlZml4ZXNVbmlvbjsKKyAgc3RkOjpzdHJpbmcgUHJlZml4Q2hhcnM7CisKK3ByaXZhdGU6CisgIGNvbnN0IEluZm8gJmdldEluZm8oT3B0U3BlY2lmaWVyIE9wdCkgY29uc3QgeworICAgIHVuc2lnbmVkIGlkID0gT3B0LmdldElEKCk7CisgICAgYXNzZXJ0KGlkID4gMCAmJiBpZCAtIDEgPCBnZXROdW1PcHRpb25zKCkgJiYgIkludmFsaWQgT3B0aW9uIElELiIpOworICAgIHJldHVybiBPcHRpb25JbmZvc1tpZCAtIDFdOworICB9CisKK3Byb3RlY3RlZDoKKyAgT3B0VGFibGUoQXJyYXlSZWY8SW5mbz4gT3B0aW9uSW5mb3MsIGJvb2wgSWdub3JlQ2FzZSA9IGZhbHNlKTsKKworcHVibGljOgorICB+T3B0VGFibGUoKTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIG9wdGlvbiBjbGFzc2VzLgorICB1bnNpZ25lZCBnZXROdW1PcHRpb25zKCkgY29uc3QgeyByZXR1cm4gT3B0aW9uSW5mb3Muc2l6ZSgpOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGdpdmVuIE9wdCdzIE9wdGlvbiBpbnN0YW5jZSwgbGF6aWx5IGNyZWF0aW5nIGl0CisgIC8vLyBpZiBuZWNlc3NhcnkuCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgb3B0aW9uLCBvciBudWxsIGZvciB0aGUgSU5WQUxJRCBvcHRpb24gaWQuCisgIGNvbnN0IE9wdGlvbiBnZXRPcHRpb24oT3B0U3BlY2lmaWVyIE9wdCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBMb29rdXAgdGhlIG5hbWUgb2YgdGhlIGdpdmVuIG9wdGlvbi4KKyAgY29uc3QgY2hhciAqZ2V0T3B0aW9uTmFtZShPcHRTcGVjaWZpZXIgaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW5mbyhpZCkuTmFtZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBraW5kIG9mIHRoZSBnaXZlbiBvcHRpb24uCisgIHVuc2lnbmVkIGdldE9wdGlvbktpbmQoT3B0U3BlY2lmaWVyIGlkKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEluZm8oaWQpLktpbmQ7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgZ3JvdXAgaWQgZm9yIHRoZSBnaXZlbiBvcHRpb24uCisgIHVuc2lnbmVkIGdldE9wdGlvbkdyb3VwSUQoT3B0U3BlY2lmaWVyIGlkKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEluZm8oaWQpLkdyb3VwSUQ7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgaGVscCB0ZXh0IHRvIHVzZSB0byBkZXNjcmliZSB0aGlzIG9wdGlvbi4KKyAgY29uc3QgY2hhciAqZ2V0T3B0aW9uSGVscFRleHQoT3B0U3BlY2lmaWVyIGlkKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEluZm8oaWQpLkhlbHBUZXh0OworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG1ldGEtdmFyaWFibGUgbmFtZSB0byB1c2Ugd2hlbiBkZXNjcmliaW5nCisgIC8vLyB0aGlzIG9wdGlvbnMgdmFsdWVzIGluIHRoZSBoZWxwIHRleHQuCisgIGNvbnN0IGNoYXIgKmdldE9wdGlvbk1ldGFWYXIoT3B0U3BlY2lmaWVyIGlkKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEluZm8oaWQpLk1ldGFWYXI7CisgIH0KKworICAvLy8gRmluZCBwb3NzaWJsZSB2YWx1ZSBmb3IgZ2l2ZW4gZmxhZ3MuIFRoaXMgaXMgdXNlZCBmb3Igc2hlbGwKKyAgLy8vIGF1dG9jb21wbGV0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBbaW5dIE9wdGlvbiAtIEtleSBmbGFnIGxpa2UgIi1zdGRsaWI9IiB3aGVuICItc3RkbGliPWwiCisgIC8vLyB3YXMgcGFzc2VkIHRvIGNsYW5nLgorICAvLy8KKyAgLy8vIFxwYXJhbSBbaW5dIEFyZyAtIFZhbHVlIHdoaWNoIHdlIHdhbnQgdG8gYXV0b2NvbXBsZXRlIGxpa2UgImwiCisgIC8vLyB3aGVuICItc3RkbGliPWwiIHdhcyBwYXNzZWQgdG8gY2xhbmcuCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgdmVjdG9yIG9mIHBvc3NpYmxlIHZhbHVlcy4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN1Z2dlc3RWYWx1ZUNvbXBsZXRpb25zKFN0cmluZ1JlZiBPcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQXJnKSBjb25zdDsKKworICAvLy8gRmluZCBmbGFncyBmcm9tIE9wdFRhYmxlIHdoaWNoIHN0YXJ0cyB3aXRoIEN1ci4KKyAgLy8vCisgIC8vLyBccGFyYW0gW2luXSBDdXIgLSBTdHJpbmcgcHJlZml4IHRoYXQgYWxsIHJldHVybmVkIGZsYWdzIG5lZWQKKyAgLy8gIHRvIHN0YXJ0IHdpdGguCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgdmVjdG9yIG9mIGZsYWdzIHdoaWNoIHN0YXJ0IHdpdGggQ3VyLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZmluZEJ5UHJlZml4KFN0cmluZ1JlZiBDdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgRGlzYWJsZUZsYWdzKSBjb25zdDsKKworICAvLy8gRmluZCB0aGUgT3B0VGFibGUgb3B0aW9uIHRoYXQgbW9zdCBjbG9zZWx5IG1hdGNoZXMgdGhlIGdpdmVuIHN0cmluZy4KKyAgLy8vCisgIC8vLyBccGFyYW0gW2luXSBPcHRpb24gLSBBIHN0cmluZywgc3VjaCBhcyAiLXN0ZGxpYnM9bCIsIHRoYXQgcmVwcmVzZW50cyB1c2VyCisgIC8vLyBpbnB1dCBvZiBhbiBvcHRpb24gdGhhdCBtYXkgbm90IGV4aXN0IGluIHRoZSBPcHRUYWJsZS4gTm90ZSB0aGF0IHRoZQorICAvLy8gc3RyaW5nIGluY2x1ZGVzIHByZWZpeCBkYXNoZXMgIi0iIGFzIHdlbGwgYXMgdmFsdWVzICI9bCIuCisgIC8vLyBccGFyYW0gW291dF0gTmVhcmVzdFN0cmluZyAtIFRoZSBuZWFyZXN0IG9wdGlvbiBzdHJpbmcgZm91bmQgaW4gdGhlCisgIC8vLyBPcHRUYWJsZS4KKyAgLy8vIFxwYXJhbSBbaW5dIEZsYWdzVG9JbmNsdWRlIC0gT25seSBmaW5kIG9wdGlvbnMgd2l0aCBhbnkgb2YgdGhlc2UgZmxhZ3MuCisgIC8vLyBaZXJvIGlzIHRoZSBkZWZhdWx0LCB3aGljaCBpbmNsdWRlcyBhbGwgZmxhZ3MuCisgIC8vLyBccGFyYW0gW2luXSBGbGFnc1RvRXhjbHVkZSAtIERvbid0IGZpbmQgb3B0aW9ucyB3aXRoIHRoaXMgZmxhZy4gWmVybworICAvLy8gaXMgdGhlIGRlZmF1bHQsIGFuZCBtZWFucyBleGNsdWRlIG5vdGhpbmcuCisgIC8vLyBccGFyYW0gW2luXSBNaW5pbXVtTGVuZ3RoIC0gRG9uJ3QgZmluZCBvcHRpb25zIHNob3J0ZXIgdGhhbiB0aGlzIGxlbmd0aC4KKyAgLy8vIEZvciBleGFtcGxlLCBhIG1pbmltdW0gbGVuZ3RoIG9mIDMgcHJldmVudHMgIi14IiBmcm9tIGJlaW5nIGNvbnNpZGVyZWQKKyAgLy8vIG5lYXIgdG8gIi1TIi4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBlZGl0IGRpc3RhbmNlIG9mIHRoZSBuZWFyZXN0IHN0cmluZyBmb3VuZC4KKyAgdW5zaWduZWQgZmluZE5lYXJlc3QoU3RyaW5nUmVmIE9wdGlvbiwgc3RkOjpzdHJpbmcgJk5lYXJlc3RTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzVG9JbmNsdWRlID0gMCwgdW5zaWduZWQgRmxhZ3NUb0V4Y2x1ZGUgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNaW5pbXVtTGVuZ3RoID0gNCkgY29uc3Q7CisKKyAgLy8vIEFkZCBWYWx1ZXMgdG8gT3B0aW9uJ3MgVmFsdWVzIGNsYXNzCisgIC8vLworICAvLy8gXHBhcmFtIFtpbl0gT3B0aW9uIC0gUHJlZml4ICsgTmFtZSBvZiB0aGUgZmxhZyB3aGljaCBWYWx1ZXMgd2lsbCBiZQorICAvLy8gIGNoYW5nZWQuIEZvciBleGFtcGxlLCAiLWFuYWx5emVyLWNoZWNrZXIiLgorICAvLy8gXHBhcmFtIFtpbl0gVmFsdWVzIC0gU3RyaW5nIG9mIFZhbHVlcyBzZXBlcmF0ZWQgYnkgIiwiLCBzdWNoIGFzCisgIC8vLyAgImZvbywgYmFyLi4iLCB3aGVyZSBmb28gYW5kIGJhciBpcyB0aGUgYXJndW1lbnQgd2hpY2ggdGhlIE9wdGlvbiBmbGFnCisgIC8vLyAgdGFrZXMKKyAgLy8vCisgIC8vLyBccmV0dXJuIHRydWUgaW4gc3VjY2VzcywgYW5kIGZhbHNlIGluIGZhaWwuCisgIGJvb2wgYWRkVmFsdWVzKGNvbnN0IGNoYXIgKk9wdGlvbiwgY29uc3QgY2hhciAqVmFsdWVzKTsKKworICAvLy8gXGJyaWVmIFBhcnNlIGEgc2luZ2xlIGFyZ3VtZW50OyByZXR1cm5pbmcgdGhlIG5ldyBhcmd1bWVudCBhbmQKKyAgLy8vIHVwZGF0aW5nIEluZGV4LgorICAvLy8KKyAgLy8vIFxwYXJhbSBbaW4sb3V0XSBJbmRleCAtIFRoZSBjdXJyZW50IHBhcnNpbmcgcG9zaXRpb24gaW4gdGhlIGFyZ3VtZW50CisgIC8vLyBzdHJpbmcgbGlzdDsgb24gcmV0dXJuIHRoaXMgd2lsbCBiZSB0aGUgaW5kZXggb2YgdGhlIG5leHQgYXJndW1lbnQKKyAgLy8vIHN0cmluZyB0byBwYXJzZS4KKyAgLy8vIFxwYXJhbSBbaW5dIEZsYWdzVG9JbmNsdWRlIC0gT25seSBwYXJzZSBvcHRpb25zIHdpdGggYW55IG9mIHRoZXNlIGZsYWdzLgorICAvLy8gWmVybyBpcyB0aGUgZGVmYXVsdCB3aGljaCBpbmNsdWRlcyBhbGwgZmxhZ3MuCisgIC8vLyBccGFyYW0gW2luXSBGbGFnc1RvRXhjbHVkZSAtIERvbid0IHBhcnNlIG9wdGlvbnMgd2l0aCB0aGlzIGZsYWcuICBaZXJvCisgIC8vLyBpcyB0aGUgZGVmYXVsdCBhbmQgbWVhbnMgZXhjbHVkZSBub3RoaW5nLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVGhlIHBhcnNlZCBhcmd1bWVudCwgb3IgMCBpZiB0aGUgYXJndW1lbnQgaXMgbWlzc2luZyB2YWx1ZXMKKyAgLy8vIChpbiB3aGljaCBjYXNlIEluZGV4IHN0aWxsIHBvaW50cyBhdCB0aGUgY29uY2VwdHVhbCBuZXh0IGFyZ3VtZW50IHN0cmluZworICAvLy8gdG8gcGFyc2UpLgorICBBcmcgKlBhcnNlT25lQXJnKGNvbnN0IEFyZ0xpc3QgJkFyZ3MsIHVuc2lnbmVkICZJbmRleCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGbGFnc1RvSW5jbHVkZSA9IDAsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmxhZ3NUb0V4Y2x1ZGUgPSAwKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFBhcnNlIGFuIGxpc3Qgb2YgYXJndW1lbnRzIGludG8gYW4gSW5wdXRBcmdMaXN0LgorICAvLy8KKyAgLy8vIFRoZSByZXN1bHRpbmcgSW5wdXRBcmdMaXN0IHdpbGwgcmVmZXJlbmNlIHRoZSBzdHJpbmdzIGluIFtccCBBcmdCZWdpbiwKKyAgLy8vIFxwIEFyZ0VuZCksIGFuZCB0aGVpciBsaWZldGltZSBzaG91bGQgZXh0ZW5kIHBhc3QgdGhhdCBvZiB0aGUgcmV0dXJuZWQKKyAgLy8vIElucHV0QXJnTGlzdC4KKyAgLy8vCisgIC8vLyBUaGUgb25seSBlcnJvciB0aGF0IGNhbiBvY2N1ciBpbiB0aGlzIHJvdXRpbmUgaXMgaWYgYW4gYXJndW1lbnQgaXMKKyAgLy8vIG1pc3NpbmcgdmFsdWVzOyBpbiB0aGlzIGNhc2UgXHAgTWlzc2luZ0FyZ0NvdW50IHdpbGwgYmUgbm9uLXplcm8uCisgIC8vLworICAvLy8gXHBhcmFtIE1pc3NpbmdBcmdJbmRleCAtIE9uIGVycm9yLCB0aGUgaW5kZXggb2YgdGhlIG9wdGlvbiB3aGljaCBjb3VsZAorICAvLy8gbm90IGJlIHBhcnNlZC4KKyAgLy8vIFxwYXJhbSBNaXNzaW5nQXJnQ291bnQgLSBPbiBlcnJvciwgdGhlIG51bWJlciBvZiBtaXNzaW5nIG9wdGlvbnMuCisgIC8vLyBccGFyYW0gRmxhZ3NUb0luY2x1ZGUgLSBPbmx5IHBhcnNlIG9wdGlvbnMgd2l0aCBhbnkgb2YgdGhlc2UgZmxhZ3MuCisgIC8vLyBaZXJvIGlzIHRoZSBkZWZhdWx0IHdoaWNoIGluY2x1ZGVzIGFsbCBmbGFncy4KKyAgLy8vIFxwYXJhbSBGbGFnc1RvRXhjbHVkZSAtIERvbid0IHBhcnNlIG9wdGlvbnMgd2l0aCB0aGlzIGZsYWcuICBaZXJvCisgIC8vLyBpcyB0aGUgZGVmYXVsdCBhbmQgbWVhbnMgZXhjbHVkZSBub3RoaW5nLgorICAvLy8gXHJldHVybiBBbiBJbnB1dEFyZ0xpc3Q7IG9uIGVycm9yIHRoaXMgd2lsbCBjb250YWluIGFsbCB0aGUgb3B0aW9ucworICAvLy8gd2hpY2ggY291bGQgYmUgcGFyc2VkLgorICBJbnB1dEFyZ0xpc3QgUGFyc2VBcmdzKEFycmF5UmVmPGNvbnN0IGNoYXIgKj4gQXJncywgdW5zaWduZWQgJk1pc3NpbmdBcmdJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTWlzc2luZ0FyZ0NvdW50LCB1bnNpZ25lZCBGbGFnc1RvSW5jbHVkZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmxhZ3NUb0V4Y2x1ZGUgPSAwKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJlbmRlciB0aGUgaGVscCB0ZXh0IGZvciBhbiBvcHRpb24gdGFibGUuCisgIC8vLworICAvLy8gXHBhcmFtIE9TIC0gVGhlIHN0cmVhbSB0byB3cml0ZSB0aGUgaGVscCB0ZXh0IHRvLgorICAvLy8gXHBhcmFtIE5hbWUgLSBUaGUgbmFtZSB0byB1c2UgaW4gdGhlIHVzYWdlIGxpbmUuCisgIC8vLyBccGFyYW0gVGl0bGUgLSBUaGUgdGl0bGUgdG8gdXNlIGluIHRoZSB1c2FnZSBsaW5lLgorICAvLy8gXHBhcmFtIEZsYWdzVG9JbmNsdWRlIC0gSWYgbm9uLXplcm8sIG9ubHkgaW5jbHVkZSBvcHRpb25zIHdpdGggYW55CisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGVzZSBmbGFncyBzZXQuCisgIC8vLyBccGFyYW0gRmxhZ3NUb0V4Y2x1ZGUgLSBFeGNsdWRlIG9wdGlvbnMgd2l0aCBhbnkgb2YgdGhlc2UgZmxhZ3Mgc2V0LgorICAvLy8gXHBhcmFtIFNob3dBbGxBbGlhc2VzIC0gSWYgdHJ1ZSwgZGlzcGxheSBhbGwgb3B0aW9ucyBpbmNsdWRpbmcgYWxpYXNlcworICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBkb24ndCBoYXZlIGhlbHAgdGV4dHMuIEJ5IGRlZmF1bHQsIHdlIGRpc3BsYXkKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgb3B0aW9ucyB0aGF0IGFyZSBub3QgaGlkZGVuIGFuZCBoYXZlIGhlbHAKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRzLgorICB2b2lkIFByaW50SGVscChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IGNoYXIgKk5hbWUsIGNvbnN0IGNoYXIgKlRpdGxlLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGbGFnc1RvSW5jbHVkZSwgdW5zaWduZWQgRmxhZ3NUb0V4Y2x1ZGUsCisgICAgICAgICAgICAgICAgIGJvb2wgU2hvd0FsbEFsaWFzZXMpIGNvbnN0OworCisgIHZvaWQgUHJpbnRIZWxwKHJhd19vc3RyZWFtICZPUywgY29uc3QgY2hhciAqTmFtZSwgY29uc3QgY2hhciAqVGl0bGUsCisgICAgICAgICAgICAgICAgIGJvb2wgU2hvd0hpZGRlbiA9IGZhbHNlLCBib29sIFNob3dBbGxBbGlhc2VzID0gZmFsc2UpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9wdAorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9PUFRJT05fT1BUVEFCTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PcHRpb24vT3B0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09wdGlvbi9PcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWFlYmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PcHRpb24vT3B0aW9uLmgKQEAgLTAsMCArMSwyMTggQEAKKy8vPT09LSBPcHRpb24uaCAtIEFic3RyYWN0IERyaXZlciBPcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PUFRJT05fT1BUSU9OX0gKKyNkZWZpbmUgTExWTV9PUFRJT05fT1BUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9PcHRpb24vT3B0U3BlY2lmaWVyLmgiCisjaW5jbHVkZSAibGx2bS9PcHRpb24vT3B0VGFibGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCituYW1lc3BhY2Ugb3B0IHsKKworY2xhc3MgQXJnOworY2xhc3MgQXJnTGlzdDsKKworLy8vIEFyZ1N0cmluZ0xpc3QgLSBUeXBlIHVzZWQgZm9yIGNvbnN0cnVjdGluZyBhcmd2IGxpc3RzIGZvciBzdWJwcm9jZXNzZXMuCit1c2luZyBBcmdTdHJpbmdMaXN0ID0gU21hbGxWZWN0b3I8Y29uc3QgY2hhciAqLCAxNj47CisKKy8vLyBCYXNlIGZsYWdzIGZvciBhbGwgb3B0aW9ucy4gQ3VzdG9tIGZsYWdzIG1heSBiZSBhZGRlZCBhZnRlci4KK2VudW0gRHJpdmVyRmxhZyB7CisgIEhlbHBIaWRkZW4gICAgICAgPSAoMSA8PCAwKSwKKyAgUmVuZGVyQXNJbnB1dCAgICA9ICgxIDw8IDEpLAorICBSZW5kZXJKb2luZWQgICAgID0gKDEgPDwgMiksCisgIFJlbmRlclNlcGFyYXRlICAgPSAoMSA8PCAzKQorfTsKKworLy8vIE9wdGlvbiAtIEFic3RyYWN0IHJlcHJlc2VudGF0aW9uIGZvciBhIHNpbmdsZSBmb3JtIG9mIGRyaXZlcgorLy8vIGFyZ3VtZW50LgorLy8vCisvLy8gQW4gT3B0aW9uIGNsYXNzIHJlcHJlc2VudHMgYSBmb3JtIG9mIG9wdGlvbiB0aGF0IHRoZSBkcml2ZXIKKy8vLyB0YWtlcywgZm9yIGV4YW1wbGUgaG93IG1hbnkgYXJndW1lbnRzIHRoZSBvcHRpb24gaGFzIGFuZCBob3cKKy8vLyB0aGV5IGNhbiBiZSBwcm92aWRlZC4gSW5kaXZpZHVhbCBvcHRpb24gaW5zdGFuY2VzIHN0b3JlCisvLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGdyb3VwIHRoZSBvcHRpb24gaXMgYSBtZW1iZXIKKy8vLyBvZiAoaWYgYW55KSwgaWYgdGhlIG9wdGlvbiBpcyBhbiBhbGlhcywgYW5kIGEgbnVtYmVyIG9mCisvLy8gZmxhZ3MuIEF0IHJ1bnRpbWUgdGhlIGRyaXZlciBwYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBpbnRvCisvLy8gY29uY3JldGUgQXJnIGluc3RhbmNlcywgZWFjaCBvZiB3aGljaCBjb3JyZXNwb25kcyB0byBhCisvLy8gcGFydGljdWxhciBPcHRpb24gaW5zdGFuY2UuCitjbGFzcyBPcHRpb24geworcHVibGljOgorICBlbnVtIE9wdGlvbkNsYXNzIHsKKyAgICBHcm91cENsYXNzID0gMCwKKyAgICBJbnB1dENsYXNzLAorICAgIFVua25vd25DbGFzcywKKyAgICBGbGFnQ2xhc3MsCisgICAgSm9pbmVkQ2xhc3MsCisgICAgVmFsdWVzQ2xhc3MsCisgICAgU2VwYXJhdGVDbGFzcywKKyAgICBSZW1haW5pbmdBcmdzQ2xhc3MsCisgICAgUmVtYWluaW5nQXJnc0pvaW5lZENsYXNzLAorICAgIENvbW1hSm9pbmVkQ2xhc3MsCisgICAgTXVsdGlBcmdDbGFzcywKKyAgICBKb2luZWRPclNlcGFyYXRlQ2xhc3MsCisgICAgSm9pbmVkQW5kU2VwYXJhdGVDbGFzcworICB9OworCisgIGVudW0gUmVuZGVyU3R5bGVLaW5kIHsKKyAgICBSZW5kZXJDb21tYUpvaW5lZFN0eWxlLAorICAgIFJlbmRlckpvaW5lZFN0eWxlLAorICAgIFJlbmRlclNlcGFyYXRlU3R5bGUsCisgICAgUmVuZGVyVmFsdWVzU3R5bGUKKyAgfTsKKworcHJvdGVjdGVkOgorICBjb25zdCBPcHRUYWJsZTo6SW5mbyAqSW5mbzsKKyAgY29uc3QgT3B0VGFibGUgKk93bmVyOworCitwdWJsaWM6CisgIE9wdGlvbihjb25zdCBPcHRUYWJsZTo6SW5mbyAqSW5mbywgY29uc3QgT3B0VGFibGUgKk93bmVyKTsKKworICBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgcmV0dXJuIEluZm8gIT0gbnVsbHB0cjsKKyAgfQorCisgIHVuc2lnbmVkIGdldElEKCkgY29uc3QgeworICAgIGFzc2VydChJbmZvICYmICJNdXN0IGhhdmUgYSB2YWxpZCBpbmZvISIpOworICAgIHJldHVybiBJbmZvLT5JRDsKKyAgfQorCisgIE9wdGlvbkNsYXNzIGdldEtpbmQoKSBjb25zdCB7CisgICAgYXNzZXJ0KEluZm8gJiYgIk11c3QgaGF2ZSBhIHZhbGlkIGluZm8hIik7CisgICAgcmV0dXJuIE9wdGlvbkNsYXNzKEluZm8tPktpbmQpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBvcHRpb24gd2l0aG91dCBhbnkgcHJlZml4LgorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSW5mbyAmJiAiTXVzdCBoYXZlIGEgdmFsaWQgaW5mbyEiKTsKKyAgICByZXR1cm4gSW5mby0+TmFtZTsKKyAgfQorCisgIGNvbnN0IE9wdGlvbiBnZXRHcm91cCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSW5mbyAmJiAiTXVzdCBoYXZlIGEgdmFsaWQgaW5mbyEiKTsKKyAgICBhc3NlcnQoT3duZXIgJiYgIk11c3QgaGF2ZSBhIHZhbGlkIG93bmVyISIpOworICAgIHJldHVybiBPd25lci0+Z2V0T3B0aW9uKEluZm8tPkdyb3VwSUQpOworICB9CisKKyAgY29uc3QgT3B0aW9uIGdldEFsaWFzKCkgY29uc3QgeworICAgIGFzc2VydChJbmZvICYmICJNdXN0IGhhdmUgYSB2YWxpZCBpbmZvISIpOworICAgIGFzc2VydChPd25lciAmJiAiTXVzdCBoYXZlIGEgdmFsaWQgb3duZXIhIik7CisgICAgcmV0dXJuIE93bmVyLT5nZXRPcHRpb24oSW5mby0+QWxpYXNJRCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgYWxpYXMgYXJndW1lbnRzIGFzIGEgXDAgc2VwYXJhdGVkIGxpc3QuCisgIC8vLyBFLmcuIFsiZm9vIiwgImJhciJdIHdvdWxkIGJlIHJldHVybmVkIGFzICJmb29cMGJhclwwIi4KKyAgY29uc3QgY2hhciAqZ2V0QWxpYXNBcmdzKCkgY29uc3QgeworICAgIGFzc2VydChJbmZvICYmICJNdXN0IGhhdmUgYSB2YWxpZCBpbmZvISIpOworICAgIGFzc2VydCgoIUluZm8tPkFsaWFzQXJncyB8fCBJbmZvLT5BbGlhc0FyZ3NbMF0gIT0gMCkgJiYKKyAgICAgICAgICAgIkFsaWFzQXJncyBzaG91bGQgYmUgZWl0aGVyIDAgb3Igbm9uLWVtcHR5LiIpOworCisgICAgcmV0dXJuIEluZm8tPkFsaWFzQXJnczsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBkZWZhdWx0IHByZWZpeCBmb3IgdGhpcyBvcHRpb24uCisgIFN0cmluZ1JlZiBnZXRQcmVmaXgoKSBjb25zdCB7CisgICAgY29uc3QgY2hhciAqUHJlZml4ID0gKkluZm8tPlByZWZpeGVzOworICAgIHJldHVybiBQcmVmaXggPyBQcmVmaXggOiBTdHJpbmdSZWYoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBuYW1lIG9mIHRoaXMgb3B0aW9uIHdpdGggdGhlIGRlZmF1bHQgcHJlZml4LgorICBzdGQ6OnN0cmluZyBnZXRQcmVmaXhlZE5hbWUoKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmcgUmV0ID0gZ2V0UHJlZml4KCk7CisgICAgUmV0ICs9IGdldE5hbWUoKTsKKyAgICByZXR1cm4gUmV0OworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtQXJncygpIGNvbnN0IHsgcmV0dXJuIEluZm8tPlBhcmFtOyB9CisKKyAgYm9vbCBoYXNOb09wdEFzSW5wdXQoKSBjb25zdCB7IHJldHVybiBJbmZvLT5GbGFncyAmIFJlbmRlckFzSW5wdXQ7fQorCisgIFJlbmRlclN0eWxlS2luZCBnZXRSZW5kZXJTdHlsZSgpIGNvbnN0IHsKKyAgICBpZiAoSW5mby0+RmxhZ3MgJiBSZW5kZXJKb2luZWQpCisgICAgICByZXR1cm4gUmVuZGVySm9pbmVkU3R5bGU7CisgICAgaWYgKEluZm8tPkZsYWdzICYgUmVuZGVyU2VwYXJhdGUpCisgICAgICByZXR1cm4gUmVuZGVyU2VwYXJhdGVTdHlsZTsKKyAgICBzd2l0Y2ggKGdldEtpbmQoKSkgeworICAgIGNhc2UgR3JvdXBDbGFzczoKKyAgICBjYXNlIElucHV0Q2xhc3M6CisgICAgY2FzZSBVbmtub3duQ2xhc3M6CisgICAgICByZXR1cm4gUmVuZGVyVmFsdWVzU3R5bGU7CisgICAgY2FzZSBKb2luZWRDbGFzczoKKyAgICBjYXNlIEpvaW5lZEFuZFNlcGFyYXRlQ2xhc3M6CisgICAgICByZXR1cm4gUmVuZGVySm9pbmVkU3R5bGU7CisgICAgY2FzZSBDb21tYUpvaW5lZENsYXNzOgorICAgICAgcmV0dXJuIFJlbmRlckNvbW1hSm9pbmVkU3R5bGU7CisgICAgY2FzZSBGbGFnQ2xhc3M6CisgICAgY2FzZSBWYWx1ZXNDbGFzczoKKyAgICBjYXNlIFNlcGFyYXRlQ2xhc3M6CisgICAgY2FzZSBNdWx0aUFyZ0NsYXNzOgorICAgIGNhc2UgSm9pbmVkT3JTZXBhcmF0ZUNsYXNzOgorICAgIGNhc2UgUmVtYWluaW5nQXJnc0NsYXNzOgorICAgIGNhc2UgUmVtYWluaW5nQXJnc0pvaW5lZENsYXNzOgorICAgICAgcmV0dXJuIFJlbmRlclNlcGFyYXRlU3R5bGU7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQga2luZCEiKTsKKyAgfQorCisgIC8vLyBUZXN0IGlmIHRoaXMgb3B0aW9uIGhhcyB0aGUgZmxhZyBcYSBWYWwuCisgIGJvb2wgaGFzRmxhZyh1bnNpZ25lZCBWYWwpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5mby0+RmxhZ3MgJiBWYWw7CisgIH0KKworICAvLy8gZ2V0VW5hbGlhc2VkT3B0aW9uIC0gUmV0dXJuIHRoZSBmaW5hbCBvcHRpb24gdGhpcyBvcHRpb24KKyAgLy8vIGFsaWFzZXMgKGl0c2VsZiwgaWYgdGhlIG9wdGlvbiBoYXMgbm8gYWxpYXMpLgorICBjb25zdCBPcHRpb24gZ2V0VW5hbGlhc2VkT3B0aW9uKCkgY29uc3QgeworICAgIGNvbnN0IE9wdGlvbiBBbGlhcyA9IGdldEFsaWFzKCk7CisgICAgaWYgKEFsaWFzLmlzVmFsaWQoKSkgcmV0dXJuIEFsaWFzLmdldFVuYWxpYXNlZE9wdGlvbigpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBnZXRSZW5kZXJOYW1lIC0gUmV0dXJuIHRoZSBuYW1lIHRvIHVzZSB3aGVuIHJlbmRlcmluZyB0aGlzCisgIC8vLyBvcHRpb24uCisgIFN0cmluZ1JlZiBnZXRSZW5kZXJOYW1lKCkgY29uc3QgeworICAgIHJldHVybiBnZXRVbmFsaWFzZWRPcHRpb24oKS5nZXROYW1lKCk7CisgIH0KKworICAvLy8gbWF0Y2hlcyAtIFByZWRpY2F0ZSBmb3Igd2hldGhlciB0aGlzIG9wdGlvbiBpcyBwYXJ0IG9mIHRoZQorICAvLy8gZ2l2ZW4gb3B0aW9uICh3aGljaCBtYXkgYmUgYSBncm91cCkuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IG1hdGNoZXMgYWdhaW5zdCBvcHRpb25zIHdoaWNoIGFyZSBhbiBhbGlhcyBzaG91bGQgbmV2ZXIgYmUKKyAgLy8vIGRvbmUgLS0gYWxpYXNlcyBkbyBub3QgcGFydGljaXBhdGUgaW4gbWF0Y2hpbmcgYW5kIHNvIHN1Y2ggYSBxdWVyeSB3aWxsCisgIC8vLyBhbHdheXMgYmUgZmFsc2UuCisgIGJvb2wgbWF0Y2hlcyhPcHRTcGVjaWZpZXIgSUQpIGNvbnN0OworCisgIC8vLyBhY2NlcHQgLSBQb3RlbnRpYWxseSBhY2NlcHQgdGhlIGN1cnJlbnQgYXJndW1lbnQsIHJldHVybmluZyBhCisgIC8vLyBuZXcgQXJnIGluc3RhbmNlLCBvciAwIGlmIHRoZSBvcHRpb24gZG9lcyBub3QgYWNjZXB0IHRoaXMKKyAgLy8vIGFyZ3VtZW50IChvciB0aGUgYXJndW1lbnQgaXMgbWlzc2luZyB2YWx1ZXMpLgorICAvLy8KKyAgLy8vIElmIHRoZSBvcHRpb24gYWNjZXB0cyB0aGUgY3VycmVudCBhcmd1bWVudCwgYWNjZXB0KCkgc2V0cworICAvLy8gSW5kZXggdG8gdGhlIHBvc2l0aW9uIHdoZXJlIGFyZ3VtZW50IHBhcnNpbmcgc2hvdWxkIHJlc3VtZQorICAvLy8gKGV2ZW4gaWYgdGhlIGFyZ3VtZW50IGlzIG1pc3NpbmcgdmFsdWVzKS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQXJnU2l6ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRha2VuIHVwIGJ5IHRoZSBtYXRjaGVkIE9wdGlvbiBwcmVmaXgKKyAgLy8vICAgICAgICAgICAgICAgIGFuZCBuYW1lLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXJlIGpvaW5lZCB2YWx1ZXMKKyAgLy8vICAgICAgICAgICAgICAgIHN0YXJ0LgorICBBcmcgKmFjY2VwdChjb25zdCBBcmdMaXN0ICZBcmdzLCB1bnNpZ25lZCAmSW5kZXgsIHVuc2lnbmVkIEFyZ1NpemUpIGNvbnN0OworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8pIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvcHQKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT1BUSU9OX09QVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Bhc3MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUGFzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOWIzNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Bhc3MuaApAQCAtMCwwICsxLDM3OCBAQAorLy89PT0tIGxsdm0vUGFzcy5oIC0gQmFzZSBjbGFzcyBmb3IgUGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIGJhc2UgY2xhc3MgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhIHNwZWNpZmllZCBjbGFzcyBpcyBhCisvLyB0cmFuc2Zvcm1hdGlvbiBwYXNzIGltcGxlbWVudGF0aW9uLgorLy8KKy8vIFBhc3NlcyBhcmUgZGVzaWduZWQgdGhpcyB3YXkgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBydW4gcGFzc2VzIGluIGEgY2FjaGUKKy8vIGFuZCBvcmdhbml6YXRpb25hbGx5IG9wdGltYWwgb3JkZXIgd2l0aG91dCBoYXZpbmcgdG8gc3BlY2lmeSBpdCBhdCB0aGUgZnJvbnQKKy8vIGVuZC4gIFRoaXMgYWxsb3dzIGFyYml0cmFyeSBwYXNzZXMgdG8gYmUgc3RydW5nIHRvZ2V0aGVyIGFuZCBoYXZlIHRoZW0KKy8vIGV4ZWN1dGVkIGFzIGVmZmljaWVudGx5IGFzIHBvc3NpYmxlLgorLy8KKy8vIFBhc3NlcyBzaG91bGQgZXh0ZW5kIG9uZSBvZiB0aGUgY2xhc3NlcyBiZWxvdywgZGVwZW5kaW5nIG9uIHRoZSBndWFyYW50ZWVzCisvLyB0aGF0IGl0IGNhbiBtYWtlIGFib3V0IHdoYXQgd2lsbCBiZSBtb2RpZmllZCBhcyBpdCBpcyBydW4uICBGb3IgZXhhbXBsZSwgbW9zdAorLy8gZ2xvYmFsIG9wdGltaXphdGlvbnMgc2hvdWxkIGRlcml2ZSBmcm9tIEZ1bmN0aW9uUGFzcywgYmVjYXVzZSB0aGV5IGRvIG5vdCBhZGQKKy8vIG9yIGRlbGV0ZSBmdW5jdGlvbnMsIHRoZXkgb3BlcmF0ZSBvbiB0aGUgaW50ZXJuYWxzIG9mIHRoZSBmdW5jdGlvbi4KKy8vCisvLyBOb3RlIHRoYXQgdGhpcyBmaWxlICNpbmNsdWRlcyBQYXNzU3VwcG9ydC5oIGFuZCBQYXNzQW5hbHlzaXNTdXBwb3J0LmggKGF0IHRoZQorLy8gYm90dG9tKSwgc28gdGhlIEFQSXMgZXhwb3NlZCBieSB0aGVzZSBmaWxlcyBhcmUgYWxzbyBhdXRvbWF0aWNhbGx5IGF2YWlsYWJsZQorLy8gdG8gYWxsIHVzZXJzIG9mIHRoaXMgZmlsZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fUEFTU19ICisjZGVmaW5lIExMVk1fUEFTU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQW5hbHlzaXNSZXNvbHZlcjsKK2NsYXNzIEFuYWx5c2lzVXNhZ2U7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbW11dGFibGVQYXNzOworY2xhc3MgTW9kdWxlOworY2xhc3MgUGFzc0luZm87CitjbGFzcyBQTURhdGFNYW5hZ2VyOworY2xhc3MgUE1TdGFjazsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLyBBbmFseXNpc0lEIC0gVXNlIHRoZSBQYXNzSW5mbyB0byBpZGVudGlmeSBhIHBhc3MuLi4KK3VzaW5nIEFuYWx5c2lzSUQgPSBjb25zdCB2b2lkICo7CisKKy8vLyBEaWZmZXJlbnQgdHlwZXMgb2YgaW50ZXJuYWwgcGFzcyBtYW5hZ2Vycy4gRXh0ZXJuYWwgcGFzcyBtYW5hZ2VycworLy8vIChQYXNzTWFuYWdlciBhbmQgRnVuY3Rpb25QYXNzTWFuYWdlcikgYXJlIG5vdCByZXByZXNlbnRlZCBoZXJlLgorLy8vIE9yZGVyaW5nIG9mIHBhc3MgbWFuYWdlciB0eXBlcyBpcyBpbXBvcnRhbnQgaGVyZS4KK2VudW0gUGFzc01hbmFnZXJUeXBlIHsKKyAgUE1UX1Vua25vd24gPSAwLAorICBQTVRfTW9kdWxlUGFzc01hbmFnZXIgPSAxLCAvLy88IE1QUGFzc01hbmFnZXIKKyAgUE1UX0NhbGxHcmFwaFBhc3NNYW5hZ2VyLCAgLy8vPCBDR1Bhc3NNYW5hZ2VyCisgIFBNVF9GdW5jdGlvblBhc3NNYW5hZ2VyLCAgIC8vLzwgRlBQYXNzTWFuYWdlcgorICBQTVRfTG9vcFBhc3NNYW5hZ2VyLCAgICAgICAvLy88IExQUGFzc01hbmFnZXIKKyAgUE1UX1JlZ2lvblBhc3NNYW5hZ2VyLCAgICAgLy8vPCBSR1Bhc3NNYW5hZ2VyCisgIFBNVF9CYXNpY0Jsb2NrUGFzc01hbmFnZXIsIC8vLzwgQkJQYXNzTWFuYWdlcgorICBQTVRfTGFzdAorfTsKKworLy8gRGlmZmVyZW50IHR5cGVzIG9mIHBhc3Nlcy4KK2VudW0gUGFzc0tpbmQgeworICBQVF9CYXNpY0Jsb2NrLAorICBQVF9SZWdpb24sCisgIFBUX0xvb3AsCisgIFBUX0Z1bmN0aW9uLAorICBQVF9DYWxsR3JhcGhTQ0MsCisgIFBUX01vZHVsZSwKKyAgUFRfUGFzc01hbmFnZXIKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gUGFzcyBpbnRlcmZhY2UgLSBJbXBsZW1lbnRlZCBieSBhbGwgJ3Bhc3NlcycuICBTdWJjbGFzcyB0aGlzIGlmIHlvdSBhcmUgYW4KKy8vLyBpbnRlcnByb2NlZHVyYWwgb3B0aW1pemF0aW9uIG9yIHlvdSBkbyBub3QgZml0IGludG8gYW55IG9mIHRoZSBtb3JlCisvLy8gY29uc3RyYWluZWQgcGFzc2VzIGRlc2NyaWJlZCBiZWxvdy4KKy8vLworY2xhc3MgUGFzcyB7CisgIEFuYWx5c2lzUmVzb2x2ZXIgKlJlc29sdmVyID0gbnVsbHB0cjsgIC8vIFVzZWQgdG8gcmVzb2x2ZSBhbmFseXNpcworICBjb25zdCB2b2lkICpQYXNzSUQ7CisgIFBhc3NLaW5kIEtpbmQ7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgUGFzcyhQYXNzS2luZCBLLCBjaGFyICZwaWQpIDogUGFzc0lEKCZwaWQpLCBLaW5kKEspIHt9CisgIFBhc3MoY29uc3QgUGFzcyAmKSA9IGRlbGV0ZTsKKyAgUGFzcyAmb3BlcmF0b3I9KGNvbnN0IFBhc3MgJikgPSBkZWxldGU7CisgIHZpcnR1YWwgflBhc3MoKTsKKworICBQYXNzS2luZCBnZXRQYXNzS2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICAvLy8gZ2V0UGFzc05hbWUgLSBSZXR1cm4gYSBuaWNlIGNsZWFuIG5hbWUgZm9yIGEgcGFzcy4gIFRoaXMgdXN1YWxseQorICAvLy8gaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdGhlIG5hbWUgdGhhdCBpcyByZWdpc3RlcmVkIGJ5IG9uZSBvZiB0aGUKKyAgLy8vIFJlZ2lzdHJhdGlvbiB0ZW1wbGF0ZXMsIGJ1dCBjYW4gYmUgb3ZlcmxvYWRlZCBkaXJlY3RseS4KKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0UGFzc05hbWUoKSBjb25zdDsKKworICAvLy8gZ2V0UGFzc0lEIC0gUmV0dXJuIHRoZSBQYXNzSUQgbnVtYmVyIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBwYXNzLgorICBBbmFseXNpc0lEIGdldFBhc3NJRCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFzc0lEOworICB9CisKKyAgLy8vIGRvSW5pdGlhbGl6YXRpb24gLSBWaXJ0dWFsIG1ldGhvZCBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gZG8KKyAgLy8vIGFueSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24gYmVmb3JlIGFueSBwYXNzIGlzIHJ1bi4KKyAgdmlydHVhbCBib29sIGRvSW5pdGlhbGl6YXRpb24oTW9kdWxlICYpICB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBkb0ZpbmFsaXphdGlvbiAtIFZpcnR1YWwgbWV0aG9kIG92ZXJyaWRlbiBieSBzdWJjbGFzc2VzIHRvIGRvIGFueQorICAvLy8gbmVjZXNzYXJ5IGNsZWFuIHVwIGFmdGVyIGFsbCBwYXNzZXMgaGF2ZSBydW4uCisgIHZpcnR1YWwgYm9vbCBkb0ZpbmFsaXphdGlvbihNb2R1bGUgJikgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gcHJpbnQgLSBQcmludCBvdXQgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBwYXNzLiAgVGhpcyBpcyBjYWxsZWQgYnkKKyAgLy8vIEFuYWx5emUgdG8gcHJpbnQgb3V0IHRoZSBjb250ZW50cyBvZiBhbiBhbmFseXNpcy4gIE90aGVyd2lzZSBpdCBpcyBub3QKKyAgLy8vIG5lY2Vzc2FyeSB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QuICBCZXdhcmUgdGhhdCB0aGUgbW9kdWxlIHBvaW50ZXIgTUFZIGJlCisgIC8vLyBudWxsLiAgVGhpcyBhdXRvbWF0aWNhbGx5IGZvcndhcmRzIHRvIGEgdmlydHVhbCBmdW5jdGlvbiB0aGF0IGRvZXMgbm90CisgIC8vLyBwcm92aWRlIHRoZSBNb2R1bGUqIGluIGNhc2UgdGhlIGFuYWx5c2lzIGRvZXNuJ3QgbmVlZCBpdCBpdCBjYW4ganVzdCBiZQorICAvLy8gaWdub3JlZC4KKyAgdmlydHVhbCB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICpNKSBjb25zdDsKKworICB2b2lkIGR1bXAoKSBjb25zdDsgLy8gZHVtcCAtIFByaW50IHRvIHN0ZGVyci4KKworICAvLy8gY3JlYXRlUHJpbnRlclBhc3MgLSBHZXQgYSBQYXNzIGFwcHJvcHJpYXRlIHRvIHByaW50IHRoZSBJUiB0aGlzCisgIC8vLyBwYXNzIG9wZXJhdGVzIG9uIChNb2R1bGUsIEZ1bmN0aW9uIG9yIE1hY2hpbmVGdW5jdGlvbikuCisgIHZpcnR1YWwgUGFzcyAqY3JlYXRlUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIpIGNvbnN0ID0gMDsKKworICAvLy8gRWFjaCBwYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBhc3NpZ25pbmcgYSBwYXNzIG1hbmFnZXIgdG8gaXRzZWxmLgorICAvLy8gUE1TIGlzIHRoZSBzdGFjayBvZiBhdmFpbGFibGUgcGFzcyBtYW5hZ2VyLgorICB2aXJ0dWFsIHZvaWQgYXNzaWduUGFzc01hbmFnZXIoUE1TdGFjayAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc01hbmFnZXJUeXBlKSB7fQorCisgIC8vLyBDaGVjayBpZiBhdmFpbGFibGUgcGFzcyBtYW5hZ2VycyBhcmUgc3VpdGFibGUgZm9yIHRoaXMgcGFzcyBvciBub3QuCisgIHZpcnR1YWwgdm9pZCBwcmVwYXJlUGFzc01hbmFnZXIoUE1TdGFjayAmKTsKKworICAvLy8gIFJldHVybiB3aGF0IGtpbmQgb2YgUGFzcyBNYW5hZ2VyIGNhbiBtYW5hZ2UgdGhpcyBwYXNzLgorICB2aXJ0dWFsIFBhc3NNYW5hZ2VyVHlwZSBnZXRQb3RlbnRpYWxQYXNzTWFuYWdlclR5cGUoKSBjb25zdDsKKworICAvLyBBY2Nlc3MgQW5hbHlzaXNSZXNvbHZlcgorICB2b2lkIHNldFJlc29sdmVyKEFuYWx5c2lzUmVzb2x2ZXIgKkFSKTsKKyAgQW5hbHlzaXNSZXNvbHZlciAqZ2V0UmVzb2x2ZXIoKSBjb25zdCB7IHJldHVybiBSZXNvbHZlcjsgfQorCisgIC8vLyBnZXRBbmFseXNpc1VzYWdlIC0gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb3ZlcnJpZGVuIGJ5IHBhc3NlcyB0aGF0IG5lZWQKKyAgLy8vIGFuYWx5c2lzIGluZm9ybWF0aW9uIHRvIGRvIHRoZWlyIGpvYi4gIElmIGEgcGFzcyBzcGVjaWZpZXMgdGhhdCBpdCB1c2VzIGEKKyAgLy8vIHBhcnRpY3VsYXIgYW5hbHlzaXMgcmVzdWx0IHRvIHRoaXMgZnVuY3Rpb24sIGl0IGNhbiB0aGVuIHVzZSB0aGUKKyAgLy8vIGdldEFuYWx5c2lzPEFuYWx5c2lzVHlwZT4oKSBmdW5jdGlvbiwgYmVsb3cuCisgIHZpcnR1YWwgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJikgY29uc3Q7CisKKyAgLy8vIHJlbGVhc2VNZW1vcnkoKSAtIFRoaXMgbWVtYmVyIGNhbiBiZSBpbXBsZW1lbnRlZCBieSBhIHBhc3MgaWYgaXQgd2FudHMgdG8KKyAgLy8vIGJlIGFibGUgdG8gcmVsZWFzZSBpdHMgbWVtb3J5IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gIFRoZSBkZWZhdWx0CisgIC8vLyBiZWhhdmlvciBvZiBwYXNzZXMgaXMgdG8gaG9sZCBvbnRvIG1lbW9yeSBmb3IgdGhlIGVudGlyZSBkdXJhdGlvbiBvZiB0aGVpcgorICAvLy8gbGlmZXRpbWUgKHdoaWNoIGlzIHRoZSBlbnRpcmUgY29tcGlsZSB0aW1lKS4gIEZvciBwaXBlbGluZWQgcGFzc2VzLCB0aGlzCisgIC8vLyBpcyBub3QgYSBiaWcgZGVhbCBiZWNhdXNlIHRoYXQgbWVtb3J5IGdldHMgcmVjeWNsZWQgZXZlcnkgdGltZSB0aGUgcGFzcyBpcworICAvLy8gaW52b2tlZCBvbiBhbm90aGVyIHByb2dyYW0gdW5pdC4gIEZvciBJUCBwYXNzZXMsIGl0IGlzIG1vcmUgaW1wb3J0YW50IHRvCisgIC8vLyBmcmVlIG1lbW9yeSB3aGVuIGl0IGlzIHVudXNlZC4KKyAgLy8vCisgIC8vLyBPcHRpb25hbGx5IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIHRvIHJlbGVhc2UgcGFzcyBtZW1vcnkgd2hlbiBpdCBpcyBubworICAvLy8gbG9uZ2VyIHVzZWQuCisgIHZpcnR1YWwgdm9pZCByZWxlYXNlTWVtb3J5KCk7CisKKyAgLy8vIGdldEFkanVzdGVkQW5hbHlzaXNQb2ludGVyIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB3aGVuIGEgcGFzcyBpbXBsZW1lbnRzCisgIC8vLyBhbiBhbmFseXNpcyBpbnRlcmZhY2UgdGhyb3VnaCBtdWx0aXBsZSBpbmhlcml0YW5jZS4gIElmIG5lZWRlZCwgaXQgc2hvdWxkCisgIC8vLyBvdmVycmlkZSB0aGlzIHRvIGFkanVzdCB0aGUgdGhpcyBwb2ludGVyIGFzIG5lZWRlZCBmb3IgdGhlIHNwZWNpZmllZCBwYXNzCisgIC8vLyBpbmZvLgorICB2aXJ0dWFsIHZvaWQgKmdldEFkanVzdGVkQW5hbHlzaXNQb2ludGVyKEFuYWx5c2lzSUQgSUQpOworICB2aXJ0dWFsIEltbXV0YWJsZVBhc3MgKmdldEFzSW1tdXRhYmxlUGFzcygpOworICB2aXJ0dWFsIFBNRGF0YU1hbmFnZXIgKmdldEFzUE1EYXRhTWFuYWdlcigpOworCisgIC8vLyB2ZXJpZnlBbmFseXNpcygpIC0gVGhpcyBtZW1iZXIgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGEgYW5hbHlzaXMgcGFzcyB0bworICAvLy8gY2hlY2sgc3RhdGUgb2YgYW5hbHlzaXMgaW5mb3JtYXRpb24uCisgIHZpcnR1YWwgdm9pZCB2ZXJpZnlBbmFseXNpcygpIGNvbnN0OworCisgIC8vIGR1bXBQYXNzU3RydWN0dXJlIC0gSW1wbGVtZW50IHRoZSAtZGVidWctcGFzc2VzPVBhc3NTdHJ1Y3R1cmUgb3B0aW9uCisgIHZpcnR1YWwgdm9pZCBkdW1wUGFzc1N0cnVjdHVyZSh1bnNpZ25lZCBPZmZzZXQgPSAwKTsKKworICAvLyBsb29rdXBQYXNzSW5mbyAtIFJldHVybiB0aGUgcGFzcyBpbmZvIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBwYXNzIGNsYXNzLAorICAvLyBvciBudWxsIGlmIGl0IGlzIG5vdCBrbm93bi4KKyAgc3RhdGljIGNvbnN0IFBhc3NJbmZvICpsb29rdXBQYXNzSW5mbyhjb25zdCB2b2lkICpUSSk7CisKKyAgLy8gbG9va3VwUGFzc0luZm8gLSBSZXR1cm4gdGhlIHBhc3MgaW5mbyBvYmplY3QgZm9yIHRoZSBwYXNzIHdpdGggdGhlIGdpdmVuCisgIC8vIGFyZ3VtZW50IHN0cmluZywgb3IgbnVsbCBpZiBpdCBpcyBub3Qga25vd24uCisgIHN0YXRpYyBjb25zdCBQYXNzSW5mbyAqbG9va3VwUGFzc0luZm8oU3RyaW5nUmVmIEFyZyk7CisKKyAgLy8gY3JlYXRlUGFzcyAtIENyZWF0ZSBhIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBwYXNzIGNsYXNzLAorICAvLyBvciBudWxsIGlmIGl0IGlzIG5vdCBrbm93bi4KKyAgc3RhdGljIFBhc3MgKmNyZWF0ZVBhc3MoQW5hbHlzaXNJRCBJRCk7CisKKyAgLy8vIGdldEFuYWx5c2lzSWZBdmFpbGFibGU8QW5hbHlzaXNUeXBlPigpIC0gU3ViY2xhc3NlcyB1c2UgdGhpcyBmdW5jdGlvbiB0bworICAvLy8gZ2V0IGFuYWx5c2lzIGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgYmUgYXJvdW5kLCBmb3IgZXhhbXBsZSB0byB1cGRhdGUgaXQuCisgIC8vLyBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIGdldEFuYWx5c2lzIGluIHRoYXQgaXQgY2FuIGZhaWwgKGlmIHRoZSBhbmFseXNpcworICAvLy8gcmVzdWx0cyBoYXZlbid0IGJlZW4gY29tcHV0ZWQpLCBzbyBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSBjYW4gaGFuZGxlCisgIC8vLyB0aGUgY2FzZSB3aGVuIHRoZSBhbmFseXNpcyBpcyBub3QgYXZhaWxhYmxlLiAgVGhpcyBtZXRob2QgaXMgb2Z0ZW4gdXNlZCBieQorICAvLy8gdHJhbnNmb3JtYXRpb24gQVBJcyB0byB1cGRhdGUgYW5hbHlzaXMgcmVzdWx0cyBmb3IgYSBwYXNzIGF1dG9tYXRpY2FsbHkgYXMKKyAgLy8vIHRoZSB0cmFuc2Zvcm0gaXMgcGVyZm9ybWVkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbmFseXNpc1R5cGU+IEFuYWx5c2lzVHlwZSAqCisgICAgZ2V0QW5hbHlzaXNJZkF2YWlsYWJsZSgpIGNvbnN0OyAvLyBEZWZpbmVkIGluIFBhc3NBbmFseXNpc1N1cHBvcnQuaAorCisgIC8vLyBtdXN0UHJlc2VydmVBbmFseXNpc0lEIC0gVGhpcyBtZXRob2Qgc2VydmVzIHRoZSBzYW1lIGZ1bmN0aW9uIGFzCisgIC8vLyBnZXRBbmFseXNpc0lmQXZhaWxhYmxlLCBidXQgd29ya3MgaWYgeW91IGp1c3QgaGF2ZSBhbiBBbmFseXNpc0lELiAgVGhpcworICAvLy8gb2J2aW91c2x5IGNhbm5vdCBnaXZlIHlvdSBhIHByb3Blcmx5IHR5cGVkIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBpZiB5b3UKKyAgLy8vIGRvbid0IGhhdmUgdGhlIGNsYXNzIG5hbWUgYXZhaWxhYmxlICh1c2UgZ2V0QW5hbHlzaXNJZkF2YWlsYWJsZSBpZiB5b3UKKyAgLy8vIGRvKSwgYnV0IGl0IGNhbiB0ZWxsIHlvdSBpZiB5b3UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgcGFzcyBhdCBsZWFzdC4KKyAgYm9vbCBtdXN0UHJlc2VydmVBbmFseXNpc0lEKGNoYXIgJkFJRCkgY29uc3Q7CisKKyAgLy8vIGdldEFuYWx5c2lzPEFuYWx5c2lzVHlwZT4oKSAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBzdWJjbGFzc2VzIHRvIGdldAorICAvLy8gdG8gdGhlIGFuYWx5c2lzIGluZm9ybWF0aW9uIHRoYXQgdGhleSBjbGFpbSB0byB1c2UgYnkgb3ZlcnJpZGluZyB0aGUKKyAgLy8vIGdldEFuYWx5c2lzVXNhZ2UgZnVuY3Rpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFuYWx5c2lzVHlwZT4KKyAgQW5hbHlzaXNUeXBlICZnZXRBbmFseXNpcygpIGNvbnN0OyAvLyBEZWZpbmVkIGluIFBhc3NBbmFseXNpc1N1cHBvcnQuaAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFuYWx5c2lzVHlwZT4KKyAgQW5hbHlzaXNUeXBlICZnZXRBbmFseXNpcyhGdW5jdGlvbiAmRik7IC8vIERlZmluZWQgaW4gUGFzc0FuYWx5c2lzU3VwcG9ydC5oCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQW5hbHlzaXNUeXBlPgorICBBbmFseXNpc1R5cGUgJmdldEFuYWx5c2lzSUQoQW5hbHlzaXNJRCBQSSkgY29uc3Q7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQW5hbHlzaXNUeXBlPgorICBBbmFseXNpc1R5cGUgJmdldEFuYWx5c2lzSUQoQW5hbHlzaXNJRCBQSSwgRnVuY3Rpb24gJkYpOworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBNb2R1bGVQYXNzIGNsYXNzIC0gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGltcGxlbWVudCB1bnN0cnVjdHVyZWQKKy8vLyBpbnRlcnByb2NlZHVyYWwgb3B0aW1pemF0aW9ucyBhbmQgYW5hbHlzZXMuICBNb2R1bGVQYXNzZXMgbWF5IGRvIGFueXRoaW5nCisvLy8gdGhleSB3YW50IHRvIHRoZSBwcm9ncmFtLgorLy8vCitjbGFzcyBNb2R1bGVQYXNzIDogcHVibGljIFBhc3MgeworcHVibGljOgorICBleHBsaWNpdCBNb2R1bGVQYXNzKGNoYXIgJnBpZCkgOiBQYXNzKFBUX01vZHVsZSwgcGlkKSB7fQorCisgIC8vIEZvcmNlIG91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kLgorICB+TW9kdWxlUGFzcygpIG92ZXJyaWRlOworCisgIC8vLyBjcmVhdGVQcmludGVyUGFzcyAtIEdldCBhIG1vZHVsZSBwcmludGVyIHBhc3MuCisgIFBhc3MgKmNyZWF0ZVByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIHJ1bk9uTW9kdWxlIC0gVmlydHVhbCBtZXRob2Qgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzZXMgdG8gcHJvY2VzcyB0aGUgbW9kdWxlCisgIC8vLyBiZWluZyBvcGVyYXRlZCBvbi4KKyAgdmlydHVhbCBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgPSAwOworCisgIHZvaWQgYXNzaWduUGFzc01hbmFnZXIoUE1TdGFjayAmUE1TLCBQYXNzTWFuYWdlclR5cGUgVCkgb3ZlcnJpZGU7CisKKyAgLy8vICBSZXR1cm4gd2hhdCBraW5kIG9mIFBhc3MgTWFuYWdlciBjYW4gbWFuYWdlIHRoaXMgcGFzcy4KKyAgUGFzc01hbmFnZXJUeXBlIGdldFBvdGVudGlhbFBhc3NNYW5hZ2VyVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgIC8vLyBPcHRpb25hbCBwYXNzZXMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHBhc3Mgc2hvdWxkIGJlCisgIC8vLyBza2lwcGVkLiBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gb3B0aW1pemF0aW9uIGJpc2VjdCBpcyBvdmVyIHRoZSBsaW1pdC4KKyAgYm9vbCBza2lwTW9kdWxlKE1vZHVsZSAmTSkgY29uc3Q7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEltbXV0YWJsZVBhc3MgY2xhc3MgLSBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiB0aGF0IGRvZXMKKy8vLyBub3QgbmVlZCB0byBiZSBydW4uICBUaGlzIGlzIHVzZWZ1bCBmb3IgdGhpbmdzIGxpa2UgdGFyZ2V0IGluZm9ybWF0aW9uIGFuZAorLy8vICJiYXNpYyIgdmVyc2lvbnMgb2YgQW5hbHlzaXNHcm91cHMuCisvLy8KK2NsYXNzIEltbXV0YWJsZVBhc3MgOiBwdWJsaWMgTW9kdWxlUGFzcyB7CitwdWJsaWM6CisgIGV4cGxpY2l0IEltbXV0YWJsZVBhc3MoY2hhciAmcGlkKSA6IE1vZHVsZVBhc3MocGlkKSB7fQorCisgIC8vIEZvcmNlIG91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kLgorICB+SW1tdXRhYmxlUGFzcygpIG92ZXJyaWRlOworCisgIC8vLyBpbml0aWFsaXplUGFzcyAtIFRoaXMgbWV0aG9kIG1heSBiZSBvdmVycmlkZW4gYnkgaW1tdXRhYmxlIHBhc3NlcyB0byBhbGxvdworICAvLy8gdGhlbSB0byBwZXJmb3JtIHZhcmlvdXMgaW5pdGlhbGl6YXRpb24gYWN0aW9ucyB0aGV5IHJlcXVpcmUuICBUaGlzIGlzCisgIC8vLyBwcmltYXJpbHkgYmVjYXVzZSBhbiBJbW11dGFibGVQYXNzIGNhbiAicmVxdWlyZSIgYW5vdGhlciBJbW11dGFibGVQYXNzLAorICAvLy8gYW5kIGlmIGl0IGRvZXMsIHRoZSBvdmVybG9hZGVkIHZlcnNpb24gb2YgaW5pdGlhbGl6ZVBhc3MgbWF5IGdldCBhY2Nlc3MgdG8KKyAgLy8vIHRoZXNlIHBhc3NlcyB3aXRoIGdldEFuYWx5c2lzPD4uCisgIHZpcnR1YWwgdm9pZCBpbml0aWFsaXplUGFzcygpOworCisgIEltbXV0YWJsZVBhc3MgKmdldEFzSW1tdXRhYmxlUGFzcygpIG92ZXJyaWRlIHsgcmV0dXJuIHRoaXM7IH0KKworICAvLy8gSW1tdXRhYmxlUGFzc2VzIGFyZSBuZXZlciBydW4uCisgIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICYpIG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEZ1bmN0aW9uUGFzcyBjbGFzcyAtIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBpbXBsZW1lbnQgbW9zdCBnbG9iYWwKKy8vLyBvcHRpbWl6YXRpb25zLiAgT3B0aW1pemF0aW9ucyBzaG91bGQgc3ViY2xhc3MgdGhpcyBjbGFzcyBpZiB0aGV5IG1lZXQgdGhlCisvLy8gZm9sbG93aW5nIGNvbnN0cmFpbnRzOgorLy8vCisvLy8gIDEuIE9wdGltaXphdGlvbnMgYXJlIG9yZ2FuaXplZCBnbG9iYWxseSwgaS5lLiwgYSBmdW5jdGlvbiBhdCBhIHRpbWUKKy8vLyAgMi4gT3B0aW1pemluZyBhIGZ1bmN0aW9uIGRvZXMgbm90IGNhdXNlIHRoZSBhZGRpdGlvbiBvciByZW1vdmFsIG9mIGFueQorLy8vICAgICBmdW5jdGlvbnMgaW4gdGhlIG1vZHVsZQorLy8vCitjbGFzcyBGdW5jdGlvblBhc3MgOiBwdWJsaWMgUGFzcyB7CitwdWJsaWM6CisgIGV4cGxpY2l0IEZ1bmN0aW9uUGFzcyhjaGFyICZwaWQpIDogUGFzcyhQVF9GdW5jdGlvbiwgcGlkKSB7fQorCisgIC8vLyBjcmVhdGVQcmludGVyUGFzcyAtIEdldCBhIGZ1bmN0aW9uIHByaW50ZXIgcGFzcy4KKyAgUGFzcyAqY3JlYXRlUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQmFubmVyKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gcnVuT25GdW5jdGlvbiAtIFZpcnR1YWwgbWV0aG9kIG92ZXJyaWRlbiBieSBzdWJjbGFzc2VzIHRvIGRvIHRoZQorICAvLy8gcGVyLWZ1bmN0aW9uIHByb2Nlc3Npbmcgb2YgdGhlIHBhc3MuCisgIHZpcnR1YWwgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSA9IDA7CisKKyAgdm9pZCBhc3NpZ25QYXNzTWFuYWdlcihQTVN0YWNrICZQTVMsIFBhc3NNYW5hZ2VyVHlwZSBUKSBvdmVycmlkZTsKKworICAvLy8gIFJldHVybiB3aGF0IGtpbmQgb2YgUGFzcyBNYW5hZ2VyIGNhbiBtYW5hZ2UgdGhpcyBwYXNzLgorICBQYXNzTWFuYWdlclR5cGUgZ2V0UG90ZW50aWFsUGFzc01hbmFnZXJUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgLy8vIE9wdGlvbmFsIHBhc3NlcyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gY2hlY2sgd2hldGhlciB0aGUgcGFzcyBzaG91bGQgYmUKKyAgLy8vIHNraXBwZWQuIFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiBBdHRyaWJ1dGU6Ok9wdGltaXplTm9uZSBpcyBzZXQgb3Igd2hlbgorICAvLy8gb3B0aW1pemF0aW9uIGJpc2VjdCBpcyBvdmVyIHRoZSBsaW1pdC4KKyAgYm9vbCBza2lwRnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gJkYpIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBCYXNpY0Jsb2NrUGFzcyBjbGFzcyAtIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBpbXBsZW1lbnQgbW9zdCBsb2NhbAorLy8vIG9wdGltaXphdGlvbnMuICBPcHRpbWl6YXRpb25zIHNob3VsZCBzdWJjbGFzcyB0aGlzIGNsYXNzIGlmIHRoZXkKKy8vLyBtZWV0IHRoZSBmb2xsb3dpbmcgY29uc3RyYWludHM6CisvLy8gICAxLiBPcHRpbWl6YXRpb25zIGFyZSBsb2NhbCwgb3BlcmF0aW5nIG9uIGVpdGhlciBhIGJhc2ljIGJsb2NrIG9yCisvLy8gICAgICBpbnN0cnVjdGlvbiBhdCBhIHRpbWUuCisvLy8gICAyLiBPcHRpbWl6YXRpb25zIGRvIG5vdCBtb2RpZnkgdGhlIENGRyBvZiB0aGUgY29udGFpbmVkIGZ1bmN0aW9uLCBvciBhbnkKKy8vLyAgICAgIG90aGVyIGJhc2ljIGJsb2NrIGluIHRoZSBmdW5jdGlvbi4KKy8vLyAgIDMuIE9wdGltaXphdGlvbnMgY29uZm9ybSB0byBhbGwgb2YgdGhlIGNvbnN0cmFpbnRzIG9mIEZ1bmN0aW9uUGFzc2VzLgorLy8vCitjbGFzcyBCYXNpY0Jsb2NrUGFzcyA6IHB1YmxpYyBQYXNzIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgQmFzaWNCbG9ja1Bhc3MoY2hhciAmcGlkKSA6IFBhc3MoUFRfQmFzaWNCbG9jaywgcGlkKSB7fQorCisgIC8vLyBjcmVhdGVQcmludGVyUGFzcyAtIEdldCBhIGJhc2ljIGJsb2NrIHByaW50ZXIgcGFzcy4KKyAgUGFzcyAqY3JlYXRlUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQmFubmVyKSBjb25zdCBvdmVycmlkZTsKKworICB1c2luZyBsbHZtOjpQYXNzOjpkb0luaXRpYWxpemF0aW9uOworICB1c2luZyBsbHZtOjpQYXNzOjpkb0ZpbmFsaXphdGlvbjsKKworICAvLy8gZG9Jbml0aWFsaXphdGlvbiAtIFZpcnR1YWwgbWV0aG9kIG92ZXJyaWRkZW4gYnkgQmFzaWNCbG9ja1Bhc3Mgc3ViY2xhc3NlcworICAvLy8gdG8gZG8gYW55IG5lY2Vzc2FyeSBwZXItZnVuY3Rpb24gaW5pdGlhbGl6YXRpb24uCisgIHZpcnR1YWwgYm9vbCBkb0luaXRpYWxpemF0aW9uKEZ1bmN0aW9uICYpOworCisgIC8vLyBydW5PbkJhc2ljQmxvY2sgLSBWaXJ0dWFsIG1ldGhvZCBvdmVycmlkZW4gYnkgc3ViY2xhc3NlcyB0byBkbyB0aGUKKyAgLy8vIHBlci1iYXNpY2Jsb2NrIHByb2Nlc3Npbmcgb2YgdGhlIHBhc3MuCisgIHZpcnR1YWwgYm9vbCBydW5PbkJhc2ljQmxvY2soQmFzaWNCbG9jayAmQkIpID0gMDsKKworICAvLy8gZG9GaW5hbGl6YXRpb24gLSBWaXJ0dWFsIG1ldGhvZCBvdmVycmlkZW4gYnkgQmFzaWNCbG9ja1Bhc3Mgc3ViY2xhc3NlcyB0bworICAvLy8gZG8gYW55IHBvc3QgcHJvY2Vzc2luZyBuZWVkZWQgYWZ0ZXIgYWxsIHBhc3NlcyBoYXZlIHJ1bi4KKyAgdmlydHVhbCBib29sIGRvRmluYWxpemF0aW9uKEZ1bmN0aW9uICYpOworCisgIHZvaWQgYXNzaWduUGFzc01hbmFnZXIoUE1TdGFjayAmUE1TLCBQYXNzTWFuYWdlclR5cGUgVCkgb3ZlcnJpZGU7CisKKyAgLy8vICBSZXR1cm4gd2hhdCBraW5kIG9mIFBhc3MgTWFuYWdlciBjYW4gbWFuYWdlIHRoaXMgcGFzcy4KKyAgUGFzc01hbmFnZXJUeXBlIGdldFBvdGVudGlhbFBhc3NNYW5hZ2VyVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgIC8vLyBPcHRpb25hbCBwYXNzZXMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHBhc3Mgc2hvdWxkIGJlCisgIC8vLyBza2lwcGVkLiBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gQXR0cmlidXRlOjpPcHRpbWl6ZU5vbmUgaXMgc2V0IG9yIHdoZW4KKyAgLy8vIG9wdGltaXphdGlvbiBiaXNlY3QgaXMgb3ZlciB0aGUgbGltaXQuCisgIGJvb2wgc2tpcEJhc2ljQmxvY2soY29uc3QgQmFzaWNCbG9jayAmQkIpIGNvbnN0OworfTsKKworLy8vIElmIHRoZSB1c2VyIHNwZWNpZmllcyB0aGUgLXRpbWUtcGFzc2VzIGFyZ3VtZW50IG9uIGFuIExMVk0gdG9vbCBjb21tYW5kIGxpbmUKKy8vLyB0aGVuIHRoZSB2YWx1ZSBvZiB0aGlzIGJvb2xlYW4gd2lsbCBiZSB0cnVlLCBvdGhlcndpc2UgZmFsc2UuCisvLy8gQGJyaWVmIFRoaXMgaXMgdGhlIHN0b3JhZ2UgZm9yIHRoZSAtdGltZS1wYXNzZXMgb3B0aW9uLgorZXh0ZXJuIGJvb2wgVGltZVBhc3Nlc0lzRW5hYmxlZDsKKworLy8vIGlzRnVuY3Rpb25JblByaW50TGlzdCAtIHJldHVybnMgdHJ1ZSBpZiBhIGZ1bmN0aW9uIHNob3VsZCBiZSBwcmludGVkIHZpYQorLy8gIGRlYnVnZ2luZyBvcHRpb25zIGxpa2UgLXByaW50LWFmdGVyLWFsbC8tcHJpbnQtYmVmb3JlLWFsbC4KKy8vICBAYnJpZWYgVGVsbHMgaWYgdGhlIGZ1bmN0aW9uIElSIHNob3VsZCBiZSBwcmludGVkIGJ5IFByaW50ZXJQYXNzLgorZXh0ZXJuIGJvb2wgaXNGdW5jdGlvbkluUHJpbnRMaXN0KFN0cmluZ1JlZiBGdW5jdGlvbk5hbWUpOworCisvLy8gZm9yY2VQcmludE1vZHVsZUlSIC0gcmV0dXJucyB0cnVlIGlmIElSIHByaW50aW5nIHBhc3NlcyBzaG91bGQKKy8vICBiZSBwcmludGluZyBtb2R1bGUgSVIgKGV2ZW4gZm9yIGxvY2FsLXBhc3MgcHJpbnRlcnMgZS5nLiBmdW5jdGlvbi1wYXNzKQorLy8gIHRvIHByb3ZpZGUgbW9yZSBjb250ZXh0LCBhcyBlbmFibGVkIGJ5IGRlYnVnZ2luZyBvcHRpb24gLXByaW50LW1vZHVsZS1zY29wZQorLy8gIEBicmllZiBUZWxscyBpZiBJUiBwcmludGVyIHNob3VsZCBiZSBwcmludGluZyBtb2R1bGUgSVIKK2V4dGVybiBib29sIGZvcmNlUHJpbnRNb2R1bGVJUigpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisvLyBJbmNsdWRlIHN1cHBvcnQgZmlsZXMgdGhhdCBjb250YWluIGltcG9ydGFudCBBUElzIGNvbW1vbmx5IHVzZWQgYnkgUGFzc2VzLAorLy8gYnV0IHRoYXQgd2Ugd2FudCB0byBzZXBhcmF0ZSBvdXQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZCB0aGUgaGVhZGVyIGZpbGVzLgorI2luY2x1ZGUgImxsdm0vSW5pdGlhbGl6ZVBhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vUGFzc0FuYWx5c2lzU3VwcG9ydC5oIgorI2luY2x1ZGUgImxsdm0vUGFzc1N1cHBvcnQuaCIKKworI2VuZGlmIC8vIExMVk1fUEFTU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Bhc3NBbmFseXNpc1N1cHBvcnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUGFzc0FuYWx5c2lzU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODcxODcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Bhc3NBbmFseXNpc1N1cHBvcnQuaApAQCAtMCwwICsxLDI3NCBAQAorLy89PT0tIGxsdm0vUGFzc0FuYWx5c2lzU3VwcG9ydC5oIC0gQW5hbHlzaXMgUGFzcyBTdXBwb3J0IGNvZGUgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBzdHVmZiB0aGF0IGlzIHVzZWQgdG8gZGVmaW5lIGFuZCAidXNlIiBBbmFseXNpcyBQYXNzZXMuCisvLyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSAjaW5jbHVkZWQgYnkgUGFzcy5oLCBzbzoKKy8vCisvLyAgICAgICAgICAgTk8gLkNQUCBGSUxFUyBTSE9VTEQgSU5DTFVERSBUSElTIEZJTEUgRElSRUNUTFkKKy8vCisvLyBJbnN0ZWFkLCAjaW5jbHVkZSBQYXNzLmgKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fUEFTU0FOQUxZU0lTU1VQUE9SVF9ICisjZGVmaW5lIExMVk1fUEFTU0FOQUxZU0lTU1VQUE9SVF9ICisKKyNpbmNsdWRlICJQYXNzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgUGFzczsKK2NsYXNzIFBNRGF0YU1hbmFnZXI7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gUmVwcmVzZW50IHRoZSBhbmFseXNpcyB1c2FnZSBpbmZvcm1hdGlvbiBvZiBhIHBhc3MuICBUaGlzIHRyYWNrcyBhbmFseXNlcworLy8vIHRoYXQgdGhlIHBhc3MgUkVRVUlSRVMgKG11c3QgYmUgYXZhaWxhYmxlIHdoZW4gdGhlIHBhc3MgcnVucyksIFJFUVVJUkVTCisvLy8gVFJBTlNJVElWRSAobXVzdCBiZSBhdmFpbGFibGUgdGhyb3VnaG91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIHBhc3MpLCBhbmQKKy8vLyBhbmFseXNlcyB0aGF0IHRoZSBwYXNzIFBSRVNFUlZFUyAodGhlIHBhc3MgZG9lcyBub3QgaW52YWxpZGF0ZSB0aGUgcmVzdWx0cworLy8vIG9mIHRoZXNlIGFuYWx5c2VzKS4gIFRoaXMgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgYnkgYSBwYXNzIHRvIHRoZSBQYXNzCisvLy8gaW5mcmFzdHJ1Y3R1cmUgdGhyb3VnaCB0aGUgZ2V0QW5hbHlzaXNVc2FnZSB2aXJ0dWFsIGZ1bmN0aW9uLgorLy8vCitjbGFzcyBBbmFseXNpc1VzYWdlIHsKK3B1YmxpYzoKKyAgdXNpbmcgVmVjdG9yVHlwZSA9IFNtYWxsVmVjdG9ySW1wbDxBbmFseXNpc0lEPjsKKworcHJpdmF0ZToKKyAgLy8vIFNldHMgb2YgYW5hbHlzZXMgcmVxdWlyZWQgYW5kIHByZXNlcnZlZCBieSBhIHBhc3MKKyAgLy8gVE9ETzogSXQncyBub3QgY2xlYXIgdGhhdCBTbWFsbFZlY3RvciBpcyBhbiBhcHByb3ByaWF0ZSBkYXRhIHN0cnVjdHVyZSBmb3IKKyAgLy8gdGhpcyB1c2VjYXNlLiAgVGhlIHNpemVzIHdlcmUgcGlja2VkIHRvIG1pbmltaXplIHdhc3RlZCBzcGFjZSwgYnV0IGFyZQorICAvLyBvdGhlcndpc2UgZmFpcmx5IG1lYW5pbmdsZXNzLgorICBTbWFsbFZlY3RvcjxBbmFseXNpc0lELCA4PiBSZXF1aXJlZDsKKyAgU21hbGxWZWN0b3I8QW5hbHlzaXNJRCwgMj4gUmVxdWlyZWRUcmFuc2l0aXZlOworICBTbWFsbFZlY3RvcjxBbmFseXNpc0lELCAyPiBQcmVzZXJ2ZWQ7CisgIFNtYWxsVmVjdG9yPEFuYWx5c2lzSUQsIDA+IFVzZWQ7CisgIGJvb2wgUHJlc2VydmVzQWxsID0gZmFsc2U7CisKK3B1YmxpYzoKKyAgQW5hbHlzaXNVc2FnZSgpID0gZGVmYXVsdDsKKworICAvLy9AeworICAvLy8gQWRkIHRoZSBzcGVjaWZpZWQgSUQgdG8gdGhlIHJlcXVpcmVkIHNldCBvZiB0aGUgdXNhZ2UgaW5mbyBmb3IgYSBwYXNzLgorICBBbmFseXNpc1VzYWdlICZhZGRSZXF1aXJlZElEKGNvbnN0IHZvaWQgKklEKTsKKyAgQW5hbHlzaXNVc2FnZSAmYWRkUmVxdWlyZWRJRChjaGFyICZJRCk7CisgIHRlbXBsYXRlPGNsYXNzIFBhc3NDbGFzcz4KKyAgQW5hbHlzaXNVc2FnZSAmYWRkUmVxdWlyZWQoKSB7CisgICAgcmV0dXJuIGFkZFJlcXVpcmVkSUQoUGFzc0NsYXNzOjpJRCk7CisgIH0KKworICBBbmFseXNpc1VzYWdlICZhZGRSZXF1aXJlZFRyYW5zaXRpdmVJRChjaGFyICZJRCk7CisgIHRlbXBsYXRlPGNsYXNzIFBhc3NDbGFzcz4KKyAgQW5hbHlzaXNVc2FnZSAmYWRkUmVxdWlyZWRUcmFuc2l0aXZlKCkgeworICAgIHJldHVybiBhZGRSZXF1aXJlZFRyYW5zaXRpdmVJRChQYXNzQ2xhc3M6OklEKTsKKyAgfQorICAvLy9AfQorCisgIC8vL0B7CisgIC8vLyBBZGQgdGhlIHNwZWNpZmllZCBJRCB0byB0aGUgc2V0IG9mIGFuYWx5c2VzIHByZXNlcnZlZCBieSB0aGlzIHBhc3MuCisgIEFuYWx5c2lzVXNhZ2UgJmFkZFByZXNlcnZlZElEKGNvbnN0IHZvaWQgKklEKSB7CisgICAgUHJlc2VydmVkLnB1c2hfYmFjayhJRCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEFuYWx5c2lzVXNhZ2UgJmFkZFByZXNlcnZlZElEKGNoYXIgJklEKSB7CisgICAgUHJlc2VydmVkLnB1c2hfYmFjaygmSUQpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAvLy8gQWRkIHRoZSBzcGVjaWZpZWQgUGFzcyBjbGFzcyB0byB0aGUgc2V0IG9mIGFuYWx5c2VzIHByZXNlcnZlZCBieSB0aGlzIHBhc3MuCisgIHRlbXBsYXRlPGNsYXNzIFBhc3NDbGFzcz4KKyAgQW5hbHlzaXNVc2FnZSAmYWRkUHJlc2VydmVkKCkgeworICAgIFByZXNlcnZlZC5wdXNoX2JhY2soJlBhc3NDbGFzczo6SUQpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAvLy9AfQorCisgIC8vL0B7CisgIC8vLyBBZGQgdGhlIHNwZWNpZmllZCBJRCB0byB0aGUgc2V0IG9mIGFuYWx5c2VzIHVzZWQgYnkgdGhpcyBwYXNzIGlmIHRoZXkgYXJlCisgIC8vLyBhdmFpbGFibGUuLgorICBBbmFseXNpc1VzYWdlICZhZGRVc2VkSWZBdmFpbGFibGVJRChjb25zdCB2b2lkICpJRCkgeworICAgIFVzZWQucHVzaF9iYWNrKElEKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQW5hbHlzaXNVc2FnZSAmYWRkVXNlZElmQXZhaWxhYmxlSUQoY2hhciAmSUQpIHsKKyAgICBVc2VkLnB1c2hfYmFjaygmSUQpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAvLy8gQWRkIHRoZSBzcGVjaWZpZWQgUGFzcyBjbGFzcyB0byB0aGUgc2V0IG9mIGFuYWx5c2VzIHVzZWQgYnkgdGhpcyBwYXNzLgorICB0ZW1wbGF0ZTxjbGFzcyBQYXNzQ2xhc3M+CisgIEFuYWx5c2lzVXNhZ2UgJmFkZFVzZWRJZkF2YWlsYWJsZSgpIHsKKyAgICBVc2VkLnB1c2hfYmFjaygmUGFzc0NsYXNzOjpJRCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIC8vL0B9CisKKyAgLy8vIEFkZCB0aGUgUGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQgc3RyaW5nIHRvIHRoZSBzZXQgb2YgYW5hbHlzZXMKKyAgLy8vIHByZXNlcnZlZCBieSB0aGlzIHBhc3MuIElmIG5vIHN1Y2ggUGFzcyBleGlzdHMsIGRvIG5vdGhpbmcuIFRoaXMgY2FuIGJlCisgIC8vLyB1c2VmdWwgd2hlbiBhIHBhc3MgaXMgdHJpdmlhbGx5IHByZXNlcnZlZCwgYnV0IG1heSBub3QgYmUgbGlua2VkIGluLiBCZQorICAvLy8gY2FyZWZ1bCBhYm91dCBzcGVsbGluZyEKKyAgQW5hbHlzaXNVc2FnZSAmYWRkUHJlc2VydmVkKFN0cmluZ1JlZiBBcmcpOworCisgIC8vLyBTZXQgYnkgYW5hbHlzZXMgdGhhdCBkbyBub3QgdHJhbnNmb3JtIHRoZWlyIGlucHV0IGF0IGFsbAorICB2b2lkIHNldFByZXNlcnZlc0FsbCgpIHsgUHJlc2VydmVzQWxsID0gdHJ1ZTsgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciBhIHBhc3Mgc2FpZCBpdCBkb2VzIG5vdCB0cmFuc2Zvcm0gaXRzIGlucHV0IGF0IGFsbAorICBib29sIGdldFByZXNlcnZlc0FsbCgpIGNvbnN0IHsgcmV0dXJuIFByZXNlcnZlc0FsbDsgfQorCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIHBhc3MsIGlmZiB0aGV5IGRvIG5vdDoKKyAgLy8vCisgIC8vLyAgMS4gQWRkIG9yIHJlbW92ZSBiYXNpYyBibG9ja3MgZnJvbSB0aGUgZnVuY3Rpb24KKyAgLy8vICAyLiBNb2RpZnkgdGVybWluYXRvciBpbnN0cnVjdGlvbnMgaW4gYW55IHdheS4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGFubm90YXRlcyB0aGUgQW5hbHlzaXNVc2FnZSBpbmZvIG9iamVjdCB0byBzYXkgdGhhdCBhbmFseXNlcworICAvLy8gdGhhdCBvbmx5IGRlcGVuZCBvbiB0aGUgQ0ZHIGFyZSBwcmVzZXJ2ZWQgYnkgdGhpcyBwYXNzLgorICB2b2lkIHNldFByZXNlcnZlc0NGRygpOworCisgIGNvbnN0IFZlY3RvclR5cGUgJmdldFJlcXVpcmVkU2V0KCkgY29uc3QgeyByZXR1cm4gUmVxdWlyZWQ7IH0KKyAgY29uc3QgVmVjdG9yVHlwZSAmZ2V0UmVxdWlyZWRUcmFuc2l0aXZlU2V0KCkgY29uc3QgeworICAgIHJldHVybiBSZXF1aXJlZFRyYW5zaXRpdmU7CisgIH0KKyAgY29uc3QgVmVjdG9yVHlwZSAmZ2V0UHJlc2VydmVkU2V0KCkgY29uc3QgeyByZXR1cm4gUHJlc2VydmVkOyB9CisgIGNvbnN0IFZlY3RvclR5cGUgJmdldFVzZWRTZXQoKSBjb25zdCB7IHJldHVybiBVc2VkOyB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEFuYWx5c2lzUmVzb2x2ZXIgLSBTaW1wbGUgaW50ZXJmYWNlIHVzZWQgYnkgUGFzcyBvYmplY3RzIHRvIHB1bGwgYWxsCisvLy8gYW5hbHlzaXMgaW5mb3JtYXRpb24gb3V0IG9mIHBhc3MgbWFuYWdlciB0aGF0IGlzIHJlc3BvbnNpYmxlIHRvIG1hbmFnZQorLy8vIHRoZSBwYXNzLgorLy8vCitjbGFzcyBBbmFseXNpc1Jlc29sdmVyIHsKK3B1YmxpYzoKKyAgQW5hbHlzaXNSZXNvbHZlcigpID0gZGVsZXRlOworICBleHBsaWNpdCBBbmFseXNpc1Jlc29sdmVyKFBNRGF0YU1hbmFnZXIgJlApIDogUE0oUCkge30KKworICBQTURhdGFNYW5hZ2VyICZnZXRQTURhdGFNYW5hZ2VyKCkgeyByZXR1cm4gUE07IH0KKworICAvLy8gRmluZCBwYXNzIHRoYXQgaXMgaW1wbGVtZW50aW5nIFBJLgorICBQYXNzICpmaW5kSW1wbFBhc3MoQW5hbHlzaXNJRCBQSSkgeworICAgIFBhc3MgKlJlc3VsdFBhc3MgPSBudWxscHRyOworICAgIGZvciAoY29uc3QgYXV0byAmQW5hbHlzaXNJbXBsIDogQW5hbHlzaXNJbXBscykgeworICAgICAgaWYgKEFuYWx5c2lzSW1wbC5maXJzdCA9PSBQSSkgeworICAgICAgICBSZXN1bHRQYXNzID0gQW5hbHlzaXNJbXBsLnNlY29uZDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBSZXN1bHRQYXNzOworICB9CisKKyAgLy8vIEZpbmQgcGFzcyB0aGF0IGlzIGltcGxlbWVudGluZyBQSS4gSW5pdGlhbGl6ZSBwYXNzIGZvciBGdW5jdGlvbiBGLgorICBQYXNzICpmaW5kSW1wbFBhc3MoUGFzcyAqUCwgQW5hbHlzaXNJRCBQSSwgRnVuY3Rpb24gJkYpOworCisgIHZvaWQgYWRkQW5hbHlzaXNJbXBsc1BhaXIoQW5hbHlzaXNJRCBQSSwgUGFzcyAqUCkgeworICAgIGlmIChmaW5kSW1wbFBhc3MoUEkpID09IFApCisgICAgICByZXR1cm47CisgICAgc3RkOjpwYWlyPEFuYWx5c2lzSUQsIFBhc3MqPiBwaXIgPSBzdGQ6Om1ha2VfcGFpcihQSSxQKTsKKyAgICBBbmFseXNpc0ltcGxzLnB1c2hfYmFjayhwaXIpOworICB9CisKKyAgLy8vIENsZWFyIGNhY2hlIHRoYXQgaXMgdXNlZCB0byBjb25uZWN0IGEgcGFzcyB0byB0aGUgYW5hbHlzaXMgKFBhc3NJbmZvKS4KKyAgdm9pZCBjbGVhckFuYWx5c2lzSW1wbHMoKSB7CisgICAgQW5hbHlzaXNJbXBscy5jbGVhcigpOworICB9CisKKyAgLy8vIFJldHVybiBhbmFseXNpcyByZXN1bHQgb3IgbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICBQYXNzICpnZXRBbmFseXNpc0lmQXZhaWxhYmxlKEFuYWx5c2lzSUQgSUQsIGJvb2wgRGlyZWN0aW9uKSBjb25zdDsKKworcHJpdmF0ZToKKyAgLy8vIFRoaXMga2VlcHMgdHJhY2sgb2Ygd2hpY2ggcGFzc2VzIGltcGxlbWVudHMgdGhlIGludGVyZmFjZXMgdGhhdCBhcmUKKyAgLy8vIHJlcXVpcmVkIGJ5IHRoZSBjdXJyZW50IHBhc3MgKHRvIGltcGxlbWVudCBnZXRBbmFseXNpcygpKS4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEFuYWx5c2lzSUQsIFBhc3MgKj4+IEFuYWx5c2lzSW1wbHM7CisKKyAgLy8vIFBhc3NNYW5hZ2VyIHRoYXQgaXMgdXNlZCB0byByZXNvbHZlIGFuYWx5c2lzIGluZm8KKyAgUE1EYXRhTWFuYWdlciAmUE07Cit9OworCisvLy8gZ2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxBbmFseXNpc1R5cGU+KCkgLSBTdWJjbGFzc2VzIHVzZSB0aGlzIGZ1bmN0aW9uIHRvCisvLy8gZ2V0IGFuYWx5c2lzIGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgYmUgYXJvdW5kLCBmb3IgZXhhbXBsZSB0byB1cGRhdGUgaXQuCisvLy8gVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiBnZXRBbmFseXNpcyBpbiB0aGF0IGl0IGNhbiBmYWlsIChpZiB0aGUgYW5hbHlzaXMKKy8vLyByZXN1bHRzIGhhdmVuJ3QgYmVlbiBjb21wdXRlZCksIHNvIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IGNhbiBoYW5kbGUKKy8vLyB0aGUgY2FzZSB3aGVuIHRoZSBhbmFseXNpcyBpcyBub3QgYXZhaWxhYmxlLiAgVGhpcyBtZXRob2QgaXMgb2Z0ZW4gdXNlZCBieQorLy8vIHRyYW5zZm9ybWF0aW9uIEFQSXMgdG8gdXBkYXRlIGFuYWx5c2lzIHJlc3VsdHMgZm9yIGEgcGFzcyBhdXRvbWF0aWNhbGx5IGFzCisvLy8gdGhlIHRyYW5zZm9ybSBpcyBwZXJmb3JtZWQuCit0ZW1wbGF0ZTx0eXBlbmFtZSBBbmFseXNpc1R5cGU+CitBbmFseXNpc1R5cGUgKlBhc3M6OmdldEFuYWx5c2lzSWZBdmFpbGFibGUoKSBjb25zdCB7CisgIGFzc2VydChSZXNvbHZlciAmJiAiUGFzcyBub3QgcmVzaWRlbnQgaW4gYSBQYXNzTWFuYWdlciBvYmplY3QhIik7CisKKyAgY29uc3Qgdm9pZCAqUEkgPSAmQW5hbHlzaXNUeXBlOjpJRDsKKworICBQYXNzICpSZXN1bHRQYXNzID0gUmVzb2x2ZXItPmdldEFuYWx5c2lzSWZBdmFpbGFibGUoUEksIHRydWUpOworICBpZiAoIVJlc3VsdFBhc3MpIHJldHVybiBudWxscHRyOworCisgIC8vIEJlY2F1c2UgdGhlIEFuYWx5c2lzVHlwZSBtYXkgbm90IGJlIGEgc3ViY2xhc3Mgb2YgcGFzcyAoZm9yCisgIC8vIEFuYWx5c2lzR3JvdXBzKSwgd2UgdXNlIGdldEFkanVzdGVkQW5hbHlzaXNQb2ludGVyIGhlcmUgdG8gcG90ZW50aWFsbHkKKyAgLy8gYWRqdXN0IHRoZSByZXR1cm4gcG9pbnRlciAoYmVjYXVzZSB0aGUgY2xhc3MgbWF5IG11bHRpcGx5IGluaGVyaXQsIG9uY2UKKyAgLy8gZnJvbSBwYXNzLCBvbmNlIGZyb20gQW5hbHlzaXNUeXBlKS4KKyAgcmV0dXJuIChBbmFseXNpc1R5cGUqKVJlc3VsdFBhc3MtPmdldEFkanVzdGVkQW5hbHlzaXNQb2ludGVyKFBJKTsKK30KKworLy8vIGdldEFuYWx5c2lzPEFuYWx5c2lzVHlwZT4oKSAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBzdWJjbGFzc2VzIHRvIGdldAorLy8vIHRvIHRoZSBhbmFseXNpcyBpbmZvcm1hdGlvbiB0aGF0IHRoZXkgY2xhaW0gdG8gdXNlIGJ5IG92ZXJyaWRpbmcgdGhlCisvLy8gZ2V0QW5hbHlzaXNVc2FnZSBmdW5jdGlvbi4KK3RlbXBsYXRlPHR5cGVuYW1lIEFuYWx5c2lzVHlwZT4KK0FuYWx5c2lzVHlwZSAmUGFzczo6Z2V0QW5hbHlzaXMoKSBjb25zdCB7CisgIGFzc2VydChSZXNvbHZlciAmJiAiUGFzcyBoYXMgbm90IGJlZW4gaW5zZXJ0ZWQgaW50byBhIFBhc3NNYW5hZ2VyIG9iamVjdCEiKTsKKyAgcmV0dXJuIGdldEFuYWx5c2lzSUQ8QW5hbHlzaXNUeXBlPigmQW5hbHlzaXNUeXBlOjpJRCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEFuYWx5c2lzVHlwZT4KK0FuYWx5c2lzVHlwZSAmUGFzczo6Z2V0QW5hbHlzaXNJRChBbmFseXNpc0lEIFBJKSBjb25zdCB7CisgIGFzc2VydChQSSAmJiAiZ2V0QW5hbHlzaXMgZm9yIHVucmVnaXN0ZXJlZCBwYXNzISIpOworICBhc3NlcnQoUmVzb2x2ZXImJiJQYXNzIGhhcyBub3QgYmVlbiBpbnNlcnRlZCBpbnRvIGEgUGFzc01hbmFnZXIgb2JqZWN0ISIpOworICAvLyBQSSAqbXVzdCogYXBwZWFyIGluIEFuYWx5c2lzSW1wbHMuICBCZWNhdXNlIHRoZSBudW1iZXIgb2YgcGFzc2VzIHVzZWQKKyAgLy8gc2hvdWxkIGJlIGEgc21hbGwgbnVtYmVyLCB3ZSBqdXN0IGRvIGEgbGluZWFyIHNlYXJjaCBvdmVyIGEgKGRlbnNlKQorICAvLyB2ZWN0b3IuCisgIFBhc3MgKlJlc3VsdFBhc3MgPSBSZXNvbHZlci0+ZmluZEltcGxQYXNzKFBJKTsKKyAgYXNzZXJ0KFJlc3VsdFBhc3MgJiYgCisgICAgICAgICAiZ2V0QW5hbHlzaXMqKCkgY2FsbGVkIG9uIGFuIGFuYWx5c2lzIHRoYXQgd2FzIG5vdCAiCisgICAgICAgICAiJ3JlcXVpcmVkJyBieSBwYXNzISIpOworCisgIC8vIEJlY2F1c2UgdGhlIEFuYWx5c2lzVHlwZSBtYXkgbm90IGJlIGEgc3ViY2xhc3Mgb2YgcGFzcyAoZm9yCisgIC8vIEFuYWx5c2lzR3JvdXBzKSwgd2UgdXNlIGdldEFkanVzdGVkQW5hbHlzaXNQb2ludGVyIGhlcmUgdG8gcG90ZW50aWFsbHkKKyAgLy8gYWRqdXN0IHRoZSByZXR1cm4gcG9pbnRlciAoYmVjYXVzZSB0aGUgY2xhc3MgbWF5IG11bHRpcGx5IGluaGVyaXQsIG9uY2UKKyAgLy8gZnJvbSBwYXNzLCBvbmNlIGZyb20gQW5hbHlzaXNUeXBlKS4KKyAgcmV0dXJuICooQW5hbHlzaXNUeXBlKilSZXN1bHRQYXNzLT5nZXRBZGp1c3RlZEFuYWx5c2lzUG9pbnRlcihQSSk7Cit9CisKKy8vLyBnZXRBbmFseXNpczxBbmFseXNpc1R5cGU+KCkgLSBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgc3ViY2xhc3NlcyB0byBnZXQKKy8vLyB0byB0aGUgYW5hbHlzaXMgaW5mb3JtYXRpb24gdGhhdCB0aGV5IGNsYWltIHRvIHVzZSBieSBvdmVycmlkaW5nIHRoZQorLy8vIGdldEFuYWx5c2lzVXNhZ2UgZnVuY3Rpb24uCit0ZW1wbGF0ZTx0eXBlbmFtZSBBbmFseXNpc1R5cGU+CitBbmFseXNpc1R5cGUgJlBhc3M6OmdldEFuYWx5c2lzKEZ1bmN0aW9uICZGKSB7CisgIGFzc2VydChSZXNvbHZlciAmJiJQYXNzIGhhcyBub3QgYmVlbiBpbnNlcnRlZCBpbnRvIGEgUGFzc01hbmFnZXIgb2JqZWN0ISIpOworCisgIHJldHVybiBnZXRBbmFseXNpc0lEPEFuYWx5c2lzVHlwZT4oJkFuYWx5c2lzVHlwZTo6SUQsIEYpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBBbmFseXNpc1R5cGU+CitBbmFseXNpc1R5cGUgJlBhc3M6OmdldEFuYWx5c2lzSUQoQW5hbHlzaXNJRCBQSSwgRnVuY3Rpb24gJkYpIHsKKyAgYXNzZXJ0KFBJICYmICJnZXRBbmFseXNpcyBmb3IgdW5yZWdpc3RlcmVkIHBhc3MhIik7CisgIGFzc2VydChSZXNvbHZlciAmJiAiUGFzcyBoYXMgbm90IGJlZW4gaW5zZXJ0ZWQgaW50byBhIFBhc3NNYW5hZ2VyIG9iamVjdCEiKTsKKyAgLy8gUEkgKm11c3QqIGFwcGVhciBpbiBBbmFseXNpc0ltcGxzLiAgQmVjYXVzZSB0aGUgbnVtYmVyIG9mIHBhc3NlcyB1c2VkCisgIC8vIHNob3VsZCBiZSBhIHNtYWxsIG51bWJlciwgd2UganVzdCBkbyBhIGxpbmVhciBzZWFyY2ggb3ZlciBhIChkZW5zZSkKKyAgLy8gdmVjdG9yLgorICBQYXNzICpSZXN1bHRQYXNzID0gUmVzb2x2ZXItPmZpbmRJbXBsUGFzcyh0aGlzLCBQSSwgRik7CisgIGFzc2VydChSZXN1bHRQYXNzICYmICJVbmFibGUgdG8gZmluZCByZXF1ZXN0ZWQgYW5hbHlzaXMgaW5mbyIpOworCisgIC8vIEJlY2F1c2UgdGhlIEFuYWx5c2lzVHlwZSBtYXkgbm90IGJlIGEgc3ViY2xhc3Mgb2YgcGFzcyAoZm9yCisgIC8vIEFuYWx5c2lzR3JvdXBzKSwgd2UgdXNlIGdldEFkanVzdGVkQW5hbHlzaXNQb2ludGVyIGhlcmUgdG8gcG90ZW50aWFsbHkKKyAgLy8gYWRqdXN0IHRoZSByZXR1cm4gcG9pbnRlciAoYmVjYXVzZSB0aGUgY2xhc3MgbWF5IG11bHRpcGx5IGluaGVyaXQsIG9uY2UKKyAgLy8gZnJvbSBwYXNzLCBvbmNlIGZyb20gQW5hbHlzaXNUeXBlKS4KKyAgcmV0dXJuICooQW5hbHlzaXNUeXBlKilSZXN1bHRQYXNzLT5nZXRBZGp1c3RlZEFuYWx5c2lzUG9pbnRlcihQSSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1BBU1NBTkFMWVNJU1NVUFBPUlRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9QYXNzSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9QYXNzSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMWFiNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Bhc3NJbmZvLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8vPT09LSBsbHZtL1Bhc3NJbmZvLmggLSBQYXNzIEluZm8gY2xhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYW5kIGltcGxlbWVudHMgdGhlIFBhc3NJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9QQVNTSU5GT19ICisjZGVmaW5lIExMVk1fUEFTU0lORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgUGFzczsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLyBQYXNzSW5mbyBjbGFzcyAtIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZXhpc3RzIGZvciBldmVyeSBwYXNzIGtub3duIGJ5CisvLy8gdGhlIHN5c3RlbSwgYW5kIGNhbiBiZSBvYnRhaW5lZCBmcm9tIGEgbGl2ZSBQYXNzIGJ5IGNhbGxpbmcgaXRzCisvLy8gZ2V0UGFzc0luZm8oKSBtZXRob2QuICBUaGVzZSBvYmplY3RzIGFyZSBzZXQgdXAgYnkgdGhlIFJlZ2lzdGVyUGFzczw+CisvLy8gdGVtcGxhdGUuCisvLy8KK2NsYXNzIFBhc3NJbmZvIHsKK3B1YmxpYzoKKyAgdXNpbmcgTm9ybWFsQ3Rvcl90ID0gUGFzcyogKCopKCk7CisKK3ByaXZhdGU6CisgIFN0cmluZ1JlZiBQYXNzTmFtZTsgICAgIC8vIE5pY2UgbmFtZSBmb3IgUGFzcworICBTdHJpbmdSZWYgUGFzc0FyZ3VtZW50OyAvLyBDb21tYW5kIExpbmUgYXJndW1lbnQgdG8gcnVuIHRoaXMgcGFzcworICBjb25zdCB2b2lkICpQYXNzSUQ7CisgIGNvbnN0IGJvb2wgSXNDRkdPbmx5UGFzcyA9IGZhbHNlOyAgICAgIC8vIFBhc3Mgb25seSBsb29rcyBhdCB0aGUgQ0ZHLgorICBjb25zdCBib29sIElzQW5hbHlzaXM7ICAgICAgICAgICAgICAgICAvLyBUcnVlIGlmIGFuIGFuYWx5c2lzIHBhc3MuCisgIGNvbnN0IGJvb2wgSXNBbmFseXNpc0dyb3VwOyAgICAgICAgICAgIC8vIFRydWUgaWYgYW4gYW5hbHlzaXMgZ3JvdXAuCisgIHN0ZDo6dmVjdG9yPGNvbnN0IFBhc3NJbmZvICo+IEl0ZkltcGw7IC8vIEludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhpcyBwYXNzCisgIE5vcm1hbEN0b3JfdCBOb3JtYWxDdG9yID0gbnVsbHB0cjsKKworcHVibGljOgorICAvLy8gUGFzc0luZm8gY3RvciAtIERvIG5vdCBjYWxsIHRoaXMgZGlyZWN0bHksIHRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZAorICAvLy8gdGhyb3VnaCBSZWdpc3RlclBhc3MuCisgIFBhc3NJbmZvKFN0cmluZ1JlZiBuYW1lLCBTdHJpbmdSZWYgYXJnLCBjb25zdCB2b2lkICpwaSwgTm9ybWFsQ3Rvcl90IG5vcm1hbCwKKyAgICAgICAgICAgYm9vbCBpc0NGR09ubHksIGJvb2wgaXNfYW5hbHlzaXMpCisgICAgICA6IFBhc3NOYW1lKG5hbWUpLCBQYXNzQXJndW1lbnQoYXJnKSwgUGFzc0lEKHBpKSwgSXNDRkdPbmx5UGFzcyhpc0NGR09ubHkpLAorICAgICAgICBJc0FuYWx5c2lzKGlzX2FuYWx5c2lzKSwgSXNBbmFseXNpc0dyb3VwKGZhbHNlKSwgTm9ybWFsQ3Rvcihub3JtYWwpIHt9CisKKyAgLy8vIFBhc3NJbmZvIGN0b3IgLSBEbyBub3QgY2FsbCB0aGlzIGRpcmVjdGx5LCB0aGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQKKyAgLy8vIHRocm91Z2ggUmVnaXN0ZXJQYXNzLiBUaGlzIHZlcnNpb24gaXMgZm9yIHVzZSBieSBhbmFseXNpcyBncm91cHM7IGl0CisgIC8vLyBkb2VzIG5vdCBhdXRvLXJlZ2lzdGVyIHRoZSBwYXNzLgorICBQYXNzSW5mbyhTdHJpbmdSZWYgbmFtZSwgY29uc3Qgdm9pZCAqcGkpCisgICAgICA6IFBhc3NOYW1lKG5hbWUpLCBQYXNzSUQocGkpLCBJc0FuYWx5c2lzKGZhbHNlKSwgSXNBbmFseXNpc0dyb3VwKHRydWUpIHt9CisKKyAgUGFzc0luZm8oY29uc3QgUGFzc0luZm8gJikgPSBkZWxldGU7CisgIFBhc3NJbmZvICZvcGVyYXRvcj0oY29uc3QgUGFzc0luZm8gJikgPSBkZWxldGU7CisKKyAgLy8vIGdldFBhc3NOYW1lIC0gUmV0dXJuIHRoZSBmcmllbmRseSBuYW1lIGZvciB0aGUgcGFzcywgbmV2ZXIgcmV0dXJucyBudWxsCisgIFN0cmluZ1JlZiBnZXRQYXNzTmFtZSgpIGNvbnN0IHsgcmV0dXJuIFBhc3NOYW1lOyB9CisKKyAgLy8vIGdldFBhc3NBcmd1bWVudCAtIFJldHVybiB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbiB0aGF0IG1heSBiZSBwYXNzZWQgdG8KKyAgLy8vICdvcHQnIHRoYXQgd2lsbCBjYXVzZSB0aGlzIHBhc3MgdG8gYmUgcnVuLiAgVGhpcyB3aWxsIHJldHVybiBudWxsIGlmIHRoZXJlCisgIC8vLyBpcyBubyBhcmd1bWVudC4KKyAgU3RyaW5nUmVmIGdldFBhc3NBcmd1bWVudCgpIGNvbnN0IHsgcmV0dXJuIFBhc3NBcmd1bWVudDsgfQorCisgIC8vLyBnZXRUeXBlSW5mbyAtIFJldHVybiB0aGUgaWQgb2JqZWN0IGZvciB0aGUgcGFzcy4uLgorICAvLy8gVE9ETyA6IFJlbmFtZQorICBjb25zdCB2b2lkICpnZXRUeXBlSW5mbygpIGNvbnN0IHsgcmV0dXJuIFBhc3NJRDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFBhc3NJRCBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpZWQgSUQgcG9pbnRlci4KKyAgYm9vbCBpc1Bhc3NJRChjb25zdCB2b2lkICpJRFB0cikgY29uc3QgeyByZXR1cm4gUGFzc0lEID09IElEUHRyOyB9CisKKyAgLy8vIGlzQW5hbHlzaXNHcm91cCAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gYW5hbHlzaXMgZ3JvdXAsIG5vdCBhIG5vcm1hbAorICAvLy8gcGFzcy4KKyAgYm9vbCBpc0FuYWx5c2lzR3JvdXAoKSBjb25zdCB7IHJldHVybiBJc0FuYWx5c2lzR3JvdXA7IH0KKyAgYm9vbCBpc0FuYWx5c2lzKCkgY29uc3QgeyByZXR1cm4gSXNBbmFseXNpczsgfQorCisgIC8vLyBpc0NGR09ubHlQYXNzIC0gcmV0dXJuIHRydWUgaWYgdGhpcyBwYXNzIG9ubHkgbG9va3MgYXQgdGhlIENGRyBmb3IgdGhlCisgIC8vLyBmdW5jdGlvbi4KKyAgYm9vbCBpc0NGR09ubHlQYXNzKCkgY29uc3QgeyByZXR1cm4gSXNDRkdPbmx5UGFzczsgfQorCisgIC8vLyBnZXROb3JtYWxDdG9yIC0gUmV0dXJuIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uLCB0aGF0IHdoZW4gY2FsbGVkLCBjcmVhdGVzCisgIC8vLyBhbiBpbnN0YW5jZSBvZiB0aGUgcGFzcyBhbmQgcmV0dXJucyBpdC4gIFRoaXMgcG9pbnRlciBtYXkgYmUgbnVsbCBpZiB0aGVyZQorICAvLy8gaXMgbm8gZGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgdGhlIHBhc3MuCisgIE5vcm1hbEN0b3JfdCBnZXROb3JtYWxDdG9yKCkgY29uc3QgeworICAgIHJldHVybiBOb3JtYWxDdG9yOworICB9CisgIHZvaWQgc2V0Tm9ybWFsQ3RvcihOb3JtYWxDdG9yX3QgQ3RvcikgeworICAgIE5vcm1hbEN0b3IgPSBDdG9yOworICB9CisKKyAgLy8vIGNyZWF0ZVBhc3MoKSAtIFVzZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBwYXNzLgorICBQYXNzICpjcmVhdGVQYXNzKCkgY29uc3QgeworICAgIGFzc2VydCgoIWlzQW5hbHlzaXNHcm91cCgpIHx8IE5vcm1hbEN0b3IpICYmCisgICAgICAgICAgICJObyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvdW5kIGZvciBhbmFseXNpcyBncm91cCEiKTsKKyAgICBhc3NlcnQoTm9ybWFsQ3RvciAmJgorICAgICAgICAgICAiQ2Fubm90IGNhbGwgY3JlYXRlUGFzcyBvbiBQYXNzSW5mbyB3aXRob3V0IGRlZmF1bHQgY3RvciEiKTsKKyAgICByZXR1cm4gTm9ybWFsQ3RvcigpOworICB9CisKKyAgLy8vIGFkZEludGVyZmFjZUltcGxlbWVudGVkIC0gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhpcyBwYXNzIGlzCisgIC8vLyByZWdpc3RlcmVkIGFzIGEgbWVtYmVyIG9mIGFuIGFuYWx5c2lzIGdyb3VwIHdpdGggdGhlIFJlZ2lzdGVyQW5hbHlzaXNHcm91cAorICAvLy8gdGVtcGxhdGUuCisgIHZvaWQgYWRkSW50ZXJmYWNlSW1wbGVtZW50ZWQoY29uc3QgUGFzc0luZm8gKkl0ZlBJKSB7CisgICAgSXRmSW1wbC5wdXNoX2JhY2soSXRmUEkpOworICB9CisKKyAgLy8vIGdldEludGVyZmFjZXNJbXBsZW1lbnRlZCAtIFJldHVybiBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBhbmFseXNpcyBncm91cAorICAvLy8gaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBieSB0aGlzIHBhc3MuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IFBhc3NJbmZvKj4gJmdldEludGVyZmFjZXNJbXBsZW1lbnRlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSXRmSW1wbDsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fUEFTU0lORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9QYXNzUmVnaXN0cnkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUGFzc1JlZ2lzdHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlZGMxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUGFzc1JlZ2lzdHJ5LmgKQEAgLTAsMCArMSw5OCBAQAorLy89PT0tIGxsdm0vUGFzc1JlZ2lzdHJ5LmggLSBQYXNzIEluZm9ybWF0aW9uIFJlZ2lzdHJ5IC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBQYXNzUmVnaXN0cnksIGEgY2xhc3MgdGhhdCBpcyB1c2VkIGluIHRoZSBpbml0aWFsaXphdGlvbgorLy8gYW5kIHJlZ2lzdHJhdGlvbiBvZiBwYXNzZXMuICBBdCBhcHBsaWNhdGlvbiBzdGFydHVwLCBwYXNzZXMgYXJlIHJlZ2lzdGVyZWQKKy8vIHdpdGggdGhlIFBhc3NSZWdpc3RyeSwgd2hpY2ggaXMgbGF0ZXIgcHJvdmlkZWQgdG8gdGhlIFBhc3NNYW5hZ2VyIGZvciAKKy8vIGRlcGVuZGVuY3kgcmVzb2x1dGlvbiBhbmQgc2ltaWxhciB0YXNrcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fUEFTU1JFR0lTVFJZX0gKKyNkZWZpbmUgTExWTV9QQVNTUkVHSVNUUllfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0JpbmRpbmdXcmFwcGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9SV011dGV4LmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBQYXNzSW5mbzsKK3N0cnVjdCBQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXI7CisKKy8vLyBQYXNzUmVnaXN0cnkgLSBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIHJlZ2lzdHJhdGlvbiBhbmQgaW50aXRpYWxpemF0aW9uIG9mCisvLy8gdGhlIHBhc3Mgc3Vic3lzdGVtIGFzIGFwcGxpY2F0aW9uIHN0YXJ0dXAsIGFuZCBhc3Npc3RzIHRoZSBQYXNzTWFuYWdlcgorLy8vIGluIHJlc29sdmluZyBwYXNzIGRlcGVuZGVuY2llcy4KKy8vLyBOT1RFOiBQYXNzUmVnaXN0cnkgaXMgTk9UIHRocmVhZC1zYWZlLiAgSWYgeW91IHdhbnQgdG8gdXNlIExMVk0gb24gbXVsdGlwbGUKKy8vLyB0aHJlYWRzIHNpbXVsdGFuZW91c2x5LCB5b3Ugd2lsbCBuZWVkIHRvIHVzZSBhIHNlcGFyYXRlIFBhc3NSZWdpc3RyeSBvbgorLy8vIGVhY2ggdGhyZWFkLgorY2xhc3MgUGFzc1JlZ2lzdHJ5IHsKKyAgbXV0YWJsZSBzeXM6OlNtYXJ0UldNdXRleDx0cnVlPiBMb2NrOworCisgIC8vLyBQYXNzSW5mb01hcCAtIEtlZXAgdHJhY2sgb2YgdGhlIFBhc3NJbmZvIG9iamVjdCBmb3IgZWFjaCByZWdpc3RlcmVkIHBhc3MuCisgIHVzaW5nIE1hcFR5cGUgPSBEZW5zZU1hcDxjb25zdCB2b2lkICosIGNvbnN0IFBhc3NJbmZvICo+OworICBNYXBUeXBlIFBhc3NJbmZvTWFwOworCisgIHVzaW5nIFN0cmluZ01hcFR5cGUgPSBTdHJpbmdNYXA8Y29uc3QgUGFzc0luZm8gKj47CisgIFN0cmluZ01hcFR5cGUgUGFzc0luZm9TdHJpbmdNYXA7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGNvbnN0IFBhc3NJbmZvPj4gVG9GcmVlOworICBzdGQ6OnZlY3RvcjxQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXIgKj4gTGlzdGVuZXJzOworCitwdWJsaWM6CisgIFBhc3NSZWdpc3RyeSgpID0gZGVmYXVsdDsKKyAgflBhc3NSZWdpc3RyeSgpOworCisgIC8vLyBnZXRQYXNzUmVnaXN0cnkgLSBBY2Nlc3MgdGhlIGdsb2JhbCByZWdpc3RyeSBvYmplY3QsIHdoaWNoIGlzCisgIC8vLyBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkIGF0IGFwcGxpY2F0aW9uIGxhdW5jaCBhbmQgZGVzdHJveWVkIGJ5CisgIC8vLyBsbHZtX3NodXRkb3duLgorICBzdGF0aWMgUGFzc1JlZ2lzdHJ5ICpnZXRQYXNzUmVnaXN0cnkoKTsKKworICAvLy8gZ2V0UGFzc0luZm8gLSBMb29rIHVwIGEgcGFzcycgY29ycmVzcG9uZGluZyBQYXNzSW5mbywgaW5kZXhlZCBieSB0aGUgcGFzcycKKyAgLy8vIHR5cGUgaWRlbnRpZmllciAoJk15UGFzczo6SUQpLgorICBjb25zdCBQYXNzSW5mbyAqZ2V0UGFzc0luZm8oY29uc3Qgdm9pZCAqVEkpIGNvbnN0OworCisgIC8vLyBnZXRQYXNzSW5mbyAtIExvb2sgdXAgYSBwYXNzJyBjb3JyZXNwb25kaW5nIFBhc3NJbmZvLCBpbmRleGVkIGJ5IHRoZSBwYXNzJworICAvLy8gYXJndW1lbnQgc3RyaW5nLgorICBjb25zdCBQYXNzSW5mbyAqZ2V0UGFzc0luZm8oU3RyaW5nUmVmIEFyZykgY29uc3Q7CisKKyAgLy8vIHJlZ2lzdGVyUGFzcyAtIFJlZ2lzdGVyIGEgcGFzcyAoYnkgbWVhbnMgb2YgaXRzIFBhc3NJbmZvKSB3aXRoIHRoZQorICAvLy8gcmVnaXN0cnkuICBSZXF1aXJlZCBpbiBvcmRlciB0byB1c2UgdGhlIHBhc3Mgd2l0aCBhIFBhc3NNYW5hZ2VyLgorICB2b2lkIHJlZ2lzdGVyUGFzcyhjb25zdCBQYXNzSW5mbyAmUEksIGJvb2wgU2hvdWxkRnJlZSA9IGZhbHNlKTsKKworICAvLy8gcmVnaXN0ZXJBbmFseXNpc0dyb3VwIC0gUmVnaXN0ZXIgYW4gYW5hbHlzaXMgZ3JvdXAgKG9yIGEgcGFzcyBpbXBsZW1lbnRpbmcKKyAgLy8gYW4gYW5hbHlzaXMgZ3JvdXApIHdpdGggdGhlIHJlZ2lzdHJ5LiAgTGlrZSByZWdpc3RlclBhc3MsIHRoaXMgaXMgcmVxdWlyZWQKKyAgLy8gaW4gb3JkZXIgZm9yIGEgUGFzc01hbmFnZXIgdG8gYmUgYWJsZSB0byB1c2UgdGhpcyBncm91cC9wYXNzLgorICB2b2lkIHJlZ2lzdGVyQW5hbHlzaXNHcm91cChjb25zdCB2b2lkICpJbnRlcmZhY2VJRCwgY29uc3Qgdm9pZCAqUGFzc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzSW5mbyAmUmVnaXN0ZXJlZSwgYm9vbCBpc0RlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkRnJlZSA9IGZhbHNlKTsKKworICAvLy8gZW51bWVyYXRlV2l0aCAtIEVudW1lcmF0ZSB0aGUgcmVnaXN0ZXJlZCBwYXNzZXMsIGNhbGxpbmcgdGhlIHByb3ZpZGVkCisgIC8vLyBQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXIncyBwYXNzRW51bWVyYXRlKCkgY2FsbGJhY2sgb24gZWFjaCBvZiB0aGVtLgorICB2b2lkIGVudW1lcmF0ZVdpdGgoUGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVyICpMKTsKKworICAvLy8gYWRkUmVnaXN0cmF0aW9uTGlzdGVuZXIgLSBSZWdpc3RlciB0aGUgZ2l2ZW4gUGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVyCisgIC8vLyB0byByZWNlaXZlIHBhc3NSZWdpc3RlcmVkKCkgY2FsbGJhY2tzIHdoZW5ldmVyIGEgbmV3IHBhc3MgaXMgcmVnaXN0ZXJlZC4KKyAgdm9pZCBhZGRSZWdpc3RyYXRpb25MaXN0ZW5lcihQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXIgKkwpOworCisgIC8vLyByZW1vdmVSZWdpc3RyYXRpb25MaXN0ZW5lciAtIFVucmVnaXN0ZXIgYSBQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXIgc28gdGhhdAorICAvLy8gaXQgbm8gbG9uZ2VyIHJlY2VpdmVzIHBhc3NSZWdpc3RlcmVkKCkgY2FsbGJhY2tzLgorICB2b2lkIHJlbW92ZVJlZ2lzdHJhdGlvbkxpc3RlbmVyKFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lciAqTCk7Cit9OworCisvLyBDcmVhdGUgd3JhcHBlcnMgZm9yIEMgQmluZGluZyB0eXBlcyAoc2VlIENCaW5kaW5nV3JhcHBpbmcuaCkuCitERUZJTkVfU1REQ1hYX0NPTlZFUlNJT05fRlVOQ1RJT05TKFBhc3NSZWdpc3RyeSwgTExWTVBhc3NSZWdpc3RyeVJlZikKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fUEFTU1JFR0lTVFJZX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUGFzc1N1cHBvcnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUGFzc1N1cHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmYyM2RjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9QYXNzU3VwcG9ydC5oCkBAIC0wLDAgKzEsMjE2IEBACisvLz09PS0gbGx2bS9QYXNzU3VwcG9ydC5oIC0gUGFzcyBTdXBwb3J0IGNvZGUgLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHN0dWZmIHRoYXQgaXMgdXNlZCB0byBkZWZpbmUgYW5kICJ1c2UiIFBhc3Nlcy4gIFRoaXMgZmlsZQorLy8gaXMgYXV0b21hdGljYWxseSAjaW5jbHVkZWQgYnkgUGFzcy5oLCBzbzoKKy8vCisvLyAgICAgICAgICAgTk8gLkNQUCBGSUxFUyBTSE9VTEQgSU5DTFVERSBUSElTIEZJTEUgRElSRUNUTFkKKy8vCisvLyBJbnN0ZWFkLCAjaW5jbHVkZSBQYXNzLmguCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgUGFzcyByZWdpc3RyYXRpb24gY29kZSBhbmQgY2xhc3NlcyB1c2VkIGZvciBpdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fUEFTU1NVUFBPUlRfSAorI2RlZmluZSBMTFZNX1BBU1NTVVBQT1JUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vUGFzc0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3NSZWdpc3RyeS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9UaHJlYWRpbmcuaCIKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFBhc3M7CisKKyNkZWZpbmUgSU5JVElBTElaRV9QQVNTKHBhc3NOYW1lLCBhcmcsIG5hbWUsIGNmZywgYW5hbHlzaXMpICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkICppbml0aWFsaXplIyNwYXNzTmFtZSMjUGFzc09uY2UoUGFzc1JlZ2lzdHJ5ICZSZWdpc3RyeSkgeyAgICAgICAgXAorICAgIFBhc3NJbmZvICpQSSA9IG5ldyBQYXNzSW5mbyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmFtZSwgYXJnLCAmcGFzc05hbWU6OklELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFBhc3NJbmZvOjpOb3JtYWxDdG9yX3QoY2FsbERlZmF1bHRDdG9yPHBhc3NOYW1lPiksIGNmZywgYW5hbHlzaXMpOyAgICAgXAorICAgIFJlZ2lzdHJ5LnJlZ2lzdGVyUGFzcygqUEksIHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gUEk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgbGx2bTo6b25jZV9mbGFnIEluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzRmxhZzsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBsbHZtOjppbml0aWFsaXplIyNwYXNzTmFtZSMjUGFzcyhQYXNzUmVnaXN0cnkgJlJlZ2lzdHJ5KSB7ICAgICAgICAgICAgICBcCisgICAgbGx2bTo6Y2FsbF9vbmNlKEluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzRmxhZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplIyNwYXNzTmFtZSMjUGFzc09uY2UsIHN0ZDo6cmVmKFJlZ2lzdHJ5KSk7ICAgICAgIFwKKyAgfQorCisjZGVmaW5lIElOSVRJQUxJWkVfUEFTU19CRUdJTihwYXNzTmFtZSwgYXJnLCBuYW1lLCBjZmcsIGFuYWx5c2lzKSAgICAgICAgICAgICAgXAorICBzdGF0aWMgdm9pZCAqaW5pdGlhbGl6ZSMjcGFzc05hbWUjI1Bhc3NPbmNlKFBhc3NSZWdpc3RyeSAmUmVnaXN0cnkpIHsKKworI2RlZmluZSBJTklUSUFMSVpFX1BBU1NfREVQRU5ERU5DWShkZXBOYW1lKSBpbml0aWFsaXplIyNkZXBOYW1lIyNQYXNzKFJlZ2lzdHJ5KTsKKyNkZWZpbmUgSU5JVElBTElaRV9BR19ERVBFTkRFTkNZKGRlcE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGluaXRpYWxpemUjI2RlcE5hbWUjI0FuYWx5c2lzR3JvdXAoUmVnaXN0cnkpOworCisjZGVmaW5lIElOSVRJQUxJWkVfUEFTU19FTkQocGFzc05hbWUsIGFyZywgbmFtZSwgY2ZnLCBhbmFseXNpcykgICAgICAgICAgICAgICAgXAorICBQYXNzSW5mbyAqUEkgPSBuZXcgUGFzc0luZm8oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG5hbWUsIGFyZywgJnBhc3NOYW1lOjpJRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBQYXNzSW5mbzo6Tm9ybWFsQ3Rvcl90KGNhbGxEZWZhdWx0Q3RvcjxwYXNzTmFtZT4pLCBjZmcsIGFuYWx5c2lzKTsgICAgICAgXAorICBSZWdpc3RyeS5yZWdpc3RlclBhc3MoKlBJLCB0cnVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIFBJOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgbGx2bTo6b25jZV9mbGFnIEluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzRmxhZzsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBsbHZtOjppbml0aWFsaXplIyNwYXNzTmFtZSMjUGFzcyhQYXNzUmVnaXN0cnkgJlJlZ2lzdHJ5KSB7ICAgICAgICAgICAgICBcCisgICAgbGx2bTo6Y2FsbF9vbmNlKEluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzRmxhZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplIyNwYXNzTmFtZSMjUGFzc09uY2UsIHN0ZDo6cmVmKFJlZ2lzdHJ5KSk7ICAgICAgIFwKKyAgfQorCisjZGVmaW5lIElOSVRJQUxJWkVfUEFTU19XSVRIX09QVElPTlMoUGFzc05hbWUsIEFyZywgTmFtZSwgQ2ZnLCBBbmFseXNpcykgICAgICAgXAorICBJTklUSUFMSVpFX1BBU1NfQkVHSU4oUGFzc05hbWUsIEFyZywgTmFtZSwgQ2ZnLCBBbmFseXNpcykgICAgICAgICAgICAgICAgICAgIFwKKyAgUGFzc05hbWU6OnJlZ2lzdGVyT3B0aW9ucygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOSVRJQUxJWkVfUEFTU19FTkQoUGFzc05hbWUsIEFyZywgTmFtZSwgQ2ZnLCBBbmFseXNpcykKKworI2RlZmluZSBJTklUSUFMSVpFX1BBU1NfV0lUSF9PUFRJT05TX0JFR0lOKFBhc3NOYW1lLCBBcmcsIE5hbWUsIENmZywgQW5hbHlzaXMpIFwKKyAgSU5JVElBTElaRV9QQVNTX0JFR0lOKFBhc3NOYW1lLCBBcmcsIE5hbWUsIENmZywgQW5hbHlzaXMpICAgICAgICAgICAgICAgICAgICBcCisgIFBhc3NOYW1lOjpyZWdpc3Rlck9wdGlvbnMoKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFBhc3NOYW1lPiBQYXNzICpjYWxsRGVmYXVsdEN0b3IoKSB7IHJldHVybiBuZXcgUGFzc05hbWUoKTsgfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vIFJlZ2lzdGVyUGFzczx0PiB0ZW1wbGF0ZSAtIFRoaXMgdGVtcGxhdGUgY2xhc3MgaXMgdXNlZCB0byBub3RpZnkgdGhlIHN5c3RlbQorLy8vIHRoYXQgYSBQYXNzIGlzIGF2YWlsYWJsZSBmb3IgdXNlLCBhbmQgcmVnaXN0ZXJzIGl0IGludG8gdGhlIGludGVybmFsCisvLy8gZGF0YWJhc2UgbWFpbnRhaW5lZCBieSB0aGUgUGFzc01hbmFnZXIuICBVbmxlc3MgdGhpcyB0ZW1wbGF0ZSBpcyB1c2VkLCBvcHQsCisvLy8gZm9yIGV4YW1wbGUgd2lsbCBub3QgYmUgYWJsZSB0byBzZWUgdGhlIHBhc3MgYW5kIGF0dGVtcHRzIHRvIGNyZWF0ZSB0aGUgcGFzcworLy8vIHdpbGwgZmFpbC4gVGhpcyB0ZW1wbGF0ZSBpcyB1c2VkIGluIHRoZSBmb2xsb3cgbWFubmVyIChhdCBnbG9iYWwgc2NvcGUsIGluCisvLy8geW91ciAuY3BwIGZpbGUpOgorLy8vCisvLy8gc3RhdGljIFJlZ2lzdGVyUGFzczxZb3VyUGFzc0NsYXNzTmFtZT4gdG1wKCJwYXNzb3B0IiwgIk15IFBhc3MgTmFtZSIpOworLy8vCisvLy8gVGhpcyBzdGF0ZW1lbnQgd2lsbCBjYXVzZSB5b3VyIHBhc3MgdG8gYmUgY3JlYXRlZCBieSBjYWxsaW5nIHRoZSBkZWZhdWx0CisvLy8gY29uc3RydWN0b3IgZXhwb3NlZCBieSB0aGUgcGFzcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBwYXNzTmFtZT4gc3RydWN0IFJlZ2lzdGVyUGFzcyA6IHB1YmxpYyBQYXNzSW5mbyB7CisgIC8vIFJlZ2lzdGVyIFBhc3MgdXNpbmcgZGVmYXVsdCBjb25zdHJ1Y3Rvci4uLgorICBSZWdpc3RlclBhc3MoU3RyaW5nUmVmIFBhc3NBcmcsIFN0cmluZ1JlZiBOYW1lLCBib29sIENGR09ubHkgPSBmYWxzZSwKKyAgICAgICAgICAgICAgIGJvb2wgaXNfYW5hbHlzaXMgPSBmYWxzZSkKKyAgICAgIDogUGFzc0luZm8oTmFtZSwgUGFzc0FyZywgJnBhc3NOYW1lOjpJRCwKKyAgICAgICAgICAgICAgICAgUGFzc0luZm86Ok5vcm1hbEN0b3JfdChjYWxsRGVmYXVsdEN0b3I8cGFzc05hbWU+KSwgQ0ZHT25seSwKKyAgICAgICAgICAgICAgICAgaXNfYW5hbHlzaXMpIHsKKyAgICBQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpLT5yZWdpc3RlclBhc3MoKnRoaXMpOworICB9Cit9OworCisvLy8gUmVnaXN0ZXJBbmFseXNpc0dyb3VwIC0gUmVnaXN0ZXIgYSBQYXNzIGFzIGEgbWVtYmVyIG9mIGFuIGFuYWx5c2lzIF9ncm91cF8uCisvLy8gQW5hbHlzaXMgZ3JvdXBzIGFyZSB1c2VkIHRvIGRlZmluZSBhbiBpbnRlcmZhY2UgKHdoaWNoIG5lZWQgbm90IGRlcml2ZSBmcm9tCisvLy8gUGFzcykgdGhhdCBpcyByZXF1aXJlZCBieSBwYXNzZXMgdG8gZG8gdGhlaXIgam9iLiAgQW5hbHlzaXMgR3JvdXBzIGRpZmZlcgorLy8vIGZyb20gbm9ybWFsIGFuYWx5c2VzIGJlY2F1c2UgYW55IGF2YWlsYWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ3JvdXAgd2lsbAorLy8vIGJlIHVzZWQgaWYgaXQgaXMgYXZhaWxhYmxlLgorLy8vCisvLy8gSWYgbm8gYW5hbHlzaXMgaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2UgaXMgYXZhaWxhYmxlLCBhIGRlZmF1bHQKKy8vLyBpbXBsZW1lbnRhdGlvbiBpcyBjcmVhdGVkIGFuZCBhZGRlZC4gIEEgcGFzcyByZWdpc3RlcnMgaXRzZWxmIGFzIHRoZSBkZWZhdWx0CisvLy8gaW1wbGVtZW50YXRpb24gYnkgc3BlY2lmeWluZyAndHJ1ZScgYXMgdGhlIHNlY29uZCB0ZW1wbGF0ZSBhcmd1bWVudCBvZiB0aGlzCisvLy8gY2xhc3MuCisvLy8KKy8vLyBJbiBhZGRpdGlvbiB0byByZWdpc3RlcmluZyBpdHNlbGYgYXMgYW4gYW5hbHlzaXMgZ3JvdXAgbWVtYmVyLCBhIHBhc3MgbXVzdAorLy8vIHJlZ2lzdGVyIGl0c2VsZiBub3JtYWxseSBhcyB3ZWxsLiAgUGFzc2VzIG1heSBiZSBtZW1iZXJzIG9mIG11bHRpcGxlIGdyb3VwcworLy8vIGFuZCBtYXkgc3RpbGwgYmUgInJlcXVpcmVkIiBzcGVjaWZpY2FsbHkgYnkgbmFtZS4KKy8vLworLy8vIFRoZSBhY3R1YWwgaW50ZXJmYWNlIG1heSBhbHNvIGJlIHJlZ2lzdGVyZWQgYXMgd2VsbCAoYnkgbm90IHNwZWNpZnlpbmcgdGhlCisvLy8gc2Vjb25kIHRlbXBsYXRlIGFyZ3VtZW50KS4gIFRoZSBpbnRlcmZhY2Ugc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdG8gYXNzb2NpYXRlCisvLy8gYSBuaWNlIG5hbWUgd2l0aCB0aGUgaW50ZXJmYWNlLgorY2xhc3MgUmVnaXN0ZXJBR0Jhc2UgOiBwdWJsaWMgUGFzc0luZm8geworcHVibGljOgorICBSZWdpc3RlckFHQmFzZShTdHJpbmdSZWYgTmFtZSwgY29uc3Qgdm9pZCAqSW50ZXJmYWNlSUQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKlBhc3NJRCA9IG51bGxwdHIsIGJvb2wgaXNEZWZhdWx0ID0gZmFsc2UpOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEludGVyZmFjZSwgYm9vbCBEZWZhdWx0ID0gZmFsc2U+CitzdHJ1Y3QgUmVnaXN0ZXJBbmFseXNpc0dyb3VwIDogcHVibGljIFJlZ2lzdGVyQUdCYXNlIHsKKyAgZXhwbGljaXQgUmVnaXN0ZXJBbmFseXNpc0dyb3VwKFBhc3NJbmZvICZSUEIpCisgICAgICA6IFJlZ2lzdGVyQUdCYXNlKFJQQi5nZXRQYXNzTmFtZSgpLCAmSW50ZXJmYWNlOjpJRCwgUlBCLmdldFR5cGVJbmZvKCksCisgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQpIHt9CisKKyAgZXhwbGljaXQgUmVnaXN0ZXJBbmFseXNpc0dyb3VwKGNvbnN0IGNoYXIgKk5hbWUpCisgICAgICA6IFJlZ2lzdGVyQUdCYXNlKE5hbWUsICZJbnRlcmZhY2U6OklEKSB7fQorfTsKKworI2RlZmluZSBJTklUSUFMSVpFX0FOQUxZU0lTX0dST1VQKGFnTmFtZSwgbmFtZSwgZGVmYXVsdFBhc3MpICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgKmluaXRpYWxpemUjI2FnTmFtZSMjQW5hbHlzaXNHcm91cE9uY2UoUGFzc1JlZ2lzdHJ5ICZSZWdpc3RyeSkgeyBcCisgICAgaW5pdGlhbGl6ZSMjZGVmYXVsdFBhc3MjI1Bhc3MoUmVnaXN0cnkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBhc3NJbmZvICpBSSA9IG5ldyBQYXNzSW5mbyhuYW1lLCAmYWdOYW1lOjpJRCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSZWdpc3RyeS5yZWdpc3RlckFuYWx5c2lzR3JvdXAoJmFnTmFtZTo6SUQsIDAsICpBSSwgZmFsc2UsIHRydWUpOyAgICAgICAgICBcCisgICAgcmV0dXJuIEFJOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGxsdm06Om9uY2VfZmxhZyBJbml0aWFsaXplIyNhZ05hbWUjI0FuYWx5c2lzR3JvdXBGbGFnOyAgICAgICAgICAgICAgICBcCisgIHZvaWQgbGx2bTo6aW5pdGlhbGl6ZSMjYWdOYW1lIyNBbmFseXNpc0dyb3VwKFBhc3NSZWdpc3RyeSAmUmVnaXN0cnkpIHsgICAgICAgXAorICAgIGxsdm06OmNhbGxfb25jZShJbml0aWFsaXplIyNhZ05hbWUjI0FuYWx5c2lzR3JvdXBGbGFnLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZSMjYWdOYW1lIyNBbmFseXNpc0dyb3VwT25jZSwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6cmVmKFJlZ2lzdHJ5KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgSU5JVElBTElaRV9BR19QQVNTKHBhc3NOYW1lLCBhZ05hbWUsIGFyZywgbmFtZSwgY2ZnLCBhbmFseXNpcywgZGVmKSAgICBcCisgIHN0YXRpYyB2b2lkICppbml0aWFsaXplIyNwYXNzTmFtZSMjUGFzc09uY2UoUGFzc1JlZ2lzdHJ5ICZSZWdpc3RyeSkgeyAgICAgICAgXAorICAgIGlmICghZGVmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGluaXRpYWxpemUjI2FnTmFtZSMjQW5hbHlzaXNHcm91cChSZWdpc3RyeSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUGFzc0luZm8gKlBJID0gbmV3IFBhc3NJbmZvKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuYW1lLCBhcmcsICZwYXNzTmFtZTo6SUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUGFzc0luZm86Ok5vcm1hbEN0b3JfdChjYWxsRGVmYXVsdEN0b3I8cGFzc05hbWU+KSwgY2ZnLCBhbmFseXNpcyk7ICAgICBcCisgICAgUmVnaXN0cnkucmVnaXN0ZXJQYXNzKCpQSSwgdHJ1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQYXNzSW5mbyAqQUkgPSBuZXcgUGFzc0luZm8obmFtZSwgJmFnTmFtZTo6SUQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUmVnaXN0cnkucmVnaXN0ZXJBbmFseXNpc0dyb3VwKCZhZ05hbWU6OklELCAmcGFzc05hbWU6OklELCAqQUksIGRlZiwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQUk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgbGx2bTo6b25jZV9mbGFnIEluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzRmxhZzsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBsbHZtOjppbml0aWFsaXplIyNwYXNzTmFtZSMjUGFzcyhQYXNzUmVnaXN0cnkgJlJlZ2lzdHJ5KSB7ICAgICAgICAgICAgICBcCisgICAgbGx2bTo6Y2FsbF9vbmNlKEluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzRmxhZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplIyNwYXNzTmFtZSMjUGFzc09uY2UsIHN0ZDo6cmVmKFJlZ2lzdHJ5KSk7ICAgICAgIFwKKyAgfQorCisjZGVmaW5lIElOSVRJQUxJWkVfQUdfUEFTU19CRUdJTihwYXNzTmFtZSwgYWdOYW1lLCBhcmcsIG4sIGNmZywgYW5hbHlzaXMsIGRlZikgXAorICBzdGF0aWMgdm9pZCAqaW5pdGlhbGl6ZSMjcGFzc05hbWUjI1Bhc3NPbmNlKFBhc3NSZWdpc3RyeSAmUmVnaXN0cnkpIHsgICAgICAgIFwKKyAgICBpZiAoIWRlZikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbml0aWFsaXplIyNhZ05hbWUjI0FuYWx5c2lzR3JvdXAoUmVnaXN0cnkpOworCisjZGVmaW5lIElOSVRJQUxJWkVfQUdfUEFTU19FTkQocGFzc05hbWUsIGFnTmFtZSwgYXJnLCBuLCBjZmcsIGFuYWx5c2lzLCBkZWYpICAgXAorICBQYXNzSW5mbyAqUEkgPSBuZXcgUGFzc0luZm8oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG4sIGFyZywgJnBhc3NOYW1lOjpJRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBQYXNzSW5mbzo6Tm9ybWFsQ3Rvcl90KGNhbGxEZWZhdWx0Q3RvcjxwYXNzTmFtZT4pLCBjZmcsIGFuYWx5c2lzKTsgICAgICAgXAorICBSZWdpc3RyeS5yZWdpc3RlclBhc3MoKlBJLCB0cnVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFBhc3NJbmZvICpBSSA9IG5ldyBQYXNzSW5mbyhuLCAmYWdOYW1lOjpJRCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBSZWdpc3RyeS5yZWdpc3RlckFuYWx5c2lzR3JvdXAoJmFnTmFtZTo6SUQsICZwYXNzTmFtZTo6SUQsICpBSSwgZGVmLCB0cnVlKTsgIFwKKyAgcmV0dXJuIEFJOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgbGx2bTo6b25jZV9mbGFnIEluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzRmxhZzsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBsbHZtOjppbml0aWFsaXplIyNwYXNzTmFtZSMjUGFzcyhQYXNzUmVnaXN0cnkgJlJlZ2lzdHJ5KSB7ICAgICAgICAgICAgICBcCisgICAgbGx2bTo6Y2FsbF9vbmNlKEluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzRmxhZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplIyNwYXNzTmFtZSMjUGFzc09uY2UsIHN0ZDo6cmVmKFJlZ2lzdHJ5KSk7ICAgICAgIFwKKyAgfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vIFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lciBjbGFzcyAtIFRoaXMgY2xhc3MgaXMgbWVhbnQgdG8gYmUgZGVyaXZlZCBmcm9tIGJ5CisvLy8gY2xpZW50cyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIHdoaWNoIHBhc3NlcyBnZXQgcmVnaXN0ZXJlZCBhbmQgdW5yZWdpc3RlcmVkCisvLy8gYXQgcnVudGltZSAod2hpY2ggY2FuIGJlIGJlY2F1c2Ugb2YgdGhlIFJlZ2lzdGVyUGFzcyBjb25zdHJ1Y3RvcnMgYmVpbmcgcnVuCisvLy8gYXMgdGhlIHByb2dyYW0gc3RhcnRzIHVwLCBvciBtYXkgYmUgYmVjYXVzZSBhIHNoYXJlZCBvYmplY3QganVzdCBnb3QKKy8vLyBsb2FkZWQpLgorc3RydWN0IFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lciB7CisgIFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lcigpID0gZGVmYXVsdDsKKyAgdmlydHVhbCB+UGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVyKCkgPSBkZWZhdWx0OworCisgIC8vLyBDYWxsYmFjayBmdW5jdGlvbnMgLSBUaGVzZSBmdW5jdGlvbnMgYXJlIGludm9rZWQgd2hlbmV2ZXIgYSBwYXNzIGlzIGxvYWRlZAorICAvLy8gb3IgcmVtb3ZlZCBmcm9tIHRoZSBjdXJyZW50IGV4ZWN1dGFibGUuCisgIHZpcnR1YWwgdm9pZCBwYXNzUmVnaXN0ZXJlZChjb25zdCBQYXNzSW5mbyAqKSB7fQorCisgIC8vLyBlbnVtZXJhdGVQYXNzZXMgLSBJdGVyYXRlIG92ZXIgdGhlIHJlZ2lzdGVyZWQgcGFzc2VzLCBjYWxsaW5nIHRoZQorICAvLy8gcGFzc0VudW1lcmF0ZSBjYWxsYmFjayBvbiBlYWNoIFBhc3NJbmZvIG9iamVjdC4KKyAgdm9pZCBlbnVtZXJhdGVQYXNzZXMoKTsKKworICAvLy8gcGFzc0VudW1lcmF0ZSAtIENhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQgd2hlbiBzb21lb25lIGNhbGxzCisgIC8vLyBlbnVtZXJhdGVQYXNzZXMgb24gdGhpcyBQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXIgb2JqZWN0LgorICB2aXJ0dWFsIHZvaWQgcGFzc0VudW1lcmF0ZShjb25zdCBQYXNzSW5mbyAqKSB7fQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fUEFTU1NVUFBPUlRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9QYXNzZXMvUGFzc0J1aWxkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUGFzc2VzL1Bhc3NCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmY2RhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUGFzc2VzL1Bhc3NCdWlsZGVyLmgKQEAgLTAsMCArMSw2ODUgQEAKKy8vPT09LSBQYXJzaW5nLCBzZWxlY3Rpb24sIGFuZCBjb25zdHJ1Y3Rpb24gb2YgcGFzcyBwaXBlbGluZXMgLS0qLSBDKysgLSotLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLworLy8vIEludGVyZmFjZXMgZm9yIHJlZ2lzdGVyaW5nIGFuYWx5c2lzIHBhc3NlcywgcHJvZHVjaW5nIGNvbW1vbiBwYXNzIG1hbmFnZXIKKy8vLyBjb25maWd1cmF0aW9ucywgYW5kIHBhcnNpbmcgb2YgcGFzcyBwaXBlbGluZXMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9QQVNTRVNfUEFTU0JVSUxERVJfSAorI2RlZmluZSBMTFZNX1BBU1NFU19QQVNTQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ0dTQ0NQYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFN0cmluZ1JlZjsKK2NsYXNzIEFBTWFuYWdlcjsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CisKKy8vLyBBIHN0cnVjdCBjYXB0dXJpbmcgUEdPIHR1bmFibGVzLgorc3RydWN0IFBHT09wdGlvbnMgeworICBQR09PcHRpb25zKHN0ZDo6c3RyaW5nIFByb2ZpbGVHZW5GaWxlID0gIiIsIHN0ZDo6c3RyaW5nIFByb2ZpbGVVc2VGaWxlID0gIiIsCisgICAgICAgICAgICAgc3RkOjpzdHJpbmcgU2FtcGxlUHJvZmlsZUZpbGUgPSAiIiwgYm9vbCBSdW5Qcm9maWxlR2VuID0gZmFsc2UsCisgICAgICAgICAgICAgYm9vbCBTYW1wbGVQR09TdXBwb3J0ID0gZmFsc2UpCisgICAgICA6IFByb2ZpbGVHZW5GaWxlKFByb2ZpbGVHZW5GaWxlKSwgUHJvZmlsZVVzZUZpbGUoUHJvZmlsZVVzZUZpbGUpLAorICAgICAgICBTYW1wbGVQcm9maWxlRmlsZShTYW1wbGVQcm9maWxlRmlsZSksIFJ1blByb2ZpbGVHZW4oUnVuUHJvZmlsZUdlbiksCisgICAgICAgIFNhbXBsZVBHT1N1cHBvcnQoU2FtcGxlUEdPU3VwcG9ydCB8fCAhU2FtcGxlUHJvZmlsZUZpbGUuZW1wdHkoKSkgeworICAgIGFzc2VydCgoUnVuUHJvZmlsZUdlbiB8fAorICAgICAgICAgICAgIVNhbXBsZVByb2ZpbGVGaWxlLmVtcHR5KCkgfHwKKyAgICAgICAgICAgICFQcm9maWxlVXNlRmlsZS5lbXB0eSgpIHx8CisgICAgICAgICAgICBTYW1wbGVQR09TdXBwb3J0KSAmJiAiSWxsZWdhbCBQR09PcHRpb25zLiIpOworICB9CisgIHN0ZDo6c3RyaW5nIFByb2ZpbGVHZW5GaWxlOworICBzdGQ6OnN0cmluZyBQcm9maWxlVXNlRmlsZTsKKyAgc3RkOjpzdHJpbmcgU2FtcGxlUHJvZmlsZUZpbGU7CisgIGJvb2wgUnVuUHJvZmlsZUdlbjsKKyAgYm9vbCBTYW1wbGVQR09TdXBwb3J0OworfTsKKworLy8vIFxicmllZiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFjY2VzcyB0byBidWlsZGluZyBMTFZNJ3MgcGFzc2VzLgorLy8vCisvLy8gSXQncyBtZW1iZXJzIHByb3ZpZGUgdGhlIGJhc2VsaW5lIHN0YXRlIGF2YWlsYWJsZSB0byBwYXNzZXMgZHVyaW5nIHRoZWlyCisvLy8gY29uc3RydWN0aW9uLiBUaGUgXGMgUGFzc1JlZ2lzdHJ5LmRlZiBmaWxlIHNwZWNpZmllcyBob3cgdG8gY29uc3RydWN0IGFsbAorLy8vIG9mIHRoZSBidWlsdC1pbiBwYXNzZXMsIGFuZCB0aG9zZSBtYXkgcmVmZXJlbmNlIHRoZXNlIG1lbWJlcnMgZHVyaW5nCisvLy8gY29uc3RydWN0aW9uLgorY2xhc3MgUGFzc0J1aWxkZXIgeworICBUYXJnZXRNYWNoaW5lICpUTTsKKyAgT3B0aW9uYWw8UEdPT3B0aW9ucz4gUEdPT3B0OworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQSBzdHJ1Y3QgdG8gY2FwdHVyZSBwYXJzZWQgcGFzcyBwaXBlbGluZSBuYW1lcy4KKyAgLy8vCisgIC8vLyBBIHBpcGVsaW5lIGlzIGRlZmluZWQgYXMgYSBzZXJpZXMgb2YgbmFtZXMsIGVhY2ggb2Ygd2hpY2ggbWF5IGluIGl0c2VsZgorICAvLy8gcmVjdXJzaXZlbHkgY29udGFpbiBhIG5lc3RlZCBwaXBlbGluZS4gQSBuYW1lIGlzIGVpdGhlciB0aGUgbmFtZSBvZiBhIHBhc3MKKyAgLy8vIChlLmcuICJpbnN0Y29tYmluZSIpIG9yIHRoZSBuYW1lIG9mIGEgcGlwZWxpbmUgdHlwZSAoZS5nLiAiY2dzY2MiKS4gSWYgdGhlCisgIC8vLyBuYW1lIGlzIHRoZSBuYW1lIG9mIGEgcGFzcywgdGhlIElubmVyUGlwZWxpbmUgaXMgZW1wdHksIHNpbmNlIHBhc3NlcworICAvLy8gY2Fubm90IGNvbnRhaW4gaW5uZXIgcGlwZWxpbmVzLiBTZWUgcGFyc2VQYXNzUGlwZWxpbmUoKSBmb3IgYSBtb3JlCisgIC8vLyBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgdGV4dHVhbCBwaXBlbGluZSBmb3JtYXQuCisgIHN0cnVjdCBQaXBlbGluZUVsZW1lbnQgeworICAgIFN0cmluZ1JlZiBOYW1lOworICAgIHN0ZDo6dmVjdG9yPFBpcGVsaW5lRWxlbWVudD4gSW5uZXJQaXBlbGluZTsKKyAgfTsKKworICAvLy8gXGJyaWVmIFRoaW5MVE8gcGhhc2UuCisgIC8vLworICAvLy8gVGhpcyBlbnVtZXJhdGVzIHRoZSBMTFZNIFRoaW5MVE8gb3B0aW1pemF0aW9uIHBoYXNlcy4KKyAgZW51bSBjbGFzcyBUaGluTFRPUGhhc2UgeworICAgIC8vLyBObyBUaGluTFRPIGJlaGF2aW9yIG5lZWRlZC4KKyAgICBOb25lLAorICAgIC8vIFRoaW5MVE8gcHJlbGluayAoc3VtbWFyeSkgcGhhc2UuCisgICAgUHJlTGluaywKKyAgICAvLyBUaGluTFRPIHBvc3RsaW5rIChiYWNrZW5kIGNvbXBpbGUpIHBoYXNlLgorICAgIFBvc3RMaW5rCisgIH07CisKKyAgLy8vIFxicmllZiBMTFZNLXByb3ZpZGVkIGhpZ2gtbGV2ZWwgb3B0aW1pemF0aW9uIGxldmVscy4KKyAgLy8vCisgIC8vLyBUaGlzIGVudW1lcmF0ZXMgdGhlIExMVk0tcHJvdmlkZWQgaGlnaC1sZXZlbCBvcHRpbWl6YXRpb24gbGV2ZWxzLiBFYWNoCisgIC8vLyBsZXZlbCBoYXMgYSBzcGVjaWZpYyBnb2FsIGFuZCByYXRpb25hbGUuCisgIGVudW0gT3B0aW1pemF0aW9uTGV2ZWwgeworICAgIC8vLyBEaXNhYmxlIGFzIG1hbnkgb3B0aW1pemF0aW9ucyBhcyBwb3NzaWJsZS4gVGhpcyBkb2Vzbid0IGNvbXBsZXRlbHkKKyAgICAvLy8gZGlzYWJsZSB0aGUgb3B0aW1pemVyIGluIGFsbCBjYXNlcywgZm9yIGV4YW1wbGUgYWx3YXlzX2lubGluZSBmdW5jdGlvbnMKKyAgICAvLy8gY2FuIGJlIHJlcXVpcmVkIHRvIGJlIGlubGluZWQgZm9yIGNvcnJlY3RuZXNzLgorICAgIE8wLAorCisgICAgLy8vIE9wdGltaXplIHF1aWNrbHkgd2l0aG91dCBkZXN0cm95aW5nIGRlYnVnZ2FiaWxpdHkuCisgICAgLy8vCisgICAgLy8vIEZJWE1FOiBUaGUgY3VycmVudCBhbmQgaGlzdG9yaWNhbCBiZWhhdmlvciBvZiB0aGlzIGxldmVsIGRvZXMgKm5vdCoKKyAgICAvLy8gYWdyZWUgd2l0aCB0aGlzIGdvYWwsIGJ1dCB3ZSB3b3VsZCBsaWtlIHRvIG1vdmUgdG93YXJkIHRoaXMgZ29hbCBpbiB0aGUKKyAgICAvLy8gZnV0dXJlLgorICAgIC8vLworICAgIC8vLyBUaGlzIGxldmVsIGlzIHR1bmVkIHRvIHByb2R1Y2UgYSByZXN1bHQgZnJvbSB0aGUgb3B0aW1pemVyIGFzIHF1aWNrbHkKKyAgICAvLy8gYXMgcG9zc2libGUgYW5kIHRvIGF2b2lkIGRlc3Ryb3lpbmcgZGVidWdnYWJpbGl0eS4gVGhpcyB0ZW5kcyB0byByZXN1bHQKKyAgICAvLy8gaW4gYSB2ZXJ5IGdvb2QgZGV2ZWxvcG1lbnQgbW9kZSB3aGVyZSB0aGUgY29tcGlsZWQgY29kZSB3aWxsIGJlCisgICAgLy8vIGltbWVkaWF0ZWx5IGV4ZWN1dGVkIGFzIHBhcnQgb2YgdGVzdGluZy4gQXMgYSBjb25zZXF1ZW5jZSwgd2hlcmUKKyAgICAvLy8gcG9zc2libGUsIHdlIHdvdWxkIGxpa2UgdG8gcHJvZHVjZSBlZmZpY2llbnQtdG8tZXhlY3V0ZSBjb2RlLCBidXQgbm90CisgICAgLy8vIGlmIGl0IHNpZ25pZmljYW50bHkgc2xvd3MgZG93biBjb21waWxhdGlvbiBvciB3b3VsZCBwcmV2ZW50IGV2ZW4gYmFzaWMKKyAgICAvLy8gZGVidWdnaW5nIG9mIHRoZSByZXN1bHRpbmcgYmluYXJ5LgorICAgIC8vLworICAgIC8vLyBBcyBhbiBleGFtcGxlLCBjb21wbGV4IGxvb3AgdHJhbnNmb3JtYXRpb25zIHN1Y2ggYXMgdmVyc2lvbmluZywKKyAgICAvLy8gdmVjdG9yaXphdGlvbiwgb3IgZnVzaW9uIG1pZ2h0IG5vdCBtYWtlIHNlbnNlIGhlcmUgZHVlIHRvIHRoZSBkZWdyZWUgdG8KKyAgICAvLy8gd2hpY2ggdGhlIGV4ZWN1dGVkIGNvZGUgd291bGQgZGlmZmVyIGZyb20gdGhlIHNvdXJjZSBjb2RlLCBhbmQgdGhlCisgICAgLy8vIHBvdGVudGlhbCBjb21waWxlIHRpbWUgY29zdC4KKyAgICBPMSwKKworICAgIC8vLyBPcHRpbWl6ZSBmb3IgZmFzdCBleGVjdXRpb24gYXMgbXVjaCBhcyBwb3NzaWJsZSB3aXRob3V0IHRyaWdnZXJpbmcKKyAgICAvLy8gc2lnbmlmaWNhbnQgaW5jcmVtZW50YWwgY29tcGlsZSB0aW1lIG9yIGNvZGUgc2l6ZSBncm93dGguCisgICAgLy8vCisgICAgLy8vIFRoZSBrZXkgaWRlYSBpcyB0aGF0IG9wdGltaXphdGlvbnMgYXQgdGhpcyBsZXZlbCBzaG91bGQgInBheSBmb3IKKyAgICAvLy8gdGhlbXNlbHZlcyIuIFNvIGlmIGFuIG9wdGltaXphdGlvbiBpbmNyZWFzZXMgY29tcGlsZSB0aW1lIGJ5IDUlIG9yCisgICAgLy8vIGluY3JlYXNlcyBjb2RlIHNpemUgYnkgNSUgZm9yIGEgcGFydGljdWxhciBiZW5jaG1hcmssIHRoYXQgYmVuY2htYXJrCisgICAgLy8vIHNob3VsZCBhbHNvIGJlIG9uZSB3aGljaCBzZWVzIGEgNSUgcnVudGltZSBpbXByb3ZlbWVudC4gSWYgdGhlIGNvbXBpbGUKKyAgICAvLy8gdGltZSBvciBjb2RlIHNpemUgcGVuYWx0aWVzIGhhcHBlbiBvbiBhdmVyYWdlIGFjcm9zcyBhIGRpdmVyc2UgcmFuZ2Ugb2YKKyAgICAvLy8gTExWTSB1c2VycycgYmVuY2htYXJrcywgdGhlbiB0aGUgaW1wcm92ZW1lbnRzIHNob3VsZCBhcyB3ZWxsLgorICAgIC8vLworICAgIC8vLyBBbmQgbm8gbWF0dGVyIHdoYXQsIHRoZSBjb21waWxlIHRpbWUgbmVlZHMgdG8gbm90IGdyb3cgc3VwZXJsaW5lYXJseQorICAgIC8vLyB3aXRoIHRoZSBzaXplIG9mIGlucHV0IHRvIExMVk0gc28gdGhhdCB1c2VycyBjYW4gY29udHJvbCB0aGUgcnVudGltZSBvZgorICAgIC8vLyB0aGUgb3B0aW1pemVyIGluIHRoaXMgbW9kZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyBleHBlY3RlZCB0byBiZSBhIGdvb2QgZGVmYXVsdCBvcHRpbWl6YXRpb24gbGV2ZWwgZm9yIHRoZSB2YXN0CisgICAgLy8vIG1ham9yaXR5IG9mIHVzZXJzLgorICAgIE8yLAorCisgICAgLy8vIE9wdGltaXplIGZvciBmYXN0IGV4ZWN1dGlvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICAgIC8vLworICAgIC8vLyBUaGlzIG1vZGUgaXMgc2lnbmlmaWNhbnRseSBtb3JlIGFnZ3Jlc3NpdmUgaW4gdHJhZGluZyBvZmYgY29tcGlsZSB0aW1lCisgICAgLy8vIGFuZCBjb2RlIHNpemUgdG8gZ2V0IGV4ZWN1dGlvbiB0aW1lIGltcHJvdmVtZW50cy4gVGhlIGNvcmUgaWRlYSBpcyB0aGF0CisgICAgLy8vIHRoaXMgbW9kZSBzaG91bGQgaW5jbHVkZSBhbnkgb3B0aW1pemF0aW9uIHRoYXQgaGVscHMgZXhlY3V0aW9uIHRpbWUgb24KKyAgICAvLy8gYmFsYW5jZSBhY3Jvc3MgYSBkaXZlcnNlIGNvbGxlY3Rpb24gb2YgYmVuY2htYXJrcywgZXZlbiBpZiBpdCBpbmNyZWFzZXMKKyAgICAvLy8gY29kZSBzaXplIG9yIGNvbXBpbGUgdGltZSBmb3Igc29tZSBiZW5jaG1hcmtzIHdpdGhvdXQgY29ycmVzcG9uZGluZworICAgIC8vLyBpbXByb3ZlbWVudHMgdG8gZXhlY3V0aW9uIHRpbWUuCisgICAgLy8vCisgICAgLy8vIERlc3BpdGUgYmVpbmcgd2lsbGluZyB0byB0cmFkZSBtb3JlIGNvbXBpbGUgdGltZSBvZmYgdG8gZ2V0IGltcHJvdmVkCisgICAgLy8vIGV4ZWN1dGlvbiB0aW1lLCB0aGlzIG1vZGUgc3RpbGwgdHJpZXMgdG8gYXZvaWQgc3VwZXJsaW5lYXIgZ3Jvd3RoIGluCisgICAgLy8vIG9yZGVyIHRvIG1ha2UgZXZlbiBzaWduaWZpY2FudGx5IHNsb3dlciBjb21waWxlIHRpbWVzIGF0IGxlYXN0IHNjYWxlCisgICAgLy8vIHJlYXNvbmFibHkuIFRoaXMgZG9lcyBub3QgcHJlY2x1ZGUgdmVyeSBzdWJzdGFudGlhbCBjb25zdGFudCBmYWN0b3IKKyAgICAvLy8gY29zdHMgdGhvdWdoLgorICAgIE8zLAorCisgICAgLy8vIFNpbWlsYXIgdG8gXGMgTzIgYnV0IHRyaWVzIHRvIG9wdGltaXplIGZvciBzbWFsbCBjb2RlIHNpemUgaW5zdGVhZCBvZgorICAgIC8vLyBmYXN0IGV4ZWN1dGlvbiB3aXRob3V0IHRyaWdnZXJpbmcgc2lnbmlmaWNhbnQgaW5jcmVtZW50YWwgZXhlY3V0aW9uCisgICAgLy8vIHRpbWUgc2xvd2Rvd25zLgorICAgIC8vLworICAgIC8vLyBUaGUgbG9naWMgaGVyZSBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIFxjIE8yLCBidXQgd2l0aCBjb2RlIHNpemUgYW5kCisgICAgLy8vIGV4ZWN1dGlvbiB0aW1lIG1ldHJpY3Mgc3dhcHBlZC4KKyAgICAvLy8KKyAgICAvLy8gQSBjb25zZXF1ZW5jZSBvZiB0aGUgZGlmZmVyZW50IGNvcmUgZ29hbCBpcyB0aGF0IHRoaXMgc2hvdWxkIGluIGdlbmVyYWwKKyAgICAvLy8gcHJvZHVjZSBzdWJzdGFudGlhbGx5IHNtYWxsZXIgZXhlY3V0YWJsZXMgdGhhdCBzdGlsbCBydW4gaW4KKyAgICAvLy8gYSByZWFzb25hYmxlIGFtb3VudCBvZiB0aW1lLgorICAgIE9zLAorCisgICAgLy8vIEEgdmVyeSBzcGVjaWFsaXplZCBtb2RlIHRoYXQgd2lsbCBvcHRpbWl6ZSBmb3IgY29kZSBzaXplIGF0IGFueSBhbmQgYWxsCisgICAgLy8vIGNvc3RzLgorICAgIC8vLworICAgIC8vLyBUaGlzIGlzIHVzZWZ1bCBwcmltYXJpbHkgd2hlbiB0aGVyZSBhcmUgYWJzb2x1dGUgc2l6ZSBsaW1pdGF0aW9ucyBhbmQKKyAgICAvLy8gYW55IGVmZm9ydCB0YWtlbiB0byByZWR1Y2UgdGhlIHNpemUgaXMgd29ydGggaXQgcmVnYXJkbGVzcyBvZiB0aGUKKyAgICAvLy8gZXhlY3V0aW9uIHRpbWUgaW1wYWN0LiBZb3Ugc2hvdWxkIGV4cGVjdCB0aGlzIGxldmVsIHRvIHByb2R1Y2UgcmF0aGVyCisgICAgLy8vIHNsb3csIGJ1dCB2ZXJ5IHNtYWxsLCBjb2RlLgorICAgIE96CisgIH07CisKKyAgZXhwbGljaXQgUGFzc0J1aWxkZXIoVGFyZ2V0TWFjaGluZSAqVE0gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxQR09PcHRpb25zPiBQR09PcHQgPSBOb25lKQorICAgICAgOiBUTShUTSksIFBHT09wdChQR09PcHQpIHt9CisKKyAgLy8vIFxicmllZiBDcm9zcyByZWdpc3RlciB0aGUgYW5hbHlzaXMgbWFuYWdlcnMgdGhyb3VnaCB0aGVpciBwcm94aWVzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYW4gaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3Jvc3MgcmVnaXN0ZXIgZWFjaAorICAvLyBBbmFseXNpc01hbmFnZXIgd2l0aCBhbGwgdGhlIG90aGVycyBhbmFseXNpcyBtYW5hZ2Vycy4KKyAgdm9pZCBjcm9zc1JlZ2lzdGVyUHJveGllcyhMb29wQW5hbHlzaXNNYW5hZ2VyICZMQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1NDQ0FuYWx5c2lzTWFuYWdlciAmQ0dBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVBbmFseXNpc01hbmFnZXIgJk1BTSk7CisKKyAgLy8vIFxicmllZiBSZWdpc3RlcnMgYWxsIGF2YWlsYWJsZSBtb2R1bGUgYW5hbHlzaXMgcGFzc2VzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYW4gaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gcG9wdWxhdGUgYSBcYworICAvLy8gTW9kdWxlQW5hbHlzaXNNYW5hZ2VyIHdpdGggYWxsIHJlZ2lzdGVyZWQgbW9kdWxlIGFuYWx5c2VzLiBDYWxsZXJzIGNhbgorICAvLy8gc3RpbGwgbWFudWFsbHkgcmVnaXN0ZXIgYW55IGFkZGl0aW9uYWwgYW5hbHlzZXMuIENhbGxlcnMgY2FuIGFsc28KKyAgLy8vIHByZS1yZWdpc3RlciBhbmFseXNlcyBhbmQgdGhpcyB3aWxsIG5vdCBvdmVycmlkZSB0aG9zZS4KKyAgdm9pZCByZWdpc3Rlck1vZHVsZUFuYWx5c2VzKE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmTUFNKTsKKworICAvLy8gXGJyaWVmIFJlZ2lzdGVycyBhbGwgYXZhaWxhYmxlIENHU0NDIGFuYWx5c2lzIHBhc3Nlcy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGFuIGludGVyZmFjZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvcHVsYXRlIGEgXGMgQ0dTQ0NBbmFseXNpc01hbmFnZXIKKyAgLy8vIHdpdGggYWxsIHJlZ2lzdGVyZWQgQ0dTQ0MgYW5hbHlzZXMuIENhbGxlcnMgY2FuIHN0aWxsIG1hbnVhbGx5IHJlZ2lzdGVyIGFueQorICAvLy8gYWRkaXRpb25hbCBhbmFseXNlcy4gQ2FsbGVycyBjYW4gYWxzbyBwcmUtcmVnaXN0ZXIgYW5hbHlzZXMgYW5kIHRoaXMgd2lsbAorICAvLy8gbm90IG92ZXJyaWRlIHRob3NlLgorICB2b2lkIHJlZ2lzdGVyQ0dTQ0NBbmFseXNlcyhDR1NDQ0FuYWx5c2lzTWFuYWdlciAmQ0dBTSk7CisKKyAgLy8vIFxicmllZiBSZWdpc3RlcnMgYWxsIGF2YWlsYWJsZSBmdW5jdGlvbiBhbmFseXNpcyBwYXNzZXMuCisgIC8vLworICAvLy8gVGhpcyBpcyBhbiBpbnRlcmZhY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBwb3B1bGF0ZSBhIFxjCisgIC8vLyBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciB3aXRoIGFsbCByZWdpc3RlcmVkIGZ1bmN0aW9uIGFuYWx5c2VzLiBDYWxsZXJzIGNhbgorICAvLy8gc3RpbGwgbWFudWFsbHkgcmVnaXN0ZXIgYW55IGFkZGl0aW9uYWwgYW5hbHlzZXMuIENhbGxlcnMgY2FuIGFsc28KKyAgLy8vIHByZS1yZWdpc3RlciBhbmFseXNlcyBhbmQgdGhpcyB3aWxsIG5vdCBvdmVycmlkZSB0aG9zZS4KKyAgdm9pZCByZWdpc3RlckZ1bmN0aW9uQW5hbHlzZXMoRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkZBTSk7CisKKyAgLy8vIFxicmllZiBSZWdpc3RlcnMgYWxsIGF2YWlsYWJsZSBsb29wIGFuYWx5c2lzIHBhc3Nlcy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGFuIGludGVyZmFjZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvcHVsYXRlIGEgXGMgTG9vcEFuYWx5c2lzTWFuYWdlcgorICAvLy8gd2l0aCBhbGwgcmVnaXN0ZXJlZCBsb29wIGFuYWx5c2VzLiBDYWxsZXJzIGNhbiBzdGlsbCBtYW51YWxseSByZWdpc3RlciBhbnkKKyAgLy8vIGFkZGl0aW9uYWwgYW5hbHlzZXMuCisgIHZvaWQgcmVnaXN0ZXJMb29wQW5hbHlzZXMoTG9vcEFuYWx5c2lzTWFuYWdlciAmTEFNKTsKKworICAvLy8gQ29uc3RydWN0IHRoZSBjb3JlIExMVk0gZnVuY3Rpb24gY2Fub25pY2FsaXphdGlvbiBhbmQgc2ltcGxpZmljYXRpb24KKyAgLy8vIHBpcGVsaW5lLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYSBsb25nIHBpcGVsaW5lIGFuZCB1c2VzIG1vc3Qgb2YgdGhlIHBlci1mdW5jdGlvbiBvcHRpbWl6YXRpb24KKyAgLy8vIHBhc3NlcyBpbiBMTFZNIHRvIGNhbm9uaWNhbGl6ZSBhbmQgc2ltcGxpZnkgdGhlIElSLiBJdCBpcyBzdWl0YWJsZSB0byBydW4KKyAgLy8vIHJlcGVhdGVkbHkgb3ZlciB0aGUgSVIgYW5kIGlzIG5vdCBleHBlY3RlZCB0byBkZXN0cm95IGltcG9ydGFudAorICAvLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGUgSVIuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IFxwIExldmVsIGNhbm5vdCBiZSBgTzBgIGhlcmUuIFRoZSBwaXBlbGluZXMgcHJvZHVjZWQgYXJlCisgIC8vLyBvbmx5IGludGVuZGVkIGZvciB1c2Ugd2hlbiBhdHRlbXB0aW5nIHRvIG9wdGltaXplIGNvZGUuIElmIGZyb250ZW5kcworICAvLy8gcmVxdWlyZSBzb21lIHRyYW5zZm9ybWF0aW9ucyBmb3Igc2VtYW50aWMgcmVhc29ucywgdGhleSBzaG91bGQgZXhwbGljaXRseQorICAvLy8gYnVpbGQgdGhlbS4KKyAgLy8vCisgIC8vLyBccCBQaGFzZSBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgVGhpbkxUTyBwaGFzZS4KKyAgRnVuY3Rpb25QYXNzTWFuYWdlcgorICBidWlsZEZ1bmN0aW9uU2ltcGxpZmljYXRpb25QaXBlbGluZShPcHRpbWl6YXRpb25MZXZlbCBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpbkxUT1BoYXNlIFBoYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERlYnVnTG9nZ2luZyA9IGZhbHNlKTsKKworICAvLy8gQ29uc3RydWN0IHRoZSBjb3JlIExMVk0gbW9kdWxlIGNhbm9uaWNhbGl6YXRpb24gYW5kIHNpbXBsaWZpY2F0aW9uCisgIC8vLyBwaXBlbGluZS4KKyAgLy8vCisgIC8vLyBUaGlzIHBpcGVsaW5lIGZvY3VzZXMgb24gY2Fub25pY2FsaXppbmcgYW5kIHNpbXBsaWZ5aW5nIHRoZSBlbnRpcmUgbW9kdWxlCisgIC8vLyBvZiBJUi4gTXVjaCBsaWtlIHRoZSBmdW5jdGlvbiBzaW1wbGlmaWNhdGlvbiBwaXBlbGluZSBhYm92ZSwgaXQgaXMKKyAgLy8vIHN1aXRhYmxlIHRvIHJ1biByZXBlYXRlZGx5IG92ZXIgdGhlIElSIGFuZCBpcyBub3QgZXhwZWN0ZWQgdG8gZGVzdHJveQorICAvLy8gaW1wb3J0YW50IGluZm9ybWF0aW9uLiBJdCBkb2VzLCBob3dldmVyLCBwZXJmb3JtIGlubGluaW5nIGFuZCBvdGhlcgorICAvLy8gaGV1cmlzdGljIGJhc2VkIHNpbXBsaWZpY2F0aW9ucyB0aGF0IGFyZSBub3Qgc3RyaWN0bHkgcmV2ZXJzaWJsZS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgXHAgTGV2ZWwgY2Fubm90IGJlIGBPMGAgaGVyZS4gVGhlIHBpcGVsaW5lcyBwcm9kdWNlZCBhcmUKKyAgLy8vIG9ubHkgaW50ZW5kZWQgZm9yIHVzZSB3aGVuIGF0dGVtcHRpbmcgdG8gb3B0aW1pemUgY29kZS4gSWYgZnJvbnRlbmRzCisgIC8vLyByZXF1aXJlIHNvbWUgdHJhbnNmb3JtYXRpb25zIGZvciBzZW1hbnRpYyByZWFzb25zLCB0aGV5IHNob3VsZCBleHBsaWNpdGx5CisgIC8vLyBidWlsZCB0aGVtLgorICAvLy8KKyAgLy8vIFxwIFBoYXNlIGluZGljYXRlcyB0aGUgY3VycmVudCBUaGluTFRPIHBoYXNlLgorICBNb2R1bGVQYXNzTWFuYWdlcgorICBidWlsZE1vZHVsZVNpbXBsaWZpY2F0aW9uUGlwZWxpbmUoT3B0aW1pemF0aW9uTGV2ZWwgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGluTFRPUGhhc2UgUGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERlYnVnTG9nZ2luZyA9IGZhbHNlKTsKKworICAvLy8gQ29uc3RydWN0IHRoZSBjb3JlIExMVk0gbW9kdWxlIG9wdGltaXphdGlvbiBwaXBlbGluZS4KKyAgLy8vCisgIC8vLyBUaGlzIHBpcGVsaW5lIGZvY3VzZXMgb24gb3B0aW1pemluZyB0aGUgZXhlY3V0aW9uIHNwZWVkIG9mIHRoZSBJUi4gSXQKKyAgLy8vIHVzZXMgY29zdCBtb2RlbGluZyBhbmQgdGhyZXNob2xkcyB0byBiYWxhbmNlIGNvZGUgZ3Jvd3RoIGFnYWluc3QgcnVudGltZQorICAvLy8gaW1wcm92ZW1lbnRzLiBJdCBpbmNsdWRlcyB2ZWN0b3JpemF0aW9uIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBkZXN0cm95aW5nCisgIC8vLyB0cmFuc2Zvcm1hdGlvbnMuIEl0IGFsc28gY2Fubm90IGdlbmVyYWxseSBiZSBydW4gcmVwZWF0ZWRseSBvbiBhIG1vZHVsZQorICAvLy8gd2l0aG91dCBwb3RlbnRpYWxseSBzZXJpb3VzbHkgcmVncmVzc2luZyBlaXRoZXIgcnVudGltZSBwZXJmb3JtYW5jZSBvZgorICAvLy8gdGhlIGNvZGUgb3Igc2VyaW91cyBjb2RlIHNpemUgZ3Jvd3RoLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBccCBMZXZlbCBjYW5ub3QgYmUgYE8wYCBoZXJlLiBUaGUgcGlwZWxpbmVzIHByb2R1Y2VkIGFyZQorICAvLy8gb25seSBpbnRlbmRlZCBmb3IgdXNlIHdoZW4gYXR0ZW1wdGluZyB0byBvcHRpbWl6ZSBjb2RlLiBJZiBmcm9udGVuZHMKKyAgLy8vIHJlcXVpcmUgc29tZSB0cmFuc2Zvcm1hdGlvbnMgZm9yIHNlbWFudGljIHJlYXNvbnMsIHRoZXkgc2hvdWxkIGV4cGxpY2l0bHkKKyAgLy8vIGJ1aWxkIHRoZW0uCisgIE1vZHVsZVBhc3NNYW5hZ2VyIGJ1aWxkTW9kdWxlT3B0aW1pemF0aW9uUGlwZWxpbmUoT3B0aW1pemF0aW9uTGV2ZWwgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZWJ1Z0xvZ2dpbmcgPSBmYWxzZSk7CisKKyAgLy8vIEJ1aWxkIGEgcGVyLW1vZHVsZSBkZWZhdWx0IG9wdGltaXphdGlvbiBwaXBlbGluZS4KKyAgLy8vCisgIC8vLyBUaGlzIHByb3ZpZGVzIGEgZ29vZCBkZWZhdWx0IG9wdGltaXphdGlvbiBwaXBlbGluZSBmb3IgcGVyLW1vZHVsZQorICAvLy8gb3B0aW1pemF0aW9uIGFuZCBjb2RlIGdlbmVyYXRpb24gd2l0aG91dCBhbnkgbGluay10aW1lIG9wdGltaXphdGlvbi4gSXQKKyAgLy8vIHR5cGljYWxseSBjb3JyZXNwb25kIHRvIGZyb250ZW5kICItT1sxMjNdIiBvcHRpb25zIGZvciBvcHRpbWl6YXRpb24KKyAgLy8vIGxldmVscyBcYyBPMSwgXGMgTzIgYW5kIFxjIE8zIHJlc3AuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IFxwIExldmVsIGNhbm5vdCBiZSBgTzBgIGhlcmUuIFRoZSBwaXBlbGluZXMgcHJvZHVjZWQgYXJlCisgIC8vLyBvbmx5IGludGVuZGVkIGZvciB1c2Ugd2hlbiBhdHRlbXB0aW5nIHRvIG9wdGltaXplIGNvZGUuIElmIGZyb250ZW5kcworICAvLy8gcmVxdWlyZSBzb21lIHRyYW5zZm9ybWF0aW9ucyBmb3Igc2VtYW50aWMgcmVhc29ucywgdGhleSBzaG91bGQgZXhwbGljaXRseQorICAvLy8gYnVpbGQgdGhlbS4KKyAgTW9kdWxlUGFzc01hbmFnZXIgYnVpbGRQZXJNb2R1bGVEZWZhdWx0UGlwZWxpbmUoT3B0aW1pemF0aW9uTGV2ZWwgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVidWdMb2dnaW5nID0gZmFsc2UpOworCisgIC8vLyBCdWlsZCBhIHByZS1saW5rLCBUaGluTFRPLXRhcmdldGluZyBkZWZhdWx0IG9wdGltaXphdGlvbiBwaXBlbGluZSB0bworICAvLy8gYSBwYXNzIG1hbmFnZXIuCisgIC8vLworICAvLy8gVGhpcyBhZGRzIHRoZSBwcmUtbGluayBvcHRpbWl6YXRpb25zIHR1bmVkIHRvIHByZXBhcmUgYSBtb2R1bGUgZm9yCisgIC8vLyBhIFRoaW5MVE8gcnVuLiBJdCB3b3JrcyB0byBtaW5pbWl6ZSB0aGUgSVIgd2hpY2ggbmVlZHMgdG8gYmUgYW5hbHl6ZWQKKyAgLy8vIHdpdGhvdXQgbWFraW5nIGlycmV2ZXJzaWJsZSBkZWNpc2lvbnMgd2hpY2ggY291bGQgYmUgbWFkZSBiZXR0ZXIgZHVyaW5nCisgIC8vLyB0aGUgTFRPIHJ1bi4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgXHAgTGV2ZWwgY2Fubm90IGJlIGBPMGAgaGVyZS4gVGhlIHBpcGVsaW5lcyBwcm9kdWNlZCBhcmUKKyAgLy8vIG9ubHkgaW50ZW5kZWQgZm9yIHVzZSB3aGVuIGF0dGVtcHRpbmcgdG8gb3B0aW1pemUgY29kZS4gSWYgZnJvbnRlbmRzCisgIC8vLyByZXF1aXJlIHNvbWUgdHJhbnNmb3JtYXRpb25zIGZvciBzZW1hbnRpYyByZWFzb25zLCB0aGV5IHNob3VsZCBleHBsaWNpdGx5CisgIC8vLyBidWlsZCB0aGVtLgorICBNb2R1bGVQYXNzTWFuYWdlcgorICBidWlsZFRoaW5MVE9QcmVMaW5rRGVmYXVsdFBpcGVsaW5lKE9wdGltaXphdGlvbkxldmVsIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVidWdMb2dnaW5nID0gZmFsc2UpOworCisgIC8vLyBCdWlsZCBhbiBUaGluTFRPIGRlZmF1bHQgb3B0aW1pemF0aW9uIHBpcGVsaW5lIHRvIGEgcGFzcyBtYW5hZ2VyLgorICAvLy8KKyAgLy8vIFRoaXMgcHJvdmlkZXMgYSBnb29kIGRlZmF1bHQgb3B0aW1pemF0aW9uIHBpcGVsaW5lIGZvciBsaW5rLXRpbWUKKyAgLy8vIG9wdGltaXphdGlvbiBhbmQgY29kZSBnZW5lcmF0aW9uLiBJdCBpcyBwYXJ0aWN1bGFybHkgdHVuZWQgdG8gZml0IHdlbGwKKyAgLy8vIHdoZW4gSVIgY29taW5nIGludG8gdGhlIExUTyBwaGFzZSB3YXMgZmlyc3QgcnVuIHRocm91Z2ggXGMKKyAgLy8vIGFkZFByZUxpbmtMVE9EZWZhdWx0UGlwZWxpbmUsIGFuZCB0aGUgdHdvIGNvb3JkaW5hdGUgY2xvc2VseS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgXHAgTGV2ZWwgY2Fubm90IGJlIGBPMGAgaGVyZS4gVGhlIHBpcGVsaW5lcyBwcm9kdWNlZCBhcmUKKyAgLy8vIG9ubHkgaW50ZW5kZWQgZm9yIHVzZSB3aGVuIGF0dGVtcHRpbmcgdG8gb3B0aW1pemUgY29kZS4gSWYgZnJvbnRlbmRzCisgIC8vLyByZXF1aXJlIHNvbWUgdHJhbnNmb3JtYXRpb25zIGZvciBzZW1hbnRpYyByZWFzb25zLCB0aGV5IHNob3VsZCBleHBsaWNpdGx5CisgIC8vLyBidWlsZCB0aGVtLgorICBNb2R1bGVQYXNzTWFuYWdlciBidWlsZFRoaW5MVE9EZWZhdWx0UGlwZWxpbmUoT3B0aW1pemF0aW9uTGV2ZWwgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERlYnVnTG9nZ2luZyA9IGZhbHNlKTsKKworICAvLy8gQnVpbGQgYSBwcmUtbGluaywgTFRPLXRhcmdldGluZyBkZWZhdWx0IG9wdGltaXphdGlvbiBwaXBlbGluZSB0byBhIHBhc3MKKyAgLy8vIG1hbmFnZXIuCisgIC8vLworICAvLy8gVGhpcyBhZGRzIHRoZSBwcmUtbGluayBvcHRpbWl6YXRpb25zIHR1bmVkIHRvIHdvcmsgd2VsbCB3aXRoIGEgbGF0ZXIgTFRPCisgIC8vLyBydW4uIEl0IHdvcmtzIHRvIG1pbmltaXplIHRoZSBJUiB3aGljaCBuZWVkcyB0byBiZSBhbmFseXplZCB3aXRob3V0CisgIC8vLyBtYWtpbmcgaXJyZXZlcnNpYmxlIGRlY2lzaW9ucyB3aGljaCBjb3VsZCBiZSBtYWRlIGJldHRlciBkdXJpbmcgdGhlIExUTworICAvLy8gcnVuLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBccCBMZXZlbCBjYW5ub3QgYmUgYE8wYCBoZXJlLiBUaGUgcGlwZWxpbmVzIHByb2R1Y2VkIGFyZQorICAvLy8gb25seSBpbnRlbmRlZCBmb3IgdXNlIHdoZW4gYXR0ZW1wdGluZyB0byBvcHRpbWl6ZSBjb2RlLiBJZiBmcm9udGVuZHMKKyAgLy8vIHJlcXVpcmUgc29tZSB0cmFuc2Zvcm1hdGlvbnMgZm9yIHNlbWFudGljIHJlYXNvbnMsIHRoZXkgc2hvdWxkIGV4cGxpY2l0bHkKKyAgLy8vIGJ1aWxkIHRoZW0uCisgIE1vZHVsZVBhc3NNYW5hZ2VyIGJ1aWxkTFRPUHJlTGlua0RlZmF1bHRQaXBlbGluZShPcHRpbWl6YXRpb25MZXZlbCBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVidWdMb2dnaW5nID0gZmFsc2UpOworCisgIC8vLyBCdWlsZCBhbiBMVE8gZGVmYXVsdCBvcHRpbWl6YXRpb24gcGlwZWxpbmUgdG8gYSBwYXNzIG1hbmFnZXIuCisgIC8vLworICAvLy8gVGhpcyBwcm92aWRlcyBhIGdvb2QgZGVmYXVsdCBvcHRpbWl6YXRpb24gcGlwZWxpbmUgZm9yIGxpbmstdGltZQorICAvLy8gb3B0aW1pemF0aW9uIGFuZCBjb2RlIGdlbmVyYXRpb24uIEl0IGlzIHBhcnRpY3VsYXJseSB0dW5lZCB0byBmaXQgd2VsbAorICAvLy8gd2hlbiBJUiBjb21pbmcgaW50byB0aGUgTFRPIHBoYXNlIHdhcyBmaXJzdCBydW4gdGhyb3VnaCBcYworICAvLy8gYWRkUHJlTGlua0xUT0RlZmF1bHRQaXBlbGluZSwgYW5kIHRoZSB0d28gY29vcmRpbmF0ZSBjbG9zZWx5LgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBccCBMZXZlbCBjYW5ub3QgYmUgYE8wYCBoZXJlLiBUaGUgcGlwZWxpbmVzIHByb2R1Y2VkIGFyZQorICAvLy8gb25seSBpbnRlbmRlZCBmb3IgdXNlIHdoZW4gYXR0ZW1wdGluZyB0byBvcHRpbWl6ZSBjb2RlLiBJZiBmcm9udGVuZHMKKyAgLy8vIHJlcXVpcmUgc29tZSB0cmFuc2Zvcm1hdGlvbnMgZm9yIHNlbWFudGljIHJlYXNvbnMsIHRoZXkgc2hvdWxkIGV4cGxpY2l0bHkKKyAgLy8vIGJ1aWxkIHRoZW0uCisgIE1vZHVsZVBhc3NNYW5hZ2VyIGJ1aWxkTFRPRGVmYXVsdFBpcGVsaW5lKE9wdGltaXphdGlvbkxldmVsIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERlYnVnTG9nZ2luZyA9IGZhbHNlKTsKKworICAvLy8gQnVpbGQgdGhlIGRlZmF1bHQgYEFBTWFuYWdlcmAgd2l0aCB0aGUgZGVmYXVsdCBhbGlhcyBhbmFseXNpcyBwaXBlbGluZQorICAvLy8gcmVnaXN0ZXJlZC4KKyAgQUFNYW5hZ2VyIGJ1aWxkRGVmYXVsdEFBUGlwZWxpbmUoKTsKKworICAvLy8gXGJyaWVmIFBhcnNlIGEgdGV4dHVhbCBwYXNzIHBpcGVsaW5lIGRlc2NyaXB0aW9uIGludG8gYSBcYworICAvLy8gTW9kdWxlUGFzc01hbmFnZXIuCisgIC8vLworICAvLy8gVGhlIGZvcm1hdCBvZiB0aGUgdGV4dHVhbCBwYXNzIHBpcGVsaW5lIGRlc2NyaXB0aW9uIGxvb2tzIHNvbWV0aGluZyBsaWtlOgorICAvLy8KKyAgLy8vICAgbW9kdWxlKGZ1bmN0aW9uKGluc3Rjb21iaW5lLHNyb2EpLGRjZSxjZ3NjYyhpbmxpbmVyLGZ1bmN0aW9uKC4uLikpLC4uLikKKyAgLy8vCisgIC8vLyBQYXNzIG1hbmFnZXJzIGhhdmUgKClzIGRlc2NyaWJpbmcgdGhlIG5lc3Qgc3RydWN0dXJlIG9mIHBhc3Nlcy4gQWxsIHBhc3NlcworICAvLy8gYXJlIGNvbW1hIHNlcGFyYXRlZC4gQXMgYSBzcGVjaWFsIHNob3J0Y3V0LCBpZiB0aGUgdmVyeSBmaXJzdCBwYXNzIGlzIG5vdAorICAvLy8gYSBtb2R1bGUgcGFzcyAoYXMgYSBtb2R1bGUgcGFzcyBtYW5hZ2VyIGlzKSwgdGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgZm9ybQorICAvLy8gdGhlIHNob3J0ZXN0IHN0YWNrIG9mIHBhc3MgbWFuYWdlcnMgdGhhdCBhbGxvdyBpbnNlcnRpbmcgdGhhdCBmaXJzdCBwYXNzLgorICAvLy8gU28sIGFzc3VtaW5nIGZ1bmN0aW9uIHBhc3NlcyAnZnBhc3NOJywgQ0dTQ0MgcGFzc2VzICdjZ3Bhc3NOJywgYW5kIGxvb3AKKyAgLy8vIHBhc3NlcyAnbHBhc3NOJywgYWxsIG9mIHRoZXNlIGFyZSB2YWxpZDoKKyAgLy8vCisgIC8vLyAgIGZwYXNzMSxmcGFzczIsZnBhc3MzCisgIC8vLyAgIGNncGFzczEsY2dwYXNzMixjZ3Bhc3MzCisgIC8vLyAgIGxwYXNzMSxscGFzczIsbHBhc3MzCisgIC8vLworICAvLy8gQW5kIHRoZXkgYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyAocmVzcC4pOgorICAvLy8KKyAgLy8vICAgbW9kdWxlKGZ1bmN0aW9uKGZwYXNzMSxmcGFzczIsZnBhc3MzKSkKKyAgLy8vICAgbW9kdWxlKGNnc2NjKGNncGFzczEsY2dwYXNzMixjZ3Bhc3MzKSkKKyAgLy8vICAgbW9kdWxlKGZ1bmN0aW9uKGxvb3AobHBhc3MxLGxwYXNzMixscGFzczMpKSkKKyAgLy8vCisgIC8vLyBUaGlzIHNob3J0Y3V0IGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIHRlc3Rpbmcgc21hbGwgcGFzcworICAvLy8gY29tYmluYXRpb25zLiBOb3RlIHRoYXQgdGhlc2Ugc2hvcnRjdXRzIGRvbid0IGludHJvZHVjZSBhbnkgb3RoZXIgbWFnaWMuCisgIC8vLyBJZiB0aGUgc2VxdWVuY2Ugb2YgcGFzc2VzIGFyZW4ndCBhbGwgdGhlIGV4YWN0IHNhbWUga2luZCBvZiBwYXNzLCBpdCB3aWxsCisgIC8vLyBiZSBhbiBlcnJvci4gWW91IGNhbm5vdCBtaXggZGlmZmVyZW50IGxldmVscyBpbXBsaWNpdGx5LCB5b3UgbXVzdAorICAvLy8gZXhwbGljaXRseSBmb3JtIGEgcGFzcyBtYW5hZ2VyIGluIHdoaWNoIHRvIG5lc3QgcGFzc2VzLgorICBib29sIHBhcnNlUGFzc1BpcGVsaW5lKE1vZHVsZVBhc3NNYW5hZ2VyICZNUE0sIFN0cmluZ1JlZiBQaXBlbGluZVRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWZXJpZnlFYWNoUGFzcyA9IHRydWUsIGJvb2wgRGVidWdMb2dnaW5nID0gZmFsc2UpOworCisgIC8vLyB7e0AgUGFyc2UgYSB0ZXh0dWFsIHBhc3MgcGlwZWxpbmUgZGVzY3JpcHRpb24gaW50byBhIHNwZWNpZmljIFBhc3NNYW5hZ2VyCisgIC8vLworICAvLy8gQXV0b21hdGljIGRlZHVjdGlvbiBvZiBhbiBhcHByb3ByaWF0ZSBwYXNzIG1hbmFnZXIgc3RhY2sgaXMgbm90IHN1cHBvcnRlZC4KKyAgLy8vIEZvciBleGFtcGxlLCB0byBpbnNlcnQgYSBsb29wIHBhc3MgJ2xwYXNzJyBpbnRvIGEgRnVuY3Rpbm9QYXNzTWFuYWdlciwKKyAgLy8vIHRoaXMgaXMgdGhlIHZhbGlkIHBpcGVsaW5lIHRleHQ6CisgIC8vLworICAvLy8gICBmdW5jdGlvbihscGFzcykKKyAgYm9vbCBwYXJzZVBhc3NQaXBlbGluZShDR1NDQ1Bhc3NNYW5hZ2VyICZDR1BNLCBTdHJpbmdSZWYgUGlwZWxpbmVUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVmVyaWZ5RWFjaFBhc3MgPSB0cnVlLCBib29sIERlYnVnTG9nZ2luZyA9IGZhbHNlKTsKKyAgYm9vbCBwYXJzZVBhc3NQaXBlbGluZShGdW5jdGlvblBhc3NNYW5hZ2VyICZGUE0sIFN0cmluZ1JlZiBQaXBlbGluZVRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWZXJpZnlFYWNoUGFzcyA9IHRydWUsIGJvb2wgRGVidWdMb2dnaW5nID0gZmFsc2UpOworICBib29sIHBhcnNlUGFzc1BpcGVsaW5lKExvb3BQYXNzTWFuYWdlciAmTFBNLCBTdHJpbmdSZWYgUGlwZWxpbmVUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVmVyaWZ5RWFjaFBhc3MgPSB0cnVlLCBib29sIERlYnVnTG9nZ2luZyA9IGZhbHNlKTsKKyAgLy8vIEB9fQorCisgIC8vLyBQYXJzZSBhIHRleHR1YWwgYWxpYXMgYW5hbHlzaXMgcGlwZWxpbmUgaW50byB0aGUgcHJvdmlkZWQgQUEgbWFuYWdlci4KKyAgLy8vCisgIC8vLyBUaGUgZm9ybWF0IG9mIHRoZSB0ZXh0dWFsIEFBIHBpcGVsaW5lIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgQUEKKyAgLy8vIHBhc3MgbmFtZXM6CisgIC8vLworICAvLy8gICBiYXNpYy1hYSxnbG9iYWxzLWFhLC4uLgorICAvLy8KKyAgLy8vIFRoZSBBQSBtYW5hZ2VyIGlzIHNldCB1cCBzdWNoIHRoYXQgdGhlIHByb3ZpZGVkIGFsaWFzIGFuYWx5c2VzIGFyZSB0cmllZAorICAvLy8gaW4gdGhlIG9yZGVyIHNwZWNpZmllZC4gU2VlIHRoZSBcYyBBQU1hbmFhZ2VyIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMKKyAgLy8vIGFib3V0IHRoZSBsb2dpYyB1c2VkLiBUaGlzIHJvdXRpbmUganVzdCBwcm92aWRlcyB0aGUgdGV4dHVhbCBtYXBwaW5nCisgIC8vLyBiZXR3ZWVuIEFBIG5hbWVzIGFuZCB0aGUgYW5hbHlzZXMgdG8gcmVnaXN0ZXIgd2l0aCB0aGUgbWFuYWdlci4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSB0ZXh0IGNhbm5vdCBiZSBwYXJzZWQgY2xlYW5seS4gVGhlIHNwZWNpZmljIHN0YXRlIG9mCisgIC8vLyB0aGUgXHAgQUEgbWFuYWdlciBpcyB1bnNwZWNpZmllZCBpZiBzdWNoIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIGFuZCB0aGlzCisgIC8vLyByZXR1cm5zIGZhbHNlLgorICBib29sIHBhcnNlQUFQaXBlbGluZShBQU1hbmFnZXIgJkFBLCBTdHJpbmdSZWYgUGlwZWxpbmVUZXh0KTsKKworICAvLy8gXGJyaWVmIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZm9yIGEgZGVmYXVsdCBvcHRpbWl6ZXIgcGlwZWxpbmUgZXh0ZW5zaW9uCisgIC8vLyBwb2ludAorICAvLy8KKyAgLy8vIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhZGRpbmcgcGFzc2VzIHRoYXQgcGVyZm9ybSBwZWVwaG9sZQorICAvLy8gb3B0aW1pemF0aW9ucyBzaW1pbGFyIHRvIHRoZSBpbnN0cnVjdGlvbiBjb21iaW5lci4gVGhlc2UgcGFzc2VzIHdpbGwgYmUKKyAgLy8vIGluc2VydGVkIGFmdGVyIGVhY2ggaW5zdGFuY2Ugb2YgdGhlIGluc3RydWN0aW9uIGNvbWJpbmVyIHBhc3MuCisgIHZvaWQgcmVnaXN0ZXJQZWVwaG9sZUVQQ2FsbGJhY2soCisgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoRnVuY3Rpb25QYXNzTWFuYWdlciAmLCBPcHRpbWl6YXRpb25MZXZlbCk+ICZDKSB7CisgICAgUGVlcGhvbGVFUENhbGxiYWNrcy5wdXNoX2JhY2soQyk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZm9yIGEgZGVmYXVsdCBvcHRpbWl6ZXIgcGlwZWxpbmUgZXh0ZW5zaW9uCisgIC8vLyBwb2ludAorICAvLy8KKyAgLy8vIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhZGRpbmcgbGF0ZSBsb29wIGNhbm9uaWNhbGl6YXRpb24gYW5kCisgIC8vLyBzaW1wbGlmaWNhdGlvbiBwYXNzZXMuIFRoaXMgaXMgdGhlIGxhc3QgcG9pbnQgaW4gdGhlIGxvb3Agb3B0aW1pemF0aW9uCisgIC8vLyBwaXBlbGluZSBiZWZvcmUgbG9vcCBkZWxldGlvbi4gRWFjaCBwYXNzIGFkZGVkCisgIC8vLyBoZXJlIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgTG9vcFBhc3MuCisgIC8vLyBUaGlzIGlzIHRoZSBwbGFjZSB0byBhZGQgcGFzc2VzIHRoYXQgY2FuIHJlbW92ZSBsb29wcywgc3VjaCBhcyB0YXJnZXQtCisgIC8vLyBzcGVjaWZpYyBsb29wIGlkaW9tIHJlY29nbml0aW9uLgorICB2b2lkIHJlZ2lzdGVyTGF0ZUxvb3BPcHRpbWl6YXRpb25zRVBDYWxsYmFjaygKKyAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChMb29wUGFzc01hbmFnZXIgJiwgT3B0aW1pemF0aW9uTGV2ZWwpPiAmQykgeworICAgIExhdGVMb29wT3B0aW1pemF0aW9uc0VQQ2FsbGJhY2tzLnB1c2hfYmFjayhDKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVnaXN0ZXIgYSBjYWxsYmFjayBmb3IgYSBkZWZhdWx0IG9wdGltaXplciBwaXBlbGluZSBleHRlbnNpb24KKyAgLy8vIHBvaW50CisgIC8vLworICAvLy8gVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGFkZGluZyBsb29wIHBhc3NlcyB0byB0aGUgZW5kIG9mIHRoZSBsb29wCisgIC8vLyBvcHRpbWl6ZXIuCisgIHZvaWQgcmVnaXN0ZXJMb29wT3B0aW1pemVyRW5kRVBDYWxsYmFjaygKKyAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChMb29wUGFzc01hbmFnZXIgJiwgT3B0aW1pemF0aW9uTGV2ZWwpPiAmQykgeworICAgIExvb3BPcHRpbWl6ZXJFbmRFUENhbGxiYWNrcy5wdXNoX2JhY2soQyk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZm9yIGEgZGVmYXVsdCBvcHRpbWl6ZXIgcGlwZWxpbmUgZXh0ZW5zaW9uCisgIC8vLyBwb2ludAorICAvLy8KKyAgLy8vIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhZGRpbmcgb3B0aW1pemF0aW9uIHBhc3NlcyBhZnRlciBtb3N0IG9mIHRoZQorICAvLy8gbWFpbiBvcHRpbWl6YXRpb25zLCBidXQgYmVmb3JlIHRoZSBsYXN0IGNsZWFudXAtaXNoIG9wdGltaXphdGlvbnMuCisgIHZvaWQgcmVnaXN0ZXJTY2FsYXJPcHRpbWl6ZXJMYXRlRVBDYWxsYmFjaygKKyAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChGdW5jdGlvblBhc3NNYW5hZ2VyICYsIE9wdGltaXphdGlvbkxldmVsKT4gJkMpIHsKKyAgICBTY2FsYXJPcHRpbWl6ZXJMYXRlRVBDYWxsYmFja3MucHVzaF9iYWNrKEMpOworICB9CisKKyAgLy8vIFxicmllZiBSZWdpc3RlciBhIGNhbGxiYWNrIGZvciBhIGRlZmF1bHQgb3B0aW1pemVyIHBpcGVsaW5lIGV4dGVuc2lvbgorICAvLy8gcG9pbnQKKyAgLy8vCisgIC8vLyBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYWRkaW5nIENhbGxHcmFwaFNDQyBwYXNzZXMgYXQgdGhlIGVuZCBvZiB0aGUKKyAgLy8vIG1haW4gQ2FsbEdyYXBoU0NDIHBhc3NlcyBhbmQgYmVmb3JlIGFueSBmdW5jdGlvbiBzaW1wbGlmaWNhdGlvbiBwYXNzZXMgcnVuCisgIC8vLyBieSBDR1Bhc3NNYW5hZ2VyLgorICB2b2lkIHJlZ2lzdGVyQ0dTQ0NPcHRpbWl6ZXJMYXRlRVBDYWxsYmFjaygKKyAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChDR1NDQ1Bhc3NNYW5hZ2VyICYsIE9wdGltaXphdGlvbkxldmVsKT4gJkMpIHsKKyAgICBDR1NDQ09wdGltaXplckxhdGVFUENhbGxiYWNrcy5wdXNoX2JhY2soQyk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZm9yIGEgZGVmYXVsdCBvcHRpbWl6ZXIgcGlwZWxpbmUgZXh0ZW5zaW9uCisgIC8vLyBwb2ludAorICAvLy8KKyAgLy8vIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhZGRpbmcgb3B0aW1pemF0aW9uIHBhc3NlcyBiZWZvcmUgdGhlCisgIC8vLyB2ZWN0b3JpemVyIGFuZCBvdGhlciBoaWdobHkgdGFyZ2V0IHNwZWNpZmljIG9wdGltaXphdGlvbiBwYXNzZXMgYXJlCisgIC8vLyBleGVjdXRlZC4KKyAgdm9pZCByZWdpc3RlclZlY3Rvcml6ZXJTdGFydEVQQ2FsbGJhY2soCisgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoRnVuY3Rpb25QYXNzTWFuYWdlciAmLCBPcHRpbWl6YXRpb25MZXZlbCk+ICZDKSB7CisgICAgVmVjdG9yaXplclN0YXJ0RVBDYWxsYmFja3MucHVzaF9iYWNrKEMpOworICB9CisKKyAgLy8vIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZm9yIGEgZGVmYXVsdCBvcHRpbWl6ZXIgcGlwZWxpbmUgZXh0ZW5zaW9uIHBvaW50LgorICAvLy8KKyAgLy8vIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhZGRpbmcgb3B0aW1pemF0aW9uIG9uY2UgYXQgdGhlIHN0YXJ0IG9mIHRoZQorICAvLy8gcGlwZWxpbmUuIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gJ2JhY2tlbmQnIGNvbXBpbGVzIChMVE8gYW5kIFRoaW5MVE8KKyAgLy8vIGxpbmstdGltZSBwaXBlbGluZXMpLgorICB2b2lkIHJlZ2lzdGVyUGlwZWxpbmVTdGFydEVQQ2FsbGJhY2soCisgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoTW9kdWxlUGFzc01hbmFnZXIgJik+ICZDKSB7CisgICAgUGlwZWxpbmVTdGFydEVQQ2FsbGJhY2tzLnB1c2hfYmFjayhDKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVnaXN0ZXIgYSBjYWxsYmFjayBmb3IgcGFyc2luZyBhbiBBbGlhc0FuYWx5c2lzIE5hbWUgdG8gcG9wdWxhdGUKKyAgLy8vIHRoZSBnaXZlbiBBQU1hbmFnZXIgXHAgQUEKKyAgdm9pZCByZWdpc3RlclBhcnNlQUFDYWxsYmFjaygKKyAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248Ym9vbChTdHJpbmdSZWYgTmFtZSwgQUFNYW5hZ2VyICZBQSk+ICZDKSB7CisgICAgQUFQYXJzaW5nQ2FsbGJhY2tzLnB1c2hfYmFjayhDKTsKKyAgfQorCisgIC8vLyB7e0AgUmVnaXN0ZXIgY2FsbGJhY2tzIGZvciBhbmFseXNpcyByZWdpc3RyYXRpb24gd2l0aCB0aGlzIFBhc3NCdWlsZGVyCisgIC8vLyBpbnN0YW5jZS4KKyAgLy8vIENhbGxlZXMgcmVnaXN0ZXIgdGhlaXIgYW5hbHlzZXMgd2l0aCB0aGUgZ2l2ZW4gQW5hbHlzaXNNYW5hZ2VyIG9iamVjdHMuCisgIHZvaWQgcmVnaXN0ZXJBbmFseXNpc1JlZ2lzdHJhdGlvbkNhbGxiYWNrKAorICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKENHU0NDQW5hbHlzaXNNYW5hZ2VyICYpPiAmQykgeworICAgIENHU0NDQW5hbHlzaXNSZWdpc3RyYXRpb25DYWxsYmFja3MucHVzaF9iYWNrKEMpOworICB9CisgIHZvaWQgcmVnaXN0ZXJBbmFseXNpc1JlZ2lzdHJhdGlvbkNhbGxiYWNrKAorICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICYpPiAmQykgeworICAgIEZ1bmN0aW9uQW5hbHlzaXNSZWdpc3RyYXRpb25DYWxsYmFja3MucHVzaF9iYWNrKEMpOworICB9CisgIHZvaWQgcmVnaXN0ZXJBbmFseXNpc1JlZ2lzdHJhdGlvbkNhbGxiYWNrKAorICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKExvb3BBbmFseXNpc01hbmFnZXIgJik+ICZDKSB7CisgICAgTG9vcEFuYWx5c2lzUmVnaXN0cmF0aW9uQ2FsbGJhY2tzLnB1c2hfYmFjayhDKTsKKyAgfQorICB2b2lkIHJlZ2lzdGVyQW5hbHlzaXNSZWdpc3RyYXRpb25DYWxsYmFjaygKKyAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChNb2R1bGVBbmFseXNpc01hbmFnZXIgJik+ICZDKSB7CisgICAgTW9kdWxlQW5hbHlzaXNSZWdpc3RyYXRpb25DYWxsYmFja3MucHVzaF9iYWNrKEMpOworICB9CisgIC8vLyBAfX0KKworICAvLy8ge3tAIFJlZ2lzdGVyIHBpcGVsaW5lIHBhcnNpbmcgY2FsbGJhY2tzIHdpdGggdGhpcyBwYXNzIGJ1aWxkZXIgaW5zdGFuY2UuCisgIC8vLyBVc2luZyB0aGVzZSBjYWxsYmFja3MsIGNhbGxlcnMgY2FuIHBhcnNlIGJvdGggYSBzaW5nbGUgcGFzcyBuYW1lLCBhcyB3ZWxsCisgIC8vLyBhcyBlbnRpcmUgc3ViLXBpcGVsaW5lcywgYW5kIHBvcHVsYXRlIHRoZSBQYXNzTWFuYWdlciBpbnN0YW5jZQorICAvLy8gYWNjb3JkaW5nbHkuCisgIHZvaWQgcmVnaXN0ZXJQaXBlbGluZVBhcnNpbmdDYWxsYmFjaygKKyAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248Ym9vbChTdHJpbmdSZWYgTmFtZSwgQ0dTQ0NQYXNzTWFuYWdlciAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBpcGVsaW5lRWxlbWVudD4pPiAmQykgeworICAgIENHU0NDUGlwZWxpbmVQYXJzaW5nQ2FsbGJhY2tzLnB1c2hfYmFjayhDKTsKKyAgfQorICB2b2lkIHJlZ2lzdGVyUGlwZWxpbmVQYXJzaW5nQ2FsbGJhY2soCisgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPGJvb2woU3RyaW5nUmVmIE5hbWUsIEZ1bmN0aW9uUGFzc01hbmFnZXIgJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQaXBlbGluZUVsZW1lbnQ+KT4gJkMpIHsKKyAgICBGdW5jdGlvblBpcGVsaW5lUGFyc2luZ0NhbGxiYWNrcy5wdXNoX2JhY2soQyk7CisgIH0KKyAgdm9pZCByZWdpc3RlclBpcGVsaW5lUGFyc2luZ0NhbGxiYWNrKAorICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjxib29sKFN0cmluZ1JlZiBOYW1lLCBMb29wUGFzc01hbmFnZXIgJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQaXBlbGluZUVsZW1lbnQ+KT4gJkMpIHsKKyAgICBMb29wUGlwZWxpbmVQYXJzaW5nQ2FsbGJhY2tzLnB1c2hfYmFjayhDKTsKKyAgfQorICB2b2lkIHJlZ2lzdGVyUGlwZWxpbmVQYXJzaW5nQ2FsbGJhY2soCisgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPGJvb2woU3RyaW5nUmVmIE5hbWUsIE1vZHVsZVBhc3NNYW5hZ2VyICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGlwZWxpbmVFbGVtZW50Pik+ICZDKSB7CisgICAgTW9kdWxlUGlwZWxpbmVQYXJzaW5nQ2FsbGJhY2tzLnB1c2hfYmFjayhDKTsKKyAgfQorICAvLy8gQH19CisKKyAgLy8vIFxicmllZiBSZWdpc3RlciBhIGNhbGxiYWNrIGZvciBhIHRvcC1sZXZlbCBwaXBlbGluZSBlbnRyeS4KKyAgLy8vCisgIC8vLyBJZiB0aGUgUGFzc01hbmFnZXIgdHlwZSBpcyBub3QgZ2l2ZW4gYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgcGlwZWxpbmUKKyAgLy8vIHRleHQsIHRoaXMgQ2FsbGJhY2sgc2hvdWxkIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBzdGFjayBvZgorICAvLy8gUGFzc01hbmFnZXJzIGFuZCBwb3B1bGF0ZSB0aGUgcGFzc2VkIE1vZHVsZVBhc3NNYW5hZ2VyLgorICB2b2lkIHJlZ2lzdGVyUGFyc2VUb3BMZXZlbFBpcGVsaW5lQ2FsbGJhY2soCisgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPGJvb2woTW9kdWxlUGFzc01hbmFnZXIgJiwgQXJyYXlSZWY8UGlwZWxpbmVFbGVtZW50PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFZlcmlmeUVhY2hQYXNzLCBib29sIERlYnVnTG9nZ2luZyk+ICZDKSB7CisgICAgVG9wTGV2ZWxQaXBlbGluZVBhcnNpbmdDYWxsYmFja3MucHVzaF9iYWNrKEMpOworICB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyBPcHRpb25hbDxzdGQ6OnZlY3RvcjxQaXBlbGluZUVsZW1lbnQ+PgorICBwYXJzZVBpcGVsaW5lVGV4dChTdHJpbmdSZWYgVGV4dCk7CisKKyAgYm9vbCBwYXJzZU1vZHVsZVBhc3MoTW9kdWxlUGFzc01hbmFnZXIgJk1QTSwgY29uc3QgUGlwZWxpbmVFbGVtZW50ICZFLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIFZlcmlmeUVhY2hQYXNzLCBib29sIERlYnVnTG9nZ2luZyk7CisgIGJvb2wgcGFyc2VDR1NDQ1Bhc3MoQ0dTQ0NQYXNzTWFuYWdlciAmQ0dQTSwgY29uc3QgUGlwZWxpbmVFbGVtZW50ICZFLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVmVyaWZ5RWFjaFBhc3MsIGJvb2wgRGVidWdMb2dnaW5nKTsKKyAgYm9vbCBwYXJzZUZ1bmN0aW9uUGFzcyhGdW5jdGlvblBhc3NNYW5hZ2VyICZGUE0sIGNvbnN0IFBpcGVsaW5lRWxlbWVudCAmRSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgVmVyaWZ5RWFjaFBhc3MsIGJvb2wgRGVidWdMb2dnaW5nKTsKKyAgYm9vbCBwYXJzZUxvb3BQYXNzKExvb3BQYXNzTWFuYWdlciAmTFBNLCBjb25zdCBQaXBlbGluZUVsZW1lbnQgJkUsCisgICAgICAgICAgICAgICAgICAgICBib29sIFZlcmlmeUVhY2hQYXNzLCBib29sIERlYnVnTG9nZ2luZyk7CisgIGJvb2wgcGFyc2VBQVBhc3NOYW1lKEFBTWFuYWdlciAmQUEsIFN0cmluZ1JlZiBOYW1lKTsKKworICBib29sIHBhcnNlTG9vcFBhc3NQaXBlbGluZShMb29wUGFzc01hbmFnZXIgJkxQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGlwZWxpbmVFbGVtZW50PiBQaXBlbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWZXJpZnlFYWNoUGFzcywgYm9vbCBEZWJ1Z0xvZ2dpbmcpOworICBib29sIHBhcnNlRnVuY3Rpb25QYXNzUGlwZWxpbmUoRnVuY3Rpb25QYXNzTWFuYWdlciAmRlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGlwZWxpbmVFbGVtZW50PiBQaXBlbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVmVyaWZ5RWFjaFBhc3MsIGJvb2wgRGVidWdMb2dnaW5nKTsKKyAgYm9vbCBwYXJzZUNHU0NDUGFzc1BpcGVsaW5lKENHU0NDUGFzc01hbmFnZXIgJkNHUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQaXBlbGluZUVsZW1lbnQ+IFBpcGVsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWZXJpZnlFYWNoUGFzcywgYm9vbCBEZWJ1Z0xvZ2dpbmcpOworICBib29sIHBhcnNlTW9kdWxlUGFzc1BpcGVsaW5lKE1vZHVsZVBhc3NNYW5hZ2VyICZNUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGlwZWxpbmVFbGVtZW50PiBQaXBlbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFZlcmlmeUVhY2hQYXNzLCBib29sIERlYnVnTG9nZ2luZyk7CisKKyAgdm9pZCBhZGRQR09JbnN0clBhc3NlcyhNb2R1bGVQYXNzTWFuYWdlciAmTVBNLCBib29sIERlYnVnTG9nZ2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpbWl6YXRpb25MZXZlbCBMZXZlbCwgYm9vbCBSdW5Qcm9maWxlR2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIFByb2ZpbGVHZW5GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIFByb2ZpbGVVc2VGaWxlKTsKKworICB2b2lkIGludm9rZVBlZXBob2xlRVBDYWxsYmFja3MoRnVuY3Rpb25QYXNzTWFuYWdlciAmLCBPcHRpbWl6YXRpb25MZXZlbCk7CisKKyAgLy8gRXh0ZW5zaW9uIFBvaW50IGNhbGxiYWNrcworICBTbWFsbFZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoRnVuY3Rpb25QYXNzTWFuYWdlciAmLCBPcHRpbWl6YXRpb25MZXZlbCk+LCAyPgorICAgICAgUGVlcGhvbGVFUENhbGxiYWNrczsKKyAgU21hbGxWZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKExvb3BQYXNzTWFuYWdlciAmLCBPcHRpbWl6YXRpb25MZXZlbCk+LCAyPgorICAgICAgTGF0ZUxvb3BPcHRpbWl6YXRpb25zRVBDYWxsYmFja3M7CisgIFNtYWxsVmVjdG9yPHN0ZDo6ZnVuY3Rpb248dm9pZChMb29wUGFzc01hbmFnZXIgJiwgT3B0aW1pemF0aW9uTGV2ZWwpPiwgMj4KKyAgICAgIExvb3BPcHRpbWl6ZXJFbmRFUENhbGxiYWNrczsKKyAgU21hbGxWZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKEZ1bmN0aW9uUGFzc01hbmFnZXIgJiwgT3B0aW1pemF0aW9uTGV2ZWwpPiwgMj4KKyAgICAgIFNjYWxhck9wdGltaXplckxhdGVFUENhbGxiYWNrczsKKyAgU21hbGxWZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKENHU0NDUGFzc01hbmFnZXIgJiwgT3B0aW1pemF0aW9uTGV2ZWwpPiwgMj4KKyAgICAgIENHU0NDT3B0aW1pemVyTGF0ZUVQQ2FsbGJhY2tzOworICBTbWFsbFZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoRnVuY3Rpb25QYXNzTWFuYWdlciAmLCBPcHRpbWl6YXRpb25MZXZlbCk+LCAyPgorICAgICAgVmVjdG9yaXplclN0YXJ0RVBDYWxsYmFja3M7CisgIC8vIE1vZHVsZSBjYWxsYmFja3MKKyAgU21hbGxWZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKE1vZHVsZVBhc3NNYW5hZ2VyICYpPiwgMj4KKyAgICAgIFBpcGVsaW5lU3RhcnRFUENhbGxiYWNrczsKKyAgU21hbGxWZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmKT4sIDI+CisgICAgICBNb2R1bGVBbmFseXNpc1JlZ2lzdHJhdGlvbkNhbGxiYWNrczsKKyAgU21hbGxWZWN0b3I8c3RkOjpmdW5jdGlvbjxib29sKFN0cmluZ1JlZiwgTW9kdWxlUGFzc01hbmFnZXIgJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBpcGVsaW5lRWxlbWVudD4pPiwKKyAgICAgICAgICAgICAgMj4KKyAgICAgIE1vZHVsZVBpcGVsaW5lUGFyc2luZ0NhbGxiYWNrczsKKyAgU21hbGxWZWN0b3I8c3RkOjpmdW5jdGlvbjxib29sKE1vZHVsZVBhc3NNYW5hZ2VyICYsIEFycmF5UmVmPFBpcGVsaW5lRWxlbWVudD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFZlcmlmeUVhY2hQYXNzLCBib29sIERlYnVnTG9nZ2luZyk+LAorICAgICAgICAgICAgICAyPgorICAgICAgVG9wTGV2ZWxQaXBlbGluZVBhcnNpbmdDYWxsYmFja3M7CisgIC8vIENHU0NDIGNhbGxiYWNrcworICBTbWFsbFZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoQ0dTQ0NBbmFseXNpc01hbmFnZXIgJik+LCAyPgorICAgICAgQ0dTQ0NBbmFseXNpc1JlZ2lzdHJhdGlvbkNhbGxiYWNrczsKKyAgU21hbGxWZWN0b3I8c3RkOjpmdW5jdGlvbjxib29sKFN0cmluZ1JlZiwgQ0dTQ0NQYXNzTWFuYWdlciAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGlwZWxpbmVFbGVtZW50Pik+LAorICAgICAgICAgICAgICAyPgorICAgICAgQ0dTQ0NQaXBlbGluZVBhcnNpbmdDYWxsYmFja3M7CisgIC8vIEZ1bmN0aW9uIGNhbGxiYWNrcworICBTbWFsbFZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJik+LCAyPgorICAgICAgRnVuY3Rpb25BbmFseXNpc1JlZ2lzdHJhdGlvbkNhbGxiYWNrczsKKyAgU21hbGxWZWN0b3I8c3RkOjpmdW5jdGlvbjxib29sKFN0cmluZ1JlZiwgRnVuY3Rpb25QYXNzTWFuYWdlciAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGlwZWxpbmVFbGVtZW50Pik+LAorICAgICAgICAgICAgICAyPgorICAgICAgRnVuY3Rpb25QaXBlbGluZVBhcnNpbmdDYWxsYmFja3M7CisgIC8vIExvb3AgY2FsbGJhY2tzCisgIFNtYWxsVmVjdG9yPHN0ZDo6ZnVuY3Rpb248dm9pZChMb29wQW5hbHlzaXNNYW5hZ2VyICYpPiwgMj4KKyAgICAgIExvb3BBbmFseXNpc1JlZ2lzdHJhdGlvbkNhbGxiYWNrczsKKyAgU21hbGxWZWN0b3I8c3RkOjpmdW5jdGlvbjxib29sKFN0cmluZ1JlZiwgTG9vcFBhc3NNYW5hZ2VyICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQaXBlbGluZUVsZW1lbnQ+KT4sCisgICAgICAgICAgICAgIDI+CisgICAgICBMb29wUGlwZWxpbmVQYXJzaW5nQ2FsbGJhY2tzOworICAvLyBBQSBjYWxsYmFja3MKKyAgU21hbGxWZWN0b3I8c3RkOjpmdW5jdGlvbjxib29sKFN0cmluZ1JlZiBOYW1lLCBBQU1hbmFnZXIgJkFBKT4sIDI+CisgICAgICBBQVBhcnNpbmdDYWxsYmFja3M7Cit9OworCisvLy8gVGhpcyB1dGlsaXR5IHRlbXBsYXRlIHRha2VzIGNhcmUgb2YgYWRkaW5nIHJlcXVpcmU8PiBhbmQgaW52YWxpZGF0ZTw+CisvLy8gcGFzc2VzIGZvciBhbiBhbmFseXNpcyB0byBhIGdpdmVuIFxjIFBhc3NNYW5hZ2VyLiBJdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkCisvLy8gZHVyaW5nIHBhcnNpbmcgb2YgYSBwYXNzIHBpcGVsaW5lIHdoZW4gcGFyc2luZyBhIHNpbmdsZSBQaXBlbGluZU5hbWUuCisvLy8gV2hlbiByZWdpc3RlcmluZyBhIG5ldyBmdW5jdGlvbiBhbmFseXNpcyBGYW5jeUFuYWx5c2lzIHdpdGggdGhlIHBhc3MKKy8vLyBwaXBlbGluZSBuYW1lICJmYW5jeS1hbmFseXNpcyIsIGEgbWF0Y2hpbmcgUGFyc2VQaXBlbGluZUNhbGxiYWNrIGNvdWxkIGxvb2sKKy8vLyBsaWtlIHRoaXM6CisvLy8KKy8vLyBzdGF0aWMgYm9vbCBwYXJzZUZ1bmN0aW9uUGlwZWxpbmUoU3RyaW5nUmVmIE5hbWUsIEZ1bmN0aW9uUGFzc01hbmFnZXIgJkZQTSwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGlwZWxpbmVFbGVtZW50PiBQKSB7CisvLy8gICBpZiAocGFyc2VBbmFseXNpc1V0aWxpdHlQYXNzZXM8RmFuY3lBbmFseXNpcz4oImZhbmN5LWFuYWx5c2lzIiwgTmFtZSwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUE0pKQorLy8vICAgICByZXR1cm4gdHJ1ZTsKKy8vLyAgIHJldHVybiBmYWxzZTsKKy8vLyB9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQW5hbHlzaXNULCB0eXBlbmFtZSBJUlVuaXRULCB0eXBlbmFtZSBBbmFseXNpc01hbmFnZXJULAorICAgICAgICAgIHR5cGVuYW1lLi4uIEV4dHJhQXJnVHM+Citib29sIHBhcnNlQW5hbHlzaXNVdGlsaXR5UGFzc2VzKAorICAgIFN0cmluZ1JlZiBBbmFseXNpc05hbWUsIFN0cmluZ1JlZiBQaXBlbGluZU5hbWUsCisgICAgUGFzc01hbmFnZXI8SVJVbml0VCwgQW5hbHlzaXNNYW5hZ2VyVCwgRXh0cmFBcmdUcy4uLj4gJlBNKSB7CisgIGlmICghUGlwZWxpbmVOYW1lLmVuZHN3aXRoKCI+IikpCisgICAgcmV0dXJuIGZhbHNlOworICAvLyBTZWUgaWYgdGhpcyBpcyBhbiBpbnZhbGlkYXRlPD4gcGFzcyBuYW1lCisgIGlmIChQaXBlbGluZU5hbWUuc3RhcnRzd2l0aCgiaW52YWxpZGF0ZTwiKSkgeworICAgIFBpcGVsaW5lTmFtZSA9IFBpcGVsaW5lTmFtZS5zdWJzdHIoMTEsIFBpcGVsaW5lTmFtZS5zaXplKCkgLSAxMik7CisgICAgaWYgKFBpcGVsaW5lTmFtZSAhPSBBbmFseXNpc05hbWUpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgUE0uYWRkUGFzcyhJbnZhbGlkYXRlQW5hbHlzaXNQYXNzPEFuYWx5c2lzVD4oKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBTZWUgaWYgdGhpcyBpcyBhIHJlcXVpcmU8PiBwYXNzIG5hbWUKKyAgaWYgKFBpcGVsaW5lTmFtZS5zdGFydHN3aXRoKCJyZXF1aXJlPCIpKSB7CisgICAgUGlwZWxpbmVOYW1lID0gUGlwZWxpbmVOYW1lLnN1YnN0cig4LCBQaXBlbGluZU5hbWUuc2l6ZSgpIC0gOSk7CisgICAgaWYgKFBpcGVsaW5lTmFtZSAhPSBBbmFseXNpc05hbWUpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgUE0uYWRkUGFzcyhSZXF1aXJlQW5hbHlzaXNQYXNzPEFuYWx5c2lzVCwgSVJVbml0VCwgQW5hbHlzaXNNYW5hZ2VyVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFBcmdUcy4uLj4oKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9Db3ZlcmFnZS9Db3ZlcmFnZU1hcHBpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvQ292ZXJhZ2UvQ292ZXJhZ2VNYXBwaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE0MDk4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvQ292ZXJhZ2UvQ292ZXJhZ2VNYXBwaW5nLmgKQEAgLTAsMCArMSw4MzEgQEAKKy8vPT09LSBDb3ZlcmFnZU1hcHBpbmcuaCAtIENvZGUgY292ZXJhZ2UgbWFwcGluZyBzdXBwb3J0IC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ29kZSBjb3ZlcmFnZSBtYXBwaW5nIGRhdGEgaXMgZ2VuZXJhdGVkIGJ5IGNsYW5nIGFuZCByZWFkIGJ5CisvLyBsbHZtLWNvdiB0byBzaG93IGNvZGUgY292ZXJhZ2Ugc3RhdGlzdGljcyBmb3IgYSBmaWxlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9QUk9GSUxFREFUQV9DT1ZFUkFHRV9DT1ZFUkFHRU1BUFBJTkdfSAorI2RlZmluZSBMTFZNX1BST0ZJTEVEQVRBX0NPVkVSQUdFX0NPVkVSQUdFTUFQUElOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSGFzaGluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2YuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEluZGV4ZWRJbnN0clByb2ZSZWFkZXI7CisKK25hbWVzcGFjZSBjb3ZlcmFnZSB7CisKK2NsYXNzIENvdmVyYWdlTWFwcGluZ1JlYWRlcjsKK3N0cnVjdCBDb3ZlcmFnZU1hcHBpbmdSZWNvcmQ7CisKK2VudW0gY2xhc3MgY292ZXJhZ2VtYXBfZXJyb3IgeworICBzdWNjZXNzID0gMCwKKyAgZW9mLAorICBub19kYXRhX2ZvdW5kLAorICB1bnN1cHBvcnRlZF92ZXJzaW9uLAorICB0cnVuY2F0ZWQsCisgIG1hbGZvcm1lZAorfTsKKworY29uc3Qgc3RkOjplcnJvcl9jYXRlZ29yeSAmY292ZXJhZ2VtYXBfY2F0ZWdvcnkoKTsKKworaW5saW5lIHN0ZDo6ZXJyb3JfY29kZSBtYWtlX2Vycm9yX2NvZGUoY292ZXJhZ2VtYXBfZXJyb3IgRSkgeworICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKHN0YXRpY19jYXN0PGludD4oRSksIGNvdmVyYWdlbWFwX2NhdGVnb3J5KCkpOworfQorCitjbGFzcyBDb3ZlcmFnZU1hcEVycm9yIDogcHVibGljIEVycm9ySW5mbzxDb3ZlcmFnZU1hcEVycm9yPiB7CitwdWJsaWM6CisgIENvdmVyYWdlTWFwRXJyb3IoY292ZXJhZ2VtYXBfZXJyb3IgRXJyKSA6IEVycihFcnIpIHsKKyAgICBhc3NlcnQoRXJyICE9IGNvdmVyYWdlbWFwX2Vycm9yOjpzdWNjZXNzICYmICJOb3QgYW4gZXJyb3IiKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIG1lc3NhZ2UoKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsgT1MgPDwgbWVzc2FnZSgpOyB9CisKKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbWFrZV9lcnJvcl9jb2RlKEVycik7CisgIH0KKworICBjb3ZlcmFnZW1hcF9lcnJvciBnZXQoKSBjb25zdCB7IHJldHVybiBFcnI7IH0KKworICBzdGF0aWMgY2hhciBJRDsKKworcHJpdmF0ZToKKyAgY292ZXJhZ2VtYXBfZXJyb3IgRXJyOworfTsKKworLy8vIEEgQ291bnRlciBpcyBhbiBhYnN0cmFjdCB2YWx1ZSB0aGF0IGRlc2NyaWJlcyBob3cgdG8gY29tcHV0ZSB0aGUKKy8vLyBleGVjdXRpb24gY291bnQgZm9yIGEgcmVnaW9uIG9mIGNvZGUgdXNpbmcgdGhlIGNvbGxlY3RlZCBwcm9maWxlIGNvdW50IGRhdGEuCitzdHJ1Y3QgQ291bnRlciB7CisgIGVudW0gQ291bnRlcktpbmQgeyBaZXJvLCBDb3VudGVyVmFsdWVSZWZlcmVuY2UsIEV4cHJlc3Npb24gfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEVuY29kaW5nVGFnQml0cyA9IDI7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBFbmNvZGluZ1RhZ01hc2sgPSAweDM7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBFbmNvZGluZ0NvdW50ZXJUYWdBbmRFeHBhbnNpb25SZWdpb25UYWdCaXRzID0KKyAgICAgIEVuY29kaW5nVGFnQml0cyArIDE7CisKK3ByaXZhdGU6CisgIENvdW50ZXJLaW5kIEtpbmQgPSBaZXJvOworICB1bnNpZ25lZCBJRCA9IDA7CisKKyAgQ291bnRlcihDb3VudGVyS2luZCBLaW5kLCB1bnNpZ25lZCBJRCkgOiBLaW5kKEtpbmQpLCBJRChJRCkge30KKworcHVibGljOgorICBDb3VudGVyKCkgPSBkZWZhdWx0OworCisgIENvdW50ZXJLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgYm9vbCBpc1plcm8oKSBjb25zdCB7IHJldHVybiBLaW5kID09IFplcm87IH0KKworICBib29sIGlzRXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gRXhwcmVzc2lvbjsgfQorCisgIHVuc2lnbmVkIGdldENvdW50ZXJJRCgpIGNvbnN0IHsgcmV0dXJuIElEOyB9CisKKyAgdW5zaWduZWQgZ2V0RXhwcmVzc2lvbklEKCkgY29uc3QgeyByZXR1cm4gSUQ7IH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENvdW50ZXIgJkxIUywgY29uc3QgQ291bnRlciAmUkhTKSB7CisgICAgcmV0dXJuIExIUy5LaW5kID09IFJIUy5LaW5kICYmIExIUy5JRCA9PSBSSFMuSUQ7CisgIH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENvdW50ZXIgJkxIUywgY29uc3QgQ291bnRlciAmUkhTKSB7CisgICAgcmV0dXJuICEoTEhTID09IFJIUyk7CisgIH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoY29uc3QgQ291bnRlciAmTEhTLCBjb25zdCBDb3VudGVyICZSSFMpIHsKKyAgICByZXR1cm4gc3RkOjp0aWUoTEhTLktpbmQsIExIUy5JRCkgPCBzdGQ6OnRpZShSSFMuS2luZCwgUkhTLklEKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGNvdW50ZXIgdGhhdCByZXByZXNlbnRzIHRoZSBudW1iZXIgemVyby4KKyAgc3RhdGljIENvdW50ZXIgZ2V0WmVybygpIHsgcmV0dXJuIENvdW50ZXIoKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIGNvdW50ZXIgdGhhdCBjb3JyZXNwb25kcyB0byBhIHNwZWNpZmljIHByb2ZpbGUgY291bnRlci4KKyAgc3RhdGljIENvdW50ZXIgZ2V0Q291bnRlcih1bnNpZ25lZCBDb3VudGVySWQpIHsKKyAgICByZXR1cm4gQ291bnRlcihDb3VudGVyVmFsdWVSZWZlcmVuY2UsIENvdW50ZXJJZCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBjb3VudGVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBzcGVjaWZpYyBhZGRpdGlvbiBjb3VudGVyCisgIC8vLyBleHByZXNzaW9uLgorICBzdGF0aWMgQ291bnRlciBnZXRFeHByZXNzaW9uKHVuc2lnbmVkIEV4cHJlc3Npb25JZCkgeworICAgIHJldHVybiBDb3VudGVyKEV4cHJlc3Npb24sIEV4cHJlc3Npb25JZCk7CisgIH0KK307CisKKy8vLyBBIENvdW50ZXIgZXhwcmVzc2lvbiBpcyBhIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBhbiBhcml0aG1ldGljIG9wZXJhdGlvbgorLy8vIHdpdGggdHdvIGNvdW50ZXJzLgorc3RydWN0IENvdW50ZXJFeHByZXNzaW9uIHsKKyAgZW51bSBFeHByS2luZCB7IFN1YnRyYWN0LCBBZGQgfTsKKyAgRXhwcktpbmQgS2luZDsKKyAgQ291bnRlciBMSFMsIFJIUzsKKworICBDb3VudGVyRXhwcmVzc2lvbihFeHByS2luZCBLaW5kLCBDb3VudGVyIExIUywgQ291bnRlciBSSFMpCisgICAgICA6IEtpbmQoS2luZCksIExIUyhMSFMpLCBSSFMoUkhTKSB7fQorfTsKKworLy8vIEEgQ291bnRlciBleHByZXNzaW9uIGJ1aWxkZXIgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIGNvdW50ZXIgZXhwcmVzc2lvbnMuCisvLy8gSXQgYXZvaWRzIHVubmVjZXNzYXJ5IGR1cGxpY2F0aW9uIGFuZCBzaW1wbGlmaWVzIGFsZ2VicmFpYyBleHByZXNzaW9ucy4KK2NsYXNzIENvdW50ZXJFeHByZXNzaW9uQnVpbGRlciB7CisgIC8vLyBBIGxpc3Qgb2YgYWxsIHRoZSBjb3VudGVyIGV4cHJlc3Npb25zCisgIHN0ZDo6dmVjdG9yPENvdW50ZXJFeHByZXNzaW9uPiBFeHByZXNzaW9uczsKKworICAvLy8gQSBsb29rdXAgdGFibGUgZm9yIHRoZSBpbmRleCBvZiBhIGdpdmVuIGV4cHJlc3Npb24uCisgIERlbnNlTWFwPENvdW50ZXJFeHByZXNzaW9uLCB1bnNpZ25lZD4gRXhwcmVzc2lvbkluZGljZXM7CisKKyAgLy8vIFJldHVybiB0aGUgY291bnRlciB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4KKyAgLy8vCisgIC8vLyBJZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBpcyBhbHJlYWR5IHN0b3JlZCBpbiB0aGUgYnVpbGRlciwgYSBjb3VudGVyCisgIC8vLyB0aGF0IHJlZmVyZW5jZXMgdGhhdCBleHByZXNzaW9uIGlzIHJldHVybmVkLiBPdGhlcndpc2UsIHRoZSBnaXZlbgorICAvLy8gZXhwcmVzc2lvbiBpcyBhZGRlZCB0byB0aGUgYnVpbGRlcidzIGNvbGxlY3Rpb24gb2YgZXhwcmVzc2lvbnMuCisgIENvdW50ZXIgZ2V0KGNvbnN0IENvdW50ZXJFeHByZXNzaW9uICZFKTsKKworICAvLy8gUmVwcmVzZW50cyBhIHRlcm0gaW4gYSBjb3VudGVyIGV4cHJlc3Npb24gdHJlZS4KKyAgc3RydWN0IFRlcm0geworICAgIHVuc2lnbmVkIENvdW50ZXJJRDsKKyAgICBpbnQgRmFjdG9yOworCisgICAgVGVybSh1bnNpZ25lZCBDb3VudGVySUQsIGludCBGYWN0b3IpCisgICAgICAgIDogQ291bnRlcklEKENvdW50ZXJJRCksIEZhY3RvcihGYWN0b3IpIHt9CisgIH07CisKKyAgLy8vIEdhdGhlciB0aGUgdGVybXMgb2YgdGhlIGV4cHJlc3Npb24gdHJlZSBmb3IgcHJvY2Vzc2luZy4KKyAgLy8vCisgIC8vLyBUaGlzIGNvbGxlY3RzIGVhY2ggYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uIHJlZmVyZW5jZWQgYnkgdGhlIGNvdW50ZXIgaW50bworICAvLy8gYSBzZXF1ZW5jZSB0aGF0IGNhbiBiZSBzb3J0ZWQgYW5kIGNvbWJpbmVkIHRvIGJ1aWxkIGEgc2ltcGxpZmllZCBjb3VudGVyCisgIC8vLyBleHByZXNzaW9uLgorICB2b2lkIGV4dHJhY3RUZXJtcyhDb3VudGVyIEMsIGludCBTaWduLCBTbWFsbFZlY3RvckltcGw8VGVybT4gJlRlcm1zKTsKKworICAvLy8gU2ltcGxpZmllcyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiB0cmVlCisgIC8vLyBieSBnZXR0aW5nIHJpZCBvZiBhbGdlYnJhaWNhbGx5IHJlZHVuZGFudCBvcGVyYXRpb25zLgorICBDb3VudGVyIHNpbXBsaWZ5KENvdW50ZXIgRXhwcmVzc2lvblRyZWUpOworCitwdWJsaWM6CisgIEFycmF5UmVmPENvdW50ZXJFeHByZXNzaW9uPiBnZXRFeHByZXNzaW9ucygpIGNvbnN0IHsgcmV0dXJuIEV4cHJlc3Npb25zOyB9CisKKyAgLy8vIFJldHVybiBhIGNvdW50ZXIgdGhhdCByZXByZXNlbnRzIHRoZSBleHByZXNzaW9uIHRoYXQgYWRkcyBMSFMgYW5kIFJIUy4KKyAgQ291bnRlciBhZGQoQ291bnRlciBMSFMsIENvdW50ZXIgUkhTKTsKKworICAvLy8gUmV0dXJuIGEgY291bnRlciB0aGF0IHJlcHJlc2VudHMgdGhlIGV4cHJlc3Npb24gdGhhdCBzdWJ0cmFjdHMgUkhTIGZyb20KKyAgLy8vIExIUy4KKyAgQ291bnRlciBzdWJ0cmFjdChDb3VudGVyIExIUywgQ291bnRlciBSSFMpOworfTsKKwordXNpbmcgTGluZUNvbFBhaXIgPSBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPjsKKworLy8vIEEgQ291bnRlciBtYXBwaW5nIHJlZ2lvbiBhc3NvY2lhdGVzIGEgc291cmNlIHJhbmdlIHdpdGggYSBzcGVjaWZpYyBjb3VudGVyLgorc3RydWN0IENvdW50ZXJNYXBwaW5nUmVnaW9uIHsKKyAgZW51bSBSZWdpb25LaW5kIHsKKyAgICAvLy8gQSBDb2RlUmVnaW9uIGFzc29jaWF0ZXMgc29tZSBjb2RlIHdpdGggYSBjb3VudGVyCisgICAgQ29kZVJlZ2lvbiwKKworICAgIC8vLyBBbiBFeHBhbnNpb25SZWdpb24gcmVwcmVzZW50cyBhIGZpbGUgZXhwYW5zaW9uIHJlZ2lvbiB0aGF0IGFzc29jaWF0ZXMgCisgICAgLy8vIGEgc291cmNlIHJhbmdlIHdpdGggdGhlIGV4cGFuc2lvbiBvZiBhIHZpcnR1YWwgc291cmNlIGZpbGUsIHN1Y2ggYXMKKyAgICAvLy8gZm9yIGEgbWFjcm8gaW5zdGFudGlhdGlvbiBvciAjaW5jbHVkZSBmaWxlLgorICAgIEV4cGFuc2lvblJlZ2lvbiwKKworICAgIC8vLyBBIFNraXBwZWRSZWdpb24gcmVwcmVzZW50cyBhIHNvdXJjZSByYW5nZSB3aXRoIGNvZGUgdGhhdCB3YXMgc2tpcHBlZAorICAgIC8vLyBieSBhIHByZXByb2Nlc3NvciBvciBzaW1pbGFyIG1lYW5zLgorICAgIFNraXBwZWRSZWdpb24sCisKKyAgICAvLy8gQSBHYXBSZWdpb24gaXMgbGlrZSBhIENvZGVSZWdpb24sIGJ1dCBpdHMgY291bnQgaXMgb25seSBzZXQgYXMgdGhlCisgICAgLy8vIGxpbmUgZXhlY3V0aW9uIGNvdW50IHdoZW4gaXRzIHRoZSBvbmx5IHJlZ2lvbiBpbiB0aGUgbGluZS4KKyAgICBHYXBSZWdpb24KKyAgfTsKKworICBDb3VudGVyIENvdW50OworICB1bnNpZ25lZCBGaWxlSUQsIEV4cGFuZGVkRmlsZUlEOworICB1bnNpZ25lZCBMaW5lU3RhcnQsIENvbHVtblN0YXJ0LCBMaW5lRW5kLCBDb2x1bW5FbmQ7CisgIFJlZ2lvbktpbmQgS2luZDsKKworICBDb3VudGVyTWFwcGluZ1JlZ2lvbihDb3VudGVyIENvdW50LCB1bnNpZ25lZCBGaWxlSUQsIHVuc2lnbmVkIEV4cGFuZGVkRmlsZUlELAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lU3RhcnQsIHVuc2lnbmVkIENvbHVtblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lRW5kLCB1bnNpZ25lZCBDb2x1bW5FbmQsIFJlZ2lvbktpbmQgS2luZCkKKyAgICAgIDogQ291bnQoQ291bnQpLCBGaWxlSUQoRmlsZUlEKSwgRXhwYW5kZWRGaWxlSUQoRXhwYW5kZWRGaWxlSUQpLAorICAgICAgICBMaW5lU3RhcnQoTGluZVN0YXJ0KSwgQ29sdW1uU3RhcnQoQ29sdW1uU3RhcnQpLCBMaW5lRW5kKExpbmVFbmQpLAorICAgICAgICBDb2x1bW5FbmQoQ29sdW1uRW5kKSwgS2luZChLaW5kKSB7fQorCisgIHN0YXRpYyBDb3VudGVyTWFwcGluZ1JlZ2lvbgorICBtYWtlUmVnaW9uKENvdW50ZXIgQ291bnQsIHVuc2lnbmVkIEZpbGVJRCwgdW5zaWduZWQgTGluZVN0YXJ0LAorICAgICAgICAgICAgIHVuc2lnbmVkIENvbHVtblN0YXJ0LCB1bnNpZ25lZCBMaW5lRW5kLCB1bnNpZ25lZCBDb2x1bW5FbmQpIHsKKyAgICByZXR1cm4gQ291bnRlck1hcHBpbmdSZWdpb24oQ291bnQsIEZpbGVJRCwgMCwgTGluZVN0YXJ0LCBDb2x1bW5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUVuZCwgQ29sdW1uRW5kLCBDb2RlUmVnaW9uKTsKKyAgfQorCisgIHN0YXRpYyBDb3VudGVyTWFwcGluZ1JlZ2lvbgorICBtYWtlRXhwYW5zaW9uKHVuc2lnbmVkIEZpbGVJRCwgdW5zaWduZWQgRXhwYW5kZWRGaWxlSUQsIHVuc2lnbmVkIExpbmVTdGFydCwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2x1bW5TdGFydCwgdW5zaWduZWQgTGluZUVuZCwgdW5zaWduZWQgQ29sdW1uRW5kKSB7CisgICAgcmV0dXJuIENvdW50ZXJNYXBwaW5nUmVnaW9uKENvdW50ZXIoKSwgRmlsZUlELCBFeHBhbmRlZEZpbGVJRCwgTGluZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5TdGFydCwgTGluZUVuZCwgQ29sdW1uRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb25SZWdpb24pOworICB9CisKKyAgc3RhdGljIENvdW50ZXJNYXBwaW5nUmVnaW9uCisgIG1ha2VTa2lwcGVkKHVuc2lnbmVkIEZpbGVJRCwgdW5zaWduZWQgTGluZVN0YXJ0LCB1bnNpZ25lZCBDb2x1bW5TdGFydCwKKyAgICAgICAgICAgICAgdW5zaWduZWQgTGluZUVuZCwgdW5zaWduZWQgQ29sdW1uRW5kKSB7CisgICAgcmV0dXJuIENvdW50ZXJNYXBwaW5nUmVnaW9uKENvdW50ZXIoKSwgRmlsZUlELCAwLCBMaW5lU3RhcnQsIENvbHVtblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lRW5kLCBDb2x1bW5FbmQsIFNraXBwZWRSZWdpb24pOworICB9CisKKyAgc3RhdGljIENvdW50ZXJNYXBwaW5nUmVnaW9uCisgIG1ha2VHYXBSZWdpb24oQ291bnRlciBDb3VudCwgdW5zaWduZWQgRmlsZUlELCB1bnNpZ25lZCBMaW5lU3RhcnQsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sdW1uU3RhcnQsIHVuc2lnbmVkIExpbmVFbmQsIHVuc2lnbmVkIENvbHVtbkVuZCkgeworICAgIHJldHVybiBDb3VudGVyTWFwcGluZ1JlZ2lvbihDb3VudCwgRmlsZUlELCAwLCBMaW5lU3RhcnQsIENvbHVtblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lRW5kLCAoMVUgPDwgMzEpIHwgQ29sdW1uRW5kLCBHYXBSZWdpb24pOworICB9CisKKyAgaW5saW5lIExpbmVDb2xQYWlyIHN0YXJ0TG9jKCkgY29uc3QgeworICAgIHJldHVybiBMaW5lQ29sUGFpcihMaW5lU3RhcnQsIENvbHVtblN0YXJ0KTsKKyAgfQorCisgIGlubGluZSBMaW5lQ29sUGFpciBlbmRMb2MoKSBjb25zdCB7IHJldHVybiBMaW5lQ29sUGFpcihMaW5lRW5kLCBDb2x1bW5FbmQpOyB9Cit9OworCisvLy8gQXNzb2NpYXRlcyBhIHNvdXJjZSByYW5nZSB3aXRoIGFuIGV4ZWN1dGlvbiBjb3VudC4KK3N0cnVjdCBDb3VudGVkUmVnaW9uIDogcHVibGljIENvdW50ZXJNYXBwaW5nUmVnaW9uIHsKKyAgdWludDY0X3QgRXhlY3V0aW9uQ291bnQ7CisKKyAgQ291bnRlZFJlZ2lvbihjb25zdCBDb3VudGVyTWFwcGluZ1JlZ2lvbiAmUiwgdWludDY0X3QgRXhlY3V0aW9uQ291bnQpCisgICAgICA6IENvdW50ZXJNYXBwaW5nUmVnaW9uKFIpLCBFeGVjdXRpb25Db3VudChFeGVjdXRpb25Db3VudCkge30KK307CisKKy8vLyBBIENvdW50ZXIgbWFwcGluZyBjb250ZXh0IGlzIHVzZWQgdG8gY29ubmVjdCB0aGUgY291bnRlcnMsIGV4cHJlc3Npb25zCisvLy8gYW5kIHRoZSBvYnRhaW5lZCBjb3VudGVyIHZhbHVlcy4KK2NsYXNzIENvdW50ZXJNYXBwaW5nQ29udGV4dCB7CisgIEFycmF5UmVmPENvdW50ZXJFeHByZXNzaW9uPiBFeHByZXNzaW9uczsKKyAgQXJyYXlSZWY8dWludDY0X3Q+IENvdW50ZXJWYWx1ZXM7CisKK3B1YmxpYzoKKyAgQ291bnRlck1hcHBpbmdDb250ZXh0KEFycmF5UmVmPENvdW50ZXJFeHByZXNzaW9uPiBFeHByZXNzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ2NF90PiBDb3VudGVyVmFsdWVzID0gTm9uZSkKKyAgICAgIDogRXhwcmVzc2lvbnMoRXhwcmVzc2lvbnMpLCBDb3VudGVyVmFsdWVzKENvdW50ZXJWYWx1ZXMpIHt9CisKKyAgdm9pZCBzZXRDb3VudHMoQXJyYXlSZWY8dWludDY0X3Q+IENvdW50cykgeyBDb3VudGVyVmFsdWVzID0gQ291bnRzOyB9CisKKyAgdm9pZCBkdW1wKGNvbnN0IENvdW50ZXIgJkMsIHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcChjb25zdCBDb3VudGVyICZDKSBjb25zdCB7IGR1bXAoQywgZGJncygpKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGEgcmVnaW9uIG9mIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgLy8vIGNvdW50ZXIgd2FzIGV4ZWN1dGVkLgorICBFeHBlY3RlZDxpbnQ2NF90PiBldmFsdWF0ZShjb25zdCBDb3VudGVyICZDKSBjb25zdDsKK307CisKKy8vLyBDb2RlIGNvdmVyYWdlIGluZm9ybWF0aW9uIGZvciBhIHNpbmdsZSBmdW5jdGlvbi4KK3N0cnVjdCBGdW5jdGlvblJlY29yZCB7CisgIC8vLyBSYXcgZnVuY3Rpb24gbmFtZS4KKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgLy8vIEFzc29jaWF0ZWQgZmlsZXMuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBGaWxlbmFtZXM7CisgIC8vLyBSZWdpb25zIGluIHRoZSBmdW5jdGlvbiBhbG9uZyB3aXRoIHRoZWlyIGNvdW50cy4KKyAgc3RkOjp2ZWN0b3I8Q291bnRlZFJlZ2lvbj4gQ291bnRlZFJlZ2lvbnM7CisgIC8vLyBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gd2FzIGV4ZWN1dGVkLgorICB1aW50NjRfdCBFeGVjdXRpb25Db3VudDsKKworICBGdW5jdGlvblJlY29yZChTdHJpbmdSZWYgTmFtZSwgQXJyYXlSZWY8U3RyaW5nUmVmPiBGaWxlbmFtZXMpCisgICAgICA6IE5hbWUoTmFtZSksIEZpbGVuYW1lcyhGaWxlbmFtZXMuYmVnaW4oKSwgRmlsZW5hbWVzLmVuZCgpKSB7fQorCisgIEZ1bmN0aW9uUmVjb3JkKEZ1bmN0aW9uUmVjb3JkICYmRlIpID0gZGVmYXVsdDsKKyAgRnVuY3Rpb25SZWNvcmQgJm9wZXJhdG9yPShGdW5jdGlvblJlY29yZCAmJikgPSBkZWZhdWx0OworCisgIHZvaWQgcHVzaFJlZ2lvbihDb3VudGVyTWFwcGluZ1JlZ2lvbiBSZWdpb24sIHVpbnQ2NF90IENvdW50KSB7CisgICAgaWYgKENvdW50ZWRSZWdpb25zLmVtcHR5KCkpCisgICAgICBFeGVjdXRpb25Db3VudCA9IENvdW50OworICAgIENvdW50ZWRSZWdpb25zLmVtcGxhY2VfYmFjayhSZWdpb24sIENvdW50KTsKKyAgfQorfTsKKworLy8vIEl0ZXJhdG9yIG92ZXIgRnVuY3Rpb25zLCBvcHRpb25hbGx5IGZpbHRlcmVkIHRvIGEgc2luZ2xlIGZpbGUuCitjbGFzcyBGdW5jdGlvblJlY29yZEl0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8RnVuY3Rpb25SZWNvcmRJdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBGdW5jdGlvblJlY29yZD4geworICBBcnJheVJlZjxGdW5jdGlvblJlY29yZD4gUmVjb3JkczsKKyAgQXJyYXlSZWY8RnVuY3Rpb25SZWNvcmQ+OjppdGVyYXRvciBDdXJyZW50OworICBTdHJpbmdSZWYgRmlsZW5hbWU7CisKKyAgLy8vIFNraXAgcmVjb3JkcyB3aG9zZSBwcmltYXJ5IGZpbGUgaXMgbm90IFxjIEZpbGVuYW1lLgorICB2b2lkIHNraXBPdGhlckZpbGVzKCk7CisKK3B1YmxpYzoKKyAgRnVuY3Rpb25SZWNvcmRJdGVyYXRvcihBcnJheVJlZjxGdW5jdGlvblJlY29yZD4gUmVjb3Jkc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVuYW1lID0gIiIpCisgICAgICA6IFJlY29yZHMoUmVjb3Jkc18pLCBDdXJyZW50KFJlY29yZHMuYmVnaW4oKSksIEZpbGVuYW1lKEZpbGVuYW1lKSB7CisgICAgc2tpcE90aGVyRmlsZXMoKTsKKyAgfQorCisgIEZ1bmN0aW9uUmVjb3JkSXRlcmF0b3IoKSA6IEN1cnJlbnQoUmVjb3Jkcy5iZWdpbigpKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGdW5jdGlvblJlY29yZEl0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3VycmVudCA9PSBSSFMuQ3VycmVudCAmJiBGaWxlbmFtZSA9PSBSSFMuRmlsZW5hbWU7CisgIH0KKworICBjb25zdCBGdW5jdGlvblJlY29yZCAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKkN1cnJlbnQ7IH0KKworICBGdW5jdGlvblJlY29yZEl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgIGFzc2VydChDdXJyZW50ICE9IFJlY29yZHMuZW5kKCkgJiYgImluY3JlbWVudGVkIHBhc3QgZW5kIik7CisgICAgKytDdXJyZW50OworICAgIHNraXBPdGhlckZpbGVzKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9Cit9OworCisvLy8gQ292ZXJhZ2UgaW5mb3JtYXRpb24gZm9yIGEgbWFjcm8gZXhwYW5zaW9uIG9yICNpbmNsdWRlZCBmaWxlLgorLy8vCisvLy8gV2hlbiBjb3ZlcmVkIGNvZGUgaGFzIHBpZWNlcyB0aGF0IGNhbiBiZSBleHBhbmRlZCBmb3IgbW9yZSBkZXRhaWwsIHN1Y2ggYXMgYQorLy8vIHByZXByb2Nlc3NvciBtYWNybyB1c2UgYW5kIGl0cyBkZWZpbml0aW9uLCB0aGVzZSBhcmUgcmVwcmVzZW50ZWQgYXMKKy8vLyBleHBhbnNpb25zIHdob3NlIGNvdmVyYWdlIGNhbiBiZSBsb29rZWQgdXAgaW5kZXBlbmRlbnRseS4KK3N0cnVjdCBFeHBhbnNpb25SZWNvcmQgeworICAvLy8gVGhlIGFic3RyYWN0IGZpbGUgdGhpcyBleHBhbnNpb24gY292ZXJzLgorICB1bnNpZ25lZCBGaWxlSUQ7CisgIC8vLyBUaGUgcmVnaW9uIHRoYXQgZXhwYW5kcyB0byB0aGlzIHJlY29yZC4KKyAgY29uc3QgQ291bnRlZFJlZ2lvbiAmUmVnaW9uOworICAvLy8gQ292ZXJhZ2UgZm9yIHRoZSBleHBhbnNpb24uCisgIGNvbnN0IEZ1bmN0aW9uUmVjb3JkICZGdW5jdGlvbjsKKworICBFeHBhbnNpb25SZWNvcmQoY29uc3QgQ291bnRlZFJlZ2lvbiAmUmVnaW9uLAorICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25SZWNvcmQgJkZ1bmN0aW9uKQorICAgICAgOiBGaWxlSUQoUmVnaW9uLkV4cGFuZGVkRmlsZUlEKSwgUmVnaW9uKFJlZ2lvbiksIEZ1bmN0aW9uKEZ1bmN0aW9uKSB7fQorfTsKKworLy8vIFRoZSBleGVjdXRpb24gY291bnQgaW5mb3JtYXRpb24gc3RhcnRpbmcgYXQgYSBwb2ludCBpbiBhIGZpbGUuCisvLy8KKy8vLyBBIHNlcXVlbmNlIG9mIENvdmVyYWdlU2VnbWVudHMgZ2l2ZXMgZXhlY3V0aW9uIGNvdW50cyBmb3IgYSBmaWxlIGluIGZvcm1hdAorLy8vIHRoYXQncyBzaW1wbGUgdG8gaXRlcmF0ZSB0aHJvdWdoIGZvciBwcm9jZXNzaW5nLgorc3RydWN0IENvdmVyYWdlU2VnbWVudCB7CisgIC8vLyBUaGUgbGluZSB3aGVyZSB0aGlzIHNlZ21lbnQgYmVnaW5zLgorICB1bnNpZ25lZCBMaW5lOworICAvLy8gVGhlIGNvbHVtbiB3aGVyZSB0aGlzIHNlZ21lbnQgYmVnaW5zLgorICB1bnNpZ25lZCBDb2w7CisgIC8vLyBUaGUgZXhlY3V0aW9uIGNvdW50LCBvciB6ZXJvIGlmIG5vIGNvdW50IHdhcyByZWNvcmRlZC4KKyAgdWludDY0X3QgQ291bnQ7CisgIC8vLyBXaGVuIGZhbHNlLCB0aGUgc2VnbWVudCB3YXMgdW5pbnN0cnVtZW50ZWQgb3Igc2tpcHBlZC4KKyAgYm9vbCBIYXNDb3VudDsKKyAgLy8vIFdoZXRoZXIgdGhpcyBlbnRlcnMgYSBuZXcgcmVnaW9uIG9yIHJldHVybnMgdG8gYSBwcmV2aW91cyBjb3VudC4KKyAgYm9vbCBJc1JlZ2lvbkVudHJ5OworICAvLy8gV2hldGhlciB0aGlzIGVudGVycyBhIGdhcCByZWdpb24uCisgIGJvb2wgSXNHYXBSZWdpb247CisKKyAgQ292ZXJhZ2VTZWdtZW50KHVuc2lnbmVkIExpbmUsIHVuc2lnbmVkIENvbCwgYm9vbCBJc1JlZ2lvbkVudHJ5KQorICAgICAgOiBMaW5lKExpbmUpLCBDb2woQ29sKSwgQ291bnQoMCksIEhhc0NvdW50KGZhbHNlKSwKKyAgICAgICAgSXNSZWdpb25FbnRyeShJc1JlZ2lvbkVudHJ5KSwgSXNHYXBSZWdpb24oZmFsc2UpIHt9CisKKyAgQ292ZXJhZ2VTZWdtZW50KHVuc2lnbmVkIExpbmUsIHVuc2lnbmVkIENvbCwgdWludDY0X3QgQ291bnQsCisgICAgICAgICAgICAgICAgICBib29sIElzUmVnaW9uRW50cnksIGJvb2wgSXNHYXBSZWdpb24gPSBmYWxzZSkKKyAgICAgIDogTGluZShMaW5lKSwgQ29sKENvbCksIENvdW50KENvdW50KSwgSGFzQ291bnQodHJ1ZSksCisgICAgICAgIElzUmVnaW9uRW50cnkoSXNSZWdpb25FbnRyeSksIElzR2FwUmVnaW9uKElzR2FwUmVnaW9uKSB7fQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgQ292ZXJhZ2VTZWdtZW50ICZMLCBjb25zdCBDb3ZlcmFnZVNlZ21lbnQgJlIpIHsKKyAgICByZXR1cm4gc3RkOjp0aWUoTC5MaW5lLCBMLkNvbCwgTC5Db3VudCwgTC5IYXNDb3VudCwgTC5Jc1JlZ2lvbkVudHJ5LAorICAgICAgICAgICAgICAgICAgICBMLklzR2FwUmVnaW9uKSA9PSBzdGQ6OnRpZShSLkxpbmUsIFIuQ29sLCBSLkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLkhhc0NvdW50LCBSLklzUmVnaW9uRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuSXNHYXBSZWdpb24pOworICB9Cit9OworCisvLy8gQW4gaW5zdGFudGlhdGlvbiBncm91cCBjb250YWlucyBhIFxjIEZ1bmN0aW9uUmVjb3JkIGxpc3QsIHN1Y2ggdGhhdCBlYWNoCisvLy8gcmVjb3JkIGNvcnJlc3BvbmRzIHRvIGEgZGlzdGluY3QgaW5zdGFudGlhdGlvbiBvZiB0aGUgc2FtZSBmdW5jdGlvbi4KKy8vLworLy8vIE5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvciBhIGZ1bmN0aW9uIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBpbnN0YW50aWF0aW9uCisvLy8gKGNvbnNpZGVyIEMrKyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgb3Igc3RhdGljIGlubGluZSBmdW5jdGlvbnMpLgorY2xhc3MgSW5zdGFudGlhdGlvbkdyb3VwIHsKKyAgZnJpZW5kIGNsYXNzIENvdmVyYWdlTWFwcGluZzsKKworICB1bnNpZ25lZCBMaW5lOworICB1bnNpZ25lZCBDb2w7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEZ1bmN0aW9uUmVjb3JkICo+IEluc3RhbnRpYXRpb25zOworCisgIEluc3RhbnRpYXRpb25Hcm91cCh1bnNpZ25lZCBMaW5lLCB1bnNpZ25lZCBDb2wsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBGdW5jdGlvblJlY29yZCAqPiBJbnN0YW50aWF0aW9ucykKKyAgICAgIDogTGluZShMaW5lKSwgQ29sKENvbCksIEluc3RhbnRpYXRpb25zKHN0ZDo6bW92ZShJbnN0YW50aWF0aW9ucykpIHt9CisKK3B1YmxpYzoKKyAgSW5zdGFudGlhdGlvbkdyb3VwKGNvbnN0IEluc3RhbnRpYXRpb25Hcm91cCAmKSA9IGRlbGV0ZTsKKyAgSW5zdGFudGlhdGlvbkdyb3VwKEluc3RhbnRpYXRpb25Hcm91cCAmJikgPSBkZWZhdWx0OworCisgIC8vLyBHZXQgdGhlIG51bWJlciBvZiBpbnN0YW50aWF0aW9ucyBpbiB0aGlzIGdyb3VwLgorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEluc3RhbnRpYXRpb25zLnNpemUoKTsgfQorCisgIC8vLyBHZXQgdGhlIGxpbmUgd2hlcmUgdGhlIGNvbW1vbiBmdW5jdGlvbiB3YXMgZGVmaW5lZC4KKyAgdW5zaWduZWQgZ2V0TGluZSgpIGNvbnN0IHsgcmV0dXJuIExpbmU7IH0KKworICAvLy8gR2V0IHRoZSBjb2x1bW4gd2hlcmUgdGhlIGNvbW1vbiBmdW5jdGlvbiB3YXMgZGVmaW5lZC4KKyAgdW5zaWduZWQgZ2V0Q29sdW1uKCkgY29uc3QgeyByZXR1cm4gQ29sOyB9CisKKyAgLy8vIENoZWNrIGlmIHRoZSBpbnN0YW50aWF0aW9ucyBpbiB0aGlzIGdyb3VwIGhhdmUgYSBjb21tb24gbWFuZ2xlZCBuYW1lLgorICBib29sIGhhc05hbWUoKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBJID0gMSwgRSA9IEluc3RhbnRpYXRpb25zLnNpemUoKTsgSSA8IEU7ICsrSSkKKyAgICAgIGlmIChJbnN0YW50aWF0aW9uc1tJXS0+TmFtZSAhPSBJbnN0YW50aWF0aW9uc1swXS0+TmFtZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIEdldCB0aGUgY29tbW9uIG1hbmdsZWQgbmFtZSBmb3IgaW5zdGFudGlhdGlvbnMgaW4gdGhpcyBncm91cC4KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGhhc05hbWUoKSAmJiAiSW5zdGFudGlhdGlvbnMgZG9uJ3QgaGF2ZSBhIHNoYXJlZCBuYW1lIik7CisgICAgcmV0dXJuIEluc3RhbnRpYXRpb25zWzBdLT5OYW1lOworICB9CisKKyAgLy8vIEdldCB0aGUgdG90YWwgZXhlY3V0aW9uIGNvdW50IG9mIGFsbCBpbnN0YW50aWF0aW9ucyBpbiB0aGlzIGdyb3VwLgorICB1aW50NjRfdCBnZXRUb3RhbEV4ZWN1dGlvbkNvdW50KCkgY29uc3QgeworICAgIHVpbnQ2NF90IENvdW50ID0gMDsKKyAgICBmb3IgKGNvbnN0IEZ1bmN0aW9uUmVjb3JkICpGIDogSW5zdGFudGlhdGlvbnMpCisgICAgICBDb3VudCArPSBGLT5FeGVjdXRpb25Db3VudDsKKyAgICByZXR1cm4gQ291bnQ7CisgIH0KKworICAvLy8gR2V0IHRoZSBpbnN0YW50aWF0aW9ucyBpbiB0aGlzIGdyb3VwLgorICBBcnJheVJlZjxjb25zdCBGdW5jdGlvblJlY29yZCAqPiBnZXRJbnN0YW50aWF0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5zdGFudGlhdGlvbnM7CisgIH0KK307CisKKy8vLyBDb3ZlcmFnZSBpbmZvcm1hdGlvbiB0byBiZSBwcm9jZXNzZWQgb3IgZGlzcGxheWVkLgorLy8vCisvLy8gVGhpcyByZXByZXNlbnRzIHRoZSBjb3ZlcmFnZSBvZiBhbiBlbnRpcmUgZmlsZSwgZXhwYW5zaW9uLCBvciBmdW5jdGlvbi4gSXQKKy8vLyBwcm92aWRlcyBhIHNlcXVlbmNlIG9mIENvdmVyYWdlU2VnbWVudHMgdG8gaXRlcmF0ZSB0aHJvdWdoLCBhcyB3ZWxsIGFzIHRoZQorLy8vIGxpc3Qgb2YgZXhwYW5zaW9ucyB0aGF0IGNhbiBiZSBmdXJ0aGVyIHByb2Nlc3NlZC4KK2NsYXNzIENvdmVyYWdlRGF0YSB7CisgIGZyaWVuZCBjbGFzcyBDb3ZlcmFnZU1hcHBpbmc7CisKKyAgc3RkOjpzdHJpbmcgRmlsZW5hbWU7CisgIHN0ZDo6dmVjdG9yPENvdmVyYWdlU2VnbWVudD4gU2VnbWVudHM7CisgIHN0ZDo6dmVjdG9yPEV4cGFuc2lvblJlY29yZD4gRXhwYW5zaW9uczsKKworcHVibGljOgorICBDb3ZlcmFnZURhdGEoKSA9IGRlZmF1bHQ7CisKKyAgQ292ZXJhZ2VEYXRhKFN0cmluZ1JlZiBGaWxlbmFtZSkgOiBGaWxlbmFtZShGaWxlbmFtZSkge30KKworICAvLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoaXMgZGF0YSBjb3ZlcnMuCisgIFN0cmluZ1JlZiBnZXRGaWxlbmFtZSgpIGNvbnN0IHsgcmV0dXJuIEZpbGVuYW1lOyB9CisKKyAgLy8vIEdldCBhbiBpdGVyYXRvciBvdmVyIHRoZSBjb3ZlcmFnZSBzZWdtZW50cyBmb3IgdGhpcyBvYmplY3QuIFRoZSBzZWdtZW50cworICAvLy8gYXJlIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlZCBhbmQgc29ydGVkIGJ5IGxvY2F0aW9uLgorICBzdGQ6OnZlY3RvcjxDb3ZlcmFnZVNlZ21lbnQ+Ojpjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gU2VnbWVudHMuYmVnaW4oKTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPENvdmVyYWdlU2VnbWVudD46OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU2VnbWVudHMuZW5kKCk7CisgIH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gU2VnbWVudHMuZW1wdHkoKTsgfQorCisgIC8vLyBFeHBhbnNpb25zIHRoYXQgY2FuIGJlIGZ1cnRoZXIgcHJvY2Vzc2VkLgorICBBcnJheVJlZjxFeHBhbnNpb25SZWNvcmQ+IGdldEV4cGFuc2lvbnMoKSBjb25zdCB7IHJldHVybiBFeHBhbnNpb25zOyB9Cit9OworCisvLy8gVGhlIG1hcHBpbmcgb2YgcHJvZmlsZSBpbmZvcm1hdGlvbiB0byBjb3ZlcmFnZSBkYXRhLgorLy8vCisvLy8gVGhpcyBpcyB0aGUgbWFpbiBpbnRlcmZhY2UgdG8gZ2V0IGNvdmVyYWdlIGluZm9ybWF0aW9uLCB1c2luZyBhIHByb2ZpbGUgdG8KKy8vLyBmaWxsIG91dCBleGVjdXRpb24gY291bnRzLgorY2xhc3MgQ292ZXJhZ2VNYXBwaW5nIHsKKyAgU3RyaW5nU2V0PD4gRnVuY3Rpb25OYW1lczsKKyAgc3RkOjp2ZWN0b3I8RnVuY3Rpb25SZWNvcmQ+IEZ1bmN0aW9uczsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCB1aW50NjRfdD4+IEZ1bmNIYXNoTWlzbWF0Y2hlczsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCB1aW50NjRfdD4+IEZ1bmNDb3VudGVyTWlzbWF0Y2hlczsKKworICBDb3ZlcmFnZU1hcHBpbmcoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIEFkZCBhIGZ1bmN0aW9uIHJlY29yZCBjb3JyZXNwb25kaW5nIHRvIFxwIFJlY29yZC4KKyAgRXJyb3IgbG9hZEZ1bmN0aW9uUmVjb3JkKGNvbnN0IENvdmVyYWdlTWFwcGluZ1JlY29yZCAmUmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhlZEluc3RyUHJvZlJlYWRlciAmUHJvZmlsZVJlYWRlcik7CisKK3B1YmxpYzoKKyAgQ292ZXJhZ2VNYXBwaW5nKGNvbnN0IENvdmVyYWdlTWFwcGluZyAmKSA9IGRlbGV0ZTsKKyAgQ292ZXJhZ2VNYXBwaW5nICZvcGVyYXRvcj0oY29uc3QgQ292ZXJhZ2VNYXBwaW5nICYpID0gZGVsZXRlOworCisgIC8vLyBMb2FkIHRoZSBjb3ZlcmFnZSBtYXBwaW5nIHVzaW5nIHRoZSBnaXZlbiByZWFkZXJzLgorICBzdGF0aWMgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPENvdmVyYWdlTWFwcGluZz4+CisgIGxvYWQoQXJyYXlSZWY8c3RkOjp1bmlxdWVfcHRyPENvdmVyYWdlTWFwcGluZ1JlYWRlcj4+IENvdmVyYWdlUmVhZGVycywKKyAgICAgICBJbmRleGVkSW5zdHJQcm9mUmVhZGVyICZQcm9maWxlUmVhZGVyKTsKKworICAvLy8gTG9hZCB0aGUgY292ZXJhZ2UgbWFwcGluZyBmcm9tIHRoZSBnaXZlbiBvYmplY3QgZmlsZXMgYW5kIHByb2ZpbGUuIElmCisgIC8vLyBccCBBcmNoZXMgaXMgbm9uLWVtcHR5LCBpdCBtdXN0IHNwZWNpZnkgYW4gYXJjaGl0ZWN0dXJlIGZvciBlYWNoIG9iamVjdC4KKyAgc3RhdGljIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxDb3ZlcmFnZU1hcHBpbmc+PgorICBsb2FkKEFycmF5UmVmPFN0cmluZ1JlZj4gT2JqZWN0RmlsZW5hbWVzLCBTdHJpbmdSZWYgUHJvZmlsZUZpbGVuYW1lLAorICAgICAgIEFycmF5UmVmPFN0cmluZ1JlZj4gQXJjaGVzID0gTm9uZSk7CisKKyAgLy8vIFRoZSBudW1iZXIgb2YgZnVuY3Rpb25zIHRoYXQgY291bGRuJ3QgaGF2ZSB0aGVpciBwcm9maWxlcyBtYXBwZWQuCisgIC8vLworICAvLy8gVGhpcyBpcyBhIGNvdW50IG9mIGZ1bmN0aW9ucyB3aG9zZSBwcm9maWxlIGlzIG91dCBvZiBkYXRlIG9yIG90aGVyd2lzZQorICAvLy8gY2FuJ3QgYmUgYXNzb2NpYXRlZCB3aXRoIGFueSBjb3ZlcmFnZSBpbmZvcm1hdGlvbi4KKyAgdW5zaWduZWQgZ2V0TWlzbWF0Y2hlZENvdW50KCkgY29uc3QgeworICAgIHJldHVybiBGdW5jSGFzaE1pc21hdGNoZXMuc2l6ZSgpICsgRnVuY0NvdW50ZXJNaXNtYXRjaGVzLnNpemUoKTsKKyAgfQorCisgIC8vLyBBIGhhc2ggbWlzbWF0Y2ggb2NjdXJzIHdoZW4gYSBwcm9maWxlIHJlY29yZCBmb3IgYSBzeW1ib2wgZG9lcyBub3QgaGF2ZQorICAvLy8gdGhlIHNhbWUgaGFzaCBhcyBhIGNvdmVyYWdlIG1hcHBpbmcgcmVjb3JkIGZvciB0aGUgc2FtZSBzeW1ib2wuIFRoaXMKKyAgLy8vIHJldHVybnMgYSBsaXN0IG9mIGhhc2ggbWlzbWF0Y2hlcywgd2hlcmUgZWFjaCBtaXNtYXRjaCBpcyBhIHBhaXIgb2YgdGhlCisgIC8vLyBzeW1ib2wgbmFtZSBhbmQgaXRzIGNvdmVyYWdlIG1hcHBpbmcgaGFzaC4KKyAgQXJyYXlSZWY8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCB1aW50NjRfdD4+IGdldEhhc2hNaXNtYXRjaGVzKCkgY29uc3QgeworICAgIHJldHVybiBGdW5jSGFzaE1pc21hdGNoZXM7CisgIH0KKworICAvLy8gQSBjb3VudGVyIG1pc21hdGNoIG9jY3VycyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIHdoZW4gZXZhbHVhdGluZyB0aGUKKyAgLy8vIGNvdW50ZXIgZXhwcmVzc2lvbnMgaW4gYSBjb3ZlcmFnZSBtYXBwaW5nIHJlY29yZC4gVGhpcyByZXR1cm5zIGEgbGlzdCBvZgorICAvLy8gY291bnRlciBtaXNtYXRjaGVzLCB3aGVyZSBlYWNoIG1pc21hdGNoIGlzIGEgcGFpciBvZiB0aGUgc3ltYm9sIG5hbWUgYW5kCisgIC8vLyB0aGUgbnVtYmVyIG9mIHZhbGlkIGV2YWx1YXRlZCBjb3VudGVyIGV4cHJlc3Npb25zLgorICBBcnJheVJlZjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHVpbnQ2NF90Pj4gZ2V0Q291bnRlck1pc21hdGNoZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEZ1bmNDb3VudGVyTWlzbWF0Y2hlczsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGEgbGV4aWNvZ3JhcGhpY2FsbHkgc29ydGVkLCB1bmlxdWUgbGlzdCBvZiBmaWxlcyB0aGF0IGFyZQorICAvLy8gY292ZXJlZC4KKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBnZXRVbmlxdWVTb3VyY2VGaWxlcygpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIGNvdmVyYWdlIGZvciBhIHBhcnRpY3VsYXIgZmlsZS4KKyAgLy8vCisgIC8vLyBUaGUgZ2l2ZW4gZmlsZW5hbWUgbXVzdCBiZSB0aGUgbmFtZSBhcyByZWNvcmRlZCBpbiB0aGUgY292ZXJhZ2UKKyAgLy8vIGluZm9ybWF0aW9uLiBUaGF0IGlzLCBvbmx5IG5hbWVzIHJldHVybmVkIGZyb20gZ2V0VW5pcXVlU291cmNlRmlsZXMgd2lsbAorICAvLy8geWllbGQgYSByZXN1bHQuCisgIENvdmVyYWdlRGF0YSBnZXRDb3ZlcmFnZUZvckZpbGUoU3RyaW5nUmVmIEZpbGVuYW1lKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBjb3ZlcmFnZSBmb3IgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uLgorICBDb3ZlcmFnZURhdGEgZ2V0Q292ZXJhZ2VGb3JGdW5jdGlvbihjb25zdCBGdW5jdGlvblJlY29yZCAmRnVuY3Rpb24pIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIGNvdmVyYWdlIGZvciBhbiBleHBhbnNpb24gd2l0aGluIGEgY292ZXJhZ2Ugc2V0LgorICBDb3ZlcmFnZURhdGEgZ2V0Q292ZXJhZ2VGb3JFeHBhbnNpb24oY29uc3QgRXhwYW5zaW9uUmVjb3JkICZFeHBhbnNpb24pIGNvbnN0OworCisgIC8vLyBHZXRzIGFsbCBvZiB0aGUgZnVuY3Rpb25zIGNvdmVyZWQgYnkgdGhpcyBwcm9maWxlLgorICBpdGVyYXRvcl9yYW5nZTxGdW5jdGlvblJlY29yZEl0ZXJhdG9yPiBnZXRDb3ZlcmVkRnVuY3Rpb25zKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKEZ1bmN0aW9uUmVjb3JkSXRlcmF0b3IoRnVuY3Rpb25zKSwKKyAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblJlY29yZEl0ZXJhdG9yKCkpOworICB9CisKKyAgLy8vIEdldHMgYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gYSBwYXJ0aWN1bGFyIGZpbGUuCisgIGl0ZXJhdG9yX3JhbmdlPEZ1bmN0aW9uUmVjb3JkSXRlcmF0b3I+CisgIGdldENvdmVyZWRGdW5jdGlvbnMoU3RyaW5nUmVmIEZpbGVuYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoRnVuY3Rpb25SZWNvcmRJdGVyYXRvcihGdW5jdGlvbnMsIEZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblJlY29yZEl0ZXJhdG9yKCkpOworICB9CisKKyAgLy8vIEdldCB0aGUgbGlzdCBvZiBmdW5jdGlvbiBpbnN0YW50aWF0aW9uIGdyb3VwcyBpbiBhIHBhcnRpY3VsYXIgZmlsZS4KKyAgLy8vCisgIC8vLyBFdmVyeSBpbnN0YW50aWF0aW9uIGdyb3VwIGluIGEgcHJvZ3JhbSBpcyBhdHRyaWJ1dGVkIHRvIGV4YWN0bHkgb25lIGZpbGU6CisgIC8vLyB0aGUgZmlsZSBpbiB3aGljaCB0aGUgZGVmaW5pdGlvbiBmb3IgdGhlIGNvbW1vbiBmdW5jdGlvbiBiZWdpbnMuCisgIHN0ZDo6dmVjdG9yPEluc3RhbnRpYXRpb25Hcm91cD4KKyAgZ2V0SW5zdGFudGlhdGlvbkdyb3VwcyhTdHJpbmdSZWYgRmlsZW5hbWUpIGNvbnN0OworfTsKKworLy8vIENvdmVyYWdlIHN0YXRpc3RpY3MgZm9yIGEgc2luZ2xlIGxpbmUuCitjbGFzcyBMaW5lQ292ZXJhZ2VTdGF0cyB7CisgIHVpbnQ2NF90IEV4ZWN1dGlvbkNvdW50OworICBib29sIEhhc011bHRpcGxlUmVnaW9uczsKKyAgYm9vbCBNYXBwZWQ7CisgIHVuc2lnbmVkIExpbmU7CisgIEFycmF5UmVmPGNvbnN0IENvdmVyYWdlU2VnbWVudCAqPiBMaW5lU2VnbWVudHM7CisgIGNvbnN0IENvdmVyYWdlU2VnbWVudCAqV3JhcHBlZFNlZ21lbnQ7CisKKyAgZnJpZW5kIGNsYXNzIExpbmVDb3ZlcmFnZUl0ZXJhdG9yOworICBMaW5lQ292ZXJhZ2VTdGF0cygpID0gZGVmYXVsdDsKKworcHVibGljOgorICBMaW5lQ292ZXJhZ2VTdGF0cyhBcnJheVJlZjxjb25zdCBDb3ZlcmFnZVNlZ21lbnQgKj4gTGluZVNlZ21lbnRzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDb3ZlcmFnZVNlZ21lbnQgKldyYXBwZWRTZWdtZW50LCB1bnNpZ25lZCBMaW5lKTsKKworICB1aW50NjRfdCBnZXRFeGVjdXRpb25Db3VudCgpIGNvbnN0IHsgcmV0dXJuIEV4ZWN1dGlvbkNvdW50OyB9CisKKyAgYm9vbCBoYXNNdWx0aXBsZVJlZ2lvbnMoKSBjb25zdCB7IHJldHVybiBIYXNNdWx0aXBsZVJlZ2lvbnM7IH0KKworICBib29sIGlzTWFwcGVkKCkgY29uc3QgeyByZXR1cm4gTWFwcGVkOyB9CisKKyAgdW5zaWduZWQgZ2V0TGluZSgpIGNvbnN0IHsgcmV0dXJuIExpbmU7IH0KKworICBBcnJheVJlZjxjb25zdCBDb3ZlcmFnZVNlZ21lbnQgKj4gZ2V0TGluZVNlZ21lbnRzKCkgY29uc3QgeworICAgIHJldHVybiBMaW5lU2VnbWVudHM7CisgIH0KKworICBjb25zdCBDb3ZlcmFnZVNlZ21lbnQgKmdldFdyYXBwZWRTZWdtZW50KCkgY29uc3QgeyByZXR1cm4gV3JhcHBlZFNlZ21lbnQ7IH0KK307CisKKy8vLyBBbiBpdGVyYXRvciBvdmVyIHRoZSBcYyBMaW5lQ292ZXJhZ2VTdGF0cyBvYmplY3RzIGZvciBsaW5lcyBkZXNjcmliZWQgYnkKKy8vLyBhIFxjIENvdmVyYWdlRGF0YSBpbnN0YW5jZS4KK2NsYXNzIExpbmVDb3ZlcmFnZUl0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8CisgICAgICAgICAgTGluZUNvdmVyYWdlSXRlcmF0b3IsIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIExpbmVDb3ZlcmFnZVN0YXRzPiB7CitwdWJsaWM6CisgIExpbmVDb3ZlcmFnZUl0ZXJhdG9yKGNvbnN0IENvdmVyYWdlRGF0YSAmQ0QpCisgICAgICA6IExpbmVDb3ZlcmFnZUl0ZXJhdG9yKENELCBDRC5iZWdpbigpLT5MaW5lKSB7fQorCisgIExpbmVDb3ZlcmFnZUl0ZXJhdG9yKGNvbnN0IENvdmVyYWdlRGF0YSAmQ0QsIHVuc2lnbmVkIExpbmUpCisgICAgICA6IENEKENEKSwgV3JhcHBlZFNlZ21lbnQobnVsbHB0ciksIE5leHQoQ0QuYmVnaW4oKSksIEVuZGVkKGZhbHNlKSwKKyAgICAgICAgTGluZShMaW5lKSwgU2VnbWVudHMoKSwgU3RhdHMoKSB7CisgICAgdGhpcy0+b3BlcmF0b3IrKygpOworICB9CisKKyAgTGluZUNvdmVyYWdlSXRlcmF0b3IgJm9wZXJhdG9yPShjb25zdCBMaW5lQ292ZXJhZ2VJdGVyYXRvciAmUikgPSBkZWZhdWx0OworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBMaW5lQ292ZXJhZ2VJdGVyYXRvciAmUikgY29uc3QgeworICAgIHJldHVybiAmQ0QgPT0gJlIuQ0QgJiYgTmV4dCA9PSBSLk5leHQgJiYgRW5kZWQgPT0gUi5FbmRlZDsKKyAgfQorCisgIGNvbnN0IExpbmVDb3ZlcmFnZVN0YXRzICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBTdGF0czsgfQorCisgIExpbmVDb3ZlcmFnZVN0YXRzICZvcGVyYXRvciooKSB7IHJldHVybiBTdGF0czsgfQorCisgIExpbmVDb3ZlcmFnZUl0ZXJhdG9yICZvcGVyYXRvcisrKCk7CisKKyAgTGluZUNvdmVyYWdlSXRlcmF0b3IgZ2V0RW5kKCkgY29uc3QgeworICAgIGF1dG8gRW5kSXQgPSAqdGhpczsKKyAgICBFbmRJdC5OZXh0ID0gQ0QuZW5kKCk7CisgICAgRW5kSXQuRW5kZWQgPSB0cnVlOworICAgIHJldHVybiBFbmRJdDsKKyAgfQorCitwcml2YXRlOgorICBjb25zdCBDb3ZlcmFnZURhdGEgJkNEOworICBjb25zdCBDb3ZlcmFnZVNlZ21lbnQgKldyYXBwZWRTZWdtZW50OworICBzdGQ6OnZlY3RvcjxDb3ZlcmFnZVNlZ21lbnQ+Ojpjb25zdF9pdGVyYXRvciBOZXh0OworICBib29sIEVuZGVkOworICB1bnNpZ25lZCBMaW5lOworICBTbWFsbFZlY3Rvcjxjb25zdCBDb3ZlcmFnZVNlZ21lbnQgKiwgND4gU2VnbWVudHM7CisgIExpbmVDb3ZlcmFnZVN0YXRzIFN0YXRzOworfTsKKworLy8vIEdldCBhIFxjIExpbmVDb3ZlcmFnZUl0ZXJhdG9yIHJhbmdlIGZvciB0aGUgbGluZXMgZGVzY3JpYmVkIGJ5IFxwIENELgorc3RhdGljIGlubGluZSBpdGVyYXRvcl9yYW5nZTxMaW5lQ292ZXJhZ2VJdGVyYXRvcj4KK2dldExpbmVDb3ZlcmFnZVN0YXRzKGNvbnN0IGNvdmVyYWdlOjpDb3ZlcmFnZURhdGEgJkNEKSB7CisgIGF1dG8gQmVnaW4gPSBMaW5lQ292ZXJhZ2VJdGVyYXRvcihDRCk7CisgIGF1dG8gRW5kID0gQmVnaW4uZ2V0RW5kKCk7CisgIHJldHVybiBtYWtlX3JhbmdlKEJlZ2luLCBFbmQpOworfQorCisvLyBQcm9maWxlIGNvdmVyYWdlIG1hcCBoYXMgdGhlIGZvbGxvd2luZyBsYXlvdXQ6CisvLyBbQ292ZXJhZ2VNYXBGaWxlSGVhZGVyXQorLy8gW0FycmF5U3RhcnRdCisvLyAgW0Nvdk1hcEZ1bmN0aW9uUmVjb3JkXQorLy8gIFtDb3ZNYXBGdW5jdGlvblJlY29yZF0KKy8vICAuLi4KKy8vIFtBcnJheUVuZF0KKy8vIFtFbmNvZGVkIFJlZ2lvbiBNYXBwaW5nIERhdGFdCitMTFZNX1BBQ0tFRF9TVEFSVAordGVtcGxhdGUgPGNsYXNzIEludFB0clQ+IHN0cnVjdCBDb3ZNYXBGdW5jdGlvblJlY29yZFYxIHsKKyNkZWZpbmUgQ09WTUFQX1YxCisjZGVmaW5lIENPVk1BUF9GVU5DX1JFQ09SRChUeXBlLCBMTFZNVHlwZSwgTmFtZSwgSW5pdCkgVHlwZSBOYW1lOworI2luY2x1ZGUgImxsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mRGF0YS5pbmMiCisjdW5kZWYgQ09WTUFQX1YxCisKKyAgLy8gUmV0dXJuIHRoZSBzdHJ1Y3R1cmFsIGhhc2ggYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbi4KKyAgdGVtcGxhdGUgPHN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuPiB1aW50NjRfdCBnZXRGdW5jSGFzaCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3VwcG9ydDo6ZW5kaWFuOjpieXRlX3N3YXA8dWludDY0X3QsIEVuZGlhbj4oRnVuY0hhc2gpOworICB9CisKKyAgLy8gUmV0dXJuIHRoZSBjb3ZlcmFnZSBtYXAgZGF0YSBzaXplIGZvciB0aGUgZnVuY2l0b24uCisgIHRlbXBsYXRlIDxzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbj4gdWludDMyX3QgZ2V0RGF0YVNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN1cHBvcnQ6OmVuZGlhbjo6Ynl0ZV9zd2FwPHVpbnQzMl90LCBFbmRpYW4+KERhdGFTaXplKTsKKyAgfQorCisgIC8vIFJldHVybiBmdW5jdGlvbiBsb29rdXAga2V5LiBUaGUgdmFsdWUgaXMgY29uc2lkZXIgb3BhcXVlLgorICB0ZW1wbGF0ZSA8c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4+IEludFB0clQgZ2V0RnVuY05hbWVSZWYoKSBjb25zdCB7CisgICAgcmV0dXJuIHN1cHBvcnQ6OmVuZGlhbjo6Ynl0ZV9zd2FwPEludFB0clQsIEVuZGlhbj4oTmFtZVB0cik7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIFBHTyBuYW1lIG9mIHRoZSBmdW5jdGlvbiAqLworICB0ZW1wbGF0ZSA8c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4+CisgIEVycm9yIGdldEZ1bmNOYW1lKEluc3RyUHJvZlN5bXRhYiAmUHJvZmlsZU5hbWVzLCBTdHJpbmdSZWYgJkZ1bmNOYW1lKSBjb25zdCB7CisgICAgSW50UHRyVCBOYW1lUmVmID0gZ2V0RnVuY05hbWVSZWY8RW5kaWFuPigpOworICAgIHVpbnQzMl90IE5hbWVTID0gc3VwcG9ydDo6ZW5kaWFuOjpieXRlX3N3YXA8dWludDMyX3QsIEVuZGlhbj4oTmFtZVNpemUpOworICAgIEZ1bmNOYW1lID0gUHJvZmlsZU5hbWVzLmdldEZ1bmNOYW1lKE5hbWVSZWYsIE5hbWVTKTsKKyAgICBpZiAoTmFtZVMgJiYgRnVuY05hbWUuZW1wdHkoKSkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPENvdmVyYWdlTWFwRXJyb3I+KGNvdmVyYWdlbWFwX2Vycm9yOjptYWxmb3JtZWQpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9Cit9OworCitzdHJ1Y3QgQ292TWFwRnVuY3Rpb25SZWNvcmQgeworI2RlZmluZSBDT1ZNQVBfRlVOQ19SRUNPUkQoVHlwZSwgTExWTVR5cGUsIE5hbWUsIEluaXQpIFR5cGUgTmFtZTsKKyNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZkRhdGEuaW5jIgorCisgIC8vIFJldHVybiB0aGUgc3RydWN0dXJhbCBoYXNoIGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24uCisgIHRlbXBsYXRlIDxzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbj4gdWludDY0X3QgZ2V0RnVuY0hhc2goKSBjb25zdCB7CisgICAgcmV0dXJuIHN1cHBvcnQ6OmVuZGlhbjo6Ynl0ZV9zd2FwPHVpbnQ2NF90LCBFbmRpYW4+KEZ1bmNIYXNoKTsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgY292ZXJhZ2UgbWFwIGRhdGEgc2l6ZSBmb3IgdGhlIGZ1bmNpdG9uLgorICB0ZW1wbGF0ZSA8c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4+IHVpbnQzMl90IGdldERhdGFTaXplKCkgY29uc3QgeworICAgIHJldHVybiBzdXBwb3J0OjplbmRpYW46OmJ5dGVfc3dhcDx1aW50MzJfdCwgRW5kaWFuPihEYXRhU2l6ZSk7CisgIH0KKworICAvLyBSZXR1cm4gZnVuY3Rpb24gbG9va3VwIGtleS4gVGhlIHZhbHVlIGlzIGNvbnNpZGVyIG9wYXF1ZS4KKyAgdGVtcGxhdGUgPHN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuPiB1aW50NjRfdCBnZXRGdW5jTmFtZVJlZigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3VwcG9ydDo6ZW5kaWFuOjpieXRlX3N3YXA8dWludDY0X3QsIEVuZGlhbj4oTmFtZVJlZik7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIFBHTyBuYW1lIG9mIHRoZSBmdW5jdGlvbiAqLworICB0ZW1wbGF0ZSA8c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4+CisgIEVycm9yIGdldEZ1bmNOYW1lKEluc3RyUHJvZlN5bXRhYiAmUHJvZmlsZU5hbWVzLCBTdHJpbmdSZWYgJkZ1bmNOYW1lKSBjb25zdCB7CisgICAgdWludDY0X3QgTmFtZVJlZiA9IGdldEZ1bmNOYW1lUmVmPEVuZGlhbj4oKTsKKyAgICBGdW5jTmFtZSA9IFByb2ZpbGVOYW1lcy5nZXRGdW5jTmFtZShOYW1lUmVmKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorfTsKKworLy8gUGVyIG1vZHVsZSBjb3ZlcmFnZSBtYXBwaW5nIGRhdGEgaGVhZGVyLCBpLmUuIENvdmVyYWdlTWFwRmlsZUhlYWRlcgorLy8gZG9jdW1lbnRlZCBhYm92ZS4KK3N0cnVjdCBDb3ZNYXBIZWFkZXIgeworI2RlZmluZSBDT1ZNQVBfSEVBREVSKFR5cGUsIExMVk1UeXBlLCBOYW1lLCBJbml0KSBUeXBlIE5hbWU7CisjaW5jbHVkZSAibGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2ZEYXRhLmluYyIKKyAgdGVtcGxhdGUgPHN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuPiB1aW50MzJfdCBnZXROUmVjb3JkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3VwcG9ydDo6ZW5kaWFuOjpieXRlX3N3YXA8dWludDMyX3QsIEVuZGlhbj4oTlJlY29yZHMpOworICB9CisKKyAgdGVtcGxhdGUgPHN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuPiB1aW50MzJfdCBnZXRGaWxlbmFtZXNTaXplKCkgY29uc3QgeworICAgIHJldHVybiBzdXBwb3J0OjplbmRpYW46OmJ5dGVfc3dhcDx1aW50MzJfdCwgRW5kaWFuPihGaWxlbmFtZXNTaXplKTsKKyAgfQorCisgIHRlbXBsYXRlIDxzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbj4gdWludDMyX3QgZ2V0Q292ZXJhZ2VTaXplKCkgY29uc3QgeworICAgIHJldHVybiBzdXBwb3J0OjplbmRpYW46OmJ5dGVfc3dhcDx1aW50MzJfdCwgRW5kaWFuPihDb3ZlcmFnZVNpemUpOworICB9CisKKyAgdGVtcGxhdGUgPHN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuPiB1aW50MzJfdCBnZXRWZXJzaW9uKCkgY29uc3QgeworICAgIHJldHVybiBzdXBwb3J0OjplbmRpYW46OmJ5dGVfc3dhcDx1aW50MzJfdCwgRW5kaWFuPihWZXJzaW9uKTsKKyAgfQorfTsKKworTExWTV9QQUNLRURfRU5ECisKK2VudW0gQ292TWFwVmVyc2lvbiB7CisgIFZlcnNpb24xID0gMCwKKyAgLy8gRnVuY3Rpb24ncyBuYW1lIHJlZmVyZW5jZSBmcm9tIENvdk1hcEZ1bmNSZWNvcmQgaXMgY2hhbmdlZCBmcm9tIHJhdworICAvLyBuYW1lIHN0cmluZyBwb2ludGVyIHRvIE1ENSB0byBzdXBwb3J0IG5hbWUgc2VjdGlvbiBjb21wcmVzc2lvbi4gTmFtZQorICAvLyBzZWN0aW9uIGlzIGFsc28gY29tcHJlc3NlZC4KKyAgVmVyc2lvbjIgPSAxLAorICAvLyBBIG5ldyBpbnRlcnByZXRhdGlvbiBvZiB0aGUgY29sdW1uRW5kIGZpZWxkIGlzIGFkZGVkIGluIG9yZGVyIHRvIG1hcmsKKyAgLy8gcmVnaW9ucyBhcyBnYXAgYXJlYXMuCisgIFZlcnNpb24zID0gMiwKKyAgLy8gVGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBWZXJzaW9uMworICBDdXJyZW50VmVyc2lvbiA9IElOU1RSX1BST0ZfQ09WTUFQX1ZFUlNJT04KK307CisKK3RlbXBsYXRlIDxpbnQgQ292TWFwVmVyc2lvbiwgY2xhc3MgSW50UHRyVD4gc3RydWN0IENvdk1hcFRyYWl0cyB7CisgIHVzaW5nIENvdk1hcEZ1bmNSZWNvcmRUeXBlID0gQ292TWFwRnVuY3Rpb25SZWNvcmQ7CisgIHVzaW5nIE5hbWVSZWZUeXBlID0gdWludDY0X3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgSW50UHRyVD4gc3RydWN0IENvdk1hcFRyYWl0czxDb3ZNYXBWZXJzaW9uOjpWZXJzaW9uMSwgSW50UHRyVD4geworICB1c2luZyBDb3ZNYXBGdW5jUmVjb3JkVHlwZSA9IENvdk1hcEZ1bmN0aW9uUmVjb3JkVjE8SW50UHRyVD47CisgIHVzaW5nIE5hbWVSZWZUeXBlID0gSW50UHRyVDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb3ZlcmFnZQorCisvLy8gUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIENvdW50ZXJFeHByZXNzaW9uCit0ZW1wbGF0ZTw+IHN0cnVjdCBEZW5zZU1hcEluZm88Y292ZXJhZ2U6OkNvdW50ZXJFeHByZXNzaW9uPiB7CisgIHN0YXRpYyBpbmxpbmUgY292ZXJhZ2U6OkNvdW50ZXJFeHByZXNzaW9uIGdldEVtcHR5S2V5KCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBjb3ZlcmFnZTsKKworICAgIHJldHVybiBDb3VudGVyRXhwcmVzc2lvbihDb3VudGVyRXhwcmVzc2lvbjo6RXhwcktpbmQ6OlN1YnRyYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudGVyOjpnZXRDb3VudGVyKH4wVSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ZXI6OmdldENvdW50ZXIofjBVKSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIGNvdmVyYWdlOjpDb3VudGVyRXhwcmVzc2lvbiBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIGNvdmVyYWdlOworCisgICAgcmV0dXJuIENvdW50ZXJFeHByZXNzaW9uKENvdW50ZXJFeHByZXNzaW9uOjpFeHByS2luZDo6QWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudGVyOjpnZXRDb3VudGVyKH4wVSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ZXI6OmdldENvdW50ZXIofjBVKSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IGNvdmVyYWdlOjpDb3VudGVyRXhwcmVzc2lvbiAmVikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oCisgICAgICAgIGhhc2hfY29tYmluZShWLktpbmQsIFYuTEhTLmdldEtpbmQoKSwgVi5MSFMuZ2V0Q291bnRlcklEKCksCisgICAgICAgICAgICAgICAgICAgICBWLlJIUy5nZXRLaW5kKCksIFYuUkhTLmdldENvdW50ZXJJRCgpKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IGNvdmVyYWdlOjpDb3VudGVyRXhwcmVzc2lvbiAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvdmVyYWdlOjpDb3VudGVyRXhwcmVzc2lvbiAmUkhTKSB7CisgICAgcmV0dXJuIExIUy5LaW5kID09IFJIUy5LaW5kICYmIExIUy5MSFMgPT0gUkhTLkxIUyAmJiBMSFMuUkhTID09IFJIUy5SSFM7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1BST0ZJTEVEQVRBX0NPVkVSQUdFX0NPVkVSQUdFTUFQUElOR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL0NvdmVyYWdlL0NvdmVyYWdlTWFwcGluZ1JlYWRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9Db3ZlcmFnZS9Db3ZlcmFnZU1hcHBpbmdSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzNlNTE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9Db3ZlcmFnZS9Db3ZlcmFnZU1hcHBpbmdSZWFkZXIuaApAQCAtMCwwICsxLDIxNyBAQAorLy89PT0tIENvdmVyYWdlTWFwcGluZ1JlYWRlci5oIC0gQ29kZSBjb3ZlcmFnZSBtYXBwaW5nIHJlYWRlciAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgc3VwcG9ydCBmb3IgcmVhZGluZyBjb3ZlcmFnZSBtYXBwaW5nIGRhdGEgZm9yCisvLyBpbnN0cnVtZW50YXRpb24gYmFzZWQgY292ZXJhZ2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1BST0ZJTEVEQVRBX0NPVkVSQUdFX0NPVkVSQUdFTUFQUElOR1JFQURFUl9ICisjZGVmaW5lIExMVk1fUFJPRklMRURBVEFfQ09WRVJBR0VfQ09WRVJBR0VNQVBQSU5HUkVBREVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9Qcm9maWxlRGF0YS9Db3ZlcmFnZS9Db3ZlcmFnZU1hcHBpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvdmVyYWdlIHsKKworY2xhc3MgQ292ZXJhZ2VNYXBwaW5nUmVhZGVyOworCisvLy8gXGJyaWVmIENvdmVyYWdlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGEgc2luZ2xlIGZ1bmN0aW9uLgorc3RydWN0IENvdmVyYWdlTWFwcGluZ1JlY29yZCB7CisgIFN0cmluZ1JlZiBGdW5jdGlvbk5hbWU7CisgIHVpbnQ2NF90IEZ1bmN0aW9uSGFzaDsKKyAgQXJyYXlSZWY8U3RyaW5nUmVmPiBGaWxlbmFtZXM7CisgIEFycmF5UmVmPENvdW50ZXJFeHByZXNzaW9uPiBFeHByZXNzaW9uczsKKyAgQXJyYXlSZWY8Q291bnRlck1hcHBpbmdSZWdpb24+IE1hcHBpbmdSZWdpb25zOworfTsKKworLy8vIFxicmllZiBBIGZpbGUgZm9ybWF0IGFnbm9zdGljIGl0ZXJhdG9yIG92ZXIgY292ZXJhZ2UgbWFwcGluZyBkYXRhLgorY2xhc3MgQ292ZXJhZ2VNYXBwaW5nSXRlcmF0b3IKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnLCBDb3ZlcmFnZU1hcHBpbmdSZWNvcmQ+IHsKKyAgQ292ZXJhZ2VNYXBwaW5nUmVhZGVyICpSZWFkZXI7CisgIENvdmVyYWdlTWFwcGluZ1JlY29yZCBSZWNvcmQ7CisgIGNvdmVyYWdlbWFwX2Vycm9yIFJlYWRFcnI7CisKKyAgdm9pZCBpbmNyZW1lbnQoKTsKKworcHVibGljOgorICBDb3ZlcmFnZU1hcHBpbmdJdGVyYXRvcigpCisgICAgICA6IFJlYWRlcihudWxscHRyKSwgUmVjb3JkKCksIFJlYWRFcnIoY292ZXJhZ2VtYXBfZXJyb3I6OnN1Y2Nlc3MpIHt9CisKKyAgQ292ZXJhZ2VNYXBwaW5nSXRlcmF0b3IoQ292ZXJhZ2VNYXBwaW5nUmVhZGVyICpSZWFkZXIpCisgICAgICA6IFJlYWRlcihSZWFkZXIpLCBSZWNvcmQoKSwgUmVhZEVycihjb3ZlcmFnZW1hcF9lcnJvcjo6c3VjY2VzcykgeworICAgIGluY3JlbWVudCgpOworICB9CisKKyAgfkNvdmVyYWdlTWFwcGluZ0l0ZXJhdG9yKCkgeworICAgIGlmIChSZWFkRXJyICE9IGNvdmVyYWdlbWFwX2Vycm9yOjpzdWNjZXNzKQorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBlcnJvciBpbiBjb3ZlcmFnZSBtYXBwaW5nIGl0ZXJhdG9yIik7CisgIH0KKworICBDb3ZlcmFnZU1hcHBpbmdJdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICBpbmNyZW1lbnQoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENvdmVyYWdlTWFwcGluZ0l0ZXJhdG9yICZSSFMpIHsKKyAgICByZXR1cm4gUmVhZGVyID09IFJIUy5SZWFkZXI7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENvdmVyYWdlTWFwcGluZ0l0ZXJhdG9yICZSSFMpIHsKKyAgICByZXR1cm4gUmVhZGVyICE9IFJIUy5SZWFkZXI7CisgIH0KKyAgRXhwZWN0ZWQ8Q292ZXJhZ2VNYXBwaW5nUmVjb3JkICY+IG9wZXJhdG9yKigpIHsKKyAgICBpZiAoUmVhZEVyciAhPSBjb3ZlcmFnZW1hcF9lcnJvcjo6c3VjY2VzcykgeworICAgICAgYXV0byBFID0gbWFrZV9lcnJvcjxDb3ZlcmFnZU1hcEVycm9yPihSZWFkRXJyKTsKKyAgICAgIFJlYWRFcnIgPSBjb3ZlcmFnZW1hcF9lcnJvcjo6c3VjY2VzczsKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoRSk7CisgICAgfQorICAgIHJldHVybiBSZWNvcmQ7CisgIH0KKyAgRXhwZWN0ZWQ8Q292ZXJhZ2VNYXBwaW5nUmVjb3JkICo+IG9wZXJhdG9yLT4oKSB7CisgICAgaWYgKFJlYWRFcnIgIT0gY292ZXJhZ2VtYXBfZXJyb3I6OnN1Y2Nlc3MpIHsKKyAgICAgIGF1dG8gRSA9IG1ha2VfZXJyb3I8Q292ZXJhZ2VNYXBFcnJvcj4oUmVhZEVycik7CisgICAgICBSZWFkRXJyID0gY292ZXJhZ2VtYXBfZXJyb3I6OnN1Y2Nlc3M7CisgICAgICByZXR1cm4gc3RkOjptb3ZlKEUpOworICAgIH0KKyAgICByZXR1cm4gJlJlY29yZDsKKyAgfQorfTsKKworY2xhc3MgQ292ZXJhZ2VNYXBwaW5nUmVhZGVyIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+Q292ZXJhZ2VNYXBwaW5nUmVhZGVyKCkgPSBkZWZhdWx0OworCisgIHZpcnR1YWwgRXJyb3IgcmVhZE5leHRSZWNvcmQoQ292ZXJhZ2VNYXBwaW5nUmVjb3JkICZSZWNvcmQpID0gMDsKKyAgQ292ZXJhZ2VNYXBwaW5nSXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBDb3ZlcmFnZU1hcHBpbmdJdGVyYXRvcih0aGlzKTsgfQorICBDb3ZlcmFnZU1hcHBpbmdJdGVyYXRvciBlbmQoKSB7IHJldHVybiBDb3ZlcmFnZU1hcHBpbmdJdGVyYXRvcigpOyB9Cit9OworCisvLy8gXGJyaWVmIEJhc2UgY2xhc3MgZm9yIHRoZSByYXcgY292ZXJhZ2UgbWFwcGluZyBhbmQgZmlsZW5hbWVzIGRhdGEgcmVhZGVycy4KK2NsYXNzIFJhd0NvdmVyYWdlUmVhZGVyIHsKK3Byb3RlY3RlZDoKKyAgU3RyaW5nUmVmIERhdGE7CisKKyAgUmF3Q292ZXJhZ2VSZWFkZXIoU3RyaW5nUmVmIERhdGEpIDogRGF0YShEYXRhKSB7fQorCisgIEVycm9yIHJlYWRVTEVCMTI4KHVpbnQ2NF90ICZSZXN1bHQpOworICBFcnJvciByZWFkSW50TWF4KHVpbnQ2NF90ICZSZXN1bHQsIHVpbnQ2NF90IE1heFBsdXMxKTsKKyAgRXJyb3IgcmVhZFNpemUodWludDY0X3QgJlJlc3VsdCk7CisgIEVycm9yIHJlYWRTdHJpbmcoU3RyaW5nUmVmICZSZXN1bHQpOworfTsKKworLy8vIFxicmllZiBSZWFkZXIgZm9yIHRoZSByYXcgY292ZXJhZ2UgZmlsZW5hbWVzLgorY2xhc3MgUmF3Q292ZXJhZ2VGaWxlbmFtZXNSZWFkZXIgOiBwdWJsaWMgUmF3Q292ZXJhZ2VSZWFkZXIgeworICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+ICZGaWxlbmFtZXM7CisKK3B1YmxpYzoKKyAgUmF3Q292ZXJhZ2VGaWxlbmFtZXNSZWFkZXIoU3RyaW5nUmVmIERhdGEsIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gJkZpbGVuYW1lcykKKyAgICAgIDogUmF3Q292ZXJhZ2VSZWFkZXIoRGF0YSksIEZpbGVuYW1lcyhGaWxlbmFtZXMpIHt9CisgIFJhd0NvdmVyYWdlRmlsZW5hbWVzUmVhZGVyKGNvbnN0IFJhd0NvdmVyYWdlRmlsZW5hbWVzUmVhZGVyICYpID0gZGVsZXRlOworICBSYXdDb3ZlcmFnZUZpbGVuYW1lc1JlYWRlciAmCisgIG9wZXJhdG9yPShjb25zdCBSYXdDb3ZlcmFnZUZpbGVuYW1lc1JlYWRlciAmKSA9IGRlbGV0ZTsKKworICBFcnJvciByZWFkKCk7Cit9OworCisvLy8gXGJyaWVmIENoZWNrcyBpZiB0aGUgZ2l2ZW4gY292ZXJhZ2UgbWFwcGluZyBkYXRhIGlzIGV4cG9ydGVkIGZvcgorLy8vIGFuIHVudXNlZCBmdW5jdGlvbi4KK2NsYXNzIFJhd0NvdmVyYWdlTWFwcGluZ0R1bW15Q2hlY2tlciA6IHB1YmxpYyBSYXdDb3ZlcmFnZVJlYWRlciB7CitwdWJsaWM6CisgIFJhd0NvdmVyYWdlTWFwcGluZ0R1bW15Q2hlY2tlcihTdHJpbmdSZWYgTWFwcGluZ0RhdGEpCisgICAgICA6IFJhd0NvdmVyYWdlUmVhZGVyKE1hcHBpbmdEYXRhKSB7fQorCisgIEV4cGVjdGVkPGJvb2w+IGlzRHVtbXkoKTsKK307CisKKy8vLyBcYnJpZWYgUmVhZGVyIGZvciB0aGUgcmF3IGNvdmVyYWdlIG1hcHBpbmcgZGF0YS4KK2NsYXNzIFJhd0NvdmVyYWdlTWFwcGluZ1JlYWRlciA6IHB1YmxpYyBSYXdDb3ZlcmFnZVJlYWRlciB7CisgIEFycmF5UmVmPFN0cmluZ1JlZj4gVHJhbnNsYXRpb25Vbml0RmlsZW5hbWVzOworICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+ICZGaWxlbmFtZXM7CisgIHN0ZDo6dmVjdG9yPENvdW50ZXJFeHByZXNzaW9uPiAmRXhwcmVzc2lvbnM7CisgIHN0ZDo6dmVjdG9yPENvdW50ZXJNYXBwaW5nUmVnaW9uPiAmTWFwcGluZ1JlZ2lvbnM7CisKK3B1YmxpYzoKKyAgUmF3Q292ZXJhZ2VNYXBwaW5nUmVhZGVyKFN0cmluZ1JlZiBNYXBwaW5nRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFN0cmluZ1JlZj4gVHJhbnNsYXRpb25Vbml0RmlsZW5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiAmRmlsZW5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q291bnRlckV4cHJlc3Npb24+ICZFeHByZXNzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENvdW50ZXJNYXBwaW5nUmVnaW9uPiAmTWFwcGluZ1JlZ2lvbnMpCisgICAgICA6IFJhd0NvdmVyYWdlUmVhZGVyKE1hcHBpbmdEYXRhKSwKKyAgICAgICAgVHJhbnNsYXRpb25Vbml0RmlsZW5hbWVzKFRyYW5zbGF0aW9uVW5pdEZpbGVuYW1lcyksCisgICAgICAgIEZpbGVuYW1lcyhGaWxlbmFtZXMpLCBFeHByZXNzaW9ucyhFeHByZXNzaW9ucyksCisgICAgICAgIE1hcHBpbmdSZWdpb25zKE1hcHBpbmdSZWdpb25zKSB7fQorICBSYXdDb3ZlcmFnZU1hcHBpbmdSZWFkZXIoY29uc3QgUmF3Q292ZXJhZ2VNYXBwaW5nUmVhZGVyICYpID0gZGVsZXRlOworICBSYXdDb3ZlcmFnZU1hcHBpbmdSZWFkZXIgJgorICBvcGVyYXRvcj0oY29uc3QgUmF3Q292ZXJhZ2VNYXBwaW5nUmVhZGVyICYpID0gZGVsZXRlOworCisgIEVycm9yIHJlYWQoKTsKKworcHJpdmF0ZToKKyAgRXJyb3IgZGVjb2RlQ291bnRlcih1bnNpZ25lZCBWYWx1ZSwgQ291bnRlciAmQyk7CisgIEVycm9yIHJlYWRDb3VudGVyKENvdW50ZXIgJkMpOworICBFcnJvcgorICByZWFkTWFwcGluZ1JlZ2lvbnNTdWJBcnJheShzdGQ6OnZlY3RvcjxDb3VudGVyTWFwcGluZ1JlZ2lvbj4gJk1hcHBpbmdSZWdpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmZlcnJlZEZpbGVJRCwgc2l6ZV90IE51bUZpbGVJRHMpOworfTsKKworLy8vIFxicmllZiBSZWFkZXIgZm9yIHRoZSBjb3ZlcmFnZSBtYXBwaW5nIGRhdGEgdGhhdCBpcyBlbWl0dGVkIGJ5IHRoZQorLy8vIGZyb250ZW5kIGFuZCBzdG9yZWQgaW4gYW4gb2JqZWN0IGZpbGUuCitjbGFzcyBCaW5hcnlDb3ZlcmFnZVJlYWRlciA6IHB1YmxpYyBDb3ZlcmFnZU1hcHBpbmdSZWFkZXIgeworcHVibGljOgorICBzdHJ1Y3QgUHJvZmlsZU1hcHBpbmdSZWNvcmQgeworICAgIENvdk1hcFZlcnNpb24gVmVyc2lvbjsKKyAgICBTdHJpbmdSZWYgRnVuY3Rpb25OYW1lOworICAgIHVpbnQ2NF90IEZ1bmN0aW9uSGFzaDsKKyAgICBTdHJpbmdSZWYgQ292ZXJhZ2VNYXBwaW5nOworICAgIHNpemVfdCBGaWxlbmFtZXNCZWdpbjsKKyAgICBzaXplX3QgRmlsZW5hbWVzU2l6ZTsKKworICAgIFByb2ZpbGVNYXBwaW5nUmVjb3JkKENvdk1hcFZlcnNpb24gVmVyc2lvbiwgU3RyaW5nUmVmIEZ1bmN0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBGdW5jdGlvbkhhc2gsIFN0cmluZ1JlZiBDb3ZlcmFnZU1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEZpbGVuYW1lc0JlZ2luLCBzaXplX3QgRmlsZW5hbWVzU2l6ZSkKKyAgICAgICAgOiBWZXJzaW9uKFZlcnNpb24pLCBGdW5jdGlvbk5hbWUoRnVuY3Rpb25OYW1lKSwKKyAgICAgICAgICBGdW5jdGlvbkhhc2goRnVuY3Rpb25IYXNoKSwgQ292ZXJhZ2VNYXBwaW5nKENvdmVyYWdlTWFwcGluZyksCisgICAgICAgICAgRmlsZW5hbWVzQmVnaW4oRmlsZW5hbWVzQmVnaW4pLCBGaWxlbmFtZXNTaXplKEZpbGVuYW1lc1NpemUpIHt9CisgIH07CisKK3ByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gRmlsZW5hbWVzOworICBzdGQ6OnZlY3RvcjxQcm9maWxlTWFwcGluZ1JlY29yZD4gTWFwcGluZ1JlY29yZHM7CisgIEluc3RyUHJvZlN5bXRhYiBQcm9maWxlTmFtZXM7CisgIHNpemVfdCBDdXJyZW50UmVjb3JkID0gMDsKKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBGdW5jdGlvbnNGaWxlbmFtZXM7CisgIHN0ZDo6dmVjdG9yPENvdW50ZXJFeHByZXNzaW9uPiBFeHByZXNzaW9uczsKKyAgc3RkOjp2ZWN0b3I8Q291bnRlck1hcHBpbmdSZWdpb24+IE1hcHBpbmdSZWdpb25zOworCisgIEJpbmFyeUNvdmVyYWdlUmVhZGVyKCkgPSBkZWZhdWx0OworCitwdWJsaWM6CisgIEJpbmFyeUNvdmVyYWdlUmVhZGVyKGNvbnN0IEJpbmFyeUNvdmVyYWdlUmVhZGVyICYpID0gZGVsZXRlOworICBCaW5hcnlDb3ZlcmFnZVJlYWRlciAmb3BlcmF0b3I9KGNvbnN0IEJpbmFyeUNvdmVyYWdlUmVhZGVyICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8QmluYXJ5Q292ZXJhZ2VSZWFkZXI+PgorICBjcmVhdGUoc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gJk9iamVjdEJ1ZmZlciwKKyAgICAgICAgIFN0cmluZ1JlZiBBcmNoKTsKKworICBFcnJvciByZWFkTmV4dFJlY29yZChDb3ZlcmFnZU1hcHBpbmdSZWNvcmQgJlJlY29yZCkgb3ZlcnJpZGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY292ZXJhZ2UKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1BST0ZJTEVEQVRBX0NPVkVSQUdFX0NPVkVSQUdFTUFQUElOR1JFQURFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL0NvdmVyYWdlL0NvdmVyYWdlTWFwcGluZ1dyaXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9Db3ZlcmFnZS9Db3ZlcmFnZU1hcHBpbmdXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmY4NjRhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9Db3ZlcmFnZS9Db3ZlcmFnZU1hcHBpbmdXcml0ZXIuaApAQCAtMCwwICsxLDYyIEBACisvLz09PS0gQ292ZXJhZ2VNYXBwaW5nV3JpdGVyLmggLSBDb2RlIGNvdmVyYWdlIG1hcHBpbmcgd3JpdGVyIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBzdXBwb3J0IGZvciB3cml0aW5nIGNvdmVyYWdlIG1hcHBpbmcgZGF0YSBmb3IKKy8vIGluc3RydW1lbnRhdGlvbiBiYXNlZCBjb3ZlcmFnZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fUFJPRklMRURBVEFfQ09WRVJBR0VfQ09WRVJBR0VNQVBQSU5HV1JJVEVSX0gKKyNkZWZpbmUgTExWTV9QUk9GSUxFREFUQV9DT1ZFUkFHRV9DT1ZFUkFHRU1BUFBJTkdXUklURVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL0NvdmVyYWdlL0NvdmVyYWdlTWFwcGluZy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCituYW1lc3BhY2UgY292ZXJhZ2UgeworCisvLy8gXGJyaWVmIFdyaXRlciBvZiB0aGUgZmlsZW5hbWVzIHNlY3Rpb24gZm9yIHRoZSBpbnN0cnVtZW50YXRpb24KKy8vLyBiYXNlZCBjb2RlIGNvdmVyYWdlLgorY2xhc3MgQ292ZXJhZ2VGaWxlbmFtZXNTZWN0aW9uV3JpdGVyIHsKKyAgQXJyYXlSZWY8U3RyaW5nUmVmPiBGaWxlbmFtZXM7CisKK3B1YmxpYzoKKyAgQ292ZXJhZ2VGaWxlbmFtZXNTZWN0aW9uV3JpdGVyKEFycmF5UmVmPFN0cmluZ1JlZj4gRmlsZW5hbWVzKQorICAgICAgOiBGaWxlbmFtZXMoRmlsZW5hbWVzKSB7fQorCisgIC8vLyBcYnJpZWYgV3JpdGUgZW5jb2RlZCBmaWxlbmFtZXMgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uCisgIHZvaWQgd3JpdGUocmF3X29zdHJlYW0gJk9TKTsKK307CisKKy8vLyBcYnJpZWYgV3JpdGVyIGZvciBpbnN0cnVtZW50YXRpb24gYmFzZWQgY292ZXJhZ2UgbWFwcGluZyBkYXRhLgorY2xhc3MgQ292ZXJhZ2VNYXBwaW5nV3JpdGVyIHsKKyAgQXJyYXlSZWY8dW5zaWduZWQ+IFZpcnR1YWxGaWxlTWFwcGluZzsKKyAgQXJyYXlSZWY8Q291bnRlckV4cHJlc3Npb24+IEV4cHJlc3Npb25zOworICBNdXRhYmxlQXJyYXlSZWY8Q291bnRlck1hcHBpbmdSZWdpb24+IE1hcHBpbmdSZWdpb25zOworCitwdWJsaWM6CisgIENvdmVyYWdlTWFwcGluZ1dyaXRlcihBcnJheVJlZjx1bnNpZ25lZD4gVmlydHVhbEZpbGVNYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q291bnRlckV4cHJlc3Npb24+IEV4cHJlc3Npb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgTXV0YWJsZUFycmF5UmVmPENvdW50ZXJNYXBwaW5nUmVnaW9uPiBNYXBwaW5nUmVnaW9ucykKKyAgICAgIDogVmlydHVhbEZpbGVNYXBwaW5nKFZpcnR1YWxGaWxlTWFwcGluZyksIEV4cHJlc3Npb25zKEV4cHJlc3Npb25zKSwKKyAgICAgICAgTWFwcGluZ1JlZ2lvbnMoTWFwcGluZ1JlZ2lvbnMpIHt9CisKKyAgLy8vIFxicmllZiBXcml0ZSBlbmNvZGVkIGNvdmVyYWdlIG1hcHBpbmcgZGF0YSB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KKyAgdm9pZCB3cml0ZShyYXdfb3N0cmVhbSAmT1MpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvdmVyYWdlCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1BST0ZJTEVEQVRBX0NPVkVSQUdFX0NPVkVSQUdFTUFQUElOR1dSSVRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL0dDT1YuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvR0NPVi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5N2Y4MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL0dDT1YuaApAQCAtMCwwICsxLDQ2MCBAQAorLy89PT0tIEdDT1YuaCAtIExMVk0gY292ZXJhZ2UgdG9vbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIHRvIHJlYWQgYW5kIHdyaXRlIGNvdmVyYWdlIGZpbGVzIHRoYXQKKy8vIHVzZSAnZ2NvdicgZm9ybWF0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9QUk9GSUxFREFUQV9HQ09WX0gKKyNkZWZpbmUgTExWTV9QUk9GSUxFREFUQV9HQ09WX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTWFwVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBHQ09WRnVuY3Rpb247CitjbGFzcyBHQ09WQmxvY2s7CitjbGFzcyBGaWxlSW5mbzsKKworbmFtZXNwYWNlIEdDT1YgeworCitlbnVtIEdDT1ZWZXJzaW9uIHsgVjQwMiwgVjQwNCwgVjcwNCB9OworCisvLy8gXGJyaWVmIEEgc3RydWN0IGZvciBwYXNzaW5nIGdjb3Ygb3B0aW9ucyBiZXR3ZWVuIGZ1bmN0aW9ucy4KK3N0cnVjdCBPcHRpb25zIHsKKyAgT3B0aW9ucyhib29sIEEsIGJvb2wgQiwgYm9vbCBDLCBib29sIEYsIGJvb2wgUCwgYm9vbCBVLCBib29sIEwsIGJvb2wgTikKKyAgICAgIDogQWxsQmxvY2tzKEEpLCBCcmFuY2hJbmZvKEIpLCBCcmFuY2hDb3VudChDKSwgRnVuY0NvdmVyYWdlKEYpLAorICAgICAgICBQcmVzZXJ2ZVBhdGhzKFApLCBVbmNvbmRCcmFuY2goVSksIExvbmdGaWxlTmFtZXMoTCksIE5vT3V0cHV0KE4pIHt9CisKKyAgYm9vbCBBbGxCbG9ja3M7CisgIGJvb2wgQnJhbmNoSW5mbzsKKyAgYm9vbCBCcmFuY2hDb3VudDsKKyAgYm9vbCBGdW5jQ292ZXJhZ2U7CisgIGJvb2wgUHJlc2VydmVQYXRoczsKKyAgYm9vbCBVbmNvbmRCcmFuY2g7CisgIGJvb2wgTG9uZ0ZpbGVOYW1lczsKKyAgYm9vbCBOb091dHB1dDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBHQ09WCisKKy8vLyBHQ09WQnVmZmVyIC0gQSB3cmFwcGVyIGFyb3VuZCBNZW1vcnlCdWZmZXIgdG8gcHJvdmlkZSBHQ09WIHNwZWNpZmljCisvLy8gcmVhZCBvcGVyYXRpb25zLgorY2xhc3MgR0NPVkJ1ZmZlciB7CitwdWJsaWM6CisgIEdDT1ZCdWZmZXIoTWVtb3J5QnVmZmVyICpCKSA6IEJ1ZmZlcihCKSB7fQorCisgIC8vLyByZWFkR0NOT0Zvcm1hdCAtIENoZWNrIEdDTk8gc2lnbmF0dXJlIGlzIHZhbGlkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYnVmZmVyLgorICBib29sIHJlYWRHQ05PRm9ybWF0KCkgeworICAgIFN0cmluZ1JlZiBGaWxlID0gQnVmZmVyLT5nZXRCdWZmZXIoKS5zbGljZSgwLCA0KTsKKyAgICBpZiAoRmlsZSAhPSAib25jZyIpIHsKKyAgICAgIGVycnMoKSA8PCAiVW5leHBlY3RlZCBmaWxlIHR5cGU6ICIgPDwgRmlsZSA8PCAiLlxuIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQ3Vyc29yID0gNDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyByZWFkR0NEQUZvcm1hdCAtIENoZWNrIEdDREEgc2lnbmF0dXJlIGlzIHZhbGlkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYnVmZmVyLgorICBib29sIHJlYWRHQ0RBRm9ybWF0KCkgeworICAgIFN0cmluZ1JlZiBGaWxlID0gQnVmZmVyLT5nZXRCdWZmZXIoKS5zbGljZSgwLCA0KTsKKyAgICBpZiAoRmlsZSAhPSAiYWRjZyIpIHsKKyAgICAgIGVycnMoKSA8PCAiVW5leHBlY3RlZCBmaWxlIHR5cGU6ICIgPDwgRmlsZSA8PCAiLlxuIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQ3Vyc29yID0gNDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyByZWFkR0NPVlZlcnNpb24gLSBSZWFkIEdDT1YgdmVyc2lvbi4KKyAgYm9vbCByZWFkR0NPVlZlcnNpb24oR0NPVjo6R0NPVlZlcnNpb24gJlZlcnNpb24pIHsKKyAgICBTdHJpbmdSZWYgVmVyc2lvblN0ciA9IEJ1ZmZlci0+Z2V0QnVmZmVyKCkuc2xpY2UoQ3Vyc29yLCBDdXJzb3IgKyA0KTsKKyAgICBpZiAoVmVyc2lvblN0ciA9PSAiKjIwNCIpIHsKKyAgICAgIEN1cnNvciArPSA0OworICAgICAgVmVyc2lvbiA9IEdDT1Y6OlY0MDI7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKFZlcnNpb25TdHIgPT0gIio0MDQiKSB7CisgICAgICBDdXJzb3IgKz0gNDsKKyAgICAgIFZlcnNpb24gPSBHQ09WOjpWNDA0OworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChWZXJzaW9uU3RyID09ICIqNzA0IikgeworICAgICAgQ3Vyc29yICs9IDQ7CisgICAgICBWZXJzaW9uID0gR0NPVjo6VjcwNDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBlcnJzKCkgPDwgIlVuZXhwZWN0ZWQgdmVyc2lvbjogIiA8PCBWZXJzaW9uU3RyIDw8ICIuXG4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyByZWFkRnVuY3Rpb25UYWcgLSBJZiBjdXJzb3IgcG9pbnRzIHRvIGEgZnVuY3Rpb24gdGFnIHRoZW4gaW5jcmVtZW50IHRoZQorICAvLy8gY3Vyc29yIGFuZCByZXR1cm4gdHJ1ZSBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLgorICBib29sIHJlYWRGdW5jdGlvblRhZygpIHsKKyAgICBTdHJpbmdSZWYgVGFnID0gQnVmZmVyLT5nZXRCdWZmZXIoKS5zbGljZShDdXJzb3IsIEN1cnNvciArIDQpOworICAgIGlmIChUYWcuZW1wdHkoKSB8fCBUYWdbMF0gIT0gJ1wwJyB8fCBUYWdbMV0gIT0gJ1wwJyB8fCBUYWdbMl0gIT0gJ1wwJyB8fAorICAgICAgICBUYWdbM10gIT0gJ1wxJykgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBDdXJzb3IgKz0gNDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyByZWFkQmxvY2tUYWcgLSBJZiBjdXJzb3IgcG9pbnRzIHRvIGEgYmxvY2sgdGFnIHRoZW4gaW5jcmVtZW50IHRoZQorICAvLy8gY3Vyc29yIGFuZCByZXR1cm4gdHJ1ZSBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLgorICBib29sIHJlYWRCbG9ja1RhZygpIHsKKyAgICBTdHJpbmdSZWYgVGFnID0gQnVmZmVyLT5nZXRCdWZmZXIoKS5zbGljZShDdXJzb3IsIEN1cnNvciArIDQpOworICAgIGlmIChUYWcuZW1wdHkoKSB8fCBUYWdbMF0gIT0gJ1wwJyB8fCBUYWdbMV0gIT0gJ1wwJyB8fCBUYWdbMl0gIT0gJ1x4NDEnIHx8CisgICAgICAgIFRhZ1szXSAhPSAnXHgwMScpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQ3Vyc29yICs9IDQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gcmVhZEVkZ2VUYWcgLSBJZiBjdXJzb3IgcG9pbnRzIHRvIGFuIGVkZ2UgdGFnIHRoZW4gaW5jcmVtZW50IHRoZQorICAvLy8gY3Vyc29yIGFuZCByZXR1cm4gdHJ1ZSBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLgorICBib29sIHJlYWRFZGdlVGFnKCkgeworICAgIFN0cmluZ1JlZiBUYWcgPSBCdWZmZXItPmdldEJ1ZmZlcigpLnNsaWNlKEN1cnNvciwgQ3Vyc29yICsgNCk7CisgICAgaWYgKFRhZy5lbXB0eSgpIHx8IFRhZ1swXSAhPSAnXDAnIHx8IFRhZ1sxXSAhPSAnXDAnIHx8IFRhZ1syXSAhPSAnXHg0MycgfHwKKyAgICAgICAgVGFnWzNdICE9ICdceDAxJykgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBDdXJzb3IgKz0gNDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyByZWFkTGluZVRhZyAtIElmIGN1cnNvciBwb2ludHMgdG8gYSBsaW5lIHRhZyB0aGVuIGluY3JlbWVudCB0aGUKKyAgLy8vIGN1cnNvciBhbmQgcmV0dXJuIHRydWUgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KKyAgYm9vbCByZWFkTGluZVRhZygpIHsKKyAgICBTdHJpbmdSZWYgVGFnID0gQnVmZmVyLT5nZXRCdWZmZXIoKS5zbGljZShDdXJzb3IsIEN1cnNvciArIDQpOworICAgIGlmIChUYWcuZW1wdHkoKSB8fCBUYWdbMF0gIT0gJ1wwJyB8fCBUYWdbMV0gIT0gJ1wwJyB8fCBUYWdbMl0gIT0gJ1x4NDUnIHx8CisgICAgICAgIFRhZ1szXSAhPSAnXHgwMScpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQ3Vyc29yICs9IDQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gcmVhZEFyY1RhZyAtIElmIGN1cnNvciBwb2ludHMgdG8gYW4gZ2NkYSBhcmMgdGFnIHRoZW4gaW5jcmVtZW50IHRoZQorICAvLy8gY3Vyc29yIGFuZCByZXR1cm4gdHJ1ZSBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLgorICBib29sIHJlYWRBcmNUYWcoKSB7CisgICAgU3RyaW5nUmVmIFRhZyA9IEJ1ZmZlci0+Z2V0QnVmZmVyKCkuc2xpY2UoQ3Vyc29yLCBDdXJzb3IgKyA0KTsKKyAgICBpZiAoVGFnLmVtcHR5KCkgfHwgVGFnWzBdICE9ICdcMCcgfHwgVGFnWzFdICE9ICdcMCcgfHwgVGFnWzJdICE9ICdceGExJyB8fAorICAgICAgICBUYWdbM10gIT0gJ1wxJykgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBDdXJzb3IgKz0gNDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyByZWFkT2JqZWN0VGFnIC0gSWYgY3Vyc29yIHBvaW50cyB0byBhbiBvYmplY3Qgc3VtbWFyeSB0YWcgdGhlbiBpbmNyZW1lbnQKKyAgLy8vIHRoZSBjdXJzb3IgYW5kIHJldHVybiB0cnVlIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuCisgIGJvb2wgcmVhZE9iamVjdFRhZygpIHsKKyAgICBTdHJpbmdSZWYgVGFnID0gQnVmZmVyLT5nZXRCdWZmZXIoKS5zbGljZShDdXJzb3IsIEN1cnNvciArIDQpOworICAgIGlmIChUYWcuZW1wdHkoKSB8fCBUYWdbMF0gIT0gJ1wwJyB8fCBUYWdbMV0gIT0gJ1wwJyB8fCBUYWdbMl0gIT0gJ1wwJyB8fAorICAgICAgICBUYWdbM10gIT0gJ1x4YTEnKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEN1cnNvciArPSA0OworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIHJlYWRQcm9ncmFtVGFnIC0gSWYgY3Vyc29yIHBvaW50cyB0byBhIHByb2dyYW0gc3VtbWFyeSB0YWcgdGhlbiBpbmNyZW1lbnQKKyAgLy8vIHRoZSBjdXJzb3IgYW5kIHJldHVybiB0cnVlIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuCisgIGJvb2wgcmVhZFByb2dyYW1UYWcoKSB7CisgICAgU3RyaW5nUmVmIFRhZyA9IEJ1ZmZlci0+Z2V0QnVmZmVyKCkuc2xpY2UoQ3Vyc29yLCBDdXJzb3IgKyA0KTsKKyAgICBpZiAoVGFnLmVtcHR5KCkgfHwgVGFnWzBdICE9ICdcMCcgfHwgVGFnWzFdICE9ICdcMCcgfHwgVGFnWzJdICE9ICdcMCcgfHwKKyAgICAgICAgVGFnWzNdICE9ICdceGEzJykgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBDdXJzb3IgKz0gNDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcmVhZEludCh1aW50MzJfdCAmVmFsKSB7CisgICAgaWYgKEJ1ZmZlci0+Z2V0QnVmZmVyKCkuc2l6ZSgpIDwgQ3Vyc29yICsgNCkgeworICAgICAgZXJycygpIDw8ICJVbmV4cGVjdGVkIGVuZCBvZiBtZW1vcnkgYnVmZmVyOiAiIDw8IEN1cnNvciArIDQgPDwgIi5cbiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFN0cmluZ1JlZiBTdHIgPSBCdWZmZXItPmdldEJ1ZmZlcigpLnNsaWNlKEN1cnNvciwgQ3Vyc29yICsgNCk7CisgICAgQ3Vyc29yICs9IDQ7CisgICAgVmFsID0gKihjb25zdCB1aW50MzJfdCAqKShTdHIuZGF0YSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcmVhZEludDY0KHVpbnQ2NF90ICZWYWwpIHsKKyAgICB1aW50MzJfdCBMbywgSGk7CisgICAgaWYgKCFyZWFkSW50KExvKSB8fCAhcmVhZEludChIaSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgVmFsID0gKCh1aW50NjRfdClIaSA8PCAzMikgfCBMbzsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcmVhZFN0cmluZyhTdHJpbmdSZWYgJlN0cikgeworICAgIHVpbnQzMl90IExlbiA9IDA7CisgICAgLy8gS2VlcCByZWFkaW5nIHVudGlsIHdlIGZpbmQgYSBub24temVybyBsZW5ndGguIFRoaXMgZW11bGF0ZXMgZ2NvdidzCisgICAgLy8gYmVoYXZpb3VyLCB3aGljaCBhcHBlYXJzIHRvIGRvIHRoZSBzYW1lLgorICAgIHdoaWxlIChMZW4gPT0gMCkKKyAgICAgIGlmICghcmVhZEludChMZW4pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgTGVuICo9IDQ7CisgICAgaWYgKEJ1ZmZlci0+Z2V0QnVmZmVyKCkuc2l6ZSgpIDwgQ3Vyc29yICsgTGVuKSB7CisgICAgICBlcnJzKCkgPDwgIlVuZXhwZWN0ZWQgZW5kIG9mIG1lbW9yeSBidWZmZXI6ICIgPDwgQ3Vyc29yICsgTGVuIDw8ICIuXG4iOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBTdHIgPSBCdWZmZXItPmdldEJ1ZmZlcigpLnNsaWNlKEN1cnNvciwgQ3Vyc29yICsgTGVuKS5zcGxpdCgnXDAnKS5maXJzdDsKKyAgICBDdXJzb3IgKz0gTGVuOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdWludDY0X3QgZ2V0Q3Vyc29yKCkgY29uc3QgeyByZXR1cm4gQ3Vyc29yOyB9CisgIHZvaWQgYWR2YW5jZUN1cnNvcih1aW50MzJfdCBuKSB7IEN1cnNvciArPSBuICogNDsgfQorCitwcml2YXRlOgorICBNZW1vcnlCdWZmZXIgKkJ1ZmZlcjsKKyAgdWludDY0X3QgQ3Vyc29yID0gMDsKK307CisKKy8vLyBHQ09WRmlsZSAtIENvbGxlY3RzIGNvdmVyYWdlIGluZm9ybWF0aW9uIGZvciBvbmUgcGFpciBvZiBjb3ZlcmFnZSBmaWxlCisvLy8gKC5nY25vIGFuZCAuZ2NkYSkuCitjbGFzcyBHQ09WRmlsZSB7CitwdWJsaWM6CisgIEdDT1ZGaWxlKCkgPSBkZWZhdWx0OworCisgIGJvb2wgcmVhZEdDTk8oR0NPVkJ1ZmZlciAmQnVmZmVyKTsKKyAgYm9vbCByZWFkR0NEQShHQ09WQnVmZmVyICZCdWZmZXIpOworICB1aW50MzJfdCBnZXRDaGVja3N1bSgpIGNvbnN0IHsgcmV0dXJuIENoZWNrc3VtOyB9CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisgIHZvaWQgY29sbGVjdExpbmVDb3VudHMoRmlsZUluZm8gJkZJKTsKKworcHJpdmF0ZToKKyAgYm9vbCBHQ05PSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgR0NPVjo6R0NPVlZlcnNpb24gVmVyc2lvbjsKKyAgdWludDMyX3QgQ2hlY2tzdW0gPSAwOworICBTbWFsbFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8R0NPVkZ1bmN0aW9uPiwgMTY+IEZ1bmN0aW9uczsKKyAgdWludDMyX3QgUnVuQ291bnQgPSAwOworICB1aW50MzJfdCBQcm9ncmFtQ291bnQgPSAwOworfTsKKworLy8vIEdDT1ZFZGdlIC0gQ29sbGVjdHMgZWRnZSBpbmZvcm1hdGlvbi4KK3N0cnVjdCBHQ09WRWRnZSB7CisgIEdDT1ZFZGdlKEdDT1ZCbG9jayAmUywgR0NPVkJsb2NrICZEKSA6IFNyYyhTKSwgRHN0KEQpIHt9CisKKyAgR0NPVkJsb2NrICZTcmM7CisgIEdDT1ZCbG9jayAmRHN0OworICB1aW50NjRfdCBDb3VudCA9IDA7Cit9OworCisvLy8gR0NPVkZ1bmN0aW9uIC0gQ29sbGVjdHMgZnVuY3Rpb24gaW5mb3JtYXRpb24uCitjbGFzcyBHQ09WRnVuY3Rpb24geworcHVibGljOgorICB1c2luZyBCbG9ja0l0ZXJhdG9yID0gcG9pbnRlZV9pdGVyYXRvcjxTbWFsbFZlY3RvckltcGw8CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8R0NPVkJsb2NrPj46OmNvbnN0X2l0ZXJhdG9yPjsKKworICBHQ09WRnVuY3Rpb24oR0NPVkZpbGUgJlApIDogUGFyZW50KFApIHt9CisKKyAgYm9vbCByZWFkR0NOTyhHQ09WQnVmZmVyICZCdWZmZXIsIEdDT1Y6OkdDT1ZWZXJzaW9uIFZlcnNpb24pOworICBib29sIHJlYWRHQ0RBKEdDT1ZCdWZmZXIgJkJ1ZmZlciwgR0NPVjo6R0NPVlZlcnNpb24gVmVyc2lvbik7CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorICBTdHJpbmdSZWYgZ2V0RmlsZW5hbWUoKSBjb25zdCB7IHJldHVybiBGaWxlbmFtZTsgfQorICBzaXplX3QgZ2V0TnVtQmxvY2tzKCkgY29uc3QgeyByZXR1cm4gQmxvY2tzLnNpemUoKTsgfQorICB1aW50NjRfdCBnZXRFbnRyeUNvdW50KCkgY29uc3Q7CisgIHVpbnQ2NF90IGdldEV4aXRDb3VudCgpIGNvbnN0OworCisgIEJsb2NrSXRlcmF0b3IgYmxvY2tfYmVnaW4oKSBjb25zdCB7IHJldHVybiBCbG9ja3MuYmVnaW4oKTsgfQorICBCbG9ja0l0ZXJhdG9yIGJsb2NrX2VuZCgpIGNvbnN0IHsgcmV0dXJuIEJsb2Nrcy5lbmQoKTsgfQorICBpdGVyYXRvcl9yYW5nZTxCbG9ja0l0ZXJhdG9yPiBibG9ja3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoYmxvY2tfYmVnaW4oKSwgYmxvY2tfZW5kKCkpOworICB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgdm9pZCBjb2xsZWN0TGluZUNvdW50cyhGaWxlSW5mbyAmRkkpOworCitwcml2YXRlOgorICBHQ09WRmlsZSAmUGFyZW50OworICB1aW50MzJfdCBJZGVudCA9IDA7CisgIHVpbnQzMl90IENoZWNrc3VtOworICB1aW50MzJfdCBMaW5lTnVtYmVyID0gMDsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIFN0cmluZ1JlZiBGaWxlbmFtZTsKKyAgU21hbGxWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEdDT1ZCbG9jaz4sIDE2PiBCbG9ja3M7CisgIFNtYWxsVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxHQ09WRWRnZT4sIDE2PiBFZGdlczsKK307CisKKy8vLyBHQ09WQmxvY2sgLSBDb2xsZWN0cyBibG9jayBpbmZvcm1hdGlvbi4KK2NsYXNzIEdDT1ZCbG9jayB7CisgIHN0cnVjdCBFZGdlV2VpZ2h0IHsKKyAgICBFZGdlV2VpZ2h0KEdDT1ZCbG9jayAqRCkgOiBEc3QoRCkge30KKworICAgIEdDT1ZCbG9jayAqRHN0OworICAgIHVpbnQ2NF90IENvdW50ID0gMDsKKyAgfTsKKworICBzdHJ1Y3QgU29ydERzdEVkZ2VzRnVuY3RvciB7CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEdDT1ZFZGdlICpFMSwgY29uc3QgR0NPVkVkZ2UgKkUyKSB7CisgICAgICByZXR1cm4gRTEtPkRzdC5OdW1iZXIgPCBFMi0+RHN0Lk51bWJlcjsKKyAgICB9CisgIH07CisKK3B1YmxpYzoKKyAgdXNpbmcgRWRnZUl0ZXJhdG9yID0gU21hbGxWZWN0b3JJbXBsPEdDT1ZFZGdlICo+Ojpjb25zdF9pdGVyYXRvcjsKKworICBHQ09WQmxvY2soR0NPVkZ1bmN0aW9uICZQLCB1aW50MzJfdCBOKSA6IFBhcmVudChQKSwgTnVtYmVyKE4pIHt9CisgIH5HQ09WQmxvY2soKTsKKworICBjb25zdCBHQ09WRnVuY3Rpb24gJmdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIFBhcmVudDsgfQorICB2b2lkIGFkZExpbmUodWludDMyX3QgTikgeyBMaW5lcy5wdXNoX2JhY2soTik7IH0KKyAgdWludDMyX3QgZ2V0TGFzdExpbmUoKSBjb25zdCB7IHJldHVybiBMaW5lcy5iYWNrKCk7IH0KKyAgdm9pZCBhZGRDb3VudChzaXplX3QgRHN0RWRnZU5vLCB1aW50NjRfdCBOKTsKKyAgdWludDY0X3QgZ2V0Q291bnQoKSBjb25zdCB7IHJldHVybiBDb3VudGVyOyB9CisKKyAgdm9pZCBhZGRTcmNFZGdlKEdDT1ZFZGdlICpFZGdlKSB7CisgICAgYXNzZXJ0KCZFZGdlLT5Ec3QgPT0gdGhpcyk7IC8vIHVwIHRvIGNhbGxlciB0byBlbnN1cmUgZWRnZSBpcyB2YWxpZAorICAgIFNyY0VkZ2VzLnB1c2hfYmFjayhFZGdlKTsKKyAgfQorCisgIHZvaWQgYWRkRHN0RWRnZShHQ09WRWRnZSAqRWRnZSkgeworICAgIGFzc2VydCgmRWRnZS0+U3JjID09IHRoaXMpOyAvLyB1cCB0byBjYWxsZXIgdG8gZW5zdXJlIGVkZ2UgaXMgdmFsaWQKKyAgICAvLyBDaGVjayBpZiBhZGRpbmcgdGhpcyBlZGdlIGNhdXNlcyBsaXN0IHRvIGJlY29tZSB1bnNvcnRlZC4KKyAgICBpZiAoRHN0RWRnZXMuc2l6ZSgpICYmIERzdEVkZ2VzLmJhY2soKS0+RHN0Lk51bWJlciA+IEVkZ2UtPkRzdC5OdW1iZXIpCisgICAgICBEc3RFZGdlc0FyZVNvcnRlZCA9IGZhbHNlOworICAgIERzdEVkZ2VzLnB1c2hfYmFjayhFZGdlKTsKKyAgfQorCisgIHNpemVfdCBnZXROdW1TcmNFZGdlcygpIGNvbnN0IHsgcmV0dXJuIFNyY0VkZ2VzLnNpemUoKTsgfQorICBzaXplX3QgZ2V0TnVtRHN0RWRnZXMoKSBjb25zdCB7IHJldHVybiBEc3RFZGdlcy5zaXplKCk7IH0KKyAgdm9pZCBzb3J0RHN0RWRnZXMoKTsKKworICBFZGdlSXRlcmF0b3Igc3JjX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gU3JjRWRnZXMuYmVnaW4oKTsgfQorICBFZGdlSXRlcmF0b3Igc3JjX2VuZCgpIGNvbnN0IHsgcmV0dXJuIFNyY0VkZ2VzLmVuZCgpOyB9CisgIGl0ZXJhdG9yX3JhbmdlPEVkZ2VJdGVyYXRvcj4gc3JjcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShzcmNfYmVnaW4oKSwgc3JjX2VuZCgpKTsKKyAgfQorCisgIEVkZ2VJdGVyYXRvciBkc3RfYmVnaW4oKSBjb25zdCB7IHJldHVybiBEc3RFZGdlcy5iZWdpbigpOyB9CisgIEVkZ2VJdGVyYXRvciBkc3RfZW5kKCkgY29uc3QgeyByZXR1cm4gRHN0RWRnZXMuZW5kKCk7IH0KKyAgaXRlcmF0b3JfcmFuZ2U8RWRnZUl0ZXJhdG9yPiBkc3RzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGRzdF9iZWdpbigpLCBkc3RfZW5kKCkpOworICB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgdm9pZCBjb2xsZWN0TGluZUNvdW50cyhGaWxlSW5mbyAmRkkpOworCitwcml2YXRlOgorICBHQ09WRnVuY3Rpb24gJlBhcmVudDsKKyAgdWludDMyX3QgTnVtYmVyOworICB1aW50NjRfdCBDb3VudGVyID0gMDsKKyAgYm9vbCBEc3RFZGdlc0FyZVNvcnRlZCA9IHRydWU7CisgIFNtYWxsVmVjdG9yPEdDT1ZFZGdlICosIDE2PiBTcmNFZGdlczsKKyAgU21hbGxWZWN0b3I8R0NPVkVkZ2UgKiwgMTY+IERzdEVkZ2VzOworICBTbWFsbFZlY3Rvcjx1aW50MzJfdCwgMTY+IExpbmVzOworfTsKKworY2xhc3MgRmlsZUluZm8geworICAvLyBJdCBpcyB1bmxpa2VseS0tYnV0IHBvc3NpYmxlLS1mb3IgbXVsdGlwbGUgZnVuY3Rpb25zIHRvIGJlIG9uIHRoZSBzYW1lCisgIC8vIGxpbmUuCisgIC8vIFRoZXJlZm9yZSB0aGlzIHR5cGVkZWYgYWxsb3dzIExpbmVEYXRhLkZ1bmN0aW9ucyB0byBzdG9yZSBtdWx0aXBsZQorICAvLyBmdW5jdGlvbnMKKyAgLy8gcGVyIGluc3RhbmNlLiBUaGlzIGlzIHJhcmUsIGhvd2V2ZXIsIHNvIG9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2UuCisgIHVzaW5nIEZ1bmN0aW9uVmVjdG9yID0gU21hbGxWZWN0b3I8Y29uc3QgR0NPVkZ1bmN0aW9uICosIDE+OworICB1c2luZyBGdW5jdGlvbkxpbmVzID0gRGVuc2VNYXA8dWludDMyX3QsIEZ1bmN0aW9uVmVjdG9yPjsKKyAgdXNpbmcgQmxvY2tWZWN0b3IgPSBTbWFsbFZlY3Rvcjxjb25zdCBHQ09WQmxvY2sgKiwgND47CisgIHVzaW5nIEJsb2NrTGluZXMgPSBEZW5zZU1hcDx1aW50MzJfdCwgQmxvY2tWZWN0b3I+OworCisgIHN0cnVjdCBMaW5lRGF0YSB7CisgICAgTGluZURhdGEoKSA9IGRlZmF1bHQ7CisKKyAgICBCbG9ja0xpbmVzIEJsb2NrczsKKyAgICBGdW5jdGlvbkxpbmVzIEZ1bmN0aW9uczsKKyAgICB1aW50MzJfdCBMYXN0TGluZSA9IDA7CisgIH07CisKKyAgc3RydWN0IEdDT1ZDb3ZlcmFnZSB7CisgICAgR0NPVkNvdmVyYWdlKFN0cmluZ1JlZiBOYW1lKSA6IE5hbWUoTmFtZSkge30KKworICAgIFN0cmluZ1JlZiBOYW1lOworCisgICAgdWludDMyX3QgTG9naWNhbExpbmVzID0gMDsKKyAgICB1aW50MzJfdCBMaW5lc0V4ZWMgPSAwOworCisgICAgdWludDMyX3QgQnJhbmNoZXMgPSAwOworICAgIHVpbnQzMl90IEJyYW5jaGVzRXhlYyA9IDA7CisgICAgdWludDMyX3QgQnJhbmNoZXNUYWtlbiA9IDA7CisgIH07CisKK3B1YmxpYzoKKyAgRmlsZUluZm8oY29uc3QgR0NPVjo6T3B0aW9ucyAmT3B0aW9ucykgOiBPcHRpb25zKE9wdGlvbnMpIHt9CisKKyAgdm9pZCBhZGRCbG9ja0xpbmUoU3RyaW5nUmVmIEZpbGVuYW1lLCB1aW50MzJfdCBMaW5lLCBjb25zdCBHQ09WQmxvY2sgKkJsb2NrKSB7CisgICAgaWYgKExpbmUgPiBMaW5lSW5mb1tGaWxlbmFtZV0uTGFzdExpbmUpCisgICAgICBMaW5lSW5mb1tGaWxlbmFtZV0uTGFzdExpbmUgPSBMaW5lOworICAgIExpbmVJbmZvW0ZpbGVuYW1lXS5CbG9ja3NbTGluZSAtIDFdLnB1c2hfYmFjayhCbG9jayk7CisgIH0KKworICB2b2lkIGFkZEZ1bmN0aW9uTGluZShTdHJpbmdSZWYgRmlsZW5hbWUsIHVpbnQzMl90IExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdDT1ZGdW5jdGlvbiAqRnVuY3Rpb24pIHsKKyAgICBpZiAoTGluZSA+IExpbmVJbmZvW0ZpbGVuYW1lXS5MYXN0TGluZSkKKyAgICAgIExpbmVJbmZvW0ZpbGVuYW1lXS5MYXN0TGluZSA9IExpbmU7CisgICAgTGluZUluZm9bRmlsZW5hbWVdLkZ1bmN0aW9uc1tMaW5lIC0gMV0ucHVzaF9iYWNrKEZ1bmN0aW9uKTsKKyAgfQorCisgIHZvaWQgc2V0UnVuQ291bnQodWludDMyX3QgUnVucykgeyBSdW5Db3VudCA9IFJ1bnM7IH0KKyAgdm9pZCBzZXRQcm9ncmFtQ291bnQodWludDMyX3QgUHJvZ3JhbXMpIHsgUHJvZ3JhbUNvdW50ID0gUHJvZ3JhbXM7IH0KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIFN0cmluZ1JlZiBNYWluRmlsZW5hbWUsIFN0cmluZ1JlZiBHQ05PRmlsZSwKKyAgICAgICAgICAgICBTdHJpbmdSZWYgR0NEQUZpbGUpOworCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBnZXRDb3ZlcmFnZVBhdGgoU3RyaW5nUmVmIEZpbGVuYW1lLCBTdHJpbmdSZWYgTWFpbkZpbGVuYW1lKTsKKyAgc3RkOjp1bmlxdWVfcHRyPHJhd19vc3RyZWFtPiBvcGVuQ292ZXJhZ2VQYXRoKFN0cmluZ1JlZiBDb3ZlcmFnZVBhdGgpOworICB2b2lkIHByaW50RnVuY3Rpb25TdW1tYXJ5KHJhd19vc3RyZWFtICZPUywgY29uc3QgRnVuY3Rpb25WZWN0b3IgJkZ1bmNzKSBjb25zdDsKKyAgdm9pZCBwcmludEJsb2NrSW5mbyhyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEdDT1ZCbG9jayAmQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTGluZUluZGV4LCB1aW50MzJfdCAmQmxvY2tObykgY29uc3Q7CisgIHZvaWQgcHJpbnRCcmFuY2hJbmZvKHJhd19vc3RyZWFtICZPUywgY29uc3QgR0NPVkJsb2NrICZCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgR0NPVkNvdmVyYWdlICZDb3ZlcmFnZSwgdWludDMyX3QgJkVkZ2VObyk7CisgIHZvaWQgcHJpbnRVbmNvbmRCcmFuY2hJbmZvKHJhd19vc3RyZWFtICZPUywgdWludDMyX3QgJkVkZ2VObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQ291bnQpIGNvbnN0OworCisgIHZvaWQgcHJpbnRDb3ZlcmFnZShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEdDT1ZDb3ZlcmFnZSAmQ292ZXJhZ2UpIGNvbnN0OworICB2b2lkIHByaW50RnVuY0NvdmVyYWdlKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgcHJpbnRGaWxlQ292ZXJhZ2UocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICBjb25zdCBHQ09WOjpPcHRpb25zICZPcHRpb25zOworICBTdHJpbmdNYXA8TGluZURhdGE+IExpbmVJbmZvOworICB1aW50MzJfdCBSdW5Db3VudCA9IDA7CisgIHVpbnQzMl90IFByb2dyYW1Db3VudCA9IDA7CisKKyAgdXNpbmcgRmlsZUNvdmVyYWdlTGlzdCA9IFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgR0NPVkNvdmVyYWdlPiwgND47CisgIHVzaW5nIEZ1bmNDb3ZlcmFnZU1hcCA9IE1hcFZlY3Rvcjxjb25zdCBHQ09WRnVuY3Rpb24gKiwgR0NPVkNvdmVyYWdlPjsKKworICBGaWxlQ292ZXJhZ2VMaXN0IEZpbGVDb3ZlcmFnZXM7CisgIEZ1bmNDb3ZlcmFnZU1hcCBGdW5jQ292ZXJhZ2VzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9HQ09WX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YWUwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZi5oCkBAIC0wLDAgKzEsMTA0NiBAQAorLy89PT0tIEluc3RyUHJvZi5oIC0gSW5zdHJ1bWVudGVkIHByb2ZpbGluZyBmb3JtYXQgc3VwcG9ydCAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJbnN0cnVtZW50YXRpb24tYmFzZWQgcHJvZmlsaW5nIGRhdGEgaXMgZ2VuZXJhdGVkIGJ5IGluc3RydW1lbnRlZAorLy8gYmluYXJpZXMgdGhyb3VnaCBsaWJyYXJ5IGZ1bmN0aW9ucyBpbiBjb21waWxlci1ydCwgYW5kIHJlYWQgYnkgdGhlIGNsYW5nCisvLyBmcm9udGVuZCB0byBmZWVkIFBHTy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fUFJPRklMRURBVEFfSU5TVFJQUk9GX0gKKyNkZWZpbmUgTExWTV9QUk9GSUxFREFUQV9JTlNUUlBST0ZfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Qcm9maWxlU3VtbWFyeS5oIgorI2luY2x1ZGUgImxsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mRGF0YS5pbmMiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0hvc3QuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTUQ1LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgR2xvYmFsVmFyaWFibGU7CitzdHJ1Y3QgSW5zdHJQcm9mUmVjb3JkOworY2xhc3MgSW5zdHJQcm9mU3ltdGFiOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBNRE5vZGU7CitjbGFzcyBNb2R1bGU7CisKK2VudW0gSW5zdHJQcm9mU2VjdEtpbmQgeworI2RlZmluZSBJTlNUUl9QUk9GX1NFQ1RfRU5UUlkoS2luZCwgU2VjdE5hbWVDb21tb24sIFNlY3ROYW1lQ29mZiwgUHJlZml4KSBLaW5kLAorI2luY2x1ZGUgImxsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mRGF0YS5pbmMiCit9OworCisvLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcm9maWxlIHNlY3Rpb24gY29ycmVzcG9uZGluZyB0byBccCBJUFNLLgorLy8vCisvLy8gVGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gZGVwZW5kcyBvbiB0aGUgb2JqZWN0IGZvcm1hdCB0eXBlIFxwIE9GLiBJZgorLy8vIFxwIEFkZFNlZ21lbnRJbmZvIGlzIHRydWUsIGEgc2VnbWVudCBwcmVmaXggYW5kIGFkZGl0aW9uYWwgbGlua2VyIGhpbnRzIG1heQorLy8vIGJlIGFkZGVkIHRvIHRoZSBzZWN0aW9uIG5hbWUgKHRoaXMgaXMgdGhlIGRlZmF1bHQpLgorc3RkOjpzdHJpbmcgZ2V0SW5zdHJQcm9mU2VjdGlvbk5hbWUoSW5zdHJQcm9mU2VjdEtpbmQgSVBTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaXBsZTo6T2JqZWN0Rm9ybWF0VHlwZSBPRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWRkU2VnbWVudEluZm8gPSB0cnVlKTsKKworLy8vIFJldHVybiB0aGUgbmFtZSBwcm9maWxlIHJ1bnRpbWUgZW50cnkgcG9pbnQgdG8gZG8gdmFsdWUgcHJvZmlsaW5nCisvLy8gZm9yIGEgZ2l2ZW4gc2l0ZS4KK2lubGluZSBTdHJpbmdSZWYgZ2V0SW5zdHJQcm9mVmFsdWVQcm9mRnVuY05hbWUoKSB7CisgIHJldHVybiBJTlNUUl9QUk9GX1ZBTFVFX1BST0ZfRlVOQ19TVFI7Cit9CisKKy8vLyBSZXR1cm4gdGhlIG5hbWUgcHJvZmlsZSBydW50aW1lIGVudHJ5IHBvaW50IHRvIGRvIHZhbHVlIHJhbmdlIHByb2ZpbGluZy4KK2lubGluZSBTdHJpbmdSZWYgZ2V0SW5zdHJQcm9mVmFsdWVSYW5nZVByb2ZGdW5jTmFtZSgpIHsKKyAgcmV0dXJuIElOU1RSX1BST0ZfVkFMVUVfUkFOR0VfUFJPRl9GVU5DX1NUUjsKK30KKworLy8vIFJldHVybiB0aGUgbmFtZSBwcmVmaXggb2YgdmFyaWFibGVzIGNvbnRhaW5pbmcgaW5zdHJ1bWVudGVkIGZ1bmN0aW9uIG5hbWVzLgoraW5saW5lIFN0cmluZ1JlZiBnZXRJbnN0clByb2ZOYW1lVmFyUHJlZml4KCkgeyByZXR1cm4gIl9fcHJvZm5fIjsgfQorCisvLy8gUmV0dXJuIHRoZSBuYW1lIHByZWZpeCBvZiB2YXJpYWJsZXMgY29udGFpbmluZyBwZXItZnVuY3Rpb24gY29udHJvbCBkYXRhLgoraW5saW5lIFN0cmluZ1JlZiBnZXRJbnN0clByb2ZEYXRhVmFyUHJlZml4KCkgeyByZXR1cm4gIl9fcHJvZmRfIjsgfQorCisvLy8gUmV0dXJuIHRoZSBuYW1lIHByZWZpeCBvZiBwcm9maWxlIGNvdW50ZXIgdmFyaWFibGVzLgoraW5saW5lIFN0cmluZ1JlZiBnZXRJbnN0clByb2ZDb3VudGVyc1ZhclByZWZpeCgpIHsgcmV0dXJuICJfX3Byb2ZjXyI7IH0KKworLy8vIFJldHVybiB0aGUgbmFtZSBwcmVmaXggb2YgdmFsdWUgcHJvZmlsZSB2YXJpYWJsZXMuCitpbmxpbmUgU3RyaW5nUmVmIGdldEluc3RyUHJvZlZhbHVlc1ZhclByZWZpeCgpIHsgcmV0dXJuICJfX3Byb2Z2cF8iOyB9CisKKy8vLyBSZXR1cm4gdGhlIG5hbWUgb2YgdmFsdWUgcHJvZmlsZSBub2RlIGFycmF5IHZhcmlhYmxlczoKK2lubGluZSBTdHJpbmdSZWYgZ2V0SW5zdHJQcm9mVk5vZGVzVmFyTmFtZSgpIHsgcmV0dXJuICJfX2xsdm1fcHJmX3Zub2RlcyI7IH0KKworLy8vIFJldHVybiB0aGUgbmFtZSBwcmVmaXggb2YgdGhlIENPTURBVCBncm91cCBmb3IgaW5zdHJ1bWVudGF0aW9uIHZhcmlhYmxlcworLy8vIGFzc29jaWF0ZWQgd2l0aCBhIENPTURBVCBmdW5jdGlvbi4KK2lubGluZSBTdHJpbmdSZWYgZ2V0SW5zdHJQcm9mQ29tZGF0UHJlZml4KCkgeyByZXR1cm4gIl9fcHJvZnZfIjsgfQorCisvLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBob2xkaW5nIHRoZSBzdHJpbmdzIChwb3NzaWJseSBjb21wcmVzc2VkKQorLy8vIG9mIGFsbCBmdW5jdGlvbidzIFBHTyBuYW1lcy4KK2lubGluZSBTdHJpbmdSZWYgZ2V0SW5zdHJQcm9mTmFtZXNWYXJOYW1lKCkgeworICByZXR1cm4gIl9fbGx2bV9wcmZfbm0iOworfQorCisvLy8gUmV0dXJuIHRoZSBuYW1lIG9mIGEgY292YXJhZ2UgbWFwcGluZyB2YXJpYWJsZSAoaW50ZXJuYWwgbGlua2FnZSkKKy8vLyBmb3IgZWFjaCBpbnN0cnVtZW50ZWQgc291cmNlIG1vZHVsZS4gU3VjaCB2YXJpYWJsZXMgYXJlIGFsbG9jYXRlZAorLy8vIGluIHRoZSBfX2xsdm1fY292bWFwIHNlY3Rpb24uCitpbmxpbmUgU3RyaW5nUmVmIGdldENvdmVyYWdlTWFwcGluZ1Zhck5hbWUoKSB7CisgIHJldHVybiAiX19sbHZtX2NvdmVyYWdlX21hcHBpbmciOworfQorCisvLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBpbnRlcm5hbCB2YXJpYWJsZSByZWNvcmRpbmcgdGhlIGFycmF5CisvLy8gb2YgUEdPIG5hbWUgdmFycyByZWZlcmVuY2VkIGJ5IHRoZSBjb3ZlcmFnZSBtYXBwaW5nLiBUaGUgb3duaW5nCisvLy8gZnVuY3Rpb25zIG9mIHRob3NlIG5hbWVzIGFyZSBub3QgZW1pdHRlZCBieSBGRSAoZS5nLCB1bnVzZWQgaW5saW5lCisvLy8gZnVuY3Rpb25zLikKK2lubGluZSBTdHJpbmdSZWYgZ2V0Q292ZXJhZ2VVbnVzZWROYW1lc1Zhck5hbWUoKSB7CisgIHJldHVybiAiX19sbHZtX2NvdmVyYWdlX25hbWVzIjsKK30KKworLy8vIFJldHVybiB0aGUgbmFtZSBvZiBmdW5jdGlvbiB0aGF0IHJlZ2lzdGVycyBhbGwgdGhlIHBlci1mdW5jdGlvbiBjb250cm9sCisvLy8gZGF0YSBhdCBwcm9ncmFtIHN0YXJ0dXAgdGltZSBieSBjYWxsaW5nIF9fbGx2bV9yZWdpc3Rlcl9mdW5jdGlvbi4gVGhpcworLy8vIGZ1bmN0aW9uIGhhcyBpbnRlcm5hbCBsaW5rYWdlIGFuZCBpcyBjYWxsZWQgYnkgIF9fbGx2bV9wcm9maWxlX2luaXQKKy8vLyBydW50aW1lIG1ldGhvZC4gVGhpcyBmdW5jdGlvbiBpcyBub3QgZ2VuZXJhdGVkIGZvciB0aGVzZSBwbGF0Zm9ybXM6CisvLy8gRGFyd2luLCBMaW51eCwgYW5kIEZyZWVCU0QuCitpbmxpbmUgU3RyaW5nUmVmIGdldEluc3RyUHJvZlJlZ0Z1bmNzTmFtZSgpIHsKKyAgcmV0dXJuICJfX2xsdm1fcHJvZmlsZV9yZWdpc3Rlcl9mdW5jdGlvbnMiOworfQorCisvLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBydW50aW1lIGludGVyZmFjZSB0aGF0IHJlZ2lzdGVycyBwZXItZnVuY3Rpb24gY29udHJvbAorLy8vIGRhdGEgZm9yIG9uZSBpbnN0cnVtZW50ZWQgZnVuY3Rpb24uCitpbmxpbmUgU3RyaW5nUmVmIGdldEluc3RyUHJvZlJlZ0Z1bmNOYW1lKCkgeworICByZXR1cm4gIl9fbGx2bV9wcm9maWxlX3JlZ2lzdGVyX2Z1bmN0aW9uIjsKK30KKworLy8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcnVudGltZSBpbnRlcmZhY2UgdGhhdCByZWdpc3RlcnMgdGhlIFBHTyBuYW1lIHN0cmluZ3MuCitpbmxpbmUgU3RyaW5nUmVmIGdldEluc3RyUHJvZk5hbWVzUmVnRnVuY05hbWUoKSB7CisgIHJldHVybiAiX19sbHZtX3Byb2ZpbGVfcmVnaXN0ZXJfbmFtZXNfZnVuY3Rpb24iOworfQorCisvLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBydW50aW1lIGluaXRpYWxpemF0aW9uIG1ldGhvZCB0aGF0IGlzIGdlbmVyYXRlZCBieQorLy8vIHRoZSBjb21waWxlci4gVGhlIGZ1bmN0aW9uIGNhbGxzIF9fbGx2bV9wcm9maWxlX3JlZ2lzdGVyX2Z1bmN0aW9ucyBhbmQKKy8vLyBfX2xsdm1fcHJvZmlsZV9vdmVycmlkZV9kZWZhdWx0X2ZpbGVuYW1lIGZ1bmN0aW9ucyBpZiBuZWVkZWQuIFRoaXMgZnVuY3Rpb24KKy8vLyBoYXMgaW50ZXJuYWwgbGlua2FnZSBhbmQgaW52b2tlZCBhdCBzdGFydHVwIHRpbWUgdmlhIGluaXRfYXJyYXkuCitpbmxpbmUgU3RyaW5nUmVmIGdldEluc3RyUHJvZkluaXRGdW5jTmFtZSgpIHsgcmV0dXJuICJfX2xsdm1fcHJvZmlsZV9pbml0IjsgfQorCisvLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBob29rIHZhcmlhYmxlIGRlZmluZWQgaW4gcHJvZmlsZSBydW50aW1lIGxpYnJhcnkuCisvLy8gQSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIGNhdXNlcyB0aGUgbGlua2VyIHRvIGxpbmsgaW4gdGhlIHJ1bnRpbWUKKy8vLyBpbml0aWFsaXphdGlvbiBtb2R1bGUgKHdoaWNoIGRlZmluZXMgdGhlIGhvb2sgdmFyaWFibGUpLgoraW5saW5lIFN0cmluZ1JlZiBnZXRJbnN0clByb2ZSdW50aW1lSG9va1Zhck5hbWUoKSB7CisgIHJldHVybiBJTlNUUl9QUk9GX1FVT1RFKElOU1RSX1BST0ZfUFJPRklMRV9SVU5USU1FX1ZBUik7Cit9CisKKy8vLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVyIGdlbmVyYXRlZCBmdW5jdGlvbiB0aGF0IHJlZmVyZW5jZXMgdGhlCisvLy8gcnVudGltZSBob29rIHZhcmlhYmxlLiBUaGUgZnVuY3Rpb24gaXMgYSB3ZWFrIGdsb2JhbC4KK2lubGluZSBTdHJpbmdSZWYgZ2V0SW5zdHJQcm9mUnVudGltZUhvb2tWYXJVc2VGdW5jTmFtZSgpIHsKKyAgcmV0dXJuICJfX2xsdm1fcHJvZmlsZV9ydW50aW1lX3VzZXIiOworfQorCisvLy8gUmV0dXJuIHRoZSBtYXJrZXIgdXNlZCB0byBzZXBhcmF0ZSBQR08gbmFtZXMgZHVyaW5nIHNlcmlhbGl6YXRpb24uCitpbmxpbmUgU3RyaW5nUmVmIGdldEluc3RyUHJvZk5hbWVTZXBhcmF0b3IoKSB7IHJldHVybiAiXDAxIjsgfQorCisvLy8gUmV0dXJuIHRoZSBtb2RpZmllZCBuYW1lIGZvciBmdW5jdGlvbiBcYyBGIHN1aXRhYmxlIHRvIGJlCisvLy8gdXNlZCB0aGUga2V5IGZvciBwcm9maWxlIGxvb2t1cC4gVmFyaWFibGUgXGMgSW5MVE8gaW5kaWNhdGVzIGlmIHRoaXMKKy8vLyBpcyBjYWxsZWQgaW4gTFRPIG9wdGltaXphdGlvbiBwYXNzZXMuCitzdGQ6OnN0cmluZyBnZXRQR09GdW5jTmFtZShjb25zdCBGdW5jdGlvbiAmRiwgYm9vbCBJbkxUTyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVmVyc2lvbiA9IElOU1RSX1BST0ZfSU5ERVhfVkVSU0lPTik7CisKKy8vLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG5hbWUgZm9yIGEgZnVuY3Rpb24gc3VpdGFibGUgdG8gYmUKKy8vLyB1c2VkIHRoZSBrZXkgZm9yIHByb2ZpbGUgbG9va3VwLiBUaGUgZnVuY3Rpb24ncyBvcmlnaW5hbAorLy8vIG5hbWUgaXMgXGMgUmF3RnVuY05hbWUgYW5kIGhhcyBsaW5rYWdlIG9mIHR5cGUgXGMgTGlua2FnZS4KKy8vLyBUaGUgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbiBtb2R1bGUgXGMgRmlsZU5hbWUuCitzdGQ6OnN0cmluZyBnZXRQR09GdW5jTmFtZShTdHJpbmdSZWYgUmF3RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6TGlua2FnZVR5cGVzIExpbmthZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBWZXJzaW9uID0gSU5TVFJfUFJPRl9JTkRFWF9WRVJTSU9OKTsKKworLy8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZ2xvYmFsIHZhcmlhYmxlIHVzZWQgdG8gc3RvcmUgYSBmdW5jdGlvbgorLy8vIG5hbWUgaW4gUEdPIGluc3RydW1lbnRhdGlvbi4gXGMgRnVuY05hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uCisvLy8gcmV0dXJuZWQgYnkgdGhlIFxjIGdldFBHT0Z1bmNOYW1lIGNhbGwuCitzdGQ6OnN0cmluZyBnZXRQR09GdW5jTmFtZVZhck5hbWUoU3RyaW5nUmVmIEZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXMgTGlua2FnZSk7CisKKy8vLyBDcmVhdGUgYW5kIHJldHVybiB0aGUgZ2xvYmFsIHZhcmlhYmxlIGZvciBmdW5jdGlvbiBuYW1lIHVzZWQgaW4gUEdPCisvLy8gaW5zdHJ1bWVudGF0aW9uLiBcYyBGdW5jTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gcmV0dXJuZWQKKy8vLyBieSBcYyBnZXRQR09GdW5jTmFtZSBjYWxsLgorR2xvYmFsVmFyaWFibGUgKmNyZWF0ZVBHT0Z1bmNOYW1lVmFyKEZ1bmN0aW9uICZGLCBTdHJpbmdSZWYgUEdPRnVuY05hbWUpOworCisvLy8gQ3JlYXRlIGFuZCByZXR1cm4gdGhlIGdsb2JhbCB2YXJpYWJsZSBmb3IgZnVuY3Rpb24gbmFtZSB1c2VkIGluIFBHTworLy8vIGluc3RydW1lbnRhdGlvbi4gIC8vLyBcYyBGdW5jTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KKy8vLyByZXR1cm5lZCBieSBcYyBnZXRQR09GdW5jTmFtZSBjYWxsLCBcYyBNIGlzIHRoZSBvd25pbmcgbW9kdWxlLAorLy8vIGFuZCBcYyBMaW5rYWdlIGlzIHRoZSBsaW5rYWdlIG9mIHRoZSBpbnN0cnVtZW50ZWQgZnVuY3Rpb24uCitHbG9iYWxWYXJpYWJsZSAqY3JlYXRlUEdPRnVuY05hbWVWYXIoTW9kdWxlICZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXMgTGlua2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgUEdPRnVuY05hbWUpOworCisvLy8gUmV0dXJuIHRoZSBpbml0aWFsaXplciBpbiBzdHJpbmcgb2YgdGhlIFBHTyBuYW1lIHZhciBcYyBOYW1lVmFyLgorU3RyaW5nUmVmIGdldFBHT0Z1bmNOYW1lVmFySW5pdGlhbGl6ZXIoR2xvYmFsVmFyaWFibGUgKk5hbWVWYXIpOworCisvLy8gR2l2ZW4gYSBQR08gZnVuY3Rpb24gbmFtZSwgcmVtb3ZlIHRoZSBmaWxlbmFtZSBwcmVmaXggYW5kIHJldHVybgorLy8vIHRoZSBvcmlnaW5hbCAoc3RhdGljKSBmdW5jdGlvbiBuYW1lLgorU3RyaW5nUmVmIGdldEZ1bmNOYW1lV2l0aG91dFByZWZpeChTdHJpbmdSZWYgUEdPRnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlTmFtZSA9ICI8dW5rbm93bj4iKTsKKworLy8vIEdpdmVuIGEgdmVjdG9yIG9mIHN0cmluZ3MgKGZ1bmN0aW9uIFBHTyBuYW1lcykgXGMgTmFtZVN0cnMsIHRoZQorLy8vIG1ldGhvZCBnZW5lcmF0ZXMgYSBjb21iaW5lZCBzdHJpbmcgXGMgUmVzdWx0IHRoYXRpcyByZWFkeSB0byBiZQorLy8vIHNlcmlhbGl6ZWQuICBUaGUgXGMgUmVzdWx0IHN0cmluZyBpcyBjb21wcmlzZWQgb2YgdGhyZWUgZmllbGRzOgorLy8vIFRoZSBmaXJzdCBmaWVsZCBpcyB0aGUgbGVnbnRoIG9mIHRoZSB1bmNvbXByZXNzZWQgc3RyaW5ncywgYW5kIHRoZQorLy8vIHRoZSBzZWNvbmQgZmllbGQgaXMgdGhlIGxlbmd0aCBvZiB0aGUgemxpYi1jb21wcmVzc2VkIHN0cmluZy4KKy8vLyBCb3RoIGZpZWxkcyBhcmUgZW5jb2RlZCBpbiBVTEVCMTI4LiAgSWYgXGMgZG9Db21wcmVzcyBpcyBmYWxzZSwgdGhlCisvLy8gIHRoaXJkIGZpZWxkIGlzIHRoZSB1bmNvbXByZXNzZWQgc3RyaW5nczsgb3RoZXJ3aXNlIGl0IGlzIHRoZQorLy8vIGNvbXByZXNzZWQgc3RyaW5nLiBXaGVuIHRoZSBzdHJpbmcgY29tcHJlc3Npb24gaXMgb2ZmLCB0aGUKKy8vLyBzZWNvbmQgZmllbGQgd2lsbCBoYXZlIHZhbHVlIHplcm8uCitFcnJvciBjb2xsZWN0UEdPRnVuY05hbWVTdHJpbmdzKEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBOYW1lU3RycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb0NvbXByZXNzaW9uLCBzdGQ6OnN0cmluZyAmUmVzdWx0KTsKKworLy8vIFByb2R1Y2UgXGMgUmVzdWx0IHN0cmluZyB3aXRoIHRoZSBzYW1lIGZvcm1hdCBkZXNjcmliZWQgYWJvdmUuIFRoZSBpbnB1dAorLy8vIGlzIHZlY3RvciBvZiBQR08gZnVuY3Rpb24gbmFtZSB2YXJpYWJsZXMgdGhhdCBhcmUgcmVmZXJlbmNlZC4KK0Vycm9yIGNvbGxlY3RQR09GdW5jTmFtZVN0cmluZ3MoQXJyYXlSZWY8R2xvYmFsVmFyaWFibGUgKj4gTmFtZVZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZSZXN1bHQsIGJvb2wgZG9Db21wcmVzc2lvbiA9IHRydWUpOworCisvLy8gXGMgTmFtZVN0cmluZ3MgaXMgYSBzdHJpbmcgY29tcG9zZWQgb2Ygb25lIG9mIG1vcmUgc3ViLXN0cmluZ3MgZW5jb2RlZCBpbgorLy8vIHRoZSBmb3JtYXQgZGVzY3JpYmVkIGFib3ZlLiBUaGUgc3Vic3RyaW5ncyBhcmUgc2VwYXJhdGVkIGJ5IDAgb3IgbW9yZSB6ZXJvCisvLy8gYnl0ZXMuIFRoaXMgbWV0aG9kIGRlY29kZXMgdGhlIHN0cmluZyBhbmQgcG9wdWxhdGVzIHRoZSBcYyBTeW10YWIuCitFcnJvciByZWFkUEdPRnVuY05hbWVTdHJpbmdzKFN0cmluZ1JlZiBOYW1lU3RyaW5ncywgSW5zdHJQcm9mU3ltdGFiICZTeW10YWIpOworCisvLy8gQ2hlY2sgaWYgSU5TVFJfUFJPRl9SQVdfVkVSU0lPTl9WQVIgaXMgZGVmaW5lZC4gVGhpcyBnbG9iYWwgaXMgb25seSBiZWluZworLy8vIHNldCBpbiBJUiBQR08gY29tcGlsYXRpb24uCitib29sIGlzSVJQR09GbGFnU2V0KGNvbnN0IE1vZHVsZSAqTSk7CisKKy8vLyBDaGVjayBpZiB3ZSBjYW4gc2FmZWx5IHJlbmFtZSB0aGlzIENvbWRhdCBmdW5jdGlvbi4gSW5zdGFuY2VzIG9mIHRoZSBzYW1lCisvLy8gY29tZGF0IGZ1bmN0aW9uIG1heSBoYXZlIGRpZmZlcmVudCBjb250cm9sIGZsb3dzIHRodXMgY2FuIG5vdCBzaGFyZSB0aGUKKy8vLyBzYW1lIGNvdW50ZXIgdmFyaWFibGUuCitib29sIGNhblJlbmFtZUNvbWRhdEZ1bmMoY29uc3QgRnVuY3Rpb24gJkYsIGJvb2wgQ2hlY2tBZGRyZXNzVGFrZW4gPSBmYWxzZSk7CisKK2VudW0gSW5zdHJQcm9mVmFsdWVLaW5kIDogdWludDMyX3QgeworI2RlZmluZSBWQUxVRV9QUk9GX0tJTkQoRW51bWVyYXRvciwgVmFsdWUpIEVudW1lcmF0b3IgPSBWYWx1ZSwKKyNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZkRhdGEuaW5jIgorfTsKKworLy8vIEdldCB0aGUgdmFsdWUgcHJvZmlsZSBkYXRhIGZvciB2YWx1ZSBzaXRlIFxwIFNpdGVJZHggZnJvbSBccCBJbnN0clByb2ZSCisvLy8gYW5kIGFubm90YXRlIHRoZSBpbnN0cnVjdGlvbiBccCBJbnN0IHdpdGggdGhlIHZhbHVlIHByb2ZpbGUgbWV0YSBkYXRhLgorLy8vIEFubm90YXRlIHVwIHRvIFxwIE1heE1EQ291bnQgKGRlZmF1bHQgMykgbnVtYmVyIG9mIHJlY29yZHMgcGVyIHZhbHVlIHNpdGUuCit2b2lkIGFubm90YXRlVmFsdWVTaXRlKE1vZHVsZSAmTSwgSW5zdHJ1Y3Rpb24gJkluc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RyUHJvZlJlY29yZCAmSW5zdHJQcm9mUiwKKyAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJQcm9mVmFsdWVLaW5kIFZhbHVlS2luZCwgdWludDMyX3QgU2l0ZUluZHgsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE1heE1EQ291bnQgPSAzKTsKKworLy8vIFNhbWUgYXMgdGhlIGFib3ZlIGludGVyZmFjZSBidXQgdXNpbmcgYW4gQXJyYXlSZWYsIGFzIHdlbGwgYXMgXHAgU3VtLgordm9pZCBhbm5vdGF0ZVZhbHVlU2l0ZShNb2R1bGUgJk0sIEluc3RydWN0aW9uICZJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxJbnN0clByb2ZWYWx1ZURhdGE+IFZEcywgdWludDY0X3QgU3VtLAorICAgICAgICAgICAgICAgICAgICAgICBJbnN0clByb2ZWYWx1ZUtpbmQgVmFsdWVLaW5kLCB1aW50MzJfdCBNYXhNRENvdW50KTsKKworLy8vIEV4dHJhY3QgdGhlIHZhbHVlIHByb2ZpbGUgZGF0YSBmcm9tIFxwIEluc3Qgd2hpY2ggaXMgYW5ub3RhdGVkIHdpdGgKKy8vLyB2YWx1ZSBwcm9maWxlIG1ldGEgZGF0YS4gUmV0dXJuIGZhbHNlIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGRhdGEgYW5ub3RhdGVkLAorLy8vIG90aGVyd2lzZSAgcmV0dXJuIHRydWUuCitib29sIGdldFZhbHVlUHJvZkRhdGFGcm9tSW5zdChjb25zdCBJbnN0cnVjdGlvbiAmSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyUHJvZlZhbHVlS2luZCBWYWx1ZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBNYXhOdW1WYWx1ZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clByb2ZWYWx1ZURhdGEgVmFsdWVEYXRhW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmQWN0dWFsTnVtVmFsdWVEYXRhLCB1aW50NjRfdCAmVG90YWxDKTsKKworaW5saW5lIFN0cmluZ1JlZiBnZXRQR09GdW5jTmFtZU1ldGFkYXRhTmFtZSgpIHsgcmV0dXJuICJQR09GdW5jTmFtZSI7IH0KKworLy8vIFJldHVybiB0aGUgUEdPRnVuY05hbWUgbWV0YSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIGZ1bmN0aW9uLgorTUROb2RlICpnZXRQR09GdW5jTmFtZU1ldGFkYXRhKGNvbnN0IEZ1bmN0aW9uICZGKTsKKworLy8vIENyZWF0ZSB0aGUgUEdPRnVuY05hbWUgbWV0YSBkYXRhIGlmIFBHT0Z1bmNOYW1lIGlzIGRpZmZlcmVudCBmcm9tCisvLy8gZnVuY3Rpb24ncyByYXcgbmFtZS4gVGhpcyBzaG91bGQgb25seSBhcHBseSB0byBpbnRlcm5hbCBsaW5rYWdlIGZ1bmN0aW9ucworLy8vIGRlY2xhcmVkIGJ5IHVzZXJzIG9ubHkuCit2b2lkIGNyZWF0ZVBHT0Z1bmNOYW1lTWV0YWRhdGEoRnVuY3Rpb24gJkYsIFN0cmluZ1JlZiBQR09GdW5jTmFtZSk7CisKKy8vLyBDaGVjayBpZiB3ZSBjYW4gdXNlIENvbWRhdCBmb3IgcHJvZmlsZSB2YXJpYWJsZXMuIFRoaXMgd2lsbCBlbGltaW5hdGUKKy8vLyB0aGUgZHVwbGljYXRlZCBwcm9maWxlIHZhcmlhYmxlcyBmb3IgQ29tZGF0IGZ1bmN0aW9ucy4KK2Jvb2wgbmVlZHNDb21kYXRGb3JDb3VudGVyKGNvbnN0IEZ1bmN0aW9uICZGLCBjb25zdCBNb2R1bGUgJk0pOworCitjb25zdCBzdGQ6OmVycm9yX2NhdGVnb3J5ICZpbnN0cnByb2ZfY2F0ZWdvcnkoKTsKKworZW51bSBjbGFzcyBpbnN0cnByb2ZfZXJyb3IgeworICBzdWNjZXNzID0gMCwKKyAgZW9mLAorICB1bnJlY29nbml6ZWRfZm9ybWF0LAorICBiYWRfbWFnaWMsCisgIGJhZF9oZWFkZXIsCisgIHVuc3VwcG9ydGVkX3ZlcnNpb24sCisgIHVuc3VwcG9ydGVkX2hhc2hfdHlwZSwKKyAgdG9vX2xhcmdlLAorICB0cnVuY2F0ZWQsCisgIG1hbGZvcm1lZCwKKyAgdW5rbm93bl9mdW5jdGlvbiwKKyAgaGFzaF9taXNtYXRjaCwKKyAgY291bnRfbWlzbWF0Y2gsCisgIGNvdW50ZXJfb3ZlcmZsb3csCisgIHZhbHVlX3NpdGVfY291bnRfbWlzbWF0Y2gsCisgIGNvbXByZXNzX2ZhaWxlZCwKKyAgdW5jb21wcmVzc19mYWlsZWQsCisgIGVtcHR5X3Jhd19wcm9maWxlLAorICB6bGliX3VuYXZhaWxhYmxlCit9OworCitpbmxpbmUgc3RkOjplcnJvcl9jb2RlIG1ha2VfZXJyb3JfY29kZShpbnN0cnByb2ZfZXJyb3IgRSkgeworICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKHN0YXRpY19jYXN0PGludD4oRSksIGluc3RycHJvZl9jYXRlZ29yeSgpKTsKK30KKworY2xhc3MgSW5zdHJQcm9mRXJyb3IgOiBwdWJsaWMgRXJyb3JJbmZvPEluc3RyUHJvZkVycm9yPiB7CitwdWJsaWM6CisgIEluc3RyUHJvZkVycm9yKGluc3RycHJvZl9lcnJvciBFcnIpIDogRXJyKEVycikgeworICAgIGFzc2VydChFcnIgIT0gaW5zdHJwcm9mX2Vycm9yOjpzdWNjZXNzICYmICJOb3QgYW4gZXJyb3IiKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIG1lc3NhZ2UoKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsgT1MgPDwgbWVzc2FnZSgpOyB9CisKKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbWFrZV9lcnJvcl9jb2RlKEVycik7CisgIH0KKworICBpbnN0cnByb2ZfZXJyb3IgZ2V0KCkgY29uc3QgeyByZXR1cm4gRXJyOyB9CisKKyAgLy8vIENvbnN1bWUgYW4gRXJyb3IgYW5kIHJldHVybiB0aGUgcmF3IGVudW0gdmFsdWUgY29udGFpbmVkIHdpdGhpbiBpdC4gVGhlCisgIC8vLyBFcnJvciBtdXN0IGVpdGhlciBiZSBhIHN1Y2Nlc3MgdmFsdWUsIG9yIGNvbnRhaW4gYSBzaW5nbGUgSW5zdHJQcm9mRXJyb3IuCisgIHN0YXRpYyBpbnN0cnByb2ZfZXJyb3IgdGFrZShFcnJvciBFKSB7CisgICAgYXV0byBFcnIgPSBpbnN0cnByb2ZfZXJyb3I6OnN1Y2Nlc3M7CisgICAgaGFuZGxlQWxsRXJyb3JzKHN0ZDo6bW92ZShFKSwgWyZFcnJdKGNvbnN0IEluc3RyUHJvZkVycm9yICZJUEUpIHsKKyAgICAgIGFzc2VydChFcnIgPT0gaW5zdHJwcm9mX2Vycm9yOjpzdWNjZXNzICYmICJNdWx0aXBsZSBlcnJvcnMgZW5jb3VudGVyZWQiKTsKKyAgICAgIEVyciA9IElQRS5nZXQoKTsKKyAgICB9KTsKKyAgICByZXR1cm4gRXJyOworICB9CisKKyAgc3RhdGljIGNoYXIgSUQ7CisKK3ByaXZhdGU6CisgIGluc3RycHJvZl9lcnJvciBFcnI7Cit9OworCitjbGFzcyBTb2Z0SW5zdHJQcm9mRXJyb3JzIHsKKyAgLy8vIENvdW50IHRoZSBudW1iZXIgb2Ygc29mdCBpbnN0cnByb2ZfZXJyb3JzIGVuY291bnRlcmVkIGFuZCBrZWVwIHRyYWNrIG9mCisgIC8vLyB0aGUgZmlyc3Qgc3VjaCBlcnJvciBmb3IgcmVwb3J0aW5nIHB1cnBvc2VzLgorCisgIC8vLyBUaGUgZmlyc3Qgc29mdCBlcnJvciBlbmNvdW50ZXJlZC4KKyAgaW5zdHJwcm9mX2Vycm9yIEZpcnN0RXJyb3IgPSBpbnN0cnByb2ZfZXJyb3I6OnN1Y2Nlc3M7CisKKyAgLy8vIFRoZSBudW1iZXIgb2YgaGFzaCBtaXNtYXRjaGVzLgorICB1bnNpZ25lZCBOdW1IYXNoTWlzbWF0Y2hlcyA9IDA7CisKKyAgLy8vIFRoZSBudW1iZXIgb2YgY291bnQgbWlzbWF0Y2hlcy4KKyAgdW5zaWduZWQgTnVtQ291bnRNaXNtYXRjaGVzID0gMDsKKworICAvLy8gVGhlIG51bWJlciBvZiBjb3VudGVyIG92ZXJmbG93cy4KKyAgdW5zaWduZWQgTnVtQ291bnRlck92ZXJmbG93cyA9IDA7CisKKyAgLy8vIFRoZSBudW1iZXIgb2YgdmFsdWUgc2l0ZSBjb3VudCBtaXNtYXRjaGVzLgorICB1bnNpZ25lZCBOdW1WYWx1ZVNpdGVDb3VudE1pc21hdGNoZXMgPSAwOworCitwdWJsaWM6CisgIFNvZnRJbnN0clByb2ZFcnJvcnMoKSA9IGRlZmF1bHQ7CisKKyAgflNvZnRJbnN0clByb2ZFcnJvcnMoKSB7CisgICAgYXNzZXJ0KEZpcnN0RXJyb3IgPT0gaW5zdHJwcm9mX2Vycm9yOjpzdWNjZXNzICYmCisgICAgICAgICAgICJVbmNoZWNrZWQgc29mdCBlcnJvciBlbmNvdW50ZXJlZCIpOworICB9CisKKyAgLy8vIFRyYWNrIGEgc29mdCBlcnJvciAoXHAgSUUpIGFuZCBpbmNyZW1lbnQgaXRzIGFzc29jaWF0ZWQgY291bnRlci4KKyAgdm9pZCBhZGRFcnJvcihpbnN0cnByb2ZfZXJyb3IgSUUpOworCisgIC8vLyBHZXQgdGhlIG51bWJlciBvZiBoYXNoIG1pc21hdGNoZXMuCisgIHVuc2lnbmVkIGdldE51bUhhc2hNaXNtYXRjaGVzKCkgY29uc3QgeyByZXR1cm4gTnVtSGFzaE1pc21hdGNoZXM7IH0KKworICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgY291bnQgbWlzbWF0Y2hlcy4KKyAgdW5zaWduZWQgZ2V0TnVtQ291bnRNaXNtYXRjaGVzKCkgY29uc3QgeyByZXR1cm4gTnVtQ291bnRNaXNtYXRjaGVzOyB9CisKKyAgLy8vIEdldCB0aGUgbnVtYmVyIG9mIGNvdW50ZXIgb3ZlcmZsb3dzLgorICB1bnNpZ25lZCBnZXROdW1Db3VudGVyT3ZlcmZsb3dzKCkgY29uc3QgeyByZXR1cm4gTnVtQ291bnRlck92ZXJmbG93czsgfQorCisgIC8vLyBHZXQgdGhlIG51bWJlciBvZiB2YWx1ZSBzaXRlIGNvdW50IG1pc21hdGNoZXMuCisgIHVuc2lnbmVkIGdldE51bVZhbHVlU2l0ZUNvdW50TWlzbWF0Y2hlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtVmFsdWVTaXRlQ291bnRNaXNtYXRjaGVzOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgZmlyc3QgZW5jb3VudGVyZWQgZXJyb3IgYW5kIHJlc2V0IEZpcnN0RXJyb3IgdG8gYSBzdWNjZXNzCisgIC8vLyB2YWx1ZS4KKyAgRXJyb3IgdGFrZUVycm9yKCkgeworICAgIGlmIChGaXJzdEVycm9yID09IGluc3RycHJvZl9lcnJvcjo6c3VjY2VzcykKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgIGF1dG8gRSA9IG1ha2VfZXJyb3I8SW5zdHJQcm9mRXJyb3I+KEZpcnN0RXJyb3IpOworICAgIEZpcnN0RXJyb3IgPSBpbnN0cnByb2ZfZXJyb3I6OnN1Y2Nlc3M7CisgICAgcmV0dXJuIEU7CisgIH0KK307CisKK25hbWVzcGFjZSBvYmplY3QgeworCitjbGFzcyBTZWN0aW9uUmVmOworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb2JqZWN0CisKK25hbWVzcGFjZSBJbmRleGVkSW5zdHJQcm9mIHsKKwordWludDY0X3QgQ29tcHV0ZUhhc2goU3RyaW5nUmVmIEspOworCit9IC8vIGVuZCBuYW1lc3BhY2UgSW5kZXhlZEluc3RyUHJvZgorCisvLy8gQSBzeW1ib2wgdGFibGUgdXNlZCBmb3IgZnVuY3Rpb24gUEdPIG5hbWUgbG9vay11cCB3aXRoIGtleXMKKy8vLyAoc3VjaCBhcyBwb2ludGVycywgbWQ1aGFzaCB2YWx1ZXMpIHRvIHRoZSBmdW5jdGlvbi4gQSBmdW5jdGlvbidzCisvLy8gUEdPIG5hbWUgb3IgbmFtZSdzIG1kNWhhc2ggYXJlIHVzZWQgaW4gcmV0cmlldmluZyB0aGUgcHJvZmlsZQorLy8vIGRhdGEgb2YgdGhlIGZ1bmN0aW9uLiBTZWUgXGMgZ2V0UEdPRnVuY05hbWUoKSBtZXRob2QgZm9yIGRldGFpbHMKKy8vLyBvbiBob3cgUEdPIG5hbWUgaXMgZm9ybWVkLgorY2xhc3MgSW5zdHJQcm9mU3ltdGFiIHsKK3B1YmxpYzoKKyAgdXNpbmcgQWRkckhhc2hNYXAgPSBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dWludDY0X3QsIHVpbnQ2NF90Pj47CisKK3ByaXZhdGU6CisgIFN0cmluZ1JlZiBEYXRhOworICB1aW50NjRfdCBBZGRyZXNzID0gMDsKKyAgLy8gVW5pcXVlIG5hbWUgc3RyaW5ncy4KKyAgU3RyaW5nU2V0PD4gTmFtZVRhYjsKKyAgLy8gQSBtYXAgZnJvbSBNRDUga2V5cyB0byBmdW5jdGlvbiBuYW1lIHN0cmluZ3MuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1aW50NjRfdCwgU3RyaW5nUmVmPj4gTUQ1TmFtZU1hcDsKKyAgLy8gQSBtYXAgZnJvbSBNRDUga2V5cyB0byBmdW5jdGlvbiBkZWZpbmUuIFdlIG9ubHkgcG9wdWxhdGUgdGhpcyBtYXAKKyAgLy8gd2hlbiBidWlsZCB0aGUgU3ltdGFiIGZyb20gYSBNb2R1bGUuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1aW50NjRfdCwgRnVuY3Rpb24gKj4+IE1ENUZ1bmNNYXA7CisgIC8vIEEgbWFwIGZyb20gZnVuY3Rpb24gcnVudGltZSBhZGRyZXNzIHRvIGZ1bmN0aW9uIG5hbWUgTUQ1IGhhc2guCisgIC8vIFRoaXMgbWFwIGlzIG9ubHkgcG9wdWxhdGVkIGFuZCB1c2VkIGJ5IHJhdyBpbnN0ciBwcm9maWxlIHJlYWRlci4KKyAgQWRkckhhc2hNYXAgQWRkclRvTUQ1TWFwOworICBib29sIFNvcnRlZCA9IGZhbHNlOworCisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0RXh0ZXJuYWxTeW1ib2woKSB7CisgICAgcmV0dXJuICIqKiBFeHRlcm5hbCBTeW1ib2wgKioiOworICB9CisKKyAgLy8gSWYgdGhlIHN5bXRhYiBpcyBjcmVhdGVkIGJ5IGEgc2VyaWVzIG9mIGNhbGxzIHRvIFxjIGFkZEZ1bmNOYW1lLCBcYworICAvLyBmaW5hbGl6ZVN5bXRhYiBuZWVkcyB0byBiZSBjYWxsZWQgYmVmb3JlIGxvb2tpbmcgdXAgZnVuY3Rpb24gbmFtZXMuCisgIC8vIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgdW5kZXJseWluZyBtYXAgaXMgYSB2ZWN0b3IgKGZvciBzcGFjZQorICAvLyBlZmZpY2llbmN5KSB3aGljaCBuZWVkcyB0byBiZSBzb3J0ZWQuCisgIGlubGluZSB2b2lkIGZpbmFsaXplU3ltdGFiKCk7CisKK3B1YmxpYzoKKyAgSW5zdHJQcm9mU3ltdGFiKCkgPSBkZWZhdWx0OworCisgIC8vLyBDcmVhdGUgSW5zdHJQcm9mU3ltdGFiIGZyb20gYW4gb2JqZWN0IGZpbGUgc2VjdGlvbiB3aGljaAorICAvLy8gY29udGFpbnMgZnVuY3Rpb24gUEdPIG5hbWVzLiBXaGVuIHNlY3Rpb24gbWF5IGNvbnRhaW4gcmF3CisgIC8vLyBzdHJpbmcgZGF0YSBvciBzdHJpbmcgZGF0YSBpbiBjb21wcmVzc2VkIGZvcm0uIFRoaXMgbWV0aG9kCisgIC8vLyBvbmx5IGluaXRpYWxpemUgdGhlIHN5bXRhYiB3aXRoIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhbmQKKyAgLy8vIHRoZSBzZWN0aW9uIGJhc2UgYWRkcmVzcy4gVGhlIGRlY29tcHJlc3Npb24gd2lsbCBiZSBkZWxheWVkCisgIC8vLyB1bnRpbCBiZWZvcmUgaXQgaXMgdXNlZC4gU2VlIGFsc28gXGMgY3JlYXRlKFN0cmluZ1JlZikgbWV0aG9kLgorICBFcnJvciBjcmVhdGUob2JqZWN0OjpTZWN0aW9uUmVmICZTZWN0aW9uKTsKKworICAvLy8gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSByZWFkZXIgb2YgQ292ZXJhZ2VNYXBwaW5nIHRlc3QKKyAgLy8vIGZvcm1hdC4KKyAgaW5saW5lIEVycm9yIGNyZWF0ZShTdHJpbmdSZWYgRCwgdWludDY0X3QgQmFzZUFkZHIpOworCisgIC8vLyBcYyBOYW1lU3RyaW5ncyBpcyBhIHN0cmluZyBjb21wb3NlZCBvZiBvbmUgb2YgbW9yZSBzdWItc3RyaW5ncworICAvLy8gIGVuY29kZWQgaW4gdGhlIGZvcm1hdCBkZXNjcmliZWQgaW4gXGMgY29sbGVjdFBHT0Z1bmNOYW1lU3RyaW5ncy4KKyAgLy8vIFRoaXMgbWV0aG9kIGlzIGEgd3JhcHBlciB0byBcYyByZWFkUEdPRnVuY05hbWVTdHJpbmdzIG1ldGhvZC4KKyAgaW5saW5lIEVycm9yIGNyZWF0ZShTdHJpbmdSZWYgTmFtZVN0cmluZ3MpOworCisgIC8vLyBBIHdyYXBwZXIgaW50ZXJmYWNlIHRvIHBvcHVsYXRlIHRoZSBQR08gc3ltdGFiIHdpdGggZnVuY3Rpb25zCisgIC8vLyBkZWNscyBmcm9tIG1vZHVsZSBcYyBNLiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IHRyYW5zZm9ybWF0aW9uCisgIC8vLyBwYXNzZXMgc3VjaCBhcyBpbmRpcmVjdCBmdW5jdGlvbiBjYWxsIHByb21vdGlvbi4gVmFyaWFibGUgXGMgSW5MVE8KKyAgLy8vIGluZGljYXRlcyBpZiB0aGlzIGlzIGNhbGxlZCBmcm9tIExUTyBvcHRpbWl6YXRpb24gcGFzc2VzLgorICBFcnJvciBjcmVhdGUoTW9kdWxlICZNLCBib29sIEluTFRPID0gZmFsc2UpOworCisgIC8vLyBDcmVhdGUgSW5zdHJQcm9mU3ltdGFiIGZyb20gYSBzZXQgb2YgbmFtZXMgaXRlcmF0YWJsZSBmcm9tCisgIC8vLyBccCBJdGVyUmFuZ2UuIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgSW5kZXhlZFByb2ZSZWFkZXIuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBOYW1lSXRlclJhbmdlPiBFcnJvciBjcmVhdGUoY29uc3QgTmFtZUl0ZXJSYW5nZSAmSXRlclJhbmdlKTsKKworICAvLy8gVXBkYXRlIHRoZSBzeW10YWIgYnkgYWRkaW5nIFxwIEZ1bmNOYW1lIHRvIHRoZSB0YWJsZS4gVGhpcyBpbnRlcmZhY2UKKyAgLy8vIGlzIHVzZWQgYnkgdGhlIHJhdyBhbmQgdGV4dCBwcm9maWxlIHJlYWRlcnMuCisgIEVycm9yIGFkZEZ1bmNOYW1lKFN0cmluZ1JlZiBGdW5jTmFtZSkgeworICAgIGlmIChGdW5jTmFtZS5lbXB0eSgpKQorICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8SW5zdHJQcm9mRXJyb3I+KGluc3RycHJvZl9lcnJvcjo6bWFsZm9ybWVkKTsKKyAgICBhdXRvIElucyA9IE5hbWVUYWIuaW5zZXJ0KEZ1bmNOYW1lKTsKKyAgICBpZiAoSW5zLnNlY29uZCkgeworICAgICAgTUQ1TmFtZU1hcC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgSW5kZXhlZEluc3RyUHJvZjo6Q29tcHV0ZUhhc2goRnVuY05hbWUpLCBJbnMuZmlyc3QtPmdldEtleSgpKSk7CisgICAgICBTb3J0ZWQgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICAvLy8gTWFwIGEgZnVuY3Rpb24gYWRkcmVzcyB0byBpdHMgbmFtZSdzIE1ENSBoYXNoLiBUaGlzIGludGVyZmFjZQorICAvLy8gaXMgb25seSB1c2VkIGJ5IHRoZSByYXcgcHJvZmlsZXIgcmVhZGVyLgorICB2b2lkIG1hcEFkZHJlc3ModWludDY0X3QgQWRkciwgdWludDY0X3QgTUQ1VmFsKSB7CisgICAgQWRkclRvTUQ1TWFwLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihBZGRyLCBNRDVWYWwpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSBmdW5jdGlvbidzIGhhc2gsIG9yIDAsIGlmIHRoZSBmdW5jdGlvbiBpc24ndCBpbiB0aGlzIFN5bVRhYi4KKyAgdWludDY0X3QgZ2V0RnVuY3Rpb25IYXNoRnJvbUFkZHJlc3ModWludDY0X3QgQWRkcmVzcyk7CisKKyAgLy8vIFJldHVybiBmdW5jdGlvbidzIFBHTyBuYW1lIGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUncyBzeW1ib2wKKyAgLy8vIGFkZHJlc3MgaW4gdGhlIG9iamVjdCBmaWxlLiBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybgorICAvLy8gYW4gZW1wdHkgc3RyaW5nLgorICBTdHJpbmdSZWYgZ2V0RnVuY05hbWUodWludDY0X3QgRnVuY05hbWVBZGRyZXNzLCBzaXplX3QgTmFtZVNpemUpOworCisgIC8vLyBSZXR1cm4gZnVuY3Rpb24ncyBQR08gbmFtZSBmcm9tIHRoZSBuYW1lJ3MgbWQ1IGhhc2ggdmFsdWUuCisgIC8vLyBJZiBub3QgZm91bmQsIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCisgIGlubGluZSBTdHJpbmdSZWYgZ2V0RnVuY05hbWUodWludDY0X3QgRnVuY01ENUhhc2gpOworCisgIC8vLyBKdXN0IGxpa2UgZ2V0RnVuY05hbWUsIGV4Y2VwdCB0aGF0IGl0IHdpbGwgcmV0dXJuIGEgbm9uLWVtcHR5IFN0cmluZ1JlZgorICAvLy8gaWYgdGhlIGZ1bmN0aW9uIGlzIGV4dGVybmFsIHRvIHRoaXMgc3ltYm9sIHRhYmxlLiBBbGwgc3VjaCBjYXNlcworICAvLy8gd2lsbCBiZSByZXByZXNlbnRlZCB1c2luZyB0aGUgc2FtZSBTdHJpbmdSZWYgdmFsdWUuCisgIGlubGluZSBTdHJpbmdSZWYgZ2V0RnVuY05hbWVPckV4dGVybmFsU3ltYm9sKHVpbnQ2NF90IEZ1bmNNRDVIYXNoKTsKKworICAvLy8gVHJ1ZSBpZiBTeW1ib2wgaXMgdGhlIHZhbHVlIHVzZWQgdG8gcmVwcmVzZW50IGV4dGVybmFsIHN5bWJvbHMuCisgIHN0YXRpYyBib29sIGlzRXh0ZXJuYWxTeW1ib2woY29uc3QgU3RyaW5nUmVmICZTeW1ib2wpIHsKKyAgICByZXR1cm4gU3ltYm9sID09IEluc3RyUHJvZlN5bXRhYjo6Z2V0RXh0ZXJuYWxTeW1ib2woKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gZnVuY3Rpb24gZnJvbSB0aGUgbmFtZSdzIG1kNSBoYXNoLiBSZXR1cm4gbnVsbHB0ciBpZiBub3QgZm91bmQuCisgIGlubGluZSBGdW5jdGlvbiAqZ2V0RnVuY3Rpb24odWludDY0X3QgRnVuY01ENUhhc2gpOworCisgIC8vLyBSZXR1cm4gdGhlIGZ1bmN0aW9uJ3Mgb3JpZ2luYWwgYXNzZW1ibHkgbmFtZSBieSBzdHJpcHBpbmcgb2ZmCisgIC8vLyB0aGUgcHJlZml4IGF0dGFjaGVkICh0byBzeW1ib2xzIHdpdGggcHJpdmlhdGUgbGlua2FnZSkuIEZvcgorICAvLy8gZ2xvYmFsIGZ1bmN0aW9ucywgaXQgcmV0dXJucyB0aGUgc2FtZSBzdHJpbmcgYXMgZ2V0RnVuY05hbWUuCisgIGlubGluZSBTdHJpbmdSZWYgZ2V0T3JpZ0Z1bmNOYW1lKHVpbnQ2NF90IEZ1bmNNRDVIYXNoKTsKKworICAvLy8gUmV0dXJuIHRoZSBuYW1lIHNlY3Rpb24gZGF0YS4KKyAgaW5saW5lIFN0cmluZ1JlZiBnZXROYW1lRGF0YSgpIGNvbnN0IHsgcmV0dXJuIERhdGE7IH0KK307CisKK0Vycm9yIEluc3RyUHJvZlN5bXRhYjo6Y3JlYXRlKFN0cmluZ1JlZiBELCB1aW50NjRfdCBCYXNlQWRkcikgeworICBEYXRhID0gRDsKKyAgQWRkcmVzcyA9IEJhc2VBZGRyOworICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKK30KKworRXJyb3IgSW5zdHJQcm9mU3ltdGFiOjpjcmVhdGUoU3RyaW5nUmVmIE5hbWVTdHJpbmdzKSB7CisgIHJldHVybiByZWFkUEdPRnVuY05hbWVTdHJpbmdzKE5hbWVTdHJpbmdzLCAqdGhpcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBOYW1lSXRlclJhbmdlPgorRXJyb3IgSW5zdHJQcm9mU3ltdGFiOjpjcmVhdGUoY29uc3QgTmFtZUl0ZXJSYW5nZSAmSXRlclJhbmdlKSB7CisgIGZvciAoYXV0byBOYW1lIDogSXRlclJhbmdlKQorICAgIGlmIChFcnJvciBFID0gYWRkRnVuY05hbWUoTmFtZSkpCisgICAgICByZXR1cm4gRTsKKworICBmaW5hbGl6ZVN5bXRhYigpOworICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKK30KKwordm9pZCBJbnN0clByb2ZTeW10YWI6OmZpbmFsaXplU3ltdGFiKCkgeworICBpZiAoU29ydGVkKQorICAgIHJldHVybjsKKyAgc3RkOjpzb3J0KE1ENU5hbWVNYXAuYmVnaW4oKSwgTUQ1TmFtZU1hcC5lbmQoKSwgbGVzc19maXJzdCgpKTsKKyAgc3RkOjpzb3J0KE1ENUZ1bmNNYXAuYmVnaW4oKSwgTUQ1RnVuY01hcC5lbmQoKSwgbGVzc19maXJzdCgpKTsKKyAgc3RkOjpzb3J0KEFkZHJUb01ENU1hcC5iZWdpbigpLCBBZGRyVG9NRDVNYXAuZW5kKCksIGxlc3NfZmlyc3QoKSk7CisgIEFkZHJUb01ENU1hcC5lcmFzZShzdGQ6OnVuaXF1ZShBZGRyVG9NRDVNYXAuYmVnaW4oKSwgQWRkclRvTUQ1TWFwLmVuZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgIEFkZHJUb01ENU1hcC5lbmQoKSk7CisgIFNvcnRlZCA9IHRydWU7Cit9CisKK1N0cmluZ1JlZiBJbnN0clByb2ZTeW10YWI6OmdldEZ1bmNOYW1lT3JFeHRlcm5hbFN5bWJvbCh1aW50NjRfdCBGdW5jTUQ1SGFzaCkgeworICBTdHJpbmdSZWYgcmV0ID0gZ2V0RnVuY05hbWUoRnVuY01ENUhhc2gpOworICBpZiAocmV0LmVtcHR5KCkpCisgICAgcmV0dXJuIEluc3RyUHJvZlN5bXRhYjo6Z2V0RXh0ZXJuYWxTeW1ib2woKTsKKyAgcmV0dXJuIHJldDsKK30KKworU3RyaW5nUmVmIEluc3RyUHJvZlN5bXRhYjo6Z2V0RnVuY05hbWUodWludDY0X3QgRnVuY01ENUhhc2gpIHsKKyAgZmluYWxpemVTeW10YWIoKTsKKyAgYXV0byBSZXN1bHQgPQorICAgICAgc3RkOjpsb3dlcl9ib3VuZChNRDVOYW1lTWFwLmJlZ2luKCksIE1ENU5hbWVNYXAuZW5kKCksIEZ1bmNNRDVIYXNoLAorICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBzdGQ6OnBhaXI8dWludDY0X3QsIHN0ZDo6c3RyaW5nPiAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBSSFMpIHsgcmV0dXJuIExIUy5maXJzdCA8IFJIUzsgfSk7CisgIGlmIChSZXN1bHQgIT0gTUQ1TmFtZU1hcC5lbmQoKSAmJiBSZXN1bHQtPmZpcnN0ID09IEZ1bmNNRDVIYXNoKQorICAgIHJldHVybiBSZXN1bHQtPnNlY29uZDsKKyAgcmV0dXJuIFN0cmluZ1JlZigpOworfQorCitGdW5jdGlvbiogSW5zdHJQcm9mU3ltdGFiOjpnZXRGdW5jdGlvbih1aW50NjRfdCBGdW5jTUQ1SGFzaCkgeworICBmaW5hbGl6ZVN5bXRhYigpOworICBhdXRvIFJlc3VsdCA9CisgICAgICBzdGQ6Omxvd2VyX2JvdW5kKE1ENUZ1bmNNYXAuYmVnaW4oKSwgTUQ1RnVuY01hcC5lbmQoKSwgRnVuY01ENUhhc2gsCisgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6cGFpcjx1aW50NjRfdCwgRnVuY3Rpb24qPiAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBSSFMpIHsgcmV0dXJuIExIUy5maXJzdCA8IFJIUzsgfSk7CisgIGlmIChSZXN1bHQgIT0gTUQ1RnVuY01hcC5lbmQoKSAmJiBSZXN1bHQtPmZpcnN0ID09IEZ1bmNNRDVIYXNoKQorICAgIHJldHVybiBSZXN1bHQtPnNlY29uZDsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vIFNlZSBhbHNvIGdldFBHT0Z1bmNOYW1lIGltcGxlbWVudGF0aW9uLiBUaGVzZSB0d28gbmVlZCB0byBiZQorLy8gbWF0Y2hlZC4KK1N0cmluZ1JlZiBJbnN0clByb2ZTeW10YWI6OmdldE9yaWdGdW5jTmFtZSh1aW50NjRfdCBGdW5jTUQ1SGFzaCkgeworICBTdHJpbmdSZWYgUEdPTmFtZSA9IGdldEZ1bmNOYW1lKEZ1bmNNRDVIYXNoKTsKKyAgc2l6ZV90IFMgPSBQR09OYW1lLmZpbmRfZmlyc3Rfb2YoJzonKTsKKyAgaWYgKFMgPT0gU3RyaW5nUmVmOjpucG9zKQorICAgIHJldHVybiBQR09OYW1lOworICByZXR1cm4gUEdPTmFtZS5kcm9wX2Zyb250KFMgKyAxKTsKK30KKworc3RydWN0IEluc3RyUHJvZlZhbHVlU2l0ZVJlY29yZCB7CisgIC8vLyBWYWx1ZSBwcm9maWxpbmcgZGF0YSBwYWlycyBhdCBhIGdpdmVuIHZhbHVlIHNpdGUuCisgIHN0ZDo6bGlzdDxJbnN0clByb2ZWYWx1ZURhdGE+IFZhbHVlRGF0YTsKKworICBJbnN0clByb2ZWYWx1ZVNpdGVSZWNvcmQoKSB7IFZhbHVlRGF0YS5jbGVhcigpOyB9CisgIHRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICBJbnN0clByb2ZWYWx1ZVNpdGVSZWNvcmQoSW5wdXRJdGVyYXRvciBGLCBJbnB1dEl0ZXJhdG9yIEwpCisgICAgICA6IFZhbHVlRGF0YShGLCBMKSB7fQorCisgIC8vLyBTb3J0IFZhbHVlRGF0YSBhc2NlbmRpbmcgYnkgVmFsdWUKKyAgdm9pZCBzb3J0QnlUYXJnZXRWYWx1ZXMoKSB7CisgICAgVmFsdWVEYXRhLnNvcnQoCisgICAgICAgIFtdKGNvbnN0IEluc3RyUHJvZlZhbHVlRGF0YSAmbGVmdCwgY29uc3QgSW5zdHJQcm9mVmFsdWVEYXRhICZyaWdodCkgeworICAgICAgICAgIHJldHVybiBsZWZ0LlZhbHVlIDwgcmlnaHQuVmFsdWU7CisgICAgICAgIH0pOworICB9CisgIC8vLyBTb3J0IFZhbHVlRGF0YSBEZXNjZW5kaW5nIGJ5IENvdW50CisgIGlubGluZSB2b2lkIHNvcnRCeUNvdW50KCk7CisKKyAgLy8vIE1lcmdlIGRhdGEgZnJvbSBhbm90aGVyIEluc3RyUHJvZlZhbHVlU2l0ZVJlY29yZAorICAvLy8gT3B0aW9uYWxseSBzY2FsZSBtZXJnZWQgY291bnRzIGJ5IFxwIFdlaWdodC4KKyAgdm9pZCBtZXJnZShJbnN0clByb2ZWYWx1ZVNpdGVSZWNvcmQgJklucHV0LCB1aW50NjRfdCBXZWlnaHQsCisgICAgICAgICAgICAgZnVuY3Rpb25fcmVmPHZvaWQoaW5zdHJwcm9mX2Vycm9yKT4gV2Fybik7CisgIC8vLyBTY2FsZSB1cCB2YWx1ZSBwcm9maWxlIGRhdGEgY291bnRzLgorICB2b2lkIHNjYWxlKHVpbnQ2NF90IFdlaWdodCwgZnVuY3Rpb25fcmVmPHZvaWQoaW5zdHJwcm9mX2Vycm9yKT4gV2Fybik7Cit9OworCisvLy8gUHJvZmlsaW5nIGluZm9ybWF0aW9uIGZvciBhIHNpbmdsZSBmdW5jdGlvbi4KK3N0cnVjdCBJbnN0clByb2ZSZWNvcmQgeworICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gQ291bnRzOworCisgIEluc3RyUHJvZlJlY29yZCgpID0gZGVmYXVsdDsKKyAgSW5zdHJQcm9mUmVjb3JkKHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBDb3VudHMpIDogQ291bnRzKHN0ZDo6bW92ZShDb3VudHMpKSB7fQorICBJbnN0clByb2ZSZWNvcmQoSW5zdHJQcm9mUmVjb3JkICYmKSA9IGRlZmF1bHQ7CisgIEluc3RyUHJvZlJlY29yZChjb25zdCBJbnN0clByb2ZSZWNvcmQgJlJIUykKKyAgICAgIDogQ291bnRzKFJIUy5Db3VudHMpLAorICAgICAgICBWYWx1ZURhdGEoUkhTLlZhbHVlRGF0YQorICAgICAgICAgICAgICAgICAgICAgID8gbGx2bTo6bWFrZV91bmlxdWU8VmFsdWVQcm9mRGF0YT4oKlJIUy5WYWx1ZURhdGEpCisgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyKSB7fQorICBJbnN0clByb2ZSZWNvcmQgJm9wZXJhdG9yPShJbnN0clByb2ZSZWNvcmQgJiYpID0gZGVmYXVsdDsKKyAgSW5zdHJQcm9mUmVjb3JkICZvcGVyYXRvcj0oY29uc3QgSW5zdHJQcm9mUmVjb3JkICZSSFMpIHsKKyAgICBDb3VudHMgPSBSSFMuQ291bnRzOworICAgIGlmICghUkhTLlZhbHVlRGF0YSkgeworICAgICAgVmFsdWVEYXRhID0gbnVsbHB0cjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgaWYgKCFWYWx1ZURhdGEpCisgICAgICBWYWx1ZURhdGEgPSBsbHZtOjptYWtlX3VuaXF1ZTxWYWx1ZVByb2ZEYXRhPigqUkhTLlZhbHVlRGF0YSk7CisgICAgZWxzZQorICAgICAgKlZhbHVlRGF0YSA9ICpSSFMuVmFsdWVEYXRhOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiB2YWx1ZSBwcm9maWxlIGtpbmRzIHdpdGggbm9uLXplcm8gbnVtYmVyCisgIC8vLyBvZiBwcm9maWxlIHNpdGVzLgorICBpbmxpbmUgdWludDMyX3QgZ2V0TnVtVmFsdWVLaW5kcygpIGNvbnN0OworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgaW5zdHJ1bWVudGVkIHNpdGVzIGZvciBWYWx1ZUtpbmQuCisgIGlubGluZSB1aW50MzJfdCBnZXROdW1WYWx1ZVNpdGVzKHVpbnQzMl90IFZhbHVlS2luZCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIFZhbHVlRGF0YSBmb3IgVmFsdWVLaW5kLgorICBpbmxpbmUgdWludDMyX3QgZ2V0TnVtVmFsdWVEYXRhKHVpbnQzMl90IFZhbHVlS2luZCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHZhbHVlIGRhdGEgY29sbGVjdGVkIGZvciBWYWx1ZUtpbmQgYXQgcHJvZmlsaW5nCisgIC8vLyBzaXRlOiBTaXRlLgorICBpbmxpbmUgdWludDMyX3QgZ2V0TnVtVmFsdWVEYXRhRm9yU2l0ZSh1aW50MzJfdCBWYWx1ZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNpdGUpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIGFycmF5IG9mIHByb2ZpbGVkIHZhbHVlcyBhdCBccCBTaXRlLiBJZiBccCBUb3RhbEMKKyAgLy8vIGlzIG5vdCBudWxsLCB0aGUgdG90YWwgY291bnQgb2YgYWxsIHRhcmdldCB2YWx1ZXMgYXQgdGhpcyBzaXRlCisgIC8vLyB3aWxsIGJlIHN0b3JlZCBpbiBcYyAqVG90YWxDLgorICBpbmxpbmUgc3RkOjp1bmlxdWVfcHRyPEluc3RyUHJvZlZhbHVlRGF0YVtdPgorICBnZXRWYWx1ZUZvclNpdGUodWludDMyX3QgVmFsdWVLaW5kLCB1aW50MzJfdCBTaXRlLAorICAgICAgICAgICAgICAgICAgdWludDY0X3QgKlRvdGFsQyA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIHRhcmdldCB2YWx1ZS9jb3VudHMgb2Yga2luZCBccCBWYWx1ZUtpbmQgY29sbGVjdGVkIGF0IHNpdGUKKyAgLy8vIFxwIFNpdGUgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gYXJyYXkgXHAgRGVzdC4gUmV0dXJuIHRoZSB0b3RhbAorICAvLy8gY291bnRzIG9mIGFsbCB0YXJnZXQgdmFsdWVzIGF0IHRoaXMgc2l0ZS4KKyAgaW5saW5lIHVpbnQ2NF90IGdldFZhbHVlRm9yU2l0ZShJbnN0clByb2ZWYWx1ZURhdGEgRGVzdFtdLCB1aW50MzJfdCBWYWx1ZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2l0ZSkgY29uc3Q7CisKKyAgLy8vIFJlc2VydmUgc3BhY2UgZm9yIE51bVZhbHVlU2l0ZXMgc2l0ZXMuCisgIGlubGluZSB2b2lkIHJlc2VydmVTaXRlcyh1aW50MzJfdCBWYWx1ZUtpbmQsIHVpbnQzMl90IE51bVZhbHVlU2l0ZXMpOworCisgIC8vLyBBZGQgVmFsdWVEYXRhIGZvciBWYWx1ZUtpbmQgYXQgdmFsdWUgU2l0ZS4KKyAgdm9pZCBhZGRWYWx1ZURhdGEodWludDMyX3QgVmFsdWVLaW5kLCB1aW50MzJfdCBTaXRlLAorICAgICAgICAgICAgICAgICAgICBJbnN0clByb2ZWYWx1ZURhdGEgKlZEYXRhLCB1aW50MzJfdCBOLAorICAgICAgICAgICAgICAgICAgICBJbnN0clByb2ZTeW10YWIgKlN5bVRhYik7CisKKyAgLy8vIE1lcmdlIHRoZSBjb3VudHMgaW4gXHAgT3RoZXIgaW50byB0aGlzIG9uZS4KKyAgLy8vIE9wdGlvbmFsbHkgc2NhbGUgbWVyZ2VkIGNvdW50cyBieSBccCBXZWlnaHQuCisgIHZvaWQgbWVyZ2UoSW5zdHJQcm9mUmVjb3JkICZPdGhlciwgdWludDY0X3QgV2VpZ2h0LAorICAgICAgICAgICAgIGZ1bmN0aW9uX3JlZjx2b2lkKGluc3RycHJvZl9lcnJvcik+IFdhcm4pOworCisgIC8vLyBTY2FsZSB1cCBwcm9maWxlIGNvdW50cyAoaW5jbHVkaW5nIHZhbHVlIHByb2ZpbGUgZGF0YSkgYnkKKyAgLy8vIFxwIFdlaWdodC4KKyAgdm9pZCBzY2FsZSh1aW50NjRfdCBXZWlnaHQsIGZ1bmN0aW9uX3JlZjx2b2lkKGluc3RycHJvZl9lcnJvcik+IFdhcm4pOworCisgIC8vLyBTb3J0IHZhbHVlIHByb2ZpbGUgZGF0YSAocGVyIHNpdGUpIGJ5IGNvdW50LgorICB2b2lkIHNvcnRWYWx1ZURhdGEoKSB7CisgICAgZm9yICh1aW50MzJfdCBLaW5kID0gSVBWS19GaXJzdDsgS2luZCA8PSBJUFZLX0xhc3Q7ICsrS2luZCkKKyAgICAgIGZvciAoYXV0byAmU1IgOiBnZXRWYWx1ZVNpdGVzRm9yS2luZChLaW5kKSkKKyAgICAgICAgU1Iuc29ydEJ5Q291bnQoKTsKKyAgfQorCisgIC8vLyBDbGVhciB2YWx1ZSBkYXRhIGVudHJpZXMgYW5kIGVkZ2UgY291bnRlcnMuCisgIHZvaWQgQ2xlYXIoKSB7CisgICAgQ291bnRzLmNsZWFyKCk7CisgICAgY2xlYXJWYWx1ZURhdGEoKTsKKyAgfQorCisgIC8vLyBDbGVhciB2YWx1ZSBkYXRhIGVudHJpZXMKKyAgdm9pZCBjbGVhclZhbHVlRGF0YSgpIHsgVmFsdWVEYXRhID0gbnVsbHB0cjsgfQorCitwcml2YXRlOgorICBzdHJ1Y3QgVmFsdWVQcm9mRGF0YSB7CisgICAgc3RkOjp2ZWN0b3I8SW5zdHJQcm9mVmFsdWVTaXRlUmVjb3JkPiBJbmRpcmVjdENhbGxTaXRlczsKKyAgICBzdGQ6OnZlY3RvcjxJbnN0clByb2ZWYWx1ZVNpdGVSZWNvcmQ+IE1lbU9QU2l6ZXM7CisgIH07CisgIHN0ZDo6dW5pcXVlX3B0cjxWYWx1ZVByb2ZEYXRhPiBWYWx1ZURhdGE7CisKKyAgTXV0YWJsZUFycmF5UmVmPEluc3RyUHJvZlZhbHVlU2l0ZVJlY29yZD4KKyAgZ2V0VmFsdWVTaXRlc0ZvcktpbmQodWludDMyX3QgVmFsdWVLaW5kKSB7CisgICAgLy8gQ2FzdCB0byAvYWRkLyBjb25zdCAoc2hvdWxkIGJlIGFuIGltcGxpY2l0X2Nhc3QsIGlkZWFsbHksIGlmIHRoYXQncyBldmVyCisgICAgLy8gaW1wbGVtZW50ZWQgaW4gTExWTSkgdG8gY2FsbCB0aGUgY29uc3Qgb3ZlcmxvYWQgb2YgdGhpcyBmdW5jdGlvbiwgdGhlbgorICAgIC8vIGNhc3QgYXdheSB0aGUgY29uc3RuZXNzIGZyb20gdGhlIHJlc3VsdC4KKyAgICBhdXRvIEFSID0gY29uc3RfY2FzdDxjb25zdCBJbnN0clByb2ZSZWNvcmQgKj4odGhpcyktPmdldFZhbHVlU2l0ZXNGb3JLaW5kKAorICAgICAgICBWYWx1ZUtpbmQpOworICAgIHJldHVybiBtYWtlTXV0YWJsZUFycmF5UmVmKAorICAgICAgICBjb25zdF9jYXN0PEluc3RyUHJvZlZhbHVlU2l0ZVJlY29yZCAqPihBUi5kYXRhKCkpLCBBUi5zaXplKCkpOworICB9CisgIEFycmF5UmVmPEluc3RyUHJvZlZhbHVlU2l0ZVJlY29yZD4KKyAgZ2V0VmFsdWVTaXRlc0ZvcktpbmQodWludDMyX3QgVmFsdWVLaW5kKSBjb25zdCB7CisgICAgaWYgKCFWYWx1ZURhdGEpCisgICAgICByZXR1cm4gTm9uZTsKKyAgICBzd2l0Y2ggKFZhbHVlS2luZCkgeworICAgIGNhc2UgSVBWS19JbmRpcmVjdENhbGxUYXJnZXQ6CisgICAgICByZXR1cm4gVmFsdWVEYXRhLT5JbmRpcmVjdENhbGxTaXRlczsKKyAgICBjYXNlIElQVktfTWVtT1BTaXplOgorICAgICAgcmV0dXJuIFZhbHVlRGF0YS0+TWVtT1BTaXplczsKKyAgICBkZWZhdWx0OgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biB2YWx1ZSBraW5kISIpOworICAgIH0KKyAgfQorCisgIHN0ZDo6dmVjdG9yPEluc3RyUHJvZlZhbHVlU2l0ZVJlY29yZD4gJgorICBnZXRPckNyZWF0ZVZhbHVlU2l0ZXNGb3JLaW5kKHVpbnQzMl90IFZhbHVlS2luZCkgeworICAgIGlmICghVmFsdWVEYXRhKQorICAgICAgVmFsdWVEYXRhID0gbGx2bTo6bWFrZV91bmlxdWU8VmFsdWVQcm9mRGF0YT4oKTsKKyAgICBzd2l0Y2ggKFZhbHVlS2luZCkgeworICAgIGNhc2UgSVBWS19JbmRpcmVjdENhbGxUYXJnZXQ6CisgICAgICByZXR1cm4gVmFsdWVEYXRhLT5JbmRpcmVjdENhbGxTaXRlczsKKyAgICBjYXNlIElQVktfTWVtT1BTaXplOgorICAgICAgcmV0dXJuIFZhbHVlRGF0YS0+TWVtT1BTaXplczsKKyAgICBkZWZhdWx0OgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biB2YWx1ZSBraW5kISIpOworICAgIH0KKyAgfQorCisgIC8vIE1hcCBpbmRpcmVjdCBjYWxsIHRhcmdldCBuYW1lIGhhc2ggdG8gbmFtZSBzdHJpbmcuCisgIHVpbnQ2NF90IHJlbWFwVmFsdWUodWludDY0X3QgVmFsdWUsIHVpbnQzMl90IFZhbHVlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICBJbnN0clByb2ZTeW10YWIgKlN5bVRhYik7CisKKyAgLy8gTWVyZ2UgVmFsdWUgUHJvZmlsZSBkYXRhIGZyb20gU3JjIHJlY29yZCB0byB0aGlzIHJlY29yZCBmb3IgVmFsdWVLaW5kLgorICAvLyBTY2FsZSBtZXJnZWQgdmFsdWUgY291bnRzIGJ5IFxwIFdlaWdodC4KKyAgdm9pZCBtZXJnZVZhbHVlUHJvZkRhdGEodWludDMyX3QgVmFsa2VLaW5kLCBJbnN0clByb2ZSZWNvcmQgJlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgV2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9yZWY8dm9pZChpbnN0cnByb2ZfZXJyb3IpPiBXYXJuKTsKKworICAvLyBTY2FsZSB1cCB2YWx1ZSBwcm9maWxlIGRhdGEgY291bnQuCisgIHZvaWQgc2NhbGVWYWx1ZVByb2ZEYXRhKHVpbnQzMl90IFZhbHVlS2luZCwgdWludDY0X3QgV2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9yZWY8dm9pZChpbnN0cnByb2ZfZXJyb3IpPiBXYXJuKTsKK307CisKK3N0cnVjdCBOYW1lZEluc3RyUHJvZlJlY29yZCA6IEluc3RyUHJvZlJlY29yZCB7CisgIFN0cmluZ1JlZiBOYW1lOworICB1aW50NjRfdCBIYXNoOworCisgIE5hbWVkSW5zdHJQcm9mUmVjb3JkKCkgPSBkZWZhdWx0OworICBOYW1lZEluc3RyUHJvZlJlY29yZChTdHJpbmdSZWYgTmFtZSwgdWludDY0X3QgSGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IENvdW50cykKKyAgICAgIDogSW5zdHJQcm9mUmVjb3JkKHN0ZDo6bW92ZShDb3VudHMpKSwgTmFtZShOYW1lKSwgSGFzaChIYXNoKSB7fQorfTsKKwordWludDMyX3QgSW5zdHJQcm9mUmVjb3JkOjpnZXROdW1WYWx1ZUtpbmRzKCkgY29uc3QgeworICB1aW50MzJfdCBOdW1WYWx1ZUtpbmRzID0gMDsKKyAgZm9yICh1aW50MzJfdCBLaW5kID0gSVBWS19GaXJzdDsgS2luZCA8PSBJUFZLX0xhc3Q7ICsrS2luZCkKKyAgICBOdW1WYWx1ZUtpbmRzICs9ICEoZ2V0VmFsdWVTaXRlc0ZvcktpbmQoS2luZCkuZW1wdHkoKSk7CisgIHJldHVybiBOdW1WYWx1ZUtpbmRzOworfQorCit1aW50MzJfdCBJbnN0clByb2ZSZWNvcmQ6OmdldE51bVZhbHVlRGF0YSh1aW50MzJfdCBWYWx1ZUtpbmQpIGNvbnN0IHsKKyAgdWludDMyX3QgTiA9IDA7CisgIGZvciAoYXV0byAmU1IgOiBnZXRWYWx1ZVNpdGVzRm9yS2luZChWYWx1ZUtpbmQpKQorICAgIE4gKz0gU1IuVmFsdWVEYXRhLnNpemUoKTsKKyAgcmV0dXJuIE47Cit9CisKK3VpbnQzMl90IEluc3RyUHJvZlJlY29yZDo6Z2V0TnVtVmFsdWVTaXRlcyh1aW50MzJfdCBWYWx1ZUtpbmQpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFZhbHVlU2l0ZXNGb3JLaW5kKFZhbHVlS2luZCkuc2l6ZSgpOworfQorCit1aW50MzJfdCBJbnN0clByb2ZSZWNvcmQ6OmdldE51bVZhbHVlRGF0YUZvclNpdGUodWludDMyX3QgVmFsdWVLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNpdGUpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFZhbHVlU2l0ZXNGb3JLaW5kKFZhbHVlS2luZClbU2l0ZV0uVmFsdWVEYXRhLnNpemUoKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPEluc3RyUHJvZlZhbHVlRGF0YVtdPgorSW5zdHJQcm9mUmVjb3JkOjpnZXRWYWx1ZUZvclNpdGUodWludDMyX3QgVmFsdWVLaW5kLCB1aW50MzJfdCBTaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgKlRvdGFsQykgY29uc3QgeworICB1aW50NjRfdCBEdW1teTsKKyAgdWludDY0X3QgJlRvdGFsQ291bnQgPSAoVG90YWxDID09IG51bGxwdHIgPyBEdW1teSA6ICpUb3RhbEMpOworICB1aW50MzJfdCBOID0gZ2V0TnVtVmFsdWVEYXRhRm9yU2l0ZShWYWx1ZUtpbmQsIFNpdGUpOworICBpZiAoTiA9PSAwKSB7CisgICAgVG90YWxDb3VudCA9IDA7CisgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxJbnN0clByb2ZWYWx1ZURhdGFbXT4obnVsbHB0cik7CisgIH0KKworICBhdXRvIFZEID0gbGx2bTo6bWFrZV91bmlxdWU8SW5zdHJQcm9mVmFsdWVEYXRhW10+KE4pOworICBUb3RhbENvdW50ID0gZ2V0VmFsdWVGb3JTaXRlKFZELmdldCgpLCBWYWx1ZUtpbmQsIFNpdGUpOworCisgIHJldHVybiBWRDsKK30KKwordWludDY0X3QgSW5zdHJQcm9mUmVjb3JkOjpnZXRWYWx1ZUZvclNpdGUoSW5zdHJQcm9mVmFsdWVEYXRhIERlc3RbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFZhbHVlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNpdGUpIGNvbnN0IHsKKyAgdWludDMyX3QgSSA9IDA7CisgIHVpbnQ2NF90IFRvdGFsQ291bnQgPSAwOworICBmb3IgKGF1dG8gViA6IGdldFZhbHVlU2l0ZXNGb3JLaW5kKFZhbHVlS2luZClbU2l0ZV0uVmFsdWVEYXRhKSB7CisgICAgRGVzdFtJXS5WYWx1ZSA9IFYuVmFsdWU7CisgICAgRGVzdFtJXS5Db3VudCA9IFYuQ291bnQ7CisgICAgVG90YWxDb3VudCA9IFNhdHVyYXRpbmdBZGQoVG90YWxDb3VudCwgVi5Db3VudCk7CisgICAgSSsrOworICB9CisgIHJldHVybiBUb3RhbENvdW50OworfQorCit2b2lkIEluc3RyUHJvZlJlY29yZDo6cmVzZXJ2ZVNpdGVzKHVpbnQzMl90IFZhbHVlS2luZCwgdWludDMyX3QgTnVtVmFsdWVTaXRlcykgeworICBpZiAoIU51bVZhbHVlU2l0ZXMpCisgICAgcmV0dXJuOworICBnZXRPckNyZWF0ZVZhbHVlU2l0ZXNGb3JLaW5kKFZhbHVlS2luZCkucmVzZXJ2ZShOdW1WYWx1ZVNpdGVzKTsKK30KKworaW5saW5lIHN1cHBvcnQ6OmVuZGlhbm5lc3MgZ2V0SG9zdEVuZGlhbm5lc3MoKSB7CisgIHJldHVybiBzeXM6OklzTGl0dGxlRW5kaWFuSG9zdCA/IHN1cHBvcnQ6OmxpdHRsZSA6IHN1cHBvcnQ6OmJpZzsKK30KKworLy8gSW5jbHVkZSBkZWZpbml0aW9ucyBmb3IgdmFsdWUgcHJvZmlsZSBkYXRhCisjZGVmaW5lIElOU1RSX1BST0ZfVkFMVUVfUFJPRl9EQVRBCisjaW5jbHVkZSAibGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2ZEYXRhLmluYyIKKwordm9pZCBJbnN0clByb2ZWYWx1ZVNpdGVSZWNvcmQ6OnNvcnRCeUNvdW50KCkgeworICBWYWx1ZURhdGEuc29ydCgKKyAgICAgIFtdKGNvbnN0IEluc3RyUHJvZlZhbHVlRGF0YSAmbGVmdCwgY29uc3QgSW5zdHJQcm9mVmFsdWVEYXRhICZyaWdodCkgeworICAgICAgICByZXR1cm4gbGVmdC5Db3VudCA+IHJpZ2h0LkNvdW50OworICAgICAgfSk7CisgIC8vIE5vdyB0cnVuY2F0ZQorICBzaXplX3QgbWF4X3MgPSBJTlNUUl9QUk9GX01BWF9OVU1fVkFMX1BFUl9TSVRFOworICBpZiAoVmFsdWVEYXRhLnNpemUoKSA+IG1heF9zKQorICAgIFZhbHVlRGF0YS5yZXNpemUobWF4X3MpOworfQorCituYW1lc3BhY2UgSW5kZXhlZEluc3RyUHJvZiB7CisKK2VudW0gY2xhc3MgSGFzaFQgOiB1aW50MzJfdCB7CisgIE1ENSwKKyAgTGFzdCA9IE1ENQorfTsKKworaW5saW5lIHVpbnQ2NF90IENvbXB1dGVIYXNoKEhhc2hUIFR5cGUsIFN0cmluZ1JlZiBLKSB7CisgIHN3aXRjaCAoVHlwZSkgeworICBjYXNlIEhhc2hUOjpNRDU6CisgICAgcmV0dXJuIE1ENUhhc2goSyk7CisgIH0KKyAgbGx2bV91bnJlYWNoYWJsZSgiVW5oYW5kbGVkIGhhc2ggdHlwZSIpOworfQorCitjb25zdCB1aW50NjRfdCBNYWdpYyA9IDB4ODE2OTY2NmY3MjcwNmNmZjsgLy8gIlx4ZmZscHJvZmlceDgxIgorCitlbnVtIFByb2ZWZXJzaW9uIHsKKyAgLy8gVmVyc2lvbiAxIGlzIHRoZSBmaXJzdCB2ZXJzaW9uLiBJbiB0aGlzIHZlcnNpb24sIHRoZSB2YWx1ZSBvZgorICAvLyBhIGtleS92YWx1ZSBwYWlyIGNhbiBvbmx5IGluY2x1ZGUgcHJvZmlsZSBkYXRhIG9mIGEgc2luZ2xlIGZ1bmN0aW9uLgorICAvLyBEdWUgdG8gdGhpcyByZXN0cmljdGlvbiwgdGhlIG51bWJlciBvZiBibG9jayBjb3VudGVycyBmb3IgYSBnaXZlbgorICAvLyBmdW5jdGlvbiBpcyBub3QgcmVjb3JkZWQgYnV0IGRlcml2ZWQgZnJvbSB0aGUgbGVuZ3RoIG9mIHRoZSB2YWx1ZS4KKyAgVmVyc2lvbjEgPSAxLAorICAvLyBUaGUgdmVyc2lvbiAyIGZvcm1hdCBzdXBwb3J0cyByZWNvcmRpbmcgcHJvZmlsZSBkYXRhIG9mIG11bHRpcGxlCisgIC8vIGZ1bmN0aW9ucyB3aGljaCBzaGFyZSB0aGUgc2FtZSBrZXkgaW4gb25lIHZhbHVlIGZpZWxkLiBUbyBzdXBwb3J0IHRoaXMsCisgIC8vIHRoZSBudW1iZXIgYmxvY2sgY291bnRlcnMgaXMgcmVjb3JkZWQgYXMgYW4gdWludDY0X3QgZmllbGQgcmlnaHQgYWZ0ZXIgdGhlCisgIC8vIGZ1bmN0aW9uIHN0cnVjdHVyYWwgaGFzaC4KKyAgVmVyc2lvbjIgPSAyLAorICAvLyBWZXJzaW9uIDMgc3VwcG9ydHMgdmFsdWUgcHJvZmlsZSBkYXRhLiBUaGUgdmFsdWUgcHJvZmlsZSBkYXRhIGlzIGV4cGVjdGVkCisgIC8vIHRvIGZvbGxvdyB0aGUgYmxvY2sgY291bnRlciBwcm9maWxlIGRhdGEuCisgIFZlcnNpb24zID0gMywKKyAgLy8gSW4gdGhpcyB2ZXJzaW9uLCBwcm9maWxlIHN1bW1hcnkgZGF0YSBcYyBJbmRleGVkSW5zdHJQcm9mOjpTdW1tYXJ5IGlzCisgIC8vIHN0b3JlZCBhZnRlciB0aGUgcHJvZmlsZSBoZWFkZXIuCisgIFZlcnNpb240ID0gNCwKKyAgLy8gSW4gdGhpcyB2ZXJzaW9uLCB0aGUgZnJvbnRlbmQgUEdPIHN0YWJsZSBoYXNoIGFsZ29yaXRobSBkZWZhdWx0cyB0byBWMi4KKyAgVmVyc2lvbjUgPSA1LAorICAvLyBUaGUgY3VycmVudCB2ZXJzaW9uIGlzIDUuCisgIEN1cnJlbnRWZXJzaW9uID0gSU5TVFJfUFJPRl9JTkRFWF9WRVJTSU9OCit9OworY29uc3QgdWludDY0X3QgVmVyc2lvbiA9IFByb2ZWZXJzaW9uOjpDdXJyZW50VmVyc2lvbjsKKworY29uc3QgSGFzaFQgSGFzaFR5cGUgPSBIYXNoVDo6TUQ1OworCitpbmxpbmUgdWludDY0X3QgQ29tcHV0ZUhhc2goU3RyaW5nUmVmIEspIHsgcmV0dXJuIENvbXB1dGVIYXNoKEhhc2hUeXBlLCBLKTsgfQorCisvLyBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBmaWxlIGhlYWRlciBvZiB0aGUgTExWTSBwcm9maWxlCisvLyBkYXRhIGZpbGUgaW4gaW5kZXhlZC1mb3JtYXQuCitzdHJ1Y3QgSGVhZGVyIHsKKyAgdWludDY0X3QgTWFnaWM7CisgIHVpbnQ2NF90IFZlcnNpb247CisgIHVpbnQ2NF90IFVudXNlZDsgLy8gQmVjb21lcyB1bnVzZWQgc2luY2UgdmVyc2lvbiA0CisgIHVpbnQ2NF90IEhhc2hUeXBlOworICB1aW50NjRfdCBIYXNoT2Zmc2V0OworfTsKKworLy8gUHJvZmlsZSBzdW1tYXJ5IGRhdGEgcmVjb3JkZWQgaW4gdGhlIHByb2ZpbGUgZGF0YSBmaWxlIGluIGluZGV4ZWQKKy8vIGZvcm1hdC4gSXQgaXMgaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDQuIFRoZSBzdW1tYXJ5IGRhdGEgZm9sbG93cworLy8gcmlnaHQgYWZ0ZXIgdGhlIHByb2ZpbGUgZmlsZSBoZWFkZXIuCitzdHJ1Y3QgU3VtbWFyeSB7CisgIHN0cnVjdCBFbnRyeSB7CisgICAgdWludDY0X3QgQ3V0b2ZmOyAvLy88IFRoZSByZXF1aXJlZCBwZXJjZW50aWxlIG9mIHRvdGFsIGV4ZWN1dGlvbiBjb3VudC4KKyAgICB1aW50NjRfdAorICAgICAgICBNaW5CbG9ja0NvdW50OyAgLy8vPCBUaGUgbWluaW11bSBleGVjdXRpb24gY291bnQgZm9yIHRoaXMgcGVyY2VudGlsZS4KKyAgICB1aW50NjRfdCBOdW1CbG9ja3M7IC8vLzwgTnVtYmVyIG9mIGJsb2NrcyA+PSB0aGUgbWludW11bSBleGVjdXRpb24gY291bnQuCisgIH07CisgIC8vIFRoZSBmaWVsZCBraW5kIGVudW1lcmF0b3IgdG8gYXNzaWduZWQgdmFsdWUgbWFwcGluZyBzaG91bGQgcmVtYWluCisgIC8vIHVuY2hhbmdlZCAgd2hlbiBhIG5ldyBraW5kIGlzIGFkZGVkIG9yIGFuIG9sZCBraW5kIGdldHMgZGVsZXRlZCBpbgorICAvLyB0aGUgZnV0dXJlLgorICBlbnVtIFN1bW1hcnlGaWVsZEtpbmQgeworICAgIC8vLyBUaGUgdG90YWwgbnVtYmVyIG9mIGZ1bmN0aW9ucyBpbnN0cnVtZW50ZWQuCisgICAgVG90YWxOdW1GdW5jdGlvbnMgPSAwLAorICAgIC8vLyBUb3RhbCBudW1iZXIgb2YgaW5zdHJ1bWVudGVkIGJsb2Nrcy9lZGdlcy4KKyAgICBUb3RhbE51bUJsb2NrcyA9IDEsCisgICAgLy8vIFRoZSBtYXhpbWFsIGV4ZWN1dGlvbiBjb3VudCBhbW9uZyBhbGwgZnVuY3Rpb25zLgorICAgIC8vLyBUaGlzIGZpZWxkIGRvZXMgbm90IGV4aXN0IGZvciBwcm9maWxlIGRhdGEgZnJvbSBJUiBiYXNlZAorICAgIC8vLyBpbnN0cnVtZW50YXRpb24uCisgICAgTWF4RnVuY3Rpb25Db3VudCA9IDIsCisgICAgLy8vIE1heCBibG9jayBjb3VudCBvZiB0aGUgcHJvZ3JhbS4KKyAgICBNYXhCbG9ja0NvdW50ID0gMywKKyAgICAvLy8gTWF4IGludGVybmFsIGJsb2NrIGNvdW50IG9mIHRoZSBwcm9ncmFtIChleGNsdWRpbmcgZW50cnkgYmxvY2tzKS4KKyAgICBNYXhJbnRlcm5hbEJsb2NrQ291bnQgPSA0LAorICAgIC8vLyBUaGUgc3VtIG9mIGFsbCBpbnN0cnVtZW50ZWQgYmxvY2sgY291bnRzLgorICAgIFRvdGFsQmxvY2tDb3VudCA9IDUsCisgICAgTnVtS2luZHMgPSBUb3RhbEJsb2NrQ291bnQgKyAxCisgIH07CisKKyAgLy8gVGhlIG51bWJlciBvZiBzdW1tbWFyeSBmaWVsZHMgZm9sbG93aW5nIHRoZSBzdW1tYXJ5IGhlYWRlci4KKyAgdWludDY0X3QgTnVtU3VtbWFyeUZpZWxkczsKKyAgLy8gVGhlIG51bWJlciBvZiBDdXRvZmYgRW50cmllcyAoU3VtbWFyeTo6RW50cnkpIGZvbGxvd2luZyBzdW1tYXJ5IGZpZWxkcy4KKyAgdWludDY0X3QgTnVtQ3V0b2ZmRW50cmllczsKKworICBTdW1tYXJ5KCkgPSBkZWxldGU7CisgIFN1bW1hcnkodWludDMyX3QgU2l6ZSkgeyBtZW1zZXQodGhpcywgMCwgU2l6ZSk7IH0KKworICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwdHIpIHsgOjpvcGVyYXRvciBkZWxldGUocHRyKTsgfQorCisgIHN0YXRpYyB1aW50MzJfdCBnZXRTaXplKHVpbnQzMl90IE51bVN1bUZpZWxkcywgdWludDMyX3QgTnVtQ3V0b2ZmRW50cmllcykgeworICAgIHJldHVybiBzaXplb2YoU3VtbWFyeSkgKyBOdW1DdXRvZmZFbnRyaWVzICogc2l6ZW9mKEVudHJ5KSArCisgICAgICAgICAgIE51bVN1bUZpZWxkcyAqIHNpemVvZih1aW50NjRfdCk7CisgIH0KKworICBjb25zdCB1aW50NjRfdCAqZ2V0U3VtbWFyeURhdGFCYXNlKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90ICo+KHRoaXMgKyAxKTsKKyAgfQorCisgIHVpbnQ2NF90ICpnZXRTdW1tYXJ5RGF0YUJhc2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QgKj4odGhpcyArIDEpOworICB9CisKKyAgY29uc3QgRW50cnkgKmdldEN1dG9mZkVudHJ5QmFzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbnRyeSAqPigKKyAgICAgICAgJmdldFN1bW1hcnlEYXRhQmFzZSgpW051bVN1bW1hcnlGaWVsZHNdKTsKKyAgfQorCisgIEVudHJ5ICpnZXRDdXRvZmZFbnRyeUJhc2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RW50cnkgKj4oJmdldFN1bW1hcnlEYXRhQmFzZSgpW051bVN1bW1hcnlGaWVsZHNdKTsKKyAgfQorCisgIHVpbnQ2NF90IGdldChTdW1tYXJ5RmllbGRLaW5kIEspIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3VtbWFyeURhdGFCYXNlKClbS107CisgIH0KKworICB2b2lkIHNldChTdW1tYXJ5RmllbGRLaW5kIEssIHVpbnQ2NF90IFYpIHsKKyAgICBnZXRTdW1tYXJ5RGF0YUJhc2UoKVtLXSA9IFY7CisgIH0KKworICBjb25zdCBFbnRyeSAmZ2V0RW50cnkodWludDMyX3QgSSkgY29uc3QgeyByZXR1cm4gZ2V0Q3V0b2ZmRW50cnlCYXNlKClbSV07IH0KKworICB2b2lkIHNldEVudHJ5KHVpbnQzMl90IEksIGNvbnN0IFByb2ZpbGVTdW1tYXJ5RW50cnkgJkUpIHsKKyAgICBFbnRyeSAmRVIgPSBnZXRDdXRvZmZFbnRyeUJhc2UoKVtJXTsKKyAgICBFUi5DdXRvZmYgPSBFLkN1dG9mZjsKKyAgICBFUi5NaW5CbG9ja0NvdW50ID0gRS5NaW5Db3VudDsKKyAgICBFUi5OdW1CbG9ja3MgPSBFLk51bUNvdW50czsKKyAgfQorfTsKKworaW5saW5lIHN0ZDo6dW5pcXVlX3B0cjxTdW1tYXJ5PiBhbGxvY1N1bW1hcnkodWludDMyX3QgVG90YWxTaXplKSB7CisgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8U3VtbWFyeT4obmV3ICg6Om9wZXJhdG9yIG5ldyhUb3RhbFNpemUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdW1tYXJ5KFRvdGFsU2l6ZSkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgSW5kZXhlZEluc3RyUHJvZgorCituYW1lc3BhY2UgUmF3SW5zdHJQcm9mIHsKKworLy8gVmVyc2lvbiAxOiBGaXJzdCB2ZXJzaW9uCisvLyBWZXJzaW9uIDI6IEFkZGVkIHZhbHVlIHByb2ZpbGUgZGF0YSBzZWN0aW9uLiBQZXItZnVuY3Rpb24gY29udHJvbCBkYXRhCisvLyBzdHJ1Y3QgaGFzIG1vcmUgZmllbGRzIHRvIGRlc2NyaWJlIHZhbHVlIHByb2ZpbGUgaW5mb3JtYXRpb24uCisvLyBWZXJzaW9uIDM6IENvbXByZXNzZWQgbmFtZSBzZWN0aW9uIHN1cHBvcnQuIEZ1bmN0aW9uIFBHTyBuYW1lIHJlZmVyZW5jZQorLy8gZnJvbSBjb250cm9sIGRhdGEgc3RydWN0IGlzIGNoYW5nZWQgZnJvbSByYXcgcG9pbnRlciB0byBOYW1lJ3MgTUQ1IHZhbHVlLgorLy8gVmVyc2lvbiA0OiBWYWx1ZURhdGFCZWdpbiBhbmQgVmFsdWVEYXRhU2l6ZXMgZmllbGRzIGFyZSByZW1vdmVkIGZyb20gdGhlCisvLyByYXcgaGVhZGVyLgorY29uc3QgdWludDY0X3QgVmVyc2lvbiA9IElOU1RSX1BST0ZfUkFXX1ZFUlNJT047CisKK3RlbXBsYXRlIDxjbGFzcyBJbnRQdHJUPiBpbmxpbmUgdWludDY0X3QgZ2V0TWFnaWMoKTsKK3RlbXBsYXRlIDw+IGlubGluZSB1aW50NjRfdCBnZXRNYWdpYzx1aW50NjRfdD4oKSB7CisgIHJldHVybiBJTlNUUl9QUk9GX1JBV19NQUdJQ182NDsKK30KKwordGVtcGxhdGUgPD4gaW5saW5lIHVpbnQ2NF90IGdldE1hZ2ljPHVpbnQzMl90PigpIHsKKyAgcmV0dXJuIElOU1RSX1BST0ZfUkFXX01BR0lDXzMyOworfQorCisvLyBQZXItZnVuY3Rpb24gcHJvZmlsZSBkYXRhIGhlYWRlci9jb250cm9sIHN0cnVjdHVyZS4KKy8vIFRoZSBkZWZpbml0aW9uIHNob3VsZCBtYXRjaCB0aGUgc3RydWN0dXJlIGRlZmluZWQgaW4KKy8vIGNvbXBpbGVyLXJ0L2xpYi9wcm9maWxlL0luc3RyUHJvZmlsaW5nLmguCisvLyBJdCBzaG91bGQgYWxzbyBtYXRjaCB0aGUgc3ludGhlc2l6ZWQgdHlwZSBpbgorLy8gVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24vSW5zdHJQcm9maWxpbmcuY3BwOmdldE9yQ3JlYXRlUmVnaW9uQ291bnRlcnMuCit0ZW1wbGF0ZSA8Y2xhc3MgSW50UHRyVD4gc3RydWN0IExMVk1fQUxJR05BUyg4KSBQcm9maWxlRGF0YSB7CisgICNkZWZpbmUgSU5TVFJfUFJPRl9EQVRBKFR5cGUsIExMVk1UeXBlLCBOYW1lLCBJbml0KSBUeXBlIE5hbWU7CisgICNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZkRhdGEuaW5jIgorfTsKKworLy8gRmlsZSBoZWFkZXIgc3RydWN0dXJlIG9mIHRoZSBMTFZNIHByb2ZpbGUgZGF0YSBpbiByYXcgZm9ybWF0LgorLy8gVGhlIGRlZmluaXRpb24gc2hvdWxkIG1hdGNoIHRoZSBoZWFkZXIgcmVmZXJlbmNlZCBpbgorLy8gY29tcGlsZXItcnQvbGliL3Byb2ZpbGUvSW5zdHJQcm9maWxpbmdGaWxlLmMgIGFuZAorLy8gSW5zdHJQcm9maWxpbmdCdWZmZXIuYy4KK3N0cnVjdCBIZWFkZXIgeworI2RlZmluZSBJTlNUUl9QUk9GX1JBV19IRUFERVIoVHlwZSwgTmFtZSwgSW5pdCkgY29uc3QgVHlwZSBOYW1lOworI2luY2x1ZGUgImxsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mRGF0YS5pbmMiCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgUmF3SW5zdHJQcm9mCisKKy8vIFBhcnNlIE1lbU9QIFNpemUgcmFuZ2Ugb3B0aW9uLgordm9pZCBnZXRNZW1PUFNpemVSYW5nZUZyb21PcHRpb24oU3RyaW5nUmVmIFN0ciwgaW50NjRfdCAmUmFuZ2VTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgJlJhbmdlTGFzdCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1BST0ZJTEVEQVRBX0lOU1RSUFJPRl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZkRhdGEuaW5jIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2ZEYXRhLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWM4Y2NlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2ZEYXRhLmluYwpAQCAtMCwwICsxLDc0MCBAQAorLyo9PT0tLSBJbnN0clByb2ZEYXRhLmluYyAtIGluc3RyIHByb2ZpbGluZyBydW50aW1lIHN0cnVjdHVyZXMgLSotIEMrKyAtKi09PT0gKlwKK3wqCit8KiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCit8KgorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCit8KiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCit8KgorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKy8qCisgKiBUaGlzIGlzIHRoZSBtYXN0ZXIgZmlsZSB0aGF0IGRlZmluZXMgYWxsIHRoZSBkYXRhIHN0cnVjdHVyZSwgc2lnbmF0dXJlLAorICogY29uc3RhbnQgbGl0ZXJhbHMgdGhhdCBhcmUgc2hhcmVkIGFjcm9zcyBwcm9maWxpbmcgcnVudGltZSBsaWJyYXJ5LAorICogY29tcGlsZXIgKGluc3RydW1lbnRhdGlvbiksIGFuZCBob3N0IHRvb2xzIChyZWFkZXIvd3JpdGVyKS4gVGhlIGVudGl0aWVzCisgKiBkZWZpbmVkIGluIHRoaXMgZmlsZSBhZmZlY3QgdGhlIHByb2ZpbGUgcnVudGltZSBBQkksIHRoZSByYXcgcHJvZmlsZSBmb3JtYXQsCisgKiBvciBib3RoLgorICoKKyAqIFRoZSBmaWxlIGhhcyB0d28gaWRlbnRpY2FsIGNvcGllcy4gVGhlIG1hc3RlciBjb3B5IGxpdmVzIGluIExMVk0gYW5kCisgKiB0aGUgb3RoZXIgb25lICBzaXRzIGluIGNvbXBpbGVyLXJ0L2xpYi9wcm9maWxlIGRpcmVjdG9yeS4gVG8gbWFrZSBjaGFuZ2VzCisgKiBpbiB0aGlzIGZpbGUsIGZpcnN0IG1vZGlmeSB0aGUgbWFzdGVyIGNvcHkgYW5kIGNvcHkgaXQgb3ZlciB0byBjb21waWxlci1ydC4KKyAqIFRlc3Rpbmcgb2YgYW55IGNoYW5nZSBpbiB0aGlzIGZpbGUgY2FuIHN0YXJ0IG9ubHkgYWZ0ZXIgdGhlIHR3byBjb3BpZXMgYXJlCisgKiBzeW5jZWQgdXAuCisgKgorICogVGhlIGZpcnN0IHBhcnQgb2YgdGhlIGZpbGUgaW5jbHVkZXMgbWFjcm9zIHRoYXQgZGVmaW5lcyB0eXBlcywgbmFtZXMsIGFuZAorICogaW5pdGlhbGl6ZXJzIGZvciB0aGUgbWVtYmVyIGZpZWxkcyBvZiB0aGUgY29yZSBkYXRhIHN0cnVjdHVyZXMuIFRoZSBmaWVsZAorICogZGVjbGFyYXRpb25zIGZvciBvbmUgc3RydWN0dXJlIGlzIGVuYWJsZWQgYnkgZGVmaW5pbmcgdGhlIGZpZWxkIGFjdGl2YXRpb24KKyAqIG1hY3JvIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHN0cnVjdHVyZS4gT25seSBvbmUgZmllbGQgYWN0aXZhdGlvbiByZWNvcmQKKyAqIGNhbiBiZSBkZWZpbmVkIGF0IG9uZSB0aW1lIGFuZCB0aGUgcmVzdCBkZWZpbml0aW9ucyB3aWxsIGJlIGZpbHRlcmVkIG91dCBieQorICogdGhlIHByZXByb2Nlc3Nvci4KKyAqCisgKiBFeGFtcGxlcyBvZiBob3cgdGhlIHRlbXBsYXRlIGlzIHVzZWQgdG8gaW5zdGFudGlhdGUgc3RydWN0dXJlIGRlZmluaXRpb246CisgKiAxLiBUbyBkZWNsYXJlIGEgc3RydWN0dXJlOgorICoKKyAqIHN0cnVjdCBQcm9mRGF0YSB7CisgKiAjZGVmaW5lIElOU1RSX1BST0ZfREFUQShUeXBlLCBMTFZNVHlwZSwgTmFtZSwgSW5pdGlhbGl6ZXIpIFwKKyAqICAgIFR5cGUgTmFtZTsKKyAqICNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZkRhdGEuaW5jIgorICogfTsKKyAqCisgKiAyLiBUbyBjb25zdHJ1Y3QgTExWTSB0eXBlIGFycmF5cyBmb3IgdGhlIHN0cnVjdCB0eXBlOgorICoKKyAqIFR5cGUgKkRhdGFUeXBlc1tdID0geworICogI2RlZmluZSBJTlNUUl9QUk9GX0RBVEEoVHlwZSwgTExWTVR5cGUsIE5hbWUsIEluaXRpYWxpemVyKSBcCisgKiAgIExMVk1UeXBlLAorICogI2luY2x1ZGUgImxsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mRGF0YS5pbmMiCisgKiB9OworICoKKyAqIDQuIFRvIGNvbnN0cnVjdCBjb25zdGFudCBhcnJheSBmb3IgdGhlIGluaXRpYWxpemVyczoKKyAqICNkZWZpbmUgSU5TVFJfUFJPRl9EQVRBKFR5cGUsIExMVk1UeXBlLCBOYW1lLCBJbml0aWFsaXplcikgXAorICogICBJbml0aWFsaXplciwKKyAqIENvbnN0YW50ICpDb25zdGFudFZhbHNbXSA9IHsKKyAqICNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZkRhdGEuaW5jIgorICogfTsKKyAqCisgKgorICogVGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBmaWxlIGluY2x1ZGVzIGRlZmluaXRpb25zIGFsbCBvdGhlciBlbnRpdGllcyB0aGF0CisgKiBhcmUgcmVsYXRlZCB0byBydW50aW1lIEFCSSBhbmQgZm9ybWF0LiBXaGVuIG5vIGZpZWxkIGFjdGl2YXRpb24gbWFjcm8gaXMKKyAqIGRlZmluZWQsIHRoaXMgZmlsZSBjYW4gYmUgaW5jbHVkZWQgdG8gaW50cm9kdWNlIHRoZSBkZWZpbml0aW9ucy4KKyAqCitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisvKiBGdW5jdGlvbnMgbWFya2VkIHdpdGggSU5TVFJfUFJPRl9WSVNJQklMSVRZIG11c3QgaGF2ZSBoaWRkZW4gdmlzaWJpbGl0eSBpbgorICogdGhlIGNvbXBpbGVyIHJ1bnRpbWUuICovCisjaWZuZGVmIElOU1RSX1BST0ZfVklTSUJJTElUWQorI2RlZmluZSBJTlNUUl9QUk9GX1ZJU0lCSUxJVFkKKyNlbmRpZgorCisvKiBJTlNUUl9QUk9GX0RBVEEgc3RhcnQuICovCisvKiBEZWZpbml0aW9uIG9mIG1lbWJlciBmaWVsZHMgb2YgdGhlIHBlci1mdW5jdGlvbiBjb250cm9sIHN0cnVjdHVyZS4gKi8KKyNpZm5kZWYgSU5TVFJfUFJPRl9EQVRBCisjZGVmaW5lIElOU1RSX1BST0ZfREFUQShUeXBlLCBMTFZNVHlwZSwgTmFtZSwgSW5pdGlhbGl6ZXIpCisjZWxzZQorI2RlZmluZSBJTlNUUl9QUk9GX0RBVEFfREVGSU5FRAorI2VuZGlmCitJTlNUUl9QUk9GX0RBVEEoY29uc3QgdWludDY0X3QsIGxsdm06OlR5cGU6OmdldEludDY0VHkoQ3R4KSwgTmFtZVJlZiwgXAorICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQobGx2bTo6VHlwZTo6Z2V0SW50NjRUeShDdHgpLCBcCisgICAgICAgICAgICAgICAgSW5kZXhlZEluc3RyUHJvZjo6Q29tcHV0ZUhhc2goZ2V0UEdPRnVuY05hbWVWYXJJbml0aWFsaXplcihJbmMtPmdldE5hbWUoKSkpKSkKK0lOU1RSX1BST0ZfREFUQShjb25zdCB1aW50NjRfdCwgbGx2bTo6VHlwZTo6Z2V0SW50NjRUeShDdHgpLCBGdW5jSGFzaCwgXAorICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQobGx2bTo6VHlwZTo6Z2V0SW50NjRUeShDdHgpLCBcCisgICAgICAgICAgICAgICAgSW5jLT5nZXRIYXNoKCktPmdldFpFeHRWYWx1ZSgpKSkKK0lOU1RSX1BST0ZfREFUQShjb25zdCBJbnRQdHJULCBsbHZtOjpUeXBlOjpnZXRJbnQ2NFB0clR5KEN0eCksIENvdW50ZXJQdHIsIFwKKyAgICAgICAgICAgICAgICBDb25zdGFudEV4cHI6OmdldEJpdENhc3QoQ291bnRlclB0ciwgXAorICAgICAgICAgICAgICAgIGxsdm06OlR5cGU6OmdldEludDY0UHRyVHkoQ3R4KSkpCisvKiBUaGlzIGlzIHVzZWQgdG8gbWFwIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciB0aGUgaW5kaXJlY3QgY2FsbCB0YXJnZXRzIHRvCisgKiBmdW5jdGlvbiBuYW1lIGhhc2hlcyBkdXJpbmcgdGhlIGNvbnZlcnNpb24gZnJvbSByYXcgdG8gbWVyZ2VkIHByb2ZpbGUKKyAqIGRhdGEuCisgKi8KK0lOU1RSX1BST0ZfREFUQShjb25zdCBJbnRQdHJULCBsbHZtOjpUeXBlOjpnZXRJbnQ4UHRyVHkoQ3R4KSwgRnVuY3Rpb25Qb2ludGVyLCBcCisgICAgICAgICAgICAgICAgRnVuY3Rpb25BZGRyKQorSU5TVFJfUFJPRl9EQVRBKEludFB0clQsIGxsdm06OlR5cGU6OmdldEludDhQdHJUeShDdHgpLCBWYWx1ZXMsIFwKKyAgICAgICAgICAgICAgICBWYWx1ZXNQdHJFeHByKQorSU5TVFJfUFJPRl9EQVRBKGNvbnN0IHVpbnQzMl90LCBsbHZtOjpUeXBlOjpnZXRJbnQzMlR5KEN0eCksIE51bUNvdW50ZXJzLCBcCisgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChsbHZtOjpUeXBlOjpnZXRJbnQzMlR5KEN0eCksIE51bUNvdW50ZXJzKSkKK0lOU1RSX1BST0ZfREFUQShjb25zdCB1aW50MTZfdCwgSW50MTZBcnJheVR5LCBOdW1WYWx1ZVNpdGVzW0lQVktfTGFzdCsxXSwgXAorICAgICAgICAgICAgICAgIENvbnN0YW50QXJyYXk6OmdldChJbnQxNkFycmF5VHksIEludDE2QXJyYXlWYWxzKSkKKyN1bmRlZiBJTlNUUl9QUk9GX0RBVEEKKy8qIElOU1RSX1BST0ZfREFUQSBlbmQuICovCisKKworLyogVGhpcyBpcyBhbiBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSB1c2VkIGJ5IHZhbHVlIHByb2ZpbGVyLiBJdAorICogaXMgZGVmaW5lZCBoZXJlIHRvIGFsbG93IHNlcmlhbGl6YXRpb24gY29kZSBzaGFyaW5nIGJ5IExMVk0KKyAqIHRvIGJlIHVzZWQgaW4gdW5pdCB0ZXN0LgorICoKKyAqIHR5cGVkZWYgc3RydWN0IFZhbHVlUHJvZk5vZGUgeworICogICAvLyBJbnN0clByb2ZWYWx1ZURhdGEgVkRhdGE7CisgKiAgIHVpbnQ2NF90IFZhbHVlOworICogICB1aW50NjRfdCBDb3VudDsKKyAqICAgc3RydWN0IFZhbHVlUHJvZk5vZGUgKk5leHQ7CisgKiB9IFZhbHVlUHJvZk5vZGU7CisgKi8KKy8qIElOU1RSX1BST0ZfVkFMVUVfTk9ERSBzdGFydC4gKi8KKyNpZm5kZWYgSU5TVFJfUFJPRl9WQUxVRV9OT0RFCisjZGVmaW5lIElOU1RSX1BST0ZfVkFMVUVfTk9ERShUeXBlLCBMTFZNVHlwZSwgTmFtZSwgSW5pdGlhbGl6ZXIpCisjZWxzZQorI2RlZmluZSBJTlNUUl9QUk9GX0RBVEFfREVGSU5FRAorI2VuZGlmCitJTlNUUl9QUk9GX1ZBTFVFX05PREUodWludDY0X3QsIGxsdm06OlR5cGU6OmdldEludDY0VHkoQ3R4KSwgVmFsdWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KGxsdm06OlR5cGU6OkdldEludDY0VHkoQ3R4KSwgMCkpCitJTlNUUl9QUk9GX1ZBTFVFX05PREUodWludDY0X3QsIGxsdm06OlR5cGU6OmdldEludDY0VHkoQ3R4KSwgQ291bnQsIFwKKyAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KGxsdm06OlR5cGU6OkdldEludDY0VHkoQ3R4KSwgMCkpCitJTlNUUl9QUk9GX1ZBTFVFX05PREUoUHRyVG9Ob2RlVCwgbGx2bTo6VHlwZTo6Z2V0SW50OFB0clR5KEN0eCksIE5leHQsIFwKKyAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KGxsdm06OlR5cGU6OkdldEludDhQdHJUeShDdHgpLCAwKSkKKyN1bmRlZiBJTlNUUl9QUk9GX1ZBTFVFX05PREUKKy8qIElOU1RSX1BST0ZfVkFMVUVfTk9ERSBlbmQuICovCisKKy8qIElOU1RSX1BST0ZfUkFXX0hFQURFUiAgc3RhcnQgKi8KKy8qIERlZmluaXRpb24gb2YgbWVtYmVyIGZpZWxkcyBvZiB0aGUgcmF3IHByb2ZpbGUgaGVhZGVyIGRhdGEgc3RydWN0dXJlLiAqLworI2lmbmRlZiBJTlNUUl9QUk9GX1JBV19IRUFERVIKKyNkZWZpbmUgSU5TVFJfUFJPRl9SQVdfSEVBREVSKFR5cGUsIE5hbWUsIEluaXRpYWxpemVyKQorI2Vsc2UKKyNkZWZpbmUgSU5TVFJfUFJPRl9EQVRBX0RFRklORUQKKyNlbmRpZgorSU5TVFJfUFJPRl9SQVdfSEVBREVSKHVpbnQ2NF90LCBNYWdpYywgX19sbHZtX3Byb2ZpbGVfZ2V0X21hZ2ljKCkpCitJTlNUUl9QUk9GX1JBV19IRUFERVIodWludDY0X3QsIFZlcnNpb24sIF9fbGx2bV9wcm9maWxlX2dldF92ZXJzaW9uKCkpCitJTlNUUl9QUk9GX1JBV19IRUFERVIodWludDY0X3QsIERhdGFTaXplLCBEYXRhU2l6ZSkKK0lOU1RSX1BST0ZfUkFXX0hFQURFUih1aW50NjRfdCwgQ291bnRlcnNTaXplLCBDb3VudGVyc1NpemUpCitJTlNUUl9QUk9GX1JBV19IRUFERVIodWludDY0X3QsIE5hbWVzU2l6ZSwgIE5hbWVzU2l6ZSkKK0lOU1RSX1BST0ZfUkFXX0hFQURFUih1aW50NjRfdCwgQ291bnRlcnNEZWx0YSwgKHVpbnRwdHJfdClDb3VudGVyc0JlZ2luKQorSU5TVFJfUFJPRl9SQVdfSEVBREVSKHVpbnQ2NF90LCBOYW1lc0RlbHRhLCAodWludHB0cl90KU5hbWVzQmVnaW4pCitJTlNUUl9QUk9GX1JBV19IRUFERVIodWludDY0X3QsIFZhbHVlS2luZExhc3QsIElQVktfTGFzdCkKKyN1bmRlZiBJTlNUUl9QUk9GX1JBV19IRUFERVIKKy8qIElOU1RSX1BST0ZfUkFXX0hFQURFUiAgZW5kICovCisKKy8qIFZBTFVFX1BST0ZfRlVOQ19QQVJBTSBzdGFydCAqLworLyogRGVmaW5pdGlvbiBvZiBwYXJhbWV0ZXIgdHlwZXMgb2YgdGhlIHJ1bnRpbWUgQVBJIHVzZWQgdG8gZG8gdmFsdWUgcHJvZmlsaW5nCisgKiBmb3IgYSBnaXZlbiB2YWx1ZSBzaXRlLgorICovCisjaWZuZGVmIFZBTFVFX1BST0ZfRlVOQ19QQVJBTQorI2RlZmluZSBWQUxVRV9QUk9GX0ZVTkNfUEFSQU0oQXJnVHlwZSwgQXJnTmFtZSwgQXJnTExWTVR5cGUpCisjZGVmaW5lIElOU1RSX1BST0ZfQ09NTUEKKyNlbHNlCisjZGVmaW5lIElOU1RSX1BST0ZfREFUQV9ERUZJTkVECisjZGVmaW5lIElOU1RSX1BST0ZfQ09NTUEgLAorI2VuZGlmCitWQUxVRV9QUk9GX0ZVTkNfUEFSQU0odWludDY0X3QsIFRhcmdldFZhbHVlLCBUeXBlOjpnZXRJbnQ2NFR5KEN0eCkpIFwKKyAgICAgICAgICAgICAgICAgICAgICBJTlNUUl9QUk9GX0NPTU1BCitWQUxVRV9QUk9GX0ZVTkNfUEFSQU0odm9pZCAqLCBEYXRhLCBUeXBlOjpnZXRJbnQ4UHRyVHkoQ3R4KSkgSU5TVFJfUFJPRl9DT01NQQorI2lmbmRlZiBWQUxVRV9SQU5HRV9QUk9GCitWQUxVRV9QUk9GX0ZVTkNfUEFSQU0odWludDMyX3QsIENvdW50ZXJJbmRleCwgVHlwZTo6Z2V0SW50MzJUeShDdHgpKQorI2Vsc2UgLyogVkFMVUVfUkFOR0VfUFJPRiAqLworVkFMVUVfUFJPRl9GVU5DX1BBUkFNKHVpbnQzMl90LCBDb3VudGVySW5kZXgsIFR5cGU6OmdldEludDMyVHkoQ3R4KSkgXAorICAgICAgICAgICAgICAgICAgICAgIElOU1RSX1BST0ZfQ09NTUEKK1ZBTFVFX1BST0ZfRlVOQ19QQVJBTSh1aW50NjRfdCwgUHJlY2lzZVJhbmdlU3RhcnQsIFR5cGU6OmdldEludDY0VHkoQ3R4KSkgXAorICAgICAgICAgICAgICAgICAgICAgIElOU1RSX1BST0ZfQ09NTUEKK1ZBTFVFX1BST0ZfRlVOQ19QQVJBTSh1aW50NjRfdCwgUHJlY2lzZVJhbmdlTGFzdCwgVHlwZTo6Z2V0SW50NjRUeShDdHgpKSBcCisgICAgICAgICAgICAgICAgICAgICAgSU5TVFJfUFJPRl9DT01NQQorVkFMVUVfUFJPRl9GVU5DX1BBUkFNKHVpbnQ2NF90LCBMYXJnZVZhbHVlLCBUeXBlOjpnZXRJbnQ2NFR5KEN0eCkpCisjZW5kaWYgLypWQUxVRV9SQU5HRV9QUk9GICovCisjdW5kZWYgVkFMVUVfUFJPRl9GVU5DX1BBUkFNCisjdW5kZWYgSU5TVFJfUFJPRl9DT01NQQorLyogVkFMVUVfUFJPRl9GVU5DX1BBUkFNIGVuZCAqLworCisvKiBWQUxVRV9QUk9GX0tJTkQgc3RhcnQgKi8KKyNpZm5kZWYgVkFMVUVfUFJPRl9LSU5ECisjZGVmaW5lIFZBTFVFX1BST0ZfS0lORChFbnVtZXJhdG9yLCBWYWx1ZSkKKyNlbHNlCisjZGVmaW5lIElOU1RSX1BST0ZfREFUQV9ERUZJTkVECisjZW5kaWYKKy8qIEZvciBpbmRpcmVjdCBmdW5jdGlvbiBjYWxsIHZhbHVlIHByb2ZpbGluZywgdGhlIGFkZHJlc3NlcyBvZiB0aGUgdGFyZ2V0CisgKiBmdW5jdGlvbnMgYXJlIHByb2ZpbGVkIGJ5IHRoZSBpbnN0cnVtZW50ZWQgY29kZS4gVGhlIHRhcmdldCBhZGRyZXNzZXMgYXJlCisgKiB3cml0dGVuIGluIHRoZSByYXcgcHJvZmlsZSBkYXRhIGFuZCBjb252ZXJ0ZWQgdG8gdGFyZ2V0IGZ1bmN0aW9uIG5hbWUncyBNRDUKKyAqIGhhc2ggYnkgdGhlIHByb2ZpbGUgcmVhZGVyIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uICBUeXBpY2FsbHksIHRoaXMgaGFwcGVucworICogd2hlbiB0aGUgcmF3IHByb2ZpbGUgZGF0YSBpcyByZWFkIGR1cmluZyBwcm9maWxlIG1lcmdpbmcuCisgKgorICogRm9yIHRoaXMgcmVtYXBwaW5nIHRoZSBQcm9mRGF0YSBpcyB1c2VkLiAgUHJvZkRhdGEgY29udGFpbnMgYm90aCB0aGUgZnVuY3Rpb24KKyAqIG5hbWUgaGFzaCBhbmQgdGhlIGZ1bmN0aW9uIGFkZHJlc3MuCisgKi8KK1ZBTFVFX1BST0ZfS0lORChJUFZLX0luZGlyZWN0Q2FsbFRhcmdldCwgMCkKKy8qIEZvciBtZW1vcnkgaW50cmluc2ljIGZ1bmN0aW9ucyBzaXplIHByb2ZpbGluZy4gKi8KK1ZBTFVFX1BST0ZfS0lORChJUFZLX01lbU9QU2l6ZSwgMSkKKy8qIFRoZXNlIHR3byBraW5kcyBtdXN0IGJlIHRoZSBsYXN0IHRvIGJlCisgKiBkZWNsYXJlZC4gVGhpcyBpcyB0byBtYWtlIHN1cmUgdGhlIHN0cmluZworICogYXJyYXkgY3JlYXRlZCB3aXRoIHRoZSB0ZW1wbGF0ZSBjYW4gYmUKKyAqIGluZGV4ZWQgd2l0aCB0aGUga2luZCB2YWx1ZS4KKyAqLworVkFMVUVfUFJPRl9LSU5EKElQVktfRmlyc3QsIElQVktfSW5kaXJlY3RDYWxsVGFyZ2V0KQorVkFMVUVfUFJPRl9LSU5EKElQVktfTGFzdCwgSVBWS19NZW1PUFNpemUpCisKKyN1bmRlZiBWQUxVRV9QUk9GX0tJTkQKKy8qIFZBTFVFX1BST0ZfS0lORCBlbmQgKi8KKworLyogQ09WTUFQX0ZVTkNfUkVDT1JEIHN0YXJ0ICovCisvKiBEZWZpbml0aW9uIG9mIG1lbWJlciBmaWVsZHMgb2YgdGhlIGZ1bmN0aW9uIHJlY29yZCBzdHJ1Y3R1cmUgaW4gY292ZXJhZ2UKKyAqIG1hcC4KKyAqLworI2lmbmRlZiBDT1ZNQVBfRlVOQ19SRUNPUkQKKyNkZWZpbmUgQ09WTUFQX0ZVTkNfUkVDT1JEKFR5cGUsIExMVk1UeXBlLCBOYW1lLCBJbml0aWFsaXplcikKKyNlbHNlCisjZGVmaW5lIElOU1RSX1BST0ZfREFUQV9ERUZJTkVECisjZW5kaWYKKyNpZmRlZiBDT1ZNQVBfVjEKK0NPVk1BUF9GVU5DX1JFQ09SRChjb25zdCBJbnRQdHJULCBsbHZtOjpUeXBlOjpnZXRJbnQ4UHRyVHkoQ3R4KSwgXAorICAgICAgICAgICAgICAgICAgIE5hbWVQdHIsIGxsdm06OkNvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChOYW1lUHRyLCBcCisgICAgICAgICAgICAgICAgICAgbGx2bTo6VHlwZTo6Z2V0SW50OFB0clR5KEN0eCkpKQorQ09WTUFQX0ZVTkNfUkVDT1JEKGNvbnN0IHVpbnQzMl90LCBsbHZtOjpUeXBlOjpnZXRJbnQzMlR5KEN0eCksIE5hbWVTaXplLCBcCisgICAgICAgICAgICAgICAgICAgbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChsbHZtOjpUeXBlOjpnZXRJbnQzMlR5KEN0eCksIFwKKyAgICAgICAgICAgICAgICAgICBOYW1lVmFsdWUuc2l6ZSgpKSkKKyNlbHNlCitDT1ZNQVBfRlVOQ19SRUNPUkQoY29uc3QgaW50NjRfdCwgbGx2bTo6VHlwZTo6Z2V0SW50NjRUeShDdHgpLCBOYW1lUmVmLCBcCisgICAgICAgICAgICAgICAgICAgbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChsbHZtOjpUeXBlOjpnZXRJbnQ2NFR5KEN0eCksIFwKKyAgICAgICAgICAgICAgICAgICBsbHZtOjpJbmRleGVkSW5zdHJQcm9mOjpDb21wdXRlSGFzaChOYW1lVmFsdWUpKSkKKyNlbmRpZgorQ09WTUFQX0ZVTkNfUkVDT1JEKGNvbnN0IHVpbnQzMl90LCBsbHZtOjpUeXBlOjpnZXRJbnQzMlR5KEN0eCksIERhdGFTaXplLCBcCisgICAgICAgICAgICAgICAgICAgbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChsbHZtOjpUeXBlOjpnZXRJbnQzMlR5KEN0eCksXAorICAgICAgICAgICAgICAgICAgIENvdmVyYWdlTWFwcGluZy5zaXplKCkpKQorQ09WTUFQX0ZVTkNfUkVDT1JEKGNvbnN0IHVpbnQ2NF90LCBsbHZtOjpUeXBlOjpnZXRJbnQ2NFR5KEN0eCksIEZ1bmNIYXNoLCBcCisgICAgICAgICAgICAgICAgICAgbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChsbHZtOjpUeXBlOjpnZXRJbnQ2NFR5KEN0eCksIEZ1bmNIYXNoKSkKKyN1bmRlZiBDT1ZNQVBfRlVOQ19SRUNPUkQKKy8qIENPVk1BUF9GVU5DX1JFQ09SRCBlbmQuICAqLworCisvKiBDT1ZNQVBfSEVBREVSIHN0YXJ0ICovCisvKiBEZWZpbml0aW9uIG9mIG1lbWJlciBmaWVsZHMgb2YgY292ZXJhZ2UgbWFwIGhlYWRlci4KKyAqLworI2lmbmRlZiBDT1ZNQVBfSEVBREVSCisjZGVmaW5lIENPVk1BUF9IRUFERVIoVHlwZSwgTExWTVR5cGUsIE5hbWUsIEluaXRpYWxpemVyKQorI2Vsc2UKKyNkZWZpbmUgSU5TVFJfUFJPRl9EQVRBX0RFRklORUQKKyNlbmRpZgorQ09WTUFQX0hFQURFUih1aW50MzJfdCwgSW50MzJUeSwgTlJlY29yZHMsIFwKKyAgICAgICAgICAgICAgbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChJbnQzMlR5LCAgRnVuY3Rpb25SZWNvcmRzLnNpemUoKSkpCitDT1ZNQVBfSEVBREVSKHVpbnQzMl90LCBJbnQzMlR5LCBGaWxlbmFtZXNTaXplLCBcCisgICAgICAgICAgICAgIGxsdm06OkNvbnN0YW50SW50OjpnZXQoSW50MzJUeSwgRmlsZW5hbWVzU2l6ZSkpCitDT1ZNQVBfSEVBREVSKHVpbnQzMl90LCBJbnQzMlR5LCBDb3ZlcmFnZVNpemUsIFwKKyAgICAgICAgICAgICAgbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChJbnQzMlR5LCBDb3ZlcmFnZU1hcHBpbmdTaXplKSkKK0NPVk1BUF9IRUFERVIodWludDMyX3QsIEludDMyVHksIFZlcnNpb24sIFwKKyAgICAgICAgICAgICAgbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChJbnQzMlR5LCBDb3ZNYXBWZXJzaW9uOjpDdXJyZW50VmVyc2lvbikpCisjdW5kZWYgQ09WTUFQX0hFQURFUgorLyogQ09WTUFQX0hFQURFUiBlbmQuICAqLworCisKKyNpZmRlZiBJTlNUUl9QUk9GX1NFQ1RfRU5UUlkKKyNkZWZpbmUgSU5TVFJfUFJPRl9EQVRBX0RFRklORUQKK0lOU1RSX1BST0ZfU0VDVF9FTlRSWShJUFNLX2RhdGEsIFwKKyAgICAgICAgICAgICAgICAgICAgICBJTlNUUl9QUk9GX1FVT1RFKElOU1RSX1BST0ZfREFUQV9DT01NT04pLCBcCisgICAgICAgICAgICAgICAgICAgICAgSU5TVFJfUFJPRl9RVU9URShJTlNUUl9QUk9GX0RBVEFfQ09GRiksICJfX0RBVEEsIikKK0lOU1RSX1BST0ZfU0VDVF9FTlRSWShJUFNLX2NudHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICBJTlNUUl9QUk9GX1FVT1RFKElOU1RSX1BST0ZfQ05UU19DT01NT04pLCBcCisgICAgICAgICAgICAgICAgICAgICAgSU5TVFJfUFJPRl9RVU9URShJTlNUUl9QUk9GX0NOVFNfQ09GRiksICJfX0RBVEEsIikKK0lOU1RSX1BST0ZfU0VDVF9FTlRSWShJUFNLX25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBJTlNUUl9QUk9GX1FVT1RFKElOU1RSX1BST0ZfTkFNRV9DT01NT04pLCBcCisgICAgICAgICAgICAgICAgICAgICAgSU5TVFJfUFJPRl9RVU9URShJTlNUUl9QUk9GX05BTUVfQ09GRiksICJfX0RBVEEsIikKK0lOU1RSX1BST0ZfU0VDVF9FTlRSWShJUFNLX3ZhbHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICBJTlNUUl9QUk9GX1FVT1RFKElOU1RSX1BST0ZfVkFMU19DT01NT04pLCBcCisgICAgICAgICAgICAgICAgICAgICAgSU5TVFJfUFJPRl9RVU9URShJTlNUUl9QUk9GX1ZBTFNfQ09GRiksICJfX0RBVEEsIikKK0lOU1RSX1BST0ZfU0VDVF9FTlRSWShJUFNLX3Zub2RlcywgXAorICAgICAgICAgICAgICAgICAgICAgIElOU1RSX1BST0ZfUVVPVEUoSU5TVFJfUFJPRl9WTk9ERVNfQ09NTU9OKSwgXAorICAgICAgICAgICAgICAgICAgICAgIElOU1RSX1BST0ZfUVVPVEUoSU5TVFJfUFJPRl9WTk9ERVNfQ09GRiksICJfX0RBVEEsIikKK0lOU1RSX1BST0ZfU0VDVF9FTlRSWShJUFNLX2Nvdm1hcCwgXAorICAgICAgICAgICAgICAgICAgICAgIElOU1RSX1BST0ZfUVVPVEUoSU5TVFJfUFJPRl9DT1ZNQVBfQ09NTU9OKSwgXAorICAgICAgICAgICAgICAgICAgICAgIElOU1RSX1BST0ZfUVVPVEUoSU5TVFJfUFJPRl9DT1ZNQVBfQ09GRiksICJfX0xMVk1fQ09WLCIpCisKKyN1bmRlZiBJTlNUUl9QUk9GX1NFQ1RfRU5UUlkKKyNlbmRpZgorCisKKyNpZmRlZiBJTlNUUl9QUk9GX1ZBTFVFX1BST0ZfREFUQQorI2RlZmluZSBJTlNUUl9QUk9GX0RBVEFfREVGSU5FRAorCisjZGVmaW5lIElOU1RSX1BST0ZfTUFYX05VTV9WQUxfUEVSX1NJVEUgMjU1CisvKiEKKyAqIFRoaXMgaXMgdGhlIGhlYWRlciBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIHRoZSBvbi1kaXNrCisgKiBsYXlvdXQgb2YgdGhlIHZhbHVlIHByb2ZpbGUgZGF0YSBvZiBhIHBhcnRpY3VsYXIga2luZCBmb3Igb25lIGZ1bmN0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBWYWx1ZVByb2ZSZWNvcmQgeworICAvKiBUaGUga2luZCBvZiB0aGUgdmFsdWUgcHJvZmlsZSByZWNvcmQuICovCisgIHVpbnQzMl90IEtpbmQ7CisgIC8qCisgICAqIFRoZSBudW1iZXIgb2YgdmFsdWUgcHJvZmlsZSBzaXRlcy4gSXQgaXMgZ3VhcmFudGVlZCB0byBiZSBub24temVybzsKKyAgICogb3RoZXJ3aXNlIHRoZSByZWNvcmQgZm9yIHRoaXMga2luZCB3b24ndCBiZSBlbWl0dGVkLgorICAgKi8KKyAgdWludDMyX3QgTnVtVmFsdWVTaXRlczsKKyAgLyoKKyAgICogVGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5IHRoYXQgc3RvcmVzIHRoZSBudW1iZXIgb2YgcHJvZmlsZWQKKyAgICogdmFsdWVzIGZvciBlYWNoIHZhbHVlIHNpdGUuIFRoZSBzaXplIG9mIHRoZSBhcnJheSBpcyBOdW1WYWx1ZVNpdGVzLgorICAgKiBTaW5jZSBOdW1WYWx1ZVNpdGVzIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUKKyAgICogZWxlbWVudCBpbiB0aGUgYXJyYXkuCisgICAqLworICB1aW50OF90IFNpdGVDb3VudEFycmF5WzFdOworCisgIC8qCisgICAqIFRoZSBmYWtlIGRlY2xhcmF0aW9uIGlzIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2Ugb25seS4KKyAgICogQWxpZ24gdGhlIHN0YXJ0IG9mIG5leHQgZmllbGQgdG8gYmUgb24gOCBieXRlIGJvdW5kYXJpZXMuCisgIHVpbnQ4X3QgUGFkZGluZ1tYXTsKKyAgICovCisKKyAgLyogVGhlIGFycmF5IG9mIHZhbHVlIHByb2ZpbGUgZGF0YS4gVGhlIHNpemUgb2YgdGhlIGFycmF5IGlzIHRoZSBzdW0KKyAgICogb2YgYWxsIGVsZW1lbnRzIGluIFNpdGVDb3VudEFycmF5W10uCisgIEluc3RyUHJvZlZhbHVlRGF0YSBWYWx1ZURhdGFbXTsKKyAgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAvKiEKKyAgICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIHZhbHVlIHNpdGVzLgorICAgKi8KKyAgdWludDMyX3QgZ2V0TnVtVmFsdWVTaXRlcygpIGNvbnN0IHsgcmV0dXJuIE51bVZhbHVlU2l0ZXM7IH0KKyAgLyohCisgICAqIFxicmllZiBSZWFkIGRhdGEgZnJvbSB0aGlzIHJlY29yZCBhbmQgc2F2ZSBpdCB0byBSZWNvcmQuCisgICAqLworICB2b2lkIGRlc2VyaWFsaXplVG8oSW5zdHJQcm9mUmVjb3JkICZSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICBJbnN0clByb2ZTeW10YWIgKlN5bVRhYik7CisgIC8qCisgICAqIEluLXBsYWNlIGJ5dGUgc3dhcDoKKyAgICogRG8gYnl0ZSBzd2FwIGZvciB0aGlzIGluc3RhbmNlLiBcYyBPbGQgaXMgdGhlIG9yaWdpbmFsIG9yZGVyIGJlZm9yZQorICAgKiB0aGUgc3dhcCwgYW5kIFxjIE5ldyBpcyB0aGUgTmV3IGJ5dGUgb3JkZXIuCisgICAqLworICB2b2lkIHN3YXBCeXRlcyhzdXBwb3J0OjplbmRpYW5uZXNzIE9sZCwgc3VwcG9ydDo6ZW5kaWFubmVzcyBOZXcpOworI2VuZGlmCit9IFZhbHVlUHJvZlJlY29yZDsKKworLyohCisgKiBQZXItZnVuY3Rpb24gaGVhZGVyL2NvbnRyb2wgZGF0YSBzdHJ1Y3R1cmUgZm9yIHZhbHVlIHByb2ZpbGluZworICogZGF0YSBpbiBpbmRleGVkIGZvcm1hdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgVmFsdWVQcm9mRGF0YSB7CisgIC8qCisgICAqIFRvdGFsIHNpemUgaW4gYnl0ZXMgaW5jbHVkaW5nIHRoaXMgZmllbGQuIEl0IG11c3QgYmUgYSBtdWx0aXBsZQorICAgKiBvZiBzaXplb2YodWludDY0X3QpLgorICAgKi8KKyAgdWludDMyX3QgVG90YWxTaXplOworICAvKgorICAgKlRoZSBudW1iZXIgb2YgdmFsdWUgcHJvZmlsZSBraW5kcyB0aGF0IGhhcyB2YWx1ZSBwcm9maWxlIGRhdGEuCisgICAqIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIGEgdmFsdWUgcHJvZmlsZSBraW5kIGlzIGNvbnNpZGVyZWQgdG8KKyAgICogaGF2ZSBwcm9maWxlIGRhdGEgaWYgdGhlIG51bWJlciBvZiB2YWx1ZSBwcm9maWxlIHNpdGVzIGZvciB0aGUKKyAgICoga2luZCBpcyBub3QgemVyby4gTW9yZSBhZ2dyZXNzaXZlbHksIHRoZSBpbXBsZW1lbnRhdGlvbiBjYW4KKyAgICogY2hvb3NlIHRvIGNoZWNrIHRoZSBhY3R1YWwgZGF0YSB2YWx1ZTogaWYgbm9uZSBvZiB0aGUgdmFsdWUgc2l0ZXMKKyAgICogaGFzIGFueSBwcm9maWxlZCB2YWx1ZXMsIHRoZSBraW5kIGNhbiBiZSBza2lwcGVkLgorICAgKi8KKyAgdWludDMyX3QgTnVtVmFsdWVLaW5kczsKKworICAvKgorICAgKiBGb2xsb3dpbmcgYXJlIGEgc2VxdWVuY2Ugb2YgdmFyaWFibGUgbGVuZ3RoIHJlY29yZHMuIFRoZSBwcmVmaXgvaGVhZGVyCisgICAqIG9mIGVhY2ggcmVjb3JkIGlzIGRlZmluZWQgYnkgVmFsdWVQcm9mUmVjb3JkIHR5cGUuIFRoZSBudW1iZXIgb2YKKyAgICogcmVjb3JkcyBpcyBOdW1WYWx1ZUtpbmRzLgorICAgKiBWYWx1ZVByb2ZSZWNvcmQgUmVjb3JkXzE7CisgICAqIFZhbHVlUHJvZlJlY29yZCBSZWNvcmRfTjsKKyAgICovCisKKyNpZiBfX2NwbHVzcGx1cworICAvKiEKKyAgICogUmV0dXJuIHRoZSB0b3RhbCBzaXplIGluIGJ5dGVzIG9mIHRoZSBvbi1kaXNrIHZhbHVlIHByb2ZpbGUgZGF0YQorICAgKiBnaXZlbiB0aGUgZGF0YSBzdG9yZWQgaW4gUmVjb3JkLgorICAgKi8KKyAgc3RhdGljIHVpbnQzMl90IGdldFNpemUoY29uc3QgSW5zdHJQcm9mUmVjb3JkICZSZWNvcmQpOworICAvKiEKKyAgICogUmV0dXJuIGEgcG9pbnRlciB0byBcYyBWYWx1ZVByb2ZEYXRhIGluc3RhbmNlIHJlYWR5IHRvIGJlIHN0cmVhbWVkLgorICAgKi8KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxWYWx1ZVByb2ZEYXRhPgorICBzZXJpYWxpemVGcm9tKGNvbnN0IEluc3RyUHJvZlJlY29yZCAmUmVjb3JkKTsKKyAgLyohCisgICAqIENoZWNrIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIHJlY29yZC4KKyAgICovCisgIEVycm9yIGNoZWNrSW50ZWdyaXR5KCk7CisgIC8qIQorICAgKiBSZXR1cm4gYSBwb2ludGVyIHRvIFxjIFZhbHVlUHJvZmlsZURhdGEgaW5zdGFuY2UgcmVhZHkgdG8gYmUgcmVhZC4KKyAgICogQWxsIGRhdGEgaW4gdGhlIGluc3RhbmNlIGFyZSBwcm9wZXJseSBieXRlIHN3YXBwZWQuIFRoZSBpbnB1dAorICAgKiBkYXRhIGlzIGFzc3VtZWQgdG8gYmUgaW4gbGl0dGxlIGVuZGlhbiBvcmRlci4KKyAgICovCisgIHN0YXRpYyBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8VmFsdWVQcm9mRGF0YT4+CisgIGdldFZhbHVlUHJvZkRhdGEoY29uc3QgdW5zaWduZWQgY2hhciAqU3JjQnVmZmVyLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0IFNyY0J1ZmZlckVuZCwKKyAgICAgICAgICAgICAgICAgICBzdXBwb3J0OjplbmRpYW5uZXNzIFNyY0RhdGFFbmRpYW5uZXNzKTsKKyAgLyohCisgICAqIFN3YXAgYnl0ZSBvcmRlciBmcm9tIFxjIEVuZGlhbm5lc3Mgb3JkZXIgdG8gaG9zdCBieXRlIG9yZGVyLgorICAgKi8KKyAgdm9pZCBzd2FwQnl0ZXNUb0hvc3Qoc3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW5uZXNzKTsKKyAgLyohCisgICAqIFN3YXAgYnl0ZSBvcmRlciBmcm9tIGhvc3QgYnl0ZSBvcmRlciB0byBcYyBFbmRpYW5uZXNzIG9yZGVyLgorICAgKi8KKyAgdm9pZCBzd2FwQnl0ZXNGcm9tSG9zdChzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbm5lc3MpOworICAvKiEKKyAgICogUmV0dXJuIHRoZSB0b3RhbCBzaXplIG9mIFxjIFZhbHVlUHJvZmlsZURhdGEuCisgICAqLworICB1aW50MzJfdCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gVG90YWxTaXplOyB9CisgIC8qIQorICAgKiBSZWFkIGRhdGEgZnJvbSB0aGlzIGRhdGEgYW5kIHNhdmUgaXQgdG8gXGMgUmVjb3JkLgorICAgKi8KKyAgdm9pZCBkZXNlcmlhbGl6ZVRvKEluc3RyUHJvZlJlY29yZCAmUmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgSW5zdHJQcm9mU3ltdGFiICpTeW1UYWIpOworICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwdHIpIHsgOjpvcGVyYXRvciBkZWxldGUocHRyKTsgfQorI2VuZGlmCit9IFZhbHVlUHJvZkRhdGE7CisKKy8qCisgKiBUaGUgY2xvc3VyZSBpcyBkZXNpZ25lZCB0byBhYnN0YWN0IGF3YXkgdHdvIHR5cGVzIG9mIHZhbHVlIHByb2ZpbGUgZGF0YToKKyAqIC0gSW5zdHJQcm9mUmVjb3JkIHdoaWNoIGlzIHRoZSBwcmltYXJ5IGRhdGEgc3RydWN0dXJlIHVzZWQgdG8KKyAqICAgcmVwcmVzZW50IHByb2ZpbGUgZGF0YSBpbiBob3N0IHRvb2xzIChyZWFkZXIsIHdyaXRlciwgYW5kIHByb2ZpbGUtdXNlKQorICogLSB2YWx1ZSBwcm9maWxlIHJ1bnRpbWUgZGF0YSBzdHJ1Y3R1cmUgc3VpdGFibGUgdG8gYmUgdXNlZCBieSBDCisgKiAgIHJ1bnRpbWUgbGlicmFyeS4KKyAqCisgKiBCb3RoIHNvdXJjZXMgb2YgZGF0YSBuZWVkIHRvIHNlcmlhbGl6ZSB0byBkaXNrL21lbW9yeS1idWZmZXIgaW4gY29tbW9uCisgKiBmb3JtYXQ6IFZhbHVlUHJvZkRhdGEuIFRoZSBhYnN0cmFjdGlvbiBhbGxvd3MgY29tcGlsZXItcnQncyByYXcgcHJvZmlsZXIKKyAqIHdyaXRlciB0byBzaGFyZSB0aGUgc2FtZSBmb3JtYXQgYW5kIGNvZGUgd2l0aCBpbmRleGVkIHByb2ZpbGUgd3JpdGVyLgorICoKKyAqIEZvciBkb2N1bWVudGF0aW9uIG9mIHRoZSBtZW1iZXIgbWV0aG9kcyBiZWxvdywgcmVmZXIgdG8gY29ycmVzcG9uZGluZyBtZXRob2RzCisgKiBpbiBjbGFzcyBJbnN0clByb2ZSZWNvcmQuCisgKi8KK3R5cGVkZWYgc3RydWN0IFZhbHVlUHJvZlJlY29yZENsb3N1cmUgeworICBjb25zdCB2b2lkICpSZWNvcmQ7CisgIHVpbnQzMl90ICgqR2V0TnVtVmFsdWVLaW5kcykoY29uc3Qgdm9pZCAqUmVjb3JkKTsKKyAgdWludDMyX3QgKCpHZXROdW1WYWx1ZVNpdGVzKShjb25zdCB2b2lkICpSZWNvcmQsIHVpbnQzMl90IFZLaW5kKTsKKyAgdWludDMyX3QgKCpHZXROdW1WYWx1ZURhdGEpKGNvbnN0IHZvaWQgKlJlY29yZCwgdWludDMyX3QgVktpbmQpOworICB1aW50MzJfdCAoKkdldE51bVZhbHVlRGF0YUZvclNpdGUpKGNvbnN0IHZvaWQgKlIsIHVpbnQzMl90IFZLLCB1aW50MzJfdCBTKTsKKworICAvKgorICAgKiBBZnRlciBleHRyYWN0aW5nIHRoZSB2YWx1ZSBwcm9maWxlIGRhdGEgZnJvbSB0aGUgdmFsdWUgcHJvZmlsZSByZWNvcmQsCisgICAqIHRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gbWFwIHRoZSBpbi1tZW1vcnkgdmFsdWUgdG8gb24tZGlzayB2YWx1ZS4gSWYKKyAgICogdGhlIG1ldGhvZCBpcyBudWxsLCB2YWx1ZSB3aWxsIGJlIHdyaXR0ZW4gb3V0IHVudHJhbnNsYXRlZC4KKyAgICovCisgIHVpbnQ2NF90ICgqUmVtYXBWYWx1ZURhdGEpKHVpbnQzMl90LCB1aW50NjRfdCBWYWx1ZSk7CisgIHZvaWQgKCpHZXRWYWx1ZUZvclNpdGUpKGNvbnN0IHZvaWQgKlIsIEluc3RyUHJvZlZhbHVlRGF0YSAqRHN0LCB1aW50MzJfdCBLLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTKTsKKyAgVmFsdWVQcm9mRGF0YSAqKCpBbGxvY1ZhbHVlUHJvZkRhdGEpKHNpemVfdCBUb3RhbFNpemVJbkJ5dGVzKTsKK30gVmFsdWVQcm9mUmVjb3JkQ2xvc3VyZTsKKworSU5TVFJfUFJPRl9WSVNJQklMSVRZIFZhbHVlUHJvZlJlY29yZCAqCitnZXRGaXJzdFZhbHVlUHJvZlJlY29yZChWYWx1ZVByb2ZEYXRhICpWUEQpOworSU5TVFJfUFJPRl9WSVNJQklMSVRZIFZhbHVlUHJvZlJlY29yZCAqCitnZXRWYWx1ZVByb2ZSZWNvcmROZXh0KFZhbHVlUHJvZlJlY29yZCAqVlBSKTsKK0lOU1RSX1BST0ZfVklTSUJJTElUWSBJbnN0clByb2ZWYWx1ZURhdGEgKgorZ2V0VmFsdWVQcm9mUmVjb3JkVmFsdWVEYXRhKFZhbHVlUHJvZlJlY29yZCAqVlBSKTsKK0lOU1RSX1BST0ZfVklTSUJJTElUWSB1aW50MzJfdAorZ2V0VmFsdWVQcm9mUmVjb3JkSGVhZGVyU2l6ZSh1aW50MzJfdCBOdW1WYWx1ZVNpdGVzKTsKKworI3VuZGVmIElOU1RSX1BST0ZfVkFMVUVfUFJPRl9EQVRBCisjZW5kaWYgIC8qIElOU1RSX1BST0ZfVkFMVUVfUFJPRl9EQVRBICovCisKKworI2lmZGVmIElOU1RSX1BST0ZfQ09NTU9OX0FQSV9JTVBMCisjZGVmaW5lIElOU1RSX1BST0ZfREFUQV9ERUZJTkVECisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgSU5TVFJfUFJPRl9JTkxJTkUgaW5saW5lCisjZGVmaW5lIElOU1RSX1BST0ZfTlVMTFBUUiBudWxscHRyCisjZWxzZQorI2RlZmluZSBJTlNUUl9QUk9GX0lOTElORQorI2RlZmluZSBJTlNUUl9QUk9GX05VTExQVFIgTlVMTAorI2VuZGlmCisKKyNpZm5kZWYgb2Zmc2V0b2YKKyNkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKHNpemVfdCkgJigoVFlQRSAqKTApLT5NRU1CRVIpCisjZW5kaWYKKworLyohCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBcYyBWYWx1ZVByb2ZSZWNvcmQgaGVhZGVyIHNpemUgaW5jbHVkaW5nIHRoZQorICogcGFkZGluZyBieXRlcy4KKyAqLworSU5TVFJfUFJPRl9WSVNJQklMSVRZIElOU1RSX1BST0ZfSU5MSU5FCit1aW50MzJfdCBnZXRWYWx1ZVByb2ZSZWNvcmRIZWFkZXJTaXplKHVpbnQzMl90IE51bVZhbHVlU2l0ZXMpIHsKKyAgdWludDMyX3QgU2l6ZSA9IG9mZnNldG9mKFZhbHVlUHJvZlJlY29yZCwgU2l0ZUNvdW50QXJyYXkpICsKKyAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50OF90KSAqIE51bVZhbHVlU2l0ZXM7CisgIC8qIFJvdW5kIHRoZSBzaXplIHRvIG11bHRpcGxlIG9mIDggYnl0ZXMuICovCisgIFNpemUgPSAoU2l6ZSArIDcpICYgfjc7CisgIHJldHVybiBTaXplOworfQorCisvKiEKKyAqIFxicmllZiBSZXR1cm4gdGhlIHRvdGFsIHNpemUgb2YgdGhlIHZhbHVlIHByb2ZpbGUgcmVjb3JkIGluY2x1ZGluZyB0aGUKKyAqIGhlYWRlciBhbmQgdGhlIHZhbHVlIGRhdGEuCisgKi8KK0lOU1RSX1BST0ZfVklTSUJJTElUWSBJTlNUUl9QUk9GX0lOTElORQordWludDMyX3QgZ2V0VmFsdWVQcm9mUmVjb3JkU2l6ZSh1aW50MzJfdCBOdW1WYWx1ZVNpdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBOdW1WYWx1ZURhdGEpIHsKKyAgcmV0dXJuIGdldFZhbHVlUHJvZlJlY29yZEhlYWRlclNpemUoTnVtVmFsdWVTaXRlcykgKworICAgICAgICAgc2l6ZW9mKEluc3RyUHJvZlZhbHVlRGF0YSkgKiBOdW1WYWx1ZURhdGE7Cit9CisKKy8qIQorICogXGJyaWVmIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdmFsdWUgZGF0YSBhcnJheS4KKyAqLworSU5TVFJfUFJPRl9WSVNJQklMSVRZIElOU1RSX1BST0ZfSU5MSU5FCitJbnN0clByb2ZWYWx1ZURhdGEgKmdldFZhbHVlUHJvZlJlY29yZFZhbHVlRGF0YShWYWx1ZVByb2ZSZWNvcmQgKlRoaXMpIHsKKyAgcmV0dXJuIChJbnN0clByb2ZWYWx1ZURhdGEgKikoKGNoYXIgKilUaGlzICsgZ2V0VmFsdWVQcm9mUmVjb3JkSGVhZGVyU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMtPk51bVZhbHVlU2l0ZXMpKTsKK30KKworLyohCisgKiBcYnJpZWYgUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgdmFsdWUgZGF0YSBmb3IgXGMgVGhpcyByZWNvcmQuCisgKi8KK0lOU1RSX1BST0ZfVklTSUJJTElUWSBJTlNUUl9QUk9GX0lOTElORQordWludDMyX3QgZ2V0VmFsdWVQcm9mUmVjb3JkTnVtVmFsdWVEYXRhKFZhbHVlUHJvZlJlY29yZCAqVGhpcykgeworICB1aW50MzJfdCBOdW1WYWx1ZURhdGEgPSAwOworICB1aW50MzJfdCBJOworICBmb3IgKEkgPSAwOyBJIDwgVGhpcy0+TnVtVmFsdWVTaXRlczsgSSsrKQorICAgIE51bVZhbHVlRGF0YSArPSBUaGlzLT5TaXRlQ291bnRBcnJheVtJXTsKKyAgcmV0dXJuIE51bVZhbHVlRGF0YTsKK30KKworLyohCisgKiBcYnJpZWYgVXNlIHRoaXMgbWV0aG9kIHRvIGFkdmFuY2UgdG8gdGhlIG5leHQgXGMgVGhpcyBcYyBWYWx1ZVByb2ZSZWNvcmQuCisgKi8KK0lOU1RSX1BST0ZfVklTSUJJTElUWSBJTlNUUl9QUk9GX0lOTElORQorVmFsdWVQcm9mUmVjb3JkICpnZXRWYWx1ZVByb2ZSZWNvcmROZXh0KFZhbHVlUHJvZlJlY29yZCAqVGhpcykgeworICB1aW50MzJfdCBOdW1WYWx1ZURhdGEgPSBnZXRWYWx1ZVByb2ZSZWNvcmROdW1WYWx1ZURhdGEoVGhpcyk7CisgIHJldHVybiAoVmFsdWVQcm9mUmVjb3JkICopKChjaGFyICopVGhpcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlUHJvZlJlY29yZFNpemUoVGhpcy0+TnVtVmFsdWVTaXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1WYWx1ZURhdGEpKTsKK30KKworLyohCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBmaXJzdCBcYyBWYWx1ZVByb2ZSZWNvcmQgaW5zdGFuY2UuCisgKi8KK0lOU1RSX1BST0ZfVklTSUJJTElUWSBJTlNUUl9QUk9GX0lOTElORQorVmFsdWVQcm9mUmVjb3JkICpnZXRGaXJzdFZhbHVlUHJvZlJlY29yZChWYWx1ZVByb2ZEYXRhICpUaGlzKSB7CisgIHJldHVybiAoVmFsdWVQcm9mUmVjb3JkICopKChjaGFyICopVGhpcyArIHNpemVvZihWYWx1ZVByb2ZEYXRhKSk7Cit9CisKKy8qIENsb3N1cmUgYmFzZWQgaW50ZXJmYWNlcy4gICovCisKKy8qIQorICogUmV0dXJuIHRoZSB0b3RhbCBzaXplIGluIGJ5dGVzIG9mIHRoZSBvbi1kaXNrIHZhbHVlIHByb2ZpbGUgZGF0YQorICogZ2l2ZW4gdGhlIGRhdGEgc3RvcmVkIGluIFJlY29yZC4KKyAqLworSU5TVFJfUFJPRl9WSVNJQklMSVRZIHVpbnQzMl90CitnZXRWYWx1ZVByb2ZEYXRhU2l6ZShWYWx1ZVByb2ZSZWNvcmRDbG9zdXJlICpDbG9zdXJlKSB7CisgIHVpbnQzMl90IEtpbmQ7CisgIHVpbnQzMl90IFRvdGFsU2l6ZSA9IHNpemVvZihWYWx1ZVByb2ZEYXRhKTsKKyAgY29uc3Qgdm9pZCAqUmVjb3JkID0gQ2xvc3VyZS0+UmVjb3JkOworCisgIGZvciAoS2luZCA9IElQVktfRmlyc3Q7IEtpbmQgPD0gSVBWS19MYXN0OyBLaW5kKyspIHsKKyAgICB1aW50MzJfdCBOdW1WYWx1ZVNpdGVzID0gQ2xvc3VyZS0+R2V0TnVtVmFsdWVTaXRlcyhSZWNvcmQsIEtpbmQpOworICAgIGlmICghTnVtVmFsdWVTaXRlcykKKyAgICAgIGNvbnRpbnVlOworICAgIFRvdGFsU2l6ZSArPSBnZXRWYWx1ZVByb2ZSZWNvcmRTaXplKE51bVZhbHVlU2l0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvc3VyZS0+R2V0TnVtVmFsdWVEYXRhKFJlY29yZCwgS2luZCkpOworICB9CisgIHJldHVybiBUb3RhbFNpemU7Cit9CisKKy8qIQorICogRXh0cmFjdCB2YWx1ZSBwcm9maWxlIGRhdGEgb2YgYSBmdW5jdGlvbiBmb3IgdGhlIHByb2ZpbGUga2luZCBcYyBWYWx1ZUtpbmQKKyAqIGZyb20gdGhlIFxjIENsb3N1cmUgYW5kIHNlcmlhbGl6ZSB0aGUgZGF0YSBpbnRvIFxjIFRoaXMgcmVjb3JkIGluc3RhbmNlLgorICovCitJTlNUUl9QUk9GX1ZJU0lCSUxJVFkgdm9pZAorc2VyaWFsaXplVmFsdWVQcm9mUmVjb3JkRnJvbShWYWx1ZVByb2ZSZWNvcmQgKlRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlUHJvZlJlY29yZENsb3N1cmUgKkNsb3N1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFZhbHVlS2luZCwgdWludDMyX3QgTnVtVmFsdWVTaXRlcykgeworICB1aW50MzJfdCBTOworICBjb25zdCB2b2lkICpSZWNvcmQgPSBDbG9zdXJlLT5SZWNvcmQ7CisgIFRoaXMtPktpbmQgPSBWYWx1ZUtpbmQ7CisgIFRoaXMtPk51bVZhbHVlU2l0ZXMgPSBOdW1WYWx1ZVNpdGVzOworICBJbnN0clByb2ZWYWx1ZURhdGEgKkRzdFZEID0gZ2V0VmFsdWVQcm9mUmVjb3JkVmFsdWVEYXRhKFRoaXMpOworCisgIGZvciAoUyA9IDA7IFMgPCBOdW1WYWx1ZVNpdGVzOyBTKyspIHsKKyAgICB1aW50MzJfdCBORCA9IENsb3N1cmUtPkdldE51bVZhbHVlRGF0YUZvclNpdGUoUmVjb3JkLCBWYWx1ZUtpbmQsIFMpOworICAgIFRoaXMtPlNpdGVDb3VudEFycmF5W1NdID0gTkQ7CisgICAgQ2xvc3VyZS0+R2V0VmFsdWVGb3JTaXRlKFJlY29yZCwgRHN0VkQsIFZhbHVlS2luZCwgUyk7CisgICAgRHN0VkQgKz0gTkQ7CisgIH0KK30KKworLyohCisgKiBFeHRyYWN0IHZhbHVlIHByb2ZpbGUgZGF0YSBvZiBhIGZ1bmN0aW9uICBmcm9tIHRoZSBcYyBDbG9zdXJlCisgKiBhbmQgc2VyaWFsaXplIHRoZSBkYXRhIGludG8gXGMgRHN0RGF0YSBpZiBpdCBpcyBub3QgTlVMTCBvciBoZWFwCisgKiBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSBcYyBDbG9zdXJlJ3MgYWxsb2NhdG9yIG1ldGhvZC4gSWYgXGMKKyAqIERzdERhdGEgaXMgbm90IG51bGwsIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gc2V0IHRoZSBUb3RhbFNpemUKKyAqIGluIERzdERhdGEuCisgKi8KK0lOU1RSX1BST0ZfVklTSUJJTElUWSBWYWx1ZVByb2ZEYXRhICoKK3NlcmlhbGl6ZVZhbHVlUHJvZkRhdGFGcm9tKFZhbHVlUHJvZlJlY29yZENsb3N1cmUgKkNsb3N1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVByb2ZEYXRhICpEc3REYXRhKSB7CisgIHVpbnQzMl90IEtpbmQ7CisgIHVpbnQzMl90IFRvdGFsU2l6ZSA9CisgICAgICBEc3REYXRhID8gRHN0RGF0YS0+VG90YWxTaXplIDogZ2V0VmFsdWVQcm9mRGF0YVNpemUoQ2xvc3VyZSk7CisKKyAgVmFsdWVQcm9mRGF0YSAqVlBEID0KKyAgICAgIERzdERhdGEgPyBEc3REYXRhIDogQ2xvc3VyZS0+QWxsb2NWYWx1ZVByb2ZEYXRhKFRvdGFsU2l6ZSk7CisKKyAgVlBELT5Ub3RhbFNpemUgPSBUb3RhbFNpemU7CisgIFZQRC0+TnVtVmFsdWVLaW5kcyA9IENsb3N1cmUtPkdldE51bVZhbHVlS2luZHMoQ2xvc3VyZS0+UmVjb3JkKTsKKyAgVmFsdWVQcm9mUmVjb3JkICpWUiA9IGdldEZpcnN0VmFsdWVQcm9mUmVjb3JkKFZQRCk7CisgIGZvciAoS2luZCA9IElQVktfRmlyc3Q7IEtpbmQgPD0gSVBWS19MYXN0OyBLaW5kKyspIHsKKyAgICB1aW50MzJfdCBOdW1WYWx1ZVNpdGVzID0gQ2xvc3VyZS0+R2V0TnVtVmFsdWVTaXRlcyhDbG9zdXJlLT5SZWNvcmQsIEtpbmQpOworICAgIGlmICghTnVtVmFsdWVTaXRlcykKKyAgICAgIGNvbnRpbnVlOworICAgIHNlcmlhbGl6ZVZhbHVlUHJvZlJlY29yZEZyb20oVlIsIENsb3N1cmUsIEtpbmQsIE51bVZhbHVlU2l0ZXMpOworICAgIFZSID0gZ2V0VmFsdWVQcm9mUmVjb3JkTmV4dChWUik7CisgIH0KKyAgcmV0dXJuIFZQRDsKK30KKworI3VuZGVmIElOU1RSX1BST0ZfQ09NTU9OX0FQSV9JTVBMCisjZW5kaWYgLyogSU5TVFJfUFJPRl9DT01NT05fQVBJX0lNUEwgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmbmRlZiBJTlNUUl9QUk9GX0RBVEFfREVGSU5FRAorCisjaWZuZGVmIElOU1RSX1BST0ZfREFUQV9JTkMKKyNkZWZpbmUgSU5TVFJfUFJPRl9EQVRBX0lOQworCisvKiBIZWxwZXIgbWFjcm9zLiAgKi8KKyNkZWZpbmUgSU5TVFJfUFJPRl9TSU1QTEVfUVVPVEUoeCkgI3gKKyNkZWZpbmUgSU5TVFJfUFJPRl9RVU9URSh4KSBJTlNUUl9QUk9GX1NJTVBMRV9RVU9URSh4KQorI2RlZmluZSBJTlNUUl9QUk9GX1NJTVBMRV9DT05DQVQoeCx5KSB4ICMjIHkKKyNkZWZpbmUgSU5TVFJfUFJPRl9DT05DQVQoeCx5KSBJTlNUUl9QUk9GX1NJTVBMRV9DT05DQVQoeCx5KQorCisvKiBNYWdpYyBudW1iZXIgdG8gZGV0ZWN0IGZpbGUgZm9ybWF0IGFuZCBlbmRpYW5uZXNzLgorICogVXNlIDI1NSBhdCBvbmUgZW5kLCBzaW5jZSBubyBVVEYtOCBmaWxlIGNhbiB1c2UgdGhhdCBjaGFyYWN0ZXIuICBBdm9pZCAwLAorICogc28gdGhhdCB1dGlsaXRpZXMsIGxpa2Ugc3RyaW5ncywgZG9uJ3QgZ3JhYiBpdCBhcyBhIHN0cmluZy4gIDEyOSBpcyBhbHNvCisgKiBpbnZhbGlkIFVURi04LCBhbmQgaGlnaCBlbm91Z2ggdG8gYmUgaW50ZXJlc3RpbmcuCisgKiBVc2UgImxwcm9mciIgaW4gdGhlIGNlbnRyZSB0byBzdGFuZCBmb3IgIkxMVk0gUHJvZmlsZSBSYXciLCBvciAibHByb2ZSIgorICogZm9yIDMyLWJpdCBwbGF0Zm9ybXMuCisgKi8KKyNkZWZpbmUgSU5TVFJfUFJPRl9SQVdfTUFHSUNfNjQgKHVpbnQ2NF90KTI1NSA8PCA1NiB8ICh1aW50NjRfdCknbCcgPDwgNDggfCBcCisgICAgICAgKHVpbnQ2NF90KSdwJyA8PCA0MCB8ICh1aW50NjRfdCkncicgPDwgMzIgfCAodWludDY0X3QpJ28nIDw8IDI0IHwgIFwKKyAgICAgICAgKHVpbnQ2NF90KSdmJyA8PCAxNiB8ICh1aW50NjRfdCkncicgPDwgOCB8ICh1aW50NjRfdCkxMjkKKyNkZWZpbmUgSU5TVFJfUFJPRl9SQVdfTUFHSUNfMzIgKHVpbnQ2NF90KTI1NSA8PCA1NiB8ICh1aW50NjRfdCknbCcgPDwgNDggfCBcCisgICAgICAgKHVpbnQ2NF90KSdwJyA8PCA0MCB8ICh1aW50NjRfdCkncicgPDwgMzIgfCAodWludDY0X3QpJ28nIDw8IDI0IHwgIFwKKyAgICAgICAgKHVpbnQ2NF90KSdmJyA8PCAxNiB8ICh1aW50NjRfdCknUicgPDwgOCB8ICh1aW50NjRfdCkxMjkKKworLyogUmF3IHByb2ZpbGUgZm9ybWF0IHZlcnNpb24gKHN0YXJ0IGZyb20gMSkuICovCisjZGVmaW5lIElOU1RSX1BST0ZfUkFXX1ZFUlNJT04gNAorLyogSW5kZXhlZCBwcm9maWxlIGZvcm1hdCB2ZXJzaW9uIChzdGFydCBmcm9tIDEpLiAqLworI2RlZmluZSBJTlNUUl9QUk9GX0lOREVYX1ZFUlNJT04gNQorLyogQ292ZXJhZ2UgbWFwcGluZyBmb3JtYXQgdnJlc2lvbiAoc3RhcnQgZnJvbSAwKS4gKi8KKyNkZWZpbmUgSU5TVFJfUFJPRl9DT1ZNQVBfVkVSU0lPTiAyCisKKy8qIFByb2ZpbGUgdmVyc2lvbiBpcyBhbHdheXMgb2YgdHlwZSB1aW50NjRfdC4gUmVzZXJ2ZSB0aGUgdXBwZXIgOCBiaXRzIGluIHRoZQorICogdmVyc2lvbiBmb3Igb3RoZXIgdmFyaWFudHMgb2YgcHJvZmlsZS4gV2Ugc2V0IHRoZSBsb3dlc3QgYml0IG9mIHRoZSB1cHBlciA4CisgKiBiaXRzIChpLmUuIGJpdCA1NikgdG8gMSB0byBpbmRpY2F0ZSBpZiB0aGlzIGlzIGFuIElSLWxldmVsIGluc3RydW1lbnRhaXRvbgorICogZ2VuZXJhdGVkIHByb2ZpbGUsIGFuZCAwIGlmIHRoaXMgaXMgYSBDbGFuZyBGRSBnZW5lcmF0ZWQgcHJvZmlsZS4KKyAqLworI2RlZmluZSBWQVJJQU5UX01BU0tTX0FMTCAweGZmMDAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgR0VUX1ZFUlNJT04oVikgKChWKSAmIH5WQVJJQU5UX01BU0tTX0FMTCkKKyNkZWZpbmUgVkFSSUFOVF9NQVNLX0lSX1BST0YgKDB4MVVMTCA8PCA1NikKKyNkZWZpbmUgSU5TVFJfUFJPRl9SQVdfVkVSU0lPTl9WQVIgX19sbHZtX3Byb2ZpbGVfcmF3X3ZlcnNpb24KKyNkZWZpbmUgSU5TVFJfUFJPRl9QUk9GSUxFX1JVTlRJTUVfVkFSIF9fbGx2bV9wcm9maWxlX3J1bnRpbWUKKworLyogVGhlIHZhcmlhYmxlIHRoYXQgaG9sZHMgdGhlIG5hbWUgb2YgdGhlIHByb2ZpbGUgZGF0YQorICogc3BlY2lmaWVkIHZpYSBjb21tYW5kIGxpbmUuICovCisjZGVmaW5lIElOU1RSX1BST0ZfUFJPRklMRV9OQU1FX1ZBUiBfX2xsdm1fcHJvZmlsZV9maWxlbmFtZQorCisvKiBzZWN0aW9uIG5hbWUgc3RyaW5ncyBjb21tb24gdG8gYWxsIHRhcmdldHMgb3RoZXIKKyAgIHRoYW4gV0lOMzIgKi8KKyNkZWZpbmUgSU5TVFJfUFJPRl9EQVRBX0NPTU1PTiBfX2xsdm1fcHJmX2RhdGEKKyNkZWZpbmUgSU5TVFJfUFJPRl9OQU1FX0NPTU1PTiBfX2xsdm1fcHJmX25hbWVzCisjZGVmaW5lIElOU1RSX1BST0ZfQ05UU19DT01NT04gX19sbHZtX3ByZl9jbnRzCisjZGVmaW5lIElOU1RSX1BST0ZfVkFMU19DT01NT04gX19sbHZtX3ByZl92YWxzCisjZGVmaW5lIElOU1RSX1BST0ZfVk5PREVTX0NPTU1PTiBfX2xsdm1fcHJmX3ZuZHMKKyNkZWZpbmUgSU5TVFJfUFJPRl9DT1ZNQVBfQ09NTU9OIF9fbGx2bV9jb3ZtYXAKKy8qIFdpbjMyICovCisjZGVmaW5lIElOU1RSX1BST0ZfREFUQV9DT0ZGIC5scHJmZAorI2RlZmluZSBJTlNUUl9QUk9GX05BTUVfQ09GRiAubHByZm4KKyNkZWZpbmUgSU5TVFJfUFJPRl9DTlRTX0NPRkYgLmxwcmZjCisjZGVmaW5lIElOU1RSX1BST0ZfVkFMU19DT0ZGIC5scHJmdgorI2RlZmluZSBJTlNUUl9QUk9GX1ZOT0RFU19DT0ZGIC5scHJmbmQKKyNkZWZpbmUgSU5TVFJfUFJPRl9DT1ZNQVBfQ09GRiAubGNvdm1hcAorCisjaWZkZWYgX1dJTjMyCisvKiBSdW50aW1lIHNlY3Rpb24gbmFtZXMgYW5kIG5hbWUgc3RyaW5ncy4gICovCisjZGVmaW5lIElOU1RSX1BST0ZfREFUQV9TRUNUX05BTUUgSU5TVFJfUFJPRl9EQVRBX0NPRkYKKyNkZWZpbmUgSU5TVFJfUFJPRl9OQU1FX1NFQ1RfTkFNRSBJTlNUUl9QUk9GX05BTUVfQ09GRgorI2RlZmluZSBJTlNUUl9QUk9GX0NOVFNfU0VDVF9OQU1FIElOU1RSX1BST0ZfQ05UU19DT0ZGCisvKiBBcnJheSBvZiBwb2ludGVycy4gRWFjaCBwb2ludGVyIHBvaW50cyB0byBhIGxpc3QKKyAqIG9mIHZhbHVlIG5vZGVzIGFzc29jaWF0ZWQgd2l0aCBvbmUgdmFsdWUgc2l0ZS4KKyAqLworI2RlZmluZSBJTlNUUl9QUk9GX1ZBTFNfU0VDVF9OQU1FIElOU1RSX1BST0ZfVkFMU19DT0ZGCisvKiBWYWx1ZSBwcm9maWxlIG5vZGVzIHNlY3Rpb24uICovCisjZGVmaW5lIElOU1RSX1BST0ZfVk5PREVTX1NFQ1RfTkFNRSBJTlNUUl9QUk9GX1ZOT0RFU19DT0ZGCisjZGVmaW5lIElOU1RSX1BST0ZfQ09WTUFQX1NFQ1RfTkFNRSBJTlNUUl9QUk9GX0NPVk1BUF9DT0ZGCisjZWxzZQorLyogUnVudGltZSBzZWN0aW9uIG5hbWVzIGFuZCBuYW1lIHN0cmluZ3MuICAqLworI2RlZmluZSBJTlNUUl9QUk9GX0RBVEFfU0VDVF9OQU1FIElOU1RSX1BST0ZfREFUQV9DT01NT04KKyNkZWZpbmUgSU5TVFJfUFJPRl9OQU1FX1NFQ1RfTkFNRSBJTlNUUl9QUk9GX05BTUVfQ09NTU9OCisjZGVmaW5lIElOU1RSX1BST0ZfQ05UU19TRUNUX05BTUUgSU5TVFJfUFJPRl9DTlRTX0NPTU1PTgorLyogQXJyYXkgb2YgcG9pbnRlcnMuIEVhY2ggcG9pbnRlciBwb2ludHMgdG8gYSBsaXN0CisgKiBvZiB2YWx1ZSBub2RlcyBhc3NvY2lhdGVkIHdpdGggb25lIHZhbHVlIHNpdGUuCisgKi8KKyNkZWZpbmUgSU5TVFJfUFJPRl9WQUxTX1NFQ1RfTkFNRSBJTlNUUl9QUk9GX1ZBTFNfQ09NTU9OCisvKiBWYWx1ZSBwcm9maWxlIG5vZGVzIHNlY3Rpb24uICovCisjZGVmaW5lIElOU1RSX1BST0ZfVk5PREVTX1NFQ1RfTkFNRSBJTlNUUl9QUk9GX1ZOT0RFU19DT01NT04KKyNkZWZpbmUgSU5TVFJfUFJPRl9DT1ZNQVBfU0VDVF9OQU1FIElOU1RSX1BST0ZfQ09WTUFQX0NPTU1PTgorI2VuZGlmCisKKyNkZWZpbmUgSU5TVFJfUFJPRl9EQVRBX1NFQ1RfTkFNRV9TVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOU1RSX1BST0ZfUVVPVEUoSU5TVFJfUFJPRl9EQVRBX1NFQ1RfTkFNRSkKKyNkZWZpbmUgSU5TVFJfUFJPRl9OQU1FX1NFQ1RfTkFNRV9TVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOU1RSX1BST0ZfUVVPVEUoSU5TVFJfUFJPRl9OQU1FX1NFQ1RfTkFNRSkKKyNkZWZpbmUgSU5TVFJfUFJPRl9DTlRTX1NFQ1RfTkFNRV9TVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOU1RSX1BST0ZfUVVPVEUoSU5TVFJfUFJPRl9DTlRTX1NFQ1RfTkFNRSkKKyNkZWZpbmUgSU5TVFJfUFJPRl9DT1ZNQVBfU0VDVF9OQU1FX1NUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOU1RSX1BST0ZfUVVPVEUoSU5TVFJfUFJPRl9DT1ZNQVBfU0VDVF9OQU1FKQorI2RlZmluZSBJTlNUUl9QUk9GX1ZBTFNfU0VDVF9OQU1FX1NUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5TVFJfUFJPRl9RVU9URShJTlNUUl9QUk9GX1ZBTFNfU0VDVF9OQU1FKQorI2RlZmluZSBJTlNUUl9QUk9GX1ZOT0RFU19TRUNUX05BTUVfU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5TVFJfUFJPRl9RVU9URShJTlNUUl9QUk9GX1ZOT0RFU19TRUNUX05BTUUpCisKKy8qIE1hY3JvcyB0byBkZWZpbmUgc3RhcnQvc3RvcCBzZWN0aW9uIHN5bWJvbCBmb3IgYSBnaXZlbgorICogc2VjdGlvbiBvbiBMaW51eC4gRm9yIGluc3RhbmNlCisgKiBJTlNUUl9QUk9GX1NFQ1RfU1RBUlQoSU5TVFJfUFJPRl9EQVRBX1NFQ1RfTkFNRSkgd2lsbAorICogZXhwYW5kIHRvIF9fc3RhcnRfX19sbHZtX3Byb2ZfZGF0YQorICovCisjZGVmaW5lIElOU1RSX1BST0ZfU0VDVF9TVEFSVChTZWN0KSBcCisgICAgICAgIElOU1RSX1BST0ZfQ09OQ0FUKF9fc3RhcnRfLFNlY3QpCisjZGVmaW5lIElOU1RSX1BST0ZfU0VDVF9TVE9QKFNlY3QpIFwKKyAgICAgICAgSU5TVFJfUFJPRl9DT05DQVQoX19zdG9wXyxTZWN0KQorCisvKiBWYWx1ZSBQcm9maWxpbmcgQVBJIGxpbmthZ2UgbmFtZS4gICovCisjZGVmaW5lIElOU1RSX1BST0ZfVkFMVUVfUFJPRl9GVU5DIF9fbGx2bV9wcm9maWxlX2luc3RydW1lbnRfdGFyZ2V0CisjZGVmaW5lIElOU1RSX1BST0ZfVkFMVUVfUFJPRl9GVU5DX1NUUiBcCisgICAgICAgIElOU1RSX1BST0ZfUVVPVEUoSU5TVFJfUFJPRl9WQUxVRV9QUk9GX0ZVTkMpCisjZGVmaW5lIElOU1RSX1BST0ZfVkFMVUVfUkFOR0VfUFJPRl9GVU5DIF9fbGx2bV9wcm9maWxlX2luc3RydW1lbnRfcmFuZ2UKKyNkZWZpbmUgSU5TVFJfUFJPRl9WQUxVRV9SQU5HRV9QUk9GX0ZVTkNfU1RSIFwKKyAgICAgICAgSU5TVFJfUFJPRl9RVU9URShJTlNUUl9QUk9GX1ZBTFVFX1JBTkdFX1BST0ZfRlVOQykKKworLyogSW5zdHJQcm9maWxlIHBlci1mdW5jdGlvbiBjb250cm9sIGRhdGEgYWxpZ25tZW50LiAgKi8KKyNkZWZpbmUgSU5TVFJfUFJPRl9EQVRBX0FMSUdOTUVOVCA4CisKKy8qIFRoZSBkYXRhIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSB0cmFja2VkIHZhbHVlIGJ5IHRoZQorICogdmFsdWUgcHJvZmlsZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IEluc3RyUHJvZlZhbHVlRGF0YSB7CisgIC8qIFByb2ZpbGVkIHZhbHVlLiAqLworICB1aW50NjRfdCBWYWx1ZTsKKyAgLyogTnVtYmVyIG9mIHRpbWVzIHRoZSB2YWx1ZSBhcHBlYXJzIGluIHRoZSB0cmFpbmluZyBydW4uICovCisgIHVpbnQ2NF90IENvdW50OworfSBJbnN0clByb2ZWYWx1ZURhdGE7CisKKyNlbmRpZiAvKiBJTlNUUl9QUk9GX0RBVEFfSU5DICovCisKKyNlbHNlCisjdW5kZWYgSU5TVFJfUFJPRl9EQVRBX0RFRklORUQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2ZSZWFkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZjMjJkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mUmVhZGVyLmgKQEAgLTAsMCArMSw0NTYgQEAKKy8vPT09LSBJbnN0clByb2ZSZWFkZXIuaCAtIEluc3RydW1lbnRlZCBwcm9maWxpbmcgcmVhZGVycyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHN1cHBvcnQgZm9yIHJlYWRpbmcgcHJvZmlsaW5nIGRhdGEgZm9yIGluc3RydW1lbnRhdGlvbgorLy8gYmFzZWQgUEdPIGFuZCBjb3ZlcmFnZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fUFJPRklMRURBVEFfSU5TVFJQUk9GUkVBREVSX0gKKyNkZWZpbmUgTExWTV9QUk9GSUxFREFUQV9JTlNUUlBST0ZSRUFERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Byb2ZpbGVTdW1tYXJ5LmgiCisjaW5jbHVkZSAibGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2YuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0xpbmVJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvT25EaXNrSGFzaFRhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1N3YXBCeXRlT3JkZXIuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEluc3RyUHJvZlJlYWRlcjsKKworLy8vIEEgZmlsZSBmb3JtYXQgYWdub3N0aWMgaXRlcmF0b3Igb3ZlciBwcm9maWxpbmcgZGF0YS4KK2NsYXNzIEluc3RyUHJvZkl0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjppbnB1dF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkSW5zdHJQcm9mUmVjb3JkPiB7CisgIEluc3RyUHJvZlJlYWRlciAqUmVhZGVyID0gbnVsbHB0cjsKKyAgdmFsdWVfdHlwZSBSZWNvcmQ7CisKKyAgdm9pZCBJbmNyZW1lbnQoKTsKKworcHVibGljOgorICBJbnN0clByb2ZJdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgSW5zdHJQcm9mSXRlcmF0b3IoSW5zdHJQcm9mUmVhZGVyICpSZWFkZXIpIDogUmVhZGVyKFJlYWRlcikgeyBJbmNyZW1lbnQoKTsgfQorCisgIEluc3RyUHJvZkl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeyBJbmNyZW1lbnQoKTsgcmV0dXJuICp0aGlzOyB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbnN0clByb2ZJdGVyYXRvciAmUkhTKSB7IHJldHVybiBSZWFkZXIgPT0gUkhTLlJlYWRlcjsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgSW5zdHJQcm9mSXRlcmF0b3IgJlJIUykgeyByZXR1cm4gUmVhZGVyICE9IFJIUy5SZWFkZXI7IH0KKyAgdmFsdWVfdHlwZSAmb3BlcmF0b3IqKCkgeyByZXR1cm4gUmVjb3JkOyB9CisgIHZhbHVlX3R5cGUgKm9wZXJhdG9yLT4oKSB7IHJldHVybiAmUmVjb3JkOyB9Cit9OworCisvLy8gQmFzZSBjbGFzcyBhbmQgaW50ZXJmYWNlIGZvciByZWFkaW5nIHByb2ZpbGluZyBkYXRhIG9mIGFueSBrbm93biBpbnN0cnByb2YKKy8vLyBmb3JtYXQuIFByb3ZpZGVzIGFuIGl0ZXJhdG9yIG92ZXIgTmFtZWRJbnN0clByb2ZSZWNvcmRzLgorY2xhc3MgSW5zdHJQcm9mUmVhZGVyIHsKKyAgaW5zdHJwcm9mX2Vycm9yIExhc3RFcnJvciA9IGluc3RycHJvZl9lcnJvcjo6c3VjY2VzczsKKworcHVibGljOgorICBJbnN0clByb2ZSZWFkZXIoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgfkluc3RyUHJvZlJlYWRlcigpID0gZGVmYXVsdDsKKworICAvLy8gUmVhZCB0aGUgaGVhZGVyLiAgUmVxdWlyZWQgYmVmb3JlIHJlYWRpbmcgZmlyc3QgcmVjb3JkLgorICB2aXJ0dWFsIEVycm9yIHJlYWRIZWFkZXIoKSA9IDA7CisKKyAgLy8vIFJlYWQgYSBzaW5nbGUgcmVjb3JkLgorICB2aXJ0dWFsIEVycm9yIHJlYWROZXh0UmVjb3JkKE5hbWVkSW5zdHJQcm9mUmVjb3JkICZSZWNvcmQpID0gMDsKKworICAvLy8gSXRlcmF0b3Igb3ZlciBwcm9maWxlIGRhdGEuCisgIEluc3RyUHJvZkl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gSW5zdHJQcm9mSXRlcmF0b3IodGhpcyk7IH0KKyAgSW5zdHJQcm9mSXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gSW5zdHJQcm9mSXRlcmF0b3IoKTsgfQorCisgIHZpcnR1YWwgYm9vbCBpc0lSTGV2ZWxQcm9maWxlKCkgY29uc3QgPSAwOworCisgIC8vLyBSZXR1cm4gdGhlIFBHTyBzeW10YWIuIFRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQgcmVhZGVyczoKKyAgLy8vIFJhdywgVGV4dCwgYW5kIEluZGV4ZWQgcHJvZmlsZSByZWFkZXJzLiBUaGUgZmlyc3QgdHdvIHR5cGVzCisgIC8vLyBvZiByZWFkZXJzIGFyZSB1c2VkIG9ubHkgYnkgbGx2bS1wcm9mZGF0YSB0b29sLCB3aGlsZSB0aGUgaW5kZXhlZAorICAvLy8gcHJvZmlsZSByZWFkZXIgaXMgYWxzbyB1c2VkIGJ5IGxsdm0tY292IHRvb2wgYW5kIHRoZSBjb21waWxlciAoCisgIC8vLyBiYWNrZW5kIG9yIGZyb250ZW5kKS4gU2luY2UgY3JlYXRpbmcgUEdPIHN5bXRhYiBjYW4gY3JlYXRlCisgIC8vLyBzaWduaWZpY2FudCBydW50aW1lIGFuZCBtZW1vcnkgb3ZlcmhlYWQgKGFzIGl0IHRvdWNoZXMgZGF0YQorICAvLy8gZm9yIHRoZSB3aG9sZSBwcm9ncmFtKSwgSW5zdHJQcm9mU3ltdGFiIGZvciB0aGUgaW5kZXhlZCBwcm9maWxlCisgIC8vLyByZWFkZXIgc2hvdWxkIGJlIGNyZWF0ZWQgb24gZGVtYW5kIGFuZCBpdCBpcyByZWNvbW1lbmRlZCB0byBiZQorICAvLy8gb25seSB1c2VkIGZvciBkdW1waW5nIHB1cnBvc2Ugd2l0aCBsbHZtLXByb2Z0b29sLCBub3Qgd2l0aCB0aGUKKyAgLy8vIGNvbXBpbGVyLgorICB2aXJ0dWFsIEluc3RyUHJvZlN5bXRhYiAmZ2V0U3ltdGFiKCkgPSAwOworCitwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxJbnN0clByb2ZTeW10YWI+IFN5bXRhYjsKKworICAvLy8gU2V0IHRoZSBjdXJyZW50IGVycm9yIGFuZCByZXR1cm4gc2FtZS4KKyAgRXJyb3IgZXJyb3IoaW5zdHJwcm9mX2Vycm9yIEVycikgeworICAgIExhc3RFcnJvciA9IEVycjsKKyAgICBpZiAoRXJyID09IGluc3RycHJvZl9lcnJvcjo6c3VjY2VzcykKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgIHJldHVybiBtYWtlX2Vycm9yPEluc3RyUHJvZkVycm9yPihFcnIpOworICB9CisKKyAgRXJyb3IgZXJyb3IoRXJyb3IgJiZFKSB7IHJldHVybiBlcnJvcihJbnN0clByb2ZFcnJvcjo6dGFrZShzdGQ6Om1vdmUoRSkpKTsgfQorCisgIC8vLyBDbGVhciB0aGUgY3VycmVudCBlcnJvciBhbmQgcmV0dXJuIGEgc3VjY2Vzc2Z1bCBvbmUuCisgIEVycm9yIHN1Y2Nlc3MoKSB7IHJldHVybiBlcnJvcihpbnN0cnByb2ZfZXJyb3I6OnN1Y2Nlc3MpOyB9CisKK3B1YmxpYzoKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgaGFzIGZpbmlzaGVkIHJlYWRpbmcgdGhlIHByb2ZpbGUgZGF0YS4KKyAgYm9vbCBpc0VPRigpIHsgcmV0dXJuIExhc3RFcnJvciA9PSBpbnN0cnByb2ZfZXJyb3I6OmVvZjsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIGVuY291bnRlcmVkIGFuIGVycm9yIHJlYWRpbmcgcHJvZmlsaW5nIGRhdGEuCisgIGJvb2wgaGFzRXJyb3IoKSB7IHJldHVybiBMYXN0RXJyb3IgIT0gaW5zdHJwcm9mX2Vycm9yOjpzdWNjZXNzICYmICFpc0VPRigpOyB9CisKKyAgLy8vIEdldCB0aGUgY3VycmVudCBlcnJvci4KKyAgRXJyb3IgZ2V0RXJyb3IoKSB7CisgICAgaWYgKGhhc0Vycm9yKCkpCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxJbnN0clByb2ZFcnJvcj4oTGFzdEVycm9yKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIC8vLyBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gYXBwcm9wcmlhdGVseSB0eXBlZCByZWFkZXIgZm9yIHRoZSBnaXZlbgorICAvLy8gaW5zdHJwcm9mIGZpbGUuCisgIHN0YXRpYyBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5zdHJQcm9mUmVhZGVyPj4gY3JlYXRlKGNvbnN0IFR3aW5lICZQYXRoKTsKKworICBzdGF0aWMgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPEluc3RyUHJvZlJlYWRlcj4+CisgIGNyZWF0ZShzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBCdWZmZXIpOworfTsKKworLy8vIFJlYWRlciBmb3IgdGhlIHNpbXBsZSB0ZXh0IGJhc2VkIGluc3RycHJvZiBmb3JtYXQuCisvLy8KKy8vLyBUaGlzIGZvcm1hdCBpcyBhIHNpbXBsZSB0ZXh0IGZvcm1hdCB0aGF0J3Mgc3VpdGFibGUgZm9yIHRlc3QgZGF0YS4gUmVjb3JkcworLy8vIGFyZSBzZXBhcmF0ZWQgYnkgb25lIG9yIG1vcmUgYmxhbmsgbGluZXMsIGFuZCByZWNvcmQgZmllbGRzIGFyZSBzZXBhcmF0ZWQgYnkKKy8vLyBuZXcgbGluZXMuCisvLy8KKy8vLyBFYWNoIHJlY29yZCBjb25zaXN0cyBvZiBhIGZ1bmN0aW9uIG5hbWUsIGEgZnVuY3Rpb24gaGFzaCwgYSBudW1iZXIgb2YKKy8vLyBjb3VudGVycywgYW5kIHRoZW4gZWFjaCBjb3VudGVyIHZhbHVlLCBpbiB0aGF0IG9yZGVyLgorY2xhc3MgVGV4dEluc3RyUHJvZlJlYWRlciA6IHB1YmxpYyBJbnN0clByb2ZSZWFkZXIgeworcHJpdmF0ZToKKyAgLy8vIFRoZSBwcm9maWxlIGRhdGEgZmlsZSBjb250ZW50cy4KKyAgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gRGF0YUJ1ZmZlcjsKKyAgLy8vIEl0ZXJhdG9yIG92ZXIgdGhlIHByb2ZpbGUgZGF0YS4KKyAgbGluZV9pdGVyYXRvciBMaW5lOworICBib29sIElzSVJMZXZlbFByb2ZpbGUgPSBmYWxzZTsKKworICBFcnJvciByZWFkVmFsdWVQcm9maWxlRGF0YShJbnN0clByb2ZSZWNvcmQgJlJlY29yZCk7CisKK3B1YmxpYzoKKyAgVGV4dEluc3RyUHJvZlJlYWRlcihzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBEYXRhQnVmZmVyXykKKyAgICAgIDogRGF0YUJ1ZmZlcihzdGQ6Om1vdmUoRGF0YUJ1ZmZlcl8pKSwgTGluZSgqRGF0YUJ1ZmZlciwgdHJ1ZSwgJyMnKSB7fQorICBUZXh0SW5zdHJQcm9mUmVhZGVyKGNvbnN0IFRleHRJbnN0clByb2ZSZWFkZXIgJikgPSBkZWxldGU7CisgIFRleHRJbnN0clByb2ZSZWFkZXIgJm9wZXJhdG9yPShjb25zdCBUZXh0SW5zdHJQcm9mUmVhZGVyICYpID0gZGVsZXRlOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnVmZmVyIGlzIGluIHRleHQgaW5zdHJwcm9mIGZvcm1hdC4KKyAgc3RhdGljIGJvb2wgaGFzRm9ybWF0KGNvbnN0IE1lbW9yeUJ1ZmZlciAmQnVmZmVyKTsKKworICBib29sIGlzSVJMZXZlbFByb2ZpbGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBJc0lSTGV2ZWxQcm9maWxlOyB9CisKKyAgLy8vIFJlYWQgdGhlIGhlYWRlci4KKyAgRXJyb3IgcmVhZEhlYWRlcigpIG92ZXJyaWRlOworCisgIC8vLyBSZWFkIGEgc2luZ2xlIHJlY29yZC4KKyAgRXJyb3IgcmVhZE5leHRSZWNvcmQoTmFtZWRJbnN0clByb2ZSZWNvcmQgJlJlY29yZCkgb3ZlcnJpZGU7CisKKyAgSW5zdHJQcm9mU3ltdGFiICZnZXRTeW10YWIoKSBvdmVycmlkZSB7CisgICAgYXNzZXJ0KFN5bXRhYi5nZXQoKSk7CisgICAgcmV0dXJuICpTeW10YWIuZ2V0KCk7CisgIH0KK307CisKKy8vLyBSZWFkZXIgZm9yIHRoZSByYXcgaW5zdHJwcm9mIGJpbmFyeSBmb3JtYXQgZnJvbSBydW50aW1lLgorLy8vCisvLy8gVGhpcyBmb3JtYXQgaXMgYSByYXcgbWVtb3J5IGR1bXAgb2YgdGhlIGluc3RydW1lbnRhdGlvbi1iYWVkIHByb2ZpbGluZyBkYXRhCisvLy8gZnJvbSB0aGUgcnVudGltZS4gIEl0IGhhcyBubyBpbmRleC4KKy8vLworLy8vIFRlbXBsYXRlZCBvbiB0aGUgdW5zaWduZWQgdHlwZSB3aG9zZSBzaXplIG1hdGNoZXMgcG9pbnRlcnMgb24gdGhlIHBsYXRmb3JtCisvLy8gdGhhdCB3cm90ZSB0aGUgcHJvZmlsZS4KK3RlbXBsYXRlIDxjbGFzcyBJbnRQdHJUPgorY2xhc3MgUmF3SW5zdHJQcm9mUmVhZGVyIDogcHVibGljIEluc3RyUHJvZlJlYWRlciB7Citwcml2YXRlOgorICAvLy8gVGhlIHByb2ZpbGUgZGF0YSBmaWxlIGNvbnRlbnRzLgorICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBEYXRhQnVmZmVyOworICBib29sIFNob3VsZFN3YXBCeXRlczsKKyAgLy8gVGhlIHZhbHVlIG9mIHRoZSB2ZXJzaW9uIGZpZWxkIG9mIHRoZSByYXcgcHJvZmlsZSBkYXRhIGhlYWRlci4gVGhlIGxvd2VyIDU2CisgIC8vIGJpdHMgc3BlY2lmaWVzIHRoZSBmb3JtYXQgdmVyc2lvbiBhbmQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgOCBiaXRzIHNwZWNpZnkKKyAgLy8gdGhlIHZhcmlhbnQgdHlwZXMgb2YgdGhlIHByb2ZpbGUuCisgIHVpbnQ2NF90IFZlcnNpb247CisgIHVpbnQ2NF90IENvdW50ZXJzRGVsdGE7CisgIHVpbnQ2NF90IE5hbWVzRGVsdGE7CisgIGNvbnN0IFJhd0luc3RyUHJvZjo6UHJvZmlsZURhdGE8SW50UHRyVD4gKkRhdGE7CisgIGNvbnN0IFJhd0luc3RyUHJvZjo6UHJvZmlsZURhdGE8SW50UHRyVD4gKkRhdGFFbmQ7CisgIGNvbnN0IHVpbnQ2NF90ICpDb3VudGVyc1N0YXJ0OworICBjb25zdCBjaGFyICpOYW1lc1N0YXJ0OworICB1aW50NjRfdCBOYW1lc1NpemU7CisgIC8vIEFmdGVyIHZhbHVlIHByb2ZpbGUgaXMgYWxsIHJlYWQsIHRoaXMgcG9pbnRlciBwb2ludHMgdG8KKyAgLy8gdGhlIGhlYWRlciBvZiBuZXh0IHByb2ZpbGUgZGF0YSAoaWYgZXhpc3RzKQorICBjb25zdCB1aW50OF90ICpWYWx1ZURhdGFTdGFydDsKKyAgdWludDMyX3QgVmFsdWVLaW5kTGFzdDsKKyAgdWludDMyX3QgQ3VyVmFsdWVEYXRhU2l6ZTsKKworcHVibGljOgorICBSYXdJbnN0clByb2ZSZWFkZXIoc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gRGF0YUJ1ZmZlcikKKyAgICAgIDogRGF0YUJ1ZmZlcihzdGQ6Om1vdmUoRGF0YUJ1ZmZlcikpIHt9CisgIFJhd0luc3RyUHJvZlJlYWRlcihjb25zdCBSYXdJbnN0clByb2ZSZWFkZXIgJikgPSBkZWxldGU7CisgIFJhd0luc3RyUHJvZlJlYWRlciAmb3BlcmF0b3I9KGNvbnN0IFJhd0luc3RyUHJvZlJlYWRlciAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBoYXNGb3JtYXQoY29uc3QgTWVtb3J5QnVmZmVyICZEYXRhQnVmZmVyKTsKKyAgRXJyb3IgcmVhZEhlYWRlcigpIG92ZXJyaWRlOworICBFcnJvciByZWFkTmV4dFJlY29yZChOYW1lZEluc3RyUHJvZlJlY29yZCAmUmVjb3JkKSBvdmVycmlkZTsKKworICBib29sIGlzSVJMZXZlbFByb2ZpbGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIChWZXJzaW9uICYgVkFSSUFOVF9NQVNLX0lSX1BST0YpICE9IDA7CisgIH0KKworICBJbnN0clByb2ZTeW10YWIgJmdldFN5bXRhYigpIG92ZXJyaWRlIHsKKyAgICBhc3NlcnQoU3ltdGFiLmdldCgpKTsKKyAgICByZXR1cm4gKlN5bXRhYi5nZXQoKTsKKyAgfQorCitwcml2YXRlOgorICBFcnJvciBjcmVhdGVTeW10YWIoSW5zdHJQcm9mU3ltdGFiICZTeW10YWIpOworICBFcnJvciByZWFkTmV4dEhlYWRlcihjb25zdCBjaGFyICpDdXJyZW50UG9zKTsKKyAgRXJyb3IgcmVhZEhlYWRlcihjb25zdCBSYXdJbnN0clByb2Y6OkhlYWRlciAmSGVhZGVyKTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgSW50VD4gSW50VCBzd2FwKEludFQgSW50KSBjb25zdCB7CisgICAgcmV0dXJuIFNob3VsZFN3YXBCeXRlcyA/IHN5czo6Z2V0U3dhcHBlZEJ5dGVzKEludCkgOiBJbnQ7CisgIH0KKworICBzdXBwb3J0OjplbmRpYW5uZXNzIGdldERhdGFFbmRpYW5uZXNzKCkgY29uc3QgeworICAgIHN1cHBvcnQ6OmVuZGlhbm5lc3MgSG9zdEVuZGlhbiA9IGdldEhvc3RFbmRpYW5uZXNzKCk7CisgICAgaWYgKCFTaG91bGRTd2FwQnl0ZXMpCisgICAgICByZXR1cm4gSG9zdEVuZGlhbjsKKyAgICBpZiAoSG9zdEVuZGlhbiA9PSBzdXBwb3J0OjpsaXR0bGUpCisgICAgICByZXR1cm4gc3VwcG9ydDo6YmlnOworICAgIGVsc2UKKyAgICAgIHJldHVybiBzdXBwb3J0OjpsaXR0bGU7CisgIH0KKworICBpbmxpbmUgdWludDhfdCBnZXROdW1QYWRkaW5nQnl0ZXModWludDY0X3QgU2l6ZUluQnl0ZXMpIHsKKyAgICByZXR1cm4gNyAmIChzaXplb2YodWludDY0X3QpIC0gU2l6ZUluQnl0ZXMgJSBzaXplb2YodWludDY0X3QpKTsKKyAgfQorCisgIEVycm9yIHJlYWROYW1lKE5hbWVkSW5zdHJQcm9mUmVjb3JkICZSZWNvcmQpOworICBFcnJvciByZWFkRnVuY0hhc2goTmFtZWRJbnN0clByb2ZSZWNvcmQgJlJlY29yZCk7CisgIEVycm9yIHJlYWRSYXdDb3VudHMoSW5zdHJQcm9mUmVjb3JkICZSZWNvcmQpOworICBFcnJvciByZWFkVmFsdWVQcm9maWxpbmdEYXRhKEluc3RyUHJvZlJlY29yZCAmUmVjb3JkKTsKKyAgYm9vbCBhdEVuZCgpIGNvbnN0IHsgcmV0dXJuIERhdGEgPT0gRGF0YUVuZDsgfQorCisgIHZvaWQgYWR2YW5jZURhdGEoKSB7CisgICAgRGF0YSsrOworICAgIFZhbHVlRGF0YVN0YXJ0ICs9IEN1clZhbHVlRGF0YVNpemU7CisgIH0KKworICBjb25zdCBjaGFyICpnZXROZXh0SGVhZGVyUG9zKCkgY29uc3QgeworICAgICAgYXNzZXJ0KGF0RW5kKCkpOworICAgICAgcmV0dXJuIChjb25zdCBjaGFyICopVmFsdWVEYXRhU3RhcnQ7CisgIH0KKworICBjb25zdCB1aW50NjRfdCAqZ2V0Q291bnRlcihJbnRQdHJUIENvdW50ZXJQdHIpIGNvbnN0IHsKKyAgICBwdHJkaWZmX3QgT2Zmc2V0ID0gKHN3YXAoQ291bnRlclB0cikgLSBDb3VudGVyc0RlbHRhKSAvIHNpemVvZih1aW50NjRfdCk7CisgICAgcmV0dXJuIENvdW50ZXJzU3RhcnQgKyBPZmZzZXQ7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0TmFtZSh1aW50NjRfdCBOYW1lUmVmKSBjb25zdCB7CisgICAgcmV0dXJuIFN5bXRhYi0+Z2V0RnVuY05hbWUoc3dhcChOYW1lUmVmKSk7CisgIH0KK307CisKK3VzaW5nIFJhd0luc3RyUHJvZlJlYWRlcjMyID0gUmF3SW5zdHJQcm9mUmVhZGVyPHVpbnQzMl90PjsKK3VzaW5nIFJhd0luc3RyUHJvZlJlYWRlcjY0ID0gUmF3SW5zdHJQcm9mUmVhZGVyPHVpbnQ2NF90PjsKKworbmFtZXNwYWNlIEluZGV4ZWRJbnN0clByb2YgeworCitlbnVtIGNsYXNzIEhhc2hUIDogdWludDMyX3Q7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBJbmRleGVkSW5zdHJQcm9mCisKKy8vLyBUcmFpdCBmb3IgbG9va3VwcyBpbnRvIHRoZSBvbi1kaXNrIGhhc2ggdGFibGUgZm9yIHRoZSBiaW5hcnkgaW5zdHJwcm9mCisvLy8gZm9ybWF0LgorY2xhc3MgSW5zdHJQcm9mTG9va3VwVHJhaXQgeworICBzdGQ6OnZlY3RvcjxOYW1lZEluc3RyUHJvZlJlY29yZD4gRGF0YUJ1ZmZlcjsKKyAgSW5kZXhlZEluc3RyUHJvZjo6SGFzaFQgSGFzaFR5cGU7CisgIHVuc2lnbmVkIEZvcm1hdFZlcnNpb247CisgIC8vIEVuZGlhbm5lc3Mgb2YgdGhlIGlucHV0IHZhbHVlIHByb2ZpbGUgZGF0YS4KKyAgLy8gSXQgc2hvdWxkIGJlIExFIGJ5IGRlZmF1bHQsIGJ1dCBjYW4gYmUgY2hhbmdlZAorICAvLyBmb3IgdGVzdGluZyBwdXJwb3NlLgorICBzdXBwb3J0OjplbmRpYW5uZXNzIFZhbHVlUHJvZkRhdGFFbmRpYW5uZXNzID0gc3VwcG9ydDo6bGl0dGxlOworCitwdWJsaWM6CisgIEluc3RyUHJvZkxvb2t1cFRyYWl0KEluZGV4ZWRJbnN0clByb2Y6Okhhc2hUIEhhc2hUeXBlLCB1bnNpZ25lZCBGb3JtYXRWZXJzaW9uKQorICAgICAgOiBIYXNoVHlwZShIYXNoVHlwZSksIEZvcm1hdFZlcnNpb24oRm9ybWF0VmVyc2lvbikge30KKworICB1c2luZyBkYXRhX3R5cGUgPSBBcnJheVJlZjxOYW1lZEluc3RyUHJvZlJlY29yZD47CisKKyAgdXNpbmcgaW50ZXJuYWxfa2V5X3R5cGUgPSBTdHJpbmdSZWY7CisgIHVzaW5nIGV4dGVybmFsX2tleV90eXBlID0gU3RyaW5nUmVmOworICB1c2luZyBoYXNoX3ZhbHVlX3R5cGUgPSB1aW50NjRfdDsKKyAgdXNpbmcgb2Zmc2V0X3R5cGUgPSB1aW50NjRfdDsKKworICBzdGF0aWMgYm9vbCBFcXVhbEtleShTdHJpbmdSZWYgQSwgU3RyaW5nUmVmIEIpIHsgcmV0dXJuIEEgPT0gQjsgfQorICBzdGF0aWMgU3RyaW5nUmVmIEdldEludGVybmFsS2V5KFN0cmluZ1JlZiBLKSB7IHJldHVybiBLOyB9CisgIHN0YXRpYyBTdHJpbmdSZWYgR2V0RXh0ZXJuYWxLZXkoU3RyaW5nUmVmIEspIHsgcmV0dXJuIEs7IH0KKworICBoYXNoX3ZhbHVlX3R5cGUgQ29tcHV0ZUhhc2goU3RyaW5nUmVmIEspOworCisgIHN0YXRpYyBzdGQ6OnBhaXI8b2Zmc2V0X3R5cGUsIG9mZnNldF90eXBlPgorICBSZWFkS2V5RGF0YUxlbmd0aChjb25zdCB1bnNpZ25lZCBjaGFyIComRCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdXBwb3J0OworCisgICAgb2Zmc2V0X3R5cGUgS2V5TGVuID0gZW5kaWFuOjpyZWFkTmV4dDxvZmZzZXRfdHlwZSwgbGl0dGxlLCB1bmFsaWduZWQ+KEQpOworICAgIG9mZnNldF90eXBlIERhdGFMZW4gPSBlbmRpYW46OnJlYWROZXh0PG9mZnNldF90eXBlLCBsaXR0bGUsIHVuYWxpZ25lZD4oRCk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEtleUxlbiwgRGF0YUxlbik7CisgIH0KKworICBTdHJpbmdSZWYgUmVhZEtleShjb25zdCB1bnNpZ25lZCBjaGFyICpELCBvZmZzZXRfdHlwZSBOKSB7CisgICAgcmV0dXJuIFN0cmluZ1JlZigoY29uc3QgY2hhciAqKUQsIE4pOworICB9CisKKyAgYm9vbCByZWFkVmFsdWVQcm9maWxpbmdEYXRhKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3QgRW5kKTsKKyAgZGF0YV90eXBlIFJlYWREYXRhKFN0cmluZ1JlZiBLLCBjb25zdCB1bnNpZ25lZCBjaGFyICpELCBvZmZzZXRfdHlwZSBOKTsKKworICAvLyBVc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2Ugb25seS4KKyAgdm9pZCBzZXRWYWx1ZVByb2ZEYXRhRW5kaWFubmVzcyhzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbm5lc3MpIHsKKyAgICBWYWx1ZVByb2ZEYXRhRW5kaWFubmVzcyA9IEVuZGlhbm5lc3M7CisgIH0KK307CisKK3N0cnVjdCBJbnN0clByb2ZSZWFkZXJJbmRleEJhc2UgeworICB2aXJ0dWFsIH5JbnN0clByb2ZSZWFkZXJJbmRleEJhc2UoKSA9IGRlZmF1bHQ7CisKKyAgLy8gUmVhZCBhbGwgdGhlIHByb2ZpbGUgcmVjb3JkcyB3aXRoIHRoZSBzYW1lIGtleSBwb2ludGVkIHRvIHRoZSBjdXJyZW50CisgIC8vIGl0ZXJhdG9yLgorICB2aXJ0dWFsIEVycm9yIGdldFJlY29yZHMoQXJyYXlSZWY8TmFtZWRJbnN0clByb2ZSZWNvcmQ+ICZEYXRhKSA9IDA7CisKKyAgLy8gUmVhZCBhbGwgdGhlIHByb2ZpbGUgcmVjb3JkcyB3aXRoIHRoZSBrZXkgZXF1YWwgdG8gRnVuY05hbWUKKyAgdmlydHVhbCBFcnJvciBnZXRSZWNvcmRzKFN0cmluZ1JlZiBGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxOYW1lZEluc3RyUHJvZlJlY29yZD4gJkRhdGEpID0gMDsKKyAgdmlydHVhbCB2b2lkIGFkdmFuY2VUb05leHRLZXkoKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBhdEVuZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIHNldFZhbHVlUHJvZkRhdGFFbmRpYW5uZXNzKHN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFubmVzcykgPSAwOworICB2aXJ0dWFsIHVpbnQ2NF90IGdldFZlcnNpb24oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0lSTGV2ZWxQcm9maWxlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEVycm9yIHBvcHVsYXRlU3ltdGFiKEluc3RyUHJvZlN5bXRhYiAmKSA9IDA7Cit9OworCit1c2luZyBPbkRpc2tIYXNoVGFibGVJbXBsVjMgPQorICAgIE9uRGlza0l0ZXJhYmxlQ2hhaW5lZEhhc2hUYWJsZTxJbnN0clByb2ZMb29rdXBUcmFpdD47CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBIYXNoVGFibGVJbXBsPgorY2xhc3MgSW5zdHJQcm9mUmVhZGVySW5kZXggOiBwdWJsaWMgSW5zdHJQcm9mUmVhZGVySW5kZXhCYXNlIHsKK3ByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxIYXNoVGFibGVJbXBsPiBIYXNoVGFibGU7CisgIHR5cGVuYW1lIEhhc2hUYWJsZUltcGw6OmRhdGFfaXRlcmF0b3IgUmVjb3JkSXRlcmF0b3I7CisgIHVpbnQ2NF90IEZvcm1hdFZlcnNpb247CisKK3B1YmxpYzoKKyAgSW5zdHJQcm9mUmVhZGVySW5kZXgoY29uc3QgdW5zaWduZWQgY2hhciAqQnVja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3QgUGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3QgQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhlZEluc3RyUHJvZjo6SGFzaFQgSGFzaFR5cGUsIHVpbnQ2NF90IFZlcnNpb24pOworICB+SW5zdHJQcm9mUmVhZGVySW5kZXgoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgRXJyb3IgZ2V0UmVjb3JkcyhBcnJheVJlZjxOYW1lZEluc3RyUHJvZlJlY29yZD4gJkRhdGEpIG92ZXJyaWRlOworICBFcnJvciBnZXRSZWNvcmRzKFN0cmluZ1JlZiBGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxOYW1lZEluc3RyUHJvZlJlY29yZD4gJkRhdGEpIG92ZXJyaWRlOworICB2b2lkIGFkdmFuY2VUb05leHRLZXkoKSBvdmVycmlkZSB7IFJlY29yZEl0ZXJhdG9yKys7IH0KKworICBib29sIGF0RW5kKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBSZWNvcmRJdGVyYXRvciA9PSBIYXNoVGFibGUtPmRhdGFfZW5kKCk7CisgIH0KKworICB2b2lkIHNldFZhbHVlUHJvZkRhdGFFbmRpYW5uZXNzKHN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFubmVzcykgb3ZlcnJpZGUgeworICAgIEhhc2hUYWJsZS0+Z2V0SW5mb09iaigpLnNldFZhbHVlUHJvZkRhdGFFbmRpYW5uZXNzKEVuZGlhbm5lc3MpOworICB9CisKKyAgdWludDY0X3QgZ2V0VmVyc2lvbigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEdFVF9WRVJTSU9OKEZvcm1hdFZlcnNpb24pOyB9CisKKyAgYm9vbCBpc0lSTGV2ZWxQcm9maWxlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiAoRm9ybWF0VmVyc2lvbiAmIFZBUklBTlRfTUFTS19JUl9QUk9GKSAhPSAwOworICB9CisKKyAgRXJyb3IgcG9wdWxhdGVTeW10YWIoSW5zdHJQcm9mU3ltdGFiICZTeW10YWIpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gU3ltdGFiLmNyZWF0ZShIYXNoVGFibGUtPmtleXMoKSk7CisgIH0KK307CisKKy8vLyBSZWFkZXIgZm9yIHRoZSBpbmRleGVkIGJpbmFyeSBpbnN0cnByb2YgZm9ybWF0LgorY2xhc3MgSW5kZXhlZEluc3RyUHJvZlJlYWRlciA6IHB1YmxpYyBJbnN0clByb2ZSZWFkZXIgeworcHJpdmF0ZToKKyAgLy8vIFRoZSBwcm9maWxlIGRhdGEgZmlsZSBjb250ZW50cy4KKyAgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gRGF0YUJ1ZmZlcjsKKyAgLy8vIFRoZSBpbmRleCBpbnRvIHRoZSBwcm9maWxlIGRhdGEuCisgIHN0ZDo6dW5pcXVlX3B0cjxJbnN0clByb2ZSZWFkZXJJbmRleEJhc2U+IEluZGV4OworICAvLy8gUHJvZmlsZSBzdW1tYXJ5IGRhdGEuCisgIHN0ZDo6dW5pcXVlX3B0cjxQcm9maWxlU3VtbWFyeT4gU3VtbWFyeTsKKyAgLy8gSW5kZXggdG8gdGhlIGN1cnJlbnQgcmVjb3JkIGluIHRoZSByZWNvcmQgYXJyYXkuCisgIHVuc2lnbmVkIFJlY29yZEluZGV4OworCisgIC8vIFJlYWQgdGhlIHByb2ZpbGUgc3VtbWFyeS4gUmV0dXJuIGEgcG9pbnRlciBwb2ludGluZyB0byBvbmUgYnl0ZSBwYXN0IHRoZQorICAvLyBlbmQgb2YgdGhlIHN1bW1hcnkgZGF0YSBpZiBpdCBleGlzdHMgb3IgdGhlIGlucHV0IFxjIEN1ci4KKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVhZFN1bW1hcnkoSW5kZXhlZEluc3RyUHJvZjo6UHJvZlZlcnNpb24gVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqQ3VyKTsKKworcHVibGljOgorICBJbmRleGVkSW5zdHJQcm9mUmVhZGVyKHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IERhdGFCdWZmZXIpCisgICAgICA6IERhdGFCdWZmZXIoc3RkOjptb3ZlKERhdGFCdWZmZXIpKSwgUmVjb3JkSW5kZXgoMCkge30KKyAgSW5kZXhlZEluc3RyUHJvZlJlYWRlcihjb25zdCBJbmRleGVkSW5zdHJQcm9mUmVhZGVyICYpID0gZGVsZXRlOworICBJbmRleGVkSW5zdHJQcm9mUmVhZGVyICZvcGVyYXRvcj0oY29uc3QgSW5kZXhlZEluc3RyUHJvZlJlYWRlciAmKSA9IGRlbGV0ZTsKKworICAvLy8gUmV0dXJuIHRoZSBwcm9maWxlIHZlcnNpb24uCisgIHVpbnQ2NF90IGdldFZlcnNpb24oKSBjb25zdCB7IHJldHVybiBJbmRleC0+Z2V0VmVyc2lvbigpOyB9CisgIGJvb2wgaXNJUkxldmVsUHJvZmlsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEluZGV4LT5pc0lSTGV2ZWxQcm9maWxlKCk7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGJ1ZmZlciBpcyBpbiBhbiBpbmRleGVkIGluc3RycHJvZiBmb3JtYXQuCisgIHN0YXRpYyBib29sIGhhc0Zvcm1hdChjb25zdCBNZW1vcnlCdWZmZXIgJkRhdGFCdWZmZXIpOworCisgIC8vLyBSZWFkIHRoZSBmaWxlIGhlYWRlci4KKyAgRXJyb3IgcmVhZEhlYWRlcigpIG92ZXJyaWRlOworICAvLy8gUmVhZCBhIHNpbmdsZSByZWNvcmQuCisgIEVycm9yIHJlYWROZXh0UmVjb3JkKE5hbWVkSW5zdHJQcm9mUmVjb3JkICZSZWNvcmQpIG92ZXJyaWRlOworCisgIC8vLyBSZXR1cm4gdGhlIE5hbWVkSW5zdHJQcm9mUmVjb3JkIGFzc29jaWF0ZWQgd2l0aCBGdW5jTmFtZSBhbmQgRnVuY0hhc2gKKyAgRXhwZWN0ZWQ8SW5zdHJQcm9mUmVjb3JkPiBnZXRJbnN0clByb2ZSZWNvcmQoU3RyaW5nUmVmIEZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBGdW5jSGFzaCk7CisKKyAgLy8vIEZpbGwgQ291bnRzIHdpdGggdGhlIHByb2ZpbGUgZGF0YSBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uIG5hbWUuCisgIEVycm9yIGdldEZ1bmN0aW9uQ291bnRzKFN0cmluZ1JlZiBGdW5jTmFtZSwgdWludDY0X3QgRnVuY0hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmQ291bnRzKTsKKworICAvLy8gUmV0dXJuIHRoZSBtYXhpbXVtIG9mIGFsbCBrbm93biBmdW5jdGlvbiBjb3VudHMuCisgIHVpbnQ2NF90IGdldE1heGltdW1GdW5jdGlvbkNvdW50KCkgeyByZXR1cm4gU3VtbWFyeS0+Z2V0TWF4RnVuY3Rpb25Db3VudCgpOyB9CisKKyAgLy8vIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbiBpbmRleGVkIHJlYWRlci4KKyAgc3RhdGljIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxJbmRleGVkSW5zdHJQcm9mUmVhZGVyPj4KKyAgY3JlYXRlKGNvbnN0IFR3aW5lICZQYXRoKTsKKworICBzdGF0aWMgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPEluZGV4ZWRJbnN0clByb2ZSZWFkZXI+PgorICBjcmVhdGUoc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gQnVmZmVyKTsKKworICAvLyBVc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2Ugb25seS4KKyAgdm9pZCBzZXRWYWx1ZVByb2ZEYXRhRW5kaWFubmVzcyhzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbm5lc3MpIHsKKyAgICBJbmRleC0+c2V0VmFsdWVQcm9mRGF0YUVuZGlhbm5lc3MoRW5kaWFubmVzcyk7CisgIH0KKworICAvLyBTZWUgZGVzY3JpcHRpb24gaW4gdGhlIGJhc2UgY2xhc3MuIFRoaXMgaW50ZXJmYWNlIGlzIGRlc2lnbmVkCisgIC8vIHRvIGJlIHVzZWQgYnkgbGx2bS1wcm9mZGF0YSAoZm9yIGR1bXBpbmcpLiBBdm9pZCB1c2luZyB0aGlzIHdoZW4KKyAgLy8gdGhlIGNsaWVudCBpcyB0aGUgY29tcGlsZXIuCisgIEluc3RyUHJvZlN5bXRhYiAmZ2V0U3ltdGFiKCkgb3ZlcnJpZGU7CisgIFByb2ZpbGVTdW1tYXJ5ICZnZXRTdW1tYXJ5KCkgeyByZXR1cm4gKihTdW1tYXJ5LmdldCgpKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fUFJPRklMRURBVEFfSU5TVFJQUk9GUkVBREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mV3JpdGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZldyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMDdhYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZldyaXRlci5oCkBAIC0wLDAgKzEsMTAyIEBACisvLz09PS0gSW5zdHJQcm9mV3JpdGVyLmggLSBJbnN0cnVtZW50ZWQgcHJvZmlsaW5nIHdyaXRlciAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBzdXBwb3J0IGZvciB3cml0aW5nIHByb2ZpbGluZyBkYXRhIGZvciBpbnN0cnVtZW50YXRpb24KKy8vIGJhc2VkIFBHTyBhbmQgY292ZXJhZ2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1BST0ZJTEVEQVRBX0lOU1RSUFJPRldSSVRFUl9ICisjZGVmaW5lIExMVk1fUFJPRklMRURBVEFfSU5TVFJQUk9GV1JJVEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2YuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBXcml0ZXIgZm9yIGluc3RydW1lbnRhdGlvbiBiYXNlZCBwcm9maWxlIGRhdGEuCitjbGFzcyBJbnN0clByb2ZSZWNvcmRXcml0ZXJUcmFpdDsKK2NsYXNzIFByb2ZPU3RyZWFtOworY2xhc3MgcmF3X2ZkX29zdHJlYW07CisKK2NsYXNzIEluc3RyUHJvZldyaXRlciB7CitwdWJsaWM6CisgIHVzaW5nIFByb2ZpbGluZ0RhdGEgPSBTbWFsbERlbnNlTWFwPHVpbnQ2NF90LCBJbnN0clByb2ZSZWNvcmQ+OworICBlbnVtIFByb2ZLaW5kIHsgUEZfVW5rbm93biA9IDAsIFBGX0ZFLCBQRl9JUkxldmVsIH07CisKK3ByaXZhdGU6CisgIGJvb2wgU3BhcnNlOworICBTdHJpbmdNYXA8UHJvZmlsaW5nRGF0YT4gRnVuY3Rpb25EYXRhOworICBQcm9mS2luZCBQcm9maWxlS2luZCA9IFBGX1Vua25vd247CisgIC8vIFVzZSByYXcgcG9pbnRlciBoZXJlIGZvciB0aGUgaW5jb21wbGV0ZSB0eXBlIG9iamVjdC4KKyAgSW5zdHJQcm9mUmVjb3JkV3JpdGVyVHJhaXQgKkluZm9PYmo7CisKK3B1YmxpYzoKKyAgSW5zdHJQcm9mV3JpdGVyKGJvb2wgU3BhcnNlID0gZmFsc2UpOworICB+SW5zdHJQcm9mV3JpdGVyKCk7CisKKyAgLy8vIEFkZCBmdW5jdGlvbiBjb3VudHMgZm9yIHRoZSBnaXZlbiBmdW5jdGlvbi4gSWYgdGhlcmUgYXJlIGFscmVhZHkgY291bnRzCisgIC8vLyBmb3IgdGhpcyBmdW5jdGlvbiBhbmQgdGhlIGhhc2ggYW5kIG51bWJlciBvZiBjb3VudHMgbWF0Y2gsIGVhY2ggY291bnRlciBpcworICAvLy8gc3VtbWVkLiBPcHRpb25hbGx5IHNjYWxlIGNvdW50cyBieSBccCBXZWlnaHQuCisgIHZvaWQgYWRkUmVjb3JkKE5hbWVkSW5zdHJQcm9mUmVjb3JkICYmSSwgdWludDY0X3QgV2VpZ2h0LAorICAgICAgICAgICAgICAgICBmdW5jdGlvbl9yZWY8dm9pZChFcnJvcik+IFdhcm4pOworICB2b2lkIGFkZFJlY29yZChOYW1lZEluc3RyUHJvZlJlY29yZCAmJkksIGZ1bmN0aW9uX3JlZjx2b2lkKEVycm9yKT4gV2FybikgeworICAgIGFkZFJlY29yZChzdGQ6Om1vdmUoSSksIDEsIFdhcm4pOworICB9CisKKyAgLy8vIE1lcmdlIGV4aXN0aW5nIGZ1bmN0aW9uIGNvdW50cyBmcm9tIHRoZSBnaXZlbiB3cml0ZXIuCisgIHZvaWQgbWVyZ2VSZWNvcmRzRnJvbVdyaXRlcihJbnN0clByb2ZXcml0ZXIgJiZJUFcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9yZWY8dm9pZChFcnJvcik+IFdhcm4pOworCisgIC8vLyBXcml0ZSB0aGUgcHJvZmlsZSB0byBcYyBPUworICB2b2lkIHdyaXRlKHJhd19mZF9vc3RyZWFtICZPUyk7CisKKyAgLy8vIFdyaXRlIHRoZSBwcm9maWxlIGluIHRleHQgZm9ybWF0IHRvIFxjIE9TCisgIEVycm9yIHdyaXRlVGV4dChyYXdfZmRfb3N0cmVhbSAmT1MpOworCisgIC8vLyBXcml0ZSBcYyBSZWNvcmQgaW4gdGV4dCBmb3JtYXQgdG8gXGMgT1MKKyAgc3RhdGljIHZvaWQgd3JpdGVSZWNvcmRJblRleHQoU3RyaW5nUmVmIE5hbWUsIHVpbnQ2NF90IEhhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RyUHJvZlJlY29yZCAmQ291bnRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyUHJvZlN5bXRhYiAmU3ltdGFiLCByYXdfZmRfb3N0cmVhbSAmT1MpOworCisgIC8vLyBXcml0ZSB0aGUgcHJvZmlsZSwgcmV0dXJuaW5nIHRoZSByYXcgZGF0YS4gRm9yIHRlc3RpbmcuCisgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IHdyaXRlQnVmZmVyKCk7CisKKyAgLy8vIFNldCB0aGUgUHJvZmlsZUtpbmQuIFJlcG9ydCBlcnJvciBpZiBtaXhpbmcgRkUgYW5kIElSIGxldmVsIHByb2ZpbGVzLgorICBFcnJvciBzZXRJc0lSTGV2ZWxQcm9maWxlKGJvb2wgSXNJUkxldmVsKSB7CisgICAgaWYgKFByb2ZpbGVLaW5kID09IFBGX1Vua25vd24pIHsKKyAgICAgIFByb2ZpbGVLaW5kID0gSXNJUkxldmVsID8gUEZfSVJMZXZlbDogUEZfRkU7CisgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICB9CisgICAgcmV0dXJuIChJc0lSTGV2ZWwgPT0gKFByb2ZpbGVLaW5kID09IFBGX0lSTGV2ZWwpKQorICAgICAgICAgICAgICAgPyBFcnJvcjo6c3VjY2VzcygpCisgICAgICAgICAgICAgICA6IG1ha2VfZXJyb3I8SW5zdHJQcm9mRXJyb3I+KAorICAgICAgICAgICAgICAgICAgICAgaW5zdHJwcm9mX2Vycm9yOjp1bnN1cHBvcnRlZF92ZXJzaW9uKTsKKyAgfQorCisgIC8vIEludGVybmFsIGludGVyZmFjZSBmb3IgdGVzdGluZyBwdXJwb3NlIG9ubHkuCisgIHZvaWQgc2V0VmFsdWVQcm9mRGF0YUVuZGlhbm5lc3Moc3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW5uZXNzKTsKKyAgdm9pZCBzZXRPdXRwdXRTcGFyc2UoYm9vbCBTcGFyc2UpOworCitwcml2YXRlOgorICB2b2lkIGFkZFJlY29yZChTdHJpbmdSZWYgTmFtZSwgdWludDY0X3QgSGFzaCwgSW5zdHJQcm9mUmVjb3JkICYmSSwKKyAgICAgICAgICAgICAgICAgdWludDY0X3QgV2VpZ2h0LCBmdW5jdGlvbl9yZWY8dm9pZChFcnJvcik+IFdhcm4pOworICBib29sIHNob3VsZEVuY29kZURhdGEoY29uc3QgUHJvZmlsaW5nRGF0YSAmUEQpOworICB2b2lkIHdyaXRlSW1wbChQcm9mT1N0cmVhbSAmT1MpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fUFJPRklMRURBVEFfSU5TVFJQUk9GV1JJVEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvUHJvZmlsZUNvbW1vbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9Qcm9maWxlQ29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiMDY1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvUHJvZmlsZUNvbW1vbi5oCkBAIC0wLDAgKzEsMTAyIEBACisvLz09PS0gUHJvZmlsZUNvbW1vbi5oIC0gQ29tbW9uIHByb2ZpbGluZyBBUElzLiAtLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyBjb21tb24gdG8gYm90aCBpbnN0cnVtZW50ZWQKKy8vIGFuZCBzYW1wbGUgcHJvZmlsaW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9QUk9GSUxFREFUQV9QUk9GSUxFQ09NTU9OX0gKKyNkZWZpbmUgTExWTV9QUk9GSUxFREFUQV9QUk9GSUxFQ09NTU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Qcm9maWxlU3VtbWFyeS5oIgorI2luY2x1ZGUgImxsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2Ugc2FtcGxlcHJvZiB7CisKK2NsYXNzIEZ1bmN0aW9uU2FtcGxlczsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHNhbXBsZXByb2YKKworaW5saW5lIGNvbnN0IGNoYXIgKmdldEhvdFNlY3Rpb25QcmVmaXgoKSB7IHJldHVybiAiLmhvdCI7IH0KK2lubGluZSBjb25zdCBjaGFyICpnZXRVbmxpa2VseVNlY3Rpb25QcmVmaXgoKSB7IHJldHVybiAiLnVubGlrZWx5IjsgfQorCitjbGFzcyBQcm9maWxlU3VtbWFyeUJ1aWxkZXIgeworcHJpdmF0ZToKKyAgLy8vIFdlIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiB0aW1lcyBhIGNvdW50IChibG9jayBjb3VudCBvciBzYW1wbGVzKQorICAvLy8gYXBwZWFycyBpbiB0aGUgcHJvZmlsZS4gVGhlIG1hcCBpcyBrZXB0IHNvcnRlZCBpbiB0aGUgZGVzY2VuZGluZyBvcmRlciBvZgorICAvLy8gY291bnRzLgorICBzdGQ6Om1hcDx1aW50NjRfdCwgdWludDMyX3QsIHN0ZDo6Z3JlYXRlcjx1aW50NjRfdD4+IENvdW50RnJlcXVlbmNpZXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBEZXRhaWxlZFN1bW1hcnlDdXRvZmZzOworCitwcm90ZWN0ZWQ6CisgIFN1bW1hcnlFbnRyeVZlY3RvciBEZXRhaWxlZFN1bW1hcnk7CisgIHVpbnQ2NF90IFRvdGFsQ291bnQgPSAwOworICB1aW50NjRfdCBNYXhDb3VudCA9IDA7CisgIHVpbnQ2NF90IE1heEZ1bmN0aW9uQ291bnQgPSAwOworICB1aW50MzJfdCBOdW1Db3VudHMgPSAwOworICB1aW50MzJfdCBOdW1GdW5jdGlvbnMgPSAwOworCisgIFByb2ZpbGVTdW1tYXJ5QnVpbGRlcihzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gQ3V0b2ZmcykKKyAgICAgIDogRGV0YWlsZWRTdW1tYXJ5Q3V0b2ZmcyhzdGQ6Om1vdmUoQ3V0b2ZmcykpIHt9CisgIH5Qcm9maWxlU3VtbWFyeUJ1aWxkZXIoKSA9IGRlZmF1bHQ7CisKKyAgaW5saW5lIHZvaWQgYWRkQ291bnQodWludDY0X3QgQ291bnQpOworICB2b2lkIGNvbXB1dGVEZXRhaWxlZFN1bW1hcnkoKTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIEEgdmVjdG9yIG9mIHVzZWZ1bCBjdXRvZmYgdmFsdWVzIGZvciBkZXRhaWxlZCBzdW1tYXJ5LgorICBzdGF0aWMgY29uc3QgQXJyYXlSZWY8dWludDMyX3Q+IERlZmF1bHRDdXRvZmZzOworfTsKKworY2xhc3MgSW5zdHJQcm9mU3VtbWFyeUJ1aWxkZXIgZmluYWwgOiBwdWJsaWMgUHJvZmlsZVN1bW1hcnlCdWlsZGVyIHsKKyAgdWludDY0X3QgTWF4SW50ZXJuYWxCbG9ja0NvdW50ID0gMDsKKworICBpbmxpbmUgdm9pZCBhZGRFbnRyeUNvdW50KHVpbnQ2NF90IENvdW50KTsKKyAgaW5saW5lIHZvaWQgYWRkSW50ZXJuYWxDb3VudCh1aW50NjRfdCBDb3VudCk7CisKK3B1YmxpYzoKKyAgSW5zdHJQcm9mU3VtbWFyeUJ1aWxkZXIoc3RkOjp2ZWN0b3I8dWludDMyX3Q+IEN1dG9mZnMpCisgICAgICA6IFByb2ZpbGVTdW1tYXJ5QnVpbGRlcihzdGQ6Om1vdmUoQ3V0b2ZmcykpIHt9CisKKyAgdm9pZCBhZGRSZWNvcmQoY29uc3QgSW5zdHJQcm9mUmVjb3JkICYpOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJvZmlsZVN1bW1hcnk+IGdldFN1bW1hcnkoKTsKK307CisKK2NsYXNzIFNhbXBsZVByb2ZpbGVTdW1tYXJ5QnVpbGRlciBmaW5hbCA6IHB1YmxpYyBQcm9maWxlU3VtbWFyeUJ1aWxkZXIgeworcHVibGljOgorICBTYW1wbGVQcm9maWxlU3VtbWFyeUJ1aWxkZXIoc3RkOjp2ZWN0b3I8dWludDMyX3Q+IEN1dG9mZnMpCisgICAgICA6IFByb2ZpbGVTdW1tYXJ5QnVpbGRlcihzdGQ6Om1vdmUoQ3V0b2ZmcykpIHt9CisKKyAgdm9pZCBhZGRSZWNvcmQoY29uc3Qgc2FtcGxlcHJvZjo6RnVuY3Rpb25TYW1wbGVzICZGUyk7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcm9maWxlU3VtbWFyeT4gZ2V0U3VtbWFyeSgpOworfTsKKworLy8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBjb3VudCBpcyBzZWVuIGluIHRoZSBwcm9maWxlLgordm9pZCBQcm9maWxlU3VtbWFyeUJ1aWxkZXI6OmFkZENvdW50KHVpbnQ2NF90IENvdW50KSB7CisgIFRvdGFsQ291bnQgKz0gQ291bnQ7CisgIGlmIChDb3VudCA+IE1heENvdW50KQorICAgIE1heENvdW50ID0gQ291bnQ7CisgIE51bUNvdW50cysrOworICBDb3VudEZyZXF1ZW5jaWVzW0NvdW50XSsrOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9QUk9GSUxFREFUQV9QUk9GSUxFQ09NTU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvU2FtcGxlUHJvZi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9TYW1wbGVQcm9mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5ZWYzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvU2FtcGxlUHJvZi5oCkBAIC0wLDAgKzEsNDcxIEBACisvLz09PS0gU2FtcGxlUHJvZi5oIC0gU2FtcGxpbmcgcHJvZmlsaW5nIGZvcm1hdCBzdXBwb3J0IC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBjb21tb24gZGVmaW5pdGlvbnMgdXNlZCBpbiB0aGUgcmVhZGluZyBhbmQgd3JpdGluZyBvZgorLy8gc2FtcGxlIHByb2ZpbGUgZGF0YS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fUFJPRklMRURBVEFfU0FNUExFUFJPRl9ICisjZGVmaW5lIExMVk1fUFJPRklMRURBVEFfU0FNUExFUFJPRl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvck9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCitjb25zdCBzdGQ6OmVycm9yX2NhdGVnb3J5ICZzYW1wbGVwcm9mX2NhdGVnb3J5KCk7CisKK2VudW0gY2xhc3Mgc2FtcGxlcHJvZl9lcnJvciB7CisgIHN1Y2Nlc3MgPSAwLAorICBiYWRfbWFnaWMsCisgIHVuc3VwcG9ydGVkX3ZlcnNpb24sCisgIHRvb19sYXJnZSwKKyAgdHJ1bmNhdGVkLAorICBtYWxmb3JtZWQsCisgIHVucmVjb2duaXplZF9mb3JtYXQsCisgIHVuc3VwcG9ydGVkX3dyaXRpbmdfZm9ybWF0LAorICB0cnVuY2F0ZWRfbmFtZV90YWJsZSwKKyAgbm90X2ltcGxlbWVudGVkLAorICBjb3VudGVyX292ZXJmbG93Cit9OworCitpbmxpbmUgc3RkOjplcnJvcl9jb2RlIG1ha2VfZXJyb3JfY29kZShzYW1wbGVwcm9mX2Vycm9yIEUpIHsKKyAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZShzdGF0aWNfY2FzdDxpbnQ+KEUpLCBzYW1wbGVwcm9mX2NhdGVnb3J5KCkpOworfQorCitpbmxpbmUgc2FtcGxlcHJvZl9lcnJvciBNZXJnZVJlc3VsdChzYW1wbGVwcm9mX2Vycm9yICZBY2N1bXVsYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXByb2ZfZXJyb3IgUmVzdWx0KSB7CisgIC8vIFByZWZlciBmaXJzdCBlcnJvciBlbmNvdW50ZXJlZCBhcyBsYXRlciBlcnJvcnMgbWF5IGJlIHNlY29uZGFyeSBlZmZlY3RzIG9mCisgIC8vIHRoZSBpbml0aWFsIHByb2JsZW0uCisgIGlmIChBY2N1bXVsYXRvciA9PSBzYW1wbGVwcm9mX2Vycm9yOjpzdWNjZXNzICYmCisgICAgICBSZXN1bHQgIT0gc2FtcGxlcHJvZl9lcnJvcjo6c3VjY2VzcykKKyAgICBBY2N1bXVsYXRvciA9IFJlc3VsdDsKKyAgcmV0dXJuIEFjY3VtdWxhdG9yOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCituYW1lc3BhY2Ugc3RkIHsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBpc19lcnJvcl9jb2RlX2VudW08bGx2bTo6c2FtcGxlcHJvZl9lcnJvcj4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHN0ZAorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugc2FtcGxlcHJvZiB7CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgU1BNYWdpYygpIHsKKyAgcmV0dXJuIHVpbnQ2NF90KCdTJykgPDwgKDY0IC0gOCkgfCB1aW50NjRfdCgnUCcpIDw8ICg2NCAtIDE2KSB8CisgICAgICAgICB1aW50NjRfdCgnUicpIDw8ICg2NCAtIDI0KSB8IHVpbnQ2NF90KCdPJykgPDwgKDY0IC0gMzIpIHwKKyAgICAgICAgIHVpbnQ2NF90KCdGJykgPDwgKDY0IC0gNDApIHwgdWludDY0X3QoJzQnKSA8PCAoNjQgLSA0OCkgfAorICAgICAgICAgdWludDY0X3QoJzInKSA8PCAoNjQgLSA1NikgfCB1aW50NjRfdCgweGZmKTsKK30KKworc3RhdGljIGlubGluZSB1aW50NjRfdCBTUFZlcnNpb24oKSB7IHJldHVybiAxMDM7IH0KKworLy8vIFJlcHJlc2VudHMgdGhlIHJlbGF0aXZlIGxvY2F0aW9uIG9mIGFuIGluc3RydWN0aW9uLgorLy8vCisvLy8gSW5zdHJ1Y3Rpb24gbG9jYXRpb25zIGFyZSBzcGVjaWZpZWQgYnkgdGhlIGxpbmUgb2Zmc2V0IGZyb20gdGhlCisvLy8gYmVnaW5uaW5nIG9mIHRoZSBmdW5jdGlvbiAobWFya2VkIGJ5IHRoZSBsaW5lIHdoZXJlIHRoZSBmdW5jdGlvbgorLy8vIGhlYWRlciBpcykgYW5kIHRoZSBkaXNjcmltaW5hdG9yIHZhbHVlIHdpdGhpbiB0aGF0IGxpbmUuCisvLy8KKy8vLyBUaGUgZGlzY3JpbWluYXRvciB2YWx1ZSBpcyB1c2VmdWwgdG8gZGlzdGluZ3Vpc2ggaW5zdHJ1Y3Rpb25zCisvLy8gdGhhdCBhcmUgb24gdGhlIHNhbWUgbGluZSBidXQgYmVsb25nIHRvIGRpZmZlcmVudCBiYXNpYyBibG9ja3MKKy8vLyAoZS5nLiwgdGhlIHR3byBwb3N0LWluY3JlbWVudCBpbnN0cnVjdGlvbnMgaW4gImlmIChwKSB4Kys7IGVsc2UgeSsrOyIpLgorc3RydWN0IExpbmVMb2NhdGlvbiB7CisgIExpbmVMb2NhdGlvbih1aW50MzJfdCBMLCB1aW50MzJfdCBEKSA6IExpbmVPZmZzZXQoTCksIERpc2NyaW1pbmF0b3IoRCkge30KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IExpbmVMb2NhdGlvbiAmTykgY29uc3QgeworICAgIHJldHVybiBMaW5lT2Zmc2V0IDwgTy5MaW5lT2Zmc2V0IHx8CisgICAgICAgICAgIChMaW5lT2Zmc2V0ID09IE8uTGluZU9mZnNldCAmJiBEaXNjcmltaW5hdG9yIDwgTy5EaXNjcmltaW5hdG9yKTsKKyAgfQorCisgIHVpbnQzMl90IExpbmVPZmZzZXQ7CisgIHVpbnQzMl90IERpc2NyaW1pbmF0b3I7Cit9OworCityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IExpbmVMb2NhdGlvbiAmTG9jKTsKKworLy8vIFJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIHNhbXBsZSByZWNvcmQuCisvLy8KKy8vLyBBIHNhbXBsZSByZWNvcmQgaXMgcmVwcmVzZW50ZWQgYnkgYSBwb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlLCB3aGljaAorLy8vIGluZGljYXRlcyBob3cgZnJlcXVlbnRseSB3YXMgdGhlIGFzc29jaWF0ZWQgbGluZSBsb2NhdGlvbiBleGVjdXRlZC4KKy8vLworLy8vIEFkZGl0aW9uYWxseSwgaWYgdGhlIGFzc29jaWF0ZWQgbG9jYXRpb24gY29udGFpbnMgYSBmdW5jdGlvbiBjYWxsLAorLy8vIHRoZSByZWNvcmQgd2lsbCBob2xkIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGNhbGxlZCB0YXJnZXRzLiBGb3IKKy8vLyBkaXJlY3QgY2FsbHMsIHRoaXMgd2lsbCBiZSB0aGUgZXhhY3QgZnVuY3Rpb24gYmVpbmcgaW52b2tlZC4gRm9yCisvLy8gaW5kaXJlY3QgY2FsbHMgKGZ1bmN0aW9uIHBvaW50ZXJzLCB2aXJ0dWFsIHRhYmxlIGRpc3BhdGNoKSwgdGhpcworLy8vIHdpbGwgYmUgYSBsaXN0IG9mIG9uZSBvciBtb3JlIGZ1bmN0aW9ucy4KK2NsYXNzIFNhbXBsZVJlY29yZCB7CitwdWJsaWM6CisgIHVzaW5nIENhbGxUYXJnZXRNYXAgPSBTdHJpbmdNYXA8dWludDY0X3Q+OworCisgIFNhbXBsZVJlY29yZCgpID0gZGVmYXVsdDsKKworICAvLy8gSW5jcmVtZW50IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBmb3IgdGhpcyByZWNvcmQgYnkgXHAgUy4KKyAgLy8vIE9wdGlvbmFsbHkgc2NhbGUgc2FtcGxlIGNvdW50IFxwIFMgYnkgXHAgV2VpZ2h0LgorICAvLy8KKyAgLy8vIFNhbXBsZSBjb3VudHMgYWNjdW11bGF0ZSB1c2luZyBzYXR1cmF0aW5nIGFyaXRobWV0aWMsIHRvIGF2b2lkIHdyYXBwaW5nCisgIC8vLyBhcm91bmQgdW5zaWduZWQgaW50ZWdlcnMuCisgIHNhbXBsZXByb2ZfZXJyb3IgYWRkU2FtcGxlcyh1aW50NjRfdCBTLCB1aW50NjRfdCBXZWlnaHQgPSAxKSB7CisgICAgYm9vbCBPdmVyZmxvd2VkOworICAgIE51bVNhbXBsZXMgPSBTYXR1cmF0aW5nTXVsdGlwbHlBZGQoUywgV2VpZ2h0LCBOdW1TYW1wbGVzLCAmT3ZlcmZsb3dlZCk7CisgICAgcmV0dXJuIE92ZXJmbG93ZWQgPyBzYW1wbGVwcm9mX2Vycm9yOjpjb3VudGVyX292ZXJmbG93CisgICAgICAgICAgICAgICAgICAgICAgOiBzYW1wbGVwcm9mX2Vycm9yOjpzdWNjZXNzOworICB9CisKKyAgLy8vIEFkZCBjYWxsZWQgZnVuY3Rpb24gXHAgRiB3aXRoIHNhbXBsZXMgXHAgUy4KKyAgLy8vIE9wdGlvbmFsbHkgc2NhbGUgc2FtcGxlIGNvdW50IFxwIFMgYnkgXHAgV2VpZ2h0LgorICAvLy8KKyAgLy8vIFNhbXBsZSBjb3VudHMgYWNjdW11bGF0ZSB1c2luZyBzYXR1cmF0aW5nIGFyaXRobWV0aWMsIHRvIGF2b2lkIHdyYXBwaW5nCisgIC8vLyBhcm91bmQgdW5zaWduZWQgaW50ZWdlcnMuCisgIHNhbXBsZXByb2ZfZXJyb3IgYWRkQ2FsbGVkVGFyZ2V0KFN0cmluZ1JlZiBGLCB1aW50NjRfdCBTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBXZWlnaHQgPSAxKSB7CisgICAgdWludDY0X3QgJlRhcmdldFNhbXBsZXMgPSBDYWxsVGFyZ2V0c1tGXTsKKyAgICBib29sIE92ZXJmbG93ZWQ7CisgICAgVGFyZ2V0U2FtcGxlcyA9CisgICAgICAgIFNhdHVyYXRpbmdNdWx0aXBseUFkZChTLCBXZWlnaHQsIFRhcmdldFNhbXBsZXMsICZPdmVyZmxvd2VkKTsKKyAgICByZXR1cm4gT3ZlcmZsb3dlZCA/IHNhbXBsZXByb2ZfZXJyb3I6OmNvdW50ZXJfb3ZlcmZsb3cKKyAgICAgICAgICAgICAgICAgICAgICA6IHNhbXBsZXByb2ZfZXJyb3I6OnN1Y2Nlc3M7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBzYW1wbGUgcmVjb3JkIGNvbnRhaW5zIGZ1bmN0aW9uIGNhbGxzLgorICBib29sIGhhc0NhbGxzKCkgY29uc3QgeyByZXR1cm4gIUNhbGxUYXJnZXRzLmVtcHR5KCk7IH0KKworICB1aW50NjRfdCBnZXRTYW1wbGVzKCkgY29uc3QgeyByZXR1cm4gTnVtU2FtcGxlczsgfQorICBjb25zdCBDYWxsVGFyZ2V0TWFwICZnZXRDYWxsVGFyZ2V0cygpIGNvbnN0IHsgcmV0dXJuIENhbGxUYXJnZXRzOyB9CisKKyAgLy8vIE1lcmdlIHRoZSBzYW1wbGVzIGluIFxwIE90aGVyIGludG8gdGhpcyByZWNvcmQuCisgIC8vLyBPcHRpb25hbGx5IHNjYWxlIHNhbXBsZSBjb3VudHMgYnkgXHAgV2VpZ2h0LgorICBzYW1wbGVwcm9mX2Vycm9yIG1lcmdlKGNvbnN0IFNhbXBsZVJlY29yZCAmT3RoZXIsIHVpbnQ2NF90IFdlaWdodCA9IDEpIHsKKyAgICBzYW1wbGVwcm9mX2Vycm9yIFJlc3VsdCA9IGFkZFNhbXBsZXMoT3RoZXIuZ2V0U2FtcGxlcygpLCBXZWlnaHQpOworICAgIGZvciAoY29uc3QgYXV0byAmSSA6IE90aGVyLmdldENhbGxUYXJnZXRzKCkpIHsKKyAgICAgIE1lcmdlUmVzdWx0KFJlc3VsdCwgYWRkQ2FsbGVkVGFyZ2V0KEkuZmlyc3QoKSwgSS5zZWNvbmQsIFdlaWdodCkpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIEluZGVudCkgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworCitwcml2YXRlOgorICB1aW50NjRfdCBOdW1TYW1wbGVzID0gMDsKKyAgQ2FsbFRhcmdldE1hcCBDYWxsVGFyZ2V0czsKK307CisKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgU2FtcGxlUmVjb3JkICZTYW1wbGUpOworCitjbGFzcyBGdW5jdGlvblNhbXBsZXM7CisKK3VzaW5nIEJvZHlTYW1wbGVNYXAgPSBzdGQ6Om1hcDxMaW5lTG9jYXRpb24sIFNhbXBsZVJlY29yZD47CisvLyBOT1RFOiBVc2luZyBhIFN0cmluZ01hcCBoZXJlIG1ha2VzIHBhcnNlZCBwcm9maWxlcyBjb25zdW1lIGFyb3VuZCAxNyUgbW9yZQorLy8gbWVtb3J5LCB3aGljaCBpcyAqdmVyeSogc2lnbmlmaWNhbnQgZm9yIGxhcmdlIHByb2ZpbGVzLgordXNpbmcgRnVuY3Rpb25TYW1wbGVzTWFwID0gc3RkOjptYXA8c3RkOjpzdHJpbmcsIEZ1bmN0aW9uU2FtcGxlcz47Cit1c2luZyBDYWxsc2l0ZVNhbXBsZU1hcCA9IHN0ZDo6bWFwPExpbmVMb2NhdGlvbiwgRnVuY3Rpb25TYW1wbGVzTWFwPjsKKworLy8vIFJlcHJlc2VudGF0aW9uIG9mIHRoZSBzYW1wbGVzIGNvbGxlY3RlZCBmb3IgYSBmdW5jdGlvbi4KKy8vLworLy8vIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbnMgYWxsIHRoZSBjb2xsZWN0ZWQgc2FtcGxlcyBmb3IgdGhlIGJvZHkKKy8vLyBvZiBhIGZ1bmN0aW9uLiBFYWNoIHNhbXBsZSBjb3JyZXNwb25kcyB0byBhIExpbmVMb2NhdGlvbiBpbnN0YW5jZQorLy8vIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24uCitjbGFzcyBGdW5jdGlvblNhbXBsZXMgeworcHVibGljOgorICBGdW5jdGlvblNhbXBsZXMoKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MgPSBkYmdzKCksIHVuc2lnbmVkIEluZGVudCA9IDApIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICBzYW1wbGVwcm9mX2Vycm9yIGFkZFRvdGFsU2FtcGxlcyh1aW50NjRfdCBOdW0sIHVpbnQ2NF90IFdlaWdodCA9IDEpIHsKKyAgICBib29sIE92ZXJmbG93ZWQ7CisgICAgVG90YWxTYW1wbGVzID0KKyAgICAgICAgU2F0dXJhdGluZ011bHRpcGx5QWRkKE51bSwgV2VpZ2h0LCBUb3RhbFNhbXBsZXMsICZPdmVyZmxvd2VkKTsKKyAgICByZXR1cm4gT3ZlcmZsb3dlZCA/IHNhbXBsZXByb2ZfZXJyb3I6OmNvdW50ZXJfb3ZlcmZsb3cKKyAgICAgICAgICAgICAgICAgICAgICA6IHNhbXBsZXByb2ZfZXJyb3I6OnN1Y2Nlc3M7CisgIH0KKworICBzYW1wbGVwcm9mX2Vycm9yIGFkZEhlYWRTYW1wbGVzKHVpbnQ2NF90IE51bSwgdWludDY0X3QgV2VpZ2h0ID0gMSkgeworICAgIGJvb2wgT3ZlcmZsb3dlZDsKKyAgICBUb3RhbEhlYWRTYW1wbGVzID0KKyAgICAgICAgU2F0dXJhdGluZ011bHRpcGx5QWRkKE51bSwgV2VpZ2h0LCBUb3RhbEhlYWRTYW1wbGVzLCAmT3ZlcmZsb3dlZCk7CisgICAgcmV0dXJuIE92ZXJmbG93ZWQgPyBzYW1wbGVwcm9mX2Vycm9yOjpjb3VudGVyX292ZXJmbG93CisgICAgICAgICAgICAgICAgICAgICAgOiBzYW1wbGVwcm9mX2Vycm9yOjpzdWNjZXNzOworICB9CisKKyAgc2FtcGxlcHJvZl9lcnJvciBhZGRCb2R5U2FtcGxlcyh1aW50MzJfdCBMaW5lT2Zmc2V0LCB1aW50MzJfdCBEaXNjcmltaW5hdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE51bSwgdWludDY0X3QgV2VpZ2h0ID0gMSkgeworICAgIHJldHVybiBCb2R5U2FtcGxlc1tMaW5lTG9jYXRpb24oTGluZU9mZnNldCwgRGlzY3JpbWluYXRvcildLmFkZFNhbXBsZXMoCisgICAgICAgIE51bSwgV2VpZ2h0KTsKKyAgfQorCisgIHNhbXBsZXByb2ZfZXJyb3IgYWRkQ2FsbGVkVGFyZ2V0U2FtcGxlcyh1aW50MzJfdCBMaW5lT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGlzY3JpbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGTmFtZSwgdWludDY0X3QgTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgV2VpZ2h0ID0gMSkgeworICAgIHJldHVybiBCb2R5U2FtcGxlc1tMaW5lTG9jYXRpb24oTGluZU9mZnNldCwgRGlzY3JpbWluYXRvcildLmFkZENhbGxlZFRhcmdldCgKKyAgICAgICAgRk5hbWUsIE51bSwgV2VpZ2h0KTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIGNvbGxlY3RlZCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24uCisgIC8vLyBFYWNoIGxvY2F0aW9uIGlzIHNwZWNpZmllZCBieSBccCBMaW5lT2Zmc2V0IGFuZCBccCBEaXNjcmltaW5hdG9yLgorICAvLy8gSWYgdGhlIGxvY2F0aW9uIGlzIG5vdCBmb3VuZCBpbiBwcm9maWxlLCByZXR1cm4gZXJyb3IuCisgIEVycm9yT3I8dWludDY0X3Q+IGZpbmRTYW1wbGVzQXQodWludDMyX3QgTGluZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEaXNjcmltaW5hdG9yKSBjb25zdCB7CisgICAgY29uc3QgYXV0byAmcmV0ID0gQm9keVNhbXBsZXMuZmluZChMaW5lTG9jYXRpb24oTGluZU9mZnNldCwgRGlzY3JpbWluYXRvcikpOworICAgIGlmIChyZXQgPT0gQm9keVNhbXBsZXMuZW5kKCkpCisgICAgICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHJldC0+c2Vjb25kLmdldFNhbXBsZXMoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBjYWxsIHRhcmdldCBtYXAgY29sbGVjdGVkIGF0IGEgZ2l2ZW4gbG9jYXRpb24uCisgIC8vLyBFYWNoIGxvY2F0aW9uIGlzIHNwZWNpZmllZCBieSBccCBMaW5lT2Zmc2V0IGFuZCBccCBEaXNjcmltaW5hdG9yLgorICAvLy8gSWYgdGhlIGxvY2F0aW9uIGlzIG5vdCBmb3VuZCBpbiBwcm9maWxlLCByZXR1cm4gZXJyb3IuCisgIEVycm9yT3I8U2FtcGxlUmVjb3JkOjpDYWxsVGFyZ2V0TWFwPgorICBmaW5kQ2FsbFRhcmdldE1hcEF0KHVpbnQzMl90IExpbmVPZmZzZXQsIHVpbnQzMl90IERpc2NyaW1pbmF0b3IpIGNvbnN0IHsKKyAgICBjb25zdCBhdXRvICZyZXQgPSBCb2R5U2FtcGxlcy5maW5kKExpbmVMb2NhdGlvbihMaW5lT2Zmc2V0LCBEaXNjcmltaW5hdG9yKSk7CisgICAgaWYgKHJldCA9PSBCb2R5U2FtcGxlcy5lbmQoKSkKKyAgICAgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKKyAgICByZXR1cm4gcmV0LT5zZWNvbmQuZ2V0Q2FsbFRhcmdldHMoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGZ1bmN0aW9uIHNhbXBsZXMgYXQgdGhlIGdpdmVuIGNhbGxzaXRlIGxvY2F0aW9uLgorICBGdW5jdGlvblNhbXBsZXNNYXAgJmZ1bmN0aW9uU2FtcGxlc0F0KGNvbnN0IExpbmVMb2NhdGlvbiAmTG9jKSB7CisgICAgcmV0dXJuIENhbGxzaXRlU2FtcGxlc1tMb2NdOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIEZ1bmN0aW9uU2FtcGxlc01hcCBhdCB0aGUgZ2l2ZW4gXHAgTG9jLgorICBjb25zdCBGdW5jdGlvblNhbXBsZXNNYXAgKgorICBmaW5kRnVuY3Rpb25TYW1wbGVzTWFwQXQoY29uc3QgTGluZUxvY2F0aW9uICZMb2MpIGNvbnN0IHsKKyAgICBhdXRvIGl0ZXIgPSBDYWxsc2l0ZVNhbXBsZXMuZmluZChMb2MpOworICAgIGlmIChpdGVyID09IENhbGxzaXRlU2FtcGxlcy5lbmQoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiAmaXRlci0+c2Vjb25kOworICB9CisKKyAgLy8vIFJldHVybnMgYSBwb2ludGVyIHRvIEZ1bmN0aW9uU2FtcGxlcyBhdCB0aGUgZ2l2ZW4gY2FsbHNpdGUgbG9jYXRpb24gXHAgTG9jCisgIC8vLyB3aXRoIGNhbGxlZSBccCBDYWxsZWVOYW1lLiBJZiBubyBjYWxsc2l0ZSBjYW4gYmUgZm91bmQsIHJlbGF4IHRoZQorICAvLy8gcmVzdHJpY3Rpb24gdG8gcmV0dXJuIHRoZSBGdW5jdGlvblNhbXBsZXMgYXQgY2FsbHNpdGUgbG9jYXRpb24gXHAgTG9jCisgIC8vLyB3aXRoIHRoZSBtYXhpbXVtIHRvdGFsIHNhbXBsZSBjb3VudC4KKyAgY29uc3QgRnVuY3Rpb25TYW1wbGVzICpmaW5kRnVuY3Rpb25TYW1wbGVzQXQoY29uc3QgTGluZUxvY2F0aW9uICZMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDYWxsZWVOYW1lKSBjb25zdCB7CisgICAgYXV0byBpdGVyID0gQ2FsbHNpdGVTYW1wbGVzLmZpbmQoTG9jKTsKKyAgICBpZiAoaXRlciA9PSBDYWxsc2l0ZVNhbXBsZXMuZW5kKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBhdXRvIEZTID0gaXRlci0+c2Vjb25kLmZpbmQoQ2FsbGVlTmFtZSk7CisgICAgaWYgKEZTICE9IGl0ZXItPnNlY29uZC5lbmQoKSkKKyAgICAgIHJldHVybiAmRlMtPnNlY29uZDsKKyAgICAvLyBJZiB3ZSBjYW5ub3QgZmluZCBleGFjdCBtYXRjaCBvZiB0aGUgY2FsbGVlIG5hbWUsIHJldHVybiB0aGUgRlMgd2l0aAorICAgIC8vIHRoZSBtYXggdG90YWwgY291bnQuCisgICAgdWludDY0X3QgTWF4VG90YWxTYW1wbGVzID0gMDsKKyAgICBjb25zdCBGdW5jdGlvblNhbXBsZXMgKlIgPSBudWxscHRyOworICAgIGZvciAoY29uc3QgYXV0byAmTmFtZUZTIDogaXRlci0+c2Vjb25kKQorICAgICAgaWYgKE5hbWVGUy5zZWNvbmQuZ2V0VG90YWxTYW1wbGVzKCkgPj0gTWF4VG90YWxTYW1wbGVzKSB7CisgICAgICAgIE1heFRvdGFsU2FtcGxlcyA9IE5hbWVGUy5zZWNvbmQuZ2V0VG90YWxTYW1wbGVzKCk7CisgICAgICAgIFIgPSAmTmFtZUZTLnNlY29uZDsKKyAgICAgIH0KKyAgICByZXR1cm4gUjsKKyAgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBUb3RhbFNhbXBsZXMgPT0gMDsgfQorCisgIC8vLyBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzIGNvbGxlY3RlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLgorICB1aW50NjRfdCBnZXRUb3RhbFNhbXBsZXMoKSBjb25zdCB7IHJldHVybiBUb3RhbFNhbXBsZXM7IH0KKworICAvLy8gUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgYnJhbmNoIHNhbXBsZXMgdGhhdCBoYXZlIHRoZSBmdW5jdGlvbiBhcyB0aGUKKyAgLy8vIGJyYW5jaCB0YXJnZXQuIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gdGhlIHNhbXBsZSBvZiB0aGUgZmlyc3QKKyAgLy8vIGluc3RydWN0aW9uIG9mIHRoZSBzeW1ib2wuIEJ1dCBhcyB3ZSBkaXJlY3RseSBnZXQgdGhpcyBpbmZvIGZvciByYXcKKyAgLy8vIHByb2ZpbGUgd2l0aG91dCByZWZlcnJpbmcgdG8gcG90ZW50aWFsbHkgaW5hY2N1cmF0ZSBkZWJ1ZyBpbmZvLCB0aGlzCisgIC8vLyBnaXZlcyBtb3JlIGFjY3VyYXRlIHByb2ZpbGUgZGF0YSBhbmQgaXMgcHJlZmVycmVkIGZvciBzdGFuZGFsb25lIHN5bWJvbHMuCisgIHVpbnQ2NF90IGdldEhlYWRTYW1wbGVzKCkgY29uc3QgeyByZXR1cm4gVG90YWxIZWFkU2FtcGxlczsgfQorCisgIC8vLyBSZXR1cm4gdGhlIHNhbXBsZSBjb3VudCBvZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb2YgdGhlIGZ1bmN0aW9uLgorICAvLy8gVGhlIGZ1bmN0aW9uIGNhbiBiZSBlaXRoZXIgYSBzdGFuZGFsb25lIHN5bWJvbCBvciBhbiBpbmxpbmVkIGZ1bmN0aW9uLgorICB1aW50NjRfdCBnZXRFbnRyeVNhbXBsZXMoKSBjb25zdCB7CisgICAgLy8gVXNlIGVpdGhlciBCb2R5U2FtcGxlcyBvciBDYWxsc2l0ZVNhbXBsZXMgd2hpY2ggZXZlciBoYXMgdGhlIHNtYWxsZXIKKyAgICAvLyBsaW5lbm8uCisgICAgaWYgKCFCb2R5U2FtcGxlcy5lbXB0eSgpICYmCisgICAgICAgIChDYWxsc2l0ZVNhbXBsZXMuZW1wdHkoKSB8fAorICAgICAgICAgQm9keVNhbXBsZXMuYmVnaW4oKS0+Zmlyc3QgPCBDYWxsc2l0ZVNhbXBsZXMuYmVnaW4oKS0+Zmlyc3QpKQorICAgICAgcmV0dXJuIEJvZHlTYW1wbGVzLmJlZ2luKCktPnNlY29uZC5nZXRTYW1wbGVzKCk7CisgICAgaWYgKCFDYWxsc2l0ZVNhbXBsZXMuZW1wdHkoKSkgeworICAgICAgdWludDY0X3QgVCA9IDA7CisgICAgICAvLyBBbiBpbmRpcmVjdCBjYWxsc2l0ZSBtYXkgYmUgcHJvbW90ZWQgdG8gc2V2ZXJhbCBpbmxpbmVkIGRpcmVjdCBjYWxscy4KKyAgICAgIC8vIFdlIG5lZWQgdG8gZ2V0IHRoZSBzdW0gb2YgdGhlbS4KKyAgICAgIGZvciAoY29uc3QgYXV0byAmTl9GUyA6IENhbGxzaXRlU2FtcGxlcy5iZWdpbigpLT5zZWNvbmQpCisgICAgICAgIFQgKz0gTl9GUy5zZWNvbmQuZ2V0RW50cnlTYW1wbGVzKCk7CisgICAgICByZXR1cm4gVDsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gUmV0dXJuIGFsbCB0aGUgc2FtcGxlcyBjb2xsZWN0ZWQgaW4gdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLgorICBjb25zdCBCb2R5U2FtcGxlTWFwICZnZXRCb2R5U2FtcGxlcygpIGNvbnN0IHsgcmV0dXJuIEJvZHlTYW1wbGVzOyB9CisKKyAgLy8vIFJldHVybiBhbGwgdGhlIGNhbGxzaXRlIHNhbXBsZXMgY29sbGVjdGVkIGluIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbi4KKyAgY29uc3QgQ2FsbHNpdGVTYW1wbGVNYXAgJmdldENhbGxzaXRlU2FtcGxlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2FsbHNpdGVTYW1wbGVzOworICB9CisKKyAgLy8vIE1lcmdlIHRoZSBzYW1wbGVzIGluIFxwIE90aGVyIGludG8gdGhpcyBvbmUuCisgIC8vLyBPcHRpb25hbGx5IHNjYWxlIHNhbXBsZXMgYnkgXHAgV2VpZ2h0LgorICBzYW1wbGVwcm9mX2Vycm9yIG1lcmdlKGNvbnN0IEZ1bmN0aW9uU2FtcGxlcyAmT3RoZXIsIHVpbnQ2NF90IFdlaWdodCA9IDEpIHsKKyAgICBzYW1wbGVwcm9mX2Vycm9yIFJlc3VsdCA9IHNhbXBsZXByb2ZfZXJyb3I6OnN1Y2Nlc3M7CisgICAgTmFtZSA9IE90aGVyLmdldE5hbWUoKTsKKyAgICBNZXJnZVJlc3VsdChSZXN1bHQsIGFkZFRvdGFsU2FtcGxlcyhPdGhlci5nZXRUb3RhbFNhbXBsZXMoKSwgV2VpZ2h0KSk7CisgICAgTWVyZ2VSZXN1bHQoUmVzdWx0LCBhZGRIZWFkU2FtcGxlcyhPdGhlci5nZXRIZWFkU2FtcGxlcygpLCBXZWlnaHQpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBPdGhlci5nZXRCb2R5U2FtcGxlcygpKSB7CisgICAgICBjb25zdCBMaW5lTG9jYXRpb24gJkxvYyA9IEkuZmlyc3Q7CisgICAgICBjb25zdCBTYW1wbGVSZWNvcmQgJlJlYyA9IEkuc2Vjb25kOworICAgICAgTWVyZ2VSZXN1bHQoUmVzdWx0LCBCb2R5U2FtcGxlc1tMb2NdLm1lcmdlKFJlYywgV2VpZ2h0KSk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byAmSSA6IE90aGVyLmdldENhbGxzaXRlU2FtcGxlcygpKSB7CisgICAgICBjb25zdCBMaW5lTG9jYXRpb24gJkxvYyA9IEkuZmlyc3Q7CisgICAgICBGdW5jdGlvblNhbXBsZXNNYXAgJkZTTWFwID0gZnVuY3Rpb25TYW1wbGVzQXQoTG9jKTsKKyAgICAgIGZvciAoY29uc3QgYXV0byAmUmVjIDogSS5zZWNvbmQpCisgICAgICAgIE1lcmdlUmVzdWx0KFJlc3VsdCwgRlNNYXBbUmVjLmZpcnN0XS5tZXJnZShSZWMuc2Vjb25kLCBXZWlnaHQpKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIC8vLyBSZWN1cnNpdmVseSB0cmF2ZXJzZXMgYWxsIGNoaWxkcmVuLCBpZiB0aGUgdG90YWwgc2FtcGxlIGNvdW50IG9mIHRoZQorICAvLy8gY29ycmVzcG9uZGluZyBmdW5jdGlvbiBpcyBubyBsZXNzIHRoYW4gXHAgVGhyZXNob2xkLCBhZGQgaXRzIGNvcnJlc3BvbmRpbmcKKyAgLy8vIEdVSUQgdG8gXHAgUy4gQWxzbyB0cmF2ZXJzZSB0aGUgQm9keVNhbXBsZXMgdG8gYWRkIGhvdCBDYWxsVGFyZ2V0J3MgR1VJRAorICAvLy8gdG8gXHAgUy4KKyAgdm9pZCBmaW5kSW5saW5lZEZ1bmN0aW9ucyhEZW5zZVNldDxHbG9iYWxWYWx1ZTo6R1VJRD4gJlMsIGNvbnN0IE1vZHVsZSAqTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBUaHJlc2hvbGQpIGNvbnN0IHsKKyAgICBpZiAoVG90YWxTYW1wbGVzIDw9IFRocmVzaG9sZCkKKyAgICAgIHJldHVybjsKKyAgICBTLmluc2VydChGdW5jdGlvbjo6Z2V0R1VJRChOYW1lKSk7CisgICAgLy8gSW1wb3J0IGhvdCBDYWxsVGFyZ2V0cywgd2hpY2ggbWF5IG5vdCBiZSBhdmFpbGFibGUgaW4gSVIgYmVjYXVzZSBmdWxsCisgICAgLy8gcHJvZmlsZSBhbm5vdGF0aW9uIGNhbm5vdCBiZSBkb25lIHVudGlsIGJhY2tlbmQgY29tcGlsYXRpb24gaW4gVGhpbkxUTy4KKyAgICBmb3IgKGNvbnN0IGF1dG8gJkJTIDogQm9keVNhbXBsZXMpCisgICAgICBmb3IgKGNvbnN0IGF1dG8gJlRTIDogQlMuc2Vjb25kLmdldENhbGxUYXJnZXRzKCkpCisgICAgICAgIGlmIChUUy5nZXRWYWx1ZSgpID4gVGhyZXNob2xkKSB7CisgICAgICAgICAgRnVuY3Rpb24gKkNhbGxlZSA9IE0tPmdldEZ1bmN0aW9uKFRTLmdldEtleSgpKTsKKyAgICAgICAgICBpZiAoIUNhbGxlZSB8fCAhQ2FsbGVlLT5nZXRTdWJwcm9ncmFtKCkpCisgICAgICAgICAgICBTLmluc2VydChGdW5jdGlvbjo6Z2V0R1VJRChUUy5nZXRLZXkoKSkpOworICAgICAgICB9CisgICAgZm9yIChjb25zdCBhdXRvICZDUyA6IENhbGxzaXRlU2FtcGxlcykKKyAgICAgIGZvciAoY29uc3QgYXV0byAmTmFtZUZTIDogQ1Muc2Vjb25kKQorICAgICAgICBOYW1lRlMuc2Vjb25kLmZpbmRJbmxpbmVkRnVuY3Rpb25zKFMsIE0sIFRocmVzaG9sZCk7CisgIH0KKworICAvLy8gU2V0IHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4KKyAgdm9pZCBzZXROYW1lKFN0cmluZ1JlZiBGdW5jdGlvbk5hbWUpIHsgTmFtZSA9IEZ1bmN0aW9uTmFtZTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIGZ1bmN0aW9uIG5hbWUuCisgIGNvbnN0IFN0cmluZ1JlZiAmZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICAvLy8gUmV0dXJucyB0aGUgbGluZSBvZmZzZXQgdG8gdGhlIHN0YXJ0IGxpbmUgb2YgdGhlIHN1YnByb2dyYW0uCisgIC8vLyBXZSBhc3N1bWUgdGhhdCBhIHNpbmdsZSBmdW5jdGlvbiB3aWxsIG5vdCBleGNlZWQgNjU1MzUgTE9DLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0T2Zmc2V0KGNvbnN0IERJTG9jYXRpb24gKkRJTCk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIEZ1bmN0aW9uU2FtcGxlcyBvZiB0aGUgaW5saW5lIGluc3RhbmNlIHdoZXJlIERJTCBvcmlnaW5hdGVzCisgIC8vLyBmcm9tLgorICAvLy8KKyAgLy8vIFRoZSBGdW5jdGlvblNhbXBsZXMgb2YgdGhlIGluc3RydWN0aW9uIChNYWNoaW5lIG9yIElSKSBhc3NvY2lhdGVkIHRvCisgIC8vLyBccCBESUwgaXMgdGhlIGlubGluZWQgaW5zdGFuY2UgaW4gd2hpY2ggdGhhdCBpbnN0cnVjdGlvbiBpcyBjb21pbmcgZnJvbS4KKyAgLy8vIFdlIHRyYXZlcnNlIHRoZSBpbmxpbmUgc3RhY2sgb2YgdGhhdCBpbnN0cnVjdGlvbiwgYW5kIG1hdGNoIGl0IHdpdGggdGhlCisgIC8vLyB0cmVlIG5vZGVzIGluIHRoZSBwcm9maWxlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSBGdW5jdGlvblNhbXBsZXMgcG9pbnRlciB0byB0aGUgaW5saW5lZCBpbnN0YW5jZS4KKyAgY29uc3QgRnVuY3Rpb25TYW1wbGVzICpmaW5kRnVuY3Rpb25TYW1wbGVzKGNvbnN0IERJTG9jYXRpb24gKkRJTCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIC8vLyBNYW5nbGVkIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLgorICBTdHJpbmdSZWYgTmFtZTsKKworICAvLy8gVG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgY29sbGVjdGVkIGluc2lkZSB0aGlzIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFNhbXBsZXMgYXJlIGN1bXVsYXRpdmUsIHRoZXkgaW5jbHVkZSBhbGwgdGhlIHNhbXBsZXMgY29sbGVjdGVkCisgIC8vLyBpbnNpZGUgdGhpcyBmdW5jdGlvbiBhbmQgYWxsIGl0cyBpbmxpbmVkIGNhbGxlZXMuCisgIHVpbnQ2NF90IFRvdGFsU2FtcGxlcyA9IDA7CisKKyAgLy8vIFRvdGFsIG51bWJlciBvZiBzYW1wbGVzIGNvbGxlY3RlZCBhdCB0aGUgaGVhZCBvZiB0aGUgZnVuY3Rpb24uCisgIC8vLyBUaGlzIGlzIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIG51bWJlciBvZiBjYWxscyBtYWRlIHRvIHRoaXMgZnVuY3Rpb24KKyAgLy8vIGF0IHJ1bnRpbWUuCisgIHVpbnQ2NF90IFRvdGFsSGVhZFNhbXBsZXMgPSAwOworCisgIC8vLyBNYXAgaW5zdHJ1Y3Rpb24gbG9jYXRpb25zIHRvIGNvbGxlY3RlZCBzYW1wbGVzLgorICAvLy8KKyAgLy8vIEVhY2ggZW50cnkgaW4gdGhpcyBtYXAgY29udGFpbnMgdGhlIG51bWJlciBvZiBzYW1wbGVzCisgIC8vLyBjb2xsZWN0ZWQgYXQgdGhlIGNvcnJlc3BvbmRpbmcgbGluZSBvZmZzZXQuIEFsbCBsaW5lIGxvY2F0aW9ucworICAvLy8gYXJlIGFuIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uCisgIEJvZHlTYW1wbGVNYXAgQm9keVNhbXBsZXM7CisKKyAgLy8vIE1hcCBjYWxsIHNpdGVzIHRvIGNvbGxlY3RlZCBzYW1wbGVzIGZvciB0aGUgY2FsbGVkIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIEVhY2ggZW50cnkgaW4gdGhpcyBtYXAgY29ycmVzcG9uZHMgdG8gYWxsIHRoZSBzYW1wbGVzCisgIC8vLyBjb2xsZWN0ZWQgZm9yIHRoZSBpbmxpbmVkIGZ1bmN0aW9uIGNhbGwgYXQgdGhlIGdpdmVuCisgIC8vLyBsb2NhdGlvbi4gRm9yIGV4YW1wbGUsIGdpdmVuOgorICAvLy8KKyAgLy8vICAgICB2b2lkIGZvbygpIHsKKyAgLy8vICAxICAgIGJhcigpOworICAvLy8gIC4uLgorICAvLy8gIDggICAgYmF6KCk7CisgIC8vLyAgICAgfQorICAvLy8KKyAgLy8vIElmIHRoZSBiYXIoKSBhbmQgYmF6KCkgY2FsbHMgd2VyZSBpbmxpbmVkIGluc2lkZSBmb28oKSwgdGhpcworICAvLy8gbWFwIHdpbGwgY29udGFpbiB0d28gZW50cmllcy4gIE9uZSBmb3IgYWxsIHRoZSBzYW1wbGVzIGNvbGxlY3RlZAorICAvLy8gaW4gdGhlIGNhbGwgdG8gYmFyKCkgYXQgbGluZSBvZmZzZXQgMSwgdGhlIG90aGVyIGZvciBhbGwgdGhlIHNhbXBsZXMKKyAgLy8vIGNvbGxlY3RlZCBpbiB0aGUgY2FsbCB0byBiYXooKSBhdCBsaW5lIG9mZnNldCA4LgorICBDYWxsc2l0ZVNhbXBsZU1hcCBDYWxsc2l0ZVNhbXBsZXM7Cit9OworCityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEZ1bmN0aW9uU2FtcGxlcyAmRlMpOworCisvLy8gU29ydCBhIExvY2F0aW9uVC0+U2FtcGxlVCBtYXAgYnkgTG9jYXRpb25ULgorLy8vCisvLy8gSXQgcHJvZHVjZXMgYSBzb3J0ZWQgbGlzdCBvZiA8TG9jYXRpb25ULCBTYW1wbGVUPiByZWNvcmRzIGJ5IGFzY2VuZGluZworLy8vIG9yZGVyIG9mIExvY2F0aW9uVC4KK3RlbXBsYXRlIDxjbGFzcyBMb2NhdGlvblQsIGNsYXNzIFNhbXBsZVQ+IGNsYXNzIFNhbXBsZVNvcnRlciB7CitwdWJsaWM6CisgIHVzaW5nIFNhbXBsZXNXaXRoTG9jID0gc3RkOjpwYWlyPGNvbnN0IExvY2F0aW9uVCwgU2FtcGxlVD47CisgIHVzaW5nIFNhbXBsZXNXaXRoTG9jTGlzdCA9IFNtYWxsVmVjdG9yPGNvbnN0IFNhbXBsZXNXaXRoTG9jICosIDIwPjsKKworICBTYW1wbGVTb3J0ZXIoY29uc3Qgc3RkOjptYXA8TG9jYXRpb25ULCBTYW1wbGVUPiAmU2FtcGxlcykgeworICAgIGZvciAoY29uc3QgYXV0byAmSSA6IFNhbXBsZXMpCisgICAgICBWLnB1c2hfYmFjaygmSSk7CisgICAgc3RkOjpzdGFibGVfc29ydChWLmJlZ2luKCksIFYuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBTYW1wbGVzV2l0aExvYyAqQSwgY29uc3QgU2FtcGxlc1dpdGhMb2MgKkIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEEtPmZpcnN0IDwgQi0+Zmlyc3Q7CisgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgfQorCisgIGNvbnN0IFNhbXBsZXNXaXRoTG9jTGlzdCAmZ2V0KCkgY29uc3QgeyByZXR1cm4gVjsgfQorCitwcml2YXRlOgorICBTYW1wbGVzV2l0aExvY0xpc3QgVjsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBzYW1wbGVwcm9mCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9QUk9GSUxFREFUQV9TQU1QTEVQUk9GX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvU2FtcGxlUHJvZlJlYWRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9TYW1wbGVQcm9mUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5YWIyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvU2FtcGxlUHJvZlJlYWRlci5oCkBAIC0wLDAgKzEsNDYyIEBACisvLz09PS0gU2FtcGxlUHJvZlJlYWRlci5oIC0gUmVhZCBMTFZNIHNhbXBsZSBwcm9maWxlIGRhdGEgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgbmVlZGVkIGZvciByZWFkaW5nIHNhbXBsZSBwcm9maWxlcy4KKy8vCisvLyBOT1RFOiBJZiB5b3UgYXJlIG1ha2luZyBjaGFuZ2VzIHRvIHRoaXMgZmlsZSBmb3JtYXQsIHBsZWFzZSByZW1lbWJlcgorLy8gICAgICAgdG8gZG9jdW1lbnQgdGhlbSBpbiB0aGUgQ2xhbmcgZG9jdW1lbnRhdGlvbiBhdAorLy8gICAgICAgdG9vbHMvY2xhbmcvZG9jcy9Vc2Vyc01hbnVhbC5yc3QuCisvLworLy8gVGV4dCBmb3JtYXQKKy8vIC0tLS0tLS0tLS0tCisvLworLy8gU2FtcGxlIHByb2ZpbGVzIGFyZSB3cml0dGVuIGFzIEFTQ0lJIHRleHQuIFRoZSBmaWxlIGlzIGRpdmlkZWQgaW50bworLy8gc2VjdGlvbnMsIHdoaWNoIGNvcnJlc3BvbmQgdG8gZWFjaCBvZiB0aGUgZnVuY3Rpb25zIGV4ZWN1dGVkIGF0IHJ1bnRpbWUuCisvLyBFYWNoIHNlY3Rpb24gaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0CisvLworLy8gICAgIGZ1bmN0aW9uMTp0b3RhbF9zYW1wbGVzOnRvdGFsX2hlYWRfc2FtcGxlcworLy8gICAgICBvZmZzZXQxWy5kaXNjcmltaW5hdG9yXTogbnVtYmVyX29mX3NhbXBsZXMgW2ZuMTpudW0gZm4yOm51bSAuLi4gXQorLy8gICAgICBvZmZzZXQyWy5kaXNjcmltaW5hdG9yXTogbnVtYmVyX29mX3NhbXBsZXMgW2ZuMzpudW0gZm40Om51bSAuLi4gXQorLy8gICAgICAuLi4KKy8vICAgICAgb2Zmc2V0TlsuZGlzY3JpbWluYXRvcl06IG51bWJlcl9vZl9zYW1wbGVzIFtmbjU6bnVtIGZuNjpudW0gLi4uIF0KKy8vICAgICAgb2Zmc2V0QVsuZGlzY3JpbWluYXRvcl06IGZuQTpudW1fb2ZfdG90YWxfc2FtcGxlcworLy8gICAgICAgb2Zmc2V0QTFbLmRpc2NyaW1pbmF0b3JdOiBudW1iZXJfb2Zfc2FtcGxlcyBbZm43Om51bSBmbjg6bnVtIC4uLiBdCisvLyAgICAgICAuLi4KKy8vCisvLyBUaGlzIGlzIGEgbmVzdGVkIHRyZWUgaW4gd2hpY2ggdGhlIGlkZW50YXRpb24gcmVwcmVzZW50cyB0aGUgbmVzdGluZyBsZXZlbAorLy8gb2YgdGhlIGlubGluZSBzdGFjay4gVGhlcmUgYXJlIG5vIGJsYW5rIGxpbmVzIGluIHRoZSBmaWxlLiBBbmQgdGhlIHNwYWNpbmcKKy8vIHdpdGhpbiBhIHNpbmdsZSBsaW5lIGlzIGZpeGVkLiBBZGRpdGlvbmFsIHNwYWNlcyB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvcgorLy8gd2hpbGUgcmVhZGluZyB0aGUgZmlsZS4KKy8vCisvLyBBbnkgbGluZSBzdGFydGluZyB3aXRoIHRoZSAnIycgY2hhcmFjdGVyIGlzIGNvbXBsZXRlbHkgaWdub3JlZC4KKy8vCisvLyBJbmxpbmVkIGNhbGxzIGFyZSByZXByZXNlbnRlZCB3aXRoIGluZGVudGF0aW9uLiBUaGUgSW5saW5lIHN0YWNrIGlzIGEKKy8vIHN0YWNrIG9mIHNvdXJjZSBsb2NhdGlvbnMgaW4gd2hpY2ggdGhlIHRvcCBvZiB0aGUgc3RhY2sgcmVwcmVzZW50cyB0aGUKKy8vIGxlYWYgZnVuY3Rpb24sIGFuZCB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayByZXByZXNlbnRzIHRoZSBhY3R1YWwKKy8vIHN5bWJvbCB0byB3aGljaCB0aGUgaW5zdHJ1Y3Rpb24gYmVsb25ncy4KKy8vCisvLyBGdW5jdGlvbiBuYW1lcyBtdXN0IGJlIG1hbmdsZWQgaW4gb3JkZXIgZm9yIHRoZSBwcm9maWxlIGxvYWRlciB0bworLy8gbWF0Y2ggdGhlbSBpbiB0aGUgY3VycmVudCB0cmFuc2xhdGlvbiB1bml0LiBUaGUgdHdvIG51bWJlcnMgaW4gdGhlCisvLyBmdW5jdGlvbiBoZWFkZXIgc3BlY2lmeSBob3cgbWFueSB0b3RhbCBzYW1wbGVzIHdlcmUgYWNjdW11bGF0ZWQgaW4gdGhlCisvLyBmdW5jdGlvbiAoZmlyc3QgbnVtYmVyKSwgYW5kIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlcyBhY2N1bXVsYXRlZAorLy8gaW4gdGhlIHByb2xvZ3VlIG9mIHRoZSBmdW5jdGlvbiAoc2Vjb25kIG51bWJlcikuIFRoaXMgaGVhZCBzYW1wbGUKKy8vIGNvdW50IHByb3ZpZGVzIGFuIGluZGljYXRvciBvZiBob3cgZnJlcXVlbnRseSB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZC4KKy8vCisvLyBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGxpbmVzIGluIHRoZSBmdW5jdGlvbiBib2R5LgorLy8KKy8vICogU2FtcGxlZCBsaW5lIHJlcHJlc2VudHMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gb2YgYSBzb3VyY2UgbG9jYXRpb24uCisvLyAqIENhbGxzaXRlIGxpbmUgcmVwcmVzZW50cyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiBvZiBhIGNhbGxzaXRlLgorLy8KKy8vIEVhY2ggc2FtcGxlZCBsaW5lIG1heSBjb250YWluIHNldmVyYWwgaXRlbXMuIFNvbWUgYXJlIG9wdGlvbmFsIChtYXJrZWQKKy8vIGJlbG93KToKKy8vCisvLyBhLiBTb3VyY2UgbGluZSBvZmZzZXQuIFRoaXMgbnVtYmVyIHJlcHJlc2VudHMgdGhlIGxpbmUgbnVtYmVyCisvLyAgICBpbiB0aGUgZnVuY3Rpb24gd2hlcmUgdGhlIHNhbXBsZSB3YXMgY29sbGVjdGVkLiBUaGUgbGluZSBudW1iZXIgaXMKKy8vICAgIGFsd2F5cyByZWxhdGl2ZSB0byB0aGUgbGluZSB3aGVyZSBzeW1ib2wgb2YgdGhlIGZ1bmN0aW9uIGlzCisvLyAgICBkZWZpbmVkLiBTbywgaWYgdGhlIGZ1bmN0aW9uIGhhcyBpdHMgaGVhZGVyIGF0IGxpbmUgMjgwLCB0aGUgb2Zmc2V0CisvLyAgICAxMyBpcyBhdCBsaW5lIDI5MyBpbiB0aGUgZmlsZS4KKy8vCisvLyAgICBOb3RlIHRoYXQgdGhpcyBvZmZzZXQgc2hvdWxkIG5ldmVyIGJlIGEgbmVnYXRpdmUgbnVtYmVyLiBUaGlzIGNvdWxkCisvLyAgICBoYXBwZW4gaW4gY2FzZXMgbGlrZSBtYWNyb3MuIFRoZSBkZWJ1ZyBtYWNoaW5lcnkgd2lsbCByZWdpc3RlciB0aGUKKy8vICAgIGxpbmUgbnVtYmVyIGF0IHRoZSBwb2ludCBvZiBtYWNybyBleHBhbnNpb24uIFNvLCBpZiB0aGUgbWFjcm8gd2FzCisvLyAgICBleHBhbmRlZCBpbiBhIGxpbmUgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24sIHRoZSBwcm9maWxlCisvLyAgICBjb252ZXJ0ZXIgc2hvdWxkIGVtaXQgYSAwIGFzIHRoZSBvZmZzZXQgKHRoaXMgbWVhbnMgdGhhdCB0aGUgb3B0aW1pemVycworLy8gICAgd2lsbCBub3QgYmUgYWJsZSB0byBhc3NvY2lhdGUgYSBtZWFuaW5nZnVsIHdlaWdodCB0byB0aGUgaW5zdHJ1Y3Rpb25zCisvLyAgICBpbiB0aGUgbWFjcm8pLgorLy8KKy8vIGIuIFtPUFRJT05BTF0gRGlzY3JpbWluYXRvci4gVGhpcyBpcyB1c2VkIGlmIHRoZSBzYW1wbGVkIHByb2dyYW0KKy8vICAgIHdhcyBjb21waWxlZCB3aXRoIERXQVJGIGRpc2NyaW1pbmF0b3Igc3VwcG9ydAorLy8gICAgKGh0dHA6Ly93aWtpLmR3YXJmc3RkLm9yZy9pbmRleC5waHA/dGl0bGU9UGF0aF9EaXNjcmltaW5hdG9ycykuCisvLyAgICBEV0FSRiBkaXNjcmltaW5hdG9ycyBhcmUgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMgdGhhdCBhbGxvdyB0aGUKKy8vICAgIGNvbXBpbGVyIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbXVsdGlwbGUgZXhlY3V0aW9uIHBhdGhzIG9uIHRoZQorLy8gICAgc2FtZSBzb3VyY2UgbGluZSBsb2NhdGlvbi4KKy8vCisvLyAgICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGxpbmUgb2YgY29kZSBgYGlmIChjb25kKSBmb28oKTsgZWxzZSBiYXIoKTtgYC4KKy8vICAgIElmIHRoZSBwcmVkaWNhdGUgYGBjb25kYGAgaXMgdHJ1ZSA4MCUgb2YgdGhlIHRpbWUsIHRoZW4gdGhlIGVkZ2UKKy8vICAgIGludG8gZnVuY3Rpb24gYGBmb29gYCBzaG91bGQgYmUgY29uc2lkZXJlZCB0byBiZSB0YWtlbiBtb3N0IG9mIHRoZQorLy8gICAgdGltZS4gQnV0IGJvdGggY2FsbHMgdG8gYGBmb29gYCBhbmQgYGBiYXJgYCBhcmUgYXQgdGhlIHNhbWUgc291cmNlCisvLyAgICBsaW5lLCBzbyBhIHNhbXBsZSBjb3VudCBhdCB0aGF0IGxpbmUgaXMgbm90IHN1ZmZpY2llbnQuIFRoZQorLy8gICAgY29tcGlsZXIgbmVlZHMgdG8ga25vdyB3aGljaCBwYXJ0IG9mIHRoYXQgbGluZSBpcyB0YWtlbiBtb3JlCisvLyAgICBmcmVxdWVudGx5LgorLy8KKy8vICAgIFRoaXMgaXMgd2hhdCBkaXNjcmltaW5hdG9ycyBwcm92aWRlLiBJbiB0aGlzIGNhc2UsIHRoZSBjYWxscyB0bworLy8gICAgYGBmb29gYCBhbmQgYGBiYXJgYCB3aWxsIGJlIGF0IHRoZSBzYW1lIGxpbmUsIGJ1dCB3aWxsIGhhdmUKKy8vICAgIGRpZmZlcmVudCBkaXNjcmltaW5hdG9yIHZhbHVlcy4gVGhpcyBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIGNvcnJlY3RseQorLy8gICAgc2V0IGVkZ2Ugd2VpZ2h0cyBpbnRvIGBgZm9vYGAgYW5kIGBgYmFyYGAuCisvLworLy8gYy4gTnVtYmVyIG9mIHNhbXBsZXMuIFRoaXMgaXMgYW4gaW50ZWdlciBxdWFudGl0eSByZXByZXNlbnRpbmcgdGhlCisvLyAgICBudW1iZXIgb2Ygc2FtcGxlcyBjb2xsZWN0ZWQgYnkgdGhlIHByb2ZpbGVyIGF0IHRoaXMgc291cmNlCisvLyAgICBsb2NhdGlvbi4KKy8vCisvLyBkLiBbT1BUSU9OQUxdIFBvdGVudGlhbCBjYWxsIHRhcmdldHMgYW5kIHNhbXBsZXMuIElmIHByZXNlbnQsIHRoaXMKKy8vICAgIGxpbmUgY29udGFpbnMgYSBjYWxsIGluc3RydWN0aW9uLiBUaGlzIG1vZGVscyBib3RoIGRpcmVjdCBhbmQKKy8vICAgIG51bWJlciBvZiBzYW1wbGVzLiBGb3IgZXhhbXBsZSwKKy8vCisvLyAgICAgIDEzMDogNyAgZm9vOjMgIGJhcjoyICBiYXo6NworLy8KKy8vICAgIFRoZSBhYm92ZSBtZWFucyB0aGF0IGF0IHJlbGF0aXZlIGxpbmUgb2Zmc2V0IDEzMCB0aGVyZSBpcyBhIGNhbGwKKy8vICAgIGluc3RydWN0aW9uIHRoYXQgY2FsbHMgb25lIG9mIGBgZm9vKClgYCwgYGBiYXIoKWBgIGFuZCBgYGJheigpYGAsCisvLyAgICB3aXRoIGBgYmF6KClgYCBiZWluZyB0aGUgcmVsYXRpdmVseSBtb3JlIGZyZXF1ZW50bHkgY2FsbGVkIHRhcmdldC4KKy8vCisvLyBFYWNoIGNhbGxzaXRlIGxpbmUgbWF5IGNvbnRhaW4gc2V2ZXJhbCBpdGVtcy4gU29tZSBhcmUgb3B0aW9uYWwuCisvLworLy8gYS4gU291cmNlIGxpbmUgb2Zmc2V0LiBUaGlzIG51bWJlciByZXByZXNlbnRzIHRoZSBsaW5lIG51bWJlciBvZiB0aGUKKy8vICAgIGNhbGxzaXRlIHRoYXQgaXMgaW5saW5lZCBpbiB0aGUgcHJvZmlsZWQgYmluYXJ5LgorLy8KKy8vIGIuIFtPUFRJT05BTF0gRGlzY3JpbWluYXRvci4gU2FtZSBhcyB0aGUgZGlzY3JpbWluYXRvciBmb3Igc2FtcGxlZCBsaW5lLgorLy8KKy8vIGMuIE51bWJlciBvZiBzYW1wbGVzLiBUaGlzIGlzIGFuIGludGVnZXIgcXVhbnRpdHkgcmVwcmVzZW50aW5nIHRoZQorLy8gICAgdG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgY29sbGVjdGVkIGZvciB0aGUgaW5saW5lZCBpbnN0YW5jZSBhdCB0aGlzCisvLyAgICBjYWxsc2l0ZQorLy8KKy8vCisvLyBCaW5hcnkgZm9ybWF0CisvLyAtLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBpcyBhIG1vcmUgY29tcGFjdCBlbmNvZGluZy4gTnVtYmVycyBhcmUgZW5jb2RlZCBhcyBVTEVCMTI4IHZhbHVlcworLy8gYW5kIGFsbCBzdHJpbmdzIGFyZSBlbmNvZGVkIGluIGEgbmFtZSB0YWJsZS4gVGhlIGZpbGUgaXMgb3JnYW5pemVkIGluCisvLyB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOgorLy8KKy8vIE1BR0lDICh1aW50NjRfdCkKKy8vICAgIEZpbGUgaWRlbnRpZmllciBjb21wdXRlZCBieSBmdW5jdGlvbiBTUE1hZ2ljKCkgKDB4NTM1MDUyNGY0NjM0MzJmZikKKy8vCisvLyBWRVJTSU9OICh1aW50MzJfdCkKKy8vICAgIEZpbGUgZm9ybWF0IHZlcnNpb24gbnVtYmVyIGNvbXB1dGVkIGJ5IFNQVmVyc2lvbigpCisvLworLy8gU1VNTUFSWQorLy8gICAgVE9UQUxfQ09VTlQgKHVpbnQ2NF90KQorLy8gICAgICAgIFRvdGFsIG51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBwcm9maWxlLgorLy8gICAgTUFYX0NPVU5UICh1aW50NjRfdCkKKy8vICAgICAgICBNYXhpbXVtIHZhbHVlIG9mIHNhbXBsZXMgb24gYSBsaW5lLgorLy8gICAgTUFYX0ZVTkNUSU9OX0NPVU5UICh1aW50NjRfdCkKKy8vICAgICAgICBNYXhpbXVtIG51bWJlciBvZiBzYW1wbGVzIGF0IGZ1bmN0aW9uIGVudHJ5IChoZWFkIHNhbXBsZXMpLgorLy8gICAgTlVNX0NPVU5UUyAodWludDY0X3QpCisvLyAgICAgICAgTnVtYmVyIG9mIGxpbmVzIHdpdGggc2FtcGxlcy4KKy8vICAgIE5VTV9GVU5DVElPTlMgKHVpbnQ2NF90KQorLy8gICAgICAgIE51bWJlciBvZiBmdW5jdGlvbnMgd2l0aCBzYW1wbGVzLgorLy8gICAgTlVNX0RFVEFJTEVEX1NVTU1BUllfRU5UUklFUyAoc2l6ZV90KQorLy8gICAgICAgIE51bWJlciBvZiBlbnRyaWVzIGluIGRldGFpbGVkIHN1bW1hcnkKKy8vICAgIERFVEFJTEVEX1NVTU1BUlkKKy8vICAgICAgICBBIGxpc3Qgb2YgZGV0YWlsZWQgc3VtbWFyeSBlbnRyeS4gRWFjaCBlbnRyeSBjb25zaXN0cyBvZgorLy8gICAgICAgIENVVE9GRiAodWludDMyX3QpCisvLyAgICAgICAgICAgIFJlcXVpcmVkIHBlcmNlbnRpbGUgb2YgdG90YWwgc2FtcGxlIGNvdW50IGV4cHJlc3NlZCBhcyBhIGZyYWN0aW9uCisvLyAgICAgICAgICAgIG11bHRpcGxpZWQgYnkgMTAwMDAwMC4KKy8vICAgICAgICBNSU5fQ09VTlQgKHVpbnQ2NF90KQorLy8gICAgICAgICAgICBUaGUgbWluaW11bSBudW1iZXIgb2Ygc2FtcGxlcyByZXF1aXJlZCB0byByZWFjaCB0aGUgdGFyZ2V0CisvLyAgICAgICAgICAgIENVVE9GRi4KKy8vICAgICAgICBOVU1fQ09VTlRTICh1aW50NjRfdCkKKy8vICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgdG8gZ2V0IHRvIHRoZSBkZXNyaXJlZCBwZXJjZW50aWxlLgorLy8KKy8vIE5BTUUgVEFCTEUKKy8vICAgIFNJWkUgKHVpbnQzMl90KQorLy8gICAgICAgIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBuYW1lIHRhYmxlLgorLy8gICAgTkFNRVMKKy8vICAgICAgICBBIE5VTC1zZXBhcmF0ZWQgbGlzdCBvZiBTSVpFIHN0cmluZ3MuCisvLworLy8gRlVOQ1RJT04gQk9EWSAob25lIGZvciBlYWNoIHVuaW5saW5lZCBmdW5jdGlvbiBib2R5IHByZXNlbnQgaW4gdGhlIHByb2ZpbGUpCisvLyAgICBIRUFEX1NBTVBMRVMgKHVpbnQ2NF90KSBbb25seSBmb3IgdG9wLWxldmVsIGZ1bmN0aW9uc10KKy8vICAgICAgICBUb3RhbCBudW1iZXIgb2Ygc2FtcGxlcyBjb2xsZWN0ZWQgYXQgdGhlIGhlYWQgKHByb2xvZ3VlKSBvZiB0aGUKKy8vICAgICAgICBmdW5jdGlvbi4KKy8vICAgICAgICBOT1RFOiBUaGlzIGZpZWxkIHNob3VsZCBvbmx5IGJlIHByZXNlbnQgZm9yIHRvcC1sZXZlbCBmdW5jdGlvbnMKKy8vICAgICAgICAgICAgICAoaS5lLiwgbm90IGlubGluZWQgaW50byBhbnkgY2FsbGVyKS4gSW5saW5lZCBmdW5jdGlvbiBjYWxscworLy8gICAgICAgICAgICAgIGhhdmUgbm8gcHJvbG9ndWUsIHNvIHRoZXkgZG9uJ3QgbmVlZCB0aGlzLgorLy8gICAgTkFNRV9JRFggKHVpbnQzMl90KQorLy8gICAgICAgIEluZGV4IGludG8gdGhlIG5hbWUgdGFibGUgaW5kaWNhdGluZyB0aGUgZnVuY3Rpb24gbmFtZS4KKy8vICAgIFNBTVBMRVMgKHVpbnQ2NF90KQorLy8gICAgICAgIFRvdGFsIG51bWJlciBvZiBzYW1wbGVzIGNvbGxlY3RlZCBpbiB0aGlzIGZ1bmN0aW9uLgorLy8gICAgTlJFQ1MgKHVpbnQzMl90KQorLy8gICAgICAgIFRvdGFsIG51bWJlciBvZiBzYW1wbGluZyByZWNvcmRzIHRoaXMgZnVuY3Rpb24ncyBwcm9maWxlLgorLy8gICAgQk9EWSBSRUNPUkRTCisvLyAgICAgICAgQSBsaXN0IG9mIE5SRUNTIGVudHJpZXMuIEVhY2ggZW50cnkgY29udGFpbnM6CisvLyAgICAgICAgICBPRkZTRVQgKHVpbnQzMl90KQorLy8gICAgICAgICAgICBMaW5lIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uCisvLyAgICAgICAgICBESVNDUklNSU5BVE9SICh1aW50MzJfdCkKKy8vICAgICAgICAgICAgRGlzY3JpbWluYXRvciB2YWx1ZSAoc2VlIGRlc2NyaXB0aW9uIG9mIGRpc2NyaW1pbmF0b3JzCisvLyAgICAgICAgICAgIGluIHRoZSB0ZXh0IGZvcm1hdCBkb2N1bWVudGF0aW9uIGFib3ZlKS4KKy8vICAgICAgICAgIFNBTVBMRVMgKHVpbnQ2NF90KQorLy8gICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBjb2xsZWN0ZWQgYXQgdGhpcyBsb2NhdGlvbi4KKy8vICAgICAgICAgIE5VTV9DQUxMUyAodWludDMyX3QpCisvLyAgICAgICAgICAgIE51bWJlciBvZiBub24taW5saW5lZCBmdW5jdGlvbiBjYWxscyBtYWRlIGF0IHRoaXMgbG9jYXRpb24uIEluIHRoZQorLy8gICAgICAgICAgICBjYXNlIG9mIGRpcmVjdCBjYWxscywgdGhpcyBudW1iZXIgd2lsbCBhbHdheXMgYmUgMS4gRm9yIGluZGlyZWN0CisvLyAgICAgICAgICAgIGNhbGxzICh2aXJ0dWFsIGZ1bmN0aW9ucyBhbmQgZnVuY3Rpb24gcG9pbnRlcnMpIHRoaXMgd2lsbAorLy8gICAgICAgICAgICByZXByZXNlbnQgYWxsIHRoZSBhY3R1YWwgZnVuY3Rpb25zIGNhbGxlZCBhdCBydW50aW1lLgorLy8gICAgICAgICAgQ0FMTF9UQVJHRVRTCisvLyAgICAgICAgICAgIEEgbGlzdCBvZiBOVU1fQ0FMTFMgZW50cmllcyBmb3IgZWFjaCBjYWxsZWQgZnVuY3Rpb246CisvLyAgICAgICAgICAgICAgIE5BTUVfSURYICh1aW50MzJfdCkKKy8vICAgICAgICAgICAgICAgICAgSW5kZXggaW50byB0aGUgbmFtZSB0YWJsZSB3aXRoIHRoZSBjYWxsZWUgbmFtZS4KKy8vICAgICAgICAgICAgICAgU0FNUExFUyAodWludDY0X3QpCisvLyAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGNvbGxlY3RlZCBhdCB0aGUgY2FsbCBzaXRlLgorLy8gICAgTlVNX0lOTElORURfRlVOQ1RJT05TICh1aW50MzJfdCkKKy8vICAgICAgTnVtYmVyIG9mIGNhbGxlZXMgaW5saW5lZCBpbnRvIHRoaXMgZnVuY3Rpb24uCisvLyAgICBJTkxJTkVEIEZVTkNUSU9OIFJFQ09SRFMKKy8vICAgICAgQSBsaXN0IG9mIE5VTV9JTkxJTkVEX0ZVTkNUSU9OUyBlbnRyaWVzIGRlc2NyaWJpbmcgZWFjaCBvZiB0aGUgaW5saW5lZAorLy8gICAgICBjYWxsZWVzLgorLy8gICAgICAgIE9GRlNFVCAodWludDMyX3QpCisvLyAgICAgICAgICBMaW5lIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uCisvLyAgICAgICAgRElTQ1JJTUlOQVRPUiAodWludDMyX3QpCisvLyAgICAgICAgICBEaXNjcmltaW5hdG9yIHZhbHVlIChzZWUgZGVzY3JpcHRpb24gb2YgZGlzY3JpbWluYXRvcnMKKy8vICAgICAgICAgIGluIHRoZSB0ZXh0IGZvcm1hdCBkb2N1bWVudGF0aW9uIGFib3ZlKS4KKy8vICAgICAgICBGVU5DVElPTiBCT0RZCisvLyAgICAgICAgICBBIEZVTkNUSU9OIEJPRFkgZW50cnkgZGVzY3JpYmluZyB0aGUgaW5saW5lZCBmdW5jdGlvbi4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9QUk9GSUxFREFUQV9TQU1QTEVQUk9GUkVBREVSX0gKKyNkZWZpbmUgTExWTV9QUk9GSUxFREFUQV9TQU1QTEVQUk9GUkVBREVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RpYWdub3N0aWNJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Byb2ZpbGVTdW1tYXJ5LmgiCisjaW5jbHVkZSAibGx2bS9Qcm9maWxlRGF0YS9HQ09WLmgiCisjaW5jbHVkZSAibGx2bS9Qcm9maWxlRGF0YS9TYW1wbGVQcm9mLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yT3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCituYW1lc3BhY2Ugc2FtcGxlcHJvZiB7CisKKy8vLyBcYnJpZWYgU2FtcGxlLWJhc2VkIHByb2ZpbGUgcmVhZGVyLgorLy8vCisvLy8gRWFjaCBwcm9maWxlIGNvbnRhaW5zIHNhbXBsZSBjb3VudHMgZm9yIGFsbCB0aGUgZnVuY3Rpb25zCisvLy8gZXhlY3V0ZWQuIEluc2lkZSBlYWNoIGZ1bmN0aW9uLCBzdGF0ZW1lbnRzIGFyZSBhbm5vdGF0ZWQgd2l0aCB0aGUKKy8vLyBjb2xsZWN0ZWQgc2FtcGxlcyBvbiBhbGwgdGhlIGluc3RydWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhhdAorLy8vIHN0YXRlbWVudC4KKy8vLworLy8vIEZvciB0aGlzIHRvIHByb2R1Y2UgbWVhbmluZ2Z1bCBkYXRhLCB0aGUgcHJvZ3JhbSBuZWVkcyB0byBiZQorLy8vIGNvbXBpbGVkIHdpdGggc29tZSBkZWJ1ZyBpbmZvcm1hdGlvbiAoYXQgbWluaW11bSwgbGluZSBudW1iZXJzOgorLy8vIC1nbGluZS10YWJsZXMtb25seSkuIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBpbXBvc3NpYmxlIHRvIG1hdGNoIElSCisvLy8gaW5zdHJ1Y3Rpb25zIHRvIHRoZSBsaW5lIG51bWJlcnMgY29sbGVjdGVkIGJ5IHRoZSBwcm9maWxlci4KKy8vLworLy8vIEZyb20gdGhlIHByb2ZpbGUgZmlsZSwgd2UgYXJlIGludGVyZXN0ZWQgaW4gY29sbGVjdGluZyB0aGUKKy8vLyBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisvLy8KKy8vLyAqIEEgbGlzdCBvZiBmdW5jdGlvbnMgaW5jbHVkZWQgaW4gdGhlIHByb2ZpbGUgKG1hbmdsZWQgbmFtZXMpLgorLy8vCisvLy8gKiBGb3IgZWFjaCBmdW5jdGlvbiBGOgorLy8vICAgMS4gVGhlIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzIGNvbGxlY3RlZCBpbiBGLgorLy8vCisvLy8gICAyLiBUaGUgc2FtcGxlcyBjb2xsZWN0ZWQgYXQgZWFjaCBsaW5lIGluIEYuIFRvIHByb3ZpZGUgc29tZQorLy8vICAgICAgcHJvdGVjdGlvbiBhZ2FpbnN0IHNvdXJjZSBjb2RlIHNodWZmbGluZywgbGluZSBudW1iZXJzIHNob3VsZAorLy8vICAgICAgYmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4KKy8vLworLy8vIFRoZSByZWFkZXIgc3VwcG9ydHMgdHdvIGZpbGUgZm9ybWF0czogdGV4dCBhbmQgYmluYXJ5LiBUaGUgdGV4dCBmb3JtYXQKKy8vLyBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgdGVzdGluZywgd2hpbGUgdGhlIGJpbmFyeSBmb3JtYXQgaXMgbW9yZQorLy8vIGNvbXBhY3QgYW5kIEkvTyBlZmZpY2llbnQuIFRoZXkgY2FuIGJvdGggYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkuCitjbGFzcyBTYW1wbGVQcm9maWxlUmVhZGVyIHsKK3B1YmxpYzoKKyAgU2FtcGxlUHJvZmlsZVJlYWRlcihzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBCLCBMTFZNQ29udGV4dCAmQykKKyAgICAgIDogUHJvZmlsZXMoMCksIEN0eChDKSwgQnVmZmVyKHN0ZDo6bW92ZShCKSkge30KKworICB2aXJ0dWFsIH5TYW1wbGVQcm9maWxlUmVhZGVyKCkgPSBkZWZhdWx0OworCisgIC8vLyBcYnJpZWYgUmVhZCBhbmQgdmFsaWRhdGUgdGhlIGZpbGUgaGVhZGVyLgorICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZSByZWFkSGVhZGVyKCkgPSAwOworCisgIC8vLyBcYnJpZWYgUmVhZCBzYW1wbGUgcHJvZmlsZXMgZnJvbSB0aGUgYXNzb2NpYXRlZCBmaWxlLgorICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZSByZWFkKCkgPSAwOworCisgIC8vLyBcYnJpZWYgUHJpbnQgdGhlIHByb2ZpbGUgZm9yIFxwIEZOYW1lIG9uIHN0cmVhbSBccCBPUy4KKyAgdm9pZCBkdW1wRnVuY3Rpb25Qcm9maWxlKFN0cmluZ1JlZiBGTmFtZSwgcmF3X29zdHJlYW0gJk9TID0gZGJncygpKTsKKworICAvLy8gXGJyaWVmIFByaW50IGFsbCB0aGUgcHJvZmlsZXMgb24gc3RyZWFtIFxwIE9TLgorICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TID0gZGJncygpKTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgc2FtcGxlcyBjb2xsZWN0ZWQgZm9yIGZ1bmN0aW9uIFxwIEYuCisgIEZ1bmN0aW9uU2FtcGxlcyAqZ2V0U2FtcGxlc0Zvcihjb25zdCBGdW5jdGlvbiAmRikgeworICAgIC8vIFRoZSBmdW5jdGlvbiBuYW1lIG1heSBoYXZlIGJlZW4gdXBkYXRlZCBieSBhZGRpbmcgc3VmZml4LiBJbiBzYW1wbGUKKyAgICAvLyBwcm9maWxlLCB0aGUgZnVuY3Rpb24gbmFtZXMgYXJlIGFsbCBzdHJpcHBlZCwgc28gd2UgbmVlZCB0byBzdHJpcAorICAgIC8vIHRoZSBmdW5jdGlvbiBuYW1lIHN1ZmZpeCBiZWZvcmUgbWF0Y2hpbmcgd2l0aCBwcm9maWxlLgorICAgIGlmIChQcm9maWxlcy5jb3VudChGLmdldE5hbWUoKS5zcGxpdCgnLicpLmZpcnN0KSkKKyAgICAgIHJldHVybiAmUHJvZmlsZXNbKEYuZ2V0TmFtZSgpLnNwbGl0KCcuJykuZmlyc3QpXTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGFsbCB0aGUgcHJvZmlsZXMuCisgIFN0cmluZ01hcDxGdW5jdGlvblNhbXBsZXM+ICZnZXRQcm9maWxlcygpIHsgcmV0dXJuIFByb2ZpbGVzOyB9CisKKyAgLy8vIFxicmllZiBSZXBvcnQgYSBwYXJzZSBlcnJvciBtZXNzYWdlLgorICB2b2lkIHJlcG9ydEVycm9yKGludDY0X3QgTGluZU51bWJlciwgVHdpbmUgTXNnKSBjb25zdCB7CisgICAgQ3R4LmRpYWdub3NlKERpYWdub3N0aWNJbmZvU2FtcGxlUHJvZmlsZShCdWZmZXItPmdldEJ1ZmZlcklkZW50aWZpZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVOdW1iZXIsIE1zZykpOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBzYW1wbGUgcHJvZmlsZSByZWFkZXIgYXBwcm9wcmlhdGUgdG8gdGhlIGZpbGUgZm9ybWF0LgorICBzdGF0aWMgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8U2FtcGxlUHJvZmlsZVJlYWRlcj4+CisgIGNyZWF0ZShjb25zdCBUd2luZSAmRmlsZW5hbWUsIExMVk1Db250ZXh0ICZDKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIHNhbXBsZSBwcm9maWxlIHJlYWRlciBmcm9tIHRoZSBzdXBwbGllZCBtZW1vcnkgYnVmZmVyLgorICBzdGF0aWMgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8U2FtcGxlUHJvZmlsZVJlYWRlcj4+CisgIGNyZWF0ZShzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiAmQiwgTExWTUNvbnRleHQgJkMpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBwcm9maWxlIHN1bW1hcnkuCisgIFByb2ZpbGVTdW1tYXJ5ICZnZXRTdW1tYXJ5KCkgeyByZXR1cm4gKihTdW1tYXJ5LmdldCgpKTsgfQorCitwcm90ZWN0ZWQ6CisgIC8vLyBcYnJpZWYgTWFwIGV2ZXJ5IGZ1bmN0aW9uIHRvIGl0cyBhc3NvY2lhdGVkIHByb2ZpbGUuCisgIC8vLworICAvLy8gVGhlIHByb2ZpbGUgb2YgZXZlcnkgZnVuY3Rpb24gZXhlY3V0ZWQgYXQgcnVudGltZSBpcyBjb2xsZWN0ZWQKKyAgLy8vIGluIHRoZSBzdHJ1Y3R1cmUgRnVuY3Rpb25TYW1wbGVzLiBUaGlzIG1hcHMgZnVuY3Rpb24gb2JqZWN0cworICAvLy8gdG8gdGhlaXIgY29ycmVzcG9uZGluZyBwcm9maWxlcy4KKyAgU3RyaW5nTWFwPEZ1bmN0aW9uU2FtcGxlcz4gUHJvZmlsZXM7CisKKyAgLy8vIFxicmllZiBMTFZNIGNvbnRleHQgdXNlZCB0byBlbWl0IGRpYWdub3N0aWNzLgorICBMTFZNQ29udGV4dCAmQ3R4OworCisgIC8vLyBcYnJpZWYgTWVtb3J5IGJ1ZmZlciBob2xkaW5nIHRoZSBwcm9maWxlIGZpbGUuCisgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IEJ1ZmZlcjsKKworICAvLy8gXGJyaWVmIFByb2ZpbGUgc3VtbWFyeSBpbmZvcm1hdGlvbi4KKyAgc3RkOjp1bmlxdWVfcHRyPFByb2ZpbGVTdW1tYXJ5PiBTdW1tYXJ5OworCisgIC8vLyBcYnJpZWYgQ29tcHV0ZSBzdW1tYXJ5IGZvciB0aGlzIHByb2ZpbGUuCisgIHZvaWQgY29tcHV0ZVN1bW1hcnkoKTsKK307CisKK2NsYXNzIFNhbXBsZVByb2ZpbGVSZWFkZXJUZXh0IDogcHVibGljIFNhbXBsZVByb2ZpbGVSZWFkZXIgeworcHVibGljOgorICBTYW1wbGVQcm9maWxlUmVhZGVyVGV4dChzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBCLCBMTFZNQ29udGV4dCAmQykKKyAgICAgIDogU2FtcGxlUHJvZmlsZVJlYWRlcihzdGQ6Om1vdmUoQiksIEMpIHt9CisKKyAgLy8vIFxicmllZiBSZWFkIGFuZCB2YWxpZGF0ZSB0aGUgZmlsZSBoZWFkZXIuCisgIHN0ZDo6ZXJyb3JfY29kZSByZWFkSGVhZGVyKCkgb3ZlcnJpZGUgeyByZXR1cm4gc2FtcGxlcHJvZl9lcnJvcjo6c3VjY2VzczsgfQorCisgIC8vLyBcYnJpZWYgUmVhZCBzYW1wbGUgcHJvZmlsZXMgZnJvbSB0aGUgYXNzb2NpYXRlZCBmaWxlLgorICBzdGQ6OmVycm9yX2NvZGUgcmVhZCgpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgXHAgQnVmZmVyIGlzIGluIHRoZSBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoaXMgY2xhc3MuCisgIHN0YXRpYyBib29sIGhhc0Zvcm1hdChjb25zdCBNZW1vcnlCdWZmZXIgJkJ1ZmZlcik7Cit9OworCitjbGFzcyBTYW1wbGVQcm9maWxlUmVhZGVyQmluYXJ5IDogcHVibGljIFNhbXBsZVByb2ZpbGVSZWFkZXIgeworcHVibGljOgorICBTYW1wbGVQcm9maWxlUmVhZGVyQmluYXJ5KHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IEIsIExMVk1Db250ZXh0ICZDKQorICAgICAgOiBTYW1wbGVQcm9maWxlUmVhZGVyKHN0ZDo6bW92ZShCKSwgQykge30KKworICAvLy8gXGJyaWVmIFJlYWQgYW5kIHZhbGlkYXRlIHRoZSBmaWxlIGhlYWRlci4KKyAgc3RkOjplcnJvcl9jb2RlIHJlYWRIZWFkZXIoKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFJlYWQgc2FtcGxlIHByb2ZpbGVzIGZyb20gdGhlIGFzc29jaWF0ZWQgZmlsZS4KKyAgc3RkOjplcnJvcl9jb2RlIHJlYWQoKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIFxwIEJ1ZmZlciBpcyBpbiB0aGUgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGlzIGNsYXNzLgorICBzdGF0aWMgYm9vbCBoYXNGb3JtYXQoY29uc3QgTWVtb3J5QnVmZmVyICZCdWZmZXIpOworCitwcm90ZWN0ZWQ6CisgIC8vLyBcYnJpZWYgUmVhZCBhIG51bWVyaWMgdmFsdWUgb2YgdHlwZSBUIGZyb20gdGhlIHByb2ZpbGUuCisgIC8vLworICAvLy8gSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBkZWNvZGluZywgYSBkaWFnbm9zdGljIG1lc3NhZ2UgaXMgZW1pdHRlZCBhbmQKKyAgLy8vIEVDIGlzIHNldC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgcmVhZCB2YWx1ZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEVycm9yT3I8VD4gcmVhZE51bWJlcigpOworCisgIC8vLyBcYnJpZWYgUmVhZCBhIHN0cmluZyBmcm9tIHRoZSBwcm9maWxlLgorICAvLy8KKyAgLy8vIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgZGVjb2RpbmcsIGEgZGlhZ25vc3RpYyBtZXNzYWdlIGlzIGVtaXR0ZWQgYW5kCisgIC8vLyBFQyBpcyBzZXQuCisgIC8vLworICAvLy8gXHJldHVybnMgdGhlIHJlYWQgdmFsdWUuCisgIEVycm9yT3I8U3RyaW5nUmVmPiByZWFkU3RyaW5nKCk7CisKKyAgLy8vIFJlYWQgYSBzdHJpbmcgaW5kaXJlY3RseSB2aWEgdGhlIG5hbWUgdGFibGUuCisgIEVycm9yT3I8U3RyaW5nUmVmPiByZWFkU3RyaW5nRnJvbVRhYmxlKCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgZmlsZS4KKyAgYm9vbCBhdF9lb2YoKSBjb25zdCB7IHJldHVybiBEYXRhID49IEVuZDsgfQorCisgIC8vLyBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gcHJvZmlsZSBpbnN0YW5jZS4KKyAgc3RkOjplcnJvcl9jb2RlIHJlYWRQcm9maWxlKEZ1bmN0aW9uU2FtcGxlcyAmRlByb2ZpbGUpOworCisgIC8vLyBcYnJpZWYgUG9pbnRzIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBidWZmZXIuCisgIGNvbnN0IHVpbnQ4X3QgKkRhdGEgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgUG9pbnRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAgY29uc3QgdWludDhfdCAqRW5kID0gbnVsbHB0cjsKKworICAvLy8gRnVuY3Rpb24gbmFtZSB0YWJsZS4KKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBOYW1lVGFibGU7CisKK3ByaXZhdGU6CisgIHN0ZDo6ZXJyb3JfY29kZSByZWFkU3VtbWFyeUVudHJ5KHN0ZDo6dmVjdG9yPFByb2ZpbGVTdW1tYXJ5RW50cnk+ICZFbnRyaWVzKTsKKworICAvLy8gXGJyaWVmIFJlYWQgcHJvZmlsZSBzdW1tYXJ5LgorICBzdGQ6OmVycm9yX2NvZGUgcmVhZFN1bW1hcnkoKTsKK307CisKK3VzaW5nIElubGluZUNhbGxTdGFjayA9IFNtYWxsVmVjdG9yPEZ1bmN0aW9uU2FtcGxlcyAqLCAxMD47CisKKy8vIFN1cHBvcnRlZCBoaXN0b2dyYW0gdHlwZXMgaW4gR0NDLiAgQ3VycmVudGx5LCB3ZSBvbmx5IG5lZWQgc3VwcG9ydCBmb3IKKy8vIGNhbGwgdGFyZ2V0IGhpc3RvZ3JhbXMuCitlbnVtIEhpc3RUeXBlIHsKKyAgSElTVF9UWVBFX0lOVEVSVkFMLAorICBISVNUX1RZUEVfUE9XMiwKKyAgSElTVF9UWVBFX1NJTkdMRV9WQUxVRSwKKyAgSElTVF9UWVBFX0NPTlNUX0RFTFRBLAorICBISVNUX1RZUEVfSU5ESVJfQ0FMTCwKKyAgSElTVF9UWVBFX0FWRVJBR0UsCisgIEhJU1RfVFlQRV9JT1IsCisgIEhJU1RfVFlQRV9JTkRJUl9DQUxMX1RPUE4KK307CisKK2NsYXNzIFNhbXBsZVByb2ZpbGVSZWFkZXJHQ0MgOiBwdWJsaWMgU2FtcGxlUHJvZmlsZVJlYWRlciB7CitwdWJsaWM6CisgIFNhbXBsZVByb2ZpbGVSZWFkZXJHQ0Moc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gQiwgTExWTUNvbnRleHQgJkMpCisgICAgICA6IFNhbXBsZVByb2ZpbGVSZWFkZXIoc3RkOjptb3ZlKEIpLCBDKSwgR2NvdkJ1ZmZlcihCdWZmZXIuZ2V0KCkpIHt9CisKKyAgLy8vIFxicmllZiBSZWFkIGFuZCB2YWxpZGF0ZSB0aGUgZmlsZSBoZWFkZXIuCisgIHN0ZDo6ZXJyb3JfY29kZSByZWFkSGVhZGVyKCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBSZWFkIHNhbXBsZSBwcm9maWxlcyBmcm9tIHRoZSBhc3NvY2lhdGVkIGZpbGUuCisgIHN0ZDo6ZXJyb3JfY29kZSByZWFkKCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBccCBCdWZmZXIgaXMgaW4gdGhlIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhpcyBjbGFzcy4KKyAgc3RhdGljIGJvb2wgaGFzRm9ybWF0KGNvbnN0IE1lbW9yeUJ1ZmZlciAmQnVmZmVyKTsKKworcHJvdGVjdGVkOgorICBzdGQ6OmVycm9yX2NvZGUgcmVhZE5hbWVUYWJsZSgpOworICBzdGQ6OmVycm9yX2NvZGUgcmVhZE9uZUZ1bmN0aW9uUHJvZmlsZShjb25zdCBJbmxpbmVDYWxsU3RhY2sgJklubGluZVN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVwZGF0ZSwgdWludDMyX3QgT2Zmc2V0KTsKKyAgc3RkOjplcnJvcl9jb2RlIHJlYWRGdW5jdGlvblByb2ZpbGVzKCk7CisgIHN0ZDo6ZXJyb3JfY29kZSBza2lwTmV4dFdvcmQoKTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEVycm9yT3I8VD4gcmVhZE51bWJlcigpOworICBFcnJvck9yPFN0cmluZ1JlZj4gcmVhZFN0cmluZygpOworCisgIC8vLyBcYnJpZWYgUmVhZCB0aGUgc2VjdGlvbiB0YWcgYW5kIGNoZWNrIHRoYXQgaXQncyB0aGUgc2FtZSBhcyBccCBFeHBlY3RlZC4KKyAgc3RkOjplcnJvcl9jb2RlIHJlYWRTZWN0aW9uVGFnKHVpbnQzMl90IEV4cGVjdGVkKTsKKworICAvLy8gR0NPViBidWZmZXIgY29udGFpbmluZyB0aGUgcHJvZmlsZS4KKyAgR0NPVkJ1ZmZlciBHY292QnVmZmVyOworCisgIC8vLyBGdW5jdGlvbiBuYW1lcyBpbiB0aGlzIHByb2ZpbGUuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBOYW1lczsKKworICAvLy8gR0NPViB0YWdzIHVzZWQgdG8gc2VwYXJhdGUgc2VjdGlvbnMgaW4gdGhlIHByb2ZpbGUgZmlsZS4KKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEdDT1ZUYWdBRkRPRmlsZU5hbWVzID0gMHhhYTAwMDAwMDsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEdDT1ZUYWdBRkRPRnVuY3Rpb24gPSAweGFjMDAwMDAwOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHNhbXBsZXByb2YKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fUFJPRklMRURBVEFfU0FNUExFUFJPRlJFQURFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL1NhbXBsZVByb2ZXcml0ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvU2FtcGxlUHJvZldyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YWYxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL1NhbXBsZVByb2ZXcml0ZXIuaApAQCAtMCwwICsxLDEzMyBAQAorLy89PT0tIFNhbXBsZVByb2ZXcml0ZXIuaCAtIFdyaXRlIExMVk0gc2FtcGxlIHByb2ZpbGUgZGF0YSAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIG5lZWRlZCBmb3Igd3JpdGluZyBzYW1wbGUgcHJvZmlsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9QUk9GSUxFREFUQV9TQU1QTEVQUk9GV1JJVEVSX0gKKyNkZWZpbmUgTExWTV9QUk9GSUxFREFUQV9TQU1QTEVQUk9GV1JJVEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL01hcFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvUHJvZmlsZVN1bW1hcnkuaCIKKyNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL1NhbXBsZVByb2YuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JPci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzYW1wbGVwcm9mIHsKKworZW51bSBTYW1wbGVQcm9maWxlRm9ybWF0IHsgU1BGX05vbmUgPSAwLCBTUEZfVGV4dCwgU1BGX0JpbmFyeSwgU1BGX0dDQyB9OworCisvLy8gXGJyaWVmIFNhbXBsZS1iYXNlZCBwcm9maWxlIHdyaXRlci4gQmFzZSBjbGFzcy4KK2NsYXNzIFNhbXBsZVByb2ZpbGVXcml0ZXIgeworcHVibGljOgorICB2aXJ0dWFsIH5TYW1wbGVQcm9maWxlV3JpdGVyKCkgPSBkZWZhdWx0OworCisgIC8vLyBXcml0ZSBzYW1wbGUgcHJvZmlsZXMgaW4gXHAgUy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBzdGF0dXMgY29kZSBvZiB0aGUgZmlsZSB1cGRhdGUgb3BlcmF0aW9uLgorICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZSB3cml0ZShjb25zdCBGdW5jdGlvblNhbXBsZXMgJlMpID0gMDsKKworICAvLy8gV3JpdGUgYWxsIHRoZSBzYW1wbGUgcHJvZmlsZXMgaW4gdGhlIGdpdmVuIG1hcCBvZiBzYW1wbGVzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHN0YXR1cyBjb2RlIG9mIHRoZSBmaWxlIHVwZGF0ZSBvcGVyYXRpb24uCisgIHN0ZDo6ZXJyb3JfY29kZSB3cml0ZShjb25zdCBTdHJpbmdNYXA8RnVuY3Rpb25TYW1wbGVzPiAmUHJvZmlsZU1hcCk7CisKKyAgcmF3X29zdHJlYW0gJmdldE91dHB1dFN0cmVhbSgpIHsgcmV0dXJuICpPdXRwdXRTdHJlYW07IH0KKworICAvLy8gUHJvZmlsZSB3cml0ZXIgZmFjdG9yeS4KKyAgLy8vCisgIC8vLyBDcmVhdGUgYSBuZXcgZmlsZSB3cml0ZXIgYmFzZWQgb24gdGhlIHZhbHVlIG9mIFxwIEZvcm1hdC4KKyAgc3RhdGljIEVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPFNhbXBsZVByb2ZpbGVXcml0ZXI+PgorICBjcmVhdGUoU3RyaW5nUmVmIEZpbGVuYW1lLCBTYW1wbGVQcm9maWxlRm9ybWF0IEZvcm1hdCk7CisKKyAgLy8vIENyZWF0ZSBhIG5ldyBzdHJlYW0gd3JpdGVyIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBccCBGb3JtYXQuCisgIC8vLyBGb3IgdGVzdGluZy4KKyAgc3RhdGljIEVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPFNhbXBsZVByb2ZpbGVXcml0ZXI+PgorICBjcmVhdGUoc3RkOjp1bmlxdWVfcHRyPHJhd19vc3RyZWFtPiAmT1MsIFNhbXBsZVByb2ZpbGVGb3JtYXQgRm9ybWF0KTsKKworcHJvdGVjdGVkOgorICBTYW1wbGVQcm9maWxlV3JpdGVyKHN0ZDo6dW5pcXVlX3B0cjxyYXdfb3N0cmVhbT4gJk9TKQorICAgICAgOiBPdXRwdXRTdHJlYW0oc3RkOjptb3ZlKE9TKSkge30KKworICAvLy8gXGJyaWVmIFdyaXRlIGEgZmlsZSBoZWFkZXIgZm9yIHRoZSBwcm9maWxlIGZpbGUuCisgIHZpcnR1YWwgc3RkOjplcnJvcl9jb2RlCisgIHdyaXRlSGVhZGVyKGNvbnN0IFN0cmluZ01hcDxGdW5jdGlvblNhbXBsZXM+ICZQcm9maWxlTWFwKSA9IDA7CisKKyAgLy8vIFxicmllZiBPdXRwdXQgc3RyZWFtIHdoZXJlIHRvIGVtaXQgdGhlIHByb2ZpbGUgdG8uCisgIHN0ZDo6dW5pcXVlX3B0cjxyYXdfb3N0cmVhbT4gT3V0cHV0U3RyZWFtOworCisgIC8vLyBcYnJpZWYgUHJvZmlsZSBzdW1tYXJ5LgorICBzdGQ6OnVuaXF1ZV9wdHI8UHJvZmlsZVN1bW1hcnk+IFN1bW1hcnk7CisKKyAgLy8vIFxicmllZiBDb21wdXRlIHN1bW1hcnkgZm9yIHRoaXMgcHJvZmlsZS4KKyAgdm9pZCBjb21wdXRlU3VtbWFyeShjb25zdCBTdHJpbmdNYXA8RnVuY3Rpb25TYW1wbGVzPiAmUHJvZmlsZU1hcCk7Cit9OworCisvLy8gXGJyaWVmIFNhbXBsZS1iYXNlZCBwcm9maWxlIHdyaXRlciAodGV4dCBmb3JtYXQpLgorY2xhc3MgU2FtcGxlUHJvZmlsZVdyaXRlclRleHQgOiBwdWJsaWMgU2FtcGxlUHJvZmlsZVdyaXRlciB7CitwdWJsaWM6CisgIHN0ZDo6ZXJyb3JfY29kZSB3cml0ZShjb25zdCBGdW5jdGlvblNhbXBsZXMgJlMpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgIFNhbXBsZVByb2ZpbGVXcml0ZXJUZXh0KHN0ZDo6dW5pcXVlX3B0cjxyYXdfb3N0cmVhbT4gJk9TKQorICAgICAgOiBTYW1wbGVQcm9maWxlV3JpdGVyKE9TKSwgSW5kZW50KDApIHt9CisKKyAgc3RkOjplcnJvcl9jb2RlCisgIHdyaXRlSGVhZGVyKGNvbnN0IFN0cmluZ01hcDxGdW5jdGlvblNhbXBsZXM+ICZQcm9maWxlTWFwKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIHNhbXBsZXByb2ZfZXJyb3I6OnN1Y2Nlc3M7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIEluZGVudCBsZXZlbCB0byB1c2Ugd2hlbiB3cml0aW5nLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCB3aGVuIHByaW50aW5nIGlubGluZWQgY2FsbGVlcy4KKyAgdW5zaWduZWQgSW5kZW50OworCisgIGZyaWVuZCBFcnJvck9yPHN0ZDo6dW5pcXVlX3B0cjxTYW1wbGVQcm9maWxlV3JpdGVyPj4KKyAgU2FtcGxlUHJvZmlsZVdyaXRlcjo6Y3JlYXRlKHN0ZDo6dW5pcXVlX3B0cjxyYXdfb3N0cmVhbT4gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlUHJvZmlsZUZvcm1hdCBGb3JtYXQpOworfTsKKworLy8vIFxicmllZiBTYW1wbGUtYmFzZWQgcHJvZmlsZSB3cml0ZXIgKGJpbmFyeSBmb3JtYXQpLgorY2xhc3MgU2FtcGxlUHJvZmlsZVdyaXRlckJpbmFyeSA6IHB1YmxpYyBTYW1wbGVQcm9maWxlV3JpdGVyIHsKK3B1YmxpYzoKKyAgc3RkOjplcnJvcl9jb2RlIHdyaXRlKGNvbnN0IEZ1bmN0aW9uU2FtcGxlcyAmUykgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgU2FtcGxlUHJvZmlsZVdyaXRlckJpbmFyeShzdGQ6OnVuaXF1ZV9wdHI8cmF3X29zdHJlYW0+ICZPUykKKyAgICAgIDogU2FtcGxlUHJvZmlsZVdyaXRlcihPUykge30KKworICBzdGQ6OmVycm9yX2NvZGUKKyAgd3JpdGVIZWFkZXIoY29uc3QgU3RyaW5nTWFwPEZ1bmN0aW9uU2FtcGxlcz4gJlByb2ZpbGVNYXApIG92ZXJyaWRlOworICBzdGQ6OmVycm9yX2NvZGUgd3JpdGVTdW1tYXJ5KCk7CisgIHN0ZDo6ZXJyb3JfY29kZSB3cml0ZU5hbWVJZHgoU3RyaW5nUmVmIEZOYW1lKTsKKyAgc3RkOjplcnJvcl9jb2RlIHdyaXRlQm9keShjb25zdCBGdW5jdGlvblNhbXBsZXMgJlMpOworCitwcml2YXRlOgorICB2b2lkIGFkZE5hbWUoU3RyaW5nUmVmIEZOYW1lKTsKKyAgdm9pZCBhZGROYW1lcyhjb25zdCBGdW5jdGlvblNhbXBsZXMgJlMpOworCisgIE1hcFZlY3RvcjxTdHJpbmdSZWYsIHVpbnQzMl90PiBOYW1lVGFibGU7CisKKyAgZnJpZW5kIEVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPFNhbXBsZVByb2ZpbGVXcml0ZXI+PgorICBTYW1wbGVQcm9maWxlV3JpdGVyOjpjcmVhdGUoc3RkOjp1bmlxdWVfcHRyPHJhd19vc3RyZWFtPiAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVQcm9maWxlRm9ybWF0IEZvcm1hdCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugc2FtcGxlcHJvZgorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fUFJPRklMRURBVEFfU0FNUExFUFJPRldSSVRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQUFyY2g2NFRhcmdldFBhcnNlci5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQUFyY2g2NFRhcmdldFBhcnNlci5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjNzkyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BQXJjaDY0VGFyZ2V0UGFyc2VyLmRlZgpAQCAtMCwwICsxLDEwMyBAQAorLy89PT0tIEFBUkNINjRUYXJnZXRQYXJzZXIuZGVmIC0gQUFSQ0g2NCB0YXJnZXQgcGFyc2luZyBkZWZpbmVzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyBkZWZpbmVzIHRvIGJ1aWxkIHVwIHRoZSBBQVJDSDY0IHRhcmdldCBwYXJzZXIncyBsb2dpYy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBOT1RFOiBOTyBJTkNMVURFIEdVQVJEIERFU0lSRUQhCisKKyNpZm5kZWYgQUFSQ0g2NF9BUkNICisjZGVmaW5lIEFBUkNINjRfQVJDSChOQU1FLCBJRCwgQ1BVX0FUVFIsIFNVQl9BUkNILCBBUkNIX0FUVFIsIEFSQ0hfRlBVLCBBUkNIX0JBU0VfRVhUKQorI2VuZGlmCitBQVJDSDY0X0FSQ0goImludmFsaWQiLCBJTlZBTElELCAiIiwgIiIsCisgICAgICAgICAgICAgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djhfQSwgRktfTk9ORSwgQUFyY2g2NDo6QUVLX05PTkUpCitBQVJDSDY0X0FSQ0goImFybXY4LWEiLCBBUk1WOEEsICI4LUEiLCAidjgiLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2OF9BLAorICAgICAgICAgICAgIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LAorICAgICAgICAgICAgIChBQXJjaDY0OjpBRUtfQ1JZUFRPIHwgQUFyY2g2NDo6QUVLX0ZQIHwgQUFyY2g2NDo6QUVLX1NJTUQpKQorQUFSQ0g2NF9BUkNIKCJhcm12OC4xLWEiLCBBUk1WOF8xQSwgIjguMS1BIiwgInY4LjFhIiwKKyAgICAgICAgICAgICBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2OF9BLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwKKyAgICAgICAgICAgICAoQUFyY2g2NDo6QUVLX0NSQyB8IEFBcmNoNjQ6OkFFS19DUllQVE8gfCBBQXJjaDY0OjpBRUtfRlAgfAorICAgICAgICAgICAgICBBQXJjaDY0OjpBRUtfU0lNRCB8IEFBcmNoNjQ6OkFFS19MU0UgfCBBQXJjaDY0OjpBRUtfUkRNKSkKK0FBUkNINjRfQVJDSCgiYXJtdjguMi1hIiwgQVJNVjhfMkEsICI4LjItQSIsICJ2OC4yYSIsCisgICAgICAgICAgICAgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djhfQSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsCisgICAgICAgICAgICAgKEFBcmNoNjQ6OkFFS19DUkMgfCBBQXJjaDY0OjpBRUtfQ1JZUFRPIHwgQUFyY2g2NDo6QUVLX0ZQIHwKKyAgICAgICAgICAgICAgQUFyY2g2NDo6QUVLX1NJTUQgfCBBQXJjaDY0OjpBRUtfUkFTIHwgQUFyY2g2NDo6QUVLX0xTRSB8CisgICAgICAgICAgICAgIEFBcmNoNjQ6OkFFS19SRE0pKQorQUFSQ0g2NF9BUkNIKCJhcm12OC4zLWEiLCBBUk1WOF8zQSwgIjguMy1BIiwgInY4LjNhIiwKKyAgICAgICAgICAgICBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2OF9BLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwKKyAgICAgICAgICAgICAoQUFyY2g2NDo6QUVLX0NSQyB8IEFBcmNoNjQ6OkFFS19DUllQVE8gfCBBQXJjaDY0OjpBRUtfRlAgfAorICAgICAgICAgICAgICBBQXJjaDY0OjpBRUtfU0lNRCB8IEFBcmNoNjQ6OkFFS19SQVMgfCBBQXJjaDY0OjpBRUtfTFNFIHwKKyAgICAgICAgICAgICAgQUFyY2g2NDo6QUVLX1JETSB8IEFBcmNoNjQ6OkFFS19SQ1BDKSkKKyN1bmRlZiBBQVJDSDY0X0FSQ0gKKworI2lmbmRlZiBBQVJDSDY0X0FSQ0hfRVhUX05BTUUKKyNkZWZpbmUgQUFSQ0g2NF9BUkNIX0VYVF9OQU1FKE5BTUUsIElELCBGRUFUVVJFLCBORUdGRUFUVVJFKQorI2VuZGlmCisvLyBGSVhNRTogVGhpcyB3b3VsZCBiZSBuaWNlciB3ZXJlIGl0IHRhYmxlZ2VuCitBQVJDSDY0X0FSQ0hfRVhUX05BTUUoImludmFsaWQiLCAgQUFyY2g2NDo6QUVLX0lOVkFMSUQsICBudWxscHRyLCAgbnVsbHB0cikKK0FBUkNINjRfQVJDSF9FWFRfTkFNRSgibm9uZSIsICAgICBBQXJjaDY0OjpBRUtfTk9ORSwgICAgIG51bGxwdHIsICBudWxscHRyKQorQUFSQ0g2NF9BUkNIX0VYVF9OQU1FKCJjcmMiLCAgICAgIEFBcmNoNjQ6OkFFS19DUkMsICAgICAgIitjcmMiLCAgICItY3JjIikKK0FBUkNINjRfQVJDSF9FWFRfTkFNRSgibHNlIiwgICAgICBBQXJjaDY0OjpBRUtfTFNFLCAgICAgICIrbHNlIiwgICAiLWxzZSIpCitBQVJDSDY0X0FSQ0hfRVhUX05BTUUoInJkbSIsICAgICAgQUFyY2g2NDo6QUVLX1JETSwgICAgICAiK3JkbSIsICAgIi1yZG0iKQorQUFSQ0g2NF9BUkNIX0VYVF9OQU1FKCJjcnlwdG8iLCAgIEFBcmNoNjQ6OkFFS19DUllQVE8sICAgIitjcnlwdG8iLCItY3J5cHRvIikKK0FBUkNINjRfQVJDSF9FWFRfTkFNRSgiZG90cHJvZCIsICBBQXJjaDY0OjpBRUtfRE9UUFJPRCwgICIrZG90cHJvZCIsIi1kb3Rwcm9kIikKK0FBUkNINjRfQVJDSF9FWFRfTkFNRSgiZnAiLCAgICAgICBBQXJjaDY0OjpBRUtfRlAsICAgICAgICIrZnAtYXJtdjgiLCAgIi1mcC1hcm12OCIpCitBQVJDSDY0X0FSQ0hfRVhUX05BTUUoInNpbWQiLCAgICAgQUFyY2g2NDo6QUVLX1NJTUQsICAgICAiK25lb24iLCAgIi1uZW9uIikKK0FBUkNINjRfQVJDSF9FWFRfTkFNRSgiZnAxNiIsICAgICBBQXJjaDY0OjpBRUtfRlAxNiwgICAgICIrZnVsbGZwMTYiLCAgIi1mdWxsZnAxNiIpCitBQVJDSDY0X0FSQ0hfRVhUX05BTUUoInByb2ZpbGUiLCAgQUFyY2g2NDo6QUVLX1BST0ZJTEUsICAiK3NwZSIsICAiLXNwZSIpCitBQVJDSDY0X0FSQ0hfRVhUX05BTUUoInJhcyIsICAgICAgQUFyY2g2NDo6QUVLX1JBUywgICAgICAiK3JhcyIsICAiLXJhcyIpCitBQVJDSDY0X0FSQ0hfRVhUX05BTUUoInN2ZSIsICAgICAgQUFyY2g2NDo6QUVLX1NWRSwgICAgICAiK3N2ZSIsICAiLXN2ZSIpCitBQVJDSDY0X0FSQ0hfRVhUX05BTUUoInJjcGMiLCAgICAgQUFyY2g2NDo6QUVLX1JDUEMsICAgICAiK3JjcGMiLCAiLXJjcGMiKQorI3VuZGVmIEFBUkNINjRfQVJDSF9FWFRfTkFNRQorCisjaWZuZGVmIEFBUkNINjRfQ1BVX05BTUUKKyNkZWZpbmUgQUFSQ0g2NF9DUFVfTkFNRShOQU1FLCBJRCwgREVGQVVMVF9GUFUsIElTX0RFRkFVTFQsIERFRkFVTFRfRVhUKQorI2VuZGlmCitBQVJDSDY0X0NQVV9OQU1FKCJjb3J0ZXgtYTM1IiwgQVJNVjhBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsCisgICAgICAgICAgICAgICAgKEFBcmNoNjQ6OkFFS19DUkMpKQorQUFSQ0g2NF9DUFVfTkFNRSgiY29ydGV4LWE1MyIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIHRydWUsCisgICAgICAgICAgICAgICAgKEFBcmNoNjQ6OkFFS19DUkMpKQorQUFSQ0g2NF9DUFVfTkFNRSgiY29ydGV4LWE1NSIsIEFSTVY4XzJBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsCisgICAgICAgICAgICAgICAgIChBQXJjaDY0OjpBRUtfRlAxNiB8IEFBcmNoNjQ6OkFFS19ET1RQUk9EIHwgQUFyY2g2NDo6QUVLX1JDUEMpKQorQUFSQ0g2NF9DUFVfTkFNRSgiY29ydGV4LWE1NyIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLAorICAgICAgICAgICAgICAgIChBQXJjaDY0OjpBRUtfQ1JDKSkKK0FBUkNINjRfQ1BVX05BTUUoImNvcnRleC1hNzIiLCBBUk1WOEEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAoQUFyY2g2NDo6QUVLX0NSQykpCitBQVJDSDY0X0NQVV9OQU1FKCJjb3J0ZXgtYTczIiwgQVJNVjhBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsCisgICAgICAgICAgICAgICAgKEFBcmNoNjQ6OkFFS19DUkMpKQorQUFSQ0g2NF9DUFVfTkFNRSgiY29ydGV4LWE3NSIsIEFSTVY4XzJBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsCisgICAgICAgICAgICAgICAgIChBQXJjaDY0OjpBRUtfRlAxNiB8IEFBcmNoNjQ6OkFFS19ET1RQUk9EIHwgQUFyY2g2NDo6QUVLX1JDUEMpKQorQUFSQ0g2NF9DUFVfTkFNRSgiY3ljbG9uZSIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLAorICAgICAgICAgICAgICAgIChBQXJjaDY0OjpBRUtfTk9ORSkpCitBQVJDSDY0X0NQVV9OQU1FKCJleHlub3MtbTEiLCBBUk1WOEEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAoQUFyY2g2NDo6QUVLX0NSQykpCitBQVJDSDY0X0NQVV9OQU1FKCJleHlub3MtbTIiLCBBUk1WOEEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAoQUFyY2g2NDo6QUVLX0NSQykpCitBQVJDSDY0X0NQVV9OQU1FKCJleHlub3MtbTMiLCBBUk1WOEEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAoQUFyY2g2NDo6QUVLX0NSQykpCitBQVJDSDY0X0NQVV9OQU1FKCJmYWxrb3IiLCBBUk1WOEEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAoQUFyY2g2NDo6QUVLX0NSQyB8IEFBcmNoNjQ6OkFFS19SRE0pKQorQUFSQ0g2NF9DUFVfTkFNRSgic2FwaGlyYSIsIEFSTVY4XzNBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsCisgICAgICAgICAgICAgICAgKEFBcmNoNjQ6OkFFS19QUk9GSUxFKSkKK0FBUkNINjRfQ1BVX05BTUUoImtyeW8iLCBBUk1WOEEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAoQUFyY2g2NDo6QUVLX0NSQykpCitBQVJDSDY0X0NQVV9OQU1FKCJ0aHVuZGVyeDJ0OTkiLCBBUk1WOF8xQSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLAorICAgICAgICAgICAgICAgIChBQXJjaDY0OjpBRUtfTk9ORSkpCitBQVJDSDY0X0NQVV9OQU1FKCJ0aHVuZGVyeCIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLAorICAgICAgICAgICAgICAgIChBQXJjaDY0OjpBRUtfQ1JDIHwgQUFyY2g2NDo6QUVLX1BST0ZJTEUpKQorQUFSQ0g2NF9DUFVfTkFNRSgidGh1bmRlcnh0ODgiLCBBUk1WOEEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAoQUFyY2g2NDo6QUVLX0NSQyB8IEFBcmNoNjQ6OkFFS19QUk9GSUxFKSkKK0FBUkNINjRfQ1BVX05BTUUoInRodW5kZXJ4dDgxIiwgQVJNVjhBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsCisgICAgICAgICAgICAgICAgKEFBcmNoNjQ6OkFFS19DUkMgfCBBQXJjaDY0OjpBRUtfUFJPRklMRSkpCitBQVJDSDY0X0NQVV9OQU1FKCJ0aHVuZGVyeHQ4MyIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLAorICAgICAgICAgICAgICAgIChBQXJjaDY0OjpBRUtfQ1JDIHwgQUFyY2g2NDo6QUVLX1BST0ZJTEUpKQorLy8gSW52YWxpZCBDUFUKK0FBUkNINjRfQ1BVX05BTUUoImludmFsaWQiLCBJTlZBTElELCBGS19JTlZBTElELCB0cnVlLCBBQXJjaDY0OjpBRUtfSU5WQUxJRCkKKyN1bmRlZiBBQVJDSDY0X0NQVV9OQU1FCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQU1ER1BVS2VybmVsRGVzY3JpcHRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FNREdQVUtlcm5lbERlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTJjMGMxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FNREdQVUtlcm5lbERlc2NyaXB0b3IuaApAQCAtMCwwICsxLDEzOSBAQAorLy89PT0tLS0gQU1ER1BVS2VybmVsRGVzY3JpcHRvci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgQU1ER1BVIGtlcm5lbCBkZXNjcmlwdG9yIGRlZmluaXRpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgdmlzaXQKKy8vLyBodHRwczovL2xsdm0ub3JnL2RvY3MvQU1ER1BVVXNhZ2UuaHRtbCNrZXJuZWwtZGVzY3JpcHRvci1mb3ItZ2Z4Ni1nZng5CisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQU1ER1BVS0VSTkVMREVTQ1JJUFRPUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9BTURHUFVLRVJORUxERVNDUklQVE9SX0gKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisKKy8vIENyZWF0ZXMgZW51bWVyYXRpb24gZW50cmllcyB1c2VkIGZvciBwYWNraW5nIGJpdHMgaW50byBpbnRlZ2Vycy4gRW51bWVyYXRpb24KKy8vIGVudHJpZXMgaW5jbHVkZSBiaXQgc2hpZnQgYW1vdW50LCBiaXQgd2lkdGgsIGFuZCBiaXQgbWFzay4KKyNkZWZpbmUgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShuYW1lLCBzaGlmdCwgd2lkdGgpIFwKKyAgbmFtZSAjIyBfU0hJRlQgPSAoc2hpZnQpLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZSAjIyBfV0lEVEggPSAod2lkdGgpLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZSA9ICgoKDEgPDwgKHdpZHRoKSkgLSAxKSA8PCAoc2hpZnQpKSAgICAgICAgIFwKKworLy8gR2V0cyBiaXRzIGZvciBzcGVjaWZpZWQgYml0IG1hc2sgZnJvbSBzcGVjaWZpZWQgc291cmNlLgorI2RlZmluZSBBTURHUFVfQklUU19HRVQoc3JjLCBtYXNrKSBcCisgICgoc3JjICYgbWFzaykgPj4gbWFzayAjIyBfU0hJRlQpIFwKKworLy8gU2V0cyBiaXRzIGZvciBzcGVjaWZpZWQgYml0IG1hc2sgaW4gc3BlY2lmaWVkIGRlc3RpbmF0aW9uLgorI2RlZmluZSBBTURHUFVfQklUU19TRVQoZHN0LCBtYXNrLCB2YWwpICAgICBcCisgIGRzdCAmPSAofigxIDw8IG1hc2sgIyMgX1NISUZUKSAmIH5tYXNrKTsgIFwKKyAgZHN0IHw9ICgoKHZhbCkgPDwgbWFzayAjIyBfU0hJRlQpICYgbWFzaykgXAorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgQU1ER1BVIHsKK25hbWVzcGFjZSBIU0FLRCB7CisKKy8vLyBcYnJpZWYgRmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgbW9kZXMuCitlbnVtIDogdWludDhfdCB7CisgIEFNREdQVV9GTE9BVF9ST1VORF9NT0RFX05FQVJfRVZFTiAgICAgID0gMCwKKyAgQU1ER1BVX0ZMT0FUX1JPVU5EX01PREVfUExVU19JTkZJTklUWSAgPSAxLAorICBBTURHUFVfRkxPQVRfUk9VTkRfTU9ERV9NSU5VU19JTkZJTklUWSA9IDIsCisgIEFNREdQVV9GTE9BVF9ST1VORF9NT0RFX1pFUk8gICAgICAgICAgID0gMywKK307CisKKy8vLyBcYnJpZWYgRmxvYXRpbmcgcG9pbnQgZGVub3JtIG1vZGVzLgorZW51bSA6IHVpbnQ4X3QgeworICBBTURHUFVfRkxPQVRfREVOT1JNX01PREVfRkxVU0hfU1JDX0RTVCA9IDAsCisgIEFNREdQVV9GTE9BVF9ERU5PUk1fTU9ERV9GTFVTSF9EU1QgICAgID0gMSwKKyAgQU1ER1BVX0ZMT0FUX0RFTk9STV9NT0RFX0ZMVVNIX1NSQyAgICAgPSAyLAorICBBTURHUFVfRkxPQVRfREVOT1JNX01PREVfRkxVU0hfTk9ORSAgICA9IDMsCit9OworCisvLy8gXGJyaWVmIFN5c3RlbSBWR1BSIHdvcmtpdGVtIElEcy4KK2VudW0gOiB1aW50OF90IHsKKyAgQU1ER1BVX1NZU1RFTV9WR1BSX1dPUktJVEVNX0lEX1ggICAgICAgICA9IDAsCisgIEFNREdQVV9TWVNURU1fVkdQUl9XT1JLSVRFTV9JRF9YX1kgICAgICAgPSAxLAorICBBTURHUFVfU1lTVEVNX1ZHUFJfV09SS0lURU1fSURfWF9ZX1ogICAgID0gMiwKKyAgQU1ER1BVX1NZU1RFTV9WR1BSX1dPUktJVEVNX0lEX1VOREVGSU5FRCA9IDMsCit9OworCisvLy8gXGJyaWVmIENvbXB1dGUgcHJvZ3JhbSByZXNvdXJjZSByZWdpc3RlciBvbmUgbGF5b3V0LgorZW51bSBDb21wdXRlUGdtUnNyYzEgeworICBBTURHUFVfQklUU19FTlVNX0VOVFJZKEdSQU5VTEFURURfV09SS0lURU1fVkdQUl9DT1VOVCwgMCwgNiksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoR1JBTlVMQVRFRF9XQVZFRlJPTlRfU0dQUl9DT1VOVCwgNiwgNCksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoUFJJT1JJVFksIDEwLCAyKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShGTE9BVF9ST1VORF9NT0RFXzMyLCAxMiwgMiksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRkxPQVRfUk9VTkRfTU9ERV8xNl82NCwgMTQsIDIpLAorICBBTURHUFVfQklUU19FTlVNX0VOVFJZKEZMT0FUX0RFTk9STV9NT0RFXzMyLCAxNiwgMiksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRkxPQVRfREVOT1JNX01PREVfMTZfNjQsIDE4LCAyKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShQUklWLCAyMCwgMSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRU5BQkxFX0RYMTBfQ0xBTVAsIDIxLCAxKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShERUJVR19NT0RFLCAyMiwgMSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRU5BQkxFX0lFRUVfTU9ERSwgMjMsIDEpLAorICBBTURHUFVfQklUU19FTlVNX0VOVFJZKEJVTEtZLCAyNCwgMSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoQ0RCR19VU0VSLCAyNSwgMSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRlAxNl9PVkZMLCAyNiwgMSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoUkVTRVJWRUQwLCAyNywgNSksCit9OworCisvLy8gXGJyaWVmIENvbXB1dGUgcHJvZ3JhbSByZXNvdXJjZSByZWdpc3RlciB0d28gbGF5b3V0LgorZW51bSBDb21wdXRlUGdtUnNyYzIgeworICBBTURHUFVfQklUU19FTlVNX0VOVFJZKEVOQUJMRV9TR1BSX1BSSVZBVEVfU0VHTUVOVF9XQVZFX09GRlNFVCwgMCwgMSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoVVNFUl9TR1BSX0NPVU5ULCAxLCA1KSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShFTkFCTEVfVFJBUF9IQU5ETEVSLCA2LCAxKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShFTkFCTEVfU0dQUl9XT1JLR1JPVVBfSURfWCwgNywgMSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRU5BQkxFX1NHUFJfV09SS0dST1VQX0lEX1ksIDgsIDEpLAorICBBTURHUFVfQklUU19FTlVNX0VOVFJZKEVOQUJMRV9TR1BSX1dPUktHUk9VUF9JRF9aLCA5LCAxKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShFTkFCTEVfU0dQUl9XT1JLR1JPVVBfSU5GTywgMTAsIDEpLAorICBBTURHUFVfQklUU19FTlVNX0VOVFJZKEVOQUJMRV9WR1BSX1dPUktJVEVNX0lELCAxMSwgMiksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRU5BQkxFX0VYQ0VQVElPTl9BRERSRVNTX1dBVENILCAxMywgMSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRU5BQkxFX0VYQ0VQVElPTl9NRU1PUlksIDE0LCAxKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShHUkFOVUxBVEVEX0xEU19TSVpFLCAxNSwgOSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRU5BQkxFX0VYQ0VQVElPTl9JRUVFXzc1NF9GUF9JTlZBTElEX09QRVJBVElPTiwgMjQsIDEpLAorICBBTURHUFVfQklUU19FTlVNX0VOVFJZKEVOQUJMRV9FWENFUFRJT05fRlBfREVOT1JNQUxfU09VUkNFLCAyNSwgMSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRU5BQkxFX0VYQ0VQVElPTl9JRUVFXzc1NF9GUF9ESVZJU0lPTl9CWV9aRVJPLCAyNiwgMSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRU5BQkxFX0VYQ0VQVElPTl9JRUVFXzc1NF9GUF9PVkVSRkxPVywgMjcsIDEpLAorICBBTURHUFVfQklUU19FTlVNX0VOVFJZKEVOQUJMRV9FWENFUFRJT05fSUVFRV83NTRfRlBfVU5ERVJGTE9XLCAyOCwgMSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRU5BQkxFX0VYQ0VQVElPTl9JRUVFXzc1NF9GUF9JTkVYQUNULCAyOSwgMSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRU5BQkxFX0VYQ0VQVElPTl9JTlRfRElWSURFX0JZX1pFUk8sIDMwLCAxKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShSRVNFUlZFRDEsIDMxLCAxKSwKK307CisKKy8vLyBcYnJpZWYgS2VybmVsIGRlc2NyaXB0b3IgbGF5b3V0LiBUaGlzIGxheW91dCBzaG91bGQgYmUga2VwdCBiYWNrd2FyZHMKKy8vLyBjb21wYXRpYmxlIGFzIGl0IGlzIGNvbnN1bWVkIGJ5IHRoZSBjb21tYW5kIHByb2Nlc3Nvci4KK3N0cnVjdCBLZXJuZWxEZXNjcmlwdG9yIGZpbmFsIHsKKyAgdWludDMyX3QgR3JvdXBTZWdtZW50Rml4ZWRTaXplOworICB1aW50MzJfdCBQcml2YXRlU2VnbWVudEZpeGVkU2l6ZTsKKyAgdWludDMyX3QgTWF4RmxhdFdvcmtHcm91cFNpemU7CisgIHVpbnQ2NF90IElzRHluYW1pY0NhbGxTdGFjayA6IDE7CisgIHVpbnQ2NF90IElzWE5BQ0tFbmFibGVkIDogMTsKKyAgdWludDY0X3QgUmVzZXJ2ZWQwIDogMzA7CisgIGludDY0X3QgS2VybmVsQ29kZUVudHJ5Qnl0ZU9mZnNldDsKKyAgdWludDY0X3QgUmVzZXJ2ZWQxWzNdOworICB1aW50MzJfdCBDb21wdXRlUGdtUnNyYzE7CisgIHVpbnQzMl90IENvbXB1dGVQZ21Sc3JjMjsKKyAgdWludDY0X3QgRW5hYmxlU0dQUlByaXZhdGVTZWdtZW50QnVmZmVyIDogMTsKKyAgdWludDY0X3QgRW5hYmxlU0dQUkRpc3BhdGNoUHRyIDogMTsKKyAgdWludDY0X3QgRW5hYmxlU0dQUlF1ZXVlUHRyIDogMTsKKyAgdWludDY0X3QgRW5hYmxlU0dQUktlcm5hcmdTZWdtZW50UHRyIDogMTsKKyAgdWludDY0X3QgRW5hYmxlU0dQUkRpc3BhdGNoSUQgOiAxOworICB1aW50NjRfdCBFbmFibGVTR1BSRmxhdFNjcmF0Y2hJbml0IDogMTsKKyAgdWludDY0X3QgRW5hYmxlU0dQUlByaXZhdGVTZWdtZW50U2l6ZSA6IDE7CisgIHVpbnQ2NF90IEVuYWJsZVNHUFJHcmlkV29ya2dyb3VwQ291bnRYIDogMTsKKyAgdWludDY0X3QgRW5hYmxlU0dQUkdyaWRXb3JrZ3JvdXBDb3VudFkgOiAxOworICB1aW50NjRfdCBFbmFibGVTR1BSR3JpZFdvcmtncm91cENvdW50WiA6IDE7CisgIHVpbnQ2NF90IFJlc2VydmVkMiA6IDU0OworCisgIEtlcm5lbERlc2NyaXB0b3IoKSA9IGRlZmF1bHQ7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgSFNBS0QKK30gLy8gZW5kIG5hbWVzcGFjZSBBTURHUFUKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfQU1ER1BVS0VSTkVMREVTQ1JJUFRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQU1ER1BVTWV0YWRhdGEuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BTURHUFVNZXRhZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMDM5YTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQU1ER1BVTWV0YWRhdGEuaApAQCAtMCwwICsxLDQ4MSBAQAorLy89PT0tLS0gQU1ER1BVTWV0YWRhdGEuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgQU1ER1BVIG1ldGFkYXRhIGRlZmluaXRpb25zIGFuZCBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb25zLgorLy8vCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQU1ER1BVTUVUQURBVEFfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQU1ER1BVTUVUQURBVEFfSAorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIEFNREdQVSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBIU0EgbWV0YWRhdGEuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworbmFtZXNwYWNlIEhTQU1EIHsKKworLy8vIFxicmllZiBIU0EgbWV0YWRhdGEgbWFqb3IgdmVyc2lvbi4KK2NvbnN0ZXhwciB1aW50MzJfdCBWZXJzaW9uTWFqb3IgPSAxOworLy8vIFxicmllZiBIU0EgbWV0YWRhdGEgbWlub3IgdmVyc2lvbi4KK2NvbnN0ZXhwciB1aW50MzJfdCBWZXJzaW9uTWlub3IgPSAwOworCisvLy8gXGJyaWVmIEhTQSBtZXRhZGF0YSBiZWdpbm5pbmcgYXNzZW1ibGVyIGRpcmVjdGl2ZS4KK2NvbnN0ZXhwciBjaGFyIEFzc2VtYmxlckRpcmVjdGl2ZUJlZ2luW10gPSAiLmFtZF9hbWRncHVfaHNhX21ldGFkYXRhIjsKKy8vLyBcYnJpZWYgSFNBIG1ldGFkYXRhIGVuZGluZyBhc3NlbWJsZXIgZGlyZWN0aXZlLgorY29uc3RleHByIGNoYXIgQXNzZW1ibGVyRGlyZWN0aXZlRW5kW10gPSAiLmVuZF9hbWRfYW1kZ3B1X2hzYV9tZXRhZGF0YSI7CisKKy8vLyBcYnJpZWYgQWNjZXNzIHF1YWxpZmllcnMuCitlbnVtIGNsYXNzIEFjY2Vzc1F1YWxpZmllciA6IHVpbnQ4X3QgeworICBEZWZhdWx0ICAgPSAwLAorICBSZWFkT25seSAgPSAxLAorICBXcml0ZU9ubHkgPSAyLAorICBSZWFkV3JpdGUgPSAzLAorICBVbmtub3duICAgPSAweGZmCit9OworCisvLy8gXGJyaWVmIEFkZHJlc3Mgc3BhY2UgcXVhbGlmaWVycy4KK2VudW0gY2xhc3MgQWRkcmVzc1NwYWNlUXVhbGlmaWVyIDogdWludDhfdCB7CisgIFByaXZhdGUgID0gMCwKKyAgR2xvYmFsICAgPSAxLAorICBDb25zdGFudCA9IDIsCisgIExvY2FsICAgID0gMywKKyAgR2VuZXJpYyAgPSA0LAorICBSZWdpb24gICA9IDUsCisgIFVua25vd24gID0gMHhmZgorfTsKKworLy8vIFxicmllZiBWYWx1ZSBraW5kcy4KK2VudW0gY2xhc3MgVmFsdWVLaW5kIDogdWludDhfdCB7CisgIEJ5VmFsdWUgICAgICAgICAgICAgICAgPSAwLAorICBHbG9iYWxCdWZmZXIgICAgICAgICAgID0gMSwKKyAgRHluYW1pY1NoYXJlZFBvaW50ZXIgICA9IDIsCisgIFNhbXBsZXIgICAgICAgICAgICAgICAgPSAzLAorICBJbWFnZSAgICAgICAgICAgICAgICAgID0gNCwKKyAgUGlwZSAgICAgICAgICAgICAgICAgICA9IDUsCisgIFF1ZXVlICAgICAgICAgICAgICAgICAgPSA2LAorICBIaWRkZW5HbG9iYWxPZmZzZXRYICAgID0gNywKKyAgSGlkZGVuR2xvYmFsT2Zmc2V0WSAgICA9IDgsCisgIEhpZGRlbkdsb2JhbE9mZnNldFogICAgPSA5LAorICBIaWRkZW5Ob25lICAgICAgICAgICAgID0gMTAsCisgIEhpZGRlblByaW50ZkJ1ZmZlciAgICAgPSAxMSwKKyAgSGlkZGVuRGVmYXVsdFF1ZXVlICAgICA9IDEyLAorICBIaWRkZW5Db21wbGV0aW9uQWN0aW9uID0gMTMsCisgIFVua25vd24gICAgICAgICAgICAgICAgPSAweGZmCit9OworCisvLy8gXGJyaWVmIFZhbHVlIHR5cGVzLgorZW51bSBjbGFzcyBWYWx1ZVR5cGUgOiB1aW50OF90IHsKKyAgU3RydWN0ICA9IDAsCisgIEk4ICAgICAgPSAxLAorICBVOCAgICAgID0gMiwKKyAgSTE2ICAgICA9IDMsCisgIFUxNiAgICAgPSA0LAorICBGMTYgICAgID0gNSwKKyAgSTMyICAgICA9IDYsCisgIFUzMiAgICAgPSA3LAorICBGMzIgICAgID0gOCwKKyAgSTY0ICAgICA9IDksCisgIFU2NCAgICAgPSAxMCwKKyAgRjY0ICAgICA9IDExLAorICBVbmtub3duID0gMHhmZgorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEtlcm5lbCBNZXRhZGF0YS4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCituYW1lc3BhY2UgS2VybmVsIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEtlcm5lbCBBdHRyaWJ1dGVzIE1ldGFkYXRhLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK25hbWVzcGFjZSBBdHRycyB7CisKK25hbWVzcGFjZSBLZXkgeworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6QXR0cjo6TWV0YWRhdGE6Om1SZXFkV29ya0dyb3VwU2l6ZS4KK2NvbnN0ZXhwciBjaGFyIFJlcWRXb3JrR3JvdXBTaXplW10gPSAiUmVxZFdvcmtHcm91cFNpemUiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6QXR0cjo6TWV0YWRhdGE6Om1Xb3JrR3JvdXBTaXplSGludC4KK2NvbnN0ZXhwciBjaGFyIFdvcmtHcm91cFNpemVIaW50W10gPSAiV29ya0dyb3VwU2l6ZUhpbnQiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6QXR0cjo6TWV0YWRhdGE6Om1WZWNUeXBlSGludC4KK2NvbnN0ZXhwciBjaGFyIFZlY1R5cGVIaW50W10gPSAiVmVjVHlwZUhpbnQiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6QXR0cjo6TWV0YWRhdGE6Om1SdW50aW1lSGFuZGxlLgorY29uc3RleHByIGNoYXIgUnVudGltZUhhbmRsZVtdID0gIlJ1bnRpbWVIYW5kbGUiOworfSAvLyBlbmQgbmFtZXNwYWNlIEtleQorCisvLy8gXGJyaWVmIEluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBrZXJuZWwgYXR0cmlidXRlcyBtZXRhZGF0YS4KK3N0cnVjdCBNZXRhZGF0YSBmaW5hbCB7CisgIC8vLyBcYnJpZWYgJ3JlcWRfd29ya19ncm91cF9zaXplJyBhdHRyaWJ1dGUuIE9wdGlvbmFsLgorICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gbVJlcWRXb3JrR3JvdXBTaXplID0gc3RkOjp2ZWN0b3I8dWludDMyX3Q+KCk7CisgIC8vLyBcYnJpZWYgJ3dvcmtfZ3JvdXBfc2l6ZV9oaW50JyBhdHRyaWJ1dGUuIE9wdGlvbmFsLgorICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gbVdvcmtHcm91cFNpemVIaW50ID0gc3RkOjp2ZWN0b3I8dWludDMyX3Q+KCk7CisgIC8vLyBcYnJpZWYgJ3ZlY190eXBlX2hpbnQnIGF0dHJpYnV0ZS4gT3B0aW9uYWwuCisgIHN0ZDo6c3RyaW5nIG1WZWNUeXBlSGludCA9IHN0ZDo6c3RyaW5nKCk7CisgIC8vLyBcYnJpZWYgRXh0ZXJuYWwgc3ltYm9sIGNyZWF0ZWQgYnkgcnVudGltZSB0byBzdG9yZSB0aGUga2VybmVsIGFkZHJlc3MKKyAgLy8vIGZvciBlbnF1ZXVlZCBibG9ja3MuCisgIHN0ZDo6c3RyaW5nIG1SdW50aW1lSGFuZGxlID0gc3RkOjpzdHJpbmcoKTsKKworICAvLy8gXGJyaWVmIERlZmF1bHQgY29uc3RydWN0b3IuCisgIE1ldGFkYXRhKCkgPSBkZWZhdWx0OworCisgIC8vLyBccmV0dXJucyBUcnVlIGlmIGtlcm5lbCBhdHRyaWJ1dGVzIG1ldGFkYXRhIGlzIGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuICFub3RFbXB0eSgpOworICB9CisKKyAgLy8vIFxyZXR1cm5zIFRydWUgaWYga2VybmVsIGF0dHJpYnV0ZXMgbWV0YWRhdGEgaXMgbm90IGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgbm90RW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuICFtUmVxZFdvcmtHcm91cFNpemUuZW1wdHkoKSB8fCAhbVdvcmtHcm91cFNpemVIaW50LmVtcHR5KCkgfHwKKyAgICAgICAgICAgIW1WZWNUeXBlSGludC5lbXB0eSgpIHx8ICFtUnVudGltZUhhbmRsZS5lbXB0eSgpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQXR0cnMKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEtlcm5lbCBBcmd1bWVudCBNZXRhZGF0YS4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCituYW1lc3BhY2UgQXJnIHsKKworbmFtZXNwYWNlIEtleSB7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpBcmc6Ok1ldGFkYXRhOjptTmFtZS4KK2NvbnN0ZXhwciBjaGFyIE5hbWVbXSA9ICJOYW1lIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkFyZzo6TWV0YWRhdGE6Om1UeXBlTmFtZS4KK2NvbnN0ZXhwciBjaGFyIFR5cGVOYW1lW10gPSAiVHlwZU5hbWUiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6QXJnOjpNZXRhZGF0YTo6bVNpemUuCitjb25zdGV4cHIgY2hhciBTaXplW10gPSAiU2l6ZSI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpBcmc6Ok1ldGFkYXRhOjptQWxpZ24uCitjb25zdGV4cHIgY2hhciBBbGlnbltdID0gIkFsaWduIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkFyZzo6TWV0YWRhdGE6Om1WYWx1ZUtpbmQuCitjb25zdGV4cHIgY2hhciBWYWx1ZUtpbmRbXSA9ICJWYWx1ZUtpbmQiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6QXJnOjpNZXRhZGF0YTo6bVZhbHVlVHlwZS4KK2NvbnN0ZXhwciBjaGFyIFZhbHVlVHlwZVtdID0gIlZhbHVlVHlwZSI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpBcmc6Ok1ldGFkYXRhOjptUG9pbnRlZUFsaWduLgorY29uc3RleHByIGNoYXIgUG9pbnRlZUFsaWduW10gPSAiUG9pbnRlZUFsaWduIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkFyZzo6TWV0YWRhdGE6Om1BZGRyU3BhY2VRdWFsLgorY29uc3RleHByIGNoYXIgQWRkclNwYWNlUXVhbFtdID0gIkFkZHJTcGFjZVF1YWwiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6QXJnOjpNZXRhZGF0YTo6bUFjY1F1YWwuCitjb25zdGV4cHIgY2hhciBBY2NRdWFsW10gPSAiQWNjUXVhbCI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpBcmc6Ok1ldGFkYXRhOjptQWN0dWFsQWNjUXVhbC4KK2NvbnN0ZXhwciBjaGFyIEFjdHVhbEFjY1F1YWxbXSA9ICJBY3R1YWxBY2NRdWFsIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkFyZzo6TWV0YWRhdGE6Om1Jc0NvbnN0LgorY29uc3RleHByIGNoYXIgSXNDb25zdFtdID0gIklzQ29uc3QiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6QXJnOjpNZXRhZGF0YTo6bUlzUmVzdHJpY3QuCitjb25zdGV4cHIgY2hhciBJc1Jlc3RyaWN0W10gPSAiSXNSZXN0cmljdCI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpBcmc6Ok1ldGFkYXRhOjptSXNWb2xhdGlsZS4KK2NvbnN0ZXhwciBjaGFyIElzVm9sYXRpbGVbXSA9ICJJc1ZvbGF0aWxlIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkFyZzo6TWV0YWRhdGE6Om1Jc1BpcGUuCitjb25zdGV4cHIgY2hhciBJc1BpcGVbXSA9ICJJc1BpcGUiOworfSAvLyBlbmQgbmFtZXNwYWNlIEtleQorCisvLy8gXGJyaWVmIEluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBrZXJuZWwgYXJndW1lbnQgbWV0YWRhdGEuCitzdHJ1Y3QgTWV0YWRhdGEgZmluYWwgeworICAvLy8gXGJyaWVmIE5hbWUuIE9wdGlvbmFsLgorICBzdGQ6OnN0cmluZyBtTmFtZSA9IHN0ZDo6c3RyaW5nKCk7CisgIC8vLyBcYnJpZWYgVHlwZSBuYW1lLiBPcHRpb25hbC4KKyAgc3RkOjpzdHJpbmcgbVR5cGVOYW1lID0gc3RkOjpzdHJpbmcoKTsKKyAgLy8vIFxicmllZiBTaXplIGluIGJ5dGVzLiBSZXF1aXJlZC4KKyAgdWludDMyX3QgbVNpemUgPSAwOworICAvLy8gXGJyaWVmIEFsaWdubWVudCBpbiBieXRlcy4gUmVxdWlyZWQuCisgIHVpbnQzMl90IG1BbGlnbiA9IDA7CisgIC8vLyBcYnJpZWYgVmFsdWUga2luZC4gUmVxdWlyZWQuCisgIFZhbHVlS2luZCBtVmFsdWVLaW5kID0gVmFsdWVLaW5kOjpVbmtub3duOworICAvLy8gXGJyaWVmIFZhbHVlIHR5cGUuIFJlcXVpcmVkLgorICBWYWx1ZVR5cGUgbVZhbHVlVHlwZSA9IFZhbHVlVHlwZTo6VW5rbm93bjsKKyAgLy8vIFxicmllZiBQb2ludGVlIGFsaWdubWVudCBpbiBieXRlcy4gT3B0aW9uYWwuCisgIHVpbnQzMl90IG1Qb2ludGVlQWxpZ24gPSAwOworICAvLy8gXGJyaWVmIEFkZHJlc3Mgc3BhY2UgcXVhbGlmaWVyLiBPcHRpb25hbC4KKyAgQWRkcmVzc1NwYWNlUXVhbGlmaWVyIG1BZGRyU3BhY2VRdWFsID0gQWRkcmVzc1NwYWNlUXVhbGlmaWVyOjpVbmtub3duOworICAvLy8gXGJyaWVmIEFjY2VzcyBxdWFsaWZpZXIuIE9wdGlvbmFsLgorICBBY2Nlc3NRdWFsaWZpZXIgbUFjY1F1YWwgPSBBY2Nlc3NRdWFsaWZpZXI6OlVua25vd247CisgIC8vLyBcYnJpZWYgQWN0dWFsIGFjY2VzcyBxdWFsaWZpZXIuIE9wdGlvbmFsLgorICBBY2Nlc3NRdWFsaWZpZXIgbUFjdHVhbEFjY1F1YWwgPSBBY2Nlc3NRdWFsaWZpZXI6OlVua25vd247CisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiAnY29uc3QnIHF1YWxpZmllciBpcyBzcGVjaWZpZWQuIE9wdGlvbmFsLgorICBib29sIG1Jc0NvbnN0ID0gZmFsc2U7CisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiAncmVzdHJpY3QnIHF1YWxpZmllciBpcyBzcGVjaWZpZWQuIE9wdGlvbmFsLgorICBib29sIG1Jc1Jlc3RyaWN0ID0gZmFsc2U7CisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiAndm9sYXRpbGUnIHF1YWxpZmllciBpcyBzcGVjaWZpZWQuIE9wdGlvbmFsLgorICBib29sIG1Jc1ZvbGF0aWxlID0gZmFsc2U7CisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiAncGlwZScgcXVhbGlmaWVyIGlzIHNwZWNpZmllZC4gT3B0aW9uYWwuCisgIGJvb2wgbUlzUGlwZSA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgTWV0YWRhdGEoKSA9IGRlZmF1bHQ7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQXJnCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBLZXJuZWwgQ29kZSBQcm9wZXJ0aWVzIE1ldGFkYXRhLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK25hbWVzcGFjZSBDb2RlUHJvcHMgeworCituYW1lc3BhY2UgS2V5IHsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkNvZGVQcm9wczo6TWV0YWRhdGE6Om1LZXJuYXJnU2VnbWVudFNpemUuCitjb25zdGV4cHIgY2hhciBLZXJuYXJnU2VnbWVudFNpemVbXSA9ICJLZXJuYXJnU2VnbWVudFNpemUiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6Q29kZVByb3BzOjpNZXRhZGF0YTo6bUdyb3VwU2VnbWVudEZpeGVkU2l6ZS4KK2NvbnN0ZXhwciBjaGFyIEdyb3VwU2VnbWVudEZpeGVkU2l6ZVtdID0gIkdyb3VwU2VnbWVudEZpeGVkU2l6ZSI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpDb2RlUHJvcHM6Ok1ldGFkYXRhOjptUHJpdmF0ZVNlZ21lbnRGaXhlZFNpemUuCitjb25zdGV4cHIgY2hhciBQcml2YXRlU2VnbWVudEZpeGVkU2l6ZVtdID0gIlByaXZhdGVTZWdtZW50Rml4ZWRTaXplIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkNvZGVQcm9wczo6TWV0YWRhdGE6Om1LZXJuYXJnU2VnbWVudEFsaWduLgorY29uc3RleHByIGNoYXIgS2VybmFyZ1NlZ21lbnRBbGlnbltdID0gIktlcm5hcmdTZWdtZW50QWxpZ24iOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6Q29kZVByb3BzOjpNZXRhZGF0YTo6bVdhdmVmcm9udFNpemUuCitjb25zdGV4cHIgY2hhciBXYXZlZnJvbnRTaXplW10gPSAiV2F2ZWZyb250U2l6ZSI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpDb2RlUHJvcHM6Ok1ldGFkYXRhOjptTnVtU0dQUnMuCitjb25zdGV4cHIgY2hhciBOdW1TR1BSc1tdID0gIk51bVNHUFJzIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkNvZGVQcm9wczo6TWV0YWRhdGE6Om1OdW1WR1BScy4KK2NvbnN0ZXhwciBjaGFyIE51bVZHUFJzW10gPSAiTnVtVkdQUnMiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6Q29kZVByb3BzOjpNZXRhZGF0YTo6bU1heEZsYXRXb3JrR3JvdXBTaXplLgorY29uc3RleHByIGNoYXIgTWF4RmxhdFdvcmtHcm91cFNpemVbXSA9ICJNYXhGbGF0V29ya0dyb3VwU2l6ZSI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpDb2RlUHJvcHM6Ok1ldGFkYXRhOjptSXNEeW5hbWljQ2FsbFN0YWNrLgorY29uc3RleHByIGNoYXIgSXNEeW5hbWljQ2FsbFN0YWNrW10gPSAiSXNEeW5hbWljQ2FsbFN0YWNrIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkNvZGVQcm9wczo6TWV0YWRhdGE6Om1Jc1hOQUNLRW5hYmxlZC4KK2NvbnN0ZXhwciBjaGFyIElzWE5BQ0tFbmFibGVkW10gPSAiSXNYTkFDS0VuYWJsZWQiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6Q29kZVByb3BzOjpNZXRhZGF0YTo6bU51bVNwaWxsZWRTR1BScy4KK2NvbnN0ZXhwciBjaGFyIE51bVNwaWxsZWRTR1BSc1tdID0gIk51bVNwaWxsZWRTR1BScyI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpDb2RlUHJvcHM6Ok1ldGFkYXRhOjptTnVtU3BpbGxlZFZHUFJzLgorY29uc3RleHByIGNoYXIgTnVtU3BpbGxlZFZHUFJzW10gPSAiTnVtU3BpbGxlZFZHUFJzIjsKK30gLy8gZW5kIG5hbWVzcGFjZSBLZXkKKworLy8vIFxicmllZiBJbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2Yga2VybmVsIGNvZGUgcHJvcGVydGllcyBtZXRhZGF0YS4KK3N0cnVjdCBNZXRhZGF0YSBmaW5hbCB7CisgIC8vLyBcYnJpZWYgU2l6ZSBpbiBieXRlcyBvZiB0aGUga2VybmFyZyBzZWdtZW50IG1lbW9yeS4gS2VybmFyZyBzZWdtZW50IG1lbW9yeQorICAvLy8gaG9sZHMgdGhlIHZhbHVlcyBvZiB0aGUgYXJndW1lbnRzIHRvIHRoZSBrZXJuZWwuIFJlcXVpcmVkLgorICB1aW50NjRfdCBtS2VybmFyZ1NlZ21lbnRTaXplID0gMDsKKyAgLy8vIFxicmllZiBTaXplIGluIGJ5dGVzIG9mIHRoZSBncm91cCBzZWdtZW50IG1lbW9yeSByZXF1aXJlZCBieSBhIHdvcmtncm91cC4KKyAgLy8vIFRoaXMgdmFsdWUgZG9lcyBub3QgaW5jbHVkZSBhbnkgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGdyb3VwIHNlZ21lbnQgbWVtb3J5CisgIC8vLyB0aGF0IG1heSBiZSBhZGRlZCB3aGVuIHRoZSBrZXJuZWwgaXMgZGlzcGF0Y2hlZC4gUmVxdWlyZWQuCisgIHVpbnQzMl90IG1Hcm91cFNlZ21lbnRGaXhlZFNpemUgPSAwOworICAvLy8gXGJyaWVmIFNpemUgaW4gYnl0ZXMgb2YgdGhlIHByaXZhdGUgc2VnbWVudCBtZW1vcnkgcmVxdWlyZWQgYnkgYSB3b3JraXRlbS4KKyAgLy8vIFByaXZhdGUgc2VnbWVudCBtZW1vcnkgaW5jbHVkZXMgYXJnLCBzcGlsbCBhbmQgcHJpdmF0ZSBzZWdtZW50cy4gUmVxdWlyZWQuCisgIHVpbnQzMl90IG1Qcml2YXRlU2VnbWVudEZpeGVkU2l6ZSA9IDA7CisgIC8vLyBcYnJpZWYgTWF4aW11bSBieXRlIGFsaWdubWVudCBvZiB2YXJpYWJsZXMgdXNlZCBieSB0aGUga2VybmVsIGluIHRoZQorICAvLy8ga2VybmFyZyBtZW1vcnkgc2VnbWVudC4gUmVxdWlyZWQuCisgIHVpbnQzMl90IG1LZXJuYXJnU2VnbWVudEFsaWduID0gMDsKKyAgLy8vIFxicmllZiBXYXZlZnJvbnQgc2l6ZS4gUmVxdWlyZWQuCisgIHVpbnQzMl90IG1XYXZlZnJvbnRTaXplID0gMDsKKyAgLy8vIFxicmllZiBUb3RhbCBudW1iZXIgb2YgU0dQUnMgdXNlZCBieSBhIHdhdmVmcm9udC4gT3B0aW9uYWwuCisgIHVpbnQxNl90IG1OdW1TR1BScyA9IDA7CisgIC8vLyBcYnJpZWYgVG90YWwgbnVtYmVyIG9mIFZHUFJzIHVzZWQgYnkgYSB3b3JraXRlbS4gT3B0aW9uYWwuCisgIHVpbnQxNl90IG1OdW1WR1BScyA9IDA7CisgIC8vLyBcYnJpZWYgTWF4aW11bSBmbGF0IHdvcmstZ3JvdXAgc2l6ZSBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbC4gT3B0aW9uYWwuCisgIHVpbnQzMl90IG1NYXhGbGF0V29ya0dyb3VwU2l6ZSA9IDA7CisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGUgZ2VuZXJhdGVkIG1hY2hpbmUgY29kZSBpcyB1c2luZyBhIGR5bmFtaWNhbGx5IHNpemVkCisgIC8vLyBjYWxsIHN0YWNrLiBPcHRpb25hbC4KKyAgYm9vbCBtSXNEeW5hbWljQ2FsbFN0YWNrID0gZmFsc2U7CisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGUgZ2VuZXJhdGVkIG1hY2hpbmUgY29kZSBpcyBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgWE5BQ0suCisgIC8vLyBPcHRpb25hbC4KKyAgYm9vbCBtSXNYTkFDS0VuYWJsZWQgPSBmYWxzZTsKKyAgLy8vIFxicmllZiBOdW1iZXIgb2YgU0dQUnMgc3BpbGxlZCBieSBhIHdhdmVmcm9udC4gT3B0aW9uYWwuCisgIHVpbnQxNl90IG1OdW1TcGlsbGVkU0dQUnMgPSAwOworICAvLy8gXGJyaWVmIE51bWJlciBvZiBWR1BScyBzcGlsbGVkIGJ5IGEgd29ya2l0ZW0uIE9wdGlvbmFsLgorICB1aW50MTZfdCBtTnVtU3BpbGxlZFZHUFJzID0gMDsKKworICAvLy8gXGJyaWVmIERlZmF1bHQgY29uc3RydWN0b3IuCisgIE1ldGFkYXRhKCkgPSBkZWZhdWx0OworCisgIC8vLyBccmV0dXJucyBUcnVlIGlmIGtlcm5lbCBjb2RlIHByb3BlcnRpZXMgbWV0YWRhdGEgaXMgZW1wdHksIGZhbHNlCisgIC8vLyBvdGhlcndpc2UuCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuICFub3RFbXB0eSgpOworICB9CisKKyAgLy8vIFxyZXR1cm5zIFRydWUgaWYga2VybmVsIGNvZGUgcHJvcGVydGllcyBtZXRhZGF0YSBpcyBub3QgZW1wdHksIGZhbHNlCisgIC8vLyBvdGhlcndpc2UuCisgIGJvb2wgbm90RW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDb2RlUHJvcHMKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEtlcm5lbCBEZWJ1ZyBQcm9wZXJ0aWVzIE1ldGFkYXRhLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK25hbWVzcGFjZSBEZWJ1Z1Byb3BzIHsKKworbmFtZXNwYWNlIEtleSB7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpEZWJ1Z1Byb3BzOjpNZXRhZGF0YTo6bURlYnVnZ2VyQUJJVmVyc2lvbi4KK2NvbnN0ZXhwciBjaGFyIERlYnVnZ2VyQUJJVmVyc2lvbltdID0gIkRlYnVnZ2VyQUJJVmVyc2lvbiI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpEZWJ1Z1Byb3BzOjpNZXRhZGF0YTo6bVJlc2VydmVkTnVtVkdQUnMuCitjb25zdGV4cHIgY2hhciBSZXNlcnZlZE51bVZHUFJzW10gPSAiUmVzZXJ2ZWROdW1WR1BScyI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpEZWJ1Z1Byb3BzOjpNZXRhZGF0YTo6bVJlc2VydmVkRmlyc3RWR1BSLgorY29uc3RleHByIGNoYXIgUmVzZXJ2ZWRGaXJzdFZHUFJbXSA9ICJSZXNlcnZlZEZpcnN0VkdQUiI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpEZWJ1Z1Byb3BzOjpNZXRhZGF0YTo6bVByaXZhdGVTZWdtZW50QnVmZmVyU0dQUi4KK2NvbnN0ZXhwciBjaGFyIFByaXZhdGVTZWdtZW50QnVmZmVyU0dQUltdID0gIlByaXZhdGVTZWdtZW50QnVmZmVyU0dQUiI7CisvLy8gXGJyaWVmIEtleSBmb3IKKy8vLyAgICAgS2VybmVsOjpEZWJ1Z1Byb3BzOjpNZXRhZGF0YTo6bVdhdmVmcm9udFByaXZhdGVTZWdtZW50T2Zmc2V0U0dQUi4KK2NvbnN0ZXhwciBjaGFyIFdhdmVmcm9udFByaXZhdGVTZWdtZW50T2Zmc2V0U0dQUltdID0KKyAgICAiV2F2ZWZyb250UHJpdmF0ZVNlZ21lbnRPZmZzZXRTR1BSIjsKK30gLy8gZW5kIG5hbWVzcGFjZSBLZXkKKworLy8vIFxicmllZiBJbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2Yga2VybmVsIGRlYnVnIHByb3BlcnRpZXMgbWV0YWRhdGEuCitzdHJ1Y3QgTWV0YWRhdGEgZmluYWwgeworICAvLy8gXGJyaWVmIERlYnVnZ2VyIEFCSSB2ZXJzaW9uLiBPcHRpb25hbC4KKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IG1EZWJ1Z2dlckFCSVZlcnNpb24gPSBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4oKTsKKyAgLy8vIFxicmllZiBDb25zZWN1dGl2ZSBudW1iZXIgb2YgVkdQUnMgcmVzZXJ2ZWQgZm9yIGRlYnVnZ2VyIHVzZS4gTXVzdCBiZSAwIGlmCisgIC8vLyBtRGVidWdnZXJBQklWZXJzaW9uIGlzIG5vdCBzZXQuIE9wdGlvbmFsLgorICB1aW50MTZfdCBtUmVzZXJ2ZWROdW1WR1BScyA9IDA7CisgIC8vLyBcYnJpZWYgRmlyc3QgZml4ZWQgVkdQUiByZXNlcnZlZC4gTXVzdCBiZSB1aW50MTZfdCgtMSkgaWYKKyAgLy8vIG1EZWJ1Z2dlckFCSVZlcnNpb24gaXMgbm90IHNldCBvciBtUmVzZXJ2ZWRGaXJzdFZHUFIgaXMgMC4gT3B0aW9uYWwuCisgIHVpbnQxNl90IG1SZXNlcnZlZEZpcnN0VkdQUiA9IHVpbnQxNl90KC0xKTsKKyAgLy8vIFxicmllZiBGaXhlZCBTR1BSIG9mIHRoZSBmaXJzdCBvZiA0IFNHUFJzIHVzZWQgdG8gaG9sZCB0aGUgc2NyYXRjaCBWIyB1c2VkCisgIC8vLyBmb3IgdGhlIGVudGlyZSBrZXJuZWwgZXhlY3V0aW9uLiBNdXN0IGJlIHVpbnQxNl90KC0xKSBpZgorICAvLy8gbURlYnVnZ2VyQUJJVmVyc2lvbiBpcyBub3Qgc2V0IG9yIFNHUFIgbm90IHVzZWQgb3Igbm90IGtub3duLiBPcHRpb25hbC4KKyAgdWludDE2X3QgbVByaXZhdGVTZWdtZW50QnVmZmVyU0dQUiA9IHVpbnQxNl90KC0xKTsKKyAgLy8vIFxicmllZiBGaXhlZCBTR1BSIHVzZWQgdG8gaG9sZCB0aGUgd2F2ZSBzY3JhdGNoIG9mZnNldCBmb3IgdGhlIGVudGlyZQorICAvLy8ga2VybmVsIGV4ZWN1dGlvbi4gTXVzdCBiZSB1aW50MTZfdCgtMSkgaWYgbURlYnVnZ2VyQUJJVmVyc2lvbiBpcyBub3Qgc2V0CisgIC8vLyBvciBTR1BSIGlzIG5vdCB1c2VkIG9yIG5vdCBrbm93bi4gT3B0aW9uYWwuCisgIHVpbnQxNl90IG1XYXZlZnJvbnRQcml2YXRlU2VnbWVudE9mZnNldFNHUFIgPSB1aW50MTZfdCgtMSk7CisKKyAgLy8vIFxicmllZiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICBNZXRhZGF0YSgpID0gZGVmYXVsdDsKKworICAvLy8gXHJldHVybnMgVHJ1ZSBpZiBrZXJuZWwgZGVidWcgcHJvcGVydGllcyBtZXRhZGF0YSBpcyBlbXB0eSwgZmFsc2UKKyAgLy8vIG90aGVyd2lzZS4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIW5vdEVtcHR5KCk7CisgIH0KKworICAvLy8gXHJldHVybnMgVHJ1ZSBpZiBrZXJuZWwgZGVidWcgcHJvcGVydGllcyBtZXRhZGF0YSBpcyBub3QgZW1wdHksIGZhbHNlCisgIC8vLyBvdGhlcndpc2UuCisgIGJvb2wgbm90RW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuICFtRGVidWdnZXJBQklWZXJzaW9uLmVtcHR5KCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBEZWJ1Z1Byb3BzCisKK25hbWVzcGFjZSBLZXkgeworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6TWV0YWRhdGE6Om1OYW1lLgorY29uc3RleHByIGNoYXIgTmFtZVtdID0gIk5hbWUiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6TWV0YWRhdGE6Om1TeW1ib2xOYW1lLgorY29uc3RleHByIGNoYXIgU3ltYm9sTmFtZVtdID0gIlN5bWJvbE5hbWUiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6TWV0YWRhdGE6Om1MYW5ndWFnZS4KK2NvbnN0ZXhwciBjaGFyIExhbmd1YWdlW10gPSAiTGFuZ3VhZ2UiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6TWV0YWRhdGE6Om1MYW5ndWFnZVZlcnNpb24uCitjb25zdGV4cHIgY2hhciBMYW5ndWFnZVZlcnNpb25bXSA9ICJMYW5ndWFnZVZlcnNpb24iOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6TWV0YWRhdGE6Om1BdHRycy4KK2NvbnN0ZXhwciBjaGFyIEF0dHJzW10gPSAiQXR0cnMiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6TWV0YWRhdGE6Om1BcmdzLgorY29uc3RleHByIGNoYXIgQXJnc1tdID0gIkFyZ3MiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6TWV0YWRhdGE6Om1Db2RlUHJvcHMuCitjb25zdGV4cHIgY2hhciBDb2RlUHJvcHNbXSA9ICJDb2RlUHJvcHMiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6TWV0YWRhdGE6Om1EZWJ1Z1Byb3BzLgorY29uc3RleHByIGNoYXIgRGVidWdQcm9wc1tdID0gIkRlYnVnUHJvcHMiOworfSAvLyBlbmQgbmFtZXNwYWNlIEtleQorCisvLy8gXGJyaWVmIEluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBrZXJuZWwgbWV0YWRhdGEuCitzdHJ1Y3QgTWV0YWRhdGEgZmluYWwgeworICAvLy8gXGJyaWVmIEtlcm5lbCBzb3VyY2UgbmFtZS4gUmVxdWlyZWQuCisgIHN0ZDo6c3RyaW5nIG1OYW1lID0gc3RkOjpzdHJpbmcoKTsKKyAgLy8vIFxicmllZiBLZXJuZWwgZGVzY3JpcHRvciBuYW1lLiBSZXF1aXJlZC4KKyAgc3RkOjpzdHJpbmcgbVN5bWJvbE5hbWUgPSBzdGQ6OnN0cmluZygpOworICAvLy8gXGJyaWVmIExhbmd1YWdlLiBPcHRpb25hbC4KKyAgc3RkOjpzdHJpbmcgbUxhbmd1YWdlID0gc3RkOjpzdHJpbmcoKTsKKyAgLy8vIFxicmllZiBMYW5ndWFnZSB2ZXJzaW9uLiBPcHRpb25hbC4KKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IG1MYW5ndWFnZVZlcnNpb24gPSBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4oKTsKKyAgLy8vIFxicmllZiBBdHRyaWJ1dGVzIG1ldGFkYXRhLiBPcHRpb25hbC4KKyAgQXR0cnM6Ok1ldGFkYXRhIG1BdHRycyA9IEF0dHJzOjpNZXRhZGF0YSgpOworICAvLy8gXGJyaWVmIEFyZ3VtZW50cyBtZXRhZGF0YS4gT3B0aW9uYWwuCisgIHN0ZDo6dmVjdG9yPEFyZzo6TWV0YWRhdGE+IG1BcmdzID0gc3RkOjp2ZWN0b3I8QXJnOjpNZXRhZGF0YT4oKTsKKyAgLy8vIFxicmllZiBDb2RlIHByb3BlcnRpZXMgbWV0YWRhdGEuIE9wdGlvbmFsLgorICBDb2RlUHJvcHM6Ok1ldGFkYXRhIG1Db2RlUHJvcHMgPSBDb2RlUHJvcHM6Ok1ldGFkYXRhKCk7CisgIC8vLyBcYnJpZWYgRGVidWcgcHJvcGVydGllcyBtZXRhZGF0YS4gT3B0aW9uYWwuCisgIERlYnVnUHJvcHM6Ok1ldGFkYXRhIG1EZWJ1Z1Byb3BzID0gRGVidWdQcm9wczo6TWV0YWRhdGEoKTsKKworICAvLy8gXGJyaWVmIERlZmF1bHQgY29uc3RydWN0b3IuCisgIE1ldGFkYXRhKCkgPSBkZWZhdWx0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEtlcm5lbAorCituYW1lc3BhY2UgS2V5IHsKKy8vLyBcYnJpZWYgS2V5IGZvciBIU0E6Ok1ldGFkYXRhOjptVmVyc2lvbi4KK2NvbnN0ZXhwciBjaGFyIFZlcnNpb25bXSA9ICJWZXJzaW9uIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBIU0E6Ok1ldGFkYXRhOjptUHJpbnRmLgorY29uc3RleHByIGNoYXIgUHJpbnRmW10gPSAiUHJpbnRmIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBIU0E6Ok1ldGFkYXRhOjptS2VybmVscy4KK2NvbnN0ZXhwciBjaGFyIEtlcm5lbHNbXSA9ICJLZXJuZWxzIjsKK30gLy8gZW5kIG5hbWVzcGFjZSBLZXkKKworLy8vIFxicmllZiBJbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgSFNBIG1ldGFkYXRhLgorc3RydWN0IE1ldGFkYXRhIGZpbmFsIHsKKyAgLy8vIFxicmllZiBIU0EgbWV0YWRhdGEgdmVyc2lvbi4gUmVxdWlyZWQuCisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBtVmVyc2lvbiA9IHN0ZDo6dmVjdG9yPHVpbnQzMl90PigpOworICAvLy8gXGJyaWVmIFByaW50ZiBtZXRhZGF0YS4gT3B0aW9uYWwuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUHJpbnRmID0gc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KCk7CisgIC8vLyBcYnJpZWYgS2VybmVscyBtZXRhZGF0YS4gUmVxdWlyZWQuCisgIHN0ZDo6dmVjdG9yPEtlcm5lbDo6TWV0YWRhdGE+IG1LZXJuZWxzID0gc3RkOjp2ZWN0b3I8S2VybmVsOjpNZXRhZGF0YT4oKTsKKworICAvLy8gXGJyaWVmIERlZmF1bHQgY29uc3RydWN0b3IuCisgIE1ldGFkYXRhKCkgPSBkZWZhdWx0OworfTsKKworLy8vIFxicmllZiBDb252ZXJ0cyBccCBTdHJpbmcgdG8gXHAgSFNBTWV0YWRhdGEuCitzdGQ6OmVycm9yX2NvZGUgZnJvbVN0cmluZyhzdGQ6OnN0cmluZyBTdHJpbmcsIE1ldGFkYXRhICZIU0FNZXRhZGF0YSk7CisKKy8vLyBcYnJpZWYgQ29udmVydHMgXHAgSFNBTWV0YWRhdGEgdG8gXHAgU3RyaW5nLgorc3RkOjplcnJvcl9jb2RlIHRvU3RyaW5nKE1ldGFkYXRhIEhTQU1ldGFkYXRhLCBzdGQ6OnN0cmluZyAmU3RyaW5nKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEhTQU1ECisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQQUwgbWV0YWRhdGEuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworbmFtZXNwYWNlIFBBTE1EIHsKKworLy8vIFxicmllZiBQQUwgbWV0YWRhdGEgYXNzZW1ibGVyIGRpcmVjdGl2ZS4KK2NvbnN0ZXhwciBjaGFyIEFzc2VtYmxlckRpcmVjdGl2ZVtdID0gIi5hbWRfYW1kZ3B1X3BhbF9tZXRhZGF0YSI7CisKKy8vLyBcYnJpZWYgUEFMIG1ldGFkYXRhIGtleXMuCitlbnVtIEtleSA6IHVpbnQzMl90IHsKKyAgTFNfTlVNX1VTRURfVkdQUlMgPSAweDEwMDAwMDIxLAorICBIU19OVU1fVVNFRF9WR1BSUyA9IDB4MTAwMDAwMjIsCisgIEVTX05VTV9VU0VEX1ZHUFJTID0gMHgxMDAwMDAyMywKKyAgR1NfTlVNX1VTRURfVkdQUlMgPSAweDEwMDAwMDI0LAorICBWU19OVU1fVVNFRF9WR1BSUyA9IDB4MTAwMDAwMjUsCisgIFBTX05VTV9VU0VEX1ZHUFJTID0gMHgxMDAwMDAyNiwKKyAgQ1NfTlVNX1VTRURfVkdQUlMgPSAweDEwMDAwMDI3LAorCisgIExTX05VTV9VU0VEX1NHUFJTID0gMHgxMDAwMDAyOCwKKyAgSFNfTlVNX1VTRURfU0dQUlMgPSAweDEwMDAwMDI5LAorICBFU19OVU1fVVNFRF9TR1BSUyA9IDB4MTAwMDAwMmEsCisgIEdTX05VTV9VU0VEX1NHUFJTID0gMHgxMDAwMDAyYiwKKyAgVlNfTlVNX1VTRURfU0dQUlMgPSAweDEwMDAwMDJjLAorICBQU19OVU1fVVNFRF9TR1BSUyA9IDB4MTAwMDAwMmQsCisgIENTX05VTV9VU0VEX1NHUFJTID0gMHgxMDAwMDAyZSwKKworICBMU19TQ1JBVENIX1NJWkUgPSAweDEwMDAwMDQ0LAorICBIU19TQ1JBVENIX1NJWkUgPSAweDEwMDAwMDQ1LAorICBFU19TQ1JBVENIX1NJWkUgPSAweDEwMDAwMDQ2LAorICBHU19TQ1JBVENIX1NJWkUgPSAweDEwMDAwMDQ3LAorICBWU19TQ1JBVENIX1NJWkUgPSAweDEwMDAwMDQ4LAorICBQU19TQ1JBVENIX1NJWkUgPSAweDEwMDAwMDQ5LAorICBDU19TQ1JBVENIX1NJWkUgPSAweDEwMDAwMDRhCit9OworCisvLy8gXGJyaWVmIFBBTCBtZXRhZGF0YSByZXByZXNlbnRlZCBhcyBhIHZlY3Rvci4KK3R5cGVkZWYgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IE1ldGFkYXRhOworCisvLy8gXGJyaWVmIENvbnZlcnRzIFxwIFBBTE1ldGFkYXRhIHRvIFxwIFN0cmluZy4KK3N0ZDo6ZXJyb3JfY29kZSB0b1N0cmluZyhjb25zdCBNZXRhZGF0YSAmUEFMTWV0YWRhdGEsIHN0ZDo6c3RyaW5nICZTdHJpbmcpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgUEFMTUQKK30gLy8gZW5kIG5hbWVzcGFjZSBBTURHUFUKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfQU1ER1BVTUVUQURBVEFfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FSTUF0dHJpYnV0ZVBhcnNlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FSTUF0dHJpYnV0ZVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOWYzOTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQVJNQXR0cmlidXRlUGFyc2VyLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8vPT09LS0tIEFSTUF0dHJpYnV0ZVBhcnNlci5oIC0gQVJNIEF0dHJpYnV0ZSBJbmZvcm1hdGlvbiBQcmludGVyIC0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0FSTUFUVFJJQlVURVBBUlNFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9BUk1BVFRSSUJVVEVQQVJTRVJfSAorCisjaW5jbHVkZSAiQVJNQnVpbGRBdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiU2NvcGVkUHJpbnRlci5oIgorCisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBTdHJpbmdSZWY7CisKK2NsYXNzIEFSTUF0dHJpYnV0ZVBhcnNlciB7CisgIFNjb3BlZFByaW50ZXIgKlNXOworCisgIHN0ZDo6bWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4gQXR0cmlidXRlczsKKworICBzdHJ1Y3QgRGlzcGxheUhhbmRsZXIgeworICAgIEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIEF0dHJpYnV0ZTsKKyAgICB2b2lkIChBUk1BdHRyaWJ1dGVQYXJzZXI6OipSb3V0aW5lKShBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICosIHVpbnQzMl90ICYpOworICB9OworICBzdGF0aWMgY29uc3QgRGlzcGxheUhhbmRsZXIgRGlzcGxheVJvdXRpbmVzW107CisKKyAgdWludDY0X3QgUGFyc2VJbnRlZ2VyKGNvbnN0IHVpbnQ4X3QgKkRhdGEsIHVpbnQzMl90ICZPZmZzZXQpOworICBTdHJpbmdSZWYgUGFyc2VTdHJpbmcoY29uc3QgdWludDhfdCAqRGF0YSwgdWludDMyX3QgJk9mZnNldCk7CisKKyAgdm9pZCBJbnRlZ2VyQXR0cmlidXRlKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIFN0cmluZ0F0dHJpYnV0ZShBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworCisgIHZvaWQgUHJpbnRBdHRyaWJ1dGUodW5zaWduZWQgVGFnLCB1bnNpZ25lZCBWYWx1ZSwgU3RyaW5nUmVmIFZhbHVlRGVzYyk7CisKKyAgdm9pZCBDUFVfYXJjaChBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQ1BVX2FyY2hfcHJvZmlsZShBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KTsKKyAgdm9pZCBBUk1fSVNBX3VzZShBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgVEhVTUJfSVNBX3VzZShBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KTsKKyAgdm9pZCBGUF9hcmNoKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIFdNTVhfYXJjaChBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEFkdmFuY2VkX1NJTURfYXJjaChBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIFBDU19jb25maWcoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQUJJX1BDU19SOV91c2UoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEFCSV9QQ1NfUldfZGF0YShBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEFCSV9QQ1NfUk9fZGF0YShBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEFCSV9QQ1NfR09UX3VzZShBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEFCSV9QQ1Nfd2NoYXJfdChBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEFCSV9GUF9yb3VuZGluZyhBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEFCSV9GUF9kZW5vcm1hbChBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEFCSV9GUF9leGNlcHRpb25zKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KTsKKyAgdm9pZCBBQklfRlBfdXNlcl9leGNlcHRpb25zKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEFCSV9GUF9udW1iZXJfbW9kZWwoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQUJJX2FsaWduX25lZWRlZChBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KTsKKyAgdm9pZCBBQklfYWxpZ25fcHJlc2VydmVkKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEFCSV9lbnVtX3NpemUoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQUJJX0hhcmRGUF91c2UoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEFCSV9WRlBfYXJncyhBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEFCSV9XTU1YX2FyZ3MoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQUJJX29wdGltaXphdGlvbl9nb2FscyhBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KTsKKyAgdm9pZCBBQklfRlBfb3B0aW1pemF0aW9uX2dvYWxzKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKkRhdGEsIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIGNvbXBhdGliaWxpdHkoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQ1BVX3VuYWxpZ25lZF9hY2Nlc3MoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEZQX0hQX2V4dGVuc2lvbihBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEFCSV9GUF8xNmJpdF9mb3JtYXQoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgTVBleHRlbnNpb25fdXNlKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgRElWX3VzZShBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KTsKKyAgdm9pZCBEU1BfZXh0ZW5zaW9uKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIFQyRUVfdXNlKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KTsKKyAgdm9pZCBWaXJ0dWFsaXphdGlvbl91c2UoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KTsKKyAgdm9pZCBub2RlZmF1bHRzKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworCisgIHZvaWQgUGFyc2VBdHRyaWJ1dGVMaXN0KGNvbnN0IHVpbnQ4X3QgKkRhdGEsIHVpbnQzMl90ICZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IExlbmd0aCk7CisgIHZvaWQgUGFyc2VJbmRleExpc3QoY29uc3QgdWludDhfdCAqRGF0YSwgdWludDMyX3QgJk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8dWludDhfdD4gJkluZGV4TGlzdCk7CisgIHZvaWQgUGFyc2VTdWJzZWN0aW9uKGNvbnN0IHVpbnQ4X3QgKkRhdGEsIHVpbnQzMl90IExlbmd0aCk7CitwdWJsaWM6CisgIEFSTUF0dHJpYnV0ZVBhcnNlcihTY29wZWRQcmludGVyICpTVykgOiBTVyhTVykge30KKworICBBUk1BdHRyaWJ1dGVQYXJzZXIoKSA6IFNXKG51bGxwdHIpIHsgfQorCisgIHZvaWQgUGFyc2UoQXJyYXlSZWY8dWludDhfdD4gU2VjdGlvbiwgYm9vbCBpc0xpdHRsZSk7CisKKyAgYm9vbCBoYXNBdHRyaWJ1dGUodW5zaWduZWQgVGFnKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJpYnV0ZXMuY291bnQoVGFnKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldEF0dHJpYnV0ZVZhbHVlKHVuc2lnbmVkIFRhZykgY29uc3QgeworICAgIHJldHVybiBBdHRyaWJ1dGVzLmZpbmQoVGFnKS0+c2Vjb25kOworICB9Cit9OworCit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQVJNQnVpbGRBdHRyaWJ1dGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQVJNQnVpbGRBdHRyaWJ1dGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4M2U0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BUk1CdWlsZEF0dHJpYnV0ZXMuaApAQCAtMCwwICsxLDI0NiBAQAorLy89PT0tLSBBUk1CdWlsZEF0dHJpYnV0ZXMuaCAtIEFSTSBCdWlsZCBBdHRyaWJ1dGVzIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgZW51bWVyYXRpb25zIGFuZCBzdXBwb3J0IHJvdXRpbmVzIGZvciBBUk0gYnVpbGQgYXR0cmlidXRlcworLy8gYXMgZGVmaW5lZCBpbiBBUk0gQUJJIGFkZGVuZGEgZG9jdW1lbnQgKEFCSSByZWxlYXNlIDIuMDgpLgorLy8KKy8vIEVMRiBmb3IgdGhlIEFSTSBBcmNoaXRlY3R1cmUgcjIuMDkgLSBOb3ZlbWJlciAzMCwgMjAxMgorLy8KKy8vIGh0dHA6Ly9pbmZvY2VudGVyLmFybS5jb20vaGVscC90b3BpYy9jb20uYXJtLmRvYy5paGkwMDQ0ZS9JSEkwMDQ0RV9hYWVsZi5wZGYKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9BUk1CVUlMREFUVFJJQlVURVNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQVJNQlVJTERBVFRSSUJVVEVTX0gKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworCituYW1lc3BhY2UgQVJNQnVpbGRBdHRycyB7CisKK2VudW0gU3BlY2lhbEF0dHIgeworICAvLyBUaGlzIGlzIGZvciB0aGUgLmNwdSBhc20gYXR0ci4gSXQgdHJhbnNsYXRlcyBpbnRvIG9uZSBvciBtb3JlCisgIC8vIEF0dHJUeXBlIChiZWxvdykgZW50cmllcyBpbiB0aGUgLkFSTS5hdHRyaWJ1dGVzIHNlY3Rpb24gaW4gdGhlIEVMRi4KKyAgU0VMX0NQVQorfTsKKworZW51bSBBdHRyVHlwZSB7CisgIC8vIFJlc3QgY29ycmVzcG9uZCB0byBFTEYvLkFSTS5hdHRyaWJ1dGVzCisgIEZpbGUgICAgICAgICAgICAgICAgICAgICAgPSAxLAorICBDUFVfcmF3X25hbWUgICAgICAgICAgICAgID0gNCwKKyAgQ1BVX25hbWUgICAgICAgICAgICAgICAgICA9IDUsCisgIENQVV9hcmNoICAgICAgICAgICAgICAgICAgPSA2LAorICBDUFVfYXJjaF9wcm9maWxlICAgICAgICAgID0gNywKKyAgQVJNX0lTQV91c2UgICAgICAgICAgICAgICA9IDgsCisgIFRIVU1CX0lTQV91c2UgICAgICAgICAgICAgPSA5LAorICBGUF9hcmNoICAgICAgICAgICAgICAgICAgID0gMTAsCisgIFdNTVhfYXJjaCAgICAgICAgICAgICAgICAgPSAxMSwKKyAgQWR2YW5jZWRfU0lNRF9hcmNoICAgICAgICA9IDEyLAorICBQQ1NfY29uZmlnICAgICAgICAgICAgICAgID0gMTMsCisgIEFCSV9QQ1NfUjlfdXNlICAgICAgICAgICAgPSAxNCwKKyAgQUJJX1BDU19SV19kYXRhICAgICAgICAgICA9IDE1LAorICBBQklfUENTX1JPX2RhdGEgICAgICAgICAgID0gMTYsCisgIEFCSV9QQ1NfR09UX3VzZSAgICAgICAgICAgPSAxNywKKyAgQUJJX1BDU193Y2hhcl90ICAgICAgICAgICA9IDE4LAorICBBQklfRlBfcm91bmRpbmcgICAgICAgICAgID0gMTksCisgIEFCSV9GUF9kZW5vcm1hbCAgICAgICAgICAgPSAyMCwKKyAgQUJJX0ZQX2V4Y2VwdGlvbnMgICAgICAgICA9IDIxLAorICBBQklfRlBfdXNlcl9leGNlcHRpb25zICAgID0gMjIsCisgIEFCSV9GUF9udW1iZXJfbW9kZWwgICAgICAgPSAyMywKKyAgQUJJX2FsaWduX25lZWRlZCAgICAgICAgICA9IDI0LAorICBBQklfYWxpZ25fcHJlc2VydmVkICAgICAgID0gMjUsCisgIEFCSV9lbnVtX3NpemUgICAgICAgICAgICAgPSAyNiwKKyAgQUJJX0hhcmRGUF91c2UgICAgICAgICAgICA9IDI3LAorICBBQklfVkZQX2FyZ3MgICAgICAgICAgICAgID0gMjgsCisgIEFCSV9XTU1YX2FyZ3MgICAgICAgICAgICAgPSAyOSwKKyAgQUJJX29wdGltaXphdGlvbl9nb2FscyAgICA9IDMwLAorICBBQklfRlBfb3B0aW1pemF0aW9uX2dvYWxzID0gMzEsCisgIGNvbXBhdGliaWxpdHkgICAgICAgICAgICAgPSAzMiwKKyAgQ1BVX3VuYWxpZ25lZF9hY2Nlc3MgICAgICA9IDM0LAorICBGUF9IUF9leHRlbnNpb24gICAgICAgICAgID0gMzYsCisgIEFCSV9GUF8xNmJpdF9mb3JtYXQgICAgICAgPSAzOCwKKyAgTVBleHRlbnNpb25fdXNlICAgICAgICAgICA9IDQyLCAvLyByZWNvZGVkIGZyb20gNzAgKEFCSSByMi4wOCkKKyAgRElWX3VzZSAgICAgICAgICAgICAgICAgICA9IDQ0LAorICBEU1BfZXh0ZW5zaW9uICAgICAgICAgICAgID0gNDYsCisgIGFsc29fY29tcGF0aWJsZV93aXRoICAgICAgPSA2NSwKKyAgY29uZm9ybWFuY2UgICAgICAgICAgICAgICA9IDY3LAorICBWaXJ0dWFsaXphdGlvbl91c2UgICAgICAgID0gNjgsCisKKyAgLy8vIExlZ2FjeSBUYWdzCisgIFNlY3Rpb24gICAgICAgICAgICAgICAgICAgPSAyLCAgLy8gZGVwcmVjYXRlZCAoQUJJIHIyLjA5KQorICBTeW1ib2wgICAgICAgICAgICAgICAgICAgID0gMywgIC8vIGRlcHJlY2F0ZWQgKEFCSSByMi4wOSkKKyAgQUJJX2FsaWduOF9uZWVkZWQgICAgICAgICA9IDI0LCAvLyByZW5hbWVkIHRvIEFCSV9hbGlnbl9uZWVkZWQgKEFCSSByMi4wOSkKKyAgQUJJX2FsaWduOF9wcmVzZXJ2ZWQgICAgICA9IDI1LCAvLyByZW5hbWVkIHRvIEFCSV9hbGlnbl9wcmVzZXJ2ZWQgKEFCSSByMi4wOSkKKyAgbm9kZWZhdWx0cyAgICAgICAgICAgICAgICA9IDY0LCAvLyBkZXByZWNhdGVkIChBQkkgcjIuMDkpCisgIFQyRUVfdXNlICAgICAgICAgICAgICAgICAgPSA2NiwgLy8gZGVwcmVjYXRlZCAoQUJJIHIyLjA5KQorICBNUGV4dGVuc2lvbl91c2Vfb2xkICAgICAgID0gNzAgIC8vIHJlY29kZWQgdG8gTVBleHRlbnNpb25fdXNlIChBQkkgcjIuMDgpCit9OworCitTdHJpbmdSZWYgQXR0clR5cGVBc1N0cmluZyh1bnNpZ25lZCBBdHRyLCBib29sIEhhc1RhZ1ByZWZpeCA9IHRydWUpOworU3RyaW5nUmVmIEF0dHJUeXBlQXNTdHJpbmcoQXR0clR5cGUgQXR0ciwgYm9vbCBIYXNUYWdQcmVmaXggPSB0cnVlKTsKK2ludCBBdHRyVHlwZUZyb21TdHJpbmcoU3RyaW5nUmVmIFRhZyk7CisKKy8vIE1hZ2ljIG51bWJlcnMgZm9yIC5BUk0uYXR0cmlidXRlcworZW51bSBBdHRyTWFnaWMgeworICBGb3JtYXRfVmVyc2lvbiAgPSAweDQxCit9OworCisvLyBMZWdhbCBWYWx1ZXMgZm9yIENQVV9hcmNoLCAoPTYpLCB1bGViMTI4CitlbnVtIENQVUFyY2ggeworICBQcmVfdjQgICA9IDAsCisgIHY0ICAgICAgID0gMSwgICAvLyBlLmcuIFNBMTEwCisgIHY0VCAgICAgID0gMiwgICAvLyBlLmcuIEFSTTdURE1JCisgIHY1VCAgICAgID0gMywgICAvLyBlLmcuIEFSTTlURE1JCisgIHY1VEUgICAgID0gNCwgICAvLyBlLmcuIEFSTTk0NkVfUworICB2NVRFSiAgICA9IDUsICAgLy8gZS5nLiBBUk05MjZFSl9TCisgIHY2ICAgICAgID0gNiwgICAvLyBlLmcuIEFSTTExMzZKX1MKKyAgdjZLWiAgICAgPSA3LCAgIC8vIGUuZy4gQVJNMTE3NkpaX1MKKyAgdjZUMiAgICAgPSA4LCAgIC8vIGUuZy4gQVJNMTE1NlQyX1MKKyAgdjZLICAgICAgPSA5LCAgIC8vIGUuZy4gQVJNMTE3NkpaX1MKKyAgdjcgICAgICAgPSAxMCwgIC8vIGUuZy4gQ29ydGV4IEE4LCBDb3J0ZXggTTMKKyAgdjZfTSAgICAgPSAxMSwgIC8vIGUuZy4gQ29ydGV4IE0xCisgIHY2U19NICAgID0gMTIsICAvLyB2Nl9NIHdpdGggdGhlIFN5c3RlbSBleHRlbnNpb25zCisgIHY3RV9NICAgID0gMTMsICAvLyB2N19NIHdpdGggRFNQIGV4dGVuc2lvbnMKKyAgdjhfQSAgICAgPSAxNCwgIC8vIHY4X0EgQUFyY2gzMgorICB2OF9SICAgICA9IDE1LCAgLy8gZS5nLiBDb3J0ZXggUjUyCisgIHY4X01fQmFzZT0gMTYsICAvLyB2OF9NX0Jhc2UgQUFyY2gzMgorICB2OF9NX01haW49IDE3LCAgLy8gdjhfTV9NYWluIEFBcmNoMzIKK307CisKK2VudW0gQ1BVQXJjaFByb2ZpbGUgeyAgICAgICAgICAgICAgIC8vICg9NyksIHVsZWIxMjgKKyAgTm90X0FwcGxpY2FibGUgICAgICAgICAgPSAwLCAgICAgIC8vIHByZSB2Nywgb3IgY3Jvc3MtcHJvZmlsZSBjb2RlCisgIEFwcGxpY2F0aW9uUHJvZmlsZSAgICAgID0gKDB4NDEpLCAvLyAnQScgKGUuZy4gZm9yIENvcnRleCBBOCkKKyAgUmVhbFRpbWVQcm9maWxlICAgICAgICAgPSAoMHg1MiksIC8vICdSJyAoZS5nLiBmb3IgQ29ydGV4IFI0KQorICBNaWNyb0NvbnRyb2xsZXJQcm9maWxlICA9ICgweDREKSwgLy8gJ00nIChlLmcuIGZvciBDb3J0ZXggTTMpCisgIFN5c3RlbVByb2ZpbGUgICAgICAgICAgID0gKDB4NTMpICAvLyAnUycgQXBwbGljYXRpb24gb3IgcmVhbC10aW1lIHByb2ZpbGUKK307CisKKy8vIFRoZSBmb2xsb3dpbmcgaGF2ZSBhIGxvdCBvZiBjb21tb24gdXNlIGNhc2VzCitlbnVtIHsKKyAgTm90X0FsbG93ZWQgPSAwLAorICBBbGxvd2VkID0gMSwKKworICAvLyBUYWdfQVJNX0lTQV91c2UgKD04KSwgdWxlYjEyOAorCisgIC8vIFRhZ19USFVNQl9JU0FfdXNlLCAoPTkpLCB1bGViMTI4CisgIEFsbG93VGh1bWIzMiA9IDIsIC8vIDMyLWJpdCBUaHVtYiAoaW1wbGllcyAxNi1iaXQgaW5zdHJ1Y3Rpb25zKQorICBBbGxvd1RodW1iRGVyaXZlZCA9IDMsIC8vIFRodW1iIGFsbG93ZWQsIGRlcml2ZWQgZnJvbSBhcmNoL3Byb2ZpbGUKKworICAvLyBUYWdfRlBfYXJjaCAoPTEwKSwgdWxlYjEyOCAoZm9ybWVybHkgVGFnX1ZGUF9hcmNoID0gMTApCisgIEFsbG93RlB2MiAgPSAyLCAgICAgLy8gdjIgRlAgSVNBIHBlcm1pdHRlZCAoaW1wbGllcyB1c2Ugb2YgdGhlIHYxIEZQIElTQSkKKyAgQWxsb3dGUHYzQSA9IDMsICAgICAvLyB2MyBGUCBJU0EgcGVybWl0dGVkIChpbXBsaWVzIHVzZSBvZiB0aGUgdjIgRlAgSVNBKQorICBBbGxvd0ZQdjNCID0gNCwgICAgIC8vIHYzIEZQIElTQSBwZXJtaXR0ZWQsIGJ1dCBvbmx5IEQwLUQxNSwgUzAtUzMxCisgIEFsbG93RlB2NEEgPSA1LCAgICAgLy8gdjQgRlAgSVNBIHBlcm1pdHRlZCAoaW1wbGllcyB1c2Ugb2YgdjMgRlAgSVNBKQorICBBbGxvd0ZQdjRCID0gNiwgICAgIC8vIHY0IEZQIElTQSB3YXMgcGVybWl0dGVkLCBidXQgb25seSBEMC1EMTUsIFMwLVMzMQorICBBbGxvd0ZQQVJNdjhBID0gNywgIC8vIFVzZSBvZiB0aGUgQVJNIHY4LUEgRlAgSVNBIHdhcyBwZXJtaXR0ZWQKKyAgQWxsb3dGUEFSTXY4QiA9IDgsICAvLyBVc2Ugb2YgdGhlIEFSTSB2OC1BIEZQIElTQSB3YXMgcGVybWl0dGVkLCBidXQgb25seQorICAgICAgICAgICAgICAgICAgICAgIC8vIEQwLUQxNSwgUzAtUzMxCisKKyAgLy8gVGFnX1dNTVhfYXJjaCwgKD0xMSksIHVsZWIxMjgKKyAgQWxsb3dXTU1YdjEgPSAxLCAgLy8gVGhlIHVzZXIgcGVybWl0dGVkIHRoaXMgZW50aXR5IHRvIHVzZSBXTU1YIHYxCisgIEFsbG93V01NWHYyID0gMiwgIC8vIFRoZSB1c2VyIHBlcm1pdHRlZCB0aGlzIGVudGl0eSB0byB1c2UgV01NWCB2MgorCisgIC8vIFRhZ19BZHZhbmNlZF9TSU1EX2FyY2gsICg9MTIpLCB1bGViMTI4CisgIEFsbG93TmVvbiA9IDEsICAgICAgLy8gU0lNRHYxIHdhcyBwZXJtaXR0ZWQKKyAgQWxsb3dOZW9uMiA9IDIsICAgICAvLyBTSU1EdjIgd2FzIHBlcm1pdHRlZCAoSGFsZi1wcmVjaXNpb24gRlAsIE1BQyBvcGVyYXRpb25zKQorICBBbGxvd05lb25BUk12OCA9IDMsIC8vIEFSTSB2OC1BIFNJTUQgd2FzIHBlcm1pdHRlZAorICBBbGxvd05lb25BUk12OF8xYSA9IDQsLy8gQVJNIHY4LjEtQSBTSU1EIHdhcyBwZXJtaXR0ZWQgKFJETUEpCisKKyAgLy8gVGFnX0FCSV9QQ1NfUjlfdXNlLCAoPTE0KSwgdWxlYjEyOAorICBSOUlzR1BSID0gMCwgICAgICAgIC8vIFI5IHVzZWQgYXMgdjYgKGp1c3QgYW5vdGhlciBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXIpCisgIFI5SXNTQiA9IDEsICAgICAgICAgLy8gUjkgdXNlZCBhcyBhIGdsb2JhbCBzdGF0aWMgYmFzZSByZ2lzdGVyCisgIFI5SXNUTFNQb2ludGVyID0gMiwgLy8gUjkgdXNlZCBhcyBhIHRocmVhZCBsb2NhbCBzdG9yYWdlIHBvaW50ZXIKKyAgUjlSZXNlcnZlZCA9IDMsICAgICAvLyBSOSBub3QgdXNlZCBieSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBhdHRyaWJ1dGVkIGVudGl0eQorCisgIC8vIFRhZ19BQklfUENTX1JXX2RhdGEsICg9MTUpLCB1bGViMTI4CisgIEFkZHJlc3NSV1BDUmVsID0gMSwgLy8gQWRkcmVzcyBSVyBzdGF0aWMgZGF0YSBQQy1yZWxhdGl2ZQorICBBZGRyZXNzUldTQlJlbCA9IDIsIC8vIEFkZHJlc3MgUlcgc3RhdGljIGRhdGEgU0ItcmVsYXRpdmUKKyAgQWRkcmVzc1JXTm9uZSA9IDMsIC8vIE5vIFJXIHN0YXRpYyBkYXRhIHBlcm1pdHRlZAorCisgIC8vIFRhZ19BQklfUENTX1JPX2RhdGEsICg9MTQpLCB1bGViMTI4CisgIEFkZHJlc3NST1BDUmVsID0gMSwgLy8gQWRkcmVzcyBSTyBzdGF0aWMgZGF0YSBQQy1yZWxhdGl2ZQorICBBZGRyZXNzUk9Ob25lID0gMiwgLy8gTm8gUk8gc3RhdGljIGRhdGEgcGVybWl0dGVkCisKKyAgLy8gVGFnX0FCSV9QQ1NfR09UX3VzZSwgKD0xNyksIHVsZWIxMjgKKyAgQWRkcmVzc0RpcmVjdCA9IDEsIC8vIEFkZHJlc3MgaW1wb3J0ZWQgZGF0YSBkaXJlY3RseQorICBBZGRyZXNzR09UID0gMiwgLy8gQWRkcmVzcyBpbXBvcnRlZCBkYXRhIGluZGlyZWN0bHkgKHZpYSBHT1QpCisKKyAgLy8gVGFnX0FCSV9QQ1Nfd2NoYXJfdCwgKD0xOCksIHVsZWIxMjgKKyAgV0NoYXJQcm9oaWJpdGVkID0gMCwgIC8vIHdjaGFyX3QgaXMgbm90IHVzZWQKKyAgV0NoYXJXaWR0aDJCeXRlcyA9IDIsIC8vIHNpemVvZih3Y2hhcl90KSA9PSAyCisgIFdDaGFyV2lkdGg0Qnl0ZXMgPSA0LCAvLyBzaXplb2Yod2NoYXJfdCkgPT0gNAorCisgIC8vIFRhZ19BQklfYWxpZ25fbmVlZGVkLCAoPTI0KSwgdWxlYjEyOAorICBBbGlnbjhCeXRlID0gMSwKKyAgQWxpZ240Qnl0ZSA9IDIsCisgIEFsaWduUmVzZXJ2ZWQgPSAzLAorCisgIC8vIFRhZ19BQklfYWxpZ25fbmVlZGVkLCAoPTI1KSwgdWxlYjEyOAorICBBbGlnbk5vdFByZXNlcnZlZCA9IDAsCisgIEFsaWduUHJlc2VydmU4Qnl0ZSA9IDEsCisgIEFsaWduUHJlc2VydmVBbGwgPSAyLAorCisgIC8vIFRhZ19BQklfRlBfZGVub3JtYWwsICg9MjApLCB1bGViMTI4CisgIFBvc2l0aXZlWmVybyA9IDAsCisgIElFRUVEZW5vcm1hbHMgPSAxLAorICBQcmVzZXJ2ZUZQU2lnbiA9IDIsIC8vIHNpZ24gd2hlbiBmbHVzaGVkLXRvLXplcm8gaXMgcHJlc2VydmVkCisKKyAgLy8gVGFnX0FCSV9GUF9udW1iZXJfbW9kZWwsICg9MjMpLCB1bGViMTI4CisgIEFsbG93SUVFRU5vcm1hbCA9IDEsCisgIEFsbG93UlRBQkkgPSAyLCAgLy8gbnVtYmVycywgaW5maW5pdGllcywgYW5kIG9uZSBxdWlldCBOYU4gKHNlZSBbUlRBQkldKQorICBBbGxvd0lFRUU3NTQgPSAzLCAvLyB0aGlzIGNvZGUgdG8gdXNlIGFsbCB0aGUgSUVFRSA3NTQtZGVmaW5lZCBGUCBlbmNvZGluZ3MKKworICAvLyBUYWdfQUJJX2VudW1fc2l6ZSwgKD0yNiksIHVsZWIxMjgKKyAgRW51bVByb2hpYml0ZWQgPSAwLCAvLyBUaGUgdXNlciBwcm9oaWJpdGVkIHRoZSB1c2Ugb2YgZW51bXMgd2hlbiBidWlsZGluZworICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZW50aXR5LgorICBFbnVtU21hbGxlc3QgPSAxLCAgIC8vIEVudW0gaXMgc21hbGxlc3QgY29udGFpbmVyIGJpZyBlbm91Z2ggdG8gaG9sZCBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMuCisgIEVudW0zMkJpdCA9IDIsICAgICAgLy8gRW51bSBpcyBhdCBsZWFzdCAzMiBiaXRzLgorICBFbnVtMzJCaXRBQkkgPSAzLCAgIC8vIEV2ZXJ5IGVudW1lcmF0aW9uIHZpc2libGUgYWNyb3NzIGFuIEFCSS1jb21wbHlpbmcKKyAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcmZhY2UgY29udGFpbnMgYSB2YWx1ZSBuZWVkaW5nIDMyIGJpdHMgdG8gZW5jb2RlCisgICAgICAgICAgICAgICAgICAgICAgLy8gaXQ7IG90aGVyIGVudW1zIGNhbiBiZSBjb250YWluZXJpemVkLgorCisgIC8vIFRhZ19BQklfSGFyZEZQX3VzZSwgKD0yNyksIHVsZWIxMjgKKyAgSGFyZEZQSW1wbGllZCA9IDAsICAgICAgICAgIC8vIEZQIHVzZSBzaG91bGQgYmUgaW1wbGllZCBieSBUYWdfRlBfYXJjaAorICBIYXJkRlBTaW5nbGVQcmVjaXNpb24gPSAxLCAgLy8gU2luZ2xlLXByZWNpc2lvbiBvbmx5CisKKyAgLy8gVGFnX0FCSV9WRlBfYXJncywgKD0yOCksIHVsZWIxMjgKKyAgQmFzZUFBUENTID0gMCwKKyAgSGFyZEZQQUFQQ1MgPSAxLAorCisgIC8vIFRhZ19GUF9IUF9leHRlbnNpb24sICg9MzYpLCB1bGViMTI4CisgIEFsbG93SFBGUCA9IDEsIC8vIEFsbG93IHVzZSBvZiBIYWxmIFByZWNpc2lvbiBGUAorCisgIC8vIFRhZ19GUF8xNmJpdF9mb3JtYXQsICg9MzgpLCB1bGViMTI4CisgIEZQMTZGb3JtYXRJRUVFID0gMSwKKyAgRlAxNlZGUDMgPSAyLAorCisgIC8vIFRhZ19NUGV4dGVuc2lvbl91c2UsICg9NDIpLCB1bGViMTI4CisgIEFsbG93TVAgPSAxLCAvLyBBbGxvdyB1c2Ugb2YgTVAgZXh0ZW5zaW9ucworCisgIC8vIFRhZ19ESVZfdXNlLCAoPTQ0KSwgdWxlYjEyOAorICAvLyBOb3RlOiBBbGxvd0RJVkV4dCBtdXN0IGJlIGVtaXR0ZWQgaWYgYW5kIG9ubHkgaWYgdGhlIHBlcm1pc3Npb24gdG8gdXNlCisgIC8vIGhhcmR3YXJlIGRpdmlkZSBjYW5ub3QgYmUgY29udmV5ZWQgdXNpbmcgQWxsb3dESVZJZkV4aXN0cyBvciBEaXNhbGxvd0RJVgorICBBbGxvd0RJVklmRXhpc3RzID0gMCwgLy8gQWxsb3cgaGFyZHdhcmUgZGl2aWRlIGlmIGF2YWlsYWJsZSBpbiBhcmNoLCBvciBubworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mbyBleGlzdHMuCisgIERpc2FsbG93RElWID0gMSwgICAgICAvLyBIYXJkd2FyZSBkaXZpZGUgZXhwbGljaXRseSBkaXNhbGxvd2VkLgorICBBbGxvd0RJVkV4dCA9IDIsICAgICAgLy8gQWxsb3cgaGFyZHdhcmUgZGl2aWRlIGFzIG9wdGlvbmFsIGFyY2hpdGVjdHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZW5zaW9uIGFib3ZlIHRoZSBiYXNlIGFyY2ggc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUYWdfQ1BVX2FyY2ggYW5kIFRhZ19DUFVfYXJjaF9wcm9maWxlLgorCisgIC8vIFRhZ19WaXJ0dWFsaXphdGlvbl91c2UsICg9NjgpLCB1bGViMTI4CisgIEFsbG93VFogPSAxLAorICBBbGxvd1ZpcnR1YWxpemF0aW9uID0gMiwKKyAgQWxsb3dUWlZpcnR1YWxpemF0aW9uID0gMworfTsKKworfSAvLyBuYW1lc3BhY2UgQVJNQnVpbGRBdHRycworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BUk1FSEFCSS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FSTUVIQUJJLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwNTJkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BUk1FSEFCSS5oCkBAIC0wLDAgKzEsMTM0IEBACisvLz09PS0tLSBBUk1FSEFCSS5oIC0gQVJNIEV4Y2VwdGlvbiBIYW5kbGluZyBBQkkgLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBjb25zdGFudHMgZm9yIHRoZSBBUk0gdW53aW5kIG9wY29kZXMgYW5kIGV4Y2VwdGlvbgorLy8gaGFuZGxpbmcgdGFibGUgZW50cnkga2luZHMuCisvLworLy8gVGhlIGVudW1lcmF0aW9ucyBhbmQgY29uc3RhbnRzIGluIHRoaXMgZmlsZSByZWZsZWN0IHRoZSBBUk0gRUhBQkkKKy8vIFNwZWNpZmljYXRpb24gYXMgcHVibGlzaGVkIGJ5IEFSTS4KKy8vCisvLyBFeGNlcHRpb24gSGFuZGxpbmcgQUJJIGZvciB0aGUgQVJNIEFyY2hpdGVjdHVyZSByMi4wOSAtIE5vdmVtYmVyIDMwLCAyMDEyCisvLworLy8gaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL3RvcGljL2NvbS5hcm0uZG9jLmloaTAwMzhhL0lISTAwMzhBX2VoYWJpLnBkZgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0FSTUVIQUJJX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0FSTUVIQUJJX0gKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIEFSTSB7CituYW1lc3BhY2UgRUhBQkkgeworICAvLy8gQVJNIGV4Y2VwdGlvbiBoYW5kbGluZyB0YWJsZSBlbnRyeSBraW5kcworICBlbnVtIEVIVEVudHJ5S2luZCB7CisgICAgRUhUX0dFTkVSSUMgPSAweDAwLAorICAgIEVIVF9DT01QQUNUID0gMHg4MAorICB9OworCisgIGVudW0geworICAgIC8vLyBTcGVjaWFsIGVudHJ5IGZvciB0aGUgZnVuY3Rpb24gbmV2ZXIgdW53aW5kCisgICAgRVhJRFhfQ0FOVFVOV0lORCA9IDB4MQorICB9OworCisgIC8vLyBBUk0tZGVmaW5lZCBmcmFtZSB1bndpbmRpbmcgb3Bjb2RlcworICBlbnVtIFVud2luZE9wY29kZXMgeworICAgIC8vIEZvcm1hdDogMDB4eHh4eHgKKyAgICAvLyBQdXJwb3NlOiB2c3AgPSB2c3AgKyAoKHggPDwgMikgKyA0KQorICAgIFVOV0lORF9PUENPREVfSU5DX1ZTUCA9IDB4MDAsCisKKyAgICAvLyBGb3JtYXQ6IDAxeHh4eHh4CisgICAgLy8gUHVycG9zZTogdnNwID0gdnNwIC0gKCh4IDw8IDIpICsgNCkKKyAgICBVTldJTkRfT1BDT0RFX0RFQ19WU1AgPSAweDQwLAorCisgICAgLy8gRm9ybWF0OiAxMDAwMDAwMCAwMDAwMDAwMAorICAgIC8vIFB1cnBvc2U6IHJlZnVzZSB0byB1bndpbmQKKyAgICBVTldJTkRfT1BDT0RFX1JFRlVTRSA9IDB4ODAwMCwKKworICAgIC8vIEZvcm1hdDogMTAwMHh4eHggeHh4eHh4eHgKKyAgICAvLyBQdXJwb3NlOiBwb3AgclsxNToxMl0sIHJbMTE6NF0KKyAgICAvLyBDb25zdHJhaW50OiB4ICE9IDAKKyAgICBVTldJTkRfT1BDT0RFX1BPUF9SRUdfTUFTS19SNCA9IDB4ODAwMCwKKworICAgIC8vIEZvcm1hdDogMTAwMXh4eHgKKyAgICAvLyBQdXJwb3NlOiB2c3AgPSByW3hdCisgICAgLy8gQ29uc3RyYWludDogeCAhPSAxMyAmJiB4ICE9IDE1CisgICAgVU5XSU5EX09QQ09ERV9TRVRfVlNQID0gMHg5MCwKKworICAgIC8vIEZvcm1hdDogMTAxMDB4eHgKKyAgICAvLyBQdXJwb3NlOiBwb3AgclsoNCt4KTo0XQorICAgIFVOV0lORF9PUENPREVfUE9QX1JFR19SQU5HRV9SNCA9IDB4YTAsCisKKyAgICAvLyBGb3JtYXQ6IDEwMTAxeHh4CisgICAgLy8gUHVycG9zZTogcG9wIHIxNCwgclsoNCt4KTo0XQorICAgIFVOV0lORF9PUENPREVfUE9QX1JFR19SQU5HRV9SNF9SMTQgPSAweGE4LAorCisgICAgLy8gRm9ybWF0OiAxMDExMDAwMAorICAgIC8vIFB1cnBvc2U6IGZpbmlzaAorICAgIFVOV0lORF9PUENPREVfRklOSVNIID0gMHhiMCwKKworICAgIC8vIEZvcm1hdDogMTAxMTAwMDEgMDAwMHh4eHgKKyAgICAvLyBQdXJwb3NlOiBwb3AgclszOjBdCisgICAgLy8gQ29uc3RyYWludDogeCAhPSAwCisgICAgVU5XSU5EX09QQ09ERV9QT1BfUkVHX01BU0sgPSAweGIxMDAsCisKKyAgICAvLyBGb3JtYXQ6IDEwMTEwMDEwIHgodWxlYjEyOCkKKyAgICAvLyBQdXJwb3NlOiB2c3AgPSB2c3AgKyAoKHggPDwgMikgKyAweDIwNCkKKyAgICBVTldJTkRfT1BDT0RFX0lOQ19WU1BfVUxFQjEyOCA9IDB4YjIsCisKKyAgICAvLyBGb3JtYXQ6IDEwMTEwMDExIHh4eHh5eXl5CisgICAgLy8gUHVycG9zZTogcG9wIGRbKHgreSk6eF0KKyAgICBVTldJTkRfT1BDT0RFX1BPUF9WRlBfUkVHX1JBTkdFX0ZTVE1GRFggPSAweGIzMDAsCisKKyAgICAvLyBGb3JtYXQ6IDEwMTExeHh4CisgICAgLy8gUHVycG9zZTogcG9wIGRbKDgreCk6OF0KKyAgICBVTldJTkRfT1BDT0RFX1BPUF9WRlBfUkVHX1JBTkdFX0ZTVE1GRFhfRDggPSAweGI4LAorCisgICAgLy8gRm9ybWF0OiAxMTAwMHh4eAorICAgIC8vIFB1cnBvc2U6IHBvcCB3UlsoMTAreCk6MTBdCisgICAgVU5XSU5EX09QQ09ERV9QT1BfV0lSRUxFU1NfTU1YX1JFR19SQU5HRV9XUjEwID0gMHhjMCwKKworICAgIC8vIEZvcm1hdDogMTEwMDAxMTAgeHh4eHl5eXkKKyAgICAvLyBQdXJwb3NlOiBwb3Agd1JbKHgreSk6eF0KKyAgICBVTldJTkRfT1BDT0RFX1BPUF9XSVJFTEVTU19NTVhfUkVHX1JBTkdFID0gMHhjNjAwLAorCisgICAgLy8gRm9ybWF0OiAxMTAwMDExMSAwMDAweHh4eAorICAgIC8vIFB1cnBvc2U6IHBvcCB3Q0dSWzM6MF0KKyAgICAvLyBDb25zdHJhaW50OiB4ICE9IDAKKyAgICBVTldJTkRfT1BDT0RFX1BPUF9XSVJFTEVTU19NTVhfUkVHX01BU0sgPSAweGM3MDAsCisKKyAgICAvLyBGb3JtYXQ6IDExMDAxMDAwIHh4eHh5eXl5CisgICAgLy8gUHVycG9zZTogcG9wIGRbKDE2K3greSk6KDE2K3gpXQorICAgIFVOV0lORF9PUENPREVfUE9QX1ZGUF9SRUdfUkFOR0VfRlNUTUZERF9EMTYgPSAweGM4MDAsCisKKyAgICAvLyBGb3JtYXQ6IDExMDAxMDAxIHh4eHh5eXl5CisgICAgLy8gUHVycG9zZTogcG9wIGRbKHgreSk6eF0KKyAgICBVTldJTkRfT1BDT0RFX1BPUF9WRlBfUkVHX1JBTkdFX0ZTVE1GREQgPSAweGM5MDAsCisKKyAgICAvLyBGb3JtYXQ6IDExMDEweHh4CisgICAgLy8gUHVycG9zZTogcG9wIGRbKDgreCk6OF0KKyAgICBVTldJTkRfT1BDT0RFX1BPUF9WRlBfUkVHX1JBTkdFX0ZTVE1GRERfRDggPSAweGQwCisgIH07CisKKyAgLy8vIEFSTS1kZWZpbmVkIFBlcnNvbmFsaXR5IFJvdXRpbmUgSW5kZXgKKyAgZW51bSBQZXJzb25hbGl0eVJvdXRpbmVJbmRleCB7CisgICAgLy8gVG8gbWFrZSB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nIHRhYmxlIGJlY29tZSBtb3JlIGNvbXBhY3QsIEFSTSBkZWZpbmVkCisgICAgLy8gc2V2ZXJhbCBwZXJzb25hbGl0eSByb3V0aW5lcyBpbiBFSEFCSS4gIFRoZXJlIGFyZSAzIGRpZmZlcmVudAorICAgIC8vIHBlcnNvbmFsaXR5IHJvdXRpbmVzIGluIEFSTSBFSEFCSSBjdXJyZW50bHkuICBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIDE2CisgICAgLy8gcHJlLWRlZmluZWQgcGVyc29uYWxpdHkgcm91dGluZXMgYXQgbW9zdC4KKyAgICBBRUFCSV9VTldJTkRfQ1BQX1BSMCA9IDAsCisgICAgQUVBQklfVU5XSU5EX0NQUF9QUjEgPSAxLAorICAgIEFFQUJJX1VOV0lORF9DUFBfUFIyID0gMiwKKworICAgIE5VTV9QRVJTT05BTElUWV9JTkRFWAorICB9OworfQorfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BUk1UYXJnZXRQYXJzZXIuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FSTVRhcmdldFBhcnNlci5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4ZWZmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BUk1UYXJnZXRQYXJzZXIuZGVmCkBAIC0wLDAgKzEsMjY0IEBACisvLz09PS0gQVJNVGFyZ2V0UGFyc2VyLmRlZiAtIEFSTSB0YXJnZXQgcGFyc2luZyBkZWZpbmVzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyBkZWZpbmVzIHRvIGJ1aWxkIHVwIHRoZSBBUk0gdGFyZ2V0IHBhcnNlcidzIGxvZ2ljLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIE5PVEU6IE5PIElOQ0xVREUgR1VBUkQgREVTSVJFRCEKKworI2lmbmRlZiBBUk1fRlBVCisjZGVmaW5lIEFSTV9GUFUoTkFNRSwgS0lORCwgVkVSU0lPTiwgTkVPTl9TVVBQT1JULCBSRVNUUklDVElPTikKKyNlbmRpZgorQVJNX0ZQVSgiaW52YWxpZCIsIEZLX0lOVkFMSUQsIEZQVVZlcnNpb246Ok5PTkUsIE5lb25TdXBwb3J0TGV2ZWw6Ok5vbmUsIEZQVVJlc3RyaWN0aW9uOjpOb25lKQorQVJNX0ZQVSgibm9uZSIsIEZLX05PTkUsIEZQVVZlcnNpb246Ok5PTkUsIE5lb25TdXBwb3J0TGV2ZWw6Ok5vbmUsIEZQVVJlc3RyaWN0aW9uOjpOb25lKQorQVJNX0ZQVSgidmZwIiwgRktfVkZQLCBGUFVWZXJzaW9uOjpWRlBWMiwgTmVvblN1cHBvcnRMZXZlbDo6Tm9uZSwgRlBVUmVzdHJpY3Rpb246Ok5vbmUpCitBUk1fRlBVKCJ2ZnB2MiIsIEZLX1ZGUFYyLCBGUFVWZXJzaW9uOjpWRlBWMiwgTmVvblN1cHBvcnRMZXZlbDo6Tm9uZSwgRlBVUmVzdHJpY3Rpb246Ok5vbmUpCitBUk1fRlBVKCJ2ZnB2MyIsIEZLX1ZGUFYzLCBGUFVWZXJzaW9uOjpWRlBWMywgTmVvblN1cHBvcnRMZXZlbDo6Tm9uZSwgRlBVUmVzdHJpY3Rpb246Ok5vbmUpCitBUk1fRlBVKCJ2ZnB2My1mcDE2IiwgRktfVkZQVjNfRlAxNiwgRlBVVmVyc2lvbjo6VkZQVjNfRlAxNiwgTmVvblN1cHBvcnRMZXZlbDo6Tm9uZSwgRlBVUmVzdHJpY3Rpb246Ok5vbmUpCitBUk1fRlBVKCJ2ZnB2My1kMTYiLCBGS19WRlBWM19EMTYsIEZQVVZlcnNpb246OlZGUFYzLCBOZW9uU3VwcG9ydExldmVsOjpOb25lLCBGUFVSZXN0cmljdGlvbjo6RDE2KQorQVJNX0ZQVSgidmZwdjMtZDE2LWZwMTYiLCBGS19WRlBWM19EMTZfRlAxNiwgRlBVVmVyc2lvbjo6VkZQVjNfRlAxNiwgTmVvblN1cHBvcnRMZXZlbDo6Tm9uZSwgRlBVUmVzdHJpY3Rpb246OkQxNikKK0FSTV9GUFUoInZmcHYzeGQiLCBGS19WRlBWM1hELCBGUFVWZXJzaW9uOjpWRlBWMywgTmVvblN1cHBvcnRMZXZlbDo6Tm9uZSwgRlBVUmVzdHJpY3Rpb246OlNQX0QxNikKK0FSTV9GUFUoInZmcHYzeGQtZnAxNiIsIEZLX1ZGUFYzWERfRlAxNiwgRlBVVmVyc2lvbjo6VkZQVjNfRlAxNiwgTmVvblN1cHBvcnRMZXZlbDo6Tm9uZSwgRlBVUmVzdHJpY3Rpb246OlNQX0QxNikKK0FSTV9GUFUoInZmcHY0IiwgRktfVkZQVjQsIEZQVVZlcnNpb246OlZGUFY0LCBOZW9uU3VwcG9ydExldmVsOjpOb25lLCBGUFVSZXN0cmljdGlvbjo6Tm9uZSkKK0FSTV9GUFUoInZmcHY0LWQxNiIsIEZLX1ZGUFY0X0QxNiwgRlBVVmVyc2lvbjo6VkZQVjQsIE5lb25TdXBwb3J0TGV2ZWw6Ok5vbmUsIEZQVVJlc3RyaWN0aW9uOjpEMTYpCitBUk1fRlBVKCJmcHY0LXNwLWQxNiIsIEZLX0ZQVjRfU1BfRDE2LCBGUFVWZXJzaW9uOjpWRlBWNCwgTmVvblN1cHBvcnRMZXZlbDo6Tm9uZSwgRlBVUmVzdHJpY3Rpb246OlNQX0QxNikKK0FSTV9GUFUoImZwdjUtZDE2IiwgRktfRlBWNV9EMTYsIEZQVVZlcnNpb246OlZGUFY1LCBOZW9uU3VwcG9ydExldmVsOjpOb25lLCBGUFVSZXN0cmljdGlvbjo6RDE2KQorQVJNX0ZQVSgiZnB2NS1zcC1kMTYiLCBGS19GUFY1X1NQX0QxNiwgRlBVVmVyc2lvbjo6VkZQVjUsIE5lb25TdXBwb3J0TGV2ZWw6Ok5vbmUsIEZQVVJlc3RyaWN0aW9uOjpTUF9EMTYpCitBUk1fRlBVKCJmcC1hcm12OCIsIEZLX0ZQX0FSTVY4LCBGUFVWZXJzaW9uOjpWRlBWNSwgTmVvblN1cHBvcnRMZXZlbDo6Tm9uZSwgRlBVUmVzdHJpY3Rpb246Ok5vbmUpCitBUk1fRlBVKCJuZW9uIiwgRktfTkVPTiwgRlBVVmVyc2lvbjo6VkZQVjMsIE5lb25TdXBwb3J0TGV2ZWw6Ok5lb24sIEZQVVJlc3RyaWN0aW9uOjpOb25lKQorQVJNX0ZQVSgibmVvbi1mcDE2IiwgRktfTkVPTl9GUDE2LCBGUFVWZXJzaW9uOjpWRlBWM19GUDE2LCBOZW9uU3VwcG9ydExldmVsOjpOZW9uLCBGUFVSZXN0cmljdGlvbjo6Tm9uZSkKK0FSTV9GUFUoIm5lb24tdmZwdjQiLCBGS19ORU9OX1ZGUFY0LCBGUFVWZXJzaW9uOjpWRlBWNCwgTmVvblN1cHBvcnRMZXZlbDo6TmVvbiwgRlBVUmVzdHJpY3Rpb246Ok5vbmUpCitBUk1fRlBVKCJuZW9uLWZwLWFybXY4IiwgRktfTkVPTl9GUF9BUk1WOCwgRlBVVmVyc2lvbjo6VkZQVjUsIE5lb25TdXBwb3J0TGV2ZWw6Ok5lb24sIEZQVVJlc3RyaWN0aW9uOjpOb25lKQorQVJNX0ZQVSgiY3J5cHRvLW5lb24tZnAtYXJtdjgiLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgRlBVVmVyc2lvbjo6VkZQVjUsIE5lb25TdXBwb3J0TGV2ZWw6OkNyeXB0bywKKyAgICAgICAgRlBVUmVzdHJpY3Rpb246Ok5vbmUpCitBUk1fRlBVKCJzb2Z0dmZwIiwgRktfU09GVFZGUCwgRlBVVmVyc2lvbjo6Tk9ORSwgTmVvblN1cHBvcnRMZXZlbDo6Tm9uZSwgRlBVUmVzdHJpY3Rpb246Ok5vbmUpCisjdW5kZWYgQVJNX0ZQVQorCisjaWZuZGVmIEFSTV9BUkNICisjZGVmaW5lIEFSTV9BUkNIKE5BTUUsIElELCBDUFVfQVRUUiwgU1VCX0FSQ0gsIEFSQ0hfQVRUUiwgQVJDSF9GUFUsIEFSQ0hfQkFTRV9FWFQpCisjZW5kaWYKK0FSTV9BUkNIKCJpbnZhbGlkIiwgSU5WQUxJRCwgIiIsICIiLAorICAgICAgICAgIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OlByZV92NCwgRktfTk9ORSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9BUkNIKCJhcm12MiIsIEFSTVYyLCAiMiIsICJ2MiIsIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OlByZV92NCwKKyAgICAgICAgICBGS19OT05FLCBBUk06OkFFS19OT05FKQorQVJNX0FSQ0goImFybXYyYSIsIEFSTVYyQSwgIjJBIiwgInYyYSIsIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OlByZV92NCwKKyAgICAgICAgICBGS19OT05FLCBBUk06OkFFS19OT05FKQorQVJNX0FSQ0goImFybXYzIiwgQVJNVjMsICIzIiwgInYzIiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6UHJlX3Y0LAorICAgICAgICAgIEZLX05PTkUsIEFSTTo6QUVLX05PTkUpCitBUk1fQVJDSCgiYXJtdjNtIiwgQVJNVjNNLCAiM00iLCAidjNtIiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6UHJlX3Y0LAorICAgICAgICAgIEZLX05PTkUsIEFSTTo6QUVLX05PTkUpCitBUk1fQVJDSCgiYXJtdjQiLCBBUk1WNCwgIjQiLCAidjQiLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2NCwKKyAgICAgICAgICBGS19OT05FLCBBUk06OkFFS19OT05FKQorQVJNX0FSQ0goImFybXY0dCIsIEFSTVY0VCwgIjRUIiwgInY0dCIsIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY0VCwKKyAgICAgICAgICBGS19OT05FLCBBUk06OkFFS19OT05FKQorQVJNX0FSQ0goImFybXY1dCIsIEFSTVY1VCwgIjVUIiwgInY1IiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djVULAorICAgICAgICAgIEZLX05PTkUsIEFSTTo6QUVLX05PTkUpCitBUk1fQVJDSCgiYXJtdjV0ZSIsIEFSTVY1VEUsICI1VEUiLCAidjVlIiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djVURSwKKyAgICAgICAgICBGS19OT05FLCBBUk06OkFFS19EU1ApCitBUk1fQVJDSCgiYXJtdjV0ZWoiLCBBUk1WNVRFSiwgIjVURUoiLCAidjVlIiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djVURUosCisgICAgICAgICAgRktfTk9ORSwgQVJNOjpBRUtfRFNQKQorQVJNX0FSQ0goImFybXY2IiwgQVJNVjYsICI2IiwgInY2IiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djYsCisgICAgICAgICAgRktfVkZQVjIsIEFSTTo6QUVLX0RTUCkKK0FSTV9BUkNIKCJhcm12NmsiLCBBUk1WNkssICI2SyIsICJ2NmsiLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2NkssCisgICAgICAgICAgRktfVkZQVjIsIEFSTTo6QUVLX0RTUCkKK0FSTV9BUkNIKCJhcm12NnQyIiwgQVJNVjZUMiwgIjZUMiIsICJ2NnQyIiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djZUMiwKKyAgICAgICAgICBGS19OT05FLCBBUk06OkFFS19EU1ApCitBUk1fQVJDSCgiYXJtdjZreiIsIEFSTVY2S1osICI2S1oiLCAidjZreiIsIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY2S1osCisgICAgICAgICAgRktfVkZQVjIsIChBUk06OkFFS19TRUMgfCBBUk06OkFFS19EU1ApKQorQVJNX0FSQ0goImFybXY2LW0iLCBBUk1WNk0sICI2LU0iLCAidjZtIiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djZfTSwKKyAgICAgICAgICBGS19OT05FLCBBUk06OkFFS19OT05FKQorQVJNX0FSQ0goImFybXY3LWEiLCBBUk1WN0EsICI3LUEiLCAidjciLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2NywKKyAgICAgICAgICBGS19ORU9OLCBBUk06OkFFS19EU1ApCitBUk1fQVJDSCgiYXJtdjd2ZSIsIEFSTVY3VkUsICI3VkUiLCAidjd2ZSIsIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY3LAorICAgICAgICAgIEZLX05FT04sIChBUk06OkFFS19TRUMgfCBBUk06OkFFS19NUCB8IEFSTTo6QUVLX1ZJUlQgfAorICAgICAgICAgIEFSTTo6QUVLX0hXRElWQVJNIHwgQVJNOjpBRUtfSFdESVZUSFVNQiB8IEFSTTo6QUVLX0RTUCkpCitBUk1fQVJDSCgiYXJtdjctciIsIEFSTVY3UiwgIjctUiIsICJ2N3IiLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2NywKKyAgICAgICAgICBGS19OT05FLCAoQVJNOjpBRUtfSFdESVZUSFVNQiB8IEFSTTo6QUVLX0RTUCkpCitBUk1fQVJDSCgiYXJtdjctbSIsIEFSTVY3TSwgIjctTSIsICJ2N20iLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2NywKKyAgICAgICAgICBGS19OT05FLCBBUk06OkFFS19IV0RJVlRIVU1CKQorQVJNX0FSQ0goImFybXY3ZS1tIiwgQVJNVjdFTSwgIjdFLU0iLCAidjdlbSIsIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY3RV9NLAorICAgICAgICAgIEZLX05PTkUsIChBUk06OkFFS19IV0RJVlRIVU1CIHwgQVJNOjpBRUtfRFNQKSkKK0FSTV9BUkNIKCJhcm12OC1hIiwgQVJNVjhBLCAiOC1BIiwgInY4IiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djhfQSwKKyAgICAgICAgIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LAorICAgICAgICAgKEFSTTo6QUVLX1NFQyB8IEFSTTo6QUVLX01QIHwgQVJNOjpBRUtfVklSVCB8IEFSTTo6QUVLX0hXRElWQVJNIHwKKyAgICAgICAgICBBUk06OkFFS19IV0RJVlRIVU1CIHwgQVJNOjpBRUtfRFNQIHwgQVJNOjpBRUtfQ1JDKSkKK0FSTV9BUkNIKCJhcm12OC4xLWEiLCBBUk1WOF8xQSwgIjguMS1BIiwgInY4LjFhIiwKKyAgICAgICAgIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY4X0EsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LAorICAgICAgICAgKEFSTTo6QUVLX1NFQyB8IEFSTTo6QUVLX01QIHwgQVJNOjpBRUtfVklSVCB8IEFSTTo6QUVLX0hXRElWQVJNIHwKKyAgICAgICAgICBBUk06OkFFS19IV0RJVlRIVU1CIHwgQVJNOjpBRUtfRFNQIHwgQVJNOjpBRUtfQ1JDKSkKK0FSTV9BUkNIKCJhcm12OC4yLWEiLCBBUk1WOF8yQSwgIjguMi1BIiwgInY4LjJhIiwKKyAgICAgICAgIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY4X0EsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LAorICAgICAgICAgKEFSTTo6QUVLX1NFQyB8IEFSTTo6QUVLX01QIHwgQVJNOjpBRUtfVklSVCB8IEFSTTo6QUVLX0hXRElWQVJNIHwKKyAgICAgICAgICBBUk06OkFFS19IV0RJVlRIVU1CIHwgQVJNOjpBRUtfRFNQIHwgQVJNOjpBRUtfQ1JDIHwgQVJNOjpBRUtfUkFTKSkKK0FSTV9BUkNIKCJhcm12OC4zLWEiLCBBUk1WOF8zQSwgIjguMy1BIiwgInY4LjNhIiwKKyAgICAgICAgIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY4X0EsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LAorICAgICAgICAgKEFSTTo6QUVLX1NFQyB8IEFSTTo6QUVLX01QIHwgQVJNOjpBRUtfVklSVCB8IEFSTTo6QUVLX0hXRElWQVJNIHwKKyAgICAgICAgICBBUk06OkFFS19IV0RJVlRIVU1CIHwgQVJNOjpBRUtfRFNQIHwgQVJNOjpBRUtfQ1JDIHwgQVJNOjpBRUtfUkFTKSkKK0FSTV9BUkNIKCJhcm12OC1yIiwgQVJNVjhSLCAiOC1SIiwgInY4ciIsIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY4X1IsCisgICAgICAgICAgRktfTkVPTl9GUF9BUk1WOCwKKyAgICAgICAgICAoQVJNOjpBRUtfTVAgfCBBUk06OkFFS19WSVJUIHwgQVJNOjpBRUtfSFdESVZBUk0gfCBBUk06OkFFS19IV0RJVlRIVU1CIHwKKyAgICAgICAgICAgQVJNOjpBRUtfRFNQIHwgQVJNOjpBRUtfQ1JDKSkKK0FSTV9BUkNIKCJhcm12OC1tLmJhc2UiLCBBUk1WOE1CYXNlbGluZSwgIjgtTS5CYXNlbGluZSIsICJ2OG0uYmFzZSIsCisgICAgICAgICAgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djhfTV9CYXNlLCBGS19OT05FLCBBUk06OkFFS19IV0RJVlRIVU1CKQorQVJNX0FSQ0goImFybXY4LW0ubWFpbiIsIEFSTVY4TU1haW5saW5lLCAiOC1NLk1haW5saW5lIiwgInY4bS5tYWluIiwKKyAgICAgICAgICBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2OF9NX01haW4sIEZLX0ZQVjVfRDE2LCBBUk06OkFFS19IV0RJVlRIVU1CKQorLy8gTm9uLXN0YW5kYXJkIEFyY2ggbmFtZXMuCitBUk1fQVJDSCgiaXdtbXh0IiwgSVdNTVhULCAiaXdtbXh0IiwgIiIsIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY1VEUsCisgICAgICAgICAgRktfTk9ORSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9BUkNIKCJpd21teHQyIiwgSVdNTVhUMiwgIml3bW14dDIiLCAiIiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djVURSwKKyAgICAgICAgICBGS19OT05FLCBBUk06OkFFS19OT05FKQorQVJNX0FSQ0goInhzY2FsZSIsIFhTQ0FMRSwgInhzY2FsZSIsICJ2NWUiLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2NVRFLAorICAgICAgICAgIEZLX05PTkUsIEFSTTo6QUVLX05PTkUpCitBUk1fQVJDSCgiYXJtdjdzIiwgQVJNVjdTLCAiNy1TIiwgInY3cyIsIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY3LAorICAgICAgICAgIEZLX05FT05fVkZQVjQsIEFSTTo6QUVLX0RTUCkKK0FSTV9BUkNIKCJhcm12N2siLCBBUk1WN0ssICI3LUsiLCAidjdrIiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djcsCisgICAgICAgICAgRktfTk9ORSwgQVJNOjpBRUtfRFNQKQorI3VuZGVmIEFSTV9BUkNICisKKyNpZm5kZWYgQVJNX0FSQ0hfRVhUX05BTUUKKyNkZWZpbmUgQVJNX0FSQ0hfRVhUX05BTUUoTkFNRSwgSUQsIEZFQVRVUkUsIE5FR0ZFQVRVUkUpCisjZW5kaWYKKy8vIEZJWE1FOiBUaGlzIHdvdWxkIGJlIG5pY2VyIHdlcmUgaXQgdGFibGVnZW4KK0FSTV9BUkNIX0VYVF9OQU1FKCJpbnZhbGlkIiwgIEFSTTo6QUVLX0lOVkFMSUQsICBudWxscHRyLCAgbnVsbHB0cikKK0FSTV9BUkNIX0VYVF9OQU1FKCJub25lIiwgICAgIEFSTTo6QUVLX05PTkUsICAgICBudWxscHRyLCAgbnVsbHB0cikKK0FSTV9BUkNIX0VYVF9OQU1FKCJjcmMiLCAgICAgIEFSTTo6QUVLX0NSQywgICAgICAiK2NyYyIsICAgIi1jcmMiKQorQVJNX0FSQ0hfRVhUX05BTUUoImNyeXB0byIsICAgQVJNOjpBRUtfQ1JZUFRPLCAgICIrY3J5cHRvIiwiLWNyeXB0byIpCitBUk1fQVJDSF9FWFRfTkFNRSgiZG90cHJvZCIsICBBUk06OkFFS19ET1RQUk9ELCAgIitkb3Rwcm9kIiwiLWRvdHByb2QiKQorQVJNX0FSQ0hfRVhUX05BTUUoImRzcCIsICAgICAgQVJNOjpBRUtfRFNQLCAgICAgICIrZHNwIiwgICAiLWRzcCIpCitBUk1fQVJDSF9FWFRfTkFNRSgiZnAiLCAgICAgICBBUk06OkFFS19GUCwgICAgICAgbnVsbHB0ciwgIG51bGxwdHIpCitBUk1fQVJDSF9FWFRfTkFNRSgiaWRpdiIsICAgICAoQVJNOjpBRUtfSFdESVZBUk0gfCBBUk06OkFFS19IV0RJVlRIVU1CKSwgbnVsbHB0ciwgbnVsbHB0cikKK0FSTV9BUkNIX0VYVF9OQU1FKCJtcCIsICAgICAgIEFSTTo6QUVLX01QLCAgICAgICBudWxscHRyLCAgbnVsbHB0cikKK0FSTV9BUkNIX0VYVF9OQU1FKCJzaW1kIiwgICAgIEFSTTo6QUVLX1NJTUQsICAgICBudWxscHRyLCAgbnVsbHB0cikKK0FSTV9BUkNIX0VYVF9OQU1FKCJzZWMiLCAgICAgIEFSTTo6QUVLX1NFQywgICAgICBudWxscHRyLCAgbnVsbHB0cikKK0FSTV9BUkNIX0VYVF9OQU1FKCJ2aXJ0IiwgICAgIEFSTTo6QUVLX1ZJUlQsICAgICBudWxscHRyLCAgbnVsbHB0cikKK0FSTV9BUkNIX0VYVF9OQU1FKCJmcDE2IiwgICAgIEFSTTo6QUVLX0ZQMTYsICAgICAiK2Z1bGxmcDE2IiwgICItZnVsbGZwMTYiKQorQVJNX0FSQ0hfRVhUX05BTUUoInJhcyIsICAgICAgQVJNOjpBRUtfUkFTLCAgICAgICIrcmFzIiwgIi1yYXMiKQorQVJNX0FSQ0hfRVhUX05BTUUoIm9zIiwgICAgICAgQVJNOjpBRUtfT1MsICAgICAgIG51bGxwdHIsICBudWxscHRyKQorQVJNX0FSQ0hfRVhUX05BTUUoIml3bW14dCIsICAgQVJNOjpBRUtfSVdNTVhULCAgIG51bGxwdHIsICBudWxscHRyKQorQVJNX0FSQ0hfRVhUX05BTUUoIml3bW14dDIiLCAgQVJNOjpBRUtfSVdNTVhUMiwgIG51bGxwdHIsICBudWxscHRyKQorQVJNX0FSQ0hfRVhUX05BTUUoIm1hdmVyaWNrIiwgQVJNOjpBRUtfTUFWRVJJQ0ssIG51bGxwdHIsICBudWxscHRyKQorQVJNX0FSQ0hfRVhUX05BTUUoInhzY2FsZSIsICAgQVJNOjpBRUtfWFNDQUxFLCAgIG51bGxwdHIsICBudWxscHRyKQorI3VuZGVmIEFSTV9BUkNIX0VYVF9OQU1FCisKKyNpZm5kZWYgQVJNX0hXX0RJVl9OQU1FCisjZGVmaW5lIEFSTV9IV19ESVZfTkFNRShOQU1FLCBJRCkKKyNlbmRpZgorQVJNX0hXX0RJVl9OQU1FKCJpbnZhbGlkIiwgQVJNOjpBRUtfSU5WQUxJRCkKK0FSTV9IV19ESVZfTkFNRSgibm9uZSIsIEFSTTo6QUVLX05PTkUpCitBUk1fSFdfRElWX05BTUUoInRodW1iIiwgQVJNOjpBRUtfSFdESVZUSFVNQikKK0FSTV9IV19ESVZfTkFNRSgiYXJtIiwgQVJNOjpBRUtfSFdESVZBUk0pCitBUk1fSFdfRElWX05BTUUoImFybSx0aHVtYiIsIChBUk06OkFFS19IV0RJVkFSTSB8IEFSTTo6QUVLX0hXRElWVEhVTUIpKQorI3VuZGVmIEFSTV9IV19ESVZfTkFNRQorCisjaWZuZGVmIEFSTV9DUFVfTkFNRQorI2RlZmluZSBBUk1fQ1BVX05BTUUoTkFNRSwgSUQsIERFRkFVTFRfRlBVLCBJU19ERUZBVUxULCBERUZBVUxUX0VYVCkKKyNlbmRpZgorQVJNX0NQVV9OQU1FKCJhcm0yIiwgQVJNVjIsIEZLX05PTkUsIHRydWUsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTMiLCBBUk1WMkEsIEZLX05PTkUsIHRydWUsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTYiLCBBUk1WMywgRktfTk9ORSwgdHJ1ZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtN20iLCBBUk1WM00sIEZLX05PTkUsIHRydWUsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTgiLCBBUk1WNCwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTgxMCIsIEFSTVY0LCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgic3Ryb25nYXJtIiwgQVJNVjQsIEZLX05PTkUsIHRydWUsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoInN0cm9uZ2FybTExMCIsIEFSTVY0LCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgic3Ryb25nYXJtMTEwMCIsIEFSTVY0LCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgic3Ryb25nYXJtMTExMCIsIEFSTVY0LCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtN3RkbWkiLCBBUk1WNFQsIEZLX05PTkUsIHRydWUsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTd0ZG1pLXMiLCBBUk1WNFQsIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJhcm03MTB0IiwgQVJNVjRULCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtNzIwdCIsIEFSTVY0VCwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTkiLCBBUk1WNFQsIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJhcm05dGRtaSIsIEFSTVY0VCwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTkyMCIsIEFSTVY0VCwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTkyMHQiLCBBUk1WNFQsIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJhcm05MjJ0IiwgQVJNVjRULCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtOTMxMiIsIEFSTVY0VCwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTk0MHQiLCBBUk1WNFQsIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJlcDkzMTIiLCBBUk1WNFQsIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJhcm0xMHRkbWkiLCBBUk1WNVQsIEZLX05PTkUsIHRydWUsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTEwMjB0IiwgQVJNVjVULCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtOWUiLCBBUk1WNVRFLCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtOTQ2ZS1zIiwgQVJNVjVURSwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTk2NmUtcyIsIEFSTVY1VEUsIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJhcm05NjhlLXMiLCBBUk1WNVRFLCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtMTBlIiwgQVJNVjVURSwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTEwMjBlIiwgQVJNVjVURSwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTEwMjJlIiwgQVJNVjVURSwgRktfTk9ORSwgdHJ1ZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtOTI2ZWotcyIsIEFSTVY1VEVKLCBGS19OT05FLCB0cnVlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJhcm0xMTM2ai1zIiwgQVJNVjYsIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJhcm0xMTM2amYtcyIsIEFSTVY2LCBGS19WRlBWMiwgdHJ1ZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtMTEzNmp6LXMiLCBBUk1WNiwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTExNzZqLXMiLCBBUk1WNkssIEZLX05PTkUsIHRydWUsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTExNzZqei1zIiwgQVJNVjZLWiwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoIm1wY29yZSIsIEFSTVY2SywgRktfVkZQVjIsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJtcGNvcmVub3ZmcCIsIEFSTVY2SywgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTExNzZqemYtcyIsIEFSTVY2S1osIEZLX1ZGUFYyLCB0cnVlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJhcm0xMTU2dDItcyIsIEFSTVY2VDIsIEZLX05PTkUsIHRydWUsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTExNTZ0MmYtcyIsIEFSTVY2VDIsIEZLX1ZGUFYyLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiY29ydGV4LW0wIiwgQVJNVjZNLCBGS19OT05FLCB0cnVlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtbTBwbHVzIiwgQVJNVjZNLCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiY29ydGV4LW0xIiwgQVJNVjZNLCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgic2MwMDAiLCBBUk1WNk0sIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtYTUiLCBBUk1WN0EsIEZLX05FT05fVkZQVjQsIGZhbHNlLAorICAgICAgICAgICAgIChBUk06OkFFS19TRUMgfCBBUk06OkFFS19NUCkpCitBUk1fQ1BVX05BTUUoImNvcnRleC1hNyIsIEFSTVY3QSwgRktfTkVPTl9WRlBWNCwgZmFsc2UsCisgICAgICAgICAgICAgKEFSTTo6QUVLX1NFQyB8IEFSTTo6QUVLX01QIHwgQVJNOjpBRUtfVklSVCB8IEFSTTo6QUVLX0hXRElWQVJNIHwKKyAgICAgICAgICAgICAgQVJNOjpBRUtfSFdESVZUSFVNQikpCitBUk1fQ1BVX05BTUUoImNvcnRleC1hOCIsIEFSTVY3QSwgRktfTkVPTiwgZmFsc2UsIEFSTTo6QUVLX1NFQykKK0FSTV9DUFVfTkFNRSgiY29ydGV4LWE5IiwgQVJNVjdBLCBGS19ORU9OX0ZQMTYsIGZhbHNlLCAoQVJNOjpBRUtfU0VDIHwgQVJNOjpBRUtfTVApKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtYTEyIiwgQVJNVjdBLCBGS19ORU9OX1ZGUFY0LCBmYWxzZSwKKyAgICAgICAgICAgICAoQVJNOjpBRUtfU0VDIHwgQVJNOjpBRUtfTVAgfCBBUk06OkFFS19WSVJUIHwgQVJNOjpBRUtfSFdESVZBUk0gfAorICAgICAgICAgICAgICBBUk06OkFFS19IV0RJVlRIVU1CKSkKK0FSTV9DUFVfTkFNRSgiY29ydGV4LWExNSIsIEFSTVY3QSwgRktfTkVPTl9WRlBWNCwgZmFsc2UsCisgICAgICAgICAgICAgKEFSTTo6QUVLX1NFQyB8IEFSTTo6QUVLX01QIHwgQVJNOjpBRUtfVklSVCB8IEFSTTo6QUVLX0hXRElWQVJNIHwKKyAgICAgICAgICAgICAgQVJNOjpBRUtfSFdESVZUSFVNQikpCitBUk1fQ1BVX05BTUUoImNvcnRleC1hMTciLCBBUk1WN0EsIEZLX05FT05fVkZQVjQsIGZhbHNlLAorICAgICAgICAgICAgIChBUk06OkFFS19TRUMgfCBBUk06OkFFS19NUCB8IEFSTTo6QUVLX1ZJUlQgfCBBUk06OkFFS19IV0RJVkFSTSB8CisgICAgICAgICAgICAgIEFSTTo6QUVLX0hXRElWVEhVTUIpKQorQVJNX0NQVV9OQU1FKCJrcmFpdCIsIEFSTVY3QSwgRktfTkVPTl9WRlBWNCwgZmFsc2UsCisgICAgICAgICAgICAgKEFSTTo6QUVLX0hXRElWQVJNIHwgQVJNOjpBRUtfSFdESVZUSFVNQikpCitBUk1fQ1BVX05BTUUoImNvcnRleC1yNCIsIEFSTVY3UiwgRktfTk9ORSwgdHJ1ZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiY29ydGV4LXI0ZiIsIEFSTVY3UiwgRktfVkZQVjNfRDE2LCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiY29ydGV4LXI1IiwgQVJNVjdSLCBGS19WRlBWM19EMTYsIGZhbHNlLAorICAgICAgICAgICAgIChBUk06OkFFS19NUCB8IEFSTTo6QUVLX0hXRElWQVJNKSkKK0FSTV9DUFVfTkFNRSgiY29ydGV4LXI3IiwgQVJNVjdSLCBGS19WRlBWM19EMTZfRlAxNiwgZmFsc2UsCisgICAgICAgICAgICAgKEFSTTo6QUVLX01QIHwgQVJNOjpBRUtfSFdESVZBUk0pKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtcjgiLCBBUk1WN1IsIEZLX1ZGUFYzX0QxNl9GUDE2LCBmYWxzZSwKKyAgICAgICAgICAgICAoQVJNOjpBRUtfTVAgfCBBUk06OkFFS19IV0RJVkFSTSkpCitBUk1fQ1BVX05BTUUoImNvcnRleC1yNTIiLCBBUk1WOFIsIEZLX05FT05fRlBfQVJNVjgsIHRydWUsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoInNjMzAwIiwgQVJNVjdNLCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiY29ydGV4LW0zIiwgQVJNVjdNLCBGS19OT05FLCB0cnVlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtbTQiLCBBUk1WN0VNLCBGS19GUFY0X1NQX0QxNiwgdHJ1ZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiY29ydGV4LW03IiwgQVJNVjdFTSwgRktfRlBWNV9EMTYsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtbTIzIiwgQVJNVjhNQmFzZWxpbmUsIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtbTMzIiwgQVJNVjhNTWFpbmxpbmUsIEZLX0ZQVjVfU1BfRDE2LCBmYWxzZSwgQVJNOjpBRUtfRFNQKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtYTMyIiwgQVJNVjhBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsIEFSTTo6QUVLX0NSQykKK0FSTV9DUFVfTkFNRSgiY29ydGV4LWEzNSIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLCBBUk06OkFFS19DUkMpCitBUk1fQ1BVX05BTUUoImNvcnRleC1hNTMiLCBBUk1WOEEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwgQVJNOjpBRUtfQ1JDKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtYTU1IiwgQVJNVjhfMkEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwKKyAgICAgICAgICAgIChBUk06OkFFS19GUDE2IHwgQVJNOjpBRUtfRE9UUFJPRCkpCitBUk1fQ1BVX05BTUUoImNvcnRleC1hNTciLCBBUk1WOEEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwgQVJNOjpBRUtfQ1JDKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtYTcyIiwgQVJNVjhBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsIEFSTTo6QUVLX0NSQykKK0FSTV9DUFVfTkFNRSgiY29ydGV4LWE3MyIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLCBBUk06OkFFS19DUkMpCitBUk1fQ1BVX05BTUUoImNvcnRleC1hNzUiLCBBUk1WOF8yQSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLAorICAgICAgICAgICAgKEFSTTo6QUVLX0ZQMTYgfCBBUk06OkFFS19ET1RQUk9EKSkKK0FSTV9DUFVfTkFNRSgiY3ljbG9uZSIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLCBBUk06OkFFS19DUkMpCitBUk1fQ1BVX05BTUUoImV4eW5vcy1tMSIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLCBBUk06OkFFS19DUkMpCitBUk1fQ1BVX05BTUUoImV4eW5vcy1tMiIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLCBBUk06OkFFS19DUkMpCitBUk1fQ1BVX05BTUUoImV4eW5vcy1tMyIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLCBBUk06OkFFS19DUkMpCitBUk1fQ1BVX05BTUUoImtyeW8iLCBBUk1WOEEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwgQVJNOjpBRUtfQ1JDKQorLy8gTm9uLXN0YW5kYXJkIEFyY2ggbmFtZXMuCitBUk1fQ1BVX05BTUUoIml3bW14dCIsIElXTU1YVCwgRktfTk9ORSwgdHJ1ZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgieHNjYWxlIiwgWFNDQUxFLCBGS19OT05FLCB0cnVlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJzd2lmdCIsIEFSTVY3UywgRktfTkVPTl9WRlBWNCwgdHJ1ZSwKKyAgICAgICAgICAgICAoQVJNOjpBRUtfSFdESVZBUk0gfCBBUk06OkFFS19IV0RJVlRIVU1CKSkKKy8vIEludmFsaWQgQ1BVCitBUk1fQ1BVX05BTUUoImludmFsaWQiLCBJTlZBTElELCBGS19JTlZBTElELCB0cnVlLCBBUk06OkFFS19JTlZBTElEKQorI3VuZGVmIEFSTV9DUFVfTkFNRQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FSTVdpbkVILmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQVJNV2luRUguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDYzNjI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FSTVdpbkVILmgKQEAgLTAsMCArMSwzODIgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L1dpbkFSTUVILmggLSBXaW5kb3dzIG9uIEFSTSBFSCBDb25zdGFudHMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0FSTVdJTkVIX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0FSTVdJTkVIX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgQVJNIHsKK25hbWVzcGFjZSBXaW5FSCB7CitlbnVtIGNsYXNzIFJ1bnRpbWVGdW5jdGlvbkZsYWcgeworICBSRkZfVW5wYWNrZWQsICAgICAgIC8vLyB1bnBhY2tlZCBlbnRyeQorICBSRkZfUGFja2VkLCAgICAgICAgIC8vLyBwYWNrZWQgZW50cnkKKyAgUkZGX1BhY2tlZEZyYWdtZW50LCAvLy8gcGFja2VkIGVudHJ5IHJlcHJlc2VudGluZyBhIGZyYWdtZW50CisgIFJGRl9SZXNlcnZlZCwgICAgICAgLy8vIHJlc2VydmVkCit9OworCitlbnVtIGNsYXNzIFJldHVyblR5cGUgeworICBSVF9QT1AsICAgICAgICAgICAgIC8vLyByZXR1cm4gdmlhIHBvcCB7cGN9IChMIGZsYWcgbXVzdCBiZSBzZXQpCisgIFJUX0IsICAgICAgICAgICAgICAgLy8vIDE2LWJpdCBicmFuY2gKKyAgUlRfQlcsICAgICAgICAgICAgICAvLy8gMzItYml0IGJyYW5jaAorICBSVF9Ob0VwaWxvZ3VlLCAgICAgIC8vLyBubyBlcGlsb2d1ZSAoZnJhZ21lbnQpCit9OworCisvLy8gUnVudGltZUZ1bmN0aW9uIC0gQW4gZW50cnkgaW4gdGhlIHRhYmxlIG9mIHByb2NlZHVyZSBkYXRhICgucGRhdGEpCisvLy8KKy8vLyAgMyAzIDIgMiAyIDIgMiAyIDIgMiAyIDIgMSAxIDEgMSAxIDEgMSAxIDEgMSAwIDAgMCAwIDAgMCAwIDAgMCAwCisvLy8gIDEgMCA5IDggNyA2IDUgNCAzIDIgMSAwIDkgOCA3IDYgNSA0IDMgMiAxIDAgOSA4IDcgNiA1IDQgMyAyIDEgMAorLy8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLy8gfCAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uIFN0YXJ0IFJWQSAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vLyArLS0tLS0tLS0tLS0tLS0tLS0tLSstKy0rLSstLS0tLSstKy0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKworLy8vIHwgICAgU3RhY2sgQWRqdXN0ICAgfEN8THxSfCBSZWcgfEh8UmV0fCAgIEZ1bmN0aW9uIExlbmd0aCAgIHxGbGd8CisvLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0rLSstKy0rLS0tLS0rLSstLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSsKKy8vLworLy8vIEZsYWcgOiAyLWJpdCBmaWVsZCB3aXRoIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6CisvLy8gICAtIDAwID0gcGFja2VkIHVud2luZCBkYXRhIG5vdCB1c2VkOyByZWFtaW5pbmcgYml0cyBwb2ludCB0byAueGRhdGEgcmVjb3JkCisvLy8gICAtIDAxID0gcGFja2VkIHVud2luZCBkYXRhCisvLy8gICAtIDEwID0gcGFja2VkIHVud2luZCBkYXRhLCBmdW5jdGlvbiBhc3N1bWVkIHRvIGhhdmUgbm8gcHJvbG9ndWU7IHVzZWZ1bAorLy8vICAgICAgICAgIGZvciBmdW5jdGlvbiBmcmFnbWVudHMgdGhhdCBhcmUgZGlzY29udGlndW91cyB3aXRoIHRoZSBzdGFydCBvZiB0aGUKKy8vLyAgICAgICAgICBmdW5jdGlvbgorLy8vICAgLSAxMSA9IHJlc2VydmVkCisvLy8gRnVuY3Rpb24gTGVuZ3RoIDogMTEtYml0IGZpZWxkIHByb3ZpZGluZyB0aGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24KKy8vLyAgICAgICAgICAgICAgICAgICBpbiBieXRlcywgZGl2aWRlZCBieSAyOyBpZiB0aGUgZnVuY3Rpb24gaXMgZ3JlYXRlciB0aGFuCisvLy8gICAgICAgICAgICAgICAgICAgNEtCLCBhIGZ1bGwgLnhkYXRhIHJlY29yZCBtdXN0IGJlIHVzZWQgaW5zdGVhZAorLy8vIFJldCA6IDItYml0IGZpZWxkIGluZGljYXRpbmcgaG93IHRoZSBmdW5jdGlvbiByZXR1cm5zCisvLy8gICAtIDAwID0gcmV0dXJuIHZpYSBwb3Age3BjfSAodGhlIEwgYml0IG11c3QgYmUgc2V0KQorLy8vICAgLSAwMSA9IHJldHVybiB2aWEgMTYtYml0IGJyYW5jaAorLy8vICAgLSAxMCA9IHJldHVybiB2aWEgMzItYml0IGJyYW5jaAorLy8vICAgLSAxMSA9IG5vIGVwaWxvZ3VlOyB1c2VmdWwgZm9yIGZ1bmN0aW9uIGZyYWdtZW50cyB0aGF0IG1heSBvbmx5IGNvbnRhaW4gYQorLy8vICAgICAgICAgIHByb2xvZ3VlIGJ1dCB0aGUgZXBpbG9ndWUgaXMgZWxzZXdoZXJlCisvLy8gSCA6IDEtYml0IGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmdW5jdGlvbiAiaG9tZXMiIHRoZSBpbnRlZ2VyIHBhcmFtZXRlcgorLy8vICAgICByZWdpc3RlcnMgKHIwLXIzKSwgYWxsb2NhdGluZyAxNi1ieXRlcyBvbiB0aGUgc3RhY2sKKy8vLyBSZWcgOiAzLWJpdCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzYXZlZCBub24tdm9sYXRpbGUKKy8vLyAgICAgICByZWdpc3Rlci4gIElmIHRoZSBSIGJpdCBpcyBzZXQgdG8gMCwgdGhlbiBvbmx5IGludGVnZXIgcmVnaXN0ZXJzIGFyZQorLy8vICAgICAgIHNhdmVkIChyNC1yTiwgd2hlcmUgTiBpcyA0ICsgUmVnKS4gIElmIHRoZSBSIGJpdCBpcyBzZXQgdG8gMSwgdGhlbgorLy8vICAgICAgIG9ubHkgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzIGFyZSBiZWluZyBzYXZlZCAoZDgtZE4sIHdoZXJlIE4gaXMKKy8vLyAgICAgICA4ICsgUmVnKS4gIFRoZSBzcGVjaWFsIGNhc2Ugb2YgdGhlIFIgYml0IGJlaW5nIHNldCB0byAxIGFuZCBSZWcgZXF1YWwKKy8vLyAgICAgICB0byA3IGluZGljYXRlcyB0aGF0IG5vIHJlZ2lzdGVycyBhcmUgc2F2ZWQuCisvLy8gUiA6IDEtYml0IGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBub24tdm9sYXRpbGUgcmVnaXN0ZXJzIGFyZSBpbnRlZ2VyIG9yCisvLy8gICAgIGZsb2F0aW5nLXBvaW50LiAgMCBpbmRpY2F0ZXMgaW50ZWdlciwgMSBpbmRpY2F0ZXMgZmxvYXRpbmctcG9pbnQuICBUaGUKKy8vLyAgICAgc3BlY2lhbCBjYXNlIG9mIHRoZSBSLWZsYWcgYmVpbmcgc2V0IGFuZCBSZWcgYmVpbmcgc2V0IHRvIDcgaW5kaWNhdGVzCisvLy8gICAgIHRoYXQgbm8gbm9uLXZvbGF0aWxlIHJlZ2lzdGVycyBhcmUgc2F2ZWQuCisvLy8gTCA6IDEtYml0IGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBzYXZlcy9yZXN0b3JlcyB0aGUgbGluaworLy8vICAgICByZWdpc3RlciAoTFIpCisvLy8gQyA6IDEtYml0IGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpbmNsdWRlcyBleHRyYSBpbnN0cnVjdGlvbnMKKy8vLyAgICAgdG8gc2V0dXAgYSBmcmFtZSBjaGFpbiBmb3IgZmFzdCB3YWxraW5nLiAgSWYgdGhpcyBmbGFnIGlzIHNldCwgcjExIGlzCisvLy8gICAgIGltcGxpY2l0bHkgYWRkZWQgdG8gdGhlIGxpc3Qgb2Ygc2F2ZWQgbm9uLXZvbGF0aWxlIGludGVnZXIgcmVnaXN0ZXJzLgorLy8vIFN0YWNrIEFkanVzdCA6IDEwLWJpdCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2Ygc3RhY2sgdGhhdCBhcmUKKy8vLyAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgZm9yIHRoaXMgZnVuY3Rpb24uICBPbmx5IHZhbHVlcyBiZXR3ZWVuIDB4MDAwIGFuZAorLy8vICAgICAgICAgICAgICAgIDB4M2YzIGNhbiBiZSBkaXJlY3RseSBlbmNvZGVkLiAgSWYgdGhlIHZhbHVlIGlzIDB4M2Y0IG9yCisvLy8gICAgICAgICAgICAgICAgZ3JlYXRlciwgdGhlbiB0aGUgbG93IDQgYml0cyBoYXZlIHNwZWNpYWwgbWVhbmluZyBhcyBmb2xsb3dzOgorLy8vICAgICAgICAgICAgICAgIC0gQml0IDAtMQorLy8vICAgICAgICAgICAgICAgICAgaW5kaWNhdGUgdGhlIG51bWJlciBvZiB3b3Jkcycgb2YgYWRqdXN0bWVudCAoMS00KSwgbWludXMgMQorLy8vICAgICAgICAgICAgICAgIC0gQml0IDIKKy8vLyAgICAgICAgICAgICAgICAgIGluZGljYXRlcyBpZiB0aGUgcHJvbG9ndWUgY29tYmluZWQgYWRqdXN0bWVudCBpbnRvIHB1c2gKKy8vLyAgICAgICAgICAgICAgICAtIEJpdCAzCisvLy8gICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgaWYgdGhlIGVwaWxvZ3VlIGNvbWJpbmVkIGFkanVzdG1lbnQgaW50byBwb3AKKy8vLworLy8vIFJFU1RSSUNUSU9OUzoKKy8vLyAgIC0gSUYgQyBpcyBTRVQ6CisvLy8gICAgICsgTCBmbGFnIG11c3QgYmUgc2V0IHNpbmNlIGZyYW1lIGNoYWluaW5nIHJlcXVpcmVzIHIxMSBhbmQgbHIKKy8vLyAgICAgKyByMTEgbXVzdCBOT1QgYmUgaW5jbHVkZWQgaW4gdGhlIHNldCBvZiByZWdpc3RlcnMgZGVzY3JpYmVkIGJ5IFJlZworLy8vICAgLSBJRiBSZXQgaXMgMDoKKy8vLyAgICAgKyBMIGZsYWcgbXVzdCBiZSBzZXQKKworLy8gTk9URTogUnVudGltZUZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGEgc2ltcGxlIGNsYXNzIHRoYXQgcHJvdmlkZXMgcmF3IGFjY2VzcworLy8gdG8gYWxsIGZpZWxkcyBpbiB0aGUgc3RydWN0dXJlLiAgVGhlIGFjY2Vzc29yIG1ldGhvZHMgcmVmbGVjdCB0aGUgbmFtZXMgb2YKKy8vIHRoZSBiaXRmaWVsZHMgdGhhdCB0aGV5IGNvcnJlc3BvbmQgdG8uICBBbHRob3VnaCBzb21lIG9idmlvdXMgc2ltcGxpZmljYXRpb25zCisvLyBhcmUgcG9zc2libGUgdmlhIG1lcmdpbmcgb2YgbWV0aG9kcywgaXQgd291bGQgcHJldmVudCB0aGUgdXNlIG9mIHRoaXMgY2xhc3MKKy8vIHRvIGZ1bGx5IGluc3BlY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhIHN0cnVjdHVyZSB3aGljaCBpcyBwYXJ0aWN1bGFybHkKKy8vIHVzZWZ1bCBmb3Igc2NlbmFyaW9zIHN1Y2ggYXMgbGx2bS1yZWFkb2JqIHRvIGFpZCBpbiB0ZXN0aW5nLgorCitjbGFzcyBSdW50aW1lRnVuY3Rpb24geworcHVibGljOgorICBjb25zdCBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBCZWdpbkFkZHJlc3M7CisgIGNvbnN0IHN1cHBvcnQ6OnVsaXR0bGUzMl90IFVud2luZERhdGE7CisKKyAgUnVudGltZUZ1bmN0aW9uKGNvbnN0IHN1cHBvcnQ6OnVsaXR0bGUzMl90ICpEYXRhKQorICAgIDogQmVnaW5BZGRyZXNzKERhdGFbMF0pLCBVbndpbmREYXRhKERhdGFbMV0pIHt9CisKKyAgUnVudGltZUZ1bmN0aW9uKGNvbnN0IHN1cHBvcnQ6OnVsaXR0bGUzMl90IEJlZ2luQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN1cHBvcnQ6OnVsaXR0bGUzMl90IFVud2luZERhdGEpCisgICAgOiBCZWdpbkFkZHJlc3MoQmVnaW5BZGRyZXNzKSwgVW53aW5kRGF0YShVbndpbmREYXRhKSB7fQorCisgIFJ1bnRpbWVGdW5jdGlvbkZsYWcgRmxhZygpIGNvbnN0IHsKKyAgICByZXR1cm4gUnVudGltZUZ1bmN0aW9uRmxhZyhVbndpbmREYXRhICYgMHgzKTsKKyAgfQorCisgIHVpbnQzMl90IEV4Y2VwdGlvbkluZm9ybWF0aW9uUlZBKCkgY29uc3QgeworICAgIGFzc2VydChGbGFnKCkgPT0gUnVudGltZUZ1bmN0aW9uRmxhZzo6UkZGX1VucGFja2VkICYmCisgICAgICAgICAgICJ1bnBhY2tlZCBmb3JtIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbiIpOworICAgIHJldHVybiAoVW53aW5kRGF0YSAmIH4weDMpOworICB9CisKKyAgdWludDMyX3QgUGFja2VkVW53aW5kRGF0YSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoKEZsYWcoKSA9PSBSdW50aW1lRnVuY3Rpb25GbGFnOjpSRkZfUGFja2VkIHx8CisgICAgICAgICAgICBGbGFnKCkgPT0gUnVudGltZUZ1bmN0aW9uRmxhZzo6UkZGX1BhY2tlZEZyYWdtZW50KSAmJgorICAgICAgICAgICAicGFja2VkIGZvcm0gcmVxdWlyZWQgZm9yIHRoaXMgb3BlcmF0aW9uIik7CisgICAgcmV0dXJuIChVbndpbmREYXRhICYgfjB4Myk7CisgIH0KKyAgdWludDMyX3QgRnVuY3Rpb25MZW5ndGgoKSBjb25zdCB7CisgICAgYXNzZXJ0KChGbGFnKCkgPT0gUnVudGltZUZ1bmN0aW9uRmxhZzo6UkZGX1BhY2tlZCB8fAorICAgICAgICAgICAgRmxhZygpID09IFJ1bnRpbWVGdW5jdGlvbkZsYWc6OlJGRl9QYWNrZWRGcmFnbWVudCkgJiYKKyAgICAgICAgICAgInBhY2tlZCBmb3JtIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbiIpOworICAgIHJldHVybiAoKChVbndpbmREYXRhICYgMHgwMDAwMWZmYykgPj4gMikgPDwgMSk7CisgIH0KKyAgUmV0dXJuVHlwZSBSZXQoKSBjb25zdCB7CisgICAgYXNzZXJ0KChGbGFnKCkgPT0gUnVudGltZUZ1bmN0aW9uRmxhZzo6UkZGX1BhY2tlZCB8fAorICAgICAgICAgICAgRmxhZygpID09IFJ1bnRpbWVGdW5jdGlvbkZsYWc6OlJGRl9QYWNrZWRGcmFnbWVudCkgJiYKKyAgICAgICAgICAgInBhY2tlZCBmb3JtIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbiIpOworICAgIGFzc2VydCgoKFVud2luZERhdGEgJiAweDAwMDA2MDAwKSB8fCBMKCkpICYmICJMIG11c3QgYmUgc2V0IHRvIDEiKTsKKyAgICByZXR1cm4gUmV0dXJuVHlwZSgoVW53aW5kRGF0YSAmIDB4MDAwMDYwMDApID4+IDEzKTsKKyAgfQorICBib29sIEgoKSBjb25zdCB7CisgICAgYXNzZXJ0KChGbGFnKCkgPT0gUnVudGltZUZ1bmN0aW9uRmxhZzo6UkZGX1BhY2tlZCB8fAorICAgICAgICAgICAgRmxhZygpID09IFJ1bnRpbWVGdW5jdGlvbkZsYWc6OlJGRl9QYWNrZWRGcmFnbWVudCkgJiYKKyAgICAgICAgICAgInBhY2tlZCBmb3JtIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbiIpOworICAgIHJldHVybiAoKFVud2luZERhdGEgJiAweDAwMDA4MDAwKSA+PiAxNSk7CisgIH0KKyAgdWludDhfdCBSZWcoKSBjb25zdCB7CisgICAgYXNzZXJ0KChGbGFnKCkgPT0gUnVudGltZUZ1bmN0aW9uRmxhZzo6UkZGX1BhY2tlZCB8fAorICAgICAgICAgICAgRmxhZygpID09IFJ1bnRpbWVGdW5jdGlvbkZsYWc6OlJGRl9QYWNrZWRGcmFnbWVudCkgJiYKKyAgICAgICAgICAgInBhY2tlZCBmb3JtIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbiIpOworICAgIHJldHVybiAoKFVud2luZERhdGEgJiAweDAwMDcwMDAwKSA+PiAxNik7CisgIH0KKyAgYm9vbCBSKCkgY29uc3QgeworICAgIGFzc2VydCgoRmxhZygpID09IFJ1bnRpbWVGdW5jdGlvbkZsYWc6OlJGRl9QYWNrZWQgfHwKKyAgICAgICAgICAgIEZsYWcoKSA9PSBSdW50aW1lRnVuY3Rpb25GbGFnOjpSRkZfUGFja2VkRnJhZ21lbnQpICYmCisgICAgICAgICAgICJwYWNrZWQgZm9ybSByZXF1aXJlZCBmb3IgdGhpcyBvcGVyYXRpb24iKTsKKyAgICByZXR1cm4gKChVbndpbmREYXRhICYgMHgwMDA4MDAwMCkgPj4gMTkpOworICB9CisgIGJvb2wgTCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoKEZsYWcoKSA9PSBSdW50aW1lRnVuY3Rpb25GbGFnOjpSRkZfUGFja2VkIHx8CisgICAgICAgICAgICBGbGFnKCkgPT0gUnVudGltZUZ1bmN0aW9uRmxhZzo6UkZGX1BhY2tlZEZyYWdtZW50KSAmJgorICAgICAgICAgICAicGFja2VkIGZvcm0gcmVxdWlyZWQgZm9yIHRoaXMgb3BlcmF0aW9uIik7CisgICAgcmV0dXJuICgoVW53aW5kRGF0YSAmIDB4MDAxMDAwMDApID4+IDIwKTsKKyAgfQorICBib29sIEMoKSBjb25zdCB7CisgICAgYXNzZXJ0KChGbGFnKCkgPT0gUnVudGltZUZ1bmN0aW9uRmxhZzo6UkZGX1BhY2tlZCB8fAorICAgICAgICAgICAgRmxhZygpID09IFJ1bnRpbWVGdW5jdGlvbkZsYWc6OlJGRl9QYWNrZWRGcmFnbWVudCkgJiYKKyAgICAgICAgICAgInBhY2tlZCBmb3JtIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbiIpOworICAgIGFzc2VydCgoKH5VbndpbmREYXRhICYgMHgwMDIwMDAwMCkgfHwgTCgpKSAmJgorICAgICAgICAgICAiTCBmbGFnIG11c3QgYmUgc2V0LCBjaGFpbmluZyByZXF1aXJlcyByMTEgYW5kIExSIik7CisgICAgYXNzZXJ0KCgoflVud2luZERhdGEgJiAweDAwMjAwMDAwKSB8fCAoUmVnKCkgPCA3KSB8fCBSKCkpICYmCisgICAgICAgICAgICJyMTEgbXVzdCBub3QgYmUgaW5jbHVkZWQgaW4gUmVnOyBDIGltcGxpZXMgcjExIik7CisgICAgcmV0dXJuICgoVW53aW5kRGF0YSAmIDB4MDAyMDAwMDApID4+IDIxKTsKKyAgfQorICB1aW50MTZfdCBTdGFja0FkanVzdCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoKEZsYWcoKSA9PSBSdW50aW1lRnVuY3Rpb25GbGFnOjpSRkZfUGFja2VkIHx8CisgICAgICAgICAgICBGbGFnKCkgPT0gUnVudGltZUZ1bmN0aW9uRmxhZzo6UkZGX1BhY2tlZEZyYWdtZW50KSAmJgorICAgICAgICAgICAicGFja2VkIGZvcm0gcmVxdWlyZWQgZm9yIHRoaXMgb3BlcmF0aW9uIik7CisgICAgcmV0dXJuICgoVW53aW5kRGF0YSAmIDB4ZmZjMDAwMDApID4+IDIyKTsKKyAgfQorfTsKKworLy8vIFByb2xvZ3VlRm9sZGluZyAtIHBzZXVkby1mbGFnIGRlcml2ZWQgZnJvbSBTdGFjayBBZGp1c3QgaW5kaWNhdGluZyB0aGF0IHRoZQorLy8vIHByb2xvZ3VlIGhhcyBzdGFjayBhZGp1c3RtZW50IGNvbWJpbmVkIGludG8gdGhlIHB1c2gKK2lubGluZSBib29sIFByb2xvZ3VlRm9sZGluZyhjb25zdCBSdW50aW1lRnVuY3Rpb24gJlJGKSB7CisgIHJldHVybiBSRi5TdGFja0FkanVzdCgpID49IDB4M2Y0ICYmIChSRi5TdGFja0FkanVzdCgpICYgMHg0KTsKK30KKy8vLyBFcGlsb2d1ZSAtIHBzZXVkby1mbGFnIGRlcml2ZWQgZnJvbSBTdGFjayBBZGp1c3QgaW5kaWNhdGluZyB0aGF0IHRoZQorLy8vIGVwaWxvZ3VlIGhhcyBzdGFjayBhZGp1c3RtZW50IGNvbWJpbmVkIGludG8gdGhlIHBvcAoraW5saW5lIGJvb2wgRXBpbG9ndWVGb2xkaW5nKGNvbnN0IFJ1bnRpbWVGdW5jdGlvbiAmUkYpIHsKKyAgcmV0dXJuIFJGLlN0YWNrQWRqdXN0KCkgPj0gMHgzZjQgJiYgKFJGLlN0YWNrQWRqdXN0KCkgJiAweDgpOworfQorLy8vIFN0YWNrQWRqdXN0bWVudCAtIGNhbGN1bGF0ZWQgc3RhY2sgYWRqdXN0bWVudCBpbiB3b3Jkcy4gIFRoZSBzdGFjaworLy8vIGFkanVzdG1lbnQgc2hvdWxkIGJlIGRldGVybWluZWQgdmlhIHRoaXMgZnVuY3Rpb24gdG8gYWNjb3VudCBmb3IgdGhlIHNwZWNpYWwKKy8vLyBoYW5kbGluZyB0aGUgc3BlY2lhbCBlbmNvZGluZyB3aGVuIHRoZSB2YWx1ZSBpcyA+PSAweDNmNC4KK2lubGluZSB1aW50MTZfdCBTdGFja0FkanVzdG1lbnQoY29uc3QgUnVudGltZUZ1bmN0aW9uICZSRikgeworICB1aW50MTZfdCBBZGp1c3RtZW50ID0gUkYuU3RhY2tBZGp1c3QoKTsKKyAgaWYgKEFkanVzdG1lbnQgPj0gMHgzZjQpCisgICAgcmV0dXJuIChBZGp1c3RtZW50ICYgMHgzKSA/ICgoQWRqdXN0bWVudCAmIDB4MykgPDwgMikgLSAxIDogMDsKKyAgcmV0dXJuIEFkanVzdG1lbnQ7Cit9CisKKy8vLyBTYXZlZFJlZ2lzdGVyTWFzayAtIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBzZXQgb2Ygc2F2ZWQgZ2VuZXJhbAorLy8vIHB1cnBvc2UgKHIwLXIxNSkgYW5kIFZGUCAoZDAtZDMxKSByZWdpc3RlcnMuCitzdGQ6OnBhaXI8dWludDE2X3QsIHVpbnQzMl90PiBTYXZlZFJlZ2lzdGVyTWFzayhjb25zdCBSdW50aW1lRnVuY3Rpb24gJlJGKTsKKworLy8vIEV4Y2VwdGlvbkRhdGFSZWNvcmQgLSBBbiBlbnRyeSBpbiB0aGUgdGFibGUgb2YgZXhjZXB0aW9uIGRhdGEgKC54ZGF0YSkKKy8vLworLy8vICAzIDMgMiAyIDIgMiAyIDIgMiAyIDIgMiAxIDEgMSAxIDEgMSAxIDEgMSAxIDAgMCAwIDAgMCAwIDAgMCAwIDAKKy8vLyAgMSAwIDkgOCA3IDYgNSA0IDMgMiAxIDAgOSA4IDcgNiA1IDQgMyAyIDEgMCA5IDggNyA2IDUgNCAzIDIgMSAwCisvLy8gKy0tLS0tLS0rLS0tLS0tLS0tKy0rLSstKy0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vLyB8IEMgV3JkIHwgRXBpIENudCB8RnxFfFh8VmVyfCAgICAgICAgIEZ1bmN0aW9uIExlbmd0aCAgICAgICAgICAgfAorLy8vICstLS0tLS0tKy0tLS0tLS0tKyctJy0nLSctLS0nLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLy8gfCAgICBSZXNlcnZlZCAgICB8RXguIENvZGUgV29yZHN8ICAgKEV4dGVuZGVkIEVwaWxvZ3VlIENvdW50KSAgIHwKKy8vLyArLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8vCisvLy8gRnVuY3Rpb24gTGVuZ3RoIDogMTgtYml0IGZpZWxkIGluZGljYXRpbmcgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgZnVuY3Rpb24KKy8vLyAgICAgICAgICAgICAgICAgICBpbiBieXRlcyBkaXZpZGVkIGJ5IDIuICBJZiBhIGZ1bmN0aW9uIGlzIGxhcmdlciB0aGFuCisvLy8gICAgICAgICAgICAgICAgICAgNTEyS0IsIHRoZW4gbXVsdGlwbGUgcGRhdGEgYW5kIHhkYXRhIHJlY29yZHMgbXVzdCBiZSB1c2VkLgorLy8vIFZlcnMgOiAyLWJpdCBmaWVsZCBkZXNjcmliaW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSByZW1haW5pbmcgc3RydWN0dXJlLiAgT25seQorLy8vICAgICAgICB2ZXJzaW9uIDAgaXMgY3VycmVudGx5IGRlZmluZWQgKHZhbHVlcyAxLTMgYXJlIG5vdCBwZXJtaXR0ZWQpLgorLy8vIFggOiAxLWJpdCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBwcmVzZW5jZSBvZiBleGNlcHRpb24gZGF0YQorLy8vIEUgOiAxLWJpdCBmaWVsZCBpbmRpY2F0aW5nIHRoYXQgdGhlIHNpbmdsZSBlcGlsb2d1ZSBpcyBwYWNrZWQgaW50byB0aGUKKy8vLyAgICAgaGVhZGVyCisvLy8gRiA6IDEtYml0IGZpZWxkIGluZGljYXRpbmcgdGhhdCB0aGUgcmVjb3JkIGRlc2NyaWJlcyBhIGZ1bmN0aW9uIGZyYWdtZW50CisvLy8gICAgIChpbXBsaWVzIHRoYXQgbm8gcHJvbG9ndWUgaXMgcHJlc2VudCwgYW5kIHByb2xvZ3VlIHByb2Nlc3Npbmcgc2hvdWxkIGJlCisvLy8gICAgIHNraXBwZWQpCisvLy8gRXBpbG9ndWUgQ291bnQgOiA1LWJpdCBmaWVsZCB0aGF0IGRpZmZlcnMgaW4gbWVhbmluZyBiYXNlZCBvbiB0aGUgRSBmaWVsZC4KKy8vLworLy8vICAgICAgICAgICAgICAgICAgSWYgRSBpcyBzZXQsIHRoZW4gdGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIGluZGV4IG9mIHRoZQorLy8vICAgICAgICAgICAgICAgICAgZmlyc3QgdW53aW5kIGNvZGUgZGVzY3JpYmluZyB0aGUgKG9ubHkpIGVwaWxvZ3VlLgorLy8vCisvLy8gICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgZXhjZXB0aW9uCisvLy8gICAgICAgICAgICAgICAgICBzY29wZXMuICBJZiBtb3JlIHRoYW4gMzEgc2NvcGVzIGV4aXN0LCB0aGVuIHRoaXMgZmllbGQgYW5kCisvLy8gICAgICAgICAgICAgICAgICB0aGUgQ29kZSBXb3JkcyBmaWVsZCBtdXN0IGJvdGggYmUgc2V0IHRvIDAgdG8gaW5kaWNhdGUgdGhhdAorLy8vICAgICAgICAgICAgICAgICAgYW4gZXh0ZW5zaW9uIHdvcmQgaXMgcmVxdWlyZWQuCisvLy8gQ29kZSBXb3JkcyA6IDQtYml0IGZpZWxkIHRoYXQgc3BlY2llcyB0aGUgbnVtYmVyIG9mIDMyLWJpdCB3b3JkcyBuZWVkZWQgdG8KKy8vLyAgICAgICAgICAgICAgY29udGFpbiBhbGwgdGhlIHVud2luZCBjb2Rlcy4gIElmIG1vcmUgdGhhbiAxNSB3b3JkcyAoNjMgY29kZQorLy8vICAgICAgICAgICAgICBieXRlcykgYXJlIHJlcXVpcmVkLCB0aGVuIHRoaXMgZmllbGQgYW5kIHRoZSBFcGlsb2d1ZSBDb3VudAorLy8vICAgICAgICAgICAgICBmaWVsZCBtdXN0IGJvdGggYmUgc2V0IHRvIDAgdG8gaW5kaWNhdGUgdGhhdCBhbiBleHRlbnNpb24gd29yZAorLy8vICAgICAgICAgICAgICBpcyByZXF1aXJlZC4KKy8vLyBFeHRlbmRlZCBFcGlsb2d1ZSBDb3VudCwgRXh0ZW5kZWQgQ29kZSBXb3JkcyA6CisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkIG9ubHkgaWYgRXBpbG9nIENvdW50IGFuZCBDb2RlIFdvcmRzIGFyZSBib3RoCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byAwLiAgUHJvdmlkZXMgYW4gOC1iaXQgZXh0ZW5kZWQgY29kZSB3b3JkCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50IGFuZCAxNi1iaXRzIGZvciBlcGlsb2d1ZSBjb3VudAorLy8vCisvLy8gIDMgMyAyIDIgMiAyIDIgMiAyIDIgMiAyIDEgMSAxIDEgMSAxIDEgMSAxIDEgMCAwIDAgMCAwIDAgMCAwIDAgMAorLy8vICAxIDAgOSA4IDcgNiA1IDQgMyAyIDEgMCA5IDggNyA2IDUgNCAzIDIgMSAwIDkgOCA3IDYgNSA0IDMgMiAxIDAKKy8vLyArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0rLS0tKy0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8vIHwgIEVwIFN0YXJ0IElkeCAgfCBDb25kIHxSZXN8ICAgICAgIEVwaWxvZ3VlIFN0YXJ0IE9mZnNldCAgICAgICB8CisvLy8gKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tKy0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vLworLy8vIElmIHRoZSBFIGJpdCBpcyB1bnNldCBpbiB0aGUgaGVhZGVyLCB0aGUgaGVhZGVyIGlzIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mCisvLy8gZXBpbG9ndWUgc2NvcGVzLCB3aGljaCBhcmUgc29ydGVkIGJ5IHRoZWlyIG9mZnNldC4KKy8vLworLy8vIEVwaWxvZ3VlIFN0YXJ0IE9mZnNldDogMTgtYml0IGZpZWxkIGVuY29kaW5nIHRoZSBvZmZzZXQgb2YgZXBpbG9ndWUgcmVsYXRpdmUKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24gaW4gYnl0ZXMgZGl2aWRlZCBieSB0d28KKy8vLyBSZXMgOiAyLWJpdCBmaWVsZCByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiAobXVzdCBiZSBzZXQgdG8gMCkKKy8vLyBDb25kaXRpb24gOiA0LWJpdCBmaWVsZCBwcm92aWRpbmcgdGhlIGNvbmRpdGlvbiB1bmRlciB3aGljaCB0aGUgZXBpbG9ndWUgaXMKKy8vLyAgICAgICAgICAgICBleGVjdXRlZC4gIFVuY29uZGl0aW9uYWwgZXBpbG9ndWVzIHNob3VsZCBzZXQgdGhpcyBmaWVsZCB0byAweGUuCisvLy8gICAgICAgICAgICAgRXBpbG9ndWVzIG11c3QgYmUgZW50aXJlbHkgY29uZGl0aW9uYWwgb3IgdW5jb25kaXRpb25hbCwgYW5kIGluCisvLy8gICAgICAgICAgICAgVGh1bWItMiBtb2RlLiAgVGhlIGVwaWxvZ3VlIGJlaW5ncyB3aXRoIHRoZSBmaXJzdCBpbnN0cnVjdGlvbgorLy8vICAgICAgICAgICAgIGFmdGVyIHRoZSBJVCBvcGNvZGUuCisvLy8gRXBpbG9ndWUgU3RhcnQgSW5kZXggOiA4LWJpdCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBieXRlIGluZGV4IG9mIHRoZSBmaXJzdAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgdW53aW5kIGNvZGUgZGVzY3JpYmluZyB0aGUgZXBpbG9ndWUKKy8vLworLy8vICAzIDMgMiAyIDIgMiAyIDIgMiAyIDIgMiAxIDEgMSAxIDEgMSAxIDEgMSAxIDAgMCAwIDAgMCAwIDAgMCAwIDAKKy8vLyAgMSAwIDkgOCA3IDYgNSA0IDMgMiAxIDAgOSA4IDcgNiA1IDQgMyAyIDEgMCA5IDggNyA2IDUgNCAzIDIgMSAwCisvLy8gKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKKy8vLyB8IFVud2luZCBDb2RlIDMgfCBVbndpbmQgQ29kZSAyIHwgVW53aW5kIENvZGUgMSB8IFVud2luZCBDb2RlIDAgfAorLy8vICstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rCisvLy8KKy8vLyBGb2xsb3dpbmcgdGhlIGVwaWxvZ3VlIHNjb3BlcywgdGhlIGJ5dGUgY29kZSBkZXNjcmliaW5nIHRoZSB1bndpbmRpbmcKKy8vLyBmb2xsb3dzLiAgVGhpcyBpcyBwYWRkZWQgdG8gYWxpZ24gdXAgdG8gd29yZCBhbGlnbm1lbnQuICBCeXRlcyBhcmUgc3RvcmVkIGluCisvLy8gbGl0dGxlIGVuZGlhbi4KKy8vLworLy8vICAzIDMgMiAyIDIgMiAyIDIgMiAyIDIgMiAxIDEgMSAxIDEgMSAxIDEgMSAxIDAgMCAwIDAgMCAwIDAgMCAwIDAKKy8vLyAgMSAwIDkgOCA3IDYgNSA0IDMgMiAxIDAgOSA4IDcgNiA1IDQgMyAyIDEgMCA5IDggNyA2IDUgNCAzIDIgMSAwCisvLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vLyB8ICAgICAgICAgICBFeGNlcHRpb24gSGFuZGxlciBSVkEgKHJlcXVpcmVzIFggPSAxKSAgICAgICAgICAgICAgfAorLy8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLy8gfCAgKHBvc3NpYmx5IGZvbGxvd2VkIGJ5IGRhdGEgcmVxdWlyZWQgZm9yIGV4Y2VwdGlvbiBoYW5kbGVyKSAgIHwKKy8vLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8vCisvLy8gSWYgdGhlIFggYml0IGlzIHNldCBpbiB0aGUgaGVhZGVyLCB0aGUgdW53aW5kIGJ5dGUgY29kZSBpcyBmb2xsb3dlZCBieSB0aGUKKy8vLyBleGNlcHRpb24gaGFuZGxlciBpbmZvcm1hdGlvbi4gIFRoaXMgY29uc3RhbnRzIG9mIG9uZSBFeGNlcHRpb24gSGFuZGxlciBSVkEKKy8vLyB3aGljaCBpcyB0aGUgYWRkcmVzcyB0byB0aGUgZXhjZXB0aW9uIGhhbmRsZXIsIGZvbGxvd2VkIGltbWVkaWF0ZWx5IGJ5IHRoZQorLy8vIHZhcmlhYmxlIGxlbmd0aCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhjZXB0aW9uIGhhbmRsZXIuCisvLy8KKworc3RydWN0IEVwaWxvZ3VlU2NvcGUgeworICBjb25zdCBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBFUzsKKworICBFcGlsb2d1ZVNjb3BlKGNvbnN0IHN1cHBvcnQ6OnVsaXR0bGUzMl90IERhdGEpIDogRVMoRGF0YSkge30KKyAgdWludDMyX3QgRXBpbG9ndWVTdGFydE9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKEVTICYgMHgwMDAzZmZmZik7CisgIH0KKyAgdWludDhfdCBSZXMoKSBjb25zdCB7CisgICAgcmV0dXJuICgoRVMgJiAweDAwMGMwMDAwKSA+PiAxOCk7CisgIH0KKyAgdWludDhfdCBDb25kaXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuICgoRVMgJiAweDAwZjAwMDAwKSA+PiAyMCk7CisgIH0KKyAgdWludDhfdCBFcGlsb2d1ZVN0YXJ0SW5kZXgoKSBjb25zdCB7CisgICAgcmV0dXJuICgoRVMgJiAweGZmMDAwMDAwKSA+PiAyNCk7CisgIH0KK307CisKK3N0cnVjdCBFeGNlcHRpb25EYXRhUmVjb3JkOworaW5saW5lIHNpemVfdCBIZWFkZXJXb3Jkcyhjb25zdCBFeGNlcHRpb25EYXRhUmVjb3JkICZYUik7CisKK3N0cnVjdCBFeGNlcHRpb25EYXRhUmVjb3JkIHsKKyAgY29uc3Qgc3VwcG9ydDo6dWxpdHRsZTMyX3QgKkRhdGE7CisKKyAgRXhjZXB0aW9uRGF0YVJlY29yZChjb25zdCBzdXBwb3J0Ojp1bGl0dGxlMzJfdCAqRGF0YSkgOiBEYXRhKERhdGEpIHt9CisKKyAgdWludDMyX3QgRnVuY3Rpb25MZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIChEYXRhWzBdICYgMHgwMDAzZmZmZik7CisgIH0KKworICB1aW50OF90IFZlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIChEYXRhWzBdICYgMHgwMDBDMDAwMCkgPj4gMTg7CisgIH0KKworICBib29sIFgoKSBjb25zdCB7CisgICAgcmV0dXJuICgoRGF0YVswXSAmIDB4MDAxMDAwMDApID4+IDIwKTsKKyAgfQorCisgIGJvb2wgRSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKChEYXRhWzBdICYgMHgwMDIwMDAwMCkgPj4gMjEpOworICB9CisKKyAgYm9vbCBGKCkgY29uc3QgeworICAgIHJldHVybiAoKERhdGFbMF0gJiAweDAwNDAwMDAwKSA+PiAyMik7CisgIH0KKworICB1aW50OF90IEVwaWxvZ3VlQ291bnQoKSBjb25zdCB7CisgICAgaWYgKEhlYWRlcldvcmRzKCp0aGlzKSA9PSAxKQorICAgICAgcmV0dXJuIChEYXRhWzBdICYgMHgwZjgwMDAwMCkgPj4gMjM7CisgICAgcmV0dXJuIERhdGFbMV0gJiAweDAwMDBmZmZmOworICB9CisKKyAgdWludDhfdCBDb2RlV29yZHMoKSBjb25zdCB7CisgICAgaWYgKEhlYWRlcldvcmRzKCp0aGlzKSA9PSAxKQorICAgICAgcmV0dXJuIChEYXRhWzBdICYgMHhmMDAwMDAwMCkgPj4gMjg7CisgICAgcmV0dXJuIChEYXRhWzFdICYgMHgwMGZmMDAwMCkgPj4gMTY7CisgIH0KKworICBBcnJheVJlZjxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4gRXBpbG9ndWVTY29wZXMoKSBjb25zdCB7CisgICAgYXNzZXJ0KEUoKSA9PSAwICYmICJlcGlsb2d1ZSBzY29wZXMgYXJlIG9ubHkgcHJlc2VudCB3aGVuIHRoZSBFIGJpdCBpcyAwIik7CisgICAgc2l6ZV90IE9mZnNldCA9IEhlYWRlcldvcmRzKCp0aGlzKTsKKyAgICByZXR1cm4gbWFrZUFycmF5UmVmKCZEYXRhW09mZnNldF0sIEVwaWxvZ3VlQ291bnQoKSk7CisgIH0KKworICBBcnJheVJlZjx1aW50OF90PiBVbndpbmRCeXRlQ29kZSgpIGNvbnN0IHsKKyAgICBjb25zdCBzaXplX3QgT2Zmc2V0ID0gSGVhZGVyV29yZHMoKnRoaXMpCisgICAgICAgICAgICAgICAgICAgICAgICArIChFKCkgPyAwIDogIEVwaWxvZ3VlQ291bnQoKSk7CisgICAgY29uc3QgdWludDhfdCAqQnl0ZUNvZGUgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KCZEYXRhW09mZnNldF0pOworICAgIHJldHVybiBtYWtlQXJyYXlSZWYoQnl0ZUNvZGUsIENvZGVXb3JkcygpICogc2l6ZW9mKHVpbnQzMl90KSk7CisgIH0KKworICB1aW50MzJfdCBFeGNlcHRpb25IYW5kbGVyUlZBKCkgY29uc3QgeworICAgIGFzc2VydChYKCkgJiYgIkV4Y2VwdGlvbiBIYW5kbGVyIFJWQSBpcyBvbmx5IHZhbGlkIGlmIHRoZSBYIGJpdCBpcyBzZXQiKTsKKyAgICByZXR1cm4gRGF0YVtIZWFkZXJXb3JkcygqdGhpcykgKyBFcGlsb2d1ZUNvdW50KCkgKyBDb2RlV29yZHMoKV07CisgIH0KKworICB1aW50MzJfdCBFeGNlcHRpb25IYW5kbGVyUGFyYW1ldGVyKCkgY29uc3QgeworICAgIGFzc2VydChYKCkgJiYgIkV4Y2VwdGlvbiBIYW5kbGVyIFJWQSBpcyBvbmx5IHZhbGlkIGlmIHRoZSBYIGJpdCBpcyBzZXQiKTsKKyAgICByZXR1cm4gRGF0YVtIZWFkZXJXb3JkcygqdGhpcykgKyBFcGlsb2d1ZUNvdW50KCkgKyBDb2RlV29yZHMoKSArIDFdOworICB9Cit9OworCitpbmxpbmUgc2l6ZV90IEhlYWRlcldvcmRzKGNvbnN0IEV4Y2VwdGlvbkRhdGFSZWNvcmQgJlhSKSB7CisgIHJldHVybiAoWFIuRGF0YVswXSAmIDB4ZmY4MDAwMDApID8gMSA6IDI7Cit9Cit9Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FsaWduT2YuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BbGlnbk9mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkMTlhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BbGlnbk9mLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8vPT09LS0tIEFsaWduT2YuaCAtIFBvcnRhYmxlIGNhbGN1bGF0aW9uIG9mIHR5cGUgYWxpZ25tZW50IC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEFsaWduZWRDaGFyQXJyYXkgYW5kIEFsaWduZWRDaGFyQXJyYXlVbmlvbiBjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0FMSUdOT0ZfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQUxJR05PRl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcc3RydWN0IEFsaWduZWRDaGFyQXJyYXkKKy8vLyBcYnJpZWYgSGVscGVyIGZvciBidWlsZGluZyBhbiBhbGlnbmVkIGNoYXJhY3RlciBhcnJheSB0eXBlLgorLy8vCisvLy8gVGhpcyB0ZW1wbGF0ZSBpcyB1c2VkIHRvIGV4cGxpY2l0bHkgYnVpbGQgdXAgYSBjb2xsZWN0aW9uIG9mIGFsaWduZWQKKy8vLyBjaGFyYWN0ZXIgYXJyYXkgdHlwZXMuIFdlIGhhdmUgdG8gYnVpbGQgdGhlc2UgdXAgdXNpbmcgYSBtYWNybyBhbmQgZXhwbGljaXQKKy8vLyBzcGVjaWFsaXphdGlvbiB0byBjb3BlIHdpdGggTVNWQyAoYXQgbGVhc3QgdGlsbCAyMDE1KSB3aGVyZSBvbmx5IGFuCisvLy8gaW50ZWdlciBsaXRlcmFsIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gYWxpZ25tZW50IGNvbnN0cmFpbnQuIE9uY2UgYnVpbHQKKy8vLyB1cCBoZXJlLCB3ZSBjYW4gdGhlbiBiZWdpbiB0byBpbmRpcmVjdCBiZXR3ZWVuIHRoZXNlIHVzaW5nIG5vcm1hbCBDKysKKy8vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgorCisvLyBNU1ZDIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgaGVyZS4KKyNpZm5kZWYgX01TQ19WRVIKKwordGVtcGxhdGU8c3RkOjpzaXplX3QgQWxpZ25tZW50LCBzdGQ6OnNpemVfdCBTaXplPgorc3RydWN0IEFsaWduZWRDaGFyQXJyYXkgeworICBMTFZNX0FMSUdOQVMoQWxpZ25tZW50KSBjaGFyIGJ1ZmZlcltTaXplXTsKK307CisKKyNlbHNlIC8vIF9NU0NfVkVSCisKKy8vLyBcYnJpZWYgQ3JlYXRlIGEgdHlwZSB3aXRoIGFuIGFsaWduZWQgY2hhciBidWZmZXIuCit0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBBbGlnbm1lbnQsIHN0ZDo6c2l6ZV90IFNpemU+CitzdHJ1Y3QgQWxpZ25lZENoYXJBcnJheTsKKworLy8gV2UgcHJvdmlkZSBzcGVjaWFsIHZhcmlhdGlvbnMgb2YgdGhpcyB0ZW1wbGF0ZSBmb3IgdGhlIG1vc3QgY29tbW9uCisvLyBhbGlnbm1lbnRzIGJlY2F1c2UgX19kZWNsc3BlYyhhbGlnbiguLi4pKSBkb2Vzbid0IGFjdHVhbGx5IHdvcmsgd2hlbiBpdCBpcworLy8gYSBtZW1iZXIgb2YgYSBieS12YWx1ZSBmdW5jdGlvbiBhcmd1bWVudCBpbiBNU1ZDLCBldmVuIGlmIHRoZSBhbGlnbm1lbnQKKy8vIHJlcXVlc3QgaXMgc29tZXRoaW5nIHJlYXNvbmFibHkgbGlrZSA4LWJ5dGUgb3IgMTYtYnl0ZS4gTm90ZSB0aGF0IHdlIGNhbid0CisvLyBldmVuIGluY2x1ZGUgdGhlIGRlY2xzcGVjIHdpdGggdGhlIHVuaW9uIHRoYXQgZm9yY2VzIHRoZSBhbGlnbm1lbnQgYmVjYXVzZQorLy8gTVNWQyB3YXJucyBvbiB0aGUgZXhpc3RlbmNlIG9mIHRoZSBkZWNsc3BlYyBkZXNwaXRlIHRoZSB1bmlvbiBtZW1iZXIgZm9yY2luZworLy8gcHJvcGVyIGFsaWdubWVudC4KKwordGVtcGxhdGU8c3RkOjpzaXplX3QgU2l6ZT4KK3N0cnVjdCBBbGlnbmVkQ2hhckFycmF5PDEsIFNpemU+IHsKKyAgdW5pb24geworICAgIGNoYXIgYWxpZ25lZDsKKyAgICBjaGFyIGJ1ZmZlcltTaXplXTsKKyAgfTsKK307CisKK3RlbXBsYXRlPHN0ZDo6c2l6ZV90IFNpemU+CitzdHJ1Y3QgQWxpZ25lZENoYXJBcnJheTwyLCBTaXplPiB7CisgIHVuaW9uIHsKKyAgICBzaG9ydCBhbGlnbmVkOworICAgIGNoYXIgYnVmZmVyW1NpemVdOworICB9OworfTsKKwordGVtcGxhdGU8c3RkOjpzaXplX3QgU2l6ZT4KK3N0cnVjdCBBbGlnbmVkQ2hhckFycmF5PDQsIFNpemU+IHsKKyAgdW5pb24geworICAgIGludCBhbGlnbmVkOworICAgIGNoYXIgYnVmZmVyW1NpemVdOworICB9OworfTsKKwordGVtcGxhdGU8c3RkOjpzaXplX3QgU2l6ZT4KK3N0cnVjdCBBbGlnbmVkQ2hhckFycmF5PDgsIFNpemU+IHsKKyAgdW5pb24geworICAgIGRvdWJsZSBhbGlnbmVkOworICAgIGNoYXIgYnVmZmVyW1NpemVdOworICB9OworfTsKKworCisvLyBUaGUgcmVzdCBvZiB0aGVzZSBhcmUgcHJvdmlkZWQgd2l0aCBhIF9fZGVjbHNwZWMoYWxpZ24oLi4uKSkgYW5kIHdlIHNpbXBseQorLy8gY2FuJ3QgcGFzcyB0aGVtIGJ5LXZhbHVlIGFzIGZ1bmN0aW9uIGFyZ3VtZW50cyBvbiBNU1ZDLgorCisjZGVmaW5lIExMVk1fQUxJR05FRENIQVJBUlJBWV9URU1QTEFURV9BTElHTk1FTlQoeCkgXAorICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBTaXplPiBcCisgIHN0cnVjdCBBbGlnbmVkQ2hhckFycmF5PHgsIFNpemU+IHsgXAorICAgIF9fZGVjbHNwZWMoYWxpZ24oeCkpIGNoYXIgYnVmZmVyW1NpemVdOyBcCisgIH07CisKK0xMVk1fQUxJR05FRENIQVJBUlJBWV9URU1QTEFURV9BTElHTk1FTlQoMTYpCitMTFZNX0FMSUdORURDSEFSQVJSQVlfVEVNUExBVEVfQUxJR05NRU5UKDMyKQorTExWTV9BTElHTkVEQ0hBUkFSUkFZX1RFTVBMQVRFX0FMSUdOTUVOVCg2NCkKK0xMVk1fQUxJR05FRENIQVJBUlJBWV9URU1QTEFURV9BTElHTk1FTlQoMTI4KQorCisjdW5kZWYgTExWTV9BTElHTkVEQ0hBUkFSUkFZX1RFTVBMQVRFX0FMSUdOTUVOVAorCisjZW5kaWYgLy8gX01TQ19WRVIKKworbmFtZXNwYWNlIGRldGFpbCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsCisgICAgICAgICAgdHlwZW5hbWUgVDIgPSBjaGFyLCB0eXBlbmFtZSBUMyA9IGNoYXIsIHR5cGVuYW1lIFQ0ID0gY2hhciwKKyAgICAgICAgICB0eXBlbmFtZSBUNSA9IGNoYXIsIHR5cGVuYW1lIFQ2ID0gY2hhciwgdHlwZW5hbWUgVDcgPSBjaGFyLAorICAgICAgICAgIHR5cGVuYW1lIFQ4ID0gY2hhciwgdHlwZW5hbWUgVDkgPSBjaGFyLCB0eXBlbmFtZSBUMTAgPSBjaGFyPgorY2xhc3MgQWxpZ25lckltcGwgeworICBUMSB0MTsgVDIgdDI7IFQzIHQzOyBUNCB0NDsgVDUgdDU7IFQ2IHQ2OyBUNyB0NzsgVDggdDg7IFQ5IHQ5OyBUMTAgdDEwOworCisgIEFsaWduZXJJbXBsKCkgPSBkZWxldGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsCisgICAgICAgICAgdHlwZW5hbWUgVDIgPSBjaGFyLCB0eXBlbmFtZSBUMyA9IGNoYXIsIHR5cGVuYW1lIFQ0ID0gY2hhciwKKyAgICAgICAgICB0eXBlbmFtZSBUNSA9IGNoYXIsIHR5cGVuYW1lIFQ2ID0gY2hhciwgdHlwZW5hbWUgVDcgPSBjaGFyLAorICAgICAgICAgIHR5cGVuYW1lIFQ4ID0gY2hhciwgdHlwZW5hbWUgVDkgPSBjaGFyLCB0eXBlbmFtZSBUMTAgPSBjaGFyPgordW5pb24gU2l6ZXJJbXBsIHsKKyAgY2hhciBhcnIxW3NpemVvZihUMSldLCBhcnIyW3NpemVvZihUMildLCBhcnIzW3NpemVvZihUMyldLCBhcnI0W3NpemVvZihUNCldLAorICAgICAgIGFycjVbc2l6ZW9mKFQ1KV0sIGFycjZbc2l6ZW9mKFQ2KV0sIGFycjdbc2l6ZW9mKFQ3KV0sIGFycjhbc2l6ZW9mKFQ4KV0sCisgICAgICAgYXJyOVtzaXplb2YoVDkpXSwgYXJyMTBbc2l6ZW9mKFQxMCldOworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKworLy8vIFxicmllZiBUaGlzIHVuaW9uIHRlbXBsYXRlIGV4cG9zZXMgYSBzdWl0YWJseSBhbGlnbmVkIGFuZCBzaXplZCBjaGFyYWN0ZXIKKy8vLyBhcnJheSBtZW1iZXIgd2hpY2ggY2FuIGhvbGQgZWxlbWVudHMgb2YgYW55IG9mIHVwIHRvIHRlbiB0eXBlcy4KKy8vLworLy8vIFRoZXNlIHR5cGVzIG1heSBiZSBhcnJheXMsIHN0cnVjdHMsIG9yIGFueSBvdGhlciB0eXBlcy4gVGhlIGdvYWwgaXMgdG8KKy8vLyBleHBvc2UgYSBjaGFyIGFycmF5IGJ1ZmZlciBtZW1iZXIgd2hpY2ggY2FuIGJlIHVzZWQgYXMgc3VpdGFibGUgc3RvcmFnZSBmb3IKKy8vLyBhIHBsYWNlbWVudCBuZXcgb2YgYW55IG9mIHRoZXNlIHR5cGVzLiBTdXBwb3J0IGZvciBtb3JlIHRoYW4gdGVuIHR5cGVzIGNhbgorLy8vIGJlIGFkZGVkIGF0IHRoZSBjb3N0IG9mIG1vcmUgYm9pbGVycGxhdGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsCisgICAgICAgICAgdHlwZW5hbWUgVDIgPSBjaGFyLCB0eXBlbmFtZSBUMyA9IGNoYXIsIHR5cGVuYW1lIFQ0ID0gY2hhciwKKyAgICAgICAgICB0eXBlbmFtZSBUNSA9IGNoYXIsIHR5cGVuYW1lIFQ2ID0gY2hhciwgdHlwZW5hbWUgVDcgPSBjaGFyLAorICAgICAgICAgIHR5cGVuYW1lIFQ4ID0gY2hhciwgdHlwZW5hbWUgVDkgPSBjaGFyLCB0eXBlbmFtZSBUMTAgPSBjaGFyPgorc3RydWN0IEFsaWduZWRDaGFyQXJyYXlVbmlvbiA6IGxsdm06OkFsaWduZWRDaGFyQXJyYXk8CisgICAgYWxpZ25vZihsbHZtOjpkZXRhaWw6OkFsaWduZXJJbXBsPFQxLCBUMiwgVDMsIFQ0LCBUNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDYsIFQ3LCBUOCwgVDksIFQxMD4pLAorICAgIHNpemVvZig6Omxsdm06OmRldGFpbDo6U2l6ZXJJbXBsPFQxLCBUMiwgVDMsIFQ0LCBUNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUNiwgVDcsIFQ4LCBUOSwgVDEwPik+IHsKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0FMSUdOT0ZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZDQxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgKQEAgLTAsMCArMSw0OTQgQEAKKy8vPT09LSBBbGxvY2F0b3IuaCAtIFNpbXBsZSBtZW1vcnkgYWxsb2NhdGlvbiBhYnN0cmFjdGlvbiAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLworLy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNYWxsb2NBbGxvY2F0b3IgYW5kIEJ1bXBQdHJBbGxvY2F0b3IgaW50ZXJmYWNlcy4gQm90aAorLy8vIG9mIHRoZXNlIGNvbmZvcm0gdG8gYW4gTExWTSAiQWxsb2NhdG9yIiBjb25jZXB0IHdoaWNoIGNvbnNpc3RzIG9mIGFuCisvLy8gQWxsb2NhdGUgbWV0aG9kIGFjY2VwdGluZyBhIHNpemUgYW5kIGFsaWdubWVudCwgYW5kIGEgRGVhbGxvY2F0ZSBhY2NlcHRpbmcKKy8vLyBhIHBvaW50ZXIgYW5kIHNpemUuIEZ1cnRoZXIsIHRoZSBMTFZNICJBbGxvY2F0b3IiIGNvbmNlcHQgaGFzIG92ZXJsb2FkcyBvZgorLy8vIEFsbG9jYXRlIGFuZCBEZWFsbG9jYXRlIGZvciBzZXR0aW5nIHNpemUgYW5kIGFsaWdubWVudCBiYXNlZCBvbiB0aGUgZmluYWwKKy8vLyB0eXBlLiBUaGVzZSBvdmVybG9hZHMgYXJlIHR5cGljYWxseSBwcm92aWRlZCBieSBhIGJhc2UgY2xhc3MgdGVtcGxhdGUgXGMKKy8vLyBBbGxvY2F0b3JCYXNlLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9BTExPQ0FUT1JfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQUxMT0NBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBDUlRQIGJhc2UgY2xhc3MgcHJvdmlkaW5nIG9idmlvdXMgb3ZlcmxvYWRzIGZvciB0aGUgY29yZSBcYworLy8vIEFsbG9jYXRlKCkgbWV0aG9kcyBvZiBMTFZNLXN0eWxlIGFsbG9jYXRvcnMuCisvLy8KKy8vLyBUaGlzIGJhc2UgY2xhc3MgYm90aCBkb2N1bWVudHMgdGhlIGZ1bGwgcHVibGljIGludGVyZmFjZSBleHBvc2VkIGJ5IGFsbAorLy8vIExMVk0tc3R5bGUgYWxsb2NhdG9ycywgYW5kIHJlZGlyZWN0cyBhbGwgb2YgdGhlIG92ZXJsb2FkcyB0byBhIHNpbmdsZSBjb3JlCisvLy8gc2V0IG9mIG1ldGhvZHMgd2hpY2ggdGhlIGRlcml2ZWQgY2xhc3MgbXVzdCBkZWZpbmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZFQ+IGNsYXNzIEFsbG9jYXRvckJhc2UgeworcHVibGljOgorICAvLy8gXGJyaWVmIEFsbG9jYXRlIFxhIFNpemUgYnl0ZXMgb2YgXGEgQWxpZ25tZW50IGFsaWduZWQgbWVtb3J5LiBUaGlzIG1ldGhvZAorICAvLy8gbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBcYyBEZXJpdmVkVC4KKyAgdm9pZCAqQWxsb2NhdGUoc2l6ZV90IFNpemUsIHNpemVfdCBBbGlnbm1lbnQpIHsKKyNpZmRlZiBfX2NsYW5nX18KKyAgICBzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PHZvaWQgKihBbGxvY2F0b3JCYXNlOjoqKShzaXplX3QsIHNpemVfdCk+KAorICAgICAgICAgICAgICAgICAgICAgICZBbGxvY2F0b3JCYXNlOjpBbGxvY2F0ZSkgIT0KKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkICooRGVyaXZlZFQ6OiopKHNpemVfdCwgc2l6ZV90KT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICZEZXJpdmVkVDo6QWxsb2NhdGUpLAorICAgICAgICAgICAgICAgICAgIkNsYXNzIGRlcml2ZXMgZnJvbSBBbGxvY2F0b3JCYXNlIHdpdGhvdXQgaW1wbGVtZW50aW5nIHRoZSAiCisgICAgICAgICAgICAgICAgICAiY29yZSBBbGxvY2F0ZShzaXplX3QsIHNpemVfdCkgb3ZlcmxvYWQhIik7CisjZW5kaWYKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVyaXZlZFQgKj4odGhpcyktPkFsbG9jYXRlKFNpemUsIEFsaWdubWVudCk7CisgIH0KKworICAvLy8gXGJyaWVmIERlYWxsb2NhdGUgXGEgUHRyIHRvIFxhIFNpemUgYnl0ZXMgb2YgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGlzCisgIC8vLyBhbGxvY2F0b3IuCisgIHZvaWQgRGVhbGxvY2F0ZShjb25zdCB2b2lkICpQdHIsIHNpemVfdCBTaXplKSB7CisjaWZkZWYgX19jbGFuZ19fCisgICAgc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDx2b2lkIChBbGxvY2F0b3JCYXNlOjoqKShjb25zdCB2b2lkICosIHNpemVfdCk+KAorICAgICAgICAgICAgICAgICAgICAgICZBbGxvY2F0b3JCYXNlOjpEZWFsbG9jYXRlKSAhPQorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQgKERlcml2ZWRUOjoqKShjb25zdCB2b2lkICosIHNpemVfdCk+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAmRGVyaXZlZFQ6OkRlYWxsb2NhdGUpLAorICAgICAgICAgICAgICAgICAgIkNsYXNzIGRlcml2ZXMgZnJvbSBBbGxvY2F0b3JCYXNlIHdpdGhvdXQgaW1wbGVtZW50aW5nIHRoZSAiCisgICAgICAgICAgICAgICAgICAiY29yZSBEZWFsbG9jYXRlKHZvaWQgKikgb3ZlcmxvYWQhIik7CisjZW5kaWYKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVyaXZlZFQgKj4odGhpcyktPkRlYWxsb2NhdGUoUHRyLCBTaXplKTsKKyAgfQorCisgIC8vIFRoZSByZXN0IG9mIHRoZXNlIG1ldGhvZHMgYXJlIGhlbHBlcnMgdGhhdCByZWRpcmVjdCB0byBvbmUgb2YgdGhlIGFib3ZlCisgIC8vIGNvcmUgbWV0aG9kcy4KKworICAvLy8gXGJyaWVmIEFsbG9jYXRlIHNwYWNlIGZvciBhIHNlcXVlbmNlIG9mIG9iamVjdHMgd2l0aG91dCBjb25zdHJ1Y3RpbmcgdGhlbS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgKkFsbG9jYXRlKHNpemVfdCBOdW0gPSAxKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4oQWxsb2NhdGUoTnVtICogc2l6ZW9mKFQpLCBhbGlnbm9mKFQpKSk7CisgIH0KKworICAvLy8gXGJyaWVmIERlYWxsb2NhdGUgc3BhY2UgZm9yIGEgc2VxdWVuY2Ugb2Ygb2JqZWN0cyB3aXRob3V0IGNvbnN0cnVjdGluZyB0aGVtLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAhc3RkOjppc19zYW1lPHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2N2PFQ+Ojp0eXBlLCB2b2lkPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCisgIERlYWxsb2NhdGUoVCAqUHRyLCBzaXplX3QgTnVtID0gMSkgeworICAgIERlYWxsb2NhdGUoc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCAqPihQdHIpLCBOdW0gKiBzaXplb2YoVCkpOworICB9Cit9OworCitjbGFzcyBNYWxsb2NBbGxvY2F0b3IgOiBwdWJsaWMgQWxsb2NhdG9yQmFzZTxNYWxsb2NBbGxvY2F0b3I+IHsKK3B1YmxpYzoKKyAgdm9pZCBSZXNldCgpIHt9CisKKyAgTExWTV9BVFRSSUJVVEVfUkVUVVJOU19OT05OVUxMIHZvaWQgKkFsbG9jYXRlKHNpemVfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IC8qQWxpZ25tZW50Ki8pIHsKKyAgICB2b2lkKiBtZW1QdHIgPSAgbWFsbG9jKFNpemUpOworICAgIGlmIChtZW1QdHIgPT0gbnVsbHB0cikgCisgICAgICByZXBvcnRfYmFkX2FsbG9jX2Vycm9yKCJBbGxvY2F0aW9uIGluIE1hbGxvY0FsbG9jYXRvciBmYWlsZWQuIik7CisKKyAgICByZXR1cm4gbWVtUHRyOworICB9CisKKyAgLy8gUHVsbCBpbiBiYXNlIGNsYXNzIG92ZXJsb2Fkcy4KKyAgdXNpbmcgQWxsb2NhdG9yQmFzZTxNYWxsb2NBbGxvY2F0b3I+OjpBbGxvY2F0ZTsKKworICB2b2lkIERlYWxsb2NhdGUoY29uc3Qgdm9pZCAqUHRyLCBzaXplX3QgLypTaXplKi8pIHsKKyAgICBmcmVlKGNvbnN0X2Nhc3Q8dm9pZCAqPihQdHIpKTsKKyAgfQorCisgIC8vIFB1bGwgaW4gYmFzZSBjbGFzcyBvdmVybG9hZHMuCisgIHVzaW5nIEFsbG9jYXRvckJhc2U8TWFsbG9jQWxsb2NhdG9yPjo6RGVhbGxvY2F0ZTsKKworICB2b2lkIFByaW50U3RhdHMoKSBjb25zdCB7fQorfTsKKworbmFtZXNwYWNlIGRldGFpbCB7CisKKy8vIFdlIGNhbGwgb3V0IHRvIGFuIGV4dGVybmFsIGZ1bmN0aW9uIHRvIGFjdHVhbGx5IHByaW50IHRoZSBtZXNzYWdlIGFzIHRoZQorLy8gcHJpbnRpbmcgY29kZSB1c2VzIEFsbG9jYXRvci5oIGluIGl0cyBpbXBsZW1lbnRhdGlvbi4KK3ZvaWQgcHJpbnRCdW1wUHRyQWxsb2NhdG9yU3RhdHModW5zaWduZWQgTnVtU2xhYnMsIHNpemVfdCBCeXRlc0FsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IFRvdGFsTWVtb3J5KTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCisvLy8gXGJyaWVmIEFsbG9jYXRlIG1lbW9yeSBpbiBhbiBldmVyIGdyb3dpbmcgcG9vbCwgYXMgaWYgYnkgYnVtcC1wb2ludGVyLgorLy8vCisvLy8gVGhpcyBpc24ndCBzdHJpY3RseSBhIGJ1bXAtcG9pbnRlciBhbGxvY2F0b3IgYXMgaXQgdXNlcyBiYWNraW5nIHNsYWJzIG9mCisvLy8gbWVtb3J5IHJhdGhlciB0aGFuIHJlbHlpbmcgb24gYSBib3VuZGxlc3MgY29udGlndW91cyBoZWFwLiBIb3dldmVyLCBpdCBoYXMKKy8vLyBidW1wLXBvaW50ZXIgc2VtYW50aWNzIGluIHRoYXQgaXQgaXMgYSBtb25vdG9uaWNhbGx5IGdyb3dpbmcgcG9vbCBvZiBtZW1vcnkKKy8vLyB3aGVyZSBldmVyeSBhbGxvY2F0aW9uIGlzIGZvdW5kIGJ5IG1lcmVseSBhbGxvY2F0aW5nIHRoZSBuZXh0IE4gYnl0ZXMgaW4KKy8vLyB0aGUgc2xhYiwgb3IgdGhlIG5leHQgTiBieXRlcyBpbiB0aGUgbmV4dCBzbGFiLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgYWxzbyBoYXMgYSB0aHJlc2hvbGQgZm9yIGZvcmNpbmcgYWxsb2NhdGlvbnMgYWJvdmUgYSBjZXJ0YWluCisvLy8gc2l6ZSBpbnRvIHRoZWlyIG93biBzbGFiLgorLy8vCisvLy8gVGhlIEJ1bXBQdHJBbGxvY2F0b3JJbXBsIHRlbXBsYXRlIGRlZmF1bHRzIHRvIHVzaW5nIGEgTWFsbG9jQWxsb2NhdG9yCisvLy8gb2JqZWN0LCB3aGljaCB3cmFwcyBtYWxsb2MsIHRvIGFsbG9jYXRlIG1lbW9yeSwgYnV0IGl0IGNhbiBiZSBjaGFuZ2VkIHRvCisvLy8gdXNlIGEgY3VzdG9tIGFsbG9jYXRvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBBbGxvY2F0b3JUID0gTWFsbG9jQWxsb2NhdG9yLCBzaXplX3QgU2xhYlNpemUgPSA0MDk2LAorICAgICAgICAgIHNpemVfdCBTaXplVGhyZXNob2xkID0gU2xhYlNpemU+CitjbGFzcyBCdW1wUHRyQWxsb2NhdG9ySW1wbAorICAgIDogcHVibGljIEFsbG9jYXRvckJhc2U8CisgICAgICAgICAgQnVtcFB0ckFsbG9jYXRvckltcGw8QWxsb2NhdG9yVCwgU2xhYlNpemUsIFNpemVUaHJlc2hvbGQ+PiB7CitwdWJsaWM6CisgIHN0YXRpY19hc3NlcnQoU2l6ZVRocmVzaG9sZCA8PSBTbGFiU2l6ZSwKKyAgICAgICAgICAgICAgICAiVGhlIFNpemVUaHJlc2hvbGQgbXVzdCBiZSBhdCBtb3N0IHRoZSBTbGFiU2l6ZSB0byBlbnN1cmUgIgorICAgICAgICAgICAgICAgICJ0aGF0IG9iamVjdHMgbGFyZ2VyIHRoYW4gYSBzbGFiIGdvIGludG8gdGhlaXIgb3duIG1lbW9yeSAiCisgICAgICAgICAgICAgICAgImFsbG9jYXRpb24uIik7CisKKyAgQnVtcFB0ckFsbG9jYXRvckltcGwoKSA9IGRlZmF1bHQ7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIEJ1bXBQdHJBbGxvY2F0b3JJbXBsKFQgJiZBbGxvY2F0b3IpCisgICAgICA6IEFsbG9jYXRvcihzdGQ6OmZvcndhcmQ8VCAmJj4oQWxsb2NhdG9yKSkge30KKworICAvLyBNYW51YWxseSBpbXBsZW1lbnQgYSBtb3ZlIGNvbnN0cnVjdG9yIGFzIHdlIG11c3QgY2xlYXIgdGhlIG9sZCBhbGxvY2F0b3IncworICAvLyBzbGFicyBhcyBhIG1hdHRlciBvZiBjb3JyZWN0bmVzcy4KKyAgQnVtcFB0ckFsbG9jYXRvckltcGwoQnVtcFB0ckFsbG9jYXRvckltcGwgJiZPbGQpCisgICAgICA6IEN1clB0cihPbGQuQ3VyUHRyKSwgRW5kKE9sZC5FbmQpLCBTbGFicyhzdGQ6Om1vdmUoT2xkLlNsYWJzKSksCisgICAgICAgIEN1c3RvbVNpemVkU2xhYnMoc3RkOjptb3ZlKE9sZC5DdXN0b21TaXplZFNsYWJzKSksCisgICAgICAgIEJ5dGVzQWxsb2NhdGVkKE9sZC5CeXRlc0FsbG9jYXRlZCksIFJlZFpvbmVTaXplKE9sZC5SZWRab25lU2l6ZSksCisgICAgICAgIEFsbG9jYXRvcihzdGQ6Om1vdmUoT2xkLkFsbG9jYXRvcikpIHsKKyAgICBPbGQuQ3VyUHRyID0gT2xkLkVuZCA9IG51bGxwdHI7CisgICAgT2xkLkJ5dGVzQWxsb2NhdGVkID0gMDsKKyAgICBPbGQuU2xhYnMuY2xlYXIoKTsKKyAgICBPbGQuQ3VzdG9tU2l6ZWRTbGFicy5jbGVhcigpOworICB9CisKKyAgfkJ1bXBQdHJBbGxvY2F0b3JJbXBsKCkgeworICAgIERlYWxsb2NhdGVTbGFicyhTbGFicy5iZWdpbigpLCBTbGFicy5lbmQoKSk7CisgICAgRGVhbGxvY2F0ZUN1c3RvbVNpemVkU2xhYnMoKTsKKyAgfQorCisgIEJ1bXBQdHJBbGxvY2F0b3JJbXBsICZvcGVyYXRvcj0oQnVtcFB0ckFsbG9jYXRvckltcGwgJiZSSFMpIHsKKyAgICBEZWFsbG9jYXRlU2xhYnMoU2xhYnMuYmVnaW4oKSwgU2xhYnMuZW5kKCkpOworICAgIERlYWxsb2NhdGVDdXN0b21TaXplZFNsYWJzKCk7CisKKyAgICBDdXJQdHIgPSBSSFMuQ3VyUHRyOworICAgIEVuZCA9IFJIUy5FbmQ7CisgICAgQnl0ZXNBbGxvY2F0ZWQgPSBSSFMuQnl0ZXNBbGxvY2F0ZWQ7CisgICAgUmVkWm9uZVNpemUgPSBSSFMuUmVkWm9uZVNpemU7CisgICAgU2xhYnMgPSBzdGQ6Om1vdmUoUkhTLlNsYWJzKTsKKyAgICBDdXN0b21TaXplZFNsYWJzID0gc3RkOjptb3ZlKFJIUy5DdXN0b21TaXplZFNsYWJzKTsKKyAgICBBbGxvY2F0b3IgPSBzdGQ6Om1vdmUoUkhTLkFsbG9jYXRvcik7CisKKyAgICBSSFMuQ3VyUHRyID0gUkhTLkVuZCA9IG51bGxwdHI7CisgICAgUkhTLkJ5dGVzQWxsb2NhdGVkID0gMDsKKyAgICBSSFMuU2xhYnMuY2xlYXIoKTsKKyAgICBSSFMuQ3VzdG9tU2l6ZWRTbGFicy5jbGVhcigpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGVhbGxvY2F0ZSBhbGwgYnV0IHRoZSBjdXJyZW50IHNsYWIgYW5kIHJlc2V0IHRoZSBjdXJyZW50IHBvaW50ZXIKKyAgLy8vIHRvIHRoZSBiZWdpbm5pbmcgb2YgaXQsIGZyZWVpbmcgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgc28gZmFyLgorICB2b2lkIFJlc2V0KCkgeworICAgIC8vIERlYWxsb2NhdGUgYWxsIGJ1dCB0aGUgZmlyc3Qgc2xhYiwgYW5kIGRlYWxsb2NhdGUgYWxsIGN1c3RvbS1zaXplZCBzbGFicy4KKyAgICBEZWFsbG9jYXRlQ3VzdG9tU2l6ZWRTbGFicygpOworICAgIEN1c3RvbVNpemVkU2xhYnMuY2xlYXIoKTsKKworICAgIGlmIChTbGFicy5lbXB0eSgpKQorICAgICAgcmV0dXJuOworCisgICAgLy8gUmVzZXQgdGhlIHN0YXRlLgorICAgIEJ5dGVzQWxsb2NhdGVkID0gMDsKKyAgICBDdXJQdHIgPSAoY2hhciAqKVNsYWJzLmZyb250KCk7CisgICAgRW5kID0gQ3VyUHRyICsgU2xhYlNpemU7CisKKyAgICBfX2FzYW5fcG9pc29uX21lbW9yeV9yZWdpb24oKlNsYWJzLmJlZ2luKCksIGNvbXB1dGVTbGFiU2l6ZSgwKSk7CisgICAgRGVhbGxvY2F0ZVNsYWJzKHN0ZDo6bmV4dChTbGFicy5iZWdpbigpKSwgU2xhYnMuZW5kKCkpOworICAgIFNsYWJzLmVyYXNlKHN0ZDo6bmV4dChTbGFicy5iZWdpbigpKSwgU2xhYnMuZW5kKCkpOworICB9CisKKyAgLy8vIFxicmllZiBBbGxvY2F0ZSBzcGFjZSBhdCB0aGUgc3BlY2lmaWVkIGFsaWdubWVudC4KKyAgTExWTV9BVFRSSUJVVEVfUkVUVVJOU19OT05OVUxMIExMVk1fQVRUUklCVVRFX1JFVFVSTlNfTk9BTElBUyB2b2lkICoKKyAgQWxsb2NhdGUoc2l6ZV90IFNpemUsIHNpemVfdCBBbGlnbm1lbnQpIHsKKyAgICBhc3NlcnQoQWxpZ25tZW50ID4gMCAmJiAiMC1ieXRlIGFsaWdubm1lbnQgaXMgbm90IGFsbG93ZWQuIFVzZSAxIGluc3RlYWQuIik7CisKKyAgICAvLyBLZWVwIHRyYWNrIG9mIGhvdyBtYW55IGJ5dGVzIHdlJ3ZlIGFsbG9jYXRlZC4KKyAgICBCeXRlc0FsbG9jYXRlZCArPSBTaXplOworCisgICAgc2l6ZV90IEFkanVzdG1lbnQgPSBhbGlnbm1lbnRBZGp1c3RtZW50KEN1clB0ciwgQWxpZ25tZW50KTsKKyAgICBhc3NlcnQoQWRqdXN0bWVudCArIFNpemUgPj0gU2l6ZSAmJiAiQWRqdXN0bWVudCArIFNpemUgbXVzdCBub3Qgb3ZlcmZsb3ciKTsKKworICAgIHNpemVfdCBTaXplVG9BbGxvY2F0ZSA9IFNpemU7CisjaWYgTExWTV9BRERSRVNTX1NBTklUSVpFUl9CVUlMRAorICAgIC8vIEFkZCB0cmFpbGluZyBieXRlcyBhcyBhICJyZWQgem9uZSIgdW5kZXIgQVNhbi4KKyAgICBTaXplVG9BbGxvY2F0ZSArPSBSZWRab25lU2l6ZTsKKyNlbmRpZgorCisgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBlbm91Z2ggc3BhY2UuCisgICAgaWYgKEFkanVzdG1lbnQgKyBTaXplVG9BbGxvY2F0ZSA8PSBzaXplX3QoRW5kIC0gQ3VyUHRyKSkgeworICAgICAgY2hhciAqQWxpZ25lZFB0ciA9IEN1clB0ciArIEFkanVzdG1lbnQ7CisgICAgICBDdXJQdHIgPSBBbGlnbmVkUHRyICsgU2l6ZVRvQWxsb2NhdGU7CisgICAgICAvLyBVcGRhdGUgdGhlIGFsbG9jYXRpb24gcG9pbnQgb2YgdGhpcyBtZW1vcnkgYmxvY2sgaW4gTWVtb3J5U2FuaXRpemVyLgorICAgICAgLy8gV2l0aG91dCB0aGlzLCBNZW1vcnlTYW5pdGl6ZXIgbWVzc2FnZXMgZm9yIHZhbHVlcyBvcmlnaW5hdGVkIGZyb20gaGVyZQorICAgICAgLy8gd2lsbCBwb2ludCB0byB0aGUgYWxsb2NhdGlvbiBvZiB0aGUgZW50aXJlIHNsYWIuCisgICAgICBfX21zYW5fYWxsb2NhdGVkX21lbW9yeShBbGlnbmVkUHRyLCBTaXplKTsKKyAgICAgIC8vIFNpbWlsYXJseSwgdGVsbCBBU2FuIGFib3V0IHRoaXMgc3BhY2UuCisgICAgICBfX2FzYW5fdW5wb2lzb25fbWVtb3J5X3JlZ2lvbihBbGlnbmVkUHRyLCBTaXplKTsKKyAgICAgIHJldHVybiBBbGlnbmVkUHRyOworICAgIH0KKworICAgIC8vIElmIFNpemUgaXMgcmVhbGx5IGJpZywgYWxsb2NhdGUgYSBzZXBhcmF0ZSBzbGFiIGZvciBpdC4KKyAgICBzaXplX3QgUGFkZGVkU2l6ZSA9IFNpemVUb0FsbG9jYXRlICsgQWxpZ25tZW50IC0gMTsKKyAgICBpZiAoUGFkZGVkU2l6ZSA+IFNpemVUaHJlc2hvbGQpIHsKKyAgICAgIHZvaWQgKk5ld1NsYWIgPSBBbGxvY2F0b3IuQWxsb2NhdGUoUGFkZGVkU2l6ZSwgMCk7CisgICAgICAvLyBXZSBvd24gdGhlIG5ldyBzbGFiIGFuZCBkb24ndCB3YW50IGFueW9uZSByZWFkaW5nIGFueXRpbmcgb3RoZXIgdGhhbgorICAgICAgLy8gcGllY2VzIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QuICBTbyBwb2lzb24gdGhlIHdob2xlIHNsYWIuCisgICAgICBfX2FzYW5fcG9pc29uX21lbW9yeV9yZWdpb24oTmV3U2xhYiwgUGFkZGVkU2l6ZSk7CisgICAgICBDdXN0b21TaXplZFNsYWJzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihOZXdTbGFiLCBQYWRkZWRTaXplKSk7CisKKyAgICAgIHVpbnRwdHJfdCBBbGlnbmVkQWRkciA9IGFsaWduQWRkcihOZXdTbGFiLCBBbGlnbm1lbnQpOworICAgICAgYXNzZXJ0KEFsaWduZWRBZGRyICsgU2l6ZSA8PSAodWludHB0cl90KU5ld1NsYWIgKyBQYWRkZWRTaXplKTsKKyAgICAgIGNoYXIgKkFsaWduZWRQdHIgPSAoY2hhciopQWxpZ25lZEFkZHI7CisgICAgICBfX21zYW5fYWxsb2NhdGVkX21lbW9yeShBbGlnbmVkUHRyLCBTaXplKTsKKyAgICAgIF9fYXNhbl91bnBvaXNvbl9tZW1vcnlfcmVnaW9uKEFsaWduZWRQdHIsIFNpemUpOworICAgICAgcmV0dXJuIEFsaWduZWRQdHI7CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlLCBzdGFydCBhIG5ldyBzbGFiIGFuZCB0cnkgYWdhaW4uCisgICAgU3RhcnROZXdTbGFiKCk7CisgICAgdWludHB0cl90IEFsaWduZWRBZGRyID0gYWxpZ25BZGRyKEN1clB0ciwgQWxpZ25tZW50KTsKKyAgICBhc3NlcnQoQWxpZ25lZEFkZHIgKyBTaXplVG9BbGxvY2F0ZSA8PSAodWludHB0cl90KUVuZCAmJgorICAgICAgICAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSEiKTsKKyAgICBjaGFyICpBbGlnbmVkUHRyID0gKGNoYXIqKUFsaWduZWRBZGRyOworICAgIEN1clB0ciA9IEFsaWduZWRQdHIgKyBTaXplVG9BbGxvY2F0ZTsKKyAgICBfX21zYW5fYWxsb2NhdGVkX21lbW9yeShBbGlnbmVkUHRyLCBTaXplKTsKKyAgICBfX2FzYW5fdW5wb2lzb25fbWVtb3J5X3JlZ2lvbihBbGlnbmVkUHRyLCBTaXplKTsKKyAgICByZXR1cm4gQWxpZ25lZFB0cjsKKyAgfQorCisgIC8vIFB1bGwgaW4gYmFzZSBjbGFzcyBvdmVybG9hZHMuCisgIHVzaW5nIEFsbG9jYXRvckJhc2U8QnVtcFB0ckFsbG9jYXRvckltcGw+OjpBbGxvY2F0ZTsKKworICAvLyBCdW1wIHBvaW50ZXIgYWxsb2NhdG9ycyBhcmUgZXhwZWN0ZWQgdG8gbmV2ZXIgZnJlZSB0aGVpciBzdG9yYWdlOyBhbmQKKyAgLy8gY2xpZW50cyBleHBlY3QgcG9pbnRlcnMgdG8gcmVtYWluIHZhbGlkIGZvciBub24tZGVyZWZlcmVuY2luZyB1c2VzIGV2ZW4KKyAgLy8gYWZ0ZXIgZGVhbGxvY2F0aW9uLgorICB2b2lkIERlYWxsb2NhdGUoY29uc3Qgdm9pZCAqUHRyLCBzaXplX3QgU2l6ZSkgeworICAgIF9fYXNhbl9wb2lzb25fbWVtb3J5X3JlZ2lvbihQdHIsIFNpemUpOworICB9CisKKyAgLy8gUHVsbCBpbiBiYXNlIGNsYXNzIG92ZXJsb2Fkcy4KKyAgdXNpbmcgQWxsb2NhdG9yQmFzZTxCdW1wUHRyQWxsb2NhdG9ySW1wbD46OkRlYWxsb2NhdGU7CisKKyAgc2l6ZV90IEdldE51bVNsYWJzKCkgY29uc3QgeyByZXR1cm4gU2xhYnMuc2l6ZSgpICsgQ3VzdG9tU2l6ZWRTbGFicy5zaXplKCk7IH0KKworICBzaXplX3QgZ2V0VG90YWxNZW1vcnkoKSBjb25zdCB7CisgICAgc2l6ZV90IFRvdGFsTWVtb3J5ID0gMDsKKyAgICBmb3IgKGF1dG8gSSA9IFNsYWJzLmJlZ2luKCksIEUgPSBTbGFicy5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBUb3RhbE1lbW9yeSArPSBjb21wdXRlU2xhYlNpemUoc3RkOjpkaXN0YW5jZShTbGFicy5iZWdpbigpLCBJKSk7CisgICAgZm9yIChhdXRvICZQdHJBbmRTaXplIDogQ3VzdG9tU2l6ZWRTbGFicykKKyAgICAgIFRvdGFsTWVtb3J5ICs9IFB0ckFuZFNpemUuc2Vjb25kOworICAgIHJldHVybiBUb3RhbE1lbW9yeTsKKyAgfQorCisgIHNpemVfdCBnZXRCeXRlc0FsbG9jYXRlZCgpIGNvbnN0IHsgcmV0dXJuIEJ5dGVzQWxsb2NhdGVkOyB9CisKKyAgdm9pZCBzZXRSZWRab25lU2l6ZShzaXplX3QgTmV3U2l6ZSkgeworICAgIFJlZFpvbmVTaXplID0gTmV3U2l6ZTsKKyAgfQorCisgIHZvaWQgUHJpbnRTdGF0cygpIGNvbnN0IHsKKyAgICBkZXRhaWw6OnByaW50QnVtcFB0ckFsbG9jYXRvclN0YXRzKFNsYWJzLnNpemUoKSwgQnl0ZXNBbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUb3RhbE1lbW9yeSgpKTsKKyAgfQorCitwcml2YXRlOgorICAvLy8gXGJyaWVmIFRoZSBjdXJyZW50IHBvaW50ZXIgaW50byB0aGUgY3VycmVudCBzbGFiLgorICAvLy8KKyAgLy8vIFRoaXMgcG9pbnRzIHRvIHRoZSBuZXh0IGZyZWUgYnl0ZSBpbiB0aGUgc2xhYi4KKyAgY2hhciAqQ3VyUHRyID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc2xhYi4KKyAgY2hhciAqRW5kID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFRoZSBzbGFicyBhbGxvY2F0ZWQgc28gZmFyLgorICBTbWFsbFZlY3Rvcjx2b2lkICosIDQ+IFNsYWJzOworCisgIC8vLyBcYnJpZWYgQ3VzdG9tLXNpemVkIHNsYWJzIGFsbG9jYXRlZCBmb3IgdG9vLWxhcmdlIGFsbG9jYXRpb24gcmVxdWVzdHMuCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx2b2lkICosIHNpemVfdD4sIDA+IEN1c3RvbVNpemVkU2xhYnM7CisKKyAgLy8vIFxicmllZiBIb3cgbWFueSBieXRlcyB3ZSd2ZSBhbGxvY2F0ZWQuCisgIC8vLworICAvLy8gVXNlZCBzbyB0aGF0IHdlIGNhbiBjb21wdXRlIGhvdyBtdWNoIHNwYWNlIHdhcyB3YXN0ZWQuCisgIHNpemVfdCBCeXRlc0FsbG9jYXRlZCA9IDA7CisKKyAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHB1dCBiZXR3ZWVuIGFsbG9jYXRpb25zIHdoZW4gcnVubmluZyB1bmRlcgorICAvLy8gYSBzYW5pdGl6ZXIuCisgIHNpemVfdCBSZWRab25lU2l6ZSA9IDE7CisKKyAgLy8vIFxicmllZiBUaGUgYWxsb2NhdG9yIGluc3RhbmNlIHdlIHVzZSB0byBnZXQgc2xhYnMgb2YgbWVtb3J5LgorICBBbGxvY2F0b3JUIEFsbG9jYXRvcjsKKworICBzdGF0aWMgc2l6ZV90IGNvbXB1dGVTbGFiU2l6ZSh1bnNpZ25lZCBTbGFiSWR4KSB7CisgICAgLy8gU2NhbGUgdGhlIGFjdHVhbCBhbGxvY2F0ZWQgc2xhYiBzaXplIGJhc2VkIG9uIHRoZSBudW1iZXIgb2Ygc2xhYnMKKyAgICAvLyBhbGxvY2F0ZWQuIEV2ZXJ5IDEyOCBzbGFicyBhbGxvY2F0ZWQsIHdlIGRvdWJsZSB0aGUgYWxsb2NhdGVkIHNpemUgdG8KKyAgICAvLyByZWR1Y2UgYWxsb2NhdGlvbiBmcmVxdWVuY3ksIGJ1dCBzYXR1cmF0ZSBhdCBtdWx0aXBseWluZyB0aGUgc2xhYiBzaXplIGJ5CisgICAgLy8gMl4zMC4KKyAgICByZXR1cm4gU2xhYlNpemUgKiAoKHNpemVfdCkxIDw8IHN0ZDo6bWluPHNpemVfdD4oMzAsIFNsYWJJZHggLyAxMjgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWxsb2NhdGUgYSBuZXcgc2xhYiBhbmQgbW92ZSB0aGUgYnVtcCBwb2ludGVycyBvdmVyIGludG8gdGhlIG5ldworICAvLy8gc2xhYiwgbW9kaWZ5aW5nIEN1clB0ciBhbmQgRW5kLgorICB2b2lkIFN0YXJ0TmV3U2xhYigpIHsKKyAgICBzaXplX3QgQWxsb2NhdGVkU2xhYlNpemUgPSBjb21wdXRlU2xhYlNpemUoU2xhYnMuc2l6ZSgpKTsKKworICAgIHZvaWQgKk5ld1NsYWIgPSBBbGxvY2F0b3IuQWxsb2NhdGUoQWxsb2NhdGVkU2xhYlNpemUsIDApOworICAgIC8vIFdlIG93biB0aGUgbmV3IHNsYWIgYW5kIGRvbid0IHdhbnQgYW55b25lIHJlYWRpbmcgYW55dGhpbmcgb3RoZXIgdGhhbgorICAgIC8vIHBpZWNlcyByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kLiAgU28gcG9pc29uIHRoZSB3aG9sZSBzbGFiLgorICAgIF9fYXNhbl9wb2lzb25fbWVtb3J5X3JlZ2lvbihOZXdTbGFiLCBBbGxvY2F0ZWRTbGFiU2l6ZSk7CisKKyAgICBTbGFicy5wdXNoX2JhY2soTmV3U2xhYik7CisgICAgQ3VyUHRyID0gKGNoYXIgKikoTmV3U2xhYik7CisgICAgRW5kID0gKChjaGFyICopTmV3U2xhYikgKyBBbGxvY2F0ZWRTbGFiU2l6ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGVhbGxvY2F0ZSBhIHNlcXVlbmNlIG9mIHNsYWJzLgorICB2b2lkIERlYWxsb2NhdGVTbGFicyhTbWFsbFZlY3RvckltcGw8dm9pZCAqPjo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHZvaWQgKj46Oml0ZXJhdG9yIEUpIHsKKyAgICBmb3IgKDsgSSAhPSBFOyArK0kpIHsKKyAgICAgIHNpemVfdCBBbGxvY2F0ZWRTbGFiU2l6ZSA9CisgICAgICAgICAgY29tcHV0ZVNsYWJTaXplKHN0ZDo6ZGlzdGFuY2UoU2xhYnMuYmVnaW4oKSwgSSkpOworICAgICAgQWxsb2NhdG9yLkRlYWxsb2NhdGUoKkksIEFsbG9jYXRlZFNsYWJTaXplKTsKKyAgICB9CisgIH0KKworICAvLy8gXGJyaWVmIERlYWxsb2NhdGUgYWxsIG1lbW9yeSBmb3IgY3VzdG9tIHNpemVkIHNsYWJzLgorICB2b2lkIERlYWxsb2NhdGVDdXN0b21TaXplZFNsYWJzKCkgeworICAgIGZvciAoYXV0byAmUHRyQW5kU2l6ZSA6IEN1c3RvbVNpemVkU2xhYnMpIHsKKyAgICAgIHZvaWQgKlB0ciA9IFB0ckFuZFNpemUuZmlyc3Q7CisgICAgICBzaXplX3QgU2l6ZSA9IFB0ckFuZFNpemUuc2Vjb25kOworICAgICAgQWxsb2NhdG9yLkRlYWxsb2NhdGUoUHRyLCBTaXplKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIFNwZWNpZmljQnVtcFB0ckFsbG9jYXRvcjsKK307CisKKy8vLyBcYnJpZWYgVGhlIHN0YW5kYXJkIEJ1bXBQdHJBbGxvY2F0b3Igd2hpY2gganVzdCB1c2VzIHRoZSBkZWZhdWx0IHRlbXBsYXRlCisvLy8gcGFyYW1ldGVycy4KK3R5cGVkZWYgQnVtcFB0ckFsbG9jYXRvckltcGw8PiBCdW1wUHRyQWxsb2NhdG9yOworCisvLy8gXGJyaWVmIEEgQnVtcFB0ckFsbG9jYXRvciB0aGF0IGFsbG93cyBvbmx5IGVsZW1lbnRzIG9mIGEgc3BlY2lmaWMgdHlwZSB0byBiZQorLy8vIGFsbG9jYXRlZC4KKy8vLworLy8vIFRoaXMgYWxsb3dzIGNhbGxpbmcgdGhlIGRlc3RydWN0b3IgaW4gRGVzdHJveUFsbCgpIGFuZCB3aGVuIHRoZSBhbGxvY2F0b3IgaXMKKy8vLyBkZXN0cm95ZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgU3BlY2lmaWNCdW1wUHRyQWxsb2NhdG9yIHsKKyAgQnVtcFB0ckFsbG9jYXRvciBBbGxvY2F0b3I7CisKK3B1YmxpYzoKKyAgU3BlY2lmaWNCdW1wUHRyQWxsb2NhdG9yKCkgeworICAgIC8vIEJlY2F1c2UgU3BlY2lmaWNCdW1wUHRyQWxsb2NhdG9yIHdhbGtzIHRoZSBtZW1vcnkgdG8gY2FsbCBkZXN0cnVjdG9ycywKKyAgICAvLyBpdCBjYW4ndCBoYXZlIHJlZCB6b25lcyBiZXR3ZWVuIGFsbG9jYXRpb25zLgorICAgIEFsbG9jYXRvci5zZXRSZWRab25lU2l6ZSgwKTsKKyAgfQorICBTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3IoU3BlY2lmaWNCdW1wUHRyQWxsb2NhdG9yICYmT2xkKQorICAgICAgOiBBbGxvY2F0b3Ioc3RkOjptb3ZlKE9sZC5BbGxvY2F0b3IpKSB7fQorICB+U3BlY2lmaWNCdW1wUHRyQWxsb2NhdG9yKCkgeyBEZXN0cm95QWxsKCk7IH0KKworICBTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3IgJm9wZXJhdG9yPShTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3IgJiZSSFMpIHsKKyAgICBBbGxvY2F0b3IgPSBzdGQ6Om1vdmUoUkhTLkFsbG9jYXRvcik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIENhbGwgdGhlIGRlc3RydWN0b3Igb2YgZWFjaCBhbGxvY2F0ZWQgb2JqZWN0IGFuZCBkZWFsbG9jYXRlIGFsbCBidXQgdGhlCisgIC8vLyBjdXJyZW50IHNsYWIgYW5kIHJlc2V0IHRoZSBjdXJyZW50IHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBpdCwgZnJlZWluZworICAvLy8gYWxsIG1lbW9yeSBhbGxvY2F0ZWQgc28gZmFyLgorICB2b2lkIERlc3Ryb3lBbGwoKSB7CisgICAgYXV0byBEZXN0cm95RWxlbWVudHMgPSBbXShjaGFyICpCZWdpbiwgY2hhciAqRW5kKSB7CisgICAgICBhc3NlcnQoQmVnaW4gPT0gKGNoYXIgKilhbGlnbkFkZHIoQmVnaW4sIGFsaWdub2YoVCkpKTsKKyAgICAgIGZvciAoY2hhciAqUHRyID0gQmVnaW47IFB0ciArIHNpemVvZihUKSA8PSBFbmQ7IFB0ciArPSBzaXplb2YoVCkpCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VCAqPihQdHIpLT5+VCgpOworICAgIH07CisKKyAgICBmb3IgKGF1dG8gSSA9IEFsbG9jYXRvci5TbGFicy5iZWdpbigpLCBFID0gQWxsb2NhdG9yLlNsYWJzLmVuZCgpOyBJICE9IEU7CisgICAgICAgICArK0kpIHsKKyAgICAgIHNpemVfdCBBbGxvY2F0ZWRTbGFiU2l6ZSA9IEJ1bXBQdHJBbGxvY2F0b3I6OmNvbXB1dGVTbGFiU2l6ZSgKKyAgICAgICAgICBzdGQ6OmRpc3RhbmNlKEFsbG9jYXRvci5TbGFicy5iZWdpbigpLCBJKSk7CisgICAgICBjaGFyICpCZWdpbiA9IChjaGFyICopYWxpZ25BZGRyKCpJLCBhbGlnbm9mKFQpKTsKKyAgICAgIGNoYXIgKkVuZCA9ICpJID09IEFsbG9jYXRvci5TbGFicy5iYWNrKCkgPyBBbGxvY2F0b3IuQ3VyUHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGNoYXIgKikqSSArIEFsbG9jYXRlZFNsYWJTaXplOworCisgICAgICBEZXN0cm95RWxlbWVudHMoQmVnaW4sIEVuZCk7CisgICAgfQorCisgICAgZm9yIChhdXRvICZQdHJBbmRTaXplIDogQWxsb2NhdG9yLkN1c3RvbVNpemVkU2xhYnMpIHsKKyAgICAgIHZvaWQgKlB0ciA9IFB0ckFuZFNpemUuZmlyc3Q7CisgICAgICBzaXplX3QgU2l6ZSA9IFB0ckFuZFNpemUuc2Vjb25kOworICAgICAgRGVzdHJveUVsZW1lbnRzKChjaGFyICopYWxpZ25BZGRyKFB0ciwgYWxpZ25vZihUKSksIChjaGFyICopUHRyICsgU2l6ZSk7CisgICAgfQorCisgICAgQWxsb2NhdG9yLlJlc2V0KCk7CisgIH0KKworICAvLy8gXGJyaWVmIEFsbG9jYXRlIHNwYWNlIGZvciBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGhvdXQgY29uc3RydWN0aW5nIHRoZW0uCisgIFQgKkFsbG9jYXRlKHNpemVfdCBudW0gPSAxKSB7IHJldHVybiBBbGxvY2F0b3IuQWxsb2NhdGU8VD4obnVtKTsgfQorfTsKKworLy8vIFx7CisvLy8gQ291bnRlcnBhcnRzIG9mIGFsbG9jYXRpb24gZnVuY3Rpb25zIGRlZmluZWQgaW4gbmFtZXNwYWNlICdzdGQnLCB3aGljaCBjcmFzaAorLy8vIG9uIGFsbG9jYXRpb24gZmFpbHVyZSBpbnN0ZWFkIG9mIHJldHVybmluZyBudWxsIHBvaW50ZXIuCisKK0xMVk1fQVRUUklCVVRFX1JFVFVSTlNfTk9OTlVMTCBpbmxpbmUgdm9pZCAqc2FmZV9tYWxsb2Moc2l6ZV90IFN6KSB7CisgIHZvaWQgKlJlc3VsdCA9IHN0ZDo6bWFsbG9jKFN6KTsKKyAgaWYgKFJlc3VsdCA9PSBudWxscHRyKQorICAgIHJlcG9ydF9iYWRfYWxsb2NfZXJyb3IoIkFsbG9jYXRpb24gZmFpbGVkLiIpOworICByZXR1cm4gUmVzdWx0OworfQorCitMTFZNX0FUVFJJQlVURV9SRVRVUk5TX05PTk5VTEwgaW5saW5lIHZvaWQgKnNhZmVfY2FsbG9jKHNpemVfdCBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IFN6KSB7CisgIHZvaWQgKlJlc3VsdCA9IHN0ZDo6Y2FsbG9jKENvdW50LCBTeik7CisgIGlmIChSZXN1bHQgPT0gbnVsbHB0cikKKyAgICByZXBvcnRfYmFkX2FsbG9jX2Vycm9yKCJBbGxvY2F0aW9uIGZhaWxlZC4iKTsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworTExWTV9BVFRSSUJVVEVfUkVUVVJOU19OT05OVUxMIGlubGluZSB2b2lkICpzYWZlX3JlYWxsb2Modm9pZCAqUHRyLCBzaXplX3QgU3opIHsKKyAgdm9pZCAqUmVzdWx0ID0gc3RkOjpyZWFsbG9jKFB0ciwgU3opOworICBpZiAoUmVzdWx0ID09IG51bGxwdHIpCisgICAgcmVwb3J0X2JhZF9hbGxvY19lcnJvcigiQWxsb2NhdGlvbiBmYWlsZWQuIik7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vLyBcfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQWxsb2NhdG9yVCwgc2l6ZV90IFNsYWJTaXplLCBzaXplX3QgU2l6ZVRocmVzaG9sZD4KK3ZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICBsbHZtOjpCdW1wUHRyQWxsb2NhdG9ySW1wbDxBbGxvY2F0b3JULCBTbGFiU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplVGhyZXNob2xkPiAmQWxsb2NhdG9yKSB7CisgIHN0cnVjdCBTIHsKKyAgICBjaGFyIGM7CisgICAgdW5pb24geworICAgICAgZG91YmxlIEQ7CisgICAgICBsb25nIGRvdWJsZSBMRDsKKyAgICAgIGxvbmcgbG9uZyBMOworICAgICAgdm9pZCAqUDsKKyAgICB9IHg7CisgIH07CisgIHJldHVybiBBbGxvY2F0b3IuQWxsb2NhdGUoCisgICAgICBTaXplLCBzdGQ6Om1pbigoc2l6ZV90KWxsdm06Ok5leHRQb3dlck9mMihTaXplKSwgb2Zmc2V0b2YoUywgeCkpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEFsbG9jYXRvclQsIHNpemVfdCBTbGFiU2l6ZSwgc2l6ZV90IFNpemVUaHJlc2hvbGQ+Cit2b2lkIG9wZXJhdG9yIGRlbGV0ZSgKKyAgICB2b2lkICosIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3JJbXBsPEFsbG9jYXRvclQsIFNsYWJTaXplLCBTaXplVGhyZXNob2xkPiAmKSB7Cit9CisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfQUxMT0NBVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BcnJheVJlY3ljbGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQXJyYXlSZWN5Y2xlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Njk2YmUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQXJyYXlSZWN5Y2xlci5oCkBAIC0wLDAgKzEsMTQ1IEBACisvLz09LSBsbHZtL1N1cHBvcnQvQXJyYXlSZWN5Y2xlci5oIC0gUmVjeWNsaW5nIG9mIEFycmF5cyAtLS0tLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBBcnJheVJlY3ljbGVyIGNsYXNzIHRlbXBsYXRlIHdoaWNoIGNhbiByZWN5Y2xlIHNtYWxsCisvLyBhcnJheXMgYWxsb2NhdGVkIGZyb20gb25lIG9mIHRoZSBhbGxvY2F0b3JzIGluIEFsbG9jYXRvci5oCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQVJSQVlSRUNZQ0xFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9BUlJBWVJFQ1lDTEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFJlY3ljbGUgc21hbGwgYXJyYXlzIGFsbG9jYXRlZCBmcm9tIGEgQnVtcFB0ckFsbG9jYXRvci4KKy8vLworLy8vIEFycmF5cyBhcmUgYWxsb2NhdGVkIGluIGEgc21hbGwgbnVtYmVyIG9mIGZpeGVkIHNpemVzLiBGb3IgZWFjaCBzdXBwb3J0ZWQKKy8vLyBhcnJheSBzaXplLCB0aGUgQXJyYXlSZWN5Y2xlciBrZWVwcyBhIGZyZWUgbGlzdCBvZiBhdmFpbGFibGUgYXJyYXlzLgorLy8vCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgc2l6ZV90IEFsaWduID0gYWxpZ25vZihUKT4gY2xhc3MgQXJyYXlSZWN5Y2xlciB7CisgIC8vIFRoZSBmcmVlIGxpc3QgZm9yIGEgZ2l2ZW4gYXJyYXkgc2l6ZSBpcyBhIHNpbXBsZSBzaW5nbHkgbGlua2VkIGxpc3QuCisgIC8vIFdlIGNhbid0IHVzZSBpcGxpc3Qgb3IgUmVjeWNsZXIgaGVyZSBzaW5jZSB0aG9zZSBjbGFzc2VzIGNhbid0IGJlIGNvcGllZC4KKyAgc3RydWN0IEZyZWVMaXN0IHsKKyAgICBGcmVlTGlzdCAqTmV4dDsKKyAgfTsKKworICBzdGF0aWNfYXNzZXJ0KEFsaWduID49IGFsaWdub2YoRnJlZUxpc3QpLCAiT2JqZWN0IHVuZGVyYWxpZ25lZCIpOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihUKSA+PSBzaXplb2YoRnJlZUxpc3QpLCAiT2JqZWN0cyBhcmUgdG9vIHNtYWxsIik7CisKKyAgLy8gS2VlcCBhIGZyZWUgbGlzdCBmb3IgZWFjaCBhcnJheSBzaXplLgorICBTbWFsbFZlY3RvcjxGcmVlTGlzdCosIDg+IEJ1Y2tldDsKKworICAvLyBSZW1vdmUgYW4gZW50cnkgZnJvbSB0aGUgZnJlZSBsaXN0IGluIEJ1Y2tldFtJZHhdIGFuZCByZXR1cm4gaXQuCisgIC8vIFJldHVybiBOVUxMIGlmIG5vIGVudHJpZXMgYXJlIGF2YWlsYWJsZS4KKyAgVCAqcG9wKHVuc2lnbmVkIElkeCkgeworICAgIGlmIChJZHggPj0gQnVja2V0LnNpemUoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIEZyZWVMaXN0ICpFbnRyeSA9IEJ1Y2tldFtJZHhdOworICAgIGlmICghRW50cnkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBfX2FzYW5fdW5wb2lzb25fbWVtb3J5X3JlZ2lvbihFbnRyeSwgQ2FwYWNpdHk6OmdldChJZHgpLmdldFNpemUoKSk7CisgICAgQnVja2V0W0lkeF0gPSBFbnRyeS0+TmV4dDsKKyAgICBfX21zYW5fYWxsb2NhdGVkX21lbW9yeShFbnRyeSwgQ2FwYWNpdHk6OmdldChJZHgpLmdldFNpemUoKSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KEVudHJ5KTsKKyAgfQorCisgIC8vIEFkZCBhbiBlbnRyeSB0byB0aGUgZnJlZSBsaXN0IGF0IEJ1Y2tldFtJZHhdLgorICB2b2lkIHB1c2godW5zaWduZWQgSWR4LCBUICpQdHIpIHsKKyAgICBhc3NlcnQoUHRyICYmICJDYW5ub3QgcmVjeWNsZSBOVUxMIHBvaW50ZXIiKTsKKyAgICBGcmVlTGlzdCAqRW50cnkgPSByZWludGVycHJldF9jYXN0PEZyZWVMaXN0Kj4oUHRyKTsKKyAgICBpZiAoSWR4ID49IEJ1Y2tldC5zaXplKCkpCisgICAgICBCdWNrZXQucmVzaXplKHNpemVfdChJZHgpICsgMSk7CisgICAgRW50cnktPk5leHQgPSBCdWNrZXRbSWR4XTsKKyAgICBCdWNrZXRbSWR4XSA9IEVudHJ5OworICAgIF9fYXNhbl9wb2lzb25fbWVtb3J5X3JlZ2lvbihQdHIsIENhcGFjaXR5OjpnZXQoSWR4KS5nZXRTaXplKCkpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFRoZSBzaXplIG9mIGFuIGFsbG9jYXRlZCBhcnJheSBpcyByZXByZXNlbnRlZCBieSBhIENhcGFjaXR5IGluc3RhbmNlLgorICAvLy8KKyAgLy8vIFRoaXMgY2xhc3MgaXMgbXVjaCBzbWFsbGVyIHRoYW4gYSBzaXplX3QsIGFuZCBpdCBwcm92aWRlcyBtZXRob2RzIHRvIHdvcmsKKyAgLy8vIHdpdGggdGhlIHNldCBvZiBsZWdhbCBhcnJheSBjYXBhY2l0aWVzLgorICBjbGFzcyBDYXBhY2l0eSB7CisgICAgdWludDhfdCBJbmRleDsKKyAgICBleHBsaWNpdCBDYXBhY2l0eSh1aW50OF90IGlkeCkgOiBJbmRleChpZHgpIHt9CisKKyAgcHVibGljOgorICAgIENhcGFjaXR5KCkgOiBJbmRleCgwKSB7fQorCisgICAgLy8vIEdldCB0aGUgY2FwYWNpdHkgb2YgYW4gYXJyYXkgdGhhdCBjYW4gaG9sZCBhdCBsZWFzdCBOIGVsZW1lbnRzLgorICAgIHN0YXRpYyBDYXBhY2l0eSBnZXQoc2l6ZV90IE4pIHsKKyAgICAgIHJldHVybiBDYXBhY2l0eShOID8gTG9nMl82NF9DZWlsKE4pIDogMCk7CisgICAgfQorCisgICAgLy8vIEdldCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFuIGFycmF5IHdpdGggdGhpcyBjYXBhY2l0eS4KKyAgICBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfdCgxdSkgPDwgSW5kZXg7IH0KKworICAgIC8vLyBHZXQgdGhlIGJ1Y2tldCBudW1iZXIgZm9yIHRoaXMgY2FwYWNpdHkuCisgICAgdW5zaWduZWQgZ2V0QnVja2V0KCkgY29uc3QgeyByZXR1cm4gSW5kZXg7IH0KKworICAgIC8vLyBHZXQgdGhlIG5leHQgbGFyZ2VyIGNhcGFjaXR5LiBMYXJnZSBjYXBhY2l0aWVzIGdyb3cgZXhwb25lbnRpYWxseSwgc28KKyAgICAvLy8gdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZWFsbG9jYXRlIGluY3JlbWVudGFsbHkgZ3Jvd2luZyB2ZWN0b3JzCisgICAgLy8vIGluIGFtb3J0aXplZCBsaW5lYXIgdGltZS4KKyAgICBDYXBhY2l0eSBnZXROZXh0KCkgY29uc3QgeyByZXR1cm4gQ2FwYWNpdHkoSW5kZXggKyAxKTsgfQorICB9OworCisgIH5BcnJheVJlY3ljbGVyKCkgeworICAgIC8vIFRoZSBjbGllbnQgc2hvdWxkIGFsd2F5cyBjYWxsIGNsZWFyKCkgc28gcmVjeWNsZWQgYXJyYXlzIGNhbiBiZSByZXR1cm5lZAorICAgIC8vIHRvIHRoZSBhbGxvY2F0b3IuCisgICAgYXNzZXJ0KEJ1Y2tldC5lbXB0eSgpICYmICJOb24tZW1wdHkgQXJyYXlSZWN5Y2xlciBkZWxldGVkISIpOworICB9CisKKyAgLy8vIFJlbGVhc2UgYWxsIHRoZSB0cmFja2VkIGFsbG9jYXRpb25zIHRvIHRoZSBhbGxvY2F0b3IuIFRoZSByZWN5Y2xlciBtdXN0CisgIC8vLyBiZSBmcmVlIG9mIGFueSB0cmFja2VkIGFsbG9jYXRpb25zIGJlZm9yZSBiZWluZyBkZWxldGVkLgorICB0ZW1wbGF0ZTxjbGFzcyBBbGxvY2F0b3JUeXBlPgorICB2b2lkIGNsZWFyKEFsbG9jYXRvclR5cGUgJkFsbG9jYXRvcikgeworICAgIGZvciAoOyAhQnVja2V0LmVtcHR5KCk7IEJ1Y2tldC5wb3BfYmFjaygpKQorICAgICAgd2hpbGUgKFQgKlB0ciA9IHBvcChCdWNrZXQuc2l6ZSgpIC0gMSkpCisgICAgICAgIEFsbG9jYXRvci5EZWFsbG9jYXRlKFB0cik7CisgIH0KKworICAvLy8gU3BlY2lhbCBjYXNlIGZvciBCdW1wUHRyQWxsb2NhdG9yIHdoaWNoIGhhcyBhbiBlbXB0eSBEZWFsbG9jYXRlKCkKKyAgLy8vIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gdHJhdmVyc2UgdGhlIGZyZWUgbGlzdHMsIHB1bGxpbmcgYWxsIHRoZSBvYmplY3RzIGludG8KKyAgLy8vIGNhY2hlLgorICB2b2lkIGNsZWFyKEJ1bXBQdHJBbGxvY2F0b3ImKSB7CisgICAgQnVja2V0LmNsZWFyKCk7CisgIH0KKworICAvLy8gQWxsb2NhdGUgYW4gYXJyYXkgb2YgYXQgbGVhc3QgdGhlIHJlcXVlc3RlZCBjYXBhY2l0eS4KKyAgLy8vCisgIC8vLyBSZXR1cm4gYW4gZXhpc3RpbmcgcmVjeWNsZWQgYXJyYXksIG9yIGFsbG9jYXRlIG9uZSBmcm9tIEFsbG9jYXRvciBpZgorICAvLy8gbm9uZSBhcmUgYXZhaWxhYmxlIGZvciByZWN5Y2xpbmcuCisgIC8vLworICB0ZW1wbGF0ZTxjbGFzcyBBbGxvY2F0b3JUeXBlPgorICBUICphbGxvY2F0ZShDYXBhY2l0eSBDYXAsIEFsbG9jYXRvclR5cGUgJkFsbG9jYXRvcikgeworICAgIC8vIFRyeSB0byByZWN5Y2xlIGFuIGV4aXN0aW5nIGFycmF5LgorICAgIGlmIChUICpQdHIgPSBwb3AoQ2FwLmdldEJ1Y2tldCgpKSkKKyAgICAgIHJldHVybiBQdHI7CisgICAgLy8gTm9wZSwgZ2V0IG1vcmUgbWVtb3J5LgorICAgIHJldHVybiBzdGF0aWNfY2FzdDxUKj4oQWxsb2NhdG9yLkFsbG9jYXRlKHNpemVvZihUKSpDYXAuZ2V0U2l6ZSgpLCBBbGlnbikpOworICB9CisKKyAgLy8vIERlYWxsb2NhdGUgYW4gYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIENhcGFjaXR5LgorICAvLy8KKyAgLy8vIENhcCBtdXN0IGJlIHRoZSBzYW1lIGNhcGFjaXR5IHRoYXQgd2FzIGdpdmVuIHRvIGFsbG9jYXRlKCkuCisgIC8vLworICB2b2lkIGRlYWxsb2NhdGUoQ2FwYWNpdHkgQ2FwLCBUICpQdHIpIHsKKyAgICBwdXNoKENhcC5nZXRCdWNrZXQoKSwgUHRyKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQXRvbWljLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQXRvbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUyMzEzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BdG9taWMuaApAQCAtMCwwICsxLDQzIEBACisvLz09PS0gbGx2bS9TdXBwb3J0L0F0b21pYy5oIC0gQXRvbWljIE9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGxsdm06OnN5cyBhdG9taWMgb3BlcmF0aW9ucy4KKy8vCisvLyBETyBOT1QgVVNFIElOIE5FVyBDT0RFIQorLy8KKy8vIE5ldyBjb2RlIHNob3VsZCBhbHdheXMgcmVseSBvbiB0aGUgc3RkOjphdG9taWMgZmFjaWxpdGllcyBpbiBDKysxMS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9BVE9NSUNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQVRPTUlDX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKworLy8gV2luZG93cyB3aWxsIGF0IHRpbWVzIGRlZmluZSBNZW1vcnlGZW5jZS4KKyNpZmRlZiBNZW1vcnlGZW5jZQorI3VuZGVmIE1lbW9yeUZlbmNlCisjZW5kaWYKKworbmFtZXNwYWNlIGxsdm0geworICBuYW1lc3BhY2Ugc3lzIHsKKyAgICB2b2lkIE1lbW9yeUZlbmNlKCk7CisKKyNpZmRlZiBfTVNDX1ZFUgorICAgIHR5cGVkZWYgbG9uZyBjYXNfZmxhZzsKKyNlbHNlCisgICAgdHlwZWRlZiB1aW50MzJfdCBjYXNfZmxhZzsKKyNlbmRpZgorICAgIGNhc19mbGFnIENvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIGNhc19mbGFnKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzX2ZsYWcgbmV3X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc19mbGFnIG9sZF92YWx1ZSk7CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQXRvbWljT3JkZXJpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BdG9taWNPcmRlcmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5M2I3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQXRvbWljT3JkZXJpbmcuaApAQCAtMCwwICsxLDE1MiBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvQXRvbWljT3JkZXJpbmcuaCAtLS1BdG9taWMgT3JkZXJpbmctLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIEF0b21pYyBvcmRlcmluZyBjb25zdGFudHMuCisvLy8KKy8vLyBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgYnkgTExWTSB0byByZXByZXNlbnQgYXRvbWljIG9yZGVyaW5nIGZvciBDKysxMSdzCisvLy8gbWVtb3J5IG1vZGVsIGFuZCBtb3JlLCBhcyBkZXRhaWxlZCBpbiBkb2NzL0F0b21pY3MucnN0LgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9BVE9NSUNPUkRFUklOR19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9BVE9NSUNPUkRFUklOR19ICisKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBdG9taWMgb3JkZXJpbmcgZm9yIEMxMSAvIEMrKzExJ3MgbWVtb2R5IG1vZGVscy4KKy8vLworLy8vIFRoZXNlIHZhbHVlcyBjYW5ub3QgY2hhbmdlIGJlY2F1c2UgdGhleSBhcmUgc2hhcmVkIHdpdGggc3RhbmRhcmQgbGlicmFyeQorLy8vIGltcGxlbWVudGF0aW9ucyBhcyB3ZWxsIGFzIHdpdGggb3RoZXIgY29tcGlsZXJzLgorZW51bSBjbGFzcyBBdG9taWNPcmRlcmluZ0NBQkkgeworICByZWxheGVkID0gMCwKKyAgY29uc3VtZSA9IDEsCisgIGFjcXVpcmUgPSAyLAorICByZWxlYXNlID0gMywKKyAgYWNxX3JlbCA9IDQsCisgIHNlcV9jc3QgPSA1LAorfTsKKworYm9vbCBvcGVyYXRvcjwoQXRvbWljT3JkZXJpbmdDQUJJLCBBdG9taWNPcmRlcmluZ0NBQkkpID0gZGVsZXRlOworYm9vbCBvcGVyYXRvcj4oQXRvbWljT3JkZXJpbmdDQUJJLCBBdG9taWNPcmRlcmluZ0NBQkkpID0gZGVsZXRlOworYm9vbCBvcGVyYXRvcjw9KEF0b21pY09yZGVyaW5nQ0FCSSwgQXRvbWljT3JkZXJpbmdDQUJJKSA9IGRlbGV0ZTsKK2Jvb2wgb3BlcmF0b3I+PShBdG9taWNPcmRlcmluZ0NBQkksIEF0b21pY09yZGVyaW5nQ0FCSSkgPSBkZWxldGU7CisKKy8vIFZhbGlkYXRlIGFuIGludGVncmFsIHZhbHVlIHdoaWNoIGlzbid0IGtub3duIHRvIGZpdCB3aXRoaW4gdGhlIGVudW0ncyByYW5nZQorLy8gaXMgYSB2YWxpZCBBdG9taWNPcmRlcmluZ0NBQkkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW50PiBpbmxpbmUgYm9vbCBpc1ZhbGlkQXRvbWljT3JkZXJpbmdDQUJJKEludCBJKSB7CisgIHJldHVybiAoSW50KUF0b21pY09yZGVyaW5nQ0FCSTo6cmVsYXhlZCA8PSBJICYmCisgICAgICAgICBJIDw9IChJbnQpQXRvbWljT3JkZXJpbmdDQUJJOjpzZXFfY3N0OworfQorCisvLy8gQXRvbWljIG9yZGVyaW5nIGZvciBMTFZNJ3MgbWVtb3J5IG1vZGVsLgorLy8vCisvLy8gQysrIGRlZmluZXMgb3JkZXJpbmcgYXMgYSBsYXR0aWNlLiBMTFZNIHN1cHBsZW1lbnRzIHRoaXMgd2l0aCBOb3RBdG9taWMgYW5kCisvLy8gVW5vcmRlcmVkLCB3aGljaCBhcmUgYm90aCBiZWxvdyB0aGUgQysrIG9yZGVycy4KKy8vLworLy8vIG5vdF9hdG9taWMtLT51bm9yZGVyZWQtLT5yZWxheGVkLS0+cmVsZWFzZS0tLS0tLS0tLS0tLS0tLT5hY3FfcmVsLS0+c2VxX2NzdAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcLS0+Y29uc3VtZS0tPmFjcXVpcmUtLS8KK2VudW0gY2xhc3MgQXRvbWljT3JkZXJpbmcgeworICBOb3RBdG9taWMgPSAwLAorICBVbm9yZGVyZWQgPSAxLAorICBNb25vdG9uaWMgPSAyLCAvLyBFcXVpdmFsZW50IHRvIEMrKydzIHJlbGF4ZWQuCisgIC8vIENvbnN1bWUgPSAzLCAgLy8gTm90IHNwZWNpZmllZCB5ZXQuCisgIEFjcXVpcmUgPSA0LAorICBSZWxlYXNlID0gNSwKKyAgQWNxdWlyZVJlbGVhc2UgPSA2LAorICBTZXF1ZW50aWFsbHlDb25zaXN0ZW50ID0gNworfTsKKworYm9vbCBvcGVyYXRvcjwoQXRvbWljT3JkZXJpbmcsIEF0b21pY09yZGVyaW5nKSA9IGRlbGV0ZTsKK2Jvb2wgb3BlcmF0b3I+KEF0b21pY09yZGVyaW5nLCBBdG9taWNPcmRlcmluZykgPSBkZWxldGU7Citib29sIG9wZXJhdG9yPD0oQXRvbWljT3JkZXJpbmcsIEF0b21pY09yZGVyaW5nKSA9IGRlbGV0ZTsKK2Jvb2wgb3BlcmF0b3I+PShBdG9taWNPcmRlcmluZywgQXRvbWljT3JkZXJpbmcpID0gZGVsZXRlOworCisvLyBWYWxpZGF0ZSBhbiBpbnRlZ3JhbCB2YWx1ZSB3aGljaCBpc24ndCBrbm93biB0byBmaXQgd2l0aGluIHRoZSBlbnVtJ3MgcmFuZ2UKKy8vIGlzIGEgdmFsaWQgQXRvbWljT3JkZXJpbmcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW50PiBpbmxpbmUgYm9vbCBpc1ZhbGlkQXRvbWljT3JkZXJpbmcoSW50IEkpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEludD4oQXRvbWljT3JkZXJpbmc6Ok5vdEF0b21pYykgPD0gSSAmJgorICAgICAgICAgSSA8PSBzdGF0aWNfY2FzdDxJbnQ+KEF0b21pY09yZGVyaW5nOjpTZXF1ZW50aWFsbHlDb25zaXN0ZW50KTsKK30KKworLy8vIFN0cmluZyB1c2VkIGJ5IExMVk0gSVIgdG8gcmVwcmVzZW50IGF0b21pYyBvcmRlcmluZy4KK2lubGluZSBjb25zdCBjaGFyICp0b0lSU3RyaW5nKEF0b21pY09yZGVyaW5nIGFvKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyICpuYW1lc1s4XSA9IHsibm90X2F0b21pYyIsICJ1bm9yZGVyZWQiLCAibW9ub3RvbmljIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdW1lIiwgICAgImFjcXVpcmUiLCAgICJyZWxlYXNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3FfcmVsIiwgICAgInNlcV9jc3QifTsKKyAgcmV0dXJuIG5hbWVzW3N0YXRpY19jYXN0PHNpemVfdD4oYW8pXTsKK30KKworLy8vIFJldHVybnMgdHJ1ZSBpZiBhbyBpcyBzdHJvbmdlciB0aGFuIG90aGVyIGFzIGRlZmluZWQgYnkgdGhlIEF0b21pY09yZGVyaW5nCisvLy8gbGF0dGljZSwgd2hpY2ggaXMgYmFzZWQgb24gQysrJ3MgZGVmaW5pdGlvbi4KK2lubGluZSBib29sIGlzU3Ryb25nZXJUaGFuKEF0b21pY09yZGVyaW5nIGFvLCBBdG9taWNPcmRlcmluZyBvdGhlcikgeworICBzdGF0aWMgY29uc3QgYm9vbCBsb29rdXBbOF1bOF0gPSB7CisgICAgICAvLyAgICAgICAgICAgICAgIE5BICAgICBVTiAgICAgUlggICAgIENPICAgICBBQyAgICAgUkUgICAgIEFSICAgICBTQworICAgICAgLyogTm90QXRvbWljICovIHtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9LAorICAgICAgLyogVW5vcmRlcmVkICovIHsgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9LAorICAgICAgLyogcmVsYXhlZCAgICovIHsgdHJ1ZSwgIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9LAorICAgICAgLyogY29uc3VtZSAgICovIHsgdHJ1ZSwgIHRydWUsICB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9LAorICAgICAgLyogYWNxdWlyZSAgICovIHsgdHJ1ZSwgIHRydWUsICB0cnVlLCAgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9LAorICAgICAgLyogcmVsZWFzZSAgICovIHsgdHJ1ZSwgIHRydWUsICB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9LAorICAgICAgLyogYWNxX3JlbCAgICovIHsgdHJ1ZSwgIHRydWUsICB0cnVlLCAgdHJ1ZSwgIHRydWUsICB0cnVlLCBmYWxzZSwgZmFsc2V9LAorICAgICAgLyogc2VxX2NzdCAgICovIHsgdHJ1ZSwgIHRydWUsICB0cnVlLCAgdHJ1ZSwgIHRydWUsICB0cnVlLCAgdHJ1ZSwgZmFsc2V9LAorICB9OworICByZXR1cm4gbG9va3VwW3N0YXRpY19jYXN0PHNpemVfdD4oYW8pXVtzdGF0aWNfY2FzdDxzaXplX3Q+KG90aGVyKV07Cit9CisKK2lubGluZSBib29sIGlzQXRMZWFzdE9yU3Ryb25nZXJUaGFuKEF0b21pY09yZGVyaW5nIGFvLCBBdG9taWNPcmRlcmluZyBvdGhlcikgeworICBzdGF0aWMgY29uc3QgYm9vbCBsb29rdXBbOF1bOF0gPSB7CisgICAgICAvLyAgICAgICAgICAgICAgIE5BICAgICBVTiAgICAgUlggICAgIENPICAgICBBQyAgICAgUkUgICAgIEFSICAgICBTQworICAgICAgLyogTm90QXRvbWljICovIHsgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9LAorICAgICAgLyogVW5vcmRlcmVkICovIHsgdHJ1ZSwgIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9LAorICAgICAgLyogcmVsYXhlZCAgICovIHsgdHJ1ZSwgIHRydWUsICB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9LAorICAgICAgLyogY29uc3VtZSAgICovIHsgdHJ1ZSwgIHRydWUsICB0cnVlLCAgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9LAorICAgICAgLyogYWNxdWlyZSAgICovIHsgdHJ1ZSwgIHRydWUsICB0cnVlLCAgdHJ1ZSwgIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2V9LAorICAgICAgLyogcmVsZWFzZSAgICovIHsgdHJ1ZSwgIHRydWUsICB0cnVlLCBmYWxzZSwgZmFsc2UsICB0cnVlLCBmYWxzZSwgZmFsc2V9LAorICAgICAgLyogYWNxX3JlbCAgICovIHsgdHJ1ZSwgIHRydWUsICB0cnVlLCAgdHJ1ZSwgIHRydWUsICB0cnVlLCAgdHJ1ZSwgZmFsc2V9LAorICAgICAgLyogc2VxX2NzdCAgICovIHsgdHJ1ZSwgIHRydWUsICB0cnVlLCAgdHJ1ZSwgIHRydWUsICB0cnVlLCAgdHJ1ZSwgIHRydWV9LAorICB9OworICByZXR1cm4gbG9va3VwW3N0YXRpY19jYXN0PHNpemVfdD4oYW8pXVtzdGF0aWNfY2FzdDxzaXplX3Q+KG90aGVyKV07Cit9CisKK2lubGluZSBib29sIGlzU3Ryb25nZXJUaGFuVW5vcmRlcmVkKEF0b21pY09yZGVyaW5nIGFvKSB7CisgIHJldHVybiBpc1N0cm9uZ2VyVGhhbihhbywgQXRvbWljT3JkZXJpbmc6OlVub3JkZXJlZCk7Cit9CisKK2lubGluZSBib29sIGlzU3Ryb25nZXJUaGFuTW9ub3RvbmljKEF0b21pY09yZGVyaW5nIGFvKSB7CisgIHJldHVybiBpc1N0cm9uZ2VyVGhhbihhbywgQXRvbWljT3JkZXJpbmc6Ok1vbm90b25pYyk7Cit9CisKK2lubGluZSBib29sIGlzQWNxdWlyZU9yU3Ryb25nZXIoQXRvbWljT3JkZXJpbmcgYW8pIHsKKyAgcmV0dXJuIGlzQXRMZWFzdE9yU3Ryb25nZXJUaGFuKGFvLCBBdG9taWNPcmRlcmluZzo6QWNxdWlyZSk7Cit9CisKK2lubGluZSBib29sIGlzUmVsZWFzZU9yU3Ryb25nZXIoQXRvbWljT3JkZXJpbmcgYW8pIHsKKyAgcmV0dXJuIGlzQXRMZWFzdE9yU3Ryb25nZXJUaGFuKGFvLCBBdG9taWNPcmRlcmluZzo6UmVsZWFzZSk7Cit9CisKK2lubGluZSBBdG9taWNPcmRlcmluZ0NBQkkgdG9DQUJJKEF0b21pY09yZGVyaW5nIGFvKSB7CisgIHN0YXRpYyBjb25zdCBBdG9taWNPcmRlcmluZ0NBQkkgbG9va3VwWzhdID0geworICAgICAgLyogTm90QXRvbWljICovIEF0b21pY09yZGVyaW5nQ0FCSTo6cmVsYXhlZCwKKyAgICAgIC8qIFVub3JkZXJlZCAqLyBBdG9taWNPcmRlcmluZ0NBQkk6OnJlbGF4ZWQsCisgICAgICAvKiByZWxheGVkICAgKi8gQXRvbWljT3JkZXJpbmdDQUJJOjpyZWxheGVkLAorICAgICAgLyogY29uc3VtZSAgICovIEF0b21pY09yZGVyaW5nQ0FCSTo6Y29uc3VtZSwKKyAgICAgIC8qIGFjcXVpcmUgICAqLyBBdG9taWNPcmRlcmluZ0NBQkk6OmFjcXVpcmUsCisgICAgICAvKiByZWxlYXNlICAgKi8gQXRvbWljT3JkZXJpbmdDQUJJOjpyZWxlYXNlLAorICAgICAgLyogYWNxX3JlbCAgICovIEF0b21pY09yZGVyaW5nQ0FCSTo6YWNxX3JlbCwKKyAgICAgIC8qIHNlcV9jc3QgICAqLyBBdG9taWNPcmRlcmluZ0NBQkk6OnNlcV9jc3QsCisgIH07CisgIHJldHVybiBsb29rdXBbc3RhdGljX2Nhc3Q8c2l6ZV90PihhbyldOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0FUT01JQ09SREVSSU5HX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlCeXRlU3RyZWFtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmluYXJ5Qnl0ZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMWNjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmluYXJ5Qnl0ZVN0cmVhbS5oCkBAIC0wLDAgKzEsMjYyIEBACisvLz09PS0gQmluYXJ5Qnl0ZVN0cmVhbS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBIEJpbmFyeVN0cmVhbSB3aGljaCBzdG9yZXMgZGF0YSBpbiBhIHNpbmdsZSBjb250aW5ndW91cyBtZW1vcnkgYnVmZmVyLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQklOQVJZQllURVNUUkVBTV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9CSU5BUllCWVRFU1RSRUFNX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlT3V0cHV0QnVmZmVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgQW4gaW1wbGVtZW50YXRpb24gb2YgQmluYXJ5U3RyZWFtIHdoaWNoIGhvbGRzIGl0cyBlbnRpcmUgZGF0YSBzZXQKKy8vLyBpbiBhIHNpbmdsZSBjb250aWd1b3VzIGJ1ZmZlci4gIEJpbmFyeUJ5dGVTdHJlYW0gZ3VhcmFudGVlcyB0aGF0IG5vIHJlYWQKKy8vLyBvcGVyYXRpb24gd2lsbCBldmVyIGluY3VyIGEgY29weS4gIE5vdGUgdGhhdCBCaW5hcnlCeXRlU3RyZWFtIGRvZXMgbm90CisvLy8gb3duIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlci4KK2NsYXNzIEJpbmFyeUJ5dGVTdHJlYW0gOiBwdWJsaWMgQmluYXJ5U3RyZWFtIHsKK3B1YmxpYzoKKyAgQmluYXJ5Qnl0ZVN0cmVhbSgpID0gZGVmYXVsdDsKKyAgQmluYXJ5Qnl0ZVN0cmVhbShBcnJheVJlZjx1aW50OF90PiBEYXRhLCBsbHZtOjpzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbikKKyAgICAgIDogRW5kaWFuKEVuZGlhbiksIERhdGEoRGF0YSkge30KKyAgQmluYXJ5Qnl0ZVN0cmVhbShTdHJpbmdSZWYgRGF0YSwgbGx2bTo6c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4pCisgICAgICA6IEVuZGlhbihFbmRpYW4pLCBEYXRhKERhdGEuYnl0ZXNfYmVnaW4oKSwgRGF0YS5ieXRlc19lbmQoKSkge30KKworICBsbHZtOjpzdXBwb3J0OjplbmRpYW5uZXNzIGdldEVuZGlhbigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEVuZGlhbjsgfQorCisgIEVycm9yIHJlYWRCeXRlcyh1aW50MzJfdCBPZmZzZXQsIHVpbnQzMl90IFNpemUsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiAmQnVmZmVyKSBvdmVycmlkZSB7CisgICAgaWYgKGF1dG8gRUMgPSBjaGVja09mZnNldEZvclJlYWQoT2Zmc2V0LCBTaXplKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICBCdWZmZXIgPSBEYXRhLnNsaWNlKE9mZnNldCwgU2l6ZSk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBFcnJvciByZWFkTG9uZ2VzdENvbnRpZ3VvdXNDaHVuayh1aW50MzJfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+ICZCdWZmZXIpIG92ZXJyaWRlIHsKKyAgICBpZiAoYXV0byBFQyA9IGNoZWNrT2Zmc2V0Rm9yUmVhZChPZmZzZXQsIDEpKQorICAgICAgcmV0dXJuIEVDOworICAgIEJ1ZmZlciA9IERhdGEuc2xpY2UoT2Zmc2V0KTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIHVpbnQzMl90IGdldExlbmd0aCgpIG92ZXJyaWRlIHsgcmV0dXJuIERhdGEuc2l6ZSgpOyB9CisKKyAgQXJyYXlSZWY8dWludDhfdD4gZGF0YSgpIGNvbnN0IHsgcmV0dXJuIERhdGE7IH0KKworICBTdHJpbmdSZWYgc3RyKCkgY29uc3QgeworICAgIGNvbnN0IGNoYXIgKkNoYXJEYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KERhdGEuZGF0YSgpKTsKKyAgICByZXR1cm4gU3RyaW5nUmVmKENoYXJEYXRhLCBEYXRhLnNpemUoKSk7CisgIH0KKworcHJvdGVjdGVkOgorICBsbHZtOjpzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbjsKKyAgQXJyYXlSZWY8dWludDhfdD4gRGF0YTsKK307CisKKy8vLyBcYnJpZWYgQW4gaW1wbGVtZW50YXRpb24gb2YgQmluYXJ5U3RyZWFtIHdob3NlIGRhdGEgaXMgYmFja2VkIGJ5IGFuIGxsdm0KKy8vLyBNZW1vcnlCdWZmZXIgb2JqZWN0LiAgTWVtb3J5QnVmZmVyQnl0ZVN0cmVhbSBvd25zIHRoZSBNZW1vcnlCdWZmZXIgaW4KKy8vLyBxdWVzdGlvbi4gIEFzIHdpdGggQmluYXJ5Qnl0ZVN0cmVhbSwgcmVhZGluZyBmcm9tIGEgTWVtb3J5QnVmZmVyQnl0ZVN0cmVhbQorLy8vIHdpbGwgbmV2ZXIgY2F1c2UgYSBjb3B5LgorY2xhc3MgTWVtb3J5QnVmZmVyQnl0ZVN0cmVhbSA6IHB1YmxpYyBCaW5hcnlCeXRlU3RyZWFtIHsKK3B1YmxpYzoKKyAgTWVtb3J5QnVmZmVyQnl0ZVN0cmVhbShzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4pCisgICAgICA6IEJpbmFyeUJ5dGVTdHJlYW0oQnVmZmVyLT5nZXRCdWZmZXIoKSwgRW5kaWFuKSwKKyAgICAgICAgTWVtQnVmZmVyKHN0ZDo6bW92ZShCdWZmZXIpKSB7fQorCisgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IE1lbUJ1ZmZlcjsKK307CisKKy8vLyBcYnJpZWYgQW4gaW1wbGVtZW50YXRpb24gb2YgQmluYXJ5U3RyZWFtIHdoaWNoIGhvbGRzIGl0cyBlbnRpcmUgZGF0YSBzZXQKKy8vLyBpbiBhIHNpbmdsZSBjb250aWd1b3VzIGJ1ZmZlci4gIEFzIHdpdGggQmluYXJ5Qnl0ZVN0cmVhbSwgdGhlIG11dGFibGUKKy8vLyB2ZXJzaW9uIGFsc28gZ3VhcmFudGVlcyB0aGF0IG5vIHJlYWQgb3BlcmF0aW9uIHdpbGwgZXZlciBpbmN1ciBhIGNvcHksCisvLy8gYW5kIHNpbWlsYXJseSBpdCBkb2VzIG5vdCBvd24gdGhlIHVuZGVybHlpbmcgYnVmZmVyLgorY2xhc3MgTXV0YWJsZUJpbmFyeUJ5dGVTdHJlYW0gOiBwdWJsaWMgV3JpdGFibGVCaW5hcnlTdHJlYW0geworcHVibGljOgorICBNdXRhYmxlQmluYXJ5Qnl0ZVN0cmVhbSgpID0gZGVmYXVsdDsKKyAgTXV0YWJsZUJpbmFyeUJ5dGVTdHJlYW0oTXV0YWJsZUFycmF5UmVmPHVpbnQ4X3Q+IERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OnN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuKQorICAgICAgOiBEYXRhKERhdGEpLCBJbW11dGFibGVTdHJlYW0oRGF0YSwgRW5kaWFuKSB7fQorCisgIGxsdm06OnN1cHBvcnQ6OmVuZGlhbm5lc3MgZ2V0RW5kaWFuKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbW11dGFibGVTdHJlYW0uZ2V0RW5kaWFuKCk7CisgIH0KKworICBFcnJvciByZWFkQnl0ZXModWludDMyX3QgT2Zmc2V0LCB1aW50MzJfdCBTaXplLAorICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gJkJ1ZmZlcikgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbW11dGFibGVTdHJlYW0ucmVhZEJ5dGVzKE9mZnNldCwgU2l6ZSwgQnVmZmVyKTsKKyAgfQorCisgIEVycm9yIHJlYWRMb25nZXN0Q29udGlndW91c0NodW5rKHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gJkJ1ZmZlcikgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbW11dGFibGVTdHJlYW0ucmVhZExvbmdlc3RDb250aWd1b3VzQ2h1bmsoT2Zmc2V0LCBCdWZmZXIpOworICB9CisKKyAgdWludDMyX3QgZ2V0TGVuZ3RoKCkgb3ZlcnJpZGUgeyByZXR1cm4gSW1tdXRhYmxlU3RyZWFtLmdldExlbmd0aCgpOyB9CisKKyAgRXJyb3Igd3JpdGVCeXRlcyh1aW50MzJfdCBPZmZzZXQsIEFycmF5UmVmPHVpbnQ4X3Q+IEJ1ZmZlcikgb3ZlcnJpZGUgeworICAgIGlmIChCdWZmZXIuZW1wdHkoKSkKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworCisgICAgaWYgKGF1dG8gRUMgPSBjaGVja09mZnNldEZvcldyaXRlKE9mZnNldCwgQnVmZmVyLnNpemUoKSkpCisgICAgICByZXR1cm4gRUM7CisKKyAgICB1aW50OF90ICpEYXRhUHRyID0gY29uc3RfY2FzdDx1aW50OF90ICo+KERhdGEuZGF0YSgpKTsKKyAgICA6Om1lbWNweShEYXRhUHRyICsgT2Zmc2V0LCBCdWZmZXIuZGF0YSgpLCBCdWZmZXIuc2l6ZSgpKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEVycm9yIGNvbW1pdCgpIG92ZXJyaWRlIHsgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7IH0KKworICBNdXRhYmxlQXJyYXlSZWY8dWludDhfdD4gZGF0YSgpIGNvbnN0IHsgcmV0dXJuIERhdGE7IH0KKworcHJpdmF0ZToKKyAgTXV0YWJsZUFycmF5UmVmPHVpbnQ4X3Q+IERhdGE7CisgIEJpbmFyeUJ5dGVTdHJlYW0gSW1tdXRhYmxlU3RyZWFtOworfTsKKworLy8vIFxicmllZiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBXcml0YWJsZUJpbmFyeVN0cmVhbSB3aGljaCBjYW4gd3JpdGUgYXQgaXRzIGVuZAorLy8vIGNhdXNpbmcgdGhlIHVuZGVybHlpbmcgZGF0YSB0byBncm93LiAgVGhpcyBjbGFzcyBvd25zIHRoZSB1bmRlcmx5aW5nIGRhdGEuCitjbGFzcyBBcHBlbmRpbmdCaW5hcnlCeXRlU3RyZWFtIDogcHVibGljIFdyaXRhYmxlQmluYXJ5U3RyZWFtIHsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gRGF0YTsKKyAgbGx2bTo6c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4gPSBsbHZtOjpzdXBwb3J0OjpsaXR0bGU7CisKK3B1YmxpYzoKKyAgQXBwZW5kaW5nQmluYXJ5Qnl0ZVN0cmVhbSgpID0gZGVmYXVsdDsKKyAgQXBwZW5kaW5nQmluYXJ5Qnl0ZVN0cmVhbShsbHZtOjpzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbikKKyAgICAgIDogRW5kaWFuKEVuZGlhbikge30KKworICB2b2lkIGNsZWFyKCkgeyBEYXRhLmNsZWFyKCk7IH0KKworICBsbHZtOjpzdXBwb3J0OjplbmRpYW5uZXNzIGdldEVuZGlhbigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEVuZGlhbjsgfQorCisgIEVycm9yIHJlYWRCeXRlcyh1aW50MzJfdCBPZmZzZXQsIHVpbnQzMl90IFNpemUsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiAmQnVmZmVyKSBvdmVycmlkZSB7CisgICAgaWYgKGF1dG8gRUMgPSBjaGVja09mZnNldEZvcldyaXRlKE9mZnNldCwgQnVmZmVyLnNpemUoKSkpCisgICAgICByZXR1cm4gRUM7CisKKyAgICBCdWZmZXIgPSBtYWtlQXJyYXlSZWYoRGF0YSkuc2xpY2UoT2Zmc2V0LCBTaXplKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIHZvaWQgaW5zZXJ0KHVpbnQzMl90IE9mZnNldCwgQXJyYXlSZWY8dWludDhfdD4gQnl0ZXMpIHsKKyAgICBEYXRhLmluc2VydChEYXRhLmJlZ2luKCkgKyBPZmZzZXQsIEJ5dGVzLmJlZ2luKCksIEJ5dGVzLmVuZCgpKTsKKyAgfQorCisgIEVycm9yIHJlYWRMb25nZXN0Q29udGlndW91c0NodW5rKHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gJkJ1ZmZlcikgb3ZlcnJpZGUgeworICAgIGlmIChhdXRvIEVDID0gY2hlY2tPZmZzZXRGb3JXcml0ZShPZmZzZXQsIDEpKQorICAgICAgcmV0dXJuIEVDOworCisgICAgQnVmZmVyID0gbWFrZUFycmF5UmVmKERhdGEpLnNsaWNlKE9mZnNldCk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICB1aW50MzJfdCBnZXRMZW5ndGgoKSBvdmVycmlkZSB7IHJldHVybiBEYXRhLnNpemUoKTsgfQorCisgIEVycm9yIHdyaXRlQnl0ZXModWludDMyX3QgT2Zmc2V0LCBBcnJheVJlZjx1aW50OF90PiBCdWZmZXIpIG92ZXJyaWRlIHsKKyAgICBpZiAoQnVmZmVyLmVtcHR5KCkpCisgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKworICAgIC8vIFRoaXMgaXMgd2VsbC1kZWZpbmVkIGZvciBhbnkgY2FzZSBleGNlcHQgd2hlcmUgb2Zmc2V0IGlzIHN0cmljdGx5CisgICAgLy8gZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGxlbmd0aC4gIElmIG9mZnNldCBpcyBlcXVhbCB0byB0aGUgY3VycmVudAorICAgIC8vIGxlbmd0aCwgd2UgY2FuIHN0aWxsIGdyb3cuICBJZiBvZmZzZXQgaXMgYmV5b25kIHRoZSBjdXJyZW50IGxlbmd0aCwgd2UKKyAgICAvLyB3b3VsZCBoYXZlIHRvIGRlY2lkZSBob3cgdG8gZGVhbCB3aXRoIHRoZSBpbnRlcm1lZGlhdGUgdW5pbml0aWFsaXplZAorICAgIC8vIGJ5dGVzLiAgU28gd2UgcHVudCBvbiB0aGF0IGNhc2UgZm9yIHNpbXBsaWNpdHkgYW5kIGp1c3Qgc2F5IGl0J3MgYW4KKyAgICAvLyBlcnJvci4KKyAgICBpZiAoT2Zmc2V0ID4gZ2V0TGVuZ3RoKCkpCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxCaW5hcnlTdHJlYW1FcnJvcj4oc3RyZWFtX2Vycm9yX2NvZGU6OmludmFsaWRfb2Zmc2V0KTsKKworICAgIHVpbnQzMl90IFJlcXVpcmVkU2l6ZSA9IE9mZnNldCArIEJ1ZmZlci5zaXplKCk7CisgICAgaWYgKFJlcXVpcmVkU2l6ZSA+IERhdGEuc2l6ZSgpKQorICAgICAgRGF0YS5yZXNpemUoUmVxdWlyZWRTaXplKTsKKworICAgIDo6bWVtY3B5KERhdGEuZGF0YSgpICsgT2Zmc2V0LCBCdWZmZXIuZGF0YSgpLCBCdWZmZXIuc2l6ZSgpKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEVycm9yIGNvbW1pdCgpIG92ZXJyaWRlIHsgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgcHJvcGVydGllcyBvZiB0aGlzIHN0cmVhbS4KKyAgdmlydHVhbCBCaW5hcnlTdHJlYW1GbGFncyBnZXRGbGFncygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gQlNGX1dyaXRlIHwgQlNGX0FwcGVuZDsKKyAgfQorCisgIE11dGFibGVBcnJheVJlZjx1aW50OF90PiBkYXRhKCkgeyByZXR1cm4gRGF0YTsgfQorfTsKKworLy8vIFxicmllZiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBXcml0YWJsZUJpbmFyeVN0cmVhbSBiYWNrZWQgYnkgYW4gbGx2bQorLy8vIEZpbGVPdXRwdXRCdWZmZXIuCitjbGFzcyBGaWxlQnVmZmVyQnl0ZVN0cmVhbSA6IHB1YmxpYyBXcml0YWJsZUJpbmFyeVN0cmVhbSB7Citwcml2YXRlOgorICBjbGFzcyBTdHJlYW1JbXBsIDogcHVibGljIE11dGFibGVCaW5hcnlCeXRlU3RyZWFtIHsKKyAgcHVibGljOgorICAgIFN0cmVhbUltcGwoc3RkOjp1bmlxdWVfcHRyPEZpbGVPdXRwdXRCdWZmZXI+IEJ1ZmZlciwKKyAgICAgICAgICAgICAgIGxsdm06OnN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuKQorICAgICAgICA6IE11dGFibGVCaW5hcnlCeXRlU3RyZWFtKAorICAgICAgICAgICAgICBNdXRhYmxlQXJyYXlSZWY8dWludDhfdD4oQnVmZmVyLT5nZXRCdWZmZXJTdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyLT5nZXRCdWZmZXJFbmQoKSksCisgICAgICAgICAgICAgIEVuZGlhbiksCisgICAgICAgICAgRmlsZUJ1ZmZlcihzdGQ6Om1vdmUoQnVmZmVyKSkge30KKworICAgIEVycm9yIGNvbW1pdCgpIG92ZXJyaWRlIHsKKyAgICAgIGlmIChGaWxlQnVmZmVyLT5jb21taXQoKSkKKyAgICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8QmluYXJ5U3RyZWFtRXJyb3I+KAorICAgICAgICAgICAgc3RyZWFtX2Vycm9yX2NvZGU6OmZpbGVzeXN0ZW1fZXJyb3IpOworICAgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjp1bmlxdWVfcHRyPEZpbGVPdXRwdXRCdWZmZXI+IEZpbGVCdWZmZXI7CisgIH07CisKK3B1YmxpYzoKKyAgRmlsZUJ1ZmZlckJ5dGVTdHJlYW0oc3RkOjp1bmlxdWVfcHRyPEZpbGVPdXRwdXRCdWZmZXI+IEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4pCisgICAgICA6IEltcGwoc3RkOjptb3ZlKEJ1ZmZlciksIEVuZGlhbikge30KKworICBsbHZtOjpzdXBwb3J0OjplbmRpYW5uZXNzIGdldEVuZGlhbigpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRFbmRpYW4oKTsKKyAgfQorCisgIEVycm9yIHJlYWRCeXRlcyh1aW50MzJfdCBPZmZzZXQsIHVpbnQzMl90IFNpemUsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiAmQnVmZmVyKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwucmVhZEJ5dGVzKE9mZnNldCwgU2l6ZSwgQnVmZmVyKTsKKyAgfQorCisgIEVycm9yIHJlYWRMb25nZXN0Q29udGlndW91c0NodW5rKHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gJkJ1ZmZlcikgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLnJlYWRMb25nZXN0Q29udGlndW91c0NodW5rKE9mZnNldCwgQnVmZmVyKTsKKyAgfQorCisgIHVpbnQzMl90IGdldExlbmd0aCgpIG92ZXJyaWRlIHsgcmV0dXJuIEltcGwuZ2V0TGVuZ3RoKCk7IH0KKworICBFcnJvciB3cml0ZUJ5dGVzKHVpbnQzMl90IE9mZnNldCwgQXJyYXlSZWY8dWludDhfdD4gRGF0YSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLndyaXRlQnl0ZXMoT2Zmc2V0LCBEYXRhKTsKKyAgfQorCisgIEVycm9yIGNvbW1pdCgpIG92ZXJyaWRlIHsgcmV0dXJuIEltcGwuY29tbWl0KCk7IH0KKworcHJpdmF0ZToKKyAgU3RyZWFtSW1wbCBJbXBsOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9CWVRFU1RSRUFNX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlJdGVtU3RyZWFtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmluYXJ5SXRlbVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ODcyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmluYXJ5SXRlbVN0cmVhbS5oCkBAIC0wLDAgKzEsMTA4IEBACisvLz09PS0gQmluYXJ5SXRlbVN0cmVhbS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9CSU5BUllJVEVNU1RSRUFNX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0JJTkFSWUlURU1TVFJFQU1fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUVycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgQmluYXJ5SXRlbVRyYWl0cyB7CisgIHN0YXRpYyBzaXplX3QgbGVuZ3RoKGNvbnN0IFQgJkl0ZW0pID0gZGVsZXRlOworICBzdGF0aWMgQXJyYXlSZWY8dWludDhfdD4gYnl0ZXMoY29uc3QgVCAmSXRlbSkgPSBkZWxldGU7Cit9OworCisvLy8gQmluYXJ5SXRlbVN0cmVhbSByZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2Ygb2JqZWN0cyBzdG9yZWQgaW4gc29tZSBraW5kIG9mCisvLy8gZXh0ZXJuYWwgY29udGFpbmVyIGJ1dCBmb3Igd2hpY2ggaXQgaXMgdXNlZnVsIHRvIHZpZXcgYXMgYSBzdHJlYW0gb2YKKy8vLyBjb250aWd1b3VzIGJ5dGVzLiAgQW4gZXhhbXBsZSBvZiB0aGlzIG1pZ2h0IGJlIGlmIHlvdSBoYXZlIGEgY29sbGVjdGlvbiBvZgorLy8vIHJlY29yZHMgYW5kIHlvdSBzZXJpYWxpemUgZWFjaCBvbmUgaW50byBhIGJ1ZmZlciwgYW5kIHN0b3JlIHRoZXNlIHNlcmlhbGl6ZWQKKy8vLyByZWNvcmRzIGluIGEgY29udGFpbmVyLiAgVGhlIHBvaW50ZXJzIHRoZW1zZWx2ZXMgYXJlIG5vdCBsYWlkIG91dAorLy8vIGNvbnRpZ3VvdXNseSBpbiBtZW1vcnksIGJ1dCB3ZSBtYXkgd2lzaCB0byByZWFkIGZyb20gb3Igd3JpdGUgdG8gdGhlc2UKKy8vLyByZWNvcmRzIGFzIGlmIHRoZXkgd2VyZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBUcmFpdHMgPSBCaW5hcnlJdGVtVHJhaXRzPFQ+PgorY2xhc3MgQmluYXJ5SXRlbVN0cmVhbSA6IHB1YmxpYyBCaW5hcnlTdHJlYW0geworcHVibGljOgorICBleHBsaWNpdCBCaW5hcnlJdGVtU3RyZWFtKGxsdm06OnN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuKQorICAgICAgOiBFbmRpYW4oRW5kaWFuKSB7fQorCisgIGxsdm06OnN1cHBvcnQ6OmVuZGlhbm5lc3MgZ2V0RW5kaWFuKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gRW5kaWFuOyB9CisKKyAgRXJyb3IgcmVhZEJ5dGVzKHVpbnQzMl90IE9mZnNldCwgdWludDMyX3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+ICZCdWZmZXIpIG92ZXJyaWRlIHsKKyAgICBhdXRvIEV4cGVjdGVkSW5kZXggPSB0cmFuc2xhdGVPZmZzZXRJbmRleChPZmZzZXQpOworICAgIGlmICghRXhwZWN0ZWRJbmRleCkKKyAgICAgIHJldHVybiBFeHBlY3RlZEluZGV4LnRha2VFcnJvcigpOworICAgIGNvbnN0IGF1dG8gJkl0ZW0gPSBJdGVtc1sqRXhwZWN0ZWRJbmRleF07CisgICAgaWYgKGF1dG8gRUMgPSBjaGVja09mZnNldEZvclJlYWQoT2Zmc2V0LCBTaXplKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICBpZiAoU2l6ZSA+IFRyYWl0czo6bGVuZ3RoKEl0ZW0pKQorICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8QmluYXJ5U3RyZWFtRXJyb3I+KHN0cmVhbV9lcnJvcl9jb2RlOjpzdHJlYW1fdG9vX3Nob3J0KTsKKyAgICBCdWZmZXIgPSBUcmFpdHM6OmJ5dGVzKEl0ZW0pLnRha2VfZnJvbnQoU2l6ZSk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBFcnJvciByZWFkTG9uZ2VzdENvbnRpZ3VvdXNDaHVuayh1aW50MzJfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+ICZCdWZmZXIpIG92ZXJyaWRlIHsKKyAgICBhdXRvIEV4cGVjdGVkSW5kZXggPSB0cmFuc2xhdGVPZmZzZXRJbmRleChPZmZzZXQpOworICAgIGlmICghRXhwZWN0ZWRJbmRleCkKKyAgICAgIHJldHVybiBFeHBlY3RlZEluZGV4LnRha2VFcnJvcigpOworICAgIEJ1ZmZlciA9IFRyYWl0czo6Ynl0ZXMoSXRlbXNbKkV4cGVjdGVkSW5kZXhdKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIHZvaWQgc2V0SXRlbXMoQXJyYXlSZWY8VD4gSXRlbUFycmF5KSB7CisgICAgSXRlbXMgPSBJdGVtQXJyYXk7CisgICAgY29tcHV0ZUl0ZW1PZmZzZXRzKCk7CisgIH0KKworICB1aW50MzJfdCBnZXRMZW5ndGgoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEl0ZW1FbmRPZmZzZXRzLmVtcHR5KCkgPyAwIDogSXRlbUVuZE9mZnNldHMuYmFjaygpOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgY29tcHV0ZUl0ZW1PZmZzZXRzKCkgeworICAgIEl0ZW1FbmRPZmZzZXRzLmNsZWFyKCk7CisgICAgSXRlbUVuZE9mZnNldHMucmVzZXJ2ZShJdGVtcy5zaXplKCkpOworICAgIHVpbnQzMl90IEN1cnJlbnRPZmZzZXQgPSAwOworICAgIGZvciAoY29uc3QgYXV0byAmSXRlbSA6IEl0ZW1zKSB7CisgICAgICB1aW50MzJfdCBMZW4gPSBUcmFpdHM6Omxlbmd0aChJdGVtKTsKKyAgICAgIGFzc2VydChMZW4gPiAwICYmICJubyBlbXB0eSBpdGVtcyIpOworICAgICAgQ3VycmVudE9mZnNldCArPSBMZW47CisgICAgICBJdGVtRW5kT2Zmc2V0cy5wdXNoX2JhY2soQ3VycmVudE9mZnNldCk7CisgICAgfQorICB9CisKKyAgRXhwZWN0ZWQ8dWludDMyX3Q+IHRyYW5zbGF0ZU9mZnNldEluZGV4KHVpbnQzMl90IE9mZnNldCkgeworICAgIC8vIE1ha2Ugc3VyZSB0aGUgb2Zmc2V0IGlzIHNvbWV3aGVyZSBpbiBvdXIgaXRlbXMgYXJyYXkuCisgICAgaWYgKE9mZnNldCA+PSBnZXRMZW5ndGgoKSkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPEJpbmFyeVN0cmVhbUVycm9yPihzdHJlYW1fZXJyb3JfY29kZTo6c3RyZWFtX3Rvb19zaG9ydCk7CisgICAgKytPZmZzZXQ7CisgICAgYXV0byBJdGVyID0KKyAgICAgICAgc3RkOjpsb3dlcl9ib3VuZChJdGVtRW5kT2Zmc2V0cy5iZWdpbigpLCBJdGVtRW5kT2Zmc2V0cy5lbmQoKSwgT2Zmc2V0KTsKKyAgICBzaXplX3QgSWR4ID0gc3RkOjpkaXN0YW5jZShJdGVtRW5kT2Zmc2V0cy5iZWdpbigpLCBJdGVyKTsKKyAgICBhc3NlcnQoSWR4IDwgSXRlbXMuc2l6ZSgpICYmICJiaW5hcnkgc2VhcmNoIGZvciBvZmZzZXQgZmFpbGVkIik7CisgICAgcmV0dXJuIElkeDsKKyAgfQorCisgIGxsdm06OnN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuOworICBBcnJheVJlZjxUPiBJdGVtczsKKworICAvLyBTb3J0ZWQgdmVjdG9yIG9mIG9mZnNldHMgdG8gYWNjZWxlcmF0ZSBsb29rdXAuCisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBJdGVtRW5kT2Zmc2V0czsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfQklOQVJZSVRFTVNUUkVBTV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5YTAzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW0uaApAQCAtMCwwICsxLDEwMiBAQAorLy89PT0tIEJpbmFyeVN0cmVhbS5oIC0gQmFzZSBpbnRlcmZhY2UgZm9yIGEgc3RyZWFtIG9mIGRhdGEgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQklOQVJZU1RSRUFNX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0JJTkFSWVNUUkVBTV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0JpdG1hc2tFbnVtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUVycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworZW51bSBCaW5hcnlTdHJlYW1GbGFncyB7CisgIEJTRl9Ob25lID0gMCwKKyAgQlNGX1dyaXRlID0gMSwgIC8vIFN0cmVhbSBzdXBwb3J0cyB3cml0aW5nLgorICBCU0ZfQXBwZW5kID0gMiwgLy8gV3JpdGluZyBjYW4gb2NjdXIgYXQgb2Zmc2V0ID09IGxlbmd0aC4KKyAgTExWTV9NQVJLX0FTX0JJVE1BU0tfRU5VTSgvKiBMYXJnZXN0VmFsdWUgPSAqLyBCU0ZfQXBwZW5kKQorfTsKKworLy8vIFxicmllZiBBbiBpbnRlcmZhY2UgZm9yIGFjY2Vzc2luZyBkYXRhIGluIGEgc3RyZWFtLWxpa2UgZm9ybWF0LCBidXQgd2hpY2gKKy8vLyBkaXNjb3VyYWdlcyBjb3B5aW5nLiAgSW5zdGVhZCBvZiBzcGVjaWZ5aW5nIGEgYnVmZmVyIGluIHdoaWNoIHRvIGNvcHkKKy8vLyBkYXRhIG9uIGEgcmVhZCwgdGhlIEFQSSByZXR1cm5zIGFuIEFycmF5UmVmIHRvIGRhdGEgb3duZWQgYnkgdGhlIHN0cmVhbSdzCisvLy8gaW1wbGVtZW50YXRpb24uICBTaW5jZSBpbXBsZW1lbnRhdGlvbnMgbWF5IG5vdCBuZWNlc3NhcmlseSBzdG9yZSBkYXRhIGluIGEKKy8vLyBzaW5nbGUgY29udGlndW91cyBidWZmZXIgKG9yIGV2ZW4gaW4gbWVtb3J5IGF0IGFsbCksIGluIHN1Y2ggY2FzZXMgYSBpdCBtYXkKKy8vLyBiZSBuZWNlc3NhcnkgZm9yIGFuIGltcGxlbWVudGF0aW9uIHRvIGNhY2hlIHN1Y2ggYSBidWZmZXIgc28gdGhhdCBpdCBjYW4KKy8vLyByZXR1cm4gaXQuCitjbGFzcyBCaW5hcnlTdHJlYW0geworcHVibGljOgorICB2aXJ0dWFsIH5CaW5hcnlTdHJlYW0oKSA9IGRlZmF1bHQ7CisKKyAgdmlydHVhbCBsbHZtOjpzdXBwb3J0OjplbmRpYW5uZXNzIGdldEVuZGlhbigpIGNvbnN0ID0gMDsKKworICAvLy8gXGJyaWVmIEdpdmVuIGFuIG9mZnNldCBpbnRvIHRoZSBzdHJlYW0gYW5kIGEgbnVtYmVyIG9mIGJ5dGVzLCBhdHRlbXB0IHRvCisgIC8vLyByZWFkIHRoZSBieXRlcyBhbmQgc2V0IHRoZSBvdXRwdXQgQXJyYXlSZWYgdG8gcG9pbnQgdG8gZGF0YSBvd25lZCBieSB0aGUKKyAgLy8vIHN0cmVhbS4KKyAgdmlydHVhbCBFcnJvciByZWFkQnl0ZXModWludDMyX3QgT2Zmc2V0LCB1aW50MzJfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiAmQnVmZmVyKSA9IDA7CisKKyAgLy8vIFxicmllZiBHaXZlbiBhbiBvZmZzZXQgaW50byB0aGUgc3RyZWFtLCByZWFkIGFzIG11Y2ggYXMgcG9zc2libGUgd2l0aG91dAorICAvLy8gY29weWluZyBhbnkgZGF0YS4KKyAgdmlydHVhbCBFcnJvciByZWFkTG9uZ2VzdENvbnRpZ3VvdXNDaHVuayh1aW50MzJfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gJkJ1ZmZlcikgPSAwOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSBpbiB0aGlzIHN0cmVhbS4KKyAgdmlydHVhbCB1aW50MzJfdCBnZXRMZW5ndGgoKSA9IDA7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBzdHJlYW0uCisgIHZpcnR1YWwgQmluYXJ5U3RyZWFtRmxhZ3MgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBCU0ZfTm9uZTsgfQorCitwcm90ZWN0ZWQ6CisgIEVycm9yIGNoZWNrT2Zmc2V0Rm9yUmVhZCh1aW50MzJfdCBPZmZzZXQsIHVpbnQzMl90IERhdGFTaXplKSB7CisgICAgaWYgKE9mZnNldCA+IGdldExlbmd0aCgpKQorICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8QmluYXJ5U3RyZWFtRXJyb3I+KHN0cmVhbV9lcnJvcl9jb2RlOjppbnZhbGlkX29mZnNldCk7CisgICAgaWYgKGdldExlbmd0aCgpIDwgRGF0YVNpemUgKyBPZmZzZXQpCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxCaW5hcnlTdHJlYW1FcnJvcj4oc3RyZWFtX2Vycm9yX2NvZGU6OnN0cmVhbV90b29fc2hvcnQpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9Cit9OworCisvLy8gXGJyaWVmIEEgQmluYXJ5U3RyZWFtIHdoaWNoIGNhbiBiZSByZWFkIGZyb20gYXMgd2VsbCBhcyB3cml0dGVuIHRvLiAgTm90ZQorLy8vIHRoYXQgd3JpdGluZyB0byBhIEJpbmFyeVN0cmVhbSBhbHdheXMgbmVjZXNzaXRhdGVzIGNvcHlpbmcgZnJvbSB0aGUgaW5wdXQKKy8vLyBidWZmZXIgdG8gdGhlIHN0cmVhbSdzIGJhY2tpbmcgc3RvcmUuICBTdHJlYW1zIGFyZSBhc3N1bWVkIHRvIGJlIGJ1ZmZlcmVkCisvLy8gc28gdGhhdCB0byBiZSBwb3J0YWJsZSBpdCBpcyBuZWNlc3NhcnkgdG8gY2FsbCBjb21taXQoKSBvbiB0aGUgc3RyZWFtIHdoZW4KKy8vLyBhbGwgZGF0YSBoYXMgYmVlbiB3cml0dGVuLgorY2xhc3MgV3JpdGFibGVCaW5hcnlTdHJlYW0gOiBwdWJsaWMgQmluYXJ5U3RyZWFtIHsKK3B1YmxpYzoKKyAgfldyaXRhYmxlQmluYXJ5U3RyZWFtKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIC8vLyBcYnJpZWYgQXR0ZW1wdCB0byB3cml0ZSB0aGUgZ2l2ZW4gYnl0ZXMgaW50byB0aGUgc3RyZWFtIGF0IHRoZSBkZXNpcmVkCisgIC8vLyBvZmZzZXQuIFRoaXMgd2lsbCBhbHdheXMgbmVjZXNzaXRhdGUgYSBjb3B5LiAgQ2Fubm90IHNocmluayBvciBncm93IHRoZQorICAvLy8gc3RyZWFtLCBvbmx5IHdyaXRlcyBpbnRvIGV4aXN0aW5nIGFsbG9jYXRlZCBzcGFjZS4KKyAgdmlydHVhbCBFcnJvciB3cml0ZUJ5dGVzKHVpbnQzMl90IE9mZnNldCwgQXJyYXlSZWY8dWludDhfdD4gRGF0YSkgPSAwOworCisgIC8vLyBcYnJpZWYgRm9yIGJ1ZmZlcmVkIHN0cmVhbXMsIGNvbW1pdHMgY2hhbmdlcyB0byB0aGUgYmFja2luZyBzdG9yZS4KKyAgdmlydHVhbCBFcnJvciBjb21taXQoKSA9IDA7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBzdHJlYW0uCisgIEJpbmFyeVN0cmVhbUZsYWdzIGdldEZsYWdzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gQlNGX1dyaXRlOyB9CisKK3Byb3RlY3RlZDoKKyAgRXJyb3IgY2hlY2tPZmZzZXRGb3JXcml0ZSh1aW50MzJfdCBPZmZzZXQsIHVpbnQzMl90IERhdGFTaXplKSB7CisgICAgaWYgKCEoZ2V0RmxhZ3MoKSAmIEJTRl9BcHBlbmQpKQorICAgICAgcmV0dXJuIGNoZWNrT2Zmc2V0Rm9yUmVhZChPZmZzZXQsIERhdGFTaXplKTsKKworICAgIGlmIChPZmZzZXQgPiBnZXRMZW5ndGgoKSkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPEJpbmFyeVN0cmVhbUVycm9yPihzdHJlYW1fZXJyb3JfY29kZTo6aW52YWxpZF9vZmZzZXQpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0JJTkFSWVNUUkVBTV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtQXJyYXkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1BcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNTU2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtQXJyYXkuaApAQCAtMCwwICsxLDM1OCBAQAorLy89PT0tIEJpbmFyeVN0cmVhbUFycmF5LmggLSBBcnJheSBiYWNrZWQgYnkgYW4gYXJiaXRyYXJ5IHN0cmVhbSAqLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQklOQVJZU1RSRUFNQVJSQVlfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQklOQVJZU1RSRUFNQVJSQVlfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKKy8vLyBMaWdodHdlaWdodCBhcnJheXMgdGhhdCBhcmUgYmFja2VkIGJ5IGFuIGFyYml0cmFyeSBCaW5hcnlTdHJlYW0uICBUaGlzIGZpbGUKKy8vLyBwcm92aWRlcyB0d28gZGlmZmVyZW50IGFycmF5IGltcGxlbWVudGF0aW9ucy4KKy8vLworLy8vICAgICBWYXJTdHJlYW1BcnJheSAtIEFycmF5cyBvZiB2YXJpYWJsZSBsZW5ndGggcmVjb3Jkcy4gIFRoZSB1c2VyIHNwZWNpZmllcworLy8vICAgICAgIGFuIEV4dHJhY3RvciB0eXBlIHRoYXQgY2FuIGV4dHJhY3QgYSByZWNvcmQgZnJvbSBhIGdpdmVuIG9mZnNldCBhbmQKKy8vLyAgICAgICByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBieSB0aGUgcmVjb3JkLgorLy8vCisvLy8gICAgIEZpeGVkU3RyZWFtQXJyYXkgLSBBcnJheXMgb2YgZml4ZWQgbGVuZ3RoIHJlY29yZHMuICBUaGlzIGlzIHNpbWlsYXIgaW4KKy8vLyAgICAgICBzcGlyaXQgdG8gQXJyYXlSZWY8VD4sIGJ1dCBzaW5jZSBpdCBpcyBiYWNrZWQgYnkgYSBCaW5hcnlTdHJlYW0sIHRoZQorLy8vICAgICAgIGVsZW1lbnRzIG9mIHRoZSBhcnJheSBuZWVkIG5vdCBiZSBsYWlkIG91dCBpbiBjb250aWd1b3VzIG1lbW9yeS4KK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFZhclN0cmVhbUFycmF5RXh0cmFjdG9yIGlzIGludGVuZGVkIHRvIGJlIHNwZWNpYWxpemVkIHRvIHByb3ZpZGUgY3VzdG9taXplZAorLy8vIGV4dHJhY3Rpb24gbG9naWMuICBPbiBpbnB1dCBpdCByZWNlaXZlcyBhIEJpbmFyeVN0cmVhbVJlZiBwb2ludGluZyB0byB0aGUKKy8vLyBiZWdpbm5pbmcgb2YgdGhlIG5leHQgcmVjb3JkLCBidXQgd2hlcmUgdGhlIGxlbmd0aCBvZiB0aGUgcmVjb3JkIGlzIG5vdCB5ZXQKKy8vLyBrbm93bi4gIFVwb24gY29tcGxldGlvbiwgaXQgc2hvdWxkIHJldHVybiBhbiBhcHByb3ByaWF0ZSBFcnJvciBpbnN0YW5jZSBpZgorLy8vIGEgcmVjb3JkIGNvdWxkIG5vdCBiZSBleHRyYWN0ZWQsIG9yIGlmIG9uZSBjb3VsZCBiZSBleHRyYWN0ZWQgaXQgc2hvdWxkCisvLy8gcmV0dXJuIHN1Y2Nlc3MgYW5kIHNldCBMZW4gdG8gdGhlIG51bWJlciBvZiBieXRlcyB0aGlzIHJlY29yZCBvY2N1cGllZCBpbgorLy8vIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSwgYW5kIGl0IHNob3VsZCBmaWxsIG91dCB0aGUgZmllbGRzIG9mIHRoZSB2YWx1ZSB0eXBlCisvLy8gSXRlbSBhcHByb3ByaWF0ZWx5IHRvIHJlcHJlc2VudCB0aGUgY3VycmVudCByZWNvcmQuCisvLy8KKy8vLyBZb3UgY2FuIHNwZWNpYWxpemUgdGhpcyB0ZW1wbGF0ZSBmb3IgeW91ciBvd24gY3VzdG9tIHZhbHVlIHR5cGVzIHRvIGF2b2lkCisvLy8gaGF2aW5nIHRvIHNwZWNpZnkgYSBzZWNvbmQgdGVtcGxhdGUgYXJndW1lbnQgdG8gVmFyU3RyZWFtQXJyYXkgKGRvY3VtZW50ZWQKKy8vLyBiZWxvdykuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFZhclN0cmVhbUFycmF5RXh0cmFjdG9yIHsKKyAgLy8gTWV0aG9kIGludGVudGlvbmFsbHkgZGVsZXRlZC4gIFlvdSBtdXN0IHByb3ZpZGUgYW4gZXhwbGljaXQgc3BlY2lhbGl6YXRpb24KKyAgLy8gd2l0aCB0aGUgZm9sbG93aW5nIG1ldGhvZCBpbXBsZW1lbnRlZC4KKyAgRXJyb3Igb3BlcmF0b3IoKShCaW5hcnlTdHJlYW1SZWYgU3RyZWFtLCB1aW50MzJfdCAmTGVuLAorICAgICAgICAgICAgICAgICAgIFQgJkl0ZW0pIGNvbnN0ID0gZGVsZXRlOworfTsKKworLy8vIFZhclN0cmVhbUFycmF5IHJlcHJlc2VudHMgYW4gYXJyYXkgb2YgdmFyaWFibGUgbGVuZ3RoIHJlY29yZHMgYmFja2VkIGJ5IGEKKy8vLyBzdHJlYW0uICBUaGlzIGNvdWxkIGJlIGEgY29udGlndW91cyBzZXF1ZW5jZSBvZiBieXRlcyBpbiBtZW1vcnksIGl0IGNvdWxkCisvLy8gYmUgYSBmaWxlIG9uIGRpc2ssIG9yIGl0IGNvdWxkIGJlIGEgUERCIHN0cmVhbSB3aGVyZSBieXRlcyBhcmUgc3RvcmVkIGFzCisvLy8gZGlzY29udGlndW91cyBibG9ja3MgaW4gYSBmaWxlLiAgVXN1YWxseSBpdCBpcyBkZXNpcmFibGUgdG8gdHJlYXQgYXJyYXlzCisvLy8gYXMgY29udGlndW91cyBibG9ja3Mgb2YgbWVtb3J5LCBidXQgZG9pbmcgc28gd2l0aCBsYXJnZSBQREIgZmlsZXMsIGZvcgorLy8vIGV4YW1wbGUsIGNvdWxkIG1lYW4gYWxsb2NhdGluZyBodWdlIGFtb3VudHMgb2YgbWVtb3J5IGp1c3QgdG8gYWxsb3cKKy8vLyByZS1vcmRlcmluZyBvZiBzdHJlYW0gZGF0YSB0byBiZSBjb250aWd1b3VzIGJlZm9yZSBpdGVyYXRpbmcgb3ZlciBpdC4gIEJ5CisvLy8gYWJzdHJhY3RpbmcgdGhpcyBvdXQsIHdlIG5lZWQgbm90IGR1cGxpY2F0ZSB0aGlzIG1lbW9yeSwgYW5kIHdlIGNhbgorLy8vIGl0ZXJhdGUgb3ZlciBhcnJheXMgaW4gYXJiaXRyYXJpbHkgZm9ybWF0dGVkIHN0cmVhbXMuICBFbGVtZW50cyBhcmUgcGFyc2VkCisvLy8gbGF6aWx5IG9uIGl0ZXJhdGlvbiwgc28gdGhlcmUgaXMgbm8gdXBmcm9udCBjb3N0IGFzc29jaWF0ZWQgd2l0aCBidWlsZGluZworLy8vIG9yIGNvcHlpbmcgYSBWYXJTdHJlYW1BcnJheSwgbm8gbWF0dGVyIGhvdyBsYXJnZSBpdCBtYXkgYmUuCisvLy8KKy8vLyBZb3UgY3JlYXRlIGEgVmFyU3RyZWFtQXJyYXkgYnkgc3BlY2lmeWluZyBhIFZhbHVlVHlwZSBhbmQgYW4gRXh0cmFjdG9yIHR5cGUuCisvLy8gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFuIEV4dHJhY3RvciB0eXBlLCB5b3UgYXJlIGV4cGVjdGVkIHRvIHNwZWNpYWxpemUKKy8vLyBWYXJTdHJlYW1BcnJheUV4dHJhY3RvcjxUPiBmb3IgeW91ciBWYWx1ZVR5cGUuCisvLy8KKy8vLyBCeSBkZWZhdWx0IGFuIEV4dHJhY3RvciBpcyBkZWZhdWx0IGNvbnN0cnVjdGVkIGluIHRoZSBjbGFzcywgYnV0IGluIHNvbWUKKy8vLyBjYXNlcyB5b3UgbWlnaHQgZmluZCBpdCB1c2VmdWwgZm9yIGFuIEV4dHJhY3RvciB0byBtYWludGFpbiBzdGF0ZSBhY3Jvc3MKKy8vLyBleHRyYWN0aW9ucy4gIEluIHRoaXMgY2FzZSB5b3UgY2FuIHByb3ZpZGUgeW91ciBvd24gRXh0cmFjdG9yIHRocm91Z2ggYQorLy8vIHNlY29uZGFyeSBjb25zdHJ1Y3Rvci4gIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvdyB2YXJpb3VzIHdheXMgb2YKKy8vLyBjcmVhdGluZyBhIFZhclN0cmVhbUFycmF5LgorLy8vCisvLy8gICAgICAgLy8gV2lsbCB1c2UgVmFyU3RyZWFtQXJyYXlFeHRyYWN0b3I8TXlUeXBlPiBhcyB0aGUgZXh0cmFjdG9yLgorLy8vICAgICAgIFZhclN0cmVhbUFycmF5PE15VHlwZT4gTXlUeXBlQXJyYXk7CisvLy8KKy8vLyAgICAgICAvLyBXaWxsIHVzZSBhIGRlZmF1bHQtY29uc3RydWN0ZWQgTXlFeHRyYWN0b3IgYXMgdGhlIGV4dHJhY3Rvci4KKy8vLyAgICAgICBWYXJTdHJlYW1BcnJheTxNeVR5cGUsIE15RXh0cmFjdG9yPiBNeVR5cGVBcnJheTI7CisvLy8KKy8vLyAgICAgICAvLyBXaWxsIHVzZSB0aGUgc3BlY2lmaWMgaW5zdGFuY2Ugb2YgTXlFeHRyYWN0b3IgcHJvdmlkZWQuCisvLy8gICAgICAgLy8gTXlFeHRyYWN0b3IgbmVlZCBub3QgYmUgZGVmYXVsdC1jb25zdHJ1Y3RpYmxlIGluIHRoaXMgY2FzZS4KKy8vLyAgICAgICBNeUV4dHJhY3RvciBFKFNvbWVDb250ZXh0KTsKKy8vLyAgICAgICBWYXJTdHJlYW1BcnJheTxNeVR5cGUsIE15RXh0cmFjdG9yPiBNeVR5cGVBcnJheTMoRSk7CisvLy8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUgRXh0cmFjdG9yPiBjbGFzcyBWYXJTdHJlYW1BcnJheUl0ZXJhdG9yOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVUeXBlLAorICAgICAgICAgIHR5cGVuYW1lIEV4dHJhY3RvciA9IFZhclN0cmVhbUFycmF5RXh0cmFjdG9yPFZhbHVlVHlwZT4+CitjbGFzcyBWYXJTdHJlYW1BcnJheSB7CisgIGZyaWVuZCBjbGFzcyBWYXJTdHJlYW1BcnJheUl0ZXJhdG9yPFZhbHVlVHlwZSwgRXh0cmFjdG9yPjsKKworcHVibGljOgorICB0eXBlZGVmIFZhclN0cmVhbUFycmF5SXRlcmF0b3I8VmFsdWVUeXBlLCBFeHRyYWN0b3I+IEl0ZXJhdG9yOworCisgIFZhclN0cmVhbUFycmF5KCkgPSBkZWZhdWx0OworCisgIGV4cGxpY2l0IFZhclN0cmVhbUFycmF5KGNvbnN0IEV4dHJhY3RvciAmRSkgOiBFKEUpIHt9CisKKyAgZXhwbGljaXQgVmFyU3RyZWFtQXJyYXkoQmluYXJ5U3RyZWFtUmVmIFN0cmVhbSkgOiBTdHJlYW0oU3RyZWFtKSB7fQorCisgIFZhclN0cmVhbUFycmF5KEJpbmFyeVN0cmVhbVJlZiBTdHJlYW0sIGNvbnN0IEV4dHJhY3RvciAmRSkKKyAgICAgIDogU3RyZWFtKFN0cmVhbSksIEUoRSkge30KKworICBJdGVyYXRvciBiZWdpbihib29sICpIYWRFcnJvciA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gSXRlcmF0b3IoKnRoaXMsIEUsIEhhZEVycm9yKTsKKyAgfQorCisgIGJvb2wgdmFsaWQoKSBjb25zdCB7IHJldHVybiBTdHJlYW0udmFsaWQoKTsgfQorCisgIEl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEl0ZXJhdG9yKEUpOyB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFN0cmVhbS5nZXRMZW5ndGgoKSA9PSAwOyB9CisKKyAgLy8vIFxicmllZiBnaXZlbiBhbiBvZmZzZXQgaW50byB0aGUgYXJyYXkncyB1bmRlcmx5aW5nIHN0cmVhbSwgcmV0dXJuIGFuCisgIC8vLyBpdGVyYXRvciB0byB0aGUgcmVjb3JkIGF0IHRoYXQgb2Zmc2V0LiAgVGhpcyBpcyBjb25zaWRlcmVkIHVuc2FmZQorICAvLy8gc2luY2UgdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZCBpZiBccCBPZmZzZXQgZG9lcyBub3QgcmVmZXIgdG8gdGhlCisgIC8vLyBiZWdpbm5pbmcgb2YgYSB2YWxpZCByZWNvcmQuCisgIEl0ZXJhdG9yIGF0KHVpbnQzMl90IE9mZnNldCkgY29uc3QgeworICAgIHJldHVybiBJdGVyYXRvcigqdGhpcywgRSwgT2Zmc2V0LCBudWxscHRyKTsKKyAgfQorCisgIGNvbnN0IEV4dHJhY3RvciAmZ2V0RXh0cmFjdG9yKCkgY29uc3QgeyByZXR1cm4gRTsgfQorICBFeHRyYWN0b3IgJmdldEV4dHJhY3RvcigpIHsgcmV0dXJuIEU7IH0KKworICBCaW5hcnlTdHJlYW1SZWYgZ2V0VW5kZXJseWluZ1N0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIFN0cmVhbTsgfQorICB2b2lkIHNldFVuZGVybHlpbmdTdHJlYW0oQmluYXJ5U3RyZWFtUmVmIFMpIHsgU3RyZWFtID0gUzsgfQorCitwcml2YXRlOgorICBCaW5hcnlTdHJlYW1SZWYgU3RyZWFtOworICBFeHRyYWN0b3IgRTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lIEV4dHJhY3Rvcj4KK2NsYXNzIFZhclN0cmVhbUFycmF5SXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTxWYXJTdHJlYW1BcnJheUl0ZXJhdG9yPFZhbHVlVHlwZSwgRXh0cmFjdG9yPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBWYWx1ZVR5cGU+IHsKKyAgdHlwZWRlZiBWYXJTdHJlYW1BcnJheUl0ZXJhdG9yPFZhbHVlVHlwZSwgRXh0cmFjdG9yPiBJdGVyVHlwZTsKKyAgdHlwZWRlZiBWYXJTdHJlYW1BcnJheTxWYWx1ZVR5cGUsIEV4dHJhY3Rvcj4gQXJyYXlUeXBlOworCitwdWJsaWM6CisgIFZhclN0cmVhbUFycmF5SXRlcmF0b3IoY29uc3QgQXJyYXlUeXBlICZBcnJheSwgY29uc3QgRXh0cmFjdG9yICZFLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKkhhZEVycm9yKQorICAgICAgOiBWYXJTdHJlYW1BcnJheUl0ZXJhdG9yKEFycmF5LCBFLCAwLCBIYWRFcnJvcikge30KKworICBWYXJTdHJlYW1BcnJheUl0ZXJhdG9yKGNvbnN0IEFycmF5VHlwZSAmQXJyYXksIGNvbnN0IEV4dHJhY3RvciAmRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPZmZzZXQsIGJvb2wgKkhhZEVycm9yKQorICAgICAgOiBJdGVyUmVmKEFycmF5LlN0cmVhbS5kcm9wX2Zyb250KE9mZnNldCkpLCBFeHRyYWN0KEUpLAorICAgICAgICBBcnJheSgmQXJyYXkpLCBBYnNPZmZzZXQoT2Zmc2V0KSwgSGFkRXJyb3IoSGFkRXJyb3IpIHsKKyAgICBpZiAoSXRlclJlZi5nZXRMZW5ndGgoKSA9PSAwKQorICAgICAgbW92ZVRvRW5kKCk7CisgICAgZWxzZSB7CisgICAgICBhdXRvIEVDID0gRXh0cmFjdChJdGVyUmVmLCBUaGlzTGVuLCBUaGlzVmFsdWUpOworICAgICAgaWYgKEVDKSB7CisgICAgICAgIGNvbnN1bWVFcnJvcihzdGQ6Om1vdmUoRUMpKTsKKyAgICAgICAgbWFya0Vycm9yKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgVmFyU3RyZWFtQXJyYXlJdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgVmFyU3RyZWFtQXJyYXlJdGVyYXRvcihjb25zdCBFeHRyYWN0b3IgJkUpIDogRXh0cmFjdChFKSB7fQorICB+VmFyU3RyZWFtQXJyYXlJdGVyYXRvcigpID0gZGVmYXVsdDsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgSXRlclR5cGUgJlIpIGNvbnN0IHsKKyAgICBpZiAoQXJyYXkgJiYgUi5BcnJheSkgeworICAgICAgLy8gQm90aCBoYXZlIGEgdmFsaWQgYXJyYXksIG1ha2Ugc3VyZSB0aGV5J3JlIHNhbWUuCisgICAgICBhc3NlcnQoQXJyYXkgPT0gUi5BcnJheSk7CisgICAgICByZXR1cm4gSXRlclJlZiA9PSBSLkl0ZXJSZWY7CisgICAgfQorCisgICAgLy8gQm90aCBpdGVyYXRvcnMgYXJlIGF0IHRoZSBlbmQuCisgICAgaWYgKCFBcnJheSAmJiAhUi5BcnJheSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gT25lIGlzIG5vdCBhdCB0aGUgZW5kIGFuZCBvbmUgaXMuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY29uc3QgVmFsdWVUeXBlICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgYXNzZXJ0KEFycmF5ICYmICFIYXNFcnJvcik7CisgICAgcmV0dXJuIFRoaXNWYWx1ZTsKKyAgfQorCisgIFZhbHVlVHlwZSAmb3BlcmF0b3IqKCkgeworICAgIGFzc2VydChBcnJheSAmJiAhSGFzRXJyb3IpOworICAgIHJldHVybiBUaGlzVmFsdWU7CisgIH0KKworICBJdGVyVHlwZSAmb3BlcmF0b3IrPSh1bnNpZ25lZCBOKSB7CisgICAgZm9yICh1bnNpZ25lZCBJID0gMDsgSSA8IE47ICsrSSkgeworICAgICAgLy8gV2UgYXJlIGRvbmUgd2l0aCB0aGUgY3VycmVudCByZWNvcmQsIGRpc2NhcmQgaXQgc28gdGhhdCB3ZSBhcmUKKyAgICAgIC8vIHBvc2l0aW9uZWQgYXQgdGhlIG5leHQgcmVjb3JkLgorICAgICAgQWJzT2Zmc2V0ICs9IFRoaXNMZW47CisgICAgICBJdGVyUmVmID0gSXRlclJlZi5kcm9wX2Zyb250KFRoaXNMZW4pOworICAgICAgaWYgKEl0ZXJSZWYuZ2V0TGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAvLyBUaGVyZSBpcyBub3RoaW5nIGFmdGVyIHRoZSBjdXJyZW50IHJlY29yZCwgd2UgbXVzdCBtYWtlIHRoaXMgYW4gZW5kCisgICAgICAgIC8vIGl0ZXJhdG9yLgorICAgICAgICBtb3ZlVG9FbmQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZXJlIGlzIHNvbWUgZGF0YSBhZnRlciB0aGUgY3VycmVudCByZWNvcmQuCisgICAgICAgIGF1dG8gRUMgPSBFeHRyYWN0KEl0ZXJSZWYsIFRoaXNMZW4sIFRoaXNWYWx1ZSk7CisgICAgICAgIGlmIChFQykgeworICAgICAgICAgIGNvbnN1bWVFcnJvcihzdGQ6Om1vdmUoRUMpKTsKKyAgICAgICAgICBtYXJrRXJyb3IoKTsKKyAgICAgICAgfSBlbHNlIGlmIChUaGlzTGVuID09IDApIHsKKyAgICAgICAgICAvLyBBbiBlbXB0eSByZWNvcmQ/IE1ha2UgdGhpcyBhbiBlbmQgaXRlcmF0b3IuCisgICAgICAgICAgbW92ZVRvRW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdWludDMyX3Qgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gQWJzT2Zmc2V0OyB9CisgIHVpbnQzMl90IGdldFJlY29yZExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIFRoaXNMZW47IH0KKworcHJpdmF0ZToKKyAgdm9pZCBtb3ZlVG9FbmQoKSB7CisgICAgQXJyYXkgPSBudWxscHRyOworICAgIFRoaXNMZW4gPSAwOworICB9CisgIHZvaWQgbWFya0Vycm9yKCkgeworICAgIG1vdmVUb0VuZCgpOworICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICBpZiAoSGFkRXJyb3IgIT0gbnVsbHB0cikKKyAgICAgICpIYWRFcnJvciA9IHRydWU7CisgIH0KKworICBWYWx1ZVR5cGUgVGhpc1ZhbHVlOworICBCaW5hcnlTdHJlYW1SZWYgSXRlclJlZjsKKyAgRXh0cmFjdG9yIEV4dHJhY3Q7CisgIGNvbnN0IEFycmF5VHlwZSAqQXJyYXl7bnVsbHB0cn07CisgIHVpbnQzMl90IFRoaXNMZW57MH07CisgIHVpbnQzMl90IEFic09mZnNldHswfTsKKyAgYm9vbCBIYXNFcnJvcntmYWxzZX07CisgIGJvb2wgKkhhZEVycm9ye251bGxwdHJ9OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEZpeGVkU3RyZWFtQXJyYXlJdGVyYXRvcjsKKworLy8vIEZpeGVkU3RyZWFtQXJyYXkgaXMgc2ltaWxhciB0byBWYXJTdHJlYW1BcnJheSwgZXhjZXB0IHdpdGggZWFjaCByZWNvcmQKKy8vLyBoYXZpbmcgYSBmaXhlZC1sZW5ndGguICBBcyB3aXRoIFZhclN0cmVhbUFycmF5LCB0aGVyZSBpcyBubyB1cGZyb250CisvLy8gY29zdCBhc3NvY2lhdGVkIHdpdGggYnVpbGRpbmcgb3IgY29weWluZyBhIEZpeGVkU3RyZWFtQXJyYXksIGFzIHRoZQorLy8vIG1lbW9yeSBmb3IgZWFjaCBlbGVtZW50IGlzIG5vdCByZWFkIGZyb20gdGhlIGJhY2tpbmcgc3RyZWFtIHVudGlsIHRoYXQKKy8vLyBlbGVtZW50IGlzIGl0ZXJhdGVkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEZpeGVkU3RyZWFtQXJyYXkgeworICBmcmllbmQgY2xhc3MgRml4ZWRTdHJlYW1BcnJheUl0ZXJhdG9yPFQ+OworCitwdWJsaWM6CisgIHR5cGVkZWYgRml4ZWRTdHJlYW1BcnJheUl0ZXJhdG9yPFQ+IEl0ZXJhdG9yOworCisgIEZpeGVkU3RyZWFtQXJyYXkoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IEZpeGVkU3RyZWFtQXJyYXkoQmluYXJ5U3RyZWFtUmVmIFN0cmVhbSkgOiBTdHJlYW0oU3RyZWFtKSB7CisgICAgYXNzZXJ0KFN0cmVhbS5nZXRMZW5ndGgoKSAlIHNpemVvZihUKSA9PSAwKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGaXhlZFN0cmVhbUFycmF5PFQ+ICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBTdHJlYW0gPT0gT3RoZXIuU3RyZWFtOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZpeGVkU3RyZWFtQXJyYXk8VD4gJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gT3RoZXIpOworICB9CisKKyAgRml4ZWRTdHJlYW1BcnJheSAmb3BlcmF0b3I9KGNvbnN0IEZpeGVkU3RyZWFtQXJyYXkgJikgPSBkZWZhdWx0OworCisgIGNvbnN0IFQgJm9wZXJhdG9yW10odWludDMyX3QgSW5kZXgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSW5kZXggPCBzaXplKCkpOworICAgIHVpbnQzMl90IE9mZiA9IEluZGV4ICogc2l6ZW9mKFQpOworICAgIEFycmF5UmVmPHVpbnQ4X3Q+IERhdGE7CisgICAgaWYgKGF1dG8gRUMgPSBTdHJlYW0ucmVhZEJ5dGVzKE9mZiwgc2l6ZW9mKFQpLCBEYXRhKSkgeworICAgICAgYXNzZXJ0KGZhbHNlICYmICJVbmV4cGVjdGVkIGZhaWx1cmUgcmVhZGluZyBmcm9tIHN0cmVhbSIpOworICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIHNpbmNlIHdlIGFzc2VydGVkIHRoYXQgdGhlIHN0cmVhbSBsZW5ndGggd2FzCisgICAgICAvLyBhbiBleGFjdCBtdWx0aXBsZSBvZiB0aGUgZWxlbWVudCBzaXplLgorICAgICAgY29uc3VtZUVycm9yKHN0ZDo6bW92ZShFQykpOworICAgIH0KKyAgICBhc3NlcnQobGx2bTo6YWxpZ25tZW50QWRqdXN0bWVudChEYXRhLmRhdGEoKSwgYWxpZ25vZihUKSkgPT0gMCk7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4oRGF0YS5kYXRhKCkpOworICB9CisKKyAgdWludDMyX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFN0cmVhbS5nZXRMZW5ndGgoKSAvIHNpemVvZihUKTsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBzaXplKCkgPT0gMDsgfQorCisgIEZpeGVkU3RyZWFtQXJyYXlJdGVyYXRvcjxUPiBiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gRml4ZWRTdHJlYW1BcnJheUl0ZXJhdG9yPFQ+KCp0aGlzLCAwKTsKKyAgfQorCisgIEZpeGVkU3RyZWFtQXJyYXlJdGVyYXRvcjxUPiBlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIEZpeGVkU3RyZWFtQXJyYXlJdGVyYXRvcjxUPigqdGhpcywgc2l6ZSgpKTsKKyAgfQorCisgIGNvbnN0IFQgJmZyb250KCkgY29uc3QgeyByZXR1cm4gKmJlZ2luKCk7IH0KKyAgY29uc3QgVCAmYmFjaygpIGNvbnN0IHsKKyAgICBGaXhlZFN0cmVhbUFycmF5SXRlcmF0b3I8VD4gSSA9IGVuZCgpOworICAgIHJldHVybiAqKC0tSSk7CisgIH0KKworICBCaW5hcnlTdHJlYW1SZWYgZ2V0VW5kZXJseWluZ1N0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIFN0cmVhbTsgfQorCitwcml2YXRlOgorICBCaW5hcnlTdHJlYW1SZWYgU3RyZWFtOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBGaXhlZFN0cmVhbUFycmF5SXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTxGaXhlZFN0cmVhbUFycmF5SXRlcmF0b3I8VD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgY29uc3QgVD4geworCitwdWJsaWM6CisgIEZpeGVkU3RyZWFtQXJyYXlJdGVyYXRvcihjb25zdCBGaXhlZFN0cmVhbUFycmF5PFQ+ICZBcnJheSwgdWludDMyX3QgSW5kZXgpCisgICAgICA6IEFycmF5KEFycmF5KSwgSW5kZXgoSW5kZXgpIHt9CisKKyAgRml4ZWRTdHJlYW1BcnJheUl0ZXJhdG9yPFQ+ICYKKyAgb3BlcmF0b3I9KGNvbnN0IEZpeGVkU3RyZWFtQXJyYXlJdGVyYXRvcjxUPiAmT3RoZXIpIHsKKyAgICBBcnJheSA9IE90aGVyLkFycmF5OworICAgIEluZGV4ID0gT3RoZXIuSW5kZXg7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgVCAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQXJyYXlbSW5kZXhdOyB9CisgIGNvbnN0IFQgJm9wZXJhdG9yKigpIHsgcmV0dXJuIEFycmF5W0luZGV4XTsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGaXhlZFN0cmVhbUFycmF5SXRlcmF0b3I8VD4gJlIpIGNvbnN0IHsKKyAgICBhc3NlcnQoQXJyYXkgPT0gUi5BcnJheSk7CisgICAgcmV0dXJuIChJbmRleCA9PSBSLkluZGV4KSAmJiAoQXJyYXkgPT0gUi5BcnJheSk7CisgIH0KKworICBGaXhlZFN0cmVhbUFycmF5SXRlcmF0b3I8VD4gJm9wZXJhdG9yKz0oc3RkOjpwdHJkaWZmX3QgTikgeworICAgIEluZGV4ICs9IE47CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgRml4ZWRTdHJlYW1BcnJheUl0ZXJhdG9yPFQ+ICZvcGVyYXRvci09KHN0ZDo6cHRyZGlmZl90IE4pIHsKKyAgICBhc3NlcnQoc3RkOjpwdHJkaWZmX3QoSW5kZXgpID49IE4pOworICAgIEluZGV4IC09IE47CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RkOjpwdHJkaWZmX3Qgb3BlcmF0b3ItKGNvbnN0IEZpeGVkU3RyZWFtQXJyYXlJdGVyYXRvcjxUPiAmUikgY29uc3QgeworICAgIGFzc2VydChBcnJheSA9PSBSLkFycmF5KTsKKyAgICBhc3NlcnQoSW5kZXggPj0gUi5JbmRleCk7CisgICAgcmV0dXJuIEluZGV4IC0gUi5JbmRleDsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEZpeGVkU3RyZWFtQXJyYXlJdGVyYXRvcjxUPiAmUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KEFycmF5ID09IFJIUy5BcnJheSk7CisgICAgcmV0dXJuIEluZGV4IDwgUkhTLkluZGV4OworICB9CisKK3ByaXZhdGU6CisgIEZpeGVkU3RyZWFtQXJyYXk8VD4gQXJyYXk7CisgIHVpbnQzMl90IEluZGV4OworfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0JJTkFSWVNUUkVBTUFSUkFZX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1FcnJvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5Njk5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1FcnJvci5oCkBAIC0wLDAgKzEsNDggQEAKKy8vPT09LSBCaW5hcnlTdHJlYW1FcnJvci5oIC0gRXJyb3IgZXh0ZW5zaW9ucyBmb3IgQmluYXJ5IFN0cmVhbXMgKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0JJTkFSWVNUUkVBTUVSUk9SX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0JJTkFSWVNUUkVBTUVSUk9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CitlbnVtIGNsYXNzIHN0cmVhbV9lcnJvcl9jb2RlIHsKKyAgdW5zcGVjaWZpZWQsCisgIHN0cmVhbV90b29fc2hvcnQsCisgIGludmFsaWRfYXJyYXlfc2l6ZSwKKyAgaW52YWxpZF9vZmZzZXQsCisgIGZpbGVzeXN0ZW1fZXJyb3IKK307CisKKy8vLyBCYXNlIGNsYXNzIGZvciBlcnJvcnMgb3JpZ2luYXRpbmcgd2hlbiBwYXJzaW5nIHJhdyBQREIgZmlsZXMKK2NsYXNzIEJpbmFyeVN0cmVhbUVycm9yIDogcHVibGljIEVycm9ySW5mbzxCaW5hcnlTdHJlYW1FcnJvcj4geworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKyAgZXhwbGljaXQgQmluYXJ5U3RyZWFtRXJyb3Ioc3RyZWFtX2Vycm9yX2NvZGUgQyk7CisgIGV4cGxpY2l0IEJpbmFyeVN0cmVhbUVycm9yKFN0cmluZ1JlZiBDb250ZXh0KTsKKyAgQmluYXJ5U3RyZWFtRXJyb3Ioc3RyZWFtX2Vycm9yX2NvZGUgQywgU3RyaW5nUmVmIENvbnRleHQpOworCisgIHZvaWQgbG9nKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6ZXJyb3JfY29kZSBjb252ZXJ0VG9FcnJvckNvZGUoKSBjb25zdCBvdmVycmlkZTsKKworICBTdHJpbmdSZWYgZ2V0RXJyb3JNZXNzYWdlKCkgY29uc3Q7CisKKyAgc3RyZWFtX2Vycm9yX2NvZGUgZ2V0RXJyb3JDb2RlKCkgY29uc3QgeyByZXR1cm4gQ29kZTsgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBFcnJNc2c7CisgIHN0cmVhbV9lcnJvcl9jb2RlIENvZGU7Cit9OworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0JJTkFSWVNUUkVBTUVSUk9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWFkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTVlYmIyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlYWRlci5oCkBAIC0wLDAgKzEsMjcwIEBACisvLz09PS0gQmluYXJ5U3RyZWFtUmVhZGVyLmggLSBSZWFkcyBvYmplY3RzIGZyb20gYSBiaW5hcnkgc3RyZWFtICotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9CSU5BUllTVFJFQU1SRUFERVJfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQklOQVJZU1RSRUFNUkVBREVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUFycmF5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db252ZXJ0VVRGLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC90eXBlX3RyYWl0cy5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgUHJvdmlkZXMgcmVhZCBvbmx5IGFjY2VzcyB0byBhIHN1YmNsYXNzIG9mIGBCaW5hcnlTdHJlYW1gLiAgUHJvdmlkZXMKKy8vLyBib3VuZHMgY2hlY2tpbmcgYW5kIGhlbHBlcnMgZm9yIHdyaXRpbmcgY2VydGFpbiBjb21tb24gZGF0YSB0eXBlcyBzdWNoIGFzCisvLy8gbnVsbC10ZXJtaW5hdGVkIHN0cmluZ3MsIGludGVnZXJzIGluIHZhcmlvdXMgZmxhdm9ycyBvZiBlbmRpYW5uZXNzLCBldGMuCisvLy8gQ2FuIGJlIHN1YmNsYXNzZWQgdG8gcHJvdmlkZSByZWFkaW5nIG9mIGN1c3RvbSBkYXRhdHlwZXMsIGFsdGhvdWdoIG5vCisvLy8gYXJlIG92ZXJyaWRhYmxlLgorY2xhc3MgQmluYXJ5U3RyZWFtUmVhZGVyIHsKK3B1YmxpYzoKKyAgQmluYXJ5U3RyZWFtUmVhZGVyKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBCaW5hcnlTdHJlYW1SZWFkZXIoQmluYXJ5U3RyZWFtUmVmIFJlZik7CisgIGV4cGxpY2l0IEJpbmFyeVN0cmVhbVJlYWRlcihCaW5hcnlTdHJlYW0gJlN0cmVhbSk7CisgIGV4cGxpY2l0IEJpbmFyeVN0cmVhbVJlYWRlcihBcnJheVJlZjx1aW50OF90PiBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4pOworICBleHBsaWNpdCBCaW5hcnlTdHJlYW1SZWFkZXIoU3RyaW5nUmVmIERhdGEsIGxsdm06OnN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuKTsKKworICBCaW5hcnlTdHJlYW1SZWFkZXIoY29uc3QgQmluYXJ5U3RyZWFtUmVhZGVyICZPdGhlcikKKyAgICAgIDogU3RyZWFtKE90aGVyLlN0cmVhbSksIE9mZnNldChPdGhlci5PZmZzZXQpIHt9CisKKyAgQmluYXJ5U3RyZWFtUmVhZGVyICZvcGVyYXRvcj0oY29uc3QgQmluYXJ5U3RyZWFtUmVhZGVyICZPdGhlcikgeworICAgIFN0cmVhbSA9IE90aGVyLlN0cmVhbTsKKyAgICBPZmZzZXQgPSBPdGhlci5PZmZzZXQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmlydHVhbCB+QmluYXJ5U3RyZWFtUmVhZGVyKCkge30KKworICAvLy8gUmVhZCBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIHVuZGVybHlpbmcgc3RyaW5nIGF0IHRoZSBjdXJyZW50IG9mZnNldAorICAvLy8gd2l0aG91dCBpbnZva2luZyBhIGNvcHksIGFuZCBzZXQgXHAgQnVmZmVyIHRvIHRoZSByZXN1bHRpbmcgZGF0YSBzbGljZS4KKyAgLy8vIFVwZGF0ZXMgdGhlIHN0cmVhbSdzIG9mZnNldCB0byBwb2ludCBhZnRlciB0aGUgbmV3bHkgcmVhZCBkYXRhLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVhZCwgb3RoZXJ3aXNlCisgIC8vLyByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgIEVycm9yIHJlYWRMb25nZXN0Q29udGlndW91c0NodW5rKEFycmF5UmVmPHVpbnQ4X3Q+ICZCdWZmZXIpOworCisgIC8vLyBSZWFkIFxwIFNpemUgYnl0ZXMgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0gYXQgdGhlIGN1cnJlbnQgb2Zmc2V0IGFuZAorICAvLy8gYW5kIHNldCBccCBCdWZmZXIgdG8gdGhlIHJlc3VsdGluZyBkYXRhIHNsaWNlLiAgV2hldGhlciBhIGNvcHkgb2NjdXJzCisgIC8vLyBkZXBlbmRzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdW5kZXJseWluZyBzdHJlYW0uICBVcGRhdGVzIHRoZQorICAvLy8gc3RyZWFtJ3Mgb2Zmc2V0IHRvIHBvaW50IGFmdGVyIHRoZSBuZXdseSByZWFkIGRhdGEuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZWFkLCBvdGhlcndpc2UKKyAgLy8vIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgRXJyb3IgcmVhZEJ5dGVzKEFycmF5UmVmPHVpbnQ4X3Q+ICZCdWZmZXIsIHVpbnQzMl90IFNpemUpOworCisgIC8vLyBSZWFkIGFuIGludGVnZXIgb2YgdGhlIHNwZWNpZmllZCBlbmRpYW5uZXNzIGludG8gXHAgRGVzdCBhbmQgdXBkYXRlIHRoZQorICAvLy8gc3RyZWFtJ3Mgb2Zmc2V0LiAgVGhlIGRhdGEgaXMgYWx3YXlzIGNvcGllZCBmcm9tIHRoZSBzdHJlYW0ncyB1bmRlcmx5aW5nCisgIC8vLyBidWZmZXIgaW50byBccCBEZXN0LiBVcGRhdGVzIHRoZSBzdHJlYW0ncyBvZmZzZXQgdG8gcG9pbnQgYWZ0ZXIgdGhlIG5ld2x5CisgIC8vLyByZWFkIGRhdGEuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZWFkLCBvdGhlcndpc2UKKyAgLy8vIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEVycm9yIHJlYWRJbnRlZ2VyKFQgJkRlc3QpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjYWxsIHJlYWRJbnRlZ2VyIHdpdGggbm9uLWludGVncmFsIHZhbHVlISIpOworCisgICAgQXJyYXlSZWY8dWludDhfdD4gQnl0ZXM7CisgICAgaWYgKGF1dG8gRUMgPSByZWFkQnl0ZXMoQnl0ZXMsIHNpemVvZihUKSkpCisgICAgICByZXR1cm4gRUM7CisKKyAgICBEZXN0ID0gbGx2bTo6c3VwcG9ydDo6ZW5kaWFuOjpyZWFkPFQsIGxsdm06OnN1cHBvcnQ6OnVuYWxpZ25lZD4oCisgICAgICAgIEJ5dGVzLmRhdGEoKSwgU3RyZWFtLmdldEVuZGlhbigpKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIC8vLyBTaW1pbGFyIHRvIHJlYWRJbnRlZ2VyLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRXJyb3IgcmVhZEVudW0oVCAmRGVzdCkgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19lbnVtPFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJDYW5ub3QgY2FsbCByZWFkRW51bSB3aXRoIG5vbi1lbnVtIHZhbHVlISIpOworICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlIE47CisgICAgaWYgKGF1dG8gRUMgPSByZWFkSW50ZWdlcihOKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICBEZXN0ID0gc3RhdGljX2Nhc3Q8VD4oTik7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICAvLy8gUmVhZCBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgZnJvbSBccCBEZXN0LiAgV2hldGhlciBhIGNvcHkgb2NjdXJzIGRlcGVuZHMKKyAgLy8vIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdW5kZXJseWluZyBzdHJlYW0uICBVcGRhdGVzIHRoZSBzdHJlYW0ncworICAvLy8gb2Zmc2V0IHRvIHBvaW50IGFmdGVyIHRoZSBuZXdseSByZWFkIGRhdGEuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZWFkLCBvdGhlcndpc2UKKyAgLy8vIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgRXJyb3IgcmVhZENTdHJpbmcoU3RyaW5nUmVmICZEZXN0KTsKKworICAvLy8gU2ltaWxhciB0byByZWFkQ1N0cmluZywgaG93ZXZlciByZWFkIGEgbnVsbC10ZXJtaW5hdGVkIFVURjE2IHN0cmluZworICAvLy8gaW5zdGVhZC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHN1Y2Nlc3MgZXJyb3IgY29kZSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHJlYWQsIG90aGVyd2lzZQorICAvLy8gcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICBFcnJvciByZWFkV2lkZVN0cmluZyhBcnJheVJlZjxVVEYxNj4gJkRlc3QpOworCisgIC8vLyBSZWFkIGEgXHAgTGVuZ3RoIGJ5dGUgc3RyaW5nIGludG8gXHAgRGVzdC4gIFdoZXRoZXIgYSBjb3B5IG9jY3VycyBkZXBlbmRzCisgIC8vLyBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHVuZGVybHlpbmcgc3RyZWFtLiAgVXBkYXRlcyB0aGUgc3RyZWFtJ3MKKyAgLy8vIG9mZnNldCB0byBwb2ludCBhZnRlciB0aGUgbmV3bHkgcmVhZCBkYXRhLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVhZCwgb3RoZXJ3aXNlCisgIC8vLyByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgIEVycm9yIHJlYWRGaXhlZFN0cmluZyhTdHJpbmdSZWYgJkRlc3QsIHVpbnQzMl90IExlbmd0aCk7CisKKyAgLy8vIFJlYWQgdGhlIGVudGlyZSByZW1haW5kZXIgb2YgdGhlIHVuZGVybHlpbmcgc3RyZWFtIGludG8gXHAgUmVmLiAgVGhpcyBpcworICAvLy8gZXF1aXZhbGVudCB0byBjYWxsaW5nIGdldFVuZGVybHlpbmdTdHJlYW0oKS5zbGljZShPZmZzZXQpLiAgVXBkYXRlcyB0aGUKKyAgLy8vIHN0cmVhbSdzIG9mZnNldCB0byBwb2ludCB0byB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICBOZXZlciBjYXVzZXMgYSBjb3B5LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVhZCwgb3RoZXJ3aXNlCisgIC8vLyByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgIEVycm9yIHJlYWRTdHJlYW1SZWYoQmluYXJ5U3RyZWFtUmVmICZSZWYpOworCisgIC8vLyBSZWFkIFxwIExlbmd0aCBieXRlcyBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBpbnRvIFxwIFJlZi4gIFRoaXMgaXMKKyAgLy8vIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBnZXRVbmRlcmx5aW5nU3RyZWFtKCkuc2xpY2UoT2Zmc2V0LCBMZW5ndGgpLgorICAvLy8gVXBkYXRlcyB0aGUgc3RyZWFtJ3Mgb2Zmc2V0IHRvIHBvaW50IGFmdGVyIHRoZSBuZXdseSByZWFkIG9iamVjdC4gIE5ldmVyCisgIC8vLyBjYXVzZXMgYSBjb3B5LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVhZCwgb3RoZXJ3aXNlCisgIC8vLyByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgIEVycm9yIHJlYWRTdHJlYW1SZWYoQmluYXJ5U3RyZWFtUmVmICZSZWYsIHVpbnQzMl90IExlbmd0aCk7CisKKyAgLy8vIFJlYWQgXHAgTGVuZ3RoIGJ5dGVzIGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGludG8gXHAgU3RyZWFtLiAgVGhpcyBpcworICAvLy8gZXF1aXZhbGVudCB0byBjYWxsaW5nIGdldFVuZGVybHlpbmdTdHJlYW0oKS5zbGljZShPZmZzZXQsIExlbmd0aCkuCisgIC8vLyBVcGRhdGVzIHRoZSBzdHJlYW0ncyBvZmZzZXQgdG8gcG9pbnQgYWZ0ZXIgdGhlIG5ld2x5IHJlYWQgb2JqZWN0LiAgTmV2ZXIKKyAgLy8vIGNhdXNlcyBhIGNvcHkuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZWFkLCBvdGhlcndpc2UKKyAgLy8vIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgRXJyb3IgcmVhZFN1YnN0cmVhbShCaW5hcnlTdWJzdHJlYW1SZWYgJlN0cmVhbSwgdWludDMyX3QgU2l6ZSk7CisKKyAgLy8vIEdldCBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0IG9mIHR5cGUgVCBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSwgYXMgaWYgYnkKKyAgLy8vIG1lbWNweSwgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW50byBccCBEZXN0LiAgSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0bworICAvLy8gZW5zdXJlIHRoYXQgb2JqZWN0cyBvZiB0eXBlIFQgY2FuIGJlIHNhZmVseSB0cmVhdGVkIGluIHRoaXMgbWFubmVyLgorICAvLy8gVXBkYXRlcyB0aGUgc3RyZWFtJ3Mgb2Zmc2V0IHRvIHBvaW50IGFmdGVyIHRoZSBuZXdseSByZWFkIG9iamVjdC4gIFdoZXRoZXIKKyAgLy8vIGEgY29weSBvY2N1cnMgZGVwZW5kcyB1cG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdW5kZXJseWluZworICAvLy8gc3RyZWFtLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVhZCwgb3RoZXJ3aXNlCisgIC8vLyByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBFcnJvciByZWFkT2JqZWN0KGNvbnN0IFQgKiZEZXN0KSB7CisgICAgQXJyYXlSZWY8dWludDhfdD4gQnVmZmVyOworICAgIGlmIChhdXRvIEVDID0gcmVhZEJ5dGVzKEJ1ZmZlciwgc2l6ZW9mKFQpKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICBEZXN0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUICo+KEJ1ZmZlci5kYXRhKCkpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgLy8vIEdldCBhIHJlZmVyZW5jZSB0byBhIFxwIE51bUVsZW1lbnRzIGVsZW1lbnQgYXJyYXkgb2Ygb2JqZWN0cyBvZiB0eXBlIFQKKyAgLy8vIGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGFzIGlmIGJ5IG1lbWNweSwgYW5kIHN0b3JlIHRoZSByZXN1bHRpbmcgYXJyYXkKKyAgLy8vIHNsaWNlIGludG8gXHAgYXJyYXkuICBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGVuc3VyZSB0aGF0IG9iamVjdHMgb2YKKyAgLy8vIHR5cGUgVCBjYW4gYmUgc2FmZWx5IHRyZWF0ZWQgaW4gdGhpcyBtYW5uZXIuICBVcGRhdGVzIHRoZSBzdHJlYW0ncyBvZmZzZXQKKyAgLy8vIHRvIHBvaW50IGFmdGVyIHRoZSBuZXdseSByZWFkIG9iamVjdC4gIFdoZXRoZXIgYSBjb3B5IG9jY3VycyBkZXBlbmRzIHVwb24KKyAgLy8vIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZWFkLCBvdGhlcndpc2UKKyAgLy8vIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIEVycm9yIHJlYWRBcnJheShBcnJheVJlZjxUPiAmQXJyYXksIHVpbnQzMl90IE51bUVsZW1lbnRzKSB7CisgICAgQXJyYXlSZWY8dWludDhfdD4gQnl0ZXM7CisgICAgaWYgKE51bUVsZW1lbnRzID09IDApIHsKKyAgICAgIEFycmF5ID0gQXJyYXlSZWY8VD4oKTsKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgIH0KKworICAgIGlmIChOdW1FbGVtZW50cyA+IFVJTlQzMl9NQVggLyBzaXplb2YoVCkpCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxCaW5hcnlTdHJlYW1FcnJvcj4oCisgICAgICAgICAgc3RyZWFtX2Vycm9yX2NvZGU6OmludmFsaWRfYXJyYXlfc2l6ZSk7CisKKyAgICBpZiAoYXV0byBFQyA9IHJlYWRCeXRlcyhCeXRlcywgTnVtRWxlbWVudHMgKiBzaXplb2YoVCkpKQorICAgICAgcmV0dXJuIEVDOworCisgICAgYXNzZXJ0KGFsaWdubWVudEFkanVzdG1lbnQoQnl0ZXMuZGF0YSgpLCBhbGlnbm9mKFQpKSA9PSAwICYmCisgICAgICAgICAgICJSZWFkaW5nIGF0IGludmFsaWQgYWxpZ25tZW50ISIpOworCisgICAgQXJyYXkgPSBBcnJheVJlZjxUPihyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4oQnl0ZXMuZGF0YSgpKSwgTnVtRWxlbWVudHMpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgLy8vIFJlYWQgYSBWYXJTdHJlYW1BcnJheSBvZiBzaXplIFxwIFNpemUgYnl0ZXMgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW50bworICAvLy8gXHAgQXJyYXkuICBVcGRhdGVzIHRoZSBzdHJlYW0ncyBvZmZzZXQgdG8gcG9pbnQgYWZ0ZXIgdGhlIG5ld2x5IHJlYWQKKyAgLy8vIGFycmF5LiAgTmV2ZXIgY2F1c2VzIGEgY29weSAoYWx0aG91Z2ggaXRlcmF0aW5nIHRoZSBlbGVtZW50cyBvZiB0aGUKKyAgLy8vIFZhclN0cmVhbUFycmF5IG1heSwgZGVwZW5kaW5nIHVwb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nCisgIC8vLyBzdHJlYW0pLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVhZCwgb3RoZXJ3aXNlCisgIC8vLyByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorICBFcnJvciByZWFkQXJyYXkoVmFyU3RyZWFtQXJyYXk8VCwgVT4gJkFycmF5LCB1aW50MzJfdCBTaXplKSB7CisgICAgQmluYXJ5U3RyZWFtUmVmIFM7CisgICAgaWYgKGF1dG8gRUMgPSByZWFkU3RyZWFtUmVmKFMsIFNpemUpKQorICAgICAgcmV0dXJuIEVDOworICAgIEFycmF5LnNldFVuZGVybHlpbmdTdHJlYW0oUyk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICAvLy8gUmVhZCBhIEZpeGVkU3RyZWFtQXJyYXkgb2YgXHAgTnVtSXRlbXMgZWxlbWVudHMgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW50bworICAvLy8gXHAgQXJyYXkuICBVcGRhdGVzIHRoZSBzdHJlYW0ncyBvZmZzZXQgdG8gcG9pbnQgYWZ0ZXIgdGhlIG5ld2x5IHJlYWQKKyAgLy8vIGFycmF5LiAgTmV2ZXIgY2F1c2VzIGEgY29weSAoYWx0aG91Z2ggaXRlcmF0aW5nIHRoZSBlbGVtZW50cyBvZiB0aGUKKyAgLy8vIEZpeGVkU3RyZWFtQXJyYXkgbWF5LCBkZXBlbmRpbmcgdXBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHVuZGVybHlpbmcKKyAgLy8vIHN0cmVhbSkuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZWFkLCBvdGhlcndpc2UKKyAgLy8vIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIEVycm9yIHJlYWRBcnJheShGaXhlZFN0cmVhbUFycmF5PFQ+ICZBcnJheSwgdWludDMyX3QgTnVtSXRlbXMpIHsKKyAgICBpZiAoTnVtSXRlbXMgPT0gMCkgeworICAgICAgQXJyYXkgPSBGaXhlZFN0cmVhbUFycmF5PFQ+KCk7CisgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICBpZiAoTnVtSXRlbXMgPiBVSU5UMzJfTUFYIC8gc2l6ZW9mKFQpKQorICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8QmluYXJ5U3RyZWFtRXJyb3I+KAorICAgICAgICAgIHN0cmVhbV9lcnJvcl9jb2RlOjppbnZhbGlkX2FycmF5X3NpemUpOworCisgICAgQmluYXJ5U3RyZWFtUmVmIFZpZXc7CisgICAgaWYgKGF1dG8gRUMgPSByZWFkU3RyZWFtUmVmKFZpZXcsIE51bUl0ZW1zICogc2l6ZW9mKFQpKSkKKyAgICAgIHJldHVybiBFQzsKKworICAgIEFycmF5ID0gRml4ZWRTdHJlYW1BcnJheTxUPihWaWV3KTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBieXRlc1JlbWFpbmluZygpID09IDA7IH0KKyAgdm9pZCBzZXRPZmZzZXQodWludDMyX3QgT2ZmKSB7IE9mZnNldCA9IE9mZjsgfQorICB1aW50MzJfdCBnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBPZmZzZXQ7IH0KKyAgdWludDMyX3QgZ2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gU3RyZWFtLmdldExlbmd0aCgpOyB9CisgIHVpbnQzMl90IGJ5dGVzUmVtYWluaW5nKCkgY29uc3QgeyByZXR1cm4gZ2V0TGVuZ3RoKCkgLSBnZXRPZmZzZXQoKTsgfQorCisgIC8vLyBBZHZhbmNlIHRoZSBzdHJlYW0ncyBvZmZzZXQgYnkgXHAgQW1vdW50IGJ5dGVzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIGF0IGxlYXN0IFxwIEFtb3VudCBieXRlcyByZW1haW4gaW4gdGhlCisgIC8vLyBzdHJlYW0sIG90aGVyd2lzZSByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgIEVycm9yIHNraXAodWludDMyX3QgQW1vdW50KTsKKworICAvLy8gRXhhbWluZSB0aGUgbmV4dCBieXRlIG9mIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSB3aXRob3V0IGFkdmFuY2luZyB0aGUKKyAgLy8vIHN0cmVhbSdzIG9mZnNldC4gIElmIHRoZSBzdHJlYW0gaXMgZW1wdHkgdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgbmV4dCBieXRlIGluIHRoZSBzdHJlYW0uCisgIHVpbnQ4X3QgcGVlaygpIGNvbnN0OworCisgIEVycm9yIHBhZFRvQWxpZ25tZW50KHVpbnQzMl90IEFsaWduKTsKKworICBzdGQ6OnBhaXI8QmluYXJ5U3RyZWFtUmVhZGVyLCBCaW5hcnlTdHJlYW1SZWFkZXI+CisgIHNwbGl0KHVpbnQzMl90IE9mZnNldCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIEJpbmFyeVN0cmVhbVJlZiBTdHJlYW07CisgIHVpbnQzMl90IE9mZnNldCA9IDA7Cit9OworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0JJTkFSWVNUUkVBTVJFQURFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVmLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmMzU1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWYuaApAQCAtMCwwICsxLDI3NSBAQAorLy89PT0tIEJpbmFyeVN0cmVhbVJlZi5oIC0gQSBjb3B5YWJsZSByZWZlcmVuY2UgdG8gYSBzdHJlYW0gLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQklOQVJZU1RSRUFNUkVGX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0JJTkFSWVNUUkVBTVJFRl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQ29tbW9uIHN0dWZmIGZvciBtdXRhYmxlIGFuZCBpbW11dGFibGUgU3RyZWFtUmVmcy4KK3RlbXBsYXRlIDxjbGFzcyBSZWZUeXBlLCBjbGFzcyBTdHJlYW1UeXBlPiBjbGFzcyBCaW5hcnlTdHJlYW1SZWZCYXNlIHsKK3Byb3RlY3RlZDoKKyAgQmluYXJ5U3RyZWFtUmVmQmFzZSgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgQmluYXJ5U3RyZWFtUmVmQmFzZShTdHJlYW1UeXBlICZCb3Jyb3dlZEltcGwpCisgICAgICA6IEJvcnJvd2VkSW1wbCgmQm9ycm93ZWRJbXBsKSwgVmlld09mZnNldCgwKSB7CisgICAgaWYgKCEoQm9ycm93ZWRJbXBsLmdldEZsYWdzKCkgJiBCU0ZfQXBwZW5kKSkKKyAgICAgIExlbmd0aCA9IEJvcnJvd2VkSW1wbC5nZXRMZW5ndGgoKTsKKyAgfQorCisgIEJpbmFyeVN0cmVhbVJlZkJhc2Uoc3RkOjpzaGFyZWRfcHRyPFN0cmVhbVR5cGU+IFNoYXJlZEltcGwsIHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDx1aW50MzJfdD4gTGVuZ3RoKQorICAgICAgOiBTaGFyZWRJbXBsKFNoYXJlZEltcGwpLCBCb3Jyb3dlZEltcGwoU2hhcmVkSW1wbC5nZXQoKSksCisgICAgICAgIFZpZXdPZmZzZXQoT2Zmc2V0KSwgTGVuZ3RoKExlbmd0aCkge30KKyAgQmluYXJ5U3RyZWFtUmVmQmFzZShTdHJlYW1UeXBlICZCb3Jyb3dlZEltcGwsIHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDx1aW50MzJfdD4gTGVuZ3RoKQorICAgICAgOiBCb3Jyb3dlZEltcGwoJkJvcnJvd2VkSW1wbCksIFZpZXdPZmZzZXQoT2Zmc2V0KSwgTGVuZ3RoKExlbmd0aCkge30KKyAgQmluYXJ5U3RyZWFtUmVmQmFzZShjb25zdCBCaW5hcnlTdHJlYW1SZWZCYXNlICZPdGhlcikgPSBkZWZhdWx0OworICBCaW5hcnlTdHJlYW1SZWZCYXNlICZvcGVyYXRvcj0oY29uc3QgQmluYXJ5U3RyZWFtUmVmQmFzZSAmT3RoZXIpID0gZGVmYXVsdDsKKworICBCaW5hcnlTdHJlYW1SZWZCYXNlICZvcGVyYXRvcj0oQmluYXJ5U3RyZWFtUmVmQmFzZSAmJk90aGVyKSA9IGRlZmF1bHQ7CisgIEJpbmFyeVN0cmVhbVJlZkJhc2UoQmluYXJ5U3RyZWFtUmVmQmFzZSAmJk90aGVyKSA9IGRlZmF1bHQ7CisKK3B1YmxpYzoKKyAgbGx2bTo6c3VwcG9ydDo6ZW5kaWFubmVzcyBnZXRFbmRpYW4oKSBjb25zdCB7CisgICAgcmV0dXJuIEJvcnJvd2VkSW1wbC0+Z2V0RW5kaWFuKCk7CisgIH0KKworICB1aW50MzJfdCBnZXRMZW5ndGgoKSBjb25zdCB7CisgICAgaWYgKExlbmd0aC5oYXNWYWx1ZSgpKQorICAgICAgcmV0dXJuICpMZW5ndGg7CisKKyAgICByZXR1cm4gQm9ycm93ZWRJbXBsID8gKEJvcnJvd2VkSW1wbC0+Z2V0TGVuZ3RoKCkgLSBWaWV3T2Zmc2V0KSA6IDA7CisgIH0KKworICAvLy8gUmV0dXJuIGEgbmV3IEJpbmFyeVN0cmVhbVJlZiB3aXRoIHRoZSBmaXJzdCBccCBOIGVsZW1lbnRzIHJlbW92ZWQuICBJZgorICAvLy8gdGhpcyBCaW5hcnlTdHJlYW1SZWYgaXMgbGVuZ3RoLXRyYWNraW5nLCB0aGVuIHRoZSByZXN1bHRpbmcgb25lIHdpbGwgYmUKKyAgLy8vIHRvby4KKyAgUmVmVHlwZSBkcm9wX2Zyb250KHVpbnQzMl90IE4pIGNvbnN0IHsKKyAgICBpZiAoIUJvcnJvd2VkSW1wbCkKKyAgICAgIHJldHVybiBSZWZUeXBlKCk7CisKKyAgICBOID0gc3RkOjptaW4oTiwgZ2V0TGVuZ3RoKCkpOworICAgIFJlZlR5cGUgUmVzdWx0KHN0YXRpY19jYXN0PGNvbnN0IFJlZlR5cGUgJj4oKnRoaXMpKTsKKyAgICBpZiAoTiA9PSAwKQorICAgICAgcmV0dXJuIFJlc3VsdDsKKworICAgIFJlc3VsdC5WaWV3T2Zmc2V0ICs9IE47CisgICAgaWYgKFJlc3VsdC5MZW5ndGguaGFzVmFsdWUoKSkKKyAgICAgICpSZXN1bHQuTGVuZ3RoIC09IE47CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSBuZXcgQmluYXJ5U3RyZWFtUmVmIHdpdGggdGhlIGxhc3QgXHAgTiBlbGVtZW50cyByZW1vdmVkLiAgSWYKKyAgLy8vIHRoaXMgQmluYXJ5U3RyZWFtUmVmIGlzIGxlbmd0aC10cmFja2luZyBhbmQgXHAgTiBpcyBncmVhdGVyIHRoYW4gMCwgdGhlbgorICAvLy8gdGhpcyBCaW5hcnlTdHJlYW1SZWYgd2lsbCBubyBsb25nZXIgbGVuZ3RoLXRyYWNrLgorICBSZWZUeXBlIGRyb3BfYmFjayh1aW50MzJfdCBOKSBjb25zdCB7CisgICAgaWYgKCFCb3Jyb3dlZEltcGwpCisgICAgICByZXR1cm4gUmVmVHlwZSgpOworCisgICAgUmVmVHlwZSBSZXN1bHQoc3RhdGljX2Nhc3Q8Y29uc3QgUmVmVHlwZSAmPigqdGhpcykpOworICAgIE4gPSBzdGQ6Om1pbihOLCBnZXRMZW5ndGgoKSk7CisKKyAgICBpZiAoTiA9PSAwKQorICAgICAgcmV0dXJuIFJlc3VsdDsKKworICAgIC8vIFNpbmNlIHdlJ3JlIGRyb3BwaW5nIG5vbi16ZXJvIGJ5dGVzIGZyb20gdGhlIGVuZCwgc3RvcCBsZW5ndGgtdHJhY2tpbmcKKyAgICAvLyBieSBzZXR0aW5nIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyBTdHJlYW1SZWYgdG8gYW4gZXhwbGljaXQgdmFsdWUuCisgICAgaWYgKCFSZXN1bHQuTGVuZ3RoLmhhc1ZhbHVlKCkpCisgICAgICBSZXN1bHQuTGVuZ3RoID0gZ2V0TGVuZ3RoKCk7CisKKyAgICAqUmVzdWx0Lkxlbmd0aCAtPSBOOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICAvLy8gUmV0dXJuIGEgbmV3IEJpbmFyeVN0cmVhbVJlZiB3aXRoIG9ubHkgdGhlIGZpcnN0IFxwIE4gZWxlbWVudHMgcmVtYWluaW5nLgorICBSZWZUeXBlIGtlZXBfZnJvbnQodWludDMyX3QgTikgY29uc3QgeworICAgIGFzc2VydChOIDw9IGdldExlbmd0aCgpKTsKKyAgICByZXR1cm4gZHJvcF9iYWNrKGdldExlbmd0aCgpIC0gTik7CisgIH0KKworICAvLy8gUmV0dXJuIGEgbmV3IEJpbmFyeVN0cmVhbVJlZiB3aXRoIG9ubHkgdGhlIGxhc3QgXHAgTiBlbGVtZW50cyByZW1haW5pbmcuCisgIFJlZlR5cGUga2VlcF9iYWNrKHVpbnQzMl90IE4pIGNvbnN0IHsKKyAgICBhc3NlcnQoTiA8PSBnZXRMZW5ndGgoKSk7CisgICAgcmV0dXJuIGRyb3BfZnJvbnQoZ2V0TGVuZ3RoKCkgLSBOKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSBuZXcgQmluYXJ5U3RyZWFtUmVmIHdpdGggdGhlIGZpcnN0IGFuZCBsYXN0IFxwIE4gZWxlbWVudHMKKyAgLy8vIHJlbW92ZWQuCisgIFJlZlR5cGUgZHJvcF9zeW1tZXRyaWModWludDMyX3QgTikgY29uc3QgeworICAgIHJldHVybiBkcm9wX2Zyb250KE4pLmRyb3BfYmFjayhOKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSBuZXcgQmluYXJ5U3RyZWFtUmVmIHdpdGggdGhlIGZpcnN0IFxwIE9mZnNldCBlbGVtZW50cyByZW1vdmVkLAorICAvLy8gYW5kIHJldGFpbmluZyBleGFjdGx5IFxwIExlbiBlbGVtZW50cy4KKyAgUmVmVHlwZSBzbGljZSh1aW50MzJfdCBPZmZzZXQsIHVpbnQzMl90IExlbikgY29uc3QgeworICAgIHJldHVybiBkcm9wX2Zyb250KE9mZnNldCkua2VlcF9mcm9udChMZW4pOworICB9CisKKyAgYm9vbCB2YWxpZCgpIGNvbnN0IHsgcmV0dXJuIEJvcnJvd2VkSW1wbCAhPSBudWxscHRyOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJlZlR5cGUgJk90aGVyKSBjb25zdCB7CisgICAgaWYgKEJvcnJvd2VkSW1wbCAhPSBPdGhlci5Cb3Jyb3dlZEltcGwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKFZpZXdPZmZzZXQgIT0gT3RoZXIuVmlld09mZnNldCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoTGVuZ3RoICE9IE90aGVyLkxlbmd0aCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIEVycm9yIGNoZWNrT2Zmc2V0Rm9yUmVhZCh1aW50MzJfdCBPZmZzZXQsIHVpbnQzMl90IERhdGFTaXplKSBjb25zdCB7CisgICAgaWYgKE9mZnNldCA+IGdldExlbmd0aCgpKQorICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8QmluYXJ5U3RyZWFtRXJyb3I+KHN0cmVhbV9lcnJvcl9jb2RlOjppbnZhbGlkX29mZnNldCk7CisgICAgaWYgKGdldExlbmd0aCgpIDwgRGF0YVNpemUgKyBPZmZzZXQpCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxCaW5hcnlTdHJlYW1FcnJvcj4oc3RyZWFtX2Vycm9yX2NvZGU6OnN0cmVhbV90b29fc2hvcnQpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFN0cmVhbVR5cGU+IFNoYXJlZEltcGw7CisgIFN0cmVhbVR5cGUgKkJvcnJvd2VkSW1wbCA9IG51bGxwdHI7CisgIHVpbnQzMl90IFZpZXdPZmZzZXQgPSAwOworICBPcHRpb25hbDx1aW50MzJfdD4gTGVuZ3RoOworfTsKKworLy8vIFxicmllZiBCaW5hcnlTdHJlYW1SZWYgaXMgdG8gQmluYXJ5U3RyZWFtIHdoYXQgQXJyYXlSZWYgaXMgdG8gYW4gQXJyYXkuICBJdAorLy8vIHByb3ZpZGVzIGNvcHktc2VtYW50aWNzIGFuZCByZWFkIG9ubHkgYWNjZXNzIHRvIGEgIndpbmRvdyIgb2YgdGhlIHVuZGVybHlpbmcKKy8vLyBCaW5hcnlTdHJlYW0uIE5vdGUgdGhhdCBCaW5hcnlTdHJlYW1SZWYgaXMgKm5vdCogYSBCaW5hcnlTdHJlYW0uICBUaGF0IGlzIHRvCisvLy8gc2F5LCBpdCBkb2VzIG5vdCBpbmhlcml0IGFuZCBvdmVycmlkZSB0aGUgbWV0aG9kcyBvZiBCaW5hcnlTdHJlYW0uICBJbgorLy8vIGdlbmVyYWwsIHlvdSBzaG91bGQgbm90IHBhc3MgYXJvdW5kIHBvaW50ZXJzIG9yIHJlZmVyZW5jZXMgdG8gQmluYXJ5U3RyZWFtcworLy8vIGFuZCB1c2UgaW5oZXJpdGFuY2UgdG8gYWNoaWV2ZSBwb2x5bW9ycGhpc20uICBJbnN0ZWFkLCB5b3Ugc2hvdWxkIHBhc3MKKy8vLyBhcm91bmQgQmluYXJ5U3RyZWFtUmVmcyBieSB2YWx1ZSBhbmQgYWNoaWV2ZSBwb2x5bW9ycGhpc20gdGhhdCB3YXkuCitjbGFzcyBCaW5hcnlTdHJlYW1SZWYKKyAgICA6IHB1YmxpYyBCaW5hcnlTdHJlYW1SZWZCYXNlPEJpbmFyeVN0cmVhbVJlZiwgQmluYXJ5U3RyZWFtPiB7CisgIGZyaWVuZCBCaW5hcnlTdHJlYW1SZWZCYXNlPEJpbmFyeVN0cmVhbVJlZiwgQmluYXJ5U3RyZWFtPjsKKyAgZnJpZW5kIGNsYXNzIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmOworICBCaW5hcnlTdHJlYW1SZWYoc3RkOjpzaGFyZWRfcHRyPEJpbmFyeVN0cmVhbT4gSW1wbCwgdWludDMyX3QgVmlld09mZnNldCwKKyAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHVpbnQzMl90PiBMZW5ndGgpCisgICAgICA6IEJpbmFyeVN0cmVhbVJlZkJhc2UoSW1wbCwgVmlld09mZnNldCwgTGVuZ3RoKSB7fQorCitwdWJsaWM6CisgIEJpbmFyeVN0cmVhbVJlZigpID0gZGVmYXVsdDsKKyAgQmluYXJ5U3RyZWFtUmVmKEJpbmFyeVN0cmVhbSAmU3RyZWFtKTsKKyAgQmluYXJ5U3RyZWFtUmVmKEJpbmFyeVN0cmVhbSAmU3RyZWFtLCB1aW50MzJfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICBPcHRpb25hbDx1aW50MzJfdD4gTGVuZ3RoKTsKKyAgZXhwbGljaXQgQmluYXJ5U3RyZWFtUmVmKEFycmF5UmVmPHVpbnQ4X3Q+IERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbik7CisgIGV4cGxpY2l0IEJpbmFyeVN0cmVhbVJlZihTdHJpbmdSZWYgRGF0YSwgbGx2bTo6c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4pOworCisgIEJpbmFyeVN0cmVhbVJlZihjb25zdCBCaW5hcnlTdHJlYW1SZWYgJk90aGVyKSA9IGRlZmF1bHQ7CisgIEJpbmFyeVN0cmVhbVJlZiAmb3BlcmF0b3I9KGNvbnN0IEJpbmFyeVN0cmVhbVJlZiAmT3RoZXIpID0gZGVmYXVsdDsKKyAgQmluYXJ5U3RyZWFtUmVmKEJpbmFyeVN0cmVhbVJlZiAmJk90aGVyKSA9IGRlZmF1bHQ7CisgIEJpbmFyeVN0cmVhbVJlZiAmb3BlcmF0b3I9KEJpbmFyeVN0cmVhbVJlZiAmJk90aGVyKSA9IGRlZmF1bHQ7CisKKyAgLy8gVXNlIEJpbmFyeVN0cmVhbVJlZi5zbGljZSgpIGluc3RlYWQuCisgIEJpbmFyeVN0cmVhbVJlZihCaW5hcnlTdHJlYW1SZWYgJlMsIHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90IExlbmd0aCkgPSBkZWxldGU7CisKKyAgLy8vIEdpdmVuIGFuIE9mZnNldCBpbnRvIHRoaXMgU3RyZWFtUmVmIGFuZCBhIFNpemUsIHJldHVybiBhIHJlZmVyZW5jZSB0byBhCisgIC8vLyBidWZmZXIgb3duZWQgYnkgdGhlIHN0cmVhbS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHN1Y2Nlc3MgZXJyb3IgY29kZSBpZiB0aGUgZW50aXJlIHJhbmdlIG9mIGRhdGEgaXMgd2l0aGluIHRoZQorICAvLy8gYm91bmRzIG9mIHRoaXMgQmluYXJ5U3RyZWFtUmVmJ3MgdmlldyBhbmQgdGhlIGltcGxlbWVudGF0aW9uIGNvdWxkIHJlYWQKKyAgLy8vIHRoZSBkYXRhLCBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgIEVycm9yIHJlYWRCeXRlcyh1aW50MzJfdCBPZmZzZXQsIHVpbnQzMl90IFNpemUsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiAmQnVmZmVyKSBjb25zdDsKKworICAvLy8gR2l2ZW4gYW4gT2Zmc2V0IGludG8gdGhpcyBCaW5hcnlTdHJlYW1SZWYsIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUKKyAgLy8vIGxhcmdlc3QgYnVmZmVyIHRoZSBzdHJlYW0gY291bGQgc3VwcG9ydCB3aXRob3V0IG5lY2Vzc2l0YXRpbmcgYSBjb3B5LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIGltcGxlbWVudGF0aW9uIGNvdWxkIHJlYWQgdGhlIGRhdGEsCisgIC8vLyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgIEVycm9yIHJlYWRMb25nZXN0Q29udGlndW91c0NodW5rKHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gJkJ1ZmZlcikgY29uc3Q7Cit9OworCitzdHJ1Y3QgQmluYXJ5U3Vic3RyZWFtUmVmIHsKKyAgdWludDMyX3QgT2Zmc2V0OyAgICAgICAgICAgIC8vIE9mZnNldCBpbiB0aGUgcGFyZW50IHN0cmVhbQorICBCaW5hcnlTdHJlYW1SZWYgU3RyZWFtRGF0YTsgLy8gU3RyZWFtIERhdGEKKworICBCaW5hcnlTdWJzdHJlYW1SZWYgc2xpY2UodWludDMyX3QgT2ZmLCB1aW50MzJfdCBTaXplKSBjb25zdCB7CisgICAgQmluYXJ5U3RyZWFtUmVmIFN1YlN1YiA9IFN0cmVhbURhdGEuc2xpY2UoT2ZmLCBTaXplKTsKKyAgICByZXR1cm4ge09mZiArIE9mZnNldCwgU3ViU3VifTsKKyAgfQorICBCaW5hcnlTdWJzdHJlYW1SZWYgZHJvcF9mcm9udCh1aW50MzJfdCBOKSBjb25zdCB7CisgICAgcmV0dXJuIHNsaWNlKE4sIHNpemUoKSAtIE4pOworICB9CisgIEJpbmFyeVN1YnN0cmVhbVJlZiBrZWVwX2Zyb250KHVpbnQzMl90IE4pIGNvbnN0IHsgcmV0dXJuIHNsaWNlKDAsIE4pOyB9CisKKyAgc3RkOjpwYWlyPEJpbmFyeVN1YnN0cmVhbVJlZiwgQmluYXJ5U3Vic3RyZWFtUmVmPgorICBzcGxpdCh1aW50MzJfdCBPZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoa2VlcF9mcm9udChPZmZzZXQpLCBkcm9wX2Zyb250KE9mZnNldCkpOworICB9CisKKyAgdWludDMyX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFN0cmVhbURhdGEuZ2V0TGVuZ3RoKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9Cit9OworCitjbGFzcyBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZgorICAgIDogcHVibGljIEJpbmFyeVN0cmVhbVJlZkJhc2U8V3JpdGFibGVCaW5hcnlTdHJlYW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZUJpbmFyeVN0cmVhbT4geworICBmcmllbmQgQmluYXJ5U3RyZWFtUmVmQmFzZTxXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiwgV3JpdGFibGVCaW5hcnlTdHJlYW0+OworICBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZihzdGQ6OnNoYXJlZF9wdHI8V3JpdGFibGVCaW5hcnlTdHJlYW0+IEltcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFZpZXdPZmZzZXQsIE9wdGlvbmFsPHVpbnQzMl90PiBMZW5ndGgpCisgICAgICA6IEJpbmFyeVN0cmVhbVJlZkJhc2UoSW1wbCwgVmlld09mZnNldCwgTGVuZ3RoKSB7fQorCisgIEVycm9yIGNoZWNrT2Zmc2V0Rm9yV3JpdGUodWludDMyX3QgT2Zmc2V0LCB1aW50MzJfdCBEYXRhU2l6ZSkgY29uc3QgeworICAgIGlmICghKEJvcnJvd2VkSW1wbC0+Z2V0RmxhZ3MoKSAmIEJTRl9BcHBlbmQpKQorICAgICAgcmV0dXJuIGNoZWNrT2Zmc2V0Rm9yUmVhZChPZmZzZXQsIERhdGFTaXplKTsKKworICAgIGlmIChPZmZzZXQgPiBnZXRMZW5ndGgoKSkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPEJpbmFyeVN0cmVhbUVycm9yPihzdHJlYW1fZXJyb3JfY29kZTo6aW52YWxpZF9vZmZzZXQpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKK3B1YmxpYzoKKyAgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYoKSA9IGRlZmF1bHQ7CisgIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmKFdyaXRhYmxlQmluYXJ5U3RyZWFtICZTdHJlYW0pOworICBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZihXcml0YWJsZUJpbmFyeVN0cmVhbSAmU3RyZWFtLCB1aW50MzJfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHVpbnQzMl90PiBMZW5ndGgpOworICBleHBsaWNpdCBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZihNdXRhYmxlQXJyYXlSZWY8dWludDhfdD4gRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4pOworICBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZihjb25zdCBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiAmT3RoZXIpID0gZGVmYXVsdDsKKyAgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYgJgorICBvcGVyYXRvcj0oY29uc3QgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYgJk90aGVyKSA9IGRlZmF1bHQ7CisKKyAgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYoV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYgJiZPdGhlcikgPSBkZWZhdWx0OworICBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiAmb3BlcmF0b3I9KFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmICYmT3RoZXIpID0gZGVmYXVsdDsKKworICAvLyBVc2UgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYuc2xpY2UoKSBpbnN0ZWFkLgorICBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZihXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiAmUywgdWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMZW5ndGgpID0gZGVsZXRlOworCisgIC8vLyBHaXZlbiBhbiBPZmZzZXQgaW50byB0aGlzIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmIGFuZCBzb21lIGlucHV0IGRhdGEsCisgIC8vLyB3cml0ZXMgdGhlIGRhdGEgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIHRoZSBkYXRhIGNvdWxkIGZpdCB3aXRoaW4gdGhlIHVuZGVybHlpbmcKKyAgLy8vIHN0cmVhbSBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gY291bGQgd3JpdGUgdGhlCisgIC8vLyBkYXRhLCBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgIEVycm9yIHdyaXRlQnl0ZXModWludDMyX3QgT2Zmc2V0LCBBcnJheVJlZjx1aW50OF90PiBEYXRhKSBjb25zdDsKKworICAvLy8gQ29udmVyIHRoaXMgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYgdG8gYSByZWFkLW9ubHkgQmluYXJ5U3RyZWFtUmVmLgorICBvcGVyYXRvciBCaW5hcnlTdHJlYW1SZWYoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEZvciBidWZmZXJlZCBzdHJlYW1zLCBjb21taXRzIGNoYW5nZXMgdG8gdGhlIGJhY2tpbmcgc3RvcmUuCisgIEVycm9yIGNvbW1pdCgpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9CSU5BUllTVFJFQU1SRUZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVdyaXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMWRiODcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtV3JpdGVyLmgKQEAgLTAsMCArMSwxODMgQEAKKy8vPT09LSBCaW5hcnlTdHJlYW1Xcml0ZXIuaCAtIFdyaXRlcyBvYmplY3RzIHRvIGEgQmluYXJ5U3RyZWFtIC0tLSotIEMrKy0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0JJTkFSWVNUUkVBTVdSSVRFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9CSU5BUllTVFJFQU1XUklURVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtQXJyYXkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gXGJyaWVmIFByb3ZpZGVzIHdyaXRlIG9ubHkgYWNjZXNzIHRvIGEgc3ViY2xhc3Mgb2YgYFdyaXRhYmxlQmluYXJ5U3RyZWFtYC4KKy8vLyBQcm92aWRlcyBib3VuZHMgY2hlY2tpbmcgYW5kIGhlbHBlcnMgZm9yIHdyaXRpbmcgY2VydGFpbiBjb21tb24gZGF0YSB0eXBlcworLy8vIHN1Y2ggYXMgbnVsbC10ZXJtaW5hdGVkIHN0cmluZ3MsIGludGVnZXJzIGluIHZhcmlvdXMgZmxhdm9ycyBvZiBlbmRpYW5uZXNzLAorLy8vIGV0Yy4gIENhbiBiZSBzdWJjbGFzc2VkIHRvIHByb3ZpZGUgcmVhZGluZyBhbmQgd3JpdGluZyBvZiBjdXN0b20gZGF0YXR5cGVzLAorLy8vIGFsdGhvdWdoIG5vIG1ldGhvZHMgYXJlIG92ZXJyaWRhYmxlLgorY2xhc3MgQmluYXJ5U3RyZWFtV3JpdGVyIHsKK3B1YmxpYzoKKyAgQmluYXJ5U3RyZWFtV3JpdGVyKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBCaW5hcnlTdHJlYW1Xcml0ZXIoV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYgUmVmKTsKKyAgZXhwbGljaXQgQmluYXJ5U3RyZWFtV3JpdGVyKFdyaXRhYmxlQmluYXJ5U3RyZWFtICZTdHJlYW0pOworICBleHBsaWNpdCBCaW5hcnlTdHJlYW1Xcml0ZXIoTXV0YWJsZUFycmF5UmVmPHVpbnQ4X3Q+IERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbik7CisKKyAgQmluYXJ5U3RyZWFtV3JpdGVyKGNvbnN0IEJpbmFyeVN0cmVhbVdyaXRlciAmT3RoZXIpCisgICAgICA6IFN0cmVhbShPdGhlci5TdHJlYW0pLCBPZmZzZXQoT3RoZXIuT2Zmc2V0KSB7fQorCisgIEJpbmFyeVN0cmVhbVdyaXRlciAmb3BlcmF0b3I9KGNvbnN0IEJpbmFyeVN0cmVhbVdyaXRlciAmT3RoZXIpIHsKKyAgICBTdHJlYW0gPSBPdGhlci5TdHJlYW07CisgICAgT2Zmc2V0ID0gT3RoZXIuT2Zmc2V0OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZpcnR1YWwgfkJpbmFyeVN0cmVhbVdyaXRlcigpIHt9CisKKyAgLy8vIFdyaXRlIHRoZSBieXRlcyBzcGVjaWZpZWQgaW4gXHAgQnVmZmVyIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgLy8vIE9uIHN1Y2Nlc3MsIHVwZGF0ZXMgdGhlIG9mZnNldCBzbyB0aGF0IHN1YnNlcXVlbnQgd3JpdGVzIHdpbGwgb2NjdXIKKyAgLy8vIGF0IHRoZSBuZXh0IHVud3JpdHRlbiBwb3NpdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHN1Y2Nlc3MgZXJyb3IgY29kZSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4sCisgIC8vLyBvdGhlcndpc2UgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICBFcnJvciB3cml0ZUJ5dGVzKEFycmF5UmVmPHVpbnQ4X3Q+IEJ1ZmZlcik7CisKKyAgLy8vIFdyaXRlIHRoZSBpbnRlZ2VyIFxwIFZhbHVlIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBpbiB0aGUKKyAgLy8vIHNwZWNpZmllZCBlbmRpYW5uZXNzLiAgT24gc3VjY2VzcywgdXBkYXRlcyB0aGUgb2Zmc2V0IHNvIHRoYXQKKyAgLy8vIHN1YnNlcXVlbnQgd3JpdGVzIG9jY3VyIGF0IHRoZSBuZXh0IHVud3JpdHRlbiBwb3NpdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHN1Y2Nlc3MgZXJyb3IgY29kZSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4sCisgIC8vLyBvdGhlcndpc2UgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRXJyb3Igd3JpdGVJbnRlZ2VyKFQgVmFsdWUpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjYWxsIHdyaXRlSW50ZWdlciB3aXRoIG5vbi1pbnRlZ3JhbCB2YWx1ZSEiKTsKKyAgICB1aW50OF90IEJ1ZmZlcltzaXplb2YoVCldOworICAgIGxsdm06OnN1cHBvcnQ6OmVuZGlhbjo6d3JpdGU8VCwgbGx2bTo6c3VwcG9ydDo6dW5hbGlnbmVkPigKKyAgICAgICAgQnVmZmVyLCBWYWx1ZSwgU3RyZWFtLmdldEVuZGlhbigpKTsKKyAgICByZXR1cm4gd3JpdGVCeXRlcyhCdWZmZXIpOworICB9CisKKyAgLy8vIFNpbWlsYXIgdG8gd3JpdGVJbnRlZ2VyCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBFcnJvciB3cml0ZUVudW0oVCBOdW0pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNhbGwgd3JpdGVFbnVtIHdpdGggbm9uLUVudW0gdHlwZSIpOworCisgICAgdXNpbmcgVSA9IHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlOworICAgIHJldHVybiB3cml0ZUludGVnZXI8VT4oc3RhdGljX2Nhc3Q8VT4oTnVtKSk7CisgIH0KKworICAvLy8gV3JpdGUgdGhlIHN0cmluZyBccCBTdHIgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGZvbGxvd2VkIGJ5IGEgbnVsbAorICAvLy8gdGVybWluYXRvci4gIE9uIHN1Y2Nlc3MsIHVwZGF0ZXMgdGhlIG9mZnNldCBzbyB0aGF0IHN1YnNlcXVlbnQgd3JpdGVzCisgIC8vLyBvY2N1ciBhdCB0aGUgbmV4dCB1bndyaXR0ZW4gcG9zaXRpb24uICBccCBTdHIgbmVlZCBub3QgYmUgbnVsbCB0ZXJtaW5hdGVkCisgIC8vLyBvbiBpbnB1dC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHN1Y2Nlc3MgZXJyb3IgY29kZSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4sCisgIC8vLyBvdGhlcndpc2UgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICBFcnJvciB3cml0ZUNTdHJpbmcoU3RyaW5nUmVmIFN0cik7CisKKyAgLy8vIFdyaXRlIHRoZSBzdHJpbmcgXHAgU3RyIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSB3aXRob3V0IGEgbnVsbAorICAvLy8gdGVybWluYXRvci4gIE9uIHN1Y2Nlc3MsIHVwZGF0ZXMgdGhlIG9mZnNldCBzbyB0aGF0IHN1YnNlcXVlbnQgd3JpdGVzCisgIC8vLyBvY2N1ciBhdCB0aGUgbmV4dCB1bndyaXR0ZW4gcG9zaXRpb24uCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSB3cml0dGVuLAorICAvLy8gb3RoZXJ3aXNlIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgRXJyb3Igd3JpdGVGaXhlZFN0cmluZyhTdHJpbmdSZWYgU3RyKTsKKworICAvLy8gRWZmaWNpZW50bHkgcmVhZHMgYWxsIGRhdGEgZnJvbSBccCBSZWYsIGFuZCB3cml0ZXMgaXQgdG8gdGhpcyBzdHJlYW0uCisgIC8vLyBUaGlzIG9wZXJhdGlvbiB3aWxsIG5vdCBpbnZva2UgYW55IGNvcGllcyBvZiB0aGUgc291cmNlIGRhdGEsIHJlZ2FyZGxlc3MKKyAgLy8vIG9mIHRoZSBzb3VyY2Ugc3RyZWFtJ3MgaW1wbGVtZW50YXRpb24uCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSB3cml0dGVuLAorICAvLy8gb3RoZXJ3aXNlIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgRXJyb3Igd3JpdGVTdHJlYW1SZWYoQmluYXJ5U3RyZWFtUmVmIFJlZik7CisKKyAgLy8vIEVmZmljaWVudGx5IHJlYWRzIFxwIFNpemUgYnl0ZXMgZnJvbSBccCBSZWYsIGFuZCB3cml0ZXMgaXQgdG8gdGhpcyBzdHJlYW0uCisgIC8vLyBUaGlzIG9wZXJhdGlvbiB3aWxsIG5vdCBpbnZva2UgYW55IGNvcGllcyBvZiB0aGUgc291cmNlIGRhdGEsIHJlZ2FyZGxlc3MKKyAgLy8vIG9mIHRoZSBzb3VyY2Ugc3RyZWFtJ3MgaW1wbGVtZW50YXRpb24uCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSB3cml0dGVuLAorICAvLy8gb3RoZXJ3aXNlIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgRXJyb3Igd3JpdGVTdHJlYW1SZWYoQmluYXJ5U3RyZWFtUmVmIFJlZiwgdWludDMyX3QgU2l6ZSk7CisKKyAgLy8vIFdyaXRlcyB0aGUgb2JqZWN0IFxwIE9iaiB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0sIGFzIGlmIGJ5IHVzaW5nIG1lbWNweS4KKyAgLy8vIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gZW5zdXJlIHRoYXQgdHlwZSBvZiBccCBPYmogY2FuIGJlIHNhZmVseSBjb3BpZWQKKyAgLy8vIGluIHRoaXMgZmFzaGlvbiwgYXMgbm8gY2hlY2tzIGFyZSBtYWRlIHRvIGVuc3VyZSB0aGF0IHRoaXMgaXMgc2FmZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHN1Y2Nlc3MgZXJyb3IgY29kZSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4sCisgIC8vLyBvdGhlcndpc2UgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRXJyb3Igd3JpdGVPYmplY3QoY29uc3QgVCAmT2JqKSB7CisgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19wb2ludGVyPFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJ3cml0ZU9iamVjdCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBwb2ludGVycywgdG8gd3JpdGUgIgorICAgICAgICAgICAgICAgICAgInRoZSBwb2ludGVkLXRvIHZhbHVlIGRlcmVmZXJlbmNlIHRoZSBwb2ludGVyIGJlZm9yZSBjYWxsaW5nICIKKyAgICAgICAgICAgICAgICAgICJ3cml0ZU9iamVjdCIpOworICAgIHJldHVybiB3cml0ZUJ5dGVzKAorICAgICAgICBBcnJheVJlZjx1aW50OF90PihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oJk9iaiksIHNpemVvZihUKSkpOworICB9CisKKyAgLy8vIFdyaXRlcyBhbiBhcnJheSBvZiBvYmplY3RzIG9mIHR5cGUgVCB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0sIGFzIGlmIGJ5CisgIC8vLyB1c2luZyBtZW1jcHkuICBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGVuc3VyZSB0aGF0IHR5cGUgb2YgXHAgT2JqIGNhbgorICAvLy8gYmUgc2FmZWx5IGNvcGllZCBpbiB0aGlzIGZhc2hpb24sIGFzIG5vIGNoZWNrcyBhcmUgbWFkZSB0byBlbnN1cmUgdGhhdAorICAvLy8gdGhpcyBpcyBzYWZlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiwKKyAgLy8vIG90aGVyd2lzZSByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBFcnJvciB3cml0ZUFycmF5KEFycmF5UmVmPFQ+IEFycmF5KSB7CisgICAgaWYgKEFycmF5LmVtcHR5KCkpCisgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICBpZiAoQXJyYXkuc2l6ZSgpID4gVUlOVDMyX01BWCAvIHNpemVvZihUKSkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPEJpbmFyeVN0cmVhbUVycm9yPigKKyAgICAgICAgICBzdHJlYW1fZXJyb3JfY29kZTo6aW52YWxpZF9hcnJheV9zaXplKTsKKworICAgIHJldHVybiB3cml0ZUJ5dGVzKAorICAgICAgICBBcnJheVJlZjx1aW50OF90PihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oQXJyYXkuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuc2l6ZSgpICogc2l6ZW9mKFQpKSk7CisgIH0KKworICAvLy8gV3JpdGVzIGFsbCBkYXRhIGZyb20gdGhlIGFycmF5IFxwIEFycmF5IHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHN1Y2Nlc3MgZXJyb3IgY29kZSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4sCisgIC8vLyBvdGhlcndpc2UgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KKyAgRXJyb3Igd3JpdGVBcnJheShWYXJTdHJlYW1BcnJheTxULCBVPiBBcnJheSkgeworICAgIHJldHVybiB3cml0ZVN0cmVhbVJlZihBcnJheS5nZXRVbmRlcmx5aW5nU3RyZWFtKCkpOworICB9CisKKyAgLy8vIFdyaXRlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGUgYXJyYXkgXHAgQXJyYXkgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiwKKyAgLy8vIG90aGVyd2lzZSByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBFcnJvciB3cml0ZUFycmF5KEZpeGVkU3RyZWFtQXJyYXk8VD4gQXJyYXkpIHsKKyAgICByZXR1cm4gd3JpdGVTdHJlYW1SZWYoQXJyYXkuZ2V0VW5kZXJseWluZ1N0cmVhbSgpKTsKKyAgfQorCisgIC8vLyBTcGxpdHMgdGhlIFdyaXRlciBpbnRvIHR3byBXcml0ZXJzIGF0IGEgZ2l2ZW4gb2Zmc2V0LgorICBzdGQ6OnBhaXI8QmluYXJ5U3RyZWFtV3JpdGVyLCBCaW5hcnlTdHJlYW1Xcml0ZXI+IHNwbGl0KHVpbnQzMl90IE9mZikgY29uc3Q7CisKKyAgdm9pZCBzZXRPZmZzZXQodWludDMyX3QgT2ZmKSB7IE9mZnNldCA9IE9mZjsgfQorICB1aW50MzJfdCBnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBPZmZzZXQ7IH0KKyAgdWludDMyX3QgZ2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gU3RyZWFtLmdldExlbmd0aCgpOyB9CisgIHVpbnQzMl90IGJ5dGVzUmVtYWluaW5nKCkgY29uc3QgeyByZXR1cm4gZ2V0TGVuZ3RoKCkgLSBnZXRPZmZzZXQoKTsgfQorICBFcnJvciBwYWRUb0FsaWdubWVudCh1aW50MzJfdCBBbGlnbik7CisKK3Byb3RlY3RlZDoKKyAgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYgU3RyZWFtOworICB1aW50MzJfdCBPZmZzZXQgPSAwOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9CSU5BUllTVFJFQU1XUklURVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Jsb2NrRnJlcXVlbmN5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmxvY2tGcmVxdWVuY3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTc1Y2JkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Jsb2NrRnJlcXVlbmN5LmgKQEAgLTAsMCArMSw4MiBAQAorLy89PT0tLS0tLS0tLSBCbG9ja0ZyZXF1ZW5jeS5oIC0gQmxvY2sgRnJlcXVlbmN5IFdyYXBwZXIgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBCbG9jayBGcmVxdWVuY3kgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQkxPQ0tGUkVRVUVOQ1lfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQkxPQ0tGUkVRVUVOQ1lfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JyYW5jaFByb2JhYmlsaXR5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgQmxvY2sgRnJlcXVlbmN5IGFzIGEgNjQtYml0IHZhbHVlLgorY2xhc3MgQmxvY2tGcmVxdWVuY3kgeworICB1aW50NjRfdCBGcmVxdWVuY3k7CisKK3B1YmxpYzoKKyAgQmxvY2tGcmVxdWVuY3kodWludDY0X3QgRnJlcSA9IDApIDogRnJlcXVlbmN5KEZyZXEpIHsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbWF4aW11bSBwb3NzaWJsZSBmcmVxdWVuY3ksIHRoZSBzYXR1cmF0aW9uIHZhbHVlLgorICBzdGF0aWMgdWludDY0X3QgZ2V0TWF4RnJlcXVlbmN5KCkgeyByZXR1cm4gLTFVTEw7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGZyZXF1ZW5jeSBhcyBhIGZpeHBvaW50IG51bWJlciBzY2FsZWQgYnkgdGhlIGVudHJ5CisgIC8vLyBmcmVxdWVuY3kuCisgIHVpbnQ2NF90IGdldEZyZXF1ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIEZyZXF1ZW5jeTsgfQorCisgIC8vLyBcYnJpZWYgTXVsdGlwbGllcyB3aXRoIGEgYnJhbmNoIHByb2JhYmlsaXR5LiBUaGUgY29tcHV0YXRpb24gd2lsbCBuZXZlcgorICAvLy8gb3ZlcmZsb3cuCisgIEJsb2NrRnJlcXVlbmN5ICZvcGVyYXRvcio9KEJyYW5jaFByb2JhYmlsaXR5IFByb2IpOworICBCbG9ja0ZyZXF1ZW5jeSBvcGVyYXRvciooQnJhbmNoUHJvYmFiaWxpdHkgUHJvYikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEaXZpZGUgYnkgYSBub24temVybyBicmFuY2ggcHJvYmFiaWxpdHkgdXNpbmcgc2F0dXJhdGluZworICAvLy8gYXJpdGhtZXRpYy4KKyAgQmxvY2tGcmVxdWVuY3kgJm9wZXJhdG9yLz0oQnJhbmNoUHJvYmFiaWxpdHkgUHJvYik7CisgIEJsb2NrRnJlcXVlbmN5IG9wZXJhdG9yLyhCcmFuY2hQcm9iYWJpbGl0eSBQcm9iKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEFkZHMgYW5vdGhlciBibG9jayBmcmVxdWVuY3kgdXNpbmcgc2F0dXJhdGluZyBhcml0aG1ldGljLgorICBCbG9ja0ZyZXF1ZW5jeSAmb3BlcmF0b3IrPShCbG9ja0ZyZXF1ZW5jeSBGcmVxKTsKKyAgQmxvY2tGcmVxdWVuY3kgb3BlcmF0b3IrKEJsb2NrRnJlcXVlbmN5IEZyZXEpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU3VidHJhY3RzIGFub3RoZXIgYmxvY2sgZnJlcXVlbmN5IHVzaW5nIHNhdHVyYXRpbmcgYXJpdGhtZXRpYy4KKyAgQmxvY2tGcmVxdWVuY3kgJm9wZXJhdG9yLT0oQmxvY2tGcmVxdWVuY3kgRnJlcSk7CisgIEJsb2NrRnJlcXVlbmN5IG9wZXJhdG9yLShCbG9ja0ZyZXF1ZW5jeSBGcmVxKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFNoaWZ0IGJsb2NrIGZyZXF1ZW5jeSB0byB0aGUgcmlnaHQgYnkgY291bnQgZGlnaXRzIHNhdHVyYXRpbmcgdG8gMS4KKyAgQmxvY2tGcmVxdWVuY3kgJm9wZXJhdG9yPj49KGNvbnN0IHVuc2lnbmVkIGNvdW50KTsKKworICBib29sIG9wZXJhdG9yPChCbG9ja0ZyZXF1ZW5jeSBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRnJlcXVlbmN5IDwgUkhTLkZyZXF1ZW5jeTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I8PShCbG9ja0ZyZXF1ZW5jeSBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRnJlcXVlbmN5IDw9IFJIUy5GcmVxdWVuY3k7CisgIH0KKworICBib29sIG9wZXJhdG9yPihCbG9ja0ZyZXF1ZW5jeSBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRnJlcXVlbmN5ID4gUkhTLkZyZXF1ZW5jeTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I+PShCbG9ja0ZyZXF1ZW5jeSBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRnJlcXVlbmN5ID49IFJIUy5GcmVxdWVuY3k7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oQmxvY2tGcmVxdWVuY3kgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEZyZXF1ZW5jeSA9PSBSSFMuRnJlcXVlbmN5OworICB9Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0JyYW5jaFByb2JhYmlsaXR5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQnJhbmNoUHJvYmFiaWxpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDAzZDdmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0JyYW5jaFByb2JhYmlsaXR5LmgKQEAgLTAsMCArMSwyMzEgQEAKKy8vPT09LSBCcmFuY2hQcm9iYWJpbGl0eS5oIC0gQnJhbmNoIFByb2JhYmlsaXR5IFdyYXBwZXIgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVmaW5pdGlvbiBvZiBCcmFuY2hQcm9iYWJpbGl0eSBzaGFyZWQgYnkgSVIgYW5kIE1hY2hpbmUgSW5zdHJ1Y3Rpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0JSQU5DSFBST0JBQklMSVRZX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0JSQU5DSFBST0JBQklMSVRZX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPG51bWVyaWM+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBCcmFuY2ggUHJvYmFiaWxpdHkgYXMgYSBub24tbmVnYXRpdmUgZnJhY3Rpb24gdGhhdCBpcworLy8gbm8gZ3JlYXRlciB0aGFuIDEuIEl0IHVzZXMgYSBmaXhlZC1wb2ludC1saWtlIGltcGxlbWVudGF0aW9uLCBpbiB3aGljaCB0aGUKKy8vIGRlbm9taW5hdG9yIGlzIGFsd2F5cyBhIGNvbnN0YW50IHZhbHVlIChoZXJlIHdlIHVzZSAxPDwzMSBmb3IgbWF4aW11bQorLy8gcHJlY2lzaW9uKS4KK2NsYXNzIEJyYW5jaFByb2JhYmlsaXR5IHsKKyAgLy8gTnVtZXJhdG9yCisgIHVpbnQzMl90IE47CisKKyAgLy8gRGVub21pbmF0b3IsIHdoaWNoIGlzIGEgY29uc3RhbnQgdmFsdWUuCisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBEID0gMXUgPDwgMzE7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBVbmtub3duTiA9IFVJTlQzMl9NQVg7CisKKyAgLy8gQ29uc3RydWN0IGEgQnJhbmNoUHJvYmFiaWxpdHkgd2l0aCBvbmx5IG51bWVyYXRvciBhc3N1bWluZyB0aGUgZGVub21pbmF0b3IKKyAgLy8gaXMgMTw8MzEuIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KKyAgZXhwbGljaXQgQnJhbmNoUHJvYmFiaWxpdHkodWludDMyX3QgbikgOiBOKG4pIHt9CisKK3B1YmxpYzoKKyAgQnJhbmNoUHJvYmFiaWxpdHkoKSA6IE4oVW5rbm93bk4pIHt9CisgIEJyYW5jaFByb2JhYmlsaXR5KHVpbnQzMl90IE51bWVyYXRvciwgdWludDMyX3QgRGVub21pbmF0b3IpOworCisgIGJvb2wgaXNaZXJvKCkgY29uc3QgeyByZXR1cm4gTiA9PSAwOyB9CisgIGJvb2wgaXNVbmtub3duKCkgY29uc3QgeyByZXR1cm4gTiA9PSBVbmtub3duTjsgfQorCisgIHN0YXRpYyBCcmFuY2hQcm9iYWJpbGl0eSBnZXRaZXJvKCkgeyByZXR1cm4gQnJhbmNoUHJvYmFiaWxpdHkoMCk7IH0KKyAgc3RhdGljIEJyYW5jaFByb2JhYmlsaXR5IGdldE9uZSgpIHsgcmV0dXJuIEJyYW5jaFByb2JhYmlsaXR5KEQpOyB9CisgIHN0YXRpYyBCcmFuY2hQcm9iYWJpbGl0eSBnZXRVbmtub3duKCkgeyByZXR1cm4gQnJhbmNoUHJvYmFiaWxpdHkoVW5rbm93bk4pOyB9CisgIC8vIENyZWF0ZSBhIEJyYW5jaFByb2JhYmlsaXR5IG9iamVjdCB3aXRoIHRoZSBnaXZlbiBudW1lcmF0b3IgYW5kIDE8PDMxCisgIC8vIGFzIGRlbm9taW5hdG9yLgorICBzdGF0aWMgQnJhbmNoUHJvYmFiaWxpdHkgZ2V0UmF3KHVpbnQzMl90IE4pIHsgcmV0dXJuIEJyYW5jaFByb2JhYmlsaXR5KE4pOyB9CisgIC8vIENyZWF0ZSBhIEJyYW5jaFByb2JhYmlsaXR5IG9iamVjdCBmcm9tIDY0LWJpdCBpbnRlZ2Vycy4KKyAgc3RhdGljIEJyYW5jaFByb2JhYmlsaXR5IGdldEJyYW5jaFByb2JhYmlsaXR5KHVpbnQ2NF90IE51bWVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IERlbm9taW5hdG9yKTsKKworICAvLyBOb3JtYWxpemUgZ2l2ZW4gcHJvYmFiaWx0aWVzIHNvIHRoYXQgdGhlIHN1bSBvZiB0aGVtIGJlY29tZXMgYXBwcm94aW1hdGUKKyAgLy8gb25lLgorICB0ZW1wbGF0ZSA8Y2xhc3MgUHJvYmFiaWxpdHlJdGVyPgorICBzdGF0aWMgdm9pZCBub3JtYWxpemVQcm9iYWJpbGl0aWVzKFByb2JhYmlsaXR5SXRlciBCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iYWJpbGl0eUl0ZXIgRW5kKTsKKworICB1aW50MzJfdCBnZXROdW1lcmF0b3IoKSBjb25zdCB7IHJldHVybiBOOyB9CisgIHN0YXRpYyB1aW50MzJfdCBnZXREZW5vbWluYXRvcigpIHsgcmV0dXJuIEQ7IH0KKworICAvLyBSZXR1cm4gKDEgLSBQcm9iYWJpbGl0eSkuCisgIEJyYW5jaFByb2JhYmlsaXR5IGdldENvbXBsKCkgY29uc3QgeyByZXR1cm4gQnJhbmNoUHJvYmFiaWxpdHkoRCAtIE4pOyB9CisKKyAgcmF3X29zdHJlYW0gJnByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTY2FsZSBhIGxhcmdlIGludGVnZXIuCisgIC8vLworICAvLy8gU2NhbGVzIFxjIE51bS4gIEd1YXJhbnRlZXMgZnVsbCBwcmVjaXNpb24uICBSZXR1cm5zIHRoZSBmbG9vciBvZiB0aGUKKyAgLy8vIHJlc3VsdC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFxjIE51bSB0aW1lcyBcYyB0aGlzLgorICB1aW50NjRfdCBzY2FsZSh1aW50NjRfdCBOdW0pIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU2NhbGUgYSBsYXJnZSBpbnRlZ2VyIGJ5IHRoZSBpbnZlcnNlLgorICAvLy8KKyAgLy8vIFNjYWxlcyBcYyBOdW0gYnkgdGhlIGludmVyc2Ugb2YgXGMgdGhpcy4gIEd1YXJhbnRlZXMgZnVsbCBwcmVjaXNpb24uCisgIC8vLyBSZXR1cm5zIHRoZSBmbG9vciBvZiB0aGUgcmVzdWx0LgorICAvLy8KKyAgLy8vIFxyZXR1cm4gXGMgTnVtIGRpdmlkZWQgYnkgXGMgdGhpcy4KKyAgdWludDY0X3Qgc2NhbGVCeUludmVyc2UodWludDY0X3QgTnVtKSBjb25zdDsKKworICBCcmFuY2hQcm9iYWJpbGl0eSAmb3BlcmF0b3IrPShCcmFuY2hQcm9iYWJpbGl0eSBSSFMpIHsKKyAgICBhc3NlcnQoTiAhPSBVbmtub3duTiAmJiBSSFMuTiAhPSBVbmtub3duTiAmJgorICAgICAgICAgICAiVW5rbm93biBwcm9iYWJpbGl0eSBjYW5ub3QgcGFydGljaXBhdGUgaW4gYXJpdGhtZXRpY3MuIik7CisgICAgLy8gU2F0dXJhdGUgdGhlIHJlc3VsdCBpbiBjYXNlIG9mIG92ZXJmbG93LgorICAgIE4gPSAodWludDY0X3QoTikgKyBSSFMuTiA+IEQpID8gRCA6IE4gKyBSSFMuTjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBCcmFuY2hQcm9iYWJpbGl0eSAmb3BlcmF0b3ItPShCcmFuY2hQcm9iYWJpbGl0eSBSSFMpIHsKKyAgICBhc3NlcnQoTiAhPSBVbmtub3duTiAmJiBSSFMuTiAhPSBVbmtub3duTiAmJgorICAgICAgICAgICAiVW5rbm93biBwcm9iYWJpbGl0eSBjYW5ub3QgcGFydGljaXBhdGUgaW4gYXJpdGhtZXRpY3MuIik7CisgICAgLy8gU2F0dXJhdGUgdGhlIHJlc3VsdCBpbiBjYXNlIG9mIHVuZGVyZmxvdy4KKyAgICBOID0gTiA8IFJIUy5OID8gMCA6IE4gLSBSSFMuTjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBCcmFuY2hQcm9iYWJpbGl0eSAmb3BlcmF0b3IqPShCcmFuY2hQcm9iYWJpbGl0eSBSSFMpIHsKKyAgICBhc3NlcnQoTiAhPSBVbmtub3duTiAmJiBSSFMuTiAhPSBVbmtub3duTiAmJgorICAgICAgICAgICAiVW5rbm93biBwcm9iYWJpbGl0eSBjYW5ub3QgcGFydGljaXBhdGUgaW4gYXJpdGhtZXRpY3MuIik7CisgICAgTiA9IChzdGF0aWNfY2FzdDx1aW50NjRfdD4oTikgKiBSSFMuTiArIEQgLyAyKSAvIEQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQnJhbmNoUHJvYmFiaWxpdHkgJm9wZXJhdG9yKj0odWludDMyX3QgUkhTKSB7CisgICAgYXNzZXJ0KE4gIT0gVW5rbm93bk4gJiYKKyAgICAgICAgICAgIlVua25vd24gcHJvYmFiaWxpdHkgY2Fubm90IHBhcnRpY2lwYXRlIGluIGFyaXRobWV0aWNzLiIpOworICAgIE4gPSAodWludDY0X3QoTikgKiBSSFMgPiBEKSA/IEQgOiBOICogUkhTOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEJyYW5jaFByb2JhYmlsaXR5ICZvcGVyYXRvci89KHVpbnQzMl90IFJIUykgeworICAgIGFzc2VydChOICE9IFVua25vd25OICYmCisgICAgICAgICAgICJVbmtub3duIHByb2JhYmlsaXR5IGNhbm5vdCBwYXJ0aWNpcGF0ZSBpbiBhcml0aG1ldGljcy4iKTsKKyAgICBhc3NlcnQoUkhTID4gMCAmJiAiVGhlIGRpdmlkZXIgY2Fubm90IGJlIHplcm8uIik7CisgICAgTiAvPSBSSFM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQnJhbmNoUHJvYmFiaWxpdHkgb3BlcmF0b3IrKEJyYW5jaFByb2JhYmlsaXR5IFJIUykgY29uc3QgeworICAgIEJyYW5jaFByb2JhYmlsaXR5IFByb2IoKnRoaXMpOworICAgIHJldHVybiBQcm9iICs9IFJIUzsKKyAgfQorCisgIEJyYW5jaFByb2JhYmlsaXR5IG9wZXJhdG9yLShCcmFuY2hQcm9iYWJpbGl0eSBSSFMpIGNvbnN0IHsKKyAgICBCcmFuY2hQcm9iYWJpbGl0eSBQcm9iKCp0aGlzKTsKKyAgICByZXR1cm4gUHJvYiAtPSBSSFM7CisgIH0KKworICBCcmFuY2hQcm9iYWJpbGl0eSBvcGVyYXRvciooQnJhbmNoUHJvYmFiaWxpdHkgUkhTKSBjb25zdCB7CisgICAgQnJhbmNoUHJvYmFiaWxpdHkgUHJvYigqdGhpcyk7CisgICAgcmV0dXJuIFByb2IgKj0gUkhTOworICB9CisKKyAgQnJhbmNoUHJvYmFiaWxpdHkgb3BlcmF0b3IqKHVpbnQzMl90IFJIUykgY29uc3QgeworICAgIEJyYW5jaFByb2JhYmlsaXR5IFByb2IoKnRoaXMpOworICAgIHJldHVybiBQcm9iICo9IFJIUzsKKyAgfQorCisgIEJyYW5jaFByb2JhYmlsaXR5IG9wZXJhdG9yLyh1aW50MzJfdCBSSFMpIGNvbnN0IHsKKyAgICBCcmFuY2hQcm9iYWJpbGl0eSBQcm9iKCp0aGlzKTsKKyAgICByZXR1cm4gUHJvYiAvPSBSSFM7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oQnJhbmNoUHJvYmFiaWxpdHkgUkhTKSBjb25zdCB7IHJldHVybiBOID09IFJIUy5OOyB9CisgIGJvb2wgb3BlcmF0b3IhPShCcmFuY2hQcm9iYWJpbGl0eSBSSFMpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gUkhTKTsgfQorCisgIGJvb2wgb3BlcmF0b3I8KEJyYW5jaFByb2JhYmlsaXR5IFJIUykgY29uc3QgeworICAgIGFzc2VydChOICE9IFVua25vd25OICYmIFJIUy5OICE9IFVua25vd25OICYmCisgICAgICAgICAgICJVbmtub3duIHByb2JhYmlsaXR5IGNhbm5vdCBwYXJ0aWNpcGF0ZSBpbiBjb21wYXJpc29ucy4iKTsKKyAgICByZXR1cm4gTiA8IFJIUy5OOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj4oQnJhbmNoUHJvYmFiaWxpdHkgUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KE4gIT0gVW5rbm93bk4gJiYgUkhTLk4gIT0gVW5rbm93bk4gJiYKKyAgICAgICAgICAgIlVua25vd24gcHJvYmFiaWxpdHkgY2Fubm90IHBhcnRpY2lwYXRlIGluIGNvbXBhcmlzb25zLiIpOworICAgIHJldHVybiBSSFMgPCAqdGhpczsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I8PShCcmFuY2hQcm9iYWJpbGl0eSBSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoTiAhPSBVbmtub3duTiAmJiBSSFMuTiAhPSBVbmtub3duTiAmJgorICAgICAgICAgICAiVW5rbm93biBwcm9iYWJpbGl0eSBjYW5ub3QgcGFydGljaXBhdGUgaW4gY29tcGFyaXNvbnMuIik7CisgICAgcmV0dXJuICEoUkhTIDwgKnRoaXMpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj49KEJyYW5jaFByb2JhYmlsaXR5IFJIUykgY29uc3QgeworICAgIGFzc2VydChOICE9IFVua25vd25OICYmIFJIUy5OICE9IFVua25vd25OICYmCisgICAgICAgICAgICJVbmtub3duIHByb2JhYmlsaXR5IGNhbm5vdCBwYXJ0aWNpcGF0ZSBpbiBjb21wYXJpc29ucy4iKTsKKyAgICByZXR1cm4gISgqdGhpcyA8IFJIUyk7CisgIH0KK307CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIEJyYW5jaFByb2JhYmlsaXR5IFByb2IpIHsKKyAgcmV0dXJuIFByb2IucHJpbnQoT1MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgUHJvYmFiaWxpdHlJdGVyPgordm9pZCBCcmFuY2hQcm9iYWJpbGl0eTo6bm9ybWFsaXplUHJvYmFiaWxpdGllcyhQcm9iYWJpbGl0eUl0ZXIgQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2JhYmlsaXR5SXRlciBFbmQpIHsKKyAgaWYgKEJlZ2luID09IEVuZCkKKyAgICByZXR1cm47CisKKyAgdW5zaWduZWQgVW5rbm93blByb2JDb3VudCA9IDA7CisgIHVpbnQ2NF90IFN1bSA9IHN0ZDo6YWNjdW11bGF0ZShCZWdpbiwgRW5kLCB1aW50NjRfdCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXSh1aW50NjRfdCBTLCBjb25zdCBCcmFuY2hQcm9iYWJpbGl0eSAmQlApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFCUC5pc1Vua25vd24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUyArIEJQLk47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25Qcm9iQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICBpZiAoVW5rbm93blByb2JDb3VudCA+IDApIHsKKyAgICBCcmFuY2hQcm9iYWJpbGl0eSBQcm9iRm9yVW5rbm93biA9IEJyYW5jaFByb2JhYmlsaXR5OjpnZXRaZXJvKCk7CisgICAgLy8gSWYgdGhlIHN1bSBvZiBhbGwga25vd24gcHJvYmFiaWxpdGllcyBpcyBsZXNzIHRoYW4gb25lLCBldmVubHkgZGlzdHJpYnV0ZQorICAgIC8vIHRoZSBjb21wbGVtZW50IG9mIHN1bSB0byB1bmtub3duIHByb2JhYmlsaXRpZXMuIE90aGVyd2lzZSwgc2V0IHVua25vd24KKyAgICAvLyBwcm9iYWJpbGl0aWVzIHRvIHplcm9zIGFuZCBjb250aW51ZSB0byBub3JtYWxpemUga25vd24gcHJvYmFiaWxpdGllcy4KKyAgICBpZiAoU3VtIDwgQnJhbmNoUHJvYmFiaWxpdHk6OmdldERlbm9taW5hdG9yKCkpCisgICAgICBQcm9iRm9yVW5rbm93biA9IEJyYW5jaFByb2JhYmlsaXR5OjpnZXRSYXcoCisgICAgICAgICAgKEJyYW5jaFByb2JhYmlsaXR5OjpnZXREZW5vbWluYXRvcigpIC0gU3VtKSAvIFVua25vd25Qcm9iQ291bnQpOworCisgICAgc3RkOjpyZXBsYWNlX2lmKEJlZ2luLCBFbmQsCisgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IEJyYW5jaFByb2JhYmlsaXR5ICZCUCkgeyByZXR1cm4gQlAuaXNVbmtub3duKCk7IH0sCisgICAgICAgICAgICAgICAgICAgIFByb2JGb3JVbmtub3duKTsKKworICAgIGlmIChTdW0gPD0gQnJhbmNoUHJvYmFiaWxpdHk6OmdldERlbm9taW5hdG9yKCkpCisgICAgICByZXR1cm47CisgIH0KKworICBpZiAoU3VtID09IDApIHsKKyAgICBCcmFuY2hQcm9iYWJpbGl0eSBCUCgxLCBzdGQ6OmRpc3RhbmNlKEJlZ2luLCBFbmQpKTsKKyAgICBzdGQ6OmZpbGwoQmVnaW4sIEVuZCwgQlApOworICAgIHJldHVybjsKKyAgfQorCisgIGZvciAoYXV0byBJID0gQmVnaW47IEkgIT0gRW5kOyArK0kpCisgICAgSS0+TiA9IChJLT5OICogdWludDY0X3QoRCkgKyBTdW0gLyAyKSAvIFN1bTsKK30KKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DQmluZGluZ1dyYXBwaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ0JpbmRpbmdXcmFwcGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MGY5OWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ0JpbmRpbmdXcmFwcGluZy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvQ0JpbmRpbmdXcmFwcGguaCAtIEMgSW50ZXJmYWNlIFdyYXBwaW5nIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSB3cmFwcGluZyBtYWNyb3MgZm9yIHRoZSBDIGludGVyZmFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9DQklORElOR1dSQVBQSU5HX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0NCSU5ESU5HV1JBUFBJTkdfSAorCisjaW5jbHVkZSAibGx2bS1jL1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKworI2RlZmluZSBERUZJTkVfU0lNUExFX0NPTlZFUlNJT05fRlVOQ1RJT05TKHR5LCByZWYpICAgICBcCisgIGlubGluZSB0eSAqdW53cmFwKHJlZiBQKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx0eSo+KFApOyAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIHJlZiB3cmFwKGNvbnN0IHR5ICpQKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHJlZj4oY29uc3RfY2FzdDx0eSo+KFApKTsgICBcCisgIH0KKworI2RlZmluZSBERUZJTkVfSVNBX0NPTlZFUlNJT05fRlVOQ1RJT05TKHR5LCByZWYpICAgICAgICBcCisgIERFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlModHksIHJlZikgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBUICp1bndyYXAocmVmIFApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gY2FzdDxUPih1bndyYXAoUCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgREVGSU5FX1NURENYWF9DT05WRVJTSU9OX0ZVTkNUSU9OUyh0eSwgcmVmKSAgICAgXAorICBERUZJTkVfU0lNUExFX0NPTlZFUlNJT05fRlVOQ1RJT05TKHR5LCByZWYpICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgVCAqdW53cmFwKHJlZiBQKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVCAqUSA9IChUKil1bndyYXAoUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc3NlcnQoUSAmJiAiSW52YWxpZCBjYXN0ISIpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBROyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ09NLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ09NLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJkNWE3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DT00uaApAQCAtMCwwICsxLDM2IEBACisvLz09PS0gbGx2bS9TdXBwb3J0L0NPTS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8KKy8vLyBQcm92aWRlcyBhIGxpYnJhcnkgZm9yIGFjY2Vzc2luZyBDT00gZnVuY3Rpb25hbGl0eSBvZiB0aGUgSG9zdCBPUy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQ09NX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0NPTV9ICisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzeXMgeworCitlbnVtIGNsYXNzIENPTVRocmVhZGluZ01vZGUgeyBTaW5nbGVUaHJlYWRlZCwgTXVsdGlUaHJlYWRlZCB9OworCitjbGFzcyBJbml0aWFsaXplQ09NUkFJSSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IEluaXRpYWxpemVDT01SQUlJKENPTVRocmVhZGluZ01vZGUgVGhyZWFkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNwZWVkT3Zlck1lbW9yeSA9IGZhbHNlKTsKKyAgfkluaXRpYWxpemVDT01SQUlJKCk7CisKK3ByaXZhdGU6CisgIEluaXRpYWxpemVDT01SQUlJKGNvbnN0IEluaXRpYWxpemVDT01SQUlJICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBJbml0aWFsaXplQ09NUkFJSSAmKSA9IGRlbGV0ZTsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NhY2hlUHJ1bmluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NhY2hlUHJ1bmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOGNlMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ2FjaGVQcnVuaW5nLmgKQEAgLTAsMCArMSw3OCBAQAorLy89LSBDYWNoZVBydW5pbmcuaCAtIEhlbHBlciB0byBtYW5hZ2UgdGhlIHBydW5pbmcgb2YgYSBjYWNoZSBkaXIgLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBwcnVuaW5nIG9mIGEgZGlyZWN0b3J5IGludGVuZGVkIGZvciBjYWNoZSBzdG9yYWdlLCB1c2luZworLy8gdmFyaW91cyBwb2xpY2llcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9DQUNIRV9QUlVOSU5HX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0NBQ0hFX1BSVU5JTkdfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8Y2hyb25vPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBFeHBlY3RlZDsKKworLy8vIFBvbGljeSBmb3IgdGhlIHBydW5lQ2FjaGUoKSBmdW5jdGlvbi4gQSBkZWZhdWx0IGNvbnN0cnVjdGVkCisvLy8gQ2FjaGVQcnVuaW5nUG9saWN5IHByb3ZpZGVzIGEgcmVhc29uYWJsZSBkZWZhdWx0IHBvbGljeS4KK3N0cnVjdCBDYWNoZVBydW5pbmdQb2xpY3kgeworICAvLy8gVGhlIHBydW5pbmcgaW50ZXJ2YWwuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBhdm9pZCBzY2FubmluZyB0aGUKKyAgLy8vIGRpcmVjdG9yeSB0b28gb2Z0ZW4uIEl0IGRvZXMgbm90IGltcGFjdCB0aGUgZGVjaXNpb24gb2Ygd2hpY2ggZmlsZSB0bworICAvLy8gcHJ1bmUuIEEgdmFsdWUgb2YgMCBmb3JjZXMgdGhlIHNjYW4gdG8gb2NjdXIuIEEgdmFsdWUgb2YgTm9uZSBkaXNhYmxlcworICAvLy8gcHJ1bmluZy4KKyAgbGx2bTo6T3B0aW9uYWw8c3RkOjpjaHJvbm86OnNlY29uZHM+IEludGVydmFsID0gc3RkOjpjaHJvbm86OnNlY29uZHMoMTIwMCk7CisKKyAgLy8vIFRoZSBleHBpcmF0aW9uIGZvciBhIGZpbGUuIFdoZW4gYSBmaWxlIGhhc24ndCBiZWVuIGFjY2Vzc2VkIGZvciBFeHBpcmF0aW9uCisgIC8vLyBzZWNvbmRzLCBpdCBpcyByZW1vdmVkIGZyb20gdGhlIGNhY2hlLiBBIHZhbHVlIG9mIDAgZGlzYWJsZXMgdGhlCisgIC8vLyBleHBpcmF0aW9uLWJhc2VkIHBydW5pbmcuCisgIHN0ZDo6Y2hyb25vOjpzZWNvbmRzIEV4cGlyYXRpb24gPSBzdGQ6OmNocm9ubzo6aG91cnMoNyAqIDI0KTsgLy8gMXcKKworICAvLy8gVGhlIG1heGltdW0gc2l6ZSBmb3IgdGhlIGNhY2hlIGRpcmVjdG9yeSwgaW4gdGVybXMgb2YgcGVyY2VudGFnZSBvZiB0aGUKKyAgLy8vIGF2YWlsYWJsZSBzcGFjZSBvbiB0aGUgZGlzay4gU2V0IHRvIDEwMCB0byBpbmRpY2F0ZSBubyBsaW1pdCwgNTAgdG8KKyAgLy8vIGluZGljYXRlIHRoYXQgdGhlIGNhY2hlIHNpemUgd2lsbCBub3QgYmUgbGVmdCBvdmVyIGhhbGYgdGhlIGF2YWlsYWJsZSBkaXNrCisgIC8vLyBzcGFjZS4gQSB2YWx1ZSBvdmVyIDEwMCB3aWxsIGJlIHJlZHVjZWQgdG8gMTAwLiBBIHZhbHVlIG9mIDAgZGlzYWJsZXMgdGhlCisgIC8vLyBwZXJjZW50YWdlIHNpemUtYmFzZWQgcHJ1bmluZy4KKyAgdW5zaWduZWQgTWF4U2l6ZVBlcmNlbnRhZ2VPZkF2YWlsYWJsZVNwYWNlID0gNzU7CisKKyAgLy8vIFRoZSBtYXhpbXVtIHNpemUgZm9yIHRoZSBjYWNoZSBkaXJlY3RvcnkgaW4gYnl0ZXMuIEEgdmFsdWUgb3ZlciB0aGUgYW1vdW50CisgIC8vLyBvZiBhdmFpbGFibGUgc3BhY2Ugb24gdGhlIGRpc2sgd2lsbCBiZSByZWR1Y2VkIHRvIHRoZSBhbW91bnQgb2YgYXZhaWxhYmxlCisgIC8vLyBzcGFjZS4gQSB2YWx1ZSBvZiAwIGRpc2FibGVzIHRoZSBhYnNvbHV0ZSBzaXplLWJhc2VkIHBydW5pbmcuCisgIHVpbnQ2NF90IE1heFNpemVCeXRlcyA9IDA7CisKKyAgLy8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlcyBpbiB0aGUgY2FjaGUgZGlyZWN0b3J5LiBBIHZhbHVlIG9mIDAgZGlzYWJsZXMKKyAgLy8vIHRoZSBudW1iZXIgb2YgZmlsZXMgYmFzZWQgcHJ1bmluZy4KKyAgLy8vCisgIC8vLyBUaGlzIGRlZmF1bHRzIHRvIDEwMDAwMDAgYmVjYXVzZSB3aXRoIHRoYXQgbWFueSBmaWxlcyB0aGVyZSBhcmUKKyAgLy8vIGRpbWluaXNoaW5nIHJldHVybnMgb24gdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgdGhlIGNhY2hlLCBhbmQgc29tZSBmaWxlCisgIC8vLyBzeXN0ZW1zIGhhdmUgYSBsaW1pdCBvbiBob3cgbWFueSBmaWxlcyBjYW4gYmUgY29udGFpbmVkIGluIGEgZGlyZWN0b3J5CisgIC8vLyAobm90YWJseSBleHQ0LCB3aGljaCBpcyBsaW1pdGVkIHRvIGFyb3VuZCA2MDAwMDAwIGZpbGVzKS4KKyAgdWludDY0X3QgTWF4U2l6ZUZpbGVzID0gMTAwMDAwMDsKK307CisKKy8vLyBQYXJzZSB0aGUgZ2l2ZW4gc3RyaW5nIGFzIGEgY2FjaGUgcHJ1bmluZyBwb2xpY3kuIERlZmF1bHRzIGFyZSB0YWtlbiBmcm9tIGEKKy8vLyBkZWZhdWx0IGNvbnN0cnVjdGVkIENhY2hlUHJ1bmluZ1BvbGljeSBvYmplY3QuCisvLy8gRm9yIGV4YW1wbGU6ICJwcnVuZV9pbnRlcnZhbD0zMHM6cHJ1bmVfYWZ0ZXI9MjRoOmNhY2hlX3NpemU9NTAlIgorLy8vIHdoaWNoIG1lYW5zIGEgcHJ1bmluZyBpbnRlcnZhbCBvZiAzMCBzZWNvbmRzLCBleHBpcmF0aW9uIHRpbWUgb2YgMjQgaG91cnMKKy8vLyBhbmQgbWF4aW11bSBjYWNoZSBzaXplIG9mIDUwJSBvZiBhdmFpbGFibGUgZGlzayBzcGFjZS4KK0V4cGVjdGVkPENhY2hlUHJ1bmluZ1BvbGljeT4gcGFyc2VDYWNoZVBydW5pbmdQb2xpY3koU3RyaW5nUmVmIFBvbGljeVN0cik7CisKKy8vLyBQZWZvcm0gcHJ1bmluZyB1c2luZyB0aGUgc3VwcGxpZWQgcG9saWN5LCByZXR1cm5zIHRydWUgaWYgcHJ1bmluZworLy8vIG9jY3VycmVkLCBpLmUuIGlmIFBvbGljeS5JbnRlcnZhbCB3YXMgZXhwaXJlZC4KKy8vLworLy8vIEFzIGEgc2FmZWd1YXJkIGFnYWluc3QgZGF0YSBsb3NzIGlmIHRoZSB1c2VyIHNwZWNpZmllcyB0aGUgd3JvbmcgZGlyZWN0b3J5CisvLy8gYXMgdGhlaXIgY2FjaGUgZGlyZWN0b3J5LCB0aGlzIGZ1bmN0aW9uIHdpbGwgaWdub3JlIGZpbGVzIG5vdCBtYXRjaGluZyB0aGUKKy8vLyBwYXR0ZXJuICJsbHZtY2FjaGUtKiIuCitib29sIHBydW5lQ2FjaGUoU3RyaW5nUmVmIFBhdGgsIENhY2hlUHJ1bmluZ1BvbGljeSBQb2xpY3kpOworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NhcGFjaXR5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ2FwYWNpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDYwZjk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NhcGFjaXR5LmgKQEAgLTAsMCArMSwzMiBAQAorLy89PT0tLS0gQ2FwYWNpdHkuaCAtIEdlbmVyaWMgY29tcHV0YXRpb24gb2YgQURUIG1lbW9yeSB1c2UgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgY2FwYWNpdHkgZnVuY3Rpb24gdGhhdCBjb21wdXRlcyB0aGUgYW1vdW50IG9mCisvLyBtZW1vcnkgdXNlZCBieSBhbiBBRFQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQ0FQQUNJVFlfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQ0FQQUNJVFlfSAorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGNhcGFjaXR5X2luX2J5dGVzKGNvbnN0IFQgJngpIHsKKyAgLy8gVGhpcyBkZWZhdWx0IGRlZmluaXRpb24gb2YgY2FwYWNpdHkgc2hvdWxkIHdvcmsgZm9yIHRoaW5ncyBsaWtlIHN0ZDo6dmVjdG9yCisgIC8vIGFuZCBmcmllbmRzLiAgTW9yZSBzcGVjaWFsaXplZCB2ZXJzaW9ucyB3aWxsIHdvcmsgZm9yIG90aGVycy4KKyAgcmV0dXJuIHguY2FwYWNpdHkoKSAqIHNpemVvZih0eXBlbmFtZSBUOjp2YWx1ZV90eXBlKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DYXN0aW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ2FzdGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYTJhODEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ2FzdGluZy5oCkBAIC0wLDAgKzEsMzk5IEBACisvLz09PS0gbGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCAtIEFsbG93IGZsZXhpYmxlLCBjaGVja2VkLCBjYXN0cyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpc2E8WD4oKSwgY2FzdDxYPigpLCBkeW5fY2FzdDxYPigpLCBjYXN0X29yX251bGw8WD4oKSwKKy8vIGFuZCBkeW5fY2FzdF9vcl9udWxsPFg+KCkgdGVtcGxhdGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0NBU1RJTkdfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQ0FTVElOR19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGlzYTx4PiBTdXBwb3J0IFRlbXBsYXRlcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gRGVmaW5lIGEgdGVtcGxhdGUgdGhhdCBjYW4gYmUgc3BlY2lhbGl6ZWQgYnkgc21hcnQgcG9pbnRlcnMgdG8gcmVmbGVjdCB0aGUKKy8vIGZhY3QgdGhhdCB0aGV5IGFyZSBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlZCwgYW5kIGFyZSBub3QgaW52b2x2ZWQgd2l0aCB0aGUKKy8vIHRlbXBsYXRlIHNlbGVjdGlvbiBwcm9jZXNzLi4uICB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vb3AuCisvLwordGVtcGxhdGU8dHlwZW5hbWUgRnJvbT4gc3RydWN0IHNpbXBsaWZ5X3R5cGUgeworICB1c2luZyBTaW1wbGVUeXBlID0gRnJvbTsgLy8gVGhlIHJlYWwgdHlwZSB0aGlzIHJlcHJlc2VudHMuLi4KKworICAvLyBBbiBhY2Nlc3NvciB0byBnZXQgdGhlIHJlYWwgdmFsdWUuLi4KKyAgc3RhdGljIFNpbXBsZVR5cGUgJmdldFNpbXBsaWZpZWRWYWx1ZShGcm9tICZWYWwpIHsgcmV0dXJuIFZhbDsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnJvbT4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8Y29uc3QgRnJvbT4geworICB1c2luZyBOb25Db25zdFNpbXBsZVR5cGUgPSB0eXBlbmFtZSBzaW1wbGlmeV90eXBlPEZyb20+OjpTaW1wbGVUeXBlOworICB1c2luZyBTaW1wbGVUeXBlID0KKyAgICAgIHR5cGVuYW1lIGFkZF9jb25zdF9wYXN0X3BvaW50ZXI8Tm9uQ29uc3RTaW1wbGVUeXBlPjo6dHlwZTsKKyAgdXNpbmcgUmV0VHlwZSA9CisgICAgICB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZV9pZl9ub3RfcG9pbnRlcjxTaW1wbGVUeXBlPjo6dHlwZTsKKworICBzdGF0aWMgUmV0VHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoY29uc3QgRnJvbSYgVmFsKSB7CisgICAgcmV0dXJuIHNpbXBsaWZ5X3R5cGU8RnJvbT46OmdldFNpbXBsaWZpZWRWYWx1ZShjb25zdF9jYXN0PEZyb20mPihWYWwpKTsKKyAgfQorfTsKKworLy8gVGhlIGNvcmUgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIGlzYTxYPiBpcyBoZXJlOyBUbyBhbmQgRnJvbSBzaG91bGQgYmUKKy8vIHRoZSBuYW1lcyBvZiBjbGFzc2VzLiAgVGhpcyB0ZW1wbGF0ZSBjYW4gYmUgc3BlY2lhbGl6ZWQgdG8gY3VzdG9taXplIHRoZQorLy8gaW1wbGVtZW50YXRpb24gb2YgaXNhPD4gd2l0aG91dCByZXdyaXRpbmcgaXQgZnJvbSBzY3JhdGNoLgordGVtcGxhdGUgPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBFbmFibGVyID0gdm9pZD4KK3N0cnVjdCBpc2FfaW1wbCB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IEZyb20gJlZhbCkgeworICAgIHJldHVybiBUbzo6Y2xhc3NvZigmVmFsKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBBbHdheXMgYWxsb3cgdXBjYXN0cywgYW5kIHBlcmZvcm0gbm8gZHluYW1pYyBjaGVjayBmb3IgdGhlbS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4KK3N0cnVjdCBpc2FfaW1wbDwKKyAgICBUbywgRnJvbSwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19iYXNlX29mPFRvLCBGcm9tPjo6dmFsdWU+Ojp0eXBlPiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IEZyb20gJikgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPiBzdHJ1Y3QgaXNhX2ltcGxfY2wgeworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBGcm9tICZWYWwpIHsKKyAgICByZXR1cm4gaXNhX2ltcGw8VG8sIEZyb20+Ojpkb2l0KFZhbCk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4gc3RydWN0IGlzYV9pbXBsX2NsPFRvLCBjb25zdCBGcm9tPiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IEZyb20gJlZhbCkgeworICAgIHJldHVybiBpc2FfaW1wbDxUbywgRnJvbT46OmRvaXQoVmFsKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPgorc3RydWN0IGlzYV9pbXBsX2NsPFRvLCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8RnJvbT4+IHsKKyAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEZyb20+ICZWYWwpIHsKKyAgICBhc3NlcnQoVmFsICYmICJpc2E8PiB1c2VkIG9uIGEgbnVsbCBwb2ludGVyIik7CisgICAgcmV0dXJuIGlzYV9pbXBsX2NsPFRvLCBGcm9tPjo6ZG9pdCgqVmFsKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPiBzdHJ1Y3QgaXNhX2ltcGxfY2w8VG8sIEZyb20qPiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IEZyb20gKlZhbCkgeworICAgIGFzc2VydChWYWwgJiYgImlzYTw+IHVzZWQgb24gYSBudWxsIHBvaW50ZXIiKTsKKyAgICByZXR1cm4gaXNhX2ltcGw8VG8sIEZyb20+Ojpkb2l0KCpWYWwpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+IHN0cnVjdCBpc2FfaW1wbF9jbDxUbywgRnJvbSpjb25zdD4geworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBGcm9tICpWYWwpIHsKKyAgICBhc3NlcnQoVmFsICYmICJpc2E8PiB1c2VkIG9uIGEgbnVsbCBwb2ludGVyIik7CisgICAgcmV0dXJuIGlzYV9pbXBsPFRvLCBGcm9tPjo6ZG9pdCgqVmFsKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPiBzdHJ1Y3QgaXNhX2ltcGxfY2w8VG8sIGNvbnN0IEZyb20qPiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IEZyb20gKlZhbCkgeworICAgIGFzc2VydChWYWwgJiYgImlzYTw+IHVzZWQgb24gYSBudWxsIHBvaW50ZXIiKTsKKyAgICByZXR1cm4gaXNhX2ltcGw8VG8sIEZyb20+Ojpkb2l0KCpWYWwpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+IHN0cnVjdCBpc2FfaW1wbF9jbDxUbywgY29uc3QgRnJvbSpjb25zdD4geworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBGcm9tICpWYWwpIHsKKyAgICBhc3NlcnQoVmFsICYmICJpc2E8PiB1c2VkIG9uIGEgbnVsbCBwb2ludGVyIik7CisgICAgcmV0dXJuIGlzYV9pbXBsPFRvLCBGcm9tPjo6ZG9pdCgqVmFsKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFNpbXBsZUZyb20+CitzdHJ1Y3QgaXNhX2ltcGxfd3JhcCB7CisgIC8vIFdoZW4gRnJvbSAhPSBTaW1wbGlmaWVkVHlwZSwgd2UgY2FuIHNpbXBsaWZ5IHRoZSB0eXBlIHNvbWUgbW9yZSBieSB1c2luZworICAvLyB0aGUgc2ltcGxpZnlfdHlwZSB0ZW1wbGF0ZS4KKyAgc3RhdGljIGJvb2wgZG9pdChjb25zdCBGcm9tICZWYWwpIHsKKyAgICByZXR1cm4gaXNhX2ltcGxfd3JhcDxUbywgU2ltcGxlRnJvbSwKKyAgICAgIHR5cGVuYW1lIHNpbXBsaWZ5X3R5cGU8U2ltcGxlRnJvbT46OlNpbXBsZVR5cGU+Ojpkb2l0KAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGlmeV90eXBlPGNvbnN0IEZyb20+OjpnZXRTaW1wbGlmaWVkVmFsdWUoVmFsKSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tVHk+CitzdHJ1Y3QgaXNhX2ltcGxfd3JhcDxUbywgRnJvbVR5LCBGcm9tVHk+IHsKKyAgLy8gV2hlbiBGcm9tID09IFNpbXBsZVR5cGUsIHdlIGFyZSBhcyBzaW1wbGUgYXMgd2UgYXJlIGdvaW5nIHRvIGdldC4KKyAgc3RhdGljIGJvb2wgZG9pdChjb25zdCBGcm9tVHkgJlZhbCkgeworICAgIHJldHVybiBpc2FfaW1wbF9jbDxUbyxGcm9tVHk+Ojpkb2l0KFZhbCk7CisgIH0KK307CisKKy8vIGlzYTxYPiAtIFJldHVybiB0cnVlIGlmIHRoZSBwYXJhbWV0ZXIgdG8gdGhlIHRlbXBsYXRlIGlzIGFuIGluc3RhbmNlIG9mIHRoZQorLy8gdGVtcGxhdGUgdHlwZSBhcmd1bWVudC4gIFVzZWQgbGlrZSB0aGlzOgorLy8KKy8vICBpZiAoaXNhPFR5cGU+KG15VmFsKSkgeyAuLi4gfQorLy8KK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPiBMTFZNX05PRElTQ0FSRCBpbmxpbmUgYm9vbCBpc2EoY29uc3QgWSAmVmFsKSB7CisgIHJldHVybiBpc2FfaW1wbF93cmFwPFgsIGNvbnN0IFksCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHNpbXBsaWZ5X3R5cGU8Y29uc3QgWT46OlNpbXBsZVR5cGU+Ojpkb2l0KFZhbCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDx4PiBTdXBwb3J0IFRlbXBsYXRlcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGU8Y2xhc3MgVG8sIGNsYXNzIEZyb20+IHN0cnVjdCBjYXN0X3JldHR5OworCisvLyBDYWxjdWxhdGUgd2hhdCB0eXBlIHRoZSAnY2FzdCcgZnVuY3Rpb24gc2hvdWxkIHJldHVybiwgYmFzZWQgb24gYSByZXF1ZXN0ZWQKKy8vIHR5cGUgb2YgVG8gYW5kIGEgc291cmNlIHR5cGUgb2YgRnJvbS4KK3RlbXBsYXRlPGNsYXNzIFRvLCBjbGFzcyBGcm9tPiBzdHJ1Y3QgY2FzdF9yZXR0eV9pbXBsIHsKKyAgdXNpbmcgcmV0X3R5cGUgPSBUbyAmOyAgICAgICAvLyBOb3JtYWwgY2FzZSwgcmV0dXJuIFR5JgorfTsKK3RlbXBsYXRlPGNsYXNzIFRvLCBjbGFzcyBGcm9tPiBzdHJ1Y3QgY2FzdF9yZXR0eV9pbXBsPFRvLCBjb25zdCBGcm9tPiB7CisgIHVzaW5nIHJldF90eXBlID0gY29uc3QgVG8gJjsgLy8gTm9ybWFsIGNhc2UsIHJldHVybiBUeSYKK307CisKK3RlbXBsYXRlPGNsYXNzIFRvLCBjbGFzcyBGcm9tPiBzdHJ1Y3QgY2FzdF9yZXR0eV9pbXBsPFRvLCBGcm9tKj4geworICB1c2luZyByZXRfdHlwZSA9IFRvICo7ICAgICAgIC8vIFBvaW50ZXIgYXJnIGNhc2UsIHJldHVybiBUeSoKK307CisKK3RlbXBsYXRlPGNsYXNzIFRvLCBjbGFzcyBGcm9tPiBzdHJ1Y3QgY2FzdF9yZXR0eV9pbXBsPFRvLCBjb25zdCBGcm9tKj4geworICB1c2luZyByZXRfdHlwZSA9IGNvbnN0IFRvICo7IC8vIENvbnN0YW50IHBvaW50ZXIgYXJnIGNhc2UsIHJldHVybiBjb25zdCBUeSoKK307CisKK3RlbXBsYXRlPGNsYXNzIFRvLCBjbGFzcyBGcm9tPiBzdHJ1Y3QgY2FzdF9yZXR0eV9pbXBsPFRvLCBjb25zdCBGcm9tKmNvbnN0PiB7CisgIHVzaW5nIHJldF90eXBlID0gY29uc3QgVG8gKjsgLy8gQ29uc3RhbnQgcG9pbnRlciBhcmcgY2FzZSwgcmV0dXJuIGNvbnN0IFR5KgorfTsKKwordGVtcGxhdGUgPGNsYXNzIFRvLCBjbGFzcyBGcm9tPgorc3RydWN0IGNhc3RfcmV0dHlfaW1wbDxUbywgc3RkOjp1bmlxdWVfcHRyPEZyb20+PiB7Citwcml2YXRlOgorICB1c2luZyBQb2ludGVyVHlwZSA9IHR5cGVuYW1lIGNhc3RfcmV0dHlfaW1wbDxUbywgRnJvbSAqPjo6cmV0X3R5cGU7CisgIHVzaW5nIFJlc3VsdFR5cGUgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9wb2ludGVyPFBvaW50ZXJUeXBlPjo6dHlwZTsKKworcHVibGljOgorICB1c2luZyByZXRfdHlwZSA9IHN0ZDo6dW5pcXVlX3B0cjxSZXN1bHRUeXBlPjsKK307CisKK3RlbXBsYXRlPGNsYXNzIFRvLCBjbGFzcyBGcm9tLCBjbGFzcyBTaW1wbGVGcm9tPgorc3RydWN0IGNhc3RfcmV0dHlfd3JhcCB7CisgIC8vIFdoZW4gdGhlIHNpbXBsaWZpZWQgdHlwZSBhbmQgdGhlIGZyb20gdHlwZSBhcmUgbm90IHRoZSBzYW1lLCB1c2UgdGhlIHR5cGUKKyAgLy8gc2ltcGxpZmllciB0byByZWR1Y2UgdGhlIHR5cGUsIHRoZW4gcmV1c2UgY2FzdF9yZXR0eV9pbXBsIHRvIGdldCB0aGUKKyAgLy8gcmVzdWx0YW50IHR5cGUuCisgIHVzaW5nIHJldF90eXBlID0gdHlwZW5hbWUgY2FzdF9yZXR0eTxUbywgU2ltcGxlRnJvbT46OnJldF90eXBlOworfTsKKwordGVtcGxhdGU8Y2xhc3MgVG8sIGNsYXNzIEZyb21UeT4KK3N0cnVjdCBjYXN0X3JldHR5X3dyYXA8VG8sIEZyb21UeSwgRnJvbVR5PiB7CisgIC8vIFdoZW4gdGhlIHNpbXBsaWZpZWQgdHlwZSBpcyBlcXVhbCB0byB0aGUgZnJvbSB0eXBlLCB1c2UgaXQgZGlyZWN0bHkuCisgIHVzaW5nIHJldF90eXBlID0gdHlwZW5hbWUgY2FzdF9yZXR0eV9pbXBsPFRvLEZyb21UeT46OnJldF90eXBlOworfTsKKwordGVtcGxhdGU8Y2xhc3MgVG8sIGNsYXNzIEZyb20+CitzdHJ1Y3QgY2FzdF9yZXR0eSB7CisgIHVzaW5nIHJldF90eXBlID0gdHlwZW5hbWUgY2FzdF9yZXR0eV93cmFwPAorICAgICAgVG8sIEZyb20sIHR5cGVuYW1lIHNpbXBsaWZ5X3R5cGU8RnJvbT46OlNpbXBsZVR5cGU+OjpyZXRfdHlwZTsKK307CisKKy8vIEVuc3VyZSB0aGUgbm9uLXNpbXBsZSB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB1c2luZyB0aGUgc2ltcGxpZnlfdHlwZSB0ZW1wbGF0ZQorLy8gdGhhdCBtYXkgYmUgc3BlY2lhbGl6ZWQgYnkgc21hcnQgcG9pbnRlcnMuLi4KKy8vCit0ZW1wbGF0ZTxjbGFzcyBUbywgY2xhc3MgRnJvbSwgY2xhc3MgU2ltcGxlRnJvbT4gc3RydWN0IGNhc3RfY29udmVydF92YWwgeworICAvLyBUaGlzIGlzIG5vdCBhIHNpbXBsZSB0eXBlLCB1c2UgdGhlIHRlbXBsYXRlIHRvIHNpbXBsaWZ5IGl0Li4uCisgIHN0YXRpYyB0eXBlbmFtZSBjYXN0X3JldHR5PFRvLCBGcm9tPjo6cmV0X3R5cGUgZG9pdChGcm9tICZWYWwpIHsKKyAgICByZXR1cm4gY2FzdF9jb252ZXJ0X3ZhbDxUbywgU2ltcGxlRnJvbSwKKyAgICAgIHR5cGVuYW1lIHNpbXBsaWZ5X3R5cGU8U2ltcGxlRnJvbT46OlNpbXBsZVR5cGU+Ojpkb2l0KAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGlmeV90eXBlPEZyb20+OjpnZXRTaW1wbGlmaWVkVmFsdWUoVmFsKSk7CisgIH0KK307CisKK3RlbXBsYXRlPGNsYXNzIFRvLCBjbGFzcyBGcm9tVHk+IHN0cnVjdCBjYXN0X2NvbnZlcnRfdmFsPFRvLEZyb21UeSxGcm9tVHk+IHsKKyAgLy8gVGhpcyBfaXNfIGEgc2ltcGxlIHR5cGUsIGp1c3QgY2FzdCBpdC4KKyAgc3RhdGljIHR5cGVuYW1lIGNhc3RfcmV0dHk8VG8sIEZyb21UeT46OnJldF90eXBlIGRvaXQoY29uc3QgRnJvbVR5ICZWYWwpIHsKKyAgICB0eXBlbmFtZSBjYXN0X3JldHR5PFRvLCBGcm9tVHk+OjpyZXRfdHlwZSBSZXMyCisgICAgID0gKHR5cGVuYW1lIGNhc3RfcmV0dHk8VG8sIEZyb21UeT46OnJldF90eXBlKWNvbnN0X2Nhc3Q8RnJvbVR5Jj4oVmFsKTsKKyAgICByZXR1cm4gUmVzMjsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFg+IHN0cnVjdCBpc19zaW1wbGVfdHlwZSB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0KKyAgICAgIHN0ZDo6aXNfc2FtZTxYLCB0eXBlbmFtZSBzaW1wbGlmeV90eXBlPFg+OjpTaW1wbGVUeXBlPjo6dmFsdWU7Cit9OworCisvLyBjYXN0PFg+IC0gUmV0dXJuIHRoZSBhcmd1bWVudCBwYXJhbWV0ZXIgY2FzdCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuICBUaGlzCisvLyBjYXN0aW5nIG9wZXJhdG9yIGFzc2VydHMgdGhhdCB0aGUgdHlwZSBpcyBjb3JyZWN0LCBzbyBpdCBkb2VzIG5vdCByZXR1cm4gbnVsbAorLy8gb24gZmFpbHVyZS4gIEl0IGRvZXMgbm90IGFsbG93IGEgbnVsbCBhcmd1bWVudCAodXNlIGNhc3Rfb3JfbnVsbCBmb3IgdGhhdCkuCisvLyBJdCBpcyB0eXBpY2FsbHkgdXNlZCBsaWtlIHRoaXM6CisvLworLy8gIGNhc3Q8SW5zdHJ1Y3Rpb24+KG15VmFsKS0+Z2V0UGFyZW50KCkKKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4KK2lubGluZSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhaXNfc2ltcGxlX3R5cGU8WT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGNhc3RfcmV0dHk8WCwgY29uc3QgWT46OnJldF90eXBlPjo6dHlwZQorY2FzdChjb25zdCBZICZWYWwpIHsKKyAgYXNzZXJ0KGlzYTxYPihWYWwpICYmICJjYXN0PFR5PigpIGFyZ3VtZW50IG9mIGluY29tcGF0aWJsZSB0eXBlISIpOworICByZXR1cm4gY2FzdF9jb252ZXJ0X3ZhbDwKKyAgICAgIFgsIGNvbnN0IFksIHR5cGVuYW1lIHNpbXBsaWZ5X3R5cGU8Y29uc3QgWT46OlNpbXBsZVR5cGU+Ojpkb2l0KFZhbCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgoraW5saW5lIHR5cGVuYW1lIGNhc3RfcmV0dHk8WCwgWT46OnJldF90eXBlIGNhc3QoWSAmVmFsKSB7CisgIGFzc2VydChpc2E8WD4oVmFsKSAmJiAiY2FzdDxUeT4oKSBhcmd1bWVudCBvZiBpbmNvbXBhdGlibGUgdHlwZSEiKTsKKyAgcmV0dXJuIGNhc3RfY29udmVydF92YWw8WCwgWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc2ltcGxpZnlfdHlwZTxZPjo6U2ltcGxlVHlwZT46OmRvaXQoVmFsKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitpbmxpbmUgdHlwZW5hbWUgY2FzdF9yZXR0eTxYLCBZICo+OjpyZXRfdHlwZSBjYXN0KFkgKlZhbCkgeworICBhc3NlcnQoaXNhPFg+KFZhbCkgJiYgImNhc3Q8VHk+KCkgYXJndW1lbnQgb2YgaW5jb21wYXRpYmxlIHR5cGUhIik7CisgIHJldHVybiBjYXN0X2NvbnZlcnRfdmFsPFgsIFkqLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzaW1wbGlmeV90eXBlPFkqPjo6U2ltcGxlVHlwZT46OmRvaXQoVmFsKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitpbmxpbmUgdHlwZW5hbWUgY2FzdF9yZXR0eTxYLCBzdGQ6OnVuaXF1ZV9wdHI8WT4+OjpyZXRfdHlwZQorY2FzdChzdGQ6OnVuaXF1ZV9wdHI8WT4gJiZWYWwpIHsKKyAgYXNzZXJ0KGlzYTxYPihWYWwuZ2V0KCkpICYmICJjYXN0PFR5PigpIGFyZ3VtZW50IG9mIGluY29tcGF0aWJsZSB0eXBlISIpOworICB1c2luZyByZXRfdHlwZSA9IHR5cGVuYW1lIGNhc3RfcmV0dHk8WCwgc3RkOjp1bmlxdWVfcHRyPFk+Pjo6cmV0X3R5cGU7CisgIHJldHVybiByZXRfdHlwZSgKKyAgICAgIGNhc3RfY29udmVydF92YWw8WCwgWSAqLCB0eXBlbmFtZSBzaW1wbGlmeV90eXBlPFkgKj46OlNpbXBsZVR5cGU+Ojpkb2l0KAorICAgICAgICAgIFZhbC5yZWxlYXNlKCkpKTsKK30KKworLy8gY2FzdF9vcl9udWxsPFg+IC0gRnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0byBjYXN0LCBleGNlcHQgdGhhdCBhIG51bGwgdmFsdWUgaXMKKy8vIGFjY2VwdGVkLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgorTExWTV9OT0RJU0NBUkQgaW5saW5lCisgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IWlzX3NpbXBsZV90eXBlPFk+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBjYXN0X3JldHR5PFgsIGNvbnN0IFk+OjpyZXRfdHlwZT46OnR5cGUKKyAgICBjYXN0X29yX251bGwoY29uc3QgWSAmVmFsKSB7CisgIGlmICghVmFsKQorICAgIHJldHVybiBudWxscHRyOworICBhc3NlcnQoaXNhPFg+KFZhbCkgJiYgImNhc3Rfb3JfbnVsbDxUeT4oKSBhcmd1bWVudCBvZiBpbmNvbXBhdGlibGUgdHlwZSEiKTsKKyAgcmV0dXJuIGNhc3Q8WD4oVmFsKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitMTFZNX05PRElTQ0FSRCBpbmxpbmUKKyAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhaXNfc2ltcGxlX3R5cGU8WT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGNhc3RfcmV0dHk8WCwgWT46OnJldF90eXBlPjo6dHlwZQorICAgIGNhc3Rfb3JfbnVsbChZICZWYWwpIHsKKyAgaWYgKCFWYWwpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGFzc2VydChpc2E8WD4oVmFsKSAmJiAiY2FzdF9vcl9udWxsPFR5PigpIGFyZ3VtZW50IG9mIGluY29tcGF0aWJsZSB0eXBlISIpOworICByZXR1cm4gY2FzdDxYPihWYWwpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4KK0xMVk1fTk9ESVNDQVJEIGlubGluZSB0eXBlbmFtZSBjYXN0X3JldHR5PFgsIFkgKj46OnJldF90eXBlCitjYXN0X29yX251bGwoWSAqVmFsKSB7CisgIGlmICghVmFsKSByZXR1cm4gbnVsbHB0cjsKKyAgYXNzZXJ0KGlzYTxYPihWYWwpICYmICJjYXN0X29yX251bGw8VHk+KCkgYXJndW1lbnQgb2YgaW5jb21wYXRpYmxlIHR5cGUhIik7CisgIHJldHVybiBjYXN0PFg+KFZhbCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgoraW5saW5lIHR5cGVuYW1lIGNhc3RfcmV0dHk8WCwgc3RkOjp1bmlxdWVfcHRyPFk+Pjo6cmV0X3R5cGUKK2Nhc3Rfb3JfbnVsbChzdGQ6OnVuaXF1ZV9wdHI8WT4gJiZWYWwpIHsKKyAgaWYgKCFWYWwpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBjYXN0PFg+KHN0ZDo6bW92ZShWYWwpKTsKK30KKworLy8gZHluX2Nhc3Q8WD4gLSBSZXR1cm4gdGhlIGFyZ3VtZW50IHBhcmFtZXRlciBjYXN0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4gIFRoaXMKKy8vIGNhc3Rpbmcgb3BlcmF0b3IgcmV0dXJucyBudWxsIGlmIHRoZSBhcmd1bWVudCBpcyBvZiB0aGUgd3JvbmcgdHlwZSwgc28gaXQgY2FuCisvLyBiZSB1c2VkIHRvIHRlc3QgZm9yIGEgdHlwZSBhcyB3ZWxsIGFzIGNhc3QgaWYgc3VjY2Vzc2Z1bC4gIFRoaXMgc2hvdWxkIGJlCisvLyB1c2VkIGluIHRoZSBjb250ZXh0IG9mIGFuIGlmIHN0YXRlbWVudCBsaWtlIHRoaXM6CisvLworLy8gIGlmIChjb25zdCBJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihteVZhbCkpIHsgLi4uIH0KKy8vCisKK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgorTExWTV9OT0RJU0NBUkQgaW5saW5lCisgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IWlzX3NpbXBsZV90eXBlPFk+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBjYXN0X3JldHR5PFgsIGNvbnN0IFk+OjpyZXRfdHlwZT46OnR5cGUKKyAgICBkeW5fY2FzdChjb25zdCBZICZWYWwpIHsKKyAgcmV0dXJuIGlzYTxYPihWYWwpID8gY2FzdDxYPihWYWwpIDogbnVsbHB0cjsKK30KKwordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitMTFZNX05PRElTQ0FSRCBpbmxpbmUgdHlwZW5hbWUgY2FzdF9yZXR0eTxYLCBZPjo6cmV0X3R5cGUgZHluX2Nhc3QoWSAmVmFsKSB7CisgIHJldHVybiBpc2E8WD4oVmFsKSA/IGNhc3Q8WD4oVmFsKSA6IG51bGxwdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgorTExWTV9OT0RJU0NBUkQgaW5saW5lIHR5cGVuYW1lIGNhc3RfcmV0dHk8WCwgWSAqPjo6cmV0X3R5cGUgZHluX2Nhc3QoWSAqVmFsKSB7CisgIHJldHVybiBpc2E8WD4oVmFsKSA/IGNhc3Q8WD4oVmFsKSA6IG51bGxwdHI7Cit9CisKKy8vIGR5bl9jYXN0X29yX251bGw8WD4gLSBGdW5jdGlvbmFsbHkgaWRlbnRpY2FsIHRvIGR5bl9jYXN0LCBleGNlcHQgdGhhdCBhIG51bGwKKy8vIHZhbHVlIGlzIGFjY2VwdGVkLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgorTExWTV9OT0RJU0NBUkQgaW5saW5lCisgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IWlzX3NpbXBsZV90eXBlPFk+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBjYXN0X3JldHR5PFgsIGNvbnN0IFk+OjpyZXRfdHlwZT46OnR5cGUKKyAgICBkeW5fY2FzdF9vcl9udWxsKGNvbnN0IFkgJlZhbCkgeworICByZXR1cm4gKFZhbCAmJiBpc2E8WD4oVmFsKSkgPyBjYXN0PFg+KFZhbCkgOiBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4KK0xMVk1fTk9ESVNDQVJEIGlubGluZQorICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFpc19zaW1wbGVfdHlwZTxZPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgY2FzdF9yZXR0eTxYLCBZPjo6cmV0X3R5cGU+Ojp0eXBlCisgICAgZHluX2Nhc3Rfb3JfbnVsbChZICZWYWwpIHsKKyAgcmV0dXJuIChWYWwgJiYgaXNhPFg+KFZhbCkpID8gY2FzdDxYPihWYWwpIDogbnVsbHB0cjsKK30KKwordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitMTFZNX05PRElTQ0FSRCBpbmxpbmUgdHlwZW5hbWUgY2FzdF9yZXR0eTxYLCBZICo+OjpyZXRfdHlwZQorZHluX2Nhc3Rfb3JfbnVsbChZICpWYWwpIHsKKyAgcmV0dXJuIChWYWwgJiYgaXNhPFg+KFZhbCkpID8gY2FzdDxYPihWYWwpIDogbnVsbHB0cjsKK30KKworLy8gdW5pcXVlX2R5bl9jYXN0PFg+IC0gR2l2ZW4gYSB1bmlxdWVfcHRyPFk+LCB0cnkgdG8gcmV0dXJuIGEgdW5pcXVlX3B0cjxYPiwKKy8vIHRha2luZyBvd25lcnNoaXAgb2YgdGhlIGlucHV0IHBvaW50ZXIgaWZmIGlzYTxYPihWYWwpIGlzIHRydWUuICBJZiB0aGUKKy8vIGNhc3QgaXMgc3VjY2Vzc2Z1bCwgRnJvbSByZWZlcnMgdG8gbnVsbHB0ciBvbiBleGl0IGFuZCB0aGUgY2FzdGVkIHZhbHVlCisvLyBpcyByZXR1cm5lZC4gIElmIHRoZSBjYXN0IGlzIHVuc3VjY2Vzc2Z1bCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgbnVsbHB0cgorLy8gYW5kIEZyb20gaXMgdW5jaGFuZ2VkLgordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitMTFZNX05PRElTQ0FSRCBpbmxpbmUgYXV0byB1bmlxdWVfZHluX2Nhc3Qoc3RkOjp1bmlxdWVfcHRyPFk+ICZWYWwpCisgICAgLT4gZGVjbHR5cGUoY2FzdDxYPihWYWwpKSB7CisgIGlmICghaXNhPFg+KFZhbCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBjYXN0PFg+KHN0ZDo6bW92ZShWYWwpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitMTFZNX05PRElTQ0FSRCBpbmxpbmUgYXV0byB1bmlxdWVfZHluX2Nhc3Qoc3RkOjp1bmlxdWVfcHRyPFk+ICYmVmFsKQorICAgIC0+IGRlY2x0eXBlKGNhc3Q8WD4oVmFsKSkgeworICByZXR1cm4gdW5pcXVlX2R5bl9jYXN0PFgsIFk+KFZhbCk7Cit9CisKKy8vIGR5bl9jYXN0X29yX251bGw8WD4gLSBGdW5jdGlvbmFsbHkgaWRlbnRpY2FsIHRvIHVuaXF1ZV9keW5fY2FzdCwgZXhjZXB0IHRoYXQKKy8vIGEgbnVsbCB2YWx1ZSBpcyBhY2NlcHRlZC4KK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgorTExWTV9OT0RJU0NBUkQgaW5saW5lIGF1dG8gdW5pcXVlX2R5bl9jYXN0X29yX251bGwoc3RkOjp1bmlxdWVfcHRyPFk+ICZWYWwpCisgICAgLT4gZGVjbHR5cGUoY2FzdDxYPihWYWwpKSB7CisgIGlmICghVmFsKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gdW5pcXVlX2R5bl9jYXN0PFgsIFk+KFZhbCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgorTExWTV9OT0RJU0NBUkQgaW5saW5lIGF1dG8gdW5pcXVlX2R5bl9jYXN0X29yX251bGwoc3RkOjp1bmlxdWVfcHRyPFk+ICYmVmFsKQorICAgIC0+IGRlY2x0eXBlKGNhc3Q8WD4oVmFsKSkgeworICByZXR1cm4gdW5pcXVlX2R5bl9jYXN0X29yX251bGw8WCwgWT4oVmFsKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9DQVNUSU5HX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DaGVja2VkQXJpdGhtZXRpYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NoZWNrZWRBcml0aG1ldGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiY2UwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DaGVja2VkQXJpdGhtZXRpYy5oCkBAIC0wLDAgKzEsODMgQEAKKy8vPT0tLSBsbHZtL1N1cHBvcnQvQ2hlY2tlZEFyaXRobWV0aWMuaCAtIFNhZmUgYXJpdGhtZXRpY2FsIG9wZXJhdGlvbnMgKi0gQysrIC8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGdlbmVyaWMgZnVuY3Rpb25zIGZvciBvcGVyYXRpbmcgb24gaW50ZWdlcnMgd2hpY2gKKy8vIGdpdmUgdGhlIGluZGljYXRpb24gb24gd2hldGhlciB0aGUgb3BlcmF0aW9uIGhhcyBvdmVyZmxvd24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQ0hFQ0tFREFSSVRITUVUSUNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQ0hFQ0tFREFSSVRITUVUSUNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgeworCisvLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBhcHBseSBhIGdpdmVuIG1ldGhvZCBvZiBcYyBBUEludCBccCBGIHRvIFxwIExIUyBhbmQKKy8vLyBccCBSSFMsIGFuZCB3cml0ZSB0aGUgb3V0cHV0IGludG8gXHAgUmVzLgorLy8vIFxyZXR1cm4gV2hldGhlciB0aGUgb3BlcmF0aW9uIG92ZXJmbG93cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBGPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUgJiYgc2l6ZW9mKFQpICogOCA8PSA2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2w+Ojp0eXBlCitjaGVja2VkT3AoVCBMSFMsIFQgUkhTLCBGIE9wLCBUICpSZXMgPSBudWxscHRyLCBib29sIFNpZ25lZCA9IHRydWUpIHsKKyAgbGx2bTo6QVBJbnQgQUxIUygvKkJpdFNpemU9Ki9zaXplb2YoVCkgKiA4LCBMSFMsIFNpZ25lZCk7CisgIGxsdm06OkFQSW50IEFSSFMoLypCaXRTaXplPSovc2l6ZW9mKFQpICogOCwgUkhTLCBTaWduZWQpOworICBib29sIE92ZXJmbG93OworICBsbHZtOjpBUEludCBPdXQgPSAoQUxIUy4qT3ApKEFSSFMsIE92ZXJmbG93KTsKKyAgaWYgKFJlcykKKyAgICAqUmVzID0gU2lnbmVkID8gT3V0LmdldFNFeHRWYWx1ZSgpIDogT3V0LmdldFpFeHRWYWx1ZSgpOworICByZXR1cm4gT3ZlcmZsb3c7Cit9Cit9CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEFkZCB0d28gc2lnbmVkIGludGVnZXJzIFxwIExIUyBhbmQgXHAgUkhTLCB3cml0ZSBpbnRvIFxwIFJlcyBpZiBub24tbnVsbC4KKy8vLyBEb2VzIG5vdCBndWFyYW50ZWUgc2F0dXJhdGluZyBhcml0aG1ldGljLgorLy8vIFxyZXR1cm4gV2hldGhlciB0aGUgcmVzdWx0IG92ZXJmbG93cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19zaWduZWQ8VD46OnZhbHVlLCBib29sPjo6dHlwZQorY2hlY2tlZEFkZChUIExIUywgVCBSSFMsIFQgKlJlcyA9IG51bGxwdHIpIHsKKyAgcmV0dXJuIGNoZWNrZWRPcChMSFMsIFJIUywgJmxsdm06OkFQSW50OjpzYWRkX292LCBSZXMpOworfQorCisvLy8gTXVsdGlwbHkgdHdvIHNpZ25lZCBpbnRlZ2VycyBccCBMSFMgYW5kIFxwIFJIUywgd3JpdGUgaW50byBccCBSZXMgaWYKKy8vLyBub24tbnVsbC4KKy8vLyBEb2VzIG5vdCBndWFyYW50ZWUgc2F0dXJhdGluZyBhcml0aG1ldGljLgorLy8vIFxyZXR1cm4gV2hldGhlciB0aGUgcmVzdWx0IG92ZXJmbG93cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19zaWduZWQ8VD46OnZhbHVlLCBib29sPjo6dHlwZQorY2hlY2tlZE11bChUIExIUywgVCBSSFMsIFQgKlJlcyA9IG51bGxwdHIpIHsKKyAgcmV0dXJuIGNoZWNrZWRPcChMSFMsIFJIUywgJmxsdm06OkFQSW50OjpzbXVsX292LCBSZXMpOworfQorCisvLy8gQWRkIHR3byB1bnNpZ25lZCBpbnRlZ2VycyBccCBMSFMgYW5kIFxwIFJIUywgd3JpdGUgaW50byBccCBSZXMgaWYgbm9uLW51bGwuCisvLy8gRG9lcyBub3QgZ3VhcmFudGVlIHNhdHVyYXRpbmcgYXJpdGhtZXRpYy4KKy8vLyBccmV0dXJuIFdoZXRoZXIgdGhlIHJlc3VsdCBvdmVyZmxvd3MuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfdW5zaWduZWQ8VD46OnZhbHVlLCBib29sPjo6dHlwZQorY2hlY2tlZEFkZFVuc2lnbmVkKFQgTEhTLCBUIFJIUywgVCAqUmVzID0gbnVsbHB0cikgeworICByZXR1cm4gY2hlY2tlZE9wKExIUywgUkhTLCAmbGx2bTo6QVBJbnQ6OnVhZGRfb3YsIFJlcywgLypTaWduZWQ9Ki9mYWxzZSk7Cit9CisKKy8vLyBNdWx0aXBseSB0d28gdW5zaWduZWQgaW50ZWdlcnMgXHAgTEhTIGFuZCBccCBSSFMsIHdyaXRlIGludG8gXHAgUmVzIGlmCisvLy8gbm9uLW51bGwuCisvLy8gRG9lcyBub3QgZ3VhcmFudGVlIHNhdHVyYXRpbmcgYXJpdGhtZXRpYy4KKy8vLyBccmV0dXJuIFdoZXRoZXIgdGhlIHJlc3VsdCBvdmVyZmxvd3MuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfdW5zaWduZWQ8VD46OnZhbHVlLCBib29sPjo6dHlwZQorY2hlY2tlZE11bFVuc2lnbmVkKFQgTEhTLCBUIFJIUywgVCAqUmVzID0gbnVsbHB0cikgeworICByZXR1cm4gY2hlY2tlZE9wKExIUywgUkhTLCAmbGx2bTo6QVBJbnQ6OnVtdWxfb3YsIFJlcywgLypTaWduZWQ9Ki9mYWxzZSk7Cit9CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Nocm9uby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Nocm9uby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NDA2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ2hyb25vLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvQ2hyb25vLmggLSBVdGlsaXRpZXMgZm9yIFRpbWluZyBNYW5pcHVsYXRpb24tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0NIUk9OT19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9DSFJPTk9fSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdFByb3ZpZGVycy5oIgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGN0aW1lPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCituYW1lc3BhY2Ugc3lzIHsKKworLy8vIEEgdGltZSBwb2ludCBvbiB0aGUgc3lzdGVtIGNsb2NrLiBUaGlzIGlzIHByb3ZpZGVkIGZvciB0d28gcmVhc29uczoKKy8vLyAtIHRvIGluc3VsYXRlIHVzIGFnYWlucyBzdWJ0bGUgZGlmZmVyZW5jZXMgaW4gYmVoYXZvaXIgdG8gZGlmZmVyZW5jZXMgaW4KKy8vLyAgIHN5c3RlbSBjbG9jayBwcmVjaXNpb24gKHdoaWNoIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQgYW5kIGRpZmZlcnMgYmV0d2VlbgorLy8vICAgcGxhdGZvcm1zKS4KKy8vLyAtIHRvIHNob3J0ZW4gdGhlIHR5cGUgbmFtZQorLy8vIFRoZSBkZWZhdWx0IHByZWNpc2lvbiBpcyBuYW5vc2Vjb25kcy4gSWYgbmVlZCBhIHNwZWNpZmljIHByZWNpc2lvbiBzcGVjaWZ5CisvLy8gaXQgZXhwbGljaXRseS4gSWYgdW5zdXJlLCB1c2UgdGhlIGRlZmF1bHQuIElmIHlvdSBuZWVkIGEgdGltZSBwb2ludCBvbiBhCisvLy8gY2xvY2sgb3RoZXIgdGhhbiB0aGUgc3lzdGVtX2Nsb2NrLCB1c2Ugc3RkOjpjaHJvbm8gZGlyZWN0bHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRCA9IHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcz4KK3VzaW5nIFRpbWVQb2ludCA9IHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2ssIEQ+OworCisvLy8gQ29udmVydCBhIFRpbWVQb2ludCB0byBzdGQ6OnRpbWVfdAorTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBpbmxpbmUgc3RkOjp0aW1lX3QgdG9UaW1lVChUaW1lUG9pbnQ8PiBUUCkgeworICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm87CisgIHJldHVybiBzeXN0ZW1fY2xvY2s6OnRvX3RpbWVfdCgKKyAgICAgIHRpbWVfcG9pbnRfY2FzdDxzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQ6OmR1cmF0aW9uPihUUCkpOworfQorCisvLy8gQ29udmVydCBhIHN0ZDo6dGltZV90IHRvIGEgVGltZVBvaW50CitMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIGlubGluZSBUaW1lUG9pbnQ8c3RkOjpjaHJvbm86OnNlY29uZHM+Cit0b1RpbWVQb2ludChzdGQ6OnRpbWVfdCBUKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ubzsKKyAgcmV0dXJuIHRpbWVfcG9pbnRfY2FzdDxzZWNvbmRzPihzeXN0ZW1fY2xvY2s6OmZyb21fdGltZV90KFQpKTsKK30KKworfSAvLyBuYW1lc3BhY2Ugc3lzCisKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgc3lzOjpUaW1lUG9pbnQ8PiBUUCk7CisKKy8vLyBGb3JtYXQgcHJvdmlkZXIgZm9yIFRpbWVQb2ludDw+CisvLy8KKy8vLyBUaGUgb3B0aW9ucyBzdHJpbmcgaXMgYSBzdHJmdGltZSBmb3JtYXQgc3RyaW5nLCB3aXRoIGV4dGVuc2lvbnM6CisvLy8gICAtICVMIGlzIG1pbGxpczogMDAwLTk5OQorLy8vICAgLSAlZiBpcyBtaWNyb3M6IDAwMDAwMC05OTk5OTkKKy8vLyAgIC0gJU4gaXMgbmFub3M6IDAwMDAwMDAwMCAtIDk5OTk5OTk5OQorLy8vCisvLy8gSWYgbm8gb3B0aW9ucyBhcmUgZ2l2ZW4sIHRoZSBkZWZhdWx0IGZvcm1hdCBpcyAiJVktJW0tJWQgJUg6JU06JVMuJU4iLgordGVtcGxhdGUgPD4KK3N0cnVjdCBmb3JtYXRfcHJvdmlkZXI8c3lzOjpUaW1lUG9pbnQ8Pj4geworICBzdGF0aWMgdm9pZCBmb3JtYXQoY29uc3Qgc3lzOjpUaW1lUG9pbnQ8PiAmVFAsIGxsdm06OnJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTdHlsZSk7Cit9OworCisvLy8gSW1wbGVtZW50YXRpb24gb2YgZm9ybWF0X3Byb3ZpZGVyPFQ+IGZvciBkdXJhdGlvbiB0eXBlcy4KKy8vLworLy8vIFRoZSBvcHRpb25zIHN0cmluZyBvZiBhIGR1cmF0aW9uICB0eXBlIGhhcyB0aGUgZ3JhbW1hcjoKKy8vLworLy8vICAgZHVyYXRpb25fb3B0aW9ucyAgOjo9IFt1bml0XVtzaG93X3VuaXQgW251bWJlcl9vcHRpb25zXV0KKy8vLyAgIHVuaXQgICAgICAgICAgICAgIDo6PSBgaGB8YG1gfGBzYHxgbXN8YHVzYHxgbnNgCisvLy8gICBzaG93X3VuaXQgICAgICAgICA6Oj0gYCtgIHwgYC1gCisvLy8gICBudW1iZXJfb3B0aW9ucyAgICA6Oj0gb3B0aW9ucyBzdHJpbmcgZm9yIGEgaW50ZWdyYWwgb3IgZmxvYXRpbmcgcG9pbnQgdHlwZQorLy8vCisvLy8gICBFeGFtcGxlcworLy8vICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLy8gICB8ICBvcHRpb25zICB8IElucHV0IHwgT3V0cHV0ICAgIHwKKy8vLyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8vICAgfCAiIiAgICAgICAgfCAxcyAgICB8IDEgcyAgICAgICB8CisvLy8gICB8ICJtcyIgICAgICB8IDFzICAgIHwgMTAwMCBtcyAgIHwKKy8vLyAgIHwgIm1zLSIgICAgIHwgMXMgICAgfCAxMDAwICAgICAgfAorLy8vICAgfCAibXMtbiIgICAgfCAxcyAgICB8IDEsMDAwICAgICB8CisvLy8gICB8ICIiICAgICAgICB8IDEuMHMgIHwgMS4wMCBzICAgIHwKKy8vLyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8vCisvLy8gIElmIHRoZSB1bml0IG9mIHRoZSBkdXJhdGlvbiB0eXBlIGlzIG5vdCBvbmUgb2YgdGhlIHVuaXRzIHNwZWNpZmllZCBhYm92ZSwKKy8vLyAgaXQgaXMgc3RpbGwgcG9zc2libGUgdG8gZm9ybWF0IGl0LCBwcm92aWRlZCB5b3UgZXhwbGljaXRseSByZXF1ZXN0IGEKKy8vLyAgZGlzcGxheSB1bml0IG9yIHlvdSByZXF1ZXN0IHRoYXQgdGhlIHVuaXQgaXMgbm90IGRpc3BsYXllZC4KKworbmFtZXNwYWNlIGRldGFpbCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUGVyaW9kPiBzdHJ1Y3QgdW5pdCB7IHN0YXRpYyBjb25zdCBjaGFyIHZhbHVlW107IH07Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUGVyaW9kPiBjb25zdCBjaGFyIHVuaXQ8UGVyaW9kPjo6dmFsdWVbXSA9ICIiOworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgdW5pdDxzdGQ6OnJhdGlvPDM2MDA+PiB7IHN0YXRpYyBjb25zdCBjaGFyIHZhbHVlW107IH07Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgdW5pdDxzdGQ6OnJhdGlvPDYwPj4geyBzdGF0aWMgY29uc3QgY2hhciB2YWx1ZVtdOyB9OwordGVtcGxhdGUgPD4gc3RydWN0IHVuaXQ8c3RkOjpyYXRpbzwxPj4geyBzdGF0aWMgY29uc3QgY2hhciB2YWx1ZVtdOyB9OwordGVtcGxhdGUgPD4gc3RydWN0IHVuaXQ8c3RkOjptaWxsaT4geyBzdGF0aWMgY29uc3QgY2hhciB2YWx1ZVtdOyB9OwordGVtcGxhdGUgPD4gc3RydWN0IHVuaXQ8c3RkOjptaWNybz4geyBzdGF0aWMgY29uc3QgY2hhciB2YWx1ZVtdOyB9OwordGVtcGxhdGUgPD4gc3RydWN0IHVuaXQ8c3RkOjpuYW5vPiB7IHN0YXRpYyBjb25zdCBjaGFyIHZhbHVlW107IH07Cit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKKwordGVtcGxhdGUgPHR5cGVuYW1lIFJlcCwgdHlwZW5hbWUgUGVyaW9kPgorc3RydWN0IGZvcm1hdF9wcm92aWRlcjxzdGQ6OmNocm9ubzo6ZHVyYXRpb248UmVwLCBQZXJpb2Q+PiB7Citwcml2YXRlOgorICB0eXBlZGVmIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxSZXAsIFBlcmlvZD4gRHVyOworICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8CisgICAgICBzdGQ6OmNocm9ubzo6dHJlYXRfYXNfZmxvYXRpbmdfcG9pbnQ8UmVwPjo6dmFsdWUsIGRvdWJsZSwgaW50bWF4X3Q+Ojp0eXBlCisgICAgICBJbnRlcm5hbFJlcDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXNQZXJpb2Q+IHN0YXRpYyBJbnRlcm5hbFJlcCBnZXRBcyhjb25zdCBEdXIgJkQpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm87CisgICAgcmV0dXJuIGR1cmF0aW9uX2Nhc3Q8ZHVyYXRpb248SW50ZXJuYWxSZXAsIEFzUGVyaW9kPj4oRCkuY291bnQoKTsKKyAgfQorCisgIHN0YXRpYyBzdGQ6OnBhaXI8SW50ZXJuYWxSZXAsIFN0cmluZ1JlZj4gY29uc3VtZVVuaXQoU3RyaW5nUmVmICZTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHVyICZEKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vOworICAgIGlmIChTdHlsZS5jb25zdW1lX2Zyb250KCJucyIpKQorICAgICAgcmV0dXJuIHtnZXRBczxzdGQ6Om5hbm8+KEQpLCAibnMifTsKKyAgICBpZiAoU3R5bGUuY29uc3VtZV9mcm9udCgidXMiKSkKKyAgICAgIHJldHVybiB7Z2V0QXM8c3RkOjptaWNybz4oRCksICJ1cyJ9OworICAgIGlmIChTdHlsZS5jb25zdW1lX2Zyb250KCJtcyIpKQorICAgICAgcmV0dXJuIHtnZXRBczxzdGQ6Om1pbGxpPihEKSwgIm1zIn07CisgICAgaWYgKFN0eWxlLmNvbnN1bWVfZnJvbnQoInMiKSkKKyAgICAgIHJldHVybiB7Z2V0QXM8c3RkOjpyYXRpbzwxPj4oRCksICJzIn07CisgICAgaWYgKFN0eWxlLmNvbnN1bWVfZnJvbnQoIm0iKSkKKyAgICAgIHJldHVybiB7Z2V0QXM8c3RkOjpyYXRpbzw2MD4+KEQpLCAibSJ9OworICAgIGlmIChTdHlsZS5jb25zdW1lX2Zyb250KCJoIikpCisgICAgICByZXR1cm4ge2dldEFzPHN0ZDo6cmF0aW88MzYwMD4+KEQpLCAiaCJ9OworICAgIHJldHVybiB7RC5jb3VudCgpLCBkZXRhaWw6OnVuaXQ8UGVyaW9kPjo6dmFsdWV9OworICB9CisKKyAgc3RhdGljIGJvb2wgY29uc3VtZVNob3dVbml0KFN0cmluZ1JlZiAmU3R5bGUpIHsKKyAgICBpZiAoU3R5bGUuZW1wdHkoKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChTdHlsZS5jb25zdW1lX2Zyb250KCItIikpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKFN0eWxlLmNvbnN1bWVfZnJvbnQoIisiKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGFzc2VydCgwICYmICJVbnJlY29nbmlzZWQgZHVyYXRpb24gZm9ybWF0Iik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworcHVibGljOgorICBzdGF0aWMgdm9pZCBmb3JtYXQoY29uc3QgRHVyICZELCBsbHZtOjpyYXdfb3N0cmVhbSAmU3RyZWFtLCBTdHJpbmdSZWYgU3R5bGUpIHsKKyAgICBJbnRlcm5hbFJlcCBjb3VudDsKKyAgICBTdHJpbmdSZWYgdW5pdDsKKyAgICBzdGQ6OnRpZShjb3VudCwgdW5pdCkgPSBjb25zdW1lVW5pdChTdHlsZSwgRCk7CisgICAgYm9vbCBzaG93X3VuaXQgPSBjb25zdW1lU2hvd1VuaXQoU3R5bGUpOworCisgICAgZm9ybWF0X3Byb3ZpZGVyPEludGVybmFsUmVwPjo6Zm9ybWF0KGNvdW50LCBTdHJlYW0sIFN0eWxlKTsKKworICAgIGlmIChzaG93X3VuaXQpIHsKKyAgICAgIGFzc2VydCghdW5pdC5lbXB0eSgpKTsKKyAgICAgIFN0cmVhbSA8PCAiICIgPDwgdW5pdDsKKyAgICB9CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9DSFJPTk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvZGVHZW4uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Db2RlR2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY5ZTMzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Db2RlR2VuLmgKQEAgLTAsMCArMSw2MiBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvQ29kZUdlbi5oIC0gQ29kZUdlbiBDb25jZXB0cyAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lIHNvbWUgdHlwZXMgd2hpY2ggZGVmaW5lIGNvZGUgZ2VuZXJhdGlvbiBjb25jZXB0cy4gRm9yCisvLyBleGFtcGxlLCByZWxvY2F0aW9uIG1vZGVsLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0NPREVHRU5fSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQ09ERUdFTl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworICAvLyBSZWxvY2F0aW9uIG1vZGVsIHR5cGVzLgorICBuYW1lc3BhY2UgUmVsb2MgeworICBlbnVtIE1vZGVsIHsgU3RhdGljLCBQSUNfLCBEeW5hbWljTm9QSUMsIFJPUEksIFJXUEksIFJPUElfUldQSSB9OworICB9CisKKyAgLy8gQ29kZSBtb2RlbCB0eXBlcy4KKyAgbmFtZXNwYWNlIENvZGVNb2RlbCB7CisgICAgLy8gU3luYyBjaGFuZ2VzIHdpdGggQ29kZUdlbkNXcmFwcGVycy5oLgorICBlbnVtIE1vZGVsIHsgU21hbGwsIEtlcm5lbCwgTWVkaXVtLCBMYXJnZSB9OworICB9CisKKyAgbmFtZXNwYWNlIFBJQ0xldmVsIHsKKyAgICAvLyBUaGlzIGlzIHVzZWQgdG8gbWFwIC1mcGljLy1mUElDLgorICAgIGVudW0gTGV2ZWwgeyBOb3RQSUM9MCwgU21hbGxQSUM9MSwgQmlnUElDPTIgfTsKKyAgfQorCisgIG5hbWVzcGFjZSBQSUVMZXZlbCB7CisgICAgZW51bSBMZXZlbCB7IERlZmF1bHQ9MCwgU21hbGw9MSwgTGFyZ2U9MiB9OworICB9CisKKyAgLy8gVExTIG1vZGVscy4KKyAgbmFtZXNwYWNlIFRMU01vZGVsIHsKKyAgICBlbnVtIE1vZGVsIHsKKyAgICAgIEdlbmVyYWxEeW5hbWljLAorICAgICAgTG9jYWxEeW5hbWljLAorICAgICAgSW5pdGlhbEV4ZWMsCisgICAgICBMb2NhbEV4ZWMKKyAgICB9OworICB9CisKKyAgLy8gQ29kZSBnZW5lcmF0aW9uIG9wdGltaXphdGlvbiBsZXZlbC4KKyAgbmFtZXNwYWNlIENvZGVHZW5PcHQgeworICAgIGVudW0gTGV2ZWwgeworICAgICAgTm9uZSwgICAgICAgIC8vIC1PMAorICAgICAgTGVzcywgICAgICAgIC8vIC1PMQorICAgICAgRGVmYXVsdCwgICAgIC8vIC1PMiwgLU9zCisgICAgICBBZ2dyZXNzaXZlICAgLy8gLU8zCisgICAgfTsKKyAgfQorCit9ICAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ29kZUdlbkNvdmVyYWdlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ29kZUdlbkNvdmVyYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDViZDgzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Db2RlR2VuQ292ZXJhZ2UuaApAQCAtMCwwICsxLDM3IEBACisvLz09IGxsdm0vU3VwcG9ydC9Db2RlR2VuQ292ZXJhZ2UuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlIFRoaXMgZmlsZSBwcm92aWRlcyBydWxlIGNvdmVyYWdlIHRyYWNraW5nIGZvciB0YWJsZWdlbi1lcmF0ZWQgQ29kZUdlbi4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0NPREVHRU5DT1ZFUkFHRV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9DT0RFR0VOQ09WRVJBR0VfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgTWVtb3J5QnVmZmVyOworCitjbGFzcyBDb2RlR2VuQ292ZXJhZ2UgeworcHJvdGVjdGVkOgorICBCaXRWZWN0b3IgUnVsZUNvdmVyYWdlOworCitwdWJsaWM6CisgIENvZGVHZW5Db3ZlcmFnZSgpOworCisgIHZvaWQgc2V0Q292ZXJlZCh1aW50NjRfdCBSdWxlSUQpOworICBib29sIGlzQ292ZXJlZCh1aW50NjRfdCBSdWxlSUQpOworCisgIGJvb2wgcGFyc2UoTWVtb3J5QnVmZmVyICZCdWZmZXIsIFN0cmluZ1JlZiBCYWNrZW5kTmFtZSk7CisgIGJvb2wgZW1pdChTdHJpbmdSZWYgRmlsZVByZWZpeCwgU3RyaW5nUmVmIEJhY2tlbmROYW1lKSBjb25zdDsKKyAgdm9pZCByZXNldCgpOworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBpZm5kZWYgTExWTV9TVVBQT1JUX0NPREVHRU5DT1ZFUkFHRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNDNjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaApAQCAtMCwwICsxLDE5NDcgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCAtIENvbW1hbmQgbGluZSBoYW5kbGVyIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHByb2Nlc3NvciB0aGF0IGlzIHVzZWZ1bCB3aGVuCisvLyBjcmVhdGluZyBhIHRvb2wuICBJdCBwcm92aWRlcyBhIHNpbXBsZSwgbWluaW1hbGlzdGljIGludGVyZmFjZSB0aGF0IGlzIGVhc2lseQorLy8gZXh0ZW5zaWJsZSBhbmQgc3VwcG9ydHMgbm9ubG9jYWwgKGxpYnJhcnkpIGNvbW1hbmQgbGluZSBvcHRpb25zLgorLy8KKy8vIE5vdGUgdGhhdCByYXRoZXIgdGhhbiB0cnlpbmcgdG8gZmlndXJlIG91dCB3aGF0IHRoaXMgY29kZSBkb2VzLCB5b3Ugc2hvdWxkCisvLyByZWFkIHRoZSBsaWJyYXJ5IGRvY3VtZW50YXRpb24gbG9jYXRlZCBpbiBkb2NzL0NvbW1hbmRMaW5lLmh0bWwgb3IgbG9va3MgYXQKKy8vIHRoZSBtYW55IGV4YW1wbGUgdXNhZ2VzIGluIHRvb2xzLyovKi5jcHAKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9DT01NQU5ETElORV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9DT01NQU5ETElORV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWFuYWdlZFN0YXRpYy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFN0cmluZ1NhdmVyOworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vLyBjbCBOYW1lc3BhY2UgLSBUaGlzIG5hbWVzcGFjZSBjb250YWlucyBhbGwgb2YgdGhlIGNvbW1hbmQgbGluZSBvcHRpb24KKy8vLyBwcm9jZXNzaW5nIG1hY2hpbmVyeS4gIEl0IGlzIGludGVudGlvbmFsbHkgYSBzaG9ydCBuYW1lIHRvIG1ha2UgcXVhbGlmaWVkCisvLy8gdXNhZ2UgY29uY2lzZS4KK25hbWVzcGFjZSBjbCB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyAtIENvbW1hbmQgbGluZSBvcHRpb24gcHJvY2Vzc2luZyBlbnRyeSBwb2ludC4KKy8vCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgcHJpbnQgdGhlIGVycm9yIG1lc3NhZ2UgdG8KKy8vIHN0ZGVyciBhbmQgZXhpdCBpZiBccCBFcnJzIGlzIG5vdCBzZXQgKG51bGxwdHIgYnkgZGVmYXVsdCksIG9yIHByaW50IHRoZQorLy8gZXJyb3IgbWVzc2FnZSB0byBccCBFcnJzIGFuZCByZXR1cm4gZmFsc2UgaWYgXHAgRXJycyBpcyBwcm92aWRlZC4KK2Jvb2wgUGFyc2VDb21tYW5kTGluZU9wdGlvbnMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmNvbnN0ICphcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgT3ZlcnZpZXcgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gKkVycnMgPSBudWxscHRyKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBhcnNlRW52aXJvbm1lbnRPcHRpb25zIC0gRW52aXJvbm1lbnQgdmFyaWFibGUgb3B0aW9uIHByb2Nlc3NpbmcgYWx0ZXJuYXRlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5IHBvaW50LgorLy8KK3ZvaWQgUGFyc2VFbnZpcm9ubWVudE9wdGlvbnMoY29uc3QgY2hhciAqcHJvZ05hbWUsIGNvbnN0IGNoYXIgKmVudnZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqT3ZlcnZpZXcgPSAiIik7CisKKy8vIEZ1bmN0aW9uIHBvaW50ZXIgdHlwZSBmb3IgcHJpbnRpbmcgdmVyc2lvbiBpbmZvcm1hdGlvbi4KK3VzaW5nIFZlcnNpb25QcmludGVyVHkgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQocmF3X29zdHJlYW0gJik+OworCisvLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFNldFZlcnNpb25QcmludGVyIC0gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgKExMVk0gc3BlY2lmaWMpIHZlcnNpb24gcHJpbnRlcgorLy8vICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBwcmludCBvdXQgdGhlIHZlcnNpb24gd2hlbiAtLXZlcnNpb24gaXMgZ2l2ZW4KKy8vLyAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBjb21tYW5kIGxpbmUuIFRoaXMgYWxsb3dzIG90aGVyIHN5c3RlbXMgdXNpbmcgdGhlCisvLy8gICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZSB1dGlsaXRpZXMgdG8gcHJpbnQgdGhlaXIgb3duIHZlcnNpb24gc3RyaW5nLgordm9pZCBTZXRWZXJzaW9uUHJpbnRlcihWZXJzaW9uUHJpbnRlclR5IGZ1bmMpOworCisvLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEFkZEV4dHJhVmVyc2lvblByaW50ZXIgLSBBZGQgYW4gZXh0cmEgcHJpbnRlciB0byB1c2UgaW4gYWRkaXRpb24gdG8gdGhlCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgb25lLiBUaGlzIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMsCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlYWNoIHRpbWUgaXQgYWRkcyBhIG5ldyBmdW5jdGlvbiB0byB0aGUgbGlzdAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgYmFzaWMgTExWTSB2ZXJzaW9uCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aW5nIGlzIGNvbXBsZXRlLiBFYWNoIGNhbiB0aGVuIGFkZCBhZGRpdGlvbmFsCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSB0b29sLgordm9pZCBBZGRFeHRyYVZlcnNpb25QcmludGVyKFZlcnNpb25QcmludGVyVHkgZnVuYyk7CisKKy8vIFByaW50T3B0aW9uVmFsdWVzIC0gUHJpbnQgb3B0aW9uIHZhbHVlcy4KKy8vIFdpdGggLXByaW50LW9wdGlvbnMgcHJpbnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBvcHRpb24gdmFsdWVzIGFuZCBkZWZhdWx0cy4KKy8vIFdpdGggLXByaW50LWFsbC1vcHRpb25zIHByaW50IGFsbCBvcHRpb24gdmFsdWVzLgorLy8gKEN1cnJlbnRseSBub3QgcGVyZmVjdCwgYnV0IGJlc3QtZWZmb3J0LikKK3ZvaWQgUHJpbnRPcHRpb25WYWx1ZXMoKTsKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiAtIEFkZExpdGVyYWxPcHRpb24gbmVlZHMgdG8gYmUgdXAgaGVyZSB0byBtYWtlIGdjYyBoYXBweS4KK2NsYXNzIE9wdGlvbjsKKworLy8vIFxicmllZiBBZGRzIGEgbmV3IG9wdGlvbiBmb3IgcGFyc2luZyBhbmQgcHJvdmlkZXMgdGhlIG9wdGlvbiBpdCByZWZlcnMgdG8uCisvLy8KKy8vLyBccGFyYW0gTyBwb2ludGVyIHRvIHRoZSBvcHRpb24KKy8vLyBccGFyYW0gTmFtZSB0aGUgc3RyaW5nIG5hbWUgZm9yIHRoZSBvcHRpb24gdG8gaGFuZGxlIGR1cmluZyBwYXJzaW5nCisvLy8KKy8vLyBMaXRlcmFsIG9wdGlvbnMgYXJlIHVzZWQgYnkgc29tZSBwYXJzZXJzIHRvIHJlZ2lzdGVyIHNwZWNpYWwgb3B0aW9uIHZhbHVlcy4KKy8vLyBUaGlzIGlzIGhvdyB0aGUgUGFzc05hbWVQYXJzZXIgcmVnaXN0ZXJzIHBhc3MgbmFtZXMgZm9yIG9wdC4KK3ZvaWQgQWRkTGl0ZXJhbE9wdGlvbihPcHRpb24gJk8sIFN0cmluZ1JlZiBOYW1lKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZsYWdzIHBlcm1pdHRlZCB0byBiZSBwYXNzZWQgdG8gY29tbWFuZCBsaW5lIGFyZ3VtZW50cworLy8KKworZW51bSBOdW1PY2N1cnJlbmNlc0ZsYWcgeyAvLyBGbGFncyBmb3IgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBhbGxvd2VkCisgIE9wdGlvbmFsID0gMHgwMCwgICAgICAgIC8vIFplcm8gb3IgT25lIG9jY3VycmVuY2UKKyAgWmVyb09yTW9yZSA9IDB4MDEsICAgICAgLy8gWmVybyBvciBtb3JlIG9jY3VycmVuY2VzIGFsbG93ZWQKKyAgUmVxdWlyZWQgPSAweDAyLCAgICAgICAgLy8gT25lIG9jY3VycmVuY2UgcmVxdWlyZWQKKyAgT25lT3JNb3JlID0gMHgwMywgICAgICAgLy8gT25lIG9yIG1vcmUgb2NjdXJyZW5jZXMgcmVxdWlyZWQKKworICAvLyBDb25zdW1lQWZ0ZXIgLSBJbmRpY2F0ZXMgdGhhdCB0aGlzIG9wdGlvbiBpcyBmZWQgYW55dGhpbmcgdGhhdCBmb2xsb3dzIHRoZQorICAvLyBsYXN0IHBvc2l0aW9uYWwgYXJndW1lbnQgcmVxdWlyZWQgYnkgdGhlIGFwcGxpY2F0aW9uIChpdCBpcyBhbiBlcnJvciBpZgorICAvLyB0aGVyZSBhcmUgemVybyBwb3NpdGlvbmFsIGFyZ3VtZW50cywgYW5kIGEgQ29uc3VtZUFmdGVyIG9wdGlvbiBpcyB1c2VkKS4KKyAgLy8gVGh1cywgZm9yIGV4YW1wbGUsIGFsbCBhcmd1bWVudHMgdG8gTExJIGFyZSBwcm9jZXNzZWQgdW50aWwgYSBmaWxlbmFtZSBpcworICAvLyBmb3VuZC4gIE9uY2UgYSBmaWxlbmFtZSBpcyBmb3VuZCwgYWxsIG9mIHRoZSBzdWNjZWVkaW5nIGFyZ3VtZW50cyBhcmUKKyAgLy8gcGFzc2VkLCB1bnByb2Nlc3NlZCwgdG8gdGhlIENvbnN1bWVBZnRlciBvcHRpb24uCisgIC8vCisgIENvbnN1bWVBZnRlciA9IDB4MDQKK307CisKK2VudW0gVmFsdWVFeHBlY3RlZCB7IC8vIElzIGEgdmFsdWUgcmVxdWlyZWQgZm9yIHRoZSBvcHRpb24/CisgIC8vIHplcm8gcmVzZXJ2ZWQgZm9yIHRoZSB1bnNwZWNpZmllZCB2YWx1ZQorICBWYWx1ZU9wdGlvbmFsID0gMHgwMSwgIC8vIFRoZSB2YWx1ZSBjYW4gYXBwZWFyLi4uIG9yIG5vdAorICBWYWx1ZVJlcXVpcmVkID0gMHgwMiwgIC8vIFRoZSB2YWx1ZSBpcyByZXF1aXJlZCB0byBhcHBlYXIhCisgIFZhbHVlRGlzYWxsb3dlZCA9IDB4MDMgLy8gQSB2YWx1ZSBtYXkgbm90IGJlIHNwZWNpZmllZCAoZm9yIGZsYWdzKQorfTsKKworZW51bSBPcHRpb25IaWRkZW4geyAgIC8vIENvbnRyb2wgd2hldGhlciAtaGVscCBzaG93cyB0aGlzIG9wdGlvbgorICBOb3RIaWRkZW4gPSAweDAwLCAgIC8vIE9wdGlvbiBpbmNsdWRlZCBpbiAtaGVscCAmIC1oZWxwLWhpZGRlbgorICBIaWRkZW4gPSAweDAxLCAgICAgIC8vIC1oZWxwIGRvZXNuJ3QsIGJ1dCAtaGVscC1oaWRkZW4gZG9lcworICBSZWFsbHlIaWRkZW4gPSAweDAyIC8vIE5laXRoZXIgLWhlbHAgbm9yIC1oZWxwLWhpZGRlbiBzaG93IHRoaXMgYXJnCit9OworCisvLyBGb3JtYXR0aW5nIGZsYWdzIC0gVGhpcyBjb250cm9scyBzcGVjaWFsIGZlYXR1cmVzIHRoYXQgdGhlIG9wdGlvbiBtaWdodCBoYXZlCisvLyB0aGF0IGNhdXNlIGl0IHRvIGJlIHBhcnNlZCBkaWZmZXJlbnRseS4uLgorLy8KKy8vIFByZWZpeCAtIFRoaXMgb3B0aW9uIGFsbG93cyBhcmd1bWVudHMgdGhhdCBhcmUgb3RoZXJ3aXNlIHVucmVjb2duaXplZCB0byBiZQorLy8gbWF0Y2hlZCBieSBvcHRpb25zIHRoYXQgYXJlIGEgcHJlZml4IG9mIHRoZSBhY3R1YWwgdmFsdWUuICBUaGlzIGlzIHVzZWZ1bCBmb3IKKy8vIGNhc2VzIGxpa2UgYSBsaW5rZXIsIHdoZXJlIG9wdGlvbnMgYXJlIHR5cGljYWxseSBvZiB0aGUgZm9ybSAnLWxmb28nIG9yCisvLyAnLUwuLi8uLi9pbmNsdWRlJyB3aGVyZSAtbCBvciAtTCBhcmUgdGhlIGFjdHVhbCBmbGFncy4gIFdoZW4gcHJlZml4IGlzCisvLyBlbmFibGVkLCBhbmQgdXNlZCwgdGhlIHZhbHVlIGZvciB0aGUgZmxhZyBjb21lcyBmcm9tIHRoZSBzdWZmaXggb2YgdGhlCisvLyBhcmd1bWVudC4KKy8vCisvLyBHcm91cGluZyAtIFdpdGggdGhpcyBvcHRpb24gZW5hYmxlZCwgbXVsdGlwbGUgbGV0dGVyIG9wdGlvbnMgYXJlIGFsbG93ZWQgdG8KKy8vIGJ1bmNoIHRvZ2V0aGVyIHdpdGggb25seSBhIHNpbmdsZSBoeXBoZW4gZm9yIHRoZSB3aG9sZSBncm91cC4gIFRoaXMgYWxsb3dzCisvLyBlbXVsYXRpb24gb2YgdGhlIGJlaGF2aW9yIHRoYXQgbHMgdXNlcyBmb3IgZXhhbXBsZTogbHMgLWxhID09PSBscyAtbCAtYQorLy8KKworZW51bSBGb3JtYXR0aW5nRmxhZ3MgeworICBOb3JtYWxGb3JtYXR0aW5nID0gMHgwMCwgLy8gTm90aGluZyBzcGVjaWFsCisgIFBvc2l0aW9uYWwgPSAweDAxLCAgICAgICAvLyBJcyBhIHBvc2l0aW9uYWwgYXJndW1lbnQsIG5vICctJyByZXF1aXJlZAorICBQcmVmaXggPSAweDAyLCAgICAgICAgICAgLy8gQ2FuIHRoaXMgb3B0aW9uIGRpcmVjdGx5IHByZWZpeCBpdHMgdmFsdWU/CisgIEdyb3VwaW5nID0gMHgwMyAgICAgICAgICAvLyBDYW4gdGhpcyBvcHRpb24gZ3JvdXAgd2l0aCBvdGhlciBvcHRpb25zPworfTsKKworZW51bSBNaXNjRmxhZ3MgeyAgICAgICAgICAgICAvLyBNaXNjZWxsYW5lb3VzIGZsYWdzIHRvIGFkanVzdCBhcmd1bWVudAorICBDb21tYVNlcGFyYXRlZCA9IDB4MDEsICAgICAvLyBTaG91bGQgdGhpcyBjbDo6bGlzdCBzcGxpdCBiZXR3ZWVuIGNvbW1hcz8KKyAgUG9zaXRpb25hbEVhdHNBcmdzID0gMHgwMiwgLy8gU2hvdWxkIHRoaXMgcG9zaXRpb25hbCBjbDo6bGlzdCBlYXQgLWFyZ3M/CisgIFNpbmsgPSAweDA0ICAgICAgICAgICAgICAgIC8vIFNob3VsZCB0aGlzIGNsOjpsaXN0IGVhdCBhbGwgdW5rbm93biBvcHRpb25zPworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE9wdGlvbiBDYXRlZ29yeSBjbGFzcworLy8KK2NsYXNzIE9wdGlvbkNhdGVnb3J5IHsKK3ByaXZhdGU6CisgIFN0cmluZ1JlZiBjb25zdCBOYW1lOworICBTdHJpbmdSZWYgY29uc3QgRGVzY3JpcHRpb247CisKKyAgdm9pZCByZWdpc3RlckNhdGVnb3J5KCk7CisKK3B1YmxpYzoKKyAgT3B0aW9uQ2F0ZWdvcnkoU3RyaW5nUmVmIGNvbnN0IE5hbWUsCisgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBjb25zdCBEZXNjcmlwdGlvbiA9ICIiKQorICAgICAgOiBOYW1lKE5hbWUpLCBEZXNjcmlwdGlvbihEZXNjcmlwdGlvbikgeworICAgIHJlZ2lzdGVyQ2F0ZWdvcnkoKTsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorICBTdHJpbmdSZWYgZ2V0RGVzY3JpcHRpb24oKSBjb25zdCB7IHJldHVybiBEZXNjcmlwdGlvbjsgfQorfTsKKworLy8gVGhlIGdlbmVyYWwgT3B0aW9uIENhdGVnb3J5ICh1c2VkIGFzIGRlZmF1bHQgY2F0ZWdvcnkpLgorZXh0ZXJuIE9wdGlvbkNhdGVnb3J5IEdlbmVyYWxDYXRlZ29yeTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFN1YkNvbW1hbmQgY2xhc3MKKy8vCitjbGFzcyBTdWJDb21tYW5kIHsKK3ByaXZhdGU6CisgIFN0cmluZ1JlZiBOYW1lOworICBTdHJpbmdSZWYgRGVzY3JpcHRpb247CisKK3Byb3RlY3RlZDoKKyAgdm9pZCByZWdpc3RlclN1YkNvbW1hbmQoKTsKKyAgdm9pZCB1bnJlZ2lzdGVyU3ViQ29tbWFuZCgpOworCitwdWJsaWM6CisgIFN1YkNvbW1hbmQoU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBEZXNjcmlwdGlvbiA9ICIiKQorICAgICAgOiBOYW1lKE5hbWUpLCBEZXNjcmlwdGlvbihEZXNjcmlwdGlvbikgeworICAgICAgICByZWdpc3RlclN1YkNvbW1hbmQoKTsKKyAgfQorICBTdWJDb21tYW5kKCkgPSBkZWZhdWx0OworCisgIHZvaWQgcmVzZXQoKTsKKworICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3Q7CisKKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisgIFN0cmluZ1JlZiBnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsgcmV0dXJuIERlc2NyaXB0aW9uOyB9CisKKyAgU21hbGxWZWN0b3I8T3B0aW9uICosIDQ+IFBvc2l0aW9uYWxPcHRzOworICBTbWFsbFZlY3RvcjxPcHRpb24gKiwgND4gU2lua09wdHM7CisgIFN0cmluZ01hcDxPcHRpb24gKj4gT3B0aW9uc01hcDsKKworICBPcHRpb24gKkNvbnN1bWVBZnRlck9wdCA9IG51bGxwdHI7IC8vIFRoZSBDb25zdW1lQWZ0ZXIgb3B0aW9uIGlmIGl0IGV4aXN0cy4KK307CisKKy8vIEEgc3BlY2lhbCBzdWJjb21tYW5kIHJlcHJlc2VudGluZyBubyBzdWJjb21tYW5kCitleHRlcm4gTWFuYWdlZFN0YXRpYzxTdWJDb21tYW5kPiBUb3BMZXZlbFN1YkNvbW1hbmQ7CisKKy8vIEEgc3BlY2lhbCBzdWJjb21tYW5kIHRoYXQgY2FuIGJlIHVzZWQgdG8gcHV0IGFuIG9wdGlvbiBpbnRvIGFsbCBzdWJjb21tYW5kcy4KK2V4dGVybiBNYW5hZ2VkU3RhdGljPFN1YkNvbW1hbmQ+IEFsbFN1YkNvbW1hbmRzOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gT3B0aW9uIEJhc2UgY2xhc3MKKy8vCitjbGFzcyBPcHRpb24geworICBmcmllbmQgY2xhc3MgYWxpYXM7CisKKyAgLy8gaGFuZGxlT2NjdXJyZW5jZXMgLSBPdmVycmlkZW4gYnkgc3ViY2xhc3NlcyB0byBoYW5kbGUgdGhlIHZhbHVlIHBhc3NlZCBpbnRvCisgIC8vIGFuIGFyZ3VtZW50LiAgU2hvdWxkIHJldHVybiB0cnVlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBwcm9jZXNzaW5nIHRoZQorICAvLyBhcmd1bWVudCBhbmQgdGhlIHByb2dyYW0gc2hvdWxkIGV4aXQuCisgIC8vCisgIHZpcnR1YWwgYm9vbCBoYW5kbGVPY2N1cnJlbmNlKHVuc2lnbmVkIHBvcywgU3RyaW5nUmVmIEFyZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBBcmcpID0gMDsKKworICB2aXJ0dWFsIGVudW0gVmFsdWVFeHBlY3RlZCBnZXRWYWx1ZUV4cGVjdGVkRmxhZ0RlZmF1bHQoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlT3B0aW9uYWw7CisgIH0KKworICAvLyBPdXQgb2YgbGluZSB2aXJ0dWFsIGZ1bmN0aW9uIHRvIHByb3ZpZGUgaG9tZSBmb3IgdGhlIGNsYXNzLgorICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKKyAgaW50IE51bU9jY3VycmVuY2VzID0gMDsgLy8gVGhlIG51bWJlciBvZiB0aW1lcyBzcGVjaWZpZWQKKyAgLy8gT2NjdXJyZW5jZXMsIEhpZGRlbkZsYWcsIGFuZCBGb3JtYXR0aW5nIGFyZSBhbGwgZW51bSB0eXBlcyBidXQgdG8gYXZvaWQKKyAgLy8gcHJvYmxlbXMgd2l0aCBzaWduZWQgZW51bXMgaW4gYml0ZmllbGRzLgorICB1bnNpZ25lZCBPY2N1cnJlbmNlcyA6IDM7IC8vIGVudW0gTnVtT2NjdXJyZW5jZXNGbGFnCisgIC8vIG5vdCB1c2luZyB0aGUgZW51bSB0eXBlIGZvciAnVmFsdWUnIGJlY2F1c2UgemVybyBpcyBhbiBpbXBsZW1lbnRhdGlvbgorICAvLyBkZXRhaWwgcmVwcmVzZW50aW5nIHRoZSBub24tdmFsdWUKKyAgdW5zaWduZWQgVmFsdWUgOiAyOworICB1bnNpZ25lZCBIaWRkZW5GbGFnIDogMjsgLy8gZW51bSBPcHRpb25IaWRkZW4KKyAgdW5zaWduZWQgRm9ybWF0dGluZyA6IDI7IC8vIGVudW0gRm9ybWF0dGluZ0ZsYWdzCisgIHVuc2lnbmVkIE1pc2MgOiAzOworICB1bnNpZ25lZCBQb3NpdGlvbiA9IDA7ICAgICAgIC8vIFBvc2l0aW9uIG9mIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUgb3B0aW9uCisgIHVuc2lnbmVkIEFkZGl0aW9uYWxWYWxzID0gMDsgLy8gR3JlYXRlciB0aGFuIDAgZm9yIG11bHRpLXZhbHVlZCBvcHRpb24uCisKK3B1YmxpYzoKKyAgU3RyaW5nUmVmIEFyZ1N0cjsgICAvLyBUaGUgYXJndW1lbnQgc3RyaW5nIGl0c2VsZiAoZXg6ICJoZWxwIiwgIm8iKQorICBTdHJpbmdSZWYgSGVscFN0cjsgIC8vIFRoZSBkZXNjcmlwdGl2ZSB0ZXh0IG1lc3NhZ2UgZm9yIC1oZWxwCisgIFN0cmluZ1JlZiBWYWx1ZVN0cjsgLy8gU3RyaW5nIGRlc2NyaWJpbmcgd2hhdCB0aGUgdmFsdWUgb2YgdGhpcyBvcHRpb24gaXMKKyAgT3B0aW9uQ2F0ZWdvcnkgKkNhdGVnb3J5OyAvLyBUaGUgQ2F0ZWdvcnkgdGhpcyBvcHRpb24gYmVsb25ncyB0bworICBTbWFsbFB0clNldDxTdWJDb21tYW5kICosIDQ+IFN1YnM7IC8vIFRoZSBzdWJjb21tYW5kcyB0aGlzIG9wdGlvbiBiZWxvbmdzIHRvLgorICBib29sIEZ1bGx5SW5pdGlhbGl6ZWQgPSBmYWxzZTsgLy8gSGFzIGFkZEFyZ3VtZW50IGJlZW4gY2FsbGVkPworCisgIGlubGluZSBlbnVtIE51bU9jY3VycmVuY2VzRmxhZyBnZXROdW1PY2N1cnJlbmNlc0ZsYWcoKSBjb25zdCB7CisgICAgcmV0dXJuIChlbnVtIE51bU9jY3VycmVuY2VzRmxhZylPY2N1cnJlbmNlczsKKyAgfQorCisgIGlubGluZSBlbnVtIFZhbHVlRXhwZWN0ZWQgZ2V0VmFsdWVFeHBlY3RlZEZsYWcoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlID8gKChlbnVtIFZhbHVlRXhwZWN0ZWQpVmFsdWUpIDogZ2V0VmFsdWVFeHBlY3RlZEZsYWdEZWZhdWx0KCk7CisgIH0KKworICBpbmxpbmUgZW51bSBPcHRpb25IaWRkZW4gZ2V0T3B0aW9uSGlkZGVuRmxhZygpIGNvbnN0IHsKKyAgICByZXR1cm4gKGVudW0gT3B0aW9uSGlkZGVuKUhpZGRlbkZsYWc7CisgIH0KKworICBpbmxpbmUgZW51bSBGb3JtYXR0aW5nRmxhZ3MgZ2V0Rm9ybWF0dGluZ0ZsYWcoKSBjb25zdCB7CisgICAgcmV0dXJuIChlbnVtIEZvcm1hdHRpbmdGbGFncylGb3JtYXR0aW5nOworICB9CisKKyAgaW5saW5lIHVuc2lnbmVkIGdldE1pc2NGbGFncygpIGNvbnN0IHsgcmV0dXJuIE1pc2M7IH0KKyAgaW5saW5lIHVuc2lnbmVkIGdldFBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gUG9zaXRpb247IH0KKyAgaW5saW5lIHVuc2lnbmVkIGdldE51bUFkZGl0aW9uYWxWYWxzKCkgY29uc3QgeyByZXR1cm4gQWRkaXRpb25hbFZhbHM7IH0KKworICAvLyBoYXNBcmdTdHIgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXJnc3RyICE9ICIiCisgIGJvb2wgaGFzQXJnU3RyKCkgY29uc3QgeyByZXR1cm4gIUFyZ1N0ci5lbXB0eSgpOyB9CisgIGJvb2wgaXNQb3NpdGlvbmFsKCkgY29uc3QgeyByZXR1cm4gZ2V0Rm9ybWF0dGluZ0ZsYWcoKSA9PSBjbDo6UG9zaXRpb25hbDsgfQorICBib29sIGlzU2luaygpIGNvbnN0IHsgcmV0dXJuIGdldE1pc2NGbGFncygpICYgY2w6OlNpbms7IH0KKworICBib29sIGlzQ29uc3VtZUFmdGVyKCkgY29uc3QgeworICAgIHJldHVybiBnZXROdW1PY2N1cnJlbmNlc0ZsYWcoKSA9PSBjbDo6Q29uc3VtZUFmdGVyOworICB9CisKKyAgYm9vbCBpc0luQWxsU3ViQ29tbWFuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGFueV9vZihTdWJzLCBbXShjb25zdCBTdWJDb21tYW5kICpTQykgeworICAgICAgcmV0dXJuIFNDID09ICYqQWxsU3ViQ29tbWFuZHM7CisgICAgfSk7CisgIH0KKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAgLy8gQWNjZXNzb3IgZnVuY3Rpb25zIHNldCBieSBPcHRpb25Nb2RpZmllcnMKKyAgLy8KKyAgdm9pZCBzZXRBcmdTdHIoU3RyaW5nUmVmIFMpOworICB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZ1JlZiBTKSB7IEhlbHBTdHIgPSBTOyB9CisgIHZvaWQgc2V0VmFsdWVTdHIoU3RyaW5nUmVmIFMpIHsgVmFsdWVTdHIgPSBTOyB9CisgIHZvaWQgc2V0TnVtT2NjdXJyZW5jZXNGbGFnKGVudW0gTnVtT2NjdXJyZW5jZXNGbGFnIFZhbCkgeyBPY2N1cnJlbmNlcyA9IFZhbDsgfQorICB2b2lkIHNldFZhbHVlRXhwZWN0ZWRGbGFnKGVudW0gVmFsdWVFeHBlY3RlZCBWYWwpIHsgVmFsdWUgPSBWYWw7IH0KKyAgdm9pZCBzZXRIaWRkZW5GbGFnKGVudW0gT3B0aW9uSGlkZGVuIFZhbCkgeyBIaWRkZW5GbGFnID0gVmFsOyB9CisgIHZvaWQgc2V0Rm9ybWF0dGluZ0ZsYWcoZW51bSBGb3JtYXR0aW5nRmxhZ3MgVikgeyBGb3JtYXR0aW5nID0gVjsgfQorICB2b2lkIHNldE1pc2NGbGFnKGVudW0gTWlzY0ZsYWdzIE0pIHsgTWlzYyB8PSBNOyB9CisgIHZvaWQgc2V0UG9zaXRpb24odW5zaWduZWQgcG9zKSB7IFBvc2l0aW9uID0gcG9zOyB9CisgIHZvaWQgc2V0Q2F0ZWdvcnkoT3B0aW9uQ2F0ZWdvcnkgJkMpIHsgQ2F0ZWdvcnkgPSAmQzsgfQorICB2b2lkIGFkZFN1YkNvbW1hbmQoU3ViQ29tbWFuZCAmUykgeyBTdWJzLmluc2VydCgmUyk7IH0KKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBPcHRpb24oZW51bSBOdW1PY2N1cnJlbmNlc0ZsYWcgT2NjdXJyZW5jZXNGbGFnLAorICAgICAgICAgICAgICAgICAgZW51bSBPcHRpb25IaWRkZW4gSGlkZGVuKQorICAgICAgOiBPY2N1cnJlbmNlcyhPY2N1cnJlbmNlc0ZsYWcpLCBWYWx1ZSgwKSwgSGlkZGVuRmxhZyhIaWRkZW4pLAorICAgICAgICBGb3JtYXR0aW5nKE5vcm1hbEZvcm1hdHRpbmcpLCBNaXNjKDApLCBDYXRlZ29yeSgmR2VuZXJhbENhdGVnb3J5KSB7fQorCisgIGlubGluZSB2b2lkIHNldE51bUFkZGl0aW9uYWxWYWxzKHVuc2lnbmVkIG4pIHsgQWRkaXRpb25hbFZhbHMgPSBuOyB9CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+T3B0aW9uKCkgPSBkZWZhdWx0OworCisgIC8vIGFkZEFyZ3VtZW50IC0gUmVnaXN0ZXIgdGhpcyBhcmd1bWVudCB3aXRoIHRoZSBjb21tYW5kbGluZSBzeXN0ZW0uCisgIC8vCisgIHZvaWQgYWRkQXJndW1lbnQoKTsKKworICAvLy8gVW5yZWdpc3RlcnMgdGhpcyBvcHRpb24gZnJvbSB0aGUgQ29tbWFuZExpbmUgc3lzdGVtLgorICAvLy8KKyAgLy8vIFRoaXMgb3B0aW9uIG11c3QgaGF2ZSBiZWVuIHRoZSBsYXN0IG9wdGlvbiByZWdpc3RlcmVkLgorICAvLy8gRm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4KKyAgdm9pZCByZW1vdmVBcmd1bWVudCgpOworCisgIC8vIFJldHVybiB0aGUgd2lkdGggb2YgdGhlIG9wdGlvbiB0YWcgZm9yIHByaW50aW5nLi4uCisgIHZpcnR1YWwgc2l6ZV90IGdldE9wdGlvbldpZHRoKCkgY29uc3QgPSAwOworCisgIC8vIHByaW50T3B0aW9uSW5mbyAtIFByaW50IG91dCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG9wdGlvbi4gIFRoZQorICAvLyB0by1iZS1tYWludGFpbmVkIHdpZHRoIGlzIHNwZWNpZmllZC4KKyAgLy8KKyAgdmlydHVhbCB2b2lkIHByaW50T3B0aW9uSW5mbyhzaXplX3QgR2xvYmFsV2lkdGgpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHZvaWQgcHJpbnRPcHRpb25WYWx1ZShzaXplX3QgR2xvYmFsV2lkdGgsIGJvb2wgRm9yY2UpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHZvaWQgc2V0RGVmYXVsdCgpID0gMDsKKworICBzdGF0aWMgdm9pZCBwcmludEhlbHBTdHIoU3RyaW5nUmVmIEhlbHBTdHIsIHNpemVfdCBJbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgRmlyc3RMaW5lSW5kZW50ZWRCeSk7CisKKyAgdmlydHVhbCB2b2lkIGdldEV4dHJhT3B0aW9uTmFtZXMoU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gJikge30KKworICAvLyBhZGRPY2N1cnJlbmNlIC0gV3JhcHBlciBhcm91bmQgaGFuZGxlT2NjdXJyZW5jZSB0aGF0IGVuZm9yY2VzIEZsYWdzLgorICAvLworICB2aXJ0dWFsIGJvb2wgYWRkT2NjdXJyZW5jZSh1bnNpZ25lZCBwb3MsIFN0cmluZ1JlZiBBcmdOYW1lLCBTdHJpbmdSZWYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTXVsdGlBcmcgPSBmYWxzZSk7CisKKyAgLy8gUHJpbnRzIG9wdGlvbiBuYW1lIGZvbGxvd2VkIGJ5IG1lc3NhZ2UuICBBbHdheXMgcmV0dXJucyB0cnVlLgorICBib29sIGVycm9yKGNvbnN0IFR3aW5lICZNZXNzYWdlLCBTdHJpbmdSZWYgQXJnTmFtZSA9IFN0cmluZ1JlZigpKTsKKworICBpbmxpbmUgaW50IGdldE51bU9jY3VycmVuY2VzKCkgY29uc3QgeyByZXR1cm4gTnVtT2NjdXJyZW5jZXM7IH0KKyAgaW5saW5lIHZvaWQgcmVzZXQoKSB7IE51bU9jY3VycmVuY2VzID0gMDsgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENvbW1hbmQgbGluZSBvcHRpb24gbW9kaWZpZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IHRoZSBiZWhhdmlvciBvZgorLy8gY29tbWFuZCBsaW5lIG9wdGlvbiBwYXJzZXJzLi4uCisvLworCisvLyBkZXNjIC0gTW9kaWZpZXIgdG8gc2V0IHRoZSBkZXNjcmlwdGlvbiBzaG93biBpbiB0aGUgLWhlbHAgb3V0cHV0Li4uCitzdHJ1Y3QgZGVzYyB7CisgIFN0cmluZ1JlZiBEZXNjOworCisgIGRlc2MoU3RyaW5nUmVmIFN0cikgOiBEZXNjKFN0cikge30KKworICB2b2lkIGFwcGx5KE9wdGlvbiAmTykgY29uc3QgeyBPLnNldERlc2NyaXB0aW9uKERlc2MpOyB9Cit9OworCisvLyB2YWx1ZV9kZXNjIC0gTW9kaWZpZXIgdG8gc2V0IHRoZSB2YWx1ZSBkZXNjcmlwdGlvbiBzaG93biBpbiB0aGUgLWhlbHAKKy8vIG91dHB1dC4uLgorc3RydWN0IHZhbHVlX2Rlc2MgeworICBTdHJpbmdSZWYgRGVzYzsKKworICB2YWx1ZV9kZXNjKFN0cmluZ1JlZiBTdHIpIDogRGVzYyhTdHIpIHt9CisKKyAgdm9pZCBhcHBseShPcHRpb24gJk8pIGNvbnN0IHsgTy5zZXRWYWx1ZVN0cihEZXNjKTsgfQorfTsKKworLy8gaW5pdCAtIFNwZWNpZnkgYSBkZWZhdWx0IChpbml0aWFsKSB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCwgaWYKKy8vIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvciB0aGUgYXJndW1lbnQgdHlwZSBkb2VzIG5vdCBnaXZlIHlvdSB3aGF0IHlvdQorLy8gd2FudC4gIFRoaXMgaXMgb25seSB2YWxpZCBvbiAib3B0IiBhcmd1bWVudHMsIG5vdCBvbiAibGlzdCIgYXJndW1lbnRzLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBUeT4gc3RydWN0IGluaXRpYWxpemVyIHsKKyAgY29uc3QgVHkgJkluaXQ7CisgIGluaXRpYWxpemVyKGNvbnN0IFR5ICZWYWwpIDogSW5pdChWYWwpIHt9CisKKyAgdGVtcGxhdGUgPGNsYXNzIE9wdD4gdm9pZCBhcHBseShPcHQgJk8pIGNvbnN0IHsgTy5zZXRJbml0aWFsVmFsdWUoSW5pdCk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBUeT4gaW5pdGlhbGl6ZXI8VHk+IGluaXQoY29uc3QgVHkgJlZhbCkgeworICByZXR1cm4gaW5pdGlhbGl6ZXI8VHk+KFZhbCk7Cit9CisKKy8vIGxvY2F0aW9uIC0gQWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSB3aGljaCBleHRlcm5hbCB2YXJpYWJsZSB0aGV5IHdhbnQgdG8KKy8vIHN0b3JlIHRoZSByZXN1bHRzIG9mIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgcHJvY2Vzc2luZyBpbnRvLCBpZiB0aGV5IGRvbid0CisvLyB3YW50IHRvIHN0b3JlIGl0IGluIHRoZSBvcHRpb24gaXRzZWxmLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBUeT4gc3RydWN0IExvY2F0aW9uQ2xhc3MgeworICBUeSAmTG9jOworCisgIExvY2F0aW9uQ2xhc3MoVHkgJkwpIDogTG9jKEwpIHt9CisKKyAgdGVtcGxhdGUgPGNsYXNzIE9wdD4gdm9pZCBhcHBseShPcHQgJk8pIGNvbnN0IHsgTy5zZXRMb2NhdGlvbihPLCBMb2MpOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVHk+IExvY2F0aW9uQ2xhc3M8VHk+IGxvY2F0aW9uKFR5ICZMKSB7CisgIHJldHVybiBMb2NhdGlvbkNsYXNzPFR5PihMKTsKK30KKworLy8gY2F0IC0gU3BlY2lmaXkgdGhlIE9wdGlvbiBjYXRlZ29yeSBmb3IgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCB0byBiZWxvbmcKKy8vIHRvLgorc3RydWN0IGNhdCB7CisgIE9wdGlvbkNhdGVnb3J5ICZDYXRlZ29yeTsKKworICBjYXQoT3B0aW9uQ2F0ZWdvcnkgJmMpIDogQ2F0ZWdvcnkoYykge30KKworICB0ZW1wbGF0ZSA8Y2xhc3MgT3B0PiB2b2lkIGFwcGx5KE9wdCAmTykgY29uc3QgeyBPLnNldENhdGVnb3J5KENhdGVnb3J5KTsgfQorfTsKKworLy8gc3ViIC0gU3BlY2lmeSB0aGUgc3ViY29tbWFuZCB0aGF0IHRoaXMgb3B0aW9uIGJlbG9uZ3MgdG8uCitzdHJ1Y3Qgc3ViIHsKKyAgU3ViQ29tbWFuZCAmU3ViOworCisgIHN1YihTdWJDb21tYW5kICZTKSA6IFN1YihTKSB7fQorCisgIHRlbXBsYXRlIDxjbGFzcyBPcHQ+IHZvaWQgYXBwbHkoT3B0ICZPKSBjb25zdCB7IE8uYWRkU3ViQ29tbWFuZChTdWIpOyB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gT3B0aW9uVmFsdWUgY2xhc3MKKworLy8gU3VwcG9ydCB2YWx1ZSBjb21wYXJpc29uIG91dHNpZGUgdGhlIHRlbXBsYXRlLgorc3RydWN0IEdlbmVyaWNPcHRpb25WYWx1ZSB7CisgIHZpcnR1YWwgYm9vbCBjb21wYXJlKGNvbnN0IEdlbmVyaWNPcHRpb25WYWx1ZSAmVikgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgIEdlbmVyaWNPcHRpb25WYWx1ZSgpID0gZGVmYXVsdDsKKyAgR2VuZXJpY09wdGlvblZhbHVlKGNvbnN0IEdlbmVyaWNPcHRpb25WYWx1ZSYpID0gZGVmYXVsdDsKKyAgR2VuZXJpY09wdGlvblZhbHVlICZvcGVyYXRvcj0oY29uc3QgR2VuZXJpY09wdGlvblZhbHVlICYpID0gZGVmYXVsdDsKKyAgfkdlbmVyaWNPcHRpb25WYWx1ZSgpID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIERhdGFUeXBlPiBzdHJ1Y3QgT3B0aW9uVmFsdWU7CisKKy8vIFRoZSBkZWZhdWx0IHZhbHVlIHNhZmVseSBkb2VzIG5vdGhpbmcuIE9wdGlvbiB2YWx1ZSBwcmludGluZyBpcyBvbmx5CisvLyBiZXN0LWVmZm9ydC4KK3RlbXBsYXRlIDxjbGFzcyBEYXRhVHlwZSwgYm9vbCBpc0NsYXNzPgorc3RydWN0IE9wdGlvblZhbHVlQmFzZSA6IHB1YmxpYyBHZW5lcmljT3B0aW9uVmFsdWUgeworICAvLyBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgYXJndW1lbnQgcGFzc2luZy4KKyAgdXNpbmcgV3JhcHBlclR5cGUgPSBPcHRpb25WYWx1ZTxEYXRhVHlwZT47CisKKyAgYm9vbCBoYXNWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgY29uc3QgRGF0YVR5cGUgJmdldFZhbHVlKCkgY29uc3QgeyBsbHZtX3VucmVhY2hhYmxlKCJubyBkZWZhdWx0IHZhbHVlIik7IH0KKworICAvLyBTb21lIG9wdGlvbnMgbWF5IHRha2UgdGhlaXIgdmFsdWUgZnJvbSBhIGRpZmZlcmVudCBkYXRhIHR5cGUuCisgIHRlbXBsYXRlIDxjbGFzcyBEVD4gdm9pZCBzZXRWYWx1ZShjb25zdCBEVCAmIC8qViovKSB7fQorCisgIGJvb2wgY29tcGFyZShjb25zdCBEYXRhVHlwZSAmIC8qViovKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIGJvb2wgY29tcGFyZShjb25zdCBHZW5lcmljT3B0aW9uVmFsdWUgJiAvKlYqLykgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIH5PcHRpb25WYWx1ZUJhc2UoKSA9IGRlZmF1bHQ7Cit9OworCisvLyBTaW1wbGUgY29weSBvZiB0aGUgb3B0aW9uIHZhbHVlLgordGVtcGxhdGUgPGNsYXNzIERhdGFUeXBlPiBjbGFzcyBPcHRpb25WYWx1ZUNvcHkgOiBwdWJsaWMgR2VuZXJpY09wdGlvblZhbHVlIHsKKyAgRGF0YVR5cGUgVmFsdWU7CisgIGJvb2wgVmFsaWQgPSBmYWxzZTsKKworcHJvdGVjdGVkOgorICBPcHRpb25WYWx1ZUNvcHkoY29uc3QgT3B0aW9uVmFsdWVDb3B5JikgPSBkZWZhdWx0OworICBPcHRpb25WYWx1ZUNvcHkgJm9wZXJhdG9yPShjb25zdCBPcHRpb25WYWx1ZUNvcHkgJikgPSBkZWZhdWx0OworICB+T3B0aW9uVmFsdWVDb3B5KCkgPSBkZWZhdWx0OworCitwdWJsaWM6CisgIE9wdGlvblZhbHVlQ29weSgpID0gZGVmYXVsdDsKKworICBib29sIGhhc1ZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsaWQ7IH0KKworICBjb25zdCBEYXRhVHlwZSAmZ2V0VmFsdWUoKSBjb25zdCB7CisgICAgYXNzZXJ0KFZhbGlkICYmICJpbnZhbGlkIG9wdGlvbiB2YWx1ZSIpOworICAgIHJldHVybiBWYWx1ZTsKKyAgfQorCisgIHZvaWQgc2V0VmFsdWUoY29uc3QgRGF0YVR5cGUgJlYpIHsKKyAgICBWYWxpZCA9IHRydWU7CisgICAgVmFsdWUgPSBWOworICB9CisKKyAgYm9vbCBjb21wYXJlKGNvbnN0IERhdGFUeXBlICZWKSBjb25zdCB7IHJldHVybiBWYWxpZCAmJiAoVmFsdWUgIT0gVik7IH0KKworICBib29sIGNvbXBhcmUoY29uc3QgR2VuZXJpY09wdGlvblZhbHVlICZWKSBjb25zdCBvdmVycmlkZSB7CisgICAgY29uc3QgT3B0aW9uVmFsdWVDb3B5PERhdGFUeXBlPiAmVkMgPQorICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBPcHRpb25WYWx1ZUNvcHk8RGF0YVR5cGU+ICY+KFYpOworICAgIGlmICghVkMuaGFzVmFsdWUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gY29tcGFyZShWQy5nZXRWYWx1ZSgpKTsKKyAgfQorfTsKKworLy8gTm9uLWNsYXNzIG9wdGlvbiB2YWx1ZXMuCit0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGU+CitzdHJ1Y3QgT3B0aW9uVmFsdWVCYXNlPERhdGFUeXBlLCBmYWxzZT4gOiBPcHRpb25WYWx1ZUNvcHk8RGF0YVR5cGU+IHsKKyAgdXNpbmcgV3JhcHBlclR5cGUgPSBEYXRhVHlwZTsKKworcHJvdGVjdGVkOgorICBPcHRpb25WYWx1ZUJhc2UoKSA9IGRlZmF1bHQ7CisgIE9wdGlvblZhbHVlQmFzZShjb25zdCBPcHRpb25WYWx1ZUJhc2UmKSA9IGRlZmF1bHQ7CisgIE9wdGlvblZhbHVlQmFzZSAmb3BlcmF0b3I9KGNvbnN0IE9wdGlvblZhbHVlQmFzZSAmKSA9IGRlZmF1bHQ7CisgIH5PcHRpb25WYWx1ZUJhc2UoKSA9IGRlZmF1bHQ7Cit9OworCisvLyBUb3AtbGV2ZWwgb3B0aW9uIGNsYXNzLgordGVtcGxhdGUgPGNsYXNzIERhdGFUeXBlPgorc3RydWN0IE9wdGlvblZhbHVlIGZpbmFsCisgICAgOiBPcHRpb25WYWx1ZUJhc2U8RGF0YVR5cGUsIHN0ZDo6aXNfY2xhc3M8RGF0YVR5cGU+Ojp2YWx1ZT4geworICBPcHRpb25WYWx1ZSgpID0gZGVmYXVsdDsKKworICBPcHRpb25WYWx1ZShjb25zdCBEYXRhVHlwZSAmVikgeyB0aGlzLT5zZXRWYWx1ZShWKTsgfQorCisgIC8vIFNvbWUgb3B0aW9ucyBtYXkgdGFrZSB0aGVpciB2YWx1ZSBmcm9tIGEgZGlmZmVyZW50IGRhdGEgdHlwZS4KKyAgdGVtcGxhdGUgPGNsYXNzIERUPiBPcHRpb25WYWx1ZTxEYXRhVHlwZT4gJm9wZXJhdG9yPShjb25zdCBEVCAmVikgeworICAgIHRoaXMtPnNldFZhbHVlKFYpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorfTsKKworLy8gT3RoZXIgc2FmZS10by1jb3B5LWJ5LXZhbHVlIGNvbW1vbiBvcHRpb24gdHlwZXMuCitlbnVtIGJvb2xPckRlZmF1bHQgeyBCT1VfVU5TRVQsIEJPVV9UUlVFLCBCT1VfRkFMU0UgfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3B0aW9uVmFsdWU8Y2w6OmJvb2xPckRlZmF1bHQ+IGZpbmFsCisgICAgOiBPcHRpb25WYWx1ZUNvcHk8Y2w6OmJvb2xPckRlZmF1bHQ+IHsKKyAgdXNpbmcgV3JhcHBlclR5cGUgPSBjbDo6Ym9vbE9yRGVmYXVsdDsKKworICBPcHRpb25WYWx1ZSgpID0gZGVmYXVsdDsKKworICBPcHRpb25WYWx1ZShjb25zdCBjbDo6Ym9vbE9yRGVmYXVsdCAmVikgeyB0aGlzLT5zZXRWYWx1ZShWKTsgfQorCisgIE9wdGlvblZhbHVlPGNsOjpib29sT3JEZWZhdWx0PiAmb3BlcmF0b3I9KGNvbnN0IGNsOjpib29sT3JEZWZhdWx0ICZWKSB7CisgICAgc2V0VmFsdWUoVik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wdGlvblZhbHVlPHN0ZDo6c3RyaW5nPiBmaW5hbCA6IE9wdGlvblZhbHVlQ29weTxzdGQ6OnN0cmluZz4geworICB1c2luZyBXcmFwcGVyVHlwZSA9IFN0cmluZ1JlZjsKKworICBPcHRpb25WYWx1ZSgpID0gZGVmYXVsdDsKKworICBPcHRpb25WYWx1ZShjb25zdCBzdGQ6OnN0cmluZyAmVikgeyB0aGlzLT5zZXRWYWx1ZShWKTsgfQorCisgIE9wdGlvblZhbHVlPHN0ZDo6c3RyaW5nPiAmb3BlcmF0b3I9KGNvbnN0IHN0ZDo6c3RyaW5nICZWKSB7CisgICAgc2V0VmFsdWUoVik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRW51bSB2YWx1ZWQgY29tbWFuZCBsaW5lIG9wdGlvbgorLy8KKworLy8gVGhpcyByZXByZXNlbnRzIGEgc2luZ2xlIGVudW0gdmFsdWUsIHVzaW5nICJpbnQiIGFzIHRoZSB1bmRlcmx5aW5nIHR5cGUuCitzdHJ1Y3QgT3B0aW9uRW51bVZhbHVlIHsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIGludCBWYWx1ZTsKKyAgU3RyaW5nUmVmIERlc2NyaXB0aW9uOworfTsKKworI2RlZmluZSBjbEVudW1WYWwoRU5VTVZBTCwgREVTQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbGx2bTo6Y2w6Ok9wdGlvbkVudW1WYWx1ZSB7ICNFTlVNVkFMLCBpbnQoRU5VTVZBTCksIERFU0MgfQorI2RlZmluZSBjbEVudW1WYWxOKEVOVU1WQUwsIEZMQUdOQU1FLCBERVNDKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbGx2bTo6Y2w6Ok9wdGlvbkVudW1WYWx1ZSB7IEZMQUdOQU1FLCBpbnQoRU5VTVZBTCksIERFU0MgfQorCisvLyB2YWx1ZXMgLSBGb3IgY3VzdG9tIGRhdGEgdHlwZXMsIGFsbG93IHNwZWNpZnlpbmcgYSBncm91cCBvZiB2YWx1ZXMgdG9nZXRoZXIKKy8vIGFzIHRoZSB2YWx1ZXMgdGhhdCBnbyBpbnRvIHRoZSBtYXBwaW5nIHRoYXQgdGhlIG9wdGlvbiBoYW5kbGVyIHVzZXMuCisvLworY2xhc3MgVmFsdWVzQ2xhc3MgeworICAvLyBVc2UgYSB2ZWN0b3IgaW5zdGVhZCBvZiBhIG1hcCwgYmVjYXVzZSB0aGUgbGlzdHMgc2hvdWxkIGJlIHNob3J0LAorICAvLyB0aGUgb3ZlcmhlYWQgaXMgbGVzcywgYW5kIG1vc3QgaW1wb3J0YW50bHksIGl0IGtlZXBzIHRoZW0gaW4gdGhlIG9yZGVyCisgIC8vIGluc2VydGVkIHNvIHdlIGNhbiBwcmludCBvdXIgb3B0aW9uIG91dCBuaWNlbHkuCisgIFNtYWxsVmVjdG9yPE9wdGlvbkVudW1WYWx1ZSwgND4gVmFsdWVzOworCitwdWJsaWM6CisgIFZhbHVlc0NsYXNzKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxPcHRpb25FbnVtVmFsdWU+IE9wdGlvbnMpCisgICAgICA6IFZhbHVlcyhPcHRpb25zKSB7fQorCisgIHRlbXBsYXRlIDxjbGFzcyBPcHQ+IHZvaWQgYXBwbHkoT3B0ICZPKSBjb25zdCB7CisgICAgZm9yIChhdXRvIFZhbHVlIDogVmFsdWVzKQorICAgICAgTy5nZXRQYXJzZXIoKS5hZGRMaXRlcmFsT3B0aW9uKFZhbHVlLk5hbWUsIFZhbHVlLlZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlLkRlc2NyaXB0aW9uKTsKKyAgfQorfTsKKworLy8vIEhlbHBlciB0byBidWlsZCBhIFZhbHVlc0NsYXNzIGJ5IGZvcndhcmRpbmcgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzCisvLy8gYXMgYW4gaW5pdGlhbGl6ZXIgbGlzdCB0byB0aGUgVmFsdWVzQ2xhc3MgY29uc3RydWN0b3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gT3B0c1R5PiBWYWx1ZXNDbGFzcyB2YWx1ZXMoT3B0c1R5Li4uIE9wdGlvbnMpIHsKKyAgcmV0dXJuIFZhbHVlc0NsYXNzKHtPcHRpb25zLi4ufSk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBwYXJzZXIgY2xhc3MgLSBQYXJhbWV0ZXJpemFibGUgcGFyc2VyIGZvciBkaWZmZXJlbnQgZGF0YSB0eXBlcy4gIEJ5IGRlZmF1bHQsCisvLyBrbm93biBkYXRhIHR5cGVzIChzdHJpbmcsIGludCwgYm9vbCkgaGF2ZSBzcGVjaWFsaXplZCBwYXJzZXJzLCB0aGF0IGRvIHdoYXQKKy8vIHlvdSB3b3VsZCBleHBlY3QuICBUaGUgZGVmYXVsdCBwYXJzZXIsIHVzZWQgZm9yIGRhdGEgdHlwZXMgdGhhdCBhcmUgbm90CisvLyBidWlsdC1pbiwgdXNlcyBhIG1hcHBpbmcgdGFibGUgdG8gbWFwIHNwZWNpZmljIG9wdGlvbnMgdG8gdmFsdWVzLCB3aGljaCBpcworLy8gdXNlZCwgYW1vbmcgb3RoZXIgdGhpbmdzLCB0byBoYW5kbGUgZW51bSB0eXBlcy4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZ2VuZXJpY19wYXJzZXJfYmFzZSAtIFRoaXMgY2xhc3MgaG9sZHMgYWxsIHRoZSBub24tZ2VuZXJpYyBjb2RlIHRoYXQgd2UgZG8KKy8vIG5vdCBuZWVkIHJlcGxpY2F0ZWQgZm9yIGV2ZXJ5IGluc3RhbmNlIG9mIHRoZSBnZW5lcmljIHBhcnNlci4gIFRoaXMgYWxzbworLy8gYWxsb3dzIHVzIHRvIHB1dCBzdHVmZiBpbnRvIENvbW1hbmRMaW5lLmNwcAorLy8KK2NsYXNzIGdlbmVyaWNfcGFyc2VyX2Jhc2UgeworcHJvdGVjdGVkOgorICBjbGFzcyBHZW5lcmljT3B0aW9uSW5mbyB7CisgIHB1YmxpYzoKKyAgICBHZW5lcmljT3B0aW9uSW5mbyhTdHJpbmdSZWYgbmFtZSwgU3RyaW5nUmVmIGhlbHBTdHIpCisgICAgICAgIDogTmFtZShuYW1lKSwgSGVscFN0cihoZWxwU3RyKSB7fQorICAgIFN0cmluZ1JlZiBOYW1lOworICAgIFN0cmluZ1JlZiBIZWxwU3RyOworICB9OworCitwdWJsaWM6CisgIGdlbmVyaWNfcGFyc2VyX2Jhc2UoT3B0aW9uICZPKSA6IE93bmVyKE8pIHt9CisKKyAgdmlydHVhbCB+Z2VuZXJpY19wYXJzZXJfYmFzZSgpID0gZGVmYXVsdDsKKyAgLy8gQmFzZSBjbGFzcyBzaG91bGQgaGF2ZSB2aXJ0dWFsLWRlc3RydWN0b3IKKworICAvLyBnZXROdW1PcHRpb25zIC0gVmlydHVhbCBmdW5jdGlvbiBpbXBsZW1lbnRlZCBieSBnZW5lcmljIHN1YmNsYXNzIHRvCisgIC8vIGluZGljYXRlIGhvdyBtYW55IGVudHJpZXMgYXJlIGluIFZhbHVlcy4KKyAgLy8KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXROdW1PcHRpb25zKCkgY29uc3QgPSAwOworCisgIC8vIGdldE9wdGlvbiAtIFJldHVybiBvcHRpb24gbmFtZSBOLgorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRPcHRpb24odW5zaWduZWQgTikgY29uc3QgPSAwOworCisgIC8vIGdldERlc2NyaXB0aW9uIC0gUmV0dXJuIGRlc2NyaXB0aW9uIE4KKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0RGVzY3JpcHRpb24odW5zaWduZWQgTikgY29uc3QgPSAwOworCisgIC8vIFJldHVybiB0aGUgd2lkdGggb2YgdGhlIG9wdGlvbiB0YWcgZm9yIHByaW50aW5nLi4uCisgIHZpcnR1YWwgc2l6ZV90IGdldE9wdGlvbldpZHRoKGNvbnN0IE9wdGlvbiAmTykgY29uc3Q7CisKKyAgdmlydHVhbCBjb25zdCBHZW5lcmljT3B0aW9uVmFsdWUgJmdldE9wdGlvblZhbHVlKHVuc2lnbmVkIE4pIGNvbnN0ID0gMDsKKworICAvLyBwcmludE9wdGlvbkluZm8gLSBQcmludCBvdXQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvcHRpb24uICBUaGUKKyAgLy8gdG8tYmUtbWFpbnRhaW5lZCB3aWR0aCBpcyBzcGVjaWZpZWQuCisgIC8vCisgIHZpcnR1YWwgdm9pZCBwcmludE9wdGlvbkluZm8oY29uc3QgT3B0aW9uICZPLCBzaXplX3QgR2xvYmFsV2lkdGgpIGNvbnN0OworCisgIHZvaWQgcHJpbnRHZW5lcmljT3B0aW9uRGlmZihjb25zdCBPcHRpb24gJk8sIGNvbnN0IEdlbmVyaWNPcHRpb25WYWx1ZSAmViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdlbmVyaWNPcHRpb25WYWx1ZSAmRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3Q7CisKKyAgLy8gcHJpbnRPcHRpb25EaWZmIC0gcHJpbnQgdGhlIHZhbHVlIG9mIGFuIG9wdGlvbiBhbmQgaXQncyBkZWZhdWx0LgorICAvLworICAvLyBUZW1wbGF0ZSBkZWZpbml0aW9uIGVuc3VyZXMgdGhhdCB0aGUgb3B0aW9uIGFuZCBkZWZhdWx0IGhhdmUgdGhlIHNhbWUKKyAgLy8gRGF0YVR5cGUgKHZpYSB0aGUgc2FtZSBBbnlPcHRpb25WYWx1ZSkuCisgIHRlbXBsYXRlIDxjbGFzcyBBbnlPcHRpb25WYWx1ZT4KKyAgdm9pZCBwcmludE9wdGlvbkRpZmYoY29uc3QgT3B0aW9uICZPLCBjb25zdCBBbnlPcHRpb25WYWx1ZSAmViwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQW55T3B0aW9uVmFsdWUgJkRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3QgeworICAgIHByaW50R2VuZXJpY09wdGlvbkRpZmYoTywgViwgRGVmYXVsdCwgR2xvYmFsV2lkdGgpOworICB9CisKKyAgdm9pZCBpbml0aWFsaXplKCkge30KKworICB2b2lkIGdldEV4dHJhT3B0aW9uTmFtZXMoU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gJk9wdGlvbk5hbWVzKSB7CisgICAgLy8gSWYgdGhlcmUgaGFzIGJlZW4gbm8gYXJnc3RyIHNwZWNpZmllZCwgdGhhdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gYWRkIGFuCisgICAgLy8gYXJndW1lbnQgZm9yIGV2ZXJ5IHBvc3NpYmxlIG9wdGlvbi4gIFRoaXMgZW5zdXJlcyB0aGF0IG91ciBvcHRpb25zIGFyZQorICAgIC8vIHZlY3RvcmVkIHRvIHVzLgorICAgIGlmICghT3duZXIuaGFzQXJnU3RyKCkpCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3B0aW9ucygpOyBpICE9IGU7ICsraSkKKyAgICAgICAgT3B0aW9uTmFtZXMucHVzaF9iYWNrKGdldE9wdGlvbihpKSk7CisgIH0KKworICBlbnVtIFZhbHVlRXhwZWN0ZWQgZ2V0VmFsdWVFeHBlY3RlZEZsYWdEZWZhdWx0KCkgY29uc3QgeworICAgIC8vIElmIHRoZXJlIGlzIGFuIEFyZ1N0ciBzcGVjaWZpZWQsIHRoZW4gd2UgYXJlIG9mIHRoZSBmb3JtOgorICAgIC8vCisgICAgLy8gICAgLW9wdD1PMiAgIG9yICAgLW9wdCBPMiAgb3IgIC1vcHRPMgorICAgIC8vCisgICAgLy8gSW4gd2hpY2ggY2FzZSwgdGhlIHZhbHVlIGlzIHJlcXVpcmVkLiAgT3RoZXJ3aXNlIGlmIGFuIGFyZyBzdHIgaGFzIG5vdAorICAgIC8vIGJlZW4gc3BlY2lmaWVkLCB3ZSBhcmUgb2YgdGhlIGZvcm06CisgICAgLy8KKyAgICAvLyAgICAtTzIgb3IgTzIgb3IgLWxhICh3aGVyZSAtbCBhbmQgLWEgYXJlIHNlcGFyYXRlIG9wdGlvbnMpCisgICAgLy8KKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBjYXNlLCB3ZSBjYW5ub3QgYWxsb3cgYSB2YWx1ZS4KKyAgICAvLworICAgIGlmIChPd25lci5oYXNBcmdTdHIoKSkKKyAgICAgIHJldHVybiBWYWx1ZVJlcXVpcmVkOworICAgIGVsc2UKKyAgICAgIHJldHVybiBWYWx1ZURpc2FsbG93ZWQ7CisgIH0KKworICAvLyBmaW5kT3B0aW9uIC0gUmV0dXJuIHRoZSBvcHRpb24gbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAvLyBhcmd1bWVudCBzdHJpbmcuICBJZiB0aGUgb3B0aW9uIGlzIG5vdCBmb3VuZCwgZ2V0TnVtT3B0aW9ucygpIGlzIHJldHVybmVkLgorICAvLworICB1bnNpZ25lZCBmaW5kT3B0aW9uKFN0cmluZ1JlZiBOYW1lKTsKKworcHJvdGVjdGVkOgorICBPcHRpb24gJk93bmVyOworfTsKKworLy8gRGVmYXVsdCBwYXJzZXIgaW1wbGVtZW50YXRpb24gLSBUaGlzIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24gaGF2aW5nIGEKKy8vIG1hcHBpbmcgb2YgcmVjb2duaXplZCBvcHRpb25zIHRvIHZhbHVlcyBvZiBzb21lIHNvcnQuICBJbiBhZGRpdGlvbiB0byB0aGlzLAorLy8gZWFjaCBlbnRyeSBpbiB0aGUgbWFwcGluZyBhbHNvIHRyYWNrcyBhIGhlbHAgbWVzc2FnZSB0aGF0IGlzIHByaW50ZWQgd2l0aCB0aGUKKy8vIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIC1oZWxwLiAgQmVjYXVzZSB0aGlzIGlzIGEgc2ltcGxlIG1hcHBpbmcgcGFyc2VyLCB0aGUKKy8vIGRhdGEgdHlwZSBjYW4gYmUgYW55IHVuc3VwcG9ydGVkIHR5cGUuCisvLwordGVtcGxhdGUgPGNsYXNzIERhdGFUeXBlPiBjbGFzcyBwYXJzZXIgOiBwdWJsaWMgZ2VuZXJpY19wYXJzZXJfYmFzZSB7Citwcm90ZWN0ZWQ6CisgIGNsYXNzIE9wdGlvbkluZm8gOiBwdWJsaWMgR2VuZXJpY09wdGlvbkluZm8geworICBwdWJsaWM6CisgICAgT3B0aW9uSW5mbyhTdHJpbmdSZWYgbmFtZSwgRGF0YVR5cGUgdiwgU3RyaW5nUmVmIGhlbHBTdHIpCisgICAgICAgIDogR2VuZXJpY09wdGlvbkluZm8obmFtZSwgaGVscFN0ciksIFYodikge30KKworICAgIE9wdGlvblZhbHVlPERhdGFUeXBlPiBWOworICB9OworICBTbWFsbFZlY3RvcjxPcHRpb25JbmZvLCA4PiBWYWx1ZXM7CisKK3B1YmxpYzoKKyAgcGFyc2VyKE9wdGlvbiAmTykgOiBnZW5lcmljX3BhcnNlcl9iYXNlKE8pIHt9CisKKyAgdXNpbmcgcGFyc2VyX2RhdGFfdHlwZSA9IERhdGFUeXBlOworCisgIC8vIEltcGxlbWVudCB2aXJ0dWFsIGZ1bmN0aW9ucyBuZWVkZWQgYnkgZ2VuZXJpY19wYXJzZXJfYmFzZQorICB1bnNpZ25lZCBnZXROdW1PcHRpb25zKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdW5zaWduZWQoVmFsdWVzLnNpemUoKSk7IH0KKyAgU3RyaW5nUmVmIGdldE9wdGlvbih1bnNpZ25lZCBOKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBWYWx1ZXNbTl0uTmFtZTsgfQorICBTdHJpbmdSZWYgZ2V0RGVzY3JpcHRpb24odW5zaWduZWQgTikgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBWYWx1ZXNbTl0uSGVscFN0cjsKKyAgfQorCisgIC8vIGdldE9wdGlvblZhbHVlIC0gUmV0dXJuIHRoZSB2YWx1ZSBvZiBvcHRpb24gbmFtZSBOLgorICBjb25zdCBHZW5lcmljT3B0aW9uVmFsdWUgJmdldE9wdGlvblZhbHVlKHVuc2lnbmVkIE4pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gVmFsdWVzW05dLlY7CisgIH0KKworICAvLyBwYXJzZSAtIFJldHVybiB0cnVlIG9uIGVycm9yLgorICBib29sIHBhcnNlKE9wdGlvbiAmTywgU3RyaW5nUmVmIEFyZ05hbWUsIFN0cmluZ1JlZiBBcmcsIERhdGFUeXBlICZWKSB7CisgICAgU3RyaW5nUmVmIEFyZ1ZhbDsKKyAgICBpZiAoT3duZXIuaGFzQXJnU3RyKCkpCisgICAgICBBcmdWYWwgPSBBcmc7CisgICAgZWxzZQorICAgICAgQXJnVmFsID0gQXJnTmFtZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gVmFsdWVzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoVmFsdWVzW2ldLk5hbWUgPT0gQXJnVmFsKSB7CisgICAgICAgIFYgPSBWYWx1ZXNbaV0uVi5nZXRWYWx1ZSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICByZXR1cm4gTy5lcnJvcigiQ2Fubm90IGZpbmQgb3B0aW9uIG5hbWVkICciICsgQXJnVmFsICsgIichIik7CisgIH0KKworICAvLy8gYWRkTGl0ZXJhbE9wdGlvbiAtIEFkZCBhbiBlbnRyeSB0byB0aGUgbWFwcGluZyB0YWJsZS4KKyAgLy8vCisgIHRlbXBsYXRlIDxjbGFzcyBEVD4KKyAgdm9pZCBhZGRMaXRlcmFsT3B0aW9uKFN0cmluZ1JlZiBOYW1lLCBjb25zdCBEVCAmViwgU3RyaW5nUmVmIEhlbHBTdHIpIHsKKyAgICBhc3NlcnQoZmluZE9wdGlvbihOYW1lKSA9PSBWYWx1ZXMuc2l6ZSgpICYmICJPcHRpb24gYWxyZWFkeSBleGlzdHMhIik7CisgICAgT3B0aW9uSW5mbyBYKE5hbWUsIHN0YXRpY19jYXN0PERhdGFUeXBlPihWKSwgSGVscFN0cik7CisgICAgVmFsdWVzLnB1c2hfYmFjayhYKTsKKyAgICBBZGRMaXRlcmFsT3B0aW9uKE93bmVyLCBOYW1lKTsKKyAgfQorCisgIC8vLyByZW1vdmVMaXRlcmFsT3B0aW9uIC0gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgb3B0aW9uLgorICAvLy8KKyAgdm9pZCByZW1vdmVMaXRlcmFsT3B0aW9uKFN0cmluZ1JlZiBOYW1lKSB7CisgICAgdW5zaWduZWQgTiA9IGZpbmRPcHRpb24oTmFtZSk7CisgICAgYXNzZXJ0KE4gIT0gVmFsdWVzLnNpemUoKSAmJiAiT3B0aW9uIG5vdCBmb3VuZCEiKTsKKyAgICBWYWx1ZXMuZXJhc2UoVmFsdWVzLmJlZ2luKCkgKyBOKTsKKyAgfQorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gYmFzaWNfcGFyc2VyIC0gU3VwZXIgY2xhc3Mgb2YgcGFyc2VycyB0byBwcm92aWRlIGJvaWxlcnBsYXRlIGNvZGUKKy8vCitjbGFzcyBiYXNpY19wYXJzZXJfaW1wbCB7IC8vIG5vbi10ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbiBvZiBiYXNpY19wYXJzZXI8dD4KK3B1YmxpYzoKKyAgYmFzaWNfcGFyc2VyX2ltcGwoT3B0aW9uICYpIHt9CisKKyAgZW51bSBWYWx1ZUV4cGVjdGVkIGdldFZhbHVlRXhwZWN0ZWRGbGFnRGVmYXVsdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWVSZXF1aXJlZDsKKyAgfQorCisgIHZvaWQgZ2V0RXh0cmFPcHRpb25OYW1lcyhTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmKSB7fQorCisgIHZvaWQgaW5pdGlhbGl6ZSgpIHt9CisKKyAgLy8gUmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgb3B0aW9uIHRhZyBmb3IgcHJpbnRpbmcuLi4KKyAgc2l6ZV90IGdldE9wdGlvbldpZHRoKGNvbnN0IE9wdGlvbiAmTykgY29uc3Q7CisKKyAgLy8gcHJpbnRPcHRpb25JbmZvIC0gUHJpbnQgb3V0IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3B0aW9uLiAgVGhlCisgIC8vIHRvLWJlLW1haW50YWluZWQgd2lkdGggaXMgc3BlY2lmaWVkLgorICAvLworICB2b2lkIHByaW50T3B0aW9uSW5mbyhjb25zdCBPcHRpb24gJk8sIHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3Q7CisKKyAgLy8gcHJpbnRPcHRpb25Ob1ZhbHVlIC0gUHJpbnQgYSBwbGFjZWhvbGRlciBmb3Igb3B0aW9ucyB0aGF0IGRvbid0IHlldCBzdXBwb3J0CisgIC8vIHByaW50T3B0aW9uRGlmZigpLgorICB2b2lkIHByaW50T3B0aW9uTm9WYWx1ZShjb25zdCBPcHRpb24gJk8sIHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3Q7CisKKyAgLy8gZ2V0VmFsdWVOYW1lIC0gT3ZlcmxvYWQgaW4gc3ViY2xhc3MgdG8gcHJvdmlkZSBhIGJldHRlciBkZWZhdWx0IHZhbHVlLgorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRWYWx1ZU5hbWUoKSBjb25zdCB7IHJldHVybiAidmFsdWUiOyB9CisKKyAgLy8gQW4gb3V0LW9mLWxpbmUgdmlydHVhbCBtZXRob2QgdG8gcHJvdmlkZSBhICdob21lJyBmb3IgdGhpcyBjbGFzcy4KKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwcm90ZWN0ZWQ6CisgIH5iYXNpY19wYXJzZXJfaW1wbCgpID0gZGVmYXVsdDsKKworICAvLyBBIGhlbHBlciBmb3IgYmFzaWNfcGFyc2VyOjpwcmludE9wdGlvbkRpZmYuCisgIHZvaWQgcHJpbnRPcHRpb25OYW1lKGNvbnN0IE9wdGlvbiAmTywgc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdDsKK307CisKKy8vIGJhc2ljX3BhcnNlciAtIFRoZSByZWFsIGJhc2ljIHBhcnNlciBpcyBqdXN0IGEgdGVtcGxhdGUgd3JhcHBlciB0aGF0IHByb3ZpZGVzCisvLyBhIHR5cGVkZWYgZm9yIHRoZSBwcm92aWRlZCBkYXRhIHR5cGUuCisvLwordGVtcGxhdGUgPGNsYXNzIERhdGFUeXBlPiBjbGFzcyBiYXNpY19wYXJzZXIgOiBwdWJsaWMgYmFzaWNfcGFyc2VyX2ltcGwgeworcHVibGljOgorICB1c2luZyBwYXJzZXJfZGF0YV90eXBlID0gRGF0YVR5cGU7CisgIHVzaW5nIE9wdFZhbCA9IE9wdGlvblZhbHVlPERhdGFUeXBlPjsKKworICBiYXNpY19wYXJzZXIoT3B0aW9uICZPKSA6IGJhc2ljX3BhcnNlcl9pbXBsKE8pIHt9CisKK3Byb3RlY3RlZDoKKyAgfmJhc2ljX3BhcnNlcigpID0gZGVmYXVsdDsKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHBhcnNlcjxib29sPgorLy8KK3RlbXBsYXRlIDw+IGNsYXNzIHBhcnNlcjxib29sPiBmaW5hbCA6IHB1YmxpYyBiYXNpY19wYXJzZXI8Ym9vbD4geworcHVibGljOgorICBwYXJzZXIoT3B0aW9uICZPKSA6IGJhc2ljX3BhcnNlcihPKSB7fQorCisgIC8vIHBhcnNlIC0gUmV0dXJuIHRydWUgb24gZXJyb3IuCisgIGJvb2wgcGFyc2UoT3B0aW9uICZPLCBTdHJpbmdSZWYgQXJnTmFtZSwgU3RyaW5nUmVmIEFyZywgYm9vbCAmVmFsKTsKKworICB2b2lkIGluaXRpYWxpemUoKSB7fQorCisgIGVudW0gVmFsdWVFeHBlY3RlZCBnZXRWYWx1ZUV4cGVjdGVkRmxhZ0RlZmF1bHQoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlT3B0aW9uYWw7CisgIH0KKworICAvLyBnZXRWYWx1ZU5hbWUgLSBEbyBub3QgcHJpbnQgPTx2YWx1ZT4gYXQgYWxsLgorICBTdHJpbmdSZWYgZ2V0VmFsdWVOYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gU3RyaW5nUmVmKCk7IH0KKworICB2b2lkIHByaW50T3B0aW9uRGlmZihjb25zdCBPcHRpb24gJk8sIGJvb2wgViwgT3B0VmFsIERlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3Q7CisKKyAgLy8gQW4gb3V0LW9mLWxpbmUgdmlydHVhbCBtZXRob2QgdG8gcHJvdmlkZSBhICdob21lJyBmb3IgdGhpcyBjbGFzcy4KKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKK307CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19wYXJzZXI8Ym9vbD47CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHBhcnNlcjxib29sT3JEZWZhdWx0PgordGVtcGxhdGUgPD4KK2NsYXNzIHBhcnNlcjxib29sT3JEZWZhdWx0PiBmaW5hbCA6IHB1YmxpYyBiYXNpY19wYXJzZXI8Ym9vbE9yRGVmYXVsdD4geworcHVibGljOgorICBwYXJzZXIoT3B0aW9uICZPKSA6IGJhc2ljX3BhcnNlcihPKSB7fQorCisgIC8vIHBhcnNlIC0gUmV0dXJuIHRydWUgb24gZXJyb3IuCisgIGJvb2wgcGFyc2UoT3B0aW9uICZPLCBTdHJpbmdSZWYgQXJnTmFtZSwgU3RyaW5nUmVmIEFyZywgYm9vbE9yRGVmYXVsdCAmVmFsKTsKKworICBlbnVtIFZhbHVlRXhwZWN0ZWQgZ2V0VmFsdWVFeHBlY3RlZEZsYWdEZWZhdWx0KCkgY29uc3QgeworICAgIHJldHVybiBWYWx1ZU9wdGlvbmFsOworICB9CisKKyAgLy8gZ2V0VmFsdWVOYW1lIC0gRG8gbm90IHByaW50ID08dmFsdWU+IGF0IGFsbC4KKyAgU3RyaW5nUmVmIGdldFZhbHVlTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIFN0cmluZ1JlZigpOyB9CisKKyAgdm9pZCBwcmludE9wdGlvbkRpZmYoY29uc3QgT3B0aW9uICZPLCBib29sT3JEZWZhdWx0IFYsIE9wdFZhbCBEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgR2xvYmFsV2lkdGgpIGNvbnN0OworCisgIC8vIEFuIG91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kIHRvIHByb3ZpZGUgYSAnaG9tZScgZm9yIHRoaXMgY2xhc3MuCisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7Cit9OworCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfcGFyc2VyPGJvb2xPckRlZmF1bHQ+OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBwYXJzZXI8aW50PgorLy8KK3RlbXBsYXRlIDw+IGNsYXNzIHBhcnNlcjxpbnQ+IGZpbmFsIDogcHVibGljIGJhc2ljX3BhcnNlcjxpbnQ+IHsKK3B1YmxpYzoKKyAgcGFyc2VyKE9wdGlvbiAmTykgOiBiYXNpY19wYXJzZXIoTykge30KKworICAvLyBwYXJzZSAtIFJldHVybiB0cnVlIG9uIGVycm9yLgorICBib29sIHBhcnNlKE9wdGlvbiAmTywgU3RyaW5nUmVmIEFyZ05hbWUsIFN0cmluZ1JlZiBBcmcsIGludCAmVmFsKTsKKworICAvLyBnZXRWYWx1ZU5hbWUgLSBPdmVybG9hZCBpbiBzdWJjbGFzcyB0byBwcm92aWRlIGEgYmV0dGVyIGRlZmF1bHQgdmFsdWUuCisgIFN0cmluZ1JlZiBnZXRWYWx1ZU5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiaW50IjsgfQorCisgIHZvaWQgcHJpbnRPcHRpb25EaWZmKGNvbnN0IE9wdGlvbiAmTywgaW50IFYsIE9wdFZhbCBEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgR2xvYmFsV2lkdGgpIGNvbnN0OworCisgIC8vIEFuIG91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kIHRvIHByb3ZpZGUgYSAnaG9tZScgZm9yIHRoaXMgY2xhc3MuCisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7Cit9OworCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfcGFyc2VyPGludD47CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHBhcnNlcjx1bnNpZ25lZD4KKy8vCit0ZW1wbGF0ZSA8PiBjbGFzcyBwYXJzZXI8dW5zaWduZWQ+IGZpbmFsIDogcHVibGljIGJhc2ljX3BhcnNlcjx1bnNpZ25lZD4geworcHVibGljOgorICBwYXJzZXIoT3B0aW9uICZPKSA6IGJhc2ljX3BhcnNlcihPKSB7fQorCisgIC8vIHBhcnNlIC0gUmV0dXJuIHRydWUgb24gZXJyb3IuCisgIGJvb2wgcGFyc2UoT3B0aW9uICZPLCBTdHJpbmdSZWYgQXJnTmFtZSwgU3RyaW5nUmVmIEFyZywgdW5zaWduZWQgJlZhbCk7CisKKyAgLy8gZ2V0VmFsdWVOYW1lIC0gT3ZlcmxvYWQgaW4gc3ViY2xhc3MgdG8gcHJvdmlkZSBhIGJldHRlciBkZWZhdWx0IHZhbHVlLgorICBTdHJpbmdSZWYgZ2V0VmFsdWVOYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gInVpbnQiOyB9CisKKyAgdm9pZCBwcmludE9wdGlvbkRpZmYoY29uc3QgT3B0aW9uICZPLCB1bnNpZ25lZCBWLCBPcHRWYWwgRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdDsKKworICAvLyBBbiBvdXQtb2YtbGluZSB2aXJ0dWFsIG1ldGhvZCB0byBwcm92aWRlIGEgJ2hvbWUnIGZvciB0aGlzIGNsYXNzLgorICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworfTsKKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX3BhcnNlcjx1bnNpZ25lZD47CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHBhcnNlcjx1bnNpZ25lZCBsb25nIGxvbmc+CisvLwordGVtcGxhdGUgPD4KK2NsYXNzIHBhcnNlcjx1bnNpZ25lZCBsb25nIGxvbmc+IGZpbmFsCisgICAgOiBwdWJsaWMgYmFzaWNfcGFyc2VyPHVuc2lnbmVkIGxvbmcgbG9uZz4geworcHVibGljOgorICBwYXJzZXIoT3B0aW9uICZPKSA6IGJhc2ljX3BhcnNlcihPKSB7fQorCisgIC8vIHBhcnNlIC0gUmV0dXJuIHRydWUgb24gZXJyb3IuCisgIGJvb2wgcGFyc2UoT3B0aW9uICZPLCBTdHJpbmdSZWYgQXJnTmFtZSwgU3RyaW5nUmVmIEFyZywKKyAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgJlZhbCk7CisKKyAgLy8gZ2V0VmFsdWVOYW1lIC0gT3ZlcmxvYWQgaW4gc3ViY2xhc3MgdG8gcHJvdmlkZSBhIGJldHRlciBkZWZhdWx0IHZhbHVlLgorICBTdHJpbmdSZWYgZ2V0VmFsdWVOYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gInVpbnQiOyB9CisKKyAgdm9pZCBwcmludE9wdGlvbkRpZmYoY29uc3QgT3B0aW9uICZPLCB1bnNpZ25lZCBsb25nIGxvbmcgViwgT3B0VmFsIERlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3Q7CisKKyAgLy8gQW4gb3V0LW9mLWxpbmUgdmlydHVhbCBtZXRob2QgdG8gcHJvdmlkZSBhICdob21lJyBmb3IgdGhpcyBjbGFzcy4KKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKK307CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19wYXJzZXI8dW5zaWduZWQgbG9uZyBsb25nPjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcGFyc2VyPGRvdWJsZT4KKy8vCit0ZW1wbGF0ZSA8PiBjbGFzcyBwYXJzZXI8ZG91YmxlPiBmaW5hbCA6IHB1YmxpYyBiYXNpY19wYXJzZXI8ZG91YmxlPiB7CitwdWJsaWM6CisgIHBhcnNlcihPcHRpb24gJk8pIDogYmFzaWNfcGFyc2VyKE8pIHt9CisKKyAgLy8gcGFyc2UgLSBSZXR1cm4gdHJ1ZSBvbiBlcnJvci4KKyAgYm9vbCBwYXJzZShPcHRpb24gJk8sIFN0cmluZ1JlZiBBcmdOYW1lLCBTdHJpbmdSZWYgQXJnLCBkb3VibGUgJlZhbCk7CisKKyAgLy8gZ2V0VmFsdWVOYW1lIC0gT3ZlcmxvYWQgaW4gc3ViY2xhc3MgdG8gcHJvdmlkZSBhIGJldHRlciBkZWZhdWx0IHZhbHVlLgorICBTdHJpbmdSZWYgZ2V0VmFsdWVOYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIm51bWJlciI7IH0KKworICB2b2lkIHByaW50T3B0aW9uRGlmZihjb25zdCBPcHRpb24gJk8sIGRvdWJsZSBWLCBPcHRWYWwgRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdDsKKworICAvLyBBbiBvdXQtb2YtbGluZSB2aXJ0dWFsIG1ldGhvZCB0byBwcm92aWRlIGEgJ2hvbWUnIGZvciB0aGlzIGNsYXNzLgorICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworfTsKKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX3BhcnNlcjxkb3VibGU+OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBwYXJzZXI8ZmxvYXQ+CisvLwordGVtcGxhdGUgPD4gY2xhc3MgcGFyc2VyPGZsb2F0PiBmaW5hbCA6IHB1YmxpYyBiYXNpY19wYXJzZXI8ZmxvYXQ+IHsKK3B1YmxpYzoKKyAgcGFyc2VyKE9wdGlvbiAmTykgOiBiYXNpY19wYXJzZXIoTykge30KKworICAvLyBwYXJzZSAtIFJldHVybiB0cnVlIG9uIGVycm9yLgorICBib29sIHBhcnNlKE9wdGlvbiAmTywgU3RyaW5nUmVmIEFyZ05hbWUsIFN0cmluZ1JlZiBBcmcsIGZsb2F0ICZWYWwpOworCisgIC8vIGdldFZhbHVlTmFtZSAtIE92ZXJsb2FkIGluIHN1YmNsYXNzIHRvIHByb3ZpZGUgYSBiZXR0ZXIgZGVmYXVsdCB2YWx1ZS4KKyAgU3RyaW5nUmVmIGdldFZhbHVlTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJudW1iZXIiOyB9CisKKyAgdm9pZCBwcmludE9wdGlvbkRpZmYoY29uc3QgT3B0aW9uICZPLCBmbG9hdCBWLCBPcHRWYWwgRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdDsKKworICAvLyBBbiBvdXQtb2YtbGluZSB2aXJ0dWFsIG1ldGhvZCB0byBwcm92aWRlIGEgJ2hvbWUnIGZvciB0aGlzIGNsYXNzLgorICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworfTsKKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX3BhcnNlcjxmbG9hdD47CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHBhcnNlcjxzdGQ6OnN0cmluZz4KKy8vCit0ZW1wbGF0ZSA8PiBjbGFzcyBwYXJzZXI8c3RkOjpzdHJpbmc+IGZpbmFsIDogcHVibGljIGJhc2ljX3BhcnNlcjxzdGQ6OnN0cmluZz4geworcHVibGljOgorICBwYXJzZXIoT3B0aW9uICZPKSA6IGJhc2ljX3BhcnNlcihPKSB7fQorCisgIC8vIHBhcnNlIC0gUmV0dXJuIHRydWUgb24gZXJyb3IuCisgIGJvb2wgcGFyc2UoT3B0aW9uICYsIFN0cmluZ1JlZiwgU3RyaW5nUmVmIEFyZywgc3RkOjpzdHJpbmcgJlZhbHVlKSB7CisgICAgVmFsdWUgPSBBcmcuc3RyKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gZ2V0VmFsdWVOYW1lIC0gT3ZlcmxvYWQgaW4gc3ViY2xhc3MgdG8gcHJvdmlkZSBhIGJldHRlciBkZWZhdWx0IHZhbHVlLgorICBTdHJpbmdSZWYgZ2V0VmFsdWVOYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gInN0cmluZyI7IH0KKworICB2b2lkIHByaW50T3B0aW9uRGlmZihjb25zdCBPcHRpb24gJk8sIFN0cmluZ1JlZiBWLCBjb25zdCBPcHRWYWwgJkRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3Q7CisKKyAgLy8gQW4gb3V0LW9mLWxpbmUgdmlydHVhbCBtZXRob2QgdG8gcHJvdmlkZSBhICdob21lJyBmb3IgdGhpcyBjbGFzcy4KKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKK307CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19wYXJzZXI8c3RkOjpzdHJpbmc+OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBwYXJzZXI8Y2hhcj4KKy8vCit0ZW1wbGF0ZSA8PiBjbGFzcyBwYXJzZXI8Y2hhcj4gZmluYWwgOiBwdWJsaWMgYmFzaWNfcGFyc2VyPGNoYXI+IHsKK3B1YmxpYzoKKyAgcGFyc2VyKE9wdGlvbiAmTykgOiBiYXNpY19wYXJzZXIoTykge30KKworICAvLyBwYXJzZSAtIFJldHVybiB0cnVlIG9uIGVycm9yLgorICBib29sIHBhcnNlKE9wdGlvbiAmLCBTdHJpbmdSZWYsIFN0cmluZ1JlZiBBcmcsIGNoYXIgJlZhbHVlKSB7CisgICAgVmFsdWUgPSBBcmdbMF07CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gZ2V0VmFsdWVOYW1lIC0gT3ZlcmxvYWQgaW4gc3ViY2xhc3MgdG8gcHJvdmlkZSBhIGJldHRlciBkZWZhdWx0IHZhbHVlLgorICBTdHJpbmdSZWYgZ2V0VmFsdWVOYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gImNoYXIiOyB9CisKKyAgdm9pZCBwcmludE9wdGlvbkRpZmYoY29uc3QgT3B0aW9uICZPLCBjaGFyIFYsIE9wdFZhbCBEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgR2xvYmFsV2lkdGgpIGNvbnN0OworCisgIC8vIEFuIG91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kIHRvIHByb3ZpZGUgYSAnaG9tZScgZm9yIHRoaXMgY2xhc3MuCisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7Cit9OworCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfcGFyc2VyPGNoYXI+OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcmludE9wdGlvbkRpZmYKKy8vCisvLyBUaGlzIGNvbGxlY3Rpb24gb2Ygd3JhcHBlcnMgaXMgdGhlIGludGVybWVkaWFyeSBiZXR3ZWVuIGNsYXNzIG9wdCBhbmQgY2xhc3MKKy8vIHBhcnNlciB0byBoYW5kbGUgYWxsIHRoZSB0ZW1wbGF0ZSBuYXN0aW5lc3MuCisKKy8vIFRoaXMgb3ZlcmxvYWRlZCBmdW5jdGlvbiBpcyBzZWxlY3RlZCBieSB0aGUgZ2VuZXJpYyBwYXJzZXIuCit0ZW1wbGF0ZSA8Y2xhc3MgUGFyc2VyQ2xhc3MsIGNsYXNzIERUPgordm9pZCBwcmludE9wdGlvbkRpZmYoY29uc3QgT3B0aW9uICZPLCBjb25zdCBnZW5lcmljX3BhcnNlcl9iYXNlICZQLCBjb25zdCBEVCAmViwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvblZhbHVlPERUPiAmRGVmYXVsdCwgc2l6ZV90IEdsb2JhbFdpZHRoKSB7CisgIE9wdGlvblZhbHVlPERUPiBPViA9IFY7CisgIFAucHJpbnRPcHRpb25EaWZmKE8sIE9WLCBEZWZhdWx0LCBHbG9iYWxXaWR0aCk7Cit9CisKKy8vIFRoaXMgaXMgaW5zdGFudGlhdGVkIGZvciBiYXNpYyBwYXJzZXJzIHdoZW4gdGhlIHBhcnNlZCB2YWx1ZSBoYXMgYSBkaWZmZXJlbnQKKy8vIHR5cGUgdGhhbiB0aGUgb3B0aW9uIHZhbHVlLiBlLmcuIEhlbHBQcmludGVyLgordGVtcGxhdGUgPGNsYXNzIFBhcnNlckRULCBjbGFzcyBWYWxEVD4gc3RydWN0IE9wdGlvbkRpZmZQcmludGVyIHsKKyAgdm9pZCBwcmludChjb25zdCBPcHRpb24gJk8sIGNvbnN0IHBhcnNlcjxQYXJzZXJEVD4gJlAsIGNvbnN0IFZhbERUICYgLypWKi8sCisgICAgICAgICAgICAgY29uc3QgT3B0aW9uVmFsdWU8VmFsRFQ+ICYgLypEZWZhdWx0Ki8sIHNpemVfdCBHbG9iYWxXaWR0aCkgeworICAgIFAucHJpbnRPcHRpb25Ob1ZhbHVlKE8sIEdsb2JhbFdpZHRoKTsKKyAgfQorfTsKKworLy8gVGhpcyBpcyBpbnN0YW50aWF0ZWQgZm9yIGJhc2ljIHBhcnNlcnMgd2hlbiB0aGUgcGFyc2VkIHZhbHVlIGhhcyB0aGUgc2FtZQorLy8gdHlwZSBhcyB0aGUgb3B0aW9uIHZhbHVlLgordGVtcGxhdGUgPGNsYXNzIERUPiBzdHJ1Y3QgT3B0aW9uRGlmZlByaW50ZXI8RFQsIERUPiB7CisgIHZvaWQgcHJpbnQoY29uc3QgT3B0aW9uICZPLCBjb25zdCBwYXJzZXI8RFQ+ICZQLCBjb25zdCBEVCAmViwKKyAgICAgICAgICAgICBjb25zdCBPcHRpb25WYWx1ZTxEVD4gJkRlZmF1bHQsIHNpemVfdCBHbG9iYWxXaWR0aCkgeworICAgIFAucHJpbnRPcHRpb25EaWZmKE8sIFYsIERlZmF1bHQsIEdsb2JhbFdpZHRoKTsKKyAgfQorfTsKKworLy8gVGhpcyBvdmVybG9hZGVkIGZ1bmN0aW9uIGlzIHNlbGVjdGVkIGJ5IHRoZSBiYXNpYyBwYXJzZXIsIHdoaWNoIG1heSBwYXJzZSBhCisvLyBkaWZmZXJlbnQgdHlwZSB0aGFuIHRoZSBvcHRpb24gdHlwZS4KK3RlbXBsYXRlIDxjbGFzcyBQYXJzZXJDbGFzcywgY2xhc3MgVmFsRFQ+Cit2b2lkIHByaW50T3B0aW9uRGlmZigKKyAgICBjb25zdCBPcHRpb24gJk8sCisgICAgY29uc3QgYmFzaWNfcGFyc2VyPHR5cGVuYW1lIFBhcnNlckNsYXNzOjpwYXJzZXJfZGF0YV90eXBlPiAmUCwKKyAgICBjb25zdCBWYWxEVCAmViwgY29uc3QgT3B0aW9uVmFsdWU8VmFsRFQ+ICZEZWZhdWx0LCBzaXplX3QgR2xvYmFsV2lkdGgpIHsKKworICBPcHRpb25EaWZmUHJpbnRlcjx0eXBlbmFtZSBQYXJzZXJDbGFzczo6cGFyc2VyX2RhdGFfdHlwZSwgVmFsRFQ+IHByaW50ZXI7CisgIHByaW50ZXIucHJpbnQoTywgc3RhdGljX2Nhc3Q8Y29uc3QgUGFyc2VyQ2xhc3MgJj4oUCksIFYsIERlZmF1bHQsCisgICAgICAgICAgICAgICAgR2xvYmFsV2lkdGgpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gYXBwbGljYXRvciBjbGFzcyAtIFRoaXMgY2xhc3MgaXMgdXNlZCBiZWNhdXNlIHdlIG11c3QgdXNlIHBhcnRpYWwKKy8vIHNwZWNpYWxpemF0aW9uIHRvIGhhbmRsZSBsaXRlcmFsIHN0cmluZyBhcmd1bWVudHMgc3BlY2lhbGx5IChjb25zdCBjaGFyKiBkb2VzCisvLyBub3QgY29ycmVjdGx5IHJlc3BvbmQgdG8gdGhlIGFwcGx5IG1ldGhvZCkuICBCZWNhdXNlIHRoZSBzeW50YXggdG8gdXNlIHRoaXMKKy8vIGlzIGEgcGFpbiwgd2UgaGF2ZSB0aGUgJ2FwcGx5JyBtZXRob2QgYmVsb3cgdG8gaGFuZGxlIHRoZSBuYXN0aW5lc3MuLi4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgTW9kPiBzdHJ1Y3QgYXBwbGljYXRvciB7CisgIHRlbXBsYXRlIDxjbGFzcyBPcHQ+IHN0YXRpYyB2b2lkIG9wdChjb25zdCBNb2QgJk0sIE9wdCAmTykgeyBNLmFwcGx5KE8pOyB9Cit9OworCisvLyBIYW5kbGUgY29uc3QgY2hhciogYXMgYSBzcGVjaWFsIGNhc2UuLi4KK3RlbXBsYXRlIDx1bnNpZ25lZCBuPiBzdHJ1Y3QgYXBwbGljYXRvcjxjaGFyW25dPiB7CisgIHRlbXBsYXRlIDxjbGFzcyBPcHQ+IHN0YXRpYyB2b2lkIG9wdChTdHJpbmdSZWYgU3RyLCBPcHQgJk8pIHsKKyAgICBPLnNldEFyZ1N0cihTdHIpOworICB9Cit9OwordGVtcGxhdGUgPHVuc2lnbmVkIG4+IHN0cnVjdCBhcHBsaWNhdG9yPGNvbnN0IGNoYXJbbl0+IHsKKyAgdGVtcGxhdGUgPGNsYXNzIE9wdD4gc3RhdGljIHZvaWQgb3B0KFN0cmluZ1JlZiBTdHIsIE9wdCAmTykgeworICAgIE8uc2V0QXJnU3RyKFN0cik7CisgIH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgYXBwbGljYXRvcjxTdHJpbmdSZWYgPiB7CisgIHRlbXBsYXRlIDxjbGFzcyBPcHQ+IHN0YXRpYyB2b2lkIG9wdChTdHJpbmdSZWYgU3RyLCBPcHQgJk8pIHsKKyAgICBPLnNldEFyZ1N0cihTdHIpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgYXBwbGljYXRvcjxOdW1PY2N1cnJlbmNlc0ZsYWc+IHsKKyAgc3RhdGljIHZvaWQgb3B0KE51bU9jY3VycmVuY2VzRmxhZyBOLCBPcHRpb24gJk8pIHsKKyAgICBPLnNldE51bU9jY3VycmVuY2VzRmxhZyhOKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGFwcGxpY2F0b3I8VmFsdWVFeHBlY3RlZD4geworICBzdGF0aWMgdm9pZCBvcHQoVmFsdWVFeHBlY3RlZCBWRSwgT3B0aW9uICZPKSB7IE8uc2V0VmFsdWVFeHBlY3RlZEZsYWcoVkUpOyB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgYXBwbGljYXRvcjxPcHRpb25IaWRkZW4+IHsKKyAgc3RhdGljIHZvaWQgb3B0KE9wdGlvbkhpZGRlbiBPSCwgT3B0aW9uICZPKSB7IE8uc2V0SGlkZGVuRmxhZyhPSCk7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBhcHBsaWNhdG9yPEZvcm1hdHRpbmdGbGFncz4geworICBzdGF0aWMgdm9pZCBvcHQoRm9ybWF0dGluZ0ZsYWdzIEZGLCBPcHRpb24gJk8pIHsgTy5zZXRGb3JtYXR0aW5nRmxhZyhGRik7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBhcHBsaWNhdG9yPE1pc2NGbGFncz4geworICBzdGF0aWMgdm9pZCBvcHQoTWlzY0ZsYWdzIE1GLCBPcHRpb24gJk8pIHsgTy5zZXRNaXNjRmxhZyhNRik7IH0KK307CisKKy8vIGFwcGx5IG1ldGhvZCAtIEFwcGx5IG1vZGlmaWVycyB0byBhbiBvcHRpb24gaW4gYSB0eXBlIHNhZmUgd2F5LgordGVtcGxhdGUgPGNsYXNzIE9wdCwgY2xhc3MgTW9kLCBjbGFzcy4uLiBNb2RzPgordm9pZCBhcHBseShPcHQgKk8sIGNvbnN0IE1vZCAmTSwgY29uc3QgTW9kcyAmLi4uIE1zKSB7CisgIGFwcGxpY2F0b3I8TW9kPjo6b3B0KE0sICpPKTsKKyAgYXBwbHkoTywgTXMuLi4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgT3B0LCBjbGFzcyBNb2Q+IHZvaWQgYXBwbHkoT3B0ICpPLCBjb25zdCBNb2QgJk0pIHsKKyAgYXBwbGljYXRvcjxNb2Q+OjpvcHQoTSwgKk8pOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gb3B0X3N0b3JhZ2UgY2xhc3MKKworLy8gRGVmYXVsdCBzdG9yYWdlIGNsYXNzIGRlZmluaXRpb246IGV4dGVybmFsIHN0b3JhZ2UuICBUaGlzIGltcGxlbWVudGF0aW9uCisvLyBhc3N1bWVzIHRoZSB1c2VyIHdpbGwgc3BlY2lmeSBhIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBkYXRhIGludG8gd2l0aCB0aGUKKy8vIGNsOjpsb2NhdGlvbih4KSBtb2RpZmllci4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGUsIGJvb2wgRXh0ZXJuYWxTdG9yYWdlLCBib29sIGlzQ2xhc3M+CitjbGFzcyBvcHRfc3RvcmFnZSB7CisgIERhdGFUeXBlICpMb2NhdGlvbiA9IG51bGxwdHI7IC8vIFdoZXJlIHRvIHN0b3JlIHRoZSBvYmplY3QuLi4KKyAgT3B0aW9uVmFsdWU8RGF0YVR5cGU+IERlZmF1bHQ7CisKKyAgdm9pZCBjaGVja19sb2NhdGlvbigpIGNvbnN0IHsKKyAgICBhc3NlcnQoTG9jYXRpb24gJiYgImNsOjpsb2NhdGlvbiguLi4pIG5vdCBzcGVjaWZpZWQgZm9yIGEgY29tbWFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJsaW5lIG9wdGlvbiB3aXRoIGV4dGVybmFsIHN0b3JhZ2UsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm9yIGNsOjppbml0IHNwZWNpZmllZCBiZWZvcmUgY2w6OmxvY2F0aW9uKCkhISIpOworICB9CisKK3B1YmxpYzoKKyAgb3B0X3N0b3JhZ2UoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBzZXRMb2NhdGlvbihPcHRpb24gJk8sIERhdGFUeXBlICZMKSB7CisgICAgaWYgKExvY2F0aW9uKQorICAgICAgcmV0dXJuIE8uZXJyb3IoImNsOjpsb2NhdGlvbih4KSBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UhIik7CisgICAgTG9jYXRpb24gPSAmTDsKKyAgICBEZWZhdWx0ID0gTDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBzZXRWYWx1ZShjb25zdCBUICZWLCBib29sIGluaXRpYWwgPSBmYWxzZSkgeworICAgIGNoZWNrX2xvY2F0aW9uKCk7CisgICAgKkxvY2F0aW9uID0gVjsKKyAgICBpZiAoaW5pdGlhbCkKKyAgICAgIERlZmF1bHQgPSBWOworICB9CisKKyAgRGF0YVR5cGUgJmdldFZhbHVlKCkgeworICAgIGNoZWNrX2xvY2F0aW9uKCk7CisgICAgcmV0dXJuICpMb2NhdGlvbjsKKyAgfQorICBjb25zdCBEYXRhVHlwZSAmZ2V0VmFsdWUoKSBjb25zdCB7CisgICAgY2hlY2tfbG9jYXRpb24oKTsKKyAgICByZXR1cm4gKkxvY2F0aW9uOworICB9CisKKyAgb3BlcmF0b3IgRGF0YVR5cGUoKSBjb25zdCB7IHJldHVybiB0aGlzLT5nZXRWYWx1ZSgpOyB9CisKKyAgY29uc3QgT3B0aW9uVmFsdWU8RGF0YVR5cGU+ICZnZXREZWZhdWx0KCkgY29uc3QgeyByZXR1cm4gRGVmYXVsdDsgfQorfTsKKworLy8gRGVmaW5lIGhvdyB0byBob2xkIGEgY2xhc3MgdHlwZSBvYmplY3QsIHN1Y2ggYXMgYSBzdHJpbmcuICBTaW5jZSB3ZSBjYW4KKy8vIGluaGVyaXQgZnJvbSBhIGNsYXNzLCB3ZSBkbyBzby4gIFRoaXMgbWFrZXMgdXMgZXhhY3RseSBjb21wYXRpYmxlIHdpdGggdGhlCisvLyBvYmplY3QgaW4gYWxsIGNhc2VzIHRoYXQgaXQgaXMgdXNlZC4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGU+CitjbGFzcyBvcHRfc3RvcmFnZTxEYXRhVHlwZSwgZmFsc2UsIHRydWU+IDogcHVibGljIERhdGFUeXBlIHsKK3B1YmxpYzoKKyAgT3B0aW9uVmFsdWU8RGF0YVR5cGU+IERlZmF1bHQ7CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgc2V0VmFsdWUoY29uc3QgVCAmViwgYm9vbCBpbml0aWFsID0gZmFsc2UpIHsKKyAgICBEYXRhVHlwZTo6b3BlcmF0b3I9KFYpOworICAgIGlmIChpbml0aWFsKQorICAgICAgRGVmYXVsdCA9IFY7CisgIH0KKworICBEYXRhVHlwZSAmZ2V0VmFsdWUoKSB7IHJldHVybiAqdGhpczsgfQorICBjb25zdCBEYXRhVHlwZSAmZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgIGNvbnN0IE9wdGlvblZhbHVlPERhdGFUeXBlPiAmZ2V0RGVmYXVsdCgpIGNvbnN0IHsgcmV0dXJuIERlZmF1bHQ7IH0KK307CisKKy8vIERlZmluZSBhIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gdG8gaGFuZGxlIHRoaW5ncyB3ZSBjYW5ub3QgaW5oZXJpdCBmcm9tLiAgSW4KKy8vIHRoaXMgY2FzZSwgd2Ugc3RvcmUgYW4gaW5zdGFuY2UgdGhyb3VnaCBjb250YWlubWVudCwgYW5kIG92ZXJsb2FkIG9wZXJhdG9ycworLy8gdG8gZ2V0IGF0IHRoZSB2YWx1ZS4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGU+IGNsYXNzIG9wdF9zdG9yYWdlPERhdGFUeXBlLCBmYWxzZSwgZmFsc2U+IHsKK3B1YmxpYzoKKyAgRGF0YVR5cGUgVmFsdWU7CisgIE9wdGlvblZhbHVlPERhdGFUeXBlPiBEZWZhdWx0OworCisgIC8vIE1ha2Ugc3VyZSB3ZSBpbml0aWFsaXplIHRoZSB2YWx1ZSB3aXRoIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvciB0aGUKKyAgLy8gdHlwZS4KKyAgb3B0X3N0b3JhZ2UoKSA6IFZhbHVlKERhdGFUeXBlKCkpLCBEZWZhdWx0KERhdGFUeXBlKCkpIHt9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgc2V0VmFsdWUoY29uc3QgVCAmViwgYm9vbCBpbml0aWFsID0gZmFsc2UpIHsKKyAgICBWYWx1ZSA9IFY7CisgICAgaWYgKGluaXRpYWwpCisgICAgICBEZWZhdWx0ID0gVjsKKyAgfQorICBEYXRhVHlwZSAmZ2V0VmFsdWUoKSB7IHJldHVybiBWYWx1ZTsgfQorICBEYXRhVHlwZSBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgY29uc3QgT3B0aW9uVmFsdWU8RGF0YVR5cGU+ICZnZXREZWZhdWx0KCkgY29uc3QgeyByZXR1cm4gRGVmYXVsdDsgfQorCisgIG9wZXJhdG9yIERhdGFUeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0VmFsdWUoKTsgfQorCisgIC8vIElmIHRoZSBkYXRhdHlwZSBpcyBhIHBvaW50ZXIsIHN1cHBvcnQgLT4gb24gaXQuCisgIERhdGFUeXBlIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIG9wdCAtIEEgc2NhbGFyIGNvbW1hbmQgbGluZSBvcHRpb24uCisvLwordGVtcGxhdGUgPGNsYXNzIERhdGFUeXBlLCBib29sIEV4dGVybmFsU3RvcmFnZSA9IGZhbHNlLAorICAgICAgICAgIGNsYXNzIFBhcnNlckNsYXNzID0gcGFyc2VyPERhdGFUeXBlPj4KK2NsYXNzIG9wdCA6IHB1YmxpYyBPcHRpb24sCisgICAgICAgICAgICBwdWJsaWMgb3B0X3N0b3JhZ2U8RGF0YVR5cGUsIEV4dGVybmFsU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2NsYXNzPERhdGFUeXBlPjo6dmFsdWU+IHsKKyAgUGFyc2VyQ2xhc3MgUGFyc2VyOworCisgIGJvb2wgaGFuZGxlT2NjdXJyZW5jZSh1bnNpZ25lZCBwb3MsIFN0cmluZ1JlZiBBcmdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEFyZykgb3ZlcnJpZGUgeworICAgIHR5cGVuYW1lIFBhcnNlckNsYXNzOjpwYXJzZXJfZGF0YV90eXBlIFZhbCA9CisgICAgICAgIHR5cGVuYW1lIFBhcnNlckNsYXNzOjpwYXJzZXJfZGF0YV90eXBlKCk7CisgICAgaWYgKFBhcnNlci5wYXJzZSgqdGhpcywgQXJnTmFtZSwgQXJnLCBWYWwpKQorICAgICAgcmV0dXJuIHRydWU7IC8vIFBhcnNlIGVycm9yIQorICAgIHRoaXMtPnNldFZhbHVlKFZhbCk7CisgICAgdGhpcy0+c2V0UG9zaXRpb24ocG9zKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBlbnVtIFZhbHVlRXhwZWN0ZWQgZ2V0VmFsdWVFeHBlY3RlZEZsYWdEZWZhdWx0KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBQYXJzZXIuZ2V0VmFsdWVFeHBlY3RlZEZsYWdEZWZhdWx0KCk7CisgIH0KKworICB2b2lkIGdldEV4dHJhT3B0aW9uTmFtZXMoU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gJk9wdGlvbk5hbWVzKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIFBhcnNlci5nZXRFeHRyYU9wdGlvbk5hbWVzKE9wdGlvbk5hbWVzKTsKKyAgfQorCisgIC8vIEZvcndhcmQgcHJpbnRpbmcgc3R1ZmYgdG8gdGhlIHBhcnNlci4uLgorICBzaXplX3QgZ2V0T3B0aW9uV2lkdGgoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFBhcnNlci5nZXRPcHRpb25XaWR0aCgqdGhpcyk7CisgIH0KKworICB2b2lkIHByaW50T3B0aW9uSW5mbyhzaXplX3QgR2xvYmFsV2lkdGgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBQYXJzZXIucHJpbnRPcHRpb25JbmZvKCp0aGlzLCBHbG9iYWxXaWR0aCk7CisgIH0KKworICB2b2lkIHByaW50T3B0aW9uVmFsdWUoc2l6ZV90IEdsb2JhbFdpZHRoLCBib29sIEZvcmNlKSBjb25zdCBvdmVycmlkZSB7CisgICAgaWYgKEZvcmNlIHx8IHRoaXMtPmdldERlZmF1bHQoKS5jb21wYXJlKHRoaXMtPmdldFZhbHVlKCkpKSB7CisgICAgICBjbDo6cHJpbnRPcHRpb25EaWZmPFBhcnNlckNsYXNzPigqdGhpcywgUGFyc2VyLCB0aGlzLT5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+Z2V0RGVmYXVsdCgpLCBHbG9iYWxXaWR0aCk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICBzdGQ6OmlzX2Fzc2lnbmFibGU8VCYsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgIHZvaWQgc2V0RGVmYXVsdEltcGwoKSB7CisgICAgY29uc3QgT3B0aW9uVmFsdWU8RGF0YVR5cGU+ICZWID0gdGhpcy0+Z2V0RGVmYXVsdCgpOworICAgIGlmIChWLmhhc1ZhbHVlKCkpCisgICAgICB0aGlzLT5zZXRWYWx1ZShWLmdldFZhbHVlKCkpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAhc3RkOjppc19hc3NpZ25hYmxlPFQmLCBUPjo6dmFsdWU+Ojp0eXBlPgorICB2b2lkIHNldERlZmF1bHRJbXBsKC4uLikge30KKworICB2b2lkIHNldERlZmF1bHQoKSBvdmVycmlkZSB7IHNldERlZmF1bHRJbXBsPERhdGFUeXBlPigpOyB9CisKKyAgdm9pZCBkb25lKCkgeworICAgIGFkZEFyZ3VtZW50KCk7CisgICAgUGFyc2VyLmluaXRpYWxpemUoKTsKKyAgfQorCitwdWJsaWM6CisgIC8vIENvbW1hbmQgbGluZSBvcHRpb25zIHNob3VsZCBub3QgYmUgY29weWFibGUKKyAgb3B0KGNvbnN0IG9wdCAmKSA9IGRlbGV0ZTsKKyAgb3B0ICZvcGVyYXRvcj0oY29uc3Qgb3B0ICYpID0gZGVsZXRlOworCisgIC8vIHNldEluaXRpYWxWYWx1ZSAtIFVzZWQgYnkgdGhlIGNsOjppbml0IG1vZGlmaWVyLi4uCisgIHZvaWQgc2V0SW5pdGlhbFZhbHVlKGNvbnN0IERhdGFUeXBlICZWKSB7IHRoaXMtPnNldFZhbHVlKFYsIHRydWUpOyB9CisKKyAgUGFyc2VyQ2xhc3MgJmdldFBhcnNlcigpIHsgcmV0dXJuIFBhcnNlcjsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBUPiBEYXRhVHlwZSAmb3BlcmF0b3I9KGNvbnN0IFQgJlZhbCkgeworICAgIHRoaXMtPnNldFZhbHVlKFZhbCk7CisgICAgcmV0dXJuIHRoaXMtPmdldFZhbHVlKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gTW9kcz4KKyAgZXhwbGljaXQgb3B0KGNvbnN0IE1vZHMgJi4uLiBNcykKKyAgICAgIDogT3B0aW9uKE9wdGlvbmFsLCBOb3RIaWRkZW4pLCBQYXJzZXIoKnRoaXMpIHsKKyAgICBhcHBseSh0aGlzLCBNcy4uLik7CisgICAgZG9uZSgpOworICB9Cit9OworCitleHRlcm4gdGVtcGxhdGUgY2xhc3Mgb3B0PHVuc2lnbmVkPjsKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBvcHQ8aW50PjsKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBvcHQ8c3RkOjpzdHJpbmc+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIG9wdDxjaGFyPjsKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBvcHQ8Ym9vbD47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBsaXN0X3N0b3JhZ2UgY2xhc3MKKworLy8gRGVmYXVsdCBzdG9yYWdlIGNsYXNzIGRlZmluaXRpb246IGV4dGVybmFsIHN0b3JhZ2UuICBUaGlzIGltcGxlbWVudGF0aW9uCisvLyBhc3N1bWVzIHRoZSB1c2VyIHdpbGwgc3BlY2lmeSBhIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBkYXRhIGludG8gd2l0aCB0aGUKKy8vIGNsOjpsb2NhdGlvbih4KSBtb2RpZmllci4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGUsIGNsYXNzIFN0b3JhZ2VDbGFzcz4gY2xhc3MgbGlzdF9zdG9yYWdlIHsKKyAgU3RvcmFnZUNsYXNzICpMb2NhdGlvbiA9IG51bGxwdHI7IC8vIFdoZXJlIHRvIHN0b3JlIHRoZSBvYmplY3QuLi4KKworcHVibGljOgorICBsaXN0X3N0b3JhZ2UoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBzZXRMb2NhdGlvbihPcHRpb24gJk8sIFN0b3JhZ2VDbGFzcyAmTCkgeworICAgIGlmIChMb2NhdGlvbikKKyAgICAgIHJldHVybiBPLmVycm9yKCJjbDo6bG9jYXRpb24oeCkgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlISIpOworICAgIExvY2F0aW9uID0gJkw7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgYWRkVmFsdWUoY29uc3QgVCAmVikgeworICAgIGFzc2VydChMb2NhdGlvbiAhPSAwICYmICJjbDo6bG9jYXRpb24oLi4uKSBub3Qgc3BlY2lmaWVkIGZvciBhIGNvbW1hbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lIG9wdGlvbiB3aXRoIGV4dGVybmFsIHN0b3JhZ2UhIik7CisgICAgTG9jYXRpb24tPnB1c2hfYmFjayhWKTsKKyAgfQorfTsKKworLy8gRGVmaW5lIGhvdyB0byBob2xkIGEgY2xhc3MgdHlwZSBvYmplY3QsIHN1Y2ggYXMgYSBzdHJpbmcuCisvLyBPcmlnaW5hbGx5IHRoaXMgY29kZSBpbmhlcml0ZWQgZnJvbSBzdGQ6OnZlY3Rvci4gSW4gdHJhbnNpdGlvbmluZyB0byBhIG5ldworLy8gQVBJIGZvciBjb21tYW5kIGxpbmUgb3B0aW9ucyB3ZSBzaG91bGQgY2hhbmdlIHRoaXMuIFRoZSBuZXcgaW1wbGVtZW50YXRpb24KKy8vIG9mIHRoaXMgbGlzdF9zdG9yYWdlIHNwZWNpYWxpemF0aW9uIGltcGxlbWVudHMgdGhlIG1pbmltdW0gc3Vic2V0IG9mIHRoZQorLy8gc3RkOjp2ZWN0b3IgQVBJIHJlcXVpcmVkIGZvciBhbGwgdGhlIGN1cnJlbnQgY2xpZW50cy4KKy8vCisvLyBGSVhNRTogUmVkdWNlIHRoaXMgQVBJIHRvIGEgbW9yZSBuYXJyb3cgc3Vic2V0IG9mIHN0ZDo6dmVjdG9yCisvLwordGVtcGxhdGUgPGNsYXNzIERhdGFUeXBlPiBjbGFzcyBsaXN0X3N0b3JhZ2U8RGF0YVR5cGUsIGJvb2w+IHsKKyAgc3RkOjp2ZWN0b3I8RGF0YVR5cGU+IFN0b3JhZ2U7CisKK3B1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxEYXRhVHlwZT46Oml0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gU3RvcmFnZS5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIFN0b3JhZ2UuZW5kKCk7IH0KKworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IHR5cGVuYW1lIHN0ZDo6dmVjdG9yPERhdGFUeXBlPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBTdG9yYWdlLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gU3RvcmFnZS5lbmQoKTsgfQorCisgIHVzaW5nIHNpemVfdHlwZSA9IHR5cGVuYW1lIHN0ZDo6dmVjdG9yPERhdGFUeXBlPjo6c2l6ZV90eXBlOworCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gU3RvcmFnZS5zaXplKCk7IH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gU3RvcmFnZS5lbXB0eSgpOyB9CisKKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgRGF0YVR5cGUgJnZhbHVlKSB7IFN0b3JhZ2UucHVzaF9iYWNrKHZhbHVlKTsgfQorICB2b2lkIHB1c2hfYmFjayhEYXRhVHlwZSAmJnZhbHVlKSB7IFN0b3JhZ2UucHVzaF9iYWNrKHZhbHVlKTsgfQorCisgIHVzaW5nIHJlZmVyZW5jZSA9IHR5cGVuYW1lIHN0ZDo6dmVjdG9yPERhdGFUeXBlPjo6cmVmZXJlbmNlOworICB1c2luZyBjb25zdF9yZWZlcmVuY2UgPSB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxEYXRhVHlwZT46OmNvbnN0X3JlZmVyZW5jZTsKKworICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgcG9zKSB7IHJldHVybiBTdG9yYWdlW3Bvc107IH0KKyAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIHBvcykgY29uc3QgeyByZXR1cm4gU3RvcmFnZVtwb3NdOyB9CisKKyAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgcG9zKSB7IHJldHVybiBTdG9yYWdlLmVyYXNlKHBvcyk7IH0KKyAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIGxhc3QpIHsKKyAgICByZXR1cm4gU3RvcmFnZS5lcmFzZShmaXJzdCwgbGFzdCk7CisgIH0KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBwb3MpIHsgcmV0dXJuIFN0b3JhZ2UuZXJhc2UocG9zKTsgfQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBmaXJzdCwgaXRlcmF0b3IgbGFzdCkgeworICAgIHJldHVybiBTdG9yYWdlLmVyYXNlKGZpcnN0LCBsYXN0KTsKKyAgfQorCisgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3MsIGNvbnN0IERhdGFUeXBlICZ2YWx1ZSkgeworICAgIHJldHVybiBTdG9yYWdlLmluc2VydChwb3MsIHZhbHVlKTsKKyAgfQorICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcG9zLCBEYXRhVHlwZSAmJnZhbHVlKSB7CisgICAgcmV0dXJuIFN0b3JhZ2UuaW5zZXJ0KHBvcywgdmFsdWUpOworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIHBvcywgY29uc3QgRGF0YVR5cGUgJnZhbHVlKSB7CisgICAgcmV0dXJuIFN0b3JhZ2UuaW5zZXJ0KHBvcywgdmFsdWUpOworICB9CisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBwb3MsIERhdGFUeXBlICYmdmFsdWUpIHsKKyAgICByZXR1cm4gU3RvcmFnZS5pbnNlcnQocG9zLCB2YWx1ZSk7CisgIH0KKworICByZWZlcmVuY2UgZnJvbnQoKSB7IHJldHVybiBTdG9yYWdlLmZyb250KCk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4gU3RvcmFnZS5mcm9udCgpOyB9CisKKyAgb3BlcmF0b3Igc3RkOjp2ZWN0b3I8RGF0YVR5cGU+JigpIHsgcmV0dXJuIFN0b3JhZ2U7IH0KKyAgb3BlcmF0b3IgQXJyYXlSZWY8RGF0YVR5cGU+KCkgeyByZXR1cm4gU3RvcmFnZTsgfQorICBzdGQ6OnZlY3RvcjxEYXRhVHlwZT4gKm9wZXJhdG9yJigpIHsgcmV0dXJuICZTdG9yYWdlOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPERhdGFUeXBlPiAqb3BlcmF0b3ImKCkgY29uc3QgeyByZXR1cm4gJlN0b3JhZ2U7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBhZGRWYWx1ZShjb25zdCBUICZWKSB7IFN0b3JhZ2UucHVzaF9iYWNrKFYpOyB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gbGlzdCAtIEEgbGlzdCBvZiBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGUsIGNsYXNzIFN0b3JhZ2VDbGFzcyA9IGJvb2wsCisgICAgICAgICAgY2xhc3MgUGFyc2VyQ2xhc3MgPSBwYXJzZXI8RGF0YVR5cGU+PgorY2xhc3MgbGlzdCA6IHB1YmxpYyBPcHRpb24sIHB1YmxpYyBsaXN0X3N0b3JhZ2U8RGF0YVR5cGUsIFN0b3JhZ2VDbGFzcz4geworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gUG9zaXRpb25zOworICBQYXJzZXJDbGFzcyBQYXJzZXI7CisKKyAgZW51bSBWYWx1ZUV4cGVjdGVkIGdldFZhbHVlRXhwZWN0ZWRGbGFnRGVmYXVsdCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUGFyc2VyLmdldFZhbHVlRXhwZWN0ZWRGbGFnRGVmYXVsdCgpOworICB9CisKKyAgdm9pZCBnZXRFeHRyYU9wdGlvbk5hbWVzKFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICZPcHRpb25OYW1lcykgb3ZlcnJpZGUgeworICAgIHJldHVybiBQYXJzZXIuZ2V0RXh0cmFPcHRpb25OYW1lcyhPcHRpb25OYW1lcyk7CisgIH0KKworICBib29sIGhhbmRsZU9jY3VycmVuY2UodW5zaWduZWQgcG9zLCBTdHJpbmdSZWYgQXJnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBBcmcpIG92ZXJyaWRlIHsKKyAgICB0eXBlbmFtZSBQYXJzZXJDbGFzczo6cGFyc2VyX2RhdGFfdHlwZSBWYWwgPQorICAgICAgICB0eXBlbmFtZSBQYXJzZXJDbGFzczo6cGFyc2VyX2RhdGFfdHlwZSgpOworICAgIGlmIChQYXJzZXIucGFyc2UoKnRoaXMsIEFyZ05hbWUsIEFyZywgVmFsKSkKKyAgICAgIHJldHVybiB0cnVlOyAvLyBQYXJzZSBFcnJvciEKKyAgICBsaXN0X3N0b3JhZ2U8RGF0YVR5cGUsIFN0b3JhZ2VDbGFzcz46OmFkZFZhbHVlKFZhbCk7CisgICAgc2V0UG9zaXRpb24ocG9zKTsKKyAgICBQb3NpdGlvbnMucHVzaF9iYWNrKHBvcyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gRm9yd2FyZCBwcmludGluZyBzdHVmZiB0byB0aGUgcGFyc2VyLi4uCisgIHNpemVfdCBnZXRPcHRpb25XaWR0aCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUGFyc2VyLmdldE9wdGlvbldpZHRoKCp0aGlzKTsKKyAgfQorCisgIHZvaWQgcHJpbnRPcHRpb25JbmZvKHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIFBhcnNlci5wcmludE9wdGlvbkluZm8oKnRoaXMsIEdsb2JhbFdpZHRoKTsKKyAgfQorCisgIC8vIFVuaW1wbGVtZW50ZWQ6IGxpc3Qgb3B0aW9ucyBkb24ndCBjdXJyZW50bHkgc3RvcmUgdGhlaXIgZGVmYXVsdCB2YWx1ZS4KKyAgdm9pZCBwcmludE9wdGlvblZhbHVlKHNpemVfdCAvKkdsb2JhbFdpZHRoKi8sIGJvb2wgLypGb3JjZSovKSBjb25zdCBvdmVycmlkZSB7CisgIH0KKworICB2b2lkIHNldERlZmF1bHQoKSBvdmVycmlkZSB7fQorCisgIHZvaWQgZG9uZSgpIHsKKyAgICBhZGRBcmd1bWVudCgpOworICAgIFBhcnNlci5pbml0aWFsaXplKCk7CisgIH0KKworcHVibGljOgorICAvLyBDb21tYW5kIGxpbmUgb3B0aW9ucyBzaG91bGQgbm90IGJlIGNvcHlhYmxlCisgIGxpc3QoY29uc3QgbGlzdCAmKSA9IGRlbGV0ZTsKKyAgbGlzdCAmb3BlcmF0b3I9KGNvbnN0IGxpc3QgJikgPSBkZWxldGU7CisKKyAgUGFyc2VyQ2xhc3MgJmdldFBhcnNlcigpIHsgcmV0dXJuIFBhcnNlcjsgfQorCisgIHVuc2lnbmVkIGdldFBvc2l0aW9uKHVuc2lnbmVkIG9wdG51bSkgY29uc3QgeworICAgIGFzc2VydChvcHRudW0gPCB0aGlzLT5zaXplKCkgJiYgIkludmFsaWQgb3B0aW9uIGluZGV4Iik7CisgICAgcmV0dXJuIFBvc2l0aW9uc1tvcHRudW1dOworICB9CisKKyAgdm9pZCBzZXROdW1BZGRpdGlvbmFsVmFscyh1bnNpZ25lZCBuKSB7IE9wdGlvbjo6c2V0TnVtQWRkaXRpb25hbFZhbHMobik7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gTW9kcz4KKyAgZXhwbGljaXQgbGlzdChjb25zdCBNb2RzICYuLi4gTXMpCisgICAgICA6IE9wdGlvbihaZXJvT3JNb3JlLCBOb3RIaWRkZW4pLCBQYXJzZXIoKnRoaXMpIHsKKyAgICBhcHBseSh0aGlzLCBNcy4uLik7CisgICAgZG9uZSgpOworICB9Cit9OworCisvLyBtdWx0aV92YWwgLSBNb2RpZmllciB0byBzZXQgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHZhbHVlcy4KK3N0cnVjdCBtdWx0aV92YWwgeworICB1bnNpZ25lZCBBZGRpdGlvbmFsVmFsczsKKyAgZXhwbGljaXQgbXVsdGlfdmFsKHVuc2lnbmVkIE4pIDogQWRkaXRpb25hbFZhbHMoTikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRCwgdHlwZW5hbWUgUywgdHlwZW5hbWUgUD4KKyAgdm9pZCBhcHBseShsaXN0PEQsIFMsIFA+ICZMKSBjb25zdCB7CisgICAgTC5zZXROdW1BZGRpdGlvbmFsVmFscyhBZGRpdGlvbmFsVmFscyk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBiaXRzX3N0b3JhZ2UgY2xhc3MKKworLy8gRGVmYXVsdCBzdG9yYWdlIGNsYXNzIGRlZmluaXRpb246IGV4dGVybmFsIHN0b3JhZ2UuICBUaGlzIGltcGxlbWVudGF0aW9uCisvLyBhc3N1bWVzIHRoZSB1c2VyIHdpbGwgc3BlY2lmeSBhIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBkYXRhIGludG8gd2l0aCB0aGUKKy8vIGNsOjpsb2NhdGlvbih4KSBtb2RpZmllci4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGUsIGNsYXNzIFN0b3JhZ2VDbGFzcz4gY2xhc3MgYml0c19zdG9yYWdlIHsKKyAgdW5zaWduZWQgKkxvY2F0aW9uID0gbnVsbHB0cjsgLy8gV2hlcmUgdG8gc3RvcmUgdGhlIGJpdHMuLi4KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RhdGljIHVuc2lnbmVkIEJpdChjb25zdCBUICZWKSB7CisgICAgdW5zaWduZWQgQml0UG9zID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZD4oVik7CisgICAgYXNzZXJ0KEJpdFBvcyA8IHNpemVvZih1bnNpZ25lZCkgKiBDSEFSX0JJVCAmJgorICAgICAgICAgICAiZW51bSBleGNlZWRzIHdpZHRoIG9mIGJpdCB2ZWN0b3IhIik7CisgICAgcmV0dXJuIDEgPDwgQml0UG9zOworICB9CisKK3B1YmxpYzoKKyAgYml0c19zdG9yYWdlKCkgPSBkZWZhdWx0OworCisgIGJvb2wgc2V0TG9jYXRpb24oT3B0aW9uICZPLCB1bnNpZ25lZCAmTCkgeworICAgIGlmIChMb2NhdGlvbikKKyAgICAgIHJldHVybiBPLmVycm9yKCJjbDo6bG9jYXRpb24oeCkgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlISIpOworICAgIExvY2F0aW9uID0gJkw7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgYWRkVmFsdWUoY29uc3QgVCAmVikgeworICAgIGFzc2VydChMb2NhdGlvbiAhPSAwICYmICJjbDo6bG9jYXRpb24oLi4uKSBub3Qgc3BlY2lmaWVkIGZvciBhIGNvbW1hbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lIG9wdGlvbiB3aXRoIGV4dGVybmFsIHN0b3JhZ2UhIik7CisgICAgKkxvY2F0aW9uIHw9IEJpdChWKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldEJpdHMoKSB7IHJldHVybiAqTG9jYXRpb247IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gYm9vbCBpc1NldChjb25zdCBUICZWKSB7CisgICAgcmV0dXJuICgqTG9jYXRpb24gJiBCaXQoVikpICE9IDA7CisgIH0KK307CisKKy8vIERlZmluZSBob3cgdG8gaG9sZCBiaXRzLiAgU2luY2Ugd2UgY2FuIGluaGVyaXQgZnJvbSBhIGNsYXNzLCB3ZSBkbyBzby4KKy8vIFRoaXMgbWFrZXMgdXMgZXhhY3RseSBjb21wYXRpYmxlIHdpdGggdGhlIGJpdHMgaW4gYWxsIGNhc2VzIHRoYXQgaXQgaXMgdXNlZC4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGU+IGNsYXNzIGJpdHNfc3RvcmFnZTxEYXRhVHlwZSwgYm9vbD4geworICB1bnNpZ25lZCBCaXRzOyAvLyBXaGVyZSB0byBzdG9yZSB0aGUgYml0cy4uLgorCisgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdGF0aWMgdW5zaWduZWQgQml0KGNvbnN0IFQgJlYpIHsKKyAgICB1bnNpZ25lZCBCaXRQb3MgPSAodW5zaWduZWQpVjsKKyAgICBhc3NlcnQoQml0UG9zIDwgc2l6ZW9mKHVuc2lnbmVkKSAqIENIQVJfQklUICYmCisgICAgICAgICAgICJlbnVtIGV4Y2VlZHMgd2lkdGggb2YgYml0IHZlY3RvciEiKTsKKyAgICByZXR1cm4gMSA8PCBCaXRQb3M7CisgIH0KKworcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBhZGRWYWx1ZShjb25zdCBUICZWKSB7IEJpdHMgfD0gQml0KFYpOyB9CisKKyAgdW5zaWduZWQgZ2V0Qml0cygpIHsgcmV0dXJuIEJpdHM7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gYm9vbCBpc1NldChjb25zdCBUICZWKSB7IHJldHVybiAoQml0cyAmIEJpdChWKSkgIT0gMDsgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIGJpdHMgLSBBIGJpdCB2ZWN0b3Igb2YgY29tbWFuZCBvcHRpb25zLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBEYXRhVHlwZSwgY2xhc3MgU3RvcmFnZSA9IGJvb2wsCisgICAgICAgICAgY2xhc3MgUGFyc2VyQ2xhc3MgPSBwYXJzZXI8RGF0YVR5cGU+PgorY2xhc3MgYml0cyA6IHB1YmxpYyBPcHRpb24sIHB1YmxpYyBiaXRzX3N0b3JhZ2U8RGF0YVR5cGUsIFN0b3JhZ2U+IHsKKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IFBvc2l0aW9uczsKKyAgUGFyc2VyQ2xhc3MgUGFyc2VyOworCisgIGVudW0gVmFsdWVFeHBlY3RlZCBnZXRWYWx1ZUV4cGVjdGVkRmxhZ0RlZmF1bHQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFBhcnNlci5nZXRWYWx1ZUV4cGVjdGVkRmxhZ0RlZmF1bHQoKTsKKyAgfQorCisgIHZvaWQgZ2V0RXh0cmFPcHRpb25OYW1lcyhTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmT3B0aW9uTmFtZXMpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUGFyc2VyLmdldEV4dHJhT3B0aW9uTmFtZXMoT3B0aW9uTmFtZXMpOworICB9CisKKyAgYm9vbCBoYW5kbGVPY2N1cnJlbmNlKHVuc2lnbmVkIHBvcywgU3RyaW5nUmVmIEFyZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQXJnKSBvdmVycmlkZSB7CisgICAgdHlwZW5hbWUgUGFyc2VyQ2xhc3M6OnBhcnNlcl9kYXRhX3R5cGUgVmFsID0KKyAgICAgICAgdHlwZW5hbWUgUGFyc2VyQ2xhc3M6OnBhcnNlcl9kYXRhX3R5cGUoKTsKKyAgICBpZiAoUGFyc2VyLnBhcnNlKCp0aGlzLCBBcmdOYW1lLCBBcmcsIFZhbCkpCisgICAgICByZXR1cm4gdHJ1ZTsgLy8gUGFyc2UgRXJyb3IhCisgICAgdGhpcy0+YWRkVmFsdWUoVmFsKTsKKyAgICBzZXRQb3NpdGlvbihwb3MpOworICAgIFBvc2l0aW9ucy5wdXNoX2JhY2socG9zKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBGb3J3YXJkIHByaW50aW5nIHN0dWZmIHRvIHRoZSBwYXJzZXIuLi4KKyAgc2l6ZV90IGdldE9wdGlvbldpZHRoKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBQYXJzZXIuZ2V0T3B0aW9uV2lkdGgoKnRoaXMpOworICB9CisKKyAgdm9pZCBwcmludE9wdGlvbkluZm8oc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdCBvdmVycmlkZSB7CisgICAgUGFyc2VyLnByaW50T3B0aW9uSW5mbygqdGhpcywgR2xvYmFsV2lkdGgpOworICB9CisKKyAgLy8gVW5pbXBsZW1lbnRlZDogYml0cyBvcHRpb25zIGRvbid0IGN1cnJlbnRseSBzdG9yZSB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgdm9pZCBwcmludE9wdGlvblZhbHVlKHNpemVfdCAvKkdsb2JhbFdpZHRoKi8sIGJvb2wgLypGb3JjZSovKSBjb25zdCBvdmVycmlkZSB7CisgIH0KKworICB2b2lkIHNldERlZmF1bHQoKSBvdmVycmlkZSB7fQorCisgIHZvaWQgZG9uZSgpIHsKKyAgICBhZGRBcmd1bWVudCgpOworICAgIFBhcnNlci5pbml0aWFsaXplKCk7CisgIH0KKworcHVibGljOgorICAvLyBDb21tYW5kIGxpbmUgb3B0aW9ucyBzaG91bGQgbm90IGJlIGNvcHlhYmxlCisgIGJpdHMoY29uc3QgYml0cyAmKSA9IGRlbGV0ZTsKKyAgYml0cyAmb3BlcmF0b3I9KGNvbnN0IGJpdHMgJikgPSBkZWxldGU7CisKKyAgUGFyc2VyQ2xhc3MgJmdldFBhcnNlcigpIHsgcmV0dXJuIFBhcnNlcjsgfQorCisgIHVuc2lnbmVkIGdldFBvc2l0aW9uKHVuc2lnbmVkIG9wdG51bSkgY29uc3QgeworICAgIGFzc2VydChvcHRudW0gPCB0aGlzLT5zaXplKCkgJiYgIkludmFsaWQgb3B0aW9uIGluZGV4Iik7CisgICAgcmV0dXJuIFBvc2l0aW9uc1tvcHRudW1dOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzLi4uIE1vZHM+CisgIGV4cGxpY2l0IGJpdHMoY29uc3QgTW9kcyAmLi4uIE1zKQorICAgICAgOiBPcHRpb24oWmVyb09yTW9yZSwgTm90SGlkZGVuKSwgUGFyc2VyKCp0aGlzKSB7CisgICAgYXBwbHkodGhpcywgTXMuLi4pOworICAgIGRvbmUoKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFsaWFzZWQgY29tbWFuZCBsaW5lIG9wdGlvbiAoYWxpYXMgdGhpcyBuYW1lIHRvIGEgcHJlZXhpc3RpbmcgbmFtZSkKKy8vCisKK2NsYXNzIGFsaWFzIDogcHVibGljIE9wdGlvbiB7CisgIE9wdGlvbiAqQWxpYXNGb3I7CisKKyAgYm9vbCBoYW5kbGVPY2N1cnJlbmNlKHVuc2lnbmVkIHBvcywgU3RyaW5nUmVmIC8qQXJnTmFtZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEFyZykgb3ZlcnJpZGUgeworICAgIHJldHVybiBBbGlhc0Zvci0+aGFuZGxlT2NjdXJyZW5jZShwb3MsIEFsaWFzRm9yLT5BcmdTdHIsIEFyZyk7CisgIH0KKworICBib29sIGFkZE9jY3VycmVuY2UodW5zaWduZWQgcG9zLCBTdHJpbmdSZWYgLypBcmdOYW1lKi8sIFN0cmluZ1JlZiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgTXVsdGlBcmcgPSBmYWxzZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBBbGlhc0Zvci0+YWRkT2NjdXJyZW5jZShwb3MsIEFsaWFzRm9yLT5BcmdTdHIsIFZhbHVlLCBNdWx0aUFyZyk7CisgIH0KKworICAvLyBIYW5kbGUgcHJpbnRpbmcgc3R1ZmYuLi4KKyAgc2l6ZV90IGdldE9wdGlvbldpZHRoKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgcHJpbnRPcHRpb25JbmZvKHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8gQWxpYXNlcyBkbyBub3QgbmVlZCB0byBwcmludCB0aGVpciB2YWx1ZXMuCisgIHZvaWQgcHJpbnRPcHRpb25WYWx1ZShzaXplX3QgLypHbG9iYWxXaWR0aCovLCBib29sIC8qRm9yY2UqLykgY29uc3Qgb3ZlcnJpZGUgeworICB9CisKKyAgdm9pZCBzZXREZWZhdWx0KCkgb3ZlcnJpZGUgeyBBbGlhc0Zvci0+c2V0RGVmYXVsdCgpOyB9CisKKyAgVmFsdWVFeHBlY3RlZCBnZXRWYWx1ZUV4cGVjdGVkRmxhZ0RlZmF1bHQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEFsaWFzRm9yLT5nZXRWYWx1ZUV4cGVjdGVkRmxhZygpOworICB9CisKKyAgdm9pZCBkb25lKCkgeworICAgIGlmICghaGFzQXJnU3RyKCkpCisgICAgICBlcnJvcigiY2w6OmFsaWFzIG11c3QgaGF2ZSBhcmd1bWVudCBuYW1lIHNwZWNpZmllZCEiKTsKKyAgICBpZiAoIUFsaWFzRm9yKQorICAgICAgZXJyb3IoImNsOjphbGlhcyBtdXN0IGhhdmUgYW4gY2w6OmFsaWFzb3B0KG9wdGlvbikgc3BlY2lmaWVkISIpOworICAgIFN1YnMgPSBBbGlhc0Zvci0+U3ViczsKKyAgICBhZGRBcmd1bWVudCgpOworICB9CisKK3B1YmxpYzoKKyAgLy8gQ29tbWFuZCBsaW5lIG9wdGlvbnMgc2hvdWxkIG5vdCBiZSBjb3B5YWJsZQorICBhbGlhcyhjb25zdCBhbGlhcyAmKSA9IGRlbGV0ZTsKKyAgYWxpYXMgJm9wZXJhdG9yPShjb25zdCBhbGlhcyAmKSA9IGRlbGV0ZTsKKworICB2b2lkIHNldEFsaWFzRm9yKE9wdGlvbiAmTykgeworICAgIGlmIChBbGlhc0ZvcikKKyAgICAgIGVycm9yKCJjbDo6YWxpYXMgbXVzdCBvbmx5IGhhdmUgb25lIGNsOjphbGlhc29wdCguLi4pIHNwZWNpZmllZCEiKTsKKyAgICBBbGlhc0ZvciA9ICZPOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzLi4uIE1vZHM+CisgIGV4cGxpY2l0IGFsaWFzKGNvbnN0IE1vZHMgJi4uLiBNcykKKyAgICAgIDogT3B0aW9uKE9wdGlvbmFsLCBIaWRkZW4pLCBBbGlhc0ZvcihudWxscHRyKSB7CisgICAgYXBwbHkodGhpcywgTXMuLi4pOworICAgIGRvbmUoKTsKKyAgfQorfTsKKworLy8gYWxpYXNmb3IgLSBNb2RpZmllciB0byBzZXQgdGhlIG9wdGlvbiBhbiBhbGlhcyBhbGlhc2VzLgorc3RydWN0IGFsaWFzb3B0IHsKKyAgT3B0aW9uICZPcHQ7CisKKyAgZXhwbGljaXQgYWxpYXNvcHQoT3B0aW9uICZPKSA6IE9wdChPKSB7fQorCisgIHZvaWQgYXBwbHkoYWxpYXMgJkEpIGNvbnN0IHsgQS5zZXRBbGlhc0ZvcihPcHQpOyB9Cit9OworCisvLyBleHRyYWhlbHAgLSBwcm92aWRlIGFkZGl0aW9uYWwgaGVscCBhdCB0aGUgZW5kIG9mIHRoZSBub3JtYWwgaGVscAorLy8gb3V0cHV0LiBBbGwgb2NjdXJyZW5jZXMgb2YgY2w6OmV4dHJhaGVscCB3aWxsIGJlIGFjY3VtdWxhdGVkIGFuZAorLy8gcHJpbnRlZCB0byBzdGRlcnIgYXQgdGhlIGVuZCBvZiB0aGUgcmVndWxhciBoZWxwLCBqdXN0IGJlZm9yZQorLy8gZXhpdCBpcyBjYWxsZWQuCitzdHJ1Y3QgZXh0cmFoZWxwIHsKKyAgU3RyaW5nUmVmIG1vcmVoZWxwOworCisgIGV4cGxpY2l0IGV4dHJhaGVscChTdHJpbmdSZWYgaGVscCk7Cit9OworCit2b2lkIFByaW50VmVyc2lvbk1lc3NhZ2UoKTsKKworLy8vIFRoaXMgZnVuY3Rpb24ganVzdCBwcmludHMgdGhlIGhlbHAgbWVzc2FnZSwgZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgaWYgdGhlCisvLy8gLWhlbHAgb3IgLWhlbHAtaGlkZGVuIG9wdGlvbiBoYWQgYmVlbiBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgorLy8vCisvLy8gXHBhcmFtIEhpZGRlbiBpZiB0cnVlIHdpbGwgcHJpbnQgaGlkZGVuIG9wdGlvbnMKKy8vLyBccGFyYW0gQ2F0ZWdvcml6ZWQgaWYgdHJ1ZSBwcmludCBvcHRpb25zIGluIGNhdGVnb3JpZXMKK3ZvaWQgUHJpbnRIZWxwTWVzc2FnZShib29sIEhpZGRlbiA9IGZhbHNlLCBib29sIENhdGVnb3JpemVkID0gZmFsc2UpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUHVibGljIGludGVyZmFjZSBmb3IgYWNjZXNzaW5nIHJlZ2lzdGVyZWQgb3B0aW9ucy4KKy8vCisKKy8vLyBcYnJpZWYgVXNlIHRoaXMgdG8gZ2V0IGEgU3RyaW5nTWFwIHRvIGFsbCByZWdpc3RlcmVkIG5hbWVkIG9wdGlvbnMKKy8vLyAoZS5nLiAtaGVscCkuIE5vdGUgXHAgTWFwIFNob3VsZCBiZSBhbiBlbXB0eSBTdHJpbmdNYXAuCisvLy8KKy8vLyBccmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoZSBTdHJpbmdNYXAgdXNlZCBieSB0aGUgY2wgQVBJcyB0byBwYXJzZSBvcHRpb25zLgorLy8vCisvLy8gQWNjZXNzIHRvIHVubmFtZWQgYXJndW1lbnRzIChpLmUuIHBvc2l0aW9uYWwpIGFyZSBub3QgcHJvdmlkZWQgYmVjYXVzZQorLy8vIGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGNsaWVudCBhbHJlYWR5IGhhcyBhY2Nlc3MgdG8gdGhlc2UuCisvLy8KKy8vLyBUeXBpY2FsIHVzYWdlOgorLy8vIFxjb2RlCisvLy8gbWFpbihpbnQgYXJnYyxjaGFyKiBhcmd2W10pIHsKKy8vLyBTdHJpbmdNYXA8bGx2bTo6Y2w6Ok9wdGlvbio+ICZvcHRzID0gbGx2bTo6Y2w6OmdldFJlZ2lzdGVyZWRPcHRpb25zKCk7CisvLy8gYXNzZXJ0KG9wdHMuY291bnQoImhlbHAiKSA9PSAxKQorLy8vIG9wdHNbImhlbHAiXS0+c2V0RGVzY3JpcHRpb24oIlNob3cgYWxwaGFiZXRpY2FsIGhlbHAgaW5mb3JtYXRpb24iKQorLy8vIC8vIE1vcmUgY29kZQorLy8vIGxsdm06OmNsOjpQYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyhhcmdjLGFyZ3YpOworLy8vIC8vTW9yZSBjb2RlCisvLy8gfQorLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludGVyZmFjZSBpcyB1c2VmdWwgZm9yIG1vZGlmeWluZyBvcHRpb25zIGluIGxpYnJhcmllcyB0aGF0IGFyZSBvdXQgb2YKKy8vLyB0aGUgY29udHJvbCBvZiB0aGUgY2xpZW50LiBUaGUgb3B0aW9ucyBzaG91bGQgYmUgbW9kaWZpZWQgYmVmb3JlIGNhbGxpbmcKKy8vLyBsbHZtOjpjbDo6UGFyc2VDb21tYW5kTGluZU9wdGlvbnMoKS4KKy8vLworLy8vIEhvcGVmdWxseSB0aGlzIEFQSSBjYW4gYmUgZGVwcmVjYXRlZCBzb29uLiBBbnkgc2l0dWF0aW9uIHdoZXJlIG9wdGlvbnMgbmVlZAorLy8vIHRvIGJlIG1vZGlmaWVkIGJ5IHRvb2xzIG9yIGxpYnJhcmllcyBzaG91bGQgYmUgaGFuZGxlZCBieSBzYW5lIEFQSXMgcmF0aGVyCisvLy8gdGhhbiBqdXN0IGhhbmRpbmcgYXJvdW5kIGEgZ2xvYmFsIGxpc3QuCitTdHJpbmdNYXA8T3B0aW9uICo+ICZnZXRSZWdpc3RlcmVkT3B0aW9ucyhTdWJDb21tYW5kICZTdWIgPSAqVG9wTGV2ZWxTdWJDb21tYW5kKTsKKworLy8vIFxicmllZiBVc2UgdGhpcyB0byBnZXQgYWxsIHJlZ2lzdGVyZWQgU3ViQ29tbWFuZHMgZnJvbSB0aGUgcHJvdmlkZWQgcGFyc2VyLgorLy8vCisvLy8gXHJldHVybiBBIHJhbmdlIG9mIGFsbCBTdWJDb21tYW5kIHBvaW50ZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcGFyc2VyLgorLy8vCisvLy8gVHlwaWNhbCB1c2FnZToKKy8vLyBcY29kZQorLy8vIG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworLy8vICAgbGx2bTo6Y2w6OlBhcnNlQ29tbWFuZExpbmVPcHRpb25zKGFyZ2MsIGFyZ3YpOworLy8vICAgZm9yIChhdXRvKiBTIDogbGx2bTo6Y2w6OmdldFJlZ2lzdGVyZWRTdWJjb21tYW5kcygpKSB7CisvLy8gICAgIGlmICgqUykgeworLy8vICAgICAgIHN0ZDo6Y291dCA8PCAiRXhlY3V0aW5nIHN1YmNvbW1hbmQ6ICIgPDwgUy0+Z2V0TmFtZSgpIDw8IHN0ZDo6ZW5kbDsKKy8vLyAgICAgICAvLyBFeGVjdXRlIHNvbWUgZnVuY3Rpb24gYmFzZWQgb24gdGhlIG5hbWUuLi4KKy8vLyAgICAgfQorLy8vICAgfQorLy8vIH0KKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZnVsIGZvciBkZWZpbmluZyBzdWJjb21tYW5kcyBpbiBsaWJyYXJpZXMgYW5kCisvLy8gdGhlIGRpc3BhdGNoIGZyb20gYSBzaW5nbGUgcG9pbnQgKGxpa2UgaW4gdGhlIG1haW4gZnVuY3Rpb24pLgoraXRlcmF0b3JfcmFuZ2U8dHlwZW5hbWUgU21hbGxQdHJTZXQ8U3ViQ29tbWFuZCAqLCA0Pjo6aXRlcmF0b3I+CitnZXRSZWdpc3RlcmVkU3ViY29tbWFuZHMoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFN0YW5kYWxvbmUgY29tbWFuZCBsaW5lIHByb2Nlc3NpbmcgdXRpbGl0aWVzLgorLy8KKworLy8vIFxicmllZiBUb2tlbml6ZXMgYSBjb21tYW5kIGxpbmUgdGhhdCBjYW4gY29udGFpbiBlc2NhcGVzIGFuZCBxdW90ZXMuCisvLworLy8vIFRoZSBxdW90aW5nIHJ1bGVzIG1hdGNoIHRob3NlIHVzZWQgYnkgR0NDIGFuZCBvdGhlciB0b29scyB0aGF0IHVzZQorLy8vIGxpYmliZXJ0eSdzIGJ1aWxkYXJndigpIG9yIGV4cGFuZGFyZ3YoKSB1dGlsaXRpZXMsIGFuZCBkbyBub3QgbWF0Y2ggYmFzaC4KKy8vLyBUaGV5IGRpZmZlciBmcm9tIGJ1aWxkYXJndigpIG9uIHRyZWF0bWVudCBvZiBiYWNrc2xhc2hlcyB0aGF0IGRvIG5vdCBlc2NhcGUKKy8vLyBhIHNwZWNpYWwgY2hhcmFjdGVyIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gYWNjZXB0IG1vc3QgV2luZG93cyBmaWxlIHBhdGhzLgorLy8vCisvLy8gXHBhcmFtIFtpbl0gU291cmNlIFRoZSBzdHJpbmcgdG8gYmUgc3BsaXQgb24gd2hpdGVzcGFjZSB3aXRoIHF1b3Rlcy4KKy8vLyBccGFyYW0gW2luXSBTYXZlciBEZWxlZ2F0ZXMgYmFjayB0byB0aGUgY2FsbGVyIGZvciBzYXZpbmcgcGFyc2VkIHN0cmluZ3MuCisvLy8gXHBhcmFtIFtpbl0gTWFya0VPTHMgdHJ1ZSBpZiB0b2tlbml6aW5nIGEgcmVzcG9uc2UgZmlsZSBhbmQgeW91IHdhbnQgZW5kIG9mCisvLy8gbGluZXMgYW5kIGVuZCBvZiB0aGUgcmVzcG9uc2UgZmlsZSB0byBiZSBtYXJrZWQgd2l0aCBhIG51bGxwdHIgc3RyaW5nLgorLy8vIFxwYXJhbSBbb3V0XSBOZXdBcmd2IEFsbCBwYXJzZWQgc3RyaW5ncyBhcmUgYXBwZW5kZWQgdG8gTmV3QXJndi4KK3ZvaWQgVG9rZW5pemVHTlVDb21tYW5kTGluZShTdHJpbmdSZWYgU291cmNlLCBTdHJpbmdTYXZlciAmU2F2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IGNoYXIgKj4gJk5ld0FyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNYXJrRU9McyA9IGZhbHNlKTsKKworLy8vIFxicmllZiBUb2tlbml6ZXMgYSBXaW5kb3dzIGNvbW1hbmQgbGluZSB3aGljaCBtYXkgY29udGFpbiBxdW90ZXMgYW5kIGVzY2FwZWQKKy8vLyBxdW90ZXMuCisvLy8KKy8vLyBTZWUgTVNETiBkb2NzIGZvciBDb21tYW5kTGluZVRvQXJndlcgZm9yIGluZm9ybWF0aW9uIG9uIHRoZSBxdW90aW5nIHJ1bGVzLgorLy8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvMTd3NXlrZnQodj12cy44NSkuYXNweAorLy8vCisvLy8gXHBhcmFtIFtpbl0gU291cmNlIFRoZSBzdHJpbmcgdG8gYmUgc3BsaXQgb24gd2hpdGVzcGFjZSB3aXRoIHF1b3Rlcy4KKy8vLyBccGFyYW0gW2luXSBTYXZlciBEZWxlZ2F0ZXMgYmFjayB0byB0aGUgY2FsbGVyIGZvciBzYXZpbmcgcGFyc2VkIHN0cmluZ3MuCisvLy8gXHBhcmFtIFtpbl0gTWFya0VPTHMgdHJ1ZSBpZiB0b2tlbml6aW5nIGEgcmVzcG9uc2UgZmlsZSBhbmQgeW91IHdhbnQgZW5kIG9mCisvLy8gbGluZXMgYW5kIGVuZCBvZiB0aGUgcmVzcG9uc2UgZmlsZSB0byBiZSBtYXJrZWQgd2l0aCBhIG51bGxwdHIgc3RyaW5nLgorLy8vIFxwYXJhbSBbb3V0XSBOZXdBcmd2IEFsbCBwYXJzZWQgc3RyaW5ncyBhcmUgYXBwZW5kZWQgdG8gTmV3QXJndi4KK3ZvaWQgVG9rZW5pemVXaW5kb3dzQ29tbWFuZExpbmUoU3RyaW5nUmVmIFNvdXJjZSwgU3RyaW5nU2F2ZXIgJlNhdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgY2hhciAqPiAmTmV3QXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNYXJrRU9McyA9IGZhbHNlKTsKKworLy8vIFxicmllZiBTdHJpbmcgdG9rZW5pemF0aW9uIGZ1bmN0aW9uIHR5cGUuICBTaG91bGQgYmUgY29tcGF0aWJsZSB3aXRoIGVpdGhlcgorLy8vIFdpbmRvd3Mgb3IgVW5peCBjb21tYW5kIGxpbmUgdG9rZW5pemVycy4KK3VzaW5nIFRva2VuaXplckNhbGxiYWNrID0gdm9pZCAoKikoU3RyaW5nUmVmIFNvdXJjZSwgU3RyaW5nU2F2ZXIgJlNhdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgY2hhciAqPiAmTmV3QXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNYXJrRU9Mcyk7CisKKy8vLyBUb2tlbml6ZXMgY29udGVudCBvZiBjb25maWd1cmF0aW9uIGZpbGUuCisvLy8KKy8vLyBccGFyYW0gW2luXSBTb3VyY2UgVGhlIHN0cmluZyByZXByZXNlbnRpbmcgY29udGVudCBvZiBjb25maWcgZmlsZS4KKy8vLyBccGFyYW0gW2luXSBTYXZlciBEZWxlZ2F0ZXMgYmFjayB0byB0aGUgY2FsbGVyIGZvciBzYXZpbmcgcGFyc2VkIHN0cmluZ3MuCisvLy8gXHBhcmFtIFtvdXRdIE5ld0FyZ3YgQWxsIHBhcnNlZCBzdHJpbmdzIGFyZSBhcHBlbmRlZCB0byBOZXdBcmd2LgorLy8vIFxwYXJhbSBbaW5dIE1hcmtFT0xzIEFkZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggVG9rZW5pemVyQ2FsbGJhY2suCisvLy8KKy8vLyBJdCB3b3JrcyBsaWtlIFRva2VuaXplR05VQ29tbWFuZExpbmUgd2l0aCBhYmlsaXR5IHRvIHNraXAgY29tbWVudCBsaW5lcy4KKy8vLwordm9pZCB0b2tlbml6ZUNvbmZpZ0ZpbGUoU3RyaW5nUmVmIFNvdXJjZSwgU3RyaW5nU2F2ZXIgJlNhdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IGNoYXIgKj4gJk5ld0FyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIE1hcmtFT0xzID0gZmFsc2UpOworCisvLy8gUmVhZHMgY29tbWFuZCBsaW5lIG9wdGlvbnMgZnJvbSB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBmaWxlLgorLy8vCisvLy8gXHBhcmFtIFtpbl0gQ2ZnRmlsZU5hbWUgUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUuCisvLy8gXHBhcmFtIFtpbl0gU2F2ZXIgIE9iamVjdHMgdGhhdCBzYXZlcyBhbGxvY2F0ZWQgc3RyaW5ncy4KKy8vLyBccGFyYW0gW291dF0gQXJndiBBcnJheSB0byB3aGljaCB0aGUgcmVhZCBvcHRpb25zIGFyZSBhZGRlZC4KKy8vLyBccmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgd2FzIHN1Y2Nlc3NmdWxseSByZWFkLgorLy8vCisvLy8gSXQgcmVhZHMgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIGZpbGUsIHRva2VuaXplcyBpdCBhbmQgZXhwYW5kcyAiQGZpbGUiCisvLy8gY29tbWFuZHMgcmVzb2x2aW5nIGZpbGUgbmFtZXMgaW4gdGhlbSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHdoZXJlCisvLy8gQ2ZnRmlsZW5hbWUgcmVzaWRlcy4KKy8vLworYm9vbCByZWFkQ29uZmlnRmlsZShTdHJpbmdSZWYgQ2ZnRmlsZU5hbWUsIFN0cmluZ1NhdmVyICZTYXZlciwKKyAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IGNoYXIgKj4gJkFyZ3YpOworCisvLy8gXGJyaWVmIEV4cGFuZCByZXNwb25zZSBmaWxlcyBvbiBhIGNvbW1hbmQgbGluZSByZWN1cnNpdmVseSB1c2luZyB0aGUgZ2l2ZW4KKy8vLyBTdHJpbmdTYXZlciBhbmQgdG9rZW5pemF0aW9uIHN0cmF0ZWd5LiAgQXJndiBzaG91bGQgY29udGFpbiB0aGUgY29tbWFuZCBsaW5lCisvLy8gYmVmb3JlIGV4cGFuc2lvbiBhbmQgd2lsbCBiZSBtb2RpZmllZCBpbiBwbGFjZS4gSWYgcmVxdWVzdGVkLCBBcmd2IHdpbGwKKy8vLyBhbHNvIGJlIHBvcHVsYXRlZCB3aXRoIG51bGxwdHJzIGluZGljYXRpbmcgd2hlcmUgZWFjaCByZXNwb25zZSBmaWxlIGxpbmUKKy8vLyBlbmRzLCB3aGljaCBpcyB1c2VmdWwgZm9yIHRoZSAiL2xpbmsiIGFyZ3VtZW50IHRoYXQgbmVlZHMgdG8gY29uc3VtZSBhbGwKKy8vLyByZW1haW5pbmcgYXJndW1lbnRzIG9ubHkgdW50aWwgdGhlIG5leHQgZW5kIG9mIGxpbmUsIHdoZW4gaW4gYSByZXNwb25zZQorLy8vIGZpbGUuCisvLy8KKy8vLyBccGFyYW0gW2luXSBTYXZlciBEZWxlZ2F0ZXMgYmFjayB0byB0aGUgY2FsbGVyIGZvciBzYXZpbmcgcGFyc2VkIHN0cmluZ3MuCisvLy8gXHBhcmFtIFtpbl0gVG9rZW5pemVyIFRva2VuaXphdGlvbiBzdHJhdGVneS4gVHlwaWNhbGx5IFVuaXggb3IgV2luZG93cy4KKy8vLyBccGFyYW0gW2luLG91dF0gQXJndiBDb21tYW5kIGxpbmUgaW50byB3aGljaCB0byBleHBhbmQgcmVzcG9uc2UgZmlsZXMuCisvLy8gXHBhcmFtIFtpbl0gTWFya0VPTHMgTWFyayBlbmQgb2YgbGluZXMgYW5kIHRoZSBlbmQgb2YgdGhlIHJlc3BvbnNlIGZpbGUKKy8vLyB3aXRoIG51bGxwdHJzIGluIHRoZSBBcmd2IHZlY3Rvci4KKy8vLyBccGFyYW0gW2luXSBSZWxhdGl2ZU5hbWVzIHRydWUgaWYgbmFtZXMgb2YgbmVzdGVkIHJlc3BvbnNlIGZpbGVzIG11c3QgYmUKKy8vLyByZXNvbHZlZCByZWxhdGl2ZSB0byBpbmNsdWRpbmcgZmlsZS4KKy8vLyBccmV0dXJuIHRydWUgaWYgYWxsIEBmaWxlcyB3ZXJlIGV4cGFuZGVkIHN1Y2Nlc3NmdWxseSBvciB0aGVyZSB3ZXJlIG5vbmUuCitib29sIEV4cGFuZFJlc3BvbnNlRmlsZXMoU3RyaW5nU2F2ZXIgJlNhdmVyLCBUb2tlbml6ZXJDYWxsYmFjayBUb2tlbml6ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IGNoYXIgKj4gJkFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNYXJrRU9McyA9IGZhbHNlLCBib29sIFJlbGF0aXZlTmFtZXMgPSBmYWxzZSk7CisKKy8vLyBcYnJpZWYgTWFyayBhbGwgb3B0aW9ucyBub3QgcGFydCBvZiB0aGlzIGNhdGVnb3J5IGFzIGNsOjpSZWFsbHlIaWRkZW4uCisvLy8KKy8vLyBccGFyYW0gQ2F0ZWdvcnkgdGhlIGNhdGVnb3J5IG9mIG9wdGlvbnMgdG8ga2VlcCBkaXNwbGF5aW5nCisvLy8KKy8vLyBTb21lIHRvb2xzIChsaWtlIGNsYW5nLWZvcm1hdCkgbGlrZSB0byBiZSBhYmxlIHRvIGhpZGUgYWxsIG9wdGlvbnMgdGhhdCBhcmUKKy8vLyBub3Qgc3BlY2lmaWMgdG8gdGhlIHRvb2wuIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGEgdG9vbCB0byBzcGVjaWZ5IGEgc2luZ2xlCisvLy8gb3B0aW9uIGNhdGVnb3J5IHRvIGRpc3BsYXkgaW4gdGhlIC1oZWxwIG91dHB1dC4KK3ZvaWQgSGlkZVVucmVsYXRlZE9wdGlvbnMoY2w6Ok9wdGlvbkNhdGVnb3J5ICZDYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViQ29tbWFuZCAmU3ViID0gKlRvcExldmVsU3ViQ29tbWFuZCk7CisKKy8vLyBcYnJpZWYgTWFyayBhbGwgb3B0aW9ucyBub3QgcGFydCBvZiB0aGUgY2F0ZWdvcmllcyBhcyBjbDo6UmVhbGx5SGlkZGVuLgorLy8vCisvLy8gXHBhcmFtIENhdGVnb3JpZXMgdGhlIGNhdGVnb3JpZXMgb2Ygb3B0aW9ucyB0byBrZWVwIGRpc3BsYXlpbmcuCisvLy8KKy8vLyBTb21lIHRvb2xzIChsaWtlIGNsYW5nLWZvcm1hdCkgbGlrZSB0byBiZSBhYmxlIHRvIGhpZGUgYWxsIG9wdGlvbnMgdGhhdCBhcmUKKy8vLyBub3Qgc3BlY2lmaWMgdG8gdGhlIHRvb2wuIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGEgdG9vbCB0byBzcGVjaWZ5IGEgc2luZ2xlCisvLy8gb3B0aW9uIGNhdGVnb3J5IHRvIGRpc3BsYXkgaW4gdGhlIC1oZWxwIG91dHB1dC4KK3ZvaWQgSGlkZVVucmVsYXRlZE9wdGlvbnMoQXJyYXlSZWY8Y29uc3QgY2w6Ok9wdGlvbkNhdGVnb3J5ICo+IENhdGVnb3JpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YkNvbW1hbmQgJlN1YiA9ICpUb3BMZXZlbFN1YkNvbW1hbmQpOworCisvLy8gXGJyaWVmIFJlc2V0IGFsbCBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byBhIHN0YXRlIHRoYXQgbG9va3MgYXMgaWYgdGhleSBoYXZlCisvLy8gbmV2ZXIgYXBwZWFyZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIFRoaXMgaXMgdXNlZnVsIGZvciBiZWluZyBhYmxlIHRvIHBhcnNlCisvLy8gYSBjb21tYW5kIGxpbmUgbXVsdGlwbGUgdGltZXMgKGVzcGVjaWFsbHkgdXNlZnVsIGZvciB3cml0aW5nIHRlc3RzKS4KK3ZvaWQgUmVzZXRBbGxPcHRpb25PY2N1cnJlbmNlcygpOworCisvLy8gXGJyaWVmIFJlc2V0IHRoZSBjb21tYW5kIGxpbmUgcGFyc2VyIGJhY2sgdG8gaXRzIGluaXRpYWwgc3RhdGUuICBUaGlzCisvLy8gcmVtb3ZlcworLy8vIGFsbCBvcHRpb25zLCBjYXRlZ29yaWVzLCBhbmQgc3ViY29tbWFuZHMgYW5kIHJldHVybnMgdGhlIHBhcnNlciB0byBhIHN0YXRlCisvLy8gd2hlcmUgbm8gb3B0aW9ucyBhcmUgc3VwcG9ydGVkLgordm9pZCBSZXNldENvbW1hbmRMaW5lUGFyc2VyKCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0NPTU1BTkRMSU5FX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Db21waWxlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhOTZlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Db21waWxlci5oCkBAIC0wLDAgKzEsMTkgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L0NvbXBpbGVyLmggLSBDb21waWxlciBhYnN0cmFjdGlvbiBzdXBwb3J0IC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRHVlIHRvIGxheWVyaW5nIGNvbnN0cmFpbnRzIChTdXBwb3J0IGRlcGVuZHMgb24gRGVtYW5nbGVyKSB0aGlzIGlzIGEgdGhpbgorLy8gd3JhcHBlciBhcm91bmQgdGhlIGltcGxlbWVudGF0aW9uIHRoYXQgbGl2ZXMgaW4gbGx2bS1jLCB0aG91Z2ggbW9zdCBjbGllbnRzCisvLyBjYW4vc2hvdWxkIHRoaW5rIG9mIHRoaXMgYXMgYmVpbmcgcHJvdmlkZWQgYnkgU3VwcG9ydCBmb3Igc2ltcGxpY2l0eSAobm90CisvLyBtYW55IGNsaWVudHMgYXJlIGF3YXJlIG9mIHRoZWlyIGRlcGVuZGVuY3kgb24gRGVtYW5nbGVyL2l0J3MgYSB3ZWlyZCBwbGFjZSB0bworLy8gb3duIHRoaXMgLSBidXQgZGlkbid0IHNlZW0gdG8ganVzdGlmeSBzcGxpdHRpbmcgU3VwcG9ydCBpbnRvICJsb3dlciBzdXBwb3J0IgorLy8gYW5kICJ1cHBlciBzdXBwb3J0IikuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vRGVtYW5nbGUvQ29tcGlsZXIuaCIKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Db21wcmVzc2lvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvbXByZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxOTFhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Db21wcmVzc2lvbi5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L0NvbXByZXNzaW9uLmggLS0tQ29tcHJlc3Npb24tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGJhc2ljIGZ1bmN0aW9ucyBmb3IgY29tcHJlc3Npb24vdW5jb21wcmVzc2lvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9DT01QUkVTU0lPTl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9DT01QUkVTU0lPTl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBTbWFsbFZlY3RvckltcGw7CitjbGFzcyBFcnJvcjsKK2NsYXNzIFN0cmluZ1JlZjsKKworbmFtZXNwYWNlIHpsaWIgeworCitlbnVtIENvbXByZXNzaW9uTGV2ZWwgeworICBOb0NvbXByZXNzaW9uLAorICBEZWZhdWx0Q29tcHJlc3Npb24sCisgIEJlc3RTcGVlZENvbXByZXNzaW9uLAorICBCZXN0U2l6ZUNvbXByZXNzaW9uCit9OworCitib29sIGlzQXZhaWxhYmxlKCk7CisKK0Vycm9yIGNvbXByZXNzKFN0cmluZ1JlZiBJbnB1dEJ1ZmZlciwgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZDb21wcmVzc2VkQnVmZmVyLAorICAgICAgICAgICAgICAgQ29tcHJlc3Npb25MZXZlbCBMZXZlbCA9IERlZmF1bHRDb21wcmVzc2lvbik7CisKK0Vycm9yIHVuY29tcHJlc3MoU3RyaW5nUmVmIElucHV0QnVmZmVyLCBjaGFyICpVbmNvbXByZXNzZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgIHNpemVfdCAmVW5jb21wcmVzc2VkU2l6ZSk7CisKK0Vycm9yIHVuY29tcHJlc3MoU3RyaW5nUmVmIElucHV0QnVmZmVyLAorICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlVuY29tcHJlc3NlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgc2l6ZV90IFVuY29tcHJlc3NlZFNpemUpOworCit1aW50MzJfdCBjcmMzMihTdHJpbmdSZWYgQnVmZmVyKTsKKworfSAgLy8gRW5kIG9mIG5hbWVzcGFjZSB6bGliCisKK30gLy8gRW5kIG9mIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ29udmVydFVURi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvbnZlcnRVVEYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWFlMTcxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvbnZlcnRVVEYuaApAQCAtMCwwICsxLDI5MSBAQAorLyo9PT0tLS0gQ29udmVydFVURi5oIC0gVW5pdmVyc2FsIENoYXJhY3RlciBOYW1lcyBjb252ZXJzaW9ucyAtLS0tLS0tLS0tLS0tLS09PT0KKyAqCisgKiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisgKgorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisgKiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisgKgorICo9PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09Ki8KKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDA0IFVuaWNvZGUsIEluYy4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBwcm92aWRlZCBhcyBpcyBieSBVbmljb2RlLCBJbmMuIE5vIGNsYWltcyBhcmUKKyAqIG1hZGUgYXMgdG8gZml0bmVzcyBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gTm8gd2FycmFudGllcyBvZiBhbnkKKyAqIGtpbmQgYXJlIGV4cHJlc3NlZCBvciBpbXBsaWVkLiBUaGUgcmVjaXBpZW50IGFncmVlcyB0byBkZXRlcm1pbmUKKyAqIGFwcGxpY2FiaWxpdHkgb2YgaW5mb3JtYXRpb24gcHJvdmlkZWQuIElmIHRoaXMgZmlsZSBoYXMgYmVlbgorICogcHVyY2hhc2VkIG9uIG1hZ25ldGljIG9yIG9wdGljYWwgbWVkaWEgZnJvbSBVbmljb2RlLCBJbmMuLCB0aGUKKyAqIHNvbGUgcmVtZWR5IGZvciBhbnkgY2xhaW0gd2lsbCBiZSBleGNoYW5nZSBvZiBkZWZlY3RpdmUgbWVkaWEKKyAqIHdpdGhpbiA5MCBkYXlzIG9mIHJlY2VpcHQuCisgKgorICogTGltaXRhdGlvbnMgb24gUmlnaHRzIHRvIFJlZGlzdHJpYnV0ZSBUaGlzIENvZGUKKyAqCisgKiBVbmljb2RlLCBJbmMuIGhlcmVieSBncmFudHMgdGhlIHJpZ2h0IHRvIGZyZWVseSB1c2UgdGhlIGluZm9ybWF0aW9uCisgKiBzdXBwbGllZCBpbiB0aGlzIGZpbGUgaW4gdGhlIGNyZWF0aW9uIG9mIHByb2R1Y3RzIHN1cHBvcnRpbmcgdGhlCisgKiBVbmljb2RlIFN0YW5kYXJkLCBhbmQgdG8gbWFrZSBjb3BpZXMgb2YgdGhpcyBmaWxlIGluIGFueSBmb3JtCisgKiBmb3IgaW50ZXJuYWwgb3IgZXh0ZXJuYWwgZGlzdHJpYnV0aW9uIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UKKyAqIHJlbWFpbnMgYXR0YWNoZWQuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBDb252ZXJzaW9ucyBiZXR3ZWVuIFVURjMyLCBVVEYtMTYsIGFuZCBVVEYtOC4gIEhlYWRlciBmaWxlLgorCisgICAgU2V2ZXJhbCBmdW50aW9ucyBhcmUgaW5jbHVkZWQgaGVyZSwgZm9ybWluZyBhIGNvbXBsZXRlIHNldCBvZgorICAgIGNvbnZlcnNpb25zIGJldHdlZW4gdGhlIHRocmVlIGZvcm1hdHMuICBVVEYtNyBpcyBub3QgaW5jbHVkZWQKKyAgICBoZXJlLCBidXQgaXMgaGFuZGxlZCBpbiBhIHNlcGFyYXRlIHNvdXJjZSBmaWxlLgorCisgICAgRWFjaCBvZiB0aGVzZSByb3V0aW5lcyB0YWtlcyBwb2ludGVycyB0byBpbnB1dCBidWZmZXJzIGFuZCBvdXRwdXQKKyAgICBidWZmZXJzLiAgVGhlIGlucHV0IGJ1ZmZlcnMgYXJlIGNvbnN0LgorCisgICAgRWFjaCByb3V0aW5lIGNvbnZlcnRzIHRoZSB0ZXh0IGJldHdlZW4gKnNvdXJjZVN0YXJ0IGFuZCBzb3VyY2VFbmQsCisgICAgcHV0dGluZyB0aGUgcmVzdWx0IGludG8gdGhlIGJ1ZmZlciBiZXR3ZWVuICp0YXJnZXRTdGFydCBhbmQKKyAgICB0YXJnZXRFbmQuIE5vdGU6IHRoZSBlbmQgcG9pbnRlcnMgYXJlICphZnRlciogdGhlIGxhc3QgaXRlbTogZS5nLgorICAgICooc291cmNlRW5kIC0gMSkgaXMgdGhlIGxhc3QgaXRlbS4KKworICAgIFRoZSByZXR1cm4gcmVzdWx0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBjb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsLAorICAgIGFuZCBpZiBub3QsIHdoZXRoZXIgdGhlIHByb2JsZW0gd2FzIGluIHRoZSBzb3VyY2Ugb3IgdGFyZ2V0IGJ1ZmZlcnMuCisgICAgKE9ubHkgdGhlIGZpcnN0IGVuY291bnRlcmVkIHByb2JsZW0gaXMgaW5kaWNhdGVkLikKKworICAgIEFmdGVyIHRoZSBjb252ZXJzaW9uLCAqc291cmNlU3RhcnQgYW5kICp0YXJnZXRTdGFydCBhcmUgYm90aAorICAgIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIGVuZCBvZiBsYXN0IHRleHQgc3VjY2Vzc2Z1bGx5IGNvbnZlcnRlZCBpbgorICAgIHRoZSByZXNwZWN0aXZlIGJ1ZmZlcnMuCisKKyAgICBJbnB1dCBwYXJhbWV0ZXJzOgorICAgICAgICBzb3VyY2VTdGFydCAtIHBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgYnVmZmVyLgorICAgICAgICAgICAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGFyZSBtb2RpZmllZCBvbiByZXR1cm4gc28gdGhhdAorICAgICAgICAgICAgICAgIGl0IHBvaW50cyBhdCB0aGUgbmV4dCB0aGluZyB0byBiZSBjb252ZXJ0ZWQuCisgICAgICAgIHRhcmdldFN0YXJ0IC0gc2ltaWxhcmx5LCBwb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBidWZmZXIuCisgICAgICAgIHNvdXJjZUVuZCwgdGFyZ2V0RW5kIC0gcmVzcGVjdGl2ZWx5IHBvaW50ZXJzIHRvIHRoZSBlbmRzIG9mIHRoZQorICAgICAgICAgICAgICAgIHR3byBidWZmZXJzLCBmb3Igb3ZlcmZsb3cgY2hlY2tpbmcgb25seS4KKworICAgIFRoZXNlIGNvbnZlcnNpb24gZnVuY3Rpb25zIHRha2UgYSBDb252ZXJzaW9uRmxhZ3MgYXJndW1lbnQuIFdoZW4gdGhpcworICAgIGZsYWcgaXMgc2V0IHRvIHN0cmljdCwgYm90aCBpcnJlZ3VsYXIgc2VxdWVuY2VzIGFuZCBpc29sYXRlZCBzdXJyb2dhdGVzCisgICAgd2lsbCBjYXVzZSBhbiBlcnJvci4gIFdoZW4gdGhlIGZsYWcgaXMgc2V0IHRvIGxlbmllbnQsIGJvdGggaXJyZWd1bGFyCisgICAgc2VxdWVuY2VzIGFuZCBpc29sYXRlZCBzdXJyb2dhdGVzIGFyZSBjb252ZXJ0ZWQuCisKKyAgICBXaGV0aGVyIHRoZSBmbGFnIGlzIHN0cmljdCBvciBsZW5pZW50LCBhbGwgaWxsZWdhbCBzZXF1ZW5jZXMgd2lsbCBjYXVzZQorICAgIGFuIGVycm9yIHJldHVybi4gVGhpcyBpbmNsdWRlcyBzZXF1ZW5jZXMgc3VjaCBhczogPEY0IDkwIDgwIDgwPiwgPEMwIDgwPiwKKyAgICBvciA8QTA+IGluIFVURi04LCBhbmQgdmFsdWVzIGFib3ZlIDB4MTBGRkZGIGluIFVURi0zMi4gQ29uZm9ybWFudCBjb2RlCisgICAgbXVzdCBjaGVjayBmb3IgaWxsZWdhbCBzZXF1ZW5jZXMuCisKKyAgICBXaGVuIHRoZSBmbGFnIGlzIHNldCB0byBsZW5pZW50LCBjaGFyYWN0ZXJzIG92ZXIgMHgxMEZGRkYgYXJlIGNvbnZlcnRlZAorICAgIHRvIHRoZSByZXBsYWNlbWVudCBjaGFyYWN0ZXI7IG90aGVyd2lzZSAod2hlbiB0aGUgZmxhZyBpcyBzZXQgdG8gc3RyaWN0KQorICAgIHRoZXkgY29uc3RpdHV0ZSBhbiBlcnJvci4KKworICAgIE91dHB1dCBwYXJhbWV0ZXJzOgorICAgICAgICBUaGUgdmFsdWUgInNvdXJjZUlsbGVnYWwiIGlzIHJldHVybmVkIGZyb20gc29tZSByb3V0aW5lcyBpZiB0aGUgaW5wdXQKKyAgICAgICAgc2VxdWVuY2UgaXMgbWFsZm9ybWVkLiAgV2hlbiAic291cmNlSWxsZWdhbCIgaXMgcmV0dXJuZWQsIHRoZSBzb3VyY2UKKyAgICAgICAgdmFsdWUgd2lsbCBwb2ludCB0byB0aGUgaWxsZWdhbCB2YWx1ZSB0aGF0IGNhdXNlZCB0aGUgcHJvYmxlbS4gRS5nLiwKKyAgICAgICAgaW4gVVRGLTggd2hlbiBhIHNlcXVlbmNlIGlzIG1hbGZvcm1lZCwgaXQgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUKKyAgICAgICAgbWFsZm9ybWVkIHNlcXVlbmNlLgorCisgICAgQXV0aG9yOiBNYXJrIEUuIERhdmlzLCAxOTk0LgorICAgIFJldiBIaXN0b3J5OiBSaWNrIE1jR293YW4sIGZpeGVzICYgdXBkYXRlcyBNYXkgMjAwMS4KKyAgICAgICAgIEZpeGVzICYgdXBkYXRlcywgU2VwdCAyMDAxLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQ09OVkVSVFVURl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9DT05WRVJUVVRGX0gKKworI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8c3RyaW5nPgorCisvLyBXcmFwIGV2ZXJ5dGhpbmcgaW4gbmFtZXNwYWNlIGxsdm0gc28gdGhhdCBwcm9ncmFtcyBjYW4gbGluayB3aXRoIGxsdm0gYW5kCisvLyB0aGVpciBvd24gdmVyc2lvbiBvZiB0aGUgdW5pY29kZSBsaWJyYXJpZXMuCisKK25hbWVzcGFjZSBsbHZtIHsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgVGhlIGZvbGxvd2luZyA0IGRlZmluaXRpb25zIGFyZSBjb21waWxlci1zcGVjaWZpYy4KKyAgICBUaGUgQyBzdGFuZGFyZCBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB3Y2hhcl90IGhhcyBhdCBsZWFzdAorICAgIDE2IGJpdHMsIHNvIHdjaGFyX3QgaXMgbm8gbGVzcyBwb3J0YWJsZSB0aGFuIHVuc2lnbmVkIHNob3J0IQorICAgIEFsbCBzaG91bGQgYmUgdW5zaWduZWQgdmFsdWVzIHRvIGF2b2lkIHNpZ24gZXh0ZW5zaW9uIGR1cmluZworICAgIGJpdCBtYXNrICYgc2hpZnQgb3BlcmF0aW9ucy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0eXBlZGVmIHVuc2lnbmVkIGludCAgICBVVEYzMjsgIC8qIGF0IGxlYXN0IDMyIGJpdHMgKi8KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgIFVURjE2OyAgLyogYXQgbGVhc3QgMTYgYml0cyAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgVVRGODsgICAvKiB0eXBpY2FsbHkgOCBiaXRzICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBCb29sZWFuOyAvKiAwIG9yIDEgKi8KKworLyogU29tZSBmdW5kYW1lbnRhbCBjb25zdGFudHMgKi8KKyNkZWZpbmUgVU5JX1JFUExBQ0VNRU5UX0NIQVIgKFVURjMyKTB4MDAwMEZGRkQKKyNkZWZpbmUgVU5JX01BWF9CTVAgKFVURjMyKTB4MDAwMEZGRkYKKyNkZWZpbmUgVU5JX01BWF9VVEYxNiAoVVRGMzIpMHgwMDEwRkZGRgorI2RlZmluZSBVTklfTUFYX1VURjMyIChVVEYzMikweDdGRkZGRkZGCisjZGVmaW5lIFVOSV9NQVhfTEVHQUxfVVRGMzIgKFVURjMyKTB4MDAxMEZGRkYKKworI2RlZmluZSBVTklfTUFYX1VURjhfQllURVNfUEVSX0NPREVfUE9JTlQgNAorCisjZGVmaW5lIFVOSV9VVEYxNl9CWVRFX09SREVSX01BUktfTkFUSVZFICAweEZFRkYKKyNkZWZpbmUgVU5JX1VURjE2X0JZVEVfT1JERVJfTUFSS19TV0FQUEVEIDB4RkZGRQorCit0eXBlZGVmIGVudW0geworICBjb252ZXJzaW9uT0ssICAgICAgICAgICAvKiBjb252ZXJzaW9uIHN1Y2Nlc3NmdWwgKi8KKyAgc291cmNlRXhoYXVzdGVkLCAgICAgICAgLyogcGFydGlhbCBjaGFyYWN0ZXIgaW4gc291cmNlLCBidXQgaGl0IGVuZCAqLworICB0YXJnZXRFeGhhdXN0ZWQsICAgICAgICAvKiBpbnN1ZmYuIHJvb20gaW4gdGFyZ2V0IGZvciBjb252ZXJzaW9uICovCisgIHNvdXJjZUlsbGVnYWwgICAgICAgICAgIC8qIHNvdXJjZSBzZXF1ZW5jZSBpcyBpbGxlZ2FsL21hbGZvcm1lZCAqLworfSBDb252ZXJzaW9uUmVzdWx0OworCit0eXBlZGVmIGVudW0geworICBzdHJpY3RDb252ZXJzaW9uID0gMCwKKyAgbGVuaWVudENvbnZlcnNpb24KK30gQ29udmVyc2lvbkZsYWdzOworCitDb252ZXJzaW9uUmVzdWx0IENvbnZlcnRVVEY4dG9VVEYxNiAoCisgIGNvbnN0IFVURjgqKiBzb3VyY2VTdGFydCwgY29uc3QgVVRGOCogc291cmNlRW5kLAorICBVVEYxNioqIHRhcmdldFN0YXJ0LCBVVEYxNiogdGFyZ2V0RW5kLCBDb252ZXJzaW9uRmxhZ3MgZmxhZ3MpOworCisvKioKKyAqIENvbnZlcnQgYSBwYXJ0aWFsIFVURjggc2VxdWVuY2UgdG8gVVRGMzIuICBJZiB0aGUgc2VxdWVuY2UgZW5kcyBpbiBhbgorICogaW5jb21wbGV0ZSBjb2RlIHVuaXQgc2VxdWVuY2UsIHJldHVybnMgXGMgc291cmNlRXhoYXVzdGVkLgorICovCitDb252ZXJzaW9uUmVzdWx0IENvbnZlcnRVVEY4dG9VVEYzMlBhcnRpYWwoCisgIGNvbnN0IFVURjgqKiBzb3VyY2VTdGFydCwgY29uc3QgVVRGOCogc291cmNlRW5kLAorICBVVEYzMioqIHRhcmdldFN0YXJ0LCBVVEYzMiogdGFyZ2V0RW5kLCBDb252ZXJzaW9uRmxhZ3MgZmxhZ3MpOworCisvKioKKyAqIENvbnZlcnQgYSBwYXJ0aWFsIFVURjggc2VxdWVuY2UgdG8gVVRGMzIuICBJZiB0aGUgc2VxdWVuY2UgZW5kcyBpbiBhbgorICogaW5jb21wbGV0ZSBjb2RlIHVuaXQgc2VxdWVuY2UsIHJldHVybnMgXGMgc291cmNlSWxsZWdhbC4KKyAqLworQ29udmVyc2lvblJlc3VsdCBDb252ZXJ0VVRGOHRvVVRGMzIoCisgIGNvbnN0IFVURjgqKiBzb3VyY2VTdGFydCwgY29uc3QgVVRGOCogc291cmNlRW5kLAorICBVVEYzMioqIHRhcmdldFN0YXJ0LCBVVEYzMiogdGFyZ2V0RW5kLCBDb252ZXJzaW9uRmxhZ3MgZmxhZ3MpOworCitDb252ZXJzaW9uUmVzdWx0IENvbnZlcnRVVEYxNnRvVVRGOCAoCisgIGNvbnN0IFVURjE2Kiogc291cmNlU3RhcnQsIGNvbnN0IFVURjE2KiBzb3VyY2VFbmQsCisgIFVURjgqKiB0YXJnZXRTdGFydCwgVVRGOCogdGFyZ2V0RW5kLCBDb252ZXJzaW9uRmxhZ3MgZmxhZ3MpOworCitDb252ZXJzaW9uUmVzdWx0IENvbnZlcnRVVEYzMnRvVVRGOCAoCisgIGNvbnN0IFVURjMyKiogc291cmNlU3RhcnQsIGNvbnN0IFVURjMyKiBzb3VyY2VFbmQsCisgIFVURjgqKiB0YXJnZXRTdGFydCwgVVRGOCogdGFyZ2V0RW5kLCBDb252ZXJzaW9uRmxhZ3MgZmxhZ3MpOworCitDb252ZXJzaW9uUmVzdWx0IENvbnZlcnRVVEYxNnRvVVRGMzIgKAorICBjb25zdCBVVEYxNioqIHNvdXJjZVN0YXJ0LCBjb25zdCBVVEYxNiogc291cmNlRW5kLAorICBVVEYzMioqIHRhcmdldFN0YXJ0LCBVVEYzMiogdGFyZ2V0RW5kLCBDb252ZXJzaW9uRmxhZ3MgZmxhZ3MpOworCitDb252ZXJzaW9uUmVzdWx0IENvbnZlcnRVVEYzMnRvVVRGMTYgKAorICBjb25zdCBVVEYzMioqIHNvdXJjZVN0YXJ0LCBjb25zdCBVVEYzMiogc291cmNlRW5kLAorICBVVEYxNioqIHRhcmdldFN0YXJ0LCBVVEYxNiogdGFyZ2V0RW5kLCBDb252ZXJzaW9uRmxhZ3MgZmxhZ3MpOworCitCb29sZWFuIGlzTGVnYWxVVEY4U2VxdWVuY2UoY29uc3QgVVRGOCAqc291cmNlLCBjb25zdCBVVEY4ICpzb3VyY2VFbmQpOworCitCb29sZWFuIGlzTGVnYWxVVEY4U3RyaW5nKGNvbnN0IFVURjggKipzb3VyY2UsIGNvbnN0IFVURjggKnNvdXJjZUVuZCk7CisKK3Vuc2lnbmVkIGdldE51bUJ5dGVzRm9yVVRGOChVVEY4IGZpcnN0Qnl0ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQmVsb3cgYXJlIExMVk0tc3BlY2lmaWMgd3JhcHBlcnMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZS4gKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEFycmF5UmVmOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKK2NsYXNzIFN0cmluZ1JlZjsKKworLyoqCisgKiBDb252ZXJ0IGFuIFVURjggU3RyaW5nUmVmIHRvIFVURjgsIFVURjE2LCBvciBVVEYzMiBkZXBlbmRpbmcgb24KKyAqIFdpZGVDaGFyV2lkdGguIFRoZSBjb252ZXJ0ZWQgZGF0YSBpcyB3cml0dGVuIHRvIFJlc3VsdFB0ciwgd2hpY2ggbmVlZHMgdG8KKyAqIHBvaW50IHRvIGF0IGxlYXN0IFdpZGVDaGFyV2lkdGggKiAoU291cmNlLlNpemUoKSArIDEpIGJ5dGVzLiBPbiBzdWNjZXNzLAorICogUmVzdWx0UHRyIHdpbGwgcG9pbnQgb25lIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGNvcGllZCBzdHJpbmcuIE9uIGZhaWx1cmUsCisgKiBSZXN1bHRQdHIgd2lsbCBub3QgYmUgY2hhbmdlZCwgYW5kIEVycm9yUHRyIHdpbGwgYmUgc2V0IHRvIHRoZSBsb2NhdGlvbiBvZgorICogdGhlIGZpcnN0IGNoYXJhY3RlciB3aGljaCBjb3VsZCBub3QgYmUgY29udmVydGVkLgorICogXHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MuCisgKi8KK2Jvb2wgQ29udmVydFVURjh0b1dpZGUodW5zaWduZWQgV2lkZUNoYXJXaWR0aCwgbGx2bTo6U3RyaW5nUmVmIFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqJlJlc3VsdFB0ciwgY29uc3QgVVRGOCAqJkVycm9yUHRyKTsKKworLyoqCisqIENvbnZlcnRzIGEgVVRGLTggU3RyaW5nUmVmIHRvIGEgc3RkOjp3c3RyaW5nLgorKiBccmV0dXJuIHRydWUgb24gc3VjY2Vzcy4KKyovCitib29sIENvbnZlcnRVVEY4dG9XaWRlKGxsdm06OlN0cmluZ1JlZiBTb3VyY2UsIHN0ZDo6d3N0cmluZyAmUmVzdWx0KTsKKworLyoqCisqIENvbnZlcnRzIGEgVVRGLTggQy1zdHJpbmcgdG8gYSBzdGQ6OndzdHJpbmcuCisqIFxyZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLgorKi8KK2Jvb2wgQ29udmVydFVURjh0b1dpZGUoY29uc3QgY2hhciAqU291cmNlLCBzdGQ6OndzdHJpbmcgJlJlc3VsdCk7CisKKy8qKgorKiBDb252ZXJ0cyBhIHN0ZDo6d3N0cmluZyB0byBhIFVURi04IGVuY29kZWQgc3RkOjpzdHJpbmcuCisqIFxyZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLgorKi8KK2Jvb2wgY29udmVydFdpZGVUb1VURjgoY29uc3Qgc3RkOjp3c3RyaW5nICZTb3VyY2UsIHN0ZDo6c3RyaW5nICZSZXN1bHQpOworCisKKy8qKgorICogQ29udmVydCBhbiBVbmljb2RlIGNvZGUgcG9pbnQgdG8gVVRGOCBzZXF1ZW5jZS4KKyAqCisgKiBccGFyYW0gU291cmNlIGEgVW5pY29kZSBjb2RlIHBvaW50LgorICogXHBhcmFtIFtpbixvdXRdIFJlc3VsdFB0ciBwb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyLCBuZWVkcyB0byBiZSBhdCBsZWFzdAorICogXGMgVU5JX01BWF9VVEY4X0JZVEVTX1BFUl9DT0RFX1BPSU5UIGJ5dGVzLiAgT24gc3VjY2VzcyBcYyBSZXN1bHRQdHIgaXMKKyAqIHVwZGF0ZWQgb25lIHBhc3QgZW5kIG9mIHRoZSBjb252ZXJ0ZWQgc2VxdWVuY2UuCisgKgorICogXHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgorICovCitib29sIENvbnZlcnRDb2RlUG9pbnRUb1VURjgodW5zaWduZWQgU291cmNlLCBjaGFyIComUmVzdWx0UHRyKTsKKworLyoqCisgKiBDb252ZXJ0IHRoZSBmaXJzdCBVVEY4IHNlcXVlbmNlIGluIHRoZSBnaXZlbiBzb3VyY2UgYnVmZmVyIHRvIGEgVVRGMzIKKyAqIGNvZGUgcG9pbnQuCisgKgorICogXHBhcmFtIFtpbixvdXRdIHNvdXJjZSBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBidWZmZXIuIElmIHRoZSBjb252ZXJzaW9uCisgKiBzdWNjZWVkcywgdGhpcyBwb2ludGVyIHdpbGwgYmUgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgYnl0ZSBqdXN0IHBhc3QgdGhlCisgKiBlbmQgb2YgdGhlIGNvbnZlcnRlZCBzZXF1ZW5jZS4KKyAqIFxwYXJhbSBzb3VyY2VFbmQgQSBwb2ludGVyIGp1c3QgcGFzdCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogXHBhcmFtIFtvdXRdIHRhcmdldCBUaGUgY29udmVydGVkIGNvZGUKKyAqIFxwYXJhbSBmbGFncyBXaGV0aGVyIHRoZSBjb252ZXJzaW9uIGlzIHN0cmljdCBvciBsZW5pZW50LgorICoKKyAqIFxyZXR1cm5zIGNvbnZlcnNpb25PSyBvbiBzdWNjZXNzCisgKgorICogXHNhIENvbnZlcnRVVEY4dG9VVEYzMgorICovCitpbmxpbmUgQ29udmVyc2lvblJlc3VsdCBjb252ZXJ0VVRGOFNlcXVlbmNlKGNvbnN0IFVURjggKipzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVURjggKnNvdXJjZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGMzIgKnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbkZsYWdzIGZsYWdzKSB7CisgIGlmICgqc291cmNlID09IHNvdXJjZUVuZCkKKyAgICByZXR1cm4gc291cmNlRXhoYXVzdGVkOworICB1bnNpZ25lZCBzaXplID0gZ2V0TnVtQnl0ZXNGb3JVVEY4KCoqc291cmNlKTsKKyAgaWYgKChwdHJkaWZmX3Qpc2l6ZSA+IHNvdXJjZUVuZCAtICpzb3VyY2UpCisgICAgcmV0dXJuIHNvdXJjZUV4aGF1c3RlZDsKKyAgcmV0dXJuIENvbnZlcnRVVEY4dG9VVEYzMihzb3VyY2UsICpzb3VyY2UgKyBzaXplLCAmdGFyZ2V0LCB0YXJnZXQgKyAxLCBmbGFncyk7Cit9CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIGEgYmxvYiBvZiB0ZXh0IHN0YXJ0cyB3aXRoIGEgVVRGLTE2IGJpZyBvciBsaXR0bGUgZW5kaWFuIGJ5dGUKKyAqIG9yZGVyIG1hcmsuCisgKi8KK2Jvb2wgaGFzVVRGMTZCeXRlT3JkZXJNYXJrKEFycmF5UmVmPGNoYXI+IFNyY0J5dGVzKTsKKworLyoqCisgKiBDb252ZXJ0cyBhIHN0cmVhbSBvZiByYXcgYnl0ZXMgYXNzdW1lZCB0byBiZSBVVEYxNiBpbnRvIGEgVVRGOCBzdGQ6OnN0cmluZy4KKyAqCisgKiBccGFyYW0gW2luXSBTcmNCeXRlcyBBIGJ1ZmZlciBvZiB3aGF0IGlzIGFzc3VtZWQgdG8gYmUgVVRGLTE2IGVuY29kZWQgdGV4dC4KKyAqIFxwYXJhbSBbb3V0XSBPdXQgQ29udmVydGVkIFVURi04IGlzIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MuCisgKiBccmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MKKyAqLworYm9vbCBjb252ZXJ0VVRGMTZUb1VURjhTdHJpbmcoQXJyYXlSZWY8Y2hhcj4gU3JjQnl0ZXMsIHN0ZDo6c3RyaW5nICZPdXQpOworCisvKioKKyogQ29udmVydHMgYSBVVEYxNiBzdHJpbmcgaW50byBhIFVURjggc3RkOjpzdHJpbmcuCisqCisqIFxwYXJhbSBbaW5dIFNyYyBBIGJ1ZmZlciBvZiBVVEYtMTYgZW5jb2RlZCB0ZXh0LgorKiBccGFyYW0gW291dF0gT3V0IENvbnZlcnRlZCBVVEYtOCBpcyBzdG9yZWQgaGVyZSBvbiBzdWNjZXNzLgorKiBccmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MKKyovCitib29sIGNvbnZlcnRVVEYxNlRvVVRGOFN0cmluZyhBcnJheVJlZjxVVEYxNj4gU3JjLCBzdGQ6OnN0cmluZyAmT3V0KTsKKworLyoqCisgKiBDb252ZXJ0cyBhIFVURi04IHN0cmluZyBpbnRvIGEgVVRGLTE2IHN0cmluZyB3aXRoIG5hdGl2ZSBlbmRpYW5uZXNzLgorICoKKyAqIFxyZXR1cm5zIHRydWUgb24gc3VjY2VzcworICovCitib29sIGNvbnZlcnRVVEY4VG9VVEYxNlN0cmluZyhTdHJpbmdSZWYgU3JjVVRGOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxVVEYxNj4gJkRzdFVURjE2KTsKKworfSAvKiBlbmQgbmFtZXNwYWNlIGxsdm0gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ3Jhc2hSZWNvdmVyeUNvbnRleHQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DcmFzaFJlY292ZXJ5Q29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMjYyMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ3Jhc2hSZWNvdmVyeUNvbnRleHQuaApAQCAtMCwwICsxLDI1OCBAQAorLy89PT0tLS0gQ3Jhc2hSZWNvdmVyeUNvbnRleHQuaCAtIENyYXNoIFJlY292ZXJ5IC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQ1JBU0hSRUNPVkVSWUNPTlRFWFRfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQ1JBU0hSRUNPVkVSWUNPTlRFWFRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIENyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cDsKKworLy8vIENyYXNoIHJlY292ZXJ5IGhlbHBlciBvYmplY3QuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgcnVubmluZyBvcGVyYXRpb25zIGluIGEgc2FmZSBjb250ZXh0IHNvCisvLy8gdGhhdCBjcmFzaGVzIChtZW1vcnkgZXJyb3JzLCBzdGFjayBvdmVyZmxvdywgYXNzZXJ0aW9uIHZpb2xhdGlvbnMpIGNhbiBiZQorLy8vIGRldGVjdGVkIGFuZCBjb250cm9sIHJlc3RvcmVkIHRvIHRoZSBjcmFzaGluZyB0aHJlYWQuIENyYXNoIGRldGVjdGlvbiBpcworLy8vIHB1cmVseSAiYmVzdCBlZmZvcnQiLCB0aGUgZXhhY3Qgc2V0IG9mIGZhaWx1cmVzIHdoaWNoIGNhbiBiZSByZWNvdmVyZWQgZnJvbQorLy8vIGlzIHBsYXRmb3JtIGRlcGVuZGVudC4KKy8vLworLy8vIENsaWVudHMgbWFrZSB1c2Ugb2YgdGhpcyBjb2RlIGJ5IGZpcnN0IGNhbGxpbmcKKy8vLyBDcmFzaFJlY292ZXJ5Q29udGV4dDo6RW5hYmxlKCksIGFuZCB0aGVuIGV4ZWN1dGluZyB1bnNhZmUgb3BlcmF0aW9ucyB2aWEgYQorLy8vIENyYXNoUmVjb3ZlcnlDb250ZXh0IG9iamVjdC4gRm9yIGV4YW1wbGU6CisvLy8KKy8vLyBcY29kZQorLy8vICAgIHZvaWQgYWN0dWFsX3dvcmsodm9pZCAqKTsKKy8vLworLy8vICAgIHZvaWQgZm9vKCkgeworLy8vICAgICAgQ3Jhc2hSZWNvdmVyeUNvbnRleHQgQ1JDOworLy8vCisvLy8gICAgICBpZiAoIUNSQy5SdW5TYWZlbHkoYWN0dWFsX3dvcmssIDApKSB7CisvLy8gICAgICAgICAuLi4gYSBjcmFzaCB3YXMgZGV0ZWN0ZWQsIHJlcG9ydCBlcnJvciB0byB1c2VyIC4uLgorLy8vICAgICAgfQorLy8vCisvLy8gICAgICAuLi4gbm8gY3Jhc2ggd2FzIGRldGVjdGVkIC4uLgorLy8vICAgIH0KKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVG8gYXNzaXN0IHJlY292ZXJ5IHRoZSBjbGFzcyBhbGxvd3Mgc3BlY2lmeWluZyBzZXQgb2YgYWN0aW9ucyB0aGF0IHdpbGwgYmUKKy8vLyBleGVjdXRlZCBpbiBhbnkgY2FzZSwgd2hldGhlciBjcmFzaCBvY2N1cnMgb3Igbm90LiBUaGVzZSBhY3Rpb25zIG1heSBiZSB1c2VkCisvLy8gdG8gcmVjbGFpbSByZXNvdXJjZXMgaW4gdGhlIGNhc2Ugb2YgY3Jhc2guCitjbGFzcyBDcmFzaFJlY292ZXJ5Q29udGV4dCB7CisgIHZvaWQgKkltcGw7CisgIENyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cCAqaGVhZDsKKworcHVibGljOgorICBDcmFzaFJlY292ZXJ5Q29udGV4dCgpIDogSW1wbChudWxscHRyKSwgaGVhZChudWxscHRyKSB7fQorICB+Q3Jhc2hSZWNvdmVyeUNvbnRleHQoKTsKKworICAvLy8gUmVnaXN0ZXIgY2xlYW51cCBoYW5kbGVyLCB3aGljaCBpcyB1c2VkIHdoZW4gdGhlIHJlY292ZXJ5IGNvbnRleHQgaXMKKyAgLy8vIGZpbmlzaGVkLgorICAvLy8gVGhlIHJlY292ZXJ5IGNvbnRleHQgb3ducyB0aGUgdGhlIGhhbmRsZXIuCisgIHZvaWQgcmVnaXN0ZXJDbGVhbnVwKENyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cCAqY2xlYW51cCk7CisKKyAgdm9pZCB1bnJlZ2lzdGVyQ2xlYW51cChDcmFzaFJlY292ZXJ5Q29udGV4dENsZWFudXAgKmNsZWFudXApOworCisgIC8vLyBFbmFibGUgY3Jhc2ggcmVjb3ZlcnkuCisgIHN0YXRpYyB2b2lkIEVuYWJsZSgpOworCisgIC8vLyBEaXNhYmxlIGNyYXNoIHJlY292ZXJ5LgorICBzdGF0aWMgdm9pZCBEaXNhYmxlKCk7CisKKyAgLy8vIFJldHVybiB0aGUgYWN0aXZlIGNvbnRleHQsIGlmIHRoZSBjb2RlIGlzIGN1cnJlbnRseSBleGVjdXRpbmcgaW4gYQorICAvLy8gdGhyZWFkIHdoaWNoIGlzIGluIGEgcHJvdGVjdGVkIGNvbnRleHQuCisgIHN0YXRpYyBDcmFzaFJlY292ZXJ5Q29udGV4dCAqR2V0Q3VycmVudCgpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgcmVjb3ZlcmluZyBmcm9tIGEgY3Jhc2guCisgIHN0YXRpYyBib29sIGlzUmVjb3ZlcmluZ0Zyb21DcmFzaCgpOworCisgIC8vLyBFeGVjdXRlIHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiAod2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzKSBpbgorICAvLy8gYSBwcm90ZWN0ZWQgY29udGV4dC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRydWUgaWYgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIGFuZCBmYWxzZSBpZiB0aGUKKyAgLy8vIGZ1bmN0aW9uIGNyYXNoZWQgKG9yIEhhbmRsZUNyYXNoIHdhcyBjYWxsZWQgZXhwbGljaXRseSkuIENsaWVudHMgc2hvdWxkCisgIC8vLyBtYWtlIGFzIGxpdHRsZSBhc3N1bXB0aW9ucyBhcyBwb3NzaWJsZSBhYm91dCB0aGUgcHJvZ3JhbSBzdGF0ZSB3aGVuCisgIC8vLyBSdW5TYWZlbHkgaGFzIHJldHVybmVkIGZhbHNlLgorICBib29sIFJ1blNhZmVseShmdW5jdGlvbl9yZWY8dm9pZCgpPiBGbik7CisgIGJvb2wgUnVuU2FmZWx5KHZvaWQgKCpGbikodm9pZCopLCB2b2lkICpVc2VyRGF0YSkgeworICAgIHJldHVybiBSdW5TYWZlbHkoWyZdKCkgeyBGbihVc2VyRGF0YSk7IH0pOworICB9CisKKyAgLy8vIEV4ZWN1dGUgdGhlIHByb3ZpZGUgY2FsbGJhY2sgZnVuY3Rpb24gKHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cykgaW4KKyAgLy8vIGEgcHJvdGVjdGVkIGNvbnRleHQgd2hpY2ggaXMgcnVuIGluIGFub3RoZXIgdGhyZWFkIChvcHRpb25hbGx5IHdpdGggYQorICAvLy8gcmVxdWVzdGVkIHN0YWNrIHNpemUpLgorICAvLy8KKyAgLy8vIFNlZSBSdW5TYWZlbHkoKSBhbmQgbGx2bV9leGVjdXRlX29uX3RocmVhZCgpLgorICAvLy8KKyAgLy8vIE9uIERhcndpbiwgaWYgUFJJT19EQVJXSU5fQkcgaXMgc2V0IG9uIHRoZSBjYWxsaW5nIHRocmVhZCwgaXQgd2lsbCBiZQorICAvLy8gcHJvcGFnYXRlZCB0byB0aGUgbmV3IHRocmVhZCBhcyB3ZWxsLgorICBib29sIFJ1blNhZmVseU9uVGhyZWFkKGZ1bmN0aW9uX3JlZjx2b2lkKCk+LCB1bnNpZ25lZCBSZXF1ZXN0ZWRTdGFja1NpemUgPSAwKTsKKyAgYm9vbCBSdW5TYWZlbHlPblRocmVhZCh2b2lkICgqRm4pKHZvaWQqKSwgdm9pZCAqVXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVxdWVzdGVkU3RhY2tTaXplID0gMCkgeworICAgIHJldHVybiBSdW5TYWZlbHlPblRocmVhZChbJl0oKSB7IEZuKFVzZXJEYXRhKTsgfSwgUmVxdWVzdGVkU3RhY2tTaXplKTsKKyAgfQorCisgIC8vLyBFeHBsaWNpdGx5IHRyaWdnZXIgYSBjcmFzaCByZWNvdmVyeSBpbiB0aGUgY3VycmVudCBwcm9jZXNzLCBhbmQKKyAgLy8vIHJldHVybiBmYWlsdXJlIGZyb20gUnVuU2FmZWx5KCkuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuLgorICB2b2lkIEhhbmRsZUNyYXNoKCk7Cit9OworCisvLy8gQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBjbGVhbnVwIGhhbmRsZXJzLgorLy8vCisvLy8gRGVyaXZlZCBjbGFzc2VzIG92ZXJyaWRlIG1ldGhvZCByZWNvdmVyUmVzb3VyY2VzLCB3aGljaCBtYWtlcyBhY3R1YWwgd29yayBvbgorLy8vIHJlc291cmNlIHJlY292ZXJ5LgorLy8vCisvLy8gQ2xlYW51cCBoYW5kbGVycyBhcmUgc3RvcmVkIGluIGEgZG91YmxlIGxpc3QsIHdoaWNoIGlzIG93bmVkIGFuZCBtYW5hZ2VkIGJ5CisvLy8gYSBjcmFzaCByZWNvdmVyeSBjb250ZXh0LgorY2xhc3MgQ3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwIHsKK3Byb3RlY3RlZDoKKyAgQ3Jhc2hSZWNvdmVyeUNvbnRleHQgKmNvbnRleHQ7CisgIENyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cChDcmFzaFJlY292ZXJ5Q29udGV4dCAqY29udGV4dCkKKyAgICAgIDogY29udGV4dChjb250ZXh0KSwgY2xlYW51cEZpcmVkKGZhbHNlKSB7fQorCitwdWJsaWM6CisgIGJvb2wgY2xlYW51cEZpcmVkOworCisgIHZpcnR1YWwgfkNyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cCgpOworICB2aXJ0dWFsIHZvaWQgcmVjb3ZlclJlc291cmNlcygpID0gMDsKKworICBDcmFzaFJlY292ZXJ5Q29udGV4dCAqZ2V0Q29udGV4dCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29udGV4dDsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQ3Jhc2hSZWNvdmVyeUNvbnRleHQ7CisgIENyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cCAqcHJldiwgKm5leHQ7Cit9OworCisvLy8gQmFzZSBjbGFzcyBvZiBjbGVhbnVwIGhhbmRsZXIgdGhhdCBjb250cm9scyByZWNvdmVyeSBvZiByZXNvdXJjZXMgb2YgdGhlCisvLy8gZ2l2ZW4gdHlwZS4KKy8vLworLy8vIFx0cGFyYW0gRGVyaXZlZCBDbGFzcyB0aGF0IHVzZXMgdGhpcyBjbGFzcyBhcyBhIGJhc2UuCisvLy8gXHRwYXJhbSBUIFR5cGUgb2YgY29udHJvbGxlZCByZXNvdXJjZS4KKy8vLworLy8vIFRoaXMgY2xhc3Mgc2VydmVzIGFzIGEgYmFzZSBmb3IgaXRzIHRlbXBsYXRlIHBhcmFtZXRlciBhcyBpbXBsaWVkIGJ5CisvLy8gQ3VyaW91c2x5IFJlY3VycmluZyBUZW1wbGF0ZSBQYXR0ZXJuLgorLy8vCisvLy8gVGhpcyBjbGFzcyBmYWN0b3JzIG91dCBjcmVhdGlvbiBvZiBhIGNsZWFudXAgaGFuZGxlci4gVGhlIGxhdHRlciByZXF1aXJlcworLy8vIGtub3dsZWRnZSBvZiB0aGUgY3VycmVudCByZWNvdmVyeSBjb250ZXh0LCB3aGljaCBpcyBwcm92aWRlZCBieSB0aGlzIGNsYXNzLgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgVD4KK2NsYXNzIENyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cEJhc2UgOiBwdWJsaWMgQ3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwIHsKK3Byb3RlY3RlZDoKKyAgVCAqcmVzb3VyY2U7CisgIENyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cEJhc2UoQ3Jhc2hSZWNvdmVyeUNvbnRleHQgKmNvbnRleHQsIFQgKnJlc291cmNlKQorICAgICAgOiBDcmFzaFJlY292ZXJ5Q29udGV4dENsZWFudXAoY29udGV4dCksIHJlc291cmNlKHJlc291cmNlKSB7fQorCitwdWJsaWM6CisgIC8vLyBDcmVhdGVzIGNsZWFudXAgaGFuZGxlci4KKyAgLy8vIFxwYXJhbSB4IFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIHJlY292ZXJlZCBieSB0aGlzIGhhbmRsZXIuCisgIC8vLyBccmV0dXJuIE5ldyBoYW5kbGVyIG9yIG51bGwgaWYgdGhlIG1ldGhvZCB3YXMgY2FsbGVkIG91dHNpZGUgYSByZWNvdmVyeQorICAvLy8gICAgICAgICBjb250ZXh0LgorICBzdGF0aWMgRGVyaXZlZCAqY3JlYXRlKFQgKngpIHsKKyAgICBpZiAoeCkgeworICAgICAgaWYgKENyYXNoUmVjb3ZlcnlDb250ZXh0ICpjb250ZXh0ID0gQ3Jhc2hSZWNvdmVyeUNvbnRleHQ6OkdldEN1cnJlbnQoKSkKKyAgICAgICAgcmV0dXJuIG5ldyBEZXJpdmVkKGNvbnRleHQsIHgpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorfTsKKworLy8vIENsZWFudXAgaGFuZGxlciB0aGF0IHJlY2xhaW1zIHJlc291cmNlIGJ5IGNhbGxpbmcgZGVzdHJ1Y3RvciBvbiBpdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgQ3Jhc2hSZWNvdmVyeUNvbnRleHREZXN0cnVjdG9yQ2xlYW51cCA6IHB1YmxpYworICBDcmFzaFJlY292ZXJ5Q29udGV4dENsZWFudXBCYXNlPENyYXNoUmVjb3ZlcnlDb250ZXh0RGVzdHJ1Y3RvckNsZWFudXA8VD4sIFQ+IHsKK3B1YmxpYzoKKyAgQ3Jhc2hSZWNvdmVyeUNvbnRleHREZXN0cnVjdG9yQ2xlYW51cChDcmFzaFJlY292ZXJ5Q29udGV4dCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICpyZXNvdXJjZSkKKyAgICAgIDogQ3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwQmFzZTwKKyAgICAgICAgICAgIENyYXNoUmVjb3ZlcnlDb250ZXh0RGVzdHJ1Y3RvckNsZWFudXA8VD4sIFQ+KGNvbnRleHQsIHJlc291cmNlKSB7fQorCisgIHZpcnR1YWwgdm9pZCByZWNvdmVyUmVzb3VyY2VzKCkgeworICAgIHRoaXMtPnJlc291cmNlLT5+VCgpOworICB9Cit9OworCisvLy8gQ2xlYW51cCBoYW5kbGVyIHRoYXQgcmVjbGFpbXMgcmVzb3VyY2UgYnkgY2FsbGluZyAnZGVsZXRlJyBvbiBpdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgQ3Jhc2hSZWNvdmVyeUNvbnRleHREZWxldGVDbGVhbnVwIDogcHVibGljCisgIENyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cEJhc2U8Q3Jhc2hSZWNvdmVyeUNvbnRleHREZWxldGVDbGVhbnVwPFQ+LCBUPiB7CitwdWJsaWM6CisgIENyYXNoUmVjb3ZlcnlDb250ZXh0RGVsZXRlQ2xlYW51cChDcmFzaFJlY292ZXJ5Q29udGV4dCAqY29udGV4dCwgVCAqcmVzb3VyY2UpCisgICAgOiBDcmFzaFJlY292ZXJ5Q29udGV4dENsZWFudXBCYXNlPAorICAgICAgICBDcmFzaFJlY292ZXJ5Q29udGV4dERlbGV0ZUNsZWFudXA8VD4sIFQ+KGNvbnRleHQsIHJlc291cmNlKSB7fQorCisgIHZvaWQgcmVjb3ZlclJlc291cmNlcygpIG92ZXJyaWRlIHsgZGVsZXRlIHRoaXMtPnJlc291cmNlOyB9Cit9OworCisvLy8gQ2xlYW51cCBoYW5kbGVyIHRoYXQgcmVjbGFpbXMgcmVzb3VyY2UgYnkgY2FsbGluZyBpdHMgbWV0aG9kICdSZWxlYXNlJy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgQ3Jhc2hSZWNvdmVyeUNvbnRleHRSZWxlYXNlUmVmQ2xlYW51cCA6IHB1YmxpYworICBDcmFzaFJlY292ZXJ5Q29udGV4dENsZWFudXBCYXNlPENyYXNoUmVjb3ZlcnlDb250ZXh0UmVsZWFzZVJlZkNsZWFudXA8VD4sIFQ+IHsKK3B1YmxpYzoKKyAgQ3Jhc2hSZWNvdmVyeUNvbnRleHRSZWxlYXNlUmVmQ2xlYW51cChDcmFzaFJlY292ZXJ5Q29udGV4dCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICpyZXNvdXJjZSkKKyAgICA6IENyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cEJhc2U8Q3Jhc2hSZWNvdmVyeUNvbnRleHRSZWxlYXNlUmVmQ2xlYW51cDxUPiwKKyAgICAgICAgICBUPihjb250ZXh0LCByZXNvdXJjZSkge30KKworICB2b2lkIHJlY292ZXJSZXNvdXJjZXMoKSBvdmVycmlkZSB7IHRoaXMtPnJlc291cmNlLT5SZWxlYXNlKCk7IH0KK307CisKKy8vLyBIZWxwZXIgY2xhc3MgZm9yIG1hbmFnaW5nIHJlc291cmNlIGNsZWFudXBzLgorLy8vCisvLy8gXHRwYXJhbSBUIFR5cGUgb2YgcmVzb3VyY2UgYmVlbiByZWNsYWltZWQuCisvLy8gXHRwYXJhbSBDbGVhbnVwIENsYXNzIHRoYXQgZGVmaW5lcyBob3cgdGhlIHJlc291cmNlIGlzIHJlY2xhaW1lZC4KKy8vLworLy8vIENsaWVudHMgY3JlYXRlIG9iamVjdHMgb2YgdGhpcyB0eXBlIGluIHRoZSBjb2RlIGV4ZWN1dGVkIGluIGEgY3Jhc2ggcmVjb3ZlcnkKKy8vLyBjb250ZXh0IHRvIGVuc3VyZSB0aGF0IHRoZSByZXNvdXJjZSB3aWxsIGJlIHJlY2xhaW1lZCBldmVuIGluIHRoZSBjYXNlIG9mCisvLy8gY3Jhc2guIEZvciBleGFtcGxlOgorLy8vCisvLy8gXGNvZGUKKy8vLyAgICB2b2lkIGFjdHVhbF93b3JrKHZvaWQgKikgeworLy8vICAgICAgLi4uCisvLy8gICAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzb3VyY2U+IFIobmV3IFJlc291cmNlKCkpOworLy8vICAgICAgQ3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwUmVnaXN0cmFyIEQoUi5nZXQoKSk7CisvLy8gICAgICAuLi4KKy8vLyAgICB9CisvLy8KKy8vLyAgICB2b2lkIGZvbygpIHsKKy8vLyAgICAgIENyYXNoUmVjb3ZlcnlDb250ZXh0IENSQzsKKy8vLworLy8vICAgICAgaWYgKCFDUkMuUnVuU2FmZWx5KGFjdHVhbF93b3JrLCAwKSkgeworLy8vICAgICAgICAgLi4uIGEgY3Jhc2ggd2FzIGRldGVjdGVkLCByZXBvcnQgZXJyb3IgdG8gdXNlciAuLi4KKy8vLyAgICAgIH0KKy8vLyBcZW5kY29kZQorLy8vCisvLy8gSWYgdGhlIGNvZGUgb2YgYGFjdHVhbF93b3JrYCBpbiB0aGUgZXhhbXBsZSBhYm92ZSBkb2VzIG5vdCBjcmFzaCwgdGhlCisvLy8gZGVzdHJ1Y3RvciBvZiBDcmFzaFJlY292ZXJ5Q29udGV4dENsZWFudXBSZWdpc3RyYXIgcmVtb3ZlcyBjbGVhbnVwIGNvZGUgZnJvbQorLy8vIHRoZSBjdXJyZW50IENyYXNoUmVjb3ZlcnlDb250ZXh0IGFuZCB0aGUgcmVzb3VyY2UgaXMgcmVjbGFpbWVkIGJ5IHRoZQorLy8vIGRlc3RydWN0b3Igb2Ygc3RkOjp1bmlxdWVfcHRyLiBJZiBjcmFzaCBoYXBwZW5zLCBkZXN0cnVjdG9ycyBhcmUgbm90IGNhbGxlZAorLy8vIGFuZCB0aGUgcmVzb3VyY2UgaXMgcmVjbGFpbWVkIGJ5IGNsZWFudXAgb2JqZWN0IHJlZ2lzdGVyZWQgaW4gdGhlIHJlY292ZXJ5CisvLy8gY29udGV4dCBieSB0aGUgY29uc3RydWN0b3Igb2YgQ3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwUmVnaXN0cmFyLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENsZWFudXAgPSBDcmFzaFJlY292ZXJ5Q29udGV4dERlbGV0ZUNsZWFudXA8VD4gPgorY2xhc3MgQ3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwUmVnaXN0cmFyIHsKKyAgQ3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwICpjbGVhbnVwOworCitwdWJsaWM6CisgIENyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cFJlZ2lzdHJhcihUICp4KQorICAgIDogY2xlYW51cChDbGVhbnVwOjpjcmVhdGUoeCkpIHsKKyAgICBpZiAoY2xlYW51cCkKKyAgICAgIGNsZWFudXAtPmdldENvbnRleHQoKS0+cmVnaXN0ZXJDbGVhbnVwKGNsZWFudXApOworICB9CisKKyAgfkNyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cFJlZ2lzdHJhcigpIHsgdW5yZWdpc3RlcigpOyB9CisKKyAgdm9pZCB1bnJlZ2lzdGVyKCkgeworICAgIGlmIChjbGVhbnVwICYmICFjbGVhbnVwLT5jbGVhbnVwRmlyZWQpCisgICAgICBjbGVhbnVwLT5nZXRDb250ZXh0KCktPnVucmVnaXN0ZXJDbGVhbnVwKGNsZWFudXApOworICAgIGNsZWFudXAgPSBudWxscHRyOworICB9Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9DUkFTSFJFQ09WRVJZQ09OVEVYVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvREpCLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvREpCLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAzMTExNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9ESkIuaApAQCAtMCwwICsxLDMzIEBACisvLz09PS0tIGxsdm0vU3VwcG9ydC9ESkIuaCAtLS1ESkIgSGFzaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBzdXBwb3J0IGZvciB0aGUgREogQmVybnN0ZWluIGhhc2ggZnVuY3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfREpCX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0RKQl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVGhlIEJlcm5zdGVpbiBoYXNoIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIERXQVJGIGFjY2VsZXJhdG9yIHRhYmxlcy4KK2lubGluZSB1aW50MzJfdCBkamJIYXNoKFN0cmluZ1JlZiBCdWZmZXIsIHVpbnQzMl90IEggPSA1MzgxKSB7CisgIGZvciAodW5zaWduZWQgY2hhciBDIDogQnVmZmVyLmJ5dGVzKCkpCisgICAgSCA9IChIIDw8IDUpICsgSCArIEM7CisgIHJldHVybiBIOworfQorCisvLy8gQ29tcHV0ZXMgdGhlIEJlcm5zdGVpbiBoYXNoIGFmdGVyIGZvbGRpbmcgdGhlIGlucHV0IGFjY29yZGluZyB0byB0aGUgRHdhcmYgNQorLy8vIHN0YW5kYXJkIGNhc2UgZm9sZGluZyBydWxlcy4KK3VpbnQzMl90IGNhc2VGb2xkaW5nRGpiSGFzaChTdHJpbmdSZWYgQnVmZmVyLCB1aW50MzJfdCBIID0gNTM4MSk7Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfREpCX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9ET1RHcmFwaFRyYWl0cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RPVEdyYXBoVHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4MWI1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9ET1RHcmFwaFRyYWl0cy5oCkBAIC0wLDAgKzEsMTY3IEBACisvLz09PS0tIGxsdm0vU3VwcG9ydC9Eb3RHcmFwaFRyYWl0cy5oIC0gQ3VzdG9taXplIC5kb3Qgb3V0cHV0IC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgdGVtcGxhdGUgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB0byBjdXN0b21pemUgZG90IG91dHB1dAorLy8gZ3JhcGhzIGdlbmVyYXRlZCBieSB0aGUgR3JhcGhXcml0ZXIuaCBmaWxlLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YKKy8vIHRoaXMgZmlsZSB3aWxsIHByb2R1Y2UgYSBzaW1wbGUsIGJ1dCBub3QgdmVyeSBwb2xpc2hlZCBncmFwaC4gIEJ5CisvLyBzcGVjaWFsaXppbmcgdGhpcyB0ZW1wbGF0ZSwgbG90cyBvZiBjdXN0b21pemF0aW9uIG9wcG9ydHVuaXRpZXMgYXJlIHBvc3NpYmxlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0RPVEdSQVBIVFJBSVRTX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0RPVEdSQVBIVFJBSVRTX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gRGVmYXVsdERPVEdyYXBoVHJhaXRzIC0gVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2YKKy8vLyBhbGwgb2YgdGhlIERPVEdyYXBoVHJhaXRzIG1ldGhvZHMuICBJZiBhIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IG5lZWQgdG8KKy8vLyBvdmVycmlkZSBhbGwgbWV0aG9kcyBoZXJlIGl0IHNob3VsZCBpbmhlcml0IHNvIHRoYXQgaXQgY2FuIGdldCB0aGUgZGVmYXVsdAorLy8vIGltcGxlbWVudGF0aW9ucy4KKy8vLworc3RydWN0IERlZmF1bHRET1RHcmFwaFRyYWl0cyB7Citwcml2YXRlOgorICBib29sIElzU2ltcGxlOworCitwcm90ZWN0ZWQ6CisgIGJvb2wgaXNTaW1wbGUoKSB7CisgICAgcmV0dXJuIElzU2ltcGxlOworICB9CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgRGVmYXVsdERPVEdyYXBoVHJhaXRzKGJvb2wgc2ltcGxlPWZhbHNlKSA6IElzU2ltcGxlIChzaW1wbGUpIHt9CisKKyAgLy8vIGdldEdyYXBoTmFtZSAtIFJldHVybiB0aGUgbGFiZWwgZm9yIHRoZSBncmFwaCBhcyBhIHdob2xlLiAgUHJpbnRlZCBhdCB0aGUKKyAgLy8vIHRvcCBvZiB0aGUgZ3JhcGguCisgIC8vLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBHcmFwaFR5cGU+CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRHcmFwaE5hbWUoY29uc3QgR3JhcGhUeXBlICYpIHsgcmV0dXJuICIiOyB9CisKKyAgLy8vIGdldEdyYXBoUHJvcGVydGllcyAtIFJldHVybiBhbnkgY3VzdG9tIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQKKyAgLy8vIGluIHRoZSB0b3AgbGV2ZWwgZ3JhcGggc3RydWN0dXJlIGZvciBkb3QuCisgIC8vLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBHcmFwaFR5cGU+CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRHcmFwaFByb3BlcnRpZXMoY29uc3QgR3JhcGhUeXBlICYpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICAvLy8gcmVuZGVyR3JhcGhGcm9tQm90dG9tVXAgLSBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgdGhlIGdyYXBoIGlzCisgIC8vLyBlbWl0dGVkIGJvdHRvbS11cCBpbnN0ZWFkIG9mIHRvcC1kb3duLiAgVGhpcyByZXF1aXJlcyBncmFwaHZpeiAyLjAgdG8gd29yaworICAvLy8gdGhvdWdoLgorICBzdGF0aWMgYm9vbCByZW5kZXJHcmFwaEZyb21Cb3R0b21VcCgpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gaXNOb2RlSGlkZGVuIC0gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgdGhlIGdpdmVuIG5vZGUgaXMgbm90CisgIC8vLyBkaXNwbGF5ZWQgaW4gdGhlIGdyYXBoLgorICBzdGF0aWMgYm9vbCBpc05vZGVIaWRkZW4oY29uc3Qgdm9pZCAqKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIGdldE5vZGVMYWJlbCAtIEdpdmVuIGEgbm9kZSBhbmQgYSBwb2ludGVyIHRvIHRoZSB0b3AgbGV2ZWwgZ3JhcGgsIHJldHVybgorICAvLy8gdGhlIGxhYmVsIHRvIHByaW50IGluIHRoZSBub2RlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBHcmFwaFR5cGU+CisgIHN0ZDo6c3RyaW5nIGdldE5vZGVMYWJlbChjb25zdCB2b2lkICosIGNvbnN0IEdyYXBoVHlwZSAmKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLy8gZ2V0Tm9kZUlkZW50aWZpZXJMYWJlbCAtIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZQorICAvLyBhZGRyZXNzIG9yIG90aGVyIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBub2RlLiAoT25seSB1c2VkIGlmCisgIC8vIG5vbi1lbXB0eS4pCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBHcmFwaFR5cGU+CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXROb2RlSWRlbnRpZmllckxhYmVsKGNvbnN0IHZvaWQgKiwgY29uc3QgR3JhcGhUeXBlICYpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBHcmFwaFR5cGU+CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXROb2RlRGVzY3JpcHRpb24oY29uc3Qgdm9pZCAqLCBjb25zdCBHcmFwaFR5cGUgJikgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIC8vLyBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGN1c3RvbSBub2RlIGF0dHJpYnV0ZXMsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIHNvCisgIC8vLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBHcmFwaFR5cGU+CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXROb2RlQXR0cmlidXRlcyhjb25zdCB2b2lkICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHcmFwaFR5cGUgJikgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIC8vLyBJZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgZG90IGF0dHJpYnV0ZXMgcHJpbnRlZCBmb3IgYSBwYXJ0aWN1bGFyIGVkZ2UsCisgIC8vLyBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRWRnZUl0ZXIsIHR5cGVuYW1lIEdyYXBoVHlwZT4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldEVkZ2VBdHRyaWJ1dGVzKGNvbnN0IHZvaWQgKiwgRWRnZUl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHcmFwaFR5cGUgJikgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIC8vLyBnZXRFZGdlU291cmNlTGFiZWwgLSBJZiB5b3Ugd2FudCB0byBsYWJlbCB0aGUgZWRnZSBzb3VyY2UgaXRzZWxmLAorICAvLy8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBFZGdlSXRlcj4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldEVkZ2VTb3VyY2VMYWJlbChjb25zdCB2b2lkICosIEVkZ2VJdGVyKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLy8vIGVkZ2VUYXJnZXRzRWRnZVNvdXJjZSAtIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGlzIG91dGdvaW5nIGVkZ2UKKyAgLy8vIHNob3VsZCBhY3R1YWxseSB0YXJnZXQgYW5vdGhlciBlZGdlIHNvdXJjZSwgbm90IGEgbm9kZS4gIElmIHRoaXMgbWV0aG9kIGlzCisgIC8vLyBpbXBsZW1lbnRlZCwgZ2V0RWRnZVRhcmdldCBzaG91bGQgYmUgaW1wbGVtZW50ZWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEVkZ2VJdGVyPgorICBzdGF0aWMgYm9vbCBlZGdlVGFyZ2V0c0VkZ2VTb3VyY2UoY29uc3Qgdm9pZCAqLCBFZGdlSXRlcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBnZXRFZGdlVGFyZ2V0IC0gSWYgZWRnZVRhcmdldHNFZGdlU291cmNlIHJldHVybnMgdHJ1ZSwgdGhpcyBtZXRob2QgaXMKKyAgLy8vIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hpY2ggb3V0Z29pbmcgZWRnZSBvZiBOb2RlIGlzIHRoZSB0YXJnZXQgb2YgdGhpcworICAvLy8gZWRnZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRWRnZUl0ZXI+CisgIHN0YXRpYyBFZGdlSXRlciBnZXRFZGdlVGFyZ2V0KGNvbnN0IHZvaWQgKiwgRWRnZUl0ZXIgSSkgeworICAgIHJldHVybiBJOworICB9CisKKyAgLy8vIGhhc0VkZ2VEZXN0TGFiZWxzIC0gSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUsIHRoZSBncmFwaCBpcyBhYmxlCisgIC8vLyB0byBwcm92aWRlIGxhYmVscyBmb3IgZWRnZSBkZXN0aW5hdGlvbnMuCisgIHN0YXRpYyBib29sIGhhc0VkZ2VEZXN0TGFiZWxzKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBudW1FZGdlRGVzdExhYmVscyAtIElmIGhhc0VkZ2VEZXN0TGFiZWxzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlCisgIC8vLyBudW1iZXIgb2YgaW5jb21pbmcgZWRnZSBsYWJlbHMgdGhlIGdpdmVuIG5vZGUgaGFzLgorICBzdGF0aWMgdW5zaWduZWQgbnVtRWRnZURlc3RMYWJlbHMoY29uc3Qgdm9pZCAqKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gZ2V0RWRnZURlc3RMYWJlbCAtIElmIGhhc0VkZ2VEZXN0TGFiZWxzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlCisgIC8vLyBpbmNvbWluZyBlZGdlIGxhYmVsIHdpdGggdGhlIGdpdmVuIGluZGV4IGluIHRoZSBnaXZlbiBub2RlLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RWRnZURlc3RMYWJlbChjb25zdCB2b2lkICosIHVuc2lnbmVkKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLy8vIGFkZEN1c3RvbUdyYXBoRmVhdHVyZXMgLSBJZiBhIGdyYXBoIGlzIG1hZGUgdXAgb2YgbW9yZSB0aGFuIGp1c3QKKyAgLy8vIHN0cmFpZ2h0LWZvcndhcmQgbm9kZXMgYW5kIGVkZ2VzLCB0aGlzIGlzIHRoZSBwbGFjZSB0byBwdXQgYWxsIG9mIHRoZQorICAvLy8gY3VzdG9tIHN0dWZmIG5lY2Vzc2FyeS4gIFRoZSBHcmFwaFdyaXRlciBvYmplY3QsIGluc3RhbnRpYXRlZCB3aXRoIHlvdXIKKyAgLy8vIEdyYXBoVHlwZSBpcyBwYXNzZWQgaW4gYXMgYW4gYXJndW1lbnQuICBZb3UgbWF5IGNhbGwgYXJiaXRyYXJ5IG1ldGhvZHMgb24KKyAgLy8vIGl0IHRvIGFkZCB0aGluZ3MgdG8gdGhlIG91dHB1dCBncmFwaC4KKyAgLy8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIEdyYXBoVHlwZSwgdHlwZW5hbWUgR3JhcGhXcml0ZXI+CisgIHN0YXRpYyB2b2lkIGFkZEN1c3RvbUdyYXBoRmVhdHVyZXMoY29uc3QgR3JhcGhUeXBlICYsIEdyYXBoV3JpdGVyICYpIHt9Cit9OworCisKKy8vLyBET1RHcmFwaFRyYWl0cyAtIFRlbXBsYXRlIGNsYXNzIHRoYXQgY2FuIGJlIHNwZWNpYWxpemVkIHRvIGN1c3RvbWl6ZSBob3cKKy8vLyBncmFwaHMgYXJlIGNvbnZlcnRlZCB0byAnZG90JyBncmFwaHMuICBXaGVuIHNwZWNpYWxpemluZywgeW91IG1heSBpbmhlcml0CisvLy8gZnJvbSBEZWZhdWx0RE9UR3JhcGhUcmFpdHMgaWYgeW91IGRvbid0IG5lZWQgdG8gb3ZlcnJpZGUgZXZlcnl0aGluZy4KKy8vLwordGVtcGxhdGUgPHR5cGVuYW1lIFR5Pgorc3RydWN0IERPVEdyYXBoVHJhaXRzIDogcHVibGljIERlZmF1bHRET1RHcmFwaFRyYWl0cyB7CisgIERPVEdyYXBoVHJhaXRzIChib29sIHNpbXBsZT1mYWxzZSkgOiBEZWZhdWx0RE9UR3JhcGhUcmFpdHMgKHNpbXBsZSkge30KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RhdGFFeHRyYWN0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9EYXRhRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0NDc4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9EYXRhRXh0cmFjdG9yLmgKQEAgLTAsMCArMSw0MjggQEAKKy8vPT09LS0gRGF0YUV4dHJhY3Rvci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0RBVEFFWFRSQUNUT1JfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfREFUQUVYVFJBQ1RPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEFuIGF1eGlsaWFyeSB0eXBlIHRvIGZhY2lsaXRhdGUgZXh0cmFjdGlvbiBvZiAzLWJ5dGUgZW50aXRpZXMuIAorc3RydWN0IFVpbnQyNCB7CisgIHVpbnQ4X3QgQnl0ZXNbM107CisgIFVpbnQyNCh1aW50OF90IFUpIHsKKyAgICBCeXRlc1swXSA9IEJ5dGVzWzFdID0gQnl0ZXNbMl0gPSBVOworICB9CisgIFVpbnQyNCh1aW50OF90IFUwLCB1aW50OF90IFUxLCB1aW50OF90IFUyKSB7CisgICAgQnl0ZXNbMF0gPSBVMDsgQnl0ZXNbMV0gPSBVMTsgQnl0ZXNbMl0gPSBVMjsKKyAgfQorICB1aW50MzJfdCBnZXRBc1VpbnQzMihib29sIElzTGl0dGxlRW5kaWFuKSBjb25zdCB7CisgICAgaW50IExvSXggPSBJc0xpdHRsZUVuZGlhbiA/IDAgOiAyOworICAgIHJldHVybiBCeXRlc1tMb0l4XSArIChCeXRlc1sxXSA8PCA4KSArIChCeXRlc1syLUxvSXhdIDw8IDE2KTsKKyAgfQorfTsKKwordXNpbmcgdWludDI0X3QgPSBVaW50MjQ7CitzdGF0aWNfYXNzZXJ0KHNpemVvZih1aW50MjRfdCkgPT0gMywgInNpemVvZih1aW50MjRfdCkgIT0gMyIpOworCisvLy8gTmVlZGVkIGJ5IHN3YXBCeXRlT3JkZXIoKS4KK2lubGluZSB1aW50MjRfdCBnZXRTd2FwcGVkQnl0ZXModWludDI0X3QgQykgeworICByZXR1cm4gdWludDI0X3QoQy5CeXRlc1syXSwgQy5CeXRlc1sxXSwgQy5CeXRlc1swXSk7Cit9CisKK2NsYXNzIERhdGFFeHRyYWN0b3IgeworICBTdHJpbmdSZWYgRGF0YTsKKyAgdWludDhfdCBJc0xpdHRsZUVuZGlhbjsKKyAgdWludDhfdCBBZGRyZXNzU2l6ZTsKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdCB3aXRoIGEgYnVmZmVyIHRoYXQgaXMgb3duZWQgYnkgdGhlIGNhbGxlci4KKyAgLy8vCisgIC8vLyBUaGlzIGNvbnN0cnVjdG9yIGFsbG93cyB1cyB0byB1c2UgZGF0YSB0aGF0IGlzIG93bmVkIGJ5IHRoZQorICAvLy8gY2FsbGVyLiBUaGUgZGF0YSBtdXN0IHN0YXkgYXJvdW5kIGFzIGxvbmcgYXMgdGhpcyBvYmplY3QgaXMKKyAgLy8vIHZhbGlkLgorICBEYXRhRXh0cmFjdG9yKFN0cmluZ1JlZiBEYXRhLCBib29sIElzTGl0dGxlRW5kaWFuLCB1aW50OF90IEFkZHJlc3NTaXplKQorICAgIDogRGF0YShEYXRhKSwgSXNMaXR0bGVFbmRpYW4oSXNMaXR0bGVFbmRpYW4pLCBBZGRyZXNzU2l6ZShBZGRyZXNzU2l6ZSkge30KKworICAvLy8gXGJyaWVmIEdldCB0aGUgZGF0YSBwb2ludGVkIHRvIGJ5IHRoaXMgZXh0cmFjdG9yLgorICBTdHJpbmdSZWYgZ2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuIERhdGE7IH0KKyAgLy8vIFxicmllZiBHZXQgdGhlIGVuZGlhbm5lc3MgZm9yIHRoaXMgZXh0cmFjdG9yLgorICBib29sIGlzTGl0dGxlRW5kaWFuKCkgY29uc3QgeyByZXR1cm4gSXNMaXR0bGVFbmRpYW47IH0KKyAgLy8vIFxicmllZiBHZXQgdGhlIGFkZHJlc3Mgc2l6ZSBmb3IgdGhpcyBleHRyYWN0b3IuCisgIHVpbnQ4X3QgZ2V0QWRkcmVzc1NpemUoKSBjb25zdCB7IHJldHVybiBBZGRyZXNzU2l6ZTsgfQorICAvLy8gXGJyaWVmIFNldCB0aGUgYWRkcmVzcyBzaXplIGZvciB0aGlzIGV4dHJhY3Rvci4KKyAgdm9pZCBzZXRBZGRyZXNzU2l6ZSh1aW50OF90IFNpemUpIHsgQWRkcmVzc1NpemUgPSBTaXplOyB9CisKKyAgLy8vIEV4dHJhY3QgYSBDIHN0cmluZyBmcm9tIFxhICpvZmZzZXRfcHRyLgorICAvLy8KKyAgLy8vIFJldHVybnMgYSBwb2ludGVyIHRvIGEgQyBTdHJpbmcgZnJvbSB0aGUgZGF0YSBhdCB0aGUgb2Zmc2V0CisgIC8vLyBwb2ludGVkIHRvIGJ5IFxhIG9mZnNldF9wdHIuIEEgdmFyaWFibGUgbGVuZ3RoIE5VTEwgdGVybWluYXRlZCBDCisgIC8vLyBzdHJpbmcgd2lsbCBiZSBleHRyYWN0ZWQgYW5kIHRoZSBcYSBvZmZzZXRfcHRyIHdpbGwgYmUKKyAgLy8vIHVwZGF0ZWQgd2l0aCB0aGUgb2Zmc2V0IG9mIHRoZSBieXRlIHRoYXQgZm9sbG93cyB0aGUgTlVMTAorICAvLy8gdGVybWluYXRvciBieXRlLgorICAvLy8KKyAgLy8vIEBwYXJhbVtpbixvdXRdIG9mZnNldF9wdHIKKyAgLy8vICAgICBBIHBvaW50ZXIgdG8gYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgYWR2YW5jZWQKKyAgLy8vICAgICBieSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGJ5dGVzIGlmIHRoZSB2YWx1ZSBpcyBleHRyYWN0ZWQKKyAgLy8vICAgICBjb3JyZWN0bHkuIElmIHRoZSBvZmZzZXQgaXMgb3V0IG9mIGJvdW5kcyBvciB0aGVyZSBhcmUgbm90CisgIC8vLyAgICAgZW5vdWdoIGJ5dGVzIHRvIGV4dHJhY3QgdGhpcyB2YWx1ZSwgdGhlIG9mZnNldCB3aWxsIGJlIGxlZnQKKyAgLy8vICAgICB1bm1vZGlmaWVkLgorICAvLy8KKyAgLy8vIEByZXR1cm4KKyAgLy8vICAgICBBIHBvaW50ZXIgdG8gdGhlIEMgc3RyaW5nIHZhbHVlIGluIHRoZSBkYXRhLiBJZiB0aGUgb2Zmc2V0CisgIC8vLyAgICAgcG9pbnRlZCB0byBieSBcYSBvZmZzZXRfcHRyIGlzIG91dCBvZiBib3VuZHMsIG9yIGlmIHRoZQorICAvLy8gICAgIG9mZnNldCBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIEMgc3RyaW5nIGlzIG91dCBvZiBib3VuZHMsCisgIC8vLyAgICAgTlVMTCB3aWxsIGJlIHJldHVybmVkLgorICBjb25zdCBjaGFyICpnZXRDU3RyKHVpbnQzMl90ICpvZmZzZXRfcHRyKSBjb25zdDsKKworICAvLy8gRXh0cmFjdCBhIEMgc3RyaW5nIGZyb20gXGEgKk9mZnNldFB0ci4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIGEgU3RyaW5nUmVmIGZvciB0aGUgQyBTdHJpbmcgZnJvbSB0aGUgZGF0YSBhdCB0aGUgb2Zmc2V0CisgIC8vLyBwb2ludGVkIHRvIGJ5IFxhIE9mZnNldFB0ci4gQSB2YXJpYWJsZSBsZW5ndGggTlVMTCB0ZXJtaW5hdGVkIEMKKyAgLy8vIHN0cmluZyB3aWxsIGJlIGV4dHJhY3RlZCBhbmQgdGhlIFxhIE9mZnNldFB0ciB3aWxsIGJlCisgIC8vLyB1cGRhdGVkIHdpdGggdGhlIG9mZnNldCBvZiB0aGUgYnl0ZSB0aGF0IGZvbGxvd3MgdGhlIE5VTEwKKyAgLy8vIHRlcm1pbmF0b3IgYnl0ZS4KKyAgLy8vCisgIC8vLyBccGFyYW1baW4sb3V0XSBPZmZzZXRQdHIKKyAgLy8vICAgICBBIHBvaW50ZXIgdG8gYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgYWR2YW5jZWQKKyAgLy8vICAgICBieSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGJ5dGVzIGlmIHRoZSB2YWx1ZSBpcyBleHRyYWN0ZWQKKyAgLy8vICAgICBjb3JyZWN0bHkuIElmIHRoZSBvZmZzZXQgaXMgb3V0IG9mIGJvdW5kcyBvciB0aGVyZSBhcmUgbm90CisgIC8vLyAgICAgZW5vdWdoIGJ5dGVzIHRvIGV4dHJhY3QgdGhpcyB2YWx1ZSwgdGhlIG9mZnNldCB3aWxsIGJlIGxlZnQKKyAgLy8vICAgICB1bm1vZGlmaWVkLgorICAvLy8KKyAgLy8vIFxyZXR1cm4KKyAgLy8vICAgICBBIFN0cmluZ1JlZiBmb3IgdGhlIEMgc3RyaW5nIHZhbHVlIGluIHRoZSBkYXRhLiBJZiB0aGUgb2Zmc2V0CisgIC8vLyAgICAgcG9pbnRlZCB0byBieSBcYSBPZmZzZXRQdHIgaXMgb3V0IG9mIGJvdW5kcywgb3IgaWYgdGhlCisgIC8vLyAgICAgb2Zmc2V0IHBsdXMgdGhlIGxlbmd0aCBvZiB0aGUgQyBzdHJpbmcgaXMgb3V0IG9mIGJvdW5kcywKKyAgLy8vICAgICBhIGRlZmF1bHQtaW5pdGlhbGl6ZWQgU3RyaW5nUmVmIHdpbGwgYmUgcmV0dXJuZWQuCisgIFN0cmluZ1JlZiBnZXRDU3RyUmVmKHVpbnQzMl90ICpPZmZzZXRQdHIpIGNvbnN0OworCisgIC8vLyBFeHRyYWN0IGFuIHVuc2lnbmVkIGludGVnZXIgb2Ygc2l6ZSBcYSBieXRlX3NpemUgZnJvbSBcYQorICAvLy8gKm9mZnNldF9wdHIuCisgIC8vLworICAvLy8gRXh0cmFjdCBhIHNpbmdsZSB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlIGFuZCB1cGRhdGUgdGhlIG9mZnNldAorICAvLy8gcG9pbnRlZCB0byBieSBcYSBvZmZzZXRfcHRyLiBUaGUgc2l6ZSBvZiB0aGUgZXh0cmFjdGVkIGludGVnZXIKKyAgLy8vIGlzIHNwZWNpZmllZCBieSB0aGUgXGEgYnl0ZV9zaXplIGFyZ3VtZW50LiBcYSBieXRlX3NpemUgc2hvdWxkCisgIC8vLyBoYXZlIGEgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG9uZSBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsCisgIC8vLyB0byBlaWdodCBzaW5jZSB0aGUgcmV0dXJuIHZhbHVlIGlzIDY0IGJpdHMgd2lkZS4gQW55CisgIC8vLyBcYSBieXRlX3NpemUgdmFsdWVzIGxlc3MgdGhhbiAxIG9yIGdyZWF0ZXIgdGhhbiA4IHdpbGwgcmVzdWx0IGluCisgIC8vLyBub3RoaW5nIGJlaW5nIGV4dHJhY3RlZCwgYW5kIHplcm8gYmVpbmcgcmV0dXJuZWQuCisgIC8vLworICAvLy8gQHBhcmFtW2luLG91dF0gb2Zmc2V0X3B0cgorICAvLy8gICAgIEEgcG9pbnRlciB0byBhbiBvZmZzZXQgd2l0aGluIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSBhZHZhbmNlZAorICAvLy8gICAgIGJ5IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYnl0ZXMgaWYgdGhlIHZhbHVlIGlzIGV4dHJhY3RlZAorICAvLy8gICAgIGNvcnJlY3RseS4gSWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzIG9yIHRoZXJlIGFyZSBub3QKKyAgLy8vICAgICBlbm91Z2ggYnl0ZXMgdG8gZXh0cmFjdCB0aGlzIHZhbHVlLCB0aGUgb2Zmc2V0IHdpbGwgYmUgbGVmdAorICAvLy8gICAgIHVubW9kaWZpZWQuCisgIC8vLworICAvLy8gQHBhcmFtW2luXSBieXRlX3NpemUKKyAgLy8vICAgICBUaGUgc2l6ZSBpbiBieXRlIG9mIHRoZSBpbnRlZ2VyIHRvIGV4dHJhY3QuCisgIC8vLworICAvLy8gQHJldHVybgorICAvLy8gICAgIFRoZSB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlIHRoYXQgd2FzIGV4dHJhY3RlZCwgb3IgemVybyBvbgorICAvLy8gICAgIGZhaWx1cmUuCisgIHVpbnQ2NF90IGdldFVuc2lnbmVkKHVpbnQzMl90ICpvZmZzZXRfcHRyLCB1aW50MzJfdCBieXRlX3NpemUpIGNvbnN0OworCisgIC8vLyBFeHRyYWN0IGFuIHNpZ25lZCBpbnRlZ2VyIG9mIHNpemUgXGEgYnl0ZV9zaXplIGZyb20gXGEgKm9mZnNldF9wdHIuCisgIC8vLworICAvLy8gRXh0cmFjdCBhIHNpbmdsZSBzaWduZWQgaW50ZWdlciB2YWx1ZSAoc2lnbiBleHRlbmRpbmcgaWYgcmVxdWlyZWQpCisgIC8vLyBhbmQgdXBkYXRlIHRoZSBvZmZzZXQgcG9pbnRlZCB0byBieSBcYSBvZmZzZXRfcHRyLiBUaGUgc2l6ZSBvZgorICAvLy8gdGhlIGV4dHJhY3RlZCBpbnRlZ2VyIGlzIHNwZWNpZmllZCBieSB0aGUgXGEgYnl0ZV9zaXplIGFyZ3VtZW50LgorICAvLy8gXGEgYnl0ZV9zaXplIHNob3VsZCBoYXZlIGEgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG9uZQorICAvLy8gYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlaWdodCBzaW5jZSB0aGUgcmV0dXJuIHZhbHVlIGlzIDY0CisgIC8vLyBiaXRzIHdpZGUuIEFueSBcYSBieXRlX3NpemUgdmFsdWVzIGxlc3MgdGhhbiAxIG9yIGdyZWF0ZXIgdGhhbgorICAvLy8gOCB3aWxsIHJlc3VsdCBpbiBub3RoaW5nIGJlaW5nIGV4dHJhY3RlZCwgYW5kIHplcm8gYmVpbmcgcmV0dXJuZWQuCisgIC8vLworICAvLy8gQHBhcmFtW2luLG91dF0gb2Zmc2V0X3B0cgorICAvLy8gICAgIEEgcG9pbnRlciB0byBhbiBvZmZzZXQgd2l0aGluIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSBhZHZhbmNlZAorICAvLy8gICAgIGJ5IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYnl0ZXMgaWYgdGhlIHZhbHVlIGlzIGV4dHJhY3RlZAorICAvLy8gICAgIGNvcnJlY3RseS4gSWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzIG9yIHRoZXJlIGFyZSBub3QKKyAgLy8vICAgICBlbm91Z2ggYnl0ZXMgdG8gZXh0cmFjdCB0aGlzIHZhbHVlLCB0aGUgb2Zmc2V0IHdpbGwgYmUgbGVmdAorICAvLy8gICAgIHVubW9kaWZpZWQuCisgIC8vLworICAvLy8gQHBhcmFtW2luXSBzaXplCisgIC8vLyAgICAgVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGludGVnZXIgdG8gZXh0cmFjdC4KKyAgLy8vCisgIC8vLyBAcmV0dXJuCisgIC8vLyAgICAgVGhlIHNpZ24gZXh0ZW5kZWQgc2lnbmVkIGludGVnZXIgdmFsdWUgdGhhdCB3YXMgZXh0cmFjdGVkLAorICAvLy8gICAgIG9yIHplcm8gb24gZmFpbHVyZS4KKyAgaW50NjRfdCBnZXRTaWduZWQodWludDMyX3QgKm9mZnNldF9wdHIsIHVpbnQzMl90IHNpemUpIGNvbnN0OworCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vLyBFeHRyYWN0IGFuIHBvaW50ZXIgZnJvbSBcYSAqb2Zmc2V0X3B0ci4KKyAgLy8vCisgIC8vLyBFeHRyYWN0IGEgc2luZ2xlIHBvaW50ZXIgZnJvbSB0aGUgZGF0YSBhbmQgdXBkYXRlIHRoZSBvZmZzZXQKKyAgLy8vIHBvaW50ZWQgdG8gYnkgXGEgb2Zmc2V0X3B0ci4gVGhlIHNpemUgb2YgdGhlIGV4dHJhY3RlZCBwb2ludGVyCisgIC8vLyBpcyBcYSBnZXRBZGRyZXNzU2l6ZSgpLCBzbyB0aGUgYWRkcmVzcyBzaXplIGhhcyB0byBiZQorICAvLy8gc2V0IGNvcnJlY3RseSBwcmlvciB0byBleHRyYWN0aW5nIGFueSBwb2ludGVyIHZhbHVlcy4KKyAgLy8vCisgIC8vLyBAcGFyYW1baW4sb3V0XSBvZmZzZXRfcHRyCisgIC8vLyAgICAgQSBwb2ludGVyIHRvIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRhdGEgdGhhdCB3aWxsIGJlIGFkdmFuY2VkCisgIC8vLyAgICAgYnkgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBieXRlcyBpZiB0aGUgdmFsdWUgaXMgZXh0cmFjdGVkCisgIC8vLyAgICAgY29ycmVjdGx5LiBJZiB0aGUgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMgb3IgdGhlcmUgYXJlIG5vdAorICAvLy8gICAgIGVub3VnaCBieXRlcyB0byBleHRyYWN0IHRoaXMgdmFsdWUsIHRoZSBvZmZzZXQgd2lsbCBiZSBsZWZ0CisgIC8vLyAgICAgdW5tb2RpZmllZC4KKyAgLy8vCisgIC8vLyBAcmV0dXJuCisgIC8vLyAgICAgVGhlIGV4dHJhY3RlZCBwb2ludGVyIHZhbHVlIGFzIGEgNjQgaW50ZWdlci4KKyAgdWludDY0X3QgZ2V0QWRkcmVzcyh1aW50MzJfdCAqb2Zmc2V0X3B0cikgY29uc3QgeworICAgIHJldHVybiBnZXRVbnNpZ25lZChvZmZzZXRfcHRyLCBBZGRyZXNzU2l6ZSk7CisgIH0KKworICAvLy8gRXh0cmFjdCBhIHVpbnQ4X3QgdmFsdWUgZnJvbSBcYSAqb2Zmc2V0X3B0ci4KKyAgLy8vCisgIC8vLyBFeHRyYWN0IGEgc2luZ2xlIHVpbnQ4X3QgZnJvbSB0aGUgYmluYXJ5IGRhdGEgYXQgdGhlIG9mZnNldAorICAvLy8gcG9pbnRlZCB0byBieSBcYSBvZmZzZXRfcHRyLCBhbmQgYWR2YW5jZSB0aGUgb2Zmc2V0IG9uIHN1Y2Nlc3MuCisgIC8vLworICAvLy8gQHBhcmFtW2luLG91dF0gb2Zmc2V0X3B0cgorICAvLy8gICAgIEEgcG9pbnRlciB0byBhbiBvZmZzZXQgd2l0aGluIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSBhZHZhbmNlZAorICAvLy8gICAgIGJ5IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYnl0ZXMgaWYgdGhlIHZhbHVlIGlzIGV4dHJhY3RlZAorICAvLy8gICAgIGNvcnJlY3RseS4gSWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzIG9yIHRoZXJlIGFyZSBub3QKKyAgLy8vICAgICBlbm91Z2ggYnl0ZXMgdG8gZXh0cmFjdCB0aGlzIHZhbHVlLCB0aGUgb2Zmc2V0IHdpbGwgYmUgbGVmdAorICAvLy8gICAgIHVubW9kaWZpZWQuCisgIC8vLworICAvLy8gQHJldHVybgorICAvLy8gICAgIFRoZSBleHRyYWN0ZWQgdWludDhfdCB2YWx1ZS4KKyAgdWludDhfdCBnZXRVOCh1aW50MzJfdCAqb2Zmc2V0X3B0cikgY29uc3Q7CisKKyAgLy8vIEV4dHJhY3QgXGEgY291bnQgdWludDhfdCB2YWx1ZXMgZnJvbSBcYSAqb2Zmc2V0X3B0ci4KKyAgLy8vCisgIC8vLyBFeHRyYWN0IFxhIGNvdW50IHVpbnQ4X3QgdmFsdWVzIGZyb20gdGhlIGJpbmFyeSBkYXRhIGF0IHRoZQorICAvLy8gb2Zmc2V0IHBvaW50ZWQgdG8gYnkgXGEgb2Zmc2V0X3B0ciwgYW5kIGFkdmFuY2UgdGhlIG9mZnNldCBvbgorICAvLy8gc3VjY2Vzcy4gVGhlIGV4dHJhY3RlZCB2YWx1ZXMgYXJlIGNvcGllZCBpbnRvIFxhIGRzdC4KKyAgLy8vCisgIC8vLyBAcGFyYW1baW4sb3V0XSBvZmZzZXRfcHRyCisgIC8vLyAgICAgQSBwb2ludGVyIHRvIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRhdGEgdGhhdCB3aWxsIGJlIGFkdmFuY2VkCisgIC8vLyAgICAgYnkgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBieXRlcyBpZiB0aGUgdmFsdWUgaXMgZXh0cmFjdGVkCisgIC8vLyAgICAgY29ycmVjdGx5LiBJZiB0aGUgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMgb3IgdGhlcmUgYXJlIG5vdAorICAvLy8gICAgIGVub3VnaCBieXRlcyB0byBleHRyYWN0IHRoaXMgdmFsdWUsIHRoZSBvZmZzZXQgd2lsbCBiZSBsZWZ0CisgIC8vLyAgICAgdW5tb2RpZmllZC4KKyAgLy8vCisgIC8vLyBAcGFyYW1bb3V0XSBkc3QKKyAgLy8vICAgICBBIGJ1ZmZlciB0byBjb3B5IFxhIGNvdW50IHVpbnQ4X3QgdmFsdWVzIGludG8uIFxhIGRzdCBtdXN0CisgIC8vLyAgICAgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHJlcXVlc3RlZCBkYXRhLgorICAvLy8KKyAgLy8vIEBwYXJhbVtpbl0gY291bnQKKyAgLy8vICAgICBUaGUgbnVtYmVyIG9mIHVpbnQ4X3QgdmFsdWVzIHRvIGV4dHJhY3QuCisgIC8vLworICAvLy8gQHJldHVybgorICAvLy8gICAgIFxhIGRzdCBpZiBhbGwgdmFsdWVzIHdlcmUgcHJvcGVybHkgZXh0cmFjdGVkIGFuZCBjb3BpZWQsCisgIC8vLyAgICAgTlVMTCBvdGhlcmlzZS4KKyAgdWludDhfdCAqZ2V0VTgodWludDMyX3QgKm9mZnNldF9wdHIsIHVpbnQ4X3QgKmRzdCwgdWludDMyX3QgY291bnQpIGNvbnN0OworCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vLyBFeHRyYWN0IGEgdWludDE2X3QgdmFsdWUgZnJvbSBcYSAqb2Zmc2V0X3B0ci4KKyAgLy8vCisgIC8vLyBFeHRyYWN0IGEgc2luZ2xlIHVpbnQxNl90IGZyb20gdGhlIGJpbmFyeSBkYXRhIGF0IHRoZSBvZmZzZXQKKyAgLy8vIHBvaW50ZWQgdG8gYnkgXGEgb2Zmc2V0X3B0ciwgYW5kIHVwZGF0ZSB0aGUgb2Zmc2V0IG9uIHN1Y2Nlc3MuCisgIC8vLworICAvLy8gQHBhcmFtW2luLG91dF0gb2Zmc2V0X3B0cgorICAvLy8gICAgIEEgcG9pbnRlciB0byBhbiBvZmZzZXQgd2l0aGluIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSBhZHZhbmNlZAorICAvLy8gICAgIGJ5IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYnl0ZXMgaWYgdGhlIHZhbHVlIGlzIGV4dHJhY3RlZAorICAvLy8gICAgIGNvcnJlY3RseS4gSWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzIG9yIHRoZXJlIGFyZSBub3QKKyAgLy8vICAgICBlbm91Z2ggYnl0ZXMgdG8gZXh0cmFjdCB0aGlzIHZhbHVlLCB0aGUgb2Zmc2V0IHdpbGwgYmUgbGVmdAorICAvLy8gICAgIHVubW9kaWZpZWQuCisgIC8vLworICAvLy8gQHJldHVybgorICAvLy8gICAgIFRoZSBleHRyYWN0ZWQgdWludDE2X3QgdmFsdWUuCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHVpbnQxNl90IGdldFUxNih1aW50MzJfdCAqb2Zmc2V0X3B0cikgY29uc3Q7CisKKyAgLy8vIEV4dHJhY3QgXGEgY291bnQgdWludDE2X3QgdmFsdWVzIGZyb20gXGEgKm9mZnNldF9wdHIuCisgIC8vLworICAvLy8gRXh0cmFjdCBcYSBjb3VudCB1aW50MTZfdCB2YWx1ZXMgZnJvbSB0aGUgYmluYXJ5IGRhdGEgYXQgdGhlCisgIC8vLyBvZmZzZXQgcG9pbnRlZCB0byBieSBcYSBvZmZzZXRfcHRyLCBhbmQgYWR2YW5jZSB0aGUgb2Zmc2V0IG9uCisgIC8vLyBzdWNjZXNzLiBUaGUgZXh0cmFjdGVkIHZhbHVlcyBhcmUgY29waWVkIGludG8gXGEgZHN0LgorICAvLy8KKyAgLy8vIEBwYXJhbVtpbixvdXRdIG9mZnNldF9wdHIKKyAgLy8vICAgICBBIHBvaW50ZXIgdG8gYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgYWR2YW5jZWQKKyAgLy8vICAgICBieSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGJ5dGVzIGlmIHRoZSB2YWx1ZSBpcyBleHRyYWN0ZWQKKyAgLy8vICAgICBjb3JyZWN0bHkuIElmIHRoZSBvZmZzZXQgaXMgb3V0IG9mIGJvdW5kcyBvciB0aGVyZSBhcmUgbm90CisgIC8vLyAgICAgZW5vdWdoIGJ5dGVzIHRvIGV4dHJhY3QgdGhpcyB2YWx1ZSwgdGhlIG9mZnNldCB3aWxsIGJlIGxlZnQKKyAgLy8vICAgICB1bm1vZGlmaWVkLgorICAvLy8KKyAgLy8vIEBwYXJhbVtvdXRdIGRzdAorICAvLy8gICAgIEEgYnVmZmVyIHRvIGNvcHkgXGEgY291bnQgdWludDE2X3QgdmFsdWVzIGludG8uIFxhIGRzdCBtdXN0CisgIC8vLyAgICAgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHJlcXVlc3RlZCBkYXRhLgorICAvLy8KKyAgLy8vIEBwYXJhbVtpbl0gY291bnQKKyAgLy8vICAgICBUaGUgbnVtYmVyIG9mIHVpbnQxNl90IHZhbHVlcyB0byBleHRyYWN0LgorICAvLy8KKyAgLy8vIEByZXR1cm4KKyAgLy8vICAgICBcYSBkc3QgaWYgYWxsIHZhbHVlcyB3ZXJlIHByb3Blcmx5IGV4dHJhY3RlZCBhbmQgY29waWVkLAorICAvLy8gICAgIE5VTEwgb3RoZXJpc2UuCisgIHVpbnQxNl90ICpnZXRVMTYodWludDMyX3QgKm9mZnNldF9wdHIsIHVpbnQxNl90ICpkc3QsIHVpbnQzMl90IGNvdW50KSBjb25zdDsKKworICAvLy8gRXh0cmFjdCBhIDI0LWJpdCB1bnNpZ25lZCB2YWx1ZSBmcm9tIFxhICpvZmZzZXRfcHRyIGFuZCByZXR1cm4gaXQKKyAgLy8vIGluIGEgdWludDMyX3QuCisgIC8vLworICAvLy8gRXh0cmFjdCAzIGJ5dGVzIGZyb20gdGhlIGJpbmFyeSBkYXRhIGF0IHRoZSBvZmZzZXQgcG9pbnRlZCB0byBieQorICAvLy8gXGEgb2Zmc2V0X3B0ciwgY29uc3RydWN0IGEgdWludDMyX3QgZnJvbSB0aGVtIGFuZCB1cGRhdGUgdGhlIG9mZnNldAorICAvLy8gb24gc3VjY2Vzcy4KKyAgLy8vCisgIC8vLyBAcGFyYW1baW4sb3V0XSBvZmZzZXRfcHRyCisgIC8vLyAgICAgQSBwb2ludGVyIHRvIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRhdGEgdGhhdCB3aWxsIGJlIGFkdmFuY2VkCisgIC8vLyAgICAgYnkgdGhlIDMgYnl0ZXMgaWYgdGhlIHZhbHVlIGlzIGV4dHJhY3RlZCBjb3JyZWN0bHkuIElmIHRoZSBvZmZzZXQKKyAgLy8vICAgICBpcyBvdXQgb2YgYm91bmRzIG9yIHRoZXJlIGFyZSBub3QgZW5vdWdoIGJ5dGVzIHRvIGV4dHJhY3QgdGhpcyB2YWx1ZSwKKyAgLy8vICAgICB0aGUgb2Zmc2V0IHdpbGwgYmUgbGVmdCB1bm1vZGlmaWVkLgorICAvLy8KKyAgLy8vIEByZXR1cm4KKyAgLy8vICAgICBUaGUgZXh0cmFjdGVkIDI0LWJpdCB2YWx1ZSByZXByZXNlbnRlZCBpbiBhIHVpbnQzMl90LgorICB1aW50MzJfdCBnZXRVMjQodWludDMyX3QgKm9mZnNldF9wdHIpIGNvbnN0OworCisgIC8vLyBFeHRyYWN0IGEgdWludDMyX3QgdmFsdWUgZnJvbSBcYSAqb2Zmc2V0X3B0ci4KKyAgLy8vCisgIC8vLyBFeHRyYWN0IGEgc2luZ2xlIHVpbnQzMl90IGZyb20gdGhlIGJpbmFyeSBkYXRhIGF0IHRoZSBvZmZzZXQKKyAgLy8vIHBvaW50ZWQgdG8gYnkgXGEgb2Zmc2V0X3B0ciwgYW5kIHVwZGF0ZSB0aGUgb2Zmc2V0IG9uIHN1Y2Nlc3MuCisgIC8vLworICAvLy8gQHBhcmFtW2luLG91dF0gb2Zmc2V0X3B0cgorICAvLy8gICAgIEEgcG9pbnRlciB0byBhbiBvZmZzZXQgd2l0aGluIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSBhZHZhbmNlZAorICAvLy8gICAgIGJ5IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYnl0ZXMgaWYgdGhlIHZhbHVlIGlzIGV4dHJhY3RlZAorICAvLy8gICAgIGNvcnJlY3RseS4gSWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzIG9yIHRoZXJlIGFyZSBub3QKKyAgLy8vICAgICBlbm91Z2ggYnl0ZXMgdG8gZXh0cmFjdCB0aGlzIHZhbHVlLCB0aGUgb2Zmc2V0IHdpbGwgYmUgbGVmdAorICAvLy8gICAgIHVubW9kaWZpZWQuCisgIC8vLworICAvLy8gQHJldHVybgorICAvLy8gICAgIFRoZSBleHRyYWN0ZWQgdWludDMyX3QgdmFsdWUuCisgIHVpbnQzMl90IGdldFUzMih1aW50MzJfdCAqb2Zmc2V0X3B0cikgY29uc3Q7CisKKyAgLy8vIEV4dHJhY3QgXGEgY291bnQgdWludDMyX3QgdmFsdWVzIGZyb20gXGEgKm9mZnNldF9wdHIuCisgIC8vLworICAvLy8gRXh0cmFjdCBcYSBjb3VudCB1aW50MzJfdCB2YWx1ZXMgZnJvbSB0aGUgYmluYXJ5IGRhdGEgYXQgdGhlCisgIC8vLyBvZmZzZXQgcG9pbnRlZCB0byBieSBcYSBvZmZzZXRfcHRyLCBhbmQgYWR2YW5jZSB0aGUgb2Zmc2V0IG9uCisgIC8vLyBzdWNjZXNzLiBUaGUgZXh0cmFjdGVkIHZhbHVlcyBhcmUgY29waWVkIGludG8gXGEgZHN0LgorICAvLy8KKyAgLy8vIEBwYXJhbVtpbixvdXRdIG9mZnNldF9wdHIKKyAgLy8vICAgICBBIHBvaW50ZXIgdG8gYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgYWR2YW5jZWQKKyAgLy8vICAgICBieSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGJ5dGVzIGlmIHRoZSB2YWx1ZSBpcyBleHRyYWN0ZWQKKyAgLy8vICAgICBjb3JyZWN0bHkuIElmIHRoZSBvZmZzZXQgaXMgb3V0IG9mIGJvdW5kcyBvciB0aGVyZSBhcmUgbm90CisgIC8vLyAgICAgZW5vdWdoIGJ5dGVzIHRvIGV4dHJhY3QgdGhpcyB2YWx1ZSwgdGhlIG9mZnNldCB3aWxsIGJlIGxlZnQKKyAgLy8vICAgICB1bm1vZGlmaWVkLgorICAvLy8KKyAgLy8vIEBwYXJhbVtvdXRdIGRzdAorICAvLy8gICAgIEEgYnVmZmVyIHRvIGNvcHkgXGEgY291bnQgdWludDMyX3QgdmFsdWVzIGludG8uIFxhIGRzdCBtdXN0CisgIC8vLyAgICAgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHJlcXVlc3RlZCBkYXRhLgorICAvLy8KKyAgLy8vIEBwYXJhbVtpbl0gY291bnQKKyAgLy8vICAgICBUaGUgbnVtYmVyIG9mIHVpbnQzMl90IHZhbHVlcyB0byBleHRyYWN0LgorICAvLy8KKyAgLy8vIEByZXR1cm4KKyAgLy8vICAgICBcYSBkc3QgaWYgYWxsIHZhbHVlcyB3ZXJlIHByb3Blcmx5IGV4dHJhY3RlZCBhbmQgY29waWVkLAorICAvLy8gICAgIE5VTEwgb3RoZXJpc2UuCisgIHVpbnQzMl90ICpnZXRVMzIodWludDMyX3QgKm9mZnNldF9wdHIsIHVpbnQzMl90ICpkc3QsIHVpbnQzMl90IGNvdW50KSBjb25zdDsKKworICAvLy8gRXh0cmFjdCBhIHVpbnQ2NF90IHZhbHVlIGZyb20gXGEgKm9mZnNldF9wdHIuCisgIC8vLworICAvLy8gRXh0cmFjdCBhIHNpbmdsZSB1aW50NjRfdCBmcm9tIHRoZSBiaW5hcnkgZGF0YSBhdCB0aGUgb2Zmc2V0CisgIC8vLyBwb2ludGVkIHRvIGJ5IFxhIG9mZnNldF9wdHIsIGFuZCB1cGRhdGUgdGhlIG9mZnNldCBvbiBzdWNjZXNzLgorICAvLy8KKyAgLy8vIEBwYXJhbVtpbixvdXRdIG9mZnNldF9wdHIKKyAgLy8vICAgICBBIHBvaW50ZXIgdG8gYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgYWR2YW5jZWQKKyAgLy8vICAgICBieSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGJ5dGVzIGlmIHRoZSB2YWx1ZSBpcyBleHRyYWN0ZWQKKyAgLy8vICAgICBjb3JyZWN0bHkuIElmIHRoZSBvZmZzZXQgaXMgb3V0IG9mIGJvdW5kcyBvciB0aGVyZSBhcmUgbm90CisgIC8vLyAgICAgZW5vdWdoIGJ5dGVzIHRvIGV4dHJhY3QgdGhpcyB2YWx1ZSwgdGhlIG9mZnNldCB3aWxsIGJlIGxlZnQKKyAgLy8vICAgICB1bm1vZGlmaWVkLgorICAvLy8KKyAgLy8vIEByZXR1cm4KKyAgLy8vICAgICBUaGUgZXh0cmFjdGVkIHVpbnQ2NF90IHZhbHVlLgorICB1aW50NjRfdCBnZXRVNjQodWludDMyX3QgKm9mZnNldF9wdHIpIGNvbnN0OworCisgIC8vLyBFeHRyYWN0IFxhIGNvdW50IHVpbnQ2NF90IHZhbHVlcyBmcm9tIFxhICpvZmZzZXRfcHRyLgorICAvLy8KKyAgLy8vIEV4dHJhY3QgXGEgY291bnQgdWludDY0X3QgdmFsdWVzIGZyb20gdGhlIGJpbmFyeSBkYXRhIGF0IHRoZQorICAvLy8gb2Zmc2V0IHBvaW50ZWQgdG8gYnkgXGEgb2Zmc2V0X3B0ciwgYW5kIGFkdmFuY2UgdGhlIG9mZnNldCBvbgorICAvLy8gc3VjY2Vzcy4gVGhlIGV4dHJhY3RlZCB2YWx1ZXMgYXJlIGNvcGllZCBpbnRvIFxhIGRzdC4KKyAgLy8vCisgIC8vLyBAcGFyYW1baW4sb3V0XSBvZmZzZXRfcHRyCisgIC8vLyAgICAgQSBwb2ludGVyIHRvIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRhdGEgdGhhdCB3aWxsIGJlIGFkdmFuY2VkCisgIC8vLyAgICAgYnkgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBieXRlcyBpZiB0aGUgdmFsdWUgaXMgZXh0cmFjdGVkCisgIC8vLyAgICAgY29ycmVjdGx5LiBJZiB0aGUgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMgb3IgdGhlcmUgYXJlIG5vdAorICAvLy8gICAgIGVub3VnaCBieXRlcyB0byBleHRyYWN0IHRoaXMgdmFsdWUsIHRoZSBvZmZzZXQgd2lsbCBiZSBsZWZ0CisgIC8vLyAgICAgdW5tb2RpZmllZC4KKyAgLy8vCisgIC8vLyBAcGFyYW1bb3V0XSBkc3QKKyAgLy8vICAgICBBIGJ1ZmZlciB0byBjb3B5IFxhIGNvdW50IHVpbnQ2NF90IHZhbHVlcyBpbnRvLiBcYSBkc3QgbXVzdAorICAvLy8gICAgIGJlIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCByZXF1ZXN0ZWQgZGF0YS4KKyAgLy8vCisgIC8vLyBAcGFyYW1baW5dIGNvdW50CisgIC8vLyAgICAgVGhlIG51bWJlciBvZiB1aW50NjRfdCB2YWx1ZXMgdG8gZXh0cmFjdC4KKyAgLy8vCisgIC8vLyBAcmV0dXJuCisgIC8vLyAgICAgXGEgZHN0IGlmIGFsbCB2YWx1ZXMgd2VyZSBwcm9wZXJseSBleHRyYWN0ZWQgYW5kIGNvcGllZCwKKyAgLy8vICAgICBOVUxMIG90aGVyaXNlLgorICB1aW50NjRfdCAqZ2V0VTY0KHVpbnQzMl90ICpvZmZzZXRfcHRyLCB1aW50NjRfdCAqZHN0LCB1aW50MzJfdCBjb3VudCkgY29uc3Q7CisKKyAgLy8vIEV4dHJhY3QgYSBzaWduZWQgTEVCMTI4IHZhbHVlIGZyb20gXGEgKm9mZnNldF9wdHIuCisgIC8vLworICAvLy8gRXh0cmFjdHMgYW4gc2lnbmVkIExFQjEyOCBudW1iZXIgZnJvbSB0aGlzIG9iamVjdCdzIGRhdGEKKyAgLy8vIHN0YXJ0aW5nIGF0IHRoZSBvZmZzZXQgcG9pbnRlZCB0byBieSBcYSBvZmZzZXRfcHRyLiBUaGUgb2Zmc2V0CisgIC8vLyBwb2ludGVkIHRvIGJ5IFxhIG9mZnNldF9wdHIgd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlIG9mZnNldCBvZgorICAvLy8gdGhlIGJ5dGUgZm9sbG93aW5nIHRoZSBsYXN0IGV4dHJhY3RlZCBieXRlLgorICAvLy8KKyAgLy8vIEBwYXJhbVtpbixvdXRdIG9mZnNldF9wdHIKKyAgLy8vICAgICBBIHBvaW50ZXIgdG8gYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgYWR2YW5jZWQKKyAgLy8vICAgICBieSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGJ5dGVzIGlmIHRoZSB2YWx1ZSBpcyBleHRyYWN0ZWQKKyAgLy8vICAgICBjb3JyZWN0bHkuIElmIHRoZSBvZmZzZXQgaXMgb3V0IG9mIGJvdW5kcyBvciB0aGVyZSBhcmUgbm90CisgIC8vLyAgICAgZW5vdWdoIGJ5dGVzIHRvIGV4dHJhY3QgdGhpcyB2YWx1ZSwgdGhlIG9mZnNldCB3aWxsIGJlIGxlZnQKKyAgLy8vICAgICB1bm1vZGlmaWVkLgorICAvLy8KKyAgLy8vIEByZXR1cm4KKyAgLy8vICAgICBUaGUgZXh0cmFjdGVkIHNpZ25lZCBpbnRlZ2VyIHZhbHVlLgorICBpbnQ2NF90IGdldFNMRUIxMjgodWludDMyX3QgKm9mZnNldF9wdHIpIGNvbnN0OworCisgIC8vLyBFeHRyYWN0IGEgdW5zaWduZWQgTEVCMTI4IHZhbHVlIGZyb20gXGEgKm9mZnNldF9wdHIuCisgIC8vLworICAvLy8gRXh0cmFjdHMgYW4gdW5zaWduZWQgTEVCMTI4IG51bWJlciBmcm9tIHRoaXMgb2JqZWN0J3MgZGF0YQorICAvLy8gc3RhcnRpbmcgYXQgdGhlIG9mZnNldCBwb2ludGVkIHRvIGJ5IFxhIG9mZnNldF9wdHIuIFRoZSBvZmZzZXQKKyAgLy8vIHBvaW50ZWQgdG8gYnkgXGEgb2Zmc2V0X3B0ciB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgb2Zmc2V0IG9mCisgIC8vLyB0aGUgYnl0ZSBmb2xsb3dpbmcgdGhlIGxhc3QgZXh0cmFjdGVkIGJ5dGUuCisgIC8vLworICAvLy8gQHBhcmFtW2luLG91dF0gb2Zmc2V0X3B0cgorICAvLy8gICAgIEEgcG9pbnRlciB0byBhbiBvZmZzZXQgd2l0aGluIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSBhZHZhbmNlZAorICAvLy8gICAgIGJ5IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYnl0ZXMgaWYgdGhlIHZhbHVlIGlzIGV4dHJhY3RlZAorICAvLy8gICAgIGNvcnJlY3RseS4gSWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzIG9yIHRoZXJlIGFyZSBub3QKKyAgLy8vICAgICBlbm91Z2ggYnl0ZXMgdG8gZXh0cmFjdCB0aGlzIHZhbHVlLCB0aGUgb2Zmc2V0IHdpbGwgYmUgbGVmdAorICAvLy8gICAgIHVubW9kaWZpZWQuCisgIC8vLworICAvLy8gQHJldHVybgorICAvLy8gICAgIFRoZSBleHRyYWN0ZWQgdW5zaWduZWQgaW50ZWdlciB2YWx1ZS4KKyAgdWludDY0X3QgZ2V0VUxFQjEyOCh1aW50MzJfdCAqb2Zmc2V0X3B0cikgY29uc3Q7CisKKyAgLy8vIFRlc3QgdGhlIHZhbGlkaXR5IG9mIFxhIG9mZnNldC4KKyAgLy8vCisgIC8vLyBAcmV0dXJuCisgIC8vLyAgICAgXGIgdHJ1ZSBpZiBcYSBvZmZzZXQgaXMgYSB2YWxpZCBvZmZzZXQgaW50byB0aGUgZGF0YSBpbiB0aGlzCisgIC8vLyAgICAgb2JqZWN0LCBcYiBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgaXNWYWxpZE9mZnNldCh1aW50MzJfdCBvZmZzZXQpIGNvbnN0IHsgcmV0dXJuIERhdGEuc2l6ZSgpID4gb2Zmc2V0OyB9CisKKyAgLy8vIFRlc3QgdGhlIGF2YWlsYWJpbGl0eSBvZiBcYSBsZW5ndGggYnl0ZXMgb2YgZGF0YSBmcm9tIFxhIG9mZnNldC4KKyAgLy8vCisgIC8vLyBAcmV0dXJuCisgIC8vLyAgICAgXGIgdHJ1ZSBpZiBcYSBvZmZzZXQgaXMgYSB2YWxpZCBvZmZzZXQgYW5kIHRoZXJlIGFyZSBcYQorICAvLy8gICAgIGxlbmd0aCBieXRlcyBhdmFpbGFibGUgYXQgdGhhdCBvZmZzZXQsIFxiIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBpc1ZhbGlkT2Zmc2V0Rm9yRGF0YU9mU2l6ZSh1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGxlbmd0aCkgY29uc3QgeworICAgIHJldHVybiBvZmZzZXQgKyBsZW5ndGggPj0gb2Zmc2V0ICYmIGlzVmFsaWRPZmZzZXQob2Zmc2V0ICsgbGVuZ3RoIC0gMSk7CisgIH0KKworICAvLy8gVGVzdCB0aGUgYXZhaWxhYmlsaXR5IG9mIGVub3VnaCBieXRlcyBvZiBkYXRhIGZvciBhIHBvaW50ZXIgZnJvbQorICAvLy8gXGEgb2Zmc2V0LiBUaGUgc2l6ZSBvZiBhIHBvaW50ZXIgaXMgXGEgZ2V0QWRkcmVzc1NpemUoKS4KKyAgLy8vCisgIC8vLyBAcmV0dXJuCisgIC8vLyAgICAgXGIgdHJ1ZSBpZiBcYSBvZmZzZXQgaXMgYSB2YWxpZCBvZmZzZXQgYW5kIHRoZXJlIGFyZSBlbm91Z2gKKyAgLy8vICAgICBieXRlcyBmb3IgYSBwb2ludGVyIGF2YWlsYWJsZSBhdCB0aGF0IG9mZnNldCwgXGIgZmFsc2UKKyAgLy8vICAgICBvdGhlcndpc2UuCisgIGJvb2wgaXNWYWxpZE9mZnNldEZvckFkZHJlc3ModWludDMyX3Qgb2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuIGlzVmFsaWRPZmZzZXRGb3JEYXRhT2ZTaXplKG9mZnNldCwgQWRkcmVzc1NpemUpOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNjBhNWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgKQEAgLTAsMCArMSwxNyBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmggLSBEZWZpbmUgZml4ZWQgc2l6ZSB0eXBlcyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEdWUgdG8gbGF5ZXJpbmcgY29uc3RyYWludHMgKFN1cHBvcnQgZGVwZW5kcyBvbiBsbHZtLWMpIHRoaXMgaXMgYSB0aGluCisvLyB3cmFwcGVyIGFyb3VuZCB0aGUgaW1wbGVtZW50YXRpb24gdGhhdCBsaXZlcyBpbiBsbHZtLWMsIHRob3VnaCBtb3N0IGNsaWVudHMKKy8vIGNhbi9zaG91bGQgdGhpbmsgb2YgdGhpcyBhcyBiZWluZyBwcm92aWRlZCBieSBTdXBwb3J0IGZvciBzaW1wbGljaXR5IChub3QKKy8vIG1hbnkgY2xpZW50cyBhcmUgYXdhcmUgb2YgdGhlaXIgZGVwZW5kZW5jeSBvbiBsbHZtLWMpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtLWMvRGF0YVR5cGVzLmgiCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRGVidWcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9EZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZTllMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRGVidWcuaApAQCAtMCwwICsxLDEyMiBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9EZWJ1Zy5oIC0gRWFzeSB3YXkgdG8gYWRkIGRlYnVnIG91dHB1dCAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIGhhbmR5IHdheSBvZiBhZGRpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIHlvdXIKKy8vIGNvZGUsIHdpdGhvdXQgaXQgYmVpbmcgZW5hYmxlZCBhbGwgb2YgdGhlIHRpbWUsIGFuZCB3aXRob3V0IGhhdmluZyB0byBhZGQKKy8vIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIGVuYWJsZSBpdC4KKy8vCisvLyBJbiBwYXJ0aWN1bGFyLCBqdXN0IHdyYXAgeW91ciBjb2RlIHdpdGggdGhlIERFQlVHKCkgbWFjcm8sIGFuZCBpdCB3aWxsIGJlCisvLyBlbmFibGVkIGF1dG9tYXRpY2FsbHkgaWYgeW91IHNwZWNpZnkgJy1kZWJ1Zycgb24gdGhlIGNvbW1hbmQtbGluZS4KKy8vIERFQlVHKCkgcmVxdWlyZXMgdGhlIERFQlVHX1RZUEUgbWFjcm8gdG8gYmUgZGVmaW5lZC4gU2V0IGl0IHRvICJmb28iIHNwZWNpZnkKKy8vIHRoYXQgeW91ciBkZWJ1ZyBjb2RlIGJlbG9uZ3MgdG8gY2xhc3MgImZvbyIuIEJlIGNhcmVmdWwgdGhhdCB5b3Ugb25seSBkbworLy8gdGhpcyBhZnRlciBpbmNsdWRpbmcgRGVidWcuaCBhbmQgbm90IGFyb3VuZCBhbnkgI2luY2x1ZGUgb2YgaGVhZGVycy4gSGVhZGVycworLy8gc2hvdWxkIGRlZmluZSBhbmQgdW5kZWYgdGhlIG1hY3JvIGFjcm91bmQgdGhlIGNvZGUgdGhhdCBuZWVkcyB0byB1c2UgdGhlCisvLyBERUJVRygpIG1hY3JvLiBUaGVuLCBvbiB0aGUgY29tbWFuZCBsaW5lLCB5b3UgY2FuIHNwZWNpZnkgJy1kZWJ1Zy1vbmx5PWZvbycKKy8vIHRvIGVuYWJsZSBKVVNUIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGZvbyBjbGFzcy4KKy8vCisvLyBXaGVuIGNvbXBpbGluZyB3aXRob3V0IGFzc2VydGlvbnMsIHRoZSAtZGVidWctKiBvcHRpb25zIGFuZCBhbGwgY29kZSBpbgorLy8gREVCVUcoKSBzdGF0ZW1lbnRzIGRpc2FwcGVhcnMsIHNvIGl0IGRvZXMgbm90IGFmZmVjdCB0aGUgcnVudGltZSBvZiB0aGUgY29kZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9ERUJVR19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9ERUJVR19ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKKyNpZm5kZWYgTkRFQlVHCisKKy8vLyBpc0N1cnJlbnREZWJ1Z1R5cGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyB0aGUgZGVidWcgdHlwZQorLy8vIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBvciBpZiBub25lIHdhcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZQorLy8vIHdpdGggdGhlIC1kZWJ1Zy1vbmx5PVggb3B0aW9uLgorLy8vCitib29sIGlzQ3VycmVudERlYnVnVHlwZShjb25zdCBjaGFyICpUeXBlKTsKKworLy8vIHNldEN1cnJlbnREZWJ1Z1R5cGUgLSBTZXQgdGhlIGN1cnJlbnQgZGVidWcgdHlwZSwgYXMgaWYgdGhlIC1kZWJ1Zy1vbmx5PVgKKy8vLyBvcHRpb24gd2VyZSBzcGVjaWZpZWQuICBOb3RlIHRoYXQgRGVidWdGbGFnIGFsc28gbmVlZHMgdG8gYmUgc2V0IHRvIHRydWUgZm9yCisvLy8gZGVidWcgb3V0cHV0IHRvIGJlIHByb2R1Y2VkLgorLy8vCit2b2lkIHNldEN1cnJlbnREZWJ1Z1R5cGUoY29uc3QgY2hhciAqVHlwZSk7CisKKy8vLyBzZXRDdXJyZW50RGVidWdUeXBlcyAtIFNldCB0aGUgY3VycmVudCBkZWJ1ZyB0eXBlLCBhcyBpZiB0aGUKKy8vLyAtZGVidWctb25seT1YLFksWiBvcHRpb24gd2VyZSBzcGVjaWZpZWQuIE5vdGUgdGhhdCBEZWJ1Z0ZsYWcKKy8vLyBhbHNvIG5lZWRzIHRvIGJlIHNldCB0byB0cnVlIGZvciBkZWJ1ZyBvdXRwdXQgdG8gYmUgcHJvZHVjZWQuCisvLy8KK3ZvaWQgc2V0Q3VycmVudERlYnVnVHlwZXMoY29uc3QgY2hhciAqKlR5cGVzLCB1bnNpZ25lZCBDb3VudCk7CisKKy8vLyBERUJVR19XSVRIX1RZUEUgbWFjcm8gLSBUaGlzIG1hY3JvIHNob3VsZCBiZSB1c2VkIGJ5IHBhc3NlcyB0byBlbWl0IGRlYnVnCisvLy8gaW5mb3JtYXRpb24uICBJbiB0aGUgJy1kZWJ1Zycgb3B0aW9uIGlzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZGxpbmUsIGFuZCBpZgorLy8vIHRoaXMgaXMgYSBkZWJ1ZyBidWlsZCwgdGhlbiB0aGUgY29kZSBzcGVjaWZpZWQgYXMgdGhlIG9wdGlvbiB0byB0aGUgbWFjcm8KKy8vLyB3aWxsIGJlIGV4ZWN1dGVkLiAgT3RoZXJ3aXNlIGl0IHdpbGwgbm90IGJlLiAgRXhhbXBsZToKKy8vLworLy8vIERFQlVHX1dJVEhfVFlQRSgiYml0c2V0IiwgZGJncygpIDw8ICJCaXRzZXQgY29udGFpbnM6ICIgPDwgQml0c2V0IDw8ICJcbiIpOworLy8vCisvLy8gVGhpcyB3aWxsIGVtaXQgdGhlIGRlYnVnIGluZm9ybWF0aW9uIGlmIC1kZWJ1ZyBpcyBwcmVzZW50LCBhbmQgLWRlYnVnLW9ubHkKKy8vLyBpcyBub3Qgc3BlY2lmaWVkLCBvciBpcyBzcGVjaWZpZWQgYXMgImJpdHNldCIuCisjZGVmaW5lIERFQlVHX1dJVEhfVFlQRShUWVBFLCBYKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgaWYgKDo6bGx2bTo6RGVidWdGbGFnICYmIDo6bGx2bTo6aXNDdXJyZW50RGVidWdUeXBlKFRZUEUpKSB7IFg7IH0gXAorICB9IHdoaWxlIChmYWxzZSkKKworI2Vsc2UKKyNkZWZpbmUgaXNDdXJyZW50RGVidWdUeXBlKFgpIChmYWxzZSkKKyNkZWZpbmUgc2V0Q3VycmVudERlYnVnVHlwZShYKQorI2RlZmluZSBzZXRDdXJyZW50RGVidWdUeXBlcyhYLCBOKQorI2RlZmluZSBERUJVR19XSVRIX1RZUEUoVFlQRSwgWCkgZG8geyB9IHdoaWxlIChmYWxzZSkKKyNlbmRpZgorCisvLy8gVGhpcyBib29sZWFuIGlzIHNldCB0byB0cnVlIGlmIHRoZSAnLWRlYnVnJyBjb21tYW5kIGxpbmUgb3B0aW9uCisvLy8gaXMgc3BlY2lmaWVkLiAgVGhpcyBzaG91bGQgcHJvYmFibHkgbm90IGJlIHJlZmVyZW5jZWQgZGlyZWN0bHksIGluc3RlYWQsIHVzZQorLy8vIHRoZSBERUJVRyBtYWNybyBiZWxvdy4KKy8vLworZXh0ZXJuIGJvb2wgRGVidWdGbGFnOworCisvLy8gXG5hbWUgVmVyaWZpY2F0aW9uIGZsYWdzLgorLy8vCisvLy8gVGhlc2UgZmxhZ3MgdHVybnMgb24vb2ZmIHRoYXQgYXJlIGV4cGVuc2l2ZSBhbmQgYXJlIHR1cm5lZCBvZmYgYnkgZGVmYXVsdCwKKy8vLyB1bmxlc3MgbWFjcm8gRVhQRU5TSVZFX0NIRUNLUyBpcyBkZWZpbmVkLiBUaGUgZmxhZ3MgYWxsb3cgc2VsZWN0aXZlbHkKKy8vLyB0dXJuaW5nIHRoZSBjaGVja3Mgb24gd2l0aG91dCBuZWVkIHRvIHJlY29tcGlsZS4KKy8vLyBceworCisvLy8gRW5hYmxlcyB2ZXJpZmljYXRpb24gb2YgZG9taW5hdG9yIHRyZWVzLgorLy8vCitleHRlcm4gYm9vbCBWZXJpZnlEb21JbmZvOworCisvLy8gRW5hYmxlcyB2ZXJpZmljYXRpb24gb2YgbG9vcCBpbmZvLgorLy8vCitleHRlcm4gYm9vbCBWZXJpZnlMb29wSW5mbzsKKworLy8vXH0KKworLy8vIEVuYWJsZURlYnVnQnVmZmVyaW5nIC0gVGhpcyBkZWZhdWx0cyB0byBmYWxzZS4gIElmIHRydWUsIHRoZSBkZWJ1ZworLy8vIHN0cmVhbSB3aWxsIGluc3RhbGwgc2lnbmFsIGhhbmRsZXJzIHRvIGR1bXAgYW55IGJ1ZmZlcmVkIGRlYnVnCisvLy8gb3V0cHV0LiAgSXQgYWxsb3dzIGNsaWVudHMgdG8gc2VsZWN0aXZlbHkgYWxsb3cgdGhlIGRlYnVnIHN0cmVhbQorLy8vIHRvIGluc3RhbGwgc2lnbmFsIGhhbmRsZXJzIGlmIHRoZXkgYXJlIGNlcnRhaW4gdGhlcmUgd2lsbCBiZSBubworLy8vIGNvbmZsaWN0LgorLy8vCitleHRlcm4gYm9vbCBFbmFibGVEZWJ1Z0J1ZmZlcmluZzsKKworLy8vIGRiZ3MoKSAtIFRoaXMgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIHJhd19vc3RyZWFtIGZvciBkZWJ1Z2dpbmcKKy8vLyBtZXNzYWdlcy4gIElmIGRlYnVnZ2luZyBpcyBkaXNhYmxlZCBpdCByZXR1cm5zIGVycnMoKS4gIFVzZSBpdAorLy8vIGxpa2U6IGRiZ3MoKSA8PCAiZm9vIiA8PCAiYmFyIjsKK3Jhd19vc3RyZWFtICZkYmdzKCk7CisKKy8vIERFQlVHIG1hY3JvIC0gVGhpcyBtYWNybyBzaG91bGQgYmUgdXNlZCBieSBwYXNzZXMgdG8gZW1pdCBkZWJ1ZyBpbmZvcm1hdGlvbi4KKy8vIEluIHRoZSAnLWRlYnVnJyBvcHRpb24gaXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZSwgYW5kIGlmIHRoaXMgaXMgYQorLy8gZGVidWcgYnVpbGQsIHRoZW4gdGhlIGNvZGUgc3BlY2lmaWVkIGFzIHRoZSBvcHRpb24gdG8gdGhlIG1hY3JvIHdpbGwgYmUKKy8vIGV4ZWN1dGVkLiAgT3RoZXJ3aXNlIGl0IHdpbGwgbm90IGJlLiAgRXhhbXBsZToKKy8vCisvLyBERUJVRyhkYmdzKCkgPDwgIkJpdHNldCBjb250YWluczogIiA8PCBCaXRzZXQgPDwgIlxuIik7CisvLworI2RlZmluZSBERUJVRyhYKSBERUJVR19XSVRIX1RZUEUoREVCVUdfVFlQRSwgWCkKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9ERUJVR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRGVidWdDb3VudGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRGVidWdDb3VudGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJlMWJkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9EZWJ1Z0NvdW50ZXIuaApAQCAtMCwwICsxLDE2NSBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9EZWJ1Z0NvdW50ZXIuaCAtIERlYnVnIGNvdW50ZXIgc3VwcG9ydCAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBUaGlzIGZpbGUgcHJvdmlkZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgZGVidWcgY291bnRlcnMuICBEZWJ1ZworLy8vIGNvdW50ZXJzIGFyZSBhIHRvb2wgdGhhdCBsZXQgeW91IG5hcnJvdyBkb3duIGEgbWlzY29tcGlsYXRpb24gdG8gYSBzcGVjaWZpYworLy8vIHRoaW5nIGhhcHBlbmluZy4KKy8vLworLy8vIFRvIGdpdmUgYSB1c2UgY2FzZTogSW1hZ2luZSB5b3UgaGF2ZSBhIGZpbGUsIHZlcnkgbGFyZ2UsIGFuZCB5b3UKKy8vLyBhcmUgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgdGhlIG1pbmltYWwgdHJhbnNmb3JtYXRpb24gdGhhdCBicmVha3MgaXQuIEJ1Z3BvaW50CisvLy8gYW5kIGJpc2VjdGlvbiBpcyBvZnRlbiBoZWxwZnVsIGhlcmUgaW4gbmFycm93aW5nIGl0IGRvd24gdG8gYSBzcGVjaWZpYyBwYXNzLAorLy8vIGJ1dCBpdCdzIHN0aWxsIGEgdmVyeSBsYXJnZSBmaWxlLCBhbmQgYSB2ZXJ5IGNvbXBsaWNhdGVkIHBhc3MgdG8gdHJ5IHRvCisvLy8gZGVidWcuICBUaGF0IGlzIHdoZXJlIGRlYnVnIGNvdW50aW5nIHN0ZXBzIGluLiAgWW91IGNhbiBpbnN0cnVtZW50IHRoZSBwYXNzCisvLy8gd2l0aCBhIGRlYnVnIGNvdW50ZXIgYmVmb3JlIGl0IGRvZXMgYSBjZXJ0YWluIHRoaW5nLCBhbmQgZGVwZW5kaW5nIG9uIHRoZQorLy8vIGNvdW50cywgaXQgd2lsbCBlaXRoZXIgZXhlY3V0ZSB0aGF0IHRoaW5nIG9yIG5vdC4gIFRoZSBkZWJ1ZyBjb3VudGVyIGl0c2VsZgorLy8vIGNvbnNpc3RzIG9mIGEgc2tpcCBhbmQgYSBjb3VudC4gIFNraXAgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBzaG91bGRFeGVjdXRlCisvLy8gbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSBpdCByZXR1cm5zIHRydWUuICBDb3VudCBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRvCisvLy8gcmV0dXJuIHRydWUgb25jZSBTa2lwIGlzIDAuICBTbyBhIHNraXA9NDcsIGNvdW50PTIgLHdvdWxkIHNraXAgdGhlIGZpcnN0IDQ3CisvLy8gZXhlY3V0aW9ucyBieSByZXR1cm5pbmcgZmFsc2UgZnJvbSBzaG91bGRFeGVjdXRlLCB0aGVuIGV4ZWN1dGUgdHdpY2UsIGFuZAorLy8vIHRoZW4gcmV0dXJuIGZhbHNlIGFnYWluLgorLy8vIE5vdGUgdGhhdCBhIGNvdW50ZXIgc2V0IHRvIGEgbmVnYXRpdmUgbnVtYmVyIHdpbGwgYWx3YXlzIGV4ZWN1dGUuCisvLy8gRm9yIGEgY29uY3JldGUgZXhhbXBsZSwgZHVyaW5nIHByZWRpY2F0ZWluZm8gY3JlYXRpb24sIHRoZSByZW5hbWluZyBwYXNzCisvLy8gcmVwbGFjZXMgZWFjaCB1c2Ugd2l0aCBhIHJlbmFtZWQgdXNlLgorLy8vLworLy8vIElmIEkgdXNlIERFQlVHX0NPVU5URVIgdG8gY3JlYXRlIGEgY291bnRlciBjYWxsZWQgInByZWRpY2F0ZWluZm8iLCBhbmQKKy8vLyB2YXJpYWJsZSBuYW1lIFJlbmFtZUNvdW50ZXIsIGFuZCB0aGVuIGluc3RydW1lbnQgdGhpcyByZW5hbWluZyB3aXRoIGEgZGVidWcKKy8vLyBjb3VudGVyLCBsaWtlIHNvOgorLy8vCisvLy8gaWYgKCFEZWJ1Z0NvdW50ZXI6OnNob3VsZEV4ZWN1dGUoUmVuYW1lQ291bnRlcikKKy8vLyA8Y29udGludWUgb3IgcmV0dXJuIG9yIHdoYXRldmVyIG5vdCBleGVjdXRpbmcgbG9va3MgbGlrZT4KKy8vLworLy8vIE5vdyBJIGNhbiwgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBtYWtlIGl0IHJlbmFtZSBvciBub3QgcmVuYW1lIGNlcnRhaW4gdXNlcworLy8vIGJ5IHNldHRpbmcgdGhlIHNraXAgYW5kIGNvdW50LgorLy8vIFNvIGZvciBleGFtcGxlCisvLy8gYmluL29wdCAtZGVidWctY291bnRlcj1wcmVkaWNhdGVpbmZvLXNraXA9NDcscHJlZGljYXRlaW5mby1jb3VudD0xCisvLy8gd2lsbCBza2lwIHJlbmFtaW5nIHRoZSBmaXJzdCA0NyB1c2VzLCB0aGVuIHJlbmFtZSBvbmUsIHRoZW4gc2tpcCB0aGUgcmVzdC4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0RFQlVHQ09VTlRFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9ERUJVR0NPVU5URVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9VbmlxdWVWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRGVidWdDb3VudGVyIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisgIHN0YXRpYyBEZWJ1Z0NvdW50ZXIgJmluc3RhbmNlKCk7CisKKyAgLy8gVXNlZCBieSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbiBwYXJzZXIgdG8gcHVzaCBhIG5ldyB2YWx1ZSBpdCBwYXJzZWQuCisgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHN0ZDo6c3RyaW5nICYpOworCisgIC8vIFJlZ2lzdGVyIGEgY291bnRlciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgLy8KKyAgLy8gRklYTUU6IEN1cnJlbnRseSwgY291bnRlciByZWdpc3RyYXRpb24gaXMgcmVxdWlyZWQgdG8gaGFwcGVuIGJlZm9yZSBjb21tYW5kCisgIC8vIGxpbmUgb3B0aW9uIHBhcnNpbmcuIFRoZSBtYWluIHJlYXNvbiB0byByZWdpc3RlciBjb3VudGVycyBpcyB0byBwcm9kdWNlIGEKKyAgLy8gbmljZSBsaXN0IG9mIHRoZW0gb24gdGhlIGNvbW1hbmQgbGluZSwgYnV0IGknbSBub3Qgc3VyZSB0aGlzIGlzIHdvcnRoIGl0LgorICBzdGF0aWMgdW5zaWduZWQgcmVnaXN0ZXJDb3VudGVyKFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgRGVzYykgeworICAgIHJldHVybiBpbnN0YW5jZSgpLmFkZENvdW50ZXIoTmFtZSwgRGVzYyk7CisgIH0KKyAgaW5saW5lIHN0YXRpYyBib29sIHNob3VsZEV4ZWN1dGUodW5zaWduZWQgQ291bnRlck5hbWUpIHsKKy8vIENvbXBpbGUgdG8gbm90aGluZyB3aGVuIGRlYnVnZ2luZyBpcyBvZmYKKyNpZmRlZiBOREVCVUcKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbHNlCisgICAgYXV0byAmVXMgPSBpbnN0YW5jZSgpOworICAgIGF1dG8gUmVzdWx0ID0gVXMuQ291bnRlcnMuZmluZChDb3VudGVyTmFtZSk7CisgICAgaWYgKFJlc3VsdCAhPSBVcy5Db3VudGVycy5lbmQoKSkgeworICAgICAgYXV0byAmQ291bnRlclBhaXIgPSBSZXN1bHQtPnNlY29uZDsKKyAgICAgIC8vIFdlIG9ubHkgZXhlY3V0ZSB3aGlsZSB0aGUgc2tpcCAoZmlyc3QpIGlzIHplcm8gYW5kIHRoZSBjb3VudCAoc2Vjb25kKQorICAgICAgLy8gaXMgbm9uLXplcm8uCisgICAgICAvLyBOZWdhdGl2ZSBjb3VudGVycyBhbHdheXMgZXhlY3V0ZS4KKyAgICAgIGlmIChDb3VudGVyUGFpci5maXJzdCA8IDApCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKENvdW50ZXJQYWlyLmZpcnN0ICE9IDApIHsKKyAgICAgICAgLS1Db3VudGVyUGFpci5maXJzdDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaWYgKENvdW50ZXJQYWlyLnNlY29uZCA8IDApCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKENvdW50ZXJQYWlyLnNlY29uZCAhPSAwKSB7CisgICAgICAgIC0tQ291bnRlclBhaXIuc2Vjb25kOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gRGlkbid0IGZpbmQgdGhlIGNvdW50ZXIsIHNob3VsZCB3ZSB3YXJuPworICAgIHJldHVybiB0cnVlOworI2VuZGlmIC8vIE5ERUJVRworICB9CisKKyAgLy8gUmV0dXJuIHRydWUgaWYgYSBnaXZlbiBjb3VudGVyIGhhZCB2YWx1ZXMgc2V0IChlaXRoZXIgcHJvZ3JhbWF0aWNhbGx5IG9yIG9uCisgIC8vIHRoZSBjb21tYW5kIGxpbmUpLiAgVGhpcyB3aWxsIHJldHVybiB0cnVlIGV2ZW4gaWYgdGhvc2UgdmFsdWVzIGFyZQorICAvLyBjdXJyZW50bHkgaW4gYSBzdGF0ZSB3aGVyZSB0aGUgY291bnRlciB3aWxsIGFsd2F5cyBleGVjdXRlLgorICBzdGF0aWMgYm9vbCBpc0NvdW50ZXJTZXQodW5zaWduZWQgSUQpIHsKKyAgICByZXR1cm4gaW5zdGFuY2UoKS5Db3VudGVycy5jb3VudChJRCk7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIHNraXAgYW5kIGNvdW50IGZvciBhIGNvdW50ZXIuIFRoaXMgb25seSB3b3JrcyBmb3Igc2V0IGNvdW50ZXJzLgorICBzdGF0aWMgc3RkOjpwYWlyPGludCwgaW50PiBnZXRDb3VudGVyVmFsdWUodW5zaWduZWQgSUQpIHsKKyAgICBhdXRvICZVcyA9IGluc3RhbmNlKCk7CisgICAgYXV0byBSZXN1bHQgPSBVcy5Db3VudGVycy5maW5kKElEKTsKKyAgICBhc3NlcnQoUmVzdWx0ICE9IFVzLkNvdW50ZXJzLmVuZCgpICYmICJBc2tpbmcgYWJvdXQgYSBub24tc2V0IGNvdW50ZXIiKTsKKyAgICByZXR1cm4gUmVzdWx0LT5zZWNvbmQ7CisgIH0KKworICAvLyBTZXQgYSByZWdpc3RlcmVkIGNvdW50ZXIgdG8gYSBnaXZlbiB2YWx1ZS4KKyAgc3RhdGljIHZvaWQgc2V0Q291bnRlclZhbHVlKHVuc2lnbmVkIElELCBjb25zdCBzdGQ6OnBhaXI8aW50LCBpbnQ+ICZWYWwpIHsKKyAgICBhdXRvICZVcyA9IGluc3RhbmNlKCk7CisgICAgVXMuQ291bnRlcnNbSURdID0gVmFsOworICB9CisKKyAgLy8gRHVtcCBvciBwcmludCB0aGUgY3VycmVudCBjb3VudGVyIHNldCBpbnRvIGxsdm06OmRiZ3MoKS4KKyAgTExWTV9EVU1QX01FVEhPRCB2b2lkIGR1bXAoKSBjb25zdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8gR2V0IHRoZSBjb3VudGVyIElEIGZvciBhIGdpdmVuIG5hbWVkIGNvdW50ZXIsIG9yIHJldHVybiAwIGlmIG5vbmUgaXMgZm91bmQuCisgIHVuc2lnbmVkIGdldENvdW50ZXJJZChjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgY29uc3QgeworICAgIHJldHVybiBSZWdpc3RlcmVkQ291bnRlcnMuaWRGb3IoTmFtZSk7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiByZWdpc3RlcmVkIGNvdW50ZXJzLgorICB1bnNpZ25lZCBpbnQgZ2V0TnVtQ291bnRlcnMoKSBjb25zdCB7IHJldHVybiBSZWdpc3RlcmVkQ291bnRlcnMuc2l6ZSgpOyB9CisKKyAgLy8gUmV0dXJuIHRoZSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiB0aGUgY291bnRlciB3aXRoIHRoZSBnaXZlbiBJRC4KKyAgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gZ2V0Q291bnRlckluZm8odW5zaWduZWQgSUQpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoUmVnaXN0ZXJlZENvdW50ZXJzW0lEXSwgQ291bnRlckRlc2MubG9va3VwKElEKSk7CisgIH0KKworICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHJlZ2lzdGVyZWQgY291bnRlcnMKKyAgdHlwZWRlZiBVbmlxdWVWZWN0b3I8c3RkOjpzdHJpbmc+IENvdW50ZXJWZWN0b3I7CisgIENvdW50ZXJWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBSZWdpc3RlcmVkQ291bnRlcnMuYmVnaW4oKTsKKyAgfQorICBDb3VudGVyVmVjdG9yOjpjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBSZWdpc3RlcmVkQ291bnRlcnMuZW5kKCk7IH0KKworcHJpdmF0ZToKKyAgdW5zaWduZWQgYWRkQ291bnRlcihjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcgJkRlc2MpIHsKKyAgICB1bnNpZ25lZCBSZXN1bHQgPSBSZWdpc3RlcmVkQ291bnRlcnMuaW5zZXJ0KE5hbWUpOworICAgIENvdW50ZXJEZXNjW1Jlc3VsdF0gPSBEZXNjOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKyAgRGVuc2VNYXA8dW5zaWduZWQsIHN0ZDo6cGFpcjxsb25nLCBsb25nPj4gQ291bnRlcnM7CisgIERlbnNlTWFwPHVuc2lnbmVkLCBzdGQ6OnN0cmluZz4gQ291bnRlckRlc2M7CisgIENvdW50ZXJWZWN0b3IgUmVnaXN0ZXJlZENvdW50ZXJzOworfTsKKworI2RlZmluZSBERUJVR19DT1VOVEVSKFZBUk5BTUUsIENPVU5URVJOQU1FLCBERVNDKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFZBUk5BTUUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBEZWJ1Z0NvdW50ZXI6OnJlZ2lzdGVyQ291bnRlcihDT1VOVEVSTkFNRSwgREVTQykKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRHluYW1pY0xpYnJhcnkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9EeW5hbWljTGlicmFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OWQ1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRHluYW1pY0xpYnJhcnkuaApAQCAtMCwwICsxLDEzMyBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvRHluYW1pY0xpYnJhcnkuaCAtIFBvcnRhYmxlIER5bmFtaWMgTGlicmFyeSAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBzeXM6OkR5bmFtaWNMaWJyYXJ5IGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0RZTkFNSUNMSUJSQVJZX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0RZTkFNSUNMSUJSQVJZX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBTdHJpbmdSZWY7CisKK25hbWVzcGFjZSBzeXMgeworCisgIC8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgcG9ydGFibGUgaW50ZXJmYWNlIHRvIGR5bmFtaWMgbGlicmFyaWVzIHdoaWNoIGFsc28KKyAgLy8vIG1pZ2h0IGJlIGtub3duIGFzIHNoYXJlZCBsaWJyYXJpZXMsIHNoYXJlZCBvYmplY3RzLCBkeW5hbWljIHNoYXJlZAorICAvLy8gb2JqZWN0cywgb3IgZHluYW1pYyBsaW5rIGxpYnJhcmllcy4gUmVnYXJkbGVzcyBvZiB0aGUgdGVybWlub2xvZ3kgb3IgdGhlCisgIC8vLyBvcGVyYXRpbmcgc3lzdGVtIGludGVyZmFjZSwgdGhpcyBjbGFzcyBwcm92aWRlcyBhIHBvcnRhYmxlIGludGVyZmFjZSB0aGF0CisgIC8vLyBhbGxvd3MgZHluYW1pYyBsaWJyYXJpZXMgdG8gYmUgbG9hZGVkIGFuZCBzZWFyY2hlZCBmb3IgZXh0ZXJuYWxseQorICAvLy8gZGVmaW5lZCBzeW1ib2xzLiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHRvIHByb3ZpZGUgInBsdWctaW4iIHN1cHBvcnQuCisgIC8vLyBJdCBhbHNvIGFsbG93cyBmb3Igc3ltYm9scyB0byBiZSBkZWZpbmVkIHdoaWNoIGRvbid0IGxpdmUgaW4gYW55IGxpYnJhcnksCisgIC8vLyBidXQgcmF0aGVyIHRoZSBtYWluIHByb2dyYW0gaXRzZWxmLCB1c2VmdWwgb24gV2luZG93cyB3aGVyZSB0aGUgbWFpbgorICAvLy8gZXhlY3V0YWJsZSBjYW5ub3QgYmUgc2VhcmNoZWQuCisgIC8vLworICAvLy8gTm90ZTogdGhlcmUgaXMgY3VycmVudGx5IG5vIGludGVyZmFjZSBmb3IgdGVtcG9yYXJpbHkgbG9hZGluZyBhIGxpYnJhcnksCisgIC8vLyBvciBmb3IgdW5sb2FkaW5nIGxpYnJhcmllcyB3aGVuIHRoZSBMTFZNIGxpYnJhcnkgaXMgdW5sb2FkZWQuCisgIGNsYXNzIER5bmFtaWNMaWJyYXJ5IHsKKyAgICAvLyBQbGFjZWhvbGRlciB3aG9zZSBhZGRyZXNzIHJlcHJlc2VudHMgYW4gaW52YWxpZCBsaWJyYXJ5LgorICAgIC8vIFdlIHVzZSB0aGlzIGluc3RlYWQgb2YgTlVMTCBvciBhIHBvaW50ZXItaW50IHBhaXIgYmVjYXVzZSB0aGUgT1MgbGlicmFyeQorICAgIC8vIG1pZ2h0IGRlZmluZSAwIG9yIDEgdG8gYmUgInNwZWNpYWwiIGhhbmRsZXMsIHN1Y2ggYXMgInNlYXJjaCBhbGwiLgorICAgIHN0YXRpYyBjaGFyIEludmFsaWQ7CisKKyAgICAvLyBPcGFxdWUgZGF0YSB1c2VkIHRvIGludGVyZmFjZSB3aXRoIE9TLXNwZWNpZmljIGR5bmFtaWMgbGlicmFyeSBoYW5kbGluZy4KKyAgICB2b2lkICpEYXRhOworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBEeW5hbWljTGlicmFyeSh2b2lkICpkYXRhID0gJkludmFsaWQpIDogRGF0YShkYXRhKSB7fQorCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IHJlZmVycyB0byBhIHZhbGlkIGxpYnJhcnkuCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gRGF0YSAhPSAmSW52YWxpZDsgfQorCisgICAgLy8vIFNlYXJjaGVzIHRocm91Z2ggdGhlIGxpYnJhcnkgZm9yIHRoZSBzeW1ib2wgXHAgc3ltYm9sTmFtZS4gSWYgaXQgaXMKKyAgICAvLy8gZm91bmQsIHRoZSBhZGRyZXNzIG9mIHRoYXQgc3ltYm9sIGlzIHJldHVybmVkLiBJZiBub3QsIE5VTEwgaXMgcmV0dXJuZWQuCisgICAgLy8vIE5vdGUgdGhhdCBOVUxMIHdpbGwgYWxzbyBiZSByZXR1cm5lZCBpZiB0aGUgbGlicmFyeSBmYWlsZWQgdG8gbG9hZC4KKyAgICAvLy8gVXNlIGlzVmFsaWQoKSB0byBkaXN0aW5ndWlzaCB0aGVzZSBjYXNlcyBpZiBpdCBpcyBpbXBvcnRhbnQuCisgICAgLy8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgXGUgbm90IHNlYXJjaCBzeW1ib2xzIGV4cGxpY2l0bHkgcmVnaXN0ZXJlZCBieQorICAgIC8vLyBBZGRTeW1ib2woKS4KKyAgICB2b2lkICpnZXRBZGRyZXNzT2ZTeW1ib2woY29uc3QgY2hhciAqc3ltYm9sTmFtZSk7CisKKyAgICAvLy8gVGhpcyBmdW5jdGlvbiBwZXJtYW5lbnRseSBsb2FkcyB0aGUgZHluYW1pYyBsaWJyYXJ5IGF0IHRoZSBnaXZlbiBwYXRoLgorICAgIC8vLyBUaGUgbGlicmFyeSB3aWxsIG9ubHkgYmUgdW5sb2FkZWQgd2hlbiBsbHZtX3NodXRkb3duKCkgaXMgY2FsbGVkLgorICAgIC8vLyBUaGlzIHJldHVybnMgYSB2YWxpZCBEeW5hbWljTGlicmFyeSBpbnN0YW5jZSBvbiBzdWNjZXNzIGFuZCBhbiBpbnZhbGlkCisgICAgLy8vIGluc3RhbmNlIG9uIGZhaWx1cmUgKHNlZSBpc1ZhbGlkKCkpLiBccCAqZXJyTXNnIHdpbGwgb25seSBiZSBtb2RpZmllZAorICAgIC8vLyBpZiB0aGUgbGlicmFyeSBmYWlscyB0byBsb2FkLgorICAgIC8vLworICAgIC8vLyBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lcyBmb3IgdGhlIHNhbWUgbGlicmFyeS4KKyAgICAvLy8gQGJyaWVmIE9wZW4gYSBkeW5hbWljIGxpYnJhcnkgcGVybWFuZW50bHkuCisgICAgc3RhdGljIER5bmFtaWNMaWJyYXJ5IGdldFBlcm1hbmVudExpYnJhcnkoY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmVyck1zZyA9IG51bGxwdHIpOworCisgICAgLy8vIFJlZ2lzdGVycyBhbiBleHRlcm5hbGx5IGxvYWRlZCBsaWJyYXJ5LiBUaGUgbGlicmFyeSB3aWxsIGJlIHVubG9hZGVkCisgICAgLy8vIHdoZW4gdGhlIHByb2dyYW0gdGVybWluYXRlcy4KKyAgICAvLy8KKyAgICAvLy8gSXQgaXMgc2FmZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lIGxpYnJhcnksCisgICAgLy8vIHRob3VnaCBvd25lcnNoaXAgaXMgb25seSB0YWtlbiBpZiB0aGVyZSB3YXMgbm8gZXJyb3IuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm5zIEFuIGVtcHR5IFxwIER5bmFtaWNMaWJyYXJ5IGlmIHRoZSBsaWJyYXJ5IHdhcyBhbHJlYWR5IGxvYWRlZC4KKyAgICBzdGF0aWMgRHluYW1pY0xpYnJhcnkgYWRkUGVybWFuZW50TGlicmFyeSh2b2lkICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmVyck1zZyA9IG51bGxwdHIpOworCisgICAgLy8vIFRoaXMgZnVuY3Rpb24gcGVybWFuZW50bHkgbG9hZHMgdGhlIGR5bmFtaWMgbGlicmFyeSBhdCB0aGUgZ2l2ZW4gcGF0aC4KKyAgICAvLy8gVXNlIHRoaXMgaW5zdGVhZCBvZiBnZXRQZXJtYW5lbnRMaWJyYXJ5KCkgd2hlbiB5b3Ugd29uJ3QgbmVlZCB0byBnZXQKKyAgICAvLy8gc3ltYm9scyBmcm9tIHRoZSBsaWJyYXJ5IGl0c2VsZi4KKyAgICAvLy8KKyAgICAvLy8gSXQgaXMgc2FmZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lIGxpYnJhcnkuCisgICAgc3RhdGljIGJvb2wgTG9hZExpYnJhcnlQZXJtYW5lbnRseShjb25zdCBjaGFyICpGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpFcnJNc2cgPSBudWxscHRyKSB7CisgICAgICByZXR1cm4gIWdldFBlcm1hbmVudExpYnJhcnkoRmlsZW5hbWUsIEVyck1zZykuaXNWYWxpZCgpOworICAgIH0KKworICAgIGVudW0gU2VhcmNoT3JkZXJpbmcgeworICAgICAgLy8vIFNPX0xpbmtlciAtIFNlYXJjaCBhcyBhIGNhbGwgdG8gZGxzeW0oZGxvcGVuKE5VTEwpKSB3b3VsZCB3aGVuCisgICAgICAvLy8gRHluYW1pY0xpYnJhcnk6OmdldFBlcm1hbmVudExpYnJhcnkoTlVMTCkgaGFzIGJlZW4gY2FsbGVkIG9yCisgICAgICAvLy8gc2VhcmNoIHRoZSBsaXN0IG9mIGV4cGxjaXRseSBsb2FkZWQgc3ltYm9scyBpZiBub3QuCisgICAgICBTT19MaW5rZXIsCisgICAgICAvLy8gU09fTG9hZGVkRmlyc3QgLSBTZWFyY2ggYWxsIGxvYWRlZCBsaWJyYXJpZXMsIHRoZW4gYXMgU09fTGlua2VyIHdvdWxkLgorICAgICAgU09fTG9hZGVkRmlyc3QsCisgICAgICAvLy8gU09fTG9hZGVkTGFzdCAtIFNlYXJjaCBhcyBTT19MaW5rZXIgd291bGQsIHRoZW4gbG9hZGVkIGxpYnJhcmllcy4KKyAgICAgIC8vLyBPbmx5IHVzZWZ1bCB0byBzZWFyY2ggaWYgbGlicmFyaWVzIHdpdGggUlRMRF9MT0NBTCBoYXZlIGJlZW4gYWRkZWQuCisgICAgICBTT19Mb2FkZWRMYXN0LAorICAgICAgLy8vIFNPX0xvYWRPcmRlciAtIE9yIHRoaXMgaW4gdG8gc2VhcmNoIGxpYnJhcmllcyBpbiB0aGUgb3JkZXJlZCBsb2FkZWQuCisgICAgICAvLy8gVGhlIGRlZmF1bHQgYmFoYXZpb3VyIGlzIHRvIHNlYXJjaCBsb2FkZWQgbGlicmFyaWVzIGluIHJldmVyc2UuCisgICAgICBTT19Mb2FkT3JkZXIgPSA0CisgICAgfTsKKyAgICBzdGF0aWMgU2VhcmNoT3JkZXJpbmcgU2VhcmNoT3JkZXI7IC8vID0gU09fTGlua2VyCisKKyAgICAvLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHNlYXJjaCB0aHJvdWdoIGFsbCBwcmV2aW91c2x5IGxvYWRlZCBkeW5hbWljCisgICAgLy8vIGxpYnJhcmllcyBmb3IgdGhlIHN5bWJvbCBccCBzeW1ib2xOYW1lLiBJZiBpdCBpcyBmb3VuZCwgdGhlIGFkZHJlc3Mgb2YKKyAgICAvLy8gdGhhdCBzeW1ib2wgaXMgcmV0dXJuZWQuIElmIG5vdCwgbnVsbCBpcyByZXR1cm5lZC4gTm90ZSB0aGF0IHRoaXMgd2lsbAorICAgIC8vLyBzZWFyY2ggcGVybWFuZW50bHkgbG9hZGVkIGxpYnJhcmllcyAoZ2V0UGVybWFuZW50TGlicmFyeSgpKSBhcyB3ZWxsCisgICAgLy8vIGFzIGV4cGxpY2l0bHkgcmVnaXN0ZXJlZCBzeW1ib2xzIChBZGRTeW1ib2woKSkuCisgICAgLy8vIEB0aHJvd3Mgc3RkOjpzdHJpbmcgb24gZXJyb3IuCisgICAgLy8vIEBicmllZiBTZWFyY2ggdGhyb3VnaCBsaWJyYXJpZXMgZm9yIGFkZHJlc3Mgb2YgYSBzeW1ib2wKKyAgICBzdGF0aWMgdm9pZCAqU2VhcmNoRm9yQWRkcmVzc09mU3ltYm9sKGNvbnN0IGNoYXIgKnN5bWJvbE5hbWUpOworCisgICAgLy8vIEBicmllZiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgQysrb3BoaWxlcy4KKyAgICBzdGF0aWMgdm9pZCAqU2VhcmNoRm9yQWRkcmVzc09mU3ltYm9sKGNvbnN0IHN0ZDo6c3RyaW5nICZzeW1ib2xOYW1lKSB7CisgICAgICByZXR1cm4gU2VhcmNoRm9yQWRkcmVzc09mU3ltYm9sKHN5bWJvbE5hbWUuY19zdHIoKSk7CisgICAgfQorCisgICAgLy8vIFRoaXMgZnVuY3Rpb25zIHBlcm1hbmVudGx5IGFkZHMgdGhlIHN5bWJvbCBccCBzeW1ib2xOYW1lIHdpdGggdGhlCisgICAgLy8vIHZhbHVlIFxwIHN5bWJvbFZhbHVlLiAgVGhlc2Ugc3ltYm9scyBhcmUgc2VhcmNoZWQgYmVmb3JlIGFueQorICAgIC8vLyBsaWJyYXJpZXMuCisgICAgLy8vIEBicmllZiBBZGQgc2VhcmNoYWJsZSBzeW1ib2wvdmFsdWUgcGFpci4KKyAgICBzdGF0aWMgdm9pZCBBZGRTeW1ib2woU3RyaW5nUmVmIHN5bWJvbE5hbWUsIHZvaWQgKnN5bWJvbFZhbHVlKTsKKworICAgIGNsYXNzIEhhbmRsZVNldDsKKyAgfTsKKworfSAvLyBFbmQgc3lzIG5hbWVzcGFjZQorfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRW5kaWFuLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwZDliNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FbmRpYW4uaApAQCAtMCwwICsxLDQxNSBAQAorLy89PT0tIEVuZGlhbi5oIC0gVXRpbGl0aWVzIGZvciBJTyB3aXRoIGVuZGlhbiBzcGVjaWZpYyBkYXRhIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgZ2VuZXJpYyBmdW5jdGlvbnMgdG8gcmVhZCBhbmQgd3JpdGUgZW5kaWFuIHNwZWNpZmljIGRhdGEuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfRU5ESUFOX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0VORElBTl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxpZ25PZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Ib3N0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1N3YXBCeXRlT3JkZXIuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugc3VwcG9ydCB7CisKK2VudW0gZW5kaWFubmVzcyB7YmlnLCBsaXR0bGUsIG5hdGl2ZX07CisKKy8vIFRoZXNlIGFyZSBuYW1lZCB2YWx1ZXMgZm9yIGNvbW1vbiBhbGlnbm1lbnRzLgorZW51bSB7YWxpZ25lZCA9IDAsIHVuYWxpZ25lZCA9IDF9OworCituYW1lc3BhY2UgZGV0YWlsIHsKKworLy8vIFxicmllZiA6OnZhbHVlIGlzIGVpdGhlciBhbGlnbm1lbnQsIG9yIGFsaWdub2YoVCkgaWYgYWxpZ25tZW50IGlzIDAuCit0ZW1wbGF0ZTxjbGFzcyBULCBpbnQgYWxpZ25tZW50Pgorc3RydWN0IFBpY2tBbGlnbm1lbnQgeworIGVudW0geyB2YWx1ZSA9IGFsaWdubWVudCA9PSAwID8gYWxpZ25vZihUKSA6IGFsaWdubWVudCB9OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCituYW1lc3BhY2UgZW5kaWFuIHsKKworY29uc3RleHByIGVuZGlhbm5lc3Mgc3lzdGVtX2VuZGlhbm5lc3MoKSB7CisgIHJldHVybiBzeXM6OklzQmlnRW5kaWFuSG9zdCA/IGJpZyA6IGxpdHRsZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIHZhbHVlX3R5cGU+CitpbmxpbmUgdmFsdWVfdHlwZSBieXRlX3N3YXAodmFsdWVfdHlwZSB2YWx1ZSwgZW5kaWFubmVzcyBlbmRpYW4pIHsKKyAgaWYgKChlbmRpYW4gIT0gbmF0aXZlKSAmJiAoZW5kaWFuICE9IHN5c3RlbV9lbmRpYW5uZXNzKCkpKQorICAgIHN5czo6c3dhcEJ5dGVPcmRlcih2YWx1ZSk7CisgIHJldHVybiB2YWx1ZTsKK30KKworLy8vIFN3YXAgdGhlIGJ5dGVzIG9mIHZhbHVlIHRvIG1hdGNoIHRoZSBnaXZlbiBlbmRpYW5uZXNzLgordGVtcGxhdGU8dHlwZW5hbWUgdmFsdWVfdHlwZSwgZW5kaWFubmVzcyBlbmRpYW4+CitpbmxpbmUgdmFsdWVfdHlwZSBieXRlX3N3YXAodmFsdWVfdHlwZSB2YWx1ZSkgeworICByZXR1cm4gYnl0ZV9zd2FwKHZhbHVlLCBlbmRpYW4pOworfQorCisvLy8gUmVhZCBhIHZhbHVlIG9mIGEgcGFydGljdWxhciBlbmRpYW5uZXNzIGZyb20gbWVtb3J5LgordGVtcGxhdGUgPHR5cGVuYW1lIHZhbHVlX3R5cGUsIHN0ZDo6c2l6ZV90IGFsaWdubWVudD4KK2lubGluZSB2YWx1ZV90eXBlIHJlYWQoY29uc3Qgdm9pZCAqbWVtb3J5LCBlbmRpYW5uZXNzIGVuZGlhbikgeworICB2YWx1ZV90eXBlIHJldDsKKworICBtZW1jcHkoJnJldCwKKyAgICAgICAgIExMVk1fQVNTVU1FX0FMSUdORUQoCisgICAgICAgICAgICAgbWVtb3J5LCAoZGV0YWlsOjpQaWNrQWxpZ25tZW50PHZhbHVlX3R5cGUsIGFsaWdubWVudD46OnZhbHVlKSksCisgICAgICAgICBzaXplb2YodmFsdWVfdHlwZSkpOworICByZXR1cm4gYnl0ZV9zd2FwPHZhbHVlX3R5cGU+KHJldCwgZW5kaWFuKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgdmFsdWVfdHlwZSwKKyAgICAgICAgIGVuZGlhbm5lc3MgZW5kaWFuLAorICAgICAgICAgc3RkOjpzaXplX3QgYWxpZ25tZW50PgoraW5saW5lIHZhbHVlX3R5cGUgcmVhZChjb25zdCB2b2lkICptZW1vcnkpIHsKKyAgcmV0dXJuIHJlYWQ8dmFsdWVfdHlwZSwgYWxpZ25tZW50PihtZW1vcnksIGVuZGlhbik7Cit9CisKKy8vLyBSZWFkIGEgdmFsdWUgb2YgYSBwYXJ0aWN1bGFyIGVuZGlhbm5lc3MgZnJvbSBhIGJ1ZmZlciwgYW5kIGluY3JlbWVudCB0aGUKKy8vLyBidWZmZXIgcGFzdCB0aGF0IHZhbHVlLgordGVtcGxhdGUgPHR5cGVuYW1lIHZhbHVlX3R5cGUsIHN0ZDo6c2l6ZV90IGFsaWdubWVudCwgdHlwZW5hbWUgQ2hhclQ+CitpbmxpbmUgdmFsdWVfdHlwZSByZWFkTmV4dChjb25zdCBDaGFyVCAqJm1lbW9yeSwgZW5kaWFubmVzcyBlbmRpYW4pIHsKKyAgdmFsdWVfdHlwZSByZXQgPSByZWFkPHZhbHVlX3R5cGUsIGFsaWdubWVudD4obWVtb3J5LCBlbmRpYW4pOworICBtZW1vcnkgKz0gc2l6ZW9mKHZhbHVlX3R5cGUpOworICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSB2YWx1ZV90eXBlLCBlbmRpYW5uZXNzIGVuZGlhbiwgc3RkOjpzaXplX3QgYWxpZ25tZW50LAorICAgICAgICAgdHlwZW5hbWUgQ2hhclQ+CitpbmxpbmUgdmFsdWVfdHlwZSByZWFkTmV4dChjb25zdCBDaGFyVCAqJm1lbW9yeSkgeworICByZXR1cm4gcmVhZE5leHQ8dmFsdWVfdHlwZSwgYWxpZ25tZW50LCBDaGFyVD4obWVtb3J5LCBlbmRpYW4pOworfQorCisvLy8gV3JpdGUgYSB2YWx1ZSB0byBtZW1vcnkgd2l0aCBhIHBhcnRpY3VsYXIgZW5kaWFubmVzcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSB2YWx1ZV90eXBlLCBzdGQ6OnNpemVfdCBhbGlnbm1lbnQ+CitpbmxpbmUgdm9pZCB3cml0ZSh2b2lkICptZW1vcnksIHZhbHVlX3R5cGUgdmFsdWUsIGVuZGlhbm5lc3MgZW5kaWFuKSB7CisgIHZhbHVlID0gYnl0ZV9zd2FwPHZhbHVlX3R5cGU+KHZhbHVlLCBlbmRpYW4pOworICBtZW1jcHkoTExWTV9BU1NVTUVfQUxJR05FRCgKKyAgICAgICAgICAgICBtZW1vcnksIChkZXRhaWw6OlBpY2tBbGlnbm1lbnQ8dmFsdWVfdHlwZSwgYWxpZ25tZW50Pjo6dmFsdWUpKSwKKyAgICAgICAgICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlX3R5cGUpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgdmFsdWVfdHlwZSwKKyAgICAgICAgIGVuZGlhbm5lc3MgZW5kaWFuLAorICAgICAgICAgc3RkOjpzaXplX3QgYWxpZ25tZW50PgoraW5saW5lIHZvaWQgd3JpdGUodm9pZCAqbWVtb3J5LCB2YWx1ZV90eXBlIHZhbHVlKSB7CisgIHdyaXRlPHZhbHVlX3R5cGUsIGFsaWdubWVudD4obWVtb3J5LCB2YWx1ZSwgZW5kaWFuKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIHZhbHVlX3R5cGU+Cit1c2luZyBtYWtlX3Vuc2lnbmVkX3QgPSB0eXBlbmFtZSBzdGQ6Om1ha2VfdW5zaWduZWQ8dmFsdWVfdHlwZT46OnR5cGU7CisKKy8vLyBSZWFkIGEgdmFsdWUgb2YgYSBwYXJ0aWN1bGFyIGVuZGlhbm5lc3MgZnJvbSBtZW1vcnksIGZvciBhIGxvY2F0aW9uCisvLy8gdGhhdCBzdGFydHMgYXQgdGhlIGdpdmVuIGJpdCBvZmZzZXQgd2l0aGluIHRoZSBmaXJzdCBieXRlLgordGVtcGxhdGUgPHR5cGVuYW1lIHZhbHVlX3R5cGUsIGVuZGlhbm5lc3MgZW5kaWFuLCBzdGQ6OnNpemVfdCBhbGlnbm1lbnQ+CitpbmxpbmUgdmFsdWVfdHlwZSByZWFkQXRCaXRBbGlnbm1lbnQoY29uc3Qgdm9pZCAqbWVtb3J5LCB1aW50NjRfdCBzdGFydEJpdCkgeworICBhc3NlcnQoc3RhcnRCaXQgPCA4KTsKKyAgaWYgKHN0YXJ0Qml0ID09IDApCisgICAgcmV0dXJuIHJlYWQ8dmFsdWVfdHlwZSwgZW5kaWFuLCBhbGlnbm1lbnQ+KG1lbW9yeSk7CisgIGVsc2UgeworICAgIC8vIFJlYWQgdHdvIHZhbHVlcyBhbmQgY29tcG9zZSB0aGUgcmVzdWx0IGZyb20gdGhlbS4KKyAgICB2YWx1ZV90eXBlIHZhbFsyXTsKKyAgICBtZW1jcHkoJnZhbFswXSwKKyAgICAgICAgICAgTExWTV9BU1NVTUVfQUxJR05FRCgKKyAgICAgICAgICAgICAgIG1lbW9yeSwgKGRldGFpbDo6UGlja0FsaWdubWVudDx2YWx1ZV90eXBlLCBhbGlnbm1lbnQ+Ojp2YWx1ZSkpLAorICAgICAgICAgICBzaXplb2YodmFsdWVfdHlwZSkgKiAyKTsKKyAgICB2YWxbMF0gPSBieXRlX3N3YXA8dmFsdWVfdHlwZSwgZW5kaWFuPih2YWxbMF0pOworICAgIHZhbFsxXSA9IGJ5dGVfc3dhcDx2YWx1ZV90eXBlLCBlbmRpYW4+KHZhbFsxXSk7CisKKyAgICAvLyBTaGlmdCBiaXRzIGZyb20gdGhlIGxvd2VyIHZhbHVlIGludG8gcGxhY2UuCisgICAgbWFrZV91bnNpZ25lZF90PHZhbHVlX3R5cGU+IGxvd2VyVmFsID0gdmFsWzBdID4+IHN0YXJ0Qml0OworICAgIC8vIE1hc2sgb2ZmIHVwcGVyIGJpdHMgYWZ0ZXIgcmlnaHQgc2hpZnQgaW4gY2FzZSBvZiBzaWduZWQgdHlwZS4KKyAgICBtYWtlX3Vuc2lnbmVkX3Q8dmFsdWVfdHlwZT4gbnVtQml0c0ZpcnN0VmFsID0KKyAgICAgICAgKHNpemVvZih2YWx1ZV90eXBlKSAqIDgpIC0gc3RhcnRCaXQ7CisgICAgbG93ZXJWYWwgJj0gKChtYWtlX3Vuc2lnbmVkX3Q8dmFsdWVfdHlwZT4pMSA8PCBudW1CaXRzRmlyc3RWYWwpIC0gMTsKKworICAgIC8vIEdldCB0aGUgYml0cyBmcm9tIHRoZSB1cHBlciB2YWx1ZS4KKyAgICBtYWtlX3Vuc2lnbmVkX3Q8dmFsdWVfdHlwZT4gdXBwZXJWYWwgPQorICAgICAgICB2YWxbMV0gJiAoKChtYWtlX3Vuc2lnbmVkX3Q8dmFsdWVfdHlwZT4pMSA8PCBzdGFydEJpdCkgLSAxKTsKKyAgICAvLyBTaGlmdCB0aGVtIGluIHRvIHBsYWNlLgorICAgIHVwcGVyVmFsIDw8PSBudW1CaXRzRmlyc3RWYWw7CisKKyAgICByZXR1cm4gbG93ZXJWYWwgfCB1cHBlclZhbDsKKyAgfQorfQorCisvLy8gV3JpdGUgYSB2YWx1ZSB0byBtZW1vcnkgd2l0aCBhIHBhcnRpY3VsYXIgZW5kaWFubmVzcywgZm9yIGEgbG9jYXRpb24KKy8vLyB0aGF0IHN0YXJ0cyBhdCB0aGUgZ2l2ZW4gYml0IG9mZnNldCB3aXRoaW4gdGhlIGZpcnN0IGJ5dGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgdmFsdWVfdHlwZSwgZW5kaWFubmVzcyBlbmRpYW4sIHN0ZDo6c2l6ZV90IGFsaWdubWVudD4KK2lubGluZSB2b2lkIHdyaXRlQXRCaXRBbGlnbm1lbnQodm9pZCAqbWVtb3J5LCB2YWx1ZV90eXBlIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzdGFydEJpdCkgeworICBhc3NlcnQoc3RhcnRCaXQgPCA4KTsKKyAgaWYgKHN0YXJ0Qml0ID09IDApCisgICAgd3JpdGU8dmFsdWVfdHlwZSwgZW5kaWFuLCBhbGlnbm1lbnQ+KG1lbW9yeSwgdmFsdWUpOworICBlbHNlIHsKKyAgICAvLyBSZWFkIHR3byB2YWx1ZXMgYW5kIHNoaWZ0IHRoZSByZXN1bHQgaW50byB0aGVtLgorICAgIHZhbHVlX3R5cGUgdmFsWzJdOworICAgIG1lbWNweSgmdmFsWzBdLAorICAgICAgICAgICBMTFZNX0FTU1VNRV9BTElHTkVEKAorICAgICAgICAgICAgICAgbWVtb3J5LCAoZGV0YWlsOjpQaWNrQWxpZ25tZW50PHZhbHVlX3R5cGUsIGFsaWdubWVudD46OnZhbHVlKSksCisgICAgICAgICAgIHNpemVvZih2YWx1ZV90eXBlKSAqIDIpOworICAgIHZhbFswXSA9IGJ5dGVfc3dhcDx2YWx1ZV90eXBlLCBlbmRpYW4+KHZhbFswXSk7CisgICAgdmFsWzFdID0gYnl0ZV9zd2FwPHZhbHVlX3R5cGUsIGVuZGlhbj4odmFsWzFdKTsKKworICAgIC8vIE1hc2sgb2ZmIGFueSBleGlzdGluZyBiaXRzIGluIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSBsb3dlciB2YWx1ZSB0aGF0CisgICAgLy8gd2Ugd2FudCB0byByZXBsYWNlLgorICAgIHZhbFswXSAmPSAoKG1ha2VfdW5zaWduZWRfdDx2YWx1ZV90eXBlPikxIDw8IHN0YXJ0Qml0KSAtIDE7CisgICAgbWFrZV91bnNpZ25lZF90PHZhbHVlX3R5cGU+IG51bUJpdHNGaXJzdFZhbCA9CisgICAgICAgIChzaXplb2YodmFsdWVfdHlwZSkgKiA4KSAtIHN0YXJ0Qml0OworICAgIG1ha2VfdW5zaWduZWRfdDx2YWx1ZV90eXBlPiBsb3dlclZhbCA9IHZhbHVlOworICAgIGlmIChzdGFydEJpdCA+IDApIHsKKyAgICAgIC8vIE1hc2sgb2ZmIHRoZSB1cHBlciBiaXRzIGluIHRoZSBuZXcgdmFsdWUgdGhhdCBhcmUgbm90IGdvaW5nIHRvIGdvIGludG8KKyAgICAgIC8vIHRoZSBsb3dlciB2YWx1ZS4gVGhpcyBhdm9pZHMgYSBsZWZ0IHNoaWZ0IG9mIGEgbmVnYXRpdmUgdmFsdWUsIHdoaWNoCisgICAgICAvLyBpcyB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgICBsb3dlclZhbCAmPSAoKChtYWtlX3Vuc2lnbmVkX3Q8dmFsdWVfdHlwZT4pMSA8PCBudW1CaXRzRmlyc3RWYWwpIC0gMSk7CisgICAgICAvLyBOb3cgc2hpZnQgdGhlIG5ldyBiaXRzIGludG8gcGxhY2UKKyAgICAgIGxvd2VyVmFsIDw8PSBzdGFydEJpdDsKKyAgICB9CisgICAgdmFsWzBdIHw9IGxvd2VyVmFsOworCisgICAgLy8gTWFzayBvZmYgYW55IGV4aXN0aW5nIGJpdHMgaW4gdGhlIGxvd2VyIHBhcnQgb2YgdGhlIHVwcGVyIHZhbHVlIHRoYXQKKyAgICAvLyB3ZSB3YW50IHRvIHJlcGxhY2UuCisgICAgdmFsWzFdICY9IH4oKChtYWtlX3Vuc2lnbmVkX3Q8dmFsdWVfdHlwZT4pMSA8PCBzdGFydEJpdCkgLSAxKTsKKyAgICAvLyBOZXh0IHNoaWZ0IHRoZSBiaXRzIHRoYXQgZ28gaW50byB0aGUgdXBwZXIgdmFsdWUgaW50byBwb3NpdGlvbi4KKyAgICBtYWtlX3Vuc2lnbmVkX3Q8dmFsdWVfdHlwZT4gdXBwZXJWYWwgPSB2YWx1ZSA+PiBudW1CaXRzRmlyc3RWYWw7CisgICAgLy8gTWFzayBvZmYgdXBwZXIgYml0cyBhZnRlciByaWdodCBzaGlmdCBpbiBjYXNlIG9mIHNpZ25lZCB0eXBlLgorICAgIHVwcGVyVmFsICY9ICgobWFrZV91bnNpZ25lZF90PHZhbHVlX3R5cGU+KTEgPDwgc3RhcnRCaXQpIC0gMTsKKyAgICB2YWxbMV0gfD0gdXBwZXJWYWw7CisKKyAgICAvLyBGaW5hbGx5LCByZXdyaXRlIHZhbHVlcy4KKyAgICB2YWxbMF0gPSBieXRlX3N3YXA8dmFsdWVfdHlwZSwgZW5kaWFuPih2YWxbMF0pOworICAgIHZhbFsxXSA9IGJ5dGVfc3dhcDx2YWx1ZV90eXBlLCBlbmRpYW4+KHZhbFsxXSk7CisgICAgbWVtY3B5KExMVk1fQVNTVU1FX0FMSUdORUQoCisgICAgICAgICAgICAgICBtZW1vcnksIChkZXRhaWw6OlBpY2tBbGlnbm1lbnQ8dmFsdWVfdHlwZSwgYWxpZ25tZW50Pjo6dmFsdWUpKSwKKyAgICAgICAgICAgJnZhbFswXSwgc2l6ZW9mKHZhbHVlX3R5cGUpICogMik7CisgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGVuZGlhbgorCituYW1lc3BhY2UgZGV0YWlsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgdmFsdWVfdHlwZSwKKyAgICAgICAgIGVuZGlhbm5lc3MgZW5kaWFuLAorICAgICAgICAgc3RkOjpzaXplX3QgYWxpZ25tZW50Pgorc3RydWN0IHBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWwgeworICBwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsKCkgPSBkZWZhdWx0OworCisgIGV4cGxpY2l0IHBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWwodmFsdWVfdHlwZSB2YWwpIHsgKnRoaXMgPSB2YWw7IH0KKworICBvcGVyYXRvciB2YWx1ZV90eXBlKCkgY29uc3QgeworICAgIHJldHVybiBlbmRpYW46OnJlYWQ8dmFsdWVfdHlwZSwgZW5kaWFuLCBhbGlnbm1lbnQ+KAorICAgICAgKGNvbnN0IHZvaWQqKVZhbHVlLmJ1ZmZlcik7CisgIH0KKworICB2b2lkIG9wZXJhdG9yPSh2YWx1ZV90eXBlIG5ld1ZhbHVlKSB7CisgICAgZW5kaWFuOjp3cml0ZTx2YWx1ZV90eXBlLCBlbmRpYW4sIGFsaWdubWVudD4oCisgICAgICAodm9pZCopVmFsdWUuYnVmZmVyLCBuZXdWYWx1ZSk7CisgIH0KKworICBwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsICZvcGVyYXRvcis9KHZhbHVlX3R5cGUgbmV3VmFsdWUpIHsKKyAgICAqdGhpcyA9ICp0aGlzICsgbmV3VmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgcGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbCAmb3BlcmF0b3ItPSh2YWx1ZV90eXBlIG5ld1ZhbHVlKSB7CisgICAgKnRoaXMgPSAqdGhpcyAtIG5ld1ZhbHVlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWwgJm9wZXJhdG9yfD0odmFsdWVfdHlwZSBuZXdWYWx1ZSkgeworICAgICp0aGlzID0gKnRoaXMgfCBuZXdWYWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsICZvcGVyYXRvciY9KHZhbHVlX3R5cGUgbmV3VmFsdWUpIHsKKyAgICAqdGhpcyA9ICp0aGlzICYgbmV3VmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKK3ByaXZhdGU6CisgIEFsaWduZWRDaGFyQXJyYXk8UGlja0FsaWdubWVudDx2YWx1ZV90eXBlLCBhbGlnbm1lbnQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YodmFsdWVfdHlwZSk+IFZhbHVlOworCitwdWJsaWM6CisgIHN0cnVjdCByZWYgeworICAgIGV4cGxpY2l0IHJlZih2b2lkICpQdHIpIDogUHRyKFB0cikge30KKworICAgIG9wZXJhdG9yIHZhbHVlX3R5cGUoKSBjb25zdCB7CisgICAgICByZXR1cm4gZW5kaWFuOjpyZWFkPHZhbHVlX3R5cGUsIGVuZGlhbiwgYWxpZ25tZW50PihQdHIpOworICAgIH0KKworICAgIHZvaWQgb3BlcmF0b3I9KHZhbHVlX3R5cGUgTmV3VmFsdWUpIHsKKyAgICAgIGVuZGlhbjo6d3JpdGU8dmFsdWVfdHlwZSwgZW5kaWFuLCBhbGlnbm1lbnQ+KFB0ciwgTmV3VmFsdWUpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHZvaWQgKlB0cjsKKyAgfTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKwordXNpbmcgdWxpdHRsZTE2X3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDx1aW50MTZfdCwgbGl0dGxlLCB1bmFsaWduZWQ+OwordXNpbmcgdWxpdHRsZTMyX3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDx1aW50MzJfdCwgbGl0dGxlLCB1bmFsaWduZWQ+OwordXNpbmcgdWxpdHRsZTY0X3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDx1aW50NjRfdCwgbGl0dGxlLCB1bmFsaWduZWQ+OworCit1c2luZyBsaXR0bGUxNl90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8aW50MTZfdCwgbGl0dGxlLCB1bmFsaWduZWQ+OwordXNpbmcgbGl0dGxlMzJfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPGludDMyX3QsIGxpdHRsZSwgdW5hbGlnbmVkPjsKK3VzaW5nIGxpdHRsZTY0X3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDxpbnQ2NF90LCBsaXR0bGUsIHVuYWxpZ25lZD47CisKK3VzaW5nIGFsaWduZWRfdWxpdHRsZTE2X3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDx1aW50MTZfdCwgbGl0dGxlLCBhbGlnbmVkPjsKK3VzaW5nIGFsaWduZWRfdWxpdHRsZTMyX3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDx1aW50MzJfdCwgbGl0dGxlLCBhbGlnbmVkPjsKK3VzaW5nIGFsaWduZWRfdWxpdHRsZTY0X3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDx1aW50NjRfdCwgbGl0dGxlLCBhbGlnbmVkPjsKKwordXNpbmcgYWxpZ25lZF9saXR0bGUxNl90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8aW50MTZfdCwgbGl0dGxlLCBhbGlnbmVkPjsKK3VzaW5nIGFsaWduZWRfbGl0dGxlMzJfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPGludDMyX3QsIGxpdHRsZSwgYWxpZ25lZD47Cit1c2luZyBhbGlnbmVkX2xpdHRsZTY0X3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDxpbnQ2NF90LCBsaXR0bGUsIGFsaWduZWQ+OworCit1c2luZyB1YmlnMTZfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPHVpbnQxNl90LCBiaWcsIHVuYWxpZ25lZD47Cit1c2luZyB1YmlnMzJfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPHVpbnQzMl90LCBiaWcsIHVuYWxpZ25lZD47Cit1c2luZyB1YmlnNjRfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPHVpbnQ2NF90LCBiaWcsIHVuYWxpZ25lZD47CisKK3VzaW5nIGJpZzE2X3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDxpbnQxNl90LCBiaWcsIHVuYWxpZ25lZD47Cit1c2luZyBiaWczMl90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8aW50MzJfdCwgYmlnLCB1bmFsaWduZWQ+OwordXNpbmcgYmlnNjRfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPGludDY0X3QsIGJpZywgdW5hbGlnbmVkPjsKKwordXNpbmcgYWxpZ25lZF91YmlnMTZfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPHVpbnQxNl90LCBiaWcsIGFsaWduZWQ+OwordXNpbmcgYWxpZ25lZF91YmlnMzJfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPHVpbnQzMl90LCBiaWcsIGFsaWduZWQ+OwordXNpbmcgYWxpZ25lZF91YmlnNjRfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPHVpbnQ2NF90LCBiaWcsIGFsaWduZWQ+OworCit1c2luZyBhbGlnbmVkX2JpZzE2X3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDxpbnQxNl90LCBiaWcsIGFsaWduZWQ+OwordXNpbmcgYWxpZ25lZF9iaWczMl90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8aW50MzJfdCwgYmlnLCBhbGlnbmVkPjsKK3VzaW5nIGFsaWduZWRfYmlnNjRfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPGludDY0X3QsIGJpZywgYWxpZ25lZD47CisKK3VzaW5nIHVuYWxpZ25lZF91aW50MTZfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPHVpbnQxNl90LCBuYXRpdmUsIHVuYWxpZ25lZD47Cit1c2luZyB1bmFsaWduZWRfdWludDMyX3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDx1aW50MzJfdCwgbmF0aXZlLCB1bmFsaWduZWQ+OwordXNpbmcgdW5hbGlnbmVkX3VpbnQ2NF90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8dWludDY0X3QsIG5hdGl2ZSwgdW5hbGlnbmVkPjsKKwordXNpbmcgdW5hbGlnbmVkX2ludDE2X3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDxpbnQxNl90LCBuYXRpdmUsIHVuYWxpZ25lZD47Cit1c2luZyB1bmFsaWduZWRfaW50MzJfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPGludDMyX3QsIG5hdGl2ZSwgdW5hbGlnbmVkPjsKK3VzaW5nIHVuYWxpZ25lZF9pbnQ2NF90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8aW50NjRfdCwgbmF0aXZlLCB1bmFsaWduZWQ+OworCituYW1lc3BhY2UgZW5kaWFuIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGlubGluZSBUIHJlYWQoY29uc3Qgdm9pZCAqUCwgZW5kaWFubmVzcyBFKSB7CisgIHJldHVybiByZWFkPFQsIHVuYWxpZ25lZD4oUCwgRSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBlbmRpYW5uZXNzIEU+IGlubGluZSBUIHJlYWQoY29uc3Qgdm9pZCAqUCkgeworICByZXR1cm4gKihjb25zdCBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8VCwgRSwgdW5hbGlnbmVkPiAqKVA7Cit9CisKK2lubGluZSB1aW50MTZfdCByZWFkMTYoY29uc3Qgdm9pZCAqUCwgZW5kaWFubmVzcyBFKSB7CisgIHJldHVybiByZWFkPHVpbnQxNl90PihQLCBFKTsKK30KK2lubGluZSB1aW50MzJfdCByZWFkMzIoY29uc3Qgdm9pZCAqUCwgZW5kaWFubmVzcyBFKSB7CisgIHJldHVybiByZWFkPHVpbnQzMl90PihQLCBFKTsKK30KK2lubGluZSB1aW50NjRfdCByZWFkNjQoY29uc3Qgdm9pZCAqUCwgZW5kaWFubmVzcyBFKSB7CisgIHJldHVybiByZWFkPHVpbnQ2NF90PihQLCBFKTsKK30KKwordGVtcGxhdGUgPGVuZGlhbm5lc3MgRT4gaW5saW5lIHVpbnQxNl90IHJlYWQxNihjb25zdCB2b2lkICpQKSB7CisgIHJldHVybiByZWFkPHVpbnQxNl90LCBFPihQKTsKK30KK3RlbXBsYXRlIDxlbmRpYW5uZXNzIEU+IGlubGluZSB1aW50MzJfdCByZWFkMzIoY29uc3Qgdm9pZCAqUCkgeworICByZXR1cm4gcmVhZDx1aW50MzJfdCwgRT4oUCk7Cit9Cit0ZW1wbGF0ZSA8ZW5kaWFubmVzcyBFPiBpbmxpbmUgdWludDY0X3QgcmVhZDY0KGNvbnN0IHZvaWQgKlApIHsKKyAgcmV0dXJuIHJlYWQ8dWludDY0X3QsIEU+KFApOworfQorCitpbmxpbmUgdWludDE2X3QgcmVhZDE2bGUoY29uc3Qgdm9pZCAqUCkgeyByZXR1cm4gcmVhZDE2PGxpdHRsZT4oUCk7IH0KK2lubGluZSB1aW50MzJfdCByZWFkMzJsZShjb25zdCB2b2lkICpQKSB7IHJldHVybiByZWFkMzI8bGl0dGxlPihQKTsgfQoraW5saW5lIHVpbnQ2NF90IHJlYWQ2NGxlKGNvbnN0IHZvaWQgKlApIHsgcmV0dXJuIHJlYWQ2NDxsaXR0bGU+KFApOyB9CitpbmxpbmUgdWludDE2X3QgcmVhZDE2YmUoY29uc3Qgdm9pZCAqUCkgeyByZXR1cm4gcmVhZDE2PGJpZz4oUCk7IH0KK2lubGluZSB1aW50MzJfdCByZWFkMzJiZShjb25zdCB2b2lkICpQKSB7IHJldHVybiByZWFkMzI8YmlnPihQKTsgfQoraW5saW5lIHVpbnQ2NF90IHJlYWQ2NGJlKGNvbnN0IHZvaWQgKlApIHsgcmV0dXJuIHJlYWQ2NDxiaWc+KFApOyB9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBpbmxpbmUgdm9pZCB3cml0ZSh2b2lkICpQLCBUIFYsIGVuZGlhbm5lc3MgRSkgeworICB3cml0ZTxULCB1bmFsaWduZWQ+KFAsIFYsIEUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgZW5kaWFubmVzcyBFPiBpbmxpbmUgdm9pZCB3cml0ZSh2b2lkICpQLCBUIFYpIHsKKyAgKihkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8VCwgRSwgdW5hbGlnbmVkPiAqKVAgPSBWOworfQorCitpbmxpbmUgdm9pZCB3cml0ZTE2KHZvaWQgKlAsIHVpbnQxNl90IFYsIGVuZGlhbm5lc3MgRSkgeworICB3cml0ZTx1aW50MTZfdD4oUCwgViwgRSk7Cit9CitpbmxpbmUgdm9pZCB3cml0ZTMyKHZvaWQgKlAsIHVpbnQzMl90IFYsIGVuZGlhbm5lc3MgRSkgeworICB3cml0ZTx1aW50MzJfdD4oUCwgViwgRSk7Cit9CitpbmxpbmUgdm9pZCB3cml0ZTY0KHZvaWQgKlAsIHVpbnQ2NF90IFYsIGVuZGlhbm5lc3MgRSkgeworICB3cml0ZTx1aW50NjRfdD4oUCwgViwgRSk7Cit9CisKK3RlbXBsYXRlIDxlbmRpYW5uZXNzIEU+IGlubGluZSB2b2lkIHdyaXRlMTYodm9pZCAqUCwgdWludDE2X3QgVikgeworICB3cml0ZTx1aW50MTZfdCwgRT4oUCwgVik7Cit9Cit0ZW1wbGF0ZSA8ZW5kaWFubmVzcyBFPiBpbmxpbmUgdm9pZCB3cml0ZTMyKHZvaWQgKlAsIHVpbnQzMl90IFYpIHsKKyAgd3JpdGU8dWludDMyX3QsIEU+KFAsIFYpOworfQordGVtcGxhdGUgPGVuZGlhbm5lc3MgRT4gaW5saW5lIHZvaWQgd3JpdGU2NCh2b2lkICpQLCB1aW50NjRfdCBWKSB7CisgIHdyaXRlPHVpbnQ2NF90LCBFPihQLCBWKTsKK30KKworaW5saW5lIHZvaWQgd3JpdGUxNmxlKHZvaWQgKlAsIHVpbnQxNl90IFYpIHsgd3JpdGUxNjxsaXR0bGU+KFAsIFYpOyB9CitpbmxpbmUgdm9pZCB3cml0ZTMybGUodm9pZCAqUCwgdWludDMyX3QgVikgeyB3cml0ZTMyPGxpdHRsZT4oUCwgVik7IH0KK2lubGluZSB2b2lkIHdyaXRlNjRsZSh2b2lkICpQLCB1aW50NjRfdCBWKSB7IHdyaXRlNjQ8bGl0dGxlPihQLCBWKTsgfQoraW5saW5lIHZvaWQgd3JpdGUxNmJlKHZvaWQgKlAsIHVpbnQxNl90IFYpIHsgd3JpdGUxNjxiaWc+KFAsIFYpOyB9CitpbmxpbmUgdm9pZCB3cml0ZTMyYmUodm9pZCAqUCwgdWludDMyX3QgVikgeyB3cml0ZTMyPGJpZz4oUCwgVik7IH0KK2lubGluZSB2b2lkIHdyaXRlNjRiZSh2b2lkICpQLCB1aW50NjRfdCBWKSB7IHdyaXRlNjQ8YmlnPihQLCBWKTsgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgZW5kaWFuCisKK30gLy8gZW5kIG5hbWVzcGFjZSBzdXBwb3J0Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0VORElBTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRW5kaWFuU3RyZWFtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRW5kaWFuU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlY2Q0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FbmRpYW5TdHJlYW0uaApAQCAtMCwwICsxLDY5IEBACisvLz09PS0gRW5kaWFuU3RyZWFtLmggLSBTdHJlYW0gb3BzIHdpdGggZW5kaWFuIHNwZWNpZmljIGRhdGEgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHV0aWxpdGllcyBmb3Igb3BlcmF0aW5nIG9uIHN0cmVhbXMgdGhhdCBoYXZlIGVuZGlhbgorLy8gc3BlY2lmaWMgZGF0YS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9FTkRJQU5TVFJFQU1fSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfRU5ESUFOU1RSRUFNX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugc3VwcG9ydCB7CisKK25hbWVzcGFjZSBlbmRpYW4geworLy8vIEFkYXB0ZXIgdG8gd3JpdGUgdmFsdWVzIHRvIGEgc3RyZWFtIGluIGEgcGFydGljdWxhciBieXRlIG9yZGVyLgordGVtcGxhdGUgPGVuZGlhbm5lc3MgZW5kaWFuPiBzdHJ1Y3QgV3JpdGVyIHsKKyAgcmF3X29zdHJlYW0gJk9TOworICBXcml0ZXIocmF3X29zdHJlYW0gJk9TKSA6IE9TKE9TKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgdmFsdWVfdHlwZT4gdm9pZCB3cml0ZShBcnJheVJlZjx2YWx1ZV90eXBlPiBWYWxzKSB7CisgICAgZm9yICh2YWx1ZV90eXBlIFYgOiBWYWxzKQorICAgICAgd3JpdGUoVik7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHZhbHVlX3R5cGU+IHZvaWQgd3JpdGUodmFsdWVfdHlwZSBWYWwpIHsKKyAgICBWYWwgPSBieXRlX3N3YXA8dmFsdWVfdHlwZSwgZW5kaWFuPihWYWwpOworICAgIE9TLndyaXRlKChjb25zdCBjaGFyICopJlZhbCwgc2l6ZW9mKHZhbHVlX3R5cGUpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBXcml0ZXI8bGl0dGxlPjo6d3JpdGU8ZmxvYXQ+KGZsb2F0IFZhbCkgeworICB3cml0ZShGbG9hdFRvQml0cyhWYWwpKTsKK30KKwordGVtcGxhdGUgPD4KK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBXcml0ZXI8bGl0dGxlPjo6d3JpdGU8ZG91YmxlPihkb3VibGUgVmFsKSB7CisgIHdyaXRlKERvdWJsZVRvQml0cyhWYWwpKTsKK30KKwordGVtcGxhdGUgPD4KK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBXcml0ZXI8YmlnPjo6d3JpdGU8ZmxvYXQ+KGZsb2F0IFZhbCkgeworICB3cml0ZShGbG9hdFRvQml0cyhWYWwpKTsKK30KKwordGVtcGxhdGUgPD4KK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBXcml0ZXI8YmlnPjo6d3JpdGU8ZG91YmxlPihkb3VibGUgVmFsKSB7CisgIHdyaXRlKERvdWJsZVRvQml0cyhWYWwpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGVuZGlhbgorCit9IC8vIGVuZCBuYW1lc3BhY2Ugc3VwcG9ydAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRXJyYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0VycmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGJmZTJhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0VycmMuaApAQCAtMCwwICsxLDg2IEBACisvLz09PS0gbGx2bS9TdXBwb3J0L0VycmMuaCAtIERlZmluZXMgdGhlIGxsdm06OmVycmMgZW51bSAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFdoaWxlIHN0ZDo6ZXJyb3JfY29kZSB3b3JrcyBPSyBvbiBhbGwgcGxhdGZvcm1zIHdlIHVzZSwgdGhlcmUgYXJlIHNvbWUKKy8vIHNvbWUgcHJvYmxlbXMgd2l0aCBzdGQ6OmVycmMgdGhhdCBjYW4gYmUgYXZvaWRlZCBieSB1c2luZyBvdXIgb3duCisvLyBlbnVtZXJhdGlvbjoKKy8vCisvLyAqIHN0ZDo6ZXJyYyBpcyBhIG5hbWVzcGFjZSBpbiBzb21lIGltcGxlbWVudGF0aW9ucy4gVGhhdCBtZWFzIHRoYXQgQURMCisvLyAgIGRvZXNuJ3Qgd29yayBhbmQgaXQgaXMgc29tZXRpbWVzIG5lY2Vzc2FyeSB0byB3cml0ZSBzdGQ6Om1ha2VfZXJyb3JfY29kZQorLy8gICBvciBpbiB0ZW1wbGF0ZXM6CisvLyAgIHVzaW5nIHN0ZDo6bWFrZV9lcnJvcl9jb2RlOworLy8gICBtYWtlX2Vycm9yX2NvZGUoLi4uKTsKKy8vCisvLyAgIHdpdGggdGhpcyBlbnVtIGl0IGlzIHNhZmUgdG8gYWx3YXlzIGp1c3QgdXNlIG1ha2VfZXJyb3JfY29kZS4KKy8vCisvLyAqIFNvbWUgaW1wbGVtZW50YXRpb25zIGRlZmluZSBmZXdlciBuYW1lcyB0aGFuIG90aGVycy4gVGhpcyBoZWFkZXIgaGFzCisvLyAgIHRoZSBpbnRlcnNlY3Rpb24gb2YgYWxsIHRoZSBvbmVzIHdlIHN1cHBvcnQuCisvLworLy8gKiBzdGQ6OmVycmMgaXMganVzdCBtYXJrZWQgd2l0aCBpc19lcnJvcl9jb25kaXRpb25fZW51bS4gVGhpcyBtZWFucyB0aGF0CisvLyAgIGNvbW1vbiBwYXR0ZXJzIGxpa2UgQW5FcnJvckNvZGUgPT0gZXJyYzo6bm9fc3VjaF9maWxlX29yX2RpcmVjdG9yeSB0YWtlCisvLyAgIDQgdmlydHVhbCBjYWxscyBpbnN0ZWFkIG9mIHR3byBjb21wYXJpc29ucy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0VSUkNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfRVJSQ19ICisKKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK2VudW0gY2xhc3MgZXJyYyB7CisgIGFyZ3VtZW50X2xpc3RfdG9vX2xvbmcgPSBpbnQoc3RkOjplcnJjOjphcmd1bWVudF9saXN0X3Rvb19sb25nKSwKKyAgYXJndW1lbnRfb3V0X29mX2RvbWFpbiA9IGludChzdGQ6OmVycmM6OmFyZ3VtZW50X291dF9vZl9kb21haW4pLAorICBiYWRfYWRkcmVzcyA9IGludChzdGQ6OmVycmM6OmJhZF9hZGRyZXNzKSwKKyAgYmFkX2ZpbGVfZGVzY3JpcHRvciA9IGludChzdGQ6OmVycmM6OmJhZF9maWxlX2Rlc2NyaXB0b3IpLAorICBicm9rZW5fcGlwZSA9IGludChzdGQ6OmVycmM6OmJyb2tlbl9waXBlKSwKKyAgZGV2aWNlX29yX3Jlc291cmNlX2J1c3kgPSBpbnQoc3RkOjplcnJjOjpkZXZpY2Vfb3JfcmVzb3VyY2VfYnVzeSksCisgIGRpcmVjdG9yeV9ub3RfZW1wdHkgPSBpbnQoc3RkOjplcnJjOjpkaXJlY3Rvcnlfbm90X2VtcHR5KSwKKyAgZXhlY3V0YWJsZV9mb3JtYXRfZXJyb3IgPSBpbnQoc3RkOjplcnJjOjpleGVjdXRhYmxlX2Zvcm1hdF9lcnJvciksCisgIGZpbGVfZXhpc3RzID0gaW50KHN0ZDo6ZXJyYzo6ZmlsZV9leGlzdHMpLAorICBmaWxlX3Rvb19sYXJnZSA9IGludChzdGQ6OmVycmM6OmZpbGVfdG9vX2xhcmdlKSwKKyAgZmlsZW5hbWVfdG9vX2xvbmcgPSBpbnQoc3RkOjplcnJjOjpmaWxlbmFtZV90b29fbG9uZyksCisgIGZ1bmN0aW9uX25vdF9zdXBwb3J0ZWQgPSBpbnQoc3RkOjplcnJjOjpmdW5jdGlvbl9ub3Rfc3VwcG9ydGVkKSwKKyAgaWxsZWdhbF9ieXRlX3NlcXVlbmNlID0gaW50KHN0ZDo6ZXJyYzo6aWxsZWdhbF9ieXRlX3NlcXVlbmNlKSwKKyAgaW5hcHByb3ByaWF0ZV9pb19jb250cm9sX29wZXJhdGlvbiA9CisgICAgICBpbnQoc3RkOjplcnJjOjppbmFwcHJvcHJpYXRlX2lvX2NvbnRyb2xfb3BlcmF0aW9uKSwKKyAgaW50ZXJydXB0ZWQgPSBpbnQoc3RkOjplcnJjOjppbnRlcnJ1cHRlZCksCisgIGludmFsaWRfYXJndW1lbnQgPSBpbnQoc3RkOjplcnJjOjppbnZhbGlkX2FyZ3VtZW50KSwKKyAgaW52YWxpZF9zZWVrID0gaW50KHN0ZDo6ZXJyYzo6aW52YWxpZF9zZWVrKSwKKyAgaW9fZXJyb3IgPSBpbnQoc3RkOjplcnJjOjppb19lcnJvciksCisgIGlzX2FfZGlyZWN0b3J5ID0gaW50KHN0ZDo6ZXJyYzo6aXNfYV9kaXJlY3RvcnkpLAorICBub19jaGlsZF9wcm9jZXNzID0gaW50KHN0ZDo6ZXJyYzo6bm9fY2hpbGRfcHJvY2VzcyksCisgIG5vX2xvY2tfYXZhaWxhYmxlID0gaW50KHN0ZDo6ZXJyYzo6bm9fbG9ja19hdmFpbGFibGUpLAorICBub19zcGFjZV9vbl9kZXZpY2UgPSBpbnQoc3RkOjplcnJjOjpub19zcGFjZV9vbl9kZXZpY2UpLAorICBub19zdWNoX2RldmljZV9vcl9hZGRyZXNzID0gaW50KHN0ZDo6ZXJyYzo6bm9fc3VjaF9kZXZpY2Vfb3JfYWRkcmVzcyksCisgIG5vX3N1Y2hfZGV2aWNlID0gaW50KHN0ZDo6ZXJyYzo6bm9fc3VjaF9kZXZpY2UpLAorICBub19zdWNoX2ZpbGVfb3JfZGlyZWN0b3J5ID0gaW50KHN0ZDo6ZXJyYzo6bm9fc3VjaF9maWxlX29yX2RpcmVjdG9yeSksCisgIG5vX3N1Y2hfcHJvY2VzcyA9IGludChzdGQ6OmVycmM6Om5vX3N1Y2hfcHJvY2VzcyksCisgIG5vdF9hX2RpcmVjdG9yeSA9IGludChzdGQ6OmVycmM6Om5vdF9hX2RpcmVjdG9yeSksCisgIG5vdF9lbm91Z2hfbWVtb3J5ID0gaW50KHN0ZDo6ZXJyYzo6bm90X2Vub3VnaF9tZW1vcnkpLAorICBvcGVyYXRpb25fbm90X3Blcm1pdHRlZCA9IGludChzdGQ6OmVycmM6Om9wZXJhdGlvbl9ub3RfcGVybWl0dGVkKSwKKyAgcGVybWlzc2lvbl9kZW5pZWQgPSBpbnQoc3RkOjplcnJjOjpwZXJtaXNzaW9uX2RlbmllZCksCisgIHJlYWRfb25seV9maWxlX3N5c3RlbSA9IGludChzdGQ6OmVycmM6OnJlYWRfb25seV9maWxlX3N5c3RlbSksCisgIHJlc291cmNlX2RlYWRsb2NrX3dvdWxkX29jY3VyID0gaW50KHN0ZDo6ZXJyYzo6cmVzb3VyY2VfZGVhZGxvY2tfd291bGRfb2NjdXIpLAorICByZXNvdXJjZV91bmF2YWlsYWJsZV90cnlfYWdhaW4gPQorICAgICAgaW50KHN0ZDo6ZXJyYzo6cmVzb3VyY2VfdW5hdmFpbGFibGVfdHJ5X2FnYWluKSwKKyAgcmVzdWx0X291dF9vZl9yYW5nZSA9IGludChzdGQ6OmVycmM6OnJlc3VsdF9vdXRfb2ZfcmFuZ2UpLAorICB0b29fbWFueV9maWxlc19vcGVuX2luX3N5c3RlbSA9IGludChzdGQ6OmVycmM6OnRvb19tYW55X2ZpbGVzX29wZW5faW5fc3lzdGVtKSwKKyAgdG9vX21hbnlfZmlsZXNfb3BlbiA9IGludChzdGQ6OmVycmM6OnRvb19tYW55X2ZpbGVzX29wZW4pLAorICB0b29fbWFueV9saW5rcyA9IGludChzdGQ6OmVycmM6OnRvb19tYW55X2xpbmtzKQorfTsKKworaW5saW5lIHN0ZDo6ZXJyb3JfY29kZSBtYWtlX2Vycm9yX2NvZGUoZXJyYyBFKSB7CisgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoc3RhdGljX2Nhc3Q8aW50PihFKSwgc3RkOjpnZW5lcmljX2NhdGVnb3J5KCkpOworfQorfQorCituYW1lc3BhY2Ugc3RkIHsKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc19lcnJvcl9jb2RlX2VudW08bGx2bTo6ZXJyYz4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Vycm5vLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRXJybm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWRjMWVhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Vycm5vLmgKQEAgLTAsMCArMSw0NiBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9FcnJuby5oIC0gUG9ydGFibGUrY29udmVuaWVudCBlcnJubyBoYW5kbGluZyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHNvbWUgcG9ydGFibGUgYW5kIGNvbnZlbmllbnQgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBlcnJuby4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9FUlJOT19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9FUlJOT19ICisKKyNpbmNsdWRlIDxjZXJybm8+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugc3lzIHsKKworLy8vIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm5vIHZhbHVlLCB1c2luZyB3aGF0ZXZlcgorLy8vIHRocmVhZC1zYWZlIHZhcmlhbnQgb2Ygc3RyZXJyb3IoKSBpcyBhdmFpbGFibGUuICBCZSBzdXJlIHRvIGNhbGwgdGhpcworLy8vIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmdW5jdGlvbiB0aGF0IHNldCBlcnJubywgb3IgZXJybm8gbWF5IGhhdmUgYmVlbgorLy8vIG92ZXJ3cml0dGVuIGJ5IGFuIGludGVydmVuaW5nIGNhbGwuCitzdGQ6OnN0cmluZyBTdHJFcnJvcigpOworCisvLy8gTGlrZSB0aGUgbm8tYXJndW1lbnQgdmVyc2lvbiBhYm92ZSwgYnV0IHVzZXMgXHAgZXJybnVtIGluc3RlYWQgb2YgZXJybm8uCitzdGQ6OnN0cmluZyBTdHJFcnJvcihpbnQgZXJybnVtKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZhaWxULCB0eXBlbmFtZSBGdW4sIHR5cGVuYW1lLi4uIEFyZ3M+CitpbmxpbmUgYXV0byBSZXRyeUFmdGVyU2lnbmFsKGNvbnN0IEZhaWxUICZGYWlsLCBjb25zdCBGdW4gJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZ3MgJi4uLiBBcykgLT4gZGVjbHR5cGUoRihBcy4uLikpIHsKKyAgZGVjbHR5cGUoRihBcy4uLikpIFJlczsKKyAgZG8KKyAgICBSZXMgPSBGKEFzLi4uKTsKKyAgd2hpbGUgKFJlcyA9PSBGYWlsICYmIGVycm5vID09IEVJTlRSKTsKKyAgcmV0dXJuIFJlczsKK30KKworfSAgLy8gbmFtZXNwYWNlIHN5cworfSAgLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmICAvLyBMTFZNX1NZU1RFTV9FUlJOT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRXJyb3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MjdmODkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRXJyb3IuaApAQCAtMCwwICsxLDExNjcgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvRXJyb3IuaCAtIFJlY292ZXJhYmxlIGVycm9yIGhhbmRsaW5nIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYW4gQVBJIHVzZWQgdG8gcmVwb3J0IHJlY292ZXJhYmxlIGVycm9ycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9FUlJPUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9FUlJPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9Db25maWcvYWJpLWJyZWFraW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsaWduT2YuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvck9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEVycm9yU3VjY2VzczsKKworLy8vIEJhc2UgY2xhc3MgZm9yIGVycm9yIGluZm8gY2xhc3Nlcy4gRG8gbm90IGV4dGVuZCB0aGlzIGRpcmVjdGx5OiBFeHRlbmQKKy8vLyB0aGUgRXJyb3JJbmZvIHRlbXBsYXRlIHN1YmNsYXNzIGluc3RlYWQuCitjbGFzcyBFcnJvckluZm9CYXNlIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+RXJyb3JJbmZvQmFzZSgpID0gZGVmYXVsdDsKKworICAvLy8gUHJpbnQgYW4gZXJyb3IgbWVzc2FnZSB0byBhbiBvdXRwdXQgc3RyZWFtLgorICB2aXJ0dWFsIHZvaWQgbG9nKHJhd19vc3RyZWFtICZPUykgY29uc3QgPSAwOworCisgIC8vLyBSZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2UgYXMgYSBzdHJpbmcuCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgbWVzc2FnZSgpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyBNc2c7CisgICAgcmF3X3N0cmluZ19vc3RyZWFtIE9TKE1zZyk7CisgICAgbG9nKE9TKTsKKyAgICByZXR1cm4gT1Muc3RyKCk7CisgIH0KKworICAvLy8gQ29udmVydCB0aGlzIGVycm9yIHRvIGEgc3RkOjplcnJvcl9jb2RlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYSB0ZW1wb3JhcnkgY3J1dGNoIHRvIGVuYWJsZSBpbnRlcmFjdGlvbiB3aXRoIGNvZGUgc3RpbGwKKyAgLy8vIHVzaW5nIHN0ZDo6ZXJyb3JfY29kZS4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCisgIHZpcnR1YWwgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0ID0gMDsKKworICAvLyBSZXR1cm5zIHRoZSBjbGFzcyBJRCBmb3IgdGhpcyB0eXBlLgorICBzdGF0aWMgY29uc3Qgdm9pZCAqY2xhc3NJRCgpIHsgcmV0dXJuICZJRDsgfQorCisgIC8vIFJldHVybnMgdGhlIGNsYXNzIElEIGZvciB0aGUgZHluYW1pYyB0eXBlIG9mIHRoaXMgRXJyb3JJbmZvQmFzZSBpbnN0YW5jZS4KKyAgdmlydHVhbCBjb25zdCB2b2lkICpkeW5hbWljQ2xhc3NJRCgpIGNvbnN0ID0gMDsKKworICAvLyBDaGVjayB3aGV0aGVyIHRoaXMgaW5zdGFuY2UgaXMgYSBzdWJjbGFzcyBvZiB0aGUgY2xhc3MgaWRlbnRpZmllZCBieQorICAvLyBDbGFzc0lELgorICB2aXJ0dWFsIGJvb2wgaXNBKGNvbnN0IHZvaWQgKmNvbnN0IENsYXNzSUQpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2xhc3NJRCA9PSBjbGFzc0lEKCk7CisgIH0KKworICAvLyBDaGVjayB3aGV0aGVyIHRoaXMgaW5zdGFuY2UgaXMgYSBzdWJjbGFzcyBvZiBFcnJvckluZm9ULgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRXJyb3JJbmZvVD4gYm9vbCBpc0EoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQShFcnJvckluZm9UOjpjbGFzc0lEKCkpOworICB9CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworICBzdGF0aWMgY2hhciBJRDsKK307CisKKy8vLyBMaWdodHdlaWdodCBlcnJvciBjbGFzcyB3aXRoIGVycm9yIGNvbnRleHQgYW5kIG1hbmRhdG9yeSBjaGVja2luZy4KKy8vLworLy8vIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHdyYXAgYSBFcnJvckluZm9CYXNlIHBvaW50ZXIuIEZhaWx1cmUgc3RhdGVzCisvLy8gYXJlIHJlcHJlc2VudGVkIGJ5IHNldHRpbmcgdGhlIHBvaW50ZXIgdG8gYSBFcnJvckluZm9CYXNlIHN1YmNsYXNzCisvLy8gaW5zdGFuY2UgY29udGFpbmluZyBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBmYWlsdXJlLiBTdWNjZXNzIGlzCisvLy8gcmVwcmVzZW50ZWQgYnkgYSBudWxsIHBvaW50ZXIgdmFsdWUuCisvLy8KKy8vLyBJbnN0YW5jZXMgb2YgRXJyb3IgYWxzbyBjb250YWlucyBhICdDaGVja2VkJyBmbGFnLCB3aGljaCBtdXN0IGJlIHNldAorLy8vIGJlZm9yZSB0aGUgZGVzdHJ1Y3RvciBpcyBjYWxsZWQsIG90aGVyd2lzZSB0aGUgZGVzdHJ1Y3RvciB3aWxsIHRyaWdnZXIgYQorLy8vIHJ1bnRpbWUgZXJyb3IuIFRoaXMgZW5mb3JjZXMgYXQgcnVudGltZSB0aGUgcmVxdWlyZW1lbnQgdGhhdCBhbGwgRXJyb3IKKy8vLyBpbnN0YW5jZXMgYmUgY2hlY2tlZCBvciByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorLy8vCisvLy8gVGhlcmUgYXJlIHR3byB3YXlzIHRvIHNldCB0aGUgY2hlY2tlZCBmbGFnLCBkZXBlbmRpbmcgb24gd2hhdCBzdGF0ZSB0aGUKKy8vLyBFcnJvciBpbnN0YW5jZSBpcyBpbi4gRm9yIEVycm9yIGluc3RhbmNlcyBpbmRpY2F0aW5nIHN1Y2Nlc3MsIGl0CisvLy8gaXMgc3VmZmljaWVudCB0byBpbnZva2UgdGhlIGJvb2xlYW4gY29udmVyc2lvbiBvcGVyYXRvci4gRS5nLjoKKy8vLworLy8vICAgQGNvZGV7LmNwcH0KKy8vLyAgIEVycm9yIGZvbyg8Li4uPik7CisvLy8KKy8vLyAgIGlmIChhdXRvIEUgPSBmb28oPC4uLj4pKQorLy8vICAgICByZXR1cm4gRTsgLy8gPC0gUmV0dXJuIEUgaWYgaXQgaXMgaW4gdGhlIGVycm9yIHN0YXRlLgorLy8vICAgLy8gV2UgaGF2ZSB2ZXJpZmllZCB0aGF0IEUgd2FzIGluIHRoZSBzdWNjZXNzIHN0YXRlLiBJdCBjYW4gbm93IGJlIHNhZmVseQorLy8vICAgLy8gZGVzdHJveWVkLgorLy8vICAgQGVuZGNvZGUKKy8vLworLy8vIEEgc3VjY2VzcyB2YWx1ZSAqY2FuIG5vdCogYmUgZHJvcHBlZC4gRm9yIGV4YW1wbGUsIGp1c3QgY2FsbGluZyAnZm9vKDwuLi4+KScKKy8vLyB3aXRob3V0IHRlc3RpbmcgdGhlIHJldHVybiB2YWx1ZSB3aWxsIHJhaXNlIGEgcnVudGltZSBlcnJvciwgZXZlbiBpZiBmb28KKy8vLyByZXR1cm5zIHN1Y2Nlc3MuCisvLy8KKy8vLyBGb3IgRXJyb3IgaW5zdGFuY2VzIHJlcHJlc2VudGluZyBmYWlsdXJlLCB5b3UgbXVzdCB1c2UgZWl0aGVyIHRoZQorLy8vIGhhbmRsZUVycm9ycyBvciBoYW5kbGVBbGxFcnJvcnMgZnVuY3Rpb24gd2l0aCBhIHR5cGVkIGhhbmRsZXIuIEUuZy46CisvLy8KKy8vLyAgIEBjb2Rley5jcHB9CisvLy8gICBjbGFzcyBNeUVycm9ySW5mbyA6IHB1YmxpYyBFcnJvckluZm88TXlFcnJvckluZm8+IHsKKy8vLyAgICAgLy8gQ3VzdG9tIGVycm9yIGluZm8uCisvLy8gICB9OworLy8vCisvLy8gICBFcnJvciBmb28oPC4uLj4pIHsgcmV0dXJuIG1ha2VfZXJyb3I8TXlFcnJvckluZm8+KC4uLik7IH0KKy8vLworLy8vICAgYXV0byBFID0gZm9vKDwuLi4+KTsgLy8gPC0gZm9vIHJldHVybnMgZmFpbHVyZSB3aXRoIE15RXJyb3JJbmZvLgorLy8vICAgYXV0byBOZXdFID0KKy8vLyAgICAgaGFuZGxlRXJyb3JzKEUsCisvLy8gICAgICAgW10oY29uc3QgTXlFcnJvckluZm8gJk0pIHsKKy8vLyAgICAgICAgIC8vIERlYWwgd2l0aCB0aGUgZXJyb3IuCisvLy8gICAgICAgfSwKKy8vLyAgICAgICBbXShzdGQ6OnVuaXF1ZV9wdHI8T3RoZXJFcnJvcj4gTSkgLT4gRXJyb3IgeworLy8vICAgICAgICAgaWYgKGNhbkhhbmRsZSgqTSkpIHsKKy8vLyAgICAgICAgICAgLy8gaGFuZGxlIGVycm9yLgorLy8vICAgICAgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKy8vLyAgICAgICAgIH0KKy8vLyAgICAgICAgIC8vIENvdWxkbid0IGhhbmRsZSB0aGlzIGVycm9yIGluc3RhbmNlLiBQYXNzIGl0IHVwIHRoZSBzdGFjay4KKy8vLyAgICAgICAgIHJldHVybiBFcnJvcihzdGQ6Om1vdmUoTSkpOworLy8vICAgICAgICk7CisvLy8gICAvLyBOb3RlIC0gd2UgbXVzdCBjaGVjayBvciByZXR1cm4gTmV3RSBpbiBjYXNlIGFueSBvZiB0aGUgaGFuZGxlcnMKKy8vLyAgIC8vIHJldHVybmVkIGEgbmV3IGVycm9yLgorLy8vICAgQGVuZGNvZGUKKy8vLworLy8vIFRoZSBoYW5kbGVBbGxFcnJvcnMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIGhhbmRsZUVycm9ycywgZXhjZXB0CisvLy8gdGhhdCBpdCBoYXMgYSB2b2lkIHJldHVybiB0eXBlLCBhbmQgcmVxdWlyZXMgYWxsIGVycm9ycyB0byBiZSBoYW5kbGVkIGFuZAorLy8vIG5vIG5ldyBlcnJvcnMgYmUgcmV0dXJuZWQuIEl0IHByZXZlbnRzIGVycm9ycyAoYXNzdW1pbmcgdGhleSBjYW4gYWxsIGJlCisvLy8gaGFuZGxlZCkgZnJvbSBoYXZpbmcgdG8gYmUgYnViYmxlZCBhbGwgdGhlIHdheSB0byB0aGUgdG9wLWxldmVsLgorLy8vCisvLy8gKkFsbCogRXJyb3IgaW5zdGFuY2VzIG11c3QgYmUgY2hlY2tlZCBiZWZvcmUgZGVzdHJ1Y3Rpb24sIGV2ZW4gaWYKKy8vLyB0aGV5J3JlIG1vdmVkLWFzc2lnbmVkIG9yIGNvbnN0cnVjdGVkIGZyb20gU3VjY2VzcyB2YWx1ZXMgdGhhdCBoYXZlIGFscmVhZHkKKy8vLyBiZWVuIGNoZWNrZWQuIFRoaXMgZW5mb3JjZXMgY2hlY2tpbmcgdGhyb3VnaCBhbGwgbGV2ZWxzIG9mIHRoZSBjYWxsIHN0YWNrLgorY2xhc3MgTExWTV9OT0RJU0NBUkQgRXJyb3IgeworICAvLyBFcnJvckxpc3QgbmVlZHMgdG8gYmUgYWJsZSB0byB5YW5rIEVycm9ySW5mb0Jhc2UgcG9pbnRlcnMgb3V0IG9mIHRoaXMKKyAgLy8gY2xhc3MgdG8gYWRkIHRvIHRoZSBlcnJvciBsaXN0LgorICBmcmllbmQgY2xhc3MgRXJyb3JMaXN0OworCisgIC8vIGhhbmRsZUVycm9ycyBuZWVkcyB0byBiZSBhYmxlIHRvIHNldCB0aGUgQ2hlY2tlZCBmbGFnLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gSGFuZGxlclRzPgorICBmcmllbmQgRXJyb3IgaGFuZGxlRXJyb3JzKEVycm9yIEUsIEhhbmRsZXJUcyAmJi4uLiBIYW5kbGVycyk7CisKKyAgLy8gRXhwZWN0ZWQ8VD4gbmVlZHMgdG8gYmUgYWJsZSB0byBzdGVhbCB0aGUgcGF5bG9hZCB3aGVuIGNvbnN0cnVjdGVkIGZyb20gYW4KKyAgLy8gZXJyb3IuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgRXhwZWN0ZWQ7CisKK3Byb3RlY3RlZDoKKyAgLy8vIENyZWF0ZSBhIHN1Y2Nlc3MgdmFsdWUuIFByZWZlciB1c2luZyAnRXJyb3I6OnN1Y2Nlc3MoKScgZm9yIHJlYWRhYmlsaXR5CisgIEVycm9yKCkgeworICAgIHNldFB0cihudWxscHRyKTsKKyAgICBzZXRDaGVja2VkKGZhbHNlKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBDcmVhdGUgYSBzdWNjZXNzIHZhbHVlLgorICBzdGF0aWMgRXJyb3JTdWNjZXNzIHN1Y2Nlc3MoKTsKKworICAvLyBFcnJvcnMgYXJlIG5vdCBjb3B5LWNvbnN0cnVjdGFibGUuCisgIEVycm9yKGNvbnN0IEVycm9yICZPdGhlcikgPSBkZWxldGU7CisKKyAgLy8vIE1vdmUtY29uc3RydWN0IGFuIGVycm9yIHZhbHVlLiBUaGUgbmV3bHkgY29uc3RydWN0ZWQgZXJyb3IgaXMgY29uc2lkZXJlZAorICAvLy8gdW5jaGVja2VkLCBldmVuIGlmIHRoZSBzb3VyY2UgZXJyb3IgaGFkIGJlZW4gY2hlY2tlZC4gVGhlIG9yaWdpbmFsIGVycm9yCisgIC8vLyBiZWNvbWVzIGEgY2hlY2tlZCBTdWNjZXNzIHZhbHVlLCByZWdhcmRsZXNzIG9mIGl0cyBvcmlnaW5hbCBzdGF0ZS4KKyAgRXJyb3IoRXJyb3IgJiZPdGhlcikgeworICAgIHNldENoZWNrZWQodHJ1ZSk7CisgICAgKnRoaXMgPSBzdGQ6Om1vdmUoT3RoZXIpOworICB9CisKKyAgLy8vIENyZWF0ZSBhbiBlcnJvciB2YWx1ZS4gUHJlZmVyIHVzaW5nIHRoZSAnbWFrZV9lcnJvcicgZnVuY3Rpb24sIGJ1dAorICAvLy8gdGhpcyBjb25zdHJ1Y3RvciBjYW4gYmUgdXNlZnVsIHdoZW4gInJlLXRocm93aW5nIiBlcnJvcnMgZnJvbSBoYW5kbGVycy4KKyAgRXJyb3Ioc3RkOjp1bmlxdWVfcHRyPEVycm9ySW5mb0Jhc2U+IFBheWxvYWQpIHsKKyAgICBzZXRQdHIoUGF5bG9hZC5yZWxlYXNlKCkpOworICAgIHNldENoZWNrZWQoZmFsc2UpOworICB9CisKKyAgLy8gRXJyb3JzIGFyZSBub3QgY29weS1hc3NpZ25hYmxlLgorICBFcnJvciAmb3BlcmF0b3I9KGNvbnN0IEVycm9yICZPdGhlcikgPSBkZWxldGU7CisKKyAgLy8vIE1vdmUtYXNzaWduIGFuIGVycm9yIHZhbHVlLiBUaGUgY3VycmVudCBlcnJvciBtdXN0IHJlcHJlc2VudCBzdWNjZXNzLCB5b3UKKyAgLy8vIHlvdSBjYW5ub3Qgb3ZlcndyaXRlIGFuIHVuaGFuZGxlZCBlcnJvci4gVGhlIGN1cnJlbnQgZXJyb3IgaXMgdGhlbgorICAvLy8gY29uc2lkZXJlZCB1bmNoZWNrZWQuIFRoZSBzb3VyY2UgZXJyb3IgYmVjb21lcyBhIGNoZWNrZWQgc3VjY2VzcyB2YWx1ZSwKKyAgLy8vIHJlZ2FyZGxlc3Mgb2YgaXRzIG9yaWdpbmFsIHN0YXRlLgorICBFcnJvciAmb3BlcmF0b3I9KEVycm9yICYmT3RoZXIpIHsKKyAgICAvLyBEb24ndCBhbGxvdyBvdmVyd3JpdGluZyBvZiB1bmNoZWNrZWQgdmFsdWVzLgorICAgIGFzc2VydElzQ2hlY2tlZCgpOworICAgIHNldFB0cihPdGhlci5nZXRQdHIoKSk7CisKKyAgICAvLyBUaGlzIEVycm9yIGlzIHVuY2hlY2tlZCwgZXZlbiBpZiB0aGUgc291cmNlIGVycm9yIHdhcyBjaGVja2VkLgorICAgIHNldENoZWNrZWQoZmFsc2UpOworCisgICAgLy8gTnVsbCBvdXQgT3RoZXIncyBwYXlsb2FkIGFuZCBzZXQgaXRzIGNoZWNrZWQgYml0LgorICAgIE90aGVyLnNldFB0cihudWxscHRyKTsKKyAgICBPdGhlci5zZXRDaGVja2VkKHRydWUpOworCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIERlc3Ryb3kgYSBFcnJvci4gRmFpbHMgd2l0aCBhIGNhbGwgdG8gYWJvcnQoKSBpZiB0aGUgZXJyb3IgaXMKKyAgLy8vIHVuY2hlY2tlZC4KKyAgfkVycm9yKCkgeworICAgIGFzc2VydElzQ2hlY2tlZCgpOworICAgIGRlbGV0ZSBnZXRQdHIoKTsKKyAgfQorCisgIC8vLyBCb29sIGNvbnZlcnNpb24uIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEVycm9yIGlzIGluIGEgZmFpbHVyZSBzdGF0ZSwKKyAgLy8vIGFuZCBmYWxzZSBpZiBpdCBpcyBpbiBhbiBhY2NlcHQgc3RhdGUuIElmIHRoZSBlcnJvciBpcyBpbiBhIFN1Y2Nlc3Mgc3RhdGUKKyAgLy8vIGl0IHdpbGwgYmUgY29uc2lkZXJlZCBjaGVja2VkLgorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgeworICAgIHNldENoZWNrZWQoZ2V0UHRyKCkgPT0gbnVsbHB0cik7CisgICAgcmV0dXJuIGdldFB0cigpICE9IG51bGxwdHI7CisgIH0KKworICAvLy8gQ2hlY2sgd2hldGhlciBvbmUgZXJyb3IgaXMgYSBzdWJjbGFzcyBvZiBhbm90aGVyLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRXJyVD4gYm9vbCBpc0EoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFB0cigpICYmIGdldFB0cigpLT5pc0EoRXJyVDo6Y2xhc3NJRCgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBkeW5hbWljIGNsYXNzIGlkIG9mIHRoaXMgZXJyb3IsIG9yIG51bGwgaWYgdGhpcyBpcyBhIHN1Y2Nlc3MKKyAgLy8vIHZhbHVlLgorICBjb25zdCB2b2lkKiBkeW5hbWljQ2xhc3NJRCgpIGNvbnN0IHsKKyAgICBpZiAoIWdldFB0cigpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIGdldFB0cigpLT5keW5hbWljQ2xhc3NJRCgpOworICB9CisKK3ByaXZhdGU6CisjaWYgTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUworICAvLyBhc3NlcnRJc0NoZWNrZWQoKSBoYXBwZW5zIHZlcnkgZnJlcXVlbnRseSwgYnV0IHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzCisgIC8vIGlzIHN1cHBvc2VkIHRvIGJlIGEgbm8tb3AuICBTbyB3ZSB3YW50IGl0IHRvIGJlIGlubGluZWQsIGJ1dCBoYXZpbmcgYSBidW5jaAorICAvLyBvZiBkZWJ1ZyBwcmludHMgY2FuIGNhdXNlIHRoZSBmdW5jdGlvbiB0byBiZSB0b28gbGFyZ2UgZm9yIGlubGluaW5nLiAgU28KKyAgLy8gaXQncyBpbXBvcnRhbnQgdGhhdCB3ZSBkZWZpbmUgdGhpcyBmdW5jdGlvbiBvdXQgb2YgbGluZSBzbyB0aGF0IGl0IGNhbid0IGJlCisgIC8vIGlubGluZWQuCisgIExMVk1fQVRUUklCVVRFX05PUkVUVVJOCisgIHZvaWQgZmF0YWxVbmNoZWNrZWRFcnJvcigpIGNvbnN0OworI2VuZGlmCisKKyAgdm9pZCBhc3NlcnRJc0NoZWNrZWQoKSB7CisjaWYgTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUworICAgIGlmIChMTFZNX1VOTElLRUxZKCFnZXRDaGVja2VkKCkgfHwgZ2V0UHRyKCkpKQorICAgICAgZmF0YWxVbmNoZWNrZWRFcnJvcigpOworI2VuZGlmCisgIH0KKworICBFcnJvckluZm9CYXNlICpnZXRQdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXJyb3JJbmZvQmFzZSo+KAorICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihQYXlsb2FkKSAmCisgICAgICAgICAgICAgfnN0YXRpY19jYXN0PHVpbnRwdHJfdD4oMHgxKSk7CisgIH0KKworICB2b2lkIHNldFB0cihFcnJvckluZm9CYXNlICpFSSkgeworI2lmIExMVk1fRU5BQkxFX0FCSV9CUkVBS0lOR19DSEVDS1MKKyAgICBQYXlsb2FkID0gcmVpbnRlcnByZXRfY2FzdDxFcnJvckluZm9CYXNlKj4oCisgICAgICAgICAgICAgICAgKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihFSSkgJgorICAgICAgICAgICAgICAgICB+c3RhdGljX2Nhc3Q8dWludHB0cl90PigweDEpKSB8CisgICAgICAgICAgICAgICAgKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihQYXlsb2FkKSAmIDB4MSkpOworI2Vsc2UKKyAgICBQYXlsb2FkID0gRUk7CisjZW5kaWYKKyAgfQorCisgIGJvb2wgZ2V0Q2hlY2tlZCgpIGNvbnN0IHsKKyNpZiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTCisgICAgcmV0dXJuIChyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oUGF5bG9hZCkgJiAweDEpID09IDA7CisjZWxzZQorICAgIHJldHVybiB0cnVlOworI2VuZGlmCisgIH0KKworICB2b2lkIHNldENoZWNrZWQoYm9vbCBWKSB7CisgICAgUGF5bG9hZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RXJyb3JJbmZvQmFzZSo+KAorICAgICAgICAgICAgICAgIChyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oUGF5bG9hZCkgJgorICAgICAgICAgICAgICAgICAgfnN0YXRpY19jYXN0PHVpbnRwdHJfdD4oMHgxKSkgfAorICAgICAgICAgICAgICAgICAgKFYgPyAwIDogMSkpOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPEVycm9ySW5mb0Jhc2U+IHRha2VQYXlsb2FkKCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxFcnJvckluZm9CYXNlPiBUbXAoZ2V0UHRyKCkpOworICAgIHNldFB0cihudWxscHRyKTsKKyAgICBzZXRDaGVja2VkKHRydWUpOworICAgIHJldHVybiBUbXA7CisgIH0KKworICBFcnJvckluZm9CYXNlICpQYXlsb2FkID0gbnVsbHB0cjsKK307CisKKy8vLyBTdWJjbGFzcyBvZiBFcnJvciBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBpZGVudGlmeWluZyB0aGUgc3VjY2VzcyBwYXRoIGluCisvLy8gdGhlIHR5cGUgc3lzdGVtLiBUaGlzIGFsbG93cyB0byBjYXRjaCBpbnZhbGlkIGNvbnZlcnNpb24gdG8gRXhwZWN0ZWQ8VD4gYXQKKy8vLyBjb21waWxlIHRpbWUuCitjbGFzcyBFcnJvclN1Y2Nlc3MgOiBwdWJsaWMgRXJyb3Ige307CisKK2lubGluZSBFcnJvclN1Y2Nlc3MgRXJyb3I6OnN1Y2Nlc3MoKSB7IHJldHVybiBFcnJvclN1Y2Nlc3MoKTsgfQorCisvLy8gTWFrZSBhIEVycm9yIGluc3RhbmNlIHJlcHJlc2VudGluZyBmYWlsdXJlIHVzaW5nIHRoZSBnaXZlbiBlcnJvciBpbmZvCisvLy8gdHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFcnJULCB0eXBlbmFtZS4uLiBBcmdUcz4gRXJyb3IgbWFrZV9lcnJvcihBcmdUcyAmJi4uLiBBcmdzKSB7CisgIHJldHVybiBFcnJvcihsbHZtOjptYWtlX3VuaXF1ZTxFcnJUPihzdGQ6OmZvcndhcmQ8QXJnVHM+KEFyZ3MpLi4uKSk7Cit9CisKKy8vLyBCYXNlIGNsYXNzIGZvciB1c2VyIGVycm9yIHR5cGVzLiBVc2VycyBzaG91bGQgZGVjbGFyZSB0aGVpciBlcnJvciB0eXBlcworLy8vIGxpa2U6CisvLy8KKy8vLyBjbGFzcyBNeUVycm9yIDogcHVibGljIEVycm9ySW5mbzxNeUVycm9yPiB7CisvLy8gICAuLi4uCisvLy8gfTsKKy8vLworLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEVycm9ySW5mb0Jhc2U6OmtpbmQKKy8vLyBtZXRob2QsIHdoaWNoIGlzIHVzZWQgYnkgdGhlIEVycm9yIFJUVEkgc3lzdGVtLgordGVtcGxhdGUgPHR5cGVuYW1lIFRoaXNFcnJULCB0eXBlbmFtZSBQYXJlbnRFcnJUID0gRXJyb3JJbmZvQmFzZT4KK2NsYXNzIEVycm9ySW5mbyA6IHB1YmxpYyBQYXJlbnRFcnJUIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IHZvaWQgKmNsYXNzSUQoKSB7IHJldHVybiAmVGhpc0VyclQ6OklEOyB9CisKKyAgY29uc3Qgdm9pZCAqZHluYW1pY0NsYXNzSUQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAmVGhpc0VyclQ6OklEOyB9CisKKyAgYm9vbCBpc0EoY29uc3Qgdm9pZCAqY29uc3QgQ2xhc3NJRCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBDbGFzc0lEID09IGNsYXNzSUQoKSB8fCBQYXJlbnRFcnJUOjppc0EoQ2xhc3NJRCk7CisgIH0KK307CisKKy8vLyBTcGVjaWFsIEVycm9ySW5mbyBzdWJjbGFzcyByZXByZXNlbnRpbmcgYSBsaXN0IG9mIEVycm9ySW5mb3MuCisvLy8gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIGNvbnN0cnVjdGVkIGJ5IGpvaW5FcnJvci4KK2NsYXNzIEVycm9yTGlzdCBmaW5hbCA6IHB1YmxpYyBFcnJvckluZm88RXJyb3JMaXN0PiB7CisgIC8vIGhhbmRsZUVycm9ycyBuZWVkcyB0byBiZSBhYmxlIHRvIGl0ZXJhdGUgdGhlIHBheWxvYWQgbGlzdCBvZiBhbgorICAvLyBFcnJvckxpc3QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBIYW5kbGVyVHM+CisgIGZyaWVuZCBFcnJvciBoYW5kbGVFcnJvcnMoRXJyb3IgRSwgSGFuZGxlclRzICYmLi4uIEhhbmRsZXJzKTsKKworICAvLyBqb2luRXJyb3JzIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIGpvaW4uCisgIGZyaWVuZCBFcnJvciBqb2luRXJyb3JzKEVycm9yLCBFcnJvcik7CisKK3B1YmxpYzoKKyAgdm9pZCBsb2cocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CisgICAgT1MgPDwgIk11bHRpcGxlIGVycm9yczpcbiI7CisgICAgZm9yIChhdXRvICZFcnJQYXlsb2FkIDogUGF5bG9hZHMpIHsKKyAgICAgIEVyclBheWxvYWQtPmxvZyhPUyk7CisgICAgICBPUyA8PCAiXG4iOworICAgIH0KKyAgfQorCisgIHN0ZDo6ZXJyb3JfY29kZSBjb252ZXJ0VG9FcnJvckNvZGUoKSBjb25zdCBvdmVycmlkZTsKKworICAvLyBVc2VkIGJ5IEVycm9ySW5mbzo6Y2xhc3NJRC4KKyAgc3RhdGljIGNoYXIgSUQ7CisKK3ByaXZhdGU6CisgIEVycm9yTGlzdChzdGQ6OnVuaXF1ZV9wdHI8RXJyb3JJbmZvQmFzZT4gUGF5bG9hZDEsCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RXJyb3JJbmZvQmFzZT4gUGF5bG9hZDIpIHsKKyAgICBhc3NlcnQoIVBheWxvYWQxLT5pc0E8RXJyb3JMaXN0PigpICYmICFQYXlsb2FkMi0+aXNBPEVycm9yTGlzdD4oKSAmJgorICAgICAgICAgICAiRXJyb3JMaXN0IGNvbnN0cnVjdG9yIHBheWxvYWRzIHNob3VsZCBiZSBzaW5nbGV0b24gZXJyb3JzIik7CisgICAgUGF5bG9hZHMucHVzaF9iYWNrKHN0ZDo6bW92ZShQYXlsb2FkMSkpOworICAgIFBheWxvYWRzLnB1c2hfYmFjayhzdGQ6Om1vdmUoUGF5bG9hZDIpKTsKKyAgfQorCisgIHN0YXRpYyBFcnJvciBqb2luKEVycm9yIEUxLCBFcnJvciBFMikgeworICAgIGlmICghRTEpCisgICAgICByZXR1cm4gRTI7CisgICAgaWYgKCFFMikKKyAgICAgIHJldHVybiBFMTsKKyAgICBpZiAoRTEuaXNBPEVycm9yTGlzdD4oKSkgeworICAgICAgYXV0byAmRTFMaXN0ID0gc3RhdGljX2Nhc3Q8RXJyb3JMaXN0ICY+KCpFMS5nZXRQdHIoKSk7CisgICAgICBpZiAoRTIuaXNBPEVycm9yTGlzdD4oKSkgeworICAgICAgICBhdXRvIEUyUGF5bG9hZCA9IEUyLnRha2VQYXlsb2FkKCk7CisgICAgICAgIGF1dG8gJkUyTGlzdCA9IHN0YXRpY19jYXN0PEVycm9yTGlzdCAmPigqRTJQYXlsb2FkKTsKKyAgICAgICAgZm9yIChhdXRvICZQYXlsb2FkIDogRTJMaXN0LlBheWxvYWRzKQorICAgICAgICAgIEUxTGlzdC5QYXlsb2Fkcy5wdXNoX2JhY2soc3RkOjptb3ZlKFBheWxvYWQpKTsKKyAgICAgIH0gZWxzZQorICAgICAgICBFMUxpc3QuUGF5bG9hZHMucHVzaF9iYWNrKEUyLnRha2VQYXlsb2FkKCkpOworCisgICAgICByZXR1cm4gRTE7CisgICAgfQorICAgIGlmIChFMi5pc0E8RXJyb3JMaXN0PigpKSB7CisgICAgICBhdXRvICZFMkxpc3QgPSBzdGF0aWNfY2FzdDxFcnJvckxpc3QgJj4oKkUyLmdldFB0cigpKTsKKyAgICAgIEUyTGlzdC5QYXlsb2Fkcy5pbnNlcnQoRTJMaXN0LlBheWxvYWRzLmJlZ2luKCksIEUxLnRha2VQYXlsb2FkKCkpOworICAgICAgcmV0dXJuIEUyOworICAgIH0KKyAgICByZXR1cm4gRXJyb3Ioc3RkOjp1bmlxdWVfcHRyPEVycm9yTGlzdD4oCisgICAgICAgIG5ldyBFcnJvckxpc3QoRTEudGFrZVBheWxvYWQoKSwgRTIudGFrZVBheWxvYWQoKSkpKTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxFcnJvckluZm9CYXNlPj4gUGF5bG9hZHM7Cit9OworCisvLy8gQ29uY2F0ZW5hdGUgZXJyb3JzLiBUaGUgcmVzdWx0aW5nIEVycm9yIGlzIHVuY2hlY2tlZCwgYW5kIGNvbnRhaW5zIHRoZQorLy8vIEVycm9ySW5mbyhzKSwgaWYgYW55LCBjb250YWluZWQgaW4gRTEsIGZvbGxvd2VkIGJ5IHRoZQorLy8vIEVycm9ySW5mbyhzKSwgaWYgYW55LCBjb250YWluZWQgaW4gRTIuCitpbmxpbmUgRXJyb3Igam9pbkVycm9ycyhFcnJvciBFMSwgRXJyb3IgRTIpIHsKKyAgcmV0dXJuIEVycm9yTGlzdDo6am9pbihzdGQ6Om1vdmUoRTEpLCBzdGQ6Om1vdmUoRTIpKTsKK30KKworLy8vIFRhZ2dlZCB1bmlvbiBob2xkaW5nIGVpdGhlciBhIFQgb3IgYSBFcnJvci4KKy8vLworLy8vIFRoaXMgY2xhc3MgcGFyYWxsZWxzIEVycm9yT3IsIGJ1dCByZXBsYWNlcyBlcnJvcl9jb2RlIHdpdGggRXJyb3IuIFNpbmNlCisvLy8gRXJyb3IgY2Fubm90IGJlIGNvcGllZCwgdGhpcyBjbGFzcyByZXBsYWNlcyBnZXRFcnJvcigpIHdpdGgKKy8vLyB0YWtlRXJyb3IoKS4gSXQgYWxzbyBhZGRzIGFuIGJvb2wgZXJyb3JJc0E8RXJyVD4oKSBtZXRob2QgZm9yIHRlc3RpbmcgdGhlCisvLy8gZXJyb3IgY2xhc3MgdHlwZS4KK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBMTFZNX05PRElTQ0FSRCBFeHBlY3RlZCB7CisgIHRlbXBsYXRlIDxjbGFzcyBUMT4gZnJpZW5kIGNsYXNzIEV4cGVjdGVkQXNPdXRQYXJhbWV0ZXI7CisgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclQ+IGZyaWVuZCBjbGFzcyBFeHBlY3RlZDsKKworICBzdGF0aWMgY29uc3QgYm9vbCBpc1JlZiA9IHN0ZDo6aXNfcmVmZXJlbmNlPFQ+Ojp2YWx1ZTsKKworICB1c2luZyB3cmFwID0gUmVmZXJlbmNlU3RvcmFnZTx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGU+OworCisgIHVzaW5nIGVycm9yX3R5cGUgPSBzdGQ6OnVuaXF1ZV9wdHI8RXJyb3JJbmZvQmFzZT47CisKK3B1YmxpYzoKKyAgdXNpbmcgc3RvcmFnZV90eXBlID0gdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxpc1JlZiwgd3JhcCwgVD46OnR5cGU7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBUOworCitwcml2YXRlOgorICB1c2luZyByZWZlcmVuY2UgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGUgJjsKKyAgdXNpbmcgY29uc3RfcmVmZXJlbmNlID0gY29uc3QgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlICY7CisgIHVzaW5nIHBvaW50ZXIgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGUgKjsKKyAgdXNpbmcgY29uc3RfcG9pbnRlciA9IGNvbnN0IHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZSAqOworCitwdWJsaWM6CisgIC8vLyBDcmVhdGUgYW4gRXhwZWN0ZWQ8VD4gZXJyb3IgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gRXJyb3IuCisgIEV4cGVjdGVkKEVycm9yIEVycikKKyAgICAgIDogSGFzRXJyb3IodHJ1ZSkKKyNpZiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTCisgICAgICAgIC8vIEV4cGVjdGVkIGlzIHVuY2hlY2tlZCB1cG9uIGNvbnN0cnVjdGlvbiBpbiBEZWJ1ZyBidWlsZHMuCisgICAgICAgICwgVW5jaGVja2VkKHRydWUpCisjZW5kaWYKKyAgeworICAgIGFzc2VydChFcnIgJiYgIkNhbm5vdCBjcmVhdGUgRXhwZWN0ZWQ8VD4gZnJvbSBFcnJvciBzdWNjZXNzIHZhbHVlLiIpOworICAgIG5ldyAoZ2V0RXJyb3JTdG9yYWdlKCkpIGVycm9yX3R5cGUoRXJyLnRha2VQYXlsb2FkKCkpOworICB9CisKKyAgLy8vIEZvcmJpZCB0byBjb252ZXJ0IGZyb20gRXJyb3I6OnN1Y2Nlc3MoKSBpbXBsaWNpdGx5LCB0aGlzIGF2b2lkcyBoYXZpbmcKKyAgLy8vIEV4cGVjdGVkPFQ+IGZvbygpIHsgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7IH0gd2hpY2ggY29tcGlsZXMgb3RoZXJ3aXNlCisgIC8vLyBidXQgdHJpZ2dlcnMgdGhlIGFzc2VydGlvbiBhYm92ZS4KKyAgRXhwZWN0ZWQoRXJyb3JTdWNjZXNzKSA9IGRlbGV0ZTsKKworICAvLy8gQ3JlYXRlIGFuIEV4cGVjdGVkPFQ+IHN1Y2Nlc3MgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gT3RoZXJUIHZhbHVlLCB3aGljaAorICAvLy8gbXVzdCBiZSBjb252ZXJ0aWJsZSB0byBULgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJUPgorICBFeHBlY3RlZChPdGhlclQgJiZWYWwsCisgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8T3RoZXJULCBUPjo6dmFsdWU+Ojp0eXBlCisgICAgICAgICAgICAgICAqID0gbnVsbHB0cikKKyAgICAgIDogSGFzRXJyb3IoZmFsc2UpCisjaWYgTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUworICAgICAgICAvLyBFeHBlY3RlZCBpcyB1bmNoZWNrZWQgdXBvbiBjb25zdHJ1Y3Rpb24gaW4gRGVidWcgYnVpbGRzLgorICAgICAgICAsIFVuY2hlY2tlZCh0cnVlKQorI2VuZGlmCisgIHsKKyAgICBuZXcgKGdldFN0b3JhZ2UoKSkgc3RvcmFnZV90eXBlKHN0ZDo6Zm9yd2FyZDxPdGhlclQ+KFZhbCkpOworICB9CisKKyAgLy8vIE1vdmUgY29uc3RydWN0IGFuIEV4cGVjdGVkPFQ+IHZhbHVlLgorICBFeHBlY3RlZChFeHBlY3RlZCAmJk90aGVyKSB7IG1vdmVDb25zdHJ1Y3Qoc3RkOjptb3ZlKE90aGVyKSk7IH0KKworICAvLy8gTW92ZSBjb25zdHJ1Y3QgYW4gRXhwZWN0ZWQ8VD4gdmFsdWUgZnJvbSBhbiBFeHBlY3RlZDxPdGhlclQ+LCB3aGVyZSBPdGhlclQKKyAgLy8vIG11c3QgYmUgY29udmVydGlibGUgdG8gVC4KKyAgdGVtcGxhdGUgPGNsYXNzIE90aGVyVD4KKyAgRXhwZWN0ZWQoRXhwZWN0ZWQ8T3RoZXJUPiAmJk90aGVyLAorICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPE90aGVyVCwgVD46OnZhbHVlPjo6dHlwZQorICAgICAgICAgICAgICAgKiA9IG51bGxwdHIpIHsKKyAgICBtb3ZlQ29uc3RydWN0KHN0ZDo6bW92ZShPdGhlcikpOworICB9CisKKyAgLy8vIE1vdmUgY29uc3RydWN0IGFuIEV4cGVjdGVkPFQ+IHZhbHVlIGZyb20gYW4gRXhwZWN0ZWQ8T3RoZXJUPiwgd2hlcmUgT3RoZXJUCisgIC8vLyBpc24ndCBjb252ZXJ0aWJsZSB0byBULgorICB0ZW1wbGF0ZSA8Y2xhc3MgT3RoZXJUPgorICBleHBsaWNpdCBFeHBlY3RlZCgKKyAgICAgIEV4cGVjdGVkPE90aGVyVD4gJiZPdGhlciwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX2NvbnZlcnRpYmxlPE90aGVyVCwgVD46OnZhbHVlPjo6dHlwZSAqID0KKyAgICAgICAgICBudWxscHRyKSB7CisgICAgbW92ZUNvbnN0cnVjdChzdGQ6Om1vdmUoT3RoZXIpKTsKKyAgfQorCisgIC8vLyBNb3ZlLWFzc2lnbiBmcm9tIGFub3RoZXIgRXhwZWN0ZWQ8VD4uCisgIEV4cGVjdGVkICZvcGVyYXRvcj0oRXhwZWN0ZWQgJiZPdGhlcikgeworICAgIG1vdmVBc3NpZ24oc3RkOjptb3ZlKE90aGVyKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIERlc3Ryb3kgYW4gRXhwZWN0ZWQ8VD4uCisgIH5FeHBlY3RlZCgpIHsKKyAgICBhc3NlcnRJc0NoZWNrZWQoKTsKKyAgICBpZiAoIUhhc0Vycm9yKQorICAgICAgZ2V0U3RvcmFnZSgpLT5+c3RvcmFnZV90eXBlKCk7CisgICAgZWxzZQorICAgICAgZ2V0RXJyb3JTdG9yYWdlKCktPn5lcnJvcl90eXBlKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBmYWxzZSBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIHsKKyNpZiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTCisgICAgVW5jaGVja2VkID0gSGFzRXJyb3I7CisjZW5kaWYKKyAgICByZXR1cm4gIUhhc0Vycm9yOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzdG9yZWQgVCB2YWx1ZS4KKyAgcmVmZXJlbmNlIGdldCgpIHsKKyAgICBhc3NlcnRJc0NoZWNrZWQoKTsKKyAgICByZXR1cm4gKmdldFN0b3JhZ2UoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgc3RvcmVkIFQgdmFsdWUuCisgIGNvbnN0X3JlZmVyZW5jZSBnZXQoKSBjb25zdCB7CisgICAgYXNzZXJ0SXNDaGVja2VkKCk7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwZWN0ZWQ8VD4gKj4odGhpcyktPmdldCgpOworICB9CisKKyAgLy8vIFxicmllZiBDaGVjayB0aGF0IHRoaXMgRXhwZWN0ZWQ8VD4gaXMgYW4gZXJyb3Igb2YgdHlwZSBFcnJULgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRXJyVD4gYm9vbCBlcnJvcklzQSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSGFzRXJyb3IgJiYgKCpnZXRFcnJvclN0b3JhZ2UoKSktPnRlbXBsYXRlIGlzQTxFcnJUPigpOworICB9CisKKyAgLy8vIFxicmllZiBUYWtlIG93bmVyc2hpcCBvZiB0aGUgc3RvcmVkIGVycm9yLgorICAvLy8gQWZ0ZXIgY2FsbGluZyB0aGlzIHRoZSBFeHBlY3RlZDxUPiBpcyBpbiBhbiBpbmRldGVybWluYXRlIHN0YXRlIHRoYXQgY2FuCisgIC8vLyBvbmx5IGJlIHNhZmVseSBkZXN0cnVjdGVkLiBObyBmdXJ0aGVyIGNhbGxzIChiZXNpZGUgdGhlIGRlc3RydWN0b3IpIHNob3VsZAorICAvLy8gYmUgbWFkZSBvbiB0aGUgRXhwZWN0ZWQ8VD4gdmF1bGUuCisgIEVycm9yIHRha2VFcnJvcigpIHsKKyNpZiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTCisgICAgVW5jaGVja2VkID0gZmFsc2U7CisjZW5kaWYKKyAgICByZXR1cm4gSGFzRXJyb3IgPyBFcnJvcihzdGQ6Om1vdmUoKmdldEVycm9yU3RvcmFnZSgpKSkgOiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RvcmVkIFQgdmFsdWUuCisgIHBvaW50ZXIgb3BlcmF0b3ItPigpIHsKKyAgICBhc3NlcnRJc0NoZWNrZWQoKTsKKyAgICByZXR1cm4gdG9Qb2ludGVyKGdldFN0b3JhZ2UoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBzdG9yZWQgVCB2YWx1ZS4KKyAgY29uc3RfcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeworICAgIGFzc2VydElzQ2hlY2tlZCgpOworICAgIHJldHVybiB0b1BvaW50ZXIoZ2V0U3RvcmFnZSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgc3RvcmVkIFQgdmFsdWUuCisgIHJlZmVyZW5jZSBvcGVyYXRvciooKSB7CisgICAgYXNzZXJ0SXNDaGVja2VkKCk7CisgICAgcmV0dXJuICpnZXRTdG9yYWdlKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIHN0b3JlZCBUIHZhbHVlLgorICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGFzc2VydElzQ2hlY2tlZCgpOworICAgIHJldHVybiAqZ2V0U3RvcmFnZSgpOworICB9CisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDxjbGFzcyBUMT4KKyAgc3RhdGljIGJvb2wgY29tcGFyZVRoaXNJZlNhbWVUeXBlKGNvbnN0IFQxICZhLCBjb25zdCBUMSAmYikgeworICAgIHJldHVybiAmYSA9PSAmYjsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+CisgIHN0YXRpYyBib29sIGNvbXBhcmVUaGlzSWZTYW1lVHlwZShjb25zdCBUMSAmYSwgY29uc3QgVDIgJmIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgT3RoZXJUPiB2b2lkIG1vdmVDb25zdHJ1Y3QoRXhwZWN0ZWQ8T3RoZXJUPiAmJk90aGVyKSB7CisgICAgSGFzRXJyb3IgPSBPdGhlci5IYXNFcnJvcjsKKyNpZiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTCisgICAgVW5jaGVja2VkID0gdHJ1ZTsKKyAgICBPdGhlci5VbmNoZWNrZWQgPSBmYWxzZTsKKyNlbmRpZgorCisgICAgaWYgKCFIYXNFcnJvcikKKyAgICAgIG5ldyAoZ2V0U3RvcmFnZSgpKSBzdG9yYWdlX3R5cGUoc3RkOjptb3ZlKCpPdGhlci5nZXRTdG9yYWdlKCkpKTsKKyAgICBlbHNlCisgICAgICBuZXcgKGdldEVycm9yU3RvcmFnZSgpKSBlcnJvcl90eXBlKHN0ZDo6bW92ZSgqT3RoZXIuZ2V0RXJyb3JTdG9yYWdlKCkpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclQ+IHZvaWQgbW92ZUFzc2lnbihFeHBlY3RlZDxPdGhlclQ+ICYmT3RoZXIpIHsKKyAgICBhc3NlcnRJc0NoZWNrZWQoKTsKKworICAgIGlmIChjb21wYXJlVGhpc0lmU2FtZVR5cGUoKnRoaXMsIE90aGVyKSkKKyAgICAgIHJldHVybjsKKworICAgIHRoaXMtPn5FeHBlY3RlZCgpOworICAgIG5ldyAodGhpcykgRXhwZWN0ZWQoc3RkOjptb3ZlKE90aGVyKSk7CisgIH0KKworICBwb2ludGVyIHRvUG9pbnRlcihwb2ludGVyIFZhbCkgeyByZXR1cm4gVmFsOyB9CisKKyAgY29uc3RfcG9pbnRlciB0b1BvaW50ZXIoY29uc3RfcG9pbnRlciBWYWwpIGNvbnN0IHsgcmV0dXJuIFZhbDsgfQorCisgIHBvaW50ZXIgdG9Qb2ludGVyKHdyYXAgKlZhbCkgeyByZXR1cm4gJlZhbC0+Z2V0KCk7IH0KKworICBjb25zdF9wb2ludGVyIHRvUG9pbnRlcihjb25zdCB3cmFwICpWYWwpIGNvbnN0IHsgcmV0dXJuICZWYWwtPmdldCgpOyB9CisKKyAgc3RvcmFnZV90eXBlICpnZXRTdG9yYWdlKCkgeworICAgIGFzc2VydCghSGFzRXJyb3IgJiYgIkNhbm5vdCBnZXQgdmFsdWUgd2hlbiBhbiBlcnJvciBleGlzdHMhIik7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8c3RvcmFnZV90eXBlICo+KFRTdG9yYWdlLmJ1ZmZlcik7CisgIH0KKworICBjb25zdCBzdG9yYWdlX3R5cGUgKmdldFN0b3JhZ2UoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFIYXNFcnJvciAmJiAiQ2Fubm90IGdldCB2YWx1ZSB3aGVuIGFuIGVycm9yIGV4aXN0cyEiKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdG9yYWdlX3R5cGUgKj4oVFN0b3JhZ2UuYnVmZmVyKTsKKyAgfQorCisgIGVycm9yX3R5cGUgKmdldEVycm9yU3RvcmFnZSgpIHsKKyAgICBhc3NlcnQoSGFzRXJyb3IgJiYgIkNhbm5vdCBnZXQgZXJyb3Igd2hlbiBhIHZhbHVlIGV4aXN0cyEiKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxlcnJvcl90eXBlICo+KEVycm9yU3RvcmFnZS5idWZmZXIpOworICB9CisKKyAgY29uc3QgZXJyb3JfdHlwZSAqZ2V0RXJyb3JTdG9yYWdlKCkgY29uc3QgeworICAgIGFzc2VydChIYXNFcnJvciAmJiAiQ2Fubm90IGdldCBlcnJvciB3aGVuIGEgdmFsdWUgZXhpc3RzISIpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IGVycm9yX3R5cGUgKj4oRXJyb3JTdG9yYWdlLmJ1ZmZlcik7CisgIH0KKworICAvLyBVc2VkIGJ5IEV4cGVjdGVkQXNPdXRQYXJhbWV0ZXIgdG8gcmVzZXQgdGhlIGNoZWNrZWQgZmxhZy4KKyAgdm9pZCBzZXRVbmNoZWNrZWQoKSB7CisjaWYgTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUworICAgIFVuY2hlY2tlZCA9IHRydWU7CisjZW5kaWYKKyAgfQorCisjaWYgTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUworICBMTFZNX0FUVFJJQlVURV9OT1JFVFVSTgorICBMTFZNX0FUVFJJQlVURV9OT0lOTElORQorICB2b2lkIGZhdGFsVW5jaGVja2VkRXhwZWN0ZWQoKSBjb25zdCB7CisgICAgZGJncygpIDw8ICJFeHBlY3RlZDxUPiBtdXN0IGJlIGNoZWNrZWQgYmVmb3JlIGFjY2VzcyBvciBkZXN0cnVjdGlvbi5cbiI7CisgICAgaWYgKEhhc0Vycm9yKSB7CisgICAgICBkYmdzKCkgPDwgIlVuY2hlY2tlZCBFeHBlY3RlZDxUPiBjb250YWluZWQgZXJyb3I6XG4iOworICAgICAgKCpnZXRFcnJvclN0b3JhZ2UoKSktPmxvZyhkYmdzKCkpOworICAgIH0gZWxzZQorICAgICAgZGJncygpIDw8ICJFeHBlY3RlZDxUPiB2YWx1ZSB3YXMgaW4gc3VjY2VzcyBzdGF0ZS4gKE5vdGU6IEV4cGVjdGVkPFQ+ICIKKyAgICAgICAgICAgICAgICAidmFsdWVzIGluIHN1Y2Nlc3MgbW9kZSBtdXN0IHN0aWxsIGJlIGNoZWNrZWQgcHJpb3IgdG8gYmVpbmcgIgorICAgICAgICAgICAgICAgICJkZXN0cm95ZWQpLlxuIjsKKyAgICBhYm9ydCgpOworICB9CisjZW5kaWYKKworICB2b2lkIGFzc2VydElzQ2hlY2tlZCgpIHsKKyNpZiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTCisgICAgaWYgKExMVk1fVU5MSUtFTFkoVW5jaGVja2VkKSkKKyAgICAgIGZhdGFsVW5jaGVja2VkRXhwZWN0ZWQoKTsKKyNlbmRpZgorICB9CisKKyAgdW5pb24geworICAgIEFsaWduZWRDaGFyQXJyYXlVbmlvbjxzdG9yYWdlX3R5cGU+IFRTdG9yYWdlOworICAgIEFsaWduZWRDaGFyQXJyYXlVbmlvbjxlcnJvcl90eXBlPiBFcnJvclN0b3JhZ2U7CisgIH07CisgIGJvb2wgSGFzRXJyb3IgOiAxOworI2lmIExMVk1fRU5BQkxFX0FCSV9CUkVBS0lOR19DSEVDS1MKKyAgYm9vbCBVbmNoZWNrZWQgOiAxOworI2VuZGlmCit9OworCisvLy8gUmVwb3J0IGEgc2VyaW91cyBlcnJvciwgY2FsbGluZyBhbnkgaW5zdGFsbGVkIGVycm9yIGhhbmRsZXIuIFNlZQorLy8vIEVycm9ySGFuZGxpbmcuaC4KK0xMVk1fQVRUUklCVVRFX05PUkVUVVJOIHZvaWQgcmVwb3J0X2ZhdGFsX2Vycm9yKEVycm9yIEVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZ2VuX2NyYXNoX2RpYWcgPSB0cnVlKTsKKworLy8vIFJlcG9ydCBhIGZhdGFsIGVycm9yIGlmIEVyciBpcyBhIGZhaWx1cmUgdmFsdWUuCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHdyYXAgY2FsbHMgdG8gZmFsbGlibGUgZnVuY3Rpb25zIE9OTFkgd2hlbiBpdAorLy8vIGlzIGtub3duIHRoYXQgdGhlIEVycm9yIHdpbGwgYWx3YXlzIGJlIGEgc3VjY2VzcyB2YWx1ZS4gRS5nLgorLy8vCisvLy8gICBAY29kZXsuY3BwfQorLy8vICAgLy8gZm9vIG9ubHkgYXR0ZW1wdHMgdGhlIGZhbGxpYmxlIG9wZXJhdGlvbiBpZiBEb0ZhbGxpYmxlT3BlcmF0aW9uIGlzCisvLy8gICAvLyB0cnVlLiBJZiBEb0ZhbGxpYmxlT3BlcmF0aW9uIGlzIGZhbHNlIHRoZW4gZm9vIGFsd2F5cyByZXR1cm5zCisvLy8gICAvLyBFcnJvcjo6c3VjY2VzcygpLgorLy8vICAgRXJyb3IgZm9vKGJvb2wgRG9GYWxsaWJsZU9wZXJhdGlvbik7CisvLy8KKy8vLyAgIGNhbnRGYWlsKGZvbyhmYWxzZSkpOworLy8vICAgQGVuZGNvZGUKK2lubGluZSB2b2lkIGNhbnRGYWlsKEVycm9yIEVyciwgY29uc3QgY2hhciAqTXNnID0gbnVsbHB0cikgeworICBpZiAoRXJyKSB7CisgICAgaWYgKCFNc2cpCisgICAgICBNc2cgPSAiRmFpbHVyZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGNhbnRGYWlsIHdyYXBwZWQgY2FsbCI7CisgICAgbGx2bV91bnJlYWNoYWJsZShNc2cpOworICB9Cit9CisKKy8vLyBSZXBvcnQgYSBmYXRhbCBlcnJvciBpZiBWYWxPckVyciBpcyBhIGZhaWx1cmUgdmFsdWUsIG90aGVyd2lzZSB1bndyYXBzIGFuZAorLy8vIHJldHVybnMgdGhlIGNvbnRhaW5lZCB2YWx1ZS4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gd3JhcCBjYWxscyB0byBmYWxsaWJsZSBmdW5jdGlvbnMgT05MWSB3aGVuIGl0CisvLy8gaXMga25vd24gdGhhdCB0aGUgRXJyb3Igd2lsbCBhbHdheXMgYmUgYSBzdWNjZXNzIHZhbHVlLiBFLmcuCisvLy8KKy8vLyAgIEBjb2Rley5jcHB9CisvLy8gICAvLyBmb28gb25seSBhdHRlbXB0cyB0aGUgZmFsbGlibGUgb3BlcmF0aW9uIGlmIERvRmFsbGlibGVPcGVyYXRpb24gaXMKKy8vLyAgIC8vIHRydWUuIElmIERvRmFsbGlibGVPcGVyYXRpb24gaXMgZmFsc2UgdGhlbiBmb28gYWx3YXlzIHJldHVybnMgYW4gaW50LgorLy8vICAgRXhwZWN0ZWQ8aW50PiBmb28oYm9vbCBEb0ZhbGxpYmxlT3BlcmF0aW9uKTsKKy8vLworLy8vICAgaW50IFggPSBjYW50RmFpbChmb28oZmFsc2UpKTsKKy8vLyAgIEBlbmRjb2RlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgY2FudEZhaWwoRXhwZWN0ZWQ8VD4gVmFsT3JFcnIsIGNvbnN0IGNoYXIgKk1zZyA9IG51bGxwdHIpIHsKKyAgaWYgKFZhbE9yRXJyKQorICAgIHJldHVybiBzdGQ6Om1vdmUoKlZhbE9yRXJyKTsKKyAgZWxzZSB7CisgICAgaWYgKCFNc2cpCisgICAgICBNc2cgPSAiRmFpbHVyZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGNhbnRGYWlsIHdyYXBwZWQgY2FsbCI7CisgICAgbGx2bV91bnJlYWNoYWJsZShNc2cpOworICB9Cit9CisKKy8vLyBSZXBvcnQgYSBmYXRhbCBlcnJvciBpZiBWYWxPckVyciBpcyBhIGZhaWx1cmUgdmFsdWUsIG90aGVyd2lzZSB1bndyYXBzIGFuZAorLy8vIHJldHVybnMgdGhlIGNvbnRhaW5lZCByZWZlcmVuY2UuCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHdyYXAgY2FsbHMgdG8gZmFsbGlibGUgZnVuY3Rpb25zIE9OTFkgd2hlbiBpdAorLy8vIGlzIGtub3duIHRoYXQgdGhlIEVycm9yIHdpbGwgYWx3YXlzIGJlIGEgc3VjY2VzcyB2YWx1ZS4gRS5nLgorLy8vCisvLy8gICBAY29kZXsuY3BwfQorLy8vICAgLy8gZm9vIG9ubHkgYXR0ZW1wdHMgdGhlIGZhbGxpYmxlIG9wZXJhdGlvbiBpZiBEb0ZhbGxpYmxlT3BlcmF0aW9uIGlzCisvLy8gICAvLyB0cnVlLiBJZiBEb0ZhbGxpYmxlT3BlcmF0aW9uIGlzIGZhbHNlIHRoZW4gZm9vIGFsd2F5cyByZXR1cm5zIGEgQmFyJi4KKy8vLyAgIEV4cGVjdGVkPEJhciY+IGZvbyhib29sIERvRmFsbGlibGVPcGVyYXRpb24pOworLy8vCisvLy8gICBCYXIgJlggPSBjYW50RmFpbChmb28oZmFsc2UpKTsKKy8vLyAgIEBlbmRjb2RlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QmIGNhbnRGYWlsKEV4cGVjdGVkPFQmPiBWYWxPckVyciwgY29uc3QgY2hhciAqTXNnID0gbnVsbHB0cikgeworICBpZiAoVmFsT3JFcnIpCisgICAgcmV0dXJuICpWYWxPckVycjsKKyAgZWxzZSB7CisgICAgaWYgKCFNc2cpCisgICAgICBNc2cgPSAiRmFpbHVyZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGNhbnRGYWlsIHdyYXBwZWQgY2FsbCI7CisgICAgbGx2bV91bnJlYWNoYWJsZShNc2cpOworICB9Cit9CisKKy8vLyBIZWxwZXIgZm9yIHRlc3RpbmcgYXBwbGljYWJpbGl0eSBvZiwgYW5kIGFwcGx5aW5nLCBoYW5kbGVycyBmb3IKKy8vLyBFcnJvckluZm8gdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlclQ+CitjbGFzcyBFcnJvckhhbmRsZXJUcmFpdHMKKyAgICA6IHB1YmxpYyBFcnJvckhhbmRsZXJUcmFpdHM8ZGVjbHR5cGUoCisgICAgICAgICAgJnN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxIYW5kbGVyVD46OnR5cGU6Om9wZXJhdG9yKCkpPiB7fTsKKworLy8gU3BlY2lhbGl6YXRpb24gZnVuY3Rpb25zIG9mIHRoZSBmb3JtICdFcnJvciAoY29uc3QgRXJyVCYpJy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFcnJUPiBjbGFzcyBFcnJvckhhbmRsZXJUcmFpdHM8RXJyb3IgKCYpKEVyclQgJik+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgYXBwbGllc1RvKGNvbnN0IEVycm9ySW5mb0Jhc2UgJkUpIHsKKyAgICByZXR1cm4gRS50ZW1wbGF0ZSBpc0E8RXJyVD4oKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyVD4KKyAgc3RhdGljIEVycm9yIGFwcGx5KEhhbmRsZXJUICYmSCwgc3RkOjp1bmlxdWVfcHRyPEVycm9ySW5mb0Jhc2U+IEUpIHsKKyAgICBhc3NlcnQoYXBwbGllc1RvKCpFKSAmJiAiQXBwbHlpbmcgaW5jb3JyZWN0IGhhbmRsZXIiKTsKKyAgICByZXR1cm4gSChzdGF0aWNfY2FzdDxFcnJUICY+KCpFKSk7CisgIH0KK307CisKKy8vIFNwZWNpYWxpemF0aW9uIGZ1bmN0aW9ucyBvZiB0aGUgZm9ybSAndm9pZCAoY29uc3QgRXJyVCYpJy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFcnJUPiBjbGFzcyBFcnJvckhhbmRsZXJUcmFpdHM8dm9pZCAoJikoRXJyVCAmKT4geworcHVibGljOgorICBzdGF0aWMgYm9vbCBhcHBsaWVzVG8oY29uc3QgRXJyb3JJbmZvQmFzZSAmRSkgeworICAgIHJldHVybiBFLnRlbXBsYXRlIGlzQTxFcnJUPigpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXJUPgorICBzdGF0aWMgRXJyb3IgYXBwbHkoSGFuZGxlclQgJiZILCBzdGQ6OnVuaXF1ZV9wdHI8RXJyb3JJbmZvQmFzZT4gRSkgeworICAgIGFzc2VydChhcHBsaWVzVG8oKkUpICYmICJBcHBseWluZyBpbmNvcnJlY3QgaGFuZGxlciIpOworICAgIEgoc3RhdGljX2Nhc3Q8RXJyVCAmPigqRSkpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9Cit9OworCisvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGZ1bmN0aW9ucyBvZiB0aGUgZm9ybSAnRXJyb3IgKHN0ZDo6dW5pcXVlX3B0cjxFcnJUPiknLgordGVtcGxhdGUgPHR5cGVuYW1lIEVyclQ+CitjbGFzcyBFcnJvckhhbmRsZXJUcmFpdHM8RXJyb3IgKCYpKHN0ZDo6dW5pcXVlX3B0cjxFcnJUPik+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgYXBwbGllc1RvKGNvbnN0IEVycm9ySW5mb0Jhc2UgJkUpIHsKKyAgICByZXR1cm4gRS50ZW1wbGF0ZSBpc0E8RXJyVD4oKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyVD4KKyAgc3RhdGljIEVycm9yIGFwcGx5KEhhbmRsZXJUICYmSCwgc3RkOjp1bmlxdWVfcHRyPEVycm9ySW5mb0Jhc2U+IEUpIHsKKyAgICBhc3NlcnQoYXBwbGllc1RvKCpFKSAmJiAiQXBwbHlpbmcgaW5jb3JyZWN0IGhhbmRsZXIiKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXJyVD4gU3ViRShzdGF0aWNfY2FzdDxFcnJUICo+KEUucmVsZWFzZSgpKSk7CisgICAgcmV0dXJuIEgoc3RkOjptb3ZlKFN1YkUpKTsKKyAgfQorfTsKKworLy8vIFNwZWNpYWxpemF0aW9uIGZvciBmdW5jdGlvbnMgb2YgdGhlIGZvcm0gJ3ZvaWQgKHN0ZDo6dW5pcXVlX3B0cjxFcnJUPiknLgordGVtcGxhdGUgPHR5cGVuYW1lIEVyclQ+CitjbGFzcyBFcnJvckhhbmRsZXJUcmFpdHM8dm9pZCAoJikoc3RkOjp1bmlxdWVfcHRyPEVyclQ+KT4geworcHVibGljOgorICBzdGF0aWMgYm9vbCBhcHBsaWVzVG8oY29uc3QgRXJyb3JJbmZvQmFzZSAmRSkgeworICAgIHJldHVybiBFLnRlbXBsYXRlIGlzQTxFcnJUPigpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXJUPgorICBzdGF0aWMgRXJyb3IgYXBwbHkoSGFuZGxlclQgJiZILCBzdGQ6OnVuaXF1ZV9wdHI8RXJyb3JJbmZvQmFzZT4gRSkgeworICAgIGFzc2VydChhcHBsaWVzVG8oKkUpICYmICJBcHBseWluZyBpbmNvcnJlY3QgaGFuZGxlciIpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxFcnJUPiBTdWJFKHN0YXRpY19jYXN0PEVyclQgKj4oRS5yZWxlYXNlKCkpKTsKKyAgICBIKHN0ZDo6bW92ZShTdWJFKSk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KK307CisKKy8vIFNwZWNpYWxpemF0aW9uIGZvciBtZW1iZXIgZnVuY3Rpb25zIG9mIHRoZSBmb3JtICdSZXRUIChjb25zdCBFcnJUJiknLgordGVtcGxhdGUgPHR5cGVuYW1lIEMsIHR5cGVuYW1lIFJldFQsIHR5cGVuYW1lIEVyclQ+CitjbGFzcyBFcnJvckhhbmRsZXJUcmFpdHM8UmV0VCAoQzo6KikoRXJyVCAmKT4KKyAgICA6IHB1YmxpYyBFcnJvckhhbmRsZXJUcmFpdHM8UmV0VCAoJikoRXJyVCAmKT4ge307CisKKy8vIFNwZWNpYWxpemF0aW9uIGZvciBtZW1iZXIgZnVuY3Rpb25zIG9mIHRoZSBmb3JtICdSZXRUIChjb25zdCBFcnJUJikgY29uc3QnLgordGVtcGxhdGUgPHR5cGVuYW1lIEMsIHR5cGVuYW1lIFJldFQsIHR5cGVuYW1lIEVyclQ+CitjbGFzcyBFcnJvckhhbmRsZXJUcmFpdHM8UmV0VCAoQzo6KikoRXJyVCAmKSBjb25zdD4KKyAgICA6IHB1YmxpYyBFcnJvckhhbmRsZXJUcmFpdHM8UmV0VCAoJikoRXJyVCAmKT4ge307CisKKy8vIFNwZWNpYWxpemF0aW9uIGZvciBtZW1iZXIgZnVuY3Rpb25zIG9mIHRoZSBmb3JtICdSZXRUIChjb25zdCBFcnJUJiknLgordGVtcGxhdGUgPHR5cGVuYW1lIEMsIHR5cGVuYW1lIFJldFQsIHR5cGVuYW1lIEVyclQ+CitjbGFzcyBFcnJvckhhbmRsZXJUcmFpdHM8UmV0VCAoQzo6KikoY29uc3QgRXJyVCAmKT4KKyAgICA6IHB1YmxpYyBFcnJvckhhbmRsZXJUcmFpdHM8UmV0VCAoJikoRXJyVCAmKT4ge307CisKKy8vIFNwZWNpYWxpemF0aW9uIGZvciBtZW1iZXIgZnVuY3Rpb25zIG9mIHRoZSBmb3JtICdSZXRUIChjb25zdCBFcnJUJikgY29uc3QnLgordGVtcGxhdGUgPHR5cGVuYW1lIEMsIHR5cGVuYW1lIFJldFQsIHR5cGVuYW1lIEVyclQ+CitjbGFzcyBFcnJvckhhbmRsZXJUcmFpdHM8UmV0VCAoQzo6KikoY29uc3QgRXJyVCAmKSBjb25zdD4KKyAgICA6IHB1YmxpYyBFcnJvckhhbmRsZXJUcmFpdHM8UmV0VCAoJikoRXJyVCAmKT4ge307CisKKy8vLyBTcGVjaWFsaXphdGlvbiBmb3IgbWVtYmVyIGZ1bmN0aW9ucyBvZiB0aGUgZm9ybQorLy8vICdSZXRUIChzdGQ6OnVuaXF1ZV9wdHI8RXJyVD4pJy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDLCB0eXBlbmFtZSBSZXRULCB0eXBlbmFtZSBFcnJUPgorY2xhc3MgRXJyb3JIYW5kbGVyVHJhaXRzPFJldFQgKEM6OiopKHN0ZDo6dW5pcXVlX3B0cjxFcnJUPik+CisgICAgOiBwdWJsaWMgRXJyb3JIYW5kbGVyVHJhaXRzPFJldFQgKCYpKHN0ZDo6dW5pcXVlX3B0cjxFcnJUPik+IHt9OworCisvLy8gU3BlY2lhbGl6YXRpb24gZm9yIG1lbWJlciBmdW5jdGlvbnMgb2YgdGhlIGZvcm0KKy8vLyAnUmV0VCAoc3RkOjp1bmlxdWVfcHRyPEVyclQ+KSBjb25zdCcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQywgdHlwZW5hbWUgUmV0VCwgdHlwZW5hbWUgRXJyVD4KK2NsYXNzIEVycm9ySGFuZGxlclRyYWl0czxSZXRUIChDOjoqKShzdGQ6OnVuaXF1ZV9wdHI8RXJyVD4pIGNvbnN0PgorICAgIDogcHVibGljIEVycm9ySGFuZGxlclRyYWl0czxSZXRUICgmKShzdGQ6OnVuaXF1ZV9wdHI8RXJyVD4pPiB7fTsKKworaW5saW5lIEVycm9yIGhhbmRsZUVycm9ySW1wbChzdGQ6OnVuaXF1ZV9wdHI8RXJyb3JJbmZvQmFzZT4gUGF5bG9hZCkgeworICByZXR1cm4gRXJyb3Ioc3RkOjptb3ZlKFBheWxvYWQpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXJULCB0eXBlbmFtZS4uLiBIYW5kbGVyVHM+CitFcnJvciBoYW5kbGVFcnJvckltcGwoc3RkOjp1bmlxdWVfcHRyPEVycm9ySW5mb0Jhc2U+IFBheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlclQgJiZIYW5kbGVyLCBIYW5kbGVyVHMgJiYuLi4gSGFuZGxlcnMpIHsKKyAgaWYgKEVycm9ySGFuZGxlclRyYWl0czxIYW5kbGVyVD46OmFwcGxpZXNUbygqUGF5bG9hZCkpCisgICAgcmV0dXJuIEVycm9ySGFuZGxlclRyYWl0czxIYW5kbGVyVD46OmFwcGx5KHN0ZDo6Zm9yd2FyZDxIYW5kbGVyVD4oSGFuZGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShQYXlsb2FkKSk7CisgIHJldHVybiBoYW5kbGVFcnJvckltcGwoc3RkOjptb3ZlKFBheWxvYWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxIYW5kbGVyVHM+KEhhbmRsZXJzKS4uLik7Cit9CisKKy8vLyBQYXNzIHRoZSBFcnJvckluZm8ocykgY29udGFpbmVkIGluIEUgdG8gdGhlaXIgcmVzcGVjdGl2ZSBoYW5kbGVycy4gQW55CisvLy8gdW5oYW5kbGVkIGVycm9ycyAob3IgRXJyb3JzIHJldHVybmVkIGJ5IGhhbmRsZXJzKSBhcmUgcmUtY29uY2F0ZW5hdGVkIGFuZAorLy8vIHJldHVybmVkLgorLy8vIEJlY2F1c2UgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yLCBpdHMgcmVzdWx0IG11c3QgYWxzbyBiZSBjaGVja2VkCisvLy8gb3IgcmV0dXJuZWQuIElmIHlvdSBpbnRlbmQgdG8gaGFuZGxlIGFsbCBlcnJvcnMgdXNlIGhhbmRsZUFsbEVycm9ycworLy8vICh3aGljaCByZXR1cm5zIHZvaWQsIGFuZCB3aWxsIGFib3J0KCkgb24gdW5oYW5kbGVkIGVycm9ycykgaW5zdGVhZC4KK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBIYW5kbGVyVHM+CitFcnJvciBoYW5kbGVFcnJvcnMoRXJyb3IgRSwgSGFuZGxlclRzICYmLi4uIEhzKSB7CisgIGlmICghRSkKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8RXJyb3JJbmZvQmFzZT4gUGF5bG9hZCA9IEUudGFrZVBheWxvYWQoKTsKKworICBpZiAoUGF5bG9hZC0+aXNBPEVycm9yTGlzdD4oKSkgeworICAgIEVycm9yTGlzdCAmTGlzdCA9IHN0YXRpY19jYXN0PEVycm9yTGlzdCAmPigqUGF5bG9hZCk7CisgICAgRXJyb3IgUjsKKyAgICBmb3IgKGF1dG8gJlAgOiBMaXN0LlBheWxvYWRzKQorICAgICAgUiA9IEVycm9yTGlzdDo6am9pbigKKyAgICAgICAgICBzdGQ6Om1vdmUoUiksCisgICAgICAgICAgaGFuZGxlRXJyb3JJbXBsKHN0ZDo6bW92ZShQKSwgc3RkOjpmb3J3YXJkPEhhbmRsZXJUcz4oSHMpLi4uKSk7CisgICAgcmV0dXJuIFI7CisgIH0KKworICByZXR1cm4gaGFuZGxlRXJyb3JJbXBsKHN0ZDo6bW92ZShQYXlsb2FkKSwgc3RkOjpmb3J3YXJkPEhhbmRsZXJUcz4oSHMpLi4uKTsKK30KKworLy8vIEJlaGF2ZXMgdGhlIHNhbWUgYXMgaGFuZGxlRXJyb3JzLCBleGNlcHQgdGhhdCBieSBjb250cmFjdCBhbGwgZXJyb3JzCisvLy8gKm11c3QqIGJlIGhhbmRsZWQgYnkgdGhlIGdpdmVuIGhhbmRsZXJzIChpLmUuIHRoZXJlIG11c3QgYmUgbm8gcmVtYWluaW5nCisvLy8gZXJyb3JzIGFmdGVyIHJ1bm5pbmcgdGhlIGhhbmRsZXJzLCBvciBsbHZtX3VucmVhY2hhYmxlIGlzIGNhbGxlZCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gSGFuZGxlclRzPgordm9pZCBoYW5kbGVBbGxFcnJvcnMoRXJyb3IgRSwgSGFuZGxlclRzICYmLi4uIEhhbmRsZXJzKSB7CisgIGNhbnRGYWlsKGhhbmRsZUVycm9ycyhzdGQ6Om1vdmUoRSksIHN0ZDo6Zm9yd2FyZDxIYW5kbGVyVHM+KEhhbmRsZXJzKS4uLikpOworfQorCisvLy8gQ2hlY2sgdGhhdCBFIGlzIGEgbm9uLWVycm9yLCB0aGVuIGRyb3AgaXQuCisvLy8gSWYgRSBpcyBhbiBlcnJvciwgbGx2bV91bnJlYWNoYWJsZSB3aWxsIGJlIGNhbGxlZC4KK2lubGluZSB2b2lkIGhhbmRsZUFsbEVycm9ycyhFcnJvciBFKSB7CisgIGNhbnRGYWlsKHN0ZDo6bW92ZShFKSk7Cit9CisKKy8vLyBIYW5kbGUgYW55IGVycm9ycyAoaWYgcHJlc2VudCkgaW4gYW4gRXhwZWN0ZWQ8VD4sIHRoZW4gdHJ5IGEgcmVjb3ZlcnkgcGF0aC4KKy8vLworLy8vIElmIHRoZSBpbmNvbWluZyB2YWx1ZSBpcyBhIHN1Y2Nlc3MgdmFsdWUgaXQgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4gSWYgaXQKKy8vLyBpcyBhIGZhaWx1cmUgdmFsdWUgdGhlbiBpdCB0aGUgY29udGFpbmVkIGVycm9yIGlzIHBhc3NlZCB0byBoYW5kbGVFcnJvcnMuCisvLy8gSWYgaGFuZGxlRXJyb3JzIGlzIGFibGUgdG8gaGFuZGxlIHRoZSBlcnJvciB0aGVuIHRoZSBSZWNvdmVyeVBhdGggZnVuY3RvcgorLy8vIGlzIGNhbGxlZCB0byBzdXBwbHkgdGhlIGZpbmFsIHJlc3VsdC4gSWYgaGFuZGxlRXJyb3JzIGlzIG5vdCBhYmxlIHRvCisvLy8gaGFuZGxlIGFsbCBlcnJvcnMgdGhlbiB0aGUgdW5oYW5kbGVkIGVycm9ycyBhcmUgcmV0dXJuZWQuCisvLy8KKy8vLyBUaGlzIHV0aWxpdHkgZW5hYmxlcyB0aGUgZm9sbG93IHBhdHRlcm46CisvLy8KKy8vLyAgIEBjb2Rley5jcHB9CisvLy8gICBlbnVtIEZvb1N0cmF0ZWd5IHsgQWdncmVzc2l2ZSwgQ29uc2VydmF0aXZlIH07CisvLy8gICBFeHBlY3RlZDxGb28+IGZvbyhGb29TdHJhdGVneSBTKTsKKy8vLworLy8vICAgYXV0byBSZXN1bHRPckVyciA9CisvLy8gICAgIGhhbmRsZUV4cGVjdGVkKAorLy8vICAgICAgIGZvbyhBZ2dyZXNzaXZlKSwKKy8vLyAgICAgICBbXSgpIHsgcmV0dXJuIGZvbyhDb25zZXJ2YXRpdmUpOyB9LAorLy8vICAgICAgIFtdKEFnZ3Jlc3NpdmVTdHJhdGVneUVycm9yJikgeworLy8vICAgICAgICAgLy8gSW1wbGljaXRseSBjb251c21lIHRoaXMgLSB3ZSdsbCByZWNvdmVyIGJ5IHVzaW5nIGEgY29uc2VydmF0aXZlCisvLy8gICAgICAgICAvLyBzdHJhdGVneS4KKy8vLyAgICAgICB9KTsKKy8vLworLy8vICAgQGVuZGNvZGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBSZWNvdmVyeUZ0b3IsIHR5cGVuYW1lLi4uIEhhbmRsZXJUcz4KK0V4cGVjdGVkPFQ+IGhhbmRsZUV4cGVjdGVkKEV4cGVjdGVkPFQ+IFZhbE9yRXJyLCBSZWNvdmVyeUZ0b3IgJiZSZWNvdmVyeVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyVHMgJiYuLi4gSGFuZGxlcnMpIHsKKyAgaWYgKFZhbE9yRXJyKQorICAgIHJldHVybiBWYWxPckVycjsKKworICBpZiAoYXV0byBFcnIgPSBoYW5kbGVFcnJvcnMoVmFsT3JFcnIudGFrZUVycm9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8SGFuZGxlclRzPihIYW5kbGVycykuLi4pKQorICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKworICByZXR1cm4gUmVjb3ZlcnlQYXRoKCk7Cit9CisKKy8vLyBMb2cgYWxsIGVycm9ycyAoaWYgYW55KSBpbiBFIHRvIE9TLiBJZiB0aGVyZSBhcmUgYW55IGVycm9ycywgRXJyb3JCYW5uZXIKKy8vLyB3aWxsIGJlIHByaW50ZWQgYmVmb3JlIHRoZSBmaXJzdCBvbmUgaXMgbG9nZ2VkLiBBIG5ld2xpbmUgd2lsbCBiZSBwcmludGVkCisvLy8gYWZ0ZXIgZWFjaCBlcnJvci4KKy8vLworLy8vIFRoaXMgaXMgdXNlZnVsIGluIHRoZSBiYXNlIGxldmVsIG9mIHlvdXIgcHJvZ3JhbSB0byBhbGxvdyBjbGVhbiB0ZXJtaW5hdGlvbgorLy8vIChhbGxvd2luZyBjbGVhbiBkZWFsbG9jYXRpb24gb2YgcmVzb3VyY2VzLCBldGMuKSwgd2hpbGUgcmVwb3J0aW5nIGVycm9yCisvLy8gaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIuCit2b2lkIGxvZ0FsbFVuaGFuZGxlZEVycm9ycyhFcnJvciBFLCByYXdfb3N0cmVhbSAmT1MsIFR3aW5lIEVycm9yQmFubmVyKTsKKworLy8vIFdyaXRlIGFsbCBlcnJvciBtZXNzYWdlcyAoaWYgYW55KSBpbiBFIHRvIGEgc3RyaW5nLiBUaGUgbmV3bGluZSBjaGFyYWN0ZXIKKy8vLyBpcyB1c2VkIHRvIHNlcGFyYXRlIGVycm9yIG1lc3NhZ2VzLgoraW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKEVycm9yIEUpIHsKKyAgU21hbGxWZWN0b3I8c3RkOjpzdHJpbmcsIDI+IEVycm9yczsKKyAgaGFuZGxlQWxsRXJyb3JzKHN0ZDo6bW92ZShFKSwgWyZFcnJvcnNdKGNvbnN0IEVycm9ySW5mb0Jhc2UgJkVJKSB7CisgICAgRXJyb3JzLnB1c2hfYmFjayhFSS5tZXNzYWdlKCkpOworICB9KTsKKyAgcmV0dXJuIGpvaW4oRXJyb3JzLmJlZ2luKCksIEVycm9ycy5lbmQoKSwgIlxuIik7Cit9CisKKy8vLyBDb25zdW1lIGEgRXJyb3Igd2l0aG91dCBkb2luZyBhbnl0aGluZy4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQKKy8vLyBvbmx5IHdoZXJlIGFuIGVycm9yIGNhbiBiZSBjb25zaWRlcmVkIGEgcmVhc29uYWJsZSBhbmQgZXhwZWN0ZWQgcmV0dXJuCisvLy8gdmFsdWUuCisvLy8KKy8vLyBVc2VzIG9mIHRoaXMgbWV0aG9kIGFyZSBwb3RlbnRpYWxseSBpbmRpY2F0aXZlIG9mIGRlc2lnbiBwcm9ibGVtczogSWYgaXQncworLy8vIGxlZ2l0aW1hdGUgdG8gZG8gbm90aGluZyB3aGlsZSBwcm9jZXNzaW5nIGFuICJlcnJvciIsIHRoZSBlcnJvci1wcm9kdWNlcgorLy8vIG1pZ2h0IGJlIG1vcmUgY2xlYXJseSByZWZhY3RvcmVkIHRvIHJldHVybiBhbiBPcHRpb25hbDxUPi4KK2lubGluZSB2b2lkIGNvbnN1bWVFcnJvcihFcnJvciBFcnIpIHsKKyAgaGFuZGxlQWxsRXJyb3JzKHN0ZDo6bW92ZShFcnIpLCBbXShjb25zdCBFcnJvckluZm9CYXNlICYpIHt9KTsKK30KKworLy8vIEhlbHBlciBmb3IgY29udmVydGluZyBhbiBFcnJvciB0byBhIGJvb2wuCisvLy8KKy8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgRXJyIGlzIGluIGFuIGVycm9yIHN0YXRlLCBvciBmYWxzZSBpZiBpdCBpcworLy8vIGluIGEgc3VjY2VzcyBzdGF0ZS4gIFB1dHMgRXJyIGluIGEgY2hlY2tlZCBzdGF0ZSBpbiBib3RoIGNhc2VzICh1bmxpa2UKKy8vLyBFcnJvcjo6b3BlcmF0b3IgYm9vbCgpLCB3aGljaCBvbmx5IGRvZXMgdGhpcyBmb3Igc3VjY2VzcyBzdGF0ZXMpLgoraW5saW5lIGJvb2wgZXJyb3JUb0Jvb2woRXJyb3IgRXJyKSB7CisgIGJvb2wgSXNFcnJvciA9IHN0YXRpY19jYXN0PGJvb2w+KEVycik7CisgIGlmIChJc0Vycm9yKQorICAgIGNvbnN1bWVFcnJvcihzdGQ6Om1vdmUoRXJyKSk7CisgIHJldHVybiBJc0Vycm9yOworfQorCisvLy8gSGVscGVyIGZvciBFcnJvcnMgdXNlZCBhcyBvdXQtcGFyYW1ldGVycy4KKy8vLworLy8vIFRoaXMgaGVscGVyIGlzIGZvciB1c2Ugd2l0aCB0aGUgRXJyb3ItYXMtb3V0LXBhcmFtZXRlciBpZGlvbSwgd2hlcmUgYW4gZXJyb3IKKy8vLyBpcyBwYXNzZWQgdG8gYSBmdW5jdGlvbiBvciBtZXRob2QgYnkgcmVmZXJlbmNlLCByYXRoZXIgdGhhbiBiZWluZyByZXR1cm5lZC4KKy8vLyBJbiBzdWNoIGNhc2VzIGl0IGlzIGhlbHBmdWwgdG8gc2V0IHRoZSBjaGVja2VkIGJpdCBvbiBlbnRyeSB0byB0aGUgZnVuY3Rpb24KKy8vLyBzbyB0aGF0IHRoZSBlcnJvciBjYW4gYmUgd3JpdHRlbiB0byAodW5jaGVja2VkIEVycm9ycyBhYm9ydCBvbiBhc3NpZ25tZW50KQorLy8vIGFuZCBjbGVhciB0aGUgY2hlY2tlZCBiaXQgb24gZXhpdCBzbyB0aGF0IGNsaWVudHMgY2Fubm90IGFjY2lkZW50YWxseSBmb3JnZXQKKy8vLyB0byBjaGVjayB0aGUgcmVzdWx0LiBUaGlzIGhlbHBlciBwZXJmb3JtcyB0aGVzZSBhY3Rpb25zIGF1dG9tYXRpY2FsbHkgdXNpbmcKKy8vLyBSQUlJOgorLy8vCisvLy8gICBAY29kZXsuY3BwfQorLy8vICAgUmVzdWx0IGZvbyhFcnJvciAmRXJyKSB7CisvLy8gICAgIEVycm9yQXNPdXRQYXJhbWV0ZXIgRXJyQXNPdXRQYXJhbSgmRXJyKTsgLy8gJ0NoZWNrZWQnIGZsYWcgc2V0CisvLy8gICAgIC8vIDxib2R5IG9mIGZvbz4KKy8vLyAgICAgLy8gPC0gJ0NoZWNrZWQnIGZsYWcgYXV0by1jbGVhcmVkIHdoZW4gRXJyQXNPdXRQYXJhbSBpcyBkZXN0cnVjdGVkLgorLy8vICAgfQorLy8vICAgQGVuZGNvZGUKKy8vLworLy8vIEVycm9yQXNPdXRQYXJhbWV0ZXIgdGFrZXMgYW4gRXJyb3IqIHJhdGhlciB0aGFuIEVycm9yJiBzbyB0aGF0IGl0IGNhbiBiZQorLy8vIHVzZWQgd2l0aCBvcHRpb25hbCBFcnJvcnMgKEVycm9yIHBvaW50ZXJzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgbnVsbCkuIElmCisvLy8gRXJyb3JBc091dFBhcmFtZXRlciB0b29rIGFuIEVycm9yIHJlZmVyZW5jZSwgYW4gaW5zdGFuY2Ugd291bGQgaGF2ZSB0byBiZQorLy8vIGNyZWF0ZWQgaW5zaWRlIGV2ZXJ5IGNvbmRpdGlvbiB0aGF0IHZlcmlmaWVkIHRoYXQgRXJyb3Igd2FzIG5vbi1udWxsLiBCeQorLy8vIHRha2luZyBhbiBFcnJvciBwb2ludGVyIHdlIGNhbiBqdXN0IGNyZWF0ZSBvbmUgaW5zdGFuY2UgYXQgdGhlIHRvcCBvZiB0aGUKKy8vLyBmdW5jdGlvbi4KK2NsYXNzIEVycm9yQXNPdXRQYXJhbWV0ZXIgeworcHVibGljOgorICBFcnJvckFzT3V0UGFyYW1ldGVyKEVycm9yICpFcnIpIDogRXJyKEVycikgeworICAgIC8vIFJhaXNlIHRoZSBjaGVja2VkIGJpdCBpZiBFcnIgaXMgc3VjY2Vzcy4KKyAgICBpZiAoRXJyKQorICAgICAgKHZvaWQpISEqRXJyOworICB9CisKKyAgfkVycm9yQXNPdXRQYXJhbWV0ZXIoKSB7CisgICAgLy8gQ2xlYXIgdGhlIGNoZWNrZWQgYml0LgorICAgIGlmIChFcnIgJiYgISpFcnIpCisgICAgICAqRXJyID0gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCitwcml2YXRlOgorICBFcnJvciAqRXJyOworfTsKKworLy8vIEhlbHBlciBmb3IgRXhwZWN0ZWQ8VD5zIHVzZWQgYXMgb3V0LXBhcmFtZXRlcnMuCisvLy8KKy8vLyBTZWUgRXJyb3JBc091dFBhcmFtZXRlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgRXhwZWN0ZWRBc091dFBhcmFtZXRlciB7CitwdWJsaWM6CisgIEV4cGVjdGVkQXNPdXRQYXJhbWV0ZXIoRXhwZWN0ZWQ8VD4gKlZhbE9yRXJyKQorICAgIDogVmFsT3JFcnIoVmFsT3JFcnIpIHsKKyAgICBpZiAoVmFsT3JFcnIpCisgICAgICAodm9pZCkhISpWYWxPckVycjsKKyAgfQorCisgIH5FeHBlY3RlZEFzT3V0UGFyYW1ldGVyKCkgeworICAgIGlmIChWYWxPckVycikKKyAgICAgIFZhbE9yRXJyLT5zZXRVbmNoZWNrZWQoKTsKKyAgfQorCitwcml2YXRlOgorICBFeHBlY3RlZDxUPiAqVmFsT3JFcnI7Cit9OworCisvLy8gVGhpcyBjbGFzcyB3cmFwcyBhIHN0ZDo6ZXJyb3JfY29kZSBpbiBhIEVycm9yLgorLy8vCisvLy8gVGhpcyBpcyB1c2VmdWwgaWYgeW91J3JlIHdyaXRpbmcgYW4gaW50ZXJmYWNlIHRoYXQgcmV0dXJucyBhIEVycm9yCisvLy8gKG9yIEV4cGVjdGVkKSBhbmQgeW91IHdhbnQgdG8gY2FsbCBjb2RlIHRoYXQgc3RpbGwgcmV0dXJucworLy8vIHN0ZDo6ZXJyb3JfY29kZXMuCitjbGFzcyBFQ0Vycm9yIDogcHVibGljIEVycm9ySW5mbzxFQ0Vycm9yPiB7CisgIGZyaWVuZCBFcnJvciBlcnJvckNvZGVUb0Vycm9yKHN0ZDo6ZXJyb3JfY29kZSk7CisKK3B1YmxpYzoKKyAgdm9pZCBzZXRFcnJvckNvZGUoc3RkOjplcnJvcl9jb2RlIEVDKSB7IHRoaXMtPkVDID0gRUM7IH0KKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEVDOyB9CisgIHZvaWQgbG9nKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgeyBPUyA8PCBFQy5tZXNzYWdlKCk7IH0KKworICAvLyBVc2VkIGJ5IEVycm9ySW5mbzo6Y2xhc3NJRC4KKyAgc3RhdGljIGNoYXIgSUQ7CisKK3Byb3RlY3RlZDoKKyAgRUNFcnJvcigpID0gZGVmYXVsdDsKKyAgRUNFcnJvcihzdGQ6OmVycm9yX2NvZGUgRUMpIDogRUMoRUMpIHt9CisKKyAgc3RkOjplcnJvcl9jb2RlIEVDOworfTsKKworLy8vIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSByZXR1cm5lZCBmcm9tIGNvbnZlcnRUb0Vycm9yQ29kZQorLy8vIGZvciBFcnJvciB2YWx1ZXMgd2hlcmUgbm8gc2Vuc2libGUgdHJhbnNsYXRpb24gdG8gc3RkOjplcnJvcl9jb2RlIGV4aXN0cy4KKy8vLyBJdCBzaG91bGQgb25seSBiZSB1c2VkIGluIHRoaXMgc2l0dWF0aW9uLCBhbmQgc2hvdWxkIG5ldmVyIGJlIHVzZWQgd2hlcmUgYQorLy8vIHNlbnNpYmxlIGNvbnZlcnNpb24gdG8gc3RkOjplcnJvcl9jb2RlIGlzIGF2YWlsYWJsZSwgYXMgYXR0ZW1wdHMgdG8gY29udmVydAorLy8vIHRvL2Zyb20gdGhpcyBlcnJvciB3aWxsIHJlc3VsdCBpbiBhIGZhdGFsIGVycm9yLiAoaS5lLiBpdCBpcyBhIHByb2dyYW1tYXRpYworLy8vZXJyb3IgdG8gdHJ5IHRvIGNvbnZlcnQgc3VjaCBhIHZhbHVlKS4KK3N0ZDo6ZXJyb3JfY29kZSBpbmNvbnZlcnRpYmxlRXJyb3JDb2RlKCk7CisKKy8vLyBIZWxwZXIgZm9yIGNvbnZlcnRpbmcgYW4gc3RkOjplcnJvcl9jb2RlIHRvIGEgRXJyb3IuCitFcnJvciBlcnJvckNvZGVUb0Vycm9yKHN0ZDo6ZXJyb3JfY29kZSBFQyk7CisKKy8vLyBIZWxwZXIgZm9yIGNvbnZlcnRpbmcgYW4gRUNFcnJvciB0byBhIHN0ZDo6ZXJyb3JfY29kZS4KKy8vLworLy8vIFRoaXMgbWV0aG9kIHJlcXVpcmVzIHRoYXQgRXJyIGJlIEVycm9yKCkgb3IgYW4gRUNFcnJvciwgb3RoZXJ3aXNlIGl0CisvLy8gd2lsbCB0cmlnZ2VyIGEgY2FsbCB0byBhYm9ydCgpLgorc3RkOjplcnJvcl9jb2RlIGVycm9yVG9FcnJvckNvZGUoRXJyb3IgRXJyKTsKKworLy8vIENvbnZlcnQgYW4gRXJyb3JPcjxUPiB0byBhbiBFeHBlY3RlZDxUPi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBFeHBlY3RlZDxUPiBlcnJvck9yVG9FeHBlY3RlZChFcnJvck9yPFQ+ICYmRU8pIHsKKyAgaWYgKGF1dG8gRUMgPSBFTy5nZXRFcnJvcigpKQorICAgIHJldHVybiBlcnJvckNvZGVUb0Vycm9yKEVDKTsKKyAgcmV0dXJuIHN0ZDo6bW92ZSgqRU8pOworfQorCisvLy8gQ29udmVydCBhbiBFeHBlY3RlZDxUPiB0byBhbiBFcnJvck9yPFQ+LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEVycm9yT3I8VD4gZXhwZWN0ZWRUb0Vycm9yT3IoRXhwZWN0ZWQ8VD4gJiZFKSB7CisgIGlmIChhdXRvIEVyciA9IEUudGFrZUVycm9yKCkpCisgICAgcmV0dXJuIGVycm9yVG9FcnJvckNvZGUoc3RkOjptb3ZlKEVycikpOworICByZXR1cm4gc3RkOjptb3ZlKCpFKTsKK30KKworLy8vIFRoaXMgY2xhc3Mgd3JhcHMgYSBzdHJpbmcgaW4gYW4gRXJyb3IuCisvLy8KKy8vLyBTdHJpbmdFcnJvciBpcyB1c2VmdWwgaW4gY2FzZXMgd2hlcmUgdGhlIGNsaWVudCBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgYWJsZQorLy8vIHRvIGNvbnN1bWUgdGhlIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UgcHJvZ3JhbW1hdGljYWxseSAoZm9yIGV4YW1wbGUsIGlmIHRoZQorLy8vIGVycm9yIG1lc3NhZ2UgaXMgdG8gYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyKS4KK2NsYXNzIFN0cmluZ0Vycm9yIDogcHVibGljIEVycm9ySW5mbzxTdHJpbmdFcnJvcj4geworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBTdHJpbmdFcnJvcihjb25zdCBUd2luZSAmUywgc3RkOjplcnJvcl9jb2RlIEVDKTsKKworICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OmVycm9yX2NvZGUgY29udmVydFRvRXJyb3JDb2RlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE1lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBNc2c7IH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgTXNnOworICBzdGQ6OmVycm9yX2NvZGUgRUM7Cit9OworCisvLy8gSGVscGVyIGZvciBjaGVjay1hbmQtZXhpdCBlcnJvciBoYW5kbGluZy4KKy8vLworLy8vIEZvciB0b29sIHVzZSBvbmx5LiBOT1QgRk9SIFVTRSBJTiBMSUJSQVJZIENPREUuCisvLy8KK2NsYXNzIEV4aXRPbkVycm9yIHsKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZSBhbiBlcnJvciBvbiBleGl0IGhlbHBlci4KKyAgRXhpdE9uRXJyb3Ioc3RkOjpzdHJpbmcgQmFubmVyID0gIiIsIGludCBEZWZhdWx0RXJyb3JFeGl0Q29kZSA9IDEpCisgICAgICA6IEJhbm5lcihzdGQ6Om1vdmUoQmFubmVyKSksCisgICAgICAgIEdldEV4aXRDb2RlKFs9XShjb25zdCBFcnJvciAmKSB7IHJldHVybiBEZWZhdWx0RXJyb3JFeGl0Q29kZTsgfSkge30KKworICAvLy8gU2V0IHRoZSBiYW5uZXIgc3RyaW5nIGZvciBhbnkgZXJyb3JzIGNhdWdodCBieSBvcGVyYXRvcigpLgorICB2b2lkIHNldEJhbm5lcihzdGQ6OnN0cmluZyBCYW5uZXIpIHsgdGhpcy0+QmFubmVyID0gc3RkOjptb3ZlKEJhbm5lcik7IH0KKworICAvLy8gU2V0IHRoZSBleGl0LWNvZGUgbWFwcGVyIGZ1bmN0aW9uLgorICB2b2lkIHNldEV4aXRDb2RlTWFwcGVyKHN0ZDo6ZnVuY3Rpb248aW50KGNvbnN0IEVycm9yICYpPiBHZXRFeGl0Q29kZSkgeworICAgIHRoaXMtPkdldEV4aXRDb2RlID0gc3RkOjptb3ZlKEdldEV4aXRDb2RlKTsKKyAgfQorCisgIC8vLyBDaGVjayBFcnIuIElmIGl0J3MgaW4gYSBmYWlsdXJlIHN0YXRlIGxvZyB0aGUgZXJyb3IocykgYW5kIGV4aXQuCisgIHZvaWQgb3BlcmF0b3IoKShFcnJvciBFcnIpIGNvbnN0IHsgY2hlY2tFcnJvcihzdGQ6Om1vdmUoRXJyKSk7IH0KKworICAvLy8gQ2hlY2sgRS4gSWYgaXQncyBpbiBhIHN1Y2Nlc3Mgc3RhdGUgdGhlbiByZXR1cm4gdGhlIGNvbnRhaW5lZCB2YWx1ZS4gSWYKKyAgLy8vIGl0J3MgaW4gYSBmYWlsdXJlIHN0YXRlIGxvZyB0aGUgZXJyb3IocykgYW5kIGV4aXQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIG9wZXJhdG9yKCkoRXhwZWN0ZWQ8VD4gJiZFKSBjb25zdCB7CisgICAgY2hlY2tFcnJvcihFLnRha2VFcnJvcigpKTsKKyAgICByZXR1cm4gc3RkOjptb3ZlKCpFKTsKKyAgfQorCisgIC8vLyBDaGVjayBFLiBJZiBpdCdzIGluIGEgc3VjY2VzcyBzdGF0ZSB0aGVuIHJldHVybiB0aGUgY29udGFpbmVkIHJlZmVyZW5jZS4gSWYKKyAgLy8vIGl0J3MgaW4gYSBmYWlsdXJlIHN0YXRlIGxvZyB0aGUgZXJyb3IocykgYW5kIGV4aXQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUJiBvcGVyYXRvcigpKEV4cGVjdGVkPFQmPiAmJkUpIGNvbnN0IHsKKyAgICBjaGVja0Vycm9yKEUudGFrZUVycm9yKCkpOworICAgIHJldHVybiAqRTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIGNoZWNrRXJyb3IoRXJyb3IgRXJyKSBjb25zdCB7CisgICAgaWYgKEVycikgeworICAgICAgaW50IEV4aXRDb2RlID0gR2V0RXhpdENvZGUoRXJyKTsKKyAgICAgIGxvZ0FsbFVuaGFuZGxlZEVycm9ycyhzdGQ6Om1vdmUoRXJyKSwgZXJycygpLCBCYW5uZXIpOworICAgICAgZXhpdChFeGl0Q29kZSk7CisgICAgfQorICB9CisKKyAgc3RkOjpzdHJpbmcgQmFubmVyOworICBzdGQ6OmZ1bmN0aW9uPGludChjb25zdCBFcnJvciAmKT4gR2V0RXhpdENvZGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0VSUk9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Y2JmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oCkBAIC0wLDAgKzEsMTQ0IEBACisvLz09PS0gbGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCAtIEZhdGFsIGVycm9yIGhhbmRsaW5nIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFuIEFQSSB1c2VkIHRvIGluZGljYXRlIGZhdGFsIGVycm9yIGNvbmRpdGlvbnMuICBOb24tZmF0YWwKKy8vIGVycm9ycyAobW9zdCBvZiB0aGVtKSBzaG91bGQgYmUgaGFuZGxlZCB0aHJvdWdoIExMVk1Db250ZXh0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0VSUk9SSEFORExJTkdfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfRVJST1JIQU5ETElOR19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFN0cmluZ1JlZjsKKyAgY2xhc3MgVHdpbmU7CisKKyAgLy8vIEFuIGVycm9yIGhhbmRsZXIgY2FsbGJhY2suCisgIHR5cGVkZWYgdm9pZCAoKmZhdGFsX2Vycm9yX2hhbmRsZXJfdCkodm9pZCAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBnZW5fY3Jhc2hfZGlhZyk7CisKKyAgLy8vIGluc3RhbGxfZmF0YWxfZXJyb3JfaGFuZGxlciAtIEluc3RhbGxzIGEgbmV3IGVycm9yIGhhbmRsZXIgdG8gYmUgdXNlZAorICAvLy8gd2hlbmV2ZXIgYSBzZXJpb3VzIChub24tcmVjb3ZlcmFibGUpIGVycm9yIGlzIGVuY291bnRlcmVkIGJ5IExMVk0uCisgIC8vLworICAvLy8gSWYgbm8gZXJyb3IgaGFuZGxlciBpcyBpbnN0YWxsZWQgdGhlIGRlZmF1bHQgaXMgdG8gcHJpbnQgdGhlIGVycm9yIG1lc3NhZ2UKKyAgLy8vIHRvIHN0ZGVyciwgYW5kIGNhbGwgZXhpdCgxKS4gIElmIGFuIGVycm9yIGhhbmRsZXIgaXMgaW5zdGFsbGVkIHRoZW4gaXQgaXMKKyAgLy8vIHRoZSBoYW5kbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gbG9nIHRoZSBtZXNzYWdlLCBpdCB3aWxsIG5vIGxvbmdlciBiZQorICAvLy8gcHJpbnRlZCB0byBzdGRlcnIuICBJZiB0aGUgZXJyb3IgaGFuZGxlciByZXR1cm5zLCB0aGVuIGV4aXQoMSkgd2lsbCBiZQorICAvLy8gY2FsbGVkLgorICAvLy8KKyAgLy8vIEl0IGlzIGRhbmdlcm91cyB0byBuYWl2ZWx5IHVzZSBhbiBlcnJvciBoYW5kbGVyIHdoaWNoIHRocm93cyBhbiBleGNlcHRpb24uCisgIC8vLyBFdmVuIHRob3VnaCBzb21lIGFwcGxpY2F0aW9ucyBkZXNpcmUgdG8gZ3JhY2VmdWxseSByZWNvdmVyIGZyb20gYXJiaXRyYXJ5CisgIC8vLyBmYXVsdHMsIGJsaW5kbHkgdGhyb3dpbmcgZXhjZXB0aW9ucyB0aHJvdWdoIHVuZmFtaWxpYXIgY29kZSBpc24ndCBhIHdheSB0bworICAvLy8gYWNoaWV2ZSB0aGlzLgorICAvLy8KKyAgLy8vIFxwYXJhbSB1c2VyX2RhdGEgLSBBbiBhcmd1bWVudCB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgaW5zdGFsbCBlcnJvcgorICAvLy8gaGFuZGxlci4KKyAgdm9pZCBpbnN0YWxsX2ZhdGFsX2Vycm9yX2hhbmRsZXIoZmF0YWxfZXJyb3JfaGFuZGxlcl90IGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSA9IG51bGxwdHIpOworCisgIC8vLyBSZXN0b3JlcyBkZWZhdWx0IGVycm9yIGhhbmRsaW5nIGJlaGF2aW91ci4KKyAgdm9pZCByZW1vdmVfZmF0YWxfZXJyb3JfaGFuZGxlcigpOworCisgIC8vLyBTY29wZWRGYXRhbEVycm9ySGFuZGxlciAtIFRoaXMgaXMgYSBzaW1wbGUgaGVscGVyIGNsYXNzIHdoaWNoIGp1c3QKKyAgLy8vIGNhbGxzIGluc3RhbGxfZmF0YWxfZXJyb3JfaGFuZGxlciBpbiBpdHMgY29uc3RydWN0b3IgYW5kCisgIC8vLyByZW1vdmVfZmF0YWxfZXJyb3JfaGFuZGxlciBpbiBpdHMgZGVzdHJ1Y3Rvci4KKyAgc3RydWN0IFNjb3BlZEZhdGFsRXJyb3JIYW5kbGVyIHsKKyAgICBleHBsaWNpdCBTY29wZWRGYXRhbEVycm9ySGFuZGxlcihmYXRhbF9lcnJvcl9oYW5kbGVyX3QgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEgPSBudWxscHRyKSB7CisgICAgICBpbnN0YWxsX2ZhdGFsX2Vycm9yX2hhbmRsZXIoaGFuZGxlciwgdXNlcl9kYXRhKTsKKyAgICB9CisKKyAgICB+U2NvcGVkRmF0YWxFcnJvckhhbmRsZXIoKSB7IHJlbW92ZV9mYXRhbF9lcnJvcl9oYW5kbGVyKCk7IH0KKyAgfTsKKworLy8vIFJlcG9ydHMgYSBzZXJpb3VzIGVycm9yLCBjYWxsaW5nIGFueSBpbnN0YWxsZWQgZXJyb3IgaGFuZGxlci4gVGhlc2UKKy8vLyBmdW5jdGlvbnMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGVycm9yIGNvbmRpdGlvbnMgd2hpY2ggYXJlIG91dHNpZGUKKy8vLyB0aGUgY29udHJvbCBvZiB0aGUgY29tcGlsZXIgKEkvTyBlcnJvcnMsIGludmFsaWQgdXNlciBpbnB1dCwgZXRjLikKKy8vLworLy8vIElmIG5vIGVycm9yIGhhbmRsZXIgaXMgaW5zdGFsbGVkIHRoZSBkZWZhdWx0IGlzIHRvIHByaW50IHRoZSBtZXNzYWdlIHRvCisvLy8gc3RhbmRhcmQgZXJyb3IsIGZvbGxvd2VkIGJ5IGEgbmV3bGluZS4KKy8vLyBBZnRlciB0aGUgZXJyb3IgaGFuZGxlciBpcyBjYWxsZWQgdGhpcyBmdW5jdGlvbiB3aWxsIGNhbGwgZXhpdCgxKSwgaXQKKy8vLyBkb2VzIG5vdCByZXR1cm4uCitMTFZNX0FUVFJJQlVURV9OT1JFVFVSTiB2b2lkIHJlcG9ydF9mYXRhbF9lcnJvcihjb25zdCBjaGFyICpyZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGdlbl9jcmFzaF9kaWFnID0gdHJ1ZSk7CitMTFZNX0FUVFJJQlVURV9OT1JFVFVSTiB2b2lkIHJlcG9ydF9mYXRhbF9lcnJvcihjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBnZW5fY3Jhc2hfZGlhZyA9IHRydWUpOworTExWTV9BVFRSSUJVVEVfTk9SRVRVUk4gdm9pZCByZXBvcnRfZmF0YWxfZXJyb3IoU3RyaW5nUmVmIHJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZ2VuX2NyYXNoX2RpYWcgPSB0cnVlKTsKK0xMVk1fQVRUUklCVVRFX05PUkVUVVJOIHZvaWQgcmVwb3J0X2ZhdGFsX2Vycm9yKGNvbnN0IFR3aW5lICZyZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGdlbl9jcmFzaF9kaWFnID0gdHJ1ZSk7CisKKy8vLyBJbnN0YWxscyBhIG5ldyBiYWQgYWxsb2MgZXJyb3IgaGFuZGxlciB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW5ldmVyIGEKKy8vLyBiYWQgYWxsb2MgZXJyb3IsIGUuZy4gZmFpbGluZyBtYWxsb2MvY2FsbG9jLCBpcyBlbmNvdW50ZXJlZCBieSBMTFZNLgorLy8vCisvLy8gVGhlIHVzZXIgY2FuIGluc3RhbGwgYSBiYWQgYWxsb2MgaGFuZGxlciwgaW4gb3JkZXIgdG8gZGVmaW5lIHRoZSBiZWhhdmlvcgorLy8vIGluIGNhc2Ugb2YgZmFpbGluZyBhbGxvY2F0aW9ucywgZS5nLiB0aHJvd2luZyBhbiBleGNlcHRpb24uIE5vdGUgdGhhdCB0aGlzCisvLy8gaGFuZGxlciBtdXN0IG5vdCB0cmlnZ2VyIGFueSBhZGRpdGlvbmFsIGFsbG9jYXRpb25zIGl0c2VsZi4KKy8vLworLy8vIElmIG5vIGVycm9yIGhhbmRsZXIgaXMgaW5zdGFsbGVkIHRoZSBkZWZhdWx0IGlzIHRvIHByaW50IHRoZSBlcnJvciBtZXNzYWdlCisvLy8gdG8gc3RkZXJyLCBhbmQgY2FsbCBleGl0KDEpLiAgSWYgYW4gZXJyb3IgaGFuZGxlciBpcyBpbnN0YWxsZWQgdGhlbiBpdCBpcworLy8vIHRoZSBoYW5kbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gbG9nIHRoZSBtZXNzYWdlLCBpdCB3aWxsIG5vIGxvbmdlciBiZQorLy8vIHByaW50ZWQgdG8gc3RkZXJyLiAgSWYgdGhlIGVycm9yIGhhbmRsZXIgcmV0dXJucywgdGhlbiBleGl0KDEpIHdpbGwgYmUKKy8vLyBjYWxsZWQuCisvLy8KKy8vLworLy8vIFxwYXJhbSB1c2VyX2RhdGEgLSBBbiBhcmd1bWVudCB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgaW5zdGFsbGVkIGVycm9yCisvLy8gaGFuZGxlci4KK3ZvaWQgaW5zdGFsbF9iYWRfYWxsb2NfZXJyb3JfaGFuZGxlcihmYXRhbF9lcnJvcl9oYW5kbGVyX3QgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEgPSBudWxscHRyKTsKKworLy8vIFJlc3RvcmVzIGRlZmF1bHQgYmFkIGFsbG9jIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yLgordm9pZCByZW1vdmVfYmFkX2FsbG9jX2Vycm9yX2hhbmRsZXIoKTsKKwordm9pZCBpbnN0YWxsX291dF9vZl9tZW1vcnlfbmV3X2hhbmRsZXIoKTsKKworLy8vIFJlcG9ydHMgYSBiYWQgYWxsb2MgZXJyb3IsIGNhbGxpbmcgYW55IHVzZXIgZGVmaW5lZCBiYWQgYWxsb2MKKy8vLyBlcnJvciBoYW5kbGVyLiBJbiBjb250cmFzdCB0byB0aGUgZ2VuZXJpYyAncmVwb3J0X2ZhdGFsX2Vycm9yJworLy8vIGZ1bmN0aW9ucywgdGhpcyBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byByZXR1cm4sIGUuZy4gdGhlIHVzZXIKKy8vLyBkZWZpbmVkIGVycm9yIGhhbmRsZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KKy8vLworLy8vIE5vdGU6IFdoZW4gdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGluIHRoZSBiYWQgYWxsb2MgaGFuZGxlciwgbWFrZSBzdXJlIHRoYXQKKy8vLyB0aGUgZm9sbG93aW5nIHVud2luZCBzdWNjZWVkcywgZS5nLiBkbyBub3QgdHJpZ2dlciBhZGRpdGlvbmFsIGFsbG9jYXRpb25zCisvLy8gaW4gdGhlIHVud2luZCBjaGFpbi4KKy8vLworLy8vIElmIG5vIGVycm9yIGhhbmRsZXIgaXMgaW5zdGFsbGVkIChkZWZhdWx0KSwgdGhlbiBhIGJhZF9hbGxvYyBleGNlcHRpb24KKy8vLyBpcyB0aHJvd24sIGlmIExMVk0gaXMgY29tcGlsZWQgd2l0aCBleGNlcHRpb24gc3VwcG9ydCwgb3RoZXJ3aXNlIGFuIGFzc2VydGlvbgorLy8vIGlzIGNhbGxlZC4KK3ZvaWQgcmVwb3J0X2JhZF9hbGxvY19lcnJvcihjb25zdCBjaGFyICpSZWFzb24sIGJvb2wgR2VuQ3Jhc2hEaWFnID0gdHJ1ZSk7CisKKy8vLyBUaGlzIGZ1bmN0aW9uIGNhbGxzIGFib3J0KCksIGFuZCBwcmludHMgdGhlIG9wdGlvbmFsIG1lc3NhZ2UgdG8gc3RkZXJyLgorLy8vIFVzZSB0aGUgbGx2bV91bnJlYWNoYWJsZSBtYWNybyAodGhhdCBhZGRzIGxvY2F0aW9uIGluZm8pLCBpbnN0ZWFkIG9mCisvLy8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LgorTExWTV9BVFRSSUJVVEVfTk9SRVRVUk4gdm9pZAorbGx2bV91bnJlYWNoYWJsZV9pbnRlcm5hbChjb25zdCBjaGFyICptc2cgPSBudWxscHRyLCBjb25zdCBjaGFyICpmaWxlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGluZSA9IDApOworfQorCisvLy8gTWFya3MgdGhhdCB0aGUgY3VycmVudCBsb2NhdGlvbiBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgcmVhY2hhYmxlLgorLy8vIEluICFOREVCVUcgYnVpbGRzLCBwcmludHMgdGhlIG1lc3NhZ2UgYW5kIGxvY2F0aW9uIGluZm8gdG8gc3RkZXJyLgorLy8vIEluIE5ERUJVRyBidWlsZHMsIGJlY29tZXMgYW4gb3B0aW1pemVyIGhpbnQgdGhhdCB0aGUgY3VycmVudCBsb2NhdGlvbgorLy8vIGlzIG5vdCBzdXBwb3NlZCB0byBiZSByZWFjaGFibGUuICBPbiBjb21waWxlcnMgdGhhdCBkb24ndCBzdXBwb3J0CisvLy8gc3VjaCBoaW50cywgcHJpbnRzIGEgcmVkdWNlZCBtZXNzYWdlIGluc3RlYWQuCisvLy8KKy8vLyBVc2UgdGhpcyBpbnN0ZWFkIG9mIGFzc2VydCgwKS4gIEl0IGNvbnZleXMgaW50ZW50IG1vcmUgY2xlYXJseSBhbmQKKy8vLyBhbGxvd3MgY29tcGlsZXJzIHRvIG9taXQgc29tZSB1bm5lY2Vzc2FyeSBjb2RlLgorI2lmbmRlZiBOREVCVUcKKyNkZWZpbmUgbGx2bV91bnJlYWNoYWJsZShtc2cpIFwKKyAgOjpsbHZtOjpsbHZtX3VucmVhY2hhYmxlX2ludGVybmFsKG1zZywgX19GSUxFX18sIF9fTElORV9fKQorI2VsaWYgZGVmaW5lZChMTFZNX0JVSUxUSU5fVU5SRUFDSEFCTEUpCisjZGVmaW5lIGxsdm1fdW5yZWFjaGFibGUobXNnKSBMTFZNX0JVSUxUSU5fVU5SRUFDSEFCTEUKKyNlbHNlCisjZGVmaW5lIGxsdm1fdW5yZWFjaGFibGUobXNnKSA6Omxsdm06Omxsdm1fdW5yZWFjaGFibGVfaW50ZXJuYWwoKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Vycm9yT3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FcnJvck9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxZmI2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FcnJvck9yLmgKQEAgLTAsMCArMSwyOTEgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvRXJyb3JPci5oIC0gRXJyb3IgU21hcnQgUG9pbnRlciAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIExpbmtlcgorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vCisvLy8gUHJvdmlkZXMgRXJyb3JPcjxUPiBzbWFydCBwb2ludGVyLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9FUlJPUk9SX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0VSUk9ST1JfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsaWduT2YuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgU3RvcmVzIGEgcmVmZXJlbmNlIHRoYXQgY2FuIGJlIGNoYW5nZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFJlZmVyZW5jZVN0b3JhZ2UgeworICBUICpTdG9yYWdlOworCitwdWJsaWM6CisgIFJlZmVyZW5jZVN0b3JhZ2UoVCAmUmVmKSA6IFN0b3JhZ2UoJlJlZikge30KKworICBvcGVyYXRvciBUICYoKSBjb25zdCB7IHJldHVybiAqU3RvcmFnZTsgfQorICBUICZnZXQoKSBjb25zdCB7IHJldHVybiAqU3RvcmFnZTsgfQorfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGVpdGhlciBhbiBlcnJvciBvciBhIHZhbHVlIFQuCisvLy8KKy8vLyBFcnJvck9yPFQ+IGlzIGEgcG9pbnRlci1saWtlIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGFuCisvLy8gb3BlcmF0aW9uLiBUaGUgcmVzdWx0IGlzIGVpdGhlciBhbiBlcnJvciwgb3IgYSB2YWx1ZSBvZiB0eXBlIFQuIFRoaXMgaXMKKy8vLyBkZXNpZ25lZCB0byBlbXVsYXRlIHRoZSB1c2FnZSBvZiByZXR1cm5pbmcgYSBwb2ludGVyIHdoZXJlIG51bGxwdHIgaW5kaWNhdGVzCisvLy8gZmFpbHVyZS4gSG93ZXZlciBpbnN0ZWFkIG9mIGp1c3Qga25vd2luZyB0aGF0IHRoZSBvcGVyYXRpb24gZmFpbGVkLCB3ZSBhbHNvCisvLy8gaGF2ZSBhbiBlcnJvcl9jb2RlIGFuZCBvcHRpb25hbCB1c2VyIGRhdGEgdGhhdCBkZXNjcmliZXMgd2h5IGl0IGZhaWxlZC4KKy8vLworLy8vIEl0IGlzIHVzZWQgbGlrZSB0aGUgZm9sbG93aW5nLgorLy8vIFxjb2RlCisvLy8gICBFcnJvck9yPEJ1ZmZlcj4gZ2V0QnVmZmVyKCk7CisvLy8KKy8vLyAgIGF1dG8gYnVmZmVyID0gZ2V0QnVmZmVyKCk7CisvLy8gICBpZiAoZXJyb3JfY29kZSBlYyA9IGJ1ZmZlci5nZXRFcnJvcigpKQorLy8vICAgICByZXR1cm4gZWM7CisvLy8gICBidWZmZXItPndyaXRlKCJhZGVuYSIpOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLworLy8vIEltcGxpY2l0IGNvbnZlcnNpb24gdG8gYm9vbCByZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSB1c2FibGUgdmFsdWUuIFRoZQorLy8vIHVuYXJ5ICogYW5kIC0+IG9wZXJhdG9ycyBwcm92aWRlIHBvaW50ZXIgbGlrZSBhY2Nlc3MgdG8gdGhlIHZhbHVlLiBBY2Nlc3NpbmcKKy8vLyB0aGUgdmFsdWUgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBoYXMgdW5kZWZpbmVkIGJlaGF2aW9yLgorLy8vCisvLy8gV2hlbiBUIGlzIGEgcmVmZXJlbmNlIHR5cGUgdGhlIGJlaGF2aW9yIGlzIHNsaWdodGx5IGRpZmZlcmVudC4gVGhlIHJlZmVyZW5jZQorLy8vIGlzIGhlbGQgaW4gYSBzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZT4sIGFuZAorLy8vIHRoZXJlIGlzIHNwZWNpYWwgaGFuZGxpbmcgdG8gbWFrZSBvcGVyYXRvciAtPiB3b3JrIGFzIGlmIFQgd2FzIG5vdCBhCisvLy8gcmVmZXJlbmNlLgorLy8vCisvLy8gVCBjYW5ub3QgYmUgYSBydmFsdWUgcmVmZXJlbmNlLgordGVtcGxhdGU8Y2xhc3MgVD4KK2NsYXNzIEVycm9yT3IgeworICB0ZW1wbGF0ZSA8Y2xhc3MgT3RoZXJUPiBmcmllbmQgY2xhc3MgRXJyb3JPcjsKKworICBzdGF0aWMgY29uc3QgYm9vbCBpc1JlZiA9IHN0ZDo6aXNfcmVmZXJlbmNlPFQ+Ojp2YWx1ZTsKKworICB1c2luZyB3cmFwID0gUmVmZXJlbmNlU3RvcmFnZTx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGU+OworCitwdWJsaWM6CisgIHVzaW5nIHN0b3JhZ2VfdHlwZSA9IHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8aXNSZWYsIHdyYXAsIFQ+Ojp0eXBlOworCitwcml2YXRlOgorICB1c2luZyByZWZlcmVuY2UgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGUgJjsKKyAgdXNpbmcgY29uc3RfcmVmZXJlbmNlID0gY29uc3QgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlICY7CisgIHVzaW5nIHBvaW50ZXIgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGUgKjsKKyAgdXNpbmcgY29uc3RfcG9pbnRlciA9IGNvbnN0IHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZSAqOworCitwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBFPgorICBFcnJvck9yKEUgRXJyb3JDb2RlLAorICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfZXJyb3JfY29kZV9lbnVtPEU+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2Vycm9yX2NvbmRpdGlvbl9lbnVtPEU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICo+Ojp0eXBlID0gbnVsbHB0cikKKyAgICAgIDogSGFzRXJyb3IodHJ1ZSkgeworICAgIG5ldyAoZ2V0RXJyb3JTdG9yYWdlKCkpIHN0ZDo6ZXJyb3JfY29kZShtYWtlX2Vycm9yX2NvZGUoRXJyb3JDb2RlKSk7CisgIH0KKworICBFcnJvck9yKHN0ZDo6ZXJyb3JfY29kZSBFQykgOiBIYXNFcnJvcih0cnVlKSB7CisgICAgbmV3IChnZXRFcnJvclN0b3JhZ2UoKSkgc3RkOjplcnJvcl9jb2RlKEVDKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclQ+CisgIEVycm9yT3IoT3RoZXJUICYmVmFsLAorICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8T3RoZXJULCBUPjo6dmFsdWU+Ojp0eXBlCisgICAgICAgICAgICAgICogPSBudWxscHRyKQorICAgICAgOiBIYXNFcnJvcihmYWxzZSkgeworICAgIG5ldyAoZ2V0U3RvcmFnZSgpKSBzdG9yYWdlX3R5cGUoc3RkOjpmb3J3YXJkPE90aGVyVD4oVmFsKSk7CisgIH0KKworICBFcnJvck9yKGNvbnN0IEVycm9yT3IgJk90aGVyKSB7CisgICAgY29weUNvbnN0cnVjdChPdGhlcik7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgT3RoZXJUPgorICBFcnJvck9yKAorICAgICAgY29uc3QgRXJyb3JPcjxPdGhlclQ+ICZPdGhlciwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8T3RoZXJULCBUPjo6dmFsdWU+Ojp0eXBlICogPQorICAgICAgICAgIG51bGxwdHIpIHsKKyAgICBjb3B5Q29uc3RydWN0KE90aGVyKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclQ+CisgIGV4cGxpY2l0IEVycm9yT3IoCisgICAgICBjb25zdCBFcnJvck9yPE90aGVyVD4gJk90aGVyLAorICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgIXN0ZDo6aXNfY29udmVydGlibGU8T3RoZXJULCBjb25zdCBUICY+Ojp2YWx1ZT46OnR5cGUgKiA9IG51bGxwdHIpIHsKKyAgICBjb3B5Q29uc3RydWN0KE90aGVyKTsKKyAgfQorCisgIEVycm9yT3IoRXJyb3JPciAmJk90aGVyKSB7CisgICAgbW92ZUNvbnN0cnVjdChzdGQ6Om1vdmUoT3RoZXIpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclQ+CisgIEVycm9yT3IoCisgICAgICBFcnJvck9yPE90aGVyVD4gJiZPdGhlciwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8T3RoZXJULCBUPjo6dmFsdWU+Ojp0eXBlICogPQorICAgICAgICAgIG51bGxwdHIpIHsKKyAgICBtb3ZlQ29uc3RydWN0KHN0ZDo6bW92ZShPdGhlcikpOworICB9CisKKyAgLy8gVGhpcyBtaWdodCBldmVudHVhbGx5IG5lZWQgU0ZJTkFFIGJ1dCBpdCdzIG1vcmUgY29tcGxleCB0aGFuIGlzX2NvbnZlcnRpYmxlCisgIC8vICYgSSdtIHRvbyBsYXp5IHRvIHdyaXRlIGl0IHJpZ2h0IG5vdy4KKyAgdGVtcGxhdGUgPGNsYXNzIE90aGVyVD4KKyAgZXhwbGljaXQgRXJyb3JPcigKKyAgICAgIEVycm9yT3I8T3RoZXJUPiAmJk90aGVyLAorICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfY29udmVydGlibGU8T3RoZXJULCBUPjo6dmFsdWU+Ojp0eXBlICogPQorICAgICAgICAgIG51bGxwdHIpIHsKKyAgICBtb3ZlQ29uc3RydWN0KHN0ZDo6bW92ZShPdGhlcikpOworICB9CisKKyAgRXJyb3JPciAmb3BlcmF0b3I9KGNvbnN0IEVycm9yT3IgJk90aGVyKSB7CisgICAgY29weUFzc2lnbihPdGhlcik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgRXJyb3JPciAmb3BlcmF0b3I9KEVycm9yT3IgJiZPdGhlcikgeworICAgIG1vdmVBc3NpZ24oc3RkOjptb3ZlKE90aGVyKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgfkVycm9yT3IoKSB7CisgICAgaWYgKCFIYXNFcnJvcikKKyAgICAgIGdldFN0b3JhZ2UoKS0+fnN0b3JhZ2VfdHlwZSgpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gZmFsc2UgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgcmV0dXJuICFIYXNFcnJvcjsKKyAgfQorCisgIHJlZmVyZW5jZSBnZXQoKSB7IHJldHVybiAqZ2V0U3RvcmFnZSgpOyB9CisgIGNvbnN0X3JlZmVyZW5jZSBnZXQoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PEVycm9yT3I8VD4gKj4odGhpcyktPmdldCgpOyB9CisKKyAgc3RkOjplcnJvcl9jb2RlIGdldEVycm9yKCkgY29uc3QgeworICAgIHJldHVybiBIYXNFcnJvciA/ICpnZXRFcnJvclN0b3JhZ2UoKSA6IHN0ZDo6ZXJyb3JfY29kZSgpOworICB9CisKKyAgcG9pbnRlciBvcGVyYXRvciAtPigpIHsKKyAgICByZXR1cm4gdG9Qb2ludGVyKGdldFN0b3JhZ2UoKSk7CisgIH0KKworICBjb25zdF9wb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiB0b1BvaW50ZXIoZ2V0U3RvcmFnZSgpKTsgfQorCisgIHJlZmVyZW5jZSBvcGVyYXRvciAqKCkgeworICAgIHJldHVybiAqZ2V0U3RvcmFnZSgpOworICB9CisKKyAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpnZXRTdG9yYWdlKCk7IH0KKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIE90aGVyVD4KKyAgdm9pZCBjb3B5Q29uc3RydWN0KGNvbnN0IEVycm9yT3I8T3RoZXJUPiAmT3RoZXIpIHsKKyAgICBpZiAoIU90aGVyLkhhc0Vycm9yKSB7CisgICAgICAvLyBHZXQgdGhlIG90aGVyIHZhbHVlLgorICAgICAgSGFzRXJyb3IgPSBmYWxzZTsKKyAgICAgIG5ldyAoZ2V0U3RvcmFnZSgpKSBzdG9yYWdlX3R5cGUoKk90aGVyLmdldFN0b3JhZ2UoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEdldCBvdGhlcidzIGVycm9yLgorICAgICAgSGFzRXJyb3IgPSB0cnVlOworICAgICAgbmV3IChnZXRFcnJvclN0b3JhZ2UoKSkgc3RkOjplcnJvcl9jb2RlKE90aGVyLmdldEVycm9yKCkpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBUMT4KKyAgc3RhdGljIGJvb2wgY29tcGFyZVRoaXNJZlNhbWVUeXBlKGNvbnN0IFQxICZhLCBjb25zdCBUMSAmYikgeworICAgIHJldHVybiAmYSA9PSAmYjsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+CisgIHN0YXRpYyBib29sIGNvbXBhcmVUaGlzSWZTYW1lVHlwZShjb25zdCBUMSAmYSwgY29uc3QgVDIgJmIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgT3RoZXJUPgorICB2b2lkIGNvcHlBc3NpZ24oY29uc3QgRXJyb3JPcjxPdGhlclQ+ICZPdGhlcikgeworICAgIGlmIChjb21wYXJlVGhpc0lmU2FtZVR5cGUoKnRoaXMsIE90aGVyKSkKKyAgICAgIHJldHVybjsKKworICAgIHRoaXMtPn5FcnJvck9yKCk7CisgICAgbmV3ICh0aGlzKSBFcnJvck9yKE90aGVyKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclQ+CisgIHZvaWQgbW92ZUNvbnN0cnVjdChFcnJvck9yPE90aGVyVD4gJiZPdGhlcikgeworICAgIGlmICghT3RoZXIuSGFzRXJyb3IpIHsKKyAgICAgIC8vIEdldCB0aGUgb3RoZXIgdmFsdWUuCisgICAgICBIYXNFcnJvciA9IGZhbHNlOworICAgICAgbmV3IChnZXRTdG9yYWdlKCkpIHN0b3JhZ2VfdHlwZShzdGQ6Om1vdmUoKk90aGVyLmdldFN0b3JhZ2UoKSkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBHZXQgb3RoZXIncyBlcnJvci4KKyAgICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICAgIG5ldyAoZ2V0RXJyb3JTdG9yYWdlKCkpIHN0ZDo6ZXJyb3JfY29kZShPdGhlci5nZXRFcnJvcigpKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgT3RoZXJUPgorICB2b2lkIG1vdmVBc3NpZ24oRXJyb3JPcjxPdGhlclQ+ICYmT3RoZXIpIHsKKyAgICBpZiAoY29tcGFyZVRoaXNJZlNhbWVUeXBlKCp0aGlzLCBPdGhlcikpCisgICAgICByZXR1cm47CisKKyAgICB0aGlzLT5+RXJyb3JPcigpOworICAgIG5ldyAodGhpcykgRXJyb3JPcihzdGQ6Om1vdmUoT3RoZXIpKTsKKyAgfQorCisgIHBvaW50ZXIgdG9Qb2ludGVyKHBvaW50ZXIgVmFsKSB7CisgICAgcmV0dXJuIFZhbDsKKyAgfQorCisgIGNvbnN0X3BvaW50ZXIgdG9Qb2ludGVyKGNvbnN0X3BvaW50ZXIgVmFsKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKworICBwb2ludGVyIHRvUG9pbnRlcih3cmFwICpWYWwpIHsKKyAgICByZXR1cm4gJlZhbC0+Z2V0KCk7CisgIH0KKworICBjb25zdF9wb2ludGVyIHRvUG9pbnRlcihjb25zdCB3cmFwICpWYWwpIGNvbnN0IHsgcmV0dXJuICZWYWwtPmdldCgpOyB9CisKKyAgc3RvcmFnZV90eXBlICpnZXRTdG9yYWdlKCkgeworICAgIGFzc2VydCghSGFzRXJyb3IgJiYgIkNhbm5vdCBnZXQgdmFsdWUgd2hlbiBhbiBlcnJvciBleGlzdHMhIik7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8c3RvcmFnZV90eXBlKj4oVFN0b3JhZ2UuYnVmZmVyKTsKKyAgfQorCisgIGNvbnN0IHN0b3JhZ2VfdHlwZSAqZ2V0U3RvcmFnZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIUhhc0Vycm9yICYmICJDYW5ub3QgZ2V0IHZhbHVlIHdoZW4gYW4gZXJyb3IgZXhpc3RzISIpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHN0b3JhZ2VfdHlwZSo+KFRTdG9yYWdlLmJ1ZmZlcik7CisgIH0KKworICBzdGQ6OmVycm9yX2NvZGUgKmdldEVycm9yU3RvcmFnZSgpIHsKKyAgICBhc3NlcnQoSGFzRXJyb3IgJiYgIkNhbm5vdCBnZXQgZXJyb3Igd2hlbiBhIHZhbHVlIGV4aXN0cyEiKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxzdGQ6OmVycm9yX2NvZGUgKj4oRXJyb3JTdG9yYWdlLmJ1ZmZlcik7CisgIH0KKworICBjb25zdCBzdGQ6OmVycm9yX2NvZGUgKmdldEVycm9yU3RvcmFnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFcnJvck9yPFQ+ICo+KHRoaXMpLT5nZXRFcnJvclN0b3JhZ2UoKTsKKyAgfQorCisgIHVuaW9uIHsKKyAgICBBbGlnbmVkQ2hhckFycmF5VW5pb248c3RvcmFnZV90eXBlPiBUU3RvcmFnZTsKKyAgICBBbGlnbmVkQ2hhckFycmF5VW5pb248c3RkOjplcnJvcl9jb2RlPiBFcnJvclN0b3JhZ2U7CisgIH07CisgIGJvb2wgSGFzRXJyb3IgOiAxOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEU+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Vycm9yX2NvZGVfZW51bTxFPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2Vycm9yX2NvbmRpdGlvbl9lbnVtPEU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2w+Ojp0eXBlCitvcGVyYXRvcj09KGNvbnN0IEVycm9yT3I8VD4gJkVyciwgRSBDb2RlKSB7CisgIHJldHVybiBFcnIuZ2V0RXJyb3IoKSA9PSBDb2RlOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0VSUk9ST1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0ZpbGVPdXRwdXRCdWZmZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9GaWxlT3V0cHV0QnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFlZDQyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9GaWxlT3V0cHV0QnVmZmVyLmgKQEAgLTAsMCArMSw3NCBAQAorLy89PT0gRmlsZU91dHB1dEJ1ZmZlci5oIC0gRmlsZSBPdXRwdXQgQnVmZmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBVdGlsaXR5IGZvciBjcmVhdGluZyBhIGluLW1lbW9yeSBidWZmZXIgdGhhdCB3aWxsIGJlIHdyaXR0ZW4gdG8gYSBmaWxlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0ZJTEVPVVRQVVRCVUZGRVJfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfRklMRU9VVFBVVEJVRkZFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisvLy8gRmlsZU91dHB1dEJ1ZmZlciAtIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHNpbXBsZSB3YXkgdG8gY3JlYXRlIGFuIGluLW1lbW9yeQorLy8vIGJ1ZmZlciB3aGljaCB3aWxsIGJlIHdyaXR0ZW4gdG8gYSBmaWxlLiBEdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZXNlCisvLy8gb2JqZWN0cywgdGhlIGNvbnRlbnQgb3IgZXhpc3RlbmNlIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSBpcyB1bmRlZmluZWQuIFRoYXQKKy8vLyBpcywgY3JlYXRpbmcgYW4gT3V0cHV0QnVmZmVyIGZvciBhIGZpbGUgbWF5IGltbWVkaWF0ZWx5IHJlbW92ZSB0aGUgZmlsZS4KKy8vLyBJZiB0aGUgRmlsZU91dHB1dEJ1ZmZlciBpcyBjb21taXR0ZWQsIHRoZSB0YXJnZXQgZmlsZSdzIGNvbnRlbnQgd2lsbCBiZWNvbWUKKy8vLyB0aGUgYnVmZmVyIGNvbnRlbnQgYXQgdGhlIHRpbWUgb2YgdGhlIGNvbW1pdC4gIElmIHRoZSBGaWxlT3V0cHV0QnVmZmVyIGlzCisvLy8gbm90IGNvbW1pdHRlZCwgdGhlIGZpbGUgd2lsbCBiZSBkZWxldGVkIGluIHRoZSBGaWxlT3V0cHV0QnVmZmVyIGRlc3RydWN0b3IuCitjbGFzcyBGaWxlT3V0cHV0QnVmZmVyIHsKK3B1YmxpYzoKKyAgZW51bSAgeworICAgIEZfZXhlY3V0YWJsZSA9IDEgIC8vLyBzZXQgdGhlICd4JyBiaXQgb24gdGhlIHJlc3VsdGluZyBmaWxlCisgIH07CisKKyAgLy8vIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbiBPdXRwdXRCdWZmZXIgb2JqZWN0IHdoaWNoIG1hbmFnZXMgYSByZWFkL3dyaXRlCisgIC8vLyBidWZmZXIgb2YgdGhlIHNwZWNpZmllZCBzaXplLiBXaGVuIGNvbW1pdHRlZCwgdGhlIGJ1ZmZlciB3aWxsIGJlIHdyaXR0ZW4KKyAgLy8vIHRvIHRoZSBmaWxlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4KKyAgc3RhdGljIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxGaWxlT3V0cHV0QnVmZmVyPj4KKyAgY3JlYXRlKFN0cmluZ1JlZiBGaWxlUGF0aCwgc2l6ZV90IFNpemUsIHVuc2lnbmVkIEZsYWdzID0gMCk7CisKKyAgLy8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLgorICB2aXJ0dWFsIHVpbnQ4X3QgKmdldEJ1ZmZlclN0YXJ0KCkgY29uc3QgPSAwOworCisgIC8vLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgIHZpcnR1YWwgdWludDhfdCAqZ2V0QnVmZmVyRW5kKCkgY29uc3QgPSAwOworCisgIC8vLyBSZXR1cm5zIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAgdmlydHVhbCBzaXplX3QgZ2V0QnVmZmVyU2l6ZSgpIGNvbnN0ID0gMDsKKworICAvLy8gUmV0dXJucyBwYXRoIHdoZXJlIGZpbGUgd2lsbCBzaG93IHVwIGlmIGJ1ZmZlciBpcyBjb21taXR0ZWQuCisgIFN0cmluZ1JlZiBnZXRQYXRoKCkgY29uc3QgeyByZXR1cm4gRmluYWxQYXRoOyB9CisKKyAgLy8vIEZsdXNoZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlciB0byBpdHMgZmlsZSBhbmQgZGVhbGxvY2F0ZXMgdGhlCisgIC8vLyBidWZmZXIuICBJZiBjb21taXQoKSBpcyBub3QgY2FsbGVkIGJlZm9yZSB0aGlzIG9iamVjdCdzIGRlc3RydWN0b3IKKyAgLy8vIGlzIGNhbGxlZCwgdGhlIGZpbGUgaXMgZGVsZXRlZCBpbiB0aGUgZGVzdHJ1Y3Rvci4gVGhlIG9wdGlvbmFsIHBhcmFtZXRlcgorICAvLy8gaXMgdXNlZCBpZiBpdCB0dXJucyBvdXQgeW91IHdhbnQgdGhlIGZpbGUgc2l6ZSB0byBiZSBzbWFsbGVyIHRoYW4KKyAgLy8vIGluaXRpYWxseSByZXF1ZXN0ZWQuCisgIHZpcnR1YWwgRXJyb3IgY29tbWl0KCkgPSAwOworCisgIC8vLyBJZiB0aGlzIG9iamVjdCB3YXMgcHJldmlvdXNseSBjb21taXR0ZWQsIHRoZSBkZXN0cnVjdG9yIGp1c3QgZGVsZXRlcworICAvLy8gdGhpcyBvYmplY3QuICBJZiB0aGlzIG9iamVjdCB3YXMgbm90IGNvbW1pdHRlZCwgdGhlIGRlc3RydWN0b3IKKyAgLy8vIGRlYWxsb2NhdGVzIHRoZSBidWZmZXIgYW5kIHRoZSB0YXJnZXQgZmlsZSBpcyBuZXZlciB3cml0dGVuLgorICB2aXJ0dWFsIH5GaWxlT3V0cHV0QnVmZmVyKCkge30KKworcHJvdGVjdGVkOgorICBGaWxlT3V0cHV0QnVmZmVyKFN0cmluZ1JlZiBQYXRoKSA6IEZpbmFsUGF0aChQYXRoKSB7fQorCisgIHN0ZDo6c3RyaW5nIEZpbmFsUGF0aDsKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YjAyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oCkBAIC0wLDAgKzEsMTExMCBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmggLSBGaWxlIFN5c3RlbSBPUyBDb25jZXB0IC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGxsdm06OnN5czo6ZnMgbmFtZXNwYWNlLiBJdCBpcyBkZXNpZ25lZCBhZnRlcgorLy8gVFIyL2Jvb3N0IGZpbGVzeXN0ZW0gKHYzKSwgYnV0IG1vZGlmaWVkIHRvIHJlbW92ZSBleGNlcHRpb24gaGFuZGxpbmcgYW5kIHRoZQorLy8gcGF0aCBjbGFzcy4KKy8vCisvLyBBbGwgZnVuY3Rpb25zIHJldHVybiBhbiBlcnJvcl9jb2RlIGFuZCB0aGVpciBhY3R1YWwgd29yayB2aWEgdGhlIGxhc3Qgb3V0CisvLyBhcmd1bWVudC4gVGhlIG91dCBhcmd1bWVudCBpcyBkZWZpbmVkIGlmIGFuZCBvbmx5IGlmIGVycmM6OnN1Y2Nlc3MgaXMKKy8vIHJldHVybmVkLiBBIGZ1bmN0aW9uIG1heSByZXR1cm4gYW55IGVycm9yIGNvZGUgaW4gdGhlIGdlbmVyaWMgb3Igc3lzdGVtCisvLyBjYXRlZ29yeS4gSG93ZXZlciwgdGhleSBzaGFsbCBiZSBlcXVpdmFsZW50IHRvIGFueSBlcnJvciBjb25kaXRpb25zIGxpc3RlZAorLy8gaW4gZWFjaCBmdW5jdGlvbnMgcmVzcGVjdGl2ZSBkb2N1bWVudGF0aW9uIGlmIHRoZSBjb25kaXRpb24gYXBwbGllcy4gWyBub3RlOgorLy8gdGhpcyBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCBlcnJvcl9jb2RlIHdpbGwgYmUgaW4gdGhlIHNldCBvZiBleHBsaWNpdGx5CisvLyBsaXN0ZWQgY29kZXMsIGJ1dCBpdCBkb2VzIGd1YXJhbnRlZSB0aGF0IGlmIGFueSBvZiB0aGUgZXhwbGljaXRseSBsaXN0ZWQKKy8vIGVycm9ycyBvY2N1ciwgdGhlIGNvcnJlY3QgZXJyb3JfY29kZSB3aWxsIGJlIHVzZWQgXS4gQWxsIGZ1bmN0aW9ucyBtYXkKKy8vIHJldHVybiBlcnJjOjpub3RfZW5vdWdoX21lbW9yeSBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUKKy8vIG9wZXJhdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9GSUxFU1lTVEVNX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0ZJTEVTWVNURU1fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DaHJvbm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvck9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01ENS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RhY2s+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzeXMgeworbmFtZXNwYWNlIGZzIHsKKworLy8vIEFuIGVudW1lcmF0aW9uIGZvciB0aGUgZmlsZSBzeXN0ZW0ncyB2aWV3IG9mIHRoZSB0eXBlLgorZW51bSBjbGFzcyBmaWxlX3R5cGUgeworICBzdGF0dXNfZXJyb3IsCisgIGZpbGVfbm90X2ZvdW5kLAorICByZWd1bGFyX2ZpbGUsCisgIGRpcmVjdG9yeV9maWxlLAorICBzeW1saW5rX2ZpbGUsCisgIGJsb2NrX2ZpbGUsCisgIGNoYXJhY3Rlcl9maWxlLAorICBmaWZvX2ZpbGUsCisgIHNvY2tldF9maWxlLAorICB0eXBlX3Vua25vd24KK307CisKKy8vLyBzcGFjZV9pbmZvIC0gU2VsZiBleHBsYW5hdG9yeS4KK3N0cnVjdCBzcGFjZV9pbmZvIHsKKyAgdWludDY0X3QgY2FwYWNpdHk7CisgIHVpbnQ2NF90IGZyZWU7CisgIHVpbnQ2NF90IGF2YWlsYWJsZTsKK307CisKK2VudW0gcGVybXMgeworICBub19wZXJtcyA9IDAsCisgIG93bmVyX3JlYWQgPSAwNDAwLAorICBvd25lcl93cml0ZSA9IDAyMDAsCisgIG93bmVyX2V4ZSA9IDAxMDAsCisgIG93bmVyX2FsbCA9IG93bmVyX3JlYWQgfCBvd25lcl93cml0ZSB8IG93bmVyX2V4ZSwKKyAgZ3JvdXBfcmVhZCA9IDA0MCwKKyAgZ3JvdXBfd3JpdGUgPSAwMjAsCisgIGdyb3VwX2V4ZSA9IDAxMCwKKyAgZ3JvdXBfYWxsID0gZ3JvdXBfcmVhZCB8IGdyb3VwX3dyaXRlIHwgZ3JvdXBfZXhlLAorICBvdGhlcnNfcmVhZCA9IDA0LAorICBvdGhlcnNfd3JpdGUgPSAwMiwKKyAgb3RoZXJzX2V4ZSA9IDAxLAorICBvdGhlcnNfYWxsID0gb3RoZXJzX3JlYWQgfCBvdGhlcnNfd3JpdGUgfCBvdGhlcnNfZXhlLAorICBhbGxfcmVhZCA9IG93bmVyX3JlYWQgfCBncm91cF9yZWFkIHwgb3RoZXJzX3JlYWQsCisgIGFsbF93cml0ZSA9IG93bmVyX3dyaXRlIHwgZ3JvdXBfd3JpdGUgfCBvdGhlcnNfd3JpdGUsCisgIGFsbF9leGUgPSBvd25lcl9leGUgfCBncm91cF9leGUgfCBvdGhlcnNfZXhlLAorICBhbGxfYWxsID0gb3duZXJfYWxsIHwgZ3JvdXBfYWxsIHwgb3RoZXJzX2FsbCwKKyAgc2V0X3VpZF9vbl9leGUgPSAwNDAwMCwKKyAgc2V0X2dpZF9vbl9leGUgPSAwMjAwMCwKKyAgc3RpY2t5X2JpdCA9IDAxMDAwLAorICBhbGxfcGVybXMgPSBhbGxfYWxsIHwgc2V0X3VpZF9vbl9leGUgfCBzZXRfZ2lkX29uX2V4ZSB8IHN0aWNreV9iaXQsCisgIHBlcm1zX25vdF9rbm93biA9IDB4RkZGRgorfTsKKworLy8gSGVscGVyIGZ1bmN0aW9ucyBzbyB0aGF0IHlvdSBjYW4gdXNlICYgYW5kIHwgdG8gbWFuaXB1bGF0ZSBwZXJtcyBiaXRzOgoraW5saW5lIHBlcm1zIG9wZXJhdG9yfChwZXJtcyBsLCBwZXJtcyByKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxwZXJtcz4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KGwpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4ocikpOworfQoraW5saW5lIHBlcm1zIG9wZXJhdG9yJihwZXJtcyBsLCBwZXJtcyByKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxwZXJtcz4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KGwpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4ocikpOworfQoraW5saW5lIHBlcm1zICZvcGVyYXRvcnw9KHBlcm1zICZsLCBwZXJtcyByKSB7CisgIGwgPSBsIHwgcjsKKyAgcmV0dXJuIGw7Cit9CitpbmxpbmUgcGVybXMgJm9wZXJhdG9yJj0ocGVybXMgJmwsIHBlcm1zIHIpIHsKKyAgbCA9IGwgJiByOworICByZXR1cm4gbDsKK30KK2lubGluZSBwZXJtcyBvcGVyYXRvcn4ocGVybXMgeCkgeworICAvLyBBdm9pZCBVQiBieSBleHBsaWNpdGx5IHRydW5jYXRpbmcgdGhlICh1bnNpZ25lZCkgfiByZXN1bHQuCisgIHJldHVybiBzdGF0aWNfY2FzdDxwZXJtcz4oCisgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4ofnN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0Pih4KSkpOworfQorCitjbGFzcyBVbmlxdWVJRCB7CisgIHVpbnQ2NF90IERldmljZTsKKyAgdWludDY0X3QgRmlsZTsKKworcHVibGljOgorICBVbmlxdWVJRCgpID0gZGVmYXVsdDsKKyAgVW5pcXVlSUQodWludDY0X3QgRGV2aWNlLCB1aW50NjRfdCBGaWxlKSA6IERldmljZShEZXZpY2UpLCBGaWxlKEZpbGUpIHt9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFVuaXF1ZUlEICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBEZXZpY2UgPT0gT3RoZXIuRGV2aWNlICYmIEZpbGUgPT0gT3RoZXIuRmlsZTsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgVW5pcXVlSUQgJk90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IE90aGVyKTsgfQorICBib29sIG9wZXJhdG9yPChjb25zdCBVbmlxdWVJRCAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoRGV2aWNlLCBGaWxlKSA8IHN0ZDo6dGllKE90aGVyLkRldmljZSwgT3RoZXIuRmlsZSk7CisgIH0KKworICB1aW50NjRfdCBnZXREZXZpY2UoKSBjb25zdCB7IHJldHVybiBEZXZpY2U7IH0KKyAgdWludDY0X3QgZ2V0RmlsZSgpIGNvbnN0IHsgcmV0dXJuIEZpbGU7IH0KK307CisKKy8vLyBSZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYSBjYWxsIHRvIGRpcmVjdG9yeV9pdGVyYXRvcjo6c3RhdHVzKCkuIFRoaXMgaXMgYQorLy8vIHN1YnNldCBvZiB0aGUgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgYSByZWd1bGFyIHN5czo6ZnM6OnN0YXR1cygpIGNhbGwsIGFuZAorLy8vIHJlcHJlc2VudHMgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IFdpbmRvd3MgRmlsZUZpcnN0RmlsZS9GaW5kTmV4dEZpbGUuCitjbGFzcyBiYXNpY19maWxlX3N0YXR1cyB7Citwcm90ZWN0ZWQ6CisgICNpZiBkZWZpbmVkKExMVk1fT05fVU5JWCkKKyAgdGltZV90IGZzX3N0X2F0aW1lID0gMDsKKyAgdGltZV90IGZzX3N0X210aW1lID0gMDsKKyAgdWlkX3QgZnNfc3RfdWlkID0gMDsKKyAgZ2lkX3QgZnNfc3RfZ2lkID0gMDsKKyAgb2ZmX3QgZnNfc3Rfc2l6ZSA9IDA7CisgICNlbGlmIGRlZmluZWQgKExMVk1fT05fV0lOMzIpCisgIHVpbnQzMl90IExhc3RBY2Nlc3NlZFRpbWVIaWdoID0gMDsKKyAgdWludDMyX3QgTGFzdEFjY2Vzc2VkVGltZUxvdyA9IDA7CisgIHVpbnQzMl90IExhc3RXcml0ZVRpbWVIaWdoID0gMDsKKyAgdWludDMyX3QgTGFzdFdyaXRlVGltZUxvdyA9IDA7CisgIHVpbnQzMl90IEZpbGVTaXplSGlnaCA9IDA7CisgIHVpbnQzMl90IEZpbGVTaXplTG93ID0gMDsKKyAgI2VuZGlmCisgIGZpbGVfdHlwZSBUeXBlID0gZmlsZV90eXBlOjpzdGF0dXNfZXJyb3I7CisgIHBlcm1zIFBlcm1zID0gcGVybXNfbm90X2tub3duOworCitwdWJsaWM6CisgIGJhc2ljX2ZpbGVfc3RhdHVzKCkgPSBkZWZhdWx0OworCisgIGV4cGxpY2l0IGJhc2ljX2ZpbGVfc3RhdHVzKGZpbGVfdHlwZSBUeXBlKSA6IFR5cGUoVHlwZSkge30KKworICAjaWYgZGVmaW5lZChMTFZNX09OX1VOSVgpCisgIGJhc2ljX2ZpbGVfc3RhdHVzKGZpbGVfdHlwZSBUeXBlLCBwZXJtcyBQZXJtcywgdGltZV90IEFUaW1lLCB0aW1lX3QgTVRpbWUsCisgICAgICAgICAgICAgICAgICAgIHVpZF90IFVJRCwgZ2lkX3QgR0lELCBvZmZfdCBTaXplKQorICAgICAgOiBmc19zdF9hdGltZShBVGltZSksIGZzX3N0X210aW1lKE1UaW1lKSwgZnNfc3RfdWlkKFVJRCksIGZzX3N0X2dpZChHSUQpLAorICAgICAgICBmc19zdF9zaXplKFNpemUpLCBUeXBlKFR5cGUpLCBQZXJtcyhQZXJtcykge30KKyNlbGlmIGRlZmluZWQoTExWTV9PTl9XSU4zMikKKyAgYmFzaWNfZmlsZV9zdGF0dXMoZmlsZV90eXBlIFR5cGUsIHBlcm1zIFBlcm1zLCB1aW50MzJfdCBMYXN0QWNjZXNzVGltZUhpZ2gsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IExhc3RBY2Nlc3NUaW1lTG93LCB1aW50MzJfdCBMYXN0V3JpdGVUaW1lSGlnaCwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTGFzdFdyaXRlVGltZUxvdywgdWludDMyX3QgRmlsZVNpemVIaWdoLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBGaWxlU2l6ZUxvdykKKyAgICAgIDogTGFzdEFjY2Vzc2VkVGltZUhpZ2goTGFzdEFjY2Vzc1RpbWVIaWdoKSwKKyAgICAgICAgTGFzdEFjY2Vzc2VkVGltZUxvdyhMYXN0QWNjZXNzVGltZUxvdyksCisgICAgICAgIExhc3RXcml0ZVRpbWVIaWdoKExhc3RXcml0ZVRpbWVIaWdoKSwKKyAgICAgICAgTGFzdFdyaXRlVGltZUxvdyhMYXN0V3JpdGVUaW1lTG93KSwgRmlsZVNpemVIaWdoKEZpbGVTaXplSGlnaCksCisgICAgICAgIEZpbGVTaXplTG93KEZpbGVTaXplTG93KSwgVHlwZShUeXBlKSwgUGVybXMoUGVybXMpIHt9CisgICNlbmRpZgorCisgIC8vIGdldHRlcnMKKyAgZmlsZV90eXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBUeXBlOyB9CisgIHBlcm1zIHBlcm1pc3Npb25zKCkgY29uc3QgeyByZXR1cm4gUGVybXM7IH0KKyAgVGltZVBvaW50PD4gZ2V0TGFzdEFjY2Vzc2VkVGltZSgpIGNvbnN0OworICBUaW1lUG9pbnQ8PiBnZXRMYXN0TW9kaWZpY2F0aW9uVGltZSgpIGNvbnN0OworCisgICNpZiBkZWZpbmVkKExMVk1fT05fVU5JWCkKKyAgdWludDMyX3QgZ2V0VXNlcigpIGNvbnN0IHsgcmV0dXJuIGZzX3N0X3VpZDsgfQorICB1aW50MzJfdCBnZXRHcm91cCgpIGNvbnN0IHsgcmV0dXJuIGZzX3N0X2dpZDsgfQorICB1aW50NjRfdCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gZnNfc3Rfc2l6ZTsgfQorICAjZWxpZiBkZWZpbmVkIChMTFZNX09OX1dJTjMyKQorICB1aW50MzJfdCBnZXRVc2VyKCkgY29uc3QgeworICAgIHJldHVybiA5OTk5OyAvLyBOb3QgYXBwbGljYWJsZSB0byBXaW5kb3dzLCBzby4uLgorICB9CisKKyAgdWludDMyX3QgZ2V0R3JvdXAoKSBjb25zdCB7CisgICAgcmV0dXJuIDk5OTk7IC8vIE5vdCBhcHBsaWNhYmxlIHRvIFdpbmRvd3MsIHNvLi4uCisgIH0KKworICB1aW50NjRfdCBnZXRTaXplKCkgY29uc3QgeworICAgIHJldHVybiAodWludDY0X3QoRmlsZVNpemVIaWdoKSA8PCAzMikgKyBGaWxlU2l6ZUxvdzsKKyAgfQorICAjZW5kaWYKKworICAvLyBzZXR0ZXJzCisgIHZvaWQgdHlwZShmaWxlX3R5cGUgdikgeyBUeXBlID0gdjsgfQorICB2b2lkIHBlcm1pc3Npb25zKHBlcm1zIHApIHsgUGVybXMgPSBwOyB9Cit9OworCisvLy8gUmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGEgY2FsbCB0byBzeXM6OmZzOjpzdGF0dXMoKS4KK2NsYXNzIGZpbGVfc3RhdHVzIDogcHVibGljIGJhc2ljX2ZpbGVfc3RhdHVzIHsKKyAgZnJpZW5kIGJvb2wgZXF1aXZhbGVudChmaWxlX3N0YXR1cyBBLCBmaWxlX3N0YXR1cyBCKTsKKworICAjaWYgZGVmaW5lZChMTFZNX09OX1VOSVgpCisgIGRldl90IGZzX3N0X2RldiA9IDA7CisgIG5saW5rX3QgZnNfc3RfbmxpbmtzID0gMDsKKyAgaW5vX3QgZnNfc3RfaW5vID0gMDsKKyAgI2VsaWYgZGVmaW5lZCAoTExWTV9PTl9XSU4zMikKKyAgdWludDMyX3QgTnVtTGlua3MgPSAwOworICB1aW50MzJfdCBWb2x1bWVTZXJpYWxOdW1iZXIgPSAwOworICB1aW50MzJfdCBGaWxlSW5kZXhIaWdoID0gMDsKKyAgdWludDMyX3QgRmlsZUluZGV4TG93ID0gMDsKKyAgI2VuZGlmCisKK3B1YmxpYzoKKyAgZmlsZV9zdGF0dXMoKSA9IGRlZmF1bHQ7CisKKyAgZXhwbGljaXQgZmlsZV9zdGF0dXMoZmlsZV90eXBlIFR5cGUpIDogYmFzaWNfZmlsZV9zdGF0dXMoVHlwZSkge30KKworICAjaWYgZGVmaW5lZChMTFZNX09OX1VOSVgpCisgIGZpbGVfc3RhdHVzKGZpbGVfdHlwZSBUeXBlLCBwZXJtcyBQZXJtcywgZGV2X3QgRGV2LCBubGlua190IExpbmtzLCBpbm9fdCBJbm8sCisgICAgICAgICAgICAgIHRpbWVfdCBBVGltZSwgdGltZV90IE1UaW1lLCB1aWRfdCBVSUQsIGdpZF90IEdJRCwgb2ZmX3QgU2l6ZSkKKyAgICAgIDogYmFzaWNfZmlsZV9zdGF0dXMoVHlwZSwgUGVybXMsIEFUaW1lLCBNVGltZSwgVUlELCBHSUQsIFNpemUpLAorICAgICAgICBmc19zdF9kZXYoRGV2KSwgZnNfc3RfbmxpbmtzKExpbmtzKSwgZnNfc3RfaW5vKElubykge30KKyAgI2VsaWYgZGVmaW5lZChMTFZNX09OX1dJTjMyKQorICBmaWxlX3N0YXR1cyhmaWxlX3R5cGUgVHlwZSwgcGVybXMgUGVybXMsIHVpbnQzMl90IExpbmtDb3VudCwKKyAgICAgICAgICAgICAgdWludDMyX3QgTGFzdEFjY2Vzc1RpbWVIaWdoLCB1aW50MzJfdCBMYXN0QWNjZXNzVGltZUxvdywKKyAgICAgICAgICAgICAgdWludDMyX3QgTGFzdFdyaXRlVGltZUhpZ2gsIHVpbnQzMl90IExhc3RXcml0ZVRpbWVMb3csCisgICAgICAgICAgICAgIHVpbnQzMl90IFZvbHVtZVNlcmlhbE51bWJlciwgdWludDMyX3QgRmlsZVNpemVIaWdoLAorICAgICAgICAgICAgICB1aW50MzJfdCBGaWxlU2l6ZUxvdywgdWludDMyX3QgRmlsZUluZGV4SGlnaCwKKyAgICAgICAgICAgICAgdWludDMyX3QgRmlsZUluZGV4TG93KQorICAgICAgOiBiYXNpY19maWxlX3N0YXR1cyhUeXBlLCBQZXJtcywgTGFzdEFjY2Vzc1RpbWVIaWdoLCBMYXN0QWNjZXNzVGltZUxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdFdyaXRlVGltZUhpZ2gsIExhc3RXcml0ZVRpbWVMb3csIEZpbGVTaXplSGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVNpemVMb3cpLAorICAgICAgICBOdW1MaW5rcyhMaW5rQ291bnQpLCBWb2x1bWVTZXJpYWxOdW1iZXIoVm9sdW1lU2VyaWFsTnVtYmVyKSwKKyAgICAgICAgRmlsZUluZGV4SGlnaChGaWxlSW5kZXhIaWdoKSwgRmlsZUluZGV4TG93KEZpbGVJbmRleExvdykge30KKyAgI2VuZGlmCisKKyAgVW5pcXVlSUQgZ2V0VW5pcXVlSUQoKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0TGlua0NvdW50KCkgY29uc3Q7Cit9OworCisvLy8gQH0KKy8vLyBAbmFtZSBQaHlzaWNhbCBPcGVyYXRvcnMKKy8vLyBAeworCisvLy8gQGJyaWVmIE1ha2UgXGEgcGF0aCBhbiBhYnNvbHV0ZSBwYXRoLgorLy8vCisvLy8gTWFrZXMgXGEgcGF0aCBhYnNvbHV0ZSB1c2luZyB0aGUgXGEgY3VycmVudF9kaXJlY3RvcnkgaWYgaXQgaXMgbm90IGFscmVhZHkuCisvLy8gQW4gZW1wdHkgXGEgcGF0aCB3aWxsIHJlc3VsdCBpbiB0aGUgXGEgY3VycmVudF9kaXJlY3RvcnkuCisvLy8KKy8vLyAvYWJzb2x1dGUvcGF0aCAgID0+IC9hYnNvbHV0ZS9wYXRoCisvLy8gcmVsYXRpdmUvLi4vcGF0aCA9PiA8Y3VycmVudC1kaXJlY3Rvcnk+L3JlbGF0aXZlLy4uL3BhdGgKKy8vLworLy8vIEBwYXJhbSBwYXRoIEEgcGF0aCB0aGF0IGlzIG1vZGlmaWVkIHRvIGJlIGFuIGFic29sdXRlIHBhdGguCisvLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiBcYSBwYXRoIGhhcyBiZWVuIG1hZGUgYWJzb2x1dGUsIG90aGVyd2lzZSBhCisvLy8gICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZS4KK3N0ZDo6ZXJyb3JfY29kZSBtYWtlX2Fic29sdXRlKGNvbnN0IFR3aW5lICZjdXJyZW50X2RpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmcGF0aCk7CisKKy8vLyBAYnJpZWYgTWFrZSBcYSBwYXRoIGFuIGFic29sdXRlIHBhdGguCisvLy8KKy8vLyBNYWtlcyBcYSBwYXRoIGFic29sdXRlIHVzaW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpZiBpdCBpcyBub3QgYWxyZWFkeS4gQW4KKy8vLyBlbXB0eSBcYSBwYXRoIHdpbGwgcmVzdWx0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKy8vLworLy8vIC9hYnNvbHV0ZS9wYXRoICAgPT4gL2Fic29sdXRlL3BhdGgKKy8vLyByZWxhdGl2ZS8uLi9wYXRoID0+IDxjdXJyZW50LWRpcmVjdG9yeT4vcmVsYXRpdmUvLi4vcGF0aAorLy8vCisvLy8gQHBhcmFtIHBhdGggQSBwYXRoIHRoYXQgaXMgbW9kaWZpZWQgdG8gYmUgYW4gYWJzb2x1dGUgcGF0aC4KKy8vLyBAcmV0dXJucyBlcnJjOjpzdWNjZXNzIGlmIFxhIHBhdGggaGFzIGJlZW4gbWFkZSBhYnNvbHV0ZSwgb3RoZXJ3aXNlIGEKKy8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgorc3RkOjplcnJvcl9jb2RlIG1ha2VfYWJzb2x1dGUoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZwYXRoKTsKKworLy8vIEBicmllZiBDcmVhdGUgYWxsIHRoZSBub24tZXhpc3RlbnQgZGlyZWN0b3JpZXMgaW4gcGF0aC4KKy8vLworLy8vIEBwYXJhbSBwYXRoIERpcmVjdG9yaWVzIHRvIGNyZWF0ZS4KKy8vLyBAcmV0dXJucyBlcnJjOjpzdWNjZXNzIGlmIGlzX2RpcmVjdG9yeShwYXRoKSwgb3RoZXJ3aXNlIGEgcGxhdGZvcm0KKy8vLyAgICAgICAgICBzcGVjaWZpYyBlcnJvcl9jb2RlLiBJZiBJZ25vcmVFeGlzdGluZyBpcyBmYWxzZSwgYWxzbyByZXR1cm5zCisvLy8gICAgICAgICAgZXJyb3IgaWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0ZWQuCitzdGQ6OmVycm9yX2NvZGUgY3JlYXRlX2RpcmVjdG9yaWVzKGNvbnN0IFR3aW5lICZwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElnbm9yZUV4aXN0aW5nID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybXMgUGVybXMgPSBvd25lcl9hbGwgfCBncm91cF9hbGwpOworCisvLy8gQGJyaWVmIENyZWF0ZSB0aGUgZGlyZWN0b3J5IGluIHBhdGguCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBEaXJlY3RvcnkgdG8gY3JlYXRlLgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgaXNfZGlyZWN0b3J5KHBhdGgpLCBvdGhlcndpc2UgYSBwbGF0Zm9ybQorLy8vICAgICAgICAgIHNwZWNpZmljIGVycm9yX2NvZGUuIElmIElnbm9yZUV4aXN0aW5nIGlzIGZhbHNlLCBhbHNvIHJldHVybnMKKy8vLyAgICAgICAgICBlcnJvciBpZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RlZC4KK3N0ZDo6ZXJyb3JfY29kZSBjcmVhdGVfZGlyZWN0b3J5KGNvbnN0IFR3aW5lICZwYXRoLCBib29sIElnbm9yZUV4aXN0aW5nID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1zIFBlcm1zID0gb3duZXJfYWxsIHwgZ3JvdXBfYWxsKTsKKworLy8vIEBicmllZiBDcmVhdGUgYSBsaW5rIGZyb20gXGEgZnJvbSB0byBcYSB0by4KKy8vLworLy8vIFRoZSBsaW5rIG1heSBiZSBhIHNvZnQgb3IgYSBoYXJkIGxpbmssIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uIFRoZSBjYWxsZXIKKy8vLyBtYXkgbm90IGFzc3VtZSB3aGljaCBvbmUuIEN1cnJlbnRseSBvbiB3aW5kb3dzIGl0IGNyZWF0ZXMgYSBoYXJkIGxpbmsgc2luY2UKKy8vLyBzb2Z0IGxpbmtzIHJlcXVpcmUgZXh0cmEgcHJpdmlsZWdlcy4gT24gdW5peCwgaXQgY3JlYXRlcyBhIHNvZnQgbGluayBzaW5jZQorLy8vIGhhcmQgbGlua3MgZG9uJ3Qgd29yayBvbiBTTUIgZmlsZSBzeXN0ZW1zLgorLy8vCisvLy8gQHBhcmFtIHRvIFRoZSBwYXRoIHRvIGhhcmQgbGluayB0by4KKy8vLyBAcGFyYW0gZnJvbSBUaGUgcGF0aCB0byBoYXJkIGxpbmsgZnJvbS4gVGhpcyBpcyBjcmVhdGVkLgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgdGhlIGxpbmsgd2FzIGNyZWF0ZWQsIG90aGVyd2lzZSBhIHBsYXRmb3JtCisvLy8gc3BlY2lmaWMgZXJyb3JfY29kZS4KK3N0ZDo6ZXJyb3JfY29kZSBjcmVhdGVfbGluayhjb25zdCBUd2luZSAmdG8sIGNvbnN0IFR3aW5lICZmcm9tKTsKKworLy8vIENyZWF0ZSBhIGhhcmQgbGluayBmcm9tIFxhIGZyb20gdG8gXGEgdG8sIG9yIHJldHVybiBhbiBlcnJvci4KKy8vLworLy8vIEBwYXJhbSB0byBUaGUgcGF0aCB0byBoYXJkIGxpbmsgdG8uCisvLy8gQHBhcmFtIGZyb20gVGhlIHBhdGggdG8gaGFyZCBsaW5rIGZyb20uIFRoaXMgaXMgY3JlYXRlZC4KKy8vLyBAcmV0dXJucyBlcnJjOjpzdWNjZXNzIGlmIHRoZSBsaW5rIHdhcyBjcmVhdGVkLCBvdGhlcndpc2UgYSBwbGF0Zm9ybQorLy8vIHNwZWNpZmljIGVycm9yX2NvZGUuCitzdGQ6OmVycm9yX2NvZGUgY3JlYXRlX2hhcmRfbGluayhjb25zdCBUd2luZSAmdG8sIGNvbnN0IFR3aW5lICZmcm9tKTsKKworLy8vIEBicmllZiBDb2xsYXBzZSBhbGwgLiBhbmQgLi4gcGF0dGVybnMsIHJlc29sdmUgYWxsIHN5bWxpbmtzLCBhbmQgb3B0aW9uYWxseQorLy8vICAgICAgICBleHBhbmQgfiBleHByZXNzaW9ucyB0byB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LgorLy8vCisvLy8gQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gcmVzb2x2ZS4KKy8vLyBAcGFyYW0gb3V0cHV0IFRoZSBsb2NhdGlvbiB0byBzdG9yZSB0aGUgcmVzb2x2ZWQgcGF0aC4KKy8vLyBAcGFyYW0gZXhwYW5kX3RpbGRlIElmIHRydWUsIHJlc29sdmVzIH4gZXhwcmVzc2lvbnMgdG8gdGhlIHVzZXIncyBob21lCisvLy8gICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkuCitzdGQ6OmVycm9yX2NvZGUgcmVhbF9wYXRoKGNvbnN0IFR3aW5lICZwYXRoLCBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHBhbmRfdGlsZGUgPSBmYWxzZSk7CisKKy8vLyBAYnJpZWYgR2V0IHRoZSBjdXJyZW50IHBhdGguCisvLy8KKy8vLyBAcGFyYW0gcmVzdWx0IEhvbGRzIHRoZSBjdXJyZW50IHBhdGggb24gcmV0dXJuLgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgdGhlIGN1cnJlbnQgcGF0aCBoYXMgYmVlbiBzdG9yZWQgaW4gcmVzdWx0LAorLy8vICAgICAgICAgIG90aGVyd2lzZSBhIHBsYXRmb3JtLXNwZWNpZmljIGVycm9yX2NvZGUuCitzdGQ6OmVycm9yX2NvZGUgY3VycmVudF9wYXRoKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmcmVzdWx0KTsKKworLy8vIEBicmllZiBTZXQgdGhlIGN1cnJlbnQgcGF0aC4KKy8vLworLy8vIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHNldC4KKy8vLyBAcmV0dXJucyBlcnJjOjpzdWNjZXNzIGlmIHRoZSBjdXJyZW50IHBhdGggd2FzIHN1Y2Nlc3NmdWxseSBzZXQsCisvLy8gICAgICAgICAgb3RoZXJ3aXNlIGEgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZS4KK3N0ZDo6ZXJyb3JfY29kZSBzZXRfY3VycmVudF9wYXRoKGNvbnN0IFR3aW5lICZwYXRoKTsKKworLy8vIEBicmllZiBSZW1vdmUgcGF0aC4gRXF1aXZhbGVudCB0byBQT1NJWCByZW1vdmUoKS4KKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiBwYXRoIGhhcyBiZWVuIHJlbW92ZWQgb3IgZGlkbid0IGV4aXN0LCBvdGhlcndpc2UgYQorLy8vICAgICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIGVycm9yIGNvZGUuIElmIElnbm9yZU5vbkV4aXN0aW5nIGlzIGZhbHNlLCBhbHNvCisvLy8gICAgICAgICAgcmV0dXJucyBlcnJvciBpZiB0aGUgZmlsZSBkaWRuJ3QgZXhpc3QuCitzdGQ6OmVycm9yX2NvZGUgcmVtb3ZlKGNvbnN0IFR3aW5lICZwYXRoLCBib29sIElnbm9yZU5vbkV4aXN0aW5nID0gdHJ1ZSk7CisKKy8vLyBAYnJpZWYgUmVjdXJzaXZlbHkgZGVsZXRlIGEgZGlyZWN0b3J5LgorLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmV0dXJucyBlcnJjOjpzdWNjZXNzIGlmIHBhdGggaGFzIGJlZW4gcmVtb3ZlZCBvciBkaWRuJ3QgZXhpc3QsIG90aGVyd2lzZSBhCisvLy8gICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3IgY29kZS4KK3N0ZDo6ZXJyb3JfY29kZSByZW1vdmVfZGlyZWN0b3JpZXMoY29uc3QgVHdpbmUgJnBhdGgsIGJvb2wgSWdub3JlRXJyb3JzID0gdHJ1ZSk7CisKKy8vLyBAYnJpZWYgUmVuYW1lIFxhIGZyb20gdG8gXGEgdG8uCisvLy8KKy8vLyBGaWxlcyBhcmUgcmVuYW1lZCBhcyBpZiBieSBQT1NJWCByZW5hbWUoKSwgZXhjZXB0IHRoYXQgb24gV2luZG93cyB0aGVyZSBtYXkKKy8vLyBiZSBhIHNob3J0IGludGVydmFsIG9mIHRpbWUgZHVyaW5nIHdoaWNoIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGRvZXMgbm90CisvLy8gZXhpc3QuCisvLy8KKy8vLyBAcGFyYW0gZnJvbSBUaGUgcGF0aCB0byByZW5hbWUgZnJvbS4KKy8vLyBAcGFyYW0gdG8gVGhlIHBhdGggdG8gcmVuYW1lIHRvLiBUaGlzIGlzIGNyZWF0ZWQuCitzdGQ6OmVycm9yX2NvZGUgcmVuYW1lKGNvbnN0IFR3aW5lICZmcm9tLCBjb25zdCBUd2luZSAmdG8pOworCisvLy8gQGJyaWVmIENvcHkgdGhlIGNvbnRlbnRzIG9mIFxhIEZyb20gdG8gXGEgVG8uCisvLy8KKy8vLyBAcGFyYW0gRnJvbSBUaGUgcGF0aCB0byBjb3B5IGZyb20uCisvLy8gQHBhcmFtIFRvIFRoZSBwYXRoIHRvIGNvcHkgdG8uIFRoaXMgaXMgY3JlYXRlZC4KK3N0ZDo6ZXJyb3JfY29kZSBjb3B5X2ZpbGUoY29uc3QgVHdpbmUgJkZyb20sIGNvbnN0IFR3aW5lICZUbyk7CisKKy8vLyBAYnJpZWYgUmVzaXplIHBhdGggdG8gc2l6ZS4gRmlsZSBpcyByZXNpemVkIGFzIGlmIGJ5IFBPU0lYIHRydW5jYXRlKCkuCisvLy8KKy8vLyBAcGFyYW0gRkQgSW5wdXQgZmlsZSBkZXNjcmlwdG9yLgorLy8vIEBwYXJhbSBTaXplIFNpemUgdG8gcmVzaXplIHRvLgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgXGEgcGF0aCBoYXMgYmVlbiByZXNpemVkIHRvIFxhIHNpemUsIG90aGVyd2lzZSBhCisvLy8gICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZS4KK3N0ZDo6ZXJyb3JfY29kZSByZXNpemVfZmlsZShpbnQgRkQsIHVpbnQ2NF90IFNpemUpOworCisvLy8gQGJyaWVmIENvbXB1dGUgYW4gTUQ1IGhhc2ggb2YgYSBmaWxlJ3MgY29udGVudHMuCisvLy8KKy8vLyBAcGFyYW0gRkQgSW5wdXQgZmlsZSBkZXNjcmlwdG9yLgorLy8vIEByZXR1cm5zIEFuIE1ENVJlc3VsdCB3aXRoIHRoZSBoYXNoIGNvbXB1dGVkLCBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgYQorLy8vICAgICAgICAgIHN0ZDo6ZXJyb3JfY29kZS4KK0Vycm9yT3I8TUQ1OjpNRDVSZXN1bHQ+IG1kNV9jb250ZW50cyhpbnQgRkQpOworCisvLy8gQGJyaWVmIFZlcnNpb24gb2YgY29tcHV0ZV9tZDUgdGhhdCBkb2Vzbid0IHJlcXVpcmUgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IuCitFcnJvck9yPE1ENTo6TUQ1UmVzdWx0PiBtZDVfY29udGVudHMoY29uc3QgVHdpbmUgJlBhdGgpOworCisvLy8gQH0KKy8vLyBAbmFtZSBQaHlzaWNhbCBPYnNlcnZlcnMKKy8vLyBAeworCisvLy8gQGJyaWVmIERvZXMgZmlsZSBleGlzdD8KKy8vLworLy8vIEBwYXJhbSBzdGF0dXMgQSBiYXNpY19maWxlX3N0YXR1cyBwcmV2aW91c2x5IHJldHVybmVkIGZyb20gc3RhdC4KKy8vLyBAcmV0dXJucyBUcnVlIGlmIHRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHN0YXR1cyBleGlzdHMsIGZhbHNlIGlmIGl0IGRvZXMKKy8vLyAgICAgICAgICBub3QuCitib29sIGV4aXN0cyhjb25zdCBiYXNpY19maWxlX3N0YXR1cyAmc3RhdHVzKTsKKworZW51bSBjbGFzcyBBY2Nlc3NNb2RlIHsgRXhpc3QsIFdyaXRlLCBFeGVjdXRlIH07CisKKy8vLyBAYnJpZWYgQ2FuIHRoZSBmaWxlIGJlIGFjY2Vzc2VkPworLy8vCisvLy8gQHBhcmFtIFBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmV0dXJucyBlcnJjOjpzdWNjZXNzIGlmIHRoZSBwYXRoIGNhbiBiZSBhY2Nlc3NlZCwgb3RoZXJ3aXNlIGEKKy8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgorc3RkOjplcnJvcl9jb2RlIGFjY2Vzcyhjb25zdCBUd2luZSAmUGF0aCwgQWNjZXNzTW9kZSBNb2RlKTsKKworLy8vIEBicmllZiBEb2VzIGZpbGUgZXhpc3Q/CisvLy8KKy8vLyBAcGFyYW0gUGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXR1cm5zIFRydWUgaWYgaXQgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuCitpbmxpbmUgYm9vbCBleGlzdHMoY29uc3QgVHdpbmUgJlBhdGgpIHsKKyAgcmV0dXJuICFhY2Nlc3MoUGF0aCwgQWNjZXNzTW9kZTo6RXhpc3QpOworfQorCisvLy8gQGJyaWVmIENhbiB3ZSBleGVjdXRlIHRoaXMgZmlsZT8KKy8vLworLy8vIEBwYXJhbSBQYXRoIElucHV0IHBhdGguCisvLy8gQHJldHVybnMgVHJ1ZSBpZiB3ZSBjYW4gZXhlY3V0ZSBpdCwgZmFsc2Ugb3RoZXJ3aXNlLgorYm9vbCBjYW5fZXhlY3V0ZShjb25zdCBUd2luZSAmUGF0aCk7CisKKy8vLyBAYnJpZWYgQ2FuIHdlIHdyaXRlIHRoaXMgZmlsZT8KKy8vLworLy8vIEBwYXJhbSBQYXRoIElucHV0IHBhdGguCisvLy8gQHJldHVybnMgVHJ1ZSBpZiB3ZSBjYW4gd3JpdGUgdG8gaXQsIGZhbHNlIG90aGVyd2lzZS4KK2lubGluZSBib29sIGNhbl93cml0ZShjb25zdCBUd2luZSAmUGF0aCkgeworICByZXR1cm4gIWFjY2VzcyhQYXRoLCBBY2Nlc3NNb2RlOjpXcml0ZSk7Cit9CisKKy8vLyBAYnJpZWYgRG8gZmlsZV9zdGF0dXMncyByZXByZXNlbnQgdGhlIHNhbWUgdGhpbmc/CisvLy8KKy8vLyBAcGFyYW0gQSBJbnB1dCBmaWxlX3N0YXR1cy4KKy8vLyBAcGFyYW0gQiBJbnB1dCBmaWxlX3N0YXR1cy4KKy8vLworLy8vIGFzc2VydChzdGF0dXNfa25vd24oQSkgfHwgc3RhdHVzX2tub3duKEIpKTsKKy8vLworLy8vIEByZXR1cm5zIFRydWUgaWYgQSBhbmQgQiBib3RoIHJlcHJlc2VudCB0aGUgc2FtZSBmaWxlIHN5c3RlbSBlbnRpdHksIGZhbHNlCisvLy8gICAgICAgICAgb3RoZXJ3aXNlLgorYm9vbCBlcXVpdmFsZW50KGZpbGVfc3RhdHVzIEEsIGZpbGVfc3RhdHVzIEIpOworCisvLy8gQGJyaWVmIERvIHBhdGhzIHJlcHJlc2VudCB0aGUgc2FtZSB0aGluZz8KKy8vLworLy8vIGFzc2VydChzdGF0dXNfa25vd24oQSkgfHwgc3RhdHVzX2tub3duKEIpKTsKKy8vLworLy8vIEBwYXJhbSBBIElucHV0IHBhdGggQS4KKy8vLyBAcGFyYW0gQiBJbnB1dCBwYXRoIEIuCisvLy8gQHBhcmFtIHJlc3VsdCBTZXQgdG8gdHJ1ZSBpZiBzdGF0KEEpIGFuZCBzdGF0KEIpIGhhdmUgdGhlIHNhbWUgZGV2aWNlIGFuZAorLy8vICAgICAgICAgICAgICAgaW5vZGUgKG9yIGVxdWl2YWxlbnQpLgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgcmVzdWx0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZXQsIG90aGVyd2lzZSBhCisvLy8gICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZS4KK3N0ZDo6ZXJyb3JfY29kZSBlcXVpdmFsZW50KGNvbnN0IFR3aW5lICZBLCBjb25zdCBUd2luZSAmQiwgYm9vbCAmcmVzdWx0KTsKKworLy8vIEBicmllZiBTaW1wbGVyIHZlcnNpb24gb2YgZXF1aXZhbGVudCBmb3IgY2xpZW50cyB0aGF0IGRvbid0IG5lZWQgdG8KKy8vLyAgICAgICAgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGFuIGVycm9yIGFuZCBmYWxzZS4KK2lubGluZSBib29sIGVxdWl2YWxlbnQoY29uc3QgVHdpbmUgJkEsIGNvbnN0IFR3aW5lICZCKSB7CisgIGJvb2wgcmVzdWx0OworICByZXR1cm4gIWVxdWl2YWxlbnQoQSwgQiwgcmVzdWx0KSAmJiByZXN1bHQ7Cit9CisKKy8vLyBAYnJpZWYgSXMgdGhlIGZpbGUgbW91bnRlZCBvbiBhIGxvY2FsIGZpbGVzeXN0ZW0/CisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEBwYXJhbSByZXN1bHQgU2V0IHRvIHRydWUgaWYgXGEgcGF0aCBpcyBvbiBmaXhlZCBtZWRpYSBzdWNoIGFzIGEgaGFyZCBkaXNrLAorLy8vICAgICAgICAgICAgICAgZmFsc2UgaWYgaXQgaXMgbm90LgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgcmVzdWx0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZXQsIG90aGVyd2lzZSBhCisvLy8gICAgICAgICAgcGxhdGZvcm0gc3BlY2lmaWMgZXJyb3JfY29kZS4KK3N0ZDo6ZXJyb3JfY29kZSBpc19sb2NhbChjb25zdCBUd2luZSAmcGF0aCwgYm9vbCAmcmVzdWx0KTsKKworLy8vIEBicmllZiBWZXJzaW9uIG9mIGlzX2xvY2FsIGFjY2VwdGluZyBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvci4KK3N0ZDo6ZXJyb3JfY29kZSBpc19sb2NhbChpbnQgRkQsIGJvb2wgJnJlc3VsdCk7CisKKy8vLyBAYnJpZWYgU2ltcGxlciB2ZXJzaW9uIG9mIGlzX2xvY2FsIGZvciBjbGllbnRzIHRoYXQgZG9uJ3QgbmVlZCB0bworLy8vICAgICAgICBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYW4gZXJyb3IgYW5kIGZhbHNlLgoraW5saW5lIGJvb2wgaXNfbG9jYWwoY29uc3QgVHdpbmUgJlBhdGgpIHsKKyAgYm9vbCBSZXN1bHQ7CisgIHJldHVybiAhaXNfbG9jYWwoUGF0aCwgUmVzdWx0KSAmJiBSZXN1bHQ7Cit9CisKKy8vLyBAYnJpZWYgU2ltcGxlciB2ZXJzaW9uIG9mIGlzX2xvY2FsIGFjY2VwdGluZyBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciBmb3IKKy8vLyAgICAgICAgY2xpZW50cyB0aGF0IGRvbid0IG5lZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGFuIGVycm9yIGFuZCBmYWxzZS4KK2lubGluZSBib29sIGlzX2xvY2FsKGludCBGRCkgeworICBib29sIFJlc3VsdDsKKyAgcmV0dXJuICFpc19sb2NhbChGRCwgUmVzdWx0KSAmJiBSZXN1bHQ7Cit9CisKKy8vLyBAYnJpZWYgRG9lcyBzdGF0dXMgcmVwcmVzZW50IGEgZGlyZWN0b3J5PworLy8vCisvLy8gQHBhcmFtIFBhdGggVGhlIHBhdGggdG8gZ2V0IHRoZSB0eXBlIG9mLgorLy8vIEBwYXJhbSBGb2xsb3cgRm9yIHN5bWJvbGljIGxpbmtzLCBpbmRpY2F0ZXMgd2hldGhlciB0byByZXR1cm4gdGhlIGZpbGUgdHlwZQorLy8vICAgICAgICAgICAgICAgb2YgdGhlIGxpbmsgaXRzZWxmLCBvciBvZiB0aGUgdGFyZ2V0LgorLy8vIEByZXR1cm5zIEEgdmFsdWUgZnJvbSB0aGUgZmlsZV90eXBlIGVudW1lcmF0aW9uIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgZmlsZS4KK2ZpbGVfdHlwZSBnZXRfZmlsZV90eXBlKGNvbnN0IFR3aW5lICZQYXRoLCBib29sIEZvbGxvdyA9IHRydWUpOworCisvLy8gQGJyaWVmIERvZXMgc3RhdHVzIHJlcHJlc2VudCBhIGRpcmVjdG9yeT8KKy8vLworLy8vIEBwYXJhbSBzdGF0dXMgQSBiYXNpY19maWxlX3N0YXR1cyBwcmV2aW91c2x5IHJldHVybmVkIGZyb20gc3RhdHVzLgorLy8vIEByZXR1cm5zIHN0YXR1cy50eXBlKCkgPT0gZmlsZV90eXBlOjpkaXJlY3RvcnlfZmlsZS4KK2Jvb2wgaXNfZGlyZWN0b3J5KGNvbnN0IGJhc2ljX2ZpbGVfc3RhdHVzICZzdGF0dXMpOworCisvLy8gQGJyaWVmIElzIHBhdGggYSBkaXJlY3Rvcnk/CisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEBwYXJhbSByZXN1bHQgU2V0IHRvIHRydWUgaWYgXGEgcGF0aCBpcyBhIGRpcmVjdG9yeSAoYWZ0ZXIgZm9sbG93aW5nCisvLy8gICAgICAgICAgICAgICBzeW1saW5rcywgZmFsc2UgaWYgaXQgaXMgbm90LiBVbmRlZmluZWQgb3RoZXJ3aXNlLgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgcmVzdWx0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZXQsIG90aGVyd2lzZSBhCisvLy8gICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZS4KK3N0ZDo6ZXJyb3JfY29kZSBpc19kaXJlY3RvcnkoY29uc3QgVHdpbmUgJnBhdGgsIGJvb2wgJnJlc3VsdCk7CisKKy8vLyBAYnJpZWYgU2ltcGxlciB2ZXJzaW9uIG9mIGlzX2RpcmVjdG9yeSBmb3IgY2xpZW50cyB0aGF0IGRvbid0IG5lZWQgdG8KKy8vLyAgICAgICAgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGFuIGVycm9yIGFuZCBmYWxzZS4KK2lubGluZSBib29sIGlzX2RpcmVjdG9yeShjb25zdCBUd2luZSAmUGF0aCkgeworICBib29sIFJlc3VsdDsKKyAgcmV0dXJuICFpc19kaXJlY3RvcnkoUGF0aCwgUmVzdWx0KSAmJiBSZXN1bHQ7Cit9CisKKy8vLyBAYnJpZWYgRG9lcyBzdGF0dXMgcmVwcmVzZW50IGEgcmVndWxhciBmaWxlPworLy8vCisvLy8gQHBhcmFtIHN0YXR1cyBBIGJhc2ljX2ZpbGVfc3RhdHVzIHByZXZpb3VzbHkgcmV0dXJuZWQgZnJvbSBzdGF0dXMuCisvLy8gQHJldHVybnMgc3RhdHVzX2tub3duKHN0YXR1cykgJiYgc3RhdHVzLnR5cGUoKSA9PSBmaWxlX3R5cGU6OnJlZ3VsYXJfZmlsZS4KK2Jvb2wgaXNfcmVndWxhcl9maWxlKGNvbnN0IGJhc2ljX2ZpbGVfc3RhdHVzICZzdGF0dXMpOworCisvLy8gQGJyaWVmIElzIHBhdGggYSByZWd1bGFyIGZpbGU/CisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEBwYXJhbSByZXN1bHQgU2V0IHRvIHRydWUgaWYgXGEgcGF0aCBpcyBhIHJlZ3VsYXIgZmlsZSAoYWZ0ZXIgZm9sbG93aW5nCisvLy8gICAgICAgICAgICAgICBzeW1saW5rcyksIGZhbHNlIGlmIGl0IGlzIG5vdC4gVW5kZWZpbmVkIG90aGVyd2lzZS4KKy8vLyBAcmV0dXJucyBlcnJjOjpzdWNjZXNzIGlmIHJlc3VsdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2V0LCBvdGhlcndpc2UgYQorLy8vICAgICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIGVycm9yX2NvZGUuCitzdGQ6OmVycm9yX2NvZGUgaXNfcmVndWxhcl9maWxlKGNvbnN0IFR3aW5lICZwYXRoLCBib29sICZyZXN1bHQpOworCisvLy8gQGJyaWVmIFNpbXBsZXIgdmVyc2lvbiBvZiBpc19yZWd1bGFyX2ZpbGUgZm9yIGNsaWVudHMgdGhhdCBkb24ndCBuZWVkIHRvCisvLy8gICAgICAgIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhbiBlcnJvciBhbmQgZmFsc2UuCitpbmxpbmUgYm9vbCBpc19yZWd1bGFyX2ZpbGUoY29uc3QgVHdpbmUgJlBhdGgpIHsKKyAgYm9vbCBSZXN1bHQ7CisgIGlmIChpc19yZWd1bGFyX2ZpbGUoUGF0aCwgUmVzdWx0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vLyBAYnJpZWYgRG9lcyBzdGF0dXMgcmVwcmVzZW50IGEgc3ltbGluayBmaWxlPworLy8vCisvLy8gQHBhcmFtIHN0YXR1cyBBIGJhc2ljX2ZpbGVfc3RhdHVzIHByZXZpb3VzbHkgcmV0dXJuZWQgZnJvbSBzdGF0dXMuCisvLy8gQHJldHVybnMgc3RhdHVzX2tub3duKHN0YXR1cykgJiYgc3RhdHVzLnR5cGUoKSA9PSBmaWxlX3R5cGU6OnN5bWxpbmtfZmlsZS4KK2Jvb2wgaXNfc3ltbGlua19maWxlKGNvbnN0IGJhc2ljX2ZpbGVfc3RhdHVzICZzdGF0dXMpOworCisvLy8gQGJyaWVmIElzIHBhdGggYSBzeW1saW5rIGZpbGU/CisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEBwYXJhbSByZXN1bHQgU2V0IHRvIHRydWUgaWYgXGEgcGF0aCBpcyBhIHN5bWxpbmsgZmlsZSwgZmFsc2UgaWYgaXQgaXMgbm90LgorLy8vICAgICAgICAgICAgICAgVW5kZWZpbmVkIG90aGVyd2lzZS4KKy8vLyBAcmV0dXJucyBlcnJjOjpzdWNjZXNzIGlmIHJlc3VsdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2V0LCBvdGhlcndpc2UgYQorLy8vICAgICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIGVycm9yX2NvZGUuCitzdGQ6OmVycm9yX2NvZGUgaXNfc3ltbGlua19maWxlKGNvbnN0IFR3aW5lICZwYXRoLCBib29sICZyZXN1bHQpOworCisvLy8gQGJyaWVmIFNpbXBsZXIgdmVyc2lvbiBvZiBpc19zeW1saW5rX2ZpbGUgZm9yIGNsaWVudHMgdGhhdCBkb24ndCBuZWVkIHRvCisvLy8gICAgICAgIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhbiBlcnJvciBhbmQgZmFsc2UuCitpbmxpbmUgYm9vbCBpc19zeW1saW5rX2ZpbGUoY29uc3QgVHdpbmUgJlBhdGgpIHsKKyAgYm9vbCBSZXN1bHQ7CisgIGlmIChpc19zeW1saW5rX2ZpbGUoUGF0aCwgUmVzdWx0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vLyBAYnJpZWYgRG9lcyB0aGlzIHN0YXR1cyByZXByZXNlbnQgc29tZXRoaW5nIHRoYXQgZXhpc3RzIGJ1dCBpcyBub3QgYQorLy8vICAgICAgICBkaXJlY3Rvcnkgb3IgcmVndWxhciBmaWxlPworLy8vCisvLy8gQHBhcmFtIHN0YXR1cyBBIGJhc2ljX2ZpbGVfc3RhdHVzIHByZXZpb3VzbHkgcmV0dXJuZWQgZnJvbSBzdGF0dXMuCisvLy8gQHJldHVybnMgZXhpc3RzKHMpICYmICFpc19yZWd1bGFyX2ZpbGUocykgJiYgIWlzX2RpcmVjdG9yeShzKQorYm9vbCBpc19vdGhlcihjb25zdCBiYXNpY19maWxlX3N0YXR1cyAmc3RhdHVzKTsKKworLy8vIEBicmllZiBJcyBwYXRoIHNvbWV0aGluZyB0aGF0IGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5LAorLy8vICAgICAgICByZWd1bGFyIGZpbGUsIG9yIHN5bWxpbms/CisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEBwYXJhbSByZXN1bHQgU2V0IHRvIHRydWUgaWYgXGEgcGF0aCBleGlzdHMsIGJ1dCBpcyBub3QgYSBkaXJlY3RvcnksIHJlZ3VsYXIKKy8vLyAgICAgICAgICAgICAgIGZpbGUsIG9yIGEgc3ltbGluaywgZmFsc2UgaWYgaXQgZG9lcyBub3QuIFVuZGVmaW5lZCBvdGhlcndpc2UuCisvLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiByZXN1bHQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNldCwgb3RoZXJ3aXNlIGEKKy8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgorc3RkOjplcnJvcl9jb2RlIGlzX290aGVyKGNvbnN0IFR3aW5lICZwYXRoLCBib29sICZyZXN1bHQpOworCisvLy8gQGJyaWVmIEdldCBmaWxlIHN0YXR1cyBhcyBpZiBieSBQT1NJWCBzdGF0KCkuCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEBwYXJhbSByZXN1bHQgU2V0IHRvIHRoZSBmaWxlIHN0YXR1cy4KKy8vLyBAcGFyYW0gZm9sbG93IFdoZW4gdHJ1ZSwgZm9sbG93cyBzeW1saW5rcy4gIE90aGVyd2lzZSwgdGhlIHN5bWxpbmsgaXRzZWxmIGlzCisvLy8gICAgICAgICAgICAgICBzdGF0dGVkLgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgcmVzdWx0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZXQsIG90aGVyd2lzZSBhCisvLy8gICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZS4KK3N0ZDo6ZXJyb3JfY29kZSBzdGF0dXMoY29uc3QgVHdpbmUgJnBhdGgsIGZpbGVfc3RhdHVzICZyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9sbG93ID0gdHJ1ZSk7CisKKy8vLyBAYnJpZWYgQSB2ZXJzaW9uIGZvciB3aGVuIGEgZmlsZSBkZXNjcmlwdG9yIGlzIGFscmVhZHkgYXZhaWxhYmxlLgorc3RkOjplcnJvcl9jb2RlIHN0YXR1cyhpbnQgRkQsIGZpbGVfc3RhdHVzICZSZXN1bHQpOworCisvLy8gQGJyaWVmIFNldCBmaWxlIHBlcm1pc3Npb25zLgorLy8vCisvLy8gQHBhcmFtIFBhdGggRmlsZSB0byBzZXQgcGVybWlzc2lvbnMgb24uCisvLy8gQHBhcmFtIFBlcm1pc3Npb25zIE5ldyBmaWxlIHBlcm1pc3Npb25zLgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgdGhlIHBlcm1pc3Npb25zIHdlcmUgc3VjY2Vzc2Z1bGx5IHNldCwgb3RoZXJ3aXNlCisvLy8gICAgICAgICAgYSBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgorLy8vIEBub3RlIE9uIFdpbmRvd3MsIGFsbCBwZXJtaXNzaW9ucyBleGNlcHQgKl93cml0ZSBhcmUgaWdub3JlZC4gVXNpbmcgYW55IG9mCisvLy8gICAgICAgb3duZXJfd3JpdGUsIGdyb3VwX3dyaXRlLCBvciBhbGxfd3JpdGUgd2lsbCBtYWtlIHRoZSBmaWxlIHdyaXRhYmxlLgorLy8vICAgICAgIE90aGVyd2lzZSwgdGhlIGZpbGUgd2lsbCBiZSBtYXJrZWQgYXMgcmVhZC1vbmx5Lgorc3RkOjplcnJvcl9jb2RlIHNldFBlcm1pc3Npb25zKGNvbnN0IFR3aW5lICZQYXRoLCBwZXJtcyBQZXJtaXNzaW9ucyk7CisKKy8vLyBAYnJpZWYgR2V0IGZpbGUgcGVybWlzc2lvbnMuCisvLy8KKy8vLyBAcGFyYW0gUGF0aCBGaWxlIHRvIGdldCBwZXJtaXNzaW9ucyBmcm9tLgorLy8vIEByZXR1cm5zIHRoZSBwZXJtaXNzaW9ucyBpZiB0aGV5IHdlcmUgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCwgb3RoZXJ3aXNlIGEKKy8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgorLy8vIEBub3RlIE9uIFdpbmRvd3MsIGlmIHRoZSBmaWxlIGRvZXMgbm90IGhhdmUgdGhlIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZCisvLy8gICAgICAgYXR0cmlidXRlLCBhbGxfYWxsIHdpbGwgYmUgcmV0dXJuZWQuIE90aGVyd2lzZSwgYWxsX3JlYWQgfCBhbGxfZXhlCisvLy8gICAgICAgd2lsbCBiZSByZXR1cm5lZC4KK0Vycm9yT3I8cGVybXM+IGdldFBlcm1pc3Npb25zKGNvbnN0IFR3aW5lICZQYXRoKTsKKworLy8vIEBicmllZiBHZXQgZmlsZSBzaXplLgorLy8vCisvLy8gQHBhcmFtIFBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcGFyYW0gUmVzdWx0IFNldCB0byB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBpbiBcYSBQYXRoLgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgcmVzdWx0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZXQsIG90aGVyd2lzZSBhCisvLy8gICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZS4KK2lubGluZSBzdGQ6OmVycm9yX2NvZGUgZmlsZV9zaXplKGNvbnN0IFR3aW5lICZQYXRoLCB1aW50NjRfdCAmUmVzdWx0KSB7CisgIGZpbGVfc3RhdHVzIFN0YXR1czsKKyAgc3RkOjplcnJvcl9jb2RlIEVDID0gc3RhdHVzKFBhdGgsIFN0YXR1cyk7CisgIGlmIChFQykKKyAgICByZXR1cm4gRUM7CisgIFJlc3VsdCA9IFN0YXR1cy5nZXRTaXplKCk7CisgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKK30KKworLy8vIEBicmllZiBTZXQgdGhlIGZpbGUgbW9kaWZpY2F0aW9uIGFuZCBhY2Nlc3MgdGltZS4KKy8vLworLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgdGhlIGZpbGUgdGltZXMgd2VyZSBzdWNjZXNzZnVsbHkgc2V0LCBvdGhlcndpc2UgYQorLy8vICAgICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIGVycm9yX2NvZGUgb3IgZXJyYzo6ZnVuY3Rpb25fbm90X3N1cHBvcnRlZCBvbgorLy8vICAgICAgICAgIHBsYXRmb3JtcyB3aGVyZSB0aGUgZnVuY3Rpb25hbGl0eSBpc24ndCBhdmFpbGFibGUuCitzdGQ6OmVycm9yX2NvZGUgc2V0TGFzdE1vZGlmaWNhdGlvbkFuZEFjY2Vzc1RpbWUoaW50IEZELCBUaW1lUG9pbnQ8PiBUaW1lKTsKKworLy8vIEBicmllZiBJcyBzdGF0dXMgYXZhaWxhYmxlPworLy8vCisvLy8gQHBhcmFtIHMgSW5wdXQgZmlsZSBzdGF0dXMuCisvLy8gQHJldHVybnMgVHJ1ZSBpZiBzdGF0dXMoKSAhPSBzdGF0dXNfZXJyb3IuCitib29sIHN0YXR1c19rbm93bihjb25zdCBiYXNpY19maWxlX3N0YXR1cyAmcyk7CisKKy8vLyBAYnJpZWYgSXMgc3RhdHVzIGF2YWlsYWJsZT8KKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHBhcmFtIHJlc3VsdCBTZXQgdG8gdHJ1ZSBpZiBzdGF0dXMoKSAhPSBzdGF0dXNfZXJyb3IuCisvLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiByZXN1bHQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNldCwgb3RoZXJ3aXNlIGEKKy8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgorc3RkOjplcnJvcl9jb2RlIHN0YXR1c19rbm93bihjb25zdCBUd2luZSAmcGF0aCwgYm9vbCAmcmVzdWx0KTsKKworZW51bSBPcGVuRmxhZ3MgOiB1bnNpZ25lZCB7CisgIEZfTm9uZSA9IDAsCisKKyAgLy8vIEZfRXhjbCAtIFdoZW4gb3BlbmluZyBhIGZpbGUsIHRoaXMgZmxhZyBtYWtlcyByYXdfZmRfb3N0cmVhbQorICAvLy8gcmVwb3J0IGFuIGVycm9yIGlmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLgorICBGX0V4Y2wgPSAxLAorCisgIC8vLyBGX0FwcGVuZCAtIFdoZW4gb3BlbmluZyBhIGZpbGUsIGlmIGl0IGFscmVhZHkgZXhpc3RzIGFwcGVuZCB0byB0aGUKKyAgLy8vIGV4aXN0aW5nIGZpbGUgaW5zdGVhZCBvZiByZXR1cm5pbmcgYW4gZXJyb3IuICBUaGlzIG1heSBub3QgYmUgc3BlY2lmaWVkCisgIC8vLyB3aXRoIEZfRXhjbC4KKyAgRl9BcHBlbmQgPSAyLAorCisgIC8vLyBGX05vVHJ1bmMgLSBXaGVuIG9wZW5pbmcgYSBmaWxlLCBpZiBpdCBhbHJlYWR5IGV4aXN0cyBkb24ndCB0cnVuY2F0ZQorICAvLy8gdGhlIGZpbGUgY29udGVudHMuICBGX0FwcGVuZCBpbXBsaWVzIEZfTm9UcnVuYywgYnV0IEZfQXBwZW5kIHNlZWtzIHRvCisgIC8vLyB0aGUgZW5kIG9mIHRoZSBmaWxlLCB3aGljaCBGX05vVHJ1bmMgZG9lc24ndC4KKyAgRl9Ob1RydW5jID0gNCwKKworICAvLy8gVGhlIGZpbGUgc2hvdWxkIGJlIG9wZW5lZCBpbiB0ZXh0IG1vZGUgb24gcGxhdGZvcm1zIHRoYXQgbWFrZSB0aGlzCisgIC8vLyBkaXN0aW5jdGlvbi4KKyAgRl9UZXh0ID0gOCwKKworICAvLy8gT3BlbiB0aGUgZmlsZSBmb3IgcmVhZCBhbmQgd3JpdGUuCisgIEZfUlcgPSAxNiwKKworICAvLy8gRGVsZXRlIHRoZSBmaWxlIG9uIGNsb3NlLiBPbmx5IG1ha2VzIGEgZGlmZmVyZW5jZSBvbiB3aW5kb3dzLgorICBGX0RlbGV0ZSA9IDMyCit9OworCisvLy8gQGJyaWVmIENyZWF0ZSBhIHVuaXF1ZWx5IG5hbWVkIGZpbGUuCisvLy8KKy8vLyBHZW5lcmF0ZXMgYSB1bmlxdWUgcGF0aCBzdWl0YWJsZSBmb3IgYSB0ZW1wb3JhcnkgZmlsZSBhbmQgdGhlbiBvcGVucyBpdCBhcyBhCisvLy8gZmlsZS4gVGhlIG5hbWUgaXMgYmFzZWQgb24gXGEgbW9kZWwgd2l0aCAnJScgcmVwbGFjZWQgYnkgYSByYW5kb20gY2hhciBpbgorLy8vIFswLTlhLWZdLiBJZiBcYSBtb2RlbCBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aCwgdGhlIHRlbXBvcmFyeSBmaWxlIHdpbGwgYmUKKy8vLyBjcmVhdGVkIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKy8vLworLy8vIEV4YW1wbGU6IGNsYW5nLSUlLSUlLSUlLSUlLSUlLnMgPT4gY2xhbmctYTAtYjEtYzItZDMtZTQucworLy8vCisvLy8gVGhpcyBpcyBhbiBhdG9taWMgb3BlcmF0aW9uLiBFaXRoZXIgdGhlIGZpbGUgaXMgY3JlYXRlZCBhbmQgb3BlbmVkLCBvciB0aGUKKy8vLyBmaWxlIHN5c3RlbSBpcyBsZWZ0IHVudG91Y2hlZC4KKy8vLworLy8vIFRoZSBpbnRlbmRlZCB1c2UgaXMgZm9yIGZpbGVzIHRoYXQgYXJlIHRvIGJlIGtlcHQsIHBvc3NpYmx5IGFmdGVyCisvLy8gcmVuYW1pbmcgdGhlbS4gRm9yIGV4YW1wbGUsIHdoZW4gcnVubmluZyAnY2xhbmcgLWMgZm9vLm8nLCB0aGUgZmlsZSBjYW4KKy8vLyBiZSBmaXJzdCBjcmVhdGVkIGFzIGZvby1hYmMxMjMubyBhbmQgdGhlbiByZW5hbWVkLgorLy8vCisvLy8gQHBhcmFtIE1vZGVsIE5hbWUgdG8gYmFzZSB1bmlxdWUgcGF0aCBvZmYgb2YuCisvLy8gQHBhcmFtIFJlc3VsdEZEIFNldCB0byB0aGUgb3BlbmVkIGZpbGUncyBmaWxlIGRlc2NyaXB0b3IuCisvLy8gQHBhcmFtIFJlc3VsdFBhdGggU2V0IHRvIHRoZSBvcGVuZWQgZmlsZSdzIGFic29sdXRlIHBhdGguCisvLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiBSZXN1bHR7RkQsUGF0aH0gaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBzZXQsCisvLy8gICAgICAgICAgb3RoZXJ3aXNlIGEgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZS4KK3N0ZDo6ZXJyb3JfY29kZSBjcmVhdGVVbmlxdWVGaWxlKGNvbnN0IFR3aW5lICZNb2RlbCwgaW50ICZSZXN1bHRGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1vZGUgPSBhbGxfcmVhZCB8IGFsbF93cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5czo6ZnM6Ok9wZW5GbGFncyBGbGFncyA9IHN5czo6ZnM6OkZfUlcpOworCisvLy8gQGJyaWVmIFNpbXBsZXIgdmVyc2lvbiBmb3IgY2xpZW50cyB0aGF0IGRvbid0IHdhbnQgYW4gb3BlbiBmaWxlLiBBbiBlbXB0eQorLy8vIGZpbGUgd2lsbCBzdGlsbCBiZSBjcmVhdGVkLgorc3RkOjplcnJvcl9jb2RlIGNyZWF0ZVVuaXF1ZUZpbGUoY29uc3QgVHdpbmUgJk1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZSZXN1bHRQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTW9kZSA9IGFsbF9yZWFkIHwgYWxsX3dyaXRlKTsKKworLy8vIFJlcHJlc2VudHMgYSB0ZW1wb3JhcnkgZmlsZS4KKy8vLworLy8vIFRoZSB0ZW1wb3JhcnkgZmlsZSBtdXN0IGJlIGV2ZW50dWFsbHkgZGlzY2FyZGVkIG9yIGdpdmVuIGEgZmluYWwgbmFtZSBhbmQKKy8vLyBrZXB0LgorLy8vCisvLy8gVGhlIGRlc3RydWN0b3IgZG9lc24ndCBpbXBsaWNpdGx5IGRpc2NhcmQgYmVjYXVzZSB0aGVyZSBpcyBubyB3YXkgdG8KKy8vLyBwcm9wZXJseSBoYW5kbGUgZXJyb3JzIGluIGEgZGVzdHJ1Y3Rvci4KK2NsYXNzIFRlbXBGaWxlIHsKKyAgYm9vbCBEb25lID0gZmFsc2U7CisgIFRlbXBGaWxlKFN0cmluZ1JlZiBOYW1lLCBpbnQgRkQpOworCitwdWJsaWM6CisgIC8vLyBUaGlzIGNyZWF0ZXMgYSB0ZW1wb3JhcnkgZmlsZSB3aXRoIGNyZWF0ZVVuaXF1ZUZpbGUgYW5kIHNjaGVkdWxlcyBpdCBmb3IKKyAgLy8vIGRlbGV0aW9uIHdpdGggc3lzOjpSZW1vdmVGaWxlT25TaWduYWwuCisgIHN0YXRpYyBFeHBlY3RlZDxUZW1wRmlsZT4gY3JlYXRlKGNvbnN0IFR3aW5lICZNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTW9kZSA9IGFsbF9yZWFkIHwgYWxsX3dyaXRlKTsKKyAgVGVtcEZpbGUoVGVtcEZpbGUgJiZPdGhlcik7CisgIFRlbXBGaWxlICZvcGVyYXRvcj0oVGVtcEZpbGUgJiZPdGhlcik7CisKKyAgLy8gTmFtZSBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUuCisgIHN0ZDo6c3RyaW5nIFRtcE5hbWU7CisKKyAgLy8gVGhlIG9wZW4gZmlsZSBkZXNjcmlwdG9yLgorICBpbnQgRkQgPSAtMTsKKworICAvLyBLZWVwIHRoaXMgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgRXJyb3Iga2VlcChjb25zdCBUd2luZSAmTmFtZSk7CisKKyAgLy8gS2VlcCB0aGlzIHdpdGggdGhlIHRlbXBvcmFyeSBuYW1lLgorICBFcnJvciBrZWVwKCk7CisKKyAgLy8gRGVsZXRlIHRoZSBmaWxlLgorICBFcnJvciBkaXNjYXJkKCk7CisKKyAgLy8gVGhpcyBjaGVja3MgdGhhdCBrZWVwIG9yIGRlbGV0ZSB3YXMgY2FsbGVkLgorICB+VGVtcEZpbGUoKTsKK307CisKKy8vLyBAYnJpZWYgQ3JlYXRlIGEgZmlsZSBpbiB0aGUgc3lzdGVtIHRlbXBvcmFyeSBkaXJlY3RvcnkuCisvLy8KKy8vLyBUaGUgZmlsZW5hbWUgaXMgb2YgdGhlIGZvcm0gcHJlZml4LXJhbmRvbV9jaGFycy5zdWZmaXguIFNpbmNlIHRoZSBkaXJlY3RvcnkKKy8vLyBpcyBub3Qga25vdyB0byB0aGUgY2FsbGVyLCBQcmVmaXggYW5kIFN1ZmZpeCBjYW5ub3QgaGF2ZSBwYXRoIHNlcGFyYXRvcnMuCisvLy8gVGhlIGZpbGVzIGFyZSBjcmVhdGVkIHdpdGggbW9kZSAwNjAwLgorLy8vCisvLy8gVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgdGhpbmdzIGxpa2UgYSB0ZW1wb3JhcnkgLnMgdGhhdCBpcyByZW1vdmVkIGFmdGVyCisvLy8gcnVubmluZyB0aGUgYXNzZW1ibGVyLgorc3RkOjplcnJvcl9jb2RlIGNyZWF0ZVRlbXBvcmFyeUZpbGUoY29uc3QgVHdpbmUgJlByZWZpeCwgU3RyaW5nUmVmIFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmUmVzdWx0RkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlJlc3VsdFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXM6OmZzOjpPcGVuRmxhZ3MgRmxhZ3MgPSBzeXM6OmZzOjpGX1JXKTsKKworLy8vIEBicmllZiBTaW1wbGVyIHZlcnNpb24gZm9yIGNsaWVudHMgdGhhdCBkb24ndCB3YW50IGFuIG9wZW4gZmlsZS4gQW4gZW1wdHkKKy8vLyBmaWxlIHdpbGwgc3RpbGwgYmUgY3JlYXRlZC4KK3N0ZDo6ZXJyb3JfY29kZSBjcmVhdGVUZW1wb3JhcnlGaWxlKGNvbnN0IFR3aW5lICZQcmVmaXgsIFN0cmluZ1JlZiBTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlJlc3VsdFBhdGgpOworCitzdGQ6OmVycm9yX2NvZGUgY3JlYXRlVW5pcXVlRGlyZWN0b3J5KGNvbnN0IFR3aW5lICZQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0UGF0aCk7CisKKy8vLyBAYnJpZWYgR2V0IGEgdW5pcXVlIG5hbWUsIG5vdCBjdXJyZW50bHkgZXhpc2l0aW5nIGluIHRoZSBmaWxlc3lzdGVtLiBTdWJqZWN0CisvLy8gdG8gcmFjZSBjb25kaXRpb25zLCBwcmVmZXIgdG8gdXNlIGNyZWF0ZVVuaXF1ZUZpbGUgaW5zdGVhZC4KKy8vLworLy8vIFNpbWlsYXIgdG8gY3JlYXRlVW5pcXVlRmlsZSwgYnV0IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBmaWxlIG9ubHkKKy8vLyBjaGVja3MgaWYgaXQgZXhpc3RzLiBUaGlzIGZ1bmN0aW9uIGlzIHN1YmplY3QgdG8gcmFjZSBjb25kaXRpb25zLCBpZiB5b3UKKy8vLyB3YW50IHRvIHVzZSB0aGUgcmV0dXJuZWQgbmFtZSB0byBhY3R1YWxseSBjcmVhdGUgYSBmaWxlLCB1c2UKKy8vLyBjcmVhdGVVbmlxdWVGaWxlIGluc3RlYWQuCitzdGQ6OmVycm9yX2NvZGUgZ2V0UG90ZW50aWFsbHlVbmlxdWVGaWxlTmFtZShjb25zdCBUd2luZSAmTW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlJlc3VsdFBhdGgpOworCisvLy8gQGJyaWVmIEdldCBhIHVuaXF1ZSB0ZW1wb3JhcnkgZmlsZSBuYW1lLCBub3QgY3VycmVudGx5IGV4aXNpdGluZyBpbiB0aGUKKy8vLyBmaWxlc3lzdGVtLiBTdWJqZWN0IHRvIHJhY2UgY29uZGl0aW9ucywgcHJlZmVyIHRvIHVzZSBjcmVhdGVUZW1wb3JhcnlGaWxlCisvLy8gaW5zdGVhZC4KKy8vLworLy8vIFNpbWlsYXIgdG8gY3JlYXRlVGVtcG9yYXJ5RmlsZSwgYnV0IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBmaWxlIG9ubHkKKy8vLyBjaGVja3MgaWYgaXQgZXhpc3RzLiBUaGlzIGZ1bmN0aW9uIGlzIHN1YmplY3QgdG8gcmFjZSBjb25kaXRpb25zLCBpZiB5b3UKKy8vLyB3YW50IHRvIHVzZSB0aGUgcmV0dXJuZWQgbmFtZSB0byBhY3R1YWxseSBjcmVhdGUgYSBmaWxlLCB1c2UKKy8vLyBjcmVhdGVUZW1wb3JhcnlGaWxlIGluc3RlYWQuCitzdGQ6OmVycm9yX2NvZGUKK2dldFBvdGVudGlhbGx5VW5pcXVlVGVtcEZpbGVOYW1lKGNvbnN0IFR3aW5lICZQcmVmaXgsIFN0cmluZ1JlZiBTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlJlc3VsdFBhdGgpOworCitpbmxpbmUgT3BlbkZsYWdzIG9wZXJhdG9yfChPcGVuRmxhZ3MgQSwgT3BlbkZsYWdzIEIpIHsKKyAgcmV0dXJuIE9wZW5GbGFncyh1bnNpZ25lZChBKSB8IHVuc2lnbmVkKEIpKTsKK30KKworaW5saW5lIE9wZW5GbGFncyAmb3BlcmF0b3J8PShPcGVuRmxhZ3MgJkEsIE9wZW5GbGFncyBCKSB7CisgIEEgPSBBIHwgQjsKKyAgcmV0dXJuIEE7Cit9CisKK3N0ZDo6ZXJyb3JfY29kZSBvcGVuRmlsZUZvcldyaXRlKGNvbnN0IFR3aW5lICZOYW1lLCBpbnQgJlJlc3VsdEZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlbkZsYWdzIEZsYWdzLCB1bnNpZ25lZCBNb2RlID0gMDY2Nik7CisKK3N0ZDo6ZXJyb3JfY29kZSBvcGVuRmlsZUZvclJlYWQoY29uc3QgVHdpbmUgJk5hbWUsIGludCAmUmVzdWx0RkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAqUmVhbFBhdGggPSBudWxscHRyKTsKKworc3RkOjplcnJvcl9jb2RlIGdldFVuaXF1ZUlEKGNvbnN0IFR3aW5lIFBhdGgsIFVuaXF1ZUlEICZSZXN1bHQpOworCisvLy8gQGJyaWVmIEdldCBkaXNrIHNwYWNlIHVzYWdlIGluZm9ybWF0aW9uLgorLy8vCisvLy8gTm90ZTogVXNlcnMgbXVzdCBiZSBjYXJlZnVsIGFib3V0ICJUaW1lIE9mIENoZWNrLCBUaW1lIE9mIFVzZSIga2luZCBvZiBidWcuCisvLy8gTm90ZTogV2luZG93cyByZXBvcnRzIHJlc3VsdHMgYWNjb3JkaW5nIHRvIHRoZSBxdW90YSBhbGxvY2F0ZWQgdG8gdGhlIHVzZXIuCisvLy8KKy8vLyBAcGFyYW0gUGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXR1cm5zIGEgc3BhY2VfaW5mbyBzdHJ1Y3R1cmUgZmlsbGVkIHdpdGggdGhlIGNhcGFjaXR5LCBmcmVlLCBhbmQKKy8vLyBhdmFpbGFibGUgc3BhY2Ugb24gdGhlIGRldmljZSBcYSBQYXRoIGlzIG9uLiBBIHBsYXRmb3JtIHNwZWNpZmljIGVycm9yX2NvZGUKKy8vLyBpcyByZXR1cm5lZCBvbiBlcnJvci4KK0Vycm9yT3I8c3BhY2VfaW5mbz4gZGlza19zcGFjZShjb25zdCBUd2luZSAmUGF0aCk7CisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBtZW1vcnkgbWFwcGVkIGZpbGUuIEl0IGlzIGJhc2VkIG9uCisvLy8gYm9vc3Q6Omlvc3RyZWFtczo6bWFwcGVkX2ZpbGUuCitjbGFzcyBtYXBwZWRfZmlsZV9yZWdpb24geworcHVibGljOgorICBlbnVtIG1hcG1vZGUgeworICAgIHJlYWRvbmx5LCAvLy88IE1heSBvbmx5IGFjY2VzcyBtYXAgdmlhIGNvbnN0X2RhdGEgYXMgcmVhZCBvbmx5LgorICAgIHJlYWR3cml0ZSwgLy8vPCBNYXkgYWNjZXNzIG1hcCB2aWEgZGF0YSBhbmQgbW9kaWZ5IGl0LiBXcml0dGVuIHRvIHBhdGguCisgICAgcHJpdiAvLy88IE1heSBtb2RpZnkgdmlhIGRhdGEsIGJ1dCBjaGFuZ2VzIGFyZSBsb3N0IG9uIGRlc3RydWN0aW9uLgorICB9OworCitwcml2YXRlOgorICAvLy8gUGxhdGZvcm0tc3BlY2lmaWMgbWFwcGluZyBzdGF0ZS4KKyAgc2l6ZV90IFNpemU7CisgIHZvaWQgKk1hcHBpbmc7CisgIGludCBGRDsKKyAgbWFwbW9kZSBNb2RlOworCisgIHN0ZDo6ZXJyb3JfY29kZSBpbml0KGludCBGRCwgdWludDY0X3QgT2Zmc2V0LCBtYXBtb2RlIE1vZGUpOworCitwdWJsaWM6CisgIG1hcHBlZF9maWxlX3JlZ2lvbigpID0gZGVsZXRlOworICBtYXBwZWRfZmlsZV9yZWdpb24obWFwcGVkX2ZpbGVfcmVnaW9uJikgPSBkZWxldGU7CisgIG1hcHBlZF9maWxlX3JlZ2lvbiAmb3BlcmF0b3IgPShtYXBwZWRfZmlsZV9yZWdpb24mKSA9IGRlbGV0ZTsKKworICAvLy8gXHBhcmFtIGZkIEFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yIHRvIG1hcC4gbWFwcGVkX2ZpbGVfcmVnaW9uIHRha2VzCisgIC8vLyAgIG93bmVyc2hpcCBpZiBjbG9zZWZkIGlzIHRydWUuIEl0IG11c3QgaGF2ZSBiZWVuIG9wZW5kZWQgaW4gdGhlIGNvcnJlY3QKKyAgLy8vICAgbW9kZS4KKyAgbWFwcGVkX2ZpbGVfcmVnaW9uKGludCBmZCwgbWFwbW9kZSBtb2RlLCBzaXplX3QgbGVuZ3RoLCB1aW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVycm9yX2NvZGUgJmVjKTsKKworICB+bWFwcGVkX2ZpbGVfcmVnaW9uKCk7CisKKyAgc2l6ZV90IHNpemUoKSBjb25zdDsKKyAgY2hhciAqZGF0YSgpIGNvbnN0OworCisgIC8vLyBHZXQgYSBjb25zdCB2aWV3IG9mIHRoZSBkYXRhLiBNb2RpZnlpbmcgdGhpcyBtZW1vcnkgaGFzIHVuZGVmaW5lZAorICAvLy8gYmVoYXZpb3IuCisgIGNvbnN0IGNoYXIgKmNvbnN0X2RhdGEoKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgVGhlIG1pbmltdW0gYWxpZ25tZW50IG9mZnNldCBtdXN0IGJlLgorICBzdGF0aWMgaW50IGFsaWdubWVudCgpOworfTsKKworLy8vIFJldHVybiB0aGUgcGF0aCB0byB0aGUgbWFpbiBleGVjdXRhYmxlLCBnaXZlbiB0aGUgdmFsdWUgb2YgYXJndlswXSBmcm9tCisvLy8gcHJvZ3JhbSBzdGFydHVwIGFuZCB0aGUgYWRkcmVzcyBvZiBtYWluIGl0c2VsZi4gSW4gZXh0cmVtaXMsIHRoaXMgZnVuY3Rpb24KKy8vLyBtYXkgZmFpbCBhbmQgcmV0dXJuIGFuIGVtcHR5IHBhdGguCitzdGQ6OnN0cmluZyBnZXRNYWluRXhlY3V0YWJsZShjb25zdCBjaGFyICphcmd2MCwgdm9pZCAqTWFpbkV4ZWNBZGRyKTsKKworLy8vIEB9CisvLy8gQG5hbWUgSXRlcmF0b3JzCisvLy8gQHsKKworLy8vIGRpcmVjdG9yeV9lbnRyeSAtIEEgc2luZ2xlIGVudHJ5IGluIGEgZGlyZWN0b3J5LiBDYWNoZXMgdGhlIHN0YXR1cyBlaXRoZXIKKy8vLyBmcm9tIHRoZSByZXN1bHQgb2YgdGhlIGl0ZXJhdGlvbiBzeXNjYWxsLCBvciB0aGUgZmlyc3QgdGltZSBzdGF0dXMgaXMKKy8vLyBjYWxsZWQuCitjbGFzcyBkaXJlY3RvcnlfZW50cnkgeworICBzdGQ6OnN0cmluZyBQYXRoOworICBib29sIEZvbGxvd1N5bWxpbmtzOworICBiYXNpY19maWxlX3N0YXR1cyBTdGF0dXM7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgZGlyZWN0b3J5X2VudHJ5KGNvbnN0IFR3aW5lICZwYXRoLCBib29sIGZvbGxvd19zeW1saW5rcyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19maWxlX3N0YXR1cyBzdCA9IGJhc2ljX2ZpbGVfc3RhdHVzKCkpCisgICAgICA6IFBhdGgocGF0aC5zdHIoKSksIEZvbGxvd1N5bWxpbmtzKGZvbGxvd19zeW1saW5rcyksIFN0YXR1cyhzdCkge30KKworICBkaXJlY3RvcnlfZW50cnkoKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBhc3NpZ24oY29uc3QgVHdpbmUgJnBhdGgsIGJhc2ljX2ZpbGVfc3RhdHVzIHN0ID0gYmFzaWNfZmlsZV9zdGF0dXMoKSkgeworICAgIFBhdGggPSBwYXRoLnN0cigpOworICAgIFN0YXR1cyA9IHN0OworICB9CisKKyAgdm9pZCByZXBsYWNlX2ZpbGVuYW1lKGNvbnN0IFR3aW5lICZmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2ljX2ZpbGVfc3RhdHVzIHN0ID0gYmFzaWNfZmlsZV9zdGF0dXMoKSk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgoKSBjb25zdCB7IHJldHVybiBQYXRoOyB9CisgIEVycm9yT3I8YmFzaWNfZmlsZV9zdGF0dXM+IHN0YXR1cygpIGNvbnN0OworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBkaXJlY3RvcnlfZW50cnkmIHJocykgY29uc3QgeyByZXR1cm4gUGF0aCA9PSByaHMuUGF0aDsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgZGlyZWN0b3J5X2VudHJ5JiByaHMpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsgfQorICBib29sIG9wZXJhdG9yPCAoY29uc3QgZGlyZWN0b3J5X2VudHJ5JiByaHMpIGNvbnN0OworICBib29sIG9wZXJhdG9yPD0oY29uc3QgZGlyZWN0b3J5X2VudHJ5JiByaHMpIGNvbnN0OworICBib29sIG9wZXJhdG9yPiAoY29uc3QgZGlyZWN0b3J5X2VudHJ5JiByaHMpIGNvbnN0OworICBib29sIG9wZXJhdG9yPj0oY29uc3QgZGlyZWN0b3J5X2VudHJ5JiByaHMpIGNvbnN0OworfTsKKworbmFtZXNwYWNlIGRldGFpbCB7CisKKyAgc3RydWN0IERpckl0ZXJTdGF0ZTsKKworICBzdGQ6OmVycm9yX2NvZGUgZGlyZWN0b3J5X2l0ZXJhdG9yX2NvbnN0cnVjdChEaXJJdGVyU3RhdGUgJiwgU3RyaW5nUmVmLCBib29sKTsKKyAgc3RkOjplcnJvcl9jb2RlIGRpcmVjdG9yeV9pdGVyYXRvcl9pbmNyZW1lbnQoRGlySXRlclN0YXRlICYpOworICBzdGQ6OmVycm9yX2NvZGUgZGlyZWN0b3J5X2l0ZXJhdG9yX2Rlc3RydWN0KERpckl0ZXJTdGF0ZSAmKTsKKworICAvLy8gS2VlcHMgc3RhdGUgZm9yIHRoZSBkaXJlY3RvcnlfaXRlcmF0b3IuCisgIHN0cnVjdCBEaXJJdGVyU3RhdGUgeworICAgIH5EaXJJdGVyU3RhdGUoKSB7CisgICAgICBkaXJlY3RvcnlfaXRlcmF0b3JfZGVzdHJ1Y3QoKnRoaXMpOworICAgIH0KKworICAgIGludHB0cl90IEl0ZXJhdGlvbkhhbmRsZSA9IDA7CisgICAgZGlyZWN0b3J5X2VudHJ5IEN1cnJlbnRFbnRyeTsKKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCisvLy8gZGlyZWN0b3J5X2l0ZXJhdG9yIC0gSXRlcmF0ZXMgdGhyb3VnaCB0aGUgZW50cmllcyBpbiBwYXRoLiBUaGVyZSBpcyBubworLy8vIG9wZXJhdG9yKysgYmVjYXVzZSB3ZSBuZWVkIGFuIGVycm9yX2NvZGUuIElmIGl0J3MgcmVhbGx5IG5lZWRlZCB3ZSBjYW4gbWFrZQorLy8vIGl0IGNhbGwgcmVwb3J0X2ZhdGFsX2Vycm9yIG9uIGVycm9yLgorY2xhc3MgZGlyZWN0b3J5X2l0ZXJhdG9yIHsKKyAgc3RkOjpzaGFyZWRfcHRyPGRldGFpbDo6RGlySXRlclN0YXRlPiBTdGF0ZTsKKyAgYm9vbCBGb2xsb3dTeW1saW5rcyA9IHRydWU7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgZGlyZWN0b3J5X2l0ZXJhdG9yKGNvbnN0IFR3aW5lICZwYXRoLCBzdGQ6OmVycm9yX2NvZGUgJmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb2xsb3dfc3ltbGlua3MgPSB0cnVlKQorICAgICAgOiBGb2xsb3dTeW1saW5rcyhmb2xsb3dfc3ltbGlua3MpIHsKKyAgICBTdGF0ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8ZGV0YWlsOjpEaXJJdGVyU3RhdGU+KCk7CisgICAgU21hbGxTdHJpbmc8MTI4PiBwYXRoX3N0b3JhZ2U7CisgICAgZWMgPSBkZXRhaWw6OmRpcmVjdG9yeV9pdGVyYXRvcl9jb25zdHJ1Y3QoCisgICAgICAgICpTdGF0ZSwgcGF0aC50b1N0cmluZ1JlZihwYXRoX3N0b3JhZ2UpLCBGb2xsb3dTeW1saW5rcyk7CisgIH0KKworICBleHBsaWNpdCBkaXJlY3RvcnlfaXRlcmF0b3IoY29uc3QgZGlyZWN0b3J5X2VudHJ5ICZkZSwgc3RkOjplcnJvcl9jb2RlICZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9sbG93X3N5bWxpbmtzID0gdHJ1ZSkKKyAgICAgIDogRm9sbG93U3ltbGlua3MoZm9sbG93X3N5bWxpbmtzKSB7CisgICAgU3RhdGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPGRldGFpbDo6RGlySXRlclN0YXRlPigpOworICAgIGVjID0KKyAgICAgICAgZGV0YWlsOjpkaXJlY3RvcnlfaXRlcmF0b3JfY29uc3RydWN0KCpTdGF0ZSwgZGUucGF0aCgpLCBGb2xsb3dTeW1saW5rcyk7CisgIH0KKworICAvLy8gQ29uc3RydWN0IGVuZCBpdGVyYXRvci4KKyAgZGlyZWN0b3J5X2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgIC8vIE5vIG9wZXJhdG9yKysgYmVjYXVzZSB3ZSBuZWVkIGVycm9yX2NvZGUuCisgIGRpcmVjdG9yeV9pdGVyYXRvciAmaW5jcmVtZW50KHN0ZDo6ZXJyb3JfY29kZSAmZWMpIHsKKyAgICBlYyA9IGRpcmVjdG9yeV9pdGVyYXRvcl9pbmNyZW1lbnQoKlN0YXRlKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBkaXJlY3RvcnlfZW50cnkgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIFN0YXRlLT5DdXJyZW50RW50cnk7IH0KKyAgY29uc3QgZGlyZWN0b3J5X2VudHJ5ICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJlN0YXRlLT5DdXJyZW50RW50cnk7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgZGlyZWN0b3J5X2l0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICBpZiAoU3RhdGUgPT0gUkhTLlN0YXRlKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKCFSSFMuU3RhdGUpCisgICAgICByZXR1cm4gU3RhdGUtPkN1cnJlbnRFbnRyeSA9PSBkaXJlY3RvcnlfZW50cnkoKTsKKyAgICBpZiAoIVN0YXRlKQorICAgICAgcmV0dXJuIFJIUy5TdGF0ZS0+Q3VycmVudEVudHJ5ID09IGRpcmVjdG9yeV9lbnRyeSgpOworICAgIHJldHVybiBTdGF0ZS0+Q3VycmVudEVudHJ5ID09IFJIUy5TdGF0ZS0+Q3VycmVudEVudHJ5OworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGRpcmVjdG9yeV9pdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gUkhTKTsKKyAgfQorICAvLyBPdGhlciBtZW1iZXJzIGFzIHJlcXVpcmVkIGJ5CisgIC8vIEMrKyBTdGQsIDI0LjEuMSBJbnB1dCBpdGVyYXRvcnMgW2lucHV0Lml0ZXJhdG9yc10KK307CisKK25hbWVzcGFjZSBkZXRhaWwgeworCisgIC8vLyBLZWVwcyBzdGF0ZSBmb3IgdGhlIHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IuCisgIHN0cnVjdCBSZWNEaXJJdGVyU3RhdGUgeworICAgIHN0ZDo6c3RhY2s8ZGlyZWN0b3J5X2l0ZXJhdG9yLCBzdGQ6OnZlY3RvcjxkaXJlY3RvcnlfaXRlcmF0b3I+PiBTdGFjazsKKyAgICB1aW50MTZfdCBMZXZlbCA9IDA7CisgICAgYm9vbCBIYXNOb1B1c2hSZXF1ZXN0ID0gZmFsc2U7CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKworLy8vIHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IgLSBTYW1lIGFzIGRpcmVjdG9yeV9pdGVyYXRvciBleGNlcHQgZm9yIGl0CisvLy8gcmVjdXJzZXMgZG93biBpbnRvIGNoaWxkIGRpcmVjdG9yaWVzLgorY2xhc3MgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvciB7CisgIHN0ZDo6c2hhcmVkX3B0cjxkZXRhaWw6OlJlY0Rpckl0ZXJTdGF0ZT4gU3RhdGU7CisgIGJvb2wgRm9sbG93OworCitwdWJsaWM6CisgIHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IoY29uc3QgVHdpbmUgJnBhdGgsIHN0ZDo6ZXJyb3JfY29kZSAmZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb2xsb3dfc3ltbGlua3MgPSB0cnVlKQorICAgICAgOiBTdGF0ZShzdGQ6Om1ha2Vfc2hhcmVkPGRldGFpbDo6UmVjRGlySXRlclN0YXRlPigpKSwKKyAgICAgICAgRm9sbG93KGZvbGxvd19zeW1saW5rcykgeworICAgIFN0YXRlLT5TdGFjay5wdXNoKGRpcmVjdG9yeV9pdGVyYXRvcihwYXRoLCBlYywgRm9sbG93KSk7CisgICAgaWYgKFN0YXRlLT5TdGFjay50b3AoKSA9PSBkaXJlY3RvcnlfaXRlcmF0b3IoKSkKKyAgICAgIFN0YXRlLnJlc2V0KCk7CisgIH0KKworICAvLyBObyBvcGVyYXRvcisrIGJlY2F1c2Ugd2UgbmVlZCBlcnJvcl9jb2RlLgorICByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yICZpbmNyZW1lbnQoc3RkOjplcnJvcl9jb2RlICZlYykgeworICAgIGNvbnN0IGRpcmVjdG9yeV9pdGVyYXRvciBlbmRfaXRyID0ge307CisKKyAgICBpZiAoU3RhdGUtPkhhc05vUHVzaFJlcXVlc3QpCisgICAgICBTdGF0ZS0+SGFzTm9QdXNoUmVxdWVzdCA9IGZhbHNlOworICAgIGVsc2UgeworICAgICAgRXJyb3JPcjxiYXNpY19maWxlX3N0YXR1cz4gc3QgPSBTdGF0ZS0+U3RhY2sudG9wKCktPnN0YXR1cygpOworICAgICAgaWYgKCFzdCkgcmV0dXJuICp0aGlzOworICAgICAgaWYgKGlzX2RpcmVjdG9yeSgqc3QpKSB7CisgICAgICAgIFN0YXRlLT5TdGFjay5wdXNoKGRpcmVjdG9yeV9pdGVyYXRvcigqU3RhdGUtPlN0YWNrLnRvcCgpLCBlYywgRm9sbG93KSk7CisgICAgICAgIGlmIChlYykgcmV0dXJuICp0aGlzOworICAgICAgICBpZiAoU3RhdGUtPlN0YWNrLnRvcCgpICE9IGVuZF9pdHIpIHsKKyAgICAgICAgICArK1N0YXRlLT5MZXZlbDsKKyAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGUtPlN0YWNrLnBvcCgpOworICAgICAgfQorICAgIH0KKworICAgIHdoaWxlICghU3RhdGUtPlN0YWNrLmVtcHR5KCkKKyAgICAgICAgICAgJiYgU3RhdGUtPlN0YWNrLnRvcCgpLmluY3JlbWVudChlYykgPT0gZW5kX2l0cikgeworICAgICAgU3RhdGUtPlN0YWNrLnBvcCgpOworICAgICAgLS1TdGF0ZS0+TGV2ZWw7CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIGRvbmUuIElmIHNvLCBjcmVhdGUgYW4gZW5kIGl0ZXJhdG9yLgorICAgIGlmIChTdGF0ZS0+U3RhY2suZW1wdHkoKSkKKyAgICAgIFN0YXRlLnJlc2V0KCk7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBkaXJlY3RvcnlfZW50cnkgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpTdGF0ZS0+U3RhY2sudG9wKCk7IH0KKyAgY29uc3QgZGlyZWN0b3J5X2VudHJ5ICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJipTdGF0ZS0+U3RhY2sudG9wKCk7IH0KKworICAvLyBvYnNlcnZlcnMKKyAgLy8vIEdldHMgdGhlIGN1cnJlbnQgbGV2ZWwuIFN0YXJ0aW5nIHBhdGggaXMgYXQgbGV2ZWwgMC4KKyAgaW50IGxldmVsKCkgY29uc3QgeyByZXR1cm4gU3RhdGUtPkxldmVsOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBub19wdXNoIGhhcyBiZWVuIGNhbGxlZCBmb3IgdGhpcyBkaXJlY3RvcnlfZW50cnkuCisgIGJvb2wgbm9fcHVzaF9yZXF1ZXN0KCkgY29uc3QgeyByZXR1cm4gU3RhdGUtPkhhc05vUHVzaFJlcXVlc3Q7IH0KKworICAvLyBtb2RpZmllcnMKKyAgLy8vIEdvZXMgdXAgb25lIGxldmVsIGlmIExldmVsID4gMC4KKyAgdm9pZCBwb3AoKSB7CisgICAgYXNzZXJ0KFN0YXRlICYmICJDYW5ub3QgcG9wIGFuIGVuZCBpdGVyYXRvciEiKTsKKyAgICBhc3NlcnQoU3RhdGUtPkxldmVsID4gMCAmJiAiQ2Fubm90IHBvcCBhbiBpdGVyYXRvciB3aXRoIGxldmVsIDwgMSIpOworCisgICAgY29uc3QgZGlyZWN0b3J5X2l0ZXJhdG9yIGVuZF9pdHIgPSB7fTsKKyAgICBzdGQ6OmVycm9yX2NvZGUgZWM7CisgICAgZG8geworICAgICAgaWYgKGVjKQorICAgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIkVycm9yIGluY3JlbWVudGluZyBkaXJlY3RvcnkgaXRlcmF0b3IuIik7CisgICAgICBTdGF0ZS0+U3RhY2sucG9wKCk7CisgICAgICAtLVN0YXRlLT5MZXZlbDsKKyAgICB9IHdoaWxlICghU3RhdGUtPlN0YWNrLmVtcHR5KCkKKyAgICAgICAgICAgICAmJiBTdGF0ZS0+U3RhY2sudG9wKCkuaW5jcmVtZW50KGVjKSA9PSBlbmRfaXRyKTsKKworICAgIC8vIENoZWNrIGlmIHdlIGFyZSBkb25lLiBJZiBzbywgY3JlYXRlIGFuIGVuZCBpdGVyYXRvci4KKyAgICBpZiAoU3RhdGUtPlN0YWNrLmVtcHR5KCkpCisgICAgICBTdGF0ZS5yZXNldCgpOworICB9CisKKyAgLy8vIERvZXMgbm90IGdvIGRvd24gaW50byB0aGUgY3VycmVudCBkaXJlY3RvcnlfZW50cnkuCisgIHZvaWQgbm9fcHVzaCgpIHsgU3RhdGUtPkhhc05vUHVzaFJlcXVlc3QgPSB0cnVlOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiBTdGF0ZSA9PSBSSFMuU3RhdGU7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gUkhTKTsKKyAgfQorICAvLyBPdGhlciBtZW1iZXJzIGFzIHJlcXVpcmVkIGJ5CisgIC8vIEMrKyBTdGQsIDI0LjEuMSBJbnB1dCBpdGVyYXRvcnMgW2lucHV0Lml0ZXJhdG9yc10KK307CisKKy8vLyBAfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgZnMKK30gLy8gZW5kIG5hbWVzcGFjZSBzeXMKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfRklMRVNZU1RFTV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRmlsZVV0aWxpdGllcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0ZpbGVVdGlsaXRpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWUyYzYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0ZpbGVVdGlsaXRpZXMuaApAQCAtMCwwICsxLDc4IEBACisvLz09PS0gbGx2bS9TdXBwb3J0L0ZpbGVVdGlsaXRpZXMuaCAtIEZpbGUgU3lzdGVtIFV0aWxpdGllcyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgZmFtaWx5IG9mIHV0aWxpdHkgZnVuY3Rpb25zIHdoaWNoIGFyZSB1c2VmdWwgZm9yIGRvaW5nCisvLyB2YXJpb3VzIHRoaW5ncyB3aXRoIGZpbGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0ZJTEVVVElMSVRJRVNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfRklMRVVUSUxJVElFU19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXRoLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworICAvLy8gRGlmZkZpbGVzV2l0aFRvbGVyYW5jZSAtIENvbXBhcmUgdGhlIHR3byBmaWxlcyBzcGVjaWZpZWQsIHJldHVybmluZyAwIGlmCisgIC8vLyB0aGUgZmlsZXMgbWF0Y2gsIDEgaWYgdGhleSBhcmUgZGlmZmVyZW50LCBhbmQgMiBpZiB0aGVyZSBpcyBhIGZpbGUgZXJyb3IuCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhbiBhYnNvbHV0ZSBhbmQgcmVsYXRpdmUgRlAgZXJyb3IgdGhhdAorICAvLy8gaXMgYWxsb3dlZCB0byBleGlzdC4gIElmIHlvdSBzcGVjaWZ5IGEgc3RyaW5nIHRvIGZpbGwgaW4gZm9yIHRoZSBlcnJvcgorICAvLy8gb3B0aW9uLCBpdCB3aWxsIHNldCB0aGUgc3RyaW5nIHRvIGFuIGVycm9yIG1lc3NhZ2UgaWYgYW4gZXJyb3Igb2NjdXJzLCBvcgorICAvLy8gaWYgdGhlIGZpbGVzIGFyZSBkaWZmZXJlbnQuCisgIC8vLworICBpbnQgRGlmZkZpbGVzV2l0aFRvbGVyYW5jZShTdHJpbmdSZWYgRmlsZUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIEFic1RvbCwgZG91YmxlIFJlbFRvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVycm9yID0gbnVsbHB0cik7CisKKworICAvLy8gRmlsZVJlbW92ZXIgLSBUaGlzIGNsYXNzIGlzIGEgc2ltcGxlIG9iamVjdCBtZWFudCB0byBiZSBzdGFjayBhbGxvY2F0ZWQuCisgIC8vLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gYSByZWdpb24sIHRoZSBvYmplY3QgcmVtb3ZlcyB0aGUgZmlsZW5hbWUKKyAgLy8vIHNwZWNpZmllZCAoaWYgZGVsZXRlSXQgaXMgdHJ1ZSkuCisgIC8vLworICBjbGFzcyBGaWxlUmVtb3ZlciB7CisgICAgU21hbGxTdHJpbmc8MTI4PiBGaWxlbmFtZTsKKyAgICBib29sIERlbGV0ZUl0OworICBwdWJsaWM6CisgICAgRmlsZVJlbW92ZXIoKSA6IERlbGV0ZUl0KGZhbHNlKSB7fQorCisgICAgZXhwbGljaXQgRmlsZVJlbW92ZXIoY29uc3QgVHdpbmUmIGZpbGVuYW1lLCBib29sIGRlbGV0ZUl0ID0gdHJ1ZSkKKyAgICAgIDogRGVsZXRlSXQoZGVsZXRlSXQpIHsKKyAgICAgIGZpbGVuYW1lLnRvVmVjdG9yKEZpbGVuYW1lKTsKKyAgICB9CisKKyAgICB+RmlsZVJlbW92ZXIoKSB7CisgICAgICBpZiAoRGVsZXRlSXQpIHsKKyAgICAgICAgLy8gSWdub3JlIHByb2JsZW1zIGRlbGV0aW5nIHRoZSBmaWxlLgorICAgICAgICBzeXM6OmZzOjpyZW1vdmUoRmlsZW5hbWUpOworICAgICAgfQorICAgIH0KKworICAgIC8vLyBzZXRGaWxlIC0gR2l2ZSBvd25lcnNoaXAgb2YgdGhlIGZpbGUgdG8gdGhlIEZpbGVSZW1vdmVyIHNvIGl0IHdpbGwKKyAgICAvLy8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkLiAgSWYgdGhlIEZpbGVSZW1vdmVyIGFscmVhZHkKKyAgICAvLy8gaGFkIG93bmVyc2hpcCBvZiBhIGZpbGUsIHJlbW92ZSBpdCBmaXJzdC4KKyAgICB2b2lkIHNldEZpbGUoY29uc3QgVHdpbmUmIGZpbGVuYW1lLCBib29sIGRlbGV0ZUl0ID0gdHJ1ZSkgeworICAgICAgaWYgKERlbGV0ZUl0KSB7CisgICAgICAgIC8vIElnbm9yZSBwcm9ibGVtcyBkZWxldGluZyB0aGUgZmlsZS4KKyAgICAgICAgc3lzOjpmczo6cmVtb3ZlKEZpbGVuYW1lKTsKKyAgICAgIH0KKworICAgICAgRmlsZW5hbWUuY2xlYXIoKTsKKyAgICAgIGZpbGVuYW1lLnRvVmVjdG9yKEZpbGVuYW1lKTsKKyAgICAgIERlbGV0ZUl0ID0gZGVsZXRlSXQ7CisgICAgfQorCisgICAgLy8vIHJlbGVhc2VGaWxlIC0gVGFrZSBvd25lcnNoaXAgb2YgdGhlIGZpbGUgYXdheSBmcm9tIHRoZSBGaWxlUmVtb3ZlciBzbyBpdAorICAgIC8vLyB3aWxsIG5vdCBiZSByZW1vdmVkIHdoZW4gdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQuCisgICAgdm9pZCByZWxlYXNlRmlsZSgpIHsgRGVsZXRlSXQgPSBmYWxzZTsgfQorICB9OworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRm9ybWF0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiZDJiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXQuaApAQCAtMCwwICsxLDI1NyBAQAorLy89PT0tIEZvcm1hdC5oIC0gRWZmaWNpZW50IHByaW50Zi1zdHlsZSBmb3JtYXR0aW5nIGZvciBzdHJlYW1zIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgZm9ybWF0KCkgZnVuY3Rpb24sIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggb3RoZXIKKy8vIExMVk0gc3Vic3lzdGVtcyB0byBwcm92aWRlIHByaW50Zi1zdHlsZSBmb3JtYXR0aW5nLiAgVGhpcyBnaXZlcyBhbGwgdGhlIHBvd2VyCisvLyBhbmQgcmlzayBvZiBwcmludGYuICBUaGlzIGNhbiBiZSB1c2VkIGxpa2UgdGhpcyAod2l0aCByYXdfb3N0cmVhbXMgYXMgYW4KKy8vIGV4YW1wbGUpOgorLy8KKy8vICAgIE9TIDw8ICJteW51bWJlcjogIiA8PCBmb3JtYXQoIiU0LjVmIiwgMTIzNC40MTIpIDw8ICdcbic7CisvLworLy8gT3IgaWYgeW91IHByZWZlcjoKKy8vCisvLyAgT1MgPDwgZm9ybWF0KCJteW51bWJlcjogJTQuNWZcbiIsIDEyMzQuNDEyKTsKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9GT1JNQVRfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfRk9STUFUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPHR1cGxlPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHVzZWQgZm9yIGhhbmRsaW5nIGZvcm1hdHRlZCBvdXRwdXQuICBJdCBpcyB0aGUKKy8vLyBhYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGEgdGVtcGxhdGVkIGRlcml2ZWQgY2xhc3MuCitjbGFzcyBmb3JtYXRfb2JqZWN0X2Jhc2UgeworcHJvdGVjdGVkOgorICBjb25zdCBjaGFyICpGbXQ7CisgIH5mb3JtYXRfb2JqZWN0X2Jhc2UoKSA9IGRlZmF1bHQ7IC8vIERpc2FsbG93IHBvbHltb3JwaGljIGRlbGV0aW9uLgorICBmb3JtYXRfb2JqZWN0X2Jhc2UoY29uc3QgZm9ybWF0X29iamVjdF9iYXNlICYpID0gZGVmYXVsdDsKKyAgdmlydHVhbCB2b2lkIGhvbWUoKTsgLy8gT3V0IG9mIGxpbmUgdmlydHVhbCBtZXRob2QuCisKKyAgLy8vIENhbGwgc25wcmludGYoKSBmb3IgdGhpcyBvYmplY3QsIG9uIHRoZSBnaXZlbiBidWZmZXIgYW5kIHNpemUuCisgIHZpcnR1YWwgaW50IHNucHJpbnQoY2hhciAqQnVmZmVyLCB1bnNpZ25lZCBCdWZmZXJTaXplKSBjb25zdCA9IDA7CisKK3B1YmxpYzoKKyAgZm9ybWF0X29iamVjdF9iYXNlKGNvbnN0IGNoYXIgKmZtdCkgOiBGbXQoZm10KSB7fQorCisgIC8vLyBGb3JtYXQgdGhlIG9iamVjdCBpbnRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLiAgT24gc3VjY2VzcywgdGhpcyByZXR1cm5zCisgIC8vLyB0aGUgbGVuZ3RoIG9mIHRoZSBmb3JtYXR0ZWQgc3RyaW5nLiAgSWYgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwsIHRoaXMKKyAgLy8vIHJldHVybnMgYSBsZW5ndGggdG8gcmV0cnkgd2l0aCwgd2hpY2ggd2lsbCBiZSBsYXJnZXIgdGhhbiBCdWZmZXJTaXplLgorICB1bnNpZ25lZCBwcmludChjaGFyICpCdWZmZXIsIHVuc2lnbmVkIEJ1ZmZlclNpemUpIGNvbnN0IHsKKyAgICBhc3NlcnQoQnVmZmVyU2l6ZSAmJiAiSW52YWxpZCBidWZmZXIgc2l6ZSEiKTsKKworICAgIC8vIFByaW50IHRoZSBzdHJpbmcsIGxlYXZpbmcgcm9vbSBmb3IgdGhlIHRlcm1pbmF0aW5nIG51bGwuCisgICAgaW50IE4gPSBzbnByaW50KEJ1ZmZlciwgQnVmZmVyU2l6ZSk7CisKKyAgICAvLyBWQysrIGFuZCBvbGQgR2xpYkMgcmV0dXJuIG5lZ2F0aXZlIG9uIG92ZXJmbG93LCBqdXN0IGRvdWJsZSB0aGUgc2l6ZS4KKyAgICBpZiAoTiA8IDApCisgICAgICByZXR1cm4gQnVmZmVyU2l6ZSAqIDI7CisKKyAgICAvLyBPdGhlciBpbXBsZW1lbnRhdGlvbnMgeWllbGQgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCwgbm90IGluY2x1ZGluZyB0aGUKKyAgICAvLyBmaW5hbCAnXDAnLgorICAgIGlmICh1bnNpZ25lZChOKSA+PSBCdWZmZXJTaXplKQorICAgICAgcmV0dXJuIE4gKyAxOworCisgICAgLy8gT3RoZXJ3aXNlIE4gaXMgdGhlIGxlbmd0aCBvZiBvdXRwdXQgKG5vdCBpbmNsdWRpbmcgdGhlIGZpbmFsICdcMCcpLgorICAgIHJldHVybiBOOworICB9Cit9OworCisvLy8gVGhlc2UgYXJlIHRlbXBsYXRlZCBoZWxwZXIgY2xhc3NlcyB1c2VkIGJ5IHRoZSBmb3JtYXQgZnVuY3Rpb24gdGhhdAorLy8vIGNhcHR1cmUgdGhlIG9iamVjdCB0byBiZSBmb3JtYXR0ZWQgYW5kIHRoZSBmb3JtYXQgc3RyaW5nLiBXaGVuIGFjdHVhbGx5CisvLy8gcHJpbnRlZCwgdGhpcyBzeW50aGVzaXplcyB0aGUgc3RyaW5nIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyIHByb3ZpZGVkIGFuZAorLy8vIHJldHVybnMgd2hldGhlciBvciBub3QgaXQgaXMgYmlnIGVub3VnaC4KKworLy8gSGVscGVyIHRvIHZhbGlkYXRlIHRoYXQgZm9ybWF0KCkgcGFyYW1ldGVycyBhcmUgc2NhbGFycyBvciBwb2ludGVycy4KK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPiBzdHJ1Y3QgdmFsaWRhdGVfZm9ybWF0X3BhcmFtZXRlcnM7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnLCB0eXBlbmFtZS4uLiBBcmdzPgorc3RydWN0IHZhbGlkYXRlX2Zvcm1hdF9wYXJhbWV0ZXJzPEFyZywgQXJncy4uLj4geworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2NhbGFyPEFyZz46OnZhbHVlLAorICAgICAgICAgICAgICAgICJmb3JtYXQgY2FuJ3QgYmUgdXNlZCB3aXRoIG5vbiBmdW5kYW1lbnRhbCAvIG5vbiBwb2ludGVyIHR5cGUiKTsKKyAgdmFsaWRhdGVfZm9ybWF0X3BhcmFtZXRlcnMoKSB7IHZhbGlkYXRlX2Zvcm1hdF9wYXJhbWV0ZXJzPEFyZ3MuLi4+KCk7IH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgdmFsaWRhdGVfZm9ybWF0X3BhcmFtZXRlcnM8PiB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lLi4uIFRzPgorY2xhc3MgZm9ybWF0X29iamVjdCBmaW5hbCA6IHB1YmxpYyBmb3JtYXRfb2JqZWN0X2Jhc2UgeworICBzdGQ6OnR1cGxlPFRzLi4uPiBWYWxzOworCisgIHRlbXBsYXRlIDxzdGQ6OnNpemVfdC4uLiBJcz4KKyAgaW50IHNucHJpbnRfdHVwbGUoY2hhciAqQnVmZmVyLCB1bnNpZ25lZCBCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICBpbmRleF9zZXF1ZW5jZTxJcy4uLj4pIGNvbnN0IHsKKyNpZmRlZiBfTVNDX1ZFUgorICAgIHJldHVybiBfc25wcmludGYoQnVmZmVyLCBCdWZmZXJTaXplLCBGbXQsIHN0ZDo6Z2V0PElzPihWYWxzKS4uLik7CisjZWxzZQorICAgIHJldHVybiBzbnByaW50ZihCdWZmZXIsIEJ1ZmZlclNpemUsIEZtdCwgc3RkOjpnZXQ8SXM+KFZhbHMpLi4uKTsKKyNlbmRpZgorICB9CisKK3B1YmxpYzoKKyAgZm9ybWF0X29iamVjdChjb25zdCBjaGFyICpmbXQsIGNvbnN0IFRzICYuLi4gdmFscykKKyAgICAgIDogZm9ybWF0X29iamVjdF9iYXNlKGZtdCksIFZhbHModmFscy4uLikgeworICAgIHZhbGlkYXRlX2Zvcm1hdF9wYXJhbWV0ZXJzPFRzLi4uPigpOworICB9CisKKyAgaW50IHNucHJpbnQoY2hhciAqQnVmZmVyLCB1bnNpZ25lZCBCdWZmZXJTaXplKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIHNucHJpbnRfdHVwbGUoQnVmZmVyLCBCdWZmZXJTaXplLCBpbmRleF9zZXF1ZW5jZV9mb3I8VHMuLi4+KCkpOworICB9Cit9OworCisvLy8gVGhlc2UgYXJlIGhlbHBlciBmdW5jdGlvbnMgdXNlZCB0byBwcm9kdWNlIGZvcm1hdHRlZCBvdXRwdXQuICBUaGV5IHVzZQorLy8vIHRlbXBsYXRlIHR5cGUgZGVkdWN0aW9uIHRvIGNvbnN0cnVjdCB0aGUgYXBwcm9wcmlhdGUgaW5zdGFuY2Ugb2YgdGhlCisvLy8gZm9ybWF0X29iamVjdCBjbGFzcyB0byBzaW1wbGlmeSB0aGVpciBjb25zdHJ1Y3Rpb24uCisvLy8KKy8vLyBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGxpa2U6CisvLy8gXGNvZGUKKy8vLyAgIE9TIDw8IGZvcm1hdCgiJTAuNGYiLCBteWZsb2F0KSA8PCAnXG4nOworLy8vIFxlbmRjb2RlCisKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBUcz4KK2lubGluZSBmb3JtYXRfb2JqZWN0PFRzLi4uPiBmb3JtYXQoY29uc3QgY2hhciAqRm10LCBjb25zdCBUcyAmLi4uIFZhbHMpIHsKKyAgcmV0dXJuIGZvcm1hdF9vYmplY3Q8VHMuLi4+KEZtdCwgVmFscy4uLik7Cit9CisKKy8vLyBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIGZvciBsZWZ0X2p1c3RpZnksIHJpZ2h0X2p1c3RpZnksIGFuZCBjZW50ZXJfanVzdGlmeS4KK2NsYXNzIEZvcm1hdHRlZFN0cmluZyB7CitwdWJsaWM6CisgIGVudW0gSnVzdGlmaWNhdGlvbiB7IEp1c3RpZnlOb25lLCBKdXN0aWZ5TGVmdCwgSnVzdGlmeVJpZ2h0LCBKdXN0aWZ5Q2VudGVyIH07CisgIEZvcm1hdHRlZFN0cmluZyhTdHJpbmdSZWYgUywgdW5zaWduZWQgVywgSnVzdGlmaWNhdGlvbiBKKQorICAgICAgOiBTdHIoUyksIFdpZHRoKFcpLCBKdXN0aWZ5KEopIHt9CisKK3ByaXZhdGU6CisgIFN0cmluZ1JlZiBTdHI7CisgIHVuc2lnbmVkIFdpZHRoOworICBKdXN0aWZpY2F0aW9uIEp1c3RpZnk7CisgIGZyaWVuZCBjbGFzcyByYXdfb3N0cmVhbTsKK307CisKKy8vLyBsZWZ0X2p1c3RpZnkgLSBhcHBlbmQgc3BhY2VzIGFmdGVyIHN0cmluZyBzbyB0b3RhbCBvdXRwdXQgaXMKKy8vLyBccCBXaWR0aCBjaGFyYWN0ZXJzLiAgSWYgXHAgU3RyIGlzIGxhcmdlciB0aGF0IFxwIFdpZHRoLCBmdWxsIHN0cmluZworLy8vIGlzIHdyaXR0ZW4gd2l0aCBubyBwYWRkaW5nLgoraW5saW5lIEZvcm1hdHRlZFN0cmluZyBsZWZ0X2p1c3RpZnkoU3RyaW5nUmVmIFN0ciwgdW5zaWduZWQgV2lkdGgpIHsKKyAgcmV0dXJuIEZvcm1hdHRlZFN0cmluZyhTdHIsIFdpZHRoLCBGb3JtYXR0ZWRTdHJpbmc6Okp1c3RpZnlMZWZ0KTsKK30KKworLy8vIHJpZ2h0X2p1c3RpZnkgLSBhZGQgc3BhY2VzIGJlZm9yZSBzdHJpbmcgc28gdG90YWwgb3V0cHV0IGlzCisvLy8gXHAgV2lkdGggY2hhcmFjdGVycy4gIElmIFxwIFN0ciBpcyBsYXJnZXIgdGhhdCBccCBXaWR0aCwgZnVsbCBzdHJpbmcKKy8vLyBpcyB3cml0dGVuIHdpdGggbm8gcGFkZGluZy4KK2lubGluZSBGb3JtYXR0ZWRTdHJpbmcgcmlnaHRfanVzdGlmeShTdHJpbmdSZWYgU3RyLCB1bnNpZ25lZCBXaWR0aCkgeworICByZXR1cm4gRm9ybWF0dGVkU3RyaW5nKFN0ciwgV2lkdGgsIEZvcm1hdHRlZFN0cmluZzo6SnVzdGlmeVJpZ2h0KTsKK30KKworLy8vIGNlbnRlcl9qdXN0aWZ5IC0gYWRkIHNwYWNlcyBiZWZvcmUgYW5kIGFmdGVyIHN0cmluZyBzbyB0b3RhbCBvdXRwdXQgaXMKKy8vLyBccCBXaWR0aCBjaGFyYWN0ZXJzLiAgSWYgXHAgU3RyIGlzIGxhcmdlciB0aGF0IFxwIFdpZHRoLCBmdWxsIHN0cmluZworLy8vIGlzIHdyaXR0ZW4gd2l0aCBubyBwYWRkaW5nLgoraW5saW5lIEZvcm1hdHRlZFN0cmluZyBjZW50ZXJfanVzdGlmeShTdHJpbmdSZWYgU3RyLCB1bnNpZ25lZCBXaWR0aCkgeworICByZXR1cm4gRm9ybWF0dGVkU3RyaW5nKFN0ciwgV2lkdGgsIEZvcm1hdHRlZFN0cmluZzo6SnVzdGlmeUNlbnRlcik7Cit9CisKKy8vLyBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHVzZWQgZm9yIGZvcm1hdF9oZXgoKSBhbmQgZm9ybWF0X2RlY2ltYWwoKS4KK2NsYXNzIEZvcm1hdHRlZE51bWJlciB7CisgIHVpbnQ2NF90IEhleFZhbHVlOworICBpbnQ2NF90IERlY1ZhbHVlOworICB1bnNpZ25lZCBXaWR0aDsKKyAgYm9vbCBIZXg7CisgIGJvb2wgVXBwZXI7CisgIGJvb2wgSGV4UHJlZml4OworICBmcmllbmQgY2xhc3MgcmF3X29zdHJlYW07CisKK3B1YmxpYzoKKyAgRm9ybWF0dGVkTnVtYmVyKHVpbnQ2NF90IEhWLCBpbnQ2NF90IERWLCB1bnNpZ25lZCBXLCBib29sIEgsIGJvb2wgVSwKKyAgICAgICAgICAgICAgICAgIGJvb2wgUHJlZml4KQorICAgICAgOiBIZXhWYWx1ZShIViksIERlY1ZhbHVlKERWKSwgV2lkdGgoVyksIEhleChIKSwgVXBwZXIoVSksCisgICAgICAgIEhleFByZWZpeChQcmVmaXgpIHt9Cit9OworCisvLy8gZm9ybWF0X2hleCAtIE91dHB1dCBccCBOIGFzIGEgZml4ZWQgd2lkdGggaGV4YWRlY2ltYWwuIElmIG51bWJlciB3aWxsIG5vdAorLy8vIGZpdCBpbiB3aWR0aCwgZnVsbCBudW1iZXIgaXMgc3RpbGwgcHJpbnRlZC4gIEV4YW1wbGVzOgorLy8vICAgT1MgPDwgZm9ybWF0X2hleCgyNTUsIDQpICAgICAgICAgICAgICA9PiAweGZmCisvLy8gICBPUyA8PCBmb3JtYXRfaGV4KDI1NSwgNCwgdHJ1ZSkgICAgICAgID0+IDB4RkYKKy8vLyAgIE9TIDw8IGZvcm1hdF9oZXgoMjU1LCA2KSAgICAgICAgICAgICAgPT4gMHgwMGZmCisvLy8gICBPUyA8PCBmb3JtYXRfaGV4KDI1NSwgMikgICAgICAgICAgICAgID0+IDB4ZmYKK2lubGluZSBGb3JtYXR0ZWROdW1iZXIgZm9ybWF0X2hleCh1aW50NjRfdCBOLCB1bnNpZ25lZCBXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVwcGVyID0gZmFsc2UpIHsKKyAgYXNzZXJ0KFdpZHRoIDw9IDE4ICYmICJoZXggd2lkdGggbXVzdCBiZSA8PSAxOCIpOworICByZXR1cm4gRm9ybWF0dGVkTnVtYmVyKE4sIDAsIFdpZHRoLCB0cnVlLCBVcHBlciwgdHJ1ZSk7Cit9CisKKy8vLyBmb3JtYXRfaGV4X25vX3ByZWZpeCAtIE91dHB1dCBccCBOIGFzIGEgZml4ZWQgd2lkdGggaGV4YWRlY2ltYWwuIERvZXMgbm90CisvLy8gcHJlcGVuZCAnMHgnIHRvIHRoZSBvdXRwdXR0ZWQgc3RyaW5nLiAgSWYgbnVtYmVyIHdpbGwgbm90IGZpdCBpbiB3aWR0aCwKKy8vLyBmdWxsIG51bWJlciBpcyBzdGlsbCBwcmludGVkLiAgRXhhbXBsZXM6CisvLy8gICBPUyA8PCBmb3JtYXRfaGV4X25vX3ByZWZpeCgyNTUsIDIpICAgICAgICAgICAgICA9PiBmZgorLy8vICAgT1MgPDwgZm9ybWF0X2hleF9ub19wcmVmaXgoMjU1LCAyLCB0cnVlKSAgICAgICAgPT4gRkYKKy8vLyAgIE9TIDw8IGZvcm1hdF9oZXhfbm9fcHJlZml4KDI1NSwgNCkgICAgICAgICAgICAgID0+IDAwZmYKKy8vLyAgIE9TIDw8IGZvcm1hdF9oZXhfbm9fcHJlZml4KDI1NSwgMSkgICAgICAgICAgICAgID0+IGZmCitpbmxpbmUgRm9ybWF0dGVkTnVtYmVyIGZvcm1hdF9oZXhfbm9fcHJlZml4KHVpbnQ2NF90IE4sIHVuc2lnbmVkIFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVwcGVyID0gZmFsc2UpIHsKKyAgYXNzZXJ0KFdpZHRoIDw9IDE2ICYmICJoZXggd2lkdGggbXVzdCBiZSA8PSAxNiIpOworICByZXR1cm4gRm9ybWF0dGVkTnVtYmVyKE4sIDAsIFdpZHRoLCB0cnVlLCBVcHBlciwgZmFsc2UpOworfQorCisvLy8gZm9ybWF0X2RlY2ltYWwgLSBPdXRwdXQgXHAgTiBhcyBhIHJpZ2h0IGp1c3RpZmllZCwgZml4ZWQtd2lkdGggZGVjaW1hbC4gSWYKKy8vLyBudW1iZXIgd2lsbCBub3QgZml0IGluIHdpZHRoLCBmdWxsIG51bWJlciBpcyBzdGlsbCBwcmludGVkLiAgRXhhbXBsZXM6CisvLy8gICBPUyA8PCBmb3JtYXRfZGVjaW1hbCgwLCA1KSAgICAgPT4gIiAgICAwIgorLy8vICAgT1MgPDwgZm9ybWF0X2RlY2ltYWwoMjU1LCA1KSAgID0+ICIgIDI1NSIKKy8vLyAgIE9TIDw8IGZvcm1hdF9kZWNpbWFsKC0xLCAzKSAgICA9PiAiIC0xIgorLy8vICAgT1MgPDwgZm9ybWF0X2RlY2ltYWwoMTIzNDUsIDMpID0+ICIxMjM0NSIKK2lubGluZSBGb3JtYXR0ZWROdW1iZXIgZm9ybWF0X2RlY2ltYWwoaW50NjRfdCBOLCB1bnNpZ25lZCBXaWR0aCkgeworICByZXR1cm4gRm9ybWF0dGVkTnVtYmVyKDAsIE4sIFdpZHRoLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKK30KKworY2xhc3MgRm9ybWF0dGVkQnl0ZXMgeworICBBcnJheVJlZjx1aW50OF90PiBCeXRlczsKKworICAvLyBJZiBub3QgTm9uZSwgZGlzcGxheSBvZmZzZXRzIGZvciBlYWNoIGxpbmUgcmVsYXRpdmUgdG8gc3RhcnRpbmcgdmFsdWUuCisgIE9wdGlvbmFsPHVpbnQ2NF90PiBGaXJzdEJ5dGVPZmZzZXQ7CisgIHVpbnQzMl90IEluZGVudExldmVsOyAgLy8gTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gaW5kZW50IGVhY2ggbGluZS4KKyAgdWludDMyX3QgTnVtUGVyTGluZTsgICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gc2hvdyBwZXIgbGluZS4KKyAgdWludDhfdCBCeXRlR3JvdXBTaXplOyAvLyBIb3cgbWFueSBoZXggYnl0ZXMgYXJlIGdyb3VwZWQgd2l0aG91dCBzcGFjZXMKKyAgYm9vbCBVcHBlcjsgICAgICAgICAgICAvLyBTaG93IG9mZnNldCBhbmQgaGV4IGJ5dGVzIGFzIHVwcGVyIGNhc2UuCisgIGJvb2wgQVNDSUk7ICAgICAgICAgICAgLy8gU2hvdyB0aGUgQVNDSUkgYnl0ZXMgZm9yIHRoZSBoZXggYnl0ZXMgdG8gdGhlIHJpZ2h0LgorICBmcmllbmQgY2xhc3MgcmF3X29zdHJlYW07CisKK3B1YmxpYzoKKyAgRm9ybWF0dGVkQnl0ZXMoQXJyYXlSZWY8dWludDhfdD4gQiwgdWludDMyX3QgSUwsIE9wdGlvbmFsPHVpbnQ2NF90PiBPLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCBOUEwsIHVpbnQ4X3QgQkdTLCBib29sIFUsIGJvb2wgQSkKKyAgICAgIDogQnl0ZXMoQiksIEZpcnN0Qnl0ZU9mZnNldChPKSwgSW5kZW50TGV2ZWwoSUwpLCBOdW1QZXJMaW5lKE5QTCksCisgICAgICAgIEJ5dGVHcm91cFNpemUoQkdTKSwgVXBwZXIoVSksIEFTQ0lJKEEpIHsKKworICAgIGlmIChCeXRlR3JvdXBTaXplID4gTnVtUGVyTGluZSkKKyAgICAgIEJ5dGVHcm91cFNpemUgPSBOdW1QZXJMaW5lOworICB9Cit9OworCitpbmxpbmUgRm9ybWF0dGVkQnl0ZXMKK2Zvcm1hdF9ieXRlcyhBcnJheVJlZjx1aW50OF90PiBCeXRlcywgT3B0aW9uYWw8dWludDY0X3Q+IEZpcnN0Qnl0ZU9mZnNldCA9IE5vbmUsCisgICAgICAgICAgICAgdWludDMyX3QgTnVtUGVyTGluZSA9IDE2LCB1aW50OF90IEJ5dGVHcm91cFNpemUgPSA0LAorICAgICAgICAgICAgIHVpbnQzMl90IEluZGVudExldmVsID0gMCwgYm9vbCBVcHBlciA9IGZhbHNlKSB7CisgIHJldHVybiBGb3JtYXR0ZWRCeXRlcyhCeXRlcywgSW5kZW50TGV2ZWwsIEZpcnN0Qnl0ZU9mZnNldCwgTnVtUGVyTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVHcm91cFNpemUsIFVwcGVyLCBmYWxzZSk7Cit9CisKK2lubGluZSBGb3JtYXR0ZWRCeXRlcworZm9ybWF0X2J5dGVzX3dpdGhfYXNjaWkoQXJyYXlSZWY8dWludDhfdD4gQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDx1aW50NjRfdD4gRmlyc3RCeXRlT2Zmc2V0ID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE51bVBlckxpbmUgPSAxNiwgdWludDhfdCBCeXRlR3JvdXBTaXplID0gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEluZGVudExldmVsID0gMCwgYm9vbCBVcHBlciA9IGZhbHNlKSB7CisgIHJldHVybiBGb3JtYXR0ZWRCeXRlcyhCeXRlcywgSW5kZW50TGV2ZWwsIEZpcnN0Qnl0ZU9mZnNldCwgTnVtUGVyTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVHcm91cFNpemUsIFVwcGVyLCB0cnVlKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRm9ybWF0QWRhcHRlcnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXRBZGFwdGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5N2JlYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRm9ybWF0QWRhcHRlcnMuaApAQCAtMCwwICsxLDkzIEBACisvLz09PS0gRm9ybWF0QWRhcHRlcnMuaCAtIEZvcm1hdHRlcnMgZm9yIGNvbW1vbiBMTFZNIHR5cGVzIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0ZPUk1BVEFEQVBURVJTX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0ZPUk1BVEFEQVBURVJTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdENvbW1vbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXRWYXJpYWRpY0RldGFpbHMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworbmFtZXNwYWNlIGxsdm0gewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEZvcm1hdEFkYXB0ZXIgOiBwdWJsaWMgZGV0YWlsOjpmb3JtYXRfYWRhcHRlciB7Citwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEZvcm1hdEFkYXB0ZXIoVCAmJkl0ZW0pIDogSXRlbShJdGVtKSB7fQorCisgIFQgSXRlbTsKK307CisKK25hbWVzcGFjZSBkZXRhaWwgewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEFsaWduQWRhcHRlciBmaW5hbCA6IHB1YmxpYyBGb3JtYXRBZGFwdGVyPFQ+IHsKKyAgQWxpZ25TdHlsZSBXaGVyZTsKKyAgc2l6ZV90IEFtb3VudDsKKyAgY2hhciBGaWxsOworCitwdWJsaWM6CisgIEFsaWduQWRhcHRlcihUICYmSXRlbSwgQWxpZ25TdHlsZSBXaGVyZSwgc2l6ZV90IEFtb3VudCwgY2hhciBGaWxsKQorICAgICAgOiBGb3JtYXRBZGFwdGVyPFQ+KHN0ZDo6Zm9yd2FyZDxUPihJdGVtKSksIFdoZXJlKFdoZXJlKSwgQW1vdW50KEFtb3VudCksCisgICAgICAgIEZpbGwoRmlsbCkge30KKworICB2b2lkIGZvcm1hdChsbHZtOjpyYXdfb3N0cmVhbSAmU3RyZWFtLCBTdHJpbmdSZWYgU3R5bGUpIHsKKyAgICBhdXRvIEFkYXB0ZXIgPSBkZXRhaWw6OmJ1aWxkX2Zvcm1hdF9hZGFwdGVyKHN0ZDo6Zm9yd2FyZDxUPih0aGlzLT5JdGVtKSk7CisgICAgRm10QWxpZ24oQWRhcHRlciwgV2hlcmUsIEFtb3VudCwgRmlsbCkuZm9ybWF0KFN0cmVhbSwgU3R5bGUpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgUGFkQWRhcHRlciBmaW5hbCA6IHB1YmxpYyBGb3JtYXRBZGFwdGVyPFQ+IHsKKyAgc2l6ZV90IExlZnQ7CisgIHNpemVfdCBSaWdodDsKKworcHVibGljOgorICBQYWRBZGFwdGVyKFQgJiZJdGVtLCBzaXplX3QgTGVmdCwgc2l6ZV90IFJpZ2h0KQorICAgICAgOiBGb3JtYXRBZGFwdGVyPFQ+KHN0ZDo6Zm9yd2FyZDxUPihJdGVtKSksIExlZnQoTGVmdCksIFJpZ2h0KFJpZ2h0KSB7fQorCisgIHZvaWQgZm9ybWF0KGxsdm06OnJhd19vc3RyZWFtICZTdHJlYW0sIFN0cmluZ1JlZiBTdHlsZSkgeworICAgIGF1dG8gQWRhcHRlciA9IGRldGFpbDo6YnVpbGRfZm9ybWF0X2FkYXB0ZXIoc3RkOjpmb3J3YXJkPFQ+KHRoaXMtPkl0ZW0pKTsKKyAgICBTdHJlYW0uaW5kZW50KExlZnQpOworICAgIEFkYXB0ZXIuZm9ybWF0KFN0cmVhbSwgU3R5bGUpOworICAgIFN0cmVhbS5pbmRlbnQoUmlnaHQpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgUmVwZWF0QWRhcHRlciBmaW5hbCA6IHB1YmxpYyBGb3JtYXRBZGFwdGVyPFQ+IHsKKyAgc2l6ZV90IENvdW50OworCitwdWJsaWM6CisgIFJlcGVhdEFkYXB0ZXIoVCAmJkl0ZW0sIHNpemVfdCBDb3VudCkKKyAgICAgIDogRm9ybWF0QWRhcHRlcjxUPihzdGQ6OmZvcndhcmQ8VD4oSXRlbSkpLCBDb3VudChDb3VudCkge30KKworICB2b2lkIGZvcm1hdChsbHZtOjpyYXdfb3N0cmVhbSAmU3RyZWFtLCBTdHJpbmdSZWYgU3R5bGUpIHsKKyAgICBhdXRvIEFkYXB0ZXIgPSBkZXRhaWw6OmJ1aWxkX2Zvcm1hdF9hZGFwdGVyKHN0ZDo6Zm9yd2FyZDxUPih0aGlzLT5JdGVtKSk7CisgICAgZm9yIChzaXplX3QgSSA9IDA7IEkgPCBDb3VudDsgKytJKSB7CisgICAgICBBZGFwdGVyLmZvcm1hdChTdHJlYW0sIFN0eWxlKTsKKyAgICB9CisgIH0KK307Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorZGV0YWlsOjpBbGlnbkFkYXB0ZXI8VD4gZm10X2FsaWduKFQgJiZJdGVtLCBBbGlnblN0eWxlIFdoZXJlLCBzaXplX3QgQW1vdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgRmlsbCA9ICcgJykgeworICByZXR1cm4gZGV0YWlsOjpBbGlnbkFkYXB0ZXI8VD4oc3RkOjpmb3J3YXJkPFQ+KEl0ZW0pLCBXaGVyZSwgQW1vdW50LCBGaWxsKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitkZXRhaWw6OlBhZEFkYXB0ZXI8VD4gZm10X3BhZChUICYmSXRlbSwgc2l6ZV90IExlZnQsIHNpemVfdCBSaWdodCkgeworICByZXR1cm4gZGV0YWlsOjpQYWRBZGFwdGVyPFQ+KHN0ZDo6Zm9yd2FyZDxUPihJdGVtKSwgTGVmdCwgUmlnaHQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2RldGFpbDo6UmVwZWF0QWRhcHRlcjxUPiBmbXRfcmVwZWF0KFQgJiZJdGVtLCBzaXplX3QgQ291bnQpIHsKKyAgcmV0dXJuIGRldGFpbDo6UmVwZWF0QWRhcHRlcjxUPihzdGQ6OmZvcndhcmQ8VD4oSXRlbSksIENvdW50KTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRm9ybWF0Q29tbW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRm9ybWF0Q29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmYmFkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXRDb21tb24uaApAQCAtMCwwICsxLDc3IEBACisvLz09PS0gRm9ybWF0QWRhcHRlcnMuaCAtIEZvcm1hdHRlcnMgZm9yIGNvbW1vbiBMTFZNIHR5cGVzIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0ZPUk1BVENPTU1PTl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9GT1JNQVRDT01NT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0VmFyaWFkaWNEZXRhaWxzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2VudW0gY2xhc3MgQWxpZ25TdHlsZSB7IExlZnQsIENlbnRlciwgUmlnaHQgfTsKKworc3RydWN0IEZtdEFsaWduIHsKKyAgZGV0YWlsOjpmb3JtYXRfYWRhcHRlciAmQWRhcHRlcjsKKyAgQWxpZ25TdHlsZSBXaGVyZTsKKyAgc2l6ZV90IEFtb3VudDsKKyAgY2hhciBGaWxsOworCisgIEZtdEFsaWduKGRldGFpbDo6Zm9ybWF0X2FkYXB0ZXIgJkFkYXB0ZXIsIEFsaWduU3R5bGUgV2hlcmUsIHNpemVfdCBBbW91bnQsCisgICAgICAgICAgIGNoYXIgRmlsbCA9ICcgJykKKyAgICAgIDogQWRhcHRlcihBZGFwdGVyKSwgV2hlcmUoV2hlcmUpLCBBbW91bnQoQW1vdW50KSwgRmlsbChGaWxsKSB7fQorCisgIHZvaWQgZm9ybWF0KHJhd19vc3RyZWFtICZTLCBTdHJpbmdSZWYgT3B0aW9ucykgeworICAgIC8vIElmIHdlIGRvbid0IG5lZWQgdG8gYWxpZ24sIHdlIGNhbiBmb3JtYXQgc3RyYWlnaHQgaW50byB0aGUgdW5kZXJseWluZworICAgIC8vIHN0cmVhbS4gIE90aGVyd2lzZSB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggYW4gaW50ZXJtZWRpYXRlIHN0cmVhbSBmaXJzdAorICAgIC8vIGluIG9yZGVyIHRvIGNhbGN1bGF0ZSBob3cgbG9uZyB0aGUgb3V0cHV0IGlzIHNvIHdlIGNhbiBhbGlnbiBpdC4KKyAgICAvLyBUT0RPOiBNYWtlIHRoZSBmb3JtYXQgbWV0aG9kIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIHRoYXQKKyAgICAvLyB3YXkgd2UgY2FuIGFsc28gc2tpcCB0aGUgaW50ZXJtZWRpYXRlIHN0cmVhbSBmb3IgbGVmdC1hbGlnbmVkIG91dHB1dC4KKyAgICBpZiAoQW1vdW50ID09IDApIHsKKyAgICAgIEFkYXB0ZXIuZm9ybWF0KFMsIE9wdGlvbnMpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTbWFsbFN0cmluZzw2ND4gSXRlbTsKKyAgICByYXdfc3ZlY3Rvcl9vc3RyZWFtIFN0cmVhbShJdGVtKTsKKworICAgIEFkYXB0ZXIuZm9ybWF0KFN0cmVhbSwgT3B0aW9ucyk7CisgICAgaWYgKEFtb3VudCA8PSBJdGVtLnNpemUoKSkgeworICAgICAgUyA8PCBJdGVtOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBQYWRBbW91bnQgPSBBbW91bnQgLSBJdGVtLnNpemUoKTsKKyAgICBzd2l0Y2ggKFdoZXJlKSB7CisgICAgY2FzZSBBbGlnblN0eWxlOjpMZWZ0OgorICAgICAgUyA8PCBJdGVtOworICAgICAgZmlsbChTLCBQYWRBbW91bnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBbGlnblN0eWxlOjpDZW50ZXI6IHsKKyAgICAgIHNpemVfdCBYID0gUGFkQW1vdW50IC8gMjsKKyAgICAgIGZpbGwoUywgWCk7CisgICAgICBTIDw8IEl0ZW07CisgICAgICBmaWxsKFMsIFBhZEFtb3VudCAtIFgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBmaWxsKFMsIFBhZEFtb3VudCk7CisgICAgICBTIDw8IEl0ZW07CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBmaWxsKGxsdm06OnJhd19vc3RyZWFtICZTLCB1aW50MzJfdCBDb3VudCkgeworICAgIGZvciAodWludDMyX3QgSSA9IDA7IEkgPCBDb3VudDsgKytJKQorICAgICAgUyA8PCBGaWxsOworICB9Cit9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXRQcm92aWRlcnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXRQcm92aWRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTU3MDM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Zvcm1hdFByb3ZpZGVycy5oCkBAIC0wLDAgKzEsNDIzIEBACisvLz09PS0gRm9ybWF0UHJvdmlkZXJzLmggLSBGb3JtYXR0ZXJzIGZvciBjb21tb24gTExWTSB0eXBlcyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZvcm1hdCBwcm92aWRlcnMgZm9yIG1hbnkgY29tbW9uIExMVk0gdHlwZXMsIGZvciBleGFtcGxlCisvLyBhbGxvd2luZyBwcmVjaXNpb24gYW5kIHdpZHRoIHNwZWNpZmllcnMgZm9yIHNjYWxhciBhbmQgc3RyaW5nIHR5cGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0ZPUk1BVFBST1ZJREVSU19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9GT1JNQVRQUk9WSURFUlNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTd2l0Y2guaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXRWYXJpYWRpY0RldGFpbHMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTmF0aXZlRm9ybWF0dGluZy5oIgorCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgZGV0YWlsIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IHVzZV9pbnRlZ3JhbF9mb3JtYXR0ZXIKKyAgICA6IHB1YmxpYyBzdGQ6OmludGVncmFsX2NvbnN0YW50PAorICAgICAgICAgIGJvb2wsIGlzX29uZV9vZjxULCB1aW50OF90LCBpbnQxNl90LCB1aW50MTZfdCwgaW50MzJfdCwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QsIHVpbnQ2NF90LCBpbnQsIHVuc2lnbmVkLCBsb25nLCB1bnNpZ25lZCBsb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZz46OnZhbHVlPiB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgdXNlX2NoYXJfZm9ybWF0dGVyCisgICAgOiBwdWJsaWMgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlPiB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNfY3N0cmluZworICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX29uZV9vZjxULCBjaGFyICosIGNvbnN0IGNoYXIgKj46OnZhbHVlPiB7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCB1c2Vfc3RyaW5nX2Zvcm1hdHRlcgorICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8VCwgbGx2bTo6U3RyaW5nUmVmPjo6dmFsdWU+IHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCB1c2VfcG9pbnRlcl9mb3JtYXR0ZXIKKyAgICA6IHB1YmxpYyBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIHN0ZDo6aXNfcG9pbnRlcjxUPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNfY3N0cmluZzxUPjo6dmFsdWU+IHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCB1c2VfZG91YmxlX2Zvcm1hdHRlcgorICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWU+IHt9OworCitjbGFzcyBIZWxwZXJGdW5jdGlvbnMgeworcHJvdGVjdGVkOgorICBzdGF0aWMgT3B0aW9uYWw8c2l6ZV90PiBwYXJzZU51bWVyaWNQcmVjaXNpb24oU3RyaW5nUmVmIFN0cikgeworICAgIHNpemVfdCBQcmVjOworICAgIE9wdGlvbmFsPHNpemVfdD4gUmVzdWx0OworICAgIGlmIChTdHIuZW1wdHkoKSkKKyAgICAgIFJlc3VsdCA9IE5vbmU7CisgICAgZWxzZSBpZiAoU3RyLmdldEFzSW50ZWdlcigxMCwgUHJlYykpIHsKKyAgICAgIGFzc2VydChmYWxzZSAmJiAiSW52YWxpZCBwcmVjaXNpb24gc3BlY2lmaWVyIik7CisgICAgICBSZXN1bHQgPSBOb25lOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoUHJlYyA8IDEwMCAmJiAiUHJlY2lzaW9uIG91dCBvZiByYW5nZSIpOworICAgICAgUmVzdWx0ID0gc3RkOjptaW48c2l6ZV90Pig5OXUsIFByZWMpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgc3RhdGljIGJvb2wgY29uc3VtZUhleFN0eWxlKFN0cmluZ1JlZiAmU3RyLCBIZXhQcmludFN0eWxlICZTdHlsZSkgeworICAgIGlmICghU3RyLnN0YXJ0c3dpdGhfbG93ZXIoIngiKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChTdHIuY29uc3VtZV9mcm9udCgieC0iKSkKKyAgICAgIFN0eWxlID0gSGV4UHJpbnRTdHlsZTo6TG93ZXI7CisgICAgZWxzZSBpZiAoU3RyLmNvbnN1bWVfZnJvbnQoIlgtIikpCisgICAgICBTdHlsZSA9IEhleFByaW50U3R5bGU6OlVwcGVyOworICAgIGVsc2UgaWYgKFN0ci5jb25zdW1lX2Zyb250KCJ4KyIpIHx8IFN0ci5jb25zdW1lX2Zyb250KCJ4IikpCisgICAgICBTdHlsZSA9IEhleFByaW50U3R5bGU6OlByZWZpeExvd2VyOworICAgIGVsc2UgaWYgKFN0ci5jb25zdW1lX2Zyb250KCJYKyIpIHx8IFN0ci5jb25zdW1lX2Zyb250KCJYIikpCisgICAgICBTdHlsZSA9IEhleFByaW50U3R5bGU6OlByZWZpeFVwcGVyOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgc3RhdGljIHNpemVfdCBjb25zdW1lTnVtSGV4RGlnaXRzKFN0cmluZ1JlZiAmU3RyLCBIZXhQcmludFN0eWxlIFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IERlZmF1bHQpIHsKKyAgICBTdHIuY29uc3VtZUludGVnZXIoMTAsIERlZmF1bHQpOworICAgIGlmIChpc1ByZWZpeGVkSGV4U3R5bGUoU3R5bGUpKQorICAgICAgRGVmYXVsdCArPSAyOworICAgIHJldHVybiBEZWZhdWx0OworICB9Cit9OworfQorCisvLy8gSW1wbGVtZW50YXRpb24gb2YgZm9ybWF0X3Byb3ZpZGVyPFQ+IGZvciBpbnRlZ3JhbCBhcml0aG1ldGljIHR5cGVzLgorLy8vCisvLy8gVGhlIG9wdGlvbnMgc3RyaW5nIG9mIGFuIGludGVncmFsIHR5cGUgaGFzIHRoZSBncmFtbWFyOgorLy8vCisvLy8gICBpbnRlZ2VyX29wdGlvbnMgICA6OiBbc3R5bGVdW2RpZ2l0c10KKy8vLyAgIHN0eWxlICAgICAgICAgICAgIDo6IDxzZWUgdGFibGUgYmVsb3c+CisvLy8gICBkaWdpdHMgICAgICAgICAgICA6OiA8bm9uLW5lZ2F0aXZlIGludGVnZXI+IDAtOTkKKy8vLworLy8vICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vLyAgIHwgIHN0eWxlICB8ICAgICBNZWFuaW5nICAgICAgICAgIHwgICAgICBFeGFtcGxlICAgICB8IERpZ2l0cyBNZWFuaW5nICAgICB8CisvLy8gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vICAgfCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCAgSW5wdXQgfCAgT3V0cHV0IHwgICAgICAgICAgICAgICAgICAgIHwKKy8vLyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLy8gICB8ICAgeC0gICAgfCBIZXggbm8gcHJlZml4LCBsb3dlciB8ICAgNDIgICB8ICAgIDJhICAgfCBNaW5pbXVtICMgZGlnaXRzICAgfAorLy8vICAgfCAgIFgtICAgIHwgSGV4IG5vIHByZWZpeCwgdXBwZXIgfCAgIDQyICAgfCAgICAyQSAgIHwgTWluaW11bSAjIGRpZ2l0cyAgIHwKKy8vLyAgIHwgeCsgLyB4ICB8IEhleCArIHByZWZpeCwgbG93ZXIgIHwgICA0MiAgIHwgICAweDJhICB8IE1pbmltdW0gIyBkaWdpdHMgICB8CisvLy8gICB8IFgrIC8gWCAgfCBIZXggKyBwcmVmaXgsIHVwcGVyICB8ICAgNDIgICB8ICAgMHgyQSAgfCBNaW5pbXVtICMgZGlnaXRzICAgfAorLy8vICAgfCBOIC8gbiAgIHwgRGlnaXQgZ3JvdXBlZCBudW1iZXIgfCAxMjM0NTYgfCAxMjMsNDU2IHwgSWdub3JlZCAgICAgICAgICAgIHwKKy8vLyAgIHwgRCAvIGQgICB8IEludGVnZXIgICAgICAgICAgICAgIHwgMTAwMDAwIHwgMTAwMDAwICB8IElnbm9yZWQgICAgICAgICAgICB8CisvLy8gICB8IChlbXB0eSkgfCBTYW1lIGFzIEQgLyBkICAgICAgICB8ICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfAorLy8vICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBmb3JtYXRfcHJvdmlkZXI8CisgICAgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8ZGV0YWlsOjp1c2VfaW50ZWdyYWxfZm9ybWF0dGVyPFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgOiBwdWJsaWMgZGV0YWlsOjpIZWxwZXJGdW5jdGlvbnMgeworcHJpdmF0ZToKK3B1YmxpYzoKKyAgc3RhdGljIHZvaWQgZm9ybWF0KGNvbnN0IFQgJlYsIGxsdm06OnJhd19vc3RyZWFtICZTdHJlYW0sIFN0cmluZ1JlZiBTdHlsZSkgeworICAgIEhleFByaW50U3R5bGUgSFM7CisgICAgc2l6ZV90IERpZ2l0cyA9IDA7CisgICAgaWYgKGNvbnN1bWVIZXhTdHlsZShTdHlsZSwgSFMpKSB7CisgICAgICBEaWdpdHMgPSBjb25zdW1lTnVtSGV4RGlnaXRzKFN0eWxlLCBIUywgMCk7CisgICAgICB3cml0ZV9oZXgoU3RyZWFtLCBWLCBIUywgRGlnaXRzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBJbnRlZ2VyU3R5bGUgSVMgPSBJbnRlZ2VyU3R5bGU6OkludGVnZXI7CisgICAgaWYgKFN0eWxlLmNvbnN1bWVfZnJvbnQoIk4iKSB8fCBTdHlsZS5jb25zdW1lX2Zyb250KCJuIikpCisgICAgICBJUyA9IEludGVnZXJTdHlsZTo6TnVtYmVyOworICAgIGVsc2UgaWYgKFN0eWxlLmNvbnN1bWVfZnJvbnQoIkQiKSB8fCBTdHlsZS5jb25zdW1lX2Zyb250KCJkIikpCisgICAgICBJUyA9IEludGVnZXJTdHlsZTo6SW50ZWdlcjsKKworICAgIFN0eWxlLmNvbnN1bWVJbnRlZ2VyKDEwLCBEaWdpdHMpOworICAgIGFzc2VydChTdHlsZS5lbXB0eSgpICYmICJJbnZhbGlkIGludGVncmFsIGZvcm1hdCBzdHlsZSEiKTsKKyAgICB3cml0ZV9pbnRlZ2VyKFN0cmVhbSwgViwgRGlnaXRzLCBJUyk7CisgIH0KK307CisKKy8vLyBJbXBsZW1lbnRhdGlvbiBvZiBmb3JtYXRfcHJvdmlkZXI8VD4gZm9yIGludGVncmFsIHBvaW50ZXIgdHlwZXMuCisvLy8KKy8vLyBUaGUgb3B0aW9ucyBzdHJpbmcgb2YgYSBwb2ludGVyIHR5cGUgaGFzIHRoZSBncmFtbWFyOgorLy8vCisvLy8gICBwb2ludGVyX29wdGlvbnMgICA6OiBbc3R5bGVdW3ByZWNpc2lvbl0KKy8vLyAgIHN0eWxlICAgICAgICAgICAgIDo6IDxzZWUgdGFibGUgYmVsb3c+CisvLy8gICBkaWdpdHMgICAgICAgICAgICA6OiA8bm9uLW5lZ2F0aXZlIGludGVnZXI+IDAtc2l6ZW9mKHZvaWQqKQorLy8vCisvLy8gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8vICAgfCAgIFMgICAgIHwgICAgIE1lYW5pbmcgICAgICAgICAgfCAgICAgICAgICAgICAgICBFeGFtcGxlICAgICAgICAgICAgICAgIHwKKy8vLyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIElucHV0ICAgICAgIHwgICAgICBPdXRwdXQgICAgICAgfAorLy8vICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vLyAgIHwgICB4LSAgICB8IEhleCBubyBwcmVmaXgsIGxvd2VyIHwgICAgMHhERUFEQkVFRiAgICAgfCAgICAgZGVhZGJlZWYgICAgICB8CisvLy8gICB8ICAgWC0gICAgfCBIZXggbm8gcHJlZml4LCB1cHBlciB8ICAgIDB4REVBREJFRUYgICAgIHwgICAgIERFQURCRUVGICAgICAgfAorLy8vICAgfCB4KyAvIHggIHwgSGV4ICsgcHJlZml4LCBsb3dlciAgfCAgICAweERFQURCRUVGICAgICB8ICAgIDB4ZGVhZGJlZWYgICAgIHwKKy8vLyAgIHwgWCsgLyBYICB8IEhleCArIHByZWZpeCwgdXBwZXIgIHwgICAgMHhERUFEQkVFRiAgICAgfCAgICAweERFQURCRUVGICAgICB8CisvLy8gICB8IChlbXB0eSkgfCBTYW1lIGFzIFgrIC8gWCAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfAorLy8vICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vLworLy8vIFRoZSBkZWZhdWx0IHByZWNpc2lvbiBpcyB0aGUgbnVtYmVyIG9mIG5pYmJsZXMgaW4gYSBtYWNoaW5lIHdvcmQsIGFuZCBpbiBhbGwKKy8vLyBjYXNlcyBpbmRpY2F0ZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIG5pYmJsZXMgdG8gcHJpbnQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBmb3JtYXRfcHJvdmlkZXI8CisgICAgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8ZGV0YWlsOjp1c2VfcG9pbnRlcl9mb3JtYXR0ZXI8VD46OnZhbHVlPjo6dHlwZT4KKyAgICA6IHB1YmxpYyBkZXRhaWw6OkhlbHBlckZ1bmN0aW9ucyB7Citwcml2YXRlOgorcHVibGljOgorICBzdGF0aWMgdm9pZCBmb3JtYXQoY29uc3QgVCAmViwgbGx2bTo6cmF3X29zdHJlYW0gJlN0cmVhbSwgU3RyaW5nUmVmIFN0eWxlKSB7CisgICAgSGV4UHJpbnRTdHlsZSBIUyA9IEhleFByaW50U3R5bGU6OlByZWZpeFVwcGVyOworICAgIGNvbnN1bWVIZXhTdHlsZShTdHlsZSwgSFMpOworICAgIHNpemVfdCBEaWdpdHMgPSBjb25zdW1lTnVtSGV4RGlnaXRzKFN0eWxlLCBIUywgc2l6ZW9mKHZvaWQgKikgKiAyKTsKKyAgICB3cml0ZV9oZXgoU3RyZWFtLCByZWludGVycHJldF9jYXN0PHN0ZDo6dWludHB0cl90PihWKSwgSFMsIERpZ2l0cyk7CisgIH0KK307CisKKy8vLyBJbXBsZW1lbnRhdGlvbiBvZiBmb3JtYXRfcHJvdmlkZXI8VD4gZm9yIGMtc3R5bGUgc3RyaW5ncyBhbmQgc3RyaW5nCisvLy8gb2JqZWN0cyBzdWNoIGFzIHN0ZDo6c3RyaW5nIGFuZCBsbHZtOjpTdHJpbmdSZWYuCisvLy8KKy8vLyBUaGUgb3B0aW9ucyBzdHJpbmcgb2YgYSBzdHJpbmcgdHlwZSBoYXMgdGhlIGdyYW1tYXI6CisvLy8KKy8vLyAgIHN0cmluZ19vcHRpb25zIDo6IFtsZW5ndGhdCisvLy8KKy8vLyB3aGVyZSBgbGVuZ3RoYCBpcyBhbiBvcHRpb25hbCBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIG1heGltdW0gbnVtYmVyIG9mCisvLy8gY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIHRvIHByaW50LiAgSWYgYGxlbmd0aGAgaXMgb21pdHRlZCwgdGhlIHN0cmluZyBpcworLy8vIHByaW50ZWQgdXAgdG8gdGhlIG51bGwgdGVybWluYXRvci4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgZm9ybWF0X3Byb3ZpZGVyPAorICAgIFQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGRldGFpbDo6dXNlX3N0cmluZ19mb3JtYXR0ZXI8VD46OnZhbHVlPjo6dHlwZT4geworICBzdGF0aWMgdm9pZCBmb3JtYXQoY29uc3QgVCAmViwgbGx2bTo6cmF3X29zdHJlYW0gJlN0cmVhbSwgU3RyaW5nUmVmIFN0eWxlKSB7CisgICAgc2l6ZV90IE4gPSBTdHJpbmdSZWY6Om5wb3M7CisgICAgaWYgKCFTdHlsZS5lbXB0eSgpICYmIFN0eWxlLmdldEFzSW50ZWdlcigxMCwgTikpIHsKKyAgICAgIGFzc2VydChmYWxzZSAmJiAiU3R5bGUgaXMgbm90IGEgdmFsaWQgaW50ZWdlciIpOworICAgIH0KKyAgICBsbHZtOjpTdHJpbmdSZWYgUyA9IFY7CisgICAgU3RyZWFtIDw8IFMuc3Vic3RyKDAsIE4pOworICB9Cit9OworCisvLy8gSW1wbGVtZW50YXRpb24gb2YgZm9ybWF0X3Byb3ZpZGVyPFQ+IGZvciBsbHZtOjpUd2luZS4KKy8vLworLy8vIFRoaXMgZm9sbG93cyB0aGUgc2FtZSBydWxlcyBhcyB0aGUgc3RyaW5nIGZvcm1hdHRlci4KKwordGVtcGxhdGUgPD4gc3RydWN0IGZvcm1hdF9wcm92aWRlcjxUd2luZT4geworICBzdGF0aWMgdm9pZCBmb3JtYXQoY29uc3QgVHdpbmUgJlYsIGxsdm06OnJhd19vc3RyZWFtICZTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU3R5bGUpIHsKKyAgICBmb3JtYXRfcHJvdmlkZXI8c3RkOjpzdHJpbmc+Ojpmb3JtYXQoVi5zdHIoKSwgU3RyZWFtLCBTdHlsZSk7CisgIH0KK307CisKKy8vLyBJbXBsZW1lbnRhdGlvbiBvZiBmb3JtYXRfcHJvdmlkZXI8VD4gZm9yIGNoYXJhY3RlcnMuCisvLy8KKy8vLyBUaGUgb3B0aW9ucyBzdHJpbmcgb2YgYSBjaGFyYWN0ZXIgdHlwZSBoYXMgdGhlIGdyYW1tYXI6CisvLy8KKy8vLyAgIGNoYXJfb3B0aW9ucyA6OiAoZW1wdHkpIHwgW2ludGVnZXJfb3B0aW9uc10KKy8vLworLy8vIElmIGBjaGFyX29wdGlvbnNgIGlzIGVtcHR5LCB0aGUgY2hhcmFjdGVyIGlzIGRpc3BsYXllZCBhcyBhbiBBU0NJSQorLy8vIGNoYXJhY3Rlci4gIE90aGVyd2lzZSwgaXQgaXMgdHJlYXRlZCBhcyBhbiBpbnRlZ2VyIG9wdGlvbnMgc3RyaW5nLgorLy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBmb3JtYXRfcHJvdmlkZXI8CisgICAgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8ZGV0YWlsOjp1c2VfY2hhcl9mb3JtYXR0ZXI8VD46OnZhbHVlPjo6dHlwZT4geworICBzdGF0aWMgdm9pZCBmb3JtYXQoY29uc3QgY2hhciAmViwgbGx2bTo6cmF3X29zdHJlYW0gJlN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTdHlsZSkgeworICAgIGlmIChTdHlsZS5lbXB0eSgpKQorICAgICAgU3RyZWFtIDw8IFY7CisgICAgZWxzZSB7CisgICAgICBpbnQgWCA9IHN0YXRpY19jYXN0PGludD4oVik7CisgICAgICBmb3JtYXRfcHJvdmlkZXI8aW50Pjo6Zm9ybWF0KFgsIFN0cmVhbSwgU3R5bGUpOworICAgIH0KKyAgfQorfTsKKworLy8vIEltcGxlbWVudGF0aW9uIG9mIGZvcm1hdF9wcm92aWRlcjxUPiBmb3IgdHlwZSBgYm9vbGAKKy8vLworLy8vIFRoZSBvcHRpb25zIHN0cmluZyBvZiBhIGJvb2xlYW4gdHlwZSBoYXMgdGhlIGdyYW1tYXI6CisvLy8KKy8vLyAgIGJvb2xfb3B0aW9ucyA6OiAiIiB8ICJZIiB8ICJ5IiB8ICJEIiB8ICJkIiB8ICJUIiB8ICJ0IgorLy8vCisvLy8gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLy8gICB8ICAgIEMgICAgfCAgICAgTWVhbmluZyAgICAgICAgICB8CisvLy8gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLy8gICB8ICAgIFkgICAgfCAgICAgICBZRVMgLyBOTyAgICAgICB8CisvLy8gICB8ICAgIHkgICAgfCAgICAgICB5ZXMgLyBubyAgICAgICB8CisvLy8gICB8ICBEIC8gZCAgfCAgICBJbnRlZ2VyIDAgb3IgMSAgICB8CisvLy8gICB8ICAgIFQgICAgfCAgICAgVFJVRSAvIEZBTFNFICAgICB8CisvLy8gICB8ICAgIHQgICAgfCAgICAgdHJ1ZSAvIGZhbHNlICAgICB8CisvLy8gICB8IChlbXB0eSkgfCAgIEVxdWl2YWxlbnQgdG8gJ3QnICB8CisvLy8gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgZm9ybWF0X3Byb3ZpZGVyPGJvb2w+IHsKKyAgc3RhdGljIHZvaWQgZm9ybWF0KGNvbnN0IGJvb2wgJkIsIGxsdm06OnJhd19vc3RyZWFtICZTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU3R5bGUpIHsKKyAgICBTdHJlYW0gPDwgU3RyaW5nU3dpdGNoPGNvbnN0IGNoYXIgKj4oU3R5bGUpCisgICAgICAgICAgICAgICAgICAuQ2FzZSgiWSIsIEIgPyAiWUVTIiA6ICJOTyIpCisgICAgICAgICAgICAgICAgICAuQ2FzZSgieSIsIEIgPyAieWVzIiA6ICJubyIpCisgICAgICAgICAgICAgICAgICAuQ2FzZUxvd2VyKCJEIiwgQiA/ICIxIiA6ICIwIikKKyAgICAgICAgICAgICAgICAgIC5DYXNlKCJUIiwgQiA/ICJUUlVFIiA6ICJGQUxTRSIpCisgICAgICAgICAgICAgICAgICAuQ2FzZXMoInQiLCAiIiwgQiA/ICJ0cnVlIiA6ICJmYWxzZSIpCisgICAgICAgICAgICAgICAgICAuRGVmYXVsdChCID8gIjEiIDogIjAiKTsKKyAgfQorfTsKKworLy8vIEltcGxlbWVudGF0aW9uIG9mIGZvcm1hdF9wcm92aWRlcjxUPiBmb3IgZmxvYXRpbmcgcG9pbnQgdHlwZXMuCisvLy8KKy8vLyBUaGUgb3B0aW9ucyBzdHJpbmcgb2YgYSBmbG9hdGluZyBwb2ludCB0eXBlIGhhcyB0aGUgZm9ybWF0OgorLy8vCisvLy8gICBmbG9hdF9vcHRpb25zICAgOjogW3N0eWxlXVtwcmVjaXNpb25dCisvLy8gICBzdHlsZSAgICAgICAgICAgOjogPHNlZSB0YWJsZSBiZWxvdz4KKy8vLyAgIHByZWNpc2lvbiAgICAgICA6OiA8bm9uLW5lZ2F0aXZlIGludGVnZXI+IDAtOTkKKy8vLworLy8vICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vLyAgIHwgIHN0eWxlICB8ICAgICBNZWFuaW5nICAgICAgICAgIHwgICAgICBFeGFtcGxlICAgICB8CisvLy8gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vICAgfCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCAgSW5wdXQgfCAgT3V0cHV0IHwKKy8vLyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLy8gICB8IFAgLyBwICAgfCBQZXJjZW50YWdlICAgICAgICAgICB8ICAwLjA1ICB8ICA1LjAwJSAgfAorLy8vICAgfCBGIC8gZiAgIHwgRml4ZWQgcG9pbnQgICAgICAgICAgfCAgIDEuMCAgfCAgMS4wMCAgIHwKKy8vLyAgIHwgICBFICAgICB8IEV4cG9uZW50aWFsIHdpdGggRSAgIHwgMTAwMDAwIHwgMS4wRSswNSB8CisvLy8gICB8ICAgZSAgICAgfCBFeHBvbmVudGlhbCB3aXRoIGUgICB8IDEwMDAwMCB8IDEuMGUrMDUgfAorLy8vICAgfCAoZW1wdHkpIHwgU2FtZSBhcyBGIC8gZiAgICAgICAgfCAgICAgICAgfCAgICAgICAgIHwKKy8vLyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLy8KKy8vLyBUaGUgZGVmYXVsdCBwcmVjaXNpb24gaXMgNiBmb3IgZXhwb25lbnRpYWwgKEUgLyBlKSBhbmQgMiBmb3IgZXZlcnl0aGluZworLy8vIGVsc2UuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGZvcm1hdF9wcm92aWRlcjwKKyAgICBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxkZXRhaWw6OnVzZV9kb3VibGVfZm9ybWF0dGVyPFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgOiBwdWJsaWMgZGV0YWlsOjpIZWxwZXJGdW5jdGlvbnMgeworICBzdGF0aWMgdm9pZCBmb3JtYXQoY29uc3QgVCAmViwgbGx2bTo6cmF3X29zdHJlYW0gJlN0cmVhbSwgU3RyaW5nUmVmIFN0eWxlKSB7CisgICAgRmxvYXRTdHlsZSBTOworICAgIGlmIChTdHlsZS5jb25zdW1lX2Zyb250KCJQIikgfHwgU3R5bGUuY29uc3VtZV9mcm9udCgicCIpKQorICAgICAgUyA9IEZsb2F0U3R5bGU6OlBlcmNlbnQ7CisgICAgZWxzZSBpZiAoU3R5bGUuY29uc3VtZV9mcm9udCgiRiIpIHx8IFN0eWxlLmNvbnN1bWVfZnJvbnQoImYiKSkKKyAgICAgIFMgPSBGbG9hdFN0eWxlOjpGaXhlZDsKKyAgICBlbHNlIGlmIChTdHlsZS5jb25zdW1lX2Zyb250KCJFIikpCisgICAgICBTID0gRmxvYXRTdHlsZTo6RXhwb25lbnRVcHBlcjsKKyAgICBlbHNlIGlmIChTdHlsZS5jb25zdW1lX2Zyb250KCJlIikpCisgICAgICBTID0gRmxvYXRTdHlsZTo6RXhwb25lbnQ7CisgICAgZWxzZQorICAgICAgUyA9IEZsb2F0U3R5bGU6OkZpeGVkOworCisgICAgT3B0aW9uYWw8c2l6ZV90PiBQcmVjaXNpb24gPSBwYXJzZU51bWVyaWNQcmVjaXNpb24oU3R5bGUpOworICAgIGlmICghUHJlY2lzaW9uLmhhc1ZhbHVlKCkpCisgICAgICBQcmVjaXNpb24gPSBnZXREZWZhdWx0UHJlY2lzaW9uKFMpOworCisgICAgd3JpdGVfZG91YmxlKFN0cmVhbSwgc3RhdGljX2Nhc3Q8ZG91YmxlPihWKSwgUywgUHJlY2lzaW9uKTsKKyAgfQorfTsKKworbmFtZXNwYWNlIGRldGFpbCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlclQ+Cit1c2luZyBJdGVyVmFsdWUgPSB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyVD46OnZhbHVlX3R5cGU7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJdGVyVD4KK3N0cnVjdCByYW5nZV9pdGVtX2hhc19wcm92aWRlcgorICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8CisgICAgICAgICAgYm9vbCwgIXVzZXNfbWlzc2luZ19wcm92aWRlcjxJdGVyVmFsdWU8SXRlclQ+Pjo6dmFsdWU+IHt9OworfQorCisvLy8gSW1wbGVtZW50YXRpb24gb2YgZm9ybWF0X3Byb3ZpZGVyPFQ+IGZvciByYW5nZXMuCisvLy8KKy8vLyBUaGlzIHdpbGwgcHJpbnQgYW4gYXJiaXRyYXJ5IHJhbmdlIGFzIGEgZGVsaW1pdGVkIHNlcXVlbmNlIG9mIGl0ZW1zLgorLy8vCisvLy8gVGhlIG9wdGlvbnMgc3RyaW5nIG9mIGEgcmFuZ2UgdHlwZSBoYXMgdGhlIGdyYW1tYXI6CisvLy8KKy8vLyAgIHJhbmdlX3N0eWxlICAgICAgIDo6PSBbc2VwYXJhdG9yXSBbZWxlbWVudF9zdHlsZV0KKy8vLyAgIHNlcGFyYXRvciAgICAgICAgIDo6PSAiJCIgZGVsaW1ldGVkX2V4cHIKKy8vLyAgIGVsZW1lbnRfc3R5bGUgICAgIDo6PSAiQCIgZGVsaW1ldGVkX2V4cHIKKy8vLyAgIGRlbGltZXRlZF9leHByICAgIDo6PSAiWyIgZXhwciAiXSIgfCAiKCIgZXhwciAiKSIgfCAiPCIgZXhwciAiPiIKKy8vLyAgIGV4cHIgICAgICAgICAgICAgIDo6PSA8YW55IHN0cmluZyBub3QgY29udGFpbmluZyBkZWxpbWV0ZXI+CisvLy8KKy8vLyB3aGVyZSB0aGUgc2VwYXJhdG9yIGV4cHJlc3Npb24gaXMgdGhlIHN0cmluZyB0byBpbnNlcnQgYmV0d2VlbiBjb25zZWN1dGl2ZQorLy8vIGl0ZW1zIGluIHRoZSByYW5nZSBhbmQgdGhlIGFyZ3VtZW50IGV4cHJlc3Npb24gaXMgdGhlIFN0eWxlIHNwZWNpZmljYXRpb24gdG8KKy8vLyBiZSB1c2VkIHdoZW4gZm9ybWF0dGluZyB0aGUgdW5kZXJseWluZyB0eXBlLiAgVGhlIGRlZmF1bHQgc2VwYXJhdG9yIGlmCisvLy8gdW5zcGVjaWZpZWQgaXMgJyAnIChzcGFjZSkuICBUaGUgc3ludGF4IG9mIHRoZSBhcmd1bWVudCBleHByZXNzaW9uIGZvbGxvd3MKKy8vLyB3aGF0ZXZlciBncmFtbWFyIGlzIGRpY3RhdGVkIGJ5IHRoZSBmb3JtYXQgcHJvdmlkZXIgb3IgZm9ybWF0IGFkYXB0ZXIgdXNlZAorLy8vIHRvIGZvcm1hdCB0aGUgdmFsdWUgdHlwZS4KKy8vLworLy8vIE5vdGUgdGhhdCBhdHRlbXB0aW5nIHRvIGZvcm1hdCBhbiBgaXRlcmF0b3JfcmFuZ2U8VD5gIHdoZXJlIG5vIGZvcm1hdAorLy8vIHByb3ZpZGVyIGNhbiBiZSBmb3VuZCBmb3IgVCB3aWxsIHJlc3VsdCBpbiBhIGNvbXBpbGUgZXJyb3IuCisvLy8KKwordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJUPiBjbGFzcyBmb3JtYXRfcHJvdmlkZXI8bGx2bTo6aXRlcmF0b3JfcmFuZ2U8SXRlclQ+PiB7CisgIHVzaW5nIHZhbHVlID0gdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SXRlclQ+Ojp2YWx1ZV90eXBlOworICB1c2luZyByZWZlcmVuY2UgPSB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyVD46OnJlZmVyZW5jZTsKKworICBzdGF0aWMgU3RyaW5nUmVmIGNvbnN1bWVPbmVPcHRpb24oU3RyaW5nUmVmICZTdHlsZSwgY2hhciBJbmRpY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGVmYXVsdCkgeworICAgIGlmIChTdHlsZS5lbXB0eSgpKQorICAgICAgcmV0dXJuIERlZmF1bHQ7CisgICAgaWYgKFN0eWxlLmZyb250KCkgIT0gSW5kaWNhdG9yKQorICAgICAgcmV0dXJuIERlZmF1bHQ7CisgICAgU3R5bGUgPSBTdHlsZS5kcm9wX2Zyb250KCk7CisgICAgaWYgKFN0eWxlLmVtcHR5KCkpIHsKKyAgICAgIGFzc2VydChmYWxzZSAmJiAiSW52YWxpZCByYW5nZSBzdHlsZSIpOworICAgICAgcmV0dXJuIERlZmF1bHQ7CisgICAgfQorCisgICAgZm9yIChjb25zdCBjaGFyICpEIDogeyJbXSIsICI8PiIsICIoKSJ9KSB7CisgICAgICBpZiAoU3R5bGUuZnJvbnQoKSAhPSBEWzBdKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIHNpemVfdCBFbmQgPSBTdHlsZS5maW5kX2ZpcnN0X29mKERbMV0pOworICAgICAgaWYgKEVuZCA9PSBTdHJpbmdSZWY6Om5wb3MpIHsKKyAgICAgICAgYXNzZXJ0KGZhbHNlICYmICJNaXNzaW5nIHJhbmdlIG9wdGlvbiBlbmQgZGVsaW1ldGVyISIpOworICAgICAgICByZXR1cm4gRGVmYXVsdDsKKyAgICAgIH0KKyAgICAgIFN0cmluZ1JlZiBSZXN1bHQgPSBTdHlsZS5zbGljZSgxLCBFbmQpOworICAgICAgU3R5bGUgPSBTdHlsZS5kcm9wX2Zyb250KEVuZCArIDEpOworICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgYXNzZXJ0KGZhbHNlICYmICJJbnZhbGlkIHJhbmdlIHN0eWxlISIpOworICAgIHJldHVybiBEZWZhdWx0OworICB9CisKKyAgc3RhdGljIHN0ZDo6cGFpcjxTdHJpbmdSZWYsIFN0cmluZ1JlZj4gcGFyc2VPcHRpb25zKFN0cmluZ1JlZiBTdHlsZSkgeworICAgIFN0cmluZ1JlZiBTZXAgPSBjb25zdW1lT25lT3B0aW9uKFN0eWxlLCAnJCcsICIsICIpOworICAgIFN0cmluZ1JlZiBBcmdzID0gY29uc3VtZU9uZU9wdGlvbihTdHlsZSwgJ0AnLCAiIik7CisgICAgYXNzZXJ0KFN0eWxlLmVtcHR5KCkgJiYgIlVuZXhwZWN0ZWQgdGV4dCBpbiByYW5nZSBvcHRpb24gc3RyaW5nISIpOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihTZXAsIEFyZ3MpOworICB9CisKK3B1YmxpYzoKKyAgc3RhdGljX2Fzc2VydChkZXRhaWw6OnJhbmdlX2l0ZW1faGFzX3Byb3ZpZGVyPEl0ZXJUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIlJhbmdlIHZhbHVlX3R5cGUgZG9lcyBub3QgaGF2ZSBhIGZvcm1hdCBwcm92aWRlciEiKTsKKyAgc3RhdGljIHZvaWQgZm9ybWF0KGNvbnN0IGxsdm06Oml0ZXJhdG9yX3JhbmdlPEl0ZXJUPiAmViwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm06OnJhd19vc3RyZWFtICZTdHJlYW0sIFN0cmluZ1JlZiBTdHlsZSkgeworICAgIFN0cmluZ1JlZiBTZXA7CisgICAgU3RyaW5nUmVmIEFyZ1N0eWxlOworICAgIHN0ZDo6dGllKFNlcCwgQXJnU3R5bGUpID0gcGFyc2VPcHRpb25zKFN0eWxlKTsKKyAgICBhdXRvIEJlZ2luID0gVi5iZWdpbigpOworICAgIGF1dG8gRW5kID0gVi5lbmQoKTsKKyAgICBpZiAoQmVnaW4gIT0gRW5kKSB7CisgICAgICBhdXRvIEFkYXB0ZXIgPQorICAgICAgICAgIGRldGFpbDo6YnVpbGRfZm9ybWF0X2FkYXB0ZXIoc3RkOjpmb3J3YXJkPHJlZmVyZW5jZT4oKkJlZ2luKSk7CisgICAgICBBZGFwdGVyLmZvcm1hdChTdHJlYW0sIEFyZ1N0eWxlKTsKKyAgICAgICsrQmVnaW47CisgICAgfQorICAgIHdoaWxlIChCZWdpbiAhPSBFbmQpIHsKKyAgICAgIFN0cmVhbSA8PCBTZXA7CisgICAgICBhdXRvIEFkYXB0ZXIgPQorICAgICAgICAgIGRldGFpbDo6YnVpbGRfZm9ybWF0X2FkYXB0ZXIoc3RkOjpmb3J3YXJkPHJlZmVyZW5jZT4oKkJlZ2luKSk7CisgICAgICBBZGFwdGVyLmZvcm1hdChTdHJlYW0sIEFyZ1N0eWxlKTsKKyAgICAgICsrQmVnaW47CisgICAgfQorICB9Cit9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXRWYXJpYWRpYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Zvcm1hdFZhcmlhZGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwOGE3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXRWYXJpYWRpYy5oCkBAIC0wLDAgKzEsMjcwIEBACisvLz09PS0gRm9ybWF0VmFyaWFkaWMuaCAtIEVmZmljaWVudCB0eXBlLXNhZmUgc3RyaW5nIGZvcm1hdHRpbmcgLS0qLSBDKystKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBmb3JtYXR2KCkgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBvdGhlciBMTFZNCisvLyBzdWJzeXN0ZW1zIHRvIHByb3ZpZGUgcHJpbnRmLWxpa2UgZm9ybWF0dGluZywgYnV0IHdpdGggaW1wcm92ZWQgc2FmZXR5IGFuZAorLy8gZmxleGliaWxpdHkuICBUaGUgcmVzdWx0IG9mIGBmb3JtYXR2YCBpcyBhbiBvYmplY3Qgd2hpY2ggY2FuIGJlIHN0cmVhbWVkIHRvCisvLyBhIHJhd19vc3RyZWFtIG9yIGNvbnZlcnRlZCB0byBhIHN0ZDo6c3RyaW5nIG9yIGxsdm06OlNtYWxsU3RyaW5nLgorLy8KKy8vICAgLy8gQ29udmVydCB0byBzdGQ6OnN0cmluZy4KKy8vICAgc3RkOjpzdHJpbmcgUyA9IGZvcm1hdHYoInswfSB7MX0iLCAxMjM0LjQxMiwgInRlc3QiKS5zdHIoKTsKKy8vCisvLyAgIC8vIENvbnZlcnQgdG8gbGx2bTo6U21hbGxTdHJpbmcKKy8vICAgU21hbGxTdHJpbmc8OD4gUyA9IGZvcm1hdHYoInswfSB7MX0iLCAxMjM0LjQxMiwgInRlc3QiKS5zc3RyPDg+KCk7CisvLworLy8gICAvLyBTdHJlYW0gdG8gYW4gZXhpc3RpbmcgcmF3X29zdHJlYW0uCisvLyAgIE9TIDw8IGZvcm1hdHYoInswfSB7MX0iLCAxMjM0LjQxMiwgInRlc3QiKTsKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9GT1JNQVRWQVJJQURJQ19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9GT1JNQVRWQVJJQURJQ19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdENvbW1vbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXRQcm92aWRlcnMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0VmFyaWFkaWNEZXRhaWxzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworZW51bSBjbGFzcyBSZXBsYWNlbWVudFR5cGUgeyBFbXB0eSwgRm9ybWF0LCBMaXRlcmFsIH07CisKK3N0cnVjdCBSZXBsYWNlbWVudEl0ZW0geworICBSZXBsYWNlbWVudEl0ZW0oKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFJlcGxhY2VtZW50SXRlbShTdHJpbmdSZWYgTGl0ZXJhbCkKKyAgICAgIDogVHlwZShSZXBsYWNlbWVudFR5cGU6OkxpdGVyYWwpLCBTcGVjKExpdGVyYWwpIHt9CisgIFJlcGxhY2VtZW50SXRlbShTdHJpbmdSZWYgU3BlYywgc2l6ZV90IEluZGV4LCBzaXplX3QgQWxpZ24sIEFsaWduU3R5bGUgV2hlcmUsCisgICAgICAgICAgICAgICAgICBjaGFyIFBhZCwgU3RyaW5nUmVmIE9wdGlvbnMpCisgICAgICA6IFR5cGUoUmVwbGFjZW1lbnRUeXBlOjpGb3JtYXQpLCBTcGVjKFNwZWMpLCBJbmRleChJbmRleCksIEFsaWduKEFsaWduKSwKKyAgICAgICAgV2hlcmUoV2hlcmUpLCBQYWQoUGFkKSwgT3B0aW9ucyhPcHRpb25zKSB7fQorCisgIFJlcGxhY2VtZW50VHlwZSBUeXBlID0gUmVwbGFjZW1lbnRUeXBlOjpFbXB0eTsKKyAgU3RyaW5nUmVmIFNwZWM7CisgIHNpemVfdCBJbmRleCA9IDA7CisgIHNpemVfdCBBbGlnbiA9IDA7CisgIEFsaWduU3R5bGUgV2hlcmUgPSBBbGlnblN0eWxlOjpSaWdodDsKKyAgY2hhciBQYWQ7CisgIFN0cmluZ1JlZiBPcHRpb25zOworfTsKKworY2xhc3MgZm9ybWF0dl9vYmplY3RfYmFzZSB7Citwcm90ZWN0ZWQ6CisgIC8vIFRoZSBwYXJhbWV0ZXJzIGFyZSBzdG9yZWQgaW4gYSBzdGQ6OnR1cGxlLCB3aGljaCBkb2VzIG5vdCBwcm92aWRlIHJ1bnRpbWUKKyAgLy8gaW5kZXhpbmcgY2FwYWJpbGl0aWVzLiAgSW4gb3JkZXIgdG8gZW5hYmxlIHJ1bnRpbWUgaW5kZXhpbmcsIHdlIHVzZSB0aGlzCisgIC8vIHN0cnVjdHVyZSB0byBwdXQgdGhlIHBhcmFtZXRlcnMgaW50byBhIHN0ZDo6dmVjdG9yLiAgU2luY2UgdGhlIHBhcmFtZXRlcnMKKyAgLy8gYXJlIG5vdCBhbGwgdGhlIHNhbWUgdHlwZSwgd2UgdXNlIHNvbWUgdHlwZS1lcmFzdXJlIGJ5IHdyYXBwaW5nIHRoZQorICAvLyBwYXJhbWV0ZXJzIGluIGEgdGVtcGxhdGUgY2xhc3MgdGhhdCBkZXJpdmVzIGZyb20gYSBub24tdGVtcGxhdGUgc3VwZXJjbGFzcy4KKyAgLy8gRXNzZW50aWFsbHksIHdlIGFyZSBjb252ZXJ0aW5nIGEgc3RkOjp0dXBsZTxEZXJpdmVkPFRzLi4uPj4gdG8gYQorICAvLyBzdGQ6OnZlY3RvcjxCYXNlKj4uCisgIHN0cnVjdCBjcmVhdGVfYWRhcHRlcnMgeworICAgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUcz4KKyAgICBzdGQ6OnZlY3RvcjxkZXRhaWw6OmZvcm1hdF9hZGFwdGVyICo+IG9wZXJhdG9yKCkoVHMgJi4uLiBJdGVtcykgeworICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPGRldGFpbDo6Zm9ybWF0X2FkYXB0ZXIgKj57Jkl0ZW1zLi4ufTsKKyAgICB9CisgIH07CisKKyAgU3RyaW5nUmVmIEZtdDsKKyAgc3RkOjp2ZWN0b3I8ZGV0YWlsOjpmb3JtYXRfYWRhcHRlciAqPiBBZGFwdGVyczsKKyAgc3RkOjp2ZWN0b3I8UmVwbGFjZW1lbnRJdGVtPiBSZXBsYWNlbWVudHM7CisKKyAgc3RhdGljIGJvb2wgY29uc3VtZUZpZWxkTGF5b3V0KFN0cmluZ1JlZiAmU3BlYywgQWxpZ25TdHlsZSAmV2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgJkFsaWduLCBjaGFyICZQYWQpOworCisgIHN0YXRpYyBzdGQ6OnBhaXI8UmVwbGFjZW1lbnRJdGVtLCBTdHJpbmdSZWY+CisgIHNwbGl0TGl0ZXJhbEFuZFJlcGxhY2VtZW50KFN0cmluZ1JlZiBGbXQpOworCitwdWJsaWM6CisgIGZvcm1hdHZfb2JqZWN0X2Jhc2UoU3RyaW5nUmVmIEZtdCwgc3RkOjpzaXplX3QgUGFyYW1Db3VudCkKKyAgICAgIDogRm10KEZtdCksIFJlcGxhY2VtZW50cyhwYXJzZUZvcm1hdFN0cmluZyhGbXQpKSB7CisgICAgQWRhcHRlcnMucmVzZXJ2ZShQYXJhbUNvdW50KTsKKyAgfQorCisgIGZvcm1hdHZfb2JqZWN0X2Jhc2UoZm9ybWF0dl9vYmplY3RfYmFzZSBjb25zdCAmcmhzKSA9IGRlbGV0ZTsKKworICBmb3JtYXR2X29iamVjdF9iYXNlKGZvcm1hdHZfb2JqZWN0X2Jhc2UgJiZyaHMpCisgICAgICA6IEZtdChzdGQ6Om1vdmUocmhzLkZtdCkpLAorICAgICAgICBBZGFwdGVycygpLCAvLyBBZGFwdGVycyBhcmUgaW5pdGlhbGl6ZWQgYnkgZm9ybWF0dl9vYmplY3QKKyAgICAgICAgUmVwbGFjZW1lbnRzKHN0ZDo6bW92ZShyaHMuUmVwbGFjZW1lbnRzKSkgeworICAgIEFkYXB0ZXJzLnJlc2VydmUocmhzLkFkYXB0ZXJzLnNpemUoKSk7CisgIH07CisKKyAgdm9pZCBmb3JtYXQocmF3X29zdHJlYW0gJlMpIGNvbnN0IHsKKyAgICBmb3IgKGF1dG8gJlIgOiBSZXBsYWNlbWVudHMpIHsKKyAgICAgIGlmIChSLlR5cGUgPT0gUmVwbGFjZW1lbnRUeXBlOjpFbXB0eSkKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoUi5UeXBlID09IFJlcGxhY2VtZW50VHlwZTo6TGl0ZXJhbCkgeworICAgICAgICBTIDw8IFIuU3BlYzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoUi5JbmRleCA+PSBBZGFwdGVycy5zaXplKCkpIHsKKyAgICAgICAgUyA8PCBSLlNwZWM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBhdXRvIFcgPSBBZGFwdGVyc1tSLkluZGV4XTsKKworICAgICAgRm10QWxpZ24gQWxpZ24oKlcsIFIuV2hlcmUsIFIuQWxpZ24pOworICAgICAgQWxpZ24uZm9ybWF0KFMsIFIuT3B0aW9ucyk7CisgICAgfQorICB9CisgIHN0YXRpYyBzdGQ6OnZlY3RvcjxSZXBsYWNlbWVudEl0ZW0+IHBhcnNlRm9ybWF0U3RyaW5nKFN0cmluZ1JlZiBGbXQpOworCisgIHN0YXRpYyBPcHRpb25hbDxSZXBsYWNlbWVudEl0ZW0+IHBhcnNlUmVwbGFjZW1lbnRJdGVtKFN0cmluZ1JlZiBTcGVjKTsKKworICBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmcgUmVzdWx0OworICAgIHJhd19zdHJpbmdfb3N0cmVhbSBTdHJlYW0oUmVzdWx0KTsKKyAgICBTdHJlYW0gPDwgKnRoaXM7CisgICAgU3RyZWFtLmZsdXNoKCk7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIHRlbXBsYXRlIDx1bnNpZ25lZCBOPiBTbWFsbFN0cmluZzxOPiBzc3RyKCkgY29uc3QgeworICAgIFNtYWxsU3RyaW5nPE4+IFJlc3VsdDsKKyAgICByYXdfc3ZlY3Rvcl9vc3RyZWFtIFN0cmVhbShSZXN1bHQpOworICAgIFN0cmVhbSA8PCAqdGhpczsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgdGVtcGxhdGUgPHVuc2lnbmVkIE4+IG9wZXJhdG9yIFNtYWxsU3RyaW5nPE4+KCkgY29uc3QgeyByZXR1cm4gc3N0cjxOPigpOyB9CisKKyAgb3BlcmF0b3Igc3RkOjpzdHJpbmcoKSBjb25zdCB7IHJldHVybiBzdHIoKTsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPiBjbGFzcyBmb3JtYXR2X29iamVjdCA6IHB1YmxpYyBmb3JtYXR2X29iamVjdF9iYXNlIHsKKyAgLy8gU3RvcmFnZSBmb3IgdGhlIHBhcmFtZXRlciBhZGFwdGVycy4gIFNpbmNlIHRoZSBiYXNlIGNsYXNzIGVyYXNlcyB0aGUgdHlwZQorICAvLyBvZiB0aGUgcGFyYW1ldGVycywgd2UgaGF2ZSB0byBvd24gdGhlIHN0b3JhZ2UgZm9yIHRoZSBwYXJhbWV0ZXJzIGhlcmUsIGFuZAorICAvLyBoYXZlIHRoZSBiYXNlIGNsYXNzIHN0b3JlIHR5cGUtZXJhc2VkIHBvaW50ZXJzIGludG8gdGhpcyB0dXBsZS4KKyAgVHVwbGUgUGFyYW1ldGVyczsKKworcHVibGljOgorICBmb3JtYXR2X29iamVjdChTdHJpbmdSZWYgRm10LCBUdXBsZSAmJlBhcmFtcykKKyAgICAgIDogZm9ybWF0dl9vYmplY3RfYmFzZShGbXQsIHN0ZDo6dHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlKSwKKyAgICAgICAgUGFyYW1ldGVycyhzdGQ6Om1vdmUoUGFyYW1zKSkgeworICAgIEFkYXB0ZXJzID0gYXBwbHlfdHVwbGUoY3JlYXRlX2FkYXB0ZXJzKCksIFBhcmFtZXRlcnMpOworICB9CisKKyAgZm9ybWF0dl9vYmplY3QoZm9ybWF0dl9vYmplY3QgY29uc3QgJnJocykgPSBkZWxldGU7CisKKyAgZm9ybWF0dl9vYmplY3QoZm9ybWF0dl9vYmplY3QgJiZyaHMpCisgICAgICA6IGZvcm1hdHZfb2JqZWN0X2Jhc2Uoc3RkOjptb3ZlKHJocykpLAorICAgICAgICBQYXJhbWV0ZXJzKHN0ZDo6bW92ZShyaHMuUGFyYW1ldGVycykpIHsKKyAgICBBZGFwdGVycyA9IGFwcGx5X3R1cGxlKGNyZWF0ZV9hZGFwdGVycygpLCBQYXJhbWV0ZXJzKTsKKyAgfQorfTsKKworLy8gXGJyaWVmIEZvcm1hdCB0ZXh0IGdpdmVuIGEgZm9ybWF0IHN0cmluZyBhbmQgcmVwbGFjZW1lbnQgcGFyYW1ldGVycy4KKy8vCisvLyA9PT1HZW5lcmFsIERlc2NyaXB0aW9uPT09CisvLworLy8gRm9ybWF0cyB0ZXh0dWFsIG91dHB1dC4gIGBGbXRgIGlzIGEgc3RyaW5nIGNvbnNpc3Rpbmcgb2Ygb25lIG9yIG1vcmUKKy8vIHJlcGxhY2VtZW50IHNlcXVlbmNlcyB3aXRoIHRoZSBmb2xsb3dpbmcgZ3JhbW1hcjoKKy8vCisvLyByZXBfZmllbGQgOjo9ICJ7IiBbaW5kZXhdIFsiLCIgbGF5b3V0XSBbIjoiIGZvcm1hdF0gIn0iCisvLyBpbmRleCAgICAgOjo9IDxub24tbmVnYXRpdmUgaW50ZWdlcj4KKy8vIGxheW91dCAgICA6Oj0gW1tbY2hhcl1sb2Ndd2lkdGhdCisvLyBmb3JtYXQgICAgOjo9IDxhbnkgc3RyaW5nIG5vdCBjb250YWluaW5nICJ7IiBvciAifSI+CisvLyBjaGFyICAgICAgOjo9IDxhbnkgY2hhcmFjdGVyIGV4Y2VwdCAieyIgb3IgIn0iPgorLy8gbG9jICAgICAgIDo6PSAiLSIgfCAiPSIgfCAiKyIKKy8vIHdpZHRoICAgICA6Oj0gPHBvc2l0aXZlIGludGVnZXI+CisvLworLy8gaW5kZXggICAtIEEgbm9uLW5lZ2F0aXZlIGludGVnZXIgc3BlY2lmeWluZyB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gaW4gdGhlCisvLyAgICAgICAgICAgcGFyYW1ldGVyIHBhY2sgdG8gcHJpbnQuICBBbnkgb3RoZXIgdmFsdWUgaXMgaW52YWxpZC4KKy8vIGxheW91dCAgLSBBIHN0cmluZyBjb250cm9sbGluZyBob3cgdGhlIGZpZWxkIGlzIGxhaWQgb3V0IHdpdGhpbiB0aGUgYXZhaWxhYmxlCisvLyAgICAgICAgICAgc3BhY2UuCisvLyBmb3JtYXQgIC0gQSB0eXBlLWRlcGVuZGVudCBzdHJpbmcgdXNlZCB0byBwcm92aWRlIGFkZGl0aW9uYWwgb3B0aW9ucyB0bworLy8gICAgICAgICAgIHRoZSBmb3JtYXR0aW5nIG9wZXJhdGlvbi4gIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZQorLy8gICAgICAgICAgIHZhcmlvdXMgaW5kaXZpZHVhbCBmb3JtYXQgcHJvdmlkZXJzIGZvciBwZXItdHlwZSBvcHRpb25zLgorLy8gY2hhciAgICAtIFRoZSBwYWRkaW5nIGNoYXJhY3Rlci4gIERlZmF1bHRzIHRvICcgJyAoc3BhY2UpLiAgT25seSB2YWxpZCBpZgorLy8gICAgICAgICAgIGBsb2NgIGlzIGFsc28gc3BlY2lmaWVkLgorLy8gbG9jICAgICAtIFdoZXJlIHRvIHByaW50IHRoZSBmb3JtYXR0ZWQgdGV4dCB3aXRoaW4gdGhlIGZpZWxkLiAgT25seSB2YWxpZCBpZgorLy8gICAgICAgICAgIGB3aWR0aGAgaXMgYWxzbyBzcGVjaWZpZWQuCisvLyAgICAgICAgICAgJy0nIDogVGhlIGZpZWxkIGlzIGxlZnQgYWxpZ25lZCB3aXRoaW4gdGhlIGF2YWlsYWJsZSBzcGFjZS4KKy8vICAgICAgICAgICAnPScgOiBUaGUgZmllbGQgaXMgY2VudGVyZWQgd2l0aGluIHRoZSBhdmFpbGFibGUgc3BhY2UuCisvLyAgICAgICAgICAgJysnIDogVGhlIGZpZWxkIGlzIHJpZ2h0IGFsaWduZWQgd2l0aGluIHRoZSBhdmFpbGFibGUgc3BhY2UgKHRoaXMKKy8vICAgICAgICAgICAgICAgICBpcyB0aGUgZGVmYXVsdCkuCisvLyB3aWR0aCAgIC0gVGhlIHdpZHRoIG9mIHRoZSBmaWVsZCB3aXRoaW4gd2hpY2ggdG8gcHJpbnQgdGhlIGZvcm1hdHRlZCB0ZXh0LgorLy8gICAgICAgICAgIElmIHRoaXMgaXMgbGVzcyB0aGFuIHRoZSByZXF1aXJlZCBsZW5ndGggdGhlbiB0aGUgYGNoYXJgIGFuZCBgbG9jYAorLy8gICAgICAgICAgIGZpZWxkcyBhcmUgaWdub3JlZCwgYW5kIHRoZSBmaWVsZCBpcyBwcmludGVkIHdpdGggbm8gbGVhZGluZyBvcgorLy8gICAgICAgICAgIHRyYWlsaW5nIHBhZGRpbmcuICBJZiB0aGlzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcmVxdWlyZWQgbGVuZ3RoLAorLy8gICAgICAgICAgIHRoZW4gdGhlIHRleHQgaXMgb3V0cHV0IGFjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgYGxvY2AsIGFuZCBwYWRkZWQKKy8vICAgICAgICAgICBhcyBhcHByb3ByaWF0ZSBvbiB0aGUgbGVmdCBhbmQvb3IgcmlnaHQgYnkgYGNoYXJgLgorLy8KKy8vID09PVNwZWNpYWwgQ2hhcmFjdGVycz09PQorLy8KKy8vIFRoZSBjaGFyYWN0ZXJzICd7JyBhbmQgJ30nIGFyZSByZXNlcnZlZCBhbmQgY2Fubm90IGFwcGVhciBhbnl3aGVyZSB3aXRoaW4gYQorLy8gcmVwbGFjZW1lbnQgc2VxdWVuY2UuICBPdXRzaWRlIG9mIGEgcmVwbGFjZW1lbnQgc2VxdWVuY2UsIGluIG9yZGVyIHRvIHByaW50CisvLyBhIGxpdGVyYWwgJ3snIG9yICd9JyBpdCBtdXN0IGJlIGRvdWJsZWQgLS0gInt7IiB0byBwcmludCBhIGxpdGVyYWwgJ3snIGFuZAorLy8gIn19IiB0byBwcmludCBhIGxpdGVyYWwgJ30nLgorLy8KKy8vID09PVBhcmFtZXRlciBJbmRleGluZz09PQorLy8gYGluZGV4YCBzcGVjaWZpZXMgdGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgaW4gdGhlIHBhcmFtZXRlciBwYWNrIHRvIGZvcm1hdAorLy8gaW50byB0aGUgb3V0cHV0LiAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHJlZmVyIHRvIHRoZSBzYW1lIHBhcmFtZXRlcgorLy8gaW5kZXggbXVsdGlwbGUgdGltZXMgaW4gYSBnaXZlbiBmb3JtYXQgc3RyaW5nLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0bworLy8gb3V0cHV0IHRoZSBzYW1lIHZhbHVlIG11bHRpcGxlIHRpbWVzIHdpdGhvdXQgcGFzc2luZyBpdCBtdWx0aXBsZSB0aW1lcyB0byB0aGUKKy8vIGZ1bmN0aW9uLiBGb3IgZXhhbXBsZToKKy8vCisvLyAgIGZvcm1hdHYoInswfSB7MX0gezB9IiwgImEiLCAiYmIiKQorLy8KKy8vIHdvdWxkIHlpZWxkIHRoZSBzdHJpbmcgImFiYmEiLiAgVGhpcyBjYW4gYmUgY29udmVuaWVudCB3aGVuIGl0IGlzIGV4cGVuc2l2ZQorLy8gdG8gY29tcHV0ZSB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciwgYW5kIHlvdSB3b3VsZCBvdGhlcndpc2UgaGF2ZSBoYWQgdG8KKy8vIHNhdmUgaXQgdG8gYSB0ZW1wb3JhcnkuCisvLworLy8gPT09Rm9ybWF0dGVyIFNlYXJjaD09PQorLy8KKy8vIEZvciBhIGdpdmVuIHBhcmFtZXRlciBvZiB0eXBlIFQsIHRoZSBmb2xsb3dpbmcgc3RlcHMgYXJlIGV4ZWN1dGVkIGluIG9yZGVyCisvLyB1bnRpbCBhIG1hdGNoIGlzIGZvdW5kOgorLy8KKy8vICAgMS4gSWYgdGhlIHBhcmFtZXRlciBpcyBvZiBjbGFzcyB0eXBlLCBhbmQgaW5oZXJpdHMgZnJvbSBmb3JtYXRfYWRhcHRlciwKKy8vICAgICAgVGhlbiBmb3JtYXQoKSBpcyBpbnZva2VkIG9uIGl0IHRvIHByb2R1Y2UgdGhlIGZvcm1hdHRlZCBvdXRwdXQuICBUaGUKKy8vICAgICAgaW1wbGVtZW50YXRpb24gc2hvdWxkIHdyaXRlIHRoZSBmb3JtYXR0ZWQgdGV4dCBpbnRvIGBTdHJlYW1gLgorLy8gICAyLiBJZiB0aGVyZSBpcyBhIHN1aXRhYmxlIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG9mIGZvcm1hdF9wcm92aWRlcjw+CisvLyAgICAgIGZvciB0eXBlIFQgY29udGFpbmluZyBhIG1ldGhvZCB3aG9zZSBzaWduYXR1cmUgaXM6CisvLyAgICAgIHZvaWQgZm9ybWF0KGNvbnN0IFQgJk9iaiwgcmF3X29zdHJlYW0gJlN0cmVhbSwgU3RyaW5nUmVmIE9wdGlvbnMpCisvLyAgICAgIFRoZW4gdGhpcyBtZXRob2QgaXMgaW52b2tlZCBhcyBkZXNjcmliZWQgaW4gU3RlcCAxLgorLy8KKy8vIElmIGEgbWF0Y2ggY2Fubm90IGJlIGZvdW5kIHRocm91Z2ggZWl0aGVyIG9mIHRoZSBhYm92ZSBtZXRob2RzLCBhIGNvbXBpbGVyCisvLyBlcnJvciBpcyBnZW5lcmF0ZWQuCisvLworLy8gPT09SW52YWxpZCBGb3JtYXQgU3RyaW5nIEhhbmRsaW5nPT09CisvLworLy8gSW4gdGhlIGNhc2Ugb2YgYSBmb3JtYXQgc3RyaW5nIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSBncmFtbWFyIGRlc2NyaWJlZAorLy8gYWJvdmUsIHRoZSBvdXRwdXQgaXMgdW5kZWZpbmVkLiAgV2l0aCBhc3NlcnRzIGVuYWJsZWQsIExMVk0gd2lsbCB0cmlnZ2VyIGFuCisvLyBhc3NlcnRpb24uICBPdGhlcndpc2UsIGl0IHdpbGwgdHJ5IHRvIGRvIHNvbWV0aGluZyByZWFzb25hYmxlLCBidXQgaW4gZ2VuZXJhbAorLy8gdGhlIGRldGFpbHMgb2Ygd2hhdCB0aGF0IGlzIGFyZSB1bmRlZmluZWQuCisvLwordGVtcGxhdGUgPHR5cGVuYW1lLi4uIFRzPgoraW5saW5lIGF1dG8gZm9ybWF0dihjb25zdCBjaGFyICpGbXQsIFRzICYmLi4uIFZhbHMpIC0+IGZvcm1hdHZfb2JqZWN0PGRlY2x0eXBlKAorICAgIHN0ZDo6bWFrZV90dXBsZShkZXRhaWw6OmJ1aWxkX2Zvcm1hdF9hZGFwdGVyKHN0ZDo6Zm9yd2FyZDxUcz4oVmFscykpLi4uKSk+IHsKKyAgdXNpbmcgUGFyYW1UdXBsZSA9IGRlY2x0eXBlKAorICAgICAgc3RkOjptYWtlX3R1cGxlKGRldGFpbDo6YnVpbGRfZm9ybWF0X2FkYXB0ZXIoc3RkOjpmb3J3YXJkPFRzPihWYWxzKSkuLi4pKTsKKyAgcmV0dXJuIGZvcm1hdHZfb2JqZWN0PFBhcmFtVHVwbGU+KAorICAgICAgRm10LAorICAgICAgc3RkOjptYWtlX3R1cGxlKGRldGFpbDo6YnVpbGRfZm9ybWF0X2FkYXB0ZXIoc3RkOjpmb3J3YXJkPFRzPihWYWxzKSkuLi4pKTsKK30KKworLy8gQWxsb3cgYSBmb3JtYXR2X29iamVjdCB0byBiZSBmb3JtYXR0ZWQgKG5vIG9wdGlvbnMgc3VwcG9ydGVkKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgZm9ybWF0X3Byb3ZpZGVyPGZvcm1hdHZfb2JqZWN0PFQ+PiB7CisgIHN0YXRpYyB2b2lkIGZvcm1hdChjb25zdCBmb3JtYXR2X29iamVjdDxUPiAmViwgcmF3X29zdHJlYW0gJk9TLCBTdHJpbmdSZWYpIHsKKyAgICBPUyA8PCBWOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0ZPUk1BVFZBUklBRElDX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXRWYXJpYWRpY0RldGFpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXRWYXJpYWRpY0RldGFpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjYwNDYyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Zvcm1hdFZhcmlhZGljRGV0YWlscy5oCkBAIC0wLDAgKzEsMTEyIEBACisvLz09PS0gRm9ybWF0VmFyaWFkaWNEZXRhaWxzLmggLSBIZWxwZXJzIGZvciBGb3JtYXRWYXJpYWRpYy5oIC0tLS0qLSBDKystKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9GT1JNQVRWQVJJQURJQ19ERVRBSUxTX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0ZPUk1BVFZBUklBRElDX0RFVEFJTFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGxsdm0gewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEVuYWJsZSA9IHZvaWQ+IHN0cnVjdCBmb3JtYXRfcHJvdmlkZXIge307CisKK25hbWVzcGFjZSBkZXRhaWwgeworY2xhc3MgZm9ybWF0X2FkYXB0ZXIgeworcHJvdGVjdGVkOgorICB2aXJ0dWFsIH5mb3JtYXRfYWRhcHRlcigpIHt9CisKK3B1YmxpYzoKKyAgdmlydHVhbCB2b2lkIGZvcm1hdChyYXdfb3N0cmVhbSAmUywgU3RyaW5nUmVmIE9wdGlvbnMpID0gMDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBwcm92aWRlcl9mb3JtYXRfYWRhcHRlciA6IHB1YmxpYyBmb3JtYXRfYWRhcHRlciB7CisgIFQgSXRlbTsKKworcHVibGljOgorICBleHBsaWNpdCBwcm92aWRlcl9mb3JtYXRfYWRhcHRlcihUICYmSXRlbSkgOiBJdGVtKHN0ZDo6Zm9yd2FyZDxUPihJdGVtKSkge30KKworICB2b2lkIGZvcm1hdChsbHZtOjpyYXdfb3N0cmVhbSAmUywgU3RyaW5nUmVmIE9wdGlvbnMpIG92ZXJyaWRlIHsKKyAgICBmb3JtYXRfcHJvdmlkZXI8dHlwZW5hbWUgc3RkOjpkZWNheTxUPjo6dHlwZT46OmZvcm1hdChJdGVtLCBTLCBPcHRpb25zKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIG1pc3NpbmdfZm9ybWF0X2FkYXB0ZXI7CisKKy8vIFRlc3QgaWYgZm9ybWF0X3Byb3ZpZGVyPFQ+IGlzIGRlZmluZWQgb24gVCBhbmQgY29udGFpbnMgYSBtZW1iZXIgZnVuY3Rpb24KKy8vIHdpdGggdGhlIHNpZ25hdHVyZToKKy8vICAgc3RhdGljIHZvaWQgZm9ybWF0KGNvbnN0IFQmLCByYXdfc3RyZWFtICYsIFN0cmluZ1JlZik7CisvLwordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIGhhc19Gb3JtYXRQcm92aWRlciB7CitwdWJsaWM6CisgIHVzaW5nIERlY2F5ZWQgPSB0eXBlbmFtZSBzdGQ6OmRlY2F5PFQ+Ojp0eXBlOworICB0eXBlZGVmIHZvaWQgKCpTaWduYXR1cmVfZm9ybWF0KShjb25zdCBEZWNheWVkICYsIGxsdm06OnJhd19vc3RyZWFtICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHN0YXRpYyBjaGFyIHRlc3QoU2FtZVR5cGU8U2lnbmF0dXJlX2Zvcm1hdCwgJlU6OmZvcm1hdD4gKik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IHN0YXRpYyBkb3VibGUgdGVzdCguLi4pOworCisgIHN0YXRpYyBib29sIGNvbnN0IHZhbHVlID0KKyAgICAgIChzaXplb2YodGVzdDxsbHZtOjpmb3JtYXRfcHJvdmlkZXI8RGVjYXllZD4+KG51bGxwdHIpKSA9PSAxKTsKK307CisKKy8vIFNpbXBsZSB0ZW1wbGF0ZSB0aGF0IGRlY2lkZXMgd2hldGhlciBhIHR5cGUgVCBzaG91bGQgdXNlIHRoZSBtZW1iZXItZnVuY3Rpb24KKy8vIGJhc2VkIGZvcm1hdCgpIGludm9jYXRpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCB1c2VzX2Zvcm1hdF9tZW1iZXIKKyAgICA6IHB1YmxpYyBzdGQ6OmludGVncmFsX2NvbnN0YW50PAorICAgICAgICAgIGJvb2wsCisgICAgICAgICAgc3RkOjppc19iYXNlX29mPGZvcm1hdF9hZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGU+Ojp2YWx1ZT4ge307CisKKy8vIFNpbXBsZSB0ZW1wbGF0ZSB0aGF0IGRlY2lkZXMgd2hldGhlciBhIHR5cGUgVCBzaG91bGQgdXNlIHRoZSBmb3JtYXRfcHJvdmlkZXIKKy8vIGJhc2VkIGZvcm1hdCgpIGludm9jYXRpb24uICBUaGUgbWVtYmVyIGZ1bmN0aW9uIHRha2VzIHByaW9yaXR5LCBzbyB0aGlzIHRlc3QKKy8vIHdpbGwgb25seSBiZSB0cnVlIGlmIHRoZXJlIGlzIG5vdCBBTFNPIGEgZm9ybWF0IG1lbWJlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IHVzZXNfZm9ybWF0X3Byb3ZpZGVyCisgICAgOiBwdWJsaWMgc3RkOjppbnRlZ3JhbF9jb25zdGFudDwKKyAgICAgICAgICBib29sLCAhdXNlc19mb3JtYXRfbWVtYmVyPFQ+Ojp2YWx1ZSAmJiBoYXNfRm9ybWF0UHJvdmlkZXI8VD46OnZhbHVlPiB7Cit9OworCisvLyBTaW1wbGUgdGVtcGxhdGUgdGhhdCBkZWNpZGVzIHdoZXRoZXIgYSB0eXBlIFQgaGFzIG5laXRoZXIgYSBtZW1iZXItZnVuY3Rpb24KKy8vIG5vciBmb3JtYXRfcHJvdmlkZXIgYmFzZWQgaW1wbGVtZW50YXRpb24gdGhhdCBpdCBjYW4gdXNlLiAgTW9zdGx5IHVzZWQgc28KKy8vIHRoYXQgdGhlIGNvbXBpbGVyIHNwaXRzIG91dCBhIG5pY2UgZGlhZ25vc3RpYyB3aGVuIGEgdHlwZSB3aXRoIG5vIGZvcm1hdAorLy8gaW1wbGVtZW50YXRpb24gY2FuIGJlIGxvY2F0ZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCB1c2VzX21pc3NpbmdfcHJvdmlkZXIKKyAgICA6IHB1YmxpYyBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdXNlc19mb3JtYXRfbWVtYmVyPFQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF1c2VzX2Zvcm1hdF9wcm92aWRlcjxUPjo6dmFsdWU+IHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHVzZXNfZm9ybWF0X21lbWJlcjxUPjo6dmFsdWUsIFQ+Ojp0eXBlCitidWlsZF9mb3JtYXRfYWRhcHRlcihUICYmSXRlbSkgeworICByZXR1cm4gc3RkOjpmb3J3YXJkPFQ+KEl0ZW0pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHVzZXNfZm9ybWF0X3Byb3ZpZGVyPFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyX2Zvcm1hdF9hZGFwdGVyPFQ+Pjo6dHlwZQorYnVpbGRfZm9ybWF0X2FkYXB0ZXIoVCAmJkl0ZW0pIHsKKyAgcmV0dXJuIHByb3ZpZGVyX2Zvcm1hdF9hZGFwdGVyPFQ+KHN0ZDo6Zm9yd2FyZDxUPihJdGVtKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8dXNlc19taXNzaW5nX3Byb3ZpZGVyPFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdfZm9ybWF0X2FkYXB0ZXI8VD4+Ojp0eXBlCitidWlsZF9mb3JtYXRfYWRhcHRlcihUICYmSXRlbSkgeworICByZXR1cm4gbWlzc2luZ19mb3JtYXRfYWRhcHRlcjxUPigpOworfQorfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXR0ZWRTdHJlYW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXR0ZWRTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTEzNWNkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Zvcm1hdHRlZFN0cmVhbS5oCkBAIC0wLDAgKzEsMTYyIEBACisvLz09PS0tIGxsdm0vU3VwcG9ydC9Gb3JtYXR0ZWRTdHJlYW0uaCAtIEZvcm1hdHRlZCBzdHJlYW1zIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyByYXdfb3N0cmVhbSBpbXBsZW1lbnRhdGlvbnMgZm9yIHN0cmVhbXMgdG8gZG8KKy8vIHRoaW5ncyBsaWtlIHByZXR0eS1wcmludCBjb21tZW50cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9GT1JNQVRURURTVFJFQU1fSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfRk9STUFUVEVEU1RSRUFNX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAtIEEgcmF3X29zdHJlYW0gdGhhdCB3cmFwcyBhbm90aGVyIG9uZSBhbmQga2VlcHMgdHJhY2sKKy8vLyBvZiBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb24sIGFsbG93aW5nIHBhZGRpbmcgb3V0IHRvIHNwZWNpZmljIGNvbHVtbgorLy8vIGJvdW5kYXJpZXMgYW5kIHF1ZXJ5aW5nIHRoZSBudW1iZXIgb2YgbGluZXMgd3JpdHRlbiB0byB0aGUgc3RyZWFtLgorLy8vCitjbGFzcyBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gOiBwdWJsaWMgcmF3X29zdHJlYW0geworICAvLy8gVGhlU3RyZWFtIC0gVGhlIHJlYWwgc3RyZWFtIHdlIG91dHB1dCB0by4gV2Ugc2V0IGl0IHRvIGJlCisgIC8vLyB1bmJ1ZmZlcmVkLCBzaW5jZSB3ZSdyZSBhbHJlYWR5IGRvaW5nIG91ciBvd24gYnVmZmVyaW5nLgorICAvLy8KKyAgcmF3X29zdHJlYW0gKlRoZVN0cmVhbTsKKworICAvLy8gUG9zaXRpb24gLSBUaGUgY3VycmVudCBvdXRwdXQgY29sdW1uIGFuZCBsaW5lIG9mIHRoZSBkYXRhIHRoYXQncworICAvLy8gYmVlbiBmbHVzaGVkIGFuZCB0aGUgcG9ydGlvbiBvZiB0aGUgYnVmZmVyIHRoYXQncyBiZWVuCisgIC8vLyBzY2FubmVkLiAgVGhlIGxpbmUgYW5kIGNvbHVtbiBzY2hlbWUgaXMgemVyby1iYXNlZC4KKyAgLy8vCisgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+IFBvc2l0aW9uOworCisgIC8vLyBTY2FubmVkIC0gVGhpcyBwb2ludHMgdG8gb25lIHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZQorICAvLy8gYnVmZmVyIHdlJ3ZlIHNjYW5uZWQuCisgIC8vLworICBjb25zdCBjaGFyICpTY2FubmVkOworCisgIHZvaWQgd3JpdGVfaW1wbChjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplKSBvdmVycmlkZTsKKworICAvLy8gY3VycmVudF9wb3MgLSBSZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBzdHJlYW0sCisgIC8vLyBub3QgY291bnRpbmcgdGhlIGJ5dGVzIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyLgorICB1aW50NjRfdCBjdXJyZW50X3BvcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAvLyBPdXIgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtIGlzIGFsbCB0aGUgY29udGVudHMgd2hpY2ggaGF2ZSBiZWVuCisgICAgLy8gd3JpdHRlbiB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0gKCpub3QqIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZQorICAgIC8vIHVuZGVybHlpbmcgc3RyZWFtKS4KKyAgICByZXR1cm4gVGhlU3RyZWFtLT50ZWxsKCk7CisgIH0KKworICAvLy8gQ29tcHV0ZVBvc2l0aW9uIC0gRXhhbWluZSB0aGUgZ2l2ZW4gb3V0cHV0IGJ1ZmZlciBhbmQgZmlndXJlIG91dCB0aGUgbmV3CisgIC8vLyBwb3NpdGlvbiBhZnRlciBvdXRwdXQuCisgIC8vLworICB2b2lkIENvbXB1dGVQb3NpdGlvbihjb25zdCBjaGFyICpQdHIsIHNpemVfdCBzaXplKTsKKworICB2b2lkIHNldFN0cmVhbShyYXdfb3N0cmVhbSAmU3RyZWFtKSB7CisgICAgcmVsZWFzZVN0cmVhbSgpOworCisgICAgVGhlU3RyZWFtID0gJlN0cmVhbTsKKworICAgIC8vIFRoaXMgZm9ybWF0dGVkX3Jhd19vc3RyZWFtIGluaGVyaXRzIGZyb20gcmF3X29zdHJlYW0sIHNvIGl0J2xsIGRvIGl0cworICAgIC8vIG93biBidWZmZXJpbmcsIGFuZCBpdCBkb2Vzbid0IG5lZWQgb3Igd2FudCBUaGVTdHJlYW0gdG8gZG8gYW5vdGhlcgorICAgIC8vIGxheWVyIG9mIGJ1ZmZlcmluZyB1bmRlcm5lYXRoLiBSZXNpemUgdGhlIGJ1ZmZlciB0byB3aGF0IFRoZVN0cmVhbQorICAgIC8vIGhhZCBiZWVuIHVzaW5nLCBhbmQgdGVsbCBUaGVTdHJlYW0gbm90IHRvIGRvIGl0cyBvd24gYnVmZmVyaW5nLgorICAgIGlmIChzaXplX3QgQnVmZmVyU2l6ZSA9IFRoZVN0cmVhbS0+R2V0QnVmZmVyU2l6ZSgpKQorICAgICAgU2V0QnVmZmVyU2l6ZShCdWZmZXJTaXplKTsKKyAgICBlbHNlCisgICAgICBTZXRVbmJ1ZmZlcmVkKCk7CisgICAgVGhlU3RyZWFtLT5TZXRVbmJ1ZmZlcmVkKCk7CisKKyAgICBTY2FubmVkID0gbnVsbHB0cjsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gLSBPcGVuIHRoZSBzcGVjaWZpZWQgZmlsZSBmb3IKKyAgLy8vIHdyaXRpbmcuIElmIGFuIGVycm9yIG9jY3VycywgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIGlzCisgIC8vLyBwdXQgaW50byBFcnJvckluZm8sIGFuZCB0aGUgc3RyZWFtIHNob3VsZCBiZSBpbW1lZGlhdGVseQorICAvLy8gZGVzdHJveWVkOyB0aGUgc3RyaW5nIHdpbGwgYmUgZW1wdHkgaWYgbm8gZXJyb3Igb2NjdXJyZWQuCisgIC8vLworICAvLy8gQXMgYSBzaWRlIGVmZmVjdCwgdGhlIGdpdmVuIFN0cmVhbSBpcyBzZXQgdG8gYmUgVW5idWZmZXJlZC4KKyAgLy8vIFRoaXMgaXMgYmVjYXVzZSBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gZG9lcyBpdHMgb3duIGJ1ZmZlcmluZywKKyAgLy8vIHNvIGl0IGRvZXNuJ3Qgd2FudCBhbm90aGVyIGxheWVyIG9mIGJ1ZmZlcmluZyB0byBiZSBoYXBwZW5pbmcKKyAgLy8vIHVuZGVybmVhdGggaXQuCisgIC8vLworICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0ocmF3X29zdHJlYW0gJlN0cmVhbSkKKyAgICAgIDogVGhlU3RyZWFtKG51bGxwdHIpLCBQb3NpdGlvbigwLCAwKSB7CisgICAgc2V0U3RyZWFtKFN0cmVhbSk7CisgIH0KKyAgZXhwbGljaXQgZm9ybWF0dGVkX3Jhd19vc3RyZWFtKCkgOiBUaGVTdHJlYW0obnVsbHB0ciksIFBvc2l0aW9uKDAsIDApIHsKKyAgICBTY2FubmVkID0gbnVsbHB0cjsKKyAgfQorCisgIH5mb3JtYXR0ZWRfcmF3X29zdHJlYW0oKSBvdmVycmlkZSB7CisgICAgZmx1c2goKTsKKyAgICByZWxlYXNlU3RyZWFtKCk7CisgIH0KKworICAvLy8gUGFkVG9Db2x1bW4gLSBBbGlnbiB0aGUgb3V0cHV0IHRvIHNvbWUgY29sdW1uIG51bWJlci4gIElmIHRoZSBjdXJyZW50CisgIC8vLyBjb2x1bW4gaXMgYWxyZWFkeSBlcXVhbCB0byBvciBtb3JlIHRoYW4gTmV3Q29sLCBQYWRUb0NvbHVtbiBpbnNlcnRzIG9uZQorICAvLy8gc3BhY2UuCisgIC8vLworICAvLy8gXHBhcmFtIE5ld0NvbCAtIFRoZSBjb2x1bW4gdG8gbW92ZSB0by4KKyAgZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZQYWRUb0NvbHVtbih1bnNpZ25lZCBOZXdDb2wpOworCisgIC8vLyBnZXRDb2x1bW4gLSBSZXR1cm4gdGhlIGNvbHVtbiBudW1iZXIKKyAgdW5zaWduZWQgZ2V0Q29sdW1uKCkgeyByZXR1cm4gUG9zaXRpb24uZmlyc3Q7IH0KKworICAvLy8gZ2V0TGluZSAtIFJldHVybiB0aGUgbGluZSBudW1iZXIKKyAgdW5zaWduZWQgZ2V0TGluZSgpIHsgcmV0dXJuIFBvc2l0aW9uLnNlY29uZDsgfQorCisgIHJhd19vc3RyZWFtICZyZXNldENvbG9yKCkgb3ZlcnJpZGUgeworICAgIFRoZVN0cmVhbS0+cmVzZXRDb2xvcigpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHJhd19vc3RyZWFtICZyZXZlcnNlQ29sb3IoKSBvdmVycmlkZSB7CisgICAgVGhlU3RyZWFtLT5yZXZlcnNlQ29sb3IoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICByYXdfb3N0cmVhbSAmY2hhbmdlQ29sb3IoZW51bSBDb2xvcnMgQ29sb3IsIGJvb2wgQm9sZCwgYm9vbCBCRykgb3ZlcnJpZGUgeworICAgIFRoZVN0cmVhbS0+Y2hhbmdlQ29sb3IoQ29sb3IsIEJvbGQsIEJHKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBib29sIGlzX2Rpc3BsYXllZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gVGhlU3RyZWFtLT5pc19kaXNwbGF5ZWQoKTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIHJlbGVhc2VTdHJlYW0oKSB7CisgICAgLy8gVHJhbnNmZXIgdGhlIGJ1ZmZlciBzZXR0aW5ncyBmcm9tIHRoaXMgcmF3X29zdHJlYW0gYmFjayB0byB0aGUgdW5kZXJseWluZworICAgIC8vIHN0cmVhbS4KKyAgICBpZiAoIVRoZVN0cmVhbSkKKyAgICAgIHJldHVybjsKKyAgICBpZiAoc2l6ZV90IEJ1ZmZlclNpemUgPSBHZXRCdWZmZXJTaXplKCkpCisgICAgICBUaGVTdHJlYW0tPlNldEJ1ZmZlclNpemUoQnVmZmVyU2l6ZSk7CisgICAgZWxzZQorICAgICAgVGhlU3RyZWFtLT5TZXRVbmJ1ZmZlcmVkKCk7CisgIH0KK307CisKKy8vLyBmb3V0cygpIC0gVGhpcyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgZm9ybWF0dGVkX3Jhd19vc3RyZWFtIGZvcgorLy8vIHN0YW5kYXJkIG91dHB1dC4gIFVzZSBpdCBsaWtlOiBmb3V0cygpIDw8ICJmb28iIDw8ICJiYXIiOworZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZmb3V0cygpOworCisvLy8gZmVycnMoKSAtIFRoaXMgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSBmb3IKKy8vLyBzdGFuZGFyZCBlcnJvci4gIFVzZSBpdCBsaWtlOiBmZXJycygpIDw8ICJmb28iIDw8ICJiYXIiOworZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZmZXJycygpOworCisvLy8gZmRiZ3MoKSAtIFRoaXMgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSBmb3IKKy8vLyBkZWJ1ZyBvdXRwdXQuICBVc2UgaXQgbGlrZTogZmRiZ3MoKSA8PCAiZm9vIiA8PCAiYmFyIjsKK2Zvcm1hdHRlZF9yYXdfb3N0cmVhbSAmZmRiZ3MoKTsKKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9HZW5lcmljRG9tVHJlZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0dlbmVyaWNEb21UcmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhYWM2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9HZW5lcmljRG9tVHJlZS5oCkBAIC0wLDAgKzEsOTA3IEBACisvLz09PS0gR2VuZXJpY0RvbVRyZWUuaCAtIEdlbmVyaWMgZG9taW5hdG9yIHRyZWVzIGZvciBncmFwaHMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8KKy8vLyBUaGlzIGZpbGUgZGVmaW5lcyBhIHNldCBvZiB0ZW1wbGF0ZXMgdGhhdCBlZmZpY2llbnRseSBjb21wdXRlIGEgZG9taW5hdG9yCisvLy8gdHJlZSBvdmVyIGEgZ2VuZXJpYyBncmFwaC4gVGhpcyBpcyB1c2VkIHR5cGljYWxseSBpbiBMTFZNIGZvciBmYXN0CisvLy8gZG9taW5hbmNlIHF1ZXJpZXMgb24gdGhlIENGRywgYnV0IGlzIGZ1bGx5IGdlbmVyaWMgdy5yLnQuIHRoZSB1bmRlcmx5aW5nCisvLy8gZ3JhcGggdHlwZXMuCisvLy8KKy8vLyBVbmxpa2UgQURULyogZ3JhcGggYWxnb3JpdGhtcywgZ2VuZXJpYyBkb21pbmF0b3IgdHJlZSBoYXMgbW9yZSByZXF1aXJlbWVudHMKKy8vLyBvbiB0aGUgZ3JhcGgncyBOb2RlUmVmLiBUaGUgTm9kZVJlZiBzaG91bGQgYmUgYSBwb2ludGVyIGFuZCwKKy8vLyBOb2RlUmVmLT5nZXRQYXJlbnQoKSBtdXN0IHJldHVybiB0aGUgcGFyZW50IG5vZGUgdGhhdCBpcyBhbHNvIGEgcG9pbnRlci4KKy8vLworLy8vIEZJWE1FOiBNYXliZSBHZW5lcmljRG9tVHJlZSBuZWVkcyBhIFRyZWVUcmFpdHMsIGluc3RlYWQgb2YgR3JhcGhUcmFpdHMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0dFTkVSSUNET01UUkVFX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0dFTkVSSUNET01UUkVFX0gKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVQsIGJvb2wgSXNQb3N0RG9tPgorY2xhc3MgRG9taW5hdG9yVHJlZUJhc2U7CisKK25hbWVzcGFjZSBEb21UcmVlQnVpbGRlciB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRG9tVHJlZVQ+CitzdHJ1Y3QgU2VtaU5DQUluZm87Cit9ICAvLyBuYW1lc3BhY2UgRG9tVHJlZUJ1aWxkZXIKKworLy8vIFxicmllZiBCYXNlIGNsYXNzIGZvciB0aGUgYWN0dWFsIGRvbWluYXRvciB0cmVlIG5vZGUuCit0ZW1wbGF0ZSA8Y2xhc3MgTm9kZVQ+IGNsYXNzIERvbVRyZWVOb2RlQmFzZSB7CisgIGZyaWVuZCBjbGFzcyBQb3N0RG9taW5hdG9yVHJlZTsKKyAgZnJpZW5kIGNsYXNzIERvbWluYXRvclRyZWVCYXNlPE5vZGVULCBmYWxzZT47CisgIGZyaWVuZCBjbGFzcyBEb21pbmF0b3JUcmVlQmFzZTxOb2RlVCwgdHJ1ZT47CisgIGZyaWVuZCBzdHJ1Y3QgRG9tVHJlZUJ1aWxkZXI6OlNlbWlOQ0FJbmZvPERvbWluYXRvclRyZWVCYXNlPE5vZGVULCBmYWxzZT4+OworICBmcmllbmQgc3RydWN0IERvbVRyZWVCdWlsZGVyOjpTZW1pTkNBSW5mbzxEb21pbmF0b3JUcmVlQmFzZTxOb2RlVCwgdHJ1ZT4+OworCisgIE5vZGVUICpUaGVCQjsKKyAgRG9tVHJlZU5vZGVCYXNlICpJRG9tOworICB1bnNpZ25lZCBMZXZlbDsKKyAgc3RkOjp2ZWN0b3I8RG9tVHJlZU5vZGVCYXNlICo+IENoaWxkcmVuOworICBtdXRhYmxlIHVuc2lnbmVkIERGU051bUluID0gfjA7CisgIG11dGFibGUgdW5zaWduZWQgREZTTnVtT3V0ID0gfjA7CisKKyBwdWJsaWM6CisgIERvbVRyZWVOb2RlQmFzZShOb2RlVCAqQkIsIERvbVRyZWVOb2RlQmFzZSAqaURvbSkKKyAgICAgIDogVGhlQkIoQkIpLCBJRG9tKGlEb20pLCBMZXZlbChJRG9tID8gSURvbS0+TGV2ZWwgKyAxIDogMCkge30KKworICB1c2luZyBpdGVyYXRvciA9IHR5cGVuYW1lIHN0ZDo6dmVjdG9yPERvbVRyZWVOb2RlQmFzZSAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0KKyAgICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPERvbVRyZWVOb2RlQmFzZSAqPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBDaGlsZHJlbi5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIENoaWxkcmVuLmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gQ2hpbGRyZW4uYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBDaGlsZHJlbi5lbmQoKTsgfQorCisgIE5vZGVUICpnZXRCbG9jaygpIGNvbnN0IHsgcmV0dXJuIFRoZUJCOyB9CisgIERvbVRyZWVOb2RlQmFzZSAqZ2V0SURvbSgpIGNvbnN0IHsgcmV0dXJuIElEb207IH0KKyAgdW5zaWduZWQgZ2V0TGV2ZWwoKSBjb25zdCB7IHJldHVybiBMZXZlbDsgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPERvbVRyZWVOb2RlQmFzZSAqPiAmZ2V0Q2hpbGRyZW4oKSBjb25zdCB7IHJldHVybiBDaGlsZHJlbjsgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxEb21UcmVlTm9kZUJhc2U+IGFkZENoaWxkKAorICAgICAgc3RkOjp1bmlxdWVfcHRyPERvbVRyZWVOb2RlQmFzZT4gQykgeworICAgIENoaWxkcmVuLnB1c2hfYmFjayhDLmdldCgpKTsKKyAgICByZXR1cm4gQzsKKyAgfQorCisgIHNpemVfdCBnZXROdW1DaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIENoaWxkcmVuLnNpemUoKTsgfQorCisgIHZvaWQgY2xlYXJBbGxDaGlsZHJlbigpIHsgQ2hpbGRyZW4uY2xlYXIoKTsgfQorCisgIGJvb2wgY29tcGFyZShjb25zdCBEb21UcmVlTm9kZUJhc2UgKk90aGVyKSBjb25zdCB7CisgICAgaWYgKGdldE51bUNoaWxkcmVuKCkgIT0gT3RoZXItPmdldE51bUNoaWxkcmVuKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmIChMZXZlbCAhPSBPdGhlci0+TGV2ZWwpIHJldHVybiB0cnVlOworCisgICAgU21hbGxQdHJTZXQ8Y29uc3QgTm9kZVQgKiwgND4gT3RoZXJDaGlsZHJlbjsKKyAgICBmb3IgKGNvbnN0IERvbVRyZWVOb2RlQmFzZSAqSSA6ICpPdGhlcikgeworICAgICAgY29uc3QgTm9kZVQgKk5kID0gSS0+Z2V0QmxvY2soKTsKKyAgICAgIE90aGVyQ2hpbGRyZW4uaW5zZXJ0KE5kKTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IERvbVRyZWVOb2RlQmFzZSAqSSA6ICp0aGlzKSB7CisgICAgICBjb25zdCBOb2RlVCAqTiA9IEktPmdldEJsb2NrKCk7CisgICAgICBpZiAoT3RoZXJDaGlsZHJlbi5jb3VudChOKSA9PSAwKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdm9pZCBzZXRJRG9tKERvbVRyZWVOb2RlQmFzZSAqTmV3SURvbSkgeworICAgIGFzc2VydChJRG9tICYmICJObyBpbW1lZGlhdGUgZG9taW5hdG9yPyIpOworICAgIGlmIChJRG9tID09IE5ld0lEb20pIHJldHVybjsKKworICAgIGF1dG8gSSA9IGZpbmQoSURvbS0+Q2hpbGRyZW4sIHRoaXMpOworICAgIGFzc2VydChJICE9IElEb20tPkNoaWxkcmVuLmVuZCgpICYmCisgICAgICAgICAgICJOb3QgaW4gaW1tZWRpYXRlIGRvbWluYXRvciBjaGlsZHJlbiBzZXQhIik7CisgICAgLy8gSSBhbSBubyBsb25nZXIgeW91ciBjaGlsZC4uLgorICAgIElEb20tPkNoaWxkcmVuLmVyYXNlKEkpOworCisgICAgLy8gU3dpdGNoIHRvIG5ldyBkb21pbmF0b3IKKyAgICBJRG9tID0gTmV3SURvbTsKKyAgICBJRG9tLT5DaGlsZHJlbi5wdXNoX2JhY2sodGhpcyk7CisKKyAgICBVcGRhdGVMZXZlbCgpOworICB9CisKKyAgLy8vIGdldERGU051bUluL2dldERGU051bU91dCAtIFRoZXNlIHJldHVybiB0aGUgREZTIHZpc2l0YXRpb24gb3JkZXIgZm9yIG5vZGVzCisgIC8vLyBpbiB0aGUgZG9taW5hdG9yIHRyZWUuIFRoZXkgYXJlIG9ubHkgZ3VhcmFudGVlZCB2YWxpZCBpZgorICAvLy8gdXBkYXRlREZTTnVtYmVycygpIGhhcyBiZWVuIGNhbGxlZC4KKyAgdW5zaWduZWQgZ2V0REZTTnVtSW4oKSBjb25zdCB7IHJldHVybiBERlNOdW1JbjsgfQorICB1bnNpZ25lZCBnZXRERlNOdW1PdXQoKSBjb25zdCB7IHJldHVybiBERlNOdW1PdXQ7IH0KKworcHJpdmF0ZToKKyAgLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBub2RlIGlzIGRvbWluYXRlZCBieSBvdGhlci4gVXNlIHRoaXMgb25seSBpZiBERlMgaW5mbworICAvLyBpcyB2YWxpZC4KKyAgYm9vbCBEb21pbmF0ZWRCeShjb25zdCBEb21UcmVlTm9kZUJhc2UgKm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPkRGU051bUluID49IG90aGVyLT5ERlNOdW1JbiAmJgorICAgICAgICAgICB0aGlzLT5ERlNOdW1PdXQgPD0gb3RoZXItPkRGU051bU91dDsKKyAgfQorCisgIHZvaWQgVXBkYXRlTGV2ZWwoKSB7CisgICAgYXNzZXJ0KElEb20pOworICAgIGlmIChMZXZlbCA9PSBJRG9tLT5MZXZlbCArIDEpIHJldHVybjsKKworICAgIFNtYWxsVmVjdG9yPERvbVRyZWVOb2RlQmFzZSAqLCA2ND4gV29ya1N0YWNrID0ge3RoaXN9OworCisgICAgd2hpbGUgKCFXb3JrU3RhY2suZW1wdHkoKSkgeworICAgICAgRG9tVHJlZU5vZGVCYXNlICpDdXJyZW50ID0gV29ya1N0YWNrLnBvcF9iYWNrX3ZhbCgpOworICAgICAgQ3VycmVudC0+TGV2ZWwgPSBDdXJyZW50LT5JRG9tLT5MZXZlbCArIDE7CisKKyAgICAgIGZvciAoRG9tVHJlZU5vZGVCYXNlICpDIDogKkN1cnJlbnQpIHsKKyAgICAgICAgYXNzZXJ0KEMtPklEb20pOworICAgICAgICBpZiAoQy0+TGV2ZWwgIT0gQy0+SURvbS0+TGV2ZWwgKyAxKSBXb3JrU3RhY2sucHVzaF9iYWNrKEMpOworICAgICAgfQorICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIE5vZGVUPgorcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk8sIGNvbnN0IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKk5vZGUpIHsKKyAgaWYgKE5vZGUtPmdldEJsb2NrKCkpCisgICAgTm9kZS0+Z2V0QmxvY2soKS0+cHJpbnRBc09wZXJhbmQoTywgZmFsc2UpOworICBlbHNlCisgICAgTyA8PCAiIDw8ZXhpdCBub2RlPj4iOworCisgIE8gPDwgIiB7IiA8PCBOb2RlLT5nZXRERlNOdW1JbigpIDw8ICIsIiA8PCBOb2RlLT5nZXRERlNOdW1PdXQoKSA8PCAifSBbIgorICAgIDw8IE5vZGUtPmdldExldmVsKCkgPDwgIl1cbiI7CisKKyAgcmV0dXJuIE87Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBOb2RlVD4KK3ZvaWQgUHJpbnREb21UcmVlKGNvbnN0IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKk4sIHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGV2KSB7CisgIE8uaW5kZW50KDIgKiBMZXYpIDw8ICJbIiA8PCBMZXYgPDwgIl0gIiA8PCBOOworICBmb3IgKHR5cGVuYW1lIERvbVRyZWVOb2RlQmFzZTxOb2RlVD46OmNvbnN0X2l0ZXJhdG9yIEkgPSBOLT5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBOLT5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBQcmludERvbVRyZWU8Tm9kZVQ+KCpJLCBPLCBMZXYgKyAxKTsKK30KKworbmFtZXNwYWNlIERvbVRyZWVCdWlsZGVyIHsKKy8vIFRoZSByb3V0aW5lcyBiZWxvdyBhcmUgcHJvdmlkZWQgaW4gYSBzZXBhcmF0ZSBoZWFkZXIgYnV0IHJlZmVyZW5jZWQgaGVyZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEb21UcmVlVD4KK3ZvaWQgQ2FsY3VsYXRlKERvbVRyZWVUICZEVCk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEb21UcmVlVD4KK3ZvaWQgSW5zZXJ0RWRnZShEb21UcmVlVCAmRFQsIHR5cGVuYW1lIERvbVRyZWVUOjpOb2RlUHRyIEZyb20sCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgRG9tVHJlZVQ6Ok5vZGVQdHIgVG8pOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRG9tVHJlZVQ+Cit2b2lkIERlbGV0ZUVkZ2UoRG9tVHJlZVQgJkRULCB0eXBlbmFtZSBEb21UcmVlVDo6Tm9kZVB0ciBGcm9tLAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIERvbVRyZWVUOjpOb2RlUHRyIFRvKTsKKworLy8gVXBkYXRlS2luZCBhbmQgVXBkYXRlIGFyZSB1c2VkIGJ5IHRoZSBiYXRjaCB1cGRhdGUgQVBJIGFuZCBpdCdzIGVhc2llc3QgdG8KKy8vIGRlZmluZSB0aGVtIGhlcmUuCitlbnVtIGNsYXNzIFVwZGF0ZUtpbmQgOiB1bnNpZ25lZCBjaGFyIHsgSW5zZXJ0LCBEZWxldGUgfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVQdHI+CitzdHJ1Y3QgVXBkYXRlIHsKKyAgdXNpbmcgTm9kZUtpbmRQYWlyID0gUG9pbnRlckludFBhaXI8Tm9kZVB0ciwgMSwgVXBkYXRlS2luZD47CisKKyAgTm9kZVB0ciBGcm9tOworICBOb2RlS2luZFBhaXIgVG9BbmRLaW5kOworCisgIFVwZGF0ZShVcGRhdGVLaW5kIEtpbmQsIE5vZGVQdHIgRnJvbSwgTm9kZVB0ciBUbykKKyAgICAgIDogRnJvbShGcm9tKSwgVG9BbmRLaW5kKFRvLCBLaW5kKSB7fQorCisgIFVwZGF0ZUtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIFRvQW5kS2luZC5nZXRJbnQoKTsgfQorICBOb2RlUHRyIGdldEZyb20oKSBjb25zdCB7IHJldHVybiBGcm9tOyB9CisgIE5vZGVQdHIgZ2V0VG8oKSBjb25zdCB7IHJldHVybiBUb0FuZEtpbmQuZ2V0UG9pbnRlcigpOyB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBVcGRhdGUgJlJIUykgY29uc3QgeworICAgIHJldHVybiBGcm9tID09IFJIUy5Gcm9tICYmIFRvQW5kS2luZCA9PSBSSFMuVG9BbmRLaW5kOworICB9CisKKyAgZnJpZW5kIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgVXBkYXRlICZVKSB7CisgICAgT1MgPDwgKFUuZ2V0S2luZCgpID09IFVwZGF0ZUtpbmQ6Okluc2VydCA/ICJJbnNlcnQgIiA6ICJEZWxldGUgIik7CisgICAgVS5nZXRGcm9tKCktPnByaW50QXNPcGVyYW5kKE9TLCBmYWxzZSk7CisgICAgT1MgPDwgIiAtPiAiOworICAgIFUuZ2V0VG8oKS0+cHJpbnRBc09wZXJhbmQoT1MsIGZhbHNlKTsKKyAgICByZXR1cm4gT1M7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEb21UcmVlVD4KK3ZvaWQgQXBwbHlVcGRhdGVzKERvbVRyZWVUICZEVCwKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHR5cGVuYW1lIERvbVRyZWVUOjpVcGRhdGVUeXBlPiBVcGRhdGVzKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERvbVRyZWVUPgorYm9vbCBWZXJpZnkoY29uc3QgRG9tVHJlZVQgJkRULCB0eXBlbmFtZSBEb21UcmVlVDo6VmVyaWZpY2F0aW9uTGV2ZWwgVkwpOworfSAgLy8gbmFtZXNwYWNlIERvbVRyZWVCdWlsZGVyCisKKy8vLyBcYnJpZWYgQ29yZSBkb21pbmF0b3IgdHJlZSBiYXNlIGNsYXNzLgorLy8vCisvLy8gVGhpcyBjbGFzcyBpcyBhIGdlbmVyaWMgdGVtcGxhdGUgb3ZlciBncmFwaCBub2Rlcy4gSXQgaXMgaW5zdGFudGlhdGVkIGZvcgorLy8vIHZhcmlvdXMgZ3JhcGhzIGluIHRoZSBMTFZNIElSIG9yIGluIHRoZSBjb2RlIGdlbmVyYXRvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVCwgYm9vbCBJc1Bvc3REb20+CitjbGFzcyBEb21pbmF0b3JUcmVlQmFzZSB7CisgcHVibGljOgorICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfcG9pbnRlcjx0eXBlbmFtZSBHcmFwaFRyYWl0czxOb2RlVCAqPjo6Tm9kZVJlZj46OnZhbHVlLAorICAgICAgICAgICAgICAgICJDdXJyZW50bHkgRG9taW5hdG9yVHJlZUJhc2Ugc3VwcG9ydHMgb25seSBwb2ludGVyIG5vZGVzIik7CisgIHVzaW5nIE5vZGVUeXBlID0gTm9kZVQ7CisgIHVzaW5nIE5vZGVQdHIgPSBOb2RlVCAqOworICB1c2luZyBQYXJlbnRQdHIgPSBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8Tm9kZVQgKj4oKS0+Z2V0UGFyZW50KCkpOworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfcG9pbnRlcjxQYXJlbnRQdHI+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiQ3VycmVudGx5IE5vZGVUJ3MgcGFyZW50IG11c3QgYmUgYSBwb2ludGVyIHR5cGUiKTsKKyAgdXNpbmcgUGFyZW50VHlwZSA9IHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3BvaW50ZXI8UGFyZW50UHRyPjo6dHlwZTsKKyAgc3RhdGljIGNvbnN0ZXhwciBib29sIElzUG9zdERvbWluYXRvciA9IElzUG9zdERvbTsKKworICB1c2luZyBVcGRhdGVUeXBlID0gRG9tVHJlZUJ1aWxkZXI6OlVwZGF0ZTxOb2RlUHRyPjsKKyAgdXNpbmcgVXBkYXRlS2luZCA9IERvbVRyZWVCdWlsZGVyOjpVcGRhdGVLaW5kOworICBzdGF0aWMgY29uc3RleHByIFVwZGF0ZUtpbmQgSW5zZXJ0ID0gVXBkYXRlS2luZDo6SW5zZXJ0OworICBzdGF0aWMgY29uc3RleHByIFVwZGF0ZUtpbmQgRGVsZXRlID0gVXBkYXRlS2luZDo6RGVsZXRlOworCisgIGVudW0gY2xhc3MgVmVyaWZpY2F0aW9uTGV2ZWwgeyBGYXN0LCBCYXNpYywgRnVsbCB9OworCitwcm90ZWN0ZWQ6CisgIC8vIERvbWluYXRvcnMgYWx3YXlzIGhhdmUgYSBzaW5nbGUgcm9vdCwgcG9zdGRvbWluYXRvcnMgY2FuIGhhdmUgbW9yZS4KKyAgU21hbGxWZWN0b3I8Tm9kZVQgKiwgSXNQb3N0RG9tID8gNCA6IDE+IFJvb3RzOworCisgIHVzaW5nIERvbVRyZWVOb2RlTWFwVHlwZSA9CisgICAgIERlbnNlTWFwPE5vZGVUICosIHN0ZDo6dW5pcXVlX3B0cjxEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+Pj47CisgIERvbVRyZWVOb2RlTWFwVHlwZSBEb21UcmVlTm9kZXM7CisgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKlJvb3ROb2RlOworICBQYXJlbnRQdHIgUGFyZW50ID0gbnVsbHB0cjsKKworICBtdXRhYmxlIGJvb2wgREZTSW5mb1ZhbGlkID0gZmFsc2U7CisgIG11dGFibGUgdW5zaWduZWQgaW50IFNsb3dRdWVyaWVzID0gMDsKKworICBmcmllbmQgc3RydWN0IERvbVRyZWVCdWlsZGVyOjpTZW1pTkNBSW5mbzxEb21pbmF0b3JUcmVlQmFzZT47CisKKyBwdWJsaWM6CisgIERvbWluYXRvclRyZWVCYXNlKCkge30KKworICBEb21pbmF0b3JUcmVlQmFzZShEb21pbmF0b3JUcmVlQmFzZSAmJkFyZykKKyAgICAgIDogUm9vdHMoc3RkOjptb3ZlKEFyZy5Sb290cykpLAorICAgICAgICBEb21UcmVlTm9kZXMoc3RkOjptb3ZlKEFyZy5Eb21UcmVlTm9kZXMpKSwKKyAgICAgICAgUm9vdE5vZGUoQXJnLlJvb3ROb2RlKSwKKyAgICAgICAgUGFyZW50KEFyZy5QYXJlbnQpLAorICAgICAgICBERlNJbmZvVmFsaWQoQXJnLkRGU0luZm9WYWxpZCksCisgICAgICAgIFNsb3dRdWVyaWVzKEFyZy5TbG93UXVlcmllcykgeworICAgIEFyZy53aXBlKCk7CisgIH0KKworICBEb21pbmF0b3JUcmVlQmFzZSAmb3BlcmF0b3I9KERvbWluYXRvclRyZWVCYXNlICYmUkhTKSB7CisgICAgUm9vdHMgPSBzdGQ6Om1vdmUoUkhTLlJvb3RzKTsKKyAgICBEb21UcmVlTm9kZXMgPSBzdGQ6Om1vdmUoUkhTLkRvbVRyZWVOb2Rlcyk7CisgICAgUm9vdE5vZGUgPSBSSFMuUm9vdE5vZGU7CisgICAgUGFyZW50ID0gUkhTLlBhcmVudDsKKyAgICBERlNJbmZvVmFsaWQgPSBSSFMuREZTSW5mb1ZhbGlkOworICAgIFNsb3dRdWVyaWVzID0gUkhTLlNsb3dRdWVyaWVzOworICAgIFJIUy53aXBlKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgRG9taW5hdG9yVHJlZUJhc2UoY29uc3QgRG9taW5hdG9yVHJlZUJhc2UgJikgPSBkZWxldGU7CisgIERvbWluYXRvclRyZWVCYXNlICZvcGVyYXRvcj0oY29uc3QgRG9taW5hdG9yVHJlZUJhc2UgJikgPSBkZWxldGU7CisKKyAgLy8vIGdldFJvb3RzIC0gUmV0dXJuIHRoZSByb290IGJsb2NrcyBvZiB0aGUgY3VycmVudCBDRkcuICBUaGlzIG1heSBpbmNsdWRlCisgIC8vLyBtdWx0aXBsZSBibG9ja3MgaWYgd2UgYXJlIGNvbXB1dGluZyBwb3N0IGRvbWluYXRvcnMuICBGb3IgZm9yd2FyZAorICAvLy8gZG9taW5hdG9ycywgdGhpcyB3aWxsIGFsd2F5cyBiZSBhIHNpbmdsZSBibG9jayAodGhlIGVudHJ5IG5vZGUpLgorICAvLy8KKyAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE5vZGVUICo+ICZnZXRSb290cygpIGNvbnN0IHsgcmV0dXJuIFJvb3RzOyB9CisKKyAgLy8vIGlzUG9zdERvbWluYXRvciAtIFJldHVybnMgdHJ1ZSBpZiBhbmFseXNpcyBiYXNlZCBvZiBwb3N0ZG9tcworICAvLy8KKyAgYm9vbCBpc1Bvc3REb21pbmF0b3IoKSBjb25zdCB7IHJldHVybiBJc1Bvc3REb21pbmF0b3I7IH0KKworICAvLy8gY29tcGFyZSAtIFJldHVybiBmYWxzZSBpZiB0aGUgb3RoZXIgZG9taW5hdG9yIHRyZWUgYmFzZSBtYXRjaGVzIHRoaXMKKyAgLy8vIGRvbWluYXRvciB0cmVlIGJhc2UuIE90aGVyd2lzZSByZXR1cm4gdHJ1ZS4KKyAgYm9vbCBjb21wYXJlKGNvbnN0IERvbWluYXRvclRyZWVCYXNlICZPdGhlcikgY29uc3QgeworICAgIGlmIChQYXJlbnQgIT0gT3RoZXIuUGFyZW50KSByZXR1cm4gdHJ1ZTsKKworICAgIGlmIChSb290cy5zaXplKCkgIT0gT3RoZXIuUm9vdHMuc2l6ZSgpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoIXN0ZDo6aXNfcGVybXV0YXRpb24oUm9vdHMuYmVnaW4oKSwgUm9vdHMuZW5kKCksIE90aGVyLlJvb3RzLmJlZ2luKCkpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjb25zdCBEb21UcmVlTm9kZU1hcFR5cGUgJk90aGVyRG9tVHJlZU5vZGVzID0gT3RoZXIuRG9tVHJlZU5vZGVzOworICAgIGlmIChEb21UcmVlTm9kZXMuc2l6ZSgpICE9IE90aGVyRG9tVHJlZU5vZGVzLnNpemUoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgZm9yIChjb25zdCBhdXRvICZEb21UcmVlTm9kZSA6IERvbVRyZWVOb2RlcykgeworICAgICAgTm9kZVQgKkJCID0gRG9tVHJlZU5vZGUuZmlyc3Q7CisgICAgICB0eXBlbmFtZSBEb21UcmVlTm9kZU1hcFR5cGU6OmNvbnN0X2l0ZXJhdG9yIE9JID0KKyAgICAgICAgICBPdGhlckRvbVRyZWVOb2Rlcy5maW5kKEJCKTsKKyAgICAgIGlmIChPSSA9PSBPdGhlckRvbVRyZWVOb2Rlcy5lbmQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gJk15TmQgPSAqRG9tVHJlZU5vZGUuc2Vjb25kOworICAgICAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAmT3RoZXJOZCA9ICpPSS0+c2Vjb25kOworCisgICAgICBpZiAoTXlOZC5jb21wYXJlKCZPdGhlck5kKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgeyByZXNldCgpOyB9CisKKyAgLy8vIGdldE5vZGUgLSByZXR1cm4gdGhlIChQb3N0KURvbWluYXRvclRyZWUgbm9kZSBmb3IgdGhlIHNwZWNpZmllZCBiYXNpYworICAvLy8gYmxvY2suICBUaGlzIGlzIHRoZSBzYW1lIGFzIHVzaW5nIG9wZXJhdG9yW10gb24gdGhpcyBjbGFzcy4gIFRoZSByZXN1bHQKKyAgLy8vIG1heSAoYnV0IGlzIG5vdCByZXF1aXJlZCB0bykgYmUgbnVsbCBmb3IgYSBmb3J3YXJkIChiYWNrd2FyZHMpCisgIC8vLyBzdGF0aWNhbGx5IHVucmVhY2hhYmxlIGJsb2NrLgorICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpnZXROb2RlKE5vZGVUICpCQikgY29uc3QgeworICAgIGF1dG8gSSA9IERvbVRyZWVOb2Rlcy5maW5kKEJCKTsKKyAgICBpZiAoSSAhPSBEb21UcmVlTm9kZXMuZW5kKCkpCisgICAgICByZXR1cm4gSS0+c2Vjb25kLmdldCgpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFNlZSBnZXROb2RlLgorICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpvcGVyYXRvcltdKE5vZGVUICpCQikgY29uc3QgeyByZXR1cm4gZ2V0Tm9kZShCQik7IH0KKworICAvLy8gZ2V0Um9vdE5vZGUgLSBUaGlzIHJldHVybnMgdGhlIGVudHJ5IG5vZGUgZm9yIHRoZSBDRkcgb2YgdGhlIGZ1bmN0aW9uLiAgSWYKKyAgLy8vIHRoaXMgdHJlZSByZXByZXNlbnRzIHRoZSBwb3N0LWRvbWluYW5jZSByZWxhdGlvbnMgZm9yIGEgZnVuY3Rpb24sIGhvd2V2ZXIsCisgIC8vLyB0aGlzIHJvb3QgbWF5IGJlIGEgbm9kZSB3aXRoIHRoZSBibG9jayA9PSBOVUxMLiAgVGhpcyBpcyB0aGUgY2FzZSB3aGVuCisgIC8vLyB0aGVyZSBhcmUgbXVsdGlwbGUgZXhpdCBub2RlcyBmcm9tIGEgcGFydGljdWxhciBmdW5jdGlvbi4gIENvbnN1bWVycyBvZgorICAvLy8gcG9zdC1kb21pbmFuY2UgaW5mb3JtYXRpb24gbXVzdCBiZSBjYXBhYmxlIG9mIGRlYWxpbmcgd2l0aCB0aGlzCisgIC8vLyBwb3NzaWJpbGl0eS4KKyAgLy8vCisgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKmdldFJvb3ROb2RlKCkgeyByZXR1cm4gUm9vdE5vZGU7IH0KKyAgY29uc3QgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqZ2V0Um9vdE5vZGUoKSBjb25zdCB7IHJldHVybiBSb290Tm9kZTsgfQorCisgIC8vLyBHZXQgYWxsIG5vZGVzIGRvbWluYXRlZCBieSBSLCBpbmNsdWRpbmcgUiBpdHNlbGYuCisgIHZvaWQgZ2V0RGVzY2VuZGFudHMoTm9kZVQgKlIsIFNtYWxsVmVjdG9ySW1wbDxOb2RlVCAqPiAmUmVzdWx0KSBjb25zdCB7CisgICAgUmVzdWx0LmNsZWFyKCk7CisgICAgY29uc3QgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqUk4gPSBnZXROb2RlKFIpOworICAgIGlmICghUk4pCisgICAgICByZXR1cm47IC8vIElmIFIgaXMgdW5yZWFjaGFibGUsIGl0IHdpbGwgbm90IGJlIHByZXNlbnQgaW4gdGhlIERPTSB0cmVlLgorICAgIFNtYWxsVmVjdG9yPGNvbnN0IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKiwgOD4gV0w7CisgICAgV0wucHVzaF9iYWNrKFJOKTsKKworICAgIHdoaWxlICghV0wuZW1wdHkoKSkgeworICAgICAgY29uc3QgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqTiA9IFdMLnBvcF9iYWNrX3ZhbCgpOworICAgICAgUmVzdWx0LnB1c2hfYmFjayhOLT5nZXRCbG9jaygpKTsKKyAgICAgIFdMLmFwcGVuZChOLT5iZWdpbigpLCBOLT5lbmQoKSk7CisgICAgfQorICB9CisKKyAgLy8vIHByb3Blcmx5RG9taW5hdGVzIC0gUmV0dXJucyB0cnVlIGlmZiBBIGRvbWluYXRlcyBCIGFuZCBBICE9IEIuCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBpcyBub3QgYSBjb25zdGFudCB0aW1lIG9wZXJhdGlvbiEKKyAgLy8vCisgIGJvb2wgcHJvcGVybHlEb21pbmF0ZXMoY29uc3QgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpCKSBjb25zdCB7CisgICAgaWYgKCFBIHx8ICFCKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChBID09IEIpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGRvbWluYXRlcyhBLCBCKTsKKyAgfQorCisgIGJvb2wgcHJvcGVybHlEb21pbmF0ZXMoY29uc3QgTm9kZVQgKkEsIGNvbnN0IE5vZGVUICpCKSBjb25zdDsKKworICAvLy8gaXNSZWFjaGFibGVGcm9tRW50cnkgLSBSZXR1cm4gdHJ1ZSBpZiBBIGlzIGRvbWluYXRlZCBieSB0aGUgZW50cnkKKyAgLy8vIGJsb2NrIG9mIHRoZSBmdW5jdGlvbiBjb250YWluaW5nIGl0LgorICBib29sIGlzUmVhY2hhYmxlRnJvbUVudHJ5KGNvbnN0IE5vZGVUICpBKSBjb25zdCB7CisgICAgYXNzZXJ0KCF0aGlzLT5pc1Bvc3REb21pbmF0b3IoKSAmJgorICAgICAgICAgICAiVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIHBvc3QgZG9taW5hdG9ycyIpOworICAgIHJldHVybiBpc1JlYWNoYWJsZUZyb21FbnRyeShnZXROb2RlKGNvbnN0X2Nhc3Q8Tm9kZVQgKj4oQSkpKTsKKyAgfQorCisgIGJvb2wgaXNSZWFjaGFibGVGcm9tRW50cnkoY29uc3QgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqQSkgY29uc3QgeyByZXR1cm4gQTsgfQorCisgIC8vLyBkb21pbmF0ZXMgLSBSZXR1cm5zIHRydWUgaWZmIEEgZG9taW5hdGVzIEIuICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgYQorICAvLy8gY29uc3RhbnQgdGltZSBvcGVyYXRpb24hCisgIC8vLworICBib29sIGRvbWluYXRlcyhjb25zdCBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpBLAorICAgICAgICAgICAgICAgICBjb25zdCBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpCKSBjb25zdCB7CisgICAgLy8gQSBub2RlIHRyaXZpYWxseSBkb21pbmF0ZXMgaXRzZWxmLgorICAgIGlmIChCID09IEEpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIEFuIHVucmVhY2hhYmxlIG5vZGUgaXMgZG9taW5hdGVkIGJ5IGFueXRoaW5nLgorICAgIGlmICghaXNSZWFjaGFibGVGcm9tRW50cnkoQikpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIEFuZCBkb21pbmF0ZXMgbm90aGluZy4KKyAgICBpZiAoIWlzUmVhY2hhYmxlRnJvbUVudHJ5KEEpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKEItPmdldElEb20oKSA9PSBBKSByZXR1cm4gdHJ1ZTsKKworICAgIGlmIChBLT5nZXRJRG9tKCkgPT0gQikgcmV0dXJuIGZhbHNlOworCisgICAgLy8gQSBjYW4gb25seSBkb21pbmF0ZSBCIGlmIGl0IGlzIGhpZ2hlciBpbiB0aGUgdHJlZS4KKyAgICBpZiAoQS0+Z2V0TGV2ZWwoKSA+PSBCLT5nZXRMZXZlbCgpKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBDb21wYXJlIHRoZSByZXN1bHQgb2YgdGhlIHRyZWUgd2FsayBhbmQgdGhlIGRmcyBudW1iZXJzLCBpZiBleHBlbnNpdmUKKyAgICAvLyBjaGVja3MgYXJlIGVuYWJsZWQuCisjaWZkZWYgRVhQRU5TSVZFX0NIRUNLUworICAgIGFzc2VydCgoIURGU0luZm9WYWxpZCB8fAorICAgICAgICAgICAgKGRvbWluYXRlZEJ5U2xvd1RyZWVXYWxrKEEsIEIpID09IEItPkRvbWluYXRlZEJ5KEEpKSkgJiYKKyAgICAgICAgICAgIlRyZWUgd2FsayBkaXNhZ3JlZXMgd2l0aCBkZnMgbnVtYmVycyEiKTsKKyNlbmRpZgorCisgICAgaWYgKERGU0luZm9WYWxpZCkKKyAgICAgIHJldHVybiBCLT5Eb21pbmF0ZWRCeShBKTsKKworICAgIC8vIElmIHdlIGVuZCB1cCB3aXRoIHRvbyBtYW55IHNsb3cgcXVlcmllcywganVzdCB1cGRhdGUgdGhlCisgICAgLy8gREZTIG51bWJlcnMgb24gdGhlIHRoZW9yeSB0aGF0IHdlIGFyZSBnb2luZyB0byBrZWVwIHF1ZXJ5aW5nLgorICAgIFNsb3dRdWVyaWVzKys7CisgICAgaWYgKFNsb3dRdWVyaWVzID4gMzIpIHsKKyAgICAgIHVwZGF0ZURGU051bWJlcnMoKTsKKyAgICAgIHJldHVybiBCLT5Eb21pbmF0ZWRCeShBKTsKKyAgICB9CisKKyAgICByZXR1cm4gZG9taW5hdGVkQnlTbG93VHJlZVdhbGsoQSwgQik7CisgIH0KKworICBib29sIGRvbWluYXRlcyhjb25zdCBOb2RlVCAqQSwgY29uc3QgTm9kZVQgKkIpIGNvbnN0OworCisgIE5vZGVUICpnZXRSb290KCkgY29uc3QgeworICAgIGFzc2VydCh0aGlzLT5Sb290cy5zaXplKCkgPT0gMSAmJiAiU2hvdWxkIGFsd2F5cyBoYXZlIGVudHJ5IG5vZGUhIik7CisgICAgcmV0dXJuIHRoaXMtPlJvb3RzWzBdOworICB9CisKKyAgLy8vIGZpbmROZWFyZXN0Q29tbW9uRG9taW5hdG9yIC0gRmluZCBuZWFyZXN0IGNvbW1vbiBkb21pbmF0b3IgYmFzaWMgYmxvY2sKKyAgLy8vIGZvciBiYXNpYyBibG9jayBBIGFuZCBCLiBJZiB0aGVyZSBpcyBubyBzdWNoIGJsb2NrIHRoZW4gcmV0dXJuIG51bGxwdHIuCisgIE5vZGVUICpmaW5kTmVhcmVzdENvbW1vbkRvbWluYXRvcihOb2RlVCAqQSwgTm9kZVQgKkIpIGNvbnN0IHsKKyAgICBhc3NlcnQoQSAmJiBCICYmICJQb2ludGVycyBhcmUgbm90IHZhbGlkIik7CisgICAgYXNzZXJ0KEEtPmdldFBhcmVudCgpID09IEItPmdldFBhcmVudCgpICYmCisgICAgICAgICAgICJUd28gYmxvY2tzIGFyZSBub3QgaW4gc2FtZSBmdW5jdGlvbiIpOworCisgICAgLy8gSWYgZWl0aGVyIEEgb3IgQiBpcyBhIGVudHJ5IGJsb2NrIHRoZW4gaXQgaXMgbmVhcmVzdCBjb21tb24gZG9taW5hdG9yCisgICAgLy8gKGZvciBmb3J3YXJkLWRvbWluYXRvcnMpLgorICAgIGlmICghaXNQb3N0RG9taW5hdG9yKCkpIHsKKyAgICAgIE5vZGVUICZFbnRyeSA9IEEtPmdldFBhcmVudCgpLT5mcm9udCgpOworICAgICAgaWYgKEEgPT0gJkVudHJ5IHx8IEIgPT0gJkVudHJ5KQorICAgICAgICByZXR1cm4gJkVudHJ5OworICAgIH0KKworICAgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKk5vZGVBID0gZ2V0Tm9kZShBKTsKKyAgICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpOb2RlQiA9IGdldE5vZGUoQik7CisKKyAgICBpZiAoIU5vZGVBIHx8ICFOb2RlQikgcmV0dXJuIG51bGxwdHI7CisKKyAgICAvLyBVc2UgbGV2ZWwgaW5mb3JtYXRpb24gdG8gZ28gdXAgdGhlIHRyZWUgdW50aWwgdGhlIGxldmVscyBtYXRjaC4gVGhlbgorICAgIC8vIGNvbnRpbnVlIGdvaW5nIHVwIHRpbCB3ZSBhcnJpdmUgYXQgdGhlIHNhbWUgbm9kZS4KKyAgICB3aGlsZSAoTm9kZUEgJiYgTm9kZUEgIT0gTm9kZUIpIHsKKyAgICAgIGlmIChOb2RlQS0+Z2V0TGV2ZWwoKSA8IE5vZGVCLT5nZXRMZXZlbCgpKSBzdGQ6OnN3YXAoTm9kZUEsIE5vZGVCKTsKKworICAgICAgTm9kZUEgPSBOb2RlQS0+SURvbTsKKyAgICB9CisKKyAgICByZXR1cm4gTm9kZUEgPyBOb2RlQS0+Z2V0QmxvY2soKSA6IG51bGxwdHI7CisgIH0KKworICBjb25zdCBOb2RlVCAqZmluZE5lYXJlc3RDb21tb25Eb21pbmF0b3IoY29uc3QgTm9kZVQgKkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOb2RlVCAqQikgY29uc3QgeworICAgIC8vIENhc3QgYXdheSB0aGUgY29uc3QgcXVhbGlmaWVycyBoZXJlLiBUaGlzIGlzIG9rIHNpbmNlCisgICAgLy8gY29uc3QgaXMgcmUtaW50cm9kdWNlZCBvbiB0aGUgcmV0dXJuIHR5cGUuCisgICAgcmV0dXJuIGZpbmROZWFyZXN0Q29tbW9uRG9taW5hdG9yKGNvbnN0X2Nhc3Q8Tm9kZVQgKj4oQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Tm9kZVQgKj4oQikpOworICB9CisKKyAgYm9vbCBpc1ZpcnR1YWxSb290KGNvbnN0IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKkEpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNQb3N0RG9taW5hdG9yKCkgJiYgIUEtPmdldEJsb2NrKCk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQVBJIHRvIHVwZGF0ZSAoUG9zdClEb21pbmF0b3JUcmVlIGluZm9ybWF0aW9uIGJhc2VkIG9uIG1vZGlmaWNhdGlvbnMgdG8KKyAgLy8gdGhlIENGRy4uLgorCisgIC8vLyBJbmZvcm0gdGhlIGRvbWluYXRvciB0cmVlIGFib3V0IGEgc2VxdWVuY2Ugb2YgQ0ZHIGVkZ2UgaW5zZXJ0aW9ucyBhbmQKKyAgLy8vIGRlbGV0aW9ucyBhbmQgcGVyZm9ybSBhIGJhdGNoIHVwZGF0ZSBvbiB0aGUgdHJlZS4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlcmUgd2VyZSBtdWx0aXBsZSBDRkcgdXBkYXRlcyBhZnRlcgorICAvLy8gdGhlIGxhc3QgZG9taW5hdG9yIHRyZWUgdXBkYXRlLiBJdCB0YWtlcyBjYXJlIG9mIHBlcmZvcm1pbmcgdGhlIHVwZGF0ZXMKKyAgLy8vIGluIHN5bmMgd2l0aCB0aGUgQ0ZHIGFuZCBvcHRpbWl6ZXMgYXdheSB0aGUgcmVkdW5kYW50IG9wZXJhdGlvbnMgdGhhdAorICAvLy8gY2FuY2VsIGVhY2ggb3RoZXIuCisgIC8vLyBUaGUgZnVuY3Rpb25zIGV4cGVjdHMgdGhlIHNlcXVlbmNlIG9mIHVwZGF0ZXMgdG8gYmUgYmFsYW5jZWQuIEVnLjoKKyAgLy8vICAtIHt7SW5zZXJ0LCBBLCBCfSwge0RlbGV0ZSwgQSwgQn0sIHtJbnNlcnQsIEEsIEJ9fSBpcyBmaW5lLCBiZWNhdXNlCisgIC8vLyAgICBsb2dpY2FsbHkgaXQgcmVzdWx0cyBpbiBhIHNpbmdsZSBpbnNlcnRpb25zLgorICAvLy8gIC0ge3tJbnNlcnQsIEEsIEJ9LCB7SW5zZXJ0LCBBLCBCfX0gaXMgaW52YWxpZCwgYmVjYXVzZSBpdCBkb2Vzbid0IG1ha2UKKyAgLy8vICAgIHNlbnNlIHRvIGluc2VydCB0aGUgc2FtZSBlZGdlIHR3aWNlLgorICAvLy8KKyAgLy8vIFdoYXQncyBtb3JlLCB0aGUgZnVuY3Rpb25zIGFzc3VtZXMgdGhhdCBpdCdzIHNhZmUgdG8gYXNrIGV2ZXJ5IG5vZGUgaW4gdGhlCisgIC8vLyBDRkcgYWJvdXQgaXRzIGNoaWxkcmVuIGFuZCBpbnZlcnNlIGNoaWxkcmVuLiBUaGlzIGltcGxpZXMgdGhhdCBkZWxldGlvbnMKKyAgLy8vIG9mIENGRyBlZGdlcyBtdXN0IG5vdCBkZWxldGUgdGhlIENGRyBub2RlcyBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIEJhdGNoIHVwZGF0ZXMgc2hvdWxkIGJlIGdlbmVyYWxseSBmYXN0ZXIgd2hlbiBwZXJmb3JtaW5nIGxvbmdlciBzZXF1ZW5jZXMKKyAgLy8vIG9mIHVwZGF0ZXMgdGhhbiBjYWxsaW5nIGluc2VydEVkZ2UvZGVsZXRlRWRnZSBtYW51YWxseSBtdWx0aXBsZSB0aW1lcywgYXMKKyAgLy8vIGl0IGNhbiByZW9yZGVyIHRoZSB1cGRhdGVzIGFuZCByZW1vdmUgcmVkdW5kYW50IG9uZXMgaW50ZXJuYWxseS4KKyAgLy8vIFRoZSBiYXRjaCB1cGRhdGVyIGlzIGFsc28gYWJsZSB0byBkZXRlY3Qgc2VxdWVuY2VzIG9mIHplcm8gYW5kIGV4YWN0bHkgb25lCisgIC8vLyB1cGRhdGUgLS0gaXQncyBvcHRpbWl6ZWQgdG8gZG8gbGVzcyB3b3JrIGluIHRoZXNlIGNhc2VzLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBmb3IgcG9zdGRvbWluYXRvcnMgaXQgYXV0b21hdGljYWxseSB0YWtlcyBjYXJlIG9mIGFwcGx5aW5nCisgIC8vLyB1cGRhdGVzIG9uIHJldmVyc2UgZWRnZXMgaW50ZXJuYWxseSAoc28gdGhlcmUncyBubyBuZWVkIHRvIHN3YXAgdGhlCisgIC8vLyBGcm9tIGFuZCBUbyBwb2ludGVycyB3aGVuIGNvbnN0cnVjdGluZyBEb21pbmF0b3JUcmVlOjpVcGRhdGVUeXBlKS4KKyAgLy8vIFRoZSB0eXBlIG9mIHVwZGF0ZXMgaXMgdGhlIHNhbWUgZm9yIERvbVRyZWVCYXNlPFQ+IGFuZCBQb3N0RG9tVHJlZUJhc2U8VD4KKyAgLy8vIHdpdGggdGhlIHNhbWUgdGVtcGxhdGUgcGFyYW1ldGVyIFQuCisgIC8vLworICAvLy8gXHBhcmFtIFVwZGF0ZXMgQW4gdW5vcmRlcmVkIHNlcXVlbmNlIG9mIHVwZGF0ZXMgdG8gcGVyZm9ybS4KKyAgLy8vCisgIHZvaWQgYXBwbHlVcGRhdGVzKEFycmF5UmVmPFVwZGF0ZVR5cGU+IFVwZGF0ZXMpIHsKKyAgICBEb21UcmVlQnVpbGRlcjo6QXBwbHlVcGRhdGVzKCp0aGlzLCBVcGRhdGVzKTsKKyAgfQorCisgIC8vLyBJbmZvcm0gdGhlIGRvbWluYXRvciB0cmVlIGFib3V0IGEgQ0ZHIGVkZ2UgaW5zZXJ0aW9uIGFuZCB1cGRhdGUgdGhlIHRyZWUuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBoYXMgdG8gYmUgY2FsbGVkIGp1c3QgYmVmb3JlIG9yIGp1c3QgYWZ0ZXIgbWFraW5nIHRoZSB1cGRhdGUKKyAgLy8vIG9uIHRoZSBhY3R1YWwgQ0ZHLiBUaGVyZSBjYW5ub3QgYmUgYW55IG90aGVyIHVwZGF0ZXMgdGhhdCB0aGUgZG9taW5hdG9yCisgIC8vLyB0cmVlIGRvZXNuJ3Qga25vdyBhYm91dC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgZm9yIHBvc3Rkb21pbmF0b3JzIGl0IGF1dG9tYXRpY2FsbHkgdGFrZXMgY2FyZSBvZiBpbnNlcnRpbmcKKyAgLy8vIGEgcmV2ZXJzZSBlZGdlIGludGVybmFsbHkgKHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBzd2FwIHRoZSBwYXJhbWV0ZXJzKS4KKyAgLy8vCisgIHZvaWQgaW5zZXJ0RWRnZShOb2RlVCAqRnJvbSwgTm9kZVQgKlRvKSB7CisgICAgYXNzZXJ0KEZyb20pOworICAgIGFzc2VydChUbyk7CisgICAgYXNzZXJ0KEZyb20tPmdldFBhcmVudCgpID09IFBhcmVudCk7CisgICAgYXNzZXJ0KFRvLT5nZXRQYXJlbnQoKSA9PSBQYXJlbnQpOworICAgIERvbVRyZWVCdWlsZGVyOjpJbnNlcnRFZGdlKCp0aGlzLCBGcm9tLCBUbyk7CisgIH0KKworICAvLy8gSW5mb3JtIHRoZSBkb21pbmF0b3IgdHJlZSBhYm91dCBhIENGRyBlZGdlIGRlbGV0aW9uIGFuZCB1cGRhdGUgdGhlIHRyZWUuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBoYXMgdG8gYmUgY2FsbGVkIGp1c3QgYWZ0ZXIgbWFraW5nIHRoZSB1cGRhdGUgb24gdGhlIGFjdHVhbAorICAvLy8gQ0ZHLiBBbiBpbnRlcm5hbCBmdW5jdGlvbnMgY2hlY2tzIGlmIHRoZSBlZGdlIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIENGRyBpbgorICAvLy8gREVCVUcgbW9kZS4gVGhlcmUgY2Fubm90IGJlIGFueSBvdGhlciB1cGRhdGVzIHRoYXQgdGhlCisgIC8vLyBkb21pbmF0b3IgdHJlZSBkb2Vzbid0IGtub3cgYWJvdXQuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IGZvciBwb3N0ZG9taW5hdG9ycyBpdCBhdXRvbWF0aWNhbGx5IHRha2VzIGNhcmUgb2YgZGVsZXRpbmcKKyAgLy8vIGEgcmV2ZXJzZSBlZGdlIGludGVybmFsbHkgKHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBzd2FwIHRoZSBwYXJhbWV0ZXJzKS4KKyAgLy8vCisgIHZvaWQgZGVsZXRlRWRnZShOb2RlVCAqRnJvbSwgTm9kZVQgKlRvKSB7CisgICAgYXNzZXJ0KEZyb20pOworICAgIGFzc2VydChUbyk7CisgICAgYXNzZXJ0KEZyb20tPmdldFBhcmVudCgpID09IFBhcmVudCk7CisgICAgYXNzZXJ0KFRvLT5nZXRQYXJlbnQoKSA9PSBQYXJlbnQpOworICAgIERvbVRyZWVCdWlsZGVyOjpEZWxldGVFZGdlKCp0aGlzLCBGcm9tLCBUbyk7CisgIH0KKworICAvLy8gQWRkIGEgbmV3IG5vZGUgdG8gdGhlIGRvbWluYXRvciB0cmVlIGluZm9ybWF0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgY3JlYXRlcyBhIG5ldyBub2RlIGFzIGEgY2hpbGQgb2YgRG9tQkIgZG9taW5hdG9yIG5vZGUsIGxpbmtpbmcgaXQKKyAgLy8vIGludG8gdGhlIGNoaWxkcmVuIGxpc3Qgb2YgdGhlIGltbWVkaWF0ZSBkb21pbmF0b3IuCisgIC8vLworICAvLy8gXHBhcmFtIEJCIE5ldyBub2RlIGluIENGRy4KKyAgLy8vIFxwYXJhbSBEb21CQiBDRkcgbm9kZSB0aGF0IGlzIGRvbWluYXRvciBmb3IgQkIuCisgIC8vLyBccmV0dXJucyBOZXcgZG9taW5hdG9yIHRyZWUgbm9kZSB0aGF0IHJlcHJlc2VudHMgbmV3IENGRyBub2RlLgorICAvLy8KKyAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqYWRkTmV3QmxvY2soTm9kZVQgKkJCLCBOb2RlVCAqRG9tQkIpIHsKKyAgICBhc3NlcnQoZ2V0Tm9kZShCQikgPT0gbnVsbHB0ciAmJiAiQmxvY2sgYWxyZWFkeSBpbiBkb21pbmF0b3IgdHJlZSEiKTsKKyAgICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpJRG9tTm9kZSA9IGdldE5vZGUoRG9tQkIpOworICAgIGFzc2VydChJRG9tTm9kZSAmJiAiTm90IGltbWVkaWF0ZSBkb21pbmF0b3Igc3BlY2lmaWVkIGZvciBibG9jayEiKTsKKyAgICBERlNJbmZvVmFsaWQgPSBmYWxzZTsKKyAgICByZXR1cm4gKERvbVRyZWVOb2Rlc1tCQl0gPSBJRG9tTm9kZS0+YWRkQ2hpbGQoCisgICAgICAgICAgICAgICAgbGx2bTo6bWFrZV91bmlxdWU8RG9tVHJlZU5vZGVCYXNlPE5vZGVUPj4oQkIsIElEb21Ob2RlKSkpLmdldCgpOworICB9CisKKyAgLy8vIEFkZCBhIG5ldyBub2RlIHRvIHRoZSBmb3J3YXJkIGRvbWluYXRvciB0cmVlIGFuZCBtYWtlIGl0IGEgbmV3IHJvb3QuCisgIC8vLworICAvLy8gXHBhcmFtIEJCIE5ldyBub2RlIGluIENGRy4KKyAgLy8vIFxyZXR1cm5zIE5ldyBkb21pbmF0b3IgdHJlZSBub2RlIHRoYXQgcmVwcmVzZW50cyBuZXcgQ0ZHIG5vZGUuCisgIC8vLworICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpzZXROZXdSb290KE5vZGVUICpCQikgeworICAgIGFzc2VydChnZXROb2RlKEJCKSA9PSBudWxscHRyICYmICJCbG9jayBhbHJlYWR5IGluIGRvbWluYXRvciB0cmVlISIpOworICAgIGFzc2VydCghdGhpcy0+aXNQb3N0RG9taW5hdG9yKCkgJiYKKyAgICAgICAgICAgIkNhbm5vdCBjaGFuZ2Ugcm9vdCBvZiBwb3N0LWRvbWluYXRvciB0cmVlIik7CisgICAgREZTSW5mb1ZhbGlkID0gZmFsc2U7CisgICAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqTmV3Tm9kZSA9IChEb21UcmVlTm9kZXNbQkJdID0KKyAgICAgIGxsdm06Om1ha2VfdW5pcXVlPERvbVRyZWVOb2RlQmFzZTxOb2RlVD4+KEJCLCBudWxscHRyKSkuZ2V0KCk7CisgICAgaWYgKFJvb3RzLmVtcHR5KCkpIHsKKyAgICAgIGFkZFJvb3QoQkIpOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoUm9vdHMuc2l6ZSgpID09IDEpOworICAgICAgTm9kZVQgKk9sZFJvb3QgPSBSb290cy5mcm9udCgpOworICAgICAgYXV0byAmT2xkTm9kZSA9IERvbVRyZWVOb2Rlc1tPbGRSb290XTsKKyAgICAgIE9sZE5vZGUgPSBOZXdOb2RlLT5hZGRDaGlsZChzdGQ6Om1vdmUoRG9tVHJlZU5vZGVzW09sZFJvb3RdKSk7CisgICAgICBPbGROb2RlLT5JRG9tID0gTmV3Tm9kZTsKKyAgICAgIE9sZE5vZGUtPlVwZGF0ZUxldmVsKCk7CisgICAgICBSb290c1swXSA9IEJCOworICAgIH0KKyAgICByZXR1cm4gUm9vdE5vZGUgPSBOZXdOb2RlOworICB9CisKKyAgLy8vIGNoYW5nZUltbWVkaWF0ZURvbWluYXRvciAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBkb21pbmF0b3IKKyAgLy8vIHRyZWUgaW5mb3JtYXRpb24gd2hlbiBhIG5vZGUncyBpbW1lZGlhdGUgZG9taW5hdG9yIGNoYW5nZXMuCisgIC8vLworICB2b2lkIGNoYW5nZUltbWVkaWF0ZURvbWluYXRvcihEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpOZXdJRG9tKSB7CisgICAgYXNzZXJ0KE4gJiYgTmV3SURvbSAmJiAiQ2Fubm90IGNoYW5nZSBudWxsIG5vZGUgcG9pbnRlcnMhIik7CisgICAgREZTSW5mb1ZhbGlkID0gZmFsc2U7CisgICAgTi0+c2V0SURvbShOZXdJRG9tKTsKKyAgfQorCisgIHZvaWQgY2hhbmdlSW1tZWRpYXRlRG9taW5hdG9yKE5vZGVUICpCQiwgTm9kZVQgKk5ld0JCKSB7CisgICAgY2hhbmdlSW1tZWRpYXRlRG9taW5hdG9yKGdldE5vZGUoQkIpLCBnZXROb2RlKE5ld0JCKSk7CisgIH0KKworICAvLy8gZXJhc2VOb2RlIC0gUmVtb3ZlcyBhIG5vZGUgZnJvbSB0aGUgZG9taW5hdG9yIHRyZWUuIEJsb2NrIG11c3Qgbm90CisgIC8vLyBkb21pbmF0ZSBhbnkgb3RoZXIgYmxvY2tzLiBSZW1vdmVzIG5vZGUgZnJvbSBpdHMgaW1tZWRpYXRlIGRvbWluYXRvcidzCisgIC8vLyBjaGlsZHJlbiBsaXN0LiBEZWxldGVzIGRvbWluYXRvciBub2RlIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBibG9jayBCQi4KKyAgdm9pZCBlcmFzZU5vZGUoTm9kZVQgKkJCKSB7CisgICAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqTm9kZSA9IGdldE5vZGUoQkIpOworICAgIGFzc2VydChOb2RlICYmICJSZW1vdmluZyBub2RlIHRoYXQgaXNuJ3QgaW4gZG9taW5hdG9yIHRyZWUuIik7CisgICAgYXNzZXJ0KE5vZGUtPmdldENoaWxkcmVuKCkuZW1wdHkoKSAmJiAiTm9kZSBpcyBub3QgYSBsZWFmIG5vZGUuIik7CisKKyAgICBERlNJbmZvVmFsaWQgPSBmYWxzZTsKKworICAgIC8vIFJlbW92ZSBub2RlIGZyb20gaW1tZWRpYXRlIGRvbWluYXRvcidzIGNoaWxkcmVuIGxpc3QuCisgICAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqSURvbSA9IE5vZGUtPmdldElEb20oKTsKKyAgICBpZiAoSURvbSkgeworICAgICAgY29uc3QgYXV0byBJID0gZmluZChJRG9tLT5DaGlsZHJlbiwgTm9kZSk7CisgICAgICBhc3NlcnQoSSAhPSBJRG9tLT5DaGlsZHJlbi5lbmQoKSAmJgorICAgICAgICAgICAgICJOb3QgaW4gaW1tZWRpYXRlIGRvbWluYXRvciBjaGlsZHJlbiBzZXQhIik7CisgICAgICAvLyBJIGFtIG5vIGxvbmdlciB5b3VyIGNoaWxkLi4uCisgICAgICBJRG9tLT5DaGlsZHJlbi5lcmFzZShJKTsKKyAgICB9CisKKyAgICBEb21UcmVlTm9kZXMuZXJhc2UoQkIpOworCisgICAgaWYgKCFJc1Bvc3REb20pIHJldHVybjsKKworICAgIC8vIFJlbWVtYmVyIHRvIHVwZGF0ZSBQb3N0RG9taW5hdG9yVHJlZSByb290cy4KKyAgICBhdXRvIFJJdCA9IGxsdm06OmZpbmQoUm9vdHMsIEJCKTsKKyAgICBpZiAoUkl0ICE9IFJvb3RzLmVuZCgpKSB7CisgICAgICBzdGQ6OnN3YXAoKlJJdCwgUm9vdHMuYmFjaygpKTsKKyAgICAgIFJvb3RzLnBvcF9iYWNrKCk7CisgICAgfQorICB9CisKKyAgLy8vIHNwbGl0QmxvY2sgLSBCQiBpcyBzcGxpdCBhbmQgbm93IGl0IGhhcyBvbmUgc3VjY2Vzc29yLiBVcGRhdGUgZG9taW5hdG9yCisgIC8vLyB0cmVlIHRvIHJlZmxlY3QgdGhpcyBjaGFuZ2UuCisgIHZvaWQgc3BsaXRCbG9jayhOb2RlVCAqTmV3QkIpIHsKKyAgICBpZiAoSXNQb3N0RG9taW5hdG9yKQorICAgICAgU3BsaXQ8SW52ZXJzZTxOb2RlVCAqPj4oTmV3QkIpOworICAgIGVsc2UKKyAgICAgIFNwbGl0PE5vZGVUICo+KE5ld0JCKTsKKyAgfQorCisgIC8vLyBwcmludCAtIENvbnZlcnQgdG8gaHVtYW4gcmVhZGFibGUgZm9ybQorICAvLy8KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTykgY29uc3QgeworICAgIE8gPDwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisgICAgaWYgKElzUG9zdERvbWluYXRvcikKKyAgICAgIE8gPDwgIklub3JkZXIgUG9zdERvbWluYXRvciBUcmVlOiAiOworICAgIGVsc2UKKyAgICAgIE8gPDwgIklub3JkZXIgRG9taW5hdG9yIFRyZWU6ICI7CisgICAgaWYgKCFERlNJbmZvVmFsaWQpCisgICAgICBPIDw8ICJERlNOdW1iZXJzIGludmFsaWQ6ICIgPDwgU2xvd1F1ZXJpZXMgPDwgIiBzbG93IHF1ZXJpZXMuIjsKKyAgICBPIDw8ICJcbiI7CisKKyAgICAvLyBUaGUgcG9zdGRvbSB0cmVlIGNhbiBoYXZlIGEgbnVsbCByb290IGlmIHRoZXJlIGFyZSBubyByZXR1cm5zLgorICAgIGlmIChnZXRSb290Tm9kZSgpKSBQcmludERvbVRyZWU8Tm9kZVQ+KGdldFJvb3ROb2RlKCksIE8sIDEpOworICAgIGlmIChJc1Bvc3REb21pbmF0b3IpIHsKKyAgICAgIE8gPDwgIlJvb3RzOiAiOworICAgICAgZm9yIChjb25zdCBOb2RlUHRyIEJsb2NrIDogUm9vdHMpIHsKKyAgICAgICAgQmxvY2stPnByaW50QXNPcGVyYW5kKE8sIGZhbHNlKTsKKyAgICAgICAgTyA8PCAiICI7CisgICAgICB9CisgICAgICBPIDw8ICJcbiI7CisgICAgfQorICB9CisKK3B1YmxpYzoKKyAgLy8vIHVwZGF0ZURGU051bWJlcnMgLSBBc3NpZ24gSW4gYW5kIE91dCBudW1iZXJzIHRvIHRoZSBub2RlcyB3aGlsZSB3YWxraW5nCisgIC8vLyBkb21pbmF0b3IgdHJlZSBpbiBkZnMgb3JkZXIuCisgIHZvaWQgdXBkYXRlREZTTnVtYmVycygpIGNvbnN0IHsKKyAgICBpZiAoREZTSW5mb1ZhbGlkKSB7CisgICAgICBTbG93UXVlcmllcyA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPGNvbnN0IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPjo6Y29uc3RfaXRlcmF0b3I+LAorICAgICAgICAgICAgICAgIDMyPiBXb3JrU3RhY2s7CisKKyAgICBjb25zdCBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpUaGlzUm9vdCA9IGdldFJvb3ROb2RlKCk7CisgICAgYXNzZXJ0KCghUGFyZW50IHx8IFRoaXNSb290KSAmJiAiRW1wdHkgY29uc3RydWN0ZWQgRG9tVHJlZSIpOworICAgIGlmICghVGhpc1Jvb3QpCisgICAgICByZXR1cm47CisKKyAgICAvLyBCb3RoIGRvbWluYXRvcnMgYW5kIHBvc3Rkb21pbmF0b3JzIGhhdmUgYSBzaW5nbGUgcm9vdCBub2RlLiBJbiB0aGUgY2FzZQorICAgIC8vIGNhc2Ugb2YgUG9zdERvbWluYXRvclRyZWUsIHRoaXMgbm9kZSBpcyBhIHZpcnR1YWwgcm9vdC4KKyAgICBXb3JrU3RhY2sucHVzaF9iYWNrKHtUaGlzUm9vdCwgVGhpc1Jvb3QtPmJlZ2luKCl9KTsKKworICAgIHVuc2lnbmVkIERGU051bSA9IDA7CisgICAgVGhpc1Jvb3QtPkRGU051bUluID0gREZTTnVtKys7CisKKyAgICB3aGlsZSAoIVdvcmtTdGFjay5lbXB0eSgpKSB7CisgICAgICBjb25zdCBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpOb2RlID0gV29ya1N0YWNrLmJhY2soKS5maXJzdDsKKyAgICAgIGNvbnN0IGF1dG8gQ2hpbGRJdCA9IFdvcmtTdGFjay5iYWNrKCkuc2Vjb25kOworCisgICAgICAvLyBJZiB3ZSB2aXNpdGVkIGFsbCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLCAicmVjdXJzZSIgYmFjayB1cCB0aGUKKyAgICAgIC8vIHN0YWNrIHNldHRpbmcgdGhlIERGT3V0TnVtLgorICAgICAgaWYgKENoaWxkSXQgPT0gTm9kZS0+ZW5kKCkpIHsKKyAgICAgICAgTm9kZS0+REZTTnVtT3V0ID0gREZTTnVtKys7CisgICAgICAgIFdvcmtTdGFjay5wb3BfYmFjaygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCByZWN1cnNpdmVseSB2aXNpdCB0aGlzIGNoaWxkLgorICAgICAgICBjb25zdCBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpDaGlsZCA9ICpDaGlsZEl0OworICAgICAgICArK1dvcmtTdGFjay5iYWNrKCkuc2Vjb25kOworCisgICAgICAgIFdvcmtTdGFjay5wdXNoX2JhY2soe0NoaWxkLCBDaGlsZC0+YmVnaW4oKX0pOworICAgICAgICBDaGlsZC0+REZTTnVtSW4gPSBERlNOdW0rKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBTbG93UXVlcmllcyA9IDA7CisgICAgREZTSW5mb1ZhbGlkID0gdHJ1ZTsKKyAgfQorCisgIC8vLyByZWNhbGN1bGF0ZSAtIGNvbXB1dGUgYSBkb21pbmF0b3IgdHJlZSBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uCisgIHZvaWQgcmVjYWxjdWxhdGUoUGFyZW50VHlwZSAmRnVuYykgeworICAgIFBhcmVudCA9ICZGdW5jOworICAgIERvbVRyZWVCdWlsZGVyOjpDYWxjdWxhdGUoKnRoaXMpOworICB9CisKKyAgLy8vIHZlcmlmeSAtIGNoZWNrcyBpZiB0aGUgdHJlZSBpcyBjb3JyZWN0LiBUaGVyZSBhcmUgMyBsZXZlbCBvZiB2ZXJpZmljYXRpb246CisgIC8vLyAgLSBGdWxsIC0tICB2ZXJpZmllcyBpZiB0aGUgdHJlZSBpcyBjb3JyZWN0IGJ5IG1ha2luZyBzdXJlIGFsbCB0aGUKKyAgLy8vICAgICAgICAgICAgIHByb3BlcnRpZXMgKGluY2x1ZGluZyB0aGUgcGFyZW50IGFuZCB0aGUgc2libGluZyBwcm9wZXJ0eSkKKyAgLy8vICAgICAgICAgICAgIGhvbGQuCisgIC8vLyAgICAgICAgICAgICBUYWtlcyBPKE5eMykgdGltZS4KKyAgLy8vCisgIC8vLyAgLSBCYXNpYyAtLSBjaGVja3MgaWYgdGhlIHRyZWUgaXMgY29ycmVjdCwgYnV0IGNvbXBhcmVzIGl0IHRvIGEgZnJlc2hseQorICAvLy8gICAgICAgICAgICAgY29uc3RydWN0ZWQgdHJlZSBpbnN0ZWFkIG9mIGNoZWNraW5nIHRoZSBzaWJsaW5nIHByb3BlcnR5LgorICAvLy8gICAgICAgICAgICAgVGFrZXMgTyhOXjIpIHRpbWUuCisgIC8vLworICAvLy8gIC0gRmFzdCAgLS0gY2hlY2tzIGJhc2ljIHRyZWUgc3RydWN0dXJlIGFuZCBjb21wYXJlcyBpdCB3aXRoIGEgZnJlc2hseQorICAvLy8gICAgICAgICAgICAgY29uc3RydWN0ZWQgdHJlZS4KKyAgLy8vICAgICAgICAgICAgIFRha2VzIE8oTl4yKSB0aW1lIHdvcnN0IGNhc2UsIGJ1dCBpcyBmYXN0ZXIgaW4gcHJhY3Rpc2UgKHNhbWUKKyAgLy8vICAgICAgICAgICAgIGFzIHRyZWUgY29uc3RydWN0aW9uKS4KKyAgYm9vbCB2ZXJpZnkoVmVyaWZpY2F0aW9uTGV2ZWwgVkwgPSBWZXJpZmljYXRpb25MZXZlbDo6RnVsbCkgY29uc3QgeworICAgIHJldHVybiBEb21UcmVlQnVpbGRlcjo6VmVyaWZ5KCp0aGlzLCBWTCk7CisgIH0KKworcHJvdGVjdGVkOgorICB2b2lkIGFkZFJvb3QoTm9kZVQgKkJCKSB7IHRoaXMtPlJvb3RzLnB1c2hfYmFjayhCQik7IH0KKworICB2b2lkIHJlc2V0KCkgeworICAgIERvbVRyZWVOb2Rlcy5jbGVhcigpOworICAgIFJvb3RzLmNsZWFyKCk7CisgICAgUm9vdE5vZGUgPSBudWxscHRyOworICAgIFBhcmVudCA9IG51bGxwdHI7CisgICAgREZTSW5mb1ZhbGlkID0gZmFsc2U7CisgICAgU2xvd1F1ZXJpZXMgPSAwOworICB9CisKKyAgLy8gTmV3QkIgaXMgc3BsaXQgYW5kIG5vdyBpdCBoYXMgb25lIHN1Y2Nlc3Nvci4gVXBkYXRlIGRvbWluYXRvciB0cmVlIHRvCisgIC8vIHJlZmxlY3QgdGhpcyBjaGFuZ2UuCisgIHRlbXBsYXRlIDxjbGFzcyBOPgorICB2b2lkIFNwbGl0KHR5cGVuYW1lIEdyYXBoVHJhaXRzPE4+OjpOb2RlUmVmIE5ld0JCKSB7CisgICAgdXNpbmcgR3JhcGhUID0gR3JhcGhUcmFpdHM8Tj47CisgICAgdXNpbmcgTm9kZVJlZiA9IHR5cGVuYW1lIEdyYXBoVDo6Tm9kZVJlZjsKKyAgICBhc3NlcnQoc3RkOjpkaXN0YW5jZShHcmFwaFQ6OmNoaWxkX2JlZ2luKE5ld0JCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaFQ6OmNoaWxkX2VuZChOZXdCQikpID09IDEgJiYKKyAgICAgICAgICAgIk5ld0JCIHNob3VsZCBoYXZlIGEgc2luZ2xlIHN1Y2Nlc3NvciEiKTsKKyAgICBOb2RlUmVmIE5ld0JCU3VjYyA9ICpHcmFwaFQ6OmNoaWxkX2JlZ2luKE5ld0JCKTsKKworICAgIHN0ZDo6dmVjdG9yPE5vZGVSZWY+IFByZWRCbG9ja3M7CisgICAgZm9yIChjb25zdCBhdXRvICZQcmVkIDogY2hpbGRyZW48SW52ZXJzZTxOPj4oTmV3QkIpKQorICAgICAgUHJlZEJsb2Nrcy5wdXNoX2JhY2soUHJlZCk7CisKKyAgICBhc3NlcnQoIVByZWRCbG9ja3MuZW1wdHkoKSAmJiAiTm8gcHJlZGJsb2Nrcz8iKTsKKworICAgIGJvb2wgTmV3QkJEb21pbmF0ZXNOZXdCQlN1Y2MgPSB0cnVlOworICAgIGZvciAoY29uc3QgYXV0byAmUHJlZCA6IGNoaWxkcmVuPEludmVyc2U8Tj4+KE5ld0JCU3VjYykpIHsKKyAgICAgIGlmIChQcmVkICE9IE5ld0JCICYmICFkb21pbmF0ZXMoTmV3QkJTdWNjLCBQcmVkKSAmJgorICAgICAgICAgIGlzUmVhY2hhYmxlRnJvbUVudHJ5KFByZWQpKSB7CisgICAgICAgIE5ld0JCRG9taW5hdGVzTmV3QkJTdWNjID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIC8vIEZpbmQgTmV3QkIncyBpbW1lZGlhdGUgZG9taW5hdG9yIGFuZCBjcmVhdGUgbmV3IGRvbWluYXRvciB0cmVlIG5vZGUgZm9yCisgICAgLy8gTmV3QkIuCisgICAgTm9kZVQgKk5ld0JCSURvbSA9IG51bGxwdHI7CisgICAgdW5zaWduZWQgaSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IFByZWRCbG9ja3Muc2l6ZSgpOyArK2kpCisgICAgICBpZiAoaXNSZWFjaGFibGVGcm9tRW50cnkoUHJlZEJsb2Nrc1tpXSkpIHsKKyAgICAgICAgTmV3QkJJRG9tID0gUHJlZEJsb2Nrc1tpXTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgbm9uZSBvZiB0aGUgcHJlZGVjZXNzb3JzIG9mIE5ld0JCIGFyZSByZWFjaGFibGU7CisgICAgLy8gaW4gdGhhdCBjYXNlLCBOZXdCQiBpdHNlbGYgaXMgdW5yZWFjaGFibGUsIHNvIG5vdGhpbmcgbmVlZHMgdG8gYmUKKyAgICAvLyBjaGFuZ2VkLgorICAgIGlmICghTmV3QkJJRG9tKSByZXR1cm47CisKKyAgICBmb3IgKGkgPSBpICsgMTsgaSA8IFByZWRCbG9ja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmIChpc1JlYWNoYWJsZUZyb21FbnRyeShQcmVkQmxvY2tzW2ldKSkKKyAgICAgICAgTmV3QkJJRG9tID0gZmluZE5lYXJlc3RDb21tb25Eb21pbmF0b3IoTmV3QkJJRG9tLCBQcmVkQmxvY2tzW2ldKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIG5ldyBkb21pbmF0b3IgdHJlZSBub2RlLi4uIGFuZCBzZXQgdGhlIGlkb20gb2YgTmV3QkIuCisgICAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqTmV3QkJOb2RlID0gYWRkTmV3QmxvY2soTmV3QkIsIE5ld0JCSURvbSk7CisKKyAgICAvLyBJZiBOZXdCQiBzdHJpY3RseSBkb21pbmF0ZXMgb3RoZXIgYmxvY2tzLCB0aGVuIGl0IGlzIG5vdyB0aGUgaW1tZWRpYXRlCisgICAgLy8gZG9taW5hdG9yIG9mIE5ld0JCU3VjYy4gIFVwZGF0ZSB0aGUgZG9taW5hdG9yIHRyZWUgYXMgYXBwcm9wcmlhdGUuCisgICAgaWYgKE5ld0JCRG9taW5hdGVzTmV3QkJTdWNjKSB7CisgICAgICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpOZXdCQlN1Y2NOb2RlID0gZ2V0Tm9kZShOZXdCQlN1Y2MpOworICAgICAgY2hhbmdlSW1tZWRpYXRlRG9taW5hdG9yKE5ld0JCU3VjY05vZGUsIE5ld0JCTm9kZSk7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICBib29sIGRvbWluYXRlZEJ5U2xvd1RyZWVXYWxrKGNvbnN0IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqQikgY29uc3QgeworICAgIGFzc2VydChBICE9IEIpOworICAgIGFzc2VydChpc1JlYWNoYWJsZUZyb21FbnRyeShCKSk7CisgICAgYXNzZXJ0KGlzUmVhY2hhYmxlRnJvbUVudHJ5KEEpKTsKKworICAgIGNvbnN0IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKklEb207CisgICAgd2hpbGUgKChJRG9tID0gQi0+Z2V0SURvbSgpKSAhPSBudWxscHRyICYmIElEb20gIT0gQSAmJiBJRG9tICE9IEIpCisgICAgICBCID0gSURvbTsgIC8vIFdhbGsgdXAgdGhlIHRyZWUKKyAgICByZXR1cm4gSURvbSAhPSBudWxscHRyOworICB9CisKKyAgLy8vIFxicmllZiBXaXBlIHRoaXMgdHJlZSdzIHN0YXRlIHdpdGhvdXQgcmVsZWFzaW5nIGFueSByZXNvdXJjZXMuCisgIC8vLworICAvLy8gVGhpcyBpcyBlc3NlbnRpYWxseSBhIHBvc3QtbW92ZSBoZWxwZXIgb25seS4gSXQgbGVhdmVzIHRoZSBvYmplY3QgaW4gYW4KKyAgLy8vIGFzc2lnbmFibGUgYW5kIGRlc3Ryb3lhYmxlIHN0YXRlLCBidXQgb3RoZXJ3aXNlIGludmFsaWQuCisgIHZvaWQgd2lwZSgpIHsKKyAgICBEb21UcmVlTm9kZXMuY2xlYXIoKTsKKyAgICBSb290Tm9kZSA9IG51bGxwdHI7CisgICAgUGFyZW50ID0gbnVsbHB0cjsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit1c2luZyBEb21UcmVlQmFzZSA9IERvbWluYXRvclRyZWVCYXNlPFQsIGZhbHNlPjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit1c2luZyBQb3N0RG9tVHJlZUJhc2UgPSBEb21pbmF0b3JUcmVlQmFzZTxULCB0cnVlPjsKKworLy8gVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgb3V0IG9mIGxpbmUgYXMgYSB3b3JrYXJvdW5kIGZvciBidWlsZGluZworLy8gd2l0aCBvbGQgKDwgcjE0NzI5NSkgdmVyc2lvbnMgb2YgY2xhbmcgYmVjYXVzZSBvZiBwcjExNjQyLgordGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVULCBib29sIElzUG9zdERvbT4KK2Jvb2wgRG9taW5hdG9yVHJlZUJhc2U8Tm9kZVQsIElzUG9zdERvbT46OmRvbWluYXRlcyhjb25zdCBOb2RlVCAqQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOb2RlVCAqQikgY29uc3QgeworICBpZiAoQSA9PSBCKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIENhc3QgYXdheSB0aGUgY29uc3QgcXVhbGlmaWVycyBoZXJlLiBUaGlzIGlzIG9rIHNpbmNlCisgIC8vIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBhY3R1YWxseSByZXR1cm4gdGhlIHZhbHVlcyByZXR1cm5lZAorICAvLyBmcm9tIGdldE5vZGUuCisgIHJldHVybiBkb21pbmF0ZXMoZ2V0Tm9kZShjb25zdF9jYXN0PE5vZGVUICo+KEEpKSwKKyAgICAgICAgICAgICAgICAgICBnZXROb2RlKGNvbnN0X2Nhc3Q8Tm9kZVQgKj4oQikpKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVCwgYm9vbCBJc1Bvc3REb20+Citib29sIERvbWluYXRvclRyZWVCYXNlPE5vZGVULCBJc1Bvc3REb20+Ojpwcm9wZXJseURvbWluYXRlcygKKyAgICBjb25zdCBOb2RlVCAqQSwgY29uc3QgTm9kZVQgKkIpIGNvbnN0IHsKKyAgaWYgKEEgPT0gQikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ2FzdCBhd2F5IHRoZSBjb25zdCBxdWFsaWZpZXJzIGhlcmUuIFRoaXMgaXMgb2sgc2luY2UKKyAgLy8gdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGFjdHVhbGx5IHJldHVybiB0aGUgdmFsdWVzIHJldHVybmVkCisgIC8vIGZyb20gZ2V0Tm9kZS4KKyAgcmV0dXJuIGRvbWluYXRlcyhnZXROb2RlKGNvbnN0X2Nhc3Q8Tm9kZVQgKj4oQSkpLAorICAgICAgICAgICAgICAgICAgIGdldE5vZGUoY29uc3RfY2FzdDxOb2RlVCAqPihCKSkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0dFTkVSSUNET01UUkVFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9HZW5lcmljRG9tVHJlZUNvbnN0cnVjdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0dlbmVyaWNEb21UcmVlQ29uc3RydWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjMDYzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9HZW5lcmljRG9tVHJlZUNvbnN0cnVjdGlvbi5oCkBAIC0wLDAgKzEsMTY3NCBAQAorLy89PT0tIEdlbmVyaWNEb21UcmVlQ29uc3RydWN0aW9uLmggLSBEb21pbmF0b3IgQ2FsY3VsYXRpb24gLS0tLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vCisvLy8gR2VuZXJpYyBkb21pbmF0b3IgdHJlZSBjb25zdHJ1Y3Rpb24gLSBUaGlzIGZpbGUgcHJvdmlkZXMgcm91dGluZXMgdG8KKy8vLyBjb25zdHJ1Y3QgaW1tZWRpYXRlIGRvbWluYXRvciBpbmZvcm1hdGlvbiBmb3IgYSBmbG93LWdyYXBoIGJhc2VkIG9uIHRoZQorLy8vIFNlbWktTkNBIGFsZ29yaXRobSBkZXNjcmliZWQgaW4gdGhpcyBkaXNzZXJ0YXRpb246CisvLy8KKy8vLyAgIExpbmVhci1UaW1lIEFsZ29yaXRobXMgZm9yIERvbWluYXRvcnMgYW5kIFJlbGF0ZWQgUHJvYmxlbXMKKy8vLyAgIExvdWthcyBHZW9yZ2lhZGlzLCBQcmluY2V0b24gVW5pdmVyc2l0eSwgTm92ZW1iZXIgMjAwNSwgcHAuIDIxLTIzOgorLy8vICAgZnRwOi8vZnRwLmNzLnByaW5jZXRvbi5lZHUvcmVwb3J0cy8yMDA1LzczNy5wZGYKKy8vLworLy8vIFRoaXMgaW1wbGVtZW50cyB0aGUgTyhuKmxvZyhuKSkgdmVyc2lvbnMgb2YgRVZBTCBhbmQgTElOSywgYmVjYXVzZSBpdCB0dXJucworLy8vIG91dCB0aGF0IHRoZSB0aGVvcmV0aWNhbGx5IHNsb3dlciBPKG4qbG9nKG4pKSBpbXBsZW1lbnRhdGlvbiBpcyBhY3R1YWxseQorLy8vIGZhc3RlciB0aGFuIHRoZSBhbG1vc3QtbGluZWFyIE8obiphbHBoYShuKSkgdmVyc2lvbiwgZXZlbiBmb3IgbGFyZ2UgQ0ZHcy4KKy8vLworLy8vIFRoZSBmaWxlIHVzZXMgdGhlIERlcHRoIEJhc2VkIFNlYXJjaCBhbGdvcml0aG0gdG8gcGVyZm9ybSBpbmNyZW1lbnRhbAorLy8vIHVwZGF0ZXMgKGluc2VydGlvbiBhbmQgZGVsZXRpb25zKS4gVGhlIGltcGxlbWVudGVkIGFsZ29yaXRobSBpcyBiYXNlZCBvbgorLy8vIHRoaXMgcHVibGljYXRpb246CisvLy8KKy8vLyAgIEFuIEV4cGVyaW1lbnRhbCBTdHVkeSBvZiBEeW5hbWljIERvbWluYXRvcnMKKy8vLyAgIExvdWthcyBHZW9yZ2lhZGlzLCBldCBhbC4sIEFwcmlsIDEyIDIwMTYsIHBwLiA1LTcsIDktMTA6CisvLy8gICBodHRwczovL2FyeGl2Lm9yZy9wZGYvMTYwNC4wMjcxMS5wZGYKKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfR0VORVJJQ0RPTVRSRUVDT05TVFJVQ1RJT05fSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfR0VORVJJQ0RPTVRSRUVDT05TVFJVQ1RJT05fSAorCisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvR2VuZXJpY0RvbVRyZWUuaCIKKworI2RlZmluZSBERUJVR19UWVBFICJkb20tdHJlZS1idWlsZGVyIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgRG9tVHJlZUJ1aWxkZXIgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRG9tVHJlZVQ+CitzdHJ1Y3QgU2VtaU5DQUluZm8geworICB1c2luZyBOb2RlUHRyID0gdHlwZW5hbWUgRG9tVHJlZVQ6Ok5vZGVQdHI7CisgIHVzaW5nIE5vZGVUID0gdHlwZW5hbWUgRG9tVHJlZVQ6Ok5vZGVUeXBlOworICB1c2luZyBUcmVlTm9kZVB0ciA9IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKjsKKyAgdXNpbmcgUm9vdHNUID0gZGVjbHR5cGUoRG9tVHJlZVQ6OlJvb3RzKTsKKyAgc3RhdGljIGNvbnN0ZXhwciBib29sIElzUG9zdERvbSA9IERvbVRyZWVUOjpJc1Bvc3REb21pbmF0b3I7CisKKyAgLy8gSW5mb3JtYXRpb24gcmVjb3JkIHVzZWQgYnkgU2VtaS1OQ0EgZHVyaW5nIHRyZWUgY29uc3RydWN0aW9uLgorICBzdHJ1Y3QgSW5mb1JlYyB7CisgICAgdW5zaWduZWQgREZTTnVtID0gMDsKKyAgICB1bnNpZ25lZCBQYXJlbnQgPSAwOworICAgIHVuc2lnbmVkIFNlbWkgPSAwOworICAgIE5vZGVQdHIgTGFiZWwgPSBudWxscHRyOworICAgIE5vZGVQdHIgSURvbSA9IG51bGxwdHI7CisgICAgU21hbGxWZWN0b3I8Tm9kZVB0ciwgMj4gUmV2ZXJzZUNoaWxkcmVuOworICB9OworCisgIC8vIE51bWJlciB0byBub2RlIG1hcHBpbmcgaXMgMS1iYXNlZC4gSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyB0byBzdGFydCB3aXRoCisgIC8vIGEgZHVtbXkgZWxlbWVudC4KKyAgc3RkOjp2ZWN0b3I8Tm9kZVB0cj4gTnVtVG9Ob2RlID0ge251bGxwdHJ9OworICBEZW5zZU1hcDxOb2RlUHRyLCBJbmZvUmVjPiBOb2RlVG9JbmZvOworCisgIHVzaW5nIFVwZGF0ZVQgPSB0eXBlbmFtZSBEb21UcmVlVDo6VXBkYXRlVHlwZTsKKyAgc3RydWN0IEJhdGNoVXBkYXRlSW5mbyB7CisgICAgU21hbGxWZWN0b3I8VXBkYXRlVCwgND4gVXBkYXRlczsKKyAgICB1c2luZyBOb2RlUHRyQW5kS2luZCA9IFBvaW50ZXJJbnRQYWlyPE5vZGVQdHIsIDEsIFVwZGF0ZUtpbmQ+OworCisgICAgLy8gSW4gb3JkZXIgdG8gYmUgYWJsZSB0byB3YWxrIGEgQ0ZHIHRoYXQgaXMgb3V0IG9mIHN5bmMgd2l0aCB0aGUgQ0ZHCisgICAgLy8gRG9taW5hdG9yVHJlZSBsYXN0IGtuZXcgYWJvdXQsIHVzZSB0aGUgbGlzdCBvZiB1cGRhdGVzIHRvIHJlY29uc3RydWN0CisgICAgLy8gcHJldmlvdXMgQ0ZHIHZlcnNpb25zIG9mIHRoZSBjdXJyZW50IENGRy4gRm9yIGVhY2ggbm9kZSwgd2Ugc3RvcmUgYSBzZXQKKyAgICAvLyBvZiBpdHMgdmlydHVhbGx5IGFkZGVkL2RlbGV0ZWQgZnV0dXJlIHN1Y2Nlc3NvcnMgYW5kIHByZWRlY2Vzc29ycy4KKyAgICAvLyBOb3RlIHRoYXQgdGhlc2UgY2hpbGRyZW4gYXJlIGZyb20gdGhlIGZ1dHVyZSByZWxhdGl2ZSB0byB3aGF0IHRoZQorICAgIC8vIERvbWluYXRvclRyZWUga25vd3MgYWJvdXQgLS0gdXNpbmcgdGhlbSB0byBnZXRzIHVzIHNvbWUgc25hcHNob3Qgb2YgdGhlCisgICAgLy8gQ0ZHIGZyb20gdGhlIHBhc3QgKHJlbGF0aXZlIHRvIHRoZSBzdGF0ZSBvZiB0aGUgQ0ZHKS4KKyAgICBEZW5zZU1hcDxOb2RlUHRyLCBTbWFsbERlbnNlU2V0PE5vZGVQdHJBbmRLaW5kLCA0Pj4gRnV0dXJlU3VjY2Vzc29yczsKKyAgICBEZW5zZU1hcDxOb2RlUHRyLCBTbWFsbERlbnNlU2V0PE5vZGVQdHJBbmRLaW5kLCA0Pj4gRnV0dXJlUHJlZGVjZXNzb3JzOworICAgIC8vIFJlbWVtYmVycyBpZiB0aGUgd2hvbGUgdHJlZSB3YXMgcmVjYWxjdWxhdGVkIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoZQorICAgIC8vIGN1cnJlbnQgYmF0Y2ggdXBkYXRlLgorICAgIGJvb2wgSXNSZWNhbGN1bGF0ZWQgPSBmYWxzZTsKKyAgfTsKKworICBCYXRjaFVwZGF0ZUluZm8gKkJhdGNoVXBkYXRlczsKKyAgdXNpbmcgQmF0Y2hVcGRhdGVQdHIgPSBCYXRjaFVwZGF0ZUluZm8gKjsKKworICAvLyBJZiBCVUkgaXMgYSBudWxscHRyLCB0aGVuIHRoZXJlJ3Mgbm8gYmF0Y2ggdXBkYXRlIGluIHByb2dyZXNzLgorICBTZW1pTkNBSW5mbyhCYXRjaFVwZGF0ZVB0ciBCVUkpIDogQmF0Y2hVcGRhdGVzKEJVSSkge30KKworICB2b2lkIGNsZWFyKCkgeworICAgIE51bVRvTm9kZSA9IHtudWxscHRyfTsgLy8gUmVzdG9yZSB0byBpbml0aWFsIHN0YXRlIHdpdGggYSBkdW1teSBzdGFydCBub2RlLgorICAgIE5vZGVUb0luZm8uY2xlYXIoKTsKKyAgICAvLyBEb24ndCByZXNldCB0aGUgcG9pbnRlciB0byBCYXRjaFVwZGF0ZUluZm8gaGVyZSAtLSBpZiB0aGVyZSdzIGFuIHVwZGF0ZQorICAgIC8vIGluIHByb2dyZXNzLCB3ZSBuZWVkIHRoaXMgaW5mb3JtYXRpb24gdG8gY29udGludWUgaXQuCisgIH0KKworICB0ZW1wbGF0ZSA8Ym9vbCBJbnZlcnNlPgorICBzdHJ1Y3QgQ2hpbGRyZW5HZXR0ZXIgeworICAgIHVzaW5nIFJlc3VsdFR5ID0gU21hbGxWZWN0b3I8Tm9kZVB0ciwgOD47CisKKyAgICBzdGF0aWMgUmVzdWx0VHkgR2V0KE5vZGVQdHIgTiwgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBmYWxzZT4pIHsKKyAgICAgIGF1dG8gUkNoaWxkcmVuID0gcmV2ZXJzZShjaGlsZHJlbjxOb2RlUHRyPihOKSk7CisgICAgICByZXR1cm4gUmVzdWx0VHkoUkNoaWxkcmVuLmJlZ2luKCksIFJDaGlsZHJlbi5lbmQoKSk7CisgICAgfQorCisgICAgc3RhdGljIFJlc3VsdFR5IEdldChOb2RlUHRyIE4sIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgdHJ1ZT4pIHsKKyAgICAgIGF1dG8gSUNoaWxkcmVuID0gaW52ZXJzZV9jaGlsZHJlbjxOb2RlUHRyPihOKTsKKyAgICAgIHJldHVybiBSZXN1bHRUeShJQ2hpbGRyZW4uYmVnaW4oKSwgSUNoaWxkcmVuLmVuZCgpKTsKKyAgICB9CisKKyAgICB1c2luZyBUYWcgPSBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIEludmVyc2U+OworCisgICAgLy8gVGhlIGZ1bmN0aW9uIGJlbG93IGlzIHRoZSBjb3JlIHBhcnQgb2YgdGhlIGJhdGNoIHVwZGF0ZXIuIEl0IGFsbG93cyB0aGUKKyAgICAvLyBEZXB0aCBCYXNlZCBTZWFyY2ggYWxnb3JpdGhtIHRvIHBlcmZvcm0gaW5jcmVtZW50YWwgdXBkYXRlcyBpbiBsb2Nrc3RlcAorICAgIC8vIHdpdGggdXBkYXRlcyB0byB0aGUgQ0ZHLiBXZSBlbXVsYXRlZCBsb2Nrc3RlcCBDRkcgdXBkYXRlcyBieSBnZXR0aW5nIGl0cworICAgIC8vIG5leHQgc25hcHNob3RzIGJ5IHJldmVyc2UtYXBwbHlpbmcgZnV0dXJlIHVwZGF0ZXMuCisgICAgc3RhdGljIFJlc3VsdFR5IEdldChOb2RlUHRyIE4sIEJhdGNoVXBkYXRlUHRyIEJVSSkgeworICAgICAgUmVzdWx0VHkgUmVzID0gR2V0KE4sIFRhZygpKTsKKyAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gYmF0Y2ggdXBkYXRlIGluIHByb2dyZXNzLCBzaW1wbHkgcmV0dXJuIG5vZGUncyBjaGlsZHJlbi4KKyAgICAgIGlmICghQlVJKSByZXR1cm4gUmVzOworCisgICAgICAvLyBDRkcgY2hpbGRyZW4gYXJlIGFjdHVhbGx5IGl0cyAqbW9zdCBjdXJyZW50KiBjaGlsZHJlbiwgYW5kIHdlIGhhdmUgdG8KKyAgICAgIC8vIHJldmVyc2UtYXBwbHkgdGhlIGZ1dHVyZSB1cGRhdGVzIHRvIGdldCB0aGUgbm9kZSdzIGNoaWxkcmVuIGF0IHRoZQorICAgICAgLy8gcG9pbnQgaW4gdGltZSB0aGUgdXBkYXRlIHdhcyBwZXJmb3JtZWQuCisgICAgICBhdXRvICZGdXR1cmVDaGlsZHJlbiA9IChJbnZlcnNlICE9IElzUG9zdERvbSkgPyBCVUktPkZ1dHVyZVByZWRlY2Vzc29ycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQlVJLT5GdXR1cmVTdWNjZXNzb3JzOworICAgICAgYXV0byBGQ0l0ID0gRnV0dXJlQ2hpbGRyZW4uZmluZChOKTsKKyAgICAgIGlmIChGQ0l0ID09IEZ1dHVyZUNoaWxkcmVuLmVuZCgpKSByZXR1cm4gUmVzOworCisgICAgICBmb3IgKGF1dG8gQ2hpbGRBbmRLaW5kIDogRkNJdC0+c2Vjb25kKSB7CisgICAgICAgIGNvbnN0IE5vZGVQdHIgQ2hpbGQgPSBDaGlsZEFuZEtpbmQuZ2V0UG9pbnRlcigpOworICAgICAgICBjb25zdCBVcGRhdGVLaW5kIFVLID0gQ2hpbGRBbmRLaW5kLmdldEludCgpOworCisgICAgICAgIC8vIFJldmVyc2UtYXBwbHkgdGhlIGZ1dHVyZSB1cGRhdGUuCisgICAgICAgIGlmIChVSyA9PSBVcGRhdGVLaW5kOjpJbnNlcnQpIHsKKyAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGluc2VydGlvbiBpbiB0aGUgZnV0dXJlLCBpdCBtZWFucyB0aGF0IHRoZSBlZGdlIG11c3QKKyAgICAgICAgICAvLyBleGlzdCBpbiB0aGUgY3VycmVudCBDRkcsIGJ1dCB3YXMgbm90IHByZXNlbnQgaW4gaXQgYmVmb3JlLgorICAgICAgICAgIGFzc2VydChsbHZtOjpmaW5kKFJlcywgQ2hpbGQpICE9IFJlcy5lbmQoKQorICAgICAgICAgICAgICAgICAmJiAiRXhwZWN0ZWQgY2hpbGQgbm90IGZvdW5kIGluIHRoZSBDRkciKTsKKyAgICAgICAgICBSZXMuZXJhc2Uoc3RkOjpyZW1vdmUoUmVzLmJlZ2luKCksIFJlcy5lbmQoKSwgQ2hpbGQpLCBSZXMuZW5kKCkpOworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRIaWRpbmcgZWRnZSAiIDw8IEJsb2NrTmFtZVByaW50ZXIoTikgPDwgIiAtPiAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IEJsb2NrTmFtZVByaW50ZXIoQ2hpbGQpIDw8ICJcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gZGVsZXRpb24gaW4gdGhlIGZ1dHVyZSwgaXQgbWVhbnMgdGhhdCB0aGUgZWRnZSBjYW5ub3QKKyAgICAgICAgICAvLyBleGlzdCBpbiB0aGUgY3VycmVudCBDRkcsIGJ1dCBleGlzdGVkIGluIGl0IGJlZm9yZS4KKyAgICAgICAgICBhc3NlcnQobGx2bTo6ZmluZChSZXMsIENoaWxkKSA9PSBSZXMuZW5kKCkgJiYKKyAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY2hpbGQgZm91bmQgaW4gdGhlIENGRyIpOworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRTaG93aW5nIHZpcnR1YWwgZWRnZSAiIDw8IEJsb2NrTmFtZVByaW50ZXIoTikKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAtPiAiIDw8IEJsb2NrTmFtZVByaW50ZXIoQ2hpbGQpIDw8ICJcbiIpOworICAgICAgICAgIFJlcy5wdXNoX2JhY2soQ2hpbGQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBSZXM7CisgICAgfQorICB9OworCisgIE5vZGVQdHIgZ2V0SURvbShOb2RlUHRyIEJCKSBjb25zdCB7CisgICAgYXV0byBJbmZvSXQgPSBOb2RlVG9JbmZvLmZpbmQoQkIpOworICAgIGlmIChJbmZvSXQgPT0gTm9kZVRvSW5mby5lbmQoKSkgcmV0dXJuIG51bGxwdHI7CisKKyAgICByZXR1cm4gSW5mb0l0LT5zZWNvbmQuSURvbTsKKyAgfQorCisgIFRyZWVOb2RlUHRyIGdldE5vZGVGb3JCbG9jayhOb2RlUHRyIEJCLCBEb21UcmVlVCAmRFQpIHsKKyAgICBpZiAoVHJlZU5vZGVQdHIgTm9kZSA9IERULmdldE5vZGUoQkIpKSByZXR1cm4gTm9kZTsKKworICAgIC8vIEhhdmVuJ3QgY2FsY3VsYXRlZCB0aGlzIG5vZGUgeWV0PyAgR2V0IG9yIGNhbGN1bGF0ZSB0aGUgbm9kZSBmb3IgdGhlCisgICAgLy8gaW1tZWRpYXRlIGRvbWluYXRvci4KKyAgICBOb2RlUHRyIElEb20gPSBnZXRJRG9tKEJCKTsKKworICAgIGFzc2VydChJRG9tIHx8IERULkRvbVRyZWVOb2Rlc1tudWxscHRyXSk7CisgICAgVHJlZU5vZGVQdHIgSURvbU5vZGUgPSBnZXROb2RlRm9yQmxvY2soSURvbSwgRFQpOworCisgICAgLy8gQWRkIGEgbmV3IHRyZWUgbm9kZSBmb3IgdGhpcyBOb2RlVCwgYW5kIGxpbmsgaXQgYXMgYSBjaGlsZCBvZgorICAgIC8vIElEb21Ob2RlCisgICAgcmV0dXJuIChEVC5Eb21UcmVlTm9kZXNbQkJdID0gSURvbU5vZGUtPmFkZENoaWxkKAorICAgICAgICBsbHZtOjptYWtlX3VuaXF1ZTxEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+PihCQiwgSURvbU5vZGUpKSkKKyAgICAgICAgLmdldCgpOworICB9CisKKyAgc3RhdGljIGJvb2wgQWx3YXlzRGVzY2VuZChOb2RlUHRyLCBOb2RlUHRyKSB7IHJldHVybiB0cnVlOyB9CisKKyAgc3RydWN0IEJsb2NrTmFtZVByaW50ZXIgeworICAgIE5vZGVQdHIgTjsKKworICAgIEJsb2NrTmFtZVByaW50ZXIoTm9kZVB0ciBCbG9jaykgOiBOKEJsb2NrKSB7fQorICAgIEJsb2NrTmFtZVByaW50ZXIoVHJlZU5vZGVQdHIgVE4pIDogTihUTiA/IFROLT5nZXRCbG9jaygpIDogbnVsbHB0cikge30KKworICAgIGZyaWVuZCByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmTywgY29uc3QgQmxvY2tOYW1lUHJpbnRlciAmQlApIHsKKyAgICAgIGlmICghQlAuTikKKyAgICAgICAgTyA8PCAibnVsbHB0ciI7CisgICAgICBlbHNlCisgICAgICAgIEJQLk4tPnByaW50QXNPcGVyYW5kKE8sIGZhbHNlKTsKKworICAgICAgcmV0dXJuIE87CisgICAgfQorICB9OworCisgIC8vIEN1c3RvbSBERlMgaW1wbGVtZW50YXRpb24gd2hpY2ggY2FuIHNraXAgbm9kZXMgYmFzZWQgb24gYSBwcm92aWRlZAorICAvLyBwcmVkaWNhdGUuIEl0IGFsc28gY29sbGVjdHMgUmV2ZXJzZUNoaWxkcmVuIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBzcGVuZAorICAvLyB0aW1lIGdldHRpbmcgcHJlZGVjZXNzb3JzIGluIFNlbWlOQ0EuCisgIC8vCisgIC8vIElmIElzUmV2ZXJzZSBpcyBzZXQgdG8gdHJ1ZSwgdGhlIERGUyB3YWxrIHdpbGwgYmUgcGVyZm9ybWVkIGJhY2t3YXJkcworICAvLyByZWxhdGl2ZSB0byBJc1Bvc3REb20gLS0gdXNpbmcgcmV2ZXJzZSBlZGdlcyBmb3IgZG9taW5hdG9ycyBhbmQgZm9yd2FyZAorICAvLyBlZGdlcyBmb3IgcG9zdGRvbWluYXRvcnMuCisgIHRlbXBsYXRlIDxib29sIElzUmV2ZXJzZSA9IGZhbHNlLCB0eXBlbmFtZSBEZXNjZW5kQ29uZGl0aW9uPgorICB1bnNpZ25lZCBydW5ERlMoTm9kZVB0ciBWLCB1bnNpZ25lZCBMYXN0TnVtLCBEZXNjZW5kQ29uZGl0aW9uIENvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEF0dGFjaFRvTnVtKSB7CisgICAgYXNzZXJ0KFYpOworICAgIFNtYWxsVmVjdG9yPE5vZGVQdHIsIDY0PiBXb3JrTGlzdCA9IHtWfTsKKyAgICBpZiAoTm9kZVRvSW5mby5jb3VudChWKSAhPSAwKSBOb2RlVG9JbmZvW1ZdLlBhcmVudCA9IEF0dGFjaFRvTnVtOworCisgICAgd2hpbGUgKCFXb3JrTGlzdC5lbXB0eSgpKSB7CisgICAgICBjb25zdCBOb2RlUHRyIEJCID0gV29ya0xpc3QucG9wX2JhY2tfdmFsKCk7CisgICAgICBhdXRvICZCQkluZm8gPSBOb2RlVG9JbmZvW0JCXTsKKworICAgICAgLy8gVmlzaXRlZCBub2RlcyBhbHdheXMgaGF2ZSBwb3NpdGl2ZSBERlMgbnVtYmVycy4KKyAgICAgIGlmIChCQkluZm8uREZTTnVtICE9IDApIGNvbnRpbnVlOworICAgICAgQkJJbmZvLkRGU051bSA9IEJCSW5mby5TZW1pID0gKytMYXN0TnVtOworICAgICAgQkJJbmZvLkxhYmVsID0gQkI7CisgICAgICBOdW1Ub05vZGUucHVzaF9iYWNrKEJCKTsKKworICAgICAgY29uc3RleHByIGJvb2wgRGlyZWN0aW9uID0gSXNSZXZlcnNlICE9IElzUG9zdERvbTsgIC8vIFhPUi4KKyAgICAgIGZvciAoY29uc3QgTm9kZVB0ciBTdWNjIDoKKyAgICAgICAgICAgQ2hpbGRyZW5HZXR0ZXI8RGlyZWN0aW9uPjo6R2V0KEJCLCBCYXRjaFVwZGF0ZXMpKSB7CisgICAgICAgIGNvbnN0IGF1dG8gU0lUID0gTm9kZVRvSW5mby5maW5kKFN1Y2MpOworICAgICAgICAvLyBEb24ndCB2aXNpdCBub2RlcyBtb3JlIHRoYW4gb25jZSBidXQgcmVtZW1iZXIgdG8gY29sbGVjdAorICAgICAgICAvLyBSZXZlcnNlQ2hpbGRyZW4uCisgICAgICAgIGlmIChTSVQgIT0gTm9kZVRvSW5mby5lbmQoKSAmJiBTSVQtPnNlY29uZC5ERlNOdW0gIT0gMCkgeworICAgICAgICAgIGlmIChTdWNjICE9IEJCKSBTSVQtPnNlY29uZC5SZXZlcnNlQ2hpbGRyZW4ucHVzaF9iYWNrKEJCKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghQ29uZGl0aW9uKEJCLCBTdWNjKSkgY29udGludWU7CisKKyAgICAgICAgLy8gSXQncyBmaW5lIHRvIGFkZCBTdWNjIHRvIHRoZSBtYXAsIGJlY2F1c2Ugd2Uga25vdyB0aGF0IGl0IHdpbGwgYmUKKyAgICAgICAgLy8gdmlzaXRlZCBsYXRlci4KKyAgICAgICAgYXV0byAmU3VjY0luZm8gPSBOb2RlVG9JbmZvW1N1Y2NdOworICAgICAgICBXb3JrTGlzdC5wdXNoX2JhY2soU3VjYyk7CisgICAgICAgIFN1Y2NJbmZvLlBhcmVudCA9IExhc3ROdW07CisgICAgICAgIFN1Y2NJbmZvLlJldmVyc2VDaGlsZHJlbi5wdXNoX2JhY2soQkIpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBMYXN0TnVtOworICB9CisKKyAgTm9kZVB0ciBldmFsKE5vZGVQdHIgVkluLCB1bnNpZ25lZCBMYXN0TGlua2VkKSB7CisgICAgYXV0byAmVkluSW5mbyA9IE5vZGVUb0luZm9bVkluXTsKKyAgICBpZiAoVkluSW5mby5ERlNOdW0gPCBMYXN0TGlua2VkKQorICAgICAgcmV0dXJuIFZJbjsKKworICAgIFNtYWxsVmVjdG9yPE5vZGVQdHIsIDMyPiBXb3JrOworICAgIFNtYWxsUHRyU2V0PE5vZGVQdHIsIDMyPiBWaXNpdGVkOworCisgICAgaWYgKFZJbkluZm8uUGFyZW50ID49IExhc3RMaW5rZWQpCisgICAgICBXb3JrLnB1c2hfYmFjayhWSW4pOworCisgICAgd2hpbGUgKCFXb3JrLmVtcHR5KCkpIHsKKyAgICAgIE5vZGVQdHIgViA9IFdvcmsuYmFjaygpOworICAgICAgYXV0byAmVkluZm8gPSBOb2RlVG9JbmZvW1ZdOworICAgICAgTm9kZVB0ciBWQW5jZXN0b3IgPSBOdW1Ub05vZGVbVkluZm8uUGFyZW50XTsKKworICAgICAgLy8gUHJvY2VzcyBBbmNlc3RvciBmaXJzdAorICAgICAgaWYgKFZpc2l0ZWQuaW5zZXJ0KFZBbmNlc3Rvcikuc2Vjb25kICYmIFZJbmZvLlBhcmVudCA+PSBMYXN0TGlua2VkKSB7CisgICAgICAgIFdvcmsucHVzaF9iYWNrKFZBbmNlc3Rvcik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgV29yay5wb3BfYmFjaygpOworCisgICAgICAvLyBVcGRhdGUgVkluZm8gYmFzZWQgb24gQW5jZXN0b3IgaW5mbworICAgICAgaWYgKFZJbmZvLlBhcmVudCA8IExhc3RMaW5rZWQpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBhdXRvICZWQUluZm8gPSBOb2RlVG9JbmZvW1ZBbmNlc3Rvcl07CisgICAgICBOb2RlUHRyIFZBbmNlc3RvckxhYmVsID0gVkFJbmZvLkxhYmVsOworICAgICAgTm9kZVB0ciBWTGFiZWwgPSBWSW5mby5MYWJlbDsKKyAgICAgIGlmIChOb2RlVG9JbmZvW1ZBbmNlc3RvckxhYmVsXS5TZW1pIDwgTm9kZVRvSW5mb1tWTGFiZWxdLlNlbWkpCisgICAgICAgIFZJbmZvLkxhYmVsID0gVkFuY2VzdG9yTGFiZWw7CisgICAgICBWSW5mby5QYXJlbnQgPSBWQUluZm8uUGFyZW50OworICAgIH0KKworICAgIHJldHVybiBWSW5JbmZvLkxhYmVsOworICB9CisKKyAgLy8gVGhpcyBmdW5jdGlvbiByZXF1aXJlcyBERlMgdG8gYmUgcnVuIGJlZm9yZSBjYWxsaW5nIGl0LgorICB2b2lkIHJ1blNlbWlOQ0EoRG9tVHJlZVQgJkRULCBjb25zdCB1bnNpZ25lZCBNaW5MZXZlbCA9IDApIHsKKyAgICBjb25zdCB1bnNpZ25lZCBOZXh0REZTTnVtKE51bVRvTm9kZS5zaXplKCkpOworICAgIC8vIEluaXRpYWxpemUgSURvbXMgdG8gc3Bhbm5pbmcgdHJlZSBwYXJlbnRzLgorICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPCBOZXh0REZTTnVtOyArK2kpIHsKKyAgICAgIGNvbnN0IE5vZGVQdHIgViA9IE51bVRvTm9kZVtpXTsKKyAgICAgIGF1dG8gJlZJbmZvID0gTm9kZVRvSW5mb1tWXTsKKyAgICAgIFZJbmZvLklEb20gPSBOdW1Ub05vZGVbVkluZm8uUGFyZW50XTsKKyAgICB9CisKKyAgICAvLyBTdGVwICMxOiBDYWxjdWxhdGUgdGhlIHNlbWlkb21pbmF0b3JzIG9mIGFsbCB2ZXJ0aWNlcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBOZXh0REZTTnVtIC0gMTsgaSA+PSAyOyAtLWkpIHsKKyAgICAgIE5vZGVQdHIgVyA9IE51bVRvTm9kZVtpXTsKKyAgICAgIGF1dG8gJldJbmZvID0gTm9kZVRvSW5mb1tXXTsKKworICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgc2VtaSBkb21pbmF0b3IgdG8gcG9pbnQgdG8gdGhlIHBhcmVudCBub2RlLgorICAgICAgV0luZm8uU2VtaSA9IFdJbmZvLlBhcmVudDsKKyAgICAgIGZvciAoY29uc3QgYXV0byAmTiA6IFdJbmZvLlJldmVyc2VDaGlsZHJlbikgeworICAgICAgICBpZiAoTm9kZVRvSW5mby5jb3VudChOKSA9PSAwKSAgLy8gU2tpcCB1bnJlYWNoYWJsZSBwcmVkZWNlc3NvcnMuCisgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgY29uc3QgVHJlZU5vZGVQdHIgVE4gPSBEVC5nZXROb2RlKE4pOworICAgICAgICAvLyBTa2lwIHByZWRlY2Vzc29ycyB3aG9zZSBsZXZlbCBpcyBhYm92ZSB0aGUgc3VidHJlZSB3ZSBhcmUgcHJvY2Vzc2luZy4KKyAgICAgICAgaWYgKFROICYmIFROLT5nZXRMZXZlbCgpIDwgTWluTGV2ZWwpCisgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgdW5zaWduZWQgU2VtaVUgPSBOb2RlVG9JbmZvW2V2YWwoTiwgaSArIDEpXS5TZW1pOworICAgICAgICBpZiAoU2VtaVUgPCBXSW5mby5TZW1pKSBXSW5mby5TZW1pID0gU2VtaVU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gU3RlcCAjMjogRXhwbGljaXRseSBkZWZpbmUgdGhlIGltbWVkaWF0ZSBkb21pbmF0b3Igb2YgZWFjaCB2ZXJ0ZXguCisgICAgLy8gICAgICAgICAgSURvbVtpXSA9IE5DQShTRG9tW2ldLCBTcGFubmluZ1RyZWVQYXJlbnQoaSkpLgorICAgIC8vIE5vdGUgdGhhdCB0aGUgcGFyZW50cyB3ZXJlIHN0b3JlZCBpbiBJRG9tcyBhbmQgbGF0ZXIgZ290IGludmFsaWRhdGVkCisgICAgLy8gZHVyaW5nIHBhdGggY29tcHJlc3Npb24gaW4gRXZhbC4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAyOyBpIDwgTmV4dERGU051bTsgKytpKSB7CisgICAgICBjb25zdCBOb2RlUHRyIFcgPSBOdW1Ub05vZGVbaV07CisgICAgICBhdXRvICZXSW5mbyA9IE5vZGVUb0luZm9bV107CisgICAgICBjb25zdCB1bnNpZ25lZCBTRG9tTnVtID0gTm9kZVRvSW5mb1tOdW1Ub05vZGVbV0luZm8uU2VtaV1dLkRGU051bTsKKyAgICAgIE5vZGVQdHIgV0lEb21DYW5kaWRhdGUgPSBXSW5mby5JRG9tOworICAgICAgd2hpbGUgKE5vZGVUb0luZm9bV0lEb21DYW5kaWRhdGVdLkRGU051bSA+IFNEb21OdW0pCisgICAgICAgIFdJRG9tQ2FuZGlkYXRlID0gTm9kZVRvSW5mb1tXSURvbUNhbmRpZGF0ZV0uSURvbTsKKworICAgICAgV0luZm8uSURvbSA9IFdJRG9tQ2FuZGlkYXRlOworICAgIH0KKyAgfQorCisgIC8vIFBvc3REb21pbmF0b3JUcmVlIGFsd2F5cyBoYXMgYSB2aXJ0dWFsIHJvb3QgdGhhdCByZXByZXNlbnRzIGEgdmlydHVhbCBDRkcKKyAgLy8gbm9kZSB0aGF0IHNlcnZlcyBhcyBhIHNpbmdsZSBleGl0IGZyb20gdGhlIGZ1bmN0aW9uLiBBbGwgdGhlIG90aGVyIGV4aXRzCisgIC8vIChDRkcgbm9kZXMgd2l0aCB0ZXJtaW5hdG9ycyBhbmQgbm9kZXMgaW4gaW5maW5pdGUgbG9vcHMgYXJlIGxvZ2ljYWxseQorICAvLyBjb25uZWN0ZWQgdG8gdGhpcyB2aXJ0dWFsIENGRyBleGl0IG5vZGUpLgorICAvLyBUaGlzIGZ1bmN0aW9ucyBtYXBzIGEgbnVsbHB0ciBDRkcgbm9kZSB0byB0aGUgdmlydHVhbCByb290IHRyZWUgbm9kZS4KKyAgdm9pZCBhZGRWaXJ0dWFsUm9vdCgpIHsKKyAgICBhc3NlcnQoSXNQb3N0RG9tICYmICJPbmx5IHBvc3Rkb21pbmF0b3JzIGhhdmUgYSB2aXJ0dWFsIHJvb3QiKTsKKyAgICBhc3NlcnQoTnVtVG9Ob2RlLnNpemUoKSA9PSAxICYmICJTTkNBSW5mbyBtdXN0IGJlIGZyZXNobHkgY29uc3RydWN0ZWQiKTsKKworICAgIGF1dG8gJkJCSW5mbyA9IE5vZGVUb0luZm9bbnVsbHB0cl07CisgICAgQkJJbmZvLkRGU051bSA9IEJCSW5mby5TZW1pID0gMTsKKyAgICBCQkluZm8uTGFiZWwgPSBudWxscHRyOworCisgICAgTnVtVG9Ob2RlLnB1c2hfYmFjayhudWxscHRyKTsgIC8vIE51bVRvTm9kZVsxXSA9IG51bGxwdHI7CisgIH0KKworICAvLyBGb3IgcG9zdGRvbWluYXRvcnMsIG5vZGVzIHdpdGggbm8gZm9yd2FyZCBzdWNjZXNzb3JzIGFyZSB0cml2aWFsIHJvb3RzIHRoYXQKKyAgLy8gYXJlIGFsd2F5cyBzZWxlY3RlZCBhcyB0cmVlIHJvb3RzLiBSb290cyB3aXRoIGZvcndhcmQgc3VjY2Vzc29ycyBjb3JyZXNwb25kCisgIC8vIHRvIENGRyBub2RlcyB3aXRoaW4gaW5maW5pdGUgbG9vcHMuCisgIHN0YXRpYyBib29sIEhhc0ZvcndhcmRTdWNjZXNzb3JzKGNvbnN0IE5vZGVQdHIgTiwgQmF0Y2hVcGRhdGVQdHIgQlVJKSB7CisgICAgYXNzZXJ0KE4gJiYgIk4gbXVzdCBiZSBhIHZhbGlkIG5vZGUiKTsKKyAgICByZXR1cm4gIUNoaWxkcmVuR2V0dGVyPGZhbHNlPjo6R2V0KE4sIEJVSSkuZW1wdHkoKTsKKyAgfQorCisgIHN0YXRpYyBOb2RlUHRyIEdldEVudHJ5Tm9kZShjb25zdCBEb21UcmVlVCAmRFQpIHsKKyAgICBhc3NlcnQoRFQuUGFyZW50ICYmICJQYXJlbnQgbm90IHNldCIpOworICAgIHJldHVybiBHcmFwaFRyYWl0czx0eXBlbmFtZSBEb21UcmVlVDo6UGFyZW50UHRyPjo6Z2V0RW50cnlOb2RlKERULlBhcmVudCk7CisgIH0KKworICAvLyBGaW5kcyBhbGwgcm9vdHMgd2l0aG91dCByZWxheWluZyBvbiB0aGUgc2V0IG9mIHJvb3RzIGFscmVhZHkgc3RvcmVkIGluIHRoZQorICAvLyB0cmVlLgorICAvLyBXZSBkZWZpbmUgcm9vdHMgdG8gYmUgc29tZSBub24tcmVkdW5kYW50IHNldCBvZiB0aGUgQ0ZHIG5vZGVzCisgIHN0YXRpYyBSb290c1QgRmluZFJvb3RzKGNvbnN0IERvbVRyZWVUICZEVCwgQmF0Y2hVcGRhdGVQdHIgQlVJKSB7CisgICAgYXNzZXJ0KERULlBhcmVudCAmJiAiUGFyZW50IHBvaW50ZXIgaXMgbm90IHNldCIpOworICAgIFJvb3RzVCBSb290czsKKworICAgIC8vIEZvciBkb21pbmF0b3JzLCBmdW5jdGlvbiBlbnRyeSBDRkcgbm9kZSBpcyBhbHdheXMgYSB0cmVlIHJvb3Qgbm9kZS4KKyAgICBpZiAoIUlzUG9zdERvbSkgeworICAgICAgUm9vdHMucHVzaF9iYWNrKEdldEVudHJ5Tm9kZShEVCkpOworICAgICAgcmV0dXJuIFJvb3RzOworICAgIH0KKworICAgIFNlbWlOQ0FJbmZvIFNOQ0EoQlVJKTsKKworICAgIC8vIFBvc3REb21pbmF0b3JUcmVlIGFsd2F5cyBoYXMgYSB2aXJ0dWFsIHJvb3QuCisgICAgU05DQS5hZGRWaXJ0dWFsUm9vdCgpOworICAgIHVuc2lnbmVkIE51bSA9IDE7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHRMb29raW5nIGZvciB0cml2aWFsIHJvb3RzXG4iKTsKKworICAgIC8vIFN0ZXAgIzE6IEZpbmQgYWxsIHRoZSB0cml2aWFsIHJvb3RzIHRoYXQgYXJlIGdvaW5nIHRvIHdpbGwgZGVmaW5pdGVseQorICAgIC8vIHJlbWFpbiB0cmVlIHJvb3RzLgorICAgIHVuc2lnbmVkIFRvdGFsID0gMDsKKyAgICAvLyBJdCBtYXkgaGFwcGVuIHRoYXQgdGhlcmUgYXJlIHNvbWUgbmV3IG5vZGVzIGluIHRoZSBDRkcgdGhhdCBhcmUgcmVzdWx0IG9mCisgICAgLy8gdGhlIG9uZ29pbmcgYmF0Y2ggdXBkYXRlLCBidXQgd2UgY2Fubm90IHJlYWxseSBwcmV0ZW5kIHRoYXQgdGhleSBkb24ndAorICAgIC8vIGV4aXN0IC0tIHdlIHdvbid0IHNlZSBhbnkgb3V0Z29pbmcgb3IgaW5jb21pbmcgZWRnZXMgdG8gdGhlbSwgc28gaXQncworICAgIC8vIGZpbmUgdG8gZGlzY292ZXIgdGhlbSBoZXJlLCBhcyB0aGV5IHdvdWxkIGVuZCB1cCBhcHBlYXJpbmcgaW4gdGhlIENGRyBhdAorICAgIC8vIHNvbWUgcG9pbnQgYW55d2F5LgorICAgIGZvciAoY29uc3QgTm9kZVB0ciBOIDogbm9kZXMoRFQuUGFyZW50KSkgeworICAgICAgKytUb3RhbDsKKyAgICAgIC8vIElmIGl0IGhhcyBubyAqc3VjY2Vzc29ycyosIGl0IGlzIGRlZmluaXRlbHkgYSByb290LgorICAgICAgaWYgKCFIYXNGb3J3YXJkU3VjY2Vzc29ycyhOLCBCVUkpKSB7CisgICAgICAgIFJvb3RzLnB1c2hfYmFjayhOKTsKKyAgICAgICAgLy8gUnVuIERGUyBub3QgdG8gd2FsayB0aGlzIHBhcnQgb2YgQ0ZHIGxhdGVyLgorICAgICAgICBOdW0gPSBTTkNBLnJ1bkRGUyhOLCBOdW0sIEFsd2F5c0Rlc2NlbmQsIDEpOworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIkZvdW5kIGEgbmV3IHRyaXZpYWwgcm9vdDogIiA8PCBCbG9ja05hbWVQcmludGVyKE4pCisgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iKTsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJMYXN0IHZpc2l0ZWQgbm9kZTogIgorICAgICAgICAgICAgICAgICAgICAgPDwgQmxvY2tOYW1lUHJpbnRlcihTTkNBLk51bVRvTm9kZVtOdW1dKSA8PCAiXG4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHRMb29raW5nIGZvciBub24tdHJpdmlhbCByb290c1xuIik7CisKKyAgICAvLyBTdGVwICMyOiBGaW5kIGFsbCBub24tdHJpdmlhbCByb290IGNhbmRpZGF0ZXMuIFRob3NlIGFyZSBDRkcgbm9kZXMgdGhhdAorICAgIC8vIGFyZSByZXZlcnNlLXVucmVhY2hhYmxlIHdlcmUgbm90IHZpc2l0ZWQgYnkgcHJldmlvdXMgREZTIHdhbGtzIChpLmUuIENGRworICAgIC8vIG5vZGVzIGluIGluZmluaXRlIGxvb3BzKS4KKyAgICBib29sIEhhc05vblRyaXZpYWxSb290cyA9IGZhbHNlOworICAgIC8vIEFjY291bnRpbmcgZm9yIHRoZSB2aXJ0dWFsIGV4aXQsIHNlZSBpZiB3ZSBoYWQgYW55IHJldmVyc2UtdW5yZWFjaGFibGUKKyAgICAvLyBub2Rlcy4KKyAgICBpZiAoVG90YWwgKyAxICE9IE51bSkgeworICAgICAgSGFzTm9uVHJpdmlhbFJvb3RzID0gdHJ1ZTsKKyAgICAgIC8vIE1ha2UgYW5vdGhlciBERlMgcGFzcyBvdmVyIGFsbCBvdGhlciBub2RlcyB0byBmaW5kIHRoZQorICAgICAgLy8gcmV2ZXJzZS11bnJlYWNoYWJsZSBibG9ja3MsIGFuZCBmaW5kIHRoZSBmdXJ0aGVzdCBwYXRocyB3ZSdsbCBiZSBhYmxlCisgICAgICAvLyB0byBtYWtlLgorICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgbG9va3MgTl4yLCBidXQgaXQncyByZWFsbHkgMk4gd29yc3QgY2FzZSwgaWYgZXZlcnkgbm9kZQorICAgICAgLy8gaXMgdW5yZWFjaGFibGUuIFRoaXMgaXMgYmVjYXVzZSB3ZSBhcmUgc3RpbGwgZ29pbmcgdG8gb25seSB2aXNpdCBlYWNoCisgICAgICAvLyB1bnJlYWNoYWJsZSBub2RlIG9uY2UsIHdlIG1heSBqdXN0IHZpc2l0IGl0IGluIHR3byBkaXJlY3Rpb25zLAorICAgICAgLy8gZGVwZW5kaW5nIG9uIGhvdyBsdWNreSB3ZSBnZXQuCisgICAgICBTbWFsbFB0clNldDxOb2RlUHRyLCA0PiBDb25uZWN0VG9FeGl0QmxvY2s7CisgICAgICBmb3IgKGNvbnN0IE5vZGVQdHIgSSA6IG5vZGVzKERULlBhcmVudCkpIHsKKyAgICAgICAgaWYgKFNOQ0EuTm9kZVRvSW5mby5jb3VudChJKSA9PSAwKSB7CisgICAgICAgICAgREVCVUcoZGJncygpIDw8ICJcdFx0XHRWaXNpdGluZyBub2RlICIgPDwgQmxvY2tOYW1lUHJpbnRlcihJKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iKTsKKyAgICAgICAgICAvLyBGaW5kIHRoZSBmdXJ0aGVzdCBhd2F5IHdlIGNhbiBnZXQgYnkgZm9sbG93aW5nIHN1Y2Nlc3NvcnMsIHRoZW4KKyAgICAgICAgICAvLyBmb2xsb3cgdGhlbSBpbiByZXZlcnNlLiAgVGhpcyBnaXZlcyB1cyBzb21lIHJlYXNvbmFibGUgYW5zd2VyIGFib3V0CisgICAgICAgICAgLy8gdGhlIHBvc3QtZG9tIHRyZWUgaW5zaWRlIGFueSBpbmZpbml0ZSBsb29wLiBJbiBwYXJ0aWN1bGFyLCBpdAorICAgICAgICAgIC8vIGd1YXJhbnRlZXMgd2UgZ2V0IHRvIHRoZSBmYXJ0aGVzdCBhd2F5IHBvaW50IGFsb25nICpzb21lKgorICAgICAgICAgIC8vIHBhdGguIFRoaXMgYWxzbyBtYXRjaGVzIHRoZSBHQ0MncyBiZWhhdmlvci4KKyAgICAgICAgICAvLyBJZiB3ZSByZWFsbHkgd2FudGVkIGEgdG90YWxseSBjb21wbGV0ZSBwaWN0dXJlIG9mIGRvbWluYW5jZSBpbnNpZGUKKyAgICAgICAgICAvLyB0aGlzIGluZmluaXRlIGxvb3AsIHdlIGNvdWxkIGRvIGl0IHdpdGggU0NDLWxpa2UgYWxnb3JpdGhtcyB0byBmaW5kCisgICAgICAgICAgLy8gdGhlIGxvd2VzdCBhbmQgaGlnaGVzdCBwb2ludHMgaW4gdGhlIGluZmluaXRlIGxvb3AuICBJbiB0aGVvcnksIGl0CisgICAgICAgICAgLy8gd291bGQgYmUgbmljZSB0byBnaXZlIHRoZSBjYW5vbmljYWwgYmFja2VkZ2UgZm9yIHRoZSBsb29wLCBidXQgaXQncworICAgICAgICAgIC8vIGV4cGVuc2l2ZSBhbmQgZG9lcyBub3QgYWx3YXlzIGxlYWQgdG8gYSBtaW5pbWFsIHNldCBvZiByb290cy4KKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHRcdFJ1bm5pbmcgZm9yd2FyZCBERlNcbiIpOworCisgICAgICAgICAgY29uc3QgdW5zaWduZWQgTmV3TnVtID0gU05DQS5ydW5ERlM8dHJ1ZT4oSSwgTnVtLCBBbHdheXNEZXNjZW5kLCBOdW0pOworICAgICAgICAgIGNvbnN0IE5vZGVQdHIgRnVydGhlc3RBd2F5ID0gU05DQS5OdW1Ub05vZGVbTmV3TnVtXTsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHRcdEZvdW5kIGEgbmV3IGZ1cnRoZXN0IGF3YXkgbm9kZSAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIobm9uLXRyaXZpYWwgcm9vdCk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgQmxvY2tOYW1lUHJpbnRlcihGdXJ0aGVzdEF3YXkpIDw8ICJcbiIpOworICAgICAgICAgIENvbm5lY3RUb0V4aXRCbG9jay5pbnNlcnQoRnVydGhlc3RBd2F5KTsKKyAgICAgICAgICBSb290cy5wdXNoX2JhY2soRnVydGhlc3RBd2F5KTsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHRcdFByZXYgREZTTnVtOiAiIDw8IE51bSA8PCAiLCBuZXcgREZTTnVtOiAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IE5ld051bSA8PCAiXG5cdFx0XHRSZW1vdmluZyBERlMgaW5mb1xuIik7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gTmV3TnVtOyBpID4gTnVtOyAtLWkpIHsKKyAgICAgICAgICAgIGNvbnN0IE5vZGVQdHIgTiA9IFNOQ0EuTnVtVG9Ob2RlW2ldOworICAgICAgICAgICAgREVCVUcoZGJncygpIDw8ICJcdFx0XHRcdFJlbW92aW5nIERGUyBpbmZvIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgQmxvY2tOYW1lUHJpbnRlcihOKSA8PCAiXG4iKTsKKyAgICAgICAgICAgIFNOQ0EuTm9kZVRvSW5mby5lcmFzZShOKTsKKyAgICAgICAgICAgIFNOQ0EuTnVtVG9Ob2RlLnBvcF9iYWNrKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIFByZXZOdW0gPSBOdW07CisgICAgICAgICAgREVCVUcoZGJncygpIDw8ICJcdFx0XHRSdW5uaW5nIHJldmVyc2UgREZTXG4iKTsKKyAgICAgICAgICBOdW0gPSBTTkNBLnJ1bkRGUyhGdXJ0aGVzdEF3YXksIE51bSwgQWx3YXlzRGVzY2VuZCwgMSk7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gUHJldk51bSArIDE7IGkgPD0gTnVtOyArK2kpCisgICAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHRcdFx0Zm91bmQgbm9kZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgQmxvY2tOYW1lUHJpbnRlcihTTkNBLk51bVRvTm9kZVtpXSkgPDwgIlxuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIlRvdGFsOiAiIDw8IFRvdGFsIDw8ICIsIE51bTogIiA8PCBOdW0gPDwgIlxuIik7CisgICAgREVCVUcoZGJncygpIDw8ICJEaXNjb3ZlcmVkIENGRyBub2RlczpcbiIpOworICAgIERFQlVHKGZvciAoc2l6ZV90IGkgPSAwOyBpIDw9IE51bTsgKytpKSBkYmdzKCkKKyAgICAgICAgICA8PCBpIDw8ICI6ICIgPDwgQmxvY2tOYW1lUHJpbnRlcihTTkNBLk51bVRvTm9kZVtpXSkgPDwgIlxuIik7CisKKyAgICBhc3NlcnQoKFRvdGFsICsgMSA9PSBOdW0pICYmICJFdmVyeXRoaW5nIHNob3VsZCBoYXZlIGJlZW4gdmlzaXRlZCIpOworCisgICAgLy8gU3RlcCAjMzogSWYgd2UgZm91bmQgc29tZSBub24tdHJpdmlhbCByb290cywgbWFrZSB0aGVtIG5vbi1yZWR1bmRhbnQuCisgICAgaWYgKEhhc05vblRyaXZpYWxSb290cykgUmVtb3ZlUmVkdW5kYW50Um9vdHMoRFQsIEJVSSwgUm9vdHMpOworCisgICAgREVCVUcoZGJncygpIDw8ICJGb3VuZCByb290czogIik7CisgICAgREVCVUcoZm9yIChhdXRvICpSb290IDogUm9vdHMpIGRiZ3MoKSA8PCBCbG9ja05hbWVQcmludGVyKFJvb3QpIDw8ICIgIik7CisgICAgREVCVUcoZGJncygpIDw8ICJcbiIpOworCisgICAgcmV0dXJuIFJvb3RzOworICB9CisKKyAgLy8gVGhpcyBmdW5jdGlvbiBvbmx5IG1ha2VzIHNlbnNlIGZvciBwb3N0ZG9taW5hdG9ycy4KKyAgLy8gV2UgZGVmaW5lIHJvb3RzIHRvIGJlIHNvbWUgc2V0IG9mIENGRyBub2RlcyB3aGVyZSAocmV2ZXJzZSkgREZTIHdhbGtzIGhhdmUKKyAgLy8gdG8gc3RhcnQgaW4gb3JkZXIgdG8gdmlzaXQgYWxsIHRoZSBDRkcgbm9kZXMgKGluY2x1ZGluZyB0aGUKKyAgLy8gcmV2ZXJzZS11bnJlYWNoYWJsZSBvbmVzKS4KKyAgLy8gV2hlbiB0aGUgc2VhcmNoIGZvciBub24tdHJpdmlhbCByb290cyBpcyBkb25lIGl0IG1heSBoYXBwZW4gdGhhdCBzb21lIG9mCisgIC8vIHRoZSBub24tdHJpdmlhbCByb290cyBhcmUgcmV2ZXJzZS1yZWFjaGFibGUgZnJvbSBvdGhlciBub24tdHJpdmlhbCByb290cywKKyAgLy8gd2hpY2ggbWFrZXMgdGhlbSByZWR1bmRhbnQuIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGVtIGZyb20gdGhlIHNldCBvZgorICAvLyBpbnB1dCByb290cy4KKyAgc3RhdGljIHZvaWQgUmVtb3ZlUmVkdW5kYW50Um9vdHMoY29uc3QgRG9tVHJlZVQgJkRULCBCYXRjaFVwZGF0ZVB0ciBCVUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvb3RzVCAmUm9vdHMpIHsKKyAgICBhc3NlcnQoSXNQb3N0RG9tICYmICJUaGlzIGZ1bmN0aW9uIGlzIGZvciBwb3N0ZG9taW5hdG9ycyBvbmx5Iik7CisgICAgREVCVUcoZGJncygpIDw8ICJSZW1vdmluZyByZWR1bmRhbnQgcm9vdHNcbiIpOworCisgICAgU2VtaU5DQUluZm8gU05DQShCVUkpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFJvb3RzLnNpemUoKTsgKytpKSB7CisgICAgICBhdXRvICZSb290ID0gUm9vdHNbaV07CisgICAgICAvLyBUcml2aWFsIHJvb3RzIGFyZSBhbHdheXMgbm9uLXJlZHVuZGFudC4KKyAgICAgIGlmICghSGFzRm9yd2FyZFN1Y2Nlc3NvcnMoUm9vdCwgQlVJKSkgY29udGludWU7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0Q2hlY2tpbmcgaWYgIiA8PCBCbG9ja05hbWVQcmludGVyKFJvb3QpCisgICAgICAgICAgICAgICAgICAgPDwgIiByZW1haW5zIGEgcm9vdFxuIik7CisgICAgICBTTkNBLmNsZWFyKCk7CisgICAgICAvLyBEbyBhIGZvcndhcmQgd2FsayBsb29raW5nIGZvciB0aGUgb3RoZXIgcm9vdHMuCisgICAgICBjb25zdCB1bnNpZ25lZCBOdW0gPSBTTkNBLnJ1bkRGUzx0cnVlPihSb290LCAwLCBBbHdheXNEZXNjZW5kLCAwKTsKKyAgICAgIC8vIFNraXAgdGhlIHN0YXJ0IG5vZGUgYW5kIGJlZ2luIGZyb20gdGhlIHNlY29uZCBvbmUgKG5vdGUgdGhhdCBERlMgdXNlcworICAgICAgLy8gMS1iYXNlZCBpbmRleGluZykuCisgICAgICBmb3IgKHVuc2lnbmVkIHggPSAyOyB4IDw9IE51bTsgKyt4KSB7CisgICAgICAgIGNvbnN0IE5vZGVQdHIgTiA9IFNOQ0EuTnVtVG9Ob2RlW3hdOworICAgICAgICAvLyBJZiB3ZSB3b3VuZCBhbm90aGVyIHJvb3QgaW4gYSAoZm9yd2FyZCkgREZTIHdhbGssIHJlbW92ZSB0aGUgY3VycmVudAorICAgICAgICAvLyByb290IGZyb20gdGhlIHNldCBvZiByb290cywgYXMgaXQgaXMgcmV2ZXJzZS1yZWFjaGFibGUgZnJvbSB0aGUgb3RoZXIKKyAgICAgICAgLy8gb25lLgorICAgICAgICBpZiAobGx2bTo6ZmluZChSb290cywgTikgIT0gUm9vdHMuZW5kKCkpIHsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0Rm9yd2FyZCBERlMgd2FsayBmb3VuZCBhbm90aGVyIHJvb3QgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBCbG9ja05hbWVQcmludGVyKE4pIDw8ICJcblx0UmVtb3Zpbmcgcm9vdCAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IEJsb2NrTmFtZVByaW50ZXIoUm9vdCkgPDwgIlxuIik7CisgICAgICAgICAgc3RkOjpzd2FwKFJvb3QsIFJvb3RzLmJhY2soKSk7CisgICAgICAgICAgUm9vdHMucG9wX2JhY2soKTsKKworICAgICAgICAgIC8vIFJvb3QgYXQgdGhlIGJhY2sgdGFrZXMgdGhlIGN1cnJlbnQgcm9vdCdzIHBsYWNlLgorICAgICAgICAgIC8vIFN0YXJ0IHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uIHdpdGggdGhlIHNhbWUgaW5kZXguCisgICAgICAgICAgLS1pOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERlc2NlbmRDb25kaXRpb24+CisgIHZvaWQgZG9GdWxsREZTV2Fsayhjb25zdCBEb21UcmVlVCAmRFQsIERlc2NlbmRDb25kaXRpb24gREMpIHsKKyAgICBpZiAoIUlzUG9zdERvbSkgeworICAgICAgYXNzZXJ0KERULlJvb3RzLnNpemUoKSA9PSAxICYmICJEb21pbmF0b3JzIHNob3VsZCBoYXZlIGEgc2luZ2Ugcm9vdCIpOworICAgICAgcnVuREZTKERULlJvb3RzWzBdLCAwLCBEQywgMCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgYWRkVmlydHVhbFJvb3QoKTsKKyAgICB1bnNpZ25lZCBOdW0gPSAxOworICAgIGZvciAoY29uc3QgTm9kZVB0ciBSb290IDogRFQuUm9vdHMpIE51bSA9IHJ1bkRGUyhSb290LCBOdW0sIERDLCAwKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIENhbGN1bGF0ZUZyb21TY3JhdGNoKERvbVRyZWVUICZEVCwgQmF0Y2hVcGRhdGVQdHIgQlVJKSB7CisgICAgYXV0byAqUGFyZW50ID0gRFQuUGFyZW50OworICAgIERULnJlc2V0KCk7CisgICAgRFQuUGFyZW50ID0gUGFyZW50OworICAgIFNlbWlOQ0FJbmZvIFNOQ0EobnVsbHB0cik7ICAvLyBTaW5jZSB3ZSBhcmUgcmVidWlsZGluZyB0aGUgd2hvbGUgdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUncyBubyBwb2ludCBkb2luZyBpdCBpbmNyZW1lbnRhbGx5LgorCisgICAgLy8gU3RlcCAjMDogTnVtYmVyIGJsb2NrcyBpbiBkZXB0aC1maXJzdCBvcmRlciBhbmQgaW5pdGlhbGl6ZSB2YXJpYWJsZXMgdXNlZAorICAgIC8vIGluIGxhdGVyIHN0YWdlcyBvZiB0aGUgYWxnb3JpdGhtLgorICAgIERULlJvb3RzID0gRmluZFJvb3RzKERULCBudWxscHRyKTsKKyAgICBTTkNBLmRvRnVsbERGU1dhbGsoRFQsIEFsd2F5c0Rlc2NlbmQpOworCisgICAgU05DQS5ydW5TZW1pTkNBKERUKTsKKyAgICBpZiAoQlVJKSB7CisgICAgICBCVUktPklzUmVjYWxjdWxhdGVkID0gdHJ1ZTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiRG9tVHJlZSByZWNhbGN1bGF0ZWQsIHNraXBwaW5nIGZ1dHVyZSBiYXRjaCB1cGRhdGVzXG4iKTsKKyAgICB9CisKKyAgICBpZiAoRFQuUm9vdHMuZW1wdHkoKSkgcmV0dXJuOworCisgICAgLy8gQWRkIGEgbm9kZSBmb3IgdGhlIHJvb3QuIElmIHRoZSB0cmVlIGlzIGEgUG9zdERvbWluYXRvclRyZWUgaXQgd2lsbCBiZQorICAgIC8vIHRoZSB2aXJ0dWFsIGV4aXQgKGRlbm90ZWQgYnkgKEJhc2ljQmxvY2sgKikgbnVsbHB0cikgd2hpY2ggcG9zdGRvbWluYXRlcworICAgIC8vIGFsbCByZWFsIGV4aXRzIChpbmNsdWRpbmcgbXVsdGlwbGUgZXhpdCBibG9ja3MsIGluZmluaXRlIGxvb3BzKS4KKyAgICBOb2RlUHRyIFJvb3QgPSBJc1Bvc3REb20gPyBudWxscHRyIDogRFQuUm9vdHNbMF07CisKKyAgICBEVC5Sb290Tm9kZSA9IChEVC5Eb21UcmVlTm9kZXNbUm9vdF0gPQorICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjptYWtlX3VuaXF1ZTxEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+PihSb290LCBudWxscHRyKSkKKyAgICAgICAgLmdldCgpOworICAgIFNOQ0EuYXR0YWNoTmV3U3VidHJlZShEVCwgRFQuUm9vdE5vZGUpOworICB9CisKKyAgdm9pZCBhdHRhY2hOZXdTdWJ0cmVlKERvbVRyZWVUJiBEVCwgY29uc3QgVHJlZU5vZGVQdHIgQXR0YWNoVG8pIHsKKyAgICAvLyBBdHRhY2ggdGhlIGZpcnN0IHVucmVhY2hhYmxlIGJsb2NrIHRvIEF0dGFjaFRvLgorICAgIE5vZGVUb0luZm9bTnVtVG9Ob2RlWzFdXS5JRG9tID0gQXR0YWNoVG8tPmdldEJsb2NrKCk7CisgICAgLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgZGlzY292ZXJlZCBibG9ja3MgaW4gdGhlIGZ1bmN0aW9uLi4uCisgICAgZm9yIChzaXplX3QgaSA9IDEsIGUgPSBOdW1Ub05vZGUuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgTm9kZVB0ciBXID0gTnVtVG9Ob2RlW2ldOworICAgICAgREVCVUcoZGJncygpIDw8ICJcdGRpc2NvdmVyZWQgYSBuZXcgcmVhY2hhYmxlIG5vZGUgIgorICAgICAgICAgICAgICAgICAgIDw8IEJsb2NrTmFtZVByaW50ZXIoVykgPDwgIlxuIik7CisKKyAgICAgIC8vIERvbid0IHJlcGxhY2UgdGhpcyB3aXRoICdjb3VudCcsIHRoZSBpbnNlcnRpb24gc2lkZSBlZmZlY3QgaXMgaW1wb3J0YW50CisgICAgICBpZiAoRFQuRG9tVHJlZU5vZGVzW1ddKSBjb250aW51ZTsgIC8vIEhhdmVuJ3QgY2FsY3VsYXRlZCB0aGlzIG5vZGUgeWV0PworCisgICAgICBOb2RlUHRyIEltbURvbSA9IGdldElEb20oVyk7CisKKyAgICAgIC8vIEdldCBvciBjYWxjdWxhdGUgdGhlIG5vZGUgZm9yIHRoZSBpbW1lZGlhdGUgZG9taW5hdG9yLgorICAgICAgVHJlZU5vZGVQdHIgSURvbU5vZGUgPSBnZXROb2RlRm9yQmxvY2soSW1tRG9tLCBEVCk7CisKKyAgICAgIC8vIEFkZCBhIG5ldyB0cmVlIG5vZGUgZm9yIHRoaXMgQmFzaWNCbG9jaywgYW5kIGxpbmsgaXQgYXMgYSBjaGlsZCBvZgorICAgICAgLy8gSURvbU5vZGUuCisgICAgICBEVC5Eb21UcmVlTm9kZXNbV10gPSBJRG9tTm9kZS0+YWRkQ2hpbGQoCisgICAgICAgICAgbGx2bTo6bWFrZV91bmlxdWU8RG9tVHJlZU5vZGVCYXNlPE5vZGVUPj4oVywgSURvbU5vZGUpKTsKKyAgICB9CisgIH0KKworICB2b2lkIHJlYXR0YWNoRXhpc3RpbmdTdWJ0cmVlKERvbVRyZWVUICZEVCwgY29uc3QgVHJlZU5vZGVQdHIgQXR0YWNoVG8pIHsKKyAgICBOb2RlVG9JbmZvW051bVRvTm9kZVsxXV0uSURvbSA9IEF0dGFjaFRvLT5nZXRCbG9jaygpOworICAgIGZvciAoc2l6ZV90IGkgPSAxLCBlID0gTnVtVG9Ob2RlLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNvbnN0IE5vZGVQdHIgTiA9IE51bVRvTm9kZVtpXTsKKyAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIFROID0gRFQuZ2V0Tm9kZShOKTsKKyAgICAgIGFzc2VydChUTik7CisgICAgICBjb25zdCBUcmVlTm9kZVB0ciBOZXdJRG9tID0gRFQuZ2V0Tm9kZShOb2RlVG9JbmZvW05dLklEb20pOworICAgICAgVE4tPnNldElEb20oTmV3SURvbSk7CisgICAgfQorICB9CisKKyAgLy8gSGVscGVyIHN0cnVjdCB1c2VkIGR1cmluZyBlZGdlIGluc2VydGlvbnMuCisgIHN0cnVjdCBJbnNlcnRpb25JbmZvIHsKKyAgICB1c2luZyBCdWNrZXRFbGVtZW50VHkgPSBzdGQ6OnBhaXI8dW5zaWduZWQsIFRyZWVOb2RlUHRyPjsKKyAgICBzdHJ1Y3QgRGVjcmVhc2luZ0xldmVsIHsKKyAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBCdWNrZXRFbGVtZW50VHkgJkZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ1Y2tldEVsZW1lbnRUeSAmU2Vjb25kKSBjb25zdCB7CisgICAgICAgIHJldHVybiBGaXJzdC5maXJzdCA+IFNlY29uZC5maXJzdDsKKyAgICAgIH0KKyAgICB9OworCisgICAgc3RkOjpwcmlvcml0eV9xdWV1ZTxCdWNrZXRFbGVtZW50VHksIFNtYWxsVmVjdG9yPEJ1Y2tldEVsZW1lbnRUeSwgOD4sCisgICAgICAgIERlY3JlYXNpbmdMZXZlbD4KKyAgICAgICAgQnVja2V0OyAgLy8gUXVldWUgb2YgdHJlZSBub2RlcyBzb3J0ZWQgYnkgbGV2ZWwgaW4gZGVzY2VuZGluZyBvcmRlci4KKyAgICBTbWFsbERlbnNlU2V0PFRyZWVOb2RlUHRyLCA4PiBBZmZlY3RlZDsKKyAgICBTbWFsbERlbnNlTWFwPFRyZWVOb2RlUHRyLCB1bnNpZ25lZCwgOD4gVmlzaXRlZDsKKyAgICBTbWFsbFZlY3RvcjxUcmVlTm9kZVB0ciwgOD4gQWZmZWN0ZWRRdWV1ZTsKKyAgICBTbWFsbFZlY3RvcjxUcmVlTm9kZVB0ciwgOD4gVmlzaXRlZE5vdEFmZmVjdGVkUXVldWU7CisgIH07CisKKyAgc3RhdGljIHZvaWQgSW5zZXJ0RWRnZShEb21UcmVlVCAmRFQsIGNvbnN0IEJhdGNoVXBkYXRlUHRyIEJVSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOb2RlUHRyIEZyb20sIGNvbnN0IE5vZGVQdHIgVG8pIHsKKyAgICBhc3NlcnQoKEZyb20gfHwgSXNQb3N0RG9tKSAmJgorICAgICAgICAgICAiRnJvbSBoYXMgdG8gYmUgYSB2YWxpZCBDRkcgbm9kZSBvciBhIHZpcnR1YWwgcm9vdCIpOworICAgIGFzc2VydChUbyAmJiAiQ2Fubm90IGJlIGEgbnVsbHB0ciIpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiSW5zZXJ0aW5nIGVkZ2UgIiA8PCBCbG9ja05hbWVQcmludGVyKEZyb20pIDw8ICIgLT4gIgorICAgICAgICAgICAgICAgICA8PCBCbG9ja05hbWVQcmludGVyKFRvKSA8PCAiXG4iKTsKKyAgICBUcmVlTm9kZVB0ciBGcm9tVE4gPSBEVC5nZXROb2RlKEZyb20pOworCisgICAgaWYgKCFGcm9tVE4pIHsKKyAgICAgIC8vIElnbm9yZSBlZGdlcyBmcm9tIHVucmVhY2hhYmxlIG5vZGVzIGZvciAoZm9yd2FyZCkgZG9taW5hdG9ycy4KKyAgICAgIGlmICghSXNQb3N0RG9tKSByZXR1cm47CisKKyAgICAgIC8vIFRoZSB1bnJlYWNoYWJsZSBub2RlIGJlY29tZXMgYSBuZXcgcm9vdCAtLSBhIHRyZWUgbm9kZSBmb3IgaXQuCisgICAgICBUcmVlTm9kZVB0ciBWaXJ0dWFsUm9vdCA9IERULmdldE5vZGUobnVsbHB0cik7CisgICAgICBGcm9tVE4gPQorICAgICAgICAgIChEVC5Eb21UcmVlTm9kZXNbRnJvbV0gPSBWaXJ0dWFsUm9vdC0+YWRkQ2hpbGQoCisgICAgICAgICAgICAgICBsbHZtOjptYWtlX3VuaXF1ZTxEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+PihGcm9tLCBWaXJ0dWFsUm9vdCkpKQorICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICBEVC5Sb290cy5wdXNoX2JhY2soRnJvbSk7CisgICAgfQorCisgICAgRFQuREZTSW5mb1ZhbGlkID0gZmFsc2U7CisKKyAgICBjb25zdCBUcmVlTm9kZVB0ciBUb1ROID0gRFQuZ2V0Tm9kZShUbyk7CisgICAgaWYgKCFUb1ROKQorICAgICAgSW5zZXJ0VW5yZWFjaGFibGUoRFQsIEJVSSwgRnJvbVROLCBUbyk7CisgICAgZWxzZQorICAgICAgSW5zZXJ0UmVhY2hhYmxlKERULCBCVUksIEZyb21UTiwgVG9UTik7CisgIH0KKworICAvLyBEZXRlcm1pbmVzIGlmIHNvbWUgZXhpc3Rpbmcgcm9vdCBiZWNvbWVzIHJldmVyc2UtcmVhY2hhYmxlIGFmdGVyIHRoZQorICAvLyBpbnNlcnRpb24uIFJlYnVpbGRzIHRoZSB3aG9sZSB0cmVlIGlmIHRoYXQgc2l0dWF0aW9uIGhhcHBlbnMuCisgIHN0YXRpYyBib29sIFVwZGF0ZVJvb3RzQmVmb3JlSW5zZXJ0aW9uKERvbVRyZWVUICZEVCwgY29uc3QgQmF0Y2hVcGRhdGVQdHIgQlVJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmVlTm9kZVB0ciBGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmVlTm9kZVB0ciBUbykgeworICAgIGFzc2VydChJc1Bvc3REb20gJiYgIlRoaXMgZnVuY3Rpb24gaXMgb25seSBmb3IgcG9zdGRvbWluYXRvcnMiKTsKKyAgICAvLyBEZXN0aW5hdGlvbiBub2RlIGlzIG5vdCBhdHRhY2hlZCB0byB0aGUgdmlydHVhbCByb290LCBzbyBpdCBjYW5ub3QgYmUgYQorICAgIC8vIHJvb3QuCisgICAgaWYgKCFEVC5pc1ZpcnR1YWxSb290KFRvLT5nZXRJRG9tKCkpKSByZXR1cm4gZmFsc2U7CisKKyAgICBhdXRvIFJJdCA9IGxsdm06OmZpbmQoRFQuUm9vdHMsIFRvLT5nZXRCbG9jaygpKTsKKyAgICBpZiAoUkl0ID09IERULlJvb3RzLmVuZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gVG8gaXMgbm90IGEgcm9vdCwgbm90aGluZyB0byB1cGRhdGUuCisKKyAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHRBZnRlciB0aGUgaW5zZXJ0aW9uLCAiIDw8IEJsb2NrTmFtZVByaW50ZXIoVG8pCisgICAgICAgICAgICAgICAgIDw8ICIgaXMgbm8gbG9uZ2VyIGEgcm9vdFxuXHRcdFJlYnVpbGRpbmcgdGhlIHRyZWUhISFcbiIpOworCisgICAgQ2FsY3VsYXRlRnJvbVNjcmF0Y2goRFQsIEJVSSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBVcGRhdGVzIHRoZSBzZXQgb2Ygcm9vdHMgYWZ0ZXIgaW5zZXJ0aW9uIG9yIGRlbGV0aW9uLiBUaGlzIGVuc3VyZXMgdGhhdAorICAvLyByb290cyBhcmUgdGhlIHNhbWUgd2hlbiBhZnRlciBhIHNlcmllcyBvZiB1cGRhdGVzIGFuZCB3aGVuIHRoZSB0cmVlIHdvdWxkCisgIC8vIGJlIGJ1aWx0IGZyb20gc2NyYXRjaC4KKyAgc3RhdGljIHZvaWQgVXBkYXRlUm9vdHNBZnRlclVwZGF0ZShEb21UcmVlVCAmRFQsIGNvbnN0IEJhdGNoVXBkYXRlUHRyIEJVSSkgeworICAgIGFzc2VydChJc1Bvc3REb20gJiYgIlRoaXMgZnVuY3Rpb24gaXMgb25seSBmb3IgcG9zdGRvbWluYXRvcnMiKTsKKworICAgIC8vIFRoZSB0cmVlIGhhcyBvbmx5IHRyaXZpYWwgcm9vdHMgLS0gbm90aGluZyB0byB1cGRhdGUuCisgICAgaWYgKHN0ZDo6bm9uZV9vZihEVC5Sb290cy5iZWdpbigpLCBEVC5Sb290cy5lbmQoKSwgW0JVSV0oY29uc3QgTm9kZVB0ciBOKSB7CisgICAgICAgICAgcmV0dXJuIEhhc0ZvcndhcmRTdWNjZXNzb3JzKE4sIEJVSSk7CisgICAgICAgIH0pKQorICAgICAgcmV0dXJuOworCisgICAgLy8gUmVjYWxjdWxhdGUgdGhlIHNldCBvZiByb290cy4KKyAgICBhdXRvIFJvb3RzID0gRmluZFJvb3RzKERULCBCVUkpOworICAgIGlmIChEVC5Sb290cy5zaXplKCkgIT0gUm9vdHMuc2l6ZSgpIHx8CisgICAgICAgICFzdGQ6OmlzX3Blcm11dGF0aW9uKERULlJvb3RzLmJlZ2luKCksIERULlJvb3RzLmVuZCgpLCBSb290cy5iZWdpbigpKSkgeworICAgICAgLy8gVGhlIHJvb3RzIGNob3NlbiBpbiB0aGUgQ0ZHIGhhdmUgY2hhbmdlZC4gVGhpcyBpcyBiZWNhdXNlIHRoZQorICAgICAgLy8gaW5jcmVtZW50YWwgYWxnb3JpdGhtIGRvZXMgbm90IHJlYWxseSBrbm93IG9yIHVzZSB0aGUgc2V0IG9mIHJvb3RzIGFuZAorICAgICAgLy8gY2FuIG1ha2UgYSBkaWZmZXJlbnQgKGltcGxpY2l0KSBkZWNpc2lvbiBhYm91dCB3aGljaCBub2RlIHdpdGhpbiBhbgorICAgICAgLy8gaW5maW5pdGUgbG9vcCBiZWNvbWVzIGEgcm9vdC4KKworICAgICAgREVCVUcoZGJncygpIDw8ICJSb290cyBhcmUgZGlmZmVyZW50IGluIHVwZGF0ZWQgdHJlZXNcbiIKKyAgICAgICAgICAgICAgICAgICA8PCAiVGhlIGVudGlyZSB0cmVlIG5lZWRzIHRvIGJlIHJlYnVpbHRcbiIpOworICAgICAgLy8gSXQgbWF5IGJlIHBvc3NpYmxlIHRvIHVwZGF0ZSB0aGUgdHJlZSB3aXRob3V0IHJlY2FsY3VsYXRpbmcgaXQsIGJ1dAorICAgICAgLy8gd2UgZG8gbm90IGtub3cgeWV0IGhvdyB0byBkbyBpdCwgYW5kIGl0IGhhcHBlbnMgcmFyZWx5IGluIHByYWN0aXNlLgorICAgICAgQ2FsY3VsYXRlRnJvbVNjcmF0Y2goRFQsIEJVSSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLy8gSGFuZGxlcyBpbnNlcnRpb24gdG8gYSBub2RlIGFscmVhZHkgaW4gdGhlIGRvbWluYXRvciB0cmVlLgorICBzdGF0aWMgdm9pZCBJbnNlcnRSZWFjaGFibGUoRG9tVHJlZVQgJkRULCBjb25zdCBCYXRjaFVwZGF0ZVB0ciBCVUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmVlTm9kZVB0ciBGcm9tLCBjb25zdCBUcmVlTm9kZVB0ciBUbykgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRSZWFjaGFibGUgIiA8PCBCbG9ja05hbWVQcmludGVyKEZyb20tPmdldEJsb2NrKCkpCisgICAgICAgICAgICAgICAgIDw8ICIgLT4gIiA8PCBCbG9ja05hbWVQcmludGVyKFRvLT5nZXRCbG9jaygpKSA8PCAiXG4iKTsKKyAgICBpZiAoSXNQb3N0RG9tICYmIFVwZGF0ZVJvb3RzQmVmb3JlSW5zZXJ0aW9uKERULCBCVUksIEZyb20sIFRvKSkgcmV0dXJuOworICAgIC8vIERULmZpbmROQ0QgZXhwZWN0cyBib3RoIHBvaW50ZXJzIHRvIGJlIHZhbGlkLiBXaGVuIEZyb20gaXMgYSB2aXJ0dWFsCisgICAgLy8gcm9vdCwgdGhlbiBpdHMgQ0ZHIGJsb2NrIHBvaW50ZXIgaXMgYSBudWxscHRyLCBzbyB3ZSBoYXZlIHRvICdjb21wdXRlJworICAgIC8vIHRoZSBOQ0QgbWFudWFsbHkuCisgICAgY29uc3QgTm9kZVB0ciBOQ0RCbG9jayA9CisgICAgICAgIChGcm9tLT5nZXRCbG9jaygpICYmIFRvLT5nZXRCbG9jaygpKQorICAgICAgICAgICAgPyBEVC5maW5kTmVhcmVzdENvbW1vbkRvbWluYXRvcihGcm9tLT5nZXRCbG9jaygpLCBUby0+Z2V0QmxvY2soKSkKKyAgICAgICAgICAgIDogbnVsbHB0cjsKKyAgICBhc3NlcnQoTkNEQmxvY2sgfHwgRFQuaXNQb3N0RG9taW5hdG9yKCkpOworICAgIGNvbnN0IFRyZWVOb2RlUHRyIE5DRCA9IERULmdldE5vZGUoTkNEQmxvY2spOworICAgIGFzc2VydChOQ0QpOworCisgICAgREVCVUcoZGJncygpIDw8ICJcdFx0TkNBID09ICIgPDwgQmxvY2tOYW1lUHJpbnRlcihOQ0QpIDw8ICJcbiIpOworICAgIGNvbnN0IFRyZWVOb2RlUHRyIFRvSURvbSA9IFRvLT5nZXRJRG9tKCk7CisKKyAgICAvLyBOb3RoaW5nIGFmZmVjdGVkIC0tIE5DQSBwcm9wZXJ0eSBob2xkcy4KKyAgICAvLyAoQmFzZWQgb24gdGhlIGxlbW1hIDIuNSBmcm9tIHRoZSBzZWNvbmQgcGFwZXIuKQorICAgIGlmIChOQ0QgPT0gVG8gfHwgTkNEID09IFRvSURvbSkgcmV0dXJuOworCisgICAgLy8gSWRlbnRpZnkgYW5kIGNvbGxlY3QgYWZmZWN0ZWQgbm9kZXMuCisgICAgSW5zZXJ0aW9uSW5mbyBJSTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIk1hcmtpbmcgIiA8PCBCbG9ja05hbWVQcmludGVyKFRvKSA8PCAiIGFzIGFmZmVjdGVkXG4iKTsKKyAgICBJSS5BZmZlY3RlZC5pbnNlcnQoVG8pOworICAgIGNvbnN0IHVuc2lnbmVkIFRvTGV2ZWwgPSBUby0+Z2V0TGV2ZWwoKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlB1dHRpbmcgIiA8PCBCbG9ja05hbWVQcmludGVyKFRvKSA8PCAiIGludG8gYSBCdWNrZXRcbiIpOworICAgIElJLkJ1Y2tldC5wdXNoKHtUb0xldmVsLCBUb30pOworCisgICAgd2hpbGUgKCFJSS5CdWNrZXQuZW1wdHkoKSkgeworICAgICAgY29uc3QgVHJlZU5vZGVQdHIgQ3VycmVudE5vZGUgPSBJSS5CdWNrZXQudG9wKCkuc2Vjb25kOworICAgICAgY29uc3QgdW5zaWduZWQgIEN1cnJlbnRMZXZlbCA9IEN1cnJlbnROb2RlLT5nZXRMZXZlbCgpOworICAgICAgSUkuQnVja2V0LnBvcCgpOworICAgICAgREVCVUcoZGJncygpIDw8ICJcdEFkZGluZyB0byBWaXNpdGVkIGFuZCBBZmZlY3RlZFF1ZXVlOiAiCisgICAgICAgICAgICAgICAgICAgPDwgQmxvY2tOYW1lUHJpbnRlcihDdXJyZW50Tm9kZSkgPDwgIlxuIik7CisKKyAgICAgIElJLlZpc2l0ZWQuaW5zZXJ0KHtDdXJyZW50Tm9kZSwgQ3VycmVudExldmVsfSk7CisgICAgICBJSS5BZmZlY3RlZFF1ZXVlLnB1c2hfYmFjayhDdXJyZW50Tm9kZSk7CisKKyAgICAgIC8vIERpc2NvdmVyIGFuZCBjb2xsZWN0IGFmZmVjdGVkIHN1Y2Nlc3NvcnMgb2YgdGhlIGN1cnJlbnQgbm9kZS4KKyAgICAgIFZpc2l0SW5zZXJ0aW9uKERULCBCVUksIEN1cnJlbnROb2RlLCBDdXJyZW50TGV2ZWwsIE5DRCwgSUkpOworICAgIH0KKworICAgIC8vIEZpbmlzaCBieSB1cGRhdGluZyBpbW1lZGlhdGUgZG9taW5hdG9ycyBhbmQgbGV2ZWxzLgorICAgIFVwZGF0ZUluc2VydGlvbihEVCwgQlVJLCBOQ0QsIElJKTsKKyAgfQorCisgIC8vIFZpc2l0cyBhbiBhZmZlY3RlZCBub2RlIGFuZCBjb2xsZWN0IGl0cyBhZmZlY3RlZCBzdWNjZXNzb3JzLgorICBzdGF0aWMgdm9pZCBWaXNpdEluc2VydGlvbihEb21UcmVlVCAmRFQsIGNvbnN0IEJhdGNoVXBkYXRlUHRyIEJVSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJlZU5vZGVQdHIgVE4sIGNvbnN0IHVuc2lnbmVkIFJvb3RMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJlZU5vZGVQdHIgTkNELCBJbnNlcnRpb25JbmZvICZJSSkgeworICAgIGNvbnN0IHVuc2lnbmVkIE5DRExldmVsID0gTkNELT5nZXRMZXZlbCgpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiVmlzaXRpbmcgIiA8PCBCbG9ja05hbWVQcmludGVyKFROKSA8PCAiLCAgUm9vdExldmVsICIKKyAgICAgICAgICAgICAgICAgPDwgUm9vdExldmVsIDw8ICJcbiIpOworCisgICAgU21hbGxWZWN0b3I8VHJlZU5vZGVQdHIsIDg+IFN0YWNrID0ge1ROfTsKKyAgICBhc3NlcnQoVE4tPmdldEJsb2NrKCkgJiYgSUkuVmlzaXRlZC5jb3VudChUTikgJiYgIlByZWNvbmRpdGlvbnMhIik7CisKKyAgICBTbWFsbFB0clNldDxUcmVlTm9kZVB0ciwgOD4gUHJvY2Vzc2VkOworCisgICAgZG8geworICAgICAgVHJlZU5vZGVQdHIgTmV4dCA9IFN0YWNrLnBvcF9iYWNrX3ZhbCgpOworICAgICAgREVCVUcoZGJncygpIDw8ICIgTmV4dDogIiA8PCBCbG9ja05hbWVQcmludGVyKE5leHQpIDw8ICJcbiIpOworCisgICAgICBmb3IgKGNvbnN0IE5vZGVQdHIgU3VjYyA6CisgICAgICAgICAgIENoaWxkcmVuR2V0dGVyPElzUG9zdERvbT46OkdldChOZXh0LT5nZXRCbG9jaygpLCBCVUkpKSB7CisgICAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIFN1Y2NUTiA9IERULmdldE5vZGUoU3VjYyk7CisgICAgICAgIGFzc2VydChTdWNjVE4gJiYgIlVucmVhY2hhYmxlIHN1Y2Nlc3NvciBmb3VuZCBhdCByZWFjaGFibGUgaW5zZXJ0aW9uIik7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIFN1Y2NMZXZlbCA9IFN1Y2NUTi0+Z2V0TGV2ZWwoKTsKKworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0U3VjY2Vzc29yICIgPDwgQmxvY2tOYW1lUHJpbnRlcihTdWNjKSA8PCAiLCBsZXZlbCA9ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IFN1Y2NMZXZlbCA8PCAiXG4iKTsKKworICAgICAgICAvLyBEbyBub3QgcHJvY2VzcyB0aGUgc2FtZSBub2RlIG11bHRpcGxlIHRpbWVzLgorICAgICAgICBpZiAoUHJvY2Vzc2VkLmNvdW50KE5leHQpID4gMCkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBTdWNjIGRvbWluYXRlZCBieSBzdWJ0cmVlIEZyb20gLS0gbm90IGFmZmVjdGVkLgorICAgICAgICAvLyAoQmFzZWQgb24gdGhlIGxlbW1hIDIuNSBmcm9tIHRoZSBzZWNvbmQgcGFwZXIuKQorICAgICAgICBpZiAoU3VjY0xldmVsID4gUm9vdExldmVsKSB7CisgICAgICAgICAgREVCVUcoZGJncygpIDw8ICJcdFx0RG9taW5hdGVkIGJ5IHN1YnRyZWUgRnJvbVxuIik7CisgICAgICAgICAgaWYgKElJLlZpc2l0ZWQuY291bnQoU3VjY1ROKSAhPSAwKSB7CisgICAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHRcdGFscmVhZHkgdmlzaXRlZCBhdCBsZXZlbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSUkuVmlzaXRlZFtTdWNjVE5dIDw8ICJcblx0XHRcdGN1cnJlbnQgbGV2ZWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFJvb3RMZXZlbCA8PCAiKVxuIik7CisKKyAgICAgICAgICAgIC8vIEEgbm9kZSBjYW4gYmUgbmVjZXNzYXJ5IHRvIHZpc2l0IGFnYWluIGlmIHdlIHNlZSBpdCBhZ2FpbiBhdAorICAgICAgICAgICAgLy8gYSBsb3dlciBsZXZlbCB0aGFuIGJlZm9yZS4KKyAgICAgICAgICAgIGlmIChJSS5WaXNpdGVkW1N1Y2NUTl0gPj0gUm9vdExldmVsKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHRNYXJraW5nIHZpc2l0ZWQgbm90IGFmZmVjdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgQmxvY2tOYW1lUHJpbnRlcihTdWNjKSA8PCAiXG4iKTsKKyAgICAgICAgICBJSS5WaXNpdGVkLmluc2VydCh7U3VjY1ROLCBSb290TGV2ZWx9KTsKKyAgICAgICAgICBJSS5WaXNpdGVkTm90QWZmZWN0ZWRRdWV1ZS5wdXNoX2JhY2soU3VjY1ROKTsKKyAgICAgICAgICBTdGFjay5wdXNoX2JhY2soU3VjY1ROKTsKKyAgICAgICAgfSBlbHNlIGlmICgoU3VjY0xldmVsID4gTkNETGV2ZWwgKyAxKSAmJgorICAgICAgICAgICAgSUkuQWZmZWN0ZWQuY291bnQoU3VjY1ROKSA9PSAwKSB7CisgICAgICAgICAgREVCVUcoZGJncygpIDw8ICJcdFx0TWFya2luZyBhZmZlY3RlZCBhbmQgYWRkaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgQmxvY2tOYW1lUHJpbnRlcihTdWNjKSA8PCAiIHRvIGEgQnVja2V0XG4iKTsKKyAgICAgICAgICBJSS5BZmZlY3RlZC5pbnNlcnQoU3VjY1ROKTsKKyAgICAgICAgICBJSS5CdWNrZXQucHVzaCh7U3VjY0xldmVsLCBTdWNjVE59KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBQcm9jZXNzZWQuaW5zZXJ0KE5leHQpOworICAgIH0gd2hpbGUgKCFTdGFjay5lbXB0eSgpKTsKKyAgfQorCisgIC8vIFVwZGF0ZXMgaW1tZWRpYXRlIGRvbWluYXRvcnMgYW5kIGxldmVscyBhZnRlciBpbnNlcnRpb24uCisgIHN0YXRpYyB2b2lkIFVwZGF0ZUluc2VydGlvbihEb21UcmVlVCAmRFQsIGNvbnN0IEJhdGNoVXBkYXRlUHRyIEJVSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIE5DRCwgSW5zZXJ0aW9uSW5mbyAmSUkpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlVwZGF0aW5nIE5DRCA9ICIgPDwgQmxvY2tOYW1lUHJpbnRlcihOQ0QpIDw8ICJcbiIpOworCisgICAgZm9yIChjb25zdCBUcmVlTm9kZVB0ciBUTiA6IElJLkFmZmVjdGVkUXVldWUpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRJRG9tKCIgPDwgQmxvY2tOYW1lUHJpbnRlcihUTikKKyAgICAgICAgICAgICAgICAgICA8PCAiKSA9ICIgPDwgQmxvY2tOYW1lUHJpbnRlcihOQ0QpIDw8ICJcbiIpOworICAgICAgVE4tPnNldElEb20oTkNEKTsKKyAgICB9CisKKyAgICBVcGRhdGVMZXZlbHNBZnRlckluc2VydGlvbihJSSk7CisgICAgaWYgKElzUG9zdERvbSkgVXBkYXRlUm9vdHNBZnRlclVwZGF0ZShEVCwgQlVJKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFVwZGF0ZUxldmVsc0FmdGVySW5zZXJ0aW9uKEluc2VydGlvbkluZm8gJklJKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJVcGRhdGluZyBsZXZlbHMgZm9yIHZpc2l0ZWQgYnV0IG5vdCBhZmZlY3RlZCBub2Rlc1xuIik7CisKKyAgICBmb3IgKGNvbnN0IFRyZWVOb2RlUHRyIFROIDogSUkuVmlzaXRlZE5vdEFmZmVjdGVkUXVldWUpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRsZXZlbCgiIDw8IEJsb2NrTmFtZVByaW50ZXIoVE4pIDw8ICIpID0gKCIKKyAgICAgICAgICAgICAgICAgICA8PCBCbG9ja05hbWVQcmludGVyKFROLT5nZXRJRG9tKCkpIDw8ICIpICIKKyAgICAgICAgICAgICAgICAgICA8PCBUTi0+Z2V0SURvbSgpLT5nZXRMZXZlbCgpIDw8ICIgKyAxXG4iKTsKKyAgICAgIFROLT5VcGRhdGVMZXZlbCgpOworICAgIH0KKyAgfQorCisgIC8vIEhhbmRsZXMgaW5zZXJ0aW9uIHRvIHByZXZpb3VzbHkgdW5yZWFjaGFibGUgbm9kZXMuCisgIHN0YXRpYyB2b2lkIEluc2VydFVucmVhY2hhYmxlKERvbVRyZWVUICZEVCwgY29uc3QgQmF0Y2hVcGRhdGVQdHIgQlVJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmVlTm9kZVB0ciBGcm9tLCBjb25zdCBOb2RlUHRyIFRvKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJJbnNlcnRpbmcgIiA8PCBCbG9ja05hbWVQcmludGVyKEZyb20pCisgICAgICAgICAgICAgICAgIDw8ICIgLT4gKHVucmVhY2hhYmxlKSAiIDw8IEJsb2NrTmFtZVByaW50ZXIoVG8pIDw8ICJcbiIpOworCisgICAgLy8gQ29sbGVjdCBkaXNjb3ZlcmVkIGVkZ2VzIHRvIGFscmVhZHkgcmVhY2hhYmxlIG5vZGVzLgorICAgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxOb2RlUHRyLCBUcmVlTm9kZVB0cj4sIDg+IERpc2NvdmVyZWRFZGdlc1RvUmVhY2hhYmxlOworICAgIC8vIERpc2NvdmVyIGFuZCBjb25uZWN0IG5vZGVzIHRoYXQgYmVjYW1lIHJlYWNoYWJsZSB3aXRoIHRoZSBpbnNlcnRpb24uCisgICAgQ29tcHV0ZVVucmVhY2hhYmxlRG9taW5hdG9ycyhEVCwgQlVJLCBUbywgRnJvbSwgRGlzY292ZXJlZEVkZ2VzVG9SZWFjaGFibGUpOworCisgICAgREVCVUcoZGJncygpIDw8ICJJbnNlcnRlZCAiIDw8IEJsb2NrTmFtZVByaW50ZXIoRnJvbSkKKyAgICAgICAgICAgICAgICAgPDwgIiAtPiAocHJldiB1bnJlYWNoYWJsZSkgIiA8PCBCbG9ja05hbWVQcmludGVyKFRvKSA8PCAiXG4iKTsKKworICAgIC8vIFVzZWQgdGhlIGRpc2NvdmVyZWQgZWRnZXMgYW5kIGluc2V0IGRpc2NvdmVyZWQgY29ubmVjdGluZyAoaW5jb21pbmcpCisgICAgLy8gZWRnZXMuCisgICAgZm9yIChjb25zdCBhdXRvICZFZGdlIDogRGlzY292ZXJlZEVkZ2VzVG9SZWFjaGFibGUpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRJbnNlcnRpbmcgZGlzY292ZXJlZCBjb25uZWN0aW5nIGVkZ2UgIgorICAgICAgICAgICAgICAgICAgIDw8IEJsb2NrTmFtZVByaW50ZXIoRWRnZS5maXJzdCkgPDwgIiAtPiAiCisgICAgICAgICAgICAgICAgICAgPDwgQmxvY2tOYW1lUHJpbnRlcihFZGdlLnNlY29uZCkgPDwgIlxuIik7CisgICAgICBJbnNlcnRSZWFjaGFibGUoRFQsIEJVSSwgRFQuZ2V0Tm9kZShFZGdlLmZpcnN0KSwgRWRnZS5zZWNvbmQpOworICAgIH0KKyAgfQorCisgIC8vIENvbm5lY3RzIG5vZGVzIHRoYXQgYmVjb21lIHJlYWNoYWJsZSB3aXRoIGFuIGluc2VydGlvbi4KKyAgc3RhdGljIHZvaWQgQ29tcHV0ZVVucmVhY2hhYmxlRG9taW5hdG9ycygKKyAgICAgIERvbVRyZWVUICZEVCwgY29uc3QgQmF0Y2hVcGRhdGVQdHIgQlVJLCBjb25zdCBOb2RlUHRyIFJvb3QsCisgICAgICBjb25zdCBUcmVlTm9kZVB0ciBJbmNvbWluZywKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8Tm9kZVB0ciwgVHJlZU5vZGVQdHI+PgorICAgICAgICAgICZEaXNjb3ZlcmVkQ29ubmVjdGluZ0VkZ2VzKSB7CisgICAgYXNzZXJ0KCFEVC5nZXROb2RlKFJvb3QpICYmICJSb290IG11c3Qgbm90IGJlIHJlYWNoYWJsZSIpOworCisgICAgLy8gVmlzaXQgb25seSBwcmV2aW91c2x5IHVucmVhY2hhYmxlIG5vZGVzLgorICAgIGF1dG8gVW5yZWFjaGFibGVEZXNjZW5kZXIgPSBbJkRULCAmRGlzY292ZXJlZENvbm5lY3RpbmdFZGdlc10oTm9kZVB0ciBGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZVB0ciBUbykgeworICAgICAgY29uc3QgVHJlZU5vZGVQdHIgVG9UTiA9IERULmdldE5vZGUoVG8pOworICAgICAgaWYgKCFUb1ROKSByZXR1cm4gdHJ1ZTsKKworICAgICAgRGlzY292ZXJlZENvbm5lY3RpbmdFZGdlcy5wdXNoX2JhY2soe0Zyb20sIFRvVE59KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9OworCisgICAgU2VtaU5DQUluZm8gU05DQShCVUkpOworICAgIFNOQ0EucnVuREZTKFJvb3QsIDAsIFVucmVhY2hhYmxlRGVzY2VuZGVyLCAwKTsKKyAgICBTTkNBLnJ1blNlbWlOQ0EoRFQpOworICAgIFNOQ0EuYXR0YWNoTmV3U3VidHJlZShEVCwgSW5jb21pbmcpOworCisgICAgREVCVUcoZGJncygpIDw8ICJBZnRlciBhZGRpbmcgdW5yZWFjaGFibGUgbm9kZXNcbiIpOworICB9CisKKyAgc3RhdGljIHZvaWQgRGVsZXRlRWRnZShEb21UcmVlVCAmRFQsIGNvbnN0IEJhdGNoVXBkYXRlUHRyIEJVSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOb2RlUHRyIEZyb20sIGNvbnN0IE5vZGVQdHIgVG8pIHsKKyAgICBhc3NlcnQoRnJvbSAmJiBUbyAmJiAiQ2Fubm90IGRpc2Nvbm5lY3QgbnVsbHB0cnMiKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkRlbGV0aW5nIGVkZ2UgIiA8PCBCbG9ja05hbWVQcmludGVyKEZyb20pIDw8ICIgLT4gIgorICAgICAgICAgICAgICAgICA8PCBCbG9ja05hbWVQcmludGVyKFRvKSA8PCAiXG4iKTsKKworI2lmbmRlZiBOREVCVUcKKyAgICAvLyBFbnN1cmUgdGhhdCB0aGUgZWRnZSB3YXMgaW4gZmFjdCBkZWxldGVkIGZyb20gdGhlIENGRyBiZWZvcmUgaW5mb3JtaW5nCisgICAgLy8gdGhlIERvbVRyZWUgYWJvdXQgaXQuCisgICAgLy8gVGhlIGNoZWNrIGlzIE8oTiksIHNvIHJ1biBpdCBvbmx5IGluIGRlYnVnIGNvbmZpZ3VyYXRpb24uCisgICAgYXV0byBJc1N1Y2Nlc3NvciA9IFtCVUldKGNvbnN0IE5vZGVQdHIgU3VjY0NhbmRpZGF0ZSwgY29uc3QgTm9kZVB0ciBPZikgeworICAgICAgYXV0byBTdWNjZXNzb3JzID0gQ2hpbGRyZW5HZXR0ZXI8SXNQb3N0RG9tPjo6R2V0KE9mLCBCVUkpOworICAgICAgcmV0dXJuIGxsdm06OmZpbmQoU3VjY2Vzc29ycywgU3VjY0NhbmRpZGF0ZSkgIT0gU3VjY2Vzc29ycy5lbmQoKTsKKyAgICB9OworICAgICh2b2lkKUlzU3VjY2Vzc29yOworICAgIGFzc2VydCghSXNTdWNjZXNzb3IoVG8sIEZyb20pICYmICJEZWxldGVkIGVkZ2Ugc3RpbGwgZXhpc3RzIGluIHRoZSBDRkchIik7CisjZW5kaWYKKworICAgIGNvbnN0IFRyZWVOb2RlUHRyIEZyb21UTiA9IERULmdldE5vZGUoRnJvbSk7CisgICAgLy8gRGVsZXRpb24gaW4gYW4gdW5yZWFjaGFibGUgc3VidHJlZSAtLSBub3RoaW5nIHRvIGRvLgorICAgIGlmICghRnJvbVROKSByZXR1cm47CisKKyAgICBjb25zdCBUcmVlTm9kZVB0ciBUb1ROID0gRFQuZ2V0Tm9kZShUbyk7CisgICAgaWYgKCFUb1ROKSB7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0VG8gKCIgPDwgQmxvY2tOYW1lUHJpbnRlcihUbykKKyAgICAgICAgICAgICAgICAgICA8PCAiKSBhbHJlYWR5IHVucmVhY2hhYmxlIC0tIHRoZXJlIGlzIG5vIGVkZ2UgdG8gZGVsZXRlXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBOb2RlUHRyIE5DREJsb2NrID0gRFQuZmluZE5lYXJlc3RDb21tb25Eb21pbmF0b3IoRnJvbSwgVG8pOworICAgIGNvbnN0IFRyZWVOb2RlUHRyIE5DRCA9IERULmdldE5vZGUoTkNEQmxvY2spOworCisgICAgLy8gSWYgVG8gZG9taW5hdGVzIEZyb20gLS0gbm90aGluZyB0byBkby4KKyAgICBpZiAoVG9UTiAhPSBOQ0QpIHsKKyAgICAgIERULkRGU0luZm9WYWxpZCA9IGZhbHNlOworCisgICAgICBjb25zdCBUcmVlTm9kZVB0ciBUb0lEb20gPSBUb1ROLT5nZXRJRG9tKCk7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0TkNEICIgPDwgQmxvY2tOYW1lUHJpbnRlcihOQ0QpIDw8ICIsIFRvSURvbSAiCisgICAgICAgICAgICAgICAgICAgPDwgQmxvY2tOYW1lUHJpbnRlcihUb0lEb20pIDw8ICJcbiIpOworCisgICAgICAvLyBUbyByZW1haW5zIHJlYWNoYWJsZSBhZnRlciBkZWxldGlvbi4KKyAgICAgIC8vIChCYXNlZCBvbiB0aGUgY2FwdGlvbiB1bmRlciBGaWd1cmUgNC4gZnJvbSB0aGUgc2Vjb25kIHBhcGVyLikKKyAgICAgIGlmIChGcm9tVE4gIT0gVG9JRG9tIHx8IEhhc1Byb3BlclN1cHBvcnQoRFQsIEJVSSwgVG9UTikpCisgICAgICAgIERlbGV0ZVJlYWNoYWJsZShEVCwgQlVJLCBGcm9tVE4sIFRvVE4pOworICAgICAgZWxzZQorICAgICAgICBEZWxldGVVbnJlYWNoYWJsZShEVCwgQlVJLCBUb1ROKTsKKyAgICB9CisKKyAgICBpZiAoSXNQb3N0RG9tKSBVcGRhdGVSb290c0FmdGVyVXBkYXRlKERULCBCVUkpOworICB9CisKKyAgLy8gSGFuZGxlcyBkZWxldGlvbnMgdGhhdCBsZWF2ZSBkZXN0aW5hdGlvbiBub2RlcyByZWFjaGFibGUuCisgIHN0YXRpYyB2b2lkIERlbGV0ZVJlYWNoYWJsZShEb21UcmVlVCAmRFQsIGNvbnN0IEJhdGNoVXBkYXRlUHRyIEJVSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIEZyb21UTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIFRvVE4pIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkRlbGV0aW5nIHJlYWNoYWJsZSAiIDw8IEJsb2NrTmFtZVByaW50ZXIoRnJvbVROKSA8PCAiIC0+ICIKKyAgICAgICAgICAgICAgICAgPDwgQmxvY2tOYW1lUHJpbnRlcihUb1ROKSA8PCAiXG4iKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlx0UmVidWlsZGluZyBzdWJ0cmVlXG4iKTsKKworICAgIC8vIEZpbmQgdGhlIHRvcCBvZiB0aGUgc3VidHJlZSB0aGF0IG5lZWRzIHRvIGJlIHJlYnVpbHQuCisgICAgLy8gKEJhc2VkIG9uIHRoZSBsZW1tYSAyLjYgZnJvbSB0aGUgc2Vjb25kIHBhcGVyLikKKyAgICBjb25zdCBOb2RlUHRyIFRvSURvbSA9CisgICAgICAgIERULmZpbmROZWFyZXN0Q29tbW9uRG9taW5hdG9yKEZyb21UTi0+Z2V0QmxvY2soKSwgVG9UTi0+Z2V0QmxvY2soKSk7CisgICAgYXNzZXJ0KFRvSURvbSB8fCBEVC5pc1Bvc3REb21pbmF0b3IoKSk7CisgICAgY29uc3QgVHJlZU5vZGVQdHIgVG9JRG9tVE4gPSBEVC5nZXROb2RlKFRvSURvbSk7CisgICAgYXNzZXJ0KFRvSURvbVROKTsKKyAgICBjb25zdCBUcmVlTm9kZVB0ciBQcmV2SURvbVN1YlRyZWUgPSBUb0lEb21UTi0+Z2V0SURvbSgpOworICAgIC8vIFRvcCBvZiB0aGUgc3VidHJlZSB0byByZWJ1aWxkIGlzIHRoZSByb290IG5vZGUuIFJlYnVpbGQgdGhlIHRyZWUgZnJvbQorICAgIC8vIHNjcmF0Y2guCisgICAgaWYgKCFQcmV2SURvbVN1YlRyZWUpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiVGhlIGVudGlyZSB0cmVlIG5lZWRzIHRvIGJlIHJlYnVpbHRcbiIpOworICAgICAgQ2FsY3VsYXRlRnJvbVNjcmF0Y2goRFQsIEJVSSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gT25seSB2aXNpdCBub2RlcyBpbiB0aGUgc3VidHJlZSBzdGFydGluZyBhdCBUby4KKyAgICBjb25zdCB1bnNpZ25lZCBMZXZlbCA9IFRvSURvbVROLT5nZXRMZXZlbCgpOworICAgIGF1dG8gRGVzY2VuZEJlbG93ID0gW0xldmVsLCAmRFRdKE5vZGVQdHIsIE5vZGVQdHIgVG8pIHsKKyAgICAgIHJldHVybiBEVC5nZXROb2RlKFRvKS0+Z2V0TGV2ZWwoKSA+IExldmVsOworICAgIH07CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIlx0VG9wIG9mIHN1YnRyZWU6ICIgPDwgQmxvY2tOYW1lUHJpbnRlcihUb0lEb21UTikgPDwgIlxuIik7CisKKyAgICBTZW1pTkNBSW5mbyBTTkNBKEJVSSk7CisgICAgU05DQS5ydW5ERlMoVG9JRG9tLCAwLCBEZXNjZW5kQmVsb3csIDApOworICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRSdW5uaW5nIFNlbWktTkNBXG4iKTsKKyAgICBTTkNBLnJ1blNlbWlOQ0EoRFQsIExldmVsKTsKKyAgICBTTkNBLnJlYXR0YWNoRXhpc3RpbmdTdWJ0cmVlKERULCBQcmV2SURvbVN1YlRyZWUpOworICB9CisKKyAgLy8gQ2hlY2tzIGlmIGEgbm9kZSBoYXMgcHJvcGVyIHN1cHBvcnQsIGFzIGRlZmluZWQgb24gdGhlIHBhZ2UgMyBhbmQgbGF0ZXIKKyAgLy8gZXhwbGFpbmVkIG9uIHRoZSBwYWdlIDcgb2YgdGhlIHNlY29uZCBwYXBlci4KKyAgc3RhdGljIGJvb2wgSGFzUHJvcGVyU3VwcG9ydChEb21UcmVlVCAmRFQsIGNvbnN0IEJhdGNoVXBkYXRlUHRyIEJVSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmVlTm9kZVB0ciBUTikgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiSXNSZWFjaGFibGVGcm9tSURvbSAiIDw8IEJsb2NrTmFtZVByaW50ZXIoVE4pIDw8ICJcbiIpOworICAgIGZvciAoY29uc3QgTm9kZVB0ciBQcmVkIDoKKyAgICAgICAgIENoaWxkcmVuR2V0dGVyPCFJc1Bvc3REb20+OjpHZXQoVE4tPmdldEJsb2NrKCksIEJVSSkpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRQcmVkICIgPDwgQmxvY2tOYW1lUHJpbnRlcihQcmVkKSA8PCAiXG4iKTsKKyAgICAgIGlmICghRFQuZ2V0Tm9kZShQcmVkKSkgY29udGludWU7CisKKyAgICAgIGNvbnN0IE5vZGVQdHIgU3VwcG9ydCA9CisgICAgICAgICAgRFQuZmluZE5lYXJlc3RDb21tb25Eb21pbmF0b3IoVE4tPmdldEJsb2NrKCksIFByZWQpOworICAgICAgREVCVUcoZGJncygpIDw8ICJcdFN1cHBvcnQgIiA8PCBCbG9ja05hbWVQcmludGVyKFN1cHBvcnQpIDw8ICJcbiIpOworICAgICAgaWYgKFN1cHBvcnQgIT0gVE4tPmdldEJsb2NrKCkpIHsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJcdCIgPDwgQmxvY2tOYW1lUHJpbnRlcihUTikKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaXMgcmVhY2hhYmxlIGZyb20gc3VwcG9ydCAiCisgICAgICAgICAgICAgICAgICAgICA8PCBCbG9ja05hbWVQcmludGVyKFN1cHBvcnQpIDw8ICJcbiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBIYW5kbGUgZGVsZXRpb25zIHRoYXQgbWFrZSBkZXN0aW5hdGlvbiBub2RlIHVucmVhY2hhYmxlLgorICAvLyAoQmFzZWQgb24gdGhlIGxlbW1hIDIuNyBmcm9tIHRoZSBzZWNvbmQgcGFwZXIuKQorICBzdGF0aWMgdm9pZCBEZWxldGVVbnJlYWNoYWJsZShEb21UcmVlVCAmRFQsIGNvbnN0IEJhdGNoVXBkYXRlUHRyIEJVSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJlZU5vZGVQdHIgVG9UTikgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiRGVsZXRpbmcgdW5yZWFjaGFibGUgc3VidHJlZSAiIDw8IEJsb2NrTmFtZVByaW50ZXIoVG9UTikKKyAgICAgICAgICAgICAgICAgPDwgIlxuIik7CisgICAgYXNzZXJ0KFRvVE4pOworICAgIGFzc2VydChUb1ROLT5nZXRCbG9jaygpKTsKKworICAgIGlmIChJc1Bvc3REb20pIHsKKyAgICAgIC8vIERlbGV0aW9uIG1ha2VzIGEgcmVnaW9uIHJldmVyc2UtdW5yZWFjaGFibGUgYW5kIGNyZWF0ZXMgYSBuZXcgcm9vdC4KKyAgICAgIC8vIFNpbXVsYXRlIHRoYXQgYnkgaW5zZXJ0aW5nIGFuIGVkZ2UgZnJvbSB0aGUgdmlydHVhbCByb290IHRvIFRvVE4gYW5kCisgICAgICAvLyBhZGRpbmcgaXQgYXMgYSBuZXcgcm9vdC4KKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHREZWxldGlvbiBtYWRlIGEgcmVnaW9uIHJldmVyc2UtdW5yZWFjaGFibGVcbiIpOworICAgICAgREVCVUcoZGJncygpIDw8ICJcdEFkZGluZyBuZXcgcm9vdCAiIDw8IEJsb2NrTmFtZVByaW50ZXIoVG9UTikgPDwgIlxuIik7CisgICAgICBEVC5Sb290cy5wdXNoX2JhY2soVG9UTi0+Z2V0QmxvY2soKSk7CisgICAgICBJbnNlcnRSZWFjaGFibGUoRFQsIEJVSSwgRFQuZ2V0Tm9kZShudWxscHRyKSwgVG9UTik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgU21hbGxWZWN0b3I8Tm9kZVB0ciwgMTY+IEFmZmVjdGVkUXVldWU7CisgICAgY29uc3QgdW5zaWduZWQgTGV2ZWwgPSBUb1ROLT5nZXRMZXZlbCgpOworCisgICAgLy8gVHJhdmVyc2UgZGVzdGluYXRpb24gbm9kZSdzIGRlc2NlbmRhbnRzIHdpdGggZ3JlYXRlciBsZXZlbCBpbiB0aGUgdHJlZQorICAgIC8vIGFuZCBjb2xsZWN0IHZpc2l0ZWQgbm9kZXMuCisgICAgYXV0byBEZXNjZW5kQW5kQ29sbGVjdCA9IFtMZXZlbCwgJkFmZmVjdGVkUXVldWUsICZEVF0oTm9kZVB0ciwgTm9kZVB0ciBUbykgeworICAgICAgY29uc3QgVHJlZU5vZGVQdHIgVE4gPSBEVC5nZXROb2RlKFRvKTsKKyAgICAgIGFzc2VydChUTik7CisgICAgICBpZiAoVE4tPmdldExldmVsKCkgPiBMZXZlbCkgcmV0dXJuIHRydWU7CisgICAgICBpZiAobGx2bTo6ZmluZChBZmZlY3RlZFF1ZXVlLCBUbykgPT0gQWZmZWN0ZWRRdWV1ZS5lbmQoKSkKKyAgICAgICAgQWZmZWN0ZWRRdWV1ZS5wdXNoX2JhY2soVG8pOworCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfTsKKworICAgIFNlbWlOQ0FJbmZvIFNOQ0EoQlVJKTsKKyAgICB1bnNpZ25lZCBMYXN0REZTTnVtID0KKyAgICAgICAgU05DQS5ydW5ERlMoVG9UTi0+Z2V0QmxvY2soKSwgMCwgRGVzY2VuZEFuZENvbGxlY3QsIDApOworCisgICAgVHJlZU5vZGVQdHIgTWluTm9kZSA9IFRvVE47CisKKyAgICAvLyBJZGVudGlmeSB0aGUgdG9wIG9mIHRoZSBzdWJ0cmVlIHRvIHJlYnVpbGQgYnkgZmluZGluZyB0aGUgTkNEIG9mIGFsbAorICAgIC8vIHRoZSBhZmZlY3RlZCBub2Rlcy4KKyAgICBmb3IgKGNvbnN0IE5vZGVQdHIgTiA6IEFmZmVjdGVkUXVldWUpIHsKKyAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIFROID0gRFQuZ2V0Tm9kZShOKTsKKyAgICAgIGNvbnN0IE5vZGVQdHIgTkNEQmxvY2sgPQorICAgICAgICAgIERULmZpbmROZWFyZXN0Q29tbW9uRG9taW5hdG9yKFROLT5nZXRCbG9jaygpLCBUb1ROLT5nZXRCbG9jaygpKTsKKyAgICAgIGFzc2VydChOQ0RCbG9jayB8fCBEVC5pc1Bvc3REb21pbmF0b3IoKSk7CisgICAgICBjb25zdCBUcmVlTm9kZVB0ciBOQ0QgPSBEVC5nZXROb2RlKE5DREJsb2NrKTsKKyAgICAgIGFzc2VydChOQ0QpOworCisgICAgICBERUJVRyhkYmdzKCkgPDwgIlByb2Nlc3NpbmcgYWZmZWN0ZWQgbm9kZSAiIDw8IEJsb2NrTmFtZVByaW50ZXIoVE4pCisgICAgICAgICAgICAgICAgICAgPDwgIiB3aXRoIE5DRCA9ICIgPDwgQmxvY2tOYW1lUHJpbnRlcihOQ0QpCisgICAgICAgICAgICAgICAgICAgPDwgIiwgTWluTm9kZSA9IiA8PCBCbG9ja05hbWVQcmludGVyKE1pbk5vZGUpIDw8ICJcbiIpOworICAgICAgaWYgKE5DRCAhPSBUTiAmJiBOQ0QtPmdldExldmVsKCkgPCBNaW5Ob2RlLT5nZXRMZXZlbCgpKSBNaW5Ob2RlID0gTkNEOworICAgIH0KKworICAgIC8vIFJvb3QgcmVhY2hlZCwgcmVidWlsZCB0aGUgd2hvbGUgdHJlZSBmcm9tIHNjcmF0Y2guCisgICAgaWYgKCFNaW5Ob2RlLT5nZXRJRG9tKCkpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiVGhlIGVudGlyZSB0cmVlIG5lZWRzIHRvIGJlIHJlYnVpbHRcbiIpOworICAgICAgQ2FsY3VsYXRlRnJvbVNjcmF0Y2goRFQsIEJVSSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRXJhc2UgdGhlIHVucmVhY2hhYmxlIHN1YnRyZWUgaW4gcmV2ZXJzZSBwcmVvcmRlciB0byBwcm9jZXNzIGFsbCBjaGlsZHJlbgorICAgIC8vIGJlZm9yZSBkZWxldGluZyB0aGVpciBwYXJlbnQuCisgICAgZm9yICh1bnNpZ25lZCBpID0gTGFzdERGU051bTsgaSA+IDA7IC0taSkgeworICAgICAgY29uc3QgTm9kZVB0ciBOID0gU05DQS5OdW1Ub05vZGVbaV07CisgICAgICBjb25zdCBUcmVlTm9kZVB0ciBUTiA9IERULmdldE5vZGUoTik7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIkVyYXNpbmcgbm9kZSAiIDw8IEJsb2NrTmFtZVByaW50ZXIoVE4pIDw8ICJcbiIpOworCisgICAgICBFcmFzZU5vZGUoRFQsIFROKTsKKyAgICB9CisKKyAgICAvLyBUaGUgYWZmZWN0ZWQgc3VidHJlZSBzdGFydCBhdCB0aGUgVG8gbm9kZSAtLSB0aGVyZSdzIG5vIGV4dHJhIHdvcmsgdG8gZG8uCisgICAgaWYgKE1pbk5vZGUgPT0gVG9UTikgcmV0dXJuOworCisgICAgREVCVUcoZGJncygpIDw8ICJEZWxldGVVbnJlYWNoYWJsZTogcnVubmluZyBERlMgd2l0aCBNaW5Ob2RlID0gIgorICAgICAgICAgICAgICAgICA8PCBCbG9ja05hbWVQcmludGVyKE1pbk5vZGUpIDw8ICJcbiIpOworICAgIGNvbnN0IHVuc2lnbmVkIE1pbkxldmVsID0gTWluTm9kZS0+Z2V0TGV2ZWwoKTsKKyAgICBjb25zdCBUcmVlTm9kZVB0ciBQcmV2SURvbSA9IE1pbk5vZGUtPmdldElEb20oKTsKKyAgICBhc3NlcnQoUHJldklEb20pOworICAgIFNOQ0EuY2xlYXIoKTsKKworICAgIC8vIElkZW50aWZ5IG5vZGVzIHRoYXQgcmVtYWluIGluIHRoZSBhZmZlY3RlZCBzdWJ0cmVlLgorICAgIGF1dG8gRGVzY2VuZEJlbG93ID0gW01pbkxldmVsLCAmRFRdKE5vZGVQdHIsIE5vZGVQdHIgVG8pIHsKKyAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIFRvVE4gPSBEVC5nZXROb2RlKFRvKTsKKyAgICAgIHJldHVybiBUb1ROICYmIFRvVE4tPmdldExldmVsKCkgPiBNaW5MZXZlbDsKKyAgICB9OworICAgIFNOQ0EucnVuREZTKE1pbk5vZGUtPmdldEJsb2NrKCksIDAsIERlc2NlbmRCZWxvdywgMCk7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIlByZXZpb3VzIElEb20oTWluTm9kZSkgPSAiIDw8IEJsb2NrTmFtZVByaW50ZXIoUHJldklEb20pCisgICAgICAgICAgICAgICAgIDw8ICJcblJ1bm5pbmcgU2VtaS1OQ0FcbiIpOworCisgICAgLy8gUmVidWlsZCB0aGUgcmVtYWluaW5nIHBhcnQgb2YgYWZmZWN0ZWQgc3VidHJlZS4KKyAgICBTTkNBLnJ1blNlbWlOQ0EoRFQsIE1pbkxldmVsKTsKKyAgICBTTkNBLnJlYXR0YWNoRXhpc3RpbmdTdWJ0cmVlKERULCBQcmV2SURvbSk7CisgIH0KKworICAvLyBSZW1vdmVzIGxlYWYgdHJlZSBub2RlcyBmcm9tIHRoZSBkb21pbmF0b3IgdHJlZS4KKyAgc3RhdGljIHZvaWQgRXJhc2VOb2RlKERvbVRyZWVUICZEVCwgY29uc3QgVHJlZU5vZGVQdHIgVE4pIHsKKyAgICBhc3NlcnQoVE4pOworICAgIGFzc2VydChUTi0+Z2V0TnVtQ2hpbGRyZW4oKSA9PSAwICYmICJOb3QgYSB0cmVlIGxlYWYiKTsKKworICAgIGNvbnN0IFRyZWVOb2RlUHRyIElEb20gPSBUTi0+Z2V0SURvbSgpOworICAgIGFzc2VydChJRG9tKTsKKworICAgIGF1dG8gQ2hJdCA9IGxsdm06OmZpbmQoSURvbS0+Q2hpbGRyZW4sIFROKTsKKyAgICBhc3NlcnQoQ2hJdCAhPSBJRG9tLT5DaGlsZHJlbi5lbmQoKSk7CisgICAgc3RkOjpzd2FwKCpDaEl0LCBJRG9tLT5DaGlsZHJlbi5iYWNrKCkpOworICAgIElEb20tPkNoaWxkcmVuLnBvcF9iYWNrKCk7CisKKyAgICBEVC5Eb21UcmVlTm9kZXMuZXJhc2UoVE4tPmdldEJsb2NrKCkpOworICB9CisKKyAgLy9+fgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEb21UcmVlIEJhdGNoIFVwZGF0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAgLy9+fgorCisgIHN0YXRpYyB2b2lkIEFwcGx5VXBkYXRlcyhEb21UcmVlVCAmRFQsIEFycmF5UmVmPFVwZGF0ZVQ+IFVwZGF0ZXMpIHsKKyAgICBjb25zdCBzaXplX3QgTnVtVXBkYXRlcyA9IFVwZGF0ZXMuc2l6ZSgpOworICAgIGlmIChOdW1VcGRhdGVzID09IDApCisgICAgICByZXR1cm47CisKKyAgICAvLyBUYWtlIHRoZSBmYXN0IHBhdGggZm9yIGEgc2luZ2xlIHVwZGF0ZSBhbmQgYXZvaWQgcnVubmluZyB0aGUgYmF0Y2ggdXBkYXRlCisgICAgLy8gbWFjaGluZXJ5LgorICAgIGlmIChOdW1VcGRhdGVzID09IDEpIHsKKyAgICAgIGNvbnN0IGF1dG8gJlVwZGF0ZSA9IFVwZGF0ZXMuZnJvbnQoKTsKKyAgICAgIGlmIChVcGRhdGUuZ2V0S2luZCgpID09IFVwZGF0ZUtpbmQ6Okluc2VydCkKKyAgICAgICAgRFQuaW5zZXJ0RWRnZShVcGRhdGUuZ2V0RnJvbSgpLCBVcGRhdGUuZ2V0VG8oKSk7CisgICAgICBlbHNlCisgICAgICAgIERULmRlbGV0ZUVkZ2UoVXBkYXRlLmdldEZyb20oKSwgVXBkYXRlLmdldFRvKCkpOworCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgQmF0Y2hVcGRhdGVJbmZvIEJVSTsKKyAgICBMZWdhbGl6ZVVwZGF0ZXMoVXBkYXRlcywgQlVJLlVwZGF0ZXMpOworCisgICAgY29uc3Qgc2l6ZV90IE51bUxlZ2FsaXplZCA9IEJVSS5VcGRhdGVzLnNpemUoKTsKKyAgICBCVUkuRnV0dXJlU3VjY2Vzc29ycy5yZXNlcnZlKE51bUxlZ2FsaXplZCk7CisgICAgQlVJLkZ1dHVyZVByZWRlY2Vzc29ycy5yZXNlcnZlKE51bUxlZ2FsaXplZCk7CisKKyAgICAvLyBVc2UgdGhlIGxlZ2FsaXplZCBmdXR1cmUgdXBkYXRlcyB0byBpbml0aWFsaXplIGZ1dHVyZSBzdWNjZXNzb3JzIGFuZAorICAgIC8vIHByZWRlY2Vzc29ycy4gTm90ZSB0aGF0IHRoZXNlIHNldHMgd2lsbCBvbmx5IGRlY3JlYXNlIHNpemUgb3ZlciB0aW1lLCBhcworICAgIC8vIHRoZSBuZXh0IENGRyBzbmFwc2hvdHMgc2xvd2x5IGFwcHJvYWNoIHRoZSBhY3R1YWwgKGN1cnJlbnQpIENGRy4KKyAgICBmb3IgKFVwZGF0ZVQgJlUgOiBCVUkuVXBkYXRlcykgeworICAgICAgQlVJLkZ1dHVyZVN1Y2Nlc3NvcnNbVS5nZXRGcm9tKCldLmluc2VydCh7VS5nZXRUbygpLCBVLmdldEtpbmQoKX0pOworICAgICAgQlVJLkZ1dHVyZVByZWRlY2Vzc29yc1tVLmdldFRvKCldLmluc2VydCh7VS5nZXRGcm9tKCksIFUuZ2V0S2luZCgpfSk7CisgICAgfQorCisgICAgREVCVUcoZGJncygpIDw8ICJBYm91dCB0byBhcHBseSAiIDw8IE51bUxlZ2FsaXplZCA8PCAiIHVwZGF0ZXNcbiIpOworICAgIERFQlVHKGlmIChOdW1MZWdhbGl6ZWQgPCAzMikgZm9yIChjb25zdCBhdXRvICZVCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmV2ZXJzZShCVUkuVXBkYXRlcykpIGRiZ3MoKQorICAgICAgICAgIDw8ICdcdCcgPDwgVSA8PCAiXG4iKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlxuIik7CisKKyAgICAvLyBJZiB0aGUgRG9taW5hdG9yVHJlZSB3YXMgcmVjYWxjdWxhdGVkIGF0IHNvbWUgcG9pbnQsIHN0b3AgdGhlIGJhdGNoCisgICAgLy8gdXBkYXRlcy4gRnVsbCByZWNhbGN1bGF0aW9ucyBpZ25vcmUgYmF0Y2ggdXBkYXRlcyBhbmQgbG9vayBhdCB0aGUgYWN0dWFsCisgICAgLy8gQ0ZHLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTnVtTGVnYWxpemVkICYmICFCVUkuSXNSZWNhbGN1bGF0ZWQ7ICsraSkKKyAgICAgIEFwcGx5TmV4dFVwZGF0ZShEVCwgQlVJKTsKKyAgfQorCisgIC8vIFRoaXMgZnVuY3Rpb24gc2VydmVzIGRvdWJsZSBwdXJwb3NlOgorICAvLyBhKSBJdCByZW1vdmVzIHJlZHVuZGFudCB1cGRhdGVzLCB3aGljaCBtYWtlcyBpdCBlYXNpZXIgdG8gcmV2ZXJzZS1hcHBseQorICAvLyAgICB0aGVtIHdoZW4gdHJhdmVyc2luZyBDRkcuCisgIC8vIGIpIEl0IG9wdGltaXplcyBhd2F5IHVwZGF0ZXMgdGhhdCBjYW5jZWwgZWFjaCBvdGhlciBvdXQsIGFzIHRoZSBlbmQgcmVzdWx0CisgIC8vICAgIGlzIHRoZSBzYW1lLgorICAvLworICAvLyBJdCByZWxpZXMgb24gdGhlIHByb3BlcnR5IG9mIHRoZSBpbmNyZW1lbnRhbCB1cGRhdGVzIHRoYXQgc2F5cyB0aGF0IHRoZQorICAvLyBvcmRlciBvZiB1cGRhdGVzIGRvZXNuJ3QgbWF0dGVyLiBUaGlzIGFsbG93cyB1cyB0byByZW9yZGVyIHRoZW0gYW5kIGVuZCB1cAorICAvLyB3aXRoIHRoZSBleGFjdCBzYW1lIERvbVRyZWUgZXZlcnkgdGltZS4KKyAgLy8KKyAgLy8gRm9sbG93aW5nIHRoZSBzYW1lIGxvZ2ljLCB0aGUgZnVuY3Rpb24gZG9lc24ndCBjYXJlIGFib3V0IHRoZSBvcmRlciBvZgorICAvLyBpbnB1dCB1cGRhdGVzLCBzbyBpdCdzIE9LIHRvIHBhc3MgaXQgYW4gdW5vcmRlcmVkIHNlcXVlbmNlIG9mIHVwZGF0ZXMsIHRoYXQKKyAgLy8gZG9lc24ndCBtYWtlIHNlbnNlIHdoZW4gYXBwbGllZCBzZXF1ZW50aWFsbHksIGVnLiBwZXJmb3JtaW5nIGRvdWJsZQorICAvLyBpbnNlcnRpb25zIG9yIGRlbGV0aW9ucyBhbmQgdGhlbiBkb2luZyBhbiBvcHBvc2l0ZSB1cGRhdGUuCisgIC8vCisgIC8vIEluIHRoZSBmdXR1cmUsIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBzY2hlZHVsZSB1cGRhdGVzIGluIHdheSB0aGF0CisgIC8vIG1pbmltaXplcyB0aGUgYW1vdW50IG9mIHdvcmsgbmVlZGVkIGRvbmUgZHVyaW5nIGluY3JlbWVudGFsIHVwZGF0ZXMuCisgIHN0YXRpYyB2b2lkIExlZ2FsaXplVXBkYXRlcyhBcnJheVJlZjxVcGRhdGVUPiBBbGxVcGRhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFVwZGF0ZVQ+ICZSZXN1bHQpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkxlZ2FsaXppbmcgIiA8PCBBbGxVcGRhdGVzLnNpemUoKSA8PCAiIHVwZGF0ZXNcbiIpOworICAgIC8vIENvdW50IHRoZSB0b3RhbCBudW1iZXIgb2YgaW5zZXJpb25zIG9mIGVhY2ggZWRnZS4KKyAgICAvLyBFYWNoIGluc2VydGlvbiBhZGRzIDEgYW5kIGRlbGV0aW9uIHN1YnRyYWN0cyAxLiBUaGUgZW5kIG51bWJlciBzaG91bGQgYmUKKyAgICAvLyBvbmUgb2Ygey0xIChkZWxldGlvbiksIDAgKE5PUCksICsxIChpbnNlcnRpb24pfS4gT3RoZXJ3aXNlLCB0aGUgc2VxdWVuY2UKKyAgICAvLyBvZiB1cGRhdGVzIGNvbnRhaW5zIG11bHRpcGxlIHVwZGF0ZXMgb2YgdGhlIHNhbWUga2luZCBhbmQgd2UgYXNzZXJ0IGZvcgorICAgIC8vIHRoYXQgY2FzZS4KKyAgICBTbWFsbERlbnNlTWFwPHN0ZDo6cGFpcjxOb2RlUHRyLCBOb2RlUHRyPiwgaW50LCA0PiBPcGVyYXRpb25zOworICAgIE9wZXJhdGlvbnMucmVzZXJ2ZShBbGxVcGRhdGVzLnNpemUoKSk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJlUgOiBBbGxVcGRhdGVzKSB7CisgICAgICBOb2RlUHRyIEZyb20gPSBVLmdldEZyb20oKTsKKyAgICAgIE5vZGVQdHIgVG8gPSBVLmdldFRvKCk7CisgICAgICBpZiAoSXNQb3N0RG9tKSBzdGQ6OnN3YXAoRnJvbSwgVG8pOyAgLy8gUmV2ZXJzZSBlZGdlIGZvciBwb3N0ZG9taW5hdG9ycy4KKworICAgICAgT3BlcmF0aW9uc1t7RnJvbSwgVG99XSArPSAoVS5nZXRLaW5kKCkgPT0gVXBkYXRlS2luZDo6SW5zZXJ0ID8gMSA6IC0xKTsKKyAgICB9CisKKyAgICBSZXN1bHQuY2xlYXIoKTsKKyAgICBSZXN1bHQucmVzZXJ2ZShPcGVyYXRpb25zLnNpemUoKSk7CisgICAgZm9yIChhdXRvICZPcCA6IE9wZXJhdGlvbnMpIHsKKyAgICAgIGNvbnN0IGludCBOdW1JbnNlcnRpb25zID0gT3Auc2Vjb25kOworICAgICAgYXNzZXJ0KHN0ZDo6YWJzKE51bUluc2VydGlvbnMpIDw9IDEgJiYgIlVuYmFsYW5jZWQgb3BlcmF0aW9ucyEiKTsKKyAgICAgIGlmIChOdW1JbnNlcnRpb25zID09IDApIGNvbnRpbnVlOworICAgICAgY29uc3QgVXBkYXRlS2luZCBVSyA9CisgICAgICAgICAgTnVtSW5zZXJ0aW9ucyA+IDAgPyBVcGRhdGVLaW5kOjpJbnNlcnQgOiBVcGRhdGVLaW5kOjpEZWxldGU7CisgICAgICBSZXN1bHQucHVzaF9iYWNrKHtVSywgT3AuZmlyc3QuZmlyc3QsIE9wLmZpcnN0LnNlY29uZH0pOworICAgIH0KKworICAgIC8vIE1ha2UgdGhlIG9yZGVyIGNvbnNpc3RlbnQgYnkgbm90IHJlbHlpbmcgb24gcG9pbnRlciB2YWx1ZXMgd2l0aGluIHRoZQorICAgIC8vIHNldC4gUmV1c2UgdGhlIG9sZCBPcGVyYXRpb25zIG1hcC4KKyAgICAvLyBJbiB0aGUgZnV0dXJlLCB3ZSBzaG91bGQgc29ydCBieSBzb21ldGhpbmcgZWxzZSB0byBtaW5pbWl6ZSB0aGUgYW1vdW50CisgICAgLy8gb2Ygd29yayBuZWVkZWQgdG8gcGVyZm9ybSB0aGUgc2VyaWVzIG9mIHVwZGF0ZXMuCisgICAgZm9yIChzaXplX3QgaSA9IDAsIGUgPSBBbGxVcGRhdGVzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGNvbnN0IGF1dG8gJlUgPSBBbGxVcGRhdGVzW2ldOworICAgICAgaWYgKCFJc1Bvc3REb20pCisgICAgICAgIE9wZXJhdGlvbnNbe1UuZ2V0RnJvbSgpLCBVLmdldFRvKCl9XSA9IGludChpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgT3BlcmF0aW9uc1t7VS5nZXRUbygpLCBVLmdldEZyb20oKX1dID0gaW50KGkpOworICAgIH0KKworICAgIHN0ZDo6c29ydChSZXN1bHQuYmVnaW4oKSwgUmVzdWx0LmVuZCgpLAorICAgICAgICAgICAgICBbJk9wZXJhdGlvbnNdKGNvbnN0IFVwZGF0ZVQgJkEsIGNvbnN0IFVwZGF0ZVQgJkIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uc1t7QS5nZXRGcm9tKCksIEEuZ2V0VG8oKX1dID4KKyAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uc1t7Qi5nZXRGcm9tKCksIEIuZ2V0VG8oKX1dOworICAgICAgICAgICAgICB9KTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIEFwcGx5TmV4dFVwZGF0ZShEb21UcmVlVCAmRFQsIEJhdGNoVXBkYXRlSW5mbyAmQlVJKSB7CisgICAgYXNzZXJ0KCFCVUkuVXBkYXRlcy5lbXB0eSgpICYmICJObyB1cGRhdGVzIHRvIGFwcGx5ISIpOworICAgIFVwZGF0ZVQgQ3VycmVudFVwZGF0ZSA9IEJVSS5VcGRhdGVzLnBvcF9iYWNrX3ZhbCgpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiQXBwbHlpbmcgdXBkYXRlOiAiIDw8IEN1cnJlbnRVcGRhdGUgPDwgIlxuIik7CisKKyAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IHNuYXBzaG90IG9mIHRoZSBDRkcgYnkgcmVtb3ZpbmcgdGhlIHJldmVyc2UtYXBwbGllZAorICAgIC8vIGN1cnJlbnQgdXBkYXRlLgorICAgIGF1dG8gJkZTID0gQlVJLkZ1dHVyZVN1Y2Nlc3NvcnNbQ3VycmVudFVwZGF0ZS5nZXRGcm9tKCldOworICAgIEZTLmVyYXNlKHtDdXJyZW50VXBkYXRlLmdldFRvKCksIEN1cnJlbnRVcGRhdGUuZ2V0S2luZCgpfSk7CisgICAgaWYgKEZTLmVtcHR5KCkpIEJVSS5GdXR1cmVTdWNjZXNzb3JzLmVyYXNlKEN1cnJlbnRVcGRhdGUuZ2V0RnJvbSgpKTsKKworICAgIGF1dG8gJkZQID0gQlVJLkZ1dHVyZVByZWRlY2Vzc29yc1tDdXJyZW50VXBkYXRlLmdldFRvKCldOworICAgIEZQLmVyYXNlKHtDdXJyZW50VXBkYXRlLmdldEZyb20oKSwgQ3VycmVudFVwZGF0ZS5nZXRLaW5kKCl9KTsKKyAgICBpZiAoRlAuZW1wdHkoKSkgQlVJLkZ1dHVyZVByZWRlY2Vzc29ycy5lcmFzZShDdXJyZW50VXBkYXRlLmdldFRvKCkpOworCisgICAgaWYgKEN1cnJlbnRVcGRhdGUuZ2V0S2luZCgpID09IFVwZGF0ZUtpbmQ6Okluc2VydCkKKyAgICAgIEluc2VydEVkZ2UoRFQsICZCVUksIEN1cnJlbnRVcGRhdGUuZ2V0RnJvbSgpLCBDdXJyZW50VXBkYXRlLmdldFRvKCkpOworICAgIGVsc2UKKyAgICAgIERlbGV0ZUVkZ2UoRFQsICZCVUksIEN1cnJlbnRVcGRhdGUuZ2V0RnJvbSgpLCBDdXJyZW50VXBkYXRlLmdldFRvKCkpOworICB9CisKKyAgLy9+fgorICAvLz09PS0tLS0tLS0tLS0tLS0tLSBEb21UcmVlIGNvcnJlY3RuZXNzIHZlcmlmaWNhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KKyAgLy9+fgorCisgIC8vIENoZWNrIGlmIHRoZSB0cmVlIGhhcyBjb3JyZWN0IHJvb3RzLiBBIERvbWluYXRvclRyZWUgYWx3YXlzIGhhcyBhIHNpbmdsZQorICAvLyByb290IHdoaWNoIGlzIHRoZSBmdW5jdGlvbidzIGVudHJ5IG5vZGUuIEEgUG9zdERvbWluYXRvclRyZWUgY2FuIGhhdmUKKyAgLy8gbXVsdGlwbGUgcm9vdHMgLSBvbmUgZm9yIGVhY2ggbm9kZSB3aXRoIG5vIHN1Y2Nlc3NvcnMgYW5kIGZvciBpbmZpbml0ZQorICAvLyBsb29wcy4KKyAgLy8gUnVubmluZyB0aW1lOiBPKE4pLgorICBib29sIHZlcmlmeVJvb3RzKGNvbnN0IERvbVRyZWVUICZEVCkgeworICAgIGlmICghRFQuUGFyZW50ICYmICFEVC5Sb290cy5lbXB0eSgpKSB7CisgICAgICBlcnJzKCkgPDwgIlRyZWUgaGFzIG5vIHBhcmVudCBidXQgaGFzIHJvb3RzIVxuIjsKKyAgICAgIGVycnMoKS5mbHVzaCgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghSXNQb3N0RG9tKSB7CisgICAgICBpZiAoRFQuUm9vdHMuZW1wdHkoKSkgeworICAgICAgICBlcnJzKCkgPDwgIlRyZWUgZG9lc24ndCBoYXZlIGEgcm9vdCFcbiI7CisgICAgICAgIGVycnMoKS5mbHVzaCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmIChEVC5nZXRSb290KCkgIT0gR2V0RW50cnlOb2RlKERUKSkgeworICAgICAgICBlcnJzKCkgPDwgIlRyZWUncyByb290IGlzIG5vdCBpdHMgcGFyZW50J3MgZW50cnkgbm9kZSFcbiI7CisgICAgICAgIGVycnMoKS5mbHVzaCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgUm9vdHNUIENvbXB1dGVkUm9vdHMgPSBGaW5kUm9vdHMoRFQsIG51bGxwdHIpOworICAgIGlmIChEVC5Sb290cy5zaXplKCkgIT0gQ29tcHV0ZWRSb290cy5zaXplKCkgfHwKKyAgICAgICAgIXN0ZDo6aXNfcGVybXV0YXRpb24oRFQuUm9vdHMuYmVnaW4oKSwgRFQuUm9vdHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXB1dGVkUm9vdHMuYmVnaW4oKSkpIHsKKyAgICAgIGVycnMoKSA8PCAiVHJlZSBoYXMgZGlmZmVyZW50IHJvb3RzIHRoYW4gZnJlc2hseSBjb21wdXRlZCBvbmVzIVxuIjsKKyAgICAgIGVycnMoKSA8PCAiXHRQRFQgcm9vdHM6ICI7CisgICAgICBmb3IgKGNvbnN0IE5vZGVQdHIgTiA6IERULlJvb3RzKSBlcnJzKCkgPDwgQmxvY2tOYW1lUHJpbnRlcihOKSA8PCAiLCAiOworICAgICAgZXJycygpIDw8ICJcblx0Q29tcHV0ZWQgcm9vdHM6ICI7CisgICAgICBmb3IgKGNvbnN0IE5vZGVQdHIgTiA6IENvbXB1dGVkUm9vdHMpCisgICAgICAgIGVycnMoKSA8PCBCbG9ja05hbWVQcmludGVyKE4pIDw8ICIsICI7CisgICAgICBlcnJzKCkgPDwgIlxuIjsKKyAgICAgIGVycnMoKS5mbHVzaCgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gQ2hlY2tzIGlmIHRoZSB0cmVlIGNvbnRhaW5zIGFsbCByZWFjaGFibGUgbm9kZXMgaW4gdGhlIGlucHV0IGdyYXBoLgorICAvLyBSdW5uaW5nIHRpbWU6IE8oTikuCisgIGJvb2wgdmVyaWZ5UmVhY2hhYmlsaXR5KGNvbnN0IERvbVRyZWVUICZEVCkgeworICAgIGNsZWFyKCk7CisgICAgZG9GdWxsREZTV2FsayhEVCwgQWx3YXlzRGVzY2VuZCk7CisKKyAgICBmb3IgKGF1dG8gJk5vZGVUb1ROIDogRFQuRG9tVHJlZU5vZGVzKSB7CisgICAgICBjb25zdCBUcmVlTm9kZVB0ciBUTiA9IE5vZGVUb1ROLnNlY29uZC5nZXQoKTsKKyAgICAgIGNvbnN0IE5vZGVQdHIgQkIgPSBUTi0+Z2V0QmxvY2soKTsKKworICAgICAgLy8gVmlydHVhbCByb290IGhhcyBhIGNvcnJlc3BvbmRpbmcgdmlydHVhbCBDRkcgbm9kZS4KKyAgICAgIGlmIChEVC5pc1ZpcnR1YWxSb290KFROKSkgY29udGludWU7CisKKyAgICAgIGlmIChOb2RlVG9JbmZvLmNvdW50KEJCKSA9PSAwKSB7CisgICAgICAgIGVycnMoKSA8PCAiRG9tVHJlZSBub2RlICIgPDwgQmxvY2tOYW1lUHJpbnRlcihCQikKKyAgICAgICAgICAgICAgIDw8ICIgbm90IGZvdW5kIGJ5IERGUyB3YWxrIVxuIjsKKyAgICAgICAgZXJycygpLmZsdXNoKCk7CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3QgTm9kZVB0ciBOIDogTnVtVG9Ob2RlKSB7CisgICAgICBpZiAoTiAmJiAhRFQuZ2V0Tm9kZShOKSkgeworICAgICAgICBlcnJzKCkgPDwgIkNGRyBub2RlICIgPDwgQmxvY2tOYW1lUHJpbnRlcihOKQorICAgICAgICAgICAgICAgPDwgIiBub3QgZm91bmQgaW4gdGhlIERvbVRyZWUhXG4iOworICAgICAgICBlcnJzKCkuZmx1c2goKTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBDaGVjayBpZiBmb3IgZXZlcnkgcGFyZW50IHdpdGggYSBsZXZlbCBMIGluIHRoZSB0cmVlIGFsbCBvZiBpdHMgY2hpbGRyZW4KKyAgLy8gaGF2ZSBsZXZlbCBMICsgMS4KKyAgLy8gUnVubmluZyB0aW1lOiBPKE4pLgorICBzdGF0aWMgYm9vbCBWZXJpZnlMZXZlbHMoY29uc3QgRG9tVHJlZVQgJkRUKSB7CisgICAgZm9yIChhdXRvICZOb2RlVG9UTiA6IERULkRvbVRyZWVOb2RlcykgeworICAgICAgY29uc3QgVHJlZU5vZGVQdHIgVE4gPSBOb2RlVG9UTi5zZWNvbmQuZ2V0KCk7CisgICAgICBjb25zdCBOb2RlUHRyIEJCID0gVE4tPmdldEJsb2NrKCk7CisgICAgICBpZiAoIUJCKSBjb250aW51ZTsKKworICAgICAgY29uc3QgVHJlZU5vZGVQdHIgSURvbSA9IFROLT5nZXRJRG9tKCk7CisgICAgICBpZiAoIUlEb20gJiYgVE4tPmdldExldmVsKCkgIT0gMCkgeworICAgICAgICBlcnJzKCkgPDwgIk5vZGUgd2l0aG91dCBhbiBJRG9tICIgPDwgQmxvY2tOYW1lUHJpbnRlcihCQikKKyAgICAgICAgICAgICAgIDw8ICIgaGFzIGEgbm9uemVybyBsZXZlbCAiIDw8IFROLT5nZXRMZXZlbCgpIDw8ICIhXG4iOworICAgICAgICBlcnJzKCkuZmx1c2goKTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmIChJRG9tICYmIFROLT5nZXRMZXZlbCgpICE9IElEb20tPmdldExldmVsKCkgKyAxKSB7CisgICAgICAgIGVycnMoKSA8PCAiTm9kZSAiIDw8IEJsb2NrTmFtZVByaW50ZXIoQkIpIDw8ICIgaGFzIGxldmVsICIKKyAgICAgICAgICAgICAgIDw8IFROLT5nZXRMZXZlbCgpIDw8ICIgd2hpbGUgaXRzIElEb20gIgorICAgICAgICAgICAgICAgPDwgQmxvY2tOYW1lUHJpbnRlcihJRG9tLT5nZXRCbG9jaygpKSA8PCAiIGhhcyBsZXZlbCAiCisgICAgICAgICAgICAgICA8PCBJRG9tLT5nZXRMZXZlbCgpIDw8ICIhXG4iOworICAgICAgICBlcnJzKCkuZmx1c2goKTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBDaGVjayBpZiB0aGUgY29tcHV0ZWQgREZTIG51bWJlcnMgYXJlIGNvcnJlY3QuIE5vdGUgdGhhdCBERlMgaW5mbyBtYXkgbm90CisgIC8vIGJlIHZhbGlkLCBhbmQgd2hlbiB0aGF0IGlzIHRoZSBjYXNlLCB3ZSBkb24ndCB2ZXJpZnkgdGhlIG51bWJlcnMuCisgIC8vIFJ1bm5pbmcgdGltZTogTyhOIGxvZyhOKSkuCisgIHN0YXRpYyBib29sIFZlcmlmeURGU051bWJlcnMoY29uc3QgRG9tVHJlZVQgJkRUKSB7CisgICAgaWYgKCFEVC5ERlNJbmZvVmFsaWQgfHwgIURULlBhcmVudCkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY29uc3QgTm9kZVB0ciBSb290QkIgPSBJc1Bvc3REb20gPyBudWxscHRyIDogRFQuZ2V0Um9vdHMoKVswXTsKKyAgICBjb25zdCBUcmVlTm9kZVB0ciBSb290ID0gRFQuZ2V0Tm9kZShSb290QkIpOworCisgICAgYXV0byBQcmludE5vZGVBbmRERlNOdW1zID0gW10oY29uc3QgVHJlZU5vZGVQdHIgVE4pIHsKKyAgICAgIGVycnMoKSA8PCBCbG9ja05hbWVQcmludGVyKFROKSA8PCAiIHsiIDw8IFROLT5nZXRERlNOdW1JbigpIDw8ICIsICIKKyAgICAgICAgICAgICA8PCBUTi0+Z2V0REZTTnVtT3V0KCkgPDwgJ30nOworICAgIH07CisKKyAgICAvLyBWZXJpZnkgdGhlIHJvb3QncyBERlMgSW4gbnVtYmVyLiBBbHRob3VnaCBERlMgbnVtYmVyaW5nIHdvdWxkIGFsc28gd29yaworICAgIC8vIGlmIHdlIHN0YXJ0ZWQgZnJvbSBzb21lIG90aGVyIHZhbHVlLCB3ZSBhc3N1bWUgMC1iYXNlZCBudW1iZXJpbmcuCisgICAgaWYgKFJvb3QtPmdldERGU051bUluKCkgIT0gMCkgeworICAgICAgZXJycygpIDw8ICJERlNJbiBudW1iZXIgZm9yIHRoZSB0cmVlIHJvb3QgaXMgbm90OlxuXHQiOworICAgICAgUHJpbnROb2RlQW5kREZTTnVtcyhSb290KTsKKyAgICAgIGVycnMoKSA8PCAnXG4nOworICAgICAgZXJycygpLmZsdXNoKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gRm9yIGVhY2ggdHJlZSBub2RlIHZlcmlmeSBpZiBjaGlsZHJlbidzIERGUyBudW1iZXJzIGNvdmVyIHRoZWlyIHBhcmVudCdzCisgICAgLy8gREZTIG51bWJlcnMgd2l0aCBubyBnYXBzLgorICAgIGZvciAoY29uc3QgYXV0byAmTm9kZVRvVE4gOiBEVC5Eb21UcmVlTm9kZXMpIHsKKyAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIE5vZGUgPSBOb2RlVG9UTi5zZWNvbmQuZ2V0KCk7CisKKyAgICAgIC8vIEhhbmRsZSB0cmVlIGxlYXZlcy4KKyAgICAgIGlmIChOb2RlLT5nZXRDaGlsZHJlbigpLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKE5vZGUtPmdldERGU051bUluKCkgKyAxICE9IE5vZGUtPmdldERGU051bU91dCgpKSB7CisgICAgICAgICAgZXJycygpIDw8ICJUcmVlIGxlYWYgc2hvdWxkIGhhdmUgREZTT3V0ID0gREZTSW4gKyAxOlxuXHQiOworICAgICAgICAgIFByaW50Tm9kZUFuZERGU051bXMoTm9kZSk7CisgICAgICAgICAgZXJycygpIDw8ICdcbic7CisgICAgICAgICAgZXJycygpLmZsdXNoKCk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIE1ha2UgYSBjb3B5IGFuZCBzb3J0IGl0IHN1Y2ggdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBjaGVjayBpZiB0aGVyZSBhcmUKKyAgICAgIC8vIG5vIGdhcHMgYmV0d2VlbiBERlMgbnVtYmVycyBvZiBhZGphY2VudCBjaGlsZHJlbi4KKyAgICAgIFNtYWxsVmVjdG9yPFRyZWVOb2RlUHRyLCA4PiBDaGlsZHJlbihOb2RlLT5iZWdpbigpLCBOb2RlLT5lbmQoKSk7CisgICAgICBzdGQ6OnNvcnQoQ2hpbGRyZW4uYmVnaW4oKSwgQ2hpbGRyZW4uZW5kKCksCisgICAgICAgICAgICAgICAgW10oY29uc3QgVHJlZU5vZGVQdHIgQ2gxLCBjb25zdCBUcmVlTm9kZVB0ciBDaDIpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBDaDEtPmdldERGU051bUluKCkgPCBDaDItPmdldERGU051bUluKCk7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgIGF1dG8gUHJpbnRDaGlsZHJlbkVycm9yID0gW05vZGUsICZDaGlsZHJlbiwgUHJpbnROb2RlQW5kREZTTnVtc10oCisgICAgICAgICAgY29uc3QgVHJlZU5vZGVQdHIgRmlyc3RDaCwgY29uc3QgVHJlZU5vZGVQdHIgU2Vjb25kQ2gpIHsKKyAgICAgICAgYXNzZXJ0KEZpcnN0Q2gpOworCisgICAgICAgIGVycnMoKSA8PCAiSW5jb3JyZWN0IERGUyBudW1iZXJzIGZvcjpcblx0UGFyZW50ICI7CisgICAgICAgIFByaW50Tm9kZUFuZERGU051bXMoTm9kZSk7CisKKyAgICAgICAgZXJycygpIDw8ICJcblx0Q2hpbGQgIjsKKyAgICAgICAgUHJpbnROb2RlQW5kREZTTnVtcyhGaXJzdENoKTsKKworICAgICAgICBpZiAoU2Vjb25kQ2gpIHsKKyAgICAgICAgICBlcnJzKCkgPDwgIlxuXHRTZWNvbmQgY2hpbGQgIjsKKyAgICAgICAgICBQcmludE5vZGVBbmRERlNOdW1zKFNlY29uZENoKTsKKyAgICAgICAgfQorCisgICAgICAgIGVycnMoKSA8PCAiXG5BbGwgY2hpbGRyZW46ICI7CisgICAgICAgIGZvciAoY29uc3QgVHJlZU5vZGVQdHIgQ2ggOiBDaGlsZHJlbikgeworICAgICAgICAgIFByaW50Tm9kZUFuZERGU051bXMoQ2gpOworICAgICAgICAgIGVycnMoKSA8PCAiLCAiOworICAgICAgICB9CisKKyAgICAgICAgZXJycygpIDw8ICdcbic7CisgICAgICAgIGVycnMoKS5mbHVzaCgpOworICAgICAgfTsKKworICAgICAgaWYgKENoaWxkcmVuLmZyb250KCktPmdldERGU051bUluKCkgIT0gTm9kZS0+Z2V0REZTTnVtSW4oKSArIDEpIHsKKyAgICAgICAgUHJpbnRDaGlsZHJlbkVycm9yKENoaWxkcmVuLmZyb250KCksIG51bGxwdHIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmIChDaGlsZHJlbi5iYWNrKCktPmdldERGU051bU91dCgpICsgMSAhPSBOb2RlLT5nZXRERlNOdW1PdXQoKSkgeworICAgICAgICBQcmludENoaWxkcmVuRXJyb3IoQ2hpbGRyZW4uYmFjaygpLCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IENoaWxkcmVuLnNpemUoKSAtIDE7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIGlmIChDaGlsZHJlbltpXS0+Z2V0REZTTnVtT3V0KCkgKyAxICE9IENoaWxkcmVuW2kgKyAxXS0+Z2V0REZTTnVtSW4oKSkgeworICAgICAgICAgIFByaW50Q2hpbGRyZW5FcnJvcihDaGlsZHJlbltpXSwgQ2hpbGRyZW5baSArIDFdKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFRoZSBiZWxvdyByb3V0aW5lcyB2ZXJpZnkgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBkb21pbmF0b3IgdHJlZSByZWxhdGl2ZSB0bworICAvLyB0aGUgQ0ZHIGl0J3MgY29taW5nIGZyb20uICBBIHRyZWUgaXMgYSBkb21pbmF0b3IgdHJlZSBpZmYgaXQgaGFzIHR3bworICAvLyBwcm9wZXJ0aWVzLCBjYWxsZWQgdGhlIHBhcmVudCBwcm9wZXJ0eSBhbmQgdGhlIHNpYmxpbmcgcHJvcGVydHkuICBUYXJqYW4KKyAgLy8gYW5kIExlbmdhdWVyIHByb3ZlIChidXQgZG9uJ3QgZXhwbGljaXRseSBuYW1lKSB0aGUgcHJvcGVydGllcyBhcyBwYXJ0IG9mCisgIC8vIHRoZSBwcm9vZnMgaW4gdGhlaXIgMTk3MiBwYXBlciwgYnV0IHRoZSBwcm9vZnMgYXJlIG1vc3RseSBwYXJ0IG9mIHByb3ZpbmcKKyAgLy8gdGhpbmdzIGFib3V0IHNlbWlkb21pbmF0b3JzIGFuZCBpZG9tcywgYW5kIHNvbWUgb2YgdGhlbSBhcmUgc2ltcGx5IGFzc2VydGVkCisgIC8vIGJhc2VkIG9uIGV2ZW4gZWFybGllciBwYXBlcnMgKHNlZSwgZS5nLiwgbGVtbWEgMikuICBTb21lIHBhcGVycyByZWZlciB0bworICAvLyB0aGVzZSBwcm9wZXJ0aWVzIGFzICJ2YWxpZCIgYW5kICJjby12YWxpZCIuICBTZWUsIGUuZy4sICJEb21pbmF0b3JzLAorICAvLyBkaXJlY3RlZCBiaXBvbGFyIG9yZGVycywgYW5kIGluZGVwZW5kZW50IHNwYW5uaW5nIHRyZWVzIiBieSBMb3VrYXMKKyAgLy8gR2VvcmdpYWRpcyBhbmQgUm9iZXJ0IEUuIFRhcmphbiwgYXMgd2VsbCBhcyAiRG9taW5hdG9yIFRyZWUgVmVyaWZpY2F0aW9uCisgIC8vIGFuZCBWZXJ0ZXgtRGlzam9pbnQgUGF0aHMgIiBieSB0aGUgc2FtZSBhdXRob3JzLgorCisgIC8vIEEgdmVyeSBzaW1wbGUgYW5kIGRpcmVjdCBleHBsYW5hdGlvbiBvZiB0aGVzZSBwcm9wZXJ0aWVzIGNhbiBiZSBmb3VuZCBpbgorICAvLyAiQW4gRXhwZXJpbWVudGFsIFN0dWR5IG9mIER5bmFtaWMgRG9taW5hdG9ycyIsIGZvdW5kIGF0CisgIC8vIGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8xNjA0LjAyNzExCisKKyAgLy8gVGhlIGVhc2llc3Qgd2F5IHRvIHRoaW5rIG9mIHRoZSBwYXJlbnQgcHJvcGVydHkgaXMgdGhhdCBpdCdzIGEgcmVxdWlyZW1lbnQKKyAgLy8gb2YgYmVpbmcgYSBkb21pbmF0b3IuICBMZXQncyBqdXN0IHRha2UgaW1tZWRpYXRlIGRvbWluYXRvcnMuICBGb3IgUEFSRU5UIHRvCisgIC8vIGJlIGFuIGltbWVkaWF0ZSBkb21pbmF0b3Igb2YgQ0hJTEQsIGFsbCBwYXRocyBpbiB0aGUgQ0ZHIG11c3QgZ28gdGhyb3VnaAorICAvLyBQQVJFTlQgYmVmb3JlIHRoZXkgaGl0IENISUxELiAgVGhpcyBpbXBsaWVzIHRoYXQgaWYgeW91IHdlcmUgdG8gY3V0IFBBUkVOVAorICAvLyBvdXQgb2YgdGhlIENGRywgdGhlcmUgc2hvdWxkIGJlIG5vIHBhdGhzIHRvIENISUxEIHRoYXQgYXJlIHJlYWNoYWJsZS4gIElmCisgIC8vIHRoZXJlIGFyZSwgdGhlbiB5b3Ugbm93IGhhdmUgYSBwYXRoIGZyb20gUEFSRU5UIHRvIENISUxEIHRoYXQgZ29lcyBhcm91bmQKKyAgLy8gUEFSRU5UIGFuZCBzdGlsbCByZWFjaGVzIENISUxELCB3aGljaCBieSBkZWZpbml0aW9uLCBtZWFucyBQQVJFTlQgY2FuJ3QgYmUKKyAgLy8gYSBkb21pbmF0b3Igb2YgQ0hJTEQgKGxldCBhbG9uZSBhbiBpbW1lZGlhdGUgb25lKS4KKworICAvLyBUaGUgc2libGluZyBwcm9wZXJ0eSBpcyBzaW1pbGFyLiAgSXQgc2F5cyB0aGF0IGZvciBlYWNoIHBhaXIgb2Ygc2libGluZworICAvLyBub2RlcyBpbiB0aGUgZG9taW5hdG9yIHRyZWUgKExFRlQgYW5kIFJJR0hUKSAsIHRoZXkgbXVzdCBub3QgZG9taW5hdGUgZWFjaAorICAvLyBvdGhlci4gIElmIHNpYmxpbmcgTEVGVCBkb21pbmF0ZWQgc2libGluZyBSSUdIVCwgaXQgbWVhbnMgdGhlcmUgYXJlIG5vCisgIC8vIHBhdGhzIGluIHRoZSBDRkcgZnJvbSBzaWJsaW5nIExFRlQgdG8gc2libGluZyBSSUdIVCB0aGF0IGRvIG5vdCBnbyB0aHJvdWdoCisgIC8vIExFRlQsIGFuZCB0aHVzLCBMRUZUIGlzIHJlYWxseSBhbiBhbmNlc3RvciAoaW4gdGhlIGRvbWluYXRvciB0cmVlKSBvZgorICAvLyBSSUdIVCwgbm90IGEgc2libGluZy4KKworICAvLyBJdCBpcyBwb3NzaWJsZSB0byB2ZXJpZnkgdGhlIHBhcmVudCBhbmQgc2libGluZyBwcm9wZXJ0aWVzIGluCisgIC8vIGxpbmVhciB0aW1lLCBidXQgdGhlIGFsZ29yaXRobXMgYXJlIGNvbXBsZXguIEluc3RlYWQsIHdlIGRvIGl0IGluIGEKKyAgLy8gc3RyYWlnaHRmb3J3YXJkIE5eMiBhbmQgTl4zIHdheSBiZWxvdywgdXNpbmcgZGlyZWN0IHBhdGggcmVhY2hhYmlsaXR5LgorCisgIC8vIENoZWNrcyBpZiB0aGUgdHJlZSBoYXMgdGhlIHBhcmVudCBwcm9wZXJ0eTogaWYgZm9yIGFsbCBlZGdlcyBmcm9tIFYgdG8gVyBpbgorICAvLyB0aGUgaW5wdXQgZ3JhcGgsIHN1Y2ggdGhhdCBWIGlzIHJlYWNoYWJsZSwgdGhlIHBhcmVudCBvZiBXIGluIHRoZSB0cmVlIGlzCisgIC8vIGFuIGFuY2VzdG9yIG9mIFYgaW4gdGhlIHRyZWUuCisgIC8vIFJ1bm5pbmcgdGltZTogTyhOXjIpLgorICAvLworICAvLyBUaGlzIG1lYW5zIHRoYXQgaWYgYSBub2RlIGdldHMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGdyYXBoLCB0aGVuIGFsbCBvZgorICAvLyB0aGUgbm9kZXMgaXQgZG9taW5hdGVkIHByZXZpb3VzbHkgd2lsbCBub3cgYmVjb21lIHVucmVhY2hhYmxlLgorICBib29sIHZlcmlmeVBhcmVudFByb3BlcnR5KGNvbnN0IERvbVRyZWVUICZEVCkgeworICAgIGZvciAoYXV0byAmTm9kZVRvVE4gOiBEVC5Eb21UcmVlTm9kZXMpIHsKKyAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIFROID0gTm9kZVRvVE4uc2Vjb25kLmdldCgpOworICAgICAgY29uc3QgTm9kZVB0ciBCQiA9IFROLT5nZXRCbG9jaygpOworICAgICAgaWYgKCFCQiB8fCBUTi0+Z2V0Q2hpbGRyZW4oKS5lbXB0eSgpKSBjb250aW51ZTsKKworICAgICAgREVCVUcoZGJncygpIDw8ICJWZXJpZnlpbmcgcGFyZW50IHByb3BlcnR5IG9mIG5vZGUgIgorICAgICAgICAgICAgICAgICAgIDw8IEJsb2NrTmFtZVByaW50ZXIoVE4pIDw8ICJcbiIpOworICAgICAgY2xlYXIoKTsKKyAgICAgIGRvRnVsbERGU1dhbGsoRFQsIFtCQl0oTm9kZVB0ciBGcm9tLCBOb2RlUHRyIFRvKSB7CisgICAgICAgIHJldHVybiBGcm9tICE9IEJCICYmIFRvICE9IEJCOworICAgICAgfSk7CisKKyAgICAgIGZvciAoVHJlZU5vZGVQdHIgQ2hpbGQgOiBUTi0+Z2V0Q2hpbGRyZW4oKSkKKyAgICAgICAgaWYgKE5vZGVUb0luZm8uY291bnQoQ2hpbGQtPmdldEJsb2NrKCkpICE9IDApIHsKKyAgICAgICAgICBlcnJzKCkgPDwgIkNoaWxkICIgPDwgQmxvY2tOYW1lUHJpbnRlcihDaGlsZCkKKyAgICAgICAgICAgICAgICAgPDwgIiByZWFjaGFibGUgYWZ0ZXIgaXRzIHBhcmVudCAiIDw8IEJsb2NrTmFtZVByaW50ZXIoQkIpCisgICAgICAgICAgICAgICAgIDw8ICIgaXMgcmVtb3ZlZCFcbiI7CisgICAgICAgICAgZXJycygpLmZsdXNoKCk7CisKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIENoZWNrIGlmIHRoZSB0cmVlIGhhcyBzaWJsaW5nIHByb3BlcnR5OiBpZiBhIG5vZGUgViBkb2VzIG5vdCBkb21pbmF0ZSBhCisgIC8vIG5vZGUgVyBmb3IgYWxsIHNpYmxpbmdzIFYgYW5kIFcgaW4gdGhlIHRyZWUuCisgIC8vIFJ1bm5pbmcgdGltZTogTyhOXjMpLgorICAvLworICAvLyBUaGlzIG1lYW5zIHRoYXQgaWYgYSBub2RlIGdldHMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGdyYXBoLCB0aGVuIGFsbCBvZiBpdHMKKyAgLy8gc2libGluZ3Mgd2lsbCBub3cgc3RpbGwgYmUgcmVhY2hhYmxlLgorICBib29sIHZlcmlmeVNpYmxpbmdQcm9wZXJ0eShjb25zdCBEb21UcmVlVCAmRFQpIHsKKyAgICBmb3IgKGF1dG8gJk5vZGVUb1ROIDogRFQuRG9tVHJlZU5vZGVzKSB7CisgICAgICBjb25zdCBUcmVlTm9kZVB0ciBUTiA9IE5vZGVUb1ROLnNlY29uZC5nZXQoKTsKKyAgICAgIGNvbnN0IE5vZGVQdHIgQkIgPSBUTi0+Z2V0QmxvY2soKTsKKyAgICAgIGlmICghQkIgfHwgVE4tPmdldENoaWxkcmVuKCkuZW1wdHkoKSkgY29udGludWU7CisKKyAgICAgIGNvbnN0IGF1dG8gJlNpYmxpbmdzID0gVE4tPmdldENoaWxkcmVuKCk7CisgICAgICBmb3IgKGNvbnN0IFRyZWVOb2RlUHRyIE4gOiBTaWJsaW5ncykgeworICAgICAgICBjbGVhcigpOworICAgICAgICBOb2RlUHRyIEJCTiA9IE4tPmdldEJsb2NrKCk7CisgICAgICAgIGRvRnVsbERGU1dhbGsoRFQsIFtCQk5dKE5vZGVQdHIgRnJvbSwgTm9kZVB0ciBUbykgeworICAgICAgICAgIHJldHVybiBGcm9tICE9IEJCTiAmJiBUbyAhPSBCQk47CisgICAgICAgIH0pOworCisgICAgICAgIGZvciAoY29uc3QgVHJlZU5vZGVQdHIgUyA6IFNpYmxpbmdzKSB7CisgICAgICAgICAgaWYgKFMgPT0gTikgY29udGludWU7CisKKyAgICAgICAgICBpZiAoTm9kZVRvSW5mby5jb3VudChTLT5nZXRCbG9jaygpKSA9PSAwKSB7CisgICAgICAgICAgICBlcnJzKCkgPDwgIk5vZGUgIiA8PCBCbG9ja05hbWVQcmludGVyKFMpCisgICAgICAgICAgICAgICAgICAgPDwgIiBub3QgcmVhY2hhYmxlIHdoZW4gaXRzIHNpYmxpbmcgIiA8PCBCbG9ja05hbWVQcmludGVyKE4pCisgICAgICAgICAgICAgICAgICAgPDwgIiBpcyByZW1vdmVkIVxuIjsKKyAgICAgICAgICAgIGVycnMoKS5mbHVzaCgpOworCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBDaGVjayBpZiB0aGUgZ2l2ZW4gdHJlZSBpcyB0aGUgc2FtZSBhcyBhIGZyZXNobHkgY29tcHV0ZWQgb25lIGZvciB0aGUgc2FtZQorICAvLyBQYXJlbnQuCisgIC8vIFJ1bm5pbmcgdGltZTogTyhOXjIpLCBidXQgZmFzdGVyIGluIHByYWN0aXNlIChzYW1lIGFzIHRyZWUgY29uc3RydWN0aW9uKS4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgY2hlY2sgaWYgdGhhdCB0aGUgdHJlZSBjb25zdHJ1Y3Rpb24gYWxnb3JpdGhtIGlzCisgIC8vIGNvcnJlY3QgYW5kIHNob3VsZCBiZSBvbmx5IHVzZWQgZm9yIGZhc3QgKGJ1dCBwb3NzaWJseSB1bnNvdW5kKQorICAvLyB2ZXJpZmljYXRpb24uCisgIHN0YXRpYyBib29sIElzU2FtZUFzRnJlc2hUcmVlKGNvbnN0IERvbVRyZWVUICZEVCkgeworICAgIERvbVRyZWVUIEZyZXNoVHJlZTsKKyAgICBGcmVzaFRyZWUucmVjYWxjdWxhdGUoKkRULlBhcmVudCk7CisgICAgY29uc3QgYm9vbCBEaWZmZXJlbnQgPSBEVC5jb21wYXJlKEZyZXNoVHJlZSk7CisKKyAgICBpZiAoRGlmZmVyZW50KSB7CisgICAgICBlcnJzKCkgPDwgKERULmlzUG9zdERvbWluYXRvcigpID8gIlBvc3QiIDogIiIpCisgICAgICAgICAgICAgPDwgIkRvbWluYXRvclRyZWUgaXMgZGlmZmVyZW50IHRoYW4gYSBmcmVzaGx5IGNvbXB1dGVkIG9uZSFcbiIKKyAgICAgICAgICAgICA8PCAiXHRDdXJyZW50OlxuIjsKKyAgICAgIERULnByaW50KGVycnMoKSk7CisgICAgICBlcnJzKCkgPDwgIlxuXHRGcmVzaGx5IGNvbXB1dGVkIHRyZWU6XG4iOworICAgICAgRnJlc2hUcmVlLnByaW50KGVycnMoKSk7CisgICAgICBlcnJzKCkuZmx1c2goKTsKKyAgICB9CisKKyAgICByZXR1cm4gIURpZmZlcmVudDsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIERvbVRyZWVUPgordm9pZCBDYWxjdWxhdGUoRG9tVHJlZVQgJkRUKSB7CisgIFNlbWlOQ0FJbmZvPERvbVRyZWVUPjo6Q2FsY3VsYXRlRnJvbVNjcmF0Y2goRFQsIG51bGxwdHIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRG9tVHJlZVQ+Cit2b2lkIEluc2VydEVkZ2UoRG9tVHJlZVQgJkRULCB0eXBlbmFtZSBEb21UcmVlVDo6Tm9kZVB0ciBGcm9tLAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIERvbVRyZWVUOjpOb2RlUHRyIFRvKSB7CisgIGlmIChEVC5pc1Bvc3REb21pbmF0b3IoKSkgc3RkOjpzd2FwKEZyb20sIFRvKTsKKyAgU2VtaU5DQUluZm88RG9tVHJlZVQ+OjpJbnNlcnRFZGdlKERULCBudWxscHRyLCBGcm9tLCBUbyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBEb21UcmVlVD4KK3ZvaWQgRGVsZXRlRWRnZShEb21UcmVlVCAmRFQsIHR5cGVuYW1lIERvbVRyZWVUOjpOb2RlUHRyIEZyb20sCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgRG9tVHJlZVQ6Ok5vZGVQdHIgVG8pIHsKKyAgaWYgKERULmlzUG9zdERvbWluYXRvcigpKSBzdGQ6OnN3YXAoRnJvbSwgVG8pOworICBTZW1pTkNBSW5mbzxEb21UcmVlVD46OkRlbGV0ZUVkZ2UoRFQsIG51bGxwdHIsIEZyb20sIFRvKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIERvbVRyZWVUPgordm9pZCBBcHBseVVwZGF0ZXMoRG9tVHJlZVQgJkRULAorICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dHlwZW5hbWUgRG9tVHJlZVQ6OlVwZGF0ZVR5cGU+IFVwZGF0ZXMpIHsKKyAgU2VtaU5DQUluZm88RG9tVHJlZVQ+OjpBcHBseVVwZGF0ZXMoRFQsIFVwZGF0ZXMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRG9tVHJlZVQ+Citib29sIFZlcmlmeShjb25zdCBEb21UcmVlVCAmRFQsIHR5cGVuYW1lIERvbVRyZWVUOjpWZXJpZmljYXRpb25MZXZlbCBWTCkgeworICBTZW1pTkNBSW5mbzxEb21UcmVlVD4gU05DQShudWxscHRyKTsKKworICAvLyBTaW1wbGlzdCBjaGVjayBpcyB0byBjb21wYXJlIGFnYWluc3QgYSBuZXcgdHJlZS4gVGhpcyB3aWxsIGFsc28KKyAgLy8gdXNlZnVsbHkgcHJpbnQgdGhlIG9sZCBhbmQgbmV3IHRyZWVzLCBpZiB0aGV5IGFyZSBkaWZmZXJlbnQuCisgIGlmICghU05DQS5Jc1NhbWVBc0ZyZXNoVHJlZShEVCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIENvbW1vbiBjaGVja3MgdG8gdmVyaWZ5IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB0cmVlLiBPKE4gbG9nIE4pIGF0IHdvcnN0CisgIGlmICghU05DQS52ZXJpZnlSb290cyhEVCkgfHwgIVNOQ0EudmVyaWZ5UmVhY2hhYmlsaXR5KERUKSB8fAorICAgICAgIVNOQ0EuVmVyaWZ5TGV2ZWxzKERUKSB8fCAhU05DQS5WZXJpZnlERlNOdW1iZXJzKERUKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gRXh0cmEgY2hlY2tzIGRlcGVuZGluZyBvbiBWZXJpZmljYXRpb25MZXZlbC4gVXAgdG8gTyhOXjMpCisgIGlmIChWTCA9PSBEb21UcmVlVDo6VmVyaWZpY2F0aW9uTGV2ZWw6OkJhc2ljIHx8CisgICAgICBWTCA9PSBEb21UcmVlVDo6VmVyaWZpY2F0aW9uTGV2ZWw6OkZ1bGwpCisgICAgaWYgKCFTTkNBLnZlcmlmeVBhcmVudFByb3BlcnR5KERUKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKFZMID09IERvbVRyZWVUOjpWZXJpZmljYXRpb25MZXZlbDo6RnVsbCkKKyAgICBpZiAoIVNOQ0EudmVyaWZ5U2libGluZ1Byb3BlcnR5KERUKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIERvbVRyZWVCdWlsZGVyCit9ICAvLyBuYW1lc3BhY2UgbGx2bQorCisjdW5kZWYgREVCVUdfVFlQRQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9HbG9iUGF0dGVybi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0dsb2JQYXR0ZXJuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0MzZhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9HbG9iUGF0dGVybi5oCkBAIC0wLDAgKzEsNDggQEAKKy8vPT09LS0gR2xvYlBhdHRlcm4uaCAtIGdsb2IgcGF0dGVybiBtYXRjaGVyIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSBnbG9iIHBhdHRlcm4gbWF0Y2hlci4gVGhlIGdsb2IgcGF0dGVybiBpcyB0aGUKKy8vIHJ1bGUgdXNlZCBieSB0aGUgc2hlbGwuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfR0xPQl9QQVRURVJOX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0dMT0JfUEFUVEVSTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgZ2xvYiBwYXR0ZXJuLiBTdXBwb3J0ZWQgbWV0YWNoYXJhY3RlcnMKKy8vIGFyZSAiKiIsICI/IiwgIls8Y2hhcnM+XSIgYW5kICJbXjxjaGFycz5dIi4KK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEJpdFZlY3RvcjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKKworY2xhc3MgR2xvYlBhdHRlcm4geworcHVibGljOgorICBzdGF0aWMgRXhwZWN0ZWQ8R2xvYlBhdHRlcm4+IGNyZWF0ZShTdHJpbmdSZWYgUGF0KTsKKyAgYm9vbCBtYXRjaChTdHJpbmdSZWYgUykgY29uc3Q7CisKK3ByaXZhdGU6CisgIGJvb2wgbWF0Y2hPbmUoQXJyYXlSZWY8Qml0VmVjdG9yPiBQYXQsIFN0cmluZ1JlZiBTKSBjb25zdDsKKworICAvLyBQYXJzZWQgZ2xvYiBwYXR0ZXJuLgorICBzdGQ6OnZlY3RvcjxCaXRWZWN0b3I+IFRva2VuczsKKworICAvLyBUaGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGZvciBvcHRpbWl6YXRpb24uCisgIE9wdGlvbmFsPFN0cmluZ1JlZj4gRXhhY3Q7CisgIE9wdGlvbmFsPFN0cmluZ1JlZj4gUHJlZml4OworICBPcHRpb25hbDxTdHJpbmdSZWY+IFN1ZmZpeDsKK307Cit9CisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfR0xPQl9QQVRURVJOX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9HcmFwaFdyaXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0dyYXBoV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RmNWM4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9HcmFwaFdyaXRlci5oCkBAIC0wLDAgKzEsMzYxIEBACisvLz09PS0gbGx2bS9TdXBwb3J0L0dyYXBoV3JpdGVyLmggLSBXcml0ZSBncmFwaCB0byBhIC5kb3QgZmlsZSAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgc2ltcGxlIGludGVyZmFjZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHByaW50IG91dCBnZW5lcmljCisvLyBMTFZNIGdyYXBocyB0byAiLmRvdCIgZmlsZXMuICAiZG90IiBpcyBhIHRvb2wgdGhhdCBpcyBwYXJ0IG9mIHRoZSBBVCZUCisvLyBncmFwaHZpeiBwYWNrYWdlIChodHRwOi8vd3d3LnJlc2VhcmNoLmF0dC5jb20vc3cvdG9vbHMvZ3JhcGh2aXovKSB3aGljaCBjYW4KKy8vIGJlIHVzZWQgdG8gdHVybiB0aGUgZmlsZXMgb3V0cHV0IGJ5IHRoaXMgaW50ZXJmYWNlIGludG8gYSB2YXJpZXR5IG9mCisvLyBkaWZmZXJlbnQgZ3JhcGhpY3MgZm9ybWF0cy4KKy8vCisvLyBHcmFwaHMgZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50IGFueSBpbnRlcmZhY2UgcGFzdCB3aGF0IGlzIGFscmVhZHkgcmVxdWlyZWQKKy8vIGJ5IHRoZSBHcmFwaFRyYWl0cyB0ZW1wbGF0ZSwgYnV0IHRoZXkgY2FuIGNob29zZSB0byBpbXBsZW1lbnQgc3BlY2lhbGl6YXRpb25zCisvLyBvZiB0aGUgRE9UR3JhcGhUcmFpdHMgdGVtcGxhdGUgaWYgdGhleSB3YW50IHRvIGN1c3RvbWl6ZSB0aGUgZ3JhcGhzIG91dHB1dCBpbgorLy8gYW55IHdheS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9HUkFQSFdSSVRFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9HUkFQSFdSSVRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RPVEdyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgRE9UIHsgIC8vIFByaXZhdGUgZnVuY3Rpb25zLi4uCisKK3N0ZDo6c3RyaW5nIEVzY2FwZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmTGFiZWwpOworCisvLy8gXGJyaWVmIEdldCBhIGNvbG9yIHN0cmluZyBmb3IgdGhpcyBub2RlIG51bWJlci4gU2ltcGx5IHJvdW5kLXJvYmluIHNlbGVjdHMKKy8vLyBmcm9tIGEgcmVhc29uYWJsZSBudW1iZXIgb2YgY29sb3JzLgorU3RyaW5nUmVmIGdldENvbG9yU3RyaW5nKHVuc2lnbmVkIE5vZGVOdW1iZXIpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgRE9UCisKK25hbWVzcGFjZSBHcmFwaFByb2dyYW0geworCitlbnVtIE5hbWUgeworICBET1QsCisgIEZEUCwKKyAgTkVBVE8sCisgIFRXT1BJLAorICBDSVJDTworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEdyYXBoUHJvZ3JhbQorCitib29sIERpc3BsYXlHcmFwaChTdHJpbmdSZWYgRmlsZW5hbWUsIGJvb2wgd2FpdCA9IHRydWUsCisgICAgICAgICAgICAgICAgICBHcmFwaFByb2dyYW06Ok5hbWUgcHJvZ3JhbSA9IEdyYXBoUHJvZ3JhbTo6RE9UKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgR3JhcGhUeXBlPgorY2xhc3MgR3JhcGhXcml0ZXIgeworICByYXdfb3N0cmVhbSAmTzsKKyAgY29uc3QgR3JhcGhUeXBlICZHOworCisgIHVzaW5nIERPVFRyYWl0cyA9IERPVEdyYXBoVHJhaXRzPEdyYXBoVHlwZT47CisgIHVzaW5nIEdUcmFpdHMgPSBHcmFwaFRyYWl0czxHcmFwaFR5cGU+OworICB1c2luZyBOb2RlUmVmID0gdHlwZW5hbWUgR1RyYWl0czo6Tm9kZVJlZjsKKyAgdXNpbmcgbm9kZV9pdGVyYXRvciA9IHR5cGVuYW1lIEdUcmFpdHM6Om5vZGVzX2l0ZXJhdG9yOworICB1c2luZyBjaGlsZF9pdGVyYXRvciA9IHR5cGVuYW1lIEdUcmFpdHM6OkNoaWxkSXRlcmF0b3JUeXBlOworICBET1RUcmFpdHMgRFRyYWl0czsKKworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfcG9pbnRlcjxOb2RlUmVmPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIkZJWE1FOiBDdXJyZW50bHkgR3JhcGhXcml0ZXIgcmVxdWlyZXMgdGhlIE5vZGVSZWYgdHlwZSB0byBiZSAiCisgICAgICAgICAgICAgICAgImEgcG9pbnRlci5cblRoZSBwb2ludGVyIHVzYWdlIHNob3VsZCBiZSBtb3ZlZCB0byAiCisgICAgICAgICAgICAgICAgIkRPVEdyYXBoVHJhaXRzLCBhbmQgcmVtb3ZlZCBmcm9tIEdyYXBoV3JpdGVyIGl0c2VsZi4iKTsKKworICAvLyBXcml0ZXMgdGhlIGVkZ2UgbGFiZWxzIG9mIHRoZSBub2RlIHRvIE8gYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW55CisgIC8vIGVkZ2UgbGFiZWxzIG5vdCBlcXVhbCB0byB0aGUgZW1wdHkgc3RyaW5nICIiLgorICBib29sIGdldEVkZ2VTb3VyY2VMYWJlbHMocmF3X29zdHJlYW0gJk8sIE5vZGVSZWYgTm9kZSkgeworICAgIGNoaWxkX2l0ZXJhdG9yIEVJID0gR1RyYWl0czo6Y2hpbGRfYmVnaW4oTm9kZSk7CisgICAgY2hpbGRfaXRlcmF0b3IgRUUgPSBHVHJhaXRzOjpjaGlsZF9lbmQoTm9kZSk7CisgICAgYm9vbCBoYXNFZGdlU291cmNlTGFiZWxzID0gZmFsc2U7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBFSSAhPSBFRSAmJiBpICE9IDY0OyArK0VJLCArK2kpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGxhYmVsID0gRFRyYWl0cy5nZXRFZGdlU291cmNlTGFiZWwoTm9kZSwgRUkpOworCisgICAgICBpZiAobGFiZWwuZW1wdHkoKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGhhc0VkZ2VTb3VyY2VMYWJlbHMgPSB0cnVlOworCisgICAgICBpZiAoaSkKKyAgICAgICAgTyA8PCAifCI7CisKKyAgICAgIE8gPDwgIjxzIiA8PCBpIDw8ICI+IiA8PCBET1Q6OkVzY2FwZVN0cmluZyhsYWJlbCk7CisgICAgfQorCisgICAgaWYgKEVJICE9IEVFICYmIGhhc0VkZ2VTb3VyY2VMYWJlbHMpCisgICAgICBPIDw8ICJ8PHM2ND50cnVuY2F0ZWQuLi4iOworCisgICAgcmV0dXJuIGhhc0VkZ2VTb3VyY2VMYWJlbHM7CisgIH0KKworcHVibGljOgorICBHcmFwaFdyaXRlcihyYXdfb3N0cmVhbSAmbywgY29uc3QgR3JhcGhUeXBlICZnLCBib29sIFNOKSA6IE8obyksIEcoZykgeworICAgIERUcmFpdHMgPSBET1RUcmFpdHMoU04pOworICB9CisKKyAgdm9pZCB3cml0ZUdyYXBoKGNvbnN0IHN0ZDo6c3RyaW5nICZUaXRsZSA9ICIiKSB7CisgICAgLy8gT3V0cHV0IHRoZSBoZWFkZXIgZm9yIHRoZSBncmFwaC4uLgorICAgIHdyaXRlSGVhZGVyKFRpdGxlKTsKKworICAgIC8vIEVtaXQgYWxsIG9mIHRoZSBub2RlcyBpbiB0aGUgZ3JhcGguLi4KKyAgICB3cml0ZU5vZGVzKCk7CisKKyAgICAvLyBPdXRwdXQgYW55IGN1c3RvbWl6YXRpb25zIG9uIHRoZSBncmFwaAorICAgIERPVEdyYXBoVHJhaXRzPEdyYXBoVHlwZT46OmFkZEN1c3RvbUdyYXBoRmVhdHVyZXMoRywgKnRoaXMpOworCisgICAgLy8gT3V0cHV0IHRoZSBlbmQgb2YgdGhlIGdyYXBoCisgICAgd3JpdGVGb290ZXIoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcgJlRpdGxlKSB7CisgICAgc3RkOjpzdHJpbmcgR3JhcGhOYW1lID0gRFRyYWl0cy5nZXRHcmFwaE5hbWUoRyk7CisKKyAgICBpZiAoIVRpdGxlLmVtcHR5KCkpCisgICAgICBPIDw8ICJkaWdyYXBoIFwiIiA8PCBET1Q6OkVzY2FwZVN0cmluZyhUaXRsZSkgPDwgIlwiIHtcbiI7CisgICAgZWxzZSBpZiAoIUdyYXBoTmFtZS5lbXB0eSgpKQorICAgICAgTyA8PCAiZGlncmFwaCBcIiIgPDwgRE9UOjpFc2NhcGVTdHJpbmcoR3JhcGhOYW1lKSA8PCAiXCIge1xuIjsKKyAgICBlbHNlCisgICAgICBPIDw8ICJkaWdyYXBoIHVubmFtZWQge1xuIjsKKworICAgIGlmIChEVHJhaXRzLnJlbmRlckdyYXBoRnJvbUJvdHRvbVVwKCkpCisgICAgICBPIDw8ICJcdHJhbmtkaXI9XCJCVFwiO1xuIjsKKworICAgIGlmICghVGl0bGUuZW1wdHkoKSkKKyAgICAgIE8gPDwgIlx0bGFiZWw9XCIiIDw8IERPVDo6RXNjYXBlU3RyaW5nKFRpdGxlKSA8PCAiXCI7XG4iOworICAgIGVsc2UgaWYgKCFHcmFwaE5hbWUuZW1wdHkoKSkKKyAgICAgIE8gPDwgIlx0bGFiZWw9XCIiIDw8IERPVDo6RXNjYXBlU3RyaW5nKEdyYXBoTmFtZSkgPDwgIlwiO1xuIjsKKyAgICBPIDw8IERUcmFpdHMuZ2V0R3JhcGhQcm9wZXJ0aWVzKEcpOworICAgIE8gPDwgIlxuIjsKKyAgfQorCisgIHZvaWQgd3JpdGVGb290ZXIoKSB7CisgICAgLy8gRmluaXNoIG9mZiB0aGUgZ3JhcGgKKyAgICBPIDw8ICJ9XG4iOworICB9CisKKyAgdm9pZCB3cml0ZU5vZGVzKCkgeworICAgIC8vIExvb3Agb3ZlciB0aGUgZ3JhcGgsIHByaW50aW5nIGl0IG91dC4uLgorICAgIGZvciAoY29uc3QgYXV0byBOb2RlIDogbm9kZXM8R3JhcGhUeXBlPihHKSkKKyAgICAgIGlmICghaXNOb2RlSGlkZGVuKE5vZGUpKQorICAgICAgICB3cml0ZU5vZGUoTm9kZSk7CisgIH0KKworICBib29sIGlzTm9kZUhpZGRlbihOb2RlUmVmIE5vZGUpIHsKKyAgICByZXR1cm4gRFRyYWl0cy5pc05vZGVIaWRkZW4oTm9kZSk7CisgIH0KKworICB2b2lkIHdyaXRlTm9kZShOb2RlUmVmIE5vZGUpIHsKKyAgICBzdGQ6OnN0cmluZyBOb2RlQXR0cmlidXRlcyA9IERUcmFpdHMuZ2V0Tm9kZUF0dHJpYnV0ZXMoTm9kZSwgRyk7CisKKyAgICBPIDw8ICJcdE5vZGUiIDw8IHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPihOb2RlKSA8PCAiIFtzaGFwZT1yZWNvcmQsIjsKKyAgICBpZiAoIU5vZGVBdHRyaWJ1dGVzLmVtcHR5KCkpIE8gPDwgTm9kZUF0dHJpYnV0ZXMgPDwgIiwiOworICAgIE8gPDwgImxhYmVsPVwieyI7CisKKyAgICBpZiAoIURUcmFpdHMucmVuZGVyR3JhcGhGcm9tQm90dG9tVXAoKSkgeworICAgICAgTyA8PCBET1Q6OkVzY2FwZVN0cmluZyhEVHJhaXRzLmdldE5vZGVMYWJlbChOb2RlLCBHKSk7CisKKyAgICAgIC8vIElmIHdlIHNob3VsZCBpbmNsdWRlIHRoZSBhZGRyZXNzIG9mIHRoZSBub2RlIGluIHRoZSBsYWJlbCwgZG8gc28gbm93LgorICAgICAgc3RkOjpzdHJpbmcgSWQgPSBEVHJhaXRzLmdldE5vZGVJZGVudGlmaWVyTGFiZWwoTm9kZSwgRyk7CisgICAgICBpZiAoIUlkLmVtcHR5KCkpCisgICAgICAgIE8gPDwgInwiIDw8IERPVDo6RXNjYXBlU3RyaW5nKElkKTsKKworICAgICAgc3RkOjpzdHJpbmcgTm9kZURlc2MgPSBEVHJhaXRzLmdldE5vZGVEZXNjcmlwdGlvbihOb2RlLCBHKTsKKyAgICAgIGlmICghTm9kZURlc2MuZW1wdHkoKSkKKyAgICAgICAgTyA8PCAifCIgPDwgRE9UOjpFc2NhcGVTdHJpbmcoTm9kZURlc2MpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGVkZ2VTb3VyY2VMYWJlbHM7CisgICAgcmF3X3N0cmluZ19vc3RyZWFtIEVkZ2VTb3VyY2VMYWJlbHMoZWRnZVNvdXJjZUxhYmVscyk7CisgICAgYm9vbCBoYXNFZGdlU291cmNlTGFiZWxzID0gZ2V0RWRnZVNvdXJjZUxhYmVscyhFZGdlU291cmNlTGFiZWxzLCBOb2RlKTsKKworICAgIGlmIChoYXNFZGdlU291cmNlTGFiZWxzKSB7CisgICAgICBpZiAoIURUcmFpdHMucmVuZGVyR3JhcGhGcm9tQm90dG9tVXAoKSkgTyA8PCAifCI7CisKKyAgICAgIE8gPDwgInsiIDw8IEVkZ2VTb3VyY2VMYWJlbHMuc3RyKCkgPDwgIn0iOworCisgICAgICBpZiAoRFRyYWl0cy5yZW5kZXJHcmFwaEZyb21Cb3R0b21VcCgpKSBPIDw8ICJ8IjsKKyAgICB9CisKKyAgICBpZiAoRFRyYWl0cy5yZW5kZXJHcmFwaEZyb21Cb3R0b21VcCgpKSB7CisgICAgICBPIDw8IERPVDo6RXNjYXBlU3RyaW5nKERUcmFpdHMuZ2V0Tm9kZUxhYmVsKE5vZGUsIEcpKTsKKworICAgICAgLy8gSWYgd2Ugc2hvdWxkIGluY2x1ZGUgdGhlIGFkZHJlc3Mgb2YgdGhlIG5vZGUgaW4gdGhlIGxhYmVsLCBkbyBzbyBub3cuCisgICAgICBzdGQ6OnN0cmluZyBJZCA9IERUcmFpdHMuZ2V0Tm9kZUlkZW50aWZpZXJMYWJlbChOb2RlLCBHKTsKKyAgICAgIGlmICghSWQuZW1wdHkoKSkKKyAgICAgICAgTyA8PCAifCIgPDwgRE9UOjpFc2NhcGVTdHJpbmcoSWQpOworCisgICAgICBzdGQ6OnN0cmluZyBOb2RlRGVzYyA9IERUcmFpdHMuZ2V0Tm9kZURlc2NyaXB0aW9uKE5vZGUsIEcpOworICAgICAgaWYgKCFOb2RlRGVzYy5lbXB0eSgpKQorICAgICAgICBPIDw8ICJ8IiA8PCBET1Q6OkVzY2FwZVN0cmluZyhOb2RlRGVzYyk7CisgICAgfQorCisgICAgaWYgKERUcmFpdHMuaGFzRWRnZURlc3RMYWJlbHMoKSkgeworICAgICAgTyA8PCAifHsiOworCisgICAgICB1bnNpZ25lZCBpID0gMCwgZSA9IERUcmFpdHMubnVtRWRnZURlc3RMYWJlbHMoTm9kZSk7CisgICAgICBmb3IgKDsgaSAhPSBlICYmIGkgIT0gNjQ7ICsraSkgeworICAgICAgICBpZiAoaSkgTyA8PCAifCI7CisgICAgICAgIE8gPDwgIjxkIiA8PCBpIDw8ICI+IgorICAgICAgICAgIDw8IERPVDo6RXNjYXBlU3RyaW5nKERUcmFpdHMuZ2V0RWRnZURlc3RMYWJlbChOb2RlLCBpKSk7CisgICAgICB9CisKKyAgICAgIGlmIChpICE9IGUpCisgICAgICAgIE8gPDwgInw8ZDY0PnRydW5jYXRlZC4uLiI7CisgICAgICBPIDw8ICJ9IjsKKyAgICB9CisKKyAgICBPIDw8ICJ9XCJdO1xuIjsgICAvLyBGaW5pc2ggcHJpbnRpbmcgdGhlICJub2RlIiBsaW5lCisKKyAgICAvLyBPdXRwdXQgYWxsIG9mIHRoZSBlZGdlcyBub3cKKyAgICBjaGlsZF9pdGVyYXRvciBFSSA9IEdUcmFpdHM6OmNoaWxkX2JlZ2luKE5vZGUpOworICAgIGNoaWxkX2l0ZXJhdG9yIEVFID0gR1RyYWl0czo6Y2hpbGRfZW5kKE5vZGUpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IEVJICE9IEVFICYmIGkgIT0gNjQ7ICsrRUksICsraSkKKyAgICAgIGlmICghRFRyYWl0cy5pc05vZGVIaWRkZW4oKkVJKSkKKyAgICAgICAgd3JpdGVFZGdlKE5vZGUsIGksIEVJKTsKKyAgICBmb3IgKDsgRUkgIT0gRUU7ICsrRUkpCisgICAgICBpZiAoIURUcmFpdHMuaXNOb2RlSGlkZGVuKCpFSSkpCisgICAgICAgIHdyaXRlRWRnZShOb2RlLCA2NCwgRUkpOworICB9CisKKyAgdm9pZCB3cml0ZUVkZ2UoTm9kZVJlZiBOb2RlLCB1bnNpZ25lZCBlZGdlaWR4LCBjaGlsZF9pdGVyYXRvciBFSSkgeworICAgIGlmIChOb2RlUmVmIFRhcmdldE5vZGUgPSAqRUkpIHsKKyAgICAgIGludCBEZXN0UG9ydCA9IC0xOworICAgICAgaWYgKERUcmFpdHMuZWRnZVRhcmdldHNFZGdlU291cmNlKE5vZGUsIEVJKSkgeworICAgICAgICBjaGlsZF9pdGVyYXRvciBUYXJnZXRJdCA9IERUcmFpdHMuZ2V0RWRnZVRhcmdldChOb2RlLCBFSSk7CisKKyAgICAgICAgLy8gRmlndXJlIG91dCB3aGljaCBlZGdlIHRoaXMgdGFyZ2V0cy4uLgorICAgICAgICB1bnNpZ25lZCBPZmZzZXQgPQorICAgICAgICAgICh1bnNpZ25lZClzdGQ6OmRpc3RhbmNlKEdUcmFpdHM6OmNoaWxkX2JlZ2luKFRhcmdldE5vZGUpLCBUYXJnZXRJdCk7CisgICAgICAgIERlc3RQb3J0ID0gc3RhdGljX2Nhc3Q8aW50PihPZmZzZXQpOworICAgICAgfQorCisgICAgICBpZiAoRFRyYWl0cy5nZXRFZGdlU291cmNlTGFiZWwoTm9kZSwgRUkpLmVtcHR5KCkpCisgICAgICAgIGVkZ2VpZHggPSAtMTsKKworICAgICAgZW1pdEVkZ2Uoc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KE5vZGUpLCBlZGdlaWR4LAorICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KFRhcmdldE5vZGUpLCBEZXN0UG9ydCwKKyAgICAgICAgICAgICAgIERUcmFpdHMuZ2V0RWRnZUF0dHJpYnV0ZXMoTm9kZSwgRUksIEcpKTsKKyAgICB9CisgIH0KKworICAvLy8gZW1pdFNpbXBsZU5vZGUgLSBPdXRwdXRzIGEgc2ltcGxlIChub24tcmVjb3JkKSBub2RlCisgIHZvaWQgZW1pdFNpbXBsZU5vZGUoY29uc3Qgdm9pZCAqSUQsIGNvbnN0IHN0ZDo6c3RyaW5nICZBdHRyLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZMYWJlbCwgdW5zaWduZWQgTnVtRWRnZVNvdXJjZXMgPSAwLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAqRWRnZVNvdXJjZUxhYmVscyA9IG51bGxwdHIpIHsKKyAgICBPIDw8ICJcdE5vZGUiIDw8IElEIDw8ICJbICI7CisgICAgaWYgKCFBdHRyLmVtcHR5KCkpCisgICAgICBPIDw8IEF0dHIgPDwgIiwiOworICAgIE8gPDwgIiBsYWJlbCA9XCIiOworICAgIGlmIChOdW1FZGdlU291cmNlcykgTyA8PCAieyI7CisgICAgTyA8PCBET1Q6OkVzY2FwZVN0cmluZyhMYWJlbCk7CisgICAgaWYgKE51bUVkZ2VTb3VyY2VzKSB7CisgICAgICBPIDw8ICJ8eyI7CisKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtRWRnZVNvdXJjZXM7ICsraSkgeworICAgICAgICBpZiAoaSkgTyA8PCAifCI7CisgICAgICAgIE8gPDwgIjxzIiA8PCBpIDw8ICI+IjsKKyAgICAgICAgaWYgKEVkZ2VTb3VyY2VMYWJlbHMpIE8gPDwgRE9UOjpFc2NhcGVTdHJpbmcoKCpFZGdlU291cmNlTGFiZWxzKVtpXSk7CisgICAgICB9CisgICAgICBPIDw8ICJ9fSI7CisgICAgfQorICAgIE8gPDwgIlwiXTtcbiI7CisgIH0KKworICAvLy8gZW1pdEVkZ2UgLSBPdXRwdXQgYW4gZWRnZSBmcm9tIGEgc2ltcGxlIG5vZGUgaW50byB0aGUgZ3JhcGguLi4KKyAgdm9pZCBlbWl0RWRnZShjb25zdCB2b2lkICpTcmNOb2RlSUQsIGludCBTcmNOb2RlUG9ydCwKKyAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpEZXN0Tm9kZUlELCBpbnQgRGVzdE5vZGVQb3J0LAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZBdHRycykgeworICAgIGlmIChTcmNOb2RlUG9ydCAgPiA2NCkgcmV0dXJuOyAgICAgICAgICAgICAvLyBFbWluYXRpbmcgZnJvbSB0cnVuY2F0ZWQgcGFydD8KKyAgICBpZiAoRGVzdE5vZGVQb3J0ID4gNjQpIERlc3ROb2RlUG9ydCA9IDY0OyAgLy8gVGFyZ2V0aW5nIHRoZSB0cnVuY2F0ZWQgcGFydD8KKworICAgIE8gPDwgIlx0Tm9kZSIgPDwgU3JjTm9kZUlEOworICAgIGlmIChTcmNOb2RlUG9ydCA+PSAwKQorICAgICAgTyA8PCAiOnMiIDw8IFNyY05vZGVQb3J0OworICAgIE8gPDwgIiAtPiBOb2RlIiA8PCBEZXN0Tm9kZUlEOworICAgIGlmIChEZXN0Tm9kZVBvcnQgPj0gMCAmJiBEVHJhaXRzLmhhc0VkZ2VEZXN0TGFiZWxzKCkpCisgICAgICBPIDw8ICI6ZCIgPDwgRGVzdE5vZGVQb3J0OworCisgICAgaWYgKCFBdHRycy5lbXB0eSgpKQorICAgICAgTyA8PCAiWyIgPDwgQXR0cnMgPDwgIl0iOworICAgIE8gPDwgIjtcbiI7CisgIH0KKworICAvLy8gZ2V0T1N0cmVhbSAtIEdldCB0aGUgcmF3IG91dHB1dCBzdHJlYW0gaW50byB0aGUgZ3JhcGggZmlsZS4gVXNlZnVsIHRvCisgIC8vLyB3cml0ZSBmYW5jeSB0aGluZ3MgdXNpbmcgYWRkQ3VzdG9tR3JhcGhGZWF0dXJlcygpLgorICByYXdfb3N0cmVhbSAmZ2V0T1N0cmVhbSgpIHsKKyAgICByZXR1cm4gTzsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgR3JhcGhUeXBlPgorcmF3X29zdHJlYW0gJldyaXRlR3JhcGgocmF3X29zdHJlYW0gJk8sIGNvbnN0IEdyYXBoVHlwZSAmRywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvcnROYW1lcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJlRpdGxlID0gIiIpIHsKKyAgLy8gU3RhcnQgdGhlIGdyYXBoIGVtaXNzaW9uIHByb2Nlc3MuLi4KKyAgR3JhcGhXcml0ZXI8R3JhcGhUeXBlPiBXKE8sIEcsIFNob3J0TmFtZXMpOworCisgIC8vIEVtaXQgdGhlIGdyYXBoLgorICBXLndyaXRlR3JhcGgoVGl0bGUuc3RyKCkpOworCisgIHJldHVybiBPOworfQorCitzdGQ6OnN0cmluZyBjcmVhdGVHcmFwaEZpbGVuYW1lKGNvbnN0IFR3aW5lICZOYW1lLCBpbnQgJkZEKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEdyYXBoVHlwZT4KK3N0ZDo6c3RyaW5nIFdyaXRlR3JhcGgoY29uc3QgR3JhcGhUeXBlICZHLCBjb25zdCBUd2luZSAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG9ydE5hbWVzID0gZmFsc2UsIGNvbnN0IFR3aW5lICZUaXRsZSA9ICIiKSB7CisgIGludCBGRDsKKyAgLy8gV2luZG93cyBjYW4ndCBhbHdheXMgaGFuZGxlIGxvbmcgcGF0aHMsIHNvIGxpbWl0IHRoZSBsZW5ndGggb2YgdGhlIG5hbWUuCisgIHN0ZDo6c3RyaW5nIE4gPSBOYW1lLnN0cigpOworICBOID0gTi5zdWJzdHIoMCwgc3RkOjptaW48c3RkOjpzaXplX3Q+KE4uc2l6ZSgpLCAxNDApKTsKKyAgc3RkOjpzdHJpbmcgRmlsZW5hbWUgPSBjcmVhdGVHcmFwaEZpbGVuYW1lKE4sIEZEKTsKKyAgcmF3X2ZkX29zdHJlYW0gTyhGRCwgLypzaG91bGRDbG9zZT0qLyB0cnVlKTsKKworICBpZiAoRkQgPT0gLTEpIHsKKyAgICBlcnJzKCkgPDwgImVycm9yIG9wZW5pbmcgZmlsZSAnIiA8PCBGaWxlbmFtZSA8PCAiJyBmb3Igd3JpdGluZyFcbiI7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgbGx2bTo6V3JpdGVHcmFwaChPLCBHLCBTaG9ydE5hbWVzLCBUaXRsZSk7CisgIGVycnMoKSA8PCAiIGRvbmUuIFxuIjsKKworICByZXR1cm4gRmlsZW5hbWU7Cit9CisKKy8vLyBWaWV3R3JhcGggLSBFbWl0IGEgZG90IGdyYXBoLCBydW4gJ2RvdCcsIHJ1biBndiBvbiB0aGUgcG9zdHNjcmlwdCBmaWxlLAorLy8vIHRoZW4gY2xlYW51cC4gIEZvciB1c2UgZnJvbSB0aGUgZGVidWdnZXIuCisvLy8KK3RlbXBsYXRlPHR5cGVuYW1lIEdyYXBoVHlwZT4KK3ZvaWQgVmlld0dyYXBoKGNvbnN0IEdyYXBoVHlwZSAmRywgY29uc3QgVHdpbmUgJk5hbWUsCisgICAgICAgICAgICAgICBib29sIFNob3J0TmFtZXMgPSBmYWxzZSwgY29uc3QgVHdpbmUgJlRpdGxlID0gIiIsCisgICAgICAgICAgICAgICBHcmFwaFByb2dyYW06Ok5hbWUgUHJvZ3JhbSA9IEdyYXBoUHJvZ3JhbTo6RE9UKSB7CisgIHN0ZDo6c3RyaW5nIEZpbGVuYW1lID0gbGx2bTo6V3JpdGVHcmFwaChHLCBOYW1lLCBTaG9ydE5hbWVzLCBUaXRsZSk7CisKKyAgaWYgKEZpbGVuYW1lLmVtcHR5KCkpCisgICAgcmV0dXJuOworCisgIERpc3BsYXlHcmFwaChGaWxlbmFtZSwgZmFsc2UsIFByb2dyYW0pOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0dSQVBIV1JJVEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Ib3N0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvSG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYzVmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvSG9zdC5oCkBAIC0wLDAgKzEsOTkgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvSG9zdC5oIC0gSG9zdCBtYWNoaW5lIGNoYXJhY3RlcmlzdGljcyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE1ldGhvZHMgZm9yIHF1ZXJ5aW5nIHRoZSBuYXR1cmUgb2YgdGhlIGhvc3QgbWFjaGluZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9IT1NUX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0hPU1RfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX0dOVV9fKSB8fCBkZWZpbmVkKF9fSEFJS1VfXykKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNlbGlmIGRlZmluZWQoX0FJWCkKKyNpbmNsdWRlIDxzeXMvbWFjaGluZS5oPgorI2VsaWYgZGVmaW5lZChfX3N1bikKKy8qIFNvbGFyaXMgcHJvdmlkZXMgX0JJR19FTkRJQU4vX0xJVFRMRV9FTkRJQU4gc2VsZWN0b3IgaW4gc3lzL3R5cGVzLmggKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNkZWZpbmUgQklHX0VORElBTiA0MzIxCisjZGVmaW5lIExJVFRMRV9FTkRJQU4gMTIzNAorI2lmIGRlZmluZWQoX0JJR19FTkRJQU4pCisjZGVmaW5lIEJZVEVfT1JERVIgQklHX0VORElBTgorI2Vsc2UKKyNkZWZpbmUgQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisjZW5kaWYKKyNlbHNlCisjaWYgIWRlZmluZWQoQllURV9PUkRFUikgJiYgIWRlZmluZWQoTExWTV9PTl9XSU4zMikKKyNpbmNsdWRlIDxtYWNoaW5lL2VuZGlhbi5oPgorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHN5cyB7CisKKyNpZiBkZWZpbmVkKEJZVEVfT1JERVIpICYmIGRlZmluZWQoQklHX0VORElBTikgJiYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCitjb25zdGV4cHIgYm9vbCBJc0JpZ0VuZGlhbkhvc3QgPSB0cnVlOworI2Vsc2UKK2NvbnN0ZXhwciBib29sIElzQmlnRW5kaWFuSG9zdCA9IGZhbHNlOworI2VuZGlmCisKKyAgc3RhdGljIGNvbnN0IGJvb2wgSXNMaXR0bGVFbmRpYW5Ib3N0ID0gIUlzQmlnRW5kaWFuSG9zdDsKKworICAvLy8gZ2V0RGVmYXVsdFRhcmdldFRyaXBsZSgpIC0gUmV0dXJuIHRoZSBkZWZhdWx0IHRhcmdldCB0cmlwbGUgdGhlIGNvbXBpbGVyCisgIC8vLyBoYXMgYmVlbiBjb25maWd1cmVkIHRvIHByb2R1Y2UgY29kZSBmb3IuCisgIC8vLworICAvLy8gVGhlIHRhcmdldCB0cmlwbGUgaXMgYSBzdHJpbmcgaW4gdGhlIGZvcm1hdCBvZjoKKyAgLy8vICAgQ1BVX1RZUEUtVkVORE9SLU9QRVJBVElOR19TWVNURU0KKyAgLy8vIG9yCisgIC8vLyAgIENQVV9UWVBFLVZFTkRPUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQorICBzdGQ6OnN0cmluZyBnZXREZWZhdWx0VGFyZ2V0VHJpcGxlKCk7CisKKyAgLy8vIGdldFByb2Nlc3NUcmlwbGUoKSAtIFJldHVybiBhbiBhcHByb3ByaWF0ZSB0YXJnZXQgdHJpcGxlIGZvciBnZW5lcmF0aW5nCisgIC8vLyBjb2RlIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBjdXJyZW50IHByb2Nlc3MsIGUuZy4gd2hlbiB1c2luZyB0aGUgSklULgorICBzdGQ6OnN0cmluZyBnZXRQcm9jZXNzVHJpcGxlKCk7CisKKyAgLy8vIGdldEhvc3RDUFVOYW1lIC0gR2V0IHRoZSBMTFZNIG5hbWUgZm9yIHRoZSBob3N0IENQVS4gVGhlIHBhcnRpY3VsYXIgZm9ybWF0CisgIC8vLyBvZiB0aGUgbmFtZSBpcyB0YXJnZXQgZGVwZW5kZW50LCBhbmQgc3VpdGFibGUgZm9yIHBhc3NpbmcgYXMgLW1jcHUgdG8gdGhlCisgIC8vLyB0YXJnZXQgd2hpY2ggbWF0Y2hlcyB0aGUgaG9zdC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIC0gVGhlIGhvc3QgQ1BVIG5hbWUsIG9yIGVtcHR5IGlmIHRoZSBDUFUgY291bGQgbm90IGJlIGRldGVybWluZWQuCisgIFN0cmluZ1JlZiBnZXRIb3N0Q1BVTmFtZSgpOworCisgIC8vLyBnZXRIb3N0Q1BVRmVhdHVyZXMgLSBHZXQgdGhlIExMVk0gbmFtZXMgZm9yIHRoZSBob3N0IENQVSBmZWF0dXJlcy4KKyAgLy8vIFRoZSBwYXJ0aWN1bGFyIGZvcm1hdCBvZiB0aGUgbmFtZXMgYXJlIHRhcmdldCBkZXBlbmRlbnQsIGFuZCBzdWl0YWJsZSBmb3IKKyAgLy8vIHBhc3NpbmcgYXMgLW1hdHRyIHRvIHRoZSB0YXJnZXQgd2hpY2ggbWF0Y2hlcyB0aGUgaG9zdC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRmVhdHVyZXMgLSBBIHN0cmluZyBtYXBwaW5nIGZlYXR1cmUgbmFtZXMgdG8gZWl0aGVyCisgIC8vLyB0cnVlIChpZiBlbmFibGVkKSBvciBmYWxzZSAoaWYgZGlzYWJsZWQpLiBUaGlzIHJvdXRpbmUgbWFrZXMgbm8gZ3VhcmFudGVlcworICAvLy8gYWJvdXQgZXhhY3RseSB3aGljaCBmZWF0dXJlcyBtYXkgYXBwZWFyIGluIHRoaXMgbWFwLCBleGNlcHQgdGhhdCB0aGV5IGFyZQorICAvLy8gYWxsIHZhbGlkIExMVk0gZmVhdHVyZSBuYW1lcy4KKyAgLy8vCisgIC8vLyBccmV0dXJuIC0gVHJ1ZSBvbiBzdWNjZXNzLgorICBib29sIGdldEhvc3RDUFVGZWF0dXJlcyhTdHJpbmdNYXA8Ym9vbD4gJkZlYXR1cmVzKTsKKworICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgcGh5c2ljYWwgY29yZXMgKGFzIG9wcG9zZWQgdG8gbG9naWNhbCBjb3JlcyByZXR1cm5lZAorICAvLy8gZnJvbSB0aHJlYWQ6OmhhcmR3YXJlX2NvbmN1cnJlbmN5KCksIHdoaWNoIGluY2x1ZGVzIGh5cGVydGhyZWFkcykuCisgIC8vLyBSZXR1cm5zIC0xIGlmIHVua25vd24gZm9yIHRoZSBjdXJyZW50IGhvc3Qgc3lzdGVtLgorICBpbnQgZ2V0SG9zdE51bVBoeXNpY2FsQ29yZXMoKTsKKworICBuYW1lc3BhY2UgZGV0YWlsIHsKKyAgLy8vIEhlbHBlciBmdW5jdGlvbnMgdG8gZXh0cmFjdCBIb3N0Q1BVTmFtZSBmcm9tIC9wcm9jL2NwdWluZm8gb24gbGludXguCisgIFN0cmluZ1JlZiBnZXRIb3N0Q1BVTmFtZUZvclBvd2VyUEMoU3RyaW5nUmVmIFByb2NDcHVpbmZvQ29udGVudCk7CisgIFN0cmluZ1JlZiBnZXRIb3N0Q1BVTmFtZUZvckFSTShTdHJpbmdSZWYgUHJvY0NwdWluZm9Db250ZW50KTsKKyAgU3RyaW5nUmVmIGdldEhvc3RDUFVOYW1lRm9yUzM5MHgoU3RyaW5nUmVmIFByb2NDcHVpbmZvQ29udGVudCk7CisgIFN0cmluZ1JlZiBnZXRIb3N0Q1BVTmFtZUZvckJQRigpOworICB9Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0phbUNSQy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0phbUNSQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNjhiYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvSmFtQ1JDLmgKQEAgLTAsMCArMSw0OSBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvSmFtQ1JDLmggLSBDeWNsaWMgUmVkdW5kYW5jeSBDaGVjayAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gb2YgSmFtQ1JDLgorLy8KKy8vIFdlIHdpbGwgdXNlIHRoZSAiUm9ja3NvZnRedG0gTW9kZWwgQ1JDIEFsZ29yaXRobSIgdG8gZGVzY3JpYmUgdGhlIHByb3BlcnRpZXMKKy8vIG9mIHRoaXMgQ1JDOgorLy8gICBXaWR0aCAgOiAzMgorLy8gICBQb2x5ICAgOiAwNEMxMURCNworLy8gICBJbml0ICAgOiBGRkZGRkZGRgorLy8gICBSZWZJbiAgOiBUcnVlCisvLyAgIFJlZk91dCA6IFRydWUKKy8vICAgWG9yT3V0IDogMDAwMDAwMDAKKy8vICAgQ2hlY2sgIDogMzQwQkM2RDkgKHJlc3VsdCBvZiBDUkMgZm9yICIxMjM0NTY3ODkiKQorLy8KKy8vIE4uQi4gIFdlIHBlcm1pdCBmbGV4aWJpbGl0eSBvZiB0aGUgIkluaXQiIHZhbHVlLiAgU29tZSBjb25zdW1lcnMgb2YgdGhpcyBuZWVkCisvLyAgICAgICBpdCB0byBiZSB6ZXJvLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0pBTUNSQ19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9KQU1DUkNfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CisKK2NsYXNzIEphbUNSQyB7CitwdWJsaWM6CisgIEphbUNSQyh1aW50MzJfdCBJbml0ID0gMHhGRkZGRkZGRlUpIDogQ1JDKEluaXQpIHt9CisKKyAgLy8gXGJyaWVmIFVwZGF0ZSB0aGUgQ1JDIGNhbGN1bGF0aW9uIHdpdGggRGF0YS4KKyAgdm9pZCB1cGRhdGUoQXJyYXlSZWY8Y2hhcj4gRGF0YSk7CisKKyAgdWludDMyX3QgZ2V0Q1JDKCkgY29uc3QgeyByZXR1cm4gQ1JDOyB9CisKK3ByaXZhdGU6CisgIHVpbnQzMl90IENSQzsKK307Cit9IC8vIEVuZCBvZiBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Lbm93bkJpdHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Lbm93bkJpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2U3M2IxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0tub3duQml0cy5oCkBAIC0wLDAgKzEsMjAyIEBACisvLz09PS0gbGx2bS9TdXBwb3J0L0tub3duQml0cy5oIC0gU3RvcmVzIGtub3duIHplcm9zL29uZXMgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhIGNsYXNzIGZvciByZXByZXNlbnRpbmcga25vd24gemVyb3MgYW5kIG9uZXMgdXNlZCBieQorLy8gY29tcHV0ZUtub3duQml0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9LTk9XTkJJVFNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfS05PV05CSVRTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FQSW50LmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8gU3RydWN0IGZvciB0cmFja2luZyB0aGUga25vd24gemVyb3MgYW5kIG9uZXMgb2YgYSB2YWx1ZS4KK3N0cnVjdCBLbm93bkJpdHMgeworICBBUEludCBaZXJvOworICBBUEludCBPbmU7CisKK3ByaXZhdGU6CisgIC8vIEludGVybmFsIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyBhIEtub3duQml0cyBmcm9tIHR3byBBUEludHMuCisgIEtub3duQml0cyhBUEludCBaZXJvLCBBUEludCBPbmUpCisgICAgICA6IFplcm8oc3RkOjptb3ZlKFplcm8pKSwgT25lKHN0ZDo6bW92ZShPbmUpKSB7fQorCitwdWJsaWM6CisgIC8vIERlZmF1bHQgY29uc3RydWN0IFplcm8gYW5kIE9uZS4KKyAgS25vd25CaXRzKCkge30KKworICAvLy8gQ3JlYXRlIGEga25vd24gYml0cyBvYmplY3Qgb2YgQml0V2lkdGggYml0cyBpbml0aWFsaXplZCB0byB1bmtub3duLgorICBLbm93bkJpdHModW5zaWduZWQgQml0V2lkdGgpIDogWmVybyhCaXRXaWR0aCwgMCksIE9uZShCaXRXaWR0aCwgMCkge30KKworICAvLy8gR2V0IHRoZSBiaXQgd2lkdGggb2YgdGhpcyB2YWx1ZS4KKyAgdW5zaWduZWQgZ2V0Qml0V2lkdGgoKSBjb25zdCB7CisgICAgYXNzZXJ0KFplcm8uZ2V0Qml0V2lkdGgoKSA9PSBPbmUuZ2V0Qml0V2lkdGgoKSAmJgorICAgICAgICAgICAiWmVybyBhbmQgT25lIHNob3VsZCBoYXZlIHRoZSBzYW1lIHdpZHRoISIpOworICAgIHJldHVybiBaZXJvLmdldEJpdFdpZHRoKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGNvbmZsaWN0aW5nIGluZm9ybWF0aW9uLgorICBib29sIGhhc0NvbmZsaWN0KCkgY29uc3QgeyByZXR1cm4gWmVyby5pbnRlcnNlY3RzKE9uZSk7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHdlIGtub3cgdGhlIHZhbHVlIG9mIGFsbCBiaXRzLgorICBib29sIGlzQ29uc3RhbnQoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFoYXNDb25mbGljdCgpICYmICJLbm93bkJpdHMgY29uZmxpY3QhIik7CisgICAgcmV0dXJuIFplcm8uY291bnRQb3B1bGF0aW9uKCkgKyBPbmUuY291bnRQb3B1bGF0aW9uKCkgPT0gZ2V0Qml0V2lkdGgoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSB3aGVuIGFsbCBiaXRzIGhhdmUgYSBrbm93biB2YWx1ZS4gVGhpcyBqdXN0IHJldHVybnMgT25lCisgIC8vLyB3aXRoIGEgcHJvdGVjdGl2ZSBhc3NlcnRpb24uCisgIGNvbnN0IEFQSW50ICZnZXRDb25zdGFudCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNDb25zdGFudCgpICYmICJDYW4gb25seSBnZXQgdmFsdWUgd2hlbiBhbGwgYml0cyBhcmUga25vd24iKTsKKyAgICByZXR1cm4gT25lOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB3ZSBkb24ndCBrbm93IGFueSBiaXRzLgorICBib29sIGlzVW5rbm93bigpIGNvbnN0IHsgcmV0dXJuIFplcm8uaXNOdWxsVmFsdWUoKSAmJiBPbmUuaXNOdWxsVmFsdWUoKTsgfQorCisgIC8vLyBSZXNldHMgdGhlIGtub3duIHN0YXRlIG9mIGFsbCBiaXRzLgorICB2b2lkIHJlc2V0QWxsKCkgeworICAgIFplcm8uY2xlYXJBbGxCaXRzKCk7CisgICAgT25lLmNsZWFyQWxsQml0cygpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhbGwgemVyby4KKyAgYm9vbCBpc1plcm8oKSBjb25zdCB7CisgICAgYXNzZXJ0KCFoYXNDb25mbGljdCgpICYmICJLbm93bkJpdHMgY29uZmxpY3QhIik7CisgICAgcmV0dXJuIFplcm8uaXNBbGxPbmVzVmFsdWUoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYWxsIG9uZSBiaXRzLgorICBib29sIGlzQWxsT25lcygpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWhhc0NvbmZsaWN0KCkgJiYgIktub3duQml0cyBjb25mbGljdCEiKTsKKyAgICByZXR1cm4gT25lLmlzQWxsT25lc1ZhbHVlKCk7CisgIH0KKworICAvLy8gTWFrZSBhbGwgYml0cyBrbm93biB0byBiZSB6ZXJvIGFuZCBkaXNjYXJkIGFueSBwcmV2aW91cyBpbmZvcm1hdGlvbi4KKyAgdm9pZCBzZXRBbGxaZXJvKCkgeworICAgIFplcm8uc2V0QWxsQml0cygpOworICAgIE9uZS5jbGVhckFsbEJpdHMoKTsKKyAgfQorCisgIC8vLyBNYWtlIGFsbCBiaXRzIGtub3duIHRvIGJlIG9uZSBhbmQgZGlzY2FyZCBhbnkgcHJldmlvdXMgaW5mb3JtYXRpb24uCisgIHZvaWQgc2V0QWxsT25lcygpIHsKKyAgICBaZXJvLmNsZWFyQWxsQml0cygpOworICAgIE9uZS5zZXRBbGxCaXRzKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgaXMga25vd24gdG8gYmUgbmVnYXRpdmUuCisgIGJvb2wgaXNOZWdhdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIE9uZS5pc1NpZ25CaXRTZXQoKTsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSBpcyBrbm93biB0byBiZSBub24tbmVnYXRpdmUuCisgIGJvb2wgaXNOb25OZWdhdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIFplcm8uaXNTaWduQml0U2V0KCk7IH0KKworICAvLy8gTWFrZSB0aGlzIHZhbHVlIG5lZ2F0aXZlLgorICB2b2lkIG1ha2VOZWdhdGl2ZSgpIHsKKyAgICBPbmUuc2V0U2lnbkJpdCgpOworICB9CisKKyAgLy8vIE1ha2UgdGhpcyB2YWx1ZSBuZWdhdGl2ZS4KKyAgdm9pZCBtYWtlTm9uTmVnYXRpdmUoKSB7CisgICAgWmVyby5zZXRTaWduQml0KCk7CisgIH0KKworICAvLy8gVHJ1bmNhdGUgdGhlIHVuZGVybHlpbmcga25vd24gWmVybyBhbmQgT25lIGJpdHMuIFRoaXMgaXMgZXF1aXZhbGVudAorICAvLy8gdG8gdHJ1bmNhdGluZyB0aGUgdmFsdWUgd2UncmUgdHJhY2tpbmcuCisgIEtub3duQml0cyB0cnVuYyh1bnNpZ25lZCBCaXRXaWR0aCkgeworICAgIHJldHVybiBLbm93bkJpdHMoWmVyby50cnVuYyhCaXRXaWR0aCksIE9uZS50cnVuYyhCaXRXaWR0aCkpOworICB9CisKKyAgLy8vIFplcm8gZXh0ZW5kcyB0aGUgdW5kZXJseWluZyBrbm93biBaZXJvIGFuZCBPbmUgYml0cy4gVGhpcyBpcyBlcXVpdmFsZW50CisgIC8vLyB0byB6ZXJvIGV4dGVuZGluZyB0aGUgdmFsdWUgd2UncmUgdHJhY2tpbmcuCisgIEtub3duQml0cyB6ZXh0KHVuc2lnbmVkIEJpdFdpZHRoKSB7CisgICAgcmV0dXJuIEtub3duQml0cyhaZXJvLnpleHQoQml0V2lkdGgpLCBPbmUuemV4dChCaXRXaWR0aCkpOworICB9CisKKyAgLy8vIFNpZ24gZXh0ZW5kcyB0aGUgdW5kZXJseWluZyBrbm93biBaZXJvIGFuZCBPbmUgYml0cy4gVGhpcyBpcyBlcXVpdmFsZW50CisgIC8vLyB0byBzaWduIGV4dGVuZGluZyB0aGUgdmFsdWUgd2UncmUgdHJhY2tpbmcuCisgIEtub3duQml0cyBzZXh0KHVuc2lnbmVkIEJpdFdpZHRoKSB7CisgICAgcmV0dXJuIEtub3duQml0cyhaZXJvLnNleHQoQml0V2lkdGgpLCBPbmUuc2V4dChCaXRXaWR0aCkpOworICB9CisKKyAgLy8vIFplcm8gZXh0ZW5kcyBvciB0cnVuY2F0ZXMgdGhlIHVuZGVybHlpbmcga25vd24gWmVybyBhbmQgT25lIGJpdHMuIFRoaXMgaXMKKyAgLy8vIGVxdWl2YWxlbnQgdG8gemVybyBleHRlbmRpbmcgb3IgdHJ1bmNhdGluZyB0aGUgdmFsdWUgd2UncmUgdHJhY2tpbmcuCisgIEtub3duQml0cyB6ZXh0T3JUcnVuYyh1bnNpZ25lZCBCaXRXaWR0aCkgeworICAgIHJldHVybiBLbm93bkJpdHMoWmVyby56ZXh0T3JUcnVuYyhCaXRXaWR0aCksIE9uZS56ZXh0T3JUcnVuYyhCaXRXaWR0aCkpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHRyYWlsaW5nIHplcm8gYml0cy4KKyAgdW5zaWduZWQgY291bnRNaW5UcmFpbGluZ1plcm9zKCkgY29uc3QgeworICAgIHJldHVybiBaZXJvLmNvdW50VHJhaWxpbmdPbmVzKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbWluaW11bSBudW1iZXIgb2YgdHJhaWxpbmcgb25lIGJpdHMuCisgIHVuc2lnbmVkIGNvdW50TWluVHJhaWxpbmdPbmVzKCkgY29uc3QgeworICAgIHJldHVybiBPbmUuY291bnRUcmFpbGluZ09uZXMoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBsZWFkaW5nIHplcm8gYml0cy4KKyAgdW5zaWduZWQgY291bnRNaW5MZWFkaW5nWmVyb3MoKSBjb25zdCB7CisgICAgcmV0dXJuIFplcm8uY291bnRMZWFkaW5nT25lcygpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGxlYWRpbmcgb25lIGJpdHMuCisgIHVuc2lnbmVkIGNvdW50TWluTGVhZGluZ09uZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIE9uZS5jb3VudExlYWRpbmdPbmVzKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBzaWduIGJpdCBpcyByZXBsaWNhdGVkIGludG8gdGhlIG90aGVyCisgIC8vLyBiaXRzLgorICB1bnNpZ25lZCBjb3VudE1pblNpZ25CaXRzKCkgY29uc3QgeworICAgIGlmIChpc05vbk5lZ2F0aXZlKCkpCisgICAgICByZXR1cm4gY291bnRNaW5MZWFkaW5nWmVyb3MoKTsKKyAgICBpZiAoaXNOZWdhdGl2ZSgpKQorICAgICAgcmV0dXJuIGNvdW50TWluTGVhZGluZ09uZXMoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvIGJpdHMgcG9zc2libGUuCisgIHVuc2lnbmVkIGNvdW50TWF4VHJhaWxpbmdaZXJvcygpIGNvbnN0IHsKKyAgICByZXR1cm4gT25lLmNvdW50VHJhaWxpbmdaZXJvcygpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYWlsaW5nIG9uZSBiaXRzIHBvc3NpYmxlLgorICB1bnNpZ25lZCBjb3VudE1heFRyYWlsaW5nT25lcygpIGNvbnN0IHsKKyAgICByZXR1cm4gWmVyby5jb3VudFRyYWlsaW5nWmVyb3MoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsZWFkaW5nIHplcm8gYml0cyBwb3NzaWJsZS4KKyAgdW5zaWduZWQgY291bnRNYXhMZWFkaW5nWmVyb3MoKSBjb25zdCB7CisgICAgcmV0dXJuIE9uZS5jb3VudExlYWRpbmdaZXJvcygpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxlYWRpbmcgb25lIGJpdHMgcG9zc2libGUuCisgIHVuc2lnbmVkIGNvdW50TWF4TGVhZGluZ09uZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIFplcm8uY291bnRMZWFkaW5nWmVyb3MoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyBrbm93biB0byBiZSBvbmUuCisgIHVuc2lnbmVkIGNvdW50TWluUG9wdWxhdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gT25lLmNvdW50UG9wdWxhdGlvbigpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJpdHMgdGhhdCBjb3VsZCBiZSBvbmUuCisgIHVuc2lnbmVkIGNvdW50TWF4UG9wdWxhdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Qml0V2lkdGgoKSAtIFplcm8uY291bnRQb3B1bGF0aW9uKCk7CisgIH0KKworICAvLy8gQ29tcHV0ZSBrbm93biBiaXRzIHJlc3VsdGluZyBmcm9tIGFkZGluZyBMSFMgYW5kIFJIUy4KKyAgc3RhdGljIEtub3duQml0cyBjb21wdXRlRm9yQWRkU3ViKGJvb2wgQWRkLCBib29sIE5TVywgY29uc3QgS25vd25CaXRzICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbm93bkJpdHMgUkhTKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0xFQjEyOC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0xFQjEyOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZWIwNzIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTEVCMTI4LmgKQEAgLTAsMCArMSwxOTcgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvTEVCMTI4LmggLSBbU1VdTEVCMTI4IHV0aWxpdHkgZnVuY3Rpb25zIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHNvbWUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGVuY29kaW5nIFNMRUIxMjggYW5kCisvLyBVTEVCMTI4IHZhbHVlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9MRUIxMjhfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfTEVCMTI4X0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGVuY29kZSBhIFNMRUIxMjggdmFsdWUgdG8gYW4gb3V0cHV0IHN0cmVhbS4gUmV0dXJucworLy8vIHRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGVuY29kZWQgdmFsdWUuCitpbmxpbmUgdW5zaWduZWQgZW5jb2RlU0xFQjEyOChpbnQ2NF90IFZhbHVlLCByYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQYWRUbyA9IDApIHsKKyAgYm9vbCBNb3JlOworICB1bnNpZ25lZCBDb3VudCA9IDA7CisgIGRvIHsKKyAgICB1aW50OF90IEJ5dGUgPSBWYWx1ZSAmIDB4N2Y7CisgICAgLy8gTk9URTogdGhpcyBhc3N1bWVzIHRoYXQgdGhpcyBzaWduZWQgc2hpZnQgaXMgYW4gYXJpdGhtZXRpYyByaWdodCBzaGlmdC4KKyAgICBWYWx1ZSA+Pj0gNzsKKyAgICBNb3JlID0gISgoKChWYWx1ZSA9PSAwICkgJiYgKChCeXRlICYgMHg0MCkgPT0gMCkpIHx8CisgICAgICAgICAgICAgICgoVmFsdWUgPT0gLTEpICYmICgoQnl0ZSAmIDB4NDApICE9IDApKSkpOworICAgIENvdW50Kys7CisgICAgaWYgKE1vcmUgfHwgQ291bnQgPCBQYWRUbykKKyAgICAgIEJ5dGUgfD0gMHg4MDsgLy8gTWFyayB0aGlzIGJ5dGUgdG8gc2hvdyB0aGF0IG1vcmUgYnl0ZXMgd2lsbCBmb2xsb3cuCisgICAgT1MgPDwgY2hhcihCeXRlKTsKKyAgfSB3aGlsZSAoTW9yZSk7CisKKyAgLy8gUGFkIHdpdGggMHg4MCBhbmQgZW1pdCBhIHRlcm1pbmF0aW5nIGJ5dGUgYXQgdGhlIGVuZC4KKyAgaWYgKENvdW50IDwgUGFkVG8pIHsKKyAgICB1aW50OF90IFBhZFZhbHVlID0gVmFsdWUgPCAwID8gMHg3ZiA6IDB4MDA7CisgICAgZm9yICg7IENvdW50IDwgUGFkVG8gLSAxOyArK0NvdW50KQorICAgICAgT1MgPDwgY2hhcihQYWRWYWx1ZSB8IDB4ODApOworICAgIE9TIDw8IGNoYXIoUGFkVmFsdWUpOworICAgIENvdW50Kys7CisgIH0KKyAgcmV0dXJuIENvdW50OworfQorCisvLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBlbmNvZGUgYSBTTEVCMTI4IHZhbHVlIHRvIGEgYnVmZmVyLiBSZXR1cm5zCisvLy8gdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZW5jb2RlZCB2YWx1ZS4KK2lubGluZSB1bnNpZ25lZCBlbmNvZGVTTEVCMTI4KGludDY0X3QgVmFsdWUsIHVpbnQ4X3QgKnAsIHVuc2lnbmVkIFBhZFRvID0gMCkgeworICB1aW50OF90ICpvcmlnX3AgPSBwOworICB1bnNpZ25lZCBDb3VudCA9IDA7CisgIGJvb2wgTW9yZTsKKyAgZG8geworICAgIHVpbnQ4X3QgQnl0ZSA9IFZhbHVlICYgMHg3ZjsKKyAgICAvLyBOT1RFOiB0aGlzIGFzc3VtZXMgdGhhdCB0aGlzIHNpZ25lZCBzaGlmdCBpcyBhbiBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0LgorICAgIFZhbHVlID4+PSA3OworICAgIE1vcmUgPSAhKCgoKFZhbHVlID09IDAgKSAmJiAoKEJ5dGUgJiAweDQwKSA9PSAwKSkgfHwKKyAgICAgICAgICAgICAgKChWYWx1ZSA9PSAtMSkgJiYgKChCeXRlICYgMHg0MCkgIT0gMCkpKSk7CisgICAgQ291bnQrKzsKKyAgICBpZiAoTW9yZSB8fCBDb3VudCA8IFBhZFRvKQorICAgICAgQnl0ZSB8PSAweDgwOyAvLyBNYXJrIHRoaXMgYnl0ZSB0byBzaG93IHRoYXQgbW9yZSBieXRlcyB3aWxsIGZvbGxvdy4KKyAgICAqcCsrID0gQnl0ZTsKKyAgfSB3aGlsZSAoTW9yZSk7CisKKyAgLy8gUGFkIHdpdGggMHg4MCBhbmQgZW1pdCBhIHRlcm1pbmF0aW5nIGJ5dGUgYXQgdGhlIGVuZC4KKyAgaWYgKENvdW50IDwgUGFkVG8pIHsKKyAgICB1aW50OF90IFBhZFZhbHVlID0gVmFsdWUgPCAwID8gMHg3ZiA6IDB4MDA7CisgICAgZm9yICg7IENvdW50IDwgUGFkVG8gLSAxOyArK0NvdW50KQorICAgICAgKnArKyA9IChQYWRWYWx1ZSB8IDB4ODApOworICAgICpwKysgPSBQYWRWYWx1ZTsKKyAgfQorICByZXR1cm4gKHVuc2lnbmVkKShwIC0gb3JpZ19wKTsKK30KKworLy8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gZW5jb2RlIGEgVUxFQjEyOCB2YWx1ZSB0byBhbiBvdXRwdXQgc3RyZWFtLiBSZXR1cm5zCisvLy8gdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZW5jb2RlZCB2YWx1ZS4KK2lubGluZSB1bnNpZ25lZCBlbmNvZGVVTEVCMTI4KHVpbnQ2NF90IFZhbHVlLCByYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQYWRUbyA9IDApIHsKKyAgdW5zaWduZWQgQ291bnQgPSAwOworICBkbyB7CisgICAgdWludDhfdCBCeXRlID0gVmFsdWUgJiAweDdmOworICAgIFZhbHVlID4+PSA3OworICAgIENvdW50Kys7CisgICAgaWYgKFZhbHVlICE9IDAgfHwgQ291bnQgPCBQYWRUbykKKyAgICAgIEJ5dGUgfD0gMHg4MDsgLy8gTWFyayB0aGlzIGJ5dGUgdG8gc2hvdyB0aGF0IG1vcmUgYnl0ZXMgd2lsbCBmb2xsb3cuCisgICAgT1MgPDwgY2hhcihCeXRlKTsKKyAgfSB3aGlsZSAoVmFsdWUgIT0gMCk7CisKKyAgLy8gUGFkIHdpdGggMHg4MCBhbmQgZW1pdCBhIG51bGwgYnl0ZSBhdCB0aGUgZW5kLgorICBpZiAoQ291bnQgPCBQYWRUbykgeworICAgIGZvciAoOyBDb3VudCA8IFBhZFRvIC0gMTsgKytDb3VudCkKKyAgICAgIE9TIDw8ICdceDgwJzsKKyAgICBPUyA8PCAnXHgwMCc7CisgICAgQ291bnQrKzsKKyAgfQorICByZXR1cm4gQ291bnQ7Cit9CisKKy8vLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGVuY29kZSBhIFVMRUIxMjggdmFsdWUgdG8gYSBidWZmZXIuIFJldHVybnMKKy8vLyB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBlbmNvZGVkIHZhbHVlLgoraW5saW5lIHVuc2lnbmVkIGVuY29kZVVMRUIxMjgodWludDY0X3QgVmFsdWUsIHVpbnQ4X3QgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQYWRUbyA9IDApIHsKKyAgdWludDhfdCAqb3JpZ19wID0gcDsKKyAgdW5zaWduZWQgQ291bnQgPSAwOworICBkbyB7CisgICAgdWludDhfdCBCeXRlID0gVmFsdWUgJiAweDdmOworICAgIFZhbHVlID4+PSA3OworICAgIENvdW50Kys7CisgICAgaWYgKFZhbHVlICE9IDAgfHwgQ291bnQgPCBQYWRUbykKKyAgICAgIEJ5dGUgfD0gMHg4MDsgLy8gTWFyayB0aGlzIGJ5dGUgdG8gc2hvdyB0aGF0IG1vcmUgYnl0ZXMgd2lsbCBmb2xsb3cuCisgICAgKnArKyA9IEJ5dGU7CisgIH0gd2hpbGUgKFZhbHVlICE9IDApOworCisgIC8vIFBhZCB3aXRoIDB4ODAgYW5kIGVtaXQgYSBudWxsIGJ5dGUgYXQgdGhlIGVuZC4KKyAgaWYgKENvdW50IDwgUGFkVG8pIHsKKyAgICBmb3IgKDsgQ291bnQgPCBQYWRUbyAtIDE7ICsrQ291bnQpCisgICAgICAqcCsrID0gJ1x4ODAnOworICAgICpwKysgPSAnXHgwMCc7CisgIH0KKworICByZXR1cm4gKHVuc2lnbmVkKShwIC0gb3JpZ19wKTsKK30KKworLy8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gZGVjb2RlIGEgVUxFQjEyOCB2YWx1ZS4KK2lubGluZSB1aW50NjRfdCBkZWNvZGVVTEVCMTI4KGNvbnN0IHVpbnQ4X3QgKnAsIHVuc2lnbmVkICpuID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZXJyb3IgPSBudWxscHRyKSB7CisgIGNvbnN0IHVpbnQ4X3QgKm9yaWdfcCA9IHA7CisgIHVpbnQ2NF90IFZhbHVlID0gMDsKKyAgdW5zaWduZWQgU2hpZnQgPSAwOworICBpZiAoZXJyb3IpCisgICAgKmVycm9yID0gbnVsbHB0cjsKKyAgZG8geworICAgIGlmIChlbmQgJiYgcCA9PSBlbmQpIHsKKyAgICAgIGlmIChlcnJvcikKKyAgICAgICAgKmVycm9yID0gIm1hbGZvcm1lZCB1bGViMTI4LCBleHRlbmRzIHBhc3QgZW5kIjsKKyAgICAgIGlmIChuKQorICAgICAgICAqbiA9ICh1bnNpZ25lZCkocCAtIG9yaWdfcCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdWludDY0X3QgU2xpY2UgPSAqcCAmIDB4N2Y7CisgICAgaWYgKFNoaWZ0ID49IDY0IHx8IFNsaWNlIDw8IFNoaWZ0ID4+IFNoaWZ0ICE9IFNsaWNlKSB7CisgICAgICBpZiAoZXJyb3IpCisgICAgICAgICplcnJvciA9ICJ1bGViMTI4IHRvbyBiaWcgZm9yIHVpbnQ2NCI7CisgICAgICBpZiAobikKKyAgICAgICAgKm4gPSAodW5zaWduZWQpKHAgLSBvcmlnX3ApOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFZhbHVlICs9IHVpbnQ2NF90KCpwICYgMHg3ZikgPDwgU2hpZnQ7CisgICAgU2hpZnQgKz0gNzsKKyAgfSB3aGlsZSAoKnArKyA+PSAxMjgpOworICBpZiAobikKKyAgICAqbiA9ICh1bnNpZ25lZCkocCAtIG9yaWdfcCk7CisgIHJldHVybiBWYWx1ZTsKK30KKworLy8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gZGVjb2RlIGEgU0xFQjEyOCB2YWx1ZS4KK2lubGluZSBpbnQ2NF90IGRlY29kZVNMRUIxMjgoY29uc3QgdWludDhfdCAqcCwgdW5zaWduZWQgKm4gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZXJyb3IgPSBudWxscHRyKSB7CisgIGNvbnN0IHVpbnQ4X3QgKm9yaWdfcCA9IHA7CisgIGludDY0X3QgVmFsdWUgPSAwOworICB1bnNpZ25lZCBTaGlmdCA9IDA7CisgIHVpbnQ4X3QgQnl0ZTsKKyAgZG8geworICAgIGlmIChlbmQgJiYgcCA9PSBlbmQpIHsKKyAgICAgIGlmIChlcnJvcikKKyAgICAgICAgKmVycm9yID0gIm1hbGZvcm1lZCBzbGViMTI4LCBleHRlbmRzIHBhc3QgZW5kIjsKKyAgICAgIGlmIChuKQorICAgICAgICAqbiA9ICh1bnNpZ25lZCkocCAtIG9yaWdfcCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQnl0ZSA9ICpwKys7CisgICAgVmFsdWUgfD0gKGludDY0X3QoQnl0ZSAmIDB4N2YpIDw8IFNoaWZ0KTsKKyAgICBTaGlmdCArPSA3OworICB9IHdoaWxlIChCeXRlID49IDEyOCk7CisgIC8vIFNpZ24gZXh0ZW5kIG5lZ2F0aXZlIG51bWJlcnMuCisgIGlmIChCeXRlICYgMHg0MCkKKyAgICBWYWx1ZSB8PSAoLTFVTEwpIDw8IFNoaWZ0OworICBpZiAobikKKyAgICAqbiA9ICh1bnNpZ25lZCkocCAtIG9yaWdfcCk7CisgIHJldHVybiBWYWx1ZTsKK30KKworLy8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzaXplIG9mIHRoZSBVTEVCMTI4LWVuY29kZWQgdmFsdWUuCitleHRlcm4gdW5zaWduZWQgZ2V0VUxFQjEyOFNpemUodWludDY0X3QgVmFsdWUpOworCisvLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBnZXQgdGhlIHNpemUgb2YgdGhlIFNMRUIxMjgtZW5jb2RlZCB2YWx1ZS4KK2V4dGVybiB1bnNpZ25lZCBnZXRTTEVCMTI4U2l6ZShpbnQ2NF90IFZhbHVlKTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TWVNURU1fTEVCMTI4X0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9MSUNFTlNFLlRYVCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9MSUNFTlNFLlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDc5YjNmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0xJQ0VOU0UuVFhUCkBAIC0wLDAgKzEsNiBAQAorTExWTSBTeXN0ZW0gSW50ZXJmYWNlIExpYnJhcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBMTFZNIFN5c3RlbSBJbnRlcmZhY2UgTGlicmFyeSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSWxsaW5vaXMgT3BlbiBTb3VyY2UKK0xpY2Vuc2UgYW5kIGhhcyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY29weXJpZ2h0OgorCitDb3B5cmlnaHQgKEMpIDIwMDQgZVh0ZW5zaWJsZSBTeXN0ZW1zLCBJbmMuCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTGluZUl0ZXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTGluZUl0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ0Y2QzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9MaW5lSXRlcmF0b3IuaApAQCAtMCwwICsxLDg4IEBACisvLz09PS0gTGluZUl0ZXJhdG9yLmggLSBJdGVyYXRvciB0byByZWFkIGEgdGV4dCBidWZmZXIncyBsaW5lcyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9MSU5FSVRFUkFUT1JfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfTElORUlURVJBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNZW1vcnlCdWZmZXI7CisKKy8vLyBcYnJpZWYgQSBmb3J3YXJkIGl0ZXJhdG9yIHdoaWNoIHJlYWRzIHRleHQgbGluZXMgZnJvbSBhIGJ1ZmZlci4KKy8vLworLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBmb3J3YXJkIGl0ZXJhdG9yIGludGVyZmFjZSBmb3IgcmVhZGluZyBvbmUgbGluZSBhdAorLy8vIGEgdGltZSBmcm9tIGEgYnVmZmVyLiBXaGVuIGRlZmF1bHQgY29uc3RydWN0ZWQgdGhlIGl0ZXJhdG9yIHdpbGwgYmUgdGhlCisvLy8gImVuZCIgaXRlcmF0b3IuCisvLy8KKy8vLyBUaGUgaXRlcmF0b3IgaXMgYXdhcmUgb2Ygd2hhdCBsaW5lIG51bWJlciBpdCBpcyBjdXJyZW50bHkgcHJvY2Vzc2luZy4gSXQKKy8vLyBzdHJpcHMgYmxhbmsgbGluZXMgYnkgZGVmYXVsdCwgYW5kIGNvbW1lbnQgbGluZXMgZ2l2ZW4gYSBjb21tZW50LXN0YXJ0aW5nCisvLy8gY2hhcmFjdGVyLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgaXRlcmF0b3IgcmVxdWlyZXMgdGhlIGJ1ZmZlciB0byBiZSBudWwgdGVybWluYXRlZC4KK2NsYXNzIGxpbmVfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIFN0cmluZ1JlZj4geworICBjb25zdCBNZW1vcnlCdWZmZXIgKkJ1ZmZlcjsKKyAgY2hhciBDb21tZW50TWFya2VyOworICBib29sIFNraXBCbGFua3M7CisKKyAgdW5zaWduZWQgTGluZU51bWJlcjsKKyAgU3RyaW5nUmVmIEN1cnJlbnRMaW5lOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3QgYW4gImVuZCIgaXRlcmF0b3IuCisgIGxpbmVfaXRlcmF0b3IoKSA6IEJ1ZmZlcihudWxscHRyKSB7fQorCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgbmV3IGl0ZXJhdG9yIGFyb3VuZCBzb21lIG1lbW9yeSBidWZmZXIuCisgIGV4cGxpY2l0IGxpbmVfaXRlcmF0b3IoY29uc3QgTWVtb3J5QnVmZmVyICZCdWZmZXIsIGJvb2wgU2tpcEJsYW5rcyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBDb21tZW50TWFya2VyID0gJ1wwJyk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB3ZSd2ZSByZWFjaGVkIEVPRiBvciBhcmUgYW4gImVuZCIgaXRlcmF0b3IuCisgIGJvb2wgaXNfYXRfZW9mKCkgY29uc3QgeyByZXR1cm4gIUJ1ZmZlcjsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgd2UncmUgYW4gImVuZCIgaXRlcmF0b3Igb3IgaGF2ZSByZWFjaGVkIEVPRi4KKyAgYm9vbCBpc19hdF9lbmQoKSBjb25zdCB7IHJldHVybiBpc19hdF9lb2YoKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLiBNYXkgcmV0dXJuIGFueSBudW1iZXIgYXQgRU9GLgorICBpbnQ2NF90IGxpbmVfbnVtYmVyKCkgY29uc3QgeyByZXR1cm4gTGluZU51bWJlcjsgfQorCisgIC8vLyBcYnJpZWYgQWR2YW5jZSB0byB0aGUgbmV4dCAobm9uLWVtcHR5LCBub24tY29tbWVudCkgbGluZS4KKyAgbGluZV9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICBhZHZhbmNlKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGxpbmVfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBsaW5lX2l0ZXJhdG9yIHRtcCgqdGhpcyk7CisgICAgYWR2YW5jZSgpOworICAgIHJldHVybiB0bXA7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgY3VycmVudCBsaW5lIGFzIGEgXGMgU3RyaW5nUmVmLgorICBTdHJpbmdSZWYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQ3VycmVudExpbmU7IH0KKyAgY29uc3QgU3RyaW5nUmVmICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJkN1cnJlbnRMaW5lOyB9CisKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBsaW5lX2l0ZXJhdG9yICZMSFMsIGNvbnN0IGxpbmVfaXRlcmF0b3IgJlJIUykgeworICAgIHJldHVybiBMSFMuQnVmZmVyID09IFJIUy5CdWZmZXIgJiYKKyAgICAgICAgICAgTEhTLkN1cnJlbnRMaW5lLmJlZ2luKCkgPT0gUkhTLkN1cnJlbnRMaW5lLmJlZ2luKCk7CisgIH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGxpbmVfaXRlcmF0b3IgJkxIUywgY29uc3QgbGluZV9pdGVyYXRvciAmUkhTKSB7CisgICAgcmV0dXJuICEoTEhTID09IFJIUyk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBBZHZhbmNlIHRoZSBpdGVyYXRvciB0byB0aGUgbmV4dCBsaW5lLgorICB2b2lkIGFkdmFuY2UoKTsKK307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0xvY2FsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0xvY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YTJjMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTG9jYWxlLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBMTFZNX1NVUFBPUlRfTE9DQUxFX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0xPQ0FMRV9ICisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFN0cmluZ1JlZjsKKworbmFtZXNwYWNlIHN5cyB7CituYW1lc3BhY2UgbG9jYWxlIHsKKworaW50IGNvbHVtbldpZHRoKFN0cmluZ1JlZiBzKTsKK2Jvb2wgaXNQcmludChpbnQgYyk7CisKK30KK30KK30KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9MT0NBTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0xvY2tGaWxlTWFuYWdlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0xvY2tGaWxlTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNDE3YmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTG9ja0ZpbGVNYW5hZ2VyLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8vPT09LS0tIExvY2tGaWxlTWFuYWdlci5oIC0gRmlsZS1sZXZlbCBsb2NraW5nIHV0aWxpdHkgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fU1VQUE9SVF9MT0NLRklMRU1BTkFHRVJfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfTE9DS0ZJTEVNQU5BR0VSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PiAvLyBmb3Igc3RkOjpwYWlyCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFN0cmluZ1JlZjsKKworLy8vIFxicmllZiBDbGFzcyB0aGF0IG1hbmFnZXMgdGhlIGNyZWF0aW9uIG9mIGEgbG9jayBmaWxlIHRvIGFpZAorLy8vIGltcGxpY2l0IGNvb3JkaW5hdGlvbiBiZXR3ZWVuIGRpZmZlcmVudCBwcm9jZXNzZXMuCisvLy8KKy8vLyBUaGUgaW1wbGljaXQgY29vcmRpbmF0aW9uIHdvcmtzIGJ5IGNyZWF0aW5nIGEgIi5sb2NrIiBmaWxlIGFsb25nc2lkZQorLy8vIHRoZSBmaWxlIHRoYXQgd2UncmUgY29vcmRpbmF0aW5nIGZvciwgdXNpbmcgdGhlIGF0b21pY2l0eSBvZiB0aGUgZmlsZQorLy8vIHN5c3RlbSB0byBlbnN1cmUgdGhhdCBvbmx5IGEgc2luZ2xlIHByb2Nlc3MgY2FuIGNyZWF0ZSB0aGF0ICIubG9jayIgZmlsZS4KKy8vLyBXaGVuIHRoZSBsb2NrIGZpbGUgaXMgcmVtb3ZlZCwgdGhlIG93bmluZyBwcm9jZXNzIGhhcyBmaW5pc2hlZCB0aGUKKy8vLyBvcGVyYXRpb24uCitjbGFzcyBMb2NrRmlsZU1hbmFnZXIgeworcHVibGljOgorICAvLy8gXGJyaWVmIERlc2NyaWJlcyB0aGUgc3RhdGUgb2YgYSBsb2NrIGZpbGUuCisgIGVudW0gTG9ja0ZpbGVTdGF0ZSB7CisgICAgLy8vIFxicmllZiBUaGUgbG9jayBmaWxlIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIGlzIG93bmVkIGJ5IHRoaXMgaW5zdGFuY2UKKyAgICAvLy8gb2YgdGhlIG9iamVjdC4KKyAgICBMRlNfT3duZWQsCisgICAgLy8vIFxicmllZiBUaGUgbG9jayBmaWxlIGFscmVhZHkgZXhpc3RzIGFuZCBpcyBvd25lZCBieSBzb21lIG90aGVyCisgICAgLy8vIGluc3RhbmNlLgorICAgIExGU19TaGFyZWQsCisgICAgLy8vIFxicmllZiBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIG9yIGZpbmQgdGhlIGxvY2sKKyAgICAvLy8gZmlsZS4KKyAgICBMRlNfRXJyb3IKKyAgfTsKKworICAvLy8gXGJyaWVmIERlc2NyaWJlcyB0aGUgcmVzdWx0IG9mIHdhaXRpbmcgZm9yIHRoZSBvd25lciB0byByZWxlYXNlIHRoZSBsb2NrLgorICBlbnVtIFdhaXRGb3JVbmxvY2tSZXN1bHQgeworICAgIC8vLyBcYnJpZWYgVGhlIGxvY2sgd2FzIHJlbGVhc2VkIHN1Y2Nlc3NmdWxseS4KKyAgICBSZXNfU3VjY2VzcywKKyAgICAvLy8gXGJyaWVmIE93bmVyIGRpZWQgd2hpbGUgaG9sZGluZyB0aGUgbG9jay4KKyAgICBSZXNfT3duZXJEaWVkLAorICAgIC8vLyBcYnJpZWYgUmVhY2hlZCB0aW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBvd25lciB0byByZWxlYXNlIHRoZSBsb2NrLgorICAgIFJlc19UaW1lb3V0CisgIH07CisKK3ByaXZhdGU6CisgIFNtYWxsU3RyaW5nPDEyOD4gRmlsZU5hbWU7CisgIFNtYWxsU3RyaW5nPDEyOD4gTG9ja0ZpbGVOYW1lOworICBPcHRpb25hbDxzeXM6OmZzOjpUZW1wRmlsZT4gVW5pcXVlTG9ja0ZpbGU7CisKKyAgT3B0aW9uYWw8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBpbnQ+ID4gT3duZXI7CisgIHN0ZDo6ZXJyb3JfY29kZSBFcnJvckNvZGU7CisgIHN0ZDo6c3RyaW5nIEVycm9yRGlhZ01zZzsKKworICBMb2NrRmlsZU1hbmFnZXIoY29uc3QgTG9ja0ZpbGVNYW5hZ2VyICYpID0gZGVsZXRlOworICBMb2NrRmlsZU1hbmFnZXIgJm9wZXJhdG9yPShjb25zdCBMb2NrRmlsZU1hbmFnZXIgJikgPSBkZWxldGU7CisKKyAgc3RhdGljIE9wdGlvbmFsPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgaW50PiA+CisgIHJlYWRMb2NrRmlsZShTdHJpbmdSZWYgTG9ja0ZpbGVOYW1lKTsKKworICBzdGF0aWMgYm9vbCBwcm9jZXNzU3RpbGxFeGVjdXRpbmcoU3RyaW5nUmVmIEhvc3RuYW1lLCBpbnQgUElEKTsKKworcHVibGljOgorCisgIExvY2tGaWxlTWFuYWdlcihTdHJpbmdSZWYgRmlsZU5hbWUpOworICB+TG9ja0ZpbGVNYW5hZ2VyKCk7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIHN0YXRlIG9mIHRoZSBsb2NrIGZpbGUuCisgIExvY2tGaWxlU3RhdGUgZ2V0U3RhdGUoKSBjb25zdDsKKworICBvcGVyYXRvciBMb2NrRmlsZVN0YXRlKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RhdGUoKTsgfQorCisgIC8vLyBcYnJpZWYgRm9yIGEgc2hhcmVkIGxvY2ssIHdhaXQgdW50aWwgdGhlIG93bmVyIHJlbGVhc2VzIHRoZSBsb2NrLgorICBXYWl0Rm9yVW5sb2NrUmVzdWx0IHdhaXRGb3JVbmxvY2soKTsKKworICAvLy8gXGJyaWVmIFJlbW92ZSB0aGUgbG9jayBmaWxlLiAgVGhpcyBtYXkgZGVsZXRlIGEgZGlmZmVyZW50IGxvY2sgZmlsZSB0aGFuCisgIC8vLyB0aGUgb25lIHByZXZpb3VzbHkgcmVhZCBpZiB0aGVyZSBpcyBhIHJhY2UuCisgIHN0ZDo6ZXJyb3JfY29kZSB1bnNhZmVSZW1vdmVMb2NrRmlsZSgpOworCisgIC8vLyBcYnJpZWYgR2V0IGVycm9yIG1lc3NhZ2UsIG9yICIiIGlmIHRoZXJlIGlzIG5vIGVycm9yLgorICBzdGQ6OnN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFNldCBlcnJvciBhbmQgZXJyb3IgbWVzc2FnZQorICB2b2lkIHNldEVycm9yKGNvbnN0IHN0ZDo6ZXJyb3JfY29kZSAmRUMsIFN0cmluZ1JlZiBFcnJvck1zZyA9ICIiKSB7CisgICAgRXJyb3JDb2RlID0gRUM7CisgICAgRXJyb3JEaWFnTXNnID0gRXJyb3JNc2cuc3RyKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfTE9DS0ZJTEVNQU5BR0VSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Mb3dMZXZlbFR5cGVJbXBsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTG93TGV2ZWxUeXBlSW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYTVhNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTG93TGV2ZWxUeXBlSW1wbC5oCkBAIC0wLDAgKzEsMjY0IEBACisvLz09IGxsdm0vU3VwcG9ydC9Mb3dMZXZlbFR5cGVJbXBsLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBJbXBsZW1lbnQgYSBsb3ctbGV2ZWwgdHlwZSBzdWl0YWJsZSBmb3IgTWFjaGluZUluc3RyIGxldmVsIGluc3RydWN0aW9uCisvLy8gc2VsZWN0aW9uLgorLy8vCisvLy8gRm9yIGEgdHlwZSBhdHRhY2hlZCB0byBhIE1hY2hpbmVJbnN0ciwgd2Ugb25seSBjYXJlIGFib3V0IDIgZGV0YWlsczogdG90YWwKKy8vLyBzaXplIGFuZCB0aGUgbnVtYmVyIG9mIHZlY3RvciBsYW5lcyAoaWYgYW55KS4gQWNjb3JkaW5nbHksIHRoZXJlIGFyZSA0CisvLy8gcG9zc2libGUgdmFsaWQgdHlwZS1raW5kczoKKy8vLworLy8vICAgICogYHNOYCBmb3Igc2NhbGFycyBhbmQgYWdncmVnYXRlcworLy8vICAgICogYDxOIHggc00+YCBmb3IgdmVjdG9ycywgd2hpY2ggbXVzdCBoYXZlIGF0IGxlYXN0IDIgZWxlbWVudHMuCisvLy8gICAgKiBgcE5gIGZvciBwb2ludGVycworLy8vCisvLy8gT3RoZXIgaW5mb3JtYXRpb24gcmVxdWlyZWQgZm9yIGNvcnJlY3Qgc2VsZWN0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGNhcnJpZWQKKy8vLyBieSB0aGUgb3Bjb2RlLCBvciBub24tdHlwZSBmbGFncy4gRm9yIGV4YW1wbGUgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gR19BREQKKy8vLyBhbmQgR19GQUREIGZvciBpbnQvZmxvYXQgb3IgZmFzdC1tYXRoIGZsYWdzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0xPV0xFVkVMVFlQRUlNUExfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfTE9XTEVWRUxUWVBFSU1QTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWFjaGluZVZhbHVlVHlwZS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIFR5cGU7CitjbGFzcyByYXdfb3N0cmVhbTsKKworY2xhc3MgTExUIHsKK3B1YmxpYzoKKyAgLy8vIEdldCBhIGxvdy1sZXZlbCBzY2FsYXIgb3IgYWdncmVnYXRlICJiYWcgb2YgYml0cyIuCisgIHN0YXRpYyBMTFQgc2NhbGFyKHVuc2lnbmVkIFNpemVJbkJpdHMpIHsKKyAgICBhc3NlcnQoU2l6ZUluQml0cyA+IDAgJiYgImludmFsaWQgc2NhbGFyIHNpemUiKTsKKyAgICByZXR1cm4gTExUey8qaXNQb2ludGVyPSovZmFsc2UsIC8qaXNWZWN0b3I9Ki9mYWxzZSwgLypOdW1FbGVtZW50cz0qLzAsCisgICAgICAgICAgICAgICBTaXplSW5CaXRzLCAvKkFkZHJlc3NTcGFjZT0qLzB9OworICB9CisKKyAgLy8vIEdldCBhIGxvdy1sZXZlbCBwb2ludGVyIGluIHRoZSBnaXZlbiBhZGRyZXNzIHNwYWNlIChkZWZhdWx0aW5nIHRvIDApLgorICBzdGF0aWMgTExUIHBvaW50ZXIodWludDE2X3QgQWRkcmVzc1NwYWNlLCB1bnNpZ25lZCBTaXplSW5CaXRzKSB7CisgICAgYXNzZXJ0KFNpemVJbkJpdHMgPiAwICYmICJpbnZhbGlkIHBvaW50ZXIgc2l6ZSIpOworICAgIHJldHVybiBMTFR7Lyppc1BvaW50ZXI9Ki90cnVlLCAvKmlzVmVjdG9yPSovZmFsc2UsIC8qTnVtRWxlbWVudHM9Ki8wLAorICAgICAgICAgICAgICAgU2l6ZUluQml0cywgQWRkcmVzc1NwYWNlfTsKKyAgfQorCisgIC8vLyBHZXQgYSBsb3ctbGV2ZWwgdmVjdG9yIG9mIHNvbWUgbnVtYmVyIG9mIGVsZW1lbnRzIGFuZCBlbGVtZW50IHdpZHRoLgorICAvLy8gXHAgTnVtRWxlbWVudHMgbXVzdCBiZSBhdCBsZWFzdCAyLgorICBzdGF0aWMgTExUIHZlY3Rvcih1aW50MTZfdCBOdW1FbGVtZW50cywgdW5zaWduZWQgU2NhbGFyU2l6ZUluQml0cykgeworICAgIGFzc2VydChOdW1FbGVtZW50cyA+IDEgJiYgImludmFsaWQgbnVtYmVyIG9mIHZlY3RvciBlbGVtZW50cyIpOworICAgIGFzc2VydChTY2FsYXJTaXplSW5CaXRzID4gMCAmJiAiaW52YWxpZCB2ZWN0b3IgZWxlbWVudCBzaXplIik7CisgICAgcmV0dXJuIExMVHsvKmlzUG9pbnRlcj0qL2ZhbHNlLCAvKmlzVmVjdG9yPSovdHJ1ZSwgTnVtRWxlbWVudHMsCisgICAgICAgICAgICAgICBTY2FsYXJTaXplSW5CaXRzLCAvKkFkZHJlc3NTcGFjZT0qLzB9OworICB9CisKKyAgLy8vIEdldCBhIGxvdy1sZXZlbCB2ZWN0b3Igb2Ygc29tZSBudW1iZXIgb2YgZWxlbWVudHMgYW5kIGVsZW1lbnQgdHlwZS4KKyAgc3RhdGljIExMVCB2ZWN0b3IodWludDE2X3QgTnVtRWxlbWVudHMsIExMVCBTY2FsYXJUeSkgeworICAgIGFzc2VydChOdW1FbGVtZW50cyA+IDEgJiYgImludmFsaWQgbnVtYmVyIG9mIHZlY3RvciBlbGVtZW50cyIpOworICAgIGFzc2VydCghU2NhbGFyVHkuaXNWZWN0b3IoKSAmJiAiaW52YWxpZCB2ZWN0b3IgZWxlbWVudCB0eXBlIik7CisgICAgcmV0dXJuIExMVHtTY2FsYXJUeS5pc1BvaW50ZXIoKSwgLyppc1ZlY3Rvcj0qL3RydWUsIE51bUVsZW1lbnRzLAorICAgICAgICAgICAgICAgU2NhbGFyVHkuZ2V0U2l6ZUluQml0cygpLAorICAgICAgICAgICAgICAgU2NhbGFyVHkuaXNQb2ludGVyKCkgPyBTY2FsYXJUeS5nZXRBZGRyZXNzU3BhY2UoKSA6IDB9OworICB9CisKKyAgZXhwbGljaXQgTExUKGJvb2wgaXNQb2ludGVyLCBib29sIGlzVmVjdG9yLCB1aW50MTZfdCBOdW1FbGVtZW50cywKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIFNpemVJbkJpdHMsIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSkgeworICAgIGluaXQoaXNQb2ludGVyLCBpc1ZlY3RvciwgTnVtRWxlbWVudHMsIFNpemVJbkJpdHMsIEFkZHJlc3NTcGFjZSk7CisgIH0KKyAgZXhwbGljaXQgTExUKCkgOiBJc1BvaW50ZXIoZmFsc2UpLCBJc1ZlY3RvcihmYWxzZSksIFJhd0RhdGEoMCkge30KKworICBleHBsaWNpdCBMTFQoTVZUIFZUKTsKKworICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBSYXdEYXRhICE9IDA7IH0KKworICBib29sIGlzU2NhbGFyKCkgY29uc3QgeyByZXR1cm4gaXNWYWxpZCgpICYmICFJc1BvaW50ZXIgJiYgIUlzVmVjdG9yOyB9CisKKyAgYm9vbCBpc1BvaW50ZXIoKSBjb25zdCB7IHJldHVybiBpc1ZhbGlkKCkgJiYgSXNQb2ludGVyICYmICFJc1ZlY3RvcjsgfQorCisgIGJvb2wgaXNWZWN0b3IoKSBjb25zdCB7IHJldHVybiBpc1ZhbGlkKCkgJiYgSXNWZWN0b3I7IH0KKworICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgdmVjdG9yIExMVC4gTXVzdCBvbmx5IGJlIGNhbGxlZCBvbgorICAvLy8gdmVjdG9yIHR5cGVzLgorICB1aW50MTZfdCBnZXROdW1FbGVtZW50cygpIGNvbnN0IHsKKyAgICBhc3NlcnQoSXNWZWN0b3IgJiYgImNhbm5vdCBnZXQgbnVtYmVyIG9mIGVsZW1lbnRzIG9uIHNjYWxhci9hZ2dyZWdhdGUiKTsKKyAgICBpZiAoIUlzUG9pbnRlcikKKyAgICAgIHJldHVybiBnZXRGaWVsZFZhbHVlKFZlY3RvckVsZW1lbnRzRmllbGRJbmZvKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gZ2V0RmllbGRWYWx1ZShQb2ludGVyVmVjdG9yRWxlbWVudHNGaWVsZEluZm8pOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIHR5cGUuIE11c3Qgb25seSBiZSBjYWxsZWQgb24gc2l6ZWQgdHlwZXMuCisgIHVuc2lnbmVkIGdldFNpemVJbkJpdHMoKSBjb25zdCB7CisgICAgaWYgKGlzUG9pbnRlcigpIHx8IGlzU2NhbGFyKCkpCisgICAgICByZXR1cm4gZ2V0U2NhbGFyU2l6ZUluQml0cygpOworICAgIHJldHVybiBnZXRTY2FsYXJTaXplSW5CaXRzKCkgKiBnZXROdW1FbGVtZW50cygpOworICB9CisKKyAgdW5zaWduZWQgZ2V0U2NhbGFyU2l6ZUluQml0cygpIGNvbnN0IHsKKyAgICBhc3NlcnQoUmF3RGF0YSAhPSAwICYmICJJbnZhbGlkIFR5cGUiKTsKKyAgICBpZiAoIUlzVmVjdG9yKSB7CisgICAgICBpZiAoIUlzUG9pbnRlcikKKyAgICAgICAgcmV0dXJuIGdldEZpZWxkVmFsdWUoU2NhbGFyU2l6ZUZpZWxkSW5mbyk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBnZXRGaWVsZFZhbHVlKFBvaW50ZXJTaXplRmllbGRJbmZvKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFJc1BvaW50ZXIpCisgICAgICAgIHJldHVybiBnZXRGaWVsZFZhbHVlKFZlY3RvclNpemVGaWVsZEluZm8pOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gZ2V0RmllbGRWYWx1ZShQb2ludGVyVmVjdG9yU2l6ZUZpZWxkSW5mbyk7CisgICAgfQorICB9CisKKyAgdW5zaWduZWQgZ2V0QWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgIGFzc2VydChSYXdEYXRhICE9IDAgJiYgIkludmFsaWQgVHlwZSIpOworICAgIGFzc2VydChJc1BvaW50ZXIgJiYgImNhbm5vdCBnZXQgYWRkcmVzcyBzcGFjZSBvZiBub24tcG9pbnRlciB0eXBlIik7CisgICAgaWYgKCFJc1ZlY3RvcikKKyAgICAgIHJldHVybiBnZXRGaWVsZFZhbHVlKFBvaW50ZXJBZGRyZXNzU3BhY2VGaWVsZEluZm8pOworICAgIGVsc2UKKyAgICAgIHJldHVybiBnZXRGaWVsZFZhbHVlKFBvaW50ZXJWZWN0b3JBZGRyZXNzU3BhY2VGaWVsZEluZm8pOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHZlY3RvcidzIGVsZW1lbnQgdHlwZS4gT25seSB2YWxpZCBmb3IgdmVjdG9yIHR5cGVzLgorICBMTFQgZ2V0RWxlbWVudFR5cGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzVmVjdG9yKCkgJiYgImNhbm5vdCBnZXQgZWxlbWVudCB0eXBlIG9mIHNjYWxhci9hZ2dyZWdhdGUiKTsKKyAgICBpZiAoSXNQb2ludGVyKQorICAgICAgcmV0dXJuIHBvaW50ZXIoZ2V0QWRkcmVzc1NwYWNlKCksIGdldFNjYWxhclNpemVJbkJpdHMoKSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHNjYWxhcihnZXRTY2FsYXJTaXplSW5CaXRzKCkpOworICB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBMTFQgJlJIUykgY29uc3QgeworICAgIHJldHVybiBJc1BvaW50ZXIgPT0gUkhTLklzUG9pbnRlciAmJiBJc1ZlY3RvciA9PSBSSFMuSXNWZWN0b3IgJiYKKyAgICAgICAgICAgUkhTLlJhd0RhdGEgPT0gUmF3RGF0YTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBMTFQgJlJIUykgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBSSFMpOyB9CisKKyAgZnJpZW5kIHN0cnVjdCBEZW5zZU1hcEluZm88TExUPjsKKworcHJpdmF0ZToKKyAgLy8vIExMVCBpcyBwYWNrZWQgaW50byA2NCBiaXRzIGFzIGZvbGxvd3M6CisgIC8vLyBpc1BvaW50ZXIgOiAxCisgIC8vLyBpc1ZlY3RvciAgOiAxCisgIC8vLyB3aXRoIDYyIGJpdHMgcmVtYWluaW5nIGZvciBLaW5kLXNwZWNpZmljIGRhdGEsIHBhY2tlZCBpbiBiaXRmaWVsZHMKKyAgLy8vIGFzIGRlc2NyaWJlZCBiZWxvdy4gQXMgdGhlcmUgaXNuJ3QgYSBzaW1wbGUgcG9ydGFibGUgd2F5IHRvIHBhY2sgYml0cworICAvLy8gaW50byBiaXRmaWVsZHMsIGhlcmUgdGhlIGRpZmZlcmVudCBmaWVsZHMgaW4gdGhlIHBhY2tlZCBzdHJ1Y3R1cmUgaXMKKyAgLy8vIGRlc2NyaWJlZCBpbiBzdGF0aWMgY29uc3QgKkZpZWxkIHZhcmlhYmxlcy4gRWFjaCBvZiB0aGVzZSB2YXJpYWJsZXMKKyAgLy8vIGlzIGEgMi1lbGVtZW50IGFycmF5LCB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IGRlc2NyaWJpbmcgdGhlIGJpdGZpZWxkIHNpemUKKyAgLy8vIGFuZCB0aGUgc2Vjb25kIGVsZW1lbnQgZGVzY3JpYmluZyB0aGUgYml0ZmllbGQgb2Zmc2V0LgorICB0eXBlZGVmIGludCBCaXRGaWVsZEluZm9bMl07CisgIC8vLworICAvLy8gVGhpcyBpcyBob3cgdGhlIGJpdGZpZWxkcyBhcmUgcGFja2VkIHBlciBLaW5kOgorICAvLy8gKiBJbnZhbGlkOgorICAvLy8gICBnZXRzIGVuY29kZWQgYXMgUmF3RGF0YSA9PSAwLCBhcyB0aGF0IGlzIGFuIGludmFsaWQgZW5jb2RpbmcsIHNpbmNlIGZvcgorICAvLy8gICB2YWxpZCBlbmNvZGluZ3MsIFNpemVJbkJpdHMvU2l6ZU9mRWxlbWVudCBtdXN0IGJlIGxhcmdlciB0aGFuIDAuCisgIC8vLyAqIE5vbi1wb2ludGVyIHNjYWxhciAoaXNQb2ludGVyID09IDAgJiYgaXNWZWN0b3IgPT0gMCk6CisgIC8vLyAgIFNpemVJbkJpdHM6IDMyOworICBzdGF0aWMgY29uc3QgY29uc3RleHByIEJpdEZpZWxkSW5mbyBTY2FsYXJTaXplRmllbGRJbmZvezMyLCAwfTsKKyAgLy8vICogUG9pbnRlciAoaXNQb2ludGVyID09IDEgJiYgaXNWZWN0b3IgPT0gMCk6CisgIC8vLyAgIFNpemVJbkJpdHM6IDE2OworICAvLy8gICBBZGRyZXNzU3BhY2U6IDIzOworICBzdGF0aWMgY29uc3QgY29uc3RleHByIEJpdEZpZWxkSW5mbyBQb2ludGVyU2l6ZUZpZWxkSW5mb3sxNiwgMH07CisgIHN0YXRpYyBjb25zdCBjb25zdGV4cHIgQml0RmllbGRJbmZvIFBvaW50ZXJBZGRyZXNzU3BhY2VGaWVsZEluZm97CisgICAgICAyMywgUG9pbnRlclNpemVGaWVsZEluZm9bMF0gKyBQb2ludGVyU2l6ZUZpZWxkSW5mb1sxXX07CisgIC8vLyAqIFZlY3Rvci1vZi1ub24tcG9pbnRlciAoaXNQb2ludGVyID09IDAgJiYgaXNWZWN0b3IgPT0gMSk6CisgIC8vLyAgIE51bUVsZW1lbnRzOiAxNjsKKyAgLy8vICAgU2l6ZU9mRWxlbWVudDogMzI7CisgIHN0YXRpYyBjb25zdCBjb25zdGV4cHIgQml0RmllbGRJbmZvIFZlY3RvckVsZW1lbnRzRmllbGRJbmZvezE2LCAwfTsKKyAgc3RhdGljIGNvbnN0IGNvbnN0ZXhwciBCaXRGaWVsZEluZm8gVmVjdG9yU2l6ZUZpZWxkSW5mb3sKKyAgICAgIDMyLCBWZWN0b3JFbGVtZW50c0ZpZWxkSW5mb1swXSArIFZlY3RvckVsZW1lbnRzRmllbGRJbmZvWzFdfTsKKyAgLy8vICogVmVjdG9yLW9mLXBvaW50ZXIgKGlzUG9pbnRlciA9PSAxICYmIGlzVmVjdG9yID09IDEpOgorICAvLy8gICBOdW1FbGVtZW50czogMTY7CisgIC8vLyAgIFNpemVPZkVsZW1lbnQ6IDE2OworICAvLy8gICBBZGRyZXNzU3BhY2U6IDIzOworICBzdGF0aWMgY29uc3QgY29uc3RleHByIEJpdEZpZWxkSW5mbyBQb2ludGVyVmVjdG9yRWxlbWVudHNGaWVsZEluZm97MTYsIDB9OworICBzdGF0aWMgY29uc3QgY29uc3RleHByIEJpdEZpZWxkSW5mbyBQb2ludGVyVmVjdG9yU2l6ZUZpZWxkSW5mb3sKKyAgICAgIDE2LAorICAgICAgUG9pbnRlclZlY3RvckVsZW1lbnRzRmllbGRJbmZvWzFdICsgUG9pbnRlclZlY3RvckVsZW1lbnRzRmllbGRJbmZvWzBdfTsKKyAgc3RhdGljIGNvbnN0IGNvbnN0ZXhwciBCaXRGaWVsZEluZm8gUG9pbnRlclZlY3RvckFkZHJlc3NTcGFjZUZpZWxkSW5mb3sKKyAgICAgIDIzLCBQb2ludGVyVmVjdG9yU2l6ZUZpZWxkSW5mb1sxXSArIFBvaW50ZXJWZWN0b3JTaXplRmllbGRJbmZvWzBdfTsKKworICB1aW50NjRfdCBJc1BvaW50ZXIgOiAxOworICB1aW50NjRfdCBJc1ZlY3RvciA6IDE7CisgIHVpbnQ2NF90IFJhd0RhdGEgOiA2MjsKKworICBzdGF0aWMgdWludDY0X3QgZ2V0TWFzayhjb25zdCBCaXRGaWVsZEluZm8gRmllbGRJbmZvKSB7CisgICAgY29uc3QgaW50IEZpZWxkU2l6ZUluQml0cyA9IEZpZWxkSW5mb1swXTsKKyAgICByZXR1cm4gKCgodWludDY0X3QpMSkgPDwgRmllbGRTaXplSW5CaXRzKSAtIDE7CisgIH0KKyAgc3RhdGljIHVpbnQ2NF90IG1hc2tBbmRTaGlmdCh1aW50NjRfdCBWYWwsIHVpbnQ2NF90IE1hc2ssIHVpbnQ4X3QgU2hpZnQpIHsKKyAgICBhc3NlcnQoVmFsIDw9IE1hc2sgJiYgIlZhbHVlIHRvbyBsYXJnZSBmb3IgZmllbGQiKTsKKyAgICByZXR1cm4gKFZhbCAmIE1hc2spIDw8IFNoaWZ0OworICB9CisgIHN0YXRpYyB1aW50NjRfdCBtYXNrQW5kU2hpZnQodWludDY0X3QgVmFsLCBjb25zdCBCaXRGaWVsZEluZm8gRmllbGRJbmZvKSB7CisgICAgcmV0dXJuIG1hc2tBbmRTaGlmdChWYWwsIGdldE1hc2soRmllbGRJbmZvKSwgRmllbGRJbmZvWzFdKTsKKyAgfQorICB1aW50NjRfdCBnZXRGaWVsZFZhbHVlKGNvbnN0IEJpdEZpZWxkSW5mbyBGaWVsZEluZm8pIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TWFzayhGaWVsZEluZm8pICYgKFJhd0RhdGEgPj4gRmllbGRJbmZvWzFdKTsKKyAgfQorCisgIHZvaWQgaW5pdChib29sIElzUG9pbnRlciwgYm9vbCBJc1ZlY3RvciwgdWludDE2X3QgTnVtRWxlbWVudHMsCisgICAgICAgICAgICB1bnNpZ25lZCBTaXplSW5CaXRzLCB1bnNpZ25lZCBBZGRyZXNzU3BhY2UpIHsKKyAgICB0aGlzLT5Jc1BvaW50ZXIgPSBJc1BvaW50ZXI7CisgICAgdGhpcy0+SXNWZWN0b3IgPSBJc1ZlY3RvcjsKKyAgICBpZiAoIUlzVmVjdG9yKSB7CisgICAgICBpZiAoIUlzUG9pbnRlcikKKyAgICAgICAgUmF3RGF0YSA9IG1hc2tBbmRTaGlmdChTaXplSW5CaXRzLCBTY2FsYXJTaXplRmllbGRJbmZvKTsKKyAgICAgIGVsc2UKKyAgICAgICAgUmF3RGF0YSA9IG1hc2tBbmRTaGlmdChTaXplSW5CaXRzLCBQb2ludGVyU2l6ZUZpZWxkSW5mbykgfAorICAgICAgICAgICAgICAgICAgbWFza0FuZFNoaWZ0KEFkZHJlc3NTcGFjZSwgUG9pbnRlckFkZHJlc3NTcGFjZUZpZWxkSW5mbyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChOdW1FbGVtZW50cyA+IDEgJiYgImludmFsaWQgbnVtYmVyIG9mIHZlY3RvciBlbGVtZW50cyIpOworICAgICAgaWYgKCFJc1BvaW50ZXIpCisgICAgICAgIFJhd0RhdGEgPSBtYXNrQW5kU2hpZnQoTnVtRWxlbWVudHMsIFZlY3RvckVsZW1lbnRzRmllbGRJbmZvKSB8CisgICAgICAgICAgICAgICAgICBtYXNrQW5kU2hpZnQoU2l6ZUluQml0cywgVmVjdG9yU2l6ZUZpZWxkSW5mbyk7CisgICAgICBlbHNlCisgICAgICAgIFJhd0RhdGEgPQorICAgICAgICAgICAgbWFza0FuZFNoaWZ0KE51bUVsZW1lbnRzLCBQb2ludGVyVmVjdG9yRWxlbWVudHNGaWVsZEluZm8pIHwKKyAgICAgICAgICAgIG1hc2tBbmRTaGlmdChTaXplSW5CaXRzLCBQb2ludGVyVmVjdG9yU2l6ZUZpZWxkSW5mbykgfAorICAgICAgICAgICAgbWFza0FuZFNoaWZ0KEFkZHJlc3NTcGFjZSwgUG9pbnRlclZlY3RvckFkZHJlc3NTcGFjZUZpZWxkSW5mbyk7CisgICAgfQorICB9Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0mIG9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBMTFQgJlR5KSB7CisgIFR5LnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCit0ZW1wbGF0ZTw+IHN0cnVjdCBEZW5zZU1hcEluZm88TExUPiB7CisgIHN0YXRpYyBpbmxpbmUgTExUIGdldEVtcHR5S2V5KCkgeworICAgIExMVCBJbnZhbGlkOworICAgIEludmFsaWQuSXNQb2ludGVyID0gdHJ1ZTsKKyAgICByZXR1cm4gSW52YWxpZDsKKyAgfQorICBzdGF0aWMgaW5saW5lIExMVCBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgTExUIEludmFsaWQ7CisgICAgSW52YWxpZC5Jc1ZlY3RvciA9IHRydWU7CisgICAgcmV0dXJuIEludmFsaWQ7CisgIH0KKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgTExUICZUeSkgeworICAgIHVpbnQ2NF90IFZhbCA9ICgodWludDY0X3QpVHkuUmF3RGF0YSkgPDwgMiB8ICgodWludDY0X3QpVHkuSXNQb2ludGVyKSA8PCAxIHwKKyAgICAgICAgICAgICAgICAgICAoKHVpbnQ2NF90KVR5LklzVmVjdG9yKTsKKyAgICByZXR1cm4gRGVuc2VNYXBJbmZvPHVpbnQ2NF90Pjo6Z2V0SGFzaFZhbHVlKFZhbCk7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBMTFQgJkxIUywgY29uc3QgTExUICZSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKworfQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0xPV0xFVkVMVFlQRUlNUExfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01ENS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01ENS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMGRjNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTUQ1LmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qIC0qLSBDKysgLSotCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIChvcmlnaW5hbCBsaWNlbnNlIGZvbGxvd3MpOgorICoKKyAqIFRoaXMgaXMgYW4gT3BlblNTTC1jb21wYXRpYmxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLgorICogTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSAoUkZDIDEzMjEpLgorICoKKyAqIEhvbWVwYWdlOgorICogaHR0cDovL29wZW53YWxsLmluZm8vd2lraS9wZW9wbGUvc29sYXIvc29mdHdhcmUvcHVibGljLWRvbWFpbi1zb3VyY2UtY29kZS9tZDUKKyAqCisgKiBBdXRob3I6CisgKiBBbGV4YW5kZXIgUGVzbHlhaywgYmV0dGVyIGtub3duIGFzIFNvbGFyIERlc2lnbmVyIDxzb2xhciBhdCBvcGVud2FsbC5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSB3YXMgd3JpdHRlbiBieSBBbGV4YW5kZXIgUGVzbHlhayBpbiAyMDAxLiAgTm8gY29weXJpZ2h0IGlzCisgKiBjbGFpbWVkLCBhbmQgdGhlIHNvZnR3YXJlIGlzIGhlcmVieSBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4uCisgKiBJbiBjYXNlIHRoaXMgYXR0ZW1wdCB0byBkaXNjbGFpbSBjb3B5cmlnaHQgYW5kIHBsYWNlIHRoZSBzb2Z0d2FyZSBpbiB0aGUKKyAqIHB1YmxpYyBkb21haW4gaXMgZGVlbWVkIG51bGwgYW5kIHZvaWQsIHRoZW4gdGhlIHNvZnR3YXJlIGlzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgQWxleGFuZGVyIFBlc2x5YWsgYW5kIGl0IGlzIGhlcmVieSByZWxlYXNlZCB0byB0aGUKKyAqIGdlbmVyYWwgcHVibGljIHVuZGVyIHRoZSBmb2xsb3dpbmcgdGVybXM6CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQuCisgKgorICogVGhlcmUncyBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLCBleHByZXNzIG9yIGltcGxpZWQuCisgKgorICogU2VlIG1kNS5jIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX01ENV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9NRDVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CisKK2NsYXNzIE1ENSB7CisgIC8vIEFueSAzMi1iaXQgb3Igd2lkZXIgdW5zaWduZWQgaW50ZWdlciBkYXRhIHR5cGUgd2lsbCBkby4KKyAgdHlwZWRlZiB1aW50MzJfdCBNRDVfdTMycGx1czsKKworICBNRDVfdTMycGx1cyBhID0gMHg2NzQ1MjMwMTsKKyAgTUQ1X3UzMnBsdXMgYiA9IDB4ZWZjZGFiODk7CisgIE1ENV91MzJwbHVzIGMgPSAweDk4YmFkY2ZlOworICBNRDVfdTMycGx1cyBkID0gMHgxMDMyNTQ3NjsKKyAgTUQ1X3UzMnBsdXMgaGkgPSAwOworICBNRDVfdTMycGx1cyBsbyA9IDA7CisgIHVpbnQ4X3QgYnVmZmVyWzY0XTsKKyAgTUQ1X3UzMnBsdXMgYmxvY2tbMTZdOworCitwdWJsaWM6CisgIHN0cnVjdCBNRDVSZXN1bHQgeworICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IEJ5dGVzOworCisgICAgb3BlcmF0b3Igc3RkOjphcnJheTx1aW50OF90LCAxNj4oKSBjb25zdCB7IHJldHVybiBCeXRlczsgfQorCisgICAgY29uc3QgdWludDhfdCAmb3BlcmF0b3JbXShzaXplX3QgSSkgY29uc3QgeyByZXR1cm4gQnl0ZXNbSV07IH0KKyAgICB1aW50OF90ICZvcGVyYXRvcltdKHNpemVfdCBJKSB7IHJldHVybiBCeXRlc1tJXTsgfQorCisgICAgU21hbGxTdHJpbmc8MzI+IGRpZ2VzdCgpIGNvbnN0OworCisgICAgdWludDY0X3QgbG93KCkgY29uc3QgeworICAgICAgLy8gT3VyIE1ENSBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZSByZXN1bHQgaW4gbGl0dGxlIGVuZGlhbiwgc28gdGhlIGxvdworICAgICAgLy8gd29yZCBpcyBmaXJzdC4KKyAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdXBwb3J0OworICAgICAgcmV0dXJuIGVuZGlhbjo6cmVhZDx1aW50NjRfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KEJ5dGVzLmRhdGEoKSk7CisgICAgfQorCisgICAgdWludDY0X3QgaGlnaCgpIGNvbnN0IHsKKyAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdXBwb3J0OworICAgICAgcmV0dXJuIGVuZGlhbjo6cmVhZDx1aW50NjRfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KEJ5dGVzLmRhdGEoKSArIDgpOworICAgIH0KKyAgICBzdGQ6OnBhaXI8dWludDY0X3QsIHVpbnQ2NF90PiB3b3JkcygpIGNvbnN0IHsKKyAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdXBwb3J0OworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGhpZ2goKSwgbG93KCkpOworICAgIH0KKyAgfTsKKworICBNRDUoKTsKKworICAvLy8gXGJyaWVmIFVwZGF0ZXMgdGhlIGhhc2ggZm9yIHRoZSBieXRlIHN0cmVhbSBwcm92aWRlZC4KKyAgdm9pZCB1cGRhdGUoQXJyYXlSZWY8dWludDhfdD4gRGF0YSk7CisKKyAgLy8vIFxicmllZiBVcGRhdGVzIHRoZSBoYXNoIGZvciB0aGUgU3RyaW5nUmVmIHByb3ZpZGVkLgorICB2b2lkIHVwZGF0ZShTdHJpbmdSZWYgU3RyKTsKKworICAvLy8gXGJyaWVmIEZpbmlzaGVzIG9mZiB0aGUgaGFzaCBhbmQgcHV0cyB0aGUgcmVzdWx0IGluIHJlc3VsdC4KKyAgdm9pZCBmaW5hbChNRDVSZXN1bHQgJlJlc3VsdCk7CisKKyAgLy8vIFxicmllZiBUcmFuc2xhdGVzIHRoZSBieXRlcyBpbiBccCBSZXMgdG8gYSBoZXggc3RyaW5nIHRoYXQgaXMKKyAgLy8vIGRlcG9zaXRlZCBpbnRvIFxwIFN0ci4gVGhlIHJlc3VsdCB3aWxsIGJlIG9mIGxlbmd0aCAzMi4KKyAgc3RhdGljIHZvaWQgc3RyaW5naWZ5UmVzdWx0KE1ENVJlc3VsdCAmUmVzdWx0LCBTbWFsbFN0cmluZzwzMj4gJlN0cik7CisKKyAgLy8vIFxicmllZiBDb21wdXRlcyB0aGUgaGFzaCBmb3IgYSBnaXZlbiBieXRlcy4KKyAgc3RhdGljIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGhhc2goQXJyYXlSZWY8dWludDhfdD4gRGF0YSk7CisKK3ByaXZhdGU6CisgIGNvbnN0IHVpbnQ4X3QgKmJvZHkoQXJyYXlSZWY8dWludDhfdD4gRGF0YSk7Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1ENTo6TUQ1UmVzdWx0ICZMSFMsIGNvbnN0IE1ENTo6TUQ1UmVzdWx0ICZSSFMpIHsKKyAgcmV0dXJuIExIUy5CeXRlcyA9PSBSSFMuQnl0ZXM7Cit9CisKKy8vLyBIZWxwZXIgdG8gY29tcHV0ZSBhbmQgcmV0dXJuIGxvd2VyIDY0IGJpdHMgb2YgdGhlIGdpdmVuIHN0cmluZydzIE1ENSBoYXNoLgoraW5saW5lIHVpbnQ2NF90IE1ENUhhc2goU3RyaW5nUmVmIFN0cikgeworICB1c2luZyBuYW1lc3BhY2Ugc3VwcG9ydDsKKworICBNRDUgSGFzaDsKKyAgSGFzaC51cGRhdGUoU3RyKTsKKyAgTUQ1OjpNRDVSZXN1bHQgUmVzdWx0OworICBIYXNoLmZpbmFsKFJlc3VsdCk7CisgIC8vIFJldHVybiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgd29yZC4KKyAgcmV0dXJuIFJlc3VsdC5sb3coKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9NRDVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01hY2hpbmVWYWx1ZVR5cGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NYWNoaW5lVmFsdWVUeXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUyZGVhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NYWNoaW5lVmFsdWVUeXBlLmgKQEAgLTAsMCArMSwxMDU4IEBACisvLz09PS0gU3VwcG9ydC9NYWNoaW5lVmFsdWVUeXBlLmggLSBNYWNoaW5lLUxldmVsIHR5cGVzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBzZXQgb2YgbWFjaGluZS1sZXZlbCB0YXJnZXQgaW5kZXBlbmRlbnQgdHlwZXMgd2hpY2gKKy8vIGxlZ2FsIHZhbHVlcyBpbiB0aGUgY29kZSBnZW5lcmF0b3IgdXNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX01BQ0hJTkVWQUxVRVRZUEVfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfTUFDSElORVZBTFVFVFlQRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgVHlwZTsKKworICAvLy8gTWFjaGluZSBWYWx1ZSBUeXBlLiBFdmVyeSB0eXBlIHRoYXQgaXMgc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IHNvbWUKKyAgLy8vIHByb2Nlc3NvciB0YXJnZXRlZCBieSBMTFZNIG9jY3VycyBoZXJlLiBUaGlzIG1lYW5zIHRoYXQgYW55IGxlZ2FsIHZhbHVlCisgIC8vLyB0eXBlIGNhbiBiZSByZXByZXNlbnRlZCBieSBhbiBNVlQuCisgIGNsYXNzIE1WVCB7CisgIHB1YmxpYzoKKyAgICBlbnVtIFNpbXBsZVZhbHVlVHlwZSA6IHVpbnQ4X3QgeworICAgICAgLy8gU2ltcGxlIHZhbHVlIHR5cGVzIHRoYXQgYXJlbid0IGV4cGxpY2l0bHkgcGFydCBvZiB0aGlzIGVudW1lcmF0aW9uCisgICAgICAvLyBhcmUgY29uc2lkZXJlZCBleHRlbmRlZCB2YWx1ZSB0eXBlcy4KKyAgICAgIElOVkFMSURfU0lNUExFX1ZBTFVFX1RZUEUgPSAwLAorCisgICAgICAvLyBJZiB5b3UgY2hhbmdlIHRoaXMgbnVtYmVyaW5nLCB5b3UgbXVzdCBjaGFuZ2UgdGhlIHZhbHVlcyBpbgorICAgICAgLy8gVmFsdWVUeXBlcy50ZCBhcyB3ZWxsIQorICAgICAgT3RoZXIgICAgICAgICAgPSAgIDEsICAgLy8gVGhpcyBpcyBhIG5vbi1zdGFuZGFyZCB2YWx1ZQorICAgICAgaTEgICAgICAgICAgICAgPSAgIDIsICAgLy8gVGhpcyBpcyBhIDEgYml0IGludGVnZXIgdmFsdWUKKyAgICAgIGk4ICAgICAgICAgICAgID0gICAzLCAgIC8vIFRoaXMgaXMgYW4gOCBiaXQgaW50ZWdlciB2YWx1ZQorICAgICAgaTE2ICAgICAgICAgICAgPSAgIDQsICAgLy8gVGhpcyBpcyBhIDE2IGJpdCBpbnRlZ2VyIHZhbHVlCisgICAgICBpMzIgICAgICAgICAgICA9ICAgNSwgICAvLyBUaGlzIGlzIGEgMzIgYml0IGludGVnZXIgdmFsdWUKKyAgICAgIGk2NCAgICAgICAgICAgID0gICA2LCAgIC8vIFRoaXMgaXMgYSA2NCBiaXQgaW50ZWdlciB2YWx1ZQorICAgICAgaTEyOCAgICAgICAgICAgPSAgIDcsICAgLy8gVGhpcyBpcyBhIDEyOCBiaXQgaW50ZWdlciB2YWx1ZQorCisgICAgICBGSVJTVF9JTlRFR0VSX1ZBTFVFVFlQRSA9IGkxLAorICAgICAgTEFTVF9JTlRFR0VSX1ZBTFVFVFlQRSAgPSBpMTI4LAorCisgICAgICBmMTYgICAgICAgICAgICA9ICAgOCwgICAvLyBUaGlzIGlzIGEgMTYgYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlCisgICAgICBmMzIgICAgICAgICAgICA9ICAgOSwgICAvLyBUaGlzIGlzIGEgMzIgYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlCisgICAgICBmNjQgICAgICAgICAgICA9ICAxMCwgICAvLyBUaGlzIGlzIGEgNjQgYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlCisgICAgICBmODAgICAgICAgICAgICA9ICAxMSwgICAvLyBUaGlzIGlzIGEgODAgYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlCisgICAgICBmMTI4ICAgICAgICAgICA9ICAxMiwgICAvLyBUaGlzIGlzIGEgMTI4IGJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZQorICAgICAgcHBjZjEyOCAgICAgICAgPSAgMTMsICAgLy8gVGhpcyBpcyBhIFBQQyAxMjgtYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlCisKKyAgICAgIEZJUlNUX0ZQX1ZBTFVFVFlQRSA9IGYxNiwKKyAgICAgIExBU1RfRlBfVkFMVUVUWVBFICA9IHBwY2YxMjgsCisKKyAgICAgIHYxaTEgICAgICAgICAgID0gIDE0LCAgIC8vICAgIDEgeCBpMQorICAgICAgdjJpMSAgICAgICAgICAgPSAgMTUsICAgLy8gICAgMiB4IGkxCisgICAgICB2NGkxICAgICAgICAgICA9ICAxNiwgICAvLyAgICA0IHggaTEKKyAgICAgIHY4aTEgICAgICAgICAgID0gIDE3LCAgIC8vICAgIDggeCBpMQorICAgICAgdjE2aTEgICAgICAgICAgPSAgMTgsICAgLy8gICAxNiB4IGkxCisgICAgICB2MzJpMSAgICAgICAgICA9ICAxOSwgICAvLyAgIDMyIHggaTEKKyAgICAgIHY2NGkxICAgICAgICAgID0gIDIwLCAgIC8vICAgNjQgeCBpMQorICAgICAgdjEyOGkxICAgICAgICAgPSAgMjEsICAgLy8gIDEyOCB4IGkxCisgICAgICB2NTEyaTEgICAgICAgICA9ICAyMiwgICAvLyAgNTEyIHggaTEKKyAgICAgIHYxMDI0aTEgICAgICAgID0gIDIzLCAgIC8vIDEwMjQgeCBpMQorCisgICAgICB2MWk4ICAgICAgICAgICA9ICAyNCwgICAvLyAgMSB4IGk4CisgICAgICB2Mmk4ICAgICAgICAgICA9ICAyNSwgICAvLyAgMiB4IGk4CisgICAgICB2NGk4ICAgICAgICAgICA9ICAyNiwgICAvLyAgNCB4IGk4CisgICAgICB2OGk4ICAgICAgICAgICA9ICAyNywgICAvLyAgOCB4IGk4CisgICAgICB2MTZpOCAgICAgICAgICA9ICAyOCwgICAvLyAxNiB4IGk4CisgICAgICB2MzJpOCAgICAgICAgICA9ICAyOSwgICAvLyAzMiB4IGk4CisgICAgICB2NjRpOCAgICAgICAgICA9ICAzMCwgICAvLyA2NCB4IGk4CisgICAgICB2MTI4aTggICAgICAgICA9ICAzMSwgICAvLzEyOCB4IGk4CisgICAgICB2MjU2aTggICAgICAgICA9ICAzMiwgICAvLzI1NiB4IGk4CisKKyAgICAgIHYxaTE2ICAgICAgICAgID0gIDMzLCAgIC8vICAxIHggaTE2CisgICAgICB2MmkxNiAgICAgICAgICA9ICAzNCwgICAvLyAgMiB4IGkxNgorICAgICAgdjRpMTYgICAgICAgICAgPSAgMzUsICAgLy8gIDQgeCBpMTYKKyAgICAgIHY4aTE2ICAgICAgICAgID0gIDM2LCAgIC8vICA4IHggaTE2CisgICAgICB2MTZpMTYgICAgICAgICA9ICAzNywgICAvLyAxNiB4IGkxNgorICAgICAgdjMyaTE2ICAgICAgICAgPSAgMzgsICAgLy8gMzIgeCBpMTYKKyAgICAgIHY2NGkxNiAgICAgICAgID0gIDM5LCAgIC8vIDY0IHggaTE2CisgICAgICB2MTI4aTE2ICAgICAgICA9ICA0MCwgICAvLzEyOCB4IGkxNgorCisgICAgICB2MWkzMiAgICAgICAgICA9ICA0MSwgICAvLyAgMSB4IGkzMgorICAgICAgdjJpMzIgICAgICAgICAgPSAgNDIsICAgLy8gIDIgeCBpMzIKKyAgICAgIHY0aTMyICAgICAgICAgID0gIDQzLCAgIC8vICA0IHggaTMyCisgICAgICB2OGkzMiAgICAgICAgICA9ICA0NCwgICAvLyAgOCB4IGkzMgorICAgICAgdjE2aTMyICAgICAgICAgPSAgNDUsICAgLy8gMTYgeCBpMzIKKyAgICAgIHYzMmkzMiAgICAgICAgID0gIDQ2LCAgIC8vIDMyIHggaTMyCisgICAgICB2NjRpMzIgICAgICAgICA9ICA0NywgICAvLyA2NCB4IGkzMgorCisgICAgICB2MWk2NCAgICAgICAgICA9ICA0OCwgICAvLyAgMSB4IGk2NAorICAgICAgdjJpNjQgICAgICAgICAgPSAgNDksICAgLy8gIDIgeCBpNjQKKyAgICAgIHY0aTY0ICAgICAgICAgID0gIDUwLCAgIC8vICA0IHggaTY0CisgICAgICB2OGk2NCAgICAgICAgICA9ICA1MSwgICAvLyAgOCB4IGk2NAorICAgICAgdjE2aTY0ICAgICAgICAgPSAgNTIsICAgLy8gMTYgeCBpNjQKKyAgICAgIHYzMmk2NCAgICAgICAgID0gIDUzLCAgIC8vIDMyIHggaTY0CisKKyAgICAgIHYxaTEyOCAgICAgICAgID0gIDU0LCAgIC8vICAxIHggaTEyOAorCisgICAgICAvLyBTY2FsYWJsZSBpbnRlZ2VyIHR5cGVzCisgICAgICBueHYxaTEgICAgICAgICA9ICA1NSwgICAvLyBuIHggIDEgeCBpMQorICAgICAgbnh2MmkxICAgICAgICAgPSAgNTYsICAgLy8gbiB4ICAyIHggaTEKKyAgICAgIG54djRpMSAgICAgICAgID0gIDU3LCAgIC8vIG4geCAgNCB4IGkxCisgICAgICBueHY4aTEgICAgICAgICA9ICA1OCwgICAvLyBuIHggIDggeCBpMQorICAgICAgbnh2MTZpMSAgICAgICAgPSAgNTksICAgLy8gbiB4IDE2IHggaTEKKyAgICAgIG54djMyaTEgICAgICAgID0gIDYwLCAgIC8vIG4geCAzMiB4IGkxCisKKyAgICAgIG54djFpOCAgICAgICAgID0gIDYxLCAgIC8vIG4geCAgMSB4IGk4CisgICAgICBueHYyaTggICAgICAgICA9ICA2MiwgICAvLyBuIHggIDIgeCBpOAorICAgICAgbnh2NGk4ICAgICAgICAgPSAgNjMsICAgLy8gbiB4ICA0IHggaTgKKyAgICAgIG54djhpOCAgICAgICAgID0gIDY0LCAgIC8vIG4geCAgOCB4IGk4CisgICAgICBueHYxNmk4ICAgICAgICA9ICA2NSwgICAvLyBuIHggMTYgeCBpOAorICAgICAgbnh2MzJpOCAgICAgICAgPSAgNjYsICAgLy8gbiB4IDMyIHggaTgKKworICAgICAgbnh2MWkxNiAgICAgICAgPSAgNjcsICAgLy8gbiB4ICAxIHggaTE2CisgICAgICBueHYyaTE2ICAgICAgICA9ICA2OCwgICAvLyBuIHggIDIgeCBpMTYKKyAgICAgIG54djRpMTYgICAgICAgID0gIDY5LCAgIC8vIG4geCAgNCB4IGkxNgorICAgICAgbnh2OGkxNiAgICAgICAgPSAgNzAsICAgLy8gbiB4ICA4IHggaTE2CisgICAgICBueHYxNmkxNiAgICAgICA9ICA3MSwgICAvLyBuIHggMTYgeCBpMTYKKyAgICAgIG54djMyaTE2ICAgICAgID0gIDcyLCAgIC8vIG4geCAzMiB4IGkxNgorCisgICAgICBueHYxaTMyICAgICAgICA9ICA3MywgICAvLyBuIHggIDEgeCBpMzIKKyAgICAgIG54djJpMzIgICAgICAgID0gIDc0LCAgIC8vIG4geCAgMiB4IGkzMgorICAgICAgbnh2NGkzMiAgICAgICAgPSAgNzUsICAgLy8gbiB4ICA0IHggaTMyCisgICAgICBueHY4aTMyICAgICAgICA9ICA3NiwgICAvLyBuIHggIDggeCBpMzIKKyAgICAgIG54djE2aTMyICAgICAgID0gIDc3LCAgIC8vIG4geCAxNiB4IGkzMgorICAgICAgbnh2MzJpMzIgICAgICAgPSAgNzgsICAgLy8gbiB4IDMyIHggaTMyCisKKyAgICAgIG54djFpNjQgICAgICAgID0gIDc5LCAgIC8vIG4geCAgMSB4IGk2NAorICAgICAgbnh2Mmk2NCAgICAgICAgPSAgODAsICAgLy8gbiB4ICAyIHggaTY0CisgICAgICBueHY0aTY0ICAgICAgICA9ICA4MSwgICAvLyBuIHggIDQgeCBpNjQKKyAgICAgIG54djhpNjQgICAgICAgID0gIDgyLCAgIC8vIG4geCAgOCB4IGk2NAorICAgICAgbnh2MTZpNjQgICAgICAgPSAgODMsICAgLy8gbiB4IDE2IHggaTY0CisgICAgICBueHYzMmk2NCAgICAgICA9ICA4NCwgICAvLyBuIHggMzIgeCBpNjQKKworICAgICAgRklSU1RfSU5URUdFUl9WRUNUT1JfVkFMVUVUWVBFID0gdjFpMSwKKyAgICAgIExBU1RfSU5URUdFUl9WRUNUT1JfVkFMVUVUWVBFID0gbnh2MzJpNjQsCisKKyAgICAgIEZJUlNUX0lOVEVHRVJfU0NBTEFCTEVfVkFMVUVUWVBFID0gbnh2MWkxLAorICAgICAgTEFTVF9JTlRFR0VSX1NDQUxBQkxFX1ZBTFVFVFlQRSA9IG54djMyaTY0LAorCisgICAgICB2MmYxNiAgICAgICAgICA9ICA4NSwgICAvLyAgMiB4IGYxNgorICAgICAgdjRmMTYgICAgICAgICAgPSAgODYsICAgLy8gIDQgeCBmMTYKKyAgICAgIHY4ZjE2ICAgICAgICAgID0gIDg3LCAgIC8vICA4IHggZjE2CisgICAgICB2MWYzMiAgICAgICAgICA9ICA4OCwgICAvLyAgMSB4IGYzMgorICAgICAgdjJmMzIgICAgICAgICAgPSAgODksICAgLy8gIDIgeCBmMzIKKyAgICAgIHY0ZjMyICAgICAgICAgID0gIDkwLCAgIC8vICA0IHggZjMyCisgICAgICB2OGYzMiAgICAgICAgICA9ICA5MSwgICAvLyAgOCB4IGYzMgorICAgICAgdjE2ZjMyICAgICAgICAgPSAgOTIsICAgLy8gMTYgeCBmMzIKKyAgICAgIHYxZjY0ICAgICAgICAgID0gIDkzLCAgIC8vICAxIHggZjY0CisgICAgICB2MmY2NCAgICAgICAgICA9ICA5NCwgICAvLyAgMiB4IGY2NAorICAgICAgdjRmNjQgICAgICAgICAgPSAgOTUsICAgLy8gIDQgeCBmNjQKKyAgICAgIHY4ZjY0ICAgICAgICAgID0gIDk2LCAgIC8vICA4IHggZjY0CisKKyAgICAgIG54djJmMTYgICAgICAgID0gIDk3LCAgIC8vIG4geCAgMiB4IGYxNgorICAgICAgbnh2NGYxNiAgICAgICAgPSAgOTgsICAgLy8gbiB4ICA0IHggZjE2CisgICAgICBueHY4ZjE2ICAgICAgICA9ICA5OSwgICAvLyBuIHggIDggeCBmMTYKKyAgICAgIG54djFmMzIgICAgICAgID0gMTAwLCAgIC8vIG4geCAgMSB4IGYzMgorICAgICAgbnh2MmYzMiAgICAgICAgPSAxMDEsICAgLy8gbiB4ICAyIHggZjMyCisgICAgICBueHY0ZjMyICAgICAgICA9IDEwMiwgICAvLyBuIHggIDQgeCBmMzIKKyAgICAgIG54djhmMzIgICAgICAgID0gMTAzLCAgIC8vIG4geCAgOCB4IGYzMgorICAgICAgbnh2MTZmMzIgICAgICAgPSAxMDQsICAgLy8gbiB4IDE2IHggZjMyCisgICAgICBueHYxZjY0ICAgICAgICA9IDEwNSwgICAvLyBuIHggIDEgeCBmNjQKKyAgICAgIG54djJmNjQgICAgICAgID0gMTA2LCAgIC8vIG4geCAgMiB4IGY2NAorICAgICAgbnh2NGY2NCAgICAgICAgPSAxMDcsICAgLy8gbiB4ICA0IHggZjY0CisgICAgICBueHY4ZjY0ICAgICAgICA9IDEwOCwgICAvLyBuIHggIDggeCBmNjQKKworICAgICAgRklSU1RfRlBfVkVDVE9SX1ZBTFVFVFlQRSA9IHYyZjE2LAorICAgICAgTEFTVF9GUF9WRUNUT1JfVkFMVUVUWVBFID0gbnh2OGY2NCwKKworICAgICAgRklSU1RfRlBfU0NBTEFCTEVfVkFMVUVUWVBFID0gbnh2MmYxNiwKKyAgICAgIExBU1RfRlBfU0NBTEFCTEVfVkFMVUVUWVBFID0gbnh2OGY2NCwKKworICAgICAgRklSU1RfVkVDVE9SX1ZBTFVFVFlQRSA9IHYxaTEsCisgICAgICBMQVNUX1ZFQ1RPUl9WQUxVRVRZUEUgID0gbnh2OGY2NCwKKworICAgICAgeDg2bW14ICAgICAgICAgPSAgMTA5LCAgIC8vIFRoaXMgaXMgYW4gWDg2IE1NWCB2YWx1ZQorCisgICAgICBHbHVlICAgICAgICAgICA9ICAxMTAsICAgLy8gVGhpcyBnbHVlcyBub2RlcyB0b2dldGhlciBkdXJpbmcgcHJlLVJBIHNjaGVkCisKKyAgICAgIGlzVm9pZCAgICAgICAgID0gIDExMSwgICAvLyBUaGlzIGhhcyBubyB2YWx1ZQorCisgICAgICBVbnR5cGVkICAgICAgICA9ICAxMTIsICAgLy8gVGhpcyB2YWx1ZSB0YWtlcyBhIHJlZ2lzdGVyLCBidXQgaGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5zcGVjaWZpZWQgdHlwZS4gIFRoZSByZWdpc3RlciBjbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgb3Bjb2RlLgorCisgICAgICBFeGNlcHRSZWYgICAgICA9IDExMywgICAgLy8gV2ViQXNzZW1ibHkncyBleGNlcHRfcmVmIHR5cGUKKworICAgICAgRklSU1RfVkFMVUVUWVBFID0gMSwgICAgIC8vIFRoaXMgaXMgYWx3YXlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuCisgICAgICBMQVNUX1ZBTFVFVFlQRSA9ICAxMTQsICAgLy8gVGhpcyBhbHdheXMgcmVtYWlucyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LgorCisgICAgICAvLyBUaGlzIGlzIHRoZSBjdXJyZW50IG1heGltdW0gZm9yIExBU1RfVkFMVUVUWVBFLgorICAgICAgLy8gTVZUOjpNQVhfQUxMT1dFRF9WQUxVRVRZUEUgaXMgdXNlZCBmb3IgYXNzZXJ0cyBhbmQgdG8gc2l6ZSBiaXQgdmVjdG9ycworICAgICAgLy8gVGhpcyB2YWx1ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzIuCisgICAgICBNQVhfQUxMT1dFRF9WQUxVRVRZUEUgPSAxMjgsCisKKyAgICAgIC8vIEEgdmFsdWUgb2YgdHlwZSBsbHZtOjpUb2tlblR5CisgICAgICB0b2tlbiAgICAgICAgICA9IDI0OCwKKworICAgICAgLy8gVGhpcyBpcyBNRE5vZGUgb3IgTURTdHJpbmcuCisgICAgICBNZXRhZGF0YSAgICAgICA9IDI0OSwKKworICAgICAgLy8gQW4gaW50IHZhbHVlIHRoZSBzaXplIG9mIHRoZSBwb2ludGVyIG9mIHRoZSBjdXJyZW50CisgICAgICAvLyB0YXJnZXQgdG8gYW55IGFkZHJlc3Mgc3BhY2UuIFRoaXMgbXVzdCBvbmx5IGJlIHVzZWQgaW50ZXJuYWwgdG8KKyAgICAgIC8vIHRibGdlbi4gT3RoZXIgdGhhbiBmb3Igb3ZlcmxvYWRpbmcsIHdlIHRyZWF0IGlQVFJBbnkgdGhlIHNhbWUgYXMgaVBUUi4KKyAgICAgIGlQVFJBbnkgICAgICAgID0gMjUwLAorCisgICAgICAvLyBBIHZlY3RvciB3aXRoIGFueSBsZW5ndGggYW5kIGVsZW1lbnQgc2l6ZS4gVGhpcyBpcyB1c2VkCisgICAgICAvLyBmb3IgaW50cmluc2ljcyB0aGF0IGhhdmUgb3ZlcmxvYWRpbmdzIGJhc2VkIG9uIHZlY3RvciB0eXBlcy4KKyAgICAgIC8vIFRoaXMgaXMgb25seSBmb3IgdGJsZ2VuJ3MgY29uc3VtcHRpb24hCisgICAgICB2QW55ICAgICAgICAgICA9IDI1MSwKKworICAgICAgLy8gQW55IGZsb2F0aW5nLXBvaW50IG9yIHZlY3RvciBmbG9hdGluZy1wb2ludCB2YWx1ZS4gVGhpcyBpcyB1c2VkCisgICAgICAvLyBmb3IgaW50cmluc2ljcyB0aGF0IGhhdmUgb3ZlcmxvYWRpbmdzIGJhc2VkIG9uIGZsb2F0aW5nLXBvaW50IHR5cGVzLgorICAgICAgLy8gVGhpcyBpcyBvbmx5IGZvciB0YmxnZW4ncyBjb25zdW1wdGlvbiEKKyAgICAgIGZBbnkgICAgICAgICAgID0gMjUyLAorCisgICAgICAvLyBBbiBpbnRlZ2VyIG9yIHZlY3RvciBpbnRlZ2VyIHZhbHVlIG9mIGFueSBiaXQgd2lkdGguIFRoaXMgaXMKKyAgICAgIC8vIHVzZWQgZm9yIGludHJpbnNpY3MgdGhhdCBoYXZlIG92ZXJsb2FkaW5ncyBiYXNlZCBvbiBpbnRlZ2VyIGJpdCB3aWR0aHMuCisgICAgICAvLyBUaGlzIGlzIG9ubHkgZm9yIHRibGdlbidzIGNvbnN1bXB0aW9uIQorICAgICAgaUFueSAgICAgICAgICAgPSAyNTMsCisKKyAgICAgIC8vIEFuIGludCB2YWx1ZSB0aGUgc2l6ZSBvZiB0aGUgcG9pbnRlciBvZiB0aGUgY3VycmVudAorICAgICAgLy8gdGFyZ2V0LiAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGludGVybmFsIHRvIHRibGdlbiEKKyAgICAgIGlQVFIgICAgICAgICAgID0gMjU0LAorCisgICAgICAvLyBBbnkgdHlwZS4gVGhpcyBpcyB1c2VkIGZvciBpbnRyaW5zaWNzIHRoYXQgaGF2ZSBvdmVybG9hZGluZ3MuCisgICAgICAvLyBUaGlzIGlzIG9ubHkgZm9yIHRibGdlbidzIGNvbnN1bXB0aW9uIQorICAgICAgQW55ICAgICAgICAgICAgPSAyNTUKKyAgICB9OworCisgICAgU2ltcGxlVmFsdWVUeXBlIFNpbXBsZVR5ID0gSU5WQUxJRF9TSU1QTEVfVkFMVUVfVFlQRTsKKworICAgIC8vIEEgY2xhc3MgdG8gcmVwcmVzZW50IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSB2ZWN0b3IKKyAgICAvLworICAgIC8vIEZvciBmaXhlZC1sZW5ndGggdmVjdG9ycywgdGhlIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBpcyBlcXVhbCB0byAnTWluJworICAgIC8vIEZvciBzY2FsYWJsZSB2ZWN0b3JzLCB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGlzIGEgbXVsdGlwbGUgb2YgJ01pbicKKyAgICBjbGFzcyBFbGVtZW50Q291bnQgeworICAgIHB1YmxpYzoKKyAgICAgIHVuc2lnbmVkIE1pbjsKKyAgICAgIGJvb2wgU2NhbGFibGU7CisKKyAgICAgIEVsZW1lbnRDb3VudCh1bnNpZ25lZCBNaW4sIGJvb2wgU2NhbGFibGUpCisgICAgICA6IE1pbihNaW4pLCBTY2FsYWJsZShTY2FsYWJsZSkge30KKworICAgICAgRWxlbWVudENvdW50IG9wZXJhdG9yKih1bnNpZ25lZCBSSFMpIHsKKyAgICAgICAgcmV0dXJuIHsgTWluICogUkhTLCBTY2FsYWJsZSB9OworICAgICAgfQorCisgICAgICBFbGVtZW50Q291bnQmIG9wZXJhdG9yKj0odW5zaWduZWQgUkhTKSB7CisgICAgICAgIE1pbiAqPSBSSFM7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgRWxlbWVudENvdW50IG9wZXJhdG9yLyh1bnNpZ25lZCBSSFMpIHsKKyAgICAgICAgcmV0dXJuIHsgTWluIC8gUkhTLCBTY2FsYWJsZSB9OworICAgICAgfQorCisgICAgICBFbGVtZW50Q291bnQmIG9wZXJhdG9yLz0odW5zaWduZWQgUkhTKSB7CisgICAgICAgIE1pbiAvPSBSSFM7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEVsZW1lbnRDb3VudCYgUkhTKSB7CisgICAgICAgIHJldHVybiBNaW4gPT0gUkhTLk1pbiAmJiBTY2FsYWJsZSA9PSBSSFMuU2NhbGFibGU7CisgICAgICB9CisgICAgfTsKKworICAgIGNvbnN0ZXhwciBNVlQoKSA9IGRlZmF1bHQ7CisgICAgY29uc3RleHByIE1WVChTaW1wbGVWYWx1ZVR5cGUgU1ZUKSA6IFNpbXBsZVR5KFNWVCkge30KKworICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE1WVCYgUykgIGNvbnN0IHsgcmV0dXJuIFNpbXBsZVR5ID4gIFMuU2ltcGxlVHk7IH0KKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBNVlQmIFMpICBjb25zdCB7IHJldHVybiBTaW1wbGVUeSA8ICBTLlNpbXBsZVR5OyB9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1WVCYgUykgY29uc3QgeyByZXR1cm4gU2ltcGxlVHkgPT0gUy5TaW1wbGVUeTsgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNVlQmIFMpIGNvbnN0IHsgcmV0dXJuIFNpbXBsZVR5ICE9IFMuU2ltcGxlVHk7IH0KKyAgICBib29sIG9wZXJhdG9yPj0oY29uc3QgTVZUJiBTKSBjb25zdCB7IHJldHVybiBTaW1wbGVUeSA+PSBTLlNpbXBsZVR5OyB9CisgICAgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IE1WVCYgUykgY29uc3QgeyByZXR1cm4gU2ltcGxlVHkgPD0gUy5TaW1wbGVUeTsgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSB2YWxpZCBzaW1wbGUgdmFsdWV0eXBlLgorICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoU2ltcGxlVHkgPj0gTVZUOjpGSVJTVF9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPCBNVlQ6OkxBU1RfVkFMVUVUWVBFKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIEZQIG9yIGEgdmVjdG9yIEZQIHR5cGUuCisgICAgYm9vbCBpc0Zsb2F0aW5nUG9pbnQoKSBjb25zdCB7CisgICAgICByZXR1cm4gKChTaW1wbGVUeSA+PSBNVlQ6OkZJUlNUX0ZQX1ZBTFVFVFlQRSAmJgorICAgICAgICAgICAgICAgU2ltcGxlVHkgPD0gTVZUOjpMQVNUX0ZQX1ZBTFVFVFlQRSkgfHwKKyAgICAgICAgICAgICAgKFNpbXBsZVR5ID49IE1WVDo6RklSU1RfRlBfVkVDVE9SX1ZBTFVFVFlQRSAmJgorICAgICAgICAgICAgICAgU2ltcGxlVHkgPD0gTVZUOjpMQVNUX0ZQX1ZFQ1RPUl9WQUxVRVRZUEUpKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBpbnRlZ2VyIG9yIGEgdmVjdG9yIGludGVnZXIgdHlwZS4KKyAgICBib29sIGlzSW50ZWdlcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoKFNpbXBsZVR5ID49IE1WVDo6RklSU1RfSU5URUdFUl9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgICAgIFNpbXBsZVR5IDw9IE1WVDo6TEFTVF9JTlRFR0VSX1ZBTFVFVFlQRSkgfHwKKyAgICAgICAgICAgICAgKFNpbXBsZVR5ID49IE1WVDo6RklSU1RfSU5URUdFUl9WRUNUT1JfVkFMVUVUWVBFICYmCisgICAgICAgICAgICAgICBTaW1wbGVUeSA8PSBNVlQ6OkxBU1RfSU5URUdFUl9WRUNUT1JfVkFMVUVUWVBFKSk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gaW50ZWdlciwgbm90IGluY2x1ZGluZyB2ZWN0b3JzLgorICAgIGJvb2wgaXNTY2FsYXJJbnRlZ2VyKCkgY29uc3QgeworICAgICAgcmV0dXJuIChTaW1wbGVUeSA+PSBNVlQ6OkZJUlNUX0lOVEVHRVJfVkFMVUVUWVBFICYmCisgICAgICAgICAgICAgIFNpbXBsZVR5IDw9IE1WVDo6TEFTVF9JTlRFR0VSX1ZBTFVFVFlQRSk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSB2ZWN0b3IgdmFsdWUgdHlwZS4KKyAgICBib29sIGlzVmVjdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIChTaW1wbGVUeSA+PSBNVlQ6OkZJUlNUX1ZFQ1RPUl9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPD0gTVZUOjpMQVNUX1ZFQ1RPUl9WQUxVRVRZUEUpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgdmVjdG9yIHZhbHVlIHR5cGUgd2hlcmUgdGhlCisgICAgLy8vIHJ1bnRpbWUgbGVuZ3RoIGlzIG1hY2hpbmUgZGVwZW5kZW50CisgICAgYm9vbCBpc1NjYWxhYmxlVmVjdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuICgoU2ltcGxlVHkgPj0gTVZUOjpGSVJTVF9JTlRFR0VSX1NDQUxBQkxFX1ZBTFVFVFlQRSAmJgorICAgICAgICAgICAgICAgU2ltcGxlVHkgPD0gTVZUOjpMQVNUX0lOVEVHRVJfU0NBTEFCTEVfVkFMVUVUWVBFKSB8fAorICAgICAgICAgICAgICAoU2ltcGxlVHkgPj0gTVZUOjpGSVJTVF9GUF9TQ0FMQUJMRV9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgICAgIFNpbXBsZVR5IDw9IE1WVDo6TEFTVF9GUF9TQ0FMQUJMRV9WQUxVRVRZUEUpKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIDE2LWJpdCB2ZWN0b3IgdHlwZS4KKyAgICBib29sIGlzMTZCaXRWZWN0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gKFNpbXBsZVR5ID09IE1WVDo6djJpOCAgfHwgU2ltcGxlVHkgPT0gTVZUOjp2MWkxNiB8fAorICAgICAgICAgICAgICBTaW1wbGVUeSA9PSBNVlQ6OnYxNmkxKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIDMyLWJpdCB2ZWN0b3IgdHlwZS4KKyAgICBib29sIGlzMzJCaXRWZWN0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gKFNpbXBsZVR5ID09IE1WVDo6djMyaTEgfHwgU2ltcGxlVHkgPT0gTVZUOjp2NGk4ICB8fAorICAgICAgICAgICAgICBTaW1wbGVUeSA9PSBNVlQ6OnYyaTE2IHx8IFNpbXBsZVR5ID09IE1WVDo6djFpMzIgfHwKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPT0gTVZUOjp2MmYxNiB8fCBTaW1wbGVUeSA9PSBNVlQ6OnYxZjMyKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIDY0LWJpdCB2ZWN0b3IgdHlwZS4KKyAgICBib29sIGlzNjRCaXRWZWN0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gKFNpbXBsZVR5ID09IE1WVDo6djY0aTEgfHwgU2ltcGxlVHkgPT0gTVZUOjp2OGk4ICB8fAorICAgICAgICAgICAgICBTaW1wbGVUeSA9PSBNVlQ6OnY0aTE2IHx8IFNpbXBsZVR5ID09IE1WVDo6djJpMzIgfHwKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPT0gTVZUOjp2MWk2NCB8fCBTaW1wbGVUeSA9PSBNVlQ6OnY0ZjE2IHx8CisgICAgICAgICAgICAgIFNpbXBsZVR5ID09IE1WVDo6djJmMzIgfHwgU2ltcGxlVHkgPT0gTVZUOjp2MWY2NCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSAxMjgtYml0IHZlY3RvciB0eXBlLgorICAgIGJvb2wgaXMxMjhCaXRWZWN0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gKFNpbXBsZVR5ID09IE1WVDo6djEyOGkxIHx8IFNpbXBsZVR5ID09IE1WVDo6djE2aTggIHx8CisgICAgICAgICAgICAgIFNpbXBsZVR5ID09IE1WVDo6djhpMTYgIHx8IFNpbXBsZVR5ID09IE1WVDo6djRpMzIgIHx8CisgICAgICAgICAgICAgIFNpbXBsZVR5ID09IE1WVDo6djJpNjQgIHx8IFNpbXBsZVR5ID09IE1WVDo6djFpMTI4IHx8CisgICAgICAgICAgICAgIFNpbXBsZVR5ID09IE1WVDo6djhmMTYgIHx8IFNpbXBsZVR5ID09IE1WVDo6djRmMzIgIHx8CisgICAgICAgICAgICAgIFNpbXBsZVR5ID09IE1WVDo6djJmNjQpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgMjU2LWJpdCB2ZWN0b3IgdHlwZS4KKyAgICBib29sIGlzMjU2Qml0VmVjdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIChTaW1wbGVUeSA9PSBNVlQ6OnY4ZjMyIHx8IFNpbXBsZVR5ID09IE1WVDo6djRmNjQgIHx8CisgICAgICAgICAgICAgIFNpbXBsZVR5ID09IE1WVDo6djMyaTggfHwgU2ltcGxlVHkgPT0gTVZUOjp2MTZpMTYgfHwKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPT0gTVZUOjp2OGkzMiB8fCBTaW1wbGVUeSA9PSBNVlQ6OnY0aTY0KTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIDUxMi1iaXQgdmVjdG9yIHR5cGUuCisgICAgYm9vbCBpczUxMkJpdFZlY3RvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoU2ltcGxlVHkgPT0gTVZUOjp2MTZmMzIgfHwgU2ltcGxlVHkgPT0gTVZUOjp2OGY2NCAgfHwKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPT0gTVZUOjp2NTEyaTEgfHwgU2ltcGxlVHkgPT0gTVZUOjp2NjRpOCAgfHwKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPT0gTVZUOjp2MzJpMTYgfHwgU2ltcGxlVHkgPT0gTVZUOjp2MTZpMzIgfHwKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPT0gTVZUOjp2OGk2NCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSAxMDI0LWJpdCB2ZWN0b3IgdHlwZS4KKyAgICBib29sIGlzMTAyNEJpdFZlY3RvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoU2ltcGxlVHkgPT0gTVZUOjp2MTAyNGkxIHx8IFNpbXBsZVR5ID09IE1WVDo6djEyOGk4IHx8CisgICAgICAgICAgICAgIFNpbXBsZVR5ID09IE1WVDo6djY0aTE2ICB8fCBTaW1wbGVUeSA9PSBNVlQ6OnYzMmkzMiB8fAorICAgICAgICAgICAgICBTaW1wbGVUeSA9PSBNVlQ6OnYxNmk2NCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSAyMDQ4LWJpdCB2ZWN0b3IgdHlwZS4KKyAgICBib29sIGlzMjA0OEJpdFZlY3RvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoU2ltcGxlVHkgPT0gTVZUOjp2MjU2aTggfHwgU2ltcGxlVHkgPT0gTVZUOjp2MTI4aTE2IHx8CisgICAgICAgICAgICAgIFNpbXBsZVR5ID09IE1WVDo6djY0aTMyIHx8IFNpbXBsZVR5ID09IE1WVDo6djMyaTY0KTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBvdmVybG9hZGVkIHR5cGUgZm9yIFRhYmxlR2VuLgorICAgIGJvb2wgaXNPdmVybG9hZGVkKCkgY29uc3QgeworICAgICAgcmV0dXJuIChTaW1wbGVUeT09TVZUOjpBbnkgIHx8CisgICAgICAgICAgICAgIFNpbXBsZVR5PT1NVlQ6OmlBbnkgfHwgU2ltcGxlVHk9PU1WVDo6ZkFueSB8fAorICAgICAgICAgICAgICBTaW1wbGVUeT09TVZUOjp2QW55IHx8IFNpbXBsZVR5PT1NVlQ6OmlQVFJBbnkpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHZlY3RvciBpcyBhIHBvd2VyIG9mIDIuCisgICAgYm9vbCBpc1BvdzJWZWN0b3JUeXBlKCkgY29uc3QgeworICAgICAgdW5zaWduZWQgTkVsdHMgPSBnZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgICAgcmV0dXJuICEoTkVsdHMgJiAoTkVsdHMgLSAxKSk7CisgICAgfQorCisgICAgLy8vIFdpZGVucyB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiB2ZWN0b3IgTVZUIHVwIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIKKyAgICAvLy8gYW5kIHJldHVybnMgdGhhdCB0eXBlLgorICAgIE1WVCBnZXRQb3cyVmVjdG9yVHlwZSgpIGNvbnN0IHsKKyAgICAgIGlmIChpc1BvdzJWZWN0b3JUeXBlKCkpCisgICAgICAgIHJldHVybiAqdGhpczsKKworICAgICAgdW5zaWduZWQgTkVsdHMgPSBnZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgICAgdW5zaWduZWQgUG93Mk5FbHRzID0gMSA8PCBMb2cyXzMyX0NlaWwoTkVsdHMpOworICAgICAgcmV0dXJuIE1WVDo6Z2V0VmVjdG9yVlQoZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSwgUG93Mk5FbHRzKTsKKyAgICB9CisKKyAgICAvLy8gSWYgdGhpcyBpcyBhIHZlY3RvciwgcmV0dXJuIHRoZSBlbGVtZW50IHR5cGUsIG90aGVyd2lzZSByZXR1cm4gdGhpcy4KKyAgICBNVlQgZ2V0U2NhbGFyVHlwZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpc1ZlY3RvcigpID8gZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSA6ICp0aGlzOworICAgIH0KKworICAgIE1WVCBnZXRWZWN0b3JFbGVtZW50VHlwZSgpIGNvbnN0IHsKKyAgICAgIHN3aXRjaCAoU2ltcGxlVHkpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIk5vdCBhIHZlY3RvciBNVlQhIik7CisgICAgICBjYXNlIHYxaTE6CisgICAgICBjYXNlIHYyaTE6CisgICAgICBjYXNlIHY0aTE6CisgICAgICBjYXNlIHY4aTE6CisgICAgICBjYXNlIHYxNmkxOgorICAgICAgY2FzZSB2MzJpMToKKyAgICAgIGNhc2UgdjY0aTE6CisgICAgICBjYXNlIHYxMjhpMToKKyAgICAgIGNhc2UgdjUxMmkxOgorICAgICAgY2FzZSB2MTAyNGkxOgorICAgICAgY2FzZSBueHYxaTE6CisgICAgICBjYXNlIG54djJpMToKKyAgICAgIGNhc2Ugbnh2NGkxOgorICAgICAgY2FzZSBueHY4aTE6CisgICAgICBjYXNlIG54djE2aTE6CisgICAgICBjYXNlIG54djMyaTE6IHJldHVybiBpMTsKKyAgICAgIGNhc2UgdjFpODoKKyAgICAgIGNhc2UgdjJpODoKKyAgICAgIGNhc2UgdjRpODoKKyAgICAgIGNhc2UgdjhpODoKKyAgICAgIGNhc2UgdjE2aTg6CisgICAgICBjYXNlIHYzMmk4OgorICAgICAgY2FzZSB2NjRpODoKKyAgICAgIGNhc2UgdjEyOGk4OgorICAgICAgY2FzZSB2MjU2aTg6CisgICAgICBjYXNlIG54djFpODoKKyAgICAgIGNhc2Ugbnh2Mmk4OgorICAgICAgY2FzZSBueHY0aTg6CisgICAgICBjYXNlIG54djhpODoKKyAgICAgIGNhc2Ugbnh2MTZpODoKKyAgICAgIGNhc2Ugbnh2MzJpODogcmV0dXJuIGk4OworICAgICAgY2FzZSB2MWkxNjoKKyAgICAgIGNhc2UgdjJpMTY6CisgICAgICBjYXNlIHY0aTE2OgorICAgICAgY2FzZSB2OGkxNjoKKyAgICAgIGNhc2UgdjE2aTE2OgorICAgICAgY2FzZSB2MzJpMTY6CisgICAgICBjYXNlIHY2NGkxNjoKKyAgICAgIGNhc2UgdjEyOGkxNjoKKyAgICAgIGNhc2Ugbnh2MWkxNjoKKyAgICAgIGNhc2Ugbnh2MmkxNjoKKyAgICAgIGNhc2Ugbnh2NGkxNjoKKyAgICAgIGNhc2Ugbnh2OGkxNjoKKyAgICAgIGNhc2Ugbnh2MTZpMTY6CisgICAgICBjYXNlIG54djMyaTE2OiByZXR1cm4gaTE2OworICAgICAgY2FzZSB2MWkzMjoKKyAgICAgIGNhc2UgdjJpMzI6CisgICAgICBjYXNlIHY0aTMyOgorICAgICAgY2FzZSB2OGkzMjoKKyAgICAgIGNhc2UgdjE2aTMyOgorICAgICAgY2FzZSB2MzJpMzI6CisgICAgICBjYXNlIHY2NGkzMjoKKyAgICAgIGNhc2Ugbnh2MWkzMjoKKyAgICAgIGNhc2Ugbnh2MmkzMjoKKyAgICAgIGNhc2Ugbnh2NGkzMjoKKyAgICAgIGNhc2Ugbnh2OGkzMjoKKyAgICAgIGNhc2Ugbnh2MTZpMzI6CisgICAgICBjYXNlIG54djMyaTMyOiByZXR1cm4gaTMyOworICAgICAgY2FzZSB2MWk2NDoKKyAgICAgIGNhc2UgdjJpNjQ6CisgICAgICBjYXNlIHY0aTY0OgorICAgICAgY2FzZSB2OGk2NDoKKyAgICAgIGNhc2UgdjE2aTY0OgorICAgICAgY2FzZSB2MzJpNjQ6CisgICAgICBjYXNlIG54djFpNjQ6CisgICAgICBjYXNlIG54djJpNjQ6CisgICAgICBjYXNlIG54djRpNjQ6CisgICAgICBjYXNlIG54djhpNjQ6CisgICAgICBjYXNlIG54djE2aTY0OgorICAgICAgY2FzZSBueHYzMmk2NDogcmV0dXJuIGk2NDsKKyAgICAgIGNhc2UgdjFpMTI4OiByZXR1cm4gaTEyODsKKyAgICAgIGNhc2UgdjJmMTY6CisgICAgICBjYXNlIHY0ZjE2OgorICAgICAgY2FzZSB2OGYxNjoKKyAgICAgIGNhc2Ugbnh2MmYxNjoKKyAgICAgIGNhc2Ugbnh2NGYxNjoKKyAgICAgIGNhc2Ugbnh2OGYxNjogcmV0dXJuIGYxNjsKKyAgICAgIGNhc2UgdjFmMzI6CisgICAgICBjYXNlIHYyZjMyOgorICAgICAgY2FzZSB2NGYzMjoKKyAgICAgIGNhc2UgdjhmMzI6CisgICAgICBjYXNlIHYxNmYzMjoKKyAgICAgIGNhc2Ugbnh2MWYzMjoKKyAgICAgIGNhc2Ugbnh2MmYzMjoKKyAgICAgIGNhc2Ugbnh2NGYzMjoKKyAgICAgIGNhc2Ugbnh2OGYzMjoKKyAgICAgIGNhc2Ugbnh2MTZmMzI6IHJldHVybiBmMzI7CisgICAgICBjYXNlIHYxZjY0OgorICAgICAgY2FzZSB2MmY2NDoKKyAgICAgIGNhc2UgdjRmNjQ6CisgICAgICBjYXNlIHY4ZjY0OgorICAgICAgY2FzZSBueHYxZjY0OgorICAgICAgY2FzZSBueHYyZjY0OgorICAgICAgY2FzZSBueHY0ZjY0OgorICAgICAgY2FzZSBueHY4ZjY0OiByZXR1cm4gZjY0OworICAgICAgfQorICAgIH0KKworICAgIHVuc2lnbmVkIGdldFZlY3Rvck51bUVsZW1lbnRzKCkgY29uc3QgeworICAgICAgc3dpdGNoIChTaW1wbGVUeSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiTm90IGEgdmVjdG9yIE1WVCEiKTsKKyAgICAgIGNhc2UgdjEwMjRpMTogcmV0dXJuIDEwMjQ7CisgICAgICBjYXNlIHY1MTJpMTogcmV0dXJuIDUxMjsKKyAgICAgIGNhc2UgdjI1Nmk4OiByZXR1cm4gMjU2OworICAgICAgY2FzZSB2MTI4aTE6CisgICAgICBjYXNlIHYxMjhpODoKKyAgICAgIGNhc2UgdjEyOGkxNjogcmV0dXJuIDEyODsKKyAgICAgIGNhc2UgdjY0aTE6CisgICAgICBjYXNlIHY2NGk4OgorICAgICAgY2FzZSB2NjRpMTY6CisgICAgICBjYXNlIHY2NGkzMjogcmV0dXJuIDY0OworICAgICAgY2FzZSB2MzJpMToKKyAgICAgIGNhc2UgdjMyaTg6CisgICAgICBjYXNlIHYzMmkxNjoKKyAgICAgIGNhc2UgdjMyaTMyOgorICAgICAgY2FzZSB2MzJpNjQ6CisgICAgICBjYXNlIG54djMyaTE6CisgICAgICBjYXNlIG54djMyaTg6CisgICAgICBjYXNlIG54djMyaTE2OgorICAgICAgY2FzZSBueHYzMmkzMjoKKyAgICAgIGNhc2Ugbnh2MzJpNjQ6IHJldHVybiAzMjsKKyAgICAgIGNhc2UgdjE2aTE6CisgICAgICBjYXNlIHYxNmk4OgorICAgICAgY2FzZSB2MTZpMTY6CisgICAgICBjYXNlIHYxNmkzMjoKKyAgICAgIGNhc2UgdjE2aTY0OgorICAgICAgY2FzZSB2MTZmMzI6CisgICAgICBjYXNlIG54djE2aTE6CisgICAgICBjYXNlIG54djE2aTg6CisgICAgICBjYXNlIG54djE2aTE2OgorICAgICAgY2FzZSBueHYxNmkzMjoKKyAgICAgIGNhc2Ugbnh2MTZpNjQ6CisgICAgICBjYXNlIG54djE2ZjMyOiByZXR1cm4gMTY7CisgICAgICBjYXNlIHY4aTE6CisgICAgICBjYXNlIHY4aTg6CisgICAgICBjYXNlIHY4aTE2OgorICAgICAgY2FzZSB2OGkzMjoKKyAgICAgIGNhc2UgdjhpNjQ6CisgICAgICBjYXNlIHY4ZjE2OgorICAgICAgY2FzZSB2OGYzMjoKKyAgICAgIGNhc2UgdjhmNjQ6CisgICAgICBjYXNlIG54djhpMToKKyAgICAgIGNhc2Ugbnh2OGk4OgorICAgICAgY2FzZSBueHY4aTE2OgorICAgICAgY2FzZSBueHY4aTMyOgorICAgICAgY2FzZSBueHY4aTY0OgorICAgICAgY2FzZSBueHY4ZjE2OgorICAgICAgY2FzZSBueHY4ZjMyOgorICAgICAgY2FzZSBueHY4ZjY0OiByZXR1cm4gODsKKyAgICAgIGNhc2UgdjRpMToKKyAgICAgIGNhc2UgdjRpODoKKyAgICAgIGNhc2UgdjRpMTY6CisgICAgICBjYXNlIHY0aTMyOgorICAgICAgY2FzZSB2NGk2NDoKKyAgICAgIGNhc2UgdjRmMTY6CisgICAgICBjYXNlIHY0ZjMyOgorICAgICAgY2FzZSB2NGY2NDoKKyAgICAgIGNhc2Ugbnh2NGkxOgorICAgICAgY2FzZSBueHY0aTg6CisgICAgICBjYXNlIG54djRpMTY6CisgICAgICBjYXNlIG54djRpMzI6CisgICAgICBjYXNlIG54djRpNjQ6CisgICAgICBjYXNlIG54djRmMTY6CisgICAgICBjYXNlIG54djRmMzI6CisgICAgICBjYXNlIG54djRmNjQ6IHJldHVybiA0OworICAgICAgY2FzZSB2MmkxOgorICAgICAgY2FzZSB2Mmk4OgorICAgICAgY2FzZSB2MmkxNjoKKyAgICAgIGNhc2UgdjJpMzI6CisgICAgICBjYXNlIHYyaTY0OgorICAgICAgY2FzZSB2MmYxNjoKKyAgICAgIGNhc2UgdjJmMzI6CisgICAgICBjYXNlIHYyZjY0OgorICAgICAgY2FzZSBueHYyaTE6CisgICAgICBjYXNlIG54djJpODoKKyAgICAgIGNhc2Ugbnh2MmkxNjoKKyAgICAgIGNhc2Ugbnh2MmkzMjoKKyAgICAgIGNhc2Ugbnh2Mmk2NDoKKyAgICAgIGNhc2Ugbnh2MmYxNjoKKyAgICAgIGNhc2Ugbnh2MmYzMjoKKyAgICAgIGNhc2Ugbnh2MmY2NDogcmV0dXJuIDI7CisgICAgICBjYXNlIHYxaTE6CisgICAgICBjYXNlIHYxaTg6CisgICAgICBjYXNlIHYxaTE2OgorICAgICAgY2FzZSB2MWkzMjoKKyAgICAgIGNhc2UgdjFpNjQ6CisgICAgICBjYXNlIHYxaTEyODoKKyAgICAgIGNhc2UgdjFmMzI6CisgICAgICBjYXNlIHYxZjY0OgorICAgICAgY2FzZSBueHYxaTE6CisgICAgICBjYXNlIG54djFpODoKKyAgICAgIGNhc2Ugbnh2MWkxNjoKKyAgICAgIGNhc2Ugbnh2MWkzMjoKKyAgICAgIGNhc2Ugbnh2MWk2NDoKKyAgICAgIGNhc2Ugbnh2MWYzMjoKKyAgICAgIGNhc2Ugbnh2MWY2NDogcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorCisgICAgTVZUOjpFbGVtZW50Q291bnQgZ2V0VmVjdG9yRWxlbWVudENvdW50KCkgY29uc3QgeworICAgICAgcmV0dXJuIHsgZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSwgaXNTY2FsYWJsZVZlY3RvcigpIH07CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0U2l6ZUluQml0cygpIGNvbnN0IHsKKyAgICAgIHN3aXRjaCAoU2ltcGxlVHkpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoImdldFNpemVJbkJpdHMgY2FsbGVkIG9uIGV4dGVuZGVkIE1WVC4iKTsKKyAgICAgIGNhc2UgT3RoZXI6CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlZhbHVlIHR5cGUgaXMgbm9uLXN0YW5kYXJkIHZhbHVlLCBPdGhlci4iKTsKKyAgICAgIGNhc2UgaVBUUjoKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVmFsdWUgdHlwZSBzaXplIGlzIHRhcmdldC1kZXBlbmRlbnQuIEFzayBUTEkuIik7CisgICAgICBjYXNlIGlQVFJBbnk6CisgICAgICBjYXNlIGlBbnk6CisgICAgICBjYXNlIGZBbnk6CisgICAgICBjYXNlIHZBbnk6CisgICAgICBjYXNlIEFueToKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVmFsdWUgdHlwZSBpcyBvdmVybG9hZGVkLiIpOworICAgICAgY2FzZSB0b2tlbjoKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVG9rZW4gdHlwZSBpcyBhIHNlbnRpbmVsIHRoYXQgY2Fubm90IGJlIHVzZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBjb2RlZ2VuIGFuZCBoYXMgbm8gc2l6ZSIpOworICAgICAgY2FzZSBNZXRhZGF0YToKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVmFsdWUgdHlwZSBpcyBtZXRhZGF0YS4iKTsKKyAgICAgIGNhc2UgaTE6CisgICAgICBjYXNlIHYxaTE6CisgICAgICBjYXNlIG54djFpMTogcmV0dXJuIDE7CisgICAgICBjYXNlIHYyaTE6CisgICAgICBjYXNlIG54djJpMTogcmV0dXJuIDI7CisgICAgICBjYXNlIHY0aTE6CisgICAgICBjYXNlIG54djRpMTogcmV0dXJuIDQ7CisgICAgICBjYXNlIGk4ICA6CisgICAgICBjYXNlIHYxaTg6CisgICAgICBjYXNlIHY4aTE6CisgICAgICBjYXNlIG54djFpODoKKyAgICAgIGNhc2Ugbnh2OGkxOiByZXR1cm4gODsKKyAgICAgIGNhc2UgaTE2IDoKKyAgICAgIGNhc2UgZjE2OgorICAgICAgY2FzZSB2MTZpMToKKyAgICAgIGNhc2UgdjJpODoKKyAgICAgIGNhc2UgdjFpMTY6CisgICAgICBjYXNlIG54djE2aTE6CisgICAgICBjYXNlIG54djJpODoKKyAgICAgIGNhc2Ugbnh2MWkxNjogcmV0dXJuIDE2OworICAgICAgY2FzZSBmMzIgOgorICAgICAgY2FzZSBpMzIgOgorICAgICAgY2FzZSB2MzJpMToKKyAgICAgIGNhc2UgdjRpODoKKyAgICAgIGNhc2UgdjJpMTY6CisgICAgICBjYXNlIHYyZjE2OgorICAgICAgY2FzZSB2MWYzMjoKKyAgICAgIGNhc2UgdjFpMzI6CisgICAgICBjYXNlIG54djMyaTE6CisgICAgICBjYXNlIG54djRpODoKKyAgICAgIGNhc2Ugbnh2MmkxNjoKKyAgICAgIGNhc2Ugbnh2MWkzMjoKKyAgICAgIGNhc2Ugbnh2MmYxNjoKKyAgICAgIGNhc2Ugbnh2MWYzMjogcmV0dXJuIDMyOworICAgICAgY2FzZSB4ODZtbXg6CisgICAgICBjYXNlIGY2NCA6CisgICAgICBjYXNlIGk2NCA6CisgICAgICBjYXNlIHY2NGkxOgorICAgICAgY2FzZSB2OGk4OgorICAgICAgY2FzZSB2NGkxNjoKKyAgICAgIGNhc2UgdjJpMzI6CisgICAgICBjYXNlIHYxaTY0OgorICAgICAgY2FzZSB2NGYxNjoKKyAgICAgIGNhc2UgdjJmMzI6CisgICAgICBjYXNlIHYxZjY0OgorICAgICAgY2FzZSBueHY4aTg6CisgICAgICBjYXNlIG54djRpMTY6CisgICAgICBjYXNlIG54djJpMzI6CisgICAgICBjYXNlIG54djFpNjQ6CisgICAgICBjYXNlIG54djRmMTY6CisgICAgICBjYXNlIG54djJmMzI6CisgICAgICBjYXNlIG54djFmNjQ6IHJldHVybiA2NDsKKyAgICAgIGNhc2UgZjgwIDogIHJldHVybiA4MDsKKyAgICAgIGNhc2UgZjEyODoKKyAgICAgIGNhc2UgcHBjZjEyODoKKyAgICAgIGNhc2UgaTEyODoKKyAgICAgIGNhc2UgdjEyOGkxOgorICAgICAgY2FzZSB2MTZpODoKKyAgICAgIGNhc2UgdjhpMTY6CisgICAgICBjYXNlIHY0aTMyOgorICAgICAgY2FzZSB2Mmk2NDoKKyAgICAgIGNhc2UgdjFpMTI4OgorICAgICAgY2FzZSB2OGYxNjoKKyAgICAgIGNhc2UgdjRmMzI6CisgICAgICBjYXNlIHYyZjY0OgorICAgICAgY2FzZSBueHYxNmk4OgorICAgICAgY2FzZSBueHY4aTE2OgorICAgICAgY2FzZSBueHY0aTMyOgorICAgICAgY2FzZSBueHYyaTY0OgorICAgICAgY2FzZSBueHY4ZjE2OgorICAgICAgY2FzZSBueHY0ZjMyOgorICAgICAgY2FzZSBueHYyZjY0OiByZXR1cm4gMTI4OworICAgICAgY2FzZSB2MzJpODoKKyAgICAgIGNhc2UgdjE2aTE2OgorICAgICAgY2FzZSB2OGkzMjoKKyAgICAgIGNhc2UgdjRpNjQ6CisgICAgICBjYXNlIHY4ZjMyOgorICAgICAgY2FzZSB2NGY2NDoKKyAgICAgIGNhc2Ugbnh2MzJpODoKKyAgICAgIGNhc2Ugbnh2MTZpMTY6CisgICAgICBjYXNlIG54djhpMzI6CisgICAgICBjYXNlIG54djRpNjQ6CisgICAgICBjYXNlIG54djhmMzI6CisgICAgICBjYXNlIG54djRmNjQ6IHJldHVybiAyNTY7CisgICAgICBjYXNlIHY1MTJpMToKKyAgICAgIGNhc2UgdjY0aTg6CisgICAgICBjYXNlIHYzMmkxNjoKKyAgICAgIGNhc2UgdjE2aTMyOgorICAgICAgY2FzZSB2OGk2NDoKKyAgICAgIGNhc2UgdjE2ZjMyOgorICAgICAgY2FzZSB2OGY2NDoKKyAgICAgIGNhc2Ugbnh2MzJpMTY6CisgICAgICBjYXNlIG54djE2aTMyOgorICAgICAgY2FzZSBueHY4aTY0OgorICAgICAgY2FzZSBueHYxNmYzMjoKKyAgICAgIGNhc2Ugbnh2OGY2NDogcmV0dXJuIDUxMjsKKyAgICAgIGNhc2UgdjEwMjRpMToKKyAgICAgIGNhc2UgdjEyOGk4OgorICAgICAgY2FzZSB2NjRpMTY6CisgICAgICBjYXNlIHYzMmkzMjoKKyAgICAgIGNhc2UgdjE2aTY0OgorICAgICAgY2FzZSBueHYzMmkzMjoKKyAgICAgIGNhc2Ugbnh2MTZpNjQ6IHJldHVybiAxMDI0OworICAgICAgY2FzZSB2MjU2aTg6CisgICAgICBjYXNlIHYxMjhpMTY6CisgICAgICBjYXNlIHY2NGkzMjoKKyAgICAgIGNhc2UgdjMyaTY0OgorICAgICAgY2FzZSBueHYzMmk2NDogcmV0dXJuIDIwNDg7CisgICAgICBjYXNlIEV4Y2VwdFJlZjogcmV0dXJuIDA7IC8vIG9wYXF1ZSB0eXBlCisgICAgICB9CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0U2NhbGFyU2l6ZUluQml0cygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRTY2FsYXJUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBvdmVyd3JpdHRlbiBieSBhIHN0b3JlIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUKKyAgICAvLy8gdHlwZS4KKyAgICB1bnNpZ25lZCBnZXRTdG9yZVNpemUoKSBjb25zdCB7CisgICAgICByZXR1cm4gKGdldFNpemVJbkJpdHMoKSArIDcpIC8gODsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBvdmVyd3JpdHRlbiBieSBhIHN0b3JlIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUKKyAgICAvLy8gdHlwZS4KKyAgICB1bnNpZ25lZCBnZXRTdG9yZVNpemVJbkJpdHMoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0U3RvcmVTaXplKCkgKiA4OworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGhhcyBtb3JlIGJpdHMgdGhhbiBWVC4KKyAgICBib29sIGJpdHNHVChNVlQgVlQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRTaXplSW5CaXRzKCkgPiBWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaGFzIG5vIGxlc3MgYml0cyB0aGFuIFZULgorICAgIGJvb2wgYml0c0dFKE1WVCBWVCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFNpemVJbkJpdHMoKSA+PSBWVC5nZXRTaXplSW5CaXRzKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaGFzIGxlc3MgYml0cyB0aGFuIFZULgorICAgIGJvb2wgYml0c0xUKE1WVCBWVCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFNpemVJbkJpdHMoKSA8IFZULmdldFNpemVJbkJpdHMoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBoYXMgbm8gbW9yZSBiaXRzIHRoYW4gVlQuCisgICAgYm9vbCBiaXRzTEUoTVZUIFZUKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0U2l6ZUluQml0cygpIDw9IFZULmdldFNpemVJbkJpdHMoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgTVZUIGdldEZsb2F0aW5nUG9pbnRWVCh1bnNpZ25lZCBCaXRXaWR0aCkgeworICAgICAgc3dpdGNoIChCaXRXaWR0aCkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiQmFkIGJpdCB3aWR0aCEiKTsKKyAgICAgIGNhc2UgMTY6CisgICAgICAgIHJldHVybiBNVlQ6OmYxNjsKKyAgICAgIGNhc2UgMzI6CisgICAgICAgIHJldHVybiBNVlQ6OmYzMjsKKyAgICAgIGNhc2UgNjQ6CisgICAgICAgIHJldHVybiBNVlQ6OmY2NDsKKyAgICAgIGNhc2UgODA6CisgICAgICAgIHJldHVybiBNVlQ6OmY4MDsKKyAgICAgIGNhc2UgMTI4OgorICAgICAgICByZXR1cm4gTVZUOjpmMTI4OworICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBNVlQgZ2V0SW50ZWdlclZUKHVuc2lnbmVkIEJpdFdpZHRoKSB7CisgICAgICBzd2l0Y2ggKEJpdFdpZHRoKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gKE1WVDo6U2ltcGxlVmFsdWVUeXBlKShNVlQ6OklOVkFMSURfU0lNUExFX1ZBTFVFX1RZUEUpOworICAgICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gTVZUOjppMTsKKyAgICAgIGNhc2UgODoKKyAgICAgICAgcmV0dXJuIE1WVDo6aTg7CisgICAgICBjYXNlIDE2OgorICAgICAgICByZXR1cm4gTVZUOjppMTY7CisgICAgICBjYXNlIDMyOgorICAgICAgICByZXR1cm4gTVZUOjppMzI7CisgICAgICBjYXNlIDY0OgorICAgICAgICByZXR1cm4gTVZUOjppNjQ7CisgICAgICBjYXNlIDEyODoKKyAgICAgICAgcmV0dXJuIE1WVDo6aTEyODsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgTVZUIGdldFZlY3RvclZUKE1WVCBWVCwgdW5zaWduZWQgTnVtRWxlbWVudHMpIHsKKyAgICAgIHN3aXRjaCAoVlQuU2ltcGxlVHkpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNVlQ6OmkxOgorICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMSkgICAgcmV0dXJuIE1WVDo6djFpMTsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDIpICAgIHJldHVybiBNVlQ6OnYyaTE7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA0KSAgICByZXR1cm4gTVZUOjp2NGkxOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gOCkgICAgcmV0dXJuIE1WVDo6djhpMTsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDE2KSAgIHJldHVybiBNVlQ6OnYxNmkxOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMzIpICAgcmV0dXJuIE1WVDo6djMyaTE7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA2NCkgICByZXR1cm4gTVZUOjp2NjRpMTsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDEyOCkgIHJldHVybiBNVlQ6OnYxMjhpMTsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDUxMikgIHJldHVybiBNVlQ6OnY1MTJpMTsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDEwMjQpIHJldHVybiBNVlQ6OnYxMDI0aTE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNVlQ6Omk4OgorICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMSkgICByZXR1cm4gTVZUOjp2MWk4OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMikgICByZXR1cm4gTVZUOjp2Mmk4OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gNCkgICByZXR1cm4gTVZUOjp2NGk4OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gOCkgICByZXR1cm4gTVZUOjp2OGk4OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMTYpICByZXR1cm4gTVZUOjp2MTZpODsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDMyKSAgcmV0dXJuIE1WVDo6djMyaTg7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA2NCkgIHJldHVybiBNVlQ6OnY2NGk4OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMTI4KSByZXR1cm4gTVZUOjp2MTI4aTg7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAyNTYpIHJldHVybiBNVlQ6OnYyNTZpODsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1WVDo6aTE2OgorICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMSkgICByZXR1cm4gTVZUOjp2MWkxNjsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDIpICAgcmV0dXJuIE1WVDo6djJpMTY7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA0KSAgIHJldHVybiBNVlQ6OnY0aTE2OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gOCkgICByZXR1cm4gTVZUOjp2OGkxNjsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDE2KSAgcmV0dXJuIE1WVDo6djE2aTE2OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMzIpICByZXR1cm4gTVZUOjp2MzJpMTY7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA2NCkgIHJldHVybiBNVlQ6OnY2NGkxNjsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDEyOCkgcmV0dXJuIE1WVDo6djEyOGkxNjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1WVDo6aTMyOgorICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMSkgIHJldHVybiBNVlQ6OnYxaTMyOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMikgIHJldHVybiBNVlQ6OnYyaTMyOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gNCkgIHJldHVybiBNVlQ6OnY0aTMyOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gOCkgIHJldHVybiBNVlQ6OnY4aTMyOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMTYpIHJldHVybiBNVlQ6OnYxNmkzMjsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDMyKSByZXR1cm4gTVZUOjp2MzJpMzI7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA2NCkgcmV0dXJuIE1WVDo6djY0aTMyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjppNjQ6CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxKSAgcmV0dXJuIE1WVDo6djFpNjQ7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAyKSAgcmV0dXJuIE1WVDo6djJpNjQ7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA0KSAgcmV0dXJuIE1WVDo6djRpNjQ7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA4KSAgcmV0dXJuIE1WVDo6djhpNjQ7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxNikgcmV0dXJuIE1WVDo6djE2aTY0OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMzIpIHJldHVybiBNVlQ6OnYzMmk2NDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1WVDo6aTEyODoKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDEpICByZXR1cm4gTVZUOjp2MWkxMjg7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNVlQ6OmYxNjoKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDIpICByZXR1cm4gTVZUOjp2MmYxNjsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDQpICByZXR1cm4gTVZUOjp2NGYxNjsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDgpICByZXR1cm4gTVZUOjp2OGYxNjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1WVDo6ZjMyOgorICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMSkgIHJldHVybiBNVlQ6OnYxZjMyOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMikgIHJldHVybiBNVlQ6OnYyZjMyOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gNCkgIHJldHVybiBNVlQ6OnY0ZjMyOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gOCkgIHJldHVybiBNVlQ6OnY4ZjMyOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMTYpIHJldHVybiBNVlQ6OnYxNmYzMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1WVDo6ZjY0OgorICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMSkgIHJldHVybiBNVlQ6OnYxZjY0OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMikgIHJldHVybiBNVlQ6OnYyZjY0OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gNCkgIHJldHVybiBNVlQ6OnY0ZjY0OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gOCkgIHJldHVybiBNVlQ6OnY4ZjY0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHJldHVybiAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpKE1WVDo6SU5WQUxJRF9TSU1QTEVfVkFMVUVfVFlQRSk7CisgICAgfQorCisgICAgc3RhdGljIE1WVCBnZXRTY2FsYWJsZVZlY3RvclZUKE1WVCBWVCwgdW5zaWduZWQgTnVtRWxlbWVudHMpIHsKKyAgICAgIHN3aXRjaChWVC5TaW1wbGVUeSkgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1WVDo6aTE6CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDEpICByZXR1cm4gTVZUOjpueHYxaTE7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDIpICByZXR1cm4gTVZUOjpueHYyaTE7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDQpICByZXR1cm4gTVZUOjpueHY0aTE7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDgpICByZXR1cm4gTVZUOjpueHY4aTE7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDE2KSByZXR1cm4gTVZUOjpueHYxNmkxOworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAzMikgcmV0dXJuIE1WVDo6bnh2MzJpMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVlQ6Omk4OgorICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxKSAgcmV0dXJuIE1WVDo6bnh2MWk4OworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAyKSAgcmV0dXJuIE1WVDo6bnh2Mmk4OworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA0KSAgcmV0dXJuIE1WVDo6bnh2NGk4OworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA4KSAgcmV0dXJuIE1WVDo6bnh2OGk4OworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxNikgcmV0dXJuIE1WVDo6bnh2MTZpODsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMzIpIHJldHVybiBNVlQ6Om54djMyaTg7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVZUOjppMTY6CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDEpICByZXR1cm4gTVZUOjpueHYxaTE2OworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAyKSAgcmV0dXJuIE1WVDo6bnh2MmkxNjsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gNCkgIHJldHVybiBNVlQ6Om54djRpMTY7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDgpICByZXR1cm4gTVZUOjpueHY4aTE2OworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxNikgcmV0dXJuIE1WVDo6bnh2MTZpMTY7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDMyKSByZXR1cm4gTVZUOjpueHYzMmkxNjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVlQ6OmkzMjoKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMSkgIHJldHVybiBNVlQ6Om54djFpMzI7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDIpICByZXR1cm4gTVZUOjpueHYyaTMyOworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA0KSAgcmV0dXJuIE1WVDo6bnh2NGkzMjsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gOCkgIHJldHVybiBNVlQ6Om54djhpMzI7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDE2KSByZXR1cm4gTVZUOjpueHYxNmkzMjsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMzIpIHJldHVybiBNVlQ6Om54djMyaTMyOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1WVDo6aTY0OgorICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxKSAgcmV0dXJuIE1WVDo6bnh2MWk2NDsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMikgIHJldHVybiBNVlQ6Om54djJpNjQ7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDQpICByZXR1cm4gTVZUOjpueHY0aTY0OworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA4KSAgcmV0dXJuIE1WVDo6bnh2OGk2NDsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMTYpIHJldHVybiBNVlQ6Om54djE2aTY0OworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAzMikgcmV0dXJuIE1WVDo6bnh2MzJpNjQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVZUOjpmMTY6CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDIpICByZXR1cm4gTVZUOjpueHYyZjE2OworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA0KSAgcmV0dXJuIE1WVDo6bnh2NGYxNjsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gOCkgIHJldHVybiBNVlQ6Om54djhmMTY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVZUOjpmMzI6CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDEpICByZXR1cm4gTVZUOjpueHYxZjMyOworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAyKSAgcmV0dXJuIE1WVDo6bnh2MmYzMjsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gNCkgIHJldHVybiBNVlQ6Om54djRmMzI7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDgpICByZXR1cm4gTVZUOjpueHY4ZjMyOworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxNikgcmV0dXJuIE1WVDo6bnh2MTZmMzI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVZUOjpmNjQ6CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDEpICByZXR1cm4gTVZUOjpueHYxZjY0OworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAyKSAgcmV0dXJuIE1WVDo6bnh2MmY2NDsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gNCkgIHJldHVybiBNVlQ6Om54djRmNjQ7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDgpICByZXR1cm4gTVZUOjpueHY4ZjY0OworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dXJuIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSkoTVZUOjpJTlZBTElEX1NJTVBMRV9WQUxVRV9UWVBFKTsKKyAgICB9CisKKyAgICBzdGF0aWMgTVZUIGdldFZlY3RvclZUKE1WVCBWVCwgdW5zaWduZWQgTnVtRWxlbWVudHMsIGJvb2wgSXNTY2FsYWJsZSkgeworICAgICAgaWYgKElzU2NhbGFibGUpCisgICAgICAgIHJldHVybiBnZXRTY2FsYWJsZVZlY3RvclZUKFZULCBOdW1FbGVtZW50cyk7CisgICAgICByZXR1cm4gZ2V0VmVjdG9yVlQoVlQsIE51bUVsZW1lbnRzKTsKKyAgICB9CisKKyAgICBzdGF0aWMgTVZUIGdldFZlY3RvclZUKE1WVCBWVCwgTVZUOjpFbGVtZW50Q291bnQgRUMpIHsKKyAgICAgIGlmIChFQy5TY2FsYWJsZSkKKyAgICAgICAgcmV0dXJuIGdldFNjYWxhYmxlVmVjdG9yVlQoVlQsIEVDLk1pbik7CisgICAgICByZXR1cm4gZ2V0VmVjdG9yVlQoVlQsIEVDLk1pbik7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgdmFsdWUgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4gIFRoaXMgcmV0dXJucworICAgIC8vLyBhbGwgcG9pbnRlcnMgYXMgaVBUUi4gIElmIEhhbmRsZVVua25vd24gaXMgdHJ1ZSwgdW5rbm93biB0eXBlcyBhcmUKKyAgICAvLy8gcmV0dXJuZWQgYXMgT3RoZXIsIG90aGVyd2lzZSB0aGV5IGFyZSBpbnZhbGlkLgorICAgIHN0YXRpYyBNVlQgZ2V0VlQoVHlwZSAqVHksIGJvb2wgSGFuZGxlVW5rbm93biA9IGZhbHNlKTsKKworICBwcml2YXRlOgorICAgIC8vLyBBIHNpbXBsZSBpdGVyYXRvciBvdmVyIHRoZSBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBlbnVtLgorICAgIHN0cnVjdCBtdnRfaXRlcmF0b3IgeworICAgICAgU2ltcGxlVmFsdWVUeXBlIFZUOworCisgICAgICBtdnRfaXRlcmF0b3IoU2ltcGxlVmFsdWVUeXBlIFZUKSA6IFZUKFZUKSB7fQorCisgICAgICBNVlQgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gVlQ7IH0KKyAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBtdnRfaXRlcmF0b3IgJkxIUykgY29uc3QgeyByZXR1cm4gVlQgIT0gTEhTLlZUOyB9CisKKyAgICAgIG12dF9pdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKKyAgICAgICAgVlQgPSAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpKChpbnQpVlQgKyAxKTsKKyAgICAgICAgYXNzZXJ0KChpbnQpVlQgPD0gTVZUOjpNQVhfQUxMT1dFRF9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgICAgICJNVlQgaXRlcmF0b3Igb3ZlcmZsb3dlZC4iKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH07CisKKyAgICAvLy8gQSByYW5nZSBvZiB0aGUgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgZW51bS4KKyAgICB1c2luZyBtdnRfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxtdnRfaXRlcmF0b3I+OworCisgIHB1YmxpYzoKKyAgICAvLy8gU2ltcGxlVmFsdWVUeXBlIEl0ZXJhdGlvbgorICAgIC8vLyBAeworICAgIHN0YXRpYyBtdnRfcmFuZ2UgYWxsX3ZhbHVldHlwZXMoKSB7CisgICAgICByZXR1cm4gbXZ0X3JhbmdlKE1WVDo6RklSU1RfVkFMVUVUWVBFLCBNVlQ6OkxBU1RfVkFMVUVUWVBFKTsKKyAgICB9CisKKyAgICBzdGF0aWMgbXZ0X3JhbmdlIGludGVnZXJfdmFsdWV0eXBlcygpIHsKKyAgICAgIHJldHVybiBtdnRfcmFuZ2UoTVZUOjpGSVJTVF9JTlRFR0VSX1ZBTFVFVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKShNVlQ6OkxBU1RfSU5URUdFUl9WQUxVRVRZUEUgKyAxKSk7CisgICAgfQorCisgICAgc3RhdGljIG12dF9yYW5nZSBmcF92YWx1ZXR5cGVzKCkgeworICAgICAgcmV0dXJuIG12dF9yYW5nZShNVlQ6OkZJUlNUX0ZQX1ZBTFVFVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKShNVlQ6OkxBU1RfRlBfVkFMVUVUWVBFICsgMSkpOworICAgIH0KKworICAgIHN0YXRpYyBtdnRfcmFuZ2UgdmVjdG9yX3ZhbHVldHlwZXMoKSB7CisgICAgICByZXR1cm4gbXZ0X3JhbmdlKE1WVDo6RklSU1RfVkVDVE9SX1ZBTFVFVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKShNVlQ6OkxBU1RfVkVDVE9SX1ZBTFVFVFlQRSArIDEpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgbXZ0X3JhbmdlIGludGVnZXJfdmVjdG9yX3ZhbHVldHlwZXMoKSB7CisgICAgICByZXR1cm4gbXZ0X3JhbmdlKAorICAgICAgICAgIE1WVDo6RklSU1RfSU5URUdFUl9WRUNUT1JfVkFMVUVUWVBFLAorICAgICAgICAgIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSkoTVZUOjpMQVNUX0lOVEVHRVJfVkVDVE9SX1ZBTFVFVFlQRSArIDEpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgbXZ0X3JhbmdlIGZwX3ZlY3Rvcl92YWx1ZXR5cGVzKCkgeworICAgICAgcmV0dXJuIG12dF9yYW5nZSgKKyAgICAgICAgICBNVlQ6OkZJUlNUX0ZQX1ZFQ1RPUl9WQUxVRVRZUEUsCisgICAgICAgICAgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKShNVlQ6OkxBU1RfRlBfVkVDVE9SX1ZBTFVFVFlQRSArIDEpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgbXZ0X3JhbmdlIGludGVnZXJfc2NhbGFibGVfdmVjdG9yX3ZhbHVldHlwZXMoKSB7CisgICAgICByZXR1cm4gbXZ0X3JhbmdlKE1WVDo6RklSU1RfSU5URUdFUl9TQ0FMQUJMRV9WQUxVRVRZUEUsCisgICAgICAgICAgICAgIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSkoTVZUOjpMQVNUX0lOVEVHRVJfU0NBTEFCTEVfVkFMVUVUWVBFICsgMSkpOworICAgIH0KKworICAgIHN0YXRpYyBtdnRfcmFuZ2UgZnBfc2NhbGFibGVfdmVjdG9yX3ZhbHVldHlwZXMoKSB7CisgICAgICByZXR1cm4gbXZ0X3JhbmdlKE1WVDo6RklSU1RfRlBfU0NBTEFCTEVfVkFMVUVUWVBFLAorICAgICAgICAgICAgICAgICAgIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSkoTVZUOjpMQVNUX0ZQX1NDQUxBQkxFX1ZBTFVFVFlQRSArIDEpKTsKKyAgICB9CisgICAgLy8vIEB9CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUFDSElORVZBTFVFVFlQRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWFuYWdlZFN0YXRpYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01hbmFnZWRTdGF0aWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGJmMzIxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01hbmFnZWRTdGF0aWMuaApAQCAtMCwwICsxLDk3IEBACisvLz09PS0tIGxsdm0vU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmggLSBTdGF0aWMgR2xvYmFsIHdyYXBwZXIgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNYW5hZ2VkU3RhdGljIGNsYXNzIGFuZCB0aGUgbGx2bV9zaHV0ZG93bigpIGZ1bmN0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX01BTkFHRURTVEFUSUNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfTUFOQUdFRFNUQVRJQ19ICisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gb2JqZWN0X2NyZWF0b3IgLSBIZWxwZXIgbWV0aG9kIGZvciBNYW5hZ2VkU3RhdGljLgordGVtcGxhdGUgPGNsYXNzIEM+IHN0cnVjdCBvYmplY3RfY3JlYXRvciB7CisgIHN0YXRpYyB2b2lkICpjYWxsKCkgeyByZXR1cm4gbmV3IEMoKTsgfQorfTsKKworLy8vIG9iamVjdF9kZWxldGVyIC0gSGVscGVyIG1ldGhvZCBmb3IgTWFuYWdlZFN0YXRpYy4KKy8vLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBvYmplY3RfZGVsZXRlciB7CisgIHN0YXRpYyB2b2lkIGNhbGwodm9pZCAqUHRyKSB7IGRlbGV0ZSAoVCAqKVB0cjsgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4gc3RydWN0IG9iamVjdF9kZWxldGVyPFRbTl0+IHsKKyAgc3RhdGljIHZvaWQgY2FsbCh2b2lkICpQdHIpIHsgZGVsZXRlW10oVCAqKVB0cjsgfQorfTsKKworLy8vIE1hbmFnZWRTdGF0aWNCYXNlIC0gQ29tbW9uIGJhc2UgY2xhc3MgZm9yIE1hbmFnZWRTdGF0aWMgaW5zdGFuY2VzLgorY2xhc3MgTWFuYWdlZFN0YXRpY0Jhc2UgeworcHJvdGVjdGVkOgorICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgYXMgYSBzdGF0aWMgdmFyaWFibGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhhdCB0aGlzCisgIC8vIHdpbGwgYmUgemVybyBpbml0aWFsaXplZC4KKyAgbXV0YWJsZSBzdGQ6OmF0b21pYzx2b2lkICo+IFB0cjsKKyAgbXV0YWJsZSB2b2lkICgqRGVsZXRlckZuKSh2b2lkKik7CisgIG11dGFibGUgY29uc3QgTWFuYWdlZFN0YXRpY0Jhc2UgKk5leHQ7CisKKyAgdm9pZCBSZWdpc3Rlck1hbmFnZWRTdGF0aWModm9pZCAqKCpjcmVhdG9yKSgpLCB2b2lkICgqZGVsZXRlcikodm9pZCopKSBjb25zdDsKKworcHVibGljOgorICAvLy8gaXNDb25zdHJ1Y3RlZCAtIFJldHVybiB0cnVlIGlmIHRoaXMgb2JqZWN0IGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC4KKyAgYm9vbCBpc0NvbnN0cnVjdGVkKCkgY29uc3QgeyByZXR1cm4gUHRyICE9IG51bGxwdHI7IH0KKworICB2b2lkIGRlc3Ryb3koKSBjb25zdDsKK307CisKKy8vLyBNYW5hZ2VkU3RhdGljIC0gVGhpcyB0cmFuc3BhcmVudGx5IGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mIGdsb2JhbCBzdGF0aWNzIHRvCisvLy8gYmUgbGF6aWx5IGNvbnN0cnVjdGVkIG9uIGRlbWFuZCAoZ29vZCBmb3IgcmVkdWNpbmcgc3RhcnR1cCB0aW1lcyBvZiBkeW5hbWljCisvLy8gbGlicmFyaWVzIHRoYXQgbGluayBpbiBMTFZNIGNvbXBvbmVudHMpIGFuZCBmb3IgbWFraW5nIGRlc3RydWN0aW9uIGJlCisvLy8gZXhwbGljaXQgdGhyb3VnaCB0aGUgbGx2bV9zaHV0ZG93bigpIGZ1bmN0aW9uIGNhbGwuCisvLy8KK3RlbXBsYXRlIDxjbGFzcyBDLCBjbGFzcyBDcmVhdG9yID0gb2JqZWN0X2NyZWF0b3I8Qz4sCisgICAgICAgICAgY2xhc3MgRGVsZXRlciA9IG9iamVjdF9kZWxldGVyPEM+PgorY2xhc3MgTWFuYWdlZFN0YXRpYyA6IHB1YmxpYyBNYW5hZ2VkU3RhdGljQmFzZSB7CitwdWJsaWM6CisgIC8vIEFjY2Vzc29ycy4KKyAgQyAmb3BlcmF0b3IqKCkgeworICAgIHZvaWQgKlRtcCA9IFB0ci5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAgIGlmICghVG1wKQorICAgICAgUmVnaXN0ZXJNYW5hZ2VkU3RhdGljKENyZWF0b3I6OmNhbGwsIERlbGV0ZXI6OmNhbGwpOworCisgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxDICo+KFB0ci5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpKTsKKyAgfQorCisgIEMgKm9wZXJhdG9yLT4oKSB7IHJldHVybiAmKip0aGlzOyB9CisKKyAgY29uc3QgQyAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHZvaWQgKlRtcCA9IFB0ci5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAgIGlmICghVG1wKQorICAgICAgUmVnaXN0ZXJNYW5hZ2VkU3RhdGljKENyZWF0b3I6OmNhbGwsIERlbGV0ZXI6OmNhbGwpOworCisgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxDICo+KFB0ci5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpKTsKKyAgfQorCisgIGNvbnN0IEMgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmKip0aGlzOyB9Cit9OworCisvLy8gbGx2bV9zaHV0ZG93biAtIERlYWxsb2NhdGUgYW5kIGRlc3Ryb3kgYWxsIE1hbmFnZWRTdGF0aWMgdmFyaWFibGVzLgordm9pZCBsbHZtX3NodXRkb3duKCk7CisKKy8vLyBsbHZtX3NodXRkb3duX29iaiAtIFRoaXMgaXMgYSBzaW1wbGUgaGVscGVyIGNsYXNzIHRoYXQgY2FsbHMKKy8vLyBsbHZtX3NodXRkb3duKCkgd2hlbiBpdCBpcyBkZXN0cm95ZWQuCitzdHJ1Y3QgbGx2bV9zaHV0ZG93bl9vYmogeworICBsbHZtX3NodXRkb3duX29iaigpID0gZGVmYXVsdDsKKyAgfmxsdm1fc2h1dGRvd25fb2JqKCkgeyBsbHZtX3NodXRkb3duKCk7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfTUFOQUdFRFNUQVRJQ19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzdhMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaApAQCAtMCwwICsxLDg0NiBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIC0gVXNlZnVsIG1hdGggZnVuY3Rpb25zIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgc29tZSBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZnVsIGZvciBtYXRoIHN0dWZmLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX01BVEhFWFRSQVNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfTUFUSEVYVFJBU19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU3dhcEJ5dGVPcmRlci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPGludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0FORFJPSURfTkRLX18KKyNpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBsbHZtIHsKKy8vLyBcYnJpZWYgVGhlIGJlaGF2aW9yIGFuIG9wZXJhdGlvbiBoYXMgb24gYW4gaW5wdXQgb2YgMC4KK2VudW0gWmVyb0JlaGF2aW9yIHsKKyAgLy8vIFxicmllZiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgdW5kZWZpbmVkLgorICBaQl9VbmRlZmluZWQsCisgIC8vLyBcYnJpZWYgVGhlIHJldHVybmVkIHZhbHVlIGlzIG51bWVyaWNfbGltaXRzPFQ+OjptYXgoKQorICBaQl9NYXgsCisgIC8vLyBcYnJpZWYgVGhlIHJldHVybmVkIHZhbHVlIGlzIG51bWVyaWNfbGltaXRzPFQ+OjpkaWdpdHMKKyAgWkJfV2lkdGgKK307CisKK25hbWVzcGFjZSBkZXRhaWwgewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IFNpemVPZlQ+IHN0cnVjdCBUcmFpbGluZ1plcm9zQ291bnRlciB7CisgIHN0YXRpYyBzdGQ6OnNpemVfdCBjb3VudChUIFZhbCwgWmVyb0JlaGF2aW9yKSB7CisgICAgaWYgKCFWYWwpCisgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6ZGlnaXRzOworICAgIGlmIChWYWwgJiAweDEpCisgICAgICByZXR1cm4gMDsKKworICAgIC8vIEJpc2VjdGlvbiBtZXRob2QuCisgICAgc3RkOjpzaXplX3QgWmVyb0JpdHMgPSAwOworICAgIFQgU2hpZnQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjpkaWdpdHMgPj4gMTsKKyAgICBUIE1hc2sgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSA+PiBTaGlmdDsKKyAgICB3aGlsZSAoU2hpZnQpIHsKKyAgICAgIGlmICgoVmFsICYgTWFzaykgPT0gMCkgeworICAgICAgICBWYWwgPj49IFNoaWZ0OworICAgICAgICBaZXJvQml0cyB8PSBTaGlmdDsKKyAgICAgIH0KKyAgICAgIFNoaWZ0ID4+PSAxOworICAgICAgTWFzayA+Pj0gU2hpZnQ7CisgICAgfQorICAgIHJldHVybiBaZXJvQml0czsKKyAgfQorfTsKKworI2lmIF9fR05VQ19fID49IDQgfHwgZGVmaW5lZChfTVNDX1ZFUikKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgVHJhaWxpbmdaZXJvc0NvdW50ZXI8VCwgND4geworICBzdGF0aWMgc3RkOjpzaXplX3QgY291bnQoVCBWYWwsIFplcm9CZWhhdmlvciBaQikgeworICAgIGlmIChaQiAhPSBaQl9VbmRlZmluZWQgJiYgVmFsID09IDApCisgICAgICByZXR1cm4gMzI7CisKKyNpZiBfX2hhc19idWlsdGluKF9fYnVpbHRpbl9jdHopIHx8IExMVk1fR05VQ19QUkVSRVEoNCwgMCwgMCkKKyAgICByZXR1cm4gX19idWlsdGluX2N0eihWYWwpOworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICB1bnNpZ25lZCBsb25nIEluZGV4OworICAgIF9CaXRTY2FuRm9yd2FyZCgmSW5kZXgsIFZhbCk7CisgICAgcmV0dXJuIEluZGV4OworI2VuZGlmCisgIH0KK307CisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfTV9YNjQpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFRyYWlsaW5nWmVyb3NDb3VudGVyPFQsIDg+IHsKKyAgc3RhdGljIHN0ZDo6c2l6ZV90IGNvdW50KFQgVmFsLCBaZXJvQmVoYXZpb3IgWkIpIHsKKyAgICBpZiAoWkIgIT0gWkJfVW5kZWZpbmVkICYmIFZhbCA9PSAwKQorICAgICAgcmV0dXJuIDY0OworCisjaWYgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fY3R6bGwpIHx8IExMVk1fR05VQ19QUkVSRVEoNCwgMCwgMCkKKyAgICByZXR1cm4gX19idWlsdGluX2N0emxsKFZhbCk7CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAgIHVuc2lnbmVkIGxvbmcgSW5kZXg7CisgICAgX0JpdFNjYW5Gb3J3YXJkNjQoJkluZGV4LCBWYWwpOworICAgIHJldHVybiBJbmRleDsKKyNlbmRpZgorICB9Cit9OworI2VuZGlmCisjZW5kaWYKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorCisvLy8gXGJyaWVmIENvdW50IG51bWJlciBvZiAwJ3MgZnJvbSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHRoZSBtb3N0CisvLy8gICBzdG9wcGluZyBhdCB0aGUgZmlyc3QgMS4KKy8vLworLy8vIE9ubHkgdW5zaWduZWQgaW50ZWdyYWwgdHlwZXMgYXJlIGFsbG93ZWQuCisvLy8KKy8vLyBccGFyYW0gWkIgdGhlIGJlaGF2aW9yIG9uIGFuIGlucHV0IG9mIDAuIE9ubHkgWkJfV2lkdGggYW5kIFpCX1VuZGVmaW5lZCBhcmUKKy8vLyAgIHZhbGlkIGFyZ3VtZW50cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzaXplX3QgY291bnRUcmFpbGluZ1plcm9zKFQgVmFsLCBaZXJvQmVoYXZpb3IgWkIgPSBaQl9XaWR0aCkgeworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2ludGVnZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgIXN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCwKKyAgICAgICAgICAgICAgICAiT25seSB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBhcmUgYWxsb3dlZC4iKTsKKyAgcmV0dXJuIGxsdm06OmRldGFpbDo6VHJhaWxpbmdaZXJvc0NvdW50ZXI8VCwgc2l6ZW9mKFQpPjo6Y291bnQoVmFsLCBaQik7Cit9CisKK25hbWVzcGFjZSBkZXRhaWwgewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IFNpemVPZlQ+IHN0cnVjdCBMZWFkaW5nWmVyb3NDb3VudGVyIHsKKyAgc3RhdGljIHN0ZDo6c2l6ZV90IGNvdW50KFQgVmFsLCBaZXJvQmVoYXZpb3IpIHsKKyAgICBpZiAoIVZhbCkKKyAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjpkaWdpdHM7CisKKyAgICAvLyBCaXNlY3Rpb24gbWV0aG9kLgorICAgIHN0ZDo6c2l6ZV90IFplcm9CaXRzID0gMDsKKyAgICBmb3IgKFQgU2hpZnQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjpkaWdpdHMgPj4gMTsgU2hpZnQ7IFNoaWZ0ID4+PSAxKSB7CisgICAgICBUIFRtcCA9IFZhbCA+PiBTaGlmdDsKKyAgICAgIGlmIChUbXApCisgICAgICAgIFZhbCA9IFRtcDsKKyAgICAgIGVsc2UKKyAgICAgICAgWmVyb0JpdHMgfD0gU2hpZnQ7CisgICAgfQorICAgIHJldHVybiBaZXJvQml0czsKKyAgfQorfTsKKworI2lmIF9fR05VQ19fID49IDQgfHwgZGVmaW5lZChfTVNDX1ZFUikKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgTGVhZGluZ1plcm9zQ291bnRlcjxULCA0PiB7CisgIHN0YXRpYyBzdGQ6OnNpemVfdCBjb3VudChUIFZhbCwgWmVyb0JlaGF2aW9yIFpCKSB7CisgICAgaWYgKFpCICE9IFpCX1VuZGVmaW5lZCAmJiBWYWwgPT0gMCkKKyAgICAgIHJldHVybiAzMjsKKworI2lmIF9faGFzX2J1aWx0aW4oX19idWlsdGluX2NseikgfHwgTExWTV9HTlVDX1BSRVJFUSg0LCAwLCAwKQorICAgIHJldHVybiBfX2J1aWx0aW5fY2x6KFZhbCk7CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAgIHVuc2lnbmVkIGxvbmcgSW5kZXg7CisgICAgX0JpdFNjYW5SZXZlcnNlKCZJbmRleCwgVmFsKTsKKyAgICByZXR1cm4gSW5kZXggXiAzMTsKKyNlbmRpZgorICB9Cit9OworCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX01fWDY0KQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBMZWFkaW5nWmVyb3NDb3VudGVyPFQsIDg+IHsKKyAgc3RhdGljIHN0ZDo6c2l6ZV90IGNvdW50KFQgVmFsLCBaZXJvQmVoYXZpb3IgWkIpIHsKKyAgICBpZiAoWkIgIT0gWkJfVW5kZWZpbmVkICYmIFZhbCA9PSAwKQorICAgICAgcmV0dXJuIDY0OworCisjaWYgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fY2x6bGwpIHx8IExMVk1fR05VQ19QUkVSRVEoNCwgMCwgMCkKKyAgICByZXR1cm4gX19idWlsdGluX2NsemxsKFZhbCk7CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAgIHVuc2lnbmVkIGxvbmcgSW5kZXg7CisgICAgX0JpdFNjYW5SZXZlcnNlNjQoJkluZGV4LCBWYWwpOworICAgIHJldHVybiBJbmRleCBeIDYzOworI2VuZGlmCisgIH0KK307CisjZW5kaWYKKyNlbmRpZgorfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKKy8vLyBcYnJpZWYgQ291bnQgbnVtYmVyIG9mIDAncyBmcm9tIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgbGVhc3QKKy8vLyAgIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCAxLgorLy8vCisvLy8gT25seSB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBhcmUgYWxsb3dlZC4KKy8vLworLy8vIFxwYXJhbSBaQiB0aGUgYmVoYXZpb3Igb24gYW4gaW5wdXQgb2YgMC4gT25seSBaQl9XaWR0aCBhbmQgWkJfVW5kZWZpbmVkIGFyZQorLy8vICAgdmFsaWQgYXJndW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnNpemVfdCBjb3VudExlYWRpbmdaZXJvcyhUIFZhbCwgWmVyb0JlaGF2aW9yIFpCID0gWkJfV2lkdGgpIHsKKyAgc3RhdGljX2Fzc2VydChzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19pbnRlZ2VyICYmCisgICAgICAgICAgICAgICAgICAgICFzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQsCisgICAgICAgICAgICAgICAgIk9ubHkgdW5zaWduZWQgaW50ZWdyYWwgdHlwZXMgYXJlIGFsbG93ZWQuIik7CisgIHJldHVybiBsbHZtOjpkZXRhaWw6OkxlYWRpbmdaZXJvc0NvdW50ZXI8VCwgc2l6ZW9mKFQpPjo6Y291bnQoVmFsLCBaQik7Cit9CisKKy8vLyBcYnJpZWYgR2V0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgc2V0IGJpdCBzdGFydGluZyBmcm9tIHRoZSBsZWFzdAorLy8vICAgc2lnbmlmaWNhbnQgYml0LgorLy8vCisvLy8gT25seSB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBhcmUgYWxsb3dlZC4KKy8vLworLy8vIFxwYXJhbSBaQiB0aGUgYmVoYXZpb3Igb24gYW4gaW5wdXQgb2YgMC4gT25seSBaQl9NYXggYW5kIFpCX1VuZGVmaW5lZCBhcmUKKy8vLyAgIHZhbGlkIGFyZ3VtZW50cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGZpbmRGaXJzdFNldChUIFZhbCwgWmVyb0JlaGF2aW9yIFpCID0gWkJfTWF4KSB7CisgIGlmIChaQiA9PSBaQl9NYXggJiYgVmFsID09IDApCisgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpOworCisgIHJldHVybiBjb3VudFRyYWlsaW5nWmVyb3MoVmFsLCBaQl9VbmRlZmluZWQpOworfQorCisvLy8gXGJyaWVmIENyZWF0ZSBhIGJpdG1hc2sgd2l0aCB0aGUgTiByaWdodC1tb3N0IGJpdHMgc2V0IHRvIDEsIGFuZCBhbGwgb3RoZXIKKy8vLyBiaXRzIHNldCB0byAwLiAgT25seSB1bnNpZ25lZCB0eXBlcyBhcmUgYWxsb3dlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIG1hc2tUcmFpbGluZ09uZXModW5zaWduZWQgTikgeworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdW5zaWduZWQ8VD46OnZhbHVlLCAiSW52YWxpZCB0eXBlISIpOworICBjb25zdCB1bnNpZ25lZCBCaXRzID0gQ0hBUl9CSVQgKiBzaXplb2YoVCk7CisgIGFzc2VydChOIDw9IEJpdHMgJiYgIkludmFsaWQgYml0IGluZGV4Iik7CisgIHJldHVybiBOID09IDAgPyAwIDogKFQoLTEpID4+IChCaXRzIC0gTikpOworfQorCisvLy8gXGJyaWVmIENyZWF0ZSBhIGJpdG1hc2sgd2l0aCB0aGUgTiBsZWZ0LW1vc3QgYml0cyBzZXQgdG8gMSwgYW5kIGFsbCBvdGhlcgorLy8vIGJpdHMgc2V0IHRvIDAuICBPbmx5IHVuc2lnbmVkIHR5cGVzIGFyZSBhbGxvd2VkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgbWFza0xlYWRpbmdPbmVzKHVuc2lnbmVkIE4pIHsKKyAgcmV0dXJuIH5tYXNrVHJhaWxpbmdPbmVzPFQ+KENIQVJfQklUICogc2l6ZW9mKFQpIC0gTik7Cit9CisKKy8vLyBcYnJpZWYgQ3JlYXRlIGEgYml0bWFzayB3aXRoIHRoZSBOIHJpZ2h0LW1vc3QgYml0cyBzZXQgdG8gMCwgYW5kIGFsbCBvdGhlcgorLy8vIGJpdHMgc2V0IHRvIDEuICBPbmx5IHVuc2lnbmVkIHR5cGVzIGFyZSBhbGxvd2VkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgbWFza1RyYWlsaW5nWmVyb3ModW5zaWduZWQgTikgeworICByZXR1cm4gbWFza0xlYWRpbmdPbmVzPFQ+KENIQVJfQklUICogc2l6ZW9mKFQpIC0gTik7Cit9CisKKy8vLyBcYnJpZWYgQ3JlYXRlIGEgYml0bWFzayB3aXRoIHRoZSBOIGxlZnQtbW9zdCBiaXRzIHNldCB0byAwLCBhbmQgYWxsIG90aGVyCisvLy8gYml0cyBzZXQgdG8gMS4gIE9ubHkgdW5zaWduZWQgdHlwZXMgYXJlIGFsbG93ZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBtYXNrTGVhZGluZ1plcm9zKHVuc2lnbmVkIE4pIHsKKyAgcmV0dXJuIG1hc2tUcmFpbGluZ09uZXM8VD4oQ0hBUl9CSVQgKiBzaXplb2YoVCkgLSBOKTsKK30KKworLy8vIFxicmllZiBHZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHNldCBiaXQgc3RhcnRpbmcgZnJvbSB0aGUgbGVhc3QKKy8vLyAgIHNpZ25pZmljYW50IGJpdC4KKy8vLworLy8vIE9ubHkgdW5zaWduZWQgaW50ZWdyYWwgdHlwZXMgYXJlIGFsbG93ZWQuCisvLy8KKy8vLyBccGFyYW0gWkIgdGhlIGJlaGF2aW9yIG9uIGFuIGlucHV0IG9mIDAuIE9ubHkgWkJfTWF4IGFuZCBaQl9VbmRlZmluZWQgYXJlCisvLy8gICB2YWxpZCBhcmd1bWVudHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBmaW5kTGFzdFNldChUIFZhbCwgWmVyb0JlaGF2aW9yIFpCID0gWkJfTWF4KSB7CisgIGlmIChaQiA9PSBaQl9NYXggJiYgVmFsID09IDApCisgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpOworCisgIC8vIFVzZSBeIGluc3RlYWQgb2YgLSBiZWNhdXNlIGJvdGggZ2NjIGFuZCBsbHZtIGNhbiByZW1vdmUgdGhlIGFzc29jaWF0ZWQgXgorICAvLyBpbiB0aGUgX19idWlsdGluX2NseiBpbnRyaW5zaWMgb24geDg2LgorICByZXR1cm4gY291bnRMZWFkaW5nWmVyb3MoVmFsLCBaQl9VbmRlZmluZWQpIF4KKyAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjpkaWdpdHMgLSAxKTsKK30KKworLy8vIFxicmllZiBNYWNybyBjb21wcmVzc2VkIGJpdCByZXZlcnNhbCB0YWJsZSBmb3IgMjU2IGJpdHMuCisvLy8KKy8vLyBodHRwOi8vZ3JhcGhpY3Muc3RhbmZvcmQuZWR1L35zZWFuZGVyL2JpdGhhY2tzLmh0bWwjQml0UmV2ZXJzZVRhYmxlCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBCaXRSZXZlcnNlVGFibGUyNTZbMjU2XSA9IHsKKyNkZWZpbmUgUjIobikgbiwgbiArIDIgKiA2NCwgbiArIDEgKiA2NCwgbiArIDMgKiA2NAorI2RlZmluZSBSNChuKSBSMihuKSwgUjIobiArIDIgKiAxNiksIFIyKG4gKyAxICogMTYpLCBSMihuICsgMyAqIDE2KQorI2RlZmluZSBSNihuKSBSNChuKSwgUjQobiArIDIgKiA0KSwgUjQobiArIDEgKiA0KSwgUjQobiArIDMgKiA0KQorICBSNigwKSwgUjYoMiksIFI2KDEpLCBSNigzKQorI3VuZGVmIFIyCisjdW5kZWYgUjQKKyN1bmRlZiBSNgorfTsKKworLy8vIFxicmllZiBSZXZlcnNlIHRoZSBiaXRzIGluIFxwIFZhbC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCByZXZlcnNlQml0cyhUIFZhbCkgeworICB1bnNpZ25lZCBjaGFyIGluW3NpemVvZihWYWwpXTsKKyAgdW5zaWduZWQgY2hhciBvdXRbc2l6ZW9mKFZhbCldOworICBzdGQ6Om1lbWNweShpbiwgJlZhbCwgc2l6ZW9mKFZhbCkpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZW9mKFZhbCk7ICsraSkKKyAgICBvdXRbKHNpemVvZihWYWwpIC0gaSkgLSAxXSA9IEJpdFJldmVyc2VUYWJsZTI1NltpbltpXV07CisgIHN0ZDo6bWVtY3B5KCZWYWwsIG91dCwgc2l6ZW9mKFZhbCkpOworICByZXR1cm4gVmFsOworfQorCisvLyBOT1RFOiBUaGUgZm9sbG93aW5nIHN1cHBvcnQgZnVuY3Rpb25zIHVzZSB0aGUgXzMyL182NCBleHRlbnNpb25zIGluc3RlYWQgb2YKKy8vIHR5cGUgb3ZlcmxvYWRpbmcgc28gdGhhdCBzaWduZWQgYW5kIHVuc2lnbmVkIGludGVnZXJzIGNhbiBiZSB1c2VkIHdpdGhvdXQKKy8vIGFtYmlndWl0eS4KKworLy8vIFJldHVybiB0aGUgaGlnaCAzMiBiaXRzIG9mIGEgNjQgYml0IHZhbHVlLgorY29uc3RleHByIGlubGluZSB1aW50MzJfdCBIaV8zMih1aW50NjRfdCBWYWx1ZSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFZhbHVlID4+IDMyKTsKK30KKworLy8vIFJldHVybiB0aGUgbG93IDMyIGJpdHMgb2YgYSA2NCBiaXQgdmFsdWUuCitjb25zdGV4cHIgaW5saW5lIHVpbnQzMl90IExvXzMyKHVpbnQ2NF90IFZhbHVlKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oVmFsdWUpOworfQorCisvLy8gTWFrZSBhIDY0LWJpdCBpbnRlZ2VyIGZyb20gYSBoaWdoIC8gbG93IHBhaXIgb2YgMzItYml0IGludGVnZXJzLgorY29uc3RleHByIGlubGluZSB1aW50NjRfdCBNYWtlXzY0KHVpbnQzMl90IEhpZ2gsIHVpbnQzMl90IExvdykgeworICByZXR1cm4gKCh1aW50NjRfdClIaWdoIDw8IDMyKSB8ICh1aW50NjRfdClMb3c7Cit9CisKKy8vLyBDaGVja3MgaWYgYW4gaW50ZWdlciBmaXRzIGludG8gdGhlIGdpdmVuIGJpdCB3aWR0aC4KK3RlbXBsYXRlIDx1bnNpZ25lZCBOPiBjb25zdGV4cHIgaW5saW5lIGJvb2wgaXNJbnQoaW50NjRfdCB4KSB7CisgIHJldHVybiBOID49IDY0IHx8ICgtKElOVDY0X0MoMSk8PChOLTEpKSA8PSB4ICYmIHggPCAoSU5UNjRfQygxKTw8KE4tMSkpKTsKK30KKy8vIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyB0byBnZXQgYmV0dGVyIGNvZGUgZm9yIGNvbW1vbiBjYXNlcy4KK3RlbXBsYXRlIDw+IGNvbnN0ZXhwciBpbmxpbmUgYm9vbCBpc0ludDw4PihpbnQ2NF90IHgpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludDhfdD4oeCkgPT0geDsKK30KK3RlbXBsYXRlIDw+IGNvbnN0ZXhwciBpbmxpbmUgYm9vbCBpc0ludDwxNj4oaW50NjRfdCB4KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQxNl90Pih4KSA9PSB4OworfQordGVtcGxhdGUgPD4gY29uc3RleHByIGlubGluZSBib29sIGlzSW50PDMyPihpbnQ2NF90IHgpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KHgpID09IHg7Cit9CisKKy8vLyBDaGVja3MgaWYgYSBzaWduZWQgaW50ZWdlciBpcyBhbiBOIGJpdCBudW1iZXIgc2hpZnRlZCBsZWZ0IGJ5IFMuCit0ZW1wbGF0ZSA8dW5zaWduZWQgTiwgdW5zaWduZWQgUz4KK2NvbnN0ZXhwciBpbmxpbmUgYm9vbCBpc1NoaWZ0ZWRJbnQoaW50NjRfdCB4KSB7CisgIHN0YXRpY19hc3NlcnQoCisgICAgICBOID4gMCwgImlzU2hpZnRlZEludDwwPiBkb2Vzbid0IG1ha2Ugc2Vuc2UgKHJlZmVycyB0byBhIDAtYml0IG51bWJlci4iKTsKKyAgc3RhdGljX2Fzc2VydChOICsgUyA8PSA2NCwgImlzU2hpZnRlZEludDxOLCBTPiB3aXRoIE4gKyBTID4gNjQgaXMgdG9vIHdpZGUuIik7CisgIHJldHVybiBpc0ludDxOICsgUz4oeCkgJiYgKHggJSAoVUlOVDY0X0MoMSkgPDwgUykgPT0gMCk7Cit9CisKKy8vLyBDaGVja3MgaWYgYW4gdW5zaWduZWQgaW50ZWdlciBmaXRzIGludG8gdGhlIGdpdmVuIGJpdCB3aWR0aC4KKy8vLworLy8vIFRoaXMgaXMgd3JpdHRlbiBhcyB0d28gZnVuY3Rpb25zIHJhdGhlciB0aGFuIGFzIHNpbXBseQorLy8vCisvLy8gICByZXR1cm4gTiA+PSA2NCB8fCBYIDwgKFVJTlQ2NF9DKDEpIDw8IE4pOworLy8vCisvLy8gdG8ga2VlcCBNU1ZDIGZyb20gKGluY29ycmVjdGx5KSB3YXJuaW5nIG9uIGlzVUludDw2ND4gdGhhdCB3ZSdyZSBzaGlmdGluZworLy8vIGxlZnQgdG9vIG1hbnkgcGxhY2VzLgordGVtcGxhdGUgPHVuc2lnbmVkIE4+Citjb25zdGV4cHIgaW5saW5lIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPChOIDwgNjQpLCBib29sPjo6dHlwZQoraXNVSW50KHVpbnQ2NF90IFgpIHsKKyAgc3RhdGljX2Fzc2VydChOID4gMCwgImlzVUludDwwPiBkb2Vzbid0IG1ha2Ugc2Vuc2UiKTsKKyAgcmV0dXJuIFggPCAoVUlOVDY0X0MoMSkgPDwgKE4pKTsKK30KK3RlbXBsYXRlIDx1bnNpZ25lZCBOPgorY29uc3RleHByIGlubGluZSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxOID49IDY0LCBib29sPjo6dHlwZQoraXNVSW50KHVpbnQ2NF90IFgpIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyB0byBnZXQgYmV0dGVyIGNvZGUgZm9yIGNvbW1vbiBjYXNlcy4KK3RlbXBsYXRlIDw+IGNvbnN0ZXhwciBpbmxpbmUgYm9vbCBpc1VJbnQ8OD4odWludDY0X3QgeCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDhfdD4oeCkgPT0geDsKK30KK3RlbXBsYXRlIDw+IGNvbnN0ZXhwciBpbmxpbmUgYm9vbCBpc1VJbnQ8MTY+KHVpbnQ2NF90IHgpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNl90Pih4KSA9PSB4OworfQordGVtcGxhdGUgPD4gY29uc3RleHByIGlubGluZSBib29sIGlzVUludDwzMj4odWludDY0X3QgeCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHgpID09IHg7Cit9CisKKy8vLyBDaGVja3MgaWYgYSB1bnNpZ25lZCBpbnRlZ2VyIGlzIGFuIE4gYml0IG51bWJlciBzaGlmdGVkIGxlZnQgYnkgUy4KK3RlbXBsYXRlIDx1bnNpZ25lZCBOLCB1bnNpZ25lZCBTPgorY29uc3RleHByIGlubGluZSBib29sIGlzU2hpZnRlZFVJbnQodWludDY0X3QgeCkgeworICBzdGF0aWNfYXNzZXJ0KAorICAgICAgTiA+IDAsICJpc1NoaWZ0ZWRVSW50PDA+IGRvZXNuJ3QgbWFrZSBzZW5zZSAocmVmZXJzIHRvIGEgMC1iaXQgbnVtYmVyKSIpOworICBzdGF0aWNfYXNzZXJ0KE4gKyBTIDw9IDY0LAorICAgICAgICAgICAgICAgICJpc1NoaWZ0ZWRVSW50PE4sIFM+IHdpdGggTiArIFMgPiA2NCBpcyB0b28gd2lkZS4iKTsKKyAgLy8gUGVyIHRoZSB0d28gc3RhdGljX2Fzc2VydHMgYWJvdmUsIFMgbXVzdCBiZSBzdHJpY3RseSBsZXNzIHRoYW4gNjQuICBTbworICAvLyAxIDw8IFMgaXMgbm90IHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgcmV0dXJuIGlzVUludDxOICsgUz4oeCkgJiYgKHggJSAoVUlOVDY0X0MoMSkgPDwgUykgPT0gMCk7Cit9CisKKy8vLyBHZXRzIHRoZSBtYXhpbXVtIHZhbHVlIGZvciBhIE4tYml0IHVuc2lnbmVkIGludGVnZXIuCitpbmxpbmUgdWludDY0X3QgbWF4VUludE4odWludDY0X3QgTikgeworICBhc3NlcnQoTiA+IDAgJiYgTiA8PSA2NCAmJiAiaW50ZWdlciB3aWR0aCBvdXQgb2YgcmFuZ2UiKTsKKworICAvLyB1aW50NjRfdCgxKSA8PCA2NCBpcyB1bmRlZmluZWQgYmVoYXZpb3IsIHNvIHdlIGNhbid0IGRvCisgIC8vICAgKHVpbnQ2NF90KDEpIDw8IE4pIC0gMQorICAvLyB3aXRob3V0IGNoZWNraW5nIGZpcnN0IHRoYXQgTiAhPSA2NC4gIEJ1dCB0aGlzIHdvcmtzIGFuZCBkb2Vzbid0IGhhdmUgYQorICAvLyBicmFuY2guCisgIHJldHVybiBVSU5UNjRfTUFYID4+ICg2NCAtIE4pOworfQorCisvLy8gR2V0cyB0aGUgbWluaW11bSB2YWx1ZSBmb3IgYSBOLWJpdCBzaWduZWQgaW50ZWdlci4KK2lubGluZSBpbnQ2NF90IG1pbkludE4oaW50NjRfdCBOKSB7CisgIGFzc2VydChOID4gMCAmJiBOIDw9IDY0ICYmICJpbnRlZ2VyIHdpZHRoIG91dCBvZiByYW5nZSIpOworCisgIHJldHVybiAtKFVJTlQ2NF9DKDEpPDwoTi0xKSk7Cit9CisKKy8vLyBHZXRzIHRoZSBtYXhpbXVtIHZhbHVlIGZvciBhIE4tYml0IHNpZ25lZCBpbnRlZ2VyLgoraW5saW5lIGludDY0X3QgbWF4SW50TihpbnQ2NF90IE4pIHsKKyAgYXNzZXJ0KE4gPiAwICYmIE4gPD0gNjQgJiYgImludGVnZXIgd2lkdGggb3V0IG9mIHJhbmdlIik7CisKKyAgLy8gVGhpcyByZWxpZXMgb24gdHdvJ3MgY29tcGxlbWVudCB3cmFwYXJvdW5kIHdoZW4gTiA9PSA2NCwgc28gd2UgY29udmVydCB0bworICAvLyBpbnQ2NF90IG9ubHkgYXQgdGhlIHZlcnkgZW5kIHRvIGF2b2lkIFVCLgorICByZXR1cm4gKFVJTlQ2NF9DKDEpIDw8IChOIC0gMSkpIC0gMTsKK30KKworLy8vIENoZWNrcyBpZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIGZpdHMgaW50byB0aGUgZ2l2ZW4gKGR5bmFtaWMpIGJpdCB3aWR0aC4KK2lubGluZSBib29sIGlzVUludE4odW5zaWduZWQgTiwgdWludDY0X3QgeCkgeworICByZXR1cm4gTiA+PSA2NCB8fCB4IDw9IG1heFVJbnROKE4pOworfQorCisvLy8gQ2hlY2tzIGlmIGFuIHNpZ25lZCBpbnRlZ2VyIGZpdHMgaW50byB0aGUgZ2l2ZW4gKGR5bmFtaWMpIGJpdCB3aWR0aC4KK2lubGluZSBib29sIGlzSW50Tih1bnNpZ25lZCBOLCBpbnQ2NF90IHgpIHsKKyAgcmV0dXJuIE4gPj0gNjQgfHwgKG1pbkludE4oTikgPD0geCAmJiB4IDw9IG1heEludE4oTikpOworfQorCisvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgbm9uLWVtcHR5IHNlcXVlbmNlIG9mIG9uZXMgc3RhcnRpbmcgYXQgdGhlCisvLy8gbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHdpdGggdGhlIHJlbWFpbmRlciB6ZXJvICgzMiBiaXQgdmVyc2lvbikuCisvLy8gRXguIGlzTWFza18zMigweDAwMDBGRkZGVSkgPT0gdHJ1ZS4KK2NvbnN0ZXhwciBpbmxpbmUgYm9vbCBpc01hc2tfMzIodWludDMyX3QgVmFsdWUpIHsKKyAgcmV0dXJuIFZhbHVlICYmICgoVmFsdWUgKyAxKSAmIFZhbHVlKSA9PSAwOworfQorCisvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgbm9uLWVtcHR5IHNlcXVlbmNlIG9mIG9uZXMgc3RhcnRpbmcgYXQgdGhlCisvLy8gbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHdpdGggdGhlIHJlbWFpbmRlciB6ZXJvICg2NCBiaXQgdmVyc2lvbikuCitjb25zdGV4cHIgaW5saW5lIGJvb2wgaXNNYXNrXzY0KHVpbnQ2NF90IFZhbHVlKSB7CisgIHJldHVybiBWYWx1ZSAmJiAoKFZhbHVlICsgMSkgJiBWYWx1ZSkgPT0gMDsKK30KKworLy8vIFJldHVybiB0cnVlIGlmIHRoZSBhcmd1bWVudCBjb250YWlucyBhIG5vbi1lbXB0eSBzZXF1ZW5jZSBvZiBvbmVzIHdpdGggdGhlCisvLy8gcmVtYWluZGVyIHplcm8gKDMyIGJpdCB2ZXJzaW9uLikgRXguIGlzU2hpZnRlZE1hc2tfMzIoMHgwMDAwRkYwMFUpID09IHRydWUuCitjb25zdGV4cHIgaW5saW5lIGJvb2wgaXNTaGlmdGVkTWFza18zMih1aW50MzJfdCBWYWx1ZSkgeworICByZXR1cm4gVmFsdWUgJiYgaXNNYXNrXzMyKChWYWx1ZSAtIDEpIHwgVmFsdWUpOworfQorCisvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGFyZ3VtZW50IGNvbnRhaW5zIGEgbm9uLWVtcHR5IHNlcXVlbmNlIG9mIG9uZXMgd2l0aCB0aGUKKy8vLyByZW1haW5kZXIgemVybyAoNjQgYml0IHZlcnNpb24uKQorY29uc3RleHByIGlubGluZSBib29sIGlzU2hpZnRlZE1hc2tfNjQodWludDY0X3QgVmFsdWUpIHsKKyAgcmV0dXJuIFZhbHVlICYmIGlzTWFza182NCgoVmFsdWUgLSAxKSB8IFZhbHVlKTsKK30KKworLy8vIFJldHVybiB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBhIHBvd2VyIG9mIHR3byA+IDAuCisvLy8gRXguIGlzUG93ZXJPZjJfMzIoMHgwMDEwMDAwMFUpID09IHRydWUgKDMyIGJpdCBlZGl0aW9uLikKK2NvbnN0ZXhwciBpbmxpbmUgYm9vbCBpc1Bvd2VyT2YyXzMyKHVpbnQzMl90IFZhbHVlKSB7CisgIHJldHVybiBWYWx1ZSAmJiAhKFZhbHVlICYgKFZhbHVlIC0gMSkpOworfQorCisvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgcG93ZXIgb2YgdHdvID4gMCAoNjQgYml0IGVkaXRpb24uKQorY29uc3RleHByIGlubGluZSBib29sIGlzUG93ZXJPZjJfNjQodWludDY0X3QgVmFsdWUpIHsKKyAgcmV0dXJuIFZhbHVlICYmICEoVmFsdWUgJiAoVmFsdWUgLSAxKSk7Cit9CisKKy8vLyBSZXR1cm4gYSBieXRlLXN3YXBwZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIDE2LWJpdCBhcmd1bWVudC4KK2lubGluZSB1aW50MTZfdCBCeXRlU3dhcF8xNih1aW50MTZfdCBWYWx1ZSkgeworICByZXR1cm4gc3lzOjpTd2FwQnl0ZU9yZGVyXzE2KFZhbHVlKTsKK30KKworLy8vIFJldHVybiBhIGJ5dGUtc3dhcHBlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgMzItYml0IGFyZ3VtZW50LgoraW5saW5lIHVpbnQzMl90IEJ5dGVTd2FwXzMyKHVpbnQzMl90IFZhbHVlKSB7CisgIHJldHVybiBzeXM6OlN3YXBCeXRlT3JkZXJfMzIoVmFsdWUpOworfQorCisvLy8gUmV0dXJuIGEgYnl0ZS1zd2FwcGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSA2NC1iaXQgYXJndW1lbnQuCitpbmxpbmUgdWludDY0X3QgQnl0ZVN3YXBfNjQodWludDY0X3QgVmFsdWUpIHsKKyAgcmV0dXJuIHN5czo6U3dhcEJ5dGVPcmRlcl82NChWYWx1ZSk7Cit9CisKKy8vLyBcYnJpZWYgQ291bnQgdGhlIG51bWJlciBvZiBvbmVzIGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHRoZSBmaXJzdAorLy8vIHplcm8gYml0LgorLy8vCisvLy8gRXguIGNvdW50TGVhZGluZ09uZXMoMHhGRjBGRkYwMCkgPT0gOC4KKy8vLyBPbmx5IHVuc2lnbmVkIGludGVncmFsIHR5cGVzIGFyZSBhbGxvd2VkLgorLy8vCisvLy8gXHBhcmFtIFpCIHRoZSBiZWhhdmlvciBvbiBhbiBpbnB1dCBvZiBhbGwgb25lcy4gT25seSBaQl9XaWR0aCBhbmQKKy8vLyBaQl9VbmRlZmluZWQgYXJlIHZhbGlkIGFyZ3VtZW50cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzaXplX3QgY291bnRMZWFkaW5nT25lcyhUIFZhbHVlLCBaZXJvQmVoYXZpb3IgWkIgPSBaQl9XaWR0aCkgeworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2ludGVnZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgIXN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCwKKyAgICAgICAgICAgICAgICAiT25seSB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBhcmUgYWxsb3dlZC4iKTsKKyAgcmV0dXJuIGNvdW50TGVhZGluZ1plcm9zKH5WYWx1ZSwgWkIpOworfQorCisvLy8gXGJyaWVmIENvdW50IHRoZSBudW1iZXIgb2Ygb25lcyBmcm9tIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gdGhlIGZpcnN0CisvLy8gemVybyBiaXQuCisvLy8KKy8vLyBFeC4gY291bnRUcmFpbGluZ09uZXMoMHgwMEZGMDBGRikgPT0gOC4KKy8vLyBPbmx5IHVuc2lnbmVkIGludGVncmFsIHR5cGVzIGFyZSBhbGxvd2VkLgorLy8vCisvLy8gXHBhcmFtIFpCIHRoZSBiZWhhdmlvciBvbiBhbiBpbnB1dCBvZiBhbGwgb25lcy4gT25seSBaQl9XaWR0aCBhbmQKKy8vLyBaQl9VbmRlZmluZWQgYXJlIHZhbGlkIGFyZ3VtZW50cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzaXplX3QgY291bnRUcmFpbGluZ09uZXMoVCBWYWx1ZSwgWmVyb0JlaGF2aW9yIFpCID0gWkJfV2lkdGgpIHsKKyAgc3RhdGljX2Fzc2VydChzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19pbnRlZ2VyICYmCisgICAgICAgICAgICAgICAgICAgICFzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQsCisgICAgICAgICAgICAgICAgIk9ubHkgdW5zaWduZWQgaW50ZWdyYWwgdHlwZXMgYXJlIGFsbG93ZWQuIik7CisgIHJldHVybiBjb3VudFRyYWlsaW5nWmVyb3MoflZhbHVlLCBaQik7Cit9CisKK25hbWVzcGFjZSBkZXRhaWwgewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IFNpemVPZlQ+IHN0cnVjdCBQb3B1bGF0aW9uQ291bnRlciB7CisgIHN0YXRpYyB1bnNpZ25lZCBjb3VudChUIFZhbHVlKSB7CisgICAgLy8gR2VuZXJpYyB2ZXJzaW9uLCBmb3J3YXJkIHRvIDMyIGJpdHMuCisgICAgc3RhdGljX2Fzc2VydChTaXplT2ZUIDw9IDQsICJOb3QgaW1wbGVtZW50ZWQhIik7CisjaWYgX19HTlVDX18gPj0gNAorICAgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnQoVmFsdWUpOworI2Vsc2UKKyAgICB1aW50MzJfdCB2ID0gVmFsdWU7CisgICAgdiA9IHYgLSAoKHYgPj4gMSkgJiAweDU1NTU1NTU1KTsKKyAgICB2ID0gKHYgJiAweDMzMzMzMzMzKSArICgodiA+PiAyKSAmIDB4MzMzMzMzMzMpOworICAgIHJldHVybiAoKHYgKyAodiA+PiA0KSAmIDB4RjBGMEYwRikgKiAweDEwMTAxMDEpID4+IDI0OworI2VuZGlmCisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgUG9wdWxhdGlvbkNvdW50ZXI8VCwgOD4geworICBzdGF0aWMgdW5zaWduZWQgY291bnQoVCBWYWx1ZSkgeworI2lmIF9fR05VQ19fID49IDQKKyAgICByZXR1cm4gX19idWlsdGluX3BvcGNvdW50bGwoVmFsdWUpOworI2Vsc2UKKyAgICB1aW50NjRfdCB2ID0gVmFsdWU7CisgICAgdiA9IHYgLSAoKHYgPj4gMSkgJiAweDU1NTU1NTU1NTU1NTU1NTVVTEwpOworICAgIHYgPSAodiAmIDB4MzMzMzMzMzMzMzMzMzMzM1VMTCkgKyAoKHYgPj4gMikgJiAweDMzMzMzMzMzMzMzMzMzMzNVTEwpOworICAgIHYgPSAodiArICh2ID4+IDQpKSAmIDB4MEYwRjBGMEYwRjBGMEYwRlVMTDsKKyAgICByZXR1cm4gdW5zaWduZWQoKHVpbnQ2NF90KSh2ICogMHgwMTAxMDEwMTAxMDEwMTAxVUxMKSA+PiA1Nik7CisjZW5kaWYKKyAgfQorfTsKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorCisvLy8gXGJyaWVmIENvdW50IHRoZSBudW1iZXIgb2Ygc2V0IGJpdHMgaW4gYSB2YWx1ZS4KKy8vLyBFeC4gY291bnRQb3B1bGF0aW9uKDB4RjAwMEYwMDApID0gOAorLy8vIFJldHVybnMgMCBpZiB0aGUgd29yZCBpcyB6ZXJvLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgdW5zaWduZWQgY291bnRQb3B1bGF0aW9uKFQgVmFsdWUpIHsKKyAgc3RhdGljX2Fzc2VydChzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19pbnRlZ2VyICYmCisgICAgICAgICAgICAgICAgICAgICFzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQsCisgICAgICAgICAgICAgICAgIk9ubHkgdW5zaWduZWQgaW50ZWdyYWwgdHlwZXMgYXJlIGFsbG93ZWQuIik7CisgIHJldHVybiBkZXRhaWw6OlBvcHVsYXRpb25Db3VudGVyPFQsIHNpemVvZihUKT46OmNvdW50KFZhbHVlKTsKK30KKworLy8vIFJldHVybiB0aGUgbG9nIGJhc2UgMiBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLgoraW5saW5lIGRvdWJsZSBMb2cyKGRvdWJsZSBWYWx1ZSkgeworI2lmIGRlZmluZWQoX19BTkRST0lEX0FQSV9fKSAmJiBfX0FORFJPSURfQVBJX18gPCAxOAorICByZXR1cm4gX19idWlsdGluX2xvZyhWYWx1ZSkgLyBfX2J1aWx0aW5fbG9nKDIuMCk7CisjZWxzZQorICByZXR1cm4gbG9nMihWYWx1ZSk7CisjZW5kaWYKK30KKworLy8vIFJldHVybiB0aGUgZmxvb3IgbG9nIGJhc2UgMiBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLCAtMSBpZiB0aGUgdmFsdWUgaXMgemVyby4KKy8vLyAoMzIgYml0IGVkaXRpb24uKQorLy8vIEV4LiBMb2cyXzMyKDMyKSA9PSA1LCBMb2cyXzMyKDEpID09IDAsIExvZzJfMzIoMCkgPT0gLTEsIExvZzJfMzIoNikgPT0gMgoraW5saW5lIHVuc2lnbmVkIExvZzJfMzIodWludDMyX3QgVmFsdWUpIHsKKyAgcmV0dXJuIDMxIC0gY291bnRMZWFkaW5nWmVyb3MoVmFsdWUpOworfQorCisvLy8gUmV0dXJuIHRoZSBmbG9vciBsb2cgYmFzZSAyIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUsIC0xIGlmIHRoZSB2YWx1ZSBpcyB6ZXJvLgorLy8vICg2NCBiaXQgZWRpdGlvbi4pCitpbmxpbmUgdW5zaWduZWQgTG9nMl82NCh1aW50NjRfdCBWYWx1ZSkgeworICByZXR1cm4gNjMgLSBjb3VudExlYWRpbmdaZXJvcyhWYWx1ZSk7Cit9CisKKy8vLyBSZXR1cm4gdGhlIGNlaWwgbG9nIGJhc2UgMiBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLCAzMiBpZiB0aGUgdmFsdWUgaXMgemVyby4KKy8vLyAoMzIgYml0IGVkaXRpb24pLgorLy8vIEV4LiBMb2cyXzMyX0NlaWwoMzIpID09IDUsIExvZzJfMzJfQ2VpbCgxKSA9PSAwLCBMb2cyXzMyX0NlaWwoNikgPT0gMworaW5saW5lIHVuc2lnbmVkIExvZzJfMzJfQ2VpbCh1aW50MzJfdCBWYWx1ZSkgeworICByZXR1cm4gMzIgLSBjb3VudExlYWRpbmdaZXJvcyhWYWx1ZSAtIDEpOworfQorCisvLy8gUmV0dXJuIHRoZSBjZWlsIGxvZyBiYXNlIDIgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgNjQgaWYgdGhlIHZhbHVlIGlzIHplcm8uCisvLy8gKDY0IGJpdCBlZGl0aW9uLikKK2lubGluZSB1bnNpZ25lZCBMb2cyXzY0X0NlaWwodWludDY0X3QgVmFsdWUpIHsKKyAgcmV0dXJuIDY0IC0gY291bnRMZWFkaW5nWmVyb3MoVmFsdWUgLSAxKTsKK30KKworLy8vIFJldHVybiB0aGUgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3Igb2YgdGhlIHZhbHVlcyB1c2luZyBFdWNsaWQncyBhbGdvcml0aG0uCitpbmxpbmUgdWludDY0X3QgR3JlYXRlc3RDb21tb25EaXZpc29yNjQodWludDY0X3QgQSwgdWludDY0X3QgQikgeworICB3aGlsZSAoQikgeworICAgIHVpbnQ2NF90IFQgPSBCOworICAgIEIgPSBBICUgQjsKKyAgICBBID0gVDsKKyAgfQorICByZXR1cm4gQTsKK30KKworLy8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSA2NC1iaXQgaW50ZWdlciBhbmQgcmV0dXJucyB0aGUgYml0IGVxdWl2YWxlbnQgZG91YmxlLgoraW5saW5lIGRvdWJsZSBCaXRzVG9Eb3VibGUodWludDY0X3QgQml0cykgeworICBkb3VibGUgRDsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YodWludDY0X3QpID09IHNpemVvZihkb3VibGUpLCAiVW5leHBlY3RlZCB0eXBlIHNpemVzIik7CisgIG1lbWNweSgmRCwgJkJpdHMsIHNpemVvZihCaXRzKSk7CisgIHJldHVybiBEOworfQorCisvLy8gVGhpcyBmdW5jdGlvbiB0YWtlcyBhIDMyLWJpdCBpbnRlZ2VyIGFuZCByZXR1cm5zIHRoZSBiaXQgZXF1aXZhbGVudCBmbG9hdC4KK2lubGluZSBmbG9hdCBCaXRzVG9GbG9hdCh1aW50MzJfdCBCaXRzKSB7CisgIGZsb2F0IEY7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHVpbnQzMl90KSA9PSBzaXplb2YoZmxvYXQpLCAiVW5leHBlY3RlZCB0eXBlIHNpemVzIik7CisgIG1lbWNweSgmRiwgJkJpdHMsIHNpemVvZihCaXRzKSk7CisgIHJldHVybiBGOworfQorCisvLy8gVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGRvdWJsZSBhbmQgcmV0dXJucyB0aGUgYml0IGVxdWl2YWxlbnQgNjQtYml0IGludGVnZXIuCisvLy8gTm90ZSB0aGF0IGNvcHlpbmcgZG91YmxlcyBhcm91bmQgY2hhbmdlcyB0aGUgYml0cyBvZiBOYU5zIG9uIHNvbWUgaG9zdHMsCisvLy8gbm90YWJseSB4ODYsIHNvIHRoaXMgcm91dGluZSBjYW5ub3QgYmUgdXNlZCBpZiB0aGVzZSBiaXRzIGFyZSBuZWVkZWQuCitpbmxpbmUgdWludDY0X3QgRG91YmxlVG9CaXRzKGRvdWJsZSBEb3VibGUpIHsKKyAgdWludDY0X3QgQml0czsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YodWludDY0X3QpID09IHNpemVvZihkb3VibGUpLCAiVW5leHBlY3RlZCB0eXBlIHNpemVzIik7CisgIG1lbWNweSgmQml0cywgJkRvdWJsZSwgc2l6ZW9mKERvdWJsZSkpOworICByZXR1cm4gQml0czsKK30KKworLy8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBmbG9hdCBhbmQgcmV0dXJucyB0aGUgYml0IGVxdWl2YWxlbnQgMzItYml0IGludGVnZXIuCisvLy8gTm90ZSB0aGF0IGNvcHlpbmcgZmxvYXRzIGFyb3VuZCBjaGFuZ2VzIHRoZSBiaXRzIG9mIE5hTnMgb24gc29tZSBob3N0cywKKy8vLyBub3RhYmx5IHg4Niwgc28gdGhpcyByb3V0aW5lIGNhbm5vdCBiZSB1c2VkIGlmIHRoZXNlIGJpdHMgYXJlIG5lZWRlZC4KK2lubGluZSB1aW50MzJfdCBGbG9hdFRvQml0cyhmbG9hdCBGbG9hdCkgeworICB1aW50MzJfdCBCaXRzOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1aW50MzJfdCkgPT0gc2l6ZW9mKGZsb2F0KSwgIlVuZXhwZWN0ZWQgdHlwZSBzaXplcyIpOworICBtZW1jcHkoJkJpdHMsICZGbG9hdCwgc2l6ZW9mKEZsb2F0KSk7CisgIHJldHVybiBCaXRzOworfQorCisvLy8gQSBhbmQgQiBhcmUgZWl0aGVyIGFsaWdubWVudHMgb3Igb2Zmc2V0cy4gUmV0dXJuIHRoZSBtaW5pbXVtIGFsaWdubWVudCB0aGF0CisvLy8gbWF5IGJlIGFzc3VtZWQgYWZ0ZXIgYWRkaW5nIHRoZSB0d28gdG9nZXRoZXIuCitjb25zdGV4cHIgaW5saW5lIHVpbnQ2NF90IE1pbkFsaWduKHVpbnQ2NF90IEEsIHVpbnQ2NF90IEIpIHsKKyAgLy8gVGhlIGxhcmdlc3QgcG93ZXIgb2YgMiB0aGF0IGRpdmlkZXMgYm90aCBBIGFuZCBCLgorICAvLworICAvLyBSZXBsYWNlICItVmFsdWUiIGJ5ICIxK35WYWx1ZSIgaW4gdGhlIGZvbGxvd2luZyBjb21tZW50ZWQgY29kZSB0byBhdm9pZAorICAvLyBNU1ZDIHdhcm5pbmcgQzQxNDYKKyAgLy8gICAgcmV0dXJuIChBIHwgQikgJiAtKEEgfCBCKTsKKyAgcmV0dXJuIChBIHwgQikgJiAoMSArIH4oQSB8IEIpKTsKK30KKworLy8vIFxicmllZiBBbGlnbnMgXGMgQWRkciB0byBcYyBBbGlnbm1lbnQgYnl0ZXMsIHJvdW5kaW5nIHVwLgorLy8vCisvLy8gQWxpZ25tZW50IHNob3VsZCBiZSBhIHBvd2VyIG9mIHR3by4gIFRoaXMgbWV0aG9kIHJvdW5kcyB1cCwgc28KKy8vLyBhbGlnbkFkZHIoNywgNCkgPT0gOCBhbmQgYWxpZ25BZGRyKDgsIDQpID09IDguCitpbmxpbmUgdWludHB0cl90IGFsaWduQWRkcihjb25zdCB2b2lkICpBZGRyLCBzaXplX3QgQWxpZ25tZW50KSB7CisgIGFzc2VydChBbGlnbm1lbnQgJiYgaXNQb3dlck9mMl82NCgodWludDY0X3QpQWxpZ25tZW50KSAmJgorICAgICAgICAgIkFsaWdubWVudCBpcyBub3QgYSBwb3dlciBvZiB0d28hIik7CisKKyAgYXNzZXJ0KCh1aW50cHRyX3QpQWRkciArIEFsaWdubWVudCAtIDEgPj0gKHVpbnRwdHJfdClBZGRyKTsKKworICByZXR1cm4gKCgodWludHB0cl90KUFkZHIgKyBBbGlnbm1lbnQgLSAxKSAmIH4odWludHB0cl90KShBbGlnbm1lbnQgLSAxKSk7Cit9CisKKy8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbmVjZXNzYXJ5IGFkanVzdG1lbnQgZm9yIGFsaWduaW5nIFxjIFB0ciB0byBcYyBBbGlnbm1lbnQKKy8vLyBieXRlcywgcm91bmRpbmcgdXAuCitpbmxpbmUgc2l6ZV90IGFsaWdubWVudEFkanVzdG1lbnQoY29uc3Qgdm9pZCAqUHRyLCBzaXplX3QgQWxpZ25tZW50KSB7CisgIHJldHVybiBhbGlnbkFkZHIoUHRyLCBBbGlnbm1lbnQpIC0gKHVpbnRwdHJfdClQdHI7Cit9CisKKy8vLyBSZXR1cm5zIHRoZSBuZXh0IHBvd2VyIG9mIHR3byAoaW4gNjQtYml0cykgdGhhdCBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gQS4KKy8vLyBSZXR1cm5zIHplcm8gb24gb3ZlcmZsb3cuCitpbmxpbmUgdWludDY0X3QgTmV4dFBvd2VyT2YyKHVpbnQ2NF90IEEpIHsKKyAgQSB8PSAoQSA+PiAxKTsKKyAgQSB8PSAoQSA+PiAyKTsKKyAgQSB8PSAoQSA+PiA0KTsKKyAgQSB8PSAoQSA+PiA4KTsKKyAgQSB8PSAoQSA+PiAxNik7CisgIEEgfD0gKEEgPj4gMzIpOworICByZXR1cm4gQSArIDE7Cit9CisKKy8vLyBSZXR1cm5zIHRoZSBwb3dlciBvZiB0d28gd2hpY2ggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKy8vLyBFc3NlbnRpYWxseSwgaXQgaXMgYSBmbG9vciBvcGVyYXRpb24gYWNyb3NzIHRoZSBkb21haW4gb2YgcG93ZXJzIG9mIHR3by4KK2lubGluZSB1aW50NjRfdCBQb3dlck9mMkZsb29yKHVpbnQ2NF90IEEpIHsKKyAgaWYgKCFBKSByZXR1cm4gMDsKKyAgcmV0dXJuIDF1bGwgPDwgKDYzIC0gY291bnRMZWFkaW5nWmVyb3MoQSwgWkJfVW5kZWZpbmVkKSk7Cit9CisKKy8vLyBSZXR1cm5zIHRoZSBwb3dlciBvZiB0d28gd2hpY2ggaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKy8vLyBFc3NlbnRpYWxseSwgaXQgaXMgYSBjZWlsIG9wZXJhdGlvbiBhY3Jvc3MgdGhlIGRvbWFpbiBvZiBwb3dlcnMgb2YgdHdvLgoraW5saW5lIHVpbnQ2NF90IFBvd2VyT2YyQ2VpbCh1aW50NjRfdCBBKSB7CisgIGlmICghQSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIE5leHRQb3dlck9mMihBIC0gMSk7Cit9CisKKy8vLyBSZXR1cm5zIHRoZSBuZXh0IGludGVnZXIgKG1vZCAyKio2NCkgdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KKy8vLyBccCBWYWx1ZSBhbmQgaXMgYSBtdWx0aXBsZSBvZiBccCBBbGlnbi4gXHAgQWxpZ24gbXVzdCBiZSBub24temVyby4KKy8vLworLy8vIElmIG5vbi16ZXJvIFxwIFNrZXcgaXMgc3BlY2lmaWVkLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYSBtaW5pbWFsCisvLy8gaW50ZWdlciB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBccCBWYWx1ZSBhbmQgZXF1YWwgdG8KKy8vLyBccCBBbGlnbiAqIE4gKyBccCBTa2V3IGZvciBzb21lIGludGVnZXIgTi4gSWYgXHAgU2tldyBpcyBsYXJnZXIgdGhhbgorLy8vIFxwIEFsaWduLCBpdHMgdmFsdWUgaXMgYWRqdXN0ZWQgdG8gJ1xwIFNrZXcgbW9kIFxwIEFsaWduJy4KKy8vLworLy8vIEV4YW1wbGVzOgorLy8vIFxjb2RlCisvLy8gICBhbGlnblRvKDUsIDgpID0gOAorLy8vICAgYWxpZ25UbygxNywgOCkgPSAyNAorLy8vICAgYWxpZ25Ubyh+MExMLCA4KSA9IDAKKy8vLyAgIGFsaWduVG8oMzIxLCAyNTUpID0gNTEwCisvLy8KKy8vLyAgIGFsaWduVG8oNSwgOCwgNykgPSA3CisvLy8gICBhbGlnblRvKDE3LCA4LCAxKSA9IDE3CisvLy8gICBhbGlnblRvKH4wTEwsIDgsIDMpID0gMworLy8vICAgYWxpZ25UbygzMjEsIDI1NSwgNDIpID0gNTUyCisvLy8gXGVuZGNvZGUKK2lubGluZSB1aW50NjRfdCBhbGlnblRvKHVpbnQ2NF90IFZhbHVlLCB1aW50NjRfdCBBbGlnbiwgdWludDY0X3QgU2tldyA9IDApIHsKKyAgYXNzZXJ0KEFsaWduICE9IDB1ICYmICJBbGlnbiBjYW4ndCBiZSAwLiIpOworICBTa2V3ICU9IEFsaWduOworICByZXR1cm4gKFZhbHVlICsgQWxpZ24gLSAxIC0gU2tldykgLyBBbGlnbiAqIEFsaWduICsgU2tldzsKK30KKworLy8vIFJldHVybnMgdGhlIG5leHQgaW50ZWdlciAobW9kIDIqKjY0KSB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bworLy8vIFxwIFZhbHVlIGFuZCBpcyBhIG11bHRpcGxlIG9mIFxjIEFsaWduLiBcYyBBbGlnbiBtdXN0IGJlIG5vbi16ZXJvLgordGVtcGxhdGUgPHVpbnQ2NF90IEFsaWduPiBjb25zdGV4cHIgaW5saW5lIHVpbnQ2NF90IGFsaWduVG8odWludDY0X3QgVmFsdWUpIHsKKyAgc3RhdGljX2Fzc2VydChBbGlnbiAhPSAwdSwgIkFsaWduIG11c3QgYmUgbm9uLXplcm8iKTsKKyAgcmV0dXJuIChWYWx1ZSArIEFsaWduIC0gMSkgLyBBbGlnbiAqIEFsaWduOworfQorCisvLy8gUmV0dXJucyB0aGUgaW50ZWdlciBjZWlsKE51bWVyYXRvciAvIERlbm9taW5hdG9yKS4KK2lubGluZSB1aW50NjRfdCBkaXZpZGVDZWlsKHVpbnQ2NF90IE51bWVyYXRvciwgdWludDY0X3QgRGVub21pbmF0b3IpIHsKKyAgcmV0dXJuIGFsaWduVG8oTnVtZXJhdG9yLCBEZW5vbWluYXRvcikgLyBEZW5vbWluYXRvcjsKK30KKworLy8vIFxjIGFsaWduVG8gZm9yIGNvbnRleHRzIHdoZXJlIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBpcyByZXF1aXJlZC4KKy8vLyBcc2EgYWxpZ25UbworLy8vCisvLy8gXHRvZG8gRklYTUU6IHJlbW92ZSB3aGVuIFxjIGNvbnN0ZXhwciBiZWNvbWVzIHJlYWxseSBcYyBjb25zdGV4cHIKK3RlbXBsYXRlIDx1aW50NjRfdCBBbGlnbj4KK3N0cnVjdCBBbGlnblRvIHsKKyAgc3RhdGljX2Fzc2VydChBbGlnbiAhPSAwdSwgIkFsaWduIG11c3QgYmUgbm9uLXplcm8iKTsKKyAgdGVtcGxhdGUgPHVpbnQ2NF90IFZhbHVlPgorICBzdHJ1Y3QgZnJvbV92YWx1ZSB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IHZhbHVlID0gKFZhbHVlICsgQWxpZ24gLSAxKSAvIEFsaWduICogQWxpZ247CisgIH07Cit9OworCisvLy8gUmV0dXJucyB0aGUgbGFyZ2VzdCB1aW50NjRfdCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gXHAgVmFsdWUgYW5kIGlzCisvLy8gXHAgU2tldyBtb2QgXHAgQWxpZ24uIFxwIEFsaWduIG11c3QgYmUgbm9uLXplcm8KK2lubGluZSB1aW50NjRfdCBhbGlnbkRvd24odWludDY0X3QgVmFsdWUsIHVpbnQ2NF90IEFsaWduLCB1aW50NjRfdCBTa2V3ID0gMCkgeworICBhc3NlcnQoQWxpZ24gIT0gMHUgJiYgIkFsaWduIGNhbid0IGJlIDAuIik7CisgIFNrZXcgJT0gQWxpZ247CisgIHJldHVybiAoVmFsdWUgLSBTa2V3KSAvIEFsaWduICogQWxpZ24gKyBTa2V3OworfQorCisvLy8gUmV0dXJucyB0aGUgb2Zmc2V0IHRvIHRoZSBuZXh0IGludGVnZXIgKG1vZCAyKio2NCkgdGhhdCBpcyBncmVhdGVyIHRoYW4KKy8vLyBvciBlcXVhbCB0byBccCBWYWx1ZSBhbmQgaXMgYSBtdWx0aXBsZSBvZiBccCBBbGlnbi4gXHAgQWxpZ24gbXVzdCBiZQorLy8vIG5vbi16ZXJvLgoraW5saW5lIHVpbnQ2NF90IE9mZnNldFRvQWxpZ25tZW50KHVpbnQ2NF90IFZhbHVlLCB1aW50NjRfdCBBbGlnbikgeworICByZXR1cm4gYWxpZ25UbyhWYWx1ZSwgQWxpZ24pIC0gVmFsdWU7Cit9CisKKy8vLyBTaWduLWV4dGVuZCB0aGUgbnVtYmVyIGluIHRoZSBib3R0b20gQiBiaXRzIG9mIFggdG8gYSAzMi1iaXQgaW50ZWdlci4KKy8vLyBSZXF1aXJlcyAwIDwgQiA8PSAzMi4KK3RlbXBsYXRlIDx1bnNpZ25lZCBCPiBjb25zdGV4cHIgaW5saW5lIGludDMyX3QgU2lnbkV4dGVuZDMyKHVpbnQzMl90IFgpIHsKKyAgc3RhdGljX2Fzc2VydChCID4gMCwgIkJpdCB3aWR0aCBjYW4ndCBiZSAwLiIpOworICBzdGF0aWNfYXNzZXJ0KEIgPD0gMzIsICJCaXQgd2lkdGggb3V0IG9mIHJhbmdlLiIpOworICByZXR1cm4gaW50MzJfdChYIDw8ICgzMiAtIEIpKSA+PiAoMzIgLSBCKTsKK30KKworLy8vIFNpZ24tZXh0ZW5kIHRoZSBudW1iZXIgaW4gdGhlIGJvdHRvbSBCIGJpdHMgb2YgWCB0byBhIDMyLWJpdCBpbnRlZ2VyLgorLy8vIFJlcXVpcmVzIDAgPCBCIDwgMzIuCitpbmxpbmUgaW50MzJfdCBTaWduRXh0ZW5kMzIodWludDMyX3QgWCwgdW5zaWduZWQgQikgeworICBhc3NlcnQoQiA+IDAgJiYgIkJpdCB3aWR0aCBjYW4ndCBiZSAwLiIpOworICBhc3NlcnQoQiA8PSAzMiAmJiAiQml0IHdpZHRoIG91dCBvZiByYW5nZS4iKTsKKyAgcmV0dXJuIGludDMyX3QoWCA8PCAoMzIgLSBCKSkgPj4gKDMyIC0gQik7Cit9CisKKy8vLyBTaWduLWV4dGVuZCB0aGUgbnVtYmVyIGluIHRoZSBib3R0b20gQiBiaXRzIG9mIFggdG8gYSA2NC1iaXQgaW50ZWdlci4KKy8vLyBSZXF1aXJlcyAwIDwgQiA8IDY0LgordGVtcGxhdGUgPHVuc2lnbmVkIEI+IGNvbnN0ZXhwciBpbmxpbmUgaW50NjRfdCBTaWduRXh0ZW5kNjQodWludDY0X3QgeCkgeworICBzdGF0aWNfYXNzZXJ0KEIgPiAwLCAiQml0IHdpZHRoIGNhbid0IGJlIDAuIik7CisgIHN0YXRpY19hc3NlcnQoQiA8PSA2NCwgIkJpdCB3aWR0aCBvdXQgb2YgcmFuZ2UuIik7CisgIHJldHVybiBpbnQ2NF90KHggPDwgKDY0IC0gQikpID4+ICg2NCAtIEIpOworfQorCisvLy8gU2lnbi1leHRlbmQgdGhlIG51bWJlciBpbiB0aGUgYm90dG9tIEIgYml0cyBvZiBYIHRvIGEgNjQtYml0IGludGVnZXIuCisvLy8gUmVxdWlyZXMgMCA8IEIgPCA2NC4KK2lubGluZSBpbnQ2NF90IFNpZ25FeHRlbmQ2NCh1aW50NjRfdCBYLCB1bnNpZ25lZCBCKSB7CisgIGFzc2VydChCID4gMCAmJiAiQml0IHdpZHRoIGNhbid0IGJlIDAuIik7CisgIGFzc2VydChCIDw9IDY0ICYmICJCaXQgd2lkdGggb3V0IG9mIHJhbmdlLiIpOworICByZXR1cm4gaW50NjRfdChYIDw8ICg2NCAtIEIpKSA+PiAoNjQgLSBCKTsKK30KKworLy8vIFN1YnRyYWN0IHR3byB1bnNpZ25lZCBpbnRlZ2VycywgWCBhbmQgWSwgb2YgdHlwZSBUIGFuZCByZXR1cm4gdGhlIGFic29sdXRlCisvLy8gdmFsdWUgb2YgdGhlIHJlc3VsdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc191bnNpZ25lZDxUPjo6dmFsdWUsIFQ+Ojp0eXBlCitBYnNvbHV0ZURpZmZlcmVuY2UoVCBYLCBUIFkpIHsKKyAgcmV0dXJuIHN0ZDo6bWF4KFgsIFkpIC0gc3RkOjptaW4oWCwgWSk7Cit9CisKKy8vLyBBZGQgdHdvIHVuc2lnbmVkIGludGVnZXJzLCBYIGFuZCBZLCBvZiB0eXBlIFQuICBDbGFtcCB0aGUgcmVzdWx0IHRvIHRoZQorLy8vIG1heGltdW0gcmVwcmVzZW50YWJsZSB2YWx1ZSBvZiBUIG9uIG92ZXJmbG93LiAgUmVzdWx0T3ZlcmZsb3dlZCBpbmRpY2F0ZXMgaWYKKy8vLyB0aGUgcmVzdWx0IGlzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIHJlcHJlc2VudGFibGUgdmFsdWUgb2YgdHlwZSBULgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3Vuc2lnbmVkPFQ+Ojp2YWx1ZSwgVD46OnR5cGUKK1NhdHVyYXRpbmdBZGQoVCBYLCBUIFksIGJvb2wgKlJlc3VsdE92ZXJmbG93ZWQgPSBudWxscHRyKSB7CisgIGJvb2wgRHVtbXk7CisgIGJvb2wgJk92ZXJmbG93ZWQgPSBSZXN1bHRPdmVyZmxvd2VkID8gKlJlc3VsdE92ZXJmbG93ZWQgOiBEdW1teTsKKyAgLy8gSGFja2VyJ3MgRGVsaWdodCwgcC4gMjkKKyAgVCBaID0gWCArIFk7CisgIE92ZXJmbG93ZWQgPSAoWiA8IFggfHwgWiA8IFkpOworICBpZiAoT3ZlcmZsb3dlZCkKKyAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCk7CisgIGVsc2UKKyAgICByZXR1cm4gWjsKK30KKworLy8vIE11bHRpcGx5IHR3byB1bnNpZ25lZCBpbnRlZ2VycywgWCBhbmQgWSwgb2YgdHlwZSBULiAgQ2xhbXAgdGhlIHJlc3VsdCB0byB0aGUKKy8vLyBtYXhpbXVtIHJlcHJlc2VudGFibGUgdmFsdWUgb2YgVCBvbiBvdmVyZmxvdy4gIFJlc3VsdE92ZXJmbG93ZWQgaW5kaWNhdGVzIGlmCisvLy8gdGhlIHJlc3VsdCBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSByZXByZXNlbnRhYmxlIHZhbHVlIG9mIHR5cGUgVC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc191bnNpZ25lZDxUPjo6dmFsdWUsIFQ+Ojp0eXBlCitTYXR1cmF0aW5nTXVsdGlwbHkoVCBYLCBUIFksIGJvb2wgKlJlc3VsdE92ZXJmbG93ZWQgPSBudWxscHRyKSB7CisgIGJvb2wgRHVtbXk7CisgIGJvb2wgJk92ZXJmbG93ZWQgPSBSZXN1bHRPdmVyZmxvd2VkID8gKlJlc3VsdE92ZXJmbG93ZWQgOiBEdW1teTsKKworICAvLyBIYWNrZXIncyBEZWxpZ2h0LCBwLiAzMCBoYXMgYSBkaWZmZXJlbnQgYWxnb3JpdGhtLCBidXQgd2UgZG9uJ3QgdXNlIHRoYXQKKyAgLy8gYmVjYXVzZSBpdCBmYWlscyBmb3IgdWludDE2X3QgKHdoZXJlIG11bHRpcGxpY2F0aW9uIGNhbiBoYXZlIHVuZGVmaW5lZAorICAvLyBiZWhhdmlvciBkdWUgdG8gcHJvbW90aW9uIHRvIGludCksIGFuZCByZXF1aXJlcyBhIGRpdmlzaW9uIGluIGFkZGl0aW9uCisgIC8vIHRvIHRoZSBtdWx0aXBsaWNhdGlvbi4KKworICBPdmVyZmxvd2VkID0gZmFsc2U7CisKKyAgLy8gTG9nMihaKSB3b3VsZCBiZSBlaXRoZXIgTG9nMlogb3IgTG9nMlogKyAxLgorICAvLyBTcGVjaWFsIGNhc2U6IGlmIFggb3IgWSBpcyAwLCBMb2cyXzY0IGdpdmVzIC0xLCBhbmQgTG9nMloKKyAgLy8gd2lsbCBuZWNlc3NhcmlseSBiZSBsZXNzIHRoYW4gTG9nMk1heCBhcyBkZXNpcmVkLgorICBpbnQgTG9nMlogPSBMb2cyXzY0KFgpICsgTG9nMl82NChZKTsKKyAgY29uc3QgVCBNYXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKTsKKyAgaW50IExvZzJNYXggPSBMb2cyXzY0KE1heCk7CisgIGlmIChMb2cyWiA8IExvZzJNYXgpIHsKKyAgICByZXR1cm4gWCAqIFk7CisgIH0KKyAgaWYgKExvZzJaID4gTG9nMk1heCkgeworICAgIE92ZXJmbG93ZWQgPSB0cnVlOworICAgIHJldHVybiBNYXg7CisgIH0KKworICAvLyBXZSdyZSBnb2luZyB0byB1c2UgdGhlIHRvcCBiaXQsIGFuZCBtYXliZSBvdmVyZmxvdyBvbmUKKyAgLy8gYml0IHBhc3QgaXQuIE11bHRpcGx5IGFsbCBidXQgdGhlIGJvdHRvbSBiaXQgdGhlbiBhZGQKKyAgLy8gdGhhdCBvbiBhdCB0aGUgZW5kLgorICBUIFogPSAoWCA+PiAxKSAqIFk7CisgIGlmIChaICYgfihNYXggPj4gMSkpIHsKKyAgICBPdmVyZmxvd2VkID0gdHJ1ZTsKKyAgICByZXR1cm4gTWF4OworICB9CisgIFogPDw9IDE7CisgIGlmIChYICYgMSkKKyAgICByZXR1cm4gU2F0dXJhdGluZ0FkZChaLCBZLCBSZXN1bHRPdmVyZmxvd2VkKTsKKworICByZXR1cm4gWjsKK30KKworLy8vIE11bHRpcGx5IHR3byB1bnNpZ25lZCBpbnRlZ2VycywgWCBhbmQgWSwgYW5kIGFkZCB0aGUgdW5zaWduZWQgaW50ZWdlciwgQSB0bworLy8vIHRoZSBwcm9kdWN0LiBDbGFtcCB0aGUgcmVzdWx0IHRvIHRoZSBtYXhpbXVtIHJlcHJlc2VudGFibGUgdmFsdWUgb2YgVCBvbgorLy8vIG92ZXJmbG93LiBSZXN1bHRPdmVyZmxvd2VkIGluZGljYXRlcyBpZiB0aGUgcmVzdWx0IGlzIGxhcmdlciB0aGFuIHRoZQorLy8vIG1heGltdW0gcmVwcmVzZW50YWJsZSB2YWx1ZSBvZiB0eXBlIFQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfdW5zaWduZWQ8VD46OnZhbHVlLCBUPjo6dHlwZQorU2F0dXJhdGluZ011bHRpcGx5QWRkKFQgWCwgVCBZLCBUIEEsIGJvb2wgKlJlc3VsdE92ZXJmbG93ZWQgPSBudWxscHRyKSB7CisgIGJvb2wgRHVtbXk7CisgIGJvb2wgJk92ZXJmbG93ZWQgPSBSZXN1bHRPdmVyZmxvd2VkID8gKlJlc3VsdE92ZXJmbG93ZWQgOiBEdW1teTsKKworICBUIFByb2R1Y3QgPSBTYXR1cmF0aW5nTXVsdGlwbHkoWCwgWSwgJk92ZXJmbG93ZWQpOworICBpZiAoT3ZlcmZsb3dlZCkKKyAgICByZXR1cm4gUHJvZHVjdDsKKworICByZXR1cm4gU2F0dXJhdGluZ0FkZChBLCBQcm9kdWN0LCAmT3ZlcmZsb3dlZCk7Cit9CisKKy8vLyBVc2UgdGhpcyByYXRoZXIgdGhhbiBIVUdFX1ZBTEY7IHRoZSBsYXR0ZXIgY2F1c2VzIHdhcm5pbmdzIG9uIE1TVkMuCitleHRlcm4gY29uc3QgZmxvYXQgaHVnZV92YWxmOworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWVtb3J5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWVtb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0MGRjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NZW1vcnkuaApAQCAtMCwwICsxLDE0NSBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9NZW1vcnkuaCAtIE1lbW9yeSBTdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGxsdm06OnN5czo6TWVtb3J5IGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX01FTU9SWV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9NRU1PUllfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzeXMgeworCisgIC8vLyBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyB0aGUgbm90aW9uIG9mIGEgbWVtb3J5IGJsb2NrIHdoaWNoIGhhcyBhbiBhZGRyZXNzCisgIC8vLyBhbmQgYSBzaXplLiBJdCBpcyB1c2VkIGJ5IHRoZSBNZW1vcnkgY2xhc3MgKGEgZnJpZW5kKSBhcyB0aGUgcmVzdWx0IG9mCisgIC8vLyB2YXJpb3VzIG1lbW9yeSBhbGxvY2F0aW9uIG9wZXJhdGlvbnMuCisgIC8vLyBAc2VlIE1lbW9yeQorICAvLy8gQGJyaWVmIE1lbW9yeSBibG9jayBhYnN0cmFjdGlvbi4KKyAgY2xhc3MgTWVtb3J5QmxvY2sgeworICBwdWJsaWM6CisgICAgTWVtb3J5QmxvY2soKSA6IEFkZHJlc3MobnVsbHB0ciksIFNpemUoMCkgeyB9CisgICAgTWVtb3J5QmxvY2sodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpIDogQWRkcmVzcyhhZGRyKSwgU2l6ZShzaXplKSB7IH0KKyAgICB2b2lkICpiYXNlKCkgY29uc3QgeyByZXR1cm4gQWRkcmVzczsgfQorICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCAqQWRkcmVzczsgICAgLy8vPCBBZGRyZXNzIG9mIGZpcnN0IGJ5dGUgb2YgbWVtb3J5IGFyZWEKKyAgICBzaXplX3QgU2l6ZTsgICAgICAvLy88IFNpemUsIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkgYXJlYQorICAgIGZyaWVuZCBjbGFzcyBNZW1vcnk7CisgIH07CisKKyAgLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgdmFyaW91cyBtZW1vcnkgaGFuZGxpbmcgZnVuY3Rpb25zIHRoYXQgbWFuaXB1bGF0ZQorICAvLy8gTWVtb3J5QmxvY2sgaW5zdGFuY2VzLgorICAvLy8gQHNpbmNlIDEuNAorICAvLy8gQGJyaWVmIEFuIGFic3RyYWN0aW9uIGZvciBtZW1vcnkgb3BlcmF0aW9ucy4KKyAgY2xhc3MgTWVtb3J5IHsKKyAgcHVibGljOgorICAgIGVudW0gUHJvdGVjdGlvbkZsYWdzIHsKKyAgICAgIE1GX1JFQUQgID0gMHgxMDAwMDAwLAorICAgICAgTUZfV1JJVEUgPSAweDIwMDAwMDAsCisgICAgICBNRl9FWEVDICA9IDB4NDAwMDAwMAorICAgIH07CisKKyAgICAvLy8gVGhpcyBtZXRob2QgYWxsb2NhdGVzIGEgYmxvY2sgb2YgbWVtb3J5IHRoYXQgaXMgc3VpdGFibGUgZm9yIGxvYWRpbmcKKyAgICAvLy8gZHluYW1pY2FsbHkgZ2VuZXJhdGVkIGNvZGUgKGUuZy4gSklUKS4gQW4gYXR0ZW1wdCB0byBhbGxvY2F0ZQorICAgIC8vLyBccCBOdW1CeXRlcyBieXRlcyBvZiB2aXJ0dWFsIG1lbW9yeSBpcyBtYWRlLgorICAgIC8vLyBccCBOZWFyQmxvY2sgbWF5IHBvaW50IHRvIGFuIGV4aXN0aW5nIGFsbG9jYXRpb24gaW4gd2hpY2ggY2FzZQorICAgIC8vLyBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYWxsb2NhdGUgbW9yZSBtZW1vcnkgbmVhciB0aGUgZXhpc3RpbmcgYmxvY2suCisgICAgLy8vIFRoZSBhY3R1YWwgYWxsb2NhdGVkIGFkZHJlc3MgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgbmVhciB0aGUgcmVxdWVzdGVkCisgICAgLy8vIGFkZHJlc3MuCisgICAgLy8vIFxwIEZsYWdzIGlzIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHByb3RlY3Rpb24gZmxhZ3MgZm9yIHRoZSBibG9jaworICAgIC8vLyBvZiB0aGUgbWVtb3J5LgorICAgIC8vLyBccCBFQyBbb3V0XSByZXR1cm5zIGFuIG9iamVjdCBkZXNjcmliaW5nIGFueSBlcnJvciB0aGF0IG9jY3Vycy4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBtZXRob2QgbWF5IGFsbG9jYXRlIG1vcmUgdGhhbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZC4gIFRoZQorICAgIC8vLyBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBpcyBpbmRpY2F0ZWQgaW4gdGhlIHJldHVybmVkCisgICAgLy8vIE1lbW9yeUJsb2NrLgorICAgIC8vLworICAgIC8vLyBUaGUgc3RhcnQgb2YgdGhlIGFsbG9jYXRlZCBibG9jayBtdXN0IGJlIGFsaWduZWQgd2l0aCB0aGUKKyAgICAvLy8gc3lzdGVtIGFsbG9jYXRpb24gZ3JhbnVsYXJpdHkgKDY0SyBvbiBXaW5kb3dzLCBwYWdlIHNpemUgb24gTGludXgpLgorICAgIC8vLyBJZiB0aGUgYWRkcmVzcyBmb2xsb3dpbmcgXHAgTmVhckJsb2NrIGlzIG5vdCBzbyBhbGlnbmVkLCBpdCB3aWxsIGJlCisgICAgLy8vIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgYWxsb2NhdGlvbiBncmFudWxhcml0eSBib3VuZGFyeS4KKyAgICAvLy8KKyAgICAvLy8gXHIgYSBub24tbnVsbCBNZW1vcnlCbG9jayBpZiB0aGUgZnVuY3Rpb24gd2FzIHN1Y2Nlc3NmdWwsCisgICAgLy8vIG90aGVyd2lzZSBhIG51bGwgTWVtb3J5QmxvY2sgaXMgd2l0aCBccCBFQyBkZXNjcmliaW5nIHRoZSBlcnJvci4KKyAgICAvLy8KKyAgICAvLy8gQGJyaWVmIEFsbG9jYXRlIG1hcHBlZCBtZW1vcnkuCisgICAgc3RhdGljIE1lbW9yeUJsb2NrIGFsbG9jYXRlTWFwcGVkTWVtb3J5KHNpemVfdCBOdW1CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5QmxvY2sgKmNvbnN0IE5lYXJCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZXJyb3JfY29kZSAmRUMpOworCisgICAgLy8vIFRoaXMgbWV0aG9kIHJlbGVhc2VzIGEgYmxvY2sgb2YgbWVtb3J5IHRoYXQgd2FzIGFsbG9jYXRlZCB3aXRoIHRoZQorICAgIC8vLyBhbGxvY2F0ZU1hcHBlZE1lbW9yeSBtZXRob2QuIEl0IHNob3VsZCBub3QgYmUgdXNlZCB0byByZWxlYXNlIGFueQorICAgIC8vLyBtZW1vcnkgYmxvY2sgYWxsb2NhdGVkIGFueSBvdGhlciB3YXkuCisgICAgLy8vIFxwIEJsb2NrIGRlc2NyaWJlcyB0aGUgbWVtb3J5IHRvIGJlIHJlbGVhc2VkLgorICAgIC8vLworICAgIC8vLyBcciBlcnJvcl9zdWNjZXNzIGlmIHRoZSBmdW5jdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgb3IgYW4gZXJyb3JfY29kZQorICAgIC8vLyBkZXNjcmliaW5nIHRoZSBmYWlsdXJlIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICAgIC8vLworICAgIC8vLyBAYnJpZWYgUmVsZWFzZSBtYXBwZWQgbWVtb3J5LgorICAgIHN0YXRpYyBzdGQ6OmVycm9yX2NvZGUgcmVsZWFzZU1hcHBlZE1lbW9yeShNZW1vcnlCbG9jayAmQmxvY2spOworCisgICAgLy8vIFRoaXMgbWV0aG9kIHNldHMgdGhlIHByb3RlY3Rpb24gZmxhZ3MgZm9yIGEgYmxvY2sgb2YgbWVtb3J5IHRvIHRoZQorICAgIC8vLyBzdGF0ZSBzcGVjaWZpZWQgYnkgL3AgRmxhZ3MuICBUaGUgYmVoYXZpb3IgaXMgbm90IHNwZWNpZmllZCBpZiB0aGUKKyAgICAvLy8gbWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIHVzaW5nIHRoZSBhbGxvY2F0ZU1hcHBlZE1lbW9yeSBtZXRob2QuCisgICAgLy8vIFxwIEJsb2NrIGRlc2NyaWJlcyB0aGUgbWVtb3J5IGJsb2NrIHRvIGJlIHByb3RlY3RlZC4KKyAgICAvLy8gXHAgRmxhZ3Mgc3BlY2lmaWVzIHRoZSBuZXcgcHJvdGVjdGlvbiBzdGF0ZSB0byBiZSBhc3NpZ25lZCB0byB0aGUgYmxvY2suCisgICAgLy8vIFxwIEVyck1zZyBbb3V0XSByZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW55IGVycm9yIHRoYXQgb2NjdXJyZWQuCisgICAgLy8vCisgICAgLy8vIElmIFxwIEZsYWdzIGlzIE1GX1dSSVRFLCB0aGUgYWN0dWFsIGJlaGF2aW9yIHZhcmllcworICAgIC8vLyB3aXRoIHRoZSBvcGVyYXRpbmcgc3lzdGVtIChpLmUuIE1GX1JFQUQgfCBNRl9XUklURSBvbiBXaW5kb3dzKSBhbmQgdGhlCisgICAgLy8vIHRhcmdldCBhcmNoaXRlY3R1cmUgKGkuZS4gTUZfV1JJVEUgLT4gTUZfUkVBRCB8IE1GX1dSSVRFIG9uIGkzODYpLgorICAgIC8vLworICAgIC8vLyBcciBlcnJvcl9zdWNjZXNzIGlmIHRoZSBmdW5jdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgb3IgYW4gZXJyb3JfY29kZQorICAgIC8vLyBkZXNjcmliaW5nIHRoZSBmYWlsdXJlIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICAgIC8vLworICAgIC8vLyBAYnJpZWYgU2V0IG1lbW9yeSBwcm90ZWN0aW9uIHN0YXRlLgorICAgIHN0YXRpYyBzdGQ6OmVycm9yX2NvZGUgcHJvdGVjdE1hcHBlZE1lbW9yeShjb25zdCBNZW1vcnlCbG9jayAmQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzKTsKKworICAgIC8vLyBJbnZhbGlkYXRlSW5zdHJ1Y3Rpb25DYWNoZSAtIEJlZm9yZSB0aGUgSklUIGNhbiBydW4gYSBibG9jayBvZiBjb2RlCisgICAgLy8vIHRoYXQgaGFzIGJlZW4gZW1pdHRlZCBpdCBtdXN0IGludmFsaWRhdGUgdGhlIGluc3RydWN0aW9uIGNhY2hlIG9uIHNvbWUKKyAgICAvLy8gcGxhdGZvcm1zLgorICAgIHN0YXRpYyB2b2lkIEludmFsaWRhdGVJbnN0cnVjdGlvbkNhY2hlKGNvbnN0IHZvaWQgKkFkZHIsIHNpemVfdCBMZW4pOworICB9OworCisgIC8vLyBPd25pbmcgdmVyc2lvbiBvZiBNZW1vcnlCbG9jay4KKyAgY2xhc3MgT3duaW5nTWVtb3J5QmxvY2sgeworICBwdWJsaWM6CisgICAgT3duaW5nTWVtb3J5QmxvY2soKSA9IGRlZmF1bHQ7CisgICAgZXhwbGljaXQgT3duaW5nTWVtb3J5QmxvY2soTWVtb3J5QmxvY2sgTSkgOiBNKE0pIHt9CisgICAgT3duaW5nTWVtb3J5QmxvY2soT3duaW5nTWVtb3J5QmxvY2sgJiZPdGhlcikgeworICAgICAgTSA9IE90aGVyLk07CisgICAgICBPdGhlci5NID0gTWVtb3J5QmxvY2soKTsKKyAgICB9CisgICAgT3duaW5nTWVtb3J5QmxvY2smIG9wZXJhdG9yPShPd25pbmdNZW1vcnlCbG9jayAmJk90aGVyKSB7CisgICAgICBNID0gT3RoZXIuTTsKKyAgICAgIE90aGVyLk0gPSBNZW1vcnlCbG9jaygpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICB+T3duaW5nTWVtb3J5QmxvY2soKSB7CisgICAgICBNZW1vcnk6OnJlbGVhc2VNYXBwZWRNZW1vcnkoTSk7CisgICAgfQorICAgIHZvaWQgKmJhc2UoKSBjb25zdCB7IHJldHVybiBNLmJhc2UoKTsgfQorICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gTS5zaXplKCk7IH0KKyAgICBNZW1vcnlCbG9jayBnZXRNZW1vcnlCbG9jaygpIGNvbnN0IHsgcmV0dXJuIE07IH0KKyAgcHJpdmF0ZToKKyAgICBNZW1vcnlCbG9jayBNOworICB9OworCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTdhZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgKQEAgLTAsMCArMSwyODggQEAKKy8vPT09LS0tIE1lbW9yeUJ1ZmZlci5oIC0gTWVtb3J5IEJ1ZmZlciBJbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNZW1vcnlCdWZmZXIgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX01FTU9SWUJVRkZFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9NRU1PUllCVUZGRVJfSAorCisjaW5jbHVkZSAibGx2bS1jL1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DQmluZGluZ1dyYXBwaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yT3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWVtb3J5QnVmZmVyUmVmOworCisvLy8gVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgc2ltcGxlIHJlYWQtb25seSBhY2Nlc3MgdG8gYSBibG9jayBvZiBtZW1vcnksIGFuZAorLy8vIHByb3ZpZGVzIHNpbXBsZSBtZXRob2RzIGZvciByZWFkaW5nIGZpbGVzIGFuZCBzdGFuZGFyZCBpbnB1dCBpbnRvIGEgbWVtb3J5CisvLy8gYnVmZmVyLiAgSW4gYWRkaXRpb24gdG8gYmFzaWMgYWNjZXNzIHRvIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBmaWxlLCB0aGlzCisvLy8gaW50ZXJmYWNlIGd1YXJhbnRlZXMgeW91IGNhbiByZWFkIG9uZSBjaGFyYWN0ZXIgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlLAorLy8vIGFuZCB0aGF0IHRoaXMgY2hhcmFjdGVyIHdpbGwgcmVhZCBhcyAnXDAnLgorLy8vCisvLy8gVGhlICdcMCcgZ3VhcmFudGVlIGlzIG5lZWRlZCB0byBzdXBwb3J0IGFuIG9wdGltaXphdGlvbiAtLSBpdCdzIGludGVuZGVkIHRvCisvLy8gYmUgbW9yZSBlZmZpY2llbnQgZm9yIGNsaWVudHMgd2hpY2ggYXJlIHJlYWRpbmcgYWxsIHRoZSBkYXRhIHRvIHN0b3AKKy8vLyByZWFkaW5nIHdoZW4gdGhleSBlbmNvdW50ZXIgYSAnXDAnIHRoYW4gdG8gY29udGludWFsbHkgY2hlY2sgdGhlIGZpbGUKKy8vLyBwb3NpdGlvbiB0byBzZWUgaWYgaXQgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KK2NsYXNzIE1lbW9yeUJ1ZmZlciB7CisgIGNvbnN0IGNoYXIgKkJ1ZmZlclN0YXJ0OyAvLyBTdGFydCBvZiB0aGUgYnVmZmVyLgorICBjb25zdCBjaGFyICpCdWZmZXJFbmQ7ICAgLy8gRW5kIG9mIHRoZSBidWZmZXIuCisKKworcHJvdGVjdGVkOgorICBNZW1vcnlCdWZmZXIoKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBpbml0KGNvbnN0IGNoYXIgKkJ1ZlN0YXJ0LCBjb25zdCBjaGFyICpCdWZFbmQsCisgICAgICAgICAgICBib29sIFJlcXVpcmVzTnVsbFRlcm1pbmF0b3IpOworCisgIHN0YXRpYyBjb25zdGV4cHIgc3lzOjpmczo6bWFwcGVkX2ZpbGVfcmVnaW9uOjptYXBtb2RlIE1hcG1vZGUgPQorICAgICAgc3lzOjpmczo6bWFwcGVkX2ZpbGVfcmVnaW9uOjpyZWFkb25seTsKKworcHVibGljOgorICBNZW1vcnlCdWZmZXIoY29uc3QgTWVtb3J5QnVmZmVyICYpID0gZGVsZXRlOworICBNZW1vcnlCdWZmZXIgJm9wZXJhdG9yPShjb25zdCBNZW1vcnlCdWZmZXIgJikgPSBkZWxldGU7CisgIHZpcnR1YWwgfk1lbW9yeUJ1ZmZlcigpOworCisgIGNvbnN0IGNoYXIgKmdldEJ1ZmZlclN0YXJ0KCkgY29uc3QgeyByZXR1cm4gQnVmZmVyU3RhcnQ7IH0KKyAgY29uc3QgY2hhciAqZ2V0QnVmZmVyRW5kKCkgY29uc3QgICB7IHJldHVybiBCdWZmZXJFbmQ7IH0KKyAgc2l6ZV90IGdldEJ1ZmZlclNpemUoKSBjb25zdCB7IHJldHVybiBCdWZmZXJFbmQtQnVmZmVyU3RhcnQ7IH0KKworICBTdHJpbmdSZWYgZ2V0QnVmZmVyKCkgY29uc3QgeworICAgIHJldHVybiBTdHJpbmdSZWYoQnVmZmVyU3RhcnQsIGdldEJ1ZmZlclNpemUoKSk7CisgIH0KKworICAvLy8gUmV0dXJuIGFuIGlkZW50aWZpZXIgZm9yIHRoaXMgYnVmZmVyLCB0eXBpY2FsbHkgdGhlIGZpbGVuYW1lIGl0IHdhcyByZWFkCisgIC8vLyBmcm9tLgorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRCdWZmZXJJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gIlVua25vd24gYnVmZmVyIjsgfQorCisgIC8vLyBPcGVuIHRoZSBzcGVjaWZpZWQgZmlsZSBhcyBhIE1lbW9yeUJ1ZmZlciwgcmV0dXJuaW5nIGEgbmV3IE1lbW9yeUJ1ZmZlcgorICAvLy8gaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIHJldHVybmluZyBudWxsLiBJZiBGaWxlU2l6ZSBpcyBzcGVjaWZpZWQsIHRoaXMKKyAgLy8vIG1lYW5zIHRoYXQgdGhlIGNsaWVudCBrbm93cyB0aGF0IHRoZSBmaWxlIGV4aXN0cyBhbmQgdGhhdCBpdCBoYXMgdGhlCisgIC8vLyBzcGVjaWZpZWQgc2l6ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gSXNWb2xhdGlsZSBTZXQgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZQorICAvLy8gY2FuIGNoYW5nZSBvdXRzaWRlIHRoZSB1c2VyJ3MgY29udHJvbCwgZS5nLiB3aGVuIGxpYmNsYW5nIHRyaWVzIHRvIHBhcnNlCisgIC8vLyB3aGlsZSB0aGUgdXNlciBpcyBlZGl0aW5nL3VwZGF0aW5nIHRoZSBmaWxlIG9yIGlmIHRoZSBmaWxlIGlzIG9uIGFuIE5GUy4KKyAgc3RhdGljIEVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4+CisgIGdldEZpbGUoY29uc3QgVHdpbmUgJkZpbGVuYW1lLCBpbnQ2NF90IEZpbGVTaXplID0gLTEsCisgICAgICAgICAgYm9vbCBSZXF1aXJlc051bGxUZXJtaW5hdG9yID0gdHJ1ZSwgYm9vbCBJc1ZvbGF0aWxlID0gZmFsc2UpOworCisgIC8vLyBSZWFkIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGZpbGUgaW50byBhIE1lbW9yeUJ1ZmZlciBhcyBhIHN0cmVhbQorICAvLy8gKGkuZS4gdW50aWwgRU9GIHJlYWNoZWQpLiBUaGlzIGlzIHVzZWZ1bCBmb3Igc3BlY2lhbCBmaWxlcyB0aGF0CisgIC8vLyBsb29rIGxpa2UgYSByZWd1bGFyIGZpbGUgYnV0IGhhdmUgMCBzaXplIChlLmcuIC9wcm9jL2NwdWluZm8gb24gTGludXgpLgorICBzdGF0aWMgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPj4KKyAgZ2V0RmlsZUFzU3RyZWFtKGNvbnN0IFR3aW5lICZGaWxlbmFtZSk7CisKKyAgLy8vIEdpdmVuIGFuIGFscmVhZHktb3BlbiBmaWxlIGRlc2NyaXB0b3IsIG1hcCBzb21lIHNsaWNlIG9mIGl0IGludG8gYQorICAvLy8gTWVtb3J5QnVmZmVyLiBUaGUgc2xpY2UgaXMgc3BlY2lmaWVkIGJ5IGFuIFxwIE9mZnNldCBhbmQgXHAgTWFwU2l6ZS4KKyAgLy8vIFNpbmNlIHRoaXMgaXMgaW4gdGhlIG1pZGRsZSBvZiBhIGZpbGUsIHRoZSBidWZmZXIgaXMgbm90IG51bGwgdGVybWluYXRlZC4KKyAgc3RhdGljIEVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4+CisgIGdldE9wZW5GaWxlU2xpY2UoaW50IEZELCBjb25zdCBUd2luZSAmRmlsZW5hbWUsIHVpbnQ2NF90IE1hcFNpemUsCisgICAgICAgICAgICAgICAgICAgaW50NjRfdCBPZmZzZXQsIGJvb2wgSXNWb2xhdGlsZSA9IGZhbHNlKTsKKworICAvLy8gR2l2ZW4gYW4gYWxyZWFkeS1vcGVuIGZpbGUgZGVzY3JpcHRvciwgcmVhZCB0aGUgZmlsZSBhbmQgcmV0dXJuIGEKKyAgLy8vIE1lbW9yeUJ1ZmZlci4KKyAgLy8vCisgIC8vLyBccGFyYW0gSXNWb2xhdGlsZSBTZXQgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZQorICAvLy8gY2FuIGNoYW5nZSBvdXRzaWRlIHRoZSB1c2VyJ3MgY29udHJvbCwgZS5nLiB3aGVuIGxpYmNsYW5nIHRyaWVzIHRvIHBhcnNlCisgIC8vLyB3aGlsZSB0aGUgdXNlciBpcyBlZGl0aW5nL3VwZGF0aW5nIHRoZSBmaWxlIG9yIGlmIHRoZSBmaWxlIGlzIG9uIGFuIE5GUy4KKyAgc3RhdGljIEVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4+CisgIGdldE9wZW5GaWxlKGludCBGRCwgY29uc3QgVHdpbmUgJkZpbGVuYW1lLCB1aW50NjRfdCBGaWxlU2l6ZSwKKyAgICAgICAgICAgICAgYm9vbCBSZXF1aXJlc051bGxUZXJtaW5hdG9yID0gdHJ1ZSwgYm9vbCBJc1ZvbGF0aWxlID0gZmFsc2UpOworCisgIC8vLyBPcGVuIHRoZSBzcGVjaWZpZWQgbWVtb3J5IHJhbmdlIGFzIGEgTWVtb3J5QnVmZmVyLiBOb3RlIHRoYXQgSW5wdXREYXRhCisgIC8vLyBtdXN0IGJlIG51bGwgdGVybWluYXRlZCBpZiBSZXF1aXJlc051bGxUZXJtaW5hdG9yIGlzIHRydWUuCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPgorICBnZXRNZW1CdWZmZXIoU3RyaW5nUmVmIElucHV0RGF0YSwgU3RyaW5nUmVmIEJ1ZmZlck5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgIGJvb2wgUmVxdWlyZXNOdWxsVGVybWluYXRvciA9IHRydWUpOworCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPgorICBnZXRNZW1CdWZmZXIoTWVtb3J5QnVmZmVyUmVmIFJlZiwgYm9vbCBSZXF1aXJlc051bGxUZXJtaW5hdG9yID0gdHJ1ZSk7CisKKyAgLy8vIE9wZW4gdGhlIHNwZWNpZmllZCBtZW1vcnkgcmFuZ2UgYXMgYSBNZW1vcnlCdWZmZXIsIGNvcHlpbmcgdGhlIGNvbnRlbnRzCisgIC8vLyBhbmQgdGFraW5nIG93bmVyc2hpcCBvZiBpdC4gSW5wdXREYXRhIGRvZXMgbm90IGhhdmUgdG8gYmUgbnVsbCB0ZXJtaW5hdGVkLgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4KKyAgZ2V0TWVtQnVmZmVyQ29weShTdHJpbmdSZWYgSW5wdXREYXRhLCBjb25zdCBUd2luZSAmQnVmZmVyTmFtZSA9ICIiKTsKKworICAvLy8gUmVhZCBhbGwgb2Ygc3RkaW4gaW50byBhIGZpbGUgYnVmZmVyLCBhbmQgcmV0dXJuIGl0LgorICBzdGF0aWMgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPj4gZ2V0U1RESU4oKTsKKworICAvLy8gT3BlbiB0aGUgc3BlY2lmaWVkIGZpbGUgYXMgYSBNZW1vcnlCdWZmZXIsIG9yIG9wZW4gc3RkaW4gaWYgdGhlIEZpbGVuYW1lCisgIC8vLyBpcyAiLSIuCisgIHN0YXRpYyBFcnJvck9yPHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+PgorICBnZXRGaWxlT3JTVERJTihjb25zdCBUd2luZSAmRmlsZW5hbWUsIGludDY0X3QgRmlsZVNpemUgPSAtMSwKKyAgICAgICAgICAgICAgICAgYm9vbCBSZXF1aXJlc051bGxUZXJtaW5hdG9yID0gdHJ1ZSk7CisKKyAgLy8vIE1hcCBhIHN1YnJhbmdlIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSBhcyBhIE1lbW9yeUJ1ZmZlci4KKyAgc3RhdGljIEVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4+CisgIGdldEZpbGVTbGljZShjb25zdCBUd2luZSAmRmlsZW5hbWUsIHVpbnQ2NF90IE1hcFNpemUsIHVpbnQ2NF90IE9mZnNldCwKKyAgICAgICAgICAgICAgIGJvb2wgSXNWb2xhdGlsZSA9IGZhbHNlKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUHJvdmlkZWQgZm9yIHBlcmZvcm1hbmNlIGFuYWx5c2lzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gVGhlIGtpbmQgb2YgbWVtb3J5IGJhY2tpbmcgdXNlZCB0byBzdXBwb3J0IHRoZSBNZW1vcnlCdWZmZXIuCisgIGVudW0gQnVmZmVyS2luZCB7CisgICAgTWVtb3J5QnVmZmVyX01hbGxvYywKKyAgICBNZW1vcnlCdWZmZXJfTU1hcAorICB9OworCisgIC8vLyBSZXR1cm4gaW5mb3JtYXRpb24gb24gdGhlIG1lbW9yeSBtZWNoYW5pc20gdXNlZCB0byBzdXBwb3J0IHRoZQorICAvLy8gTWVtb3J5QnVmZmVyLgorICB2aXJ0dWFsIEJ1ZmZlcktpbmQgZ2V0QnVmZmVyS2luZCgpIGNvbnN0ID0gMDsKKworICBNZW1vcnlCdWZmZXJSZWYgZ2V0TWVtQnVmZmVyUmVmKCkgY29uc3Q7Cit9OworCisvLy8gVGhpcyBjbGFzcyBpcyBhbiBleHRlbnNpb24gb2YgTWVtb3J5QnVmZmVyLCB3aGljaCBhbGxvd3MgY29weS1vbi13cml0ZQorLy8vIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBjb250ZW50cy4gIEl0IG9ubHkgc3VwcG9ydHMgY3JlYXRpb24gbWV0aG9kcyB0aGF0CisvLy8gYXJlIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHdyaXRhYmxlIGJ1ZmZlci4gIEZvciBleGFtcGxlLCBtYXBwaW5nIGEgZmlsZQorLy8vIHJlYWQtb25seSBpcyBub3Qgc3VwcG9ydGVkLgorY2xhc3MgV3JpdGFibGVNZW1vcnlCdWZmZXIgOiBwdWJsaWMgTWVtb3J5QnVmZmVyIHsKK3Byb3RlY3RlZDoKKyAgV3JpdGFibGVNZW1vcnlCdWZmZXIoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIGNvbnN0ZXhwciBzeXM6OmZzOjptYXBwZWRfZmlsZV9yZWdpb246Om1hcG1vZGUgTWFwbW9kZSA9CisgICAgICBzeXM6OmZzOjptYXBwZWRfZmlsZV9yZWdpb246OnByaXY7CisKK3B1YmxpYzoKKyAgdXNpbmcgTWVtb3J5QnVmZmVyOjpnZXRCdWZmZXI7CisgIHVzaW5nIE1lbW9yeUJ1ZmZlcjo6Z2V0QnVmZmVyRW5kOworICB1c2luZyBNZW1vcnlCdWZmZXI6OmdldEJ1ZmZlclN0YXJ0OworCisgIC8vIGNvbnN0X2Nhc3QgaXMgd2VsbC1kZWZpbmVkIGhlcmUsIGJlY2F1c2UgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlzCisgIC8vIGd1YXJhbnRlZWQgdG8gaGF2ZSBiZWVuIGluaXRpYWxpemVkIHdpdGggYSBtdXRhYmxlIGJ1ZmZlci4KKyAgY2hhciAqZ2V0QnVmZmVyU3RhcnQoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y2hhciAqPihNZW1vcnlCdWZmZXI6OmdldEJ1ZmZlclN0YXJ0KCkpOworICB9CisgIGNoYXIgKmdldEJ1ZmZlckVuZCgpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxjaGFyICo+KE1lbW9yeUJ1ZmZlcjo6Z2V0QnVmZmVyRW5kKCkpOworICB9CisgIE11dGFibGVBcnJheVJlZjxjaGFyPiBnZXRCdWZmZXIoKSB7CisgICAgcmV0dXJuIHtnZXRCdWZmZXJTdGFydCgpLCBnZXRCdWZmZXJFbmQoKX07CisgIH0KKworICBzdGF0aWMgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8V3JpdGFibGVNZW1vcnlCdWZmZXI+PgorICBnZXRGaWxlKGNvbnN0IFR3aW5lICZGaWxlbmFtZSwgaW50NjRfdCBGaWxlU2l6ZSA9IC0xLAorICAgICAgICAgIGJvb2wgSXNWb2xhdGlsZSA9IGZhbHNlKTsKKworICAvLy8gTWFwIGEgc3VicmFuZ2Ugb2YgdGhlIHNwZWNpZmllZCBmaWxlIGFzIGEgV3JpdGFibGVNZW1vcnlCdWZmZXIuCisgIHN0YXRpYyBFcnJvck9yPHN0ZDo6dW5pcXVlX3B0cjxXcml0YWJsZU1lbW9yeUJ1ZmZlcj4+CisgIGdldEZpbGVTbGljZShjb25zdCBUd2luZSAmRmlsZW5hbWUsIHVpbnQ2NF90IE1hcFNpemUsIHVpbnQ2NF90IE9mZnNldCwKKyAgICAgICAgICAgICAgIGJvb2wgSXNWb2xhdGlsZSA9IGZhbHNlKTsKKworICAvLy8gQWxsb2NhdGUgYSBuZXcgTWVtb3J5QnVmZmVyIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSB0aGF0IGlzIG5vdCBpbml0aWFsaXplZC4KKyAgLy8vIE5vdGUgdGhhdCB0aGUgY2FsbGVyIHNob3VsZCBpbml0aWFsaXplIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMKKyAgLy8vIG1ldGhvZC4gVGhlIG1lbW9yeSBpcyBvd25lZCBieSB0aGUgTWVtb3J5QnVmZmVyIG9iamVjdC4KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxXcml0YWJsZU1lbW9yeUJ1ZmZlcj4KKyAgZ2V0TmV3VW5pbml0TWVtQnVmZmVyKHNpemVfdCBTaXplLCBjb25zdCBUd2luZSAmQnVmZmVyTmFtZSA9ICIiKTsKKworICAvLy8gQWxsb2NhdGUgYSBuZXcgemVyby1pbml0aWFsaXplZCBNZW1vcnlCdWZmZXIgb2YgdGhlIHNwZWNpZmllZCBzaXplLiBOb3RlCisgIC8vLyB0aGF0IHRoZSBjYWxsZXIgbmVlZCBub3QgaW5pdGlhbGl6ZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGlzIG1ldGhvZC4KKyAgLy8vIFRoZSBtZW1vcnkgaXMgb3duZWQgYnkgdGhlIE1lbW9yeUJ1ZmZlciBvYmplY3QuCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8V3JpdGFibGVNZW1vcnlCdWZmZXI+CisgIGdldE5ld01lbUJ1ZmZlcihzaXplX3QgU2l6ZSwgY29uc3QgVHdpbmUgJkJ1ZmZlck5hbWUgPSAiIik7CisKK3ByaXZhdGU6CisgIC8vIEhpZGUgdGhlc2UgYmFzZSBjbGFzcyBmYWN0b3J5IGZ1bmN0aW9uIHNvIG9uZSBjYW4ndCB3cml0ZQorICAvLyAgIFdyaXRhYmxlTWVtb3J5QnVmZmVyOjpnZXRYWFgoKQorICAvLyBhbmQgYmUgc3VycHJpc2VkIHRoYXQgaGUgZ290IGEgcmVhZC1vbmx5IEJ1ZmZlci4KKyAgdXNpbmcgTWVtb3J5QnVmZmVyOjpnZXRGaWxlQXNTdHJlYW07CisgIHVzaW5nIE1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZU9yU1RESU47CisgIHVzaW5nIE1lbW9yeUJ1ZmZlcjo6Z2V0TWVtQnVmZmVyOworICB1c2luZyBNZW1vcnlCdWZmZXI6OmdldE1lbUJ1ZmZlckNvcHk7CisgIHVzaW5nIE1lbW9yeUJ1ZmZlcjo6Z2V0T3BlbkZpbGU7CisgIHVzaW5nIE1lbW9yeUJ1ZmZlcjo6Z2V0T3BlbkZpbGVTbGljZTsKKyAgdXNpbmcgTWVtb3J5QnVmZmVyOjpnZXRTVERJTjsKK307CisKKy8vLyBUaGlzIGNsYXNzIGlzIGFuIGV4dGVuc2lvbiBvZiBNZW1vcnlCdWZmZXIsIHdoaWNoIGFsbG93cyB3cml0ZSBhY2Nlc3MgdG8KKy8vLyB0aGUgdW5kZXJseWluZyBjb250ZW50cyBhbmQgY29tbWl0dGluZyB0aG9zZSBjaGFuZ2VzIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UuCisvLy8gSXQgb25seSBzdXBwb3J0cyBjcmVhdGlvbiBtZXRob2RzIHRoYXQgYXJlIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHdyaXRhYmxlCisvLy8gYnVmZmVyLiAgRm9yIGV4YW1wbGUsIG1hcHBpbmcgYSBmaWxlIHJlYWQtb25seSBpcyBub3Qgc3VwcG9ydGVkLgorY2xhc3MgV3JpdGVUaHJvdWdoTWVtb3J5QnVmZmVyIDogcHVibGljIE1lbW9yeUJ1ZmZlciB7Citwcm90ZWN0ZWQ6CisgIFdyaXRlVGhyb3VnaE1lbW9yeUJ1ZmZlcigpID0gZGVmYXVsdDsKKworICBzdGF0aWMgY29uc3RleHByIHN5czo6ZnM6Om1hcHBlZF9maWxlX3JlZ2lvbjo6bWFwbW9kZSBNYXBtb2RlID0KKyAgICAgIHN5czo6ZnM6Om1hcHBlZF9maWxlX3JlZ2lvbjo6cmVhZHdyaXRlOworCitwdWJsaWM6CisgIHVzaW5nIE1lbW9yeUJ1ZmZlcjo6Z2V0QnVmZmVyOworICB1c2luZyBNZW1vcnlCdWZmZXI6OmdldEJ1ZmZlckVuZDsKKyAgdXNpbmcgTWVtb3J5QnVmZmVyOjpnZXRCdWZmZXJTdGFydDsKKworICAvLyBjb25zdF9jYXN0IGlzIHdlbGwtZGVmaW5lZCBoZXJlLCBiZWNhdXNlIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBpcworICAvLyBndWFyYW50ZWVkIHRvIGhhdmUgYmVlbiBpbml0aWFsaXplZCB3aXRoIGEgbXV0YWJsZSBidWZmZXIuCisgIGNoYXIgKmdldEJ1ZmZlclN0YXJ0KCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PGNoYXIgKj4oTWVtb3J5QnVmZmVyOjpnZXRCdWZmZXJTdGFydCgpKTsKKyAgfQorICBjaGFyICpnZXRCdWZmZXJFbmQoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y2hhciAqPihNZW1vcnlCdWZmZXI6OmdldEJ1ZmZlckVuZCgpKTsKKyAgfQorICBNdXRhYmxlQXJyYXlSZWY8Y2hhcj4gZ2V0QnVmZmVyKCkgeworICAgIHJldHVybiB7Z2V0QnVmZmVyU3RhcnQoKSwgZ2V0QnVmZmVyRW5kKCl9OworICB9CisKKyAgc3RhdGljIEVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPFdyaXRlVGhyb3VnaE1lbW9yeUJ1ZmZlcj4+CisgIGdldEZpbGUoY29uc3QgVHdpbmUgJkZpbGVuYW1lLCBpbnQ2NF90IEZpbGVTaXplID0gLTEpOworCisgIC8vLyBNYXAgYSBzdWJyYW5nZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUgYXMgYSBSZWFkV3JpdGVNZW1vcnlCdWZmZXIuCisgIHN0YXRpYyBFcnJvck9yPHN0ZDo6dW5pcXVlX3B0cjxXcml0ZVRocm91Z2hNZW1vcnlCdWZmZXI+PgorICBnZXRGaWxlU2xpY2UoY29uc3QgVHdpbmUgJkZpbGVuYW1lLCB1aW50NjRfdCBNYXBTaXplLCB1aW50NjRfdCBPZmZzZXQpOworCitwcml2YXRlOgorICAvLyBIaWRlIHRoZXNlIGJhc2UgY2xhc3MgZmFjdG9yeSBmdW5jdGlvbiBzbyBvbmUgY2FuJ3Qgd3JpdGUKKyAgLy8gICBXcml0YWJsZU1lbW9yeUJ1ZmZlcjo6Z2V0WFhYKCkKKyAgLy8gYW5kIGJlIHN1cnByaXNlZCB0aGF0IGhlIGdvdCBhIHJlYWQtb25seSBCdWZmZXIuCisgIHVzaW5nIE1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZUFzU3RyZWFtOworICB1c2luZyBNZW1vcnlCdWZmZXI6OmdldEZpbGVPclNURElOOworICB1c2luZyBNZW1vcnlCdWZmZXI6OmdldE1lbUJ1ZmZlcjsKKyAgdXNpbmcgTWVtb3J5QnVmZmVyOjpnZXRNZW1CdWZmZXJDb3B5OworICB1c2luZyBNZW1vcnlCdWZmZXI6OmdldE9wZW5GaWxlOworICB1c2luZyBNZW1vcnlCdWZmZXI6OmdldE9wZW5GaWxlU2xpY2U7CisgIHVzaW5nIE1lbW9yeUJ1ZmZlcjo6Z2V0U1RESU47Cit9OworCitjbGFzcyBNZW1vcnlCdWZmZXJSZWYgeworICBTdHJpbmdSZWYgQnVmZmVyOworICBTdHJpbmdSZWYgSWRlbnRpZmllcjsKKworcHVibGljOgorICBNZW1vcnlCdWZmZXJSZWYoKSA9IGRlZmF1bHQ7CisgIE1lbW9yeUJ1ZmZlclJlZihNZW1vcnlCdWZmZXImIEJ1ZmZlcikKKyAgICAgIDogQnVmZmVyKEJ1ZmZlci5nZXRCdWZmZXIoKSksIElkZW50aWZpZXIoQnVmZmVyLmdldEJ1ZmZlcklkZW50aWZpZXIoKSkge30KKyAgTWVtb3J5QnVmZmVyUmVmKFN0cmluZ1JlZiBCdWZmZXIsIFN0cmluZ1JlZiBJZGVudGlmaWVyKQorICAgICAgOiBCdWZmZXIoQnVmZmVyKSwgSWRlbnRpZmllcihJZGVudGlmaWVyKSB7fQorCisgIFN0cmluZ1JlZiBnZXRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBCdWZmZXI7IH0KKworICBTdHJpbmdSZWYgZ2V0QnVmZmVySWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIElkZW50aWZpZXI7IH0KKworICBjb25zdCBjaGFyICpnZXRCdWZmZXJTdGFydCgpIGNvbnN0IHsgcmV0dXJuIEJ1ZmZlci5iZWdpbigpOyB9CisgIGNvbnN0IGNoYXIgKmdldEJ1ZmZlckVuZCgpIGNvbnN0IHsgcmV0dXJuIEJ1ZmZlci5lbmQoKTsgfQorICBzaXplX3QgZ2V0QnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEJ1ZmZlci5zaXplKCk7IH0KK307CisKKy8vIENyZWF0ZSB3cmFwcGVycyBmb3IgQyBCaW5kaW5nIHR5cGVzIChzZWUgQ0JpbmRpbmdXcmFwcGluZy5oKS4KK0RFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlMoTWVtb3J5QnVmZmVyLCBMTFZNTWVtb3J5QnVmZmVyUmVmKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX01FTU9SWUJVRkZFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWlwc0FCSUZsYWdzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWlwc0FCSUZsYWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlNjJlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NaXBzQUJJRmxhZ3MuaApAQCAtMCwwICsxLDEwMyBAQAorLy89PT0tLS0gTWlwc0FCSUZsYWdzLmggLSBNSVBTIEFCSSBmbGFncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgY29uc3RhbnRzIGZvciB0aGUgQUJJIGZsYWdzIHN0cnVjdHVyZSBjb250YWluZWQKKy8vIGluIHRoZSAuTUlQUy5hYmlmbGFncyBzZWN0aW9uLgorLy8KKy8vIGh0dHBzOi8vZG16LXBvcnRhbC5taXBzLmNvbS93aWtpL01JUFNfTzMyX0FCSV8tX0ZSMF9hbmRfRlIxX0ludGVybGlua2luZworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX01JUFNBQklGTEFHU19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9NSVBTQUJJRkxBR1NfSAorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgTWlwcyB7CisKKy8vIFZhbHVlcyBmb3IgdGhlIHh4eF9zaXplIGJ5dGVzIG9mIGFuIEFCSSBmbGFncyBzdHJ1Y3R1cmUuCitlbnVtIEFGTF9SRUcgeworICBBRkxfUkVHX05PTkUgPSAweDAwLCAvLyBObyByZWdpc3RlcnMKKyAgQUZMX1JFR18zMiA9IDB4MDEsICAgLy8gMzItYml0IHJlZ2lzdGVycworICBBRkxfUkVHXzY0ID0gMHgwMiwgICAvLyA2NC1iaXQgcmVnaXN0ZXJzCisgIEFGTF9SRUdfMTI4ID0gMHgwMyAgIC8vIDEyOC1iaXQgcmVnaXN0ZXJzCit9OworCisvLyBNYXNrcyBmb3IgdGhlIGFzZXMgd29yZCBvZiBhbiBBQkkgZmxhZ3Mgc3RydWN0dXJlLgorZW51bSBBRkxfQVNFIHsKKyAgQUZMX0FTRV9EU1AgPSAweDAwMDAwMDAxLCAgICAgICAvLyBEU1AgQVNFCisgIEFGTF9BU0VfRFNQUjIgPSAweDAwMDAwMDAyLCAgICAgLy8gRFNQIFIyIEFTRQorICBBRkxfQVNFX0VWQSA9IDB4MDAwMDAwMDQsICAgICAgIC8vIEVuaGFuY2VkIFZBIFNjaGVtZQorICBBRkxfQVNFX01DVSA9IDB4MDAwMDAwMDgsICAgICAgIC8vIE1DVSAoTWljcm9Db250cm9sbGVyKSBBU0UKKyAgQUZMX0FTRV9NRE1YID0gMHgwMDAwMDAxMCwgICAgICAvLyBNRE1YIEFTRQorICBBRkxfQVNFX01JUFMzRCA9IDB4MDAwMDAwMjAsICAgIC8vIE1JUFMtM0QgQVNFCisgIEFGTF9BU0VfTVQgPSAweDAwMDAwMDQwLCAgICAgICAgLy8gTVQgQVNFCisgIEFGTF9BU0VfU01BUlRNSVBTID0gMHgwMDAwMDA4MCwgLy8gU21hcnRNSVBTIEFTRQorICBBRkxfQVNFX1ZJUlQgPSAweDAwMDAwMTAwLCAgICAgIC8vIFZaIEFTRQorICBBRkxfQVNFX01TQSA9IDB4MDAwMDAyMDAsICAgICAgIC8vIE1TQSBBU0UKKyAgQUZMX0FTRV9NSVBTMTYgPSAweDAwMDAwNDAwLCAgICAvLyBNSVBTMTYgQVNFCisgIEFGTF9BU0VfTUlDUk9NSVBTID0gMHgwMDAwMDgwMCwgLy8gTUlDUk9NSVBTIEFTRQorICBBRkxfQVNFX1hQQSA9IDB4MDAwMDEwMDAsICAgICAgIC8vIFhQQSBBU0UKKyAgQUZMX0FTRV9DUkMgPSAweDAwMDA4MDAwICAgICAgICAvLyBDUkMgQVNFCit9OworCisvLyBWYWx1ZXMgZm9yIHRoZSBpc2FfZXh0IHdvcmQgb2YgYW4gQUJJIGZsYWdzIHN0cnVjdHVyZS4KK2VudW0gQUZMX0VYVCB7CisgIEFGTF9FWFRfTk9ORSA9IDAsICAgICAgICAgLy8gTm9uZQorICBBRkxfRVhUX1hMUiA9IDEsICAgICAgICAgIC8vIFJNSSBYbHIgaW5zdHJ1Y3Rpb24KKyAgQUZMX0VYVF9PQ1RFT04yID0gMiwgICAgICAvLyBDYXZpdW0gTmV0d29ya3MgT2N0ZW9uMgorICBBRkxfRVhUX09DVEVPTlAgPSAzLCAgICAgIC8vIENhdml1bSBOZXR3b3JrcyBPY3Rlb25QCisgIEFGTF9FWFRfTE9PTkdTT05fM0EgPSA0LCAgLy8gTG9vbmdzb24gM0EKKyAgQUZMX0VYVF9PQ1RFT04gPSA1LCAgICAgICAvLyBDYXZpdW0gTmV0d29ya3MgT2N0ZW9uCisgIEFGTF9FWFRfNTkwMCA9IDYsICAgICAgICAgLy8gTUlQUyBSNTkwMCBpbnN0cnVjdGlvbgorICBBRkxfRVhUXzQ2NTAgPSA3LCAgICAgICAgIC8vIE1JUFMgUjQ2NTAgaW5zdHJ1Y3Rpb24KKyAgQUZMX0VYVF80MDEwID0gOCwgICAgICAgICAvLyBMU0kgUjQwMTAgaW5zdHJ1Y3Rpb24KKyAgQUZMX0VYVF80MTAwID0gOSwgICAgICAgICAvLyBORUMgVlI0MTAwIGluc3RydWN0aW9uCisgIEFGTF9FWFRfMzkwMCA9IDEwLCAgICAgICAgLy8gVG9zaGliYSBSMzkwMCBpbnN0cnVjdGlvbgorICBBRkxfRVhUXzEwMDAwID0gMTEsICAgICAgIC8vIE1JUFMgUjEwMDAwIGluc3RydWN0aW9uCisgIEFGTF9FWFRfU0IxID0gMTIsICAgICAgICAgLy8gQnJvYWRjb20gU0ItMSBpbnN0cnVjdGlvbgorICBBRkxfRVhUXzQxMTEgPSAxMywgICAgICAgIC8vIE5FQyBWUjQxMTEvVlI0MTgxIGluc3RydWN0aW9uCisgIEFGTF9FWFRfNDEyMCA9IDE0LCAgICAgICAgLy8gTkVDIFZSNDEyMCBpbnN0cnVjdGlvbgorICBBRkxfRVhUXzU0MDAgPSAxNSwgICAgICAgIC8vIE5FQyBWUjU0MDAgaW5zdHJ1Y3Rpb24KKyAgQUZMX0VYVF81NTAwID0gMTYsICAgICAgICAvLyBORUMgVlI1NTAwIGluc3RydWN0aW9uCisgIEFGTF9FWFRfTE9PTkdTT05fMkUgPSAxNywgLy8gU1QgTWljcm9lbGVjdHJvbmljcyBMb29uZ3NvbiAyRQorICBBRkxfRVhUX0xPT05HU09OXzJGID0gMTgsIC8vIFNUIE1pY3JvZWxlY3Ryb25pY3MgTG9vbmdzb24gMkYKKyAgQUZMX0VYVF9PQ1RFT04zID0gMTkgICAgICAvLyBDYXZpdW0gTmV0d29ya3MgT2N0ZW9uMworfTsKKworLy8gVmFsdWVzIGZvciB0aGUgZmxhZ3MxIHdvcmQgb2YgYW4gQUJJIGZsYWdzIHN0cnVjdHVyZS4KK2VudW0gQUZMX0ZMQUdTMSB7IEFGTF9GTEFHUzFfT0REU1BSRUcgPSAxIH07CisKKy8vIE1JUFMgb2JqZWN0IGF0dHJpYnV0ZSB0YWdzCitlbnVtIHsKKyAgVGFnX0dOVV9NSVBTX0FCSV9GUCA9IDQsICAvLyBGbG9hdGluZy1wb2ludCBBQkkgdXNlZCBieSB0aGlzIG9iamVjdCBmaWxlCisgIFRhZ19HTlVfTUlQU19BQklfTVNBID0gOCwgLy8gTVNBIEFCSSB1c2VkIGJ5IHRoaXMgb2JqZWN0IGZpbGUKK307CisKKy8vIFZhbHVlcyBmb3IgdGhlIGZwX2FiaSB3b3JkIG9mIGFuIEFCSSBmbGFncyBzdHJ1Y3R1cmUKKy8vIGFuZCBmb3IgdGhlIFRhZ19HTlVfTUlQU19BQklfRlAgYXR0cmlidXRlIHRhZy4KK2VudW0gVmFsX0dOVV9NSVBTX0FCSV9GUCB7CisgIFZhbF9HTlVfTUlQU19BQklfRlBfQU5ZID0gMCwgICAgLy8gbm90IHRhZ2dlZAorICBWYWxfR05VX01JUFNfQUJJX0ZQX0RPVUJMRSA9IDEsIC8vIGhhcmQgZmxvYXQgLyAtbWRvdWJsZS1mbG9hdAorICBWYWxfR05VX01JUFNfQUJJX0ZQX1NJTkdMRSA9IDIsIC8vIGhhcmQgZmxvYXQgLyAtbXNpbmdsZS1mbG9hdAorICBWYWxfR05VX01JUFNfQUJJX0ZQX1NPRlQgPSAzLCAgIC8vIHNvZnQgZmxvYXQKKyAgVmFsX0dOVV9NSVBTX0FCSV9GUF9PTERfNjQgPSA0LCAvLyAtbWlwczMycjIgLW1mcDY0CisgIFZhbF9HTlVfTUlQU19BQklfRlBfWFggPSA1LCAgICAgLy8gLW1mcHh4CisgIFZhbF9HTlVfTUlQU19BQklfRlBfNjQgPSA2LCAgICAgLy8gLW1pcHMzMnIyIC1tZnA2NAorICBWYWxfR05VX01JUFNfQUJJX0ZQXzY0QSA9IDcgICAgIC8vIC1taXBzMzJyMiAtbWZwNjQgLW1uby1vZGQtc3ByZWcKK307CisKKy8vIFZhbHVlcyBmb3IgdGhlIFRhZ19HTlVfTUlQU19BQklfTVNBIGF0dHJpYnV0ZSB0YWcuCitlbnVtIFZhbF9HTlVfTUlQU19BQklfTVNBIHsKKyAgVmFsX0dOVV9NSVBTX0FCSV9NU0FfQU5ZID0gMCwgLy8gbm90IHRhZ2dlZAorICBWYWxfR05VX01JUFNfQUJJX01TQV8xMjggPSAxICAvLyAxMjgtYml0IE1TQQorfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTXV0ZXguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNGU2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTXV0ZXguaApAQCAtMCwwICsxLDE1OCBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9NdXRleC5oIC0gTXV0ZXggT3BlcmF0aW5nIFN5c3RlbSBDb25jZXB0IC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBsbHZtOjpzeXM6Ok11dGV4IGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX01VVEVYX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX01VVEVYX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9UaHJlYWRpbmcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bQoreworICBuYW1lc3BhY2Ugc3lzCisgIHsKKyAgICAvLy8gQGJyaWVmIFBsYXRmb3JtIGFnbm9zdGljIE11dGV4IGNsYXNzLgorICAgIGNsYXNzIE11dGV4SW1wbAorICAgIHsKKyAgICAvLy8gQG5hbWUgQ29uc3RydWN0b3JzCisgICAgLy8vIEB7CisgICAgcHVibGljOgorCisgICAgICAvLy8gSW5pdGlhbGl6ZXMgdGhlIGxvY2sgYnV0IGRvZXNuJ3QgYWNxdWlyZSBpdC4gaWYgXHAgcmVjdXJzaXZlIGlzIHNldAorICAgICAgLy8vIHRvIGZhbHNlLCB0aGUgbG9jayB3aWxsIG5vdCBiZSByZWN1cnNpdmUgd2hpY2ggbWFrZXMgaXQgY2hlYXBlciBidXQKKyAgICAgIC8vLyBhbHNvIG1vcmUgbGlrZWx5IHRvIGRlYWRsb2NrIChzYW1lIHRocmVhZCBjYW4ndCBhY3F1aXJlIG1vcmUgdGhhbgorICAgICAgLy8vIG9uY2UpLgorICAgICAgLy8vIEBicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgICAgZXhwbGljaXQgTXV0ZXhJbXBsKGJvb2wgcmVjdXJzaXZlID0gdHJ1ZSk7CisKKyAgICAgIC8vLyBSZWxlYXNlcyBhbmQgcmVtb3ZlcyB0aGUgbG9jaworICAgICAgLy8vIEBicmllZiBEZXN0cnVjdG9yCisgICAgICB+TXV0ZXhJbXBsKCk7CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgTWV0aG9kcworICAgIC8vLyBAeworICAgIHB1YmxpYzoKKworICAgICAgLy8vIEF0dGVtcHRzIHRvIHVuY29uZGl0aW9uYWxseSBhY3F1aXJlIHRoZSBsb2NrLiBJZiB0aGUgbG9jayBpcyBoZWxkIGJ5CisgICAgICAvLy8gYW5vdGhlciB0aHJlYWQsIHRoaXMgbWV0aG9kIHdpbGwgd2FpdCB1bnRpbCBpdCBjYW4gYWNxdWlyZSB0aGUgbG9jay4KKyAgICAgIC8vLyBAcmV0dXJucyBmYWxzZSBpZiBhbnkga2luZCBvZiBlcnJvciBvY2N1cnMsIHRydWUgb3RoZXJ3aXNlLgorICAgICAgLy8vIEBicmllZiBVbmNvbmRpdGlvbmFsbHkgYWNxdWlyZSB0aGUgbG9jay4KKyAgICAgIGJvb2wgYWNxdWlyZSgpOworCisgICAgICAvLy8gQXR0ZW1wdHMgdG8gcmVsZWFzZSB0aGUgbG9jay4gSWYgdGhlIGxvY2sgaXMgaGVsZCBieSB0aGUgY3VycmVudAorICAgICAgLy8vIHRocmVhZCwgdGhlIGxvY2sgaXMgcmVsZWFzZWQgYWxsb3dpbmcgb3RoZXIgdGhyZWFkcyB0byBhY3F1aXJlIHRoZQorICAgICAgLy8vIGxvY2suCisgICAgICAvLy8gQHJldHVybnMgZmFsc2UgaWYgYW55IGtpbmQgb2YgZXJyb3Igb2NjdXJzLCB0cnVlIG90aGVyd2lzZS4KKyAgICAgIC8vLyBAYnJpZWYgVW5jb25kaXRpb25hbGx5IHJlbGVhc2UgdGhlIGxvY2suCisgICAgICBib29sIHJlbGVhc2UoKTsKKworICAgICAgLy8vIEF0dGVtcHRzIHRvIGFjcXVpcmUgdGhlIGxvY2sgd2l0aG91dCBibG9ja2luZy4gSWYgdGhlIGxvY2sgaXMgbm90CisgICAgICAvLy8gYXZhaWxhYmxlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UgcXVpY2tseSAod2l0aG91dCBibG9ja2luZykuIElmCisgICAgICAvLy8gdGhlIGxvY2sgaXMgYXZhaWxhYmxlLCBpdCBpcyBhY3F1aXJlZC4KKyAgICAgIC8vLyBAcmV0dXJucyBmYWxzZSBpZiBhbnkga2luZCBvZiBlcnJvciBvY2N1cnMgb3IgdGhlIGxvY2sgaXMgbm90CisgICAgICAvLy8gYXZhaWxhYmxlLCB0cnVlIG90aGVyd2lzZS4KKyAgICAgIC8vLyBAYnJpZWYgVHJ5IHRvIGFjcXVpcmUgdGhlIGxvY2suCisgICAgICBib29sIHRyeWFjcXVpcmUoKTsKKworICAgIC8vQH0KKyAgICAvLy8gQG5hbWUgUGxhdGZvcm0gRGVwZW5kZW50IERhdGEKKyAgICAvLy8gQHsKKyAgICBwcml2YXRlOgorI2lmIGRlZmluZWQoTExWTV9FTkFCTEVfVEhSRUFEUykgJiYgTExWTV9FTkFCTEVfVEhSRUFEUyAhPSAwCisgICAgICB2b2lkKiBkYXRhXzsgLy8vPCBXZSBkb24ndCBrbm93IHdoYXQgdGhlIGRhdGEgd2lsbCBiZQorI2VuZGlmCisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgRG8gTm90IEltcGxlbWVudAorICAgIC8vLyBAeworICAgIHByaXZhdGU6CisgICAgICBNdXRleEltcGwoY29uc3QgTXV0ZXhJbXBsICYpID0gZGVsZXRlOworICAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTXV0ZXhJbXBsICYpID0gZGVsZXRlOworICAgIC8vLyBAfQorICAgIH07CisKKworICAgIC8vLyBTbWFydE11dGV4IC0gQSBtdXRleCB3aXRoIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50IHBhcmFtZXRlciB0aGF0CisgICAgLy8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgbXV0ZXggc2hvdWxkIGJlY29tZSBhIG5vLW9wIHdoZW4gd2UncmUgbm90CisgICAgLy8vIHJ1bm5pbmcgaW4gbXVsdGl0aHJlYWRlZCBtb2RlLgorICAgIHRlbXBsYXRlPGJvb2wgbXRfb25seT4KKyAgICBjbGFzcyBTbWFydE11dGV4IHsKKyAgICAgIE11dGV4SW1wbCBpbXBsOworICAgICAgdW5zaWduZWQgYWNxdWlyZWQ7CisgICAgICBib29sIHJlY3Vyc2l2ZTsKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdCBTbWFydE11dGV4KGJvb2wgcmVjID0gdHJ1ZSkgOgorICAgICAgICBpbXBsKHJlYyksIGFjcXVpcmVkKDApLCByZWN1cnNpdmUocmVjKSB7IH0KKworICAgICAgYm9vbCBsb2NrKCkgeworICAgICAgICBpZiAoIW10X29ubHkgfHwgbGx2bV9pc19tdWx0aXRocmVhZGVkKCkpIHsKKyAgICAgICAgICByZXR1cm4gaW1wbC5hY3F1aXJlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gU2luZ2xlLXRocmVhZGVkIGRlYnVnZ2luZyBjb2RlLiAgVGhpcyB3b3VsZCBiZSByYWN5IGluCisgICAgICAgICAgLy8gbXVsdGl0aHJlYWRlZCBtb2RlLCBidXQgcHJvdmlkZXMgbm90IHNhbml0eSBjaGVja3MgaW4gc2luZ2xlCisgICAgICAgICAgLy8gdGhyZWFkZWQgbW9kZS4KKyAgICAgICAgICBhc3NlcnQoKHJlY3Vyc2l2ZSB8fCBhY3F1aXJlZCA9PSAwKSAmJiAiTG9jayBhbHJlYWR5IGFjcXVpcmVkISEiKTsKKyAgICAgICAgICArK2FjcXVpcmVkOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGJvb2wgdW5sb2NrKCkgeworICAgICAgICBpZiAoIW10X29ubHkgfHwgbGx2bV9pc19tdWx0aXRocmVhZGVkKCkpIHsKKyAgICAgICAgICByZXR1cm4gaW1wbC5yZWxlYXNlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gU2luZ2xlLXRocmVhZGVkIGRlYnVnZ2luZyBjb2RlLiAgVGhpcyB3b3VsZCBiZSByYWN5IGluCisgICAgICAgICAgLy8gbXVsdGl0aHJlYWRlZCBtb2RlLCBidXQgcHJvdmlkZXMgbm90IHNhbml0eSBjaGVja3MgaW4gc2luZ2xlCisgICAgICAgICAgLy8gdGhyZWFkZWQgbW9kZS4KKyAgICAgICAgICBhc3NlcnQoKChyZWN1cnNpdmUgJiYgYWNxdWlyZWQpIHx8IChhY3F1aXJlZCA9PSAxKSkgJiYKKyAgICAgICAgICAgICAgICAgIkxvY2sgbm90IGFjcXVpcmVkIGJlZm9yZSByZWxlYXNlISIpOworICAgICAgICAgIC0tYWNxdWlyZWQ7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYm9vbCB0cnlfbG9jaygpIHsKKyAgICAgICAgaWYgKCFtdF9vbmx5IHx8IGxsdm1faXNfbXVsdGl0aHJlYWRlZCgpKQorICAgICAgICAgIHJldHVybiBpbXBsLnRyeWFjcXVpcmUoKTsKKyAgICAgICAgZWxzZSByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgU21hcnRNdXRleChjb25zdCBTbWFydE11dGV4PG10X29ubHk+ICYgb3JpZ2luYWwpOworICAgICAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBTbWFydE11dGV4PG10X29ubHk+ICYpOworICAgIH07CisKKyAgICAvLy8gTXV0ZXggLSBBIHN0YW5kYXJkLCBhbHdheXMgZW5mb3JjZWQgbXV0ZXguCisgICAgdHlwZWRlZiBTbWFydE11dGV4PGZhbHNlPiBNdXRleDsKKworICAgIHRlbXBsYXRlPGJvb2wgbXRfb25seT4KKyAgICBjbGFzcyBTbWFydFNjb3BlZExvY2sgIHsKKyAgICAgIFNtYXJ0TXV0ZXg8bXRfb25seT4mIG10eDsKKworICAgIHB1YmxpYzoKKyAgICAgIFNtYXJ0U2NvcGVkTG9jayhTbWFydE11dGV4PG10X29ubHk+JiBtKSA6IG10eChtKSB7CisgICAgICAgIG10eC5sb2NrKCk7CisgICAgICB9CisKKyAgICAgIH5TbWFydFNjb3BlZExvY2soKSB7CisgICAgICAgIG10eC51bmxvY2soKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgdHlwZWRlZiBTbWFydFNjb3BlZExvY2s8ZmFsc2U+IFNjb3BlZExvY2s7CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTXV0ZXhHdWFyZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L011dGV4R3VhcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2I2NGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L011dGV4R3VhcmQuaApAQCAtMCwwICsxLDQxIEBACisvLz09PS0tIFN1cHBvcnQvTXV0ZXhHdWFyZC5oIC0gQWNxdWlyZS9SZWxlYXNlIE11dGV4IEluIFNjb3BlIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgZ3VhcmQgZm9yIGEgYmxvY2sgb2YgY29kZSB0aGF0IGVuc3VyZXMgYSBNdXRleCBpcyBsb2NrZWQKKy8vIHVwb24gY29uc3RydWN0aW9uIGFuZCByZWxlYXNlZCB1cG9uIGRlc3RydWN0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX01VVEVYR1VBUkRfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfTVVURVhHVUFSRF9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTXV0ZXguaCIKKworbmFtZXNwYWNlIGxsdm0geworICAvLy8gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYWNxdWlyZSBhIGdpdmVuIE11dGV4IExvY2sgd2hlbiBjb25zdHJ1Y3RlZCBhbmQKKyAgLy8vIGhvbGQgdGhhdCBsb2NrIHVudGlsIGRlc3RydWN0aW9uLiBUaGUgaW50ZW50aW9uIGlzIHRvIGluc3RhbnRpYXRlIG9uZSBvZgorICAvLy8gdGhlc2Ugb24gdGhlIHN0YWNrIGF0IHRoZSB0b3Agb2Ygc29tZSBzY29wZSB0byBiZSBhc3N1cmVkIHRoYXQgQysrCisgIC8vLyBkZXN0cnVjdGlvbiBvZiB0aGUgb2JqZWN0IHdpbGwgYWx3YXlzIHJlbGVhc2UgdGhlIE11dGV4IGFuZCB0aHVzIGF2b2lkCisgIC8vLyBhIGhvc3Qgb2YgbmFzdHkgbXVsdGktdGhyZWFkaW5nIHByb2JsZW1zIGluIHRoZSBmYWNlIG9mIGV4Y2VwdGlvbnMsIGV0Yy4KKyAgLy8vIEBicmllZiBHdWFyZCBhIHNlY3Rpb24gb2YgY29kZSB3aXRoIGEgTXV0ZXguCisgIGNsYXNzIE11dGV4R3VhcmQgeworICAgIHN5czo6TXV0ZXggJk07CisgICAgTXV0ZXhHdWFyZChjb25zdCBNdXRleEd1YXJkICYpID0gZGVsZXRlOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE11dGV4R3VhcmQgJikgPSBkZWxldGU7CisgIHB1YmxpYzoKKyAgICBNdXRleEd1YXJkKHN5czo6TXV0ZXggJm0pIDogTShtKSB7IE0ubG9jaygpOyB9CisgICAgfk11dGV4R3VhcmQoKSB7IE0udW5sb2NrKCk7IH0KKyAgICAvLy8gaG9sZHMgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBsb2NrZXIgaW5zdGFuY2UgaG9sZHMgdGhlIHNwZWNpZmllZCBsb2NrLgorICAgIC8vLyBUaGlzIGlzIG1vc3RseSB1c2VkIGluIGFzc2VydGlvbnMgdG8gdmFsaWRhdGUgdGhhdCB0aGUgY29ycmVjdCBtdXRleAorICAgIC8vLyBpcyBoZWxkLgorICAgIGJvb2wgaG9sZHMoY29uc3Qgc3lzOjpNdXRleCYgbG9jaykgY29uc3QgeyByZXR1cm4gJk0gPT0gJmxvY2s7IH0KKyAgfTsKK30KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9NVVRFWEdVQVJEX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9OYXRpdmVGb3JtYXR0aW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTmF0aXZlRm9ybWF0dGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMWRkN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTmF0aXZlRm9ybWF0dGluZy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8vPT09LSBOYXRpdmVGb3JtYXR0aW5nLmggLSBMb3cgbGV2ZWwgZm9ybWF0dGluZyBoZWxwZXJzIC0tLS0tLS0tLSotIEMrKy0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX05BVElWRV9GT1JNQVRUSU5HX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX05BVElWRV9GT1JNQVRUSU5HX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CitlbnVtIGNsYXNzIEZsb2F0U3R5bGUgeyBFeHBvbmVudCwgRXhwb25lbnRVcHBlciwgRml4ZWQsIFBlcmNlbnQgfTsKK2VudW0gY2xhc3MgSW50ZWdlclN0eWxlIHsKKyAgSW50ZWdlciwKKyAgTnVtYmVyLAorfTsKK2VudW0gY2xhc3MgSGV4UHJpbnRTdHlsZSB7IFVwcGVyLCBMb3dlciwgUHJlZml4VXBwZXIsIFByZWZpeExvd2VyIH07CisKK3NpemVfdCBnZXREZWZhdWx0UHJlY2lzaW9uKEZsb2F0U3R5bGUgU3R5bGUpOworCitib29sIGlzUHJlZml4ZWRIZXhTdHlsZShIZXhQcmludFN0eWxlIFMpOworCit2b2lkIHdyaXRlX2ludGVnZXIocmF3X29zdHJlYW0gJlMsIHVuc2lnbmVkIGludCBOLCBzaXplX3QgTWluRGlnaXRzLAorICAgICAgICAgICAgICAgICAgIEludGVnZXJTdHlsZSBTdHlsZSk7Cit2b2lkIHdyaXRlX2ludGVnZXIocmF3X29zdHJlYW0gJlMsIGludCBOLCBzaXplX3QgTWluRGlnaXRzLCBJbnRlZ2VyU3R5bGUgU3R5bGUpOwordm9pZCB3cml0ZV9pbnRlZ2VyKHJhd19vc3RyZWFtICZTLCB1bnNpZ25lZCBsb25nIE4sIHNpemVfdCBNaW5EaWdpdHMsCisgICAgICAgICAgICAgICAgICAgSW50ZWdlclN0eWxlIFN0eWxlKTsKK3ZvaWQgd3JpdGVfaW50ZWdlcihyYXdfb3N0cmVhbSAmUywgbG9uZyBOLCBzaXplX3QgTWluRGlnaXRzLAorICAgICAgICAgICAgICAgICAgIEludGVnZXJTdHlsZSBTdHlsZSk7Cit2b2lkIHdyaXRlX2ludGVnZXIocmF3X29zdHJlYW0gJlMsIHVuc2lnbmVkIGxvbmcgbG9uZyBOLCBzaXplX3QgTWluRGlnaXRzLAorICAgICAgICAgICAgICAgICAgIEludGVnZXJTdHlsZSBTdHlsZSk7Cit2b2lkIHdyaXRlX2ludGVnZXIocmF3X29zdHJlYW0gJlMsIGxvbmcgbG9uZyBOLCBzaXplX3QgTWluRGlnaXRzLAorICAgICAgICAgICAgICAgICAgIEludGVnZXJTdHlsZSBTdHlsZSk7CisKK3ZvaWQgd3JpdGVfaGV4KHJhd19vc3RyZWFtICZTLCB1aW50NjRfdCBOLCBIZXhQcmludFN0eWxlIFN0eWxlLAorICAgICAgICAgICAgICAgT3B0aW9uYWw8c2l6ZV90PiBXaWR0aCA9IE5vbmUpOwordm9pZCB3cml0ZV9kb3VibGUocmF3X29zdHJlYW0gJlMsIGRvdWJsZSBELCBGbG9hdFN0eWxlIFN0eWxlLAorICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8c2l6ZV90PiBQcmVjaXNpb24gPSBOb25lKTsKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9PbkRpc2tIYXNoVGFibGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9PbkRpc2tIYXNoVGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWYwMDRiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L09uRGlza0hhc2hUYWJsZS5oCkBAIC0wLDAgKzEsNjE2IEBACisvLz09PS0tLSBPbkRpc2tIYXNoVGFibGUuaCAtIE9uLURpc2sgSGFzaCBUYWJsZSBJbXBsZW1lbnRhdGlvbiAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyBmYWNpbGl0aWVzIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIG9uLWRpc2sgaGFzaCB0YWJsZXMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fU1VQUE9SVF9PTkRJU0tIQVNIVEFCTEVfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfT05ESVNLSEFTSFRBQkxFX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhblN0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Ib3N0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRsaWI+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBHZW5lcmF0ZXMgYW4gb24gZGlzayBoYXNoIHRhYmxlLgorLy8vCisvLy8gVGhpcyBuZWVkcyBhbiBcYyBJbmZvIHRoYXQgaGFuZGxlcyBzdG9yaW5nIHZhbHVlcyBpbnRvIHRoZSBoYXNoIHRhYmxlJ3MKKy8vLyBwYXlsb2FkIGFuZCBjb21wdXRlcyB0aGUgaGFzaCBmb3IgYSBnaXZlbiBrZXkuIFRoaXMgc2hvdWxkIHByb3ZpZGUgdGhlCisvLy8gZm9sbG93aW5nIGludGVyZmFjZToKKy8vLworLy8vIFxjb2RlCisvLy8gY2xhc3MgRXhhbXBsZUluZm8geworLy8vIHB1YmxpYzoKKy8vLyAgIHR5cGVkZWYgRXhhbXBsZUtleSBrZXlfdHlwZTsgICAvLyBNdXN0IGJlIGNvcHkgY29uc3RydWN0aWJsZQorLy8vICAgdHlwZWRlZiBFeGFtcGxlS2V5ICZrZXlfdHlwZV9yZWY7CisvLy8gICB0eXBlZGVmIEV4YW1wbGVEYXRhIGRhdGFfdHlwZTsgLy8gTXVzdCBiZSBjb3B5IGNvbnN0cnVjdGlibGUKKy8vLyAgIHR5cGVkZWYgRXhhbXBsZURhdGEgJmRhdGFfdHlwZV9yZWY7CisvLy8gICB0eXBlZGVmIHVpbnQzMl90IGhhc2hfdmFsdWVfdHlwZTsgLy8gVGhlIHR5cGUgdGhlIGhhc2ggZnVuY3Rpb24gcmV0dXJucy4KKy8vLyAgIHR5cGVkZWYgdWludDMyX3Qgb2Zmc2V0X3R5cGU7IC8vIFRoZSB0eXBlIGZvciBvZmZzZXRzIGludG8gdGhlIHRhYmxlLgorLy8vCisvLy8gICAvLy8gQ2FsY3VsYXRlIHRoZSBoYXNoIGZvciBLZXkKKy8vLyAgIHN0YXRpYyBoYXNoX3ZhbHVlX3R5cGUgQ29tcHV0ZUhhc2goa2V5X3R5cGVfcmVmIEtleSk7CisvLy8gICAvLy8gUmV0dXJuIHRoZSBsZW5ndGhzLCBpbiBieXRlcywgb2YgdGhlIGdpdmVuIEtleS9EYXRhIHBhaXIuCisvLy8gICBzdGF0aWMgc3RkOjpwYWlyPG9mZnNldF90eXBlLCBvZmZzZXRfdHlwZT4KKy8vLyAgIEVtaXRLZXlEYXRhTGVuZ3RoKHJhd19vc3RyZWFtICZPdXQsIGtleV90eXBlX3JlZiBLZXksIGRhdGFfdHlwZV9yZWYgRGF0YSk7CisvLy8gICAvLy8gV3JpdGUgS2V5IHRvIE91dC4gIEtleUxlbiBpcyB0aGUgbGVuZ3RoIGZyb20gRW1pdEtleURhdGFMZW5ndGguCisvLy8gICBzdGF0aWMgdm9pZCBFbWl0S2V5KHJhd19vc3RyZWFtICZPdXQsIGtleV90eXBlX3JlZiBLZXksCisvLy8gICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF90eXBlIEtleUxlbik7CisvLy8gICAvLy8gV3JpdGUgRGF0YSB0byBPdXQuICBEYXRhTGVuIGlzIHRoZSBsZW5ndGggZnJvbSBFbWl0S2V5RGF0YUxlbmd0aC4KKy8vLyAgIHN0YXRpYyB2b2lkIEVtaXREYXRhKHJhd19vc3RyZWFtICZPdXQsIGtleV90eXBlX3JlZiBLZXksCisvLy8gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3R5cGVfcmVmIERhdGEsIG9mZnNldF90eXBlIERhdGFMZW4pOworLy8vICAgLy8vIERldGVybWluZSBpZiB0d28ga2V5cyBhcmUgZXF1YWwuIE9wdGlvbmFsLCBvbmx5IG5lZWRlZCBieSBjb250YWlucy4KKy8vLyAgIHN0YXRpYyBib29sIEVxdWFsS2V5KGtleV90eXBlX3JlZiBLZXkxLCBrZXlfdHlwZV9yZWYgS2V5Mik7CisvLy8gfTsKKy8vLyBcZW5kY29kZQordGVtcGxhdGUgPHR5cGVuYW1lIEluZm8+IGNsYXNzIE9uRGlza0NoYWluZWRIYXNoVGFibGVHZW5lcmF0b3IgeworICAvLy8gXGJyaWVmIEEgc2luZ2xlIGl0ZW0gaW4gdGhlIGhhc2ggdGFibGUuCisgIGNsYXNzIEl0ZW0geworICBwdWJsaWM6CisgICAgdHlwZW5hbWUgSW5mbzo6a2V5X3R5cGUgS2V5OworICAgIHR5cGVuYW1lIEluZm86OmRhdGFfdHlwZSBEYXRhOworICAgIEl0ZW0gKk5leHQ7CisgICAgY29uc3QgdHlwZW5hbWUgSW5mbzo6aGFzaF92YWx1ZV90eXBlIEhhc2g7CisKKyAgICBJdGVtKHR5cGVuYW1lIEluZm86OmtleV90eXBlX3JlZiBLZXksIHR5cGVuYW1lIEluZm86OmRhdGFfdHlwZV9yZWYgRGF0YSwKKyAgICAgICAgIEluZm8gJkluZm9PYmopCisgICAgICAgIDogS2V5KEtleSksIERhdGEoRGF0YSksIE5leHQobnVsbHB0ciksIEhhc2goSW5mb09iai5Db21wdXRlSGFzaChLZXkpKSB7fQorICB9OworCisgIHR5cGVkZWYgdHlwZW5hbWUgSW5mbzo6b2Zmc2V0X3R5cGUgb2Zmc2V0X3R5cGU7CisgIG9mZnNldF90eXBlIE51bUJ1Y2tldHM7CisgIG9mZnNldF90eXBlIE51bUVudHJpZXM7CisgIGxsdm06OlNwZWNpZmljQnVtcFB0ckFsbG9jYXRvcjxJdGVtPiBCQTsKKworICAvLy8gXGJyaWVmIEEgbGlua2VkIGxpc3Qgb2YgdmFsdWVzIGluIGEgcGFydGljdWxhciBoYXNoIGJ1Y2tldC4KKyAgc3RydWN0IEJ1Y2tldCB7CisgICAgb2Zmc2V0X3R5cGUgT2ZmOworICAgIHVuc2lnbmVkIExlbmd0aDsKKyAgICBJdGVtICpIZWFkOworICB9OworCisgIEJ1Y2tldCAqQnVja2V0czsKKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBJbnNlcnQgYW4gaXRlbSBpbnRvIHRoZSBhcHByb3ByaWF0ZSBoYXNoIGJ1Y2tldC4KKyAgdm9pZCBpbnNlcnQoQnVja2V0ICpCdWNrZXRzLCBzaXplX3QgU2l6ZSwgSXRlbSAqRSkgeworICAgIEJ1Y2tldCAmQiA9IEJ1Y2tldHNbRS0+SGFzaCAmIChTaXplIC0gMSldOworICAgIEUtPk5leHQgPSBCLkhlYWQ7CisgICAgKytCLkxlbmd0aDsKKyAgICBCLkhlYWQgPSBFOworICB9CisKKyAgLy8vIFxicmllZiBSZXNpemUgdGhlIGhhc2ggdGFibGUsIG1vdmluZyB0aGUgb2xkIGVudHJpZXMgaW50byB0aGUgbmV3IGJ1Y2tldHMuCisgIHZvaWQgcmVzaXplKHNpemVfdCBOZXdTaXplKSB7CisgICAgQnVja2V0ICpOZXdCdWNrZXRzID0gc3RhdGljX2Nhc3Q8QnVja2V0ICo+KAorICAgICAgICBzYWZlX2NhbGxvYyhOZXdTaXplLCBzaXplb2YoQnVja2V0KSkpOworICAgIC8vIFBvcHVsYXRlIE5ld0J1Y2tldHMgd2l0aCB0aGUgb2xkIGVudHJpZXMuCisgICAgZm9yIChzaXplX3QgSSA9IDA7IEkgPCBOdW1CdWNrZXRzOyArK0kpCisgICAgICBmb3IgKEl0ZW0gKkUgPSBCdWNrZXRzW0ldLkhlYWQ7IEU7KSB7CisgICAgICAgIEl0ZW0gKk4gPSBFLT5OZXh0OworICAgICAgICBFLT5OZXh0ID0gbnVsbHB0cjsKKyAgICAgICAgaW5zZXJ0KE5ld0J1Y2tldHMsIE5ld1NpemUsIEUpOworICAgICAgICBFID0gTjsKKyAgICAgIH0KKworICAgIGZyZWUoQnVja2V0cyk7CisgICAgTnVtQnVja2V0cyA9IE5ld1NpemU7CisgICAgQnVja2V0cyA9IE5ld0J1Y2tldHM7CisgIH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIEluc2VydCBhbiBlbnRyeSBpbnRvIHRoZSB0YWJsZS4KKyAgdm9pZCBpbnNlcnQodHlwZW5hbWUgSW5mbzo6a2V5X3R5cGVfcmVmIEtleSwKKyAgICAgICAgICAgICAgdHlwZW5hbWUgSW5mbzo6ZGF0YV90eXBlX3JlZiBEYXRhKSB7CisgICAgSW5mbyBJbmZvT2JqOworICAgIGluc2VydChLZXksIERhdGEsIEluZm9PYmopOworICB9CisKKyAgLy8vIFxicmllZiBJbnNlcnQgYW4gZW50cnkgaW50byB0aGUgdGFibGUuCisgIC8vLworICAvLy8gVXNlcyB0aGUgcHJvdmlkZWQgSW5mbyBpbnN0ZWFkIG9mIGEgc3RhY2sgYWxsb2NhdGVkIG9uZS4KKyAgdm9pZCBpbnNlcnQodHlwZW5hbWUgSW5mbzo6a2V5X3R5cGVfcmVmIEtleSwKKyAgICAgICAgICAgICAgdHlwZW5hbWUgSW5mbzo6ZGF0YV90eXBlX3JlZiBEYXRhLCBJbmZvICZJbmZvT2JqKSB7CisgICAgKytOdW1FbnRyaWVzOworICAgIGlmICg0ICogTnVtRW50cmllcyA+PSAzICogTnVtQnVja2V0cykKKyAgICAgIHJlc2l6ZShOdW1CdWNrZXRzICogMik7CisgICAgaW5zZXJ0KEJ1Y2tldHMsIE51bUJ1Y2tldHMsIG5ldyAoQkEuQWxsb2NhdGUoKSkgSXRlbShLZXksIERhdGEsIEluZm9PYmopKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgYW4gZW50cnkgaGFzIGJlZW4gaW5zZXJ0ZWQuCisgIGJvb2wgY29udGFpbnModHlwZW5hbWUgSW5mbzo6a2V5X3R5cGVfcmVmIEtleSwgSW5mbyAmSW5mb09iaikgeworICAgIHVuc2lnbmVkIEhhc2ggPSBJbmZvT2JqLkNvbXB1dGVIYXNoKEtleSk7CisgICAgZm9yIChJdGVtICpJID0gQnVja2V0c1tIYXNoICYgKE51bUJ1Y2tldHMgLSAxKV0uSGVhZDsgSTsgSSA9IEktPk5leHQpCisgICAgICBpZiAoSS0+SGFzaCA9PSBIYXNoICYmIEluZm9PYmouRXF1YWxLZXkoSS0+S2V5LCBLZXkpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gXGJyaWVmIEVtaXQgdGhlIHRhYmxlIHRvIE91dCwgd2hpY2ggbXVzdCBub3QgYmUgYXQgb2Zmc2V0IDAuCisgIG9mZnNldF90eXBlIEVtaXQocmF3X29zdHJlYW0gJk91dCkgeworICAgIEluZm8gSW5mb09iajsKKyAgICByZXR1cm4gRW1pdChPdXQsIEluZm9PYmopOworICB9CisKKyAgLy8vIFxicmllZiBFbWl0IHRoZSB0YWJsZSB0byBPdXQsIHdoaWNoIG11c3Qgbm90IGJlIGF0IG9mZnNldCAwLgorICAvLy8KKyAgLy8vIFVzZXMgdGhlIHByb3ZpZGVkIEluZm8gaW5zdGVhZCBvZiBhIHN0YWNrIGFsbG9jYXRlZCBvbmUuCisgIG9mZnNldF90eXBlIEVtaXQocmF3X29zdHJlYW0gJk91dCwgSW5mbyAmSW5mb09iaikgeworICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworICAgIGVuZGlhbjo6V3JpdGVyPGxpdHRsZT4gTEUoT3V0KTsKKworICAgIC8vIE5vdyB3ZSdyZSBkb25lIGFkZGluZyBlbnRyaWVzLCByZXNpemUgdGhlIGJ1Y2tldCBsaXN0IGlmIGl0J3MKKyAgICAvLyBzaWduaWZpY2FudGx5IHRvbyBsYXJnZS4gKFRoaXMgb25seSBoYXBwZW5zIGlmIHRoZSBudW1iZXIgb2YKKyAgICAvLyBlbnRyaWVzIGlzIHNtYWxsIGFuZCB3ZSdyZSB3aXRoaW4gb3VyIGluaXRpYWwgYWxsb2NhdGlvbiBvZgorICAgIC8vIDY0IGJ1Y2tldHMuKSBXZSBhaW0gZm9yIGFuIG9jY3VwYW5jeSByYXRpbyBpbiBbMy84LCAzLzQpLgorICAgIC8vCisgICAgLy8gQXMgYSBzcGVjaWFsIGNhc2UsIGlmIHRoZXJlIGFyZSB0d28gb3IgZmV3ZXIgZW50cmllcywganVzdAorICAgIC8vIGZvcm0gYSBzaW5nbGUgYnVja2V0LiBBIGxpbmVhciBzY2FuIGlzIGZpbmUgaW4gdGhhdCBjYXNlLCBhbmQKKyAgICAvLyB0aGlzIGlzIHZlcnkgY29tbW9uIGluIEMrKyBjbGFzcyBsb29rdXAgdGFibGVzLiBUaGlzIGFsc28KKyAgICAvLyBndWFyYW50ZWVzIHdlIHByb2R1Y2UgYXQgbGVhc3Qgb25lIGJ1Y2tldCBmb3IgYW4gZW1wdHkgdGFibGUuCisgICAgLy8KKyAgICAvLyBGSVhNRTogVHJ5IGNvbXB1dGluZyBhIHBlcmZlY3QgaGFzaCBmdW5jdGlvbiBhdCB0aGlzIHBvaW50LgorICAgIHVuc2lnbmVkIFRhcmdldE51bUJ1Y2tldHMgPQorICAgICAgICBOdW1FbnRyaWVzIDw9IDIgPyAxIDogTmV4dFBvd2VyT2YyKE51bUVudHJpZXMgKiA0IC8gMyk7CisgICAgaWYgKFRhcmdldE51bUJ1Y2tldHMgIT0gTnVtQnVja2V0cykKKyAgICAgIHJlc2l6ZShUYXJnZXROdW1CdWNrZXRzKTsKKworICAgIC8vIEVtaXQgdGhlIHBheWxvYWQgb2YgdGhlIHRhYmxlLgorICAgIGZvciAob2Zmc2V0X3R5cGUgSSA9IDA7IEkgPCBOdW1CdWNrZXRzOyArK0kpIHsKKyAgICAgIEJ1Y2tldCAmQiA9IEJ1Y2tldHNbSV07CisgICAgICBpZiAoIUIuSGVhZCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIFN0b3JlIHRoZSBvZmZzZXQgZm9yIHRoZSBkYXRhIG9mIHRoaXMgYnVja2V0LgorICAgICAgQi5PZmYgPSBPdXQudGVsbCgpOworICAgICAgYXNzZXJ0KEIuT2ZmICYmICJDYW5ub3Qgd3JpdGUgYSBidWNrZXQgYXQgb2Zmc2V0IDAuIFBsZWFzZSBhZGQgcGFkZGluZy4iKTsKKworICAgICAgLy8gV3JpdGUgb3V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGJ1Y2tldC4KKyAgICAgIExFLndyaXRlPHVpbnQxNl90PihCLkxlbmd0aCk7CisgICAgICBhc3NlcnQoQi5MZW5ndGggIT0gMCAmJiAiQnVja2V0IGhhcyBhIGhlYWQgYnV0IHplcm8gbGVuZ3RoPyIpOworCisgICAgICAvLyBXcml0ZSBvdXQgdGhlIGVudHJpZXMgaW4gdGhlIGJ1Y2tldC4KKyAgICAgIGZvciAoSXRlbSAqSSA9IEIuSGVhZDsgSTsgSSA9IEktPk5leHQpIHsKKyAgICAgICAgTEUud3JpdGU8dHlwZW5hbWUgSW5mbzo6aGFzaF92YWx1ZV90eXBlPihJLT5IYXNoKTsKKyAgICAgICAgY29uc3Qgc3RkOjpwYWlyPG9mZnNldF90eXBlLCBvZmZzZXRfdHlwZT4gJkxlbiA9CisgICAgICAgICAgICBJbmZvT2JqLkVtaXRLZXlEYXRhTGVuZ3RoKE91dCwgSS0+S2V5LCBJLT5EYXRhKTsKKyNpZmRlZiBOREVCVUcKKyAgICAgICAgSW5mb09iai5FbWl0S2V5KE91dCwgSS0+S2V5LCBMZW4uZmlyc3QpOworICAgICAgICBJbmZvT2JqLkVtaXREYXRhKE91dCwgSS0+S2V5LCBJLT5EYXRhLCBMZW4uc2Vjb25kKTsKKyNlbHNlCisgICAgICAgIC8vIEluIGFzc2VydHMgbW9kZSwgY2hlY2sgdGhhdCB0aGUgdXNlcnMgbGVuZ3RoIG1hdGNoZXMgdGhlIGRhdGEgdGhleQorICAgICAgICAvLyB3cm90ZS4KKyAgICAgICAgdWludDY0X3QgS2V5U3RhcnQgPSBPdXQudGVsbCgpOworICAgICAgICBJbmZvT2JqLkVtaXRLZXkoT3V0LCBJLT5LZXksIExlbi5maXJzdCk7CisgICAgICAgIHVpbnQ2NF90IERhdGFTdGFydCA9IE91dC50ZWxsKCk7CisgICAgICAgIEluZm9PYmouRW1pdERhdGEoT3V0LCBJLT5LZXksIEktPkRhdGEsIExlbi5zZWNvbmQpOworICAgICAgICB1aW50NjRfdCBFbmQgPSBPdXQudGVsbCgpOworICAgICAgICBhc3NlcnQob2Zmc2V0X3R5cGUoRGF0YVN0YXJ0IC0gS2V5U3RhcnQpID09IExlbi5maXJzdCAmJgorICAgICAgICAgICAgICAgImtleSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggYnl0ZXMgd3JpdHRlbiIpOworICAgICAgICBhc3NlcnQob2Zmc2V0X3R5cGUoRW5kIC0gRGF0YVN0YXJ0KSA9PSBMZW4uc2Vjb25kICYmCisgICAgICAgICAgICAgICAiZGF0YSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggYnl0ZXMgd3JpdHRlbiIpOworI2VuZGlmCisgICAgICB9CisgICAgfQorCisgICAgLy8gUGFkIHdpdGggemVyb3Mgc28gdGhhdCB3ZSBjYW4gc3RhcnQgdGhlIGhhc2h0YWJsZSBhdCBhbiBhbGlnbmVkIGFkZHJlc3MuCisgICAgb2Zmc2V0X3R5cGUgVGFibGVPZmYgPSBPdXQudGVsbCgpOworICAgIHVpbnQ2NF90IE4gPSBsbHZtOjpPZmZzZXRUb0FsaWdubWVudChUYWJsZU9mZiwgYWxpZ25vZihvZmZzZXRfdHlwZSkpOworICAgIFRhYmxlT2ZmICs9IE47CisgICAgd2hpbGUgKE4tLSkKKyAgICAgIExFLndyaXRlPHVpbnQ4X3Q+KDApOworCisgICAgLy8gRW1pdCB0aGUgaGFzaHRhYmxlIGl0c2VsZi4KKyAgICBMRS53cml0ZTxvZmZzZXRfdHlwZT4oTnVtQnVja2V0cyk7CisgICAgTEUud3JpdGU8b2Zmc2V0X3R5cGU+KE51bUVudHJpZXMpOworICAgIGZvciAob2Zmc2V0X3R5cGUgSSA9IDA7IEkgPCBOdW1CdWNrZXRzOyArK0kpCisgICAgICBMRS53cml0ZTxvZmZzZXRfdHlwZT4oQnVja2V0c1tJXS5PZmYpOworCisgICAgcmV0dXJuIFRhYmxlT2ZmOworICB9CisKKyAgT25EaXNrQ2hhaW5lZEhhc2hUYWJsZUdlbmVyYXRvcigpIHsKKyAgICBOdW1FbnRyaWVzID0gMDsKKyAgICBOdW1CdWNrZXRzID0gNjQ7CisgICAgLy8gTm90ZSB0aGF0IHdlIGRvIG5vdCBuZWVkIHRvIHJ1biB0aGUgY29uc3RydWN0b3JzIG9mIHRoZSBpbmRpdmlkdWFsCisgICAgLy8gQnVja2V0IG9iamVjdHMgc2luY2UgJ2NhbGxvYycgcmV0dXJucyBieXRlcyB0aGF0IGFyZSBhbGwgMC4KKyAgICBCdWNrZXRzID0gc3RhdGljX2Nhc3Q8QnVja2V0ICo+KHNhZmVfY2FsbG9jKE51bUJ1Y2tldHMsIHNpemVvZihCdWNrZXQpKSk7CisgIH0KKworICB+T25EaXNrQ2hhaW5lZEhhc2hUYWJsZUdlbmVyYXRvcigpIHsgc3RkOjpmcmVlKEJ1Y2tldHMpOyB9Cit9OworCisvLy8gXGJyaWVmIFByb3ZpZGVzIGxvb2t1cCBvbiBhbiBvbiBkaXNrIGhhc2ggdGFibGUuCisvLy8KKy8vLyBUaGlzIG5lZWRzIGFuIFxjIEluZm8gdGhhdCBoYW5kbGVzIHJlYWRpbmcgdmFsdWVzIGZyb20gdGhlIGhhc2ggdGFibGUncworLy8vIHBheWxvYWQgYW5kIGNvbXB1dGVzIHRoZSBoYXNoIGZvciBhIGdpdmVuIGtleS4gVGhpcyBzaG91bGQgcHJvdmlkZSB0aGUKKy8vLyBmb2xsb3dpbmcgaW50ZXJmYWNlOgorLy8vCisvLy8gXGNvZGUKKy8vLyBjbGFzcyBFeGFtcGxlTG9va3VwSW5mbyB7CisvLy8gcHVibGljOgorLy8vICAgdHlwZWRlZiBFeGFtcGxlRGF0YSBkYXRhX3R5cGU7CisvLy8gICB0eXBlZGVmIEV4YW1wbGVJbnRlcm5hbEtleSBpbnRlcm5hbF9rZXlfdHlwZTsgLy8gVGhlIHN0b3JlZCBrZXkgdHlwZS4KKy8vLyAgIHR5cGVkZWYgRXhhbXBsZUtleSBleHRlcm5hbF9rZXlfdHlwZTsgLy8gVGhlIHR5cGUgdG8gcGFzcyB0byBmaW5kKCkuCisvLy8gICB0eXBlZGVmIHVpbnQzMl90IGhhc2hfdmFsdWVfdHlwZTsgLy8gVGhlIHR5cGUgdGhlIGhhc2ggZnVuY3Rpb24gcmV0dXJucy4KKy8vLyAgIHR5cGVkZWYgdWludDMyX3Qgb2Zmc2V0X3R5cGU7IC8vIFRoZSB0eXBlIGZvciBvZmZzZXRzIGludG8gdGhlIHRhYmxlLgorLy8vCisvLy8gICAvLy8gQ29tcGFyZSB0d28ga2V5cyBmb3IgZXF1YWxpdHkuCisvLy8gICBzdGF0aWMgYm9vbCBFcXVhbEtleShpbnRlcm5hbF9rZXlfdHlwZSAmS2V5MSwgaW50ZXJuYWxfa2V5X3R5cGUgJktleTIpOworLy8vICAgLy8vIENhbGN1bGF0ZSB0aGUgaGFzaCBmb3IgdGhlIGdpdmVuIGtleS4KKy8vLyAgIHN0YXRpYyBoYXNoX3ZhbHVlX3R5cGUgQ29tcHV0ZUhhc2goaW50ZXJuYWxfa2V5X3R5cGUgJklLZXkpOworLy8vICAgLy8vIFRyYW5zbGF0ZSBmcm9tIHRoZSBzZW1hbnRpYyB0eXBlIG9mIGEga2V5IGluIHRoZSBoYXNoIHRhYmxlIHRvIHRoZQorLy8vICAgLy8vIHR5cGUgdGhhdCBpcyBhY3R1YWxseSBzdG9yZWQgYW5kIHVzZWQgZm9yIGhhc2hpbmcgYW5kIGNvbXBhcmlzb25zLgorLy8vICAgLy8vIFRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgdHlwZXMgYXJlIG9mdGVuIHRoZSBzYW1lLCBpbiB3aGljaCBjYXNlIHRoaXMKKy8vLyAgIC8vLyBjYW4gc2ltcGx5IHJldHVybiB0aGUgcGFzc2VkIGluIHZhbHVlLgorLy8vICAgc3RhdGljIGNvbnN0IGludGVybmFsX2tleV90eXBlICZHZXRJbnRlcm5hbEtleShleHRlcm5hbF9rZXlfdHlwZSAmRUtleSk7CisvLy8gICAvLy8gUmVhZCB0aGUga2V5IGFuZCBkYXRhIGxlbmd0aCBmcm9tIEJ1ZmZlciwgbGVhdmluZyBpdCBwb2ludGluZyBhdCB0aGUKKy8vLyAgIC8vLyBmb2xsb3dpbmcgYnl0ZS4KKy8vLyAgIHN0YXRpYyBzdGQ6OnBhaXI8b2Zmc2V0X3R5cGUsIG9mZnNldF90eXBlPgorLy8vICAgUmVhZEtleURhdGFMZW5ndGgoY29uc3QgdW5zaWduZWQgY2hhciAqJkJ1ZmZlcik7CisvLy8gICAvLy8gUmVhZCB0aGUga2V5IGZyb20gQnVmZmVyLCBnaXZlbiB0aGUgS2V5TGVuIGFzIHJlcG9ydGVkIGZyb20KKy8vLyAgIC8vLyBSZWFkS2V5RGF0YUxlbmd0aC4KKy8vLyAgIGNvbnN0IGludGVybmFsX2tleV90eXBlICZSZWFkS2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKkJ1ZmZlciwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF90eXBlIEtleUxlbik7CisvLy8gICAvLy8gUmVhZCB0aGUgZGF0YSBmb3IgS2V5IGZyb20gQnVmZmVyLCBnaXZlbiB0aGUgRGF0YUxlbiBhcyByZXBvcnRlZCBmcm9tCisvLy8gICAvLy8gUmVhZEtleURhdGFMZW5ndGguCisvLy8gICBkYXRhX3R5cGUgUmVhZERhdGEoU3RyaW5nUmVmIEtleSwgY29uc3QgdW5zaWduZWQgY2hhciAqQnVmZmVyLAorLy8vICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF90eXBlIERhdGFMZW4pOworLy8vIH07CisvLy8gXGVuZGNvZGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmZvPiBjbGFzcyBPbkRpc2tDaGFpbmVkSGFzaFRhYmxlIHsKKyAgY29uc3QgdHlwZW5hbWUgSW5mbzo6b2Zmc2V0X3R5cGUgTnVtQnVja2V0czsKKyAgY29uc3QgdHlwZW5hbWUgSW5mbzo6b2Zmc2V0X3R5cGUgTnVtRW50cmllczsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3QgQnVja2V0czsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3QgQmFzZTsKKyAgSW5mbyBJbmZvT2JqOworCitwdWJsaWM6CisgIHR5cGVkZWYgSW5mbyBJbmZvVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbmZvOjppbnRlcm5hbF9rZXlfdHlwZSBpbnRlcm5hbF9rZXlfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbmZvOjpleHRlcm5hbF9rZXlfdHlwZSBleHRlcm5hbF9rZXlfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbmZvOjpkYXRhX3R5cGUgZGF0YV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEluZm86Omhhc2hfdmFsdWVfdHlwZSBoYXNoX3ZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgSW5mbzo6b2Zmc2V0X3R5cGUgb2Zmc2V0X3R5cGU7CisKKyAgT25EaXNrQ2hhaW5lZEhhc2hUYWJsZShvZmZzZXRfdHlwZSBOdW1CdWNrZXRzLCBvZmZzZXRfdHlwZSBOdW1FbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKkJ1Y2tldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmZvICZJbmZvT2JqID0gSW5mbygpKQorICAgICAgOiBOdW1CdWNrZXRzKE51bUJ1Y2tldHMpLCBOdW1FbnRyaWVzKE51bUVudHJpZXMpLCBCdWNrZXRzKEJ1Y2tldHMpLAorICAgICAgICBCYXNlKEJhc2UpLCBJbmZvT2JqKEluZm9PYmopIHsKKyAgICBhc3NlcnQoKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihCdWNrZXRzKSAmIDB4MykgPT0gMCAmJgorICAgICAgICAgICAiJ2J1Y2tldHMnIG11c3QgaGF2ZSBhIDQtYnl0ZSBhbGlnbm1lbnQiKTsKKyAgfQorCisgIC8vLyBSZWFkIHRoZSBudW1iZXIgb2YgYnVja2V0cyBhbmQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGZyb20gYSBoYXNoIHRhYmxlCisgIC8vLyBwcm9kdWNlZCBieSBPbkRpc2tIYXNoVGFibGVHZW5lcmF0b3I6OkVtaXQsIGFuZCBhZHZhbmNlIHRoZSBCdWNrZXRzCisgIC8vLyBwb2ludGVyIHBhc3QgdGhlbS4KKyAgc3RhdGljIHN0ZDo6cGFpcjxvZmZzZXRfdHlwZSwgb2Zmc2V0X3R5cGU+CisgIHJlYWROdW1CdWNrZXRzQW5kRW50cmllcyhjb25zdCB1bnNpZ25lZCBjaGFyIComQnVja2V0cykgeworICAgIGFzc2VydCgocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KEJ1Y2tldHMpICYgMHgzKSA9PSAwICYmCisgICAgICAgICAgICJidWNrZXRzIHNob3VsZCBiZSA0LWJ5dGUgYWxpZ25lZC4iKTsKKyAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKyAgICBvZmZzZXRfdHlwZSBOdW1CdWNrZXRzID0KKyAgICAgICAgZW5kaWFuOjpyZWFkTmV4dDxvZmZzZXRfdHlwZSwgbGl0dGxlLCBhbGlnbmVkPihCdWNrZXRzKTsKKyAgICBvZmZzZXRfdHlwZSBOdW1FbnRyaWVzID0KKyAgICAgICAgZW5kaWFuOjpyZWFkTmV4dDxvZmZzZXRfdHlwZSwgbGl0dGxlLCBhbGlnbmVkPihCdWNrZXRzKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoTnVtQnVja2V0cywgTnVtRW50cmllcyk7CisgIH0KKworICBvZmZzZXRfdHlwZSBnZXROdW1CdWNrZXRzKCkgY29uc3QgeyByZXR1cm4gTnVtQnVja2V0czsgfQorICBvZmZzZXRfdHlwZSBnZXROdW1FbnRyaWVzKCkgY29uc3QgeyByZXR1cm4gTnVtRW50cmllczsgfQorICBjb25zdCB1bnNpZ25lZCBjaGFyICpnZXRCYXNlKCkgY29uc3QgeyByZXR1cm4gQmFzZTsgfQorICBjb25zdCB1bnNpZ25lZCBjaGFyICpnZXRCdWNrZXRzKCkgY29uc3QgeyByZXR1cm4gQnVja2V0czsgfQorCisgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIE51bUVudHJpZXMgPT0gMDsgfQorCisgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICBpbnRlcm5hbF9rZXlfdHlwZSBLZXk7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3QgRGF0YTsKKyAgICBjb25zdCBvZmZzZXRfdHlwZSBMZW47CisgICAgSW5mbyAqSW5mb09iajsKKworICBwdWJsaWM6CisgICAgaXRlcmF0b3IoKSA6IEtleSgpLCBEYXRhKG51bGxwdHIpLCBMZW4oMCksIEluZm9PYmoobnVsbHB0cikge30KKyAgICBpdGVyYXRvcihjb25zdCBpbnRlcm5hbF9rZXlfdHlwZSBLLCBjb25zdCB1bnNpZ25lZCBjaGFyICpELCBvZmZzZXRfdHlwZSBMLAorICAgICAgICAgICAgIEluZm8gKkluZm9PYmopCisgICAgICAgIDogS2V5KEspLCBEYXRhKEQpLCBMZW4oTCksIEluZm9PYmooSW5mb09iaikge30KKworICAgIGRhdGFfdHlwZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBJbmZvT2JqLT5SZWFkRGF0YShLZXksIERhdGEsIExlbik7IH0KKworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmdldERhdGFQdHIoKSBjb25zdCB7IHJldHVybiBEYXRhOyB9CisgICAgb2Zmc2V0X3R5cGUgZ2V0RGF0YUxlbigpIGNvbnN0IHsgcmV0dXJuIExlbjsgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yICZYKSBjb25zdCB7IHJldHVybiBYLkRhdGEgPT0gRGF0YTsgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciAmWCkgY29uc3QgeyByZXR1cm4gWC5EYXRhICE9IERhdGE7IH0KKyAgfTsKKworICAvLy8gXGJyaWVmIExvb2sgdXAgdGhlIHN0b3JlZCBkYXRhIGZvciBhIHBhcnRpY3VsYXIga2V5LgorICBpdGVyYXRvciBmaW5kKGNvbnN0IGV4dGVybmFsX2tleV90eXBlICZFS2V5LCBJbmZvICpJbmZvUHRyID0gbnVsbHB0cikgeworICAgIGNvbnN0IGludGVybmFsX2tleV90eXBlICZJS2V5ID0gSW5mb09iai5HZXRJbnRlcm5hbEtleShFS2V5KTsKKyAgICBoYXNoX3ZhbHVlX3R5cGUgS2V5SGFzaCA9IEluZm9PYmouQ29tcHV0ZUhhc2goSUtleSk7CisgICAgcmV0dXJuIGZpbmRfaGFzaGVkKElLZXksIEtleUhhc2gsIEluZm9QdHIpOworICB9CisKKyAgLy8vIFxicmllZiBMb29rIHVwIHRoZSBzdG9yZWQgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIGtleSB3aXRoIGEga25vd24gaGFzaC4KKyAgaXRlcmF0b3IgZmluZF9oYXNoZWQoY29uc3QgaW50ZXJuYWxfa2V5X3R5cGUgJklLZXksIGhhc2hfdmFsdWVfdHlwZSBLZXlIYXNoLAorICAgICAgICAgICAgICAgICAgICAgICBJbmZvICpJbmZvUHRyID0gbnVsbHB0cikgeworICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworCisgICAgaWYgKCFJbmZvUHRyKQorICAgICAgSW5mb1B0ciA9ICZJbmZvT2JqOworCisgICAgLy8gRWFjaCBidWNrZXQgaXMganVzdCBhbiBvZmZzZXQgaW50byB0aGUgaGFzaCB0YWJsZSBmaWxlLgorICAgIG9mZnNldF90eXBlIElkeCA9IEtleUhhc2ggJiAoTnVtQnVja2V0cyAtIDEpOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKkJ1Y2tldCA9IEJ1Y2tldHMgKyBzaXplb2Yob2Zmc2V0X3R5cGUpICogSWR4OworCisgICAgb2Zmc2V0X3R5cGUgT2Zmc2V0ID0gZW5kaWFuOjpyZWFkTmV4dDxvZmZzZXRfdHlwZSwgbGl0dGxlLCBhbGlnbmVkPihCdWNrZXQpOworICAgIGlmIChPZmZzZXQgPT0gMCkKKyAgICAgIHJldHVybiBpdGVyYXRvcigpOyAvLyBFbXB0eSBidWNrZXQuCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqSXRlbXMgPSBCYXNlICsgT2Zmc2V0OworCisgICAgLy8gJ0l0ZW1zJyBzdGFydHMgd2l0aCBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUKKyAgICAvLyBudW1iZXIgb2YgaXRlbXMgaW4gdGhpcyBidWNrZXQuCisgICAgdW5zaWduZWQgTGVuID0gZW5kaWFuOjpyZWFkTmV4dDx1aW50MTZfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KEl0ZW1zKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBMZW47ICsraSkgeworICAgICAgLy8gUmVhZCB0aGUgaGFzaC4KKyAgICAgIGhhc2hfdmFsdWVfdHlwZSBJdGVtSGFzaCA9CisgICAgICAgICAgZW5kaWFuOjpyZWFkTmV4dDxoYXNoX3ZhbHVlX3R5cGUsIGxpdHRsZSwgdW5hbGlnbmVkPihJdGVtcyk7CisKKyAgICAgIC8vIERldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZSBrZXkgYW5kIHRoZSBkYXRhLgorICAgICAgY29uc3Qgc3RkOjpwYWlyPG9mZnNldF90eXBlLCBvZmZzZXRfdHlwZT4gJkwgPQorICAgICAgICAgIEluZm86OlJlYWRLZXlEYXRhTGVuZ3RoKEl0ZW1zKTsKKyAgICAgIG9mZnNldF90eXBlIEl0ZW1MZW4gPSBMLmZpcnN0ICsgTC5zZWNvbmQ7CisKKyAgICAgIC8vIENvbXBhcmUgdGhlIGhhc2hlcy4gIElmIHRoZXkgYXJlIG5vdCB0aGUgc2FtZSwgc2tpcCB0aGUgZW50cnkgZW50aXJlbHkuCisgICAgICBpZiAoSXRlbUhhc2ggIT0gS2V5SGFzaCkgeworICAgICAgICBJdGVtcyArPSBJdGVtTGVuOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gUmVhZCB0aGUga2V5LgorICAgICAgY29uc3QgaW50ZXJuYWxfa2V5X3R5cGUgJlggPQorICAgICAgICAgIEluZm9QdHItPlJlYWRLZXkoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0KUl0ZW1zLCBMLmZpcnN0KTsKKworICAgICAgLy8gSWYgdGhlIGtleSBkb2Vzbid0IG1hdGNoIGp1c3Qgc2tpcCByZWFkaW5nIHRoZSB2YWx1ZS4KKyAgICAgIGlmICghSW5mb1B0ci0+RXF1YWxLZXkoWCwgSUtleSkpIHsKKyAgICAgICAgSXRlbXMgKz0gSXRlbUxlbjsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIFRoZSBrZXkgbWF0Y2hlcyEKKyAgICAgIHJldHVybiBpdGVyYXRvcihYLCBJdGVtcyArIEwuZmlyc3QsIEwuc2Vjb25kLCBJbmZvUHRyKTsKKyAgICB9CisKKyAgICByZXR1cm4gaXRlcmF0b3IoKTsKKyAgfQorCisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCk7IH0KKworICBJbmZvICZnZXRJbmZvT2JqKCkgeyByZXR1cm4gSW5mb09iajsgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIHRoZSBoYXNoIHRhYmxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBCdWNrZXRzIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhhc2ggdGFibGUgaXRzZWxmLCB3aGljaCBmb2xsb3dzCisgIC8vLyB0aGUgcGF5bG9hZCBvZiBlbnRpcmUgc3RydWN0dXJlLiBUaGlzIGlzIHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICAvLy8gT25EaXNrSGFzaFRhYmxlR2VuZXJhdG9yOjpFbWl0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBCYXNlIGlzIHRoZSBwb2ludCBmcm9tIHdoaWNoIGFsbCBvZmZzZXRzIGludG8gdGhlIHN0cnVjdHVyZSBhcmUKKyAgLy8vIGJhc2VkLiBUaGlzIGlzIG9mZnNldCAwIGluIHRoZSBzdHJlYW0gdGhhdCB3YXMgdXNlZCB3aGVuIEVtaXR0aW5nIHRoZQorICAvLy8gdGFibGUuCisgIHN0YXRpYyBPbkRpc2tDaGFpbmVkSGFzaFRhYmxlICpDcmVhdGUoY29uc3QgdW5zaWduZWQgY2hhciAqQnVja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZm8gJkluZm9PYmogPSBJbmZvKCkpIHsKKyAgICBhc3NlcnQoQnVja2V0cyA+IEJhc2UpOworICAgIGF1dG8gTnVtQnVja2V0c0FuZEVudHJpZXMgPSByZWFkTnVtQnVja2V0c0FuZEVudHJpZXMoQnVja2V0cyk7CisgICAgcmV0dXJuIG5ldyBPbkRpc2tDaGFpbmVkSGFzaFRhYmxlPEluZm8+KE51bUJ1Y2tldHNBbmRFbnRyaWVzLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1CdWNrZXRzQW5kRW50cmllcy5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Y2tldHMsIEJhc2UsIEluZm9PYmopOworICB9Cit9OworCisvLy8gXGJyaWVmIFByb3ZpZGVzIGxvb2t1cCBhbmQgaXRlcmF0aW9uIG92ZXIgYW4gb24gZGlzayBoYXNoIHRhYmxlLgorLy8vCisvLy8gXGNvcHlkZXRhaWxzIGxsdm06Ok9uRGlza0NoYWluZWRIYXNoVGFibGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmZvPgorY2xhc3MgT25EaXNrSXRlcmFibGVDaGFpbmVkSGFzaFRhYmxlIDogcHVibGljIE9uRGlza0NoYWluZWRIYXNoVGFibGU8SW5mbz4geworICBjb25zdCB1bnNpZ25lZCBjaGFyICpQYXlsb2FkOworCitwdWJsaWM6CisgIHR5cGVkZWYgT25EaXNrQ2hhaW5lZEhhc2hUYWJsZTxJbmZvPiAgICAgICAgICBiYXNlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjppbnRlcm5hbF9rZXlfdHlwZSBpbnRlcm5hbF9rZXlfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmV4dGVybmFsX2tleV90eXBlIGV4dGVybmFsX2tleV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6ZGF0YV90eXBlICAgICAgICAgZGF0YV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6aGFzaF92YWx1ZV90eXBlICAgaGFzaF92YWx1ZV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6b2Zmc2V0X3R5cGUgICAgICAgb2Zmc2V0X3R5cGU7CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgSXRlcmF0ZXMgb3ZlciBhbGwgb2YgdGhlIGtleXMgaW4gdGhlIHRhYmxlLgorICBjbGFzcyBpdGVyYXRvcl9iYXNlIHsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpQdHI7CisgICAgb2Zmc2V0X3R5cGUgTnVtSXRlbXNJbkJ1Y2tldExlZnQ7CisgICAgb2Zmc2V0X3R5cGUgTnVtRW50cmllc0xlZnQ7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgZXh0ZXJuYWxfa2V5X3R5cGUgdmFsdWVfdHlwZTsKKworICAgIGl0ZXJhdG9yX2Jhc2UoY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3QgUHRyLCBvZmZzZXRfdHlwZSBOdW1FbnRyaWVzKQorICAgICAgICA6IFB0cihQdHIpLCBOdW1JdGVtc0luQnVja2V0TGVmdCgwKSwgTnVtRW50cmllc0xlZnQoTnVtRW50cmllcykge30KKyAgICBpdGVyYXRvcl9iYXNlKCkKKyAgICAgICAgOiBQdHIobnVsbHB0ciksIE51bUl0ZW1zSW5CdWNrZXRMZWZ0KDApLCBOdW1FbnRyaWVzTGVmdCgwKSB7fQorCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvcl9iYXNlICZYLCBjb25zdCBpdGVyYXRvcl9iYXNlICZZKSB7CisgICAgICByZXR1cm4gWC5OdW1FbnRyaWVzTGVmdCA9PSBZLk51bUVudHJpZXNMZWZ0OworICAgIH0KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yX2Jhc2UgJlgsIGNvbnN0IGl0ZXJhdG9yX2Jhc2UgJlkpIHsKKyAgICAgIHJldHVybiBYLk51bUVudHJpZXNMZWZ0ICE9IFkuTnVtRW50cmllc0xlZnQ7CisgICAgfQorCisgICAgLy8vIE1vdmUgdG8gdGhlIG5leHQgaXRlbS4KKyAgICB2b2lkIGFkdmFuY2UoKSB7CisgICAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKyAgICAgIGlmICghTnVtSXRlbXNJbkJ1Y2tldExlZnQpIHsKKyAgICAgICAgLy8gJ0l0ZW1zJyBzdGFydHMgd2l0aCBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUKKyAgICAgICAgLy8gbnVtYmVyIG9mIGl0ZW1zIGluIHRoaXMgYnVja2V0LgorICAgICAgICBOdW1JdGVtc0luQnVja2V0TGVmdCA9CisgICAgICAgICAgICBlbmRpYW46OnJlYWROZXh0PHVpbnQxNl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oUHRyKTsKKyAgICAgIH0KKyAgICAgIFB0ciArPSBzaXplb2YoaGFzaF92YWx1ZV90eXBlKTsgLy8gU2tpcCB0aGUgaGFzaC4KKyAgICAgIC8vIERldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZSBrZXkgYW5kIHRoZSBkYXRhLgorICAgICAgY29uc3Qgc3RkOjpwYWlyPG9mZnNldF90eXBlLCBvZmZzZXRfdHlwZT4gJkwgPQorICAgICAgICAgIEluZm86OlJlYWRLZXlEYXRhTGVuZ3RoKFB0cik7CisgICAgICBQdHIgKz0gTC5maXJzdCArIEwuc2Vjb25kOworICAgICAgYXNzZXJ0KE51bUl0ZW1zSW5CdWNrZXRMZWZ0KTsKKyAgICAgIC0tTnVtSXRlbXNJbkJ1Y2tldExlZnQ7CisgICAgICBhc3NlcnQoTnVtRW50cmllc0xlZnQpOworICAgICAgLS1OdW1FbnRyaWVzTGVmdDsKKyAgICB9CisKKyAgICAvLy8gR2V0IHRoZSBzdGFydCBvZiB0aGUgaXRlbSBhcyB3cml0dGVuIGJ5IHRoZSB0cmFpdCAoYWZ0ZXIgdGhlIGhhc2ggYW5kCisgICAgLy8vIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUga2V5IGFuZCB2YWx1ZSBsZW5ndGgpLgorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmdldEl0ZW0oKSBjb25zdCB7CisgICAgICByZXR1cm4gUHRyICsgKE51bUl0ZW1zSW5CdWNrZXRMZWZ0ID8gMCA6IDIpICsgc2l6ZW9mKGhhc2hfdmFsdWVfdHlwZSk7CisgICAgfQorICB9OworCitwdWJsaWM6CisgIE9uRGlza0l0ZXJhYmxlQ2hhaW5lZEhhc2hUYWJsZShvZmZzZXRfdHlwZSBOdW1CdWNrZXRzLCBvZmZzZXRfdHlwZSBOdW1FbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqQnVja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKlBheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5mbyAmSW5mb09iaiA9IEluZm8oKSkKKyAgICAgIDogYmFzZV90eXBlKE51bUJ1Y2tldHMsIE51bUVudHJpZXMsIEJ1Y2tldHMsIEJhc2UsIEluZm9PYmopLAorICAgICAgICBQYXlsb2FkKFBheWxvYWQpIHt9CisKKyAgLy8vIFxicmllZiBJdGVyYXRlcyBvdmVyIGFsbCBvZiB0aGUga2V5cyBpbiB0aGUgdGFibGUuCisgIGNsYXNzIGtleV9pdGVyYXRvciA6IHB1YmxpYyBpdGVyYXRvcl9iYXNlIHsKKyAgICBJbmZvICpJbmZvT2JqOworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIGV4dGVybmFsX2tleV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICBrZXlfaXRlcmF0b3IoY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3QgUHRyLCBvZmZzZXRfdHlwZSBOdW1FbnRyaWVzLAorICAgICAgICAgICAgICAgICBJbmZvICpJbmZvT2JqKQorICAgICAgICA6IGl0ZXJhdG9yX2Jhc2UoUHRyLCBOdW1FbnRyaWVzKSwgSW5mb09iaihJbmZvT2JqKSB7fQorICAgIGtleV9pdGVyYXRvcigpIDogaXRlcmF0b3JfYmFzZSgpLCBJbmZvT2JqKCkge30KKworICAgIGtleV9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICAgIHRoaXMtPmFkdmFuY2UoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAga2V5X2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7IC8vIFBvc3RpbmNyZW1lbnQKKyAgICAgIGtleV9pdGVyYXRvciB0bXAgPSAqdGhpczsKKyAgICAgICsrKnRoaXM7CisgICAgICByZXR1cm4gdG1wOworICAgIH0KKworICAgIGludGVybmFsX2tleV90eXBlIGdldEludGVybmFsS2V5KCkgY29uc3QgeworICAgICAgYXV0byAqTG9jYWxQdHIgPSB0aGlzLT5nZXRJdGVtKCk7CisKKyAgICAgIC8vIERldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZSBrZXkgYW5kIHRoZSBkYXRhLgorICAgICAgYXV0byBMID0gSW5mbzo6UmVhZEtleURhdGFMZW5ndGgoTG9jYWxQdHIpOworCisgICAgICAvLyBSZWFkIHRoZSBrZXkuCisgICAgICByZXR1cm4gSW5mb09iai0+UmVhZEtleShMb2NhbFB0ciwgTC5maXJzdCk7CisgICAgfQorCisgICAgdmFsdWVfdHlwZSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgICByZXR1cm4gSW5mb09iai0+R2V0RXh0ZXJuYWxLZXkoZ2V0SW50ZXJuYWxLZXkoKSk7CisgICAgfQorICB9OworCisgIGtleV9pdGVyYXRvciBrZXlfYmVnaW4oKSB7CisgICAgcmV0dXJuIGtleV9pdGVyYXRvcihQYXlsb2FkLCB0aGlzLT5nZXROdW1FbnRyaWVzKCksICZ0aGlzLT5nZXRJbmZvT2JqKCkpOworICB9CisgIGtleV9pdGVyYXRvciBrZXlfZW5kKCkgeyByZXR1cm4ga2V5X2l0ZXJhdG9yKCk7IH0KKworICBpdGVyYXRvcl9yYW5nZTxrZXlfaXRlcmF0b3I+IGtleXMoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2Uoa2V5X2JlZ2luKCksIGtleV9lbmQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIEl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSB0YWJsZSwgcmV0dXJuaW5nIHRoZSBkYXRhLgorICBjbGFzcyBkYXRhX2l0ZXJhdG9yIDogcHVibGljIGl0ZXJhdG9yX2Jhc2UgeworICAgIEluZm8gKkluZm9PYmo7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgZGF0YV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICBkYXRhX2l0ZXJhdG9yKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0IFB0ciwgb2Zmc2V0X3R5cGUgTnVtRW50cmllcywKKyAgICAgICAgICAgICAgICAgIEluZm8gKkluZm9PYmopCisgICAgICAgIDogaXRlcmF0b3JfYmFzZShQdHIsIE51bUVudHJpZXMpLCBJbmZvT2JqKEluZm9PYmopIHt9CisgICAgZGF0YV9pdGVyYXRvcigpIDogaXRlcmF0b3JfYmFzZSgpLCBJbmZvT2JqKCkge30KKworICAgIGRhdGFfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7IC8vIFByZWluY3JlbWVudAorICAgICAgdGhpcy0+YWR2YW5jZSgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBkYXRhX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7IC8vIFBvc3RpbmNyZW1lbnQKKyAgICAgIGRhdGFfaXRlcmF0b3IgdG1wID0gKnRoaXM7CisgICAgICArKyp0aGlzOworICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICB2YWx1ZV90eXBlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgIGF1dG8gKkxvY2FsUHRyID0gdGhpcy0+Z2V0SXRlbSgpOworCisgICAgICAvLyBEZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUga2V5IGFuZCB0aGUgZGF0YS4KKyAgICAgIGF1dG8gTCA9IEluZm86OlJlYWRLZXlEYXRhTGVuZ3RoKExvY2FsUHRyKTsKKworICAgICAgLy8gUmVhZCB0aGUga2V5LgorICAgICAgY29uc3QgaW50ZXJuYWxfa2V5X3R5cGUgJktleSA9IEluZm9PYmotPlJlYWRLZXkoTG9jYWxQdHIsIEwuZmlyc3QpOworICAgICAgcmV0dXJuIEluZm9PYmotPlJlYWREYXRhKEtleSwgTG9jYWxQdHIgKyBMLmZpcnN0LCBMLnNlY29uZCk7CisgICAgfQorICB9OworCisgIGRhdGFfaXRlcmF0b3IgZGF0YV9iZWdpbigpIHsKKyAgICByZXR1cm4gZGF0YV9pdGVyYXRvcihQYXlsb2FkLCB0aGlzLT5nZXROdW1FbnRyaWVzKCksICZ0aGlzLT5nZXRJbmZvT2JqKCkpOworICB9CisgIGRhdGFfaXRlcmF0b3IgZGF0YV9lbmQoKSB7IHJldHVybiBkYXRhX2l0ZXJhdG9yKCk7IH0KKworICBpdGVyYXRvcl9yYW5nZTxkYXRhX2l0ZXJhdG9yPiBkYXRhKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGRhdGFfYmVnaW4oKSwgZGF0YV9lbmQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSB0aGUgaGFzaCB0YWJsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQnVja2V0cyBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoYXNoIHRhYmxlIGl0c2VsZiwgd2hpY2ggZm9sbG93cworICAvLy8gdGhlIHBheWxvYWQgb2YgZW50aXJlIHN0cnVjdHVyZS4gVGhpcyBpcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKKyAgLy8vIE9uRGlza0hhc2hUYWJsZUdlbmVyYXRvcjo6RW1pdC4KKyAgLy8vCisgIC8vLyBccGFyYW0gUGF5bG9hZCBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgdGFibGUuICBUaGlzCisgIC8vLyBpcyBCYXNlIHBsdXMgYW55IHBhZGRpbmcgb3IgaGVhZGVyIGRhdGEgdGhhdCB3YXMgc3RvcmVkLCBpZSwgdGhlIG9mZnNldAorICAvLy8gdGhhdCB0aGUgc3RyZWFtIHdhcyBhdCB3aGVuIGNhbGxpbmcgRW1pdC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQmFzZSBpcyB0aGUgcG9pbnQgZnJvbSB3aGljaCBhbGwgb2Zmc2V0cyBpbnRvIHRoZSBzdHJ1Y3R1cmUgYXJlCisgIC8vLyBiYXNlZC4gVGhpcyBpcyBvZmZzZXQgMCBpbiB0aGUgc3RyZWFtIHRoYXQgd2FzIHVzZWQgd2hlbiBFbWl0dGluZyB0aGUKKyAgLy8vIHRhYmxlLgorICBzdGF0aWMgT25EaXNrSXRlcmFibGVDaGFpbmVkSGFzaFRhYmxlICoKKyAgQ3JlYXRlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKkJ1Y2tldHMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0IFBheWxvYWQsCisgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBCYXNlLCBjb25zdCBJbmZvICZJbmZvT2JqID0gSW5mbygpKSB7CisgICAgYXNzZXJ0KEJ1Y2tldHMgPiBCYXNlKTsKKyAgICBhdXRvIE51bUJ1Y2tldHNBbmRFbnRyaWVzID0KKyAgICAgICAgT25EaXNrSXRlcmFibGVDaGFpbmVkSGFzaFRhYmxlPEluZm8+OjpyZWFkTnVtQnVja2V0c0FuZEVudHJpZXMoQnVja2V0cyk7CisgICAgcmV0dXJuIG5ldyBPbkRpc2tJdGVyYWJsZUNoYWluZWRIYXNoVGFibGU8SW5mbz4oCisgICAgICAgIE51bUJ1Y2tldHNBbmRFbnRyaWVzLmZpcnN0LCBOdW1CdWNrZXRzQW5kRW50cmllcy5zZWNvbmQsCisgICAgICAgIEJ1Y2tldHMsIFBheWxvYWQsIEJhc2UsIEluZm9PYmopOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9PcHRpb25zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvT3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMTk4MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvT3B0aW9ucy5oCkBAIC0wLDAgKzEsMTIwIEBACisvLz09PS0gbGx2bS9TdXBwb3J0L09wdGlvbnMuaCAtIERlYnVnIG9wdGlvbnMgc3VwcG9ydCAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIGRlY2xhcmVzIGhlbHBlciBvYmplY3RzIGZvciBkZWZpbmluZyBkZWJ1ZyBvcHRpb25zIHRoYXQgY2FuIGJlCisvLy8gY29uZmlndXJlZCB2aWEgdGhlIGNvbW1hbmQgbGluZS4gVGhlIG5ldyBBUEkgY3VycmVudGx5IGJ1aWxkcyBvbiB0aGUgY2w6Om9wdAorLy8vIEFQSSwgYnV0IGRvZXMgbm90IHJlcXVpcmUgdGhlIHVzZSBvZiBzdGF0aWMgZ2xvYmFscy4KKy8vLworLy8vIFdpdGggdGhpcyBBUEkgb3B0aW9ucyBhcmUgcmVnaXN0ZXJlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIEZvciBwYXNzZXMsIHRoaXMKKy8vLyBoYXBwZW5zIGR1cmluZyBwYXNzIGluaXRpYWxpemF0aW9uLiBQYXNzZXMgd2l0aCBvcHRpb25zIHdpbGwgY2FsbCBhIHN0YXRpYworLy8vIHJlZ2lzdGVyT3B0aW9ucyBtZXRob2QgZHVyaW5nIGluaXRpYWxpemF0aW9uIHRoYXQgcmVnaXN0ZXJzIG9wdGlvbnMgd2l0aCB0aGUKKy8vLyBPcHRpb25SZWdpc3RyeS4gQW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiByZWdpc3Rlck9wdGlvbnMgaXM6CisvLy8KKy8vLyBzdGF0aWMgdm9pZCByZWdpc3Rlck9wdGlvbnMoKSB7CisvLy8gICBPcHRpb25SZWdpc3RyeTo6cmVnaXN0ZXJPcHRpb248Ym9vbCwgU2NhbGFyaXplciwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNjYWxhcml6ZXI6OlNjYWxhcml6ZUxvYWRTdG9yZT4oCisvLy8gICAgICAgInNjYWxhcml6ZS1sb2FkLXN0b3JlIiwKKy8vLyAgICAgICAiQWxsb3cgdGhlIHNjYWxhcml6ZXIgcGFzcyB0byBzY2FsYXJpemUgbG9hZHMgYW5kIHN0b3JlIiwgZmFsc2UpOworLy8vIH0KKy8vLworLy8vIFdoZW4gcmVhZGluZyBkYXRhIGZvciBvcHRpb25zIHRoZSBpbnRlcmZhY2UgaXMgdmlhIHRoZSBMTFZNQ29udGV4dC4gT3B0aW9uCisvLy8gZGF0YSBmb3IgcGFzc2VzIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIGNvbnRleHQgZHVyaW5nIGRvSW5pdGlhbGl6YXRpb24uIEFuCisvLy8gZXhhbXBsZSBvZiByZWFkaW5nIHRoZSBhYm92ZSBvcHRpb24gd291bGQgYmU6CisvLy8KKy8vLyBTY2FsYXJpemVMb2FkU3RvcmUgPQorLy8vICAgTS5nZXRDb250ZXh0KCkuZ2V0T3B0aW9uPGJvb2wsCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyaXplciwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU2NhbGFyaXplcjo6U2NhbGFyaXplTG9hZFN0b3JlPigpOworLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9PUFRJT05TX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX09QVElPTlNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgZGV0YWlsIHsKKworLy8gT3B0aW9ucyBhcmUga2V5ZWQgb2YgdGhlIHVuaXF1ZSBhZGRyZXNzIG9mIGEgc3RhdGljIGNoYXJhY3RlciBzeW50aGVzaXplZAorLy8gYmFzZWQgb24gdGVtcGxhdGUgYXJndW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIFZhbFQsIHR5cGVuYW1lIEJhc2UsIFZhbFQoQmFzZTo6Kk1lbSk+IGNsYXNzIE9wdGlvbktleSB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbFQsIHR5cGVuYW1lIEJhc2UsIFZhbFQoQmFzZTo6Kk1lbSk+CitjaGFyIE9wdGlvbktleTxWYWxULCBCYXNlLCBNZW0+OjpJRCA9IDA7CisKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorCisvLy8gXGJyaWVmIFNpbmdsZXRvbiBjbGFzcyB1c2VkIHRvIHJlZ2lzdGVyIGRlYnVnIG9wdGlvbnMuCisvLy8KKy8vLyBUaGUgT3B0aW9uUmVnaXN0cnkgaXMgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIGxpZmV0aW1lcyBvZiB0aGUgb3B0aW9ucyBhbmQKKy8vLyBwcm92aWRlcyBpbnRlcmZhY2VzIGZvciBvcHRpb24gcmVnaXN0cmF0aW9uIGFuZCByZWFkaW5nIHZhbHVlcyBmcm9tIG9wdGlvbnMuCisvLy8gVGhpcyBvYmplY3QgaXMgYSBzaW5nbGV0b24sIG9ubHkgb25lIGluc3RhbmNlIHNob3VsZCBldmVyIGV4aXN0IHNvIHRoYXQgYWxsCisvLy8gb3B0aW9ucyBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgc2FtZSBwbGFjZS4KK2NsYXNzIE9wdGlvblJlZ2lzdHJ5IHsKK3ByaXZhdGU6CisgIERlbnNlTWFwPHZvaWQgKiwgY2w6Ok9wdGlvbiAqPiBPcHRpb25zOworCisgIC8vLyBcYnJpZWYgQWRkcyBhIGNsOjpPcHRpb24gdG8gdGhlIHJlZ2lzdHJ5LgorICAvLy8KKyAgLy8vIFxwYXJhbSBLZXkgdW5pcXVlIGtleSBmb3Igb3B0aW9uCisgIC8vLyBccGFyYW0gTyBvcHRpb24gdG8gbWFwIHRvIFxwIEtleQorICAvLy8KKyAgLy8vIEFsbG9jYXRlZCBjbDo6T3B0aW9ucyBhcmUgb3duZWQgYnkgdGhlIE9wdGlvblJlZ2lzdHJ5IGFuZCBhcmUgZGVhbGxvY2F0ZWQKKyAgLy8vIG9uIGRlc3RydWN0aW9uIG9yIHJlbW92YWwKKyAgdm9pZCBhZGRPcHRpb24odm9pZCAqS2V5LCBjbDo6T3B0aW9uICpPKTsKKworcHVibGljOgorICB+T3B0aW9uUmVnaXN0cnkoKTsKKyAgT3B0aW9uUmVnaXN0cnkoKSB7fQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorICBzdGF0aWMgT3B0aW9uUmVnaXN0cnkgJmluc3RhbmNlKCk7CisKKyAgLy8vIFxicmllZiBSZWdpc3RlcnMgYW4gb3B0aW9uIHdpdGggdGhlIE9wdGlvblJlZ2lzdHJ5IHNpbmdsZXRvbi4KKyAgLy8vCisgIC8vLyBcdHBhcmFtIFZhbFQgdHlwZSBvZiB0aGUgb3B0aW9uJ3MgZGF0YQorICAvLy8gXHRwYXJhbSBCYXNlIGNsYXNzIHVzZWQgdG8ga2V5IHRoZSBvcHRpb24KKyAgLy8vIFx0cGFyYW0gTWVtIG1lbWJlciBvZiBccCBCYXNlIHVzZWQgZm9yIGtleWluZyB0aGUgb3B0aW9uCisgIC8vLworICAvLy8gT3B0aW9ucyBhcmUga2V5ZWQgb2ZmIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHRvIGdlbmVyYXRlIHVuaXF1ZSBzdGF0aWMKKyAgLy8vIGNoYXJhY3RlcnMuIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSAoMSkgdGhlIHR5cGUgb2YgdGhlIGRhdGEgdGhlCisgIC8vLyBvcHRpb24gc3RvcmVzIChccCBWYWxUKSwgdGhlIGNsYXNzIHRoYXQgd2lsbCByZWFkIHRoZSBvcHRpb24gKFxwIEJhc2UpLAorICAvLy8gYW5kIHRoZSBtZW1iZXIgdGhhdCB0aGUgY2xhc3Mgd2lsbCBzdG9yZSB0aGUgZGF0YSBpbnRvIChccCBNZW0pLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsVCwgdHlwZW5hbWUgQmFzZSwgVmFsVChCYXNlOjoqTWVtKT4KKyAgc3RhdGljIHZvaWQgcmVnaXN0ZXJPcHRpb24oU3RyaW5nUmVmIEFyZ1N0ciwgU3RyaW5nUmVmIERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbFQgJkluaXRWYWx1ZSkgeworICAgIGNsOjpvcHQ8VmFsVD4gKk9wdGlvbiA9IG5ldyBjbDo6b3B0PFZhbFQ+KEFyZ1N0ciwgY2w6OmRlc2MoRGVzYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OkhpZGRlbiwgY2w6OmluaXQoSW5pdFZhbHVlKSk7CisgICAgaW5zdGFuY2UoKS5hZGRPcHRpb24oJmRldGFpbDo6T3B0aW9uS2V5PFZhbFQsIEJhc2UsIE1lbT46OklELCBPcHRpb24pOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uLgorICAvLy8KKyAgLy8vIFx0cGFyYW0gVmFsVCB0eXBlIG9mIHRoZSBvcHRpb24ncyBkYXRhCisgIC8vLyBcdHBhcmFtIEJhc2UgY2xhc3MgdXNlZCB0byBrZXkgdGhlIG9wdGlvbgorICAvLy8gXHRwYXJhbSBNZW0gbWVtYmVyIG9mIFxwIEJhc2UgdXNlZCBmb3Iga2V5aW5nIHRoZSBvcHRpb24KKyAgLy8vCisgIC8vLyBSZWFkcyBvcHRpb24gdmFsdWVzIGJhc2VkIG9uIHRoZSBrZXkgZ2VuZXJhdGVkIGJ5IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgorICAvLy8gS2V5aW5nIGZvciBnZXQoKSBpcyB0aGUgc2FtZSBhcyBrZXlpbmcgZm9yIHJlZ2lzdGVyT3B0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsVCwgdHlwZW5hbWUgQmFzZSwgVmFsVChCYXNlOjoqTWVtKT4gVmFsVCBnZXQoKSBjb25zdCB7CisgICAgYXV0byBJdCA9IE9wdGlvbnMuZmluZCgmZGV0YWlsOjpPcHRpb25LZXk8VmFsVCwgQmFzZSwgTWVtPjo6SUQpOworICAgIGFzc2VydChJdCAhPSBPcHRpb25zLmVuZCgpICYmICJPcHRpb24gbm90IGluIE9wdGlvblJlZ2lzdHJ5Iik7CisgICAgcmV0dXJuICooY2w6Om9wdDxWYWxUPiAqKUl0LT5zZWNvbmQ7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUGFyYWxsZWwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QYXJhbGxlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYjJiY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUGFyYWxsZWwuaApAQCAtMCwwICsxLDI0NyBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9QYXJhbGxlbC5oIC0gUGFyYWxsZWwgYWxnb3JpdGhtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfUEFSQUxMRUxfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfUEFSQUxMRUxfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9Db25maWcvbGx2bS1jb25maWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG11dGV4PgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgTExWTV9FTkFCTEVfVEhSRUFEUworI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ1MzApCisjaW5jbHVkZSA8Y29uY3J0Lmg+CisjaW5jbHVkZSA8cHBsLmg+CisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIHBhcmFsbGVsIHsKK3N0cnVjdCBzZXF1ZW50aWFsX2V4ZWN1dGlvbl9wb2xpY3kge307CitzdHJ1Y3QgcGFyYWxsZWxfZXhlY3V0aW9uX3BvbGljeSB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNfZXhlY3V0aW9uX3BvbGljeQorICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8CisgICAgICAgICAgYm9vbCwgbGx2bTo6aXNfb25lX29mPFQsIHNlcXVlbnRpYWxfZXhlY3V0aW9uX3BvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWxsZWxfZXhlY3V0aW9uX3BvbGljeT46OnZhbHVlPiB7fTsKKworY29uc3RleHByIHNlcXVlbnRpYWxfZXhlY3V0aW9uX3BvbGljeSBzZXF7fTsKK2NvbnN0ZXhwciBwYXJhbGxlbF9leGVjdXRpb25fcG9saWN5IHBhcnt9OworCituYW1lc3BhY2UgZGV0YWlsIHsKKworI2lmIExMVk1fRU5BQkxFX1RIUkVBRFMKKworY2xhc3MgTGF0Y2ggeworICB1aW50MzJfdCBDb3VudDsKKyAgbXV0YWJsZSBzdGQ6Om11dGV4IE11dGV4OworICBtdXRhYmxlIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIENvbmQ7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgTGF0Y2godWludDMyX3QgQ291bnQgPSAwKSA6IENvdW50KENvdW50KSB7fQorICB+TGF0Y2goKSB7IHN5bmMoKTsgfQorCisgIHZvaWQgaW5jKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKE11dGV4KTsKKyAgICArK0NvdW50OworICB9CisKKyAgdm9pZCBkZWMoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soTXV0ZXgpOworICAgIGlmICgtLUNvdW50ID09IDApCisgICAgICBDb25kLm5vdGlmeV9hbGwoKTsKKyAgfQorCisgIHZvaWQgc3luYygpIGNvbnN0IHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soTXV0ZXgpOworICAgIENvbmQud2FpdChsb2NrLCBbJl0geyByZXR1cm4gQ291bnQgPT0gMDsgfSk7CisgIH0KK307CisKK2NsYXNzIFRhc2tHcm91cCB7CisgIExhdGNoIEw7CisKK3B1YmxpYzoKKyAgdm9pZCBzcGF3bihzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZik7CisKKyAgdm9pZCBzeW5jKCkgY29uc3QgeyBMLnN5bmMoKTsgfQorfTsKKworI2lmIGRlZmluZWQoX01TQ19WRVIpCit0ZW1wbGF0ZSA8Y2xhc3MgUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIENvbXBhcmF0b3I+Cit2b2lkIHBhcmFsbGVsX3NvcnQoUmFuZG9tQWNjZXNzSXRlcmF0b3IgU3RhcnQsIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIEVuZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDb21wYXJhdG9yICZDb21wKSB7CisgIGNvbmN1cnJlbmN5OjpwYXJhbGxlbF9zb3J0KFN0YXJ0LCBFbmQsIENvbXApOworfQordGVtcGxhdGUgPGNsYXNzIEl0ZXJUeSwgY2xhc3MgRnVuY1R5Pgordm9pZCBwYXJhbGxlbF9mb3JfZWFjaChJdGVyVHkgQmVnaW4sIEl0ZXJUeSBFbmQsIEZ1bmNUeSBGbikgeworICBjb25jdXJyZW5jeTo6cGFyYWxsZWxfZm9yX2VhY2goQmVnaW4sIEVuZCwgRm4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSW5kZXhUeSwgY2xhc3MgRnVuY1R5Pgordm9pZCBwYXJhbGxlbF9mb3JfZWFjaF9uKEluZGV4VHkgQmVnaW4sIEluZGV4VHkgRW5kLCBGdW5jVHkgRm4pIHsKKyAgY29uY3VycmVuY3k6OnBhcmFsbGVsX2ZvcihCZWdpbiwgRW5kLCBGbik7Cit9CisKKyNlbHNlCitjb25zdCBwdHJkaWZmX3QgTWluUGFyYWxsZWxTaXplID0gMTAyNDsKKworLy8vIFxicmllZiBJbmNsdXNpdmUgbWVkaWFuLgordGVtcGxhdGUgPGNsYXNzIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBDb21wYXJhdG9yPgorUmFuZG9tQWNjZXNzSXRlcmF0b3IgbWVkaWFuT2YzKFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21wYXJhdG9yICZDb21wKSB7CisgIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIE1pZCA9IFN0YXJ0ICsgKHN0ZDo6ZGlzdGFuY2UoU3RhcnQsIEVuZCkgLyAyKTsKKyAgcmV0dXJuIENvbXAoKlN0YXJ0LCAqKEVuZCAtIDEpKQorICAgICAgICAgICAgID8gKENvbXAoKk1pZCwgKihFbmQgLSAxKSkgPyAoQ29tcCgqU3RhcnQsICpNaWQpID8gTWlkIDogU3RhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEVuZCAtIDEpCisgICAgICAgICAgICAgOiAoQ29tcCgqTWlkLCAqU3RhcnQpID8gKENvbXAoKihFbmQgLSAxKSwgKk1pZCkgPyBNaWQgOiBFbmQgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFN0YXJ0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBDb21wYXJhdG9yPgordm9pZCBwYXJhbGxlbF9xdWlja19zb3J0KFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIFN0YXJ0LCBSYW5kb21BY2Nlc3NJdGVyYXRvciBFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tcGFyYXRvciAmQ29tcCwgVGFza0dyb3VwICZURywgc2l6ZV90IERlcHRoKSB7CisgIC8vIERvIGEgc2VxdWVudGlhbCBzb3J0IGZvciBzbWFsbCBpbnB1dHMuCisgIGlmIChzdGQ6OmRpc3RhbmNlKFN0YXJ0LCBFbmQpIDwgZGV0YWlsOjpNaW5QYXJhbGxlbFNpemUgfHwgRGVwdGggPT0gMCkgeworICAgIHN0ZDo6c29ydChTdGFydCwgRW5kLCBDb21wKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBQYXJ0aXRpb24uCisgIGF1dG8gUGl2b3QgPSBtZWRpYW5PZjMoU3RhcnQsIEVuZCwgQ29tcCk7CisgIC8vIE1vdmUgUGl2b3QgdG8gRW5kLgorICBzdGQ6OnN3YXAoKihFbmQgLSAxKSwgKlBpdm90KTsKKyAgUGl2b3QgPSBzdGQ6OnBhcnRpdGlvbihTdGFydCwgRW5kIC0gMSwgWyZDb21wLCBFbmRdKGRlY2x0eXBlKCpTdGFydCkgVikgeworICAgIHJldHVybiBDb21wKFYsICooRW5kIC0gMSkpOworICB9KTsKKyAgLy8gTW92ZSBQaXZvdCB0byBtaWRkbGUgb2YgcGFydGl0aW9uLgorICBzdGQ6OnN3YXAoKlBpdm90LCAqKEVuZCAtIDEpKTsKKworICAvLyBSZWN1cnNlLgorICBURy5zcGF3bihbPSwgJkNvbXAsICZUR10geworICAgIHBhcmFsbGVsX3F1aWNrX3NvcnQoU3RhcnQsIFBpdm90LCBDb21wLCBURywgRGVwdGggLSAxKTsKKyAgfSk7CisgIHBhcmFsbGVsX3F1aWNrX3NvcnQoUGl2b3QgKyAxLCBFbmQsIENvbXAsIFRHLCBEZXB0aCAtIDEpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIENvbXBhcmF0b3I+Cit2b2lkIHBhcmFsbGVsX3NvcnQoUmFuZG9tQWNjZXNzSXRlcmF0b3IgU3RhcnQsIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIEVuZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDb21wYXJhdG9yICZDb21wKSB7CisgIFRhc2tHcm91cCBURzsKKyAgcGFyYWxsZWxfcXVpY2tfc29ydChTdGFydCwgRW5kLCBDb21wLCBURywKKyAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpMb2cyXzY0KHN0ZDo6ZGlzdGFuY2UoU3RhcnQsIEVuZCkpICsgMSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBJdGVyVHksIGNsYXNzIEZ1bmNUeT4KK3ZvaWQgcGFyYWxsZWxfZm9yX2VhY2goSXRlclR5IEJlZ2luLCBJdGVyVHkgRW5kLCBGdW5jVHkgRm4pIHsKKyAgLy8gVGFza0dyb3VwIGhhcyBhIHJlbGF0aXZlbHkgaGlnaCBvdmVyaGVhZCwgc28gd2Ugd2FudCB0byByZWR1Y2UKKyAgLy8gdGhlIG51bWJlciBvZiBzcGF3bigpIGNhbGxzLiBXZSdsbCBjcmVhdGUgdXAgdG8gMTAyNCB0YXNrcyBoZXJlLgorICAvLyAoTm90ZSB0aGF0IDEwMjQgaXMgYW4gYXJiaXRyYXJ5IG51bWJlci4gVGhpcyBjb2RlIHByb2JhYmx5IG5lZWRzCisgIC8vIGltcHJvdmluZyB0byB0YWtlIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvcmVzIGludG8gYWNjb3VudC4pCisgIHB0cmRpZmZfdCBUYXNrU2l6ZSA9IHN0ZDo6ZGlzdGFuY2UoQmVnaW4sIEVuZCkgLyAxMDI0OworICBpZiAoVGFza1NpemUgPT0gMCkKKyAgICBUYXNrU2l6ZSA9IDE7CisKKyAgVGFza0dyb3VwIFRHOworICB3aGlsZSAoVGFza1NpemUgPCBzdGQ6OmRpc3RhbmNlKEJlZ2luLCBFbmQpKSB7CisgICAgVEcuc3Bhd24oWz0sICZGbl0geyBzdGQ6OmZvcl9lYWNoKEJlZ2luLCBCZWdpbiArIFRhc2tTaXplLCBGbik7IH0pOworICAgIEJlZ2luICs9IFRhc2tTaXplOworICB9CisgIHN0ZDo6Zm9yX2VhY2goQmVnaW4sIEVuZCwgRm4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSW5kZXhUeSwgY2xhc3MgRnVuY1R5Pgordm9pZCBwYXJhbGxlbF9mb3JfZWFjaF9uKEluZGV4VHkgQmVnaW4sIEluZGV4VHkgRW5kLCBGdW5jVHkgRm4pIHsKKyAgcHRyZGlmZl90IFRhc2tTaXplID0gKEVuZCAtIEJlZ2luKSAvIDEwMjQ7CisgIGlmIChUYXNrU2l6ZSA9PSAwKQorICAgIFRhc2tTaXplID0gMTsKKworICBUYXNrR3JvdXAgVEc7CisgIEluZGV4VHkgSSA9IEJlZ2luOworICBmb3IgKDsgSSArIFRhc2tTaXplIDwgRW5kOyBJICs9IFRhc2tTaXplKSB7CisgICAgVEcuc3Bhd24oWz0sICZGbl0geworICAgICAgZm9yIChJbmRleFR5IEogPSBJLCBFID0gSSArIFRhc2tTaXplOyBKICE9IEU7ICsrSikKKyAgICAgICAgRm4oSik7CisgICAgfSk7CisgIH0KKyAgZm9yIChJbmRleFR5IEogPSBJOyBKIDwgRW5kOyArK0opCisgICAgRm4oSik7Cit9CisKKyNlbmRpZgorCisjZW5kaWYKKwordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+Cit1c2luZyBEZWZDb21wYXJhdG9yID0KKyAgICBzdGQ6Omxlc3M8dHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SXRlcj46OnZhbHVlX3R5cGU+OworCit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKKworLy8gc2VxdWVudGlhbCBhbGdvcml0aG0gaW1wbGVtZW50YXRpb25zLgordGVtcGxhdGUgPGNsYXNzIFBvbGljeSwgY2xhc3MgUmFuZG9tQWNjZXNzSXRlcmF0b3IsCisgICAgICAgICAgY2xhc3MgQ29tcGFyYXRvciA9IGRldGFpbDo6RGVmQ29tcGFyYXRvcjxSYW5kb21BY2Nlc3NJdGVyYXRvcj4+Cit2b2lkIHNvcnQoUG9saWN5IHBvbGljeSwgUmFuZG9tQWNjZXNzSXRlcmF0b3IgU3RhcnQsIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIEVuZCwKKyAgICAgICAgICBjb25zdCBDb21wYXJhdG9yICZDb21wID0gQ29tcGFyYXRvcigpKSB7CisgIHN0YXRpY19hc3NlcnQoaXNfZXhlY3V0aW9uX3BvbGljeTxQb2xpY3k+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBleGVjdXRpb24gcG9saWN5ISIpOworICBzdGQ6OnNvcnQoU3RhcnQsIEVuZCwgQ29tcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBQb2xpY3ksIGNsYXNzIEl0ZXJUeSwgY2xhc3MgRnVuY1R5Pgordm9pZCBmb3JfZWFjaChQb2xpY3kgcG9saWN5LCBJdGVyVHkgQmVnaW4sIEl0ZXJUeSBFbmQsIEZ1bmNUeSBGbikgeworICBzdGF0aWNfYXNzZXJ0KGlzX2V4ZWN1dGlvbl9wb2xpY3k8UG9saWN5Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIkludmFsaWQgZXhlY3V0aW9uIHBvbGljeSEiKTsKKyAgc3RkOjpmb3JfZWFjaChCZWdpbiwgRW5kLCBGbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBQb2xpY3ksIGNsYXNzIEluZGV4VHksIGNsYXNzIEZ1bmNUeT4KK3ZvaWQgZm9yX2VhY2hfbihQb2xpY3kgcG9saWN5LCBJbmRleFR5IEJlZ2luLCBJbmRleFR5IEVuZCwgRnVuY1R5IEZuKSB7CisgIHN0YXRpY19hc3NlcnQoaXNfZXhlY3V0aW9uX3BvbGljeTxQb2xpY3k+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBleGVjdXRpb24gcG9saWN5ISIpOworICBmb3IgKEluZGV4VHkgSSA9IEJlZ2luOyBJICE9IEVuZDsgKytJKQorICAgIEZuKEkpOworfQorCisvLyBQYXJhbGxlbCBhbGdvcml0aG0gaW1wbGVtZW50YXRpb25zLCBvbmx5IGF2YWlsYWJsZSB3aGVuIExMVk1fRU5BQkxFX1RIUkVBRFMKKy8vIGlzIHRydWUuCisjaWYgTExWTV9FTkFCTEVfVEhSRUFEUwordGVtcGxhdGUgPGNsYXNzIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yLAorICAgICAgICAgIGNsYXNzIENvbXBhcmF0b3IgPSBkZXRhaWw6OkRlZkNvbXBhcmF0b3I8UmFuZG9tQWNjZXNzSXRlcmF0b3I+Pgordm9pZCBzb3J0KHBhcmFsbGVsX2V4ZWN1dGlvbl9wb2xpY3kgcG9saWN5LCBSYW5kb21BY2Nlc3NJdGVyYXRvciBTdGFydCwKKyAgICAgICAgICBSYW5kb21BY2Nlc3NJdGVyYXRvciBFbmQsIGNvbnN0IENvbXBhcmF0b3IgJkNvbXAgPSBDb21wYXJhdG9yKCkpIHsKKyAgZGV0YWlsOjpwYXJhbGxlbF9zb3J0KFN0YXJ0LCBFbmQsIENvbXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSXRlclR5LCBjbGFzcyBGdW5jVHk+Cit2b2lkIGZvcl9lYWNoKHBhcmFsbGVsX2V4ZWN1dGlvbl9wb2xpY3kgcG9saWN5LCBJdGVyVHkgQmVnaW4sIEl0ZXJUeSBFbmQsCisgICAgICAgICAgICAgIEZ1bmNUeSBGbikgeworICBkZXRhaWw6OnBhcmFsbGVsX2Zvcl9lYWNoKEJlZ2luLCBFbmQsIEZuKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEluZGV4VHksIGNsYXNzIEZ1bmNUeT4KK3ZvaWQgZm9yX2VhY2hfbihwYXJhbGxlbF9leGVjdXRpb25fcG9saWN5IHBvbGljeSwgSW5kZXhUeSBCZWdpbiwgSW5kZXhUeSBFbmQsCisgICAgICAgICAgICAgICAgRnVuY1R5IEZuKSB7CisgIGRldGFpbDo6cGFyYWxsZWxfZm9yX2VhY2hfbihCZWdpbiwgRW5kLCBGbik7Cit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgcGFyYWxsZWwKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9QQVJBTExFTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUGF0aC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1BhdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTk3OTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1BhdGguaApAQCAtMCwwICsxLDQ3NCBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9QYXRoLmggLSBQYXRoIE9wZXJhdGluZyBTeXN0ZW0gQ29uY2VwdCAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGxsdm06OnN5czo6cGF0aCBuYW1lc3BhY2UuIEl0IGlzIGRlc2lnbmVkIGFmdGVyCisvLyBUUjIvYm9vc3QgZmlsZXN5c3RlbSAodjMpLCBidXQgbW9kaWZpZWQgdG8gcmVtb3ZlIGV4Y2VwdGlvbiBoYW5kbGluZyBhbmQgdGhlCisvLyBwYXRoIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1BBVEhfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfUEFUSF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugc3lzIHsKK25hbWVzcGFjZSBwYXRoIHsKKworZW51bSBjbGFzcyBTdHlsZSB7IHdpbmRvd3MsIHBvc2l4LCBuYXRpdmUgfTsKKworLy8vIEBuYW1lIExleGljYWwgQ29tcG9uZW50IEl0ZXJhdG9yCisvLy8gQHsKKworLy8vIEBicmllZiBQYXRoIGl0ZXJhdG9yLgorLy8vCisvLy8gVGhpcyBpcyBhbiBpbnB1dCBpdGVyYXRvciB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlIGluZGl2aWR1YWwgY29tcG9uZW50cyBpbgorLy8vIFxhIHBhdGguIFRoZSB0cmF2ZXJzYWwgb3JkZXIgaXMgYXMgZm9sbG93czoKKy8vLyAqIFRoZSByb290LW5hbWUgZWxlbWVudCwgaWYgcHJlc2VudC4KKy8vLyAqIFRoZSByb290LWRpcmVjdG9yeSBlbGVtZW50LCBpZiBwcmVzZW50LgorLy8vICogRWFjaCBzdWNjZXNzaXZlIGZpbGVuYW1lIGVsZW1lbnQsIGlmIHByZXNlbnQuCisvLy8gKiBEb3QsIGlmIG9uZSBvciBtb3JlIHRyYWlsaW5nIG5vbi1yb290IHNsYXNoIGNoYXJhY3RlcnMgYXJlIHByZXNlbnQuCisvLy8gVHJhdmVyc2luZyBiYWNrd2FyZHMgaXMgcG9zc2libGUgd2l0aCBcYSByZXZlcnNlX2l0ZXJhdG9yCisvLy8KKy8vLyBJdGVyYXRpb24gZXhhbXBsZXMuIEVhY2ggY29tcG9uZW50IGlzIHNlcGFyYXRlZCBieSAnLCc6CisvLy8gQGNvZGUKKy8vLyAgIC8gICAgICAgICAgPT4gLworLy8vICAgL2ZvbyAgICAgICA9PiAvLGZvbworLy8vICAgZm9vLyAgICAgICA9PiBmb28sLgorLy8vICAgL2Zvby9iYXIgICA9PiAvLGZvbyxiYXIKKy8vLyAgIC4uLyAgICAgICAgPT4gLi4sLgorLy8vICAgQzpcZm9vXGJhciA9PiBDOiwvLGZvbyxiYXIKKy8vLyBAZW5kY29kZQorY2xhc3MgY29uc3RfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTxjb25zdF9pdGVyYXRvciwgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nUmVmPiB7CisgIFN0cmluZ1JlZiBQYXRoOyAgICAgIC8vLzwgVGhlIGVudGlyZSBwYXRoLgorICBTdHJpbmdSZWYgQ29tcG9uZW50OyAvLy88IFRoZSBjdXJyZW50IGNvbXBvbmVudC4gTm90IG5lY2Vzc2FyaWx5IGluIFBhdGguCisgIHNpemVfdCAgICBQb3NpdGlvbjsgIC8vLzwgVGhlIGl0ZXJhdG9ycyBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiBQYXRoLgorICBTdHlsZSBTOyAgICAgICAgICAgICAvLy88IFRoZSBwYXRoIHN0eWxlIHRvIHVzZS4KKworICAvLyBBbiBlbmQgaXRlcmF0b3IgaGFzIFBvc2l0aW9uID0gUGF0aC5zaXplKCkgKyAxLgorICBmcmllbmQgY29uc3RfaXRlcmF0b3IgYmVnaW4oU3RyaW5nUmVmIHBhdGgsIFN0eWxlIHN0eWxlKTsKKyAgZnJpZW5kIGNvbnN0X2l0ZXJhdG9yIGVuZChTdHJpbmdSZWYgcGF0aCk7CisKK3B1YmxpYzoKKyAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIENvbXBvbmVudDsgfQorICBjb25zdF9pdGVyYXRvciAmb3BlcmF0b3IrKygpOyAgICAvLyBwcmVpbmNyZW1lbnQKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNvbnN0X2l0ZXJhdG9yICZSSFMpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgRGlmZmVyZW5jZSBpbiBieXRlcyBiZXR3ZWVuIHRoaXMgYW5kIFJIUy4KKyAgcHRyZGlmZl90IG9wZXJhdG9yLShjb25zdCBjb25zdF9pdGVyYXRvciAmUkhTKSBjb25zdDsKK307CisKKy8vLyBAYnJpZWYgUmV2ZXJzZSBwYXRoIGl0ZXJhdG9yLgorLy8vCisvLy8gVGhpcyBpcyBhbiBpbnB1dCBpdGVyYXRvciB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlIGluZGl2aWR1YWwgY29tcG9uZW50cyBpbgorLy8vIFxhIHBhdGggaW4gcmV2ZXJzZSBvcmRlci4gVGhlIHRyYXZlcnNhbCBvcmRlciBpcyBleGFjdGx5IHJldmVyc2VkIGZyb20gdGhhdAorLy8vIG9mIFxhIGNvbnN0X2l0ZXJhdG9yCitjbGFzcyByZXZlcnNlX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8cmV2ZXJzZV9pdGVyYXRvciwgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nUmVmPiB7CisgIFN0cmluZ1JlZiBQYXRoOyAgICAgIC8vLzwgVGhlIGVudGlyZSBwYXRoLgorICBTdHJpbmdSZWYgQ29tcG9uZW50OyAvLy88IFRoZSBjdXJyZW50IGNvbXBvbmVudC4gTm90IG5lY2Vzc2FyaWx5IGluIFBhdGguCisgIHNpemVfdCAgICBQb3NpdGlvbjsgIC8vLzwgVGhlIGl0ZXJhdG9ycyBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiBQYXRoLgorICBTdHlsZSBTOyAgICAgICAgICAgICAvLy88IFRoZSBwYXRoIHN0eWxlIHRvIHVzZS4KKworICBmcmllbmQgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oU3RyaW5nUmVmIHBhdGgsIFN0eWxlIHN0eWxlKTsKKyAgZnJpZW5kIHJldmVyc2VfaXRlcmF0b3IgcmVuZChTdHJpbmdSZWYgcGF0aCk7CisKK3B1YmxpYzoKKyAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIENvbXBvbmVudDsgfQorICByZXZlcnNlX2l0ZXJhdG9yICZvcGVyYXRvcisrKCk7ICAgIC8vIHByZWluY3JlbWVudAorICBib29sIG9wZXJhdG9yPT0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvciAmUkhTKSBjb25zdDsKKworICAvLy8gQGJyaWVmIERpZmZlcmVuY2UgaW4gYnl0ZXMgYmV0d2VlbiB0aGlzIGFuZCBSSFMuCisgIHB0cmRpZmZfdCBvcGVyYXRvci0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvciAmUkhTKSBjb25zdDsKK307CisKKy8vLyBAYnJpZWYgR2V0IGJlZ2luIGl0ZXJhdG9yIG92ZXIgXGEgcGF0aC4KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXR1cm5zIEl0ZXJhdG9yIGluaXRpYWxpemVkIHdpdGggdGhlIGZpcnN0IGNvbXBvbmVudCBvZiBcYSBwYXRoLgorY29uc3RfaXRlcmF0b3IgYmVnaW4oU3RyaW5nUmVmIHBhdGgsIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAYnJpZWYgR2V0IGVuZCBpdGVyYXRvciBvdmVyIFxhIHBhdGguCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmV0dXJucyBJdGVyYXRvciBpbml0aWFsaXplZCB0byB0aGUgZW5kIG9mIFxhIHBhdGguCitjb25zdF9pdGVyYXRvciBlbmQoU3RyaW5nUmVmIHBhdGgpOworCisvLy8gQGJyaWVmIEdldCByZXZlcnNlIGJlZ2luIGl0ZXJhdG9yIG92ZXIgXGEgcGF0aC4KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXR1cm5zIEl0ZXJhdG9yIGluaXRpYWxpemVkIHdpdGggdGhlIGZpcnN0IHJldmVyc2UgY29tcG9uZW50IG9mIFxhIHBhdGguCityZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbihTdHJpbmdSZWYgcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBHZXQgcmV2ZXJzZSBlbmQgaXRlcmF0b3Igb3ZlciBcYSBwYXRoLgorLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHJldHVybnMgSXRlcmF0b3IgaW5pdGlhbGl6ZWQgdG8gdGhlIHJldmVyc2UgZW5kIG9mIFxhIHBhdGguCityZXZlcnNlX2l0ZXJhdG9yIHJlbmQoU3RyaW5nUmVmIHBhdGgpOworCisvLy8gQH0KKy8vLyBAbmFtZSBMZXhpY2FsIE1vZGlmaWVycworLy8vIEB7CisKKy8vLyBAYnJpZWYgUmVtb3ZlIHRoZSBsYXN0IGNvbXBvbmVudCBmcm9tIFxhIHBhdGggdW5sZXNzIGl0IGlzIHRoZSByb290IGRpci4KKy8vLworLy8vIEBjb2RlCisvLy8gICBkaXJlY3RvcnkvZmlsZW5hbWUuY3BwID0+IGRpcmVjdG9yeS8KKy8vLyAgIGRpcmVjdG9yeS8gICAgICAgICAgICAgPT4gZGlyZWN0b3J5CisvLy8gICBmaWxlbmFtZS5jcHAgICAgICAgICAgID0+IDxlbXB0eT4KKy8vLyAgIC8gICAgICAgICAgICAgICAgICAgICAgPT4gLworLy8vIEBlbmRjb2RlCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBBIHBhdGggdGhhdCBpcyBtb2RpZmllZCB0byBub3QgaGF2ZSBhIGZpbGUgY29tcG9uZW50Lgordm9pZCByZW1vdmVfZmlsZW5hbWUoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZwYXRoLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIFJlcGxhY2UgdGhlIGZpbGUgZXh0ZW5zaW9uIG9mIFxhIHBhdGggd2l0aCBcYSBleHRlbnNpb24uCisvLy8KKy8vLyBAY29kZQorLy8vICAgLi9maWxlbmFtZS5jcHAgPT4gLi9maWxlbmFtZS5leHRlbnNpb24KKy8vLyAgIC4vZmlsZW5hbWUgICAgID0+IC4vZmlsZW5hbWUuZXh0ZW5zaW9uCisvLy8gICAuLyAgICAgICAgICAgICA9PiAuLy5leHRlbnNpb24KKy8vLyBAZW5kY29kZQorLy8vCisvLy8gQHBhcmFtIHBhdGggQSBwYXRoIHRoYXQgaGFzIGl0cyBleHRlbnNpb24gcmVwbGFjZWQgd2l0aCBcYSBleHRlbnNpb24uCisvLy8gQHBhcmFtIGV4dGVuc2lvbiBUaGUgZXh0ZW5zaW9uIHRvIGJlIGFkZGVkLiBJdCBtYXkgYmUgZW1wdHkuIEl0IG1heSBhbHNvCisvLy8gICAgICAgICAgICAgICAgICBvcHRpb25hbGx5IHN0YXJ0IHdpdGggYSAnLicsIGlmIGl0IGRvZXMgbm90LCBvbmUgd2lsbCBiZQorLy8vICAgICAgICAgICAgICAgICAgcHJlcGVuZGVkLgordm9pZCByZXBsYWNlX2V4dGVuc2lvbihTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnBhdGgsIGNvbnN0IFR3aW5lICZleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAYnJpZWYgUmVwbGFjZSBtYXRjaGluZyBwYXRoIHByZWZpeCB3aXRoIGFub3RoZXIgcGF0aC4KKy8vLworLy8vIEBjb2RlCisvLy8gICAvZm9vLCAvb2xkLCAvbmV3ID0+IC9mb28KKy8vLyAgIC9vbGQvZm9vLCAvb2xkLCAvbmV3ID0+IC9uZXcvZm9vCisvLy8gICAvZm9vLCA8ZW1wdHk+LCAvbmV3ID0+IC9uZXcvZm9vCisvLy8gICAvb2xkL2ZvbywgL29sZCwgPGVtcHR5PiA9PiAvZm9vCisvLy8gQGVuZGNvZGUKKy8vLworLy8vIEBwYXJhbSBQYXRoIElmIFxhIFBhdGggc3RhcnRzIHdpdGggXGEgT2xkUHJlZml4IG1vZGlmeSB0byBpbnN0ZWFkCisvLy8gICAgICAgIHN0YXJ0IHdpdGggXGEgTmV3UHJlZml4LgorLy8vIEBwYXJhbSBPbGRQcmVmaXggVGhlIHBhdGggcHJlZml4IHRvIHN0cmlwIGZyb20gXGEgUGF0aC4KKy8vLyBAcGFyYW0gTmV3UHJlZml4IFRoZSBwYXRoIHByZWZpeCB0byByZXBsYWNlIFxhIE5ld1ByZWZpeCB3aXRoLgordm9pZCByZXBsYWNlX3BhdGhfcHJlZml4KFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdSZWYgJk9sZFByZWZpeCwgY29uc3QgU3RyaW5nUmVmICZOZXdQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBBcHBlbmQgdG8gcGF0aC4KKy8vLworLy8vIEBjb2RlCisvLy8gICAvZm9vICArIGJhci9mID0+IC9mb28vYmFyL2YKKy8vLyAgIC9mb28vICsgYmFyL2YgPT4gL2Zvby9iYXIvZgorLy8vICAgZm9vICAgKyBiYXIvZiA9PiBmb28vYmFyL2YKKy8vLyBAZW5kY29kZQorLy8vCisvLy8gQHBhcmFtIHBhdGggU2V0IHRvIFxhIHBhdGggKyBcYSBjb21wb25lbnQuCisvLy8gQHBhcmFtIGEgVGhlIGNvbXBvbmVudCB0byBiZSBhcHBlbmRlZCB0byBcYSBwYXRoLgordm9pZCBhcHBlbmQoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZwYXRoLCBjb25zdCBUd2luZSAmYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJmIgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJmMgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJmQgPSAiIik7CisKK3ZvaWQgYXBwZW5kKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmcGF0aCwgU3R5bGUgc3R5bGUsIGNvbnN0IFR3aW5lICZhLAorICAgICAgICAgICAgY29uc3QgVHdpbmUgJmIgPSAiIiwgY29uc3QgVHdpbmUgJmMgPSAiIiwgY29uc3QgVHdpbmUgJmQgPSAiIik7CisKKy8vLyBAYnJpZWYgQXBwZW5kIHRvIHBhdGguCisvLy8KKy8vLyBAY29kZQorLy8vICAgL2ZvbyAgKyBbYmFyLGZdID0+IC9mb28vYmFyL2YKKy8vLyAgIC9mb28vICsgW2JhcixmXSA9PiAvZm9vL2Jhci9mCisvLy8gICBmb28gICArIFtiYXIsZl0gPT4gZm9vL2Jhci9mCisvLy8gQGVuZGNvZGUKKy8vLworLy8vIEBwYXJhbSBwYXRoIFNldCB0byBcYSBwYXRoICsgW1xhIGJlZ2luLCBcYSBlbmQpLgorLy8vIEBwYXJhbSBiZWdpbiBTdGFydCBvZiBjb21wb25lbnRzIHRvIGFwcGVuZC4KKy8vLyBAcGFyYW0gZW5kIE9uZSBwYXN0IHRoZSBlbmQgb2YgY29tcG9uZW50cyB0byBhcHBlbmQuCit2b2lkIGFwcGVuZChTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnBhdGgsIGNvbnN0X2l0ZXJhdG9yIGJlZ2luLAorICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgZW5kLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQH0KKy8vLyBAbmFtZSBUcmFuc2Zvcm1zIChvciBzb21lIG90aGVyIGJldHRlciBuYW1lKQorLy8vIEB7CisKKy8vLyBDb252ZXJ0IHBhdGggdG8gdGhlIG5hdGl2ZSBmb3JtLiBUaGlzIGlzIHVzZWQgdG8gZ2l2ZSBwYXRocyB0byB1c2VycyBhbmQKKy8vLyBvcGVyYXRpbmcgc3lzdGVtIGNhbGxzIGluIHRoZSBwbGF0Zm9ybSdzIG5vcm1hbCB3YXkuIEZvciBleGFtcGxlLCBvbiBXaW5kb3dzCisvLy8gYWxsICcvJyBhcmUgY29udmVydGVkIHRvICdcJy4KKy8vLworLy8vIEBwYXJhbSBwYXRoIEEgcGF0aCB0aGF0IGlzIHRyYW5zZm9ybWVkIHRvIG5hdGl2ZSBmb3JtYXQuCisvLy8gQHBhcmFtIHJlc3VsdCBIb2xkcyB0aGUgcmVzdWx0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbi4KK3ZvaWQgbmF0aXZlKGNvbnN0IFR3aW5lICZwYXRoLCBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnJlc3VsdCwKKyAgICAgICAgICAgIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBDb252ZXJ0IHBhdGggdG8gdGhlIG5hdGl2ZSBmb3JtIGluIHBsYWNlLiBUaGlzIGlzIHVzZWQgdG8gZ2l2ZSBwYXRocyB0bworLy8vIHVzZXJzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIGNhbGxzIGluIHRoZSBwbGF0Zm9ybSdzIG5vcm1hbCB3YXkuIEZvciBleGFtcGxlLAorLy8vIG9uIFdpbmRvd3MgYWxsICcvJyBhcmUgY29udmVydGVkIHRvICdcJy4KKy8vLworLy8vIEBwYXJhbSBwYXRoIEEgcGF0aCB0aGF0IGlzIHRyYW5zZm9ybWVkIHRvIG5hdGl2ZSBmb3JtYXQuCit2b2lkIG5hdGl2ZShTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnBhdGgsIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAYnJpZWYgUmVwbGFjZXMgYmFja3NsYXNoZXMgd2l0aCBzbGFzaGVzIGlmIFdpbmRvd3MuCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBwcm9jZXNzZWQgcGF0aAorLy8vIEByZXN1bHQgVGhlIHJlc3VsdCBvZiByZXBsYWNpbmcgYmFja3NsYXNoZXMgd2l0aCBmb3J3YXJkIHNsYXNoZXMgaWYgV2luZG93cy4KKy8vLyBPbiBVbml4LCB0aGlzIGZ1bmN0aW9uIGlzIGEgbm8tb3AgYmVjYXVzZSBiYWNrc2xhc2hlcyBhcmUgdmFsaWQgcGF0aAorLy8vIGNocmFjdGVycy4KK3N0ZDo6c3RyaW5nIGNvbnZlcnRfdG9fc2xhc2goU3RyaW5nUmVmIHBhdGgsIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAfQorLy8vIEBuYW1lIExleGljYWwgT2JzZXJ2ZXJzCisvLy8gQHsKKworLy8vIEBicmllZiBHZXQgcm9vdCBuYW1lLgorLy8vCisvLy8gQGNvZGUKKy8vLyAgIC8vbmV0L2hlbGxvID0+IC8vbmV0CisvLy8gICBjOi9oZWxsbyAgICA9PiBjOiAob24gV2luZG93cywgb24gb3RoZXIgcGxhdGZvcm1zIG5vdGhpbmcpCisvLy8gICAvaGVsbG8gICAgICA9PiA8ZW1wdHk+CisvLy8gQGVuZGNvZGUKKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHJlc3VsdCBUaGUgcm9vdCBuYW1lIG9mIFxhIHBhdGggaWYgaXQgaGFzIG9uZSwgb3RoZXJ3aXNlICIiLgorU3RyaW5nUmVmIHJvb3RfbmFtZShTdHJpbmdSZWYgcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBHZXQgcm9vdCBkaXJlY3RvcnkuCisvLy8KKy8vLyBAY29kZQorLy8vICAgL2dvby9oZWxsbyA9PiAvCisvLy8gICBjOi9oZWxsbyAgID0+IC8KKy8vLyAgIGQvZmlsZS50eHQgPT4gPGVtcHR5PgorLy8vIEBlbmRjb2RlCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXN1bHQgVGhlIHJvb3QgZGlyZWN0b3J5IG9mIFxhIHBhdGggaWYgaXQgaGFzIG9uZSwgb3RoZXJ3aXNlCisvLy8gICAgICAgICAgICAgICAiIi4KK1N0cmluZ1JlZiByb290X2RpcmVjdG9yeShTdHJpbmdSZWYgcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBHZXQgcm9vdCBwYXRoLgorLy8vCisvLy8gRXF1aXZhbGVudCB0byByb290X25hbWUgKyByb290X2RpcmVjdG9yeS4KKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHJlc3VsdCBUaGUgcm9vdCBwYXRoIG9mIFxhIHBhdGggaWYgaXQgaGFzIG9uZSwgb3RoZXJ3aXNlICIiLgorU3RyaW5nUmVmIHJvb3RfcGF0aChTdHJpbmdSZWYgcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBHZXQgcmVsYXRpdmUgcGF0aC4KKy8vLworLy8vIEBjb2RlCisvLy8gICBDOlxoZWxsb1x3b3JsZCA9PiBoZWxsb1x3b3JsZAorLy8vICAgZm9vL2JhciAgICAgICAgPT4gZm9vL2JhcgorLy8vICAgL2Zvby9iYXIgICAgICAgPT4gZm9vL2JhcgorLy8vIEBlbmRjb2RlCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXN1bHQgVGhlIHBhdGggc3RhcnRpbmcgYWZ0ZXIgcm9vdF9wYXRoIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSAiIi4KK1N0cmluZ1JlZiByZWxhdGl2ZV9wYXRoKFN0cmluZ1JlZiBwYXRoLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIEdldCBwYXJlbnQgcGF0aC4KKy8vLworLy8vIEBjb2RlCisvLy8gICAvICAgICAgICAgID0+IDxlbXB0eT4KKy8vLyAgIC9mb28gICAgICAgPT4gLworLy8vICAgZm9vLy4uL2JhciA9PiBmb28vLi4KKy8vLyBAZW5kY29kZQorLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmVzdWx0IFRoZSBwYXJlbnQgcGF0aCBvZiBcYSBwYXRoIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSAiIi4KK1N0cmluZ1JlZiBwYXJlbnRfcGF0aChTdHJpbmdSZWYgcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBHZXQgZmlsZW5hbWUuCisvLy8KKy8vLyBAY29kZQorLy8vICAgL2Zvby50eHQgICAgPT4gZm9vLnR4dAorLy8vICAgLiAgICAgICAgICA9PiAuCisvLy8gICAuLiAgICAgICAgID0+IC4uCisvLy8gICAvICAgICAgICAgID0+IC8KKy8vLyBAZW5kY29kZQorLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmVzdWx0IFRoZSBmaWxlbmFtZSBwYXJ0IG9mIFxhIHBhdGguIFRoaXMgaXMgZGVmaW5lZCBhcyB0aGUgbGFzdCBjb21wb25lbnQKKy8vLyAgICAgICAgIG9mIFxhIHBhdGguCitTdHJpbmdSZWYgZmlsZW5hbWUoU3RyaW5nUmVmIHBhdGgsIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAYnJpZWYgR2V0IHN0ZW0uCisvLy8KKy8vLyBJZiBmaWxlbmFtZSBjb250YWlucyBhIGRvdCBidXQgbm90IHNvbGVseSBvbmUgb3IgdHdvIGRvdHMsIHJlc3VsdCBpcyB0aGUKKy8vLyBzdWJzdHJpbmcgb2YgZmlsZW5hbWUgZW5kaW5nIGF0IChidXQgbm90IGluY2x1ZGluZykgdGhlIGxhc3QgZG90LiBPdGhlcndpc2UKKy8vLyBpdCBpcyBmaWxlbmFtZS4KKy8vLworLy8vIEBjb2RlCisvLy8gICAvZm9vL2Jhci50eHQgPT4gYmFyCisvLy8gICAvZm9vL2JhciAgICAgPT4gYmFyCisvLy8gICAvZm9vLy50eHQgICAgPT4gPGVtcHR5PgorLy8vICAgL2Zvby8uICAgICAgID0+IC4KKy8vLyAgIC9mb28vLi4gICAgICA9PiAuLgorLy8vIEBlbmRjb2RlCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXN1bHQgVGhlIHN0ZW0gb2YgXGEgcGF0aC4KK1N0cmluZ1JlZiBzdGVtKFN0cmluZ1JlZiBwYXRoLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIEdldCBleHRlbnNpb24uCisvLy8KKy8vLyBJZiBmaWxlbmFtZSBjb250YWlucyBhIGRvdCBidXQgbm90IHNvbGVseSBvbmUgb3IgdHdvIGRvdHMsIHJlc3VsdCBpcyB0aGUKKy8vLyBzdWJzdHJpbmcgb2YgZmlsZW5hbWUgc3RhcnRpbmcgYXQgKGFuZCBpbmNsdWRpbmcpIHRoZSBsYXN0IGRvdCwgYW5kIGVuZGluZworLy8vIGF0IHRoZSBlbmQgb2YgXGEgcGF0aC4gT3RoZXJ3aXNlICIiLgorLy8vCisvLy8gQGNvZGUKKy8vLyAgIC9mb28vYmFyLnR4dCA9PiAudHh0CisvLy8gICAvZm9vL2JhciAgICAgPT4gPGVtcHR5PgorLy8vICAgL2Zvby8udHh0ICAgID0+IC50eHQKKy8vLyBAZW5kY29kZQorLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmVzdWx0IFRoZSBleHRlbnNpb24gb2YgXGEgcGF0aC4KK1N0cmluZ1JlZiBleHRlbnNpb24oU3RyaW5nUmVmIHBhdGgsIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAYnJpZWYgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY2hhciBpcyBhIHBhdGggc2VwYXJhdG9yIG9uIHRoZSBob3N0IE9TLgorLy8vCisvLy8gQHBhcmFtIHZhbHVlIGEgY2hhcmFjdGVyCisvLy8gQHJlc3VsdCB0cnVlIGlmIFxhIHZhbHVlIGlzIGEgcGF0aCBzZXBhcmF0b3IgY2hhcmFjdGVyIG9uIHRoZSBob3N0IE9TCitib29sIGlzX3NlcGFyYXRvcihjaGFyIHZhbHVlLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIFJldHVybiB0aGUgcHJlZmVycmVkIHNlcGFyYXRvciBmb3IgdGhpcyBwbGF0Zm9ybS4KKy8vLworLy8vIEByZXN1bHQgU3RyaW5nUmVmIG9mIHRoZSBwcmVmZXJyZWQgc2VwYXJhdG9yLCBudWxsLXRlcm1pbmF0ZWQuCitTdHJpbmdSZWYgZ2V0X3NlcGFyYXRvcihTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIEdldCB0aGUgdHlwaWNhbCB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciB0aGUgc3lzdGVtLCBlLmcuLAorLy8vICIvdmFyL3RtcCIgb3IgIkM6L1RFTVAiCisvLy8KKy8vLyBAcGFyYW0gZXJhc2VkT25SZWJvb3QgV2hldGhlciB0byBmYXZvciBhIHBhdGggdGhhdCBpcyBlcmFzZWQgb24gcmVib290CisvLy8gcmF0aGVyIHRoYW4gb25lIHRoYXQgcG90ZW50aWFsbHkgcGVyc2lzdHMgbG9uZ2VyLiBUaGlzIHBhcmFtZXRlciB3aWxsIGJlCisvLy8gaWdub3JlZCBpZiB0aGUgdXNlciBvciBzeXN0ZW0gaGFzIHNldCB0aGUgdHlwaWNhbCBlbnZpcm9ubWVudCB2YXJpYWJsZQorLy8vIChlLmcuLCBURU1QIG9uIFdpbmRvd3MsIFRNUERJUiBvbiAqbml4KSB0byBzcGVjaWZ5IGEgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KKy8vLworLy8vIEBwYXJhbSByZXN1bHQgSG9sZHMgdGhlIHJlc3VsdGluZyBwYXRoIG5hbWUuCit2b2lkIHN5c3RlbV90ZW1wX2RpcmVjdG9yeShib29sIGVyYXNlZE9uUmVib290LCBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnJlc3VsdCk7CisKKy8vLyBAYnJpZWYgR2V0IHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCisvLy8KKy8vLyBAcGFyYW0gcmVzdWx0IEhvbGRzIHRoZSByZXN1bHRpbmcgcGF0aCBuYW1lLgorLy8vIEByZXN1bHQgVHJ1ZSBpZiBhIGhvbWUgZGlyZWN0b3J5IGlzIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLgorYm9vbCBob21lX2RpcmVjdG9yeShTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnJlc3VsdCk7CisKKy8vLyBAYnJpZWYgR2V0IHRoZSB1c2VyJ3MgY2FjaGUgZGlyZWN0b3J5LgorLy8vCisvLy8gRXhwZWN0IHRoZSByZXN1bHRpbmcgcGF0aCB0byBiZSBhIGRpcmVjdG9yeSBzaGFyZWQgd2l0aCBvdGhlcgorLy8vIGFwcGxpY2F0aW9ucy9zZXJ2aWNlcyB1c2VkIGJ5IHRoZSB1c2VyLiBQYXJhbXMgXHAgUGF0aDEgdG8gXHAgUGF0aDMgY2FuIGJlCisvLy8gdXNlZCB0byBhcHBlbmQgYWRkaXRpb25hbCBkaXJlY3RvcnkgbmFtZXMgdG8gdGhlIHJlc3VsdGluZyBwYXRoLiBSZWNvbW1lbmRlZAorLy8vIHBhdHRlcm4gaXMgPHVzZXJfY2FjaGVfZGlyZWN0b3J5Pi88dmVuZG9yPi88YXBwbGljYXRpb24+LgorLy8vCisvLy8gQHBhcmFtIFJlc3VsdCBIb2xkcyB0aGUgcmVzdWx0aW5nIHBhdGguCisvLy8gQHBhcmFtIFBhdGgxIEFkZGl0aW9uYWwgcGF0aCB0byBiZSBhcHBlbmRlZCB0byB0aGUgdXNlcidzIGNhY2hlIGRpcmVjdG9yeQorLy8vIHBhdGguICIiIGNhbiBiZSB1c2VkIHRvIGFwcGVuZCBub3RoaW5nLgorLy8vIEBwYXJhbSBQYXRoMiBTZWNvbmQgYWRkaXRpb25hbCBwYXRoIHRvIGJlIGFwcGVuZGVkLgorLy8vIEBwYXJhbSBQYXRoMyBUaGlyZCBhZGRpdGlvbmFsIHBhdGggdG8gYmUgYXBwZW5kZWQuCisvLy8gQHJlc3VsdCBUcnVlIGlmIGEgY2FjaGUgZGlyZWN0b3J5IHBhdGggaXMgc2V0LCBmYWxzZSBvdGhlcndpc2UuCitib29sIHVzZXJfY2FjaGVfZGlyZWN0b3J5KFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0LCBjb25zdCBUd2luZSAmUGF0aDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZQYXRoMiA9ICIiLCBjb25zdCBUd2luZSAmUGF0aDMgPSAiIik7CisKKy8vLyBAYnJpZWYgSGFzIHJvb3QgbmFtZT8KKy8vLworLy8vIHJvb3RfbmFtZSAhPSAiIgorLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmVzdWx0IFRydWUgaWYgdGhlIHBhdGggaGFzIGEgcm9vdCBuYW1lLCBmYWxzZSBvdGhlcndpc2UuCitib29sIGhhc19yb290X25hbWUoY29uc3QgVHdpbmUgJnBhdGgsIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAYnJpZWYgSGFzIHJvb3QgZGlyZWN0b3J5PworLy8vCisvLy8gcm9vdF9kaXJlY3RvcnkgIT0gIiIKKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHJlc3VsdCBUcnVlIGlmIHRoZSBwYXRoIGhhcyBhIHJvb3QgZGlyZWN0b3J5LCBmYWxzZSBvdGhlcndpc2UuCitib29sIGhhc19yb290X2RpcmVjdG9yeShjb25zdCBUd2luZSAmcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBIYXMgcm9vdCBwYXRoPworLy8vCisvLy8gcm9vdF9wYXRoICE9ICIiCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXN1bHQgVHJ1ZSBpZiB0aGUgcGF0aCBoYXMgYSByb290IHBhdGgsIGZhbHNlIG90aGVyd2lzZS4KK2Jvb2wgaGFzX3Jvb3RfcGF0aChjb25zdCBUd2luZSAmcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBIYXMgcmVsYXRpdmUgcGF0aD8KKy8vLworLy8vIHJlbGF0aXZlX3BhdGggIT0gIiIKKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHJlc3VsdCBUcnVlIGlmIHRoZSBwYXRoIGhhcyBhIHJlbGF0aXZlIHBhdGgsIGZhbHNlIG90aGVyd2lzZS4KK2Jvb2wgaGFzX3JlbGF0aXZlX3BhdGgoY29uc3QgVHdpbmUgJnBhdGgsIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAYnJpZWYgSGFzIHBhcmVudCBwYXRoPworLy8vCisvLy8gcGFyZW50X3BhdGggIT0gIiIKKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHJlc3VsdCBUcnVlIGlmIHRoZSBwYXRoIGhhcyBhIHBhcmVudCBwYXRoLCBmYWxzZSBvdGhlcndpc2UuCitib29sIGhhc19wYXJlbnRfcGF0aChjb25zdCBUd2luZSAmcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBIYXMgZmlsZW5hbWU/CisvLy8KKy8vLyBmaWxlbmFtZSAhPSAiIgorLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmVzdWx0IFRydWUgaWYgdGhlIHBhdGggaGFzIGEgZmlsZW5hbWUsIGZhbHNlIG90aGVyd2lzZS4KK2Jvb2wgaGFzX2ZpbGVuYW1lKGNvbnN0IFR3aW5lICZwYXRoLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIEhhcyBzdGVtPworLy8vCisvLy8gc3RlbSAhPSAiIgorLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmVzdWx0IFRydWUgaWYgdGhlIHBhdGggaGFzIGEgc3RlbSwgZmFsc2Ugb3RoZXJ3aXNlLgorYm9vbCBoYXNfc3RlbShjb25zdCBUd2luZSAmcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBIYXMgZXh0ZW5zaW9uPworLy8vCisvLy8gZXh0ZW5zaW9uICE9ICIiCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXN1bHQgVHJ1ZSBpZiB0aGUgcGF0aCBoYXMgYSBleHRlbnNpb24sIGZhbHNlIG90aGVyd2lzZS4KK2Jvb2wgaGFzX2V4dGVuc2lvbihjb25zdCBUd2luZSAmcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBJcyBwYXRoIGFic29sdXRlPworLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmVzdWx0IFRydWUgaWYgdGhlIHBhdGggaXMgYWJzb2x1dGUsIGZhbHNlIGlmIGl0IGlzIG5vdC4KK2Jvb2wgaXNfYWJzb2x1dGUoY29uc3QgVHdpbmUgJnBhdGgsIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAYnJpZWYgSXMgcGF0aCByZWxhdGl2ZT8KKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHJlc3VsdCBUcnVlIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLCBmYWxzZSBpZiBpdCBpcyBub3QuCitib29sIGlzX3JlbGF0aXZlKGNvbnN0IFR3aW5lICZwYXRoLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIFJlbW92ZSByZWR1bmRhbnQgbGVhZGluZyAiLi8iIHBpZWNlcyBhbmQgY29uc2VjdXRpdmUgc2VwYXJhdG9ycy4KKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHJlc3VsdCBUaGUgY2xlYW5lZC11cCBcYSBwYXRoLgorU3RyaW5nUmVmIHJlbW92ZV9sZWFkaW5nX2RvdHNsYXNoKFN0cmluZ1JlZiBwYXRoLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIEluLXBsYWNlIHJlbW92ZSBhbnkgJy4vJyBhbmQgb3B0aW9uYWxseSAnLi4vJyBjb21wb25lbnRzIGZyb20gYSBwYXRoLgorLy8vCisvLy8gQHBhcmFtIHBhdGggcHJvY2Vzc2VkIHBhdGgKKy8vLyBAcGFyYW0gcmVtb3ZlX2RvdF9kb3Qgc3BlY2lmeSBpZiAnLi4vJyAoZXhjZXB0IGZvciBsZWFkaW5nICIuLi8iKSBzaG91bGQgYmUKKy8vLyByZW1vdmVkCisvLy8gQHJlc3VsdCBUcnVlIGlmIHBhdGggd2FzIGNoYW5nZWQKK2Jvb2wgcmVtb3ZlX2RvdHMoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZwYXRoLCBib29sIHJlbW92ZV9kb3RfZG90ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBwYXRoCit9IC8vIGVuZCBuYW1lc3BhY2Ugc3lzCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QbHVnaW5Mb2FkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QbHVnaW5Mb2FkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGJiMTM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1BsdWdpbkxvYWRlci5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L1BsdWdpbkxvYWRlci5oIC0gUGx1Z2luIExvYWRlciBmb3IgVG9vbHMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQSB0b29sIGNhbiAjaW5jbHVkZSB0aGlzIGZpbGUgdG8gZ2V0IGEgLWxvYWQgb3B0aW9uIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvCisvLyBsb2FkIGFyYml0cmFyeSBzaGFyZWQgb2JqZWN0cyBpbnRvIHRoZSB0b29sJ3MgYWRkcmVzcyBzcGFjZS4gIE5vdGUgdGhhdCB0aGlzCisvLyBoZWFkZXIgY2FuIG9ubHkgYmUgaW5jbHVkZWQgYnkgYSBwcm9ncmFtIE9OQ0UsIHNvIGl0IHNob3VsZCBuZXZlciB0byB1c2VkIGJ5CisvLyBsaWJyYXJ5IGF1dGhvcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfUExVR0lOTE9BREVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1BMVUdJTkxPQURFUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBzdHJ1Y3QgUGx1Z2luTG9hZGVyIHsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBzdGQ6OnN0cmluZyAmRmlsZW5hbWUpOworICAgIHN0YXRpYyB1bnNpZ25lZCBnZXROdW1QbHVnaW5zKCk7CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nJiBnZXRQbHVnaW4odW5zaWduZWQgbnVtKTsKKyAgfTsKKworI2lmbmRlZiBET05UX0dFVF9QTFVHSU5fTE9BREVSX09QVElPTgorICAvLyBUaGlzIGNhdXNlcyBvcGVyYXRvcj0gYWJvdmUgdG8gYmUgaW52b2tlZCBmb3IgZXZlcnkgLWxvYWQgb3B0aW9uLgorICBzdGF0aWMgY2w6Om9wdDxQbHVnaW5Mb2FkZXIsIGZhbHNlLCBjbDo6cGFyc2VyPHN0ZDo6c3RyaW5nPiA+CisgICAgTG9hZE9wdCgibG9hZCIsIGNsOjpaZXJvT3JNb3JlLCBjbDo6dmFsdWVfZGVzYygicGx1Z2luZmlsZW5hbWUiKSwKKyAgICAgICAgICAgIGNsOjpkZXNjKCJMb2FkIHRoZSBzcGVjaWZpZWQgcGx1Z2luIikpOworI2VuZGlmCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1BvaW50ZXJMaWtlVHlwZVRyYWl0cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1BvaW50ZXJMaWtlVHlwZVRyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NDIzMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmggLSBQb2ludGVyIFRyYWl0cyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFBvaW50ZXJMaWtlVHlwZVRyYWl0cyBjbGFzcy4gIFRoaXMgYWxsb3dzIGRhdGEKKy8vIHN0cnVjdHVyZXMgdG8gcmVhc29uIGFib3V0IHBvaW50ZXJzIGFuZCBvdGhlciB0aGluZ3MgdGhhdCBhcmUgcG9pbnRlciBzaXplZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9QT0lOVEVSTElLRVRZUEVUUkFJVFNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfUE9JTlRFUkxJS0VUWVBFVFJBSVRTX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQSB0cmFpdHMgdHlwZSB0aGF0IGlzIHVzZWQgdG8gaGFuZGxlIHBvaW50ZXIgdHlwZXMgYW5kIHRoaW5ncyB0aGF0IGFyZSBqdXN0CisvLy8gd3JhcHBlcnMgZm9yIHBvaW50ZXJzIGFzIGEgdW5pZm9ybSBlbnRpdHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFBvaW50ZXJMaWtlVHlwZVRyYWl0czsKKworbmFtZXNwYWNlIGRldGFpbCB7CisvLy8gQSB0aW55IG1ldGEgZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgbG9nMiBvZiBhIGNvbXBpbGUgdGltZSBjb25zdGFudC4KK3RlbXBsYXRlIDxzaXplX3QgTj4KK3N0cnVjdCBDb25zdGFudExvZzIKKyAgICA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8c2l6ZV90LCBDb25zdGFudExvZzI8TiAvIDI+Ojp2YWx1ZSArIDE+IHt9OwordGVtcGxhdGUgPD4gc3RydWN0IENvbnN0YW50TG9nMjwxPiA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8c2l6ZV90LCAwPiB7fTsKKworLy8gUHJvdmlkZSBhIHRyYWl0IHRvIGNoZWNrIGlmIFQgaXMgcG9pbnRlci1saWtlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUgPSB2b2lkPiBzdHJ1Y3QgSGFzUG9pbnRlckxpa2VUeXBlVHJhaXRzIHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKK307CisKKy8vIHNpemVvZihUKSBpcyB2YWxpZCBvbmx5IGZvciBhIGNvbXBsZXRlIFQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IEhhc1BvaW50ZXJMaWtlVHlwZVRyYWl0czwKKyAgVCwgZGVjbHR5cGUoKHNpemVvZihQb2ludGVyTGlrZVR5cGVUcmFpdHM8VD4pICsgc2l6ZW9mKFQpKSwgdm9pZCgpKT4geworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IElzUG9pbnRlckxpa2UgeworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IEhhc1BvaW50ZXJMaWtlVHlwZVRyYWl0czxUPjo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IElzUG9pbnRlckxpa2U8VCAqPiB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKK307Cit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKKworLy8gUHJvdmlkZSBQb2ludGVyTGlrZVR5cGVUcmFpdHMgZm9yIG5vbi1jdnIgcG9pbnRlcnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFBvaW50ZXJMaWtlVHlwZVRyYWl0czxUICo+IHsKKyAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKFQgKlApIHsgcmV0dXJuIFA7IH0KKyAgc3RhdGljIGlubGluZSBUICpnZXRGcm9tVm9pZFBvaW50ZXIodm9pZCAqUCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPihQKTsgfQorCisgIGVudW0geyBOdW1Mb3dCaXRzQXZhaWxhYmxlID0gZGV0YWlsOjpDb25zdGFudExvZzI8YWxpZ25vZihUKT46OnZhbHVlIH07Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgUG9pbnRlckxpa2VUeXBlVHJhaXRzPHZvaWQgKj4geworICBzdGF0aWMgaW5saW5lIHZvaWQgKmdldEFzVm9pZFBvaW50ZXIodm9pZCAqUCkgeyByZXR1cm4gUDsgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgKmdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7IHJldHVybiBQOyB9CisKKyAgLy8vIE5vdGUsIHdlIGFzc3VtZSBoZXJlIHRoYXQgdm9pZCogaXMgcmVsYXRlZCB0byByYXcgbWFsbG9jJ2VkIG1lbW9yeSBhbmQKKyAgLy8vIHRoYXQgbWFsbG9jIHJldHVybnMgb2JqZWN0cyBhdCBsZWFzdCA0LWJ5dGUgYWxpZ25lZC4gSG93ZXZlciwgdGhpcyBtYXkgYmUKKyAgLy8vIHdyb25nLCBvciBwb2ludGVycyBtYXkgYmUgZnJvbSBzb21ldGhpbmcgb3RoZXIgdGhhbiBtYWxsb2MuIEluIHRoaXMgY2FzZSwKKyAgLy8vIHlvdSBzaG91bGQgc3BlY2lmeSBhIHJlYWwgdHlwZWQgcG9pbnRlciBvciBhdm9pZCB0aGlzIHRlbXBsYXRlLgorICAvLy8KKyAgLy8vIEFsbCBjbGllbnRzIHNob3VsZCB1c2UgYXNzZXJ0aW9ucyB0byBkbyBhIHJ1bi10aW1lIGNoZWNrIHRvIGVuc3VyZSB0aGF0CisgIC8vLyB0aGlzIGlzIGFjdHVhbGx5IHRydWUuCisgIGVudW0geyBOdW1Mb3dCaXRzQXZhaWxhYmxlID0gMiB9OworfTsKKworLy8gUHJvdmlkZSBQb2ludGVyTGlrZVR5cGVUcmFpdHMgZm9yIGNvbnN0IHRoaW5ncy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgUG9pbnRlckxpa2VUeXBlVHJhaXRzPGNvbnN0IFQ+IHsKKyAgdHlwZWRlZiBQb2ludGVyTGlrZVR5cGVUcmFpdHM8VD4gTm9uQ29uc3Q7CisKKyAgc3RhdGljIGlubGluZSBjb25zdCB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKGNvbnN0IFQgUCkgeworICAgIHJldHVybiBOb25Db25zdDo6Z2V0QXNWb2lkUG9pbnRlcihQKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IFQgZ2V0RnJvbVZvaWRQb2ludGVyKGNvbnN0IHZvaWQgKlApIHsKKyAgICByZXR1cm4gTm9uQ29uc3Q6OmdldEZyb21Wb2lkUG9pbnRlcihjb25zdF9jYXN0PHZvaWQgKj4oUCkpOworICB9CisgIGVudW0geyBOdW1Mb3dCaXRzQXZhaWxhYmxlID0gTm9uQ29uc3Q6Ok51bUxvd0JpdHNBdmFpbGFibGUgfTsKK307CisKKy8vIFByb3ZpZGUgUG9pbnRlckxpa2VUeXBlVHJhaXRzIGZvciBjb25zdCBwb2ludGVycy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgUG9pbnRlckxpa2VUeXBlVHJhaXRzPGNvbnN0IFQgKj4geworICB0eXBlZGVmIFBvaW50ZXJMaWtlVHlwZVRyYWl0czxUICo+IE5vbkNvbnN0OworCisgIHN0YXRpYyBpbmxpbmUgY29uc3Qgdm9pZCAqZ2V0QXNWb2lkUG9pbnRlcihjb25zdCBUICpQKSB7CisgICAgcmV0dXJuIE5vbkNvbnN0OjpnZXRBc1ZvaWRQb2ludGVyKGNvbnN0X2Nhc3Q8VCAqPihQKSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBUICpnZXRGcm9tVm9pZFBvaW50ZXIoY29uc3Qgdm9pZCAqUCkgeworICAgIHJldHVybiBOb25Db25zdDo6Z2V0RnJvbVZvaWRQb2ludGVyKGNvbnN0X2Nhc3Q8dm9pZCAqPihQKSk7CisgIH0KKyAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSBOb25Db25zdDo6TnVtTG93Qml0c0F2YWlsYWJsZSB9OworfTsKKworLy8gUHJvdmlkZSBQb2ludGVyTGlrZVR5cGVUcmFpdHMgZm9yIHVpbnRwdHJfdC4KK3RlbXBsYXRlIDw+IHN0cnVjdCBQb2ludGVyTGlrZVR5cGVUcmFpdHM8dWludHB0cl90PiB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0QXNWb2lkUG9pbnRlcih1aW50cHRyX3QgUCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQgKj4oUCk7CisgIH0KKyAgc3RhdGljIGlubGluZSB1aW50cHRyX3QgZ2V0RnJvbVZvaWRQb2ludGVyKHZvaWQgKlApIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFApOworICB9CisgIC8vIE5vIGJpdHMgYXJlIGF2YWlsYWJsZSEKKyAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSAwIH07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QcmV0dHlTdGFja1RyYWNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUHJldHR5U3RhY2tUcmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjRmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUHJldHR5U3RhY2tUcmFjZS5oCkBAIC0wLDAgKzEsOTYgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvUHJldHR5U3RhY2tUcmFjZS5oIC0gUHJldHR5IENyYXNoIEhhbmRsaW5nIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFByZXR0eVN0YWNrVHJhY2VFbnRyeSBjbGFzcywgd2hpY2ggaXMgdXNlZCB0byBtYWtlCisvLyBjcmFzaGVzIGdpdmUgbW9yZSBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgdGhlIHByb2dyYW0gd2FzIGRvaW5nCisvLyB3aGVuIGl0IGNyYXNoZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfUFJFVFRZU1RBQ0tUUkFDRV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9QUkVUVFlTVEFDS1RSQUNFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgcmF3X29zdHJlYW07CisKKyAgdm9pZCBFbmFibGVQcmV0dHlTdGFja1RyYWNlKCk7CisKKyAgLy8vIFByZXR0eVN0YWNrVHJhY2VFbnRyeSAtIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgYSBmcmFtZSBvZiB0aGUKKyAgLy8vICJwcmV0dHkiIHN0YWNrIHRyYWNlIHRoYXQgaXMgZHVtcGVkIHdoZW4gYSBwcm9ncmFtIGNyYXNoZXMuIFlvdSBjYW4gZGVmaW5lCisgIC8vLyBzdWJjbGFzc2VzIG9mIHRoaXMgYW5kIGRlY2xhcmUgdGhlbSBvbiB0aGUgcHJvZ3JhbSBzdGFjazogd2hlbiB0aGV5IGFyZQorICAvLy8gY29uc3RydWN0ZWQgYW5kIGRlc3RydWN0ZWQsIHRoZXkgd2lsbCBhZGQgdGhlaXIgc3ltYm9saWMgZnJhbWVzIHRvIGEKKyAgLy8vIHZpcnR1YWwgc3RhY2sgdHJhY2UuICBUaGlzIGdldHMgZHVtcGVkIG91dCBpZiB0aGUgcHJvZ3JhbSBjcmFzaGVzLgorICBjbGFzcyBQcmV0dHlTdGFja1RyYWNlRW50cnkgeworICAgIGZyaWVuZCBQcmV0dHlTdGFja1RyYWNlRW50cnkgKlJldmVyc2VTdGFja1RyYWNlKFByZXR0eVN0YWNrVHJhY2VFbnRyeSAqKTsKKworICAgIFByZXR0eVN0YWNrVHJhY2VFbnRyeSAqTmV4dEVudHJ5OworICAgIFByZXR0eVN0YWNrVHJhY2VFbnRyeShjb25zdCBQcmV0dHlTdGFja1RyYWNlRW50cnkgJikgPSBkZWxldGU7CisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgUHJldHR5U3RhY2tUcmFjZUVudHJ5ICYpID0gZGVsZXRlOworICBwdWJsaWM6CisgICAgUHJldHR5U3RhY2tUcmFjZUVudHJ5KCk7CisgICAgdmlydHVhbCB+UHJldHR5U3RhY2tUcmFjZUVudHJ5KCk7CisKKyAgICAvLy8gcHJpbnQgLSBFbWl0IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc3RhY2sgZnJhbWUgdG8gT1MuCisgICAgdmlydHVhbCB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgPSAwOworCisgICAgLy8vIGdldE5leHRFbnRyeSAtIFJldHVybiB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgbGlzdCBvZiBmcmFtZXMuCisgICAgY29uc3QgUHJldHR5U3RhY2tUcmFjZUVudHJ5ICpnZXROZXh0RW50cnkoKSBjb25zdCB7IHJldHVybiBOZXh0RW50cnk7IH0KKyAgfTsKKworICAvLy8gUHJldHR5U3RhY2tUcmFjZVN0cmluZyAtIFRoaXMgb2JqZWN0IHByaW50cyBhIHNwZWNpZmllZCBzdHJpbmcgKHdoaWNoCisgIC8vLyBzaG91bGQgbm90IGNvbnRhaW4gbmV3bGluZXMpIHRvIHRoZSBzdHJlYW0gYXMgdGhlIHN0YWNrIHRyYWNlIHdoZW4gYSBjcmFzaAorICAvLy8gb2NjdXJzLgorICBjbGFzcyBQcmV0dHlTdGFja1RyYWNlU3RyaW5nIDogcHVibGljIFByZXR0eVN0YWNrVHJhY2VFbnRyeSB7CisgICAgY29uc3QgY2hhciAqU3RyOworICBwdWJsaWM6CisgICAgUHJldHR5U3RhY2tUcmFjZVN0cmluZyhjb25zdCBjaGFyICpzdHIpIDogU3RyKHN0cikge30KKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CisgIH07CisKKyAgLy8vIFByZXR0eVN0YWNrVHJhY2VGb3JtYXQgLSBUaGlzIG9iamVjdCBwcmludHMgYSBzdHJpbmcgKHdoaWNoIG1heSB1c2UKKyAgLy8vIHByaW50Zi1zdHlsZSBmb3JtYXR0aW5nIGJ1dCBzaG91bGQgbm90IGNvbnRhaW4gbmV3bGluZXMpIHRvIHRoZSBzdHJlYW0KKyAgLy8vIGFzIHRoZSBzdGFjayB0cmFjZSB3aGVuIGEgY3Jhc2ggb2NjdXJzLgorICBjbGFzcyBQcmV0dHlTdGFja1RyYWNlRm9ybWF0IDogcHVibGljIFByZXR0eVN0YWNrVHJhY2VFbnRyeSB7CisgICAgbGx2bTo6U21hbGxWZWN0b3I8Y2hhciwgMzI+IFN0cjsKKyAgcHVibGljOgorICAgIFByZXR0eVN0YWNrVHJhY2VGb3JtYXQoY29uc3QgY2hhciAqRm9ybWF0LCAuLi4pOworICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKKyAgfTsKKworICAvLy8gUHJldHR5U3RhY2tUcmFjZVByb2dyYW0gLSBUaGlzIG9iamVjdCBwcmludHMgYSBzcGVjaWZpZWQgcHJvZ3JhbSBhcmd1bWVudHMKKyAgLy8vIHRvIHRoZSBzdHJlYW0gYXMgdGhlIHN0YWNrIHRyYWNlIHdoZW4gYSBjcmFzaCBvY2N1cnMuCisgIGNsYXNzIFByZXR0eVN0YWNrVHJhY2VQcm9ncmFtIDogcHVibGljIFByZXR0eVN0YWNrVHJhY2VFbnRyeSB7CisgICAgaW50IEFyZ0M7CisgICAgY29uc3QgY2hhciAqY29uc3QgKkFyZ1Y7CisgIHB1YmxpYzoKKyAgICBQcmV0dHlTdGFja1RyYWNlUHJvZ3JhbShpbnQgYXJnYywgY29uc3QgY2hhciAqIGNvbnN0KmFyZ3YpCisgICAgICA6IEFyZ0MoYXJnYyksIEFyZ1YoYXJndikgeworICAgICAgRW5hYmxlUHJldHR5U3RhY2tUcmFjZSgpOworICAgIH0KKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CisgIH07CisKKyAgLy8vIFJldHVybnMgdGhlIHRvcG1vc3QgZWxlbWVudCBvZiB0aGUgInByZXR0eSIgc3RhY2sgc3RhdGUuCisgIGNvbnN0IHZvaWQgKlNhdmVQcmV0dHlTdGFja1N0YXRlKCk7CisKKyAgLy8vIFJlc3RvcmVzIHRoZSB0b3Btb3N0IGVsZW1lbnQgb2YgdGhlICJwcmV0dHkiIHN0YWNrIHN0YXRlIHRvIFN0YXRlLCB3aGljaAorICAvLy8gc2hvdWxkIGNvbWUgZnJvbSBhIHByZXZpb3VzIGNhbGwgdG8gU2F2ZVByZXR0eVN0YWNrU3RhdGUoKS4gIFRoaXMgaXMKKyAgLy8vIHVzZWZ1bCB3aGVuIHVzaW5nIGEgQ3Jhc2hSZWNvdmVyeUNvbnRleHQgaW4gY29kZSB0aGF0IGFsc28gdXNlcworICAvLy8gUHJldHR5U3RhY2tUcmFjZUVudHJpZXMsIHRvIG1ha2Ugc3VyZSB0aGUgc3RhY2sgdGhhdCdzIHByaW50ZWQgaWYgYSBjcmFzaAorICAvLy8gaGFwcGVucyBhZnRlciBhIGNyYXNoIHRoYXQncyBiZWVuIHJlY292ZXJlZCBieSBDcmFzaFJlY292ZXJ5Q29udGV4dAorICAvLy8gZG9lc24ndCBoYXZlIGZyYW1lcyBvbiBpdCB0aGF0IHdlcmUgYWRkZWQgaW4gY29kZSB1bndvdW5kIGJ5IHRoZQorICAvLy8gQ3Jhc2hSZWNvdmVyeUNvbnRleHQuCisgIHZvaWQgUmVzdG9yZVByZXR0eVN0YWNrU3RhdGUoY29uc3Qgdm9pZCAqU3RhdGUpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QcmludGFibGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QcmludGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjU1ZDQxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1ByaW50YWJsZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vPT09LS0tIFByaW50YWJsZS5oIC0gUHJpbnQgZnVuY3Rpb24gaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBQcmludGFibGUgc3RydWN0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1BSSU5UQUJMRV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9QUklOVEFCTEVfSAorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIFNpbXBsZSB3cmFwcGVyIGFyb3VuZCBzdGQ6OmZ1bmN0aW9uPHZvaWQocmF3X29zdHJlYW0mKT4uCisvLy8gVGhpcyBjbGFzcyBpcyB1c2VmdWwgdG8gY29uc3RydWN0IHByaW50IGhlbHBlcnMgZm9yIHJhd19vc3RyZWFtLgorLy8vCisvLy8gRXhhbXBsZToKKy8vLyAgICAgUHJpbnRhYmxlIFByaW50UmVnaXN0ZXIodW5zaWduZWQgUmVnaXN0ZXIpIHsKKy8vLyAgICAgICByZXR1cm4gUHJpbnRhYmxlKFtSZWdpc3Rlcl0ocmF3X29zdHJlYW0gJk9TKSB7CisvLy8gICAgICAgICBPUyA8PCBnZXRSZWdpc3Rlck5hbWUoUmVnaXN0ZXIpOworLy8vICAgICAgIH0KKy8vLyAgICAgfQorLy8vICAgICAuLi4gT1MgPDwgUHJpbnRSZWdpc3RlcihSZWdpc3Rlcik7IC4uLgorLy8vCisvLy8gSW1wbGVtZW50YXRpb24gbm90ZTogSWRlYWxseSB0aGlzIHdvdWxkIGp1c3QgYmUgYSB0eXBlZGVmLCBidXQgZG9pbmcgc28KKy8vLyBsZWFkcyB0byBvcGVyYXRvciA8PCBiZWluZyBhbWJpZ3VvdXMgYXMgZnVuY3Rpb24gaGFzIG1hdGNoaW5nIGNvbnN0cnVjdG9ycworLy8vIGluIHNvbWUgU1RMIHZlcnNpb25zLiBJIGhhdmUgc2VlbiB0aGUgcHJvYmxlbSBvbiBnY2MgNC42IGxpYnN0ZGMrKyBhbmQKKy8vLyBtaWNyb3NvZnQgU1RMLgorY2xhc3MgUHJpbnRhYmxlIHsKK3B1YmxpYzoKKyAgc3RkOjpmdW5jdGlvbjx2b2lkKHJhd19vc3RyZWFtICZPUyk+IFByaW50OworICBQcmludGFibGUoc3RkOjpmdW5jdGlvbjx2b2lkKHJhd19vc3RyZWFtICZPUyk+IFByaW50KQorICAgICAgOiBQcmludChzdGQ6Om1vdmUoUHJpbnQpKSB7fQorfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRhYmxlICZQKSB7CisgIFAuUHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUHJvY2Vzcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1Byb2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmIwZDlmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1Byb2Nlc3MuaApAQCAtMCwwICsxLDIwMCBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9Qcm9jZXNzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vCisvLy8gUHJvdmlkZXMgYSBsaWJyYXJ5IGZvciBhY2Nlc3NpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBwcm9jZXNzIGFuZCBvdGhlcgorLy8vIHByb2Nlc3NlcyBvbiB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gQWxzbyBwcm92aWRlcyBtZWFucyBvZiBzcGF3bmluZworLy8vIHN1YnByb2Nlc3MgZm9yIGNvbW1hbmRzLiBUaGUgZGVzaWduIG9mIHRoaXMgbGlicmFyeSBpcyBtb2RlbGVkIGFmdGVyIHRoZQorLy8vIHByb3Bvc2VkIGRlc2lnbiBvZiB0aGUgQm9vc3QuUHJvY2VzcyBsaWJyYXJ5LCBhbmQgaXMgZGVzaWduIHNwZWNpZmljYWxseSB0bworLy8vIGZvbGxvdyB0aGUgc3R5bGUgb2Ygc3RhbmRhcmQgbGlicmFyaWVzIGFuZCBwb3RlbnRpYWxseSBiZWNvbWUgYSBwcm9wb3NhbAorLy8vIGZvciBhIHN0YW5kYXJkIGxpYnJhcnkuCisvLy8KKy8vLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGxsdm06OnN5czo6UHJvY2VzcyBjbGFzcyB3aGljaCBjb250YWlucyBhIGNvbGxlY3Rpb24KKy8vLyBvZiBsZWdhY3kgc3RhdGljIGludGVyZmFjZXMgZm9yIGV4dHJhY3RpbmcgdmFyaW91cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKy8vLyBjdXJyZW50IHByb2Nlc3MuIFRoZSBnb2FsIGlzIHRvIG1pZ3JhdGUgdXNlcnMgb2YgdGhpcyBBUEkgb3ZlciB0byB0aGUgbmV3CisvLy8gaW50ZXJmYWNlcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfUFJPQ0VTU19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9QUk9DRVNTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9Db25maWcvbGx2bS1jb25maWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nocm9uby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKK2NsYXNzIFN0cmluZ1JlZjsKKworbmFtZXNwYWNlIHN5cyB7CisKKworLy8vIFxicmllZiBBIGNvbGxlY3Rpb24gb2YgbGVnYWN5IGludGVyZmFjZXMgZm9yIHF1ZXJ5aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZQorLy8vIGN1cnJlbnQgZXhlY3V0aW5nIHByb2Nlc3MuCitjbGFzcyBQcm9jZXNzIHsKK3B1YmxpYzoKKyAgc3RhdGljIHVuc2lnbmVkIGdldFBhZ2VTaXplKCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gcHJvY2VzcyBtZW1vcnkgdXNhZ2UuCisgIC8vLyBUaGlzIHN0YXRpYyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSBhbGxvY2F0ZWQKKyAgLy8vIGJ5IHRoZSBwcm9jZXNzLiBUaGlzIG9ubHkgY291bnRzIHRoZSBtZW1vcnkgYWxsb2NhdGVkIHZpYSB0aGUgbWFsbG9jLAorICAvLy8gY2FsbG9jIGFuZCByZWFsbG9jIGZ1bmN0aW9ucyBhbmQgaW5jbHVkZXMgYW55ICJmcmVlIiBob2xlcyBpbiB0aGUKKyAgLy8vIGFsbG9jYXRlZCBzcGFjZS4KKyAgc3RhdGljIHNpemVfdCBHZXRNYWxsb2NVc2FnZSgpOworCisgIC8vLyBUaGlzIHN0YXRpYyBmdW5jdGlvbiB3aWxsIHNldCBccCB1c2VyX3RpbWUgdG8gdGhlIGFtb3VudCBvZiBDUFUgdGltZQorICAvLy8gc3BlbnQgaW4gdXNlciAobm9uLWtlcm5lbCkgbW9kZSBhbmQgXHAgc3lzX3RpbWUgdG8gdGhlIGFtb3VudCBvZiBDUFUKKyAgLy8vIHRpbWUgc3BlbnQgaW4gc3lzdGVtIChrZXJuZWwpIG1vZGUuICBJZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBkb2VzIG5vdAorICAvLy8gc3VwcG9ydCBjb2xsZWN0aW9uIG9mIHRoZXNlIG1ldHJpY3MsIGEgemVybyBkdXJhdGlvbiB3aWxsIGJlIGZvciBib3RoCisgIC8vLyB2YWx1ZXMuCisgIC8vLyBccGFyYW0gZWxhcHNlZCBSZXR1cm5zIHRoZSBzeXN0ZW1fY2xvY2s6Om5vdygpIGdpdmluZyBjdXJyZW50IHRpbWUKKyAgLy8vIFxwYXJhbSB1c2VyX3RpbWUgUmV0dXJucyB0aGUgY3VycmVudCBhbW91bnQgb2YgdXNlciB0aW1lIGZvciB0aGUgcHJvY2VzcworICAvLy8gXHBhcmFtIHN5c190aW1lIFJldHVybnMgdGhlIGN1cnJlbnQgYW1vdW50IG9mIHN5c3RlbSB0aW1lIGZvciB0aGUgcHJvY2VzcworICBzdGF0aWMgdm9pZCBHZXRUaW1lVXNhZ2UoVGltZVBvaW50PD4gJmVsYXBzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMgJnVzZXJfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcyAmc3lzX3RpbWUpOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIG1ha2VzIHRoZSBuZWNlc3NhcnkgY2FsbHMgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0gdG8KKyAgLy8vIHByZXZlbnQgY29yZSBmaWxlcyBvciBhbnkgb3RoZXIga2luZCBvZiBsYXJnZSBtZW1vcnkgZHVtcHMgdGhhdCBjYW4KKyAgLy8vIG9jY3VyIHdoZW4gYSBwcm9ncmFtIGZhaWxzLgorICAvLy8gQGJyaWVmIFByZXZlbnQgY29yZSBmaWxlIGdlbmVyYXRpb24uCisgIHN0YXRpYyB2b2lkIFByZXZlbnRDb3JlRmlsZXMoKTsKKworICAvLy8gXGJyaWVmIHRydWUgaWYgUHJldmVudENvcmVGaWxlcyBoYXMgYmVlbiBjYWxsZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgc3RhdGljIGJvb2wgQXJlQ29yZUZpbGVzUHJldmVudGVkKCk7CisKKyAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBcYXJnIG5hbWUncyB2YWx1ZSBhcyBhIFVURi04CisgIC8vIHN0cmluZy4gXGFyZyBOYW1lIGlzIGFzc3VtZWQgdG8gYmUgaW4gVVRGLTggZW5jb2RpbmcgdG9vLgorICBzdGF0aWMgT3B0aW9uYWw8c3RkOjpzdHJpbmc+IEdldEVudihTdHJpbmdSZWYgbmFtZSk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIGFuIGV4aXN0aW5nIGZpbGUgaW4gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMKKyAgLy8vIGluIGEgUEFUSCBsaWtlIGVudmlyb25tZW50IHZhcmlhYmxlLCBhbmQgcmV0dXJucyB0aGUgZmlyc3QgZmlsZSBmb3VuZCwKKyAgLy8vIGFjY29yZGluZyB0byB0aGUgb3JkZXIgb2YgdGhlIGVudHJpZXMgaW4gdGhlIFBBVEggbGlrZSBlbnZpcm9ubWVudAorICAvLy8gdmFyaWFibGUuICBJZiBhbiBpZ25vcmUgbGlzdCBpcyBzcGVjaWZpZWQsIHRoZW4gYW55IGZvbGRlciB3aGljaCBpcyBpbgorICAvLy8gdGhlIFBBVEggbGlrZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBidXQgaXMgYWxzbyBpbiBJZ25vcmVMaXN0IGlzIG5vdAorICAvLy8gY29uc2lkZXJlZC4KKyAgc3RhdGljIE9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBGaW5kSW5FbnZQYXRoKFN0cmluZ1JlZiBFbnZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8c3RkOjpzdHJpbmc+IElnbm9yZUxpc3QpOworCisgIHN0YXRpYyBPcHRpb25hbDxzdGQ6OnN0cmluZz4gRmluZEluRW52UGF0aChTdHJpbmdSZWYgRW52TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlTmFtZSk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIFNtYWxsVmVjdG9yIGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cyBwYXNzZWQgZnJvbQorICAvLy8gdGhlIG9wZXJhdGluZyBzeXN0ZW0gdG8gdGhlIHByb2dyYW0uICBUaGlzIGZ1bmN0aW9uIGV4cGVjdHMgdG8gYmUgaGFuZGVkCisgIC8vLyB0aGUgdmVjdG9yIHBhc3NlZCBpbiBmcm9tIG1haW4uCisgIHN0YXRpYyBzdGQ6OmVycm9yX2NvZGUKKyAgR2V0QXJndW1lbnRWZWN0b3IoU21hbGxWZWN0b3JJbXBsPGNvbnN0IGNoYXIgKj4gJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IGNoYXIgKj4gQXJnc0Zyb21NYWluLAorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3I8Y2hhcj4gJkFyZ0FsbG9jYXRvcik7CisKKyAgLy8gVGhpcyBmdW5jdGlvbnMgZW5zdXJlcyB0aGF0IHRoZSBzdGFuZGFyZCBmaWxlIGRlc2NyaXB0b3JzIChpbnB1dCwgb3V0cHV0LAorICAvLyBhbmQgZXJyb3IpIGFyZSBwcm9wZXJseSBtYXBwZWQgdG8gYSBmaWxlIGRlc2NyaXB0b3IgYmVmb3JlIHdlIHVzZSBhbnkgb2YKKyAgLy8gdGhlbS4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHN0YW5kYWxvbmUgcHJvZ3JhbXMsIGxpYnJhcnkKKyAgLy8gY29tcG9uZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcy4KKyAgc3RhdGljIHN0ZDo6ZXJyb3JfY29kZSBGaXh1cFN0YW5kYXJkRmlsZURlc2NyaXB0b3JzKCk7CisKKyAgLy8gVGhpcyBmdW5jdGlvbiBzYWZlbHkgY2xvc2VzIGEgZmlsZSBkZXNjcmlwdG9yLiAgSXQgaXMgbm90IHNhZmUgdG8gcmV0cnkKKyAgLy8gY2xvc2UoMikgd2hlbiBpdCByZXR1cm5zIHdpdGggZXJybm8gZXF1aXZhbGVudCB0byBFSU5UUjsgdGhpcyBpcyBiZWNhdXNlCisgIC8vICpuaXhlbiBjYW5ub3QgYWdyZWUgaWYgdGhlIGZpbGUgZGVzY3JpcHRvciBpcywgaW4gZmFjdCwgY2xvc2VkIHdoZW4gdGhpcworICAvLyBvY2N1cnMuCisgIC8vCisgIC8vIE4uQi4gU29tZSBvcGVyYXRpbmcgc3lzdGVtcywgZHVlIHRvIHRocmVhZCBjYW5jZWxsYXRpb24sIGNhbm5vdCBwcm9wZXJseQorICAvLyBndWFyYW50ZWUgdGhhdCBpdCB3aWxsIG9yIHdpbGwgbm90IGJlIGNsb3NlZCBvbmUgd2F5IG9yIHRoZSBvdGhlciEKKyAgc3RhdGljIHN0ZDo6ZXJyb3JfY29kZSBTYWZlbHlDbG9zZUZpbGVEZXNjcmlwdG9yKGludCBGRCk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgc3RhbmRhcmQgaW5wdXQgaXMgY29ubmVjdGVkIGRpcmVjdGx5CisgIC8vLyB0byBhIHVzZXIncyBpbnB1dCAoa2V5Ym9hcmQgcHJvYmFibHkpLCByYXRoZXIgdGhhbiBjb21pbmcgZnJvbSBhIGZpbGUKKyAgLy8vIG9yIHBpcGUuCisgIHN0YXRpYyBib29sIFN0YW5kYXJkSW5Jc1VzZXJJbnB1dCgpOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgdGhlIHN0YW5kYXJkIG91dHB1dCBpcyBjb25uZWN0ZWQgdG8gYQorICAvLy8gInR0eSIgb3IgImNvbnNvbGUiIHdpbmRvdy4gVGhhdCBpcywgdGhlIG91dHB1dCB3b3VsZCBiZSBkaXNwbGF5ZWQgdG8KKyAgLy8vIHRoZSB1c2VyIHJhdGhlciB0aGFuIGJlaW5nIHB1dCBvbiBhIHBpcGUgb3Igc3RvcmVkIGluIGEgZmlsZS4KKyAgc3RhdGljIGJvb2wgU3RhbmRhcmRPdXRJc0Rpc3BsYXllZCgpOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgdGhlIHN0YW5kYXJkIGVycm9yIGlzIGNvbm5lY3RlZCB0byBhCisgIC8vLyAidHR5IiBvciAiY29uc29sZSIgd2luZG93LiBUaGF0IGlzLCB0aGUgb3V0cHV0IHdvdWxkIGJlIGRpc3BsYXllZCB0bworICAvLy8gdGhlIHVzZXIgcmF0aGVyIHRoYW4gYmVpbmcgcHV0IG9uIGEgcGlwZSBvciBzdG9yZWQgaW4gYSBmaWxlLgorICBzdGF0aWMgYm9vbCBTdGFuZGFyZEVycklzRGlzcGxheWVkKCk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yIGlzIGNvbm5lY3RlZCB0bworICAvLy8gYSAidHR5IiBvciAiY29uc29sZSIgd2luZG93LiBUaGF0IGlzLCB0aGUgb3V0cHV0IHdvdWxkIGJlIGRpc3BsYXllZCB0bworICAvLy8gdGhlIHVzZXIgcmF0aGVyIHRoYW4gYmVpbmcgcHV0IG9uIGEgcGlwZSBvciBzdG9yZWQgaW4gYSBmaWxlLgorICBzdGF0aWMgYm9vbCBGaWxlRGVzY3JpcHRvcklzRGlzcGxheWVkKGludCBmZCk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yIGlzIGRpc3BsYXlkIGFuZAorICAvLy8gc3VwcG9ydHMgY29sb3JzLgorICBzdGF0aWMgYm9vbCBGaWxlRGVzY3JpcHRvckhhc0NvbG9ycyhpbnQgZmQpOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB3aW5kb3cKKyAgLy8vIGlmIHN0YW5kYXJkIG91dHB1dCBpcyBjb25uZWN0ZWQgdG8gYSAidHR5IiBvciAiY29uc29sZSIKKyAgLy8vIHdpbmRvdy4gSWYgc3RhbmRhcmQgb3V0cHV0IGlzIG5vdCBjb25uZWN0ZWQgdG8gYSB0dHkgb3IKKyAgLy8vIGNvbnNvbGUsIG9yIGlmIHRoZSBudW1iZXIgb2YgY29sdW1ucyBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwKKyAgLy8vIHRoaXMgcm91dGluZSByZXR1cm5zIHplcm8uCisgIHN0YXRpYyB1bnNpZ25lZCBTdGFuZGFyZE91dENvbHVtbnMoKTsKKworICAvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgd2luZG93CisgIC8vLyBpZiBzdGFuZGFyZCBlcnJvciBpcyBjb25uZWN0ZWQgdG8gYSAidHR5IiBvciAiY29uc29sZSIKKyAgLy8vIHdpbmRvdy4gSWYgc3RhbmRhcmQgZXJyb3IgaXMgbm90IGNvbm5lY3RlZCB0byBhIHR0eSBvcgorICAvLy8gY29uc29sZSwgb3IgaWYgdGhlIG51bWJlciBvZiBjb2x1bW5zIGNhbm5vdCBiZSBkZXRlcm1pbmVkLAorICAvLy8gdGhpcyByb3V0aW5lIHJldHVybnMgemVyby4KKyAgc3RhdGljIHVuc2lnbmVkIFN0YW5kYXJkRXJyQ29sdW1ucygpOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgd2hldGhlciB0aGUgdGVybWluYWwgY29ubmVjdGVkIHRvIHN0YW5kYXJkCisgIC8vLyBvdXRwdXQgc3VwcG9ydHMgY29sb3JzLiBJZiBzdGFuZGFyZCBvdXRwdXQgaXMgbm90IGNvbm5lY3RlZCB0byBhCisgIC8vLyB0ZXJtaW5hbCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLgorICBzdGF0aWMgYm9vbCBTdGFuZGFyZE91dEhhc0NvbG9ycygpOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgd2hldGhlciB0aGUgdGVybWluYWwgY29ubmVjdGVkIHRvIHN0YW5kYXJkCisgIC8vLyBlcnJvciBzdXBwb3J0cyBjb2xvcnMuIElmIHN0YW5kYXJkIGVycm9yIGlzIG5vdCBjb25uZWN0ZWQgdG8gYQorICAvLy8gdGVybWluYWwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZS4KKyAgc3RhdGljIGJvb2wgU3RhbmRhcmRFcnJIYXNDb2xvcnMoKTsKKworICAvLy8gRW5hYmxlcyBvciBkaXNhYmxlcyB3aGV0aGVyIEFOU0kgZXNjYXBlIHNlcXVlbmNlcyBhcmUgdXNlZCB0byBvdXRwdXQKKyAgLy8vIGNvbG9ycy4gVGhpcyBvbmx5IGhhcyBhbiBlZmZlY3Qgb24gV2luZG93cy4KKyAgLy8vIE5vdGU6IFNldHRpbmcgdGhpcyBvcHRpb24gaXMgbm90IHRocmVhZC1zYWZlIGFuZCBzaG91bGQgb25seSBiZSBkb25lCisgIC8vLyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgIHN0YXRpYyB2b2lkIFVzZUFOU0lFc2NhcGVDb2Rlcyhib29sIGVuYWJsZSk7CisKKyAgLy8vIFdoZXRoZXIgY2hhbmdpbmcgY29sb3JzIHJlcXVpcmVzIHRoZSBvdXRwdXQgdG8gYmUgZmx1c2hlZC4KKyAgLy8vIFRoaXMgaXMgbmVlZGVkIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IGVzY2FwZSBzZXF1ZW5jZXMgZm9yCisgIC8vLyBjaGFuZ2luZyBjb2xvcnMuCisgIHN0YXRpYyBib29sIENvbG9yTmVlZHNGbHVzaCgpOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbG9yY29kZSBlc2NhcGUgc2VxdWVuY2VzLgorICAvLy8gSWYgQ29sb3JOZWVkc0ZsdXNoKCkgaXMgdHJ1ZSB0aGVuIHRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGNvbG9ycworICAvLy8gYW5kIHJldHVybiBhbiBlbXB0eSBlc2NhcGUgc2VxdWVuY2UuIEluIHRoYXQgY2FzZSBpdCBpcyB0aGUKKyAgLy8vIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjbGllbnQgdG8gZmx1c2ggdGhlIG91dHB1dCBzdHJlYW0gcHJpb3IgdG8KKyAgLy8vIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgc3RhdGljIGNvbnN0IGNoYXIgKk91dHB1dENvbG9yKGNoYXIgYywgYm9vbCBib2xkLCBib29sIGJnKTsKKworICAvLy8gU2FtZSBhcyBPdXRwdXRDb2xvciwgYnV0IG9ubHkgZW5hYmxlcyB0aGUgYm9sZCBhdHRyaWJ1dGUuCisgIHN0YXRpYyBjb25zdCBjaGFyICpPdXRwdXRCb2xkKGJvb2wgYmcpOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGVzY2FwZSBzZXF1ZW5jZSB0byByZXZlcnNlIGZvcmdyb3VuZCBhbmQKKyAgLy8vIGJhY2tncm91bmQgY29sb3JzLgorICBzdGF0aWMgY29uc3QgY2hhciAqT3V0cHV0UmV2ZXJzZSgpOworCisgIC8vLyBSZXNldHMgdGhlIHRlcm1pbmFscyBjb2xvcnMsIG9yIHJldHVybnMgYW4gZXNjYXBlIHNlcXVlbmNlIHRvIGRvIHNvLgorICBzdGF0aWMgY29uc3QgY2hhciAqUmVzZXRDb2xvcigpOworCisgIC8vLyBHZXQgdGhlIHJlc3VsdCBvZiBhIHByb2Nlc3Mgd2lkZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4gVGhlCisgIC8vLyBnZW5lcmF0b3Igd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNlZWRlZCBpbiBub24tZGV0ZXJtaW5pc3RpYyBmYXNoaW9uLgorICBzdGF0aWMgdW5zaWduZWQgR2V0UmFuZG9tTnVtYmVyKCk7Cit9OworCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1Byb2dyYW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Qcm9ncmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZmZDM1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Qcm9ncmFtLmgKQEAgLTAsMCArMSwxOTcgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvUHJvZ3JhbS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgbGx2bTo6c3lzOjpQcm9ncmFtIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1BST0dSQU1fSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfUFJPR1JBTV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yT3IuaCIKKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzeXMgeworCisgIC8vLyBUaGlzIGlzIHRoZSBPUy1zcGVjaWZpYyBzZXBhcmF0b3IgZm9yIFBBVEggbGlrZSBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CisgIC8vIGEgY29sb24gb24gVW5peCBvciBhIHNlbWljb2xvbiBvbiBXaW5kb3dzLgorI2lmIGRlZmluZWQoTExWTV9PTl9VTklYKQorICBjb25zdCBjaGFyIEVudlBhdGhTZXBhcmF0b3IgPSAnOic7CisjZWxpZiBkZWZpbmVkIChMTFZNX09OX1dJTjMyKQorICBjb25zdCBjaGFyIEVudlBhdGhTZXBhcmF0b3IgPSAnOyc7CisjZW5kaWYKKworLy8vIEBicmllZiBUaGlzIHN0cnVjdCBlbmNhcHN1bGF0ZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcm9jZXNzLgorc3RydWN0IFByb2Nlc3NJbmZvIHsKKyNpZiBkZWZpbmVkKExMVk1fT05fVU5JWCkKKyAgdHlwZWRlZiBwaWRfdCBQcm9jZXNzSWQ7CisjZWxpZiBkZWZpbmVkKExMVk1fT05fV0lOMzIpCisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBQcm9jZXNzSWQ7IC8vIE11c3QgbWF0Y2ggdGhlIHR5cGUgb2YgRFdPUkQgb24gV2luZG93cy4KKyAgdHlwZWRlZiB2b2lkICogSEFORExFOyAvLyBNdXN0IG1hdGNoIHRoZSB0eXBlIG9mIEhBTkRMRSBvbiBXaW5kb3dzLgorICAvLy8gVGhlIGhhbmRsZSB0byB0aGUgcHJvY2VzcyAoYXZhaWxhYmxlIG9uIFdpbmRvd3Mgb25seSkuCisgIEhBTkRMRSBQcm9jZXNzSGFuZGxlOworI2Vsc2UKKyNlcnJvciAiUHJvY2Vzc0luZm8gaXMgbm90IGRlZmluZWQgZm9yIHRoaXMgcGxhdGZvcm0hIgorI2VuZGlmCisKKyAgZW51bSA6IFByb2Nlc3NJZCB7IEludmFsaWRQaWQgPSAwIH07CisKKyAgLy8vIFRoZSBwcm9jZXNzIGlkZW50aWZpZXIuCisgIFByb2Nlc3NJZCBQaWQ7CisKKyAgLy8vIFRoZSByZXR1cm4gY29kZSwgc2V0IGFmdGVyIGV4ZWN1dGlvbi4KKyAgaW50IFJldHVybkNvZGU7CisKKyAgUHJvY2Vzc0luZm8oKTsKK307CisKKyAgLy8vIFxicmllZiBGaW5kIHRoZSBmaXJzdCBleGVjdXRhYmxlIGZpbGUgXHAgTmFtZSBpbiBccCBQYXRocy4KKyAgLy8vCisgIC8vLyBUaGlzIGRvZXMgbm90IHBlcmZvcm0gaGFzaGluZyBhcyBhIHNoZWxsIHdvdWxkIGJ1dCBpbnN0ZWFkIHN0YXRzIGVhY2ggUEFUSAorICAvLy8gZW50cnkgaW5kaXZpZHVhbGx5IHNvIHNob3VsZCBnZW5lcmFsbHkgYmUgYXZvaWRlZC4gQ29yZSBMTFZNIGxpYnJhcnkKKyAgLy8vIGZ1bmN0aW9ucyBhbmQgb3B0aW9ucyBzaG91bGQgaW5zdGVhZCByZXF1aXJlIGZ1bGx5IHNwZWNpZmllZCBwYXRocy4KKyAgLy8vCisgIC8vLyBccGFyYW0gTmFtZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIHRvIGZpbmQuIElmIGl0IGNvbnRhaW5zIGFueSBzeXN0ZW0KKyAgLy8vICAgc2xhc2hlcywgaXQgd2lsbCBiZSByZXR1cm5lZCBhcyBpcy4KKyAgLy8vIFxwYXJhbSBQYXRocyBvcHRpb25hbCBsaXN0IG9mIHBhdGhzIHRvIHNlYXJjaCBmb3IgXHAgTmFtZS4gSWYgZW1wdHkgaXQKKyAgLy8vICAgd2lsbCB1c2UgdGhlIHN5c3RlbSBQQVRIIGVudmlyb25tZW50IGluc3RlYWQuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIGZ1bGx5IHF1YWxpZmllZCBwYXRoIHRvIHRoZSBmaXJzdCBccCBOYW1lIGluIFxwIFBhdGhzIGlmIGl0CisgIC8vLyAgIGV4aXN0cy4gXHAgTmFtZSBpZiBccCBOYW1lIGhhcyBzbGFzaGVzIGluIGl0LiBPdGhlcndpc2UgYW4gZXJyb3IuCisgIEVycm9yT3I8c3RkOjpzdHJpbmc+CisgIGZpbmRQcm9ncmFtQnlOYW1lKFN0cmluZ1JlZiBOYW1lLCBBcnJheVJlZjxTdHJpbmdSZWY+IFBhdGhzID0ge30pOworCisgIC8vIFRoZXNlIGZ1bmN0aW9ucyBjaGFuZ2UgdGhlIHNwZWNpZmllZCBzdGFuZGFyZCBzdHJlYW0gKHN0ZGluIG9yIHN0ZG91dCkgdG8KKyAgLy8gYmluYXJ5IG1vZGUuIFRoZXkgcmV0dXJuIGVycmM6OnN1Y2Nlc3MgaWYgdGhlIHNwZWNpZmllZCBzdHJlYW0KKyAgLy8gd2FzIGNoYW5nZWQuIE90aGVyd2lzZSBhIHBsYXRmb3JtIGRlcGVuZGVudCBlcnJvciBpcyByZXR1cm5lZC4KKyAgc3RkOjplcnJvcl9jb2RlIENoYW5nZVN0ZGluVG9CaW5hcnkoKTsKKyAgc3RkOjplcnJvcl9jb2RlIENoYW5nZVN0ZG91dFRvQmluYXJ5KCk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgdGhlIHByb2dyYW0gdXNpbmcgdGhlIGFyZ3VtZW50cyBwcm92aWRlZC4gIFRoZQorICAvLy8gaW52b2tlZCBwcm9ncmFtIHdpbGwgaW5oZXJpdCB0aGUgc3RkaW4sIHN0ZG91dCwgYW5kIHN0ZGVyciBmaWxlCisgIC8vLyBkZXNjcmlwdG9ycywgdGhlIGVudmlyb25tZW50IGFuZCBvdGhlciBjb25maWd1cmF0aW9uIHNldHRpbmdzIG9mIHRoZQorICAvLy8gaW52b2tpbmcgcHJvZ3JhbS4KKyAgLy8vIFRoaXMgZnVuY3Rpb24gd2FpdHMgZm9yIHRoZSBwcm9ncmFtIHRvIGZpbmlzaCwgc28gc2hvdWxkIGJlIGF2b2lkZWQgaW4KKyAgLy8vIGxpYnJhcnkgZnVuY3Rpb25zIHRoYXQgYXJlbid0IGV4cGVjdGVkIHRvIGJsb2NrLiBDb25zaWRlciB1c2luZworICAvLy8gRXhlY3V0ZU5vV2FpdCgpIGluc3RlYWQuCisgIC8vLyBccmV0dXJucyBhbiBpbnRlZ2VyIHJlc3VsdCBjb2RlIGluZGljYXRpbmcgdGhlIHN0YXR1cyBvZiB0aGUgcHJvZ3JhbS4KKyAgLy8vIEEgemVybyBvciBwb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhlIHJlc3VsdCBjb2RlIG9mIHRoZSBwcm9ncmFtLgorICAvLy8gLTEgaW5kaWNhdGVzIGZhaWx1cmUgdG8gZXhlY3V0ZQorICAvLy8gLTIgaW5kaWNhdGVzIGEgY3Jhc2ggZHVyaW5nIGV4ZWN1dGlvbiBvciB0aW1lb3V0CisgIGludCBFeGVjdXRlQW5kV2FpdCgKKyAgICAgIFN0cmluZ1JlZiBQcm9ncmFtLCAvLy88IFBhdGggb2YgdGhlIHByb2dyYW0gdG8gYmUgZXhlY3V0ZWQuIEl0IGlzCisgICAgICAvLy88IHByZXN1bWVkIHRoaXMgaXMgdGhlIHJlc3VsdCBvZiB0aGUgZmluZFByb2dyYW1CeU5hbWUgbWV0aG9kLgorICAgICAgY29uc3QgY2hhciAqKkFyZ3MsIC8vLzwgQSB2ZWN0b3Igb2Ygc3RyaW5ncyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlCisgICAgICAvLy88IHByb2dyYW0uICBUaGUgZmlyc3QgZWxlbWVudCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0uCisgICAgICAvLy88IFRoZSBsaXN0ICptdXN0KiBiZSB0ZXJtaW5hdGVkIGJ5IGEgbnVsbCBjaGFyKiBlbnRyeS4KKyAgICAgIGNvbnN0IGNoYXIgKipFbnYgPSBudWxscHRyLCAvLy88IEFuIG9wdGlvbmFsIHZlY3RvciBvZiBzdHJpbmdzIHRvIHVzZSBmb3IKKyAgICAgIC8vLzwgdGhlIHByb2dyYW0ncyBlbnZpcm9ubWVudC4gSWYgbm90IHByb3ZpZGVkLCB0aGUgY3VycmVudCBwcm9ncmFtJ3MKKyAgICAgIC8vLzwgZW52aXJvbm1lbnQgd2lsbCBiZSB1c2VkLgorICAgICAgQXJyYXlSZWY8T3B0aW9uYWw8U3RyaW5nUmVmPj4gUmVkaXJlY3RzID0ge30sIC8vLzwKKyAgICAgIC8vLzwgQW4gYXJyYXkgb2Ygb3B0aW9uYWwgcGF0aHMuIFNob3VsZCBoYXZlIGEgc2l6ZSBvZiB6ZXJvIG9yIHRocmVlLgorICAgICAgLy8vPCBJZiB0aGUgYXJyYXkgaXMgZW1wdHksIG5vIHJlZGlyZWN0aW9ucyBhcmUgcGVyZm9ybWVkLgorICAgICAgLy8vPCBPdGhlcndpc2UsIHRoZSBpbmZlcmlvciBwcm9jZXNzJ3Mgc3RkaW4oMCksIHN0ZG91dCgxKSwgYW5kIHN0ZGVycigyKQorICAgICAgLy8vPCB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcGF0aHMsIGlmIHRoZSBvcHRpb25hbCBwYXRoCisgICAgICAvLy88IGlzIHByZXNlbnQgKG5vdCBcYyBsbHZtOjpOb25lKS4KKyAgICAgIC8vLzwgV2hlbiBhbiBlbXB0eSBwYXRoIGlzIHBhc3NlZCBpbiwgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZSBkZXNjcmlwdG9yCisgICAgICAvLy88IHdpbGwgYmUgZGlzY29ubmVjdGVkIChpZSwgL2Rldi9udWxsJ2QpIGluIGEgcG9ydGFibGUgd2F5LgorICAgICAgdW5zaWduZWQgU2Vjb25kc1RvV2FpdCA9IDAsIC8vLzwgSWYgbm9uLXplcm8sIHRoaXMgc3BlY2lmaWVzIHRoZSBhbW91bnQKKyAgICAgIC8vLzwgb2YgdGltZSB0byB3YWl0IGZvciB0aGUgY2hpbGQgcHJvY2VzcyB0byBleGl0LiBJZiB0aGUgdGltZQorICAgICAgLy8vPCBleHBpcmVzLCB0aGUgY2hpbGQgaXMga2lsbGVkIGFuZCB0aGlzIGNhbGwgcmV0dXJucy4gSWYgemVybywKKyAgICAgIC8vLzwgdGhpcyBmdW5jdGlvbiB3aWxsIHdhaXQgdW50aWwgdGhlIGNoaWxkIGZpbmlzaGVzIG9yIGZvcmV2ZXIgaWYKKyAgICAgIC8vLzwgaXQgZG9lc24ndC4KKyAgICAgIHVuc2lnbmVkIE1lbW9yeUxpbWl0ID0gMCwgLy8vPCBJZiBub24temVybywgdGhpcyBzcGVjaWZpZXMgbWF4LiBhbW91bnQKKyAgICAgIC8vLzwgb2YgbWVtb3J5IGNhbiBiZSBhbGxvY2F0ZWQgYnkgcHJvY2Vzcy4gSWYgbWVtb3J5IHVzYWdlIHdpbGwgYmUKKyAgICAgIC8vLzwgaGlnaGVyIGxpbWl0LCB0aGUgY2hpbGQgaXMga2lsbGVkIGFuZCB0aGlzIGNhbGwgcmV0dXJucy4gSWYgemVybworICAgICAgLy8vPCAtIG5vIG1lbW9yeSBsaW1pdC4KKyAgICAgIHN0ZDo6c3RyaW5nICpFcnJNc2cgPSBudWxscHRyLCAvLy88IElmIG5vbi16ZXJvLCBwcm92aWRlcyBhIHBvaW50ZXIgdG8gYQorICAgICAgLy8vPCBzdHJpbmcgaW5zdGFuY2UgaW4gd2hpY2ggZXJyb3IgbWVzc2FnZXMgd2lsbCBiZSByZXR1cm5lZC4gSWYgdGhlCisgICAgICAvLy88IHN0cmluZyBpcyBub24tZW1wdHkgdXBvbiByZXR1cm4gYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaW52b2tpbmcgdGhlCisgICAgICAvLy88IHByb2dyYW0uCisgICAgICBib29sICpFeGVjdXRpb25GYWlsZWQgPSBudWxscHRyKTsKKworICAvLy8gU2ltaWxhciB0byBFeGVjdXRlQW5kV2FpdCwgYnV0IHJldHVybnMgaW1tZWRpYXRlbHkuCisgIC8vLyBAcmV0dXJucyBUaGUgXHNlZSBQcm9jZXNzSW5mbyBvZiB0aGUgbmV3bHkgbGF1bmNlZCBwcm9jZXNzLgorICAvLy8gXG5vdGUgT24gTWljcm9zb2Z0IFdpbmRvd3Mgc3lzdGVtcywgdXNlcnMgd2lsbCBuZWVkIHRvIGVpdGhlciBjYWxsCisgIC8vLyBcc2VlIFdhaXQgdW50aWwgdGhlIHByb2Nlc3MgZmluaXNoZWQgZXhlY3V0aW9uIG9yIHdpbjMyIENsb3NlSGFuZGxlKCkgQVBJCisgIC8vLyBvbiBQcm9jZXNzSW5mby5Qcm9jZXNzSGFuZGxlIHRvIGF2b2lkIG1lbW9yeSBsZWFrcy4KKyAgUHJvY2Vzc0luZm8gRXhlY3V0ZU5vV2FpdChTdHJpbmdSZWYgUHJvZ3JhbSwgY29uc3QgY2hhciAqKkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKkVudiA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3B0aW9uYWw8U3RyaW5nUmVmPj4gUmVkaXJlY3RzID0ge30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWVtb3J5TGltaXQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpFcnJNc2cgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKkV4ZWN1dGlvbkZhaWxlZCA9IG51bGxwdHIpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGZpdCB3aXRoaW4gc3lzdGVtLXNwZWNpZmljCisgIC8vLyBhcmd1bWVudCBsZW5ndGggbGltaXRzLgorICBib29sIGNvbW1hbmRMaW5lRml0c1dpdGhpblN5c3RlbUxpbWl0cyhTdHJpbmdSZWYgUHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgY2hhciAqPiBBcmdzKTsKKworICAvLy8gRmlsZSBlbmNvZGluZyBvcHRpb25zIHdoZW4gd3JpdGluZyBjb250ZW50cyB0aGF0IGEgbm9uLVVURjggdG9vbCB3aWxsCisgIC8vLyByZWFkIChvbiBXaW5kb3dzIHN5c3RlbXMpLiBGb3IgVU5JWCwgd2UgYWx3YXlzIHVzZSBVVEYtOC4KKyAgZW51bSBXaW5kb3dzRW5jb2RpbmdNZXRob2QgeworICAgIC8vLyBVVEYtOCBpcyB0aGUgTExWTSBuYXRpdmUgZW5jb2RpbmcsIGJlaW5nIHRoZSBzYW1lIGFzICJkbyBub3QgcGVyZm9ybQorICAgIC8vLyBlbmNvZGluZyBjb252ZXJzaW9uIi4KKyAgICBXRU1fVVRGOCwKKyAgICBXRU1fQ3VycmVudENvZGVQYWdlLAorICAgIFdFTV9VVEYxNgorICB9OworCisgIC8vLyBTYXZlcyB0aGUgVVRGOC1lbmNvZGVkIFxwIGNvbnRlbnRzIHN0cmluZyBpbnRvIHRoZSBmaWxlIFxwIEZpbGVOYW1lCisgIC8vLyB1c2luZyBhIHNwZWNpZmljIGVuY29kaW5nLgorICAvLy8KKyAgLy8vIFRoaXMgd3JpdGUgZmlsZSBmdW5jdGlvbiBhZGRzIHRoZSBwb3NzaWJpbGl0eSB0byBjaG9vc2Ugd2hpY2ggZW5jb2RpbmcKKyAgLy8vIHRvIHVzZSB3aGVuIHdyaXRpbmcgYSB0ZXh0IGZpbGUuIE9uIFdpbmRvd3MsIHRoaXMgaXMgaW1wb3J0YW50IHdoZW4KKyAgLy8vIHdyaXRpbmcgZmlsZXMgd2l0aCBpbnRlcm5hdGlvbmFsaXphdGlvbiBzdXBwb3J0IHdpdGggYW4gZW5jb2RpbmcgdGhhdCBpcworICAvLy8gZGlmZmVyZW50IGZyb20gdGhlIG9uZSB1c2VkIGluIExMVk0gKFVURi04KS4gV2UgdXNlIHRoaXMgd2hlbiB3cml0aW5nCisgIC8vLyByZXNwb25zZSBmaWxlcywgc2luY2UgR0NDIHRvb2xzIG9uIE1pbkdXIG9ubHkgdW5kZXJzdGFuZCBsZWdhY3kgY29kZQorICAvLy8gcGFnZXMsIGFuZCBWaXN1YWxTdHVkaW8gdG9vbHMgb25seSB1bmRlcnN0YW5kIFVURi0xNi4KKyAgLy8vIEZvciBVTklYLCB1c2luZyBkaWZmZXJlbnQgZW5jb2RpbmdzIGlzIHNpbGVudGx5IGlnbm9yZWQsIHNpbmNlIGFsbCB0b29scworICAvLy8gd29yayB3ZWxsIHdpdGggVVRGLTguCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB5b3Ugb25seSB1c2UgVVRGLTggKnRleHQqIGRhdGEgYW5kIHdpbGwgY29udmVydAorICAvLy8gaXQgdG8geW91ciBkZXNpcmVkIGVuY29kaW5nIGJlZm9yZSB3cml0aW5nIHRvIHRoZSBmaWxlLgorICAvLy8KKyAgLy8vIEZJWE1FOiBXZSB1c2UgRU1fQ3VycmVudENvZGVQYWdlIHRvIHdyaXRlIHJlc3BvbnNlIGZpbGVzIGZvciBHTlUgdG9vbHMgaW4KKyAgLy8vIGEgTWluR1cvTWluR1ctdzY0IGVudmlyb25tZW50LCB3aGljaCBoYXMgc2VyaW91cyBmbGF3cyBidXQgY3VycmVudGx5IGlzCisgIC8vLyBvdXIgYmVzdCBzaG90IHRvIG1ha2UgZ2NjL2xkIHVuZGVyc3RhbmQgaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXJzLiBUaGlzCisgIC8vLyBzaG91bGQgYmUgY2hhbmdlZCBhcyBzb29uIGFzIGJpbnV0aWxzIGZpeCB0aGlzIHRvIHN1cHBvcnQgVVRGMTYgb24gbWluZ3cuCisgIC8vLworICAvLy8gXHJldHVybnMgbm9uLXplcm8gZXJyb3JfY29kZSBpZiBmYWlsZWQKKyAgc3RkOjplcnJvcl9jb2RlCisgIHdyaXRlRmlsZVdpdGhFbmNvZGluZyhTdHJpbmdSZWYgRmlsZU5hbWUsIFN0cmluZ1JlZiBDb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd3NFbmNvZGluZ01ldGhvZCBFbmNvZGluZyA9IFdFTV9VVEY4KTsKKworICAvLy8gVGhpcyBmdW5jdGlvbiB3YWl0cyBmb3IgdGhlIHByb2Nlc3Mgc3BlY2lmaWVkIGJ5IFxwIFBJIHRvIGZpbmlzaC4KKyAgLy8vIFxyZXR1cm5zIEEgXHNlZSBQcm9jZXNzSW5mbyBzdHJ1Y3Qgd2l0aCBQaWQgc2V0IHRvOgorICAvLy8gXGxpIFRoZSBwcm9jZXNzIGlkIG9mIHRoZSBjaGlsZCBwcm9jZXNzIGlmIHRoZSBjaGlsZCBwcm9jZXNzIGhhcyBjaGFuZ2VkCisgIC8vLyBzdGF0ZS4KKyAgLy8vIFxsaSAwIGlmIHRoZSBjaGlsZCBwcm9jZXNzIGhhcyBub3QgY2hhbmdlZCBzdGF0ZS4KKyAgLy8vIFxub3RlIFVzZXJzIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGFsd2F5cyBjaGVjayB0aGUgUmV0dXJuQ29kZSBtZW1iZXIgb2YKKyAgLy8vIHRoZSBcc2VlIFByb2Nlc3NJbmZvIHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbi4KKyAgUHJvY2Vzc0luZm8gV2FpdCgKKyAgICAgIGNvbnN0IFByb2Nlc3NJbmZvICZQSSwgLy8vPCBUaGUgY2hpbGQgcHJvY2VzcyB0aGF0IHNob3VsZCBiZSB3YWl0ZWQgb24uCisgICAgICB1bnNpZ25lZCBTZWNvbmRzVG9XYWl0LCAvLy88IElmIG5vbi16ZXJvLCB0aGlzIHNwZWNpZmllcyB0aGUgYW1vdW50IG9mCisgICAgICAvLy88IHRpbWUgdG8gd2FpdCBmb3IgdGhlIGNoaWxkIHByb2Nlc3MgdG8gZXhpdC4gSWYgdGhlIHRpbWUgZXhwaXJlcywgdGhlCisgICAgICAvLy88IGNoaWxkIGlzIGtpbGxlZCBhbmQgdGhpcyBmdW5jdGlvbiByZXR1cm5zLiBJZiB6ZXJvLCB0aGlzIGZ1bmN0aW9uCisgICAgICAvLy88IHdpbGwgcGVyZm9ybSBhIG5vbi1ibG9ja2luZyB3YWl0IG9uIHRoZSBjaGlsZCBwcm9jZXNzLgorICAgICAgYm9vbCBXYWl0VW50aWxUZXJtaW5hdGVzLCAvLy88IElmIHRydWUsIGlnbm9yZXMgXHAgU2Vjb25kc1RvV2FpdCBhbmQgd2FpdHMKKyAgICAgIC8vLzwgdW50aWwgY2hpbGQgaGFzIHRlcm1pbmF0ZWQuCisgICAgICBzdGQ6OnN0cmluZyAqRXJyTXNnID0gbnVsbHB0ciAvLy88IElmIG5vbi16ZXJvLCBwcm92aWRlcyBhIHBvaW50ZXIgdG8gYQorICAgICAgLy8vPCBzdHJpbmcgaW5zdGFuY2UgaW4gd2hpY2ggZXJyb3IgbWVzc2FnZXMgd2lsbCBiZSByZXR1cm5lZC4gSWYgdGhlCisgICAgICAvLy88IHN0cmluZyBpcyBub24tZW1wdHkgdXBvbiByZXR1cm4gYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaW52b2tpbmcgdGhlCisgICAgICAvLy88IHByb2dyYW0uCisgICAgICApOworICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JXTXV0ZXguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9SV011dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmNGZjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9SV011dGV4LmgKQEAgLTAsMCArMSwxNzkgQEAKKy8vPT09LSBSV011dGV4LmggLSBSZWFkZXIvV3JpdGVyIE11dHVhbCBFeGNsdXNpb24gTG9jayAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBsbHZtOjpzeXM6OlJXTXV0ZXggY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfUldNVVRFWF9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9SV01VVEVYX0gKKworI2luY2x1ZGUgImxsdm0vQ29uZmlnL2xsdm0tY29uZmlnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RocmVhZGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzeXMgeworCisgICAgLy8vIEBicmllZiBQbGF0Zm9ybSBhZ25vc3RpYyBSV011dGV4IGNsYXNzLgorICAgIGNsYXNzIFJXTXV0ZXhJbXBsCisgICAgeworICAgIC8vLyBAbmFtZSBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gQHsKKyAgICBwdWJsaWM6CisKKyAgICAgIC8vLyBJbml0aWFsaXplcyB0aGUgbG9jayBidXQgZG9lc24ndCBhY3F1aXJlIGl0LgorICAgICAgLy8vIEBicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgICAgZXhwbGljaXQgUldNdXRleEltcGwoKTsKKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBEbyBOb3QgSW1wbGVtZW50CisgICAgLy8vIEB7CisgICAgICBSV011dGV4SW1wbChjb25zdCBSV011dGV4SW1wbCAmIG9yaWdpbmFsKSA9IGRlbGV0ZTsKKyAgICAgIFJXTXV0ZXhJbXBsICZvcGVyYXRvcj0oY29uc3QgUldNdXRleEltcGwgJikgPSBkZWxldGU7CisgICAgLy8vIEB9CisKKyAgICAgIC8vLyBSZWxlYXNlcyBhbmQgcmVtb3ZlcyB0aGUgbG9jaworICAgICAgLy8vIEBicmllZiBEZXN0cnVjdG9yCisgICAgICB+UldNdXRleEltcGwoKTsKKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBNZXRob2RzCisgICAgLy8vIEB7CisgICAgcHVibGljOgorCisgICAgICAvLy8gQXR0ZW1wdHMgdG8gdW5jb25kaXRpb25hbGx5IGFjcXVpcmUgdGhlIGxvY2sgaW4gcmVhZGVyIG1vZGUuIElmIHRoZQorICAgICAgLy8vIGxvY2sgaXMgaGVsZCBieSBhIHdyaXRlciwgdGhpcyBtZXRob2Qgd2lsbCB3YWl0IHVudGlsIGl0IGNhbiBhY3F1aXJlCisgICAgICAvLy8gdGhlIGxvY2suCisgICAgICAvLy8gQHJldHVybnMgZmFsc2UgaWYgYW55IGtpbmQgb2YgZXJyb3Igb2NjdXJzLCB0cnVlIG90aGVyd2lzZS4KKyAgICAgIC8vLyBAYnJpZWYgVW5jb25kaXRpb25hbGx5IGFjcXVpcmUgdGhlIGxvY2sgaW4gcmVhZGVyIG1vZGUuCisgICAgICBib29sIHJlYWRlcl9hY3F1aXJlKCk7CisKKyAgICAgIC8vLyBBdHRlbXB0cyB0byByZWxlYXNlIHRoZSBsb2NrIGluIHJlYWRlciBtb2RlLgorICAgICAgLy8vIEByZXR1cm5zIGZhbHNlIGlmIGFueSBraW5kIG9mIGVycm9yIG9jY3VycywgdHJ1ZSBvdGhlcndpc2UuCisgICAgICAvLy8gQGJyaWVmIFVuY29uZGl0aW9uYWxseSByZWxlYXNlIHRoZSBsb2NrIGluIHJlYWRlciBtb2RlLgorICAgICAgYm9vbCByZWFkZXJfcmVsZWFzZSgpOworCisgICAgICAvLy8gQXR0ZW1wdHMgdG8gdW5jb25kaXRpb25hbGx5IGFjcXVpcmUgdGhlIGxvY2sgaW4gcmVhZGVyIG1vZGUuIElmIHRoZQorICAgICAgLy8vIGxvY2sgaXMgaGVsZCBieSBhbnkgcmVhZGVycywgdGhpcyBtZXRob2Qgd2lsbCB3YWl0IHVudGlsIGl0IGNhbgorICAgICAgLy8vIGFjcXVpcmUgdGhlIGxvY2suCisgICAgICAvLy8gQHJldHVybnMgZmFsc2UgaWYgYW55IGtpbmQgb2YgZXJyb3Igb2NjdXJzLCB0cnVlIG90aGVyd2lzZS4KKyAgICAgIC8vLyBAYnJpZWYgVW5jb25kaXRpb25hbGx5IGFjcXVpcmUgdGhlIGxvY2sgaW4gd3JpdGVyIG1vZGUuCisgICAgICBib29sIHdyaXRlcl9hY3F1aXJlKCk7CisKKyAgICAgIC8vLyBBdHRlbXB0cyB0byByZWxlYXNlIHRoZSBsb2NrIGluIHdyaXRlciBtb2RlLgorICAgICAgLy8vIEByZXR1cm5zIGZhbHNlIGlmIGFueSBraW5kIG9mIGVycm9yIG9jY3VycywgdHJ1ZSBvdGhlcndpc2UuCisgICAgICAvLy8gQGJyaWVmIFVuY29uZGl0aW9uYWxseSByZWxlYXNlIHRoZSBsb2NrIGluIHdyaXRlIG1vZGUuCisgICAgICBib29sIHdyaXRlcl9yZWxlYXNlKCk7CisKKyAgICAvL0B9CisgICAgLy8vIEBuYW1lIFBsYXRmb3JtIERlcGVuZGVudCBEYXRhCisgICAgLy8vIEB7CisgICAgcHJpdmF0ZToKKyNpZiBkZWZpbmVkKExMVk1fRU5BQkxFX1RIUkVBRFMpICYmIExMVk1fRU5BQkxFX1RIUkVBRFMgIT0gMAorICAgICAgdm9pZCogZGF0YV8gPSBudWxscHRyOyAvLy88IFdlIGRvbid0IGtub3cgd2hhdCB0aGUgZGF0YSB3aWxsIGJlCisjZW5kaWYKKyAgICB9OworCisgICAgLy8vIFNtYXJ0TXV0ZXggLSBBbiBSL1cgbXV0ZXggd2l0aCBhIGNvbXBpbGUgdGltZSBjb25zdGFudCBwYXJhbWV0ZXIgdGhhdAorICAgIC8vLyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIG11dGV4IHNob3VsZCBiZWNvbWUgYSBuby1vcCB3aGVuIHdlJ3JlIG5vdAorICAgIC8vLyBydW5uaW5nIGluIG11bHRpdGhyZWFkZWQgbW9kZS4KKyAgICB0ZW1wbGF0ZTxib29sIG10X29ubHk+CisgICAgY2xhc3MgU21hcnRSV011dGV4IHsKKyAgICAgIFJXTXV0ZXhJbXBsIGltcGw7CisgICAgICB1bnNpZ25lZCByZWFkZXJzID0gMDsKKyAgICAgIHVuc2lnbmVkIHdyaXRlcnMgPSAwOworCisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQgU21hcnRSV011dGV4KCkgPSBkZWZhdWx0OworICAgICAgU21hcnRSV011dGV4KGNvbnN0IFNtYXJ0UldNdXRleDxtdF9vbmx5PiAmIG9yaWdpbmFsKSA9IGRlbGV0ZTsKKyAgICAgIFNtYXJ0UldNdXRleDxtdF9vbmx5PiAmb3BlcmF0b3I9KGNvbnN0IFNtYXJ0UldNdXRleDxtdF9vbmx5PiAmKSA9IGRlbGV0ZTsKKworICAgICAgYm9vbCBsb2NrX3NoYXJlZCgpIHsKKyAgICAgICAgaWYgKCFtdF9vbmx5IHx8IGxsdm1faXNfbXVsdGl0aHJlYWRlZCgpKQorICAgICAgICAgIHJldHVybiBpbXBsLnJlYWRlcl9hY3F1aXJlKCk7CisKKyAgICAgICAgLy8gU2luZ2xlLXRocmVhZGVkIGRlYnVnZ2luZyBjb2RlLiAgVGhpcyB3b3VsZCBiZSByYWN5IGluIG11bHRpdGhyZWFkZWQKKyAgICAgICAgLy8gbW9kZSwgYnV0IHByb3ZpZGVzIG5vdCBzYW5pdHkgY2hlY2tzIGluIHNpbmdsZSB0aHJlYWRlZCBtb2RlLgorICAgICAgICArK3JlYWRlcnM7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBib29sIHVubG9ja19zaGFyZWQoKSB7CisgICAgICAgIGlmICghbXRfb25seSB8fCBsbHZtX2lzX211bHRpdGhyZWFkZWQoKSkKKyAgICAgICAgICByZXR1cm4gaW1wbC5yZWFkZXJfcmVsZWFzZSgpOworCisgICAgICAgIC8vIFNpbmdsZS10aHJlYWRlZCBkZWJ1Z2dpbmcgY29kZS4gIFRoaXMgd291bGQgYmUgcmFjeSBpbiBtdWx0aXRocmVhZGVkCisgICAgICAgIC8vIG1vZGUsIGJ1dCBwcm92aWRlcyBub3Qgc2FuaXR5IGNoZWNrcyBpbiBzaW5nbGUgdGhyZWFkZWQgbW9kZS4KKyAgICAgICAgYXNzZXJ0KHJlYWRlcnMgPiAwICYmICJSZWFkZXIgbG9jayBub3QgYWNxdWlyZWQgYmVmb3JlIHJlbGVhc2UhIik7CisgICAgICAgIC0tcmVhZGVyczsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIGJvb2wgbG9jaygpIHsKKyAgICAgICAgaWYgKCFtdF9vbmx5IHx8IGxsdm1faXNfbXVsdGl0aHJlYWRlZCgpKQorICAgICAgICAgIHJldHVybiBpbXBsLndyaXRlcl9hY3F1aXJlKCk7CisKKyAgICAgICAgLy8gU2luZ2xlLXRocmVhZGVkIGRlYnVnZ2luZyBjb2RlLiAgVGhpcyB3b3VsZCBiZSByYWN5IGluIG11bHRpdGhyZWFkZWQKKyAgICAgICAgLy8gbW9kZSwgYnV0IHByb3ZpZGVzIG5vdCBzYW5pdHkgY2hlY2tzIGluIHNpbmdsZSB0aHJlYWRlZCBtb2RlLgorICAgICAgICBhc3NlcnQod3JpdGVycyA9PSAwICYmICJXcml0ZXIgbG9jayBhbHJlYWR5IGFjcXVpcmVkISIpOworICAgICAgICArK3dyaXRlcnM7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBib29sIHVubG9jaygpIHsKKyAgICAgICAgaWYgKCFtdF9vbmx5IHx8IGxsdm1faXNfbXVsdGl0aHJlYWRlZCgpKQorICAgICAgICAgIHJldHVybiBpbXBsLndyaXRlcl9yZWxlYXNlKCk7CisKKyAgICAgICAgLy8gU2luZ2xlLXRocmVhZGVkIGRlYnVnZ2luZyBjb2RlLiAgVGhpcyB3b3VsZCBiZSByYWN5IGluIG11bHRpdGhyZWFkZWQKKyAgICAgICAgLy8gbW9kZSwgYnV0IHByb3ZpZGVzIG5vdCBzYW5pdHkgY2hlY2tzIGluIHNpbmdsZSB0aHJlYWRlZCBtb2RlLgorICAgICAgICBhc3NlcnQod3JpdGVycyA9PSAxICYmICJXcml0ZXIgbG9jayBub3QgYWNxdWlyZWQgYmVmb3JlIHJlbGVhc2UhIik7CisgICAgICAgIC0td3JpdGVyczsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfTsKKworICAgIHR5cGVkZWYgU21hcnRSV011dGV4PGZhbHNlPiBSV011dGV4OworCisgICAgLy8vIFNjb3BlZFJlYWRlciAtIFJBSUkgYWNxdWlzaXRpb24gb2YgYSByZWFkZXIgbG9jaworICAgIHRlbXBsYXRlPGJvb2wgbXRfb25seT4KKyAgICBzdHJ1Y3QgU21hcnRTY29wZWRSZWFkZXIgeworICAgICAgU21hcnRSV011dGV4PG10X29ubHk+JiBtdXRleDsKKworICAgICAgZXhwbGljaXQgU21hcnRTY29wZWRSZWFkZXIoU21hcnRSV011dGV4PG10X29ubHk+JiBtKSA6IG11dGV4KG0pIHsKKyAgICAgICAgbXV0ZXgubG9ja19zaGFyZWQoKTsKKyAgICAgIH0KKworICAgICAgflNtYXJ0U2NvcGVkUmVhZGVyKCkgeworICAgICAgICBtdXRleC51bmxvY2tfc2hhcmVkKCk7CisgICAgICB9CisgICAgfTsKKworICAgIHR5cGVkZWYgU21hcnRTY29wZWRSZWFkZXI8ZmFsc2U+IFNjb3BlZFJlYWRlcjsKKworICAgIC8vLyBTY29wZWRXcml0ZXIgLSBSQUlJIGFjcXVpc2l0aW9uIG9mIGEgd3JpdGVyIGxvY2sKKyAgICB0ZW1wbGF0ZTxib29sIG10X29ubHk+CisgICAgc3RydWN0IFNtYXJ0U2NvcGVkV3JpdGVyIHsKKyAgICAgIFNtYXJ0UldNdXRleDxtdF9vbmx5PiYgbXV0ZXg7CisKKyAgICAgIGV4cGxpY2l0IFNtYXJ0U2NvcGVkV3JpdGVyKFNtYXJ0UldNdXRleDxtdF9vbmx5PiYgbSkgOiBtdXRleChtKSB7CisgICAgICAgIG11dGV4LmxvY2soKTsKKyAgICAgIH0KKworICAgICAgflNtYXJ0U2NvcGVkV3JpdGVyKCkgeworICAgICAgICBtdXRleC51bmxvY2soKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgdHlwZWRlZiBTbWFydFNjb3BlZFdyaXRlcjxmYWxzZT4gU2NvcGVkV3JpdGVyOworCit9IC8vIGVuZCBuYW1lc3BhY2Ugc3lzCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX1JXTVVURVhfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JhbmRvbU51bWJlckdlbmVyYXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JhbmRvbU51bWJlckdlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOTlkYWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUmFuZG9tTnVtYmVyR2VuZXJhdG9yLmgKQEAgLTAsMCArMSw3MCBAQAorLy89PS0gbGx2bS9TdXBwb3J0L1JhbmRvbU51bWJlckdlbmVyYXRvci5oIC0gUk5HIGZvciBkaXZlcnNpdHkgLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGV0ZXJtaW5pc3RpYyByYW5kb20gbnVtYmVyCisvLyBnZW5lcmF0aW9uIChSTkcpLiAgTm90ZSB0aGF0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIG5vdAorLy8gY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIGFzIGl0IHVzZXMgdGhlIEMrKzExIDxyYW5kb20+IGZhY2lsaXRpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfUkFORE9NTlVNQkVSR0VORVJBVE9SX0hfCisjZGVmaW5lIExMVk1fU1VQUE9SVF9SQU5ET01OVU1CRVJHRU5FUkFUT1JfSF8KKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIgLy8gTmVlZGVkIGZvciB1aW50NjRfdCBvbiBXaW5kb3dzLgorI2luY2x1ZGUgPHJhbmRvbT4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFN0cmluZ1JlZjsKKworLy8vIEEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisvLy8KKy8vLyBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHNoYXJlZCBhY3Jvc3MgdGhyZWFkcy4gVGhlCisvLy8gc2VlZCBzaG91bGQgYmUgc2V0IGJ5IHBhc3NpbmcgdGhlIC1ybmctc2VlZD08dWludDY0PiBvcHRpb24uIFVzZQorLy8vIE1vZHVsZTo6Y3JlYXRlUk5HIHRvIGNyZWF0ZSBhIG5ldyBSTkcgaW5zdGFuY2UgZm9yIHVzZSB3aXRoIHRoYXQKKy8vLyBtb2R1bGUuCitjbGFzcyBSYW5kb21OdW1iZXJHZW5lcmF0b3IgeworCisgIC8vIDY0LWJpdCBNZXJzZW5uZSBUd2lzdGVyIGJ5IE1hdHN1bW90byBhbmQgTmlzaGltdXJhLCAyMDAwCisgIC8vIGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL251bWVyaWMvcmFuZG9tL21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lCisgIC8vIFRoaXMgUk5HIGlzIGRldGVybWluaXN0aWNhbGx5IHBvcnRhYmxlIGFjcm9zcyBDKysxMQorICAvLyBpbXBsZW1lbnRhdGlvbnMuCisgIHVzaW5nIGdlbmVyYXRvcl90eXBlID0gc3RkOjptdDE5OTM3XzY0OworCitwdWJsaWM6CisgIHVzaW5nIHJlc3VsdF90eXBlID0gZ2VuZXJhdG9yX3R5cGU6OnJlc3VsdF90eXBlOworCisgIC8vLyBSZXR1cm5zIGEgcmFuZG9tIG51bWJlciBpbiB0aGUgcmFuZ2UgWzAsIE1heCkuCisgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoKTsKKworICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIG1pbigpIHsgcmV0dXJuIGdlbmVyYXRvcl90eXBlOjptaW4oKTsgfQorICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIG1heCgpIHsgcmV0dXJuIGdlbmVyYXRvcl90eXBlOjptYXgoKTsgfQorCitwcml2YXRlOgorICAvLy8gU2VlZHMgYW5kIHNhbHRzIHRoZSB1bmRlcmx5aW5nIFJORyBlbmdpbmUuCisgIC8vLworICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkuIEluc3RlYWQgdXNlCisgIC8vLyBNb2R1bGU6OmNyZWF0ZVJORyB0byBjcmVhdGUgYSBuZXcgUk5HIHNhbHRlZCB3aXRoIHRoZSBNb2R1bGUgSUQuCisgIFJhbmRvbU51bWJlckdlbmVyYXRvcihTdHJpbmdSZWYgU2FsdCk7CisKKyAgZ2VuZXJhdG9yX3R5cGUgR2VuZXJhdG9yOworCisgIC8vIE5vbmNvcHlhYmxlLgorICBSYW5kb21OdW1iZXJHZW5lcmF0b3IoY29uc3QgUmFuZG9tTnVtYmVyR2VuZXJhdG9yICZvdGhlcikgPSBkZWxldGU7CisgIFJhbmRvbU51bWJlckdlbmVyYXRvciAmb3BlcmF0b3I9KGNvbnN0IFJhbmRvbU51bWJlckdlbmVyYXRvciAmb3RoZXIpID0gZGVsZXRlOworCisgIGZyaWVuZCBjbGFzcyBNb2R1bGU7Cit9OworCisvLyBHZXQgcmFuZG9tIHZlY3RvciBvZiBzcGVjaWZpZWQgc2l6ZQorc3RkOjplcnJvcl9jb2RlIGdldFJhbmRvbUJ5dGVzKHZvaWQgKkJ1ZmZlciwgc2l6ZV90IFNpemUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9SZWN5Y2xlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JlY3ljbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNkYjJlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9SZWN5Y2xlci5oCkBAIC0wLDAgKzEsMTE2IEBACisvLz09LSBsbHZtL1N1cHBvcnQvUmVjeWNsZXIuaCAtIFJlY3ljbGluZyBBbGxvY2F0b3IgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBSZWN5Y2xlciBjbGFzcyB0ZW1wbGF0ZS4gIFNlZSB0aGUgZG94eWdlbiBjb21tZW50IGZvcgorLy8gUmVjeWNsZXIgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9SRUNZQ0xFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9SRUNZQ0xFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFByaW50UmVjeWNsaW5nQWxsb2NhdG9yU3RhdHMgLSBIZWxwZXIgZm9yIFJlY3ljbGluZ0FsbG9jYXRvciBmb3IKKy8vLyBwcmludGluZyBzdGF0aXN0aWNzLgorLy8vCit2b2lkIFByaW50UmVjeWNsZXJTdGF0cyhzaXplX3QgU2l6ZSwgc2l6ZV90IEFsaWduLCBzaXplX3QgRnJlZUxpc3RTaXplKTsKKworLy8vIFJlY3ljbGVyIC0gVGhpcyBjbGFzcyBtYW5hZ2VzIGEgbGlua2VkLWxpc3Qgb2YgZGVhbGxvY2F0ZWQgbm9kZXMKKy8vLyBhbmQgZmFjaWxpdGF0ZXMgcmV1c2luZyBkZWFsbG9jYXRlZCBtZW1vcnkgaW4gcGxhY2Ugb2YgYWxsb2NhdGluZworLy8vIG5ldyBtZW1vcnkuCisvLy8KK3RlbXBsYXRlIDxjbGFzcyBULCBzaXplX3QgU2l6ZSA9IHNpemVvZihUKSwgc2l6ZV90IEFsaWduID0gYWxpZ25vZihUKT4KK2NsYXNzIFJlY3ljbGVyIHsKKyAgc3RydWN0IEZyZWVOb2RlIHsKKyAgICBGcmVlTm9kZSAqTmV4dDsKKyAgfTsKKworICAvLy8gTGlzdCBvZiBub2RlcyB0aGF0IGhhdmUgZGVsZXRlZCBjb250ZW50cyBhbmQgYXJlIG5vdCBpbiBhY3RpdmUgdXNlLgorICBGcmVlTm9kZSAqRnJlZUxpc3QgPSBudWxscHRyOworCisgIEZyZWVOb2RlICpwb3BfdmFsKCkgeworICAgIGF1dG8gKlZhbCA9IEZyZWVMaXN0OworICAgIF9fYXNhbl91bnBvaXNvbl9tZW1vcnlfcmVnaW9uKFZhbCwgU2l6ZSk7CisgICAgRnJlZUxpc3QgPSBGcmVlTGlzdC0+TmV4dDsKKyAgICBfX21zYW5fYWxsb2NhdGVkX21lbW9yeShWYWwsIFNpemUpOworICAgIHJldHVybiBWYWw7CisgIH0KKworICB2b2lkIHB1c2goRnJlZU5vZGUgKk4pIHsKKyAgICBOLT5OZXh0ID0gRnJlZUxpc3Q7CisgICAgRnJlZUxpc3QgPSBOOworICAgIF9fYXNhbl9wb2lzb25fbWVtb3J5X3JlZ2lvbihOLCBTaXplKTsKKyAgfQorCitwdWJsaWM6CisgIH5SZWN5Y2xlcigpIHsKKyAgICAvLyBJZiB0aGlzIGZhaWxzLCBlaXRoZXIgdGhlIGNhbGxlZSBoYXMgbG9zdCB0cmFjayBvZiBzb21lIGFsbG9jYXRpb24sCisgICAgLy8gb3IgdGhlIGNhbGxlZSBpc24ndCB0cmFja2luZyBhbGxvY2F0aW9ucyBhbmQgc2hvdWxkIGp1c3QgY2FsbAorICAgIC8vIGNsZWFyKCkgYmVmb3JlIGRlbGV0aW5nIHRoZSBSZWN5Y2xlci4KKyAgICBhc3NlcnQoIUZyZWVMaXN0ICYmICJOb24tZW1wdHkgcmVjeWNsZXIgZGVsZXRlZCEiKTsKKyAgfQorCisgIC8vLyBjbGVhciAtIFJlbGVhc2UgYWxsIHRoZSB0cmFja2VkIGFsbG9jYXRpb25zIHRvIHRoZSBhbGxvY2F0b3IuIFRoZQorICAvLy8gcmVjeWNsZXIgbXVzdCBiZSBmcmVlIG9mIGFueSB0cmFja2VkIGFsbG9jYXRpb25zIGJlZm9yZSBiZWluZworICAvLy8gZGVsZXRlZDsgY2FsbGluZyBjbGVhciBpcyBvbmUgd2F5IHRvIGVuc3VyZSB0aGlzLgorICB0ZW1wbGF0ZTxjbGFzcyBBbGxvY2F0b3JUeXBlPgorICB2b2lkIGNsZWFyKEFsbG9jYXRvclR5cGUgJkFsbG9jYXRvcikgeworICAgIHdoaWxlIChGcmVlTGlzdCkgeworICAgICAgVCAqdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VCAqPihwb3BfdmFsKCkpOworICAgICAgQWxsb2NhdG9yLkRlYWxsb2NhdGUodCk7CisgICAgfQorICB9CisKKyAgLy8vIFNwZWNpYWwgY2FzZSBmb3IgQnVtcFB0ckFsbG9jYXRvciB3aGljaCBoYXMgYW4gZW1wdHkgRGVhbGxvY2F0ZSgpCisgIC8vLyBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBUaGVyZSBpcyBubyBuZWVkIHRvIHRyYXZlcnNlIHRoZSBmcmVlIGxpc3QsIHB1bGxpbmcgYWxsIHRoZSBvYmplY3RzIGludG8KKyAgLy8vIGNhY2hlLgorICB2b2lkIGNsZWFyKEJ1bXBQdHJBbGxvY2F0b3IgJikgeyBGcmVlTGlzdCA9IG51bGxwdHI7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBTdWJDbGFzcywgY2xhc3MgQWxsb2NhdG9yVHlwZT4KKyAgU3ViQ2xhc3MgKkFsbG9jYXRlKEFsbG9jYXRvclR5cGUgJkFsbG9jYXRvcikgeworICAgIHN0YXRpY19hc3NlcnQoYWxpZ25vZihTdWJDbGFzcykgPD0gQWxpZ24sCisgICAgICAgICAgICAgICAgICAiUmVjeWNsZXIgYWxsb2NhdGlvbiBhbGlnbm1lbnQgaXMgbGVzcyB0aGFuIG9iamVjdCBhbGlnbiEiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihTdWJDbGFzcykgPD0gU2l6ZSwKKyAgICAgICAgICAgICAgICAgICJSZWN5Y2xlciBhbGxvY2F0aW9uIHNpemUgaXMgbGVzcyB0aGFuIG9iamVjdCBzaXplISIpOworICAgIHJldHVybiBGcmVlTGlzdCA/IHJlaW50ZXJwcmV0X2Nhc3Q8U3ViQ2xhc3MgKj4ocG9wX3ZhbCgpKQorICAgICAgICAgICAgICAgICAgICA6IHN0YXRpY19jYXN0PFN1YkNsYXNzICo+KEFsbG9jYXRvci5BbGxvY2F0ZShTaXplLCBBbGlnbikpOworICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgQWxsb2NhdG9yVHlwZT4KKyAgVCAqQWxsb2NhdGUoQWxsb2NhdG9yVHlwZSAmQWxsb2NhdG9yKSB7CisgICAgcmV0dXJuIEFsbG9jYXRlPFQ+KEFsbG9jYXRvcik7CisgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBTdWJDbGFzcywgY2xhc3MgQWxsb2NhdG9yVHlwZT4KKyAgdm9pZCBEZWFsbG9jYXRlKEFsbG9jYXRvclR5cGUgJiAvKkFsbG9jYXRvciovLCBTdWJDbGFzcyogRWxlbWVudCkgeworICAgIHB1c2gocmVpbnRlcnByZXRfY2FzdDxGcmVlTm9kZSAqPihFbGVtZW50KSk7CisgIH0KKworICB2b2lkIFByaW50U3RhdHMoKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBzaXplX3QgU2l6ZSwgc2l6ZV90IEFsaWduPgordm9pZCBSZWN5Y2xlcjxULCBTaXplLCBBbGlnbj46OlByaW50U3RhdHMoKSB7CisgIHNpemVfdCBTID0gMDsKKyAgZm9yIChhdXRvICpJID0gRnJlZUxpc3Q7IEk7IEkgPSBJLT5OZXh0KQorICAgICsrUzsKKyAgUHJpbnRSZWN5Y2xlclN0YXRzKFNpemUsIEFsaWduLCBTKTsKK30KKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9SZWN5Y2xpbmdBbGxvY2F0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9SZWN5Y2xpbmdBbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmIwMzNiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JlY3ljbGluZ0FsbG9jYXRvci5oCkBAIC0wLDAgKzEsNzcgQEAKKy8vPT0tIGxsdm0vU3VwcG9ydC9SZWN5Y2xpbmdBbGxvY2F0b3IuaCAtIFJlY3ljbGluZyBBbGxvY2F0b3IgLS0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFJlY3ljbGluZ0FsbG9jYXRvciBjbGFzcy4gIFNlZSB0aGUgZG94eWdlbiBjb21tZW50IGZvcgorLy8gUmVjeWNsaW5nQWxsb2NhdG9yIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGltcGxlbWVudGF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1JFQ1lDTElOR0FMTE9DQVRPUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9SRUNZQ0xJTkdBTExPQ0FUT1JfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1JlY3ljbGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFJlY3ljbGluZ0FsbG9jYXRvciAtIFRoaXMgY2xhc3Mgd3JhcHMgYW4gQWxsb2NhdG9yLCBhZGRpbmcgdGhlCisvLy8gZnVuY3Rpb25hbGl0eSBvZiByZWN5Y2xpbmcgZGVsZXRlZCBvYmplY3RzLgorLy8vCit0ZW1wbGF0ZSA8Y2xhc3MgQWxsb2NhdG9yVHlwZSwgY2xhc3MgVCwgc2l6ZV90IFNpemUgPSBzaXplb2YoVCksCisgICAgICAgICAgc2l6ZV90IEFsaWduID0gYWxpZ25vZihUKT4KK2NsYXNzIFJlY3ljbGluZ0FsbG9jYXRvciB7Citwcml2YXRlOgorICAvLy8gQmFzZSAtIEltcGxlbWVudGF0aW9uIGRldGFpbHMuCisgIC8vLworICBSZWN5Y2xlcjxULCBTaXplLCBBbGlnbj4gQmFzZTsKKworICAvLy8gQWxsb2NhdG9yIC0gVGhlIHdyYXBwZWQgYWxsb2NhdG9yLgorICAvLy8KKyAgQWxsb2NhdG9yVHlwZSBBbGxvY2F0b3I7CisKK3B1YmxpYzoKKyAgflJlY3ljbGluZ0FsbG9jYXRvcigpIHsgQmFzZS5jbGVhcihBbGxvY2F0b3IpOyB9CisKKyAgLy8vIEFsbG9jYXRlIC0gUmV0dXJuIGEgcG9pbnRlciB0byBzdG9yYWdlIGZvciBhbiBvYmplY3Qgb2YgdHlwZQorICAvLy8gU3ViQ2xhc3MuIFRoZSBzdG9yYWdlIG1heSBiZSBlaXRoZXIgbmV3bHkgYWxsb2NhdGVkIG9yIHJlY3ljbGVkLgorICAvLy8KKyAgdGVtcGxhdGU8Y2xhc3MgU3ViQ2xhc3M+CisgIFN1YkNsYXNzICpBbGxvY2F0ZSgpIHsgcmV0dXJuIEJhc2UudGVtcGxhdGUgQWxsb2NhdGU8U3ViQ2xhc3M+KEFsbG9jYXRvcik7IH0KKworICBUICpBbGxvY2F0ZSgpIHsgcmV0dXJuIEJhc2UuQWxsb2NhdGUoQWxsb2NhdG9yKTsgfQorCisgIC8vLyBEZWFsbG9jYXRlIC0gUmVsZWFzZSBzdG9yYWdlIGZvciB0aGUgcG9pbnRlZC10byBvYmplY3QuIFRoZQorICAvLy8gc3RvcmFnZSB3aWxsIGJlIGtlcHQgdHJhY2sgb2YgYW5kIG1heSBiZSByZWN5Y2xlZC4KKyAgLy8vCisgIHRlbXBsYXRlPGNsYXNzIFN1YkNsYXNzPgorICB2b2lkIERlYWxsb2NhdGUoU3ViQ2xhc3MqIEUpIHsgcmV0dXJuIEJhc2UuRGVhbGxvY2F0ZShBbGxvY2F0b3IsIEUpOyB9CisKKyAgdm9pZCBQcmludFN0YXRzKCkgeworICAgIEFsbG9jYXRvci5QcmludFN0YXRzKCk7CisgICAgQmFzZS5QcmludFN0YXRzKCk7CisgIH0KK307CisKK30KKwordGVtcGxhdGU8Y2xhc3MgQWxsb2NhdG9yVHlwZSwgY2xhc3MgVCwgc2l6ZV90IFNpemUsIHNpemVfdCBBbGlnbj4KK2lubGluZSB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlJlY3ljbGluZ0FsbG9jYXRvcjxBbGxvY2F0b3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCwgU2l6ZSwgQWxpZ24+ICZBbGxvY2F0b3IpIHsKKyAgYXNzZXJ0KHNpemUgPD0gU2l6ZSAmJiAiYWxsb2NhdGlvbiBzaXplIGV4Y2VlZGVkIik7CisgIHJldHVybiBBbGxvY2F0b3IuQWxsb2NhdGUoKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgQWxsb2NhdG9yVHlwZSwgY2xhc3MgVCwgc2l6ZV90IFNpemUsIHNpemVfdCBBbGlnbj4KK2lubGluZSB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlJlY3ljbGluZ0FsbG9jYXRvcjxBbGxvY2F0b3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBULCBTaXplLCBBbGlnbj4gJkEpIHsKKyAgQS5EZWFsbG9jYXRlKEUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9SZWdleC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JlZ2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5ODgzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9SZWdleC5oCkBAIC0wLDAgKzEsMTAyIEBACisvLz09PS0tIFJlZ2V4LmggLSBSZWd1bGFyIEV4cHJlc3Npb24gbWF0Y2hlciBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgUE9TSVggcmVndWxhciBleHByZXNzaW9uIG1hdGNoZXIuICBCb3RoIEJhc2ljIGFuZAorLy8gRXh0ZW5kZWQgUE9TSVggcmVndWxhciBleHByZXNzaW9ucyAoRVJFKSBhcmUgc3VwcG9ydGVkLiAgRVJFcyB3ZXJlIGV4dGVuZGVkCisvLyB0byBzdXBwb3J0IGJhY2tyZWZlcmVuY2VzIGluIG1hdGNoZXMuCisvLyBUaGlzIGltcGxlbWVudGF0aW9uIGFsc28gc3VwcG9ydHMgbWF0Y2hpbmcgc3RyaW5ncyB3aXRoIGVtYmVkZGVkIE5VTCBjaGFycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9SRUdFWF9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9SRUdFWF9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK3N0cnVjdCBsbHZtX3JlZ2V4OworCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIFN0cmluZ1JlZjsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgU21hbGxWZWN0b3JJbXBsOworCisgIGNsYXNzIFJlZ2V4IHsKKyAgcHVibGljOgorICAgIGVudW0geworICAgICAgTm9GbGFncz0wLAorICAgICAgLy8vIENvbXBpbGUgZm9yIG1hdGNoaW5nIHRoYXQgaWdub3JlcyB1cHBlci9sb3dlciBjYXNlIGRpc3RpbmN0aW9ucy4KKyAgICAgIElnbm9yZUNhc2U9MSwKKyAgICAgIC8vLyBDb21waWxlIGZvciBuZXdsaW5lLXNlbnNpdGl2ZSBtYXRjaGluZy4gV2l0aCB0aGlzIGZsYWcgJ1teJyBicmFja2V0CisgICAgICAvLy8gZXhwcmVzc2lvbnMgYW5kICcuJyBuZXZlciBtYXRjaCBuZXdsaW5lLiBBIF4gYW5jaG9yIG1hdGNoZXMgdGhlCisgICAgICAvLy8gbnVsbCBzdHJpbmcgYWZ0ZXIgYW55IG5ld2xpbmUgaW4gdGhlIHN0cmluZyBpbiBhZGRpdGlvbiB0byBpdHMgbm9ybWFsCisgICAgICAvLy8gZnVuY3Rpb24sIGFuZCB0aGUgJCBhbmNob3IgbWF0Y2hlcyB0aGUgbnVsbCBzdHJpbmcgYmVmb3JlIGFueQorICAgICAgLy8vIG5ld2xpbmUgaW4gdGhlIHN0cmluZyBpbiBhZGRpdGlvbiB0byBpdHMgbm9ybWFsIGZ1bmN0aW9uLgorICAgICAgTmV3bGluZT0yLAorICAgICAgLy8vIEJ5IGRlZmF1bHQsIHRoZSBQT1NJWCBleHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb24gKEVSRSkgc3ludGF4IGlzCisgICAgICAvLy8gYXNzdW1lZC4gUGFzcyB0aGlzIGZsYWcgdG8gdHVybiBvbiBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb25zIChCUkUpCisgICAgICAvLy8gaW5zdGVhZC4KKyAgICAgIEJhc2ljUmVnZXg9NAorICAgIH07CisKKyAgICBSZWdleCgpOworICAgIC8vLyBDb21waWxlcyB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIFxwIFJlZ2V4LgorICAgIFJlZ2V4KFN0cmluZ1JlZiBSZWdleCwgdW5zaWduZWQgRmxhZ3MgPSBOb0ZsYWdzKTsKKyAgICBSZWdleChjb25zdCBSZWdleCAmKSA9IGRlbGV0ZTsKKyAgICBSZWdleCAmb3BlcmF0b3I9KFJlZ2V4IHJlZ2V4KSB7CisgICAgICBzdGQ6OnN3YXAocHJlZywgcmVnZXgucHJlZyk7CisgICAgICBzdGQ6OnN3YXAoZXJyb3IsIHJlZ2V4LmVycm9yKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgUmVnZXgoUmVnZXggJiZyZWdleCk7CisgICAgflJlZ2V4KCk7CisKKyAgICAvLy8gaXNWYWxpZCAtIHJldHVybnMgdGhlIGVycm9yIGVuY291bnRlcmVkIGR1cmluZyByZWdleCBjb21waWxhdGlvbiwgb3IKKyAgICAvLy8gbWF0Y2hpbmcsIGlmIGFueS4KKyAgICBib29sIGlzVmFsaWQoc3RkOjpzdHJpbmcgJkVycm9yKSBjb25zdDsKKworICAgIC8vLyBnZXROdW1NYXRjaGVzIC0gSW4gYSB2YWxpZCByZWdleCwgcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFyZW50aGVzaXplZAorICAgIC8vLyBtYXRjaGVzIGl0IGNvbnRhaW5zLiAgVGhlIG51bWJlciBmaWxsZWQgaW4gYnkgbWF0Y2ggd2lsbCBpbmNsdWRlIHRoaXMKKyAgICAvLy8gbWFueSBlbnRyaWVzIHBsdXMgb25lIGZvciB0aGUgd2hvbGUgcmVnZXggKGFzIGVsZW1lbnQgMCkuCisgICAgdW5zaWduZWQgZ2V0TnVtTWF0Y2hlcygpIGNvbnN0OworCisgICAgLy8vIG1hdGNoZXMgLSBNYXRjaCB0aGUgcmVnZXggYWdhaW5zdCBhIGdpdmVuIFxwIFN0cmluZy4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIE1hdGNoZXMgLSBJZiBnaXZlbiwgb24gYSBzdWNjZXNzZnVsIG1hdGNoIHRoaXMgd2lsbCBiZSBmaWxsZWQgaW4KKyAgICAvLy8gd2l0aCByZWZlcmVuY2VzIHRvIHRoZSBtYXRjaGVkIGdyb3VwIGV4cHJlc3Npb25zIChpbnNpZGUgXHAgU3RyaW5nKSwKKyAgICAvLy8gdGhlIGZpcnN0IGdyb3VwIGlzIGFsd2F5cyB0aGUgZW50aXJlIHBhdHRlcm4uCisgICAgLy8vCisgICAgLy8vIFRoaXMgcmV0dXJucyB0cnVlIG9uIGEgc3VjY2Vzc2Z1bCBtYXRjaC4KKyAgICBib29sIG1hdGNoKFN0cmluZ1JlZiBTdHJpbmcsIFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICpNYXRjaGVzID0gbnVsbHB0cik7CisKKyAgICAvLy8gc3ViIC0gUmV0dXJuIHRoZSByZXN1bHQgb2YgcmVwbGFjaW5nIHRoZSBmaXJzdCBtYXRjaCBvZiB0aGUgcmVnZXggaW4KKyAgICAvLy8gXHAgU3RyaW5nIHdpdGggdGhlIFxwIFJlcGwgc3RyaW5nLiBCYWNrcmVmZXJlbmNlcyBsaWtlICJcMCIgaW4gdGhlCisgICAgLy8vIHJlcGxhY2VtZW50IHN0cmluZyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbWF0Y2ggc3Vic3RyaW5nLgorICAgIC8vLworICAgIC8vLyBOb3RlIHRoYXQgdGhlIHJlcGxhY2VtZW50IHN0cmluZyBoYXMgYmFja3NsYXNoIGVzY2FwaW5nIHBlcmZvcm1lZCBvbgorICAgIC8vLyBpdC4gSW52YWxpZCBiYWNrcmVmZXJlbmNlcyBhcmUgaWdub3JlZCAocmVwbGFjZWQgYnkgZW1wdHkgc3RyaW5ncykuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBFcnJvciBJZiBub24tbnVsbCwgYW55IGVycm9ycyBpbiB0aGUgc3Vic3RpdHV0aW9uIChpbnZhbGlkCisgICAgLy8vIGJhY2tyZWZlcmVuY2VzLCB0cmFpbGluZyBiYWNrc2xhc2hlcykgd2lsbCBiZSByZWNvcmRlZCBhcyBhIG5vbi1lbXB0eQorICAgIC8vLyBzdHJpbmcuCisgICAgc3RkOjpzdHJpbmcgc3ViKFN0cmluZ1JlZiBSZXBsLCBTdHJpbmdSZWYgU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqRXJyb3IgPSBudWxscHRyKTsKKworICAgIC8vLyBcYnJpZWYgSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUsIF5TdHIkIGlzIGFuIGV4dGVuZGVkIHJlZ3VsYXIKKyAgICAvLy8gZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgU3RyIGFuZCBvbmx5IFN0ci4KKyAgICBzdGF0aWMgYm9vbCBpc0xpdGVyYWxFUkUoU3RyaW5nUmVmIFN0cik7CisKKyAgICAvLy8gXGJyaWVmIFR1cm4gU3RyaW5nIGludG8gYSByZWdleCBieSBlc2NhcGluZyBpdHMgc3BlY2lhbCBjaGFyYWN0ZXJzLgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBlc2NhcGUoU3RyaW5nUmVmIFN0cmluZyk7CisKKyAgcHJpdmF0ZToKKyAgICBzdHJ1Y3QgbGx2bV9yZWdleCAqcHJlZzsKKyAgICBpbnQgZXJyb3I7CisgIH07Cit9CisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfUkVHRVhfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JlZ2lzdHJ5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUmVnaXN0cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmZkNWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JlZ2lzdHJ5LmgKQEAgLTAsMCArMSwxNjAgQEAKKy8vPT09IFJlZ2lzdHJ5LmggLSBMaW5rZXItc3VwcG9ydGVkIHBsdWdpbiByZWdpc3RyaWVzIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVmaW5lcyBhIHJlZ2lzdHJ5IHRlbXBsYXRlIGZvciBkaXNjb3ZlcmluZyBwbHVnZ2FibGUgbW9kdWxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9SRUdJU1RSWV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9SRUdJU1RSWV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EeW5hbWljTGlicmFyeS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworICAvLy8gQSBzaW1wbGUgcmVnaXN0cnkgZW50cnkgd2hpY2ggcHJvdmlkZXMgb25seSBhIG5hbWUsIGRlc2NyaXB0aW9uLCBhbmQKKyAgLy8vIG5vLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgY2xhc3MgU2ltcGxlUmVnaXN0cnlFbnRyeSB7CisgICAgU3RyaW5nUmVmIE5hbWUsIERlc2M7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+ICgqQ3RvcikoKTsKKworICBwdWJsaWM6CisgICAgU2ltcGxlUmVnaXN0cnlFbnRyeShTdHJpbmdSZWYgTiwgU3RyaW5nUmVmIEQsIHN0ZDo6dW5pcXVlX3B0cjxUPiAoKkMpKCkpCisgICAgICAgIDogTmFtZShOKSwgRGVzYyhEKSwgQ3RvcihDKSB7fQorCisgICAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisgICAgU3RyaW5nUmVmIGdldERlc2MoKSBjb25zdCB7IHJldHVybiBEZXNjOyB9CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IGluc3RhbnRpYXRlKCkgY29uc3QgeyByZXR1cm4gQ3RvcigpOyB9CisgIH07CisKKyAgLy8vIEEgZ2xvYmFsIHJlZ2lzdHJ5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBzdGF0aWMgY29uc3RydWN0b3JzIHRvIG1ha2UKKyAgLy8vIHBsdWdnYWJsZSBjb21wb25lbnRzIChsaWtlIHRhcmdldHMgb3IgZ2FyYmFnZSBjb2xsZWN0b3JzKSAianVzdCB3b3JrIiB3aGVuCisgIC8vLyBsaW5rZWQgd2l0aCBhbiBleGVjdXRhYmxlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgY2xhc3MgUmVnaXN0cnkgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBUIHR5cGU7CisgICAgdHlwZWRlZiBTaW1wbGVSZWdpc3RyeUVudHJ5PFQ+IGVudHJ5OworCisgICAgY2xhc3Mgbm9kZTsKKyAgICBjbGFzcyBpdGVyYXRvcjsKKworICBwcml2YXRlOgorICAgIFJlZ2lzdHJ5KCkgPSBkZWxldGU7CisKKyAgICBmcmllbmQgY2xhc3Mgbm9kZTsKKyAgICBzdGF0aWMgbm9kZSAqSGVhZCwgKlRhaWw7CisKKyAgcHVibGljOgorICAgIC8vLyBOb2RlIGluIGxpbmtlZCBsaXN0IG9mIGVudHJpZXMuCisgICAgLy8vCisgICAgY2xhc3Mgbm9kZSB7CisgICAgICBmcmllbmQgY2xhc3MgaXRlcmF0b3I7CisgICAgICBmcmllbmQgUmVnaXN0cnk8VD47CisKKyAgICAgIG5vZGUgKk5leHQ7CisgICAgICBjb25zdCBlbnRyeSYgVmFsOworCisgICAgcHVibGljOgorICAgICAgbm9kZShjb25zdCBlbnRyeSAmVikgOiBOZXh0KG51bGxwdHIpLCBWYWwoVikge30KKyAgICB9OworCisgICAgLy8vIEFkZCBhIG5vZGUgdG8gdGhlIFJlZ2lzdHJ5OiB0aGlzIGlzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgcGx1Z2luIGFuZAorICAgIC8vLyB0aGUgZXhlY3V0YWJsZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBmdW5jdGlvbiBpcyBleHBvcnRlZCBieSB0aGUgZXhlY3V0YWJsZSBhbmQgY2FsbGVkIGJ5IHRoZSBwbHVnaW4gdG8KKyAgICAvLy8gYWRkIGEgbm9kZSB0byB0aGUgZXhlY3V0YWJsZSdzIHJlZ2lzdHJ5LiBUaGVyZWZvcmUgaXQncyBub3QgZGVmaW5lZCBoZXJlCisgICAgLy8vIHRvIGF2b2lkIGl0IGJlaW5nIGluc3RhbnRpYXRlZCBpbiB0aGUgcGx1Z2luIGFuZCBpcyBpbnN0ZWFkIGRlZmluZWQgaW4KKyAgICAvLy8gdGhlIGV4ZWN1dGFibGUgKHNlZSBMTFZNX0lOU1RBTlRJQVRFX1JFR0lTVFJZIGJlbG93KS4KKyAgICBzdGF0aWMgdm9pZCBhZGRfbm9kZShub2RlICpOKTsKKworICAgIC8vLyBJdGVyYXRvcnMgZm9yIHJlZ2lzdHJ5IGVudHJpZXMuCisgICAgLy8vCisgICAgY2xhc3MgaXRlcmF0b3IgeworICAgICAgY29uc3Qgbm9kZSAqQ3VyOworCisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQgaXRlcmF0b3IoY29uc3Qgbm9kZSAqTikgOiBDdXIoTikge30KKworICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yICZUaGF0KSBjb25zdCB7IHJldHVybiBDdXIgPT0gVGhhdC5DdXI7IH0KKyAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciAmVGhhdCkgY29uc3QgeyByZXR1cm4gQ3VyICE9IFRoYXQuQ3VyOyB9CisgICAgICBpdGVyYXRvciAmb3BlcmF0b3IrKygpIHsgQ3VyID0gQ3VyLT5OZXh0OyByZXR1cm4gKnRoaXM7IH0KKyAgICAgIGNvbnN0IGVudHJ5ICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBDdXItPlZhbDsgfQorICAgICAgY29uc3QgZW50cnkgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmQ3VyLT5WYWw7IH0KKyAgICB9OworCisgICAgLy8gYmVnaW4gaXMgbm90IGRlZmluZWQgaGVyZSBpbiBvcmRlciB0byBhdm9pZCB1c2FnZSBvZiBhbiB1bmRlZmluZWQgc3RhdGljCisgICAgLy8gZGF0YSBtZW1iZXIsIGluc3RlYWQgaXQncyBpbnN0YW50aWF0ZWQgYnkgTExWTV9JTlNUQU5USUFURV9SRUdJU1RSWS4KKyAgICBzdGF0aWMgaXRlcmF0b3IgYmVnaW4oKTsKKyAgICBzdGF0aWMgaXRlcmF0b3IgZW5kKCkgICB7IHJldHVybiBpdGVyYXRvcihudWxscHRyKTsgfQorCisgICAgc3RhdGljIGl0ZXJhdG9yX3JhbmdlPGl0ZXJhdG9yPiBlbnRyaWVzKCkgeworICAgICAgcmV0dXJuIG1ha2VfcmFuZ2UoYmVnaW4oKSwgZW5kKCkpOworICAgIH0KKworICAgIC8vLyBBIHN0YXRpYyByZWdpc3RyYXRpb24gdGVtcGxhdGUuIFVzZSBsaWtlIHN1Y2g6CisgICAgLy8vCisgICAgLy8vICAgUmVnaXN0cnk8Q29sbGVjdG9yPjo6QWRkPEZhbmN5R0M+CisgICAgLy8vICAgWCgiZmFuY3ktZ2MiLCAiTmV3ZmFuZ2xlZCBnYXJiYWdlIGNvbGxlY3Rvci4iKTsKKyAgICAvLy8KKyAgICAvLy8gVXNlIG9mIHRoaXMgdGVtcGxhdGUgcmVxdWlyZXMgdGhhdDoKKyAgICAvLy8KKyAgICAvLy8gIDEuIFRoZSByZWdpc3RlcmVkIHN1YmNsYXNzIGhhcyBhIGRlZmF1bHQgY29uc3RydWN0b3IuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFY+CisgICAgY2xhc3MgQWRkIHsKKyAgICAgIGVudHJ5IEVudHJ5OworICAgICAgbm9kZSBOb2RlOworCisgICAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFQ+IEN0b3JGbigpIHsgcmV0dXJuIG1ha2VfdW5pcXVlPFY+KCk7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIEFkZChTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIERlc2MpCisgICAgICAgICAgOiBFbnRyeShOYW1lLCBEZXNjLCBDdG9yRm4pLCBOb2RlKEVudHJ5KSB7CisgICAgICAgIGFkZF9ub2RlKCZOb2RlKTsKKyAgICAgIH0KKyAgICB9OworICB9OworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworLy8vIEluc3RhbnRpYXRlIGEgcmVnaXN0cnkgY2xhc3MuCisvLy8KKy8vLyBUaGlzIHByb3ZpZGVzIHRlbXBsYXRlIGRlZmluaXRpb25zIG9mIGFkZF9ub2RlLCBiZWdpbiwgYW5kIHRoZSBIZWFkIGFuZCBUYWlsCisvLy8gcG9pbnRlcnMsIHRoZW4gZXhwbGljaXRseSBpbnN0YW50aWF0ZXMgdGhlbS4gV2UgY291bGQgZXhwbGljaXRseSBzcGVjaWFsaXplCisvLy8gdGhlbSwgaW5zdGVhZCBvZiB0aGUgdHdvLXN0ZXAgcHJvY2VzcyBvZiBkZWZpbmUgdGhlbiBpbnN0YW50aWF0ZSwgYnV0CisvLy8gc3RyaWN0bHkgc3BlYWtpbmcgdGhhdCdzIG5vdCBhbGxvd2VkIGJ5IHRoZSBDKysgc3RhbmRhcmQgKHdlIHdvdWxkIG5lZWQgdG8KKy8vLyBoYXZlIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGRlY2xhcmF0aW9ucyBpbiBhbGwgdHJhbnNsYXRpb24gdW5pdHMgd2hlcmUgdGhlCisvLy8gc3BlY2lhbGl6YXRpb24gaXMgdXNlZCkgc28gd2UgZG9uJ3QuCisjZGVmaW5lIExMVk1fSU5TVEFOVElBVEVfUkVHSVNUUlkoUkVHSVNUUllfQ0xBU1MpIFwKKyAgbmFtZXNwYWNlIGxsdm0geyBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHR5cGVuYW1lIFJlZ2lzdHJ5PFQ+Ojpub2RlICpSZWdpc3RyeTxUPjo6SGVhZCA9IG51bGxwdHI7XAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB0eXBlbmFtZSBSZWdpc3RyeTxUPjo6bm9kZSAqUmVnaXN0cnk8VD46OlRhaWwgPSBudWxscHRyO1wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gXAorICB2b2lkIFJlZ2lzdHJ5PFQ+OjphZGRfbm9kZSh0eXBlbmFtZSBSZWdpc3RyeTxUPjo6bm9kZSAqTikgeyBcCisgICAgaWYgKFRhaWwpIFwKKyAgICAgIFRhaWwtPk5leHQgPSBOOyBcCisgICAgZWxzZSBcCisgICAgICBIZWFkID0gTjsgXAorICAgIFRhaWwgPSBOOyBcCisgIH0gXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB0eXBlbmFtZSBSZWdpc3RyeTxUPjo6aXRlcmF0b3IgUmVnaXN0cnk8VD46OmJlZ2luKCkgeyBcCisgICAgcmV0dXJuIGl0ZXJhdG9yKEhlYWQpOyBcCisgIH0gXAorICB0ZW1wbGF0ZSBSRUdJU1RSWV9DTEFTUzo6bm9kZSAqUmVnaXN0cnk8UkVHSVNUUllfQ0xBU1M6OnR5cGU+OjpIZWFkOyBcCisgIHRlbXBsYXRlIFJFR0lTVFJZX0NMQVNTOjpub2RlICpSZWdpc3RyeTxSRUdJU1RSWV9DTEFTUzo6dHlwZT46OlRhaWw7IFwKKyAgdGVtcGxhdGUgXAorICB2b2lkIFJlZ2lzdHJ5PFJFR0lTVFJZX0NMQVNTOjp0eXBlPjo6YWRkX25vZGUoUkVHSVNUUllfQ0xBU1M6Om5vZGUqKTsgXAorICB0ZW1wbGF0ZSBSRUdJU1RSWV9DTEFTUzo6aXRlcmF0b3IgUmVnaXN0cnk8UkVHSVNUUllfQ0xBU1M6OnR5cGU+OjpiZWdpbigpOyBcCisgIH0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9SRUdJU1RSWV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUmV2ZXJzZUl0ZXJhdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JldmVyc2VJdGVyYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTAyMzhkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JldmVyc2VJdGVyYXRpb24uaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIExMVk1fU1VQUE9SVF9SRVZFUlNFSVRFUkFUSU9OX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1JFVkVSU0VJVEVSQVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9Db25maWcvYWJpLWJyZWFraW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BvaW50ZXJMaWtlVHlwZVRyYWl0cy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlPGNsYXNzIFQgPSB2b2lkICo+Citib29sIHNob3VsZFJldmVyc2VJdGVyYXRlKCkgeworI2lmIExMVk1fRU5BQkxFX1JFVkVSU0VfSVRFUkFUSU9OCisgIHJldHVybiBkZXRhaWw6OklzUG9pbnRlckxpa2U8VD46OnZhbHVlOworI2Vsc2UKKyAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NIQTEuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TSEExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjNjBhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TSEExLmgKQEAgLTAsMCArMSw4OSBAQAorLy89PS0gU0hBMS5oIC0gU0hBMSBpbXBsZW1lbnRhdGlvbiBmb3IgTExWTSAgICAgICAgICAgICAgICAgICAgIC0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoaXMgY29kZSBpcyB0YWtlbiBmcm9tIHB1YmxpYyBkb21haW4KKy8vIChodHRwOi8vb2F1dGguZ29vZ2xlY29kZS5jb20vc3ZuL2NvZGUvYy9saWJvYXV0aC9zcmMvc2hhMS5jKQorLy8gYW5kIG1vZGlmaWVkIGJ5IHdyYXBwaW5nIGl0IGluIGEgQysrIGludGVyZmFjZSBmb3IgTExWTSwKKy8vIGFuZCByZW1vdmluZyB1bm5lY2Vzc2FyeSBjb2RlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1NIQTFfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfU0hBMV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0gewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEFycmF5UmVmOworY2xhc3MgU3RyaW5nUmVmOworCisvLy8gQSBjbGFzcyB0aGF0IHdyYXAgdGhlIFNIQTEgYWxnb3JpdGhtLgorY2xhc3MgU0hBMSB7CitwdWJsaWM6CisgIFNIQTEoKSB7IGluaXQoKTsgfQorCisgIC8vLyBSZWluaXRpYWxpemUgdGhlIGludGVybmFsIHN0YXRlCisgIHZvaWQgaW5pdCgpOworCisgIC8vLyBEaWdlc3QgbW9yZSBkYXRhLgorICB2b2lkIHVwZGF0ZShBcnJheVJlZjx1aW50OF90PiBEYXRhKTsKKworICAvLy8gRGlnZXN0IG1vcmUgZGF0YS4KKyAgdm9pZCB1cGRhdGUoU3RyaW5nUmVmIFN0cikgeworICAgIHVwZGF0ZShBcnJheVJlZjx1aW50OF90PigodWludDhfdCAqKWNvbnN0X2Nhc3Q8Y2hhciAqPihTdHIuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyLnNpemUoKSkpOworICB9CisKKyAgLy8vIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCByYXcgMTYwLWJpdHMgU0hBMSBmb3IgdGhlIGRpZ2VzdGVkIGRhdGEKKyAgLy8vIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gaW5pdCgpLiBUaGlzIGNhbGwgd2lsbCBhZGQgZGF0YSB0byB0aGUgaW50ZXJuYWwKKyAgLy8vIHN0YXRlIGFuZCBhcyBzdWNoIGlzIG5vdCBzdWl0ZWQgZm9yIGdldHRpbmcgYW4gaW50ZXJtZWRpYXRlIHJlc3VsdAorICAvLy8gKHNlZSByZXN1bHQoKSkuCisgIFN0cmluZ1JlZiBmaW5hbCgpOworCisgIC8vLyBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgcmF3IDE2MC1iaXRzIFNIQTEgZm9yIHRoZSBkaWdlc3RlZCBkYXRhCisgIC8vLyBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIGluaXQoKS4gVGhpcyBpcyBzdWl0YWJsZSBmb3IgZ2V0dGluZyB0aGUgU0hBMSBhdAorICAvLy8gYW55IHRpbWUgd2l0aG91dCBpbnZhbGlkYXRpbmcgdGhlIGludGVybmFsIHN0YXRlIHNvIHRoYXQgbW9yZSBjYWxscyBjYW4gYmUKKyAgLy8vIG1hZGUgaW50byB1cGRhdGUuCisgIFN0cmluZ1JlZiByZXN1bHQoKTsKKworICAvLy8gUmV0dXJucyBhIHJhdyAxNjAtYml0IFNIQTEgaGFzaCBmb3IgdGhlIGdpdmVuIGRhdGEuCisgIHN0YXRpYyBzdGQ6OmFycmF5PHVpbnQ4X3QsIDIwPiBoYXNoKEFycmF5UmVmPHVpbnQ4X3Q+IERhdGEpOworCitwcml2YXRlOgorICAvLy8gRGVmaW5lIHNvbWUgY29uc3RhbnRzLgorICAvLy8gInN0YXRpYyBjb25zdGV4cHIiIHdvdWxkIGJlIGNsZWFuZXIgYnV0IE1TVkMgZG9lcyBub3Qgc3VwcG9ydCBpdCB5ZXQuCisgIGVudW0geyBCTE9DS19MRU5HVEggPSA2NCB9OworICBlbnVtIHsgSEFTSF9MRU5HVEggPSAyMCB9OworCisgIC8vIEludGVybmFsIFN0YXRlCisgIHN0cnVjdCB7CisgICAgdW5pb24geworICAgICAgdWludDhfdCBDW0JMT0NLX0xFTkdUSF07CisgICAgICB1aW50MzJfdCBMW0JMT0NLX0xFTkdUSCAvIDRdOworICAgIH0gQnVmZmVyOworICAgIHVpbnQzMl90IFN0YXRlW0hBU0hfTEVOR1RIIC8gNF07CisgICAgdWludDMyX3QgQnl0ZUNvdW50OworICAgIHVpbnQ4X3QgQnVmZmVyT2Zmc2V0OworICB9IEludGVybmFsU3RhdGU7CisKKyAgLy8gSW50ZXJuYWwgY29weSBvZiB0aGUgaGFzaCwgcG9wdWxhdGVkIGFuZCBhY2Nlc3NlZCBvbiBjYWxscyB0byByZXN1bHQoKQorICB1aW50MzJfdCBIYXNoUmVzdWx0W0hBU0hfTEVOR1RIIC8gNF07CisKKyAgLy8gSGVscGVyCisgIHZvaWQgd3JpdGVieXRlKHVpbnQ4X3QgZGF0YSk7CisgIHZvaWQgaGFzaEJsb2NrKCk7CisgIHZvaWQgYWRkVW5jb3VudGVkKHVpbnQ4X3QgZGF0YSk7CisgIHZvaWQgcGFkKCk7Cit9OworCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TTUxvYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NNTG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI4YmU1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TTUxvYy5oCkBAIC0wLDAgKzEsNjUgQEAKKy8vPT09LSBTTUxvYy5oIC0gU291cmNlIGxvY2F0aW9uIGZvciB1c2Ugd2l0aCBkaWFnbm9zdGljcyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBTTUxvYyBjbGFzcy4gIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIGEgbG9jYXRpb24gaW4KKy8vIHNvdXJjZSBjb2RlIGZvciB1c2UgaW4gZGlhZ25vc3RpY3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfU01MT0NfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfU01MT0NfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFJlcHJlc2VudHMgYSBsb2NhdGlvbiBpbiBzb3VyY2UgY29kZS4KK2NsYXNzIFNNTG9jIHsKKyAgY29uc3QgY2hhciAqUHRyID0gbnVsbHB0cjsKKworcHVibGljOgorICBTTUxvYygpID0gZGVmYXVsdDsKKworICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBQdHIgIT0gbnVsbHB0cjsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTTUxvYyAmUkhTKSBjb25zdCB7IHJldHVybiBSSFMuUHRyID09IFB0cjsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgU01Mb2MgJlJIUykgY29uc3QgeyByZXR1cm4gUkhTLlB0ciAhPSBQdHI7IH0KKworICBjb25zdCBjaGFyICpnZXRQb2ludGVyKCkgY29uc3QgeyByZXR1cm4gUHRyOyB9CisKKyAgc3RhdGljIFNNTG9jIGdldEZyb21Qb2ludGVyKGNvbnN0IGNoYXIgKlB0cikgeworICAgIFNNTG9jIEw7CisgICAgTC5QdHIgPSBQdHI7CisgICAgcmV0dXJuIEw7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgcmFuZ2UgaW4gc291cmNlIGNvZGUuCisvLy8KKy8vLyBTTVJhbmdlIGlzIGltcGxlbWVudGVkIHVzaW5nIGEgaGFsZi1vcGVuIHJhbmdlLCBhcyBpcyB0aGUgY29udmVudGlvbiBpbiBDKysuCisvLy8gSW4gdGhlIHN0cmluZyAiYWJjIiwgdGhlIHJhbmdlICgxLDNdIHJlcHJlc2VudHMgdGhlIHN1YnN0cmluZyAiYmMiLCBhbmQgdGhlCisvLy8gcmFuZ2UgKDIsMl0gcmVwcmVzZW50cyBhbiBlbXB0eSByYW5nZSBiZXR3ZWVuIHRoZSBjaGFyYWN0ZXJzICJiIiBhbmQgImMiLgorY2xhc3MgU01SYW5nZSB7CitwdWJsaWM6CisgIFNNTG9jIFN0YXJ0LCBFbmQ7CisKKyAgU01SYW5nZSgpID0gZGVmYXVsdDsKKyAgU01SYW5nZShOb25lVHlwZSkge30KKyAgU01SYW5nZShTTUxvYyBTdCwgU01Mb2MgRW4pIDogU3RhcnQoU3QpLCBFbmQoRW4pIHsKKyAgICBhc3NlcnQoU3RhcnQuaXNWYWxpZCgpID09IEVuZC5pc1ZhbGlkKCkgJiYKKyAgICAgICAgICAgIlN0YXJ0IGFuZCBlbmQgc2hvdWxkIGVpdGhlciBib3RoIGJlIHZhbGlkIG9yIGJvdGggYmUgaW52YWxpZCEiKTsKKyAgfQorCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIFN0YXJ0LmlzVmFsaWQoKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9TTUxPQ19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU2F2ZUFuZFJlc3RvcmUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TYXZlQW5kUmVzdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTU0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU2F2ZUFuZFJlc3RvcmUuaApAQCAtMCwwICsxLDQ5IEBACisvLz09PS0tIFNhdmVBbmRSZXN0b3JlLmggLSBVdGlsaXR5ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgcHJvdmlkZXMgdXRpbGl0eSBjbGFzc2VzIHRoYXQgdXNlIFJBSUkgdG8gc2F2ZSBhbmQgcmVzdG9yZQorLy8vIHZhbHVlcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfU0FWRUFORFJFU1RPUkVfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfU0FWRUFORFJFU1RPUkVfSAorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBIHV0aWxpdHkgY2xhc3MgdGhhdCB1c2VzIFJBSUkgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgU2F2ZUFuZFJlc3RvcmUgeworICBTYXZlQW5kUmVzdG9yZShUICZYKSA6IFgoWCksIE9sZFZhbHVlKFgpIHt9CisgIFNhdmVBbmRSZXN0b3JlKFQgJlgsIGNvbnN0IFQgJk5ld1ZhbHVlKSA6IFgoWCksIE9sZFZhbHVlKFgpIHsKKyAgICBYID0gTmV3VmFsdWU7CisgIH0KKyAgflNhdmVBbmRSZXN0b3JlKCkgeyBYID0gT2xkVmFsdWU7IH0KKyAgVCBnZXQoKSB7IHJldHVybiBPbGRWYWx1ZTsgfQorCitwcml2YXRlOgorICBUICZYOworICBUIE9sZFZhbHVlOworfTsKKworLy8vIFNpbWlsYXIgdG8gXGMgU2F2ZUFuZFJlc3RvcmUuICBPcGVyYXRlcyBvbmx5IG9uIGJvb2xzOyB0aGUgb2xkIHZhbHVlIG9mIGEKKy8vLyB2YXJpYWJsZSBpcyBzYXZlZCwgYW5kIGR1cmluZyB0aGUgZHN0b3IgdGhlIG9sZCB2YWx1ZSBpcyBvcidlZCB3aXRoIHRoZSBuZXcKKy8vLyB2YWx1ZS4KK3N0cnVjdCBTYXZlT3IgeworICBTYXZlT3IoYm9vbCAmWCkgOiBYKFgpLCBPbGRWYWx1ZShYKSB7IFggPSBmYWxzZTsgfQorICB+U2F2ZU9yKCkgeyBYIHw9IE9sZFZhbHVlOyB9CisKK3ByaXZhdGU6CisgIGJvb2wgJlg7CisgIGNvbnN0IGJvb2wgT2xkVmFsdWU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NjYWxlZE51bWJlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NjYWxlZE51bWJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYmRiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU2NhbGVkTnVtYmVyLmgKQEAgLTAsMCArMSw4OTcgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvU2NhbGVkTnVtYmVyLmggLSBTdXBwb3J0IGZvciBzY2FsZWQgbnVtYmVycyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyAoYW5kIGEgY2xhc3MpIHVzZWZ1bCBmb3Igd29ya2luZyB3aXRoIHNjYWxlZAorLy8gbnVtYmVycyAtLSBpbiBwYXJ0aWN1bGFyLCBwYWlycyBvZiBpbnRlZ2VycyB3aGVyZSBvbmUgcmVwcmVzZW50cyBkaWdpdHMgYW5kCisvLyBhbm90aGVyIHJlcHJlc2VudHMgYSBzY2FsZS4gIFRoZSBmdW5jdGlvbnMgYXJlIGhlbHBlcnMgYW5kIGxpdmUgaW4gdGhlCisvLyBuYW1lc3BhY2UgU2NhbGVkTnVtYmVycy4gIFRoZSBjbGFzcyBTY2FsZWROdW1iZXIgaXMgdXNlZnVsIGZvciBtb2RlbGxpbmcKKy8vIGNlcnRhaW4gY29zdCBtZXRyaWNzIHRoYXQgbmVlZCBzaW1wbGUsIGludGVnZXItbGlrZSBzZW1hbnRpY3MgdGhhdCBhcmUgZWFzeQorLy8gdG8gcmVhc29uIGFib3V0LgorLy8KKy8vIFRoZXNlIG1pZ2h0IHJlbWluZCB5b3Ugb2Ygc29mdC1mbG9hdHMuICBJZiB5b3Ugd2FudCBvbmUgb2YgdGhvc2UsIHlvdSdyZSBpbgorLy8gdGhlIHdyb25nIHBsYWNlLiAgTG9vayBhdCBpbmNsdWRlL2xsdm0vQURUL0FQRmxvYXQuaCBpbnN0ZWFkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1NDQUxFRE5VTUJFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9TQ0FMRUROVU1CRVJfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBTY2FsZWROdW1iZXJzIHsKKworLy8vIFxicmllZiBNYXhpbXVtIHNjYWxlOyBzYW1lIGFzIEFQRmxvYXQgZm9yIGVhc3kgZGVidWcgcHJpbnRpbmcuCitjb25zdCBpbnQzMl90IE1heFNjYWxlID0gMTYzODM7CisKKy8vLyBcYnJpZWYgTWF4aW11bSBzY2FsZTsgc2FtZSBhcyBBUEZsb2F0IGZvciBlYXN5IGRlYnVnIHByaW50aW5nLgorY29uc3QgaW50MzJfdCBNaW5TY2FsZSA9IC0xNjM4MjsKKworLy8vIFxicmllZiBHZXQgdGhlIHdpZHRoIG9mIGEgbnVtYmVyLgordGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+IGlubGluZSBpbnQgZ2V0V2lkdGgoKSB7IHJldHVybiBzaXplb2YoRGlnaXRzVCkgKiA4OyB9CisKKy8vLyBcYnJpZWYgQ29uZGl0aW9uYWxseSByb3VuZCB1cCBhIHNjYWxlZCBudW1iZXIuCisvLy8KKy8vLyBHaXZlbiBcYyBEaWdpdHMgYW5kIFxjIFNjYWxlLCByb3VuZCB1cCBpZmYgXGMgU2hvdWxkUm91bmQgaXMgXGMgdHJ1ZS4KKy8vLyBBbHdheXMgcmV0dXJucyBcYyBTY2FsZSB1bmxlc3MgdGhlcmUncyBhbiBvdmVyZmxvdywgaW4gd2hpY2ggY2FzZSBpdAorLy8vIHJldHVybnMgXGMgMStTY2FsZS4KKy8vLworLy8vIFxwcmUgYWRkaW5nIDEgdG8gXGMgU2NhbGUgd2lsbCBub3Qgb3ZlcmZsb3cgSU5UMTZfTUFYLgordGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+CitpbmxpbmUgc3RkOjpwYWlyPERpZ2l0c1QsIGludDE2X3Q+IGdldFJvdW5kZWQoRGlnaXRzVCBEaWdpdHMsIGludDE2X3QgU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRSb3VuZCkgeworICBzdGF0aWNfYXNzZXJ0KCFzdGQ6Om51bWVyaWNfbGltaXRzPERpZ2l0c1Q+Ojppc19zaWduZWQsICJleHBlY3RlZCB1bnNpZ25lZCIpOworCisgIGlmIChTaG91bGRSb3VuZCkKKyAgICBpZiAoISsrRGlnaXRzKQorICAgICAgLy8gT3ZlcmZsb3cuCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoRGlnaXRzVCgxKSA8PCAoZ2V0V2lkdGg8RGlnaXRzVD4oKSAtIDEpLCBTY2FsZSArIDEpOworICByZXR1cm4gc3RkOjptYWtlX3BhaXIoRGlnaXRzLCBTY2FsZSk7Cit9CisKKy8vLyBcYnJpZWYgQ29udmVuaWVuY2UgaGVscGVyIGZvciAzMi1iaXQgcm91bmRpbmcuCitpbmxpbmUgc3RkOjpwYWlyPHVpbnQzMl90LCBpbnQxNl90PiBnZXRSb3VuZGVkMzIodWludDMyX3QgRGlnaXRzLCBpbnQxNl90IFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkUm91bmQpIHsKKyAgcmV0dXJuIGdldFJvdW5kZWQoRGlnaXRzLCBTY2FsZSwgU2hvdWxkUm91bmQpOworfQorCisvLy8gXGJyaWVmIENvbnZlbmllbmNlIGhlbHBlciBmb3IgNjQtYml0IHJvdW5kaW5nLgoraW5saW5lIHN0ZDo6cGFpcjx1aW50NjRfdCwgaW50MTZfdD4gZ2V0Um91bmRlZDY0KHVpbnQ2NF90IERpZ2l0cywgaW50MTZfdCBTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZFJvdW5kKSB7CisgIHJldHVybiBnZXRSb3VuZGVkKERpZ2l0cywgU2NhbGUsIFNob3VsZFJvdW5kKTsKK30KKworLy8vIFxicmllZiBBZGp1c3QgYSA2NC1iaXQgc2NhbGVkIG51bWJlciBkb3duIHRvIHRoZSBhcHByb3ByaWF0ZSB3aWR0aC4KKy8vLworLy8vIFxwcmUgQWRkaW5nIDY0IHRvIFxjIFNjYWxlIHdpbGwgbm90IG92ZXJmbG93IElOVDE2X01BWC4KK3RlbXBsYXRlIDxjbGFzcyBEaWdpdHNUPgoraW5saW5lIHN0ZDo6cGFpcjxEaWdpdHNULCBpbnQxNl90PiBnZXRBZGp1c3RlZCh1aW50NjRfdCBEaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgU2NhbGUgPSAwKSB7CisgIHN0YXRpY19hc3NlcnQoIXN0ZDo6bnVtZXJpY19saW1pdHM8RGlnaXRzVD46OmlzX3NpZ25lZCwgImV4cGVjdGVkIHVuc2lnbmVkIik7CisKKyAgY29uc3QgaW50IFdpZHRoID0gZ2V0V2lkdGg8RGlnaXRzVD4oKTsKKyAgaWYgKFdpZHRoID09IDY0IHx8IERpZ2l0cyA8PSBzdGQ6Om51bWVyaWNfbGltaXRzPERpZ2l0c1Q+OjptYXgoKSkKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoRGlnaXRzLCBTY2FsZSk7CisKKyAgLy8gU2hpZnQgcmlnaHQgYW5kIHJvdW5kLgorICBpbnQgU2hpZnQgPSA2NCAtIFdpZHRoIC0gY291bnRMZWFkaW5nWmVyb3MoRGlnaXRzKTsKKyAgcmV0dXJuIGdldFJvdW5kZWQ8RGlnaXRzVD4oRGlnaXRzID4+IFNoaWZ0LCBTY2FsZSArIFNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWdpdHMgJiAoVUlOVDY0X0MoMSkgPDwgKFNoaWZ0IC0gMSkpKTsKK30KKworLy8vIFxicmllZiBDb252ZW5pZW5jZSBoZWxwZXIgZm9yIGFkanVzdGluZyB0byAzMiBiaXRzLgoraW5saW5lIHN0ZDo6cGFpcjx1aW50MzJfdCwgaW50MTZfdD4gZ2V0QWRqdXN0ZWQzMih1aW50NjRfdCBEaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgU2NhbGUgPSAwKSB7CisgIHJldHVybiBnZXRBZGp1c3RlZDx1aW50MzJfdD4oRGlnaXRzLCBTY2FsZSk7Cit9CisKKy8vLyBcYnJpZWYgQ29udmVuaWVuY2UgaGVscGVyIGZvciBhZGp1c3RpbmcgdG8gNjQgYml0cy4KK2lubGluZSBzdGQ6OnBhaXI8dWludDY0X3QsIGludDE2X3Q+IGdldEFkanVzdGVkNjQodWludDY0X3QgRGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IFNjYWxlID0gMCkgeworICByZXR1cm4gZ2V0QWRqdXN0ZWQ8dWludDY0X3Q+KERpZ2l0cywgU2NhbGUpOworfQorCisvLy8gXGJyaWVmIE11bHRpcGx5IHR3byA2NC1iaXQgaW50ZWdlcnMgdG8gY3JlYXRlIGEgNjQtYml0IHNjYWxlZCBudW1iZXIuCisvLy8KKy8vLyBJbXBsZW1lbnRlZCB3aXRoIGZvdXIgNjQtYml0IGludGVnZXIgbXVsdGlwbGllcy4KK3N0ZDo6cGFpcjx1aW50NjRfdCwgaW50MTZfdD4gbXVsdGlwbHk2NCh1aW50NjRfdCBMSFMsIHVpbnQ2NF90IFJIUyk7CisKKy8vLyBcYnJpZWYgTXVsdGlwbHkgdHdvIDMyLWJpdCBpbnRlZ2VycyB0byBjcmVhdGUgYSAzMi1iaXQgc2NhbGVkIG51bWJlci4KKy8vLworLy8vIEltcGxlbWVudGVkIHdpdGggb25lIDY0LWJpdCBpbnRlZ2VyIG11bHRpcGx5LgordGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+CitpbmxpbmUgc3RkOjpwYWlyPERpZ2l0c1QsIGludDE2X3Q+IGdldFByb2R1Y3QoRGlnaXRzVCBMSFMsIERpZ2l0c1QgUkhTKSB7CisgIHN0YXRpY19hc3NlcnQoIXN0ZDo6bnVtZXJpY19saW1pdHM8RGlnaXRzVD46OmlzX3NpZ25lZCwgImV4cGVjdGVkIHVuc2lnbmVkIik7CisKKyAgaWYgKGdldFdpZHRoPERpZ2l0c1Q+KCkgPD0gMzIgfHwgKExIUyA8PSBVSU5UMzJfTUFYICYmIFJIUyA8PSBVSU5UMzJfTUFYKSkKKyAgICByZXR1cm4gZ2V0QWRqdXN0ZWQ8RGlnaXRzVD4odWludDY0X3QoTEhTKSAqIFJIUyk7CisKKyAgcmV0dXJuIG11bHRpcGx5NjQoTEhTLCBSSFMpOworfQorCisvLy8gXGJyaWVmIENvbnZlbmllbmNlIGhlbHBlciBmb3IgMzItYml0IHByb2R1Y3QuCitpbmxpbmUgc3RkOjpwYWlyPHVpbnQzMl90LCBpbnQxNl90PiBnZXRQcm9kdWN0MzIodWludDMyX3QgTEhTLCB1aW50MzJfdCBSSFMpIHsKKyAgcmV0dXJuIGdldFByb2R1Y3QoTEhTLCBSSFMpOworfQorCisvLy8gXGJyaWVmIENvbnZlbmllbmNlIGhlbHBlciBmb3IgNjQtYml0IHByb2R1Y3QuCitpbmxpbmUgc3RkOjpwYWlyPHVpbnQ2NF90LCBpbnQxNl90PiBnZXRQcm9kdWN0NjQodWludDY0X3QgTEhTLCB1aW50NjRfdCBSSFMpIHsKKyAgcmV0dXJuIGdldFByb2R1Y3QoTEhTLCBSSFMpOworfQorCisvLy8gXGJyaWVmIERpdmlkZSB0d28gNjQtYml0IGludGVnZXJzIHRvIGNyZWF0ZSBhIDY0LWJpdCBzY2FsZWQgbnVtYmVyLgorLy8vCisvLy8gSW1wbGVtZW50ZWQgd2l0aCBsb25nIGRpdmlzaW9uLgorLy8vCisvLy8gXHByZSBcYyBEaXZpZGVuZCBhbmQgXGMgRGl2aXNvciBhcmUgbm9uLXplcm8uCitzdGQ6OnBhaXI8dWludDY0X3QsIGludDE2X3Q+IGRpdmlkZTY0KHVpbnQ2NF90IERpdmlkZW5kLCB1aW50NjRfdCBEaXZpc29yKTsKKworLy8vIFxicmllZiBEaXZpZGUgdHdvIDMyLWJpdCBpbnRlZ2VycyB0byBjcmVhdGUgYSAzMi1iaXQgc2NhbGVkIG51bWJlci4KKy8vLworLy8vIEltcGxlbWVudGVkIHdpdGggb25lIDY0LWJpdCBpbnRlZ2VyIGRpdmlkZS9yZW1haW5kZXIgcGFpci4KKy8vLworLy8vIFxwcmUgXGMgRGl2aWRlbmQgYW5kIFxjIERpdmlzb3IgYXJlIG5vbi16ZXJvLgorc3RkOjpwYWlyPHVpbnQzMl90LCBpbnQxNl90PiBkaXZpZGUzMih1aW50MzJfdCBEaXZpZGVuZCwgdWludDMyX3QgRGl2aXNvcik7CisKKy8vLyBcYnJpZWYgRGl2aWRlIHR3byAzMi1iaXQgbnVtYmVycyB0byBjcmVhdGUgYSAzMi1iaXQgc2NhbGVkIG51bWJlci4KKy8vLworLy8vIEltcGxlbWVudGVkIHdpdGggb25lIDY0LWJpdCBpbnRlZ2VyIGRpdmlkZS9yZW1haW5kZXIgcGFpci4KKy8vLworLy8vIFJldHVybnMgXGMgKERpZ2l0c1RfTUFYLCBNYXhTY2FsZSkgZm9yIGRpdmlkZS1ieS16ZXJvICgwIGZvciAwLzApLgordGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+CitzdGQ6OnBhaXI8RGlnaXRzVCwgaW50MTZfdD4gZ2V0UXVvdGllbnQoRGlnaXRzVCBEaXZpZGVuZCwgRGlnaXRzVCBEaXZpc29yKSB7CisgIHN0YXRpY19hc3NlcnQoIXN0ZDo6bnVtZXJpY19saW1pdHM8RGlnaXRzVD46OmlzX3NpZ25lZCwgImV4cGVjdGVkIHVuc2lnbmVkIik7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKERpZ2l0c1QpID09IDQgfHwgc2l6ZW9mKERpZ2l0c1QpID09IDgsCisgICAgICAgICAgICAgICAgImV4cGVjdGVkIDMyLWJpdCBvciA2NC1iaXQgZGlnaXRzIik7CisKKyAgLy8gQ2hlY2sgZm9yIHplcm8uCisgIGlmICghRGl2aWRlbmQpCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDAsIDApOworICBpZiAoIURpdmlzb3IpCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHN0ZDo6bnVtZXJpY19saW1pdHM8RGlnaXRzVD46Om1heCgpLCBNYXhTY2FsZSk7CisKKyAgaWYgKGdldFdpZHRoPERpZ2l0c1Q+KCkgPT0gNjQpCisgICAgcmV0dXJuIGRpdmlkZTY0KERpdmlkZW5kLCBEaXZpc29yKTsKKyAgcmV0dXJuIGRpdmlkZTMyKERpdmlkZW5kLCBEaXZpc29yKTsKK30KKworLy8vIFxicmllZiBDb252ZW5pZW5jZSBoZWxwZXIgZm9yIDMyLWJpdCBxdW90aWVudC4KK2lubGluZSBzdGQ6OnBhaXI8dWludDMyX3QsIGludDE2X3Q+IGdldFF1b3RpZW50MzIodWludDMyX3QgRGl2aWRlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERpdmlzb3IpIHsKKyAgcmV0dXJuIGdldFF1b3RpZW50KERpdmlkZW5kLCBEaXZpc29yKTsKK30KKworLy8vIFxicmllZiBDb252ZW5pZW5jZSBoZWxwZXIgZm9yIDY0LWJpdCBxdW90aWVudC4KK2lubGluZSBzdGQ6OnBhaXI8dWludDY0X3QsIGludDE2X3Q+IGdldFF1b3RpZW50NjQodWludDY0X3QgRGl2aWRlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IERpdmlzb3IpIHsKKyAgcmV0dXJuIGdldFF1b3RpZW50KERpdmlkZW5kLCBEaXZpc29yKTsKK30KKworLy8vIFxicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBnZXRMZygpIGFuZCBmcmllbmRzLgorLy8vCisvLy8gUmV0dXJucyB0aGUgcm91bmRlZCBsZyBvZiBcYyBEaWdpdHMqMl5TY2FsZSBhbmQgYW4gaW50IHNwZWNpZnlpbmcgd2hldGhlcgorLy8vIHRoaXMgd2FzIHJvdW5kZWQgdXAgKDEpLCBkb3duICgtMSksIG9yIGV4YWN0ICgwKS4KKy8vLworLy8vIFJldHVybnMgXGMgSU5UMzJfTUlOIHdoZW4gXGMgRGlnaXRzIGlzIHplcm8uCit0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4KK2lubGluZSBzdGQ6OnBhaXI8aW50MzJfdCwgaW50PiBnZXRMZ0ltcGwoRGlnaXRzVCBEaWdpdHMsIGludDE2X3QgU2NhbGUpIHsKKyAgc3RhdGljX2Fzc2VydCghc3RkOjpudW1lcmljX2xpbWl0czxEaWdpdHNUPjo6aXNfc2lnbmVkLCAiZXhwZWN0ZWQgdW5zaWduZWQiKTsKKworICBpZiAoIURpZ2l0cykKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoSU5UMzJfTUlOLCAwKTsKKworICAvLyBHZXQgdGhlIGZsb29yIG9mIHRoZSBsZyBvZiBEaWdpdHMuCisgIGludDMyX3QgTG9jYWxGbG9vciA9IHNpemVvZihEaWdpdHMpICogOCAtIGNvdW50TGVhZGluZ1plcm9zKERpZ2l0cykgLSAxOworCisgIC8vIEdldCB0aGUgYWN0dWFsIGZsb29yLgorICBpbnQzMl90IEZsb29yID0gU2NhbGUgKyBMb2NhbEZsb29yOworICBpZiAoRGlnaXRzID09IFVJTlQ2NF9DKDEpIDw8IExvY2FsRmxvb3IpCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEZsb29yLCAwKTsKKworICAvLyBSb3VuZCBiYXNlZCBvbiB0aGUgbmV4dCBkaWdpdC4KKyAgYXNzZXJ0KExvY2FsRmxvb3IgPj0gMSk7CisgIGJvb2wgUm91bmQgPSBEaWdpdHMgJiBVSU5UNjRfQygxKSA8PCAoTG9jYWxGbG9vciAtIDEpOworICByZXR1cm4gc3RkOjptYWtlX3BhaXIoRmxvb3IgKyBSb3VuZCwgUm91bmQgPyAxIDogLTEpOworfQorCisvLy8gXGJyaWVmIEdldCB0aGUgbGcgKHJvdW5kZWQpIG9mIGEgc2NhbGVkIG51bWJlci4KKy8vLworLy8vIEdldCB0aGUgbGcgb2YgXGMgRGlnaXRzKjJeU2NhbGUuCisvLy8KKy8vLyBSZXR1cm5zIFxjIElOVDMyX01JTiB3aGVuIFxjIERpZ2l0cyBpcyB6ZXJvLgordGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+IGludDMyX3QgZ2V0TGcoRGlnaXRzVCBEaWdpdHMsIGludDE2X3QgU2NhbGUpIHsKKyAgcmV0dXJuIGdldExnSW1wbChEaWdpdHMsIFNjYWxlKS5maXJzdDsKK30KKworLy8vIFxicmllZiBHZXQgdGhlIGxnIGZsb29yIG9mIGEgc2NhbGVkIG51bWJlci4KKy8vLworLy8vIEdldCB0aGUgZmxvb3Igb2YgdGhlIGxnIG9mIFxjIERpZ2l0cyoyXlNjYWxlLgorLy8vCisvLy8gUmV0dXJucyBcYyBJTlQzMl9NSU4gd2hlbiBcYyBEaWdpdHMgaXMgemVyby4KK3RlbXBsYXRlIDxjbGFzcyBEaWdpdHNUPiBpbnQzMl90IGdldExnRmxvb3IoRGlnaXRzVCBEaWdpdHMsIGludDE2X3QgU2NhbGUpIHsKKyAgYXV0byBMZyA9IGdldExnSW1wbChEaWdpdHMsIFNjYWxlKTsKKyAgcmV0dXJuIExnLmZpcnN0IC0gKExnLnNlY29uZCA+IDApOworfQorCisvLy8gXGJyaWVmIEdldCB0aGUgbGcgY2VpbGluZyBvZiBhIHNjYWxlZCBudW1iZXIuCisvLy8KKy8vLyBHZXQgdGhlIGNlaWxpbmcgb2YgdGhlIGxnIG9mIFxjIERpZ2l0cyoyXlNjYWxlLgorLy8vCisvLy8gUmV0dXJucyBcYyBJTlQzMl9NSU4gd2hlbiBcYyBEaWdpdHMgaXMgemVyby4KK3RlbXBsYXRlIDxjbGFzcyBEaWdpdHNUPiBpbnQzMl90IGdldExnQ2VpbGluZyhEaWdpdHNUIERpZ2l0cywgaW50MTZfdCBTY2FsZSkgeworICBhdXRvIExnID0gZ2V0TGdJbXBsKERpZ2l0cywgU2NhbGUpOworICByZXR1cm4gTGcuZmlyc3QgKyAoTGcuc2Vjb25kIDwgMCk7Cit9CisKKy8vLyBcYnJpZWYgSW1wbGVtZW50YXRpb24gZm9yIGNvbXBhcmluZyBzY2FsZWQgbnVtYmVycy4KKy8vLworLy8vIENvbXBhcmUgdHdvIDY0LWJpdCBudW1iZXJzIHdpdGggZGlmZmVyZW50IHNjYWxlcy4gIEdpdmVuIHRoYXQgdGhlIHNjYWxlIG9mCisvLy8gXGMgTCBpcyBoaWdoZXIgdGhhbiB0aGF0IG9mIFxjIFIgYnkgXGMgU2NhbGVEaWZmLCBjb21wYXJlIHRoZW0uICBSZXR1cm4gLTEsCisvLy8gMSwgYW5kIDAgZm9yIGxlc3MgdGhhbiwgZ3JlYXRlciB0aGFuLCBhbmQgZXF1YWwsIHJlc3BlY3RpdmVseS4KKy8vLworLy8vIFxwcmUgMCA8PSBTY2FsZURpZmYgPCA2NC4KK2ludCBjb21wYXJlSW1wbCh1aW50NjRfdCBMLCB1aW50NjRfdCBSLCBpbnQgU2NhbGVEaWZmKTsKKworLy8vIFxicmllZiBDb21wYXJlIHR3byBzY2FsZWQgbnVtYmVycy4KKy8vLworLy8vIENvbXBhcmUgdHdvIHNjYWxlZCBudW1iZXJzLiAgUmV0dXJucyAwIGZvciBlcXVhbCwgLTEgZm9yIGxlc3MgdGhhbiwgYW5kIDEKKy8vLyBmb3IgZ3JlYXRlciB0aGFuLgordGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+CitpbnQgY29tcGFyZShEaWdpdHNUIExEaWdpdHMsIGludDE2X3QgTFNjYWxlLCBEaWdpdHNUIFJEaWdpdHMsIGludDE2X3QgUlNjYWxlKSB7CisgIHN0YXRpY19hc3NlcnQoIXN0ZDo6bnVtZXJpY19saW1pdHM8RGlnaXRzVD46OmlzX3NpZ25lZCwgImV4cGVjdGVkIHVuc2lnbmVkIik7CisKKyAgLy8gQ2hlY2sgZm9yIHplcm8uCisgIGlmICghTERpZ2l0cykKKyAgICByZXR1cm4gUkRpZ2l0cyA/IC0xIDogMDsKKyAgaWYgKCFSRGlnaXRzKQorICAgIHJldHVybiAxOworCisgIC8vIENoZWNrIGZvciB0aGUgc2NhbGUuICBVc2UgZ2V0TGdGbG9vciB0byBiZSBzdXJlIHRoYXQgdGhlIHNjYWxlIGRpZmZlcmVuY2UKKyAgLy8gaXMgYWx3YXlzIGxvd2VyIHRoYW4gNjQuCisgIGludDMyX3QgbGdMID0gZ2V0TGdGbG9vcihMRGlnaXRzLCBMU2NhbGUpLCBsZ1IgPSBnZXRMZ0Zsb29yKFJEaWdpdHMsIFJTY2FsZSk7CisgIGlmIChsZ0wgIT0gbGdSKQorICAgIHJldHVybiBsZ0wgPCBsZ1IgPyAtMSA6IDE7CisKKyAgLy8gQ29tcGFyZSBkaWdpdHMuCisgIGlmIChMU2NhbGUgPCBSU2NhbGUpCisgICAgcmV0dXJuIGNvbXBhcmVJbXBsKExEaWdpdHMsIFJEaWdpdHMsIFJTY2FsZSAtIExTY2FsZSk7CisKKyAgcmV0dXJuIC1jb21wYXJlSW1wbChSRGlnaXRzLCBMRGlnaXRzLCBMU2NhbGUgLSBSU2NhbGUpOworfQorCisvLy8gXGJyaWVmIE1hdGNoIHNjYWxlcyBvZiB0d28gbnVtYmVycy4KKy8vLworLy8vIEdpdmVuIHR3byBzY2FsZWQgbnVtYmVycywgbWF0Y2ggdXAgdGhlaXIgc2NhbGVzLiAgQ2hhbmdlIHRoZSBkaWdpdHMgYW5kCisvLy8gc2NhbGVzIGluIHBsYWNlLiAgU2hpZnQgdGhlIGRpZ2l0cyBhcyBuZWNlc3NhcnkgdG8gZm9ybSBlcXVpdmFsZW50IG51bWJlcnMsCisvLy8gbG9zaW5nIHByZWNpc2lvbiBvbmx5IHdoZW4gbmVjZXNzYXJ5LgorLy8vCisvLy8gSWYgdGhlIG91dHB1dCB2YWx1ZSBvZiBcYyBMRGlnaXRzIChcYyBSRGlnaXRzKSBpcyBcYyAwLCB0aGUgb3V0cHV0IHZhbHVlIG9mCisvLy8gXGMgTFNjYWxlIChcYyBSU2NhbGUpIGlzIHVuc3BlY2lmaWVkLgorLy8vCisvLy8gQXMgYSBjb252ZW5pZW5jZSwgcmV0dXJucyB0aGUgbWF0Y2hpbmcgc2NhbGUuICBJZiB0aGUgb3V0cHV0IHZhbHVlIG9mIG9uZQorLy8vIG51bWJlciBpcyB6ZXJvLCByZXR1cm5zIHRoZSBzY2FsZSBvZiB0aGUgb3RoZXIuICBJZiBib3RoIGFyZSB6ZXJvLCB3aGljaAorLy8vIHNjYWxlIGlzIHJldHVybmVkIGlzIHVuc3BlY2lmaWVkLgordGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+CitpbnQxNl90IG1hdGNoU2NhbGVzKERpZ2l0c1QgJkxEaWdpdHMsIGludDE2X3QgJkxTY2FsZSwgRGlnaXRzVCAmUkRpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAmUlNjYWxlKSB7CisgIHN0YXRpY19hc3NlcnQoIXN0ZDo6bnVtZXJpY19saW1pdHM8RGlnaXRzVD46OmlzX3NpZ25lZCwgImV4cGVjdGVkIHVuc2lnbmVkIik7CisKKyAgaWYgKExTY2FsZSA8IFJTY2FsZSkKKyAgICAvLyBTd2FwIGFyZ3VtZW50cy4KKyAgICByZXR1cm4gbWF0Y2hTY2FsZXMoUkRpZ2l0cywgUlNjYWxlLCBMRGlnaXRzLCBMU2NhbGUpOworICBpZiAoIUxEaWdpdHMpCisgICAgcmV0dXJuIFJTY2FsZTsKKyAgaWYgKCFSRGlnaXRzIHx8IExTY2FsZSA9PSBSU2NhbGUpCisgICAgcmV0dXJuIExTY2FsZTsKKworICAvLyBOb3cgTFNjYWxlID4gUlNjYWxlLiAgR2V0IHRoZSBkaWZmZXJlbmNlLgorICBpbnQzMl90IFNjYWxlRGlmZiA9IGludDMyX3QoTFNjYWxlKSAtIFJTY2FsZTsKKyAgaWYgKFNjYWxlRGlmZiA+PSAyICogZ2V0V2lkdGg8RGlnaXRzVD4oKSkgeworICAgIC8vIERvbid0IGJvdGhlciBzaGlmdGluZy4gIFJEaWdpdHMgd2lsbCBnZXQgemVyby1lZCBvdXQgYW55d2F5LgorICAgIFJEaWdpdHMgPSAwOworICAgIHJldHVybiBMU2NhbGU7CisgIH0KKworICAvLyBTaGlmdCBMRGlnaXRzIGxlZnQgYXMgbXVjaCBhcyBwb3NzaWJsZSwgdGhlbiBzaGlmdCBSRGlnaXRzIHJpZ2h0LgorICBpbnQzMl90IFNoaWZ0TCA9IHN0ZDo6bWluPGludDMyX3Q+KGNvdW50TGVhZGluZ1plcm9zKExEaWdpdHMpLCBTY2FsZURpZmYpOworICBhc3NlcnQoU2hpZnRMIDwgZ2V0V2lkdGg8RGlnaXRzVD4oKSAmJiAiY2FuJ3Qgc2hpZnQgbW9yZSB0aGFuIHdpZHRoIik7CisKKyAgaW50MzJfdCBTaGlmdFIgPSBTY2FsZURpZmYgLSBTaGlmdEw7CisgIGlmIChTaGlmdFIgPj0gZ2V0V2lkdGg8RGlnaXRzVD4oKSkgeworICAgIC8vIERvbid0IGJvdGhlciBzaGlmdGluZy4gIFJEaWdpdHMgd2lsbCBnZXQgemVyby1lZCBvdXQgYW55d2F5LgorICAgIFJEaWdpdHMgPSAwOworICAgIHJldHVybiBMU2NhbGU7CisgIH0KKworICBMRGlnaXRzIDw8PSBTaGlmdEw7CisgIFJEaWdpdHMgPj49IFNoaWZ0UjsKKworICBMU2NhbGUgLT0gU2hpZnRMOworICBSU2NhbGUgKz0gU2hpZnRSOworICBhc3NlcnQoTFNjYWxlID09IFJTY2FsZSAmJiAic2NhbGVzIHNob3VsZCBtYXRjaCIpOworICByZXR1cm4gTFNjYWxlOworfQorCisvLy8gXGJyaWVmIEdldCB0aGUgc3VtIG9mIHR3byBzY2FsZWQgbnVtYmVycy4KKy8vLworLy8vIEdldCB0aGUgc3VtIG9mIHR3byBzY2FsZWQgbnVtYmVycyB3aXRoIGFzIG11Y2ggcHJlY2lzaW9uIGFzIHBvc3NpYmxlLgorLy8vCisvLy8gXHByZSBBZGRpbmcgMSB0byBcYyBMU2NhbGUgKG9yIFxjIFJTY2FsZSkgd2lsbCBub3Qgb3ZlcmZsb3cgSU5UMTZfTUFYLgordGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+CitzdGQ6OnBhaXI8RGlnaXRzVCwgaW50MTZfdD4gZ2V0U3VtKERpZ2l0c1QgTERpZ2l0cywgaW50MTZfdCBMU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpZ2l0c1QgUkRpZ2l0cywgaW50MTZfdCBSU2NhbGUpIHsKKyAgc3RhdGljX2Fzc2VydCghc3RkOjpudW1lcmljX2xpbWl0czxEaWdpdHNUPjo6aXNfc2lnbmVkLCAiZXhwZWN0ZWQgdW5zaWduZWQiKTsKKworICAvLyBDaGVjayBpbnB1dHMgdXAgZnJvbnQuICBUaGlzIGlzIG9ubHkgcmVsZXZhbnQgaWYgYWRkaXRpb24gb3ZlcmZsb3dzLCBidXQKKyAgLy8gdGVzdGluZyBoZXJlIHNob3VsZCBjYXRjaCBtb3JlIGJ1Z3MuCisgIGFzc2VydChMU2NhbGUgPCBJTlQxNl9NQVggJiYgInNjYWxlIHRvbyBsYXJnZSIpOworICBhc3NlcnQoUlNjYWxlIDwgSU5UMTZfTUFYICYmICJzY2FsZSB0b28gbGFyZ2UiKTsKKworICAvLyBOb3JtYWxpemUgZGlnaXRzIHRvIG1hdGNoIHNjYWxlcy4KKyAgaW50MTZfdCBTY2FsZSA9IG1hdGNoU2NhbGVzKExEaWdpdHMsIExTY2FsZSwgUkRpZ2l0cywgUlNjYWxlKTsKKworICAvLyBDb21wdXRlIHN1bS4KKyAgRGlnaXRzVCBTdW0gPSBMRGlnaXRzICsgUkRpZ2l0czsKKyAgaWYgKFN1bSA+PSBSRGlnaXRzKQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihTdW0sIFNjYWxlKTsKKworICAvLyBBZGp1c3Qgc3VtIGFmdGVyIGFyaXRobWV0aWMgb3ZlcmZsb3cuCisgIERpZ2l0c1QgSGlnaEJpdCA9IERpZ2l0c1QoMSkgPDwgKGdldFdpZHRoPERpZ2l0c1Q+KCkgLSAxKTsKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEhpZ2hCaXQgfCBTdW0gPj4gMSwgU2NhbGUgKyAxKTsKK30KKworLy8vIFxicmllZiBDb252ZW5pZW5jZSBoZWxwZXIgZm9yIDMyLWJpdCBzdW0uCitpbmxpbmUgc3RkOjpwYWlyPHVpbnQzMl90LCBpbnQxNl90PiBnZXRTdW0zMih1aW50MzJfdCBMRGlnaXRzLCBpbnQxNl90IExTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJEaWdpdHMsIGludDE2X3QgUlNjYWxlKSB7CisgIHJldHVybiBnZXRTdW0oTERpZ2l0cywgTFNjYWxlLCBSRGlnaXRzLCBSU2NhbGUpOworfQorCisvLy8gXGJyaWVmIENvbnZlbmllbmNlIGhlbHBlciBmb3IgNjQtYml0IHN1bS4KK2lubGluZSBzdGQ6OnBhaXI8dWludDY0X3QsIGludDE2X3Q+IGdldFN1bTY0KHVpbnQ2NF90IExEaWdpdHMsIGludDE2X3QgTFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgUkRpZ2l0cywgaW50MTZfdCBSU2NhbGUpIHsKKyAgcmV0dXJuIGdldFN1bShMRGlnaXRzLCBMU2NhbGUsIFJEaWdpdHMsIFJTY2FsZSk7Cit9CisKKy8vLyBcYnJpZWYgR2V0IHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzY2FsZWQgbnVtYmVycy4KKy8vLworLy8vIEdldCBMSFMgbWludXMgUkhTIHdpdGggYXMgbXVjaCBwcmVjaXNpb24gYXMgcG9zc2libGUuCisvLy8KKy8vLyBSZXR1cm5zIFxjICgwLCAwKSBpZiB0aGUgUkhTIGlzIGxhcmdlciB0aGFuIHRoZSBMSFMuCit0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4KK3N0ZDo6cGFpcjxEaWdpdHNULCBpbnQxNl90PiBnZXREaWZmZXJlbmNlKERpZ2l0c1QgTERpZ2l0cywgaW50MTZfdCBMU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWdpdHNUIFJEaWdpdHMsIGludDE2X3QgUlNjYWxlKSB7CisgIHN0YXRpY19hc3NlcnQoIXN0ZDo6bnVtZXJpY19saW1pdHM8RGlnaXRzVD46OmlzX3NpZ25lZCwgImV4cGVjdGVkIHVuc2lnbmVkIik7CisKKyAgLy8gTm9ybWFsaXplIGRpZ2l0cyB0byBtYXRjaCBzY2FsZXMuCisgIGNvbnN0IERpZ2l0c1QgU2F2ZWRSRGlnaXRzID0gUkRpZ2l0czsKKyAgY29uc3QgaW50MTZfdCBTYXZlZFJTY2FsZSA9IFJTY2FsZTsKKyAgbWF0Y2hTY2FsZXMoTERpZ2l0cywgTFNjYWxlLCBSRGlnaXRzLCBSU2NhbGUpOworCisgIC8vIENvbXB1dGUgZGlmZmVyZW5jZS4KKyAgaWYgKExEaWdpdHMgPD0gUkRpZ2l0cykKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMCwgMCk7CisgIGlmIChSRGlnaXRzIHx8ICFTYXZlZFJEaWdpdHMpCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKExEaWdpdHMgLSBSRGlnaXRzLCBMU2NhbGUpOworCisgIC8vIENoZWNrIGlmIFJEaWdpdHMganVzdCBiYXJlbHkgbG9zdCBpdHMgbGFzdCBiaXQuICBFLmcuLCBmb3IgMzItYml0OgorICAvLworICAvLyAgIDEqMl4zMiAtIDEqMl4wID09IDB4ZmZmZmZmZmYgIT0gMSoyXjMyCisgIGNvbnN0IGF1dG8gUkxnRmxvb3IgPSBnZXRMZ0Zsb29yKFNhdmVkUkRpZ2l0cywgU2F2ZWRSU2NhbGUpOworICBpZiAoIWNvbXBhcmUoTERpZ2l0cywgTFNjYWxlLCBEaWdpdHNUKDEpLCBSTGdGbG9vciArIGdldFdpZHRoPERpZ2l0c1Q+KCkpKQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihzdGQ6Om51bWVyaWNfbGltaXRzPERpZ2l0c1Q+OjptYXgoKSwgUkxnRmxvb3IpOworCisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihMRGlnaXRzLCBMU2NhbGUpOworfQorCisvLy8gXGJyaWVmIENvbnZlbmllbmNlIGhlbHBlciBmb3IgMzItYml0IGRpZmZlcmVuY2UuCitpbmxpbmUgc3RkOjpwYWlyPHVpbnQzMl90LCBpbnQxNl90PiBnZXREaWZmZXJlbmNlMzIodWludDMyX3QgTERpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IExTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSRGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgUlNjYWxlKSB7CisgIHJldHVybiBnZXREaWZmZXJlbmNlKExEaWdpdHMsIExTY2FsZSwgUkRpZ2l0cywgUlNjYWxlKTsKK30KKworLy8vIFxicmllZiBDb252ZW5pZW5jZSBoZWxwZXIgZm9yIDY0LWJpdCBkaWZmZXJlbmNlLgoraW5saW5lIHN0ZDo6cGFpcjx1aW50NjRfdCwgaW50MTZfdD4gZ2V0RGlmZmVyZW5jZTY0KHVpbnQ2NF90IExEaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBMU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgUkRpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IFJTY2FsZSkgeworICByZXR1cm4gZ2V0RGlmZmVyZW5jZShMRGlnaXRzLCBMU2NhbGUsIFJEaWdpdHMsIFJTY2FsZSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBTY2FsZWROdW1iZXJzCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgU2NhbGVkTnVtYmVyQmFzZSB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBpbnQgRGVmYXVsdFByZWNpc2lvbiA9IDEwOworCisgIHN0YXRpYyB2b2lkIGR1bXAodWludDY0X3QgRCwgaW50MTZfdCBFLCBpbnQgV2lkdGgpOworICBzdGF0aWMgcmF3X29zdHJlYW0gJnByaW50KHJhd19vc3RyZWFtICZPUywgdWludDY0X3QgRCwgaW50MTZfdCBFLCBpbnQgV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUHJlY2lzaW9uKTsKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKHVpbnQ2NF90IEQsIGludDE2X3QgRSwgaW50IFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUHJlY2lzaW9uKTsKKyAgc3RhdGljIGludCBjb3VudExlYWRpbmdaZXJvczMyKHVpbnQzMl90IE4pIHsgcmV0dXJuIGNvdW50TGVhZGluZ1plcm9zKE4pOyB9CisgIHN0YXRpYyBpbnQgY291bnRMZWFkaW5nWmVyb3M2NCh1aW50NjRfdCBOKSB7IHJldHVybiBjb3VudExlYWRpbmdaZXJvcyhOKTsgfQorICBzdGF0aWMgdWludDY0X3QgZ2V0SGFsZih1aW50NjRfdCBOKSB7IHJldHVybiAoTiA+PiAxKSArIChOICYgMSk7IH0KKworICBzdGF0aWMgc3RkOjpwYWlyPHVpbnQ2NF90LCBib29sPiBzcGxpdFNpZ25lZChpbnQ2NF90IE4pIHsKKyAgICBpZiAoTiA+PSAwKQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKE4sIGZhbHNlKTsKKyAgICB1aW50NjRfdCBVbnNpZ25lZCA9IE4gPT0gSU5UNjRfTUlOID8gVUlOVDY0X0MoMSkgPDwgNjMgOiB1aW50NjRfdCgtTik7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFVuc2lnbmVkLCB0cnVlKTsKKyAgfQorICBzdGF0aWMgaW50NjRfdCBqb2luU2lnbmVkKHVpbnQ2NF90IFUsIGJvb2wgSXNOZWcpIHsKKyAgICBpZiAoVSA+IHVpbnQ2NF90KElOVDY0X01BWCkpCisgICAgICByZXR1cm4gSXNOZWcgPyBJTlQ2NF9NSU4gOiBJTlQ2NF9NQVg7CisgICAgcmV0dXJuIElzTmVnID8gLWludDY0X3QoVSkgOiBpbnQ2NF90KFUpOworICB9Cit9OworCisvLy8gXGJyaWVmIFNpbXBsZSByZXByZXNlbnRhdGlvbiBvZiBhIHNjYWxlZCBudW1iZXIuCisvLy8KKy8vLyBTY2FsZWROdW1iZXIgaXMgYSBudW1iZXIgcmVwcmVzZW50ZWQgYnkgZGlnaXRzIGFuZCBhIHNjYWxlLiAgSXQgdXNlcyBzaW1wbGUKKy8vLyBzYXR1cmF0aW9uIGFyaXRobWV0aWMgYW5kIGV2ZXJ5IG9wZXJhdGlvbiBpcyB3ZWxsLWRlZmluZWQgZm9yIGV2ZXJ5IHZhbHVlLgorLy8vIEl0J3Mgc29tZXdoYXQgc2ltaWxhciBpbiBiZWhhdmlvdXIgdG8gYSBzb2Z0LWZsb2F0LCBidXQgaXMgKm5vdCogYQorLy8vIHJlcGxhY2VtZW50IGZvciBvbmUuICBJZiB5b3UncmUgZG9pbmcgbnVtZXJpY3MsIGxvb2sgYXQgXGEgQVBGbG9hdCBpbnN0ZWFkLgorLy8vIE5ldmVydGhlbGVzcywgd2UndmUgZm91bmQgdGhlc2Ugc2VtYW50aWNzIHVzZWZ1bCBmb3IgbW9kZWxsaW5nIGNlcnRhaW4gY29zdAorLy8vIG1ldHJpY3MuCisvLy8KKy8vLyBUaGUgbnVtYmVyIGlzIHNwbGl0IGludG8gYSBzaWduZWQgc2NhbGUgYW5kIHVuc2lnbmVkIGRpZ2l0cy4gIFRoZSBudW1iZXIKKy8vLyByZXByZXNlbnRlZCBpcyBcYyBnZXREaWdpdHMoKSoyXmdldFNjYWxlKCkuICBJbiB0aGlzIHdheSwgdGhlIGRpZ2l0cyBhcmUKKy8vLyBtdWNoIGxpa2UgdGhlIG1hbnRpc3NhIGluIHRoZSB4ODcgbG9uZyBkb3VibGUsIGJ1dCB0aGVyZSBpcyBubyBjYW5vbmljYWwKKy8vLyBmb3JtIHNvIHRoZSBzYW1lIG51bWJlciBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBiaXQgcmVwcmVzZW50YXRpb25zLgorLy8vCisvLy8gU2NhbGVkTnVtYmVyIGlzIHRlbXBsYXRlZCBvbiB0aGUgdW5kZXJseWluZyBpbnRlZ2VyIHR5cGUgZm9yIGRpZ2l0cywgd2hpY2gKKy8vLyBpcyBleHBlY3RlZCB0byBiZSB1bnNpZ25lZC4KKy8vLworLy8vIFVubGlrZSBBUEZsb2F0LCBTY2FsZWROdW1iZXIgZG9lcyBub3QgbW9kZWwgYXJjaGl0ZWN0dXJlIGZsb2F0aW5nIHBvaW50CisvLy8gYmVoYXZpb3VyIC0tIHdoaWxlIHRoaXMgbWlnaHQgbWFrZSBpdCBhIGxpdHRsZSBmYXN0ZXIgYW5kIGVhc2llciB0byByZWFzb24KKy8vLyBhYm91dCwgaXQgY2VydGFpbmx5IG1ha2VzIGl0IG1vcmUgZGFuZ2Vyb3VzIGZvciBnZW5lcmFsIG51bWVyaWNzLgorLy8vCisvLy8gU2NhbGVkTnVtYmVyIGlzIHRvdGFsbHkgb3JkZXJlZC4gIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIGNhbm9uaWNhbCBmb3JtLCBzbworLy8vIHRoZXJlIGFyZSBtdWx0aXBsZSByZXByZXNlbnRhdGlvbnMgb2YgbW9zdCBzY2FsYXJzLiAgRS5nLjoKKy8vLworLy8vICAgICBTY2FsZWROdW1iZXIoOHUsIDApID09IFNjYWxlZE51bWJlcig0dSwgMSkKKy8vLyAgICAgU2NhbGVkTnVtYmVyKDR1LCAxKSA9PSBTY2FsZWROdW1iZXIoMnUsIDIpCisvLy8gICAgIFNjYWxlZE51bWJlcigydSwgMikgPT0gU2NhbGVkTnVtYmVyKDF1LCAzKQorLy8vCisvLy8gU2NhbGVkTnVtYmVyIGltcGxlbWVudHMgbW9zdCBhcml0aG1ldGljIG9wZXJhdGlvbnMuICBQcmVjaXNpb24gaXMga2VwdAorLy8vIHdoZXJlIHBvc3NpYmxlLiAgVXNlcyBzaW1wbGUgc2F0dXJhdGlvbiBhcml0aG1ldGljLCBzbyB0aGF0IG9wZXJhdGlvbnMKKy8vLyBzYXR1cmF0ZSB0byAwLjAgb3IgZ2V0TGFyZ2VzdCgpIHJhdGhlciB0aGFuIHVuZGVyIG9yIG92ZXJmbG93aW5nLiAgSXQgaGFzCisvLy8gc29tZSBleHRyYSBhcml0aG1ldGljIGZvciB1bml0IGludmVyc2lvbi4gIDAuMC8wLjAgaXMgZGVmaW5lZCB0byBiZSAwLjAuCisvLy8gQW55IG90aGVyIGRpdmlzaW9uIGJ5IDAuMCBpcyBkZWZpbmVkIHRvIGJlIGdldExhcmdlc3QoKS4KKy8vLworLy8vIEFzIGEgY29udmVuaWVuY2UgZm9yIG1vZGlmeWluZyB0aGUgZXhwb25lbnQsIGxlZnQgYW5kIHJpZ2h0IHNoaWZ0aW5nIGFyZQorLy8vIGJvdGggaW1wbGVtZW50ZWQsIGFuZCBib3RoIGludGVycHJldCBuZWdhdGl2ZSBzaGlmdHMgYXMgcG9zaXRpdmUgc2hpZnRzIGluCisvLy8gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbi4KKy8vLworLy8vIFNjYWxlcyBhcmUgbGltaXRlZCB0byB0aGUgcmFuZ2UgYWNjZXB0ZWQgYnkgeDg3IGxvbmcgZG91YmxlLiAgVGhpcyBtYWtlcworLy8vIGl0IHRyaXZpYWwgdG8gYWRkIGZ1bmN0aW9uYWxpdHkgdG8gY29udmVydCB0byBBUEZsb2F0ICh0aGlzIGlzIGFscmVhZHkKKy8vLyByZWxpZWQgb24gZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBwcmludGluZykuCisvLy8KKy8vLyBQb3NzaWJsZSAoYW5kIGNvbmZsaWN0aW5nKSBmdXR1cmUgZGlyZWN0aW9uczoKKy8vLworLy8vICAxLiBUdXJuIHRoaXMgaW50byBhIHdyYXBwZXIgYXJvdW5kIFxhIEFQRmxvYXQuCisvLy8gIDIuIFNoYXJlIHRoZSBhbGdvcml0aG0gaW1wbGVtZW50YXRpb25zIHdpdGggXGEgQVBGbG9hdC4KKy8vLyAgMy4gQWxsb3cgXGEgU2NhbGVkTnVtYmVyIHRvIHJlcHJlc2VudCBhIHNpZ25lZCBudW1iZXIuCit0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4gY2xhc3MgU2NhbGVkTnVtYmVyIDogU2NhbGVkTnVtYmVyQmFzZSB7CitwdWJsaWM6CisgIHN0YXRpY19hc3NlcnQoIXN0ZDo6bnVtZXJpY19saW1pdHM8RGlnaXRzVD46OmlzX3NpZ25lZCwKKyAgICAgICAgICAgICAgICAib25seSB1bnNpZ25lZCBmbG9hdHMgc3VwcG9ydGVkIik7CisKKyAgdHlwZWRlZiBEaWdpdHNUIERpZ2l0c1R5cGU7CisKK3ByaXZhdGU6CisgIHR5cGVkZWYgc3RkOjpudW1lcmljX2xpbWl0czxEaWdpdHNUeXBlPiBEaWdpdHNMaW1pdHM7CisKKyAgc3RhdGljIGNvbnN0IGludCBXaWR0aCA9IHNpemVvZihEaWdpdHNUeXBlKSAqIDg7CisgIHN0YXRpY19hc3NlcnQoV2lkdGggPD0gNjQsICJpbnZhbGlkIGludGVnZXIgd2lkdGggZm9yIGRpZ2l0cyIpOworCitwcml2YXRlOgorICBEaWdpdHNUeXBlIERpZ2l0cyA9IDA7CisgIGludDE2X3QgU2NhbGUgPSAwOworCitwdWJsaWM6CisgIFNjYWxlZE51bWJlcigpID0gZGVmYXVsdDsKKworICBjb25zdGV4cHIgU2NhbGVkTnVtYmVyKERpZ2l0c1R5cGUgRGlnaXRzLCBpbnQxNl90IFNjYWxlKQorICAgICAgOiBEaWdpdHMoRGlnaXRzKSwgU2NhbGUoU2NhbGUpIHt9CisKK3ByaXZhdGU6CisgIFNjYWxlZE51bWJlcihjb25zdCBzdGQ6OnBhaXI8RGlnaXRzVCwgaW50MTZfdD4gJlgpCisgICAgICA6IERpZ2l0cyhYLmZpcnN0KSwgU2NhbGUoWC5zZWNvbmQpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIFNjYWxlZE51bWJlciBnZXRaZXJvKCkgeyByZXR1cm4gU2NhbGVkTnVtYmVyKDAsIDApOyB9CisgIHN0YXRpYyBTY2FsZWROdW1iZXIgZ2V0T25lKCkgeyByZXR1cm4gU2NhbGVkTnVtYmVyKDEsIDApOyB9CisgIHN0YXRpYyBTY2FsZWROdW1iZXIgZ2V0TGFyZ2VzdCgpIHsKKyAgICByZXR1cm4gU2NhbGVkTnVtYmVyKERpZ2l0c0xpbWl0czo6bWF4KCksIFNjYWxlZE51bWJlcnM6Ok1heFNjYWxlKTsKKyAgfQorICBzdGF0aWMgU2NhbGVkTnVtYmVyIGdldCh1aW50NjRfdCBOKSB7IHJldHVybiBhZGp1c3RUb1dpZHRoKE4sIDApOyB9CisgIHN0YXRpYyBTY2FsZWROdW1iZXIgZ2V0SW52ZXJzZSh1aW50NjRfdCBOKSB7CisgICAgcmV0dXJuIGdldChOKS5pbnZlcnQoKTsKKyAgfQorICBzdGF0aWMgU2NhbGVkTnVtYmVyIGdldEZyYWN0aW9uKERpZ2l0c1R5cGUgTiwgRGlnaXRzVHlwZSBEKSB7CisgICAgcmV0dXJuIGdldFF1b3RpZW50KE4sIEQpOworICB9CisKKyAgaW50MTZfdCBnZXRTY2FsZSgpIGNvbnN0IHsgcmV0dXJuIFNjYWxlOyB9CisgIERpZ2l0c1R5cGUgZ2V0RGlnaXRzKCkgY29uc3QgeyByZXR1cm4gRGlnaXRzOyB9CisKKyAgLy8vIFxicmllZiBDb252ZXJ0IHRvIHRoZSBnaXZlbiBpbnRlZ2VyIHR5cGUuCisgIC8vLworICAvLy8gQ29udmVydCB0byBcYyBJbnRUIHVzaW5nIHNpbXBsZSBzYXR1cmF0aW5nIGFyaXRobWV0aWMsIHRydW5jYXRpbmcgaWYKKyAgLy8vIG5lY2Vzc2FyeS4KKyAgdGVtcGxhdGUgPGNsYXNzIEludFQ+IEludFQgdG9JbnQoKSBjb25zdDsKKworICBib29sIGlzWmVybygpIGNvbnN0IHsgcmV0dXJuICFEaWdpdHM7IH0KKyAgYm9vbCBpc0xhcmdlc3QoKSBjb25zdCB7IHJldHVybiAqdGhpcyA9PSBnZXRMYXJnZXN0KCk7IH0KKyAgYm9vbCBpc09uZSgpIGNvbnN0IHsKKyAgICBpZiAoU2NhbGUgPiAwIHx8IFNjYWxlIDw9IC1XaWR0aCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRGlnaXRzID09IERpZ2l0c1R5cGUoMSkgPDwgLVNjYWxlOworICB9CisKKyAgLy8vIFxicmllZiBUaGUgbG9nIGJhc2UgMiwgcm91bmRlZC4KKyAgLy8vCisgIC8vLyBHZXQgdGhlIGxnIG9mIHRoZSBzY2FsYXIuICBsZyAwIGlzIGRlZmluZWQgdG8gYmUgSU5UMzJfTUlOLgorICBpbnQzMl90IGxnKCkgY29uc3QgeyByZXR1cm4gU2NhbGVkTnVtYmVyczo6Z2V0TGcoRGlnaXRzLCBTY2FsZSk7IH0KKworICAvLy8gXGJyaWVmIFRoZSBsb2cgYmFzZSAyLCByb3VuZGVkIHRvd2FyZHMgSU5UMzJfTUlOLgorICAvLy8KKyAgLy8vIEdldCB0aGUgbGcgZmxvb3IuICBsZyAwIGlzIGRlZmluZWQgdG8gYmUgSU5UMzJfTUlOLgorICBpbnQzMl90IGxnRmxvb3IoKSBjb25zdCB7IHJldHVybiBTY2FsZWROdW1iZXJzOjpnZXRMZ0Zsb29yKERpZ2l0cywgU2NhbGUpOyB9CisKKyAgLy8vIFxicmllZiBUaGUgbG9nIGJhc2UgMiwgcm91bmRlZCB0b3dhcmRzIElOVDMyX01BWC4KKyAgLy8vCisgIC8vLyBHZXQgdGhlIGxnIGNlaWxpbmcuICBsZyAwIGlzIGRlZmluZWQgdG8gYmUgSU5UMzJfTUlOLgorICBpbnQzMl90IGxnQ2VpbGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gU2NhbGVkTnVtYmVyczo6Z2V0TGdDZWlsaW5nKERpZ2l0cywgU2NhbGUpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNjYWxlZE51bWJlciAmWCkgY29uc3QgeyByZXR1cm4gY29tcGFyZShYKSA9PSAwOyB9CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFNjYWxlZE51bWJlciAmWCkgY29uc3QgeyByZXR1cm4gY29tcGFyZShYKSA8IDA7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNjYWxlZE51bWJlciAmWCkgY29uc3QgeyByZXR1cm4gY29tcGFyZShYKSAhPSAwOyB9CisgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFNjYWxlZE51bWJlciAmWCkgY29uc3QgeyByZXR1cm4gY29tcGFyZShYKSA+IDA7IH0KKyAgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFNjYWxlZE51bWJlciAmWCkgY29uc3QgeyByZXR1cm4gY29tcGFyZShYKSA8PSAwOyB9CisgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBTY2FsZWROdW1iZXIgJlgpIGNvbnN0IHsgcmV0dXJuIGNvbXBhcmUoWCkgPj0gMDsgfQorCisgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeyByZXR1cm4gaXNaZXJvKCk7IH0KKworICAvLy8gXGJyaWVmIENvbnZlcnQgdG8gYSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIGluIGEgc3RyaW5nLgorICAvLy8KKyAgLy8vIENvbnZlcnQgdG8gYSBzdHJpbmcuICBVc2VzIHNjaWVudGlmaWMgbm90YXRpb24gZm9yIHZlcnkgbGFyZ2Uvc21hbGwKKyAgLy8vIG51bWJlcnMuICBTY2llbnRpZmljIG5vdGF0aW9uIGlzIHVzZWQgcm91Z2hseSBmb3IgbnVtYmVycyBvdXRzaWRlIG9mIHRoZQorICAvLy8gcmFuZ2UgMl4tNjQgdGhyb3VnaCAyXjY0LgorICAvLy8KKyAgLy8vIFxjIFByZWNpc2lvbiBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cyBvZiBwcmVjaXNpb24gdG8gdXNlOworICAvLy8gMCByZXF1ZXN0cyB0aGUgbWF4aW11bSBhdmFpbGFibGUuCisgIC8vLworICAvLy8gQXMgYSBzcGVjaWFsIGNhc2UgdG8gbWFrZSBkZWJ1Z2dpbmcgZWFzaWVyLCBpZiB0aGUgbnVtYmVyIGlzIHNtYWxsIGVub3VnaAorICAvLy8gdG8gY29udmVydCB3aXRob3V0IHNjaWVudGlmaWMgbm90YXRpb24gYW5kIGhhcyBtb3JlIHRoYW4gXGMgUHJlY2lzaW9uCisgIC8vLyBkaWdpdHMgYmVmb3JlIHRoZSBkZWNpbWFsIHBsYWNlLCBpdCdzIHByaW50ZWQgYWNjdXJhdGVseSB0byB0aGUgZmlyc3QKKyAgLy8vIGRpZ2l0IHBhc3QgemVyby4gIEUuZy4sIGFzc3VtaW5nIDEwIGRpZ2l0cyBvZiBwcmVjaXNpb246CisgIC8vLworICAvLy8gICAgIDk4NzY1NDMyMTk4Ljc2NTQuLi4gPT4gOTg3NjU0MzIxOTguOAorICAvLy8gICAgICA4NzY1NDMyMTk4Ljc2NTQuLi4gPT4gIDg3NjU0MzIxOTguOAorICAvLy8gICAgICAgNzY1NDMyMTk4Ljc2NTQuLi4gPT4gICA3NjU0MzIxOTguOAorICAvLy8gICAgICAgIDY1NDMyMTk4Ljc2NTQuLi4gPT4gICAgNjU0MzIxOTguNzcKKyAgLy8vICAgICAgICAgNTQzMjE5OC43NjU0Li4uID0+ICAgICA1NDMyMTk4Ljc2NQorICBzdGQ6OnN0cmluZyB0b1N0cmluZyh1bnNpZ25lZCBQcmVjaXNpb24gPSBEZWZhdWx0UHJlY2lzaW9uKSB7CisgICAgcmV0dXJuIFNjYWxlZE51bWJlckJhc2U6OnRvU3RyaW5nKERpZ2l0cywgU2NhbGUsIFdpZHRoLCBQcmVjaXNpb24pOworICB9CisKKyAgLy8vIFxicmllZiBQcmludCBhIGRlY2ltYWwgcmVwcmVzZW50YXRpb24uCisgIC8vLworICAvLy8gUHJpbnQgYSBzdHJpbmcuICBTZWUgdG9TdHJpbmcgZm9yIGRvY3VtZW50YXRpb24uCisgIHJhd19vc3RyZWFtICZwcmludChyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQcmVjaXNpb24gPSBEZWZhdWx0UHJlY2lzaW9uKSBjb25zdCB7CisgICAgcmV0dXJuIFNjYWxlZE51bWJlckJhc2U6OnByaW50KE9TLCBEaWdpdHMsIFNjYWxlLCBXaWR0aCwgUHJlY2lzaW9uKTsKKyAgfQorICB2b2lkIGR1bXAoKSBjb25zdCB7IHJldHVybiBTY2FsZWROdW1iZXJCYXNlOjpkdW1wKERpZ2l0cywgU2NhbGUsIFdpZHRoKTsgfQorCisgIFNjYWxlZE51bWJlciAmb3BlcmF0b3IrPShjb25zdCBTY2FsZWROdW1iZXIgJlgpIHsKKyAgICBzdGQ6OnRpZShEaWdpdHMsIFNjYWxlKSA9CisgICAgICAgIFNjYWxlZE51bWJlcnM6OmdldFN1bShEaWdpdHMsIFNjYWxlLCBYLkRpZ2l0cywgWC5TY2FsZSk7CisgICAgLy8gQ2hlY2sgZm9yIGV4cG9uZW50IHBhc3QgTWF4U2NhbGUuCisgICAgaWYgKFNjYWxlID4gU2NhbGVkTnVtYmVyczo6TWF4U2NhbGUpCisgICAgICAqdGhpcyA9IGdldExhcmdlc3QoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgU2NhbGVkTnVtYmVyICZvcGVyYXRvci09KGNvbnN0IFNjYWxlZE51bWJlciAmWCkgeworICAgIHN0ZDo6dGllKERpZ2l0cywgU2NhbGUpID0KKyAgICAgICAgU2NhbGVkTnVtYmVyczo6Z2V0RGlmZmVyZW5jZShEaWdpdHMsIFNjYWxlLCBYLkRpZ2l0cywgWC5TY2FsZSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIFNjYWxlZE51bWJlciAmb3BlcmF0b3IqPShjb25zdCBTY2FsZWROdW1iZXIgJlgpOworICBTY2FsZWROdW1iZXIgJm9wZXJhdG9yLz0oY29uc3QgU2NhbGVkTnVtYmVyICZYKTsKKyAgU2NhbGVkTnVtYmVyICZvcGVyYXRvcjw8PShpbnQxNl90IFNoaWZ0KSB7CisgICAgc2hpZnRMZWZ0KFNoaWZ0KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgU2NhbGVkTnVtYmVyICZvcGVyYXRvcj4+PShpbnQxNl90IFNoaWZ0KSB7CisgICAgc2hpZnRSaWdodChTaGlmdCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgc2hpZnRMZWZ0KGludDMyX3QgU2hpZnQpOworICB2b2lkIHNoaWZ0UmlnaHQoaW50MzJfdCBTaGlmdCk7CisKKyAgLy8vIFxicmllZiBBZGp1c3QgdHdvIGZsb2F0cyB0byBoYXZlIG1hdGNoaW5nIGV4cG9uZW50cy4KKyAgLy8vCisgIC8vLyBBZGp1c3QgXGMgdGhpcyBhbmQgXGMgWCB0byBoYXZlIG1hdGNoaW5nIGV4cG9uZW50cy4gIFJldHVybnMgdGhlIG5ldyBcYyBYCisgIC8vLyBieSB2YWx1ZS4gIERvZXMgbm90aGluZyBpZiBcYSBpc1plcm8oKSBmb3IgZWl0aGVyLgorICAvLy8KKyAgLy8vIFRoZSB2YWx1ZSB0aGF0IGNvbXBhcmVzIHNtYWxsZXIgd2lsbCBsb3NlIHByZWNpc2lvbiwgYW5kIHBvc3NpYmx5IGJlY29tZQorICAvLy8gXGEgaXNaZXJvKCkuCisgIFNjYWxlZE51bWJlciBtYXRjaFNjYWxlcyhTY2FsZWROdW1iZXIgWCkgeworICAgIFNjYWxlZE51bWJlcnM6Om1hdGNoU2NhbGVzKERpZ2l0cywgU2NhbGUsIFguRGlnaXRzLCBYLlNjYWxlKTsKKyAgICByZXR1cm4gWDsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgU2NhbGUgYSBsYXJnZSBudW1iZXIgYWNjdXJhdGVseS4KKyAgLy8vCisgIC8vLyBTY2FsZSBOIChtdWx0aXBseSBpdCBieSB0aGlzKS4gIFVzZXMgZnVsbCBwcmVjaXNpb24gbXVsdGlwbGljYXRpb24sIGV2ZW4KKyAgLy8vIGlmIFdpZHRoIGlzIHNtYWxsZXIgdGhhbiA2NCwgc28gaW5mb3JtYXRpb24gaXMgbm90IGxvc3QuCisgIHVpbnQ2NF90IHNjYWxlKHVpbnQ2NF90IE4pIGNvbnN0OworICB1aW50NjRfdCBzY2FsZUJ5SW52ZXJzZSh1aW50NjRfdCBOKSBjb25zdCB7CisgICAgLy8gVE9ETzogaW1wbGVtZW50IGRpcmVjdGx5LCByYXRoZXIgdGhhbiByZWx5aW5nIG9uIGludmVyc2UuICBJbnZlcnNlIGlzCisgICAgLy8gZXhwZW5zaXZlLgorICAgIHJldHVybiBpbnZlcnNlKCkuc2NhbGUoTik7CisgIH0KKyAgaW50NjRfdCBzY2FsZShpbnQ2NF90IE4pIGNvbnN0IHsKKyAgICBzdGQ6OnBhaXI8dWludDY0X3QsIGJvb2w+IFVuc2lnbmVkID0gc3BsaXRTaWduZWQoTik7CisgICAgcmV0dXJuIGpvaW5TaWduZWQoc2NhbGUoVW5zaWduZWQuZmlyc3QpLCBVbnNpZ25lZC5zZWNvbmQpOworICB9CisgIGludDY0X3Qgc2NhbGVCeUludmVyc2UoaW50NjRfdCBOKSBjb25zdCB7CisgICAgc3RkOjpwYWlyPHVpbnQ2NF90LCBib29sPiBVbnNpZ25lZCA9IHNwbGl0U2lnbmVkKE4pOworICAgIHJldHVybiBqb2luU2lnbmVkKHNjYWxlQnlJbnZlcnNlKFVuc2lnbmVkLmZpcnN0KSwgVW5zaWduZWQuc2Vjb25kKTsKKyAgfQorCisgIGludCBjb21wYXJlKGNvbnN0IFNjYWxlZE51bWJlciAmWCkgY29uc3QgeworICAgIHJldHVybiBTY2FsZWROdW1iZXJzOjpjb21wYXJlKERpZ2l0cywgU2NhbGUsIFguRGlnaXRzLCBYLlNjYWxlKTsKKyAgfQorICBpbnQgY29tcGFyZVRvKHVpbnQ2NF90IE4pIGNvbnN0IHsKKyAgICByZXR1cm4gU2NhbGVkTnVtYmVyczo6Y29tcGFyZTx1aW50NjRfdD4oRGlnaXRzLCBTY2FsZSwgTiwgMCk7CisgIH0KKyAgaW50IGNvbXBhcmVUbyhpbnQ2NF90IE4pIGNvbnN0IHsgcmV0dXJuIE4gPCAwID8gMSA6IGNvbXBhcmVUbyh1aW50NjRfdChOKSk7IH0KKworICBTY2FsZWROdW1iZXIgJmludmVydCgpIHsgcmV0dXJuICp0aGlzID0gU2NhbGVkTnVtYmVyOjpnZXQoMSkgLyAqdGhpczsgfQorICBTY2FsZWROdW1iZXIgaW52ZXJzZSgpIGNvbnN0IHsgcmV0dXJuIFNjYWxlZE51bWJlcigqdGhpcykuaW52ZXJ0KCk7IH0KKworcHJpdmF0ZToKKyAgc3RhdGljIFNjYWxlZE51bWJlciBnZXRQcm9kdWN0KERpZ2l0c1R5cGUgTEhTLCBEaWdpdHNUeXBlIFJIUykgeworICAgIHJldHVybiBTY2FsZWROdW1iZXJzOjpnZXRQcm9kdWN0KExIUywgUkhTKTsKKyAgfQorICBzdGF0aWMgU2NhbGVkTnVtYmVyIGdldFF1b3RpZW50KERpZ2l0c1R5cGUgRGl2aWRlbmQsIERpZ2l0c1R5cGUgRGl2aXNvcikgeworICAgIHJldHVybiBTY2FsZWROdW1iZXJzOjpnZXRRdW90aWVudChEaXZpZGVuZCwgRGl2aXNvcik7CisgIH0KKworICBzdGF0aWMgaW50IGNvdW50TGVhZGluZ1plcm9zV2lkdGgoRGlnaXRzVHlwZSBEaWdpdHMpIHsKKyAgICBpZiAoV2lkdGggPT0gNjQpCisgICAgICByZXR1cm4gY291bnRMZWFkaW5nWmVyb3M2NChEaWdpdHMpOworICAgIGlmIChXaWR0aCA9PSAzMikKKyAgICAgIHJldHVybiBjb3VudExlYWRpbmdaZXJvczMyKERpZ2l0cyk7CisgICAgcmV0dXJuIGNvdW50TGVhZGluZ1plcm9zMzIoRGlnaXRzKSArIFdpZHRoIC0gMzI7CisgIH0KKworICAvLy8gXGJyaWVmIEFkanVzdCBhIG51bWJlciB0byB3aWR0aCwgcm91bmRpbmcgdXAgaWYgbmVjZXNzYXJ5LgorICAvLy8KKyAgLy8vIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3IgXGMgU2hpZnQgY2xvc2UgdG8gemVyby4KKyAgLy8vCisgIC8vLyBccHJlIFNoaWZ0ID49IE1pblNjYWxlICYmIFNoaWZ0ICsgNjQgPD0gTWF4U2NhbGUuCisgIHN0YXRpYyBTY2FsZWROdW1iZXIgYWRqdXN0VG9XaWR0aCh1aW50NjRfdCBOLCBpbnQzMl90IFNoaWZ0KSB7CisgICAgYXNzZXJ0KFNoaWZ0ID49IFNjYWxlZE51bWJlcnM6Ok1pblNjYWxlICYmICJTaGlmdCBzaG91bGQgYmUgY2xvc2UgdG8gMCIpOworICAgIGFzc2VydChTaGlmdCA8PSBTY2FsZWROdW1iZXJzOjpNYXhTY2FsZSAtIDY0ICYmCisgICAgICAgICAgICJTaGlmdCBzaG91bGQgYmUgY2xvc2UgdG8gMCIpOworICAgIGF1dG8gQWRqdXN0ZWQgPSBTY2FsZWROdW1iZXJzOjpnZXRBZGp1c3RlZDxEaWdpdHNUPihOLCBTaGlmdCk7CisgICAgcmV0dXJuIEFkanVzdGVkOworICB9CisKKyAgc3RhdGljIFNjYWxlZE51bWJlciBnZXRSb3VuZGVkKFNjYWxlZE51bWJlciBQLCBib29sIFJvdW5kKSB7CisgICAgLy8gU2F0dXJhdGUuCisgICAgaWYgKFAuaXNMYXJnZXN0KCkpCisgICAgICByZXR1cm4gUDsKKworICAgIHJldHVybiBTY2FsZWROdW1iZXJzOjpnZXRSb3VuZGVkKFAuRGlnaXRzLCBQLlNjYWxlLCBSb3VuZCk7CisgIH0KK307CisKKyNkZWZpbmUgU0NBTEVEX05VTUJFUl9CT1Aob3AsIGJhc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDxjbGFzcyBEaWdpdHNUPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTY2FsZWROdW1iZXI8RGlnaXRzVD4gb3BlcmF0b3Igb3AoY29uc3QgU2NhbGVkTnVtYmVyPERpZ2l0c1Q+ICZMLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjYWxlZE51bWJlcjxEaWdpdHNUPiAmUikgeyAgICAgICAgICBcCisgICAgcmV0dXJuIFNjYWxlZE51bWJlcjxEaWdpdHNUPihMKSBiYXNlIFI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CitTQ0FMRURfTlVNQkVSX0JPUCgrLCArPSApCitTQ0FMRURfTlVNQkVSX0JPUCgtLCAtPSApCitTQ0FMRURfTlVNQkVSX0JPUCgqLCAqPSApCitTQ0FMRURfTlVNQkVSX0JPUCgvLCAvPSApCisjdW5kZWYgU0NBTEVEX05VTUJFUl9CT1AKKwordGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+CitTY2FsZWROdW1iZXI8RGlnaXRzVD4gb3BlcmF0b3I8PChjb25zdCBTY2FsZWROdW1iZXI8RGlnaXRzVD4gJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IFNoaWZ0KSB7CisgIHJldHVybiBTY2FsZWROdW1iZXI8RGlnaXRzVD4oTCkgPDw9IFNoaWZ0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4KK1NjYWxlZE51bWJlcjxEaWdpdHNUPiBvcGVyYXRvcj4+KGNvbnN0IFNjYWxlZE51bWJlcjxEaWdpdHNUPiAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgU2hpZnQpIHsKKyAgcmV0dXJuIFNjYWxlZE51bWJlcjxEaWdpdHNUPihMKSA+Pj0gU2hpZnQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBEaWdpdHNUPgorcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBTY2FsZWROdW1iZXI8RGlnaXRzVD4gJlgpIHsKKyAgcmV0dXJuIFgucHJpbnQoT1MsIDEwKTsKK30KKworI2RlZmluZSBTQ0FMRURfTlVNQkVSX0NPTVBBUkVfVE9fVFlQRShvcCwgVDEsIFQyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb2wgb3BlcmF0b3Igb3AoY29uc3QgU2NhbGVkTnVtYmVyPERpZ2l0c1Q+ICZMLCBUMSBSKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBMLmNvbXBhcmVUbyhUMihSKSkgb3AgMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDxjbGFzcyBEaWdpdHNUPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29sIG9wZXJhdG9yIG9wKFQxIEwsIGNvbnN0IFNjYWxlZE51bWJlcjxEaWdpdHNUPiAmUikgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gMCBvcCBSLmNvbXBhcmVUbyhUMihMKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgU0NBTEVEX05VTUJFUl9DT01QQVJFX1RPKG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNDQUxFRF9OVU1CRVJfQ09NUEFSRV9UT19UWVBFKG9wLCB1aW50NjRfdCwgdWludDY0X3QpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTQ0FMRURfTlVNQkVSX0NPTVBBUkVfVE9fVFlQRShvcCwgdWludDMyX3QsIHVpbnQ2NF90KSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU0NBTEVEX05VTUJFUl9DT01QQVJFX1RPX1RZUEUob3AsIGludDY0X3QsIGludDY0X3QpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNDQUxFRF9OVU1CRVJfQ09NUEFSRV9UT19UWVBFKG9wLCBpbnQzMl90LCBpbnQ2NF90KQorU0NBTEVEX05VTUJFUl9DT01QQVJFX1RPKDwgKQorU0NBTEVEX05VTUJFUl9DT01QQVJFX1RPKD4gKQorU0NBTEVEX05VTUJFUl9DT01QQVJFX1RPKD09ICkKK1NDQUxFRF9OVU1CRVJfQ09NUEFSRV9UTyghPSApCitTQ0FMRURfTlVNQkVSX0NPTVBBUkVfVE8oPD0gKQorU0NBTEVEX05VTUJFUl9DT01QQVJFX1RPKD49ICkKKyN1bmRlZiBTQ0FMRURfTlVNQkVSX0NPTVBBUkVfVE8KKyN1bmRlZiBTQ0FMRURfTlVNQkVSX0NPTVBBUkVfVE9fVFlQRQorCit0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4KK3VpbnQ2NF90IFNjYWxlZE51bWJlcjxEaWdpdHNUPjo6c2NhbGUodWludDY0X3QgTikgY29uc3QgeworICBpZiAoV2lkdGggPT0gNjQgfHwgTiA8PSBEaWdpdHNMaW1pdHM6Om1heCgpKQorICAgIHJldHVybiAoZ2V0KE4pICogKnRoaXMpLnRlbXBsYXRlIHRvSW50PHVpbnQ2NF90PigpOworCisgIC8vIERlZmVyIHRvIHRoZSA2NC1iaXQgdmVyc2lvbi4KKyAgcmV0dXJuIFNjYWxlZE51bWJlcjx1aW50NjRfdD4oRGlnaXRzLCBTY2FsZSkuc2NhbGUoTik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBEaWdpdHNUPgordGVtcGxhdGUgPGNsYXNzIEludFQ+CitJbnRUIFNjYWxlZE51bWJlcjxEaWdpdHNUPjo6dG9JbnQoKSBjb25zdCB7CisgIHR5cGVkZWYgc3RkOjpudW1lcmljX2xpbWl0czxJbnRUPiBMaW1pdHM7CisgIGlmICgqdGhpcyA8IDEpCisgICAgcmV0dXJuIDA7CisgIGlmICgqdGhpcyA+PSBMaW1pdHM6Om1heCgpKQorICAgIHJldHVybiBMaW1pdHM6Om1heCgpOworCisgIEludFQgTiA9IERpZ2l0czsKKyAgaWYgKFNjYWxlID4gMCkgeworICAgIGFzc2VydChzaXplX3QoU2NhbGUpIDwgc2l6ZW9mKEludFQpICogOCk7CisgICAgcmV0dXJuIE4gPDwgU2NhbGU7CisgIH0KKyAgaWYgKFNjYWxlIDwgMCkgeworICAgIGFzc2VydChzaXplX3QoLVNjYWxlKSA8IHNpemVvZihJbnRUKSAqIDgpOworICAgIHJldHVybiBOID4+IC1TY2FsZTsKKyAgfQorICByZXR1cm4gTjsKK30KKwordGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+CitTY2FsZWROdW1iZXI8RGlnaXRzVD4gJlNjYWxlZE51bWJlcjxEaWdpdHNUPjo6CitvcGVyYXRvcio9KGNvbnN0IFNjYWxlZE51bWJlciAmWCkgeworICBpZiAoaXNaZXJvKCkpCisgICAgcmV0dXJuICp0aGlzOworICBpZiAoWC5pc1plcm8oKSkKKyAgICByZXR1cm4gKnRoaXMgPSBYOworCisgIC8vIFNhdmUgdGhlIGV4cG9uZW50cy4KKyAgaW50MzJfdCBTY2FsZXMgPSBpbnQzMl90KFNjYWxlKSArIGludDMyX3QoWC5TY2FsZSk7CisKKyAgLy8gR2V0IHRoZSByYXcgcHJvZHVjdC4KKyAgKnRoaXMgPSBnZXRQcm9kdWN0KERpZ2l0cywgWC5EaWdpdHMpOworCisgIC8vIENvbWJpbmUgd2l0aCBleHBvbmVudHMuCisgIHJldHVybiAqdGhpcyA8PD0gU2NhbGVzOworfQordGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+CitTY2FsZWROdW1iZXI8RGlnaXRzVD4gJlNjYWxlZE51bWJlcjxEaWdpdHNUPjo6CitvcGVyYXRvci89KGNvbnN0IFNjYWxlZE51bWJlciAmWCkgeworICBpZiAoaXNaZXJvKCkpCisgICAgcmV0dXJuICp0aGlzOworICBpZiAoWC5pc1plcm8oKSkKKyAgICByZXR1cm4gKnRoaXMgPSBnZXRMYXJnZXN0KCk7CisKKyAgLy8gU2F2ZSB0aGUgZXhwb25lbnRzLgorICBpbnQzMl90IFNjYWxlcyA9IGludDMyX3QoU2NhbGUpIC0gaW50MzJfdChYLlNjYWxlKTsKKworICAvLyBHZXQgdGhlIHJhdyBxdW90aWVudC4KKyAgKnRoaXMgPSBnZXRRdW90aWVudChEaWdpdHMsIFguRGlnaXRzKTsKKworICAvLyBDb21iaW5lIHdpdGggZXhwb25lbnRzLgorICByZXR1cm4gKnRoaXMgPDw9IFNjYWxlczsKK30KK3RlbXBsYXRlIDxjbGFzcyBEaWdpdHNUPiB2b2lkIFNjYWxlZE51bWJlcjxEaWdpdHNUPjo6c2hpZnRMZWZ0KGludDMyX3QgU2hpZnQpIHsKKyAgaWYgKCFTaGlmdCB8fCBpc1plcm8oKSkKKyAgICByZXR1cm47CisgIGFzc2VydChTaGlmdCAhPSBJTlQzMl9NSU4pOworICBpZiAoU2hpZnQgPCAwKSB7CisgICAgc2hpZnRSaWdodCgtU2hpZnQpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFNoaWZ0IGFzIG11Y2ggYXMgd2UgY2FuIGluIHRoZSBleHBvbmVudC4KKyAgaW50MzJfdCBTY2FsZVNoaWZ0ID0gc3RkOjptaW4oU2hpZnQsIFNjYWxlZE51bWJlcnM6Ok1heFNjYWxlIC0gU2NhbGUpOworICBTY2FsZSArPSBTY2FsZVNoaWZ0OworICBpZiAoU2NhbGVTaGlmdCA9PSBTaGlmdCkKKyAgICByZXR1cm47CisKKyAgLy8gQ2hlY2sgdGhpcyBsYXRlLCBzaW5jZSBpdCdzIHJhcmUuCisgIGlmIChpc0xhcmdlc3QoKSkKKyAgICByZXR1cm47CisKKyAgLy8gU2hpZnQgdGhlIGRpZ2l0cyB0aGVtc2VsdmVzLgorICBTaGlmdCAtPSBTY2FsZVNoaWZ0OworICBpZiAoU2hpZnQgPiBjb3VudExlYWRpbmdaZXJvc1dpZHRoKERpZ2l0cykpIHsKKyAgICAvLyBTYXR1cmF0ZS4KKyAgICAqdGhpcyA9IGdldExhcmdlc3QoKTsKKyAgICByZXR1cm47CisgIH0KKworICBEaWdpdHMgPDw9IFNoaWZ0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4gdm9pZCBTY2FsZWROdW1iZXI8RGlnaXRzVD46OnNoaWZ0UmlnaHQoaW50MzJfdCBTaGlmdCkgeworICBpZiAoIVNoaWZ0IHx8IGlzWmVybygpKQorICAgIHJldHVybjsKKyAgYXNzZXJ0KFNoaWZ0ICE9IElOVDMyX01JTik7CisgIGlmIChTaGlmdCA8IDApIHsKKyAgICBzaGlmdExlZnQoLVNoaWZ0KTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBTaGlmdCBhcyBtdWNoIGFzIHdlIGNhbiBpbiB0aGUgZXhwb25lbnQuCisgIGludDMyX3QgU2NhbGVTaGlmdCA9IHN0ZDo6bWluKFNoaWZ0LCBTY2FsZSAtIFNjYWxlZE51bWJlcnM6Ok1pblNjYWxlKTsKKyAgU2NhbGUgLT0gU2NhbGVTaGlmdDsKKyAgaWYgKFNjYWxlU2hpZnQgPT0gU2hpZnQpCisgICAgcmV0dXJuOworCisgIC8vIFNoaWZ0IHRoZSBkaWdpdHMgdGhlbXNlbHZlcy4KKyAgU2hpZnQgLT0gU2NhbGVTaGlmdDsKKyAgaWYgKFNoaWZ0ID49IFdpZHRoKSB7CisgICAgLy8gU2F0dXJhdGUuCisgICAgKnRoaXMgPSBnZXRaZXJvKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgRGlnaXRzID4+PSBTaGlmdDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc1BvZExpa2U7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlzUG9kTGlrZTxTY2FsZWROdW1iZXI8VD4+IHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9TQ0FMRUROVU1CRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1Njb3BlZFByaW50ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TY29wZWRQcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0ZDI1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TY29wZWRQcmludGVyLmgKQEAgLTAsMCArMSwzODkgQEAKKy8vPT09LS0gU2NvcGVkUHJpbnRlci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1NDT1BFRFBSSU5URVJfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfU0NPUEVEUFJJTlRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUFNJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBFbnVtRW50cnkgeworICBTdHJpbmdSZWYgTmFtZTsKKyAgLy8gV2hpbGUgTmFtZSBzdWZmaWNlcyBpbiBtb3N0IG9mIHRoZSBjYXNlcywgaW4gY2VydGFpbiBjYXNlcworICAvLyBHTlUgc3R5bGUgYW5kIExMVk0gc3R5bGUgb2YgRUxGRHVtcGVyIGRvIG5vdAorICAvLyBkaXNwbGF5IHNhbWUgc3RyaW5nIGZvciBzYW1lIGVudW0uIFRoZSBBbHROYW1lIGlmIGluaXRpYWxpemVkIGFwcHJvcHJpYXRlbHkKKyAgLy8gd2lsbCBob2xkIHRoZSBzdHJpbmcgdGhhdCBHTlUgc3R5bGUgZW1pdHMuCisgIC8vIEV4YW1wbGU6CisgIC8vICJFTV9YODZfNjQiIHN0cmluZyBvbiBMTFZNIHN0eWxlIGZvciBFbGZfRWhkci0+ZV9tYWNoaW5lIGNvcnJlc3BvbmRzIHRvCisgIC8vICJBZHZhbmNlZCBNaWNybyBEZXZpY2VzIFg4Ni02NCIgb24gR05VIHN0eWxlCisgIFN0cmluZ1JlZiBBbHROYW1lOworICBUIFZhbHVlOworICBFbnVtRW50cnkoU3RyaW5nUmVmIE4sIFN0cmluZ1JlZiBBLCBUIFYpIDogTmFtZShOKSwgQWx0TmFtZShBKSwgVmFsdWUoVikge30KKyAgRW51bUVudHJ5KFN0cmluZ1JlZiBOLCBUIFYpIDogTmFtZShOKSwgQWx0TmFtZShOKSwgVmFsdWUoVikge30KK307CisKK3N0cnVjdCBIZXhOdW1iZXIgeworICAvLyBUbyBhdm9pZCBzaWduLWV4dGVuc2lvbiB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgY2FzdCB0byB0aGUgYXBwcm9wcmlhdGUKKyAgLy8gdW5zaWduZWQgdHlwZS4gVGhlIG92ZXJsb2FkcyBhcmUgaGVyZSBzbyB0aGF0IGV2ZXJ5IHR5cGUgdGhhdCBpcyBpbXBsaWNpdGx5CisgIC8vIGNvbnZlcnRpYmxlIHRvIGFuIGludGVnZXIgKGluY2x1ZGluZyBlbnVtcyBhbmQgZW5kaWFuIGhlbHBlcnMpIGNhbiBiZSB1c2VkCisgIC8vIHdpdGhvdXQgcmVxdWlyaW5nIHR5cGUgdHJhaXRzIG9yIGNhbGwtc2l0ZSBjaGFuZ2VzLgorICBIZXhOdW1iZXIoY2hhciBWYWx1ZSkgOiBWYWx1ZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihWYWx1ZSkpIHt9CisgIEhleE51bWJlcihzaWduZWQgY2hhciBWYWx1ZSkgOiBWYWx1ZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihWYWx1ZSkpIHt9CisgIEhleE51bWJlcihzaWduZWQgc2hvcnQgVmFsdWUpIDogVmFsdWUoc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KFZhbHVlKSkge30KKyAgSGV4TnVtYmVyKHNpZ25lZCBpbnQgVmFsdWUpIDogVmFsdWUoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihWYWx1ZSkpIHt9CisgIEhleE51bWJlcihzaWduZWQgbG9uZyBWYWx1ZSkgOiBWYWx1ZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihWYWx1ZSkpIHt9CisgIEhleE51bWJlcihzaWduZWQgbG9uZyBsb25nIFZhbHVlKQorICAgICAgOiBWYWx1ZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KFZhbHVlKSkge30KKyAgSGV4TnVtYmVyKHVuc2lnbmVkIGNoYXIgVmFsdWUpIDogVmFsdWUoVmFsdWUpIHt9CisgIEhleE51bWJlcih1bnNpZ25lZCBzaG9ydCBWYWx1ZSkgOiBWYWx1ZShWYWx1ZSkge30KKyAgSGV4TnVtYmVyKHVuc2lnbmVkIGludCBWYWx1ZSkgOiBWYWx1ZShWYWx1ZSkge30KKyAgSGV4TnVtYmVyKHVuc2lnbmVkIGxvbmcgVmFsdWUpIDogVmFsdWUoVmFsdWUpIHt9CisgIEhleE51bWJlcih1bnNpZ25lZCBsb25nIGxvbmcgVmFsdWUpIDogVmFsdWUoVmFsdWUpIHt9CisgIHVpbnQ2NF90IFZhbHVlOworfTsKKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBIZXhOdW1iZXIgJlZhbHVlKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIHRvX2hleFN0cmluZyh1aW50NjRfdCBWYWx1ZSwgYm9vbCBVcHBlckNhc2UgPSB0cnVlKTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IGNvbnN0IHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBUICZWYWx1ZSkgeworICBzdGQ6OnN0cmluZyBudW1iZXI7CisgIGxsdm06OnJhd19zdHJpbmdfb3N0cmVhbSBzdHJlYW0obnVtYmVyKTsKKyAgc3RyZWFtIDw8IFZhbHVlOworICByZXR1cm4gc3RyZWFtLnN0cigpOworfQorCitjbGFzcyBTY29wZWRQcmludGVyIHsKK3B1YmxpYzoKKyAgU2NvcGVkUHJpbnRlcihyYXdfb3N0cmVhbSAmT1MpIDogT1MoT1MpLCBJbmRlbnRMZXZlbCgwKSB7fQorCisgIHZvaWQgZmx1c2goKSB7IE9TLmZsdXNoKCk7IH0KKworICB2b2lkIGluZGVudChpbnQgTGV2ZWxzID0gMSkgeyBJbmRlbnRMZXZlbCArPSBMZXZlbHM7IH0KKworICB2b2lkIHVuaW5kZW50KGludCBMZXZlbHMgPSAxKSB7CisgICAgSW5kZW50TGV2ZWwgPSBzdGQ6Om1heCgwLCBJbmRlbnRMZXZlbCAtIExldmVscyk7CisgIH0KKworICB2b2lkIHJlc2V0SW5kZW50KCkgeyBJbmRlbnRMZXZlbCA9IDA7IH0KKworICBpbnQgZ2V0SW5kZW50TGV2ZWwoKSB7IHJldHVybiBJbmRlbnRMZXZlbDsgfQorCisgIHZvaWQgc2V0UHJlZml4KFN0cmluZ1JlZiBQKSB7IFByZWZpeCA9IFA7IH0KKworICB2b2lkIHByaW50SW5kZW50KCkgeworICAgIE9TIDw8IFByZWZpeDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEluZGVudExldmVsOyArK2kpCisgICAgICBPUyA8PCAiICAiOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEhleE51bWJlciBoZXgoVCBWYWx1ZSkgeyByZXR1cm4gSGV4TnVtYmVyKFZhbHVlKTsgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBURW51bT4KKyAgdm9pZCBwcmludEVudW0oU3RyaW5nUmVmIExhYmVsLCBUIFZhbHVlLAorICAgICAgICAgICAgICAgICBBcnJheVJlZjxFbnVtRW50cnk8VEVudW0+PiBFbnVtVmFsdWVzKSB7CisgICAgU3RyaW5nUmVmIE5hbWU7CisgICAgYm9vbCBGb3VuZCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byAmRW51bUl0ZW0gOiBFbnVtVmFsdWVzKSB7CisgICAgICBpZiAoRW51bUl0ZW0uVmFsdWUgPT0gVmFsdWUpIHsKKyAgICAgICAgTmFtZSA9IEVudW1JdGVtLk5hbWU7CisgICAgICAgIEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKEZvdW5kKSB7CisgICAgICBzdGFydExpbmUoKSA8PCBMYWJlbCA8PCAiOiAiIDw8IE5hbWUgPDwgIiAoIiA8PCBoZXgoVmFsdWUpIDw8ICIpXG4iOworICAgIH0gZWxzZSB7CisgICAgICBzdGFydExpbmUoKSA8PCBMYWJlbCA8PCAiOiAiIDw8IGhleChWYWx1ZSkgPDwgIlxuIjsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVEZsYWc+CisgIHZvaWQgcHJpbnRGbGFncyhTdHJpbmdSZWYgTGFiZWwsIFQgVmFsdWUsIEFycmF5UmVmPEVudW1FbnRyeTxURmxhZz4+IEZsYWdzLAorICAgICAgICAgICAgICAgICAgVEZsYWcgRW51bU1hc2sxID0ge30sIFRGbGFnIEVudW1NYXNrMiA9IHt9LAorICAgICAgICAgICAgICAgICAgVEZsYWcgRW51bU1hc2szID0ge30pIHsKKyAgICB0eXBlZGVmIEVudW1FbnRyeTxURmxhZz4gRmxhZ0VudHJ5OworICAgIHR5cGVkZWYgU21hbGxWZWN0b3I8RmxhZ0VudHJ5LCAxMD4gRmxhZ1ZlY3RvcjsKKyAgICBGbGFnVmVjdG9yIFNldEZsYWdzOworCisgICAgZm9yIChjb25zdCBhdXRvICZGbGFnIDogRmxhZ3MpIHsKKyAgICAgIGlmIChGbGFnLlZhbHVlID09IDApCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBURmxhZyBFbnVtTWFza3t9OworICAgICAgaWYgKEZsYWcuVmFsdWUgJiBFbnVtTWFzazEpCisgICAgICAgIEVudW1NYXNrID0gRW51bU1hc2sxOworICAgICAgZWxzZSBpZiAoRmxhZy5WYWx1ZSAmIEVudW1NYXNrMikKKyAgICAgICAgRW51bU1hc2sgPSBFbnVtTWFzazI7CisgICAgICBlbHNlIGlmIChGbGFnLlZhbHVlICYgRW51bU1hc2szKQorICAgICAgICBFbnVtTWFzayA9IEVudW1NYXNrMzsKKyAgICAgIGJvb2wgSXNFbnVtID0gKEZsYWcuVmFsdWUgJiBFbnVtTWFzaykgIT0gMDsKKyAgICAgIGlmICgoIUlzRW51bSAmJiAoVmFsdWUgJiBGbGFnLlZhbHVlKSA9PSBGbGFnLlZhbHVlKSB8fAorICAgICAgICAgIChJc0VudW0gJiYgKFZhbHVlICYgRW51bU1hc2spID09IEZsYWcuVmFsdWUpKSB7CisgICAgICAgIFNldEZsYWdzLnB1c2hfYmFjayhGbGFnKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnNvcnQoU2V0RmxhZ3MuYmVnaW4oKSwgU2V0RmxhZ3MuZW5kKCksICZmbGFnTmFtZTxURmxhZz4pOworCisgICAgc3RhcnRMaW5lKCkgPDwgTGFiZWwgPDwgIiBbICgiIDw8IGhleChWYWx1ZSkgPDwgIilcbiI7CisgICAgZm9yIChjb25zdCBhdXRvICZGbGFnIDogU2V0RmxhZ3MpIHsKKyAgICAgIHN0YXJ0TGluZSgpIDw8ICIgICIgPDwgRmxhZy5OYW1lIDw8ICIgKCIgPDwgaGV4KEZsYWcuVmFsdWUpIDw8ICIpXG4iOworICAgIH0KKyAgICBzdGFydExpbmUoKSA8PCAiXVxuIjsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHByaW50RmxhZ3MoU3RyaW5nUmVmIExhYmVsLCBUIFZhbHVlKSB7CisgICAgc3RhcnRMaW5lKCkgPDwgTGFiZWwgPDwgIiBbICgiIDw8IGhleChWYWx1ZSkgPDwgIilcbiI7CisgICAgdWludDY0X3QgRmxhZyA9IDE7CisgICAgdWludDY0X3QgQ3VyciA9IFZhbHVlOworICAgIHdoaWxlIChDdXJyID4gMCkgeworICAgICAgaWYgKEN1cnIgJiAxKQorICAgICAgICBzdGFydExpbmUoKSA8PCAiICAiIDw8IGhleChGbGFnKSA8PCAiXG4iOworICAgICAgQ3VyciA+Pj0gMTsKKyAgICAgIEZsYWcgPDw9IDE7CisgICAgfQorICAgIHN0YXJ0TGluZSgpIDw8ICJdXG4iOworICB9CisKKyAgdm9pZCBwcmludE51bWJlcihTdHJpbmdSZWYgTGFiZWwsIHVpbnQ2NF90IFZhbHVlKSB7CisgICAgc3RhcnRMaW5lKCkgPDwgTGFiZWwgPDwgIjogIiA8PCBWYWx1ZSA8PCAiXG4iOworICB9CisKKyAgdm9pZCBwcmludE51bWJlcihTdHJpbmdSZWYgTGFiZWwsIHVpbnQzMl90IFZhbHVlKSB7CisgICAgc3RhcnRMaW5lKCkgPDwgTGFiZWwgPDwgIjogIiA8PCBWYWx1ZSA8PCAiXG4iOworICB9CisKKyAgdm9pZCBwcmludE51bWJlcihTdHJpbmdSZWYgTGFiZWwsIHVpbnQxNl90IFZhbHVlKSB7CisgICAgc3RhcnRMaW5lKCkgPDwgTGFiZWwgPDwgIjogIiA8PCBWYWx1ZSA8PCAiXG4iOworICB9CisKKyAgdm9pZCBwcmludE51bWJlcihTdHJpbmdSZWYgTGFiZWwsIHVpbnQ4X3QgVmFsdWUpIHsKKyAgICBzdGFydExpbmUoKSA8PCBMYWJlbCA8PCAiOiAiIDw8IHVuc2lnbmVkKFZhbHVlKSA8PCAiXG4iOworICB9CisKKyAgdm9pZCBwcmludE51bWJlcihTdHJpbmdSZWYgTGFiZWwsIGludDY0X3QgVmFsdWUpIHsKKyAgICBzdGFydExpbmUoKSA8PCBMYWJlbCA8PCAiOiAiIDw8IFZhbHVlIDw8ICJcbiI7CisgIH0KKworICB2b2lkIHByaW50TnVtYmVyKFN0cmluZ1JlZiBMYWJlbCwgaW50MzJfdCBWYWx1ZSkgeworICAgIHN0YXJ0TGluZSgpIDw8IExhYmVsIDw8ICI6ICIgPDwgVmFsdWUgPDwgIlxuIjsKKyAgfQorCisgIHZvaWQgcHJpbnROdW1iZXIoU3RyaW5nUmVmIExhYmVsLCBpbnQxNl90IFZhbHVlKSB7CisgICAgc3RhcnRMaW5lKCkgPDwgTGFiZWwgPDwgIjogIiA8PCBWYWx1ZSA8PCAiXG4iOworICB9CisKKyAgdm9pZCBwcmludE51bWJlcihTdHJpbmdSZWYgTGFiZWwsIGludDhfdCBWYWx1ZSkgeworICAgIHN0YXJ0TGluZSgpIDw8IExhYmVsIDw8ICI6ICIgPDwgaW50KFZhbHVlKSA8PCAiXG4iOworICB9CisKKyAgdm9pZCBwcmludE51bWJlcihTdHJpbmdSZWYgTGFiZWwsIGNvbnN0IEFQU0ludCAmVmFsdWUpIHsKKyAgICBzdGFydExpbmUoKSA8PCBMYWJlbCA8PCAiOiAiIDw8IFZhbHVlIDw8ICJcbiI7CisgIH0KKworICB2b2lkIHByaW50Qm9vbGVhbihTdHJpbmdSZWYgTGFiZWwsIGJvb2wgVmFsdWUpIHsKKyAgICBzdGFydExpbmUoKSA8PCBMYWJlbCA8PCAiOiAiIDw8IChWYWx1ZSA/ICJZZXMiIDogIk5vIikgPDwgJ1xuJzsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUPiB2b2lkIHByaW50VmVyc2lvbihTdHJpbmdSZWYgTGFiZWwsIFQuLi4gVmVyc2lvbikgeworICAgIHN0YXJ0TGluZSgpIDw8IExhYmVsIDw8ICI6ICI7CisgICAgcHJpbnRWZXJzaW9uSW50ZXJuYWwoVmVyc2lvbi4uLik7CisgICAgZ2V0T1N0cmVhbSgpIDw8ICJcbiI7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBwcmludExpc3QoU3RyaW5nUmVmIExhYmVsLCBjb25zdCBUICZMaXN0KSB7CisgICAgc3RhcnRMaW5lKCkgPDwgTGFiZWwgPDwgIjogWyI7CisgICAgYm9vbCBDb21tYSA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byAmSXRlbSA6IExpc3QpIHsKKyAgICAgIGlmIChDb21tYSkKKyAgICAgICAgT1MgPDwgIiwgIjsKKyAgICAgIE9TIDw8IEl0ZW07CisgICAgICBDb21tYSA9IHRydWU7CisgICAgfQorICAgIE9TIDw8ICJdXG4iOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CisgIHZvaWQgcHJpbnRMaXN0KFN0cmluZ1JlZiBMYWJlbCwgY29uc3QgVCAmTGlzdCwgY29uc3QgVSAmUHJpbnRlcikgeworICAgIHN0YXJ0TGluZSgpIDw8IExhYmVsIDw8ICI6IFsiOworICAgIGJvb2wgQ29tbWEgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkl0ZW0gOiBMaXN0KSB7CisgICAgICBpZiAoQ29tbWEpCisgICAgICAgIE9TIDw8ICIsICI7CisgICAgICBQcmludGVyKE9TLCBJdGVtKTsKKyAgICAgIENvbW1hID0gdHJ1ZTsKKyAgICB9CisgICAgT1MgPDwgIl1cbiI7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBwcmludEhleExpc3QoU3RyaW5nUmVmIExhYmVsLCBjb25zdCBUICZMaXN0KSB7CisgICAgc3RhcnRMaW5lKCkgPDwgTGFiZWwgPDwgIjogWyI7CisgICAgYm9vbCBDb21tYSA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byAmSXRlbSA6IExpc3QpIHsKKyAgICAgIGlmIChDb21tYSkKKyAgICAgICAgT1MgPDwgIiwgIjsKKyAgICAgIE9TIDw8IGhleChJdGVtKTsKKyAgICAgIENvbW1hID0gdHJ1ZTsKKyAgICB9CisgICAgT1MgPDwgIl1cbiI7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBwcmludEhleChTdHJpbmdSZWYgTGFiZWwsIFQgVmFsdWUpIHsKKyAgICBzdGFydExpbmUoKSA8PCBMYWJlbCA8PCAiOiAiIDw8IGhleChWYWx1ZSkgPDwgIlxuIjsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHByaW50SGV4KFN0cmluZ1JlZiBMYWJlbCwgU3RyaW5nUmVmIFN0ciwgVCBWYWx1ZSkgeworICAgIHN0YXJ0TGluZSgpIDw8IExhYmVsIDw8ICI6ICIgPDwgU3RyIDw8ICIgKCIgPDwgaGV4KFZhbHVlKSA8PCAiKVxuIjsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIHByaW50U3ltYm9sT2Zmc2V0KFN0cmluZ1JlZiBMYWJlbCwgU3RyaW5nUmVmIFN5bWJvbCwgVCBWYWx1ZSkgeworICAgIHN0YXJ0TGluZSgpIDw8IExhYmVsIDw8ICI6ICIgPDwgU3ltYm9sIDw8ICcrJyA8PCBoZXgoVmFsdWUpIDw8ICdcbic7CisgIH0KKworICB2b2lkIHByaW50U3RyaW5nKFN0cmluZ1JlZiBWYWx1ZSkgeyBzdGFydExpbmUoKSA8PCBWYWx1ZSA8PCAiXG4iOyB9CisKKyAgdm9pZCBwcmludFN0cmluZyhTdHJpbmdSZWYgTGFiZWwsIFN0cmluZ1JlZiBWYWx1ZSkgeworICAgIHN0YXJ0TGluZSgpIDw8IExhYmVsIDw8ICI6ICIgPDwgVmFsdWUgPDwgIlxuIjsKKyAgfQorCisgIHZvaWQgcHJpbnRTdHJpbmcoU3RyaW5nUmVmIExhYmVsLCBjb25zdCBzdGQ6OnN0cmluZyAmVmFsdWUpIHsKKyAgICBwcmludFN0cmluZyhMYWJlbCwgU3RyaW5nUmVmKFZhbHVlKSk7CisgIH0KKworICB2b2lkIHByaW50U3RyaW5nKFN0cmluZ1JlZiBMYWJlbCwgY29uc3QgY2hhciogVmFsdWUpIHsKKyAgICBwcmludFN0cmluZyhMYWJlbCwgU3RyaW5nUmVmKFZhbHVlKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCBwcmludE51bWJlcihTdHJpbmdSZWYgTGFiZWwsIFN0cmluZ1JlZiBTdHIsIFQgVmFsdWUpIHsKKyAgICBzdGFydExpbmUoKSA8PCBMYWJlbCA8PCAiOiAiIDw8IFN0ciA8PCAiICgiIDw8IFZhbHVlIDw8ICIpXG4iOworICB9CisKKyAgdm9pZCBwcmludEJpbmFyeShTdHJpbmdSZWYgTGFiZWwsIFN0cmluZ1JlZiBTdHIsIEFycmF5UmVmPHVpbnQ4X3Q+IFZhbHVlKSB7CisgICAgcHJpbnRCaW5hcnlJbXBsKExhYmVsLCBTdHIsIFZhbHVlLCBmYWxzZSk7CisgIH0KKworICB2b2lkIHByaW50QmluYXJ5KFN0cmluZ1JlZiBMYWJlbCwgU3RyaW5nUmVmIFN0ciwgQXJyYXlSZWY8Y2hhcj4gVmFsdWUpIHsKKyAgICBhdXRvIFYgPSBtYWtlQXJyYXlSZWYocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KFZhbHVlLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlLnNpemUoKSk7CisgICAgcHJpbnRCaW5hcnlJbXBsKExhYmVsLCBTdHIsIFYsIGZhbHNlKTsKKyAgfQorCisgIHZvaWQgcHJpbnRCaW5hcnkoU3RyaW5nUmVmIExhYmVsLCBBcnJheVJlZjx1aW50OF90PiBWYWx1ZSkgeworICAgIHByaW50QmluYXJ5SW1wbChMYWJlbCwgU3RyaW5nUmVmKCksIFZhbHVlLCBmYWxzZSk7CisgIH0KKworICB2b2lkIHByaW50QmluYXJ5KFN0cmluZ1JlZiBMYWJlbCwgQXJyYXlSZWY8Y2hhcj4gVmFsdWUpIHsKKyAgICBhdXRvIFYgPSBtYWtlQXJyYXlSZWYocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KFZhbHVlLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlLnNpemUoKSk7CisgICAgcHJpbnRCaW5hcnlJbXBsKExhYmVsLCBTdHJpbmdSZWYoKSwgViwgZmFsc2UpOworICB9CisKKyAgdm9pZCBwcmludEJpbmFyeShTdHJpbmdSZWYgTGFiZWwsIFN0cmluZ1JlZiBWYWx1ZSkgeworICAgIGF1dG8gViA9IG1ha2VBcnJheVJlZihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oVmFsdWUuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUuc2l6ZSgpKTsKKyAgICBwcmludEJpbmFyeUltcGwoTGFiZWwsIFN0cmluZ1JlZigpLCBWLCBmYWxzZSk7CisgIH0KKworICB2b2lkIHByaW50QmluYXJ5QmxvY2soU3RyaW5nUmVmIExhYmVsLCBBcnJheVJlZjx1aW50OF90PiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFN0YXJ0T2Zmc2V0KSB7CisgICAgcHJpbnRCaW5hcnlJbXBsKExhYmVsLCBTdHJpbmdSZWYoKSwgVmFsdWUsIHRydWUsIFN0YXJ0T2Zmc2V0KTsKKyAgfQorCisgIHZvaWQgcHJpbnRCaW5hcnlCbG9jayhTdHJpbmdSZWYgTGFiZWwsIEFycmF5UmVmPHVpbnQ4X3Q+IFZhbHVlKSB7CisgICAgcHJpbnRCaW5hcnlJbXBsKExhYmVsLCBTdHJpbmdSZWYoKSwgVmFsdWUsIHRydWUpOworICB9CisKKyAgdm9pZCBwcmludEJpbmFyeUJsb2NrKFN0cmluZ1JlZiBMYWJlbCwgU3RyaW5nUmVmIFZhbHVlKSB7CisgICAgYXV0byBWID0gbWFrZUFycmF5UmVmKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihWYWx1ZS5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZS5zaXplKCkpOworICAgIHByaW50QmluYXJ5SW1wbChMYWJlbCwgU3RyaW5nUmVmKCksIFYsIHRydWUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgcHJpbnRPYmplY3QoU3RyaW5nUmVmIExhYmVsLCBjb25zdCBUICZWYWx1ZSkgeworICAgIHN0YXJ0TGluZSgpIDw8IExhYmVsIDw8ICI6ICIgPDwgVmFsdWUgPDwgIlxuIjsKKyAgfQorCisgIHJhd19vc3RyZWFtICZzdGFydExpbmUoKSB7CisgICAgcHJpbnRJbmRlbnQoKTsKKyAgICByZXR1cm4gT1M7CisgIH0KKworICByYXdfb3N0cmVhbSAmZ2V0T1N0cmVhbSgpIHsgcmV0dXJuIE9TOyB9CisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHByaW50VmVyc2lvbkludGVybmFsKFQgVmFsdWUpIHsKKyAgICBnZXRPU3RyZWFtKCkgPDwgVmFsdWU7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUywgdHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gVEFyZ3M+CisgIHZvaWQgcHJpbnRWZXJzaW9uSW50ZXJuYWwoUyBWYWx1ZSwgVCBWYWx1ZTIsIFRBcmdzLi4uIEFyZ3MpIHsKKyAgICBnZXRPU3RyZWFtKCkgPDwgVmFsdWUgPDwgIi4iOworICAgIHByaW50VmVyc2lvbkludGVybmFsKFZhbHVlMiwgQXJncy4uLik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RhdGljIGJvb2wgZmxhZ05hbWUoY29uc3QgRW51bUVudHJ5PFQ+ICZsaHMsIGNvbnN0IEVudW1FbnRyeTxUPiAmcmhzKSB7CisgICAgcmV0dXJuIGxocy5OYW1lIDwgcmhzLk5hbWU7CisgIH0KKworICB2b2lkIHByaW50QmluYXJ5SW1wbChTdHJpbmdSZWYgTGFiZWwsIFN0cmluZ1JlZiBTdHIsIEFycmF5UmVmPHVpbnQ4X3Q+IFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIEJsb2NrLCB1aW50MzJfdCBTdGFydE9mZnNldCA9IDApOworCisgIHJhd19vc3RyZWFtICZPUzsKKyAgaW50IEluZGVudExldmVsOworICBTdHJpbmdSZWYgUHJlZml4OworfTsKKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkCitTY29wZWRQcmludGVyOjpwcmludEhleDxzdXBwb3J0Ojp1bGl0dGxlMTZfdD4oU3RyaW5nUmVmIExhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFZhbHVlKSB7CisgIHN0YXJ0TGluZSgpIDw8IExhYmVsIDw8ICI6ICIgPDwgaGV4KFZhbHVlKSA8PCAiXG4iOworfQorCit0ZW1wbGF0ZTxjaGFyIE9wZW4sIGNoYXIgQ2xvc2U+CitzdHJ1Y3QgRGVsaW1pdGVkU2NvcGUgeworICBleHBsaWNpdCBEZWxpbWl0ZWRTY29wZShTY29wZWRQcmludGVyICZXKSA6IFcoVykgeworICAgIFcuc3RhcnRMaW5lKCkgPDwgT3BlbiA8PCAnXG4nOworICAgIFcuaW5kZW50KCk7CisgIH0KKworICBEZWxpbWl0ZWRTY29wZShTY29wZWRQcmludGVyICZXLCBTdHJpbmdSZWYgTikgOiBXKFcpIHsKKyAgICBXLnN0YXJ0TGluZSgpIDw8IE47CisgICAgaWYgKCFOLmVtcHR5KCkpCisgICAgICBXLmdldE9TdHJlYW0oKSA8PCAnICc7CisgICAgVy5nZXRPU3RyZWFtKCkgPDwgT3BlbiA8PCAnXG4nOworICAgIFcuaW5kZW50KCk7CisgIH0KKworICB+RGVsaW1pdGVkU2NvcGUoKSB7CisgICAgVy51bmluZGVudCgpOworICAgIFcuc3RhcnRMaW5lKCkgPDwgQ2xvc2UgPDwgJ1xuJzsKKyAgfQorCisgIFNjb3BlZFByaW50ZXIgJlc7Cit9OworCit1c2luZyBEaWN0U2NvcGUgPSBEZWxpbWl0ZWRTY29wZTwneycsICd9Jz47Cit1c2luZyBMaXN0U2NvcGUgPSBEZWxpbWl0ZWRTY29wZTwnWycsICddJz47CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU2lnbmFscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NpZ25hbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWM1ZjU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NpZ25hbHMuaApAQCAtMCwwICsxLDc3IEBACisvLz09PS0gbGx2bS9TdXBwb3J0L1NpZ25hbHMuaCAtIFNpZ25hbCBIYW5kbGluZyBzdXBwb3J0IC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBzb21lIGhlbHBmdWwgZnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggdGhlIHBvc3NpYmlsaXR5IG9mCisvLyB1bml4IHNpZ25hbHMgb2NjdXJyaW5nIHdoaWxlIHlvdXIgcHJvZ3JhbSBpcyBydW5uaW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1NJR05BTFNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfU0lHTkFMU19ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFN0cmluZ1JlZjsKK2NsYXNzIHJhd19vc3RyZWFtOworCituYW1lc3BhY2Ugc3lzIHsKKworICAvLy8gVGhpcyBmdW5jdGlvbiBydW5zIGFsbCB0aGUgcmVnaXN0ZXJlZCBpbnRlcnJ1cHQgaGFuZGxlcnMsIGluY2x1ZGluZyB0aGUKKyAgLy8vIHJlbW92YWwgb2YgZmlsZXMgcmVnaXN0ZXJlZCBieSBSZW1vdmVGaWxlT25TaWduYWwuCisgIHZvaWQgUnVuSW50ZXJydXB0SGFuZGxlcnMoKTsKKworICAvLy8gVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgc2lnbmFsIGhhbmRsZXJzIHRvIGVuc3VyZSB0aGF0IGlmIGEgc2lnbmFsIGdldHMKKyAgLy8vIGRlbGl2ZXJlZCB0aGF0IHRoZSBuYW1lZCBmaWxlIGlzIHJlbW92ZWQuCisgIC8vLyBAYnJpZWYgUmVtb3ZlIGEgZmlsZSBpZiBhIGZhdGFsIHNpZ25hbCBvY2N1cnMuCisgIGJvb2wgUmVtb3ZlRmlsZU9uU2lnbmFsKFN0cmluZ1JlZiBGaWxlbmFtZSwgc3RkOjpzdHJpbmcqIEVyck1zZyA9IG51bGxwdHIpOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgYSBmaWxlIGZyb20gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcmVtb3ZlZCBvbgorICAvLy8gc2lnbmFsIGRlbGl2ZXJ5LgorICB2b2lkIERvbnRSZW1vdmVGaWxlT25TaWduYWwoU3RyaW5nUmVmIEZpbGVuYW1lKTsKKworICAvLy8gV2hlbiBhbiBlcnJvciBzaWduYWwgKHN1Y2ggYXMgU0lHQUJSVCBvciBTSUdTRUdWKSBpcyBkZWxpdmVyZWQgdG8gdGhlCisgIC8vLyBwcm9jZXNzLCBwcmludCBhIHN0YWNrIHRyYWNlIGFuZCB0aGVuIGV4aXQuCisgIC8vLyBcYnJpZWYgUHJpbnQgYSBzdGFjayB0cmFjZSBpZiBhIGZhdGFsIHNpZ25hbCBvY2N1cnMuCisgIC8vLyBccGFyYW0gQXJndjAgdGhlIGN1cnJlbnQgYmluYXJ5IG5hbWUsIHVzZWQgdG8gZmluZCB0aGUgc3ltYm9saXplcgorICAvLy8gICAgICAgIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGJpbmFyeSBiZWZvcmUgc2VhcmNoaW5nICRQQVRIOyBjYW4gYmUKKyAgLy8vICAgICAgICBTdHJpbmdSZWYoKSwgaW4gd2hpY2ggY2FzZSB3ZSB3aWxsIG9ubHkgc2VhcmNoICRQQVRILgorICAvLy8gXHBhcmFtIERpc2FibGVDcmFzaFJlcG9ydGluZyBpZiBcYyB0cnVlLCBkaXNhYmxlIHRoZSBub3JtYWwgY3Jhc2gKKyAgLy8vICAgICAgICByZXBvcnRpbmcgbWVjaGFuaXNtcyBvbiB0aGUgdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtLgorICB2b2lkIFByaW50U3RhY2tUcmFjZU9uRXJyb3JTaWduYWwoU3RyaW5nUmVmIEFyZ3YwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEaXNhYmxlQ3Jhc2hSZXBvcnRpbmcgPSBmYWxzZSk7CisKKyAgLy8vIERpc2FibGUgYWxsIHN5c3RlbSBkaWFsb2cgYm94ZXMgdGhhdCBhcHBlYXIgd2hlbiB0aGUgcHJvY2VzcyBjcmFzaGVzLgorICB2b2lkIERpc2FibGVTeXN0ZW1EaWFsb2dzT25DcmFzaCgpOworCisgIC8vLyBcYnJpZWYgUHJpbnQgdGhlIHN0YWNrIHRyYWNlIHVzaW5nIHRoZSBnaXZlbiBcYyByYXdfb3N0cmVhbSBvYmplY3QuCisgIHZvaWQgUHJpbnRTdGFja1RyYWNlKHJhd19vc3RyZWFtICZPUyk7CisKKyAgLy8gUnVuIGFsbCByZWdpc3RlcmVkIHNpZ25hbCBoYW5kbGVycy4KKyAgdm9pZCBSdW5TaWduYWxIYW5kbGVycygpOworCisgIC8vLyBBZGRTaWduYWxIYW5kbGVyIC0gQWRkIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gYW4gYWJvcnQva2lsbCBzaWduYWwKKyAgLy8vIGlzIGRlbGl2ZXJlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBoYW5kbGVyIGNhbiBoYXZlIGEgY29va2llIHBhc3NlZCB0byBpdAorICAvLy8gdG8gaWRlbnRpZnkgd2hhdCBpbnN0YW5jZSBvZiB0aGUgaGFuZGxlciBpdCBpcy4KKyAgdm9pZCBBZGRTaWduYWxIYW5kbGVyKHZvaWQgKCpGblB0cikodm9pZCAqKSwgdm9pZCAqQ29va2llKTsKKworICAvLy8gVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgdXNlciAiaW50ZXJydXB0cyIKKyAgLy8vIHRoZSBwcm9ncmFtICh0eXBpY2FsbHkgYnkgcHJlc3NpbmcgY3RybC1jKS4gIFdoZW4gdGhlIHVzZXIgaW50ZXJydXB0cyB0aGUKKyAgLy8vIHByb2dyYW0sIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0IGZ1bmN0aW9uIGlzIGNhbGxlZCBpbnN0ZWFkIG9mIHRoZSBwcm9ncmFtCisgIC8vLyBiZWluZyBraWxsZWQsIGFuZCB0aGUgaW50ZXJydXB0IGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQuICBOb3RlCisgIC8vLyB0aGF0IGludGVycnVwdCBmdW5jdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIGNhbGwgYW55IG5vbi1yZWVudHJhbnQKKyAgLy8vIGZ1bmN0aW9ucy4gIEFuIG51bGwgaW50ZXJydXB0IGZ1bmN0aW9uIHBvaW50ZXIgZGlzYWJsZXMgdGhlIGN1cnJlbnQKKyAgLy8vIGluc3RhbGxlZCBmdW5jdGlvbi4gIE5vdGUgYWxzbyB0aGF0IHRoZSBoYW5kbGVyIG1heSBiZSBleGVjdXRlZCBvbiBhCisgIC8vLyBkaWZmZXJlbnQgdGhyZWFkIG9uIHNvbWUgcGxhdGZvcm1zLgorICAvLy8gQGJyaWVmIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gY3RybC1jIGlzIHByZXNzZWQuCisgIHZvaWQgU2V0SW50ZXJydXB0RnVuY3Rpb24odm9pZCAoKklGKSgpKTsKK30gLy8gRW5kIHN5cyBuYW1lc3BhY2UKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NvbGFyaXMvc3lzL3JlZ3NldC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NvbGFyaXMvc3lzL3JlZ3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNjllYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU29sYXJpcy9zeXMvcmVnc2V0LmgKQEAgLTAsMCArMSwzOSBAQAorLyo9PT0tIGxsdm0vU3VwcG9ydC9Tb2xhcmlzL3N5cy9yZWdzZXQuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09KgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyAqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qCisgKgorICogVGhpcyBmaWxlIHdvcmtzIGFyb3VuZCBleGNlc3NpdmUgbmFtZSBzcGFjZSBwb2xsdXRpb24gZnJvbSB0aGUgc3lzdGVtIGhlYWRlcgorICogb24gU29sYXJpcyBob3N0cy4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9TT0xBUklTX1NZU19SRUdTRVRfSAorCisjaW5jbHVkZV9uZXh0IDxzeXMvcmVnc2V0Lmg+CisKKyN1bmRlZiBDUworI3VuZGVmIERTCisjdW5kZWYgRVMKKyN1bmRlZiBGUworI3VuZGVmIEdTCisjdW5kZWYgU1MKKyN1bmRlZiBFQVgKKyN1bmRlZiBFQ1gKKyN1bmRlZiBFRFgKKyN1bmRlZiBFQlgKKyN1bmRlZiBFU1AKKyN1bmRlZiBFQlAKKyN1bmRlZiBFU0kKKyN1bmRlZiBFREkKKyN1bmRlZiBFSVAKKyN1bmRlZiBVRVNQCisjdW5kZWYgRUZMCisjdW5kZWYgRVJSCisjdW5kZWYgVFJBUE5PCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NvdXJjZU1nci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NvdXJjZU1nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOGJmODUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU291cmNlTWdyLmgKQEAgLTAsMCArMSwyODIgQEAKKy8vPT09LSBTb3VyY2VNZ3IuaCAtIE1hbmFnZXIgZm9yIFNvdXJjZSBCdWZmZXJzICYgRGlhZ25vc3RpY3MgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBTTURpYWdub3N0aWMgYW5kIFNvdXJjZU1nciBjbGFzc2VzLiAgVGhpcworLy8gcHJvdmlkZXMgYSBzaW1wbGUgc3Vic3RyYXRlIGZvciBkaWFnbm9zdGljcywgI2luY2x1ZGUgaGFuZGxpbmcsIGFuZCBvdGhlciBsb3cKKy8vIGxldmVsIHRoaW5ncyBmb3Igc2ltcGxlIHBhcnNlcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfU09VUkNFTUdSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1NPVVJDRU1HUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TTUxvYy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBTTURpYWdub3N0aWM7CitjbGFzcyBTTUZpeEl0OworCisvLy8gVGhpcyBvd25zIHRoZSBmaWxlcyByZWFkIGJ5IGEgcGFyc2VyLCBoYW5kbGVzIGluY2x1ZGUgc3RhY2tzLAorLy8vIGFuZCBoYW5kbGVzIGRpYWdub3N0aWMgd3JhbmdsaW5nLgorY2xhc3MgU291cmNlTWdyIHsKK3B1YmxpYzoKKyAgZW51bSBEaWFnS2luZCB7CisgICAgREtfRXJyb3IsCisgICAgREtfV2FybmluZywKKyAgICBES19SZW1hcmssCisgICAgREtfTm90ZSwKKyAgfTsKKworICAvLy8gQ2xpZW50cyB0aGF0IHdhbnQgdG8gaGFuZGxlIHRoZWlyIG93biBkaWFnbm9zdGljcyBpbiBhIGN1c3RvbSB3YXkgY2FuCisgIC8vLyByZWdpc3RlciBhIGZ1bmN0aW9uIHBvaW50ZXIrY29udGV4dCBhcyBhIGRpYWdub3N0aWMgaGFuZGxlci4KKyAgLy8vIEl0IGdldHMgY2FsbGVkIGVhY2ggdGltZSBQcmludE1lc3NhZ2UgaXMgaW52b2tlZC4KKyAgdXNpbmcgRGlhZ0hhbmRsZXJUeSA9IHZvaWQgKCopKGNvbnN0IFNNRGlhZ25vc3RpYyAmLCB2b2lkICpDb250ZXh0KTsKKworcHJpdmF0ZToKKyAgc3RydWN0IFNyY0J1ZmZlciB7CisgICAgLy8vIFRoZSBtZW1vcnkgYnVmZmVyIGZvciB0aGUgZmlsZS4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBCdWZmZXI7CisKKyAgICAvLy8gVGhpcyBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIHBhcmVudCBpbmNsdWRlLCBvciBudWxsIGlmIGF0IHRoZSB0b3AgbGV2ZWwuCisgICAgU01Mb2MgSW5jbHVkZUxvYzsKKyAgfTsKKworICAvLy8gVGhpcyBpcyBhbGwgb2YgdGhlIGJ1ZmZlcnMgdGhhdCB3ZSBhcmUgcmVhZGluZyBmcm9tLgorICBzdGQ6OnZlY3RvcjxTcmNCdWZmZXI+IEJ1ZmZlcnM7CisKKyAgLy8gVGhpcyBpcyB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyB3ZSBzaG91bGQgc2VhcmNoIGZvciBpbmNsdWRlIGZpbGVzIGluLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gSW5jbHVkZURpcmVjdG9yaWVzOworCisgIC8vLyBUaGlzIGlzIGEgY2FjaGUgZm9yIGxpbmUgbnVtYmVyIHF1ZXJpZXMsIGl0cyBpbXBsZW1lbnRhdGlvbiBpcyByZWFsbHkKKyAgLy8vIHByaXZhdGUgdG8gU291cmNlTWdyLmNwcC4KKyAgbXV0YWJsZSB2b2lkICpMaW5lTm9DYWNoZSA9IG51bGxwdHI7CisKKyAgRGlhZ0hhbmRsZXJUeSBEaWFnSGFuZGxlciA9IG51bGxwdHI7CisgIHZvaWQgKkRpYWdDb250ZXh0ID0gbnVsbHB0cjsKKworICBib29sIGlzVmFsaWRCdWZmZXJJRCh1bnNpZ25lZCBpKSBjb25zdCB7IHJldHVybiBpICYmIGkgPD0gQnVmZmVycy5zaXplKCk7IH0KKworcHVibGljOgorICBTb3VyY2VNZ3IoKSA9IGRlZmF1bHQ7CisgIFNvdXJjZU1ncihjb25zdCBTb3VyY2VNZ3IgJikgPSBkZWxldGU7CisgIFNvdXJjZU1nciAmb3BlcmF0b3I9KGNvbnN0IFNvdXJjZU1nciAmKSA9IGRlbGV0ZTsKKyAgflNvdXJjZU1ncigpOworCisgIHZvaWQgc2V0SW5jbHVkZURpcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZEaXJzKSB7CisgICAgSW5jbHVkZURpcmVjdG9yaWVzID0gRGlyczsKKyAgfQorCisgIC8vLyBTcGVjaWZ5IGEgZGlhZ25vc3RpYyBoYW5kbGVyIHRvIGJlIGludm9rZWQgZXZlcnkgdGltZSBQcmludE1lc3NhZ2UgaXMKKyAgLy8vIGNhbGxlZC4gXHAgQ3R4IGlzIHBhc3NlZCBpbnRvIHRoZSBoYW5kbGVyIHdoZW4gaXQgaXMgaW52b2tlZC4KKyAgdm9pZCBzZXREaWFnSGFuZGxlcihEaWFnSGFuZGxlclR5IERILCB2b2lkICpDdHggPSBudWxscHRyKSB7CisgICAgRGlhZ0hhbmRsZXIgPSBESDsKKyAgICBEaWFnQ29udGV4dCA9IEN0eDsKKyAgfQorCisgIERpYWdIYW5kbGVyVHkgZ2V0RGlhZ0hhbmRsZXIoKSBjb25zdCB7IHJldHVybiBEaWFnSGFuZGxlcjsgfQorICB2b2lkICpnZXREaWFnQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIERpYWdDb250ZXh0OyB9CisKKyAgY29uc3QgU3JjQnVmZmVyICZnZXRCdWZmZXJJbmZvKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNWYWxpZEJ1ZmZlcklEKGkpKTsKKyAgICByZXR1cm4gQnVmZmVyc1tpIC0gMV07CisgIH0KKworICBjb25zdCBNZW1vcnlCdWZmZXIgKmdldE1lbW9yeUJ1ZmZlcih1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzVmFsaWRCdWZmZXJJRChpKSk7CisgICAgcmV0dXJuIEJ1ZmZlcnNbaSAtIDFdLkJ1ZmZlci5nZXQoKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUJ1ZmZlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIEJ1ZmZlcnMuc2l6ZSgpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TWFpbkZpbGVJRCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0TnVtQnVmZmVycygpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIFNNTG9jIGdldFBhcmVudEluY2x1ZGVMb2ModW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpc1ZhbGlkQnVmZmVySUQoaSkpOworICAgIHJldHVybiBCdWZmZXJzW2kgLSAxXS5JbmNsdWRlTG9jOworICB9CisKKyAgLy8vIEFkZCBhIG5ldyBzb3VyY2UgYnVmZmVyIHRvIHRoaXMgc291cmNlIG1hbmFnZXIuIFRoaXMgdGFrZXMgb3duZXJzaGlwIG9mCisgIC8vLyB0aGUgbWVtb3J5IGJ1ZmZlci4KKyAgdW5zaWduZWQgQWRkTmV3U291cmNlQnVmZmVyKHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUxvYyBJbmNsdWRlTG9jKSB7CisgICAgU3JjQnVmZmVyIE5COworICAgIE5CLkJ1ZmZlciA9IHN0ZDo6bW92ZShGKTsKKyAgICBOQi5JbmNsdWRlTG9jID0gSW5jbHVkZUxvYzsKKyAgICBCdWZmZXJzLnB1c2hfYmFjayhzdGQ6Om1vdmUoTkIpKTsKKyAgICByZXR1cm4gQnVmZmVycy5zaXplKCk7CisgIH0KKworICAvLy8gU2VhcmNoIGZvciBhIGZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG9yIGluCisgIC8vLyBvbmUgb2YgdGhlIEluY2x1ZGVEaXJzLgorICAvLy8KKyAgLy8vIElmIG5vIGZpbGUgaXMgZm91bmQsIHRoaXMgcmV0dXJucyAwLCBvdGhlcndpc2UgaXQgcmV0dXJucyB0aGUgYnVmZmVyIElECisgIC8vLyBvZiB0aGUgc3RhY2tlZCBmaWxlLiBUaGUgZnVsbCBwYXRoIHRvIHRoZSBpbmNsdWRlZCBmaWxlIGNhbiBiZSBmb3VuZCBpbgorICAvLy8gXHAgSW5jbHVkZWRGaWxlLgorICB1bnNpZ25lZCBBZGRJbmNsdWRlRmlsZShjb25zdCBzdGQ6OnN0cmluZyAmRmlsZW5hbWUsIFNNTG9jIEluY2x1ZGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZJbmNsdWRlZEZpbGUpOworCisgIC8vLyBSZXR1cm4gdGhlIElEIG9mIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAvLy8KKyAgLy8vIDAgaXMgcmV0dXJuZWQgaWYgdGhlIGJ1ZmZlciBpcyBub3QgZm91bmQuCisgIHVuc2lnbmVkIEZpbmRCdWZmZXJDb250YWluaW5nTG9jKFNNTG9jIExvYykgY29uc3Q7CisKKyAgLy8vIEZpbmQgdGhlIGxpbmUgbnVtYmVyIGZvciB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGluIHRoZSBzcGVjaWZpZWQgZmlsZS4KKyAgLy8vIFRoaXMgaXMgbm90IGEgZmFzdCBtZXRob2QuCisgIHVuc2lnbmVkIEZpbmRMaW5lTnVtYmVyKFNNTG9jIExvYywgdW5zaWduZWQgQnVmZmVySUQgPSAwKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExpbmVBbmRDb2x1bW4oTG9jLCBCdWZmZXJJRCkuZmlyc3Q7CisgIH0KKworICAvLy8gRmluZCB0aGUgbGluZSBhbmQgY29sdW1uIG51bWJlciBmb3IgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpbiB0aGUKKyAgLy8vIHNwZWNpZmllZCBmaWxlLiBUaGlzIGlzIG5vdCBhIGZhc3QgbWV0aG9kLgorICBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiBnZXRMaW5lQW5kQ29sdW1uKFNNTG9jIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCdWZmZXJJRCA9IDApIGNvbnN0OworCisgIC8vLyBFbWl0IGEgbWVzc2FnZSBhYm91dCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBzdHJpbmcuCisgIC8vLworICAvLy8gXHBhcmFtIFNob3dDb2xvcnMgRGlzcGxheSBjb2xvcmVkIG1lc3NhZ2VzIGlmIG91dHB1dCBpcyBhIHRlcm1pbmFsIGFuZAorICAvLy8gdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlciBpcyB1c2VkLgorICB2b2lkIFByaW50TWVzc2FnZShyYXdfb3N0cmVhbSAmT1MsIFNNTG9jIExvYywgRGlhZ0tpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk1zZywKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U01SYW5nZT4gUmFuZ2VzID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U01GaXhJdD4gRml4SXRzID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG93Q29sb3JzID0gdHJ1ZSkgY29uc3Q7CisKKyAgLy8vIEVtaXRzIGEgZGlhZ25vc3RpYyB0byBsbHZtOjplcnJzKCkuCisgIHZvaWQgUHJpbnRNZXNzYWdlKFNNTG9jIExvYywgRGlhZ0tpbmQgS2luZCwgY29uc3QgVHdpbmUgJk1zZywKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U01SYW5nZT4gUmFuZ2VzID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U01GaXhJdD4gRml4SXRzID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG93Q29sb3JzID0gdHJ1ZSkgY29uc3Q7CisKKyAgLy8vIEVtaXRzIGEgbWFudWFsbHktY29uc3RydWN0ZWQgZGlhZ25vc3RpYyB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KKyAgLy8vCisgIC8vLyBccGFyYW0gU2hvd0NvbG9ycyBEaXNwbGF5IGNvbG9yZWQgbWVzc2FnZXMgaWYgb3V0cHV0IGlzIGEgdGVybWluYWwgYW5kCisgIC8vLyB0aGUgZGVmYXVsdCBlcnJvciBoYW5kbGVyIGlzIHVzZWQuCisgIHZvaWQgUHJpbnRNZXNzYWdlKHJhd19vc3RyZWFtICZPUywgY29uc3QgU01EaWFnbm9zdGljICZEaWFnbm9zdGljLAorICAgICAgICAgICAgICAgICAgICBib29sIFNob3dDb2xvcnMgPSB0cnVlKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGFuIFNNRGlhZ25vc3RpYyBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIHdpdGggdGhlIHNwZWNpZmllZAorICAvLy8gc3RyaW5nLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNc2cgSWYgbm9uLW51bGwsIHRoZSBraW5kIG9mIG1lc3NhZ2UgKGUuZy4sICJlcnJvciIpIHdoaWNoIGlzCisgIC8vLyBwcmVmaXhlZCB0byB0aGUgbWVzc2FnZS4KKyAgU01EaWFnbm9zdGljIEdldE1lc3NhZ2UoU01Mb2MgTG9jLCBEaWFnS2luZCBLaW5kLCBjb25zdCBUd2luZSAmTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTTVJhbmdlPiBSYW5nZXMgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTTUZpeEl0PiBGaXhJdHMgPSBOb25lKSBjb25zdDsKKworICAvLy8gUHJpbnRzIHRoZSBuYW1lcyBvZiBpbmNsdWRlZCBmaWxlcyBhbmQgdGhlIGxpbmUgb2YgdGhlIGZpbGUgdGhleSB3ZXJlCisgIC8vLyBpbmNsdWRlZCBmcm9tLiBBIGRpYWdub3N0aWMgaGFuZGxlciBjYW4gdXNlIHRoaXMgYmVmb3JlIHByaW50aW5nIGl0cworICAvLy8gY3VzdG9tIGZvcm1hdHRlZCBtZXNzYWdlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJbmNsdWRlTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgaW5jbHVkZS4KKyAgLy8vIFxwYXJhbSBPUyB0aGUgcmF3X29zdHJlYW0gdG8gcHJpbnQgb24uCisgIHZvaWQgUHJpbnRJbmNsdWRlU3RhY2soU01Mb2MgSW5jbHVkZUxvYywgcmF3X29zdHJlYW0gJk9TKSBjb25zdDsKK307CisKKy8vLyBSZXByZXNlbnRzIGEgc2luZ2xlIGZpeGl0LCBhIHJlcGxhY2VtZW50IG9mIG9uZSByYW5nZSBvZiB0ZXh0IHdpdGggYW5vdGhlci4KK2NsYXNzIFNNRml4SXQgeworICBTTVJhbmdlIFJhbmdlOworCisgIHN0ZDo6c3RyaW5nIFRleHQ7CisKK3B1YmxpYzoKKyAgLy8gRklYTUU6IFR3aW5lLnN0cigpIGlzIG5vdCB2ZXJ5IGVmZmljaWVudC4KKyAgU01GaXhJdChTTUxvYyBMb2MsIGNvbnN0IFR3aW5lICZJbnNlcnRpb24pCisgICAgOiBSYW5nZShMb2MsIExvYyksIFRleHQoSW5zZXJ0aW9uLnN0cigpKSB7CisgICAgYXNzZXJ0KExvYy5pc1ZhbGlkKCkpOworICB9CisKKyAgLy8gRklYTUU6IFR3aW5lLnN0cigpIGlzIG5vdCB2ZXJ5IGVmZmljaWVudC4KKyAgU01GaXhJdChTTVJhbmdlIFIsIGNvbnN0IFR3aW5lICZSZXBsYWNlbWVudCkKKyAgICA6IFJhbmdlKFIpLCBUZXh0KFJlcGxhY2VtZW50LnN0cigpKSB7CisgICAgYXNzZXJ0KFIuaXNWYWxpZCgpKTsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRUZXh0KCkgY29uc3QgeyByZXR1cm4gVGV4dDsgfQorICBTTVJhbmdlIGdldFJhbmdlKCkgY29uc3QgeyByZXR1cm4gUmFuZ2U7IH0KKworICBib29sIG9wZXJhdG9yPChjb25zdCBTTUZpeEl0ICZPdGhlcikgY29uc3QgeworICAgIGlmIChSYW5nZS5TdGFydC5nZXRQb2ludGVyKCkgIT0gT3RoZXIuUmFuZ2UuU3RhcnQuZ2V0UG9pbnRlcigpKQorICAgICAgcmV0dXJuIFJhbmdlLlN0YXJ0LmdldFBvaW50ZXIoKSA8IE90aGVyLlJhbmdlLlN0YXJ0LmdldFBvaW50ZXIoKTsKKyAgICBpZiAoUmFuZ2UuRW5kLmdldFBvaW50ZXIoKSAhPSBPdGhlci5SYW5nZS5FbmQuZ2V0UG9pbnRlcigpKQorICAgICAgcmV0dXJuIFJhbmdlLkVuZC5nZXRQb2ludGVyKCkgPCBPdGhlci5SYW5nZS5FbmQuZ2V0UG9pbnRlcigpOworICAgIHJldHVybiBUZXh0IDwgT3RoZXIuVGV4dDsKKyAgfQorfTsKKworLy8vIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGVuY2Fwc3VsYXRlIG9uZSBkaWFnbm9zdGljIHJlcG9ydCwgYWxsb3dpbmcKKy8vLyBwcmludGluZyB0byBhIHJhd19vc3RyZWFtIGFzIGEgY2FyZXQgZGlhZ25vc3RpYy4KK2NsYXNzIFNNRGlhZ25vc3RpYyB7CisgIGNvbnN0IFNvdXJjZU1nciAqU00gPSBudWxscHRyOworICBTTUxvYyBMb2M7CisgIHN0ZDo6c3RyaW5nIEZpbGVuYW1lOworICBpbnQgTGluZU5vID0gMDsKKyAgaW50IENvbHVtbk5vID0gMDsKKyAgU291cmNlTWdyOjpEaWFnS2luZCBLaW5kID0gU291cmNlTWdyOjpES19FcnJvcjsKKyAgc3RkOjpzdHJpbmcgTWVzc2FnZSwgTGluZUNvbnRlbnRzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPj4gUmFuZ2VzOworICBTbWFsbFZlY3RvcjxTTUZpeEl0LCA0PiBGaXhJdHM7CisKK3B1YmxpYzoKKyAgLy8gTnVsbCBkaWFnbm9zdGljLgorICBTTURpYWdub3N0aWMoKSA9IGRlZmF1bHQ7CisgIC8vIERpYWdub3N0aWMgd2l0aCBubyBsb2NhdGlvbiAoZS5nLiBmaWxlIG5vdCBmb3VuZCwgY29tbWFuZCBsaW5lIGFyZyBlcnJvcikuCisgIFNNRGlhZ25vc3RpYyhTdHJpbmdSZWYgZmlsZW5hbWUsIFNvdXJjZU1ncjo6RGlhZ0tpbmQgS25kLCBTdHJpbmdSZWYgTXNnKQorICAgIDogRmlsZW5hbWUoZmlsZW5hbWUpLCBMaW5lTm8oLTEpLCBDb2x1bW5ObygtMSksIEtpbmQoS25kKSwgTWVzc2FnZShNc2cpIHt9CisKKyAgLy8gRGlhZ25vc3RpYyB3aXRoIGEgbG9jYXRpb24uCisgIFNNRGlhZ25vc3RpYyhjb25zdCBTb3VyY2VNZ3IgJnNtLCBTTUxvYyBMLCBTdHJpbmdSZWYgRk4sCisgICAgICAgICAgICAgICBpbnQgTGluZSwgaW50IENvbCwgU291cmNlTWdyOjpEaWFnS2luZCBLaW5kLAorICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1zZywgU3RyaW5nUmVmIExpbmVTdHIsCisgICAgICAgICAgICAgICBBcnJheVJlZjxzdGQ6OnBhaXI8dW5zaWduZWQsdW5zaWduZWQ+PiBSYW5nZXMsCisgICAgICAgICAgICAgICBBcnJheVJlZjxTTUZpeEl0PiBGaXhJdHMgPSBOb25lKTsKKworICBjb25zdCBTb3VyY2VNZ3IgKmdldFNvdXJjZU1ncigpIGNvbnN0IHsgcmV0dXJuIFNNOyB9CisgIFNNTG9jIGdldExvYygpIGNvbnN0IHsgcmV0dXJuIExvYzsgfQorICBTdHJpbmdSZWYgZ2V0RmlsZW5hbWUoKSBjb25zdCB7IHJldHVybiBGaWxlbmFtZTsgfQorICBpbnQgZ2V0TGluZU5vKCkgY29uc3QgeyByZXR1cm4gTGluZU5vOyB9CisgIGludCBnZXRDb2x1bW5ObygpIGNvbnN0IHsgcmV0dXJuIENvbHVtbk5vOyB9CisgIFNvdXJjZU1ncjo6RGlhZ0tpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKyAgU3RyaW5nUmVmIGdldE1lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBNZXNzYWdlOyB9CisgIFN0cmluZ1JlZiBnZXRMaW5lQ29udGVudHMoKSBjb25zdCB7IHJldHVybiBMaW5lQ29udGVudHM7IH0KKyAgQXJyYXlSZWY8c3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4+IGdldFJhbmdlcygpIGNvbnN0IHsgcmV0dXJuIFJhbmdlczsgfQorCisgIHZvaWQgYWRkRml4SXQoY29uc3QgU01GaXhJdCAmSGludCkgeworICAgIEZpeEl0cy5wdXNoX2JhY2soSGludCk7CisgIH0KKworICBBcnJheVJlZjxTTUZpeEl0PiBnZXRGaXhJdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIEZpeEl0czsKKyAgfQorCisgIHZvaWQgcHJpbnQoY29uc3QgY2hhciAqUHJvZ05hbWUsIHJhd19vc3RyZWFtICZTLCBib29sIFNob3dDb2xvcnMgPSB0cnVlLAorICAgICAgICAgICAgIGJvb2wgU2hvd0tpbmRMYWJlbCA9IHRydWUpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9TT1VSQ0VNR1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NwZWNpYWxDYXNlTGlzdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NwZWNpYWxDYXNlTGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNjJmYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU3BlY2lhbENhc2VMaXN0LmgKQEAgLTAsMCArMSwxNTUgQEAKKy8vPT09LS0gU3BlY2lhbENhc2VMaXN0LmggLSBzcGVjaWFsIGNhc2UgbGlzdCBmb3Igc2FuaXRpemVycyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyB1c2VkIHRvIHBhcnNlIHVzZXItcHJvdmlkZWQgdGV4dCBmaWxlcyB3aXRoCisvLyAic3BlY2lhbCBjYXNlIGxpc3RzIiBmb3IgY29kZSBzYW5pdGl6ZXJzLiBTdWNoIGZpbGVzIGFyZSB1c2VkIHRvCisvLyBkZWZpbmUgYW4gIkFCSSBsaXN0IiBmb3IgRGF0YUZsb3dTYW5pdGl6ZXIgYW5kIGJsYWNrbGlzdHMgZm9yIHNhbml0aXplcnMKKy8vIGxpa2UgQWRkcmVzc1Nhbml0aXplciBvciBVbmRlZmluZWRCZWhhdmlvclNhbml0aXplci4KKy8vCisvLyBFbXB0eSBsaW5lcyBhbmQgbGluZXMgc3RhcnRpbmcgd2l0aCAiIyIgYXJlIGlnbm9yZWQuIFNlY3Rpb25zIGFyZSBkZWZpbmVkCisvLyB1c2luZyBhICdbc2VjdGlvbl9uYW1lXScgaGVhZGVyIGFuZCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHNhbml0aXplcnMgdGhlCisvLyBlbnRyaWVzIGJlbG93IGl0IGFwcGx5IHRvLiBTZWN0aW9uIG5hbWVzIGFyZSByZWd1bGFyIGV4cHJlc3Npb25zLCBhbmQKKy8vIGVudHJpZXMgd2l0aG91dCBhIHNlY3Rpb24gaGVhZGVyIG1hdGNoIGFsbCBzZWN0aW9ucyAoZS5nLiBhbiAnWypdJyBoZWFkZXIKKy8vIGlzIGFzc3VtZWQuKQorLy8gVGhlIHJlbWFpbmluZyBsaW5lcyBzaG91bGQgaGF2ZSB0aGUgZm9ybToKKy8vICAgcHJlZml4OndpbGRjYXJkX2V4cHJlc3Npb25bPWNhdGVnb3J5XQorLy8gSWYgY2F0ZWdvcnkgaXMgbm90IHNwZWNpZmllZCwgaXQgaXMgYXNzdW1lZCB0byBiZSBlbXB0eSBzdHJpbmcuCisvLyBEZWZpbml0aW9ucyBvZiAicHJlZml4IiBhbmQgImNhdGVnb3J5IiBhcmUgc2FuaXRpemVyLXNwZWNpZmljLiBGb3IgZXhhbXBsZSwKKy8vIHNhbml0aXplciBibGFja2xpc3RzIHN1cHBvcnQgcHJlZml4ZXMgInNyYyIsICJmdW4iIGFuZCAiZ2xvYmFsIi4KKy8vIFdpbGRjYXJkIGV4cHJlc3Npb25zIGRlZmluZSwgcmVzcGVjdGl2ZWx5LCBzb3VyY2UgZmlsZXMsIGZ1bmN0aW9ucyBvcgorLy8gZ2xvYmFscyB3aGljaCBzaG91bGRuJ3QgYmUgaW5zdHJ1bWVudGVkLgorLy8gRXhhbXBsZXMgb2YgY2F0ZWdvcmllczoKKy8vICAgImZ1bmN0aW9uYWwiOiB1c2VkIGluIERGU2FuIHRvIGxpc3QgZnVuY3Rpb25zIHdpdGggcHVyZSBmdW5jdGlvbmFsCisvLyAgICAgICAgICAgICAgICAgc2VtYW50aWNzLgorLy8gICAiaW5pdCI6IHVzZWQgaW4gQVNhbiBibGFja2xpc3QgdG8gZGlzYWJsZSBpbml0aWFsaXphdGlvbi1vcmRlciBidWdzCisvLyAgICAgICAgICAgZGV0ZWN0aW9uIGZvciBjZXJ0YWluIGdsb2JhbHMgb3Igc291cmNlIGZpbGVzLgorLy8gRnVsbCBzcGVjaWFsIGNhc2UgbGlzdCBmaWxlIGV4YW1wbGU6CisvLyAtLS0KKy8vIFthZGRyZXNzXQorLy8gIyBCbGFja2xpc3RlZCBpdGVtczoKKy8vIGZ1bjoqX1pONGJhc2U2c3VidGxlKgorLy8gZ2xvYmFsOipnbG9iYWxfd2l0aF9iYWRfYWNjZXNzX29yX2luaXRpYWxpemF0aW9uKgorLy8gZ2xvYmFsOipnbG9iYWxfd2l0aF9pbml0aWFsaXphdGlvbl9pc3N1ZXMqPWluaXQKKy8vIHR5cGU6Kk5hbWVzcGFjZTo6Q2xhc3NOYW1lKj1pbml0CisvLyBzcmM6ZmlsZV93aXRoX3RyaWNreV9jb2RlLmNjCisvLyBzcmM6aWdub3JlLWdsb2JhbC1pbml0aWFsaXplcnMtaXNzdWVzLmNjPWluaXQKKy8vCisvLyBbZGF0YWZsb3ddCisvLyAjIEZ1bmN0aW9ucyB3aXRoIHB1cmUgZnVuY3Rpb25hbCBzZW1hbnRpY3M6CisvLyBmdW46Y29zPWZ1bmN0aW9uYWwKKy8vIGZ1bjpzaW49ZnVuY3Rpb25hbAorLy8gLS0tCisvLyBOb3RlIHRoYXQgdGhlIHdpbGQgY2FyZCBpcyBpbiBmYWN0IGFuIGxsdm06OlJlZ2V4LCBidXQgKiBpcyBhdXRvbWF0aWNhbGx5CisvLyByZXBsYWNlZCB3aXRoIC4qCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfU1BFQ0lBTENBU0VMSVNUX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1NQRUNJQUxDQVNFTElTVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUmVnZXguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVHJpZ3JhbUluZGV4LmgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTWVtb3J5QnVmZmVyOworY2xhc3MgUmVnZXg7CitjbGFzcyBTdHJpbmdSZWY7CisKK2NsYXNzIFNwZWNpYWxDYXNlTGlzdCB7CitwdWJsaWM6CisgIC8vLyBQYXJzZXMgdGhlIHNwZWNpYWwgY2FzZSBsaXN0IGVudHJpZXMgZnJvbSBmaWxlcy4gT24gZmFpbHVyZSwgcmV0dXJucworICAvLy8gMCBhbmQgd3JpdGVzIGFuIGVycm9yIG1lc3NhZ2UgdG8gc3RyaW5nLgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFNwZWNpYWxDYXNlTGlzdD4KKyAgY3JlYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmUGF0aHMsIHN0ZDo6c3RyaW5nICZFcnJvcik7CisgIC8vLyBQYXJzZXMgdGhlIHNwZWNpYWwgY2FzZSBsaXN0IGZyb20gYSBtZW1vcnkgYnVmZmVyLiBPbiBmYWlsdXJlLCByZXR1cm5zCisgIC8vLyAwIGFuZCB3cml0ZXMgYW4gZXJyb3IgbWVzc2FnZSB0byBzdHJpbmcuCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8U3BlY2lhbENhc2VMaXN0PiBjcmVhdGUoY29uc3QgTWVtb3J5QnVmZmVyICpNQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmRXJyb3IpOworICAvLy8gUGFyc2VzIHRoZSBzcGVjaWFsIGNhc2UgbGlzdCBlbnRyaWVzIGZyb20gZmlsZXMuIE9uIGZhaWx1cmUsIHJlcG9ydHMgYQorICAvLy8gZmF0YWwgZXJyb3IuCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8U3BlY2lhbENhc2VMaXN0PgorICBjcmVhdGVPckRpZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJlBhdGhzKTsKKworICB+U3BlY2lhbENhc2VMaXN0KCk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSwgaWYgc3BlY2lhbCBjYXNlIGxpc3QgY29udGFpbnMgYSBsaW5lCisgIC8vLyBcY29kZQorICAvLy8gICBAUHJlZml4OjxFPj1AQ2F0ZWdvcnkKKyAgLy8vIFxlbmRjb2RlCisgIC8vLyB3aGVyZSBAUXVlcnkgc2F0aXNmaWVzIHdpbGRjYXJkIGV4cHJlc3Npb24gPEU+IGluIGEgZ2l2ZW4gQFNlY3Rpb24uCisgIGJvb2wgaW5TZWN0aW9uKFN0cmluZ1JlZiBTZWN0aW9uLCBTdHJpbmdSZWYgUHJlZml4LCBTdHJpbmdSZWYgUXVlcnksCisgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDYXRlZ29yeSA9IFN0cmluZ1JlZigpKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgbGluZSBudW1iZXIgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lhbCBjYXNlIGxpc3QgZW50cnkgaWYKKyAgLy8vIHRoZSBzcGVjaWFsIGNhc2UgbGlzdCBjb250YWlucyBhIGxpbmUKKyAgLy8vIFxjb2RlCisgIC8vLyAgIEBQcmVmaXg6PEU+PUBDYXRlZ29yeQorICAvLy8gXGVuZGNvZGUKKyAgLy8vIHdoZXJlIEBRdWVyeSBzYXRpc2ZpZXMgd2lsZGNhcmQgZXhwcmVzc2lvbiA8RT4gaW4gYSBnaXZlbiBAU2VjdGlvbi4KKyAgLy8vIFJldHVybnMgemVybyBpZiB0aGVyZSBpcyBubyBibGFja2xpc3QgZW50cnkgY29ycmVzcG9uZGluZyB0byB0aGlzCisgIC8vLyBleHByZXNzaW9uLgorICB1bnNpZ25lZCBpblNlY3Rpb25CbGFtZShTdHJpbmdSZWYgU2VjdGlvbiwgU3RyaW5nUmVmIFByZWZpeCwgU3RyaW5nUmVmIFF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQ2F0ZWdvcnkgPSBTdHJpbmdSZWYoKSkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgLy8gSW1wbGVtZW50YXRpb25zIG9mIHRoZSBjcmVhdGUqKCkgZnVuY3Rpb25zIHRoYXQgY2FuIGFsc28gYmUgdXNlZCBieSBkZXJpdmVkCisgIC8vIGNsYXNzZXMuCisgIGJvb2wgY3JlYXRlSW50ZXJuYWwoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZQYXRocywKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmRXJyb3IpOworICBib29sIGNyZWF0ZUludGVybmFsKGNvbnN0IE1lbW9yeUJ1ZmZlciAqTUIsIHN0ZDo6c3RyaW5nICZFcnJvcik7CisKKyAgU3BlY2lhbENhc2VMaXN0KCkgPSBkZWZhdWx0OworICBTcGVjaWFsQ2FzZUxpc3QoU3BlY2lhbENhc2VMaXN0IGNvbnN0ICYpID0gZGVsZXRlOworICBTcGVjaWFsQ2FzZUxpc3QgJm9wZXJhdG9yPShTcGVjaWFsQ2FzZUxpc3QgY29uc3QgJikgPSBkZWxldGU7CisKKyAgLy8vIFJlcHJlc2VudHMgYSBzZXQgb2YgcmVndWxhciBleHByZXNzaW9ucy4gIFJlZ3VsYXIgZXhwcmVzc2lvbnMgd2hpY2ggYXJlCisgIC8vLyAibGl0ZXJhbCIgKGkuZS4gbm8gcmVnZXggbWV0YWNoYXJhY3RlcnMpIGFyZSBzdG9yZWQgaW4gU3RyaW5ncy4gIFRoZQorICAvLy8gcmVhc29uIGZvciBkb2luZyBzbyBpcyBlZmZpY2llbmN5OyBTdHJpbmdNYXAgaXMgbXVjaCBmYXN0ZXIgYXQgbWF0Y2hpbmcKKyAgLy8vIGxpdGVyYWwgc3RyaW5ncyB0aGFuIFJlZ2V4LgorICBjbGFzcyBNYXRjaGVyIHsKKyAgcHVibGljOgorICAgIGJvb2wgaW5zZXJ0KHN0ZDo6c3RyaW5nIFJlZ2V4cCwgdW5zaWduZWQgTGluZU51bWJlciwgc3RkOjpzdHJpbmcgJlJFRXJyb3IpOworICAgIC8vIFJldHVybnMgdGhlIGxpbmUgbnVtYmVyIGluIHRoZSBzb3VyY2UgZmlsZSB0aGF0IHRoaXMgcXVlcnkgbWF0Y2hlcyB0by4KKyAgICAvLyBSZXR1cm5zIHplcm8gaWYgbm8gbWF0Y2ggaXMgZm91bmQuCisgICAgdW5zaWduZWQgbWF0Y2goU3RyaW5nUmVmIFF1ZXJ5KSBjb25zdDsKKworICBwcml2YXRlOgorICAgIFN0cmluZ01hcDx1bnNpZ25lZD4gU3RyaW5nczsKKyAgICBUcmlncmFtSW5kZXggVHJpZ3JhbXM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6dW5pcXVlX3B0cjxSZWdleD4sIHVuc2lnbmVkPj4gUmVnRXhlczsKKyAgfTsKKworICB1c2luZyBTZWN0aW9uRW50cmllcyA9IFN0cmluZ01hcDxTdHJpbmdNYXA8TWF0Y2hlcj4+OworCisgIHN0cnVjdCBTZWN0aW9uIHsKKyAgICBTZWN0aW9uKHN0ZDo6dW5pcXVlX3B0cjxNYXRjaGVyPiBNKSA6IFNlY3Rpb25NYXRjaGVyKHN0ZDo6bW92ZShNKSl7fTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxNYXRjaGVyPiBTZWN0aW9uTWF0Y2hlcjsKKyAgICBTZWN0aW9uRW50cmllcyBFbnRyaWVzOworICB9OworCisgIHN0ZDo6dmVjdG9yPFNlY3Rpb24+IFNlY3Rpb25zOworCisgIC8vLyBQYXJzZXMganVzdC1jb25zdHJ1Y3RlZCBTcGVjaWFsQ2FzZUxpc3QgZW50cmllcyBmcm9tIGEgbWVtb3J5IGJ1ZmZlci4KKyAgYm9vbCBwYXJzZShjb25zdCBNZW1vcnlCdWZmZXIgKk1CLCBTdHJpbmdNYXA8c2l6ZV90PiAmU2VjdGlvbnNNYXAsCisgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJkVycm9yKTsKKworICAvLyBIZWxwZXIgbWV0aG9kIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gc2VhcmNoIGJ5IFByZWZpeCwgUXVlcnksIGFuZCBDYXRlZ29yeQorICAvLyBvbmNlIHRoZXkgaGF2ZSBhbHJlYWR5IHJlc29sdmVkIGEgc2VjdGlvbiBlbnRyeS4KKyAgdW5zaWduZWQgaW5TZWN0aW9uQmxhbWUoY29uc3QgU2VjdGlvbkVudHJpZXMgJkVudHJpZXMsIFN0cmluZ1JlZiBQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBRdWVyeSwgU3RyaW5nUmVmIENhdGVnb3J5KSBjb25zdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAgLy8gTExWTV9TVVBQT1JUX1NQRUNJQUxDQVNFTElTVF9ICisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TdHJpbmdQb29sLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU3RyaW5nUG9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNWZkMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU3RyaW5nUG9vbC5oCkBAIC0wLDAgKzEsMTQwIEBACisvLz09PS0gU3RyaW5nUG9vbC5oIC0gSW50ZXJuZWQgc3RyaW5nIHBvb2wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBhbiBpbnRlcm5lZCBzdHJpbmcgcG9vbCwgd2hpY2ggaGVscHMgcmVkdWNlIHRoZSBjb3N0IG9mCisvLyBzdHJpbmdzIGJ5IHVzaW5nIHRoZSBzYW1lIHN0b3JhZ2UgZm9yIGlkZW50aWNhbCBzdHJpbmdzLgorLy8KKy8vIFRvIGludGVybiBhIHN0cmluZzoKKy8vCisvLyAgIFN0cmluZ1Bvb2wgUG9vbDsKKy8vICAgUG9vbGVkU3RyaW5nUHRyIFN0ciA9IFBvb2wuaW50ZXJuKCJ3YWtrYSB3YWtrYSIpOworLy8KKy8vIFRvIHVzZSB0aGUgdmFsdWUgb2YgYW4gaW50ZXJuZWQgc3RyaW5nLCB1c2Ugb3BlcmF0b3IgYm9vbCBhbmQgb3BlcmF0b3IqOgorLy8KKy8vICAgaWYgKFN0cikKKy8vICAgICBjZXJyIDw8ICJ0aGUgc3RyaW5nIGlzIiA8PCAqU3RyIDw8ICJcbiI7CisvLworLy8gUG9vbGVkIHN0cmluZ3MgYXJlIGltbXV0YWJsZSwgYnV0IHlvdSBjYW4gY2hhbmdlIGEgUG9vbGVkU3RyaW5nUHRyIHRvIHBvaW50CisvLyB0byBhbm90aGVyIGluc3RhbmNlLiBTbyB0aGF0IGludGVybmVkIHN0cmluZ3MgY2FuIGV2ZW50dWFsbHkgYmUgZnJlZWQsCisvLyBzdHJpbmdzIGluIHRoZSBzdHJpbmcgcG9vbCBhcmUgcmVmZXJlbmNlLWNvdW50ZWQgKGF1dG9tYXRpY2FsbHkpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1NUUklOR1BPT0xfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfU1RSSU5HUE9PTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgUG9vbGVkU3RyaW5nUHRyOworCisgIC8vLyBTdHJpbmdQb29sIC0gQW4gaW50ZXJuZWQgc3RyaW5nIHBvb2wuIFVzZSB0aGUgaW50ZXJuIG1ldGhvZCB0byBhZGQgYQorICAvLy8gc3RyaW5nLiBTdHJpbmdzIGFyZSByZW1vdmVkIGF1dG9tYXRpY2FsbHkgYXMgUG9vbGVkU3RyaW5nUHRycyBhcmUKKyAgLy8vIGRlc3Ryb3llZC4KKyAgY2xhc3MgU3RyaW5nUG9vbCB7CisgICAgLy8vIFBvb2xlZFN0cmluZyAtIFRoaXMgaXMgdGhlIHZhbHVlIG9mIGFuIGVudHJ5IGluIHRoZSBwb29sJ3MgaW50ZXJuaW5nCisgICAgLy8vIHRhYmxlLgorICAgIHN0cnVjdCBQb29sZWRTdHJpbmcgeworICAgICAgU3RyaW5nUG9vbCAqUG9vbCA9IG51bGxwdHI7ICAvLy88IFNvIHRoZSBzdHJpbmcgY2FuIHJlbW92ZSBpdHNlbGYuCisgICAgICB1bnNpZ25lZCBSZWZjb3VudCA9IDA7ICAgICAgIC8vLzwgTnVtYmVyIG9mIHJlZmVyZW5jaW5nIFBvb2xlZFN0cmluZ1B0cnMuCisKKyAgICBwdWJsaWM6CisgICAgICBQb29sZWRTdHJpbmcoKSA9IGRlZmF1bHQ7CisgICAgfTsKKworICAgIGZyaWVuZCBjbGFzcyBQb29sZWRTdHJpbmdQdHI7CisKKyAgICB1c2luZyB0YWJsZV90ID0gU3RyaW5nTWFwPFBvb2xlZFN0cmluZz47CisgICAgdXNpbmcgZW50cnlfdCA9IFN0cmluZ01hcEVudHJ5PFBvb2xlZFN0cmluZz47CisgICAgdGFibGVfdCBJbnRlcm5UYWJsZTsKKworICBwdWJsaWM6CisgICAgU3RyaW5nUG9vbCgpOworICAgIH5TdHJpbmdQb29sKCk7CisKKyAgICAvLy8gaW50ZXJuIC0gQWRkcyBhIHN0cmluZyB0byB0aGUgcG9vbCBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZS1jb3VudGVkCisgICAgLy8vIHBvaW50ZXIgdG8gaXQuIE5vIGFkZGl0aW9uYWwgbWVtb3J5IGlzIGFsbG9jYXRlZCBpZiB0aGUgc3RyaW5nIGFscmVhZHkKKyAgICAvLy8gZXhpc3RzIGluIHRoZSBwb29sLgorICAgIFBvb2xlZFN0cmluZ1B0ciBpbnRlcm4oU3RyaW5nUmVmIFN0cik7CisKKyAgICAvLy8gZW1wdHkgLSBDaGVja3Mgd2hldGhlciB0aGUgcG9vbCBpcyBlbXB0eS4gUmV0dXJucyB0cnVlIGlmIHNvLgorICAgIC8vLworICAgIGlubGluZSBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gSW50ZXJuVGFibGUuZW1wdHkoKTsgfQorICB9OworCisgIC8vLyBQb29sZWRTdHJpbmdQdHIgLSBBIHBvaW50ZXIgdG8gYW4gaW50ZXJuZWQgc3RyaW5nLiBVc2Ugb3BlcmF0b3IgYm9vbCB0bworICAvLy8gdGVzdCB3aGV0aGVyIHRoZSBwb2ludGVyIGlzIHZhbGlkLCBhbmQgb3BlcmF0b3IgKiB0byBnZXQgdGhlIHN0cmluZyBpZiBzby4KKyAgLy8vIFRoaXMgaXMgYSBsaWdodHdlaWdodCB2YWx1ZSBjbGFzcyB3aXRoIHN0b3JhZ2UgcmVxdWlyZW1lbnRzIGVxdWl2YWxlbnQgdG8KKyAgLy8vIGEgc2luZ2xlIHBvaW50ZXIsIGJ1dCBpdCBkb2VzIGhhdmUgcmVmZXJlbmNlLWNvdW50aW5nIG92ZXJoZWFkIHdoZW4KKyAgLy8vIGNvcGllZC4KKyAgY2xhc3MgUG9vbGVkU3RyaW5nUHRyIHsKKyAgICB1c2luZyBlbnRyeV90ID0gU3RyaW5nUG9vbDo6ZW50cnlfdDsKKworICAgIGVudHJ5X3QgKlMgPSBudWxscHRyOworCisgIHB1YmxpYzoKKyAgICBQb29sZWRTdHJpbmdQdHIoKSA9IGRlZmF1bHQ7CisKKyAgICBleHBsaWNpdCBQb29sZWRTdHJpbmdQdHIoZW50cnlfdCAqRSkgOiBTKEUpIHsKKyAgICAgIGlmIChTKSArK1MtPmdldFZhbHVlKCkuUmVmY291bnQ7CisgICAgfQorCisgICAgUG9vbGVkU3RyaW5nUHRyKGNvbnN0IFBvb2xlZFN0cmluZ1B0ciAmVGhhdCkgOiBTKFRoYXQuUykgeworICAgICAgaWYgKFMpICsrUy0+Z2V0VmFsdWUoKS5SZWZjb3VudDsKKyAgICB9CisKKyAgICBQb29sZWRTdHJpbmdQdHIgJm9wZXJhdG9yPShjb25zdCBQb29sZWRTdHJpbmdQdHIgJlRoYXQpIHsKKyAgICAgIGlmIChTICE9IFRoYXQuUykgeworICAgICAgICBjbGVhcigpOworICAgICAgICBTID0gVGhhdC5TOworICAgICAgICBpZiAoUykgKytTLT5nZXRWYWx1ZSgpLlJlZmNvdW50OworICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZvaWQgY2xlYXIoKSB7CisgICAgICBpZiAoIVMpCisgICAgICAgIHJldHVybjsKKyAgICAgIGlmICgtLVMtPmdldFZhbHVlKCkuUmVmY291bnQgPT0gMCkgeworICAgICAgICBTLT5nZXRWYWx1ZSgpLlBvb2wtPkludGVyblRhYmxlLnJlbW92ZShTKTsKKyAgICAgICAgUy0+RGVzdHJveSgpOworICAgICAgfQorICAgICAgUyA9IG51bGxwdHI7CisgICAgfQorCisgICAgflBvb2xlZFN0cmluZ1B0cigpIHsgY2xlYXIoKTsgfQorCisgICAgaW5saW5lIGNvbnN0IGNoYXIgKmJlZ2luKCkgY29uc3QgeworICAgICAgYXNzZXJ0KCp0aGlzICYmICJBdHRlbXB0IHRvIGRlcmVmZXJlbmNlIGVtcHR5IFBvb2xlZFN0cmluZ1B0ciEiKTsKKyAgICAgIHJldHVybiBTLT5nZXRLZXlEYXRhKCk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IGNoYXIgKmVuZCgpIGNvbnN0IHsKKyAgICAgIGFzc2VydCgqdGhpcyAmJiAiQXR0ZW1wdCB0byBkZXJlZmVyZW5jZSBlbXB0eSBQb29sZWRTdHJpbmdQdHIhIik7CisgICAgICByZXR1cm4gUy0+Z2V0S2V5RGF0YSgpICsgUy0+Z2V0S2V5TGVuZ3RoKCk7CisgICAgfQorCisgICAgaW5saW5lIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7CisgICAgICBhc3NlcnQoKnRoaXMgJiYgIkF0dGVtcHQgdG8gZGVyZWZlcmVuY2UgZW1wdHkgUG9vbGVkU3RyaW5nUHRyISIpOworICAgICAgcmV0dXJuIFMtPmdldEtleUxlbmd0aCgpOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBjaGFyICpvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBiZWdpbigpOyB9CisgICAgaW5saW5lIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBTICE9IG51bGxwdHI7IH0KKworICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgUG9vbGVkU3RyaW5nUHRyICZUaGF0KSBjb25zdCB7IHJldHVybiBTID09IFRoYXQuUzsgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgUG9vbGVkU3RyaW5nUHRyICZUaGF0KSBjb25zdCB7IHJldHVybiBTICE9IFRoYXQuUzsgfQorICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX1NUUklOR1BPT0xfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1N0cmluZ1NhdmVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU3RyaW5nU2F2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODViMjg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1N0cmluZ1NhdmVyLmgKQEAgLTAsMCArMSwzMiBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9TdHJpbmdTYXZlci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfU1RSSU5HU0FWRVJfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfU1RSSU5HU0FWRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBTYXZlcyBzdHJpbmdzIGluIHRoZSBpbmhlcml0b3IncyBzdGFibGUgc3RvcmFnZSBhbmQgcmV0dXJucyBhCisvLy8gU3RyaW5nUmVmIHdpdGggYSBzdGFibGUgY2hhcmFjdGVyIHBvaW50ZXIuCitjbGFzcyBTdHJpbmdTYXZlciBmaW5hbCB7CisgIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jOworCitwdWJsaWM6CisgIFN0cmluZ1NhdmVyKEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jKSA6IEFsbG9jKEFsbG9jKSB7fQorICBTdHJpbmdSZWYgc2F2ZShjb25zdCBjaGFyICpTKSB7IHJldHVybiBzYXZlKFN0cmluZ1JlZihTKSk7IH0KKyAgU3RyaW5nUmVmIHNhdmUoU3RyaW5nUmVmIFMpOworICBTdHJpbmdSZWYgc2F2ZShjb25zdCBUd2luZSAmUykgeyByZXR1cm4gc2F2ZShTdHJpbmdSZWYoUy5zdHIoKSkpOyB9CisgIFN0cmluZ1JlZiBzYXZlKGNvbnN0IHN0ZDo6c3RyaW5nICZTKSB7IHJldHVybiBzYXZlKFN0cmluZ1JlZihTKSk7IH0KK307Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Td2FwQnl0ZU9yZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU3dhcEJ5dGVPcmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZDM3MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU3dhcEJ5dGVPcmRlci5oCkBAIC0wLDAgKzEsMTI3IEBACisvLz09PS0gU3dhcEJ5dGVPcmRlci5oIC0gR2VuZXJpYyBhbmQgb3B0aW1pemVkIGJ5dGUgc3dhcHMgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBnZW5lcmljIGFuZCBvcHRpbWl6ZWQgZnVuY3Rpb25zIHRvIHN3YXAgdGhlIGJ5dGUgb3JkZXIgb2YKKy8vIGFuIGludGVncmFsIHR5cGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfU1dBUEJZVEVPUkRFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9TV0FQQllURU9SREVSX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9ERUJVRykKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugc3lzIHsKKworLy8vIFN3YXBCeXRlT3JkZXJfMTYgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBieXRlLXN3YXBwZWQgcmVwcmVzZW50YXRpb24gb2YKKy8vLyB0aGUgMTYtYml0IGFyZ3VtZW50LgoraW5saW5lIHVpbnQxNl90IFN3YXBCeXRlT3JkZXJfMTYodWludDE2X3QgdmFsdWUpIHsKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfREVCVUcpCisgIC8vIFRoZSBETEwgdmVyc2lvbiBvZiB0aGUgcnVudGltZSBsYWNrcyB0aGVzZSBmdW5jdGlvbnMgKGJ1ZyE/KSwgYnV0IGluIGEKKyAgLy8gcmVsZWFzZSBidWlsZCB0aGV5J3JlIHJlcGxhY2VkIHdpdGggQlNXQVAgaW5zdHJ1Y3Rpb25zIGFueXdheS4KKyAgcmV0dXJuIF9ieXRlc3dhcF91c2hvcnQodmFsdWUpOworI2Vsc2UKKyAgdWludDE2X3QgSGkgPSB2YWx1ZSA8PCA4OworICB1aW50MTZfdCBMbyA9IHZhbHVlID4+IDg7CisgIHJldHVybiBIaSB8IExvOworI2VuZGlmCit9CisKKy8vLyBTd2FwQnl0ZU9yZGVyXzMyIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgYnl0ZS1zd2FwcGVkIHJlcHJlc2VudGF0aW9uIG9mCisvLy8gdGhlIDMyLWJpdCBhcmd1bWVudC4KK2lubGluZSB1aW50MzJfdCBTd2FwQnl0ZU9yZGVyXzMyKHVpbnQzMl90IHZhbHVlKSB7CisjaWYgZGVmaW5lZChfX2xsdm1fXykgfHwgKExMVk1fR05VQ19QUkVSRVEoNCwgMywgMCkgJiYgIWRlZmluZWQoX19JQ0MpKQorICByZXR1cm4gX19idWlsdGluX2Jzd2FwMzIodmFsdWUpOworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX0RFQlVHKQorICByZXR1cm4gX2J5dGVzd2FwX3Vsb25nKHZhbHVlKTsKKyNlbHNlCisgIHVpbnQzMl90IEJ5dGUwID0gdmFsdWUgJiAweDAwMDAwMEZGOworICB1aW50MzJfdCBCeXRlMSA9IHZhbHVlICYgMHgwMDAwRkYwMDsKKyAgdWludDMyX3QgQnl0ZTIgPSB2YWx1ZSAmIDB4MDBGRjAwMDA7CisgIHVpbnQzMl90IEJ5dGUzID0gdmFsdWUgJiAweEZGMDAwMDAwOworICByZXR1cm4gKEJ5dGUwIDw8IDI0KSB8IChCeXRlMSA8PCA4KSB8IChCeXRlMiA+PiA4KSB8IChCeXRlMyA+PiAyNCk7CisjZW5kaWYKK30KKworLy8vIFN3YXBCeXRlT3JkZXJfNjQgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBieXRlLXN3YXBwZWQgcmVwcmVzZW50YXRpb24gb2YKKy8vLyB0aGUgNjQtYml0IGFyZ3VtZW50LgoraW5saW5lIHVpbnQ2NF90IFN3YXBCeXRlT3JkZXJfNjQodWludDY0X3QgdmFsdWUpIHsKKyNpZiBkZWZpbmVkKF9fbGx2bV9fKSB8fCAoTExWTV9HTlVDX1BSRVJFUSg0LCAzLCAwKSAmJiAhZGVmaW5lZChfX0lDQykpCisgIHJldHVybiBfX2J1aWx0aW5fYnN3YXA2NCh2YWx1ZSk7CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfREVCVUcpCisgIHJldHVybiBfYnl0ZXN3YXBfdWludDY0KHZhbHVlKTsKKyNlbHNlCisgIHVpbnQ2NF90IEhpID0gU3dhcEJ5dGVPcmRlcl8zMih1aW50MzJfdCh2YWx1ZSkpOworICB1aW50MzJfdCBMbyA9IFN3YXBCeXRlT3JkZXJfMzIodWludDMyX3QodmFsdWUgPj4gMzIpKTsKKyAgcmV0dXJuIChIaSA8PCAzMikgfCBMbzsKKyNlbmRpZgorfQorCitpbmxpbmUgdW5zaWduZWQgY2hhciAgZ2V0U3dhcHBlZEJ5dGVzKHVuc2lnbmVkIGNoYXIgQykgeyByZXR1cm4gQzsgfQoraW5saW5lICAgc2lnbmVkIGNoYXIgIGdldFN3YXBwZWRCeXRlcyhzaWduZWQgY2hhciBDKSB7IHJldHVybiBDOyB9CitpbmxpbmUgICAgICAgICAgY2hhciAgZ2V0U3dhcHBlZEJ5dGVzKGNoYXIgQykgeyByZXR1cm4gQzsgfQorCitpbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0U3dhcHBlZEJ5dGVzKHVuc2lnbmVkIHNob3J0IEMpIHsgcmV0dXJuIFN3YXBCeXRlT3JkZXJfMTYoQyk7IH0KK2lubGluZSAgIHNpZ25lZCBzaG9ydCBnZXRTd2FwcGVkQnl0ZXMoICBzaWduZWQgc2hvcnQgQykgeyByZXR1cm4gU3dhcEJ5dGVPcmRlcl8xNihDKTsgfQorCitpbmxpbmUgdW5zaWduZWQgaW50ICAgZ2V0U3dhcHBlZEJ5dGVzKHVuc2lnbmVkIGludCAgIEMpIHsgcmV0dXJuIFN3YXBCeXRlT3JkZXJfMzIoQyk7IH0KK2lubGluZSAgIHNpZ25lZCBpbnQgICBnZXRTd2FwcGVkQnl0ZXMoICBzaWduZWQgaW50ICAgQykgeyByZXR1cm4gU3dhcEJ5dGVPcmRlcl8zMihDKTsgfQorCisjaWYgX19MT05HX01BWF9fID09IF9fSU5UX01BWF9fCitpbmxpbmUgdW5zaWduZWQgbG9uZyAgZ2V0U3dhcHBlZEJ5dGVzKHVuc2lnbmVkIGxvbmcgIEMpIHsgcmV0dXJuIFN3YXBCeXRlT3JkZXJfMzIoQyk7IH0KK2lubGluZSAgIHNpZ25lZCBsb25nICBnZXRTd2FwcGVkQnl0ZXMoICBzaWduZWQgbG9uZyAgQykgeyByZXR1cm4gU3dhcEJ5dGVPcmRlcl8zMihDKTsgfQorI2VsaWYgX19MT05HX01BWF9fID09IF9fTE9OR19MT05HX01BWF9fCitpbmxpbmUgdW5zaWduZWQgbG9uZyAgZ2V0U3dhcHBlZEJ5dGVzKHVuc2lnbmVkIGxvbmcgIEMpIHsgcmV0dXJuIFN3YXBCeXRlT3JkZXJfNjQoQyk7IH0KK2lubGluZSAgIHNpZ25lZCBsb25nICBnZXRTd2FwcGVkQnl0ZXMoICBzaWduZWQgbG9uZyAgQykgeyByZXR1cm4gU3dhcEJ5dGVPcmRlcl82NChDKTsgfQorI2Vsc2UKKyNlcnJvciAiVW5rbm93biBsb25nIHNpemUhIgorI2VuZGlmCisKK2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgZ2V0U3dhcHBlZEJ5dGVzKHVuc2lnbmVkIGxvbmcgbG9uZyBDKSB7CisgIHJldHVybiBTd2FwQnl0ZU9yZGVyXzY0KEMpOworfQoraW5saW5lIHNpZ25lZCBsb25nIGxvbmcgZ2V0U3dhcHBlZEJ5dGVzKHNpZ25lZCBsb25nIGxvbmcgQykgeworICByZXR1cm4gU3dhcEJ5dGVPcmRlcl82NChDKTsKK30KKworaW5saW5lIGZsb2F0IGdldFN3YXBwZWRCeXRlcyhmbG9hdCBDKSB7CisgIHVuaW9uIHsKKyAgICB1aW50MzJfdCBpOworICAgIGZsb2F0IGY7CisgIH0gaW4sIG91dDsKKyAgaW4uZiA9IEM7CisgIG91dC5pID0gU3dhcEJ5dGVPcmRlcl8zMihpbi5pKTsKKyAgcmV0dXJuIG91dC5mOworfQorCitpbmxpbmUgZG91YmxlIGdldFN3YXBwZWRCeXRlcyhkb3VibGUgQykgeworICB1bmlvbiB7CisgICAgdWludDY0X3QgaTsKKyAgICBkb3VibGUgZDsKKyAgfSBpbiwgb3V0OworICBpbi5kID0gQzsKKyAgb3V0LmkgPSBTd2FwQnl0ZU9yZGVyXzY0KGluLmkpOworICByZXR1cm4gb3V0LmQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgdm9pZCBzd2FwQnl0ZU9yZGVyKFQgJlZhbHVlKSB7CisgIFZhbHVlID0gZ2V0U3dhcHBlZEJ5dGVzKFZhbHVlKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIHN5cworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU3lzdGVtVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TeXN0ZW1VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTdiMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU3lzdGVtVXRpbHMuaApAQCAtMCwwICsxLDMyIEBACisvLz09PS0gU3lzdGVtVXRpbHMuaCAtIFV0aWxpdGllcyB0byBkbyBsb3ctbGV2ZWwgc3lzdGVtIHN0dWZmIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgdXNlZCB0byBkbyBhIHZhcmlldHkgb2YgbG93LWxldmVsLCBvZnRlbgorLy8gc3lzdGVtLXNwZWNpZmljLCB0YXNrcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9TWVNURU1VVElMU19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9TWVNURU1VVElMU19ICisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgcmF3X29zdHJlYW07CisKKy8vLyBEZXRlcm1pbmUgaWYgdGhlIHJhd19vc3RyZWFtIHByb3ZpZGVkIGlzIGNvbm5lY3RlZCB0byBhIHRlcm1pbmFsLiBJZiBzbywKKy8vLyBnZW5lcmF0ZSBhIHdhcm5pbmcgbWVzc2FnZSB0byBlcnJzKCkgYWR2aXNpbmcgYWdhaW5zdCBkaXNwbGF5IG9mIGJpdGNvZGUKKy8vLyBhbmQgcmV0dXJuIHRydWUuIE90aGVyd2lzZSBqdXN0IHJldHVybiBmYWxzZS4KKy8vLyBAYnJpZWYgQ2hlY2sgZm9yIG91dHB1dCB3cml0dGVuIHRvIGEgY29uc29sZQorYm9vbCBDaGVja0JpdGNvZGVPdXRwdXRUb0NvbnNvbGUoCisgIHJhd19vc3RyZWFtICZzdHJlYW1fdG9fY2hlY2ssIC8vLzwgVGhlIHN0cmVhbSB0byBiZSBjaGVja2VkCisgIGJvb2wgcHJpbnRfd2FybmluZyA9IHRydWUgICAgIC8vLzwgQ29udHJvbCB3aGV0aGVyIHdhcm5pbmdzIGFyZSBwcmludGVkCispOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UYXJXcml0ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UYXJXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzlmNjFiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RhcldyaXRlci5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L1RhcldyaXRlci5oIC0gVGFyIGFyY2hpdmUgZmlsZSBjcmVhdG9yIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1RBUl9XUklURVJfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfVEFSX1dSSVRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgVGFyV3JpdGVyIHsKK3B1YmxpYzoKKyAgc3RhdGljIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxUYXJXcml0ZXI+PiBjcmVhdGUoU3RyaW5nUmVmIE91dHB1dFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBCYXNlRGlyKTsKKworICB2b2lkIGFwcGVuZChTdHJpbmdSZWYgUGF0aCwgU3RyaW5nUmVmIERhdGEpOworCitwcml2YXRlOgorICBUYXJXcml0ZXIoaW50IEZELCBTdHJpbmdSZWYgQmFzZURpcik7CisgIHJhd19mZF9vc3RyZWFtIE9TOworICBzdGQ6OnN0cmluZyBCYXNlRGlyOworICBTdHJpbmdTZXQ8PiBGaWxlczsKK307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RhcmdldE9wY29kZXMuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RhcmdldE9wY29kZXMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MTRhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGFyZ2V0T3Bjb2Rlcy5kZWYKQEAgLTAsMCArMSw0NjYgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L1RhcmdldE9wY29kZXMuZGVmIC0gVGFyZ2V0IEluZGVwIE9wY29kZXMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIHRhcmdldCBpbmRlcGVuZGVudCBpbnN0cnVjdGlvbiBvcGNvZGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIE5PVEU6IE5PIElOQ0xVREUgR1VBUkQgREVTSVJFRCEKKworLy8vIEhBTkRMRV9UQVJHRVRfT1BDT0RFIGRlZmluZXMgYW4gb3Bjb2RlIGFuZCBpdHMgYXNzb2NpYXRlZCBlbnVtIHZhbHVlLgorLy8vCisjaWZuZGVmIEhBTkRMRV9UQVJHRVRfT1BDT0RFCisjZGVmaW5lIEhBTkRMRV9UQVJHRVRfT1BDT0RFKE9QQywgTlVNKQorI2VuZGlmCisKKy8vLyBIQU5ETEVfVEFSR0VUX09QQ09ERV9NQVJLRVIgZGVmaW5lcyBhbiBhbHRlcm5hdGl2ZSBpZGVudGlmaWVyIGZvciBhbiBvcGNvZGUuCisvLy8KKyNpZm5kZWYgSEFORExFX1RBUkdFVF9PUENPREVfTUFSS0VSCisjZGVmaW5lIEhBTkRMRV9UQVJHRVRfT1BDT0RFX01BUktFUihJREVOVCwgT1BDKQorI2VuZGlmCisKKy8vLyBFdmVyeSBpbnN0cnVjdGlvbiBkZWZpbmVkIGhlcmUgbXVzdCBhbHNvIGFwcGVhciBpbiBUYXJnZXQudGQuCisvLy8KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKFBISSkKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKElOTElORUFTTSkKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKENGSV9JTlNUUlVDVElPTikKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEVIX0xBQkVMKQorSEFORExFX1RBUkdFVF9PUENPREUoR0NfTEFCRUwpCitIQU5ETEVfVEFSR0VUX09QQ09ERShBTk5PVEFUSU9OX0xBQkVMKQorCisvLy8gS0lMTCAtIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgYSBub29wIHRoYXQgaXMgdXNlZCBvbmx5IHRvIGFkanVzdCB0aGUKKy8vLyBsaXZlbmVzcyBvZiByZWdpc3RlcnMuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGRlYWxpbmcgd2l0aAorLy8vIHN1Yi1yZWdpc3RlcnMuCitIQU5ETEVfVEFSR0VUX09QQ09ERShLSUxMKQorCisvLy8gRVhUUkFDVF9TVUJSRUcgLSBUaGlzIGluc3RydWN0aW9uIHRha2VzIHR3byBvcGVyYW5kczogYSByZWdpc3RlcgorLy8vIHRoYXQgaGFzIHN1YnJlZ2lzdGVycywgYW5kIGEgc3VicmVnaXN0ZXIgaW5kZXguIEl0IHJldHVybnMgdGhlCisvLy8gZXh0cmFjdGVkIHN1YnJlZ2lzdGVyIHZhbHVlLiBUaGlzIGlzIGNvbW1vbmx5IHVzZWQgdG8gaW1wbGVtZW50CisvLy8gdHJ1bmNhdGlvbiBvcGVyYXRpb25zIG9uIHRhcmdldCBhcmNoaXRlY3R1cmVzIHdoaWNoIHN1cHBvcnQgaXQuCitIQU5ETEVfVEFSR0VUX09QQ09ERShFWFRSQUNUX1NVQlJFRykKKworLy8vIElOU0VSVF9TVUJSRUcgLSBUaGlzIGluc3RydWN0aW9uIHRha2VzIHRocmVlIG9wZXJhbmRzOiBhIHJlZ2lzdGVyIHRoYXQKKy8vLyBoYXMgc3VicmVnaXN0ZXJzLCBhIHJlZ2lzdGVyIHByb3ZpZGluZyBhbiBpbnNlcnQgdmFsdWUsIGFuZCBhCisvLy8gc3VicmVnaXN0ZXIgaW5kZXguIEl0IHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCByZWdpc3RlciB3aXRoIHRoZQorLy8vIHZhbHVlIG9mIHRoZSBzZWNvbmQgcmVnaXN0ZXIgaW5zZXJ0ZWQuIFRoZSBmaXJzdCByZWdpc3RlciBpcyBvZnRlbgorLy8vIGRlZmluZWQgYnkgYW4gSU1QTElDSVRfREVGLCBiZWNhdXNlIGl0IGlzIGNvbW1vbmx5IHVzZWQgdG8gaW1wbGVtZW50CisvLy8gYW55ZXh0IG9wZXJhdGlvbnMgb24gdGFyZ2V0IGFyY2hpdGVjdHVyZXMgd2hpY2ggc3VwcG9ydCBpdC4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKElOU0VSVF9TVUJSRUcpCisKKy8vLyBJTVBMSUNJVF9ERUYgLSBUaGlzIGlzIHRoZSBNYWNoaW5lSW5zdHItbGV2ZWwgZXF1aXZhbGVudCBvZiB1bmRlZi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKElNUExJQ0lUX0RFRikKKworLy8vIFNVQlJFR19UT19SRUcgLSBBc3NlcnQgdGhlIHZhbHVlIG9mIGJpdHMgaW4gYSBzdXBlciByZWdpc3Rlci4KKy8vLyBUaGUgcmVzdWx0IG9mIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBpbnNlcnRlZAorLy8vIGludG8gdGhlIHN1YnJlZ2lzdGVyIHNwZWNpZmllZCBieSB0aGUgdGhpcmQgb3BlcmFuZC4gQWxsIG90aGVyIGJpdHMgYXJlCisvLy8gYXNzdW1lZCB0byBiZSBlcXVhbCB0byB0aGUgYml0cyBpbiB0aGUgaW1tZWRpYXRlIGludGVnZXIgY29uc3RhbnQgaW4gdGhlCisvLy8gZmlyc3Qgb3BlcmFuZC4gVGhpcyBpbnN0cnVjdGlvbiBqdXN0IGNvbW11bmljYXRlcyBpbmZvcm1hdGlvbjsgTm8gY29kZQorLy8vIHNob3VsZCBiZSBnZW5lcmF0ZWQuCisvLy8gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBhZnRlciBhbiBpbnN0cnVjdGlvbiB3aGVyZSB0aGUgd3JpdGUgdG8gYSBzdWJyZWdpc3RlcgorLy8vIGltcGxpY2l0bHkgY2xlYXJlZCB0aGUgYml0cyBpbiB0aGUgc3VwZXIgcmVnaXN0ZXJzLgorSEFORExFX1RBUkdFVF9PUENPREUoU1VCUkVHX1RPX1JFRykKKworLy8vIENPUFlfVE9fUkVHQ0xBU1MgLSBUaGlzIGluc3RydWN0aW9uIGlzIGEgcGxhY2Vob2xkZXIgZm9yIGEgcGxhaW4KKy8vLyByZWdpc3Rlci10by1yZWdpc3RlciBjb3B5IGludG8gYSBzcGVjaWZpYyByZWdpc3RlciBjbGFzcy4gVGhpcyBpcyBvbmx5CisvLy8gdXNlZCBiZXR3ZWVuIGluc3RydWN0aW9uIHNlbGVjdGlvbiBhbmQgTWFjaGluZUluc3RyIGNyZWF0aW9uLCBiZWZvcmUKKy8vLyB2aXJ0dWFsIHJlZ2lzdGVycyBoYXZlIGJlZW4gY3JlYXRlZCBmb3IgYWxsIHRoZSBpbnN0cnVjdGlvbnMsIGFuZCBpdCdzCisvLy8gb25seSBuZWVkZWQgaW4gY2FzZXMgd2hlcmUgdGhlIHJlZ2lzdGVyIGNsYXNzZXMgaW1wbGllZCBieSB0aGUKKy8vLyBpbnN0cnVjdGlvbnMgYXJlIGluc3VmZmljaWVudC4gSXQgaXMgZW1pdHRlZCBhcyBhIENPUFkgTWFjaGluZUluc3RyLgorICBIQU5ETEVfVEFSR0VUX09QQ09ERShDT1BZX1RPX1JFR0NMQVNTKQorCisvLy8gREJHX1ZBTFVFIC0gYSBtYXBwaW5nIG9mIHRoZSBsbHZtLmRiZy52YWx1ZSBpbnRyaW5zaWMKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKERCR19WQUxVRSkKKworLy8vIFJFR19TRVFVRU5DRSAtIFRoaXMgdmFyaWFkaWMgaW5zdHJ1Y3Rpb24gaXMgdXNlZCB0byBmb3JtIGEgcmVnaXN0ZXIgdGhhdAorLy8vIHJlcHJlc2VudHMgYSBjb25zZWN1dGl2ZSBzZXF1ZW5jZSBvZiBzdWItcmVnaXN0ZXJzLiBJdCdzIHVzZWQgYXMgYQorLy8vIHJlZ2lzdGVyIGNvYWxlc2NpbmcgLyBhbGxvY2F0aW9uIGFpZCBhbmQgbXVzdCBiZSBlbGltaW5hdGVkIGJlZm9yZSBjb2RlCisvLy8gZW1pc3Npb24uCisvLyBJbiBTRE5vZGUgZm9ybSwgdGhlIGZpcnN0IG9wZXJhbmQgZW5jb2RlcyB0aGUgcmVnaXN0ZXIgY2xhc3MgY3JlYXRlZCBieQorLy8gdGhlIFJFR19TRVFVRU5DRSwgd2hpbGUgZWFjaCBzdWJzZXF1ZW50IHBhaXIgbmFtZXMgYSB2cmVnICsgc3VicmVnIGluZGV4CisvLyBwYWlyLiAgT25jZSBpdCBoYXMgYmVlbiBsb3dlcmVkIHRvIGEgTWFjaGluZUluc3RyLCB0aGUgcmVnY2xhc3Mgb3BlcmFuZAorLy8gaXMgbm8gbG9uZ2VyIHByZXNlbnQuCisvLy8gZS5nLiB2MTAyNyA9IFJFR19TRVFVRU5DRSB2MTAyNCwgMywgdjEwMjUsIDQsIHYxMDI2LCA1CisvLy8gQWZ0ZXIgcmVnaXN0ZXIgY29hbGVzY2luZyByZWZlcmVuY2VzIG9mIHYxMDI0IHNob3VsZCBiZSByZXBsYWNlIHdpdGgKKy8vLyB2MTAyNzozLCB2MTAyNSB3aXRoIHYxMDI3OjQsIGV0Yy4KKyAgSEFORExFX1RBUkdFVF9PUENPREUoUkVHX1NFUVVFTkNFKQorCisvLy8gQ09QWSAtIFRhcmdldC1pbmRlcGVuZGVudCByZWdpc3RlciBjb3B5LiBUaGlzIGluc3RydWN0aW9uIGNhbiBhbHNvIGJlCisvLy8gdXNlZCB0byBjb3B5IGJldHdlZW4gc3VicmVnaXN0ZXJzIG9mIHZpcnR1YWwgcmVnaXN0ZXJzLgorICBIQU5ETEVfVEFSR0VUX09QQ09ERShDT1BZKQorCisvLy8gQlVORExFIC0gVGhpcyBpbnN0cnVjdGlvbiByZXByZXNlbnRzIGFuIGluc3RydWN0aW9uIGJ1bmRsZS4gSW5zdHJ1Y3Rpb25zCisvLy8gd2hpY2ggaW1tZWRpYXRlbHkgZm9sbG93IGEgQlVORExFIGluc3RydWN0aW9uIHdoaWNoIGFyZSBtYXJrZWQgd2l0aAorLy8vICdJbnNpZGVCdW5kbGUnIGZsYWcgYXJlIGluc2lkZSB0aGUgYnVuZGxlLgorSEFORExFX1RBUkdFVF9PUENPREUoQlVORExFKQorCisvLy8gTGlmZXRpbWUgbWFya2Vycy4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKExJRkVUSU1FX1NUQVJUKQorSEFORExFX1RBUkdFVF9PUENPREUoTElGRVRJTUVfRU5EKQorCisvLy8gQSBTdGFja21hcCBpbnN0cnVjdGlvbiBjYXB0dXJlcyB0aGUgbG9jYXRpb24gb2YgbGl2ZSB2YXJpYWJsZXMgYXQgaXRzCisvLy8gcG9zaXRpb24gaW4gdGhlIGluc3RydWN0aW9uIHN0cmVhbS4gSXQgaXMgZm9sbG93ZWQgYnkgYSBzaGFkb3cgb2YgYnl0ZXMKKy8vLyB0aGF0IG11c3QgbGllIHdpdGhpbiB0aGUgZnVuY3Rpb24gYW5kIG5vdCBjb250YWluIGFub3RoZXIgc3RhY2ttYXAuCitIQU5ETEVfVEFSR0VUX09QQ09ERShTVEFDS01BUCkKKworLy8vIEZFbnRyeSBhbGwgLSBUaGlzIGlzIGEgbWFya2VyIGluc3RydWN0aW9uIHdoaWNoIGdldHMgdHJhbnNsYXRlZCBpbnRvIGEgcmF3IGZlbnRyeSBjYWxsLgorSEFORExFX1RBUkdFVF9PUENPREUoRkVOVFJZX0NBTEwpCisKKy8vLyBQYXRjaGFibGUgY2FsbCBpbnN0cnVjdGlvbiAtIHRoaXMgaW5zdHJ1Y3Rpb24gcmVwcmVzZW50cyBhIGNhbGwgdG8gYQorLy8vIGNvbnN0YW50IGFkZHJlc3MsIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIE5PUHMuIEl0IGlzIGludGVuZGVkIHRvCisvLy8gc3VwcG9ydCBvcHRpbWl6YXRpb25zIGZvciBkeW5hbWljIGxhbmd1YWdlcyAoc3VjaCBhcyBqYXZhc2NyaXB0KSB0aGF0CisvLy8gcmV3cml0ZSBjYWxscyB0byBydW50aW1lcyB3aXRoIG1vcmUgZWZmaWNpZW50IGNvZGUgc2VxdWVuY2VzLgorLy8vIFRoaXMgYWxzbyBpbXBsaWVzIGEgc3RhY2sgbWFwLgorSEFORExFX1RBUkdFVF9PUENPREUoUEFUQ0hQT0lOVCkKKworLy8vIFRoaXMgcHNldWRvLWluc3RydWN0aW9uIGxvYWRzIHRoZSBzdGFjayBndWFyZCB2YWx1ZS4gVGFyZ2V0cyB3aGljaCBuZWVkCisvLy8gdG8gcHJldmVudCB0aGUgc3RhY2sgZ3VhcmQgdmFsdWUgb3IgYWRkcmVzcyBmcm9tIGJlaW5nIHNwaWxsZWQgdG8gdGhlCisvLy8gc3RhY2sgc2hvdWxkIG92ZXJyaWRlIFRhcmdldExvd2VyaW5nOjplbWl0TG9hZFN0YWNrR3VhcmROb2RlIGFuZAorLy8vIGFkZGl0aW9uYWxseSBleHBhbmQgdGhpcyBwc2V1ZG8gYWZ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKExPQURfU1RBQ0tfR1VBUkQpCisKKy8vLyBDYWxsIGluc3RydWN0aW9uIHdpdGggYXNzb2NpYXRlZCB2bSBzdGF0ZSBmb3IgZGVvcHRpbWl6YXRpb24gYW5kIGxpc3QKKy8vLyBvZiBsaXZlIHBvaW50ZXJzIGZvciByZWxvY2F0aW9uIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4gIEl0IGlzCisvLy8gaW50ZW5kZWQgdG8gc3VwcG9ydCBnYXJiYWdlIGNvbGxlY3Rpb24gd2l0aCBmdWxseSBwcmVjaXNlIHJlbG9jYXRpbmcKKy8vLyBjb2xsZWN0b3JzIGFuZCBkZW9wdGltaXphdGlvbnMgaW4gZWl0aGVyIHRoZSBjYWxsZWUgb3IgY2FsbGVyLgorSEFORExFX1RBUkdFVF9PUENPREUoU1RBVEVQT0lOVCkKKworLy8vIEluc3RydWN0aW9uIHRoYXQgcmVjb3JkcyB0aGUgb2Zmc2V0IG9mIGEgbG9jYWwgc3RhY2sgYWxsb2NhdGlvbiBwYXNzZWQgdG8KKy8vLyBsbHZtLmxvY2FsZXNjYXBlLiBJdCBoYXMgdHdvIGFyZ3VtZW50czogdGhlIHN5bWJvbCBmb3IgdGhlIGxhYmVsIGFuZCB0aGUKKy8vLyBmcmFtZSBpbmRleCBvZiB0aGUgbG9jYWwgc3RhY2sgYWxsb2NhdGlvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKExPQ0FMX0VTQ0FQRSkKKworLy8vIFdyYXBzIGEgbWFjaGluZSBpbnN0cnVjdGlvbiB3aGljaCBjYW4gZmF1bHQsIGJ1bmRsZWQgd2l0aCBhc3NvY2lhdGVkCisvLy8gaW5mb3JtYXRpb24gb24gaG93IHRvIGhhbmRsZSBzdWNoIGEgZmF1bHQuCisvLy8gRm9yIGV4YW1wbGUgbG9hZGluZyBpbnN0cnVjdGlvbiB0aGF0IG1heSBwYWdlIGZhdWx0LCBidW5kbGVkIHdpdGggYXNzb2NpYXRlZAorLy8vIGluZm9ybWF0aW9uIG9uIGhvdyB0byBoYW5kbGUgc3VjaCBhIHBhZ2UgZmF1bHQuICBJdCBpcyBpbnRlbmRlZCB0byBzdXBwb3J0CisvLy8gInplcm8gY29zdCIgbnVsbCBjaGVja3MgaW4gbWFuYWdlZCBsYW5ndWFnZXMgYnkgYWxsb3dpbmcgTExWTSB0byBmb2xkCisvLy8gY29tcGFyaXNvbnMgaW50byBleGlzdGluZyBtZW1vcnkgb3BlcmF0aW9ucy4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEZBVUxUSU5HX09QKQorCisvLy8gV3JhcHMgYSBtYWNoaW5lIGluc3RydWN0aW9uIHRvIGFkZCBwYXRjaGFiaWxpdHkgY29uc3RyYWludHMuICBBbgorLy8vIGluc3RydWN0aW9uIHdyYXBwZWQgaW4gUEFUQ0hBQkxFX09QIGhhcyB0byBlaXRoZXIgaGF2ZSBhIG1pbmltdW0KKy8vLyBzaXplIG9yIGJlIHByZWNlZGVkIHdpdGggYSBub3Agb2YgdGhhdCBzaXplLiAgVGhlIGZpcnN0IG9wZXJhbmQgaXMKKy8vLyBhbiBpbW1lZGlhdGUgZGVub3RpbmcgdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24sIHRoZQorLy8vIHNlY29uZCBvcGVyYW5kIGlzIGFuIGltbWVkaWF0ZSBkZW5vdGluZyB0aGUgb3Bjb2RlIG9mIHRoZSBvcmlnaW5hbAorLy8vIGluc3RydWN0aW9uLiAgVGhlIHJlc3Qgb2YgdGhlIG9wZXJhbmRzIGFyZSB0aGUgb3BlcmFuZHMgb2YgdGhlCisvLy8gb3JpZ2luYWwgaW5zdHJ1Y3Rpb24uCitIQU5ETEVfVEFSR0VUX09QQ09ERShQQVRDSEFCTEVfT1ApCisKKy8vLyBUaGlzIGlzIGEgbWFya2VyIGluc3RydWN0aW9uIHdoaWNoIGdldHMgdHJhbnNsYXRlZCBpbnRvIGEgbm9wIHNsZWQsIHVzZWZ1bAorLy8vIGZvciBpbnNlcnRpbmcgaW5zdHJ1bWVudGF0aW9uIGluc3RydWN0aW9ucyBhdCBydW50aW1lLgorSEFORExFX1RBUkdFVF9PUENPREUoUEFUQ0hBQkxFX0ZVTkNUSU9OX0VOVEVSKQorCisvLy8gV3JhcHMgYSByZXR1cm4gaW5zdHJ1Y3Rpb24gYW5kIGl0cyBvcGVyYW5kcyB0byBlbmFibGUgYWRkaW5nIG5vcCBzbGVkcworLy8vIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlIHJldHVybi4gVGhlIG5vcCBzbGVkcyBhcmUgdXNlZnVsIGZvciBpbnNlcnRpbmcKKy8vLyBpbnN0cnVtZW50YXRpb24gaW5zdHJ1Y3Rpb25zIGF0IHJ1bnRpbWUuCisvLy8gVGhlIHBhdGNoIGhlcmUgcmVwbGFjZXMgdGhlIHJldHVybiBpbnN0cnVjdGlvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKFBBVENIQUJMRV9SRVQpCisKKy8vLyBUaGlzIGlzIGEgbWFya2VyIGluc3RydWN0aW9uIHdoaWNoIGdldHMgdHJhbnNsYXRlZCBpbnRvIGEgbm9wIHNsZWQsIHVzZWZ1bAorLy8vIGZvciBpbnNlcnRpbmcgaW5zdHJ1bWVudGF0aW9uIGluc3RydWN0aW9ucyBhdCBydW50aW1lLgorLy8vIFRoZSBwYXRjaCBoZXJlIHByZXBlbmRzIHRoZSByZXR1cm4gaW5zdHJ1Y3Rpb24uCisvLy8gVGhlIHNhbWUgdGhpbmcgYXMgaW4geDg2XzY0IGlzIG5vdCBwb3NzaWJsZSBmb3IgQVJNIGJlY2F1c2UgaXQgaGFzIG11bHRpcGxlCisvLy8gcmV0dXJuIGluc3RydWN0aW9ucy4gRnVydGhlcm1vcmUsIENQVSBhbGxvd3MgcGFyYW1ldHJpemVkIGFuZCBldmVuCisvLy8gY29uZGl0aW9uYWwgcmV0dXJuIGluc3RydWN0aW9ucy4gSW4gdGhlIGN1cnJlbnQgQVJNIGltcGxlbWVudGF0aW9uIHdlIGFyZQorLy8vIG1ha2luZyB1c2Ugb2YgdGhlIGZhY3QgdGhhdCBjdXJyZW50bHkgTExWTSBkb2Vzbid0IHNlZW0gdG8gZ2VuZXJhdGUKKy8vLyBjb25kaXRpb25hbCByZXR1cm4gaW5zdHJ1Y3Rpb25zLgorLy8vIE9uIEFSTSwgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gY2FuIGJlIHVzZWQgZm9yIHBvcHBpbmcgbXVsdGlwbGUgcmVnaXN0ZXJzCisvLy8gZnJvbSB0aGUgc3RhY2sgYW5kIHJldHVybmluZyAoaXQganVzdCBwb3BzIHBjIHJlZ2lzdGVyIHRvbyksIGFuZCBMTFZNCisvLy8gZ2VuZXJhdGVzIGl0IHNvbWV0aW1lcy4gU28gd2UgY2FuJ3QgaW5zZXJ0IHRoZSBzbGVkIGJldHdlZW4gdGhpcyBzdGFjaworLy8vIGFkanVzdG1lbnQgYW5kIHRoZSByZXR1cm4gd2l0aG91dCBzcGxpdHRpbmcgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uIGludG8gMgorLy8vIGluc3RydWN0aW9ucy4gU28gb24gQVJNLCByYXRoZXIgdGhhbiBqdW1waW5nIGludG8gdGhlIGV4aXQgdHJhbXBvbGluZSwgd2UKKy8vLyBjYWxsIGl0LCBpdCBkb2VzIHRoZSB0cmFjaW5nLCBwcmVzZXJ2ZXMgdGhlIHN0YWNrIGFuZCByZXR1cm5zLgorSEFORExFX1RBUkdFVF9PUENPREUoUEFUQ0hBQkxFX0ZVTkNUSU9OX0VYSVQpCisKKy8vLyBXcmFwcyBhIHRhaWwgY2FsbCBpbnN0cnVjdGlvbiBhbmQgaXRzIG9wZXJhbmRzIHRvIGVuYWJsZSBhZGRpbmcgbm9wIHNsZWRzCisvLy8gZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgdGFpbCBleGl0LiBXZSB1c2UgdGhpcyBhcyBhIGRpc2FtYmlndWF0aW9uIGZyb20KKy8vLyBQQVRDSEFCTEVfUkVUIHdoaWNoIHNwZWNpZmljYWxseSBvbmx5IHdvcmtzIGZvciByZXR1cm4gaW5zdHJ1Y3Rpb25zLgorSEFORExFX1RBUkdFVF9PUENPREUoUEFUQ0hBQkxFX1RBSUxfQ0FMTCkKKworLy8vIFdyYXBzIGEgbG9nZ2luZyBjYWxsIGFuZCBpdHMgYXJndW1lbnRzIHdpdGggbm9wIHNsZWRzLiBBdCBydW50aW1lLCB0aGlzIGNhbiBiZQorLy8vIHBhdGNoZWQgdG8gaW5zZXJ0IGluc3RydW1lbnRhdGlvbiBpbnN0cnVjdGlvbnMuCitIQU5ETEVfVEFSR0VUX09QQ09ERShQQVRDSEFCTEVfRVZFTlRfQ0FMTCkKKworSEFORExFX1RBUkdFVF9PUENPREUoSUNBTExfQlJBTkNIX0ZVTk5FTCkKKworLy8vIFRoZSBmb2xsb3dpbmcgZ2VuZXJpYyBvcGNvZGVzIGFyZSBub3Qgc3VwcG9zZWQgdG8gYXBwZWFyIGFmdGVyIElTZWwuCisvLy8gVGhpcyBpcyBzb21ldGhpbmcgd2UgbWlnaHQgd2FudCB0byByZWxheCwgYnV0IGZvciBub3csIHRoaXMgaXMgY29udmVuaWVudAorLy8vIHRvIHByb2R1Y2UgZGlhZ25vc3RpY3MuCisKKy8vLyBHZW5lcmljIEFERCBpbnN0cnVjdGlvbi4gVGhpcyBpcyBhbiBpbnRlZ2VyIGFkZC4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfQUREKQorSEFORExFX1RBUkdFVF9PUENPREVfTUFSS0VSKFBSRV9JU0VMX0dFTkVSSUNfT1BDT0RFX1NUQVJULCBHX0FERCkKKworLy8vIEdlbmVyaWMgU1VCIGluc3RydWN0aW9uLiBUaGlzIGlzIGFuIGludGVnZXIgc3ViLgorSEFORExFX1RBUkdFVF9PUENPREUoR19TVUIpCisKKy8vIEdlbmVyaWMgbXVsdGlwbHkgaW5zdHJ1Y3Rpb24uCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX01VTCkKKworLy8gR2VuZXJpYyBzaWduZWQgZGl2aXNpb24gaW5zdHJ1Y3Rpb24uCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1NESVYpCisKKy8vIEdlbmVyaWMgdW5zaWduZWQgZGl2aXNpb24gaW5zdHJ1Y3Rpb24uCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1VESVYpCisKKy8vIEdlbmVyaWMgc2lnbmVkIHJlbWFpbmRlciBpbnN0cnVjdGlvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfU1JFTSkKKworLy8gR2VuZXJpYyB1bnNpZ25lZCByZW1haW5kZXIgaW5zdHJ1Y3Rpb24uCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1VSRU0pCisKKy8vLyBHZW5lcmljIGJpdHdpc2UgYW5kIGluc3RydWN0aW9uLgorSEFORExFX1RBUkdFVF9PUENPREUoR19BTkQpCisKKy8vLyBHZW5lcmljIGJpdHdpc2Ugb3IgaW5zdHJ1Y3Rpb24uCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX09SKQorCisvLy8gR2VuZXJpYyBiaXR3aXNlIGV4Y2x1c2l2ZS1vciBpbnN0cnVjdGlvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfWE9SKQorCisKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfSU1QTElDSVRfREVGKQorCisvLy8gR2VuZXJpYyBQSEkgaW5zdHJ1Y3Rpb24gd2l0aCB0eXBlcy4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfUEhJKQorCisvLy8gR2VuZXJpYyBpbnN0cnVjdGlvbiB0byBtYXRlcmlhbGl6ZSB0aGUgYWRkcmVzcyBvZiBhbiBhbGxvY2Egb3Igb3RoZXIKKy8vLyBzdGFjay1iYXNlZCBvYmplY3QuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0ZSQU1FX0lOREVYKQorCisvLy8gR2VuZXJpYyByZWZlcmVuY2UgdG8gZ2xvYmFsIHZhbHVlLgorSEFORExFX1RBUkdFVF9PUENPREUoR19HTE9CQUxfVkFMVUUpCisKKy8vLyBHZW5lcmljIGluc3RydWN0aW9uIHRvIGV4dHJhY3QgYmxvY2tzIG9mIGJpdHMgZnJvbSB0aGUgcmVnaXN0ZXIgZ2l2ZW4KKy8vLyAodHlwaWNhbGx5IGEgc3ViLXJlZ2lzdGVyIENPUFkgYWZ0ZXIgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uKS4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfRVhUUkFDVCkKKworSEFORExFX1RBUkdFVF9PUENPREUoR19VTk1FUkdFX1ZBTFVFUykKKworLy8vIEdlbmVyaWMgaW5zdHJ1Y3Rpb24gdG8gaW5zZXJ0IGJsb2NrcyBvZiBiaXRzIGZyb20gdGhlIHJlZ2lzdGVycyBnaXZlbiBpbnRvCisvLy8gdGhlIHNvdXJjZS4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfSU5TRVJUKQorCisvLy8gR2VuZXJpYyBpbnN0cnVjdGlvbiB0byBwYXN0ZSBhIHZhcmlhYmxlIG51bWJlciBvZiBjb21wb25lbnRzIHRvZ2V0aGVyIGludG8gYQorLy8vIGxhcmdlciByZWdpc3Rlci4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfTUVSR0VfVkFMVUVTKQorCisvLy8gR2VuZXJpYyBwb2ludGVyIHRvIGludCBjb252ZXJzaW9uLgorSEFORExFX1RBUkdFVF9PUENPREUoR19QVFJUT0lOVCkKKworLy8vIEdlbmVyaWMgaW50IHRvIHBvaW50ZXIgY29udmVyc2lvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfSU5UVE9QVFIpCisKKy8vLyBHZW5lcmljIGJpdGNhc3QuIFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHR5cGVzIG11c3QgYmUgZGlmZmVyZW50LCBvciBhCisvLy8gQ09QWSBpcyB0aGUgcmVsZXZhbnQgaW5zdHJ1Y3Rpb24uCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0JJVENBU1QpCisKKy8vLyBHZW5lcmljIGxvYWQuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0xPQUQpCisKKy8vLyBHZW5lcmljIHN0b3JlLgorSEFORExFX1RBUkdFVF9PUENPREUoR19TVE9SRSkKKworLy8vIEdlbmVyaWMgYXRvbWljIGNtcHhjaGcgd2l0aCBpbnRlcm5hbCBzdWNjZXNzIGNoZWNrLgorSEFORExFX1RBUkdFVF9PUENPREUoR19BVE9NSUNfQ01QWENIR19XSVRIX1NVQ0NFU1MpCisKKy8vLyBHZW5lcmljIGF0b21pYyBjbXB4Y2hnLgorSEFORExFX1RBUkdFVF9PUENPREUoR19BVE9NSUNfQ01QWENIRykKKworLy8vIEdlbmVyaWMgYXRvbWljcm13LgorSEFORExFX1RBUkdFVF9PUENPREUoR19BVE9NSUNSTVdfWENIRykKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfQVRPTUlDUk1XX0FERCkKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfQVRPTUlDUk1XX1NVQikKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfQVRPTUlDUk1XX0FORCkKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfQVRPTUlDUk1XX05BTkQpCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0FUT01JQ1JNV19PUikKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfQVRPTUlDUk1XX1hPUikKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfQVRPTUlDUk1XX01BWCkKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfQVRPTUlDUk1XX01JTikKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfQVRPTUlDUk1XX1VNQVgpCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0FUT01JQ1JNV19VTUlOKQorCisvLy8gR2VuZXJpYyBjb25kaXRpb25hbCBicmFuY2ggaW5zdHJ1Y3Rpb24uCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0JSQ09ORCkKKworLy8vIEdlbmVyaWMgaW5kaXJlY3QgYnJhbmNoIGluc3RydWN0aW9uLgorSEFORExFX1RBUkdFVF9PUENPREUoR19CUklORElSRUNUKQorCisvLy8gR2VuZXJpYyBpbnRyaW5zaWMgdXNlICh3aXRob3V0IHNpZGUgZWZmZWN0cykuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0lOVFJJTlNJQykKKworLy8vIEdlbmVyaWMgaW50cmluc2ljIHVzZSAod2l0aCBzaWRlIGVmZmVjdHMpLgorSEFORExFX1RBUkdFVF9PUENPREUoR19JTlRSSU5TSUNfV19TSURFX0VGRkVDVFMpCisKKy8vLyBHZW5lcmljIGV4dGVuc2lvbiBhbGxvd2luZyBydWJiaXNoIGluIGhpZ2ggYml0cy4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfQU5ZRVhUKQorCisvLy8gR2VuZXJpYyBpbnN0cnVjdGlvbiB0byBkaXNjYXJkIHRoZSBoaWdoIGJpdHMgb2YgYSByZWdpc3Rlci4gVGhpcyBkaWZmZXJzCisvLy8gZnJvbSAoR19FWFRSQUNUIHZhbCwgMCkgb24gaXRzIGFjdGlvbiBvbiB2ZWN0b3JzOiBHX1RSVU5DIHdpbGwgdHJ1bmNhdGUKKy8vLyBlYWNoIGVsZW1lbnQgaW5kaXZpZHVhbGx5LCBHX0VYVFJBQ1Qgd2lsbCB0eXBpY2FsbHkgZGlzY2FyZCB0aGUgaGlnaAorLy8vIGVsZW1lbnRzIG9mIHRoZSB2ZWN0b3IuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1RSVU5DKQorCisvLy8gR2VuZXJpYyBpbnRlZ2VyIGNvbnN0YW50LgorSEFORExFX1RBUkdFVF9PUENPREUoR19DT05TVEFOVCkKKworLy8vIEdlbmVyaWMgZmxvYXRpbmcgY29uc3RhbnQuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0ZDT05TVEFOVCkKKworLy8vIEdlbmVyaWMgdmFfc3RhcnQgaW5zdHJ1Y3Rpb24uIFN0b3JlcyB0byBpdHMgb25lIHBvaW50ZXIgb3BlcmFuZC4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfVkFTVEFSVCkKKworLy8vIEdlbmVyaWMgdmFfc3RhcnQgaW5zdHJ1Y3Rpb24uIFN0b3JlcyB0byBpdHMgb25lIHBvaW50ZXIgb3BlcmFuZC4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfVkFBUkcpCisKKy8vIEdlbmVyaWMgc2lnbiBleHRlbmQKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfU0VYVCkKKworLy8gR2VuZXJpYyB6ZXJvIGV4dGVuZAorSEFORExFX1RBUkdFVF9PUENPREUoR19aRVhUKQorCisvLyBHZW5lcmljIGxlZnQtc2hpZnQKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfU0hMKQorCisvLyBHZW5lcmljIGxvZ2ljYWwgcmlnaHQtc2hpZnQKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfTFNIUikKKworLy8gR2VuZXJpYyBhcml0aG1ldGljIHJpZ2h0LXNoaWZ0CitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0FTSFIpCisKKy8vLyBHZW5lcmljIGludGVnZXItYmFzZSBjb21wYXJpc29uLCBhbHNvIGFwcGxpY2FibGUgdG8gdmVjdG9ycyBvZiBpbnRlZ2Vycy4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfSUNNUCkKKworLy8vIEdlbmVyaWMgZmxvYXRpbmctcG9pbnQgY29tcGFyaXNvbiwgYWxzbyBhcHBsaWNhYmxlIHRvIHZlY3RvcnMuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0ZDTVApCisKKy8vLyBHZW5lcmljIHNlbGVjdC4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfU0VMRUNUKQorCisvLy8gR2VuZXJpYyB1bnNpZ25lZCBhZGQgaW5zdHJ1Y3Rpb24sIGNvbnN1bWluZyB0aGUgbm9ybWFsIG9wZXJhbmRzIHBsdXMgYSBjYXJyeQorLy8vIGZsYWcsIGFuZCBzaW1pbGFybHkgcHJvZHVjaW5nIHRoZSByZXN1bHQgYW5kIGEgY2FycnkgZmxhZy4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfVUFEREUpCisKKy8vLyBHZW5lcmljIHVuc2lnbmVkIHN1YnRyYWN0IGluc3RydWN0aW9uLCBjb25zdW1pbmcgdGhlIG5vcm1hbCBvcGVyYW5kcyBwbHVzIGEKKy8vLyBjYXJyeSBmbGFnLCBhbmQgc2ltaWxhcmx5IHByb2R1Y2luZyB0aGUgcmVzdWx0IGFuZCBhIGNhcnJ5IGZsYWcuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1VTVUJFKQorCisvLy8gR2VuZXJpYyBzaWduZWQgYWRkIGluc3RydWN0aW9uLCBwcm9kdWNpbmcgdGhlIHJlc3VsdCBhbmQgYSBzaWduZWQgb3ZlcmZsb3cKKy8vLyBmbGFnLgorSEFORExFX1RBUkdFVF9PUENPREUoR19TQURETykKKworLy8vIEdlbmVyaWMgc2lnbmVkIHN1YnRyYWN0IGluc3RydWN0aW9uLCBwcm9kdWNpbmcgdGhlIHJlc3VsdCBhbmQgYSBzaWduZWQKKy8vLyBvdmVyZmxvdyBmbGFnLgorSEFORExFX1RBUkdFVF9PUENPREUoR19TU1VCTykKKworLy8vIEdlbmVyaWMgdW5zaWduZWQgbXVsdGlwbHkgaW5zdHJ1Y3Rpb24sIHByb2R1Y2luZyB0aGUgcmVzdWx0IGFuZCBhIHNpZ25lZAorLy8vIG92ZXJmbG93IGZsYWcuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1VNVUxPKQorCisvLy8gR2VuZXJpYyBzaWduZWQgbXVsdGlwbHkgaW5zdHJ1Y3Rpb24sIHByb2R1Y2luZyB0aGUgcmVzdWx0IGFuZCBhIHNpZ25lZAorLy8vIG92ZXJmbG93IGZsYWcuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1NNVUxPKQorCisvLyBNdWx0aXBseSB0d28gbnVtYmVycyBhdCB0d2ljZSB0aGUgaW5jb21pbmcgYml0IHdpZHRoICh1bnNpZ25lZCkgYW5kIHJldHVybgorLy8gdGhlIGhpZ2ggaGFsZiBvZiB0aGUgcmVzdWx0LgorSEFORExFX1RBUkdFVF9PUENPREUoR19VTVVMSCkKKworLy8gTXVsdGlwbHkgdHdvIG51bWJlcnMgYXQgdHdpY2UgdGhlIGluY29taW5nIGJpdCB3aWR0aCAoc2lnbmVkKSBhbmQgcmV0dXJuCisvLyB0aGUgaGlnaCBoYWxmIG9mIHRoZSByZXN1bHQuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1NNVUxIKQorCisvLy8gR2VuZXJpYyBGUCBhZGRpdGlvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfRkFERCkKKworLy8vIEdlbmVyaWMgRlAgc3VidHJhY3Rpb24uCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0ZTVUIpCisKKy8vLyBHZW5lcmljIEZQIG11bHRpcGxpY2F0aW9uLgorSEFORExFX1RBUkdFVF9PUENPREUoR19GTVVMKQorCisvLy8gR2VuZXJpYyBGTUEgbXVsdGlwbGljYXRpb24uIEJlaGF2ZXMgbGlrZSBsbHZtIGZtYSBpbnRyaW5zaWMKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfRk1BKQorCisvLy8gR2VuZXJpYyBGUCBkaXZpc2lvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfRkRJVikKKworLy8vIEdlbmVyaWMgRlAgcmVtYWluZGVyLgorSEFORExFX1RBUkdFVF9PUENPREUoR19GUkVNKQorCisvLy8gR2VuZXJpYyBGUCBleHBvbmVudGlhdGlvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfRlBPVykKKworLy8vIEdlbmVyaWMgYmFzZS1lIGV4cG9uZW50aWFsIG9mIGEgdmFsdWUuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0ZFWFApCisKKy8vLyBHZW5lcmljIGJhc2UtMiBleHBvbmVudGlhbCBvZiBhIHZhbHVlLgorSEFORExFX1RBUkdFVF9PUENPREUoR19GRVhQMikKKworLy8vIEZsb2F0aW5nIHBvaW50IGJhc2UtZSBsb2dhcml0aG0gb2YgYSB2YWx1ZS4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfRkxPRykKKworLy8vIEZsb2F0aW5nIHBvaW50IGJhc2UtMiBsb2dhcml0aG0gb2YgYSB2YWx1ZS4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfRkxPRzIpCisKKy8vLyBHZW5lcmljIEZQIG5lZ2F0aW9uLgorSEFORExFX1RBUkdFVF9PUENPREUoR19GTkVHKQorCisvLy8gR2VuZXJpYyBGUCBleHRlbnNpb24uCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0ZQRVhUKQorCisvLy8gR2VuZXJpYyBmbG9hdCB0byBzaWduZWQtaW50IGNvbnZlcnNpb24KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfRlBUUlVOQykKKworLy8vIEdlbmVyaWMgZmxvYXQgdG8gc2lnbmVkLWludCBjb252ZXJzaW9uCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0ZQVE9TSSkKKworLy8vIEdlbmVyaWMgZmxvYXQgdG8gdW5zaWduZWQtaW50IGNvbnZlcnNpb24KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfRlBUT1VJKQorCisvLy8gR2VuZXJpYyBzaWduZWQtaW50IHRvIGZsb2F0IGNvbnZlcnNpb24KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfU0lUT0ZQKQorCisvLy8gR2VuZXJpYyB1bnNpZ25lZC1pbnQgdG8gZmxvYXQgY29udmVyc2lvbgorSEFORExFX1RBUkdFVF9PUENPREUoR19VSVRPRlApCisKKy8vLyBHZW5lcmljIEZQIGFic29sdXRlIHZhbHVlLgorSEFORExFX1RBUkdFVF9PUENPREUoR19GQUJTKQorCisvLy8gR2VuZXJpYyBwb2ludGVyIG9mZnNldAorSEFORExFX1RBUkdFVF9PUENPREUoR19HRVApCisKKy8vLyBDbGVhciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBsb3cgYml0cyBpbiBhIHBvaW50ZXIuIFRoaXMgcm91bmRzIHRoZSB2YWx1ZQorLy8vICpkb3duKiB0byB0aGUgZ2l2ZW4gYWxpZ25tZW50LgorSEFORExFX1RBUkdFVF9PUENPREUoR19QVFJfTUFTSykKKworLy8vIEdlbmVyaWMgQlJBTkNIIGluc3RydWN0aW9uLiBUaGlzIGlzIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoLgorSEFORExFX1RBUkdFVF9PUENPREUoR19CUikKKworLy8vIEdlbmVyaWMgaW5zZXJ0ZWxlbWVudC4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfSU5TRVJUX1ZFQ1RPUl9FTFQpCisKKy8vLyBHZW5lcmljIGV4dHJhY3RlbGVtZW50LgorSEFORExFX1RBUkdFVF9PUENPREUoR19FWFRSQUNUX1ZFQ1RPUl9FTFQpCisKKy8vLyBHZW5lcmljIHNodWZmbGV2ZWN0b3IuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1NIVUZGTEVfVkVDVE9SKQorCisvLy8gR2VuZXJpYyBieXRlIHN3YXAuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0JTV0FQKQorCisvLyBUT0RPOiBBZGQgbW9yZSBnZW5lcmljIG9wY29kZXMgYXMgd2UgbW92ZSBhbG9uZy4KKworLy8vIE1hcmtlciBmb3IgdGhlIGVuZCBvZiB0aGUgZ2VuZXJpYyBvcGNvZGUuCisvLy8gVGhpcyBpcyB1c2VkIHRvIGNoZWNrIGlmIGFuIG9wY29kZSBpcyBpbiB0aGUgcmFuZ2Ugb2YgdGhlCisvLy8gZ2VuZXJpYyBvcGNvZGVzLgorSEFORExFX1RBUkdFVF9PUENPREVfTUFSS0VSKFBSRV9JU0VMX0dFTkVSSUNfT1BDT0RFX0VORCwgR19CU1dBUCkKKworLy8vIEJVSUxUSU5fT1BfRU5EIC0gVGhpcyBtdXN0IGJlIHRoZSBsYXN0IGVudW0gdmFsdWUgaW4gdGhpcyBsaXN0LgorLy8vIFRoZSB0YXJnZXQtc3BlY2lmaWMgcG9zdC1pc2VsIG9wY29kZSB2YWx1ZXMgc3RhcnQgaGVyZS4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFX01BUktFUihHRU5FUklDX09QX0VORCwgUFJFX0lTRUxfR0VORVJJQ19PUENPREVfRU5EKQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RhcmdldFBhcnNlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RhcmdldFBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYmE5OTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGFyZ2V0UGFyc2VyLmgKQEAgLTAsMCArMSwyNjIgQEAKKy8vPT09LS0gVGFyZ2V0UGFyc2VyIC0gUGFyc2VyIGZvciB0YXJnZXQgZmVhdHVyZXMgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSB0YXJnZXQgcGFyc2VyIHRvIHJlY29nbmlzZSBoYXJkd2FyZSBmZWF0dXJlcyBzdWNoIGFzCisvLyBGUFUvQ1BVL0FSQ0ggbmFtZXMgYXMgd2VsbCBhcyBzcGVjaWZpYyBzdXBwb3J0IHN1Y2ggYXMgSERJViwgZXRjLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1RBUkdFVFBBUlNFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9UQVJHRVRQQVJTRVJfSAorCisvLyBGSVhNRTogdmVjdG9yIGlzIHVzZWQgYmVjYXVzZSB0aGF0J3Mgd2hhdCBjbGFuZyB1c2VzIGZvciBzdWJ0YXJnZXQgZmVhdHVyZQorLy8gbGlzdHMsIGJ1dCBTbWFsbFZlY3RvciB3b3VsZCBwcm9iYWJseSBiZSBiZXR0ZXIKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFN0cmluZ1JlZjsKKworLy8gVGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIGludG8gdGhlaXIgb3duIG5hbWVzcGFjZXMuIFRoZXNlIHNob3VsZCBiZQorLy8gZ2VuZXJhdGVkIGZyb20gVGFibGVHZW4gYmVjYXVzZSB0aGUgaW5mb3JtYXRpb24gaXMgYWxyZWFkeSB0aGVyZSwgYW5kIHRoZXJlCisvLyBpcyB3aGVyZSBuZXcgaW5mb3JtYXRpb24gYWJvdXQgdGFyZ2V0cyB3aWxsIGJlIGFkZGVkLgorLy8gRklYTUU6IFRvIFRhYmxlR2VuIHRoaXMgd2UgbmVlZCB0byBtYWtlIHNvbWUgdGFibGUgZ2VuZXJhdGVkIGZpbGVzIGF2YWlsYWJsZQorLy8gZXZlbiBpZiB0aGUgYmFjay1lbmQgaXMgbm90IGNvbXBpbGVkIHdpdGggTExWTSwgcGx1cyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldworLy8gYmFjay1lbmQgdG8gVGFibGVHZW4gdG8gY3JlYXRlIHRoZXNlIGNsZWFuIHRhYmxlcy4KK25hbWVzcGFjZSBBUk0geworCisvLyBGUFUgVmVyc2lvbgorZW51bSBjbGFzcyBGUFVWZXJzaW9uIHsKKyAgTk9ORSwKKyAgVkZQVjIsCisgIFZGUFYzLAorICBWRlBWM19GUDE2LAorICBWRlBWNCwKKyAgVkZQVjUKK307CisKKy8vIEFuIEZQVSBuYW1lIHJlc3RyaWN0cyB0aGUgRlBVIGluIG9uZSBvZiB0aHJlZSB3YXlzOgorZW51bSBjbGFzcyBGUFVSZXN0cmljdGlvbiB7CisgIE5vbmUgPSAwLCAvLy88IE5vIHJlc3RyaWN0aW9uCisgIEQxNiwgICAgICAvLy88IE9ubHkgMTYgRCByZWdpc3RlcnMKKyAgU1BfRDE2ICAgIC8vLzwgT25seSBzaW5nbGUtcHJlY2lzaW9uIGluc3RydWN0aW9ucywgd2l0aCAxNiBEIHJlZ2lzdGVycworfTsKKworLy8gQW4gRlBVIG5hbWUgaW1wbGllcyBvbmUgb2YgdGhyZWUgbGV2ZWxzIG9mIE5lb24gc3VwcG9ydDoKK2VudW0gY2xhc3MgTmVvblN1cHBvcnRMZXZlbCB7CisgIE5vbmUgPSAwLCAvLy88IE5vIE5lb24KKyAgTmVvbiwgICAgIC8vLzwgTmVvbgorICBDcnlwdG8gICAgLy8vPCBOZW9uIHdpdGggQ3J5cHRvCit9OworCisvLyBGUFUgbmFtZXMuCitlbnVtIEZQVUtpbmQgeworI2RlZmluZSBBUk1fRlBVKE5BTUUsIEtJTkQsIFZFUlNJT04sIE5FT05fU1VQUE9SVCwgUkVTVFJJQ1RJT04pIEtJTkQsCisjaW5jbHVkZSAiQVJNVGFyZ2V0UGFyc2VyLmRlZiIKKyAgRktfTEFTVAorfTsKKworLy8gQXJjaCBuYW1lcy4KK2VudW0gY2xhc3MgQXJjaEtpbmQgeworI2RlZmluZSBBUk1fQVJDSChOQU1FLCBJRCwgQ1BVX0FUVFIsIFNVQl9BUkNILCBBUkNIX0FUVFIsIEFSQ0hfRlBVLCBBUkNIX0JBU0VfRVhUKSBJRCwKKyNpbmNsdWRlICJBUk1UYXJnZXRQYXJzZXIuZGVmIgorfTsKKworLy8gQXJjaCBleHRlbnNpb24gbW9kaWZpZXJzIGZvciBDUFVzLgorZW51bSBBcmNoRXh0S2luZCA6IHVuc2lnbmVkIHsKKyAgQUVLX0lOVkFMSUQgPSAgICAgMCwKKyAgQUVLX05PTkUgPSAgICAgICAgMSwKKyAgQUVLX0NSQyA9ICAgICAgICAgMSA8PCAxLAorICBBRUtfQ1JZUFRPID0gICAgICAxIDw8IDIsCisgIEFFS19GUCA9ICAgICAgICAgIDEgPDwgMywKKyAgQUVLX0hXRElWVEhVTUIgPSAgMSA8PCA0LAorICBBRUtfSFdESVZBUk0gPSAgICAxIDw8IDUsCisgIEFFS19NUCA9ICAgICAgICAgIDEgPDwgNiwKKyAgQUVLX1NJTUQgPSAgICAgICAgMSA8PCA3LAorICBBRUtfU0VDID0gICAgICAgICAxIDw8IDgsCisgIEFFS19WSVJUID0gICAgICAgIDEgPDwgOSwKKyAgQUVLX0RTUCA9ICAgICAgICAgMSA8PCAxMCwKKyAgQUVLX0ZQMTYgPSAgICAgICAgMSA8PCAxMSwKKyAgQUVLX1JBUyA9ICAgICAgICAgMSA8PCAxMiwKKyAgQUVLX1NWRSA9ICAgICAgICAgMSA8PCAxMywKKyAgQUVLX0RPVFBST0QgPSAgICAgMSA8PCAxNCwKKyAgLy8gVW5zdXBwb3J0ZWQgZXh0ZW5zaW9ucy4KKyAgQUVLX09TID0gMHg4MDAwMDAwLAorICBBRUtfSVdNTVhUID0gMHgxMDAwMDAwMCwKKyAgQUVLX0lXTU1YVDIgPSAweDIwMDAwMDAwLAorICBBRUtfTUFWRVJJQ0sgPSAweDQwMDAwMDAwLAorICBBRUtfWFNDQUxFID0gMHg4MDAwMDAwMCwKK307CisKKy8vIElTQSBraW5kcy4KK2VudW0gY2xhc3MgSVNBS2luZCB7IElOVkFMSUQgPSAwLCBBUk0sIFRIVU1CLCBBQVJDSDY0IH07CisKKy8vIEVuZGlhbm5lc3MKKy8vIEZJWE1FOiBCRTggdnMuIEJFMzI/CitlbnVtIGNsYXNzIEVuZGlhbktpbmQgeyBJTlZBTElEID0gMCwgTElUVExFLCBCSUcgfTsKKworLy8gdjYvdjcvdjggUHJvZmlsZQorZW51bSBjbGFzcyBQcm9maWxlS2luZCB7IElOVkFMSUQgPSAwLCBBLCBSLCBNIH07CisKK1N0cmluZ1JlZiBnZXRDYW5vbmljYWxBcmNoTmFtZShTdHJpbmdSZWYgQXJjaCk7CisKKy8vIEluZm9ybWF0aW9uIGJ5IElECitTdHJpbmdSZWYgZ2V0RlBVTmFtZSh1bnNpZ25lZCBGUFVLaW5kKTsKK0ZQVVZlcnNpb24gZ2V0RlBVVmVyc2lvbih1bnNpZ25lZCBGUFVLaW5kKTsKK05lb25TdXBwb3J0TGV2ZWwgZ2V0RlBVTmVvblN1cHBvcnRMZXZlbCh1bnNpZ25lZCBGUFVLaW5kKTsKK0ZQVVJlc3RyaWN0aW9uIGdldEZQVVJlc3RyaWN0aW9uKHVuc2lnbmVkIEZQVUtpbmQpOworCisvLyBGSVhNRTogVGhlc2Ugc2hvdWxkIGJlIG1vdmVkIHRvIFRhcmdldFR1cGxlIG9uY2UgaXQgZXhpc3RzCitib29sIGdldEZQVUZlYXR1cmVzKHVuc2lnbmVkIEZQVUtpbmQsIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gJkZlYXR1cmVzKTsKK2Jvb2wgZ2V0SFdEaXZGZWF0dXJlcyh1bnNpZ25lZCBIV0RpdktpbmQsIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gJkZlYXR1cmVzKTsKK2Jvb2wgZ2V0RXh0ZW5zaW9uRmVhdHVyZXModW5zaWduZWQgRXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiAmRmVhdHVyZXMpOworCitTdHJpbmdSZWYgZ2V0QXJjaE5hbWUoQXJjaEtpbmQgQUspOwordW5zaWduZWQgZ2V0QXJjaEF0dHIoQXJjaEtpbmQgQUspOworU3RyaW5nUmVmIGdldENQVUF0dHIoQXJjaEtpbmQgQUspOworU3RyaW5nUmVmIGdldFN1YkFyY2goQXJjaEtpbmQgQUspOworU3RyaW5nUmVmIGdldEFyY2hFeHROYW1lKHVuc2lnbmVkIEFyY2hFeHRLaW5kKTsKK1N0cmluZ1JlZiBnZXRBcmNoRXh0RmVhdHVyZShTdHJpbmdSZWYgQXJjaEV4dCk7CitTdHJpbmdSZWYgZ2V0SFdEaXZOYW1lKHVuc2lnbmVkIEhXRGl2S2luZCk7CisKKy8vIEluZm9ybWF0aW9uIGJ5IE5hbWUKK3Vuc2lnbmVkICBnZXREZWZhdWx0RlBVKFN0cmluZ1JlZiBDUFUsIEFyY2hLaW5kIEFLKTsKK3Vuc2lnbmVkICBnZXREZWZhdWx0RXh0ZW5zaW9ucyhTdHJpbmdSZWYgQ1BVLCBBcmNoS2luZCBBSyk7CitTdHJpbmdSZWYgZ2V0RGVmYXVsdENQVShTdHJpbmdSZWYgQXJjaCk7CisKKy8vIFBhcnNlcgordW5zaWduZWQgcGFyc2VIV0RpdihTdHJpbmdSZWYgSFdEaXYpOwordW5zaWduZWQgcGFyc2VGUFUoU3RyaW5nUmVmIEZQVSk7CitBcmNoS2luZCBwYXJzZUFyY2goU3RyaW5nUmVmIEFyY2gpOwordW5zaWduZWQgcGFyc2VBcmNoRXh0KFN0cmluZ1JlZiBBcmNoRXh0KTsKK0FyY2hLaW5kIHBhcnNlQ1BVQXJjaChTdHJpbmdSZWYgQ1BVKTsKK3ZvaWQgZmlsbFZhbGlkQ1BVQXJjaExpc3QoU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gJlZhbHVlcyk7CitJU0FLaW5kIHBhcnNlQXJjaElTQShTdHJpbmdSZWYgQXJjaCk7CitFbmRpYW5LaW5kIHBhcnNlQXJjaEVuZGlhbihTdHJpbmdSZWYgQXJjaCk7CitQcm9maWxlS2luZCBwYXJzZUFyY2hQcm9maWxlKFN0cmluZ1JlZiBBcmNoKTsKK3Vuc2lnbmVkIHBhcnNlQXJjaFZlcnNpb24oU3RyaW5nUmVmIEFyY2gpOworCitTdHJpbmdSZWYgY29tcHV0ZURlZmF1bHRUYXJnZXRBQkkoY29uc3QgVHJpcGxlICZUVCwgU3RyaW5nUmVmIENQVSk7CisKK30gLy8gbmFtZXNwYWNlIEFSTQorCisvLyBGSVhNRTpUaGlzIHNob3VsZCBiZSBtYWRlIGludG8gY2xhc3MgZGVzaWduLHRvIGF2b2lkIGR1cHBsaWNhdGlvbi4KK25hbWVzcGFjZSBBQXJjaDY0IHsKKworLy8gQXJjaCBuYW1lcy4KK2VudW0gY2xhc3MgQXJjaEtpbmQgeworI2RlZmluZSBBQVJDSDY0X0FSQ0goTkFNRSwgSUQsIENQVV9BVFRSLCBTVUJfQVJDSCwgQVJDSF9BVFRSLCBBUkNIX0ZQVSwgQVJDSF9CQVNFX0VYVCkgSUQsCisjaW5jbHVkZSAiQUFyY2g2NFRhcmdldFBhcnNlci5kZWYiCit9OworCisvLyBBcmNoIGV4dGVuc2lvbiBtb2RpZmllcnMgZm9yIENQVXMuCitlbnVtIEFyY2hFeHRLaW5kIDogdW5zaWduZWQgeworICBBRUtfSU5WQUxJRCA9ICAgICAwLAorICBBRUtfTk9ORSA9ICAgICAgICAxLAorICBBRUtfQ1JDID0gICAgICAgICAxIDw8IDEsCisgIEFFS19DUllQVE8gPSAgICAgIDEgPDwgMiwKKyAgQUVLX0ZQID0gICAgICAgICAgMSA8PCAzLAorICBBRUtfU0lNRCA9ICAgICAgICAxIDw8IDQsCisgIEFFS19GUDE2ID0gICAgICAgIDEgPDwgNSwKKyAgQUVLX1BST0ZJTEUgPSAgICAgMSA8PCA2LAorICBBRUtfUkFTID0gICAgICAgICAxIDw8IDcsCisgIEFFS19MU0UgPSAgICAgICAgIDEgPDwgOCwKKyAgQUVLX1NWRSA9ICAgICAgICAgMSA8PCA5LAorICBBRUtfRE9UUFJPRCA9ICAgICAxIDw8IDEwLAorICBBRUtfUkNQQyA9ICAgICAgICAxIDw8IDExLAorICBBRUtfUkRNID0gICAgICAgICAxIDw8IDEyCit9OworCitTdHJpbmdSZWYgZ2V0Q2Fub25pY2FsQXJjaE5hbWUoU3RyaW5nUmVmIEFyY2gpOworCisvLyBJbmZvcm1hdGlvbiBieSBJRAorU3RyaW5nUmVmIGdldEZQVU5hbWUodW5zaWduZWQgRlBVS2luZCk7CitBUk06OkZQVVZlcnNpb24gZ2V0RlBVVmVyc2lvbih1bnNpZ25lZCBGUFVLaW5kKTsKK0FSTTo6TmVvblN1cHBvcnRMZXZlbCBnZXRGUFVOZW9uU3VwcG9ydExldmVsKHVuc2lnbmVkIEZQVUtpbmQpOworQVJNOjpGUFVSZXN0cmljdGlvbiBnZXRGUFVSZXN0cmljdGlvbih1bnNpZ25lZCBGUFVLaW5kKTsKKworLy8gRklYTUU6IFRoZXNlIHNob3VsZCBiZSBtb3ZlZCB0byBUYXJnZXRUdXBsZSBvbmNlIGl0IGV4aXN0cworYm9vbCBnZXRGUFVGZWF0dXJlcyh1bnNpZ25lZCBGUFVLaW5kLCBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+ICZGZWF0dXJlcyk7Citib29sIGdldEV4dGVuc2lvbkZlYXR1cmVzKHVuc2lnbmVkIEV4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gJkZlYXR1cmVzKTsKK2Jvb2wgZ2V0QXJjaEZlYXR1cmVzKEFyY2hLaW5kIEFLLCBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+ICZGZWF0dXJlcyk7CisKK1N0cmluZ1JlZiBnZXRBcmNoTmFtZShBcmNoS2luZCBBSyk7Cit1bnNpZ25lZCBnZXRBcmNoQXR0cihBcmNoS2luZCBBSyk7CitTdHJpbmdSZWYgZ2V0Q1BVQXR0cihBcmNoS2luZCBBSyk7CitTdHJpbmdSZWYgZ2V0U3ViQXJjaChBcmNoS2luZCBBSyk7CitTdHJpbmdSZWYgZ2V0QXJjaEV4dE5hbWUodW5zaWduZWQgQXJjaEV4dEtpbmQpOworU3RyaW5nUmVmIGdldEFyY2hFeHRGZWF0dXJlKFN0cmluZ1JlZiBBcmNoRXh0KTsKK3Vuc2lnbmVkIGNoZWNrQXJjaFZlcnNpb24oU3RyaW5nUmVmIEFyY2gpOworCisvLyBJbmZvcm1hdGlvbiBieSBOYW1lCit1bnNpZ25lZCAgZ2V0RGVmYXVsdEZQVShTdHJpbmdSZWYgQ1BVLCBBcmNoS2luZCBBSyk7Cit1bnNpZ25lZCAgZ2V0RGVmYXVsdEV4dGVuc2lvbnMoU3RyaW5nUmVmIENQVSwgQXJjaEtpbmQgQUspOworU3RyaW5nUmVmIGdldERlZmF1bHRDUFUoU3RyaW5nUmVmIEFyY2gpOworCisvLyBQYXJzZXIKK3Vuc2lnbmVkIHBhcnNlRlBVKFN0cmluZ1JlZiBGUFUpOworQUFyY2g2NDo6QXJjaEtpbmQgcGFyc2VBcmNoKFN0cmluZ1JlZiBBcmNoKTsKK0FyY2hFeHRLaW5kIHBhcnNlQXJjaEV4dChTdHJpbmdSZWYgQXJjaEV4dCk7CitBcmNoS2luZCBwYXJzZUNQVUFyY2goU3RyaW5nUmVmIENQVSk7Cit2b2lkIGZpbGxWYWxpZENQVUFyY2hMaXN0KFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICZWYWx1ZXMpOworQVJNOjpJU0FLaW5kIHBhcnNlQXJjaElTQShTdHJpbmdSZWYgQXJjaCk7CitBUk06OkVuZGlhbktpbmQgcGFyc2VBcmNoRW5kaWFuKFN0cmluZ1JlZiBBcmNoKTsKK0FSTTo6UHJvZmlsZUtpbmQgcGFyc2VBcmNoUHJvZmlsZShTdHJpbmdSZWYgQXJjaCk7Cit1bnNpZ25lZCBwYXJzZUFyY2hWZXJzaW9uKFN0cmluZ1JlZiBBcmNoKTsKKworfSAvLyBuYW1lc3BhY2UgQUFyY2g2NAorCituYW1lc3BhY2UgWDg2IHsKKworLy8gVGhpcyBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggbGliY2MvY29tcGlsZXItcnQgYXMgaXRzIGluY2x1ZGVkIGJ5IGNsYW5nCisvLyBhcyBhIHByb3h5IGZvciB3aGF0J3MgaW4gbGliZ2NjL2NvbXBpbGVyLXJ0LgorZW51bSBQcm9jZXNzb3JWZW5kb3JzIDogdW5zaWduZWQgeworICBWRU5ET1JfRFVNTVksCisjZGVmaW5lIFg4Nl9WRU5ET1IoRU5VTSwgU1RSSU5HKSBcCisgIEVOVU0sCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1g4NlRhcmdldFBhcnNlci5kZWYiCisgIFZFTkRPUl9PVEhFUgorfTsKKworLy8gVGhpcyBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggbGliY2MvY29tcGlsZXItcnQgYXMgaXRzIGluY2x1ZGVkIGJ5IGNsYW5nCisvLyBhcyBhIHByb3h5IGZvciB3aGF0J3MgaW4gbGliZ2NjL2NvbXBpbGVyLXJ0LgorZW51bSBQcm9jZXNzb3JUeXBlcyA6IHVuc2lnbmVkIHsKKyAgQ1BVX1RZUEVfRFVNTVksCisjZGVmaW5lIFg4Nl9DUFVfVFlQRShBUkNITkFNRSwgRU5VTSkgXAorICBFTlVNLAorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9YODZUYXJnZXRQYXJzZXIuZGVmIgorICBDUFVfVFlQRV9NQVgKK307CisKKy8vIFRoaXMgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIGxpYmNjL2NvbXBpbGVyLXJ0IGFzIGl0cyBpbmNsdWRlZCBieSBjbGFuZworLy8gYXMgYSBwcm94eSBmb3Igd2hhdCdzIGluIGxpYmdjYy9jb21waWxlci1ydC4KK2VudW0gUHJvY2Vzc29yU3VidHlwZXMgOiB1bnNpZ25lZCB7CisgIENQVV9TVUJUWVBFX0RVTU1ZLAorI2RlZmluZSBYODZfQ1BVX1NVQlRZUEUoQVJDSE5BTUUsIEVOVU0pIFwKKyAgRU5VTSwKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvWDg2VGFyZ2V0UGFyc2VyLmRlZiIKKyAgQ1BVX1NVQlRZUEVfTUFYCit9OworCisvLyBUaGlzIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBsaWJjYy9jb21waWxlci1ydCBhcyBpdCBzaG91bGQgYmUgdXNlZAorLy8gYnkgY2xhbmcgYXMgYSBwcm94eSBmb3Igd2hhdCdzIGluIGxpYmdjYy9jb21waWxlci1ydC4KK2VudW0gUHJvY2Vzc29yRmVhdHVyZXMgeworI2RlZmluZSBYODZfRkVBVFVSRShWQUwsIEVOVU0pIFwKKyAgRU5VTSA9IFZBTCwKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvWDg2VGFyZ2V0UGFyc2VyLmRlZiIKKworfTsKKworfSAvLyBuYW1lc3BhY2UgWDg2CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGFyZ2V0UmVnaXN0cnkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UYXJnZXRSZWdpc3RyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYzhjMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGFyZ2V0UmVnaXN0cnkuaApAQCAtMCwwICsxLDExNzcgQEAKKy8vPT09LSBTdXBwb3J0L1RhcmdldFJlZ2lzdHJ5LmggLSBUYXJnZXQgUmVnaXN0cmF0aW9uIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGV4cG9zZXMgdGhlIFRhcmdldFJlZ2lzdHJ5IGludGVyZmFjZSwgd2hpY2ggdG9vbHMgY2FuIHVzZSB0byBhY2Nlc3MKKy8vIHRoZSBhcHByb3ByaWF0ZSB0YXJnZXQgc3BlY2lmaWMgY2xhc3NlcyAoVGFyZ2V0TWFjaGluZSwgQXNtUHJpbnRlciwgZXRjLikKKy8vIHdoaWNoIGhhdmUgYmVlbiByZWdpc3RlcmVkLgorLy8KKy8vIFRhcmdldCBzcGVjaWZpYyBjbGFzcyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHJlZ2lzdGVyIHRoZW1zZWx2ZXMgdXNpbmcgdGhlCisvLyBhcHByb3ByaWF0ZSBUYXJnZXRSZWdpc3RyeSBpbnRlcmZhY2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1RBUkdFVFJFR0lTVFJZX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1RBUkdFVFJFR0lTVFJZX0gKKworI2luY2x1ZGUgImxsdm0tYy9EaXNhc3NlbWJsZXJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29kZUdlbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdHRlZFN0cmVhbS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc21QcmludGVyOworY2xhc3MgTUNBc21CYWNrZW5kOworY2xhc3MgTUNBc21JbmZvOworY2xhc3MgTUNBc21QYXJzZXI7CitjbGFzcyBNQ0NvZGVFbWl0dGVyOworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNEaXNhc3NlbWJsZXI7CitjbGFzcyBNQ0luc3RQcmludGVyOworY2xhc3MgTUNJbnN0ckFuYWx5c2lzOworY2xhc3MgTUNJbnN0ckluZm87CitjbGFzcyBNQ1JlZ2lzdGVySW5mbzsKK2NsYXNzIE1DUmVsb2NhdGlvbkluZm87CitjbGFzcyBNQ1N0cmVhbWVyOworY2xhc3MgTUNTdWJ0YXJnZXRJbmZvOworY2xhc3MgTUNTeW1ib2xpemVyOworY2xhc3MgTUNUYXJnZXRBc21QYXJzZXI7CitjbGFzcyBNQ1RhcmdldE9wdGlvbnM7CitjbGFzcyBNQ1RhcmdldFN0cmVhbWVyOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyByYXdfcHdyaXRlX3N0cmVhbTsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CitjbGFzcyBUYXJnZXRPcHRpb25zOworCitNQ1N0cmVhbWVyICpjcmVhdGVOdWxsU3RyZWFtZXIoTUNDb250ZXh0ICZDdHgpOworTUNTdHJlYW1lciAqY3JlYXRlQXNtU3RyZWFtZXIoTUNDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Zm9ybWF0dGVkX3Jhd19vc3RyZWFtPiBPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWZXJib3NlQXNtLCBib29sIHVzZUR3YXJmRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNJbnN0UHJpbnRlciAqSW5zdFByaW50LCBNQ0NvZGVFbWl0dGVyICpDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQXNtQmFja2VuZCAqVEFCLCBib29sIFNob3dJbnN0KTsKKworLy8vIFRha2VzIG93bmVyc2hpcCBvZiBccCBUQUIgYW5kIFxwIENFLgorTUNTdHJlYW1lciAqY3JlYXRlRUxGU3RyZWFtZXIoTUNDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TUNBc21CYWNrZW5kPiAmJlRBQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19wd3JpdGVfc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ0NvZGVFbWl0dGVyPiAmJkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZWxheEFsbCk7CitNQ1N0cmVhbWVyICpjcmVhdGVNYWNoT1N0cmVhbWVyKE1DQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TUNBc21CYWNrZW5kPiAmJlRBQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X3B3cml0ZV9zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TUNDb2RlRW1pdHRlcj4gJiZDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZWxheEFsbCwgYm9vbCBEV0FSRk11c3RCZUF0VGhlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIExhYmVsU2VjdGlvbnMgPSBmYWxzZSk7CitNQ1N0cmVhbWVyICpjcmVhdGVXYXNtU3RyZWFtZXIoTUNDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1DQXNtQmFja2VuZD4gJiZUQUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X3B3cml0ZV9zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ0NvZGVFbWl0dGVyPiAmJkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVsYXhBbGwpOworCitNQ1JlbG9jYXRpb25JbmZvICpjcmVhdGVNQ1JlbG9jYXRpb25JbmZvKGNvbnN0IFRyaXBsZSAmVFQsIE1DQ29udGV4dCAmQ3R4KTsKKworTUNTeW1ib2xpemVyICpjcmVhdGVNQ1N5bWJvbGl6ZXIoY29uc3QgVHJpcGxlICZUVCwgTExWTU9wSW5mb0NhbGxiYWNrIEdldE9wSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1TeW1ib2xMb29rdXBDYWxsYmFjayBTeW1ib2xMb29rVXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpEaXNJbmZvLCBNQ0NvbnRleHQgKkN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ1JlbG9jYXRpb25JbmZvPiAmJlJlbEluZm8pOworCisvLy8gVGFyZ2V0IC0gV3JhcHBlciBmb3IgVGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uLgorLy8vCisvLy8gRm9yIHJlZ2lzdHJhdGlvbiBwdXJwb3NlcywgdGhpcyBpcyBhIFBPRCB0eXBlIHNvIHRoYXQgdGFyZ2V0cyBjYW4gYmUKKy8vLyByZWdpc3RlcmVkIHdpdGhvdXQgdGhlIHVzZSBvZiBzdGF0aWMgY29uc3RydWN0b3JzLgorLy8vCisvLy8gVGFyZ2V0cyBzaG91bGQgaW1wbGVtZW50IGEgc2luZ2xlIGdsb2JhbCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzICh3aGljaAorLy8vIHdpbGwgYmUgemVybyBpbml0aWFsaXplZCksIGFuZCBwYXNzIHRoYXQgaW5zdGFuY2UgdG8gdGhlIFRhcmdldFJlZ2lzdHJ5IGFzCisvLy8gcGFydCBvZiB0aGVpciBpbml0aWFsaXphdGlvbi4KK2NsYXNzIFRhcmdldCB7CitwdWJsaWM6CisgIGZyaWVuZCBzdHJ1Y3QgVGFyZ2V0UmVnaXN0cnk7CisKKyAgdXNpbmcgQXJjaE1hdGNoRm5UeSA9IGJvb2wgKCopKFRyaXBsZTo6QXJjaFR5cGUgQXJjaCk7CisKKyAgdXNpbmcgTUNBc21JbmZvQ3RvckZuVHkgPSBNQ0FzbUluZm8gKigqKShjb25zdCBNQ1JlZ2lzdGVySW5mbyAmTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyaXBsZSAmVFQpOworICB1c2luZyBNQ0luc3RySW5mb0N0b3JGblR5ID0gTUNJbnN0ckluZm8gKigqKSgpOworICB1c2luZyBNQ0luc3RyQW5hbHlzaXNDdG9yRm5UeSA9IE1DSW5zdHJBbmFseXNpcyAqKCopKGNvbnN0IE1DSW5zdHJJbmZvICpJbmZvKTsKKyAgdXNpbmcgTUNSZWdJbmZvQ3RvckZuVHkgPSBNQ1JlZ2lzdGVySW5mbyAqKCopKGNvbnN0IFRyaXBsZSAmVFQpOworICB1c2luZyBNQ1N1YnRhcmdldEluZm9DdG9yRm5UeSA9IE1DU3VidGFyZ2V0SW5mbyAqKCopKGNvbnN0IFRyaXBsZSAmVFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENQVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmVhdHVyZXMpOworICB1c2luZyBUYXJnZXRNYWNoaW5lQ3RvclR5ID0gVGFyZ2V0TWFjaGluZQorICAgICAgKigqKShjb25zdCBUYXJnZXQgJlQsIGNvbnN0IFRyaXBsZSAmVFQsIFN0cmluZ1JlZiBDUFUsIFN0cmluZ1JlZiBGZWF0dXJlcywKKyAgICAgICAgICAgY29uc3QgVGFyZ2V0T3B0aW9ucyAmT3B0aW9ucywgT3B0aW9uYWw8UmVsb2M6Ok1vZGVsPiBSTSwKKyAgICAgICAgICAgT3B0aW9uYWw8Q29kZU1vZGVsOjpNb2RlbD4gQ00sIENvZGVHZW5PcHQ6OkxldmVsIE9MLCBib29sIEpJVCk7CisgIC8vIElmIGl0IHdlcmVuJ3QgZm9yIGxheWVyaW5nIGlzc3VlcyAodGhpcyBoZWFkZXIgaXMgaW4gbGx2bS9TdXBwb3J0LCBidXQKKyAgLy8gZGVwZW5kcyBvbiBNQz8pIHRoaXMgc2hvdWxkIHRha2UgdGhlIFN0cmVhbWVyIGJ5IHZhbHVlIHJhdGhlciB0aGFuIHJ2YWx1ZQorICAvLyByZWZlcmVuY2UuCisgIHVzaW5nIEFzbVByaW50ZXJDdG9yVHkgPSBBc21QcmludGVyICooKikoCisgICAgICBUYXJnZXRNYWNoaW5lICZUTSwgc3RkOjp1bmlxdWVfcHRyPE1DU3RyZWFtZXI+ICYmU3RyZWFtZXIpOworICB1c2luZyBNQ0FzbUJhY2tlbmRDdG9yVHkgPSBNQ0FzbUJhY2tlbmQgKigqKShjb25zdCBUYXJnZXQgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1JlZ2lzdGVySW5mbyAmTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1RhcmdldE9wdGlvbnMgJk9wdGlvbnMpOworICB1c2luZyBNQ0FzbVBhcnNlckN0b3JUeSA9IE1DVGFyZ2V0QXNtUGFyc2VyICooKikoCisgICAgICBjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSwgTUNBc21QYXJzZXIgJlAsIGNvbnN0IE1DSW5zdHJJbmZvICZNSUksCisgICAgICBjb25zdCBNQ1RhcmdldE9wdGlvbnMgJk9wdGlvbnMpOworICB1c2luZyBNQ0Rpc2Fzc2VtYmxlckN0b3JUeSA9IE1DRGlzYXNzZW1ibGVyICooKikoY29uc3QgVGFyZ2V0ICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCk7CisgIHVzaW5nIE1DSW5zdFByaW50ZXJDdG9yVHkgPSBNQ0luc3RQcmludGVyICooKikoY29uc3QgVHJpcGxlICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFN5bnRheFZhcmlhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21JbmZvICZNQUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNJbnN0ckluZm8gJk1JSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1JlZ2lzdGVySW5mbyAmTVJJKTsKKyAgdXNpbmcgTUNDb2RlRW1pdHRlckN0b3JUeSA9IE1DQ29kZUVtaXR0ZXIgKigqKShjb25zdCBNQ0luc3RySW5mbyAmSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNSZWdpc3RlckluZm8gJk1SSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCk7CisgIHVzaW5nIEVMRlN0cmVhbWVyQ3RvclR5ID0KKyAgICAgIE1DU3RyZWFtZXIgKigqKShjb25zdCBUcmlwbGUgJlQsIE1DQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ0FzbUJhY2tlbmQ+ICYmVEFCLAorICAgICAgICAgICAgICAgICAgICAgIHJhd19wd3JpdGVfc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TUNDb2RlRW1pdHRlcj4gJiZFbWl0dGVyLCBib29sIFJlbGF4QWxsKTsKKyAgdXNpbmcgTWFjaE9TdHJlYW1lckN0b3JUeSA9CisgICAgICBNQ1N0cmVhbWVyICooKikoTUNDb250ZXh0ICZDdHgsIHN0ZDo6dW5pcXVlX3B0cjxNQ0FzbUJhY2tlbmQ+ICYmVEFCLAorICAgICAgICAgICAgICAgICAgICAgIHJhd19wd3JpdGVfc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TUNDb2RlRW1pdHRlcj4gJiZFbWl0dGVyLCBib29sIFJlbGF4QWxsLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRFdBUkZNdXN0QmVBdFRoZUVuZCk7CisgIHVzaW5nIENPRkZTdHJlYW1lckN0b3JUeSA9CisgICAgICBNQ1N0cmVhbWVyICooKikoTUNDb250ZXh0ICZDdHgsIHN0ZDo6dW5pcXVlX3B0cjxNQ0FzbUJhY2tlbmQ+ICYmVEFCLAorICAgICAgICAgICAgICAgICAgICAgIHJhd19wd3JpdGVfc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TUNDb2RlRW1pdHRlcj4gJiZFbWl0dGVyLCBib29sIFJlbGF4QWxsLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5jcmVtZW50YWxMaW5rZXJDb21wYXRpYmxlKTsKKyAgdXNpbmcgV2FzbVN0cmVhbWVyQ3RvclR5ID0KKyAgICAgIE1DU3RyZWFtZXIgKigqKShjb25zdCBUcmlwbGUgJlQsIE1DQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ0FzbUJhY2tlbmQ+ICYmVEFCLAorICAgICAgICAgICAgICAgICAgICAgIHJhd19wd3JpdGVfc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TUNDb2RlRW1pdHRlcj4gJiZFbWl0dGVyLCBib29sIFJlbGF4QWxsKTsKKyAgdXNpbmcgTnVsbFRhcmdldFN0cmVhbWVyQ3RvclR5ID0gTUNUYXJnZXRTdHJlYW1lciAqKCopKE1DU3RyZWFtZXIgJlMpOworICB1c2luZyBBc21UYXJnZXRTdHJlYW1lckN0b3JUeSA9IE1DVGFyZ2V0U3RyZWFtZXIgKigqKSgKKyAgICAgIE1DU3RyZWFtZXIgJlMsIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAmT1MsIE1DSW5zdFByaW50ZXIgKkluc3RQcmludCwKKyAgICAgIGJvb2wgSXNWZXJib3NlQXNtKTsKKyAgdXNpbmcgT2JqZWN0VGFyZ2V0U3RyZWFtZXJDdG9yVHkgPSBNQ1RhcmdldFN0cmVhbWVyICooKikoCisgICAgICBNQ1N0cmVhbWVyICZTLCBjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSk7CisgIHVzaW5nIE1DUmVsb2NhdGlvbkluZm9DdG9yVHkgPSBNQ1JlbG9jYXRpb25JbmZvICooKikoY29uc3QgVHJpcGxlICZUVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCk7CisgIHVzaW5nIE1DU3ltYm9saXplckN0b3JUeSA9IE1DU3ltYm9saXplciAqKCopKAorICAgICAgY29uc3QgVHJpcGxlICZUVCwgTExWTU9wSW5mb0NhbGxiYWNrIEdldE9wSW5mbywKKyAgICAgIExMVk1TeW1ib2xMb29rdXBDYWxsYmFjayBTeW1ib2xMb29rVXAsIHZvaWQgKkRpc0luZm8sIE1DQ29udGV4dCAqQ3R4LAorICAgICAgc3RkOjp1bmlxdWVfcHRyPE1DUmVsb2NhdGlvbkluZm8+ICYmUmVsSW5mbyk7CisKK3ByaXZhdGU6CisgIC8vLyBOZXh0IC0gVGhlIG5leHQgcmVnaXN0ZXJlZCB0YXJnZXQgaW4gdGhlIGxpbmtlZCBsaXN0LCBtYWludGFpbmVkIGJ5IHRoZQorICAvLy8gVGFyZ2V0UmVnaXN0cnkuCisgIFRhcmdldCAqTmV4dDsKKworICAvLy8gVGhlIHRhcmdldCBmdW5jdGlvbiBmb3IgY2hlY2tpbmcgaWYgYW4gYXJjaGl0ZWN0dXJlIGlzIHN1cHBvcnRlZC4KKyAgQXJjaE1hdGNoRm5UeSBBcmNoTWF0Y2hGbjsKKworICAvLy8gTmFtZSAtIFRoZSB0YXJnZXQgbmFtZS4KKyAgY29uc3QgY2hhciAqTmFtZTsKKworICAvLy8gU2hvcnREZXNjIC0gQSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgdGFyZ2V0LgorICBjb25zdCBjaGFyICpTaG9ydERlc2M7CisKKyAgLy8vIEJhY2tlbmROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGJhY2tlbmQgaW1wbGVtZW50YXRpb24uIFRoaXMgbXVzdCBtYXRjaCB0aGUKKyAgLy8vIG5hbWUgb2YgdGhlICdkZWYgWCA6IFRhcmdldCAuLi4nIGluIFRhYmxlR2VuLgorICBjb25zdCBjaGFyICpCYWNrZW5kTmFtZTsKKworICAvLy8gSGFzSklUIC0gV2hldGhlciB0aGlzIHRhcmdldCBzdXBwb3J0cyB0aGUgSklULgorICBib29sIEhhc0pJVDsKKworICAvLy8gTUNBc21JbmZvQ3RvckZuIC0gQ29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIHRoaXMgdGFyZ2V0J3MgTUNBc21JbmZvLCBpZgorICAvLy8gcmVnaXN0ZXJlZC4KKyAgTUNBc21JbmZvQ3RvckZuVHkgTUNBc21JbmZvQ3RvckZuOworCisgIC8vLyBNQ0luc3RySW5mb0N0b3JGbiAtIENvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciB0aGlzIHRhcmdldCdzIE1DSW5zdHJJbmZvLAorICAvLy8gaWYgcmVnaXN0ZXJlZC4KKyAgTUNJbnN0ckluZm9DdG9yRm5UeSBNQ0luc3RySW5mb0N0b3JGbjsKKworICAvLy8gTUNJbnN0ckFuYWx5c2lzQ3RvckZuIC0gQ29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIHRoaXMgdGFyZ2V0J3MKKyAgLy8vIE1DSW5zdHJBbmFseXNpcywgaWYgcmVnaXN0ZXJlZC4KKyAgTUNJbnN0ckFuYWx5c2lzQ3RvckZuVHkgTUNJbnN0ckFuYWx5c2lzQ3RvckZuOworCisgIC8vLyBNQ1JlZ0luZm9DdG9yRm4gLSBDb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgdGhpcyB0YXJnZXQncyBNQ1JlZ2lzdGVySW5mbywKKyAgLy8vIGlmIHJlZ2lzdGVyZWQuCisgIE1DUmVnSW5mb0N0b3JGblR5IE1DUmVnSW5mb0N0b3JGbjsKKworICAvLy8gTUNTdWJ0YXJnZXRJbmZvQ3RvckZuIC0gQ29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIHRoaXMgdGFyZ2V0J3MKKyAgLy8vIE1DU3VidGFyZ2V0SW5mbywgaWYgcmVnaXN0ZXJlZC4KKyAgTUNTdWJ0YXJnZXRJbmZvQ3RvckZuVHkgTUNTdWJ0YXJnZXRJbmZvQ3RvckZuOworCisgIC8vLyBUYXJnZXRNYWNoaW5lQ3RvckZuIC0gQ29uc3RydWN0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIHRhcmdldCdzCisgIC8vLyBUYXJnZXRNYWNoaW5lLCBpZiByZWdpc3RlcmVkLgorICBUYXJnZXRNYWNoaW5lQ3RvclR5IFRhcmdldE1hY2hpbmVDdG9yRm47CisKKyAgLy8vIE1DQXNtQmFja2VuZEN0b3JGbiAtIENvbnN0cnVjdGlvbiBmdW5jdGlvbiBmb3IgdGhpcyB0YXJnZXQncworICAvLy8gTUNBc21CYWNrZW5kLCBpZiByZWdpc3RlcmVkLgorICBNQ0FzbUJhY2tlbmRDdG9yVHkgTUNBc21CYWNrZW5kQ3RvckZuOworCisgIC8vLyBNQ0FzbVBhcnNlckN0b3JGbiAtIENvbnN0cnVjdGlvbiBmdW5jdGlvbiBmb3IgdGhpcyB0YXJnZXQncworICAvLy8gTUNUYXJnZXRBc21QYXJzZXIsIGlmIHJlZ2lzdGVyZWQuCisgIE1DQXNtUGFyc2VyQ3RvclR5IE1DQXNtUGFyc2VyQ3RvckZuOworCisgIC8vLyBBc21QcmludGVyQ3RvckZuIC0gQ29uc3RydWN0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIHRhcmdldCdzIEFzbVByaW50ZXIsCisgIC8vLyBpZiByZWdpc3RlcmVkLgorICBBc21QcmludGVyQ3RvclR5IEFzbVByaW50ZXJDdG9yRm47CisKKyAgLy8vIE1DRGlzYXNzZW1ibGVyQ3RvckZuIC0gQ29uc3RydWN0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIHRhcmdldCdzCisgIC8vLyBNQ0Rpc2Fzc2VtYmxlciwgaWYgcmVnaXN0ZXJlZC4KKyAgTUNEaXNhc3NlbWJsZXJDdG9yVHkgTUNEaXNhc3NlbWJsZXJDdG9yRm47CisKKyAgLy8vIE1DSW5zdFByaW50ZXJDdG9yRm4gLSBDb25zdHJ1Y3Rpb24gZnVuY3Rpb24gZm9yIHRoaXMgdGFyZ2V0J3MKKyAgLy8vIE1DSW5zdFByaW50ZXIsIGlmIHJlZ2lzdGVyZWQuCisgIE1DSW5zdFByaW50ZXJDdG9yVHkgTUNJbnN0UHJpbnRlckN0b3JGbjsKKworICAvLy8gTUNDb2RlRW1pdHRlckN0b3JGbiAtIENvbnN0cnVjdGlvbiBmdW5jdGlvbiBmb3IgdGhpcyB0YXJnZXQncworICAvLy8gQ29kZUVtaXR0ZXIsIGlmIHJlZ2lzdGVyZWQuCisgIE1DQ29kZUVtaXR0ZXJDdG9yVHkgTUNDb2RlRW1pdHRlckN0b3JGbjsKKworICAvLyBDb25zdHJ1Y3Rpb24gZnVuY3Rpb25zIGZvciB0aGUgdmFyaW91cyBvYmplY3QgZm9ybWF0cywgaWYgcmVnaXN0ZXJlZC4KKyAgQ09GRlN0cmVhbWVyQ3RvclR5IENPRkZTdHJlYW1lckN0b3JGbiA9IG51bGxwdHI7CisgIE1hY2hPU3RyZWFtZXJDdG9yVHkgTWFjaE9TdHJlYW1lckN0b3JGbiA9IG51bGxwdHI7CisgIEVMRlN0cmVhbWVyQ3RvclR5IEVMRlN0cmVhbWVyQ3RvckZuID0gbnVsbHB0cjsKKyAgV2FzbVN0cmVhbWVyQ3RvclR5IFdhc21TdHJlYW1lckN0b3JGbiA9IG51bGxwdHI7CisKKyAgLy8vIENvbnN0cnVjdGlvbiBmdW5jdGlvbiBmb3IgdGhpcyB0YXJnZXQncyBudWxsIFRhcmdldFN0cmVhbWVyLCBpZgorICAvLy8gcmVnaXN0ZXJlZCAoZGVmYXVsdCA9IG51bGxwdHIpLgorICBOdWxsVGFyZ2V0U3RyZWFtZXJDdG9yVHkgTnVsbFRhcmdldFN0cmVhbWVyQ3RvckZuID0gbnVsbHB0cjsKKworICAvLy8gQ29uc3RydWN0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIHRhcmdldCdzIGFzbSBUYXJnZXRTdHJlYW1lciwgaWYKKyAgLy8vIHJlZ2lzdGVyZWQgKGRlZmF1bHQgPSBudWxscHRyKS4KKyAgQXNtVGFyZ2V0U3RyZWFtZXJDdG9yVHkgQXNtVGFyZ2V0U3RyZWFtZXJDdG9yRm4gPSBudWxscHRyOworCisgIC8vLyBDb25zdHJ1Y3Rpb24gZnVuY3Rpb24gZm9yIHRoaXMgdGFyZ2V0J3Mgb2JqIFRhcmdldFN0cmVhbWVyLCBpZgorICAvLy8gcmVnaXN0ZXJlZCAoZGVmYXVsdCA9IG51bGxwdHIpLgorICBPYmplY3RUYXJnZXRTdHJlYW1lckN0b3JUeSBPYmplY3RUYXJnZXRTdHJlYW1lckN0b3JGbiA9IG51bGxwdHI7CisKKyAgLy8vIE1DUmVsb2NhdGlvbkluZm9DdG9yRm4gLSBDb25zdHJ1Y3Rpb24gZnVuY3Rpb24gZm9yIHRoaXMgdGFyZ2V0J3MKKyAgLy8vIE1DUmVsb2NhdGlvbkluZm8sIGlmIHJlZ2lzdGVyZWQgKGRlZmF1bHQgPSBsbHZtOjpjcmVhdGVNQ1JlbG9jYXRpb25JbmZvKQorICBNQ1JlbG9jYXRpb25JbmZvQ3RvclR5IE1DUmVsb2NhdGlvbkluZm9DdG9yRm4gPSBudWxscHRyOworCisgIC8vLyBNQ1N5bWJvbGl6ZXJDdG9yRm4gLSBDb25zdHJ1Y3Rpb24gZnVuY3Rpb24gZm9yIHRoaXMgdGFyZ2V0J3MKKyAgLy8vIE1DU3ltYm9saXplciwgaWYgcmVnaXN0ZXJlZCAoZGVmYXVsdCA9IGxsdm06OmNyZWF0ZU1DU3ltYm9saXplcikKKyAgTUNTeW1ib2xpemVyQ3RvclR5IE1DU3ltYm9saXplckN0b3JGbiA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgVGFyZ2V0KCkgPSBkZWZhdWx0OworCisgIC8vLyBAbmFtZSBUYXJnZXQgSW5mb3JtYXRpb24KKyAgLy8vIEB7CisKKyAgLy8gZ2V0TmV4dCAtIFJldHVybiB0aGUgbmV4dCByZWdpc3RlcmVkIHRhcmdldC4KKyAgY29uc3QgVGFyZ2V0ICpnZXROZXh0KCkgY29uc3QgeyByZXR1cm4gTmV4dDsgfQorCisgIC8vLyBnZXROYW1lIC0gR2V0IHRoZSB0YXJnZXQgbmFtZS4KKyAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICAvLy8gZ2V0U2hvcnREZXNjcmlwdGlvbiAtIEdldCBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSB0YXJnZXQuCisgIGNvbnN0IGNoYXIgKmdldFNob3J0RGVzY3JpcHRpb24oKSBjb25zdCB7IHJldHVybiBTaG9ydERlc2M7IH0KKworICAvLy8gZ2V0QmFja2VuZE5hbWUgLSBHZXQgdGhlIGJhY2tlbmQgbmFtZS4KKyAgY29uc3QgY2hhciAqZ2V0QmFja2VuZE5hbWUoKSBjb25zdCB7IHJldHVybiBCYWNrZW5kTmFtZTsgfQorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgRmVhdHVyZSBQcmVkaWNhdGVzCisgIC8vLyBAeworCisgIC8vLyBoYXNKSVQgLSBDaGVjayBpZiB0aGlzIHRhcmdldHMgc3VwcG9ydHMgdGhlIGp1c3QtaW4tdGltZSBjb21waWxhdGlvbi4KKyAgYm9vbCBoYXNKSVQoKSBjb25zdCB7IHJldHVybiBIYXNKSVQ7IH0KKworICAvLy8gaGFzVGFyZ2V0TWFjaGluZSAtIENoZWNrIGlmIHRoaXMgdGFyZ2V0IHN1cHBvcnRzIGNvZGUgZ2VuZXJhdGlvbi4KKyAgYm9vbCBoYXNUYXJnZXRNYWNoaW5lKCkgY29uc3QgeyByZXR1cm4gVGFyZ2V0TWFjaGluZUN0b3JGbiAhPSBudWxscHRyOyB9CisKKyAgLy8vIGhhc01DQXNtQmFja2VuZCAtIENoZWNrIGlmIHRoaXMgdGFyZ2V0IHN1cHBvcnRzIC5vIGdlbmVyYXRpb24uCisgIGJvb2wgaGFzTUNBc21CYWNrZW5kKCkgY29uc3QgeyByZXR1cm4gTUNBc21CYWNrZW5kQ3RvckZuICE9IG51bGxwdHI7IH0KKworICAvLy8gaGFzTUNBc21QYXJzZXIgLSBDaGVjayBpZiB0aGlzIHRhcmdldCBzdXBwb3J0cyBhc3NlbWJseSBwYXJzaW5nLgorICBib29sIGhhc01DQXNtUGFyc2VyKCkgY29uc3QgeyByZXR1cm4gTUNBc21QYXJzZXJDdG9yRm4gIT0gbnVsbHB0cjsgfQorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgRmVhdHVyZSBDb25zdHJ1Y3RvcnMKKyAgLy8vIEB7CisKKyAgLy8vIGNyZWF0ZU1DQXNtSW5mbyAtIENyZWF0ZSBhIE1DQXNtSW5mbyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gdGFyZ2V0IHRyaXBsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gVGhlVHJpcGxlIFRoaXMgYXJndW1lbnQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHRhcmdldCBtYWNoaW5lCisgIC8vLyBmZWF0dXJlIHNldDsgaXQgc2hvdWxkIGFsd2F5cyBiZSBwcm92aWRlZC4gR2VuZXJhbGx5IHRoaXMgc2hvdWxkIGJlCisgIC8vLyBlaXRoZXIgdGhlIHRhcmdldCB0cmlwbGUgZnJvbSB0aGUgbW9kdWxlLCBvciB0aGUgdGFyZ2V0IHRyaXBsZSBvZiB0aGUKKyAgLy8vIGhvc3QgaWYgdGhhdCBkb2VzIG5vdCBleGlzdC4KKyAgTUNBc21JbmZvICpjcmVhdGVNQ0FzbUluZm8oY29uc3QgTUNSZWdpc3RlckluZm8gJk1SSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFRoZVRyaXBsZSkgY29uc3QgeworICAgIGlmICghTUNBc21JbmZvQ3RvckZuKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIE1DQXNtSW5mb0N0b3JGbihNUkksIFRyaXBsZShUaGVUcmlwbGUpKTsKKyAgfQorCisgIC8vLyBjcmVhdGVNQ0luc3RySW5mbyAtIENyZWF0ZSBhIE1DSW5zdHJJbmZvIGltcGxlbWVudGF0aW9uLgorICAvLy8KKyAgTUNJbnN0ckluZm8gKmNyZWF0ZU1DSW5zdHJJbmZvKCkgY29uc3QgeworICAgIGlmICghTUNJbnN0ckluZm9DdG9yRm4pCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gTUNJbnN0ckluZm9DdG9yRm4oKTsKKyAgfQorCisgIC8vLyBjcmVhdGVNQ0luc3RyQW5hbHlzaXMgLSBDcmVhdGUgYSBNQ0luc3RyQW5hbHlzaXMgaW1wbGVtZW50YXRpb24uCisgIC8vLworICBNQ0luc3RyQW5hbHlzaXMgKmNyZWF0ZU1DSW5zdHJBbmFseXNpcyhjb25zdCBNQ0luc3RySW5mbyAqSW5mbykgY29uc3QgeworICAgIGlmICghTUNJbnN0ckFuYWx5c2lzQ3RvckZuKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIE1DSW5zdHJBbmFseXNpc0N0b3JGbihJbmZvKTsKKyAgfQorCisgIC8vLyBjcmVhdGVNQ1JlZ0luZm8gLSBDcmVhdGUgYSBNQ1JlZ2lzdGVySW5mbyBpbXBsZW1lbnRhdGlvbi4KKyAgLy8vCisgIE1DUmVnaXN0ZXJJbmZvICpjcmVhdGVNQ1JlZ0luZm8oU3RyaW5nUmVmIFRUKSBjb25zdCB7CisgICAgaWYgKCFNQ1JlZ0luZm9DdG9yRm4pCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gTUNSZWdJbmZvQ3RvckZuKFRyaXBsZShUVCkpOworICB9CisKKyAgLy8vIGNyZWF0ZU1DU3VidGFyZ2V0SW5mbyAtIENyZWF0ZSBhIE1DU3VidGFyZ2V0SW5mbyBpbXBsZW1lbnRhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gVGhlVHJpcGxlIFRoaXMgYXJndW1lbnQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHRhcmdldCBtYWNoaW5lCisgIC8vLyBmZWF0dXJlIHNldDsgaXQgc2hvdWxkIGFsd2F5cyBiZSBwcm92aWRlZC4gR2VuZXJhbGx5IHRoaXMgc2hvdWxkIGJlCisgIC8vLyBlaXRoZXIgdGhlIHRhcmdldCB0cmlwbGUgZnJvbSB0aGUgbW9kdWxlLCBvciB0aGUgdGFyZ2V0IHRyaXBsZSBvZiB0aGUKKyAgLy8vIGhvc3QgaWYgdGhhdCBkb2VzIG5vdCBleGlzdC4KKyAgLy8vIFxwYXJhbSBDUFUgVGhpcyBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBDUFUuCisgIC8vLyBccGFyYW0gRmVhdHVyZXMgVGhpcyBzcGVjaWZpZXMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAgLy8vIGFkZGl0aW9uYWwgdGFyZ2V0IGZlYXR1cmVzLgorICBNQ1N1YnRhcmdldEluZm8gKmNyZWF0ZU1DU3VidGFyZ2V0SW5mbyhTdHJpbmdSZWYgVGhlVHJpcGxlLCBTdHJpbmdSZWYgQ1BVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmVhdHVyZXMpIGNvbnN0IHsKKyAgICBpZiAoIU1DU3VidGFyZ2V0SW5mb0N0b3JGbikKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBNQ1N1YnRhcmdldEluZm9DdG9yRm4oVHJpcGxlKFRoZVRyaXBsZSksIENQVSwgRmVhdHVyZXMpOworICB9CisKKyAgLy8vIGNyZWF0ZVRhcmdldE1hY2hpbmUgLSBDcmVhdGUgYSB0YXJnZXQgc3BlY2lmaWMgbWFjaGluZSBpbXBsZW1lbnRhdGlvbgorICAvLy8gZm9yIHRoZSBzcGVjaWZpZWQgXHAgVHJpcGxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUVCBUaGlzIGFyZ3VtZW50IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0YXJnZXQgbWFjaGluZQorICAvLy8gZmVhdHVyZSBzZXQ7IGl0IHNob3VsZCBhbHdheXMgYmUgcHJvdmlkZWQuIEdlbmVyYWxseSB0aGlzIHNob3VsZCBiZQorICAvLy8gZWl0aGVyIHRoZSB0YXJnZXQgdHJpcGxlIGZyb20gdGhlIG1vZHVsZSwgb3IgdGhlIHRhcmdldCB0cmlwbGUgb2YgdGhlCisgIC8vLyBob3N0IGlmIHRoYXQgZG9lcyBub3QgZXhpc3QuCisgIFRhcmdldE1hY2hpbmUgKmNyZWF0ZVRhcmdldE1hY2hpbmUoU3RyaW5nUmVmIFRULCBTdHJpbmdSZWYgQ1BVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRPcHRpb25zICZPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPFJlbG9jOjpNb2RlbD4gUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8Q29kZU1vZGVsOjpNb2RlbD4gQ00gPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9MID0gQ29kZUdlbk9wdDo6RGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEpJVCA9IGZhbHNlKSBjb25zdCB7CisgICAgaWYgKCFUYXJnZXRNYWNoaW5lQ3RvckZuKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIFRhcmdldE1hY2hpbmVDdG9yRm4oKnRoaXMsIFRyaXBsZShUVCksIENQVSwgRmVhdHVyZXMsIE9wdGlvbnMsIFJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENNLCBPTCwgSklUKTsKKyAgfQorCisgIC8vLyBjcmVhdGVNQ0FzbUJhY2tlbmQgLSBDcmVhdGUgYSB0YXJnZXQgc3BlY2lmaWMgYXNzZW1ibHkgcGFyc2VyLgorICBNQ0FzbUJhY2tlbmQgKmNyZWF0ZU1DQXNtQmFja2VuZChjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNSZWdpc3RlckluZm8gJk1SSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNUYXJnZXRPcHRpb25zICZPcHRpb25zKSBjb25zdCB7CisgICAgaWYgKCFNQ0FzbUJhY2tlbmRDdG9yRm4pCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gTUNBc21CYWNrZW5kQ3RvckZuKCp0aGlzLCBTVEksIE1SSSwgT3B0aW9ucyk7CisgIH0KKworICAvLy8gY3JlYXRlTUNBc21QYXJzZXIgLSBDcmVhdGUgYSB0YXJnZXQgc3BlY2lmaWMgYXNzZW1ibHkgcGFyc2VyLgorICAvLy8KKyAgLy8vIFxwYXJhbSBQYXJzZXIgVGhlIHRhcmdldCBpbmRlcGVuZGVudCBwYXJzZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlIGZvcgorICAvLy8gcGFyc2luZyBhbmQgbGV4aW5nLgorICBNQ1RhcmdldEFzbVBhcnNlciAqY3JlYXRlTUNBc21QYXJzZXIoY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FzbVBhcnNlciAmUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNJbnN0ckluZm8gJk1JSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DVGFyZ2V0T3B0aW9ucyAmT3B0aW9ucykgY29uc3QgeworICAgIGlmICghTUNBc21QYXJzZXJDdG9yRm4pCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gTUNBc21QYXJzZXJDdG9yRm4oU1RJLCBQYXJzZXIsIE1JSSwgT3B0aW9ucyk7CisgIH0KKworICAvLy8gY3JlYXRlQXNtUHJpbnRlciAtIENyZWF0ZSBhIHRhcmdldCBzcGVjaWZpYyBhc3NlbWJseSBwcmludGVyIHBhc3MuICBUaGlzCisgIC8vLyB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIE1DU3RyZWFtZXIgb2JqZWN0LgorICBBc21QcmludGVyICpjcmVhdGVBc21QcmludGVyKFRhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ1N0cmVhbWVyPiAmJlN0cmVhbWVyKSBjb25zdCB7CisgICAgaWYgKCFBc21QcmludGVyQ3RvckZuKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIEFzbVByaW50ZXJDdG9yRm4oVE0sIHN0ZDo6bW92ZShTdHJlYW1lcikpOworICB9CisKKyAgTUNEaXNhc3NlbWJsZXIgKmNyZWF0ZU1DRGlzYXNzZW1ibGVyKGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIGNvbnN0IHsKKyAgICBpZiAoIU1DRGlzYXNzZW1ibGVyQ3RvckZuKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIE1DRGlzYXNzZW1ibGVyQ3RvckZuKCp0aGlzLCBTVEksIEN0eCk7CisgIH0KKworICBNQ0luc3RQcmludGVyICpjcmVhdGVNQ0luc3RQcmludGVyKGNvbnN0IFRyaXBsZSAmVCwgdW5zaWduZWQgU3ludGF4VmFyaWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUluZm8gJk1BSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0luc3RySW5mbyAmTUlJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICZNUkkpIGNvbnN0IHsKKyAgICBpZiAoIU1DSW5zdFByaW50ZXJDdG9yRm4pCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gTUNJbnN0UHJpbnRlckN0b3JGbihULCBTeW50YXhWYXJpYW50LCBNQUksIE1JSSwgTVJJKTsKKyAgfQorCisgIC8vLyBjcmVhdGVNQ0NvZGVFbWl0dGVyIC0gQ3JlYXRlIGEgdGFyZ2V0IHNwZWNpZmljIGNvZGUgZW1pdHRlci4KKyAgTUNDb2RlRW1pdHRlciAqY3JlYXRlTUNDb2RlRW1pdHRlcihjb25zdCBNQ0luc3RySW5mbyAmSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNSZWdpc3RlckluZm8gJk1SSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgY29uc3QgeworICAgIGlmICghTUNDb2RlRW1pdHRlckN0b3JGbikKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBNQ0NvZGVFbWl0dGVyQ3RvckZuKElJLCBNUkksIEN0eCk7CisgIH0KKworICAvLy8gQ3JlYXRlIGEgdGFyZ2V0IHNwZWNpZmljIE1DU3RyZWFtZXIuCisgIC8vLworICAvLy8gXHBhcmFtIFQgVGhlIHRhcmdldCB0cmlwbGUuCisgIC8vLyBccGFyYW0gQ3R4IFRoZSB0YXJnZXQgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBUQUIgVGhlIHRhcmdldCBhc3NlbWJsZXIgYmFja2VuZCBvYmplY3QuIFRha2VzIG93bmVyc2hpcC4KKyAgLy8vIFxwYXJhbSBPUyBUaGUgc3RyZWFtIG9iamVjdC4KKyAgLy8vIFxwYXJhbSBFbWl0dGVyIFRoZSB0YXJnZXQgaW5kZXBlbmRlbnQgYXNzZW1ibGVyIG9iamVjdC5UYWtlcyBvd25lcnNoaXAuCisgIC8vLyBccGFyYW0gUmVsYXhBbGwgUmVsYXggYWxsIGZpeHVwcz8KKyAgTUNTdHJlYW1lciAqY3JlYXRlTUNPYmplY3RTdHJlYW1lcihjb25zdCBUcmlwbGUgJlQsIE1DQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ0FzbUJhY2tlbmQ+ICYmVEFCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19wd3JpdGVfc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TUNDb2RlRW1pdHRlcj4gJiZFbWl0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJLCBib29sIFJlbGF4QWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5jcmVtZW50YWxMaW5rZXJDb21wYXRpYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRFdBUkZNdXN0QmVBdFRoZUVuZCkgY29uc3QgeworICAgIE1DU3RyZWFtZXIgKlM7CisgICAgc3dpdGNoIChULmdldE9iamVjdEZvcm1hdCgpKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gb2JqZWN0IGZvcm1hdCIpOworICAgIGNhc2UgVHJpcGxlOjpDT0ZGOgorICAgICAgYXNzZXJ0KFQuaXNPU1dpbmRvd3MoKSAmJiAib25seSBXaW5kb3dzIENPRkYgaXMgc3VwcG9ydGVkIik7CisgICAgICBTID0gQ09GRlN0cmVhbWVyQ3RvckZuKEN0eCwgc3RkOjptb3ZlKFRBQiksIE9TLCBzdGQ6Om1vdmUoRW1pdHRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF4QWxsLCBJbmNyZW1lbnRhbExpbmtlckNvbXBhdGlibGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUcmlwbGU6Ok1hY2hPOgorICAgICAgaWYgKE1hY2hPU3RyZWFtZXJDdG9yRm4pCisgICAgICAgIFMgPSBNYWNoT1N0cmVhbWVyQ3RvckZuKEN0eCwgc3RkOjptb3ZlKFRBQiksIE9TLCBzdGQ6Om1vdmUoRW1pdHRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF4QWxsLCBEV0FSRk11c3RCZUF0VGhlRW5kKTsKKyAgICAgIGVsc2UKKyAgICAgICAgUyA9IGNyZWF0ZU1hY2hPU3RyZWFtZXIoQ3R4LCBzdGQ6Om1vdmUoVEFCKSwgT1MsIHN0ZDo6bW92ZShFbWl0dGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXhBbGwsIERXQVJGTXVzdEJlQXRUaGVFbmQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUcmlwbGU6OkVMRjoKKyAgICAgIGlmIChFTEZTdHJlYW1lckN0b3JGbikKKyAgICAgICAgUyA9IEVMRlN0cmVhbWVyQ3RvckZuKFQsIEN0eCwgc3RkOjptb3ZlKFRBQiksIE9TLCBzdGQ6Om1vdmUoRW1pdHRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxheEFsbCk7CisgICAgICBlbHNlCisgICAgICAgIFMgPSBjcmVhdGVFTEZTdHJlYW1lcihDdHgsIHN0ZDo6bW92ZShUQUIpLCBPUywgc3RkOjptb3ZlKEVtaXR0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXhBbGwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUcmlwbGU6Oldhc206CisgICAgICBpZiAoV2FzbVN0cmVhbWVyQ3RvckZuKQorICAgICAgICBTID0gV2FzbVN0cmVhbWVyQ3RvckZuKFQsIEN0eCwgc3RkOjptb3ZlKFRBQiksIE9TLCBzdGQ6Om1vdmUoRW1pdHRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXhBbGwpOworICAgICAgZWxzZQorICAgICAgICBTID0gY3JlYXRlV2FzbVN0cmVhbWVyKEN0eCwgc3RkOjptb3ZlKFRBQiksIE9TLCBzdGQ6Om1vdmUoRW1pdHRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXhBbGwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChPYmplY3RUYXJnZXRTdHJlYW1lckN0b3JGbikKKyAgICAgIE9iamVjdFRhcmdldFN0cmVhbWVyQ3RvckZuKCpTLCBTVEkpOworICAgIHJldHVybiBTOworICB9CisKKyAgTUNTdHJlYW1lciAqY3JlYXRlQXNtU3RyZWFtZXIoTUNDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxmb3JtYXR0ZWRfcmF3X29zdHJlYW0+IE9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzVmVyYm9zZUFzbSwgYm9vbCBVc2VEd2FyZkRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNJbnN0UHJpbnRlciAqSW5zdFByaW50LCBNQ0NvZGVFbWl0dGVyICpDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBc21CYWNrZW5kICpUQUIsIGJvb2wgU2hvd0luc3QpIGNvbnN0IHsKKyAgICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJk9TUmVmID0gKk9TOworICAgIE1DU3RyZWFtZXIgKlMgPSBsbHZtOjpjcmVhdGVBc21TdHJlYW1lcihDdHgsIHN0ZDo6bW92ZShPUyksIElzVmVyYm9zZUFzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlRHdhcmZEaXJlY3RvcnksIEluc3RQcmludCwgQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBQiwgU2hvd0luc3QpOworICAgIGNyZWF0ZUFzbVRhcmdldFN0cmVhbWVyKCpTLCBPU1JlZiwgSW5zdFByaW50LCBJc1ZlcmJvc2VBc20pOworICAgIHJldHVybiBTOworICB9CisKKyAgTUNUYXJnZXRTdHJlYW1lciAqY3JlYXRlQXNtVGFyZ2V0U3RyZWFtZXIoTUNTdHJlYW1lciAmUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNJbnN0UHJpbnRlciAqSW5zdFByaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzVmVyYm9zZUFzbSkgY29uc3QgeworICAgIGlmIChBc21UYXJnZXRTdHJlYW1lckN0b3JGbikKKyAgICAgIHJldHVybiBBc21UYXJnZXRTdHJlYW1lckN0b3JGbihTLCBPUywgSW5zdFByaW50LCBJc1ZlcmJvc2VBc20pOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgTUNTdHJlYW1lciAqY3JlYXRlTnVsbFN0cmVhbWVyKE1DQ29udGV4dCAmQ3R4KSBjb25zdCB7CisgICAgTUNTdHJlYW1lciAqUyA9IGxsdm06OmNyZWF0ZU51bGxTdHJlYW1lcihDdHgpOworICAgIGNyZWF0ZU51bGxUYXJnZXRTdHJlYW1lcigqUyk7CisgICAgcmV0dXJuIFM7CisgIH0KKworICBNQ1RhcmdldFN0cmVhbWVyICpjcmVhdGVOdWxsVGFyZ2V0U3RyZWFtZXIoTUNTdHJlYW1lciAmUykgY29uc3QgeworICAgIGlmIChOdWxsVGFyZ2V0U3RyZWFtZXJDdG9yRm4pCisgICAgICByZXR1cm4gTnVsbFRhcmdldFN0cmVhbWVyQ3RvckZuKFMpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIGNyZWF0ZU1DUmVsb2NhdGlvbkluZm8gLSBDcmVhdGUgYSB0YXJnZXQgc3BlY2lmaWMgTUNSZWxvY2F0aW9uSW5mby4KKyAgLy8vCisgIC8vLyBccGFyYW0gVFQgVGhlIHRhcmdldCB0cmlwbGUuCisgIC8vLyBccGFyYW0gQ3R4IFRoZSB0YXJnZXQgY29udGV4dC4KKyAgTUNSZWxvY2F0aW9uSW5mbyAqY3JlYXRlTUNSZWxvY2F0aW9uSW5mbyhTdHJpbmdSZWYgVFQsIE1DQ29udGV4dCAmQ3R4KSBjb25zdCB7CisgICAgTUNSZWxvY2F0aW9uSW5mb0N0b3JUeSBGbiA9IE1DUmVsb2NhdGlvbkluZm9DdG9yRm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTUNSZWxvY2F0aW9uSW5mb0N0b3JGbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsbHZtOjpjcmVhdGVNQ1JlbG9jYXRpb25JbmZvOworICAgIHJldHVybiBGbihUcmlwbGUoVFQpLCBDdHgpOworICB9CisKKyAgLy8vIGNyZWF0ZU1DU3ltYm9saXplciAtIENyZWF0ZSBhIHRhcmdldCBzcGVjaWZpYyBNQ1N5bWJvbGl6ZXIuCisgIC8vLworICAvLy8gXHBhcmFtIFRUIFRoZSB0YXJnZXQgdHJpcGxlLgorICAvLy8gXHBhcmFtIEdldE9wSW5mbyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBmb3IKKyAgLy8vIG9wZXJhbmRzLgorICAvLy8gXHBhcmFtIFN5bWJvbExvb2tVcCBUaGUgZnVuY3Rpb24gdG8gbG9va3VwIGEgc3ltYm9sIG5hbWUuCisgIC8vLyBccGFyYW0gRGlzSW5mbyBUaGUgcG9pbnRlciB0byB0aGUgYmxvY2sgb2Ygc3ltYm9saWMgaW5mb3JtYXRpb24gZm9yIGFib3ZlCisgIC8vLyBjYWxsCisgIC8vLyBiYWNrLgorICAvLy8gXHBhcmFtIEN0eCBUaGUgdGFyZ2V0IGNvbnRleHQuCisgIC8vLyBccGFyYW0gUmVsSW5mbyBUaGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyB0YXJnZXQuIFRha2VzCisgIC8vLyBvd25lcnNoaXAuCisgIE1DU3ltYm9saXplciAqCisgIGNyZWF0ZU1DU3ltYm9saXplcihTdHJpbmdSZWYgVFQsIExMVk1PcEluZm9DYWxsYmFjayBHZXRPcEluZm8sCisgICAgICAgICAgICAgICAgICAgICBMTFZNU3ltYm9sTG9va3VwQ2FsbGJhY2sgU3ltYm9sTG9va1VwLCB2b2lkICpEaXNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICpDdHgsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TUNSZWxvY2F0aW9uSW5mbz4gJiZSZWxJbmZvKSBjb25zdCB7CisgICAgTUNTeW1ib2xpemVyQ3RvclR5IEZuID0KKyAgICAgICAgTUNTeW1ib2xpemVyQ3RvckZuID8gTUNTeW1ib2xpemVyQ3RvckZuIDogbGx2bTo6Y3JlYXRlTUNTeW1ib2xpemVyOworICAgIHJldHVybiBGbihUcmlwbGUoVFQpLCBHZXRPcEluZm8sIFN5bWJvbExvb2tVcCwgRGlzSW5mbywgQ3R4LAorICAgICAgICAgICAgICBzdGQ6Om1vdmUoUmVsSW5mbykpOworICB9CisKKyAgLy8vIEB9Cit9OworCisvLy8gVGFyZ2V0UmVnaXN0cnkgLSBHZW5lcmljIGludGVyZmFjZSB0byB0YXJnZXQgc3BlY2lmaWMgZmVhdHVyZXMuCitzdHJ1Y3QgVGFyZ2V0UmVnaXN0cnkgeworICAvLyBGSVhNRTogTWFrZSB0aGlzIGEgbmFtZXNwYWNlLCBwcm9iYWJseSBqdXN0IG1vdmUgYWxsIHRoZSBSZWdpc3RlcioKKyAgLy8gZnVuY3Rpb25zIGludG8gVGFyZ2V0IChjdXJyZW50bHkgdGhleSBhbGwganVzdCBzZXQgbWVtYmVycyBvbiB0aGUgVGFyZ2V0CisgIC8vIGFueXdheSwgYW5kIFRhcmdldCBmcmllbmRzIHRoaXMgY2xhc3Mgc28gdGhvc2UgZnVuY3Rpb25zIGNhbi4uLgorICAvLyBmdW5jdGlvbikuCisgIFRhcmdldFJlZ2lzdHJ5KCkgPSBkZWxldGU7CisKKyAgY2xhc3MgaXRlcmF0b3IKKyAgICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgVGFyZ2V0LCBwdHJkaWZmX3Q+IHsKKyAgICBmcmllbmQgc3RydWN0IFRhcmdldFJlZ2lzdHJ5OworCisgICAgY29uc3QgVGFyZ2V0ICpDdXJyZW50ID0gbnVsbHB0cjsKKworICAgIGV4cGxpY2l0IGl0ZXJhdG9yKFRhcmdldCAqVCkgOiBDdXJyZW50KFQpIHt9CisKKyAgcHVibGljOgorICAgIGl0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yICZ4KSBjb25zdCB7IHJldHVybiBDdXJyZW50ID09IHguQ3VycmVudDsgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciAmeCkgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0oeCk7IH0KKworICAgIC8vIEl0ZXJhdG9yIHRyYXZlcnNhbDogZm9yd2FyZCBpdGVyYXRpb24gb25seQorICAgIGl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeyAvLyBQcmVpbmNyZW1lbnQKKyAgICAgIGFzc2VydChDdXJyZW50ICYmICJDYW5ub3QgaW5jcmVtZW50IGVuZCBpdGVyYXRvciEiKTsKKyAgICAgIEN1cnJlbnQgPSBDdXJyZW50LT5nZXROZXh0KCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIGl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7IC8vIFBvc3RpbmNyZW1lbnQKKyAgICAgIGl0ZXJhdG9yIHRtcCA9ICp0aGlzOworICAgICAgKysqdGhpczsKKyAgICAgIHJldHVybiB0bXA7CisgICAgfQorCisgICAgY29uc3QgVGFyZ2V0ICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgICBhc3NlcnQoQ3VycmVudCAmJiAiQ2Fubm90IGRlcmVmZXJlbmNlIGVuZCBpdGVyYXRvciEiKTsKKyAgICAgIHJldHVybiAqQ3VycmVudDsKKyAgICB9CisKKyAgICBjb25zdCBUYXJnZXQgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmb3BlcmF0b3IqKCk7IH0KKyAgfTsKKworICAvLy8gcHJpbnRSZWdpc3RlcmVkVGFyZ2V0c0ZvclZlcnNpb24gLSBQcmludCB0aGUgcmVnaXN0ZXJlZCB0YXJnZXRzCisgIC8vLyBhcHByb3ByaWF0ZWx5IGZvciBpbmNsdXNpb24gaW4gYSB0b29sJ3MgdmVyc2lvbiBvdXRwdXQuCisgIHN0YXRpYyB2b2lkIHByaW50UmVnaXN0ZXJlZFRhcmdldHNGb3JWZXJzaW9uKHJhd19vc3RyZWFtICZPUyk7CisKKyAgLy8vIEBuYW1lIFJlZ2lzdHJ5IEFjY2VzcworICAvLy8gQHsKKworICBzdGF0aWMgaXRlcmF0b3JfcmFuZ2U8aXRlcmF0b3I+IHRhcmdldHMoKTsKKworICAvLy8gbG9va3VwVGFyZ2V0IC0gTG9va3VwIGEgdGFyZ2V0IGJhc2VkIG9uIGEgdGFyZ2V0IHRyaXBsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gVHJpcGxlIC0gVGhlIHRyaXBsZSB0byB1c2UgZm9yIGZpbmRpbmcgYSB0YXJnZXQuCisgIC8vLyBccGFyYW0gRXJyb3IgLSBPbiBmYWlsdXJlLCBhbiBlcnJvciBzdHJpbmcgZGVzY3JpYmluZyB3aHkgbm8gdGFyZ2V0IHdhcworICAvLy8gZm91bmQuCisgIHN0YXRpYyBjb25zdCBUYXJnZXQgKmxvb2t1cFRhcmdldChjb25zdCBzdGQ6OnN0cmluZyAmVHJpcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJkVycm9yKTsKKworICAvLy8gbG9va3VwVGFyZ2V0IC0gTG9va3VwIGEgdGFyZ2V0IGJhc2VkIG9uIGFuIGFyY2hpdGVjdHVyZSBuYW1lCisgIC8vLyBhbmQgYSB0YXJnZXQgdHJpcGxlLiAgSWYgdGhlIGFyY2hpdGVjdHVyZSBuYW1lIGlzIG5vbi1lbXB0eSwKKyAgLy8vIHRoZW4gdGhlIGxvb2t1cCBpcyBkb25lIGJ5IGFyY2hpdGVjdHVyZS4gIE90aGVyd2lzZSwgdGhlIHRhcmdldAorICAvLy8gdHJpcGxlIGlzIHVzZWQuCisgIC8vLworICAvLy8gXHBhcmFtIEFyY2hOYW1lIC0gVGhlIGFyY2hpdGVjdHVyZSB0byB1c2UgZm9yIGZpbmRpbmcgYSB0YXJnZXQuCisgIC8vLyBccGFyYW0gVGhlVHJpcGxlIC0gVGhlIHRyaXBsZSB0byB1c2UgZm9yIGZpbmRpbmcgYSB0YXJnZXQuICBUaGUKKyAgLy8vIHRyaXBsZSBpcyB1cGRhdGVkIHdpdGggY2Fub25pY2FsIGFyY2hpdGVjdHVyZSBuYW1lIGlmIGEgbG9va3VwCisgIC8vLyBieSBhcmNoaXRlY3R1cmUgaXMgZG9uZS4KKyAgLy8vIFxwYXJhbSBFcnJvciAtIE9uIGZhaWx1cmUsIGFuIGVycm9yIHN0cmluZyBkZXNjcmliaW5nIHdoeSBubyB0YXJnZXQgd2FzCisgIC8vLyBmb3VuZC4KKyAgc3RhdGljIGNvbnN0IFRhcmdldCAqbG9va3VwVGFyZ2V0KGNvbnN0IHN0ZDo6c3RyaW5nICZBcmNoTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaXBsZSAmVGhlVHJpcGxlLCBzdGQ6OnN0cmluZyAmRXJyb3IpOworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgVGFyZ2V0IFJlZ2lzdHJhdGlvbgorICAvLy8gQHsKKworICAvLy8gUmVnaXN0ZXJUYXJnZXQgLSBSZWdpc3RlciB0aGUgZ2l2ZW4gdGFyZ2V0LiBBdHRlbXB0cyB0byByZWdpc3RlciBhCisgIC8vLyB0YXJnZXQgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIHdpbGwgYmUgaWdub3JlZC4KKyAgLy8vCisgIC8vLyBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCByZWdpc3RyYXRpb24gZG9lc24ndCBvY2N1cgorICAvLy8gd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5LiBUeXBpY2FsbHkKKyAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAvLy8KKyAgLy8vIEBwYXJhbSBUIC0gVGhlIHRhcmdldCBiZWluZyByZWdpc3RlcmVkLgorICAvLy8gQHBhcmFtIE5hbWUgLSBUaGUgdGFyZ2V0IG5hbWUuIFRoaXMgc2hvdWxkIGJlIGEgc3RhdGljIHN0cmluZy4KKyAgLy8vIEBwYXJhbSBTaG9ydERlc2MgLSBBIHNob3J0IHRhcmdldCBkZXNjcmlwdGlvbi4gVGhpcyBzaG91bGQgYmUgYSBzdGF0aWMKKyAgLy8vIHN0cmluZy4KKyAgLy8vIEBwYXJhbSBCYWNrZW5kTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBiYWNrZW5kLiBUaGlzIHNob3VsZCBiZSBhIHN0YXRpYworICAvLy8gc3RyaW5nIHRoYXQgaXMgdGhlIHNhbWUgZm9yIGFsbCB0YXJnZXRzIHRoYXQgc2hhcmUgYSBiYWNrZW5kCisgIC8vLyBpbXBsZW1lbnRhdGlvbiBhbmQgbXVzdCBtYXRjaCB0aGUgbmFtZSB1c2VkIGluIHRoZSAnZGVmIFggOiBUYXJnZXQgLi4uJyBpbgorICAvLy8gVGFibGVHZW4uCisgIC8vLyBAcGFyYW0gQXJjaE1hdGNoRm4gLSBUaGUgYXJjaCBtYXRjaCBjaGVja2luZyBmdW5jdGlvbiBmb3IgdGhpcyB0YXJnZXQuCisgIC8vLyBAcGFyYW0gSGFzSklUIC0gV2hldGhlciB0aGUgdGFyZ2V0IHN1cHBvcnRzIEpJVCBjb2RlCisgIC8vLyBnZW5lcmF0aW9uLgorICBzdGF0aWMgdm9pZCBSZWdpc3RlclRhcmdldChUYXJnZXQgJlQsIGNvbnN0IGNoYXIgKk5hbWUsIGNvbnN0IGNoYXIgKlNob3J0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqQmFja2VuZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldDo6QXJjaE1hdGNoRm5UeSBBcmNoTWF0Y2hGbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNKSVQgPSBmYWxzZSk7CisKKyAgLy8vIFJlZ2lzdGVyTUNBc21JbmZvIC0gUmVnaXN0ZXIgYSBNQ0FzbUluZm8gaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICAvLy8gZ2l2ZW4gdGFyZ2V0LgorICAvLy8KKyAgLy8vIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHJlZ2lzdHJhdGlvbiBkb2Vzbid0IG9jY3VyCisgIC8vLyB3aGlsZSBhbm90aGVyIHRocmVhZCBpcyBhdHRlbXB0aW5nIHRvIGFjY2VzcyB0aGUgcmVnaXN0cnkuIFR5cGljYWxseQorICAvLy8gdGhpcyBpcyBkb25lIGJ5IGluaXRpYWxpemluZyBhbGwgdGFyZ2V0cyBhdCBwcm9ncmFtIHN0YXJ0dXAuCisgIC8vLworICAvLy8gQHBhcmFtIFQgLSBUaGUgdGFyZ2V0IGJlaW5nIHJlZ2lzdGVyZWQuCisgIC8vLyBAcGFyYW0gRm4gLSBBIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCBhIE1DQXNtSW5mbyBmb3IgdGhlIHRhcmdldC4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJNQ0FzbUluZm8oVGFyZ2V0ICZULCBUYXJnZXQ6Ok1DQXNtSW5mb0N0b3JGblR5IEZuKSB7CisgICAgVC5NQ0FzbUluZm9DdG9yRm4gPSBGbjsKKyAgfQorCisgIC8vLyBSZWdpc3Rlck1DSW5zdHJJbmZvIC0gUmVnaXN0ZXIgYSBNQ0luc3RySW5mbyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgIC8vLyBnaXZlbiB0YXJnZXQuCisgIC8vLworICAvLy8gQ2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgcmVnaXN0cmF0aW9uIGRvZXNuJ3Qgb2NjdXIKKyAgLy8vIHdoaWxlIGFub3RoZXIgdGhyZWFkIGlzIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHRoZSByZWdpc3RyeS4gVHlwaWNhbGx5CisgIC8vLyB0aGlzIGlzIGRvbmUgYnkgaW5pdGlhbGl6aW5nIGFsbCB0YXJnZXRzIGF0IHByb2dyYW0gc3RhcnR1cC4KKyAgLy8vCisgIC8vLyBAcGFyYW0gVCAtIFRoZSB0YXJnZXQgYmVpbmcgcmVnaXN0ZXJlZC4KKyAgLy8vIEBwYXJhbSBGbiAtIEEgZnVuY3Rpb24gdG8gY29uc3RydWN0IGEgTUNJbnN0ckluZm8gZm9yIHRoZSB0YXJnZXQuCisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyTUNJbnN0ckluZm8oVGFyZ2V0ICZULCBUYXJnZXQ6Ok1DSW5zdHJJbmZvQ3RvckZuVHkgRm4pIHsKKyAgICBULk1DSW5zdHJJbmZvQ3RvckZuID0gRm47CisgIH0KKworICAvLy8gUmVnaXN0ZXJNQ0luc3RyQW5hbHlzaXMgLSBSZWdpc3RlciBhIE1DSW5zdHJBbmFseXNpcyBpbXBsZW1lbnRhdGlvbiBmb3IKKyAgLy8vIHRoZSBnaXZlbiB0YXJnZXQuCisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyTUNJbnN0ckFuYWx5c2lzKFRhcmdldCAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0OjpNQ0luc3RyQW5hbHlzaXNDdG9yRm5UeSBGbikgeworICAgIFQuTUNJbnN0ckFuYWx5c2lzQ3RvckZuID0gRm47CisgIH0KKworICAvLy8gUmVnaXN0ZXJNQ1JlZ0luZm8gLSBSZWdpc3RlciBhIE1DUmVnaXN0ZXJJbmZvIGltcGxlbWVudGF0aW9uIGZvciB0aGUKKyAgLy8vIGdpdmVuIHRhcmdldC4KKyAgLy8vCisgIC8vLyBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCByZWdpc3RyYXRpb24gZG9lc24ndCBvY2N1cgorICAvLy8gd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5LiBUeXBpY2FsbHkKKyAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAvLy8KKyAgLy8vIEBwYXJhbSBUIC0gVGhlIHRhcmdldCBiZWluZyByZWdpc3RlcmVkLgorICAvLy8gQHBhcmFtIEZuIC0gQSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYSBNQ1JlZ2lzdGVySW5mbyBmb3IgdGhlIHRhcmdldC4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJNQ1JlZ0luZm8oVGFyZ2V0ICZULCBUYXJnZXQ6Ok1DUmVnSW5mb0N0b3JGblR5IEZuKSB7CisgICAgVC5NQ1JlZ0luZm9DdG9yRm4gPSBGbjsKKyAgfQorCisgIC8vLyBSZWdpc3Rlck1DU3VidGFyZ2V0SW5mbyAtIFJlZ2lzdGVyIGEgTUNTdWJ0YXJnZXRJbmZvIGltcGxlbWVudGF0aW9uIGZvcgorICAvLy8gdGhlIGdpdmVuIHRhcmdldC4KKyAgLy8vCisgIC8vLyBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCByZWdpc3RyYXRpb24gZG9lc24ndCBvY2N1cgorICAvLy8gd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5LiBUeXBpY2FsbHkKKyAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAvLy8KKyAgLy8vIEBwYXJhbSBUIC0gVGhlIHRhcmdldCBiZWluZyByZWdpc3RlcmVkLgorICAvLy8gQHBhcmFtIEZuIC0gQSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYSBNQ1N1YnRhcmdldEluZm8gZm9yIHRoZSB0YXJnZXQuCisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyTUNTdWJ0YXJnZXRJbmZvKFRhcmdldCAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0OjpNQ1N1YnRhcmdldEluZm9DdG9yRm5UeSBGbikgeworICAgIFQuTUNTdWJ0YXJnZXRJbmZvQ3RvckZuID0gRm47CisgIH0KKworICAvLy8gUmVnaXN0ZXJUYXJnZXRNYWNoaW5lIC0gUmVnaXN0ZXIgYSBUYXJnZXRNYWNoaW5lIGltcGxlbWVudGF0aW9uIGZvciB0aGUKKyAgLy8vIGdpdmVuIHRhcmdldC4KKyAgLy8vCisgIC8vLyBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCByZWdpc3RyYXRpb24gZG9lc24ndCBvY2N1cgorICAvLy8gd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5LiBUeXBpY2FsbHkKKyAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAvLy8KKyAgLy8vIEBwYXJhbSBUIC0gVGhlIHRhcmdldCBiZWluZyByZWdpc3RlcmVkLgorICAvLy8gQHBhcmFtIEZuIC0gQSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYSBUYXJnZXRNYWNoaW5lIGZvciB0aGUgdGFyZ2V0LgorICBzdGF0aWMgdm9pZCBSZWdpc3RlclRhcmdldE1hY2hpbmUoVGFyZ2V0ICZULCBUYXJnZXQ6OlRhcmdldE1hY2hpbmVDdG9yVHkgRm4pIHsKKyAgICBULlRhcmdldE1hY2hpbmVDdG9yRm4gPSBGbjsKKyAgfQorCisgIC8vLyBSZWdpc3Rlck1DQXNtQmFja2VuZCAtIFJlZ2lzdGVyIGEgTUNBc21CYWNrZW5kIGltcGxlbWVudGF0aW9uIGZvciB0aGUKKyAgLy8vIGdpdmVuIHRhcmdldC4KKyAgLy8vCisgIC8vLyBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCByZWdpc3RyYXRpb24gZG9lc24ndCBvY2N1cgorICAvLy8gd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5LiBUeXBpY2FsbHkKKyAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAvLy8KKyAgLy8vIEBwYXJhbSBUIC0gVGhlIHRhcmdldCBiZWluZyByZWdpc3RlcmVkLgorICAvLy8gQHBhcmFtIEZuIC0gQSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYW4gQXNtQmFja2VuZCBmb3IgdGhlIHRhcmdldC4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJNQ0FzbUJhY2tlbmQoVGFyZ2V0ICZULCBUYXJnZXQ6Ok1DQXNtQmFja2VuZEN0b3JUeSBGbikgeworICAgIFQuTUNBc21CYWNrZW5kQ3RvckZuID0gRm47CisgIH0KKworICAvLy8gUmVnaXN0ZXJNQ0FzbVBhcnNlciAtIFJlZ2lzdGVyIGEgTUNUYXJnZXRBc21QYXJzZXIgaW1wbGVtZW50YXRpb24gZm9yCisgIC8vLyB0aGUgZ2l2ZW4gdGFyZ2V0LgorICAvLy8KKyAgLy8vIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHJlZ2lzdHJhdGlvbiBkb2Vzbid0IG9jY3VyCisgIC8vLyB3aGlsZSBhbm90aGVyIHRocmVhZCBpcyBhdHRlbXB0aW5nIHRvIGFjY2VzcyB0aGUgcmVnaXN0cnkuIFR5cGljYWxseQorICAvLy8gdGhpcyBpcyBkb25lIGJ5IGluaXRpYWxpemluZyBhbGwgdGFyZ2V0cyBhdCBwcm9ncmFtIHN0YXJ0dXAuCisgIC8vLworICAvLy8gQHBhcmFtIFQgLSBUaGUgdGFyZ2V0IGJlaW5nIHJlZ2lzdGVyZWQuCisgIC8vLyBAcGFyYW0gRm4gLSBBIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCBhbiBNQ1RhcmdldEFzbVBhcnNlciBmb3IgdGhlIHRhcmdldC4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJNQ0FzbVBhcnNlcihUYXJnZXQgJlQsIFRhcmdldDo6TUNBc21QYXJzZXJDdG9yVHkgRm4pIHsKKyAgICBULk1DQXNtUGFyc2VyQ3RvckZuID0gRm47CisgIH0KKworICAvLy8gUmVnaXN0ZXJBc21QcmludGVyIC0gUmVnaXN0ZXIgYW4gQXNtUHJpbnRlciBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGdpdmVuCisgIC8vLyB0YXJnZXQuCisgIC8vLworICAvLy8gQ2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgcmVnaXN0cmF0aW9uIGRvZXNuJ3Qgb2NjdXIKKyAgLy8vIHdoaWxlIGFub3RoZXIgdGhyZWFkIGlzIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHRoZSByZWdpc3RyeS4gVHlwaWNhbGx5CisgIC8vLyB0aGlzIGlzIGRvbmUgYnkgaW5pdGlhbGl6aW5nIGFsbCB0YXJnZXRzIGF0IHByb2dyYW0gc3RhcnR1cC4KKyAgLy8vCisgIC8vLyBAcGFyYW0gVCAtIFRoZSB0YXJnZXQgYmVpbmcgcmVnaXN0ZXJlZC4KKyAgLy8vIEBwYXJhbSBGbiAtIEEgZnVuY3Rpb24gdG8gY29uc3RydWN0IGFuIEFzbVByaW50ZXIgZm9yIHRoZSB0YXJnZXQuCisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQXNtUHJpbnRlcihUYXJnZXQgJlQsIFRhcmdldDo6QXNtUHJpbnRlckN0b3JUeSBGbikgeworICAgIFQuQXNtUHJpbnRlckN0b3JGbiA9IEZuOworICB9CisKKyAgLy8vIFJlZ2lzdGVyTUNEaXNhc3NlbWJsZXIgLSBSZWdpc3RlciBhIE1DRGlzYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uIGZvcgorICAvLy8gdGhlIGdpdmVuIHRhcmdldC4KKyAgLy8vCisgIC8vLyBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCByZWdpc3RyYXRpb24gZG9lc24ndCBvY2N1cgorICAvLy8gd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5LiBUeXBpY2FsbHkKKyAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAvLy8KKyAgLy8vIEBwYXJhbSBUIC0gVGhlIHRhcmdldCBiZWluZyByZWdpc3RlcmVkLgorICAvLy8gQHBhcmFtIEZuIC0gQSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYW4gTUNEaXNhc3NlbWJsZXIgZm9yIHRoZSB0YXJnZXQuCisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyTUNEaXNhc3NlbWJsZXIoVGFyZ2V0ICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldDo6TUNEaXNhc3NlbWJsZXJDdG9yVHkgRm4pIHsKKyAgICBULk1DRGlzYXNzZW1ibGVyQ3RvckZuID0gRm47CisgIH0KKworICAvLy8gUmVnaXN0ZXJNQ0luc3RQcmludGVyIC0gUmVnaXN0ZXIgYSBNQ0luc3RQcmludGVyIGltcGxlbWVudGF0aW9uIGZvciB0aGUKKyAgLy8vIGdpdmVuIHRhcmdldC4KKyAgLy8vCisgIC8vLyBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCByZWdpc3RyYXRpb24gZG9lc24ndCBvY2N1cgorICAvLy8gd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5LiBUeXBpY2FsbHkKKyAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAvLy8KKyAgLy8vIEBwYXJhbSBUIC0gVGhlIHRhcmdldCBiZWluZyByZWdpc3RlcmVkLgorICAvLy8gQHBhcmFtIEZuIC0gQSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYW4gTUNJbnN0UHJpbnRlciBmb3IgdGhlIHRhcmdldC4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJNQ0luc3RQcmludGVyKFRhcmdldCAmVCwgVGFyZ2V0OjpNQ0luc3RQcmludGVyQ3RvclR5IEZuKSB7CisgICAgVC5NQ0luc3RQcmludGVyQ3RvckZuID0gRm47CisgIH0KKworICAvLy8gUmVnaXN0ZXJNQ0NvZGVFbWl0dGVyIC0gUmVnaXN0ZXIgYSBNQ0NvZGVFbWl0dGVyIGltcGxlbWVudGF0aW9uIGZvciB0aGUKKyAgLy8vIGdpdmVuIHRhcmdldC4KKyAgLy8vCisgIC8vLyBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCByZWdpc3RyYXRpb24gZG9lc24ndCBvY2N1cgorICAvLy8gd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5LiBUeXBpY2FsbHkKKyAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAvLy8KKyAgLy8vIEBwYXJhbSBUIC0gVGhlIHRhcmdldCBiZWluZyByZWdpc3RlcmVkLgorICAvLy8gQHBhcmFtIEZuIC0gQSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYW4gTUNDb2RlRW1pdHRlciBmb3IgdGhlIHRhcmdldC4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJNQ0NvZGVFbWl0dGVyKFRhcmdldCAmVCwgVGFyZ2V0OjpNQ0NvZGVFbWl0dGVyQ3RvclR5IEZuKSB7CisgICAgVC5NQ0NvZGVFbWl0dGVyQ3RvckZuID0gRm47CisgIH0KKworICBzdGF0aWMgdm9pZCBSZWdpc3RlckNPRkZTdHJlYW1lcihUYXJnZXQgJlQsIFRhcmdldDo6Q09GRlN0cmVhbWVyQ3RvclR5IEZuKSB7CisgICAgVC5DT0ZGU3RyZWFtZXJDdG9yRm4gPSBGbjsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyTWFjaE9TdHJlYW1lcihUYXJnZXQgJlQsIFRhcmdldDo6TWFjaE9TdHJlYW1lckN0b3JUeSBGbikgeworICAgIFQuTWFjaE9TdHJlYW1lckN0b3JGbiA9IEZuOworICB9CisKKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJFTEZTdHJlYW1lcihUYXJnZXQgJlQsIFRhcmdldDo6RUxGU3RyZWFtZXJDdG9yVHkgRm4pIHsKKyAgICBULkVMRlN0cmVhbWVyQ3RvckZuID0gRm47CisgIH0KKworICBzdGF0aWMgdm9pZCBSZWdpc3Rlcldhc21TdHJlYW1lcihUYXJnZXQgJlQsIFRhcmdldDo6V2FzbVN0cmVhbWVyQ3RvclR5IEZuKSB7CisgICAgVC5XYXNtU3RyZWFtZXJDdG9yRm4gPSBGbjsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyTnVsbFRhcmdldFN0cmVhbWVyKFRhcmdldCAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0OjpOdWxsVGFyZ2V0U3RyZWFtZXJDdG9yVHkgRm4pIHsKKyAgICBULk51bGxUYXJnZXRTdHJlYW1lckN0b3JGbiA9IEZuOworICB9CisKKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJBc21UYXJnZXRTdHJlYW1lcihUYXJnZXQgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0OjpBc21UYXJnZXRTdHJlYW1lckN0b3JUeSBGbikgeworICAgIFQuQXNtVGFyZ2V0U3RyZWFtZXJDdG9yRm4gPSBGbjsKKyAgfQorCisgIHN0YXRpYyB2b2lkCisgIFJlZ2lzdGVyT2JqZWN0VGFyZ2V0U3RyZWFtZXIoVGFyZ2V0ICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldDo6T2JqZWN0VGFyZ2V0U3RyZWFtZXJDdG9yVHkgRm4pIHsKKyAgICBULk9iamVjdFRhcmdldFN0cmVhbWVyQ3RvckZuID0gRm47CisgIH0KKworICAvLy8gUmVnaXN0ZXJNQ1JlbG9jYXRpb25JbmZvIC0gUmVnaXN0ZXIgYW4gTUNSZWxvY2F0aW9uSW5mbworICAvLy8gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBnaXZlbiB0YXJnZXQuCisgIC8vLworICAvLy8gQ2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgcmVnaXN0cmF0aW9uIGRvZXNuJ3Qgb2NjdXIKKyAgLy8vIHdoaWxlIGFub3RoZXIgdGhyZWFkIGlzIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHRoZSByZWdpc3RyeS4gVHlwaWNhbGx5CisgIC8vLyB0aGlzIGlzIGRvbmUgYnkgaW5pdGlhbGl6aW5nIGFsbCB0YXJnZXRzIGF0IHByb2dyYW0gc3RhcnR1cC4KKyAgLy8vCisgIC8vLyBAcGFyYW0gVCAtIFRoZSB0YXJnZXQgYmVpbmcgcmVnaXN0ZXJlZC4KKyAgLy8vIEBwYXJhbSBGbiAtIEEgZnVuY3Rpb24gdG8gY29uc3RydWN0IGFuIE1DUmVsb2NhdGlvbkluZm8gZm9yIHRoZSB0YXJnZXQuCisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyTUNSZWxvY2F0aW9uSW5mbyhUYXJnZXQgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQ6Ok1DUmVsb2NhdGlvbkluZm9DdG9yVHkgRm4pIHsKKyAgICBULk1DUmVsb2NhdGlvbkluZm9DdG9yRm4gPSBGbjsKKyAgfQorCisgIC8vLyBSZWdpc3Rlck1DU3ltYm9saXplciAtIFJlZ2lzdGVyIGFuIE1DU3ltYm9saXplcgorICAvLy8gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBnaXZlbiB0YXJnZXQuCisgIC8vLworICAvLy8gQ2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgcmVnaXN0cmF0aW9uIGRvZXNuJ3Qgb2NjdXIKKyAgLy8vIHdoaWxlIGFub3RoZXIgdGhyZWFkIGlzIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHRoZSByZWdpc3RyeS4gVHlwaWNhbGx5CisgIC8vLyB0aGlzIGlzIGRvbmUgYnkgaW5pdGlhbGl6aW5nIGFsbCB0YXJnZXRzIGF0IHByb2dyYW0gc3RhcnR1cC4KKyAgLy8vCisgIC8vLyBAcGFyYW0gVCAtIFRoZSB0YXJnZXQgYmVpbmcgcmVnaXN0ZXJlZC4KKyAgLy8vIEBwYXJhbSBGbiAtIEEgZnVuY3Rpb24gdG8gY29uc3RydWN0IGFuIE1DU3ltYm9saXplciBmb3IgdGhlIHRhcmdldC4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJNQ1N5bWJvbGl6ZXIoVGFyZ2V0ICZULCBUYXJnZXQ6Ok1DU3ltYm9saXplckN0b3JUeSBGbikgeworICAgIFQuTUNTeW1ib2xpemVyQ3RvckZuID0gRm47CisgIH0KKworICAvLy8gQH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gUmVnaXN0ZXJUYXJnZXQgLSBIZWxwZXIgdGVtcGxhdGUgZm9yIHJlZ2lzdGVyaW5nIGEgdGFyZ2V0LCBmb3IgdXNlIGluIHRoZQorLy8vIHRhcmdldCdzIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLiBVc2FnZToKKy8vLworLy8vCisvLy8gVGFyZ2V0ICZnZXRUaGVGb29UYXJnZXQoKSB7IC8vIFRoZSBnbG9iYWwgdGFyZ2V0IGluc3RhbmNlLgorLy8vICAgc3RhdGljIFRhcmdldCBUaGVGb29UYXJnZXQ7CisvLy8gICByZXR1cm4gVGhlRm9vVGFyZ2V0OworLy8vIH0KKy8vLyBleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVGb29UYXJnZXRJbmZvKCkgeworLy8vICAgUmVnaXN0ZXJUYXJnZXQ8VHJpcGxlOjpmb28+IFgoZ2V0VGhlRm9vVGFyZ2V0KCksICJmb28iLCAiRm9vCisvLy8gICBkZXNjcmlwdGlvbiIsICJGb28iIC8qIEJhY2tlbmQgTmFtZSAqLyk7CisvLy8gfQordGVtcGxhdGUgPFRyaXBsZTo6QXJjaFR5cGUgVGFyZ2V0QXJjaFR5cGUgPSBUcmlwbGU6OlVua25vd25BcmNoLAorICAgICAgICAgIGJvb2wgSGFzSklUID0gZmFsc2U+CitzdHJ1Y3QgUmVnaXN0ZXJUYXJnZXQgeworICBSZWdpc3RlclRhcmdldChUYXJnZXQgJlQsIGNvbnN0IGNoYXIgKk5hbWUsIGNvbnN0IGNoYXIgKkRlc2MsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkJhY2tlbmROYW1lKSB7CisgICAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyVGFyZ2V0KFQsIE5hbWUsIERlc2MsIEJhY2tlbmROYW1lLCAmZ2V0QXJjaE1hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNKSVQpOworICB9CisKKyAgc3RhdGljIGJvb2wgZ2V0QXJjaE1hdGNoKFRyaXBsZTo6QXJjaFR5cGUgQXJjaCkgeworICAgIHJldHVybiBBcmNoID09IFRhcmdldEFyY2hUeXBlOworICB9Cit9OworCisvLy8gUmVnaXN0ZXJNQ0FzbUluZm8gLSBIZWxwZXIgdGVtcGxhdGUgZm9yIHJlZ2lzdGVyaW5nIGEgdGFyZ2V0IGFzc2VtYmx5IGluZm8KKy8vLyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaW52b2tlcyB0aGUgc3RhdGljICJDcmVhdGUiIG1ldGhvZCBvbiB0aGUgY2xhc3MgdG8KKy8vLyBhY3R1YWxseSBkbyB0aGUgY29uc3RydWN0aW9uLiAgVXNhZ2U6CisvLy8KKy8vLyBleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVGb29UYXJnZXQoKSB7CisvLy8gICBleHRlcm4gVGFyZ2V0IFRoZUZvb1RhcmdldDsKKy8vLyAgIFJlZ2lzdGVyTUNBc21JbmZvPEZvb01DQXNtSW5mbz4gWChUaGVGb29UYXJnZXQpOworLy8vIH0KK3RlbXBsYXRlIDxjbGFzcyBNQ0FzbUluZm9JbXBsPiBzdHJ1Y3QgUmVnaXN0ZXJNQ0FzbUluZm8geworICBSZWdpc3Rlck1DQXNtSW5mbyhUYXJnZXQgJlQpIHsKKyAgICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJNQ0FzbUluZm8oVCwgJkFsbG9jYXRvcik7CisgIH0KKworcHJpdmF0ZToKKyAgc3RhdGljIE1DQXNtSW5mbyAqQWxsb2NhdG9yKGNvbnN0IE1DUmVnaXN0ZXJJbmZvICYgLypNUkkqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyaXBsZSAmVFQpIHsKKyAgICByZXR1cm4gbmV3IE1DQXNtSW5mb0ltcGwoVFQpOworICB9Cit9OworCisvLy8gUmVnaXN0ZXJNQ0FzbUluZm9GbiAtIEhlbHBlciB0ZW1wbGF0ZSBmb3IgcmVnaXN0ZXJpbmcgYSB0YXJnZXQgYXNzZW1ibHkgaW5mbworLy8vIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpbnZva2VzIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gdG8gZG8gdGhlCisvLy8gY29uc3RydWN0aW9uLiAgVXNhZ2U6CisvLy8KKy8vLyBleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVGb29UYXJnZXQoKSB7CisvLy8gICBleHRlcm4gVGFyZ2V0IFRoZUZvb1RhcmdldDsKKy8vLyAgIFJlZ2lzdGVyTUNBc21JbmZvRm4gWChUaGVGb29UYXJnZXQsIFRoZUZ1bmN0aW9uKTsKKy8vLyB9CitzdHJ1Y3QgUmVnaXN0ZXJNQ0FzbUluZm9GbiB7CisgIFJlZ2lzdGVyTUNBc21JbmZvRm4oVGFyZ2V0ICZULCBUYXJnZXQ6Ok1DQXNtSW5mb0N0b3JGblR5IEZuKSB7CisgICAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyTUNBc21JbmZvKFQsIEZuKTsKKyAgfQorfTsKKworLy8vIFJlZ2lzdGVyTUNJbnN0ckluZm8gLSBIZWxwZXIgdGVtcGxhdGUgZm9yIHJlZ2lzdGVyaW5nIGEgdGFyZ2V0IGluc3RydWN0aW9uCisvLy8gaW5mbyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaW52b2tlcyB0aGUgc3RhdGljICJDcmVhdGUiIG1ldGhvZCBvbiB0aGUgY2xhc3MKKy8vLyB0byBhY3R1YWxseSBkbyB0aGUgY29uc3RydWN0aW9uLiAgVXNhZ2U6CisvLy8KKy8vLyBleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVGb29UYXJnZXQoKSB7CisvLy8gICBleHRlcm4gVGFyZ2V0IFRoZUZvb1RhcmdldDsKKy8vLyAgIFJlZ2lzdGVyTUNJbnN0ckluZm88Rm9vTUNJbnN0ckluZm8+IFgoVGhlRm9vVGFyZ2V0KTsKKy8vLyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgTUNJbnN0ckluZm9JbXBsPiBzdHJ1Y3QgUmVnaXN0ZXJNQ0luc3RySW5mbyB7CisgIFJlZ2lzdGVyTUNJbnN0ckluZm8oVGFyZ2V0ICZUKSB7CisgICAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyTUNJbnN0ckluZm8oVCwgJkFsbG9jYXRvcik7CisgIH0KKworcHJpdmF0ZToKKyAgc3RhdGljIE1DSW5zdHJJbmZvICpBbGxvY2F0b3IoKSB7IHJldHVybiBuZXcgTUNJbnN0ckluZm9JbXBsKCk7IH0KK307CisKKy8vLyBSZWdpc3Rlck1DSW5zdHJJbmZvRm4gLSBIZWxwZXIgdGVtcGxhdGUgZm9yIHJlZ2lzdGVyaW5nIGEgdGFyZ2V0CisvLy8gaW5zdHJ1Y3Rpb24gaW5mbyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaW52b2tlcyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIHRvCisvLy8gZG8gdGhlIGNvbnN0cnVjdGlvbi4gIFVzYWdlOgorLy8vCisvLy8gZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplRm9vVGFyZ2V0KCkgeworLy8vICAgZXh0ZXJuIFRhcmdldCBUaGVGb29UYXJnZXQ7CisvLy8gICBSZWdpc3Rlck1DSW5zdHJJbmZvRm4gWChUaGVGb29UYXJnZXQsIFRoZUZ1bmN0aW9uKTsKKy8vLyB9CitzdHJ1Y3QgUmVnaXN0ZXJNQ0luc3RySW5mb0ZuIHsKKyAgUmVnaXN0ZXJNQ0luc3RySW5mb0ZuKFRhcmdldCAmVCwgVGFyZ2V0OjpNQ0luc3RySW5mb0N0b3JGblR5IEZuKSB7CisgICAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyTUNJbnN0ckluZm8oVCwgRm4pOworICB9Cit9OworCisvLy8gUmVnaXN0ZXJNQ0luc3RyQW5hbHlzaXMgLSBIZWxwZXIgdGVtcGxhdGUgZm9yIHJlZ2lzdGVyaW5nIGEgdGFyZ2V0CisvLy8gaW5zdHJ1Y3Rpb24gYW5hbHl6ZXIgaW1wbGVtZW50YXRpb24uICBUaGlzIGludm9rZXMgdGhlIHN0YXRpYyAiQ3JlYXRlIgorLy8vIG1ldGhvZCBvbiB0aGUgY2xhc3MgdG8gYWN0dWFsbHkgZG8gdGhlIGNvbnN0cnVjdGlvbi4gIFVzYWdlOgorLy8vCisvLy8gZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplRm9vVGFyZ2V0KCkgeworLy8vICAgZXh0ZXJuIFRhcmdldCBUaGVGb29UYXJnZXQ7CisvLy8gICBSZWdpc3Rlck1DSW5zdHJBbmFseXNpczxGb29NQ0luc3RyQW5hbHlzaXM+IFgoVGhlRm9vVGFyZ2V0KTsKKy8vLyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgTUNJbnN0ckFuYWx5c2lzSW1wbD4gc3RydWN0IFJlZ2lzdGVyTUNJbnN0ckFuYWx5c2lzIHsKKyAgUmVnaXN0ZXJNQ0luc3RyQW5hbHlzaXMoVGFyZ2V0ICZUKSB7CisgICAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyTUNJbnN0ckFuYWx5c2lzKFQsICZBbGxvY2F0b3IpOworICB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyBNQ0luc3RyQW5hbHlzaXMgKkFsbG9jYXRvcihjb25zdCBNQ0luc3RySW5mbyAqSW5mbykgeworICAgIHJldHVybiBuZXcgTUNJbnN0ckFuYWx5c2lzSW1wbChJbmZvKTsKKyAgfQorfTsKKworLy8vIFJlZ2lzdGVyTUNJbnN0ckFuYWx5c2lzRm4gLSBIZWxwZXIgdGVtcGxhdGUgZm9yIHJlZ2lzdGVyaW5nIGEgdGFyZ2V0CisvLy8gaW5zdHJ1Y3Rpb24gYW5hbHl6ZXIgaW1wbGVtZW50YXRpb24uICBUaGlzIGludm9rZXMgdGhlIHNwZWNpZmllZCBmdW5jdGlvbgorLy8vIHRvIGRvIHRoZSBjb25zdHJ1Y3Rpb24uICBVc2FnZToKKy8vLworLy8vIGV4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUZvb1RhcmdldCgpIHsKKy8vLyAgIGV4dGVybiBUYXJnZXQgVGhlRm9vVGFyZ2V0OworLy8vICAgUmVnaXN0ZXJNQ0luc3RyQW5hbHlzaXNGbiBYKFRoZUZvb1RhcmdldCwgVGhlRnVuY3Rpb24pOworLy8vIH0KK3N0cnVjdCBSZWdpc3Rlck1DSW5zdHJBbmFseXNpc0ZuIHsKKyAgUmVnaXN0ZXJNQ0luc3RyQW5hbHlzaXNGbihUYXJnZXQgJlQsIFRhcmdldDo6TUNJbnN0ckFuYWx5c2lzQ3RvckZuVHkgRm4pIHsKKyAgICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJNQ0luc3RyQW5hbHlzaXMoVCwgRm4pOworICB9Cit9OworCisvLy8gUmVnaXN0ZXJNQ1JlZ0luZm8gLSBIZWxwZXIgdGVtcGxhdGUgZm9yIHJlZ2lzdGVyaW5nIGEgdGFyZ2V0IHJlZ2lzdGVyIGluZm8KKy8vLyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaW52b2tlcyB0aGUgc3RhdGljICJDcmVhdGUiIG1ldGhvZCBvbiB0aGUgY2xhc3MgdG8KKy8vLyBhY3R1YWxseSBkbyB0aGUgY29uc3RydWN0aW9uLiAgVXNhZ2U6CisvLy8KKy8vLyBleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVGb29UYXJnZXQoKSB7CisvLy8gICBleHRlcm4gVGFyZ2V0IFRoZUZvb1RhcmdldDsKKy8vLyAgIFJlZ2lzdGVyTUNSZWdJbmZvPEZvb01DUmVnSW5mbz4gWChUaGVGb29UYXJnZXQpOworLy8vIH0KK3RlbXBsYXRlIDxjbGFzcyBNQ1JlZ2lzdGVySW5mb0ltcGw+IHN0cnVjdCBSZWdpc3Rlck1DUmVnSW5mbyB7CisgIFJlZ2lzdGVyTUNSZWdJbmZvKFRhcmdldCAmVCkgeworICAgIFRhcmdldFJlZ2lzdHJ5OjpSZWdpc3Rlck1DUmVnSW5mbyhULCAmQWxsb2NhdG9yKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgTUNSZWdpc3RlckluZm8gKkFsbG9jYXRvcihjb25zdCBUcmlwbGUgJiAvKlRUKi8pIHsKKyAgICByZXR1cm4gbmV3IE1DUmVnaXN0ZXJJbmZvSW1wbCgpOworICB9Cit9OworCisvLy8gUmVnaXN0ZXJNQ1JlZ0luZm9GbiAtIEhlbHBlciB0ZW1wbGF0ZSBmb3IgcmVnaXN0ZXJpbmcgYSB0YXJnZXQgcmVnaXN0ZXIKKy8vLyBpbmZvIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpbnZva2VzIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gdG8gZG8gdGhlCisvLy8gY29uc3RydWN0aW9uLiAgVXNhZ2U6CisvLy8KKy8vLyBleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVGb29UYXJnZXQoKSB7CisvLy8gICBleHRlcm4gVGFyZ2V0IFRoZUZvb1RhcmdldDsKKy8vLyAgIFJlZ2lzdGVyTUNSZWdJbmZvRm4gWChUaGVGb29UYXJnZXQsIFRoZUZ1bmN0aW9uKTsKKy8vLyB9CitzdHJ1Y3QgUmVnaXN0ZXJNQ1JlZ0luZm9GbiB7CisgIFJlZ2lzdGVyTUNSZWdJbmZvRm4oVGFyZ2V0ICZULCBUYXJnZXQ6Ok1DUmVnSW5mb0N0b3JGblR5IEZuKSB7CisgICAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyTUNSZWdJbmZvKFQsIEZuKTsKKyAgfQorfTsKKworLy8vIFJlZ2lzdGVyTUNTdWJ0YXJnZXRJbmZvIC0gSGVscGVyIHRlbXBsYXRlIGZvciByZWdpc3RlcmluZyBhIHRhcmdldAorLy8vIHN1YnRhcmdldCBpbmZvIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpbnZva2VzIHRoZSBzdGF0aWMgIkNyZWF0ZSIgbWV0aG9kCisvLy8gb24gdGhlIGNsYXNzIHRvIGFjdHVhbGx5IGRvIHRoZSBjb25zdHJ1Y3Rpb24uICBVc2FnZToKKy8vLworLy8vIGV4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUZvb1RhcmdldCgpIHsKKy8vLyAgIGV4dGVybiBUYXJnZXQgVGhlRm9vVGFyZ2V0OworLy8vICAgUmVnaXN0ZXJNQ1N1YnRhcmdldEluZm88Rm9vTUNTdWJ0YXJnZXRJbmZvPiBYKFRoZUZvb1RhcmdldCk7CisvLy8gfQordGVtcGxhdGUgPGNsYXNzIE1DU3VidGFyZ2V0SW5mb0ltcGw+IHN0cnVjdCBSZWdpc3Rlck1DU3VidGFyZ2V0SW5mbyB7CisgIFJlZ2lzdGVyTUNTdWJ0YXJnZXRJbmZvKFRhcmdldCAmVCkgeworICAgIFRhcmdldFJlZ2lzdHJ5OjpSZWdpc3Rlck1DU3VidGFyZ2V0SW5mbyhULCAmQWxsb2NhdG9yKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgTUNTdWJ0YXJnZXRJbmZvICpBbGxvY2F0b3IoY29uc3QgVHJpcGxlICYgLypUVCovLCBTdHJpbmdSZWYgLypDUFUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAvKkZTKi8pIHsKKyAgICByZXR1cm4gbmV3IE1DU3VidGFyZ2V0SW5mb0ltcGwoKTsKKyAgfQorfTsKKworLy8vIFJlZ2lzdGVyTUNTdWJ0YXJnZXRJbmZvRm4gLSBIZWxwZXIgdGVtcGxhdGUgZm9yIHJlZ2lzdGVyaW5nIGEgdGFyZ2V0CisvLy8gc3VidGFyZ2V0IGluZm8gaW1wbGVtZW50YXRpb24uICBUaGlzIGludm9rZXMgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiB0bworLy8vIGRvIHRoZSBjb25zdHJ1Y3Rpb24uICBVc2FnZToKKy8vLworLy8vIGV4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUZvb1RhcmdldCgpIHsKKy8vLyAgIGV4dGVybiBUYXJnZXQgVGhlRm9vVGFyZ2V0OworLy8vICAgUmVnaXN0ZXJNQ1N1YnRhcmdldEluZm9GbiBYKFRoZUZvb1RhcmdldCwgVGhlRnVuY3Rpb24pOworLy8vIH0KK3N0cnVjdCBSZWdpc3Rlck1DU3VidGFyZ2V0SW5mb0ZuIHsKKyAgUmVnaXN0ZXJNQ1N1YnRhcmdldEluZm9GbihUYXJnZXQgJlQsIFRhcmdldDo6TUNTdWJ0YXJnZXRJbmZvQ3RvckZuVHkgRm4pIHsKKyAgICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJNQ1N1YnRhcmdldEluZm8oVCwgRm4pOworICB9Cit9OworCisvLy8gUmVnaXN0ZXJUYXJnZXRNYWNoaW5lIC0gSGVscGVyIHRlbXBsYXRlIGZvciByZWdpc3RlcmluZyBhIHRhcmdldCBtYWNoaW5lCisvLy8gaW1wbGVtZW50YXRpb24sIGZvciB1c2UgaW4gdGhlIHRhcmdldCBtYWNoaW5lIGluaXRpYWxpemF0aW9uCisvLy8gZnVuY3Rpb24uIFVzYWdlOgorLy8vCisvLy8gZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplRm9vVGFyZ2V0KCkgeworLy8vICAgZXh0ZXJuIFRhcmdldCBUaGVGb29UYXJnZXQ7CisvLy8gICBSZWdpc3RlclRhcmdldE1hY2hpbmU8Rm9vVGFyZ2V0TWFjaGluZT4gWChUaGVGb29UYXJnZXQpOworLy8vIH0KK3RlbXBsYXRlIDxjbGFzcyBUYXJnZXRNYWNoaW5lSW1wbD4gc3RydWN0IFJlZ2lzdGVyVGFyZ2V0TWFjaGluZSB7CisgIFJlZ2lzdGVyVGFyZ2V0TWFjaGluZShUYXJnZXQgJlQpIHsKKyAgICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJUYXJnZXRNYWNoaW5lKFQsICZBbGxvY2F0b3IpOworICB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyBUYXJnZXRNYWNoaW5lICoKKyAgQWxsb2NhdG9yKGNvbnN0IFRhcmdldCAmVCwgY29uc3QgVHJpcGxlICZUVCwgU3RyaW5nUmVmIENQVSwgU3RyaW5nUmVmIEZTLAorICAgICAgICAgICAgY29uc3QgVGFyZ2V0T3B0aW9ucyAmT3B0aW9ucywgT3B0aW9uYWw8UmVsb2M6Ok1vZGVsPiBSTSwKKyAgICAgICAgICAgIE9wdGlvbmFsPENvZGVNb2RlbDo6TW9kZWw+IENNLCBDb2RlR2VuT3B0OjpMZXZlbCBPTCwgYm9vbCBKSVQpIHsKKyAgICByZXR1cm4gbmV3IFRhcmdldE1hY2hpbmVJbXBsKFQsIFRULCBDUFUsIEZTLCBPcHRpb25zLCBSTSwgQ00sIE9MLCBKSVQpOworICB9Cit9OworCisvLy8gUmVnaXN0ZXJNQ0FzbUJhY2tlbmQgLSBIZWxwZXIgdGVtcGxhdGUgZm9yIHJlZ2lzdGVyaW5nIGEgdGFyZ2V0IHNwZWNpZmljCisvLy8gYXNzZW1ibGVyIGJhY2tlbmQuIFVzYWdlOgorLy8vCisvLy8gZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplRm9vTUNBc21CYWNrZW5kKCkgeworLy8vICAgZXh0ZXJuIFRhcmdldCBUaGVGb29UYXJnZXQ7CisvLy8gICBSZWdpc3Rlck1DQXNtQmFja2VuZDxGb29Bc21MZXhlcj4gWChUaGVGb29UYXJnZXQpOworLy8vIH0KK3RlbXBsYXRlIDxjbGFzcyBNQ0FzbUJhY2tlbmRJbXBsPiBzdHJ1Y3QgUmVnaXN0ZXJNQ0FzbUJhY2tlbmQgeworICBSZWdpc3Rlck1DQXNtQmFja2VuZChUYXJnZXQgJlQpIHsKKyAgICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJNQ0FzbUJhY2tlbmQoVCwgJkFsbG9jYXRvcik7CisgIH0KKworcHJpdmF0ZToKKyAgc3RhdGljIE1DQXNtQmFja2VuZCAqQWxsb2NhdG9yKGNvbnN0IFRhcmdldCAmVCwgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1JlZ2lzdGVySW5mbyAmTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNUYXJnZXRPcHRpb25zICZPcHRpb25zKSB7CisgICAgcmV0dXJuIG5ldyBNQ0FzbUJhY2tlbmRJbXBsKFQsIFNUSSwgTVJJKTsKKyAgfQorfTsKKworLy8vIFJlZ2lzdGVyTUNBc21QYXJzZXIgLSBIZWxwZXIgdGVtcGxhdGUgZm9yIHJlZ2lzdGVyaW5nIGEgdGFyZ2V0IHNwZWNpZmljCisvLy8gYXNzZW1ibHkgcGFyc2VyLCBmb3IgdXNlIGluIHRoZSB0YXJnZXQgbWFjaGluZSBpbml0aWFsaXphdGlvbgorLy8vIGZ1bmN0aW9uLiBVc2FnZToKKy8vLworLy8vIGV4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUZvb01DQXNtUGFyc2VyKCkgeworLy8vICAgZXh0ZXJuIFRhcmdldCBUaGVGb29UYXJnZXQ7CisvLy8gICBSZWdpc3Rlck1DQXNtUGFyc2VyPEZvb0FzbVBhcnNlcj4gWChUaGVGb29UYXJnZXQpOworLy8vIH0KK3RlbXBsYXRlIDxjbGFzcyBNQ0FzbVBhcnNlckltcGw+IHN0cnVjdCBSZWdpc3Rlck1DQXNtUGFyc2VyIHsKKyAgUmVnaXN0ZXJNQ0FzbVBhcnNlcihUYXJnZXQgJlQpIHsKKyAgICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJNQ0FzbVBhcnNlcihULCAmQWxsb2NhdG9yKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgTUNUYXJnZXRBc21QYXJzZXIgKkFsbG9jYXRvcihjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBc21QYXJzZXIgJlAsIGNvbnN0IE1DSW5zdHJJbmZvICZNSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DVGFyZ2V0T3B0aW9ucyAmT3B0aW9ucykgeworICAgIHJldHVybiBuZXcgTUNBc21QYXJzZXJJbXBsKFNUSSwgUCwgTUlJLCBPcHRpb25zKTsKKyAgfQorfTsKKworLy8vIFJlZ2lzdGVyQXNtUHJpbnRlciAtIEhlbHBlciB0ZW1wbGF0ZSBmb3IgcmVnaXN0ZXJpbmcgYSB0YXJnZXQgc3BlY2lmaWMKKy8vLyBhc3NlbWJseSBwcmludGVyLCBmb3IgdXNlIGluIHRoZSB0YXJnZXQgbWFjaGluZSBpbml0aWFsaXphdGlvbgorLy8vIGZ1bmN0aW9uLiBVc2FnZToKKy8vLworLy8vIGV4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUZvb0FzbVByaW50ZXIoKSB7CisvLy8gICBleHRlcm4gVGFyZ2V0IFRoZUZvb1RhcmdldDsKKy8vLyAgIFJlZ2lzdGVyQXNtUHJpbnRlcjxGb29Bc21QcmludGVyPiBYKFRoZUZvb1RhcmdldCk7CisvLy8gfQordGVtcGxhdGUgPGNsYXNzIEFzbVByaW50ZXJJbXBsPiBzdHJ1Y3QgUmVnaXN0ZXJBc21QcmludGVyIHsKKyAgUmVnaXN0ZXJBc21QcmludGVyKFRhcmdldCAmVCkgeworICAgIFRhcmdldFJlZ2lzdHJ5OjpSZWdpc3RlckFzbVByaW50ZXIoVCwgJkFsbG9jYXRvcik7CisgIH0KKworcHJpdmF0ZToKKyAgc3RhdGljIEFzbVByaW50ZXIgKkFsbG9jYXRvcihUYXJnZXRNYWNoaW5lICZUTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TUNTdHJlYW1lcj4gJiZTdHJlYW1lcikgeworICAgIHJldHVybiBuZXcgQXNtUHJpbnRlckltcGwoVE0sIHN0ZDo6bW92ZShTdHJlYW1lcikpOworICB9Cit9OworCisvLy8gUmVnaXN0ZXJNQ0NvZGVFbWl0dGVyIC0gSGVscGVyIHRlbXBsYXRlIGZvciByZWdpc3RlcmluZyBhIHRhcmdldCBzcGVjaWZpYworLy8vIG1hY2hpbmUgY29kZSBlbWl0dGVyLCBmb3IgdXNlIGluIHRoZSB0YXJnZXQgaW5pdGlhbGl6YXRpb24KKy8vLyBmdW5jdGlvbi4gVXNhZ2U6CisvLy8KKy8vLyBleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVGb29NQ0NvZGVFbWl0dGVyKCkgeworLy8vICAgZXh0ZXJuIFRhcmdldCBUaGVGb29UYXJnZXQ7CisvLy8gICBSZWdpc3Rlck1DQ29kZUVtaXR0ZXI8Rm9vQ29kZUVtaXR0ZXI+IFgoVGhlRm9vVGFyZ2V0KTsKKy8vLyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgTUNDb2RlRW1pdHRlckltcGw+IHN0cnVjdCBSZWdpc3Rlck1DQ29kZUVtaXR0ZXIgeworICBSZWdpc3Rlck1DQ29kZUVtaXR0ZXIoVGFyZ2V0ICZUKSB7CisgICAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyTUNDb2RlRW1pdHRlcihULCAmQWxsb2NhdG9yKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgTUNDb2RlRW1pdHRlciAqQWxsb2NhdG9yKGNvbnN0IE1DSW5zdHJJbmZvICYgLypJSSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICYgLypNUkkqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJiAvKkN0eCovKSB7CisgICAgcmV0dXJuIG5ldyBNQ0NvZGVFbWl0dGVySW1wbCgpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX1RBUkdFVFJFR0lTVFJZX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UYXJnZXRTZWxlY3QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UYXJnZXRTZWxlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODI3ODVjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RhcmdldFNlbGVjdC5oCkBAIC0wLDAgKzEsMTY1IEBACisvLz09PS0gVGFyZ2V0U2VsZWN0LmggLSBUYXJnZXQgU2VsZWN0aW9uICYgUmVnaXN0cmF0aW9uIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyB1dGlsaXRpZXMgdG8gbWFrZSBzdXJlIHRoYXQgY2VydGFpbiBjbGFzc2VzIG9mIHRhcmdldHMgYXJlCisvLyBsaW5rZWQgaW50byB0aGUgbWFpbiBhcHBsaWNhdGlvbiBleGVjdXRhYmxlLCBhbmQgaW5pdGlhbGl6ZSB0aGVtIGFzCisvLyBhcHByb3ByaWF0ZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9UQVJHRVRTRUxFQ1RfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfVEFSR0VUU0VMRUNUX0gKKworI2luY2x1ZGUgImxsdm0vQ29uZmlnL2xsdm0tY29uZmlnLmgiCisKK2V4dGVybiAiQyIgeworICAvLyBEZWNsYXJlIGFsbCBvZiB0aGUgdGFyZ2V0LWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUuCisjZGVmaW5lIExMVk1fVEFSR0VUKFRhcmdldE5hbWUpIHZvaWQgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI1RhcmdldEluZm8oKTsKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9UYXJnZXRzLmRlZiIKKworI2RlZmluZSBMTFZNX1RBUkdFVChUYXJnZXROYW1lKSB2b2lkIExMVk1Jbml0aWFsaXplIyNUYXJnZXROYW1lIyNUYXJnZXQoKTsKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9UYXJnZXRzLmRlZiIKKworICAvLyBEZWNsYXJlIGFsbCBvZiB0aGUgdGFyZ2V0LU1DLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUuCisjZGVmaW5lIExMVk1fVEFSR0VUKFRhcmdldE5hbWUpIHZvaWQgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI1RhcmdldE1DKCk7CisjaW5jbHVkZSAibGx2bS9Db25maWcvVGFyZ2V0cy5kZWYiCisKKyAgLy8gRGVjbGFyZSBhbGwgb2YgdGhlIGF2YWlsYWJsZSBhc3NlbWJseSBwcmludGVyIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucy4KKyNkZWZpbmUgTExWTV9BU01fUFJJTlRFUihUYXJnZXROYW1lKSB2b2lkIExMVk1Jbml0aWFsaXplIyNUYXJnZXROYW1lIyNBc21QcmludGVyKCk7CisjaW5jbHVkZSAibGx2bS9Db25maWcvQXNtUHJpbnRlcnMuZGVmIgorCisgIC8vIERlY2xhcmUgYWxsIG9mIHRoZSBhdmFpbGFibGUgYXNzZW1ibHkgcGFyc2VyIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucy4KKyNkZWZpbmUgTExWTV9BU01fUEFSU0VSKFRhcmdldE5hbWUpIHZvaWQgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI0FzbVBhcnNlcigpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL0FzbVBhcnNlcnMuZGVmIgorCisgIC8vIERlY2xhcmUgYWxsIG9mIHRoZSBhdmFpbGFibGUgZGlzYXNzZW1ibGVyIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucy4KKyNkZWZpbmUgTExWTV9ESVNBU1NFTUJMRVIoVGFyZ2V0TmFtZSkgXAorICB2b2lkIExMVk1Jbml0aWFsaXplIyNUYXJnZXROYW1lIyNEaXNhc3NlbWJsZXIoKTsKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9EaXNhc3NlbWJsZXJzLmRlZiIKK30KKworbmFtZXNwYWNlIGxsdm0geworICAvLy8gSW5pdGlhbGl6ZUFsbFRhcmdldEluZm9zIC0gVGhlIG1haW4gcHJvZ3JhbSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmCisgIC8vLyBpdCB3YW50cyBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSB0YXJnZXRzIHRoYXQgTExWTSBpcyBjb25maWd1cmVkIHRvCisgIC8vLyBzdXBwb3J0LCB0byBtYWtlIHRoZW0gYXZhaWxhYmxlIHZpYSB0aGUgVGFyZ2V0UmVnaXN0cnkuCisgIC8vLworICAvLy8gSXQgaXMgbGVnYWwgZm9yIGEgY2xpZW50IHRvIG1ha2UgbXVsdGlwbGUgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbi4KKyAgaW5saW5lIHZvaWQgSW5pdGlhbGl6ZUFsbFRhcmdldEluZm9zKCkgeworI2RlZmluZSBMTFZNX1RBUkdFVChUYXJnZXROYW1lKSBMTFZNSW5pdGlhbGl6ZSMjVGFyZ2V0TmFtZSMjVGFyZ2V0SW5mbygpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL1RhcmdldHMuZGVmIgorICB9CisKKyAgLy8vIEluaXRpYWxpemVBbGxUYXJnZXRzIC0gVGhlIG1haW4gcHJvZ3JhbSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmIGl0CisgIC8vLyB3YW50cyBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSB0YXJnZXQgbWFjaGluZXMgdGhhdCBMTFZNIGlzIGNvbmZpZ3VyZWQgdG8KKyAgLy8vIHN1cHBvcnQsIHRvIG1ha2UgdGhlbSBhdmFpbGFibGUgdmlhIHRoZSBUYXJnZXRSZWdpc3RyeS4KKyAgLy8vCisgIC8vLyBJdCBpcyBsZWdhbCBmb3IgYSBjbGllbnQgdG8gbWFrZSBtdWx0aXBsZSBjYWxscyB0byB0aGlzIGZ1bmN0aW9uLgorICBpbmxpbmUgdm9pZCBJbml0aWFsaXplQWxsVGFyZ2V0cygpIHsKKyAgICAvLyBGSVhNRTogUmVtb3ZlIHRoaXMsIGNsaWVudHMgc2hvdWxkIGRvIGl0LgorICAgIEluaXRpYWxpemVBbGxUYXJnZXRJbmZvcygpOworCisjZGVmaW5lIExMVk1fVEFSR0VUKFRhcmdldE5hbWUpIExMVk1Jbml0aWFsaXplIyNUYXJnZXROYW1lIyNUYXJnZXQoKTsKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9UYXJnZXRzLmRlZiIKKyAgfQorCisgIC8vLyBJbml0aWFsaXplQWxsVGFyZ2V0TUNzIC0gVGhlIG1haW4gcHJvZ3JhbSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmIGl0CisgIC8vLyB3YW50cyBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSB0YXJnZXQgTUMgdGhhdCBMTFZNIGlzIGNvbmZpZ3VyZWQgdG8KKyAgLy8vIHN1cHBvcnQsIHRvIG1ha2UgdGhlbSBhdmFpbGFibGUgdmlhIHRoZSBUYXJnZXRSZWdpc3RyeS4KKyAgLy8vCisgIC8vLyBJdCBpcyBsZWdhbCBmb3IgYSBjbGllbnQgdG8gbWFrZSBtdWx0aXBsZSBjYWxscyB0byB0aGlzIGZ1bmN0aW9uLgorICBpbmxpbmUgdm9pZCBJbml0aWFsaXplQWxsVGFyZ2V0TUNzKCkgeworI2RlZmluZSBMTFZNX1RBUkdFVChUYXJnZXROYW1lKSBMTFZNSW5pdGlhbGl6ZSMjVGFyZ2V0TmFtZSMjVGFyZ2V0TUMoKTsKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9UYXJnZXRzLmRlZiIKKyAgfQorCisgIC8vLyBJbml0aWFsaXplQWxsQXNtUHJpbnRlcnMgLSBUaGUgbWFpbiBwcm9ncmFtIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gaWYKKyAgLy8vIGl0IHdhbnRzIGFsbCBhc20gcHJpbnRlcnMgdGhhdCBMTFZNIGlzIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCwgdG8gbWFrZSB0aGVtCisgIC8vLyBhdmFpbGFibGUgdmlhIHRoZSBUYXJnZXRSZWdpc3RyeS4KKyAgLy8vCisgIC8vLyBJdCBpcyBsZWdhbCBmb3IgYSBjbGllbnQgdG8gbWFrZSBtdWx0aXBsZSBjYWxscyB0byB0aGlzIGZ1bmN0aW9uLgorICBpbmxpbmUgdm9pZCBJbml0aWFsaXplQWxsQXNtUHJpbnRlcnMoKSB7CisjZGVmaW5lIExMVk1fQVNNX1BSSU5URVIoVGFyZ2V0TmFtZSkgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI0FzbVByaW50ZXIoKTsKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9Bc21QcmludGVycy5kZWYiCisgIH0KKworICAvLy8gSW5pdGlhbGl6ZUFsbEFzbVBhcnNlcnMgLSBUaGUgbWFpbiBwcm9ncmFtIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gaWYgaXQKKyAgLy8vIHdhbnRzIGFsbCBhc20gcGFyc2VycyB0aGF0IExMVk0gaXMgY29uZmlndXJlZCB0byBzdXBwb3J0LCB0byBtYWtlIHRoZW0KKyAgLy8vIGF2YWlsYWJsZSB2aWEgdGhlIFRhcmdldFJlZ2lzdHJ5LgorICAvLy8KKyAgLy8vIEl0IGlzIGxlZ2FsIGZvciBhIGNsaWVudCB0byBtYWtlIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uCisgIGlubGluZSB2b2lkIEluaXRpYWxpemVBbGxBc21QYXJzZXJzKCkgeworI2RlZmluZSBMTFZNX0FTTV9QQVJTRVIoVGFyZ2V0TmFtZSkgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI0FzbVBhcnNlcigpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL0FzbVBhcnNlcnMuZGVmIgorICB9CisKKyAgLy8vIEluaXRpYWxpemVBbGxEaXNhc3NlbWJsZXJzIC0gVGhlIG1haW4gcHJvZ3JhbSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmCisgIC8vLyBpdCB3YW50cyBhbGwgZGlzYXNzZW1ibGVycyB0aGF0IExMVk0gaXMgY29uZmlndXJlZCB0byBzdXBwb3J0LCB0byBtYWtlCisgIC8vLyB0aGVtIGF2YWlsYWJsZSB2aWEgdGhlIFRhcmdldFJlZ2lzdHJ5LgorICAvLy8KKyAgLy8vIEl0IGlzIGxlZ2FsIGZvciBhIGNsaWVudCB0byBtYWtlIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uCisgIGlubGluZSB2b2lkIEluaXRpYWxpemVBbGxEaXNhc3NlbWJsZXJzKCkgeworI2RlZmluZSBMTFZNX0RJU0FTU0VNQkxFUihUYXJnZXROYW1lKSBMTFZNSW5pdGlhbGl6ZSMjVGFyZ2V0TmFtZSMjRGlzYXNzZW1ibGVyKCk7CisjaW5jbHVkZSAibGx2bS9Db25maWcvRGlzYXNzZW1ibGVycy5kZWYiCisgIH0KKworICAvLy8gSW5pdGlhbGl6ZU5hdGl2ZVRhcmdldCAtIFRoZSBtYWluIHByb2dyYW0gc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiB0bworICAvLy8gaW5pdGlhbGl6ZSB0aGUgbmF0aXZlIHRhcmdldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBob3N0LiAgVGhpcyBpcyB1c2VmdWwKKyAgLy8vIGZvciBKSVQgYXBwbGljYXRpb25zIHRvIGVuc3VyZSB0aGF0IHRoZSB0YXJnZXQgZ2V0cyBsaW5rZWQgaW4gY29ycmVjdGx5LgorICAvLy8KKyAgLy8vIEl0IGlzIGxlZ2FsIGZvciBhIGNsaWVudCB0byBtYWtlIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uCisgIGlubGluZSBib29sIEluaXRpYWxpemVOYXRpdmVUYXJnZXQoKSB7CisgIC8vIElmIHdlIGhhdmUgYSBuYXRpdmUgdGFyZ2V0LCBpbml0aWFsaXplIGl0IHRvIGVuc3VyZSBpdCBpcyBsaW5rZWQgaW4uCisjaWZkZWYgTExWTV9OQVRJVkVfVEFSR0VUCisgICAgTExWTV9OQVRJVkVfVEFSR0VUSU5GTygpOworICAgIExMVk1fTkFUSVZFX1RBUkdFVCgpOworICAgIExMVk1fTkFUSVZFX1RBUkdFVE1DKCk7CisgICAgcmV0dXJuIGZhbHNlOworI2Vsc2UKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorICB9CisKKyAgLy8vIEluaXRpYWxpemVOYXRpdmVUYXJnZXRBc21QcmludGVyIC0gVGhlIG1haW4gcHJvZ3JhbSBzaG91bGQgY2FsbAorICAvLy8gdGhpcyBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZSBuYXRpdmUgdGFyZ2V0IGFzbSBwcmludGVyLgorICBpbmxpbmUgYm9vbCBJbml0aWFsaXplTmF0aXZlVGFyZ2V0QXNtUHJpbnRlcigpIHsKKyAgLy8gSWYgd2UgaGF2ZSBhIG5hdGl2ZSB0YXJnZXQsIGluaXRpYWxpemUgdGhlIGNvcnJlc3BvbmRpbmcgYXNtIHByaW50ZXIuCisjaWZkZWYgTExWTV9OQVRJVkVfQVNNUFJJTlRFUgorICAgIExMVk1fTkFUSVZFX0FTTVBSSU5URVIoKTsKKyAgICByZXR1cm4gZmFsc2U7CisjZWxzZQorICAgIHJldHVybiB0cnVlOworI2VuZGlmCisgIH0KKworICAvLy8gSW5pdGlhbGl6ZU5hdGl2ZVRhcmdldEFzbVBhcnNlciAtIFRoZSBtYWluIHByb2dyYW0gc2hvdWxkIGNhbGwKKyAgLy8vIHRoaXMgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSB0aGUgbmF0aXZlIHRhcmdldCBhc20gcGFyc2VyLgorICBpbmxpbmUgYm9vbCBJbml0aWFsaXplTmF0aXZlVGFyZ2V0QXNtUGFyc2VyKCkgeworICAvLyBJZiB3ZSBoYXZlIGEgbmF0aXZlIHRhcmdldCwgaW5pdGlhbGl6ZSB0aGUgY29ycmVzcG9uZGluZyBhc20gcGFyc2VyLgorI2lmZGVmIExMVk1fTkFUSVZFX0FTTVBBUlNFUgorICAgIExMVk1fTkFUSVZFX0FTTVBBUlNFUigpOworICAgIHJldHVybiBmYWxzZTsKKyNlbHNlCisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKKyAgfQorCisgIC8vLyBJbml0aWFsaXplTmF0aXZlVGFyZ2V0RGlzYXNzZW1ibGVyIC0gVGhlIG1haW4gcHJvZ3JhbSBzaG91bGQgY2FsbAorICAvLy8gdGhpcyBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZSBuYXRpdmUgdGFyZ2V0IGRpc2Fzc2VtYmxlci4KKyAgaW5saW5lIGJvb2wgSW5pdGlhbGl6ZU5hdGl2ZVRhcmdldERpc2Fzc2VtYmxlcigpIHsKKyAgLy8gSWYgd2UgaGF2ZSBhIG5hdGl2ZSB0YXJnZXQsIGluaXRpYWxpemUgdGhlIGNvcnJlc3BvbmRpbmcgZGlzYXNzZW1ibGVyLgorI2lmZGVmIExMVk1fTkFUSVZFX0RJU0FTU0VNQkxFUgorICAgIExMVk1fTkFUSVZFX0RJU0FTU0VNQkxFUigpOworICAgIHJldHVybiBmYWxzZTsKKyNlbHNlCisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKKyAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UaHJlYWRMb2NhbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RocmVhZExvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3YTY3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UaHJlYWRMb2NhbC5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvVGhyZWFkTG9jYWwuaCAtIFRocmVhZCBMb2NhbCBEYXRhIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgbGx2bTo6c3lzOjpUaHJlYWRMb2NhbCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9USFJFQURMT0NBTF9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9USFJFQURMT0NBTF9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RocmVhZGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgbmFtZXNwYWNlIHN5cyB7CisgICAgLy8gVGhyZWFkTG9jYWxJbXBsIC0gQ29tbW9uIGJhc2UgY2xhc3Mgb2YgYWxsIFRocmVhZExvY2FsIGluc3RhbnRpYXRpb25zLgorICAgIC8vIFlPVSBTSE9VTEQgTkVWRVIgVVNFIFRISVMgRElSRUNUTFkuCisgICAgY2xhc3MgVGhyZWFkTG9jYWxJbXBsIHsKKyAgICAgIHR5cGVkZWYgdWludDY0X3QgVGhyZWFkTG9jYWxEYXRhVHk7CisgICAgICAvLy8gXGJyaWVmIFBsYXRmb3JtLXNwZWNpZmljIHRocmVhZCBsb2NhbCBkYXRhLgorICAgICAgLy8vCisgICAgICAvLy8gVGhpcyBpcyBlbWJlZGRlZCBpbiB0aGUgY2xhc3MgYW5kIHdlIGF2b2lkIG1hbGxvYydpbmcvZnJlZSdpbmcgaXQsCisgICAgICAvLy8gdG8gbWFrZSB0aGlzIGNsYXNzIG1vcmUgc2FmZSBmb3IgdXNlIGFsb25nIHdpdGggQ3Jhc2hSZWNvdmVyeUNvbnRleHQuCisgICAgICB1bmlvbiB7CisgICAgICAgIGNoYXIgZGF0YVtzaXplb2YoVGhyZWFkTG9jYWxEYXRhVHkpXTsKKyAgICAgICAgVGhyZWFkTG9jYWxEYXRhVHkgYWxpZ25fZGF0YTsKKyAgICAgIH07CisgICAgcHVibGljOgorICAgICAgVGhyZWFkTG9jYWxJbXBsKCk7CisgICAgICB2aXJ0dWFsIH5UaHJlYWRMb2NhbEltcGwoKTsKKyAgICAgIHZvaWQgc2V0SW5zdGFuY2UoY29uc3Qgdm9pZCogZCk7CisgICAgICB2b2lkICpnZXRJbnN0YW5jZSgpOworICAgICAgdm9pZCByZW1vdmVJbnN0YW5jZSgpOworICAgIH07CisKKyAgICAvLy8gVGhyZWFkTG9jYWwgLSBBIGNsYXNzIHVzZWQgdG8gYWJzdHJhY3QgdGhyZWFkLWxvY2FsIHN0b3JhZ2UuICBJdCBob2xkcywKKyAgICAvLy8gZm9yIGVhY2ggdGhyZWFkLCBhIHBvaW50ZXIgYSBzaW5nbGUgb2JqZWN0IG9mIHR5cGUgVC4KKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIGNsYXNzIFRocmVhZExvY2FsIDogcHVibGljIFRocmVhZExvY2FsSW1wbCB7CisgICAgcHVibGljOgorICAgICAgVGhyZWFkTG9jYWwoKSA6IFRocmVhZExvY2FsSW1wbCgpIHsgfQorCisgICAgICAvLy8gZ2V0IC0gRmV0Y2hlcyBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQKKyAgICAgIC8vLyB0aHJlYWQuICBJZiBubyBvYmplY3QgaGFzIHlldCBiZWVuIGFzc29jaWF0ZWQsIGl0IHJldHVybnMgTlVMTDsKKyAgICAgIFQqIGdldCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihnZXRJbnN0YW5jZSgpKTsgfQorCisgICAgICAvLyBzZXQgLSBBc3NvY2lhdGVzIGEgcG9pbnRlciB0byBhbiBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCB0aHJlYWQuCisgICAgICB2b2lkIHNldChUKiBkKSB7IHNldEluc3RhbmNlKGQpOyB9CisKKyAgICAgIC8vIGVyYXNlIC0gUmVtb3ZlcyB0aGUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgICAgdm9pZCBlcmFzZSgpIHsgcmVtb3ZlSW5zdGFuY2UoKTsgfQorICAgIH07CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGhyZWFkUG9vbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RocmVhZFBvb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjgyNTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RocmVhZFBvb2wuaApAQCAtMCwwICsxLDEwMCBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvVGhyZWFkUG9vbC5oIC0gQSBUaHJlYWRQb29sIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIGNydWRlIEMrKzExIGJhc2VkIHRocmVhZCBwb29sLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1RIUkVBRF9QT09MX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1RIUkVBRF9QT09MX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC90aHJlYWQuaCIKKworI2luY2x1ZGUgPGZ1dHVyZT4KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQSBUaHJlYWRQb29sIGZvciBhc3luY2hyb25vdXMgcGFyYWxsZWwgZXhlY3V0aW9uIG9uIGEgZGVmaW5lZCBudW1iZXIgb2YKKy8vLyB0aHJlYWRzLgorLy8vCisvLy8gVGhlIHBvb2wga2VlcHMgYSB2ZWN0b3Igb2YgdGhyZWFkcyBhbGl2ZSwgd2FpdGluZyBvbiBhIGNvbmRpdGlvbiB2YXJpYWJsZQorLy8vIGZvciBzb21lIHdvcmsgdG8gYmVjb21lIGF2YWlsYWJsZS4KK2NsYXNzIFRocmVhZFBvb2wgeworcHVibGljOgorICB1c2luZyBUYXNrVHkgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT47CisgIHVzaW5nIFBhY2thZ2VkVGFza1R5ID0gc3RkOjpwYWNrYWdlZF90YXNrPHZvaWQoKT47CisKKyAgLy8vIENvbnN0cnVjdCBhIHBvb2wgd2l0aCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgZm91bmQgYnkKKyAgLy8vIGhhcmR3YXJlX2NvbmN1cnJlbmN5KCkuCisgIFRocmVhZFBvb2woKTsKKworICAvLy8gQ29uc3RydWN0IGEgcG9vbCBvZiBccCBUaHJlYWRDb3VudCB0aHJlYWRzCisgIFRocmVhZFBvb2wodW5zaWduZWQgVGhyZWFkQ291bnQpOworCisgIC8vLyBCbG9ja2luZyBkZXN0cnVjdG9yOiB0aGUgcG9vbCB3aWxsIHdhaXQgZm9yIGFsbCB0aGUgdGhyZWFkcyB0byBjb21wbGV0ZS4KKyAgflRocmVhZFBvb2woKTsKKworICAvLy8gQXN5bmNocm9ub3VzIHN1Ym1pc3Npb24gb2YgYSB0YXNrIHRvIHRoZSBwb29sLiBUaGUgcmV0dXJuZWQgZnV0dXJlIGNhbiBiZQorICAvLy8gdXNlZCB0byB3YWl0IGZvciB0aGUgdGFzayB0byBmaW5pc2ggYW5kIGlzICpub24tYmxvY2tpbmcqIG9uIGRlc3RydWN0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lLi4uIEFyZ3M+CisgIGlubGluZSBzdGQ6OnNoYXJlZF9mdXR1cmU8dm9pZD4gYXN5bmMoRnVuY3Rpb24gJiZGLCBBcmdzICYmLi4uIEFyZ0xpc3QpIHsKKyAgICBhdXRvIFRhc2sgPQorICAgICAgICBzdGQ6OmJpbmQoc3RkOjpmb3J3YXJkPEZ1bmN0aW9uPihGKSwgc3RkOjpmb3J3YXJkPEFyZ3M+KEFyZ0xpc3QpLi4uKTsKKyAgICByZXR1cm4gYXN5bmNJbXBsKHN0ZDo6bW92ZShUYXNrKSk7CisgIH0KKworICAvLy8gQXN5bmNocm9ub3VzIHN1Ym1pc3Npb24gb2YgYSB0YXNrIHRvIHRoZSBwb29sLiBUaGUgcmV0dXJuZWQgZnV0dXJlIGNhbiBiZQorICAvLy8gdXNlZCB0byB3YWl0IGZvciB0aGUgdGFzayB0byBmaW5pc2ggYW5kIGlzICpub24tYmxvY2tpbmcqIG9uIGRlc3RydWN0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+CisgIGlubGluZSBzdGQ6OnNoYXJlZF9mdXR1cmU8dm9pZD4gYXN5bmMoRnVuY3Rpb24gJiZGKSB7CisgICAgcmV0dXJuIGFzeW5jSW1wbChzdGQ6OmZvcndhcmQ8RnVuY3Rpb24+KEYpKTsKKyAgfQorCisgIC8vLyBCbG9ja2luZyB3YWl0IGZvciBhbGwgdGhlIHRocmVhZHMgdG8gY29tcGxldGUgYW5kIHRoZSBxdWV1ZSB0byBiZSBlbXB0eS4KKyAgLy8vIEl0IGlzIGFuIGVycm9yIHRvIHRyeSB0byBhZGQgbmV3IHRhc2tzIHdoaWxlIGJsb2NraW5nIG9uIHRoaXMgY2FsbC4KKyAgdm9pZCB3YWl0KCk7CisKK3ByaXZhdGU6CisgIC8vLyBBc3luY2hyb25vdXMgc3VibWlzc2lvbiBvZiBhIHRhc2sgdG8gdGhlIHBvb2wuIFRoZSByZXR1cm5lZCBmdXR1cmUgY2FuIGJlCisgIC8vLyB1c2VkIHRvIHdhaXQgZm9yIHRoZSB0YXNrIHRvIGZpbmlzaCBhbmQgaXMgKm5vbi1ibG9ja2luZyogb24gZGVzdHJ1Y3Rpb24uCisgIHN0ZDo6c2hhcmVkX2Z1dHVyZTx2b2lkPiBhc3luY0ltcGwoVGFza1R5IEYpOworCisgIC8vLyBUaHJlYWRzIGluIGZsaWdodAorICBzdGQ6OnZlY3RvcjxsbHZtOjp0aHJlYWQ+IFRocmVhZHM7CisKKyAgLy8vIFRhc2tzIHdhaXRpbmcgZm9yIGV4ZWN1dGlvbiBpbiB0aGUgcG9vbC4KKyAgc3RkOjpxdWV1ZTxQYWNrYWdlZFRhc2tUeT4gVGFza3M7CisKKyAgLy8vIExvY2tpbmcgYW5kIHNpZ25hbGluZyBmb3IgYWNjZXNzaW5nIHRoZSBUYXNrcyBxdWV1ZS4KKyAgc3RkOjptdXRleCBRdWV1ZUxvY2s7CisgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIFF1ZXVlQ29uZGl0aW9uOworCisgIC8vLyBMb2NraW5nIGFuZCBzaWduYWxpbmcgZm9yIGpvYiBjb21wbGV0aW9uCisgIHN0ZDo6bXV0ZXggQ29tcGxldGlvbkxvY2s7CisgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIENvbXBsZXRpb25Db25kaXRpb247CisKKyAgLy8vIEtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiB0aHJlYWQgYWN0dWFsbHkgYnVzeQorICBzdGQ6OmF0b21pYzx1bnNpZ25lZD4gQWN0aXZlVGhyZWFkczsKKworI2lmIExMVk1fRU5BQkxFX1RIUkVBRFMgLy8gYXZvaWRzIHdhcm5pbmcgZm9yIHVudXNlZCB2YXJpYWJsZQorICAvLy8gU2lnbmFsIGZvciB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhlIHBvb2wsIGFza2luZyB0aHJlYWQgdG8gZXhpdC4KKyAgYm9vbCBFbmFibGVGbGFnOworI2VuZGlmCit9OworfQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX1RIUkVBRF9QT09MX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UaHJlYWRpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UaHJlYWRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDgxM2JjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RocmVhZGluZy5oCkBAIC0wLDAgKzEsMTY5IEBACisvLz09PS0tIGxsdm0vU3VwcG9ydC9UaHJlYWRpbmcuaCAtIENvbnRyb2wgbXVsdGl0aHJlYWRpbmcgbW9kZSAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBydW5uaW5nIExMVk0gaW4gYSBtdWx0aS10aHJlYWRlZAorLy8gZW52aXJvbm1lbnQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfVEhSRUFESU5HX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1RIUkVBRElOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29uZmlnL2xsdm0tY29uZmlnLmgiIC8vIGZvciBMTFZNX09OX1VOSVgKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlIDxjaXNvNjQ2PiAvLyBTbyB3ZSBjYW4gY2hlY2sgdGhlIEMrKyBzdGFuZGFyZCBsaWIgbWFjcm9zLgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorLy8gTVNWQydzIGNhbGxfb25jZSBpbXBsZW1lbnRhdGlvbiB3b3JrZWQgc2luY2UgVlMgMjAxNSwgd2hpY2ggaXMgdGhlIG1pbmltdW0KKy8vIHN1cHBvcnRlZCB2ZXJzaW9uIGFzIG9mIHRoaXMgd3JpdGluZy4KKyNkZWZpbmUgTExWTV9USFJFQURJTkdfVVNFX1NURF9DQUxMX09OQ0UgMQorI2VsaWYgZGVmaW5lZChMTFZNX09OX1VOSVgpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoZGVmaW5lZChfTElCQ1BQX1ZFUlNJT04pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICEoZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkKF9fcHBjX18pKSkKKy8vIHN0ZDo6Y2FsbF9vbmNlIGZyb20gbGliYysrIGlzIHVzZWQgb24gYWxsIFVuaXggcGxhdGZvcm1zLiBPdGhlcgorLy8gaW1wbGVtZW50YXRpb25zIGxpa2UgbGlic3RkYysrIGFyZSBrbm93biB0byBoYXZlIHByb2JsZW1zIG9uIE5ldEJTRCwKKy8vIE9wZW5CU0QgYW5kIFBvd2VyUEMuCisjZGVmaW5lIExMVk1fVEhSRUFESU5HX1VTRV9TVERfQ0FMTF9PTkNFIDEKKyNlbHNlCisjZGVmaW5lIExMVk1fVEhSRUFESU5HX1VTRV9TVERfQ0FMTF9PTkNFIDAKKyNlbmRpZgorCisjaWYgTExWTV9USFJFQURJTkdfVVNFX1NURF9DQUxMX09OQ0UKKyNpbmNsdWRlIDxtdXRleD4KKyNlbHNlCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0F0b21pYy5oIgorI2VuZGlmCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFR3aW5lOworCisvLy8gUmV0dXJucyB0cnVlIGlmIExMVk0gaXMgY29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBtdWx0aS10aHJlYWRpbmcsIGFuZAorLy8vIGZhbHNlIG90aGVyd2lzZS4KK2Jvb2wgbGx2bV9pc19tdWx0aXRocmVhZGVkKCk7CisKKy8vLyBsbHZtX2V4ZWN1dGVfb25fdGhyZWFkIC0gRXhlY3V0ZSB0aGUgZ2l2ZW4gXHAgVXNlckZuIG9uIGEgc2VwYXJhdGUKKy8vLyB0aHJlYWQsIHBhc3NpbmcgaXQgdGhlIHByb3ZpZGVkIFxwIFVzZXJEYXRhIGFuZCB3YWl0cyBmb3IgdGhyZWFkCisvLy8gY29tcGxldGlvbi4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIGNvZGUgd2lsbCBhY3R1YWxseSBiZSBleGVjdXRlZAorLy8vIG9uIGEgc2VwYXJhdGUgdGhyZWFkIG9yIGhvbm9yaW5nIHRoZSByZXF1ZXN0ZWQgc3RhY2sgc2l6ZSwgYnV0IHRyaWVzIHRvIGRvCisvLy8gc28gd2hlcmUgc3lzdGVtIHN1cHBvcnQgaXMgYXZhaWxhYmxlLgorLy8vCisvLy8gXHBhcmFtIFVzZXJGbiAtIFRoZSBjYWxsYmFjayB0byBleGVjdXRlLgorLy8vIFxwYXJhbSBVc2VyRGF0YSAtIEFuIGFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLgorLy8vIFxwYXJhbSBSZXF1ZXN0ZWRTdGFja1NpemUgLSBJZiBub24temVybywgYSByZXF1ZXN0ZWQgc2l6ZSAoaW4gYnl0ZXMpIGZvcgorLy8vIHRoZSB0aHJlYWQgc3RhY2suCit2b2lkIGxsdm1fZXhlY3V0ZV9vbl90aHJlYWQodm9pZCAoKlVzZXJGbikodm9pZCAqKSwgdm9pZCAqVXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVxdWVzdGVkU3RhY2tTaXplID0gMCk7CisKKyNpZiBMTFZNX1RIUkVBRElOR19VU0VfU1REX0NBTExfT05DRQorCisgIHR5cGVkZWYgc3RkOjpvbmNlX2ZsYWcgb25jZV9mbGFnOworCisjZWxzZQorCisgIGVudW0gSW5pdFN0YXR1cyB7IFVuaW5pdGlhbGl6ZWQgPSAwLCBXYWl0ID0gMSwgRG9uZSA9IDIgfTsKKworICAvLy8gXGJyaWVmIFRoZSBsbHZtOjpvbmNlX2ZsYWcgc3RydWN0dXJlCisgIC8vLworICAvLy8gVGhpcyB0eXBlIGlzIG1vZGVsZWQgYWZ0ZXIgc3RkOjpvbmNlX2ZsYWcgdG8gdXNlIHdpdGggbGx2bTo6Y2FsbF9vbmNlLgorICAvLy8gVGhpcyBzdHJ1Y3R1cmUgbXVzdCBiZSB1c2VkIGFzIGFuIG9wYXF1ZSBvYmplY3QuIEl0IGlzIGEgc3RydWN0IHRvIGZvcmNlCisgIC8vLyBhdXRvaW5pdGlhbGl6YXRpb24gYW5kIGJlaGF2ZSBsaWtlIHN0ZDo6b25jZV9mbGFnLgorICBzdHJ1Y3Qgb25jZV9mbGFnIHsKKyAgICB2b2xhdGlsZSBzeXM6OmNhc19mbGFnIHN0YXR1cyA9IFVuaW5pdGlhbGl6ZWQ7CisgIH07CisKKyNlbmRpZgorCisgIC8vLyBcYnJpZWYgRXhlY3V0ZSB0aGUgZnVuY3Rpb24gc3BlY2lmaWVkIGFzIGEgcGFyYW1ldGVyIG9uY2UuCisgIC8vLworICAvLy8gVHlwaWNhbCB1c2FnZToKKyAgLy8vIFxjb2RlCisgIC8vLyAgIHZvaWQgZm9vKCkgey4uLn07CisgIC8vLyAgIC4uLgorICAvLy8gICBzdGF0aWMgb25jZV9mbGFnIGZsYWc7CisgIC8vLyAgIGNhbGxfb25jZShmbGFnLCBmb28pOworICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBccGFyYW0gZmxhZyBGbGFnIHVzZWQgZm9yIHRyYWNraW5nIHdoZXRoZXIgb3Igbm90IHRoaXMgaGFzIHJ1bi4KKyAgLy8vIFxwYXJhbSBGIEZ1bmN0aW9uIHRvIGNhbGwgb25jZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZS4uLiBBcmdzPgorICB2b2lkIGNhbGxfb25jZShvbmNlX2ZsYWcgJmZsYWcsIEZ1bmN0aW9uICYmRiwgQXJncyAmJi4uLiBBcmdMaXN0KSB7CisjaWYgTExWTV9USFJFQURJTkdfVVNFX1NURF9DQUxMX09OQ0UKKyAgICBzdGQ6OmNhbGxfb25jZShmbGFnLCBzdGQ6OmZvcndhcmQ8RnVuY3Rpb24+KEYpLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxBcmdzPihBcmdMaXN0KS4uLik7CisjZWxzZQorICAgIC8vIEZvciBvdGhlciBwbGF0Zm9ybXMgd2UgdXNlIGEgZ2VuZXJpYyAoaWYgYnJpdHRsZSkgdmVyc2lvbiBiYXNlZCBvbiBvdXIKKyAgICAvLyBhdG9taWNzLgorICAgIHN5czo6Y2FzX2ZsYWcgb2xkX3ZhbCA9IHN5czo6Q29tcGFyZUFuZFN3YXAoJmZsYWcuc3RhdHVzLCBXYWl0LCBVbmluaXRpYWxpemVkKTsKKyAgICBpZiAob2xkX3ZhbCA9PSBVbmluaXRpYWxpemVkKSB7CisgICAgICBzdGQ6OmZvcndhcmQ8RnVuY3Rpb24+KEYpKHN0ZDo6Zm9yd2FyZDxBcmdzPihBcmdMaXN0KS4uLik7CisgICAgICBzeXM6Ok1lbW9yeUZlbmNlKCk7CisgICAgICBUc2FuSWdub3JlV3JpdGVzQmVnaW4oKTsKKyAgICAgIFRzYW5IYXBwZW5zQmVmb3JlKCZmbGFnLnN0YXR1cyk7CisgICAgICBmbGFnLnN0YXR1cyA9IERvbmU7CisgICAgICBUc2FuSWdub3JlV3JpdGVzRW5kKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdhaXQgdW50aWwgYW55IHRocmVhZCBkb2luZyB0aGUgY2FsbCBoYXMgZmluaXNoZWQuCisgICAgICBzeXM6OmNhc19mbGFnIHRtcCA9IGZsYWcuc3RhdHVzOworICAgICAgc3lzOjpNZW1vcnlGZW5jZSgpOworICAgICAgd2hpbGUgKHRtcCAhPSBEb25lKSB7CisgICAgICAgIHRtcCA9IGZsYWcuc3RhdHVzOworICAgICAgICBzeXM6Ok1lbW9yeUZlbmNlKCk7CisgICAgICB9CisgICAgfQorICAgIFRzYW5IYXBwZW5zQWZ0ZXIoJmZsYWcuc3RhdHVzKTsKKyNlbmRpZgorICB9CisKKyAgLy8vIEdldCB0aGUgYW1vdW50IG9mIGN1cnJlbmN5IHRvIHVzZSBmb3IgdGFza3MgcmVxdWlyaW5nIHNpZ25pZmljYW50CisgIC8vLyBtZW1vcnkgb3Igb3RoZXIgcmVzb3VyY2VzLiBDdXJyZW50bHkgYmFzZWQgb24gcGh5c2ljYWwgY29yZXMsIGlmCisgIC8vLyBhdmFpbGFibGUgZm9yIHRoZSBob3N0IHN5c3RlbSwgb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8KKyAgLy8vIHRocmVhZDo6aGFyZHdhcmVfY29uY3VycmVuY3koKS4KKyAgLy8vIFJldHVybnMgMSB3aGVuIExMVk0gaXMgY29uZmlndXJlZCB3aXRoIExMVk1fRU5BQkxFX1RIUkVBRFM9T0ZGCisgIHVuc2lnbmVkIGhlYXZ5d2VpZ2h0X2hhcmR3YXJlX2NvbmN1cnJlbmN5KCk7CisKKyAgLy8vIEdldCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdGhhdCB0aGUgY3VycmVudCBwcm9ncmFtIGNhbiBleGVjdXRlCisgIC8vLyBjb25jdXJyZW50bHkuIE9uIHNvbWUgc3lzdGVtcyBzdGQ6OnRocmVhZDo6aGFyZHdhcmVfY29uY3VycmVuY3koKSByZXR1cm5zCisgIC8vLyB0aGUgdG90YWwgbnVtYmVyIG9mIGNvcmVzLCB3aXRob3V0IHRha2luZyBhZmZpbml0eSBpbnRvIGNvbnNpZGVyYXRpb24uCisgIC8vLyBSZXR1cm5zIDEgd2hlbiBMTFZNIGlzIGNvbmZpZ3VyZWQgd2l0aCBMTFZNX0VOQUJMRV9USFJFQURTPU9GRi4KKyAgLy8vIEZhbGxiYWNrIHRvIHN0ZDo6dGhyZWFkOjpoYXJkd2FyZV9jb25jdXJyZW5jeSgpIGlmIHNjaGVkX2dldGFmZmluaXR5IGlzCisgIC8vLyBub3QgYXZhaWxhYmxlLgorICB1bnNpZ25lZCBoYXJkd2FyZV9jb25jdXJyZW5jeSgpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCBpZCwgYXMgdXNlZCBpbiB2YXJpb3VzIE9TIHN5c3RlbSBjYWxscy4KKyAgLy8vIE5vdGUgdGhhdCBub3QgYWxsIHBsYXRmb3JtcyBndWFyYW50ZWUgdGhhdCB0aGUgdmFsdWUgcmV0dXJuZWQgd2lsbCBiZQorICAvLy8gdW5pcXVlIGFjcm9zcyB0aGUgZW50aXJlIHN5c3RlbSwgc28gcG9ydGFibGUgY29kZSBzaG91bGQgbm90IGFzc3VtZQorICAvLy8gdGhpcy4KKyAgdWludDY0X3QgZ2V0X3RocmVhZGlkKCk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgdGhyZWFkIG5hbWUgb24gdGhpcyBwbGF0Zm9ybS4KKyAgLy8vIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubyBsaW1pdC4KKyAgdWludDMyX3QgZ2V0X21heF90aHJlYWRfbmFtZV9sZW5ndGgoKTsKKworICAvLy8gXGJyaWVmIFNldCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0aHJlYWQuICBTZXR0aW5nIGEgdGhyZWFkJ3MgbmFtZSBjYW4KKyAgLy8vIGJlIGhlbHBmdWwgZm9yIGVuYWJsaW5nIHVzZWZ1bCBkaWFnbm9zdGljcyB1bmRlciBhIGRlYnVnZ2VyIG9yIHdoZW4KKyAgLy8vIGxvZ2dpbmcuICBUaGUgbGV2ZWwgb2Ygc3VwcG9ydCBmb3Igc2V0dGluZyBhIHRocmVhZCdzIG5hbWUgdmFyaWVzCisgIC8vLyB3aWxkbHkgYWNyb3NzIG9wZXJhdGluZyBzeXN0ZW1zLCBhbmQgd2Ugb25seSBtYWtlIGEgYmVzdCBlZmZvcnQgdG8KKyAgLy8vIHBlcmZvcm0gdGhlIG9wZXJhdGlvbiBvbiBzdXBwb3J0ZWQgcGxhdGZvcm1zLiAgTm8gaW5kaWNhdGlvbiBvZiBzdWNjZXNzCisgIC8vLyBvciBmYWlsdXJlIGlzIHJldHVybmVkLgorICB2b2lkIHNldF90aHJlYWRfbmFtZShjb25zdCBUd2luZSAmTmFtZSk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGhyZWFkLiAgVGhlIGxldmVsIG9mIHN1cHBvcnQgZm9yCisgIC8vLyBnZXR0aW5nIGEgdGhyZWFkJ3MgbmFtZSB2YXJpZXMgd2lsZGx5IGFjcm9zcyBvcGVyYXRpbmcgc3lzdGVtcywgYW5kIGl0CisgIC8vLyBpcyBub3QgZXZlbiBndWFyYW50ZWVkIHRoYXQgaWYgeW91IGNhbiBzdWNjZXNzZnVsbHkgc2V0IGEgdGhyZWFkJ3MgbmFtZQorICAvLy8gdGhhdCB5b3UgY2FuIGxhdGVyIGdldCBpdCBiYWNrLiAgVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IgZGlhZ25vc3RpYworICAvLy8gcHVycG9zZXMsIGFuZCBhcyB3aXRoIHNldHRpbmcgYSB0aHJlYWQncyBuYW1lIG5vIGluZGljYXRpb24gb2Ygd2hldGhlcgorICAvLy8gdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IgZmFpbGVkIGlzIHJldHVybmVkLgorICB2b2lkIGdldF90aHJlYWRfbmFtZShTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk5hbWUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UaW1lci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk4ODU1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UaW1lci5oCkBAIC0wLDAgKzEsMjMxIEBACisvLz09PS0tIGxsdm0vU3VwcG9ydC9UaW1lci5oIC0gSW50ZXJ2YWwgVGltaW5nIFN1cHBvcnQgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9USU1FUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9USU1FUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVGltZXI7CitjbGFzcyBUaW1lckdyb3VwOworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIFRpbWVSZWNvcmQgeworICBkb3VibGUgV2FsbFRpbWU7ICAgICAgIC8vLzwgV2FsbCBjbG9jayB0aW1lIGVsYXBzZWQgaW4gc2Vjb25kcy4KKyAgZG91YmxlIFVzZXJUaW1lOyAgICAgICAvLy88IFVzZXIgdGltZSBlbGFwc2VkLgorICBkb3VibGUgU3lzdGVtVGltZTsgICAgIC8vLzwgU3lzdGVtIHRpbWUgZWxhcHNlZC4KKyAgc3NpemVfdCBNZW1Vc2VkOyAgICAgICAvLy88IE1lbW9yeSBhbGxvY2F0ZWQgKGluIGJ5dGVzKS4KK3B1YmxpYzoKKyAgVGltZVJlY29yZCgpIDogV2FsbFRpbWUoMCksIFVzZXJUaW1lKDApLCBTeXN0ZW1UaW1lKDApLCBNZW1Vc2VkKDApIHt9CisKKyAgLy8vIEdldCB0aGUgY3VycmVudCB0aW1lIGFuZCBtZW1vcnkgdXNhZ2UuICBJZiBTdGFydCBpcyB0cnVlIHdlIGdldCB0aGUgbWVtb3J5CisgIC8vLyB1c2FnZSBiZWZvcmUgdGhlIHRpbWUsIG90aGVyd2lzZSB3ZSBnZXQgdGltZSBiZWZvcmUgbWVtb3J5IHVzYWdlLiAgVGhpcworICAvLy8gbWF0dGVycyBpZiB0aGUgdGltZSB0byBnZXQgdGhlIG1lbW9yeSB1c2FnZSBpcyBzaWduaWZpY2FudCBhbmQgc2hvdWxkbid0CisgIC8vLyBiZSBjb3VudGVkIGFzIHBhcnQgb2YgYSBkdXJhdGlvbi4KKyAgc3RhdGljIFRpbWVSZWNvcmQgZ2V0Q3VycmVudFRpbWUoYm9vbCBTdGFydCA9IHRydWUpOworCisgIGRvdWJsZSBnZXRQcm9jZXNzVGltZSgpIGNvbnN0IHsgcmV0dXJuIFVzZXJUaW1lICsgU3lzdGVtVGltZTsgfQorICBkb3VibGUgZ2V0VXNlclRpbWUoKSBjb25zdCB7IHJldHVybiBVc2VyVGltZTsgfQorICBkb3VibGUgZ2V0U3lzdGVtVGltZSgpIGNvbnN0IHsgcmV0dXJuIFN5c3RlbVRpbWU7IH0KKyAgZG91YmxlIGdldFdhbGxUaW1lKCkgY29uc3QgeyByZXR1cm4gV2FsbFRpbWU7IH0KKyAgc3NpemVfdCBnZXRNZW1Vc2VkKCkgY29uc3QgeyByZXR1cm4gTWVtVXNlZDsgfQorCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFRpbWVSZWNvcmQgJlQpIGNvbnN0IHsKKyAgICAvLyBTb3J0IGJ5IFdhbGwgVGltZSBlbGFwc2VkLCBhcyBpdCBpcyB0aGUgb25seSB0aGluZyByZWFsbHkgYWNjdXJhdGUKKyAgICByZXR1cm4gV2FsbFRpbWUgPCBULldhbGxUaW1lOworICB9CisKKyAgdm9pZCBvcGVyYXRvcis9KGNvbnN0IFRpbWVSZWNvcmQgJlJIUykgeworICAgIFdhbGxUaW1lICAgKz0gUkhTLldhbGxUaW1lOworICAgIFVzZXJUaW1lICAgKz0gUkhTLlVzZXJUaW1lOworICAgIFN5c3RlbVRpbWUgKz0gUkhTLlN5c3RlbVRpbWU7CisgICAgTWVtVXNlZCAgICArPSBSSFMuTWVtVXNlZDsKKyAgfQorICB2b2lkIG9wZXJhdG9yLT0oY29uc3QgVGltZVJlY29yZCAmUkhTKSB7CisgICAgV2FsbFRpbWUgICAtPSBSSFMuV2FsbFRpbWU7CisgICAgVXNlclRpbWUgICAtPSBSSFMuVXNlclRpbWU7CisgICAgU3lzdGVtVGltZSAtPSBSSFMuU3lzdGVtVGltZTsKKyAgICBNZW1Vc2VkICAgIC09IFJIUy5NZW1Vc2VkOworICB9CisKKyAgLy8vIFByaW50IHRoZSBjdXJyZW50IHRpbWUgcmVjb3JkIHRvIFxwIE9TLCB3aXRoIGEgYnJlYWtkb3duIHNob3dpbmcKKyAgLy8vIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIFxwIFRvdGFsIHRpbWUgcmVjb3JkLgorICB2b2lkIHByaW50KGNvbnN0IFRpbWVSZWNvcmQgJlRvdGFsLCByYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworfTsKKworLy8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byB0cmFjayB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgYmV0d2VlbiBpbnZvY2F0aW9ucyBvZgorLy8vIGl0cyBzdGFydFRpbWVyKCkvc3RvcFRpbWVyKCkgbWV0aG9kcy4gIEdpdmVuIGFwcHJvcHJpYXRlIE9TIHN1cHBvcnQgaXQgY2FuCisvLy8gYWxzbyBrZWVwIHRyYWNrIG9mIHRoZSBSU1Mgb2YgdGhlIHByb2dyYW0gYXQgdmFyaW91cyBwb2ludHMuICBCeSBkZWZhdWx0LAorLy8vIHRoZSBUaW1lciB3aWxsIHByaW50IHRoZSBhbW91bnQgb2YgdGltZSBpdCBoYXMgY2FwdHVyZWQgdG8gc3RhbmRhcmQgZXJyb3IKKy8vLyB3aGVuIHRoZSBsYXN0IHRpbWVyIGlzIGRlc3Ryb3llZCwgb3RoZXJ3aXNlIGl0IGlzIHByaW50ZWQgd2hlbiBpdHMKKy8vLyBUaW1lckdyb3VwIGlzIGRlc3Ryb3llZC4gIFRpbWVycyBkbyBub3QgcHJpbnQgdGhlaXIgaW5mb3JtYXRpb24gaWYgdGhleSBhcmUKKy8vLyBuZXZlciBzdGFydGVkLgorY2xhc3MgVGltZXIgeworICBUaW1lUmVjb3JkIFRpbWU7ICAgICAgICAgIC8vLzwgVGhlIHRvdGFsIHRpbWUgY2FwdHVyZWQuCisgIFRpbWVSZWNvcmQgU3RhcnRUaW1lOyAgICAgLy8vPCBUaGUgdGltZSBzdGFydFRpbWVyKCkgd2FzIGxhc3QgY2FsbGVkLgorICBzdGQ6OnN0cmluZyBOYW1lOyAgICAgICAgIC8vLzwgVGhlIG5hbWUgb2YgdGhpcyB0aW1lIHZhcmlhYmxlLgorICBzdGQ6OnN0cmluZyBEZXNjcmlwdGlvbjsgIC8vLzwgRGVzY3JpcHRpb24gb2YgdGhpcyB0aW1lIHZhcmlhYmxlLgorICBib29sIFJ1bm5pbmc7ICAgICAgICAgICAgIC8vLzwgSXMgdGhlIHRpbWVyIGN1cnJlbnRseSBydW5uaW5nPworICBib29sIFRyaWdnZXJlZDsgICAgICAgICAgIC8vLzwgSGFzIHRoZSB0aW1lciBldmVyIGJlZW4gdHJpZ2dlcmVkPworICBUaW1lckdyb3VwICpURyA9IG51bGxwdHI7IC8vLzwgVGhlIFRpbWVyR3JvdXAgdGhpcyBUaW1lciBpcyBpbi4KKworICBUaW1lciAqKlByZXY7ICAgICAgICAgICAgIC8vLzwgUG9pbnRlciB0byBccCBOZXh0IG9mIHByZXZpb3VzIHRpbWVyIGluIGdyb3VwLgorICBUaW1lciAqTmV4dDsgICAgICAgICAgICAgIC8vLzwgTmV4dCB0aW1lciBpbiB0aGUgZ3JvdXAuCitwdWJsaWM6CisgIGV4cGxpY2l0IFRpbWVyKFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgRGVzY3JpcHRpb24pIHsKKyAgICBpbml0KE5hbWUsIERlc2NyaXB0aW9uKTsKKyAgfQorICBUaW1lcihTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIERlc2NyaXB0aW9uLCBUaW1lckdyb3VwICZ0ZykgeworICAgIGluaXQoTmFtZSwgRGVzY3JpcHRpb24sIHRnKTsKKyAgfQorICBUaW1lcihjb25zdCBUaW1lciAmUkhTKSB7CisgICAgYXNzZXJ0KCFSSFMuVEcgJiYgIkNhbiBvbmx5IGNvcHkgdW5pbml0aWFsaXplZCB0aW1lcnMiKTsKKyAgfQorICBjb25zdCBUaW1lciAmb3BlcmF0b3I9KGNvbnN0IFRpbWVyICZUKSB7CisgICAgYXNzZXJ0KCFURyAmJiAhVC5URyAmJiAiQ2FuIG9ubHkgYXNzaWduIHVuaW5pdCB0aW1lcnMiKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgflRpbWVyKCk7CisKKyAgLy8vIENyZWF0ZSBhbiB1bmluaXRpYWxpemVkIHRpbWVyLCBjbGllbnQgbXVzdCB1c2UgJ2luaXQnLgorICBleHBsaWNpdCBUaW1lcigpIHt9CisgIHZvaWQgaW5pdChTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIERlc2NyaXB0aW9uKTsKKyAgdm9pZCBpbml0KFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgRGVzY3JpcHRpb24sIFRpbWVyR3JvdXAgJnRnKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldERlc2NyaXB0aW9uKCkgY29uc3QgeyByZXR1cm4gRGVzY3JpcHRpb247IH0KKyAgYm9vbCBpc0luaXRpYWxpemVkKCkgY29uc3QgeyByZXR1cm4gVEcgIT0gbnVsbHB0cjsgfQorCisgIC8vLyBDaGVjayBpZiB0aGUgdGltZXIgaXMgY3VycmVudGx5IHJ1bm5pbmcuCisgIGJvb2wgaXNSdW5uaW5nKCkgY29uc3QgeyByZXR1cm4gUnVubmluZzsgfQorCisgIC8vLyBDaGVjayBpZiBzdGFydFRpbWVyKCkgaGFzIGV2ZXIgYmVlbiBjYWxsZWQgb24gdGhpcyB0aW1lci4KKyAgYm9vbCBoYXNUcmlnZ2VyZWQoKSBjb25zdCB7IHJldHVybiBUcmlnZ2VyZWQ7IH0KKworICAvLy8gU3RhcnQgdGhlIHRpbWVyIHJ1bm5pbmcuICBUaW1lIGJldHdlZW4gY2FsbHMgdG8gc3RhcnRUaW1lci9zdG9wVGltZXIgaXMKKyAgLy8vIGNvdW50ZWQgYnkgdGhlIFRpbWVyIGNsYXNzLiAgTm90ZSB0aGF0IHRoZXNlIGNhbGxzIG11c3QgYmUgY29ycmVjdGx5CisgIC8vLyBwYWlyZWQuCisgIHZvaWQgc3RhcnRUaW1lcigpOworCisgIC8vLyBTdG9wIHRoZSB0aW1lci4KKyAgdm9pZCBzdG9wVGltZXIoKTsKKworICAvLy8gQ2xlYXIgdGhlIHRpbWVyIHN0YXRlLgorICB2b2lkIGNsZWFyKCk7CisKKyAgLy8vIFJldHVybiB0aGUgZHVyYXRpb24gZm9yIHdoaWNoIHRoaXMgdGltZXIgaGFzIGJlZW4gcnVubmluZy4KKyAgVGltZVJlY29yZCBnZXRUb3RhbFRpbWUoKSBjb25zdCB7IHJldHVybiBUaW1lOyB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBUaW1lckdyb3VwOworfTsKKworLy8vIFRoZSBUaW1lUmVnaW9uIGNsYXNzIGlzIHVzZWQgYXMgYSBoZWxwZXIgY2xhc3MgdG8gY2FsbCB0aGUgc3RhcnRUaW1lcigpIGFuZAorLy8vIHN0b3BUaW1lcigpIG1ldGhvZHMgb2YgdGhlIFRpbWVyIGNsYXNzLiAgV2hlbiB0aGUgb2JqZWN0IGlzIGNvbnN0cnVjdGVkLCBpdAorLy8vIHN0YXJ0cyB0aGUgdGltZXIgc3BlY2lmaWVkIGFzIGl0cyBhcmd1bWVudC4gIFdoZW4gaXQgaXMgZGVzdHJveWVkLCBpdCBzdG9wcworLy8vIHRoZSByZWxldmFudCB0aW1lci4gIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0aW1lIGEgcmVnaW9uIG9mIGNvZGUuCitjbGFzcyBUaW1lUmVnaW9uIHsKKyAgVGltZXIgKlQ7CisgIFRpbWVSZWdpb24oY29uc3QgVGltZVJlZ2lvbiAmKSA9IGRlbGV0ZTsKKworcHVibGljOgorICBleHBsaWNpdCBUaW1lUmVnaW9uKFRpbWVyICZ0KSA6IFQoJnQpIHsKKyAgICBULT5zdGFydFRpbWVyKCk7CisgIH0KKyAgZXhwbGljaXQgVGltZVJlZ2lvbihUaW1lciAqdCkgOiBUKHQpIHsKKyAgICBpZiAoVCkgVC0+c3RhcnRUaW1lcigpOworICB9CisgIH5UaW1lUmVnaW9uKCkgeworICAgIGlmIChUKSBULT5zdG9wVGltZXIoKTsKKyAgfQorfTsKKworLy8vIFRoaXMgY2xhc3MgaXMgYmFzaWNhbGx5IGEgY29tYmluYXRpb24gb2YgVGltZVJlZ2lvbiBhbmQgVGltZXIuICBJdCBhbGxvd3MKKy8vLyB5b3UgdG8gZGVjbGFyZSBhIG5ldyB0aW1lciwgQU5EIHNwZWNpZnkgdGhlIHJlZ2lvbiB0byB0aW1lLCBhbGwgaW4gb25lCisvLy8gc3RhdGVtZW50LiAgQWxsIHRpbWVycyB3aXRoIHRoZSBzYW1lIG5hbWUgYXJlIG1lcmdlZC4gIFRoaXMgaXMgcHJpbWFyaWx5CisvLy8gdXNlZCBmb3IgZGVidWdnaW5nIGFuZCBmb3IgaHVudGluZyBwZXJmb3JtYW5jZSBwcm9ibGVtcy4KK3N0cnVjdCBOYW1lZFJlZ2lvblRpbWVyIDogcHVibGljIFRpbWVSZWdpb24geworICBleHBsaWNpdCBOYW1lZFJlZ2lvblRpbWVyKFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgRGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEdyb3VwTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgR3JvdXBEZXNjcmlwdGlvbiwgYm9vbCBFbmFibGVkID0gdHJ1ZSk7Cit9OworCisvLy8gVGhlIFRpbWVyR3JvdXAgY2xhc3MgaXMgdXNlZCB0byBncm91cCB0b2dldGhlciByZWxhdGVkIHRpbWVycyBpbnRvIGEgc2luZ2xlCisvLy8gcmVwb3J0IHRoYXQgaXMgcHJpbnRlZCB3aGVuIHRoZSBUaW1lckdyb3VwIGlzIGRlc3Ryb3llZC4gIEl0IGlzIGlsbGVnYWwgdG8KKy8vLyBkZXN0cm95IGEgVGltZXJHcm91cCBvYmplY3QgYmVmb3JlIGFsbCBvZiB0aGUgVGltZXJzIGluIGl0IGFyZSBnb25lLiAgQQorLy8vIFRpbWVyR3JvdXAgY2FuIGJlIHNwZWNpZmllZCBmb3IgYSBuZXdseSBjcmVhdGVkIHRpbWVyIGluIGl0cyBjb25zdHJ1Y3Rvci4KK2NsYXNzIFRpbWVyR3JvdXAgeworICBzdHJ1Y3QgUHJpbnRSZWNvcmQgeworICAgIFRpbWVSZWNvcmQgVGltZTsKKyAgICBzdGQ6OnN0cmluZyBOYW1lOworICAgIHN0ZDo6c3RyaW5nIERlc2NyaXB0aW9uOworCisgICAgUHJpbnRSZWNvcmQoY29uc3QgUHJpbnRSZWNvcmQgJk90aGVyKSA9IGRlZmF1bHQ7CisgICAgUHJpbnRSZWNvcmQoY29uc3QgVGltZVJlY29yZCAmVGltZSwgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkRlc2NyaXB0aW9uKQorICAgICAgOiBUaW1lKFRpbWUpLCBOYW1lKE5hbWUpLCBEZXNjcmlwdGlvbihEZXNjcmlwdGlvbikge30KKworICAgIGJvb2wgb3BlcmF0b3IgPChjb25zdCBQcmludFJlY29yZCAmT3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBUaW1lIDwgT3RoZXIuVGltZTsKKyAgICB9CisgIH07CisgIHN0ZDo6c3RyaW5nIE5hbWU7CisgIHN0ZDo6c3RyaW5nIERlc2NyaXB0aW9uOworICBUaW1lciAqRmlyc3RUaW1lciA9IG51bGxwdHI7IC8vLzwgRmlyc3QgdGltZXIgaW4gdGhlIGdyb3VwLgorICBzdGQ6OnZlY3RvcjxQcmludFJlY29yZD4gVGltZXJzVG9QcmludDsKKworICBUaW1lckdyb3VwICoqUHJldjsgLy8vPCBQb2ludGVyIHRvIE5leHQgZmllbGQgb2YgcHJldmlvdXMgdGltZXJncm91cCBpbiBsaXN0LgorICBUaW1lckdyb3VwICpOZXh0OyAgLy8vPCBQb2ludGVyIHRvIG5leHQgdGltZXJncm91cCBpbiBsaXN0LgorICBUaW1lckdyb3VwKGNvbnN0IFRpbWVyR3JvdXAgJlRHKSA9IGRlbGV0ZTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVGltZXJHcm91cCAmVEcpID0gZGVsZXRlOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFRpbWVyR3JvdXAoU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBEZXNjcmlwdGlvbik7CisgIH5UaW1lckdyb3VwKCk7CisKKyAgdm9pZCBzZXROYW1lKFN0cmluZ1JlZiBOZXdOYW1lLCBTdHJpbmdSZWYgTmV3RGVzY3JpcHRpb24pIHsKKyAgICBOYW1lLmFzc2lnbihOZXdOYW1lLmJlZ2luKCksIE5ld05hbWUuZW5kKCkpOworICAgIERlc2NyaXB0aW9uLmFzc2lnbihOZXdEZXNjcmlwdGlvbi5iZWdpbigpLCBOZXdEZXNjcmlwdGlvbi5lbmQoKSk7CisgIH0KKworICAvLy8gUHJpbnQgYW55IHN0YXJ0ZWQgdGltZXJzIGluIHRoaXMgZ3JvdXAgYW5kIHplcm8gdGhlbS4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpOworCisgIC8vLyBUaGlzIHN0YXRpYyBtZXRob2QgcHJpbnRzIGFsbCB0aW1lcnMgYW5kIGNsZWFycyB0aGVtIGFsbCBvdXQuCisgIHN0YXRpYyB2b2lkIHByaW50QWxsKHJhd19vc3RyZWFtICZPUyk7CisKKyAgLy8vIFByaW50cyBhbGwgdGltZXJzIGFzIEpTT04ga2V5L3ZhbHVlIHBhaXJzLCBhbmQgY2xlYXJzIHRoZW0gYWxsIG91dC4KKyAgc3RhdGljIGNvbnN0IGNoYXIgKnByaW50QWxsSlNPTlZhbHVlcyhyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IGNoYXIgKmRlbGltKTsKKworICAvLy8gRW5zdXJlIGdsb2JhbCB0aW1lciBncm91cCBsaXN0cyBhcmUgaW5pdGlhbGl6ZWQuIFRoaXMgZnVuY3Rpb24gaXMgbW9zdGx5CisgIC8vLyB1c2VkIGJ5IHRoZSBTdGF0aXN0aWMgY29kZSB0byBpbmZsdWVuY2UgdGhlIGNvbnN0cnVjdGlvbiBhbmQgZGVzdHJ1Y3Rpb24KKyAgLy8vIG9yZGVyIG9mIHRoZSBnbG9iYWwgdGltZXIgbGlzdHMuCisgIHN0YXRpYyB2b2lkIENvbnN0cnVjdFRpbWVyTGlzdHMoKTsKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBUaW1lcjsKKyAgZnJpZW5kIHZvaWQgUHJpbnRTdGF0aXN0aWNzSlNPTihyYXdfb3N0cmVhbSAmT1MpOworICB2b2lkIGFkZFRpbWVyKFRpbWVyICZUKTsKKyAgdm9pZCByZW1vdmVUaW1lcihUaW1lciAmVCk7CisgIHZvaWQgcHJlcGFyZVRvUHJpbnRMaXN0KCk7CisgIHZvaWQgUHJpbnRRdWV1ZWRUaW1lcnMocmF3X29zdHJlYW0gJk9TKTsKKyAgdm9pZCBwcmludEpTT05WYWx1ZShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50UmVjb3JkICZSLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN1ZmZpeCwgZG91YmxlIFZhbHVlKTsKKyAgY29uc3QgY2hhciAqcHJpbnRKU09OVmFsdWVzKHJhd19vc3RyZWFtICZPUywgY29uc3QgY2hhciAqZGVsaW0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVG9vbE91dHB1dEZpbGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Ub29sT3V0cHV0RmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZDVmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVG9vbE91dHB1dEZpbGUuaApAQCAtMCwwICsxLDYzIEBACisvLz09PS0gVG9vbE91dHB1dEZpbGUuaCAtIE91dHB1dCBmaWxlcyBmb3IgY29tcGlsZXItbGlrZSB0b29scyAtLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBUb29sT3V0cHV0RmlsZSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9UT09MT1VUUFVURklMRV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9UT09MT1VUUFVURklMRV9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVGhpcyBjbGFzcyBjb250YWlucyBhIHJhd19mZF9vc3RyZWFtIGFuZCBhZGRzIGEgZmV3IGV4dHJhIGZlYXR1cmVzIGNvbW1vbmx5CisvLy8gbmVlZGVkIGZvciBjb21waWxlci1saWtlIHRvb2wgb3V0cHV0IGZpbGVzOgorLy8vICAgLSBUaGUgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQgaWYgdGhlIHByb2Nlc3MgaXMga2lsbGVkLgorLy8vICAgLSBUaGUgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQgd2hlbiB0aGUgVG9vbE91dHB1dEZpbGUKKy8vLyAgICAgb2JqZWN0IGlzIGRlc3Ryb3llZCB1bmxlc3MgdGhlIGNsaWVudCBjYWxscyBrZWVwKCkuCitjbGFzcyBUb29sT3V0cHV0RmlsZSB7CisgIC8vLyBUaGlzIGNsYXNzIGlzIGRlY2xhcmVkIGJlZm9yZSB0aGUgcmF3X2ZkX29zdHJlYW0gc28gdGhhdCBpdCBpcyBjb25zdHJ1Y3RlZAorICAvLy8gYmVmb3JlIHRoZSByYXdfZmRfb3N0cmVhbSBpcyBjb25zdHJ1Y3RlZCBhbmQgZGVzdHJ1Y3RlZCBhZnRlciB0aGUKKyAgLy8vIHJhd19mZF9vc3RyZWFtIGlzIGRlc3RydWN0ZWQuIEl0IGluc3RhbGxzIGNsZWFudXBzIGluIGl0cyBjb25zdHJ1Y3RvciBhbmQKKyAgLy8vIHVuaW5zdGFsbHMgdGhlbSBpbiBpdHMgZGVzdHJ1Y3Rvci4KKyAgY2xhc3MgQ2xlYW51cEluc3RhbGxlciB7CisgICAgLy8vIFRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgIHN0ZDo6c3RyaW5nIEZpbGVuYW1lOworICBwdWJsaWM6CisgICAgLy8vIFRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZCBub3QgZGVsZXRlIHRoZSBmaWxlLgorICAgIGJvb2wgS2VlcDsKKworICAgIGV4cGxpY2l0IENsZWFudXBJbnN0YWxsZXIoU3RyaW5nUmVmIGlsZW5hbWUpOworICAgIH5DbGVhbnVwSW5zdGFsbGVyKCk7CisgIH0gSW5zdGFsbGVyOworCisgIC8vLyBUaGUgY29udGFpbmVkIHN0cmVhbS4gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGRlY2xhcmVkIGFmdGVyIEluc3RhbGxlci4KKyAgcmF3X2ZkX29zdHJlYW0gT1M7CisKK3B1YmxpYzoKKyAgLy8vIFRoaXMgY29uc3RydWN0b3IncyBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byByYXdfZmRfb3N0cmVhbSdzCisgIC8vLyBjb25zdHJ1Y3Rvci4KKyAgVG9vbE91dHB1dEZpbGUoU3RyaW5nUmVmIEZpbGVuYW1lLCBzdGQ6OmVycm9yX2NvZGUgJkVDLAorICAgICAgICAgICAgICAgICBzeXM6OmZzOjpPcGVuRmxhZ3MgRmxhZ3MpOworCisgIFRvb2xPdXRwdXRGaWxlKFN0cmluZ1JlZiBGaWxlbmFtZSwgaW50IEZEKTsKKworICAvLy8gUmV0dXJuIHRoZSBjb250YWluZWQgcmF3X2ZkX29zdHJlYW0uCisgIHJhd19mZF9vc3RyZWFtICZvcygpIHsgcmV0dXJuIE9TOyB9CisKKyAgLy8vIEluZGljYXRlIHRoYXQgdGhlIHRvb2wncyBqb2Igd3J0IHRoaXMgb3V0cHV0IGZpbGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bCBhbmQKKyAgLy8vIHRoZSBmaWxlIHNob3VsZCBub3QgYmUgZGVsZXRlZC4KKyAgdm9pZCBrZWVwKCkgeyBJbnN0YWxsZXIuS2VlcCA9IHRydWU7IH0KK307CisKK30gLy8gZW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RyYWlsaW5nT2JqZWN0cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RyYWlsaW5nT2JqZWN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNWE1MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVHJhaWxpbmdPYmplY3RzLmgKQEAgLTAsMCArMSw0MDEgQEAKKy8vPT09LS0tIFRyYWlsaW5nT2JqZWN0cy5oIC0gVmFyaWFibGUtbGVuZ3RoIGNsYXNzZXMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgc3VwcG9ydCBmb3IgaW1wbGVtZW50aW5nIGNsYXNzZXMgdGhhdCBoYXZlCisvLy8gc29tZSB0cmFpbGluZyBvYmplY3QgKG9yIGFycmF5cyBvZiBvYmplY3RzKSBhcHBlbmRlZCB0byB0aGVtLiBUaGUKKy8vLyBtYWluIHB1cnBvc2UgaXMgdG8gbWFrZSBpdCBvYnZpb3VzIHdoZXJlIHRoaXMgaWRpb20gaXMgYmVpbmcgdXNlZCwKKy8vLyBhbmQgdG8gbWFrZSB0aGUgdXNhZ2UgbW9yZSBpZGlvbWF0aWMgYW5kIG1vcmUgZGlmZmljdWx0IHRvIGdldAorLy8vIHdyb25nLgorLy8vCisvLy8gVGhlIFRyYWlsaW5nT2JqZWN0IHRlbXBsYXRlIGFic3RyYWN0cyBhd2F5IHRoZSByZWludGVycHJldF9jYXN0LAorLy8vIHBvaW50ZXIgYXJpdGhtZXRpYywgYW5kIHNpemUgY2FsY3VsYXRpb25zIHVzZWQgZm9yIHRoZSBhbGxvY2F0aW9uCisvLy8gYW5kIGFjY2VzcyBvZiBhcHBlbmRlZCBhcnJheXMgb2Ygb2JqZWN0cywgYW5kIHRha2VzIGNhcmUgdGhhdCB0aGV5CisvLy8gYXJlIGFsbCBhbGxvY2F0ZWQgYXQgdGhlaXIgcmVxdWlyZWQgYWxpZ25tZW50LiBBZGRpdGlvbmFsbHksIGl0CisvLy8gZW5zdXJlcyB0aGF0IHRoZSBiYXNlIHR5cGUgaXMgZmluYWwgLS0gZGVyaXZpbmcgZnJvbSBhIGNsYXNzIHRoYXQKKy8vLyBleHBlY3RzIGRhdGEgYXBwZW5kZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaXMgdHlwaWNhbGx5IG5vdCBzYWZlLgorLy8vCisvLy8gVXNlcnMgYXJlIGV4cGVjdGVkIHRvIGRlcml2ZSBmcm9tIHRoaXMgdGVtcGxhdGUsIGFuZCBwcm92aWRlCisvLy8gbnVtVHJhaWxpbmdPYmplY3RzIGltcGxlbWVudGF0aW9ucyBmb3IgZWFjaCB0cmFpbGluZyB0eXBlIGV4Y2VwdAorLy8vIHRoZSBsYXN0LCBlLmcuIGxpa2UgdGhpcyBzYW1wbGU6CisvLy8KKy8vLyBcY29kZQorLy8vIGNsYXNzIFZhckxlbmd0aE9iaiA6IHByaXZhdGUgVHJhaWxpbmdPYmplY3RzPFZhckxlbmd0aE9iaiwgaW50LCBkb3VibGU+IHsKKy8vLyAgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisvLy8KKy8vLyAgIHVuc2lnbmVkIE51bUludHMsIE51bURvdWJsZXM7CisvLy8gICBzaXplX3QgbnVtVHJhaWxpbmdPYmplY3RzKE92ZXJsb2FkVG9rZW48aW50PikgY29uc3QgeyByZXR1cm4gTnVtSW50czsgfQorLy8vICB9OworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBZb3UgY2FuIGFjY2VzcyB0aGUgYXBwZW5kZWQgYXJyYXlzIHZpYSAnZ2V0VHJhaWxpbmdPYmplY3RzJywgYW5kCisvLy8gZGV0ZXJtaW5lIHRoZSBzaXplIG5lZWRlZCBmb3IgYWxsb2NhdGlvbiB2aWEKKy8vLyAnYWRkaXRpb25hbFNpemVUb0FsbG9jJyBhbmQgJ3RvdGFsU2l6ZVRvQWxsb2MnLgorLy8vCisvLy8gQWxsIHRoZSBtZXRob2RzIGltcGxlbWVudGVkIGJ5IHRoaXMgY2xhc3MgYXJlIGFyZSBpbnRlbmRlZCBmb3IgdXNlCisvLy8gYnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjbGFzcywgbm90IGFzIHBhcnQgb2YgaXRzIGludGVyZmFjZQorLy8vICh0aHVzLCBwcml2YXRlIGluaGVyaXRhbmNlIGlzIHN1Z2dlc3RlZCkuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1RSQUlMSU5HT0JKRUNUU19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9UUkFJTElOR09CSkVDVFNfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsaWduT2YuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgdHJhaWxpbmdfb2JqZWN0c19pbnRlcm5hbCB7CisvLy8gSGVscGVyIHRlbXBsYXRlIHRvIGNhbGN1bGF0ZSB0aGUgbWF4IGFsaWdubWVudCByZXF1aXJlbWVudCBmb3IgYSBzZXQgb2YKKy8vLyBvYmplY3RzLgordGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0LCB0eXBlbmFtZS4uLiBSZXN0PiBjbGFzcyBBbGlnbm1lbnRDYWxjSGVscGVyIHsKK3ByaXZhdGU6CisgIGVudW0geworICAgIEZpcnN0QWxpZ25tZW50ID0gYWxpZ25vZihGaXJzdCksCisgICAgUmVzdEFsaWdubWVudCA9IEFsaWdubWVudENhbGNIZWxwZXI8UmVzdC4uLj46OkFsaWdubWVudCwKKyAgfTsKKworcHVibGljOgorICBlbnVtIHsKKyAgICBBbGlnbm1lbnQgPSBGaXJzdEFsaWdubWVudCA+IFJlc3RBbGlnbm1lbnQgPyBGaXJzdEFsaWdubWVudCA6IFJlc3RBbGlnbm1lbnQKKyAgfTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGaXJzdD4gY2xhc3MgQWxpZ25tZW50Q2FsY0hlbHBlcjxGaXJzdD4geworcHVibGljOgorICBlbnVtIHsgQWxpZ25tZW50ID0gYWxpZ25vZihGaXJzdCkgfTsKK307CisKKy8vLyBUaGUgYmFzZSBjbGFzcyBmb3IgVHJhaWxpbmdPYmplY3RzKiBjbGFzc2VzLgorY2xhc3MgVHJhaWxpbmdPYmplY3RzQmFzZSB7Citwcm90ZWN0ZWQ6CisgIC8vLyBPdmVybG9hZFRva2VuJ3MgcHVycG9zZSBpcyB0byBhbGxvdyBzcGVjaWZ5aW5nIGZ1bmN0aW9uIG92ZXJsb2FkcworICAvLy8gZm9yIGRpZmZlcmVudCB0eXBlcywgd2l0aG91dCBhY3R1YWxseSB0YWtpbmcgdGhlIHR5cGVzIGFzCisgIC8vLyBwYXJhbWV0ZXJzLiAoTmVjZXNzYXJ5IGJlY2F1c2UgbWVtYmVyIGZ1bmN0aW9uIHRlbXBsYXRlcyBjYW5ub3QKKyAgLy8vIGJlIHNwZWNpYWxpemVkLCBzbyBvdmVybG9hZHMgbXVzdCBiZSB1c2VkIGluc3RlYWQgb2YKKyAgLy8vIHNwZWNpYWxpemF0aW9uLikKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBPdmVybG9hZFRva2VuIHt9OworfTsKKworLy8vIFRoaXMgaGVscGVyIHRlbXBsYXRlIHdvcmtzLWFyb3VuZCBNU1ZDIDIwMTMncyBsYWNrIG9mIHVzZWZ1bAorLy8vIGFsaWduYXMoKSBzdXBwb3J0LiBUaGUgYXJndW1lbnQgdG8gTExWTV9BTElHTkFTKCksIGluIE1TVkMsIGlzCisvLy8gcmVxdWlyZWQgdG8gYmUgYSBsaXRlcmFsIGludGVnZXIuIEJ1dCwgeW91ICpjYW4qIHVzZSB0ZW1wbGF0ZQorLy8vIHNwZWNpYWxpemF0aW9uIHRvIHNlbGVjdCBiZXR3ZWVuIGEgYnVuY2ggb2YgZGlmZmVyZW50IExMVk1fQUxJR05BUworLy8vIGV4cHJlc3Npb25zLi4uCit0ZW1wbGF0ZSA8aW50IEFsaWduPgorY2xhc3MgVHJhaWxpbmdPYmplY3RzQWxpZ25lciA6IHB1YmxpYyBUcmFpbGluZ09iamVjdHNCYXNlIHt9OwordGVtcGxhdGUgPD4KK2NsYXNzIExMVk1fQUxJR05BUygxKSBUcmFpbGluZ09iamVjdHNBbGlnbmVyPDE+IDogcHVibGljIFRyYWlsaW5nT2JqZWN0c0Jhc2Uge307Cit0ZW1wbGF0ZSA8PgorY2xhc3MgTExWTV9BTElHTkFTKDIpIFRyYWlsaW5nT2JqZWN0c0FsaWduZXI8Mj4gOiBwdWJsaWMgVHJhaWxpbmdPYmplY3RzQmFzZSB7fTsKK3RlbXBsYXRlIDw+CitjbGFzcyBMTFZNX0FMSUdOQVMoNCkgVHJhaWxpbmdPYmplY3RzQWxpZ25lcjw0PiA6IHB1YmxpYyBUcmFpbGluZ09iamVjdHNCYXNlIHt9OwordGVtcGxhdGUgPD4KK2NsYXNzIExMVk1fQUxJR05BUyg4KSBUcmFpbGluZ09iamVjdHNBbGlnbmVyPDg+IDogcHVibGljIFRyYWlsaW5nT2JqZWN0c0Jhc2Uge307Cit0ZW1wbGF0ZSA8PgorY2xhc3MgTExWTV9BTElHTkFTKDE2KSBUcmFpbGluZ09iamVjdHNBbGlnbmVyPDE2PiA6IHB1YmxpYyBUcmFpbGluZ09iamVjdHNCYXNlIHsKK307Cit0ZW1wbGF0ZSA8PgorY2xhc3MgTExWTV9BTElHTkFTKDMyKSBUcmFpbGluZ09iamVjdHNBbGlnbmVyPDMyPiA6IHB1YmxpYyBUcmFpbGluZ09iamVjdHNCYXNlIHsKK307CisKKy8vIEp1c3QgYSBsaXR0bGUgaGVscGVyIGZvciB0cmFuc2Zvcm1pbmcgYSB0eXBlIHBhY2sgaW50byB0aGUgc2FtZQorLy8gbnVtYmVyIG9mIGEgZGlmZmVyZW50IHR5cGUuIGUuZy46CisvLyAgIEV4dHJhY3RTZWNvbmRUeXBlPEZvby4uLiwgaW50Pjo6dHlwZQordGVtcGxhdGUgPHR5cGVuYW1lIFR5MSwgdHlwZW5hbWUgVHkyPiBzdHJ1Y3QgRXh0cmFjdFNlY29uZFR5cGUgeworICB0eXBlZGVmIFR5MiB0eXBlOworfTsKKworLy8gVHJhaWxpbmdPYmplY3RzSW1wbCBpcyBzb21ld2hhdCBjb21wbGljYXRlZCwgYmVjYXVzZSBpdCBpcyBhCisvLyByZWN1cnNpdmVseSBpbmhlcml0aW5nIHRlbXBsYXRlLCBpbiBvcmRlciB0byBoYW5kbGUgdGhlIHRlbXBsYXRlCisvLyB2YXJhcmdzLiBFYWNoIGxldmVsIG9mIGluaGVyaXRhbmNlIHBpY2tzIG9mZiBhIHNpbmdsZSB0cmFpbGluZyB0eXBlCisvLyB0aGVuIHJlY3Vyc2VzIG9uIHRoZSByZXN0LiBUaGUgIkFsaWduIiwgIkJhc2VUeSIsIGFuZAorLy8gIlRvcFRyYWlsaW5nT2JqIiBhcmd1bWVudHMgYXJlIHBhc3NlZCB0aHJvdWdoIHVuY2hhbmdlZCB0aHJvdWdoIHRoZQorLy8gcmVjdXJzaW9uLiAiUHJldlR5IiBpcywgYXQgZWFjaCBsZXZlbCwgdGhlIHR5cGUgaGFuZGxlZCBieSB0aGUKKy8vIGxldmVsIHJpZ2h0IGFib3ZlIGl0LgorCit0ZW1wbGF0ZSA8aW50IEFsaWduLCB0eXBlbmFtZSBCYXNlVHksIHR5cGVuYW1lIFRvcFRyYWlsaW5nT2JqLCB0eXBlbmFtZSBQcmV2VHksCisgICAgICAgICAgdHlwZW5hbWUuLi4gTW9yZVR5cz4KK2NsYXNzIFRyYWlsaW5nT2JqZWN0c0ltcGwgeworICAvLyBUaGUgbWFpbiB0ZW1wbGF0ZSBkZWZpbml0aW9uIGlzIG5ldmVyIHVzZWQgLS0gdGhlIHR3bworICAvLyBzcGVjaWFsaXphdGlvbnMgY292ZXIgYWxsIHBvc3NpYmlsaXRpZXMuCit9OworCit0ZW1wbGF0ZSA8aW50IEFsaWduLCB0eXBlbmFtZSBCYXNlVHksIHR5cGVuYW1lIFRvcFRyYWlsaW5nT2JqLCB0eXBlbmFtZSBQcmV2VHksCisgICAgICAgICAgdHlwZW5hbWUgTmV4dFR5LCB0eXBlbmFtZS4uLiBNb3JlVHlzPgorY2xhc3MgVHJhaWxpbmdPYmplY3RzSW1wbDxBbGlnbiwgQmFzZVR5LCBUb3BUcmFpbGluZ09iaiwgUHJldlR5LCBOZXh0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vcmVUeXMuLi4+CisgICAgOiBwdWJsaWMgVHJhaWxpbmdPYmplY3RzSW1wbDxBbGlnbiwgQmFzZVR5LCBUb3BUcmFpbGluZ09iaiwgTmV4dFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9yZVR5cy4uLj4geworCisgIHR5cGVkZWYgVHJhaWxpbmdPYmplY3RzSW1wbDxBbGlnbiwgQmFzZVR5LCBUb3BUcmFpbGluZ09iaiwgTmV4dFR5LCBNb3JlVHlzLi4uPgorICAgICAgUGFyZW50VHlwZTsKKworICBzdHJ1Y3QgUmVxdWlyZXNSZWFsaWdubWVudCB7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBhbGlnbm9mKFByZXZUeSkgPCBhbGlnbm9mKE5leHRUeSk7CisgIH07CisKKyAgc3RhdGljIGNvbnN0ZXhwciBib29sIHJlcXVpcmVzUmVhbGlnbm1lbnQoKSB7CisgICAgcmV0dXJuIFJlcXVpcmVzUmVhbGlnbm1lbnQ6OnZhbHVlOworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8gRW5zdXJlIHRoZSBpbmhlcml0ZWQgZ2V0VHJhaWxpbmdPYmplY3RzSW1wbCBpcyBub3QgaGlkZGVuLgorICB1c2luZyBQYXJlbnRUeXBlOjpnZXRUcmFpbGluZ09iamVjdHNJbXBsOworCisgIC8vIFRoZXNlIHR3byBmdW5jdGlvbnMgYXJlIGhlbHBlciBmdW5jdGlvbnMgZm9yCisgIC8vIFRyYWlsaW5nT2JqZWN0czo6Z2V0VHJhaWxpbmdPYmplY3RzLiBUaGV5IHJlY3Vyc2UgdG8gdGhlIGxlZnQgLS0KKyAgLy8gdGhlIHJlc3VsdCBmb3IgZWFjaCB0eXBlIGluIHRoZSBsaXN0IG9mIHRyYWlsaW5nIHR5cGVzIGRlcGVuZHMgb24KKyAgLy8gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBmdW5jdGlvbiBvbiB0aGUgdHlwZSB0byB0aGUKKyAgLy8gbGVmdC4gSG93ZXZlciwgdGhlIGZ1bmN0aW9uIGZvciB0aGUgdHlwZSB0byB0aGUgbGVmdCBpcworICAvLyBpbXBsZW1lbnRlZCBieSBhICpzdWJjbGFzcyogb2YgdGhpcyBjbGFzcywgc28gd2UgaW52b2tlIGl0IHZpYQorICAvLyB0aGUgVG9wVHJhaWxpbmdPYmosIHdoaWNoIGlzLCB2aWEgdGhlCisgIC8vIGN1cmlvdXNseS1yZWN1cnJpbmctdGVtcGxhdGUtcGF0dGVybiwgdGhlIG1vc3QtZGVyaXZlZCB0eXBlIGluCisgIC8vIHRoaXMgcmVjdXJzaW9uLCBhbmQgdGh1cywgY29udGFpbnMgYWxsIHRoZSBvdmVybG9hZHMuCisgIHN0YXRpYyBjb25zdCBOZXh0VHkgKgorICBnZXRUcmFpbGluZ09iamVjdHNJbXBsKGNvbnN0IEJhc2VUeSAqT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWlsaW5nT2JqZWN0c0Jhc2U6Ok92ZXJsb2FkVG9rZW48TmV4dFR5PikgeworICAgIGF1dG8gKlB0ciA9IFRvcFRyYWlsaW5nT2JqOjpnZXRUcmFpbGluZ09iamVjdHNJbXBsKAorICAgICAgICAgICAgICAgICAgICBPYmosIFRyYWlsaW5nT2JqZWN0c0Jhc2U6Ok92ZXJsb2FkVG9rZW48UHJldlR5PigpKSArCisgICAgICAgICAgICAgICAgVG9wVHJhaWxpbmdPYmo6OmNhbGxOdW1UcmFpbGluZ09iamVjdHMoCisgICAgICAgICAgICAgICAgICAgIE9iaiwgVHJhaWxpbmdPYmplY3RzQmFzZTo6T3ZlcmxvYWRUb2tlbjxQcmV2VHk+KCkpOworCisgICAgaWYgKHJlcXVpcmVzUmVhbGlnbm1lbnQoKSkKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IE5leHRUeSAqPigKKyAgICAgICAgICBsbHZtOjphbGlnbkFkZHIoUHRyLCBhbGlnbm9mKE5leHRUeSkpKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBOZXh0VHkgKj4oUHRyKTsKKyAgfQorCisgIHN0YXRpYyBOZXh0VHkgKgorICBnZXRUcmFpbGluZ09iamVjdHNJbXBsKEJhc2VUeSAqT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWlsaW5nT2JqZWN0c0Jhc2U6Ok92ZXJsb2FkVG9rZW48TmV4dFR5PikgeworICAgIGF1dG8gKlB0ciA9IFRvcFRyYWlsaW5nT2JqOjpnZXRUcmFpbGluZ09iamVjdHNJbXBsKAorICAgICAgICAgICAgICAgICAgICBPYmosIFRyYWlsaW5nT2JqZWN0c0Jhc2U6Ok92ZXJsb2FkVG9rZW48UHJldlR5PigpKSArCisgICAgICAgICAgICAgICAgVG9wVHJhaWxpbmdPYmo6OmNhbGxOdW1UcmFpbGluZ09iamVjdHMoCisgICAgICAgICAgICAgICAgICAgIE9iaiwgVHJhaWxpbmdPYmplY3RzQmFzZTo6T3ZlcmxvYWRUb2tlbjxQcmV2VHk+KCkpOworCisgICAgaWYgKHJlcXVpcmVzUmVhbGlnbm1lbnQoKSkKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PE5leHRUeSAqPihsbHZtOjphbGlnbkFkZHIoUHRyLCBhbGlnbm9mKE5leHRUeSkpKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxOZXh0VHkgKj4oUHRyKTsKKyAgfQorCisgIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgVHJhaWxpbmdPYmplY3RzOjphZGRpdGlvbmFsU2l6ZVRvQWxsb2M6IHRoaXMKKyAgLy8gZnVuY3Rpb24gcmVjdXJzZXMgdG8gc3VwZXJjbGFzc2VzLCBlYWNoIG9mIHdoaWNoIHJlcXVpcmVzIG9uZQorICAvLyBmZXdlciBzaXplX3QgYXJndW1lbnQsIGFuZCBhZGRzIGl0cyBvd24gc2l6ZS4KKyAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgYWRkaXRpb25hbFNpemVUb0FsbG9jSW1wbCgKKyAgICAgIHNpemVfdCBTaXplU29GYXIsIHNpemVfdCBDb3VudDEsCisgICAgICB0eXBlbmFtZSBFeHRyYWN0U2Vjb25kVHlwZTxNb3JlVHlzLCBzaXplX3Q+Ojp0eXBlLi4uIE1vcmVDb3VudHMpIHsKKyAgICByZXR1cm4gUGFyZW50VHlwZTo6YWRkaXRpb25hbFNpemVUb0FsbG9jSW1wbCgKKyAgICAgICAgKHJlcXVpcmVzUmVhbGlnbm1lbnQoKSA/IGxsdm06OmFsaWduVG88YWxpZ25vZihOZXh0VHkpPihTaXplU29GYXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTaXplU29GYXIpICsKKyAgICAgICAgICAgIHNpemVvZihOZXh0VHkpICogQ291bnQxLAorICAgICAgICBNb3JlQ291bnRzLi4uKTsKKyAgfQorfTsKKworLy8gVGhlIGJhc2UgY2FzZSBvZiB0aGUgVHJhaWxpbmdPYmplY3RzSW1wbCBpbmhlcml0YW5jZSByZWN1cnNpb24sCisvLyB3aGVuIHRoZXJlJ3Mgbm8gbW9yZSB0cmFpbGluZyB0eXBlcy4KK3RlbXBsYXRlIDxpbnQgQWxpZ24sIHR5cGVuYW1lIEJhc2VUeSwgdHlwZW5hbWUgVG9wVHJhaWxpbmdPYmosIHR5cGVuYW1lIFByZXZUeT4KK2NsYXNzIFRyYWlsaW5nT2JqZWN0c0ltcGw8QWxpZ24sIEJhc2VUeSwgVG9wVHJhaWxpbmdPYmosIFByZXZUeT4KKyAgICA6IHB1YmxpYyBUcmFpbGluZ09iamVjdHNBbGlnbmVyPEFsaWduPiB7Citwcm90ZWN0ZWQ6CisgIC8vIFRoaXMgaXMgYSBkdW1teSBtZXRob2QsIG9ubHkgaGVyZSBzbyB0aGUgInVzaW5nIiBkb2Vzbid0IGZhaWwgLS0KKyAgLy8gaXQgd2lsbCBuZXZlciBiZSBjYWxsZWQsIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiByZWN1cnNlcyBiYWNrd2FyZHMKKyAgLy8gdXAgdGhlIGluaGVyaXRhbmNlIGNoYWluIHRvIHN1YmNsYXNzZXMuCisgIHN0YXRpYyB2b2lkIGdldFRyYWlsaW5nT2JqZWN0c0ltcGwoKTsKKworICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBhZGRpdGlvbmFsU2l6ZVRvQWxsb2NJbXBsKHNpemVfdCBTaXplU29GYXIpIHsKKyAgICByZXR1cm4gU2l6ZVNvRmFyOworICB9CisKKyAgdGVtcGxhdGUgPGJvb2wgQ2hlY2tBbGlnbm1lbnQ+IHN0YXRpYyB2b2lkIHZlcmlmeVRyYWlsaW5nT2JqZWN0c0FsaWdubWVudCgpIHt9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgdHJhaWxpbmdfb2JqZWN0c19pbnRlcm5hbAorCisvLyBGaW5hbGx5LCB0aGUgbWFpbiB0eXBlIGRlZmluZWQgaW4gdGhpcyBmaWxlLCB0aGUgb25lIGludGVuZGVkIGZvciB1c2Vycy4uLgorCisvLy8gU2VlIHRoZSBmaWxlIGNvbW1lbnQgZm9yIGRldGFpbHMgb24gdGhlIHVzYWdlIG9mIHRoZQorLy8vIFRyYWlsaW5nT2JqZWN0cyB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIEJhc2VUeSwgdHlwZW5hbWUuLi4gVHJhaWxpbmdUeXM+CitjbGFzcyBUcmFpbGluZ09iamVjdHMgOiBwcml2YXRlIHRyYWlsaW5nX29iamVjdHNfaW50ZXJuYWw6OlRyYWlsaW5nT2JqZWN0c0ltcGw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdfb2JqZWN0c19pbnRlcm5hbDo6QWxpZ25tZW50Q2FsY0hlbHBlcjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaWxpbmdUeXMuLi4+OjpBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVR5LCBUcmFpbGluZ09iamVjdHM8QmFzZVR5LCBUcmFpbGluZ1R5cy4uLj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVR5LCBUcmFpbGluZ1R5cy4uLj4geworCisgIHRlbXBsYXRlIDxpbnQgQSwgdHlwZW5hbWUgQiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgUCwgdHlwZW5hbWUuLi4gTT4KKyAgZnJpZW5kIGNsYXNzIHRyYWlsaW5nX29iamVjdHNfaW50ZXJuYWw6OlRyYWlsaW5nT2JqZWN0c0ltcGw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFR5cz4gY2xhc3MgRm9vIHt9OworCisgIHR5cGVkZWYgdHJhaWxpbmdfb2JqZWN0c19pbnRlcm5hbDo6VHJhaWxpbmdPYmplY3RzSW1wbDwKKyAgICAgIHRyYWlsaW5nX29iamVjdHNfaW50ZXJuYWw6OkFsaWdubWVudENhbGNIZWxwZXI8VHJhaWxpbmdUeXMuLi4+OjpBbGlnbm1lbnQsCisgICAgICBCYXNlVHksIFRyYWlsaW5nT2JqZWN0czxCYXNlVHksIFRyYWlsaW5nVHlzLi4uPiwgQmFzZVR5LCBUcmFpbGluZ1R5cy4uLj4KKyAgICAgIFBhcmVudFR5cGU7CisgIHVzaW5nIFRyYWlsaW5nT2JqZWN0c0Jhc2UgPSB0cmFpbGluZ19vYmplY3RzX2ludGVybmFsOjpUcmFpbGluZ09iamVjdHNCYXNlOworCisgIHVzaW5nIFBhcmVudFR5cGU6OmdldFRyYWlsaW5nT2JqZWN0c0ltcGw7CisKKyAgLy8gVGhpcyBmdW5jdGlvbiBjb250YWlucyBvbmx5IGEgc3RhdGljX2Fzc2VydCBCYXNlVHkgaXMgZmluYWwuIFRoZQorICAvLyBzdGF0aWNfYXNzZXJ0IG11c3QgYmUgaW4gYSBmdW5jdGlvbiwgYW5kIG5vdCBhdCBjbGFzcy1sZXZlbAorICAvLyBiZWNhdXNlIEJhc2VUeSBpc24ndCBjb21wbGV0ZSBhdCBjbGFzcyBpbnN0YW50aWF0aW9uIHRpbWUsIGJ1dAorICAvLyB3aWxsIGJlIGJ5IHRoZSB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgaW5zdGFudGlhdGVkLgorICBzdGF0aWMgdm9pZCB2ZXJpZnlUcmFpbGluZ09iamVjdHNBc3NlcnRpb25zKCkgeworI2lmZGVmIExMVk1fSVNfRklOQUwKKyAgICBzdGF0aWNfYXNzZXJ0KExMVk1fSVNfRklOQUwoQmFzZVR5KSwgIkJhc2VUeSBtdXN0IGJlIGZpbmFsLiIpOworI2VuZGlmCisgIH0KKworICAvLyBUaGVzZSB0d28gbWV0aG9kcyBhcmUgdGhlIGJhc2Ugb2YgdGhlIHJlY3Vyc2lvbiBmb3IgdGhpcyBtZXRob2QuCisgIHN0YXRpYyBjb25zdCBCYXNlVHkgKgorICBnZXRUcmFpbGluZ09iamVjdHNJbXBsKGNvbnN0IEJhc2VUeSAqT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWlsaW5nT2JqZWN0c0Jhc2U6Ok92ZXJsb2FkVG9rZW48QmFzZVR5PikgeworICAgIHJldHVybiBPYmo7CisgIH0KKworICBzdGF0aWMgQmFzZVR5ICoKKyAgZ2V0VHJhaWxpbmdPYmplY3RzSW1wbChCYXNlVHkgKk9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFpbGluZ09iamVjdHNCYXNlOjpPdmVybG9hZFRva2VuPEJhc2VUeT4pIHsKKyAgICByZXR1cm4gT2JqOworICB9CisKKyAgLy8gY2FsbE51bVRyYWlsaW5nT2JqZWN0cyBzaW1wbHkgY2FsbHMgbnVtVHJhaWxpbmdPYmplY3RzIG9uIHRoZQorICAvLyBwcm92aWRlZCBPYmogLS0gZXhjZXB0IHdoZW4gdGhlIHR5cGUgYmVpbmcgcXVlcmllZCBpcyBCYXNlVHkKKyAgLy8gaXRzZWxmLiBUaGVyZSBpcyBhbHdheXMgb25seSBvbmUgb2YgdGhlIGJhc2Ugb2JqZWN0LCBzbyB0aGF0IGNhc2UKKyAgLy8gaXMgaGFuZGxlZCBoZXJlLiAoQW4gYWRkaXRpb25hbCBiZW5lZml0IG9mIGluZGlyZWN0aW5nIHRocm91Z2gKKyAgLy8gdGhpcyBmdW5jdGlvbiBpcyB0aGF0IGNvbnN1bWVycyBvbmx5IHNheSAiZnJpZW5kCisgIC8vIFRyYWlsaW5nT2JqZWN0cyIsIGFuZCB0aHVzLCBvbmx5IHRoaXMgY2xhc3MgaXRzZWxmIGNhbiBjYWxsIHRoZQorICAvLyBudW1UcmFpbGluZ09iamVjdHMgZnVuY3Rpb24uKQorICBzdGF0aWMgc2l6ZV90CisgIGNhbGxOdW1UcmFpbGluZ09iamVjdHMoY29uc3QgQmFzZVR5ICpPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaWxpbmdPYmplY3RzQmFzZTo6T3ZlcmxvYWRUb2tlbjxCYXNlVHk+KSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RhdGljIHNpemVfdCBjYWxsTnVtVHJhaWxpbmdPYmplY3RzKGNvbnN0IEJhc2VUeSAqT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaWxpbmdPYmplY3RzQmFzZTo6T3ZlcmxvYWRUb2tlbjxUPikgeworICAgIHJldHVybiBPYmotPm51bVRyYWlsaW5nT2JqZWN0cyhUcmFpbGluZ09iamVjdHNCYXNlOjpPdmVybG9hZFRva2VuPFQ+KCkpOworICB9CisKK3B1YmxpYzoKKyAgLy8gTWFrZSB0aGlzIChwcml2YXRlbHkgaW5oZXJpdGVkKSBtZW1iZXIgcHVibGljLgorI2lmbmRlZiBfTVNDX1ZFUgorICB1c2luZyBQYXJlbnRUeXBlOjpPdmVybG9hZFRva2VuOworI2Vsc2UKKyAgLy8gTVNWQyBidWcgcHJldmVudHMgdGhlIGFib3ZlIGZyb20gd29ya2luZywgYXQgbGVhc3QgdXAgdGhyb3VnaCBDTAorICAvLyAxOS4xMC4yNDYyOS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHVzaW5nIE92ZXJsb2FkVG9rZW4gPSB0eXBlbmFtZSBQYXJlbnRUeXBlOjp0ZW1wbGF0ZSBPdmVybG9hZFRva2VuPFQ+OworI2VuZGlmCisKKyAgLy8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB0cmFpbGluZyBvYmplY3QgYXJyYXkgb2YgdGhlIGdpdmVuIHR5cGUKKyAgLy8vICh3aGljaCBtdXN0IGJlIG9uZSBvZiB0aG9zZSBzcGVjaWZpZWQgaW4gdGhlIGNsYXNzIHRlbXBsYXRlKS4gVGhlCisgIC8vLyBhcnJheSBtYXkgaGF2ZSB6ZXJvIG9yIG1vcmUgZWxlbWVudHMgaW4gaXQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjb25zdCBUICpnZXRUcmFpbGluZ09iamVjdHMoKSBjb25zdCB7CisgICAgdmVyaWZ5VHJhaWxpbmdPYmplY3RzQXNzZXJ0aW9ucygpOworICAgIC8vIEZvcndhcmRzIHRvIGFuIGltcGwgZnVuY3Rpb24gd2l0aCBvdmVybG9hZHMsIHNpbmNlIG1lbWJlcgorICAgIC8vIGZ1bmN0aW9uIHRlbXBsYXRlcyBjYW4ndCBiZSBzcGVjaWFsaXplZC4KKyAgICByZXR1cm4gdGhpcy0+Z2V0VHJhaWxpbmdPYmplY3RzSW1wbCgKKyAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQmFzZVR5ICo+KHRoaXMpLAorICAgICAgICBUcmFpbGluZ09iamVjdHNCYXNlOjpPdmVybG9hZFRva2VuPFQ+KCkpOworICB9CisKKyAgLy8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB0cmFpbGluZyBvYmplY3QgYXJyYXkgb2YgdGhlIGdpdmVuIHR5cGUKKyAgLy8vICh3aGljaCBtdXN0IGJlIG9uZSBvZiB0aG9zZSBzcGVjaWZpZWQgaW4gdGhlIGNsYXNzIHRlbXBsYXRlKS4gVGhlCisgIC8vLyBhcnJheSBtYXkgaGF2ZSB6ZXJvIG9yIG1vcmUgZWxlbWVudHMgaW4gaXQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUICpnZXRUcmFpbGluZ09iamVjdHMoKSB7CisgICAgdmVyaWZ5VHJhaWxpbmdPYmplY3RzQXNzZXJ0aW9ucygpOworICAgIC8vIEZvcndhcmRzIHRvIGFuIGltcGwgZnVuY3Rpb24gd2l0aCBvdmVybG9hZHMsIHNpbmNlIG1lbWJlcgorICAgIC8vIGZ1bmN0aW9uIHRlbXBsYXRlcyBjYW4ndCBiZSBzcGVjaWFsaXplZC4KKyAgICByZXR1cm4gdGhpcy0+Z2V0VHJhaWxpbmdPYmplY3RzSW1wbCgKKyAgICAgICAgc3RhdGljX2Nhc3Q8QmFzZVR5ICo+KHRoaXMpLCBUcmFpbGluZ09iamVjdHNCYXNlOjpPdmVybG9hZFRva2VuPFQ+KCkpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHRyYWlsaW5nIGRhdGEsIGlmIGFuIG9iamVjdCB3ZXJlCisgIC8vLyBhbGxvY2F0ZWQgd2l0aCB0aGUgZ2l2ZW4gY291bnRzIChUaGUgY291bnRzIGFyZSBpbiB0aGUgc2FtZSBvcmRlcgorICAvLy8gYXMgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cykuIFRoaXMgZG9lcyBub3QgaW5jbHVkZSB0aGUgc2l6ZSBvZiB0aGUKKyAgLy8vIGJhc2Ugb2JqZWN0LiAgVGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBtdXN0IGJlIHRoZSBzYW1lIGFzIHRob3NlCisgIC8vLyB1c2VkIGluIHRoZSBjbGFzczsgdGhleSBhcmUgc3VwcGxpZWQgaGVyZSByZWR1bmRhbnRseSBvbmx5IHNvCisgIC8vLyB0aGF0IGl0J3MgY2xlYXIgd2hhdCB0aGUgY291bnRzIGFyZSBjb3VudGluZyBpbiBjYWxsZXJzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHlzPgorICBzdGF0aWMgY29uc3RleHByIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgc3RkOjppc19zYW1lPEZvbzxUcmFpbGluZ1R5cy4uLj4sIEZvbzxUeXMuLi4+Pjo6dmFsdWUsIHNpemVfdD46OnR5cGUKKyAgYWRkaXRpb25hbFNpemVUb0FsbG9jKHR5cGVuYW1lIHRyYWlsaW5nX29iamVjdHNfaW50ZXJuYWw6OkV4dHJhY3RTZWNvbmRUeXBlPAorICAgICAgICAgICAgICAgICAgICAgICAgVHJhaWxpbmdUeXMsIHNpemVfdD46OnR5cGUuLi4gQ291bnRzKSB7CisgICAgcmV0dXJuIFBhcmVudFR5cGU6OmFkZGl0aW9uYWxTaXplVG9BbGxvY0ltcGwoMCwgQ291bnRzLi4uKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSB0b3RhbCBzaXplIG9mIGFuIG9iamVjdCBpZiBpdCB3ZXJlIGFsbG9jYXRlZCB3aXRoIHRoZQorICAvLy8gZ2l2ZW4gdHJhaWxpbmcgb2JqZWN0IGNvdW50cy4gVGhpcyBpcyB0aGUgc2FtZSBhcworICAvLy8gYWRkaXRpb25hbFNpemVUb0FsbG9jLCBleGNlcHQgaXQgKmRvZXMqIGluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIGJhc2UKKyAgLy8vIG9iamVjdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFR5cz4KKyAgc3RhdGljIGNvbnN0ZXhwciB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgIHN0ZDo6aXNfc2FtZTxGb288VHJhaWxpbmdUeXMuLi4+LCBGb288VHlzLi4uPj46OnZhbHVlLCBzaXplX3Q+Ojp0eXBlCisgIHRvdGFsU2l6ZVRvQWxsb2ModHlwZW5hbWUgdHJhaWxpbmdfb2JqZWN0c19pbnRlcm5hbDo6RXh0cmFjdFNlY29uZFR5cGU8CisgICAgICAgICAgICAgICAgICAgVHJhaWxpbmdUeXMsIHNpemVfdD46OnR5cGUuLi4gQ291bnRzKSB7CisgICAgcmV0dXJuIHNpemVvZihCYXNlVHkpICsgUGFyZW50VHlwZTo6YWRkaXRpb25hbFNpemVUb0FsbG9jSW1wbCgwLCBDb3VudHMuLi4pOworICB9CisKKyAgLy8vIEEgdHlwZSB3aGVyZSBpdHMgOjp3aXRoX2NvdW50cyB0ZW1wbGF0ZSBtZW1iZXIgaGFzIGEgOjp0eXBlIG1lbWJlcgorICAvLy8gc3VpdGFibGUgZm9yIHVzZSBhcyB1bmluaXRpYWxpemVkIHN0b3JhZ2UgZm9yIGFuIG9iamVjdCB3aXRoIHRoZSBnaXZlbgorICAvLy8gdHJhaWxpbmcgb2JqZWN0IGNvdW50cy4gVGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBhcmUgc2ltaWxhciB0byB0aG9zZQorICAvLy8gb2YgYWRkaXRpb25hbFNpemVUb0FsbG9jLgorICAvLy8KKyAgLy8vIFVzZSB3aXRoIEZpeGVkU2l6ZVN0b3JhZ2VPd25lciwgZS5nLjoKKyAgLy8vCisgIC8vLyBcY29kZXsuY3BwfQorICAvLy8KKyAgLy8vIE15T2JqOjpGaXhlZFNpemVTdG9yYWdlPHZvaWQgKj46OndpdGhfY291bnRzPDF1Pjo6dHlwZSBteVN0YWNrT2JqU3RvcmFnZTsKKyAgLy8vIE15T2JqOjpGaXhlZFNpemVTdG9yYWdlT3duZXIKKyAgLy8vICAgICBteVN0YWNrT2JqT3duZXIobmV3ICgodm9pZCAqKSZteVN0YWNrT2JqU3RvcmFnZSkgTXlPYmopOworICAvLy8gTXlPYmogKmNvbnN0IG15U3RhY2tPYmpQdHIgPSBteVN0YWNrT2JqT3duZXIuZ2V0KCk7CisgIC8vLworICAvLy8gXGVuZGNvZGUKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFR5cz4gc3RydWN0IEZpeGVkU2l6ZVN0b3JhZ2UgeworICAgIHRlbXBsYXRlIDxzaXplX3QuLi4gQ291bnRzPiBzdHJ1Y3Qgd2l0aF9jb3VudHMgeworICAgICAgZW51bSB7IFNpemUgPSB0b3RhbFNpemVUb0FsbG9jPFR5cy4uLj4oQ291bnRzLi4uKSB9OworICAgICAgdHlwZWRlZiBsbHZtOjpBbGlnbmVkQ2hhckFycmF5PGFsaWdub2YoQmFzZVR5KSwgU2l6ZT4gdHlwZTsKKyAgICB9OworICB9OworCisgIC8vLyBBIHR5cGUgdGhhdCBhY3RzIGFzIHRoZSBvd25lciBmb3IgYW4gb2JqZWN0IHBsYWNlZCBpbnRvIGZpeGVkIHN0b3JhZ2UuCisgIGNsYXNzIEZpeGVkU2l6ZVN0b3JhZ2VPd25lciB7CisgIHB1YmxpYzoKKyAgICBGaXhlZFNpemVTdG9yYWdlT3duZXIoQmFzZVR5ICpwKSA6IHAocCkge30KKyAgICB+Rml4ZWRTaXplU3RvcmFnZU93bmVyKCkgeworICAgICAgYXNzZXJ0KHAgJiYgIkZpeGVkU2l6ZVN0b3JhZ2VPd25lciBvd25zIG51bGw/Iik7CisgICAgICBwLT5+QmFzZVR5KCk7CisgICAgfQorCisgICAgQmFzZVR5ICpnZXQoKSB7IHJldHVybiBwOyB9CisgICAgY29uc3QgQmFzZVR5ICpnZXQoKSBjb25zdCB7IHJldHVybiBwOyB9CisKKyAgcHJpdmF0ZToKKyAgICBGaXhlZFNpemVTdG9yYWdlT3duZXIoY29uc3QgRml4ZWRTaXplU3RvcmFnZU93bmVyICYpID0gZGVsZXRlOworICAgIEZpeGVkU2l6ZVN0b3JhZ2VPd25lcihGaXhlZFNpemVTdG9yYWdlT3duZXIgJiYpID0gZGVsZXRlOworICAgIEZpeGVkU2l6ZVN0b3JhZ2VPd25lciAmb3BlcmF0b3I9KGNvbnN0IEZpeGVkU2l6ZVN0b3JhZ2VPd25lciAmKSA9IGRlbGV0ZTsKKyAgICBGaXhlZFNpemVTdG9yYWdlT3duZXIgJm9wZXJhdG9yPShGaXhlZFNpemVTdG9yYWdlT3duZXIgJiYpID0gZGVsZXRlOworCisgICAgQmFzZVR5ICpjb25zdCBwOworICB9OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVHJpZ3JhbUluZGV4LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVHJpZ3JhbUluZGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwYjZkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UcmlncmFtSW5kZXguaApAQCAtMCwwICsxLDcwIEBACisvLz09PS0tIFRyaWdyYW1JbmRleC5oIC0gYSBoZXVyaXN0aWMgZm9yIFNwZWNpYWxDYXNlTGlzdCAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVHJpZ3JhbUluZGV4IGltcGxlbWVudHMgYSBoZXVyaXN0aWMgZm9yIFNwZWNpYWxDYXNlTGlzdCB0aGF0IGFsbG93cyB0bworLy8gZmlsdGVyIG91dCB+OTklIGluY29taW5nIHF1ZXJpZXMgd2hlbiBhbGwgcmVndWxhciBleHByZXNzaW9ucyBpbiB0aGUKKy8vIFNwZWNpYWxDYXNlTGlzdCBhcmUgc2ltcGxlIHdpbGRjYXJkcyB3aXRoICcqJyBhbmQgJy4nLiBJZiBydWxlcyBhcmUgbW9yZQorLy8gY29tcGxpY2F0ZWQsIHRoZSBjaGVjayBpcyBkZWZlYXRlZCBhbmQgaXQgd2lsbCBhbHdheXMgcGFzcyB0aGUgcXVlcmllcyB0byBhCisvLyBmdWxsIHJlZ2V4LgorLy8KKy8vIFRoZSBiYXNpYyBpZGVhIGlzIHRoYXQgaW4gb3JkZXIgZm9yIGEgd2lsZGNhcmQgdG8gbWF0Y2ggYSBxdWVyeSwgdGhlIHF1ZXJ5CisvLyBuZWVkcyB0byBoYXZlIGFsbCB0cmlncmFtcyB3aGljaCBvY2N1ciBpbiB0aGUgd2lsZGNhcmQuIFdlIGNyZWF0ZSBhIHRyaWdyYW0KKy8vIGluZGV4ICh0cmlncmFtIC0+IGxpc3Qgb2YgcnVsZXMgd2l0aCBpdCkgYW5kIHRoZW4gY291bnQgdHJpZ3JhbXMgaW4gdGhlIHF1ZXJ5CisvLyBmb3IgZWFjaCBydWxlLiBJZiB0aGUgY291bnQgZm9yIG9uZSBvZiB0aGUgcnVsZXMgcmVhY2hlcyB0aGUgZXhwZWN0ZWQgdmFsdWUsCisvLyB0aGUgY2hlY2sgcGFzc2VzIHRoZSBxdWVyeSB0byBhIHJlZ2V4LiBJZiBub25lIG9mIHRoZSBydWxlcyBnb3QgZW5vdWdoCisvLyB0cmlncmFtcywgdGhlIGNoZWNrIHRlbGxzIHRoYXQgdGhlIHF1ZXJ5IGlzIGRlZmluaXRlbHkgbm90IG1hdGNoZWQgYnkgYW55CisvLyBvZiB0aGUgcnVsZXMsIGFuZCBubyByZWdleCBtYXRjaGluZyBpcyBuZWVkZWQuCisvLyBBIHNpbWlsYXIgaWRlYSB3YXMgdXNlZCBpbiBHb29nbGUgQ29kZSBTZWFyY2ggYXMgZGVzY3JpYmVkIGluIHRoZSBibG9nIHBvc3Q6CisvLyBodHRwczovL3N3dGNoLmNvbS9+cnNjL3JlZ2V4cC9yZWdleHA0Lmh0bWwKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9UUklHUkFNSU5ERVhfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfVFJJR1JBTUlOREVYX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFN0cmluZ1JlZjsKKworY2xhc3MgVHJpZ3JhbUluZGV4IHsKKyBwdWJsaWM6CisgIC8vLyBJbnNlcnRzIGEgbmV3IFJlZ2V4IGludG8gdGhlIGluZGV4LgorICB2b2lkIGluc2VydChzdGQ6OnN0cmluZyBSZWdleCk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSwgaWYgc3BlY2lhbCBjYXNlIGxpc3QgZGVmaW5pdGVseSBkb2VzIG5vdCBoYXZlIGEgbGluZQorICAvLy8gdGhhdCBtYXRjaGVzIHRoZSBxdWVyeS4gUmV0dXJucyBmYWxzZSwgaWYgaXQncyBub3Qgc3VyZS4KKyAgYm9vbCBpc0RlZmluaXRlbHlPdXQoU3RyaW5nUmVmIFF1ZXJ5KSBjb25zdDsKKworICAvLy8gUmV0dXJuZWQgdHJ1ZSwgaWZmIHRoZSBoZXVyaXN0aWMgaXMgZGVmZWF0ZWQgYW5kIG5vdCB1c2VmdWwuCisgIC8vLyBJbiB0aGlzIGNhc2UgaXNEZWZpbml0ZWx5T3V0IGFsd2F5cyByZXR1cm5zIGZhbHNlLgorICBib29sIGlzRGVmZWF0ZWQoKSB7IHJldHVybiBEZWZlYXRlZDsgfQorIHByaXZhdGU6CisgIC8vIElmIHRydWUsIHRoZSBydWxlcyBhcmUgdG9vIGNvbXBsaWNhdGVkIGZvciB0aGUgY2hlY2sgdG8gd29yaywgYW5kIGZ1bGwKKyAgLy8gcmVnZXggbWF0Y2hpbmcgaXMgbmVlZGVkIGZvciBldmVyeSBydWxlLgorICBib29sIERlZmVhdGVkID0gZmFsc2U7CisgIC8vIFRoZSBtaW5pbXVtIG51bWJlciBvZiB0cmlncmFtcyB3aGljaCBzaG91bGQgbWF0Y2ggZm9yIGEgcnVsZSB0byBoYXZlIGEKKyAgLy8gY2hhbmNlIHRvIG1hdGNoIHRoZSBxdWVyeS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBlcXVhbHMgdGhlIG51bWJlciBvZgorICAvLyByZWdleCBydWxlcyBpbiB0aGUgU3BlY2lhbENhc2VMaXN0LgorICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gQ291bnRzOworICAvLyBJbmRleCBob2xkcyBhIGxpc3Qgb2YgcnVsZXMgaW5kaWNlcyBmb3IgZWFjaCB0cmlncmFtLiBUaGUgc2FtZSBpbmRpY2VzCisgIC8vIGFyZSB1c2VkIGluIENvdW50cyB0byBzdG9yZSBwZXItcnVsZSBsaW1pdHMuCisgIC8vIElmIGEgdHJpZ3JhbSBpcyB0b28gY29tbW9uICg+NCBydWxlcyB3aXRoIGl0KSwgd2Ugc3RvcCB0cmFja2luZyBpdCwKKyAgLy8gd2hpY2ggaW5jcmVhc2VzIHRoZSBwcm9iYWJpbGl0eSBmb3IgYSBuZWVkIHRvIG1hdGNoIHVzaW5nIHJlZ2V4LCBidXQKKyAgLy8gZGVjcmVhc2VzIHRoZSBjb3N0cyBpbiB0aGUgcmVndWxhciBjYXNlLgorICBzdGQ6OnVub3JkZXJlZF9tYXA8dW5zaWduZWQsIFNtYWxsVmVjdG9yPHNpemVfdCwgND4+IEluZGV4ezI1Nn07Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgIC8vIExMVk1fU1VQUE9SVF9UUklHUkFNSU5ERVhfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1R5cGVOYW1lLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVHlwZU5hbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWI3ZWFkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1R5cGVOYW1lLmgKQEAgLTAsMCArMSw2NSBAQAorLy89PT0tIFR5cGVOYW1lLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfVFlQRU5BTUVfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfVFlQRU5BTUVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFdlIHByb3ZpZGUgYSBmdW5jdGlvbiB3aGljaCB0cmllcyB0byBjb21wdXRlIHRoZSAoZGVtYW5nbGVkKSBuYW1lIG9mIGEgdHlwZQorLy8vIHN0YXRpY2FsbHkuCisvLy8KKy8vLyBUaGlzIHJvdXRpbmUgbWF5IGZhaWwgb24gc29tZSBwbGF0Zm9ybXMgb3IgZm9yIHBhcnRpY3VsYXJseSB1bnVzdWFsIHR5cGVzLgorLy8vIERvIG5vdCB1c2UgaXQgZm9yIGFueXRoaW5nIG90aGVyIHRoYW4gbG9nZ2luZyBhbmQgZGVidWdnaW5nIGFpZHMuIEl0IGlzbid0CisvLy8gcG9ydGFibGUgb3IgZGVwZW5kZW5kYWJsZSBpbiBhbnkgcmVhbCBzZW5zZS4KKy8vLworLy8vIFRoZSByZXR1cm5lZCBTdHJpbmdSZWYgd2lsbCBwb2ludCBpbnRvIGEgc3RhdGljIHN0b3JhZ2UgZHVyYXRpb24gc3RyaW5nLgorLy8vIEhvd2V2ZXIsIGl0IG1heSBub3QgYmUgbnVsbCB0ZXJtaW5hdGVkIGFuZCBtYXkgYmUgc29tZSBzdHJhbmdlbHkgYWxpZ25lZAorLy8vIGlubmVyIHN1YnN0cmluZyBvZiBhIGxhcmdlciBzdHJpbmcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzaXJlZFR5cGVOYW1lPgoraW5saW5lIFN0cmluZ1JlZiBnZXRUeXBlTmFtZSgpIHsKKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykgfHwgZGVmaW5lZChfX0dOVUNfXykKKyAgU3RyaW5nUmVmIE5hbWUgPSBfX1BSRVRUWV9GVU5DVElPTl9fOworCisgIFN0cmluZ1JlZiBLZXkgPSAiRGVzaXJlZFR5cGVOYW1lID0gIjsKKyAgTmFtZSA9IE5hbWUuc3Vic3RyKE5hbWUuZmluZChLZXkpKTsKKyAgYXNzZXJ0KCFOYW1lLmVtcHR5KCkgJiYgIlVuYWJsZSB0byBmaW5kIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIhIik7CisgIE5hbWUgPSBOYW1lLmRyb3BfZnJvbnQoS2V5LnNpemUoKSk7CisKKyAgYXNzZXJ0KE5hbWUuZW5kc3dpdGgoIl0iKSAmJiAiTmFtZSBkb2Vzbid0IGVuZCBpbiB0aGUgc3Vic3RpdHV0aW9uIGtleSEiKTsKKyAgcmV0dXJuIE5hbWUuZHJvcF9iYWNrKDEpOworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgU3RyaW5nUmVmIE5hbWUgPSBfX0ZVTkNTSUdfXzsKKworICBTdHJpbmdSZWYgS2V5ID0gImdldFR5cGVOYW1lPCI7CisgIE5hbWUgPSBOYW1lLnN1YnN0cihOYW1lLmZpbmQoS2V5KSk7CisgIGFzc2VydCghTmFtZS5lbXB0eSgpICYmICJVbmFibGUgdG8gZmluZCB0aGUgZnVuY3Rpb24gbmFtZSEiKTsKKyAgTmFtZSA9IE5hbWUuZHJvcF9mcm9udChLZXkuc2l6ZSgpKTsKKworICBmb3IgKFN0cmluZ1JlZiBQcmVmaXggOiB7ImNsYXNzICIsICJzdHJ1Y3QgIiwgInVuaW9uICIsICJlbnVtICJ9KQorICAgIGlmIChOYW1lLnN0YXJ0c3dpdGgoUHJlZml4KSkgeworICAgICAgTmFtZSA9IE5hbWUuZHJvcF9mcm9udChQcmVmaXguc2l6ZSgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBhdXRvIEFuZ2xlUG9zID0gTmFtZS5yZmluZCgnPicpOworICBhc3NlcnQoQW5nbGVQb3MgIT0gU3RyaW5nUmVmOjpucG9zICYmICJVbmFibGUgdG8gZmluZCB0aGUgY2xvc2luZyAnPichIik7CisgIHJldHVybiBOYW1lLnN1YnN0cigwLCBBbmdsZVBvcyk7CisjZWxzZQorICAvLyBObyBrbm93biB0ZWNobmlxdWUgZm9yIHN0YXRpY2FsbHkgZXh0cmFjdGluZyBhIHR5cGUgbmFtZSBvbiB0aGlzIGNvbXBpbGVyLgorICAvLyBXZSByZXR1cm4gYSBzdHJpbmcgdGhhdCBpcyB1bmxpa2VseSB0byBsb29rIGxpa2UgYW55IHR5cGUgaW4gTExWTS4KKyAgcmV0dXJuICJVTktOT1dOX1RZUEUiOworI2VuZGlmCit9CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVW5pY29kZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1VuaWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTU0ODRmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1VuaWNvZGUuaApAQCAtMCwwICsxLDcxIEBACisvLz09PS0gbGx2bS9TdXBwb3J0L1VuaWNvZGUuaCAtIFVuaWNvZGUgY2hhcmFjdGVyIHByb3BlcnRpZXMgIC0qLSBDKysgLSotPT09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGZ1bmN0aW9ucyB0aGF0IGFsbG93IHF1ZXJ5aW5nIGNlcnRhaW4gcHJvcGVydGllcyBvZiBVbmljb2RlCisvLyBjaGFyYWN0ZXJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1VOSUNPREVfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfVU5JQ09ERV9ICisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFN0cmluZ1JlZjsKKworbmFtZXNwYWNlIHN5cyB7CituYW1lc3BhY2UgdW5pY29kZSB7CisKK2VudW0gQ29sdW1uV2lkdGhFcnJvcnMgeworICBFcnJvckludmFsaWRVVEY4ID0gLTIsCisgIEVycm9yTm9uUHJpbnRhYmxlQ2hhcmFjdGVyID0gLTEKK307CisKKy8vLyBEZXRlcm1pbmVzIGlmIGEgY2hhcmFjdGVyIGlzIGxpa2VseSB0byBiZSBkaXNwbGF5ZWQgY29ycmVjdGx5IG9uIHRoZQorLy8vIHRlcm1pbmFsLiBFeGFjdCBpbXBsZW1lbnRhdGlvbiB3b3VsZCBoYXZlIHRvIGRlcGVuZCBvbiB0aGUgc3BlY2lmaWMKKy8vLyB0ZXJtaW5hbCwgc28gd2UgZGVmaW5lIHRoZSBzZW1hbnRpYyB0aGF0IHNob3VsZCBiZSBzdWl0YWJsZSBmb3IgZ2VuZXJpYyBjYXNlCisvLy8gb2YgYSB0ZXJtaW5hbCBjYXBhYmxlIHRvIG91dHB1dCBVbmljb2RlIGNoYXJhY3RlcnMuCisvLy8KKy8vLyBBbGwgY2hhcmFjdGVycyBmcm9tIHRoZSBVbmljb2RlIGNvZGUgcG9pbnQgcmFuZ2UgYXJlIGNvbnNpZGVyZWQgcHJpbnRhYmxlCisvLy8gZXhjZXB0IGZvcjoKKy8vLyAgICogQzAgYW5kIEMxIGNvbnRyb2wgY2hhcmFjdGVyIHJhbmdlczsKKy8vLyAgICogZGVmYXVsdCBpZ25vcmFibGUgY29kZSBwb2ludHMgYXMgcGVyIDUuMjEgb2YKKy8vLyAgICAgaHR0cDovL3d3dy51bmljb2RlLm9yZy92ZXJzaW9ucy9Vbmljb2RlNi4yLjAvVW5pY29kZVN0YW5kYXJkLTYuMi5wZGYKKy8vLyAgICAgZXhjZXB0IGZvciBVKzAwQUQgU09GVCBIWVBIRU4sIGFzIGl0J3MgYWN0dWFsbHkgZGlzcGxheWVkIG9uIG1vc3QKKy8vLyAgICAgdGVybWluYWxzOworLy8vICAgKiBmb3JtYXQgY2hhcmFjdGVycyAoY2F0ZWdvcnkgPSBDZik7CisvLy8gICAqIHN1cnJvZ2F0ZXMgKGNhdGVnb3J5ID0gQ3MpOworLy8vICAgKiB1bmFzc2lnbmVkIGNoYXJhY3RlcnMgKGNhdGVnb3J5ID0gQ24pLgorLy8vIFxyZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIGlzIGNvbnNpZGVyZWQgcHJpbnRhYmxlLgorYm9vbCBpc1ByaW50YWJsZShpbnQgVUNTKTsKKworLy8vIEdldHMgdGhlIG51bWJlciBvZiBwb3NpdGlvbnMgdGhlIFVURjgtZW5jb2RlZCBccCBUZXh0IGlzIGxpa2VseSB0byBvY2N1cHkKKy8vLyB3aGVuIG91dHB1dCBvbiBhIHRlcm1pbmFsICgiY2hhcmFjdGVyIHdpZHRoIikuIFRoaXMgZGVwZW5kcyBvbiB0aGUKKy8vLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGVybWluYWwsIGFuZCB0aGVyZSdzIG5vIHN0YW5kYXJkIGRlZmluaXRpb24gb2YKKy8vLyBjaGFyYWN0ZXIgd2lkdGguCisvLy8KKy8vLyBUaGUgaW1wbGVtZW50YXRpb24gZGVmaW5lcyBpdCBpbiBhIHdheSB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlIGNvbXBhdGlibGUKKy8vLyB3aXRoIGEgZ2VuZXJpYyBVbmljb2RlLWNhcGFibGUgdGVybWluYWwuCisvLy8KKy8vLyBccmV0dXJuIENoYXJhY3RlciB3aWR0aDoKKy8vLyAgICogRXJyb3JOb25QcmludGFibGVDaGFyYWN0ZXIgKC0xKSBpZiBccCBUZXh0IGNvbnRhaW5zIG5vbi1wcmludGFibGUKKy8vLyAgICAgY2hhcmFjdGVycyAoYXMgaWRlbnRpZmllZCBieSBpc1ByaW50YWJsZSk7CisvLy8gICAqIDAgZm9yIGVhY2ggbm9uLXNwYWNpbmcgYW5kIGVuY2xvc2luZyBjb21iaW5pbmcgbWFyazsKKy8vLyAgICogMiBmb3IgZWFjaCBDSksgY2hhcmFjdGVyIGV4Y2x1ZGluZyBoYWxmd2lkdGggZm9ybXM7CisvLy8gICAqIDEgZm9yIGVhY2ggb2YgdGhlIHJlbWFpbmluZyBjaGFyYWN0ZXJzLgoraW50IGNvbHVtbldpZHRoVVRGOChTdHJpbmdSZWYgVGV4dCk7CisKKy8vLyBGb2xkIGlucHV0IHVuaWNvZGUgY2hhcmFjdGVyIGFjY29yZGluZyB0aGUgdGhlIFNpbXBsZSB1bmljb2RlIGNhc2UgZm9sZGluZworLy8vIHJ1bGVzLgoraW50IGZvbGRDaGFyU2ltcGxlKGludCBDKTsKKworfSAvLyBuYW1lc3BhY2UgdW5pY29kZQorfSAvLyBuYW1lc3BhY2Ugc3lzCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1VuaWNvZGVDaGFyUmFuZ2VzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVW5pY29kZUNoYXJSYW5nZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzY1NTgzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1VuaWNvZGVDaGFyUmFuZ2VzLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8vPT09LS0tIFVuaWNvZGVDaGFyUmFuZ2VzLmggLSBUeXBlcyBhbmQgZnVuY3Rpb25zIGZvciBjaGFyYWN0ZXIgcmFuZ2VzIC0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fU1VQUE9SVF9VTklDT0RFQ0hBUlJBTkdFU19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9VTklDT0RFQ0hBUlJBTkdFU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L011dGV4LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L011dGV4R3VhcmQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNkZWZpbmUgREVCVUdfVFlQRSAidW5pY29kZSIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHN5cyB7CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIGNsb3NlZCByYW5nZSBvZiBVbmljb2RlIGNvZGUgcG9pbnRzIFtMb3dlciwgVXBwZXJdLgorc3RydWN0IFVuaWNvZGVDaGFyUmFuZ2UgeworICB1aW50MzJfdCBMb3dlcjsKKyAgdWludDMyX3QgVXBwZXI7Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwodWludDMyX3QgVmFsdWUsIFVuaWNvZGVDaGFyUmFuZ2UgUmFuZ2UpIHsKKyAgcmV0dXJuIFZhbHVlIDwgUmFuZ2UuTG93ZXI7Cit9CitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoVW5pY29kZUNoYXJSYW5nZSBSYW5nZSwgdWludDMyX3QgVmFsdWUpIHsKKyAgcmV0dXJuIFJhbmdlLlVwcGVyIDwgVmFsdWU7Cit9CisKKy8vLyBcYnJpZWYgSG9sZHMgYSByZWZlcmVuY2UgdG8gYW4gb3JkZXJlZCBhcnJheSBvZiBVbmljb2RlQ2hhclJhbmdlIGFuZCBhbGxvd3MKKy8vLyB0byBxdWlja2x5IGNoZWNrIGlmIGEgY29kZSBwb2ludCBpcyBjb250YWluZWQgaW4gdGhlIHNldCByZXByZXNlbnRlZCBieSB0aGlzCisvLy8gYXJyYXkuCitjbGFzcyBVbmljb2RlQ2hhclNldCB7CitwdWJsaWM6CisgIHR5cGVkZWYgQXJyYXlSZWY8VW5pY29kZUNoYXJSYW5nZT4gQ2hhclJhbmdlczsKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdHMgYSBVbmljb2RlQ2hhclNldCBpbnN0YW5jZSBmcm9tIGFuIGFycmF5IG9mCisgIC8vLyBVbmljb2RlQ2hhclJhbmdlcy4KKyAgLy8vCisgIC8vLyBBcnJheSBwb2ludGVkIGJ5IFxwIFJhbmdlcyBzaG91bGQgaGF2ZSB0aGUgbGlmZXRpbWUgYXQgbGVhc3QgYXMgbG9uZyBhcworICAvLy8gdGhlIFVuaWNvZGVDaGFyU2V0IGluc3RhbmNlLCBhbmQgc2hvdWxkIG5vdCBjaGFuZ2UuIEFycmF5IGlzIHZhbGlkYXRlZCBieQorICAvLy8gdGhlIGNvbnN0cnVjdG9yLCBzbyBpdCBtYWtlcyBzZW5zZSB0byBjcmVhdGUgYXMgZmV3IFVuaWNvZGVDaGFyU2V0CisgIC8vLyBpbnN0YW5jZXMgcGVyIGVhY2ggYXJyYXkgb2YgcmFuZ2VzLCBhcyBwb3NzaWJsZS4KKyNpZmRlZiBOREVCVUcKKworICAvLyBGSVhNRTogVGhpcyBjb3VsZCB1c2UgY29uc3RleHByICsgc3RhdGljX2Fzc2VydC4gVGhpcyB3YXkgd2UKKyAgLy8gbWF5IGdldCByaWQgb2YgTkRFQlVHIGluIHRoaXMgaGVhZGVyLiBVbmZvcnR1bmF0ZWx5IHRoZXJlIGFyZSBzb21lCisgIC8vIHByb2JsZW1zIHRvIGdldCB0aGlzIHdvcmtpbmcgd2l0aCBNU1ZDIDIwMTMuIENoYW5nZSB0aGlzIHdoZW4KKyAgLy8gdGhlIHN1cHBvcnQgZm9yIE1TVkMgMjAxMyBpcyBkcm9wcGVkLgorICBjb25zdGV4cHIgVW5pY29kZUNoYXJTZXQoQ2hhclJhbmdlcyBSYW5nZXMpIDogUmFuZ2VzKFJhbmdlcykge30KKyNlbHNlCisgIFVuaWNvZGVDaGFyU2V0KENoYXJSYW5nZXMgUmFuZ2VzKSA6IFJhbmdlcyhSYW5nZXMpIHsKKyAgICBhc3NlcnQocmFuZ2VzQXJlVmFsaWQoKSk7CisgIH0KKyNlbmRpZgorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgc2V0IGNvbnRhaW5zIHRoZSBVbmljb2RlIGNvZGUgcG9pbnQKKyAgLy8vIFxwIEMuCisgIGJvb2wgY29udGFpbnModWludDMyX3QgQykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OmJpbmFyeV9zZWFyY2goUmFuZ2VzLmJlZ2luKCksIFJhbmdlcy5lbmQoKSwgQyk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgZWFjaCBvZiB0aGUgcmFuZ2VzIGlzIGEgcHJvcGVyIGNsb3NlZCByYW5nZQorICAvLy8gW21pbiwgbWF4XSwgYW5kIGlmIHRoZSByYW5nZXMgdGhlbXNlbHZlcyBhcmUgb3JkZXJlZCBhbmQgbm9uLW92ZXJsYXBwaW5nLgorICBib29sIHJhbmdlc0FyZVZhbGlkKCkgY29uc3QgeworICAgIHVpbnQzMl90IFByZXYgPSAwOworICAgIGZvciAoQ2hhclJhbmdlczo6Y29uc3RfaXRlcmF0b3IgSSA9IFJhbmdlcy5iZWdpbigpLCBFID0gUmFuZ2VzLmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmIChJICE9IFJhbmdlcy5iZWdpbigpICYmIFByZXYgPj0gSS0+TG93ZXIpIHsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJVcHBlciBib3VuZCAweCIpOworICAgICAgICBERUJVRyhkYmdzKCkud3JpdGVfaGV4KFByZXYpKTsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICIgc2hvdWxkIGJlIGxlc3MgdGhhbiBzdWNjZWVkaW5nIGxvd2VyIGJvdW5kIDB4Iik7CisgICAgICAgIERFQlVHKGRiZ3MoKS53cml0ZV9oZXgoSS0+TG93ZXIpIDw8ICJcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoSS0+VXBwZXIgPCBJLT5Mb3dlcikgeworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlVwcGVyIGJvdW5kIDB4Iik7CisgICAgICAgIERFQlVHKGRiZ3MoKS53cml0ZV9oZXgoSS0+TG93ZXIpKTsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICIgc2hvdWxkIG5vdCBiZSBsZXNzIHRoYW4gbG93ZXIgYm91bmQgMHgiKTsKKyAgICAgICAgREVCVUcoZGJncygpLndyaXRlX2hleChJLT5VcHBlcikgPDwgIlxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIFByZXYgPSBJLT5VcHBlcjsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNvbnN0IENoYXJSYW5nZXMgUmFuZ2VzOworfTsKKworfSAvLyBuYW1lc3BhY2Ugc3lzCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyN1bmRlZiBERUJVR19UWVBFIC8vICJ1bmljb2RlIgorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX1VOSUNPREVDSEFSUkFOR0VTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9VbmlxdWVMb2NrLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVW5pcXVlTG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Njc1ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVW5pcXVlTG9jay5oCkBAIC0wLDAgKzEsNjkgQEAKKy8vPT09LSBTdXBwb3J0L1VuaXF1ZUxvY2suaCAtIEFjcXVpcmUvUmVsZWFzZSBNdXRleCBJbiBTY29wZSAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBndWFyZCBmb3IgYSBibG9jayBvZiBjb2RlIHRoYXQgZW5zdXJlcyBhIE11dGV4IGlzIGxvY2tlZAorLy8gdXBvbiBjb25zdHJ1Y3Rpb24gYW5kIHJlbGVhc2VkIHVwb24gZGVzdHJ1Y3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfVU5JUVVFX0xPQ0tfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfVU5JUVVFX0xPQ0tfSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworCisgIC8vLyBBIHBhcmVkLWRvd24gaW1pdGF0aW9uIG9mIHN0ZDo6dW5pcXVlX2xvY2sgZnJvbSBDKysxMS4gQ29udHJhcnkgdG8gdGhlCisgIC8vLyBuYW1lLCBpdCdzIHJlYWxseSBtb3JlIG9mIGEgd3JhcHBlciBmb3IgYSBsb2NrLiBJdCBtYXkgb3IgbWF5IG5vdCBoYXZlCisgIC8vLyBhbiBhc3NvY2lhdGVkIG11dGV4LCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGxvY2tlZCB1cG9uIGNyZWF0aW9uCisgIC8vLyBhbmQgdW5sb2NrZWQgYWZ0ZXIgZGVzdHJ1Y3Rpb24uIHVuaXF1ZV9sb2NrIGNhbiBhbHNvIHVubG9jayB0aGUgbXV0ZXgKKyAgLy8vIGFuZCByZS1sb2NrIGl0IGZyZWVseSBkdXJpbmcgaXRzIGxpZmV0aW1lLgorICAvLy8gQGJyaWVmIEd1YXJkIGEgc2VjdGlvbiBvZiBjb2RlIHdpdGggYSBtdXRleC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTXV0ZXhUPgorICBjbGFzcyB1bmlxdWVfbG9jayB7CisgICAgTXV0ZXhUICpNID0gbnVsbHB0cjsKKyAgICBib29sIGxvY2tlZCA9IGZhbHNlOworCisgIHB1YmxpYzoKKyAgICB1bmlxdWVfbG9jaygpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCB1bmlxdWVfbG9jayhNdXRleFQgJm0pIDogTSgmbSksIGxvY2tlZCh0cnVlKSB7IE0tPmxvY2soKTsgfQorICAgIHVuaXF1ZV9sb2NrKGNvbnN0IHVuaXF1ZV9sb2NrICYpID0gZGVsZXRlOworICAgICB1bmlxdWVfbG9jayAmb3BlcmF0b3I9KGNvbnN0IHVuaXF1ZV9sb2NrICYpID0gZGVsZXRlOworCisgICAgdm9pZCBvcGVyYXRvcj0odW5pcXVlX2xvY2sgJiZvKSB7CisgICAgICBpZiAob3duc19sb2NrKCkpCisgICAgICAgIE0tPnVubG9jaygpOworICAgICAgTSA9IG8uTTsKKyAgICAgIGxvY2tlZCA9IG8ubG9ja2VkOworICAgICAgby5NID0gbnVsbHB0cjsKKyAgICAgIG8ubG9ja2VkID0gZmFsc2U7CisgICAgfQorCisgICAgfnVuaXF1ZV9sb2NrKCkgeyBpZiAob3duc19sb2NrKCkpIE0tPnVubG9jaygpOyB9CisKKyAgICB2b2lkIGxvY2soKSB7CisgICAgICBhc3NlcnQoIWxvY2tlZCAmJiAibXV0ZXggYWxyZWFkeSBsb2NrZWQhIik7CisgICAgICBhc3NlcnQoTSAmJiAibm8gYXNzb2NpYXRlZCBtdXRleCEiKTsKKyAgICAgIE0tPmxvY2soKTsKKyAgICAgIGxvY2tlZCA9IHRydWU7CisgICAgfQorCisgICAgdm9pZCB1bmxvY2soKSB7CisgICAgICBhc3NlcnQobG9ja2VkICYmICJ1bmxvY2tpbmcgYSBtdXRleCB0aGF0IGlzbid0IGxvY2tlZCEiKTsKKyAgICAgIGFzc2VydChNICYmICJubyBhc3NvY2lhdGVkIG11dGV4ISIpOworICAgICAgTS0+dW5sb2NrKCk7CisgICAgICBsb2NrZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIG93bnNfbG9jaygpIHsgcmV0dXJuIGxvY2tlZDsgfQorICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX1VOSVFVRV9MT0NLX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9WQ1NSZXZpc2lvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1ZDU1JldmlzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxMGVhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9WQ1NSZXZpc2lvbi5oCkBAIC0wLDAgKzEgQEAKKyNkZWZpbmUgTExWTV9SRVZJU0lPTiAiZ2l0LTFkNzM5ZmZiMDM2IgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1ZhbGdyaW5kLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVmFsZ3JpbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODRiOTAxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1ZhbGdyaW5kLmgKQEAgLTAsMCArMSwzMiBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9WYWxncmluZC5oIC0gQ29tbXVuaWNhdGlvbiB3aXRoIFZhbGdyaW5kIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBNZXRob2RzIGZvciBjb21tdW5pY2F0aW5nIHdpdGggYSB2YWxncmluZCBpbnN0YW5jZSB0aGlzIHByb2dyYW0gaXMgcnVubmluZworLy8gdW5kZXIuICBUaGVzZSBhcmUgYWxsIG5vLW9wcyB1bmxlc3MgTExWTSB3YXMgY29uZmlndXJlZCBvbiBhIHN5c3RlbSB3aXRoIHRoZQorLy8gdmFsZ3JpbmQgaGVhZGVycyBpbnN0YWxsZWQgYW5kIHZhbGdyaW5kIGlzIGNvbnRyb2xsaW5nIHRoaXMgcHJvY2Vzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9WQUxHUklORF9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9WQUxHUklORF9ICisKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugc3lzIHsKKyAgLy8gVHJ1ZSBpZiBWYWxncmluZCBpcyBjb250cm9sbGluZyB0aGlzIHByb2Nlc3MuCisgIGJvb2wgUnVubmluZ09uVmFsZ3JpbmQoKTsKKworICAvLyBEaXNjYXJkIHZhbGdyaW5kJ3MgdHJhbnNsYXRpb24gb2YgY29kZSBpbiB0aGUgcmFuZ2UgW0FkZHIgLi4gQWRkciArIExlbikuCisgIC8vIE90aGVyd2lzZSB2YWxncmluZCBtYXkgY29udGludWUgdG8gZXhlY3V0ZSB0aGUgb2xkIHZlcnNpb24gb2YgdGhlIGNvZGUuCisgIHZvaWQgVmFsZ3JpbmREaXNjYXJkVHJhbnNsYXRpb25zKGNvbnN0IHZvaWQgKkFkZHIsIHNpemVfdCBMZW4pOworfSAvLyBuYW1lc3BhY2Ugc3lzCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX1ZBTEdSSU5EX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9XYXRjaGRvZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1dhdGNoZG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlMWQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9XYXRjaGRvZy5oCkBAIC0wLDAgKzEsMzggQEAKKy8vPT09LS0tIFdhdGNoZG9nLmggLSBXYXRjaGRvZyB0aW1lciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgbGx2bTo6c3lzOjpXYXRjaGRvZyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9XQVRDSERPR19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9XQVRDSERPR19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBuYW1lc3BhY2Ugc3lzIHsKKworICAgIC8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIGZvciBhIHRpbWVvdXQgYXJvdW5kIGFuIG9wZXJhdGlvbgorICAgIC8vLyB0aGF0IG11c3QgY29tcGxldGUgaW4gYSBnaXZlbiBhbW91bnQgb2YgdGltZS4gRmFpbHVyZSB0byBjb21wbGV0ZSBiZWZvcmUKKyAgICAvLy8gdGhlIHRpbWVvdXQgaXMgYW4gdW5yZWNvdmVyYWJsZSBzaXR1YXRpb24gYW5kIG5vIG1lY2hhbmlzbXMgdG8gYXR0ZW1wdAorICAgIC8vLyB0byBoYW5kbGUgaXQgYXJlIHByb3ZpZGVkLgorICAgIGNsYXNzIFdhdGNoZG9nIHsKKyAgICBwdWJsaWM6CisgICAgICBXYXRjaGRvZyh1bnNpZ25lZCBpbnQgc2Vjb25kcyk7CisgICAgICB+V2F0Y2hkb2coKTsKKyAgICBwcml2YXRlOgorICAgICAgLy8gTm9uY29weWFibGUuCisgICAgICBXYXRjaGRvZyhjb25zdCBXYXRjaGRvZyAmb3RoZXIpID0gZGVsZXRlOworICAgICAgV2F0Y2hkb2cgJm9wZXJhdG9yPShjb25zdCBXYXRjaGRvZyAmb3RoZXIpID0gZGVsZXRlOworICAgIH07CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvV2luNjRFSC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1dpbjY0RUguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmM0OTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1dpbjY0RUguaApAQCAtMCwwICsxLDE0NyBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvV2luNjRFSC5oIC0tLVdpbjY0IEVIIENvbnN0YW50cy0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgY29uc3RhbnRzIGFuZCBzdHJ1Y3R1cmVzIHVzZWQgZm9yIGltcGxlbWVudGluZworLy8gZXhjZXB0aW9uIGhhbmRsaW5nIG9uIFdpbjY0IHBsYXRmb3Jtcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQorLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5LzFleWFzOHRmLmFzcHgKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9XSU42NEVIX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1dJTjY0RUhfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIFdpbjY0RUggeworCisvLy8gVW53aW5kT3Bjb2RlcyAtIEVudW1lcmF0aW9uIHdob3NlIHZhbHVlcyBzcGVjaWZ5IGEgc2luZ2xlIG9wZXJhdGlvbiBpbgorLy8vIHRoZSBwcm9sb2cgb2YgYSBmdW5jdGlvbi4KK2VudW0gVW53aW5kT3Bjb2RlcyB7CisgIFVPUF9QdXNoTm9uVm9sID0gMCwKKyAgVU9QX0FsbG9jTGFyZ2UsCisgIFVPUF9BbGxvY1NtYWxsLAorICBVT1BfU2V0RlBSZWcsCisgIFVPUF9TYXZlTm9uVm9sLAorICBVT1BfU2F2ZU5vblZvbEJpZywKKyAgVU9QX1NhdmVYTU0xMjggPSA4LAorICBVT1BfU2F2ZVhNTTEyOEJpZywKKyAgVU9QX1B1c2hNYWNoRnJhbWUKK307CisKKy8vLyBVbndpbmRDb2RlIC0gVGhpcyB1bmlvbiBkZXNjcmliZXMgYSBzaW5nbGUgb3BlcmF0aW9uIGluIGEgZnVuY3Rpb24gcHJvbG9nLAorLy8vIG9yIHBhcnQgdGhlcmVvZi4KK3VuaW9uIFVud2luZENvZGUgeworICBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgQ29kZU9mZnNldDsKKyAgICB1aW50OF90IFVud2luZE9wQW5kT3BJbmZvOworICB9IHU7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IEZyYW1lT2Zmc2V0OworCisgIHVpbnQ4X3QgZ2V0VW53aW5kT3AoKSBjb25zdCB7CisgICAgcmV0dXJuIHUuVW53aW5kT3BBbmRPcEluZm8gJiAweDBGOworICB9CisgIHVpbnQ4X3QgZ2V0T3BJbmZvKCkgY29uc3QgeworICAgIHJldHVybiAodS5VbndpbmRPcEFuZE9wSW5mbyA+PiA0KSAmIDB4MEY7CisgIH0KK307CisKK2VudW0geworICAvLy8gVU5XX0V4Y2VwdGlvbkhhbmRsZXIgLSBTcGVjaWZpZXMgdGhhdCB0aGlzIGZ1bmN0aW9uIGhhcyBhbiBleGNlcHRpb24KKyAgLy8vIGhhbmRsZXIuCisgIFVOV19FeGNlcHRpb25IYW5kbGVyID0gMHgwMSwKKyAgLy8vIFVOV19UZXJtaW5hdGVIYW5kbGVyIC0gU3BlY2lmaWVzIHRoYXQgdGhpcyBmdW5jdGlvbiBoYXMgYSB0ZXJtaW5hdGlvbgorICAvLy8gaGFuZGxlci4KKyAgVU5XX1Rlcm1pbmF0ZUhhbmRsZXIgPSAweDAyLAorICAvLy8gVU5XX0NoYWluSW5mbyAtIFNwZWNpZmllcyB0aGF0IHRoaXMgVW53aW5kSW5mbyBzdHJ1Y3R1cmUgaXMgY2hhaW5lZCB0bworICAvLy8gYW5vdGhlciBvbmUuCisgIFVOV19DaGFpbkluZm8gPSAweDA0Cit9OworCisvLy8gUnVudGltZUZ1bmN0aW9uIC0gQW4gZW50cnkgaW4gdGhlIHRhYmxlIG9mIGZ1bmN0aW9ucyB3aXRoIHVud2luZCBpbmZvLgorc3RydWN0IFJ1bnRpbWVGdW5jdGlvbiB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFN0YXJ0QWRkcmVzczsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRW5kQWRkcmVzczsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVW53aW5kSW5mb09mZnNldDsKK307CisKKy8vLyBVbndpbmRJbmZvIC0gQW4gZW50cnkgaW4gdGhlIGV4Y2VwdGlvbiB0YWJsZS4KK3N0cnVjdCBVbndpbmRJbmZvIHsKKyAgdWludDhfdCBWZXJzaW9uQW5kRmxhZ3M7CisgIHVpbnQ4X3QgUHJvbG9nU2l6ZTsKKyAgdWludDhfdCBOdW1Db2RlczsKKyAgdWludDhfdCBGcmFtZVJlZ2lzdGVyQW5kT2Zmc2V0OworICBVbndpbmRDb2RlIFVud2luZENvZGVzWzFdOworCisgIHVpbnQ4X3QgZ2V0VmVyc2lvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyc2lvbkFuZEZsYWdzICYgMHgwNzsKKyAgfQorICB1aW50OF90IGdldEZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiAoVmVyc2lvbkFuZEZsYWdzID4+IDMpICYgMHgxZjsKKyAgfQorICB1aW50OF90IGdldEZyYW1lUmVnaXN0ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIEZyYW1lUmVnaXN0ZXJBbmRPZmZzZXQgJiAweDBmOworICB9CisgIHVpbnQ4X3QgZ2V0RnJhbWVPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIChGcmFtZVJlZ2lzdGVyQW5kT2Zmc2V0ID4+IDQpICYgMHgwZjsKKyAgfQorCisgIC8vIFRoZSBkYXRhIGFmdGVyIHVud2luZENvZGVzIGRlcGVuZHMgb24gZmxhZ3MuCisgIC8vIElmIFVOV19FeGNlcHRpb25IYW5kbGVyIG9yIFVOV19UZXJtaW5hdGVIYW5kbGVyIGlzIHNldCB0aGVuIGZvbGxvd3MKKyAgLy8gdGhlIGFkZHJlc3Mgb2YgdGhlIGxhbmd1YWdlLXNwZWNpZmljIGV4Y2VwdGlvbiBoYW5kbGVyLgorICAvLyBJZiBVTldfQ2hhaW5JbmZvIGlzIHNldCB0aGVuIGZvbGxvd3MgYSBSdW50aW1lRnVuY3Rpb24gd2hpY2ggZGVmaW5lcworICAvLyB0aGUgY2hhaW5lZCB1bndpbmQgaW5mby4KKyAgLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBNU0ROIGF0OgorICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZGRzc3h4eTguYXNweAorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHBvaW50ZXIgdG8gbGFuZ3VhZ2Ugc3BlY2lmaWMgZGF0YSBwYXJ0IG9mIFVud2luZEluZm8uCisgIHZvaWQgKmdldExhbmd1YWdlU3BlY2lmaWNEYXRhKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQgKj4oJlVud2luZENvZGVzWyhOdW1Db2RlcysxKSAmIH4xXSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBwb2ludGVyIHRvIGxhbmd1YWdlIHNwZWNpZmljIGRhdGEgcGFydCBvZiBVbndpbmRJbmZvLgorICBjb25zdCB2b2lkICpnZXRMYW5ndWFnZVNwZWNpZmljRGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkICo+KCZVbndpbmRDb2Rlc1soTnVtQ29kZXMgKyAxKSAmIH4xXSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBpbWFnZS1yZWxhdGl2ZSBvZmZzZXQgb2YgbGFuZ3VhZ2Utc3BlY2lmaWMgZXhjZXB0aW9uIGhhbmRsZXIuCisgIHVpbnQzMl90IGdldExhbmd1YWdlU3BlY2lmaWNIYW5kbGVyT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdXBwb3J0Ojp1bGl0dGxlMzJfdCAqPigKKyAgICAgICAgICAgICAgIGdldExhbmd1YWdlU3BlY2lmaWNEYXRhKCkpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgaW1hZ2UtcmVsYXRpdmUgb2Zmc2V0IG9mIGxhbmd1YWdlLXNwZWNpZmljIGV4Y2VwdGlvbiBoYW5kbGVyLgorICB2b2lkIHNldExhbmd1YWdlU3BlY2lmaWNIYW5kbGVyT2Zmc2V0KHVpbnQzMl90IG9mZnNldCkgeworICAgICpyZWludGVycHJldF9jYXN0PHN1cHBvcnQ6OnVsaXR0bGUzMl90ICo+KGdldExhbmd1YWdlU3BlY2lmaWNEYXRhKCkpID0KKyAgICAgICAgb2Zmc2V0OworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gcG9pbnRlciB0byBleGNlcHRpb24tc3BlY2lmaWMgZGF0YS4KKyAgdm9pZCAqZ2V0RXhjZXB0aW9uRGF0YSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QgKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExhbmd1YWdlU3BlY2lmaWNEYXRhKCkpKzEpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gcG9pbnRlciB0byBjaGFpbmVkIHVud2luZCBpbmZvLgorICBSdW50aW1lRnVuY3Rpb24gKmdldENoYWluZWRGdW5jdGlvbkVudHJ5KCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFJ1bnRpbWVGdW5jdGlvbiAqPihnZXRMYW5ndWFnZVNwZWNpZmljRGF0YSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHBvaW50ZXIgdG8gY2hhaW5lZCB1bndpbmQgaW5mby4KKyAgY29uc3QgUnVudGltZUZ1bmN0aW9uICpnZXRDaGFpbmVkRnVuY3Rpb25FbnRyeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBSdW50aW1lRnVuY3Rpb24gKj4oZ2V0TGFuZ3VhZ2VTcGVjaWZpY0RhdGEoKSk7CisgIH0KK307CisKKworfSAvLyBFbmQgb2YgbmFtZXNwYWNlIFdpbjY0RUgKK30gLy8gRW5kIG9mIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1dpbmRvd3NFcnJvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1dpbmRvd3NFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYmZlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvV2luZG93c0Vycm9yLmgKQEAgLTAsMCArMSwxOSBAQAorLy89PT0tLSBXaW5kb3dzRXJyb3IuaCAtIFN1cHBvcnQgZm9yIG1hcHBpbmcgd2luZG93cyBlcnJvcnMgdG8gcG9zaXgtLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfV0lORE9XU0VSUk9SX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1dJTkRPV1NFUlJPUl9ICisKKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK3N0ZDo6ZXJyb3JfY29kZSBtYXBXaW5kb3dzRXJyb3IodW5zaWduZWQgRVYpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9XaXRoQ29sb3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9XaXRoQ29sb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWM5OTUzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1dpdGhDb2xvci5oCkBAIC0wLDAgKzEsNDggQEAKKy8vPT09LSBXaXRoQ29sb3IuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1dJVEhDT0xPUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9XSVRIQ09MT1JfSAorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLyBTeW1ib2xpYyBuYW1lcyBmb3IgdmFyaW91cyBzeW50YXggZWxlbWVudHMuCitlbnVtIGNsYXNzIEhpZ2hsaWdodENvbG9yIHsKKyAgQWRkcmVzcywKKyAgU3RyaW5nLAorICBUYWcsCisgIEF0dHJpYnV0ZSwKKyAgRW51bWVyYXRvciwKKyAgTWFjcm8sCisgIEVycm9yLAorICBXYXJuaW5nLAorICBOb3RlCit9OworCisvLy8gQW4gUkFJSSBvYmplY3QgdGhhdCB0ZW1wb3JhcmlseSBzd2l0Y2hlcyBhbiBvdXRwdXQgc3RyZWFtIHRvIGEgc3BlY2lmaWMKKy8vLyBjb2xvci4KK2NsYXNzIFdpdGhDb2xvciB7CisgIHJhd19vc3RyZWFtICZPUzsKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIGNvbG9ycyBzaG91bGQgYmUgZGlzcGxheWVkLgorICBib29sIGNvbG9yc0VuYWJsZWQocmF3X29zdHJlYW0gJk9TKTsKKworcHVibGljOgorICAvLy8gVG8gYmUgdXNlZCBsaWtlIHRoaXM6IFdpdGhDb2xvcihPUywgSGlnaGxpZ2h0Q29sb3I6OlN0cmluZykgPDwgInRleHQiOworICBXaXRoQ29sb3IocmF3X29zdHJlYW0gJk9TLCBIaWdobGlnaHRDb2xvciBTKTsKKyAgfldpdGhDb2xvcigpOworCisgIHJhd19vc3RyZWFtICZnZXQoKSB7IHJldHVybiBPUzsgfQorICBvcGVyYXRvciByYXdfb3N0cmVhbSAmKCkgeyByZXR1cm4gT1M7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0xJQl9ERUJVR0lORk9fV0lUSENPTE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9YODZEaXNhc3NlbWJsZXJEZWNvZGVyQ29tbW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvWDg2RGlzYXNzZW1ibGVyRGVjb2RlckNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZmZiOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvWDg2RGlzYXNzZW1ibGVyRGVjb2RlckNvbW1vbi5oCkBAIC0wLDAgKzEsNDY5IEBACisvLz09PS0tIFg4NkRpc2Fzc2VtYmxlckRlY29kZXJDb21tb24uaCAtIERpc2Fzc2VtYmxlciBkZWNvZGVyIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBYODYgRGlzYXNzZW1ibGVyLgorLy8gSXQgY29udGFpbnMgY29tbW9uIGRlZmluaXRpb25zIHVzZWQgYnkgYm90aCB0aGUgZGlzYXNzZW1ibGVyIGFuZCB0aGUgdGFibGUKKy8vICBnZW5lcmF0b3IuCisvLyBEb2N1bWVudGF0aW9uIGZvciB0aGUgZGlzYXNzZW1ibGVyIGNhbiBiZSBmb3VuZCBpbiBYODZEaXNhc3NlbWJsZXIuaC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTElCX1RBUkdFVF9YODZfRElTQVNTRU1CTEVSX1g4NkRJU0FTU0VNQkxFUkRFQ09ERVJDT01NT05fSAorI2RlZmluZSBMTFZNX0xJQl9UQVJHRVRfWDg2X0RJU0FTU0VNQkxFUl9YODZESVNBU1NFTUJMRVJERUNPREVSQ09NTU9OX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIFg4NkRpc2Fzc2VtYmxlciB7CisKKyNkZWZpbmUgSU5TVFJVQ1RJT05TX1NZTSAgeDg2RGlzYXNzZW1ibGVySW5zdHJTcGVjaWZpZXJzCisjZGVmaW5lIENPTlRFWFRTX1NZTSAgICAgIHg4NkRpc2Fzc2VtYmxlckNvbnRleHRzCisjZGVmaW5lIE9ORUJZVEVfU1lNICAgICAgIHg4NkRpc2Fzc2VtYmxlck9uZUJ5dGVPcGNvZGVzCisjZGVmaW5lIFRXT0JZVEVfU1lNICAgICAgIHg4NkRpc2Fzc2VtYmxlclR3b0J5dGVPcGNvZGVzCisjZGVmaW5lIFRIUkVFQllURTM4X1NZTSAgIHg4NkRpc2Fzc2VtYmxlclRocmVlQnl0ZTM4T3Bjb2RlcworI2RlZmluZSBUSFJFRUJZVEUzQV9TWU0gICB4ODZEaXNhc3NlbWJsZXJUaHJlZUJ5dGUzQU9wY29kZXMKKyNkZWZpbmUgWE9QOF9NQVBfU1lNICAgICAgeDg2RGlzYXNzZW1ibGVyWE9QOE9wY29kZXMKKyNkZWZpbmUgWE9QOV9NQVBfU1lNICAgICAgeDg2RGlzYXNzZW1ibGVyWE9QOU9wY29kZXMKKyNkZWZpbmUgWE9QQV9NQVBfU1lNICAgICAgeDg2RGlzYXNzZW1ibGVyWE9QQU9wY29kZXMKKyNkZWZpbmUgVEhSRUVETk9XX01BUF9TWU0geDg2RGlzYXNzZW1ibGVyM0ROb3dPcGNvZGVzCisKKyNkZWZpbmUgSU5TVFJVQ1RJT05TX1NUUiAgIng4NkRpc2Fzc2VtYmxlckluc3RyU3BlY2lmaWVycyIKKyNkZWZpbmUgQ09OVEVYVFNfU1RSICAgICAgIng4NkRpc2Fzc2VtYmxlckNvbnRleHRzIgorI2RlZmluZSBPTkVCWVRFX1NUUiAgICAgICAieDg2RGlzYXNzZW1ibGVyT25lQnl0ZU9wY29kZXMiCisjZGVmaW5lIFRXT0JZVEVfU1RSICAgICAgICJ4ODZEaXNhc3NlbWJsZXJUd29CeXRlT3Bjb2RlcyIKKyNkZWZpbmUgVEhSRUVCWVRFMzhfU1RSICAgIng4NkRpc2Fzc2VtYmxlclRocmVlQnl0ZTM4T3Bjb2RlcyIKKyNkZWZpbmUgVEhSRUVCWVRFM0FfU1RSICAgIng4NkRpc2Fzc2VtYmxlclRocmVlQnl0ZTNBT3Bjb2RlcyIKKyNkZWZpbmUgWE9QOF9NQVBfU1RSICAgICAgIng4NkRpc2Fzc2VtYmxlclhPUDhPcGNvZGVzIgorI2RlZmluZSBYT1A5X01BUF9TVFIgICAgICAieDg2RGlzYXNzZW1ibGVyWE9QOU9wY29kZXMiCisjZGVmaW5lIFhPUEFfTUFQX1NUUiAgICAgICJ4ODZEaXNhc3NlbWJsZXJYT1BBT3Bjb2RlcyIKKyNkZWZpbmUgVEhSRUVETk9XX01BUF9TVFIgIng4NkRpc2Fzc2VtYmxlcjNETm93T3Bjb2RlcyIKKworLy8gQXR0cmlidXRlcyBvZiBhbiBpbnN0cnVjdGlvbiB0aGF0IG11c3QgYmUga25vd24gYmVmb3JlIHRoZSBvcGNvZGUgY2FuIGJlCisvLyBwcm9jZXNzZWQgY29ycmVjdGx5LiAgTW9zdCBvZiB0aGVzZSBpbmRpY2F0ZSB0aGUgcHJlc2VuY2Ugb2YgcGFydGljdWxhcgorLy8gcHJlZml4ZXMsIGJ1dCBBVFRSXzY0QklUIGlzIHNpbXBseSBhbiBhdHRyaWJ1dGUgb2YgdGhlIGRlY29kaW5nIGNvbnRleHQuCisjZGVmaW5lIEFUVFJJQlVURV9CSVRTICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEFUVFJfTk9ORSwgICAweDAwKSAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShBVFRSXzY0QklULCAgKDB4MSA8PCAwKSkgICBcCisgIEVOVU1fRU5UUlkoQVRUUl9YUywgICAgICgweDEgPDwgMSkpICAgXAorICBFTlVNX0VOVFJZKEFUVFJfWEQsICAgICAoMHgxIDw8IDIpKSAgIFwKKyAgRU5VTV9FTlRSWShBVFRSX1JFWFcsICAgKDB4MSA8PCAzKSkgICBcCisgIEVOVU1fRU5UUlkoQVRUUl9PUFNJWkUsICgweDEgPDwgNCkpICAgXAorICBFTlVNX0VOVFJZKEFUVFJfQURTSVpFLCAoMHgxIDw8IDUpKSAgIFwKKyAgRU5VTV9FTlRSWShBVFRSX1ZFWCwgICAgKDB4MSA8PCA2KSkgICBcCisgIEVOVU1fRU5UUlkoQVRUUl9WRVhMLCAgICgweDEgPDwgNykpICAgXAorICBFTlVNX0VOVFJZKEFUVFJfRVZFWCwgICAoMHgxIDw8IDgpKSAgIFwKKyAgRU5VTV9FTlRSWShBVFRSX0VWRVhMLCAgKDB4MSA8PCA5KSkgICBcCisgIEVOVU1fRU5UUlkoQVRUUl9FVkVYTDIsICgweDEgPDwgMTApKSAgXAorICBFTlVNX0VOVFJZKEFUVFJfRVZFWEssICAoMHgxIDw8IDExKSkgIFwKKyAgRU5VTV9FTlRSWShBVFRSX0VWRVhLWiwgKDB4MSA8PCAxMikpICBcCisgIEVOVU1fRU5UUlkoQVRUUl9FVkVYQiwgICgweDEgPDwgMTMpKQorCisjZGVmaW5lIEVOVU1fRU5UUlkobiwgdikgbiA9IHYsCitlbnVtIGF0dHJpYnV0ZUJpdHMgeworICBBVFRSSUJVVEVfQklUUworICBBVFRSX21heAorfTsKKyN1bmRlZiBFTlVNX0VOVFJZCisKKy8vIENvbWJpbmF0aW9ucyBvZiB0aGUgYWJvdmUgYXR0cmlidXRlcyB0aGF0IGFyZSByZWxldmFudCB0byBpbnN0cnVjdGlvbgorLy8gZGVjb2RlLiBBbHRob3VnaCBvdGhlciBjb21iaW5hdGlvbnMgYXJlIHBvc3NpYmxlLCB0aGV5IGNhbiBiZSByZWR1Y2VkIHRvCisvLyB0aGVzZSB3aXRob3V0IGFmZmVjdGluZyB0aGUgdWx0aW1hdGVseSBkZWNvZGVkIGluc3RydWN0aW9uLgorCisvLyAgICAgICAgICAgQ2xhc3MgbmFtZSAgICAgICAgICAgUmFuayAgUmF0aW9uYWxlIGZvciByYW5rIGFzc2lnbm1lbnQKKyNkZWZpbmUgSU5TVFJVQ1RJT05fQ09OVEVYVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUMsICAgICAgICAgICAgICAgICAgICAwLCAgInNheXMgbm90aGluZyBhYm91dCB0aGUgaW5zdHJ1Y3Rpb24iKSAgXAorICBFTlVNX0VOVFJZKElDXzY0QklULCAgICAgICAgICAgICAgMSwgICJzYXlzIHRoZSBpbnN0cnVjdGlvbiBhcHBsaWVzIGluICIgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNjQtYml0IG1vZGUgYnV0IG5vIG1vcmUiKSAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfT1BTSVpFLCAgICAgICAgICAgICAzLCAgInJlcXVpcmVzIGFuIE9QU0laRSBwcmVmaXgsIHNvICIgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVyYW5kcyBjaGFuZ2Ugd2lkdGgiKSAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19BRFNJWkUsICAgICAgICAgICAgIDMsICAicmVxdWlyZXMgYW4gQURTSVpFIHByZWZpeCwgc28gIiAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wZXJhbmRzIGNoYW5nZSB3aWR0aCIpICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX09QU0laRV9BRFNJWkUsICAgICAgNCwgICJyZXF1aXJlcyBBRFNJWkUgYW5kIE9QU0laRSBwcmVmaXhlcyIpIFwKKyAgRU5VTV9FTlRSWShJQ19YRCwgICAgICAgICAgICAgICAgIDIsICAibWF5IHNheSBzb21ldGhpbmcgYWJvdXQgdGhlIG9wY29kZSAiICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBub3QgdGhlIG9wZXJhbmRzIikgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX1hTLCAgICAgICAgICAgICAgICAgMiwgICJtYXkgc2F5IHNvbWV0aGluZyBhYm91dCB0aGUgb3Bjb2RlICIgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IG5vdCB0aGUgb3BlcmFuZHMiKSAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfWERfT1BTSVpFLCAgICAgICAgICAzLCAgInJlcXVpcmVzIGFuIE9QU0laRSBwcmVmaXgsIHNvICIgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVyYW5kcyBjaGFuZ2Ugd2lkdGgiKSAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19YU19PUFNJWkUsICAgICAgICAgIDMsICAicmVxdWlyZXMgYW4gT1BTSVpFIHByZWZpeCwgc28gIiAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wZXJhbmRzIGNoYW5nZSB3aWR0aCIpICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDXzY0QklUX1JFWFcsICAgICAgICAgNSwgICJyZXF1aXJlcyBhIFJFWC5XIHByZWZpeCwgc28gb3BlcmFuZHMgIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hhbmdlIHdpZHRoOyBvdmVycmlkZXMgSUNfT1BTSVpFIikgICBcCisgIEVOVU1fRU5UUlkoSUNfNjRCSVRfUkVYV19BRFNJWkUsICA2LCAgInJlcXVpcmVzIGEgUkVYLlcgcHJlZml4IGFuZCAweDY3ICIgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVmaXgiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ182NEJJVF9PUFNJWkUsICAgICAgIDMsICAiSnVzdCBhcyBtZWFuaW5nZnVsIGFzIElDX09QU0laRSIpICAgICBcCisgIEVOVU1fRU5UUlkoSUNfNjRCSVRfQURTSVpFLCAgICAgICAzLCAgIkp1c3QgYXMgbWVhbmluZ2Z1bCBhcyBJQ19BRFNJWkUiKSAgICAgXAorICBFTlVNX0VOVFJZKElDXzY0QklUX09QU0laRV9BRFNJWkUsIDQsICJKdXN0IGFzIG1lYW5pbmdmdWwgYXMgSUNfT1BTSVpFLyIgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUNfQURTSVpFIikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfNjRCSVRfWEQsICAgICAgICAgICA2LCAgIlhEIGluc3RydWN0aW9ucyBhcmUgU1NFOyBSRVguVyBpcyAiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWNvbmRhcnkiKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ182NEJJVF9YUywgICAgICAgICAgIDYsICAiSnVzdCBhcyBtZWFuaW5nZnVsIGFzIElDXzY0QklUX1hEIikgICBcCisgIEVOVU1fRU5UUlkoSUNfNjRCSVRfWERfT1BTSVpFLCAgICAzLCAgIkp1c3QgYXMgbWVhbmluZ2Z1bCBhcyBJQ19YRF9PUFNJWkUiKSAgXAorICBFTlVNX0VOVFJZKElDXzY0QklUX1hTX09QU0laRSwgICAgMywgICJKdXN0IGFzIG1lYW5pbmdmdWwgYXMgSUNfWFNfT1BTSVpFIikgIFwKKyAgRU5VTV9FTlRSWShJQ182NEJJVF9SRVhXX1hTLCAgICAgIDcsICAiT1BTSVpFIGNvdWxkIG1lYW4gYSBkaWZmZXJlbnQgIiAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wY29kZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDXzY0QklUX1JFWFdfWEQsICAgICAgNywgICJKdXN0IGFzIG1lYW5pbmdmdWwgYXMgIiAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUNfNjRCSVRfUkVYV19YUyIpICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfNjRCSVRfUkVYV19PUFNJWkUsICA4LCAgIlRoZSBEeW5hbWljIER1byEgIFByZWZlciBvdmVyIGFsbCAiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbHNlIGJlY2F1c2UgdGhpcyBjaGFuZ2VzIG1vc3QgIiAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3BlcmFuZHMnIG1lYW5pbmciKSAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfVkVYLCAgICAgICAgICAgICAgICAxLCAgInJlcXVpcmVzIGEgVkVYIHByZWZpeCIpICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX1ZFWF9YUywgICAgICAgICAgICAgMiwgICJyZXF1aXJlcyBWRVggYW5kIHRoZSBYUyBwcmVmaXgiKSAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19WRVhfWEQsICAgICAgICAgICAgIDIsICAicmVxdWlyZXMgVkVYIGFuZCB0aGUgWEQgcHJlZml4IikgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfVkVYX09QU0laRSwgICAgICAgICAyLCAgInJlcXVpcmVzIFZFWCBhbmQgdGhlIE9wU2l6ZSBwcmVmaXgiKSAgXAorICBFTlVNX0VOVFJZKElDX1ZFWF9XLCAgICAgICAgICAgICAgMywgICJyZXF1aXJlcyBWRVggYW5kIHRoZSBXIHByZWZpeCIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19WRVhfV19YUywgICAgICAgICAgIDQsICAicmVxdWlyZXMgVkVYLCBXLCBhbmQgWFMgcHJlZml4IikgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfVkVYX1dfWEQsICAgICAgICAgICA0LCAgInJlcXVpcmVzIFZFWCwgVywgYW5kIFhEIHByZWZpeCIpICAgICAgXAorICBFTlVNX0VOVFJZKElDX1ZFWF9XX09QU0laRSwgICAgICAgNCwgICJyZXF1aXJlcyBWRVgsIFcsIGFuZCBPcFNpemUiKSAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19WRVhfTCwgICAgICAgICAgICAgIDMsICAicmVxdWlyZXMgVkVYIGFuZCB0aGUgTCBwcmVmaXgiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfVkVYX0xfWFMsICAgICAgICAgICA0LCAgInJlcXVpcmVzIFZFWCBhbmQgdGhlIEwgYW5kIFhTIHByZWZpeCIpXAorICBFTlVNX0VOVFJZKElDX1ZFWF9MX1hELCAgICAgICAgICAgNCwgICJyZXF1aXJlcyBWRVggYW5kIHRoZSBMIGFuZCBYRCBwcmVmaXgiKVwKKyAgRU5VTV9FTlRSWShJQ19WRVhfTF9PUFNJWkUsICAgICAgIDQsICAicmVxdWlyZXMgVkVYLCBMLCBhbmQgT3BTaXplIikgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfVkVYX0xfVywgICAgICAgICAgICA0LCAgInJlcXVpcmVzIFZFWCwgTCBhbmQgVyIpICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX1ZFWF9MX1dfWFMsICAgICAgICAgNSwgICJyZXF1aXJlcyBWRVgsIEwsIFcgYW5kIFhTIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19WRVhfTF9XX1hELCAgICAgICAgIDUsICAicmVxdWlyZXMgVkVYLCBMLCBXIGFuZCBYRCBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfVkVYX0xfV19PUFNJWkUsICAgICA1LCAgInJlcXVpcmVzIFZFWCwgTCwgVyBhbmQgT3BTaXplIikgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVgsICAgICAgICAgICAgICAgMSwgICJyZXF1aXJlcyBhbiBFVkVYIHByZWZpeCIpICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1hTLCAgICAgICAgICAgIDIsICAicmVxdWlyZXMgRVZFWCBhbmQgdGhlIFhTIHByZWZpeCIpICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9YRCwgICAgICAgICAgICAyLCAgInJlcXVpcmVzIEVWRVggYW5kIHRoZSBYRCBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfT1BTSVpFLCAgICAgICAgMiwgICJyZXF1aXJlcyBFVkVYIGFuZCB0aGUgT3BTaXplIHByZWZpeCIpIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1csICAgICAgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWCBhbmQgdGhlIFcgcHJlZml4IikgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9XX1hTLCAgICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVgsIFcsIGFuZCBYUyBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19YRCwgICAgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYLCBXLCBhbmQgWEQgcHJlZml4IikgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1dfT1BTSVpFLCAgICAgIDQsICAicmVxdWlyZXMgRVZFWCwgVywgYW5kIE9wU2l6ZSIpICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MLCAgICAgICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVggYW5kIHRoZSBMIHByZWZpeCIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfWFMsICAgICAgICAgIDQsICAicmVxdWlyZXMgRVZFWCBhbmQgdGhlIEwgYW5kIFhTIHByZWZpeCIpXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9YRCwgICAgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYIGFuZCB0aGUgTCBhbmQgWEQgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX09QU0laRSwgICAgICA0LCAgInJlcXVpcmVzIEVWRVgsIEwsIGFuZCBPcFNpemUiKSAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfVywgICAgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWCwgTCBhbmQgVyIpICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9XX1hTLCAgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYLCBMLCBXIGFuZCBYUyBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfWEQsICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVgsIEwsIFcgYW5kIFhEIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19PUFNJWkUsICAgIDQsICAicmVxdWlyZXMgRVZFWCwgTCwgVyBhbmQgT3BTaXplIikgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDIsICAgICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYIGFuZCB0aGUgTDIgcHJlZml4IikgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfWFMsICAgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYIGFuZCB0aGUgTDIgYW5kIFhTIHByZWZpeCIpXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfWEQsICAgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYIGFuZCB0aGUgTDIgYW5kIFhEIHByZWZpeCIpXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfT1BTSVpFLCAgICAgNCwgICJyZXF1aXJlcyBFVkVYLCBMMiwgYW5kIE9wU2l6ZSIpICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfVywgICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYLCBMMiBhbmQgVyIpICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfV19YUywgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYLCBMMiwgVyBhbmQgWFMgcHJlZml4IikgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfV19YRCwgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYLCBMMiwgVyBhbmQgWEQgcHJlZml4IikgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfV19PUFNJWkUsICAgNCwgICJyZXF1aXJlcyBFVkVYLCBMMiwgVyBhbmQgT3BTaXplIikgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfSywgICAgICAgICAgICAgMSwgICJyZXF1aXJlcyBhbiBFVkVYX0sgcHJlZml4IikgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfWFNfSywgICAgICAgICAgMiwgICJyZXF1aXJlcyBFVkVYX0sgYW5kIHRoZSBYUyBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfWERfSywgICAgICAgICAgMiwgICJyZXF1aXJlcyBFVkVYX0sgYW5kIHRoZSBYRCBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfT1BTSVpFX0ssICAgICAgMiwgICJyZXF1aXJlcyBFVkVYX0sgYW5kIHRoZSBPcFNpemUgcHJlZml4IikgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19LLCAgICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYX0sgYW5kIHRoZSBXIHByZWZpeCIpICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19YU19LLCAgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0ssIFcsIGFuZCBYUyBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19YRF9LLCAgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0ssIFcsIGFuZCBYRCBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19PUFNJWkVfSywgICAgNCwgICJyZXF1aXJlcyBFVkVYX0ssIFcsIGFuZCBPcFNpemUiKSAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9LLCAgICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYX0sgYW5kIHRoZSBMIHByZWZpeCIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfWFNfSywgICAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9LIGFuZCB0aGUgTCBhbmQgWFMgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1hEX0ssICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfSyBhbmQgdGhlIEwgYW5kIFhEIHByZWZpeCIpXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9PUFNJWkVfSywgICAgNCwgICJyZXF1aXJlcyBFVkVYX0ssIEwsIGFuZCBPcFNpemUiKSAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19LLCAgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWF9LLCBMIGFuZCBXIikgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfWFNfSywgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfSywgTCwgVyBhbmQgWFMgcHJlZml4IikgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9XX1hEX0ssICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0ssIEwsIFcgYW5kIFhEIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19PUFNJWkVfSywgIDQsICAicmVxdWlyZXMgRVZFWF9LLCBMLCBXIGFuZCBPcFNpemUiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9LLCAgICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVhfSyBhbmQgdGhlIEwyIHByZWZpeCIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1hTX0ssICAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9LIGFuZCB0aGUgTDIgYW5kIFhTIHByZWZpeCIpXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfWERfSywgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0sgYW5kIHRoZSBMMiBhbmQgWEQgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9PUFNJWkVfSywgICA0LCAgInJlcXVpcmVzIEVWRVhfSywgTDIsIGFuZCBPcFNpemUiKSAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1dfSywgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWF9LLCBMMiBhbmQgVyIpICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfV19YU19LLCAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0ssIEwyLCBXIGFuZCBYUyBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XX1hEX0ssICAgICA0LCAgInJlcXVpcmVzIEVWRVhfSywgTDIsIFcgYW5kIFhEIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1dfT1BTSVpFX0ssIDQsICAicmVxdWlyZXMgRVZFWF9LLCBMMiwgVyBhbmQgT3BTaXplIikgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0IsICAgICAgICAgICAgIDEsICAicmVxdWlyZXMgYW4gRVZFWF9CIHByZWZpeCIpICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1hTX0IsICAgICAgICAgIDIsICAicmVxdWlyZXMgRVZFWF9CIGFuZCB0aGUgWFMgcHJlZml4IikgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1hEX0IsICAgICAgICAgIDIsICAicmVxdWlyZXMgRVZFWF9CIGFuZCB0aGUgWEQgcHJlZml4IikgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX09QU0laRV9CLCAgICAgIDIsICAicmVxdWlyZXMgRVZFWF9CIGFuZCB0aGUgT3BTaXplIHByZWZpeCIpIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1dfQiwgICAgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWF9CIGFuZCB0aGUgVyBwcmVmaXgiKSAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1dfWFNfQiwgICAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBXLCBhbmQgWFMgcHJlZml4IikgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1dfWERfQiwgICAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBXLCBhbmQgWEQgcHJlZml4IikgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1dfT1BTSVpFX0IsICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBXLCBhbmQgT3BTaXplIikgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfQiwgICAgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWF9CIGFuZCB0aGUgTCBwcmVmaXgiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1hTX0IsICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiBhbmQgdGhlIEwgYW5kIFhTIHByZWZpeCIpXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9YRF9CLCAgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IgYW5kIHRoZSBMIGFuZCBYRCBwcmVmaXgiKVwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfT1BTSVpFX0IsICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBMLCBhbmQgT3BTaXplIikgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfQiwgICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVhfQiwgTCBhbmQgVyIpICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9XX1hTX0IsICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEwsIFcgYW5kIFhTIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19YRF9CLCAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBMLCBXIGFuZCBYRCBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfT1BTSVpFX0IsICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgTCwgVyBhbmQgT3BTaXplIikgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfQiwgICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYX0IgYW5kIHRoZSBMMiBwcmVmaXgiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9YU19CLCAgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiBhbmQgdGhlIEwyIGFuZCBYUyBwcmVmaXgiKVwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1hEX0IsICAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CIGFuZCB0aGUgTDIgYW5kIFhEIHByZWZpeCIpXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfT1BTSVpFX0IsICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEwyLCBhbmQgT3BTaXplIikgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XX0IsICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVhfQiwgTDIgYW5kIFciKSAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1dfWFNfQiwgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBMMiwgVyBhbmQgWFMgcHJlZml4IikgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfV19YRF9CLCAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEwyLCBXIGFuZCBYRCBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XX09QU0laRV9CLCA0LCAgInJlcXVpcmVzIEVWRVhfQiwgTDIsIFcgYW5kIE9wU2l6ZSIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0tfQiwgICAgICAgICAgIDEsICAicmVxdWlyZXMgRVZFWF9CIGFuZCBFVkVYX0sgcHJlZml4IikgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfWFNfS19CLCAgICAgICAgMiwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfSyBhbmQgdGhlIFhTIHByZWZpeCIpICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9YRF9LX0IsICAgICAgICAyLCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LIGFuZCB0aGUgWEQgcHJlZml4IikgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX09QU0laRV9LX0IsICAgIDIsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0sgYW5kIHRoZSBPcFNpemUgcHJlZml4IikgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19LX0IsICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfSyBhbmQgdGhlIFcgcHJlZml4IikgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9XX1hTX0tfQiwgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LLCBXLCBhbmQgWFMgcHJlZml4IikgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1dfWERfS19CLCAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0ssIFcsIGFuZCBYRCBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19PUFNJWkVfS19CLCAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfSywgVywgYW5kIE9wU2l6ZSIpICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX0tfQiwgICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LIGFuZCB0aGUgTCBwcmVmaXgiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1hTX0tfQiwgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LIGFuZCB0aGUgTCBhbmQgWFMgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1hEX0tfQiwgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LIGFuZCB0aGUgTCBhbmQgWEQgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX09QU0laRV9LX0IsICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LLCBMLCBhbmQgT3BTaXplIikgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfS19CLCAgICAgICAzLCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LLCBMIGFuZCBXIikgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfWFNfS19CLCAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LLCBMLCBXIGFuZCBYUyBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfWERfS19CLCAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LLCBMLCBXIGFuZCBYRCBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfT1BTSVpFX0tfQiw0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LLCBMLCBXIGFuZCBPcFNpemUiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9LX0IsICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LIGFuZCB0aGUgTDIgcHJlZml4IikgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfWFNfS19CLCAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfSyBhbmQgdGhlIEwyIGFuZCBYUyBwcmVmaXgiKVwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1hEX0tfQiwgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0sgYW5kIHRoZSBMMiBhbmQgWEQgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9PUFNJWkVfS19CLCA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LLCBMMiwgYW5kIE9wU2l6ZSIpICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfV19LX0IsICAgICAgMywgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfSywgTDIgYW5kIFciKSAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1dfWFNfS19CLCAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0ssIEwyLCBXIGFuZCBYUyBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XX1hEX0tfQiwgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LLCBMMiwgVyBhbmQgWEQgcHJlZml4IikgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfV19PUFNJWkVfS19CLDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0ssIEwyLCBXIGFuZCBPcFNpemUiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9LWl9CLCAgICAgICAgICAgMSwgICJyZXF1aXJlcyBFVkVYX0IgYW5kIEVWRVhfS1ogcHJlZml4IikgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfWFNfS1pfQiwgICAgICAgIDIsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0taIGFuZCB0aGUgWFMgcHJlZml4IikgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1hEX0taX0IsICAgICAgICAyLCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LWiBhbmQgdGhlIFhEIHByZWZpeCIpICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9PUFNJWkVfS1pfQiwgICAgMiwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfS1ogYW5kIHRoZSBPcFNpemUgcHJlZml4IikgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19LWl9CLCAgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0taIGFuZCB0aGUgVyBwcmVmaXgiKSAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1dfWFNfS1pfQiwgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LWiwgVywgYW5kIFhTIHByZWZpeCIpICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9XX1hEX0taX0IsICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfS1osIFcsIGFuZCBYRCBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19PUFNJWkVfS1pfQiwgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0taLCBXLCBhbmQgT3BTaXplIikgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfS1pfQiwgICAgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0taIGFuZCB0aGUgTCBwcmVmaXgiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1hTX0taX0IsICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LWiBhbmQgdGhlIEwgYW5kIFhTIHByZWZpeCIpXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9YRF9LWl9CLCAgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfS1ogYW5kIHRoZSBMIGFuZCBYRCBwcmVmaXgiKVwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfT1BTSVpFX0taX0IsICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0taLCBMLCBhbmQgT3BTaXplIikgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfS1pfQiwgICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LWiwgTCBhbmQgVyIpICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9XX1hTX0taX0IsICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfS1osIEwsIFcgYW5kIFhTIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19YRF9LWl9CLCAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0taLCBMLCBXIGFuZCBYRCBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfT1BTSVpFX0taX0IsICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LWiwgTCwgVyBhbmQgT3BTaXplIikgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfS1pfQiwgICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfS1ogYW5kIHRoZSBMMiBwcmVmaXgiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9YU19LWl9CLCAgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LWiBhbmQgdGhlIEwyIGFuZCBYUyBwcmVmaXgiKVwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1hEX0taX0IsICAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0taIGFuZCB0aGUgTDIgYW5kIFhEIHByZWZpeCIpXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfT1BTSVpFX0taX0IsICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfS1osIEwyLCBhbmQgT3BTaXplIikgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XX0taX0IsICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LWiwgTDIgYW5kIFciKSAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1dfWFNfS1pfQiwgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0taLCBMMiwgVyBhbmQgWFMgcHJlZml4IikgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfV19YRF9LWl9CLCAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfS1osIEwyLCBXIGFuZCBYRCBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XX09QU0laRV9LWl9CLCA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LWiwgTDIsIFcgYW5kIE9wU2l6ZSIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0taLCAgICAgICAgICAgICAxLCAgInJlcXVpcmVzIGFuIEVWRVhfS1ogcHJlZml4IikgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfWFNfS1osICAgICAgICAgIDIsICAicmVxdWlyZXMgRVZFWF9LWiBhbmQgdGhlIFhTIHByZWZpeCIpICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9YRF9LWiwgICAgICAgICAgMiwgICJyZXF1aXJlcyBFVkVYX0taIGFuZCB0aGUgWEQgcHJlZml4IikgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX09QU0laRV9LWiwgICAgICAyLCAgInJlcXVpcmVzIEVWRVhfS1ogYW5kIHRoZSBPcFNpemUgcHJlZml4IikgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19LWiwgICAgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWF9LWiBhbmQgdGhlIFcgcHJlZml4IikgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9XX1hTX0taLCAgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0taLCBXLCBhbmQgWFMgcHJlZml4IikgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1dfWERfS1osICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfS1osIFcsIGFuZCBYRCBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19PUFNJWkVfS1osICAgIDQsICAicmVxdWlyZXMgRVZFWF9LWiwgVywgYW5kIE9wU2l6ZSIpICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX0taLCAgICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYX0taIGFuZCB0aGUgTCBwcmVmaXgiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1hTX0taLCAgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0taIGFuZCB0aGUgTCBhbmQgWFMgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1hEX0taLCAgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0taIGFuZCB0aGUgTCBhbmQgWEQgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX09QU0laRV9LWiwgICAgNCwgICJyZXF1aXJlcyBFVkVYX0taLCBMLCBhbmQgT3BTaXplIikgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfS1osICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYX0taLCBMIGFuZCBXIikgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfWFNfS1osICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0taLCBMLCBXIGFuZCBYUyBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfWERfS1osICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0taLCBMLCBXIGFuZCBYRCBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfT1BTSVpFX0taLCAgNCwgICJyZXF1aXJlcyBFVkVYX0taLCBMLCBXIGFuZCBPcFNpemUiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9LWiwgICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYX0taIGFuZCB0aGUgTDIgcHJlZml4IikgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfWFNfS1osICAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9LWiBhbmQgdGhlIEwyIGFuZCBYUyBwcmVmaXgiKVwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1hEX0taLCAgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfS1ogYW5kIHRoZSBMMiBhbmQgWEQgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9PUFNJWkVfS1osICAgNCwgICJyZXF1aXJlcyBFVkVYX0taLCBMMiwgYW5kIE9wU2l6ZSIpICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfV19LWiwgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWF9LWiwgTDIgYW5kIFciKSAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1dfWFNfS1osICAgICA0LCAgInJlcXVpcmVzIEVWRVhfS1osIEwyLCBXIGFuZCBYUyBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XX1hEX0taLCAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0taLCBMMiwgVyBhbmQgWEQgcHJlZml4IikgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfV19PUFNJWkVfS1osIDQsICAicmVxdWlyZXMgRVZFWF9LWiwgTDIsIFcgYW5kIE9wU2l6ZSIpCisKKyNkZWZpbmUgRU5VTV9FTlRSWShuLCByLCBkKSBuLAorZW51bSBJbnN0cnVjdGlvbkNvbnRleHQgeworICBJTlNUUlVDVElPTl9DT05URVhUUworICBJQ19tYXgKK307CisjdW5kZWYgRU5VTV9FTlRSWQorCisvLyBPcGNvZGUgdHlwZXMsIHdoaWNoIGRldGVybWluZSB3aGljaCBkZWNvZGUgdGFibGUgdG8gdXNlLCBib3RoIGluIHRoZSBJbnRlbAorLy8gbWFudWFsIGFuZCBhbHNvIGZvciB0aGUgZGVjb2Rlci4KK2VudW0gT3Bjb2RlVHlwZSB7CisgIE9ORUJZVEUgICAgICAgPSAwLAorICBUV09CWVRFICAgICAgID0gMSwKKyAgVEhSRUVCWVRFXzM4ICA9IDIsCisgIFRIUkVFQllURV8zQSAgPSAzLAorICBYT1A4X01BUCAgICAgID0gNCwKKyAgWE9QOV9NQVAgICAgICA9IDUsCisgIFhPUEFfTUFQICAgICAgPSA2LAorICBUSFJFRUROT1dfTUFQID0gNworfTsKKworLy8gVGhlIGZvbGxvd2luZyBzdHJ1Y3RzIGFyZSB1c2VkIGZvciB0aGUgaGllcmFyY2hpY2FsIGRlY29kZSB0YWJsZS4gIEFmdGVyCisvLyBkZXRlcm1pbmluZyB0aGUgaW5zdHJ1Y3Rpb24ncyBjbGFzcyAoaS5lLiwgd2hpY2ggSUNfKiBjb25zdGFudCBhcHBsaWVzIHRvCisvLyBpdCksIHRoZSBkZWNvZGVyIHJlYWRzIHRoZSBvcGNvZGUuICBTb21lIGluc3RydWN0aW9ucyByZXF1aXJlIHNwZWNpZmljCisvLyB2YWx1ZXMgb2YgdGhlIE1vZFIvTSBieXRlLCBzbyB0aGUgTW9kUi9NIGJ5dGUgaW5kZXhlcyBpbnRvIHRoZSBmaW5hbCB0YWJsZS4KKy8vCisvLyBJZiBhIE1vZFIvTSBieXRlIGlzIG5vdCByZXF1aXJlZCwgInJlcXVpcmVkIiBpcyBsZWZ0IHVuc2V0LCBhbmQgdGhlIHZhbHVlcworLy8gZm9yIGVhY2ggaW5zdHJ1Y3Rpb25JRCBhcmUgaWRlbnRpY2FsLgordHlwZWRlZiB1aW50MTZfdCBJbnN0clVJRDsKKworLy8gTW9kUk1EZWNpc2lvblR5cGUgLSBkZXNjcmliZXMgdGhlIHR5cGUgb2YgTW9kUi9NIGRlY2lzaW9uLCBhbGxvd2luZyB0aGUKKy8vIGNvbnN1bWVyIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gaXQuCisvLworLy8gTU9EUk1fT05FRU5UUlkgLSBObyBtYXR0ZXIgd2hhdCB0aGUgdmFsdWUgb2YgdGhlIE1vZFIvTSBieXRlIGlzLCB0aGUgZGVjb2RlZAorLy8gICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiBpcyB0aGUgc2FtZS4KKy8vIE1PRFJNX1NQTElUUk0gIC0gSWYgdGhlIE1vZFIvTSBieXRlIGlzIGJldHdlZW4gMHgwMCBhbmQgMHhiZiwgdGhlIG9wY29kZQorLy8gICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byBvbmUgaW5zdHJ1Y3Rpb247IG90aGVyd2lzZSwgaXQgY29ycmVzcG9uZHMgdG8KKy8vICAgICAgICAgICAgICAgICAgYSBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb24uCisvLyBNT0RSTV9TUExJVE1JU0MtIElmIHRoZSBNb2RSL00gYnl0ZSBpcyBiZXR3ZWVuIDB4MDAgYW5kIDB4YmYsIE1vZFIvTSBieXRlCisvLyAgICAgICAgICAgICAgICAgIGRpdmlkZWQgYnkgOCBpcyB1c2VkIHRvIHNlbGVjdCBpbnN0cnVjdGlvbjsgb3RoZXJ3aXNlLCBlYWNoCisvLyAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIHRoZSBNb2RSL00gYnl0ZSBjb3VsZCBjb3JyZXNwb25kIHRvIGEgZGlmZmVyZW50CisvLyAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLgorLy8gTU9EUk1fU1BMSVRSRUcgLSBNb2RSL00gYnl0ZSBkaXZpZGVkIGJ5IDggaXMgdXNlZCB0byBzZWxlY3QgaW5zdHJ1Y3Rpb24uIFRoaXMKKy8vICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gaW5zdHJ1Y3Rpb25zIHRoYXQgdXNlIHJlZyBmaWVsZCBhcyBvcGNvZGUKKy8vIE1PRFJNX0ZVTEwgICAgIC0gUG90ZW50aWFsbHksIGVhY2ggdmFsdWUgb2YgdGhlIE1vZFIvTSBieXRlIGNvdWxkIGNvcnJlc3BvbmQKKy8vICAgICAgICAgICAgICAgICAgdG8gYSBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb24uCisjZGVmaW5lIE1PRFJNVFlQRVMgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoTU9EUk1fT05FRU5UUlkpICBcCisgIEVOVU1fRU5UUlkoTU9EUk1fU1BMSVRSTSkgICBcCisgIEVOVU1fRU5UUlkoTU9EUk1fU1BMSVRNSVNDKSAgXAorICBFTlVNX0VOVFJZKE1PRFJNX1NQTElUUkVHKSAgXAorICBFTlVNX0VOVFJZKE1PRFJNX0ZVTEwpCisKKyNkZWZpbmUgRU5VTV9FTlRSWShuKSBuLAorZW51bSBNb2RSTURlY2lzaW9uVHlwZSB7CisgIE1PRFJNVFlQRVMKKyAgTU9EUk1fbWF4Cit9OworI3VuZGVmIEVOVU1fRU5UUlkKKworI2RlZmluZSBDQVNFX0VOQ09ESU5HX1JNICAgICBcCisgICAgY2FzZSBFTkNPRElOR19STTogICAgICAgIFwKKyAgICBjYXNlIEVOQ09ESU5HX1JNX0NEMjogICAgXAorICAgIGNhc2UgRU5DT0RJTkdfUk1fQ0Q0OiAgICBcCisgICAgY2FzZSBFTkNPRElOR19STV9DRDg6ICAgIFwKKyAgICBjYXNlIEVOQ09ESU5HX1JNX0NEMTY6ICAgXAorICAgIGNhc2UgRU5DT0RJTkdfUk1fQ0QzMjogICBcCisgICAgY2FzZSBFTkNPRElOR19STV9DRDY0CisKKyNkZWZpbmUgQ0FTRV9FTkNPRElOR19WU0lCICAgXAorICAgIGNhc2UgRU5DT0RJTkdfVlNJQjogICAgICBcCisgICAgY2FzZSBFTkNPRElOR19WU0lCX0NEMjogIFwKKyAgICBjYXNlIEVOQ09ESU5HX1ZTSUJfQ0Q0OiAgXAorICAgIGNhc2UgRU5DT0RJTkdfVlNJQl9DRDg6ICBcCisgICAgY2FzZSBFTkNPRElOR19WU0lCX0NEMTY6IFwKKyAgICBjYXNlIEVOQ09ESU5HX1ZTSUJfQ0QzMjogXAorICAgIGNhc2UgRU5DT0RJTkdfVlNJQl9DRDY0CisKKy8vIFBoeXNpY2FsIGVuY29kaW5ncyBvZiBpbnN0cnVjdGlvbiBvcGVyYW5kcy4KKyNkZWZpbmUgRU5DT0RJTkdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfTk9ORSwgICAiIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1JFRywgICAgIlJlZ2lzdGVyIG9wZXJhbmQgaW4gTW9kUi9NIGJ5dGUuIikgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19STSwgICAgICJSL00gb3BlcmFuZCBpbiBNb2RSL00gYnl0ZS4iKSAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfUk1fQ0QyLCAiUi9NIG9wZXJhbmQgd2l0aCBDRGlzcCBzY2FsaW5nIG9mIDIiKSAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1JNX0NENCwgIlIvTSBvcGVyYW5kIHdpdGggQ0Rpc3Agc2NhbGluZyBvZiA0IikgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19STV9DRDgsICJSL00gb3BlcmFuZCB3aXRoIENEaXNwIHNjYWxpbmcgb2YgOCIpICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfUk1fQ0QxNiwiUi9NIG9wZXJhbmQgd2l0aCBDRGlzcCBzY2FsaW5nIG9mIDE2IikgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1JNX0NEMzIsIlIvTSBvcGVyYW5kIHdpdGggQ0Rpc3Agc2NhbGluZyBvZiAzMiIpICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19STV9DRDY0LCJSL00gb3BlcmFuZCB3aXRoIENEaXNwIHNjYWxpbmcgb2YgNjQiKSAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfVlNJQiwgICAgICJWU0lCIG9wZXJhbmQgaW4gTW9kUi9NIGJ5dGUuIikgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1ZTSUJfQ0QyLCAiVlNJQiBvcGVyYW5kIHdpdGggQ0Rpc3Agc2NhbGluZyBvZiAyIikgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19WU0lCX0NENCwgIlZTSUIgb3BlcmFuZCB3aXRoIENEaXNwIHNjYWxpbmcgb2YgNCIpICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfVlNJQl9DRDgsICJWU0lCIG9wZXJhbmQgd2l0aCBDRGlzcCBzY2FsaW5nIG9mIDgiKSAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1ZTSUJfQ0QxNiwiVlNJQiBvcGVyYW5kIHdpdGggQ0Rpc3Agc2NhbGluZyBvZiAxNiIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19WU0lCX0NEMzIsIlZTSUIgb3BlcmFuZCB3aXRoIENEaXNwIHNjYWxpbmcgb2YgMzIiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfVlNJQl9DRDY0LCJWU0lCIG9wZXJhbmQgd2l0aCBDRGlzcCBzY2FsaW5nIG9mIDY0IikgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1ZWVlYsICAgIlJlZ2lzdGVyIG9wZXJhbmQgaW4gVkVYLnZ2dnYgYnl0ZS4iKSAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19XUklURU1BU0ssICJSZWdpc3RlciBvcGVyYW5kIGluIEVWRVguYWFhIGJ5dGUuIikgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfSUIsICAgICAiMS1ieXRlIGltbWVkaWF0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX0lXLCAgICAgIjItYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19JRCwgICAgICI0LWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfSU8sICAgICAiOC1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1JCLCAgICAgIihBTC4uRElMLCBSOEwuLlIxNUwpIFJlZ2lzdGVyIGNvZGUgYWRkZWQgdG8gIiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgb3Bjb2RlIGJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfUlcsICAgICAiKEFYLi5ESSwgUjhXLi5SMTVXKSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1JELCAgICAgIihFQVguLkVESSwgUjhELi5SMTVEKSIpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19STywgICAgICIoUkFYLi5SREksIFI4Li5SMTUpIikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfRlAsICAgICAiUG9zaXRpb24gb24gZmxvYXRpbmctcG9pbnQgc3RhY2sgaW4gTW9kUi9NICIgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGUuIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfSXYsICAgICAiSW1tZWRpYXRlIG9mIG9wZXJhbmQgc2l6ZSIpICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX0lhLCAgICAgIkltbWVkaWF0ZSBvZiBhZGRyZXNzIHNpemUiKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19JUkMsICAgICJJbW1lZGlhdGUgZm9yIHN0YXRpYyByb3VuZGluZyBjb250cm9sIikgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfUnYsICAgICAiUmVnaXN0ZXIgY29kZSBvZiBvcGVyYW5kIHNpemUgYWRkZWQgdG8gdGhlICIgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wY29kZSBieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19EVVAsICAgICJEdXBsaWNhdGUgb2YgYW5vdGhlciBvcGVyYW5kOyBJRCBpcyBlbmNvZGVkICIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gdHlwZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1NJLCAgICAgIlNvdXJjZSBpbmRleDsgZW5jb2RlZCBpbiBPcFNpemUvQWRzaXplIHByZWZpeCIpIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19ESSwgICAgICJEZXN0aW5hdGlvbiBpbmRleDsgZW5jb2RlZCBpbiBwcmVmaXhlcyIpCisKKyNkZWZpbmUgRU5VTV9FTlRSWShuLCBkKSBuLAorZW51bSBPcGVyYW5kRW5jb2RpbmcgeworICBFTkNPRElOR1MKKyAgRU5DT0RJTkdfbWF4Cit9OworI3VuZGVmIEVOVU1fRU5UUlkKKworLy8gU2VtYW50aWMgaW50ZXJwcmV0YXRpb25zIG9mIGluc3RydWN0aW9uIG9wZXJhbmRzLgorI2RlZmluZSBUWVBFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX05PTkUsICAgICAgICIiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9SRUwsICAgICAgICAiaW1tZWRpYXRlIGFkZHJlc3MiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfUjgsICAgICAgICAgIjEtYnl0ZSByZWdpc3RlciBvcGVyYW5kIikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX1IxNiwgICAgICAgICIyLWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9SMzIsICAgICAgICAiNC1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfUjY0LCAgICAgICAgIjgtYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX0lNTSwgICAgICAgICJpbW1lZGlhdGUgb3BlcmFuZCIpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX0lNTTMsICAgICAgICIxLWJ5dGUgaW1tZWRpYXRlIG9wZXJhbmQgYmV0d2VlbiAwIGFuZCA3IikgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9JTU01LCAgICAgICAiMS1ieXRlIGltbWVkaWF0ZSBvcGVyYW5kIGJldHdlZW4gMCBhbmQgMzEiKSAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfQVZYNTEySUNDLCAgIjEtYnl0ZSBpbW1lZGlhdGUgb3BlcmFuZCBmb3IgQVZYNTEyIGljbXAiKSAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX1VJTU04LCAgICAgICIxLWJ5dGUgdW5zaWduZWQgaW1tZWRpYXRlIG9wZXJhbmQiKSAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9NLCAgICAgICAgICAiTWVtb3J5IG9wZXJhbmQiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfTVZTSUJYLCAgICAgIk1lbW9yeSBvcGVyYW5kIHVzaW5nIFhNTSBpbmRleCIpICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX01WU0lCWSwgICAgICJNZW1vcnkgb3BlcmFuZCB1c2luZyBZTU0gaW5kZXgiKSAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9NVlNJQlosICAgICAiTWVtb3J5IG9wZXJhbmQgdXNpbmcgWk1NIGluZGV4IikgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfU1JDSURYLCAgICAgIm1lbW9yeSBhdCBzb3VyY2UgaW5kZXgiKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX0RTVElEWCwgICAgICJtZW1vcnkgYXQgZGVzdGluYXRpb24gaW5kZXgiKSAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9NT0ZGUywgICAgICAibWVtb3J5IG9mZnNldCAocmVsYXRpdmUgdG8gc2VnbWVudCBiYXNlKSIpICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfU1QsICAgICAgICAgIlBvc2l0aW9uIG9uIHRoZSBmbG9hdGluZy1wb2ludCBzdGFjayIpICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX01NNjQsICAgICAgICI4LWJ5dGUgTU1YIHJlZ2lzdGVyIikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9YTU0sICAgICAgICAiMTYtYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfWU1NLCAgICAgICAgIjMyLWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX1pNTSwgICAgICAgICI2NC1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9WSywgICAgICAgICAibWFzayByZWdpc3RlciIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfU0VHTUVOVFJFRywgIlNlZ21lbnQgcmVnaXN0ZXIgb3BlcmFuZCIpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX0RFQlVHUkVHLCAgICJEZWJ1ZyByZWdpc3RlciBvcGVyYW5kIikgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9DT05UUk9MUkVHLCAiQ29udHJvbCByZWdpc3RlciBvcGVyYW5kIikgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfQk5EUiwgICAgICAgIk1QWCBib3VuZHMgcmVnaXN0ZXIiKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9SdiwgICAgICAgICAiUmVnaXN0ZXIgb3BlcmFuZCBvZiBvcGVyYW5kIHNpemUiKSAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfUkVMdiwgICAgICAgIkltbWVkaWF0ZSBhZGRyZXNzIG9mIG9wZXJhbmQgc2l6ZSIpICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX0RVUDAsICAgICAgICJEdXBsaWNhdGUgb2Ygb3BlcmFuZCAwIikgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9EVVAxLCAgICAgICAib3BlcmFuZCAxIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfRFVQMiwgICAgICAgIm9wZXJhbmQgMiIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX0RVUDMsICAgICAgICJvcGVyYW5kIDMiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9EVVA0LCAgICAgICAib3BlcmFuZCA0IikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisjZGVmaW5lIEVOVU1fRU5UUlkobiwgZCkgbiwKK2VudW0gT3BlcmFuZFR5cGUgeworICBUWVBFUworICBUWVBFX21heAorfTsKKyN1bmRlZiBFTlVNX0VOVFJZCisKKy8vLyBcYnJpZWYgVGhlIHNwZWNpZmljYXRpb24gZm9yIGhvdyB0byBleHRyYWN0IGFuZCBpbnRlcnByZXQgb25lIG9wZXJhbmQuCitzdHJ1Y3QgT3BlcmFuZFNwZWNpZmllciB7CisgIHVpbnQ4X3QgZW5jb2Rpbmc7CisgIHVpbnQ4X3QgdHlwZTsKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBYODZfTUFYX09QRVJBTkRTID0gNjsKKworLy8vIERlY29kaW5nIG1vZGUgZm9yIHRoZSBJbnRlbCBkaXNhc3NlbWJsZXIuICAxNi1iaXQsIDMyLWJpdCwgYW5kIDY0LWJpdCBtb2RlCisvLy8gYXJlIHN1cHBvcnRlZCwgYW5kIHJlcHJlc2VudCByZWFsIG1vZGUsIElBLTMyZSwgYW5kIElBLTMyZSBpbiA2NC1iaXQgbW9kZSwKKy8vLyByZXNwZWN0aXZlbHkuCitlbnVtIERpc2Fzc2VtYmxlck1vZGUgeworICBNT0RFXzE2QklULAorICBNT0RFXzMyQklULAorICBNT0RFXzY0QklUCit9OworCit9IC8vIG5hbWVzcGFjZSBYODZEaXNhc3NlbWJsZXIKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvWDg2VGFyZ2V0UGFyc2VyLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9YODZUYXJnZXRQYXJzZXIuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOGM1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvWDg2VGFyZ2V0UGFyc2VyLmRlZgpAQCAtMCwwICsxLDE1NSBAQAorLy89PT0tIFg4NlRhcmdldFBhcnNlci5kZWYgLSBYODYgdGFyZ2V0IHBhcnNpbmcgZGVmaW5lcyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgZGVmaW5lcyB0byBidWlsZCB1cCB0aGUgWDg2IHRhcmdldCBwYXJzZXIncyBsb2dpYy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBOT1RFOiBOTyBJTkNMVURFIEdVQVJEIERFU0lSRUQhCisKKyNpZm5kZWYgWDg2X1ZFTkRPUgorI2RlZmluZSBYODZfVkVORE9SKEVOVU0sIFNUUikKKyNlbmRpZgorWDg2X1ZFTkRPUihWRU5ET1JfSU5URUwsICJpbnRlbCIpCitYODZfVkVORE9SKFZFTkRPUl9BTUQsICAgImFtZCIpCisjdW5kZWYgWDg2X1ZFTkRPUgorCisvLyBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gaW1wbGVtZW50IENQVSB0eXBlcyB0aGF0IGhhdmUgYW4gYWxpYXMuIEFzIG9mIG5vdworLy8gdGhlcmUgaXMgb25seSBldmVyIG9uZSBhbGlhcy4KKyNpZm5kZWYgWDg2X0NQVV9UWVBFX0NPTVBBVF9XSVRIX0FMSUFTCisjZGVmaW5lIFg4Nl9DUFVfVFlQRV9DT01QQVRfV0lUSF9BTElBUyhBUkNITkFNRSwgRU5VTSwgU1RSLCBBTElBUykgWDg2X0NQVV9UWVBFX0NPTVBBVChBUkNITkFNRSwgRU5VTSwgU1RSKQorI2VuZGlmCisKKy8vIFRoaXMgbWFjcm8gaXMgdXNlZCBmb3IgY3B1IHR5cGVzIHByZXNlbnQgaW4gY29tcGlsZXItcnQvbGliZ2NjLgorI2lmbmRlZiBYODZfQ1BVX1RZUEVfQ09NUEFUCisjZGVmaW5lIFg4Nl9DUFVfVFlQRV9DT01QQVQoQVJDSE5BTUUsIEVOVU0sIFNUUikgWDg2X0NQVV9UWVBFKEFSQ0hOQU1FLCBFTlVNKQorI2VuZGlmCisKKyNpZm5kZWYgWDg2X0NQVV9UWVBFCisjZGVmaW5lIFg4Nl9DUFVfVFlQRShBUkNITkFNRSwgRU5VTSkKKyNlbmRpZgorWDg2X0NQVV9UWVBFX0NPTVBBVF9XSVRIX0FMSUFTKCJib25uZWxsIiwgICAgSU5URUxfQk9OTkVMTCwgICAgImJvbm5lbGwiLCAiYXRvbSIpCitYODZfQ1BVX1RZUEVfQ09NUEFUICAgICAgICAgICAoImNvcmUyIiwgICAgICBJTlRFTF9DT1JFMiwgICAgICAiY29yZTIiKQorWDg2X0NQVV9UWVBFX0NPTVBBVCAgICAgICAgICAgKCJuZWhhbGVtIiwgICAgSU5URUxfQ09SRUk3LCAgICAgImNvcmVpNyIpCitYODZfQ1BVX1RZUEVfQ09NUEFUX1dJVEhfQUxJQVMoImFtZGZhbTEwIiwgICBBTURGQU0xMEgsICAgICAgICAiYW1kZmFtMTBoIiwgImFtZGZhbTEwIikKK1g4Nl9DUFVfVFlQRV9DT01QQVRfV0lUSF9BTElBUygiYmR2ZXIxIiwgICAgIEFNREZBTTE1SCwgICAgICAgICJhbWRmYW0xNWgiLCAiYW1kZmFtMTUiKQorWDg2X0NQVV9UWVBFX0NPTVBBVF9XSVRIX0FMSUFTKCJzaWx2ZXJtb250IiwgSU5URUxfU0lMVkVSTU9OVCwgInNpbHZlcm1vbnQiLCAic2xtIikKK1g4Nl9DUFVfVFlQRV9DT01QQVQgICAgICAgICAgICgia25sIiwgICAgICAgIElOVEVMX0tOTCwgICAgICAgICJrbmwiKQorWDg2X0NQVV9UWVBFX0NPTVBBVCAgICAgICAgICAgKCJidHZlcjEiLCAgICAgQU1EX0JUVkVSMSwgICAgICAgImJ0dmVyMSIpCitYODZfQ1BVX1RZUEVfQ09NUEFUICAgICAgICAgICAoImJ0dmVyMiIsICAgICBBTURfQlRWRVIyLCAgICAgICAiYnR2ZXIyIikKK1g4Nl9DUFVfVFlQRV9DT01QQVQgICAgICAgICAgICgiem52ZXIxIiwgICAgIEFNREZBTTE3SCwgICAgICAgICJhbWRmYW0xN2giKQorWDg2X0NQVV9UWVBFX0NPTVBBVCAgICAgICAgICAgKCJrbm0iLCAgICAgICAgSU5URUxfS05NLCAgICAgICAgImtubSIpCisvLyBFbnRyaWVzIGJlbG93IHRoaXMgYXJlIG5vdCBpbiBsaWJnY2MvY29tcGlsZXItcnQuCitYODZfQ1BVX1RZUEUgICAgICAgICAgICAgICAgICAoImkzODYiLCAgICAgICAgSU5URUxfaTM4NikKK1g4Nl9DUFVfVFlQRSAgICAgICAgICAgICAgICAgICgiaTQ4NiIsICAgICAgICBJTlRFTF9pNDg2KQorWDg2X0NQVV9UWVBFICAgICAgICAgICAgICAgICAgKCJwZW50aXVtIiwgICAgIElOVEVMX1BFTlRJVU0pCitYODZfQ1BVX1RZUEUgICAgICAgICAgICAgICAgICAoInBlbnRpdW0tbW14IiwgSU5URUxfUEVOVElVTV9NTVgpCitYODZfQ1BVX1RZUEUgICAgICAgICAgICAgICAgICAoInBlbnRpdW1wcm8iLCAgSU5URUxfUEVOVElVTV9QUk8pCitYODZfQ1BVX1RZUEUgICAgICAgICAgICAgICAgICAoInBlbnRpdW0yIiwgICAgSU5URUxfUEVOVElVTV9JSSkKK1g4Nl9DUFVfVFlQRSAgICAgICAgICAgICAgICAgICgicGVudGl1bTMiLCAgICBJTlRFTF9QRU5USVVNX0lJSSkKK1g4Nl9DUFVfVFlQRSAgICAgICAgICAgICAgICAgICgicGVudGl1bTQiLCAgICBJTlRFTF9QRU5USVVNX0lWKQorWDg2X0NQVV9UWVBFICAgICAgICAgICAgICAgICAgKCJwZW50aXVtLW0iLCAgIElOVEVMX1BFTlRJVU1fTSkKK1g4Nl9DUFVfVFlQRSAgICAgICAgICAgICAgICAgICgieW9uYWgiLCAgICAgICBJTlRFTF9DT1JFX0RVTykKK1g4Nl9DUFVfVFlQRSAgICAgICAgICAgICAgICAgICgibm9jb25hIiwgICAgICBJTlRFTF9OT0NPTkEpCitYODZfQ1BVX1RZUEUgICAgICAgICAgICAgICAgICAoInByZXNjb3R0IiwgICAgSU5URUxfUFJFU0NPVFQpCitYODZfQ1BVX1RZUEUgICAgICAgICAgICAgICAgICAoImk0ODYiLCAgICAgICAgQU1EX2k0ODYpCitYODZfQ1BVX1RZUEUgICAgICAgICAgICAgICAgICAoInBlbnRpdW0iLCAgICAgQU1EUEVOVElVTSkKK1g4Nl9DUFVfVFlQRSAgICAgICAgICAgICAgICAgICgiYXRobG9uIiwgICAgICBBTURfQVRITE9OKQorWDg2X0NQVV9UWVBFICAgICAgICAgICAgICAgICAgKCJhdGhsb24teHAiLCAgIEFNRF9BVEhMT05fWFApCitYODZfQ1BVX1RZUEUgICAgICAgICAgICAgICAgICAoIms4IiwgICAgICAgICAgQU1EX0s4KQorWDg2X0NQVV9UWVBFICAgICAgICAgICAgICAgICAgKCJrOC1zc2UzIiwgICAgIEFNRF9LOFNTRTMpCitYODZfQ1BVX1RZUEUgICAgICAgICAgICAgICAgICAoImdvbGRtb250IiwgICAgSU5URUxfR09MRE1PTlQpCisjdW5kZWYgWDg2X0NQVV9UWVBFX0NPTVBBVF9XSVRIX0FMSUFTCisjdW5kZWYgWDg2X0NQVV9UWVBFX0NPTVBBVAorI3VuZGVmIFg4Nl9DUFVfVFlQRQorCisvLyBUaGlzIG1hY3JvIGlzIHVzZWQgZm9yIGNwdSBzdWJ0eXBlcyBwcmVzZW50IGluIGNvbXBpbGVyLXJ0L2xpYmdjYy4KKyNpZm5kZWYgWDg2X0NQVV9TVUJUWVBFX0NPTVBBVAorI2RlZmluZSBYODZfQ1BVX1NVQlRZUEVfQ09NUEFUKEFSQ0hOQU1FLCBFTlVNLCBTVFIpIFg4Nl9DUFVfU1VCVFlQRShBUkNITkFNRSwgRU5VTSkKKyNlbmRpZgorCisjaWZuZGVmIFg4Nl9DUFVfU1VCVFlQRQorI2RlZmluZSBYODZfQ1BVX1NVQlRZUEUoQVJDSE5BTUUsIEVOVU0pCisjZW5kaWYKKworWDg2X0NQVV9TVUJUWVBFX0NPTVBBVCgibmVoYWxlbSIsICAgICAgICBJTlRFTF9DT1JFSTdfTkVIQUxFTSwgICAgICAgICJuZWhhbGVtIikKK1g4Nl9DUFVfU1VCVFlQRV9DT01QQVQoIndlc3RtZXJlIiwgICAgICAgSU5URUxfQ09SRUk3X1dFU1RNRVJFLCAgICAgICAid2VzdG1lcmUiKQorWDg2X0NQVV9TVUJUWVBFX0NPTVBBVCgic2FuZHlicmlkZ2UiLCAgICBJTlRFTF9DT1JFSTdfU0FORFlCUklER0UsICAgICJzYW5keWJyaWRnZSIpCitYODZfQ1BVX1NVQlRZUEVfQ09NUEFUKCJhbWRmYW0xMCIsICAgICAgIEFNREZBTTEwSF9CQVJDRUxPTkEsICAgICAgICAgImJhcmNlbG9uYSIpCitYODZfQ1BVX1NVQlRZUEVfQ09NUEFUKCJhbWRmYW0xMCIsICAgICAgIEFNREZBTTEwSF9TSEFOR0hBSSwgICAgICAgICAgInNoYW5naGFpIikKK1g4Nl9DUFVfU1VCVFlQRV9DT01QQVQoImFtZGZhbTEwIiwgICAgICAgQU1ERkFNMTBIX0lTVEFOQlVMLCAgICAgICAgICAiaXN0YW5idWwiKQorWDg2X0NQVV9TVUJUWVBFX0NPTVBBVCgiYmR2ZXIxIiwgICAgICAgICBBTURGQU0xNUhfQkRWRVIxLCAgICAgICAgICAgICJiZHZlcjEiKQorWDg2X0NQVV9TVUJUWVBFX0NPTVBBVCgiYmR2ZXIyIiwgICAgICAgICBBTURGQU0xNUhfQkRWRVIyLCAgICAgICAgICAgICJiZHZlcjIiKQorWDg2X0NQVV9TVUJUWVBFX0NPTVBBVCgiYmR2ZXIzIiwgICAgICAgICBBTURGQU0xNUhfQkRWRVIzLCAgICAgICAgICAgICJiZHZlcjMiKQorWDg2X0NQVV9TVUJUWVBFX0NPTVBBVCgiYmR2ZXI0IiwgICAgICAgICBBTURGQU0xNUhfQkRWRVI0LCAgICAgICAgICAgICJiZHZlcjQiKQorWDg2X0NQVV9TVUJUWVBFX0NPTVBBVCgiem52ZXIxIiwgICAgICAgICBBTURGQU0xN0hfWk5WRVIxLCAgICAgICAgICAgICJ6bnZlcjEiKQorWDg2X0NQVV9TVUJUWVBFX0NPTVBBVCgiaXZ5YnJpZGdlIiwgICAgICBJTlRFTF9DT1JFSTdfSVZZQlJJREdFLCAgICAgICJpdnlicmlkZ2UiKQorWDg2X0NQVV9TVUJUWVBFX0NPTVBBVCgiaGFzd2VsbCIsICAgICAgICBJTlRFTF9DT1JFSTdfSEFTV0VMTCwgICAgICAgICJoYXN3ZWxsIikKK1g4Nl9DUFVfU1VCVFlQRV9DT01QQVQoImJyb2Fkd2VsbCIsICAgICAgSU5URUxfQ09SRUk3X0JST0FEV0VMTCwgICAgICAiYnJvYWR3ZWxsIikKK1g4Nl9DUFVfU1VCVFlQRV9DT01QQVQoInNreWxha2UiLCAgICAgICAgSU5URUxfQ09SRUk3X1NLWUxBS0UsICAgICAgICAic2t5bGFrZSIpCitYODZfQ1BVX1NVQlRZUEVfQ09NUEFUKCJza3lsYWtlLWF2eDUxMiIsIElOVEVMX0NPUkVJN19TS1lMQUtFX0FWWDUxMiwgInNreWxha2UtYXZ4NTEyIikKK1g4Nl9DUFVfU1VCVFlQRV9DT01QQVQoImNhbm5vbmxha2UiLCAgICAgSU5URUxfQ09SRUk3X0NBTk5PTkxBS0UsICAgICAiY2Fubm9ubGFrZSIpCisvLyBFbnRyaWVzIGJlbG93IHRoaXMgYXJlIG5vdCBpbiBsaWJnY2MvY29tcGlsZXItcnQuCitYODZfQ1BVX1NVQlRZUEUgICAgICAgKCJjb3JlMiIsICAgICAgICAgIElOVEVMX0NPUkUyXzY1KQorWDg2X0NQVV9TVUJUWVBFICAgICAgICgicGVucnluIiwgICAgICAgICBJTlRFTF9DT1JFMl80NSkKK1g4Nl9DUFVfU1VCVFlQRSAgICAgICAoIms2IiwgICAgICAgICAgICAgQU1EUEVOVElVTV9LNikKK1g4Nl9DUFVfU1VCVFlQRSAgICAgICAoIms2LTIiLCAgICAgICAgICAgQU1EUEVOVElVTV9LNjIpCitYODZfQ1BVX1NVQlRZUEUgICAgICAgKCJrNi0zIiwgICAgICAgICAgIEFNRFBFTlRJVU1fSzYzKQorWDg2X0NQVV9TVUJUWVBFICAgICAgICgiZ2VvZGUiLCAgICAgICAgICBBTURQRU5USVVNX0dFT0RFKQorI3VuZGVmIFg4Nl9DUFVfU1VCVFlQRV9DT01QQVQKKyN1bmRlZiBYODZfQ1BVX1NVQlRZUEUKKworCisvLyBUaGlzIG1hY3JvIGlzIHVzZWQgZm9yIGNwdSB0eXBlcyBwcmVzZW50IGluIGNvbXBpbGVyLXJ0L2xpYmdjYy4KKyNpZm5kZWYgWDg2X0ZFQVRVUkVfQ09NUEFUCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0NPTVBBVChWQUwsIEVOVU0sIFNUUikgWDg2X0ZFQVRVUkUoVkFMLCBFTlVNKQorI2VuZGlmCisKKyNpZm5kZWYgWDg2X0ZFQVRVUkUKKyNkZWZpbmUgWDg2X0ZFQVRVUkUoVkFMLCBFTlVNKQorI2VuZGlmCitYODZfRkVBVFVSRV9DT01QQVQoIDAsIEZFQVRVUkVfQ01PViwgICAgICAgICAgICAiY21vdiIpCitYODZfRkVBVFVSRV9DT01QQVQoIDEsIEZFQVRVUkVfTU1YLCAgICAgICAgICAgICAibW14IikKK1g4Nl9GRUFUVVJFX0NPTVBBVCggMiwgRkVBVFVSRV9QT1BDTlQsICAgICAgICAgICJwb3BjbnQiKQorWDg2X0ZFQVRVUkVfQ09NUEFUKCAzLCBGRUFUVVJFX1NTRSwgICAgICAgICAgICAgInNzZSIpCitYODZfRkVBVFVSRV9DT01QQVQoIDQsIEZFQVRVUkVfU1NFMiwgICAgICAgICAgICAic3NlMiIpCitYODZfRkVBVFVSRV9DT01QQVQoIDUsIEZFQVRVUkVfU1NFMywgICAgICAgICAgICAic3NlMyIpCitYODZfRkVBVFVSRV9DT01QQVQoIDYsIEZFQVRVUkVfU1NTRTMsICAgICAgICAgICAic3NzZTMiKQorWDg2X0ZFQVRVUkVfQ09NUEFUKCA3LCBGRUFUVVJFX1NTRTRfMSwgICAgICAgICAgInNzZTQuMSIpCitYODZfRkVBVFVSRV9DT01QQVQoIDgsIEZFQVRVUkVfU1NFNF8yLCAgICAgICAgICAic3NlNC4yIikKK1g4Nl9GRUFUVVJFX0NPTVBBVCggOSwgRkVBVFVSRV9BVlgsICAgICAgICAgICAgICJhdngiKQorWDg2X0ZFQVRVUkVfQ09NUEFUKDEwLCBGRUFUVVJFX0FWWDIsICAgICAgICAgICAgImF2eDIiKQorWDg2X0ZFQVRVUkVfQ09NUEFUKDExLCBGRUFUVVJFX1NTRTRfQSwgICAgICAgICAgInNzZTRhIikKK1g4Nl9GRUFUVVJFX0NPTVBBVCgxMiwgRkVBVFVSRV9GTUE0LCAgICAgICAgICAgICJmbWE0IikKK1g4Nl9GRUFUVVJFX0NPTVBBVCgxMywgRkVBVFVSRV9YT1AsICAgICAgICAgICAgICJ4b3AiKQorWDg2X0ZFQVRVUkVfQ09NUEFUKDE0LCBGRUFUVVJFX0ZNQSwgICAgICAgICAgICAgImZtYSIpCitYODZfRkVBVFVSRV9DT01QQVQoMTUsIEZFQVRVUkVfQVZYNTEyRiwgICAgICAgICAiYXZ4NTEyZiIpCitYODZfRkVBVFVSRV9DT01QQVQoMTYsIEZFQVRVUkVfQk1JLCAgICAgICAgICAgICAiYm1pIikKK1g4Nl9GRUFUVVJFX0NPTVBBVCgxNywgRkVBVFVSRV9CTUkyLCAgICAgICAgICAgICJibWkyIikKK1g4Nl9GRUFUVVJFX0NPTVBBVCgxOCwgRkVBVFVSRV9BRVMsICAgICAgICAgICAgICJhZXMiKQorWDg2X0ZFQVRVUkVfQ09NUEFUKDE5LCBGRUFUVVJFX1BDTE1VTCwgICAgICAgICAgInBjbG11bCIpCitYODZfRkVBVFVSRV9DT01QQVQoMjAsIEZFQVRVUkVfQVZYNTEyVkwsICAgICAgICAiYXZ4NTEydmwiKQorWDg2X0ZFQVRVUkVfQ09NUEFUKDIxLCBGRUFUVVJFX0FWWDUxMkJXLCAgICAgICAgImF2eDUxMmJ3IikKK1g4Nl9GRUFUVVJFX0NPTVBBVCgyMiwgRkVBVFVSRV9BVlg1MTJEUSwgICAgICAgICJhdng1MTJkcSIpCitYODZfRkVBVFVSRV9DT01QQVQoMjMsIEZFQVRVUkVfQVZYNTEyQ0QsICAgICAgICAiYXZ4NTEyY2QiKQorWDg2X0ZFQVRVUkVfQ09NUEFUKDI0LCBGRUFUVVJFX0FWWDUxMkVSLCAgICAgICAgImF2eDUxMmVyIikKK1g4Nl9GRUFUVVJFX0NPTVBBVCgyNSwgRkVBVFVSRV9BVlg1MTJQRiwgICAgICAgICJhdng1MTJwZiIpCitYODZfRkVBVFVSRV9DT01QQVQoMjYsIEZFQVRVUkVfQVZYNTEyVkJNSSwgICAgICAiYXZ4NTEydmJtaSIpCitYODZfRkVBVFVSRV9DT01QQVQoMjcsIEZFQVRVUkVfQVZYNTEySUZNQSwgICAgICAiYXZ4NTEyaWZtYSIpCitYODZfRkVBVFVSRV9DT01QQVQoMjgsIEZFQVRVUkVfQVZYNTEyNFZOTklXLCAgICAiYXZ4NTEyNHZubml3IikKK1g4Nl9GRUFUVVJFX0NPTVBBVCgyOSwgRkVBVFVSRV9BVlg1MTI0Rk1BUFMsICAgICJhdng1MTI0Zm1hcHMiKQorWDg2X0ZFQVRVUkVfQ09NUEFUKDMwLCBGRUFUVVJFX0FWWDUxMlZQT1BDTlREUSwgImF2eDUxMnZwb3BjbnRkcSIpCisvLyBGZWF0dXJlcyBiZWxvdyBoZXJlIGFyZSBub3QgaW4gbGliZ2NjL2NvbXBpbGVyLXJ0LgorWDg2X0ZFQVRVUkUgICAgICAgKDMyLCBGRUFUVVJFX01PVkJFKQorWDg2X0ZFQVRVUkUgICAgICAgKDMzLCBGRUFUVVJFX0FEWCkKK1g4Nl9GRUFUVVJFICAgICAgICgzNCwgRkVBVFVSRV9FTTY0VCkKK1g4Nl9GRUFUVVJFICAgICAgICgzNSwgRkVBVFVSRV9DTEZMVVNIT1BUKQorWDg2X0ZFQVRVUkUgICAgICAgKDM2LCBGRUFUVVJFX1NIQSkKKyN1bmRlZiBYODZfRkVBVFVSRV9DT01QQVQKKyN1bmRlZiBYODZfRkVBVFVSRQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1lBTUxQYXJzZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9ZQU1MUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzM2FkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9ZQU1MUGFyc2VyLmgKQEAgLTAsMCArMSw2MjAgQEAKKy8vPT09LSBZQU1MUGFyc2VyLmggLSBTaW1wbGUgWUFNTCBwYXJzZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgaXMgYSBZQU1MIDEuMiBwYXJzZXIuCisvLworLy8gIFNlZSBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCBmb3IgdGhlIGZ1bGwgc3RhbmRhcmQuCisvLworLy8gIFRoaXMgY3VycmVudGx5IGRvZXMgbm90IGltcGxlbWVudCB0aGUgZm9sbG93aW5nOgorLy8gICAgKiBNdWx0aS1saW5lIGxpdGVyYWwgZm9sZGluZy4KKy8vICAgICogVGFnIHJlc29sdXRpb24uCisvLyAgICAqIFVURi0xNi4KKy8vICAgICogQk9NcyBhbnl3aGVyZSBvdGhlciB0aGFuIHRoZSBmaXJzdCBVbmljb2RlIHNjYWxhciB2YWx1ZSBpbiB0aGUgZmlsZS4KKy8vCisvLyAgVGhlIG1vc3QgaW1wb3J0YW50IGNsYXNzIGhlcmUgaXMgU3RyZWFtLiBUaGlzIHJlcHJlc2VudHMgYSBZQU1MIHN0cmVhbSB3aXRoCisvLyAgMCwgMSwgb3IgbWFueSBkb2N1bWVudHMuCisvLworLy8gIFNvdXJjZU1nciBzbTsKKy8vICBTdHJpbmdSZWYgaW5wdXQgPSBnZXRJbnB1dCgpOworLy8gIHlhbWw6OlN0cmVhbSBzdHJlYW0oaW5wdXQsIHNtKTsKKy8vCisvLyAgZm9yICh5YW1sOjpkb2N1bWVudF9pdGVyYXRvciBkaSA9IHN0cmVhbS5iZWdpbigpLCBkZSA9IHN0cmVhbS5lbmQoKTsKKy8vICAgICAgIGRpICE9IGRlOyArK2RpKSB7CisvLyAgICB5YW1sOjpOb2RlICpuID0gZGktPmdldFJvb3QoKTsKKy8vICAgIGlmIChuKSB7CisvLyAgICAgIC8vIERvIHNvbWV0aGluZyB3aXRoIG4uLi4KKy8vICAgIH0gZWxzZQorLy8gICAgICBicmVhazsKKy8vICB9CisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfWUFNTFBBUlNFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9ZQU1MUEFSU0VSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU01Mb2MuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1lbW9yeUJ1ZmZlclJlZjsKK2NsYXNzIFNvdXJjZU1ncjsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgVHdpbmU7CisKK25hbWVzcGFjZSB5YW1sIHsKKworY2xhc3MgRG9jdW1lbnQ7CitjbGFzcyBkb2N1bWVudF9pdGVyYXRvcjsKK2NsYXNzIE5vZGU7CitjbGFzcyBTY2FubmVyOworc3RydWN0IFRva2VuOworCisvLy8gXGJyaWVmIER1bXAgYWxsIHRoZSB0b2tlbnMgaW4gdGhpcyBzdHJlYW0gdG8gT1MuCisvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IsIGZhbHNlIG90aGVyd2lzZS4KK2Jvb2wgZHVtcFRva2VucyhTdHJpbmdSZWYgSW5wdXQsIHJhd19vc3RyZWFtICYpOworCisvLy8gXGJyaWVmIFNjYW5zIGFsbCB0b2tlbnMgaW4gaW5wdXQgd2l0aG91dCBvdXRwdXR0aW5nIGFueXRoaW5nLiBUaGlzIGlzIHVzZWQKKy8vLyAgICAgICAgZm9yIGJlbmNobWFya2luZyB0aGUgdG9rZW5pemVyLgorLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlcmUgd2FzIGFuIGVycm9yLCBmYWxzZSBvdGhlcndpc2UuCitib29sIHNjYW5Ub2tlbnMoU3RyaW5nUmVmIElucHV0KTsKKworLy8vIFxicmllZiBFc2NhcGUgXGEgSW5wdXQgZm9yIGEgZG91YmxlIHF1b3RlZCBzY2FsYXI7IGlmIFxwIEVzY2FwZVByaW50YWJsZQorLy8vIGlzIHRydWUsIGFsbCBVVEY4IHNlcXVlbmNlcyB3aWxsIGJlIGVzY2FwZWQsIGlmIFxwIEVzY2FwZVByaW50YWJsZSBpcworLy8vIGZhbHNlLCB0aG9zZSBVVEY4IHNlcXVlbmNlcyBlbmNvZGluZyBwcmludGFibGUgdW5pY29kZSBzY2FsYXJzIHdpbGwgbm90IGJlCisvLy8gZXNjYXBlZCwgYnV0IGVtaXR0ZWQgdmVyYmF0aW0uCitzdGQ6OnN0cmluZyBlc2NhcGUoU3RyaW5nUmVmIElucHV0LCBib29sIEVzY2FwZVByaW50YWJsZSA9IHRydWUpOworCisvLy8gXGJyaWVmIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFlBTUwgc3RyZWFtIHBvdGVudGlhbGx5IGNvbnRhaW5pbmcgbXVsdGlwbGUKKy8vLyAgICAgICAgZG9jdW1lbnRzLgorY2xhc3MgU3RyZWFtIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBUaGlzIGtlZXBzIGEgcmVmZXJlbmNlIHRvIHRoZSBzdHJpbmcgcmVmZXJlbmNlZCBieSBccCBJbnB1dC4KKyAgU3RyZWFtKFN0cmluZ1JlZiBJbnB1dCwgU291cmNlTWdyICYsIGJvb2wgU2hvd0NvbG9ycyA9IHRydWUsCisgICAgICAgICBzdGQ6OmVycm9yX2NvZGUgKkVDID0gbnVsbHB0cik7CisKKyAgU3RyZWFtKE1lbW9yeUJ1ZmZlclJlZiBJbnB1dEJ1ZmZlciwgU291cmNlTWdyICYsIGJvb2wgU2hvd0NvbG9ycyA9IHRydWUsCisgICAgICAgICBzdGQ6OmVycm9yX2NvZGUgKkVDID0gbnVsbHB0cik7CisgIH5TdHJlYW0oKTsKKworICBkb2N1bWVudF9pdGVyYXRvciBiZWdpbigpOworICBkb2N1bWVudF9pdGVyYXRvciBlbmQoKTsKKyAgdm9pZCBza2lwKCk7CisgIGJvb2wgZmFpbGVkKCk7CisKKyAgYm9vbCB2YWxpZGF0ZSgpIHsKKyAgICBza2lwKCk7CisgICAgcmV0dXJuICFmYWlsZWQoKTsKKyAgfQorCisgIHZvaWQgcHJpbnRFcnJvcihOb2RlICpOLCBjb25zdCBUd2luZSAmTXNnKTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIERvY3VtZW50OworCisgIHN0ZDo6dW5pcXVlX3B0cjxTY2FubmVyPiBzY2FubmVyOworICBzdGQ6OnVuaXF1ZV9wdHI8RG9jdW1lbnQ+IEN1cnJlbnREb2M7Cit9OworCisvLy8gXGJyaWVmIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBOb2Rlcy4KK2NsYXNzIE5vZGUgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3B1YmxpYzoKKyAgZW51bSBOb2RlS2luZCB7CisgICAgTktfTnVsbCwKKyAgICBOS19TY2FsYXIsCisgICAgTktfQmxvY2tTY2FsYXIsCisgICAgTktfS2V5VmFsdWUsCisgICAgTktfTWFwcGluZywKKyAgICBOS19TZXF1ZW5jZSwKKyAgICBOS19BbGlhcworICB9OworCisgIE5vZGUodW5zaWduZWQgaW50IFR5cGUsIHN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gJiwgU3RyaW5nUmVmIEFuY2hvciwKKyAgICAgICBTdHJpbmdSZWYgVGFnKTsKKworICAvLyBJdCdzIG5vdCBzYWZlIHRvIGNvcHkgWUFNTCBub2RlczsgdGhlIGRvY3VtZW50IGlzIHN0cmVhbWVkIGFuZCB0aGUgcG9zaXRpb24KKyAgLy8gaXMgcGFydCBvZiB0aGUgc3RhdGUuCisgIE5vZGUoY29uc3QgTm9kZSAmKSA9IGRlbGV0ZTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTm9kZSAmKSA9IGRlbGV0ZTsKKworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IFNpemUsIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEFsaWdubWVudCA9IDE2KSBub2V4Y2VwdCB7CisgICAgcmV0dXJuIEFsbG9jLkFsbG9jYXRlKFNpemUsIEFsaWdubWVudCk7CisgIH0KKworICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpQdHIsIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgU2l6ZSkgbm9leGNlcHQgeworICAgIEFsbG9jLkRlYWxsb2NhdGUoUHRyLCBTaXplKTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgbm9leGNlcHQgPSBkZWxldGU7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBhbmNob3IgYXR0YWNoZWQgdG8gdGhpcyBub2RlLiBJZiBpdCBkb2VzIG5vdAorICAvLy8gICAgICAgIGhhdmUgb25lLCBnZXRBbmNob3IoKS5zaXplKCkgd2lsbCBiZSAwLgorICBTdHJpbmdSZWYgZ2V0QW5jaG9yKCkgY29uc3QgeyByZXR1cm4gQW5jaG9yOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHRhZyBhcyBpdCB3YXMgd3JpdHRlbiBpbiB0aGUgZG9jdW1lbnQuIFRoaXMgZG9lcyBub3QKKyAgLy8vICAgcGVyZm9ybSB0YWcgcmVzb2x1dGlvbi4KKyAgU3RyaW5nUmVmIGdldFJhd1RhZygpIGNvbnN0IHsgcmV0dXJuIFRhZzsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSB2ZXJiYXRpdW0gdGFnIGZvciBhIGdpdmVuIE5vZGUuIFRoaXMgcGVyZm9ybXMgdGFnIHJlc29sdXRvbgorICAvLy8gICBhbmQgc3Vic3RpdHV0aW9uLgorICBzdGQ6OnN0cmluZyBnZXRWZXJiYXRpbVRhZygpIGNvbnN0OworCisgIFNNUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCB7IHJldHVybiBTb3VyY2VSYW5nZTsgfQorICB2b2lkIHNldFNvdXJjZVJhbmdlKFNNUmFuZ2UgU1IpIHsgU291cmNlUmFuZ2UgPSBTUjsgfQorCisgIC8vIFRoZXNlIGZ1bmN0aW9ucyBmb3J3YXJkIHRvIERvY3VtZW50IGFuZCBTY2FubmVyLgorICBUb2tlbiAmcGVla05leHQoKTsKKyAgVG9rZW4gZ2V0TmV4dCgpOworICBOb2RlICpwYXJzZUJsb2NrTm9kZSgpOworICBCdW1wUHRyQWxsb2NhdG9yICZnZXRBbGxvY2F0b3IoKTsKKyAgdm9pZCBzZXRFcnJvcihjb25zdCBUd2luZSAmTWVzc2FnZSwgVG9rZW4gJkxvY2F0aW9uKSBjb25zdDsKKyAgYm9vbCBmYWlsZWQoKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgc2tpcCgpIHt9CisKKyAgdW5zaWduZWQgaW50IGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBUeXBlSUQ7IH0KKworcHJvdGVjdGVkOgorICBzdGQ6OnVuaXF1ZV9wdHI8RG9jdW1lbnQ+ICZEb2M7CisgIFNNUmFuZ2UgU291cmNlUmFuZ2U7CisKKyAgfk5vZGUoKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgIHVuc2lnbmVkIGludCBUeXBlSUQ7CisgIFN0cmluZ1JlZiBBbmNob3I7CisgIC8vLyBcYnJpZWYgVGhlIHRhZyBhcyB0eXBlZCBpbiB0aGUgZG9jdW1lbnQuCisgIFN0cmluZ1JlZiBUYWc7Cit9OworCisvLy8gXGJyaWVmIEEgbnVsbCB2YWx1ZS4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8gICAhIW51bGwgbnVsbAorY2xhc3MgTnVsbE5vZGUgZmluYWwgOiBwdWJsaWMgTm9kZSB7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgTnVsbE5vZGUoc3RkOjp1bmlxdWVfcHRyPERvY3VtZW50PiAmRCkKKyAgICAgIDogTm9kZShOS19OdWxsLCBELCBTdHJpbmdSZWYoKSwgU3RyaW5nUmVmKCkpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBOb2RlICpOKSB7IHJldHVybiBOLT5nZXRUeXBlKCkgPT0gTktfTnVsbDsgfQorfTsKKworLy8vIFxicmllZiBBIHNjYWxhciBub2RlIGlzIGFuIG9wYXF1ZSBkYXR1bSB0aGF0IGNhbiBiZSBwcmVzZW50ZWQgYXMgYQorLy8vICAgICAgICBzZXJpZXMgb2YgemVybyBvciBtb3JlIFVuaWNvZGUgc2NhbGFyIHZhbHVlcy4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8gICBBZGVuYQorY2xhc3MgU2NhbGFyTm9kZSBmaW5hbCA6IHB1YmxpYyBOb2RlIHsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBTY2FsYXJOb2RlKHN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gJkQsIFN0cmluZ1JlZiBBbmNob3IsIFN0cmluZ1JlZiBUYWcsCisgICAgICAgICAgICAgU3RyaW5nUmVmIFZhbCkKKyAgICAgIDogTm9kZShOS19TY2FsYXIsIEQsIEFuY2hvciwgVGFnKSwgVmFsdWUoVmFsKSB7CisgICAgU01Mb2MgU3RhcnQgPSBTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoVmFsLmJlZ2luKCkpOworICAgIFNNTG9jIEVuZCA9IFNNTG9jOjpnZXRGcm9tUG9pbnRlcihWYWwuZW5kKCkpOworICAgIFNvdXJjZVJhbmdlID0gU01SYW5nZShTdGFydCwgRW5kKTsKKyAgfQorCisgIC8vIFJldHVybiBWYWx1ZSB3aXRob3V0IGFueSBlc2NhcGluZyBvciBmb2xkaW5nIG9yIG90aGVyIGZ1biBZQU1MIHN0dWZmLiBUaGlzCisgIC8vIGlzIHRoZSBleGFjdCBieXRlcyB0aGF0IGFyZSBjb250YWluZWQgaW4gdGhlIGZpbGUgKGFmdGVyIGNvbnZlcnNpb24gdG8KKyAgLy8gdXRmOCkuCisgIFN0cmluZ1JlZiBnZXRSYXdWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgLy8vIFxicmllZiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIG5vZGUgYXMgYSBTdHJpbmdSZWYuCisgIC8vLworICAvLy8gXHBhcmFtIFN0b3JhZ2UgaXMgdXNlZCB0byBzdG9yZSB0aGUgY29udGVudCBvZiB0aGUgcmV0dXJuZWQgU3RyaW5nUmVmIGlmZgorICAvLy8gICAgICAgIGl0IHJlcXVpcmVzIGFueSBtb2RpZmljYXRpb24gZnJvbSBob3cgaXQgYXBwZWFyZWQgaW4gdGhlIHNvdXJjZS4KKyAgLy8vICAgICAgICBUaGlzIGhhcHBlbnMgd2l0aCBlc2NhcGVkIGNoYXJhY3RlcnMgYW5kIG11bHRpLWxpbmUgbGl0ZXJhbHMuCisgIFN0cmluZ1JlZiBnZXRWYWx1ZShTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlN0b3JhZ2UpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRUeXBlKCkgPT0gTktfU2NhbGFyOworICB9CisKK3ByaXZhdGU6CisgIFN0cmluZ1JlZiBWYWx1ZTsKKworICBTdHJpbmdSZWYgdW5lc2NhcGVEb3VibGVRdW90ZWQoU3RyaW5nUmVmIFVucXVvdGVkVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWY6OnNpemVfdHlwZSBTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmU3RvcmFnZSkgY29uc3Q7Cit9OworCisvLy8gXGJyaWVmIEEgYmxvY2sgc2NhbGFyIG5vZGUgaXMgYW4gb3BhcXVlIGRhdHVtIHRoYXQgY2FuIGJlIHByZXNlbnRlZCBhcyBhCisvLy8gICAgICAgIHNlcmllcyBvZiB6ZXJvIG9yIG1vcmUgVW5pY29kZSBzY2FsYXIgdmFsdWVzLgorLy8vCisvLy8gRXhhbXBsZToKKy8vLyAgIHwKKy8vLyAgICAgSGVsbG8KKy8vLyAgICAgV29ybGQKK2NsYXNzIEJsb2NrU2NhbGFyTm9kZSBmaW5hbCA6IHB1YmxpYyBOb2RlIHsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBCbG9ja1NjYWxhck5vZGUoc3RkOjp1bmlxdWVfcHRyPERvY3VtZW50PiAmRCwgU3RyaW5nUmVmIEFuY2hvciwgU3RyaW5nUmVmIFRhZywKKyAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBWYWx1ZSwgU3RyaW5nUmVmIFJhd1ZhbCkKKyAgICAgIDogTm9kZShOS19CbG9ja1NjYWxhciwgRCwgQW5jaG9yLCBUYWcpLCBWYWx1ZShWYWx1ZSkgeworICAgIFNNTG9jIFN0YXJ0ID0gU01Mb2M6OmdldEZyb21Qb2ludGVyKFJhd1ZhbC5iZWdpbigpKTsKKyAgICBTTUxvYyBFbmQgPSBTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoUmF3VmFsLmVuZCgpKTsKKyAgICBTb3VyY2VSYW5nZSA9IFNNUmFuZ2UoU3RhcnQsIEVuZCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldHMgdGhlIHZhbHVlIG9mIHRoaXMgbm9kZSBhcyBhIFN0cmluZ1JlZi4KKyAgU3RyaW5nUmVmIGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0VHlwZSgpID09IE5LX0Jsb2NrU2NhbGFyOworICB9CisKK3ByaXZhdGU6CisgIFN0cmluZ1JlZiBWYWx1ZTsKK307CisKKy8vLyBcYnJpZWYgQSBrZXkgYW5kIHZhbHVlIHBhaXIuIFdoaWxlIG5vdCB0ZWNobmljYWxseSBhIE5vZGUgdW5kZXIgdGhlIFlBTUwKKy8vLyAgICAgICAgcmVwcmVzZW50YXRpb24gZ3JhcGgsIGl0IGlzIGVhc2llciB0byB0cmVhdCB0aGVtIHRoaXMgd2F5LgorLy8vCisvLy8gVE9ETzogQ29uc2lkZXIgbWFraW5nIHRoaXMgbm90IGEgY2hpbGQgb2YgTm9kZS4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8gICBTZWN0aW9uOiAudGV4dAorY2xhc3MgS2V5VmFsdWVOb2RlIGZpbmFsIDogcHVibGljIE5vZGUgeworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIEtleVZhbHVlTm9kZShzdGQ6OnVuaXF1ZV9wdHI8RG9jdW1lbnQ+ICZEKQorICAgICAgOiBOb2RlKE5LX0tleVZhbHVlLCBELCBTdHJpbmdSZWYoKSwgU3RyaW5nUmVmKCkpIHt9CisKKyAgLy8vIFxicmllZiBQYXJzZSBhbmQgcmV0dXJuIHRoZSBrZXkuCisgIC8vLworICAvLy8gVGhpcyBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSBrZXksIG9yIG51bGxwdHIgaWYgZmFpbGVkKCkgPT0gdHJ1ZS4KKyAgTm9kZSAqZ2V0S2V5KCk7CisKKyAgLy8vIFxicmllZiBQYXJzZSBhbmQgcmV0dXJuIHRoZSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBUaGlzIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIHZhbHVlLCBvciBudWxscHRyIGlmIGZhaWxlZCgpID09IHRydWUuCisgIE5vZGUgKmdldFZhbHVlKCk7CisKKyAgdm9pZCBza2lwKCkgb3ZlcnJpZGUgeworICAgIGlmIChOb2RlICpLZXkgPSBnZXRLZXkoKSkgeworICAgICAgS2V5LT5za2lwKCk7CisgICAgICBpZiAoTm9kZSAqVmFsID0gZ2V0VmFsdWUoKSkKKyAgICAgICAgVmFsLT5za2lwKCk7CisgICAgfQorICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBOb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldFR5cGUoKSA9PSBOS19LZXlWYWx1ZTsKKyAgfQorCitwcml2YXRlOgorICBOb2RlICpLZXkgPSBudWxscHRyOworICBOb2RlICpWYWx1ZSA9IG51bGxwdHI7Cit9OworCisvLy8gXGJyaWVmIFRoaXMgaXMgYW4gaXRlcmF0b3IgYWJzdHJhY3Rpb24gb3ZlciBZQU1MIGNvbGxlY3Rpb25zIHNoYXJlZCBieSBib3RoCisvLy8gICAgICAgIHNlcXVlbmNlcyBhbmQgbWFwcy4KKy8vLworLy8vIEJhc2VUIG11c3QgaGF2ZSBhIFZhbHVlVCogbWVtYmVyIG5hbWVkIEN1cnJlbnRFbnRyeSBhbmQgYSBtZW1iZXIgZnVuY3Rpb24KKy8vLyBpbmNyZW1lbnQoKSB3aGljaCBtdXN0IHNldCBDdXJyZW50RW50cnkgdG8gMCB0byBjcmVhdGUgYW4gZW5kIGl0ZXJhdG9yLgordGVtcGxhdGUgPGNsYXNzIEJhc2VULCBjbGFzcyBWYWx1ZVQ+CitjbGFzcyBiYXNpY19jb2xsZWN0aW9uX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZywgVmFsdWVUPiB7CitwdWJsaWM6CisgIGJhc2ljX2NvbGxlY3Rpb25faXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgIGJhc2ljX2NvbGxlY3Rpb25faXRlcmF0b3IoQmFzZVQgKkIpIDogQmFzZShCKSB7fQorCisgIFZhbHVlVCAqb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICBhc3NlcnQoQmFzZSAmJiBCYXNlLT5DdXJyZW50RW50cnkgJiYgIkF0dGVtcHRlZCB0byBhY2Nlc3MgZW5kIGl0ZXJhdG9yISIpOworICAgIHJldHVybiBCYXNlLT5DdXJyZW50RW50cnk7CisgIH0KKworICBWYWx1ZVQgJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICBhc3NlcnQoQmFzZSAmJiBCYXNlLT5DdXJyZW50RW50cnkgJiYKKyAgICAgICAgICAgIkF0dGVtcHRlZCB0byBkZXJlZmVyZW5jZSBlbmQgaXRlcmF0b3IhIik7CisgICAgcmV0dXJuICpCYXNlLT5DdXJyZW50RW50cnk7CisgIH0KKworICBvcGVyYXRvciBWYWx1ZVQgKigpIGNvbnN0IHsKKyAgICBhc3NlcnQoQmFzZSAmJiBCYXNlLT5DdXJyZW50RW50cnkgJiYgIkF0dGVtcHRlZCB0byBhY2Nlc3MgZW5kIGl0ZXJhdG9yISIpOworICAgIHJldHVybiBCYXNlLT5DdXJyZW50RW50cnk7CisgIH0KKworICAvLy8gTm90ZSBvbiBFcXVhbGl0eUNvbXBhcmFibGU6CisgIC8vLworICAvLy8gVGhlIGl0ZXJhdG9yIGlzIG5vdCByZS1lbnRyYW50LAorICAvLy8gaXQgaXMgbWVhbnQgdG8gYmUgdXNlZCBmb3IgcGFyc2luZyBZQU1MIG9uLWRlbWFuZAorICAvLy8gT25jZSBpdGVyYXRpb24gc3RhcnRlZCAtIGl0IGNhbiBwb2ludCBvbmx5IHRvIG9uZSBlbnRyeSBhdCBhIHRpbWUKKyAgLy8vIGhlbmNlIEJhc2UuQ3VycmVudEVudHJ5IGFuZCBPdGhlci5CYXNlLkN1cnJlbnRFbnRyeSBhcmUgZXF1YWwKKyAgLy8vIGlmZiBCYXNlIGFuZCBPdGhlci5CYXNlIGFyZSBlcXVhbC4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGJhc2ljX2NvbGxlY3Rpb25faXRlcmF0b3IgJk90aGVyKSBjb25zdCB7CisgICAgaWYgKEJhc2UgJiYgKEJhc2UgPT0gT3RoZXIuQmFzZSkpIHsKKyAgICAgIGFzc2VydCgoQmFzZS0+Q3VycmVudEVudHJ5ID09IE90aGVyLkJhc2UtPkN1cnJlbnRFbnRyeSkKKyAgICAgICAgICAgICAmJiAiRXF1YWwgQmFzZXMgZXhwZWN0ZWQgdG8gcG9pbnQgdG8gZXF1YWwgRW50cmllcyIpOworICAgIH0KKworICAgIHJldHVybiBCYXNlID09IE90aGVyLkJhc2U7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgYmFzaWNfY29sbGVjdGlvbl9pdGVyYXRvciAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gIShCYXNlID09IE90aGVyLkJhc2UpOworICB9CisKKyAgYmFzaWNfY29sbGVjdGlvbl9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICBhc3NlcnQoQmFzZSAmJiAiQXR0ZW1wdGVkIHRvIGFkdmFuY2UgaXRlcmF0b3IgcGFzdCBlbmQhIik7CisgICAgQmFzZS0+aW5jcmVtZW50KCk7CisgICAgLy8gQ3JlYXRlIGFuIGVuZCBpdGVyYXRvci4KKyAgICBpZiAoIUJhc2UtPkN1cnJlbnRFbnRyeSkKKyAgICAgIEJhc2UgPSBudWxscHRyOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCitwcml2YXRlOgorICBCYXNlVCAqQmFzZSA9IG51bGxwdHI7Cit9OworCisvLyBUaGUgZm9sbG93aW5nIHR3byB0ZW1wbGF0ZXMgYXJlIHVzZWQgZm9yIGJvdGggTWFwcGluZ05vZGUgYW5kIFNlcXVlbmNlIE5vZGUuCit0ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvblR5cGU+Cit0eXBlbmFtZSBDb2xsZWN0aW9uVHlwZTo6aXRlcmF0b3IgYmVnaW4oQ29sbGVjdGlvblR5cGUgJkMpIHsKKyAgYXNzZXJ0KEMuSXNBdEJlZ2lubmluZyAmJiAiWW91IG1heSBvbmx5IGl0ZXJhdGUgb3ZlciBhIGNvbGxlY3Rpb24gb25jZSEiKTsKKyAgQy5Jc0F0QmVnaW5uaW5nID0gZmFsc2U7CisgIHR5cGVuYW1lIENvbGxlY3Rpb25UeXBlOjppdGVyYXRvciByZXQoJkMpOworICArK3JldDsKKyAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb25UeXBlPiB2b2lkIHNraXAoQ29sbGVjdGlvblR5cGUgJkMpIHsKKyAgLy8gVE9ETzogc3VwcG9ydCBza2lwcGluZyBmcm9tIHRoZSBtaWRkbGUgb2YgYSBwYXJzZWQgY29sbGVjdGlvbiA7LworICBhc3NlcnQoKEMuSXNBdEJlZ2lubmluZyB8fCBDLklzQXRFbmQpICYmICJDYW5ub3Qgc2tpcCBtaWQgcGFyc2UhIik7CisgIGlmIChDLklzQXRCZWdpbm5pbmcpCisgICAgZm9yICh0eXBlbmFtZSBDb2xsZWN0aW9uVHlwZTo6aXRlcmF0b3IgaSA9IGJlZ2luKEMpLCBlID0gQy5lbmQoKTsgaSAhPSBlOworICAgICAgICAgKytpKQorICAgICAgaS0+c2tpcCgpOworfQorCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBZQU1MIG1hcCBjcmVhdGVkIGZyb20gZWl0aGVyIGEgYmxvY2sgbWFwIGZvciBhIGZsb3cgbWFwLgorLy8vCisvLy8gVGhpcyBwYXJzZXMgdGhlIFlBTUwgc3RyZWFtIGFzIGluY3JlbWVudCgpIGlzIGNhbGxlZC4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8gICBOYW1lOiBfbWFpbgorLy8vICAgU2NvcGU6IEdsb2JhbAorY2xhc3MgTWFwcGluZ05vZGUgZmluYWwgOiBwdWJsaWMgTm9kZSB7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgZW51bSBNYXBwaW5nVHlwZSB7CisgICAgTVRfQmxvY2ssCisgICAgTVRfRmxvdywKKyAgICBNVF9JbmxpbmUgLy8vPCBBbiBpbmxpbmUgbWFwcGluZyBub2RlIGlzIHVzZWQgZm9yICJba2V5OiB2YWx1ZV0iLgorICB9OworCisgIE1hcHBpbmdOb2RlKHN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gJkQsIFN0cmluZ1JlZiBBbmNob3IsIFN0cmluZ1JlZiBUYWcsCisgICAgICAgICAgICAgIE1hcHBpbmdUeXBlIE1UKQorICAgICAgOiBOb2RlKE5LX01hcHBpbmcsIEQsIEFuY2hvciwgVGFnKSwgVHlwZShNVCkge30KKworICBmcmllbmQgY2xhc3MgYmFzaWNfY29sbGVjdGlvbl9pdGVyYXRvcjxNYXBwaW5nTm9kZSwgS2V5VmFsdWVOb2RlPjsKKworICB1c2luZyBpdGVyYXRvciA9IGJhc2ljX2NvbGxlY3Rpb25faXRlcmF0b3I8TWFwcGluZ05vZGUsIEtleVZhbHVlTm9kZT47CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IGZyaWVuZCB0eXBlbmFtZSBUOjppdGVyYXRvciB5YW1sOjpiZWdpbihUICYpOworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gZnJpZW5kIHZvaWQgeWFtbDo6c2tpcChUICYpOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4geWFtbDo6YmVnaW4oKnRoaXMpOyB9CisKKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IoKTsgfQorCisgIHZvaWQgc2tpcCgpIG92ZXJyaWRlIHsgeWFtbDo6c2tpcCgqdGhpcyk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0VHlwZSgpID09IE5LX01hcHBpbmc7CisgIH0KKworcHJpdmF0ZToKKyAgTWFwcGluZ1R5cGUgVHlwZTsKKyAgYm9vbCBJc0F0QmVnaW5uaW5nID0gdHJ1ZTsKKyAgYm9vbCBJc0F0RW5kID0gZmFsc2U7CisgIEtleVZhbHVlTm9kZSAqQ3VycmVudEVudHJ5ID0gbnVsbHB0cjsKKworICB2b2lkIGluY3JlbWVudCgpOworfTsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgWUFNTCBzZXF1ZW5jZSBjcmVhdGVkIGZyb20gZWl0aGVyIGEgYmxvY2sgc2VxdWVuY2UgZm9yIGEKKy8vLyAgICAgICAgZmxvdyBzZXF1ZW5jZS4KKy8vLworLy8vIFRoaXMgcGFyc2VzIHRoZSBZQU1MIHN0cmVhbSBhcyBpbmNyZW1lbnQoKSBpcyBjYWxsZWQuCisvLy8KKy8vLyBFeGFtcGxlOgorLy8vICAgLSBIZWxsbworLy8vICAgLSBXb3JsZAorY2xhc3MgU2VxdWVuY2VOb2RlIGZpbmFsIDogcHVibGljIE5vZGUgeworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIGVudW0gU2VxdWVuY2VUeXBlIHsKKyAgICBTVF9CbG9jaywKKyAgICBTVF9GbG93LAorICAgIC8vIFVzZSBmb3I6CisgICAgLy8KKyAgICAvLyBrZXk6CisgICAgLy8gLSB2YWwxCisgICAgLy8gLSB2YWwyCisgICAgLy8KKyAgICAvLyBBcyBhIEJsb2NrTWFwcGluZ0VudHJ5IGFuZCBCbG9ja0VuZCBhcmUgbm90IGNyZWF0ZWQgaW4gdGhpcyBjYXNlLgorICAgIFNUX0luZGVudGxlc3MKKyAgfTsKKworICBTZXF1ZW5jZU5vZGUoc3RkOjp1bmlxdWVfcHRyPERvY3VtZW50PiAmRCwgU3RyaW5nUmVmIEFuY2hvciwgU3RyaW5nUmVmIFRhZywKKyAgICAgICAgICAgICAgIFNlcXVlbmNlVHlwZSBTVCkKKyAgICAgIDogTm9kZShOS19TZXF1ZW5jZSwgRCwgQW5jaG9yLCBUYWcpLCBTZXFUeXBlKFNUKSB7fQorCisgIGZyaWVuZCBjbGFzcyBiYXNpY19jb2xsZWN0aW9uX2l0ZXJhdG9yPFNlcXVlbmNlTm9kZSwgTm9kZT47CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBiYXNpY19jb2xsZWN0aW9uX2l0ZXJhdG9yPFNlcXVlbmNlTm9kZSwgTm9kZT47CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IGZyaWVuZCB0eXBlbmFtZSBUOjppdGVyYXRvciB5YW1sOjpiZWdpbihUICYpOworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gZnJpZW5kIHZvaWQgeWFtbDo6c2tpcChUICYpOworCisgIHZvaWQgaW5jcmVtZW50KCk7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiB5YW1sOjpiZWdpbigqdGhpcyk7IH0KKworICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcigpOyB9CisKKyAgdm9pZCBza2lwKCkgb3ZlcnJpZGUgeyB5YW1sOjpza2lwKCp0aGlzKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRUeXBlKCkgPT0gTktfU2VxdWVuY2U7CisgIH0KKworcHJpdmF0ZToKKyAgU2VxdWVuY2VUeXBlIFNlcVR5cGU7CisgIGJvb2wgSXNBdEJlZ2lubmluZyA9IHRydWU7CisgIGJvb2wgSXNBdEVuZCA9IGZhbHNlOworICBib29sIFdhc1ByZXZpb3VzVG9rZW5GbG93RW50cnkgPSB0cnVlOyAvLyBTdGFydCB3aXRoIGFuIGltYWdpbmFyeSAnLCcuCisgIE5vZGUgKkN1cnJlbnRFbnRyeSA9IG51bGxwdHI7Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYW4gYWxpYXMgdG8gYSBOb2RlIHdpdGggYW4gYW5jaG9yLgorLy8vCisvLy8gRXhhbXBsZToKKy8vLyAgICpBbmNob3JOYW1lCitjbGFzcyBBbGlhc05vZGUgZmluYWwgOiBwdWJsaWMgTm9kZSB7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgQWxpYXNOb2RlKHN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gJkQsIFN0cmluZ1JlZiBWYWwpCisgICAgICA6IE5vZGUoTktfQWxpYXMsIEQsIFN0cmluZ1JlZigpLCBTdHJpbmdSZWYoKSksIE5hbWUoVmFsKSB7fQorCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorICBOb2RlICpnZXRUYXJnZXQoKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE5vZGUgKk4pIHsgcmV0dXJuIE4tPmdldFR5cGUoKSA9PSBOS19BbGlhczsgfQorCitwcml2YXRlOgorICBTdHJpbmdSZWYgTmFtZTsKK307CisKKy8vLyBcYnJpZWYgQSBZQU1MIFN0cmVhbSBpcyBhIHNlcXVlbmNlIG9mIERvY3VtZW50cy4gQSBkb2N1bWVudCBjb250YWlucyBhIHJvb3QKKy8vLyAgICAgICAgbm9kZS4KK2NsYXNzIERvY3VtZW50IHsKK3B1YmxpYzoKKyAgRG9jdW1lbnQoU3RyZWFtICZQYXJlbnRTdHJlYW0pOworCisgIC8vLyBcYnJpZWYgUm9vdCBmb3IgcGFyc2luZyBhIG5vZGUuIFJldHVybnMgYSBzaW5nbGUgbm9kZS4KKyAgTm9kZSAqcGFyc2VCbG9ja05vZGUoKTsKKworICAvLy8gXGJyaWVmIEZpbmlzaCBwYXJzaW5nIHRoZSBjdXJyZW50IGRvY3VtZW50IGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUKKyAgLy8vICAgICAgICBtb3JlLiBSZXR1cm4gZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIHNraXAoKTsKKworICAvLy8gXGJyaWVmIFBhcnNlIGFuZCByZXR1cm4gdGhlIHJvb3QgbGV2ZWwgbm9kZS4KKyAgTm9kZSAqZ2V0Um9vdCgpIHsKKyAgICBpZiAoUm9vdCkKKyAgICAgIHJldHVybiBSb290OworICAgIHJldHVybiBSb290ID0gcGFyc2VCbG9ja05vZGUoKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6bWFwPFN0cmluZ1JlZiwgU3RyaW5nUmVmPiAmZ2V0VGFnTWFwKCkgY29uc3QgeyByZXR1cm4gVGFnTWFwOyB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBOb2RlOworICBmcmllbmQgY2xhc3MgZG9jdW1lbnRfaXRlcmF0b3I7CisKKyAgLy8vIFxicmllZiBTdHJlYW0gdG8gcmVhZCB0b2tlbnMgZnJvbS4KKyAgU3RyZWFtICZzdHJlYW07CisKKyAgLy8vIFxicmllZiBVc2VkIHRvIGFsbG9jYXRlIG5vZGVzIHRvLiBBbGwgYXJlIGRlc3Ryb3llZCB3aXRob3V0IGNhbGxpbmcgdGhlaXIKKyAgLy8vICAgICAgICBkZXN0cnVjdG9yIHdoZW4gdGhlIGRvY3VtZW50IGlzIGRlc3Ryb3llZC4KKyAgQnVtcFB0ckFsbG9jYXRvciBOb2RlQWxsb2NhdG9yOworCisgIC8vLyBcYnJpZWYgVGhlIHJvb3Qgbm9kZS4gVXNlZCB0byBzdXBwb3J0IHNraXBwaW5nIGEgcGFydGlhbGx5IHBhcnNlZAorICAvLy8gICAgICAgIGRvY3VtZW50LgorICBOb2RlICpSb290OworCisgIC8vLyBcYnJpZWYgTWFwcyB0YWcgcHJlZml4ZXMgdG8gdGhlaXIgZXhwYW5zaW9uLgorICBzdGQ6Om1hcDxTdHJpbmdSZWYsIFN0cmluZ1JlZj4gVGFnTWFwOworCisgIFRva2VuICZwZWVrTmV4dCgpOworICBUb2tlbiBnZXROZXh0KCk7CisgIHZvaWQgc2V0RXJyb3IoY29uc3QgVHdpbmUgJk1lc3NhZ2UsIFRva2VuICZMb2NhdGlvbikgY29uc3Q7CisgIGJvb2wgZmFpbGVkKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBQYXJzZSAlQkxBSCBkaXJlY3RpdmVzIGFuZCByZXR1cm4gdHJ1ZSBpZiBhbnkgd2VyZSBlbmNvdW50ZXJlZC4KKyAgYm9vbCBwYXJzZURpcmVjdGl2ZXMoKTsKKworICAvLy8gXGJyaWVmIFBhcnNlICVZQU1MCisgIHZvaWQgcGFyc2VZQU1MRGlyZWN0aXZlKCk7CisKKyAgLy8vIFxicmllZiBQYXJzZSAlVEFHCisgIHZvaWQgcGFyc2VUQUdEaXJlY3RpdmUoKTsKKworICAvLy8gXGJyaWVmIENvbnN1bWUgdGhlIG5leHQgdG9rZW4gYW5kIGVycm9yIGlmIGl0IGlzIG5vdCBcYSBUSy4KKyAgYm9vbCBleHBlY3RUb2tlbihpbnQgVEspOworfTsKKworLy8vIFxicmllZiBJdGVyYXRvciBhYnN0cmFjdGlvbiBmb3IgRG9jdW1lbnRzIG92ZXIgYSBTdHJlYW0uCitjbGFzcyBkb2N1bWVudF9pdGVyYXRvciB7CitwdWJsaWM6CisgIGRvY3VtZW50X2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworICBkb2N1bWVudF9pdGVyYXRvcihzdGQ6OnVuaXF1ZV9wdHI8RG9jdW1lbnQ+ICZEKSA6IERvYygmRCkge30KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgZG9jdW1lbnRfaXRlcmF0b3IgJk90aGVyKSBjb25zdCB7CisgICAgaWYgKGlzQXRFbmQoKSB8fCBPdGhlci5pc0F0RW5kKCkpCisgICAgICByZXR1cm4gaXNBdEVuZCgpICYmIE90aGVyLmlzQXRFbmQoKTsKKworICAgIHJldHVybiBEb2MgPT0gT3RoZXIuRG9jOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBkb2N1bWVudF9pdGVyYXRvciAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBPdGhlcik7CisgIH0KKworICBkb2N1bWVudF9pdGVyYXRvciBvcGVyYXRvcisrKCkgeworICAgIGFzc2VydChEb2MgJiYgImluY3JlbWVudGluZyBpdGVyYXRvciBwYXN0IHRoZSBlbmQuIik7CisgICAgaWYgKCEoKkRvYyktPnNraXAoKSkgeworICAgICAgRG9jLT5yZXNldChudWxscHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgU3RyZWFtICZTID0gKCpEb2MpLT5zdHJlYW07CisgICAgICBEb2MtPnJlc2V0KG5ldyBEb2N1bWVudChTKSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIERvY3VtZW50ICZvcGVyYXRvciooKSB7IHJldHVybiAqRG9jLT5nZXQoKTsgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gJm9wZXJhdG9yLT4oKSB7IHJldHVybiAqRG9jOyB9CisKK3ByaXZhdGU6CisgIGJvb2wgaXNBdEVuZCgpIGNvbnN0IHsgcmV0dXJuICFEb2MgfHwgISpEb2M7IH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8RG9jdW1lbnQ+ICpEb2MgPSBudWxscHRyOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHlhbWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9ZQU1MUEFSU0VSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvWUFNTFRyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NzRhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvWUFNTFRyYWl0cy5oCkBAIC0wLDAgKzEsMTc2MyBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gTGlua2VyCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfWUFNTFRSQUlUU19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9ZQU1MVFJBSVRTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGlnbk9mLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUmVnZXguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU291cmNlTWdyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1lBTUxQYXJzZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSB5YW1sIHsKKworc3RydWN0IEVtcHR5Q29udGV4dCB7fTsKKworLy8vIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHNwZWNpYWxpemVkIGJ5IGFueSB0eXBlIHRoYXQgbmVlZHMgdG8gYmUgY29udmVydGVkCisvLy8gdG8vZnJvbSBhIFlBTUwgbWFwcGluZy4gIEZvciBleGFtcGxlOgorLy8vCisvLy8gICAgIHN0cnVjdCBNYXBwaW5nVHJhaXRzPE15U3RydWN0PiB7CisvLy8gICAgICAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmaW8sIE15U3RydWN0ICZzKSB7CisvLy8gICAgICAgICBpby5tYXBSZXF1aXJlZCgibmFtZSIsIHMubmFtZSk7CisvLy8gICAgICAgICBpby5tYXBSZXF1aXJlZCgic2l6ZSIsIHMuc2l6ZSk7CisvLy8gICAgICAgICBpby5tYXBPcHRpb25hbCgiYWdlIiwgIHMuYWdlKTsKKy8vLyAgICAgICB9CisvLy8gICAgIH07Cit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RydWN0IE1hcHBpbmdUcmFpdHMgeworICAvLyBNdXN0IHByb3ZpZGU6CisgIC8vIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJmlvLCBUICZmaWVsZHMpOworICAvLyBPcHRpb25hbGx5IG1heSBwcm92aWRlOgorICAvLyBzdGF0aWMgU3RyaW5nUmVmIHZhbGlkYXRlKElPICZpbywgVCAmZmllbGRzKTsKKyAgLy8KKyAgLy8gVGhlIG9wdGlvbmFsIGZsb3cgZmxhZyB3aWxsIGNhdXNlIGdlbmVyYXRlZCBZQU1MIHRvIHVzZSBhIGZsb3cgbWFwcGluZworICAvLyAoZS5nLiB7IGE6IDAsIGI6IDEgfSk6CisgIC8vIHN0YXRpYyBjb25zdCBib29sIGZsb3cgPSB0cnVlOworfTsKKworLy8vIFRoaXMgY2xhc3MgaXMgc2ltaWxhciB0byBNYXBwaW5nVHJhaXRzPFQ+IGJ1dCBhbGxvd3MgeW91IHRvIHBhc3MgaW4KKy8vLyBhZGRpdGlvbmFsIGNvbnRleHQgZm9yIGVhY2ggbWFwIG9wZXJhdGlvbi4gIEZvciBleGFtcGxlOgorLy8vCisvLy8gICAgIHN0cnVjdCBNYXBwaW5nQ29udGV4dFRyYWl0czxNeVN0cnVjdCwgTXlDb250ZXh0PiB7CisvLy8gICAgICAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmaW8sIE15U3RydWN0ICZzLCBNeUNvbnRleHQgJmMpIHsKKy8vLyAgICAgICAgIGlvLm1hcFJlcXVpcmVkKCJuYW1lIiwgcy5uYW1lKTsKKy8vLyAgICAgICAgIGlvLm1hcFJlcXVpcmVkKCJzaXplIiwgcy5zaXplKTsKKy8vLyAgICAgICAgIGlvLm1hcE9wdGlvbmFsKCJhZ2UiLCAgcy5hZ2UpOworLy8vICAgICAgICAgKytjLlRpbWVzTWFwcGVkOworLy8vICAgICAgIH0KKy8vLyAgICAgfTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDb250ZXh0PiBzdHJ1Y3QgTWFwcGluZ0NvbnRleHRUcmFpdHMgeworICAvLyBNdXN0IHByb3ZpZGU6CisgIC8vIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJmlvLCBUICZmaWVsZHMsIENvbnRleHQgJkN0eCk7CisgIC8vIE9wdGlvbmFsbHkgbWF5IHByb3ZpZGU6CisgIC8vIHN0YXRpYyBTdHJpbmdSZWYgdmFsaWRhdGUoSU8gJmlvLCBUICZmaWVsZHMsIENvbnRleHQgJkN0eCk7CisgIC8vCisgIC8vIFRoZSBvcHRpb25hbCBmbG93IGZsYWcgd2lsbCBjYXVzZSBnZW5lcmF0ZWQgWUFNTCB0byB1c2UgYSBmbG93IG1hcHBpbmcKKyAgLy8gKGUuZy4geyBhOiAwLCBiOiAxIH0pOgorICAvLyBzdGF0aWMgY29uc3QgYm9vbCBmbG93ID0gdHJ1ZTsKK307CisKKy8vLyBUaGlzIGNsYXNzIHNob3VsZCBiZSBzcGVjaWFsaXplZCBieSBhbnkgaW50ZWdyYWwgdHlwZSB0aGF0IGNvbnZlcnRzCisvLy8gdG8vZnJvbSBhIFlBTUwgc2NhbGFyIHdoZXJlIHRoZXJlIGlzIGEgb25lLXRvLW9uZSBtYXBwaW5nIGJldHdlZW4KKy8vLyBpbi1tZW1vcnkgdmFsdWVzIGFuZCBhIHN0cmluZyBpbiBZQU1MLiAgRm9yIGV4YW1wbGU6CisvLy8KKy8vLyAgICAgc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPENvbG9ycz4geworLy8vICAgICAgICAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJmlvLCBDb2xvcnMgJnZhbHVlKSB7CisvLy8gICAgICAgICAgIGlvLmVudW1DYXNlKHZhbHVlLCAicmVkIiwgICBjUmVkKTsKKy8vLyAgICAgICAgICAgaW8uZW51bUNhc2UodmFsdWUsICJibHVlIiwgIGNCbHVlKTsKKy8vLyAgICAgICAgICAgaW8uZW51bUNhc2UodmFsdWUsICJncmVlbiIsIGNHcmVlbik7CisvLy8gICAgICAgICB9CisvLy8gICAgICAgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHMgeworICAvLyBNdXN0IHByb3ZpZGU6CisgIC8vIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZpbywgVCAmdmFsdWUpOworfTsKKworLy8vIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHNwZWNpYWxpemVkIGJ5IGFueSBpbnRlZ2VyIHR5cGUgdGhhdCBpcyBhIHVuaW9uCisvLy8gb2YgYml0IHZhbHVlcyBhbmQgdGhlIFlBTUwgcmVwcmVzZW50YXRpb24gaXMgYSBmbG93IHNlcXVlbmNlIG9mCisvLy8gc3RyaW5ncy4gIEZvciBleGFtcGxlOgorLy8vCisvLy8gICAgICBzdHJ1Y3QgU2NhbGFyQml0U2V0VHJhaXRzPE15RmxhZ3M+IHsKKy8vLyAgICAgICAgc3RhdGljIHZvaWQgYml0c2V0KElPICZpbywgTXlGbGFncyAmdmFsdWUpIHsKKy8vLyAgICAgICAgICBpby5iaXRTZXRDYXNlKHZhbHVlLCAiYmlnIiwgICBmbGFnQmlnKTsKKy8vLyAgICAgICAgICBpby5iaXRTZXRDYXNlKHZhbHVlLCAiZmxhdCIsICBmbGFnRmxhdCk7CisvLy8gICAgICAgICAgaW8uYml0U2V0Q2FzZSh2YWx1ZSwgInJvdW5kIiwgZmxhZ1JvdW5kKTsKKy8vLyAgICAgICAgfQorLy8vICAgICAgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU2NhbGFyQml0U2V0VHJhaXRzIHsKKyAgLy8gTXVzdCBwcm92aWRlOgorICAvLyBzdGF0aWMgdm9pZCBiaXRzZXQoSU8gJmlvLCBUICZ2YWx1ZSk7Cit9OworCisvLy8gRGVzY3JpYmUgd2hpY2ggdHlwZSBvZiBxdW90ZXMgc2hvdWxkIGJlIHVzZWQgd2hlbiBxdW90aW5nIGlzIG5lY2Vzc2FyeS4KKy8vLyBTb21lIG5vbi1wcmludGFibGUgY2hhcmFjdGVycyBuZWVkIHRvIGJlIGRvdWJsZS1xdW90ZWQsIHdoaWxlIHNvbWUgb3RoZXJzCisvLy8gYXJlIGZpbmUgd2l0aCBzaW1wbGUtcXVvdGluZywgYW5kIHNvbWUgZG9uJ3QgbmVlZCBhbnkgcXVvdGluZy4KK2VudW0gY2xhc3MgUXVvdGluZ1R5cGUgeyBOb25lLCBTaW5nbGUsIERvdWJsZSB9OworCisvLy8gVGhpcyBjbGFzcyBzaG91bGQgYmUgc3BlY2lhbGl6ZWQgYnkgdHlwZSB0aGF0IHJlcXVpcmVzIGN1c3RvbSBjb252ZXJzaW9uCisvLy8gdG8vZnJvbSBhIHlhbWwgc2NhbGFyLiAgRm9yIGV4YW1wbGU6CisvLy8KKy8vLyAgICB0ZW1wbGF0ZTw+CisvLy8gICAgc3RydWN0IFNjYWxhclRyYWl0czxNeVR5cGU+IHsKKy8vLyAgICAgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCBNeVR5cGUgJnZhbCwgdm9pZCosIGxsdm06OnJhd19vc3RyZWFtICZvdXQpIHsKKy8vLyAgICAgICAgLy8gc3RyZWFtIG91dCBjdXN0b20gZm9ybWF0dGluZworLy8vICAgICAgICBvdXQgPDwgbGx2bTo6Zm9ybWF0KCIleCIsIHZhbCk7CisvLy8gICAgICB9CisvLy8gICAgICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiBzY2FsYXIsIHZvaWQqLCBNeVR5cGUgJnZhbHVlKSB7CisvLy8gICAgICAgIC8vIHBhcnNlIHNjYWxhciBhbmQgc2V0IGB2YWx1ZWAKKy8vLyAgICAgICAgLy8gcmV0dXJuIGVtcHR5IHN0cmluZyBvbiBzdWNjZXNzLCBvciBlcnJvciBzdHJpbmcKKy8vLyAgICAgICAgcmV0dXJuIFN0cmluZ1JlZigpOworLy8vICAgICAgfQorLy8vICAgICAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYpIHsgcmV0dXJuIFF1b3RpbmdUeXBlOjpTaW5nbGU7IH0KKy8vLyAgICB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBTY2FsYXJUcmFpdHMgeworICAvLyBNdXN0IHByb3ZpZGU6CisgIC8vCisgIC8vIEZ1bmN0aW9uIHRvIHdyaXRlIHRoZSB2YWx1ZSBhcyBhIHN0cmluZzoKKyAgLy9zdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgVCAmdmFsdWUsIHZvaWQgKmN0eHQsIGxsdm06OnJhd19vc3RyZWFtICZvdXQpOworICAvLworICAvLyBGdW5jdGlvbiB0byBjb252ZXJ0IGEgc3RyaW5nIHRvIGEgdmFsdWUuICBSZXR1cm5zIHRoZSBlbXB0eQorICAvLyBTdHJpbmdSZWYgb24gc3VjY2VzcyBvciBhbiBlcnJvciBzdHJpbmcgaWYgc3RyaW5nIGlzIG1hbGZvcm1lZDoKKyAgLy9zdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiBzY2FsYXIsIHZvaWQgKmN0eHQsIFQgJnZhbHVlKTsKKyAgLy8KKyAgLy8gRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBzaG91bGQgYmUgcXVvdGVkLgorICAvL3N0YXRpYyBRdW90aW5nVHlwZSBtdXN0UXVvdGUoU3RyaW5nUmVmKTsKK307CisKKy8vLyBUaGlzIGNsYXNzIHNob3VsZCBiZSBzcGVjaWFsaXplZCBieSB0eXBlIHRoYXQgcmVxdWlyZXMgY3VzdG9tIGNvbnZlcnNpb24KKy8vLyB0by9mcm9tIGEgWUFNTCBsaXRlcmFsIGJsb2NrIHNjYWxhci4gRm9yIGV4YW1wbGU6CisvLy8KKy8vLyAgICB0ZW1wbGF0ZSA8PgorLy8vICAgIHN0cnVjdCBCbG9ja1NjYWxhclRyYWl0czxNeVR5cGU+IHsKKy8vLyAgICAgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCBNeVR5cGUgJlZhbHVlLCB2b2lkKiwgbGx2bTo6cmF3X29zdHJlYW0gJk91dCkKKy8vLyAgICAgIHsKKy8vLyAgICAgICAgLy8gc3RyZWFtIG91dCBjdXN0b20gZm9ybWF0dGluZworLy8vICAgICAgICBPdXQgPDwgVmFsOworLy8vICAgICAgfQorLy8vICAgICAgc3RhdGljIFN0cmluZ1JlZiBpbnB1dChTdHJpbmdSZWYgU2NhbGFyLCB2b2lkKiwgTXlUeXBlICZWYWx1ZSkgeworLy8vICAgICAgICAvLyBwYXJzZSBzY2FsYXIgYW5kIHNldCBgdmFsdWVgCisvLy8gICAgICAgIC8vIHJldHVybiBlbXB0eSBzdHJpbmcgb24gc3VjY2Vzcywgb3IgZXJyb3Igc3RyaW5nCisvLy8gICAgICAgIHJldHVybiBTdHJpbmdSZWYoKTsKKy8vLyAgICAgIH0KKy8vLyAgICB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQmxvY2tTY2FsYXJUcmFpdHMgeworICAvLyBNdXN0IHByb3ZpZGU6CisgIC8vCisgIC8vIEZ1bmN0aW9uIHRvIHdyaXRlIHRoZSB2YWx1ZSBhcyBhIHN0cmluZzoKKyAgLy8gc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IFQgJlZhbHVlLCB2b2lkICpjdHgsIGxsdm06OnJhd19vc3RyZWFtICZPdXQpOworICAvLworICAvLyBGdW5jdGlvbiB0byBjb252ZXJ0IGEgc3RyaW5nIHRvIGEgdmFsdWUuICBSZXR1cm5zIHRoZSBlbXB0eQorICAvLyBTdHJpbmdSZWYgb24gc3VjY2VzcyBvciBhbiBlcnJvciBzdHJpbmcgaWYgc3RyaW5nIGlzIG1hbGZvcm1lZDoKKyAgLy8gc3RhdGljIFN0cmluZ1JlZiBpbnB1dChTdHJpbmdSZWYgU2NhbGFyLCB2b2lkICpjdHh0LCBUICZWYWx1ZSk7Cit9OworCisvLy8gVGhpcyBjbGFzcyBzaG91bGQgYmUgc3BlY2lhbGl6ZWQgYnkgYW55IHR5cGUgdGhhdCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQKKy8vLyB0by9mcm9tIGEgWUFNTCBzZXF1ZW5jZS4gIEZvciBleGFtcGxlOgorLy8vCisvLy8gICAgdGVtcGxhdGU8PgorLy8vICAgIHN0cnVjdCBTZXF1ZW5jZVRyYWl0czxNeUNvbnRhaW5lcj4geworLy8vICAgICAgc3RhdGljIHNpemVfdCBzaXplKElPICZpbywgTXlDb250YWluZXIgJnNlcSkgeworLy8vICAgICAgICByZXR1cm4gc2VxLnNpemUoKTsKKy8vLyAgICAgIH0KKy8vLyAgICAgIHN0YXRpYyBNeVR5cGUmIGVsZW1lbnQoSU8gJiwgTXlDb250YWluZXIgJnNlcSwgc2l6ZV90IGluZGV4KSB7CisvLy8gICAgICAgIGlmICggaW5kZXggPj0gc2VxLnNpemUoKSApCisvLy8gICAgICAgICAgc2VxLnJlc2l6ZShpbmRleCsxKTsKKy8vLyAgICAgICAgcmV0dXJuIHNlcVtpbmRleF07CisvLy8gICAgICB9CisvLy8gICAgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEVuYWJsZUlmID0gdm9pZD4KK3N0cnVjdCBTZXF1ZW5jZVRyYWl0cyB7CisgIC8vIE11c3QgcHJvdmlkZToKKyAgLy8gc3RhdGljIHNpemVfdCBzaXplKElPICZpbywgVCAmc2VxKTsKKyAgLy8gc3RhdGljIFQ6OnZhbHVlX3R5cGUmIGVsZW1lbnQoSU8gJmlvLCBUICZzZXEsIHNpemVfdCBpbmRleCk7CisgIC8vCisgIC8vIFRoZSBmb2xsb3dpbmcgaXMgb3B0aW9uIGFuZCB3aWxsIGNhdXNlIGdlbmVyYXRlZCBZQU1MIHRvIHVzZQorICAvLyBhIGZsb3cgc2VxdWVuY2UgKGUuZy4gW2EsYixjXSkuCisgIC8vIHN0YXRpYyBjb25zdCBib29sIGZsb3cgPSB0cnVlOworfTsKKworLy8vIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHNwZWNpYWxpemVkIGJ5IGFueSB0eXBlIGZvciB3aGljaCB2ZWN0b3JzIG9mIHRoYXQKKy8vLyB0eXBlIG5lZWQgdG8gYmUgY29udmVydGVkIHRvL2Zyb20gYSBZQU1MIHNlcXVlbmNlLgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRW5hYmxlSWYgPSB2b2lkPgorc3RydWN0IFNlcXVlbmNlRWxlbWVudFRyYWl0cyB7CisgIC8vIE11c3QgcHJvdmlkZToKKyAgLy8gc3RhdGljIGNvbnN0IGJvb2wgZmxvdzsKK307CisKKy8vLyBUaGlzIGNsYXNzIHNob3VsZCBiZSBzcGVjaWFsaXplZCBieSBhbnkgdHlwZSB0aGF0IG5lZWRzIHRvIGJlIGNvbnZlcnRlZAorLy8vIHRvL2Zyb20gYSBsaXN0IG9mIFlBTUwgZG9jdW1lbnRzLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBEb2N1bWVudExpc3RUcmFpdHMgeworICAvLyBNdXN0IHByb3ZpZGU6CisgIC8vIHN0YXRpYyBzaXplX3Qgc2l6ZShJTyAmaW8sIFQgJnNlcSk7CisgIC8vIHN0YXRpYyBUOjp2YWx1ZV90eXBlJiBlbGVtZW50KElPICZpbywgVCAmc2VxLCBzaXplX3QgaW5kZXgpOworfTsKKworLy8vIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHNwZWNpYWxpemVkIGJ5IGFueSB0eXBlIHRoYXQgbmVlZHMgdG8gYmUgY29udmVydGVkCisvLy8gdG8vZnJvbSBhIFlBTUwgbWFwcGluZyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgbmFtZXMgb2YgdGhlIGtleXMgYXJlIG5vdCBrbm93bgorLy8vIGluIGFkdmFuY2UsIGUuZy4gYSBzdHJpbmcgbWFwLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQ3VzdG9tTWFwcGluZ1RyYWl0cyB7CisgIC8vIHN0YXRpYyB2b2lkIGlucHV0T25lKElPICZpbywgU3RyaW5nUmVmIGtleSwgVCAmZWxlbSk7CisgIC8vIHN0YXRpYyB2b2lkIG91dHB1dChJTyAmaW8sIFQgJmVsZW0pOworfTsKKworLy8gT25seSB1c2VkIGZvciBiZXR0ZXIgZGlhZ25vc3RpY3Mgb2YgbWlzc2luZyB0cmFpdHMKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IE1pc3NpbmdUcmFpdDsKKworLy8gVGVzdCBpZiBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxUPiBpcyBkZWZpbmVkIG9uIHR5cGUgVC4KK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IGhhc19TY2FsYXJFbnVtZXJhdGlvblRyYWl0cworeworICB1c2luZyBTaWduYXR1cmVfZW51bWVyYXRpb24gPSB2b2lkICgqKShjbGFzcyBJTyYsIFQmKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc3RhdGljIGNoYXIgdGVzdChTYW1lVHlwZTxTaWduYXR1cmVfZW51bWVyYXRpb24sICZVOjplbnVtZXJhdGlvbj4qKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc3RhdGljIGRvdWJsZSB0ZXN0KC4uLik7CisKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY29uc3QgdmFsdWUgPQorICAgIChzaXplb2YodGVzdDxTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxUPj4obnVsbHB0cikpID09IDEpOworfTsKKworLy8gVGVzdCBpZiBTY2FsYXJCaXRTZXRUcmFpdHM8VD4gaXMgZGVmaW5lZCBvbiB0eXBlIFQuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBoYXNfU2NhbGFyQml0U2V0VHJhaXRzCit7CisgIHVzaW5nIFNpZ25hdHVyZV9iaXRzZXQgPSB2b2lkICgqKShjbGFzcyBJTyYsIFQmKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc3RhdGljIGNoYXIgdGVzdChTYW1lVHlwZTxTaWduYXR1cmVfYml0c2V0LCAmVTo6Yml0c2V0PiopOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBzdGF0aWMgZG91YmxlIHRlc3QoLi4uKTsKKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjb25zdCB2YWx1ZSA9IChzaXplb2YodGVzdDxTY2FsYXJCaXRTZXRUcmFpdHM8VD4+KG51bGxwdHIpKSA9PSAxKTsKK307CisKKy8vIFRlc3QgaWYgU2NhbGFyVHJhaXRzPFQ+IGlzIGRlZmluZWQgb24gdHlwZSBULgordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgaGFzX1NjYWxhclRyYWl0cworeworICB1c2luZyBTaWduYXR1cmVfaW5wdXQgPSBTdHJpbmdSZWYgKCopKFN0cmluZ1JlZiwgdm9pZCosIFQmKTsKKyAgdXNpbmcgU2lnbmF0dXJlX291dHB1dCA9IHZvaWQgKCopKGNvbnN0IFQmLCB2b2lkKiwgcmF3X29zdHJlYW0mKTsKKyAgdXNpbmcgU2lnbmF0dXJlX211c3RRdW90ZSA9IFF1b3RpbmdUeXBlICgqKShTdHJpbmdSZWYpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBzdGF0aWMgY2hhciB0ZXN0KFNhbWVUeXBlPFNpZ25hdHVyZV9pbnB1dCwgJlU6OmlucHV0PiAqLAorICAgICAgICAgICAgICAgICAgIFNhbWVUeXBlPFNpZ25hdHVyZV9vdXRwdXQsICZVOjpvdXRwdXQ+ICosCisgICAgICAgICAgICAgICAgICAgU2FtZVR5cGU8U2lnbmF0dXJlX211c3RRdW90ZSwgJlU6Om11c3RRdW90ZT4gKik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHN0YXRpYyBkb3VibGUgdGVzdCguLi4pOworCitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNvbnN0IHZhbHVlID0KKyAgICAgIChzaXplb2YodGVzdDxTY2FsYXJUcmFpdHM8VD4+KG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKSA9PSAxKTsKK307CisKKy8vIFRlc3QgaWYgQmxvY2tTY2FsYXJUcmFpdHM8VD4gaXMgZGVmaW5lZCBvbiB0eXBlIFQuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBoYXNfQmxvY2tTY2FsYXJUcmFpdHMKK3sKKyAgdXNpbmcgU2lnbmF0dXJlX2lucHV0ID0gU3RyaW5nUmVmICgqKShTdHJpbmdSZWYsIHZvaWQgKiwgVCAmKTsKKyAgdXNpbmcgU2lnbmF0dXJlX291dHB1dCA9IHZvaWQgKCopKGNvbnN0IFQgJiwgdm9pZCAqLCByYXdfb3N0cmVhbSAmKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc3RhdGljIGNoYXIgdGVzdChTYW1lVHlwZTxTaWduYXR1cmVfaW5wdXQsICZVOjppbnB1dD4gKiwKKyAgICAgICAgICAgICAgICAgICBTYW1lVHlwZTxTaWduYXR1cmVfb3V0cHV0LCAmVTo6b3V0cHV0PiAqKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc3RhdGljIGRvdWJsZSB0ZXN0KC4uLik7CisKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY29uc3QgdmFsdWUgPQorICAgICAgKHNpemVvZih0ZXN0PEJsb2NrU2NhbGFyVHJhaXRzPFQ+PihudWxscHRyLCBudWxscHRyKSkgPT0gMSk7Cit9OworCisvLyBUZXN0IGlmIE1hcHBpbmdDb250ZXh0VHJhaXRzPFQ+IGlzIGRlZmluZWQgb24gdHlwZSBULgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENvbnRleHQ+IHN0cnVjdCBoYXNfTWFwcGluZ1RyYWl0cyB7CisgIHVzaW5nIFNpZ25hdHVyZV9tYXBwaW5nID0gdm9pZCAoKikoY2xhc3MgSU8gJiwgVCAmLCBDb250ZXh0ICYpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBzdGF0aWMgY2hhciB0ZXN0KFNhbWVUeXBlPFNpZ25hdHVyZV9tYXBwaW5nLCAmVTo6bWFwcGluZz4qKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc3RhdGljIGRvdWJsZSB0ZXN0KC4uLik7CisKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY29uc3QgdmFsdWUgPQorICAgICAgKHNpemVvZih0ZXN0PE1hcHBpbmdDb250ZXh0VHJhaXRzPFQsIENvbnRleHQ+PihudWxscHRyKSkgPT0gMSk7Cit9OworCisvLyBUZXN0IGlmIE1hcHBpbmdUcmFpdHM8VD4gaXMgZGVmaW5lZCBvbiB0eXBlIFQuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGhhc19NYXBwaW5nVHJhaXRzPFQsIEVtcHR5Q29udGV4dD4geworICB1c2luZyBTaWduYXR1cmVfbWFwcGluZyA9IHZvaWQgKCopKGNsYXNzIElPICYsIFQgJik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHN0YXRpYyBjaGFyIHRlc3QoU2FtZVR5cGU8U2lnbmF0dXJlX21hcHBpbmcsICZVOjptYXBwaW5nPiAqKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gc3RhdGljIGRvdWJsZSB0ZXN0KC4uLik7CisKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY29uc3QgdmFsdWUgPSAoc2l6ZW9mKHRlc3Q8TWFwcGluZ1RyYWl0czxUPj4obnVsbHB0cikpID09IDEpOworfTsKKworLy8gVGVzdCBpZiBNYXBwaW5nQ29udGV4dFRyYWl0czxUPjo6dmFsaWRhdGUoKSBpcyBkZWZpbmVkIG9uIHR5cGUgVC4KK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDb250ZXh0PiBzdHJ1Y3QgaGFzX01hcHBpbmdWYWxpZGF0ZVRyYWl0cyB7CisgIHVzaW5nIFNpZ25hdHVyZV92YWxpZGF0ZSA9IFN0cmluZ1JlZiAoKikoY2xhc3MgSU8gJiwgVCAmLCBDb250ZXh0ICYpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBzdGF0aWMgY2hhciB0ZXN0KFNhbWVUeXBlPFNpZ25hdHVyZV92YWxpZGF0ZSwgJlU6OnZhbGlkYXRlPiopOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBzdGF0aWMgZG91YmxlIHRlc3QoLi4uKTsKKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjb25zdCB2YWx1ZSA9CisgICAgICAoc2l6ZW9mKHRlc3Q8TWFwcGluZ0NvbnRleHRUcmFpdHM8VCwgQ29udGV4dD4+KG51bGxwdHIpKSA9PSAxKTsKK307CisKKy8vIFRlc3QgaWYgTWFwcGluZ1RyYWl0czxUPjo6dmFsaWRhdGUoKSBpcyBkZWZpbmVkIG9uIHR5cGUgVC4KK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaGFzX01hcHBpbmdWYWxpZGF0ZVRyYWl0czxULCBFbXB0eUNvbnRleHQ+IHsKKyAgdXNpbmcgU2lnbmF0dXJlX3ZhbGlkYXRlID0gU3RyaW5nUmVmICgqKShjbGFzcyBJTyAmLCBUICYpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBzdGF0aWMgY2hhciB0ZXN0KFNhbWVUeXBlPFNpZ25hdHVyZV92YWxpZGF0ZSwgJlU6OnZhbGlkYXRlPiAqKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gc3RhdGljIGRvdWJsZSB0ZXN0KC4uLik7CisKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY29uc3QgdmFsdWUgPSAoc2l6ZW9mKHRlc3Q8TWFwcGluZ1RyYWl0czxUPj4obnVsbHB0cikpID09IDEpOworfTsKKworLy8gVGVzdCBpZiBTZXF1ZW5jZVRyYWl0czxUPiBpcyBkZWZpbmVkIG9uIHR5cGUgVC4KK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IGhhc19TZXF1ZW5jZU1ldGhvZFRyYWl0cworeworICB1c2luZyBTaWduYXR1cmVfc2l6ZSA9IHNpemVfdCAoKikoY2xhc3MgSU8mLCBUJik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHN0YXRpYyBjaGFyIHRlc3QoU2FtZVR5cGU8U2lnbmF0dXJlX3NpemUsICZVOjpzaXplPiopOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBzdGF0aWMgZG91YmxlIHRlc3QoLi4uKTsKKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjb25zdCB2YWx1ZSA9ICAoc2l6ZW9mKHRlc3Q8U2VxdWVuY2VUcmFpdHM8VD4+KG51bGxwdHIpKSA9PSAxKTsKK307CisKKy8vIFRlc3QgaWYgQ3VzdG9tTWFwcGluZ1RyYWl0czxUPiBpcyBkZWZpbmVkIG9uIHR5cGUgVC4KK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IGhhc19DdXN0b21NYXBwaW5nVHJhaXRzCit7CisgIHVzaW5nIFNpZ25hdHVyZV9pbnB1dCA9IHZvaWQgKCopKElPICZpbywgU3RyaW5nUmVmIGtleSwgVCAmdik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHN0YXRpYyBjaGFyIHRlc3QoU2FtZVR5cGU8U2lnbmF0dXJlX2lucHV0LCAmVTo6aW5wdXRPbmU+Kik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHN0YXRpYyBkb3VibGUgdGVzdCguLi4pOworCitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNvbnN0IHZhbHVlID0KKyAgICAgIChzaXplb2YodGVzdDxDdXN0b21NYXBwaW5nVHJhaXRzPFQ+PihudWxscHRyKSkgPT0gMSk7Cit9OworCisvLyBoYXNfRmxvd1RyYWl0czxpbnQ+IHdpbGwgY2F1c2UgYW4gZXJyb3Igd2l0aCBzb21lIGNvbXBpbGVycyBiZWNhdXNlCisvLyBpdCBzdWJjbGFzc2VzIGludC4gIFVzaW5nIHRoaXMgd3JhcHBlciBvbmx5IGluc3RhbnRpYXRlcyB0aGUKKy8vIHJlYWwgaGFzX0Zsb3dUcmFpdHMgb25seSBpZiB0aGUgdGVtcGxhdGUgdHlwZSBpcyBhIGNsYXNzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGJvb2wgRW5hYmxlZCA9IHN0ZDo6aXNfY2xhc3M8VD46OnZhbHVlPgorY2xhc3MgaGFzX0Zsb3dUcmFpdHMKK3sKK3B1YmxpYzoKKyAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7Cit9OworCisvLyBTb21lIG9sZGVyIGdjYyBjb21waWxlcnMgZG9uJ3Qgc3VwcG9ydCBzdHJhaWdodCBmb3J3YXJkIHRlc3RzCisvLyBmb3IgbWVtYmVycywgc28gdGVzdCBmb3IgYW1iaWd1aXR5IGNhdXNlIGJ5IHRoZSBiYXNlIGFuZCBkZXJpdmVkCisvLyBjbGFzc2VzIGJvdGggZGVmaW5pbmcgdGhlIG1lbWJlci4KK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IGhhc19GbG93VHJhaXRzPFQsIHRydWU+Cit7CisgIHN0cnVjdCBGYWxsYmFjayB7IGJvb2wgZmxvdzsgfTsKKyAgc3RydWN0IERlcml2ZWQgOiBULCBGYWxsYmFjayB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgc3RhdGljIGNoYXIgKCZmKFNhbWVUeXBlPGJvb2wgRmFsbGJhY2s6OiosICZDOjpmbG93PiopKVsxXTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICBzdGF0aWMgY2hhciAoJmYoLi4uKSlbMl07CisKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY29uc3QgdmFsdWUgPSBzaXplb2YoZjxEZXJpdmVkPihudWxscHRyKSkgPT0gMjsKK307CisKKy8vIFRlc3QgaWYgU2VxdWVuY2VUcmFpdHM8VD4gaXMgZGVmaW5lZCBvbiB0eXBlIFQKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaGFzX1NlcXVlbmNlVHJhaXRzIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX1NlcXVlbmNlTWV0aG9kVHJhaXRzPFQ+Ojp2YWx1ZSA+IHsgfTsKKworLy8gVGVzdCBpZiBEb2N1bWVudExpc3RUcmFpdHM8VD4gaXMgZGVmaW5lZCBvbiB0eXBlIFQKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IGhhc19Eb2N1bWVudExpc3RUcmFpdHMKK3sKKyAgdXNpbmcgU2lnbmF0dXJlX3NpemUgPSBzaXplX3QgKCopKGNsYXNzIElPICYsIFQgJik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHN0YXRpYyBjaGFyIHRlc3QoU2FtZVR5cGU8U2lnbmF0dXJlX3NpemUsICZVOjpzaXplPiopOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBzdGF0aWMgZG91YmxlIHRlc3QoLi4uKTsKKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjb25zdCB2YWx1ZSA9IChzaXplb2YodGVzdDxEb2N1bWVudExpc3RUcmFpdHM8VD4+KG51bGxwdHIpKT09MSk7Cit9OworCitpbmxpbmUgYm9vbCBpc051bWJlcihTdHJpbmdSZWYgUykgeworICBzdGF0aWMgY29uc3QgY2hhciBPY3RhbENoYXJzW10gPSAiMDEyMzQ1NjciOworICBpZiAoUy5zdGFydHN3aXRoKCIwIikgJiYKKyAgICAgIFMuZHJvcF9mcm9udCgpLmZpbmRfZmlyc3Rfbm90X29mKE9jdGFsQ2hhcnMpID09IFN0cmluZ1JlZjo6bnBvcykKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoUy5zdGFydHN3aXRoKCIwbyIpICYmCisgICAgICBTLmRyb3BfZnJvbnQoMikuZmluZF9maXJzdF9ub3Rfb2YoT2N0YWxDaGFycykgPT0gU3RyaW5nUmVmOjpucG9zKQorICAgIHJldHVybiB0cnVlOworCisgIHN0YXRpYyBjb25zdCBjaGFyIEhleENoYXJzW10gPSAiMDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRiI7CisgIGlmIChTLnN0YXJ0c3dpdGgoIjB4IikgJiYKKyAgICAgIFMuZHJvcF9mcm9udCgyKS5maW5kX2ZpcnN0X25vdF9vZihIZXhDaGFycykgPT0gU3RyaW5nUmVmOjpucG9zKQorICAgIHJldHVybiB0cnVlOworCisgIHN0YXRpYyBjb25zdCBjaGFyIERlY0NoYXJzW10gPSAiMDEyMzQ1Njc4OSI7CisgIGlmIChTLmZpbmRfZmlyc3Rfbm90X29mKERlY0NoYXJzKSA9PSBTdHJpbmdSZWY6Om5wb3MpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKFMuZXF1YWxzKCIuaW5mIikgfHwgUy5lcXVhbHMoIi5JbmYiKSB8fCBTLmVxdWFscygiLklORiIpKQorICAgIHJldHVybiB0cnVlOworCisgIFJlZ2V4IEZsb2F0TWF0Y2hlcigiXihcXC5bMC05XSt8WzAtOV0rKFxcLlswLTldKik/KShbZUVdWy0rXT9bMC05XSspPyQiKTsKKyAgaWYgKEZsb2F0TWF0Y2hlci5tYXRjaChTKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSBib29sIGlzTnVtZXJpYyhTdHJpbmdSZWYgUykgeworICBpZiAoKFMuZnJvbnQoKSA9PSAnLScgfHwgUy5mcm9udCgpID09ICcrJykgJiYgaXNOdW1iZXIoUy5kcm9wX2Zyb250KCkpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChpc051bWJlcihTKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoUy5lcXVhbHMoIi5uYW4iKSB8fCBTLmVxdWFscygiLk5hTiIpIHx8IFMuZXF1YWxzKCIuTkFOIikpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBpc051bGwoU3RyaW5nUmVmIFMpIHsKKyAgcmV0dXJuIFMuZXF1YWxzKCJudWxsIikgfHwgUy5lcXVhbHMoIk51bGwiKSB8fCBTLmVxdWFscygiTlVMTCIpIHx8CisgICAgICAgICBTLmVxdWFscygifiIpOworfQorCitpbmxpbmUgYm9vbCBpc0Jvb2woU3RyaW5nUmVmIFMpIHsKKyAgcmV0dXJuIFMuZXF1YWxzKCJ0cnVlIikgfHwgUy5lcXVhbHMoIlRydWUiKSB8fCBTLmVxdWFscygiVFJVRSIpIHx8CisgICAgICAgICBTLmVxdWFscygiZmFsc2UiKSB8fCBTLmVxdWFscygiRmFsc2UiKSB8fCBTLmVxdWFscygiRkFMU0UiKTsKK30KKworLy8gNS4xLiBDaGFyYWN0ZXIgU2V0CisvLyBUaGUgYWxsb3dlZCBjaGFyYWN0ZXIgcmFuZ2UgZXhwbGljaXRseSBleGNsdWRlcyB0aGUgQzAgY29udHJvbCBibG9jayAjeDAtI3gxRgorLy8gKGV4Y2VwdCBmb3IgVEFCICN4OSwgTEYgI3hBLCBhbmQgQ1IgI3hEIHdoaWNoIGFyZSBhbGxvd2VkKSwgREVMICN4N0YsIHRoZSBDMQorLy8gY29udHJvbCBibG9jayAjeDgwLSN4OUYgKGV4Y2VwdCBmb3IgTkVMICN4ODUgd2hpY2ggaXMgYWxsb3dlZCksIHRoZSBzdXJyb2dhdGUKKy8vIGJsb2NrICN4RDgwMC0jeERGRkYsICN4RkZGRSwgYW5kICN4RkZGRi4KK2lubGluZSBRdW90aW5nVHlwZSBuZWVkc1F1b3RlcyhTdHJpbmdSZWYgUykgeworICBpZiAoUy5lbXB0eSgpKQorICAgIHJldHVybiBRdW90aW5nVHlwZTo6U2luZ2xlOworICBpZiAoaXNzcGFjZShTLmZyb250KCkpIHx8IGlzc3BhY2UoUy5iYWNrKCkpKQorICAgIHJldHVybiBRdW90aW5nVHlwZTo6U2luZ2xlOworICBpZiAoaXNOdWxsKFMpKQorICAgIHJldHVybiBRdW90aW5nVHlwZTo6U2luZ2xlOworICBpZiAoaXNCb29sKFMpKQorICAgIHJldHVybiBRdW90aW5nVHlwZTo6U2luZ2xlOworICBpZiAoaXNOdW1lcmljKFMpKQorICAgIHJldHVybiBRdW90aW5nVHlwZTo6U2luZ2xlOworCisgIC8vIDcuMy4zIFBsYWluIFN0eWxlCisgIC8vIFBsYWluIHNjYWxhcnMgbXVzdCBub3QgYmVnaW4gd2l0aCBtb3N0IGluZGljYXRvcnMsIGFzIHRoaXMgd291bGQgY2F1c2UKKyAgLy8gYW1iaWd1aXR5IHdpdGggb3RoZXIgWUFNTCBjb25zdHJ1Y3RzLgorICBzdGF0aWMgY29uc3RleHByIGNoYXIgSW5kaWNhdG9yc1tdID0gUiIoLT86XCxbXXt9IyYqIXw+JyIlQGApIjsKKyAgaWYgKFMuZmluZF9maXJzdF9vZihJbmRpY2F0b3JzKSA9PSAwKQorICAgIHJldHVybiBRdW90aW5nVHlwZTo6U2luZ2xlOworCisgIFF1b3RpbmdUeXBlIE1heFF1b3RpbmdOZWVkZWQgPSBRdW90aW5nVHlwZTo6Tm9uZTsKKyAgZm9yICh1bnNpZ25lZCBjaGFyIEMgOiBTKSB7CisgICAgLy8gQWxwaGFudW0gaXMgc2FmZS4KKyAgICBpZiAoaXNBbG51bShDKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgc3dpdGNoIChDKSB7CisgICAgLy8gU2FmZSBzY2FsYXIgY2hhcmFjdGVycy4KKyAgICBjYXNlICdfJzoKKyAgICBjYXNlICctJzoKKyAgICBjYXNlICcvJzoKKyAgICBjYXNlICdeJzoKKyAgICBjYXNlICcuJzoKKyAgICBjYXNlICcsJzoKKyAgICBjYXNlICcgJzoKKyAgICAvLyBUQUIgKDB4OSksIExGICgweEEpLCBDUiAoMHhEKSBhbmQgTkVMICgweDg1KSBhcmUgYWxsb3dlZC4KKyAgICBjYXNlIDB4OToKKyAgICBjYXNlIDB4QToKKyAgICBjYXNlIDB4RDoKKyAgICBjYXNlIDB4ODU6CisgICAgICBjb250aW51ZTsKKyAgICAvLyBERUwgKDB4N0YpIGFyZSBleGNsdWRlZCBmcm9tIHRoZSBhbGxvd2VkIGNoYXJhY3RlciByYW5nZS4KKyAgICBjYXNlIDB4N0Y6CisgICAgICByZXR1cm4gUXVvdGluZ1R5cGU6OkRvdWJsZTsKKyAgICBkZWZhdWx0OiB7CisgICAgICAvLyBDMCBjb250cm9sIGJsb2NrICgweDAgLSAweDFGKSBpcyBleGNsdWRlZCBmcm9tIHRoZSBhbGxvd2VkIGNoYXJhY3RlcgorICAgICAgLy8gcmFuZ2UuCisgICAgICBpZiAoQyA8PSAweDFGKQorICAgICAgICByZXR1cm4gUXVvdGluZ1R5cGU6OkRvdWJsZTsKKworICAgICAgLy8gQWx3YXlzIGRvdWJsZSBxdW90ZSBVVEYtOC4KKyAgICAgIGlmICgoQyAmIDB4ODApICE9IDApCisgICAgICAgIHJldHVybiBRdW90aW5nVHlwZTo6RG91YmxlOworCisgICAgICAvLyBUaGUgY2hhcmFjdGVyIGlzIG5vdCBzYWZlLCBhdCBsZWFzdCBzaW1wbGUgcXVvdGluZyBuZWVkZWQuCisgICAgICBNYXhRdW90aW5nTmVlZGVkID0gUXVvdGluZ1R5cGU6OlNpbmdsZTsKKyAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIE1heFF1b3RpbmdOZWVkZWQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDb250ZXh0Pgorc3RydWN0IG1pc3NpbmdUcmFpdHMKKyAgICA6IHB1YmxpYyBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaGFzX1NjYWxhckVudW1lcmF0aW9uVHJhaXRzPFQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoYXNfU2NhbGFyQml0U2V0VHJhaXRzPFQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoYXNfU2NhbGFyVHJhaXRzPFQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoYXNfQmxvY2tTY2FsYXJUcmFpdHM8VD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWhhc19NYXBwaW5nVHJhaXRzPFQsIENvbnRleHQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoYXNfU2VxdWVuY2VUcmFpdHM8VD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWhhc19DdXN0b21NYXBwaW5nVHJhaXRzPFQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoYXNfRG9jdW1lbnRMaXN0VHJhaXRzPFQ+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDb250ZXh0Pgorc3RydWN0IHZhbGlkYXRlZE1hcHBpbmdUcmFpdHMKKyAgICA6IHB1YmxpYyBzdGQ6OmludGVncmFsX2NvbnN0YW50PAorICAgICAgICAgIGJvb2wsIGhhc19NYXBwaW5nVHJhaXRzPFQsIENvbnRleHQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICBoYXNfTWFwcGluZ1ZhbGlkYXRlVHJhaXRzPFQsIENvbnRleHQ+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDb250ZXh0Pgorc3RydWN0IHVudmFsaWRhdGVkTWFwcGluZ1RyYWl0cworICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8CisgICAgICAgICAgYm9vbCwgaGFzX01hcHBpbmdUcmFpdHM8VCwgQ29udGV4dD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICFoYXNfTWFwcGluZ1ZhbGlkYXRlVHJhaXRzPFQsIENvbnRleHQ+Ojp2YWx1ZT4ge307CisKKy8vIEJhc2UgY2xhc3MgZm9yIElucHV0IGFuZCBPdXRwdXQuCitjbGFzcyBJTyB7CitwdWJsaWM6CisgIElPKHZvaWQgKkN0eHQgPSBudWxscHRyKTsKKyAgdmlydHVhbCB+SU8oKTsKKworICB2aXJ0dWFsIGJvb2wgb3V0cHV0dGluZygpID0gMDsKKworICB2aXJ0dWFsIHVuc2lnbmVkIGJlZ2luU2VxdWVuY2UoKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBwcmVmbGlnaHRFbGVtZW50KHVuc2lnbmVkLCB2b2lkIComKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBwb3N0ZmxpZ2h0RWxlbWVudCh2b2lkKikgPSAwOworICB2aXJ0dWFsIHZvaWQgZW5kU2VxdWVuY2UoKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBjYW5FbGlkZUVtcHR5U2VxdWVuY2UoKSA9IDA7CisKKyAgdmlydHVhbCB1bnNpZ25lZCBiZWdpbkZsb3dTZXF1ZW5jZSgpID0gMDsKKyAgdmlydHVhbCBib29sIHByZWZsaWdodEZsb3dFbGVtZW50KHVuc2lnbmVkLCB2b2lkIComKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBwb3N0ZmxpZ2h0Rmxvd0VsZW1lbnQodm9pZCopID0gMDsKKyAgdmlydHVhbCB2b2lkIGVuZEZsb3dTZXF1ZW5jZSgpID0gMDsKKworICB2aXJ0dWFsIGJvb2wgbWFwVGFnKFN0cmluZ1JlZiBUYWcsIGJvb2wgRGVmYXVsdD1mYWxzZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgYmVnaW5NYXBwaW5nKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgZW5kTWFwcGluZygpID0gMDsKKyAgdmlydHVhbCBib29sIHByZWZsaWdodEtleShjb25zdCBjaGFyKiwgYm9vbCwgYm9vbCwgYm9vbCAmLCB2b2lkIComKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBwb3N0ZmxpZ2h0S2V5KHZvaWQqKSA9IDA7CisgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBrZXlzKCkgPSAwOworCisgIHZpcnR1YWwgdm9pZCBiZWdpbkZsb3dNYXBwaW5nKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgZW5kRmxvd01hcHBpbmcoKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIGJlZ2luRW51bVNjYWxhcigpID0gMDsKKyAgdmlydHVhbCBib29sIG1hdGNoRW51bVNjYWxhcihjb25zdCBjaGFyKiwgYm9vbCkgPSAwOworICB2aXJ0dWFsIGJvb2wgbWF0Y2hFbnVtRmFsbGJhY2soKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBlbmRFbnVtU2NhbGFyKCkgPSAwOworCisgIHZpcnR1YWwgYm9vbCBiZWdpbkJpdFNldFNjYWxhcihib29sICYpID0gMDsKKyAgdmlydHVhbCBib29sIGJpdFNldE1hdGNoKGNvbnN0IGNoYXIqLCBib29sKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBlbmRCaXRTZXRTY2FsYXIoKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIHNjYWxhclN0cmluZyhTdHJpbmdSZWYgJiwgUXVvdGluZ1R5cGUpID0gMDsKKyAgdmlydHVhbCB2b2lkIGJsb2NrU2NhbGFyU3RyaW5nKFN0cmluZ1JlZiAmKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIHNldEVycm9yKGNvbnN0IFR3aW5lICYpID0gMDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCBlbnVtQ2FzZShUICZWYWwsIGNvbnN0IGNoYXIqIFN0ciwgY29uc3QgVCBDb25zdFZhbCkgeworICAgIGlmICggbWF0Y2hFbnVtU2NhbGFyKFN0ciwgb3V0cHV0dGluZygpICYmIFZhbCA9PSBDb25zdFZhbCkgKSB7CisgICAgICBWYWwgPSBDb25zdFZhbDsKKyAgICB9CisgIH0KKworICAvLyBhbGxvdyBhbm9ueW1vdXMgZW51bSB2YWx1ZXMgdG8gYmUgdXNlZCB3aXRoIExMVk1fWUFNTF9TVFJPTkdfVFlQRURFRgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCBlbnVtQ2FzZShUICZWYWwsIGNvbnN0IGNoYXIqIFN0ciwgY29uc3QgdWludDMyX3QgQ29uc3RWYWwpIHsKKyAgICBpZiAoIG1hdGNoRW51bVNjYWxhcihTdHIsIG91dHB1dHRpbmcoKSAmJiBWYWwgPT0gc3RhdGljX2Nhc3Q8VD4oQ29uc3RWYWwpKSApIHsKKyAgICAgIFZhbCA9IENvbnN0VmFsOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGQlQsIHR5cGVuYW1lIFQ+CisgIHZvaWQgZW51bUZhbGxiYWNrKFQgJlZhbCkgeworICAgIGlmIChtYXRjaEVudW1GYWxsYmFjaygpKSB7CisgICAgICBFbXB0eUNvbnRleHQgQ29udGV4dDsKKyAgICAgIC8vIEZJWE1FOiBGb3JjZSBpbnRlZ3JhbCBjb252ZXJzaW9uIHRvIGFsbG93IHN0cm9uZyB0eXBlZGVmcyB0byBjb252ZXJ0LgorICAgICAgRkJUIFJlcyA9IHN0YXRpY19jYXN0PHR5cGVuYW1lIEZCVDo6QmFzZVR5cGU+KFZhbCk7CisgICAgICB5YW1saXplKCp0aGlzLCBSZXMsIHRydWUsIENvbnRleHQpOworICAgICAgVmFsID0gc3RhdGljX2Nhc3Q8VD4oc3RhdGljX2Nhc3Q8dHlwZW5hbWUgRkJUOjpCYXNlVHlwZT4oUmVzKSk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgYml0U2V0Q2FzZShUICZWYWwsIGNvbnN0IGNoYXIqIFN0ciwgY29uc3QgVCBDb25zdFZhbCkgeworICAgIGlmICggYml0U2V0TWF0Y2goU3RyLCBvdXRwdXR0aW5nKCkgJiYgKFZhbCAmIENvbnN0VmFsKSA9PSBDb25zdFZhbCkgKSB7CisgICAgICBWYWwgPSBzdGF0aWNfY2FzdDxUPihWYWwgfCBDb25zdFZhbCk7CisgICAgfQorICB9CisKKyAgLy8gYWxsb3cgYW5vbnltb3VzIGVudW0gdmFsdWVzIHRvIGJlIHVzZWQgd2l0aCBMTFZNX1lBTUxfU1RST05HX1RZUEVERUYKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgYml0U2V0Q2FzZShUICZWYWwsIGNvbnN0IGNoYXIqIFN0ciwgY29uc3QgdWludDMyX3QgQ29uc3RWYWwpIHsKKyAgICBpZiAoIGJpdFNldE1hdGNoKFN0ciwgb3V0cHV0dGluZygpICYmIChWYWwgJiBDb25zdFZhbCkgPT0gQ29uc3RWYWwpICkgeworICAgICAgVmFsID0gc3RhdGljX2Nhc3Q8VD4oVmFsIHwgQ29uc3RWYWwpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIG1hc2tlZEJpdFNldENhc2UoVCAmVmFsLCBjb25zdCBjaGFyICpTdHIsIFQgQ29uc3RWYWwsIFQgTWFzaykgeworICAgIGlmIChiaXRTZXRNYXRjaChTdHIsIG91dHB1dHRpbmcoKSAmJiAoVmFsICYgTWFzaykgPT0gQ29uc3RWYWwpKQorICAgICAgVmFsID0gVmFsIHwgQ29uc3RWYWw7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCBtYXNrZWRCaXRTZXRDYXNlKFQgJlZhbCwgY29uc3QgY2hhciAqU3RyLCB1aW50MzJfdCBDb25zdFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE1hc2spIHsKKyAgICBpZiAoYml0U2V0TWF0Y2goU3RyLCBvdXRwdXR0aW5nKCkgJiYgKFZhbCAmIE1hc2spID09IENvbnN0VmFsKSkKKyAgICAgIFZhbCA9IFZhbCB8IENvbnN0VmFsOworICB9CisKKyAgdm9pZCAqZ2V0Q29udGV4dCgpOworICB2b2lkIHNldENvbnRleHQodm9pZCAqKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBtYXBSZXF1aXJlZChjb25zdCBjaGFyICpLZXksIFQgJlZhbCkgeworICAgIEVtcHR5Q29udGV4dCBDdHg7CisgICAgdGhpcy0+cHJvY2Vzc0tleShLZXksIFZhbCwgdHJ1ZSwgQ3R4KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDb250ZXh0PgorICB2b2lkIG1hcFJlcXVpcmVkKGNvbnN0IGNoYXIgKktleSwgVCAmVmFsLCBDb250ZXh0ICZDdHgpIHsKKyAgICB0aGlzLT5wcm9jZXNzS2V5KEtleSwgVmFsLCB0cnVlLCBDdHgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgbWFwT3B0aW9uYWwoY29uc3QgY2hhciAqS2V5LCBUICZWYWwpIHsKKyAgICBFbXB0eUNvbnRleHQgQ3R4OworICAgIG1hcE9wdGlvbmFsV2l0aENvbnRleHQoS2V5LCBWYWwsIEN0eCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCBtYXBPcHRpb25hbChjb25zdCBjaGFyICpLZXksIFQgJlZhbCwgY29uc3QgVCAmRGVmYXVsdCkgeworICAgIEVtcHR5Q29udGV4dCBDdHg7CisgICAgbWFwT3B0aW9uYWxXaXRoQ29udGV4dChLZXksIFZhbCwgRGVmYXVsdCwgQ3R4KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDb250ZXh0PgorICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxoYXNfU2VxdWVuY2VUcmFpdHM8VD46OnZhbHVlLCB2b2lkPjo6dHlwZQorICBtYXBPcHRpb25hbFdpdGhDb250ZXh0KGNvbnN0IGNoYXIgKktleSwgVCAmVmFsLCBDb250ZXh0ICZDdHgpIHsKKyAgICAvLyBvbWl0IGtleS92YWx1ZSBpbnN0ZWFkIG9mIG91dHB1dHRpbmcgZW1wdHkgc2VxdWVuY2UKKyAgICBpZiAodGhpcy0+Y2FuRWxpZGVFbXB0eVNlcXVlbmNlKCkgJiYgIShWYWwuYmVnaW4oKSAhPSBWYWwuZW5kKCkpKQorICAgICAgcmV0dXJuOworICAgIHRoaXMtPnByb2Nlc3NLZXkoS2V5LCBWYWwsIGZhbHNlLCBDdHgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbnRleHQ+CisgIHZvaWQgbWFwT3B0aW9uYWxXaXRoQ29udGV4dChjb25zdCBjaGFyICpLZXksIE9wdGlvbmFsPFQ+ICZWYWwsIENvbnRleHQgJkN0eCkgeworICAgIHRoaXMtPnByb2Nlc3NLZXlXaXRoRGVmYXVsdChLZXksIFZhbCwgT3B0aW9uYWw8VD4oKSwgLypSZXF1aXJlZD0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdHgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbnRleHQ+CisgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFoYXNfU2VxdWVuY2VUcmFpdHM8VD46OnZhbHVlLCB2b2lkPjo6dHlwZQorICBtYXBPcHRpb25hbFdpdGhDb250ZXh0KGNvbnN0IGNoYXIgKktleSwgVCAmVmFsLCBDb250ZXh0ICZDdHgpIHsKKyAgICB0aGlzLT5wcm9jZXNzS2V5KEtleSwgVmFsLCBmYWxzZSwgQ3R4KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDb250ZXh0PgorICB2b2lkIG1hcE9wdGlvbmFsV2l0aENvbnRleHQoY29uc3QgY2hhciAqS2V5LCBUICZWYWwsIGNvbnN0IFQgJkRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0ICZDdHgpIHsKKyAgICB0aGlzLT5wcm9jZXNzS2V5V2l0aERlZmF1bHQoS2V5LCBWYWwsIERlZmF1bHQsIGZhbHNlLCBDdHgpOworICB9CisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDb250ZXh0PgorICB2b2lkIHByb2Nlc3NLZXlXaXRoRGVmYXVsdChjb25zdCBjaGFyICpLZXksIE9wdGlvbmFsPFQ+ICZWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbmFsPFQ+ICZEZWZhdWx0VmFsdWUsIGJvb2wgUmVxdWlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQgJkN0eCkgeworICAgIGFzc2VydChEZWZhdWx0VmFsdWUuaGFzVmFsdWUoKSA9PSBmYWxzZSAmJgorICAgICAgICAgICAiT3B0aW9uYWw8VD4gc2hvdWxkbid0IGhhdmUgYSB2YWx1ZSEiKTsKKyAgICB2b2lkICpTYXZlSW5mbzsKKyAgICBib29sIFVzZURlZmF1bHQgPSB0cnVlOworICAgIGNvbnN0IGJvb2wgc2FtZUFzRGVmYXVsdCA9IG91dHB1dHRpbmcoKSAmJiAhVmFsLmhhc1ZhbHVlKCk7CisgICAgaWYgKCFvdXRwdXR0aW5nKCkgJiYgIVZhbC5oYXNWYWx1ZSgpKQorICAgICAgVmFsID0gVCgpOworICAgIGlmIChWYWwuaGFzVmFsdWUoKSAmJgorICAgICAgICB0aGlzLT5wcmVmbGlnaHRLZXkoS2V5LCBSZXF1aXJlZCwgc2FtZUFzRGVmYXVsdCwgVXNlRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVJbmZvKSkgeworICAgICAgeWFtbGl6ZSgqdGhpcywgVmFsLmdldFZhbHVlKCksIFJlcXVpcmVkLCBDdHgpOworICAgICAgdGhpcy0+cG9zdGZsaWdodEtleShTYXZlSW5mbyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChVc2VEZWZhdWx0KQorICAgICAgICBWYWwgPSBEZWZhdWx0VmFsdWU7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbnRleHQ+CisgIHZvaWQgcHJvY2Vzc0tleVdpdGhEZWZhdWx0KGNvbnN0IGNoYXIgKktleSwgVCAmVmFsLCBjb25zdCBUICZEZWZhdWx0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVxdWlyZWQsIENvbnRleHQgJkN0eCkgeworICAgIHZvaWQgKlNhdmVJbmZvOworICAgIGJvb2wgVXNlRGVmYXVsdDsKKyAgICBjb25zdCBib29sIHNhbWVBc0RlZmF1bHQgPSBvdXRwdXR0aW5nKCkgJiYgVmFsID09IERlZmF1bHRWYWx1ZTsKKyAgICBpZiAoIHRoaXMtPnByZWZsaWdodEtleShLZXksIFJlcXVpcmVkLCBzYW1lQXNEZWZhdWx0LCBVc2VEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZUluZm8pICkgeworICAgICAgeWFtbGl6ZSgqdGhpcywgVmFsLCBSZXF1aXJlZCwgQ3R4KTsKKyAgICAgIHRoaXMtPnBvc3RmbGlnaHRLZXkoU2F2ZUluZm8pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmICggVXNlRGVmYXVsdCApCisgICAgICAgIFZhbCA9IERlZmF1bHRWYWx1ZTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ29udGV4dD4KKyAgdm9pZCBwcm9jZXNzS2V5KGNvbnN0IGNoYXIgKktleSwgVCAmVmFsLCBib29sIFJlcXVpcmVkLCBDb250ZXh0ICZDdHgpIHsKKyAgICB2b2lkICpTYXZlSW5mbzsKKyAgICBib29sIFVzZURlZmF1bHQ7CisgICAgaWYgKCB0aGlzLT5wcmVmbGlnaHRLZXkoS2V5LCBSZXF1aXJlZCwgZmFsc2UsIFVzZURlZmF1bHQsIFNhdmVJbmZvKSApIHsKKyAgICAgIHlhbWxpemUoKnRoaXMsIFZhbCwgUmVxdWlyZWQsIEN0eCk7CisgICAgICB0aGlzLT5wb3N0ZmxpZ2h0S2V5KFNhdmVJbmZvKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCAqQ3R4dDsKK307CisKK25hbWVzcGFjZSBkZXRhaWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ29udGV4dD4KK3ZvaWQgZG9NYXBwaW5nKElPICZpbywgVCAmVmFsLCBDb250ZXh0ICZDdHgpIHsKKyAgTWFwcGluZ0NvbnRleHRUcmFpdHM8VCwgQ29udGV4dD46Om1hcHBpbmcoaW8sIFZhbCwgQ3R4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgZG9NYXBwaW5nKElPICZpbywgVCAmVmFsLCBFbXB0eUNvbnRleHQgJkN0eCkgeworICBNYXBwaW5nVHJhaXRzPFQ+OjptYXBwaW5nKGlvLCBWYWwpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aGFzX1NjYWxhckVudW1lcmF0aW9uVHJhaXRzPFQ+Ojp2YWx1ZSwgdm9pZD46OnR5cGUKK3lhbWxpemUoSU8gJmlvLCBUICZWYWwsIGJvb2wsIEVtcHR5Q29udGV4dCAmQ3R4KSB7CisgIGlvLmJlZ2luRW51bVNjYWxhcigpOworICBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxUPjo6ZW51bWVyYXRpb24oaW8sIFZhbCk7CisgIGlvLmVuZEVudW1TY2FsYXIoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxoYXNfU2NhbGFyQml0U2V0VHJhaXRzPFQ+Ojp2YWx1ZSwgdm9pZD46OnR5cGUKK3lhbWxpemUoSU8gJmlvLCBUICZWYWwsIGJvb2wsIEVtcHR5Q29udGV4dCAmQ3R4KSB7CisgIGJvb2wgRG9DbGVhcjsKKyAgaWYgKCBpby5iZWdpbkJpdFNldFNjYWxhcihEb0NsZWFyKSApIHsKKyAgICBpZiAoIERvQ2xlYXIgKQorICAgICAgVmFsID0gc3RhdGljX2Nhc3Q8VD4oMCk7CisgICAgU2NhbGFyQml0U2V0VHJhaXRzPFQ+OjpiaXRzZXQoaW8sIFZhbCk7CisgICAgaW8uZW5kQml0U2V0U2NhbGFyKCk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxoYXNfU2NhbGFyVHJhaXRzPFQ+Ojp2YWx1ZSwgdm9pZD46OnR5cGUKK3lhbWxpemUoSU8gJmlvLCBUICZWYWwsIGJvb2wsIEVtcHR5Q29udGV4dCAmQ3R4KSB7CisgIGlmICggaW8ub3V0cHV0dGluZygpICkgeworICAgIHN0ZDo6c3RyaW5nIFN0b3JhZ2U7CisgICAgcmF3X3N0cmluZ19vc3RyZWFtIEJ1ZmZlcihTdG9yYWdlKTsKKyAgICBTY2FsYXJUcmFpdHM8VD46Om91dHB1dChWYWwsIGlvLmdldENvbnRleHQoKSwgQnVmZmVyKTsKKyAgICBTdHJpbmdSZWYgU3RyID0gQnVmZmVyLnN0cigpOworICAgIGlvLnNjYWxhclN0cmluZyhTdHIsIFNjYWxhclRyYWl0czxUPjo6bXVzdFF1b3RlKFN0cikpOworICB9CisgIGVsc2UgeworICAgIFN0cmluZ1JlZiBTdHI7CisgICAgaW8uc2NhbGFyU3RyaW5nKFN0ciwgU2NhbGFyVHJhaXRzPFQ+OjptdXN0UXVvdGUoU3RyKSk7CisgICAgU3RyaW5nUmVmIFJlc3VsdCA9IFNjYWxhclRyYWl0czxUPjo6aW5wdXQoU3RyLCBpby5nZXRDb250ZXh0KCksIFZhbCk7CisgICAgaWYgKCAhUmVzdWx0LmVtcHR5KCkgKSB7CisgICAgICBpby5zZXRFcnJvcihUd2luZShSZXN1bHQpKTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxoYXNfQmxvY2tTY2FsYXJUcmFpdHM8VD46OnZhbHVlLCB2b2lkPjo6dHlwZQoreWFtbGl6ZShJTyAmWWFtbElPLCBUICZWYWwsIGJvb2wsIEVtcHR5Q29udGV4dCAmQ3R4KSB7CisgIGlmIChZYW1sSU8ub3V0cHV0dGluZygpKSB7CisgICAgc3RkOjpzdHJpbmcgU3RvcmFnZTsKKyAgICByYXdfc3RyaW5nX29zdHJlYW0gQnVmZmVyKFN0b3JhZ2UpOworICAgIEJsb2NrU2NhbGFyVHJhaXRzPFQ+OjpvdXRwdXQoVmFsLCBZYW1sSU8uZ2V0Q29udGV4dCgpLCBCdWZmZXIpOworICAgIFN0cmluZ1JlZiBTdHIgPSBCdWZmZXIuc3RyKCk7CisgICAgWWFtbElPLmJsb2NrU2NhbGFyU3RyaW5nKFN0cik7CisgIH0gZWxzZSB7CisgICAgU3RyaW5nUmVmIFN0cjsKKyAgICBZYW1sSU8uYmxvY2tTY2FsYXJTdHJpbmcoU3RyKTsKKyAgICBTdHJpbmdSZWYgUmVzdWx0ID0KKyAgICAgICAgQmxvY2tTY2FsYXJUcmFpdHM8VD46OmlucHV0KFN0ciwgWWFtbElPLmdldENvbnRleHQoKSwgVmFsKTsKKyAgICBpZiAoIVJlc3VsdC5lbXB0eSgpKQorICAgICAgWWFtbElPLnNldEVycm9yKFR3aW5lKFJlc3VsdCkpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDb250ZXh0PgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8dmFsaWRhdGVkTWFwcGluZ1RyYWl0czxULCBDb250ZXh0Pjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCit5YW1saXplKElPICZpbywgVCAmVmFsLCBib29sLCBDb250ZXh0ICZDdHgpIHsKKyAgaWYgKGhhc19GbG93VHJhaXRzPE1hcHBpbmdUcmFpdHM8VD4+Ojp2YWx1ZSkKKyAgICBpby5iZWdpbkZsb3dNYXBwaW5nKCk7CisgIGVsc2UKKyAgICBpby5iZWdpbk1hcHBpbmcoKTsKKyAgaWYgKGlvLm91dHB1dHRpbmcoKSkgeworICAgIFN0cmluZ1JlZiBFcnIgPSBNYXBwaW5nVHJhaXRzPFQ+Ojp2YWxpZGF0ZShpbywgVmFsKTsKKyAgICBpZiAoIUVyci5lbXB0eSgpKSB7CisgICAgICBlcnJzKCkgPDwgRXJyIDw8ICJcbiI7CisgICAgICBhc3NlcnQoRXJyLmVtcHR5KCkgJiYgImludmFsaWQgc3RydWN0IHRyeWluZyB0byBiZSB3cml0dGVuIGFzIHlhbWwiKTsKKyAgICB9CisgIH0KKyAgZGV0YWlsOjpkb01hcHBpbmcoaW8sIFZhbCwgQ3R4KTsKKyAgaWYgKCFpby5vdXRwdXR0aW5nKCkpIHsKKyAgICBTdHJpbmdSZWYgRXJyID0gTWFwcGluZ1RyYWl0czxUPjo6dmFsaWRhdGUoaW8sIFZhbCk7CisgICAgaWYgKCFFcnIuZW1wdHkoKSkKKyAgICAgIGlvLnNldEVycm9yKEVycik7CisgIH0KKyAgaWYgKGhhc19GbG93VHJhaXRzPE1hcHBpbmdUcmFpdHM8VD4+Ojp2YWx1ZSkKKyAgICBpby5lbmRGbG93TWFwcGluZygpOworICBlbHNlCisgICAgaW8uZW5kTWFwcGluZygpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ29udGV4dD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHVudmFsaWRhdGVkTWFwcGluZ1RyYWl0czxULCBDb250ZXh0Pjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCit5YW1saXplKElPICZpbywgVCAmVmFsLCBib29sLCBDb250ZXh0ICZDdHgpIHsKKyAgaWYgKGhhc19GbG93VHJhaXRzPE1hcHBpbmdUcmFpdHM8VD4+Ojp2YWx1ZSkgeworICAgIGlvLmJlZ2luRmxvd01hcHBpbmcoKTsKKyAgICBkZXRhaWw6OmRvTWFwcGluZyhpbywgVmFsLCBDdHgpOworICAgIGlvLmVuZEZsb3dNYXBwaW5nKCk7CisgIH0gZWxzZSB7CisgICAgaW8uYmVnaW5NYXBwaW5nKCk7CisgICAgZGV0YWlsOjpkb01hcHBpbmcoaW8sIFZhbCwgQ3R4KTsKKyAgICBpby5lbmRNYXBwaW5nKCk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxoYXNfQ3VzdG9tTWFwcGluZ1RyYWl0czxUPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCit5YW1saXplKElPICZpbywgVCAmVmFsLCBib29sLCBFbXB0eUNvbnRleHQgJkN0eCkgeworICBpZiAoIGlvLm91dHB1dHRpbmcoKSApIHsKKyAgICBpby5iZWdpbk1hcHBpbmcoKTsKKyAgICBDdXN0b21NYXBwaW5nVHJhaXRzPFQ+OjpvdXRwdXQoaW8sIFZhbCk7CisgICAgaW8uZW5kTWFwcGluZygpOworICB9IGVsc2UgeworICAgIGlvLmJlZ2luTWFwcGluZygpOworICAgIGZvciAoU3RyaW5nUmVmIGtleSA6IGlvLmtleXMoKSkKKyAgICAgIEN1c3RvbU1hcHBpbmdUcmFpdHM8VD46OmlucHV0T25lKGlvLCBrZXksIFZhbCk7CisgICAgaW8uZW5kTWFwcGluZygpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8bWlzc2luZ1RyYWl0czxULCBFbXB0eUNvbnRleHQ+Ojp2YWx1ZSwgdm9pZD46OnR5cGUKK3lhbWxpemUoSU8gJmlvLCBUICZWYWwsIGJvb2wsIEVtcHR5Q29udGV4dCAmQ3R4KSB7CisgIGNoYXIgbWlzc2luZ195YW1sX3RyYWl0X2Zvcl90eXBlW3NpemVvZihNaXNzaW5nVHJhaXQ8VD4pXTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbnRleHQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxoYXNfU2VxdWVuY2VUcmFpdHM8VD46OnZhbHVlLCB2b2lkPjo6dHlwZQoreWFtbGl6ZShJTyAmaW8sIFQgJlNlcSwgYm9vbCwgQ29udGV4dCAmQ3R4KSB7CisgIGlmICggaGFzX0Zsb3dUcmFpdHM8IFNlcXVlbmNlVHJhaXRzPFQ+Pjo6dmFsdWUgKSB7CisgICAgdW5zaWduZWQgaW5jbnQgPSBpby5iZWdpbkZsb3dTZXF1ZW5jZSgpOworICAgIHVuc2lnbmVkIGNvdW50ID0gaW8ub3V0cHV0dGluZygpID8gU2VxdWVuY2VUcmFpdHM8VD46OnNpemUoaW8sIFNlcSkgOiBpbmNudDsKKyAgICBmb3IodW5zaWduZWQgaT0wOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgdm9pZCAqU2F2ZUluZm87CisgICAgICBpZiAoIGlvLnByZWZsaWdodEZsb3dFbGVtZW50KGksIFNhdmVJbmZvKSApIHsKKyAgICAgICAgeWFtbGl6ZShpbywgU2VxdWVuY2VUcmFpdHM8VD46OmVsZW1lbnQoaW8sIFNlcSwgaSksIHRydWUsIEN0eCk7CisgICAgICAgIGlvLnBvc3RmbGlnaHRGbG93RWxlbWVudChTYXZlSW5mbyk7CisgICAgICB9CisgICAgfQorICAgIGlvLmVuZEZsb3dTZXF1ZW5jZSgpOworICB9CisgIGVsc2UgeworICAgIHVuc2lnbmVkIGluY250ID0gaW8uYmVnaW5TZXF1ZW5jZSgpOworICAgIHVuc2lnbmVkIGNvdW50ID0gaW8ub3V0cHV0dGluZygpID8gU2VxdWVuY2VUcmFpdHM8VD46OnNpemUoaW8sIFNlcSkgOiBpbmNudDsKKyAgICBmb3IodW5zaWduZWQgaT0wOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgdm9pZCAqU2F2ZUluZm87CisgICAgICBpZiAoIGlvLnByZWZsaWdodEVsZW1lbnQoaSwgU2F2ZUluZm8pICkgeworICAgICAgICB5YW1saXplKGlvLCBTZXF1ZW5jZVRyYWl0czxUPjo6ZWxlbWVudChpbywgU2VxLCBpKSwgdHJ1ZSwgQ3R4KTsKKyAgICAgICAgaW8ucG9zdGZsaWdodEVsZW1lbnQoU2F2ZUluZm8pOworICAgICAgfQorICAgIH0KKyAgICBpby5lbmRTZXF1ZW5jZSgpOworICB9Cit9CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBTY2FsYXJUcmFpdHM8Ym9vbD4geworICBzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgYm9vbCAmLCB2b2lkKiAsIHJhd19vc3RyZWFtICYpOworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiwgdm9pZCAqLCBib29sICYpOworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZikgeyByZXR1cm4gUXVvdGluZ1R5cGU6Ok5vbmU7IH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBTY2FsYXJUcmFpdHM8U3RyaW5nUmVmPiB7CisgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCBTdHJpbmdSZWYgJiwgdm9pZCAqLCByYXdfb3N0cmVhbSAmKTsKKyAgc3RhdGljIFN0cmluZ1JlZiBpbnB1dChTdHJpbmdSZWYsIHZvaWQgKiwgU3RyaW5nUmVmICYpOworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZiBTKSB7IHJldHVybiBuZWVkc1F1b3RlcyhTKTsgfQorfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IFNjYWxhclRyYWl0czxzdGQ6OnN0cmluZz4geworICBzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3Qgc3RkOjpzdHJpbmcgJiwgdm9pZCAqLCByYXdfb3N0cmVhbSAmKTsKKyAgc3RhdGljIFN0cmluZ1JlZiBpbnB1dChTdHJpbmdSZWYsIHZvaWQgKiwgc3RkOjpzdHJpbmcgJik7CisgIHN0YXRpYyBRdW90aW5nVHlwZSBtdXN0UXVvdGUoU3RyaW5nUmVmIFMpIHsgcmV0dXJuIG5lZWRzUXVvdGVzKFMpOyB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgU2NhbGFyVHJhaXRzPHVpbnQ4X3Q+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IHVpbnQ4X3QgJiwgdm9pZCAqLCByYXdfb3N0cmVhbSAmKTsKKyAgc3RhdGljIFN0cmluZ1JlZiBpbnB1dChTdHJpbmdSZWYsIHZvaWQgKiwgdWludDhfdCAmKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYpIHsgcmV0dXJuIFF1b3RpbmdUeXBlOjpOb25lOyB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgU2NhbGFyVHJhaXRzPHVpbnQxNl90PiB7CisgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCB1aW50MTZfdCAmLCB2b2lkICosIHJhd19vc3RyZWFtICYpOworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiwgdm9pZCAqLCB1aW50MTZfdCAmKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYpIHsgcmV0dXJuIFF1b3RpbmdUeXBlOjpOb25lOyB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgU2NhbGFyVHJhaXRzPHVpbnQzMl90PiB7CisgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCB1aW50MzJfdCAmLCB2b2lkICosIHJhd19vc3RyZWFtICYpOworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiwgdm9pZCAqLCB1aW50MzJfdCAmKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYpIHsgcmV0dXJuIFF1b3RpbmdUeXBlOjpOb25lOyB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgU2NhbGFyVHJhaXRzPHVpbnQ2NF90PiB7CisgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCB1aW50NjRfdCAmLCB2b2lkICosIHJhd19vc3RyZWFtICYpOworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiwgdm9pZCAqLCB1aW50NjRfdCAmKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYpIHsgcmV0dXJuIFF1b3RpbmdUeXBlOjpOb25lOyB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgU2NhbGFyVHJhaXRzPGludDhfdD4geworICBzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgaW50OF90ICYsIHZvaWQgKiwgcmF3X29zdHJlYW0gJik7CisgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmLCB2b2lkICosIGludDhfdCAmKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYpIHsgcmV0dXJuIFF1b3RpbmdUeXBlOjpOb25lOyB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgU2NhbGFyVHJhaXRzPGludDE2X3Q+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IGludDE2X3QgJiwgdm9pZCAqLCByYXdfb3N0cmVhbSAmKTsKKyAgc3RhdGljIFN0cmluZ1JlZiBpbnB1dChTdHJpbmdSZWYsIHZvaWQgKiwgaW50MTZfdCAmKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYpIHsgcmV0dXJuIFF1b3RpbmdUeXBlOjpOb25lOyB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgU2NhbGFyVHJhaXRzPGludDMyX3Q+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IGludDMyX3QgJiwgdm9pZCAqLCByYXdfb3N0cmVhbSAmKTsKKyAgc3RhdGljIFN0cmluZ1JlZiBpbnB1dChTdHJpbmdSZWYsIHZvaWQgKiwgaW50MzJfdCAmKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYpIHsgcmV0dXJuIFF1b3RpbmdUeXBlOjpOb25lOyB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgU2NhbGFyVHJhaXRzPGludDY0X3Q+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IGludDY0X3QgJiwgdm9pZCAqLCByYXdfb3N0cmVhbSAmKTsKKyAgc3RhdGljIFN0cmluZ1JlZiBpbnB1dChTdHJpbmdSZWYsIHZvaWQgKiwgaW50NjRfdCAmKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYpIHsgcmV0dXJuIFF1b3RpbmdUeXBlOjpOb25lOyB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgU2NhbGFyVHJhaXRzPGZsb2F0PiB7CisgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCBmbG9hdCAmLCB2b2lkICosIHJhd19vc3RyZWFtICYpOworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiwgdm9pZCAqLCBmbG9hdCAmKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYpIHsgcmV0dXJuIFF1b3RpbmdUeXBlOjpOb25lOyB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgU2NhbGFyVHJhaXRzPGRvdWJsZT4geworICBzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgZG91YmxlICYsIHZvaWQgKiwgcmF3X29zdHJlYW0gJik7CisgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmLCB2b2lkICosIGRvdWJsZSAmKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYpIHsgcmV0dXJuIFF1b3RpbmdUeXBlOjpOb25lOyB9Cit9OworCisvLyBGb3IgZW5kaWFuIHR5cGVzLCB3ZSBqdXN0IHVzZSB0aGUgZXhpc3RpbmcgU2NhbGFyVHJhaXRzIGZvciB0aGUgdW5kZXJseWluZworLy8gdHlwZS4gIFRoaXMgd2F5IGVuZGlhbiBhd2FyZSB0eXBlcyBhcmUgc3VwcG9ydGVkIHdoZW5ldmVyIGEgU2NhbGFyVHJhaXRzCisvLyBpcyBkZWZpbmVkIGZvciB0aGUgdW5kZXJseWluZyB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIHZhbHVlX3R5cGUsIHN1cHBvcnQ6OmVuZGlhbm5lc3MgZW5kaWFuLCBzaXplX3QgYWxpZ25tZW50Pgorc3RydWN0IFNjYWxhclRyYWl0czxzdXBwb3J0OjpkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8CisgICAgdmFsdWVfdHlwZSwgZW5kaWFuLCBhbGlnbm1lbnQ+PiB7CisgIHVzaW5nIGVuZGlhbl90eXBlID0KKyAgICAgIHN1cHBvcnQ6OmRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDx2YWx1ZV90eXBlLCBlbmRpYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50PjsKKworICBzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgZW5kaWFuX3R5cGUgJkUsIHZvaWQgKkN0eCwgcmF3X29zdHJlYW0gJlN0cmVhbSkgeworICAgIFNjYWxhclRyYWl0czx2YWx1ZV90eXBlPjo6b3V0cHV0KHN0YXRpY19jYXN0PHZhbHVlX3R5cGU+KEUpLCBDdHgsIFN0cmVhbSk7CisgIH0KKworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiBTdHIsIHZvaWQgKkN0eCwgZW5kaWFuX3R5cGUgJkUpIHsKKyAgICB2YWx1ZV90eXBlIFY7CisgICAgYXV0byBSID0gU2NhbGFyVHJhaXRzPHZhbHVlX3R5cGU+OjppbnB1dChTdHIsIEN0eCwgVik7CisgICAgRSA9IHN0YXRpY19jYXN0PGVuZGlhbl90eXBlPihWKTsKKyAgICByZXR1cm4gUjsKKyAgfQorCisgIHN0YXRpYyBRdW90aW5nVHlwZSBtdXN0UXVvdGUoU3RyaW5nUmVmIFN0cikgeworICAgIHJldHVybiBTY2FsYXJUcmFpdHM8dmFsdWVfdHlwZT46Om11c3RRdW90ZShTdHIpOworICB9Cit9OworCisvLyBVdGlsaXR5IGZvciB1c2Ugd2l0aGluIE1hcHBpbmdUcmFpdHM8Pjo6bWFwcGluZygpIG1ldGhvZAorLy8gdG8gW2RlXW5vcm1hbGl6ZSBhbiBvYmplY3QgZm9yIHVzZSB3aXRoIFlBTUwgY29udmVyc2lvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUTm9ybSwgdHlwZW5hbWUgVEZpbmFsPgorc3RydWN0IE1hcHBpbmdOb3JtYWxpemF0aW9uIHsKKyAgTWFwcGluZ05vcm1hbGl6YXRpb24oSU8gJmlfbywgVEZpbmFsICZPYmopCisgICAgICA6IGlvKGlfbyksIEJ1ZlB0cihudWxscHRyKSwgUmVzdWx0KE9iaikgeworICAgIGlmICggaW8ub3V0cHV0dGluZygpICkgeworICAgICAgQnVmUHRyID0gbmV3ICgmQnVmZmVyKSBUTm9ybShpbywgT2JqKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBCdWZQdHIgPSBuZXcgKCZCdWZmZXIpIFROb3JtKGlvKTsKKyAgICB9CisgIH0KKworICB+TWFwcGluZ05vcm1hbGl6YXRpb24oKSB7CisgICAgaWYgKCAhIGlvLm91dHB1dHRpbmcoKSApIHsKKyAgICAgIFJlc3VsdCA9IEJ1ZlB0ci0+ZGVub3JtYWxpemUoaW8pOworICAgIH0KKyAgICBCdWZQdHItPn5UTm9ybSgpOworICB9CisKKyAgVE5vcm0qIG9wZXJhdG9yLT4oKSB7IHJldHVybiBCdWZQdHI7IH0KKworcHJpdmF0ZToKKyAgdXNpbmcgU3RvcmFnZSA9IEFsaWduZWRDaGFyQXJyYXlVbmlvbjxUTm9ybT47CisKKyAgU3RvcmFnZSAgICAgICBCdWZmZXI7CisgIElPICAgICAgICAgICAmaW87CisgIFROb3JtICAgICAgICAqQnVmUHRyOworICBURmluYWwgICAgICAgJlJlc3VsdDsKK307CisKKy8vIFV0aWxpdHkgZm9yIHVzZSB3aXRoaW4gTWFwcGluZ1RyYWl0czw+OjptYXBwaW5nKCkgbWV0aG9kCisvLyB0byBbZGVdbm9ybWFsaXplIGFuIG9iamVjdCBmb3IgdXNlIHdpdGggWUFNTCBjb252ZXJzaW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFROb3JtLCB0eXBlbmFtZSBURmluYWw+CitzdHJ1Y3QgTWFwcGluZ05vcm1hbGl6YXRpb25IZWFwIHsKKyAgTWFwcGluZ05vcm1hbGl6YXRpb25IZWFwKElPICZpX28sIFRGaW5hbCAmT2JqLCBCdW1wUHRyQWxsb2NhdG9yICphbGxvY2F0b3IpCisgICAgOiBpbyhpX28pLCBSZXN1bHQoT2JqKSB7CisgICAgaWYgKCBpby5vdXRwdXR0aW5nKCkgKSB7CisgICAgICBCdWZQdHIgPSBuZXcgKCZCdWZmZXIpIFROb3JtKGlvLCBPYmopOworICAgIH0KKyAgICBlbHNlIGlmIChhbGxvY2F0b3IpIHsKKyAgICAgIEJ1ZlB0ciA9IGFsbG9jYXRvci0+QWxsb2NhdGU8VE5vcm0+KCk7CisgICAgICBuZXcgKEJ1ZlB0cikgVE5vcm0oaW8pOworICAgIH0gZWxzZSB7CisgICAgICBCdWZQdHIgPSBuZXcgVE5vcm0oaW8pOworICAgIH0KKyAgfQorCisgIH5NYXBwaW5nTm9ybWFsaXphdGlvbkhlYXAoKSB7CisgICAgaWYgKCBpby5vdXRwdXR0aW5nKCkgKSB7CisgICAgICBCdWZQdHItPn5UTm9ybSgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIFJlc3VsdCA9IEJ1ZlB0ci0+ZGVub3JtYWxpemUoaW8pOworICAgIH0KKyAgfQorCisgIFROb3JtKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gQnVmUHRyOyB9CisKK3ByaXZhdGU6CisgIHVzaW5nIFN0b3JhZ2UgPSBBbGlnbmVkQ2hhckFycmF5VW5pb248VE5vcm0+OworCisgIFN0b3JhZ2UgICAgICAgQnVmZmVyOworICBJTyAgICAgICAgICAgJmlvOworICBUTm9ybSAgICAgICAgKkJ1ZlB0ciA9IG51bGxwdHI7CisgIFRGaW5hbCAgICAgICAmUmVzdWx0OworfTsKKworLy8vCisvLy8gVGhlIElucHV0IGNsYXNzIGlzIHVzZWQgdG8gcGFyc2UgYSB5YW1sIGRvY3VtZW50IGludG8gaW4tbWVtb3J5IHN0cnVjdHMKKy8vLyBhbmQgdmVjdG9ycy4KKy8vLworLy8vIEl0IHdvcmtzIGJ5IHVzaW5nIFlBTUxQYXJzZXIgdG8gZG8gYSBzeW50YXggcGFyc2Ugb2YgdGhlIGVudGlyZSB5YW1sCisvLy8gZG9jdW1lbnQsIHRoZW4gdGhlIElucHV0IGNsYXNzIGJ1aWxkcyBhIGdyYXBoIG9mIEhOb2RlcyB3aGljaCB3cmFwcworLy8vIGVhY2ggeWFtbCBOb2RlLiAgVGhlIGV4dHJhIGxheWVyIGlzIGJ1ZmZlcmluZy4gIFRoZSBsb3cgbGV2ZWwgeWFtbAorLy8vIHBhcnNlciBvbmx5IGxldHMgeW91IGxvb2sgYXQgZWFjaCBub2RlIG9uY2UuICBUaGUgYnVmZmVyaW5nIGxheWVyIGxldHMKKy8vLyB5b3Ugc2VhcmNoIGFuZCBpbnRlcmF0ZSBtdWx0aXBsZSB0aW1lcy4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UKKy8vLyB0aGUgbWFwUmVxdWlyZWQoKSBtZXRob2QgY2FsbHMgbWF5IG5vdCBiZSBpbiB0aGUgc2FtZSBvcmRlcgorLy8vIGFzIHRoZSBrZXlzIGluIHRoZSBkb2N1bWVudC4KKy8vLworY2xhc3MgSW5wdXQgOiBwdWJsaWMgSU8geworcHVibGljOgorICAvLyBDb25zdHJ1Y3QgYSB5YW1sIElucHV0IG9iamVjdCBmcm9tIGEgU3RyaW5nUmVmIGFuZCBvcHRpb25hbAorICAvLyB1c2VyLWRhdGEuIFRoZSBEaWFnSGFuZGxlciBjYW4gYmUgc3BlY2lmaWVkIHRvIHByb3ZpZGUKKyAgLy8gYWx0ZXJuYXRpdmUgZXJyb3IgcmVwb3J0aW5nLgorICBJbnB1dChTdHJpbmdSZWYgSW5wdXRDb250ZW50LAorICAgICAgICB2b2lkICpDdHh0ID0gbnVsbHB0ciwKKyAgICAgICAgU291cmNlTWdyOjpEaWFnSGFuZGxlclR5IERpYWdIYW5kbGVyID0gbnVsbHB0ciwKKyAgICAgICAgdm9pZCAqRGlhZ0hhbmRsZXJDdHh0ID0gbnVsbHB0cik7CisgIElucHV0KE1lbW9yeUJ1ZmZlclJlZiBJbnB1dCwKKyAgICAgICAgdm9pZCAqQ3R4dCA9IG51bGxwdHIsCisgICAgICAgIFNvdXJjZU1ncjo6RGlhZ0hhbmRsZXJUeSBEaWFnSGFuZGxlciA9IG51bGxwdHIsCisgICAgICAgIHZvaWQgKkRpYWdIYW5kbGVyQ3R4dCA9IG51bGxwdHIpOworICB+SW5wdXQoKSBvdmVycmlkZTsKKworICAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYW4gc3ludGF4IG9yIHNlbWFudGljIGVycm9yIGR1cmluZyBwYXJzaW5nLgorICBzdGQ6OmVycm9yX2NvZGUgZXJyb3IoKTsKKworcHJpdmF0ZToKKyAgYm9vbCBvdXRwdXR0aW5nKCkgb3ZlcnJpZGU7CisgIGJvb2wgbWFwVGFnKFN0cmluZ1JlZiwgYm9vbCkgb3ZlcnJpZGU7CisgIHZvaWQgYmVnaW5NYXBwaW5nKCkgb3ZlcnJpZGU7CisgIHZvaWQgZW5kTWFwcGluZygpIG92ZXJyaWRlOworICBib29sIHByZWZsaWdodEtleShjb25zdCBjaGFyICosIGJvb2wsIGJvb2wsIGJvb2wgJiwgdm9pZCAqJikgb3ZlcnJpZGU7CisgIHZvaWQgcG9zdGZsaWdodEtleSh2b2lkICopIG92ZXJyaWRlOworICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IGtleXMoKSBvdmVycmlkZTsKKyAgdm9pZCBiZWdpbkZsb3dNYXBwaW5nKCkgb3ZlcnJpZGU7CisgIHZvaWQgZW5kRmxvd01hcHBpbmcoKSBvdmVycmlkZTsKKyAgdW5zaWduZWQgYmVnaW5TZXF1ZW5jZSgpIG92ZXJyaWRlOworICB2b2lkIGVuZFNlcXVlbmNlKCkgb3ZlcnJpZGU7CisgIGJvb2wgcHJlZmxpZ2h0RWxlbWVudCh1bnNpZ25lZCBpbmRleCwgdm9pZCAqJikgb3ZlcnJpZGU7CisgIHZvaWQgcG9zdGZsaWdodEVsZW1lbnQodm9pZCAqKSBvdmVycmlkZTsKKyAgdW5zaWduZWQgYmVnaW5GbG93U2VxdWVuY2UoKSBvdmVycmlkZTsKKyAgYm9vbCBwcmVmbGlnaHRGbG93RWxlbWVudCh1bnNpZ25lZCAsIHZvaWQgKiYpIG92ZXJyaWRlOworICB2b2lkIHBvc3RmbGlnaHRGbG93RWxlbWVudCh2b2lkICopIG92ZXJyaWRlOworICB2b2lkIGVuZEZsb3dTZXF1ZW5jZSgpIG92ZXJyaWRlOworICB2b2lkIGJlZ2luRW51bVNjYWxhcigpIG92ZXJyaWRlOworICBib29sIG1hdGNoRW51bVNjYWxhcihjb25zdCBjaGFyKiwgYm9vbCkgb3ZlcnJpZGU7CisgIGJvb2wgbWF0Y2hFbnVtRmFsbGJhY2soKSBvdmVycmlkZTsKKyAgdm9pZCBlbmRFbnVtU2NhbGFyKCkgb3ZlcnJpZGU7CisgIGJvb2wgYmVnaW5CaXRTZXRTY2FsYXIoYm9vbCAmKSBvdmVycmlkZTsKKyAgYm9vbCBiaXRTZXRNYXRjaChjb25zdCBjaGFyICosIGJvb2wgKSBvdmVycmlkZTsKKyAgdm9pZCBlbmRCaXRTZXRTY2FsYXIoKSBvdmVycmlkZTsKKyAgdm9pZCBzY2FsYXJTdHJpbmcoU3RyaW5nUmVmICYsIFF1b3RpbmdUeXBlKSBvdmVycmlkZTsKKyAgdm9pZCBibG9ja1NjYWxhclN0cmluZyhTdHJpbmdSZWYgJikgb3ZlcnJpZGU7CisgIHZvaWQgc2V0RXJyb3IoY29uc3QgVHdpbmUgJm1lc3NhZ2UpIG92ZXJyaWRlOworICBib29sIGNhbkVsaWRlRW1wdHlTZXF1ZW5jZSgpIG92ZXJyaWRlOworCisgIGNsYXNzIEhOb2RlIHsKKyAgICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKKyAgcHVibGljOgorICAgIEhOb2RlKE5vZGUgKm4pIDogX25vZGUobikgeyB9CisgICAgdmlydHVhbCB+SE5vZGUoKSA9IGRlZmF1bHQ7CisKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEhOb2RlICopIHsgcmV0dXJuIHRydWU7IH0KKworICAgIE5vZGUgKl9ub2RlOworICB9OworCisgIGNsYXNzIEVtcHR5SE5vZGUgOiBwdWJsaWMgSE5vZGUgeworICAgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKKyAgcHVibGljOgorICAgIEVtcHR5SE5vZGUoTm9kZSAqbikgOiBITm9kZShuKSB7IH0KKworICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSE5vZGUgKm4pIHsgcmV0dXJuIE51bGxOb2RlOjpjbGFzc29mKG4tPl9ub2RlKTsgfQorCisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBFbXB0eUhOb2RlICopIHsgcmV0dXJuIHRydWU7IH0KKyAgfTsKKworICBjbGFzcyBTY2FsYXJITm9kZSA6IHB1YmxpYyBITm9kZSB7CisgICAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworICBwdWJsaWM6CisgICAgU2NhbGFySE5vZGUoTm9kZSAqbiwgU3RyaW5nUmVmIHMpIDogSE5vZGUobiksIF92YWx1ZShzKSB7IH0KKworICAgIFN0cmluZ1JlZiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIF92YWx1ZTsgfQorCisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBITm9kZSAqbikgeworICAgICAgcmV0dXJuIFNjYWxhck5vZGU6OmNsYXNzb2Yobi0+X25vZGUpIHx8CisgICAgICAgICAgICAgQmxvY2tTY2FsYXJOb2RlOjpjbGFzc29mKG4tPl9ub2RlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNjYWxhckhOb2RlICopIHsgcmV0dXJuIHRydWU7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgU3RyaW5nUmVmIF92YWx1ZTsKKyAgfTsKKworICBjbGFzcyBNYXBITm9kZSA6IHB1YmxpYyBITm9kZSB7CisgICAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworICBwdWJsaWM6CisgICAgTWFwSE5vZGUoTm9kZSAqbikgOiBITm9kZShuKSB7IH0KKworICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSE5vZGUgKm4pIHsKKyAgICAgIHJldHVybiBNYXBwaW5nTm9kZTo6Y2xhc3NvZihuLT5fbm9kZSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNYXBITm9kZSAqKSB7IHJldHVybiB0cnVlOyB9CisKKyAgICB1c2luZyBOYW1lVG9Ob2RlID0gU3RyaW5nTWFwPHN0ZDo6dW5pcXVlX3B0cjxITm9kZT4+OworCisgICAgTmFtZVRvTm9kZSBNYXBwaW5nOworICAgIFNtYWxsVmVjdG9yPHN0ZDo6c3RyaW5nLCA2PiBWYWxpZEtleXM7CisgIH07CisKKyAgY2xhc3MgU2VxdWVuY2VITm9kZSA6IHB1YmxpYyBITm9kZSB7CisgICAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworICBwdWJsaWM6CisgICAgU2VxdWVuY2VITm9kZShOb2RlICpuKSA6IEhOb2RlKG4pIHsgfQorCisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBITm9kZSAqbikgeworICAgICAgcmV0dXJuIFNlcXVlbmNlTm9kZTo6Y2xhc3NvZihuLT5fbm9kZSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTZXF1ZW5jZUhOb2RlICopIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxITm9kZT4+IEVudHJpZXM7CisgIH07CisKKyAgc3RkOjp1bmlxdWVfcHRyPElucHV0OjpITm9kZT4gY3JlYXRlSE5vZGVzKE5vZGUgKm5vZGUpOworICB2b2lkIHNldEVycm9yKEhOb2RlICpobm9kZSwgY29uc3QgVHdpbmUgJm1lc3NhZ2UpOworICB2b2lkIHNldEVycm9yKE5vZGUgKm5vZGUsIGNvbnN0IFR3aW5lICZtZXNzYWdlKTsKKworcHVibGljOgorICAvLyBUaGVzZSBhcmUgb25seSB1c2VkIGJ5IG9wZXJhdG9yPj4uIFRoZXkgY291bGQgYmUgcHJpdmF0ZQorICAvLyBpZiB0aG9zZSB0ZW1wbGF0ZWQgdGhpbmdzIGNvdWxkIGJlIG1hZGUgZnJpZW5kcy4KKyAgYm9vbCBzZXRDdXJyZW50RG9jdW1lbnQoKTsKKyAgYm9vbCBuZXh0RG9jdW1lbnQoKTsKKworICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCBub2RlIHRoYXQncyBiZWluZyBwYXJzZWQgYnkgdGhlIFlBTUwgUGFyc2VyLgorICBjb25zdCBOb2RlICpnZXRDdXJyZW50Tm9kZSgpIGNvbnN0OworCitwcml2YXRlOgorICBTb3VyY2VNZ3IgICAgICAgICAgICAgICAgICAgICAgICAgICBTcmNNZ3I7IC8vIG11c3QgYmUgYmVmb3JlIFN0cm0KKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06OnlhbWw6OlN0cmVhbT4gU3RybTsKKyAgc3RkOjp1bmlxdWVfcHRyPEhOb2RlPiAgICAgICAgICAgICAgVG9wTm9kZTsKKyAgc3RkOjplcnJvcl9jb2RlICAgICAgICAgICAgICAgICAgICAgRUM7CisgIEJ1bXBQdHJBbGxvY2F0b3IgICAgICAgICAgICAgICAgICAgIFN0cmluZ0FsbG9jYXRvcjsKKyAgZG9jdW1lbnRfaXRlcmF0b3IgICAgICAgICAgICAgICAgICAgRG9jSXRlcmF0b3I7CisgIHN0ZDo6dmVjdG9yPGJvb2w+ICAgICAgICAgICAgICAgICAgIEJpdFZhbHVlc1VzZWQ7CisgIEhOb2RlICpDdXJyZW50Tm9kZSA9IG51bGxwdHI7CisgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhck1hdGNoRm91bmQ7Cit9OworCisvLy8KKy8vLyBUaGUgT3V0cHV0IGNsYXNzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgYSB5YW1sIGRvY3VtZW50IGZyb20gaW4tbWVtb3J5IHN0cnVjdHMKKy8vLyBhbmQgdmVjdG9ycy4KKy8vLworY2xhc3MgT3V0cHV0IDogcHVibGljIElPIHsKK3B1YmxpYzoKKyAgT3V0cHV0KHJhd19vc3RyZWFtICYsIHZvaWQgKkN0eHQgPSBudWxscHRyLCBpbnQgV3JhcENvbHVtbiA9IDcwKTsKKyAgfk91dHB1dCgpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgU2V0IHdoZXRoZXIgb3Igbm90IHRvIG91dHB1dCBvcHRpb25hbCB2YWx1ZXMgd2hpY2ggYXJlIGVxdWFsCisgIC8vLyB0byB0aGUgZGVmYXVsdCB2YWx1ZS4gIEJ5IGRlZmF1bHQsIHdoZW4gb3V0cHV0dGluZyBpZiB5b3UgYXR0ZW1wdAorICAvLy8gdG8gd3JpdGUgYSB2YWx1ZSB0aGF0IGlzIGVxdWFsIHRvIHRoZSBkZWZhdWx0LCB0aGUgdmFsdWUgZ2V0cyBpZ25vcmVkLgorICAvLy8gU29tZXRpbWVzLCBpdCBpcyB1c2VmdWwgdG8gYmUgYWJsZSB0byBzZWUgdGhlc2UgaW4gdGhlIHJlc3VsdGluZyBZQU1MCisgIC8vLyBhbnl3YXkuCisgIHZvaWQgc2V0V3JpdGVEZWZhdWx0VmFsdWVzKGJvb2wgV3JpdGUpIHsgV3JpdGVEZWZhdWx0VmFsdWVzID0gV3JpdGU7IH0KKworICBib29sIG91dHB1dHRpbmcoKSBvdmVycmlkZTsKKyAgYm9vbCBtYXBUYWcoU3RyaW5nUmVmLCBib29sKSBvdmVycmlkZTsKKyAgdm9pZCBiZWdpbk1hcHBpbmcoKSBvdmVycmlkZTsKKyAgdm9pZCBlbmRNYXBwaW5nKCkgb3ZlcnJpZGU7CisgIGJvb2wgcHJlZmxpZ2h0S2V5KGNvbnN0IGNoYXIgKmtleSwgYm9vbCwgYm9vbCwgYm9vbCAmLCB2b2lkIComKSBvdmVycmlkZTsKKyAgdm9pZCBwb3N0ZmxpZ2h0S2V5KHZvaWQgKikgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4ga2V5cygpIG92ZXJyaWRlOworICB2b2lkIGJlZ2luRmxvd01hcHBpbmcoKSBvdmVycmlkZTsKKyAgdm9pZCBlbmRGbG93TWFwcGluZygpIG92ZXJyaWRlOworICB1bnNpZ25lZCBiZWdpblNlcXVlbmNlKCkgb3ZlcnJpZGU7CisgIHZvaWQgZW5kU2VxdWVuY2UoKSBvdmVycmlkZTsKKyAgYm9vbCBwcmVmbGlnaHRFbGVtZW50KHVuc2lnbmVkLCB2b2lkIComKSBvdmVycmlkZTsKKyAgdm9pZCBwb3N0ZmxpZ2h0RWxlbWVudCh2b2lkICopIG92ZXJyaWRlOworICB1bnNpZ25lZCBiZWdpbkZsb3dTZXF1ZW5jZSgpIG92ZXJyaWRlOworICBib29sIHByZWZsaWdodEZsb3dFbGVtZW50KHVuc2lnbmVkLCB2b2lkIComKSBvdmVycmlkZTsKKyAgdm9pZCBwb3N0ZmxpZ2h0Rmxvd0VsZW1lbnQodm9pZCAqKSBvdmVycmlkZTsKKyAgdm9pZCBlbmRGbG93U2VxdWVuY2UoKSBvdmVycmlkZTsKKyAgdm9pZCBiZWdpbkVudW1TY2FsYXIoKSBvdmVycmlkZTsKKyAgYm9vbCBtYXRjaEVudW1TY2FsYXIoY29uc3QgY2hhciosIGJvb2wpIG92ZXJyaWRlOworICBib29sIG1hdGNoRW51bUZhbGxiYWNrKCkgb3ZlcnJpZGU7CisgIHZvaWQgZW5kRW51bVNjYWxhcigpIG92ZXJyaWRlOworICBib29sIGJlZ2luQml0U2V0U2NhbGFyKGJvb2wgJikgb3ZlcnJpZGU7CisgIGJvb2wgYml0U2V0TWF0Y2goY29uc3QgY2hhciAqLCBib29sICkgb3ZlcnJpZGU7CisgIHZvaWQgZW5kQml0U2V0U2NhbGFyKCkgb3ZlcnJpZGU7CisgIHZvaWQgc2NhbGFyU3RyaW5nKFN0cmluZ1JlZiAmLCBRdW90aW5nVHlwZSkgb3ZlcnJpZGU7CisgIHZvaWQgYmxvY2tTY2FsYXJTdHJpbmcoU3RyaW5nUmVmICYpIG92ZXJyaWRlOworICB2b2lkIHNldEVycm9yKGNvbnN0IFR3aW5lICZtZXNzYWdlKSBvdmVycmlkZTsKKyAgYm9vbCBjYW5FbGlkZUVtcHR5U2VxdWVuY2UoKSBvdmVycmlkZTsKKworICAvLyBUaGVzZSBhcmUgb25seSB1c2VkIGJ5IG9wZXJhdG9yPDwuIFRoZXkgY291bGQgYmUgcHJpdmF0ZQorICAvLyBpZiB0aGF0IHRlbXBsYXRlZCBvcGVyYXRvciBjb3VsZCBiZSBtYWRlIGEgZnJpZW5kLgorICB2b2lkIGJlZ2luRG9jdW1lbnRzKCk7CisgIGJvb2wgcHJlZmxpZ2h0RG9jdW1lbnQodW5zaWduZWQpOworICB2b2lkIHBvc3RmbGlnaHREb2N1bWVudCgpOworICB2b2lkIGVuZERvY3VtZW50cygpOworCitwcml2YXRlOgorICB2b2lkIG91dHB1dChTdHJpbmdSZWYgcyk7CisgIHZvaWQgb3V0cHV0VXBUb0VuZE9mTGluZShTdHJpbmdSZWYgcyk7CisgIHZvaWQgbmV3TGluZUNoZWNrKCk7CisgIHZvaWQgb3V0cHV0TmV3TGluZSgpOworICB2b2lkIHBhZGRlZEtleShTdHJpbmdSZWYga2V5KTsKKyAgdm9pZCBmbG93S2V5KFN0cmluZ1JlZiBLZXkpOworCisgIGVudW0gSW5TdGF0ZSB7CisgICAgaW5TZXEsCisgICAgaW5GbG93U2VxLAorICAgIGluTWFwRmlyc3RLZXksCisgICAgaW5NYXBPdGhlcktleSwKKyAgICBpbkZsb3dNYXBGaXJzdEtleSwKKyAgICBpbkZsb3dNYXBPdGhlcktleQorICB9OworCisgIHJhd19vc3RyZWFtICZPdXQ7CisgIGludCBXcmFwQ29sdW1uOworICBTbWFsbFZlY3RvcjxJblN0YXRlLCA4PiBTdGF0ZVN0YWNrOworICBpbnQgQ29sdW1uID0gMDsKKyAgaW50IENvbHVtbkF0Rmxvd1N0YXJ0ID0gMDsKKyAgaW50IENvbHVtbkF0TWFwRmxvd1N0YXJ0ID0gMDsKKyAgYm9vbCBOZWVkQml0VmFsdWVDb21tYSA9IGZhbHNlOworICBib29sIE5lZWRGbG93U2VxdWVuY2VDb21tYSA9IGZhbHNlOworICBib29sIEVudW1lcmF0aW9uTWF0Y2hGb3VuZCA9IGZhbHNlOworICBib29sIE5lZWRzTmV3TGluZSA9IGZhbHNlOworICBib29sIFdyaXRlRGVmYXVsdFZhbHVlcyA9IGZhbHNlOworfTsKKworLy8vIFlBTUwgSS9PIGRvZXMgY29udmVyc2lvbiBiYXNlZCBvbiB0eXBlcy4gQnV0IG9mdGVuIG5hdGl2ZSBkYXRhIHR5cGVzCisvLy8gYXJlIGp1c3QgYSB0eXBlZGVmIG9mIGJ1aWx0IGluIGludGVyZ3JhbCB0eXBlcyAoZS5nLiBpbnQpLiAgQnV0IHRoZSBDKysKKy8vLyB0eXBlIG1hdGNoaW5nIHN5c3RlbSBzZWVzIHRocm91Z2ggdGhlIHR5cGVkZWYgYW5kIGFsbCB0aGUgdHlwZWRlZmVkIHR5cGVzCisvLy8gbG9vayBsaWtlIGEgYnVpbHQgaW4gdHlwZS4gVGhpcyB3aWxsIGNhdXNlIHRoZSBnZW5lcmljIFlBTUwgSS9PIGNvbnZlcnNpb24KKy8vLyB0byBiZSB1c2VkLiBUbyBwcm92aWRlIGJldHRlciBjb250cm9sIG92ZXIgdGhlIFlBTUwgY29udmVyc2lvbiwgeW91IGNhbgorLy8vIHVzZSB0aGlzIG1hY3JvIGluc3RlYWQgb2YgdHlwZWRlZi4gIEl0IHdpbGwgY3JlYXRlIGEgY2xhc3Mgd2l0aCBvbmUgZmllbGQKKy8vLyBhbmQgYXV0b21hdGljIGNvbnZlcnNpb24gb3BlcmF0b3JzIHRvIGFuZCBmcm9tIHRoZSBiYXNlIHR5cGUuCisvLy8gQmFzZWQgb24gQk9PU1RfU1RST05HX1RZUEVERUYKKyNkZWZpbmUgTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKF9iYXNlLCBfdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RydWN0IF90eXBlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfdHlwZSgpID0gZGVmYXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX3R5cGUoY29uc3QgX2Jhc2UgdikgOiB2YWx1ZSh2KSB7fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF90eXBlKGNvbnN0IF90eXBlICZ2KSA9IGRlZmF1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfdHlwZSAmb3BlcmF0b3I9KGNvbnN0IF90eXBlICZyaHMpID0gZGVmYXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX3R5cGUgJm9wZXJhdG9yPShjb25zdCBfYmFzZSAmcmhzKSB7IHZhbHVlID0gcmhzOyByZXR1cm4gKnRoaXM7IH0gICAgICBcCisgICAgICAgIG9wZXJhdG9yIGNvbnN0IF9iYXNlICYgKCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0gICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgX3R5cGUgJnJocykgY29uc3QgeyByZXR1cm4gdmFsdWUgPT0gcmhzLnZhbHVlOyB9IFwKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9iYXNlICZyaHMpIGNvbnN0IHsgcmV0dXJuIHZhbHVlID09IHJoczsgfSAgICAgICBcCisgICAgICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IF90eXBlICZyaHMpIGNvbnN0IHsgcmV0dXJuIHZhbHVlIDwgcmhzLnZhbHVlOyB9ICAgXAorICAgICAgICBfYmFzZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdXNpbmcgQmFzZVR5cGUgPSBfYmFzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfTsKKworLy8vCisvLy8gVXNlIHRoZXNlIHR5cGVzIGluc3RlYWQgb2YgdWludFhYX3QgaW4gYW55IG1hcHBpbmcgdG8gaGF2ZQorLy8vIGl0cyB5YW1sIG91dHB1dCBmb3JtYXR0ZWQgYXMgaGV4YWRlY2ltYWwuCisvLy8KK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50OF90LCBIZXg4KQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQxNl90LCBIZXgxNikKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50MzJfdCwgSGV4MzIpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDY0X3QsIEhleDY0KQorCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgU2NhbGFyVHJhaXRzPEhleDg+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IEhleDggJiwgdm9pZCAqLCByYXdfb3N0cmVhbSAmKTsKKyAgc3RhdGljIFN0cmluZ1JlZiBpbnB1dChTdHJpbmdSZWYsIHZvaWQgKiwgSGV4OCAmKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYpIHsgcmV0dXJuIFF1b3RpbmdUeXBlOjpOb25lOyB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgU2NhbGFyVHJhaXRzPEhleDE2PiB7CisgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCBIZXgxNiAmLCB2b2lkICosIHJhd19vc3RyZWFtICYpOworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiwgdm9pZCAqLCBIZXgxNiAmKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYpIHsgcmV0dXJuIFF1b3RpbmdUeXBlOjpOb25lOyB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgU2NhbGFyVHJhaXRzPEhleDMyPiB7CisgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCBIZXgzMiAmLCB2b2lkICosIHJhd19vc3RyZWFtICYpOworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiwgdm9pZCAqLCBIZXgzMiAmKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYpIHsgcmV0dXJuIFF1b3RpbmdUeXBlOjpOb25lOyB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgU2NhbGFyVHJhaXRzPEhleDY0PiB7CisgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCBIZXg2NCAmLCB2b2lkICosIHJhd19vc3RyZWFtICYpOworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiwgdm9pZCAqLCBIZXg2NCAmKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYpIHsgcmV0dXJuIFF1b3RpbmdUeXBlOjpOb25lOyB9Cit9OworCisvLyBEZWZpbmUgbm9uLW1lbWJlciBvcGVyYXRvcj4+IHNvIHRoYXQgSW5wdXQgY2FuIHN0cmVhbSBpbiBhIGRvY3VtZW50IGxpc3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aGFzX0RvY3VtZW50TGlzdFRyYWl0czxUPjo6dmFsdWUsIElucHV0ICY+Ojp0eXBlCitvcGVyYXRvcj4+KElucHV0ICZ5aW4sIFQgJmRvY0xpc3QpIHsKKyAgaW50IGkgPSAwOworICBFbXB0eUNvbnRleHQgQ3R4OworICB3aGlsZSAoIHlpbi5zZXRDdXJyZW50RG9jdW1lbnQoKSApIHsKKyAgICB5YW1saXplKHlpbiwgRG9jdW1lbnRMaXN0VHJhaXRzPFQ+OjplbGVtZW50KHlpbiwgZG9jTGlzdCwgaSksIHRydWUsIEN0eCk7CisgICAgaWYgKCB5aW4uZXJyb3IoKSApCisgICAgICByZXR1cm4geWluOworICAgIHlpbi5uZXh0RG9jdW1lbnQoKTsKKyAgICArK2k7CisgIH0KKyAgcmV0dXJuIHlpbjsKK30KKworLy8gRGVmaW5lIG5vbi1tZW1iZXIgb3BlcmF0b3I+PiBzbyB0aGF0IElucHV0IGNhbiBzdHJlYW0gaW4gYSBtYXAgYXMgYSBkb2N1bWVudC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGhhc19NYXBwaW5nVHJhaXRzPFQsIEVtcHR5Q29udGV4dD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0ICY+Ojp0eXBlCitvcGVyYXRvcj4+KElucHV0ICZ5aW4sIFQgJmRvY01hcCkgeworICBFbXB0eUNvbnRleHQgQ3R4OworICB5aW4uc2V0Q3VycmVudERvY3VtZW50KCk7CisgIHlhbWxpemUoeWluLCBkb2NNYXAsIHRydWUsIEN0eCk7CisgIHJldHVybiB5aW47Cit9CisKKy8vIERlZmluZSBub24tbWVtYmVyIG9wZXJhdG9yPj4gc28gdGhhdCBJbnB1dCBjYW4gc3RyZWFtIGluIGEgc2VxdWVuY2UgYXMKKy8vIGEgZG9jdW1lbnQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aGFzX1NlcXVlbmNlVHJhaXRzPFQ+Ojp2YWx1ZSwgSW5wdXQgJj46OnR5cGUKK29wZXJhdG9yPj4oSW5wdXQgJnlpbiwgVCAmZG9jU2VxKSB7CisgIEVtcHR5Q29udGV4dCBDdHg7CisgIGlmICh5aW4uc2V0Q3VycmVudERvY3VtZW50KCkpCisgICAgeWFtbGl6ZSh5aW4sIGRvY1NlcSwgdHJ1ZSwgQ3R4KTsKKyAgcmV0dXJuIHlpbjsKK30KKworLy8gRGVmaW5lIG5vbi1tZW1iZXIgb3BlcmF0b3I+PiBzbyB0aGF0IElucHV0IGNhbiBzdHJlYW0gaW4gYSBibG9jayBzY2FsYXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aGFzX0Jsb2NrU2NhbGFyVHJhaXRzPFQ+Ojp2YWx1ZSwgSW5wdXQgJj46OnR5cGUKK29wZXJhdG9yPj4oSW5wdXQgJkluLCBUICZWYWwpIHsKKyAgRW1wdHlDb250ZXh0IEN0eDsKKyAgaWYgKEluLnNldEN1cnJlbnREb2N1bWVudCgpKQorICAgIHlhbWxpemUoSW4sIFZhbCwgdHJ1ZSwgQ3R4KTsKKyAgcmV0dXJuIEluOworfQorCisvLyBEZWZpbmUgbm9uLW1lbWJlciBvcGVyYXRvcj4+IHNvIHRoYXQgSW5wdXQgY2FuIHN0cmVhbSBpbiBhIHN0cmluZyBtYXAuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aGFzX0N1c3RvbU1hcHBpbmdUcmFpdHM8VD46OnZhbHVlLCBJbnB1dCAmPjo6dHlwZQorb3BlcmF0b3I+PihJbnB1dCAmSW4sIFQgJlZhbCkgeworICBFbXB0eUNvbnRleHQgQ3R4OworICBpZiAoSW4uc2V0Q3VycmVudERvY3VtZW50KCkpCisgICAgeWFtbGl6ZShJbiwgVmFsLCB0cnVlLCBDdHgpOworICByZXR1cm4gSW47Cit9CisKKy8vIFByb3ZpZGUgYmV0dGVyIGVycm9yIG1lc3NhZ2UgYWJvdXQgdHlwZXMgbWlzc2luZyBhIHRyYWl0IHNwZWNpYWxpemF0aW9uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxtaXNzaW5nVHJhaXRzPFQsIEVtcHR5Q29udGV4dD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0ICY+Ojp0eXBlCitvcGVyYXRvcj4+KElucHV0ICZ5aW4sIFQgJmRvY1NlcSkgeworICBjaGFyIG1pc3NpbmdfeWFtbF90cmFpdF9mb3JfdHlwZVtzaXplb2YoTWlzc2luZ1RyYWl0PFQ+KV07CisgIHJldHVybiB5aW47Cit9CisKKy8vIERlZmluZSBub24tbWVtYmVyIG9wZXJhdG9yPDwgc28gdGhhdCBPdXRwdXQgY2FuIHN0cmVhbSBvdXQgZG9jdW1lbnQgbGlzdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxoYXNfRG9jdW1lbnRMaXN0VHJhaXRzPFQ+Ojp2YWx1ZSwgT3V0cHV0ICY+Ojp0eXBlCitvcGVyYXRvcjw8KE91dHB1dCAmeW91dCwgVCAmZG9jTGlzdCkgeworICBFbXB0eUNvbnRleHQgQ3R4OworICB5b3V0LmJlZ2luRG9jdW1lbnRzKCk7CisgIGNvbnN0IHNpemVfdCBjb3VudCA9IERvY3VtZW50TGlzdFRyYWl0czxUPjo6c2l6ZSh5b3V0LCBkb2NMaXN0KTsKKyAgZm9yKHNpemVfdCBpPTA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgaWYgKCB5b3V0LnByZWZsaWdodERvY3VtZW50KGkpICkgeworICAgICAgeWFtbGl6ZSh5b3V0LCBEb2N1bWVudExpc3RUcmFpdHM8VD46OmVsZW1lbnQoeW91dCwgZG9jTGlzdCwgaSksIHRydWUsCisgICAgICAgICAgICAgIEN0eCk7CisgICAgICB5b3V0LnBvc3RmbGlnaHREb2N1bWVudCgpOworICAgIH0KKyAgfQorICB5b3V0LmVuZERvY3VtZW50cygpOworICByZXR1cm4geW91dDsKK30KKworLy8gRGVmaW5lIG5vbi1tZW1iZXIgb3BlcmF0b3I8PCBzbyB0aGF0IE91dHB1dCBjYW4gc3RyZWFtIG91dCBhIG1hcC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGhhc19NYXBwaW5nVHJhaXRzPFQsIEVtcHR5Q29udGV4dD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dCAmPjo6dHlwZQorb3BlcmF0b3I8PChPdXRwdXQgJnlvdXQsIFQgJm1hcCkgeworICBFbXB0eUNvbnRleHQgQ3R4OworICB5b3V0LmJlZ2luRG9jdW1lbnRzKCk7CisgIGlmICggeW91dC5wcmVmbGlnaHREb2N1bWVudCgwKSApIHsKKyAgICB5YW1saXplKHlvdXQsIG1hcCwgdHJ1ZSwgQ3R4KTsKKyAgICB5b3V0LnBvc3RmbGlnaHREb2N1bWVudCgpOworICB9CisgIHlvdXQuZW5kRG9jdW1lbnRzKCk7CisgIHJldHVybiB5b3V0OworfQorCisvLyBEZWZpbmUgbm9uLW1lbWJlciBvcGVyYXRvcjw8IHNvIHRoYXQgT3V0cHV0IGNhbiBzdHJlYW0gb3V0IGEgc2VxdWVuY2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aGFzX1NlcXVlbmNlVHJhaXRzPFQ+Ojp2YWx1ZSwgT3V0cHV0ICY+Ojp0eXBlCitvcGVyYXRvcjw8KE91dHB1dCAmeW91dCwgVCAmc2VxKSB7CisgIEVtcHR5Q29udGV4dCBDdHg7CisgIHlvdXQuYmVnaW5Eb2N1bWVudHMoKTsKKyAgaWYgKCB5b3V0LnByZWZsaWdodERvY3VtZW50KDApICkgeworICAgIHlhbWxpemUoeW91dCwgc2VxLCB0cnVlLCBDdHgpOworICAgIHlvdXQucG9zdGZsaWdodERvY3VtZW50KCk7CisgIH0KKyAgeW91dC5lbmREb2N1bWVudHMoKTsKKyAgcmV0dXJuIHlvdXQ7Cit9CisKKy8vIERlZmluZSBub24tbWVtYmVyIG9wZXJhdG9yPDwgc28gdGhhdCBPdXRwdXQgY2FuIHN0cmVhbSBvdXQgYSBibG9jayBzY2FsYXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aGFzX0Jsb2NrU2NhbGFyVHJhaXRzPFQ+Ojp2YWx1ZSwgT3V0cHV0ICY+Ojp0eXBlCitvcGVyYXRvcjw8KE91dHB1dCAmT3V0LCBUICZWYWwpIHsKKyAgRW1wdHlDb250ZXh0IEN0eDsKKyAgT3V0LmJlZ2luRG9jdW1lbnRzKCk7CisgIGlmIChPdXQucHJlZmxpZ2h0RG9jdW1lbnQoMCkpIHsKKyAgICB5YW1saXplKE91dCwgVmFsLCB0cnVlLCBDdHgpOworICAgIE91dC5wb3N0ZmxpZ2h0RG9jdW1lbnQoKTsKKyAgfQorICBPdXQuZW5kRG9jdW1lbnRzKCk7CisgIHJldHVybiBPdXQ7Cit9CisKKy8vIERlZmluZSBub24tbWVtYmVyIG9wZXJhdG9yPDwgc28gdGhhdCBPdXRwdXQgY2FuIHN0cmVhbSBvdXQgYSBzdHJpbmcgbWFwLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGhhc19DdXN0b21NYXBwaW5nVHJhaXRzPFQ+Ojp2YWx1ZSwgT3V0cHV0ICY+Ojp0eXBlCitvcGVyYXRvcjw8KE91dHB1dCAmT3V0LCBUICZWYWwpIHsKKyAgRW1wdHlDb250ZXh0IEN0eDsKKyAgT3V0LmJlZ2luRG9jdW1lbnRzKCk7CisgIGlmIChPdXQucHJlZmxpZ2h0RG9jdW1lbnQoMCkpIHsKKyAgICB5YW1saXplKE91dCwgVmFsLCB0cnVlLCBDdHgpOworICAgIE91dC5wb3N0ZmxpZ2h0RG9jdW1lbnQoKTsKKyAgfQorICBPdXQuZW5kRG9jdW1lbnRzKCk7CisgIHJldHVybiBPdXQ7Cit9CisKKy8vIFByb3ZpZGUgYmV0dGVyIGVycm9yIG1lc3NhZ2UgYWJvdXQgdHlwZXMgbWlzc2luZyBhIHRyYWl0IHNwZWNpYWxpemF0aW9uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxtaXNzaW5nVHJhaXRzPFQsIEVtcHR5Q29udGV4dD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dCAmPjo6dHlwZQorb3BlcmF0b3I8PChPdXRwdXQgJnlvdXQsIFQgJnNlcSkgeworICBjaGFyIG1pc3NpbmdfeWFtbF90cmFpdF9mb3JfdHlwZVtzaXplb2YoTWlzc2luZ1RyYWl0PFQ+KV07CisgIHJldHVybiB5b3V0OworfQorCit0ZW1wbGF0ZSA8Ym9vbCBCPiBzdHJ1Y3QgSXNGbG93U2VxdWVuY2VCYXNlIHt9OwordGVtcGxhdGUgPD4gc3RydWN0IElzRmxvd1NlcXVlbmNlQmFzZTx0cnVlPiB7IHN0YXRpYyBjb25zdCBib29sIGZsb3cgPSB0cnVlOyB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgYm9vbCBGbG93Pgorc3RydWN0IFNlcXVlbmNlVHJhaXRzSW1wbCA6IElzRmxvd1NlcXVlbmNlQmFzZTxGbG93PiB7Citwcml2YXRlOgorICB1c2luZyB0eXBlID0gdHlwZW5hbWUgVDo6dmFsdWVfdHlwZTsKKworcHVibGljOgorICBzdGF0aWMgc2l6ZV90IHNpemUoSU8gJmlvLCBUICZzZXEpIHsgcmV0dXJuIHNlcS5zaXplKCk7IH0KKworICBzdGF0aWMgdHlwZSAmZWxlbWVudChJTyAmaW8sIFQgJnNlcSwgc2l6ZV90IGluZGV4KSB7CisgICAgaWYgKGluZGV4ID49IHNlcS5zaXplKCkpCisgICAgICBzZXEucmVzaXplKGluZGV4ICsgMSk7CisgICAgcmV0dXJuIHNlcVtpbmRleF07CisgIH0KK307CisKKy8vIFNpbXBsZSBoZWxwZXIgdG8gY2hlY2sgYW4gZXhwcmVzc2lvbiBjYW4gYmUgdXNlZCBhcyBhIGJvb2wtdmFsdWVkIHRlbXBsYXRlCisvLyBhcmd1bWVudC4KK3RlbXBsYXRlIDxib29sPiBzdHJ1Y3QgQ2hlY2tJc0Jvb2wgeyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKKy8vIElmIFQgaGFzIFNlcXVlbmNlRWxlbWVudFRyYWl0cywgdGhlbiB2ZWN0b3I8VD4gYW5kIFNtYWxsVmVjdG9yPFQsIE4+IGhhdmUKKy8vIFNlcXVlbmNlVHJhaXRzIHRoYXQgZG8gdGhlIG9idmlvdXMgdGhpbmcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBTZXF1ZW5jZVRyYWl0czxzdGQ6OnZlY3RvcjxUPiwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxDaGVja0lzQm9vbDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VFbGVtZW50VHJhaXRzPFQ+OjpmbG93Pjo6dmFsdWU+Ojp0eXBlPgorICAgIDogU2VxdWVuY2VUcmFpdHNJbXBsPHN0ZDo6dmVjdG9yPFQ+LCBTZXF1ZW5jZUVsZW1lbnRUcmFpdHM8VD46OmZsb3c+IHt9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4+CitzdHJ1Y3QgU2VxdWVuY2VUcmFpdHM8U21hbGxWZWN0b3I8VCwgTj4sCisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8Q2hlY2tJc0Jvb2w8CisgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlRWxlbWVudFRyYWl0czxUPjo6Zmxvdz46OnZhbHVlPjo6dHlwZT4KKyAgICA6IFNlcXVlbmNlVHJhaXRzSW1wbDxTbWFsbFZlY3RvcjxULCBOPiwgU2VxdWVuY2VFbGVtZW50VHJhaXRzPFQ+OjpmbG93PiB7fTsKKworLy8gU2VxdWVuY2VzIG9mIGZ1bmRhbWVudGFsIHR5cGVzIHVzZSBmbG93IGZvcm1hdHRpbmcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBTZXF1ZW5jZUVsZW1lbnRUcmFpdHM8CisgICAgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19mdW5kYW1lbnRhbDxUPjo6dmFsdWU+Ojp0eXBlPiB7CisgIHN0YXRpYyBjb25zdCBib29sIGZsb3cgPSB0cnVlOworfTsKKworLy8gU2VxdWVuY2VzIG9mIHN0cmluZ3MgdXNlIGJsb2NrIGZvcm1hdHRpbmcuCit0ZW1wbGF0ZTw+IHN0cnVjdCBTZXF1ZW5jZUVsZW1lbnRUcmFpdHM8c3RkOjpzdHJpbmc+IHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgZmxvdyA9IGZhbHNlOworfTsKK3RlbXBsYXRlPD4gc3RydWN0IFNlcXVlbmNlRWxlbWVudFRyYWl0czxTdHJpbmdSZWY+IHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgZmxvdyA9IGZhbHNlOworfTsKK3RlbXBsYXRlPD4gc3RydWN0IFNlcXVlbmNlRWxlbWVudFRyYWl0czxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4geworICBzdGF0aWMgY29uc3QgYm9vbCBmbG93ID0gZmFsc2U7Cit9OworCisvLy8gSW1wbGVtZW50YXRpb24gb2YgQ3VzdG9tTWFwcGluZ1RyYWl0cyBmb3Igc3RkOjptYXA8c3RkOjpzdHJpbmcsIFQ+LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBTdGRNYXBTdHJpbmdDdXN0b21NYXBwaW5nVHJhaXRzSW1wbCB7CisgIHVzaW5nIG1hcF90eXBlID0gc3RkOjptYXA8c3RkOjpzdHJpbmcsIFQ+OworCisgIHN0YXRpYyB2b2lkIGlucHV0T25lKElPICZpbywgU3RyaW5nUmVmIGtleSwgbWFwX3R5cGUgJnYpIHsKKyAgICBpby5tYXBSZXF1aXJlZChrZXkuc3RyKCkuY19zdHIoKSwgdltrZXldKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIG91dHB1dChJTyAmaW8sIG1hcF90eXBlICZ2KSB7CisgICAgZm9yIChhdXRvICZwIDogdikKKyAgICAgIGlvLm1hcFJlcXVpcmVkKHAuZmlyc3QuY19zdHIoKSwgcC5zZWNvbmQpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgeWFtbAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2RlZmluZSBMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SX0lNUEwoVFlQRSwgRkxPVykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIGxsdm0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSB5YW1sIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWNfYXNzZXJ0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICFzdGQ6OmlzX2Z1bmRhbWVudGFsPFRZUEU+Ojp2YWx1ZSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAhc3RkOjppc19zYW1lPFRZUEUsIHN0ZDo6c3RyaW5nPjo6dmFsdWUgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIXN0ZDo6aXNfc2FtZTxUWVBFLCBsbHZtOjpTdHJpbmdSZWY+Ojp2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJvbmx5IHVzZSBMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SIGZvciB0eXBlcyB5b3UgY29udHJvbCIpOyAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBTZXF1ZW5jZUVsZW1lbnRUcmFpdHM8VFlQRT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBjb25zdCBib29sIGZsb3cgPSBGTE9XOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8vLyBVdGlsaXR5IGZvciBkZWNsYXJpbmcgdGhhdCBhIHN0ZDo6dmVjdG9yIG9mIGEgcGFydGljdWxhciB0eXBlCisvLy8gc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBZQU1MIHNlcXVlbmNlLgorI2RlZmluZSBMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUl9JTVBMKHR5cGUsIGZhbHNlKQorCisvLy8gVXRpbGl0eSBmb3IgZGVjbGFyaW5nIHRoYXQgYSBzdGQ6OnZlY3RvciBvZiBhIHBhcnRpY3VsYXIgdHlwZQorLy8vIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgWUFNTCBmbG93IHNlcXVlbmNlLgorI2RlZmluZSBMTFZNX1lBTUxfSVNfRkxPV19TRVFVRU5DRV9WRUNUT1IodHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUl9JTVBMKHR5cGUsIHRydWUpCisKKyNkZWZpbmUgTExWTV9ZQU1MX0RFQ0xBUkVfTUFQUElOR19UUkFJVFMoVHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSBsbHZtIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgeWFtbCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8VHlwZT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIFR5cGUgJk9iaik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBMTFZNX1lBTUxfREVDTEFSRV9FTlVNX1RSQUlUUyhUeXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIGxsdm0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSB5YW1sIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8VHlwZT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmaW8sIFR5cGUgJlZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIExMVk1fWUFNTF9ERUNMQVJFX0JJVFNFVF9UUkFJVFMoVHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgbGx2bSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIHlhbWwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJCaXRTZXRUcmFpdHM8VHlwZT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyB2b2lkIGJpdHNldChJTyAmSU8sIFR5cGUgJk9wdGlvbnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgTExWTV9ZQU1MX0RFQ0xBUkVfU0NBTEFSX1RSQUlUUyhUeXBlLCBNdXN0UXVvdGUpICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSBsbHZtIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgeWFtbCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhclRyYWl0czxUeXBlPiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IFR5cGUgJlZhbHVlLCB2b2lkICpjdHgsIHJhd19vc3RyZWFtICZPdXQpOyAgICAgICAgXAorICAgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmIFNjYWxhciwgdm9pZCAqY3R4dCwgVHlwZSAmVmFsdWUpOyAgICAgICAgIFwKKyAgICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZikgeyByZXR1cm4gTXVzdFF1b3RlOyB9ICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLy8gVXRpbGl0eSBmb3IgZGVjbGFyaW5nIHRoYXQgYSBzdGQ6OnZlY3RvciBvZiBhIHBhcnRpY3VsYXIgdHlwZQorLy8vIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgWUFNTCBkb2N1bWVudCBsaXN0LgorI2RlZmluZSBMTFZNX1lBTUxfSVNfRE9DVU1FTlRfTElTVF9WRUNUT1IoX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIGxsdm0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSB5YW1sIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dW5zaWduZWQgTj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IERvY3VtZW50TGlzdFRyYWl0czxTbWFsbFZlY3RvcjxfdHlwZSwgTj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6IHB1YmxpYyBTZXF1ZW5jZVRyYWl0c0ltcGw8U21hbGxWZWN0b3I8X3R5cGUsIE4+LCBmYWxzZT4ge307ICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IERvY3VtZW50TGlzdFRyYWl0czxzdGQ6OnZlY3RvcjxfdHlwZT4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6IHB1YmxpYyBTZXF1ZW5jZVRyYWl0c0ltcGw8c3RkOjp2ZWN0b3I8X3R5cGU+LCBmYWxzZT4ge307ICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLy8gVXRpbGl0eSBmb3IgZGVjbGFyaW5nIHRoYXQgc3RkOjptYXA8c3RkOjpzdHJpbmcsIF90eXBlPiBzaG91bGQgYmUgY29uc2lkZXJlZAorLy8vIGEgWUFNTCBtYXAuCisjZGVmaW5lIExMVk1fWUFNTF9JU19TVFJJTkdfTUFQKF90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgbGx2bSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIHlhbWwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgQ3VzdG9tTWFwcGluZ1RyYWl0czxzdGQ6Om1hcDxzdGQ6OnN0cmluZywgX3R5cGU+PiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogcHVibGljIFN0ZE1hcFN0cmluZ0N1c3RvbU1hcHBpbmdUcmFpdHNJbXBsPF90eXBlPiB7fTsgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfWUFNTFRSQUlUU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvY2lyY3VsYXJfcmF3X29zdHJlYW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9jaXJjdWxhcl9yYXdfb3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NmZkN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvY2lyY3VsYXJfcmF3X29zdHJlYW0uaApAQCAtMCwwICsxLDE1NiBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvY2lyY3VsYXJfcmF3X29zdHJlYW0uaCAtIEJ1ZmZlcmVkIHN0cmVhbXMgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgcmF3X29zdHJlYW0gaW1wbGVtZW50YXRpb25zIGZvciBzdHJlYW1zIHRvIGRvIGNpcmN1bGFyCisvLyBidWZmZXJpbmcgb2YgdGhlaXIgb3V0cHV0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0NJUkNVTEFSX1JBV19PU1RSRUFNX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0NJUkNVTEFSX1JBV19PU1RSRUFNX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIC8vLyBjaXJjdWxhcl9yYXdfb3N0cmVhbSAtIEEgcmF3X29zdHJlYW0gd2hpY2ggKmNhbiogc2F2ZSBpdHMgZGF0YQorICAvLy8gdG8gYSBjaXJjdWxhciBidWZmZXIsIG9yIGNhbiBwYXNzIGl0IHRocm91Z2ggZGlyZWN0bHkgdG8gYW4KKyAgLy8vIHVuZGVybHlpbmcgc3RyZWFtIGlmIHNwZWNpZmllZCB3aXRoIGEgYnVmZmVyIG9mIHplcm8uCisgIC8vLworICBjbGFzcyBjaXJjdWxhcl9yYXdfb3N0cmVhbSA6IHB1YmxpYyByYXdfb3N0cmVhbSB7CisgIHB1YmxpYzoKKyAgICAvLy8gVEFLRV9PV05FUlNISVAgLSBUZWxsIHRoaXMgc3RyZWFtIHRoYXQgaXQgb3ducyB0aGUgdW5kZXJseWluZworICAgIC8vLyBzdHJlYW0gYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBjbGVhbnVwLCBtZW1vcnkgbWFuYWdlbWVudAorICAgIC8vLyBpc3N1ZXMsIGV0Yy4KKyAgICAvLy8KKyAgICBzdGF0aWMgY29uc3QgYm9vbCBUQUtFX09XTkVSU0hJUCA9IHRydWU7CisKKyAgICAvLy8gUkVGRVJFTkNFX09OTFkgLSBUZWxsIHRoaXMgc3RyZWFtIGl0IHNob3VsZCBub3QgbWFuYWdlIHRoZQorICAgIC8vLyBoZWxkIHN0cmVhbS4KKyAgICAvLy8KKyAgICBzdGF0aWMgY29uc3QgYm9vbCBSRUZFUkVOQ0VfT05MWSA9IGZhbHNlOworCisgIHByaXZhdGU6CisgICAgLy8vIFRoZVN0cmVhbSAtIFRoZSByZWFsIHN0cmVhbSB3ZSBvdXRwdXQgdG8uIFdlIHNldCBpdCB0byBiZQorICAgIC8vLyB1bmJ1ZmZlcmVkLCBzaW5jZSB3ZSdyZSBhbHJlYWR5IGRvaW5nIG91ciBvd24gYnVmZmVyaW5nLgorICAgIC8vLworICAgIHJhd19vc3RyZWFtICpUaGVTdHJlYW07CisKKyAgICAvLy8gT3duc1N0cmVhbSAtIEFyZSB3ZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIHVuZGVybHlpbmcKKyAgICAvLy8gc3RyZWFtPworICAgIC8vLworICAgIGJvb2wgT3duc1N0cmVhbTsKKworICAgIC8vLyBCdWZmZXJTaXplIC0gVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlcy4KKyAgICAvLy8KKyAgICBzaXplX3QgQnVmZmVyU2l6ZTsKKworICAgIC8vLyBCdWZmZXJBcnJheSAtIFRoZSBhY3R1YWwgYnVmZmVyIHN0b3JhZ2UuCisgICAgLy8vCisgICAgY2hhciAqQnVmZmVyQXJyYXk7CisKKyAgICAvLy8gQ3VyIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBvdXRwdXQgcG9pbnQgaW4gQnVmZmVyQXJyYXkuCisgICAgLy8vCisgICAgY2hhciAqQ3VyOworCisgICAgLy8vIEZpbGxlZCAtIEluZGljYXRlIHdoZXRoZXIgdGhlIGJ1ZmZlciBoYXMgYmVlbiBjb21wbGV0ZWx5CisgICAgLy8vIGZpbGxlZC4gIFRoaXMgaGVscHMgYXZvaWQgZ2FyYmFnZSBvdXRwdXQuCisgICAgLy8vCisgICAgYm9vbCBGaWxsZWQ7CisKKyAgICAvLy8gQmFubmVyIC0gQSBwb2ludGVyIHRvIGEgYmFubmVyIHRvIHByaW50IGJlZm9yZSBkdW1waW5nIHRoZQorICAgIC8vLyBsb2cuCisgICAgLy8vCisgICAgY29uc3QgY2hhciAqQmFubmVyOworCisgICAgLy8vIGZsdXNoQnVmZmVyIC0gRHVtcCB0aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciB0byBTdHJlYW0uCisgICAgLy8vCisgICAgdm9pZCBmbHVzaEJ1ZmZlcigpIHsKKyAgICAgIGlmIChGaWxsZWQpCisgICAgICAgIC8vIFdyaXRlIHRoZSBvbGRlciBwb3J0aW9uIG9mIHRoZSBidWZmZXIuCisgICAgICAgIFRoZVN0cmVhbS0+d3JpdGUoQ3VyLCBCdWZmZXJBcnJheSArIEJ1ZmZlclNpemUgLSBDdXIpOworICAgICAgLy8gV3JpdGUgdGhlIG5ld2VyIHBvcnRpb24gb2YgdGhlIGJ1ZmZlci4KKyAgICAgIFRoZVN0cmVhbS0+d3JpdGUoQnVmZmVyQXJyYXksIEN1ciAtIEJ1ZmZlckFycmF5KTsKKyAgICAgIEN1ciA9IEJ1ZmZlckFycmF5OworICAgICAgRmlsbGVkID0gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpIG92ZXJyaWRlOworCisgICAgLy8vIGN1cnJlbnRfcG9zIC0gUmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc3RyZWFtLAorICAgIC8vLyBub3QgY291bnRpbmcgdGhlIGJ5dGVzIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyLgorICAgIC8vLworICAgIHVpbnQ2NF90IGN1cnJlbnRfcG9zKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgLy8gVGhpcyBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNhbGxpbmcgVGhlU3RyZWFtLmN1cnJlbnRfcG9zKCksCisgICAgICAvLyBidXQgdGhhdCBpbnRlcmZhY2UgaXMgcHJpdmF0ZS4KKyAgICAgIHJldHVybiBUaGVTdHJlYW0tPnRlbGwoKSAtIFRoZVN0cmVhbS0+R2V0TnVtQnl0ZXNJbkJ1ZmZlcigpOworICAgIH0KKworICBwdWJsaWM6CisgICAgLy8vIGNpcmN1bGFyX3Jhd19vc3RyZWFtIC0gQ29uc3RydWN0IGFuIG9wdGlvbmFsbHkKKyAgICAvLy8gY2lyY3VsYXItYnVmZmVyZWQgc3RyZWFtLCBoYW5kaW5nIGl0IGFuIHVuZGVybHlpbmcgc3RyZWFtIHRvCisgICAgLy8vIGRvIHRoZSAicmVhbCIgb3V0cHV0LgorICAgIC8vLworICAgIC8vLyBBcyBhIHNpZGUgZWZmZWN0LCBpZiBCdWZmU2l6ZSBpcyBub256ZXJvLCB0aGUgZ2l2ZW4gU3RyZWFtIGlzCisgICAgLy8vIHNldCB0byBiZSBVbmJ1ZmZlcmVkLiAgVGhpcyBpcyBiZWNhdXNlIGNpcmN1bGFyX3Jhd19vc3RyZWFtCisgICAgLy8vIGRvZXMgaXRzIG93biBidWZmZXJpbmcsIHNvIGl0IGRvZXNuJ3Qgd2FudCBhbm90aGVyIGxheWVyIG9mCisgICAgLy8vIGJ1ZmZlcmluZyB0byBiZSBoYXBwZW5pbmcgdW5kZXJuZWF0aCBpdC4KKyAgICAvLy8KKyAgICAvLy8gIk93bnMiIHRlbGxzIHRoZSBjaXJjdWxhcl9yYXdfb3N0cmVhbSB3aGV0aGVyIGl0IGlzCisgICAgLy8vIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgaGVsZCBzdHJlYW0sIGRvaW5nIG1lbW9yeQorICAgIC8vLyBtYW5hZ2VtZW50IG9mIGl0LCBldGMuCisgICAgLy8vCisgICAgY2lyY3VsYXJfcmF3X29zdHJlYW0ocmF3X29zdHJlYW0gJlN0cmVhbSwgY29uc3QgY2hhciAqSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBCdWZmU2l6ZSA9IDAsIGJvb2wgT3ducyA9IFJFRkVSRU5DRV9PTkxZKQorICAgICAgICA6IHJhd19vc3RyZWFtKC8qdW5idWZmZXJlZCovIHRydWUpLCBUaGVTdHJlYW0obnVsbHB0ciksCisgICAgICAgICAgT3duc1N0cmVhbShPd25zKSwgQnVmZmVyU2l6ZShCdWZmU2l6ZSksIEJ1ZmZlckFycmF5KG51bGxwdHIpLAorICAgICAgICAgIEZpbGxlZChmYWxzZSksIEJhbm5lcihIZWFkZXIpIHsKKyAgICAgIGlmIChCdWZmZXJTaXplICE9IDApCisgICAgICAgIEJ1ZmZlckFycmF5ID0gbmV3IGNoYXJbQnVmZmVyU2l6ZV07CisgICAgICBDdXIgPSBCdWZmZXJBcnJheTsKKyAgICAgIHNldFN0cmVhbShTdHJlYW0sIE93bnMpOworICAgIH0KKworICAgIH5jaXJjdWxhcl9yYXdfb3N0cmVhbSgpIG92ZXJyaWRlIHsKKyAgICAgIGZsdXNoKCk7CisgICAgICBmbHVzaEJ1ZmZlcldpdGhCYW5uZXIoKTsKKyAgICAgIHJlbGVhc2VTdHJlYW0oKTsKKyAgICAgIGRlbGV0ZVtdIEJ1ZmZlckFycmF5OworICAgIH0KKworICAgIC8vLyBzZXRTdHJlYW0gLSBUZWxsIHRoZSBjaXJjdWxhcl9yYXdfb3N0cmVhbSB0byBvdXRwdXQgYQorICAgIC8vLyBkaWZmZXJlbnQgc3RyZWFtLiAgIk93bnMiIHRlbGxzIGNpcmN1bGFyX3Jhd19vc3RyZWFtIHdoZXRoZXIKKyAgICAvLy8gaXQgc2hvdWxkIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIG1hbmFnaW5nIHRoZSB1bmRlcmx5aW5nCisgICAgLy8vIHN0cmVhbS4KKyAgICAvLy8KKyAgICB2b2lkIHNldFN0cmVhbShyYXdfb3N0cmVhbSAmU3RyZWFtLCBib29sIE93bnMgPSBSRUZFUkVOQ0VfT05MWSkgeworICAgICAgcmVsZWFzZVN0cmVhbSgpOworICAgICAgVGhlU3RyZWFtID0gJlN0cmVhbTsKKyAgICAgIE93bnNTdHJlYW0gPSBPd25zOworICAgIH0KKworICAgIC8vLyBmbHVzaEJ1ZmZlcldpdGhCYW5uZXIgLSBGb3JjZSBvdXRwdXQgb2YgdGhlIGJ1ZmZlciBhbG9uZyB3aXRoCisgICAgLy8vIGEgc21hbGwgaGVhZGVyLgorICAgIC8vLworICAgIHZvaWQgZmx1c2hCdWZmZXJXaXRoQmFubmVyKCk7CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gcmVsZWFzZVN0cmVhbSAtIERlbGV0ZSB0aGUgaGVsZCBzdHJlYW0gaWYgbmVlZGVkLiBPdGhlcndpc2UsCisgICAgLy8vIHRyYW5zZmVyIHRoZSBidWZmZXIgc2V0dGluZ3MgZnJvbSB0aGlzIGNpcmN1bGFyX3Jhd19vc3RyZWFtCisgICAgLy8vIGJhY2sgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgIC8vLworICAgIHZvaWQgcmVsZWFzZVN0cmVhbSgpIHsKKyAgICAgIGlmICghVGhlU3RyZWFtKQorICAgICAgICByZXR1cm47CisgICAgICBpZiAoT3duc1N0cmVhbSkKKyAgICAgICAgZGVsZXRlIFRoZVN0cmVhbTsKKyAgICB9CisgIH07Cit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9yYXdfb3Nfb3N0cmVhbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3Jhd19vc19vc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4M2FlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9yYXdfb3Nfb3N0cmVhbS5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vPT09LSByYXdfb3Nfb3N0cmVhbS5oIC0gc3RkOjpvc3RyZWFtIGFkYXB0b3IgZm9yIHJhd19vc3RyZWFtIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSByYXdfb3Nfb3N0cmVhbSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9SQVdfT1NfT1NUUkVBTV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9SQVdfT1NfT1NUUkVBTV9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxpb3Nmd2Q+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIHJhd19vc19vc3RyZWFtIC0gQSByYXdfb3N0cmVhbSB0aGF0IHdyaXRlcyB0byBhbiBzdGQ6Om9zdHJlYW0uICBUaGlzIGlzIGEKKy8vLyBzaW1wbGUgYWRhcHRvciBjbGFzcy4gIEl0IGRvZXMgbm90IGNoZWNrIGZvciBvdXRwdXQgZXJyb3JzOyBjbGllbnRzIHNob3VsZAorLy8vIHVzZSB0aGUgdW5kZXJseWluZyBzdHJlYW0gdG8gZGV0ZWN0IGVycm9ycy4KK2NsYXNzIHJhd19vc19vc3RyZWFtIDogcHVibGljIHJhd19vc3RyZWFtIHsKKyAgc3RkOjpvc3RyZWFtICZPUzsKKworICAvLy8gd3JpdGVfaW1wbCAtIFNlZSByYXdfb3N0cmVhbTo6d3JpdGVfaW1wbC4KKyAgdm9pZCB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpIG92ZXJyaWRlOworCisgIC8vLyBjdXJyZW50X3BvcyAtIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIHN0cmVhbSwgbm90CisgIC8vLyBjb3VudGluZyB0aGUgYnl0ZXMgY3VycmVudGx5IGluIHRoZSBidWZmZXIuCisgIHVpbnQ2NF90IGN1cnJlbnRfcG9zKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgcmF3X29zX29zdHJlYW0oc3RkOjpvc3RyZWFtICZPKSA6IE9TKE8pIHt9CisgIH5yYXdfb3Nfb3N0cmVhbSgpIG92ZXJyaWRlOworfTsKKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMWY1YTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaApAQCAtMCwwICsxLDU0MyBAQAorLy89PT0tLS0gcmF3X29zdHJlYW0uaCAtIFJhdyBvdXRwdXQgc3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHJhd19vc3RyZWFtIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1JBV19PU1RSRUFNX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1JBV19PU1RSRUFNX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIGZvcm1hdHZfb2JqZWN0X2Jhc2U7CitjbGFzcyBmb3JtYXRfb2JqZWN0X2Jhc2U7CitjbGFzcyBGb3JtYXR0ZWRTdHJpbmc7CitjbGFzcyBGb3JtYXR0ZWROdW1iZXI7CitjbGFzcyBGb3JtYXR0ZWRCeXRlczsKKworbmFtZXNwYWNlIHN5cyB7CituYW1lc3BhY2UgZnMgeworZW51bSBPcGVuRmxhZ3MgOiB1bnNpZ25lZDsKK30gLy8gZW5kIG5hbWVzcGFjZSBmcworfSAvLyBlbmQgbmFtZXNwYWNlIHN5cworCisvLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGFuIGV4dHJlbWVseSBmYXN0IGJ1bGsgb3V0cHV0IHN0cmVhbSB0aGF0IGNhbiAqb25seSoKKy8vLyBvdXRwdXQgdG8gYSBzdHJlYW0uICBJdCBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcsIHJlb3BlbmluZywgcmV3aW5kaW5nLCBsaW5lCisvLy8gYnVmZmVyZWQgZGlzY2lwbGluZXMgZXRjLiBJdCBpcyBhIHNpbXBsZSBidWZmZXIgdGhhdCBvdXRwdXRzCisvLy8gYSBjaHVuayBhdCBhIHRpbWUuCitjbGFzcyByYXdfb3N0cmVhbSB7Citwcml2YXRlOgorICAvLy8gVGhlIGJ1ZmZlciBpcyBoYW5kbGVkIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgYnVmZmVyIGlzCisgIC8vLyB1bmluaXRpYWxpemVkLCB1bmJ1ZmZlcmVkLCBvciBvdXQgb2Ygc3BhY2Ugd2hlbiBPdXRCdWZDdXIgPj0KKyAgLy8vIE91dEJ1ZkVuZC4gVGh1cyBhIHNpbmdsZSBjb21wYXJpc29uIHN1ZmZpY2VzIHRvIGRldGVybWluZSBpZiB3ZQorICAvLy8gbmVlZCB0byB0YWtlIHRoZSBzbG93IHBhdGggdG8gd3JpdGUgYSBzaW5nbGUgY2hhcmFjdGVyLgorICAvLy8KKyAgLy8vIFRoZSBidWZmZXIgaXMgaW4gb25lIG9mIHRocmVlIHN0YXRlczoKKyAgLy8vICAxLiBVbmJ1ZmZlcmVkIChCdWZmZXJNb2RlID09IFVuYnVmZmVyZWQpCisgIC8vLyAgMS4gVW5pbml0aWFsaXplZCAoQnVmZmVyTW9kZSAhPSBVbmJ1ZmZlcmVkICYmIE91dEJ1ZlN0YXJ0ID09IDApLgorICAvLy8gIDIuIEJ1ZmZlcmVkIChCdWZmZXJNb2RlICE9IFVuYnVmZmVyZWQgJiYgT3V0QnVmU3RhcnQgIT0gMCAmJgorICAvLy8gICAgICAgICAgICAgICBPdXRCdWZFbmQgLSBPdXRCdWZTdGFydCA+PSAxKS4KKyAgLy8vCisgIC8vLyBJZiBidWZmZXJlZCwgdGhlbiB0aGUgcmF3X29zdHJlYW0gb3ducyB0aGUgYnVmZmVyIGlmIChCdWZmZXJNb2RlID09CisgIC8vLyBJbnRlcm5hbEJ1ZmZlcik7IG90aGVyd2lzZSB0aGUgYnVmZmVyIGhhcyBiZWVuIHNldCB2aWEgU2V0QnVmZmVyIGFuZCBpcworICAvLy8gbWFuYWdlZCBieSB0aGUgc3ViY2xhc3MuCisgIC8vLworICAvLy8gSWYgYSBzdWJjbGFzcyBpbnN0YWxscyBhbiBleHRlcm5hbCBidWZmZXIgdXNpbmcgU2V0QnVmZmVyIHRoZW4gaXQgY2FuIHdhaXQKKyAgLy8vIGZvciBhIFxzZWUgd3JpdGVfaW1wbCgpIGNhbGwgdG8gaGFuZGxlIHRoZSBkYXRhIHdoaWNoIGhhcyBiZWVuIHB1dCBpbnRvCisgIC8vLyB0aGlzIGJ1ZmZlci4KKyAgY2hhciAqT3V0QnVmU3RhcnQsICpPdXRCdWZFbmQsICpPdXRCdWZDdXI7CisKKyAgZW51bSBCdWZmZXJLaW5kIHsKKyAgICBVbmJ1ZmZlcmVkID0gMCwKKyAgICBJbnRlcm5hbEJ1ZmZlciwKKyAgICBFeHRlcm5hbEJ1ZmZlcgorICB9IEJ1ZmZlck1vZGU7CisKK3B1YmxpYzoKKyAgLy8gY29sb3Igb3JkZXIgbWF0Y2hlcyBBTlNJIGVzY2FwZSBzZXF1ZW5jZSwgZG9uJ3QgY2hhbmdlCisgIGVudW0gQ29sb3JzIHsKKyAgICBCTEFDSyA9IDAsCisgICAgUkVELAorICAgIEdSRUVOLAorICAgIFlFTExPVywKKyAgICBCTFVFLAorICAgIE1BR0VOVEEsCisgICAgQ1lBTiwKKyAgICBXSElURSwKKyAgICBTQVZFRENPTE9SCisgIH07CisKKyAgZXhwbGljaXQgcmF3X29zdHJlYW0oYm9vbCB1bmJ1ZmZlcmVkID0gZmFsc2UpCisgICAgICA6IEJ1ZmZlck1vZGUodW5idWZmZXJlZCA/IFVuYnVmZmVyZWQgOiBJbnRlcm5hbEJ1ZmZlcikgeworICAgIC8vIFN0YXJ0IG91dCByZWFkeSB0byBmbHVzaC4KKyAgICBPdXRCdWZTdGFydCA9IE91dEJ1ZkVuZCA9IE91dEJ1ZkN1ciA9IG51bGxwdHI7CisgIH0KKworICByYXdfb3N0cmVhbShjb25zdCByYXdfb3N0cmVhbSAmKSA9IGRlbGV0ZTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgcmF3X29zdHJlYW0gJikgPSBkZWxldGU7CisKKyAgdmlydHVhbCB+cmF3X29zdHJlYW0oKTsKKworICAvLy8gdGVsbCAtIFJldHVybiB0aGUgY3VycmVudCBvZmZzZXQgd2l0aCB0aGUgZmlsZS4KKyAgdWludDY0X3QgdGVsbCgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfcG9zKCkgKyBHZXROdW1CeXRlc0luQnVmZmVyKCk7IH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQ29uZmlndXJhdGlvbiBJbnRlcmZhY2UKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFNldCB0aGUgc3RyZWFtIHRvIGJlIGJ1ZmZlcmVkLCB3aXRoIGFuIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBidWZmZXIKKyAgLy8vIHNpemUuCisgIHZvaWQgU2V0QnVmZmVyZWQoKTsKKworICAvLy8gU2V0IHRoZSBzdHJlYW0gdG8gYmUgYnVmZmVyZWQsIHVzaW5nIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHNpemUuCisgIHZvaWQgU2V0QnVmZmVyU2l6ZShzaXplX3QgU2l6ZSkgeworICAgIGZsdXNoKCk7CisgICAgU2V0QnVmZmVyQW5kTW9kZShuZXcgY2hhcltTaXplXSwgU2l6ZSwgSW50ZXJuYWxCdWZmZXIpOworICB9CisKKyAgc2l6ZV90IEdldEJ1ZmZlclNpemUoKSBjb25zdCB7CisgICAgLy8gSWYgd2UncmUgc3VwcG9zZWQgdG8gYmUgYnVmZmVyZWQgYnV0IGhhdmVuJ3QgYWN0dWFsbHkgZ290dGVuIGFyb3VuZAorICAgIC8vIHRvIGFsbG9jYXRpbmcgdGhlIGJ1ZmZlciB5ZXQsIHJldHVybiB0aGUgdmFsdWUgdGhhdCB3b3VsZCBiZSB1c2VkLgorICAgIGlmIChCdWZmZXJNb2RlICE9IFVuYnVmZmVyZWQgJiYgT3V0QnVmU3RhcnQgPT0gbnVsbHB0cikKKyAgICAgIHJldHVybiBwcmVmZXJyZWRfYnVmZmVyX3NpemUoKTsKKworICAgIC8vIE90aGVyd2lzZSBqdXN0IHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICByZXR1cm4gT3V0QnVmRW5kIC0gT3V0QnVmU3RhcnQ7CisgIH0KKworICAvLy8gU2V0IHRoZSBzdHJlYW0gdG8gYmUgdW5idWZmZXJlZC4gV2hlbiB1bmJ1ZmZlcmVkLCB0aGUgc3RyZWFtIHdpbGwgZmx1c2gKKyAgLy8vIGFmdGVyIGV2ZXJ5IHdyaXRlLiBUaGlzIHJvdXRpbmUgd2lsbCBhbHNvIGZsdXNoIHRoZSBidWZmZXIgaW1tZWRpYXRlbHkKKyAgLy8vIHdoZW4gdGhlIHN0cmVhbSBpcyBiZWluZyBzZXQgdG8gdW5idWZmZXJlZC4KKyAgdm9pZCBTZXRVbmJ1ZmZlcmVkKCkgeworICAgIGZsdXNoKCk7CisgICAgU2V0QnVmZmVyQW5kTW9kZShudWxscHRyLCAwLCBVbmJ1ZmZlcmVkKTsKKyAgfQorCisgIHNpemVfdCBHZXROdW1CeXRlc0luQnVmZmVyKCkgY29uc3QgeworICAgIHJldHVybiBPdXRCdWZDdXIgLSBPdXRCdWZTdGFydDsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBEYXRhIE91dHB1dCBJbnRlcmZhY2UKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgdm9pZCBmbHVzaCgpIHsKKyAgICBpZiAoT3V0QnVmQ3VyICE9IE91dEJ1ZlN0YXJ0KQorICAgICAgZmx1c2hfbm9uZW1wdHkoKTsKKyAgfQorCisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGNoYXIgQykgeworICAgIGlmIChPdXRCdWZDdXIgPj0gT3V0QnVmRW5kKQorICAgICAgcmV0dXJuIHdyaXRlKEMpOworICAgICpPdXRCdWZDdXIrKyA9IEM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwodW5zaWduZWQgY2hhciBDKSB7CisgICAgaWYgKE91dEJ1ZkN1ciA+PSBPdXRCdWZFbmQpCisgICAgICByZXR1cm4gd3JpdGUoQyk7CisgICAgKk91dEJ1ZkN1cisrID0gQzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChzaWduZWQgY2hhciBDKSB7CisgICAgaWYgKE91dEJ1ZkN1ciA+PSBPdXRCdWZFbmQpCisgICAgICByZXR1cm4gd3JpdGUoQyk7CisgICAgKk91dEJ1ZkN1cisrID0gQzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChTdHJpbmdSZWYgU3RyKSB7CisgICAgLy8gSW5saW5lIGZhc3QgcGF0aCwgcGFydGljdWxhcmx5IGZvciBzdHJpbmdzIHdpdGggYSBrbm93biBsZW5ndGguCisgICAgc2l6ZV90IFNpemUgPSBTdHIuc2l6ZSgpOworCisgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiB1c2UgdGhlIGZhc3QgcGF0aC4KKyAgICBpZiAoU2l6ZSA+IChzaXplX3QpKE91dEJ1ZkVuZCAtIE91dEJ1ZkN1cikpCisgICAgICByZXR1cm4gd3JpdGUoU3RyLmRhdGEoKSwgU2l6ZSk7CisKKyAgICBpZiAoU2l6ZSkgeworICAgICAgbWVtY3B5KE91dEJ1ZkN1ciwgU3RyLmRhdGEoKSwgU2l6ZSk7CisgICAgICBPdXRCdWZDdXIgKz0gU2l6ZTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoY29uc3QgY2hhciAqU3RyKSB7CisgICAgLy8gSW5saW5lIGZhc3QgcGF0aCwgcGFydGljdWxhcmx5IGZvciBjb25zdGFudCBzdHJpbmdzIHdoZXJlIGEgc3VmZmljaWVudGx5CisgICAgLy8gc21hcnQgY29tcGlsZXIgd2lsbCBzaW1wbGlmeSBzdHJsZW4uCisKKyAgICByZXR1cm4gdGhpcy0+b3BlcmF0b3I8PChTdHJpbmdSZWYoU3RyKSk7CisgIH0KKworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChjb25zdCBzdGQ6OnN0cmluZyAmU3RyKSB7CisgICAgLy8gQXZvaWQgdGhlIGZhc3QgcGF0aCwgaXQgd291bGQgb25seSBpbmNyZWFzZSBjb2RlIHNpemUgZm9yIGEgbWFyZ2luYWwgd2luLgorICAgIHJldHVybiB3cml0ZShTdHIuZGF0YSgpLCBTdHIubGVuZ3RoKCkpOworICB9CisKKyAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoY29uc3QgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZTdHIpIHsKKyAgICByZXR1cm4gd3JpdGUoU3RyLmRhdGEoKSwgU3RyLnNpemUoKSk7CisgIH0KKworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIE4pOworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChsb25nIE4pOworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIGxvbmcgTik7CisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGxvbmcgbG9uZyBOKTsKKyAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoY29uc3Qgdm9pZCAqUCk7CisKKyAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwodW5zaWduZWQgaW50IE4pIHsKKyAgICByZXR1cm4gdGhpcy0+b3BlcmF0b3I8PChzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihOKSk7CisgIH0KKworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChpbnQgTikgeworICAgIHJldHVybiB0aGlzLT5vcGVyYXRvcjw8KHN0YXRpY19jYXN0PGxvbmc+KE4pKTsKKyAgfQorCisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGRvdWJsZSBOKTsKKworICAvLy8gT3V0cHV0IFxwIE4gaW4gaGV4YWRlY2ltYWwsIHdpdGhvdXQgYW55IHByZWZpeCBvciBwYWRkaW5nLgorICByYXdfb3N0cmVhbSAmd3JpdGVfaGV4KHVuc2lnbmVkIGxvbmcgbG9uZyBOKTsKKworICAvLy8gT3V0cHV0IGEgZm9ybWF0dGVkIFVVSUQgd2l0aCBkYXNoIHNlcGFyYXRvcnMuCisgIHVzaW5nIHV1aWRfdCA9IHVpbnQ4X3RbMTZdOworICByYXdfb3N0cmVhbSAmd3JpdGVfdXVpZChjb25zdCB1dWlkX3QgVVVJRCk7CisKKyAgLy8vIE91dHB1dCBccCBTdHIsIHR1cm5pbmcgJ1xcJywgJ1x0JywgJ1xuJywgJyInLCBhbmQgYW55dGhpbmcgdGhhdCBkb2Vzbid0CisgIC8vLyBzYXRpc2Z5IHN0ZDo6aXNwcmludCBpbnRvIGFuIGVzY2FwZSBzZXF1ZW5jZS4KKyAgcmF3X29zdHJlYW0gJndyaXRlX2VzY2FwZWQoU3RyaW5nUmVmIFN0ciwgYm9vbCBVc2VIZXhFc2NhcGVzID0gZmFsc2UpOworCisgIHJhd19vc3RyZWFtICZ3cml0ZSh1bnNpZ25lZCBjaGFyIEMpOworICByYXdfb3N0cmVhbSAmd3JpdGUoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSk7CisKKyAgLy8gRm9ybWF0dGVkIG91dHB1dCwgc2VlIHRoZSBmb3JtYXQoKSBmdW5jdGlvbiBpbiBTdXBwb3J0L0Zvcm1hdC5oLgorICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChjb25zdCBmb3JtYXRfb2JqZWN0X2Jhc2UgJkZtdCk7CisKKyAgLy8gRm9ybWF0dGVkIG91dHB1dCwgc2VlIHRoZSBsZWZ0SnVzdGlmeSgpIGZ1bmN0aW9uIGluIFN1cHBvcnQvRm9ybWF0LmguCisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGNvbnN0IEZvcm1hdHRlZFN0cmluZyAmKTsKKworICAvLyBGb3JtYXR0ZWQgb3V0cHV0LCBzZWUgdGhlIGZvcm1hdEhleCgpIGZ1bmN0aW9uIGluIFN1cHBvcnQvRm9ybWF0LmguCisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGNvbnN0IEZvcm1hdHRlZE51bWJlciAmKTsKKworICAvLyBGb3JtYXR0ZWQgb3V0cHV0LCBzZWUgdGhlIGZvcm1hdHYoKSBmdW5jdGlvbiBpbiBTdXBwb3J0L0Zvcm1hdFZhcmlhZGljLmguCisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGNvbnN0IGZvcm1hdHZfb2JqZWN0X2Jhc2UgJik7CisKKyAgLy8gRm9ybWF0dGVkIG91dHB1dCwgc2VlIHRoZSBmb3JtYXRfYnl0ZXMoKSBmdW5jdGlvbiBpbiBTdXBwb3J0L0Zvcm1hdC5oLgorICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChjb25zdCBGb3JtYXR0ZWRCeXRlcyAmKTsKKworICAvLy8gaW5kZW50IC0gSW5zZXJ0ICdOdW1TcGFjZXMnIHNwYWNlcy4KKyAgcmF3X29zdHJlYW0gJmluZGVudCh1bnNpZ25lZCBOdW1TcGFjZXMpOworCisgIC8vLyBDaGFuZ2VzIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIG9mIHRleHQgdGhhdCB3aWxsIGJlIG91dHB1dCBmcm9tIHRoaXMgcG9pbnQKKyAgLy8vIGZvcndhcmQuCisgIC8vLyBAcGFyYW0gQ29sb3IgQU5TSSBjb2xvciB0byB1c2UsIHRoZSBzcGVjaWFsIFNBVkVEQ09MT1IgY2FuIGJlIHVzZWQgdG8KKyAgLy8vIGNoYW5nZSBvbmx5IHRoZSBib2xkIGF0dHJpYnV0ZSwgYW5kIGtlZXAgY29sb3JzIHVudG91Y2hlZAorICAvLy8gQHBhcmFtIEJvbGQgYm9sZC9icmlnaHRlciB0ZXh0LCBkZWZhdWx0IGZhbHNlCisgIC8vLyBAcGFyYW0gQkcgaWYgdHJ1ZSBjaGFuZ2UgdGhlIGJhY2tncm91bmQsIGRlZmF1bHQ6IGNoYW5nZSBmb3JlZ3JvdW5kCisgIC8vLyBAcmV0dXJucyBpdHNlbGYgc28gaXQgY2FuIGJlIHVzZWQgd2l0aGluIDw8IGludm9jYXRpb25zCisgIHZpcnR1YWwgcmF3X29zdHJlYW0gJmNoYW5nZUNvbG9yKGVudW0gQ29sb3JzIENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEJvbGQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBCRyA9IGZhbHNlKSB7CisgICAgKHZvaWQpQ29sb3I7CisgICAgKHZvaWQpQm9sZDsKKyAgICAodm9pZClCRzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gUmVzZXRzIHRoZSBjb2xvcnMgdG8gdGVybWluYWwgZGVmYXVsdHMuIENhbGwgdGhpcyB3aGVuIHlvdSBhcmUgZG9uZQorICAvLy8gb3V0cHV0dGluZyBjb2xvcmVkIHRleHQsIG9yIGJlZm9yZSBwcm9ncmFtIGV4aXQuCisgIHZpcnR1YWwgcmF3X29zdHJlYW0gJnJlc2V0Q29sb3IoKSB7IHJldHVybiAqdGhpczsgfQorCisgIC8vLyBSZXZlcnNlcyB0aGUgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMuCisgIHZpcnR1YWwgcmF3X29zdHJlYW0gJnJldmVyc2VDb2xvcigpIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGlzIHN0cmVhbSBpcyBjb25uZWN0ZWQgdG8gYSAidHR5IiBvcgorICAvLy8gImNvbnNvbGUiIHdpbmRvdy4gVGhhdCBpcywgdGhlIG91dHB1dCB3b3VsZCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIKKyAgLy8vIHJhdGhlciB0aGFuIGJlaW5nIHB1dCBvbiBhIHBpcGUgb3Igc3RvcmVkIGluIGEgZmlsZS4KKyAgdmlydHVhbCBib29sIGlzX2Rpc3BsYXllZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGlzIHN0cmVhbSBpcyBkaXNwbGF5ZWQgYW5kIHN1cHBvcnRzIGNvbG9ycy4KKyAgdmlydHVhbCBib29sIGhhc19jb2xvcnMoKSBjb25zdCB7IHJldHVybiBpc19kaXNwbGF5ZWQoKTsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBTdWJjbGFzcyBJbnRlcmZhY2UKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ByaXZhdGU6CisgIC8vLyBUaGUgaXMgdGhlIHBpZWNlIG9mIHRoZSBjbGFzcyB0aGF0IGlzIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuICBUaGlzCisgIC8vLyB3cml0ZXMgdGhlIFxwIFNpemUgYnl0ZXMgc3RhcnRpbmcgYXQKKyAgLy8vIFxwIFB0ciB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIG9ubHkgYmUgY2FsbGVkIGF0IGEgcG9pbnQgYXQgd2hpY2ggaXQgaXMKKyAgLy8vIHNhZmUgZm9yIHRoZSBzdWJjbGFzcyB0byBpbnN0YWxsIGEgbmV3IGJ1ZmZlciB2aWEgU2V0QnVmZmVyLgorICAvLy8KKyAgLy8vIFxwYXJhbSBQdHIgVGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4uIEZvciBidWZmZXJlZCBzdHJlYW1zIHRoaXMKKyAgLy8vIGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIuCisgIC8vLworICAvLy8gXHBhcmFtIFNpemUgVGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuLgorICAvLy8KKyAgLy8vIFxpbnZhcmlhbnQgeyBTaXplID4gMCB9CisgIHZpcnR1YWwgdm9pZCB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpID0gMDsKKworICAvLyBBbiBvdXQgb2YgbGluZSB2aXJ0dWFsIG1ldGhvZCB0byBwcm92aWRlIGEgaG9tZSBmb3IgdGhlIGNsYXNzIHZ0YWJsZS4KKyAgdmlydHVhbCB2b2lkIGhhbmRsZSgpOworCisgIC8vLyBSZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBzdHJlYW0sIG5vdCBjb3VudGluZyB0aGUgYnl0ZXMKKyAgLy8vIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyLgorICB2aXJ0dWFsIHVpbnQ2NF90IGN1cnJlbnRfcG9zKCkgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgIC8vLyBVc2UgdGhlIHByb3ZpZGVkIGJ1ZmZlciBhcyB0aGUgcmF3X29zdHJlYW0gYnVmZmVyLiBUaGlzIGlzIGludGVuZGVkIGZvcgorICAvLy8gdXNlIG9ubHkgYnkgc3ViY2xhc3NlcyB3aGljaCBjYW4gYXJyYW5nZSBmb3IgdGhlIG91dHB1dCB0byBnbyBkaXJlY3RseQorICAvLy8gaW50byB0aGUgZGVzaXJlZCBvdXRwdXQgYnVmZmVyLCBpbnN0ZWFkIG9mIGJlaW5nIGNvcGllZCBvbiBlYWNoIGZsdXNoLgorICB2b2lkIFNldEJ1ZmZlcihjaGFyICpCdWZmZXJTdGFydCwgc2l6ZV90IFNpemUpIHsKKyAgICBTZXRCdWZmZXJBbmRNb2RlKEJ1ZmZlclN0YXJ0LCBTaXplLCBFeHRlcm5hbEJ1ZmZlcik7CisgIH0KKworICAvLy8gUmV0dXJuIGFuIGVmZmljaWVudCBidWZmZXIgc2l6ZSBmb3IgdGhlIHVuZGVybHlpbmcgb3V0cHV0IG1lY2hhbmlzbS4KKyAgdmlydHVhbCBzaXplX3QgcHJlZmVycmVkX2J1ZmZlcl9zaXplKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IHN0cmVhbSBidWZmZXIsIG9yIDAgaWYgdGhlIHN0cmVhbSBpcworICAvLy8gdW5idWZmZXJlZC4KKyAgY29uc3QgY2hhciAqZ2V0QnVmZmVyU3RhcnQoKSBjb25zdCB7IHJldHVybiBPdXRCdWZTdGFydDsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBQcml2YXRlIEludGVyZmFjZQorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK3ByaXZhdGU6CisgIC8vLyBJbnN0YWxsIHRoZSBnaXZlbiBidWZmZXIgYW5kIG1vZGUuCisgIHZvaWQgU2V0QnVmZmVyQW5kTW9kZShjaGFyICpCdWZmZXJTdGFydCwgc2l6ZV90IFNpemUsIEJ1ZmZlcktpbmQgTW9kZSk7CisKKyAgLy8vIEZsdXNoIHRoZSBjdXJyZW50IGJ1ZmZlciwgd2hpY2ggaXMga25vd24gdG8gYmUgbm9uLWVtcHR5LiBUaGlzIG91dHB1dHMgdGhlCisgIC8vLyBjdXJyZW50bHkgYnVmZmVyZWQgZGF0YSBhbmQgcmVzZXRzIHRoZSBidWZmZXIgdG8gZW1wdHkuCisgIHZvaWQgZmx1c2hfbm9uZW1wdHkoKTsKKworICAvLy8gQ29weSBkYXRhIGludG8gdGhlIGJ1ZmZlci4gU2l6ZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZgorICAvLy8gdW51c2VkIGJ5dGVzIGluIHRoZSBidWZmZXIuCisgIHZvaWQgY29weV90b19idWZmZXIoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSk7Cit9OworCisvLy8gQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igc3RyZWFtcyBpbXBsZW1lbnRhdGlvbnMgdGhhdCBhbHNvIHN1cHBvcnQgYQorLy8vIHB3cml0ZSBvcGVyYXRpb24uIFRoaXMgaXMgdXNlZnVsIGZvciBjb2RlIHRoYXQgY2FuIG1vc3RseSBzdHJlYW0gb3V0IGRhdGEsCisvLy8gYnV0IG5lZWRzIHRvIHBhdGNoIGluIGEgaGVhZGVyIHRoYXQgbmVlZHMgdG8ga25vdyB0aGUgb3V0cHV0IHNpemUuCitjbGFzcyByYXdfcHdyaXRlX3N0cmVhbSA6IHB1YmxpYyByYXdfb3N0cmVhbSB7CisgIHZpcnR1YWwgdm9pZCBwd3JpdGVfaW1wbChjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplLCB1aW50NjRfdCBPZmZzZXQpID0gMDsKKworcHVibGljOgorICBleHBsaWNpdCByYXdfcHdyaXRlX3N0cmVhbShib29sIFVuYnVmZmVyZWQgPSBmYWxzZSkKKyAgICAgIDogcmF3X29zdHJlYW0oVW5idWZmZXJlZCkge30KKyAgdm9pZCBwd3JpdGUoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSwgdWludDY0X3QgT2Zmc2V0KSB7CisjaWZuZGVmIE5EQkVCVUcKKyAgICB1aW50NjRfdCBQb3MgPSB0ZWxsKCk7CisgICAgLy8gL2Rldi9udWxsIGFsd2F5cyByZXBvcnRzIGEgcG9zIG9mIDAsIHNvIHdlIGNhbm5vdCBwZXJmb3JtIHRoaXMgY2hlY2sKKyAgICAvLyBpbiB0aGF0IGNhc2UuCisgICAgaWYgKFBvcykKKyAgICAgIGFzc2VydChTaXplICsgT2Zmc2V0IDw9IFBvcyAmJiAiV2UgZG9uJ3Qgc3VwcG9ydCBleHRlbmRpbmcgdGhlIHN0cmVhbSIpOworI2VuZGlmCisgICAgcHdyaXRlX2ltcGwoUHRyLCBTaXplLCBPZmZzZXQpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRmlsZSBPdXRwdXQgU3RyZWFtcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEEgcmF3X29zdHJlYW0gdGhhdCB3cml0ZXMgdG8gYSBmaWxlIGRlc2NyaXB0b3IuCisvLy8KK2NsYXNzIHJhd19mZF9vc3RyZWFtIDogcHVibGljIHJhd19wd3JpdGVfc3RyZWFtIHsKKyAgaW50IEZEOworICBib29sIFNob3VsZENsb3NlOworCisgIHN0ZDo6ZXJyb3JfY29kZSBFQzsKKworICB1aW50NjRfdCBwb3M7CisKKyAgYm9vbCBTdXBwb3J0c1NlZWtpbmc7CisKKyAgLy8vIFNlZSByYXdfb3N0cmVhbTo6d3JpdGVfaW1wbC4KKyAgdm9pZCB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpIG92ZXJyaWRlOworCisgIHZvaWQgcHdyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSwgdWludDY0X3QgT2Zmc2V0KSBvdmVycmlkZTsKKworICAvLy8gUmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc3RyZWFtLCBub3QgY291bnRpbmcgdGhlIGJ5dGVzCisgIC8vLyBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlci4KKyAgdWludDY0X3QgY3VycmVudF9wb3MoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBwb3M7IH0KKworICAvLy8gRGV0ZXJtaW5lIGFuIGVmZmljaWVudCBidWZmZXIgc2l6ZS4KKyAgc2l6ZV90IHByZWZlcnJlZF9idWZmZXJfc2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vLyBTZXQgdGhlIGZsYWcgaW5kaWNhdGluZyB0aGF0IGFuIG91dHB1dCBlcnJvciBoYXMgYmVlbiBlbmNvdW50ZXJlZC4KKyAgdm9pZCBlcnJvcl9kZXRlY3RlZChzdGQ6OmVycm9yX2NvZGUgRUMpIHsgdGhpcy0+RUMgPSBFQzsgfQorCitwdWJsaWM6CisgIC8vLyBPcGVuIHRoZSBzcGVjaWZpZWQgZmlsZSBmb3Igd3JpdGluZy4gSWYgYW4gZXJyb3Igb2NjdXJzLCBpbmZvcm1hdGlvbgorICAvLy8gYWJvdXQgdGhlIGVycm9yIGlzIHB1dCBpbnRvIEVDLCBhbmQgdGhlIHN0cmVhbSBzaG91bGQgYmUgaW1tZWRpYXRlbHkKKyAgLy8vIGRlc3Ryb3llZDsKKyAgLy8vIFxwIEZsYWdzIGFsbG93cyBvcHRpb25hbCBmbGFncyB0byBjb250cm9sIGhvdyB0aGUgZmlsZSB3aWxsIGJlIG9wZW5lZC4KKyAgLy8vCisgIC8vLyBBcyBhIHNwZWNpYWwgY2FzZSwgaWYgRmlsZW5hbWUgaXMgIi0iLCB0aGVuIHRoZSBzdHJlYW0gd2lsbCB1c2UKKyAgLy8vIFNURE9VVF9GSUxFTk8gaW5zdGVhZCBvZiBvcGVuaW5nIGEgZmlsZS4gVGhpcyB3aWxsIG5vdCBjbG9zZSB0aGUgc3Rkb3V0CisgIC8vLyBkZXNjcmlwdG9yLgorICByYXdfZmRfb3N0cmVhbShTdHJpbmdSZWYgRmlsZW5hbWUsIHN0ZDo6ZXJyb3JfY29kZSAmRUMsCisgICAgICAgICAgICAgICAgIHN5czo6ZnM6Ok9wZW5GbGFncyBGbGFncyk7CisKKyAgLy8vIEZEIGlzIHRoZSBmaWxlIGRlc2NyaXB0b3IgdGhhdCB0aGlzIHdyaXRlcyB0by4gIElmIFNob3VsZENsb3NlIGlzIHRydWUsCisgIC8vLyB0aGlzIGNsb3NlcyB0aGUgZmlsZSB3aGVuIHRoZSBzdHJlYW0gaXMgZGVzdHJveWVkLiBJZiBGRCBpcyBmb3Igc3Rkb3V0IG9yCisgIC8vLyBzdGRlcnIsIGl0IHdpbGwgbm90IGJlIGNsb3NlZC4KKyAgcmF3X2ZkX29zdHJlYW0oaW50IGZkLCBib29sIHNob3VsZENsb3NlLCBib29sIHVuYnVmZmVyZWQ9ZmFsc2UpOworCisgIH5yYXdfZmRfb3N0cmVhbSgpIG92ZXJyaWRlOworCisgIC8vLyBNYW51YWxseSBmbHVzaCB0aGUgc3RyZWFtIGFuZCBjbG9zZSB0aGUgZmlsZS4gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgY2FsbAorICAvLy8gZnN5bmMuCisgIHZvaWQgY2xvc2UoKTsKKworICBib29sIHN1cHBvcnRzU2Vla2luZygpIHsgcmV0dXJuIFN1cHBvcnRzU2Vla2luZzsgfQorCisgIC8vLyBGbHVzaGVzIHRoZSBzdHJlYW0gYW5kIHJlcG9zaXRpb25zIHRoZSB1bmRlcmx5aW5nIGZpbGUgZGVzY3JpcHRvciBwb3NpdGlvbgorICAvLy8gdG8gdGhlIG9mZnNldCBzcGVjaWZpZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorICB1aW50NjRfdCBzZWVrKHVpbnQ2NF90IG9mZik7CisKKyAgcmF3X29zdHJlYW0gJmNoYW5nZUNvbG9yKGVudW0gQ29sb3JzIGNvbG9ycywgYm9vbCBib2xkPWZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiZz1mYWxzZSkgb3ZlcnJpZGU7CisgIHJhd19vc3RyZWFtICZyZXNldENvbG9yKCkgb3ZlcnJpZGU7CisKKyAgcmF3X29zdHJlYW0gJnJldmVyc2VDb2xvcigpIG92ZXJyaWRlOworCisgIGJvb2wgaXNfZGlzcGxheWVkKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBoYXNfY29sb3JzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjplcnJvcl9jb2RlIGVycm9yKCkgY29uc3QgeyByZXR1cm4gRUM7IH0KKworICAvLy8gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiB0aGlzIHJhd19mZF9vc3RyZWFtIGluZGljYXRpbmcgd2hldGhlciBhbgorICAvLy8gb3V0cHV0IGVycm9yIGhhcyBiZWVuIGVuY291bnRlcmVkLgorICAvLy8gVGhpcyBkb2Vzbid0IGltcGxpY2l0bHkgZmx1c2ggYW55IHBlbmRpbmcgb3V0cHV0LiAgQWxzbywgaXQgZG9lc24ndAorICAvLy8gZ3VhcmFudGVlIHRvIGRldGVjdCBhbGwgZXJyb3JzIHVubGVzcyB0aGUgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZC4KKyAgYm9vbCBoYXNfZXJyb3IoKSBjb25zdCB7IHJldHVybiBib29sKEVDKTsgfQorCisgIC8vLyBTZXQgdGhlIGZsYWcgcmVhZCBieSBoYXNfZXJyb3IoKSB0byBmYWxzZS4gSWYgdGhlIGVycm9yIGZsYWcgaXMgc2V0IGF0IHRoZQorICAvLy8gdGltZSB3aGVuIHRoaXMgcmF3X29zdHJlYW0ncyBkZXN0cnVjdG9yIGlzIGNhbGxlZCwgcmVwb3J0X2ZhdGFsX2Vycm9yIGlzCisgIC8vLyBjYWxsZWQgdG8gcmVwb3J0IHRoZSBlcnJvci4gVXNlIGNsZWFyX2Vycm9yKCkgYWZ0ZXIgaGFuZGxpbmcgdGhlIGVycm9yIHRvCisgIC8vLyBhdm9pZCB0aGlzIGJlaGF2aW9yLgorICAvLy8KKyAgLy8vICAgIkVycm9ycyBzaG91bGQgbmV2ZXIgcGFzcyBzaWxlbnRseS4KKyAgLy8vICAgIFVubGVzcyBleHBsaWNpdGx5IHNpbGVuY2VkLiIKKyAgLy8vICAgICAgLSBmcm9tIFRoZSBaZW4gb2YgUHl0aG9uLCBieSBUaW0gUGV0ZXJzCisgIC8vLworICB2b2lkIGNsZWFyX2Vycm9yKCkgeyBFQyA9IHN0ZDo6ZXJyb3JfY29kZSgpOyB9Cit9OworCisvLy8gVGhpcyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgcmF3X29zdHJlYW0gZm9yIHN0YW5kYXJkIG91dHB1dC4gVXNlIGl0IGxpa2U6CisvLy8gb3V0cygpIDw8ICJmb28iIDw8ICJiYXIiOworcmF3X29zdHJlYW0gJm91dHMoKTsKKworLy8vIFRoaXMgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIHJhd19vc3RyZWFtIGZvciBzdGFuZGFyZCBlcnJvci4gVXNlIGl0IGxpa2U6CisvLy8gZXJycygpIDw8ICJmb28iIDw8ICJiYXIiOworcmF3X29zdHJlYW0gJmVycnMoKTsKKworLy8vIFRoaXMgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIHJhd19vc3RyZWFtIHdoaWNoIHNpbXBseSBkaXNjYXJkcyBvdXRwdXQuCityYXdfb3N0cmVhbSAmbnVsbHMoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE91dHB1dCBTdHJlYW0gQWRhcHRvcnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBBIHJhd19vc3RyZWFtIHRoYXQgd3JpdGVzIHRvIGFuIHN0ZDo6c3RyaW5nLiAgVGhpcyBpcyBhIHNpbXBsZSBhZGFwdG9yCisvLy8gY2xhc3MuIFRoaXMgY2xhc3MgZG9lcyBub3QgZW5jb3VudGVyIG91dHB1dCBlcnJvcnMuCitjbGFzcyByYXdfc3RyaW5nX29zdHJlYW0gOiBwdWJsaWMgcmF3X29zdHJlYW0geworICBzdGQ6OnN0cmluZyAmT1M7CisKKyAgLy8vIFNlZSByYXdfb3N0cmVhbTo6d3JpdGVfaW1wbC4KKyAgdm9pZCB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpIG92ZXJyaWRlOworCisgIC8vLyBSZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBzdHJlYW0sIG5vdCBjb3VudGluZyB0aGUgYnl0ZXMKKyAgLy8vIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyLgorICB1aW50NjRfdCBjdXJyZW50X3BvcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIE9TLnNpemUoKTsgfQorCitwdWJsaWM6CisgIGV4cGxpY2l0IHJhd19zdHJpbmdfb3N0cmVhbShzdGQ6OnN0cmluZyAmTykgOiBPUyhPKSB7fQorICB+cmF3X3N0cmluZ19vc3RyZWFtKCkgb3ZlcnJpZGU7CisKKyAgLy8vIEZsdXNoZXMgdGhlIHN0cmVhbSBjb250ZW50cyB0byB0aGUgdGFyZ2V0IHN0cmluZyBhbmQgcmV0dXJucyAgdGhlIHN0cmluZydzCisgIC8vLyByZWZlcmVuY2UuCisgIHN0ZDo6c3RyaW5nJiBzdHIoKSB7CisgICAgZmx1c2goKTsKKyAgICByZXR1cm4gT1M7CisgIH0KK307CisKKy8vLyBBIHJhd19vc3RyZWFtIHRoYXQgd3JpdGVzIHRvIGFuIFNtYWxsVmVjdG9yIG9yIFNtYWxsU3RyaW5nLiAgVGhpcyBpcyBhCisvLy8gc2ltcGxlIGFkYXB0b3IgY2xhc3MuIFRoaXMgY2xhc3MgZG9lcyBub3QgZW5jb3VudGVyIG91dHB1dCBlcnJvcnMuCisvLy8gcmF3X3N2ZWN0b3Jfb3N0cmVhbSBvcGVyYXRlcyB3aXRob3V0IGEgYnVmZmVyLCBkZWxlZ2F0aW5nIGFsbCBtZW1vcnkKKy8vLyBtYW5hZ2VtZW50IHRvIHRoZSBTbWFsbFN0cmluZy4gVGh1cyB0aGUgU21hbGxTdHJpbmcgaXMgYWx3YXlzIHVwLXRvLWRhdGUsCisvLy8gbWF5IGJlIHVzZWQgZGlyZWN0bHkgYW5kIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsbCBmbHVzaCgpLgorY2xhc3MgcmF3X3N2ZWN0b3Jfb3N0cmVhbSA6IHB1YmxpYyByYXdfcHdyaXRlX3N0cmVhbSB7CisgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmT1M7CisKKyAgLy8vIFNlZSByYXdfb3N0cmVhbTo6d3JpdGVfaW1wbC4KKyAgdm9pZCB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpIG92ZXJyaWRlOworCisgIHZvaWQgcHdyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSwgdWludDY0X3QgT2Zmc2V0KSBvdmVycmlkZTsKKworICAvLy8gUmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc3RyZWFtLgorICB1aW50NjRfdCBjdXJyZW50X3BvcygpIGNvbnN0IG92ZXJyaWRlOworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3QgYSBuZXcgcmF3X3N2ZWN0b3Jfb3N0cmVhbS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTyBUaGUgdmVjdG9yIHRvIHdyaXRlIHRvOyB0aGlzIHNob3VsZCBnZW5lcmFsbHkgaGF2ZSBhdCBsZWFzdCAxMjgKKyAgLy8vIGJ5dGVzIGZyZWUgdG8gYXZvaWQgYW55IGV4dHJhbmVvdXMgbWVtb3J5IG92ZXJoZWFkLgorICBleHBsaWNpdCByYXdfc3ZlY3Rvcl9vc3RyZWFtKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmTykgOiBPUyhPKSB7CisgICAgU2V0VW5idWZmZXJlZCgpOworICB9CisKKyAgfnJhd19zdmVjdG9yX29zdHJlYW0oKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBmbHVzaCgpID0gZGVsZXRlOworCisgIC8vLyBSZXR1cm4gYSBTdHJpbmdSZWYgZm9yIHRoZSB2ZWN0b3IgY29udGVudHMuCisgIFN0cmluZ1JlZiBzdHIoKSB7IHJldHVybiBTdHJpbmdSZWYoT1MuZGF0YSgpLCBPUy5zaXplKCkpOyB9Cit9OworCisvLy8gQSByYXdfb3N0cmVhbSB0aGF0IGRpc2NhcmRzIGFsbCBvdXRwdXQuCitjbGFzcyByYXdfbnVsbF9vc3RyZWFtIDogcHVibGljIHJhd19wd3JpdGVfc3RyZWFtIHsKKyAgLy8vIFNlZSByYXdfb3N0cmVhbTo6d3JpdGVfaW1wbC4KKyAgdm9pZCB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICB2b2lkIHB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUsIHVpbnQ2NF90IE9mZnNldCkgb3ZlcnJpZGU7CisKKyAgLy8vIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIHN0cmVhbSwgbm90IGNvdW50aW5nIHRoZSBieXRlcworICAvLy8gY3VycmVudGx5IGluIHRoZSBidWZmZXIuCisgIHVpbnQ2NF90IGN1cnJlbnRfcG9zKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgcmF3X251bGxfb3N0cmVhbSgpID0gZGVmYXVsdDsKKyAgfnJhd19udWxsX29zdHJlYW0oKSBvdmVycmlkZTsKK307CisKK2NsYXNzIGJ1ZmZlcl9vc3RyZWFtIDogcHVibGljIHJhd19zdmVjdG9yX29zdHJlYW0geworICByYXdfb3N0cmVhbSAmT1M7CisgIFNtYWxsVmVjdG9yPGNoYXIsIDA+IEJ1ZmZlcjsKKworcHVibGljOgorICBidWZmZXJfb3N0cmVhbShyYXdfb3N0cmVhbSAmT1MpIDogcmF3X3N2ZWN0b3Jfb3N0cmVhbShCdWZmZXIpLCBPUyhPUykge30KKyAgfmJ1ZmZlcl9vc3RyZWFtKCkgb3ZlcnJpZGUgeyBPUyA8PCBzdHIoKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9SQVdfT1NUUkVBTV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvcmF3X3NoYTFfb3N0cmVhbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3Jhd19zaGExX29zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDU1ZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3Jhd19zaGExX29zdHJlYW0uaApAQCAtMCwwICsxLDQ3IEBACisvLz09LSByYXdfc2hhMV9vc3RyZWFtLmggLSByYXdfb3N0cmVhbSB0aGF0IGNvbXB1dGUgU0hBMSAgICAgICAgLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcmF3X3NoYTFfb3N0cmVhbSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9SQVdfU0hBMV9PU1RSRUFNX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1JBV19TSEExX09TVFJFQU1fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU0hBMS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBIHJhd19vc3RyZWFtIHRoYXQgaGFzaCB0aGUgY29udGVudCB1c2luZyB0aGUgc2hhMSBhbGdvcml0aG0uCitjbGFzcyByYXdfc2hhMV9vc3RyZWFtIDogcHVibGljIHJhd19vc3RyZWFtIHsKKyAgU0hBMSBTdGF0ZTsKKworICAvLy8gU2VlIHJhd19vc3RyZWFtOjp3cml0ZV9pbXBsLgorICB2b2lkIHdyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSkgb3ZlcnJpZGUgeworICAgIFN0YXRlLnVwZGF0ZShBcnJheVJlZjx1aW50OF90PigoY29uc3QgdWludDhfdCAqKVB0ciwgU2l6ZSkpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFJldHVybiB0aGUgY3VycmVudCBTSEExIGhhc2ggZm9yIHRoZSBjb250ZW50IG9mIHRoZSBzdHJlYW0KKyAgU3RyaW5nUmVmIHNoYTEoKSB7CisgICAgZmx1c2goKTsKKyAgICByZXR1cm4gU3RhdGUucmVzdWx0KCk7CisgIH0KKworICAvLy8gUmVzZXQgdGhlIGludGVybmFsIHN0YXRlIHRvIHN0YXJ0IG92ZXIgZnJvbSBzY3JhdGNoLgorICB2b2lkIHJlc2V0SGFzaCgpIHsgU3RhdGUuaW5pdCgpOyB9CisKKyAgdWludDY0X3QgY3VycmVudF9wb3MoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAwOyB9Cit9OworCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC90aHJlYWQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC90aHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODdhNTEzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3RocmVhZC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L3RocmVhZC5oIC0gV3JhcHBlciBmb3IgPHRocmVhZD4gLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgaXMgYSB3cmFwcGVyIGZvciA8dGhyZWFkPiB0aGF0IHdvcmtzIGFyb3VuZCBwcm9ibGVtcyB3aXRoIHRoZQorLy8gTVNWQyBoZWFkZXJzIHdoZW4gZXhjZXB0aW9ucyBhcmUgZGlzYWJsZWQuIEl0IGFsc28gcHJvdmlkZXMgbGx2bTo6dGhyZWFkLAorLy8gd2hpY2ggaXMgZWl0aGVyIGEgdHlwZWRlZiBvZiBzdGQ6OnRocmVhZCBvciBhIHJlcGxhY2VtZW50IHRoYXQgY2FsbHMgdGhlCisvLyBmdW5jdGlvbiBzeW5jaHJvbm91c2x5IGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgTExWTV9FTkFCTEVfVEhSRUFEUy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9USFJFQURfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfVEhSRUFEX0gKKworI2luY2x1ZGUgImxsdm0vQ29uZmlnL2xsdm0tY29uZmlnLmgiCisKKyNpZiBMTFZNX0VOQUJMRV9USFJFQURTCisKKyNpbmNsdWRlIDx0aHJlYWQ+CisKK25hbWVzcGFjZSBsbHZtIHsKK3R5cGVkZWYgc3RkOjp0aHJlYWQgdGhyZWFkOworfQorCisjZWxzZSAvLyAhTExWTV9FTkFCTEVfVEhSRUFEUworCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitzdHJ1Y3QgdGhyZWFkIHsKKyAgdGhyZWFkKCkge30KKyAgdGhyZWFkKHRocmVhZCAmJm90aGVyKSB7fQorICB0ZW1wbGF0ZSA8Y2xhc3MgRnVuY3Rpb24sIGNsYXNzLi4uIEFyZ3M+CisgIGV4cGxpY2l0IHRocmVhZChGdW5jdGlvbiAmJmYsIEFyZ3MgJiYuLi4gYXJncykgeworICAgIGYoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgfQorICB0aHJlYWQoY29uc3QgdGhyZWFkICYpID0gZGVsZXRlOworCisgIHZvaWQgam9pbigpIHt9CisgIHN0YXRpYyB1bnNpZ25lZCBoYXJkd2FyZV9jb25jdXJyZW5jeSgpIHsgcmV0dXJuIDE7IH07Cit9OworCit9CisKKyNlbmRpZiAvLyBMTFZNX0VOQUJMRV9USFJFQURTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzA4NzgzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCAtIFNpbXBsZmllZCB0eXBlIHRyYWl0cyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHVzZWZ1bCBhZGRpdGlvbnMgdG8gdGhlIHN0YW5kYXJkIHR5cGVfdHJhaXRzIGxpYnJhcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfVFlQRV9UUkFJVFNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfVFlQRV9UUkFJVFNfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2lmbmRlZiBfX2hhc19mZWF0dXJlCisjZGVmaW5lIExMVk1fREVGSU5FRF9IQVNfRkVBVFVSRQorI2RlZmluZSBfX2hhc19mZWF0dXJlKHgpIDAKKyNlbmRpZgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBpc1BvZExpa2UgLSBUaGlzIGlzIGEgdHlwZSB0cmFpdCB0aGF0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbgorLy8vIHR5cGUgY2FuIGJlIGNvcGllZCBhcm91bmQgd2l0aCBtZW1jcHkgaW5zdGVhZCBvZiBydW5uaW5nIGN0b3JzIGV0Yy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGlzUG9kTGlrZSB7CisgIC8vIHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlIGlzIGF2YWlsYWJsZSBpbiBsaWJjKysgd2l0aCBjbGFuZywgbGlic3RkYysrCisgIC8vIHRoYXQgY29tZXMgd2l0aCBHQ0MgNS4KKyNpZiAoX19oYXNfZmVhdHVyZShpc190cml2aWFsbHlfY29weWFibGUpICYmIGRlZmluZWQoX0xJQkNQUF9WRVJTSU9OKSkgfHwgICAgICBcCisgICAgKGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDUpCisgIC8vIElmIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgaXNfdHJpdmlhbGx5X2NvcHlhYmxlIHRyYWl0IHVzZSBpdCwgYXMgaXQKKyAgLy8gbWF0Y2hlcyB0aGUgZGVmaW5pdGlvbiBvZiBpc1BvZExpa2UgY2xvc2VseS4KKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZTxUPjo6dmFsdWU7CisjZWxpZiBfX2hhc19mZWF0dXJlKGlzX3RyaXZpYWxseV9jb3B5YWJsZSkKKyAgLy8gVXNlIHRoZSBpbnRlcm5hbCBuYW1lIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBpc190cml2aWFsbHlfY29weWFibGUgYnV0IHdlCisgIC8vIGRvbid0IGtub3cgaWYgdGhlIHN0YW5kYXJkIGxpYnJhcnkgZG9lcy4gVGhpcyBpcyB0aGUgY2FzZSBmb3IgY2xhbmcgaW4KKyAgLy8gY29uanVuY3Rpb24gd2l0aCBsaWJzdGRjKysgZnJvbSBHQ0MgNC54LgorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlKFQpOworI2Vsc2UKKyAgLy8gSWYgd2UgZG9uJ3Qga25vdyBhbnl0aGluZyBlbHNlLCB3ZSBjYW4gKGF0IGxlYXN0KSBhc3N1bWUgdGhhdCBhbGwgbm9uLWNsYXNzCisgIC8vIHR5cGVzIGFyZSBQT0RzLgorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9ICFzdGQ6OmlzX2NsYXNzPFQ+Ojp2YWx1ZTsKKyNlbmRpZgorfTsKKworLy8gc3RkOjpwYWlyJ3MgYXJlIHBvZC1saWtlIGlmIHRoZWlyIGVsZW1lbnRzIGFyZS4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitzdHJ1Y3QgaXNQb2RMaWtlPHN0ZDo6cGFpcjxULCBVPj4geworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGlzUG9kTGlrZTxUPjo6dmFsdWUgJiYgaXNQb2RMaWtlPFU+Ojp2YWx1ZTsKK307CisKKy8vLyBcYnJpZWYgTWV0YWZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiB0eXBlIGlzIGVpdGhlciBhbgorLy8vIGludGVncmFsIHR5cGUgb3IgYW4gZW51bWVyYXRpb24gdHlwZSwgaW5jbHVkaW5nIGVudW0gY2xhc3Nlcy4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIGFjY2VwdHMgcG90ZW50aWFsbHkgbW9yZSBpbnRlZ3JhbCB0eXBlcyB0aGFuIGlzX2ludGVncmFsCisvLy8gYmVjYXVzZSBpdCBpcyBiYXNlZCBvbiBiZWluZyBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIGFuIGludGVncmFsIHR5cGUuCisvLy8gQWxzbyBub3RlIHRoYXQgZW51bSBjbGFzc2VzIGFyZW4ndCBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIGludGVncmFsIHR5cGVzLAorLy8vIHRoZSB2YWx1ZSBtYXkgdGhlcmVmb3JlIG5lZWQgdG8gYmUgZXhwbGljaXRseSBjb252ZXJ0ZWQgYmVmb3JlIGJlaW5nIHVzZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgaXNfaW50ZWdyYWxfb3JfZW51bSB7CisgIHVzaW5nIFVuZGVybHlpbmdUID0gdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlOworCitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0KKyAgICAgICFzdGQ6OmlzX2NsYXNzPFVuZGVybHlpbmdUPjo6dmFsdWUgJiYgLy8gRmlsdGVyIGNvbnZlcnNpb24gb3BlcmF0b3JzLgorICAgICAgIXN0ZDo6aXNfcG9pbnRlcjxVbmRlcmx5aW5nVD46OnZhbHVlICYmCisgICAgICAhc3RkOjppc19mbG9hdGluZ19wb2ludDxVbmRlcmx5aW5nVD46OnZhbHVlICYmCisgICAgICAoc3RkOjppc19lbnVtPFVuZGVybHlpbmdUPjo6dmFsdWUgfHwKKyAgICAgICBzdGQ6OmlzX2NvbnZlcnRpYmxlPFVuZGVybHlpbmdULCB1bnNpZ25lZCBsb25nIGxvbmc+Ojp2YWx1ZSk7Cit9OworCisvLy8gXGJyaWVmIElmIFQgaXMgYSBwb2ludGVyLCBqdXN0IHJldHVybiBpdC4gSWYgaXQgaXMgbm90LCByZXR1cm4gVCYuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBFbmFibGUgPSB2b2lkPgorc3RydWN0IGFkZF9sdmFsdWVfcmVmZXJlbmNlX2lmX25vdF9wb2ludGVyIHsgdXNpbmcgdHlwZSA9IFQgJjsgfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgYWRkX2x2YWx1ZV9yZWZlcmVuY2VfaWZfbm90X3BvaW50ZXI8CisgICAgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19wb2ludGVyPFQ+Ojp2YWx1ZT46OnR5cGU+IHsKKyAgdXNpbmcgdHlwZSA9IFQ7Cit9OworCisvLy8gXGJyaWVmIElmIFQgaXMgYSBwb2ludGVyIHRvIFgsIHJldHVybiBhIHBvaW50ZXIgdG8gY29uc3QgWC4gSWYgaXQgaXMgbm90LAorLy8vIHJldHVybiBjb25zdCBULgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRW5hYmxlID0gdm9pZD4KK3N0cnVjdCBhZGRfY29uc3RfcGFzdF9wb2ludGVyIHsgdXNpbmcgdHlwZSA9IGNvbnN0IFQ7IH07CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGFkZF9jb25zdF9wYXN0X3BvaW50ZXI8CisgICAgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19wb2ludGVyPFQ+Ojp2YWx1ZT46OnR5cGU+IHsKKyAgdXNpbmcgdHlwZSA9IGNvbnN0IHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3BvaW50ZXI8VD46OnR5cGUgKjsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBFbmFibGUgPSB2b2lkPgorc3RydWN0IGNvbnN0X3BvaW50ZXJfb3JfY29uc3RfcmVmIHsKKyAgdXNpbmcgdHlwZSA9IGNvbnN0IFQgJjsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBjb25zdF9wb2ludGVyX29yX2NvbnN0X3JlZjwKKyAgICBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlPjo6dHlwZT4geworICB1c2luZyB0eXBlID0gdHlwZW5hbWUgYWRkX2NvbnN0X3Bhc3RfcG9pbnRlcjxUPjo6dHlwZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKy8vIElmIHRoZSBjb21waWxlciBzdXBwb3J0cyBkZXRlY3Rpbmcgd2hldGhlciBhIGNsYXNzIGlzIGZpbmFsLCBkZWZpbmUKKy8vIGFuIExMVk1fSVNfRklOQUwgbWFjcm8uIElmIGl0IGNhbm5vdCBiZSBkZWZpbmVkIHByb3Blcmx5LCB0aGlzCisvLyBtYWNybyB3aWxsIGJlIGxlZnQgdW5kZWZpbmVkLgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTQwMkwKKyNkZWZpbmUgTExWTV9JU19GSU5BTChUeSkgc3RkOjppc19maW5hbDxUeT4oKQorI2VsaWYgX19oYXNfZmVhdHVyZShpc19maW5hbCkgfHwgTExWTV9HTlVDX1BSRVJFUSg0LCA3LCAwKQorI2RlZmluZSBMTFZNX0lTX0ZJTkFMKFR5KSBfX2lzX2ZpbmFsKFR5KQorI2VuZGlmCisKKyNpZmRlZiBMTFZNX0RFRklORURfSEFTX0ZFQVRVUkUKKyN1bmRlZiBfX2hhc19mZWF0dXJlCisjZW5kaWYKKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9UWVBFX1RSQUlUU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQveHhoYXNoLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQveHhoYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdjYTQ2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC94eGhhc2guaApAQCAtMCwwICsxLDQ3IEBACisvKgorICAgeHhIYXNoIC0gRXh0cmVtZWx5IEZhc3QgSGFzaCBhbGdvcml0aG0KKyAgIEhlYWRlciBGaWxlCisgICBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNiwgWWFubiBDb2xsZXQuCisKKyAgIEJTRCAyLUNsYXVzZSBMaWNlbnNlIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocCkKKworICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgICBtZXQ6CisKKyAgICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgICBkaXN0cmlidXRpb24uCisKKyAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgICBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAgIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAgIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgIFlvdSBjYW4gY29udGFjdCB0aGUgYXV0aG9yIGF0IDoKKyAgIC0geHhIYXNoIHNvdXJjZSByZXBvc2l0b3J5IDogaHR0cHM6Ly9naXRodWIuY29tL0N5YW40OTczL3h4SGFzaAorKi8KKworLyogYmFzZWQgb24gcmV2aXNpb24gZDJkZjA0ZWZjYmVmN2Q3ZjY4ODZkMzQ1ODYxZTVkZmRhNGVkYWNjMSBSZW1vdmVkCisgKiBldmVyeXRoaW5nIGJ1dCBhIHNpbXBsZSBpbnRlcmZhY2UgZm9yIGNvbXB1dGluZyBYWGg2NC4gKi8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfWFhIQVNIX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1hYSEFTSF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworbmFtZXNwYWNlIGxsdm0gewordWludDY0X3QgeHhIYXNoNjQobGx2bTo6U3RyaW5nUmVmIERhdGEpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFibGVHZW4vRXJyb3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFibGVHZW4vRXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTRkM2JmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9FcnJvci5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vPT09LSBsbHZtL1RhYmxlR2VuL0Vycm9yLmggLSB0YmxnZW4gZXJyb3IgaGFuZGxpbmcgaGVscGVycyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGVycm9yIGhhbmRsaW5nIGhlbHBlciByb3V0aW5lcyB0byBwcmV0dHktcHJpbnQgZGlhZ25vc3RpYworLy8gbWVzc2FnZXMgZnJvbSB0YmxnZW4uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBQkxFR0VOX0VSUk9SX0gKKyNkZWZpbmUgTExWTV9UQUJMRUdFTl9FUlJPUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU291cmNlTWdyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKwordm9pZCBQcmludE5vdGUoQXJyYXlSZWY8U01Mb2M+IE5vdGVMb2MsIGNvbnN0IFR3aW5lICZNc2cpOworCit2b2lkIFByaW50V2FybmluZyhBcnJheVJlZjxTTUxvYz4gV2FybmluZ0xvYywgY29uc3QgVHdpbmUgJk1zZyk7Cit2b2lkIFByaW50V2FybmluZyhjb25zdCBjaGFyICpMb2MsIGNvbnN0IFR3aW5lICZNc2cpOwordm9pZCBQcmludFdhcm5pbmcoY29uc3QgVHdpbmUgJk1zZyk7CisKK3ZvaWQgUHJpbnRFcnJvcihBcnJheVJlZjxTTUxvYz4gRXJyb3JMb2MsIGNvbnN0IFR3aW5lICZNc2cpOwordm9pZCBQcmludEVycm9yKGNvbnN0IGNoYXIgKkxvYywgY29uc3QgVHdpbmUgJk1zZyk7Cit2b2lkIFByaW50RXJyb3IoY29uc3QgVHdpbmUgJk1zZyk7CisKK0xMVk1fQVRUUklCVVRFX05PUkVUVVJOIHZvaWQgUHJpbnRGYXRhbEVycm9yKGNvbnN0IFR3aW5lICZNc2cpOworTExWTV9BVFRSSUJVVEVfTk9SRVRVUk4gdm9pZCBQcmludEZhdGFsRXJyb3IoQXJyYXlSZWY8U01Mb2M+IEVycm9yTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk1zZyk7CisKK2V4dGVybiBTb3VyY2VNZ3IgU3JjTWdyOworZXh0ZXJuIHVuc2lnbmVkIEVycm9yc1ByaW50ZWQ7CisKK30gLy8gZW5kIG5hbWVzcGFjZSAibGx2bSIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhYmxlR2VuL01haW4uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFibGVHZW4vTWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MDU3MmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhYmxlR2VuL01haW4uaApAQCAtMCwwICsxLDMwIEBACisvLz09PS0gbGx2bS9UYWJsZUdlbi9NYWluLmggLSB0YmxnZW4gZW50cnkgcG9pbnQgLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgY29tbW9uIGVudHJ5IHBvaW50IGZvciB0YmxnZW4gdG9vbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBQkxFR0VOX01BSU5fSAorI2RlZmluZSBMTFZNX1RBQkxFR0VOX01BSU5fSAorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgUmVjb3JkS2VlcGVyOworCisvLy8gUGVyZm9ybSB0aGUgYWN0aW9uIHVzaW5nIFJlY29yZHMsIGFuZCB3cml0ZSBvdXRwdXQgdG8gT1MuCisvLy8gUmV0dXJucyB0cnVlIG9uIGVycm9yLCBmYWxzZSBvdGhlcndpc2UuCit1c2luZyBUYWJsZUdlbk1haW5GbiA9IGJvb2wgKHJhd19vc3RyZWFtICZPUywgUmVjb3JkS2VlcGVyICZSZWNvcmRzKTsKKworaW50IFRhYmxlR2VuTWFpbihjaGFyICphcmd2MCwgVGFibGVHZW5NYWluRm4gKk1haW5Gbik7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RBQkxFR0VOX01BSU5fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9SZWNvcmQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFibGVHZW4vUmVjb3JkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyZWJhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFibGVHZW4vUmVjb3JkLmgKQEAgLTAsMCArMSwxOTEwIEBACisvLz09PS0gbGx2bS9UYWJsZUdlbi9SZWNvcmQuaCAtIENsYXNzZXMgZm9yIFRhYmxlIFJlY29yZHMgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBtYWluIFRhYmxlR2VuIGRhdGEgc3RydWN0dXJlcywgaW5jbHVkaW5nIHRoZSBUYWJsZUdlbgorLy8gdHlwZXMsIHZhbHVlcywgYW5kIGhpZ2gtbGV2ZWwgZGF0YSBzdHJ1Y3R1cmVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQUJMRUdFTl9SRUNPUkRfSAorI2RlZmluZSBMTFZNX1RBQkxFR0VOX1JFQ09SRF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU01Mb2MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVHJhaWxpbmdPYmplY3RzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExpc3RSZWNUeTsKK3N0cnVjdCBNdWx0aUNsYXNzOworY2xhc3MgUmVjb3JkOworY2xhc3MgUmVjb3JkS2VlcGVyOworY2xhc3MgUmVjb3JkVmFsOworY2xhc3MgUmVzb2x2ZXI7CitjbGFzcyBTdHJpbmdJbml0OworY2xhc3MgVHlwZWRJbml0OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIFR5cGUgQ2xhc3NlcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgUmVjVHkgeworcHVibGljOgorICAvLy8gXGJyaWVmIFN1YmNsYXNzIGRpc2NyaW1pbmF0b3IgKGZvciBkeW5fY2FzdDw+IGV0IGFsLikKKyAgZW51bSBSZWNUeUtpbmQgeworICAgIEJpdFJlY1R5S2luZCwKKyAgICBCaXRzUmVjVHlLaW5kLAorICAgIENvZGVSZWNUeUtpbmQsCisgICAgSW50UmVjVHlLaW5kLAorICAgIFN0cmluZ1JlY1R5S2luZCwKKyAgICBMaXN0UmVjVHlLaW5kLAorICAgIERhZ1JlY1R5S2luZCwKKyAgICBSZWNvcmRSZWNUeUtpbmQKKyAgfTsKKworcHJpdmF0ZToKKyAgUmVjVHlLaW5kIEtpbmQ7CisgIExpc3RSZWNUeSAqTGlzdFR5ID0gbnVsbHB0cjsKKworcHVibGljOgorICBSZWNUeShSZWNUeUtpbmQgSykgOiBLaW5kKEspIHt9CisgIHZpcnR1YWwgflJlY1R5KCkgPSBkZWZhdWx0OworCisgIFJlY1R5S2luZCBnZXRSZWNUeUtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0ID0gMDsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsgT1MgPDwgZ2V0QXNTdHJpbmcoKTsgfQorICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgYWxsIHZhbHVlcyBvZiAndGhpcycgdHlwZSBjYW4gYmUgY29udmVydGVkIHRvIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHR5cGUuCisgIHZpcnR1YWwgYm9vbCB0eXBlSXNDb252ZXJ0aWJsZVRvKGNvbnN0IFJlY1R5ICpSSFMpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiAndGhpcycgdHlwZSBpcyBlcXVhbCB0byBvciBhIHN1YnR5cGUgb2YgUkhTLiBGb3IgZXhhbXBsZSwKKyAgLy8vIGEgYml0IHNldCBpcyBub3QgYW4gaW50LCBidXQgdGhleSBhcmUgY29udmVydGlibGUuCisgIHZpcnR1YWwgYm9vbCB0eXBlSXNBKGNvbnN0IFJlY1R5ICpSSFMpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSB0eXBlIHJlcHJlc2VudGluZyBsaXN0PHRoaXM+LgorICBMaXN0UmVjVHkgKmdldExpc3RUeSgpOworfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUmVjVHkgJlR5KSB7CisgIFR5LnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCisvLy8gJ2JpdCcgLSBSZXByZXNlbnQgYSBzaW5nbGUgYml0CitjbGFzcyBCaXRSZWNUeSA6IHB1YmxpYyBSZWNUeSB7CisgIHN0YXRpYyBCaXRSZWNUeSBTaGFyZWQ7CisKKyAgQml0UmVjVHkoKSA6IFJlY1R5KEJpdFJlY1R5S2luZCkge30KKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFJlY1R5ICpSVCkgeworICAgIHJldHVybiBSVC0+Z2V0UmVjVHlLaW5kKCkgPT0gQml0UmVjVHlLaW5kOworICB9CisKKyAgc3RhdGljIEJpdFJlY1R5ICpnZXQoKSB7IHJldHVybiAmU2hhcmVkOyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiYml0IjsgfQorCisgIGJvb2wgdHlwZUlzQ29udmVydGlibGVUbyhjb25zdCBSZWNUeSAqUkhTKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyAnYml0czxuPicgLSBSZXByZXNlbnQgYSBmaXhlZCBudW1iZXIgb2YgYml0cworY2xhc3MgQml0c1JlY1R5IDogcHVibGljIFJlY1R5IHsKKyAgdW5zaWduZWQgU2l6ZTsKKworICBleHBsaWNpdCBCaXRzUmVjVHkodW5zaWduZWQgU3opIDogUmVjVHkoQml0c1JlY1R5S2luZCksIFNpemUoU3opIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBSZWNUeSAqUlQpIHsKKyAgICByZXR1cm4gUlQtPmdldFJlY1R5S2luZCgpID09IEJpdHNSZWNUeUtpbmQ7CisgIH0KKworICBzdGF0aWMgQml0c1JlY1R5ICpnZXQodW5zaWduZWQgU3opOworCisgIHVuc2lnbmVkIGdldE51bUJpdHMoKSBjb25zdCB7IHJldHVybiBTaXplOyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIHR5cGVJc0NvbnZlcnRpYmxlVG8oY29uc3QgUmVjVHkgKlJIUykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCB0eXBlSXNBKGNvbnN0IFJlY1R5ICpSSFMpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vICdjb2RlJyAtIFJlcHJlc2VudCBhIGNvZGUgZnJhZ21lbnQKK2NsYXNzIENvZGVSZWNUeSA6IHB1YmxpYyBSZWNUeSB7CisgIHN0YXRpYyBDb2RlUmVjVHkgU2hhcmVkOworCisgIENvZGVSZWNUeSgpIDogUmVjVHkoQ29kZVJlY1R5S2luZCkge30KKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFJlY1R5ICpSVCkgeworICAgIHJldHVybiBSVC0+Z2V0UmVjVHlLaW5kKCkgPT0gQ29kZVJlY1R5S2luZDsKKyAgfQorCisgIHN0YXRpYyBDb2RlUmVjVHkgKmdldCgpIHsgcmV0dXJuICZTaGFyZWQ7IH0KKworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJjb2RlIjsgfQorCisgIGJvb2wgdHlwZUlzQ29udmVydGlibGVUbyhjb25zdCBSZWNUeSAqUkhTKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyAnaW50JyAtIFJlcHJlc2VudCBhbiBpbnRlZ2VyIHZhbHVlIG9mIG5vIHBhcnRpY3VsYXIgc2l6ZQorY2xhc3MgSW50UmVjVHkgOiBwdWJsaWMgUmVjVHkgeworICBzdGF0aWMgSW50UmVjVHkgU2hhcmVkOworCisgIEludFJlY1R5KCkgOiBSZWNUeShJbnRSZWNUeUtpbmQpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBSZWNUeSAqUlQpIHsKKyAgICByZXR1cm4gUlQtPmdldFJlY1R5S2luZCgpID09IEludFJlY1R5S2luZDsKKyAgfQorCisgIHN0YXRpYyBJbnRSZWNUeSAqZ2V0KCkgeyByZXR1cm4gJlNoYXJlZDsgfQorCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gImludCI7IH0KKworICBib29sIHR5cGVJc0NvbnZlcnRpYmxlVG8oY29uc3QgUmVjVHkgKlJIUykgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gJ3N0cmluZycgLSBSZXByZXNlbnQgYW4gc3RyaW5nIHZhbHVlCitjbGFzcyBTdHJpbmdSZWNUeSA6IHB1YmxpYyBSZWNUeSB7CisgIHN0YXRpYyBTdHJpbmdSZWNUeSBTaGFyZWQ7CisKKyAgU3RyaW5nUmVjVHkoKSA6IFJlY1R5KFN0cmluZ1JlY1R5S2luZCkge30KKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFJlY1R5ICpSVCkgeworICAgIHJldHVybiBSVC0+Z2V0UmVjVHlLaW5kKCkgPT0gU3RyaW5nUmVjVHlLaW5kOworICB9CisKKyAgc3RhdGljIFN0cmluZ1JlY1R5ICpnZXQoKSB7IHJldHVybiAmU2hhcmVkOyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIHR5cGVJc0NvbnZlcnRpYmxlVG8oY29uc3QgUmVjVHkgKlJIUykgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gJ2xpc3Q8VHk+JyAtIFJlcHJlc2VudCBhIGxpc3Qgb2YgdmFsdWVzLCBhbGwgb2Ygd2hpY2ggbXVzdCBiZSBvZgorLy8vIHRoZSBzcGVjaWZpZWQgdHlwZS4KK2NsYXNzIExpc3RSZWNUeSA6IHB1YmxpYyBSZWNUeSB7CisgIGZyaWVuZCBMaXN0UmVjVHkgKlJlY1R5OjpnZXRMaXN0VHkoKTsKKworICBSZWNUeSAqVHk7CisKKyAgZXhwbGljaXQgTGlzdFJlY1R5KFJlY1R5ICpUKSA6IFJlY1R5KExpc3RSZWNUeUtpbmQpLCBUeShUKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgUmVjVHkgKlJUKSB7CisgICAgcmV0dXJuIFJULT5nZXRSZWNUeUtpbmQoKSA9PSBMaXN0UmVjVHlLaW5kOworICB9CisKKyAgc3RhdGljIExpc3RSZWNUeSAqZ2V0KFJlY1R5ICpUKSB7IHJldHVybiBULT5nZXRMaXN0VHkoKTsgfQorICBSZWNUeSAqZ2V0RWxlbWVudFR5cGUoKSBjb25zdCB7IHJldHVybiBUeTsgfQorCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCB0eXBlSXNDb252ZXJ0aWJsZVRvKGNvbnN0IFJlY1R5ICpSSFMpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgdHlwZUlzQShjb25zdCBSZWNUeSAqUkhTKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyAnZGFnJyAtIFJlcHJlc2VudCBhIGRhZyBmcmFnbWVudAorY2xhc3MgRGFnUmVjVHkgOiBwdWJsaWMgUmVjVHkgeworICBzdGF0aWMgRGFnUmVjVHkgU2hhcmVkOworCisgIERhZ1JlY1R5KCkgOiBSZWNUeShEYWdSZWNUeUtpbmQpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBSZWNUeSAqUlQpIHsKKyAgICByZXR1cm4gUlQtPmdldFJlY1R5S2luZCgpID09IERhZ1JlY1R5S2luZDsKKyAgfQorCisgIHN0YXRpYyBEYWdSZWNUeSAqZ2V0KCkgeyByZXR1cm4gJlNoYXJlZDsgfQorCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gJ1tjbGFzc25hbWVdJyAtIFR5cGUgb2YgcmVjb3JkIHZhbHVlcyB0aGF0IGhhdmUgemVybyBvciBtb3JlIHN1cGVyY2xhc3Nlcy4KKy8vLworLy8vIFRoZSBsaXN0IG9mIHN1cGVyY2xhc3NlcyBpcyBub24tcmVkdW5kYW50LCBpLmUuIG9ubHkgY29udGFpbnMgY2xhc3NlcyB0aGF0CisvLy8gYXJlIG5vdCB0aGUgc3VwZXJjbGFzcyBvZiBzb21lIG90aGVyIGxpc3RlZCBjbGFzcy4KK2NsYXNzIFJlY29yZFJlY1R5IGZpbmFsIDogcHVibGljIFJlY1R5LCBwdWJsaWMgRm9sZGluZ1NldE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBUcmFpbGluZ09iamVjdHM8UmVjb3JkUmVjVHksIFJlY29yZCAqPiB7CisgIGZyaWVuZCBjbGFzcyBSZWNvcmQ7CisKKyAgdW5zaWduZWQgTnVtQ2xhc3NlczsKKworICBleHBsaWNpdCBSZWNvcmRSZWNUeSh1bnNpZ25lZCBOdW0pCisgICAgICA6IFJlY1R5KFJlY29yZFJlY1R5S2luZCksIE51bUNsYXNzZXMoTnVtKSB7fQorCitwdWJsaWM6CisgIFJlY29yZFJlY1R5KGNvbnN0IFJlY29yZFJlY1R5ICYpID0gZGVsZXRlOworICBSZWNvcmRSZWNUeSAmb3BlcmF0b3I9KGNvbnN0IFJlY29yZFJlY1R5ICYpID0gZGVsZXRlOworCisgIC8vIERvIG5vdCB1c2Ugc2l6ZWQgZGVhbGxvY2F0aW9uIGR1ZSB0byB0cmFpbGluZyBvYmplY3RzLgorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwKSB7IDo6b3BlcmF0b3IgZGVsZXRlKHApOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBSZWNUeSAqUlQpIHsKKyAgICByZXR1cm4gUlQtPmdldFJlY1R5S2luZCgpID09IFJlY29yZFJlY1R5S2luZDsKKyAgfQorCisgIC8vLyBHZXQgdGhlIHJlY29yZCB0eXBlIHdpdGggdGhlIGdpdmVuIG5vbi1yZWR1bmRhbnQgbGlzdCBvZiBzdXBlcmNsYXNzZXMuCisgIHN0YXRpYyBSZWNvcmRSZWNUeSAqZ2V0KEFycmF5UmVmPFJlY29yZCAqPiBDbGFzc2VzKTsKKworICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworCisgIEFycmF5UmVmPFJlY29yZCAqPiBnZXRDbGFzc2VzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlQXJyYXlSZWYoZ2V0VHJhaWxpbmdPYmplY3RzPFJlY29yZCAqPigpLCBOdW1DbGFzc2VzKTsKKyAgfQorCisgIHVzaW5nIGNvbnN0X3JlY29yZF9pdGVyYXRvciA9IFJlY29yZCAqIGNvbnN0ICo7CisKKyAgY29uc3RfcmVjb3JkX2l0ZXJhdG9yIGNsYXNzZXNfYmVnaW4oKSBjb25zdCB7IHJldHVybiBnZXRDbGFzc2VzKCkuYmVnaW4oKTsgfQorICBjb25zdF9yZWNvcmRfaXRlcmF0b3IgY2xhc3Nlc19lbmQoKSBjb25zdCB7IHJldHVybiBnZXRDbGFzc2VzKCkuZW5kKCk7IH0KKworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgaXNTdWJDbGFzc09mKFJlY29yZCAqQ2xhc3MpIGNvbnN0OworICBib29sIHR5cGVJc0NvbnZlcnRpYmxlVG8oY29uc3QgUmVjVHkgKlJIUykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCB0eXBlSXNBKGNvbnN0IFJlY1R5ICpSSFMpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vIEZpbmQgYSBjb21tb24gdHlwZSB0aGF0IFQxIGFuZCBUMiBjb252ZXJ0IHRvLgorLy8vIFJldHVybiAwIGlmIG5vIHN1Y2ggdHlwZSBleGlzdHMuCitSZWNUeSAqcmVzb2x2ZVR5cGVzKFJlY1R5ICpUMSwgUmVjVHkgKlQyKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBJbml0aWFsaXplciBDbGFzc2VzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBJbml0IHsKK3Byb3RlY3RlZDoKKyAgLy8vIFxicmllZiBEaXNjcmltaW5hdG9yIGVudW0gKGZvciBpc2E8PiwgZHluX2Nhc3Q8PiwgZXQgYWwuKQorICAvLy8KKyAgLy8vIFRoaXMgZW51bSBpcyBsYWlkIG91dCBieSBhIHByZW9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgaW5oZXJpdGFuY2UKKyAgLy8vIGhpZXJhcmNoeSwgYW5kIGRvZXMgbm90IGNvbnRhaW4gYW4gZW50cnkgZm9yIGFic3RyYWN0IGNsYXNzZXMsIGFzIHBlcgorICAvLy8gdGhlIHJlY29tbWVuZGF0aW9uIGluIGRvY3MvSG93VG9TZXRVcExMVk1TdHlsZVJUVEkucnN0LgorICAvLy8KKyAgLy8vIFdlIGFsc28gZXhwbGljaXRseSBpbmNsdWRlICJmaXJzdCIgYW5kICJsYXN0IiB2YWx1ZXMgZm9yIGVhY2gKKyAgLy8vIGludGVyaW9yIG5vZGUgb2YgdGhlIGluaGVyaXRhbmNlIHRyZWUsIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHJlYWQgdGhlCisgIC8vLyBjb3JyZXNwb25kaW5nIGNsYXNzb2YoKS4KKyAgLy8vCisgIC8vLyBXZSBjb3VsZCBwYWNrIHRoZXNlIGEgYml0IHRpZ2h0ZXIgYnkgbm90IGhhdmluZyB0aGUgSUtfRmlyc3RYWFhJbml0CisgIC8vLyBhbmQgSUtfTGFzdFhYWEluaXQgYmUgdGhlaXIgb3duIHZhbHVlcywgYnV0IHRoYXQgd291bGQgZGVncmFkZQorICAvLy8gcmVhZGFiaWxpdHkgZm9yIHJlYWxseSBubyBiZW5lZml0LgorICBlbnVtIEluaXRLaW5kIDogdWludDhfdCB7CisgICAgSUtfRmlyc3QsIC8vIHVudXNlZDsgc2lsZW5jZSBhIHNwdXJpb3VzIHdhcm5pbmcKKyAgICBJS19GaXJzdFR5cGVkSW5pdCwKKyAgICBJS19CaXRJbml0LAorICAgIElLX0JpdHNJbml0LAorICAgIElLX0NvZGVJbml0LAorICAgIElLX0RhZ0luaXQsCisgICAgSUtfRGVmSW5pdCwKKyAgICBJS19GaWVsZEluaXQsCisgICAgSUtfSW50SW5pdCwKKyAgICBJS19MaXN0SW5pdCwKKyAgICBJS19GaXJzdE9wSW5pdCwKKyAgICBJS19CaW5PcEluaXQsCisgICAgSUtfVGVybk9wSW5pdCwKKyAgICBJS19Vbk9wSW5pdCwKKyAgICBJS19MYXN0T3BJbml0LAorICAgIElLX0ZvbGRPcEluaXQsCisgICAgSUtfSXNBT3BJbml0LAorICAgIElLX1N0cmluZ0luaXQsCisgICAgSUtfVmFySW5pdCwKKyAgICBJS19WYXJMaXN0RWxlbWVudEluaXQsCisgICAgSUtfVmFyQml0SW5pdCwKKyAgICBJS19WYXJEZWZJbml0LAorICAgIElLX0xhc3RUeXBlZEluaXQsCisgICAgSUtfVW5zZXRJbml0CisgIH07CisKK3ByaXZhdGU6CisgIGNvbnN0IEluaXRLaW5kIEtpbmQ7CisKK3Byb3RlY3RlZDoKKyAgdWludDhfdCBPcGM7IC8vIFVzZWQgYnkgVW5PcEluaXQsIEJpbk9wSW5pdCwgYW5kIFRlcm5PcEluaXQKKworcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIEluaXRLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgSW5pdChJbml0S2luZCBLLCB1aW50OF90IE9wYyA9IDApIDogS2luZChLKSwgT3BjKE9wYykge30KKworcHVibGljOgorICBJbml0KGNvbnN0IEluaXQgJikgPSBkZWxldGU7CisgIEluaXQgJm9wZXJhdG9yPShjb25zdCBJbml0ICYpID0gZGVsZXRlOworICB2aXJ0dWFsIH5Jbml0KCkgPSBkZWZhdWx0OworCisgIC8vLyBUaGlzIHZpcnR1YWwgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHZhbHVlcyB0aGF0IG1heQorICAvLy8gbm90IGJlIGNvbXBsZXRlbHkgc3BlY2lmaWVkIHlldC4KKyAgdmlydHVhbCBib29sIGlzQ29tcGxldGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIElzIHRoaXMgYSBjb25jcmV0ZSBhbmQgZnVsbHkgcmVzb2x2ZWQgdmFsdWUgd2l0aG91dCBhbnkgcmVmZXJlbmNlcyBvcgorICAvLy8gc3R1Y2sgb3BlcmF0aW9ucz8gVW5zZXQgdmFsdWVzIGFyZSBjb25jcmV0ZS4KKyAgdmlydHVhbCBib29sIGlzQ29uY3JldGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBQcmludCBvdXQgdGhpcyB2YWx1ZS4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsgT1MgPDwgZ2V0QXNTdHJpbmcoKTsgfQorCisgIC8vLyBDb252ZXJ0IHRoaXMgdmFsdWUgdG8gYSBzdHJpbmcgZm9ybS4KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0ID0gMDsKKyAgLy8vIENvbnZlcnQgdGhpcyB2YWx1ZSB0byBhIHN0cmluZyBmb3JtLAorICAvLy8gd2l0aG91dCBhZGRpbmcgcXVvdGUgbWFya2Vycy4gIFRoaXMgcHJpbWFydWx5IGFmZmVjdHMKKyAgLy8vIFN0cmluZ0luaXRzIHdoZXJlIHdlIHdpbGwgbm90IHN1cnJvdW5kIHRoZSBzdHJpbmcgdmFsdWUgd2l0aAorICAvLy8gcXVvdGVzLgorICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEFzVW5xdW90ZWRTdHJpbmcoKSBjb25zdCB7IHJldHVybiBnZXRBc1N0cmluZygpOyB9CisKKyAgLy8vIERlYnVnZ2luZyBtZXRob2QgdGhhdCBtYXkgYmUgY2FsbGVkIHRocm91Z2ggYSBkZWJ1Z2dlciwganVzdAorICAvLy8gaW52b2tlcyBwcmludCBvbiBzdGRlcnIuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBJZiB0aGlzIGluaXRpYWxpemVyIGlzIGNvbnZlcnRpYmxlIHRvIFR5LCByZXR1cm4gYW4gaW5pdGlhbGl6ZXIgd2hvc2UKKyAgLy8vIHR5cGUgaXMtYSBUeSwgZ2VuZXJhdGluZyBhICFjYXN0IG9wZXJhdGlvbiBpZiByZXF1aXJlZC4gT3RoZXJ3aXNlLCByZXR1cm4KKyAgLy8vIG51bGxwdHIuCisgIHZpcnR1YWwgSW5pdCAqZ2V0Q2FzdFRvKFJlY1R5ICpUeSkgY29uc3QgPSAwOworCisgIC8vLyBDb252ZXJ0IHRvIGFuIGluaXRpYWxpemVyIHdob3NlIHR5cGUgaXMtYSBUeSwgb3IgcmV0dXJuIG51bGxwdHIgaWYgdGhpcworICAvLy8gaXMgbm90IHBvc3NpYmxlICh0aGlzIGNhbiBoYXBwZW4gaWYgdGhlIGluaXRpYWxpemVyJ3MgdHlwZSBpcyBjb252ZXJ0aWJsZQorICAvLy8gdG8gVHksIGJ1dCB0aGVyZSBhcmUgdW5yZXNvbHZlZCByZWZlcmVuY2VzKS4KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0SW5pdGlhbGl6ZXJUbyhSZWNUeSAqVHkpIGNvbnN0ID0gMDsKKworICAvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGJpdHJhbmdlCisgIC8vLyBzZWxlY3Rpb24gb3BlcmF0b3IuICBHaXZlbiBhbiBpbml0aWFsaXplciwgaXQgc2VsZWN0cyB0aGUgc3BlY2lmaWVkIGJpdHMKKyAgLy8vIG91dCwgcmV0dXJuaW5nIHRoZW0gYXMgYSBuZXcgaW5pdCBvZiBiaXRzIHR5cGUuICBJZiBpdCBpcyBub3QgbGVnYWwgdG8gdXNlCisgIC8vLyB0aGUgYml0IHN1YnNjcmlwdCBvcGVyYXRvciBvbiB0aGlzIGluaXRpYWxpemVyLCByZXR1cm4gbnVsbC4KKyAgdmlydHVhbCBJbml0ICpjb252ZXJ0SW5pdGlhbGl6ZXJCaXRSYW5nZShBcnJheVJlZjx1bnNpZ25lZD4gQml0cykgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBsaXN0IHNsaWNlCisgIC8vLyBzZWxlY3Rpb24gb3BlcmF0b3IuICBHaXZlbiBhbiBpbml0aWFsaXplciwgaXQgc2VsZWN0cyB0aGUgc3BlY2lmaWVkIGxpc3QKKyAgLy8vIGVsZW1lbnRzLCByZXR1cm5pbmcgdGhlbSBhcyBhIG5ldyBpbml0IG9mIGxpc3QgdHlwZS4gIElmIGl0IGlzIG5vdCBsZWdhbAorICAvLy8gdG8gdGFrZSBhIHNsaWNlIG9mIHRoaXMsIHJldHVybiBudWxsLgorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRJbml0TGlzdFNsaWNlKEFycmF5UmVmPHVuc2lnbmVkPiBFbGVtZW50cykgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBGaWVsZEluaXQgY2xhc3MuCisgIC8vLyBJbXBsZW1lbnRvcnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgdHlwZSBvZiB0aGUgbmFtZWQgZmllbGQgaWYKKyAgLy8vIHRoZXkgYXJlIG9mIHJlY29yZCB0eXBlLgorICB2aXJ0dWFsIFJlY1R5ICpnZXRGaWVsZFR5cGUoU3RyaW5nSW5pdCAqRmllbGROYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBieSBjbGFzc2VzIHRoYXQgcmVmZXIgdG8gb3RoZXIKKyAgLy8vIHZhcmlhYmxlcyB3aGljaCBtYXkgbm90IGJlIGRlZmluZWQgYXQgdGhlIHRpbWUgdGhlIGV4cHJlc3Npb24gaXMgZm9ybWVkLgorICAvLy8gSWYgYSB2YWx1ZSBpcyBzZXQgZm9yIHRoZSB2YXJpYWJsZSBsYXRlciwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24KKyAgLy8vIHVzZXJzIG9mIHRoZSB2YWx1ZSB0byBhbGxvdyB0aGUgdmFsdWUgdG8gcHJvcGFnYXRlIG91dC4KKyAgdmlydHVhbCBJbml0ICpyZXNvbHZlUmVmZXJlbmNlcyhSZXNvbHZlciAmUikgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PEluaXQgKj4odGhpcyk7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byByZXR1cm4gdGhlIGluaXRpYWxpemVyIGZvciB0aGUgc3BlY2lmaWVkCisgIC8vLyBiaXQuCisgIHZpcnR1YWwgSW5pdCAqZ2V0Qml0KHVuc2lnbmVkIEJpdCkgY29uc3QgPSAwOworfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgSW5pdCAmSSkgeworICBJLnByaW50KE9TKTsgcmV0dXJuIE9TOworfQorCisvLy8gVGhpcyBpcyB0aGUgY29tbW9uIHN1cGVyLWNsYXNzIG9mIHR5cGVzIHRoYXQgaGF2ZSBhIHNwZWNpZmljLAorLy8vIGV4cGxpY2l0LCB0eXBlLgorY2xhc3MgVHlwZWRJbml0IDogcHVibGljIEluaXQgeworICBSZWNUeSAqVHk7CisKK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgVHlwZWRJbml0KEluaXRLaW5kIEssIFJlY1R5ICpULCB1aW50OF90IE9wYyA9IDApCisgICAgOiBJbml0KEssIE9wYyksIFR5KFQpIHt9CisKK3B1YmxpYzoKKyAgVHlwZWRJbml0KGNvbnN0IFR5cGVkSW5pdCAmKSA9IGRlbGV0ZTsKKyAgVHlwZWRJbml0ICZvcGVyYXRvcj0oY29uc3QgVHlwZWRJbml0ICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5pdCAqSSkgeworICAgIHJldHVybiBJLT5nZXRLaW5kKCkgPj0gSUtfRmlyc3RUeXBlZEluaXQgJiYKKyAgICAgICAgICAgSS0+Z2V0S2luZCgpIDw9IElLX0xhc3RUeXBlZEluaXQ7CisgIH0KKworICBSZWNUeSAqZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5OyB9CisKKyAgSW5pdCAqZ2V0Q2FzdFRvKFJlY1R5ICpUeSkgY29uc3Qgb3ZlcnJpZGU7CisgIEluaXQgKmNvbnZlcnRJbml0aWFsaXplclRvKFJlY1R5ICpUeSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgSW5pdCAqY29udmVydEluaXRpYWxpemVyQml0UmFuZ2UoQXJyYXlSZWY8dW5zaWduZWQ+IEJpdHMpIGNvbnN0IG92ZXJyaWRlOworICBJbml0ICpjb252ZXJ0SW5pdExpc3RTbGljZShBcnJheVJlZjx1bnNpZ25lZD4gRWxlbWVudHMpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgRmllbGRJbml0IGNsYXNzLgorICAvLy8gSW1wbGVtZW50b3JzIG9mIHRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIG5hbWVkIGZpZWxkIGlmCisgIC8vLyB0aGV5IGFyZSBvZiByZWNvcmQgdHlwZS4KKyAgLy8vCisgIFJlY1R5ICpnZXRGaWVsZFR5cGUoU3RyaW5nSW5pdCAqRmllbGROYW1lKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyAnPycgLSBSZXByZXNlbnRzIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWUKK2NsYXNzIFVuc2V0SW5pdCA6IHB1YmxpYyBJbml0IHsKKyAgVW5zZXRJbml0KCkgOiBJbml0KElLX1Vuc2V0SW5pdCkge30KKworcHVibGljOgorICBVbnNldEluaXQoY29uc3QgVW5zZXRJbml0ICYpID0gZGVsZXRlOworICBVbnNldEluaXQgJm9wZXJhdG9yPShjb25zdCBVbnNldEluaXQgJikgPSBkZWxldGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbml0ICpJKSB7CisgICAgcmV0dXJuIEktPmdldEtpbmQoKSA9PSBJS19VbnNldEluaXQ7CisgIH0KKworICBzdGF0aWMgVW5zZXRJbml0ICpnZXQoKTsKKworICBJbml0ICpnZXRDYXN0VG8oUmVjVHkgKlR5KSBjb25zdCBvdmVycmlkZTsKKyAgSW5pdCAqY29udmVydEluaXRpYWxpemVyVG8oUmVjVHkgKlR5KSBjb25zdCBvdmVycmlkZTsKKworICBJbml0ICpnZXRCaXQodW5zaWduZWQgQml0KSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VW5zZXRJbml0Kj4odGhpcyk7CisgIH0KKworICBib29sIGlzQ29tcGxldGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorICBib29sIGlzQ29uY3JldGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIj8iOyB9Cit9OworCisvLy8gJ3RydWUnLydmYWxzZScgLSBSZXByZXNlbnQgYSBjb25jcmV0ZSBpbml0aWFsaXplciBmb3IgYSBiaXQuCitjbGFzcyBCaXRJbml0IGZpbmFsIDogcHVibGljIFR5cGVkSW5pdCB7CisgIGJvb2wgVmFsdWU7CisKKyAgZXhwbGljaXQgQml0SW5pdChib29sIFYpIDogVHlwZWRJbml0KElLX0JpdEluaXQsIEJpdFJlY1R5OjpnZXQoKSksIFZhbHVlKFYpIHt9CisKK3B1YmxpYzoKKyAgQml0SW5pdChjb25zdCBCaXRJbml0ICYpID0gZGVsZXRlOworICBCaXRJbml0ICZvcGVyYXRvcj0oQml0SW5pdCAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluaXQgKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0S2luZCgpID09IElLX0JpdEluaXQ7CisgIH0KKworICBzdGF0aWMgQml0SW5pdCAqZ2V0KGJvb2wgVik7CisKKyAgYm9vbCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgSW5pdCAqY29udmVydEluaXRpYWxpemVyVG8oUmVjVHkgKlR5KSBjb25zdCBvdmVycmlkZTsKKworICBJbml0ICpnZXRCaXQodW5zaWduZWQgQml0KSBjb25zdCBvdmVycmlkZSB7CisgICAgYXNzZXJ0KEJpdCA8IDEgJiYgIkJpdCBpbmRleCBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Qml0SW5pdCo+KHRoaXMpOworICB9CisKKyAgYm9vbCBpc0NvbmNyZXRlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIFZhbHVlID8gIjEiIDogIjAiOyB9Cit9OworCisvLy8gJ3sgYSwgYiwgYyB9JyAtIFJlcHJlc2VudHMgYW4gaW5pdGlhbGl6ZXIgZm9yIGEgQml0c1JlY1R5IHZhbHVlLgorLy8vIEl0IGNvbnRhaW5zIGEgdmVjdG9yIG9mIGJpdHMsIHdob3NlIHNpemUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgdHlwZS4KK2NsYXNzIEJpdHNJbml0IGZpbmFsIDogcHVibGljIFR5cGVkSW5pdCwgcHVibGljIEZvbGRpbmdTZXROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVHJhaWxpbmdPYmplY3RzPEJpdHNJbml0LCBJbml0ICo+IHsKKyAgdW5zaWduZWQgTnVtQml0czsKKworICBCaXRzSW5pdCh1bnNpZ25lZCBOKQorICAgIDogVHlwZWRJbml0KElLX0JpdHNJbml0LCBCaXRzUmVjVHk6OmdldChOKSksIE51bUJpdHMoTikge30KKworcHVibGljOgorICBCaXRzSW5pdChjb25zdCBCaXRzSW5pdCAmKSA9IGRlbGV0ZTsKKyAgQml0c0luaXQgJm9wZXJhdG9yPShjb25zdCBCaXRzSW5pdCAmKSA9IGRlbGV0ZTsKKworICAvLyBEbyBub3QgdXNlIHNpemVkIGRlYWxsb2NhdGlvbiBkdWUgdG8gdHJhaWxpbmcgb2JqZWN0cy4KKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqcCkgeyA6Om9wZXJhdG9yIGRlbGV0ZShwKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5pdCAqSSkgeworICAgIHJldHVybiBJLT5nZXRLaW5kKCkgPT0gSUtfQml0c0luaXQ7CisgIH0KKworICBzdGF0aWMgQml0c0luaXQgKmdldChBcnJheVJlZjxJbml0ICo+IFJhbmdlKTsKKworICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworCisgIHVuc2lnbmVkIGdldE51bUJpdHMoKSBjb25zdCB7IHJldHVybiBOdW1CaXRzOyB9CisKKyAgSW5pdCAqY29udmVydEluaXRpYWxpemVyVG8oUmVjVHkgKlR5KSBjb25zdCBvdmVycmlkZTsKKyAgSW5pdCAqY29udmVydEluaXRpYWxpemVyQml0UmFuZ2UoQXJyYXlSZWY8dW5zaWduZWQ+IEJpdHMpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IGdldE51bUJpdHMoKTsgKytpKQorICAgICAgaWYgKCFnZXRCaXQoaSktPmlzQ29tcGxldGUoKSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCBhbGxJbkNvbXBsZXRlKCkgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gZ2V0TnVtQml0cygpOyArK2kpCisgICAgICBpZiAoZ2V0Qml0KGkpLT5pc0NvbXBsZXRlKCkpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgaXNDb25jcmV0ZSgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworCisgIEluaXQgKnJlc29sdmVSZWZlcmVuY2VzKFJlc29sdmVyICZSKSBjb25zdCBvdmVycmlkZTsKKworICBJbml0ICpnZXRCaXQodW5zaWduZWQgQml0KSBjb25zdCBvdmVycmlkZSB7CisgICAgYXNzZXJ0KEJpdCA8IE51bUJpdHMgJiYgIkJpdCBpbmRleCBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxJbml0ICo+KClbQml0XTsKKyAgfQorfTsKKworLy8vICc3JyAtIFJlcHJlc2VudCBhbiBpbml0aWFsaXphdGlvbiBieSBhIGxpdGVyYWwgaW50ZWdlciB2YWx1ZS4KK2NsYXNzIEludEluaXQgOiBwdWJsaWMgVHlwZWRJbml0IHsKKyAgaW50NjRfdCBWYWx1ZTsKKworICBleHBsaWNpdCBJbnRJbml0KGludDY0X3QgVikKKyAgICA6IFR5cGVkSW5pdChJS19JbnRJbml0LCBJbnRSZWNUeTo6Z2V0KCkpLCBWYWx1ZShWKSB7fQorCitwdWJsaWM6CisgIEludEluaXQoY29uc3QgSW50SW5pdCAmKSA9IGRlbGV0ZTsKKyAgSW50SW5pdCAmb3BlcmF0b3I9KGNvbnN0IEludEluaXQgJikgPSBkZWxldGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbml0ICpJKSB7CisgICAgcmV0dXJuIEktPmdldEtpbmQoKSA9PSBJS19JbnRJbml0OworICB9CisKKyAgc3RhdGljIEludEluaXQgKmdldChpbnQ2NF90IFYpOworCisgIGludDY0X3QgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorCisgIEluaXQgKmNvbnZlcnRJbml0aWFsaXplclRvKFJlY1R5ICpUeSkgY29uc3Qgb3ZlcnJpZGU7CisgIEluaXQgKmNvbnZlcnRJbml0aWFsaXplckJpdFJhbmdlKEFycmF5UmVmPHVuc2lnbmVkPiBCaXRzKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIGlzQ29uY3JldGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgSW5pdCAqZ2V0Qml0KHVuc2lnbmVkIEJpdCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBCaXRJbml0OjpnZXQoKFZhbHVlICYgKDFVTEwgPDwgQml0KSkgIT0gMCk7CisgIH0KK307CisKKy8vLyAiZm9vIiAtIFJlcHJlc2VudCBhbiBpbml0aWFsaXphdGlvbiBieSBhIHN0cmluZyB2YWx1ZS4KK2NsYXNzIFN0cmluZ0luaXQgOiBwdWJsaWMgVHlwZWRJbml0IHsKKyAgU3RyaW5nUmVmIFZhbHVlOworCisgIGV4cGxpY2l0IFN0cmluZ0luaXQoU3RyaW5nUmVmIFYpCisgICAgICA6IFR5cGVkSW5pdChJS19TdHJpbmdJbml0LCBTdHJpbmdSZWNUeTo6Z2V0KCkpLCBWYWx1ZShWKSB7fQorCitwdWJsaWM6CisgIFN0cmluZ0luaXQoY29uc3QgU3RyaW5nSW5pdCAmKSA9IGRlbGV0ZTsKKyAgU3RyaW5nSW5pdCAmb3BlcmF0b3I9KGNvbnN0IFN0cmluZ0luaXQgJikgPSBkZWxldGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbml0ICpJKSB7CisgICAgcmV0dXJuIEktPmdldEtpbmQoKSA9PSBJS19TdHJpbmdJbml0OworICB9CisKKyAgc3RhdGljIFN0cmluZ0luaXQgKmdldChTdHJpbmdSZWYpOworCisgIFN0cmluZ1JlZiBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgSW5pdCAqY29udmVydEluaXRpYWxpemVyVG8oUmVjVHkgKlR5KSBjb25zdCBvdmVycmlkZTsKKworICBib29sIGlzQ29uY3JldGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIlwiIiArIFZhbHVlLnN0cigpICsgIlwiIjsgfQorCisgIHN0ZDo6c3RyaW5nIGdldEFzVW5xdW90ZWRTdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBWYWx1ZTsgfQorCisgIEluaXQgKmdldEJpdCh1bnNpZ25lZCBCaXQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbGxlZ2FsIGJpdCByZWZlcmVuY2Ugb2ZmIHN0cmluZyIpOworICB9Cit9OworCitjbGFzcyBDb2RlSW5pdCA6IHB1YmxpYyBUeXBlZEluaXQgeworICBTdHJpbmdSZWYgVmFsdWU7CisKKyAgZXhwbGljaXQgQ29kZUluaXQoU3RyaW5nUmVmIFYpCisgICAgICA6IFR5cGVkSW5pdChJS19Db2RlSW5pdCwgc3RhdGljX2Nhc3Q8UmVjVHkgKj4oQ29kZVJlY1R5OjpnZXQoKSkpLAorICAgICAgICBWYWx1ZShWKSB7fQorCitwdWJsaWM6CisgIENvZGVJbml0KGNvbnN0IFN0cmluZ0luaXQgJikgPSBkZWxldGU7CisgIENvZGVJbml0ICZvcGVyYXRvcj0oY29uc3QgU3RyaW5nSW5pdCAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluaXQgKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0S2luZCgpID09IElLX0NvZGVJbml0OworICB9CisKKyAgc3RhdGljIENvZGVJbml0ICpnZXQoU3RyaW5nUmVmKTsKKworICBTdHJpbmdSZWYgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorCisgIEluaXQgKmNvbnZlcnRJbml0aWFsaXplclRvKFJlY1R5ICpUeSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBpc0NvbmNyZXRlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gIlt7IiArIFZhbHVlLnN0cigpICsgIn1dIjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGdldEFzVW5xdW90ZWRTdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBWYWx1ZTsgfQorCisgIEluaXQgKmdldEJpdCh1bnNpZ25lZCBCaXQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbGxlZ2FsIGJpdCByZWZlcmVuY2Ugb2ZmIHN0cmluZyIpOworICB9Cit9OworCisvLy8gW0FMLCBBSCwgQ0xdIC0gUmVwcmVzZW50IGEgbGlzdCBvZiBkZWZzCisvLy8KK2NsYXNzIExpc3RJbml0IGZpbmFsIDogcHVibGljIFR5cGVkSW5pdCwgcHVibGljIEZvbGRpbmdTZXROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVHJhaWxpbmdPYmplY3RzPExpc3RJbml0LCBJbml0ICo+IHsKKyAgdW5zaWduZWQgTnVtVmFsdWVzOworCitwdWJsaWM6CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gSW5pdCAqY29uc3QgKjsKKworcHJpdmF0ZToKKyAgZXhwbGljaXQgTGlzdEluaXQodW5zaWduZWQgTiwgUmVjVHkgKkVsdFR5KQorICAgIDogVHlwZWRJbml0KElLX0xpc3RJbml0LCBMaXN0UmVjVHk6OmdldChFbHRUeSkpLCBOdW1WYWx1ZXMoTikge30KKworcHVibGljOgorICBMaXN0SW5pdChjb25zdCBMaXN0SW5pdCAmKSA9IGRlbGV0ZTsKKyAgTGlzdEluaXQgJm9wZXJhdG9yPShjb25zdCBMaXN0SW5pdCAmKSA9IGRlbGV0ZTsKKworICAvLyBEbyBub3QgdXNlIHNpemVkIGRlYWxsb2NhdGlvbiBkdWUgdG8gdHJhaWxpbmcgb2JqZWN0cy4KKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqcCkgeyA6Om9wZXJhdG9yIGRlbGV0ZShwKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5pdCAqSSkgeworICAgIHJldHVybiBJLT5nZXRLaW5kKCkgPT0gSUtfTGlzdEluaXQ7CisgIH0KKyAgc3RhdGljIExpc3RJbml0ICpnZXQoQXJyYXlSZWY8SW5pdCAqPiBSYW5nZSwgUmVjVHkgKkVsdFR5KTsKKworICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworCisgIEluaXQgKmdldEVsZW1lbnQodW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgTnVtVmFsdWVzICYmICJMaXN0IGVsZW1lbnQgaW5kZXggb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8SW5pdCAqPigpW2ldOworICB9CisgIFJlY1R5ICpnZXRFbGVtZW50VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxMaXN0UmVjVHk+KGdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisgIH0KKworICBSZWNvcmQgKmdldEVsZW1lbnRBc1JlY29yZCh1bnNpZ25lZCBpKSBjb25zdDsKKworICBJbml0ICpjb252ZXJ0SW5pdExpc3RTbGljZShBcnJheVJlZjx1bnNpZ25lZD4gRWxlbWVudHMpIGNvbnN0IG92ZXJyaWRlOworCisgIEluaXQgKmNvbnZlcnRJbml0aWFsaXplclRvKFJlY1R5ICpUeSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgY2xhc3NlcyB0aGF0IHJlZmVyIHRvIG90aGVyCisgIC8vLyB2YXJpYWJsZXMgd2hpY2ggbWF5IG5vdCBiZSBkZWZpbmVkIGF0IHRoZSB0aW1lIHRoZXkgZXhwcmVzc2lvbiBpcyBmb3JtZWQuCisgIC8vLyBJZiBhIHZhbHVlIGlzIHNldCBmb3IgdGhlIHZhcmlhYmxlIGxhdGVyLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbgorICAvLy8gdXNlcnMgb2YgdGhlIHZhbHVlIHRvIGFsbG93IHRoZSB2YWx1ZSB0byBwcm9wYWdhdGUgb3V0LgorICAvLy8KKyAgSW5pdCAqcmVzb2x2ZVJlZmVyZW5jZXMoUmVzb2x2ZXIgJlIpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgaXNDb25jcmV0ZSgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworCisgIEFycmF5UmVmPEluaXQqPiBnZXRWYWx1ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VBcnJheVJlZihnZXRUcmFpbGluZ09iamVjdHM8SW5pdCAqPigpLCBOdW1WYWx1ZXMpOworICB9CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8SW5pdCAqPigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCAgKCkgY29uc3QgeyByZXR1cm4gYmVnaW4oKSArIE51bVZhbHVlczsgfQorCisgIHNpemVfdCAgICAgICAgIHNpemUgKCkgY29uc3QgeyByZXR1cm4gTnVtVmFsdWVzOyAgfQorICBib29sICAgICAgICAgICBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIE51bVZhbHVlcyA9PSAwOyB9CisKKyAgSW5pdCAqZ2V0Qml0KHVuc2lnbmVkIEJpdCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIklsbGVnYWwgYml0IHJlZmVyZW5jZSBvZmYgbGlzdCIpOworICB9Cit9OworCisvLy8gQmFzZSBjbGFzcyBmb3Igb3BlcmF0b3JzCisvLy8KK2NsYXNzIE9wSW5pdCA6IHB1YmxpYyBUeXBlZEluaXQgeworcHJvdGVjdGVkOgorICBleHBsaWNpdCBPcEluaXQoSW5pdEtpbmQgSywgUmVjVHkgKlR5cGUsIHVpbnQ4X3QgT3BjKQorICAgIDogVHlwZWRJbml0KEssIFR5cGUsIE9wYykge30KKworcHVibGljOgorICBPcEluaXQoY29uc3QgT3BJbml0ICYpID0gZGVsZXRlOworICBPcEluaXQgJm9wZXJhdG9yPShPcEluaXQgJikgPSBkZWxldGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbml0ICpJKSB7CisgICAgcmV0dXJuIEktPmdldEtpbmQoKSA+PSBJS19GaXJzdE9wSW5pdCAmJgorICAgICAgICAgICBJLT5nZXRLaW5kKCkgPD0gSUtfTGFzdE9wSW5pdDsKKyAgfQorCisgIC8vIENsb25lIC0gQ2xvbmUgdGhpcyBvcGVyYXRvciwgcmVwbGFjaW5nIGFyZ3VtZW50cyB3aXRoIHRoZSBuZXcgbGlzdAorICB2aXJ0dWFsIE9wSW5pdCAqY2xvbmUoQXJyYXlSZWY8SW5pdCAqPiBPcGVyYW5kcykgY29uc3QgPSAwOworCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgSW5pdCAqZ2V0T3BlcmFuZCh1bnNpZ25lZCBpKSBjb25zdCA9IDA7CisKKyAgSW5pdCAqZ2V0Qml0KHVuc2lnbmVkIEJpdCkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gIW9wIChYKSAtIFRyYW5zZm9ybSBhbiBpbml0LgorLy8vCitjbGFzcyBVbk9wSW5pdCA6IHB1YmxpYyBPcEluaXQsIHB1YmxpYyBGb2xkaW5nU2V0Tm9kZSB7CitwdWJsaWM6CisgIGVudW0gVW5hcnlPcCA6IHVpbnQ4X3QgeyBDQVNULCBIRUFELCBUQUlMLCBTSVpFLCBFTVBUWSB9OworCitwcml2YXRlOgorICBJbml0ICpMSFM7CisKKyAgVW5PcEluaXQoVW5hcnlPcCBvcGMsIEluaXQgKmxocywgUmVjVHkgKlR5cGUpCisgICAgOiBPcEluaXQoSUtfVW5PcEluaXQsIFR5cGUsIG9wYyksIExIUyhsaHMpIHt9CisKK3B1YmxpYzoKKyAgVW5PcEluaXQoY29uc3QgVW5PcEluaXQgJikgPSBkZWxldGU7CisgIFVuT3BJbml0ICZvcGVyYXRvcj0oY29uc3QgVW5PcEluaXQgJikgPSBkZWxldGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbml0ICpJKSB7CisgICAgcmV0dXJuIEktPmdldEtpbmQoKSA9PSBJS19Vbk9wSW5pdDsKKyAgfQorCisgIHN0YXRpYyBVbk9wSW5pdCAqZ2V0KFVuYXJ5T3Agb3BjLCBJbml0ICpsaHMsIFJlY1R5ICpUeXBlKTsKKworICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworCisgIC8vIENsb25lIC0gQ2xvbmUgdGhpcyBvcGVyYXRvciwgcmVwbGFjaW5nIGFyZ3VtZW50cyB3aXRoIHRoZSBuZXcgbGlzdAorICBPcEluaXQgKmNsb25lKEFycmF5UmVmPEluaXQgKj4gT3BlcmFuZHMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBhc3NlcnQoT3BlcmFuZHMuc2l6ZSgpID09IDEgJiYKKyAgICAgICAgICAgIldyb25nIG51bWJlciBvZiBvcGVyYW5kcyBmb3IgdW5hcnkgb3BlcmF0aW9uIik7CisgICAgcmV0dXJuIFVuT3BJbml0OjpnZXQoZ2V0T3Bjb2RlKCksICpPcGVyYW5kcy5iZWdpbigpLCBnZXRUeXBlKCkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAxOyB9CisKKyAgSW5pdCAqZ2V0T3BlcmFuZCh1bnNpZ25lZCBpKSBjb25zdCBvdmVycmlkZSB7CisgICAgYXNzZXJ0KGkgPT0gMCAmJiAiSW52YWxpZCBvcGVyYW5kIGlkIGZvciB1bmFyeSBvcGVyYXRvciIpOworICAgIHJldHVybiBnZXRPcGVyYW5kKCk7CisgIH0KKworICBVbmFyeU9wIGdldE9wY29kZSgpIGNvbnN0IHsgcmV0dXJuIChVbmFyeU9wKU9wYzsgfQorICBJbml0ICpnZXRPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gTEhTOyB9CisKKyAgLy8gRm9sZCAtIElmIHBvc3NpYmxlLCBmb2xkIHRoaXMgdG8gYSBzaW1wbGVyIGluaXQuICBSZXR1cm4gdGhpcyBpZiBub3QKKyAgLy8gcG9zc2libGUgdG8gZm9sZC4KKyAgSW5pdCAqRm9sZChSZWNvcmQgKkN1clJlYywgYm9vbCBJc0ZpbmFsID0gZmFsc2UpIGNvbnN0OworCisgIEluaXQgKnJlc29sdmVSZWZlcmVuY2VzKFJlc29sdmVyICZSKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vICFvcCAoWCwgWSkgLSBDb21iaW5lIHR3byBpbml0cy4KK2NsYXNzIEJpbk9wSW5pdCA6IHB1YmxpYyBPcEluaXQsIHB1YmxpYyBGb2xkaW5nU2V0Tm9kZSB7CitwdWJsaWM6CisgIGVudW0gQmluYXJ5T3AgOiB1aW50OF90IHsgQURELCBBTkQsIE9SLCBTSEwsIFNSQSwgU1JMLCBMSVNUQ09OQ0FULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUUkNPTkNBVCwgQ09OQ0FULCBFUSwgTkUsIExFLCBMVCwgR0UsIEdUIH07CisKK3ByaXZhdGU6CisgIEluaXQgKkxIUywgKlJIUzsKKworICBCaW5PcEluaXQoQmluYXJ5T3Agb3BjLCBJbml0ICpsaHMsIEluaXQgKnJocywgUmVjVHkgKlR5cGUpIDoKKyAgICAgIE9wSW5pdChJS19CaW5PcEluaXQsIFR5cGUsIG9wYyksIExIUyhsaHMpLCBSSFMocmhzKSB7fQorCitwdWJsaWM6CisgIEJpbk9wSW5pdChjb25zdCBCaW5PcEluaXQgJikgPSBkZWxldGU7CisgIEJpbk9wSW5pdCAmb3BlcmF0b3I9KGNvbnN0IEJpbk9wSW5pdCAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluaXQgKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0S2luZCgpID09IElLX0Jpbk9wSW5pdDsKKyAgfQorCisgIHN0YXRpYyBCaW5PcEluaXQgKmdldChCaW5hcnlPcCBvcGMsIEluaXQgKmxocywgSW5pdCAqcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVjVHkgKlR5cGUpOworICBzdGF0aWMgSW5pdCAqZ2V0U3RyQ29uY2F0KEluaXQgKmxocywgSW5pdCAqcmhzKTsKKworICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworCisgIC8vIENsb25lIC0gQ2xvbmUgdGhpcyBvcGVyYXRvciwgcmVwbGFjaW5nIGFyZ3VtZW50cyB3aXRoIHRoZSBuZXcgbGlzdAorICBPcEluaXQgKmNsb25lKEFycmF5UmVmPEluaXQgKj4gT3BlcmFuZHMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBhc3NlcnQoT3BlcmFuZHMuc2l6ZSgpID09IDIgJiYKKyAgICAgICAgICAgIldyb25nIG51bWJlciBvZiBvcGVyYW5kcyBmb3IgYmluYXJ5IG9wZXJhdGlvbiIpOworICAgIHJldHVybiBCaW5PcEluaXQ6OmdldChnZXRPcGNvZGUoKSwgT3BlcmFuZHNbMF0sIE9wZXJhbmRzWzFdLCBnZXRUeXBlKCkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAyOyB9CisgIEluaXQgKmdldE9wZXJhbmQodW5zaWduZWQgaSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHN3aXRjaCAoaSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgb3BlcmFuZCBpZCBmb3IgYmluYXJ5IG9wZXJhdG9yIik7CisgICAgY2FzZSAwOiByZXR1cm4gZ2V0TEhTKCk7CisgICAgY2FzZSAxOiByZXR1cm4gZ2V0UkhTKCk7CisgICAgfQorICB9CisKKyAgQmluYXJ5T3AgZ2V0T3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gKEJpbmFyeU9wKU9wYzsgfQorICBJbml0ICpnZXRMSFMoKSBjb25zdCB7IHJldHVybiBMSFM7IH0KKyAgSW5pdCAqZ2V0UkhTKCkgY29uc3QgeyByZXR1cm4gUkhTOyB9CisKKyAgLy8gRm9sZCAtIElmIHBvc3NpYmxlLCBmb2xkIHRoaXMgdG8gYSBzaW1wbGVyIGluaXQuICBSZXR1cm4gdGhpcyBpZiBub3QKKyAgLy8gcG9zc2libGUgdG8gZm9sZC4KKyAgSW5pdCAqRm9sZChSZWNvcmQgKkN1clJlYykgY29uc3Q7CisKKyAgSW5pdCAqcmVzb2x2ZVJlZmVyZW5jZXMoUmVzb2x2ZXIgJlIpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gIW9wIChYLCBZLCBaKSAtIENvbWJpbmUgdHdvIGluaXRzLgorY2xhc3MgVGVybk9wSW5pdCA6IHB1YmxpYyBPcEluaXQsIHB1YmxpYyBGb2xkaW5nU2V0Tm9kZSB7CitwdWJsaWM6CisgIGVudW0gVGVybmFyeU9wIDogdWludDhfdCB7IFNVQlNULCBGT1JFQUNILCBJRiwgREFHIH07CisKK3ByaXZhdGU6CisgIEluaXQgKkxIUywgKk1IUywgKlJIUzsKKworICBUZXJuT3BJbml0KFRlcm5hcnlPcCBvcGMsIEluaXQgKmxocywgSW5pdCAqbWhzLCBJbml0ICpyaHMsCisgICAgICAgICAgICAgUmVjVHkgKlR5cGUpIDoKKyAgICAgIE9wSW5pdChJS19UZXJuT3BJbml0LCBUeXBlLCBvcGMpLCBMSFMobGhzKSwgTUhTKG1ocyksIFJIUyhyaHMpIHt9CisKK3B1YmxpYzoKKyAgVGVybk9wSW5pdChjb25zdCBUZXJuT3BJbml0ICYpID0gZGVsZXRlOworICBUZXJuT3BJbml0ICZvcGVyYXRvcj0oY29uc3QgVGVybk9wSW5pdCAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluaXQgKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0S2luZCgpID09IElLX1Rlcm5PcEluaXQ7CisgIH0KKworICBzdGF0aWMgVGVybk9wSW5pdCAqZ2V0KFRlcm5hcnlPcCBvcGMsIEluaXQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbml0ICptaHMsIEluaXQgKnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZWNUeSAqVHlwZSk7CisKKyAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdDsKKworICAvLyBDbG9uZSAtIENsb25lIHRoaXMgb3BlcmF0b3IsIHJlcGxhY2luZyBhcmd1bWVudHMgd2l0aCB0aGUgbmV3IGxpc3QKKyAgT3BJbml0ICpjbG9uZShBcnJheVJlZjxJbml0ICo+IE9wZXJhbmRzKSBjb25zdCBvdmVycmlkZSB7CisgICAgYXNzZXJ0KE9wZXJhbmRzLnNpemUoKSA9PSAzICYmCisgICAgICAgICAgICJXcm9uZyBudW1iZXIgb2Ygb3BlcmFuZHMgZm9yIHRlcm5hcnkgb3BlcmF0aW9uIik7CisgICAgcmV0dXJuIFRlcm5PcEluaXQ6OmdldChnZXRPcGNvZGUoKSwgT3BlcmFuZHNbMF0sIE9wZXJhbmRzWzFdLCBPcGVyYW5kc1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFR5cGUoKSk7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIDM7IH0KKyAgSW5pdCAqZ2V0T3BlcmFuZCh1bnNpZ25lZCBpKSBjb25zdCBvdmVycmlkZSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBvcGVyYW5kIGlkIGZvciB0ZXJuYXJ5IG9wZXJhdG9yIik7CisgICAgY2FzZSAwOiByZXR1cm4gZ2V0TEhTKCk7CisgICAgY2FzZSAxOiByZXR1cm4gZ2V0TUhTKCk7CisgICAgY2FzZSAyOiByZXR1cm4gZ2V0UkhTKCk7CisgICAgfQorICB9CisKKyAgVGVybmFyeU9wIGdldE9wY29kZSgpIGNvbnN0IHsgcmV0dXJuIChUZXJuYXJ5T3ApT3BjOyB9CisgIEluaXQgKmdldExIUygpIGNvbnN0IHsgcmV0dXJuIExIUzsgfQorICBJbml0ICpnZXRNSFMoKSBjb25zdCB7IHJldHVybiBNSFM7IH0KKyAgSW5pdCAqZ2V0UkhTKCkgY29uc3QgeyByZXR1cm4gUkhTOyB9CisKKyAgLy8gRm9sZCAtIElmIHBvc3NpYmxlLCBmb2xkIHRoaXMgdG8gYSBzaW1wbGVyIGluaXQuICBSZXR1cm4gdGhpcyBpZiBub3QKKyAgLy8gcG9zc2libGUgdG8gZm9sZC4KKyAgSW5pdCAqRm9sZChSZWNvcmQgKkN1clJlYykgY29uc3Q7CisKKyAgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBMSFMtPmlzQ29tcGxldGUoKSAmJiBNSFMtPmlzQ29tcGxldGUoKSAmJiBSSFMtPmlzQ29tcGxldGUoKTsKKyAgfQorCisgIEluaXQgKnJlc29sdmVSZWZlcmVuY2VzKFJlc29sdmVyICZSKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vICFmb2xkbCAoYSwgYiwgZXhwciwgc3RhcnQsIGxzdCkgLSBGb2xkIG92ZXIgYSBsaXN0LgorY2xhc3MgRm9sZE9wSW5pdCA6IHB1YmxpYyBUeXBlZEluaXQsIHB1YmxpYyBGb2xkaW5nU2V0Tm9kZSB7Citwcml2YXRlOgorICBJbml0ICpTdGFydDsKKyAgSW5pdCAqTGlzdDsKKyAgSW5pdCAqQTsKKyAgSW5pdCAqQjsKKyAgSW5pdCAqRXhwcjsKKworICBGb2xkT3BJbml0KEluaXQgKlN0YXJ0LCBJbml0ICpMaXN0LCBJbml0ICpBLCBJbml0ICpCLCBJbml0ICpFeHByLCBSZWNUeSAqVHlwZSkKKyAgICAgIDogVHlwZWRJbml0KElLX0ZvbGRPcEluaXQsIFR5cGUpLCBTdGFydChTdGFydCksIExpc3QoTGlzdCksIEEoQSksIEIoQiksCisgICAgICAgIEV4cHIoRXhwcikge30KKworcHVibGljOgorICBGb2xkT3BJbml0KGNvbnN0IEZvbGRPcEluaXQgJikgPSBkZWxldGU7CisgIEZvbGRPcEluaXQgJm9wZXJhdG9yPShjb25zdCBGb2xkT3BJbml0ICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5pdCAqSSkgeyByZXR1cm4gSS0+Z2V0S2luZCgpID09IElLX0ZvbGRPcEluaXQ7IH0KKworICBzdGF0aWMgRm9sZE9wSW5pdCAqZ2V0KEluaXQgKlN0YXJ0LCBJbml0ICpMaXN0LCBJbml0ICpBLCBJbml0ICpCLCBJbml0ICpFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlY1R5ICpUeXBlKTsKKworICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworCisgIC8vIEZvbGQgLSBJZiBwb3NzaWJsZSwgZm9sZCB0aGlzIHRvIGEgc2ltcGxlciBpbml0LiAgUmV0dXJuIHRoaXMgaWYgbm90CisgIC8vIHBvc3NpYmxlIHRvIGZvbGQuCisgIEluaXQgKkZvbGQoUmVjb3JkICpDdXJSZWMpIGNvbnN0OworCisgIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgSW5pdCAqcmVzb2x2ZVJlZmVyZW5jZXMoUmVzb2x2ZXIgJlIpIGNvbnN0IG92ZXJyaWRlOworCisgIEluaXQgKmdldEJpdCh1bnNpZ25lZCBCaXQpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gIWlzYTx0eXBlPihleHByKSAtIER5bmFtaWNhbGx5IGRldGVybWluZSB0aGUgdHlwZSBvZiBhbiBleHByZXNzaW9uLgorY2xhc3MgSXNBT3BJbml0IDogcHVibGljIFR5cGVkSW5pdCwgcHVibGljIEZvbGRpbmdTZXROb2RlIHsKK3ByaXZhdGU6CisgIFJlY1R5ICpDaGVja1R5cGU7CisgIEluaXQgKkV4cHI7CisKKyAgSXNBT3BJbml0KFJlY1R5ICpDaGVja1R5cGUsIEluaXQgKkV4cHIpCisgICAgICA6IFR5cGVkSW5pdChJS19Jc0FPcEluaXQsIEludFJlY1R5OjpnZXQoKSksIENoZWNrVHlwZShDaGVja1R5cGUpLAorICAgICAgICBFeHByKEV4cHIpIHt9CisKK3B1YmxpYzoKKyAgSXNBT3BJbml0KGNvbnN0IElzQU9wSW5pdCAmKSA9IGRlbGV0ZTsKKyAgSXNBT3BJbml0ICZvcGVyYXRvcj0oY29uc3QgSXNBT3BJbml0ICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5pdCAqSSkgeyByZXR1cm4gSS0+Z2V0S2luZCgpID09IElLX0lzQU9wSW5pdDsgfQorCisgIHN0YXRpYyBJc0FPcEluaXQgKmdldChSZWNUeSAqQ2hlY2tUeXBlLCBJbml0ICpFeHByKTsKKworICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworCisgIC8vIEZvbGQgLSBJZiBwb3NzaWJsZSwgZm9sZCB0aGlzIHRvIGEgc2ltcGxlciBpbml0LiAgUmV0dXJuIHRoaXMgaWYgbm90CisgIC8vIHBvc3NpYmxlIHRvIGZvbGQuCisgIEluaXQgKkZvbGQoKSBjb25zdDsKKworICBib29sIGlzQ29tcGxldGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorCisgIEluaXQgKnJlc29sdmVSZWZlcmVuY2VzKFJlc29sdmVyICZSKSBjb25zdCBvdmVycmlkZTsKKworICBJbml0ICpnZXRCaXQodW5zaWduZWQgQml0KSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vICdPcGNvZGUnIC0gUmVwcmVzZW50IGEgcmVmZXJlbmNlIHRvIGFuIGVudGlyZSB2YXJpYWJsZSBvYmplY3QuCitjbGFzcyBWYXJJbml0IDogcHVibGljIFR5cGVkSW5pdCB7CisgIEluaXQgKlZhck5hbWU7CisKKyAgZXhwbGljaXQgVmFySW5pdChJbml0ICpWTiwgUmVjVHkgKlQpCisgICAgICA6IFR5cGVkSW5pdChJS19WYXJJbml0LCBUKSwgVmFyTmFtZShWTikge30KKworcHVibGljOgorICBWYXJJbml0KGNvbnN0IFZhckluaXQgJikgPSBkZWxldGU7CisgIFZhckluaXQgJm9wZXJhdG9yPShjb25zdCBWYXJJbml0ICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5pdCAqSSkgeworICAgIHJldHVybiBJLT5nZXRLaW5kKCkgPT0gSUtfVmFySW5pdDsKKyAgfQorCisgIHN0YXRpYyBWYXJJbml0ICpnZXQoU3RyaW5nUmVmIFZOLCBSZWNUeSAqVCk7CisgIHN0YXRpYyBWYXJJbml0ICpnZXQoSW5pdCAqVk4sIFJlY1R5ICpUKTsKKworICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0OworICBJbml0ICpnZXROYW1lSW5pdCgpIGNvbnN0IHsgcmV0dXJuIFZhck5hbWU7IH0KKworICBzdGQ6OnN0cmluZyBnZXROYW1lSW5pdEFzU3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBnZXROYW1lSW5pdCgpLT5nZXRBc1VucXVvdGVkU3RyaW5nKCk7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBieSBjbGFzc2VzIHRoYXQgcmVmZXIgdG8gb3RoZXIKKyAgLy8vIHZhcmlhYmxlcyB3aGljaCBtYXkgbm90IGJlIGRlZmluZWQgYXQgdGhlIHRpbWUgdGhleSBleHByZXNzaW9uIGlzIGZvcm1lZC4KKyAgLy8vIElmIGEgdmFsdWUgaXMgc2V0IGZvciB0aGUgdmFyaWFibGUgbGF0ZXIsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uCisgIC8vLyB1c2VycyBvZiB0aGUgdmFsdWUgdG8gYWxsb3cgdGhlIHZhbHVlIHRvIHByb3BhZ2F0ZSBvdXQuCisgIC8vLworICBJbml0ICpyZXNvbHZlUmVmZXJlbmNlcyhSZXNvbHZlciAmUikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgSW5pdCAqZ2V0Qml0KHVuc2lnbmVkIEJpdCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBnZXROYW1lKCk7IH0KK307CisKKy8vLyBPcGNvZGV7MH0gLSBSZXByZXNlbnQgYWNjZXNzIHRvIG9uZSBiaXQgb2YgYSB2YXJpYWJsZSBvciBmaWVsZC4KK2NsYXNzIFZhckJpdEluaXQgZmluYWwgOiBwdWJsaWMgVHlwZWRJbml0IHsKKyAgVHlwZWRJbml0ICpUSTsKKyAgdW5zaWduZWQgQml0OworCisgIFZhckJpdEluaXQoVHlwZWRJbml0ICpULCB1bnNpZ25lZCBCKQorICAgICAgOiBUeXBlZEluaXQoSUtfVmFyQml0SW5pdCwgQml0UmVjVHk6OmdldCgpKSwgVEkoVCksIEJpdChCKSB7CisgICAgYXNzZXJ0KFQtPmdldFR5cGUoKSAmJgorICAgICAgICAgICAoaXNhPEludFJlY1R5PihULT5nZXRUeXBlKCkpIHx8CisgICAgICAgICAgICAoaXNhPEJpdHNSZWNUeT4oVC0+Z2V0VHlwZSgpKSAmJgorICAgICAgICAgICAgIGNhc3Q8Qml0c1JlY1R5PihULT5nZXRUeXBlKCkpLT5nZXROdW1CaXRzKCkgPiBCKSkgJiYKKyAgICAgICAgICAgIklsbGVnYWwgVmFyQml0SW5pdCBleHByZXNzaW9uISIpOworICB9CisKK3B1YmxpYzoKKyAgVmFyQml0SW5pdChjb25zdCBWYXJCaXRJbml0ICYpID0gZGVsZXRlOworICBWYXJCaXRJbml0ICZvcGVyYXRvcj0oY29uc3QgVmFyQml0SW5pdCAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluaXQgKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0S2luZCgpID09IElLX1ZhckJpdEluaXQ7CisgIH0KKworICBzdGF0aWMgVmFyQml0SW5pdCAqZ2V0KFR5cGVkSW5pdCAqVCwgdW5zaWduZWQgQik7CisKKyAgSW5pdCAqZ2V0Qml0VmFyKCkgY29uc3QgeyByZXR1cm4gVEk7IH0KKyAgdW5zaWduZWQgZ2V0Qml0TnVtKCkgY29uc3QgeyByZXR1cm4gQml0OyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgSW5pdCAqcmVzb2x2ZVJlZmVyZW5jZXMoUmVzb2x2ZXIgJlIpIGNvbnN0IG92ZXJyaWRlOworCisgIEluaXQgKmdldEJpdCh1bnNpZ25lZCBCKSBjb25zdCBvdmVycmlkZSB7CisgICAgYXNzZXJ0KEIgPCAxICYmICJCaXQgaW5kZXggb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBjb25zdF9jYXN0PFZhckJpdEluaXQqPih0aGlzKTsKKyAgfQorfTsKKworLy8vIExpc3RbNF0gLSBSZXByZXNlbnQgYWNjZXNzIHRvIG9uZSBlbGVtZW50IG9mIGEgdmFyIG9yCisvLy8gZmllbGQuCitjbGFzcyBWYXJMaXN0RWxlbWVudEluaXQgOiBwdWJsaWMgVHlwZWRJbml0IHsKKyAgVHlwZWRJbml0ICpUSTsKKyAgdW5zaWduZWQgRWxlbWVudDsKKworICBWYXJMaXN0RWxlbWVudEluaXQoVHlwZWRJbml0ICpULCB1bnNpZ25lZCBFKQorICAgICAgOiBUeXBlZEluaXQoSUtfVmFyTGlzdEVsZW1lbnRJbml0LAorICAgICAgICAgICAgICAgICAgY2FzdDxMaXN0UmVjVHk+KFQtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpLAorICAgICAgICBUSShUKSwgRWxlbWVudChFKSB7CisgICAgYXNzZXJ0KFQtPmdldFR5cGUoKSAmJiBpc2E8TGlzdFJlY1R5PihULT5nZXRUeXBlKCkpICYmCisgICAgICAgICAgICJJbGxlZ2FsIFZhckJpdEluaXQgZXhwcmVzc2lvbiEiKTsKKyAgfQorCitwdWJsaWM6CisgIFZhckxpc3RFbGVtZW50SW5pdChjb25zdCBWYXJMaXN0RWxlbWVudEluaXQgJikgPSBkZWxldGU7CisgIFZhckxpc3RFbGVtZW50SW5pdCAmb3BlcmF0b3I9KGNvbnN0IFZhckxpc3RFbGVtZW50SW5pdCAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluaXQgKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0S2luZCgpID09IElLX1Zhckxpc3RFbGVtZW50SW5pdDsKKyAgfQorCisgIHN0YXRpYyBWYXJMaXN0RWxlbWVudEluaXQgKmdldChUeXBlZEluaXQgKlQsIHVuc2lnbmVkIEUpOworCisgIFR5cGVkSW5pdCAqZ2V0VmFyaWFibGUoKSBjb25zdCB7IHJldHVybiBUSTsgfQorICB1bnNpZ25lZCBnZXRFbGVtZW50TnVtKCkgY29uc3QgeyByZXR1cm4gRWxlbWVudDsgfQorCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIEluaXQgKnJlc29sdmVSZWZlcmVuY2VzKFJlc29sdmVyICZSKSBjb25zdCBvdmVycmlkZTsKKworICBJbml0ICpnZXRCaXQodW5zaWduZWQgQml0KSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyBBTCAtIFJlcHJlc2VudCBhIHJlZmVyZW5jZSB0byBhICdkZWYnIGluIHRoZSBkZXNjcmlwdGlvbgorY2xhc3MgRGVmSW5pdCA6IHB1YmxpYyBUeXBlZEluaXQgeworICBmcmllbmQgY2xhc3MgUmVjb3JkOworCisgIFJlY29yZCAqRGVmOworCisgIGV4cGxpY2l0IERlZkluaXQoUmVjb3JkICpEKTsKKworcHVibGljOgorICBEZWZJbml0KGNvbnN0IERlZkluaXQgJikgPSBkZWxldGU7CisgIERlZkluaXQgJm9wZXJhdG9yPShjb25zdCBEZWZJbml0ICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5pdCAqSSkgeworICAgIHJldHVybiBJLT5nZXRLaW5kKCkgPT0gSUtfRGVmSW5pdDsKKyAgfQorCisgIHN0YXRpYyBEZWZJbml0ICpnZXQoUmVjb3JkKik7CisKKyAgSW5pdCAqY29udmVydEluaXRpYWxpemVyVG8oUmVjVHkgKlR5KSBjb25zdCBvdmVycmlkZTsKKworICBSZWNvcmQgKmdldERlZigpIGNvbnN0IHsgcmV0dXJuIERlZjsgfQorCisgIC8vdmlydHVhbCBJbml0ICpjb252ZXJ0SW5pdGlhbGl6ZXJCaXRSYW5nZShBcnJheVJlZjx1bnNpZ25lZD4gQml0cyk7CisKKyAgUmVjVHkgKmdldEZpZWxkVHlwZShTdHJpbmdJbml0ICpGaWVsZE5hbWUpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgaXNDb25jcmV0ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKworICBJbml0ICpnZXRCaXQodW5zaWduZWQgQml0KSBjb25zdCBvdmVycmlkZSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiSWxsZWdhbCBiaXQgcmVmZXJlbmNlIG9mZiBkZWYiKTsKKyAgfQorfTsKKworLy8vIGNsYXNzbmFtZTx0YXJncy4uLj4gLSBSZXByZXNlbnQgYW4gdW5pbnN0YW50aWF0ZWQgYW5vbnltb3VzIGNsYXNzCisvLy8gaW5zdGFudGlhdGlvbi4KK2NsYXNzIFZhckRlZkluaXQgZmluYWwgOiBwdWJsaWMgVHlwZWRJbml0LCBwdWJsaWMgRm9sZGluZ1NldE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFRyYWlsaW5nT2JqZWN0czxWYXJEZWZJbml0LCBJbml0ICo+IHsKKyAgUmVjb3JkICpDbGFzczsKKyAgRGVmSW5pdCAqRGVmID0gbnVsbHB0cjsgLy8gYWZ0ZXIgaW5zdGFudGlhdGlvbgorICB1bnNpZ25lZCBOdW1BcmdzOworCisgIGV4cGxpY2l0IFZhckRlZkluaXQoUmVjb3JkICpDbGFzcywgdW5zaWduZWQgTikKKyAgICA6IFR5cGVkSW5pdChJS19WYXJEZWZJbml0LCBSZWNvcmRSZWNUeTo6Z2V0KENsYXNzKSksIENsYXNzKENsYXNzKSwgTnVtQXJncyhOKSB7fQorCisgIERlZkluaXQgKmluc3RhbnRpYXRlKCk7CisKK3B1YmxpYzoKKyAgVmFyRGVmSW5pdChjb25zdCBWYXJEZWZJbml0ICYpID0gZGVsZXRlOworICBWYXJEZWZJbml0ICZvcGVyYXRvcj0oY29uc3QgVmFyRGVmSW5pdCAmKSA9IGRlbGV0ZTsKKworICAvLyBEbyBub3QgdXNlIHNpemVkIGRlYWxsb2NhdGlvbiBkdWUgdG8gdHJhaWxpbmcgb2JqZWN0cy4KKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqcCkgeyA6Om9wZXJhdG9yIGRlbGV0ZShwKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5pdCAqSSkgeworICAgIHJldHVybiBJLT5nZXRLaW5kKCkgPT0gSUtfVmFyRGVmSW5pdDsKKyAgfQorICBzdGF0aWMgVmFyRGVmSW5pdCAqZ2V0KFJlY29yZCAqQ2xhc3MsIEFycmF5UmVmPEluaXQgKj4gQXJncyk7CisKKyAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdDsKKworICBJbml0ICpyZXNvbHZlUmVmZXJlbmNlcyhSZXNvbHZlciAmUikgY29uc3Qgb3ZlcnJpZGU7CisgIEluaXQgKkZvbGQoKSBjb25zdDsKKworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworCisgIEluaXQgKmdldEFyZyh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBOdW1BcmdzICYmICJBcmd1bWVudCBpbmRleCBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxJbml0ICo+KClbaV07CisgIH0KKworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IEluaXQgKmNvbnN0ICo7CisKKyAgY29uc3RfaXRlcmF0b3IgYXJnc19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxJbml0ICo+KCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYXJnc19lbmQgICgpIGNvbnN0IHsgcmV0dXJuIGFyZ3NfYmVnaW4oKSArIE51bUFyZ3M7IH0KKworICBzaXplX3QgICAgICAgICBhcmdzX3NpemUgKCkgY29uc3QgeyByZXR1cm4gTnVtQXJnczsgfQorICBib29sICAgICAgICAgICBhcmdzX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gTnVtQXJncyA9PSAwOyB9CisKKyAgQXJyYXlSZWY8SW5pdCAqPiBhcmdzKCkgY29uc3QgeyByZXR1cm4gbWFrZUFycmF5UmVmKGFyZ3NfYmVnaW4oKSwgTnVtQXJncyk7IH0KKworICBJbml0ICpnZXRCaXQodW5zaWduZWQgQml0KSBjb25zdCBvdmVycmlkZSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiSWxsZWdhbCBiaXQgcmVmZXJlbmNlIG9mZiBhbm9ueW1vdXMgZGVmIik7CisgIH0KK307CisKKy8vLyBYLlkgLSBSZXByZXNlbnQgYSByZWZlcmVuY2UgdG8gYSBzdWJmaWVsZCBvZiBhIHZhcmlhYmxlCitjbGFzcyBGaWVsZEluaXQgOiBwdWJsaWMgVHlwZWRJbml0IHsKKyAgSW5pdCAqUmVjOyAgICAgICAgICAgICAgICAvLyBSZWNvcmQgd2UgYXJlIHJlZmVycmluZyB0bworICBTdHJpbmdJbml0ICpGaWVsZE5hbWU7ICAgIC8vIEZpZWxkIHdlIGFyZSBhY2Nlc3NpbmcKKworICBGaWVsZEluaXQoSW5pdCAqUiwgU3RyaW5nSW5pdCAqRk4pCisgICAgICA6IFR5cGVkSW5pdChJS19GaWVsZEluaXQsIFItPmdldEZpZWxkVHlwZShGTikpLCBSZWMoUiksIEZpZWxkTmFtZShGTikgeworICAgIGFzc2VydChnZXRUeXBlKCkgJiYgIkZpZWxkSW5pdCB3aXRoIG5vbi1yZWNvcmQgdHlwZSEiKTsKKyAgfQorCitwdWJsaWM6CisgIEZpZWxkSW5pdChjb25zdCBGaWVsZEluaXQgJikgPSBkZWxldGU7CisgIEZpZWxkSW5pdCAmb3BlcmF0b3I9KGNvbnN0IEZpZWxkSW5pdCAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluaXQgKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0S2luZCgpID09IElLX0ZpZWxkSW5pdDsKKyAgfQorCisgIHN0YXRpYyBGaWVsZEluaXQgKmdldChJbml0ICpSLCBTdHJpbmdJbml0ICpGTik7CisKKyAgSW5pdCAqZ2V0UmVjb3JkKCkgY29uc3QgeyByZXR1cm4gUmVjOyB9CisgIFN0cmluZ0luaXQgKmdldEZpZWxkTmFtZSgpIGNvbnN0IHsgcmV0dXJuIEZpZWxkTmFtZTsgfQorCisgIEluaXQgKmdldEJpdCh1bnNpZ25lZCBCaXQpIGNvbnN0IG92ZXJyaWRlOworCisgIEluaXQgKnJlc29sdmVSZWZlcmVuY2VzKFJlc29sdmVyICZSKSBjb25zdCBvdmVycmlkZTsKKyAgSW5pdCAqRm9sZChSZWNvcmQgKkN1clJlYykgY29uc3Q7CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFJlYy0+Z2V0QXNTdHJpbmcoKSArICIuIiArIEZpZWxkTmFtZS0+Z2V0VmFsdWUoKS5zdHIoKTsKKyAgfQorfTsKKworLy8vICh2IGEsIGIpIC0gUmVwcmVzZW50IGEgREFHIHRyZWUgdmFsdWUuICBEQUcgaW5pdHMgYXJlIHJlcXVpcmVkCisvLy8gdG8gaGF2ZSBhdCBsZWFzdCBvbmUgdmFsdWUgdGhlbiBhIChwb3NzaWJseSBlbXB0eSkgbGlzdCBvZiBhcmd1bWVudHMuICBFYWNoCisvLy8gYXJndW1lbnQgY2FuIGhhdmUgYSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdC4KK2NsYXNzIERhZ0luaXQgZmluYWwgOiBwdWJsaWMgVHlwZWRJbml0LCBwdWJsaWMgRm9sZGluZ1NldE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFRyYWlsaW5nT2JqZWN0czxEYWdJbml0LCBJbml0ICosIFN0cmluZ0luaXQgKj4geworICBmcmllbmQgVHJhaWxpbmdPYmplY3RzOworCisgIEluaXQgKlZhbDsKKyAgU3RyaW5nSW5pdCAqVmFsTmFtZTsKKyAgdW5zaWduZWQgTnVtQXJnczsKKyAgdW5zaWduZWQgTnVtQXJnTmFtZXM7CisKKyAgRGFnSW5pdChJbml0ICpWLCBTdHJpbmdJbml0ICpWTiwgdW5zaWduZWQgTnVtQXJncywgdW5zaWduZWQgTnVtQXJnTmFtZXMpCisgICAgICA6IFR5cGVkSW5pdChJS19EYWdJbml0LCBEYWdSZWNUeTo6Z2V0KCkpLCBWYWwoViksIFZhbE5hbWUoVk4pLAorICAgICAgICBOdW1BcmdzKE51bUFyZ3MpLCBOdW1BcmdOYW1lcyhOdW1BcmdOYW1lcykge30KKworICBzaXplX3QgbnVtVHJhaWxpbmdPYmplY3RzKE92ZXJsb2FkVG9rZW48SW5pdCAqPikgY29uc3QgeyByZXR1cm4gTnVtQXJnczsgfQorCitwdWJsaWM6CisgIERhZ0luaXQoY29uc3QgRGFnSW5pdCAmKSA9IGRlbGV0ZTsKKyAgRGFnSW5pdCAmb3BlcmF0b3I9KGNvbnN0IERhZ0luaXQgJikgPSBkZWxldGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbml0ICpJKSB7CisgICAgcmV0dXJuIEktPmdldEtpbmQoKSA9PSBJS19EYWdJbml0OworICB9CisKKyAgc3RhdGljIERhZ0luaXQgKmdldChJbml0ICpWLCBTdHJpbmdJbml0ICpWTiwgQXJyYXlSZWY8SW5pdCAqPiBBcmdSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTdHJpbmdJbml0Kj4gTmFtZVJhbmdlKTsKKyAgc3RhdGljIERhZ0luaXQgKmdldChJbml0ICpWLCBTdHJpbmdJbml0ICpWTiwKKyAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxzdGQ6OnBhaXI8SW5pdCosIFN0cmluZ0luaXQqPj4gQXJncyk7CisKKyAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdDsKKworICBJbml0ICpnZXRPcGVyYXRvcigpIGNvbnN0IHsgcmV0dXJuIFZhbDsgfQorCisgIFN0cmluZ0luaXQgKmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBWYWxOYW1lOyB9CisKKyAgU3RyaW5nUmVmIGdldE5hbWVTdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbE5hbWUgPyBWYWxOYW1lLT5nZXRWYWx1ZSgpIDogU3RyaW5nUmVmKCk7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3QgeyByZXR1cm4gTnVtQXJnczsgfQorCisgIEluaXQgKmdldEFyZyh1bnNpZ25lZCBOdW0pIGNvbnN0IHsKKyAgICBhc3NlcnQoTnVtIDwgTnVtQXJncyAmJiAiQXJnIG51bWJlciBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxJbml0ICo+KClbTnVtXTsKKyAgfQorCisgIFN0cmluZ0luaXQgKmdldEFyZ05hbWUodW5zaWduZWQgTnVtKSBjb25zdCB7CisgICAgYXNzZXJ0KE51bSA8IE51bUFyZ05hbWVzICYmICJBcmcgbnVtYmVyIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPFN0cmluZ0luaXQgKj4oKVtOdW1dOworICB9CisKKyAgU3RyaW5nUmVmIGdldEFyZ05hbWVTdHIodW5zaWduZWQgTnVtKSBjb25zdCB7CisgICAgU3RyaW5nSW5pdCAqSW5pdCA9IGdldEFyZ05hbWUoTnVtKTsKKyAgICByZXR1cm4gSW5pdCA/IEluaXQtPmdldFZhbHVlKCkgOiBTdHJpbmdSZWYoKTsKKyAgfQorCisgIEFycmF5UmVmPEluaXQgKj4gZ2V0QXJncygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZUFycmF5UmVmKGdldFRyYWlsaW5nT2JqZWN0czxJbml0ICo+KCksIE51bUFyZ3MpOworICB9CisKKyAgQXJyYXlSZWY8U3RyaW5nSW5pdCAqPiBnZXRBcmdOYW1lcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZUFycmF5UmVmKGdldFRyYWlsaW5nT2JqZWN0czxTdHJpbmdJbml0ICo+KCksIE51bUFyZ05hbWVzKTsKKyAgfQorCisgIEluaXQgKnJlc29sdmVSZWZlcmVuY2VzKFJlc29sdmVyICZSKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIGlzQ29uY3JldGUoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKworICB1c2luZyBjb25zdF9hcmdfaXRlcmF0b3IgPSBTbWFsbFZlY3RvckltcGw8SW5pdCo+Ojpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfbmFtZV9pdGVyYXRvciA9IFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdJbml0Kj46OmNvbnN0X2l0ZXJhdG9yOworCisgIGlubGluZSBjb25zdF9hcmdfaXRlcmF0b3IgIGFyZ19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGdldEFyZ3MoKS5iZWdpbigpOyB9CisgIGlubGluZSBjb25zdF9hcmdfaXRlcmF0b3IgIGFyZ19lbmQgICgpIGNvbnN0IHsgcmV0dXJuIGdldEFyZ3MoKS5lbmQoKTsgfQorCisgIGlubGluZSBzaXplX3QgICAgICAgICAgICAgIGFyZ19zaXplICgpIGNvbnN0IHsgcmV0dXJuIE51bUFyZ3M7IH0KKyAgaW5saW5lIGJvb2wgICAgICAgICAgICAgICAgYXJnX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gTnVtQXJncyA9PSAwOyB9CisKKyAgaW5saW5lIGNvbnN0X25hbWVfaXRlcmF0b3IgbmFtZV9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGdldEFyZ05hbWVzKCkuYmVnaW4oKTt9CisgIGlubGluZSBjb25zdF9uYW1lX2l0ZXJhdG9yIG5hbWVfZW5kICAoKSBjb25zdCB7IHJldHVybiBnZXRBcmdOYW1lcygpLmVuZCgpOyB9CisKKyAgaW5saW5lIHNpemVfdCAgICAgICAgICAgICAgbmFtZV9zaXplICgpIGNvbnN0IHsgcmV0dXJuIE51bUFyZ05hbWVzOyB9CisgIGlubGluZSBib29sICAgICAgICAgICAgICAgIG5hbWVfZW1wdHkoKSBjb25zdCB7IHJldHVybiBOdW1BcmdOYW1lcyA9PSAwOyB9CisKKyAgSW5pdCAqZ2V0Qml0KHVuc2lnbmVkIEJpdCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIklsbGVnYWwgYml0IHJlZmVyZW5jZSBvZmYgZGFnIik7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgSGlnaC1MZXZlbCBDbGFzc2VzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBSZWNvcmRWYWwgeworICBmcmllbmQgY2xhc3MgUmVjb3JkOworCisgIEluaXQgKk5hbWU7CisgIFBvaW50ZXJJbnRQYWlyPFJlY1R5ICosIDEsIGJvb2w+IFR5QW5kUHJlZml4OworICBJbml0ICpWYWx1ZTsKKworcHVibGljOgorICBSZWNvcmRWYWwoSW5pdCAqTiwgUmVjVHkgKlQsIGJvb2wgUCk7CisKKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdDsKKyAgSW5pdCAqZ2V0TmFtZUluaXQoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0TmFtZUluaXRBc1N0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TmFtZUluaXQoKS0+Z2V0QXNVbnF1b3RlZFN0cmluZygpOworICB9CisKKyAgYm9vbCBnZXRQcmVmaXgoKSBjb25zdCB7IHJldHVybiBUeUFuZFByZWZpeC5nZXRJbnQoKTsgfQorICBSZWNUeSAqZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5QW5kUHJlZml4LmdldFBvaW50ZXIoKTsgfQorICBJbml0ICpnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgYm9vbCBzZXRWYWx1ZShJbml0ICpWKTsKKworICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGJvb2wgUHJpbnRTZW0gPSB0cnVlKSBjb25zdDsKK307CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFJlY29yZFZhbCAmUlYpIHsKKyAgUlYucHJpbnQoT1MgPDwgIiAgIik7CisgIHJldHVybiBPUzsKK30KKworY2xhc3MgUmVjb3JkIHsKKyAgc3RhdGljIHVuc2lnbmVkIExhc3RJRDsKKworICBJbml0ICpOYW1lOworICAvLyBMb2NhdGlvbiB3aGVyZSByZWNvcmQgd2FzIGluc3RhbnRpYXRlZCwgZm9sbG93ZWQgYnkgdGhlIGxvY2F0aW9uIG9mCisgIC8vIG11bHRpY2xhc3MgcHJvdG90eXBlcyB1c2VkLgorICBTbWFsbFZlY3RvcjxTTUxvYywgND4gTG9jczsKKyAgU21hbGxWZWN0b3I8SW5pdCAqLCAwPiBUZW1wbGF0ZUFyZ3M7CisgIFNtYWxsVmVjdG9yPFJlY29yZFZhbCwgMD4gVmFsdWVzOworCisgIC8vIEFsbCBzdXBlcmNsYXNzZXMgaW4gdGhlIGluaGVyaXRhbmNlIGZvcmVzdCBpbiByZXZlcnNlIHByZW9yZGVyICh5ZXMsIGl0CisgIC8vIG11c3QgYmUgYSBmb3Jlc3Q7IGRpYW1vbmQtc2hhcGVkIGluaGVyaXRhbmNlIGlzIG5vdCBhbGxvd2VkKS4KKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPFJlY29yZCAqLCBTTVJhbmdlPiwgMD4gU3VwZXJDbGFzc2VzOworCisgIC8vIFRyYWNrcyBSZWNvcmQgaW5zdGFuY2VzLiBOb3Qgb3duZWQgYnkgUmVjb3JkLgorICBSZWNvcmRLZWVwZXIgJlRyYWNrZWRSZWNvcmRzOworCisgIERlZkluaXQgKlRoZUluaXQgPSBudWxscHRyOworCisgIC8vIFVuaXF1ZSByZWNvcmQgSUQuCisgIHVuc2lnbmVkIElEOworCisgIGJvb2wgSXNBbm9ueW1vdXM7CisKKyAgdm9pZCBpbml0KCk7CisgIHZvaWQgY2hlY2tOYW1lKCk7CisKK3B1YmxpYzoKKyAgLy8gQ29uc3RydWN0cyBhIHJlY29yZC4KKyAgZXhwbGljaXQgUmVjb3JkKEluaXQgKk4sIEFycmF5UmVmPFNNTG9jPiBsb2NzLCBSZWNvcmRLZWVwZXIgJnJlY29yZHMsCisgICAgICAgICAgICAgICAgICBib29sIEFub255bW91cyA9IGZhbHNlKSA6CisgICAgTmFtZShOKSwgTG9jcyhsb2NzLmJlZ2luKCksIGxvY3MuZW5kKCkpLCBUcmFja2VkUmVjb3JkcyhyZWNvcmRzKSwKKyAgICBJRChMYXN0SUQrKyksIElzQW5vbnltb3VzKEFub255bW91cykgeworICAgIGluaXQoKTsKKyAgfQorCisgIGV4cGxpY2l0IFJlY29yZChTdHJpbmdSZWYgTiwgQXJyYXlSZWY8U01Mb2M+IGxvY3MsIFJlY29yZEtlZXBlciAmcmVjb3JkcykKKyAgICAgIDogUmVjb3JkKFN0cmluZ0luaXQ6OmdldChOKSwgbG9jcywgcmVjb3Jkcykge30KKworICAvLyBXaGVuIGNvcHktY29uc3RydWN0aW5nIGEgUmVjb3JkLCB3ZSBtdXN0IHN0aWxsIGd1YXJhbnRlZSBhIGdsb2JhbGx5IHVuaXF1ZQorICAvLyBJRCBudW1iZXIuICBEb24ndCBjb3B5IFRoZUluaXQgZWl0aGVyIHNpbmNlIGl0J3Mgb3duZWQgYnkgdGhlIG9yaWdpbmFsCisgIC8vIHJlY29yZC4gQWxsIG90aGVyIGZpZWxkcyBjYW4gYmUgY29waWVkIG5vcm1hbGx5LgorICBSZWNvcmQoY29uc3QgUmVjb3JkICZPKSA6CisgICAgTmFtZShPLk5hbWUpLCBMb2NzKE8uTG9jcyksIFRlbXBsYXRlQXJncyhPLlRlbXBsYXRlQXJncyksCisgICAgVmFsdWVzKE8uVmFsdWVzKSwgU3VwZXJDbGFzc2VzKE8uU3VwZXJDbGFzc2VzKSwKKyAgICBUcmFja2VkUmVjb3JkcyhPLlRyYWNrZWRSZWNvcmRzKSwgSUQoTGFzdElEKyspLAorICAgIElzQW5vbnltb3VzKE8uSXNBbm9ueW1vdXMpIHsgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXROZXdVSUQoKSB7IHJldHVybiBMYXN0SUQrKzsgfQorCisgIHVuc2lnbmVkIGdldElEKCkgY29uc3QgeyByZXR1cm4gSUQ7IH0KKworICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8U3RyaW5nSW5pdD4oTmFtZSktPmdldFZhbHVlKCk7IH0KKworICBJbml0ICpnZXROYW1lSW5pdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTmFtZTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE5hbWVJbml0QXNTdHJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE5hbWVJbml0KCktPmdldEFzVW5xdW90ZWRTdHJpbmcoKTsKKyAgfQorCisgIHZvaWQgc2V0TmFtZShJbml0ICpOYW1lKTsgICAgICAvLyBBbHNvIHVwZGF0ZXMgUmVjb3JkS2VlcGVyLgorCisgIEFycmF5UmVmPFNNTG9jPiBnZXRMb2MoKSBjb25zdCB7IHJldHVybiBMb2NzOyB9CisgIHZvaWQgYXBwZW5kTG9jKFNNTG9jIExvYykgeyBMb2NzLnB1c2hfYmFjayhMb2MpOyB9CisKKyAgLy8gTWFrZSB0aGUgdHlwZSB0aGF0IHRoaXMgcmVjb3JkIHNob3VsZCBoYXZlIGJhc2VkIG9uIGl0cyBzdXBlcmNsYXNzZXMuCisgIFJlY29yZFJlY1R5ICpnZXRUeXBlKCk7CisKKyAgLy8vIGdldCB0aGUgY29ycmVzcG9uZGluZyBEZWZJbml0LgorICBEZWZJbml0ICpnZXREZWZJbml0KCk7CisKKyAgQXJyYXlSZWY8SW5pdCAqPiBnZXRUZW1wbGF0ZUFyZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIFRlbXBsYXRlQXJnczsKKyAgfQorCisgIEFycmF5UmVmPFJlY29yZFZhbD4gZ2V0VmFsdWVzKCkgY29uc3QgeyByZXR1cm4gVmFsdWVzOyB9CisKKyAgQXJyYXlSZWY8c3RkOjpwYWlyPFJlY29yZCAqLCBTTVJhbmdlPj4gIGdldFN1cGVyQ2xhc3NlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gU3VwZXJDbGFzc2VzOworICB9CisKKyAgLy8vIEFwcGVuZCB0aGUgZGlyZWN0IHN1cGVyIGNsYXNzZXMgb2YgdGhpcyByZWNvcmQgdG8gQ2xhc3Nlcy4KKyAgdm9pZCBnZXREaXJlY3RTdXBlckNsYXNzZXMoU21hbGxWZWN0b3JJbXBsPFJlY29yZCAqPiAmQ2xhc3NlcykgY29uc3Q7CisKKyAgYm9vbCBpc1RlbXBsYXRlQXJnKEluaXQgKk5hbWUpIGNvbnN0IHsKKyAgICBmb3IgKEluaXQgKlRBIDogVGVtcGxhdGVBcmdzKQorICAgICAgaWYgKFRBID09IE5hbWUpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvbnN0IFJlY29yZFZhbCAqZ2V0VmFsdWUoY29uc3QgSW5pdCAqTmFtZSkgY29uc3QgeworICAgIGZvciAoY29uc3QgUmVjb3JkVmFsICZWYWwgOiBWYWx1ZXMpCisgICAgICBpZiAoVmFsLk5hbWUgPT0gTmFtZSkgcmV0dXJuICZWYWw7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBjb25zdCBSZWNvcmRWYWwgKmdldFZhbHVlKFN0cmluZ1JlZiBOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFZhbHVlKFN0cmluZ0luaXQ6OmdldChOYW1lKSk7CisgIH0KKworICBSZWNvcmRWYWwgKmdldFZhbHVlKGNvbnN0IEluaXQgKk5hbWUpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxSZWNvcmRWYWwgKj4oc3RhdGljX2Nhc3Q8Y29uc3QgUmVjb3JkICo+KHRoaXMpLT5nZXRWYWx1ZShOYW1lKSk7CisgIH0KKworICBSZWNvcmRWYWwgKmdldFZhbHVlKFN0cmluZ1JlZiBOYW1lKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8UmVjb3JkVmFsICo+KHN0YXRpY19jYXN0PGNvbnN0IFJlY29yZCAqPih0aGlzKS0+Z2V0VmFsdWUoTmFtZSkpOworICB9CisKKyAgdm9pZCBhZGRUZW1wbGF0ZUFyZyhJbml0ICpOYW1lKSB7CisgICAgYXNzZXJ0KCFpc1RlbXBsYXRlQXJnKE5hbWUpICYmICJUZW1wbGF0ZSBhcmcgYWxyZWFkeSBkZWZpbmVkISIpOworICAgIFRlbXBsYXRlQXJncy5wdXNoX2JhY2soTmFtZSk7CisgIH0KKworICB2b2lkIGFkZFZhbHVlKGNvbnN0IFJlY29yZFZhbCAmUlYpIHsKKyAgICBhc3NlcnQoZ2V0VmFsdWUoUlYuZ2V0TmFtZUluaXQoKSkgPT0gbnVsbHB0ciAmJiAiVmFsdWUgYWxyZWFkeSBhZGRlZCEiKTsKKyAgICBWYWx1ZXMucHVzaF9iYWNrKFJWKTsKKyAgICBpZiAoVmFsdWVzLnNpemUoKSA+IDEpCisgICAgICAvLyBLZWVwIE5BTUUgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4gIEl0IG1ha2VzIHJlY29yZCBkdW1wcyBhCisgICAgICAvLyBiaXQgcHJldHRpZXIgYW5kIGFsbG93cyBUYWJsZUdlbiB0ZXN0cyB0byBiZSB3cml0dGVuIG1vcmUKKyAgICAgIC8vIG5hdHVyYWxseS4gIFRlc3RzIGNhbiB1c2UgQ0hFQ0stTkVYVCB0byBsb29rIGZvciBSZWNvcmQKKyAgICAgIC8vIGZpZWxkcyB0aGV5IGV4cGVjdCB0byBzZWUgYWZ0ZXIgYSBkZWYuICBUaGV5IGNhbid0IGRvIHRoYXQgaWYKKyAgICAgIC8vIE5BTUUgaXMgdGhlIGZpcnN0IFJlY29yZCBmaWVsZC4KKyAgICAgIHN0ZDo6c3dhcChWYWx1ZXNbVmFsdWVzLnNpemUoKSAtIDJdLCBWYWx1ZXNbVmFsdWVzLnNpemUoKSAtIDFdKTsKKyAgfQorCisgIHZvaWQgcmVtb3ZlVmFsdWUoSW5pdCAqTmFtZSkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWYWx1ZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChWYWx1ZXNbaV0uZ2V0TmFtZUluaXQoKSA9PSBOYW1lKSB7CisgICAgICAgIFZhbHVlcy5lcmFzZShWYWx1ZXMuYmVnaW4oKStpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIkNhbm5vdCByZW1vdmUgYW4gZW50cnkgdGhhdCBkb2VzIG5vdCBleGlzdCEiKTsKKyAgfQorCisgIHZvaWQgcmVtb3ZlVmFsdWUoU3RyaW5nUmVmIE5hbWUpIHsKKyAgICByZW1vdmVWYWx1ZShTdHJpbmdJbml0OjpnZXQoTmFtZSkpOworICB9CisKKyAgYm9vbCBpc1N1YkNsYXNzT2YoY29uc3QgUmVjb3JkICpSKSBjb25zdCB7CisgICAgZm9yIChjb25zdCBhdXRvICZTQ1BhaXIgOiBTdXBlckNsYXNzZXMpCisgICAgICBpZiAoU0NQYWlyLmZpcnN0ID09IFIpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgaXNTdWJDbGFzc09mKFN0cmluZ1JlZiBOYW1lKSBjb25zdCB7CisgICAgZm9yIChjb25zdCBhdXRvICZTQ1BhaXIgOiBTdXBlckNsYXNzZXMpIHsKKyAgICAgIGlmIChjb25zdCBhdXRvICpTSSA9IGR5bl9jYXN0PFN0cmluZ0luaXQ+KFNDUGFpci5maXJzdC0+Z2V0TmFtZUluaXQoKSkpIHsKKyAgICAgICAgaWYgKFNJLT5nZXRWYWx1ZSgpID09IE5hbWUpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgaWYgKFNDUGFpci5maXJzdC0+Z2V0TmFtZUluaXRBc1N0cmluZygpID09IE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZvaWQgYWRkU3VwZXJDbGFzcyhSZWNvcmQgKlIsIFNNUmFuZ2UgUmFuZ2UpIHsKKyAgICBhc3NlcnQoIVRoZUluaXQgJiYgImNoYW5naW5nIHR5cGUgb2YgcmVjb3JkIGFmdGVyIGl0IGhhcyBiZWVuIHJlZmVyZW5jZWQiKTsKKyAgICBhc3NlcnQoIWlzU3ViQ2xhc3NPZihSKSAmJiAiQWxyZWFkeSBzdWJjbGFzc2luZyByZWNvcmQhIik7CisgICAgU3VwZXJDbGFzc2VzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihSLCBSYW5nZSkpOworICB9CisKKyAgLy8vIElmIHRoZXJlIGFyZSBhbnkgZmllbGQgcmVmZXJlbmNlcyB0aGF0IHJlZmVyIHRvIGZpZWxkcworICAvLy8gdGhhdCBoYXZlIGJlZW4gZmlsbGVkIGluLCB3ZSBjYW4gcHJvcGFnYXRlIHRoZSB2YWx1ZXMgbm93LgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYSBmaW5hbCByZXNvbHZlOiBhbnkgZXJyb3IgbWVzc2FnZXMsIGUuZy4gZHVlIHRvIHVuZGVmaW5lZAorICAvLy8gIWNhc3QgcmVmZXJlbmNlcywgYXJlIGdlbmVyYXRlZCBub3cuCisgIHZvaWQgcmVzb2x2ZVJlZmVyZW5jZXMoKTsKKworICAvLy8gQXBwbHkgdGhlIHJlc29sdmVyIHRvIHRoZSBuYW1lIG9mIHRoZSByZWNvcmQgYXMgd2VsbCBhcyB0byB0aGUKKyAgLy8vIGluaXRpYWxpemVycyBvZiBhbGwgZmllbGRzIG9mIHRoZSByZWNvcmQgZXhjZXB0IFNraXBWYWwuCisgIC8vLworICAvLy8gVGhlIHJlc29sdmVyIHNob3VsZCBub3QgcmVzb2x2ZSBhbnkgb2YgdGhlIGZpZWxkcyBpdHNlbGYsIHRvIGF2b2lkCisgIC8vLyByZWN1cnNpb24gLyBpbmZpbml0ZSBsb29wcy4KKyAgdm9pZCByZXNvbHZlUmVmZXJlbmNlcyhSZXNvbHZlciAmUiwgY29uc3QgUmVjb3JkVmFsICpTa2lwVmFsID0gbnVsbHB0cik7CisKKyAgLy8vIElmIGFueXRoaW5nIGluIHRoaXMgcmVjb3JkIHJlZmVycyB0byBSViwgcmVwbGFjZSB0aGUKKyAgLy8vIHJlZmVyZW5jZSB0byBSViB3aXRoIHRoZSBSSFMgb2YgUlYuICBJZiBSViBpcyBudWxsLCB3ZSByZXNvbHZlIGFsbAorICAvLy8gcG9zc2libGUgcmVmZXJlbmNlcy4KKyAgdm9pZCByZXNvbHZlUmVmZXJlbmNlc1RvKGNvbnN0IFJlY29yZFZhbCAqUlYpOworCisgIFJlY29yZEtlZXBlciAmZ2V0UmVjb3JkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gVHJhY2tlZFJlY29yZHM7CisgIH0KKworICBib29sIGlzQW5vbnltb3VzKCkgY29uc3QgeworICAgIHJldHVybiBJc0Fub255bW91czsKKyAgfQorCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEhpZ2gtbGV2ZWwgbWV0aG9kcyB1c2VmdWwgdG8gdGFibGVnZW4gYmFjay1lbmRzCisgIC8vCisKKyAgLy8vIFJldHVybiB0aGUgaW5pdGlhbGl6ZXIgZm9yIGEgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsCisgIC8vLyBvciB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGRvZXMgbm90IGV4aXN0LgorICBJbml0ICpnZXRWYWx1ZUluaXQoU3RyaW5nUmVmIEZpZWxkTmFtZSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBuYW1lZCBmaWVsZCBpcyB1bnNldC4KKyAgYm9vbCBpc1ZhbHVlVW5zZXQoU3RyaW5nUmVmIEZpZWxkTmFtZSkgY29uc3QgeworICAgIHJldHVybiBpc2E8VW5zZXRJbml0PihnZXRWYWx1ZUluaXQoRmllbGROYW1lKSk7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgbG9va3MgdXAgdGhlIHNwZWNpZmllZCBmaWVsZCBhbmQgcmV0dXJucworICAvLy8gaXRzIHZhbHVlIGFzIGEgc3RyaW5nLCB0aHJvd2luZyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGRvZXMgbm90IGV4aXN0CisgIC8vLyBvciBpZiB0aGUgdmFsdWUgaXMgbm90IGEgc3RyaW5nLgorICBTdHJpbmdSZWYgZ2V0VmFsdWVBc1N0cmluZyhTdHJpbmdSZWYgRmllbGROYW1lKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgbG9va3MgdXAgdGhlIHNwZWNpZmllZCBmaWVsZCBhbmQgcmV0dXJucworICAvLy8gaXRzIHZhbHVlIGFzIGEgQml0c0luaXQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgZG9lcyBub3QgZXhpc3QKKyAgLy8vIG9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgdGhlIHJpZ2h0IHR5cGUuCisgIEJpdHNJbml0ICpnZXRWYWx1ZUFzQml0c0luaXQoU3RyaW5nUmVmIEZpZWxkTmFtZSkgY29uc3Q7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGxvb2tzIHVwIHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kIHJldHVybnMKKyAgLy8vIGl0cyB2YWx1ZSBhcyBhIExpc3RJbml0LCB0aHJvd2luZyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGRvZXMgbm90IGV4aXN0CisgIC8vLyBvciBpZiB0aGUgdmFsdWUgaXMgbm90IHRoZSByaWdodCB0eXBlLgorICBMaXN0SW5pdCAqZ2V0VmFsdWVBc0xpc3RJbml0KFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0OworCisgIC8vLyBUaGlzIG1ldGhvZCBsb29rcyB1cCB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZAorICAvLy8gcmV0dXJucyBpdHMgdmFsdWUgYXMgYSB2ZWN0b3Igb2YgcmVjb3JkcywgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZQorICAvLy8gZmllbGQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCB0aGUgcmlnaHQgdHlwZS4KKyAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gZ2V0VmFsdWVBc0xpc3RPZkRlZnMoU3RyaW5nUmVmIEZpZWxkTmFtZSkgY29uc3Q7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGxvb2tzIHVwIHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kCisgIC8vLyByZXR1cm5zIGl0cyB2YWx1ZSBhcyBhIHZlY3RvciBvZiBpbnRlZ2VycywgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZQorICAvLy8gZmllbGQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCB0aGUgcmlnaHQgdHlwZS4KKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gZ2V0VmFsdWVBc0xpc3RPZkludHMoU3RyaW5nUmVmIEZpZWxkTmFtZSkgY29uc3Q7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGxvb2tzIHVwIHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kCisgIC8vLyByZXR1cm5zIGl0cyB2YWx1ZSBhcyBhIHZlY3RvciBvZiBzdHJpbmdzLCB0aHJvd2luZyBhbiBleGNlcHRpb24gaWYgdGhlCisgIC8vLyBmaWVsZCBkb2VzIG5vdCBleGlzdCBvciBpZiB0aGUgdmFsdWUgaXMgbm90IHRoZSByaWdodCB0eXBlLgorICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IGdldFZhbHVlQXNMaXN0T2ZTdHJpbmdzKFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0OworCisgIC8vLyBUaGlzIG1ldGhvZCBsb29rcyB1cCB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZCByZXR1cm5zIGl0cworICAvLy8gdmFsdWUgYXMgYSBSZWNvcmQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgZG9lcyBub3QgZXhpc3Qgb3IgaWYKKyAgLy8vIHRoZSB2YWx1ZSBpcyBub3QgdGhlIHJpZ2h0IHR5cGUuCisgIFJlY29yZCAqZ2V0VmFsdWVBc0RlZihTdHJpbmdSZWYgRmllbGROYW1lKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgbG9va3MgdXAgdGhlIHNwZWNpZmllZCBmaWVsZCBhbmQgcmV0dXJucyBpdHMKKyAgLy8vIHZhbHVlIGFzIGEgYml0LCB0aHJvd2luZyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGRvZXMgbm90IGV4aXN0IG9yIGlmCisgIC8vLyB0aGUgdmFsdWUgaXMgbm90IHRoZSByaWdodCB0eXBlLgorICBib29sIGdldFZhbHVlQXNCaXQoU3RyaW5nUmVmIEZpZWxkTmFtZSkgY29uc3Q7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGxvb2tzIHVwIHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kCisgIC8vLyByZXR1cm5zIGl0cyB2YWx1ZSBhcyBhIGJpdC4gSWYgdGhlIGZpZWxkIGlzIHVuc2V0LCBzZXRzIFVuc2V0IHRvIHRydWUgYW5kCisgIC8vLyByZXR1cm5zIGZhbHNlLgorICBib29sIGdldFZhbHVlQXNCaXRPclVuc2V0KFN0cmluZ1JlZiBGaWVsZE5hbWUsIGJvb2wgJlVuc2V0KSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgbG9va3MgdXAgdGhlIHNwZWNpZmllZCBmaWVsZCBhbmQgcmV0dXJucyBpdHMKKyAgLy8vIHZhbHVlIGFzIGFuIGludDY0X3QsIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgZG9lcyBub3QgZXhpc3Qgb3IKKyAgLy8vIGlmIHRoZSB2YWx1ZSBpcyBub3QgdGhlIHJpZ2h0IHR5cGUuCisgIGludDY0X3QgZ2V0VmFsdWVBc0ludChTdHJpbmdSZWYgRmllbGROYW1lKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgbG9va3MgdXAgdGhlIHNwZWNpZmllZCBmaWVsZCBhbmQgcmV0dXJucyBpdHMKKyAgLy8vIHZhbHVlIGFzIGFuIERhZywgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdCBvciBpZgorICAvLy8gdGhlIHZhbHVlIGlzIG5vdCB0aGUgcmlnaHQgdHlwZS4KKyAgRGFnSW5pdCAqZ2V0VmFsdWVBc0RhZyhTdHJpbmdSZWYgRmllbGROYW1lKSBjb25zdDsKK307CisKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUmVjb3JkICZSKTsKKworc3RydWN0IE11bHRpQ2xhc3MgeworICBSZWNvcmQgUmVjOyAgLy8gUGxhY2Vob2xkZXIgZm9yIHRlbXBsYXRlIGFyZ3MgYW5kIE5hbWUuCisgIHVzaW5nIFJlY29yZFZlY3RvciA9IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxSZWNvcmQ+PjsKKyAgUmVjb3JkVmVjdG9yIERlZlByb3RvdHlwZXM7CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgTXVsdGlDbGFzcyhTdHJpbmdSZWYgTmFtZSwgU01Mb2MgTG9jLCBSZWNvcmRLZWVwZXIgJlJlY29yZHMpIDoKKyAgICBSZWMoTmFtZSwgTG9jLCBSZWNvcmRzKSB7fQorfTsKKworY2xhc3MgUmVjb3JkS2VlcGVyIHsKKyAgZnJpZW5kIGNsYXNzIFJlY29yZFJlY1R5OworICB1c2luZyBSZWNvcmRNYXAgPSBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp1bmlxdWVfcHRyPFJlY29yZD4+OworICBSZWNvcmRNYXAgQ2xhc3NlcywgRGVmczsKKyAgRm9sZGluZ1NldDxSZWNvcmRSZWNUeT4gUmVjb3JkVHlwZVBvb2w7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJbml0ICo+IEV4dHJhR2xvYmFsczsKKyAgdW5zaWduZWQgQW5vbkNvdW50ZXIgPSAwOworCitwdWJsaWM6CisgIGNvbnN0IFJlY29yZE1hcCAmZ2V0Q2xhc3NlcygpIGNvbnN0IHsgcmV0dXJuIENsYXNzZXM7IH0KKyAgY29uc3QgUmVjb3JkTWFwICZnZXREZWZzKCkgY29uc3QgeyByZXR1cm4gRGVmczsgfQorCisgIFJlY29yZCAqZ2V0Q2xhc3MoU3RyaW5nUmVmIE5hbWUpIGNvbnN0IHsKKyAgICBhdXRvIEkgPSBDbGFzc2VzLmZpbmQoTmFtZSk7CisgICAgcmV0dXJuIEkgPT0gQ2xhc3Nlcy5lbmQoKSA/IG51bGxwdHIgOiBJLT5zZWNvbmQuZ2V0KCk7CisgIH0KKworICBSZWNvcmQgKmdldERlZihTdHJpbmdSZWYgTmFtZSkgY29uc3QgeworICAgIGF1dG8gSSA9IERlZnMuZmluZChOYW1lKTsKKyAgICByZXR1cm4gSSA9PSBEZWZzLmVuZCgpID8gbnVsbHB0ciA6IEktPnNlY29uZC5nZXQoKTsKKyAgfQorCisgIEluaXQgKmdldEdsb2JhbChTdHJpbmdSZWYgTmFtZSkgY29uc3QgeworICAgIGlmIChSZWNvcmQgKlIgPSBnZXREZWYoTmFtZSkpCisgICAgICByZXR1cm4gUi0+Z2V0RGVmSW5pdCgpOworICAgIGF1dG8gSXQgPSBFeHRyYUdsb2JhbHMuZmluZChOYW1lKTsKKyAgICByZXR1cm4gSXQgPT0gRXh0cmFHbG9iYWxzLmVuZCgpID8gbnVsbHB0ciA6IEl0LT5zZWNvbmQ7CisgIH0KKworICB2b2lkIGFkZENsYXNzKHN0ZDo6dW5pcXVlX3B0cjxSZWNvcmQ+IFIpIHsKKyAgICBib29sIElucyA9IENsYXNzZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFItPmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShSKSkpLnNlY29uZDsKKyAgICAodm9pZClJbnM7CisgICAgYXNzZXJ0KElucyAmJiAiQ2xhc3MgYWxyZWFkeSBleGlzdHMiKTsKKyAgfQorCisgIHZvaWQgYWRkRGVmKHN0ZDo6dW5pcXVlX3B0cjxSZWNvcmQ+IFIpIHsKKyAgICBib29sIElucyA9IERlZnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFItPmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShSKSkpLnNlY29uZDsKKyAgICAodm9pZClJbnM7CisgICAgYXNzZXJ0KElucyAmJiAiUmVjb3JkIGFscmVhZHkgZXhpc3RzIik7CisgIH0KKworICB2b2lkIGFkZEV4dHJhR2xvYmFsKFN0cmluZ1JlZiBOYW1lLCBJbml0ICpJKSB7CisgICAgYm9vbCBJbnMgPSBFeHRyYUdsb2JhbHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKE5hbWUsIEkpKS5zZWNvbmQ7CisgICAgKHZvaWQpSW5zOworICAgIGFzc2VydCghZ2V0RGVmKE5hbWUpKTsKKyAgICBhc3NlcnQoSW5zICYmICJHbG9iYWwgYWxyZWFkeSBleGlzdHMiKTsKKyAgfQorCisgIEluaXQgKmdldE5ld0Fub255bW91c05hbWUoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSGlnaC1sZXZlbCBoZWxwZXIgbWV0aG9kcywgdXNlZnVsIGZvciB0YWJsZWdlbiBiYWNrZW5kcy4uLgorCisgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIGFsbCBjb25jcmV0ZSBkZWZpbml0aW9ucworICAvLy8gdGhhdCBkZXJpdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGNsYXNzIG5hbWUuICBBIGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZAorICAvLy8gbmFtZSBtdXN0IGV4aXN0LgorICBzdGQ6OnZlY3RvcjxSZWNvcmQgKj4gZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKFN0cmluZ1JlZiBDbGFzc05hbWUpIGNvbnN0OworCisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworLy8vIFNvcnRpbmcgcHJlZGljYXRlIHRvIHNvcnQgcmVjb3JkIHBvaW50ZXJzIGJ5IG5hbWUuCitzdHJ1Y3QgTGVzc1JlY29yZCB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSZWNvcmQgKlJlYzEsIGNvbnN0IFJlY29yZCAqUmVjMikgY29uc3QgeworICAgIHJldHVybiBTdHJpbmdSZWYoUmVjMS0+Z2V0TmFtZSgpKS5jb21wYXJlX251bWVyaWMoUmVjMi0+Z2V0TmFtZSgpKSA8IDA7CisgIH0KK307CisKKy8vLyBTb3J0aW5nIHByZWRpY2F0ZSB0byBzb3J0IHJlY29yZCBwb2ludGVycyBieSB0aGVpcgorLy8vIHVuaXF1ZSBJRC4gSWYgeW91IGp1c3QgbmVlZCBhIGRldGVybWluaXN0aWMgb3JkZXIsIHVzZSB0aGlzLCBzaW5jZSBpdAorLy8vIGp1c3QgY29tcGFyZXMgdHdvIGB1bnNpZ25lZGA7IHRoZSBvdGhlciBzb3J0aW5nIHByZWRpY2F0ZXMgcmVxdWlyZQorLy8vIHN0cmluZyBtYW5pcHVsYXRpb24uCitzdHJ1Y3QgTGVzc1JlY29yZEJ5SUQgeworICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmVjb3JkICpMSFMsIGNvbnN0IFJlY29yZCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIExIUy0+Z2V0SUQoKSA8IFJIUy0+Z2V0SUQoKTsKKyAgfQorfTsKKworLy8vIFNvcnRpbmcgcHJlZGljYXRlIHRvIHNvcnQgcmVjb3JkIHBvaW50ZXJzIGJ5IHRoZWlyCisvLy8gbmFtZSBmaWVsZC4KK3N0cnVjdCBMZXNzUmVjb3JkRmllbGROYW1lIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJlY29yZCAqUmVjMSwgY29uc3QgUmVjb3JkICpSZWMyKSBjb25zdCB7CisgICAgcmV0dXJuIFJlYzEtPmdldFZhbHVlQXNTdHJpbmcoIk5hbWUiKSA8IFJlYzItPmdldFZhbHVlQXNTdHJpbmcoIk5hbWUiKTsKKyAgfQorfTsKKworc3RydWN0IExlc3NSZWNvcmRSZWdpc3RlciB7CisgIHN0YXRpYyBib29sIGFzY2lpX2lzZGlnaXQoY2hhciB4KSB7IHJldHVybiB4ID49ICcwJyAmJiB4IDw9ICc5JzsgfQorCisgIHN0cnVjdCBSZWNvcmRQYXJ0cyB7CisgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPCBib29sLCBTdHJpbmdSZWY+LCA0PiBQYXJ0czsKKworICAgIFJlY29yZFBhcnRzKFN0cmluZ1JlZiBSZWMpIHsKKyAgICAgIGlmIChSZWMuZW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgICBzaXplX3QgTGVuID0gMDsKKyAgICAgIGNvbnN0IGNoYXIgKlN0YXJ0ID0gUmVjLmRhdGEoKTsKKyAgICAgIGNvbnN0IGNoYXIgKkN1cnIgPSBTdGFydDsKKyAgICAgIGJvb2wgaXNEaWdpdFBhcnQgPSBhc2NpaV9pc2RpZ2l0KEN1cnJbMF0pOworICAgICAgZm9yIChzaXplX3QgSSA9IDAsIEUgPSBSZWMuc2l6ZSgpOyBJICE9IEU7ICsrSSwgKytMZW4pIHsKKyAgICAgICAgYm9vbCBpc0RpZ2l0ID0gYXNjaWlfaXNkaWdpdChDdXJyW0ldKTsKKyAgICAgICAgaWYgKGlzRGlnaXQgIT0gaXNEaWdpdFBhcnQpIHsKKyAgICAgICAgICBQYXJ0cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoaXNEaWdpdFBhcnQsIFN0cmluZ1JlZihTdGFydCwgTGVuKSkpOworICAgICAgICAgIExlbiA9IDA7CisgICAgICAgICAgU3RhcnQgPSAmQ3VycltJXTsKKyAgICAgICAgICBpc0RpZ2l0UGFydCA9IGFzY2lpX2lzZGlnaXQoQ3VycltJXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIFB1c2ggdGhlIGxhc3QgcGFydC4KKyAgICAgIFBhcnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihpc0RpZ2l0UGFydCwgU3RyaW5nUmVmKFN0YXJ0LCBMZW4pKSk7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUoKSB7IHJldHVybiBQYXJ0cy5zaXplKCk7IH0KKworICAgIHN0ZDo6cGFpcjxib29sLCBTdHJpbmdSZWY+IGdldFBhcnQoc2l6ZV90IGkpIHsKKyAgICAgIGFzc2VydCAoaSA8IFBhcnRzLnNpemUoKSAmJiAiSW52YWxpZCBpZHghIik7CisgICAgICByZXR1cm4gUGFydHNbaV07CisgICAgfQorICB9OworCisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSZWNvcmQgKlJlYzEsIGNvbnN0IFJlY29yZCAqUmVjMikgY29uc3QgeworICAgIFJlY29yZFBhcnRzIExIU1BhcnRzKFN0cmluZ1JlZihSZWMxLT5nZXROYW1lKCkpKTsKKyAgICBSZWNvcmRQYXJ0cyBSSFNQYXJ0cyhTdHJpbmdSZWYoUmVjMi0+Z2V0TmFtZSgpKSk7CisKKyAgICBzaXplX3QgTEhTTnVtUGFydHMgPSBMSFNQYXJ0cy5zaXplKCk7CisgICAgc2l6ZV90IFJIU051bVBhcnRzID0gUkhTUGFydHMuc2l6ZSgpOworICAgIGFzc2VydCAoTEhTTnVtUGFydHMgJiYgUkhTTnVtUGFydHMgJiYgIkV4cGVjdGVkIGF0IGxlYXN0IG9uZSBwYXJ0ISIpOworCisgICAgaWYgKExIU051bVBhcnRzICE9IFJIU051bVBhcnRzKQorICAgICAgcmV0dXJuIExIU051bVBhcnRzIDwgUkhTTnVtUGFydHM7CisKKyAgICAvLyBXZSBleHBlY3QgdGhlIHJlZ2lzdGVycyB0byBiZSBvZiB0aGUgZm9ybSBbX2EtekEtWl0rKFswLTldKltfYS16QS1aXSopKi4KKyAgICBmb3IgKHNpemVfdCBJID0gMCwgRSA9IExIU051bVBhcnRzOyBJIDwgRTsgSSs9MikgeworICAgICAgc3RkOjpwYWlyPGJvb2wsIFN0cmluZ1JlZj4gTEhTUGFydCA9IExIU1BhcnRzLmdldFBhcnQoSSk7CisgICAgICBzdGQ6OnBhaXI8Ym9vbCwgU3RyaW5nUmVmPiBSSFNQYXJ0ID0gUkhTUGFydHMuZ2V0UGFydChJKTsKKyAgICAgIC8vIEV4cGVjdCBldmVuIHBhcnQgdG8gYWx3YXlzIGJlIGFscGhhLgorICAgICAgYXNzZXJ0IChMSFNQYXJ0LmZpcnN0ID09IGZhbHNlICYmIFJIU1BhcnQuZmlyc3QgPT0gZmFsc2UgJiYKKyAgICAgICAgICAgICAgIkV4cGVjdGVkIGJvdGggcGFydHMgdG8gYmUgYWxwaGEuIik7CisgICAgICBpZiAoaW50IFJlcyA9IExIU1BhcnQuc2Vjb25kLmNvbXBhcmUoUkhTUGFydC5zZWNvbmQpKQorICAgICAgICByZXR1cm4gUmVzIDwgMDsKKyAgICB9CisgICAgZm9yIChzaXplX3QgSSA9IDEsIEUgPSBMSFNOdW1QYXJ0czsgSSA8IEU7IEkrPTIpIHsKKyAgICAgIHN0ZDo6cGFpcjxib29sLCBTdHJpbmdSZWY+IExIU1BhcnQgPSBMSFNQYXJ0cy5nZXRQYXJ0KEkpOworICAgICAgc3RkOjpwYWlyPGJvb2wsIFN0cmluZ1JlZj4gUkhTUGFydCA9IFJIU1BhcnRzLmdldFBhcnQoSSk7CisgICAgICAvLyBFeHBlY3Qgb2RkIHBhcnQgdG8gYWx3YXlzIGJlIG51bWVyaWMuCisgICAgICBhc3NlcnQgKExIU1BhcnQuZmlyc3QgPT0gdHJ1ZSAmJiBSSFNQYXJ0LmZpcnN0ID09IHRydWUgJiYKKyAgICAgICAgICAgICAgIkV4cGVjdGVkIGJvdGggcGFydHMgdG8gYmUgbnVtZXJpYy4iKTsKKyAgICAgIGlmIChMSFNQYXJ0LnNlY29uZC5zaXplKCkgIT0gUkhTUGFydC5zZWNvbmQuc2l6ZSgpKQorICAgICAgICByZXR1cm4gTEhTUGFydC5zZWNvbmQuc2l6ZSgpIDwgUkhTUGFydC5zZWNvbmQuc2l6ZSgpOworCisgICAgICB1bnNpZ25lZCBMSFNWYWwsIFJIU1ZhbDsKKworICAgICAgYm9vbCBMSFNGYWlsZWQgPSBMSFNQYXJ0LnNlY29uZC5nZXRBc0ludGVnZXIoMTAsIExIU1ZhbCk7ICh2b2lkKUxIU0ZhaWxlZDsKKyAgICAgIGFzc2VydCghTEhTRmFpbGVkICYmICJVbmFibGUgdG8gY29udmVydCBMSFMgdG8gaW50ZWdlci4iKTsKKyAgICAgIGJvb2wgUkhTRmFpbGVkID0gUkhTUGFydC5zZWNvbmQuZ2V0QXNJbnRlZ2VyKDEwLCBSSFNWYWwpOyAodm9pZClSSFNGYWlsZWQ7CisgICAgICBhc3NlcnQoIVJIU0ZhaWxlZCAmJiAiVW5hYmxlIHRvIGNvbnZlcnQgUkhTIHRvIGludGVnZXIuIik7CisKKyAgICAgIGlmIChMSFNWYWwgIT0gUkhTVmFsKQorICAgICAgICByZXR1cm4gTEhTVmFsIDwgUkhTVmFsOworICAgIH0KKyAgICByZXR1cm4gTEhTTnVtUGFydHMgPCBSSFNOdW1QYXJ0czsKKyAgfQorfTsKKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBSZWNvcmRLZWVwZXIgJlJLKTsKKworLy8vIFJldHVybiBhbiBJbml0IHdpdGggYSBxdWFsaWZpZXIgcHJlZml4IHJlZmVycmluZworLy8vIHRvIEN1clJlYydzIG5hbWUuCitJbml0ICpRdWFsaWZ5TmFtZShSZWNvcmQgJkN1clJlYywgTXVsdGlDbGFzcyAqQ3VyTXVsdGlDbGFzcywKKyAgICAgICAgICAgICAgICAgIEluaXQgKk5hbWUsIFN0cmluZ1JlZiBTY29wZXIpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIFJlc29sdmVycworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEludGVyZmFjZSBmb3IgbG9va2luZyB1cCB0aGUgaW5pdGlhbGl6ZXIgZm9yIGEgdmFyaWFibGUgbmFtZSwgdXNlZCBieQorLy8vIEluaXQ6OnJlc29sdmVSZWZlcmVuY2VzLgorY2xhc3MgUmVzb2x2ZXIgeworICBSZWNvcmQgKkN1clJlYzsKKyAgYm9vbCBJc0ZpbmFsID0gZmFsc2U7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgUmVzb2x2ZXIoUmVjb3JkICpDdXJSZWMpIDogQ3VyUmVjKEN1clJlYykge30KKyAgdmlydHVhbCB+UmVzb2x2ZXIoKSB7fQorCisgIFJlY29yZCAqZ2V0Q3VycmVudFJlY29yZCgpIGNvbnN0IHsgcmV0dXJuIEN1clJlYzsgfQorCisgIC8vLyBSZXR1cm4gdGhlIGluaXRpYWxpemVyIGZvciB0aGUgZ2l2ZW4gdmFyaWFibGUgbmFtZSAoc2hvdWxkIG5vcm1hbGx5IGJlIGEKKyAgLy8vIFN0cmluZ0luaXQpLCBvciBudWxscHRyIGlmIHRoZSBuYW1lIGNvdWxkIG5vdCBiZSByZXNvbHZlZC4KKyAgdmlydHVhbCBJbml0ICpyZXNvbHZlKEluaXQgKlZhck5hbWUpID0gMDsKKworICAvLyBXaGV0aGVyIGJpdHMgaW4gYSBCaXRzSW5pdCBzaG91bGQgc3RheSB1bnJlc29sdmVkIGlmIHJlc29sdmluZyB0aGVtIHdvdWxkCisgIC8vIHJlc3VsdCBpbiBhID8gKFVuc2V0SW5pdCkuIFRoaXMgYmVoYXZpb3IgaXMgdXNlZCB0byByZXByZXNlbnQgaW5zdHJ1Y3Rpb24KKyAgLy8gZW5jb2RpbmdzIGJ5IGtlZXBpbmcgcmVmZXJlbmNlcyB0byB1bnNldCB2YXJpYWJsZXMgd2l0aGluIGEgcmVjb3JkLgorICB2aXJ0dWFsIGJvb2wga2VlcFVuc2V0Qml0cygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8gV2hldGhlciB0aGlzIGlzIHRoZSBmaW5hbCByZXNvbHZlIHN0ZXAgYmVmb3JlIGFkZGluZyBhIHJlY29yZCB0byB0aGUKKyAgLy8gUmVjb3JkS2VlcGVyLiBFcnJvciByZXBvcnRpbmcgZHVyaW5nIHJlc29sdmUgYW5kIHJlbGF0ZWQgY29uc3RhbnQgZm9sZGluZworICAvLyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiB0aGlzIGlzIHRydWUuCisgIGJvb2wgaXNGaW5hbCgpIGNvbnN0IHsgcmV0dXJuIElzRmluYWw7IH0KKworICB2b2lkIHNldEZpbmFsKGJvb2wgRmluYWwpIHsgSXNGaW5hbCA9IEZpbmFsOyB9Cit9OworCisvLy8gUmVzb2x2ZSBhcmJpdHJhcnkgbWFwcGluZ3MuCitjbGFzcyBNYXBSZXNvbHZlciBmaW5hbCA6IHB1YmxpYyBSZXNvbHZlciB7CisgIHN0cnVjdCBNYXBwZWRWYWx1ZSB7CisgICAgSW5pdCAqVjsKKyAgICBib29sIFJlc29sdmVkOworCisgICAgTWFwcGVkVmFsdWUoKSA6IFYobnVsbHB0ciksIFJlc29sdmVkKGZhbHNlKSB7fQorICAgIE1hcHBlZFZhbHVlKEluaXQgKlYsIGJvb2wgUmVzb2x2ZWQpIDogVihWKSwgUmVzb2x2ZWQoUmVzb2x2ZWQpIHt9CisgIH07CisKKyAgRGVuc2VNYXA8SW5pdCAqLCBNYXBwZWRWYWx1ZT4gTWFwOworCitwdWJsaWM6CisgIGV4cGxpY2l0IE1hcFJlc29sdmVyKFJlY29yZCAqQ3VyUmVjID0gbnVsbHB0cikgOiBSZXNvbHZlcihDdXJSZWMpIHt9CisKKyAgdm9pZCBzZXQoSW5pdCAqS2V5LCBJbml0ICpWYWx1ZSkgeyBNYXBbS2V5XSA9IHtWYWx1ZSwgZmFsc2V9OyB9CisKKyAgSW5pdCAqcmVzb2x2ZShJbml0ICpWYXJOYW1lKSBvdmVycmlkZTsKK307CisKKy8vLyBSZXNvbHZlIGFsbCB2YXJpYWJsZXMgZnJvbSBhIHJlY29yZCBleGNlcHQgZm9yIHVuc2V0IHZhcmlhYmxlcy4KK2NsYXNzIFJlY29yZFJlc29sdmVyIGZpbmFsIDogcHVibGljIFJlc29sdmVyIHsKKyAgRGVuc2VNYXA8SW5pdCAqLCBJbml0ICo+IENhY2hlOworICBTbWFsbFZlY3RvcjxJbml0ICosIDQ+IFN0YWNrOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFJlY29yZFJlc29sdmVyKFJlY29yZCAmUikgOiBSZXNvbHZlcigmUikge30KKworICBJbml0ICpyZXNvbHZlKEluaXQgKlZhck5hbWUpIG92ZXJyaWRlOworCisgIGJvb2wga2VlcFVuc2V0Qml0cygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KK307CisKKy8vLyBSZXNvbHZlIGFsbCByZWZlcmVuY2VzIHRvIGEgc3BlY2lmaWMgUmVjb3JkVmFsLgorLy8KKy8vIFRPRE86IFRoaXMgaXMgdXNlZCBmb3IgcmVzb2x2aW5nIHJlZmVyZW5jZXMgdG8gdGVtcGxhdGUgYXJndW1lbnRzLCBpbiBhCisvLyAgICAgICByYXRoZXIgaW5lZmZpY2llbnQgd2F5LiBDaGFuZ2UgdGhvc2UgdXNlcyB0byByZXNvbHZlIGFsbCB0ZW1wbGF0ZQorLy8gICAgICAgYXJndW1lbnRzIHNpbXVsdGFuZW91c2x5IGFuZCBnZXQgcmlkIG9mIHRoaXMgY2xhc3MuCitjbGFzcyBSZWNvcmRWYWxSZXNvbHZlciBmaW5hbCA6IHB1YmxpYyBSZXNvbHZlciB7CisgIGNvbnN0IFJlY29yZFZhbCAqUlY7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgUmVjb3JkVmFsUmVzb2x2ZXIoUmVjb3JkICZSLCBjb25zdCBSZWNvcmRWYWwgKlJWKQorICAgICAgOiBSZXNvbHZlcigmUiksIFJWKFJWKSB7fQorCisgIEluaXQgKnJlc29sdmUoSW5pdCAqVmFyTmFtZSkgb3ZlcnJpZGUgeworICAgIGlmIChWYXJOYW1lID09IFJWLT5nZXROYW1lSW5pdCgpKQorICAgICAgcmV0dXJuIFJWLT5nZXRWYWx1ZSgpOworICAgIHJldHVybiBudWxscHRyOworICB9Cit9OworCisvLy8gRGVsZWdhdGUgcmVzb2x2aW5nIHRvIGEgc3ViLXJlc29sdmVyLCBidXQgc2hhZG93IHNvbWUgdmFyaWFibGUgbmFtZXMuCitjbGFzcyBTaGFkb3dSZXNvbHZlciBmaW5hbCA6IHB1YmxpYyBSZXNvbHZlciB7CisgIFJlc29sdmVyICZSOworICBEZW5zZVNldDxJbml0ICo+IFNoYWRvd2VkOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFNoYWRvd1Jlc29sdmVyKFJlc29sdmVyICZSKQorICAgICAgOiBSZXNvbHZlcihSLmdldEN1cnJlbnRSZWNvcmQoKSksIFIoUikgeworICAgIHNldEZpbmFsKFIuaXNGaW5hbCgpKTsKKyAgfQorCisgIHZvaWQgYWRkU2hhZG93KEluaXQgKktleSkgeyBTaGFkb3dlZC5pbnNlcnQoS2V5KTsgfQorCisgIEluaXQgKnJlc29sdmUoSW5pdCAqVmFyTmFtZSkgb3ZlcnJpZGUgeworICAgIGlmIChTaGFkb3dlZC5jb3VudChWYXJOYW1lKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBSLnJlc29sdmUoVmFyTmFtZSk7CisgIH0KK307CisKKy8vLyAoT3B0aW9uYWxseSkgZGVsZWdhdGUgcmVzb2x2aW5nIHRvIGEgc3ViLXJlc29sdmVyLCBhbmQga2VlcCB0cmFjayB3aGV0aGVyCisvLy8gdGhlcmUgd2VyZSB1bnJlc29sdmVkIHJlZmVyZW5jZXMuCitjbGFzcyBUcmFja1VucmVzb2x2ZWRSZXNvbHZlciBmaW5hbCA6IHB1YmxpYyBSZXNvbHZlciB7CisgIFJlc29sdmVyICpSOworICBib29sIEZvdW5kVW5yZXNvbHZlZCA9IGZhbHNlOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFRyYWNrVW5yZXNvbHZlZFJlc29sdmVyKFJlc29sdmVyICpSID0gbnVsbHB0cikKKyAgICAgIDogUmVzb2x2ZXIoUiA/IFItPmdldEN1cnJlbnRSZWNvcmQoKSA6IG51bGxwdHIpLCBSKFIpIHt9CisKKyAgYm9vbCBmb3VuZFVucmVzb2x2ZWQoKSBjb25zdCB7IHJldHVybiBGb3VuZFVucmVzb2x2ZWQ7IH0KKworICBJbml0ICpyZXNvbHZlKEluaXQgKlZhck5hbWUpIG92ZXJyaWRlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVEFCTEVHRU5fUkVDT1JEX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFibGVHZW4vU2VhcmNoYWJsZVRhYmxlLnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9TZWFyY2hhYmxlVGFibGUudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhYWY2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFibGVHZW4vU2VhcmNoYWJsZVRhYmxlLnRkCkBAIC0wLDAgKzEsNDEgQEAKKy8vPT09LSBTZWFyY2hhYmxlVGFibGUudGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGtleSB0b3AtbGV2ZWwgY2xhc3NlcyBuZWVkZWQgdG8gcHJvZHVjZSBhIHJlYXNvbmFibHkKKy8vIGdlbmVyaWMgdGFibGUgdGhhdCBjYW4gYmUgYmluYXJ5LXNlYXJjaGVkIHZpYSBpbnQgYW5kIHN0cmluZyBlbnRyaWVzLgorLy8KKy8vIEVhY2ggdGFibGUgbXVzdCBpbnN0YW50aWF0ZSAiTWFwcGluZ2tpbmQiLCBsaXN0aW5nIHRoZSBmaWVsZHMgdGhhdCBzaG91bGQgYmUKKy8vIGluY2x1ZGVkIGFuZCBmaWVsZHMgdGhhdCBzaG9vdWxkIGJlIHNlYXJjaGFibGUuIE9ubHkgdHdvIGtpbmRzIG9mIGZpZWxkcyBhcmUKKy8vIHNlYXJjaGFibGUgYXQgdGhlIG1vbWVudDogInN0cmluZ3MiICh3aGljaCBhcmUgY29tcGFyZWQgY2FzZS1pbnNlbnNpdGl2ZWx5KSwKKy8vIGFuZCAiYml0cyIuCisvLworLy8gRm9yIGVhY2ggIk1hcHBpbmdLaW5kIiB0aGUgZ2VuZXJhdGVkIGhlYWRlciB3aWxsIGNyZWF0ZSBHRVRfTUFQUElOR0tJTkRfREVDTAorLy8gYW5kIEdFVF9NQVBQSU5HS0lORF9JTVBMIGd1YXJkcy4KKy8vCisvLyBJbnNpZGUgdGhlIERFQ0wgZ3VhcmQgd2lsbCBiZSBhIHNldCBvZiBmdW5jdGlvbiBkZWNsYXJhdGlvbnM6CisvLyAibG9va3Vwe0luc3RhbmNlQ2xhc3N9Qnl7U2VhcmNoYWJsZUZpZWxkfSIsIHJldHVybmluZyAiY29uc3Qge0luc3RhbmNlQ2xhc3N9CisvLyAqIiBhbmQgYWNjZXB0aW5nIGVpdGhlciBhIFN0cmluZ1JlZiBvciBhIHVpbnROX3QuIEFkZGl0aW9uYWxseSwgaWYKKy8vIEVudW1OYW1lRmllbGQgaXMgc3RpbGwgZGVmaW5lZCwgdGhlcmUgd2lsbCBiZSBhbiAiZW51bSB7SW5zdGFuY2VDbGFzc31WYWx1ZXMiCisvLyBhbGxvd2luZyBDKysgY29kZSB0byByZWZlcmVuY2UgZWl0aGVyIHRoZSBwcmltYXJ5IGRhdGEgdGFibGUncyBlbnRyaWVzIChpZgorLy8gRW51bVZhbHVlRmllbGQgaXMgbm90IGRlZmluZWQpIG9yIHNvbWUgb3RoZXIgZmllbGQgKGUuZy4gZW5jb2RpbmcpIGlmIGl0IGlzLgorLy8KKy8vIEluc2lkZSB0aGUgSU1QTCBndWFyZCB3aWxsIGJlIGEgcHJpbWFyeSBkYXRhIHRhYmxlICJ7SW5zdGFuY2VDbGFzc31zTGlzdCIgYW5kCisvLyBhcyBtYW55IHNlYXJjaGFibGUgaW5kZXhlcyBhcyByZXF1ZXN0ZWQKKy8vICgie0luc3RhbmNlQ2xhc3N9c0J5e1NlYXJjaGFibGVGaWVsZH0iKS4gQWRkaXRpb25hbGx5IGltcGxlbWVudGF0aW9ucyBvZiB0aGUKKy8vIGxvb2t1cCBmdW5jdGlvbiB3aWxsIGJlIHByb3ZpZGVkLgorLy8KKy8vIFNlZSBBQXJjaDY0U3lzdGVtT3BlcmFuZHMudGQgYW5kIGl0cyBnZW5lcmF0ZWQgaGVhZGVyIGZvciBleGFtcGxlIHVzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgU2VhcmNoYWJsZVRhYmxlIHsKKyAgbGlzdDxzdHJpbmc+IFNlYXJjaGFibGVGaWVsZHM7CisgIHN0cmluZyBFbnVtTmFtZUZpZWxkID0gIk5hbWUiOworICBzdHJpbmcgRW51bVZhbHVlRmllbGQ7Cit9CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhYmxlR2VuL1NldFRoZW9yeS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9TZXRUaGVvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjMyZjllCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9TZXRUaGVvcnkuaApAQCAtMCwwICsxLDE0NSBAQAorLy89PT0tIFNldFRoZW9yeS5oIC0gR2VuZXJhdGUgb3JkZXJlZCBzZXRzIGZyb20gREFHIGV4cHJlc3Npb25zIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgU2V0VGhlb3J5IGNsYXNzIHRoYXQgY29tcHV0ZXMgb3JkZXJlZCBzZXRzIG9mCisvLyBSZWNvcmRzIGZyb20gREFHIGV4cHJlc3Npb25zLiAgT3BlcmF0b3JzIGZvciBzdGFuZGFyZCBzZXQgb3BlcmF0aW9ucyBhcmUKKy8vIHByZWRlZmluZWQsIGFuZCBpdCBpcyBwb3NzaWJsZSB0byBhZGQgc3BlY2lhbCBwdXJwb3NlIHNldCBvcGVyYXRvcnMgYXMgd2VsbC4KKy8vCisvLyBUaGUgdXNlciBtYXkgZGVmaW5lIG5hbWVkIHNldHMgYXMgUmVjb3JkcyBvZiBwcmVkZWZpbmVkIGNsYXNzZXMuIFNldAorLy8gZXhwYW5kZXJzIGNhbiBiZSBhZGRlZCB0byBhIFNldFRoZW9yeSBpbnN0YW5jZSB0byB0ZWFjaCBpdCBob3cgdG8gZmluZCB0aGUKKy8vIGVsZW1lbnRzIG9mIHN1Y2ggYSBuYW1lZCBzZXQuCisvLworLy8gVGhlc2UgYXJlIHRoZSBwcmVkZWZpbmVkIG9wZXJhdG9ycy4gVGhlIGFyZ3VtZW50IGxpc3RzIGNhbiBiZSBpbmRpdmlkdWFsCisvLyBlbGVtZW50cyAoZGVmcyksIG90aGVyIHNldHMgKGRlZnMgb2YgZXhwYW5kYWJsZSBjbGFzc2VzKSwgbGlzdHMsIG9yIERBRworLy8gZXhwcmVzc2lvbnMgdGhhdCBhcmUgZXZhbHVhdGVkIHJlY3Vyc2l2ZWx5LgorLy8KKy8vIC0gKGFkZCBTMSwgUzIgLi4uKSBVbmlvbiBzZXRzLiBUaGlzIGlzIGFsc28gaG93IHNldHMgYXJlIGNyZWF0ZWQgZnJvbSBlbGVtZW50CisvLyAgIGxpc3RzLgorLy8KKy8vIC0gKHN1YiBTMSwgUzIsIC4uLikgU2V0IGRpZmZlcmVuY2UuIEV2ZXJ5IGVsZW1lbnQgaW4gUzEgZXhjZXB0IGZvciB0aGUKKy8vICAgZWxlbWVudHMgaW4gUzIsIC4uLgorLy8KKy8vIC0gKGFuZCBTMSwgUzIpIFNldCBpbnRlcnNlY3Rpb24uIEV2ZXJ5IGVsZW1lbnQgaW4gUzEgdGhhdCBpcyBhbHNvIGluIFMyLgorLy8KKy8vIC0gKHNobCBTLCBOKSBTaGlmdCBsZWZ0LiBSZW1vdmUgdGhlIGZpcnN0IE4gZWxlbWVudHMgZnJvbSBTLgorLy8KKy8vIC0gKHRydW5jIFMsIE4pIFRydW5jYXRlLiBUaGUgZmlyc3QgTiBlbGVtZW50cyBvZiBTLgorLy8KKy8vIC0gKHJvdGwgUywgTikgUm90YXRlIGxlZnQuIFNhbWUgYXMgKGFkZCAoc2hsIFMsIE4pLCAodHJ1bmMgUywgTikpLgorLy8KKy8vIC0gKHJvdHIgUywgTikgUm90YXRlIHJpZ2h0LgorLy8KKy8vIC0gKGRlY2ltYXRlIFMsIE4pIERlY2ltYXRlIFMgYnkgcGlja2luZyBldmVyeSBOJ3RoIGVsZW1lbnQsIHN0YXJ0aW5nIHdpdGgKKy8vICAgdGhlIGZpcnN0IG9uZS4gRm9yIGluc3RhbmNlLCAoZGVjaW1hdGUgUywgMikgcmV0dXJucyB0aGUgZXZlbiBlbGVtZW50cyBvZgorLy8gICBTLgorLy8KKy8vIC0gKHNlcXVlbmNlICJGb3JtYXQiLCBGcm9tLCBUbykgR2VuZXJhdGUgYSBzZXF1ZW5jZSBvZiBkZWZzIHdpdGggcHJpbnRmLgorLy8gICBGb3IgaW5zdGFuY2UsIChzZXF1ZW5jZSAiUiV1IiwgMCwgMykgLT4gWyBSMCwgUjEsIFIyLCBSMyBdCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBQkxFR0VOX1NFVFRIRU9SWV9ICisjZGVmaW5lIExMVk1fVEFCTEVHRU5fU0VUVEhFT1JZX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU2V0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NNTG9jLmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRGFnSW5pdDsKK2NsYXNzIEluaXQ7CitjbGFzcyBSZWNvcmQ7CisKK2NsYXNzIFNldFRoZW9yeSB7CitwdWJsaWM6CisgIHVzaW5nIFJlY1ZlYyA9IHN0ZDo6dmVjdG9yPFJlY29yZCAqPjsKKyAgdXNpbmcgUmVjU2V0ID0gU21hbGxTZXRWZWN0b3I8UmVjb3JkICosIDE2PjsKKworICAvLy8gT3BlcmF0b3IgLSBBIGNhbGxiYWNrIHJlcHJlc2VudGluZyBhIERBRyBvcGVyYXRvci4KKyAgY2xhc3MgT3BlcmF0b3IgeworICAgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworICBwdWJsaWM6CisgICAgdmlydHVhbCB+T3BlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gYXBwbHkgLSBBcHBseSB0aGlzIG9wZXJhdG9yIHRvIEV4cHIncyBhcmd1bWVudHMgYW5kIGluc2VydCB0aGUgcmVzdWx0CisgICAgLy8vIGluIEVsdHMuCisgICAgdmlydHVhbCB2b2lkIGFwcGx5KFNldFRoZW9yeSYsIERhZ0luaXQgKkV4cHIsIFJlY1NldCAmRWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U01Mb2M+IExvYykgPSAwOworICB9OworCisgIC8vLyBFeHBhbmRlciAtIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBjYW4gdHJhbnNmb3JtIGEgUmVjb3JkIHJlcHJlc2VudGluZyBhCisgIC8vLyBzZXQgaW50byBhIGZ1bGx5IGV4cGFuZGVkIGxpc3Qgb2YgZWxlbWVudHMuIEV4cGFuZGVycyBwcm92aWRlIGEgd2F5IGZvcgorICAvLy8gdXNlcnMgdG8gZGVmaW5lIG5hbWVkIHNldHMgdGhhdCBjYW4gYmUgdXNlZCBpbiBEQUcgZXhwcmVzc2lvbnMuCisgIGNsYXNzIEV4cGFuZGVyIHsKKyAgICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKKyAgcHVibGljOgorICAgIHZpcnR1YWwgfkV4cGFuZGVyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB2b2lkIGV4cGFuZChTZXRUaGVvcnkmLCBSZWNvcmQqLCBSZWNTZXQgJkVsdHMpID0gMDsKKyAgfTsKKworcHJpdmF0ZToKKyAgLy8gTWFwIHNldCBkZWZzIHRvIHRoZWlyIGZ1bGx5IGV4cGFuZGVkIGNvbnRlbnRzLiBUaGlzIHNlcnZlcyBhcyBhIG1lbW9pemF0aW9uCisgIC8vIGNhY2hlIGFuZCBpdCBtYWtlcyBpdCBwb3NzaWJsZSB0byByZXR1cm4gY29uc3QgcmVmZXJlbmNlcyBvbiBxdWVyaWVzLgorICB1c2luZyBFeHBhbmRNYXAgPSBzdGQ6Om1hcDxSZWNvcmQgKiwgUmVjVmVjPjsKKyAgRXhwYW5kTWFwIEV4cGFuc2lvbnM7CisKKyAgLy8gS25vd24gREFHIG9wZXJhdG9ycyBieSBuYW1lLgorICBTdHJpbmdNYXA8c3RkOjp1bmlxdWVfcHRyPE9wZXJhdG9yPj4gT3BlcmF0b3JzOworCisgIC8vIFR5cGVkIGV4cGFuZGVycyBieSBjbGFzcyBuYW1lLgorICBTdHJpbmdNYXA8c3RkOjp1bmlxdWVfcHRyPEV4cGFuZGVyPj4gRXhwYW5kZXJzOworCitwdWJsaWM6CisgIC8vLyBDcmVhdGUgYSBTZXRUaGVvcnkgaW5zdGFuY2Ugd2l0aCBvbmx5IHRoZSBzdGFuZGFyZCBvcGVyYXRvcnMuCisgIFNldFRoZW9yeSgpOworCisgIC8vLyBhZGRFeHBhbmRlciAtIEFkZCBhbiBleHBhbmRlciBmb3IgUmVjb3JkcyB3aXRoIHRoZSBuYW1lZCBzdXBlciBjbGFzcy4KKyAgdm9pZCBhZGRFeHBhbmRlcihTdHJpbmdSZWYgQ2xhc3NOYW1lLCBzdGQ6OnVuaXF1ZV9wdHI8RXhwYW5kZXI+KTsKKworICAvLy8gYWRkRmllbGRFeHBhbmRlciAtIEFkZCBhbiBleHBhbmRlciBmb3IgQ2xhc3NOYW1lIHRoYXQgc2ltcGx5IGV2YWx1YXRlcworICAvLy8gRmllbGROYW1lIGluIHRoZSBSZWNvcmQgdG8gZ2V0IHRoZSBzZXQgZWxlbWVudHMuICBUaGF0IGlzIGFsbCB0aGF0IGlzCisgIC8vLyBuZWVkZWQgZm9yIGEgY2xhc3MgbGlrZToKKyAgLy8vCisgIC8vLyAgIGNsYXNzIFNldDxkYWcgZD4geworICAvLy8gICAgIGRhZyBFbHRzID0gZDsKKyAgLy8vICAgfQorICAvLy8KKyAgdm9pZCBhZGRGaWVsZEV4cGFuZGVyKFN0cmluZ1JlZiBDbGFzc05hbWUsIFN0cmluZ1JlZiBGaWVsZE5hbWUpOworCisgIC8vLyBhZGRPcGVyYXRvciAtIEFkZCBhIERBRyBvcGVyYXRvci4KKyAgdm9pZCBhZGRPcGVyYXRvcihTdHJpbmdSZWYgTmFtZSwgc3RkOjp1bmlxdWVfcHRyPE9wZXJhdG9yPik7CisKKyAgLy8vIGV2YWx1YXRlIC0gRXZhbHVhdGUgRXhwciBhbmQgYXBwZW5kIHRoZSByZXN1bHRpbmcgc2V0IHRvIEVsdHMuCisgIHZvaWQgZXZhbHVhdGUoSW5pdCAqRXhwciwgUmVjU2V0ICZFbHRzLCBBcnJheVJlZjxTTUxvYz4gTG9jKTsKKworICAvLy8gZXZhbHVhdGUgLSBFdmFsdWF0ZSBhIHNlcXVlbmNlIG9mIEluaXRzIGFuZCBhcHBlbmQgdG8gRWx0cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSXRlcj4KKyAgdm9pZCBldmFsdWF0ZShJdGVyIGJlZ2luLCBJdGVyIGVuZCwgUmVjU2V0ICZFbHRzLCBBcnJheVJlZjxTTUxvYz4gTG9jKSB7CisgICAgd2hpbGUgKGJlZ2luICE9IGVuZCkKKyAgICAgIGV2YWx1YXRlKCpiZWdpbisrLCBFbHRzLCBMb2MpOworICB9CisKKyAgLy8vIGV4cGFuZCAtIEV4cGFuZCBhIHJlY29yZCBpbnRvIGEgc2V0IG9mIGVsZW1lbnRzIGlmIHBvc3NpYmxlLiAgUmV0dXJuIGEKKyAgLy8vIHBvaW50ZXIgdG8gdGhlIGV4cGFuZGVkIGVsZW1lbnRzLCBvciBOVUxMIGlmIFNldCBjYW5ub3QgYmUgZXhwYW5kZWQKKyAgLy8vIGZ1cnRoZXIuCisgIGNvbnN0IFJlY1ZlYyAqZXhwYW5kKFJlY29yZCAqU2V0KTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RBQkxFR0VOX1NFVFRIRU9SWV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhYmxlR2VuL1N0cmluZ01hdGNoZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFibGVHZW4vU3RyaW5nTWF0Y2hlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZDIwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhYmxlR2VuL1N0cmluZ01hdGNoZXIuaApAQCAtMCwwICsxLDU2IEBACisvLz09PS0gU3RyaW5nTWF0Y2hlci5oIC0gR2VuZXJhdGUgYSBtYXRjaGVyIGZvciBpbnB1dCBzdHJpbmdzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBTdHJpbmdNYXRjaGVyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQUJMRUdFTl9TVFJJTkdNQVRDSEVSX0gKKyNkZWZpbmUgTExWTV9UQUJMRUdFTl9TVFJJTkdNQVRDSEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIFN0cmluZ01hdGNoZXIgLSBHaXZlbiBhIGxpc3Qgb2Ygc3RyaW5ncyBhbmQgY29kZSB0byBleGVjdXRlIHdoZW4gdGhleSBtYXRjaCwKKy8vLyBvdXRwdXQgYSBzaW1wbGUgc3dpdGNoIHRyZWUgdG8gY2xhc3NpZnkgdGhlIGlucHV0IHN0cmluZy4KKy8vLworLy8vIElmIGEgbWF0Y2ggaXMgZm91bmQsIHRoZSBjb2RlIGluIFZhbHNbaV0uc2Vjb25kIGlzIGV4ZWN1dGVkOyBjb250cm9sIG11c3QKKy8vLyBub3QgZXhpdCB0aGlzIGNvZGUgZnJhZ21lbnQuICBJZiBub3RoaW5nIG1hdGNoZXMsIGV4ZWN1dGlvbiBmYWxscyB0aHJvdWdoLgorLy8vCitjbGFzcyBTdHJpbmdNYXRjaGVyIHsKK3B1YmxpYzoKKyAgdXNpbmcgU3RyaW5nUGFpciA9IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OworCitwcml2YXRlOgorICBTdHJpbmdSZWYgU3RyVmFyaWFibGVOYW1lOworICBjb25zdCBzdGQ6OnZlY3RvcjxTdHJpbmdQYWlyPiAmTWF0Y2hlczsKKyAgcmF3X29zdHJlYW0gJk9TOworCitwdWJsaWM6CisgIFN0cmluZ01hdGNoZXIoU3RyaW5nUmVmIHN0clZhcmlhYmxlTmFtZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTdHJpbmdQYWlyPiAmbWF0Y2hlcywgcmF3X29zdHJlYW0gJm9zKQorICAgIDogU3RyVmFyaWFibGVOYW1lKHN0clZhcmlhYmxlTmFtZSksIE1hdGNoZXMobWF0Y2hlcyksIE9TKG9zKSB7fQorCisgIHZvaWQgRW1pdCh1bnNpZ25lZCBJbmRlbnQgPSAwLCBib29sIElnbm9yZUR1cGxpY2F0ZXMgPSBmYWxzZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGJvb2wgRW1pdFN0cmluZ01hdGNoZXJGb3JDaGFyKGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IFN0cmluZ1BhaXIgKj4gJk1hdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENoYXJObywgdW5zaWduZWQgSW5kZW50Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSWdub3JlRHVwbGljYXRlcykgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UQUJMRUdFTl9TVFJJTkdNQVRDSEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFibGVHZW4vU3RyaW5nVG9PZmZzZXRUYWJsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9TdHJpbmdUb09mZnNldFRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxMWU4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFibGVHZW4vU3RyaW5nVG9PZmZzZXRUYWJsZS5oCkBAIC0wLDAgKzEsMTA1IEBACisvLz09PS0gU3RyaW5nVG9PZmZzZXRUYWJsZS5oIC0gRW1pdCBhIGJpZyBjb25jYXRlbmF0ZWQgc3RyaW5nIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFCTEVHRU5fU1RSSU5HVE9PRkZTRVRUQUJMRV9ICisjZGVmaW5lIExMVk1fVEFCTEVHRU5fU1RSSU5HVE9PRkZTRVRUQUJMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGNjdHlwZT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gU3RyaW5nVG9PZmZzZXRUYWJsZSAtIFRoaXMgY2xhc3MgdW5pcXVlcyBhIGJ1bmNoIG9mIG51bC10ZXJtaW5hdGVkIHN0cmluZ3MKKy8vLyBhbmQga2VlcHMgdHJhY2sgb2YgdGhlaXIgb2Zmc2V0IGluIGEgbWFzc2l2ZSBjb250aWd1b3VzIHN0cmluZyBhbGxvY2F0aW9uLgorLy8vIEl0IGNhbiB0aGVuIG91dHB1dCB0aGlzIHN0cmluZyBibG9iIGFuZCB1c2UgaW5kZXhlcyBpbnRvIHRoZSBzdHJpbmcgdG8KKy8vLyByZWZlcmVuY2UgZWFjaCBwaWVjZS4KK2NsYXNzIFN0cmluZ1RvT2Zmc2V0VGFibGUgeworICBTdHJpbmdNYXA8dW5zaWduZWQ+IFN0cmluZ09mZnNldDsKKyAgc3RkOjpzdHJpbmcgQWdncmVnYXRlU3RyaW5nOworCitwdWJsaWM6CisgIGJvb2wgRW1wdHkoKSBjb25zdCB7IHJldHVybiBTdHJpbmdPZmZzZXQuZW1wdHkoKTsgfQorCisgIHVuc2lnbmVkIEdldE9yQWRkU3RyaW5nT2Zmc2V0KFN0cmluZ1JlZiBTdHIsIGJvb2wgYXBwZW5kWmVybyA9IHRydWUpIHsKKyAgICBhdXRvIEl0ZXJCb29sID0KKyAgICAgICAgU3RyaW5nT2Zmc2V0Lmluc2VydChzdGQ6Om1ha2VfcGFpcihTdHIsIEFnZ3JlZ2F0ZVN0cmluZy5zaXplKCkpKTsKKyAgICBpZiAoSXRlckJvb2wuc2Vjb25kKSB7CisgICAgICAvLyBBZGQgdGhlIHN0cmluZyB0byB0aGUgYWdncmVnYXRlIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgZm91bmQuCisgICAgICBBZ2dyZWdhdGVTdHJpbmcuYXBwZW5kKFN0ci5iZWdpbigpLCBTdHIuZW5kKCkpOworICAgICAgaWYgKGFwcGVuZFplcm8pCisgICAgICAgIEFnZ3JlZ2F0ZVN0cmluZyArPSAnXDAnOworICAgIH0KKworICAgIHJldHVybiBJdGVyQm9vbC5maXJzdC0+c2Vjb25kOworICB9CisKKyAgdm9pZCBFbWl0U3RyaW5nKHJhd19vc3RyZWFtICZPKSB7CisgICAgLy8gRXNjYXBlIHRoZSBzdHJpbmcuCisgICAgU21hbGxTdHJpbmc8MjU2PiBTdHI7CisgICAgcmF3X3N2ZWN0b3Jfb3N0cmVhbShTdHIpLndyaXRlX2VzY2FwZWQoQWdncmVnYXRlU3RyaW5nKTsKKyAgICBBZ2dyZWdhdGVTdHJpbmcgPSBTdHIuc3RyKCk7CisKKyAgICBPIDw8ICIgICAgXCIiOworICAgIHVuc2lnbmVkIENoYXJzUHJpbnRlZCA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFnZ3JlZ2F0ZVN0cmluZy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBpZiAoQ2hhcnNQcmludGVkID4gNzApIHsKKyAgICAgICAgTyA8PCAiXCJcbiAgICBcIiI7CisgICAgICAgIENoYXJzUHJpbnRlZCA9IDA7CisgICAgICB9CisgICAgICBPIDw8IEFnZ3JlZ2F0ZVN0cmluZ1tpXTsKKyAgICAgICsrQ2hhcnNQcmludGVkOworCisgICAgICAvLyBQcmludCBlc2NhcGUgc2VxdWVuY2VzIGFsbCB0b2dldGhlci4KKyAgICAgIGlmIChBZ2dyZWdhdGVTdHJpbmdbaV0gIT0gJ1xcJykKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGFzc2VydChpICsgMSA8IEFnZ3JlZ2F0ZVN0cmluZy5zaXplKCkgJiYgIkluY29tcGxldGUgZXNjYXBlIHNlcXVlbmNlISIpOworICAgICAgaWYgKGlzZGlnaXQoQWdncmVnYXRlU3RyaW5nW2kgKyAxXSkpIHsKKyAgICAgICAgYXNzZXJ0KGlzZGlnaXQoQWdncmVnYXRlU3RyaW5nW2kgKyAyXSkgJiYKKyAgICAgICAgICAgICAgIGlzZGlnaXQoQWdncmVnYXRlU3RyaW5nW2kgKyAzXSkgJiYKKyAgICAgICAgICAgICAgICJFeHBlY3RlZCAzIGRpZ2l0IG9jdGFsIGVzY2FwZSEiKTsKKyAgICAgICAgTyA8PCBBZ2dyZWdhdGVTdHJpbmdbKytpXTsKKyAgICAgICAgTyA8PCBBZ2dyZWdhdGVTdHJpbmdbKytpXTsKKyAgICAgICAgTyA8PCBBZ2dyZWdhdGVTdHJpbmdbKytpXTsKKyAgICAgICAgQ2hhcnNQcmludGVkICs9IDM7CisgICAgICB9IGVsc2UgeworICAgICAgICBPIDw8IEFnZ3JlZ2F0ZVN0cmluZ1srK2ldOworICAgICAgICArK0NoYXJzUHJpbnRlZDsKKyAgICAgIH0KKyAgICB9CisgICAgTyA8PCAiXCIiOworICB9CisKKyAgLy8vIEVtaXQgdGhlIHN0cmluZyB1c2luZyBjaGFyYWN0ZXIgbGl0ZXJhbHMuIE1TVkMgaGFzIGEgbGltaXRhdGlvbiB0aGF0CisgIC8vLyBzdHJpbmcgbGl0ZXJhbHMgY2Fubm90IGJlIGxvbmdlciB0aGFuIDY0Sy4KKyAgdm9pZCBFbWl0Q2hhckFycmF5KHJhd19vc3RyZWFtICZPKSB7CisgICAgYXNzZXJ0KEFnZ3JlZ2F0ZVN0cmluZy5maW5kKCcpJykgPT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYKKyAgICAgICAgICAgImNhbid0IGVtaXQgcmF3IHN0cmluZyB3aXRoIGNsb3NpbmcgcGFyZW5zIik7CisgICAgaW50IENvdW50ID0gMDsKKyAgICBPIDw8ICcgJzsKKyAgICBmb3IgKGNoYXIgQyA6IEFnZ3JlZ2F0ZVN0cmluZykgeworICAgICAgTyA8PCAiIFwnIjsKKyAgICAgIE8ud3JpdGVfZXNjYXBlZChTdHJpbmdSZWYoJkMsIDEpKTsKKyAgICAgIE8gPDwgIlwnLCI7CisgICAgICBDb3VudCsrOworICAgICAgaWYgKENvdW50ID4gMTQpIHsKKyAgICAgICAgTyA8PCAiXG4gIjsKKyAgICAgICAgQ291bnQgPSAwOworICAgICAgfQorICAgIH0KKyAgICBPIDw8ICdcbic7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9UYWJsZUdlbkJhY2tlbmQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFibGVHZW4vVGFibGVHZW5CYWNrZW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyNmYxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFibGVHZW4vVGFibGVHZW5CYWNrZW5kLmgKQEAgLTAsMCArMSwyOCBAQAorLy89PT0tIGxsdm0vVGFibGVHZW4vVGFibGVHZW5CYWNrZW5kLmggLSBCYWNrZW5kIHV0aWxpdGllcyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBVc2VmdWwgdXRpbGl0aWVzIGZvciBUYWJsZUdlbiBiYWNrZW5kcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFCTEVHRU5fVEFCTEVHRU5CQUNLRU5EX0gKKyNkZWZpbmUgTExWTV9UQUJMRUdFTl9UQUJMRUdFTkJBQ0tFTkRfSAorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFN0cmluZ1JlZjsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gZW1pdFNvdXJjZUZpbGVIZWFkZXIgLSBPdXRwdXQgYW4gTExWTSBzdHlsZSBmaWxlIGhlYWRlciB0byB0aGUgc3BlY2lmaWVkCisvLy8gcmF3X29zdHJlYW0uCit2b2lkIGVtaXRTb3VyY2VGaWxlSGVhZGVyKFN0cmluZ1JlZiBEZXNjLCByYXdfb3N0cmVhbSAmT1MpOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L0NvZGVHZW5DV3JhcHBlcnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L0NvZGVHZW5DV3JhcHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWE5OTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvQ29kZUdlbkNXcmFwcGVycy5oCkBAIC0wLDAgKzEsNjEgQEAKKy8vPT09LSBsbHZtL1RhcmdldC9Db2RlR2VuQ1dyYXBwZXJzLmggLSBDb2RlR2VuIEMgV3JhcHBlcnMgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgQyBiaW5kaW5ncyB3cmFwcGVycyBmb3IgZW51bXMgaW4gbGx2bS9TdXBwb3J0L0NvZGVHZW4uaAorLy8gdGhhdCBuZWVkIHRoZW0uICBUaGUgd3JhcHBlcnMgYXJlIHNlcGFyYXRlZCB0byBhdm9pZCBhZGRpbmcgYW4gaW5kaXJlY3QKKy8vIGRlcGVuZGVuY3kgb24gbGx2bS9Db25maWcvVGFyZ2V0cy5kZWYgdG8gQ29kZUdlbi5oLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfQ09ERUdFTkNXUkFQUEVSU19ICisjZGVmaW5lIExMVk1fVEFSR0VUX0NPREVHRU5DV1JBUFBFUlNfSAorCisjaW5jbHVkZSAibGx2bS1jL1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db2RlR2VuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitpbmxpbmUgT3B0aW9uYWw8Q29kZU1vZGVsOjpNb2RlbD4gdW53cmFwKExMVk1Db2RlTW9kZWwgTW9kZWwsIGJvb2wgJkpJVCkgeworICBKSVQgPSBmYWxzZTsKKyAgc3dpdGNoIChNb2RlbCkgeworICBjYXNlIExMVk1Db2RlTW9kZWxKSVREZWZhdWx0OgorICAgIEpJVCA9IHRydWU7CisgICAgTExWTV9GQUxMVEhST1VHSDsKKyAgY2FzZSBMTFZNQ29kZU1vZGVsRGVmYXVsdDoKKyAgICByZXR1cm4gTm9uZTsKKyAgY2FzZSBMTFZNQ29kZU1vZGVsU21hbGw6CisgICAgcmV0dXJuIENvZGVNb2RlbDo6U21hbGw7CisgIGNhc2UgTExWTUNvZGVNb2RlbEtlcm5lbDoKKyAgICByZXR1cm4gQ29kZU1vZGVsOjpLZXJuZWw7CisgIGNhc2UgTExWTUNvZGVNb2RlbE1lZGl1bToKKyAgICByZXR1cm4gQ29kZU1vZGVsOjpNZWRpdW07CisgIGNhc2UgTExWTUNvZGVNb2RlbExhcmdlOgorICAgIHJldHVybiBDb2RlTW9kZWw6OkxhcmdlOworICB9CisgIHJldHVybiBDb2RlTW9kZWw6OlNtYWxsOworfQorCitpbmxpbmUgTExWTUNvZGVNb2RlbCB3cmFwKENvZGVNb2RlbDo6TW9kZWwgTW9kZWwpIHsKKyAgc3dpdGNoIChNb2RlbCkgeworICBjYXNlIENvZGVNb2RlbDo6U21hbGw6CisgICAgcmV0dXJuIExMVk1Db2RlTW9kZWxTbWFsbDsKKyAgY2FzZSBDb2RlTW9kZWw6Oktlcm5lbDoKKyAgICByZXR1cm4gTExWTUNvZGVNb2RlbEtlcm5lbDsKKyAgY2FzZSBDb2RlTW9kZWw6Ok1lZGl1bToKKyAgICByZXR1cm4gTExWTUNvZGVNb2RlbE1lZGl1bTsKKyAgY2FzZSBDb2RlTW9kZWw6OkxhcmdlOgorICAgIHJldHVybiBMTFZNQ29kZU1vZGVsTGFyZ2U7CisgIH0KKyAgbGx2bV91bnJlYWNoYWJsZSgiQmFkIENvZGVNb2RlbCEiKTsKK30KK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9HZW5lcmljT3Bjb2Rlcy50ZCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L0dlbmVyaWNPcGNvZGVzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZjZhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9HZW5lcmljT3Bjb2Rlcy50ZApAQCAtMCwwICsxLDY0NCBAQAorLy89PT0tLSBHZW5lcmljT3Bjb2Rlcy50ZCAtIE9wY29kZXMgdXNlZCB3aXRoIEdsb2JhbElTZWwgLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZ2VuZXJpYyBvcGNvZGVzIHVzZWQgd2l0aCBHbG9iYWxJU2VsLgorLy8gQWZ0ZXIgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uLCB0aGVzZSBvcGNvZGVzIHNob3VsZCBub3QgYXBwZWFyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVbmFyeSBvcHMuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBHZW5lcmljSW5zdHJ1Y3Rpb24gOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uOworCisvLyBFeHRlbmQgdGhlIHVuZGVybHlpbmcgc2NhbGFyIHR5cGUgb2YgYW4gb3BlcmF0aW9uLCBsZWF2aW5nIHRoZSBoaWdoIGJpdHMKKy8vIHVuc3BlY2lmaWVkLgorZGVmIEdfQU5ZRVhUIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMTokc3JjKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gU2lnbiBleHRlbmQgdGhlIHVuZGVybHlpbmcgc2NhbGFyIHR5cGUgb2YgYW4gb3BlcmF0aW9uLCBjb3B5aW5nIHRoZSBzaWduIGJpdAorLy8gaW50byB0aGUgbmV3bHktY3JlYXRlZCBzcGFjZS4KK2RlZiBHX1NFWFQgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUxOiRzcmMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLyBaZXJvIGV4dGVuZCB0aGUgdW5kZXJseWluZyBzY2FsYXIgdHlwZSBvZiBhbiBvcGVyYXRpb24sIHB1dHRpbmcgemVybyBiaXRzCisvLyBpbnRvIHRoZSBuZXdseS1jcmVhdGVkIHNwYWNlLgorZGVmIEdfWkVYVCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTE6JHNyYyk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKworLy8gVHJ1bmNhdGUgdGhlIHVuZGVybHlpbmcgc2NhbGFyIHR5cGUgb2YgYW4gb3BlcmF0aW9uLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KKy8vIEdfRVhUUkFDVCBmb3Igc2NhbGFyIHR5cGVzLCBidXQgYWN0cyBlbGVtZW50d2lzZSBvbiB2ZWN0b3JzLgorZGVmIEdfVFJVTkMgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUxOiRzcmMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCitkZWYgR19JTVBMSUNJVF9ERUYgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworZGVmIEdfUEhJIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB2YXJpYWJsZV9vcHMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCitkZWYgR19GUkFNRV9JTkRFWCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdW5rbm93bjokc3JjMik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKK2RlZiBHX0dMT0JBTF9WQUxVRSA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdW5rbm93bjokc3JjKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworZGVmIEdfSU5UVE9QVFIgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUxOiRzcmMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCitkZWYgR19QVFJUT0lOVCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTE6JHNyYyk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKK2RlZiBHX0JJVENBU1QgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUxOiRzcmMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCitkZWYgR19DT05TVEFOVCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdW5rbm93bjokaW1tKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworZGVmIEdfRkNPTlNUQU5UIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB1bmtub3duOiRpbW0pOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCitkZWYgR19WQVNUQVJUIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JGxpc3QpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgbWF5U3RvcmUgPSAxOworfQorCitkZWYgR19WQUFSRyA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiR2YWwpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTE6JGxpc3QsIHVua25vd246JGFsaWduKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IG1heUxvYWQgPSAxOworICBsZXQgbWF5U3RvcmUgPSAxOworfQorCitkZWYgR19CU1dBUCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYyk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCaW5hcnkgb3BzLgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gR2VuZXJpYyBhZGRpdGlvbi4KK2RlZiBHX0FERCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEsIHR5cGUwOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IDE7Cit9CisKKy8vIEdlbmVyaWMgc3VidHJhY3Rpb24uCitkZWYgR19TVUIgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc0NvbW11dGFibGUgPSAwOworfQorCisvLyBHZW5lcmljIG11bHRpcGxpY2F0aW9uLgorZGVmIEdfTVVMIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNDb21tdXRhYmxlID0gMTsKK30KKworLy8gR2VuZXJpYyBzaWduZWQgZGl2aXNpb24uCitkZWYgR19TRElWIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNDb21tdXRhYmxlID0gMDsKK30KKworLy8gR2VuZXJpYyB1bnNpZ25lZCBkaXZpc2lvbi4KK2RlZiBHX1VESVYgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc0NvbW11dGFibGUgPSAwOworfQorCisvLyBHZW5lcmljIHNpZ25lZCByZW1haW5kZXIuCitkZWYgR19TUkVNIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNDb21tdXRhYmxlID0gMDsKK30KKworLy8gR2VuZXJpYyB1bnNpZ25lZCByZW1haW5kZXIuCitkZWYgR19VUkVNIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNDb21tdXRhYmxlID0gMDsKK30KKworLy8gR2VuZXJpYyBiaXR3aXNlIGFuZC4KK2RlZiBHX0FORCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEsIHR5cGUwOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IDE7Cit9CisKKy8vIEdlbmVyaWMgYml0d2lzZSBvci4KK2RlZiBHX09SIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNDb21tdXRhYmxlID0gMTsKK30KKworLy8gR2VuZXJpYyBiaXR3aXNlIHhvci4KK2RlZiBHX1hPUiA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEsIHR5cGUwOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IDE7Cit9CisKKy8vIEdlbmVyaWMgbGVmdC1zaGlmdC4KK2RlZiBHX1NITCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEsIHR5cGUwOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gR2VuZXJpYyBsb2dpY2FsIHJpZ2h0LXNoaWZ0LgorZGVmIEdfTFNIUiA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEsIHR5cGUwOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gR2VuZXJpYyBhcml0aG1ldGljIHJpZ2h0LXNoaWZ0LgorZGVmIEdfQVNIUiA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEsIHR5cGUwOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gR2VuZXJpYyBpbnRlZ2VyIGNvbXBhcmlzb24uCitkZWYgR19JQ01QIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB1bmtub3duOiR0c3QsIHR5cGUxOiRzcmMxLCB0eXBlMTokc3JjMik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vIEdlbmVyaWMgZmxvYXRpbmctcG9pbnQgY29tcGFyaXNvbi4KK2RlZiBHX0ZDTVAgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHVua25vd246JHRzdCwgdHlwZTE6JHNyYzEsIHR5cGUxOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gR2VuZXJpYyBzZWxlY3QKK2RlZiBHX1NFTEVDVCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTE6JHRzdCwgdHlwZTA6JHNyYzEsIHR5cGUwOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gR2VuZXJpYyBwb2ludGVyIG9mZnNldC4KK2RlZiBHX0dFUCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEsIHR5cGUxOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworZGVmIEdfUFRSX01BU0sgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMsIHVua25vd246JGJpdHMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3ZlcmZsb3cgb3BzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBHZW5lcmljIHVuc2lnbmVkIGFkZGl0aW9uIGNvbnN1bWluZyBhbmQgcHJvZHVjaW5nIGEgY2FycnkgZmxhZy4KK2RlZiBHX1VBRERFIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCwgdHlwZTE6JGNhcnJ5X291dCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIsIHR5cGUxOiRjYXJyeV9pbik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vIEdlbmVyaWMgc2lnbmVkIGFkZGl0aW9uIHByb2R1Y2luZyBhIGNhcnJ5IGZsYWcuCitkZWYgR19TQURETyA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QsIHR5cGUxOiRjYXJyeV9vdXQpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEsIHR5cGUwOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IDE7Cit9CisKKy8vIEdlbmVyaWMgdW5zaWduZWQgc3VidHJhY3Rpb24gY29uc3VtaW5nIGFuZCBwcm9kdWNpbmcgYSBjYXJyeSBmbGFnLgorZGVmIEdfVVNVQkUgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0LCB0eXBlMTokY2Fycnlfb3V0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMiwgdHlwZTE6JGNhcnJ5X2luKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gR2VuZXJpYyB1bnNpZ25lZCBzdWJ0cmFjdGlvbiBwcm9kdWNpbmcgYSBjYXJyeSBmbGFnLgorZGVmIEdfU1NVQk8gOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0LCB0eXBlMTokY2Fycnlfb3V0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vIEdlbmVyaWMgdW5zaWduZWQgbXVsdGlwbGljYXRpb24gcHJvZHVjaW5nIGEgY2FycnkgZmxhZy4KK2RlZiBHX1VNVUxPIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCwgdHlwZTE6JGNhcnJ5X291dCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNDb21tdXRhYmxlID0gMTsKK30KKworLy8gR2VuZXJpYyBzaWduZWQgbXVsdGlwbGljYXRpb24gcHJvZHVjaW5nIGEgY2FycnkgZmxhZy4KK2RlZiBHX1NNVUxPIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCwgdHlwZTE6JGNhcnJ5X291dCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNDb21tdXRhYmxlID0gMTsKK30KKworLy8gTXVsdGlwbHkgdHdvIG51bWJlcnMgYXQgdHdpY2UgdGhlIGluY29taW5nIGJpdCB3aWR0aCAodW5zaWduZWQpIGFuZCByZXR1cm4KKy8vIHRoZSBoaWdoIGhhbGYgb2YgdGhlIHJlc3VsdC4KK2RlZiBHX1VNVUxIIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNDb21tdXRhYmxlID0gMTsKK30KKworLy8gTXVsdGlwbHkgdHdvIG51bWJlcnMgYXQgdHdpY2UgdGhlIGluY29taW5nIGJpdCB3aWR0aCAoc2lnbmVkKSBhbmQgcmV0dXJuCisvLyB0aGUgaGlnaCBoYWxmIG9mIHRoZSByZXN1bHQuCitkZWYgR19TTVVMSCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEsIHR5cGUwOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGbG9hdGluZyBQb2ludCBVbmFyeSBPcHMuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgR19GTkVHIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworZGVmIEdfRlBFWFQgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUxOiRzcmMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCitkZWYgR19GUFRSVU5DIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMTokc3JjKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworZGVmIEdfRlBUT1NJIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMTokc3JjKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworZGVmIEdfRlBUT1VJIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMTokc3JjKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworZGVmIEdfU0lUT0ZQIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMTokc3JjKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworZGVmIEdfVUlUT0ZQIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMTokc3JjKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworZGVmIEdfRkFCUyA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYyk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGbG9hdGluZyBQb2ludCBCaW5hcnkgb3BzLgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gR2VuZXJpYyBGUCBhZGRpdGlvbi4KK2RlZiBHX0ZBREQgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc0NvbW11dGFibGUgPSAxOworfQorCisvLyBHZW5lcmljIEZQIHN1YnRyYWN0aW9uLgorZGVmIEdfRlNVQiA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEsIHR5cGUwOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IDA7Cit9CisKKy8vIEdlbmVyaWMgRlAgbXVsdGlwbGljYXRpb24uCitkZWYgR19GTVVMIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNDb21tdXRhYmxlID0gMTsKK30KKworLy8gR2VuZXJpYyBmdXNlZCBtdWx0aXBseS1hZGQgaW5zdHJ1Y3Rpb24uCisvLyBCZWhhdmVzIGxpa2UgbGx2bSBmbWEgaW50cmluc2ljIGllIHNyYzEgKiBzcmMyICsgc3JjMworZGVmIEdfRk1BIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIsIHR5cGUwOiRzcmMzKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IDA7Cit9CisKKy8vIEdlbmVyaWMgRlAgZGl2aXNpb24uCitkZWYgR19GRElWIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLyBHZW5lcmljIEZQIHJlbWFpbmRlci4KK2RlZiBHX0ZSRU0gOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vIEZsb2F0aW5nIHBvaW50IGV4cG9uZW50aWF0aW9uLgorZGVmIEdfRlBPVyA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEsIHR5cGUwOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gRmxvYXRpbmcgcG9pbnQgYmFzZS1lIGV4cG9uZW50aWFsIG9mIGEgdmFsdWUuCitkZWYgR19GRVhQIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vIEZsb2F0aW5nIHBvaW50IGJhc2UtMiBleHBvbmVudGlhbCBvZiBhIHZhbHVlLgorZGVmIEdfRkVYUDIgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gRmxvYXRpbmcgcG9pbnQgYmFzZS0yIGxvZ2FyaXRobSBvZiBhIHZhbHVlLgorZGVmIEdfRkxPRyA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLyBGbG9hdGluZyBwb2ludCBiYXNlLTIgbG9nYXJpdGhtIG9mIGEgdmFsdWUuCitkZWYgR19GTE9HMiA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWVtb3J5IG9wcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gR2VuZXJpYyBsb2FkLiBFeHBlY3RzIGEgTWFjaGluZU1lbU9wZXJhbmQgaW4gYWRkaXRpb24gdG8gZXhwbGljaXQgb3BlcmFuZHMuCitkZWYgR19MT0FEIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyBwdHlwZTE6JGFkZHIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgbWF5TG9hZCA9IDE7Cit9CisKKy8vIEdlbmVyaWMgc3RvcmUuIEV4cGVjdHMgYSBNYWNoaW5lTWVtT3BlcmFuZCBpbiBhZGRpdGlvbiB0byBleHBsaWNpdCBvcGVyYW5kcy4KK2RlZiBHX1NUT1JFIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYywgcHR5cGUxOiRhZGRyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IG1heVN0b3JlID0gMTsKK30KKworLy8gR2VuZXJpYyBhdG9taWMgY21weGNoZyB3aXRoIGludGVybmFsIHN1Y2Nlc3MgY2hlY2suIEV4cGVjdHMgYQorLy8gTWFjaGluZU1lbU9wZXJhbmQgaW4gYWRkaXRpb24gdG8gZXhwbGljaXQgb3BlcmFuZHMuCitkZWYgR19BVE9NSUNfQ01QWENIR19XSVRIX1NVQ0NFU1MgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokb2xkdmFsLCB0eXBlMTokc3VjY2Vzcyk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMjokYWRkciwgdHlwZTA6JGNtcHZhbCwgdHlwZTA6JG5ld3ZhbCk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBtYXlMb2FkID0gMTsKKyAgbGV0IG1heVN0b3JlID0gMTsKK30KKworLy8gR2VuZXJpYyBhdG9taWMgY21weGNoZy4gRXhwZWN0cyBhIE1hY2hpbmVNZW1PcGVyYW5kIGluIGFkZGl0aW9uIHRvIGV4cGxpY2l0CisvLyBvcGVyYW5kcy4KK2RlZiBHX0FUT01JQ19DTVBYQ0hHIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JG9sZHZhbCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyBwdHlwZTE6JGFkZHIsIHR5cGUwOiRjbXB2YWwsIHR5cGUwOiRuZXd2YWwpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgbWF5TG9hZCA9IDE7CisgIGxldCBtYXlTdG9yZSA9IDE7Cit9CisKKy8vIEdlbmVyaWMgYXRvbWljcm13LiBFeHBlY3RzIGEgTWFjaGluZU1lbU9wZXJhbmQgaW4gYWRkaXRpb24gdG8gZXhwbGljaXQKKy8vIG9wZXJhbmRzLgorY2xhc3MgR19BVE9NSUNSTVdfT1AgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokb2xkdmFsKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHB0eXBlMTokYWRkciwgdHlwZTA6JHZhbCk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBtYXlMb2FkID0gMTsKKyAgbGV0IG1heVN0b3JlID0gMTsKK30KKworZGVmIEdfQVRPTUlDUk1XX1hDSEcgOiBHX0FUT01JQ1JNV19PUDsKK2RlZiBHX0FUT01JQ1JNV19BREQgOiBHX0FUT01JQ1JNV19PUDsKK2RlZiBHX0FUT01JQ1JNV19TVUIgOiBHX0FUT01JQ1JNV19PUDsKK2RlZiBHX0FUT01JQ1JNV19BTkQgOiBHX0FUT01JQ1JNV19PUDsKK2RlZiBHX0FUT01JQ1JNV19OQU5EIDogR19BVE9NSUNSTVdfT1A7CitkZWYgR19BVE9NSUNSTVdfT1IgOiBHX0FUT01JQ1JNV19PUDsKK2RlZiBHX0FUT01JQ1JNV19YT1IgOiBHX0FUT01JQ1JNV19PUDsKK2RlZiBHX0FUT01JQ1JNV19NQVggOiBHX0FUT01JQ1JNV19PUDsKK2RlZiBHX0FUT01JQ1JNV19NSU4gOiBHX0FUT01JQ1JNV19PUDsKK2RlZiBHX0FUT01JQ1JNV19VTUFYIDogR19BVE9NSUNSTVdfT1A7CitkZWYgR19BVE9NSUNSTVdfVU1JTiA6IEdfQVRPTUlDUk1XX09QOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmFyaWFkaWMgb3BzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBFeHRyYWN0IGEgcmVnaXN0ZXIgb2YgdGhlIHNwZWNpZmllZCBzaXplLCBzdGFydGluZyBmcm9tIHRoZSBibG9jayBnaXZlbiBieQorLy8gaW5kZXguIFRoaXMgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIG1hcHBlZCB0byBzdWItcmVnaXN0ZXIgQ09QWXMgYWZ0ZXIKKy8vIHJlZ2lzdGVyIGJhbmtzIGhhdmUgYmVlbiBzZWxlY3RlZC4KK2RlZiBHX0VYVFJBQ1QgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokcmVzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUxOiRzcmMsIHVua25vd246JG9mZnNldCk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vIEV4dHJhY3QgbXVsdGlwbGUgcmVnaXN0ZXJzIHNwZWNpZmllZCBzaXplLCBzdGFydGluZyBmcm9tIGJsb2NrcyBnaXZlbiBieQorLy8gaW5kZXhlcy4gVGhpcyB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgbWFwcGVkIHRvIHN1Yi1yZWdpc3RlciBDT1BZcyBhZnRlcgorLy8gcmVnaXN0ZXIgYmFua3MgaGF2ZSBiZWVuIHNlbGVjdGVkLgorZGVmIEdfVU5NRVJHRV9WQUxVRVMgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0MCwgdmFyaWFibGVfb3BzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUxOiRzcmMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLyBJbnNlcnQgYSBzbWFsbGVyIHJlZ2lzdGVyIGludG8gYSBsYXJnZXIgb25lIGF0IHRoZSBzcGVjaWZpZWQgYml0LWluZGV4LgorZGVmIEdfSU5TRVJUIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjLCB0eXBlMTokb3AsIHVua25vd246JG9mZnNldCk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vLyBDb25jYXRlbmF0ZSBtdWx0aXBsZSByZWdpc3RlcnMgb2YgdGhlIHNhbWUgc2l6ZSBpbnRvIGEgd2lkZXIgcmVnaXN0ZXIuCitkZWYgR19NRVJHRV9WQUxVRVMgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUxOiRzcmMwLCB2YXJpYWJsZV9vcHMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLyBJbnRyaW5zaWMgd2l0aG91dCBzaWRlIGVmZmVjdHMuCitkZWYgR19JTlRSSU5TSUMgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB1bmtub3duOiRpbnRyaW4sIHZhcmlhYmxlX29wcyk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vIEludHJpbnNpYyB3aXRoIHNpZGUgZWZmZWN0cy4KK2RlZiBHX0lOVFJJTlNJQ19XX1NJREVfRUZGRUNUUyA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHVua25vd246JGludHJpbiwgdmFyaWFibGVfb3BzKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMTsKKyAgbGV0IG1heUxvYWQgPSAxOworICBsZXQgbWF5U3RvcmUgPSAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQnJhbmNoZXMuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBHZW5lcmljIHVuY29uZGl0aW9uYWwgYnJhbmNoLgorZGVmIEdfQlIgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB1bmtub3duOiRzcmMxKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzQnJhbmNoID0gMTsKKyAgbGV0IGlzVGVybWluYXRvciA9IDE7CisgIGxldCBpc0JhcnJpZXIgPSAxOworfQorCisvLyBHZW5lcmljIGNvbmRpdGlvbmFsIGJyYW5jaC4KK2RlZiBHX0JSQ09ORCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiR0c3QsIHVua25vd246JHRydWViYik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc0JyYW5jaCA9IDE7CisgIGxldCBpc1Rlcm1pbmF0b3IgPSAxOworfQorCisvLyBHZW5lcmljIGluZGlyZWN0IGJyYW5jaC4KK2RlZiBHX0JSSU5ESVJFQ1QgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc0JyYW5jaCA9IDE7CisgIGxldCBpc1Rlcm1pbmF0b3IgPSAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmVjdG9yIG9wcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gR2VuZXJpYyBpbnNlcnRlbGVtZW50LgorZGVmIEdfSU5TRVJUX1ZFQ1RPUl9FTFQgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMsIHR5cGUxOiRlbHQsIHR5cGUyOiRpZHgpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLyBHZW5lcmljIGV4dHJhY3RlbGVtZW50LgorZGVmIEdfRVhUUkFDVF9WRUNUT1JfRUxUIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMTokc3JjLCB0eXBlMjokaWR4KTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gR2VuZXJpYyBzaHVmZmxldmVjdG9yLgorZGVmIEdfU0hVRkZMRV9WRUNUT1I6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTE6JHYxLCB0eXBlMTokdjIsIHR5cGUyOiRtYXNrKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gVE9ETzogQWRkIHRoZSBvdGhlciBnZW5lcmljIG9wY29kZXMuCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9HbG9iYWxJU2VsL1JlZ2lzdGVyQmFuay50ZCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L0dsb2JhbElTZWwvUmVnaXN0ZXJCYW5rLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZmQxMzkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9HbG9iYWxJU2VsL1JlZ2lzdGVyQmFuay50ZApAQCAtMCwwICsxLDE2IEBACisvLz09PS0gUmVnaXN0ZXJCYW5rLnRkIC0gUmVnaXN0ZXIgYmFuayBkZWZpbml0aW9ucyAtLS0tLS0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBSZWdpc3RlckJhbms8c3RyaW5nIG5hbWUsIGxpc3Q8UmVnaXN0ZXJDbGFzcz4gY2xhc3Nlcz4geworICBzdHJpbmcgTmFtZSA9IG5hbWU7CisgIGxpc3Q8UmVnaXN0ZXJDbGFzcz4gUmVnaXN0ZXJDbGFzc2VzID0gY2xhc3NlczsKK30KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L0dsb2JhbElTZWwvU2VsZWN0aW9uREFHQ29tcGF0LnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvR2xvYmFsSVNlbC9TZWxlY3Rpb25EQUdDb21wYXQudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzYjRhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L0dsb2JhbElTZWwvU2VsZWN0aW9uREFHQ29tcGF0LnRkCkBAIC0wLDAgKzEsMTIwIEBACisvLz09PS0gVGFyZ2V0R2xvYmFsSVNlbC50ZCAtIENvbW1vbiBjb2RlIGZvciBHbG9iYWxJU2VsIC0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB0YXJnZXQtaW5kZXBlbmRlbnQgaW50ZXJmYWNlcyB1c2VkIHRvIHN1cHBvcnQKKy8vIFNlbGVjdGlvbkRBRyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gcGF0dGVybnMgKHNwZWNpZmllZCBpbgorLy8gVGFyZ2V0U2VsZWN0aW9uREFHLnRkKSB3aGVuIGdlbmVyYXRpbmcgR2xvYmFsSVNlbCBpbnN0cnVjdGlvbiBzZWxlY3RvcnMuCisvLworLy8gVGhpcyBpcyBpbnRlbmRlZCBhcyBhIGNvbXBhdGliaWxpdHkgbGF5ZXIsIHRvIGVuYWJsZSByZXVzZSBvZiB0YXJnZXQKKy8vIGRlc2NyaXB0aW9ucyB3cml0dGVuIGZvciBTZWxlY3Rpb25EQUcgd2l0aG91dCByZXF1aXJpbmcgZXhwbGljaXQgR2xvYmFsSVNlbAorLy8gc3VwcG9ydC4gIEl0IHdpbGwgZXZlbnR1YWxseSBzdXBlcnNlZGUgU2VsZWN0aW9uREFHIHBhdHRlcm5zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIERlY2xhcmUgdGhhdCBhIGdlbmVyaWMgSW5zdHJ1Y3Rpb24gaXMgJ2VxdWl2YWxlbnQnIHRvIGFuIFNETm9kZSwgdGhhdCBpcywKKy8vIFNlbGVjdGlvbkRBRyBwYXR0ZXJucyBpbnZvbHZpbmcgdGhlIFNETm9kZSBjYW4gYmUgdHJhbnNmb3JtZWQgdG8gbWF0Y2ggdGhlCisvLyBJbnN0cnVjdGlvbiBpbnN0ZWFkLgorY2xhc3MgR0lOb2RlRXF1aXY8SW5zdHJ1Y3Rpb24gaSwgU0ROb2RlIG5vZGU+IHsKKyAgSW5zdHJ1Y3Rpb24gSSA9IGk7CisgIFNETm9kZSBOb2RlID0gbm9kZTsKKworICAvLyBTZWxlY3Rpb25EQUcgaGFzIHNlcGFyYXRlIG5vZGVzIGZvciBhdG9taWMgYW5kIG5vbi1hdG9taWMgbWVtb3J5IG9wZXJhdGlvbnMKKyAgLy8gKElTRDo6TE9BRCwgSVNEOjpBVE9NSUNfTE9BRCwgSVNEOjpTVE9SRSwgSVNEOjpBVE9NSUNfU1RPUkUpIGJ1dCBHbG9iYWxJU2VsCisgIC8vIHN0b3JlcyB0aGlzIGluZm9ybWF0aW9uIGluIHRoZSBNYWNoaW5lTWVtb3J5T3BlcmFuZC4KKyAgYml0IENoZWNrTU1PSXNOb25BdG9taWMgPSAwOworfQorCisvLyBUaGVzZSBhcmUgZGVmaW5lZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgR18qIGluc3RydWN0aW9ucy4KK2RlZiA6IEdJTm9kZUVxdWl2PEdfQU5ZRVhULCBhbnlleHQ+OworZGVmIDogR0lOb2RlRXF1aXY8R19TRVhULCBzZXh0PjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfWkVYVCwgemV4dD47CitkZWYgOiBHSU5vZGVFcXVpdjxHX1RSVU5DLCB0cnVuYz47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0JJVENBU1QsIGJpdGNvbnZlcnQ+OworLy8gR19JTlRUT1BUUiAtIFNlbGVjdGlvbkRBRyBoYXMgbm8gZXF1aXZhbGVudC4KKy8vIEdfUFRSVE9JTlQgLSBTZWxlY3Rpb25EQUcgaGFzIG5vIGVxdWl2YWxlbnQuCitkZWYgOiBHSU5vZGVFcXVpdjxHX0NPTlNUQU5ULCBpbW0+OworZGVmIDogR0lOb2RlRXF1aXY8R19GQ09OU1RBTlQsIGZwaW1tPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQURELCBhZGQ+OworZGVmIDogR0lOb2RlRXF1aXY8R19TVUIsIHN1Yj47CitkZWYgOiBHSU5vZGVFcXVpdjxHX01VTCwgbXVsPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfU0RJViwgc2Rpdj47CitkZWYgOiBHSU5vZGVFcXVpdjxHX1VESVYsIHVkaXY+OworZGVmIDogR0lOb2RlRXF1aXY8R19TUkVNLCBzcmVtPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfVVJFTSwgdXJlbT47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0FORCwgYW5kPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfT1IsIG9yPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfWE9SLCB4b3I+OworZGVmIDogR0lOb2RlRXF1aXY8R19TSEwsIHNobD47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0xTSFIsIHNybD47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0FTSFIsIHNyYT47CitkZWYgOiBHSU5vZGVFcXVpdjxHX1NFTEVDVCwgc2VsZWN0PjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfRk5FRywgZm5lZz47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0ZQRVhULCBmcGV4dGVuZD47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0ZQVFJVTkMsIGZwcm91bmQ+OworZGVmIDogR0lOb2RlRXF1aXY8R19GUFRPU0ksIGZwX3RvX3NpbnQ+OworZGVmIDogR0lOb2RlRXF1aXY8R19GUFRPVUksIGZwX3RvX3VpbnQ+OworZGVmIDogR0lOb2RlRXF1aXY8R19TSVRPRlAsIHNpbnRfdG9fZnA+OworZGVmIDogR0lOb2RlRXF1aXY8R19VSVRPRlAsIHVpbnRfdG9fZnA+OworZGVmIDogR0lOb2RlRXF1aXY8R19GQURELCBmYWRkPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfRlNVQiwgZnN1Yj47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0ZNQSwgZm1hPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfRk1VTCwgZm11bD47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0ZESVYsIGZkaXY+OworZGVmIDogR0lOb2RlRXF1aXY8R19GUkVNLCBmcmVtPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfRlBPVywgZnBvdz47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0ZFWFAyLCBmZXhwMj47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0ZMT0cyLCBmbG9nMj47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0lOVFJJTlNJQywgaW50cmluc2ljX3dvX2NoYWluPjsKKy8vIElTRDo6SU5UUklOU0lDX1ZPSUQgY2FuIGFsc28gYmUgaGFuZGxlZCB3aXRoIEdfSU5UUklOU0lDX1dfU0lERV9FRkZFQ1RTLgorZGVmIDogR0lOb2RlRXF1aXY8R19JTlRSSU5TSUNfV19TSURFX0VGRkVDVFMsIGludHJpbnNpY192b2lkPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfSU5UUklOU0lDX1dfU0lERV9FRkZFQ1RTLCBpbnRyaW5zaWNfd19jaGFpbj47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0JSLCBicj47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0JTV0FQLCBic3dhcD47CisKKy8vIEJyb2FkbHkgc3BlYWtpbmcgR19MT0FEIGlzIGVxdWl2YWxlbnQgdG8gSVNEOjpMT0FEIGJ1dCB0aGVyZSBhcmUgc29tZQorLy8gY29tcGxpY2F0aW9ucyB0aGF0IHRhYmxlZ2VuIG11c3QgdGFrZSBjYXJlIG9mLiBGb3IgZXhhbXBsZSwgUHJlZGljYXRlcyBzdWNoCisvLyBhcyBpc1NpZ25FeHRMb2FkIHJlcXVpcmUgdGhhdCB0aGlzIGlzIG5vdCBhIHBlcmZlY3QgMToxIG1hcHBpbmcgc2luY2UgYQorLy8gc2lnbi1leHRlbmRpbmcgbG9hZCBpcyAoR19TRVhUIChHX0xPQUQgeCkpIGluIEdsb2JhbElTZWwuIEFkZGl0aW9uYWxseSwKKy8vIEdfTE9BRCBoYW5kbGVzIGJvdGggYXRvbWljIGFuZCBub24tYXRvbWljIGxvYWRzIHdoZXJlIGFzIFNlbGVjdGlvbkRBRyBoYWQKKy8vIHNlcGFyYXRlIG5vZGVzIGZvciB0aGVtLiBUaGlzIEdJTm9kZUVxdWl2IG1hcHMgdGhlIG5vbi1hdG9taWMgbG9hZHMgdG8KKy8vIEdfTE9BRCB3aXRoIGEgbm9uLWF0b21pYyBNYWNoaW5lTWVtT3BlcmFuZC4KK2RlZiA6IEdJTm9kZUVxdWl2PEdfTE9BRCwgbGQ+IHsgbGV0IENoZWNrTU1PSXNOb25BdG9taWMgPSAxOyB9CisvLyBCcm9hZGx5IHNwZWFraW5nIEdfU1RPUkUgaXMgZXF1aXZhbGVudCB0byBJU0Q6OlNUT1JFIGJ1dCB0aGVyZSBhcmUgc29tZQorLy8gY29tcGxpY2F0aW9ucyB0aGF0IHRhYmxlZ2VuIG11c3QgdGFrZSBjYXJlIG9mLiBGb3IgZXhhbXBsZSwgcHJlZGljYXRlcyBzdWNoCisvLyBhcyBpc1RydW5jU3RvcmUgcmVxdWlyZSB0aGF0IHRoaXMgaXMgbm90IGEgcGVyZmVjdCAxOjEgbWFwcGluZyBzaW5jZSBhCisvLyB0cnVuY2F0aW5nIHN0b3JlIGlzIChHX1NUT1JFIChHX1RSVU5DQVRFIHgpKSBpbiBHbG9iYWxJU2VsLiBBZGRpdGlvbmFsbHksCisvLyBHX1NUT1JFIGhhbmRsZXMgYm90aCBhdG9taWMgYW5kIG5vbi1hdG9taWMgc3RvcmVzIHdoZXJlIGFzIFNlbGVjdGlvbkRBRyBoYWQKKy8vIHNlcGFyYXRlIG5vZGVzIGZvciB0aGVtLiBUaGlzIEdJTm9kZUVxdWl2IG1hcHMgdGhlIG5vbi1hdG9taWMgc3RvcmVzIHRvCisvLyBHX1NUT1JFIHdpdGggYSBub24tYXRvbWljIE1hY2hpbmVNZW1PcGVyYW5kLgorZGVmIDogR0lOb2RlRXF1aXY8R19TVE9SRSwgc3Q+IHsgbGV0IENoZWNrTU1PSXNOb25BdG9taWMgPSAxOyB9CisKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQVRPTUlDX0NNUFhDSEcsIGF0b21pY19jbXBfc3dhcD47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0FUT01JQ1JNV19YQ0hHLCBhdG9taWNfc3dhcD47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0FUT01JQ1JNV19BREQsIGF0b21pY19sb2FkX2FkZD47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0FUT01JQ1JNV19TVUIsIGF0b21pY19sb2FkX3N1Yj47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0FUT01JQ1JNV19BTkQsIGF0b21pY19sb2FkX2FuZD47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0FUT01JQ1JNV19OQU5ELCBhdG9taWNfbG9hZF9uYW5kPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQVRPTUlDUk1XX09SLCBhdG9taWNfbG9hZF9vcj47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0FUT01JQ1JNV19YT1IsIGF0b21pY19sb2FkX3hvcj47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0FUT01JQ1JNV19NSU4sIGF0b21pY19sb2FkX21pbj47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0FUT01JQ1JNV19NQVgsIGF0b21pY19sb2FkX21heD47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0FUT01JQ1JNV19VTUlOLCBhdG9taWNfbG9hZF91bWluPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQVRPTUlDUk1XX1VNQVgsIGF0b21pY19sb2FkX3VtYXg+OworCisvLyBTcGVjaWZpZXMgdGhlIEdsb2JhbElTZWwgZXF1aXZhbGVudHMgZm9yIFNlbGVjdGlvbkRBRydzIENvbXBsZXhQYXR0ZXJuLgorLy8gU2hvdWxkIGJlIHVzZWQgb24gZGVmcyB0aGF0IHN1YmNsYXNzIEdJQ29tcGxleE9wZXJhbmRNYXRjaGVyPD4uCitjbGFzcyBHSUNvbXBsZXhQYXR0ZXJuRXF1aXY8Q29tcGxleFBhdHRlcm4gc2VsZGFnPiB7CisgIENvbXBsZXhQYXR0ZXJuIFNlbERBR0VxdWl2YWxlbnQgPSBzZWxkYWc7Cit9CisKKy8vIFNwZWNpZmllcyB0aGUgR2xvYmFsSVNlbCBlcXVpdmFsZW50cyBmb3IgU2VsZWN0aW9uREFHJ3MgU0ROb2RlWEZvcm0uCisvLyBTaG91bGQgYmUgdXNlZCBvbiBkZWZzIHRoYXQgc3ViY2xhc3MgR0lDdXN0b21PcGVyYW5kUmVuZGVyZXI8Pi4KK2NsYXNzIEdJU0ROb2RlWEZvcm1FcXVpdjxTRE5vZGVYRm9ybSBzZWxkYWc+IHsKKyAgU0ROb2RlWEZvcm0gU2VsREFHRXF1aXZhbGVudCA9IHNlbGRhZzsKK30KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L0dsb2JhbElTZWwvVGFyZ2V0LnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvR2xvYmFsSVNlbC9UYXJnZXQudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0MGY0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L0dsb2JhbElTZWwvVGFyZ2V0LnRkCkBAIC0wLDAgKzEsNjEgQEAKKy8vPT09LSBUYXJnZXQudGQgLSBEZWZpbmUgR2xvYmFsSVNlbCBydWxlcyAtLS0tLS0tLS0tLS0tLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIHRhcmdldC1pbmRlcGVuZGVudCBpbnRlcmZhY2VzIHVzZWQgdG8gc3VwcG9ydAorLy8gU2VsZWN0aW9uREFHIGluc3RydWN0aW9uIHNlbGVjdGlvbiBwYXR0ZXJucyAoc3BlY2lmaWVkIGluCisvLyBUYXJnZXRTZWxlY3Rpb25EQUcudGQpIHdoZW4gZ2VuZXJhdGluZyBHbG9iYWxJU2VsIGluc3RydWN0aW9uIHNlbGVjdG9ycy4KKy8vCisvLyBUaGlzIGlzIGludGVuZGVkIGFzIGEgY29tcGF0aWJpbGl0eSBsYXllciwgdG8gZW5hYmxlIHJldXNlIG9mIHRhcmdldAorLy8gZGVzY3JpcHRpb25zIHdyaXR0ZW4gZm9yIFNlbGVjdGlvbkRBRyB3aXRob3V0IHJlcXVpcmluZyBleHBsaWNpdCBHbG9iYWxJU2VsCisvLyBzdXBwb3J0LiAgSXQgd2lsbCBldmVudHVhbGx5IHN1cGVyc2VkZSBTZWxlY3Rpb25EQUcgcGF0dGVybnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gRGVmaW5pdGlvbnMgdGhhdCBpbmhlcml0IGZyb20gTExUIGRlZmluZSB0eXBlcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUKKy8vIEdsb2JhbElTZWwgbWF0Y2hlci4KK2NsYXNzIExMVDsKKworZGVmIHMzMiA6IExMVDsKK2RlZiBzNjQgOiBMTFQ7CisKKy8vIERlZmluZXMgYSBtYXRjaGVyIGZvciBjb21wbGV4IG9wZXJhbmRzLiBUaGlzIGlzIGFuYWxvZ291cyB0byBDb21wbGV4UGF0dGVybgorLy8gZnJvbSBTZWxlY3Rpb25EQUcuCisvLworLy8gRGVmaW5pdGlvbnMgdGhhdCBpbmhlcml0IGZyb20gdGhpcyBtYXkgYWxzbyBpbmhlcml0IGZyb20KKy8vIEdJQ29tcGxleFBhdHRlcm5FcXVpdiB0byBlbmFibGUgdGhlIGltcG9ydCBvZiBTZWxlY3Rpb25EQUcgcGF0dGVybnMgaW52b2x2aW5nCisvLyB0aG9zZSBDb21wbGV4UGF0dGVybnMuCitjbGFzcyBHSUNvbXBsZXhPcGVyYW5kTWF0Y2hlcjxMTFQgdHlwZSwgc3RyaW5nIG1hdGNoZXJmbj4geworICAvLyBUaGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcm9vdCBvZiB0aGUgbWF0Y2guCisgIC8vCisgIC8vIFRPRE86IFdlIHNob3VsZCBwcm9iYWJseSBzdXBwb3J0LCBhbnktdHlwZSwgYW55LXNjYWxhciwgYW5kIG11bHRpcGxlIHR5cGVzCisgIC8vICAgICAgIGluIHRoZSBmdXR1cmUuCisgIExMVCBUeXBlID0gdHlwZTsKKworICAvLyBUaGUgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG9wZXJhbmQgbWF0Y2hlcy4gSXQgc2hvdWxkIGJlIG9mCisgIC8vIHRoZSBmb3JtOgorICAvLyAgIGJvb2wgc2VsZWN0KGNvbnN0IE1hdGNoT3BlcmFuZCAmUm9vdCwgTWF0Y2hPcGVyYW5kICZSZXN1bHQxKQorICAvLyBhbmQgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIFJlc3VsdFggYXJndW1lbnRzIGFzIHRoZSBudW1iZXIgb2YKKyAgLy8gcmVzdWx0IG9wZXJhbmRzLiBJdCBtdXN0IHJldHVybiB0cnVlIG9uIHN1Y2Nlc3NmdWwgbWF0Y2ggYW5kIGZhbHNlCisgIC8vIG90aGVyd2lzZS4gSWYgaXQgcmV0dXJucyB0cnVlLCB0aGVuIGFsbCB0aGUgUmVzdWx0WCBhcmd1bWVudHMgbXVzdCBiZQorICAvLyBvdmVyd3JpdHRlbi4KKyAgc3RyaW5nIE1hdGNoZXJGbiA9IG1hdGNoZXJmbjsKK30KKworLy8gRGVmaW5lcyBhIGN1c3RvbSByZW5kZXJlci4gVGhpcyBpcyBhbmFsb2dvdXMgdG8gU0ROb2RlWEZvcm0gZnJvbQorLy8gU2VsZWN0aW9uREFHLiBVbmxpa2UgU0ROb2RlWEZvcm0sIHRoaXMgbWF0Y2hlcyBhIE1hY2hpbmVJbnN0ciBhbmQKKy8vIHJlbmRlcnMgZGlyZWN0bHkgdG8gdGhlIHJlc3VsdCBpbnN0cnVjdGlvbiB3aXRob3V0IGFuIGludGVybWVkaWF0ZSBub2RlLgorLy8KKy8vIERlZmluaXRpb25zIHRoYXQgaW5oZXJpdCBmcm9tIHRoaXMgbWF5IGFsc28gaW5oZXJpdCBmcm9tIEdJU0ROb2RlWEZvcm1FcXVpdgorLy8gdG8gZW5hYmxlIHRoZSBpbXBvcnQgb2YgU2VsZWN0aW9uREFHIHBhdHRlcm5zIGludm9sdmluZyB0aG9zZSBTRE5vZGVYRm9ybXMuCitjbGFzcyBHSUN1c3RvbU9wZXJhbmRSZW5kZXJlcjxzdHJpbmcgcmVuZGVyZXJmbj4geworICAvLyBUaGUgZnVuY3Rpb24gcmVuZGVycyB0aGUgb3BlcmFuZChzKSBvZiB0aGUgbWF0Y2hlZCBpbnN0cnVjdGlvbiB0bworICAvLyB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLiBJdCBzaG91bGQgYmUgb2YgdGhlIGZvcm06CisgIC8vICAgdm9pZCByZW5kZXIoTWFjaGluZUluc3RyQnVpbGRlciAmTUlCLCBjb25zdCBNYWNoaW5lSW5zdHIgJk1JKQorICBzdHJpbmcgUmVuZGVyZXJGbiA9IHJlbmRlcmVyZm47Cit9CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXQudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXQudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEwOWU5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldC50ZApAQCAtMCwwICsxLDE1MjcgQEAKKy8vPT09LSBUYXJnZXQudGQgLSBUYXJnZXQgSW5kZXBlbmRlbnQgVGFibGVHZW4gaW50ZXJmYWNlIC0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIHRhcmdldC1pbmRlcGVuZGVudCBpbnRlcmZhY2VzIHdoaWNoIHNob3VsZCBiZQorLy8gaW1wbGVtZW50ZWQgYnkgZWFjaCB0YXJnZXQgd2hpY2ggaXMgdXNpbmcgYSBUYWJsZUdlbiBiYXNlZCBjb2RlIGdlbmVyYXRvci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBJbmNsdWRlIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBMTFZNIGludHJpbnNpY3MuCitpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3MudGQiCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBSZWdpc3RlciBmaWxlIGRlc2NyaXB0aW9uIC0gVGhlc2UgY2xhc3NlcyBhcmUgdXNlZCB0byBmaWxsIGluIHRoZSB0YXJnZXQKKy8vIGRlc2NyaXB0aW9uIGNsYXNzZXMuCisKK2NsYXNzIFJlZ2lzdGVyQ2xhc3M7IC8vIEZvcndhcmQgZGVmCisKK2NsYXNzIEh3TW9kZTxzdHJpbmcgRlM+IHsKKyAgLy8gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHN1YnRhcmdldCBmZWF0dXJlcyB0aGF0IHR1cm4gb24gdGhpcyBIVyBtb2RlLgorICAvLyBGb3IgZXhhbXBsZSwgIitmZWF0MSwtZmVhdDIiIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgbW9kZSBpcyBhY3RpdmUKKyAgLy8gd2hlbiAiZmVhdDEiIGlzIGVuYWJsZWQgYW5kICJmZWF0MiIgaXMgZGlzYWJsZWQgYXQgdGhlIHNhbWUgdGltZS4KKyAgLy8gQW55IG90aGVyIGZlYXR1cmVzIGFyZSBub3QgY2hlY2tlZC4KKyAgLy8gV2hlbiBtdWx0aXBsZSBtb2RlcyBhcmUgdXNlZCwgdGhleSBzaG91bGQgYmUgbXV0dWFsbHkgZXhjbHVzaXZlLAorICAvLyBvdGhlcndpc2UgdGhlIHJlc3VsdHMgYXJlIHVucHJlZGljdGFibGUuCisgIHN0cmluZyBGZWF0dXJlcyA9IEZTOworfQorCisvLyBBIHNwZWNpYWwgbW9kZSByZWNvZ25pemVkIGJ5IHRhYmxlZ2VuLiBUaGlzIG1vZGUgaXMgY29uc2lkZXJlZCBhY3RpdmUKKy8vIHdoZW4gbm8gb3RoZXIgbW9kZSBpcyBhY3RpdmUuIEZvciB0YXJnZXRzIHRoYXQgZG8gbm90IHVzZSBzcGVjaWZpYyBodworLy8gbW9kZXMsIHRoaXMgaXMgdGhlIG9ubHkgbW9kZS4KK2RlZiBEZWZhdWx0TW9kZSA6IEh3TW9kZTwiIj47CisKKy8vIEEgY2xhc3MgdXNlZCB0byBhc3NvY2lhdGUgb2JqZWN0cyB3aXRoIEhXIG1vZGVzLiBJdCBpcyBvbmx5IGludGVuZGVkIHRvCisvLyBiZSB1c2VkIGFzIGEgYmFzZSBjbGFzcywgd2hlcmUgdGhlIGRlcml2ZWQgY2xhc3Mgc2hvdWxkIGNvbnRhaW4gYSBtZW1iZXIKKy8vICJPYmplY3RzIiwgd2hpY2ggaXMgYSBsaXN0IG9mIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgbGlzdCBvZiBtb2Rlcy4KKy8vIFRoZSBuLXRoIGVsZW1lbnQgb24gdGhlIE9iamVjdHMgbGlzdCB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbi10aAorLy8gZWxlbWVudCBvbiB0aGUgTW9kZXMgbGlzdC4KK2NsYXNzIEh3TW9kZVNlbGVjdDxsaXN0PEh3TW9kZT4gTXM+IHsKKyAgbGlzdDxId01vZGU+IE1vZGVzID0gTXM7Cit9CisKKy8vIEEgY29tbW9uIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIGNvdW50ZXJwYXJ0IG9mIFZhbHVlVHlwZSwgd2hpY2ggaXMKKy8vIGRlcGVuZGVudCBvbiBhIEhXIG1vZGUuIFRoaXMgY2xhc3MgaW5oZXJpdHMgZnJvbSBWYWx1ZVR5cGUgaXRzZWxmLAorLy8gd2hpY2ggbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIG9iamVjdHMgb2YgdGhpcyBjbGFzcyB3aGVyZSBWYWx1ZVR5cGUKKy8vIG9iamVjdHMgY291bGQgYmUgdXNlZC4gVGhpcyBpcyBzcGVjaWZpY2FsbHkgYXBwbGljYWJsZSB0byBzZWxlY3Rpb24KKy8vIHBhdHRlcm5zLgorY2xhc3MgVmFsdWVUeXBlQnlId01vZGU8bGlzdDxId01vZGU+IE1zLCBsaXN0PFZhbHVlVHlwZT4gVHM+CisgICAgOiBId01vZGVTZWxlY3Q8TXM+LCBWYWx1ZVR5cGU8MCwgMD4geworICAvLyBUaGUgbGVuZ3RoIG9mIHRoaXMgbGlzdCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBsZW5ndGggb2YgTXMuCisgIGxpc3Q8VmFsdWVUeXBlPiBPYmplY3RzID0gVHM7Cit9CisKKy8vIEEgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSByZWdpc3RlciBzaXplLCBzcGlsbCBzaXplIGFuZCBzcGlsbCBhbGlnbm1lbnQKKy8vIGluIGJpdHMgb2YgYSByZWdpc3Rlci4KK2NsYXNzIFJlZ0luZm88aW50IFJTLCBpbnQgU1MsIGludCBTQT4geworICBpbnQgUmVnU2l6ZSA9IFJTOyAgICAgICAgIC8vIFJlZ2lzdGVyIHNpemUgaW4gYml0cy4KKyAgaW50IFNwaWxsU2l6ZSA9IFNTOyAgICAgICAvLyBTcGlsbCBzbG90IHNpemUgaW4gYml0cy4KKyAgaW50IFNwaWxsQWxpZ25tZW50ID0gU0E7ICAvLyBTcGlsbCBzbG90IGFsaWdubWVudCBpbiBiaXRzLgorfQorCisvLyBUaGUgcmVnaXN0ZXIgc2l6ZS9hbGlnbm1lbnQgaW5mb3JtYXRpb24sIHBhcmFtZXRlcml6ZWQgYnkgYSBIVyBtb2RlLgorY2xhc3MgUmVnSW5mb0J5SHdNb2RlPGxpc3Q8SHdNb2RlPiBNcyA9IFtdLCBsaXN0PFJlZ0luZm8+IFRzID0gW10+CisgICAgOiBId01vZGVTZWxlY3Q8TXM+IHsKKyAgLy8gVGhlIGxlbmd0aCBvZiB0aGlzIGxpc3QgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbGVuZ3RoIG9mIE1zLgorICBsaXN0PFJlZ0luZm8+IE9iamVjdHMgPSBUczsKK30KKworLy8gU3ViUmVnSW5kZXggLSBVc2UgaW5zdGFuY2VzIG9mIFN1YlJlZ0luZGV4IHRvIGlkZW50aWZ5IHN1YnJlZ2lzdGVycy4KK2NsYXNzIFN1YlJlZ0luZGV4PGludCBzaXplLCBpbnQgb2Zmc2V0ID0gMD4geworICBzdHJpbmcgTmFtZXNwYWNlID0gIiI7CisKKyAgLy8gU2l6ZSAtIFNpemUgKGluIGJpdHMpIG9mIHRoZSBzdWItcmVnaXN0ZXJzIHJlcHJlc2VudGVkIGJ5IHRoaXMgaW5kZXguCisgIGludCBTaXplID0gc2l6ZTsKKworICAvLyBPZmZzZXQgLSBPZmZzZXQgb2YgdGhlIGZpcnN0IGJpdCB0aGF0IGlzIHBhcnQgb2YgdGhpcyBzdWItcmVnaXN0ZXIgaW5kZXguCisgIC8vIFNldCBpdCB0byAtMSBpZiB0aGUgc2FtZSBpbmRleCBpcyB1c2VkIHRvIHJlcHJlc2VudCBzdWItcmVnaXN0ZXJzIHRoYXQgY2FuCisgIC8vIGJlIGF0IGRpZmZlcmVudCBvZmZzZXRzIChmb3IgZXhhbXBsZSB3aGVuIHVzaW5nIGFuIGluZGV4IHRvIGFjY2VzcyBhbgorICAvLyBlbGVtZW50IGluIGEgcmVnaXN0ZXIgdHVwbGUpLgorICBpbnQgT2Zmc2V0ID0gb2Zmc2V0OworCisgIC8vIENvbXBvc2VkT2YgLSBBIGxpc3Qgb2YgdHdvIFN1YlJlZ0luZGV4IGluc3RhbmNlcywgW0EsIEJdLgorICAvLyBUaGlzIGluZGljYXRlcyB0aGF0IHRoaXMgU3ViUmVnSW5kZXggaXMgdGhlIHJlc3VsdCBvZiBjb21wb3NpbmcgQSBhbmQgQi4KKyAgLy8gU2VlIENvbXBvc2VkU3ViUmVnSW5kZXguCisgIGxpc3Q8U3ViUmVnSW5kZXg+IENvbXBvc2VkT2YgPSBbXTsKKworICAvLyBDb3ZlcmluZ1N1YlJlZ0luZGljZXMgLSBBIGxpc3Qgb2YgdHdvIG9yIG1vcmUgc3ViLXJlZ2lzdGVyIGluZGV4ZXMgdGhhdAorICAvLyBjb3ZlciB0aGlzIHN1Yi1yZWdpc3Rlci4KKyAgLy8KKyAgLy8gVGhpcyBmaWVsZCBzaG91bGQgbm9ybWFsbHkgYmUgbGVmdCBibGFuayBhcyBUYWJsZUdlbiBjYW4gaW5mZXIgaXQuCisgIC8vCisgIC8vIFRhYmxlR2VuIGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyBzdWItcmVnaXN0ZXJzIHRoYXQgc3RyYWRkbGUgdGhlIHJlZ2lzdGVycworICAvLyBpbiB0aGUgU3ViUmVncyBmaWVsZCBvZiBhIFJlZ2lzdGVyIGRlZmluaXRpb24uIEZvciBleGFtcGxlOgorICAvLworICAvLyAgIFEwICAgID0gZHN1Yl8wIC0+IEQwLCBkc3ViXzEgLT4gRDEKKyAgLy8gICBRMSAgICA9IGRzdWJfMCAtPiBEMiwgZHN1Yl8xIC0+IEQzCisgIC8vICAgRDFfRDIgPSBkc3ViXzAgLT4gRDEsIGRzdWJfMSAtPiBEMgorICAvLyAgIFFRMCAgID0gcXN1Yl8wIC0+IFEwLCBxc3ViXzEgLT4gUTEKKyAgLy8KKyAgLy8gVGFibGVHZW4gd2lsbCBpbmZlciB0aGF0IEQxX0QyIGlzIGEgc3ViLXJlZ2lzdGVyIG9mIFFRMC4gSXQgd2lsbCBiZSBnaXZlbgorICAvLyB0aGUgc3ludGhldGljIGluZGV4IGRzdWJfMV9kc3ViXzIgdW5sZXNzIHNvbWUgU3ViUmVnSW5kZXggaXMgZGVmaW5lZCB3aXRoCisgIC8vIENvdmVyaW5nU3ViUmVnSW5kaWNlcyA9IFtkc3ViXzEsIGRzdWJfMl0uCisgIGxpc3Q8U3ViUmVnSW5kZXg+IENvdmVyaW5nU3ViUmVnSW5kaWNlcyA9IFtdOworfQorCisvLyBDb21wb3NlZFN1YlJlZ0luZGV4IC0gQSBzdWItcmVnaXN0ZXIgdGhhdCBpcyB0aGUgcmVzdWx0IG9mIGNvbXBvc2luZyBBIGFuZCBCLgorLy8gT2Zmc2V0IGlzIHNldCB0byB0aGUgc3VtIG9mIEEgYW5kIEIncyBPZmZzZXRzLiBTaXplIGlzIHNldCB0byBCJ3MgU2l6ZS4KK2NsYXNzIENvbXBvc2VkU3ViUmVnSW5kZXg8U3ViUmVnSW5kZXggQSwgU3ViUmVnSW5kZXggQj4KKyAgOiBTdWJSZWdJbmRleDxCLlNpemUsICFpZighZXEoQS5PZmZzZXQsIC0xKSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAhaWYoIWVxKEIuT2Zmc2V0LCAtMSksIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFhZGQoQS5PZmZzZXQsIEIuT2Zmc2V0KSkpPiB7CisgIC8vIFNlZSBTdWJSZWdJbmRleC4KKyAgbGV0IENvbXBvc2VkT2YgPSBbQSwgQl07Cit9CisKKy8vIFJlZ0FsdE5hbWVJbmRleCAtIFRoZSBhbHRlcm5hdGUgbmFtZSBzZXQgdG8gdXNlIGZvciByZWdpc3RlciBvcGVyYW5kcyBvZgorLy8gdGhpcyByZWdpc3RlciBjbGFzcyB3aGVuIHByaW50aW5nLgorY2xhc3MgUmVnQWx0TmFtZUluZGV4IHsKKyAgc3RyaW5nIE5hbWVzcGFjZSA9ICIiOworfQorZGVmIE5vUmVnQWx0TmFtZSA6IFJlZ0FsdE5hbWVJbmRleDsKKworLy8gUmVnaXN0ZXIgLSBZb3Ugc2hvdWxkIGRlZmluZSBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmb3IgZWFjaCByZWdpc3RlcgorLy8gaW4gdGhlIHRhcmdldCBtYWNoaW5lLiAgU3RyaW5nIG4gd2lsbCBiZWNvbWUgdGhlICJuYW1lIiBvZiB0aGUgcmVnaXN0ZXIuCitjbGFzcyBSZWdpc3RlcjxzdHJpbmcgbiwgbGlzdDxzdHJpbmc+IGFsdE5hbWVzID0gW10+IHsKKyAgc3RyaW5nIE5hbWVzcGFjZSA9ICIiOworICBzdHJpbmcgQXNtTmFtZSA9IG47CisgIGxpc3Q8c3RyaW5nPiBBbHROYW1lcyA9IGFsdE5hbWVzOworCisgIC8vIEFsaWFzZXMgLSBBIGxpc3Qgb2YgcmVnaXN0ZXJzIHRoYXQgdGhpcyByZWdpc3RlciBvdmVybGFwcyB3aXRoLiAgQSByZWFkIG9yCisgIC8vIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlZ2lzdGVyIGNhbiBwb3RlbnRpYWxseSByZWFkIG9yIG1vZGlmeSB0aGUgYWxpYXNlZAorICAvLyByZWdpc3RlcnMuCisgIGxpc3Q8UmVnaXN0ZXI+IEFsaWFzZXMgPSBbXTsKKworICAvLyBTdWJSZWdzIC0gQSBsaXN0IG9mIHJlZ2lzdGVycyB0aGF0IGFyZSBwYXJ0cyBvZiB0aGlzIHJlZ2lzdGVyLiBOb3RlIHRoZXNlCisgIC8vIGFyZSAiaW1tZWRpYXRlIiBzdWItcmVnaXN0ZXJzIGFuZCB0aGUgcmVnaXN0ZXJzIHdpdGhpbiB0aGUgbGlzdCBkbyBub3QKKyAgLy8gdGhlbXNlbHZlcyBvdmVybGFwLiBlLmcuIEZvciBYODYsIEVBWCdzIFN1YlJlZ3MgbGlzdCBjb250YWlucyBvbmx5IFtBWF0sCisgIC8vIG5vdCBbQVgsIEFILCBBTF0uCisgIGxpc3Q8UmVnaXN0ZXI+IFN1YlJlZ3MgPSBbXTsKKworICAvLyBTdWJSZWdJbmRpY2VzIC0gRm9yIGVhY2ggcmVnaXN0ZXIgaW4gU3ViUmVncywgc3BlY2lmeSB0aGUgU3ViUmVnSW5kZXggdXNlZAorICAvLyB0byBhZGRyZXNzIGl0LiBTdWItc3ViLXJlZ2lzdGVyIGluZGljZXMgYXJlIGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGZyb20KKyAgLy8gU3ViUmVncy4KKyAgbGlzdDxTdWJSZWdJbmRleD4gU3ViUmVnSW5kaWNlcyA9IFtdOworCisgIC8vIFJlZ0FsdE5hbWVJbmRpY2VzIC0gVGhlIGFsdGVybmF0ZSBuYW1lIGluZGljZXMgd2hpY2ggYXJlIHZhbGlkIGZvciB0aGlzCisgIC8vIHJlZ2lzdGVyLgorICBsaXN0PFJlZ0FsdE5hbWVJbmRleD4gUmVnQWx0TmFtZUluZGljZXMgPSBbXTsKKworICAvLyBEd2FyZk51bWJlcnMgLSBOdW1iZXJzIHVzZWQgaW50ZXJuYWxseSBieSBnY2MvZ2RiIHRvIGlkZW50aWZ5IHRoZSByZWdpc3Rlci4KKyAgLy8gVGhlc2UgdmFsdWVzIGNhbiBiZSBkZXRlcm1pbmVkIGJ5IGxvY2F0aW5nIHRoZSA8dGFyZ2V0Pi5oIGZpbGUgaW4gdGhlCisgIC8vIGRpcmVjdG9yeSBsbHZtZ2NjL2djYy9jb25maWcvPHRhcmdldD4vIGFuZCBsb29raW5nIGZvciBSRUdJU1RFUl9OQU1FUy4gIFRoZQorICAvLyBvcmRlciBvZiB0aGVzZSBuYW1lcyBjb3JyZXNwb25kIHRvIHRoZSBlbnVtZXJhdGlvbiB1c2VkIGJ5IGdjYy4gIEEgdmFsdWUgb2YKKyAgLy8gLTEgaW5kaWNhdGVzIHRoYXQgdGhlIGdjYyBudW1iZXIgaXMgdW5kZWZpbmVkIGFuZCAtMiB0aGF0IHJlZ2lzdGVyIG51bWJlcgorICAvLyBpcyBpbnZhbGlkIGZvciB0aGlzIG1vZGUvZmxhdm91ci4KKyAgbGlzdDxpbnQ+IER3YXJmTnVtYmVycyA9IFtdOworCisgIC8vIENvc3RQZXJVc2UgLSBBZGRpdGlvbmFsIGNvc3Qgb2YgaW5zdHJ1Y3Rpb25zIHVzaW5nIHRoaXMgcmVnaXN0ZXIgY29tcGFyZWQKKyAgLy8gdG8gb3RoZXIgcmVnaXN0ZXJzIGluIGl0cyBjbGFzcy4gVGhlIHJlZ2lzdGVyIGFsbG9jYXRvciB3aWxsIHRyeSB0bworICAvLyBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyB1c2luZyBhIHJlZ2lzdGVyIHdpdGggYSBDb3N0UGVyVXNlLgorICAvLyBUaGlzIGlzIHVzZWQgYnkgdGhlIHg4Ni02NCBhbmQgQVJNIFRodW1iIHRhcmdldHMgd2hlcmUgc29tZSByZWdpc3RlcnMKKyAgLy8gcmVxdWlyZSBsYXJnZXIgaW5zdHJ1Y3Rpb24gZW5jb2RpbmdzLgorICBpbnQgQ29zdFBlclVzZSA9IDA7CisKKyAgLy8gQ292ZXJlZEJ5U3ViUmVncyAtIFdoZW4gdGhpcyBiaXQgaXMgc2V0LCB0aGUgdmFsdWUgb2YgdGhpcyByZWdpc3RlciBpcworICAvLyBjb21wbGV0ZWx5IGRldGVybWluZWQgYnkgdGhlIHZhbHVlIG9mIGl0cyBzdWItcmVnaXN0ZXJzLiAgRm9yIGV4YW1wbGUsIHRoZQorICAvLyB4ODYgcmVnaXN0ZXIgQVggaXMgY292ZXJlZCBieSBpdHMgc3ViLXJlZ2lzdGVycyBBTCBhbmQgQUgsIGJ1dCBFQVggaXMgbm90CisgIC8vIGNvdmVyZWQgYnkgaXRzIHN1Yi1yZWdpc3RlciBBWC4KKyAgYml0IENvdmVyZWRCeVN1YlJlZ3MgPSAwOworCisgIC8vIEhXRW5jb2RpbmcgLSBUaGUgdGFyZ2V0IHNwZWNpZmljIGhhcmR3YXJlIGVuY29kaW5nIGZvciB0aGlzIHJlZ2lzdGVyLgorICBiaXRzPDE2PiBIV0VuY29kaW5nID0gMDsKKworICBiaXQgaXNBcnRpZmljaWFsID0gMDsKK30KKworLy8gUmVnaXN0ZXJXaXRoU3ViUmVncyAtIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGluc3RhbmNlcyBvZiBSZWdpc3RlciB3aGljaAorLy8gbmVlZCB0byBzcGVjaWZ5IHN1Yi1yZWdpc3RlcnMuCisvLyBMaXN0ICJzdWJyZWdzIiBzcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXJzIGFyZSBzdWItcmVnaXN0ZXJzIHRvIHRoaXMgb25lLiBUaGlzCisvLyBpcyB1c2VkIHRvIHBvcHVsYXRlIHRoZSBTdWJSZWdzIGFuZCBBbGlhc1NldCBmaWVsZHMgb2YgVGFyZ2V0UmVnaXN0ZXJEZXNjLgorLy8gVGhpcyBhbGxvd3MgdGhlIGNvZGUgZ2VuZXJhdG9yIHRvIGJlIGNhcmVmdWwgbm90IHRvIHB1dCB0d28gdmFsdWVzIHdpdGgKKy8vIG92ZXJsYXBwaW5nIGxpdmUgcmFuZ2VzIGludG8gcmVnaXN0ZXJzIHdoaWNoIGFsaWFzLgorY2xhc3MgUmVnaXN0ZXJXaXRoU3ViUmVnczxzdHJpbmcgbiwgbGlzdDxSZWdpc3Rlcj4gc3VicmVncz4gOiBSZWdpc3RlcjxuPiB7CisgIGxldCBTdWJSZWdzID0gc3VicmVnczsKK30KKworLy8gREFHT3BlcmFuZCAtIEFuIGVtcHR5IGJhc2UgY2xhc3MgdGhhdCB1bmlmaWVzIFJlZ2lzdGVyQ2xhc3MncyBhbmQgb3RoZXIgZm9ybXMKKy8vIG9mIE9wZXJhbmQncyB0aGF0IGFyZSBsZWdhbCBhcyB0eXBlIHF1YWxpZmllcnMgaW4gREFHIHBhdHRlcm5zLiAgVGhpcyBzaG91bGQKKy8vIG9ubHkgZXZlciBiZSB1c2VkIGZvciBkZWZpbmluZyBtdWx0aWNsYXNzZXMgdGhhdCBhcmUgcG9seW1vcnBoaWMgb3ZlciBib3RoCisvLyBSZWdpc3RlckNsYXNzJ3MgYW5kIG90aGVyIE9wZXJhbmQncy4KK2NsYXNzIERBR09wZXJhbmQgeworICBzdHJpbmcgT3BlcmFuZE5hbWVzcGFjZSA9ICJNQ09JIjsKKyAgc3RyaW5nIERlY29kZXJNZXRob2QgPSAiIjsKK30KKworLy8gUmVnaXN0ZXJDbGFzcyAtIE5vdyB0aGF0IGFsbCBvZiB0aGUgcmVnaXN0ZXJzIGFyZSBkZWZpbmVkLCBhbmQgYWxpYXNlcworLy8gYmV0d2VlbiByZWdpc3RlcnMgYXJlIGRlZmluZWQsIHNwZWNpZnkgd2hpY2ggcmVnaXN0ZXJzIGJlbG9uZyB0byB3aGljaAorLy8gcmVnaXN0ZXIgY2xhc3Nlcy4gIFRoaXMgYWxzbyBkZWZpbmVzIHRoZSBkZWZhdWx0IGFsbG9jYXRpb24gb3JkZXIgb2YKKy8vIHJlZ2lzdGVycyBieSByZWdpc3RlciBhbGxvY2F0b3JzLgorLy8KK2NsYXNzIFJlZ2lzdGVyQ2xhc3M8c3RyaW5nIG5hbWVzcGFjZSwgbGlzdDxWYWx1ZVR5cGU+IHJlZ1R5cGVzLCBpbnQgYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICBkYWcgcmVnTGlzdCwgUmVnQWx0TmFtZUluZGV4IGlkeCA9IE5vUmVnQWx0TmFtZT4KKyAgOiBEQUdPcGVyYW5kIHsKKyAgc3RyaW5nIE5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKKworICAvLyBUaGUgcmVnaXN0ZXIgc2l6ZS9hbGlnbm1lbnQgaW5mb3JtYXRpb24sIHBhcmFtZXRlcml6ZWQgYnkgYSBIVyBtb2RlLgorICBSZWdJbmZvQnlId01vZGUgUmVnSW5mb3M7CisKKyAgLy8gUmVnVHlwZSAtIFNwZWNpZnkgdGhlIGxpc3QgVmFsdWVUeXBlIG9mIHRoZSByZWdpc3RlcnMgaW4gdGhpcyByZWdpc3RlcgorICAvLyBjbGFzcy4gIE5vdGUgdGhhdCBhbGwgcmVnaXN0ZXJzIGluIGEgcmVnaXN0ZXIgY2xhc3MgbXVzdCBoYXZlIHRoZSBzYW1lCisgIC8vIFZhbHVlVHlwZXMuICBUaGlzIGlzIGEgbGlzdCBiZWNhdXNlIHNvbWUgdGFyZ2V0cyBwZXJtaXQgc3RvcmluZyBkaWZmZXJlbnQKKyAgLy8gdHlwZXMgaW4gc2FtZSByZWdpc3RlciwgZm9yIGV4YW1wbGUgdmVjdG9yIHZhbHVlcyB3aXRoIDEyOC1iaXQgdG90YWwgc2l6ZSwKKyAgLy8gYnV0IGRpZmZlcmVudCBjb3VudC9zaXplIG9mIGl0ZW1zLCBsaWtlIFNTRSBvbiB4ODYuCisgIC8vCisgIGxpc3Q8VmFsdWVUeXBlPiBSZWdUeXBlcyA9IHJlZ1R5cGVzOworCisgIC8vIFNpemUgLSBTcGVjaWZ5IHRoZSBzcGlsbCBzaXplIGluIGJpdHMgb2YgdGhlIHJlZ2lzdGVycy4gIEEgZGVmYXVsdCB2YWx1ZSBvZgorICAvLyB6ZXJvIGxldHMgdGFibGdlbiBwaWNrIGFuIGFwcHJvcHJpYXRlIHNpemUuCisgIGludCBTaXplID0gMDsKKworICAvLyBBbGlnbm1lbnQgLSBTcGVjaWZ5IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgb2YgdGhlIHJlZ2lzdGVycyB3aGVuIHRoZXkgYXJlCisgIC8vIHN0b3JlZCBvciBsb2FkZWQgdG8gbWVtb3J5LgorICAvLworICBpbnQgQWxpZ25tZW50ID0gYWxpZ25tZW50OworCisgIC8vIENvcHlDb3N0IC0gVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvc3Qgb2YgY29weWluZyBhIHZhbHVlCisgIC8vIGJldHdlZW4gdHdvIHJlZ2lzdGVycyBpbiB0aGlzIHJlZ2lzdGVyIGNsYXNzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBvbmUKKyAgLy8gbWVhbmluZyBpdCB0YWtlcyBhIHNpbmdsZSBpbnN0cnVjdGlvbiB0byBwZXJmb3JtIHRoZSBjb3B5aW5nLiBBIG5lZ2F0aXZlCisgIC8vIHZhbHVlIG1lYW5zIGNvcHlpbmcgaXMgZXh0cmVtZWx5IGV4cGVuc2l2ZSBvciBpbXBvc3NpYmxlLgorICBpbnQgQ29weUNvc3QgPSAxOworCisgIC8vIE1lbWJlckxpc3QgLSBTcGVjaWZ5IHdoaWNoIHJlZ2lzdGVycyBhcmUgaW4gdGhpcyBjbGFzcy4gIElmIHRoZQorICAvLyBhbGxvY2F0aW9uX29yZGVyXyogbWV0aG9kIGFyZSBub3Qgc3BlY2lmaWVkLCB0aGlzIGFsc28gZGVmaW5lcyB0aGUgb3JkZXIgb2YKKyAgLy8gYWxsb2NhdGlvbiB1c2VkIGJ5IHRoZSByZWdpc3RlciBhbGxvY2F0b3IuCisgIC8vCisgIGRhZyBNZW1iZXJMaXN0ID0gcmVnTGlzdDsKKworICAvLyBBbHROYW1lSW5kZXggLSBUaGUgYWx0ZXJuYXRlIHJlZ2lzdGVyIG5hbWUgdG8gdXNlIHdoZW4gcHJpbnRpbmcgb3BlcmFuZHMKKyAgLy8gb2YgdGhpcyByZWdpc3RlciBjbGFzcy4gRXZlcnkgcmVnaXN0ZXIgaW4gdGhlIHJlZ2lzdGVyIGNsYXNzIG11c3QgaGF2ZQorICAvLyBhIHZhbGlkIGFsdGVybmF0ZSBuYW1lIGZvciB0aGUgZ2l2ZW4gaW5kZXguCisgIFJlZ0FsdE5hbWVJbmRleCBhbHROYW1lSW5kZXggPSBpZHg7CisKKyAgLy8gaXNBbGxvY2F0YWJsZSAtIFNwZWNpZnkgdGhhdCB0aGUgcmVnaXN0ZXIgY2xhc3MgY2FuIGJlIHVzZWQgZm9yIHZpcnR1YWwKKyAgLy8gcmVnaXN0ZXJzIGFuZCByZWdpc3RlciBhbGxvY2F0aW9uLiAgU29tZSByZWdpc3RlciBjbGFzc2VzIGFyZSBvbmx5IHVzZWQgdG8KKyAgLy8gbW9kZWwgaW5zdHJ1Y3Rpb24gb3BlcmFuZCBjb25zdHJhaW50cywgYW5kIHNob3VsZCBoYXZlIGlzQWxsb2NhdGFibGUgPSAwLgorICBiaXQgaXNBbGxvY2F0YWJsZSA9IDE7CisKKyAgLy8gQWx0T3JkZXJzIC0gTGlzdCBvZiBhbHRlcm5hdGl2ZSBhbGxvY2F0aW9uIG9yZGVycy4gVGhlIGRlZmF1bHQgb3JkZXIgaXMKKyAgLy8gTWVtYmVyTGlzdCBpdHNlbGYsIGFuZCB0aGF0IGlzIGdvb2QgZW5vdWdoIGZvciBtb3N0IHRhcmdldHMgc2luY2UgdGhlCisgIC8vIHJlZ2lzdGVyIGFsbG9jYXRvcnMgYXV0b21hdGljYWxseSByZW1vdmUgcmVzZXJ2ZWQgcmVnaXN0ZXJzIGFuZCBtb3ZlCisgIC8vIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMgdG8gdGhlIGVuZC4KKyAgbGlzdDxkYWc+IEFsdE9yZGVycyA9IFtdOworCisgIC8vIEFsdE9yZGVyU2VsZWN0IC0gVGhlIGJvZHkgb2YgYSBmdW5jdGlvbiB0aGF0IHNlbGVjdHMgdGhlIGFsbG9jYXRpb24gb3JkZXIKKyAgLy8gdG8gdXNlIGluIGEgZ2l2ZW4gbWFjaGluZSBmdW5jdGlvbi4gVGhlIGNvZGUgd2lsbCBiZSBpbnNlcnRlZCBpbiBhCisgIC8vIGZ1bmN0aW9uIGxpa2UgdGhpczoKKyAgLy8KKyAgLy8gICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGYoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgeyAuLi4gfQorICAvLworICAvLyBUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiAwIHRvIHNlbGVjdCB0aGUgZGVmYXVsdCBvcmRlciBkZWZpbmVkIGJ5CisgIC8vIE1lbWJlckxpc3QsIDEgdG8gc2VsZWN0IHRoZSBmaXJzdCBBbHRPcmRlcnMgZW50cnkgYW5kIHNvIG9uLgorICBjb2RlIEFsdE9yZGVyU2VsZWN0ID0gW3t9XTsKKworICAvLyBTcGVjaWZ5IGFsbG9jYXRpb24gcHJpb3JpdHkgZm9yIHJlZ2lzdGVyIGFsbG9jYXRvcnMgdXNpbmcgYSBncmVlZHkKKyAgLy8gaGV1cmlzdGljLiBDbGFzc2VzIHdpdGggaGlnaGVyIHByaW9yaXR5IHZhbHVlcyBhcmUgYXNzaWduZWQgZmlyc3QuIFRoaXMgaXMKKyAgLy8gdXNlZnVsIGFzIGl0IGlzIHNvbWV0aW1lcyBiZW5lZmljaWFsIHRvIGFzc2lnbiByZWdpc3RlcnMgdG8gaGlnaGx5CisgIC8vIGNvbnN0cmFpbmVkIGNsYXNzZXMgZmlyc3QuIFRoZSB2YWx1ZSBoYXMgdG8gYmUgaW4gdGhlIHJhbmdlIFswLDYzXS4KKyAgaW50IEFsbG9jYXRpb25Qcmlvcml0eSA9IDA7CisKKyAgLy8gVGhlIGRpYWdub3N0aWMgdHlwZSB0byBwcmVzZW50IHdoZW4gcmVmZXJlbmNpbmcgdGhpcyBvcGVyYW5kIGluIGEgbWF0Y2gKKyAgLy8gZmFpbHVyZSBlcnJvciBtZXNzYWdlLiBJZiB0aGlzIGlzIGVtcHR5LCB0aGUgZGVmYXVsdCBNYXRjaF9JbnZhbGlkT3BlcmFuZAorICAvLyBkaWFnbm9zdGljIHR5cGUgd2lsbCBiZSB1c2VkLiBJZiB0aGlzIGlzICI8bmFtZT4iLCBhIE1hdGNoXzxuYW1lPiBlbnVtCisgIC8vIHZhbHVlIHdpbGwgYmUgZ2VuZXJhdGVkIGFuZCB1c2VkIGZvciB0aGlzIG9wZXJhbmQgdHlwZS4gVGhlIHRhcmdldAorICAvLyBhc3NlbWJseSBwYXJzZXIgaXMgcmVzcG9uc2libGUgZm9yIGNvbnZlcnRpbmcgdGhpcyBpbnRvIGEgdXNlci1mYWNpbmcKKyAgLy8gZGlhZ25vc3RpYyBtZXNzYWdlLgorICBzdHJpbmcgRGlhZ25vc3RpY1R5cGUgPSAiIjsKKworICAvLyBBIGRpYWdub3N0aWMgbWVzc2FnZSB0byBlbWl0IHdoZW4gYW4gaW52YWxpZCB2YWx1ZSBpcyBwcm92aWRlZCBmb3IgdGhpcworICAvLyByZWdpc3RlciBjbGFzcyB3aGVuIGl0IGlzIGJlaW5nIHVzZWQgYW4gYW4gYXNzZW1ibHkgb3BlcmFuZC4gSWYgdGhpcyBpcworICAvLyBub24tZW1wdHksIGFuIGFub255bW91cyBkaWFnbm9zdGljIHR5cGUgZW51bSB2YWx1ZSB3aWxsIGJlIGdlbmVyYXRlZCwgYW5kCisgIC8vIHRoZSBhc3NlbWJseSBtYXRjaGVyIHdpbGwgcHJvdmlkZSBhIGZ1bmN0aW9uIHRvIG1hcCBmcm9tIGRpYWdub3N0aWMgdHlwZXMKKyAgLy8gdG8gbWVzc2FnZSBzdHJpbmdzLgorICBzdHJpbmcgRGlhZ25vc3RpY1N0cmluZyA9ICIiOworfQorCisvLyBUaGUgbWVtYmVyTGlzdCBpbiBhIFJlZ2lzdGVyQ2xhc3MgaXMgYSBkYWcgb2Ygc2V0IG9wZXJhdGlvbnMuIFRhYmxlR2VuCisvLyBldmFsdWF0ZXMgdGhlc2Ugc2V0IG9wZXJhdGlvbnMgYW5kIGV4cGFuZCB0aGVtIGludG8gcmVnaXN0ZXIgbGlzdHMuIFRoZXNlCisvLyBhcmUgdGhlIG1vc3QgY29tbW9uIG9wZXJhdGlvbiwgc2VlIHRlc3QvVGFibGVHZW4vU2V0VGhlb3J5LnRkIGZvciBtb3JlCisvLyBleGFtcGxlcyBvZiB3aGF0IGlzIHBvc3NpYmxlOgorLy8KKy8vIChhZGQgUjAsIFIxLCBSMikgLSBTZXQgVW5pb24uIEVhY2ggYXJndW1lbnQgY2FuIGJlIGFuIGluZGl2aWR1YWwgcmVnaXN0ZXIsIGEKKy8vIHJlZ2lzdGVyIGNsYXNzLCBvciBhIHN1Yi1leHByZXNzaW9uLiBUaGlzIGlzIGFsc28gdGhlIHdheSB0byBzaW1wbHkgbGlzdAorLy8gcmVnaXN0ZXJzLgorLy8KKy8vIChzdWIgR1BSLCBTUCkgLSBTZXQgZGlmZmVyZW5jZS4gU3VidHJhY3QgdGhlIGxhc3QgYXJndW1lbnRzIGZyb20gdGhlIGZpcnN0LgorLy8KKy8vIChhbmQgR1BSLCBDU1IpIC0gU2V0IGludGVyc2VjdGlvbi4gQWxsIHJlZ2lzdGVycyBmcm9tIHRoZSBmaXJzdCBzZXQgdGhhdCBhcmUKKy8vIGFsc28gaW4gdGhlIHNlY29uZCBzZXQuCisvLworLy8gKHNlcXVlbmNlICJSJXUiLCAwLCAxNSkgLT4gW1IwLCBSMSwgLi4uLCBSMTVdLiBHZW5lcmF0ZSBhIHNlcXVlbmNlIG9mCisvLyBudW1iZXJlZCByZWdpc3RlcnMuICBUYWtlcyBhbiBvcHRpb25hbCA0dGggb3BlcmFuZCB3aGljaCBpcyBhIHN0cmlkZSB0byB1c2UKKy8vIHdoZW4gZ2VuZXJhdGluZyB0aGUgc2VxdWVuY2UuCisvLworLy8gKHNobCBHUFIsIDQpIC0gUmVtb3ZlIHRoZSBmaXJzdCBOIGVsZW1lbnRzLgorLy8KKy8vICh0cnVuYyBHUFIsIDQpIC0gVHJ1bmNhdGUgYWZ0ZXIgdGhlIGZpcnN0IE4gZWxlbWVudHMuCisvLworLy8gKHJvdGwgR1BSLCAxKSAtIFJvdGF0ZSBOIHBsYWNlcyB0byB0aGUgbGVmdC4KKy8vCisvLyAocm90ciBHUFIsIDEpIC0gUm90YXRlIE4gcGxhY2VzIHRvIHRoZSByaWdodC4KKy8vCisvLyAoZGVjaW1hdGUgR1BSLCAyKSAtIFBpY2sgZXZlcnkgTid0aCBlbGVtZW50LCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdC4KKy8vCisvLyAoaW50ZXJsZWF2ZSBBLCBCLCAuLi4pIC0gSW50ZXJsZWF2ZSB0aGUgZWxlbWVudHMgZnJvbSBlYWNoIGFyZ3VtZW50IGxpc3QuCisvLworLy8gQWxsIG9mIHRoZXNlIG9wZXJhdG9ycyB3b3JrIG9uIG9yZGVyZWQgc2V0cywgbm90IGxpc3RzLiBUaGF0IG1lYW5zCisvLyBkdXBsaWNhdGVzIGFyZSByZW1vdmVkIGZyb20gc3ViLWV4cHJlc3Npb25zLgorCisvLyBTZXQgb3BlcmF0b3JzLiBUaGUgcmVzdCBpcyBkZWZpbmVkIGluIFRhcmdldFNlbGVjdGlvbkRBRy50ZC4KK2RlZiBzZXF1ZW5jZTsKK2RlZiBkZWNpbWF0ZTsKK2RlZiBpbnRlcmxlYXZlOworCisvLyBSZWdpc3RlclR1cGxlcyAtIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgc3VwZXItcmVnaXN0ZXJzIGJ5IGZvcm1pbmcgdHVwbGVzIG9mCisvLyBzdWItcmVnaXN0ZXJzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgbW9kZWxpbmcgcmVnaXN0ZXIgc2VxdWVuY2UgY29uc3RyYWludHMKKy8vIHdpdGggcHNldWRvLXJlZ2lzdGVycyB0aGF0IGFyZSBsYXJnZXIgdGhhbiB0aGUgYXJjaGl0ZWN0dXJhbCByZWdpc3RlcnMuCisvLworLy8gVGhlIHN1Yi1yZWdpc3RlciBsaXN0cyBhcmUgemlwcGVkIHRvZ2V0aGVyOgorLy8KKy8vICAgZGVmIEV2ZW5PZGQgOiBSZWdpc3RlclR1cGxlczxbc3ViZSwgc3Vib10sIFsoYWRkIFIwLCBSMiksIChhZGQgUjEsIFIzKV0+OworLy8KKy8vIEdlbmVyYXRlcyB0aGUgc2FtZSByZWdpc3RlcnMgYXM6CisvLworLy8gICBsZXQgU3ViUmVnSW5kaWNlcyA9IFtzdWJlLCBzdWJvXSBpbiB7CisvLyAgICAgZGVmIFIwX1IxIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwiIiwgW1IwLCBSMV0+OworLy8gICAgIGRlZiBSMl9SMyA6IFJlZ2lzdGVyV2l0aFN1YlJlZ3M8IiIsIFtSMiwgUjNdPjsKKy8vICAgfQorLy8KKy8vIFRoZSBnZW5lcmF0ZWQgcHNldWRvLXJlZ2lzdGVycyBpbmhlcml0IHN1cGVyLWNsYXNzZXMgYW5kIGZpZWxkcyBmcm9tIHRoZWlyCisvLyBmaXJzdCBzdWItcmVnaXN0ZXIuIE1vc3QgZmllbGRzIGZyb20gdGhlIFJlZ2lzdGVyIGNsYXNzIGFyZSBpbmZlcnJlZCwgYW5kCisvLyB0aGUgQXNtTmFtZSBhbmQgRHdhcmYgbnVtYmVycyBhcmUgY2xlYXJlZC4KKy8vCisvLyBSZWdpc3RlclR1cGxlcyBpbnN0YW5jZXMgY2FuIGJlIHVzZWQgaW4gb3RoZXIgc2V0IG9wZXJhdGlvbnMgdG8gZm9ybQorLy8gcmVnaXN0ZXIgY2xhc3NlcyBhbmQgc28gb24uIFRoaXMgaXMgdGhlIG9ubHkgd2F5IG9mIHVzaW5nIHRoZSBnZW5lcmF0ZWQKKy8vIHJlZ2lzdGVycy4KK2NsYXNzIFJlZ2lzdGVyVHVwbGVzPGxpc3Q8U3ViUmVnSW5kZXg+IEluZGljZXMsIGxpc3Q8ZGFnPiBSZWdzPiB7CisgIC8vIFN1YlJlZ3MgLSBOIGxpc3RzIG9mIHJlZ2lzdGVycyB0byBiZSB6aXBwZWQgdXAuIFN1cGVyLXJlZ2lzdGVycyBhcmUKKyAgLy8gc3ludGhlc2l6ZWQgZnJvbSB0aGUgZmlyc3QgZWxlbWVudCBvZiBlYWNoIFN1YlJlZ3MgbGlzdCwgdGhlIHNlY29uZAorICAvLyBlbGVtZW50IGFuZCBzbyBvbi4KKyAgbGlzdDxkYWc+IFN1YlJlZ3MgPSBSZWdzOworCisgIC8vIFN1YlJlZ0luZGljZXMgLSBOIFN1YlJlZ0luZGV4IGluc3RhbmNlcy4gVGhpcyBwcm92aWRlcyB0aGUgbmFtZXMgb2YgdGhlCisgIC8vIHN1Yi1yZWdpc3RlcnMgaW4gdGhlIHN5bnRoZXNpemVkIHN1cGVyLXJlZ2lzdGVycy4KKyAgbGlzdDxTdWJSZWdJbmRleD4gU3ViUmVnSW5kaWNlcyA9IEluZGljZXM7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIER3YXJmUmVnTnVtIC0gVGhpcyBjbGFzcyBwcm92aWRlcyBhIG1hcHBpbmcgb2YgdGhlIGxsdm0gcmVnaXN0ZXIgZW51bWVyYXRpb24KKy8vIHRvIHRoZSByZWdpc3RlciBudW1iZXJpbmcgdXNlZCBieSBnY2MgYW5kIGdkYi4gIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCBieSBhCisvLyBkZWJ1ZyBpbmZvcm1hdGlvbiB3cml0ZXIgdG8gZGVzY3JpYmUgd2hlcmUgdmFsdWVzIG1heSBiZSBsb2NhdGVkIGR1cmluZworLy8gZXhlY3V0aW9uLgorY2xhc3MgRHdhcmZSZWdOdW08bGlzdDxpbnQ+IE51bWJlcnM+IHsKKyAgLy8gRHdhcmZOdW1iZXJzIC0gTnVtYmVycyB1c2VkIGludGVybmFsbHkgYnkgZ2NjL2dkYiB0byBpZGVudGlmeSB0aGUgcmVnaXN0ZXIuCisgIC8vIFRoZXNlIHZhbHVlcyBjYW4gYmUgZGV0ZXJtaW5lZCBieSBsb2NhdGluZyB0aGUgPHRhcmdldD4uaCBmaWxlIGluIHRoZQorICAvLyBkaXJlY3RvcnkgbGx2bWdjYy9nY2MvY29uZmlnLzx0YXJnZXQ+LyBhbmQgbG9va2luZyBmb3IgUkVHSVNURVJfTkFNRVMuICBUaGUKKyAgLy8gb3JkZXIgb2YgdGhlc2UgbmFtZXMgY29ycmVzcG9uZCB0byB0aGUgZW51bWVyYXRpb24gdXNlZCBieSBnY2MuICBBIHZhbHVlIG9mCisgIC8vIC0xIGluZGljYXRlcyB0aGF0IHRoZSBnY2MgbnVtYmVyIGlzIHVuZGVmaW5lZCBhbmQgLTIgdGhhdCByZWdpc3RlciBudW1iZXIKKyAgLy8gaXMgaW52YWxpZCBmb3IgdGhpcyBtb2RlL2ZsYXZvdXIuCisgIGxpc3Q8aW50PiBEd2FyZk51bWJlcnMgPSBOdW1iZXJzOworfQorCisvLyBEd2FyZlJlZ0FsaWFzIC0gVGhpcyBjbGFzcyBkZWNsYXJlcyB0aGF0IGEgZ2l2ZW4gcmVnaXN0ZXIgdXNlcyB0aGUgc2FtZSBkd2FyZgorLy8gbnVtYmVycyBhcyBhbm90aGVyIG9uZS4gVGhpcyBpcyB1c2VmdWwgZm9yIG1ha2luZyBpdCBjbGVhciB0aGF0IHRoZSB0d28KKy8vIHJlZ2lzdGVycyBkbyBoYXZlIHRoZSBzYW1lIG51bWJlci4gSXQgYWxzbyBsZXRzIHVzIGJ1aWxkIGEgbWFwcGluZworLy8gZnJvbSBkd2FyZiByZWdpc3RlciBudW1iZXIgdG8gbGx2bSByZWdpc3Rlci4KK2NsYXNzIER3YXJmUmVnQWxpYXM8UmVnaXN0ZXIgcmVnPiB7CisgICAgICBSZWdpc3RlciBEd2FyZkFsaWFzID0gcmVnOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUHVsbCBpbiB0aGUgY29tbW9uIHN1cHBvcnQgZm9yIHNjaGVkdWxpbmcKKy8vCitpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRTY2hlZHVsZS50ZCIKKworY2xhc3MgUHJlZGljYXRlOyAvLyBGb3J3YXJkIGRlZgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gc2V0IGRlc2NyaXB0aW9uIC0gVGhlc2UgY2xhc3NlcyBjb3JyZXNwb25kIHRvIHRoZSBDKysgY2xhc3NlcyBpbgorLy8gdGhlIFRhcmdldC9UYXJnZXRJbnN0ckluZm8uaCBmaWxlLgorLy8KK2NsYXNzIEluc3RydWN0aW9uIHsKKyAgc3RyaW5nIE5hbWVzcGFjZSA9ICIiOworCisgIGRhZyBPdXRPcGVyYW5kTGlzdDsgICAgICAgLy8gQW4gZGFnIGNvbnRhaW5pbmcgdGhlIE1JIGRlZiBvcGVyYW5kIGxpc3QuCisgIGRhZyBJbk9wZXJhbmRMaXN0OyAgICAgICAgLy8gQW4gZGFnIGNvbnRhaW5pbmcgdGhlIE1JIHVzZSBvcGVyYW5kIGxpc3QuCisgIHN0cmluZyBBc21TdHJpbmcgPSAiIjsgICAgLy8gVGhlIC5zIGZvcm1hdCB0byBwcmludCB0aGUgaW5zdHJ1Y3Rpb24gd2l0aC4KKworICAvLyBQYXR0ZXJuIC0gU2V0IHRvIHRoZSBEQUcgcGF0dGVybiBmb3IgdGhpcyBpbnN0cnVjdGlvbiwgaWYgd2Uga25vdyBvZiBvbmUsCisgIC8vIG90aGVyd2lzZSwgdW5pbml0aWFsaXplZC4KKyAgbGlzdDxkYWc+IFBhdHRlcm47CisKKyAgLy8gVGhlIGZvbGxvdyBzdGF0ZSB3aWxsIGV2ZW50dWFsbHkgYmUgaW5mZXJyZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZQorICAvLyBpbnN0cnVjdGlvbiBwYXR0ZXJuLgorCisgIGxpc3Q8UmVnaXN0ZXI+IFVzZXMgPSBbXTsgLy8gRGVmYXVsdCB0byB1c2luZyBubyBub24tb3BlcmFuZCByZWdpc3RlcnMKKyAgbGlzdDxSZWdpc3Rlcj4gRGVmcyA9IFtdOyAvLyBEZWZhdWx0IHRvIG1vZGlmeWluZyBubyBub24tb3BlcmFuZCByZWdpc3RlcnMKKworICAvLyBQcmVkaWNhdGVzIC0gTGlzdCBvZiBwcmVkaWNhdGVzIHdoaWNoIHdpbGwgYmUgdHVybmVkIGludG8gaXNlbCBtYXRjaGluZworICAvLyBjb2RlLgorICBsaXN0PFByZWRpY2F0ZT4gUHJlZGljYXRlcyA9IFtdOworCisgIC8vIFNpemUgLSBTaXplIG9mIGVuY29kZWQgaW5zdHJ1Y3Rpb24sIG9yIHplcm8gaWYgdGhlIHNpemUgY2Fubm90IGJlIGRldGVybWluZWQKKyAgLy8gZnJvbSB0aGUgb3Bjb2RlLgorICBpbnQgU2l6ZSA9IDA7CisKKyAgLy8gRGVjb2Rlck5hbWVzcGFjZSAtIFRoZSAibmFtZXNwYWNlIiBpbiB3aGljaCB0aGlzIGluc3RydWN0aW9uIGV4aXN0cywgb24KKyAgLy8gdGFyZ2V0cyBsaWtlIEFSTSB3aGljaCBtdWx0aXBsZSBJU0EgbmFtZXNwYWNlcyBleGlzdC4KKyAgc3RyaW5nIERlY29kZXJOYW1lc3BhY2UgPSAiIjsKKworICAvLyBDb2RlIHNpemUsIGZvciBpbnN0cnVjdGlvbiBzZWxlY3Rpb24uCisgIC8vIEZJWE1FOiBXaGF0IGRvZXMgdGhpcyBhY3R1YWxseSBtZWFuPworICBpbnQgQ29kZVNpemUgPSAwOworCisgIC8vIEFkZGVkIGNvbXBsZXhpdHkgcGFzc2VkIG9udG8gbWF0Y2hpbmcgcGF0dGVybi4KKyAgaW50IEFkZGVkQ29tcGxleGl0eSAgPSAwOworCisgIC8vIFRoZXNlIGJpdHMgY2FwdHVyZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaGlnaC1sZXZlbCBzZW1hbnRpY3Mgb2YgdGhlCisgIC8vIGluc3RydWN0aW9uLgorICBiaXQgaXNSZXR1cm4gICAgID0gMDsgICAgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gYSByZXR1cm4gaW5zdHJ1Y3Rpb24/CisgIGJpdCBpc0JyYW5jaCAgICAgPSAwOyAgICAgLy8gSXMgdGhpcyBpbnN0cnVjdGlvbiBhIGJyYW5jaCBpbnN0cnVjdGlvbj8KKyAgYml0IGlzSW5kaXJlY3RCcmFuY2ggPSAwOyAvLyBJcyB0aGlzIGluc3RydWN0aW9uIGFuIGluZGlyZWN0IGJyYW5jaD8KKyAgYml0IGlzQ29tcGFyZSAgICA9IDA7ICAgICAvLyBJcyB0aGlzIGluc3RydWN0aW9uIGEgY29tcGFyaXNvbiBpbnN0cnVjdGlvbj8KKyAgYml0IGlzTW92ZUltbSAgICA9IDA7ICAgICAvLyBJcyB0aGlzIGluc3RydWN0aW9uIGEgbW92ZSBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24/CisgIGJpdCBpc0JpdGNhc3QgICAgPSAwOyAgICAgLy8gSXMgdGhpcyBpbnN0cnVjdGlvbiBhIGJpdGNhc3QgaW5zdHJ1Y3Rpb24/CisgIGJpdCBpc1NlbGVjdCAgICAgPSAwOyAgICAgLy8gSXMgdGhpcyBpbnN0cnVjdGlvbiBhIHNlbGVjdCBpbnN0cnVjdGlvbj8KKyAgYml0IGlzQmFycmllciAgICA9IDA7ICAgICAvLyBDYW4gY29udHJvbCBmbG93IGZhbGwgdGhyb3VnaCB0aGlzIGluc3RydWN0aW9uPworICBiaXQgaXNDYWxsICAgICAgID0gMDsgICAgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gYSBjYWxsIGluc3RydWN0aW9uPworICBiaXQgaXNBZGQgICAgICAgID0gMDsgICAgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gYW4gYWRkIGluc3RydWN0aW9uPworICBiaXQgY2FuRm9sZEFzTG9hZCA9IDA7ICAgIC8vIENhbiB0aGlzIGJlIGZvbGRlZCBhcyBhIHNpbXBsZSBtZW1vcnkgb3BlcmFuZD8KKyAgYml0IG1heUxvYWQgICAgICA9ID87ICAgICAvLyBJcyBpdCBwb3NzaWJsZSBmb3IgdGhpcyBpbnN0IHRvIHJlYWQgbWVtb3J5PworICBiaXQgbWF5U3RvcmUgICAgID0gPzsgICAgIC8vIElzIGl0IHBvc3NpYmxlIGZvciB0aGlzIGluc3QgdG8gd3JpdGUgbWVtb3J5PworICBiaXQgaXNDb252ZXJ0aWJsZVRvVGhyZWVBZGRyZXNzID0gMDsgIC8vIENhbiB0aGlzIDItYWRkciBpbnN0cnVjdGlvbiBwcm9tb3RlPworICBiaXQgaXNDb21tdXRhYmxlID0gMDsgICAgIC8vIElzIHRoaXMgMyBvcGVyYW5kIGluc3RydWN0aW9uIGNvbW11dGFibGU/CisgIGJpdCBpc1Rlcm1pbmF0b3IgPSAwOyAgICAgLy8gSXMgdGhpcyBwYXJ0IG9mIHRoZSB0ZXJtaW5hdG9yIGZvciBhIGJhc2ljIGJsb2NrPworICBiaXQgaXNSZU1hdGVyaWFsaXphYmxlID0gMDsgLy8gSXMgdGhpcyBpbnN0cnVjdGlvbiByZS1tYXRlcmlhbGl6YWJsZT8KKyAgYml0IGlzUHJlZGljYWJsZSA9IDA7ICAgICAvLyBJcyB0aGlzIGluc3RydWN0aW9uIHByZWRpY2FibGU/CisgIGJpdCBoYXNEZWxheVNsb3QgPSAwOyAgICAgLy8gRG9lcyB0aGlzIGluc3RydWN0aW9uIGhhdmUgYW4gZGVsYXkgc2xvdD8KKyAgYml0IHVzZXNDdXN0b21JbnNlcnRlciA9IDA7IC8vIFBzZXVkbyBpbnN0ciBuZWVkaW5nIHNwZWNpYWwgaGVscC4KKyAgYml0IGhhc1Bvc3RJU2VsSG9vayA9IDA7ICAvLyBUbyBiZSAqYWRqdXN0ZWQqIGFmdGVyIGlzZWwgYnkgdGFyZ2V0IGhvb2suCisgIGJpdCBoYXNDdHJsRGVwICAgPSAwOyAgICAgLy8gRG9lcyB0aGlzIGluc3RydWN0aW9uIHIvdyBjdHJsLWZsb3cgY2hhaW5zPworICBiaXQgaXNOb3REdXBsaWNhYmxlID0gMDsgIC8vIElzIGl0IHVuc2FmZSB0byBkdXBsaWNhdGUgdGhpcyBpbnN0cnVjdGlvbj8KKyAgYml0IGlzQ29udmVyZ2VudCA9IDA7ICAgICAvLyBJcyB0aGlzIGluc3RydWN0aW9uIGNvbnZlcmdlbnQ/CisgIGJpdCBpc0FzQ2hlYXBBc0FNb3ZlID0gMDsgLy8gQXMgY2hlYXAgKG9yIGNoZWFwZXIpIHRoYW4gYSBtb3ZlIGluc3RydWN0aW9uLgorICBiaXQgaGFzRXh0cmFTcmNSZWdBbGxvY1JlcSA9IDA7IC8vIFNvdXJjZXMgaGF2ZSBzcGVjaWFsIHJlZ2FsbG9jIHJlcXVpcmVtZW50PworICBiaXQgaGFzRXh0cmFEZWZSZWdBbGxvY1JlcSA9IDA7IC8vIERlZnMgaGF2ZSBzcGVjaWFsIHJlZ2FsbG9jIHJlcXVpcmVtZW50PworICBiaXQgaXNSZWdTZXF1ZW5jZSA9IDA7ICAgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gYSBraW5kIG9mIHJlZyBzZXF1ZW5jZT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzbywgbWFrZSBzdXJlIHRvIG92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFyZ2V0SW5zdHJJbmZvOjpnZXRSZWdTZXF1ZW5jZUxpa2VJbnB1dHMuCisgIGJpdCBpc1BzZXVkbyAgICAgPSAwOyAgICAgLy8gSXMgdGhpcyBpbnN0cnVjdGlvbiBhIHBzZXVkby1pbnN0cnVjdGlvbj8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzbywgd29uJ3QgaGF2ZSBlbmNvZGluZyBpbmZvcm1hdGlvbiBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgW01DXUNvZGVFbWl0dGVyIHN0dWZmLgorICBiaXQgaXNFeHRyYWN0U3VicmVnID0gMDsgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gYSBraW5kIG9mIGV4dHJhY3Qgc3VicmVnPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzbywgbWFrZSBzdXJlIHRvIG92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhcmdldEluc3RySW5mbzo6Z2V0RXh0cmFjdFN1YnJlZ0xpa2VJbnB1dHMuCisgIGJpdCBpc0luc2VydFN1YnJlZyA9IDA7ICAgLy8gSXMgdGhpcyBpbnN0cnVjdGlvbiBhIGtpbmQgb2YgaW5zZXJ0IHN1YnJlZz8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzbywgbWFrZSBzdXJlIHRvIG92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFyZ2V0SW5zdHJJbmZvOjpnZXRJbnNlcnRTdWJyZWdMaWtlSW5wdXRzLgorCisgIC8vIERvZXMgdGhlIGluc3RydWN0aW9uIGhhdmUgc2lkZSBlZmZlY3RzIHRoYXQgYXJlIG5vdCBjYXB0dXJlZCBieSBhbnkKKyAgLy8gb3BlcmFuZHMgb2YgdGhlIGluc3RydWN0aW9uIG9yIG90aGVyIGZsYWdzPworICBiaXQgaGFzU2lkZUVmZmVjdHMgPSA/OworCisgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gYSAicmVhbCIgaW5zdHJ1Y3Rpb24gKHdpdGggYSBkaXN0aW5jdCBtYWNoaW5lCisgIC8vIGVuY29kaW5nKSwgb3IgaXMgaXQgYSBwc2V1ZG8gaW5zdHJ1Y3Rpb24gdXNlZCBmb3IgY29kZWdlbiBtb2RlbGluZworICAvLyBwdXJwb3Nlcy4KKyAgLy8gRklYTUU6IEZvciBub3cgdGhpcyBpcyBkaXN0aW5jdCBmcm9tIGlzUHNldWRvLCBhYm92ZSwgYXMgY29kZS1nZW4tb25seQorICAvLyBpbnN0cnVjdGlvbnMgY2FuIChhbmQgb2Z0ZW4gZG8pIHN0aWxsIGhhdmUgZW5jb2RpbmcgaW5mb3JtYXRpb24KKyAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZW0uIE9uY2Ugd2UndmUgbWlncmF0ZWQgYWxsIG9mIHRoZW0gb3ZlciB0byB0cnVlCisgIC8vIHBzZXVkby1pbnN0cnVjdGlvbnMgdGhhdCBhcmUgbG93ZXJlZCB0byByZWFsIGluc3RydWN0aW9ucyBwcmlvciB0bworICAvLyB0aGUgcHJpbnRlci9lbWl0dGVyLCB3ZSBjYW4gcmVtb3ZlIHRoaXMgYXR0cmlidXRlIGFuZCBqdXN0IHVzZSBpc1BzZXVkby4KKyAgLy8KKyAgLy8gVGhlIGludGVuZGVkIHVzZSBpczoKKyAgLy8gaXNQc2V1ZG86IERvZXMgbm90IGhhdmUgZW5jb2RpbmcgaW5mb3JtYXRpb24gYW5kIHNob3VsZCBiZSBleHBhbmRlZCwKKyAgLy8gICBhdCB0aGUgbGF0ZXN0LCBkdXJpbmcgbG93ZXJpbmcgdG8gTUNJbnN0LgorICAvLworICAvLyBpc0NvZGVHZW5Pbmx5OiBEb2VzIGhhdmUgZW5jb2RpbmcgaW5mb3JtYXRpb24gYW5kIGNhbiBnbyB0aHJvdWdoIHRvIHRoZQorICAvLyAgIENvZGVFbWl0dGVyIHVuY2hhbmdlZCwgYnV0IGR1cGxpY2F0ZXMgYSBjYW5vbmljYWwgaW5zdHJ1Y3Rpb24KKyAgLy8gICBkZWZpbml0aW9uJ3MgZW5jb2RpbmcgYW5kIHNob3VsZCBiZSBpZ25vcmVkIHdoZW4gY29uc3RydWN0aW5nIHRoZQorICAvLyAgIGFzc2VtYmxlciBtYXRjaCB0YWJsZXMuCisgIGJpdCBpc0NvZGVHZW5Pbmx5ID0gMDsKKworICAvLyBJcyB0aGlzIGluc3RydWN0aW9uIGEgcHNldWRvIGluc3RydWN0aW9uIGZvciB1c2UgYnkgdGhlIGFzc2VtYmxlciBwYXJzZXIuCisgIGJpdCBpc0FzbVBhcnNlck9ubHkgPSAwOworCisgIC8vIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgbm90IGV4cGVjdGVkIHRvIGJlIHF1ZXJpZWQgZm9yIHNjaGVkdWxpbmcgbGF0ZW5jaWVzCisgIC8vIGFuZCB0aGVyZWZvcmUgbmVlZHMgbm8gc2NoZWR1bGluZyBpbmZvcm1hdGlvbiBldmVuIGZvciBhIGNvbXBsZXRlCisgIC8vIHNjaGVkdWxpbmcgbW9kZWwuCisgIGJpdCBoYXNOb1NjaGVkdWxpbmdJbmZvID0gMDsKKworICBJbnN0ckl0aW5DbGFzcyBJdGluZXJhcnkgPSBOb0l0aW5lcmFyeTsvLyBFeGVjdXRpb24gc3RlcHMgdXNlZCBmb3Igc2NoZWR1bGluZy4KKworICAvLyBTY2hlZHVsaW5nIGluZm9ybWF0aW9uIGZyb20gVGFyZ2V0U2NoZWR1bGUudGQuCisgIGxpc3Q8U2NoZWRSZWFkV3JpdGU+IFNjaGVkUlc7CisKKyAgc3RyaW5nIENvbnN0cmFpbnRzID0gIiI7ICAvLyBPcGVyYW5kQ29uc3RyYWludCwgZS5nLiAkc3JjID0gJGRzdC4KKworICAvLy8gRGlzYWJsZUVuY29kaW5nIC0gTGlzdCBvZiBvcGVyYW5kIG5hbWVzIChlLmcuICIkb3AxLCRvcDIiKSB0aGF0IHNob3VsZCBub3QKKyAgLy8vIGJlIGVuY29kZWQgaW50byB0aGUgb3V0cHV0IG1hY2hpbmVpbnN0ci4KKyAgc3RyaW5nIERpc2FibGVFbmNvZGluZyA9ICIiOworCisgIHN0cmluZyBQb3N0RW5jb2Rlck1ldGhvZCA9ICIiOworICBzdHJpbmcgRGVjb2Rlck1ldGhvZCA9ICIiOworCisgIC8vIElzIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVyIG1ldGhvZCBhYmxlIHRvIGNvbXBsZXRlbHkgZGV0ZXJtaW5lIGlmIHRoZQorICAvLyBnaXZlbiBpbnN0cnVjdGlvbiBpcyB2YWxpZCBvciBub3QuIElmIHRoZSBUYWJsZUdlbiBkZWZpbml0aW9uIG9mIHRoZQorICAvLyBpbnN0cnVjdGlvbiBzcGVjaWZpZXMgYml0cGF0dGVybiBBPz9CIHdoZXJlIEEgYW5kIEIgYXJlIHN0YXRpYyBiaXRzLCB0aGUKKyAgLy8gaGFzQ29tcGxldGVEZWNvZGVyIGZsYWcgc2F5cyB3aGV0aGVyIHRoZSBkZWNvZGVyIG1ldGhvZCBmdWxseSBoYW5kbGVzIHRoZQorICAvLyA/PyBzcGFjZSwgaS5lLiBpZiBpdCBpcyBhIGZpbmFsIGFyYml0ZXIgZm9yIHRoZSBpbnN0cnVjdGlvbiB2YWxpZGl0eS4KKyAgLy8gSWYgbm90IHRoZW4gdGhlIGRlY29kZXIgYXR0ZW1wdHMgdG8gY29udGludWUgZGVjb2Rpbmcgd2hlbiB0aGUgZGVjb2RlcgorICAvLyBtZXRob2QgZmFpbHMuCisgIC8vCisgIC8vIFRoaXMgYWxsb3dzIHRvIGhhbmRsZSBzaXR1YXRpb25zIHdoZXJlIHRoZSBlbmNvZGluZyBpcyBub3QgZnVsbHkKKyAgLy8gb3J0aG9nb25hbC4gRXhhbXBsZToKKyAgLy8gKiBJbnN0QSB3aXRoIGJpdHBhdHRlcm4gMGIwMDAwPz8/PywKKyAgLy8gKiBJbnN0QiB3aXRoIGJpdHBhdHRlcm4gMGIwMDAwMDA/PyBidXQgdGhlIGFzc29jaWF0ZWQgZGVjb2RlciBtZXRob2QKKyAgLy8gICBEZWNvZGVJbnN0QigpIHJldHVybnMgRmFpbCB3aGVuID8/IGlzIDBiMDAgb3IgMGIxMS4KKyAgLy8KKyAgLy8gVGhlIGRlY29kZXIgdHJpZXMgdG8gZGVjb2RlIGEgYml0cGF0dGVybiB0aGF0IG1hdGNoZXMgYm90aCBJbnN0QSBhbmQKKyAgLy8gSW5zdEIgYml0cGF0dGVybnMgZmlyc3QgYXMgSW5zdEIgKGJlY2F1c2UgaXQgaXMgdGhlIG1vc3Qgc3BlY2lmaWMKKyAgLy8gZW5jb2RpbmcpLiBJbiB0aGUgZGVmYXVsdCBjYXNlIChoYXNDb21wbGV0ZURlY29kZXIgPSAxKSwgd2hlbgorICAvLyBEZWNvZGVJbnN0QigpIHJldHVybnMgRmFpbCB0aGUgYml0cGF0dGVybiBnZXRzIHJlamVjdGVkLiBCeSBzZXR0aW5nCisgIC8vIGhhc0NvbXBsZXRlRGVjb2RlciA9IDAgaW4gSW5zdEIsIHRoZSBkZWNvZGVyIGlzIGluZm9ybWVkIHRoYXQKKyAgLy8gRGVjb2RlSW5zdEIoKSBpcyBub3QgYWJsZSB0byBkZXRlcm1pbmUgaWYgYWxsIHBvc3NpYmxlIHZhbHVlcyBvZiA/PyBhcmUKKyAgLy8gdmFsaWQgb3Igbm90LiBJZiBEZWNvZGVJbnN0QigpIHJldHVybnMgRmFpbCB0aGUgZGVjb2RlciB3aWxsIGF0dGVtcHQgdG8KKyAgLy8gZGVjb2RlIHRoZSBiaXRwYXR0ZXJuIGFzIEluc3RBIHRvby4KKyAgYml0IGhhc0NvbXBsZXRlRGVjb2RlciA9IDE7CisKKyAgLy8vIFRhcmdldC1zcGVjaWZpYyBmbGFncy4gVGhpcyBiZWNvbWVzIHRoZSBUU0ZsYWdzIGZpZWxkIGluIFRhcmdldEluc3RyRGVzYy4KKyAgYml0czw2ND4gVFNGbGFncyA9IDA7CisKKyAgLy8vQG5hbWUgQXNzZW1ibGVyIFBhcnNlciBTdXBwb3J0CisgIC8vL0B7CisKKyAgc3RyaW5nIEFzbU1hdGNoQ29udmVydGVyID0gIiI7CisKKyAgLy8vIFR3b09wZXJhbmRBbGlhc0NvbnN0cmFpbnQgLSBFbmFibGUgVGFibGVHZW4gdG8gYXV0by1nZW5lcmF0ZSBhCisgIC8vLyB0d28tb3BlcmFuZCBtYXRjaGVyIGluc3QtYWxpYXMgZm9yIGEgdGhyZWUgb3BlcmFuZCBpbnN0cnVjdGlvbi4KKyAgLy8vIEZvciBleGFtcGxlLCB0aGUgYXJtIGluc3RydWN0aW9uICJhZGQgcjMsIHIzLCByNSIgY2FuIGJlIHdyaXR0ZW4KKyAgLy8vIGFzICJhZGQgcjMsIHI1Ii4gVGhlIGNvbnN0cmFpbnQgaXMgb2YgdGhlIHNhbWUgZm9ybSBhcyBhIHRpZWQtb3BlcmFuZAorICAvLy8gY29uc3RyYWludC4gRm9yIGV4YW1wbGUsICIkUm4gPSAkUmQiLgorICBzdHJpbmcgVHdvT3BlcmFuZEFsaWFzQ29uc3RyYWludCA9ICIiOworCisgIC8vLyBBc3NlbWJsZXIgdmFyaWFudCBuYW1lIHRvIHVzZSBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gSWYgc3BlY2lmaWVkIHRoZW4KKyAgLy8vIGluc3RydWN0aW9uIHdpbGwgYmUgcHJlc2VudGVkIG9ubHkgaW4gTWF0Y2hUYWJsZSBmb3IgdGhpcyB2YXJpYW50LiBJZgorICAvLy8gbm90IHNwZWNpZmllZCB0aGVuIGFzc2VtYmxlciB2YXJpYW50cyB3aWxsIGJlIGRldGVybWluZWQgYmFzZWQgb24KKyAgLy8vIEFzbVN0cmluZworICBzdHJpbmcgQXNtVmFyaWFudE5hbWUgPSAiIjsKKworICAvLy9AfQorCisgIC8vLyBVc2VOYW1lZE9wZXJhbmRUYWJsZSAtIElmIHNldCwgdGhlIG9wZXJhbmQgaW5kaWNlcyBvZiB0aGlzIGluc3RydWN0aW9uCisgIC8vLyBjYW4gYmUgcXVlcmllZCB2aWEgdGhlIGdldE5hbWVkT3BlcmFuZElkeCgpIGZ1bmN0aW9uIHdoaWNoIGlzIGdlbmVyYXRlZAorICAvLy8gYnkgVGFibGVHZW4uCisgIGJpdCBVc2VOYW1lZE9wZXJhbmRUYWJsZSA9IDA7Cit9CisKKy8vLyBQc2V1ZG9JbnN0RXhwYW5zaW9uIC0gRXhwYW5zaW9uIGluZm9ybWF0aW9uIGZvciBhIHBzZXVkby1pbnN0cnVjdGlvbi4KKy8vLyBXaGljaCBpbnN0cnVjdGlvbiBpdCBleHBhbmRzIHRvIGFuZCBob3cgdGhlIG9wZXJhbmRzIG1hcCBmcm9tIHRoZQorLy8vIHBzZXVkby4KK2NsYXNzIFBzZXVkb0luc3RFeHBhbnNpb248ZGFnIFJlc3VsdD4geworICBkYWcgUmVzdWx0SW5zdCA9IFJlc3VsdDsgICAgIC8vIFRoZSBpbnN0cnVjdGlvbiB0byBnZW5lcmF0ZS4KKyAgYml0IGlzUHNldWRvID0gMTsKK30KKworLy8vIFByZWRpY2F0ZXMgLSBUaGVzZSBhcmUgZXh0cmEgY29uZGl0aW9uYWxzIHdoaWNoIGFyZSB0dXJuZWQgaW50byBpbnN0cnVjdGlvbgorLy8vIHNlbGVjdG9yIG1hdGNoaW5nIGNvZGUuIEN1cnJlbnRseSBlYWNoIHByZWRpY2F0ZSBpcyBqdXN0IGEgc3RyaW5nLgorY2xhc3MgUHJlZGljYXRlPHN0cmluZyBjb25kPiB7CisgIHN0cmluZyBDb25kU3RyaW5nID0gY29uZDsKKworICAvLy8gQXNzZW1ibGVyTWF0Y2hlclByZWRpY2F0ZSAtIElmIHRoaXMgZmVhdHVyZSBjYW4gYmUgdXNlZCBieSB0aGUgYXNzZW1ibGVyCisgIC8vLyBtYXRjaGVyLCB0aGlzIGlzIHRydWUuICBUYXJnZXRzIHNob3VsZCBzZXQgdGhpcyBieSBpbmhlcml0aW5nIHRoZWlyCisgIC8vLyBmZWF0dXJlIGZyb20gdGhlIEFzc2VtYmxlclByZWRpY2F0ZSBjbGFzcyBpbiBhZGRpdGlvbiB0byBQcmVkaWNhdGUuCisgIGJpdCBBc3NlbWJsZXJNYXRjaGVyUHJlZGljYXRlID0gMDsKKworICAvLy8gQXNzZW1ibGVyQ29uZFN0cmluZyAtIE5hbWUgb2YgdGhlIHN1YnRhcmdldCBmZWF0dXJlIGJlaW5nIHRlc3RlZCB1c2VkCisgIC8vLyBhcyBhbHRlcm5hdGl2ZSBjb25kaXRpb24gc3RyaW5nIHVzZWQgZm9yIGFzc2VtYmxlciBtYXRjaGVyLgorICAvLy8gZS5nLiAiTW9kZVRodW1iIiBpcyB0cmFuc2xhdGVkIHRvICIoQml0cyAmIE1vZGVUaHVtYikgIT0gMCIuCisgIC8vLyAgICAgICIhTW9kZVRodW1iIiBpcyB0cmFuc2xhdGVkIHRvICIoQml0cyAmIE1vZGVUaHVtYikgPT0gMCIuCisgIC8vLyBJdCBjYW4gYWxzbyBsaXN0IG11bHRpcGxlIGZlYXR1cmVzIHNlcGFyYXRlZCBieSAiLCIuCisgIC8vLyBlLmcuICJNb2RlVGh1bWIsRmVhdHVyZVRodW1iMiIgaXMgdHJhbnNsYXRlZCB0bworICAvLy8gICAgICAiKEJpdHMgJiBNb2RlVGh1bWIpICE9IDAgJiYgKEJpdHMgJiBGZWF0dXJlVGh1bWIyKSAhPSAwIi4KKyAgc3RyaW5nIEFzc2VtYmxlckNvbmRTdHJpbmcgPSAiIjsKKworICAvLy8gUHJlZGljYXRlTmFtZSAtIFVzZXItbGV2ZWwgbmFtZSB0byB1c2UgZm9yIHRoZSBwcmVkaWNhdGUuIE1haW5seSBmb3IgdXNlCisgIC8vLyBpbiBkaWFnbm9zdGljcyBzdWNoIGFzIG1pc3NpbmcgZmVhdHVyZSBlcnJvcnMgaW4gdGhlIGFzbSBtYXRjaGVyLgorICBzdHJpbmcgUHJlZGljYXRlTmFtZSA9ICIiOworCisgIC8vLyBTZXR0aW5nIHRoaXMgdG8gJzEnIGluZGljYXRlcyB0aGF0IHRoZSBwcmVkaWNhdGUgbXVzdCBiZSByZWNvbXB1dGVkIG9uCisgIC8vLyBldmVyeSBmdW5jdGlvbiBjaGFuZ2UuIE1vc3QgcHJlZGljYXRlcyBjYW4gbGVhdmUgdGhpcyBhdCAnMCcuCisgIC8vLworICAvLy8gSWdub3JlZCBieSBTZWxlY3Rpb25EQUcsIGl0IGFsd2F5cyByZWNvbXB1dGVzIHRoZSBwcmVkaWNhdGUgb24gZXZlcnkgdXNlLgorICBiaXQgUmVjb21wdXRlUGVyRnVuY3Rpb24gPSAwOworfQorCisvLy8gTm9Ib25vclNpZ25EZXBlbmRlbnRSb3VuZGluZyAtIFRoaXMgcHJlZGljYXRlIGlzIHRydWUgaWYgc3VwcG9ydCBmb3IKKy8vLyBzaWduLWRlcGVuZGVudC1yb3VuZGluZyBpcyBub3QgZW5hYmxlZC4KK2RlZiBOb0hvbm9yU2lnbkRlcGVuZGVudFJvdW5kaW5nCisgOiBQcmVkaWNhdGU8IiFUTS5PcHRpb25zLkhvbm9yU2lnbkRlcGVuZGVudFJvdW5kaW5nRlBNYXRoKCkiPjsKKworY2xhc3MgUmVxdWlyZXM8bGlzdDxQcmVkaWNhdGU+IHByZWRzPiB7CisgIGxpc3Q8UHJlZGljYXRlPiBQcmVkaWNhdGVzID0gcHJlZHM7Cit9CisKKy8vLyBvcHMgZGVmaW5pdGlvbiAtIFRoaXMgaXMganVzdCBhIHNpbXBsZSBtYXJrZXIgdXNlZCB0byBpZGVudGlmeSB0aGUgb3BlcmFuZAorLy8vIGxpc3QgZm9yIGFuIGluc3RydWN0aW9uLiBvdXRzIGFuZCBpbnMgYXJlIGlkZW50aWNhbCBib3RoIHN5bnRhY3RpY2FsbHkgYW5kCisvLy8gc2VtYW50aWNhbGx5OyB0aGV5IGFyZSB1c2VkIHRvIGRlZmluZSBkZWYgb3BlcmFuZHMgYW5kIHVzZSBvcGVyYW5kcyB0bworLy8vIGltcHJvdmUgcmVhZGliaWxpdHkuIFRoaXMgc2hvdWxkIGJlIHVzZWQgbGlrZSB0aGlzOgorLy8vICAgICAob3V0cyBSMzI6JGRzdCksIChpbnMgUjMyOiRzcmMxLCBSMzI6JHNyYzIpIG9yIHNvbWV0aGluZyBzaW1pbGFyLgorZGVmIG9wczsKK2RlZiBvdXRzOworZGVmIGluczsKKworLy8vIHZhcmlhYmxlX29wcyBkZWZpbml0aW9uIC0gTWFyayB0aGlzIGluc3RydWN0aW9uIGFzIHRha2luZyBhIHZhcmlhYmxlIG51bWJlcgorLy8vIG9mIG9wZXJhbmRzLgorZGVmIHZhcmlhYmxlX29wczsKKworCisvLy8gUG9pbnRlckxpa2VSZWdDbGFzcyAtIFZhbHVlcyB0aGF0IGFyZSBkZXNpZ25lZCB0byBoYXZlIHBvaW50ZXIgd2lkdGggYXJlCisvLy8gZGVyaXZlZCBmcm9tIHRoaXMuICBUYWJsZUdlbiB0cmVhdHMgdGhlIHJlZ2lzdGVyIGNsYXNzIGFzIGhhdmluZyBhIHN5bWJvbGljCisvLy8gdHlwZSB0aGF0IGl0IGRvZXNuJ3Qga25vdywgYW5kIHJlc29sdmVzIHRoZSBhY3R1YWwgcmVnY2xhc3MgdG8gdXNlIGJ5IHVzaW5nCisvLy8gdGhlIFRhcmdldFJlZ2lzdGVySW5mbzo6Z2V0UG9pbnRlclJlZ0NsYXNzKCkgaG9vayBhdCBjb2RlZ2VuIHRpbWUuCitjbGFzcyBQb2ludGVyTGlrZVJlZ0NsYXNzPGludCBLaW5kPiB7CisgIGludCBSZWdDbGFzc0tpbmQgPSBLaW5kOworfQorCisKKy8vLyBwdHJfcmMgZGVmaW5pdGlvbiAtIE1hcmsgdGhpcyBvcGVyYW5kIGFzIGJlaW5nIGEgcG9pbnRlciB2YWx1ZSB3aG9zZQorLy8vIHJlZ2lzdGVyIGNsYXNzIGlzIHJlc29sdmVkIGR5bmFtaWNhbGx5IHZpYSBhIGNhbGxiYWNrIHRvIFRhcmdldEluc3RySW5mby4KKy8vLyBGSVhNRTogV2Ugc2hvdWxkIHByb2JhYmx5IGNoYW5nZSB0aGlzIHRvIGEgY2xhc3Mgd2hpY2ggY29udGFpbiBhIGxpc3Qgb2YKKy8vLyBmbGFncy4gQnV0IGN1cnJlbnRseSB3ZSBoYXZlIGJ1dCBvbmUgZmxhZy4KK2RlZiBwdHJfcmMgOiBQb2ludGVyTGlrZVJlZ0NsYXNzPDA+OworCisvLy8gdW5rbm93biBkZWZpbml0aW9uIC0gTWFyayB0aGlzIG9wZXJhbmQgYXMgYmVpbmcgb2YgdW5rbm93biB0eXBlLCBjYXVzaW5nCisvLy8gaXQgdG8gYmUgcmVzb2x2ZWQgYnkgaW5mZXJlbmNlIGluIHRoZSBjb250ZXh0IGl0IGlzIHVzZWQuCitjbGFzcyB1bmtub3duX2NsYXNzOworZGVmIHVua25vd24gOiB1bmtub3duX2NsYXNzOworCisvLy8gQXNtT3BlcmFuZENsYXNzIC0gUmVwcmVzZW50YXRpb24gZm9yIHRoZSBraW5kcyBvZiBvcGVyYW5kcyB3aGljaCB0aGUgdGFyZ2V0CisvLy8gc3BlY2lmaWMgcGFyc2VyIGNhbiBjcmVhdGUgYW5kIHRoZSBhc3NlbWJseSBtYXRjaGVyIG1heSBuZWVkIHRvIGRpc3Rpbmd1aXNoLgorLy8vCisvLy8gT3BlcmFuZCBjbGFzc2VzIGFyZSB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgaW4gd2hpY2ggaW5zdHJ1Y3Rpb25zIGFyZQorLy8vIG1hdGNoZWQsIHRvIGVuc3VyZSB0aGF0IHRoZSBpbnN0cnVjdGlvbiB3aGljaCBnZXRzIG1hdGNoZWQgZm9yIGFueQorLy8vIHBhcnRpY3VsYXIgbGlzdCBvZiBvcGVyYW5kcyBpcyBkZXRlcm1pbmlzdGljLgorLy8vCisvLy8gVGhlIHRhcmdldCBzcGVjaWZpYyBwYXJzZXIgbXVzdCBiZSBhYmxlIHRvIGNsYXNzaWZ5IGEgcGFyc2VkIG9wZXJhbmQgaW50byBhCisvLy8gdW5pcXVlIGNsYXNzIHdoaWNoIGRvZXMgbm90IHBhcnRpYWxseSBvdmVybGFwIHdpdGggYW55IG90aGVyIGNsYXNzZXMuIEl0IGNhbgorLy8vIG1hdGNoIGEgc3Vic2V0IG9mIHNvbWUgb3RoZXIgY2xhc3MsIGluIHdoaWNoIGNhc2UgdGhlIHN1cGVyIGNsYXNzIGZpZWxkCisvLy8gc2hvdWxkIGJlIGRlZmluZWQuCitjbGFzcyBBc21PcGVyYW5kQ2xhc3MgeworICAvLy8gVGhlIG5hbWUgdG8gdXNlIGZvciB0aGlzIGNsYXNzLCB3aGljaCBzaG91bGQgYmUgdXNhYmxlIGFzIGFuIGVudW0gdmFsdWUuCisgIHN0cmluZyBOYW1lID0gPzsKKworICAvLy8gVGhlIHN1cGVyIGNsYXNzZXMgb2YgdGhpcyBvcGVyYW5kLgorICBsaXN0PEFzbU9wZXJhbmRDbGFzcz4gU3VwZXJDbGFzc2VzID0gW107CisKKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgb24gdGhlIHRhcmdldCBzcGVjaWZpYyBvcGVyYW5kIHRvIGNhbGwgdG8gdGVzdAorICAvLy8gd2hldGhlciB0aGUgb3BlcmFuZCBpcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLiBJZiBub3Qgc2V0LCB0aGlzIHdpbGwKKyAgLy8vIGRlZmF1bHQgdG8gImlzRm9vIiwgd2hlcmUgRm9vIGlzIHRoZSBBc21PcGVyYW5kQ2xhc3MgbmFtZS4gVGhlIG1ldGhvZAorICAvLy8gc2lnbmF0dXJlIHNob3VsZCBiZToKKyAgLy8vICAgYm9vbCBpc0ZvbygpIGNvbnN0OworICBzdHJpbmcgUHJlZGljYXRlTWV0aG9kID0gPzsKKworICAvLy8gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHNwZWNpZmljIG9wZXJhbmQgdG8gY2FsbCB0byBhZGQgdGhlCisgIC8vLyB0YXJnZXQgc3BlY2lmaWMgb3BlcmFuZCB0byBhbiBNQ0luc3QuIElmIG5vdCBzZXQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvCisgIC8vLyAiYWRkRm9vT3BlcmFuZHMiLCB3aGVyZSBGb28gaXMgdGhlIEFzbU9wZXJhbmRDbGFzcyBuYW1lLiBUaGUgbWV0aG9kCisgIC8vLyBzaWduYXR1cmUgc2hvdWxkIGJlOgorICAvLy8gICB2b2lkIGFkZEZvb09wZXJhbmRzKE1DSW5zdCAmSW5zdCwgdW5zaWduZWQgTikgY29uc3Q7CisgIHN0cmluZyBSZW5kZXJNZXRob2QgPSA/OworCisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIG9uIHRoZSB0YXJnZXQgc3BlY2lmaWMgb3BlcmFuZCB0byBjYWxsIHRvIGN1c3RvbQorICAvLy8gaGFuZGxlIHRoZSBvcGVyYW5kIHBhcnNpbmcuIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIG9wZXJhbmRzIGRvIG5vdCByZWxhdGUKKyAgLy8vIHRvIGltbWVkaWF0ZXMgb3IgcmVnaXN0ZXJzIGFuZCBhcmUgdmVyeSBpbnN0cnVjdGlvbiBzcGVjaWZpYyAoYXMgZmxhZ3MgdG8KKyAgLy8vIHNldCBpbiBhIHByb2Nlc3NvciByZWdpc3RlciwgY29wcm9jZXNzb3IgbnVtYmVyLCAuLi4pLgorICBzdHJpbmcgUGFyc2VyTWV0aG9kID0gPzsKKworICAvLyBUaGUgZGlhZ25vc3RpYyB0eXBlIHRvIHByZXNlbnQgd2hlbiByZWZlcmVuY2luZyB0aGlzIG9wZXJhbmQgaW4gYQorICAvLyBtYXRjaCBmYWlsdXJlIGVycm9yIG1lc3NhZ2UuIEJ5IGRlZmF1bHQsIHVzZSBhIGdlbmVyaWMgImludmFsaWQgb3BlcmFuZCIKKyAgLy8gZGlhZ25vc3RpYy4gVGhlIHRhcmdldCBBc21QYXJzZXIgbWFwcyB0aGVzZSBjb2RlcyB0byB0ZXh0LgorICBzdHJpbmcgRGlhZ25vc3RpY1R5cGUgPSAiIjsKKworICAvLy8gQSBkaWFnbm9zdGljIG1lc3NhZ2UgdG8gZW1pdCB3aGVuIGFuIGludmFsaWQgdmFsdWUgaXMgcHJvdmlkZWQgZm9yIHRoaXMKKyAgLy8vIG9wZXJhbmQuCisgIHN0cmluZyBEaWFnbm9zdGljU3RyaW5nID0gIiI7CisKKyAgLy8vIFNldCB0byAxIGlmIHRoaXMgb3BlcmFuZCBpcyBvcHRpb25hbCBhbmQgbm90IGFsd2F5cyByZXF1aXJlZC4gVHlwaWNhbGx5LAorICAvLy8gdGhlIEFzbVBhcnNlciB3aWxsIGVtaXQgYW4gZXJyb3Igd2hlbiBpdCBmaW5pc2hlcyBwYXJzaW5nIGFuCisgIC8vLyBpbnN0cnVjdGlvbiBpZiBpdCBoYXNuJ3QgbWF0Y2hlZCBhbGwgdGhlIG9wZXJhbmRzIHlldC4gIEhvd2V2ZXIsIHRoaXMKKyAgLy8vIGVycm9yIHdpbGwgYmUgc3VwcHJlc3NlZCBpZiBhbGwgb2YgdGhlIHJlbWFpbmluZyB1bm1hdGNoZWQgb3BlcmFuZHMgYXJlCisgIC8vLyBtYXJrZWQgYXMgSXNPcHRpb25hbC4KKyAgLy8vCisgIC8vLyBPcHRpb25hbCBhcmd1bWVudHMgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBvcGVyYW5kIGxpc3QuCisgIGJpdCBJc09wdGlvbmFsID0gMDsKKworICAvLy8gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHNwZWNpZmljIGFzbSBwYXJzZXIgdGhhdCByZXR1cm5zIHRoZQorICAvLy8gZGVmYXVsdCBvcGVyYW5kIGZvciB0aGlzIG9wdGlvbmFsIG9wZXJhbmQuIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCBpZgorICAvLy8gSXNPcHRpb25hbCA9PSAxLiBJZiBub3Qgc2V0LCB0aGlzIHdpbGwgZGVmYXVsdCB0byAiZGVmYXVsdEZvb09wZXJhbmRzIiwKKyAgLy8vIHdoZXJlIEZvbyBpcyB0aGUgQXNtT3BlcmFuZENsYXNzIG5hbWUuIFRoZSBtZXRob2Qgc2lnbmF0dXJlIHNob3VsZCBiZToKKyAgLy8vICAgc3RkOjp1bmlxdWVfcHRyPE1DUGFyc2VkQXNtT3BlcmFuZD4gZGVmYXVsdEZvb09wZXJhbmRzKCkgY29uc3Q7CisgIHN0cmluZyBEZWZhdWx0TWV0aG9kID0gPzsKK30KKworZGVmIEltbUFzbU9wZXJhbmQgOiBBc21PcGVyYW5kQ2xhc3MgeworICBsZXQgTmFtZSA9ICJJbW0iOworfQorCisvLy8gT3BlcmFuZCBUeXBlcyAtIFRoZXNlIHByb3ZpZGUgdGhlIGJ1aWx0LWluIG9wZXJhbmQgdHlwZXMgdGhhdCBtYXkgYmUgdXNlZAorLy8vIGJ5IGEgdGFyZ2V0LiAgVGFyZ2V0cyBjYW4gb3B0aW9uYWxseSBwcm92aWRlIHRoZWlyIG93biBvcGVyYW5kIHR5cGVzIGFzCisvLy8gbmVlZGVkLCB0aG91Z2ggdGhpcyBzaG91bGQgbm90IGJlIG5lZWRlZCBmb3IgUklTQyB0YXJnZXRzLgorY2xhc3MgT3BlcmFuZDxWYWx1ZVR5cGUgdHk+IDogREFHT3BlcmFuZCB7CisgIFZhbHVlVHlwZSBUeXBlID0gdHk7CisgIHN0cmluZyBQcmludE1ldGhvZCA9ICJwcmludE9wZXJhbmQiOworICBzdHJpbmcgRW5jb2Rlck1ldGhvZCA9ICIiOworICBiaXQgaGFzQ29tcGxldGVEZWNvZGVyID0gMTsKKyAgc3RyaW5nIE9wZXJhbmRUeXBlID0gIk9QRVJBTkRfVU5LTk9XTiI7CisgIGRhZyBNSU9wZXJhbmRJbmZvID0gKG9wcyk7CisKKyAgLy8gTUNPcGVyYW5kUHJlZGljYXRlIC0gT3B0aW9uYWxseSwgYSBjb2RlIGZyYWdtZW50IG9wZXJhdGluZyBvbgorICAvLyBjb25zdCBNQ09wZXJhbmQgJk1DT3AsIGFuZCByZXR1cm5pbmcgYSBib29sLCB0byBpbmRpY2F0ZSBpZgorICAvLyB0aGUgdmFsdWUgb2YgTUNPcCBpcyB2YWxpZCBmb3IgdGhlIHNwZWNpZmljIHN1YmNsYXNzIG9mIE9wZXJhbmQKKyAgY29kZSBNQ09wZXJhbmRQcmVkaWNhdGU7CisKKyAgLy8gUGFyc2VyTWF0Y2hDbGFzcyAtIFRoZSAibWF0Y2ggY2xhc3MiIHRoYXQgb3BlcmFuZHMgb2YgdGhpcyB0eXBlIGZpdAorICAvLyBpbi4gTWF0Y2ggY2xhc3NlcyBhcmUgdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIGluIHdoaWNoIGluc3RydWN0aW9ucyBhcmUKKyAgLy8gbWF0Y2gsIHRvIGVuc3VyZSB0aGF0IHdoaWNoIGluc3RydWN0aW9ucyBnZXRzIG1hdGNoZWQgaXMgZGV0ZXJtaW5pc3RpYy4KKyAgLy8KKyAgLy8gVGhlIHRhcmdldCBzcGVjaWZpYyBwYXJzZXIgbXVzdCBiZSBhYmxlIHRvIGNsYXNzaWZ5IGFuIHBhcnNlZCBvcGVyYW5kIGludG8KKyAgLy8gYSB1bmlxdWUgY2xhc3MsIHdoaWNoIGRvZXMgbm90IHBhcnRpYWxseSBvdmVybGFwIHdpdGggYW55IG90aGVyIGNsYXNzZXMuIEl0CisgIC8vIGNhbiBtYXRjaCBhIHN1YnNldCBvZiBzb21lIG90aGVyIGNsYXNzLCBpbiB3aGljaCBjYXNlIHRoZSBBc21PcGVyYW5kQ2xhc3MKKyAgLy8gc2hvdWxkIGRlY2xhcmUgdGhlIG90aGVyIG9wZXJhbmQgYXMgb25lIG9mIGl0cyBzdXBlciBjbGFzc2VzLgorICBBc21PcGVyYW5kQ2xhc3MgUGFyc2VyTWF0Y2hDbGFzcyA9IEltbUFzbU9wZXJhbmQ7Cit9CisKK2NsYXNzIFJlZ2lzdGVyT3BlcmFuZDxSZWdpc3RlckNsYXNzIHJlZ2NsYXNzLCBzdHJpbmcgcG0gPSAicHJpbnRPcGVyYW5kIj4KKyAgOiBEQUdPcGVyYW5kIHsKKyAgLy8gUmVnQ2xhc3MgLSBUaGUgcmVnaXN0ZXIgY2xhc3Mgb2YgdGhlIG9wZXJhbmQuCisgIFJlZ2lzdGVyQ2xhc3MgUmVnQ2xhc3MgPSByZWdjbGFzczsKKyAgLy8gUHJpbnRNZXRob2QgLSBUaGUgdGFyZ2V0IG1ldGhvZCB0byBjYWxsIHRvIHByaW50IHJlZ2lzdGVyIG9wZXJhbmRzIG9mCisgIC8vIHRoaXMgdHlwZS4gVGhlIG1ldGhvZCBub3JtYWxseSB3aWxsIGp1c3QgdXNlIGFuIGFsdC1uYW1lIGluZGV4IHRvIGxvb2sKKyAgLy8gdXAgdGhlIG5hbWUgdG8gcHJpbnQuIERlZmF1bHQgdG8gdGhlIGdlbmVyaWMgcHJpbnRPcGVyYW5kKCkuCisgIHN0cmluZyBQcmludE1ldGhvZCA9IHBtOworCisgIC8vIEVuY29kZXJNZXRob2QgLSBUaGUgdGFyZ2V0IG1ldGhvZCBuYW1lIHRvIGNhbGwgdG8gZW5jb2RlIHRoaXMgcmVnaXN0ZXIKKyAgLy8gb3BlcmFuZC4KKyAgc3RyaW5nIEVuY29kZXJNZXRob2QgPSAiIjsKKworICAvLyBQYXJzZXJNYXRjaENsYXNzIC0gVGhlICJtYXRjaCBjbGFzcyIgdGhhdCBvcGVyYW5kcyBvZiB0aGlzIHR5cGUgZml0CisgIC8vIGluLiBNYXRjaCBjbGFzc2VzIGFyZSB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgaW4gd2hpY2ggaW5zdHJ1Y3Rpb25zIGFyZQorICAvLyBtYXRjaCwgdG8gZW5zdXJlIHRoYXQgd2hpY2ggaW5zdHJ1Y3Rpb25zIGdldHMgbWF0Y2hlZCBpcyBkZXRlcm1pbmlzdGljLgorICAvLworICAvLyBUaGUgdGFyZ2V0IHNwZWNpZmljIHBhcnNlciBtdXN0IGJlIGFibGUgdG8gY2xhc3NpZnkgYW4gcGFyc2VkIG9wZXJhbmQgaW50bworICAvLyBhIHVuaXF1ZSBjbGFzcywgd2hpY2ggZG9lcyBub3QgcGFydGlhbGx5IG92ZXJsYXAgd2l0aCBhbnkgb3RoZXIgY2xhc3Nlcy4gSXQKKyAgLy8gY2FuIG1hdGNoIGEgc3Vic2V0IG9mIHNvbWUgb3RoZXIgY2xhc3MsIGluIHdoaWNoIGNhc2UgdGhlIEFzbU9wZXJhbmRDbGFzcworICAvLyBzaG91bGQgZGVjbGFyZSB0aGUgb3RoZXIgb3BlcmFuZCBhcyBvbmUgb2YgaXRzIHN1cGVyIGNsYXNzZXMuCisgIEFzbU9wZXJhbmRDbGFzcyBQYXJzZXJNYXRjaENsYXNzOworCisgIHN0cmluZyBPcGVyYW5kVHlwZSA9ICJPUEVSQU5EX1JFR0lTVEVSIjsKKworICAvLyBXaGVuIHJlZmVyZW5jZWQgaW4gdGhlIHJlc3VsdCBvZiBhIENvZGVHZW4gcGF0dGVybiwgR2xvYmFsSVNlbCB3aWxsCisgIC8vIG5vcm1hbGx5IGNvcHkgdGhlIG1hdGNoZWQgb3BlcmFuZCB0byB0aGUgcmVzdWx0LiBXaGVuIHRoaXMgaXMgc2V0LCBpdCB3aWxsCisgIC8vIGVtaXQgYSBzcGVjaWFsIGNvcHkgdGhhdCB3aWxsIHJlcGxhY2UgemVyby1pbW1lZGlhdGVzIHdpdGggdGhlIHNwZWNpZmllZAorICAvLyB6ZXJvLXJlZ2lzdGVyLgorICBSZWdpc3RlciBHSVplcm9SZWdpc3RlciA9ID87Cit9CisKK2xldCBPcGVyYW5kVHlwZSA9ICJPUEVSQU5EX0lNTUVESUFURSIgaW4geworZGVmIGkxaW1tICA6IE9wZXJhbmQ8aTE+OworZGVmIGk4aW1tICA6IE9wZXJhbmQ8aTg+OworZGVmIGkxNmltbSA6IE9wZXJhbmQ8aTE2PjsKK2RlZiBpMzJpbW0gOiBPcGVyYW5kPGkzMj47CitkZWYgaTY0aW1tIDogT3BlcmFuZDxpNjQ+OworCitkZWYgZjMyaW1tIDogT3BlcmFuZDxmMzI+OworZGVmIGY2NGltbSA6IE9wZXJhbmQ8ZjY0PjsKK30KKworLy8gUmVnaXN0ZXIgb3BlcmFuZHMgZm9yIGdlbmVyaWMgaW5zdHJ1Y3Rpb25zIGRvbid0IGhhdmUgYW4gTVZULCBidXQgZG8gaGF2ZQorLy8gY29uc3RyYWludHMgbGlua2luZyB0aGUgb3BlcmFuZHMgKGUuZy4gYWxsIG9wZXJhbmRzIG9mIGEgR19BREQgbXVzdAorLy8gaGF2ZSB0aGUgc2FtZSBMTFQpLgorY2xhc3MgVHlwZWRPcGVyYW5kPHN0cmluZyBUeT4gOiBPcGVyYW5kPHVudHlwZWQ+IHsKKyAgbGV0IE9wZXJhbmRUeXBlID0gVHk7CisgIGJpdCBJc1BvaW50ZXIgPSAwOworfQorCitkZWYgdHlwZTAgOiBUeXBlZE9wZXJhbmQ8Ik9QRVJBTkRfR0VORVJJQ18wIj47CitkZWYgdHlwZTEgOiBUeXBlZE9wZXJhbmQ8Ik9QRVJBTkRfR0VORVJJQ18xIj47CitkZWYgdHlwZTIgOiBUeXBlZE9wZXJhbmQ8Ik9QRVJBTkRfR0VORVJJQ18yIj47CitkZWYgdHlwZTMgOiBUeXBlZE9wZXJhbmQ8Ik9QRVJBTkRfR0VORVJJQ18zIj47CitkZWYgdHlwZTQgOiBUeXBlZE9wZXJhbmQ8Ik9QRVJBTkRfR0VORVJJQ180Ij47CitkZWYgdHlwZTUgOiBUeXBlZE9wZXJhbmQ8Ik9QRVJBTkRfR0VORVJJQ181Ij47CisKK2xldCBJc1BvaW50ZXIgPSAxIGluIHsKKyAgZGVmIHB0eXBlMCA6IFR5cGVkT3BlcmFuZDwiT1BFUkFORF9HRU5FUklDXzAiPjsKKyAgZGVmIHB0eXBlMSA6IFR5cGVkT3BlcmFuZDwiT1BFUkFORF9HRU5FUklDXzEiPjsKKyAgZGVmIHB0eXBlMiA6IFR5cGVkT3BlcmFuZDwiT1BFUkFORF9HRU5FUklDXzIiPjsKKyAgZGVmIHB0eXBlMyA6IFR5cGVkT3BlcmFuZDwiT1BFUkFORF9HRU5FUklDXzMiPjsKKyAgZGVmIHB0eXBlNCA6IFR5cGVkT3BlcmFuZDwiT1BFUkFORF9HRU5FUklDXzQiPjsKKyAgZGVmIHB0eXBlNSA6IFR5cGVkT3BlcmFuZDwiT1BFUkFORF9HRU5FUklDXzUiPjsKK30KKworLy8vIHplcm9fcmVnIGRlZmluaXRpb24gLSBTcGVjaWFsIG5vZGUgdG8gc3RhbmQgZm9yIHRoZSB6ZXJvIHJlZ2lzdGVyLgorLy8vCitkZWYgemVyb19yZWc7CisKKy8vLyBBbGwgb3BlcmFuZHMgd2hpY2ggdGhlIE1DIGxheWVyIGNsYXNzaWZpZXMgYXMgcHJlZGljYXRlcyBzaG91bGQgaW5oZXJpdCBmcm9tCisvLy8gdGhpcyBjbGFzcyBpbiBzb21lIG1hbm5lci4gVGhpcyBpcyBhbHJlYWR5IGhhbmRsZWQgZm9yIHRoZSBtb3N0IGNvbW1vbmx5CisvLy8gdXNlZCBQcmVkaWNhdGVPcGVyYW5kLCBidXQgbWF5IGJlIHVzZWZ1bCBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgorY2xhc3MgUHJlZGljYXRlT3A7CisKKy8vLyBPcGVyYW5kV2l0aERlZmF1bHRPcHMgLSBUaGlzIE9wZXJhbmQgY2xhc3MgY2FuIGJlIHVzZWQgYXMgdGhlIHBhcmVudCBjbGFzcworLy8vIGZvciBhbiBPcGVyYW5kIHRoYXQgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIGRlZmF1bHQgdmFsdWUgaWYKKy8vLyBubyB2YWx1ZSBpcyBzdXBwbGllZCBpbiBhIHBhdHRlcm4uICBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIHNpbXBsaWZ5IHRoZQorLy8vIHBhdHRlcm4gZGVmaW5pdGlvbnMgZm9yIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgdGFyZ2V0IHNwZWNpZmljIGZsYWdzCisvLy8gZW5jb2RlZCBhcyBpbW1lZGlhdGUgb3BlcmFuZHMuCitjbGFzcyBPcGVyYW5kV2l0aERlZmF1bHRPcHM8VmFsdWVUeXBlIHR5LCBkYWcgZGVmYXVsdG9wcz4KKyAgOiBPcGVyYW5kPHR5PiB7CisgIGRhZyBEZWZhdWx0T3BzID0gZGVmYXVsdG9wczsKK30KKworLy8vIFByZWRpY2F0ZU9wZXJhbmQgLSBUaGlzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhIHByZWRpY2F0ZSBvcGVyYW5kIGZvciBhbgorLy8vIGluc3RydWN0aW9uLiAgT3BUeXBlcyBzcGVjaWZpZXMgdGhlIE1JT3BlcmFuZEluZm8gZm9yIHRoZSBvcGVyYW5kLCBhbmQKKy8vLyBBbHdheXNWYWwgc3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiB0aGlzIHByZWRpY2F0ZSB3aGVuIHNldCB0byAiYWx3YXlzCisvLy8gZXhlY3V0ZSIuCitjbGFzcyBQcmVkaWNhdGVPcGVyYW5kPFZhbHVlVHlwZSB0eSwgZGFnIE9wVHlwZXMsIGRhZyBBbHdheXNWYWw+CisgIDogT3BlcmFuZFdpdGhEZWZhdWx0T3BzPHR5LCBBbHdheXNWYWw+LCBQcmVkaWNhdGVPcCB7CisgIGxldCBNSU9wZXJhbmRJbmZvID0gT3BUeXBlczsKK30KKworLy8vIE9wdGlvbmFsRGVmT3BlcmFuZCAtIFRoaXMgaXMgdXNlZCB0byBkZWZpbmUgYSBvcHRpb25hbCBkZWZpbml0aW9uIG9wZXJhbmQKKy8vLyBmb3IgYW4gaW5zdHJ1Y3Rpb24uIERlZmF1bHRPcHMgaXMgdGhlIHJlZ2lzdGVyIHRoZSBvcGVyYW5kIHJlcHJlc2VudHMgaWYKKy8vLyBub25lIGlzIHN1cHBsaWVkLCBlLmcuIHplcm9fcmVnLgorY2xhc3MgT3B0aW9uYWxEZWZPcGVyYW5kPFZhbHVlVHlwZSB0eSwgZGFnIE9wVHlwZXMsIGRhZyBkZWZhdWx0b3BzPgorICA6IE9wZXJhbmRXaXRoRGVmYXVsdE9wczx0eSwgZGVmYXVsdG9wcz4geworICBsZXQgTUlPcGVyYW5kSW5mbyA9IE9wVHlwZXM7Cit9CisKKworLy8gSW5zdHJJbmZvIC0gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSBpbnN0YW50aWF0ZWQgb25jZSB0byBwcm92aWRlIHBhcmFtZXRlcnMKKy8vIHdoaWNoIGFyZSBnbG9iYWwgdG8gdGhlIHRhcmdldCBtYWNoaW5lLgorLy8KK2NsYXNzIEluc3RySW5mbyB7CisgIC8vIFRhcmdldCBjYW4gc3BlY2lmeSBpdHMgaW5zdHJ1Y3Rpb25zIGluIGVpdGhlciBiaWcgb3IgbGl0dGxlLWVuZGlhbiBmb3JtYXRzLgorICAvLyBGb3IgaW5zdGFuY2UsIHdoaWxlIGJvdGggU3BhcmMgYW5kIFBvd2VyUEMgYXJlIGJpZy1lbmRpYW4gcGxhdGZvcm1zLCB0aGUKKyAgLy8gU3BhcmMgbWFudWFsIHNwZWNpZmllcyBpdHMgaW5zdHJ1Y3Rpb25zIGluIHRoZSBmb3JtYXQgWzMxLi4wXSAoYmlnKSwgd2hpbGUKKyAgLy8gUG93ZXJQQyBzcGVjaWZpZXMgdGhlbSB1c2luZyB0aGUgZm9ybWF0IFswLi4zMV0gKGxpdHRsZSkuCisgIGJpdCBpc0xpdHRsZUVuZGlhbkVuY29kaW5nID0gMDsKKworICAvLyBUaGUgaW5zdHJ1Y3Rpb24gcHJvcGVydGllcyBtYXlMb2FkLCBtYXlTdG9yZSwgYW5kIGhhc1NpZGVFZmZlY3RzIGFyZSB1bnNldAorICAvLyBieSBkZWZhdWx0LCBhbmQgVGFibGVHZW4gd2lsbCBpbmZlciB0aGVpciB2YWx1ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbgorICAvLyBwYXR0ZXJuIHdoZW4gcG9zc2libGUuCisgIC8vCisgIC8vIE5vcm1hbGx5LCBUYWJsZUdlbiB3aWxsIGlzc3VlIGFuIGVycm9yIGl0IGl0IGNhbid0IGluZmVyIHRoZSB2YWx1ZSBvZiBhCisgIC8vIHByb3BlcnR5IHRoYXQgaGFzbid0IGJlZW4gc2V0IGV4cGxpY2l0bHkuIFdoZW4gZ3Vlc3NJbnN0cnVjdGlvblByb3BlcnRpZXMKKyAgLy8gaXMgc2V0LCBpdCB3aWxsIGd1ZXNzIGEgc2FmZSB2YWx1ZSBpbnN0ZWFkLgorICAvLworICAvLyBUaGlzIG9wdGlvbiBpcyBhIHRlbXBvcmFyeSBtaWdyYXRpb24gaGVscC4gSXQgd2lsbCBnbyBhd2F5LgorICBiaXQgZ3Vlc3NJbnN0cnVjdGlvblByb3BlcnRpZXMgPSAxOworCisgIC8vIFRhYmxlR2VuJ3MgaW5zdHJ1Y3Rpb24gZW5jb2RlciBnZW5lcmF0b3IgaGFzIHN1cHBvcnQgZm9yIG1hdGNoaW5nIG9wZXJhbmRzCisgIC8vIHRvIGJpdC1maWVsZCB2YXJpYWJsZXMgYm90aCBieSBuYW1lIGFuZCBieSBwb3NpdGlvbi4gV2hpbGUgbWF0Y2hpbmcgYnkKKyAgLy8gbmFtZSBpcyBwcmVmZXJyZWQsIHRoaXMgaXMgY3VycmVudGx5IG5vdCBwb3NzaWJsZSBmb3IgY29tcGxleCBvcGVyYW5kcywKKyAgLy8gYW5kIHNvbWUgdGFyZ2V0cyBzdGlsbCByZXBseSBvbiB0aGUgcG9zaXRpb25hbCBlbmNvZGluZyBydWxlcy4gV2hlbgorICAvLyBnZW5lcmF0aW5nIGEgZGVjb2RlciBmb3Igc3VjaCB0YXJnZXRzLCB0aGUgcG9zaXRpb25hbCBlbmNvZGluZyBydWxlcyBtdXN0CisgIC8vIGJlIHVzZWQgYnkgdGhlIGRlY29kZXIgZ2VuZXJhdG9yIGFzIHdlbGwuCisgIC8vCisgIC8vIFRoaXMgb3B0aW9uIGlzIHRlbXBvcmFyeTsgaXQgd2lsbCBnbyBhd2F5IG9uY2UgdGhlIFRhYmxlR2VuIGRlY29kZXIKKyAgLy8gZ2VuZXJhdG9yIGhhcyBiZXR0ZXIgc3VwcG9ydCBmb3IgY29tcGxleCBvcGVyYW5kcyBhbmQgdGFyZ2V0cyBoYXZlCisgIC8vIG1pZ3JhdGVkIGF3YXkgZnJvbSB1c2luZyBwb3NpdGlvbmFsbHkgZW5jb2RlZCBvcGVyYW5kcy4KKyAgYml0IGRlY29kZVBvc2l0aW9uYWxseUVuY29kZWRPcGVyYW5kcyA9IDA7CisKKyAgLy8gV2hlbiBzZXQsIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlcmUgd2lsbCBiZSBubyBvdmVybGFwIGJldHdlZW4gdGhvc2UKKyAgLy8gb3BlcmFuZHMgdGhhdCBhcmUgbWF0Y2hlZCBieSBvcmRlcmluZyAocG9zaXRpb25hbCBvcGVyYW5kcykgYW5kIHRob3NlCisgIC8vIG1hdGNoZWQgYnkgbmFtZS4KKyAgLy8KKyAgLy8gVGhpcyBvcHRpb24gaXMgdGVtcG9yYXJ5OyBpdCB3aWxsIGdvIGF3YXkgb25jZSB0aGUgVGFibGVHZW4gZGVjb2RlcgorICAvLyBnZW5lcmF0b3IgaGFzIGJldHRlciBzdXBwb3J0IGZvciBjb21wbGV4IG9wZXJhbmRzIGFuZCB0YXJnZXRzIGhhdmUKKyAgLy8gbWlncmF0ZWQgYXdheSBmcm9tIHVzaW5nIHBvc2l0aW9uYWxseSBlbmNvZGVkIG9wZXJhbmRzLgorICBiaXQgbm9OYW1lZFBvc2l0aW9uYWxseUVuY29kZWRPcGVyYW5kcyA9IDA7Cit9CisKKy8vIFN0YW5kYXJkIFBzZXVkbyBJbnN0cnVjdGlvbnMuCisvLyBUaGlzIGxpc3QgbXVzdCBtYXRjaCBUYXJnZXRPcGNvZGVzLmggYW5kIENvZGVHZW5UYXJnZXQuY3BwLgorLy8gT25seSB0aGVzZSBpbnN0cnVjdGlvbnMgYXJlIGFsbG93ZWQgaW4gdGhlIFRhcmdldE9wY29kZSBuYW1lc3BhY2UuCisvLyBFbnN1cmUgbWF5TG9hZCBhbmQgbWF5U3RvcmUgaGF2ZSBhIGRlZmF1bHQgdmFsdWUsIHNvIGFzIG5vdCB0byBicmVhaworLy8gdGFyZ2V0cyB0aGF0IHNldCBndWVzc0luc3RydWN0aW9uUHJvcGVydGllcz0wLiBBbnkgbG9jYWwgZGVmaW5pdGlvbiBvZgorLy8gbWF5TG9hZC9tYXlTdG9yZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlc2UgZGVmYXVsdCB2YWx1ZXMuCitjbGFzcyBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIDogSW5zdHJ1Y3Rpb24geworICBsZXQgbWF5TG9hZCA9IDA7CisgIGxldCBtYXlTdG9yZSA9IDA7CisgIGxldCBpc0NvZGVHZW5Pbmx5ID0gMTsKKyAgbGV0IGlzUHNldWRvID0gMTsKKyAgbGV0IGhhc05vU2NoZWR1bGluZ0luZm8gPSAxOworICBsZXQgTmFtZXNwYWNlID0gIlRhcmdldE9wY29kZSI7Cit9CitkZWYgUEhJIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHVua25vd246JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB2YXJpYWJsZV9vcHMpOworICBsZXQgQXNtU3RyaW5nID0gIlBISU5PREUiOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorZGVmIElOTElORUFTTSA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB2YXJpYWJsZV9vcHMpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7ICAvLyBOb3RlIHNpZGUgZWZmZWN0IGlzIGVuY29kZWQgaW4gYW4gb3BlcmFuZC4KK30KK2RlZiBDRklfSU5TVFJVQ1RJT04gOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgaTMyaW1tOiRpZCk7CisgIGxldCBBc21TdHJpbmcgPSAiIjsKKyAgbGV0IGhhc0N0cmxEZXAgPSAxOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNOb3REdXBsaWNhYmxlID0gMTsKK30KK2RlZiBFSF9MQUJFTCA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyBpMzJpbW06JGlkKTsKKyAgbGV0IEFzbVN0cmluZyA9ICIiOworICBsZXQgaGFzQ3RybERlcCA9IDE7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc05vdER1cGxpY2FibGUgPSAxOworfQorZGVmIEdDX0xBQkVMIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIGkzMmltbTokaWQpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBoYXNDdHJsRGVwID0gMTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzTm90RHVwbGljYWJsZSA9IDE7Cit9CitkZWYgQU5OT1RBVElPTl9MQUJFTCA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyBpMzJpbW06JGlkKTsKKyAgbGV0IEFzbVN0cmluZyA9ICIiOworICBsZXQgaGFzQ3RybERlcCA9IDE7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc05vdER1cGxpY2FibGUgPSAxOworfQorZGVmIEtJTEwgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdmFyaWFibGVfb3BzKTsKKyAgbGV0IEFzbVN0cmluZyA9ICIiOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorZGVmIEVYVFJBQ1RfU1VCUkVHIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHVua25vd246JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB1bmtub3duOiRzdXBlcnNyYywgaTMyaW1tOiRzdWJpZHgpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CitkZWYgSU5TRVJUX1NVQlJFRyA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB1bmtub3duOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdW5rbm93bjokc3VwZXJzcmMsIHVua25vd246JHN1YnNyYywgaTMyaW1tOiRzdWJpZHgpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBDb25zdHJhaW50cyA9ICIkc3VwZXJzcmMgPSAkZHN0IjsKK30KK2RlZiBJTVBMSUNJVF9ERUYgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdW5rbm93bjokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zKTsKKyAgbGV0IEFzbVN0cmluZyA9ICIiOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNSZU1hdGVyaWFsaXphYmxlID0gMTsKKyAgbGV0IGlzQXNDaGVhcEFzQU1vdmUgPSAxOworfQorZGVmIFNVQlJFR19UT19SRUcgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdW5rbm93bjokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHVua25vd246JGltcGxzcmMsIHVua25vd246JHN1YnNyYywgaTMyaW1tOiRzdWJpZHgpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CitkZWYgQ09QWV9UT19SRUdDTEFTUyA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB1bmtub3duOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdW5rbm93bjokc3JjLCBpMzJpbW06JHJlZ2NsYXNzKTsKKyAgbGV0IEFzbVN0cmluZyA9ICIiOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNBc0NoZWFwQXNBTW92ZSA9IDE7Cit9CitkZWYgREJHX1ZBTFVFIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHZhcmlhYmxlX29wcyk7CisgIGxldCBBc21TdHJpbmcgPSAiREJHX1ZBTFVFIjsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KK2RlZiBSRUdfU0VRVUVOQ0UgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdW5rbm93bjokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHVua25vd246JHN1cGVyc3JjLCB2YXJpYWJsZV9vcHMpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc0FzQ2hlYXBBc0FNb3ZlID0gMTsKK30KK2RlZiBDT1BZIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHVua25vd246JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB1bmtub3duOiRzcmMpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc0FzQ2hlYXBBc0FNb3ZlID0gMTsKKyAgbGV0IGhhc05vU2NoZWR1bGluZ0luZm8gPSAwOworfQorZGVmIEJVTkRMRSA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB2YXJpYWJsZV9vcHMpOworICBsZXQgQXNtU3RyaW5nID0gIkJVTkRMRSI7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDE7Cit9CitkZWYgTElGRVRJTUVfU1RBUlQgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgaTMyaW1tOiRpZCk7CisgIGxldCBBc21TdHJpbmcgPSAiTElGRVRJTUVfU1RBUlQiOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorZGVmIExJRkVUSU1FX0VORCA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyBpMzJpbW06JGlkKTsKKyAgbGV0IEFzbVN0cmluZyA9ICJMSUZFVElNRV9FTkQiOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorZGVmIFNUQUNLTUFQIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIGk2NGltbTokaWQsIGkzMmltbTokbmJ5dGVzLCB2YXJpYWJsZV9vcHMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAxOworICBsZXQgaXNDYWxsID0gMTsKKyAgbGV0IG1heUxvYWQgPSAxOworICBsZXQgdXNlc0N1c3RvbUluc2VydGVyID0gMTsKK30KK2RlZiBQQVRDSFBPSU5UIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHVua25vd246JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyBpNjRpbW06JGlkLCBpMzJpbW06JG5ieXRlcywgdW5rbm93bjokY2FsbGVlLAorICAgICAgICAgICAgICAgICAgICAgICBpMzJpbW06JG5hcmdzLCBpMzJpbW06JGNjLCB2YXJpYWJsZV9vcHMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAxOworICBsZXQgaXNDYWxsID0gMTsKKyAgbGV0IG1heUxvYWQgPSAxOworICBsZXQgdXNlc0N1c3RvbUluc2VydGVyID0gMTsKK30KK2RlZiBTVEFURVBPSU5UIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHZhcmlhYmxlX29wcyk7CisgIGxldCB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxOworICBsZXQgbWF5TG9hZCA9IDE7CisgIGxldCBtYXlTdG9yZSA9IDE7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDE7CisgIGxldCBpc0NhbGwgPSAxOworfQorZGVmIExPQURfU1RBQ0tfR1VBUkQgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgcHRyX3JjOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMpOworICBsZXQgbWF5TG9hZCA9IDE7CisgIGJpdCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBiaXQgaXNQc2V1ZG8gPSAxOworfQorZGVmIExPQ0FMX0VTQ0FQRSA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICAvLyBUaGlzIGluc3RydWN0aW9uIGlzIHJlYWxseSBqdXN0IGEgbGFiZWwuIEl0IGhhcyB0byBiZSBwYXJ0IG9mIHRoZSBjaGFpbiBzbworICAvLyB0aGF0IGl0IGRvZXNuJ3QgZ2V0IGRyb3BwZWQgZnJvbSB0aGUgREFHLCBidXQgaXQgcHJvZHVjZXMgbm90aGluZyBhbmQgaGFzCisgIC8vIG5vIHNpZGUgZWZmZWN0cy4KKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgcHRyX3JjOiRzeW1ib2wsIGkzMmltbTokaWQpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaGFzQ3RybERlcCA9IDE7Cit9CitkZWYgRkFVTFRJTkdfT1AgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdW5rbm93bjokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHZhcmlhYmxlX29wcyk7CisgIGxldCB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAxOworICBsZXQgbWF5TG9hZCA9IDE7CisgIGxldCBtYXlTdG9yZSA9IDE7CisgIGxldCBpc1Rlcm1pbmF0b3IgPSAxOworICBsZXQgaXNCcmFuY2ggPSAxOworfQorZGVmIFBBVENIQUJMRV9PUCA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB1bmtub3duOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdmFyaWFibGVfb3BzKTsKKyAgbGV0IHVzZXNDdXN0b21JbnNlcnRlciA9IDE7CisgIGxldCBtYXlMb2FkID0gMTsKKyAgbGV0IG1heVN0b3JlID0gMTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMTsKK30KK2RlZiBQQVRDSEFCTEVfRlVOQ1RJT05fRU5URVIgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMpOworICBsZXQgQXNtU3RyaW5nID0gIiMgWFJheSBGdW5jdGlvbiBFbnRlci4iOworICBsZXQgdXNlc0N1c3RvbUluc2VydGVyID0gMTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KK2RlZiBQQVRDSEFCTEVfUkVUIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHVua25vd246JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB2YXJpYWJsZV9vcHMpOworICBsZXQgQXNtU3RyaW5nID0gIiMgWFJheSBGdW5jdGlvbiBQYXRjaGFibGUgUkVULiI7CisgIGxldCB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAxOworICBsZXQgaXNUZXJtaW5hdG9yID0gMTsKKyAgbGV0IGlzUmV0dXJuID0gMTsKK30KK2RlZiBQQVRDSEFCTEVfRlVOQ1RJT05fRVhJVCA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyk7CisgIGxldCBBc21TdHJpbmcgPSAiIyBYUmF5IEZ1bmN0aW9uIEV4aXQuIjsKKyAgbGV0IHVzZXNDdXN0b21JbnNlcnRlciA9IDE7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7IC8vIEZJWE1FOiBpcyB0aGlzIGNvcnJlY3Q/CisgIGxldCBpc1JldHVybiA9IDA7IC8vIE9yaWdpbmFsIHJldHVybiBpbnN0cnVjdGlvbiB3aWxsIGZvbGxvdworfQorZGVmIFBBVENIQUJMRV9UQUlMX0NBTEwgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdW5rbm93bjokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHZhcmlhYmxlX29wcyk7CisgIGxldCBBc21TdHJpbmcgPSAiIyBYUmF5IFRhaWwgQ2FsbCBFeGl0LiI7CisgIGxldCB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAxOworICBsZXQgaXNSZXR1cm4gPSAxOworfQorZGVmIFBBVENIQUJMRV9FVkVOVF9DQUxMIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHB0cl9yYzokZXZlbnQsIGk4aW1tOiRzaXplKTsKKyAgbGV0IEFzbVN0cmluZyA9ICIjIFhSYXkgQ3VzdG9tIEV2ZW50IExvZy4iOworICBsZXQgdXNlc0N1c3RvbUluc2VydGVyID0gMTsKKyAgbGV0IGlzQ2FsbCA9IDE7CisgIGxldCBtYXlMb2FkID0gMTsKKyAgbGV0IG1heVN0b3JlID0gMTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMTsKK30KK2RlZiBGRU5UUllfQ0FMTCA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB1bmtub3duOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdmFyaWFibGVfb3BzKTsKKyAgbGV0IEFzbVN0cmluZyA9ICIjIEZFbnRyeSBjYWxsIjsKKyAgbGV0IHVzZXNDdXN0b21JbnNlcnRlciA9IDE7CisgIGxldCBtYXlMb2FkID0gMTsKKyAgbGV0IG1heVN0b3JlID0gMTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMTsKK30KK2RlZiBJQ0FMTF9CUkFOQ0hfRlVOTkVMIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHVua25vd246JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB2YXJpYWJsZV9vcHMpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDE7Cit9CisKKy8vIEdlbmVyaWMgb3Bjb2RlcyB1c2VkIGluIEdsb2JhbElTZWwuCitpbmNsdWRlICJsbHZtL1RhcmdldC9HZW5lcmljT3Bjb2Rlcy50ZCIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFzbVBhcnNlciAtIFRoaXMgY2xhc3MgY2FuIGJlIGltcGxlbWVudGVkIGJ5IHRhcmdldHMgdGhhdCB3aXNoIHRvIGltcGxlbWVudAorLy8gLnMgZmlsZSBwYXJzaW5nLgorLy8KKy8vIFN1YnRhcmdldHMgY2FuIGhhdmUgbXVsdGlwbGUgZGlmZmVyZW50IGFzc2VtYmx5IHBhcnNlcnMgKGUuZy4gQVQmVCB2cyBJbnRlbAorLy8gc3ludGF4IG9uIFg4NiBmb3IgZXhhbXBsZSkuCisvLworY2xhc3MgQXNtUGFyc2VyIHsKKyAgLy8gQXNtUGFyc2VyQ2xhc3NOYW1lIC0gVGhpcyBzcGVjaWZpZXMgdGhlIHN1ZmZpeCB0byB1c2UgZm9yIHRoZSBhc21wYXJzZXIKKyAgLy8gY2xhc3MuICBHZW5lcmF0ZWQgQXNtUGFyc2VyIGNsYXNzZXMgYXJlIGFsd2F5cyBwcmVmaXhlZCB3aXRoIHRoZSB0YXJnZXQKKyAgLy8gbmFtZS4KKyAgc3RyaW5nIEFzbVBhcnNlckNsYXNzTmFtZSAgPSAiQXNtUGFyc2VyIjsKKworICAvLyBBc21QYXJzZXJJbnN0Q2xlYW51cCAtIElmIG5vbi1lbXB0eSwgdGhpcyBpcyB0aGUgbmFtZSBvZiBhIGN1c3RvbSBtZW1iZXIKKyAgLy8gZnVuY3Rpb24gb2YgdGhlIEFzbVBhcnNlciBjbGFzcyB0byBjYWxsIG9uIGV2ZXJ5IG1hdGNoZWQgaW5zdHJ1Y3Rpb24uCisgIC8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSB0YXJnZXQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb24gcG9zdC1wcm9jZXNzaW5nLgorICBzdHJpbmcgQXNtUGFyc2VySW5zdENsZWFudXAgID0gIiI7CisKKyAgLy8gU2hvdWxkRW1pdE1hdGNoUmVnaXN0ZXJOYW1lIC0gU2V0IHRvIGZhbHNlIGlmIHRoZSB0YXJnZXQgbmVlZHMgYSBoYW5kCisgIC8vIHdyaXR0ZW4gcmVnaXN0ZXIgbmFtZSBtYXRjaGVyCisgIGJpdCBTaG91bGRFbWl0TWF0Y2hSZWdpc3Rlck5hbWUgPSAxOworCisgIC8vIFNldCB0byB0cnVlIGlmIHRoZSB0YXJnZXQgbmVlZHMgYSBnZW5lcmF0ZWQgJ2FsdGVybmF0aXZlIHJlZ2lzdGVyIG5hbWUnCisgIC8vIG1hdGNoZXIuCisgIC8vCisgIC8vIFRoaXMgZ2VuZXJhdGVzIGEgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG8gbG9va3VwIHJlZ2lzdGVycyBmcm9tCisgIC8vIHRoZWlyIGFsaWFzZXMuIFRoaXMgZnVuY3Rpb24gd2lsbCBmYWlsIHdoZW4gY2FsbGVkIG9uIHRhcmdldHMgd2hlcmUKKyAgLy8gc2V2ZXJhbCByZWdpc3RlcnMgc2hhcmUgdGhlIHNhbWUgYWxpYXMgKGkuZS4gbm90IGEgMToxIG1hcHBpbmcpLgorICBiaXQgU2hvdWxkRW1pdE1hdGNoUmVnaXN0ZXJBbHROYW1lID0gMDsKKworICAvLyBTZXQgdG8gdHJ1ZSBpZiBNYXRjaFJlZ2lzdGVyTmFtZSBhbmQgTWF0Y2hSZWdpc3RlckFsdE5hbWUgZnVuY3Rpb25zCisgIC8vIHNob3VsZCBiZSBnZW5lcmF0ZWQgZXZlbiBpZiB0aGVyZSBhcmUgZHVwbGljYXRlIHJlZ2lzdGVyIG5hbWVzLiBUaGUKKyAgLy8gdGFyZ2V0IGlzIHJlc3BvbnNpYmxlIGZvciBjb2VyY2luZyBhbGlhc2VkIHJlZ2lzdGVycyBhcyBuZWNlc3NhcnkKKyAgLy8gKGUuZy4gaW4gdmFsaWRhdGVUYXJnZXRPcGVyYW5kQ2xhc3MpLCBhbmQgdGhlcmUgYXJlIG5vIGd1YXJhbnRlZXMgYWJvdXQKKyAgLy8gd2hpY2ggbnVtZXJpYyByZWdpc3RlciBpZGVudGlmaWVyIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIGNhc2Ugb2YKKyAgLy8gbXVsdGlwbGUgbWF0Y2hlcy4KKyAgYml0IEFsbG93RHVwbGljYXRlUmVnaXN0ZXJOYW1lcyA9IDA7CisKKyAgLy8gSGFzTW5lbW9uaWNGaXJzdCAtIFNldCB0byBmYWxzZSBpZiB0YXJnZXQgaW5zdHJ1Y3Rpb25zIGRvbid0IGFsd2F5cworICAvLyBzdGFydCB3aXRoIGEgbW5lbW9uaWMgYXMgdGhlIGZpcnN0IHRva2VuLgorICBiaXQgSGFzTW5lbW9uaWNGaXJzdCA9IDE7CisKKyAgLy8gUmVwb3J0TXVsdGlwbGVOZWFyTWlzc2VzIC0KKyAgLy8gV2hlbiAwLCB0aGUgYXNzZW1ibHkgbWF0Y2hlciByZXBvcnRzIGFuIGVycm9yIGZvciBvbmUgZW5jb2Rpbmcgb3Igb3BlcmFuZAorICAvLyB0aGF0IGRpZCBub3QgbWF0Y2ggdGhlIHBhcnNlZCBpbnN0cnVjdGlvbi4KKyAgLy8gV2hlbiAxLCB0aGUgYXNzbWVibHkgbWF0Y2hlciByZXR1cm5zIGEgbGlzdCBvZiBlbmNvZGluZ3MgdGhhdCB3ZXJlIGNsb3NlCisgIC8vIHRvIG1hdGNoaW5nIHRoZSBwYXJzZWQgaW5zdHJ1Y3Rpb24sIHNvIHRvIGFsbG93IG1vcmUgZGV0YWlsZWQgZXJyb3IKKyAgLy8gbWVzc2FnZXMuCisgIGJpdCBSZXBvcnRNdWx0aXBsZU5lYXJNaXNzZXMgPSAwOworfQorZGVmIERlZmF1bHRBc21QYXJzZXIgOiBBc21QYXJzZXI7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBc21QYXJzZXJWYXJpYW50IC0gU3VidGFyZ2V0cyBjYW4gaGF2ZSBtdWx0aXBsZSBkaWZmZXJlbnQgYXNzZW1ibHkgcGFyc2VycworLy8gKGUuZy4gQVQmVCB2cyBJbnRlbCBzeW50YXggb24gWDg2IGZvciBleGFtcGxlKS4gVGhpcyBjbGFzcyBjYW4gYmUKKy8vIGltcGxlbWVudGVkIGJ5IHRhcmdldHMgdG8gZGVzY3JpYmUgc3VjaCB2YXJpYW50cy4KKy8vCitjbGFzcyBBc21QYXJzZXJWYXJpYW50IHsKKyAgLy8gVmFyaWFudCAtIEFzbVBhcnNlcnMgY2FuIGJlIG9mIG11bHRpcGxlIGRpZmZlcmVudCB2YXJpYW50cy4gIFZhcmlhbnRzIGFyZQorICAvLyB1c2VkIHRvIHN1cHBvcnQgdGFyZ2V0cyB0aGF0IG5lZWQgdG8gcGFyc2VyIG11bHRpcGxlIGZvcm1hdHMgZm9yIHRoZQorICAvLyBhc3NlbWJseSBsYW5ndWFnZS4KKyAgaW50IFZhcmlhbnQgPSAwOworCisgIC8vIE5hbWUgLSBUaGUgQXNtUGFyc2VyIHZhcmlhbnQgbmFtZSAoZS5nLiwgQVQmVCB2cyBJbnRlbCkuCisgIHN0cmluZyBOYW1lID0gIiI7CisKKyAgLy8gQ29tbWVudERlbGltaXRlciAtIElmIGdpdmVuLCB0aGUgZGVsaW1pdGVyIHN0cmluZyB1c2VkIHRvIHJlY29nbml6ZQorICAvLyBjb21tZW50cyB3aGljaCBhcmUgaGFyZCBjb2RlZCBpbiB0aGUgLnRkIGFzc2VtYmxlciBzdHJpbmdzIGZvciBpbmRpdmlkdWFsCisgIC8vIGluc3RydWN0aW9ucy4KKyAgc3RyaW5nIENvbW1lbnREZWxpbWl0ZXIgPSAiIjsKKworICAvLyBSZWdpc3RlclByZWZpeCAtIElmIGdpdmVuLCB0aGUgdG9rZW4gcHJlZml4IHdoaWNoIGluZGljYXRlcyBhIHJlZ2lzdGVyCisgIC8vIHRva2VuLiBUaGlzIGlzIHVzZWQgYnkgdGhlIG1hdGNoZXIgdG8gYXV0b21hdGljYWxseSByZWNvZ25pemUgaGFyZCBjb2RlZAorICAvLyByZWdpc3RlciB0b2tlbnMgYXMgY29uc3RyYWluZWQgcmVnaXN0ZXJzLCBpbnN0ZWFkIG9mIHRva2VucywgZm9yIHRoZQorICAvLyBwdXJwb3NlcyBvZiBtYXRjaGluZy4KKyAgc3RyaW5nIFJlZ2lzdGVyUHJlZml4ID0gIiI7CisKKyAgLy8gVG9rZW5pemluZ0NoYXJhY3RlcnMgLSBDaGFyYWN0ZXJzIHRoYXQgYXJlIHN0YW5kYWxvbmUgdG9rZW5zCisgIHN0cmluZyBUb2tlbml6aW5nQ2hhcmFjdGVycyA9ICJbXSohIjsKKworICAvLyBTZXBhcmF0b3JDaGFyYWN0ZXJzIC0gQ2hhcmFjdGVycyB0aGF0IGFyZSBub3QgdG9rZW5zCisgIHN0cmluZyBTZXBhcmF0b3JDaGFyYWN0ZXJzID0gIiBcdCwiOworCisgIC8vIEJyZWFrQ2hhcmFjdGVycyAtIENoYXJhY3RlcnMgdGhhdCBzdGFydCBuZXcgaWRlbnRpZmllcnMKKyAgc3RyaW5nIEJyZWFrQ2hhcmFjdGVycyA9ICIiOworfQorZGVmIERlZmF1bHRBc21QYXJzZXJWYXJpYW50IDogQXNtUGFyc2VyVmFyaWFudDsKKworLy8vIEFzc2VtYmxlclByZWRpY2F0ZSAtIFRoaXMgaXMgYSBQcmVkaWNhdGUgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHRoZSBhc3NlbWJsZXIKKy8vLyBtYXRjaGVzIGluc3RydWN0aW9ucyBhbmQgYWxpYXNlcy4KK2NsYXNzIEFzc2VtYmxlclByZWRpY2F0ZTxzdHJpbmcgY29uZCwgc3RyaW5nIG5hbWUgPSAiIj4geworICBiaXQgQXNzZW1ibGVyTWF0Y2hlclByZWRpY2F0ZSA9IDE7CisgIHN0cmluZyBBc3NlbWJsZXJDb25kU3RyaW5nID0gY29uZDsKKyAgc3RyaW5nIFByZWRpY2F0ZU5hbWUgPSBuYW1lOworfQorCisvLy8gVG9rZW5BbGlhcyAtIFRoaXMgY2xhc3MgYWxsb3dzIHRhcmdldHMgdG8gZGVmaW5lIGFzc2VtYmxlciB0b2tlbgorLy8vIG9wZXJhbmQgYWxpYXNlcy4gVGhhdCBpcywgYSB0b2tlbiBsaXRlcmFsIG9wZXJhbmQgd2hpY2ggaXMgZXF1aXZhbGVudAorLy8vIHRvIGFub3RoZXIsIGNhbm9uaWNhbCwgdG9rZW4gbGl0ZXJhbC4gRm9yIGV4YW1wbGUsIEFSTSBhbGxvd3M6CisvLy8gICB2bW92LnUzMiBzNCwgIzAgIC0+IHZtb3YuaTMyLCAjMAorLy8vICd1MzInIGlzIGEgbW9yZSBzcGVjaWZpYyBkZXNpZ25hdG9yIGZvciB0aGUgMzItYml0IGludGVnZXIgdHlwZSBzcGVjaWZpZXIKKy8vLyBhbmQgaXMgbGVnYWwgZm9yIGFueSBpbnN0cnVjdGlvbiB3aGljaCBhY2NlcHRzICdpMzInIGFzIGEgZGF0YXR5cGUgc3VmZml4LgorLy8vICAgZGVmIDogVG9rZW5BbGlhczwiLnUzMiIsICIuaTMyIj47CisvLy8KKy8vLyBUaGlzIHdvcmtzIGJ5IG1hcmtpbmcgdGhlIG1hdGNoIGNsYXNzIG9mICdGcm9tJyBhcyBhIHN1YmNsYXNzIG9mIHRoZQorLy8vIG1hdGNoIGNsYXNzIG9mICdUbycuCitjbGFzcyBUb2tlbkFsaWFzPHN0cmluZyBGcm9tLCBzdHJpbmcgVG8+IHsKKyAgc3RyaW5nIEZyb21Ub2tlbiA9IEZyb207CisgIHN0cmluZyBUb1Rva2VuID0gVG87Cit9CisKKy8vLyBNbmVtb25pY0FsaWFzIC0gVGhpcyBjbGFzcyBhbGxvd3MgdGFyZ2V0cyB0byBkZWZpbmUgYXNzZW1ibGVyIG1uZW1vbmljCisvLy8gYWxpYXNlcy4gIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2hlbiBhbGwgZm9ybXMgb2Ygb25lIG1uZW1vbmljIGFyZSBhY2NlcHRlZAorLy8vIHdpdGggYSBkaWZmZXJlbnQgbW5lbW9uaWMuICBGb3IgZXhhbXBsZSwgWDg2IGFsbG93czoKKy8vLyAgIHNhbCAlYWwsIDEgICAgLT4gc2hsICVhbCwgMQorLy8vICAgc2FsICVheCwgJWNsICAtPiBzaGwgJWF4LCAlY2wKKy8vLyAgIHNhbCAlZWF4LCAlY2wgLT4gc2hsICVlYXgsICVjbAorLy8vIGV0Yy4gIFRob3VnaCAic2FsIiBpcyBhY2NlcHRlZCB3aXRoIG1hbnkgZm9ybXMsIGFsbCBvZiB0aGVtIGFyZSBkaXJlY3RseQorLy8vIHRyYW5zbGF0ZWQgdG8gYSBzaGwsIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHdpdGggKGluIHRoZSBjYXNlIG9mIFg4NiwgaXQKKy8vLyBhY3R1YWxseSBoYXMgb25lIGZvciBlYWNoIHN1ZmZpeCBhcyB3ZWxsKToKKy8vLyAgIGRlZiA6IE1uZW1vbmljQWxpYXM8InNhbCIsICJzaGwiPjsKKy8vLworLy8vIE1uZW1vbmljIGFsaWFzZXMgYXJlIG1hcHBlZCBiZWZvcmUgYW55IG90aGVyIHRyYW5zbGF0aW9uIGluIHRoZSBtYXRjaCBwaGFzZSwKKy8vLyBhbmQgZG8gYWxsb3cgUmVxdWlyZXMgcHJlZGljYXRlcywgZS5nLjoKKy8vLworLy8vICBkZWYgOiBNbmVtb25pY0FsaWFzPCJwdXNoZiIsICJwdXNoZnEiPiwgUmVxdWlyZXM8W0luNjRCaXRNb2RlXT47CisvLy8gIGRlZiA6IE1uZW1vbmljQWxpYXM8InB1c2hmIiwgInB1c2hmbCI+LCBSZXF1aXJlczxbSW4zMkJpdE1vZGVdPjsKKy8vLworLy8vIE1uZW1vbmljIGFsaWFzZXMgY2FuIGFsc28gYmUgY29uc3RyYWluZWQgdG8gc3BlY2lmaWMgdmFyaWFudHMsIGUuZy46CisvLy8KKy8vLyAgZGVmIDogTW5lbW9uaWNBbGlhczwicHVzaGYiLCAicHVzaGZxIiwgImF0dCI+LCBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsKKy8vLworLy8vIElmIG5vIHZhcmlhbnQgKGUuZy4sICJhdHQiIG9yICJpbnRlbCIpIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBhbGlhcyBpcworLy8vIGFwcGxpZWQgdW5jb25kaXRpb25hbGx5LgorY2xhc3MgTW5lbW9uaWNBbGlhczxzdHJpbmcgRnJvbSwgc3RyaW5nIFRvLCBzdHJpbmcgVmFyaWFudE5hbWUgPSAiIj4geworICBzdHJpbmcgRnJvbU1uZW1vbmljID0gRnJvbTsKKyAgc3RyaW5nIFRvTW5lbW9uaWMgPSBUbzsKKyAgc3RyaW5nIEFzbVZhcmlhbnROYW1lID0gVmFyaWFudE5hbWU7CisKKyAgLy8gUHJlZGljYXRlcyAtIFByZWRpY2F0ZXMgdGhhdCBtdXN0IGJlIHRydWUgZm9yIHRoaXMgcmVtYXBwaW5nIHRvIGhhcHBlbi4KKyAgbGlzdDxQcmVkaWNhdGU+IFByZWRpY2F0ZXMgPSBbXTsKK30KKworLy8vIEluc3RBbGlhcyAtIFRoaXMgZGVmaW5lcyBhbiBhbHRlcm5hdGUgYXNzZW1ibHkgc3ludGF4IHRoYXQgaXMgYWxsb3dlZCB0bworLy8vIG1hdGNoIGFuIGluc3RydWN0aW9uIHRoYXQgaGFzIGEgZGlmZmVyZW50IChtb3JlIGNhbm9uaWNhbCkgYXNzZW1ibHkKKy8vLyByZXByZXNlbnRhdGlvbi4KK2NsYXNzIEluc3RBbGlhczxzdHJpbmcgQXNtLCBkYWcgUmVzdWx0LCBpbnQgRW1pdCA9IDE+IHsKKyAgc3RyaW5nIEFzbVN0cmluZyA9IEFzbTsgICAgICAvLyBUaGUgLnMgZm9ybWF0IHRvIG1hdGNoIHRoZSBpbnN0cnVjdGlvbiB3aXRoLgorICBkYWcgUmVzdWx0SW5zdCA9IFJlc3VsdDsgICAgIC8vIFRoZSBNQ0luc3QgdG8gZ2VuZXJhdGUuCisKKyAgLy8gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9yZGVyIHRoZSBJbnN0UHJpbnRlciBkZXRlY3RzIGFsaWFzZXMgZm9yCisgIC8vIHByaW50aW5nLiBBIGxhcmdlciB2YWx1ZSBtYWtlcyB0aGUgYWxpYXMgbW9yZSBsaWtlbHkgdG8gYmUKKyAgLy8gZW1pdHRlZC4gVGhlIEluc3RydWN0aW9uJ3Mgb3duIGRlZmluaXRpb24gaXMgbm90aW9uYWxseSAwLjUsIHNvIDAKKyAgLy8gZGlzYWJsZXMgcHJpbnRpbmcgYW5kIDEgZW5hYmxlcyBpdCBpZiB0aGVyZSBhcmUgbm8gY29uZmxpY3RpbmcgYWxpYXNlcy4KKyAgaW50IEVtaXRQcmlvcml0eSA9IEVtaXQ7CisKKyAgLy8gUHJlZGljYXRlcyAtIFByZWRpY2F0ZXMgdGhhdCBtdXN0IGJlIHRydWUgZm9yIHRoaXMgdG8gbWF0Y2guCisgIGxpc3Q8UHJlZGljYXRlPiBQcmVkaWNhdGVzID0gW107CisKKyAgLy8gSWYgdGhlIGluc3RydWN0aW9uIHNwZWNpZmllZCBpbiBSZXN1bHQgaGFzIGRlZmluZWQgYW4gQXNtTWF0Y2hDb252ZXJ0ZXIKKyAgLy8gdGhlbiBzZXR0aW5nIHRoaXMgdG8gMSB3aWxsIGNhdXNlIHRoZSBhbGlhcyB0byB1c2UgdGhlIEFzbU1hdGNoQ29udmVydGVyCisgIC8vIGZ1bmN0aW9uIHdoZW4gY29udmVydGluZyB0aGUgT3BlcmFuZFZlY3RvciBpbnRvIGFuIE1DSW5zdCBpbnN0ZWFkIG9mIHRoZQorICAvLyBmdW5jdGlvbiB0aGF0IGlzIGdlbmVyYXRlZCBieSB0aGUgZGFnIFJlc3VsdC4KKyAgLy8gU2V0dGluZyB0aGlzIHRvIDAgd2lsbCBjYXVzZSB0aGUgYWxpYXMgdG8gaWdub3JlIHRoZSBSZXN1bHQgaW5zdHJ1Y3Rpb24ncworICAvLyBkZWZpbmVkIEFzbU1hdGNoQ29udmVydGVyIGFuZCBpbnN0ZWFkIHVzZSB0aGUgZnVuY3Rpb24gZ2VuZXJhdGVkIGJ5IHRoZQorICAvLyBkYWcgUmVzdWx0LgorICBiaXQgVXNlSW5zdEFzbU1hdGNoQ29udmVydGVyID0gMTsKKworICAvLyBBc3NlbWJsZXIgdmFyaWFudCBuYW1lIHRvIHVzZSBmb3IgdGhpcyBhbGlhcy4gSWYgbm90IHNwZWNpZmllZCB0aGVuCisgIC8vIGFzc2VtYmxlciB2YXJpYW50cyB3aWxsIGJlIGRldGVybWluZWQgYmFzZWQgb24gQXNtU3RyaW5nCisgIHN0cmluZyBBc21WYXJpYW50TmFtZSA9ICIiOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQXNtV3JpdGVyIC0gVGhpcyBjbGFzcyBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgdGFyZ2V0cyB0aGF0IG5lZWQgdG8gY3VzdG9taXplCisvLyB0aGUgZm9ybWF0IG9mIHRoZSAucyBmaWxlIHdyaXRlci4KKy8vCisvLyBTdWJ0YXJnZXRzIGNhbiBoYXZlIG11bHRpcGxlIGRpZmZlcmVudCBhc213cml0ZXJzIChlLmcuIEFUJlQgdnMgSW50ZWwgc3ludGF4CisvLyBvbiBYODYgZm9yIGV4YW1wbGUpLgorLy8KK2NsYXNzIEFzbVdyaXRlciB7CisgIC8vIEFzbVdyaXRlckNsYXNzTmFtZSAtIFRoaXMgc3BlY2lmaWVzIHRoZSBzdWZmaXggdG8gdXNlIGZvciB0aGUgYXNtd3JpdGVyCisgIC8vIGNsYXNzLiAgR2VuZXJhdGVkIEFzbVdyaXRlciBjbGFzc2VzIGFyZSBhbHdheXMgcHJlZml4ZWQgd2l0aCB0aGUgdGFyZ2V0CisgIC8vIG5hbWUuCisgIHN0cmluZyBBc21Xcml0ZXJDbGFzc05hbWUgID0gIkluc3RQcmludGVyIjsKKworICAvLyBQYXNzU3VidGFyZ2V0IC0gRGV0ZXJtaW5lcyB3aGV0aGVyIE1DU3VidGFyZ2V0SW5mbyBzaG91bGQgYmUgcGFzc2VkIHRvCisgIC8vIHRoZSB2YXJpb3VzIHByaW50IG1ldGhvZHMuCisgIC8vIEZJWE1FOiBSZW1vdmUgYWZ0ZXIgYWxsIHBvcnRzIGFyZSB1cGRhdGVkLgorICBpbnQgUGFzc1N1YnRhcmdldCA9IDA7CisKKyAgLy8gVmFyaWFudCAtIEFzbVdyaXRlcnMgY2FuIGJlIG9mIG11bHRpcGxlIGRpZmZlcmVudCB2YXJpYW50cy4gIFZhcmlhbnRzIGFyZQorICAvLyB1c2VkIHRvIHN1cHBvcnQgdGFyZ2V0cyB0aGF0IG5lZWQgdG8gZW1pdCBhc3NlbWJseSBjb2RlIGluIHdheXMgdGhhdCBhcmUKKyAgLy8gbW9zdGx5IHRoZSBzYW1lIGZvciBkaWZmZXJlbnQgdGFyZ2V0cywgYnV0IGhhdmUgbWlub3IgZGlmZmVyZW5jZXMgaW4KKyAgLy8gc3ludGF4LiAgSWYgdGhlIGFzbXN0cmluZyBjb250YWlucyB7fH0gY2hhcmFjdGVycyBpbiB0aGVtLCB0aGlzIGludGVnZXIKKyAgLy8gd2lsbCBzcGVjaWZ5IHdoaWNoIGFsdGVybmF0aXZlIHRvIHVzZS4gIEZvciBleGFtcGxlICJ7eHx5fHp9IiB3aXRoIFZhcmlhbnQKKyAgLy8gPT0gMSwgd2lsbCBleHBhbmQgdG8gInkiLgorICBpbnQgVmFyaWFudCA9IDA7Cit9CitkZWYgRGVmYXVsdEFzbVdyaXRlciA6IEFzbVdyaXRlcjsKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGFyZ2V0IC0gVGhpcyBjbGFzcyBjb250YWlucyB0aGUgImdsb2JhbCIgdGFyZ2V0IGluZm9ybWF0aW9uCisvLworY2xhc3MgVGFyZ2V0IHsKKyAgLy8gSW5zdHJ1Y3Rpb25TZXQgLSBJbnN0cnVjdGlvbiBzZXQgZGVzY3JpcHRpb24gZm9yIHRoaXMgdGFyZ2V0LgorICBJbnN0ckluZm8gSW5zdHJ1Y3Rpb25TZXQ7CisKKyAgLy8gQXNzZW1ibHlQYXJzZXJzIC0gVGhlIEFzbVBhcnNlciBpbnN0YW5jZXMgYXZhaWxhYmxlIGZvciB0aGlzIHRhcmdldC4KKyAgbGlzdDxBc21QYXJzZXI+IEFzc2VtYmx5UGFyc2VycyA9IFtEZWZhdWx0QXNtUGFyc2VyXTsKKworICAvLy8gQXNzZW1ibHlQYXJzZXJWYXJpYW50cyAtIFRoZSBBc21QYXJzZXJWYXJpYW50IGluc3RhbmNlcyBhdmFpbGFibGUgZm9yCisgIC8vLyB0aGlzIHRhcmdldC4KKyAgbGlzdDxBc21QYXJzZXJWYXJpYW50PiBBc3NlbWJseVBhcnNlclZhcmlhbnRzID0gW0RlZmF1bHRBc21QYXJzZXJWYXJpYW50XTsKKworICAvLyBBc3NlbWJseVdyaXRlcnMgLSBUaGUgQXNtV3JpdGVyIGluc3RhbmNlcyBhdmFpbGFibGUgZm9yIHRoaXMgdGFyZ2V0LgorICBsaXN0PEFzbVdyaXRlcj4gQXNzZW1ibHlXcml0ZXJzID0gW0RlZmF1bHRBc21Xcml0ZXJdOworCisgIC8vIEFsbG93UmVnaXN0ZXJSZW5hbWluZyAtIENvbnRyb2xzIHdoZXRoZXIgdGhpcyB0YXJnZXQgYWxsb3dzCisgIC8vIHBvc3QtcmVnaXN0ZXItYWxsb2NhdGlvbiByZW5hbWluZyBvZiByZWdpc3RlcnMuICBUaGlzIGlzIGRvbmUgYnkKKyAgLy8gc2V0dGluZyBoYXNFeHRyYURlZlJlZ0FsbG9jUmVxIGFuZCBoYXNFeHRyYVNyY1JlZ0FsbG9jUmVxIHRvIDEKKyAgLy8gZm9yIGFsbCBvcGNvZGVzIGlmIHRoaXMgZmxhZyBpcyBzZXQgdG8gMC4KKyAgaW50IEFsbG93UmVnaXN0ZXJSZW5hbWluZyA9IDA7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTdWJ0YXJnZXRGZWF0dXJlIC0gQSBjaGFyYWN0ZXJpc3RpYyBvZiB0aGUgY2hpcCBzZXQuCisvLworY2xhc3MgU3VidGFyZ2V0RmVhdHVyZTxzdHJpbmcgbiwgc3RyaW5nIGEsICBzdHJpbmcgdiwgc3RyaW5nIGQsCisgICAgICAgICAgICAgICAgICAgICAgIGxpc3Q8U3VidGFyZ2V0RmVhdHVyZT4gaSA9IFtdPiB7CisgIC8vIE5hbWUgLSBGZWF0dXJlIG5hbWUuICBVc2VkIGJ5IGNvbW1hbmQgbGluZSAoLW1hdHRyPSkgdG8gZGV0ZXJtaW5lIHRoZQorICAvLyBhcHByb3ByaWF0ZSB0YXJnZXQgY2hpcC4KKyAgLy8KKyAgc3RyaW5nIE5hbWUgPSBuOworCisgIC8vIEF0dHJpYnV0ZSAtIEF0dHJpYnV0ZSB0byBiZSBzZXQgYnkgZmVhdHVyZS4KKyAgLy8KKyAgc3RyaW5nIEF0dHJpYnV0ZSA9IGE7CisKKyAgLy8gVmFsdWUgLSBWYWx1ZSB0aGUgYXR0cmlidXRlIHRvIGJlIHNldCB0byBieSBmZWF0dXJlLgorICAvLworICBzdHJpbmcgVmFsdWUgPSB2OworCisgIC8vIERlc2MgLSBGZWF0dXJlIGRlc2NyaXB0aW9uLiAgVXNlZCBieSBjb21tYW5kIGxpbmUgKC1tYXR0cj0pIHRvIGRpc3BsYXkgaGVscAorICAvLyBpbmZvcm1hdGlvbi4KKyAgLy8KKyAgc3RyaW5nIERlc2MgPSBkOworCisgIC8vIEltcGxpZXMgLSBGZWF0dXJlcyB0aGF0IHRoaXMgZmVhdHVyZSBpbXBsaWVzIGFyZSBwcmVzZW50LiBJZiBvbmUgb2YgdGhvc2UKKyAgLy8gZmVhdHVyZXMgaXNuJ3Qgc2V0LCB0aGVuIHRoaXMgb25lIHNob3VsZG4ndCBiZSBzZXQgZWl0aGVyLgorICAvLworICBsaXN0PFN1YnRhcmdldEZlYXR1cmU+IEltcGxpZXMgPSBpOworfQorCisvLy8gU3BlY2lmaWVzIGEgU3VidGFyZ2V0IGZlYXR1cmUgdGhhdCB0aGlzIGluc3RydWN0aW9uIGlzIGRlcHJlY2F0ZWQgb24uCitjbGFzcyBEZXByZWNhdGVkPFN1YnRhcmdldEZlYXR1cmUgZGVwPiB7CisgIFN1YnRhcmdldEZlYXR1cmUgRGVwcmVjYXRlZEZlYXR1cmVNYXNrID0gZGVwOworfQorCisvLy8gQSBjdXN0b20gcHJlZGljYXRlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGluc3RydWN0aW9uIGlzCisvLy8gZGVwcmVjYXRlZCBvciBub3QuCitjbGFzcyBDb21wbGV4RGVwcmVjYXRpb25QcmVkaWNhdGU8c3RyaW5nIGRlcD4geworICBzdHJpbmcgQ29tcGxleERlcHJlY2F0aW9uUHJlZGljYXRlID0gZGVwOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUHJvY2Vzc29yIGNoaXAgc2V0cyAtIFRoZXNlIHZhbHVlcyByZXByZXNlbnQgZWFjaCBvZiB0aGUgY2hpcCBzZXRzIHN1cHBvcnRlZAorLy8gYnkgdGhlIHNjaGVkdWxlci4gIEVhY2ggUHJvY2Vzc29yIGRlZmluaXRpb24gcmVxdWlyZXMgY29ycmVzcG9uZGluZworLy8gaW5zdHJ1Y3Rpb24gaXRpbmVyYXJpZXMuCisvLworY2xhc3MgUHJvY2Vzc29yPHN0cmluZyBuLCBQcm9jZXNzb3JJdGluZXJhcmllcyBwaSwgbGlzdDxTdWJ0YXJnZXRGZWF0dXJlPiBmPiB7CisgIC8vIE5hbWUgLSBDaGlwIHNldCBuYW1lLiAgVXNlZCBieSBjb21tYW5kIGxpbmUgKC1tY3B1PSkgdG8gZGV0ZXJtaW5lIHRoZQorICAvLyBhcHByb3ByaWF0ZSB0YXJnZXQgY2hpcC4KKyAgLy8KKyAgc3RyaW5nIE5hbWUgPSBuOworCisgIC8vIFNjaGVkTW9kZWwgLSBUaGUgbWFjaGluZSBtb2RlbCBmb3Igc2NoZWR1bGluZyBhbmQgaW5zdHJ1Y3Rpb24gY29zdC4KKyAgLy8KKyAgU2NoZWRNYWNoaW5lTW9kZWwgU2NoZWRNb2RlbCA9IE5vU2NoZWRNb2RlbDsKKworICAvLyBQcm9jSXRpbiAtIFRoZSBzY2hlZHVsaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgdGFyZ2V0IHByb2Nlc3Nvci4KKyAgLy8KKyAgUHJvY2Vzc29ySXRpbmVyYXJpZXMgUHJvY0l0aW4gPSBwaTsKKworICAvLyBGZWF0dXJlcyAtIGxpc3Qgb2YKKyAgbGlzdDxTdWJ0YXJnZXRGZWF0dXJlPiBGZWF0dXJlcyA9IGY7Cit9CisKKy8vIFByb2Nlc3Nvck1vZGVsIGFsbG93cyBzdWJ0YXJnZXRzIHRvIHNwZWNpZnkgdGhlIG1vcmUgZ2VuZXJhbAorLy8gU2NoZWRNYWNoaW5lTW9kZWwgaW5zdGVhZCBpZiBhIFByb2Nlc3Nvckl0aW5lcmFyeS4gU3VidGFyZ2V0cyB3aWxsCisvLyBncmFkdWFsbHkgbW92ZSB0byB0aGlzIG5ld2VyIGZvcm0uCisvLworLy8gQWx0aG91Z2ggdGhpcyBjbGFzcyBhbHdheXMgcGFzc2VzIE5vSXRpbmVyYXJpZXMgdG8gdGhlIFByb2Nlc3NvcgorLy8gY2xhc3MsIHRoZSBTY2hlZE1hY2hpbmVNb2RlbCBtYXkgc3RpbGwgZGVmaW5lIHZhbGlkIEl0aW5lcmFyaWVzLgorY2xhc3MgUHJvY2Vzc29yTW9kZWw8c3RyaW5nIG4sIFNjaGVkTWFjaGluZU1vZGVsIG0sIGxpc3Q8U3VidGFyZ2V0RmVhdHVyZT4gZj4KKyAgOiBQcm9jZXNzb3I8biwgTm9JdGluZXJhcmllcywgZj4geworICBsZXQgU2NoZWRNb2RlbCA9IG07Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbnN0ck1hcHBpbmcgLSBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIG1hcHBpbmcgdGFibGVzIHRvIHJlbGF0ZQorLy8gaW5zdHJ1Y3Rpb25zIHdpdGggZWFjaCBvdGhlciBiYXNlZCBvbiB0aGUgdmFsdWVzIHNwZWNpZmllZCBpbiBSb3dGaWVsZHMsCisvLyBDb2xGaWVsZHMsIEtleUNvbCBhbmQgVmFsdWVDb2xzLgorLy8KK2NsYXNzIEluc3RyTWFwcGluZyB7CisgIC8vIEZpbHRlckNsYXNzIC0gVXNlZCB0byBsaW1pdCBzZWFyY2ggc3BhY2Ugb25seSB0byB0aGUgaW5zdHJ1Y3Rpb25zIHRoYXQKKyAgLy8gZGVmaW5lIHRoZSByZWxhdGlvbnNoaXAgbW9kZWxlZCBieSB0aGlzIEluc3RyTWFwcGluZyByZWNvcmQuCisgIHN0cmluZyBGaWx0ZXJDbGFzczsKKworICAvLyBSb3dGaWVsZHMgLSBMaXN0IG9mIGZpZWxkcy9hdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIHNhbWUgZm9yIGFsbCB0aGUKKyAgLy8gaW5zdHJ1Y3Rpb25zIGluIGEgcm93IG9mIHRoZSByZWxhdGlvbiB0YWJsZS4gVGhpbmsgb2YgdGhpcyBhcyBhIHNldCBvZgorICAvLyBwcm9wZXJ0aWVzIHNoYXJlZCBieSBhbGwgdGhlIGluc3RydWN0aW9ucyByZWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwCisgIC8vIG1vZGVsIGFuZCBpcyB1c2VkIHRvIGNhdGVnb3JpemUgaW5zdHJ1Y3Rpb25zIGludG8gc3ViZ3JvdXBzLiBGb3IgaW5zdGFuY2UsCisgIC8vIGlmIHdlIHdhbnQgdG8gZGVmaW5lIGEgcmVsYXRpb24gdGhhdCBtYXBzICdBZGQnIGluc3RydWN0aW9uIHRvIGl0cworICAvLyBwcmVkaWNhdGVkIGZvcm1zLCB3ZSBjYW4gZGVmaW5lIFJvd0ZpZWxkcyBsaWtlIHRoaXM6CisgIC8vCisgIC8vIGxldCBSb3dGaWVsZHMgPSBCYXNlT3AKKyAgLy8gQWxsIGFkZCBpbnN0cnVjdGlvbiBwcmVkaWNhdGVkL25vbi1wcmVkaWNhdGVkIHdpbGwgaGF2ZSB0byBzZXQgdGhlaXIgQmFzZU9wCisgIC8vIHRvIHRoZSBzYW1lIHZhbHVlLgorICAvLworICAvLyBkZWYgQWRkOiB7IGxldCBCYXNlT3AgPSAnQUREJzsgbGV0IHByZWRTZW5zZSA9ICdub3ByZWQnIH0KKyAgLy8gZGVmIEFkZF9wcmVkdHJ1ZTogeyBsZXQgQmFzZU9wID0gJ0FERCc7IGxldCBwcmVkU2Vuc2UgPSAndHJ1ZScgfQorICAvLyBkZWYgQWRkX3ByZWRmYWxzZTogeyBsZXQgQmFzZU9wID0gJ0FERCc7IGxldCBwcmVkU2Vuc2UgPSAnZmFsc2UnICB9CisgIGxpc3Q8c3RyaW5nPiBSb3dGaWVsZHMgPSBbXTsKKworICAvLyBMaXN0IG9mIGZpZWxkcy9hdHRyaWJ1dGVzIHRoYXQgYXJlIHNhbWUgZm9yIGFsbCB0aGUgaW5zdHJ1Y3Rpb25zCisgIC8vIGluIGEgY29sdW1uIG9mIHRoZSByZWxhdGlvbiB0YWJsZS4KKyAgLy8gRXg6IGxldCBDb2xGaWVsZHMgPSAncHJlZFNlbnNlJyAtLSBJdCBtZWFucyB0aGF0IHRoZSBjb2x1bW5zIGFyZSBhcnJhbmdlZAorICAvLyBiYXNlZCBvbiB0aGUgJ3ByZWRTZW5zZScgdmFsdWVzLiBBbGwgdGhlIGluc3RydWN0aW9uIGluIGEgc3BlY2lmaWMKKyAgLy8gY29sdW1uIGhhdmUgdGhlIHNhbWUgdmFsdWUgYW5kIGl0IGlzIGZpeGVkIGZvciB0aGUgY29sdW1uIGFjY29yZGluZworICAvLyB0byB0aGUgdmFsdWVzIHNldCBpbiAnVmFsdWVDb2xzJy4KKyAgbGlzdDxzdHJpbmc+IENvbEZpZWxkcyA9IFtdOworCisgIC8vIFZhbHVlcyBmb3IgdGhlIGZpZWxkcy9hdHRyaWJ1dGVzIGxpc3RlZCBpbiAnQ29sRmllbGRzJy4KKyAgLy8gRXg6IGxldCBLZXlDb2wgPSAnbm9wcmVkJyAtLSBJdCBtZWFucyB0aGF0IHRoZSBrZXkgaW5zdHJ1Y3Rpb24gKGluc3RydWN0aW9uCisgIC8vIHRoYXQgbW9kZWxzIHRoaXMgcmVsYXRpb24pIHNob3VsZCBiZSBub24tcHJlZGljYXRlZC4KKyAgLy8gSW4gdGhlIGV4YW1wbGUgYWJvdmUsICdBZGQnIGlzIHRoZSBrZXkgaW5zdHJ1Y3Rpb24uCisgIGxpc3Q8c3RyaW5nPiBLZXlDb2wgPSBbXTsKKworICAvLyBMaXN0IG9mIHZhbHVlcyBmb3IgdGhlIGZpZWxkcy9hdHRyaWJ1dGVzIGxpc3RlZCBpbiAnQ29sRmllbGRzJywgb25lIGZvcgorICAvLyBlYWNoIGNvbHVtbiBpbiB0aGUgcmVsYXRpb24gdGFibGUuCisgIC8vCisgIC8vIEV4OiBsZXQgVmFsdWVDb2xzID0gW1sndHJ1ZSddLFsnZmFsc2UnXV0gLS0gSXQgYWRkcyB0d28gY29sdW1ucyBpbiB0aGUKKyAgLy8gdGFibGUuIEZpcnN0IGNvbHVtbiByZXF1aXJlcyBhbGwgdGhlIGluc3RydWN0aW9ucyB0byBoYXZlIHByZWRTZW5zZQorICAvLyBzZXQgdG8gJ3RydWUnIGFuZCBzZWNvbmQgY29sdW1uIHJlcXVpcmVzIGl0IHRvIGJlICdmYWxzZScuCisgIGxpc3Q8bGlzdDxzdHJpbmc+ID4gVmFsdWVDb2xzID0gW107Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQdWxsIGluIHRoZSBjb21tb24gc3VwcG9ydCBmb3IgY2FsbGluZyBjb252ZW50aW9ucy4KKy8vCitpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRDYWxsaW5nQ29udi50ZCIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFB1bGwgaW4gdGhlIGNvbW1vbiBzdXBwb3J0IGZvciBEQUcgaXNlbCBnZW5lcmF0aW9uLgorLy8KK2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFNlbGVjdGlvbkRBRy50ZCIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFB1bGwgaW4gdGhlIGNvbW1vbiBzdXBwb3J0IGZvciBHbG9iYWwgSVNlbCByZWdpc3RlciBiYW5rIGluZm8gZ2VuZXJhdGlvbi4KKy8vCitpbmNsdWRlICJsbHZtL1RhcmdldC9HbG9iYWxJU2VsL1JlZ2lzdGVyQmFuay50ZCIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFB1bGwgaW4gdGhlIGNvbW1vbiBzdXBwb3J0IGZvciBEQUcgaXNlbCBnZW5lcmF0aW9uLgorLy8KK2luY2x1ZGUgImxsdm0vVGFyZ2V0L0dsb2JhbElTZWwvVGFyZ2V0LnRkIgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUHVsbCBpbiB0aGUgY29tbW9uIHN1cHBvcnQgZm9yIHRoZSBHbG9iYWwgSVNlbCBEQUctYmFzZWQgc2VsZWN0b3IgZ2VuZXJhdGlvbi4KKy8vCitpbmNsdWRlICJsbHZtL1RhcmdldC9HbG9iYWxJU2VsL1NlbGVjdGlvbkRBR0NvbXBhdC50ZCIKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldENhbGxpbmdDb252LnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0Q2FsbGluZ0NvbnYudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4NjM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldENhbGxpbmdDb252LnRkCkBAIC0wLDAgKzEsMTg3IEBACisvLz09PS0gVGFyZ2V0Q2FsbGluZ0NvbnYudGQgLSBUYXJnZXQgQ2FsbGluZyBDb252ZW50aW9ucyAtLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8gCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLyAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIHRhcmdldC1pbmRlcGVuZGVudCBpbnRlcmZhY2VzIHdpdGggd2hpY2ggdGFyZ2V0cworLy8gZGVzY3JpYmUgdGhlaXIgY2FsbGluZyBjb252ZW50aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBDQ0FjdGlvbjsKK2NsYXNzIENhbGxpbmdDb252OworCisvLy8gQ0NDdXN0b20gLSBDYWxscyBhIGN1c3RvbSBhcmcgaGFuZGxpbmcgZnVuY3Rpb24uCitjbGFzcyBDQ0N1c3RvbTxzdHJpbmcgZm4+IDogQ0NBY3Rpb24geworICBzdHJpbmcgRnVuY05hbWUgPSBmbjsKK30KKworLy8vIENDUHJlZGljYXRlQWN0aW9uIC0gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgY2hlY2sgc29tZSBwcmVkaWNhdGUsIHRoZW4KKy8vLyBkZWxlZ2F0ZSB0byBhbm90aGVyIGFjdGlvbiBpZiB0aGUgcHJlZGljYXRlIGlzIHRydWUuCitjbGFzcyBDQ1ByZWRpY2F0ZUFjdGlvbjxDQ0FjdGlvbiBBPiA6IENDQWN0aW9uIHsKKyAgQ0NBY3Rpb24gU3ViQWN0aW9uID0gQTsKK30KKworLy8vIENDSWZUeXBlIC0gSWYgdGhlIGN1cnJlbnQgYXJndW1lbnQgaXMgb25lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZXMsIGFwcGx5CisvLy8gQWN0aW9uIEEuCitjbGFzcyBDQ0lmVHlwZTxsaXN0PFZhbHVlVHlwZT4gdnRzLCBDQ0FjdGlvbiBBPiA6IENDUHJlZGljYXRlQWN0aW9uPEE+IHsKKyAgbGlzdDxWYWx1ZVR5cGU+IFZUcyA9IHZ0czsKK30KKworLy8vIENDSWYgLSBJZiB0aGUgcHJlZGljYXRlIG1hdGNoZXMsIGFwcGx5IEEuCitjbGFzcyBDQ0lmPHN0cmluZyBwcmVkaWNhdGUsIENDQWN0aW9uIEE+IDogQ0NQcmVkaWNhdGVBY3Rpb248QT4geworICBzdHJpbmcgUHJlZGljYXRlID0gcHJlZGljYXRlOworfQorCisvLy8gQ0NJZkJ5VmFsIC0gSWYgdGhlIGN1cnJlbnQgYXJndW1lbnQgaGFzIEJ5VmFsIHBhcmFtZXRlciBhdHRyaWJ1dGUsIGFwcGx5CisvLy8gQWN0aW9uIEEuCitjbGFzcyBDQ0lmQnlWYWw8Q0NBY3Rpb24gQT4gOiBDQ0lmPCJBcmdGbGFncy5pc0J5VmFsKCkiLCBBPiB7Cit9CisKKy8vLyBDQ0lmU3dpZnRTZWxmIC0gSWYgdGhlIGN1cnJlbnQgYXJndW1lbnQgaGFzIHN3aWZ0c2VsZiBwYXJhbWV0ZXIgYXR0cmlidXRlLAorLy8vIGFwcGx5IEFjdGlvbiBBLgorY2xhc3MgQ0NJZlN3aWZ0U2VsZjxDQ0FjdGlvbiBBPiA6IENDSWY8IkFyZ0ZsYWdzLmlzU3dpZnRTZWxmKCkiLCBBPiB7Cit9CisKKy8vLyBDQ0lmU3dpZnRFcnJvciAtIElmIHRoZSBjdXJyZW50IGFyZ3VtZW50IGhhcyBzd2lmdGVycm9yIHBhcmFtZXRlciBhdHRyaWJ1dGUsCisvLy8gYXBwbHkgQWN0aW9uIEEuCitjbGFzcyBDQ0lmU3dpZnRFcnJvcjxDQ0FjdGlvbiBBPiA6IENDSWY8IkFyZ0ZsYWdzLmlzU3dpZnRFcnJvcigpIiwgQT4geworfQorCisvLy8gQ0NJZkNvbnNlY3V0aXZlUmVncyAtIElmIHRoZSBjdXJyZW50IGFyZ3VtZW50IGhhcyBJbkNvbnNlY3V0aXZlUmVncworLy8vIHBhcmFtZXRlciBhdHRyaWJ1dGUsIGFwcGx5IEFjdGlvbiBBLgorY2xhc3MgQ0NJZkNvbnNlY3V0aXZlUmVnczxDQ0FjdGlvbiBBPiA6IENDSWY8IkFyZ0ZsYWdzLmlzSW5Db25zZWN1dGl2ZVJlZ3MoKSIsIEE+IHsKK30KKworLy8vIENDSWZDQyAtIE1hdGNoIGlmIHRoZSBjdXJyZW50IGNhbGxpbmcgY29udmVudGlvbiBpcyAnQ0MnLgorY2xhc3MgQ0NJZkNDPHN0cmluZyBDQywgQ0NBY3Rpb24gQT4KKyAgOiBDQ0lmPCFzdHJjb25jYXQoIlN0YXRlLmdldENhbGxpbmdDb252KCkgPT0gIiwgQ0MpLCBBPiB7fQorCisvLy8gQ0NJZkluUmVnIC0gSWYgdGhpcyBhcmd1bWVudCBpcyBtYXJrZWQgd2l0aCB0aGUgJ2lucmVnJyBhdHRyaWJ1dGUsIGFwcGx5CisvLy8gdGhlIHNwZWNpZmllZCBhY3Rpb24uCitjbGFzcyBDQ0lmSW5SZWc8Q0NBY3Rpb24gQT4gOiBDQ0lmPCJBcmdGbGFncy5pc0luUmVnKCkiLCBBPiB7fQorCisvLy8gQ0NJZk5lc3QgLSBJZiB0aGlzIGFyZ3VtZW50IGlzIG1hcmtlZCB3aXRoIHRoZSAnbmVzdCcgYXR0cmlidXRlLCBhcHBseQorLy8vIHRoZSBzcGVjaWZpZWQgYWN0aW9uLgorY2xhc3MgQ0NJZk5lc3Q8Q0NBY3Rpb24gQT4gOiBDQ0lmPCJBcmdGbGFncy5pc05lc3QoKSIsIEE+IHt9CisKKy8vLyBDQ0lmU3BsaXQgLSBJZiB0aGlzIGFyZ3VtZW50IGlzIG1hcmtlZCB3aXRoIHRoZSAnc3BsaXQnIGF0dHJpYnV0ZSwgYXBwbHkKKy8vLyB0aGUgc3BlY2lmaWVkIGFjdGlvbi4KK2NsYXNzIENDSWZTcGxpdDxDQ0FjdGlvbiBBPiA6IENDSWY8IkFyZ0ZsYWdzLmlzU3BsaXQoKSIsIEE+IHt9CisKKy8vLyBDQ0lmU1JldCAtIElmIHRoaXMgYXJndW1lbnQgaXMgbWFya2VkIHdpdGggdGhlICdzcmV0JyBhdHRyaWJ1dGUsIGFwcGx5CisvLy8gdGhlIHNwZWNpZmllZCBhY3Rpb24uCitjbGFzcyBDQ0lmU1JldDxDQ0FjdGlvbiBBPiA6IENDSWY8IkFyZ0ZsYWdzLmlzU1JldCgpIiwgQT4ge30KKworLy8vIENDSWZWYXJBcmcgLSBJZiB0aGUgY3VycmVudCBmdW5jdGlvbiBpcyB2YXJhcmcgLSBhcHBseSB0aGUgYWN0aW9uCitjbGFzcyBDQ0lmVmFyQXJnPENDQWN0aW9uIEE+IDogQ0NJZjwiU3RhdGUuaXNWYXJBcmcoKSIsIEE+IHt9CisKKy8vLyBDQ0lmTm90VmFyQXJnIC0gSWYgdGhlIGN1cnJlbnQgZnVuY3Rpb24gaXMgbm90IHZhcmFyZyAtIGFwcGx5IHRoZSBhY3Rpb24KK2NsYXNzIENDSWZOb3RWYXJBcmc8Q0NBY3Rpb24gQT4gOiBDQ0lmPCIhU3RhdGUuaXNWYXJBcmcoKSIsIEE+IHt9CisKKy8vLyBDQ0Fzc2lnblRvUmVnIC0gVGhpcyBhY3Rpb24gbWF0Y2hlcyBpZiB0aGVyZSBpcyBhIHJlZ2lzdGVyIGluIHRoZSBzcGVjaWZpZWQKKy8vLyBsaXN0IHRoYXQgaXMgc3RpbGwgYXZhaWxhYmxlLiAgSWYgc28sIGl0IGFzc2lnbnMgdGhlIHZhbHVlIHRvIHRoZSBmaXJzdAorLy8vIGF2YWlsYWJsZSByZWdpc3RlciBhbmQgc3VjY2VlZHMuCitjbGFzcyBDQ0Fzc2lnblRvUmVnPGxpc3Q8UmVnaXN0ZXI+IHJlZ0xpc3Q+IDogQ0NBY3Rpb24geworICBsaXN0PFJlZ2lzdGVyPiBSZWdMaXN0ID0gcmVnTGlzdDsKK30KKworLy8vIENDQXNzaWduVG9SZWdXaXRoU2hhZG93IC0gU2FtZSBhcyBDQ0Fzc2lnblRvUmVnLCBidXQgd2l0aCBsaXN0IG9mIHJlZ2lzdGVycworLy8vIHdoaWNoIGJlY2FtZSBzaGFkb3dlZCwgd2hlbiBzb21lIHJlZ2lzdGVyIGlzIHVzZWQuCitjbGFzcyBDQ0Fzc2lnblRvUmVnV2l0aFNoYWRvdzxsaXN0PFJlZ2lzdGVyPiByZWdMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDxSZWdpc3Rlcj4gc2hhZG93TGlzdD4gOiBDQ0FjdGlvbiB7CisgIGxpc3Q8UmVnaXN0ZXI+IFJlZ0xpc3QgPSByZWdMaXN0OworICBsaXN0PFJlZ2lzdGVyPiBTaGFkb3dSZWdMaXN0ID0gc2hhZG93TGlzdDsKK30KKworLy8vIENDQXNzaWduVG9TdGFjayAtIFRoaXMgYWN0aW9uIGFsd2F5cyBtYXRjaGVzOiBpdCBhc3NpZ25zIHRoZSB2YWx1ZSB0byBhCisvLy8gc3RhY2sgc2xvdCBvZiB0aGUgc3BlY2lmaWVkIHNpemUgYW5kIGFsaWdubWVudCBvbiB0aGUgc3RhY2suICBJZiBzaXplIGlzCisvLy8gemVybyB0aGVuIHRoZSBBQkkgc2l6ZSBpcyB1c2VkOyBpZiBhbGlnbiBpcyB6ZXJvIHRoZW4gdGhlIEFCSSBhbGlnbm1lbnQKKy8vLyBpcyB1c2VkIC0gdGhlc2UgbWF5IGRlcGVuZCBvbiB0aGUgdGFyZ2V0IG9yIHN1YnRhcmdldC4KK2NsYXNzIENDQXNzaWduVG9TdGFjazxpbnQgc2l6ZSwgaW50IGFsaWduPiA6IENDQWN0aW9uIHsKKyAgaW50IFNpemUgPSBzaXplOworICBpbnQgQWxpZ24gPSBhbGlnbjsKK30KKworLy8vIENDQXNzaWduVG9TdGFja1dpdGhTaGFkb3cgLSBTYW1lIGFzIENDQXNzaWduVG9TdGFjaywgYnV0IHdpdGggYSBsaXN0IG9mCisvLy8gcmVnaXN0ZXJzIHRvIGJlIHNoYWRvd2VkLiBOb3RlIHRoYXQsIHVubGlrZSBDQ0Fzc2lnblRvUmVnV2l0aFNoYWRvdywgdGhpcworLy8vIHNoYWRvd3MgQUxMIG9mIHRoZSByZWdpc3RlcnMgaW4gc2hhZG93TGlzdC4KK2NsYXNzIENDQXNzaWduVG9TdGFja1dpdGhTaGFkb3c8aW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDxSZWdpc3Rlcj4gc2hhZG93TGlzdD4gOiBDQ0FjdGlvbiB7CisgIGludCBTaXplID0gc2l6ZTsKKyAgaW50IEFsaWduID0gYWxpZ247CisgIGxpc3Q8UmVnaXN0ZXI+IFNoYWRvd1JlZ0xpc3QgPSBzaGFkb3dMaXN0OworfQorCisvLy8gQ0NQYXNzQnlWYWwgLSBUaGlzIGFjdGlvbiBhbHdheXMgbWF0Y2hlczogaXQgYXNzaWducyB0aGUgdmFsdWUgdG8gYSBzdGFjaworLy8vIHNsb3QgdG8gaW1wbGVtZW50IEJ5VmFsIGFnZ3JlZ2F0ZSBwYXJhbWV0ZXIgcGFzc2luZy4gU2l6ZSBhbmQgYWxpZ25tZW50CisvLy8gc3BlY2lmeSB0aGUgbWluaW11bSBzaXplIGFuZCBhbGlnbm1lbnQgZm9yIHRoZSBzdGFjayBzbG90LgorY2xhc3MgQ0NQYXNzQnlWYWw8aW50IHNpemUsIGludCBhbGlnbj4gOiBDQ0FjdGlvbiB7CisgIGludCBTaXplID0gc2l6ZTsKKyAgaW50IEFsaWduID0gYWxpZ247Cit9CisKKy8vLyBDQ1Byb21vdGVUb1R5cGUgLSBJZiBhcHBsaWVkLCB0aGlzIHByb21vdGVzIHRoZSBzcGVjaWZpZWQgY3VycmVudCB2YWx1ZSB0bworLy8vIHRoZSBzcGVjaWZpZWQgdHlwZS4KK2NsYXNzIENDUHJvbW90ZVRvVHlwZTxWYWx1ZVR5cGUgZGVzdFR5PiA6IENDQWN0aW9uIHsKKyAgVmFsdWVUeXBlIERlc3RUeSA9IGRlc3RUeTsKK30KKworLy8vIENDUHJvbW90ZVRvVXBwZXJCaXRzSW5UeXBlIC0gSWYgYXBwbGllZCwgdGhpcyBwcm9tb3RlcyB0aGUgc3BlY2lmaWVkIGN1cnJlbnQKKy8vLyB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kIHNoaWZ0cyB0aGUgdmFsdWUgaW50byB0aGUgdXBwZXIgYml0cy4KK2NsYXNzIENDUHJvbW90ZVRvVXBwZXJCaXRzSW5UeXBlPFZhbHVlVHlwZSBkZXN0VHk+IDogQ0NBY3Rpb24geworICBWYWx1ZVR5cGUgRGVzdFR5ID0gZGVzdFR5OworfQorCisvLy8gQ0NCaXRDb252ZXJ0VG9UeXBlIC0gSWYgYXBwbGllZCwgdGhpcyBiaXRjb252ZXJ0cyB0aGUgc3BlY2lmaWVkIGN1cnJlbnQKKy8vLyB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCitjbGFzcyBDQ0JpdENvbnZlcnRUb1R5cGU8VmFsdWVUeXBlIGRlc3RUeT4gOiBDQ0FjdGlvbiB7CisgIFZhbHVlVHlwZSBEZXN0VHkgPSBkZXN0VHk7Cit9CisKKy8vLyBDQ1Bhc3NJbmRpcmVjdCAtIElmIGFwcGxpZWQsIHRoaXMgc3RvcmVzIHRoZSB2YWx1ZSB0byBzdGFjayBhbmQgcGFzc2VzIHRoZSBwb2ludGVyCisvLy8gYXMgbm9ybWFsIGFyZ3VtZW50LgorY2xhc3MgQ0NQYXNzSW5kaXJlY3Q8VmFsdWVUeXBlIGRlc3RUeT4gOiBDQ0FjdGlvbiB7CisgIFZhbHVlVHlwZSBEZXN0VHkgPSBkZXN0VHk7Cit9CisKKy8vLyBDQ0RlbGVnYXRlVG8gLSBUaGlzIGFjdGlvbiBpbnZva2VzIHRoZSBzcGVjaWZpZWQgc3ViLWNhbGxpbmctY29udmVudGlvbi4gIEl0CisvLy8gaXMgc3VjY2Vzc2Z1bCBpZiB0aGUgc3BlY2lmaWVkIENDIG1hdGNoZXMuCitjbGFzcyBDQ0RlbGVnYXRlVG88Q2FsbGluZ0NvbnYgY2M+IDogQ0NBY3Rpb24geworICBDYWxsaW5nQ29udiBDQyA9IGNjOworfQorCisvLy8gQ2FsbGluZ0NvbnYgLSBBbiBpbnN0YW5jZSBvZiB0aGlzIGlzIHVzZWQgdG8gZGVmaW5lIGVhY2ggY2FsbGluZyBjb252ZW50aW9uCisvLy8gdGhhdCB0aGUgdGFyZ2V0IHN1cHBvcnRzLgorY2xhc3MgQ2FsbGluZ0NvbnY8bGlzdDxDQ0FjdGlvbj4gYWN0aW9ucz4geworICBsaXN0PENDQWN0aW9uPiBBY3Rpb25zID0gYWN0aW9uczsKKyAgYml0IEN1c3RvbSA9IDA7Cit9CisKKy8vLyBDdXN0b21DYWxsaW5nQ29udiAtIEFuIGluc3RhbmNlIG9mIHRoaXMgaXMgdXNlZCB0byBkZWNsYXJlIGNhbGxpbmcKKy8vLyBjb252ZW50aW9ucyB0aGF0IGFyZSBpbXBsZW1lbnRlZCB1c2luZyBhIGN1c3RvbSBmdW5jdGlvbiBvZiB0aGUgc2FtZSBuYW1lLgorY2xhc3MgQ3VzdG9tQ2FsbGluZ0NvbnYgOiBDYWxsaW5nQ29udjxbXT4geworICBsZXQgQ3VzdG9tID0gMTsKK30KKworLy8vIENhbGxlZVNhdmVkUmVncyAtIEEgbGlzdCBvZiBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzIGZvciBhIGdpdmVuIGNhbGxpbmcKKy8vLyBjb252ZW50aW9uLiAgVGhlIG9yZGVyIG9mIHJlZ2lzdGVycyBpcyB1c2VkIGJ5IFByb2xvZ0VwaWxvZ0luc2VydGlvbiB3aGVuCisvLy8gYWxsb2NhdGlvbiBzdGFjayBzbG90cyBmb3Igc2F2ZWQgcmVnaXN0ZXJzLgorLy8vCisvLy8gRm9yIGVhY2ggQ2FsbGVlU2F2ZWRSZWdzIGRlZiwgVGFibGVHZW4gd2lsbCBlbWl0IGEgRk9PX1NhdmVMaXN0IGFycmF5IGZvcgorLy8vIHJldHVybmluZyBmcm9tIGdldENhbGxlZVNhdmVkUmVncygpLCBhbmQgYSBGT09fUmVnTWFzayBiaXQgbWFzayBzdWl0YWJsZSBmb3IKKy8vLyByZXR1cm5pbmcgZnJvbSBnZXRDYWxsUHJlc2VydmVkTWFzaygpLgorY2xhc3MgQ2FsbGVlU2F2ZWRSZWdzPGRhZyBzYXZlcz4geworICBkYWcgU2F2ZUxpc3QgPSBzYXZlczsKKworICAvLyBSZWdpc3RlcnMgdGhhdCBhcmUgYWxzbyBwcmVzZXJ2ZWQgYWNyb3NzIGZ1bmN0aW9uIGNhbGxzLCBidXQgc2hvdWxkIG5vdCBiZQorICAvLyBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIEZPT19TYXZlTGlzdCBhcnJheS4gVGhlc2UgcmVnaXN0ZXJzIHdpbGwgYmUKKyAgLy8gaW5jbHVkZWQgaW4gdGhlIEZPT19SZWdNYXNrIGJpdCBtYXNrLiBUaGlzIGNhbiBiZSB1c2VkIGZvciByZWdpc3RlcnMgdGhhdAorICAvLyBhcmUgc2F2ZWQgYXV0b21hdGljYWxseSwgbGlrZSB0aGUgU1BBUkMgcmVnaXN0ZXIgd2luZG93cy4KKyAgZGFnIE90aGVyUHJlc2VydmVkOworfQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0SW50cmluc2ljSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0SW50cmluc2ljSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOTJiZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRJbnRyaW5zaWNJbmZvLmgKQEAgLTAsMCArMSw3MCBAQAorLy89PT0tLSBsbHZtL1RhcmdldC9UYXJnZXRJbnRyaW5zaWNJbmZvLmggLSBJbnN0cnVjdGlvbiBJbmZvIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSB0YXJnZXQgaW50cmluc2ljIGluc3RydWN0aW9ucyB0byB0aGUgY29kZSBnZW5lcmF0b3IuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9UQVJHRVRJTlRSSU5TSUNJTkZPX0gKKyNkZWZpbmUgTExWTV9UQVJHRVRfVEFSR0VUSU5UUklOU0lDSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBNb2R1bGU7CitjbGFzcyBUeXBlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vCisvLy8gVGFyZ2V0SW50cmluc2ljSW5mbyAtIEludGVyZmFjZSB0byBkZXNjcmlwdGlvbiBvZiBtYWNoaW5lIGluc3RydWN0aW9uIHNldAorLy8vCitjbGFzcyBUYXJnZXRJbnRyaW5zaWNJbmZvIHsKKyAgVGFyZ2V0SW50cmluc2ljSW5mbyhjb25zdCBUYXJnZXRJbnRyaW5zaWNJbmZvICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBUYXJnZXRJbnRyaW5zaWNJbmZvICYpID0gZGVsZXRlOworcHVibGljOgorICBUYXJnZXRJbnRyaW5zaWNJbmZvKCk7CisgIHZpcnR1YWwgflRhcmdldEludHJpbnNpY0luZm8oKTsKKworICAvLy8gUmV0dXJuIHRoZSBuYW1lIG9mIGEgdGFyZ2V0IGludHJpbnNpYywgZS5nLiAibGx2bS5iZmluLnNzeW5jIi4KKyAgLy8vIFRoZSBUeXMgYW5kIG51bVR5cyBwYXJhbWV0ZXJzIGFyZSBmb3IgaW50cmluc2ljcyB3aXRoIG92ZXJsb2FkZWQgdHlwZXMKKyAgLy8vIChlLmcuLCB0aG9zZSB1c2luZyBpQW55IG9yIGZBbnkpLiBGb3IgYSBkZWNsYXJhdGlvbiBmb3IgYW4gb3ZlcmxvYWRlZAorICAvLy8gaW50cmluc2ljLCBUeXMgc2hvdWxkIHBvaW50IHRvIGFuIGFycmF5IG9mIG51bVR5cyBwb2ludGVycyB0byBUeXBlLAorICAvLy8gYW5kIG11c3QgcHJvdmlkZSBleGFjdGx5IG9uZSB0eXBlIGZvciBlYWNoIG92ZXJsb2FkZWQgdHlwZSBpbiB0aGUKKyAgLy8vIGludHJpbnNpYy4KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXROYW1lKHVuc2lnbmVkIElJRCwgVHlwZSAqKlR5cyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1UeXMgPSAwKSBjb25zdCA9IDA7CisKKyAgLy8vIExvb2sgdXAgdGFyZ2V0IGludHJpbnNpYyBieSBuYW1lLiBSZXR1cm4gaW50cmluc2ljIElEIG9yIDAgZm9yIHVua25vd24KKyAgLy8vIG5hbWVzLgorICB2aXJ0dWFsIHVuc2lnbmVkIGxvb2t1cE5hbWUoY29uc3QgY2hhciAqTmFtZSwgdW5zaWduZWQgTGVuKSBjb25zdCA9MDsKKworICB1bnNpZ25lZCBsb29rdXBOYW1lKFN0cmluZ1JlZiBOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIGxvb2t1cE5hbWUoTmFtZS5kYXRhKCksIE5hbWUuc2l6ZSgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHRhcmdldCBpbnRyaW5zaWMgSUQgb2YgYSBmdW5jdGlvbiwgb3IgMC4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRJbnRyaW5zaWNJRChjb25zdCBGdW5jdGlvbiAqRikgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW50cmluc2ljIGNhbiBiZSBvdmVybG9hZGVkLgorICB2aXJ0dWFsIGJvb2wgaXNPdmVybG9hZGVkKHVuc2lnbmVkIElJRCkgY29uc3QgPSAwOworCisgIC8vLyBDcmVhdGUgb3IgaW5zZXJ0IGFuIExMVk0gRnVuY3Rpb24gZGVjbGFyYXRpb24gZm9yIGFuIGludHJpbnNpYywKKyAgLy8vIGFuZCByZXR1cm4gaXQuIFRoZSBUeXMgYW5kIG51bVR5cyBhcmUgZm9yIGludHJpbnNpY3Mgd2l0aCBvdmVybG9hZGVkCisgIC8vLyB0eXBlcy4gU2VlIGFib3ZlIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICB2aXJ0dWFsIEZ1bmN0aW9uICpnZXREZWNsYXJhdGlvbihNb2R1bGUgKk0sIHVuc2lnbmVkIElELCBUeXBlICoqVHlzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtVHlzID0gMCkgY29uc3QgPSAwOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRJdGluZXJhcnkudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRJdGluZXJhcnkudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgyMDU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldEl0aW5lcmFyeS50ZApAQCAtMCwwICsxLDE1MiBAQAorLy89PT0tIFRhcmdldEl0aW5lcmFyeS50ZCAtIFRhcmdldCBJdGluaWVyYXJ5IERlc2NyaXB0aW9uIC0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdGFyZ2V0LWluZGVwZW5kZW50IHNjaGVkdWxpbmcgaW50ZXJmYWNlcworLy8gd2hpY2ggc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGVhY2ggdGFyZ2V0IHRoYXQgdXNlcyBpbnN0cnVjdGlvbgorLy8gaXRpbmVyYXJpZXMgZm9yIHNjaGVkdWxpbmcuIEl0aW5lcmFyaWVzIGFyZSBkZXRhaWxzIHJlc2VydmF0aW9uCisvLyB0YWJsZXMgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24gY2xhc3MuIFRoZXkgYXJlIG1vc3QgYXBwcm9wcmlhdGUgZm9yCisvLyBpbi1vcmRlciBtYWNoaW5lIHdpdGggY29tcGxpY2F0ZWQgc2NoZWR1bGluZyBvciBidW5kbGluZyBjb25zdHJhaW50cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUHJvY2Vzc29yIGZ1bmN0aW9uYWwgdW5pdCAtIFRoZXNlIHZhbHVlcyByZXByZXNlbnQgdGhlIGZ1bmN0aW9uIHVuaXRzCisvLyBhdmFpbGFibGUgYWNyb3NzIGFsbCBjaGlwIHNldHMgZm9yIHRoZSB0YXJnZXQuICBFZy4sIEludFVuaXQsIEZQVW5pdCwgLi4uCisvLyBUaGVzZSBtYXkgYmUgaW5kZXBlbmRlbnQgdmFsdWVzIGZvciBlYWNoIGNoaXAgc2V0IG9yIG1heSBiZSBzaGFyZWQgYWNyb3NzCisvLyBhbGwgY2hpcCBzZXRzIG9mIHRoZSB0YXJnZXQuICBFYWNoIGZ1bmN0aW9uYWwgdW5pdCBpcyB0cmVhdGVkIGFzIGEgcmVzb3VyY2UKKy8vIGR1cmluZyBzY2hlZHVsaW5nIGFuZCBoYXMgYW4gYWZmZWN0IGluc3RydWN0aW9uIG9yZGVyIGJhc2VkIG9uIGF2YWlsYWJpbGl0eQorLy8gZHVyaW5nIGEgdGltZSBpbnRlcnZhbC4KKy8vCitjbGFzcyBGdW5jVW5pdDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBpcGVsaW5lIGJ5cGFzcyAvIGZvcndhcmRpbmcgLSBUaGVzZSB2YWx1ZXMgc3BlY2lmaWVzIHRoZSBzeW1ib2xpYyBuYW1lcyBvZgorLy8gcGlwZWxpbmUgYnlwYXNzZXMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZm9yd2FyZCByZXN1bHRzIG9mIGluc3RydWN0aW9ucworLy8gdGhhdCBhcmUgZm9yd2FyZGVkIHRvIHVzZXMuCitjbGFzcyBCeXBhc3M7CitkZWYgTm9CeXBhc3MgOiBCeXBhc3M7CisKK2NsYXNzIFJlc2VydmF0aW9uS2luZDxiaXRzPDE+IHZhbD4geworICBpbnQgVmFsdWUgPSB2YWw7Cit9CisKK2RlZiBSZXF1aXJlZCA6IFJlc2VydmF0aW9uS2luZDwwPjsKK2RlZiBSZXNlcnZlZCA6IFJlc2VydmF0aW9uS2luZDwxPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIHN0YWdlIC0gVGhlc2UgdmFsdWVzIHJlcHJlc2VudCBhIG5vbi1waXBlbGluZWQgc3RlcCBpbgorLy8gdGhlIGV4ZWN1dGlvbiBvZiBhbiBpbnN0cnVjdGlvbi4gIEN5Y2xlcyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YKKy8vIGRpc2NyZXRlIHRpbWUgc2xvdHMgbmVlZGVkIHRvIGNvbXBsZXRlIHRoZSBzdGFnZS4gIFVuaXRzIHJlcHJlc2VudAorLy8gdGhlIGNob2ljZSBvZiBmdW5jdGlvbmFsIHVuaXRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tcGxldGUgdGhlCisvLyBzdGFnZS4gIEVnLiBJbnRVbml0MSwgSW50VW5pdDIuIFRpbWVJbmMgaW5kaWNhdGVzIGhvdyBtYW55IGN5Y2xlcworLy8gc2hvdWxkIGVsYXBzZSBmcm9tIHRoZSBzdGFydCBvZiB0aGlzIHN0YWdlIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dAorLy8gc3RhZ2UgaW4gdGhlIGl0aW5lcmFyeS4gIEZvciBleGFtcGxlOgorLy8KKy8vIEEgc3RhZ2UgaXMgc3BlY2lmaWVkIGluIG9uZSBvZiB0d28gd2F5czoKKy8vCisvLyAgIEluc3RyU3RhZ2U8MSwgW0ZVX3gsIEZVX3ldPiAgICAgLSBUaW1lSW5jIGRlZmF1bHRzIHRvIEN5Y2xlcworLy8gICBJbnN0clN0YWdlPDEsIFtGVV94LCBGVV95XSwgMD4gIC0gVGltZUluYyBleHBsaWNpdAorLy8KKworY2xhc3MgSW5zdHJTdGFnZTxpbnQgY3ljbGVzLCBsaXN0PEZ1bmNVbml0PiB1bml0cywKKyAgICAgICAgICAgICAgICAgaW50IHRpbWVpbmMgPSAtMSwKKyAgICAgICAgICAgICAgICAgUmVzZXJ2YXRpb25LaW5kIGtpbmQgPSBSZXF1aXJlZD4geworICBpbnQgQ3ljbGVzICAgICAgICAgID0gY3ljbGVzOyAgICAgICAvLyBsZW5ndGggb2Ygc3RhZ2UgaW4gbWFjaGluZSBjeWNsZXMKKyAgbGlzdDxGdW5jVW5pdD4gVW5pdHMgPSB1bml0czsgICAgICAgLy8gY2hvaWNlIG9mIGZ1bmN0aW9uYWwgdW5pdHMKKyAgaW50IFRpbWVJbmMgICAgICAgICA9IHRpbWVpbmM7ICAgICAgLy8gY3ljbGVzIHRpbGwgc3RhcnQgb2YgbmV4dCBzdGFnZQorICBpbnQgS2luZCAgICAgICAgICAgID0ga2luZC5WYWx1ZTsgICAvLyBraW5kIG9mIEZVIHJlc2VydmF0aW9uCit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbnN0cnVjdGlvbiBpdGluZXJhcnkgLSBBbiBpdGluZXJhcnkgcmVwcmVzZW50cyBhIHNlcXVlbnRpYWwgc2VyaWVzIG9mIHN0ZXBzCisvLyByZXF1aXJlZCB0byBjb21wbGV0ZSBhbiBpbnN0cnVjdGlvbi4gIEl0aW5lcmFyaWVzIGFyZSByZXByZXNlbnRlZCBhcyBsaXN0cyBvZgorLy8gaW5zdHJ1Y3Rpb24gc3RhZ2VzLgorLy8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIGl0aW5lcmFyeSBjbGFzc2VzIC0gVGhlc2UgdmFsdWVzIHJlcHJlc2VudCAnbmFtZWQnIGluc3RydWN0aW9uCisvLyBpdGluZXJhcnkuICBVc2luZyBuYW1lZCBpdGluZXJhcmllcyBzaW1wbGlmaWVzIG1hbmFnaW5nIGdyb3VwcyBvZgorLy8gaW5zdHJ1Y3Rpb25zIGFjcm9zcyBjaGlwIHNldHMuICBBbiBpbnN0cnVjdGlvbiB1c2VzIHRoZSBzYW1lIGl0aW5lcmFyeSBjbGFzcworLy8gYWNyb3NzIGFsbCBjaGlwIHNldHMuICBUaHVzIGEgbmV3IGNoaXAgc2V0IGNhbiBiZSBhZGRlZCB3aXRob3V0IG1vZGlmeWluZworLy8gaW5zdHJ1Y3Rpb24gaW5mb3JtYXRpb24uCisvLworY2xhc3MgSW5zdHJJdGluQ2xhc3M7CitkZWYgTm9JdGluZXJhcnkgOiBJbnN0ckl0aW5DbGFzczsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIGl0aW5lcmFyeSBkYXRhIC0gVGhlc2UgdmFsdWVzIHByb3ZpZGUgYSBydW50aW1lIG1hcCBvZiBhbgorLy8gaW5zdHJ1Y3Rpb24gaXRpbmVyYXJ5IGNsYXNzIChuYW1lKSB0byBpdHMgaXRpbmVyYXJ5IGRhdGEuCisvLworLy8gTnVtTWljcm9PcHMgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIG1pY3JvLW9wZXJhdGlvbnMgdGhhdCBlYWNoIGluc3RydWN0aW9uCisvLyBpbiB0aGUgY2xhc3MgYXJlIGRlY29kZWQgdG8uIElmIHRoZSBudW1iZXIgaXMgemVybywgdGhlbiBpdCBtZWFucyB0aGUKKy8vIGluc3RydWN0aW9uIGNhbiBkZWNvZGUgaW50byB2YXJpYWJsZSBudW1iZXIgb2YgbWljcm8tb3BzIGFuZCBpdCBtdXN0IGJlCisvLyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5LiBUaGlzIGRpcmVjdGx5IHJlbGF0ZXMgdG8gdGhlIGl0aW5lcmFyaWVzCisvLyBnbG9iYWwgSXNzdWVXaWR0aCBwcm9wZXJ0eSwgd2hpY2ggY29uc3RyYWlucyB0aGUgbnVtYmVyIG9mIG1pY3Jvb3BzCisvLyB0aGF0IGNhbiBpc3N1ZSBwZXIgY3ljbGUuCisvLworLy8gT3BlcmFuZEN5Y2xlcyBhcmUgb3B0aW9uYWwgImN5Y2xlIGNvdW50cyIuIFRoZXkgc3BlY2lmeSB0aGUgY3ljbGUgYWZ0ZXIKKy8vIGluc3RydWN0aW9uIGlzc3VlIHRoZSB2YWx1ZXMgd2hpY2ggY29ycmVzcG9uZCB0byBzcGVjaWZpYyBvcGVyYW5kIGluZGljZXMKKy8vIGFyZSBkZWZpbmVkIG9yIHJlYWQuIEJ5cGFzc2VzIGFyZSBvcHRpb25hbCAicGlwZWxpbmUgZm9yd2FyZGluZyBwYXRocyIsIGlmCisvLyBhIGRlZiBieSBhbiBpbnN0cnVjdGlvbiBpcyBhdmFpbGFibGUgb24gYSBzcGVjaWZpYyBieXBhc3MgYW5kIHRoZSB1c2UgY2FuCisvLyByZWFkIGZyb20gdGhlIHNhbWUgYnlwYXNzLCB0aGVuIHRoZSBvcGVyYW5kIHVzZSBsYXRlbmN5IGlzIHJlZHVjZWQgYnkgb25lLgorLy8KKy8vICBJbnN0ckl0aW5EYXRhPElJQ19pTG9hZF9pICwgW0luc3RyU3RhZ2U8MSwgW0E5X1BpcGUxXT4sCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0clN0YWdlPDEsIFtBOV9BR1VdPl0sCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFszLCAxXSwgW0E5X0xkQnlwYXNzXT4sCisvLyAgSW5zdHJJdGluRGF0YTxJSUNfaU1WTnIgICAsIFtJbnN0clN0YWdlPDEsIFtBOV9QaXBlMCwgQTlfUGlwZTFdPl0sCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxLCAxXSwgW05vQnlwYXNzLCBBOV9MZEJ5cGFzc10+LAorLy8KKy8vIEluIHRoaXMgZXhhbXBsZSwgdGhlIGluc3RydWN0aW9uIG9mIElJQ19pTG9hZGkgcmVhZHMgaXRzIGlucHV0IG9uIGN5Y2xlIDEKKy8vIChhZnRlciBpc3N1ZSkgYW5kIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQgaXMgYXZhaWxhYmxlIG9uIGN5Y2xlIDMuIFRoZSByZXN1bHQKKy8vIGlzIGF2YWlsYWJsZSB2aWEgZm9yd2FyZGluZyBwYXRoIEE5X0xkQnlwYXNzLiBJZiBpdCdzIHVzZWQgYnkgdGhlIGZpcnN0CisvLyBzb3VyY2Ugb3BlcmFuZCBvZiBpbnN0cnVjdGlvbnMgb2YgSUlDX2lNVk5yIGNsYXNzLCB0aGVuIHRoZSBvcGVyYW5kIGxhdGVuY3kKKy8vIGlzIHJlZHVjZWQgYnkgMS4KK2NsYXNzIEluc3RySXRpbkRhdGE8SW5zdHJJdGluQ2xhc3MgQ2xhc3MsIGxpc3Q8SW5zdHJTdGFnZT4gc3RhZ2VzLAorICAgICAgICAgICAgICAgICAgICBsaXN0PGludD4gb3BlcmFuZGN5Y2xlcyA9IFtdLAorICAgICAgICAgICAgICAgICAgICBsaXN0PEJ5cGFzcz4gYnlwYXNzZXMgPSBbXSwgaW50IHVvcHMgPSAxPiB7CisgIEluc3RySXRpbkNsYXNzIFRoZUNsYXNzID0gQ2xhc3M7CisgIGludCBOdW1NaWNyb09wcyA9IHVvcHM7CisgIGxpc3Q8SW5zdHJTdGFnZT4gU3RhZ2VzID0gc3RhZ2VzOworICBsaXN0PGludD4gT3BlcmFuZEN5Y2xlcyA9IG9wZXJhbmRjeWNsZXM7CisgIGxpc3Q8QnlwYXNzPiBCeXBhc3NlcyA9IGJ5cGFzc2VzOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUHJvY2Vzc29yIGl0aW5lcmFyaWVzIC0gVGhlc2UgdmFsdWVzIHJlcHJlc2VudCB0aGUgc2V0IG9mIGFsbCBpdGluZXJhcnkKKy8vIGNsYXNzZXMgZm9yIGEgZ2l2ZW4gY2hpcCBzZXQuCisvLworLy8gU2V0IHByb3BlcnR5IHZhbHVlcyB0byAtMSB0byB1c2UgdGhlIGRlZmF1bHQuCisvLyBTZWUgSW5zdHJJdGluZXJhcnlQcm9wcyBmb3IgY29tbWVudHMgYW5kIGRlZmF1bHRzLgorY2xhc3MgUHJvY2Vzc29ySXRpbmVyYXJpZXM8bGlzdDxGdW5jVW5pdD4gZnUsIGxpc3Q8QnlwYXNzPiBicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Q8SW5zdHJJdGluRGF0YT4gaWlkPiB7CisgIGxpc3Q8RnVuY1VuaXQ+IEZVID0gZnU7CisgIGxpc3Q8QnlwYXNzPiBCUCA9IGJwOworICBsaXN0PEluc3RySXRpbkRhdGE+IElJRCA9IGlpZDsKK30KKworLy8gTm9JdGluZXJhcmllcyAtIEEgbWFya2VyIHRoYXQgY2FuIGJlIHVzZWQgYnkgcHJvY2Vzc29ycyB3aXRob3V0IHNjaGVkdWxlCisvLyBpbmZvLiBTdWJ0YXJnZXRzIHVzaW5nIE5vSXRpbmVyYXJpZXMgY2FuIGJ5cGFzcyB0aGUgc2NoZWR1bGVyJ3MKKy8vIGV4cGVuc2l2ZSBIYXphcmRSZWNvZ25pemVyIGJlY2F1c2Ugbm8gcmVzZXJ2YXRpb24gdGFibGUgaXMgbmVlZGVkLgorZGVmIE5vSXRpbmVyYXJpZXMgOiBQcm9jZXNzb3JJdGluZXJhcmllczxbXSwgW10sIFtdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENvbWJvIEZ1bmN0aW9uIFVuaXQgZGF0YSAtIFRoaXMgaXMgYSBtYXAgb2YgY29tYm8gZnVuY3Rpb24gdW5pdCBuYW1lcyB0bworLy8gdGhlIGxpc3Qgb2YgZnVuY3Rpb25hbCB1bml0cyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgY29tYmluYXRpb24uCisvLworY2xhc3MgQ29tYm9GdW5jRGF0YTxGdW5jVW5pdCBDb21ib0Z1bmMsIGxpc3Q8RnVuY1VuaXQ+IGZ1bmNsaXN0PiB7CisgIEZ1bmNVbml0IFRoZUNvbWJvRnVuYyA9IENvbWJvRnVuYzsKKyAgbGlzdDxGdW5jVW5pdD4gRnVuY0xpc3QgPSBmdW5jbGlzdDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENvbWJvIEZ1bmN0aW9uIFVuaXRzIC0gVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIGNvbWJvIGZ1bmN0aW9uIHVuaXQgZGF0YS4KK2NsYXNzIENvbWJvRnVuY1VuaXRzPGxpc3Q8Q29tYm9GdW5jRGF0YT4gY2ZkPiB7CisgIGxpc3Q8Q29tYm9GdW5jRGF0YT4gQ0ZEID0gY2ZkOworfQorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZ09iamVjdEZpbGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YWMzY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZ09iamVjdEZpbGUuaApAQCAtMCwwICsxLDE5NyBAQAorLy89PT0tLSBsbHZtL1RhcmdldC9UYXJnZXRMb3dlcmluZ09iamVjdEZpbGUuaCAtIE9iamVjdCBJbmZvIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBjbGFzc2VzIHVzZWQgdG8gaGFuZGxlIGxvd2VyaW5ncyBzcGVjaWZpYyB0byBjb21tb24KKy8vIG9iamVjdCBmaWxlIGZvcm1hdHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fVEFSR0VUTE9XRVJJTkdPQkpFQ1RGSUxFX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1RBUkdFVExPV0VSSU5HT0JKRUNURklMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ09iamVjdEZpbGVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9TZWN0aW9uS2luZC5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBNYWNoaW5lTW9kdWxlSW5mbzsKK2NsYXNzIE1hbmdsZXI7CitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBNQ0V4cHI7CitjbGFzcyBNQ1NlY3Rpb247CitjbGFzcyBNQ1N5bWJvbDsKK2NsYXNzIE1DU3ltYm9sUmVmRXhwcjsKK2NsYXNzIE1DU3RyZWFtZXI7CitjbGFzcyBNQ1ZhbHVlOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKKworY2xhc3MgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlIDogcHVibGljIE1DT2JqZWN0RmlsZUluZm8geworICBNQ0NvbnRleHQgKkN0eCA9IG51bGxwdHI7CisKKyAgLy8vIE5hbWUtbWFuZ2xlciBmb3IgZ2xvYmFsIG5hbWVzLgorICBNYW5nbGVyICpNYW5nID0gbnVsbHB0cjsKKworcHJvdGVjdGVkOgorICBib29sIFN1cHBvcnRJbmRpcmVjdFN5bVZpYUdPVFBDUmVsID0gZmFsc2U7CisgIGJvb2wgU3VwcG9ydEdPVFBDUmVsV2l0aE9mZnNldCA9IHRydWU7CisKKyAgLy8vIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgc3RhdGljIGNvbnN0cnVjdG9yIHBvaW50ZXIgbGlzdC4KKyAgTUNTZWN0aW9uICpTdGF0aWNDdG9yU2VjdGlvbiA9IG51bGxwdHI7CisKKyAgLy8vIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgc3RhdGljIGRlc3RydWN0b3IgcG9pbnRlciBsaXN0LgorICBNQ1NlY3Rpb24gKlN0YXRpY0R0b3JTZWN0aW9uID0gbnVsbHB0cjsKKworcHVibGljOgorICBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGUoKSA9IGRlZmF1bHQ7CisgIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZShjb25zdCBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGUgJikgPSBkZWxldGU7CisgIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZSAmCisgIG9wZXJhdG9yPShjb25zdCBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGUgJikgPSBkZWxldGU7CisgIHZpcnR1YWwgflRhcmdldExvd2VyaW5nT2JqZWN0RmlsZSgpOworCisgIE1DQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuICpDdHg7IH0KKyAgTWFuZ2xlciAmZ2V0TWFuZ2xlcigpIGNvbnN0IHsgcmV0dXJuICpNYW5nOyB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgYWN0dWFsIGxvd2VyaW5nIGlzIGRvbmUuICBUaGlzCisgIC8vLyBzcGVjaWZpZXMgdGhlIGN1cnJlbnQgY29udGV4dCBmb3IgY29kZWdlbiwgYW5kIGdpdmVzIHRoZSBsb3dlcmluZworICAvLy8gaW1wbGVtZW50YXRpb25zIGEgY2hhbmNlIHRvIHNldCB1cCB0aGVpciBkZWZhdWx0IHNlY3Rpb25zLgorICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShNQ0NvbnRleHQgJmN0eCwgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pOworCisgIHZpcnR1YWwgdm9pZCBlbWl0UGVyc29uYWxpdHlWYWx1ZShNQ1N0cmVhbWVyICZTdHJlYW1lciwgY29uc3QgRGF0YUxheW91dCAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqU3ltKSBjb25zdDsKKworICAvLy8gRW1pdCB0aGUgbW9kdWxlLWxldmVsIG1ldGFkYXRhIHRoYXQgdGhlIHBsYXRmb3JtIGNhcmVzIGFib3V0LgorICB2aXJ0dWFsIHZvaWQgZW1pdE1vZHVsZU1ldGFkYXRhKE1DU3RyZWFtZXIgJlN0cmVhbWVyLCBNb2R1bGUgJk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IHt9CisKKyAgLy8vIEdpdmVuIGEgY29uc3RhbnQgd2l0aCB0aGUgU2VjdGlvbktpbmQsIHJldHVybiBhIHNlY3Rpb24gdGhhdCBpdCBzaG91bGQgYmUKKyAgLy8vIHBsYWNlZCBpbi4KKyAgdmlydHVhbCBNQ1NlY3Rpb24gKmdldFNlY3Rpb25Gb3JDb25zdGFudChjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZBbGlnbikgY29uc3Q7CisKKyAgLy8vIENsYXNzaWZ5IHRoZSBzcGVjaWZpZWQgZ2xvYmFsIHZhcmlhYmxlIGludG8gYSBzZXQgb2YgdGFyZ2V0IGluZGVwZW5kZW50CisgIC8vLyBjYXRlZ29yaWVzIGVtYm9kaWVkIGluIFNlY3Rpb25LaW5kLgorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0S2luZEZvckdsb2JhbChjb25zdCBHbG9iYWxPYmplY3QgKkdPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSk7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGNvbXB1dGVzIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uIHRvIGVtaXQgdGhlIHNwZWNpZmllZCBnbG9iYWwKKyAgLy8vIHZhcmlhYmxlIG9yIGZ1bmN0aW9uIGRlZmluaXRpb24uIFRoaXMgc2hvdWxkIG5vdCBiZSBwYXNzZWQgZXh0ZXJuYWwgKG9yCisgIC8vLyBhdmFpbGFibGUgZXh0ZXJuYWxseSkgZ2xvYmFscy4KKyAgTUNTZWN0aW9uICpTZWN0aW9uRm9yR2xvYmFsKGNvbnN0IEdsb2JhbE9iamVjdCAqR08sIFNlY3Rpb25LaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Q7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGNvbXB1dGVzIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uIHRvIGVtaXQgdGhlIHNwZWNpZmllZCBnbG9iYWwKKyAgLy8vIHZhcmlhYmxlIG9yIGZ1bmN0aW9uIGRlZmluaXRpb24uIFRoaXMgc2hvdWxkIG5vdCBiZSBwYXNzZWQgZXh0ZXJuYWwgKG9yCisgIC8vLyBhdmFpbGFibGUgZXh0ZXJuYWxseSkgZ2xvYmFscy4KKyAgTUNTZWN0aW9uICpTZWN0aW9uRm9yR2xvYmFsKGNvbnN0IEdsb2JhbE9iamVjdCAqR08sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3QgeworICAgIHJldHVybiBTZWN0aW9uRm9yR2xvYmFsKEdPLCBnZXRLaW5kRm9yR2xvYmFsKEdPLCBUTSksIFRNKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBnZXROYW1lV2l0aFByZWZpeChTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk91dE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Q7CisKKyAgdmlydHVhbCBNQ1NlY3Rpb24gKmdldFNlY3Rpb25Gb3JKdW1wVGFibGUoY29uc3QgRnVuY3Rpb24gJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdDsKKworICB2aXJ0dWFsIGJvb2wgc2hvdWxkUHV0SnVtcFRhYmxlSW5GdW5jdGlvblNlY3Rpb24oYm9vbCBVc2VzTGFiZWxEaWZmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb24gJkYpIGNvbnN0OworCisgIC8vLyBUYXJnZXRzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYXNzaWduIGEgc2VjdGlvbiB0byBnbG9iYWxzIHdpdGgKKyAgLy8vIGFuIGV4cGxpY2l0IHNlY3Rpb24gc3BlY2ZpZWQuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBjYW4KKyAgLy8vIGFzc3VtZSB0aGF0IEdPLT5oYXNTZWN0aW9uKCkgaXMgdHJ1ZS4KKyAgdmlydHVhbCBNQ1NlY3Rpb24gKgorICBnZXRFeHBsaWNpdFNlY3Rpb25HbG9iYWwoY29uc3QgR2xvYmFsT2JqZWN0ICpHTywgU2VjdGlvbktpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdCA9IDA7CisKKyAgLy8vIFJldHVybiBhbiBNQ0V4cHIgdG8gdXNlIGZvciBhIHJlZmVyZW5jZSB0byB0aGUgc3BlY2lmaWVkIGdsb2JhbCB2YXJpYWJsZQorICAvLy8gZnJvbSBleGNlcHRpb24gaGFuZGxpbmcgaW5mb3JtYXRpb24uCisgIHZpcnR1YWwgY29uc3QgTUNFeHByICpnZXRUVHlwZUdsb2JhbFJlZmVyZW5jZShjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1vZHVsZUluZm8gKk1NSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU3RyZWFtZXIgJlN0cmVhbWVyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBNQ1N5bWJvbCBmb3IgYSBwcml2YXRlIHN5bWJvbCB3aXRoIGdsb2JhbCB2YWx1ZSBuYW1lIGFzIGl0cworICAvLy8gYmFzZSwgd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeC4KKyAgTUNTeW1ib2wgKmdldFN5bWJvbFdpdGhHbG9iYWxWYWx1ZUJhc2UoY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Q7CisKKyAgLy8gVGhlIHN5bWJvbCB0aGF0IGdldHMgcGFzc2VkIHRvIC5jZmlfcGVyc29uYWxpdHkuCisgIHZpcnR1YWwgTUNTeW1ib2wgKmdldENGSVBlcnNvbmFsaXR5U3ltYm9sKGNvbnN0IEdsb2JhbFZhbHVlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNb2R1bGVJbmZvICpNTUkpIGNvbnN0OworCisgIGNvbnN0IE1DRXhwciAqZ2V0VFR5cGVSZWZlcmVuY2UoY29uc3QgTUNTeW1ib2xSZWZFeHByICpTeW0sIHVuc2lnbmVkIEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU3RyZWFtZXIgJlN0cmVhbWVyKSBjb25zdDsKKworICB2aXJ0dWFsIE1DU2VjdGlvbiAqZ2V0U3RhdGljQ3RvclNlY3Rpb24odW5zaWduZWQgUHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqS2V5U3ltKSBjb25zdCB7CisgICAgcmV0dXJuIFN0YXRpY0N0b3JTZWN0aW9uOworICB9CisKKyAgdmlydHVhbCBNQ1NlY3Rpb24gKmdldFN0YXRpY0R0b3JTZWN0aW9uKHVuc2lnbmVkIFByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKktleVN5bSkgY29uc3QgeworICAgIHJldHVybiBTdGF0aWNEdG9yU2VjdGlvbjsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgc3ltYm9sIHJlZmVyZW5jZSB0byBkZXNjcmliZSB0aGUgZ2l2ZW4gVExTIHZhcmlhYmxlIHdoZW4KKyAgLy8vIGVtaXR0aW5nIHRoZSBhZGRyZXNzIGluIGRlYnVnIGluZm8uCisgIHZpcnR1YWwgY29uc3QgTUNFeHByICpnZXREZWJ1Z1RocmVhZExvY2FsU3ltYm9sKGNvbnN0IE1DU3ltYm9sICpTeW0pIGNvbnN0OworCisgIHZpcnR1YWwgY29uc3QgTUNFeHByICpsb3dlclJlbGF0aXZlUmVmZXJlbmNlKGNvbnN0IEdsb2JhbFZhbHVlICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdsb2JhbFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIFRhcmdldCBzdXBwb3J0cyByZXBsYWNpbmcgYSBkYXRhICJQQyItcmVsYXRpdmUgYWNjZXNzIHRvIGEgc3ltYm9sCisgIC8vLyB0aHJvdWdoIGFub3RoZXIgc3ltYm9sLCBieSBhY2Nlc3NpbmcgdGhlIGxhdGVyIHZpYSBhIEdPVCBlbnRyeSBpbnN0ZWFkPworICBib29sIHN1cHBvcnRJbmRpcmVjdFN5bVZpYUdPVFBDUmVsKCkgY29uc3QgeworICAgIHJldHVybiBTdXBwb3J0SW5kaXJlY3RTeW1WaWFHT1RQQ1JlbDsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGFyZ2V0IEdPVCAiUEMiLXJlbGF0aXZlIHJlbG9jYXRpb24gc3VwcG9ydHMgZW5jb2RpbmcgYW4gYWRkaXRpb25hbAorICAvLy8gYmluYXJ5IGV4cHJlc3Npb24gd2l0aCBhbiBvZmZzZXQ/CisgIGJvb2wgc3VwcG9ydEdPVFBDUmVsV2l0aE9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3VwcG9ydEdPVFBDUmVsV2l0aE9mZnNldDsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSB0YXJnZXQgc3BlY2lmaWMgUEMgcmVsYXRpdmUgR09UIGVudHJ5IHJlbG9jYXRpb24KKyAgdmlydHVhbCBjb25zdCBNQ0V4cHIgKmdldEluZGlyZWN0U3ltVmlhR09UUENSZWwoY29uc3QgTUNTeW1ib2wgKlN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNWYWx1ZSAmTVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTW9kdWxlSW5mbyAqTU1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1N0cmVhbWVyICZTdHJlYW1lcikgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgdmlydHVhbCB2b2lkIGVtaXRMaW5rZXJGbGFnc0Zvckdsb2JhbChyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR2xvYmFsVmFsdWUgKkdWKSBjb25zdCB7fQorCisgIHZpcnR1YWwgdm9pZCBlbWl0TGlua2VyRmxhZ3NGb3JVc2VkKHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR2xvYmFsVmFsdWUgKkdWKSBjb25zdCB7fQorCitwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgTUNTZWN0aW9uICpTZWxlY3RTZWN0aW9uRm9yR2xvYmFsKGNvbnN0IEdsb2JhbE9iamVjdCAqR08sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25LaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdCA9IDA7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1RBUkdFVExPV0VSSU5HT0JKRUNURklMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY1ZDg2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaApAQCAtMCwwICsxLDM0OSBAQAorLy89PT0tLSBsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmggLSBUYXJnZXQgSW5mb3JtYXRpb24gLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgVGFyZ2V0TWFjaGluZSBhbmQgTExWTVRhcmdldE1hY2hpbmUgY2xhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFSR0VUX1RBUkdFVE1BQ0hJTkVfSAorI2RlZmluZSBMTFZNX1RBUkdFVF9UQVJHRVRNQUNISU5FX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGF0YUxheW91dC5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db2RlR2VuLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEdsb2JhbFZhbHVlOworY2xhc3MgTWFjaGluZU1vZHVsZUluZm87CitjbGFzcyBNYW5nbGVyOworY2xhc3MgTUNBc21JbmZvOworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNJbnN0ckluZm87CitjbGFzcyBNQ1JlZ2lzdGVySW5mbzsKK2NsYXNzIE1DU3VidGFyZ2V0SW5mbzsKK2NsYXNzIE1DU3ltYm9sOworY2xhc3MgcmF3X3B3cml0ZV9zdHJlYW07CitjbGFzcyBQYXNzTWFuYWdlckJ1aWxkZXI7CitjbGFzcyBUYXJnZXQ7CitjbGFzcyBUYXJnZXRJbnRyaW5zaWNJbmZvOworY2xhc3MgVGFyZ2V0SVJBbmFseXNpczsKK2NsYXNzIFRhcmdldFRyYW5zZm9ybUluZm87CitjbGFzcyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGU7CitjbGFzcyBUYXJnZXRQYXNzQ29uZmlnOworY2xhc3MgVGFyZ2V0U3VidGFyZ2V0SW5mbzsKKworLy8gVGhlIG9sZCBwYXNzIG1hbmFnZXIgaW5mcmFzdHJ1Y3R1cmUgaXMgaGlkZGVuIGluIGEgbGVnYWN5IG5hbWVzcGFjZSBub3cuCituYW1lc3BhY2UgbGVnYWN5IHsKK2NsYXNzIFBhc3NNYW5hZ2VyQmFzZTsKK30KK3VzaW5nIGxlZ2FjeTo6UGFzc01hbmFnZXJCYXNlOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gUHJpbWFyeSBpbnRlcmZhY2UgdG8gdGhlIGNvbXBsZXRlIG1hY2hpbmUgZGVzY3JpcHRpb24gZm9yIHRoZSB0YXJnZXQKKy8vLyBtYWNoaW5lLiAgQWxsIHRhcmdldC1zcGVjaWZpYyBpbmZvcm1hdGlvbiBzaG91bGQgYmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoaXMKKy8vLyBpbnRlcmZhY2UuCisvLy8KK2NsYXNzIFRhcmdldE1hY2hpbmUgeworcHJvdGVjdGVkOiAvLyBDYW4gb25seSBjcmVhdGUgc3ViY2xhc3Nlcy4KKyAgVGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsIFN0cmluZ1JlZiBEYXRhTGF5b3V0U3RyaW5nLAorICAgICAgICAgICAgICAgIGNvbnN0IFRyaXBsZSAmVGFyZ2V0VHJpcGxlLCBTdHJpbmdSZWYgQ1BVLCBTdHJpbmdSZWYgRlMsCisgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0T3B0aW9ucyAmT3B0aW9ucyk7CisKKyAgLy8vIFRoZSBUYXJnZXQgdGhhdCB0aGlzIG1hY2hpbmUgd2FzIGNyZWF0ZWQgZm9yLgorICBjb25zdCBUYXJnZXQgJlRoZVRhcmdldDsKKworICAvLy8gRGF0YUxheW91dCBmb3IgdGhlIHRhcmdldDoga2VlcCBBQkkgdHlwZSBzaXplIGFuZCBhbGlnbm1lbnQuCisgIC8vLworICAvLy8gVGhlIERhdGFMYXlvdXQgaXMgY3JlYXRlZCBiYXNlZCBvbiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHByb3ZpZGVkCisgIC8vLyBkdXJpbmcgY29uc3RydWN0aW9uLiBJdCBpcyBrZXB0IGhlcmUgb25seSB0byBhdm9pZCByZXBhcnNpbmcgdGhlIHN0cmluZworICAvLy8gYnV0IHNob3VsZCBub3QgcmVhbGx5IGJlIHVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uLCBiZWNhdXNlIGl0IGhhcyBhbgorICAvLy8gaW50ZXJuYWwgY2FjaGUgdGhhdCBpcyBjb250ZXh0IHNwZWNpZmljLgorICBjb25zdCBEYXRhTGF5b3V0IERMOworCisgIC8vLyBUcmlwbGUgc3RyaW5nLCBDUFUgbmFtZSwgYW5kIHRhcmdldCBmZWF0dXJlIHN0cmluZ3MgdGhlIFRhcmdldE1hY2hpbmUKKyAgLy8vIGluc3RhbmNlIGlzIGNyZWF0ZWQgd2l0aC4KKyAgVHJpcGxlIFRhcmdldFRyaXBsZTsKKyAgc3RkOjpzdHJpbmcgVGFyZ2V0Q1BVOworICBzdGQ6OnN0cmluZyBUYXJnZXRGUzsKKworICBSZWxvYzo6TW9kZWwgUk0gPSBSZWxvYzo6U3RhdGljOworICBDb2RlTW9kZWw6Ok1vZGVsIENNTW9kZWwgPSBDb2RlTW9kZWw6OlNtYWxsOworICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCA9IENvZGVHZW5PcHQ6OkRlZmF1bHQ7CisKKyAgLy8vIENvbnRhaW5zIHRhcmdldCBzcGVjaWZpYyBhc20gaW5mb3JtYXRpb24uCisgIGNvbnN0IE1DQXNtSW5mbyAqQXNtSW5mbzsKKworICBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqTVJJOworICBjb25zdCBNQ0luc3RySW5mbyAqTUlJOworICBjb25zdCBNQ1N1YnRhcmdldEluZm8gKlNUSTsKKworICB1bnNpZ25lZCBSZXF1aXJlU3RydWN0dXJlZENGRyA6IDE7CisgIHVuc2lnbmVkIE8wV2FudHNGYXN0SVNlbCA6IDE7CisKK3B1YmxpYzoKKyAgY29uc3QgVGFyZ2V0T3B0aW9ucyBEZWZhdWx0T3B0aW9uczsKKyAgbXV0YWJsZSBUYXJnZXRPcHRpb25zIE9wdGlvbnM7CisKKyAgVGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXRNYWNoaW5lICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBUYXJnZXRNYWNoaW5lICYpID0gZGVsZXRlOworICB2aXJ0dWFsIH5UYXJnZXRNYWNoaW5lKCk7CisKKyAgY29uc3QgVGFyZ2V0ICZnZXRUYXJnZXQoKSBjb25zdCB7IHJldHVybiBUaGVUYXJnZXQ7IH0KKworICBjb25zdCBUcmlwbGUgJmdldFRhcmdldFRyaXBsZSgpIGNvbnN0IHsgcmV0dXJuIFRhcmdldFRyaXBsZTsgfQorICBTdHJpbmdSZWYgZ2V0VGFyZ2V0Q1BVKCkgY29uc3QgeyByZXR1cm4gVGFyZ2V0Q1BVOyB9CisgIFN0cmluZ1JlZiBnZXRUYXJnZXRGZWF0dXJlU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gVGFyZ2V0RlM7IH0KKworICAvLy8gVmlydHVhbCBtZXRob2QgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0aGF0IHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhhdAorICAvLy8gdGFyZ2V0J3MgVGFyZ2V0U3VidGFyZ2V0SW5mby1kZXJpdmVkIG1lbWJlciB2YXJpYWJsZS4KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRTdWJ0YXJnZXRJbmZvICpnZXRTdWJ0YXJnZXRJbXBsKGNvbnN0IEZ1bmN0aW9uICYpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICB2aXJ0dWFsIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZSAqZ2V0T2JqRmlsZUxvd2VyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzcGVjaWZpZWQgdHlwZSBvZgorICAvLy8gVGFyZ2V0U3VidGFyZ2V0SW5mby4gIEluIGRlYnVnIGJ1aWxkcywgaXQgdmVyaWZpZXMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nCisgIC8vLyByZXR1cm5lZCBpcyBvZiB0aGUgY29ycmVjdCB0eXBlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU1RDPiBjb25zdCBTVEMgJmdldFN1YnRhcmdldChjb25zdCBGdW5jdGlvbiAmRikgY29uc3QgeworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgU1RDKj4oZ2V0U3VidGFyZ2V0SW1wbChGKSk7CisgIH0KKworICAvLy8gQ3JlYXRlIGEgRGF0YUxheW91dC4KKyAgY29uc3QgRGF0YUxheW91dCBjcmVhdGVEYXRhTGF5b3V0KCkgY29uc3QgeyByZXR1cm4gREw7IH0KKworICAvLy8gVGVzdCBpZiBhIERhdGFMYXlvdXQgaWYgY29tcGF0aWJsZSB3aXRoIHRoZSBDb2RlR2VuIGZvciB0aGlzIHRhcmdldC4KKyAgLy8vCisgIC8vLyBUaGUgTExWTSBNb2R1bGUgb3ducyBhIERhdGFMYXlvdXQgdGhhdCBpcyB1c2VkIGZvciB0aGUgdGFyZ2V0IGluZGVwZW5kZW50CisgIC8vLyBvcHRpbWl6YXRpb25zIGFuZCBjb2RlIGdlbmVyYXRpb24uIFRoaXMgaG9vayBwcm92aWRlcyBhIHRhcmdldCBzcGVjaWZpYworICAvLy8gY2hlY2sgb24gdGhlIHZhbGlkaXR5IG9mIHRoaXMgRGF0YUxheW91dC4KKyAgYm9vbCBpc0NvbXBhdGlibGVEYXRhTGF5b3V0KGNvbnN0IERhdGFMYXlvdXQgJkNhbmRpZGF0ZSkgY29uc3QgeworICAgIHJldHVybiBETCA9PSBDYW5kaWRhdGU7CisgIH0KKworICAvLy8gR2V0IHRoZSBwb2ludGVyIHNpemUgZm9yIHRoaXMgdGFyZ2V0LgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdGhlIG9ubHkgdGltZSB0aGUgRGF0YUxheW91dCBpbiB0aGUgVGFyZ2V0TWFjaGluZSBpcyB1c2VkLgorICB1bnNpZ25lZCBnZXRQb2ludGVyU2l6ZSh1bnNpZ25lZCBBUykgY29uc3QgeworICAgIHJldHVybiBETC5nZXRQb2ludGVyU2l6ZShBUyk7CisgIH0KKworICB1bnNpZ25lZCBnZXRQb2ludGVyU2l6ZUluQml0cyh1bnNpZ25lZCBBUykgY29uc3QgeworICAgIHJldHVybiBETC5nZXRQb2ludGVyU2l6ZUluQml0cyhBUyk7CisgIH0KKworICB1bnNpZ25lZCBnZXRQcm9ncmFtUG9pbnRlclNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIERMLmdldFBvaW50ZXJTaXplKERMLmdldFByb2dyYW1BZGRyZXNzU3BhY2UoKSk7CisgIH0KKworICB1bnNpZ25lZCBnZXRBbGxvY2FQb2ludGVyU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gREwuZ2V0UG9pbnRlclNpemUoREwuZ2V0QWxsb2NhQWRkclNwYWNlKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXNldCB0aGUgdGFyZ2V0IG9wdGlvbnMgYmFzZWQgb24gdGhlIGZ1bmN0aW9uJ3MgYXR0cmlidXRlcy4KKyAgLy8gRklYTUU6IFJlbW92ZSBUYXJnZXRPcHRpb25zIHRoYXQgYWZmZWN0IHBlci1mdW5jdGlvbiBjb2RlIGdlbmVyYXRpb24KKyAgLy8gZnJvbSBUYXJnZXRNYWNoaW5lLgorICB2b2lkIHJlc2V0VGFyZ2V0T3B0aW9ucyhjb25zdCBGdW5jdGlvbiAmRikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0YXJnZXQgc3BlY2lmaWMgYXNtIGluZm9ybWF0aW9uLgorICBjb25zdCBNQ0FzbUluZm8gKmdldE1DQXNtSW5mbygpIGNvbnN0IHsgcmV0dXJuIEFzbUluZm87IH0KKworICBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqZ2V0TUNSZWdpc3RlckluZm8oKSBjb25zdCB7IHJldHVybiBNUkk7IH0KKyAgY29uc3QgTUNJbnN0ckluZm8gKmdldE1DSW5zdHJJbmZvKCkgY29uc3QgeyByZXR1cm4gTUlJOyB9CisgIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAqZ2V0TUNTdWJ0YXJnZXRJbmZvKCkgY29uc3QgeyByZXR1cm4gU1RJOyB9CisKKyAgLy8vIElmIGludHJpbnNpYyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUsIHJldHVybiBpdC4gIElmIG5vdCwgcmV0dXJuIG51bGwuCisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0SW50cmluc2ljSW5mbyAqZ2V0SW50cmluc2ljSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGJvb2wgcmVxdWlyZXNTdHJ1Y3R1cmVkQ0ZHKCkgY29uc3QgeyByZXR1cm4gUmVxdWlyZVN0cnVjdHVyZWRDRkc7IH0KKyAgdm9pZCBzZXRSZXF1aXJlc1N0cnVjdHVyZWRDRkcoYm9vbCBWYWx1ZSkgeyBSZXF1aXJlU3RydWN0dXJlZENGRyA9IFZhbHVlOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIGNvZGUgZ2VuZXJhdGlvbiByZWxvY2F0aW9uIG1vZGVsLiBUaGUgY2hvaWNlcyBhcmUgc3RhdGljLCBQSUMsCisgIC8vLyBhbmQgZHluYW1pYy1uby1waWMsIGFuZCB0YXJnZXQgZGVmYXVsdC4KKyAgUmVsb2M6Ok1vZGVsIGdldFJlbG9jYXRpb25Nb2RlbCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBjb2RlIG1vZGVsLiBUaGUgY2hvaWNlcyBhcmUgc21hbGwsIGtlcm5lbCwgbWVkaXVtLCBsYXJnZSwgYW5kCisgIC8vLyB0YXJnZXQgZGVmYXVsdC4KKyAgQ29kZU1vZGVsOjpNb2RlbCBnZXRDb2RlTW9kZWwoKSBjb25zdDsKKworICBib29sIGlzUG9zaXRpb25JbmRlcGVuZGVudCgpIGNvbnN0OworCisgIGJvb2wgc2hvdWxkQXNzdW1lRFNPTG9jYWwoY29uc3QgTW9kdWxlICZNLCBjb25zdCBHbG9iYWxWYWx1ZSAqR1YpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyB0YXJnZXQgdXNlcyBlbXVsYXRlZCBUTFMuCisgIGJvb2wgdXNlRW11bGF0ZWRUTFMoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgVExTIG1vZGVsIHdoaWNoIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gZ2xvYmFsIHZhcmlhYmxlLgorICBUTFNNb2RlbDo6TW9kZWwgZ2V0VExTTW9kZWwoY29uc3QgR2xvYmFsVmFsdWUgKkdWKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgb3B0aW1pemF0aW9uIGxldmVsOiBOb25lLCBMZXNzLCBEZWZhdWx0LCBvciBBZ2dyZXNzaXZlLgorICBDb2RlR2VuT3B0OjpMZXZlbCBnZXRPcHRMZXZlbCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgT3ZlcnJpZGVzIHRoZSBvcHRpbWl6YXRpb24gbGV2ZWwuCisgIHZvaWQgc2V0T3B0TGV2ZWwoQ29kZUdlbk9wdDo6TGV2ZWwgTGV2ZWwpOworCisgIHZvaWQgc2V0RmFzdElTZWwoYm9vbCBFbmFibGUpIHsgT3B0aW9ucy5FbmFibGVGYXN0SVNlbCA9IEVuYWJsZTsgfQorICBib29sIGdldE8wV2FudHNGYXN0SVNlbCgpIHsgcmV0dXJuIE8wV2FudHNGYXN0SVNlbDsgfQorICB2b2lkIHNldE8wV2FudHNGYXN0SVNlbChib29sIEVuYWJsZSkgeyBPMFdhbnRzRmFzdElTZWwgPSBFbmFibGU7IH0KKyAgdm9pZCBzZXRHbG9iYWxJU2VsKGJvb2wgRW5hYmxlKSB7IE9wdGlvbnMuRW5hYmxlR2xvYmFsSVNlbCA9IEVuYWJsZTsgfQorCisgIGJvb2wgc2hvdWxkUHJpbnRNYWNoaW5lQ29kZSgpIGNvbnN0IHsgcmV0dXJuIE9wdGlvbnMuUHJpbnRNYWNoaW5lQ29kZTsgfQorCisgIGJvb2wgZ2V0VW5pcXVlU2VjdGlvbk5hbWVzKCkgY29uc3QgeyByZXR1cm4gT3B0aW9ucy5VbmlxdWVTZWN0aW9uTmFtZXM7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgZGF0YSBvYmplY3RzIHNob3VsZCBiZSBlbWl0dGVkIGludG8gdGhlaXIgb3duIHNlY3Rpb24sCisgIC8vLyBjb3JyZXNwb25kcyB0byAtZmRhdGEtc2VjdGlvbnMuCisgIGJvb2wgZ2V0RGF0YVNlY3Rpb25zKCkgY29uc3QgeworICAgIHJldHVybiBPcHRpb25zLkRhdGFTZWN0aW9uczsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBmdW5jdGlvbnMgc2hvdWxkIGJlIGVtaXR0ZWQgaW50byB0aGVpciBvd24gc2VjdGlvbiwKKyAgLy8vIGNvcnJlc3BvbmRpbmcgdG8gLWZmdW5jdGlvbi1zZWN0aW9ucy4KKyAgYm9vbCBnZXRGdW5jdGlvblNlY3Rpb25zKCkgY29uc3QgeworICAgIHJldHVybiBPcHRpb25zLkZ1bmN0aW9uU2VjdGlvbnM7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBhIFxjIFRhcmdldElSQW5hbHlzaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSB0YXJnZXQuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgbmV3IHBhc3MgbWFuYWdlcidzIHRhcmdldCBJUiBhbmFseXNpcyBwYXNzLAorICAvLy8gc2V0IHVwIGFwcHJvcHJpYXRlbHkgZm9yIHRoaXMgdGFyZ2V0IG1hY2hpbmUuIEV2ZW4gdGhlIG9sZCBwYXNzIG1hbmFnZXIKKyAgLy8vIHVzZXMgdGhpcyB0byBhbnN3ZXIgcXVlcmllcyBhYm91dCB0aGUgSVIuCisgIFRhcmdldElSQW5hbHlzaXMgZ2V0VGFyZ2V0SVJBbmFseXNpcygpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgVGFyZ2V0VHJhbnNmb3JtSW5mbyBmb3IgYSBnaXZlbiBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBUaGUgcmV0dXJuZWQgVGFyZ2V0VHJhbnNmb3JtSW5mbyBpcyBzcGVjaWFsaXplZCB0byB0aGUgc3VidGFyZ2V0CisgIC8vLyBjb3JyZXNwb25kaW5nIHRvIFxwIEYuCisgIHZpcnR1YWwgVGFyZ2V0VHJhbnNmb3JtSW5mbyBnZXRUYXJnZXRUcmFuc2Zvcm1JbmZvKGNvbnN0IEZ1bmN0aW9uICZGKTsKKworICAvLy8gQWxsb3cgdGhlIHRhcmdldCB0byBtb2RpZnkgdGhlIHBhc3MgbWFuYWdlciwgZS5nLiBieSBjYWxsaW5nCisgIC8vLyBQYXNzTWFuYWdlckJ1aWxkZXI6OmFkZEV4dGVuc2lvbi4KKyAgdmlydHVhbCB2b2lkIGFkanVzdFBhc3NNYW5hZ2VyKFBhc3NNYW5hZ2VyQnVpbGRlciAmKSB7fQorCisgIC8vLyBUaGVzZSBlbnVtcyBhcmUgbWVhbnQgdG8gYmUgcGFzc2VkIGludG8gYWRkUGFzc2VzVG9FbWl0RmlsZSB0byBpbmRpY2F0ZQorICAvLy8gd2hhdCB0eXBlIG9mIGZpbGUgdG8gZW1pdCwgYW5kIHJldHVybmVkIGJ5IGl0IHRvIGluZGljYXRlIHdoYXQgdHlwZSBvZgorICAvLy8gZmlsZSBjb3VsZCBhY3R1YWxseSBiZSBtYWRlLgorICBlbnVtIENvZGVHZW5GaWxlVHlwZSB7CisgICAgQ0dGVF9Bc3NlbWJseUZpbGUsCisgICAgQ0dGVF9PYmplY3RGaWxlLAorICAgIENHRlRfTnVsbCAgICAgICAgIC8vIERvIG5vdCBlbWl0IGFueSBvdXRwdXQuCisgIH07CisKKyAgLy8vIEFkZCBwYXNzZXMgdG8gdGhlIHNwZWNpZmllZCBwYXNzIG1hbmFnZXIgdG8gZ2V0IHRoZSBzcGVjaWZpZWQgZmlsZQorICAvLy8gZW1pdHRlZC4gIFR5cGljYWxseSB0aGlzIHdpbGwgaW52b2x2ZSBzZXZlcmFsIHN0ZXBzIG9mIGNvZGUgZ2VuZXJhdGlvbi4KKyAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiBlbWlzc2lvbiBvZiB0aGlzIGZpbGUgdHlwZSBpcyBub3QKKyAgLy8vIHN1cHBvcnRlZCwgb3IgZmFsc2Ugb24gc3VjY2Vzcy4KKyAgLy8vIFxwIE1NSSBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCwgaWYgc2V0IHRvIG5vbi1udWxscHRyLAorICAvLy8gd2lsbCBiZSB1c2VkIHRvIHNldCB0aGUgTWFjaGluZU1vZHVsb0luZm8gZm9yIHRoaXMgUE0uCisgIHZpcnR1YWwgYm9vbCBhZGRQYXNzZXNUb0VtaXRGaWxlKFBhc3NNYW5hZ2VyQmFzZSAmLCByYXdfcHdyaXRlX3N0cmVhbSAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuRmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLypEaXNhYmxlVmVyaWZ5Ki8gPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTW9kdWxlSW5mbyAqTU1JID0gbnVsbHB0cikgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIEFkZCBwYXNzZXMgdG8gdGhlIHNwZWNpZmllZCBwYXNzIG1hbmFnZXIgdG8gZ2V0IG1hY2hpbmUgY29kZSBlbWl0dGVkIHdpdGgKKyAgLy8vIHRoZSBNQ0pJVC4gVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIG1hY2hpbmUgY29kZSBpcyBub3Qgc3VwcG9ydGVkLiBJdAorICAvLy8gZmlsbHMgdGhlIE1DQ29udGV4dCBDdHggcG9pbnRlciB3aGljaCBjYW4gYmUgdXNlZCB0byBidWlsZCBjdXN0b20KKyAgLy8vIE1DU3RyZWFtZXIuCisgIC8vLworICB2aXJ0dWFsIGJvb2wgYWRkUGFzc2VzVG9FbWl0TUMoUGFzc01hbmFnZXJCYXNlICYsIE1DQ29udGV4dCAqJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19wd3JpdGVfc3RyZWFtICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qRGlzYWJsZVZlcmlmeSovID0gdHJ1ZSkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFRydWUgaWYgc3VidGFyZ2V0IGluc2VydHMgdGhlIGZpbmFsIHNjaGVkdWxpbmcgcGFzcyBvbiBpdHMgb3duLgorICAvLy8KKyAgLy8vIEJyYW5jaCByZWxheGF0aW9uLCB3aGljaCBtdXN0IGhhcHBlbiBhZnRlciBibG9jayBwbGFjZW1lbnQsIGNhbgorICAvLy8gb24gc29tZSB0YXJnZXRzIChlLmcuIFN5c3RlbVopIGV4cG9zZSBhZGRpdGlvbmFsIHBvc3QtUkEKKyAgLy8vIHNjaGVkdWxpbmcgb3Bwb3J0dW5pdGllcy4KKyAgdmlydHVhbCBib29sIHRhcmdldFNjaGVkdWxlc1Bvc3RSQVNjaGVkdWxpbmcoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfTsKKworICB2b2lkIGdldE5hbWVXaXRoUHJlZml4KFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmTmFtZSwgY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1hbmdsZXIgJk1hbmcsIGJvb2wgTWF5QWx3YXlzVXNlUHJpdmF0ZSA9IGZhbHNlKSBjb25zdDsKKyAgTUNTeW1ib2wgKmdldFN5bWJvbChjb25zdCBHbG9iYWxWYWx1ZSAqR1YpIGNvbnN0OworCisgIC8vLyBUcnVlIGlmIHRoZSB0YXJnZXQgdXNlcyBwaHlzaWNhbCByZWdzIGF0IFByb2xvZy9FcGlsb2cgaW5zZXJ0aW9uCisgIC8vLyB0aW1lLiBJZiB0cnVlIChtb3N0IG1hY2hpbmVzKSwgYWxsIHZyZWdzIG11c3QgYmUgYWxsb2NhdGVkIGJlZm9yZQorICAvLy8gUEVJLiBJZiBmYWxzZSAodmlydHVhbC1yZWdpc3RlciBtYWNoaW5lcyksIHRoZW4gY2FsbGVlLXNhdmUgcmVnaXN0ZXIKKyAgLy8vIHNwaWxsaW5nIGFuZCBzY2F2ZW5naW5nIGFyZSBub3QgbmVlZGVkIG9yIHVzZWQuCisgIHZpcnR1YWwgYm9vbCB1c2VzUGh5c1JlZ3NGb3JQRUkoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIFRydWUgaWYgdGhlIHRhcmdldCB3YW50cyB0byB1c2UgaW50ZXJwcm9jZWR1cmFsIHJlZ2lzdGVyIGFsbG9jYXRpb24gYnkKKyAgLy8vIGRlZmF1bHQuIFRoZSAtZW5hYmxlLWlwcmEgZmxhZyBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGlzLgorICB2aXJ0dWFsIGJvb2wgdXNlSVBSQSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8vLyBUaGlzIGNsYXNzIGRlc2NyaWJlcyBhIHRhcmdldCBtYWNoaW5lIHRoYXQgaXMgaW1wbGVtZW50ZWQgd2l0aCB0aGUgTExWTQorLy8vIHRhcmdldC1pbmRlcGVuZGVudCBjb2RlIGdlbmVyYXRvci4KKy8vLworY2xhc3MgTExWTVRhcmdldE1hY2hpbmUgOiBwdWJsaWMgVGFyZ2V0TWFjaGluZSB7Citwcm90ZWN0ZWQ6IC8vIENhbiBvbmx5IGNyZWF0ZSBzdWJjbGFzc2VzLgorICBMTFZNVGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXQgJlQsIFN0cmluZ1JlZiBEYXRhTGF5b3V0U3RyaW5nLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmlwbGUgJlRhcmdldFRyaXBsZSwgU3RyaW5nUmVmIENQVSwgU3RyaW5nUmVmIEZTLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRPcHRpb25zICZPcHRpb25zLCBSZWxvYzo6TW9kZWwgUk0sCisgICAgICAgICAgICAgICAgICAgIENvZGVNb2RlbDo6TW9kZWwgQ00sIENvZGVHZW5PcHQ6OkxldmVsIE9MKTsKKworICB2b2lkIGluaXRBc21JbmZvKCk7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBHZXQgYSBUYXJnZXRUcmFuc2Zvcm1JbmZvIGltcGxlbWVudGF0aW9uIGZvciB0aGUgdGFyZ2V0LgorICAvLy8KKyAgLy8vIFRoZSBUVEkgcmV0dXJuZWQgdXNlcyB0aGUgY29tbW9uIGNvZGUgZ2VuZXJhdG9yIHRvIGFuc3dlciBxdWVyaWVzIGFib3V0CisgIC8vLyB0aGUgSVIuCisgIFRhcmdldFRyYW5zZm9ybUluZm8gZ2V0VGFyZ2V0VHJhbnNmb3JtSW5mbyhjb25zdCBGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisKKyAgLy8vIENyZWF0ZSBhIHBhc3MgY29uZmlndXJhdGlvbiBvYmplY3QgdG8gYmUgdXNlZCBieSBhZGRQYXNzVG9FbWl0WCBtZXRob2RzCisgIC8vLyBmb3IgZ2VuZXJhdGluZyBhIHBpcGVsaW5lIG9mIENvZGVHZW4gcGFzc2VzLgorICB2aXJ0dWFsIFRhcmdldFBhc3NDb25maWcgKmNyZWF0ZVBhc3NDb25maWcoUGFzc01hbmFnZXJCYXNlICZQTSk7CisKKyAgLy8vIEFkZCBwYXNzZXMgdG8gdGhlIHNwZWNpZmllZCBwYXNzIG1hbmFnZXIgdG8gZ2V0IHRoZSBzcGVjaWZpZWQgZmlsZQorICAvLy8gZW1pdHRlZC4gIFR5cGljYWxseSB0aGlzIHdpbGwgaW52b2x2ZSBzZXZlcmFsIHN0ZXBzIG9mIGNvZGUgZ2VuZXJhdGlvbi4KKyAgLy8vIFxwIE1NSSBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCwgaWYgc2V0IHRvIG5vbi1udWxscHRyLAorICAvLy8gd2lsbCBiZSB1c2VkIHRvIHNldCB0aGUgTWFjaGluZU1vZHVsb0luZm9mb3IgdGhpcyBQTS4KKyAgYm9vbCBhZGRQYXNzZXNUb0VtaXRGaWxlKFBhc3NNYW5hZ2VyQmFzZSAmUE0sIHJhd19wd3JpdGVfc3RyZWFtICZPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuRmlsZVR5cGUgRmlsZVR5cGUsIGJvb2wgRGlzYWJsZVZlcmlmeSA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTW9kdWxlSW5mbyAqTU1JID0gbnVsbHB0cikgb3ZlcnJpZGU7CisKKyAgLy8vIEFkZCBwYXNzZXMgdG8gdGhlIHNwZWNpZmllZCBwYXNzIG1hbmFnZXIgdG8gZ2V0IG1hY2hpbmUgY29kZSBlbWl0dGVkIHdpdGgKKyAgLy8vIHRoZSBNQ0pJVC4gVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIG1hY2hpbmUgY29kZSBpcyBub3Qgc3VwcG9ydGVkLiBJdAorICAvLy8gZmlsbHMgdGhlIE1DQ29udGV4dCBDdHggcG9pbnRlciB3aGljaCBjYW4gYmUgdXNlZCB0byBidWlsZCBjdXN0b20KKyAgLy8vIE1DU3RyZWFtZXIuCisgIGJvb2wgYWRkUGFzc2VzVG9FbWl0TUMoUGFzc01hbmFnZXJCYXNlICZQTSwgTUNDb250ZXh0IComQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19wd3JpdGVfc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpc2FibGVWZXJpZnkgPSB0cnVlKSBvdmVycmlkZTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgaXMgZXhwZWN0ZWQgdG8gcGFzcyBhbGwgbWFjaGluZSB2ZXJpZmllcgorICAvLy8gY2hlY2tzLiBUaGlzIGlzIGEgc3RvcGdhcCBtZWFzdXJlIHRvIGZpeCB0YXJnZXRzIG9uZSBieSBvbmUuIFdlIHdpbGwKKyAgLy8vIHJlbW92ZSB0aGlzIGF0IHNvbWUgcG9pbnQgYW5kIGFsd2F5cyBlbmFibGUgdGhlIHZlcmlmaWVyIHdoZW4KKyAgLy8vIEVYUEVOU0lWRV9DSEVDS1MgaXMgZW5hYmxlZC4KKyAgdmlydHVhbCBib29sIGlzTWFjaGluZVZlcmlmaWVyQ2xlYW4oKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIFxicmllZiBBZGRzIGFuIEFzbVByaW50ZXIgcGFzcyB0byB0aGUgcGlwZWxpbmUgdGhhdCBwcmludHMgYXNzZW1ibHkgb3IKKyAgLy8vIG1hY2hpbmUgY29kZSBmcm9tIHRoZSBNSSByZXByZXNlbnRhdGlvbi4KKyAgYm9vbCBhZGRBc21QcmludGVyKFBhc3NNYW5hZ2VyQmFzZSAmUE0sIHJhd19wd3JpdGVfc3RyZWFtICZPdXQsCisgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuRmlsZVR5cGUgRmlsZVRZcGUsIE1DQ29udGV4dCAmQ29udGV4dCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UQVJHRVRfVEFSR0VUTUFDSElORV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ0MDMxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaApAQCAtMCwwICsxLDI3OCBAQAorLy89PT0tLSBsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmggLSBUYXJnZXQgT3B0aW9ucyAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBjb21tYW5kIGxpbmUgb3B0aW9uIGZsYWdzIHRoYXQgYXJlIHNoYXJlZCBhY3Jvc3MgdmFyaW91cworLy8gdGFyZ2V0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFSR0VUX1RBUkdFVE9QVElPTlNfSAorI2RlZmluZSBMTFZNX1RBUkdFVF9UQVJHRVRPUFRJT05TX0gKKworI2luY2x1ZGUgImxsdm0vTUMvTUNUYXJnZXRPcHRpb25zLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworICBjbGFzcyBNb2R1bGU7CisKKyAgbmFtZXNwYWNlIEZsb2F0QUJJIHsKKyAgICBlbnVtIEFCSVR5cGUgeworICAgICAgRGVmYXVsdCwgLy8gVGFyZ2V0LXNwZWNpZmljIChlaXRoZXIgc29mdCBvciBoYXJkIGRlcGVuZGluZyBvbiB0cmlwbGUsIGV0YykuCisgICAgICBTb2Z0LCAgICAvLyBTb2Z0IGZsb2F0LgorICAgICAgSGFyZCAgICAgLy8gSGFyZCBmbG9hdC4KKyAgICB9OworICB9CisKKyAgbmFtZXNwYWNlIEZQT3BGdXNpb24geworICAgIGVudW0gRlBPcEZ1c2lvbk1vZGUgeworICAgICAgRmFzdCwgICAgIC8vIEVuYWJsZSBmdXNpb24gb2YgRlAgb3BzIHdoZXJldmVyIGl0J3MgcHJvZml0YWJsZS4KKyAgICAgIFN0YW5kYXJkLCAvLyBPbmx5IGFsbG93IGZ1c2lvbiBvZiAnYmxlc3NlZCcgb3BzIChjdXJyZW50bHkganVzdCBmbXVsYWRkKS4KKyAgICAgIFN0cmljdCAgICAvLyBOZXZlciBmdXNlIEZQLW9wcy4KKyAgICB9OworICB9CisKKyAgbmFtZXNwYWNlIEp1bXBUYWJsZSB7CisgICAgZW51bSBKdW1wVGFibGVUeXBlIHsKKyAgICAgIFNpbmdsZSwgICAgICAgICAgLy8gVXNlIGEgc2luZ2xlIHRhYmxlIGZvciBhbGwgaW5kaXJlY3QganVtcHRhYmxlIGNhbGxzLgorICAgICAgQXJpdHksICAgICAgICAgICAvLyBVc2Ugb25lIHRhYmxlIHBlciBudW1iZXIgb2YgZnVuY3Rpb24gcGFyYW1ldGVycy4KKyAgICAgIFNpbXBsaWZpZWQsICAgICAgLy8gVXNlIG9uZSB0YWJsZSBwZXIgZnVuY3Rpb24gdHlwZSwgd2l0aCB0eXBlcyBwcm9qZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50byA0IHR5cGVzOiBwb2ludGVyIHRvIG5vbi1mdW5jdGlvbiwgc3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmltaXRpdmUsIGFuZCBmdW5jdGlvbiBwb2ludGVyLgorICAgICAgRnVsbCAgICAgICAgICAgICAvLyBVc2Ugb25lIHRhYmxlIHBlciB1bmlxdWUgZnVuY3Rpb24gdHlwZQorICAgIH07CisgIH0KKworICBuYW1lc3BhY2UgVGhyZWFkTW9kZWwgeworICAgIGVudW0gTW9kZWwgeworICAgICAgUE9TSVgsICAvLyBQT1NJWCBUaHJlYWRzCisgICAgICBTaW5nbGUgIC8vIFNpbmdsZSBUaHJlYWRlZCBFbnZpcm9ubWVudAorICAgIH07CisgIH0KKworICBuYW1lc3BhY2UgRlBEZW5vcm1hbCB7CisgICAgZW51bSBEZW5vcm1hbE1vZGUgeworICAgICAgSUVFRSwgICAgICAgICAgIC8vIElFRUUgNzU0IGRlbm9ybWFsIG51bWJlcnMKKyAgICAgIFByZXNlcnZlU2lnbiwgICAvLyB0aGUgc2lnbiBvZiBhIGZsdXNoZWQtdG8temVybyBudW1iZXIgaXMgcHJlc2VydmVkIGluCisgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNpZ24gb2YgMAorICAgICAgUG9zaXRpdmVaZXJvICAgIC8vIGRlbm9ybWFscyBhcmUgZmx1c2hlZCB0byBwb3NpdGl2ZSB6ZXJvCisgICAgfTsKKyAgfQorCisgIGVudW0gY2xhc3MgRUFCSSB7CisgICAgVW5rbm93biwKKyAgICBEZWZhdWx0LCAvLyBEZWZhdWx0IG1lYW5zIG5vdCBzcGVjaWZpZWQKKyAgICBFQUJJNCwgICAvLyBUYXJnZXQtc3BlY2lmaWMgKGVpdGhlciA0LCA1IG9yIGdudSBkZXBlbmRpbmcgb24gdHJpcGxlKS4KKyAgICBFQUJJNSwKKyAgICBHTlUKKyAgfTsKKworICAvLy8gSWRlbnRpZnkgYSBkZWJ1Z2dlciBmb3IgInR1bmluZyIgdGhlIGRlYnVnIGluZm8uCisgIC8vLworICAvLy8gVGhlICJkZWJ1Z2dlciB0dW5pbmciIGNvbmNlcHQgYWxsb3dzIHVzIHRvIHByZXNlbnQgYSBtb3JlIGludHVpdGl2ZQorICAvLy8gaW50ZXJmYWNlIHRoYXQgdW5wYWNrcyBpbnRvIGRpZmZlcmVudCBzZXRzIG9mIGRlZmF1bHRzIGZvciB0aGUgdmFyaW91cworICAvLy8gaW5kaXZpZHVhbCBmZWF0dXJlLWZsYWcgc2V0dGluZ3MsIHRoYXQgc3VpdCB0aGUgcHJlZmVyZW5jZXMgb2YgdGhlCisgIC8vLyB2YXJpb3VzIGRlYnVnZ2Vycy4gIEhvd2V2ZXIsIGl0J3Mgd29ydGggcmVtZW1iZXJpbmcgdGhhdCBkZWJ1Z2dlcnMgYXJlCisgIC8vLyBub3QgdGhlIG9ubHkgY29uc3VtZXJzIG9mIGRlYnVnIGluZm8sIGFuZCBzb21lIHZhcmlhdGlvbnMgaW4gRFdBUkYgbWlnaHQKKyAgLy8vIGJldHRlciBiZSB0cmVhdGVkIGFzIHRhcmdldC9wbGF0Zm9ybSBpc3N1ZXMuIEZ1bmRhbWVudGFsbHksCisgIC8vLyBvIGlmIHRoZSBmZWF0dXJlIGlzIHVzZWZ1bCAob3Igbm90KSB0byBhIHBhcnRpY3VsYXIgZGVidWdnZXIsIHJlZ2FyZGxlc3MKKyAgLy8vICAgb2YgdGhlIHRhcmdldCwgdGhhdCdzIGEgdHVuaW5nIGRlY2lzaW9uOworICAvLy8gbyBpZiB0aGUgZmVhdHVyZSBpcyB1c2VmdWwgKG9yIG5vdCkgb24gYSBwYXJ0aWN1bGFyIHBsYXRmb3JtLCByZWdhcmRsZXNzCisgIC8vLyAgIG9mIHRoZSBkZWJ1Z2dlciwgdGhhdCdzIGEgdGFyZ2V0IGRlY2lzaW9uLgorICAvLy8gSXQncyBub3QgaW1wb3NzaWJsZSB0byBzZWUgYm90aCBmYWN0b3JzIGluIHNvbWUgc3BlY2lmaWMgY2FzZS4KKyAgLy8vCisgIC8vLyBUaGUgInR1bmluZyIgc2hvdWxkIGJlIHVzZWQgdG8gc2V0IGRlZmF1bHRzIGZvciBpbmRpdmlkdWFsIGZlYXR1cmUgZmxhZ3MKKyAgLy8vIGluIER3YXJmRGVidWc7IGlmIGEgZ2l2ZW4gZmVhdHVyZSBoYXMgYSBtb3JlIHNwZWNpZmljIGNvbW1hbmQtbGluZSBvcHRpb24sCisgIC8vLyB0aGF0IG9wdGlvbiBzaG91bGQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIHR1bmluZy4KKyAgZW51bSBjbGFzcyBEZWJ1Z2dlcktpbmQgeworICAgIERlZmF1bHQsICAvLyBObyBzcGVjaWZpYyB0dW5pbmcgcmVxdWVzdGVkLgorICAgIEdEQiwgICAgICAvLyBUdW5lIGRlYnVnIGluZm8gZm9yIGdkYi4KKyAgICBMTERCLCAgICAgLy8gVHVuZSBkZWJ1ZyBpbmZvIGZvciBsbGRiLgorICAgIFNDRSAgICAgICAvLyBUdW5lIGRlYnVnIGluZm8gZm9yIFNDRSB0YXJnZXRzIChlLmcuIFBTNCkuCisgIH07CisKKyAgY2xhc3MgVGFyZ2V0T3B0aW9ucyB7CisgIHB1YmxpYzoKKyAgICBUYXJnZXRPcHRpb25zKCkKKyAgICAgICAgOiBQcmludE1hY2hpbmVDb2RlKGZhbHNlKSwgVW5zYWZlRlBNYXRoKGZhbHNlKSwgTm9JbmZzRlBNYXRoKGZhbHNlKSwKKyAgICAgICAgICBOb05hTnNGUE1hdGgoZmFsc2UpLCBOb1RyYXBwaW5nRlBNYXRoKGZhbHNlKSwKKyAgICAgICAgICBOb1NpZ25lZFplcm9zRlBNYXRoKGZhbHNlKSwKKyAgICAgICAgICBIb25vclNpZ25EZXBlbmRlbnRSb3VuZGluZ0ZQTWF0aE9wdGlvbihmYWxzZSksIE5vWmVyb3NJbkJTUyhmYWxzZSksCisgICAgICAgICAgR3VhcmFudGVlZFRhaWxDYWxsT3B0KGZhbHNlKSwgU3RhY2tTeW1ib2xPcmRlcmluZyh0cnVlKSwKKyAgICAgICAgICBFbmFibGVGYXN0SVNlbChmYWxzZSksIEVuYWJsZUdsb2JhbElTZWwoZmFsc2UpLCBVc2VJbml0QXJyYXkoZmFsc2UpLAorICAgICAgICAgIERpc2FibGVJbnRlZ3JhdGVkQVMoZmFsc2UpLCBSZWxheEVMRlJlbG9jYXRpb25zKGZhbHNlKSwKKyAgICAgICAgICBGdW5jdGlvblNlY3Rpb25zKGZhbHNlKSwgRGF0YVNlY3Rpb25zKGZhbHNlKSwKKyAgICAgICAgICBVbmlxdWVTZWN0aW9uTmFtZXModHJ1ZSksIFRyYXBVbnJlYWNoYWJsZShmYWxzZSksCisgICAgICAgICAgRW11bGF0ZWRUTFMoZmFsc2UpLCBFeHBsaWNpdEVtdWxhdGVkVExTKGZhbHNlKSwKKyAgICAgICAgICBFbmFibGVJUFJBKGZhbHNlKSwgRW1pdFN0YWNrU2l6ZVNlY3Rpb24oZmFsc2UpIHt9CisKKyAgICAvLy8gUHJpbnRNYWNoaW5lQ29kZSAtIFRoaXMgZmxhZyBpcyBlbmFibGVkIHdoZW4gdGhlIC1wcmludC1tYWNoaW5laW5zdHJzCisgICAgLy8vIG9wdGlvbiBpcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgYW5kIHNob3VsZCBlbmFibGUgZGVidWdnaW5nCisgICAgLy8vIG91dHB1dCBmcm9tIHRoZSBjb2RlIGdlbmVyYXRvci4KKyAgICB1bnNpZ25lZCBQcmludE1hY2hpbmVDb2RlIDogMTsKKworICAgIC8vLyBEaXNhYmxlRnJhbWVQb2ludGVyRWxpbSAtIFRoaXMgcmV0dXJucyB0cnVlIGlmIGZyYW1lIHBvaW50ZXIgZWxpbWluYXRpb24KKyAgICAvLy8gb3B0aW1pemF0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCBmb3IgdGhlIGdpdmVuIG1hY2hpbmUgZnVuY3Rpb24uCisgICAgYm9vbCBEaXNhYmxlRnJhbWVQb2ludGVyRWxpbShjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAgIC8vLyBVbnNhZmVGUE1hdGggLSBUaGlzIGZsYWcgaXMgZW5hYmxlZCB3aGVuIHRoZQorICAgIC8vLyAtZW5hYmxlLXVuc2FmZS1mcC1tYXRoIGZsYWcgaXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBXaGVuCisgICAgLy8vIHRoaXMgZmxhZyBpcyBvZmYgKHRoZSBkZWZhdWx0KSwgdGhlIGNvZGUgZ2VuZXJhdG9yIGlzIG5vdCBhbGxvd2VkIHRvCisgICAgLy8vIHByb2R1Y2UgcmVzdWx0cyB0aGF0IGFyZSAibGVzcyBwcmVjaXNlIiB0aGFuIElFRUUgYWxsb3dzLiAgVGhpcyBpbmNsdWRlcworICAgIC8vLyB1c2Ugb2YgWDg2IGluc3RydWN0aW9ucyBsaWtlIEZTSU4gYW5kIEZDT1MgaW5zdGVhZCBvZiBsaWJjYWxscy4KKyAgICB1bnNpZ25lZCBVbnNhZmVGUE1hdGggOiAxOworCisgICAgLy8vIE5vSW5mc0ZQTWF0aCAtIFRoaXMgZmxhZyBpcyBlbmFibGVkIHdoZW4gdGhlCisgICAgLy8vIC1lbmFibGUtbm8taW5mcy1mcC1tYXRoIGZsYWcgaXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuIFdoZW4KKyAgICAvLy8gdGhpcyBmbGFnIGlzIG9mZiAodGhlIGRlZmF1bHQpLCB0aGUgY29kZSBnZW5lcmF0b3IgaXMgbm90IGFsbG93ZWQgdG8KKyAgICAvLy8gYXNzdW1lIHRoZSBGUCBhcml0aG1ldGljIGFyZ3VtZW50cyBhbmQgcmVzdWx0cyBhcmUgbmV2ZXIgKy1JbmZzLgorICAgIHVuc2lnbmVkIE5vSW5mc0ZQTWF0aCA6IDE7CisKKyAgICAvLy8gTm9OYU5zRlBNYXRoIC0gVGhpcyBmbGFnIGlzIGVuYWJsZWQgd2hlbiB0aGUKKyAgICAvLy8gLWVuYWJsZS1uby1uYW5zLWZwLW1hdGggZmxhZyBpcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gV2hlbgorICAgIC8vLyB0aGlzIGZsYWcgaXMgb2ZmICh0aGUgZGVmYXVsdCksIHRoZSBjb2RlIGdlbmVyYXRvciBpcyBub3QgYWxsb3dlZCB0bworICAgIC8vLyBhc3N1bWUgdGhlIEZQIGFyaXRobWV0aWMgYXJndW1lbnRzIGFuZCByZXN1bHRzIGFyZSBuZXZlciBOYU5zLgorICAgIHVuc2lnbmVkIE5vTmFOc0ZQTWF0aCA6IDE7CisKKyAgICAvLy8gTm9UcmFwcGluZ0ZQTWF0aCAtIFRoaXMgZmxhZyBpcyBlbmFibGVkIHdoZW4gdGhlCisgICAgLy8vIC1lbmFibGUtbm8tdHJhcHBpbmctZnAtbWF0aCBpcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gVGhpcworICAgIC8vLyBzcGVjaWZpZXMgdGhhdCB0aGVyZSBhcmUgbm8gdHJhcCBoYW5kbGVycyB0byBoYW5kbGUgZXhjZXB0aW9ucy4KKyAgICB1bnNpZ25lZCBOb1RyYXBwaW5nRlBNYXRoIDogMTsKKworICAgIC8vLyBOb1NpZ25lZFplcm9zRlBNYXRoIC0gVGhpcyBmbGFnIGlzIGVuYWJsZWQgd2hlbiB0aGUKKyAgICAvLy8gLWVuYWJsZS1uby1zaWduZWQtemVyb3MtZnAtbWF0aCBpcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gVGhpcworICAgIC8vLyBzcGVjaWZpZXMgdGhhdCBvcHRpbWl6YXRpb25zIGFyZSBhbGxvd2VkIHRvIHRyZWF0IHRoZSBzaWduIG9mIGEgemVybworICAgIC8vLyBhcmd1bWVudCBvciByZXN1bHQgYXMgaW5zaWduaWZpY2FudC4KKyAgICB1bnNpZ25lZCBOb1NpZ25lZFplcm9zRlBNYXRoIDogMTsKKworICAgIC8vLyBIb25vclNpZ25EZXBlbmRlbnRSb3VuZGluZ0ZQTWF0aCAtIFRoaXMgcmV0dXJucyB0cnVlIHdoZW4gdGhlCisgICAgLy8vIC1lbmFibGUtc2lnbi1kZXBlbmRlbnQtcm91bmRpbmctZnAtbWF0aCBpcyBzcGVjaWZpZWQuICBJZiB0aGlzIHJldHVybnMKKyAgICAvLy8gZmFsc2UgKHRoZSBkZWZhdWx0KSwgdGhlIGNvZGUgZ2VuZXJhdG9yIGlzIGFsbG93ZWQgdG8gYXNzdW1lIHRoYXQgdGhlCisgICAgLy8vIHJvdW5kaW5nIGJlaGF2aW9yIGlzIHRoZSBkZWZhdWx0IChyb3VuZC10by16ZXJvIGZvciBhbGwgZmxvYXRpbmcgcG9pbnQKKyAgICAvLy8gdG8gaW50ZWdlciBjb252ZXJzaW9ucywgYW5kIHJvdW5kLXRvLW5lYXJlc3QgZm9yIGFsbCBvdGhlciBhcml0aG1ldGljCisgICAgLy8vIHRydW5jYXRpb25zKS4gIElmIHRoaXMgaXMgZW5hYmxlZCAoc2V0IHRvIHRydWUpLCB0aGUgY29kZSBnZW5lcmF0b3IgbXVzdAorICAgIC8vLyBhc3N1bWUgdGhhdCB0aGUgcm91bmRpbmcgbW9kZSBtYXkgZHluYW1pY2FsbHkgY2hhbmdlLgorICAgIHVuc2lnbmVkIEhvbm9yU2lnbkRlcGVuZGVudFJvdW5kaW5nRlBNYXRoT3B0aW9uIDogMTsKKyAgICBib29sIEhvbm9yU2lnbkRlcGVuZGVudFJvdW5kaW5nRlBNYXRoKCkgY29uc3Q7CisKKyAgICAvLy8gTm9aZXJvc0luQlNTIC0gQnkgZGVmYXVsdCBzb21lIGNvZGVnZW5zIHBsYWNlIHplcm8taW5pdGlhbGl6ZWQgZGF0YSB0bworICAgIC8vLyAuYnNzIHNlY3Rpb24uIFRoaXMgZmxhZyBkaXNhYmxlcyBzdWNoIGJlaGF2aW91ciAobmVjZXNzYXJ5LCBlLmcuIGZvcgorICAgIC8vLyBjcnQqLm8gY29tcGlsaW5nKS4KKyAgICB1bnNpZ25lZCBOb1plcm9zSW5CU1MgOiAxOworCisgICAgLy8vIEd1YXJhbnRlZWRUYWlsQ2FsbE9wdCAtIFRoaXMgZmxhZyBpcyBlbmFibGVkIHdoZW4gLXRhaWxjYWxsb3B0IGlzCisgICAgLy8vIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZGxpbmUuIFdoZW4gdGhlIGZsYWcgaXMgb24sIHBhcnRpY2lwYXRpbmcgdGFyZ2V0cworICAgIC8vLyB3aWxsIHBlcmZvcm0gdGFpbCBjYWxsIG9wdGltaXphdGlvbiBvbiBhbGwgY2FsbHMgd2hpY2ggdXNlIHRoZSBmYXN0Y2MKKyAgICAvLy8gY2FsbGluZyBjb252ZW50aW9uIGFuZCB3aGljaCBzYXRpc2Z5IGNlcnRhaW4gdGFyZ2V0LWluZGVwZW5kZW50CisgICAgLy8vIGNyaXRlcmlhIChiZWluZyBhdCB0aGUgZW5kIG9mIGEgZnVuY3Rpb24sIGhhdmluZyB0aGUgc2FtZSByZXR1cm4gdHlwZQorICAgIC8vLyBhcyB0aGVpciBwYXJlbnQgZnVuY3Rpb24sIGV0Yy4pLCB1c2luZyBhbiBhbHRlcm5hdGUgQUJJIGlmIG5lY2Vzc2FyeS4KKyAgICB1bnNpZ25lZCBHdWFyYW50ZWVkVGFpbENhbGxPcHQgOiAxOworCisgICAgLy8vIFN0YWNrQWxpZ25tZW50T3ZlcnJpZGUgLSBPdmVycmlkZSBkZWZhdWx0IHN0YWNrIGFsaWdubWVudCBmb3IgdGFyZ2V0LgorICAgIHVuc2lnbmVkIFN0YWNrQWxpZ25tZW50T3ZlcnJpZGUgPSAwOworCisgICAgLy8vIFN0YWNrU3ltYm9sT3JkZXJpbmcgLSBXaGVuIHRydWUsIHRoaXMgd2lsbCBhbGxvdyBDb2RlR2VuIHRvIG9yZGVyCisgICAgLy8vIHRoZSBsb2NhbCBzdGFjayBzeW1ib2xzIChmb3IgY29kZSBzaXplLCBjb2RlIGxvY2FsaXR5LCBvciBhbnkgb3RoZXIKKyAgICAvLy8gaGV1cmlzdGljcykuIFdoZW4gZmFsc2UsIHRoZSBsb2NhbCBzeW1ib2xzIGFyZSBsZWZ0IGluIHdoYXRldmVyIG9yZGVyCisgICAgLy8vIHRoZXkgd2VyZSBnZW5lcmF0ZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAgICB1bnNpZ25lZCBTdGFja1N5bWJvbE9yZGVyaW5nIDogMTsKKworICAgIC8vLyBFbmFibGVGYXN0SVNlbCAtIFRoaXMgZmxhZyBlbmFibGVzIGZhc3QtcGF0aCBpbnN0cnVjdGlvbiBzZWxlY3Rpb24KKyAgICAvLy8gd2hpY2ggdHJhZGVzIGF3YXkgZ2VuZXJhdGVkIGNvZGUgcXVhbGl0eSBpbiBmYXZvciBvZiByZWR1Y2luZworICAgIC8vLyBjb21waWxlIHRpbWUuCisgICAgdW5zaWduZWQgRW5hYmxlRmFzdElTZWwgOiAxOworCisgICAgLy8vIEVuYWJsZUdsb2JhbElTZWwgLSBUaGlzIGZsYWcgZW5hYmxlcyBnbG9iYWwgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uLgorICAgIHVuc2lnbmVkIEVuYWJsZUdsb2JhbElTZWwgOiAxOworCisgICAgLy8vIFVzZUluaXRBcnJheSAtIFVzZSAuaW5pdF9hcnJheSBpbnN0ZWFkIG9mIC5jdG9ycyBmb3Igc3RhdGljCisgICAgLy8vIGNvbnN0cnVjdG9ycy4KKyAgICB1bnNpZ25lZCBVc2VJbml0QXJyYXkgOiAxOworCisgICAgLy8vIERpc2FibGUgdGhlIGludGVncmF0ZWQgYXNzZW1ibGVyLgorICAgIHVuc2lnbmVkIERpc2FibGVJbnRlZ3JhdGVkQVMgOiAxOworCisgICAgLy8vIENvbXByZXNzIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgIERlYnVnQ29tcHJlc3Npb25UeXBlIENvbXByZXNzRGVidWdTZWN0aW9ucyA9IERlYnVnQ29tcHJlc3Npb25UeXBlOjpOb25lOworCisgICAgdW5zaWduZWQgUmVsYXhFTEZSZWxvY2F0aW9ucyA6IDE7CisKKyAgICAvLy8gRW1pdCBmdW5jdGlvbnMgaW50byBzZXBhcmF0ZSBzZWN0aW9ucy4KKyAgICB1bnNpZ25lZCBGdW5jdGlvblNlY3Rpb25zIDogMTsKKworICAgIC8vLyBFbWl0IGRhdGEgaW50byBzZXBhcmF0ZSBzZWN0aW9ucy4KKyAgICB1bnNpZ25lZCBEYXRhU2VjdGlvbnMgOiAxOworCisgICAgdW5zaWduZWQgVW5pcXVlU2VjdGlvbk5hbWVzIDogMTsKKworICAgIC8vLyBFbWl0IHRhcmdldC1zcGVjaWZpYyB0cmFwIGluc3RydWN0aW9uIGZvciAndW5yZWFjaGFibGUnIElSIGluc3RydWN0aW9ucy4KKyAgICB1bnNpZ25lZCBUcmFwVW5yZWFjaGFibGUgOiAxOworCisgICAgLy8vIEVtdWxhdGVkVExTIC0gVGhpcyBmbGFnIGVuYWJsZXMgZW11bGF0ZWQgVExTIG1vZGVsLCB1c2luZyBlbXV0bHMKKyAgICAvLy8gZnVuY3Rpb24gaW4gdGhlIHJ1bnRpbWUgbGlicmFyeS4uCisgICAgdW5zaWduZWQgRW11bGF0ZWRUTFMgOiAxOworCisgICAgLy8vIFdoZXRoZXIgLWVtdWxhdGVkLXRscyBvciAtbm8tZW11bGF0ZWQtdGxzIGlzIHNldC4KKyAgICB1bnNpZ25lZCBFeHBsaWNpdEVtdWxhdGVkVExTIDogMTsKKworICAgIC8vLyBUaGlzIGZsYWcgZW5hYmxlcyBJbnRlclByb2NlZHVyYWwgUmVnaXN0ZXIgQWxsb2NhdGlvbiAoSVBSQSkuCisgICAgdW5zaWduZWQgRW5hYmxlSVBSQSA6IDE7CisKKyAgICAvLy8gRW1pdCBzZWN0aW9uIGNvbnRhaW5pbmcgbWV0YWRhdGEgb24gZnVuY3Rpb24gc3RhY2sgc2l6ZXMuCisgICAgdW5zaWduZWQgRW1pdFN0YWNrU2l6ZVNlY3Rpb24gOiAxOworCisgICAgLy8vIEZsb2F0QUJJVHlwZSAtIFRoaXMgc2V0dGluZyBpcyBzZXQgYnkgLWZsb2F0LWFiaT14eHggb3B0aW9uIGlzIHNwZWNmaWVkCisgICAgLy8vIG9uIHRoZSBjb21tYW5kIGxpbmUuIFRoaXMgc2V0dGluZyBtYXkgZWl0aGVyIGJlIERlZmF1bHQsIFNvZnQsIG9yIEhhcmQuCisgICAgLy8vIERlZmF1bHQgc2VsZWN0cyB0aGUgdGFyZ2V0J3MgZGVmYXVsdCBiZWhhdmlvci4gU29mdCBzZWxlY3RzIHRoZSBBQkkgZm9yCisgICAgLy8vIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50LCBidXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBGUCBoYXJkd2FyZSBtYXkgbm90CisgICAgLy8vIGJlIHVzZWQuIFN1Y2ggYSBjb21iaW5hdGlvbiBpcyB1bmZvcnR1bmF0ZWx5IHBvcHVsYXIgKGUuZy4KKyAgICAvLy8gYXJtLWFwcGxlLWRhcndpbikuIEhhcmQgcHJlc3VtZXMgdGhhdCB0aGUgbm9ybWFsIEZQIEFCSSBpcyB1c2VkLgorICAgIEZsb2F0QUJJOjpBQklUeXBlIEZsb2F0QUJJVHlwZSA9IEZsb2F0QUJJOjpEZWZhdWx0OworCisgICAgLy8vIEFsbG93RlBPcEZ1c2lvbiAtIFRoaXMgZmxhZyBpcyBzZXQgYnkgdGhlIC1mdXNlLWZwLW9wcz14eHggb3B0aW9uLgorICAgIC8vLyBUaGlzIGNvbnRyb2xzIHRoZSBjcmVhdGlvbiBvZiBmdXNlZCBGUCBvcHMgdGhhdCBzdG9yZSBpbnRlcm1lZGlhdGUKKyAgICAvLy8gcmVzdWx0cyBpbiBoaWdoZXIgcHJlY2lzaW9uIHRoYW4gSUVFRSBhbGxvd3MgKEUuZy4gRk1BcykuCisgICAgLy8vCisgICAgLy8vIEZhc3QgbW9kZSAtIGFsbG93cyBmb3JtYXRpb24gb2YgZnVzZWQgRlAgb3BzIHdoZW5ldmVyIHRoZXkncmUKKyAgICAvLy8gcHJvZml0YWJsZS4KKyAgICAvLy8gU3RhbmRhcmQgbW9kZSAtIGFsbG93IGZ1c2lvbiBvbmx5IGZvciAnYmxlc3NlZCcgRlAgb3BzLiBBdCBwcmVzZW50IHRoZQorICAgIC8vLyBvbmx5IGJsZXNzZWQgb3AgaXMgdGhlIGZtdWxhZGQgaW50cmluc2ljLiBJbiB0aGUgZnV0dXJlIG1vcmUgYmxlc3NlZCBvcHMKKyAgICAvLy8gbWF5IGJlIGFkZGVkLgorICAgIC8vLyBTdHJpY3QgbW9kZSAtIGFsbG93IGZ1c2lvbiBvbmx5IGlmL3doZW4gaXQgY2FuIGJlIHByb3ZlbiB0aGF0IHRoZSBleGNlc3MKKyAgICAvLy8gcHJlY2lzaW9uIHdvbid0IGVmZmVjdCB0aGUgcmVzdWx0LgorICAgIC8vLworICAgIC8vLyBOb3RlOiBUaGlzIG9wdGlvbiBvbmx5IGNvbnRyb2xzIGZvcm1hdGlvbiBvZiBmdXNlZCBvcHMgYnkgdGhlCisgICAgLy8vIG9wdGltaXplcnMuICBGdXNlZCBvcGVyYXRpb25zIHRoYXQgYXJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIChlLmcuIEZNQQorICAgIC8vLyB2aWEgdGhlIGxsdm0uZm1hLiogaW50cmluc2ljKSB3aWxsIGFsd2F5cyBiZSBob25vcmVkLCByZWdhcmRsZXNzIG9mCisgICAgLy8vIHRoZSB2YWx1ZSBvZiB0aGlzIG9wdGlvbi4KKyAgICBGUE9wRnVzaW9uOjpGUE9wRnVzaW9uTW9kZSBBbGxvd0ZQT3BGdXNpb24gPSBGUE9wRnVzaW9uOjpTdGFuZGFyZDsKKworICAgIC8vLyBUaHJlYWRNb2RlbCAtIFRoaXMgZmxhZyBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhyZWFkaW5nIG1vZGVsIHRvIGFzc3VtZQorICAgIC8vLyBmb3IgdGhpbmdzIGxpa2UgYXRvbWljcworICAgIFRocmVhZE1vZGVsOjpNb2RlbCBUaHJlYWRNb2RlbCA9IFRocmVhZE1vZGVsOjpQT1NJWDsKKworICAgIC8vLyBFQUJJVmVyc2lvbiAtIFRoaXMgZmxhZyBzcGVjaWZpZXMgdGhlIEVBQkkgdmVyc2lvbgorICAgIEVBQkkgRUFCSVZlcnNpb24gPSBFQUJJOjpEZWZhdWx0OworCisgICAgLy8vIFdoaWNoIGRlYnVnZ2VyIHRvIHR1bmUgZm9yLgorICAgIERlYnVnZ2VyS2luZCBEZWJ1Z2dlclR1bmluZyA9IERlYnVnZ2VyS2luZDo6RGVmYXVsdDsKKworICAgIC8vLyBGUERlbm9ybWFsTW9kZSAtIFRoaXMgZmxhZ3Mgc3BlY2lmaWNpZXMgd2hpY2ggZGVub3JtYWwgbnVtYmVycyB0aGUgY29kZQorICAgIC8vLyBpcyBwZXJtaXR0ZWQgdG8gcmVxdWlyZS4KKyAgICBGUERlbm9ybWFsOjpEZW5vcm1hbE1vZGUgRlBEZW5vcm1hbE1vZGUgPSBGUERlbm9ybWFsOjpJRUVFOworCisgICAgLy8vIFdoYXQgZXhjZXB0aW9uIG1vZGVsIHRvIHVzZQorICAgIEV4Y2VwdGlvbkhhbmRsaW5nIEV4Y2VwdGlvbk1vZGVsID0gRXhjZXB0aW9uSGFuZGxpbmc6Ok5vbmU7CisKKyAgICAvLy8gTWFjaGluZSBsZXZlbCBvcHRpb25zLgorICAgIE1DVGFyZ2V0T3B0aW9ucyBNQ09wdGlvbnM7CisgIH07CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0U2NoZWR1bGUudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRTY2hlZHVsZS50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmE5YmFlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0U2NoZWR1bGUudGQKQEAgLTAsMCArMSw0NDQgQEAKKy8vPT09LSBUYXJnZXRTY2hlZHVsZS50ZCAtIFRhcmdldCBJbmRlcGVuZGVudCBTY2hlZHVsaW5nIC0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIHRhcmdldC1pbmRlcGVuZGVudCBzY2hlZHVsaW5nIGludGVyZmFjZXMgd2hpY2ggc2hvdWxkCisvLyBiZSBpbXBsZW1lbnRlZCBieSBlYWNoIHRhcmdldCB3aGljaCBpcyB1c2luZyBUYWJsZUdlbiBiYXNlZCBzY2hlZHVsaW5nLgorLy8KKy8vIFRoZSBTY2hlZE1hY2hpbmVNb2RlbCBpcyBkZWZpbmVkIGJ5IHN1YnRhcmdldHMgZm9yIHRocmVlIGNhdGVnb3JpZXMgb2YgZGF0YToKKy8vIDEuIEJhc2ljIHByb3BlcnRpZXMgZm9yIGNvYXJzZSBncmFpbmVkIGluc3RydWN0aW9uIGNvc3QgbW9kZWwuCisvLyAyLiBTY2hlZHVsZXIgUmVhZC9Xcml0ZSByZXNvdXJjZXMgZm9yIHNpbXBsZSBwZXItb3Bjb2RlIGNvc3QgbW9kZWwuCisvLyAzLiBJbnN0cnVjdGlvbiBpdGluZXJhcmllcyBmb3IgZGV0YWlsZWQgcmVzZXJ2YXRpb24gdGFibGVzLgorLy8KKy8vICgxKSBCYXNpYyBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBTY2hlZE1hY2hpbmVNb2RlbAorLy8gY2xhc3MuIFRhcmdldCBob29rcyBhbGxvdyBzdWJ0YXJnZXRzIHRvIGFzc29jaWF0ZSBvcGNvZGVzIHdpdGgKKy8vIHRob3NlIHByb3BlcnRpZXMuCisvLworLy8gKDIpIEEgcGVyLW9wZXJhbmQgbWFjaGluZSBtb2RlbCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gYW55CisvLyBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHdheXM6CisvLworLy8gQS4gQXNzb2NpYXRlIHBlci1vcGVyYW5kIFNjaGVkUmVhZFdyaXRlIHR5cGVzIHdpdGggSW5zdHJ1Y3Rpb25zIGJ5CisvLyBtb2RpZnlpbmcgdGhlIEluc3RydWN0aW9uIGRlZmluaXRpb24gdG8gaW5oZXJpdCBmcm9tIFNjaGVkLiBGb3IKKy8vIGVhY2ggc3VidGFyZ2V0LCBkZWZpbmUgV3JpdGVSZXMgYW5kIFJlYWRBZHZhbmNlIHRvIGFzc29jaWF0ZQorLy8gcHJvY2Vzc29yIHJlc291cmNlcyBhbmQgbGF0ZW5jeSB3aXRoIGVhY2ggU2NoZWRSZWFkV3JpdGUgdHlwZS4KKy8vCisvLyBCLiBJbiBlYWNoIGluc3RydWN0aW9uIGRlZmluaXRpb24sIG5hbWUgYW4gSXRpbmVyYXJ5Q2xhc3MuIEZvciBlYWNoCisvLyBzdWJ0YXJnZXQsIGRlZmluZSBJdGluUlcgZW50cmllcyB0byBtYXAgSXRpbmVyYXJ5Q2xhc3MgdG8KKy8vIHBlci1vcGVyYW5kIFNjaGVkUmVhZFdyaXRlIHR5cGVzLiBVbmxpa2UgbWV0aG9kIEEsIHRoZXNlIHR5cGVzIG1heQorLy8gYmUgc3VidGFyZ2V0IHNwZWNpZmljIGFuZCBjYW4gYmUgZGlyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlcworLy8gYnkgZGVmaW5pbmcgU2NoZWRXcml0ZVJlcyBhbmQgU2NoZWRSZWFkQWR2YW5jZS4KKy8vCisvLyBDLiBJbiB0aGUgc3VidGFyZ2V0LCBtYXAgU2NoZWRSZWFkV3JpdGUgdHlwZXMgdG8gc3BlY2lmaWMKKy8vIG9wY29kZXMuIFRoaXMgb3ZlcnJpZGVzIGFueSBTY2hlZFJlYWRXcml0ZSB0eXBlcyBvcgorLy8gSXRpbmVyYXJ5Q2xhc3NlcyBkZWZpbmVkIGJ5IHRoZSBJbnN0cnVjdGlvbi4gQXMgaW4gbWV0aG9kIEIsIHRoZQorLy8gc3VidGFyZ2V0IGNhbiBkaXJlY3RseSBhc3NvY2lhdGUgcmVzb3VyY2VzIHdpdGggU2NoZWRSZWFkV3JpdGUKKy8vIHR5cGVzIGJ5IGRlZmluaW5nIFNjaGVkV3JpdGVSZXMgYW5kIFNjaGVkUmVhZEFkdmFuY2UuCisvLworLy8gRC4gSW4gZWl0aGVyIHRoZSB0YXJnZXQgb3Igc3VidGFyZ2V0LCBkZWZpbmUgU2NoZWRXcml0ZVZhcmlhbnQgb3IKKy8vIFNjaGVkUmVhZFZhcmlhbnQgdG8gbWFwIG9uZSBTY2hlZFJlYWRXcml0ZSB0eXBlIG9udG8gYW5vdGhlcgorLy8gc2VxdWVuY2Ugb2YgU2NoZWRSZWFkV3JpdGUgdHlwZXMuIFRoaXMgYWxsb3dzIGR5bmFtaWMgc2VsZWN0aW9uIG9mCisvLyBhbiBpbnN0cnVjdGlvbidzIG1hY2hpbmUgbW9kZWwgdmlhIGN1c3RvbSBDKysgY29kZS4gSXQgYWxzbyBhbGxvd3MKKy8vIGEgbWFjaGluZS1pbmRlcGVuZGVudCBTY2hlZFJlYWRXcml0ZSB0eXBlIHRvIG1hcCB0byBhIHNlcXVlbmNlIG9mCisvLyBtYWNoaW5lLWRlcGVuZGVudCB0eXBlcy4KKy8vCisvLyAoMykgQSBwZXItcGlwZWxpbmUtc3RhZ2UgbWFjaGluZSBtb2RlbCBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgcHJvdmlkaW5nCisvLyBJdGluZXJhcmllcyBpbiBhZGRpdGlvbiB0byBtYXBwaW5nIGluc3RydWN0aW9ucyB0byBJdGluZXJhcnlDbGFzc2VzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gSW5jbHVkZSBsZWdhY3kgc3VwcG9ydCBmb3IgaW5zdHJ1Y3Rpb24gaXRpbmVyYXJpZXMuCitpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRJdGluZXJhcnkudGQiCisKK2NsYXNzIEluc3RydWN0aW9uOyAvLyBGb3J3YXJkIGRlZgorCitjbGFzcyBQcmVkaWNhdGU7IC8vIEZvcndhcmQgZGVmCisKKy8vIERBRyBvcGVyYXRvciB0aGF0IGludGVycHJldHMgdGhlIERBRyBhcmdzIGFzIEluc3RydWN0aW9uIGRlZnMuCitkZWYgaW5zdHJzOworCisvLyBEQUcgb3BlcmF0b3IgdGhhdCBpbnRlcnByZXRzIGVhY2ggREFHIGFyZyBhcyBhIHJlZ2V4IHBhdHRlcm4gZm9yCisvLyBtYXRjaGluZyBJbnN0cnVjdGlvbiBvcGNvZGUgbmFtZXMuCisvLyBUaGUgcmVnZXggbXVzdCBtYXRjaCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvcGNvZGUgKGFzIGluIFB5dGhvbiByZS5tYXRjaCkuCisvLyBUbyBhdm9pZCBtYXRjaGluZyBwcmVmaXhlcywgYXBwZW5kICckJyB0byB0aGUgcGF0dGVybi4KK2RlZiBpbnN0cmVnZXg7CisKKy8vIERlZmluZSB0aGUgU2NoZWRNYWNoaW5lTW9kZWwgYW5kIHByb3ZpZGUgYmFzaWMgcHJvcGVydGllcyBmb3IKKy8vIGNvYXJzZSBncmFpbmVkIGluc3RydWN0aW9uIGNvc3QgbW9kZWwuIERlZmF1bHQgdmFsdWVzIGZvciB0aGUKKy8vIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgaW4gTUNTY2hlZE1vZGVsLiBBIHZhbHVlIG9mICItMSIgaW4gdGhlCisvLyB0YXJnZXQgZGVzY3JpcHRpb24ncyBTY2hlZE1hY2hpbmVNb2RlbCBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJvcGVydHkKKy8vIGlzIG5vdCBvdmVycmlkZW4gYnkgdGhlIHRhcmdldC4KKy8vCisvLyBUYXJnZXQgaG9va3MgYWxsb3cgc3VidGFyZ2V0cyB0byBhc3NvY2lhdGUgTG9hZExhdGVuY3kgYW5kCisvLyBIaWdoTGF0ZW5jeSB3aXRoIGdyb3VwcyBvZiBvcGNvZGVzLgorLy8KKy8vIFNlZSBNQ1NjaGVkdWxlLmggZm9yIGRldGFpbGVkIGNvbW1lbnRzLgorY2xhc3MgU2NoZWRNYWNoaW5lTW9kZWwgeworICBpbnQgSXNzdWVXaWR0aCA9IC0xOyAvLyBNYXggbWljcm8tb3BzIHRoYXQgbWF5IGJlIHNjaGVkdWxlZCBwZXIgY3ljbGUuCisgIGludCBNaWNyb09wQnVmZmVyU2l6ZSA9IC0xOyAvLyBNYXggbWljcm8tb3BzIHRoYXQgY2FuIGJlIGJ1ZmZlcmVkLgorICBpbnQgTG9vcE1pY3JvT3BCdWZmZXJTaXplID0gLTE7IC8vIE1heCBtaWNyby1vcHMgdGhhdCBjYW4gYmUgYnVmZmVyZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pemVkIGxvb3AgZGlzcGF0Y2gvZXhlY3V0aW9uLgorICBpbnQgTG9hZExhdGVuY3kgPSAtMTsgLy8gQ3ljbGVzIGZvciBsb2FkcyB0byBhY2Nlc3MgdGhlIGNhY2hlLgorICBpbnQgSGlnaExhdGVuY3kgPSAtMTsgLy8gQXBwcm94aW1hdGlvbiBvZiBjeWNsZXMgZm9yICJoaWdoIGxhdGVuY3kiIG9wcy4KKyAgaW50IE1pc3ByZWRpY3RQZW5hbHR5ID0gLTE7IC8vIEV4dHJhIGN5Y2xlcyBmb3IgYSBtaXNwcmVkaWN0ZWQgYnJhbmNoLgorCisgIC8vIFBlci1jeWNsZSByZXNvdXJjZXMgdGFibGVzLgorICBQcm9jZXNzb3JJdGluZXJhcmllcyBJdGluZXJhcmllcyA9IE5vSXRpbmVyYXJpZXM7CisKKyAgYml0IFBvc3RSQVNjaGVkdWxlciA9IDA7IC8vIEVuYWJsZSBQb3N0IFJlZ0FsbG9jIFNjaGVkdWxlciBwYXNzLgorCisgIC8vIFN1YnRhcmdldHMgdGhhdCBkZWZpbmUgYSBtb2RlbCBmb3Igb25seSBhIHN1YnNldCBvZiBpbnN0cnVjdGlvbnMKKyAgLy8gdGhhdCBoYXZlIGEgc2NoZWR1bGluZyBjbGFzcyAoaXRpbmVyYXJ5IGNsYXNzIG9yIFNjaGVkUlcgbGlzdCkKKyAgLy8gYW5kIG1heSBhY3R1YWxseSBiZSBnZW5lcmF0ZWQgZm9yIHRoYXQgc3VidGFyZ2V0IG11c3QgY2xlYXIgdGhpcworICAvLyBiaXQuIE90aGVyd2lzZSwgdGhlIHNjaGVkdWxlciBjb25zaWRlcnMgYW4gdW5tb2RlbGxlZCBvcGNvZGUgdG8KKyAgLy8gYmUgYW4gZXJyb3IuIFRoaXMgc2hvdWxkIG9ubHkgYmUgc2V0IGR1cmluZyBpbml0aWFsIGJyaW5ndXAsCisgIC8vIG9yIHRoZXJlIHdpbGwgYmUgbm8gd2F5IHRvIGNhdGNoIHNpbXBsZSBlcnJvcnMgaW4gdGhlIG1vZGVsCisgIC8vIHJlc3VsdGluZyBmcm9tIGNoYW5nZXMgdG8gdGhlIGluc3RydWN0aW9uIGRlZmluaXRpb25zLgorICBiaXQgQ29tcGxldGVNb2RlbCA9IDE7CisKKyAgLy8gSW5kaWNhdGVzIHRoYXQgd2Ugc2hvdWxkIGRvIGZ1bGwgb3ZlcmxhcCBjaGVja2luZyBmb3IgbXVsdGlwbGUgSW5zdHJSV3MKKyAgLy8gZGVmaW5pbmluZyB0aGUgc2FtZSBpbnN0cnVjdGlvbnMgd2l0aGluIHRoZSBzYW1lIFNjaGVkTWFjaGluZU1vZGVsLgorICAvLyBGSVhNRTogUmVtb3ZlIHdoZW4gYWxsIGluIHRyZWUgdGFyZ2V0cyBhcmUgY2xlYW4gd2l0aCB0aGUgZnVsbCBjaGVjaworICAvLyBlbmFibGVkLgorICBiaXQgRnVsbEluc3RSV092ZXJsYXBDaGVjayA9IDE7CisKKyAgLy8gQSBwcm9jZXNzb3IgbWF5IG9ubHkgaW1wbGVtZW50IHBhcnQgb2YgcHVibGlzaGVkIElTQSwgZHVlIHRvIGVpdGhlciBuZXcgSVNBCisgIC8vIGV4dGVuc2lvbnMsIChlLmcuIFBlbnRpdW0gNCBkb2Vzbid0IGhhdmUgQVZYKSBvciBpbXBsZW1lbnRhdGlvbgorICAvLyAoQVJNL01JUFMvUG93ZXJQQy9TUEFSQyBzb2Z0IGZsb2F0IGNvcmVzKS4KKyAgLy8KKyAgLy8gRm9yIGEgcHJvY2Vzc29yIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBzb21lIGZlYXR1cmUocyksIHRoZSBzY2hlZHVsZSBtb2RlbAorICAvLyBjYW4gdXNlOgorICAvLworICAvLyBsZXQ8UHJlZGljYXRlPiBVbnN1cHBvcnRlZEZlYXR1cmVzID0gW0hhdmVBLC4uLEhhdmVZXTsKKyAgLy8KKyAgLy8gdG8gc2tpcCB0aGUgY2hlY2tzIGZvciBzY2hlZHVsaW5nIGluZm9ybWF0aW9uIHdoZW4gYnVpbGRpbmcgTExWTSBmb3IKKyAgLy8gaW5zdHJ1Y3Rpb25zIHdoaWNoIGhhdmUgYW55IG9mIHRoZSBsaXN0ZWQgcHJlZGljYXRlcyBpbiB0aGVpciBQcmVkaWNhdGVzCisgIC8vIGZpZWxkLgorICBsaXN0PFByZWRpY2F0ZT4gVW5zdXBwb3J0ZWRGZWF0dXJlcyA9IFtdOworCisgIGJpdCBOb01vZGVsID0gMDsgLy8gU3BlY2lhbCB0YWcgdG8gaW5kaWNhdGUgbWlzc2luZyBtYWNoaW5lIG1vZGVsLgorfQorCitkZWYgTm9TY2hlZE1vZGVsIDogU2NoZWRNYWNoaW5lTW9kZWwgeworICBsZXQgTm9Nb2RlbCA9IDE7CisgIGxldCBDb21wbGV0ZU1vZGVsID0gMDsKK30KKworLy8gRGVmaW5lIGEga2luZCBvZiBwcm9jZXNzb3IgcmVzb3VyY2UgdGhhdCBtYXkgYmUgY29tbW9uIGFjcm9zcworLy8gc2ltaWxhciBzdWJ0YXJnZXRzLgorY2xhc3MgUHJvY1Jlc291cmNlS2luZDsKKworLy8gRGVmaW5lIGEgbnVtYmVyIG9mIGludGVyY2hhbmdlYWJsZSBwcm9jZXNzb3IgcmVzb3VyY2VzLiBOdW1Vbml0cworLy8gZGV0ZXJtaW5lcyB0aGUgdGhyb3VnaHB1dCBvZiBpbnN0cnVjdGlvbnMgdGhhdCByZXF1aXJlIHRoZSByZXNvdXJjZS4KKy8vCisvLyBBbiBvcHRpb25hbCBTdXBlciByZXNvdXJjZSBtYXkgYmUgZ2l2ZW4gdG8gbW9kZWwgdGhlc2UgcmVzb3VyY2VzIGFzCisvLyBhIHN1YnNldCBvZiB0aGUgbW9yZSBnZW5lcmFsIHN1cGVyIHJlc291cmNlcy4gVXNpbmcgb25lIG9mIHRoZXNlCisvLyByZXNvdXJjZXMgaW1wbGllcyB1c2luZyBvbmUgb2YgdGhlIHN1cGVyIHJlc29ydWNlcy4KKy8vCisvLyBQcm9jUmVzb3VyY2VVbml0cyBub3JtYWxseSBtb2RlbCBhIGZldyBidWZmZXJlZCByZXNvdXJjZXMgd2l0aGluIGFuCisvLyBvdXQtb2Ytb3JkZXIgZW5naW5lLiBCdWZmZXJlZCByZXNvdXJjZXMgbWF5IGJlIGhlbGQgZm9yIG11bHRpcGxlCisvLyBjbG9jayBjeWNsZXMsIGJ1dCB0aGUgc2NoZWR1bGVyIGRvZXMgbm90IHBpbiB0aGVtIHRvIGEgcGFydGljdWxhcgorLy8gY2xvY2sgY3ljbGUgcmVsYXRpdmUgdG8gaW5zdHJ1Y3Rpb24gZGlzcGF0Y2guIFNldHRpbmcgQnVmZmVyU2l6ZT0wCisvLyBjaGFuZ2VzIHRoaXMgdG8gYW4gaW4tb3JkZXIgaXNzdWUvZGlzcGF0Y2ggcmVzb3VyY2UuIEluIHRoaXMgY2FzZSwKKy8vIHRoZSBzY2hlZHVsZXIgY291bnRzIGRvd24gZnJvbSB0aGUgY3ljbGUgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24KKy8vIGlzc3VlcyBpbi1vcmRlciwgZm9yY2luZyBhIHN0YWxsIHdoZW5ldmVyIGEgc3Vic2VxdWVudCBpbnN0cnVjdGlvbgorLy8gcmVxdWlyZXMgdGhlIHNhbWUgcmVzb3VyY2UgdW50aWwgdGhlIG51bWJlciBvZiBSZXNvdXJjZUN5Y2xlcworLy8gc3BlY2lmaWVkIGluIFdyaXRlUmVzIGV4cGlyZS4gU2V0dGluZyBCdWZmZXJTaXplPTEgY2hhbmdlcyB0aGlzIHRvCisvLyBhbiBpbi1vcmRlciBsYXRlbmN5IHJlc291cmNlLiBJbiB0aGlzIGNhc2UsIHRoZSBzY2hlZHVsZXIgbW9kZWxzCisvLyBwcm9kdWNlci9jb25zdW1lciBzdGFsbHMgYmV0d2VlbiBpbnN0cnVjdGlvbnMgdGhhdCB1c2UgdGhlCisvLyByZXNvdXJjZS4KKy8vCisvLyBFeGFtcGxlcyAoYWxsIGFzc3VtZSBhbiBvdXQtb2Ytb3JkZXIgZW5naW5lKToKKy8vCisvLyBVc2UgQnVmZmVyU2l6ZSA9IC0xIGZvciAiaXNzdWUgcG9ydHMiIGZlZCBieSBhIHVuaWZpZWQgcmVzZXJ2YXRpb24KKy8vIHN0YXRpb24uIEhlcmUgdGhlIHNpemUgb2YgdGhlIHJlc2VydmF0aW9uIHN0YXRpb24gaXMgbW9kZWxlZCBieQorLy8gTWljcm9PcEJ1ZmZlclNpemUsIHdoaWNoIHNob3VsZCBiZSB0aGUgbWluaW11bSBzaXplIG9mIGVpdGhlciB0aGUKKy8vIHJlZ2lzdGVyIHJlbmFtZSBwb29sLCB1bmlmaWVkIHJlc2VydmF0aW9uIHN0YXRpb24sIG9yIHJlb3JkZXIKKy8vIGJ1ZmZlci4KKy8vCisvLyBVc2UgQnVmZmVyU2l6ZSA9IDAgZm9yIHJlc291cmNlcyB0aGF0IGZvcmNlICJkaXNwYXRjaC9pc3N1ZQorLy8gZ3JvdXBzIi4gKERpZmZlcmVudCBwcm9jZXNzb3JzIGRlZmluZSBkaXNwYXRoL2lzc3VlCisvLyBkaWZmZXJlbnRseS4gSGVyZSB3ZSByZWZlciB0byBzdGFnZSBiZXR3ZWVuIGRlY29kaW5nIGludG8gbWljcm8tb3BzCisvLyBhbmQgbW92aW5nIHRoZW0gaW50byBhIHJlc2VydmF0aW9uIHN0YXRpb24uKSBOb3JtYWxseSBOdW1NaWNyb09wcworLy8gaXMgc3VmZmljaWVudCB0byBsaW1pdCBkaXNwYXRjaC9pc3N1ZSBncm91cHMuIEhvd2V2ZXIsIHNvbWUKKy8vIHByb2Nlc3NvcnMgY2FuIGZvcm0gZ3JvdXBzIG9mIHdpdGggb25seSBjZXJ0YWluIGNvbWJpbml0aW9ucyBvZgorLy8gaW5zdHJ1Y3Rpb24gdHlwZXMuIGUuZy4gUE9XRVI3LgorLy8KKy8vIFVzZSBCdWZmZXJTaXplID0gMSBmb3IgaW4tb3JkZXIgZXhlY3V0aW9uIHVuaXRzLiBUaGlzIGlzIHVzZWQgZm9yCisvLyBhbiBpbi1vcmRlciBwaXBlbGluZSB3aXRoaW4gYW4gb3V0LW9mLW9yZGVyIGNvcmUgd2hlcmUgc2NoZWR1bGluZworLy8gZGVwZW5kZW50IG9wZXJhdGlvbnMgYmFjay10by1iYWNrIGlzIGd1YXJhbnRlZWQgdG8gY2F1c2UgYQorLy8gYnViYmxlLiBlLmcuIENvcnRleC1hOSBmbG9hdGluZy1wb2ludC4KKy8vCisvLyBVc2UgQnVmZmVyU2l6ZSA+IDEgZm9yIG91dC1vZi1vcmRlciBleGVjdXRpb25zIHVuaXRzIHdpdGggYQorLy8gc2VwYXJhdGUgcmVzZXJ2YXRpb24gc3RhdGlvbi4gVGhpcyBzaW1wbHkgbW9kZWxzIHRoZSBzaXplIG9mIHRoZQorLy8gcmVzZXJ2YXRpb24gc3RhdGlvbi4KKy8vCisvLyBUbyBtb2RlbCBib3RoIGRpc3BhdGNoL2lzc3VlIGdyb3VwcyBhbmQgaW4tb3JkZXIgZXhlY3V0aW9uIHVuaXRzLAorLy8gY3JlYXRlIHR3byB0eXBlcyBvZiB1bml0cywgb25lIHdpdGggQnVmZmVyU2l6ZT0wIGFuZCBvbmUgd2l0aAorLy8gQnVmZmVyU2l6ZT0xLgorLy8KKy8vIFNjaGVkTW9kZWwgdGllcyB0aGVzZSB1bml0cyB0byBhIHByb2Nlc3NvciBmb3IgYW55IHN0YW5kLWFsb25lIGRlZnMKKy8vIG9mIHRoaXMgY2xhc3MuCitjbGFzcyBQcm9jUmVzb3VyY2VVbml0czxQcm9jUmVzb3VyY2VLaW5kIGtpbmQsIGludCBudW0+IHsKKyAgUHJvY1Jlc291cmNlS2luZCBLaW5kID0ga2luZDsKKyAgaW50IE51bVVuaXRzID0gbnVtOworICBQcm9jUmVzb3VyY2VLaW5kIFN1cGVyID0gPzsKKyAgaW50IEJ1ZmZlclNpemUgPSAtMTsKKyAgU2NoZWRNYWNoaW5lTW9kZWwgU2NoZWRNb2RlbCA9ID87Cit9CisKKy8vIEVwb255bW91c1Byb2NSZXNvdXJjZUtpbmQgaGVscHMgaW1wbGVtZW50IFByb2NSZXNvdXJjZVVuaXRzIGJ5CisvLyBhbGxvd2luZyBhIFByb2NSZXNvdXJjZVVuaXRzIGRlZmluaXRpb24gdG8gcmVmZXJlbmNlIGl0c2VsZi4gSXQKKy8vIHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBhbnl3aGVyZSBlbHNlLgorZGVmIEVwb255bW91c1Byb2NSZXNvdXJjZUtpbmQgOiBQcm9jUmVzb3VyY2VLaW5kOworCisvLyBTdWJ0YXJnZXRzIHR5cGljYWxseSBkZWZpbmUgcHJvY2Vzc29yIHJlc291cmNlIGtpbmQgYW5kIG51bWJlciBvZgorLy8gdW5pdHMgaW4gb25lIHBsYWNlLgorY2xhc3MgUHJvY1Jlc291cmNlPGludCBudW0+IDogUHJvY1Jlc291cmNlS2luZCwKKyAgUHJvY1Jlc291cmNlVW5pdHM8RXBvbnltb3VzUHJvY1Jlc291cmNlS2luZCwgbnVtPjsKKworY2xhc3MgUHJvY1Jlc0dyb3VwPGxpc3Q8UHJvY1Jlc291cmNlPiByZXNvdXJjZXM+IDogUHJvY1Jlc291cmNlS2luZCB7CisgIGxpc3Q8UHJvY1Jlc291cmNlPiBSZXNvdXJjZXMgPSByZXNvdXJjZXM7CisgIFNjaGVkTWFjaGluZU1vZGVsIFNjaGVkTW9kZWwgPSA/OworICBpbnQgQnVmZmVyU2l6ZSA9IC0xOworfQorCisvLyBBIHRhcmdldCBhcmNoaXRlY3R1cmUgbWF5IGRlZmluZSBTY2hlZFJlYWRXcml0ZSB0eXBlcyBhbmQgYXNzb2NpYXRlCisvLyB0aGVtIHdpdGggaW5zdHJ1Y3Rpb24gb3BlcmFuZHMuCitjbGFzcyBTY2hlZFJlYWRXcml0ZTsKKworLy8gTGlzdCB0aGUgcGVyLW9wZXJhbmQgdHlwZXMgdGhhdCBtYXAgdG8gdGhlIG1hY2hpbmUgbW9kZWwgb2YgYW4KKy8vIGluc3RydWN0aW9uLiBPbmUgU2NoZWRXcml0ZSB0eXBlIG11c3QgYmUgbGlzdGVkIGZvciBlYWNoIGV4cGxpY2l0CisvLyBkZWYgb3BlcmFuZCBpbiBvcmRlci4gQWRkaXRpb25hbCBTY2hlZFdyaXRlIHR5cGVzIG1heSBvcHRpb25hbGx5IGJlCisvLyBsaXN0ZWQgZm9yIGltcGxpY2l0IGRlZiBvcGVyYW5kcy4gIFNjaGVkUmVhZCB0eXBlcyBtYXkgb3B0aW9uYWxseQorLy8gYmUgbGlzdGVkIGZvciB1c2Ugb3BlcmFuZHMgaW4gb3JkZXIuIFRoZSBvcmRlciBvZiBkZWZzIHJlbGF0aXZlIHRvCisvLyB1c2VzIGlzIGluc2lnbmlmaWNhbnQuIFRoaXMgd2F5LCB0aGUgc2FtZSBTY2hlZFJlYWRXcml0ZSBsaXN0IG1heQorLy8gYmUgdXNlZCBmb3IgbXVsdGlwbGUgZm9ybXMgb2YgYW4gb3BlcmF0aW9uLiBGb3IgZXhhbXBsZSwgYQorLy8gdHdvLWFkZHJlc3MgaW5zdHJ1Y3Rpb24gY291bGQgaGF2ZSB0d28gdGllZCBvcGVyYW5kcyBvciBzaW5nbGUKKy8vIG9wZXJhbmQgdGhhdCBib3RoIHJlYWRzIGFuZCB3cml0ZXMgYSByZWcuIEluIGJvdGggY2FzZXMgd2UgaGF2ZSBhCisvLyBzaW5nbGUgU2NoZWRXcml0ZSBhbmQgc2luZ2xlIFNjaGVkUmVhZCBpbiBhbnkgb3JkZXIuCitjbGFzcyBTY2hlZDxsaXN0PFNjaGVkUmVhZFdyaXRlPiBzY2hlZHJ3PiB7CisgIGxpc3Q8U2NoZWRSZWFkV3JpdGU+IFNjaGVkUlcgPSBzY2hlZHJ3OworfQorCisvLyBEZWZpbmUgYSBzY2hlZHVsZXIgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIGEgZGVmIG9wZXJhbmQuCitjbGFzcyBTY2hlZFdyaXRlIDogU2NoZWRSZWFkV3JpdGU7CitkZWYgTm9Xcml0ZSA6IFNjaGVkV3JpdGU7CisKKy8vIERlZmluZSBhIHNjaGVkdWxlciByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggYSB1c2Ugb3BlcmFuZC4KK2NsYXNzIFNjaGVkUmVhZCAgOiBTY2hlZFJlYWRXcml0ZTsKKworLy8gRGVmaW5lIGEgU2NoZWRXcml0ZSB0aGF0IGlzIG1vZGVsZWQgYXMgYSBzZXF1ZW5jZSBvZiBvdGhlcgorLy8gU2NoZWRXcml0ZXMgd2l0aCBhZGRpdGl2ZSBsYXRlbmN5LiBUaGlzIGFsbG93cyBhIHNpbmdsZSBvcGVyYW5kIHRvCisvLyBiZSBtYXBwZWQgdGhlIHJlc291cmNlcyBjb21wb3NlZCBmcm9tIGEgc2V0IG9mIHByZXZpb3VzbHkgZGVmaW5lZAorLy8gU2NoZWRXcml0ZXMuCisvLworLy8gSWYgdGhlIGZpbmFsIHdyaXRlIGluIHRoaXMgc2VxdWVuY2UgaXMgYSBTY2hlZFdyaXRlVmFyaWFudCBtYXJrZWQKKy8vIFZhcmlhZGljLCB0aGVuIHRoZSBsaXN0IG9mIHByaW9yIHdyaXRlcyBhcmUgZGlzdHJpYnV0ZWQgYWNyb3NzIGFsbAorLy8gb3BlcmFuZHMgYWZ0ZXIgcmVzb2x2aW5nIHRoZSBwcmVkaWNhdGUgZm9yIHRoZSBmaW5hbCB3cml0ZS4KKy8vCisvLyBTY2hlZE1vZGVsIHNpbGVuY2VzIHdhcm5pbmdzIGJ1dCBpcyBpZ25vcmVkLgorY2xhc3MgV3JpdGVTZXF1ZW5jZTxsaXN0PFNjaGVkV3JpdGU+IHdyaXRlcywgaW50IHJlcCA9IDE+IDogU2NoZWRXcml0ZSB7CisgIGxpc3Q8U2NoZWRXcml0ZT4gV3JpdGVzID0gd3JpdGVzOworICBpbnQgUmVwZWF0ID0gcmVwOworICBTY2hlZE1hY2hpbmVNb2RlbCBTY2hlZE1vZGVsID0gPzsKK30KKworLy8gRGVmaW5lIHZhbHVlcyBjb21tb24gdG8gV3JpdGVSZXMgYW5kIFNjaGVkV3JpdGVSZXMuCisvLworLy8gU2NoZWRNb2RlbCB0aWVzIHRoZXNlIHJlc291cmNlcyB0byBhIHByb2Nlc3Nvci4KK2NsYXNzIFByb2NXcml0ZVJlc291cmNlczxsaXN0PFByb2NSZXNvdXJjZUtpbmQ+IHJlc291cmNlcz4geworICBsaXN0PFByb2NSZXNvdXJjZUtpbmQ+IFByb2NSZXNvdXJjZXMgPSByZXNvdXJjZXM7CisgIGxpc3Q8aW50PiBSZXNvdXJjZUN5Y2xlcyA9IFtdOworICBpbnQgTGF0ZW5jeSA9IDE7CisgIGludCBOdW1NaWNyb09wcyA9IDE7CisgIGJpdCBCZWdpbkdyb3VwID0gMDsKKyAgYml0IEVuZEdyb3VwID0gMDsKKyAgLy8gQWxsb3cgYSBwcm9jZXNzb3IgdG8gbWFyayBzb21lIHNjaGVkdWxpbmcgY2xhc3NlcyBhcyB1bnN1cHBvcnRlZAorICAvLyBmb3Igc3Ryb25nZXIgdmVyaWZpY2F0aW9uLgorICBiaXQgVW5zdXBwb3J0ZWQgPSAwOworICAvLyBBbGxvdyBhIHByb2Nlc3NvciB0byBtYXJrIHNvbWUgc2NoZWR1bGluZyBjbGFzc2VzIGFzIHNpbmdsZS1pc3N1ZS4KKyAgLy8gU2luZ2xlSXNzdWUgaXMgYW4gYWxpYXMgZm9yIEJlZ2luL0VuZCBHcm91cC4KKyAgYml0IFNpbmdsZUlzc3VlID0gMDsKKyAgU2NoZWRNYWNoaW5lTW9kZWwgU2NoZWRNb2RlbCA9ID87Cit9CisKKy8vIERlZmluZSB0aGUgcmVzb3VyY2VzIGFuZCBsYXRlbmN5IG9mIGEgU2NoZWRXcml0ZS4gVGhpcyB3aWxsIGJlIHVzZWQKKy8vIGRpcmVjdGx5IGJ5IHRhcmdldHMgdGhhdCBoYXZlIG5vIGl0aW5lcmFyeSBjbGFzc2VzLiBJbiB0aGlzIGNhc2UsCisvLyBTY2hlZFdyaXRlIGlzIGRlZmluZWQgYnkgdGhlIHRhcmdldCwgd2hpbGUgV3JpdGVSZXNvdXJjZXMgaXMKKy8vIGRlZmluZWQgYnkgdGhlIHN1YnRhcmdldCwgYW5kIG1hcHMgdGhlIFNjaGVkV3JpdGUgdG8gcHJvY2Vzc29yCisvLyByZXNvdXJjZXMuCisvLworLy8gSWYgYSB0YXJnZXQgYWxyZWFkeSBoYXMgaXRpbmVyYXJ5IGNsYXNzZXMsIFNjaGVkV3JpdGVSZXNvdXJjZXMgY2FuCisvLyBiZSB1c2VkIGluc3RlYWQgdG8gZGVmaW5lIHN1YnRhcmdldCBzcGVjaWZpYyBTY2hlZFdyaXRlcyBhbmQgbWFwCisvLyB0aGVtIHRvIHByb2Nlc3NvciByZXNvdXJjZXMgaW4gb25lIHBsYWNlLiBUaGVuIEl0aW5SVyBjYW4gbWFwCisvLyBpdGluZXJhcnkgY2xhc3NlcyB0byB0aGUgc3VidGFyZ2V0J3MgU2NoZWRXcml0ZXMuCisvLworLy8gUHJvY1Jlc291cmNlcyBpbmRpY2F0ZXMgdGhlIHNldCBvZiByZXNvdXJjZXMgY29uc3VtZWQgYnkgdGhlIHdyaXRlLgorLy8gT3B0aW9uYWxseSwgUmVzb3VyY2VDeWNsZXMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY3ljbGVzIHRoZQorLy8gcmVzb3VyY2UgaXMgY29uc3VtZWQuIEVhY2ggUmVzb3VyY2VDeWNsZXMgaXRlbSBpcyBwYWlyZWQgd2l0aCB0aGUKKy8vIFByb2NSZXNvdXJjZSBpdGVtIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluIGl0cyBsaXN0LiBTaW5jZQorLy8gUmVzb3VyY2VDeWNsZXMgYXJlIHJhcmVseSBzcGVjaWFsaXplZCwgdGhlIGxpc3QgbWF5IGJlCisvLyBpbmNvbXBsZXRlLiBCeSBkZWZhdWx0LCByZXNvdXJjZXMgYXJlIGNvbnN1bWVkIGZvciBhIHNpbmdsZSBjeWNsZSwKKy8vIHJlZ2FyZGxlc3Mgb2YgbGF0ZW5jeSwgd2hpY2ggbW9kZWxzIGEgZnVsbHkgcGlwZWxpbmVkIHByb2Nlc3NpbmcKKy8vIHVuaXQuIEEgdmFsdWUgb2YgMCBmb3IgUmVzb3VyY2VDeWNsZXMgbWVhbnMgdGhhdCB0aGUgcmVzb3VyY2UgbXVzdAorLy8gYmUgYXZhaWxhYmxlIGJ1dCBpcyBub3QgY29uc3VtZWQsIHdoaWNoIGlzIG9ubHkgcmVsZXZhbnQgZm9yCisvLyB1bmJ1ZmZlcmVkIHJlc291cmNlcy4KKy8vCisvLyBCeSBkZWZhdWx0LCBlYWNoIFNjaGVkV3JpdGUgdGFrZXMgb25lIG1pY3JvLW9wLCB3aGljaCBpcyBjb3VudGVkCisvLyBhZ2FpbnN0IHRoZSBwcm9jZXNzb3IncyBJc3N1ZVdpZHRoIGxpbWl0LiBJZiBhbiBpbnN0cnVjdGlvbiBjYW4KKy8vIHdyaXRlIG11bHRpcGxlIHJlZ2lzdGVycyB3aXRoIGEgc2luZ2xlIG1pY3JvLW9wLCB0aGUgc3VidGFyZ2V0CisvLyBzaG91bGQgZGVmaW5lIG9uZSBvZiB0aGUgd3JpdGVzIHRvIGJlIHplcm8gbWljcm8tb3BzLiBJZiBhCisvLyBzdWJ0YXJnZXQgcmVxdWlyZXMgbXVsdGlwbGUgbWljcm8tb3BzIHRvIHdyaXRlIGEgc2luZ2xlIHJlc3VsdCwgaXQKKy8vIHNob3VsZCBlaXRoZXIgb3ZlcnJpZGUgdGhlIHdyaXRlJ3MgTnVtTWljcm9PcHMgdG8gYmUgZ3JlYXRlciB0aGFuIDEKKy8vIG9yIHJlcXVpcmUgYWRkaXRpb25hbCB3cml0ZXMuIEV4dHJhIHdyaXRlcyBjYW4gYmUgcmVxdWlyZWQgZWl0aGVyCisvLyBieSBkZWZpbmluZyBhIFdyaXRlU2VxdWVuY2UsIG9yIHNpbXBseSBsaXN0aW5nIGV4dHJhIHdyaXRlcyBpbiB0aGUKKy8vIGluc3RydWN0aW9uJ3MgbGlzdCBvZiB3cml0ZXJzIGJleW9uZCB0aGUgbnVtYmVyIG9mICJkZWYiCisvLyBvcGVyYW5kcy4gVGhlIHNjaGVkdWxlciBhc3N1bWVzIHRoYXQgYWxsIG1pY3JvLW9wcyBtdXN0IGJlCisvLyBkaXNwYXRjaGVkIGluIHRoZSBzYW1lIGN5Y2xlLiBUaGVzZSBtaWNyby1vcHMgbWF5IGJlIHJlcXVpcmVkIHRvCisvLyBiZWdpbiBvciBlbmQgdGhlIGN1cnJlbnQgZGlzcGF0Y2ggZ3JvdXAuCitjbGFzcyBXcml0ZVJlczxTY2hlZFdyaXRlIHdyaXRlLCBsaXN0PFByb2NSZXNvdXJjZUtpbmQ+IHJlc291cmNlcz4KKyAgOiBQcm9jV3JpdGVSZXNvdXJjZXM8cmVzb3VyY2VzPiB7CisgIFNjaGVkV3JpdGUgV3JpdGVUeXBlID0gd3JpdGU7Cit9CisKKy8vIERpcmVjdGx5IG5hbWUgYSBzZXQgb2YgV3JpdGVSZXNvdXJjZXMgZGVmaW5pbmcgYSBuZXcgU2NoZWRXcml0ZQorLy8gdHlwZSBhdCB0aGUgc2FtZSB0aW1lLiBUaGlzIGNsYXNzIGlzIHVuYXdhcmUgb2YgaXRzIFNjaGVkTW9kZWwgc28KKy8vIG11c3QgYmUgcmVmZXJlbmNlZCBieSBJbnN0Ulcgb3IgSXRpblJXLgorY2xhc3MgU2NoZWRXcml0ZVJlczxsaXN0PFByb2NSZXNvdXJjZUtpbmQ+IHJlc291cmNlcz4gOiBTY2hlZFdyaXRlLAorICBQcm9jV3JpdGVSZXNvdXJjZXM8cmVzb3VyY2VzPjsKKworLy8gRGVmaW5lIHZhbHVlcyBjb21tb24gdG8gUmVhZEFkdmFuY2UgYW5kIFNjaGVkUmVhZEFkdmFuY2UuCisvLworLy8gU2NoZWRNb2RlbCB0aWVzIHRoZXNlIHJlc291cmNlcyB0byBhIHByb2Nlc3Nvci4KK2NsYXNzIFByb2NSZWFkQWR2YW5jZTxpbnQgY3ljbGVzLCBsaXN0PFNjaGVkV3JpdGU+IHdyaXRlcyA9IFtdPiB7CisgIGludCBDeWNsZXMgPSBjeWNsZXM7CisgIGxpc3Q8U2NoZWRXcml0ZT4gVmFsaWRXcml0ZXMgPSB3cml0ZXM7CisgIC8vIEFsbG93IGEgcHJvY2Vzc29yIHRvIG1hcmsgc29tZSBzY2hlZHVsaW5nIGNsYXNzZXMgYXMgdW5zdXBwb3J0ZWQKKyAgLy8gZm9yIHN0cm9uZ2VyIHZlcmlmaWNhdGlvbi4KKyAgYml0IFVuc3VwcG9ydGVkID0gMDsKKyAgU2NoZWRNYWNoaW5lTW9kZWwgU2NoZWRNb2RlbCA9ID87Cit9CisKKy8vIEEgcHJvY2Vzc29yIG1heSBkZWZpbmUgYSBSZWFkQWR2YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBTY2hlZFJlYWQKKy8vIHRvIHJlZHVjZSBsYXRlbmN5IG9mIGEgcHJpb3Igd3JpdGUgYnkgTiBjeWNsZXMuIEEgbmVnYXRpdmUgYWR2YW5jZQorLy8gZWZmZWN0aXZlbHkgaW5jcmVhc2VzIGxhdGVuY3ksIHdoaWNoIG1heSBiZSB1c2VkIGZvciBjcm9zcy1kb21haW4KKy8vIHN0YWxscy4KKy8vCisvLyBBIFJlYWRBZHZhbmNlIG1heSBiZSBhc3NvY2lhdGVkIHdpdGggYSBsaXN0IG9mIFNjaGVkV3JpdGVzCisvLyB0byBpbXBsZW1lbnQgcGlwZWxpbmUgYnlwYXNzLiBUaGUgV3JpdGVzIGxpc3QgbWF5IGJlIGVtcHR5IHRvCisvLyBpbmRpY2F0ZSBvcGVyYW5kcyB0aGF0IGFyZSBhbHdheXMgcmVhZCB0aGlzIG51bWJlciBvZiBDeWNsZXMgbGF0ZXIKKy8vIHRoYW4gYSBub3JtYWwgcmVnaXN0ZXIgcmVhZCwgYWxsb3dpbmcgdGhlIHJlYWQncyBwYXJlbnQgaW5zdHJ1Y3Rpb24KKy8vIHRvIGlzc3VlIGVhcmxpZXIgcmVsYXRpdmUgdG8gdGhlIHdyaXRlci4KK2NsYXNzIFJlYWRBZHZhbmNlPFNjaGVkUmVhZCByZWFkLCBpbnQgY3ljbGVzLCBsaXN0PFNjaGVkV3JpdGU+IHdyaXRlcyA9IFtdPgorICA6IFByb2NSZWFkQWR2YW5jZTxjeWNsZXMsIHdyaXRlcz4geworICBTY2hlZFJlYWQgUmVhZFR5cGUgPSByZWFkOworfQorCisvLyBEaXJlY3RseSBhc3NvY2lhdGUgYSBuZXcgU2NoZWRSZWFkIHR5cGUgd2l0aCBhIGRlbGF5IGFuZCBvcHRpb25hbAorLy8gcGlwZWxpbmUgYnlwYXNzLiBGb3IgdXNlIHdpdGggSW5zdFJXIG9yIEl0aW5SVy4KK2NsYXNzIFNjaGVkUmVhZEFkdmFuY2U8aW50IGN5Y2xlcywgbGlzdDxTY2hlZFdyaXRlPiB3cml0ZXMgPSBbXT4gOiBTY2hlZFJlYWQsCisgIFByb2NSZWFkQWR2YW5jZTxjeWNsZXMsIHdyaXRlcz47CisKKy8vIERlZmluZSBTY2hlZFJlYWQgZGVmYXVsdHMuIFJlYWRzIHNlbGRvbSBuZWVkIHNwZWNpYWwgdHJlYXRtZW50LgorZGVmIFJlYWREZWZhdWx0IDogU2NoZWRSZWFkOworZGVmIE5vUmVhZEFkdmFuY2UgOiBTY2hlZFJlYWRBZHZhbmNlPDA+OworCisvLyBEZWZpbmUgc2hhcmVkIGNvZGUgdGhhdCB3aWxsIGJlIGluIHRoZSBzYW1lIHNjb3BlIGFzIGFsbAorLy8gU2NoZWRQcmVkaWNhdGVzLiBBdmFpbGFibGUgdmFyaWFibGVzIGFyZToKKy8vIChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCBjb25zdCBUYXJnZXRTY2hlZE1vZGVsICpTY2hlZE1vZGVsKQorY2xhc3MgUHJlZGljYXRlUHJvbG9nPGNvZGUgYz4geworICBjb2RlIENvZGUgPSBjOworfQorCisvLyBEZWZpbmUgYSBwcmVkaWNhdGUgdG8gZGV0ZXJtaW5lIHdoaWNoIFNjaGVkVmFyaWFudCBhcHBsaWVzIHRvIGEKKy8vIHBhcnRpY3VsYXIgTWFjaGluZUluc3RyLiBUaGUgY29kZSBzbmlwcGV0IGlzIHVzZWQgYXMgYW4KKy8vIGlmLXN0YXRlbWVudCdzIGV4cHJlc3Npb24uIEF2YWlsYWJsZSB2YXJpYWJsZXMgYXJlIE1JLCBTY2hlZE1vZGVsLAorLy8gYW5kIGFueXRoaW5nIGRlZmluZWQgaW4gYSBQcmVkaWNhdGVQcm9sb2cuCisvLworLy8gU2NoZWRNb2RlbCBzaWxlbmNlcyB3YXJuaW5ncyBidXQgaXMgaWdub3JlZC4KK2NsYXNzIFNjaGVkUHJlZGljYXRlPGNvZGUgcHJlZD4geworICBTY2hlZE1hY2hpbmVNb2RlbCBTY2hlZE1vZGVsID0gPzsKKyAgY29kZSBQcmVkaWNhdGUgPSBwcmVkOworfQorZGVmIE5vU2NoZWRQcmVkIDogU2NoZWRQcmVkaWNhdGU8W3t0cnVlfV0+OworCisvLyBBc3NvY2lhdGUgYSBwcmVkaWNhdGUgd2l0aCBhIGxpc3Qgb2YgU2NoZWRSZWFkV3JpdGVzLiBCeSBkZWZhdWx0LAorLy8gdGhlIHNlbGVjdGVkIFNjaGVkUmVhZFdyaXRlcyBhcmUgc3RpbGwgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlCisvLyBvcGVyYW5kIGFuZCBhc3N1bWVkIHRvIGV4ZWN1dGUgc2VxdWVudGlhbGx5IHdpdGggYWRkaXRpdmUKKy8vIGxhdGVuY3kuIEhvd2V2ZXIsIGlmIHRoZSBwYXJlbnQgU2NoZWRXcml0ZVZhcmlhbnQgb3IKKy8vIFNjaGVkUmVhZFZhcmlhbnQgaXMgbWFya2VkICJWYXJpYWRpYyIsIHRoZW4gZWFjaCBTZWxlY3RlZAorLy8gU2NoZWRSZWFkV3JpdGUgaXMgbWFwcGVkIGluIHBsYWNlIHRvIHRoZSBpbnN0cnVjdGlvbidzIHZhcmlhZGljCisvLyBvcGVyYW5kcy4gSW4gdGhpcyBjYXNlLCBsYXRlbmN5IGlzIG5vdCBhZGRpdGl2ZS4gSWYgdGhlIGN1cnJlbnQgVmFyaWFudAorLy8gaXMgYWxyZWFkeSBwYXJ0IG9mIGEgU2VxdWVuY2UsIHRoZW4gdGhhdCBlbnRpcmUgY2hhaW4gbGVhZGluZyB1cCB0bworLy8gdGhlIFZhcmlhbnQgaXMgZGlzdHJpYnV0ZWQgb3ZlciB0aGUgdmFyaWFkaWMgb3BlcmFuZHMuCitjbGFzcyBTY2hlZFZhcjxTY2hlZFByZWRpY2F0ZSBwcmVkLCBsaXN0PFNjaGVkUmVhZFdyaXRlPiBzZWxlY3RlZD4geworICBTY2hlZFByZWRpY2F0ZSBQcmVkaWNhdGUgPSBwcmVkOworICBsaXN0PFNjaGVkUmVhZFdyaXRlPiBTZWxlY3RlZCA9IHNlbGVjdGVkOworfQorCisvLyBTY2hlZE1vZGVsIHNpbGVuY2VzIHdhcm5pbmdzIGJ1dCBpcyBpZ25vcmVkLgorY2xhc3MgU2NoZWRWYXJpYW50PGxpc3Q8U2NoZWRWYXI+IHZhcmlhbnRzPiB7CisgIGxpc3Q8U2NoZWRWYXI+IFZhcmlhbnRzID0gdmFyaWFudHM7CisgIGJpdCBWYXJpYWRpYyA9IDA7CisgIFNjaGVkTWFjaGluZU1vZGVsIFNjaGVkTW9kZWwgPSA/OworfQorCisvLyBBIFNjaGVkV3JpdGVWYXJpYW50IGlzIGEgc2luZ2xlIFNjaGVkV3JpdGUgdHlwZSB0aGF0IG1hcHMgdG8gYSBsaXN0CisvLyBvZiBTY2hlZFdyaXRlIHR5cGVzIHVuZGVyIHRoZSBjb25kaXRpb25zIGRlZmluZWQgYnkgaXRzIHByZWRpY2F0ZXMuCisvLworLy8gQSBWYXJpYWRpYyB3cml0ZSBpcyBleHBhbmRlZCB0byBjb3ZlciBtdWx0aXBsZSAiZGVmIiBvcGVyYW5kcy4gVGhlCisvLyBTY2hlZFZhcmlhbnQncyBFeHBhbnNpb24gbGlzdCBpcyB0aGVuIGludGVycHJldGVkIGFzIG9uZSB3cml0ZQorLy8gcGVyLW9wZXJhbmQgaW5zdGVhZCBvZiB0aGUgdXN1YWwgc2VxdWVudGlhbCB3cml0ZXMgZmVlZGluZyBhIHNpbmdsZQorLy8gb3BlcmFuZC4KK2NsYXNzIFNjaGVkV3JpdGVWYXJpYW50PGxpc3Q8U2NoZWRWYXI+IHZhcmlhbnRzPiA6IFNjaGVkV3JpdGUsCisgIFNjaGVkVmFyaWFudDx2YXJpYW50cz4geworfQorCisvLyBBIFNjaGVkUmVhZFZhcmlhbnQgaXMgYSBzaW5nbGUgU2NoZWRSZWFkIHR5cGUgdGhhdCBtYXBzIHRvIGEgbGlzdAorLy8gb2YgU2NoZWRSZWFkIHR5cGVzIHVuZGVyIHRoZSBjb25kaXRpb25zIGRlZmluZWQgYnkgaXRzIHByZWRpY2F0ZXMuCisvLworLy8gQSBWYXJpYWRpYyB3cml0ZSBpcyBleHBhbmRlZCB0byBjb3ZlciBtdWx0aXBsZSAicmVhZHNSZWciIG9wZXJhbmRzIGFzCisvLyBleHBsYWluZWQgYWJvdmUuCitjbGFzcyBTY2hlZFJlYWRWYXJpYW50PGxpc3Q8U2NoZWRWYXI+IHZhcmlhbnRzPiA6IFNjaGVkUmVhZCwKKyAgU2NoZWRWYXJpYW50PHZhcmlhbnRzPiB7Cit9CisKKy8vIE1hcCBhIHNldCBvZiBvcGNvZGVzIHRvIGEgbGlzdCBvZiBTY2hlZFJlYWRXcml0ZSB0eXBlcy4gVGhpcyBhbGxvd3MKKy8vIHRoZSBzdWJ0YXJnZXQgdG8gZWFzaWx5IG92ZXJyaWRlIHNwZWNpZmljIG9wZXJhdGlvbnMuCisvLworLy8gU2NoZWRNb2RlbCB0aWVzIHRoaXMgb3Bjb2RlIG1hcHBpbmcgdG8gYSBwcm9jZXNzb3IuCitjbGFzcyBJbnN0Ulc8bGlzdDxTY2hlZFJlYWRXcml0ZT4gcncsIGRhZyBpbnN0cmxpc3Q+IHsKKyAgbGlzdDxTY2hlZFJlYWRXcml0ZT4gT3BlcmFuZFJlYWRXcml0ZXMgPSBydzsKKyAgZGFnIEluc3RycyA9IGluc3RybGlzdDsKKyAgU2NoZWRNYWNoaW5lTW9kZWwgU2NoZWRNb2RlbCA9ID87CisgIC8vIEFsbG93IGEgc3VidGFyZ2V0IHRvIG1hcmsgc29tZSBpbnN0cnVjdGlvbnMgYXMgdW5zdXBwb3J0ZWQuCisgIGJpdCBVbnN1cHBvcnRlZCA9IDA7Cit9CisKKy8vIE1hcCBhIHNldCBvZiBpdGluZXJhcnkgY2xhc3NlcyB0byBTY2hlZFJlYWRXcml0ZSByZXNvdXJjZXMuIFRoaXMgaXMKKy8vIHVzZWQgdG8gYm9vdHN0cmFwIGEgdGFyZ2V0IChlLmcuIEFSTSkgd2hlbiBpdGluZXJhcmllcyBhbHJlYWR5CisvLyBleGlzdCBhbmQgY2hhbmdpbmcgSW5zdHJJbmZvIGlzIHVuZGVzaXJhYmxlLgorLy8KKy8vIFNjaGVkTW9kZWwgdGllcyB0aGlzIEl0aW5lcmFyeUNsYXNzIG1hcHBpbmcgdG8gYSBwcm9jZXNzb3IuCitjbGFzcyBJdGluUlc8bGlzdDxTY2hlZFJlYWRXcml0ZT4gcncsIGxpc3Q8SW5zdHJJdGluQ2xhc3M+IGlpYz4geworICBsaXN0PEluc3RySXRpbkNsYXNzPiBNYXRjaGVkSXRpbkNsYXNzZXMgPSBpaWM7CisgIGxpc3Q8U2NoZWRSZWFkV3JpdGU+IE9wZXJhbmRSZWFkV3JpdGVzID0gcnc7CisgIFNjaGVkTWFjaGluZU1vZGVsIFNjaGVkTW9kZWwgPSA/OworfQorCisvLyBBbGlhcyBhIHRhcmdldC1kZWZpbmVkIFNjaGVkUmVhZFdyaXRlIHRvIGEgcHJvY2Vzc29yIHNwZWNpZmljCisvLyBTY2hlZFJlYWRXcml0ZS4gVGhpcyBhbGxvd3MgYSBzdWJ0YXJnZXQgdG8gZWFzaWx5IG1hcCBhCisvLyBTY2hlZFJlYWRXcml0ZSB0eXBlIG9udG8gYSBXcml0ZVNlcXVlbmNlLCBTY2hlZFdyaXRlVmFyaWFudCwgb3IKKy8vIFNjaGVkUmVhZFZhcmlhbnQuCisvLworLy8gU2NoZWRNb2RlbCB3aWxsIHVzdWFsbHkgYmUgcHJvdmlkZWQgYnkgc3Vycm91bmRpbmcgbGV0IHN0YXRlbWVudAorLy8gYW5kIHRpZXMgdGhpcyBTY2hlZEFsaWFzIG1hcHBpbmcgdG8gYSBwcm9jZXNzb3IuCitjbGFzcyBTY2hlZEFsaWFzPFNjaGVkUmVhZFdyaXRlIG1hdGNoLCBTY2hlZFJlYWRXcml0ZSBhbGlhcz4geworICBTY2hlZFJlYWRXcml0ZSBNYXRjaFJXID0gbWF0Y2g7CisgIFNjaGVkUmVhZFdyaXRlIEFsaWFzUlcgPSBhbGlhczsKKyAgU2NoZWRNYWNoaW5lTW9kZWwgU2NoZWRNb2RlbCA9ID87Cit9CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRTZWxlY3Rpb25EQUcudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRTZWxlY3Rpb25EQUcudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhOGY3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldFNlbGVjdGlvbkRBRy50ZApAQCAtMCwwICsxLDEzMjYgQEAKKy8vPT09LSBUYXJnZXRTZWxlY3Rpb25EQUcudGQgLSBDb21tb24gY29kZSBmb3IgREFHIGlzZWxzIC0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIHRhcmdldC1pbmRlcGVuZGVudCBpbnRlcmZhY2VzIHVzZWQgYnkgU2VsZWN0aW9uREFHCisvLyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gZ2VuZXJhdG9ycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU2VsZWN0aW9uIERBRyBUeXBlIENvbnN0cmFpbnQgZGVmaW5pdGlvbnMuCisvLworLy8gTm90ZSB0aGF0IHRoZSBzZW1hbnRpY3Mgb2YgdGhlc2UgY29uc3RyYWludHMgYXJlIGhhcmQgY29kZWQgaW50byB0YmxnZW4uICBUbworLy8gbW9kaWZ5IG9yIGFkZCBjb25zdHJhaW50cywgeW91IGhhdmUgdG8gaGFjayB0YmxnZW4uCisvLworCitjbGFzcyBTRFR5cGVDb25zdHJhaW50PGludCBvcG51bT4geworICBpbnQgT3BlcmFuZE51bSA9IG9wbnVtOworfQorCisvLyBTRFRDaXNWVCAtIFRoZSBzcGVjaWZpZWQgb3BlcmFuZCBoYXMgZXhhY3RseSB0aGlzIFZULgorY2xhc3MgU0RUQ2lzVlQ8aW50IE9wTnVtLCBWYWx1ZVR5cGUgdnQ+IDogU0RUeXBlQ29uc3RyYWludDxPcE51bT4geworICBWYWx1ZVR5cGUgVlQgPSB2dDsKK30KKworY2xhc3MgU0RUQ2lzUHRyVHk8aW50IE9wTnVtPiA6IFNEVHlwZUNvbnN0cmFpbnQ8T3BOdW0+OworCisvLyBTRFRDaXNJbnQgLSBUaGUgc3BlY2lmaWVkIG9wZXJhbmQgaGFzIGludGVnZXIgdHlwZS4KK2NsYXNzIFNEVENpc0ludDxpbnQgT3BOdW0+IDogU0RUeXBlQ29uc3RyYWludDxPcE51bT47CisKKy8vIFNEVENpc0ZQIC0gVGhlIHNwZWNpZmllZCBvcGVyYW5kIGhhcyBmbG9hdGluZy1wb2ludCB0eXBlLgorY2xhc3MgU0RUQ2lzRlA8aW50IE9wTnVtPiA6IFNEVHlwZUNvbnN0cmFpbnQ8T3BOdW0+OworCisvLyBTRFRDaXNWZWMgLSBUaGUgc3BlY2lmaWVkIG9wZXJhbmQgaGFzIGEgdmVjdG9yIHR5cGUuCitjbGFzcyBTRFRDaXNWZWM8aW50IE9wTnVtPiA6IFNEVHlwZUNvbnN0cmFpbnQ8T3BOdW0+OworCisvLyBTRFRDaXNTYW1lQXMgLSBUaGUgdHdvIHNwZWNpZmllZCBvcGVyYW5kcyBoYXZlIGlkZW50aWNhbCB0eXBlcy4KK2NsYXNzIFNEVENpc1NhbWVBczxpbnQgT3BOdW0sIGludCBPdGhlck9wPiA6IFNEVHlwZUNvbnN0cmFpbnQ8T3BOdW0+IHsKKyAgaW50IE90aGVyT3BlcmFuZE51bSA9IE90aGVyT3A7Cit9CisKKy8vIFNEVENpc1ZUU21hbGxlclRoYW5PcCAtIFRoZSBzcGVjaWZpZWQgb3BlcmFuZCBpcyBhIFZUIFNETm9kZSwgYW5kIGl0cyB0eXBlIGlzCisvLyBzbWFsbGVyIHRoYW4gdGhlICdPdGhlcicgb3BlcmFuZC4KK2NsYXNzIFNEVENpc1ZUU21hbGxlclRoYW5PcDxpbnQgT3BOdW0sIGludCBPdGhlck9wPiA6IFNEVHlwZUNvbnN0cmFpbnQ8T3BOdW0+IHsKKyAgaW50IE90aGVyT3BlcmFuZE51bSA9IE90aGVyT3A7Cit9CisKK2NsYXNzIFNEVENpc09wU21hbGxlclRoYW5PcDxpbnQgU21hbGxPcCwgaW50IEJpZ09wPiA6IFNEVHlwZUNvbnN0cmFpbnQ8U21hbGxPcD57CisgIGludCBCaWdPcGVyYW5kTnVtID0gQmlnT3A7Cit9CisKKy8vLyBTRFRDaXNFbHRPZlZlYyAtIFRoaXMgaW5kaWNhdGVzIHRoYXQgVGhpc09wIGlzIGEgc2NhbGFyIHR5cGUgb2YgdGhlIHNhbWUKKy8vLyB0eXBlIGFzIHRoZSBlbGVtZW50IHR5cGUgb2YgT3RoZXJPcCwgd2hpY2ggaXMgYSB2ZWN0b3IgdHlwZS4KK2NsYXNzIFNEVENpc0VsdE9mVmVjPGludCBUaGlzT3AsIGludCBPdGhlck9wPgorICA6IFNEVHlwZUNvbnN0cmFpbnQ8VGhpc09wPiB7CisgIGludCBPdGhlck9wTnVtID0gT3RoZXJPcDsKK30KKworLy8vIFNEVENpc1N1YlZlY09mVmVjIC0gVGhpcyBpbmRpY2F0ZXMgdGhhdCBUaGlzT3AgaXMgYSB2ZWN0b3IgdHlwZQorLy8vIHdpdGggbGVuZ3RoIGxlc3MgdGhhdCBvZiBPdGhlck9wLCB3aGljaCBpcyBhIHZlY3RvciB0eXBlLgorY2xhc3MgU0RUQ2lzU3ViVmVjT2ZWZWM8aW50IFRoaXNPcCwgaW50IE90aGVyT3A+CisgIDogU0RUeXBlQ29uc3RyYWludDxUaGlzT3A+IHsKKyAgaW50IE90aGVyT3BOdW0gPSBPdGhlck9wOworfQorCisvLyBTRFRDVmVjRWx0aXNWVCAtIFRoZSBzcGVjaWZpZWQgb3BlcmFuZCBpcyB2ZWN0b3IgdHlwZSB3aXRoIGVsZW1lbnQgdHlwZQorLy8gb2YgVlQuCitjbGFzcyBTRFRDVmVjRWx0aXNWVDxpbnQgT3BOdW0sIFZhbHVlVHlwZSB2dD4gOiBTRFR5cGVDb25zdHJhaW50PE9wTnVtPiB7CisgIFZhbHVlVHlwZSBWVCA9IHZ0OworfQorCisvLyBTRFRDaXNTYW1lTnVtRWx0c0FzIC0gVGhlIHR3byBzcGVjaWZpZWQgb3BlcmFuZHMgaGF2ZSBpZGVudGljYWwgbnVtYmVyCisvLyBvZiBlbGVtZW50cy4KK2NsYXNzIFNEVENpc1NhbWVOdW1FbHRzQXM8aW50IE9wTnVtLCBpbnQgT3RoZXJPcD4gOiBTRFR5cGVDb25zdHJhaW50PE9wTnVtPiB7CisgIGludCBPdGhlck9wZXJhbmROdW0gPSBPdGhlck9wOworfQorCisvLyBTRFRDaXNTYW1lU2l6ZUFzIC0gVGhlIHR3byBzcGVjaWZpZWQgb3BlcmFuZHMgaGF2ZSBpZGVudGljYWwgc2l6ZS4KK2NsYXNzIFNEVENpc1NhbWVTaXplQXM8aW50IE9wTnVtLCBpbnQgT3RoZXJPcD4gOiBTRFR5cGVDb25zdHJhaW50PE9wTnVtPiB7CisgIGludCBPdGhlck9wZXJhbmROdW0gPSBPdGhlck9wOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU2VsZWN0aW9uIERBRyBUeXBlIFByb2ZpbGUgZGVmaW5pdGlvbnMuCisvLworLy8gVGhlc2UgdXNlIHRoZSBjb25zdHJhaW50cyBkZWZpbmVkIGFib3ZlIHRvIGRlc2NyaWJlIHRoZSB0eXBlIHJlcXVpcmVtZW50cyBvZgorLy8gdGhlIHZhcmlvdXMgbm9kZXMuICBUaGVzZSBhcmUgbm90IGhhcmQgY29kZWQgaW50byB0YmxnZW4sIGFsbG93aW5nIHRhcmdldHMgdG8KKy8vIGFkZCB0aGVpciBvd24gaWYgbmVlZGVkLgorLy8KKworLy8gU0RUeXBlUHJvZmlsZSAtIFRoaXMgcHJvZmlsZSBkZXNjcmliZXMgdGhlIHR5cGUgcmVxdWlyZW1lbnRzIG9mIGEgU2VsZWN0aW9uCisvLyBEQUcgbm9kZS4KK2NsYXNzIFNEVHlwZVByb2ZpbGU8aW50IG51bXJlc3VsdHMsIGludCBudW1vcGVyYW5kcywKKyAgICAgICAgICAgICAgICAgICAgbGlzdDxTRFR5cGVDb25zdHJhaW50PiBjb25zdHJhaW50cz4geworICBpbnQgTnVtUmVzdWx0cyA9IG51bXJlc3VsdHM7CisgIGludCBOdW1PcGVyYW5kcyA9IG51bW9wZXJhbmRzOworICBsaXN0PFNEVHlwZUNvbnN0cmFpbnQ+IENvbnN0cmFpbnRzID0gY29uc3RyYWludHM7Cit9CisKKy8vIEJ1aWx0aW4gcHJvZmlsZXMuCitkZWYgU0RUSW50TGVhZjogU0RUeXBlUHJvZmlsZTwxLCAwLCBbU0RUQ2lzSW50PDA+XT47ICAgICAgICAgLy8gZm9yICdpbW0nLgorZGVmIFNEVEZQTGVhZiA6IFNEVHlwZVByb2ZpbGU8MSwgMCwgW1NEVENpc0ZQPDA+XT47ICAgICAgICAgIC8vIGZvciAnZnBpbW0nLgorZGVmIFNEVFB0ckxlYWY6IFNEVHlwZVByb2ZpbGU8MSwgMCwgW1NEVENpc1B0clR5PDA+XT47ICAgICAgIC8vIGZvciAnJmcnLgorZGVmIFNEVE90aGVyICA6IFNEVHlwZVByb2ZpbGU8MSwgMCwgW1NEVENpc1ZUPDAsIE90aGVyVlQ+XT47IC8vIGZvciAndnQnLgorZGVmIFNEVFVOREVGICA6IFNEVHlwZVByb2ZpbGU8MSwgMCwgW10+OyAgICAgICAgICAgICAgICAgICAgIC8vIGZvciAndW5kZWYnLgorZGVmIFNEVFVuYXJ5T3AgIDogU0RUeXBlUHJvZmlsZTwxLCAxLCBbXT47ICAgICAgICAgICAgICAgICAgIC8vIGZvciBiaXRjb252ZXJ0LgorCitkZWYgU0RUSW50QmluT3AgOiBTRFR5cGVQcm9maWxlPDEsIDIsIFsgICAgIC8vIGFkZCwgYW5kLCBvciwgeG9yLCB1ZGl2LCBldGMuCisgIFNEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzU2FtZUFzPDAsIDI+LCBTRFRDaXNJbnQ8MD4KK10+OworZGVmIFNEVEludFNoaWZ0T3AgOiBTRFR5cGVQcm9maWxlPDEsIDIsIFsgICAvLyBzaGwsIHNyYSwgc3JsCisgIFNEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzSW50PDA+LCBTRFRDaXNJbnQ8Mj4KK10+OworZGVmIFNEVEludFNhdE5vU2hPcCA6IFNEVHlwZVByb2ZpbGU8MSwgMiwgWyAgIC8vIHNzYXQgd2l0aCBubyBzaGlmdAorICBTRFRDaXNTYW1lQXM8MCwgMT4sIFNEVENpc0ludDwyPgorXT47CitkZWYgU0RUSW50QmluSGlMb09wIDogU0RUeXBlUHJvZmlsZTwyLCAyLCBbIC8vIG11bGhpLCBtdWxsbywgc2RpdnJlbSwgdWRpdnJlbQorICBTRFRDaXNTYW1lQXM8MCwgMT4sIFNEVENpc1NhbWVBczwwLCAyPiwgU0RUQ2lzU2FtZUFzPDAsIDM+LFNEVENpc0ludDwwPgorXT47CisKK2RlZiBTRFRGUEJpbk9wIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbICAgICAgLy8gZmFkZCwgZm11bCwgZXRjLgorICBTRFRDaXNTYW1lQXM8MCwgMT4sIFNEVENpc1NhbWVBczwwLCAyPiwgU0RUQ2lzRlA8MD4KK10+OworZGVmIFNEVEZQU2lnbk9wIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbICAgICAvLyBmY29weXNpZ24uCisgIFNEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzRlA8MD4sIFNEVENpc0ZQPDI+CitdPjsKK2RlZiBTRFRGUFRlcm5hcnlPcCA6IFNEVHlwZVByb2ZpbGU8MSwgMywgWyAgLy8gZm1hZGQsIGZubXN1YiwgZXRjLgorICBTRFRDaXNTYW1lQXM8MCwgMT4sIFNEVENpc1NhbWVBczwwLCAyPiwgU0RUQ2lzU2FtZUFzPDAsIDM+LCBTRFRDaXNGUDwwPgorXT47CitkZWYgU0RUSW50VW5hcnlPcCA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgWyAgIC8vIGN0bHosIGN0dHoKKyAgU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNJbnQ8MD4KK10+OworZGVmIFNEVEludEV4dGVuZE9wIDogU0RUeXBlUHJvZmlsZTwxLCAxLCBbICAvLyBzZXh0LCB6ZXh0LCBhbnlleHQKKyAgU0RUQ2lzSW50PDA+LCBTRFRDaXNJbnQ8MT4sIFNEVENpc09wU21hbGxlclRoYW5PcDwxLCAwPiwgU0RUQ2lzU2FtZU51bUVsdHNBczwwLCAxPgorXT47CitkZWYgU0RUSW50VHJ1bmNPcCAgOiBTRFR5cGVQcm9maWxlPDEsIDEsIFsgIC8vIHRydW5jCisgIFNEVENpc0ludDwwPiwgU0RUQ2lzSW50PDE+LCBTRFRDaXNPcFNtYWxsZXJUaGFuT3A8MCwgMT4sIFNEVENpc1NhbWVOdW1FbHRzQXM8MCwgMT4KK10+OworZGVmIFNEVEZQVW5hcnlPcCAgOiBTRFR5cGVQcm9maWxlPDEsIDEsIFsgICAvLyBmbmVnLCBmc3FydCwgZXRjCisgIFNEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzRlA8MD4KK10+OworZGVmIFNEVEZQUm91bmRPcCAgOiBTRFR5cGVQcm9maWxlPDEsIDEsIFsgICAvLyBmcm91bmQKKyAgU0RUQ2lzRlA8MD4sIFNEVENpc0ZQPDE+LCBTRFRDaXNPcFNtYWxsZXJUaGFuT3A8MCwgMT4sIFNEVENpc1NhbWVOdW1FbHRzQXM8MCwgMT4KK10+OworZGVmIFNEVEZQRXh0ZW5kT3AgIDogU0RUeXBlUHJvZmlsZTwxLCAxLCBbICAvLyBmZXh0ZW5kCisgIFNEVENpc0ZQPDA+LCBTRFRDaXNGUDwxPiwgU0RUQ2lzT3BTbWFsbGVyVGhhbk9wPDEsIDA+LCBTRFRDaXNTYW1lTnVtRWx0c0FzPDAsIDE+CitdPjsKK2RlZiBTRFRJbnRUb0ZQT3AgOiBTRFR5cGVQcm9maWxlPDEsIDEsIFsgICAgLy8gW3N1XWludF90b19mcAorICBTRFRDaXNGUDwwPiwgU0RUQ2lzSW50PDE+LCBTRFRDaXNTYW1lTnVtRWx0c0FzPDAsIDE+CitdPjsKK2RlZiBTRFRGUFRvSW50T3AgOiBTRFR5cGVQcm9maWxlPDEsIDEsIFsgICAgLy8gZnBfdG9fW3N1XWludAorICBTRFRDaXNJbnQ8MD4sIFNEVENpc0ZQPDE+LCBTRFRDaXNTYW1lTnVtRWx0c0FzPDAsIDE+CitdPjsKK2RlZiBTRFRFeHRJbnJlZyA6IFNEVHlwZVByb2ZpbGU8MSwgMiwgWyAgICAgLy8gc2V4dF9pbnJlZworICBTRFRDaXNTYW1lQXM8MCwgMT4sIFNEVENpc0ludDwwPiwgU0RUQ2lzVlQ8MiwgT3RoZXJWVD4sCisgIFNEVENpc1ZUU21hbGxlclRoYW5PcDwyLCAxPgorXT47CitkZWYgU0RURXh0SW52ZWMgOiBTRFR5cGVQcm9maWxlPDEsIDEsIFsgICAgIC8vIHNleHRfaW52ZWMKKyAgU0RUQ2lzSW50PDA+LCBTRFRDaXNWZWM8MD4sIFNEVENpc0ludDwxPiwgU0RUQ2lzVmVjPDE+LAorICBTRFRDaXNPcFNtYWxsZXJUaGFuT3A8MSwgMD4sIFNEVENpc1NhbWVTaXplQXM8MCwxPgorXT47CisKK2RlZiBTRFRTZXRDQyA6IFNEVHlwZVByb2ZpbGU8MSwgMywgWyAgICAgICAgLy8gc2V0Y2MKKyAgU0RUQ2lzSW50PDA+LCBTRFRDaXNTYW1lQXM8MSwgMj4sIFNEVENpc1ZUPDMsIE90aGVyVlQ+CitdPjsKKworZGVmIFNEVFNlbGVjdCA6IFNEVHlwZVByb2ZpbGU8MSwgMywgWyAgICAgICAvLyBzZWxlY3QKKyAgU0RUQ2lzSW50PDE+LCBTRFRDaXNTYW1lQXM8MCwgMj4sIFNEVENpc1NhbWVBczwyLCAzPgorXT47CisKK2RlZiBTRFRWU2VsZWN0IDogU0RUeXBlUHJvZmlsZTwxLCAzLCBbICAgICAgIC8vIHZzZWxlY3QKKyAgU0RUQ2lzVmVjPDA+LCBTRFRDaXNJbnQ8MT4sIFNEVENpc1NhbWVBczwwLCAyPiwgU0RUQ2lzU2FtZUFzPDIsIDM+LCBTRFRDaXNTYW1lTnVtRWx0c0FzPDAsIDE+CitdPjsKKworZGVmIFNEVFNlbGVjdENDIDogU0RUeXBlUHJvZmlsZTwxLCA1LCBbICAgICAvLyBzZWxlY3RfY2MKKyAgU0RUQ2lzU2FtZUFzPDEsIDI+LCBTRFRDaXNTYW1lQXM8MywgND4sIFNEVENpc1NhbWVBczwwLCAzPiwKKyAgU0RUQ2lzVlQ8NSwgT3RoZXJWVD4KK10+OworCitkZWYgU0RUQnIgOiBTRFR5cGVQcm9maWxlPDAsIDEsIFsgICAgICAgICAgIC8vIGJyCisgIFNEVENpc1ZUPDAsIE90aGVyVlQ+CitdPjsKKworZGVmIFNEVEJyQ0MgOiBTRFR5cGVQcm9maWxlPDAsIDQsIFsgICAgICAgLy8gYnJjYworICBTRFRDaXNWVDwwLCBPdGhlclZUPiwgU0RUQ2lzU2FtZUFzPDEsIDI+LCBTRFRDaXNWVDwzLCBPdGhlclZUPgorXT47CisKK2RlZiBTRFRCcmNvbmQgOiBTRFR5cGVQcm9maWxlPDAsIDIsIFsgICAgICAgLy8gYnJjb25kCisgIFNEVENpc0ludDwwPiwgU0RUQ2lzVlQ8MSwgT3RoZXJWVD4KK10+OworCitkZWYgU0RUQnJpbmQgOiBTRFR5cGVQcm9maWxlPDAsIDEsIFsgICAgICAgIC8vIGJyaW5kCisgIFNEVENpc1B0clR5PDA+CitdPjsKKworZGVmIFNEVENhdGNocmV0IDogU0RUeXBlUHJvZmlsZTwwLCAyLCBbICAgICAvLyBjYXRjaHJldAorICBTRFRDaXNWVDwwLCBPdGhlclZUPiwgU0RUQ2lzVlQ8MSwgT3RoZXJWVD4KK10+OworCitkZWYgU0RUTm9uZSA6IFNEVHlwZVByb2ZpbGU8MCwgMCwgW10+OyAgICAgIC8vIHJldCwgdHJhcAorCitkZWYgU0RUTG9hZCA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgWyAgICAgICAgIC8vIGxvYWQKKyAgU0RUQ2lzUHRyVHk8MT4KK10+OworCitkZWYgU0RUU3RvcmUgOiBTRFR5cGVQcm9maWxlPDAsIDIsIFsgICAgICAgIC8vIHN0b3JlCisgIFNEVENpc1B0clR5PDE+CitdPjsKKworZGVmIFNEVElTdG9yZSA6IFNEVHlwZVByb2ZpbGU8MSwgMywgWyAgICAgICAvLyBpbmRleGVkIHN0b3JlCisgIFNEVENpc1NhbWVBczwwLCAyPiwgU0RUQ2lzUHRyVHk8MD4sIFNEVENpc1B0clR5PDM+CitdPjsKKworZGVmIFNEVE1hc2tlZFN0b3JlOiBTRFR5cGVQcm9maWxlPDAsIDMsIFsgICAgICAgLy8gbWFza2VkIHN0b3JlCisgIFNEVENpc1B0clR5PDA+LCBTRFRDaXNWZWM8MT4sIFNEVENpc1ZlYzwyPiwgU0RUQ2lzU2FtZU51bUVsdHNBczwxLCAyPgorXT47CisKK2RlZiBTRFRNYXNrZWRMb2FkOiBTRFR5cGVQcm9maWxlPDEsIDMsIFsgICAgICAgLy8gbWFza2VkIGxvYWQKKyAgU0RUQ2lzVmVjPDA+LCBTRFRDaXNQdHJUeTwxPiwgU0RUQ2lzVmVjPDI+LCBTRFRDaXNTYW1lQXM8MCwgMz4sCisgIFNEVENpc1NhbWVOdW1FbHRzQXM8MCwgMj4KK10+OworCitkZWYgU0RUTWFza2VkR2F0aGVyOiBTRFR5cGVQcm9maWxlPDIsIDMsIFsgICAgICAgLy8gbWFza2VkIGdhdGhlcgorICBTRFRDaXNWZWM8MD4sIFNEVENpc1ZlYzwxPiwgU0RUQ2lzU2FtZUFzPDAsIDI+LCBTRFRDaXNTYW1lQXM8MSwgMz4sCisgIFNEVENpc1B0clR5PDQ+LCBTRFRDVmVjRWx0aXNWVDwxLCBpMT4sIFNEVENpc1NhbWVOdW1FbHRzQXM8MCwgMT4KK10+OworCitkZWYgU0RUTWFza2VkU2NhdHRlcjogU0RUeXBlUHJvZmlsZTwxLCAzLCBbICAgICAgIC8vIG1hc2tlZCBzY2F0dGVyCisgIFNEVENpc1ZlYzwwPiwgU0RUQ2lzVmVjPDE+LCBTRFRDaXNTYW1lQXM8MCwgMj4sIFNEVENpc1NhbWVOdW1FbHRzQXM8MCwgMT4sCisgIFNEVENWZWNFbHRpc1ZUPDAsIGkxPiwgU0RUQ2lzUHRyVHk8Mz4KK10+OworCitkZWYgU0RUVmVjU2h1ZmZsZSA6IFNEVHlwZVByb2ZpbGU8MSwgMiwgWworICBTRFRDaXNTYW1lQXM8MCwgMT4sIFNEVENpc1NhbWVBczwxLCAyPgorXT47CitkZWYgU0RUVmVjRXh0cmFjdCA6IFNEVHlwZVByb2ZpbGU8MSwgMiwgWyAgIC8vIHZlY3RvciBleHRyYWN0CisgIFNEVENpc0VsdE9mVmVjPDAsIDE+LCBTRFRDaXNQdHJUeTwyPgorXT47CitkZWYgU0RUVmVjSW5zZXJ0IDogU0RUeXBlUHJvZmlsZTwxLCAzLCBbICAgIC8vIHZlY3RvciBpbnNlcnQKKyAgU0RUQ2lzRWx0T2ZWZWM8MiwgMT4sIFNEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzUHRyVHk8Mz4KK10+OworCitkZWYgU0RUU3ViVmVjRXh0cmFjdCA6IFNEVHlwZVByb2ZpbGU8MSwgMiwgWy8vIHN1YnZlY3RvciBleHRyYWN0CisgIFNEVENpc1N1YlZlY09mVmVjPDAsMT4sIFNEVENpc0ludDwyPgorXT47CitkZWYgU0RUU3ViVmVjSW5zZXJ0IDogU0RUeXBlUHJvZmlsZTwxLCAzLCBbIC8vIHN1YnZlY3RvciBpbnNlcnQKKyAgU0RUQ2lzU3ViVmVjT2ZWZWM8MiwgMT4sIFNEVENpc1NhbWVBczwwLDE+LCBTRFRDaXNJbnQ8Mz4KK10+OworCitkZWYgU0RUUHJlZmV0Y2ggOiBTRFR5cGVQcm9maWxlPDAsIDQsIFsgICAgIC8vIHByZWZldGNoCisgIFNEVENpc1B0clR5PDA+LCBTRFRDaXNTYW1lQXM8MSwgMj4sIFNEVENpc1NhbWVBczwxLCAzPiwgU0RUQ2lzSW50PDE+CitdPjsKKworZGVmIFNEVE1lbUJhcnJpZXIgOiBTRFR5cGVQcm9maWxlPDAsIDUsIFsgICAvLyBtZW1vcnkgYmFycmllcgorICBTRFRDaXNTYW1lQXM8MCwxPiwgIFNEVENpc1NhbWVBczwwLDI+LCAgU0RUQ2lzU2FtZUFzPDAsMz4sIFNEVENpc1NhbWVBczwwLDQ+LAorICBTRFRDaXNJbnQ8MD4KK10+OworZGVmIFNEVEF0b21pY0ZlbmNlIDogU0RUeXBlUHJvZmlsZTwwLCAyLCBbCisgIFNEVENpc1NhbWVBczwwLDE+LCBTRFRDaXNQdHJUeTwwPgorXT47CitkZWYgU0RUQXRvbWljMyA6IFNEVHlwZVByb2ZpbGU8MSwgMywgWworICBTRFRDaXNTYW1lQXM8MCwyPiwgIFNEVENpc1NhbWVBczwwLDM+LCBTRFRDaXNJbnQ8MD4sIFNEVENpc1B0clR5PDE+CitdPjsKK2RlZiBTRFRBdG9taWMyIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbCisgIFNEVENpc1NhbWVBczwwLDI+LCBTRFRDaXNJbnQ8MD4sIFNEVENpc1B0clR5PDE+CitdPjsKK2RlZiBTRFRBdG9taWNTdG9yZSA6IFNEVHlwZVByb2ZpbGU8MCwgMiwgWworICBTRFRDaXNQdHJUeTwwPiwgU0RUQ2lzSW50PDE+CitdPjsKK2RlZiBTRFRBdG9taWNMb2FkIDogU0RUeXBlUHJvZmlsZTwxLCAxLCBbCisgIFNEVENpc0ludDwwPiwgU0RUQ2lzUHRyVHk8MT4KK10+OworCitkZWYgU0RUQ29udmVydE9wIDogU0RUeXBlUHJvZmlsZTwxLCA1LCBbIC8vY3Z0c3MsIHN1LCB1cywgdXUsIGZmLCBmcywgZnUsIHNmLCBzdQorICBTRFRDaXNWVDwyLCBPdGhlclZUPiwgU0RUQ2lzVlQ8MywgT3RoZXJWVD4sIFNEVENpc1B0clR5PDQ+LCBTRFRDaXNQdHJUeTw1PgorXT47CisKK2NsYXNzIFNEQ2FsbFNlcVN0YXJ0PGxpc3Q8U0RUeXBlQ29uc3RyYWludD4gY29uc3RyYWludHM+IDoKKyAgICAgICAgU0RUeXBlUHJvZmlsZTwwLCAyLCBjb25zdHJhaW50cz47CitjbGFzcyBTRENhbGxTZXFFbmQ8bGlzdDxTRFR5cGVDb25zdHJhaW50PiBjb25zdHJhaW50cz4gOgorICAgICAgICBTRFR5cGVQcm9maWxlPDAsIDIsIGNvbnN0cmFpbnRzPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNlbGVjdGlvbiBEQUcgTm9kZSBkZWZpbml0aW9ucy4KKy8vCitjbGFzcyBTRE5vZGU8c3RyaW5nIG9wY29kZSwgU0RUeXBlUHJvZmlsZSB0eXBlcHJvZiwKKyAgICAgICAgICAgICBsaXN0PFNETm9kZVByb3BlcnR5PiBwcm9wcyA9IFtdLCBzdHJpbmcgc2RjbGFzcyA9ICJTRE5vZGUiPgorICAgICAgICAgICAgIDogU0RQYXR0ZXJuT3BlcmF0b3IgeworICBzdHJpbmcgT3Bjb2RlICA9IG9wY29kZTsKKyAgc3RyaW5nIFNEQ2xhc3MgPSBzZGNsYXNzOworICBsZXQgUHJvcGVydGllcyA9IHByb3BzOworICBTRFR5cGVQcm9maWxlIFR5cGVQcm9maWxlID0gdHlwZXByb2Y7Cit9CisKKy8vIFNwZWNpYWwgVGFibGVHZW4tcmVjb2duaXplZCBkYWcgbm9kZXMKK2RlZiBzZXQ7CitkZWYgaW1wbGljaXQ7CitkZWYgbm9kZTsKK2RlZiBzcmN2YWx1ZTsKKworZGVmIGltbSAgICAgICAgOiBTRE5vZGU8IklTRDo6Q29uc3RhbnQiICAsIFNEVEludExlYWYgLCBbXSwgIkNvbnN0YW50U0ROb2RlIj47CitkZWYgdGltbSAgICAgICA6IFNETm9kZTwiSVNEOjpUYXJnZXRDb25zdGFudCIsU0RUSW50TGVhZiwgW10sICJDb25zdGFudFNETm9kZSI+OworZGVmIGZwaW1tICAgICAgOiBTRE5vZGU8IklTRDo6Q29uc3RhbnRGUCIsIFNEVEZQTGVhZiAgLCBbXSwgIkNvbnN0YW50RlBTRE5vZGUiPjsKK2RlZiB2dCAgICAgICAgIDogU0ROb2RlPCJJU0Q6OlZBTFVFVFlQRSIgLCBTRFRPdGhlciAgICwgW10sICJWVFNETm9kZSI+OworZGVmIGJiICAgICAgICAgOiBTRE5vZGU8IklTRDo6QmFzaWNCbG9jayIsIFNEVE90aGVyICAgLCBbXSwgIkJhc2ljQmxvY2tTRE5vZGUiPjsKK2RlZiBjb25kICAgICAgIDogU0ROb2RlPCJJU0Q6OkNPTkRDT0RFIiAgLCBTRFRPdGhlciAgICwgW10sICJDb25kQ29kZVNETm9kZSI+OworZGVmIHVuZGVmICAgICAgOiBTRE5vZGU8IklTRDo6VU5ERUYiICAgICAsIFNEVFVOREVGICAgLCBbXT47CitkZWYgZ2xvYmFsYWRkciA6IFNETm9kZTwiSVNEOjpHbG9iYWxBZGRyZXNzIiwgICAgICAgICBTRFRQdHJMZWFmLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJHbG9iYWxBZGRyZXNzU0ROb2RlIj47CitkZWYgdGdsb2JhbGFkZHIgOiBTRE5vZGU8IklTRDo6VGFyZ2V0R2xvYmFsQWRkcmVzcyIsICBTRFRQdHJMZWFmLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiR2xvYmFsQWRkcmVzc1NETm9kZSI+OworZGVmIGdsb2JhbHRsc2FkZHIgOiBTRE5vZGU8IklTRDo6R2xvYmFsVExTQWRkcmVzcyIsICAgICAgICAgU0RUUHRyTGVhZiwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICJHbG9iYWxBZGRyZXNzU0ROb2RlIj47CitkZWYgdGdsb2JhbHRsc2FkZHIgOiBTRE5vZGU8IklTRDo6VGFyZ2V0R2xvYmFsVExTQWRkcmVzcyIsICBTRFRQdHJMZWFmLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJHbG9iYWxBZGRyZXNzU0ROb2RlIj47CitkZWYgY29uc3Rwb29sICAgOiBTRE5vZGU8IklTRDo6Q29uc3RhbnRQb29sIiwgICAgICAgICBTRFRQdHJMZWFmLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQ29uc3RhbnRQb29sU0ROb2RlIj47CitkZWYgdGNvbnN0cG9vbCAgOiBTRE5vZGU8IklTRDo6VGFyZ2V0Q29uc3RhbnRQb29sIiwgICBTRFRQdHJMZWFmLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQ29uc3RhbnRQb29sU0ROb2RlIj47CitkZWYganVtcHRhYmxlICAgOiBTRE5vZGU8IklTRDo6SnVtcFRhYmxlIiwgICAgICAgICAgICBTRFRQdHJMZWFmLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiSnVtcFRhYmxlU0ROb2RlIj47CitkZWYgdGp1bXB0YWJsZSAgOiBTRE5vZGU8IklTRDo6VGFyZ2V0SnVtcFRhYmxlIiwgICAgICBTRFRQdHJMZWFmLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiSnVtcFRhYmxlU0ROb2RlIj47CitkZWYgZnJhbWVpbmRleCAgOiBTRE5vZGU8IklTRDo6RnJhbWVJbmRleCIsICAgICAgICAgICBTRFRQdHJMZWFmLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRnJhbWVJbmRleFNETm9kZSI+OworZGVmIHRmcmFtZWluZGV4IDogU0ROb2RlPCJJU0Q6OlRhcmdldEZyYW1lSW5kZXgiLCAgICAgU0RUUHRyTGVhZiwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIkZyYW1lSW5kZXhTRE5vZGUiPjsKK2RlZiBleHRlcm5hbHN5bSA6IFNETm9kZTwiSVNEOjpFeHRlcm5hbFN5bWJvbCIsICAgICAgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJFeHRlcm5hbFN5bWJvbFNETm9kZSI+OworZGVmIHRleHRlcm5hbHN5bTogU0ROb2RlPCJJU0Q6OlRhcmdldEV4dGVybmFsU3ltYm9sIiwgU0RUUHRyTGVhZiwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIkV4dGVybmFsU3ltYm9sU0ROb2RlIj47CitkZWYgbWNzeW06IFNETm9kZTwiSVNEOjpNQ1N5bWJvbCIsIFNEVFB0ckxlYWYsIFtdLCAiTUNTeW1ib2xTRE5vZGUiPjsKK2RlZiBibG9ja2FkZHJlc3MgOiBTRE5vZGU8IklTRDo6QmxvY2tBZGRyZXNzIiwgICAgICAgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJCbG9ja0FkZHJlc3NTRE5vZGUiPjsKK2RlZiB0YmxvY2thZGRyZXNzOiBTRE5vZGU8IklTRDo6VGFyZ2V0QmxvY2tBZGRyZXNzIiwgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJCbG9ja0FkZHJlc3NTRE5vZGUiPjsKKworZGVmIGFkZCAgICAgICAgOiBTRE5vZGU8IklTRDo6QUREIiAgICAgICAsIFNEVEludEJpbk9wICAgLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBDb21tdXRhdGl2ZSwgU0ROUEFzc29jaWF0aXZlXT47CitkZWYgc3ViICAgICAgICA6IFNETm9kZTwiSVNEOjpTVUIiICAgICAgICwgU0RUSW50QmluT3A+OworZGVmIG11bCAgICAgICAgOiBTRE5vZGU8IklTRDo6TVVMIiAgICAgICAsIFNEVEludEJpbk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBDb21tdXRhdGl2ZSwgU0ROUEFzc29jaWF0aXZlXT47CitkZWYgbXVsaHMgICAgICA6IFNETm9kZTwiSVNEOjpNVUxIUyIgICAgICwgU0RUSW50QmluT3AsIFtTRE5QQ29tbXV0YXRpdmVdPjsKK2RlZiBtdWxodSAgICAgIDogU0ROb2RlPCJJU0Q6Ok1VTEhVIiAgICAgLCBTRFRJbnRCaW5PcCwgW1NETlBDb21tdXRhdGl2ZV0+OworZGVmIHNtdWxsb2hpICAgOiBTRE5vZGU8IklTRDo6U01VTF9MT0hJIiAsIFNEVEludEJpbkhpTG9PcCwgW1NETlBDb21tdXRhdGl2ZV0+OworZGVmIHVtdWxsb2hpICAgOiBTRE5vZGU8IklTRDo6VU1VTF9MT0hJIiAsIFNEVEludEJpbkhpTG9PcCwgW1NETlBDb21tdXRhdGl2ZV0+OworZGVmIHNkaXYgICAgICAgOiBTRE5vZGU8IklTRDo6U0RJViIgICAgICAsIFNEVEludEJpbk9wPjsKK2RlZiB1ZGl2ICAgICAgIDogU0ROb2RlPCJJU0Q6OlVESVYiICAgICAgLCBTRFRJbnRCaW5PcD47CitkZWYgc3JlbSAgICAgICA6IFNETm9kZTwiSVNEOjpTUkVNIiAgICAgICwgU0RUSW50QmluT3A+OworZGVmIHVyZW0gICAgICAgOiBTRE5vZGU8IklTRDo6VVJFTSIgICAgICAsIFNEVEludEJpbk9wPjsKK2RlZiBzZGl2cmVtICAgIDogU0ROb2RlPCJJU0Q6OlNESVZSRU0iICAgLCBTRFRJbnRCaW5IaUxvT3A+OworZGVmIHVkaXZyZW0gICAgOiBTRE5vZGU8IklTRDo6VURJVlJFTSIgICAsIFNEVEludEJpbkhpTG9PcD47CitkZWYgc3JsICAgICAgICA6IFNETm9kZTwiSVNEOjpTUkwiICAgICAgICwgU0RUSW50U2hpZnRPcD47CitkZWYgc3JhICAgICAgICA6IFNETm9kZTwiSVNEOjpTUkEiICAgICAgICwgU0RUSW50U2hpZnRPcD47CitkZWYgc2hsICAgICAgICA6IFNETm9kZTwiSVNEOjpTSEwiICAgICAgICwgU0RUSW50U2hpZnRPcD47CitkZWYgcm90bCAgICAgICA6IFNETm9kZTwiSVNEOjpST1RMIiAgICAgICwgU0RUSW50U2hpZnRPcD47CitkZWYgcm90ciAgICAgICA6IFNETm9kZTwiSVNEOjpST1RSIiAgICAgICwgU0RUSW50U2hpZnRPcD47CitkZWYgYW5kICAgICAgICA6IFNETm9kZTwiSVNEOjpBTkQiICAgICAgICwgU0RUSW50QmluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUENvbW11dGF0aXZlLCBTRE5QQXNzb2NpYXRpdmVdPjsKK2RlZiBvciAgICAgICAgIDogU0ROb2RlPCJJU0Q6Ok9SIiAgICAgICAgLCBTRFRJbnRCaW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QQ29tbXV0YXRpdmUsIFNETlBBc3NvY2lhdGl2ZV0+OworZGVmIHhvciAgICAgICAgOiBTRE5vZGU8IklTRDo6WE9SIiAgICAgICAsIFNEVEludEJpbk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBDb21tdXRhdGl2ZSwgU0ROUEFzc29jaWF0aXZlXT47CitkZWYgYWRkYyAgICAgICA6IFNETm9kZTwiSVNEOjpBRERDIiAgICAgICwgU0RUSW50QmluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUENvbW11dGF0aXZlLCBTRE5QT3V0R2x1ZV0+OworZGVmIGFkZGUgICAgICAgOiBTRE5vZGU8IklTRDo6QURERSIgICAgICAsIFNEVEludEJpbk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBDb21tdXRhdGl2ZSwgU0ROUE91dEdsdWUsIFNETlBJbkdsdWVdPjsKK2RlZiBzdWJjICAgICAgIDogU0ROb2RlPCJJU0Q6OlNVQkMiICAgICAgLCBTRFRJbnRCaW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QT3V0R2x1ZV0+OworZGVmIHN1YmUgICAgICAgOiBTRE5vZGU8IklTRDo6U1VCRSIgICAgICAsIFNEVEludEJpbk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBPdXRHbHVlLCBTRE5QSW5HbHVlXT47CitkZWYgc21pbiAgICAgICA6IFNETm9kZTwiSVNEOjpTTUlOIiAgICAgICwgU0RUSW50QmluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBDb21tdXRhdGl2ZSwgU0ROUEFzc29jaWF0aXZlXT47CitkZWYgc21heCAgICAgICA6IFNETm9kZTwiSVNEOjpTTUFYIiAgICAgICwgU0RUSW50QmluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBDb21tdXRhdGl2ZSwgU0ROUEFzc29jaWF0aXZlXT47CitkZWYgdW1pbiAgICAgICA6IFNETm9kZTwiSVNEOjpVTUlOIiAgICAgICwgU0RUSW50QmluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBDb21tdXRhdGl2ZSwgU0ROUEFzc29jaWF0aXZlXT47CitkZWYgdW1heCAgICAgICA6IFNETm9kZTwiSVNEOjpVTUFYIiAgICAgICwgU0RUSW50QmluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBDb21tdXRhdGl2ZSwgU0ROUEFzc29jaWF0aXZlXT47CisKK2RlZiBzZXh0X2lucmVnIDogU0ROb2RlPCJJU0Q6OlNJR05fRVhURU5EX0lOUkVHIiwgU0RURXh0SW5yZWc+OworZGVmIHNleHRfaW52ZWMgOiBTRE5vZGU8IklTRDo6U0lHTl9FWFRFTkRfVkVDVE9SX0lOUkVHIiwgU0RURXh0SW52ZWM+OworZGVmIHpleHRfaW52ZWMgOiBTRE5vZGU8IklTRDo6WkVST19FWFRFTkRfVkVDVE9SX0lOUkVHIiwgU0RURXh0SW52ZWM+OworCitkZWYgYWJzICAgICAgICA6IFNETm9kZTwiSVNEOjpBQlMiICAgICAgICAsIFNEVEludFVuYXJ5T3A+OworZGVmIGJpdHJldmVyc2UgOiBTRE5vZGU8IklTRDo6QklUUkVWRVJTRSIgLCBTRFRJbnRVbmFyeU9wPjsKK2RlZiBic3dhcCAgICAgIDogU0ROb2RlPCJJU0Q6OkJTV0FQIiAgICAgICwgU0RUSW50VW5hcnlPcD47CitkZWYgY3RseiAgICAgICA6IFNETm9kZTwiSVNEOjpDVExaIiAgICAgICAsIFNEVEludFVuYXJ5T3A+OworZGVmIGN0dHogICAgICAgOiBTRE5vZGU8IklTRDo6Q1RUWiIgICAgICAgLCBTRFRJbnRVbmFyeU9wPjsKK2RlZiBjdHBvcCAgICAgIDogU0ROb2RlPCJJU0Q6OkNUUE9QIiAgICAgICwgU0RUSW50VW5hcnlPcD47CitkZWYgY3Rsel96ZXJvX3VuZGVmIDogU0ROb2RlPCJJU0Q6OkNUTFpfWkVST19VTkRFRiIsIFNEVEludFVuYXJ5T3A+OworZGVmIGN0dHpfemVyb191bmRlZiA6IFNETm9kZTwiSVNEOjpDVFRaX1pFUk9fVU5ERUYiLCBTRFRJbnRVbmFyeU9wPjsKK2RlZiBzZXh0ICAgICAgIDogU0ROb2RlPCJJU0Q6OlNJR05fRVhURU5EIiwgU0RUSW50RXh0ZW5kT3A+OworZGVmIHpleHQgICAgICAgOiBTRE5vZGU8IklTRDo6WkVST19FWFRFTkQiLCBTRFRJbnRFeHRlbmRPcD47CitkZWYgYW55ZXh0ICAgICA6IFNETm9kZTwiSVNEOjpBTllfRVhURU5EIiAsIFNEVEludEV4dGVuZE9wPjsKK2RlZiB0cnVuYyAgICAgIDogU0ROb2RlPCJJU0Q6OlRSVU5DQVRFIiAgICwgU0RUSW50VHJ1bmNPcD47CitkZWYgYml0Y29udmVydCA6IFNETm9kZTwiSVNEOjpCSVRDQVNUIiAgICAsIFNEVFVuYXJ5T3A+OworZGVmIGFkZHJzcGFjZWNhc3QgOiBTRE5vZGU8IklTRDo6QUREUlNQQUNFQ0FTVCIsIFNEVFVuYXJ5T3A+OworZGVmIGV4dHJhY3RlbHQgOiBTRE5vZGU8IklTRDo6RVhUUkFDVF9WRUNUT1JfRUxUIiwgU0RUVmVjRXh0cmFjdD47CitkZWYgaW5zZXJ0ZWx0ICA6IFNETm9kZTwiSVNEOjpJTlNFUlRfVkVDVE9SX0VMVCIsIFNEVFZlY0luc2VydD47CisKK2RlZiBmYWRkICAgICAgIDogU0ROb2RlPCJJU0Q6OkZBREQiICAgICAgICwgU0RURlBCaW5PcCwgW1NETlBDb21tdXRhdGl2ZV0+OworZGVmIGZzdWIgICAgICAgOiBTRE5vZGU8IklTRDo6RlNVQiIgICAgICAgLCBTRFRGUEJpbk9wPjsKK2RlZiBmbXVsICAgICAgIDogU0ROb2RlPCJJU0Q6OkZNVUwiICAgICAgICwgU0RURlBCaW5PcCwgW1NETlBDb21tdXRhdGl2ZV0+OworZGVmIGZkaXYgICAgICAgOiBTRE5vZGU8IklTRDo6RkRJViIgICAgICAgLCBTRFRGUEJpbk9wPjsKK2RlZiBmcmVtICAgICAgIDogU0ROb2RlPCJJU0Q6OkZSRU0iICAgICAgICwgU0RURlBCaW5PcD47CitkZWYgZm1hICAgICAgICA6IFNETm9kZTwiSVNEOjpGTUEiICAgICAgICAsIFNEVEZQVGVybmFyeU9wPjsKK2RlZiBmbWFkICAgICAgIDogU0ROb2RlPCJJU0Q6OkZNQUQiICAgICAgICwgU0RURlBUZXJuYXJ5T3A+OworZGVmIGZhYnMgICAgICAgOiBTRE5vZGU8IklTRDo6RkFCUyIgICAgICAgLCBTRFRGUFVuYXJ5T3A+OworZGVmIGZtaW5udW0gICAgOiBTRE5vZGU8IklTRDo6Rk1JTk5VTSIgICAgLCBTRFRGUEJpbk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QQ29tbXV0YXRpdmUsIFNETlBBc3NvY2lhdGl2ZV0+OworZGVmIGZtYXhudW0gICAgOiBTRE5vZGU8IklTRDo6Rk1BWE5VTSIgICAgLCBTRFRGUEJpbk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QQ29tbXV0YXRpdmUsIFNETlBBc3NvY2lhdGl2ZV0+OworZGVmIGZtaW5uYW4gICAgOiBTRE5vZGU8IklTRDo6Rk1JTk5BTiIgICAgLCBTRFRGUEJpbk9wPjsKK2RlZiBmbWF4bmFuICAgIDogU0ROb2RlPCJJU0Q6OkZNQVhOQU4iICAgICwgU0RURlBCaW5PcD47CitkZWYgZmdldHNpZ24gICA6IFNETm9kZTwiSVNEOjpGR0VUU0lHTiIgICAsIFNEVEZQVG9JbnRPcD47CitkZWYgZmNhbm9uaWNhbGl6ZSA6IFNETm9kZTwiSVNEOjpGQ0FOT05JQ0FMSVpFIiwgU0RURlBVbmFyeU9wPjsKK2RlZiBmbmVnICAgICAgIDogU0ROb2RlPCJJU0Q6OkZORUciICAgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmc3FydCAgICAgIDogU0ROb2RlPCJJU0Q6OkZTUVJUIiAgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmc2luICAgICAgIDogU0ROb2RlPCJJU0Q6OkZTSU4iICAgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmY29zICAgICAgIDogU0ROb2RlPCJJU0Q6OkZDT1MiICAgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmZXhwMiAgICAgIDogU0ROb2RlPCJJU0Q6OkZFWFAyIiAgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmcG93ICAgICAgIDogU0ROb2RlPCJJU0Q6OkZQT1ciICAgICAgICwgU0RURlBCaW5PcD47CitkZWYgZmxvZzIgICAgICA6IFNETm9kZTwiSVNEOjpGTE9HMiIgICAgICAsIFNEVEZQVW5hcnlPcD47CitkZWYgZnJpbnQgICAgICA6IFNETm9kZTwiSVNEOjpGUklOVCIgICAgICAsIFNEVEZQVW5hcnlPcD47CitkZWYgZnRydW5jICAgICA6IFNETm9kZTwiSVNEOjpGVFJVTkMiICAgICAsIFNEVEZQVW5hcnlPcD47CitkZWYgZmNlaWwgICAgICA6IFNETm9kZTwiSVNEOjpGQ0VJTCIgICAgICAsIFNEVEZQVW5hcnlPcD47CitkZWYgZmZsb29yICAgICA6IFNETm9kZTwiSVNEOjpGRkxPT1IiICAgICAsIFNEVEZQVW5hcnlPcD47CitkZWYgZm5lYXJieWludCA6IFNETm9kZTwiSVNEOjpGTkVBUkJZSU5UIiAsIFNEVEZQVW5hcnlPcD47CitkZWYgZnJvdW5kICAgICA6IFNETm9kZTwiSVNEOjpGUk9VTkQiICAgICAsIFNEVEZQVW5hcnlPcD47CisKK2RlZiBmcHJvdW5kICAgIDogU0ROb2RlPCJJU0Q6OkZQX1JPVU5EIiAgICwgU0RURlBSb3VuZE9wPjsKK2RlZiBmcGV4dGVuZCAgIDogU0ROb2RlPCJJU0Q6OkZQX0VYVEVORCIgICwgU0RURlBFeHRlbmRPcD47CitkZWYgZmNvcHlzaWduICA6IFNETm9kZTwiSVNEOjpGQ09QWVNJR04iICAsIFNEVEZQU2lnbk9wPjsKKworZGVmIHNpbnRfdG9fZnAgOiBTRE5vZGU8IklTRDo6U0lOVF9UT19GUCIgLCBTRFRJbnRUb0ZQT3A+OworZGVmIHVpbnRfdG9fZnAgOiBTRE5vZGU8IklTRDo6VUlOVF9UT19GUCIgLCBTRFRJbnRUb0ZQT3A+OworZGVmIGZwX3RvX3NpbnQgOiBTRE5vZGU8IklTRDo6RlBfVE9fU0lOVCIgLCBTRFRGUFRvSW50T3A+OworZGVmIGZwX3RvX3VpbnQgOiBTRE5vZGU8IklTRDo6RlBfVE9fVUlOVCIgLCBTRFRGUFRvSW50T3A+OworZGVmIGYxNl90b19mcCAgOiBTRE5vZGU8IklTRDo6RlAxNl9UT19GUCIgLCBTRFRJbnRUb0ZQT3A+OworZGVmIGZwX3RvX2YxNiAgOiBTRE5vZGU8IklTRDo6RlBfVE9fRlAxNiIgLCBTRFRGUFRvSW50T3A+OworCitkZWYgc2V0Y2MgICAgICA6IFNETm9kZTwiSVNEOjpTRVRDQyIgICAgICAsIFNEVFNldENDPjsKK2RlZiBzZWxlY3QgICAgIDogU0ROb2RlPCJJU0Q6OlNFTEVDVCIgICAgICwgU0RUU2VsZWN0PjsKK2RlZiB2c2VsZWN0ICAgIDogU0ROb2RlPCJJU0Q6OlZTRUxFQ1QiICAgICwgU0RUVlNlbGVjdD47CitkZWYgc2VsZWN0Y2MgICA6IFNETm9kZTwiSVNEOjpTRUxFQ1RfQ0MiICAsIFNEVFNlbGVjdENDPjsKKworZGVmIGJyY2MgICAgICAgOiBTRE5vZGU8IklTRDo6QlJfQ0MiICAgICAgLCBTRFRCckNDLCAgIFtTRE5QSGFzQ2hhaW5dPjsKK2RlZiBicmNvbmQgICAgIDogU0ROb2RlPCJJU0Q6OkJSQ09ORCIgICAgICwgU0RUQnJjb25kLCBbU0ROUEhhc0NoYWluXT47CitkZWYgYnJpbmQgICAgICA6IFNETm9kZTwiSVNEOjpCUklORCIgICAgICAsIFNEVEJyaW5kLCAgW1NETlBIYXNDaGFpbl0+OworZGVmIGJyICAgICAgICAgOiBTRE5vZGU8IklTRDo6QlIiICAgICAgICAgLCBTRFRCciwgICAgIFtTRE5QSGFzQ2hhaW5dPjsKK2RlZiBjYXRjaHJldCAgIDogU0ROb2RlPCJJU0Q6OkNBVENIUkVUIiAgICwgU0RUQ2F0Y2hyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QU2lkZUVmZmVjdF0+OworZGVmIGNsZWFudXByZXQgOiBTRE5vZGU8IklTRDo6Q0xFQU5VUFJFVCIgLCBTRFROb25lLCAgIFtTRE5QSGFzQ2hhaW5dPjsKK2RlZiBjYXRjaHBhZCAgIDogU0ROb2RlPCJJU0Q6OkNBVENIUEFEIiAgICwgU0RUTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBTaWRlRWZmZWN0XT47CisKK2RlZiB0cmFwICAgICAgIDogU0ROb2RlPCJJU0Q6OlRSQVAiICAgICAgICwgU0RUTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBTaWRlRWZmZWN0XT47CitkZWYgZGVidWd0cmFwICA6IFNETm9kZTwiSVNEOjpERUJVR1RSQVAiICAsIFNEVE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QU2lkZUVmZmVjdF0+OworCitkZWYgcHJlZmV0Y2ggICA6IFNETm9kZTwiSVNEOjpQUkVGRVRDSCIgICAsIFNEVFByZWZldGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heUxvYWQsIFNETlBNYXlTdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTRE5QTWVtT3BlcmFuZF0+OworCitkZWYgcmVhZGN5Y2xlY291bnRlciA6IFNETm9kZTwiSVNEOjpSRUFEQ1lDTEVDT1VOVEVSIiwgU0RUSW50TGVhZiwKKyAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBTaWRlRWZmZWN0XT47CisKK2RlZiBhdG9taWNfZmVuY2UgOiBTRE5vZGU8IklTRDo6QVRPTUlDX0ZFTkNFIiAsIFNEVEF0b21pY0ZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QU2lkZUVmZmVjdF0+OworCitkZWYgYXRvbWljX2NtcF9zd2FwIDogU0ROb2RlPCJJU0Q6OkFUT01JQ19DTVBfU1dBUCIgLCBTRFRBdG9taWMzLAorICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNYXlMb2FkLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIGF0b21pY19sb2FkX2FkZCA6IFNETm9kZTwiSVNEOjpBVE9NSUNfTE9BRF9BREQiICwgU0RUQXRvbWljMiwKKyAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBhdG9taWNfc3dhcCAgICAgOiBTRE5vZGU8IklTRDo6QVRPTUlDX1NXQVAiLCBTRFRBdG9taWMyLAorICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNYXlMb2FkLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIGF0b21pY19sb2FkX3N1YiA6IFNETm9kZTwiSVNEOjpBVE9NSUNfTE9BRF9TVUIiICwgU0RUQXRvbWljMiwKKyAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBhdG9taWNfbG9hZF9hbmQgOiBTRE5vZGU8IklTRDo6QVRPTUlDX0xPQURfQU5EIiAsIFNEVEF0b21pYzIsCisgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47CitkZWYgYXRvbWljX2xvYWRfY2xyIDogU0ROb2RlPCJJU0Q6OkFUT01JQ19MT0FEX0NMUiIgLCBTRFRBdG9taWMyLAorICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNYXlMb2FkLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIGF0b21pY19sb2FkX29yICA6IFNETm9kZTwiSVNEOjpBVE9NSUNfTE9BRF9PUiIgLCBTRFRBdG9taWMyLAorICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNYXlMb2FkLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIGF0b21pY19sb2FkX3hvciA6IFNETm9kZTwiSVNEOjpBVE9NSUNfTE9BRF9YT1IiICwgU0RUQXRvbWljMiwKKyAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBhdG9taWNfbG9hZF9uYW5kOiBTRE5vZGU8IklTRDo6QVRPTUlDX0xPQURfTkFORCIsIFNEVEF0b21pYzIsCisgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47CitkZWYgYXRvbWljX2xvYWRfbWluIDogU0ROb2RlPCJJU0Q6OkFUT01JQ19MT0FEX01JTiIsIFNEVEF0b21pYzIsCisgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47CitkZWYgYXRvbWljX2xvYWRfbWF4IDogU0ROb2RlPCJJU0Q6OkFUT01JQ19MT0FEX01BWCIsIFNEVEF0b21pYzIsCisgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47CitkZWYgYXRvbWljX2xvYWRfdW1pbiA6IFNETm9kZTwiSVNEOjpBVE9NSUNfTE9BRF9VTUlOIiwgU0RUQXRvbWljMiwKKyAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBhdG9taWNfbG9hZF91bWF4IDogU0ROb2RlPCJJU0Q6OkFUT01JQ19MT0FEX1VNQVgiLCBTRFRBdG9taWMyLAorICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNYXlMb2FkLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIGF0b21pY19sb2FkICAgICAgOiBTRE5vZGU8IklTRDo6QVRPTUlDX0xPQUQiLCBTRFRBdG9taWNMb2FkLAorICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBhdG9taWNfc3RvcmUgICAgIDogU0ROb2RlPCJJU0Q6OkFUT01JQ19TVE9SRSIsIFNEVEF0b21pY1N0b3JlLAorICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNZW1PcGVyYW5kXT47CisKK2RlZiBtYXNrZWRfc3RvcmUgOiBTRE5vZGU8IklTRDo6TVNUT1JFIiwgIFNEVE1hc2tlZFN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNZW1PcGVyYW5kXT47CitkZWYgbWFza2VkX2xvYWQgIDogU0ROb2RlPCJJU0Q6Ok1MT0FEIiwgIFNEVE1hc2tlZExvYWQsCisgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlMb2FkLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIG1hc2tlZF9zY2F0dGVyIDogU0ROb2RlPCJJU0Q6Ok1TQ0FUVEVSIiwgIFNEVE1hc2tlZFNjYXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBtYXNrZWRfZ2F0aGVyICA6IFNETm9kZTwiSVNEOjpNR0FUSEVSIiwgIFNEVE1hc2tlZEdhdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47CisKKy8vIERvIG5vdCB1c2UgbGQsIHN0IGRpcmVjdGx5LiBVc2UgbG9hZCwgZXh0bG9hZCwgc2V4dGxvYWQsIHpleHRsb2FkLCBzdG9yZSwKKy8vIGFuZCB0cnVuY3N0IChzZWUgYmVsb3cpLgorZGVmIGxkICAgICAgICAgOiBTRE5vZGU8IklTRDo6TE9BRCIgICAgICAgLCBTRFRMb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47CitkZWYgc3QgICAgICAgICA6IFNETm9kZTwiSVNEOjpTVE9SRSIgICAgICAsIFNEVFN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIGlzdCAgICAgICAgOiBTRE5vZGU8IklTRDo6U1RPUkUiICAgICAgLCBTRFRJU3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNZW1PcGVyYW5kXT47CisKK2RlZiB2ZWN0b3Jfc2h1ZmZsZSA6IFNETm9kZTwiSVNEOjpWRUNUT1JfU0hVRkZMRSIsIFNEVFZlY1NodWZmbGUsIFtdPjsKK2RlZiBidWlsZF92ZWN0b3IgOiBTRE5vZGU8IklTRDo6QlVJTERfVkVDVE9SIiwgU0RUeXBlUHJvZmlsZTwxLCAtMSwgW10+LCBbXT47CitkZWYgc2NhbGFyX3RvX3ZlY3RvciA6IFNETm9kZTwiSVNEOjpTQ0FMQVJfVE9fVkVDVE9SIiwgU0RUeXBlUHJvZmlsZTwxLCAxLCBbXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXT47CisKKy8vIHZlY3Rvcl9leHRyYWN0L3ZlY3Rvcl9pbnNlcnQgYXJlIGRlcHJlY2F0ZWQuIGV4dHJhY3RlbHQvaW5zZXJ0ZWx0CisvLyBhcmUgcHJlZmVycmVkLgorZGVmIHZlY3Rvcl9leHRyYWN0IDogU0ROb2RlPCJJU0Q6OkVYVFJBQ1RfVkVDVE9SX0VMVCIsCisgICAgU0RUeXBlUHJvZmlsZTwxLCAyLCBbU0RUQ2lzUHRyVHk8Mj5dPiwgW10+OworZGVmIHZlY3Rvcl9pbnNlcnQgOiBTRE5vZGU8IklTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQiLAorICAgIFNEVHlwZVByb2ZpbGU8MSwgMywgW1NEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzUHRyVHk8Mz5dPiwgW10+OworZGVmIGNvbmNhdF92ZWN0b3JzIDogU0ROb2RlPCJJU0Q6OkNPTkNBVF9WRUNUT1JTIiwKKyAgICBTRFR5cGVQcm9maWxlPDEsIDIsIFtTRFRDaXNTdWJWZWNPZlZlYzwxLCAwPiwgU0RUQ2lzU2FtZUFzPDEsIDI+XT4sW10+OworCisvLyBUaGlzIG9wZXJhdG9yIGRvZXMgbm90IGRvIHN1YnZlY3RvciB0eXBlIGNoZWNraW5nLiAgVGhlIEFSTQorLy8gYmFja2VuZCwgYXQgbGVhc3QsIG5lZWRzIGl0LgorZGVmIHZlY3Rvcl9leHRyYWN0X3N1YnZlYyA6IFNETm9kZTwiSVNEOjpFWFRSQUNUX1NVQlZFQ1RPUiIsCisgICAgU0RUeXBlUHJvZmlsZTwxLCAyLCBbU0RUQ2lzSW50PDI+LCBTRFRDaXNWZWM8MT4sIFNEVENpc1ZlYzwwPl0+LAorICAgIFtdPjsKKworLy8gVGhpcyBvcGVyYXRvciBkb2VzIHN1YnZlY3RvciB0eXBlIGNoZWNraW5nLgorZGVmIGV4dHJhY3Rfc3VidmVjdG9yIDogU0ROb2RlPCJJU0Q6OkVYVFJBQ1RfU1VCVkVDVE9SIiwgU0RUU3ViVmVjRXh0cmFjdCwgW10+OworZGVmIGluc2VydF9zdWJ2ZWN0b3IgOiBTRE5vZGU8IklTRDo6SU5TRVJUX1NVQlZFQ1RPUiIsIFNEVFN1YlZlY0luc2VydCwgW10+OworCisvLyBOb2RlcyBmb3IgaW50cmluc2ljcywgeW91IHNob3VsZCB1c2UgdGhlIGludHJpbnNpYyBpdHNlbGYgYW5kIGxldCB0YmxnZW4gdXNlCisvLyB0aGVzZSBpbnRlcm5hbGx5LiAgRG9uJ3QgcmVmZXJlbmNlIHRoZXNlIGRpcmVjdGx5LgorZGVmIGludHJpbnNpY192b2lkIDogU0ROb2RlPCJJU0Q6OklOVFJJTlNJQ19WT0lEIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFR5cGVQcm9maWxlPDAsIC0xLCBbU0RUQ2lzUHRyVHk8MD5dPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluXT47CitkZWYgaW50cmluc2ljX3dfY2hhaW4gOiBTRE5vZGU8IklTRDo6SU5UUklOU0lDX1dfQ0hBSU4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVHlwZVByb2ZpbGU8MSwgLTEsIFtTRFRDaXNQdHJUeTwxPl0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW5dPjsKK2RlZiBpbnRyaW5zaWNfd29fY2hhaW4gOiBTRE5vZGU8IklTRDo6SU5UUklOU0lDX1dPX0NIQUlOIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUeXBlUHJvZmlsZTwxLCAtMSwgW1NEVENpc1B0clR5PDE+XT4sIFtdPjsKKworZGVmIFNEVF9hc3NlcnRleHQgOiBTRFR5cGVQcm9maWxlPDEsIDEsCisgIFtTRFRDaXNJbnQ8MD4sIFNEVENpc0ludDwxPiwgU0RUQ2lzU2FtZUFzPDEsIDA+XT47CitkZWYgYXNzZXJ0c2V4dCA6IFNETm9kZTwiSVNEOjpBc3NlcnRTZXh0IiwgU0RUX2Fzc2VydGV4dD47CitkZWYgYXNzZXJ0emV4dCA6IFNETm9kZTwiSVNEOjpBc3NlcnRaZXh0IiwgU0RUX2Fzc2VydGV4dD47CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNlbGVjdGlvbiBEQUcgQ29uZGl0aW9uIENvZGVzCisKK2NsYXNzIENvbmRDb2RlOyAvLyBJU0Q6OkNvbmRDb2RlIGVudW1zCitkZWYgU0VUT0VRIDogQ29uZENvZGU7IGRlZiBTRVRPR1QgOiBDb25kQ29kZTsKK2RlZiBTRVRPR0UgOiBDb25kQ29kZTsgZGVmIFNFVE9MVCA6IENvbmRDb2RlOyBkZWYgU0VUT0xFIDogQ29uZENvZGU7CitkZWYgU0VUT05FIDogQ29uZENvZGU7IGRlZiBTRVRPICAgOiBDb25kQ29kZTsgZGVmIFNFVFVPICA6IENvbmRDb2RlOworZGVmIFNFVFVFUSA6IENvbmRDb2RlOyBkZWYgU0VUVUdUIDogQ29uZENvZGU7IGRlZiBTRVRVR0UgOiBDb25kQ29kZTsKK2RlZiBTRVRVTFQgOiBDb25kQ29kZTsgZGVmIFNFVFVMRSA6IENvbmRDb2RlOyBkZWYgU0VUVU5FIDogQ29uZENvZGU7CisKK2RlZiBTRVRFUSA6IENvbmRDb2RlOyBkZWYgU0VUR1QgOiBDb25kQ29kZTsgZGVmIFNFVEdFIDogQ29uZENvZGU7CitkZWYgU0VUTFQgOiBDb25kQ29kZTsgZGVmIFNFVExFIDogQ29uZENvZGU7IGRlZiBTRVRORSA6IENvbmRDb2RlOworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTZWxlY3Rpb24gREFHIE5vZGUgVHJhbnNmb3JtYXRpb24gRnVuY3Rpb25zLgorLy8KKy8vIFRoaXMgbWVjaGFuaXNtIGFsbG93cyB0YXJnZXRzIHRvIG1hbmlwdWxhdGUgbm9kZXMgaW4gdGhlIG91dHB1dCBEQUcgb25jZSBhCisvLyBtYXRjaCBoYXMgYmVlbiBmb3JtZWQuICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHRvIG1hbmlwdWxhdGUgaW1tZWRpYXRlCisvLyB2YWx1ZXMuCisvLworY2xhc3MgU0ROb2RlWEZvcm08U0ROb2RlIG9wYywgY29kZSB4Zm9ybUZ1bmN0aW9uPiB7CisgIFNETm9kZSBPcGNvZGUgPSBvcGM7CisgIGNvZGUgWEZvcm1GdW5jdGlvbiA9IHhmb3JtRnVuY3Rpb247Cit9CisKK2RlZiBOT09QX1NETm9kZVhGb3JtIDogU0ROb2RlWEZvcm08aW1tLCBbe31dPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBhdFByZWQgU3ViY2xhc3Nlcy4KKy8vCisvLyBUaGVzZSBhbGxvdyBzcGVjaWZ5aW5nIGRpZmZlcmVudCBzb3J0cyBvZiBwcmVkaWNhdGVzIHRoYXQgY29udHJvbCB3aGV0aGVyIGEKKy8vIG5vZGUgaXMgbWF0Y2hlZC4KKy8vCitjbGFzcyBQYXRQcmVkOworCitjbGFzcyBDb2RlUGF0UHJlZDxjb2RlIHByZWRpY2F0ZT4gOiBQYXRQcmVkIHsKKyAgY29kZSBQcmVkaWNhdGVDb2RlID0gcHJlZGljYXRlOworfQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTZWxlY3Rpb24gREFHIFBhdHRlcm4gRnJhZ21lbnRzLgorLy8KKy8vIFBhdHRlcm4gZnJhZ21lbnRzIGFyZSByZXVzYWJsZSBjaHVua3Mgb2YgZGFncyB0aGF0IG1hdGNoIHNwZWNpZmljIHRoaW5ncy4KKy8vIFRoZXkgY2FuIHRha2UgYXJndW1lbnRzIGFuZCBoYXZlIEMrKyBwcmVkaWNhdGVzIHRoYXQgY29udHJvbCB3aGV0aGVyIHRoZXkKKy8vIG1hdGNoLiAgVGhleSBhcmUgaW50ZW5kZWQgdG8gbWFrZSB0aGUgcGF0dGVybnMgZm9yIGNvbW1vbiBpbnN0cnVjdGlvbnMgbW9yZQorLy8gY29tcGFjdCBhbmQgcmVhZGFibGUuCisvLworCisvLy8gUGF0RnJhZyAtIFJlcHJlc2VudHMgYSBwYXR0ZXJuIGZyYWdtZW50LiAgVGhpcyBjYW4gbWF0Y2ggc29tZXRoaW5nIG9uIHRoZQorLy8vIERBRywgZnJvbSBhIHNpbmdsZSBub2RlIHRvIG11bHRpcGxlIG5lc3RlZCBvdGhlciBmcmFnbWVudHMuCisvLy8KK2NsYXNzIFBhdEZyYWc8ZGFnIG9wcywgZGFnIGZyYWcsIGNvZGUgcHJlZCA9IFt7fV0sCisgICAgICAgICAgICAgIFNETm9kZVhGb3JtIHhmb3JtID0gTk9PUF9TRE5vZGVYRm9ybT4gOiBTRFBhdHRlcm5PcGVyYXRvciB7CisgIGRhZyBPcGVyYW5kcyA9IG9wczsKKyAgZGFnIEZyYWdtZW50ID0gZnJhZzsKKyAgY29kZSBQcmVkaWNhdGVDb2RlID0gcHJlZDsKKyAgY29kZSBJbW1lZGlhdGVDb2RlID0gW3t9XTsKKyAgU0ROb2RlWEZvcm0gT3BlcmFuZFRyYW5zZm9ybSA9IHhmb3JtOworCisgIC8vIERlZmluZSBhIGZldyBwcmUtcGFja2FnZWQgcHJlZGljYXRlcy4gVGhpcyBoZWxwcyBHbG9iYWxJU2VsIGltcG9ydAorICAvLyBleGlzdGluZyBydWxlcyBmcm9tIFNlbGVjdGlvbkRBRyBmb3IgbWFueSBjb21tb24gY2FzZXMuCisgIC8vIFRoZXkgd2lsbCBiZSB0ZXN0ZWQgcHJpb3IgdG8gdGhlIGNvZGUgaW4gcHJlZCBhbmQgbXVzdCBub3QgYmUgdXNlZCBpbgorICAvLyBJbW1MZWFmIGFuZCBpdHMgc3ViY2xhc3Nlcy4KKworICAvLyBJcyB0aGUgZGVzaXJlZCBwcmUtcGFja2FnZWQgcHJlZGljYXRlIGZvciBhIGxvYWQ/CisgIGJpdCBJc0xvYWQgPSA/OworICAvLyBJcyB0aGUgZGVzaXJlZCBwcmUtcGFja2FnZWQgcHJlZGljYXRlIGZvciBhIHN0b3JlPworICBiaXQgSXNTdG9yZSA9ID87CisgIC8vIElzIHRoZSBkZXNpcmVkIHByZS1wYWNrYWdlZCBwcmVkaWNhdGUgZm9yIGFuIGF0b21pYz8KKyAgYml0IElzQXRvbWljID0gPzsKKworICAvLyBjYXN0PExvYWRTRE5vZGU+KE4pLT5nZXRBZGRyZXNzaW5nTW9kZSgpID09IElTRDo6VU5JTkRFWEVEOworICAvLyBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0QWRkcmVzc2luZ01vZGUoKSA9PSBJU0Q6OlVOSU5ERVhFRDsKKyAgYml0IElzVW5pbmRleGVkID0gPzsKKworICAvLyBjYXN0PExvYWRTRE5vZGU+KE4pLT5nZXRFeHRlbnNpb25UeXBlKCkgIT0gSVNEOjpOT05fRVhUTE9BRAorICBiaXQgSXNOb25FeHRMb2FkID0gPzsKKyAgLy8gY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0RXh0ZW5zaW9uVHlwZSgpID09IElTRDo6RVhUTE9BRDsKKyAgYml0IElzQW55RXh0TG9hZCA9ID87CisgIC8vIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldEV4dGVuc2lvblR5cGUoKSA9PSBJU0Q6OlNFWFRMT0FEOworICBiaXQgSXNTaWduRXh0TG9hZCA9ID87CisgIC8vIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldEV4dGVuc2lvblR5cGUoKSA9PSBJU0Q6OlpFWFRMT0FEOworICBiaXQgSXNaZXJvRXh0TG9hZCA9ID87CisgIC8vICFjYXN0PFN0b3JlU0ROb2RlPihOKS0+aXNUcnVuY2F0aW5nU3RvcmUoKTsKKyAgLy8gY2FzdDxTdG9yZVNETm9kZT4oTiktPmlzVHJ1bmNhdGluZ1N0b3JlKCk7CisgIGJpdCBJc1RydW5jU3RvcmUgPSA/OworCisgIC8vIGNhc3Q8QXRvbWljU0ROb2RlPihOKS0+Z2V0T3JkZXJpbmcoKSA9PSBBdG9taWNPcmRlcmluZzo6TW9ub3RvbmljCisgIGJpdCBJc0F0b21pY09yZGVyaW5nTW9ub3RvbmljID0gPzsKKyAgLy8gY2FzdDxBdG9taWNTRE5vZGU+KE4pLT5nZXRPcmRlcmluZygpID09IEF0b21pY09yZGVyaW5nOjpBY3F1aXJlCisgIGJpdCBJc0F0b21pY09yZGVyaW5nQWNxdWlyZSA9ID87CisgIC8vIGNhc3Q8QXRvbWljU0ROb2RlPihOKS0+Z2V0T3JkZXJpbmcoKSA9PSBBdG9taWNPcmRlcmluZzo6UmVsZWFzZQorICBiaXQgSXNBdG9taWNPcmRlcmluZ1JlbGVhc2UgPSA/OworICAvLyBjYXN0PEF0b21pY1NETm9kZT4oTiktPmdldE9yZGVyaW5nKCkgPT0gQXRvbWljT3JkZXJpbmc6OkFjcXVpcmVSZWxlYXNlCisgIGJpdCBJc0F0b21pY09yZGVyaW5nQWNxdWlyZVJlbGVhc2UgPSA/OworICAvLyBjYXN0PEF0b21pY1NETm9kZT4oTiktPmdldE9yZGVyaW5nKCkgPT0gQXRvbWljT3JkZXJpbmc6OlNlcXVlbnRpYWxseUNvbnNpc3RlbnQKKyAgYml0IElzQXRvbWljT3JkZXJpbmdTZXF1ZW50aWFsbHlDb25zaXN0ZW50ID0gPzsKKworICAvLyBpc0FjcXVpcmVPclN0cm9uZ2VyKGNhc3Q8QXRvbWljU0ROb2RlPihOKS0+Z2V0T3JkZXJpbmcoKSkKKyAgLy8gIWlzQWNxdWlyZU9yU3Ryb25nZXIoY2FzdDxBdG9taWNTRE5vZGU+KE4pLT5nZXRPcmRlcmluZygpKQorICBiaXQgSXNBdG9taWNPcmRlcmluZ0FjcXVpcmVPclN0cm9uZ2VyID0gPzsKKworICAvLyBpc1JlbGVhc2VPclN0cm9uZ2VyKGNhc3Q8QXRvbWljU0ROb2RlPihOKS0+Z2V0T3JkZXJpbmcoKSkKKyAgLy8gIWlzUmVsZWFzZU9yU3Ryb25nZXIoY2FzdDxBdG9taWNTRE5vZGU+KE4pLT5nZXRPcmRlcmluZygpKQorICBiaXQgSXNBdG9taWNPcmRlcmluZ1JlbGVhc2VPclN0cm9uZ2VyID0gPzsKKworICAvLyBjYXN0PExvYWRTRE5vZGU+KE4pLT5nZXRNZW1vcnlWVCgpID09IE1WVDo6PFZUPjsKKyAgLy8gY2FzdDxTdG9yZVNETm9kZT4oTiktPmdldE1lbW9yeVZUKCkgPT0gTVZUOjo8VlQ+OworICBWYWx1ZVR5cGUgTWVtb3J5VlQgPSA/OworICAvLyBjYXN0PExvYWRTRE5vZGU+KE4pLT5nZXRNZW1vcnlWVCgpLmdldFNjYWxhclR5cGUoKSA9PSBNVlQ6OjxWVD47CisgIC8vIGNhc3Q8U3RvcmVTRE5vZGU+KE4pLT5nZXRNZW1vcnlWVCgpLmdldFNjYWxhclR5cGUoKSA9PSBNVlQ6OjxWVD47CisgIFZhbHVlVHlwZSBTY2FsYXJNZW1vcnlWVCA9ID87Cit9CisKKy8vIE91dFBhdEZyYWcgaXMgYSBwYXR0ZXJuIGZyYWdtZW50IHRoYXQgaXMgdXNlZCBhcyBwYXJ0IG9mIGFuIG91dHB1dCBwYXR0ZXJuCisvLyAobm90IGFuIGlucHV0IHBhdHRlcm4pLiBUaGVzZSBkbyBub3QgaGF2ZSBwcmVkaWNhdGVzIG9yIHRyYW5zZm9ybXMsIGJ1dCBhcmUKKy8vIHVzZWQgdG8gYXZvaWQgcmVwZWF0ZWQgc3ViZXhwcmVzc2lvbnMgaW4gb3V0cHV0IHBhdHRlcm5zLgorY2xhc3MgT3V0UGF0RnJhZzxkYWcgb3BzLCBkYWcgZnJhZz4KKyA6IFBhdEZyYWc8b3BzLCBmcmFnLCBbe31dLCBOT09QX1NETm9kZVhGb3JtPjsKKworLy8gUGF0TGVhZidzIGFyZSBwYXR0ZXJuIGZyYWdtZW50cyB0aGF0IGhhdmUgbm8gb3BlcmFuZHMuICBUaGlzIGlzIGp1c3QgYSBoZWxwZXIKKy8vIHRvIGRlZmluZSBpbW1lZGlhdGVzIGFuZCBvdGhlciBjb21tb24gdGhpbmdzIGNvbmNpc2VseS4KK2NsYXNzIFBhdExlYWY8ZGFnIGZyYWcsIGNvZGUgcHJlZCA9IFt7fV0sIFNETm9kZVhGb3JtIHhmb3JtID0gTk9PUF9TRE5vZGVYRm9ybT4KKyA6IFBhdEZyYWc8KG9wcyksIGZyYWcsIHByZWQsIHhmb3JtPjsKKworCisvLyBJbW1MZWFmIGlzIGEgcGF0dGVybiBmcmFnbWVudCB3aXRoIGEgY29uc3RyYWludCBvbiB0aGUgaW1tZWRpYXRlLiAgVGhlCisvLyBjb25zdHJhaW50IGlzIGEgZnVuY3Rpb24gdGhhdCBpcyBydW4gb24gdGhlIGltbWVkaWF0ZSAoYWx3YXlzIHdpdGggdGhlIHZhbHVlCisvLyBzaWduIGV4dGVuZGVkIG91dCB0byBhbiBpbnQ2NF90KSBhcyBJbW0uICBGb3IgZXhhbXBsZToKKy8vCisvLyAgZGVmIGltbVNFeHQ4IDogSW1tTGVhZjxpMTYsIFt7IHJldHVybiAoY2hhcilJbW0gPT0gSW1tOyB9XT47CisvLworLy8gdGhpcyBpcyBhIG1vcmUgY29udmVuaWVudCBmb3JtIHRvIG1hdGNoICdpbW0nIG5vZGVzIGluIHRoYW4gUGF0TGVhZiBhbmQgYWxzbworLy8gaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgUGF0TGVhZiBiZWNhdXNlIGl0IGFsbG93cyB0aGUgY29kZSBnZW5lcmF0b3IgdG8KKy8vIHJlYXNvbiBtb3JlIGFib3V0IHRoZSBjb25zdHJhaW50LgorLy8KKy8vIElmIEZhc3RJc2VsIHNob3VsZCBpZ25vcmUgYWxsIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgYW4gb3BlcmFuZCBvZiB0aGlzIHR5cGUsCisvLyB0aGUgRmFzdElzZWxTaG91bGRJZ25vcmUgZmxhZyBjYW4gYmUgc2V0LiAgVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gdG8gcmVkdWNlCisvLyB0aGUgY29kZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgZmFzdCBpbnN0cnVjdGlvbiBzZWxlY3Rvci4KK2NsYXNzIEltbUxlYWY8VmFsdWVUeXBlIHZ0LCBjb2RlIHByZWQsIFNETm9kZVhGb3JtIHhmb3JtID0gTk9PUF9TRE5vZGVYRm9ybSwKKyAgICAgICAgICAgICAgU0ROb2RlIEltbU5vZGUgPSBpbW0+CisgIDogUGF0RnJhZzwob3BzKSwgKHZ0IEltbU5vZGUpLCBbe31dLCB4Zm9ybT4geworICBsZXQgSW1tZWRpYXRlQ29kZSA9IHByZWQ7CisgIGJpdCBGYXN0SXNlbFNob3VsZElnbm9yZSA9IDA7CisKKyAgLy8gSXMgdGhlIGRhdGEgdHlwZSBvZiB0aGUgaW1tZWRpYXRlIGFuIEFQSW50PworICBiaXQgSXNBUEludCA9IDA7CisKKyAgLy8gSXMgdGhlIGRhdGEgdHlwZSBvZiB0aGUgaW1tZWRpYXRlIGFuIEFQRmxvYXQ/CisgIGJpdCBJc0FQRmxvYXQgPSAwOworfQorCisvLyBBbiBJbW1MZWFmIGV4Y2VwdCB0aGF0IEltbSBpcyBhbiBBUEludC4gVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3UgbmVlZCB0bworLy8gemVyby1leHRlbmQgdGhlIGltbWVkaWF0ZSBpbnN0ZWFkIG9mIHNpZ24tZXh0ZW5kIGl0LgorLy8KKy8vIE5vdGUgdGhhdCBGYXN0SVNlbCBkb2VzIG5vdCBjdXJyZW50bHkgdW5kZXJzdGFuZCBJbnRJbW1MZWFmIGFuZCB3aWxsIG5vdAorLy8gZ2VuZXJhdGUgY29kZSBmb3IgcnVsZXMgdGhhdCBtYWtlIHVzZSBvZiBpdC4gQXMgc3VjaCwgaXQgZG9lcyBub3QgbWFrZSBzZW5zZQorLy8gdG8gcmVwbGFjZSBJbW1MZWFmIHdpdGggSW50SW1tTGVhZi4gSG93ZXZlciwgcmVwbGFjaW5nIFBhdExlYWYgd2l0aCBhbgorLy8gSW50SW1tTGVhZiB3aWxsIGFsbG93IEdsb2JhbElTZWwgdG8gaW1wb3J0IHRoZSBydWxlLgorY2xhc3MgSW50SW1tTGVhZjxWYWx1ZVR5cGUgdnQsIGNvZGUgcHJlZCwgU0ROb2RlWEZvcm0geGZvcm0gPSBOT09QX1NETm9kZVhGb3JtPgorICAgIDogSW1tTGVhZjx2dCwgcHJlZCwgeGZvcm0+IHsKKyAgbGV0IElzQVBJbnQgPSAxOworICBsZXQgRmFzdElzZWxTaG91bGRJZ25vcmUgPSAxOworfQorCisvLyBBbiBJbW1MZWFmIGV4Y2VwdCB0aGF0IEltbSBpcyBhbiBBUEZsb2F0LgorLy8KKy8vIE5vdGUgdGhhdCBGYXN0SVNlbCBkb2VzIG5vdCBjdXJyZW50bHkgdW5kZXJzdGFuZCBGUEltbUxlYWYgYW5kIHdpbGwgbm90CisvLyBnZW5lcmF0ZSBjb2RlIGZvciBydWxlcyB0aGF0IG1ha2UgdXNlIG9mIGl0LgorY2xhc3MgRlBJbW1MZWFmPFZhbHVlVHlwZSB2dCwgY29kZSBwcmVkLCBTRE5vZGVYRm9ybSB4Zm9ybSA9IE5PT1BfU0ROb2RlWEZvcm0+CisgIDogSW1tTGVhZjx2dCwgcHJlZCwgeGZvcm0sIGZwaW1tPiB7CisgIGxldCBJc0FQRmxvYXQgPSAxOworICBsZXQgRmFzdElzZWxTaG91bGRJZ25vcmUgPSAxOworfQorCisvLyBMZWFmIGZyYWdtZW50cy4KKworZGVmIHZ0SW50ICAgICAgOiBQYXRMZWFmPCh2dCksICBbeyByZXR1cm4gTi0+Z2V0VlQoKS5pc0ludGVnZXIoKTsgfV0+OworZGVmIHZ0RlAgICAgICAgOiBQYXRMZWFmPCh2dCksICBbeyByZXR1cm4gTi0+Z2V0VlQoKS5pc0Zsb2F0aW5nUG9pbnQoKTsgfV0+OworCitkZWYgaW1tQWxsT25lc1Y6IFBhdExlYWY8KGJ1aWxkX3ZlY3RvciksIFt7CisgIHJldHVybiBJU0Q6OmlzQnVpbGRWZWN0b3JBbGxPbmVzKE4pOworfV0+OworZGVmIGltbUFsbFplcm9zVjogUGF0TGVhZjwoYnVpbGRfdmVjdG9yKSwgW3sKKyAgcmV0dXJuIElTRDo6aXNCdWlsZFZlY3RvckFsbFplcm9zKE4pOworfV0+OworCisKKworLy8gT3RoZXIgaGVscGVyIGZyYWdtZW50cy4KK2RlZiBub3QgIDogUGF0RnJhZzwob3BzIG5vZGU6JGluKSwgKHhvciBub2RlOiRpbiwgLTEpPjsKK2RlZiB2bm90IDogUGF0RnJhZzwob3BzIG5vZGU6JGluKSwgKHhvciBub2RlOiRpbiwgaW1tQWxsT25lc1YpPjsKK2RlZiBpbmVnIDogUGF0RnJhZzwob3BzIG5vZGU6JGluKSwgKHN1YiAwLCBub2RlOiRpbik+OworCisvLyBudWxsX2ZyYWcgLSBUaGUgbnVsbCBwYXR0ZXJuIG9wZXJhdG9yIGlzIHVzZWQgaW4gbXVsdGljbGFzcyBpbnN0YW50aWF0aW9ucworLy8gd2hpY2ggYWNjZXB0IGFuIFNEUGF0dGVybk9wZXJhdG9yIGZvciB1c2UgaW4gbWF0Y2hpbmcgcGF0dGVybnMgZm9yIGludGVybmFsCisvLyBkZWZpbml0aW9ucy4gV2hlbiBleHBhbmRpbmcgYSBwYXR0ZXJuLCBpZiB0aGUgbnVsbCBmcmFnbWVudCBpcyByZWZlcmVuY2VkCisvLyBpbiB0aGUgZXhwYW5zaW9uLCB0aGUgcGF0dGVybiBpcyBkaXNjYXJkZWQgYW5kIGl0IGlzIGFzLWlmICdbXScgaGFkIGJlZW4KKy8vIHNwZWNpZmllZC4gVGhpcyBhbGxvd3MgbXVsdGljbGFzc2VzIHRvIGhhdmUgdGhlIGlzZWwgcGF0dGVybnMgYmUgb3B0aW9uYWwuCitkZWYgbnVsbF9mcmFnIDogU0RQYXR0ZXJuT3BlcmF0b3I7CisKKy8vIGxvYWQgZnJhZ21lbnRzLgorZGVmIHVuaW5kZXhlZGxvYWQgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGxkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBJc1VuaW5kZXhlZCA9IDE7Cit9CitkZWYgbG9hZCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAodW5pbmRleGVkbG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgSXNOb25FeHRMb2FkID0gMTsKK30KKworLy8gZXh0ZW5kaW5nIGxvYWQgZnJhZ21lbnRzLgorZGVmIGV4dGxvYWQgICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAodW5pbmRleGVkbG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgSXNBbnlFeHRMb2FkID0gMTsKK30KK2RlZiBzZXh0bG9hZCAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHVuaW5kZXhlZGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IElzU2lnbkV4dExvYWQgPSAxOworfQorZGVmIHpleHRsb2FkICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAodW5pbmRleGVkbG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgSXNaZXJvRXh0TG9hZCA9IDE7Cit9CisKK2RlZiBleHRsb2FkaTEgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChleHRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGkxOworfQorZGVmIGV4dGxvYWRpOCAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGV4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTg7Cit9CitkZWYgZXh0bG9hZGkxNiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpMTY7Cit9CitkZWYgZXh0bG9hZGkzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpMzI7Cit9CitkZWYgZXh0bG9hZGYzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgTWVtb3J5VlQgPSBmMzI7Cit9CitkZWYgZXh0bG9hZGY2NCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgTWVtb3J5VlQgPSBmNjQ7Cit9CisKK2RlZiBzZXh0bG9hZGkxICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoc2V4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTE7Cit9CitkZWYgc2V4dGxvYWRpOCAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHNleHRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGk4OworfQorZGVmIHNleHRsb2FkaTE2IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChzZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpMTY7Cit9CitkZWYgc2V4dGxvYWRpMzIgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHNleHRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGkzMjsKK30KKworZGVmIHpleHRsb2FkaTEgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh6ZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpMTsKK30KK2RlZiB6ZXh0bG9hZGk4ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoemV4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTg7Cit9CitkZWYgemV4dGxvYWRpMTYgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHpleHRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGkxNjsKK30KK2RlZiB6ZXh0bG9hZGkzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoemV4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTMyOworfQorCitkZWYgZXh0bG9hZHZpMSAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGV4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IFNjYWxhck1lbW9yeVZUID0gaTE7Cit9CitkZWYgZXh0bG9hZHZpOCAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGV4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IFNjYWxhck1lbW9yeVZUID0gaTg7Cit9CitkZWYgZXh0bG9hZHZpMTYgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGV4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IFNjYWxhck1lbW9yeVZUID0gaTE2OworfQorZGVmIGV4dGxvYWR2aTMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChleHRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBTY2FsYXJNZW1vcnlWVCA9IGkzMjsKK30KK2RlZiBleHRsb2FkdmYzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgU2NhbGFyTWVtb3J5VlQgPSBmMzI7Cit9CitkZWYgZXh0bG9hZHZmNjQgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGV4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IFNjYWxhck1lbW9yeVZUID0gZjY0OworfQorCitkZWYgc2V4dGxvYWR2aTEgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChzZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgU2NhbGFyTWVtb3J5VlQgPSBpMTsKK30KK2RlZiBzZXh0bG9hZHZpOCAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHNleHRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBTY2FsYXJNZW1vcnlWVCA9IGk4OworfQorZGVmIHNleHRsb2FkdmkxNiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoc2V4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IFNjYWxhck1lbW9yeVZUID0gaTE2OworfQorZGVmIHNleHRsb2FkdmkzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoc2V4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IFNjYWxhck1lbW9yeVZUID0gaTMyOworfQorCitkZWYgemV4dGxvYWR2aTEgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh6ZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgU2NhbGFyTWVtb3J5VlQgPSBpMTsKK30KK2RlZiB6ZXh0bG9hZHZpOCAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHpleHRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBTY2FsYXJNZW1vcnlWVCA9IGk4OworfQorZGVmIHpleHRsb2FkdmkxNiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoemV4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IFNjYWxhck1lbW9yeVZUID0gaTE2OworfQorZGVmIHpleHRsb2FkdmkzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoemV4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IFNjYWxhck1lbW9yeVZUID0gaTMyOworfQorCisvLyBzdG9yZSBmcmFnbWVudHMuCitkZWYgdW5pbmRleGVkc3RvcmUgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3Qgbm9kZTokdmFsLCBub2RlOiRwdHIpPiB7CisgIGxldCBJc1N0b3JlID0gMTsKKyAgbGV0IElzVW5pbmRleGVkID0gMTsKK30KK2RlZiBzdG9yZSA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICh1bmluZGV4ZWRzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzU3RvcmUgPSAxOworICBsZXQgSXNUcnVuY1N0b3JlID0gMDsKK30KKworLy8gdHJ1bmNzdG9yZSBmcmFnbWVudHMuCitkZWYgdHJ1bmNzdG9yZSA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVuaW5kZXhlZHN0b3JlIG5vZGU6JHZhbCwgbm9kZTokcHRyKT4geworICBsZXQgSXNTdG9yZSA9IDE7CisgIGxldCBJc1RydW5jU3RvcmUgPSAxOworfQorZGVmIHRydW5jc3RvcmVpOCA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJ1bmNzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzU3RvcmUgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpODsKK30KK2RlZiB0cnVuY3N0b3JlaTE2IDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJ1bmNzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzU3RvcmUgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpMTY7Cit9CitkZWYgdHJ1bmNzdG9yZWkzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRydW5jc3RvcmUgbm9kZTokdmFsLCBub2RlOiRwdHIpPiB7CisgIGxldCBJc1N0b3JlID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTMyOworfQorZGVmIHRydW5jc3RvcmVmMzIgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cnVuY3N0b3JlIG5vZGU6JHZhbCwgbm9kZTokcHRyKT4geworICBsZXQgSXNTdG9yZSA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGYzMjsKK30KK2RlZiB0cnVuY3N0b3JlZjY0IDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJ1bmNzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzU3RvcmUgPSAxOworICBsZXQgTWVtb3J5VlQgPSBmNjQ7Cit9CisKK2RlZiB0cnVuY3N0b3Jldmk4IDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJ1bmNzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzU3RvcmUgPSAxOworICBsZXQgU2NhbGFyTWVtb3J5VlQgPSBpODsKK30KKworZGVmIHRydW5jc3RvcmV2aTE2IDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRydW5jc3RvcmUgbm9kZTokdmFsLCBub2RlOiRwdHIpPiB7CisgIGxldCBJc1N0b3JlID0gMTsKKyAgbGV0IFNjYWxhck1lbW9yeVZUID0gaTE2OworfQorCitkZWYgdHJ1bmNzdG9yZXZpMzIgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJ1bmNzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzU3RvcmUgPSAxOworICBsZXQgU2NhbGFyTWVtb3J5VlQgPSBpMzI7Cit9CisKKy8vIGluZGV4ZWQgc3RvcmUgZnJhZ21lbnRzLgorZGVmIGlzdG9yZSA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAoaXN0IG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KT4geworICBsZXQgSXNTdG9yZSA9IDE7CisgIGxldCBJc1RydW5jU3RvcmUgPSAwOworfQorCitkZWYgcHJlX3N0b3JlIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpc3RvcmUgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLCBbeworICBJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNID0gY2FzdDxTdG9yZVNETm9kZT4oTiktPmdldEFkZHJlc3NpbmdNb2RlKCk7CisgIHJldHVybiBBTSA9PSBJU0Q6OlBSRV9JTkMgfHwgQU0gPT0gSVNEOjpQUkVfREVDOworfV0+OworCitkZWYgaXRydW5jc3RvcmUgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaXN0IG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KT4geworICBsZXQgSXNTdG9yZSA9IDE7CisgIGxldCBJc1RydW5jU3RvcmUgPSAxOworfQorZGVmIHByZV90cnVuY3N0IDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0cnVuY3N0b3JlIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwgW3sKKyAgSVNEOjpNZW1JbmRleGVkTW9kZSBBTSA9IGNhc3Q8U3RvcmVTRE5vZGU+KE4pLT5nZXRBZGRyZXNzaW5nTW9kZSgpOworICByZXR1cm4gQU0gPT0gSVNEOjpQUkVfSU5DIHx8IEFNID09IElTRDo6UFJFX0RFQzsKK31dPjsKK2RlZiBwcmVfdHJ1bmNzdGkxIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJlX3RydW5jc3Qgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpPiB7CisgIGxldCBJc1N0b3JlID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTE7Cit9CitkZWYgcHJlX3RydW5jc3RpOCA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZV90cnVuY3N0IG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KT4geworICBsZXQgSXNTdG9yZSA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGk4OworfQorZGVmIHByZV90cnVuY3N0aTE2IDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZV90cnVuY3N0IG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KT4geworICBsZXQgSXNTdG9yZSA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGkxNjsKK30KK2RlZiBwcmVfdHJ1bmNzdGkzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmVfdHJ1bmNzdCBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCk+IHsKKyAgbGV0IElzU3RvcmUgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpMzI7Cit9CitkZWYgcHJlX3RydW5jc3RmMzIgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJlX3RydW5jc3Qgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpPiB7CisgIGxldCBJc1N0b3JlID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gZjMyOworfQorCitkZWYgcG9zdF9zdG9yZSA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JHB0ciwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaXN0b3JlIG5vZGU6JHZhbCwgbm9kZTokcHRyLCBub2RlOiRvZmZzZXQpLCBbeworICBJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNID0gY2FzdDxTdG9yZVNETm9kZT4oTiktPmdldEFkZHJlc3NpbmdNb2RlKCk7CisgIHJldHVybiBBTSA9PSBJU0Q6OlBPU1RfSU5DIHx8IEFNID09IElTRDo6UE9TVF9ERUM7Cit9XT47CisKK2RlZiBwb3N0X3RydW5jc3QgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0cnVuY3N0b3JlIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwgW3sKKyAgSVNEOjpNZW1JbmRleGVkTW9kZSBBTSA9IGNhc3Q8U3RvcmVTRE5vZGU+KE4pLT5nZXRBZGRyZXNzaW5nTW9kZSgpOworICByZXR1cm4gQU0gPT0gSVNEOjpQT1NUX0lOQyB8fCBBTSA9PSBJU0Q6OlBPU1RfREVDOworfV0+OworZGVmIHBvc3RfdHJ1bmNzdGkxIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvc3RfdHJ1bmNzdCBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCk+IHsKKyAgbGV0IElzU3RvcmUgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpMTsKK30KK2RlZiBwb3N0X3RydW5jc3RpOCA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3N0X3RydW5jc3Qgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpPiB7CisgIGxldCBJc1N0b3JlID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTg7Cit9CitkZWYgcG9zdF90cnVuY3N0aTE2IDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3N0X3RydW5jc3Qgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpPiB7CisgIGxldCBJc1N0b3JlID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTE2OworfQorZGVmIHBvc3RfdHJ1bmNzdGkzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9zdF90cnVuY3N0IG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KT4geworICBsZXQgSXNTdG9yZSA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGkzMjsKK30KK2RlZiBwb3N0X3RydW5jc3RmMzIgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvc3RfdHJ1bmNzdCBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCk+IHsKKyAgbGV0IElzU3RvcmUgPSAxOworICBsZXQgTWVtb3J5VlQgPSBmMzI7Cit9CisKKy8vIG5vbnRlbXBvcmFsIHN0b3JlIGZyYWdtZW50cy4KK2RlZiBub250ZW1wb3JhbHN0b3JlIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RvcmUgbm9kZTokdmFsLCBub2RlOiRwdHIpLCBbeworICByZXR1cm4gY2FzdDxTdG9yZVNETm9kZT4oTiktPmlzTm9uVGVtcG9yYWwoKTsKK31dPjsKKworZGVmIGFsaWduZWRub250ZW1wb3JhbHN0b3JlIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vbnRlbXBvcmFsc3RvcmUgbm9kZTokdmFsLCBub2RlOiRwdHIpLCBbeworICBTdG9yZVNETm9kZSAqU3QgPSBjYXN0PFN0b3JlU0ROb2RlPihOKTsKKyAgcmV0dXJuIFN0LT5nZXRBbGlnbm1lbnQoKSA+PSBTdC0+Z2V0TWVtb3J5VlQoKS5nZXRTdG9yZVNpemUoKTsKK31dPjsKKworZGVmIHVuYWxpZ25lZG5vbnRlbXBvcmFsc3RvcmUgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub250ZW1wb3JhbHN0b3JlIG5vZGU6JHZhbCwgbm9kZTokcHRyKSwgW3sKKyAgU3RvcmVTRE5vZGUgKlN0ID0gY2FzdDxTdG9yZVNETm9kZT4oTik7CisgIHJldHVybiBTdC0+Z2V0QWxpZ25tZW50KCkgPCBTdC0+Z2V0TWVtb3J5VlQoKS5nZXRTdG9yZVNpemUoKTsKK31dPjsKKworLy8gbm9udGVtcG9yYWwgbG9hZCBmcmFnbWVudHMuCitkZWYgbm9udGVtcG9yYWxsb2FkIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWQgbm9kZTokcHRyKSwgW3sKKyAgcmV0dXJuIGNhc3Q8TG9hZFNETm9kZT4oTiktPmlzTm9uVGVtcG9yYWwoKTsKK31dPjsKKworZGVmIGFsaWduZWRub250ZW1wb3JhbGxvYWQgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vbnRlbXBvcmFsbG9hZCBub2RlOiRwdHIpLCBbeworICBMb2FkU0ROb2RlICpMZCA9IGNhc3Q8TG9hZFNETm9kZT4oTik7CisgIHJldHVybiBMZC0+Z2V0QWxpZ25tZW50KCkgPj0gTGQtPmdldE1lbW9yeVZUKCkuZ2V0U3RvcmVTaXplKCk7Cit9XT47CisKKy8vIHNldGNjIGNvbnZlbmllbmNlIGZyYWdtZW50cy4KK2RlZiBzZXRvZXEgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRPRVEpPjsKK2RlZiBzZXRvZ3QgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRPR1QpPjsKK2RlZiBzZXRvZ2UgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRPR0UpPjsKK2RlZiBzZXRvbHQgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRPTFQpPjsKK2RlZiBzZXRvbGUgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRPTEUpPjsKK2RlZiBzZXRvbmUgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRPTkUpPjsKK2RlZiBzZXRvICAgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRPKT47CitkZWYgc2V0dW8gIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgIChzZXRjYyBub2RlOiRsaHMsIG5vZGU6JHJocywgU0VUVU8pPjsKK2RlZiBzZXR1ZXEgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRVRVEpPjsKK2RlZiBzZXR1Z3QgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRVR1QpPjsKK2RlZiBzZXR1Z2UgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRVR0UpPjsKK2RlZiBzZXR1bHQgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRVTFQpPjsKK2RlZiBzZXR1bGUgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRVTEUpPjsKK2RlZiBzZXR1bmUgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRVTkUpPjsKK2RlZiBzZXRlcSAgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRFUSk+OworZGVmIHNldGd0ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVEdUKT47CitkZWYgc2V0Z2UgIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgIChzZXRjYyBub2RlOiRsaHMsIG5vZGU6JHJocywgU0VUR0UpPjsKK2RlZiBzZXRsdCAgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRMVCk+OworZGVmIHNldGxlICA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVExFKT47CitkZWYgc2V0bmUgIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgIChzZXRjYyBub2RlOiRsaHMsIG5vZGU6JHJocywgU0VUTkUpPjsKKworbXVsdGljbGFzcyBiaW5hcnlfYXRvbWljX29wX29yZDxTRE5vZGUgYXRvbWljX29wPiB7CisgIGRlZiAjTkFNRSNfbW9ub3RvbmljIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciwgbm9kZTokdmFsKSwKKyAgICAgICghY2FzdDxTRFBhdHRlcm5PcGVyYXRvcj4oI05BTUUpIG5vZGU6JHB0ciwgbm9kZTokdmFsKT4geworICAgIGxldCBJc0F0b21pYyA9IDE7CisgICAgbGV0IElzQXRvbWljT3JkZXJpbmdNb25vdG9uaWMgPSAxOworICB9CisgIGRlZiAjTkFNRSNfYWNxdWlyZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JHZhbCksCisgICAgICAoIWNhc3Q8U0RQYXR0ZXJuT3BlcmF0b3I+KCNOQU1FKSBub2RlOiRwdHIsIG5vZGU6JHZhbCk+IHsKKyAgICBsZXQgSXNBdG9taWMgPSAxOworICAgIGxldCBJc0F0b21pY09yZGVyaW5nQWNxdWlyZSA9IDE7CisgIH0KKyAgZGVmICNOQU1FI19yZWxlYXNlIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciwgbm9kZTokdmFsKSwKKyAgICAgICghY2FzdDxTRFBhdHRlcm5PcGVyYXRvcj4oI05BTUUpIG5vZGU6JHB0ciwgbm9kZTokdmFsKT4geworICAgIGxldCBJc0F0b21pYyA9IDE7CisgICAgbGV0IElzQXRvbWljT3JkZXJpbmdSZWxlYXNlID0gMTsKKyAgfQorICBkZWYgI05BTUUjX2FjcV9yZWwgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyLCBub2RlOiR2YWwpLAorICAgICAgKCFjYXN0PFNEUGF0dGVybk9wZXJhdG9yPigjTkFNRSkgbm9kZTokcHRyLCBub2RlOiR2YWwpPiB7CisgICAgbGV0IElzQXRvbWljID0gMTsKKyAgICBsZXQgSXNBdG9taWNPcmRlcmluZ0FjcXVpcmVSZWxlYXNlID0gMTsKKyAgfQorICBkZWYgI05BTUUjX3NlcV9jc3QgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyLCBub2RlOiR2YWwpLAorICAgICAgKCFjYXN0PFNEUGF0dGVybk9wZXJhdG9yPigjTkFNRSkgbm9kZTokcHRyLCBub2RlOiR2YWwpPiB7CisgICAgbGV0IElzQXRvbWljID0gMTsKKyAgICBsZXQgSXNBdG9taWNPcmRlcmluZ1NlcXVlbnRpYWxseUNvbnNpc3RlbnQgPSAxOworICB9Cit9CisKK211bHRpY2xhc3MgdGVybmFyeV9hdG9taWNfb3Bfb3JkPFNETm9kZSBhdG9taWNfb3A+IHsKKyAgZGVmICNOQU1FI19tb25vdG9uaWMgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyLCBub2RlOiRjbXAsIG5vZGU6JHZhbCksCisgICAgICAoIWNhc3Q8U0RQYXR0ZXJuT3BlcmF0b3I+KCNOQU1FKSBub2RlOiRwdHIsIG5vZGU6JGNtcCwgbm9kZTokdmFsKT4geworICAgIGxldCBJc0F0b21pYyA9IDE7CisgICAgbGV0IElzQXRvbWljT3JkZXJpbmdNb25vdG9uaWMgPSAxOworICB9CisgIGRlZiAjTkFNRSNfYWNxdWlyZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JGNtcCwgbm9kZTokdmFsKSwKKyAgICAgICghY2FzdDxTRFBhdHRlcm5PcGVyYXRvcj4oI05BTUUpIG5vZGU6JHB0ciwgbm9kZTokY21wLCBub2RlOiR2YWwpPiB7CisgICAgbGV0IElzQXRvbWljID0gMTsKKyAgICBsZXQgSXNBdG9taWNPcmRlcmluZ0FjcXVpcmUgPSAxOworICB9CisgIGRlZiAjTkFNRSNfcmVsZWFzZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JGNtcCwgbm9kZTokdmFsKSwKKyAgICAgICghY2FzdDxTRFBhdHRlcm5PcGVyYXRvcj4oI05BTUUpIG5vZGU6JHB0ciwgbm9kZTokY21wLCBub2RlOiR2YWwpPiB7CisgICAgbGV0IElzQXRvbWljID0gMTsKKyAgICBsZXQgSXNBdG9taWNPcmRlcmluZ1JlbGVhc2UgPSAxOworICB9CisgIGRlZiAjTkFNRSNfYWNxX3JlbCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JGNtcCwgbm9kZTokdmFsKSwKKyAgICAgICghY2FzdDxTRFBhdHRlcm5PcGVyYXRvcj4oI05BTUUpIG5vZGU6JHB0ciwgbm9kZTokY21wLCBub2RlOiR2YWwpPiB7CisgICAgbGV0IElzQXRvbWljID0gMTsKKyAgICBsZXQgSXNBdG9taWNPcmRlcmluZ0FjcXVpcmVSZWxlYXNlID0gMTsKKyAgfQorICBkZWYgI05BTUUjX3NlcV9jc3QgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyLCBub2RlOiRjbXAsIG5vZGU6JHZhbCksCisgICAgICAoIWNhc3Q8U0RQYXR0ZXJuT3BlcmF0b3I+KCNOQU1FKSBub2RlOiRwdHIsIG5vZGU6JGNtcCwgbm9kZTokdmFsKT4geworICAgIGxldCBJc0F0b21pYyA9IDE7CisgICAgbGV0IElzQXRvbWljT3JkZXJpbmdTZXF1ZW50aWFsbHlDb25zaXN0ZW50ID0gMTsKKyAgfQorfQorCittdWx0aWNsYXNzIGJpbmFyeV9hdG9taWNfb3A8U0ROb2RlIGF0b21pY19vcD4geworICBkZWYgXzggOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyLCBub2RlOiR2YWwpLAorICAgICAgICAgICAgICAgICAgIChhdG9taWNfb3AgIG5vZGU6JHB0ciwgbm9kZTokdmFsKT4geworICAgIGxldCBJc0F0b21pYyA9IDE7CisgICAgbGV0IE1lbW9yeVZUID0gaTg7CisgIH0KKyAgZGVmIF8xNiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JHZhbCksCisgICAgICAgICAgICAgICAgICAgIChhdG9taWNfb3Agbm9kZTokcHRyLCBub2RlOiR2YWwpPiB7CisgICAgbGV0IElzQXRvbWljID0gMTsKKyAgICBsZXQgTWVtb3J5VlQgPSBpMTY7CisgIH0KKyAgZGVmIF8zMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JHZhbCksCisgICAgICAgICAgICAgICAgICAgIChhdG9taWNfb3Agbm9kZTokcHRyLCBub2RlOiR2YWwpPiB7CisgICAgbGV0IElzQXRvbWljID0gMTsKKyAgICBsZXQgTWVtb3J5VlQgPSBpMzI7CisgIH0KKyAgZGVmIF82NCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JHZhbCksCisgICAgICAgICAgICAgICAgICAgIChhdG9taWNfb3Agbm9kZTokcHRyLCBub2RlOiR2YWwpPiB7CisgICAgbGV0IElzQXRvbWljID0gMTsKKyAgICBsZXQgTWVtb3J5VlQgPSBpNjQ7CisgIH0KKworICBkZWZtIE5BTUUjXzggIDogYmluYXJ5X2F0b21pY19vcF9vcmQ8YXRvbWljX29wPjsKKyAgZGVmbSBOQU1FI18xNiA6IGJpbmFyeV9hdG9taWNfb3Bfb3JkPGF0b21pY19vcD47CisgIGRlZm0gTkFNRSNfMzIgOiBiaW5hcnlfYXRvbWljX29wX29yZDxhdG9taWNfb3A+OworICBkZWZtIE5BTUUjXzY0IDogYmluYXJ5X2F0b21pY19vcF9vcmQ8YXRvbWljX29wPjsKK30KKworbXVsdGljbGFzcyB0ZXJuYXJ5X2F0b21pY19vcDxTRE5vZGUgYXRvbWljX29wPiB7CisgIGRlZiBfOCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JGNtcCwgbm9kZTokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAoYXRvbWljX29wICBub2RlOiRwdHIsIG5vZGU6JGNtcCwgbm9kZTokdmFsKT4geworICAgIGxldCBJc0F0b21pYyA9IDE7CisgICAgbGV0IE1lbW9yeVZUID0gaTg7CisgIH0KKyAgZGVmIF8xNiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JGNtcCwgbm9kZTokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgKGF0b21pY19vcCBub2RlOiRwdHIsIG5vZGU6JGNtcCwgbm9kZTokdmFsKT4geworICAgIGxldCBJc0F0b21pYyA9IDE7CisgICAgbGV0IE1lbW9yeVZUID0gaTE2OworICB9CisgIGRlZiBfMzIgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyLCBub2RlOiRjbXAsIG5vZGU6JHZhbCksCisgICAgICAgICAgICAgICAgICAgIChhdG9taWNfb3Agbm9kZTokcHRyLCBub2RlOiRjbXAsIG5vZGU6JHZhbCk+IHsKKyAgICBsZXQgSXNBdG9taWMgPSAxOworICAgIGxldCBNZW1vcnlWVCA9IGkzMjsKKyAgfQorICBkZWYgXzY0IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciwgbm9kZTokY21wLCBub2RlOiR2YWwpLAorICAgICAgICAgICAgICAgICAgICAoYXRvbWljX29wIG5vZGU6JHB0ciwgbm9kZTokY21wLCBub2RlOiR2YWwpPiB7CisgICAgbGV0IElzQXRvbWljID0gMTsKKyAgICBsZXQgTWVtb3J5VlQgPSBpNjQ7CisgIH0KKworICBkZWZtIE5BTUUjXzggIDogdGVybmFyeV9hdG9taWNfb3Bfb3JkPGF0b21pY19vcD47CisgIGRlZm0gTkFNRSNfMTYgOiB0ZXJuYXJ5X2F0b21pY19vcF9vcmQ8YXRvbWljX29wPjsKKyAgZGVmbSBOQU1FI18zMiA6IHRlcm5hcnlfYXRvbWljX29wX29yZDxhdG9taWNfb3A+OworICBkZWZtIE5BTUUjXzY0IDogdGVybmFyeV9hdG9taWNfb3Bfb3JkPGF0b21pY19vcD47Cit9CisKK2RlZm0gYXRvbWljX2xvYWRfYWRkICA6IGJpbmFyeV9hdG9taWNfb3A8YXRvbWljX2xvYWRfYWRkPjsKK2RlZm0gYXRvbWljX3N3YXAgICAgICA6IGJpbmFyeV9hdG9taWNfb3A8YXRvbWljX3N3YXA+OworZGVmbSBhdG9taWNfbG9hZF9zdWIgIDogYmluYXJ5X2F0b21pY19vcDxhdG9taWNfbG9hZF9zdWI+OworZGVmbSBhdG9taWNfbG9hZF9hbmQgIDogYmluYXJ5X2F0b21pY19vcDxhdG9taWNfbG9hZF9hbmQ+OworZGVmbSBhdG9taWNfbG9hZF9jbHIgIDogYmluYXJ5X2F0b21pY19vcDxhdG9taWNfbG9hZF9jbHI+OworZGVmbSBhdG9taWNfbG9hZF9vciAgIDogYmluYXJ5X2F0b21pY19vcDxhdG9taWNfbG9hZF9vcj47CitkZWZtIGF0b21pY19sb2FkX3hvciAgOiBiaW5hcnlfYXRvbWljX29wPGF0b21pY19sb2FkX3hvcj47CitkZWZtIGF0b21pY19sb2FkX25hbmQgOiBiaW5hcnlfYXRvbWljX29wPGF0b21pY19sb2FkX25hbmQ+OworZGVmbSBhdG9taWNfbG9hZF9taW4gIDogYmluYXJ5X2F0b21pY19vcDxhdG9taWNfbG9hZF9taW4+OworZGVmbSBhdG9taWNfbG9hZF9tYXggIDogYmluYXJ5X2F0b21pY19vcDxhdG9taWNfbG9hZF9tYXg+OworZGVmbSBhdG9taWNfbG9hZF91bWluIDogYmluYXJ5X2F0b21pY19vcDxhdG9taWNfbG9hZF91bWluPjsKK2RlZm0gYXRvbWljX2xvYWRfdW1heCA6IGJpbmFyeV9hdG9taWNfb3A8YXRvbWljX2xvYWRfdW1heD47CitkZWZtIGF0b21pY19zdG9yZSAgICAgOiBiaW5hcnlfYXRvbWljX29wPGF0b21pY19zdG9yZT47CitkZWZtIGF0b21pY19jbXBfc3dhcCAgOiB0ZXJuYXJ5X2F0b21pY19vcDxhdG9taWNfY21wX3N3YXA+OworCitkZWYgYXRvbWljX2xvYWRfOCA6CisgIFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLAorICAgICAgICAgIChhdG9taWNfbG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0F0b21pYyA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGk4OworfQorZGVmIGF0b21pY19sb2FkXzE2IDoKKyAgUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksCisgICAgICAgICAgKGF0b21pY19sb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzQXRvbWljID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTE2OworfQorZGVmIGF0b21pY19sb2FkXzMyIDoKKyAgUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksCisgICAgICAgICAgKGF0b21pY19sb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzQXRvbWljID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTMyOworfQorZGVmIGF0b21pY19sb2FkXzY0IDoKKyAgUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksCisgICAgICAgICAgKGF0b21pY19sb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzQXRvbWljID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTY0OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU2VsZWN0aW9uIERBRyBQYXR0ZXJuIFN1cHBvcnQuCisvLworLy8gUGF0dGVybnMgYXJlIHdoYXQgYXJlIGFjdHVhbGx5IG1hdGNoZWQgYWdhaW5zdCBieSB0aGUgdGFyZ2V0LWZsYXZvcmVkCisvLyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gREFHLiAgSW5zdHJ1Y3Rpb25zIGRlZmluZWQgYnkgdGhlIHRhcmdldCBpbXBsaWNpdGx5CisvLyBkZWZpbmUgcGF0dGVybnMgaW4gbW9zdCBjYXNlcywgYnV0IHBhdHRlcm5zIGNhbiBhbHNvIGJlIGV4cGxpY2l0bHkgYWRkZWQgd2hlbgorLy8gYW4gb3BlcmF0aW9uIGlzIGRlZmluZWQgYnkgYSBzZXF1ZW5jZSBvZiBpbnN0cnVjdGlvbnMgKGUuZy4gbG9hZGluZyBhIGxhcmdlCisvLyBpbW1lZGlhdGUgdmFsdWUgb24gUklTQyB0YXJnZXRzIHRoYXQgZG8gbm90IHN1cHBvcnQgaW1tZWRpYXRlcyBhcyBsYXJnZSBhcworLy8gdGhlaXIgR1BScykuCisvLworCitjbGFzcyBQYXR0ZXJuPGRhZyBwYXR0ZXJuVG9NYXRjaCwgbGlzdDxkYWc+IHJlc3VsdEluc3Rycz4geworICBkYWcgICAgICAgICAgICAgUGF0dGVyblRvTWF0Y2ggID0gcGF0dGVyblRvTWF0Y2g7CisgIGxpc3Q8ZGFnPiAgICAgICBSZXN1bHRJbnN0cnMgICAgPSByZXN1bHRJbnN0cnM7CisgIGxpc3Q8UHJlZGljYXRlPiBQcmVkaWNhdGVzICAgICAgPSBbXTsgIC8vIFNlZSBjbGFzcyBJbnN0cnVjdGlvbiBpbiBUYXJnZXQudGQuCisgIGludCAgICAgICAgICAgICBBZGRlZENvbXBsZXhpdHkgPSAwOyAgIC8vIFNlZSBjbGFzcyBJbnN0cnVjdGlvbiBpbiBUYXJnZXQudGQuCit9CisKKy8vIFBhdCAtIEEgc2ltcGxlIChidXQgY29tbW9uKSBmb3JtIG9mIGEgcGF0dGVybiwgd2hpY2ggcHJvZHVjZXMgYSBzaW1wbGUgcmVzdWx0CisvLyBub3QgbmVlZGluZyBhIGZ1bGwgbGlzdC4KK2NsYXNzIFBhdDxkYWcgcGF0dGVybiwgZGFnIHJlc3VsdD4gOiBQYXR0ZXJuPHBhdHRlcm4sIFtyZXN1bHRdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENvbXBsZXggcGF0dGVybiBkZWZpbml0aW9ucy4KKy8vCisKKy8vIENvbXBsZXggcGF0dGVybnMsIGUuZy4gWDg2IGFkZHJlc3NpbmcgbW9kZSwgcmVxdWlyZXMgcGF0dGVybiBtYXRjaGluZyBjb2RlCisvLyBpbiBDKysuIE51bU9wZXJhbmRzIGlzIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgcmV0dXJuZWQgYnkgdGhlIHNlbGVjdCBmdW5jdGlvbjsKKy8vIFNlbGVjdEZ1bmMgaXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gcGF0dGVybiBtYXRjaCB0aGUgbWF4LiBwYXR0ZXJuOworLy8gUm9vdE5vZGVzIGFyZSB0aGUgbGlzdCBvZiBwb3NzaWJsZSByb290IG5vZGVzIG9mIHRoZSBzdWItZGFncyB0byBtYXRjaC4KKy8vIGUuZy4gWDg2IGFkZHJlc3NpbmcgbW9kZSAtIGRlZiBhZGRyIDogQ29tcGxleFBhdHRlcm48NCwgIlNlbGVjdEFkZHIiLCBbYWRkXT47CisvLworY2xhc3MgQ29tcGxleFBhdHRlcm48VmFsdWVUeXBlIHR5LCBpbnQgbnVtb3BzLCBzdHJpbmcgZm4sCisgICAgICAgICAgICAgICAgICAgICBsaXN0PFNETm9kZT4gcm9vdHMgPSBbXSwgbGlzdDxTRE5vZGVQcm9wZXJ0eT4gcHJvcHMgPSBbXSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBjb21wbGV4aXR5ID0gLTE+IHsKKyAgVmFsdWVUeXBlIFR5ID0gdHk7CisgIGludCBOdW1PcGVyYW5kcyA9IG51bW9wczsKKyAgc3RyaW5nIFNlbGVjdEZ1bmMgPSBmbjsKKyAgbGlzdDxTRE5vZGU+IFJvb3ROb2RlcyA9IHJvb3RzOworICBsaXN0PFNETm9kZVByb3BlcnR5PiBQcm9wZXJ0aWVzID0gcHJvcHM7CisgIGludCBDb21wbGV4aXR5ID0gY29tcGxleGl0eTsKK30KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGVzdGluZy9TdXBwb3J0L0Vycm9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Rlc3RpbmcvU3VwcG9ydC9FcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwODg5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Rlc3RpbmcvU3VwcG9ydC9FcnJvci5oCkBAIC0wLDAgKzEsMTA3IEBACisvLz09PS0gbGx2bS9UZXN0aW5nL1N1cHBvcnQvRXJyb3IuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEVTVElOR19TVVBQT1JUX0VSUk9SX0gKKyNkZWZpbmUgTExWTV9URVNUSU5HX1NVUFBPUlRfRVJST1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1Rlc3RpbmcvU3VwcG9ydC9TdXBwb3J0SGVscGVycy5oIgorCisjaW5jbHVkZSAiZ21vY2svZ21vY2suaCIKKyNpbmNsdWRlIDxvc3RyZWFtPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgZGV0YWlsIHsKK0Vycm9ySG9sZGVyIFRha2VFcnJvcihFcnJvciBFcnIpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRXhwZWN0ZWRIb2xkZXI8VD4gVGFrZUV4cGVjdGVkKEV4cGVjdGVkPFQ+ICZFeHApIHsKKyAgcmV0dXJuIHtUYWtlRXJyb3IoRXhwLnRha2VFcnJvcigpKSwgRXhwfTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEV4cGVjdGVkSG9sZGVyPFQ+IFRha2VFeHBlY3RlZChFeHBlY3RlZDxUPiAmJkV4cCkgeworICByZXR1cm4gVGFrZUV4cGVjdGVkKEV4cCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVmFsdWVNYXRjaGVzTW9ubworICAgIDogcHVibGljIHRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8Y29uc3QgRXhwZWN0ZWRIb2xkZXI8VD4gJj4geworcHVibGljOgorICBleHBsaWNpdCBWYWx1ZU1hdGNoZXNNb25vKGNvbnN0IHRlc3Rpbmc6Ok1hdGNoZXI8VD4gJk1hdGNoZXIpCisgICAgICA6IE1hdGNoZXIoTWF0Y2hlcikge30KKworICBib29sIE1hdGNoQW5kRXhwbGFpbihjb25zdCBFeHBlY3RlZEhvbGRlcjxUPiAmSG9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyICpsaXN0ZW5lcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmICghSG9sZGVyLlN1Y2Nlc3MpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBib29sIHJlc3VsdCA9IE1hdGNoZXIuTWF0Y2hBbmRFeHBsYWluKCpIb2xkZXIuRXhwLCBsaXN0ZW5lcik7CisKKyAgICBpZiAocmVzdWx0KQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAqbGlzdGVuZXIgPDwgIigiOworICAgIE1hdGNoZXIuRGVzY3JpYmVOZWdhdGlvblRvKGxpc3RlbmVyLT5zdHJlYW0oKSk7CisgICAgKmxpc3RlbmVyIDw8ICIpIjsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgdm9pZCBEZXNjcmliZVRvKHN0ZDo6b3N0cmVhbSAqT1MpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAqT1MgPDwgInN1Y2NlZWRlZCB3aXRoIHZhbHVlICgiOworICAgIE1hdGNoZXIuRGVzY3JpYmVUbyhPUyk7CisgICAgKk9TIDw8ICIpIjsKKyAgfQorCisgIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKHN0ZDo6b3N0cmVhbSAqT1MpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAqT1MgPDwgImRpZCBub3Qgc3VjY2VlZCBvciB2YWx1ZSAoIjsKKyAgICBNYXRjaGVyLkRlc2NyaWJlTmVnYXRpb25UbyhPUyk7CisgICAgKk9TIDw8ICIpIjsKKyAgfQorCitwcml2YXRlOgorICB0ZXN0aW5nOjpNYXRjaGVyPFQ+IE1hdGNoZXI7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNPgorY2xhc3MgVmFsdWVNYXRjaGVzUG9seSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFZhbHVlTWF0Y2hlc1BvbHkoY29uc3QgTSAmTWF0Y2hlcikgOiBNYXRjaGVyKE1hdGNoZXIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIHRlc3Rpbmc6Ok1hdGNoZXI8Y29uc3QgRXhwZWN0ZWRIb2xkZXI8VD4gJj4oKSBjb25zdCB7CisgICAgcmV0dXJuIE1ha2VNYXRjaGVyKAorICAgICAgICBuZXcgVmFsdWVNYXRjaGVzTW9ubzxUPih0ZXN0aW5nOjpTYWZlTWF0Y2hlckNhc3Q8VD4oTWF0Y2hlcikpKTsKKyAgfQorCitwcml2YXRlOgorICBNIE1hdGNoZXI7Cit9OworCit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKKworI2RlZmluZSBFWFBFQ1RfVEhBVF9FUlJPUihFcnIsIE1hdGNoZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRVhQRUNUX1RIQVQobGx2bTo6ZGV0YWlsOjpUYWtlRXJyb3IoRXJyKSwgTWF0Y2hlcikKKyNkZWZpbmUgQVNTRVJUX1RIQVRfRVJST1IoRXJyLCBNYXRjaGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFTU0VSVF9USEFUKGxsdm06OmRldGFpbDo6VGFrZUVycm9yKEVyciksIE1hdGNoZXIpCisKKyNkZWZpbmUgRVhQRUNUX1RIQVRfRVhQRUNURUQoRXJyLCBNYXRjaGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVYUEVDVF9USEFUKGxsdm06OmRldGFpbDo6VGFrZUV4cGVjdGVkKEVyciksIE1hdGNoZXIpCisjZGVmaW5lIEFTU0VSVF9USEFUX0VYUEVDVEVEKEVyciwgTWF0Y2hlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBU1NFUlRfVEhBVChsbHZtOjpkZXRhaWw6OlRha2VFeHBlY3RlZChFcnIpLCBNYXRjaGVyKQorCitNQVRDSEVSKFN1Y2NlZWRlZCwgIiIpIHsgcmV0dXJuIGFyZy5TdWNjZXNzOyB9CitNQVRDSEVSKEZhaWxlZCwgIiIpIHsgcmV0dXJuICFhcmcuU3VjY2VzczsgfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KK2RldGFpbDo6VmFsdWVNYXRjaGVzUG9seTxNPiBIYXNWYWx1ZShNIE1hdGNoZXIpIHsKKyAgcmV0dXJuIGRldGFpbDo6VmFsdWVNYXRjaGVzUG9seTxNPihNYXRjaGVyKTsKK30KKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGVzdGluZy9TdXBwb3J0L1N1cHBvcnRIZWxwZXJzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Rlc3RpbmcvU3VwcG9ydC9TdXBwb3J0SGVscGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZjBjNzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Rlc3RpbmcvU3VwcG9ydC9TdXBwb3J0SGVscGVycy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8vPT09LSBUZXN0aW5nL1N1cHBvcnQvU3VwcG9ydEhlbHBlcnMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9URVNUSU5HX1NVUFBPUlRfU1VQUE9SVEhFTFBFUlNfSAorI2RlZmluZSBMTFZNX1RFU1RJTkdfU1VQUE9SVF9TVVBQT1JUSEVMUEVSU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1wcmludGVycy5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgZGV0YWlsIHsKK3N0cnVjdCBFcnJvckhvbGRlciB7CisgIGJvb2wgU3VjY2VzczsKKyAgc3RkOjpzdHJpbmcgTWVzc2FnZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgRXhwZWN0ZWRIb2xkZXIgOiBwdWJsaWMgRXJyb3JIb2xkZXIgeworICBFeHBlY3RlZEhvbGRlcihFcnJvckhvbGRlciBFcnIsIEV4cGVjdGVkPFQ+ICZFeHApCisgICAgICA6IEVycm9ySG9sZGVyKHN0ZDo6bW92ZShFcnIpKSwgRXhwKEV4cCkge30KKworICBFeHBlY3RlZDxUPiAmRXhwOworfTsKKworaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCBFcnJvckhvbGRlciAmRXJyLCBzdGQ6Om9zdHJlYW0gKk91dCkgeworICAqT3V0IDw8IChFcnIuU3VjY2VzcyA/ICJzdWNjZWVkZWQiIDogImZhaWxlZCIpOworICBpZiAoIUVyci5TdWNjZXNzKSB7CisgICAgKk91dCA8PCAiICAoIiA8PCBTdHJpbmdSZWYoRXJyLk1lc3NhZ2UpLnRyaW0oKS5zdHIoKSA8PCAiKSI7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFByaW50VG8oY29uc3QgRXhwZWN0ZWRIb2xkZXI8VD4gJkl0ZW0sIHN0ZDo6b3N0cmVhbSAqT3V0KSB7CisgIGlmIChJdGVtLlN1Y2Nlc3MpIHsKKyAgICAqT3V0IDw8ICJzdWNjZWVkZWQgd2l0aCB2YWx1ZSAiIDw8IDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZygqSXRlbS5FeHApOworICB9IGVsc2UgeworICAgIFByaW50VG8oc3RhdGljX2Nhc3Q8Y29uc3QgRXJyb3JIb2xkZXIgJj4oSXRlbSksIE91dCk7CisgIH0KK30KK30gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVG9vbERyaXZlcnMvbGx2bS1kbGx0b29sL0RsbHRvb2xEcml2ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVG9vbERyaXZlcnMvbGx2bS1kbGx0b29sL0RsbHRvb2xEcml2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjRiMGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Ub29sRHJpdmVycy9sbHZtLWRsbHRvb2wvRGxsdG9vbERyaXZlci5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vPT09LSBEbGx0b29sRHJpdmVyLmggLSBkbGx0b29sLmV4ZS1jb21wYXRpYmxlIGRyaXZlciAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVmaW5lcyBhbiBpbnRlcmZhY2UgdG8gYSBkbGx0b29sLmV4ZS1jb21wYXRpYmxlIGRyaXZlci4KKy8vIFVzZWQgYnkgbGx2bS1kbGx0b29sLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UT09MRFJJVkVSU19MTFZNX0RMTFRPT0xfRExMVE9PTERSSVZFUl9ICisjZGVmaW5lIExMVk1fVE9PTERSSVZFUlNfTExWTV9ETExUT09MX0RMTFRPT0xEUklWRVJfSAorCituYW1lc3BhY2UgbGx2bSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CisKK2ludCBkbGx0b29sRHJpdmVyTWFpbihBcnJheVJlZjxjb25zdCBjaGFyICo+IEFyZ3NBcnIpOworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVG9vbERyaXZlcnMvbGx2bS1saWIvTGliRHJpdmVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Rvb2xEcml2ZXJzL2xsdm0tbGliL0xpYkRyaXZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ODA2YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Rvb2xEcml2ZXJzL2xsdm0tbGliL0xpYkRyaXZlci5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vPT09LSBsbHZtLWxpYi9MaWJEcml2ZXIuaCAtIGxpYi5leGUtY29tcGF0aWJsZSBkcml2ZXIgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVmaW5lcyBhbiBpbnRlcmZhY2UgdG8gYSBsaWIuZXhlLWNvbXBhdGlibGUgZHJpdmVyIHRoYXQgYWxzbyB1bmRlcnN0YW5kcworLy8gYml0Y29kZSBmaWxlcy4gVXNlZCBieSBsbHZtLWxpYiBhbmQgbGxkLWxpbmsgL2xpYi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVE9PTERSSVZFUlNfTExWTV9MSUJfTElCRFJJVkVSX0gKKyNkZWZpbmUgTExWTV9UT09MRFJJVkVSU19MTFZNX0xJQl9MSUJEUklWRVJfSAorCituYW1lc3BhY2UgbGx2bSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CisKK2ludCBsaWJEcml2ZXJNYWluKEFycmF5UmVmPGNvbnN0IGNoYXIgKj4gQVJncyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0FnZ3Jlc3NpdmVJbnN0Q29tYmluZS9BZ2dyZXNzaXZlSW5zdENvbWJpbmUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9BZ2dyZXNzaXZlSW5zdENvbWJpbmUvQWdncmVzc2l2ZUluc3RDb21iaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxOGQxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9BZ2dyZXNzaXZlSW5zdENvbWJpbmUvQWdncmVzc2l2ZUluc3RDb21iaW5lLmgKQEAgLTAsMCArMSwzNCBAQAorLy89PT0tIEFnZ3Jlc3NpdmVJbnN0Q29tYmluZS5oIC0gQWdncmVzc2l2ZUluc3RDb21iaW5lIHBhc3MgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vCisvLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBwcmltYXJ5IGludGVyZmFjZSB0byB0aGUgYWdncmVzc2l2ZSBpbnN0Y29tYmluZSBwYXNzLgorLy8vIFRoaXMgcGFzcyBpcyBzdWl0YWJsZSBmb3IgdXNlIGluIHRoZSBuZXcgcGFzcyBtYW5hZ2VyLiBGb3IgYSBwYXNzIHRoYXQgd29ya3MKKy8vLyB3aXRoIHRoZSBsZWdhY3kgcGFzcyBtYW5hZ2VyLCBwbGVhc2UgbG9vayBmb3IKKy8vLyBcYyBjcmVhdGVBZ2dyZXNzaXZlSW5zdENvbWJpbmVyUGFzcygpIGluIFNjYWxhci5oLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19BR0dSRVNTSVZFX0lOU1RDT01CSU5FX0lOU1RDT01CSU5FX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0FHR1JFU1NJVkVfSU5TVENPTUJJTkVfSU5TVENPTUJJTkVfSAorCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBZ2dyZXNzaXZlSW5zdENvbWJpbmVQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxBZ2dyZXNzaXZlSW5zdENvbWJpbmVQYXNzPiB7CisKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvQ29yb3V0aW5lcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0Nvcm91dGluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWJlYjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0Nvcm91dGluZXMuaApAQCAtMCwwICsxLDM4IEBACisvLz09PS0tIENvcm91dGluZXMuaCAtIENvcm91dGluZSBUcmFuc2Zvcm1hdGlvbnMgLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRGVjbGFyZSBhY2Nlc3NvciBmdW5jdGlvbnMgZm9yIGNvcm91dGluZSBsb3dlcmluZyBwYXNzZXMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19DT1JPVVRJTkVTX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0NPUk9VVElORVNfSAorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFBhc3M7CitjbGFzcyBQYXNzTWFuYWdlckJ1aWxkZXI7CisKKy8vLyBBZGQgYWxsIGNvcm91dGluZSBwYXNzZXMgdG8gYXBwcm9wcmlhdGUgZXh0ZW5zaW9uIHBvaW50cy4KK3ZvaWQgYWRkQ29yb3V0aW5lUGFzc2VzVG9FeHRlbnNpb25Qb2ludHMoUGFzc01hbmFnZXJCdWlsZGVyICZCdWlsZGVyKTsKKworLy8vIExvd2VyIGNvcm91dGluZSBpbnRyaW5zaWNzIHRoYXQgYXJlIG5vdCBuZWVkZWQgYnkgbGF0ZXIgcGFzc2VzLgorUGFzcyAqY3JlYXRlQ29yb0Vhcmx5UGFzcygpOworCisvLy8gU3BsaXQgdXAgY29yb3V0aW5lcyBpbnRvIG11bHRpcGxlIGZ1bmN0aW9ucyBkcml2aW5nIHRoZWlyIHN0YXRlIG1hY2hpbmVzLgorUGFzcyAqY3JlYXRlQ29yb1NwbGl0UGFzcygpOworCisvLy8gQW5hbHl6ZSBjb3JvdXRpbmVzIHVzZSBzaXRlcywgZGV2aXJ0dWFsaXplIHJlc3VtZS9kZXN0cm95IGNhbGxzIGFuZCBlbGlkZQorLy8vIGhlYXAgYWxsb2NhdGlvbiBmb3IgY29yb3V0aW5lIGZyYW1lIHdoZXJlIHBvc3NpYmxlLgorUGFzcyAqY3JlYXRlQ29yb0VsaWRlUGFzcygpOworCisvLy8gTG93ZXIgYWxsIHJlbWFpbmluZyBjb3JvdXRpbmUgaW50cmluc2ljcy4KK1Bhc3MgKmNyZWF0ZUNvcm9DbGVhbnVwUGFzcygpOworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MTQzMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPLmgKQEAgLTAsMCArMSwyNzEgQEAKKy8vPT09LSBsbHZtL1RyYW5zZm9ybXMvSVBPLmggLSBJbnRlcnByb2NlZHVyYWwgVHJhbnNmb3JtYXRpb25zIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHByb3RvdHlwZXMgZm9yIGFjY2Vzc29yIGZ1bmN0aW9ucyB0aGF0IGV4cG9zZSBwYXNzZXMKKy8vIGluIHRoZSBJUE8gdHJhbnNmb3JtYXRpb25zIGxpYnJhcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3N0cnVjdCBJbmxpbmVQYXJhbXM7CitjbGFzcyBTdHJpbmdSZWY7CitjbGFzcyBNb2R1bGVTdW1tYXJ5SW5kZXg7CitjbGFzcyBNb2R1bGVQYXNzOworY2xhc3MgUGFzczsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEdsb2JhbFZhbHVlOworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlc2UgZnVuY3Rpb25zIHJlbW92ZXMgc3ltYm9scyBmcm9tIGZ1bmN0aW9ucyBhbmQgbW9kdWxlcy4gIElmIE9ubHlEZWJ1Z0luZm8KKy8vIGlzIHRydWUsIG9ubHkgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHJlbW92ZWQgZnJvbSB0aGUgbW9kdWxlLgorLy8KK01vZHVsZVBhc3MgKmNyZWF0ZVN0cmlwU3ltYm9sc1Bhc3MoYm9vbCBPbmx5RGVidWdJbmZvID0gZmFsc2UpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoZXNlIGZ1bmN0aW9ucyBzdHJpcHMgc3ltYm9scyBmcm9tIGZ1bmN0aW9ucyBhbmQgbW9kdWxlcy4KKy8vIE9ubHkgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIG5vdCBzdHJpcHBlZC4KKy8vCitNb2R1bGVQYXNzICpjcmVhdGVTdHJpcE5vbkRlYnVnU3ltYm9sc1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgcmVtb3ZlcyBsbHZtLmRiZy5kZWNsYXJlIGludHJpbnNpY3MuCitNb2R1bGVQYXNzICpjcmVhdGVTdHJpcERlYnVnRGVjbGFyZVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgcmVtb3ZlcyB1bnVzZWQgc3ltYm9scycgZGVidWcgaW5mby4KK01vZHVsZVBhc3MgKmNyZWF0ZVN0cmlwRGVhZERlYnVnSW5mb1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVDb25zdGFudE1lcmdlUGFzcyAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5ldyBwYXNzIHRoYXQgbWVyZ2VzCisvLy8gZHVwbGljYXRlIGdsb2JhbCBjb25zdGFudHMgdG9nZXRoZXIgaW50byBhIHNpbmdsZSBjb25zdGFudCB0aGF0IGlzIHNoYXJlZC4KKy8vLyBUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIHNvbWUgcGFzc2VzIChpZSBUcmFjZVZhbHVlcykgaW5zZXJ0IGEgbG90IG9mIHN0cmluZworLy8vIGNvbnN0YW50cyBpbnRvIHRoZSBwcm9ncmFtLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IHRoZXkgZHVwbGljYXRlIGFuCisvLy8gZXhpc3Rpbmcgc3RyaW5nLgorLy8vCitNb2R1bGVQYXNzICpjcmVhdGVDb25zdGFudE1lcmdlUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIGNyZWF0ZUdsb2JhbE9wdGltaXplclBhc3MgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBuZXcgcGFzcyB0aGF0IG9wdGltaXplcworLy8vIG5vbi1hZGRyZXNzIHRha2VuIGludGVybmFsIGdsb2JhbHMuCisvLy8KK01vZHVsZVBhc3MgKmNyZWF0ZUdsb2JhbE9wdGltaXplclBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVHbG9iYWxEQ0VQYXNzIC0gVGhpcyB0cmFuc2Zvcm0gaXMgZGVzaWduZWQgdG8gZWxpbWluYXRlIHVucmVhY2hhYmxlCisvLy8gaW50ZXJuYWwgZ2xvYmFscyAoZnVuY3Rpb25zIG9yIGdsb2JhbCB2YXJpYWJsZXMpCisvLy8KK01vZHVsZVBhc3MgKmNyZWF0ZUdsb2JhbERDRVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBUaGlzIHRyYW5zZm9ybSBpcyBkZXNpZ25lZCB0byBlbGltaW5hdGUgYXZhaWxhYmxlIGV4dGVybmFsIGdsb2JhbHMKKy8vLyAoZnVuY3Rpb25zIG9yIGdsb2JhbCB2YXJpYWJsZXMpCisvLy8KK01vZHVsZVBhc3MgKmNyZWF0ZUVsaW1pbmF0ZUF2YWlsYWJsZUV4dGVybmFsbHlQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gY3JlYXRlR1ZFeHRyYWN0aW9uUGFzcyAtIElmIGRlbGV0ZUZuIGlzIHRydWUsIHRoaXMgcGFzcyBkZWxldGVzCisvLy8gdGhlIHNwZWNpZmllZCBnbG9iYWwgdmFsdWVzLiBPdGhlcndpc2UsIGl0IGRlbGV0ZXMgYXMgbXVjaCBvZiB0aGUgbW9kdWxlIGFzCisvLy8gcG9zc2libGUsIGV4Y2VwdCBmb3IgdGhlIGdsb2JhbCB2YWx1ZXMgc3BlY2lmaWVkLgorLy8vCitNb2R1bGVQYXNzICpjcmVhdGVHVkV4dHJhY3Rpb25QYXNzKHN0ZDo6dmVjdG9yPEdsb2JhbFZhbHVlKj4mIEdWcywgYm9vbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVGbiA9IGZhbHNlKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBUaGlzIHBhc3MgcGVyZm9ybXMgaXRlcmF0aXZlIGZ1bmN0aW9uIGltcG9ydGluZyBmcm9tIG90aGVyIG1vZHVsZXMuCitQYXNzICpjcmVhdGVGdW5jdGlvbkltcG9ydFBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVGdW5jdGlvbklubGluaW5nUGFzcyAtIFJldHVybiBhIG5ldyBwYXNzIG9iamVjdCB0aGF0IHVzZXMgYSBoZXVyaXN0aWMKKy8vLyB0byBpbmxpbmUgZGlyZWN0IGZ1bmN0aW9uIGNhbGxzIHRvIHNtYWxsIGZ1bmN0aW9ucy4KKy8vLworLy8vIFRoZSBUaHJlc2hvbGQgY2FuIGJlIHBhc3NlZCBkaXJlY3RseSwgb3IgYXNrZWQgdG8gYmUgY29tcHV0ZWQgZnJvbSB0aGUKKy8vLyBnaXZlbiBvcHRpbWl6YXRpb24gYW5kIHNpemUgb3B0aW1pemF0aW9uIGFyZ3VtZW50cy4KKy8vLworLy8vIFRoZSAtaW5saW5lLXRocmVzaG9sZCBjb21tYW5kIGxpbmUgb3B0aW9uIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUKKy8vLyB0aHJlc2hvbGQgZ2l2ZW4gaGVyZS4KK1Bhc3MgKmNyZWF0ZUZ1bmN0aW9uSW5saW5pbmdQYXNzKCk7CitQYXNzICpjcmVhdGVGdW5jdGlvbklubGluaW5nUGFzcyhpbnQgVGhyZXNob2xkKTsKK1Bhc3MgKmNyZWF0ZUZ1bmN0aW9uSW5saW5pbmdQYXNzKHVuc2lnbmVkIE9wdExldmVsLCB1bnNpZ25lZCBTaXplT3B0TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpc2FibGVJbmxpbmVIb3RDYWxsU2l0ZSk7CitQYXNzICpjcmVhdGVGdW5jdGlvbklubGluaW5nUGFzcyhJbmxpbmVQYXJhbXMgJlBhcmFtcyk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gY3JlYXRlUHJ1bmVFSFBhc3MgLSBSZXR1cm4gYSBuZXcgcGFzcyBvYmplY3Qgd2hpY2ggdHJhbnNmb3JtcyBpbnZva2UKKy8vLyBpbnN0cnVjdGlvbnMgaW50byBjYWxscywgaWYgdGhlIGNhbGxlZSBjYW4gX25vdF8gdW53aW5kIHRoZSBzdGFjay4KKy8vLworUGFzcyAqY3JlYXRlUHJ1bmVFSFBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVJbnRlcm5hbGl6ZVBhc3MgLSBUaGlzIHBhc3MgbG9vcHMgb3ZlciBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBpbiB0aGUKKy8vLyBpbnB1dCBtb2R1bGUsIGludGVybmFsaXppbmcgYWxsIGdsb2JhbHMgKGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzKSBpdCBjYW4uCisvLy8vCisvLy8gQmVmb3JlIGludGVybmFsaXppbmcgYSBzeW1ib2wsIHRoZSBjYWxsYmFjayBccCBNdXN0UHJlc2VydmVHViBpcyBpbnZva2VkIGFuZAorLy8vIGdpdmVzIHRvIHRoZSBjbGllbnQgdGhlIGFiaWxpdHkgdG8gcHJldmVudCBpbnRlcm5hbGl6aW5nIHNwZWNpZmljIHN5bWJvbHMuCisvLy8KKy8vLyBUaGUgc3ltYm9sIGluIERTT0xpc3QgYXJlIGludGVybmFsaXplZCBpZiBpdCBpcyBzYWZlIHRvIGRyb3AgdGhlbSBmcm9tCisvLy8gdGhlIHN5bWJvbCB0YWJsZS4KKy8vLworLy8vIE5vdGUgdGhhdCBjb21tYW5kbGluZSBvcHRpb25zIHRoYXQgYXJlIHVzZWQgd2l0aCB0aGUgYWJvdmUgZnVuY3Rpb24gYXJlIG5vdAorLy8vIHVzZWQgbm93IQorTW9kdWxlUGFzcyAqCitjcmVhdGVJbnRlcm5hbGl6ZVBhc3Moc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IEdsb2JhbFZhbHVlICYpPiBNdXN0UHJlc2VydmVHVik7CisKKy8vLyBjcmVhdGVJbnRlcm5hbGl6ZVBhc3MgLSBTYW1lIGFzIGFib3ZlLCBidXQgd2l0aCBhbiBlbXB0eSBleHBvcnRMaXN0LgorTW9kdWxlUGFzcyAqY3JlYXRlSW50ZXJuYWxpemVQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gY3JlYXRlRGVhZEFyZ0VsaW1pbmF0aW9uUGFzcyAtIFRoaXMgcGFzcyByZW1vdmVzIGFyZ3VtZW50cyBmcm9tIGZ1bmN0aW9ucworLy8vIHdoaWNoIGFyZSBub3QgdXNlZCBieSB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24uCisvLy8KK01vZHVsZVBhc3MgKmNyZWF0ZURlYWRBcmdFbGltaW5hdGlvblBhc3MoKTsKKworLy8vIERlYWRBcmdIYWNraW5nIHBhc3MgLSBTYW1lIGFzIERBRSwgYnV0IGRlbGV0ZSBhcmd1bWVudHMgb2YgZXh0ZXJuYWwKKy8vLyBmdW5jdGlvbnMgYXMgd2VsbC4gIFRoaXMgaXMgZGVmaW5pdGVseSBub3Qgc2FmZSwgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkKKy8vLyBidWdwb2ludC4KK01vZHVsZVBhc3MgKmNyZWF0ZURlYWRBcmdIYWNraW5nUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIGNyZWF0ZUFyZ3VtZW50UHJvbW90aW9uUGFzcyAtIFRoaXMgcGFzcyBwcm9tb3RlcyAiYnkgcmVmZXJlbmNlIiBhcmd1bWVudHMgdG8KKy8vLyBiZSBwYXNzZWQgYnkgdmFsdWUgaWYgdGhlIG51bWJlciBvZiBlbGVtZW50cyBwYXNzZWQgaXMgc21hbGxlciBvcgorLy8vIGVxdWFsIHRvIG1heEVsZW1lbnRzIChtYXhFbGVtZW50cyA9PSAwIG1lYW5zIGFsd2F5cyBwcm9tb3RlKS4KKy8vLworUGFzcyAqY3JlYXRlQXJndW1lbnRQcm9tb3Rpb25QYXNzKHVuc2lnbmVkIG1heEVsZW1lbnRzID0gMyk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gY3JlYXRlSVBDb25zdGFudFByb3BhZ2F0aW9uUGFzcyAtIFRoaXMgcGFzcyBwcm9wYWdhdGVzIGNvbnN0YW50cyBmcm9tIGNhbGwKKy8vLyBzaXRlcyBpbnRvIHRoZSBib2RpZXMgb2YgZnVuY3Rpb25zLgorLy8vCitNb2R1bGVQYXNzICpjcmVhdGVJUENvbnN0YW50UHJvcGFnYXRpb25QYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gY3JlYXRlSVBTQ0NQUGFzcyAtIFRoaXMgcGFzcyBwcm9wYWdhdGVzIGNvbnN0YW50cyBmcm9tIGNhbGwgc2l0ZXMgaW50byB0aGUKKy8vLyBib2RpZXMgb2YgZnVuY3Rpb25zLCBhbmQga2VlcHMgdHJhY2sgb2Ygd2hldGhlciBiYXNpYyBibG9ja3MgYXJlIGV4ZWN1dGFibGUKKy8vLyBpbiB0aGUgcHJvY2Vzcy4KKy8vLworTW9kdWxlUGFzcyAqY3JlYXRlSVBTQ0NQUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBjcmVhdGVMb29wRXh0cmFjdG9yUGFzcyAtIFRoaXMgcGFzcyBleHRyYWN0cyBhbGwgbmF0dXJhbCBsb29wcyBmcm9tIHRoZQorLy8vIHByb2dyYW0gaW50byBhIGZ1bmN0aW9uIGlmIGl0IGNhbi4KKy8vLworUGFzcyAqY3JlYXRlTG9vcEV4dHJhY3RvclBhc3MoKTsKKworLy8vIGNyZWF0ZVNpbmdsZUxvb3BFeHRyYWN0b3JQYXNzIC0gVGhpcyBwYXNzIGV4dHJhY3RzIG9uZSBuYXR1cmFsIGxvb3AgZnJvbSB0aGUKKy8vLyBwcm9ncmFtIGludG8gYSBmdW5jdGlvbiBpZiBpdCBjYW4uICBUaGlzIGlzIHVzZWQgYnkgYnVncG9pbnQuCisvLy8KK1Bhc3MgKmNyZWF0ZVNpbmdsZUxvb3BFeHRyYWN0b3JQYXNzKCk7CisKKy8vLyBjcmVhdGVCbG9ja0V4dHJhY3RvclBhc3MgLSBUaGlzIHBhc3MgZXh0cmFjdHMgYWxsIHRoZSBzcGVjaWZpZWQgYmxvY2tzCisvLy8gZnJvbSB0aGUgZnVuY3Rpb25zIGluIHRoZSBtb2R1bGUuCisvLy8KK01vZHVsZVBhc3MgKmNyZWF0ZUJsb2NrRXh0cmFjdG9yUGFzcygpOworTW9kdWxlUGFzcyAqCitjcmVhdGVCbG9ja0V4dHJhY3RvclBhc3MoY29uc3QgU21hbGxWZWN0b3JJbXBsPEJhc2ljQmxvY2sgKj4gJkJsb2Nrc1RvRXh0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEVyYXNlRnVuY3Rpb25zKTsKKworLy8vIGNyZWF0ZVN0cmlwRGVhZFByb3RvdHlwZXNQYXNzIC0gVGhpcyBwYXNzIHJlbW92ZXMgYW55IGZ1bmN0aW9uIGRlY2xhcmF0aW9ucworLy8vIChwcm90b3R5cGVzKSB0aGF0IGFyZSBub3QgdXNlZC4KK01vZHVsZVBhc3MgKmNyZWF0ZVN0cmlwRGVhZFByb3RvdHlwZXNQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gY3JlYXRlUmV2ZXJzZVBvc3RPcmRlckZ1bmN0aW9uQXR0cnNQYXNzIC0gVGhpcyBwYXNzIHdhbGtzIFNDQ3Mgb2YgdGhlIGNhbGwKKy8vLyBncmFwaCBpbiBSUE8gdG8gZGVkdWNlIGFuZCBwcm9wYWdhdGUgZnVuY3Rpb24gYXR0cmlidXRlcy4gQ3VycmVudGx5IGl0CisvLy8gb25seSBoYW5kbGVzIHN5bnRoZXNpemluZyBub3JlY3Vyc2UgYXR0cmlidXRlcy4KKy8vLworUGFzcyAqY3JlYXRlUmV2ZXJzZVBvc3RPcmRlckZ1bmN0aW9uQXR0cnNQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gY3JlYXRlTWVyZ2VGdW5jdGlvbnNQYXNzIC0gVGhpcyBwYXNzIGRpc2NvdmVycyBpZGVudGljYWwgZnVuY3Rpb25zIGFuZAorLy8vIGNvbGxhcHNlcyB0aGVtLgorLy8vCitNb2R1bGVQYXNzICpjcmVhdGVNZXJnZUZ1bmN0aW9uc1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVQYXJ0aWFsSW5saW5pbmdQYXNzIC0gVGhpcyBwYXNzIGlubGluZXMgcGFydHMgb2YgZnVuY3Rpb25zLgorLy8vCitNb2R1bGVQYXNzICpjcmVhdGVQYXJ0aWFsSW5saW5pbmdQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gY3JlYXRlQmFycmllck5vb3BQYXNzIC0gVGhpcyBwYXNzIGlzIHB1cmVseSBhIG1vZHVsZSBwYXNzIGJhcnJpZXIgaW4gYSBwYXNzCisvLy8gbWFuYWdlci4KK01vZHVsZVBhc3MgKmNyZWF0ZUJhcnJpZXJOb29wUGFzcygpOworCisvLy8gY3JlYXRlQ2FsbGVkVmFsdWVQcm9wYWdhdGlvblBhc3MgLSBBdHRhY2ggbWV0YWRhdGEgdG8gaW5kaXJjdCBjYWxsIHNpdGVzCisvLy8gaW5kaWNhdGluZyB0aGUgc2V0IG9mIGZ1bmN0aW9ucyB0aGV5IG1heSB0YXJnZXQgYXQgcnVuLXRpbWUuCitNb2R1bGVQYXNzICpjcmVhdGVDYWxsZWRWYWx1ZVByb3BhZ2F0aW9uUGFzcygpOworCisvLy8gV2hhdCB0byBkbyB3aXRoIHRoZSBzdW1tYXJ5IHdoZW4gcnVubmluZyBwYXNzZXMgdGhhdCBvcGVyYXRlIG9uIGl0LgorZW51bSBjbGFzcyBQYXNzU3VtbWFyeUFjdGlvbiB7CisgIE5vbmUsICAgLy8vPCBEbyBub3RoaW5nLgorICBJbXBvcnQsIC8vLzwgSW1wb3J0IGluZm9ybWF0aW9uIGZyb20gc3VtbWFyeS4KKyAgRXhwb3J0LCAvLy88IEV4cG9ydCBpbmZvcm1hdGlvbiB0byBzdW1tYXJ5LgorfTsKKworLy8vIFxicmllZiBUaGlzIHBhc3MgbG93ZXJzIHR5cGUgbWV0YWRhdGEgYW5kIHRoZSBsbHZtLnR5cGUudGVzdCBpbnRyaW5zaWMgdG8KKy8vLyBiaXRzZXRzLgorLy8vCisvLy8gVGhlIGJlaGF2aW9yIGRlcGVuZHMgb24gdGhlIHN1bW1hcnkgYXJndW1lbnRzOgorLy8vIC0gSWYgRXhwb3J0U3VtbWFyeSBpcyBub24tbnVsbCwgdGhpcyBwYXNzIHdpbGwgZXhwb3J0IHR5cGUgaWRlbnRpZmllcnMgdG8KKy8vLyAgIHRoZSBnaXZlbiBzdW1tYXJ5LgorLy8vIC0gT3RoZXJ3aXNlLCBpZiBJbXBvcnRTdW1tYXJ5IGlzIG5vbi1udWxsLCB0aGlzIHBhc3Mgd2lsbCBpbXBvcnQgdHlwZQorLy8vICAgaWRlbnRpZmllcnMgZnJvbSB0aGUgZ2l2ZW4gc3VtbWFyeS4KKy8vLyAtIE90aGVyd2lzZSBpdCBkb2VzIG5laXRoZXIuCisvLy8gSXQgaXMgaW52YWxpZCBmb3IgYm90aCBFeHBvcnRTdW1tYXJ5IGFuZCBJbXBvcnRTdW1tYXJ5IHRvIGJlIG5vbi1udWxsLgorTW9kdWxlUGFzcyAqY3JlYXRlTG93ZXJUeXBlVGVzdHNQYXNzKE1vZHVsZVN1bW1hcnlJbmRleCAqRXhwb3J0U3VtbWFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGVTdW1tYXJ5SW5kZXggKkltcG9ydFN1bW1hcnkpOworCisvLy8gXGJyaWVmIFRoaXMgcGFzcyBleHBvcnQgQ0ZJIGNoZWNrcyBmb3IgdXNlIGJ5IGV4dGVybmFsIG1vZHVsZXMuCitNb2R1bGVQYXNzICpjcmVhdGVDcm9zc0RTT0NGSVBhc3MoKTsKKworLy8vIFxicmllZiBUaGlzIHBhc3MgaW1wbGVtZW50cyB3aG9sZS1wcm9ncmFtIGRldmlydHVhbGl6YXRpb24gdXNpbmcgdHlwZQorLy8vIG1ldGFkYXRhLgorLy8vCisvLy8gVGhlIGJlaGF2aW9yIGRlcGVuZHMgb24gdGhlIHN1bW1hcnkgYXJndW1lbnRzOgorLy8vIC0gSWYgRXhwb3J0U3VtbWFyeSBpcyBub24tbnVsbCwgdGhpcyBwYXNzIHdpbGwgZXhwb3J0IHR5cGUgaWRlbnRpZmllcnMgdG8KKy8vLyAgIHRoZSBnaXZlbiBzdW1tYXJ5LgorLy8vIC0gT3RoZXJ3aXNlLCBpZiBJbXBvcnRTdW1tYXJ5IGlzIG5vbi1udWxsLCB0aGlzIHBhc3Mgd2lsbCBpbXBvcnQgdHlwZQorLy8vICAgaWRlbnRpZmllcnMgZnJvbSB0aGUgZ2l2ZW4gc3VtbWFyeS4KKy8vLyAtIE90aGVyd2lzZSBpdCBkb2VzIG5laXRoZXIuCisvLy8gSXQgaXMgaW52YWxpZCBmb3IgYm90aCBFeHBvcnRTdW1tYXJ5IGFuZCBJbXBvcnRTdW1tYXJ5IHRvIGJlIG5vbi1udWxsLgorTW9kdWxlUGFzcyAqCitjcmVhdGVXaG9sZVByb2dyYW1EZXZpcnRQYXNzKE1vZHVsZVN1bW1hcnlJbmRleCAqRXhwb3J0U3VtbWFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTW9kdWxlU3VtbWFyeUluZGV4ICpJbXBvcnRTdW1tYXJ5KTsKKworLy8vIFRoaXMgcGFzcyBzcGxpdHMgZ2xvYmFscyBpbnRvIHBpZWNlcyBmb3IgdGhlIGJlbmVmaXQgb2Ygd2hvbGUtcHJvZ3JhbQorLy8vIGRldmlydHVhbGl6YXRpb24gYW5kIGNvbnRyb2wtZmxvdyBpbnRlZ3JpdHkuCitNb2R1bGVQYXNzICpjcmVhdGVHbG9iYWxTcGxpdFBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNhbXBsZVByb2ZpbGVQYXNzIC0gTG9hZHMgc2FtcGxlIHByb2ZpbGUgZGF0YSBmcm9tIGRpc2sgYW5kIGdlbmVyYXRlcworLy8gSVIgbWV0YWRhdGEgdG8gcmVmbGVjdCB0aGUgcHJvZmlsZS4KK01vZHVsZVBhc3MgKmNyZWF0ZVNhbXBsZVByb2ZpbGVMb2FkZXJQYXNzKCk7CitNb2R1bGVQYXNzICpjcmVhdGVTYW1wbGVQcm9maWxlTG9hZGVyUGFzcyhTdHJpbmdSZWYgTmFtZSk7CisKKy8vLyBXcml0ZSBUaGluTFRPLXJlYWR5IGJpdGNvZGUgdG8gU3RyLgorTW9kdWxlUGFzcyAqY3JlYXRlV3JpdGVUaGluTFRPQml0Y29kZVBhc3MocmF3X29zdHJlYW0gJlN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICpUaGluTGlua09TID0gbnVsbHB0cik7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9BbHdheXNJbmxpbmVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0Fsd2F5c0lubGluZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTJjMGZkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9BbHdheXNJbmxpbmVyLmgKQEAgLTAsMCArMSw0NiBAQAorLy89PT0tLSBBbHdheXNJbmxpbmVyLmggLSBQYXNzIHRvIGlubGluZSAiYWx3YXlzX2lubGluZSIgZnVuY3Rpb25zIC0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gUHJvdmlkZXMgcGFzc2VzIHRvIGlubGluaW5nICJhbHdheXNfaW5saW5lIiBmdW5jdGlvbnMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lQT19BTFdBWVNJTkxJTkVSX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19BTFdBWVNJTkxJTkVSX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gSW5saW5lcyBmdW5jdGlvbnMgbWFya2VkIGFzICJhbHdheXNfaW5saW5lIi4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGlubGluZSBjYWxsIHNpdGVzIG1hcmtlZCBhcyBhbHdheXNfaW5saW5lIGFuZCBkb2VzCisvLy8gbm90IGRlbGV0ZSB0aGUgZnVuY3Rpb25zIGV2ZW4gd2hlbiBhbGwgdXNlcnMgYXJlIGlubGluZWQuIFRoZSBub3JtYWwKKy8vLyBpbmxpbmVyIHNob3VsZCBiZSB1c2VkIHRvIGhhbmRsZSBjYWxsIHNpdGUgaW5saW5pbmcsIHRoaXMgcGFzcydzIGdvYWwgaXMgdG8KKy8vLyBiZSB0aGUgc2ltcGxlc3QgcG9zc2libGUgcGFzcyB0byByZW1vdmUgYWx3YXlzX2lubGluZSBmdW5jdGlvbiBkZWZpbml0aW9ucycKKy8vLyB1c2VzIGJ5IGlubGluaW5nIHRoZW0uIFRoZSBcYyBHbG9iYWxEQ0UgcGFzcyBjYW4gYmUgdXNlZCB0byByZW1vdmUgdGhlc2UKKy8vLyBmdW5jdGlvbnMgb25jZSBhbGwgdXNlcnMgYXJlIGdvbmUuCitjbGFzcyBBbHdheXNJbmxpbmVyUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPEFsd2F5c0lubGluZXJQYXNzPiB7CisgIGJvb2wgSW5zZXJ0TGlmZXRpbWU7CisKK3B1YmxpYzoKKyAgQWx3YXlzSW5saW5lclBhc3MoYm9vbCBJbnNlcnRMaWZldGltZSA9IHRydWUpCisgICAgICA6IEluc2VydExpZmV0aW1lKEluc2VydExpZmV0aW1lKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmKTsKK307CisKKy8vLyBDcmVhdGUgYSBsZWdhY3kgcGFzcyBtYW5hZ2VyIGluc3RhbmNlIG9mIGEgcGFzcyB0byBpbmxpbmUgYW5kIHJlbW92ZQorLy8vIGZ1bmN0aW9ucyBtYXJrZWQgYXMgImFsd2F5c19pbmxpbmUiLgorUGFzcyAqY3JlYXRlQWx3YXlzSW5saW5lckxlZ2FjeVBhc3MoYm9vbCBJbnNlcnRMaWZldGltZSA9IHRydWUpOworCit9CisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfSVBPX0FMV0FZU0lOTElORVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9Bcmd1bWVudFByb21vdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9Bcmd1bWVudFByb21vdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5Y2E2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0FyZ3VtZW50UHJvbW90aW9uLmgKQEAgLTAsMCArMSwzNiBAQAorLy89PT0tIEFyZ3VtZW50UHJvbW90aW9uLmggLSBQcm9tb3RlIGJ5LXJlZmVyZW5jZSBhcmd1bWVudHMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0FSR1VNRU5UUFJPTU9USU9OX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19BUkdVTUVOVFBST01PVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NHU0NDUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xhenlDYWxsR3JhcGguaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEFyZ3VtZW50IHByb21vdGlvbiBwYXNzLgorLy8vCisvLy8gVGhpcyBwYXNzIHdhbGtzIHRoZSBmdW5jdGlvbnMgaW4gZWFjaCBTQ0MgYW5kIGZvciBlYWNoIG9uZSB0cmllcyB0bworLy8vIHRyYW5zZm9ybSBpdCBhbmQgYWxsIG9mIGl0cyBjYWxsZXJzIHRvIHJlcGxhY2UgaW5kaXJlY3QgYXJndW1lbnRzIHdpdGgKKy8vLyBkaXJlY3QgKGJ5LXZhbHVlKSBhcmd1bWVudHMuCitjbGFzcyBBcmd1bWVudFByb21vdGlvblBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxBcmd1bWVudFByb21vdGlvblBhc3M+IHsKKyAgdW5zaWduZWQgTWF4RWxlbWVudHM7CisKK3B1YmxpYzoKKyAgQXJndW1lbnRQcm9tb3Rpb25QYXNzKHVuc2lnbmVkIE1heEVsZW1lbnRzID0gM3UpIDogTWF4RWxlbWVudHMoTWF4RWxlbWVudHMpIHt9CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKExhenlDYWxsR3JhcGg6OlNDQyAmQywgQ0dTQ0NBbmFseXNpc01hbmFnZXIgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgTGF6eUNhbGxHcmFwaCAmQ0csIENHU0NDVXBkYXRlUmVzdWx0ICZVUik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lQT19BUkdVTUVOVFBST01PVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0NhbGxlZFZhbHVlUHJvcGFnYXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vQ2FsbGVkVmFsdWVQcm9wYWdhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MmJkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0NhbGxlZFZhbHVlUHJvcGFnYXRpb24uaApAQCAtMCwwICsxLDM1IEBACisvLz09PS0gQ2FsbGVkVmFsdWVQcm9wYWdhdGlvbi5oIC0gUHJvcGFnYXRlIGNhbGxlZCB2YWx1ZXMgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgdHJhbnNmb3JtYXRpb24gdGhhdCBhdHRhY2hlcyAhY2FsbGVlcyBtZXRhZGF0YSB0bworLy8gaW5kaXJlY3QgY2FsbCBzaXRlcy4gRm9yIGEgZ2l2ZW4gY2FsbCBzaXRlLCB0aGUgbWV0YWRhdGEsIGlmIHByZXNlbnQsCisvLyBpbmRpY2F0ZXMgdGhlIHNldCBvZiBmdW5jdGlvbnMgdGhlIGNhbGwgc2l0ZSBjb3VsZCBwb3NzaWJseSB0YXJnZXQgYXQKKy8vIHJ1bi10aW1lLiBUaGlzIG1ldGFkYXRhIGlzIGFkZGVkIHRvIGluZGlyZWN0IGNhbGwgc2l0ZXMgd2hlbiB0aGUgc2V0IG9mCisvLyBwb3NzaWJsZSB0YXJnZXRzIGNhbiBiZSBkZXRlcm1pbmVkIGJ5IGFuYWx5c2lzIGFuZCBpcyBrbm93biB0byBiZSBzbWFsbC4gVGhlCisvLyBhbmFseXNpcyBkcml2aW5nIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBzaW1pbGFyIHRvIGNvbnN0YW50IHByb3BhZ2F0aW9uIGFuZAorLy8gbWFrZXMgdXNlcyBvZiB0aGUgZ2VuZXJpYyBzcGFyc2UgcHJvcGFnYXRpb24gc29sdmVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lQT19DQUxMRURWQUxVRVBST1BBR0FUSU9OX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19DQUxMRURWQUxVRVBST1BBR0FUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIENhbGxlZFZhbHVlUHJvcGFnYXRpb25QYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxDYWxsZWRWYWx1ZVByb3BhZ2F0aW9uUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJik7Cit9OworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lQT19DQUxMRURWQUxVRVBST1BBR0FUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vQ29uc3RhbnRNZXJnZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9Db25zdGFudE1lcmdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0ZDNhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vQ29uc3RhbnRNZXJnZS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vPT09LSBDb25zdGFudE1lcmdlLmggLSBNZXJnZSBkdXBsaWNhdGUgZ2xvYmFsIGNvbnN0YW50cyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSB0byBhIHBhc3MgdGhhdCBtZXJnZXMgZHVwbGljYXRlIGdsb2JhbAorLy8gY29uc3RhbnRzIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUgY29uc3RhbnQgdGhhdCBpcyBzaGFyZWQuICBUaGlzIGlzIHVzZWZ1bAorLy8gYmVjYXVzZSBzb21lIHBhc3NlcyAoaWUgVHJhY2VWYWx1ZXMpIGluc2VydCBhIGxvdCBvZiBzdHJpbmcgY29uc3RhbnRzIGludG8KKy8vIHRoZSBwcm9ncmFtLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IGFuIGV4aXN0aW5nIHN0cmluZyBpcyBhdmFpbGFibGUuCisvLworLy8gQWxnb3JpdGhtOiBDb25zdGFudE1lcmdlIGlzIGRlc2lnbmVkIHRvIGJ1aWxkIHVwIGEgbWFwIG9mIGF2YWlsYWJsZSBjb25zdGFudHMKKy8vIGFuZCBlbGltaW5hdGUgZHVwbGljYXRlcyB3aGVuIGl0IGlzIGluaXRpYWxpemVkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lQT19DT05TVEFOVE1FUkdFX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19DT05TVEFOVE1FUkdFX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNb2R1bGU7CisKKy8vLyBBIHBhc3MgdGhhdCBtZXJnZXMgZHVwbGljYXRlIGdsb2JhbCBjb25zdGFudHMgaW50byBhIHNpbmdsZSBjb25zdGFudC4KK2NsYXNzIENvbnN0YW50TWVyZ2VQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48Q29uc3RhbnRNZXJnZVBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICYpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19JUE9fQ09OU1RBTlRNRVJHRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0Nyb3NzRFNPQ0ZJLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0Nyb3NzRFNPQ0ZJLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3OWY1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vQ3Jvc3NEU09DRkkuaApAQCAtMCwwICsxLDI4IEBACisvLz09PS0tIENyb3NzRFNPQ0ZJLmNwcCAtIEV4dGVybmFsaXplIHRoaXMgbW9kdWxlJ3MgQ0ZJIGNoZWNrcyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBleHBvcnRzIGFsbCBsbHZtLmJpdHNldCdzIGZvdW5kIGluIHRoZSBtb2R1bGUgaW4gdGhlIGZvcm0gb2YgYQorLy8gX19jZmlfY2hlY2sgZnVuY3Rpb24sIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBjcm9zcy1EU08gY2FsbCB0YXJnZXRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lQT19DUk9TU0RTT0NGSV9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JUE9fQ1JPU1NEU09DRklfSAorCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIENyb3NzRFNPQ0ZJUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPENyb3NzRFNPQ0ZJUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJkFNKTsKK307Cit9CisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lQT19DUk9TU0RTT0NGSV9ICisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vRGVhZEFyZ3VtZW50RWxpbWluYXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vRGVhZEFyZ3VtZW50RWxpbWluYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTU2NjZmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9EZWFkQXJndW1lbnRFbGltaW5hdGlvbi5oCkBAIC0wLDAgKzEsMTQ0IEBACisvLz09PS0gRGVhZEFyZ3VtZW50RWxpbWluYXRpb24uaCAtIEVsaW1pbmF0ZSBEZWFkIEFyZ3MgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBkZWxldGVzIGRlYWQgYXJndW1lbnRzIGZyb20gaW50ZXJuYWwgZnVuY3Rpb25zLiAgRGVhZCBhcmd1bWVudAorLy8gZWxpbWluYXRpb24gcmVtb3ZlcyBhcmd1bWVudHMgd2hpY2ggYXJlIGRpcmVjdGx5IGRlYWQsIGFzIHdlbGwgYXMgYXJndW1lbnRzCisvLyBvbmx5IHBhc3NlZCBpbnRvIGZ1bmN0aW9uIGNhbGxzIGFzIGRlYWQgYXJndW1lbnRzIG9mIG90aGVyIGZ1bmN0aW9ucy4gIFRoaXMKKy8vIHBhc3MgYWxzbyBkZWxldGVzIGRlYWQgcmV0dXJuIHZhbHVlcyBpbiBhIHNpbWlsYXIgd2F5LgorLy8KKy8vIFRoaXMgcGFzcyBpcyBvZnRlbiB1c2VmdWwgYXMgYSBjbGVhbnVwIHBhc3MgdG8gcnVuIGFmdGVyIGFnZ3Jlc3NpdmUKKy8vIGludGVycHJvY2VkdXJhbCBwYXNzZXMsIHdoaWNoIGFkZCBwb3NzaWJseS1kZWFkIGFyZ3VtZW50cyBvciByZXR1cm4gdmFsdWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lQT19ERUFEQVJHVU1FTlRFTElNSU5BVElPTl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JUE9fREVBREFSR1VNRU5URUxJTUlOQVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTW9kdWxlOworY2xhc3MgVXNlOworY2xhc3MgVmFsdWU7CisKKy8vLyBFbGltaW5hdGUgZGVhZCBhcmd1bWVudHMgKGFuZCByZXR1cm4gdmFsdWVzKSBmcm9tIGZ1bmN0aW9ucy4KK2NsYXNzIERlYWRBcmd1bWVudEVsaW1pbmF0aW9uUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48RGVhZEFyZ3VtZW50RWxpbWluYXRpb25QYXNzPiB7CitwdWJsaWM6CisgIC8vLyBTdHJ1Y3QgdGhhdCByZXByZXNlbnRzIChwYXJ0IG9mKSBlaXRoZXIgYSByZXR1cm4gdmFsdWUgb3IgYSBmdW5jdGlvbgorICAvLy8gYXJndW1lbnQuICBVc2VkIHNvIHRoYXQgYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWVzIGNhbiBiZSB1c2VkCisgIC8vLyBpbnRlcmNoYW5nZWFibHkuCisgIHN0cnVjdCBSZXRPckFyZyB7CisgICAgY29uc3QgRnVuY3Rpb24gKkY7CisgICAgdW5zaWduZWQgSWR4OworICAgIGJvb2wgSXNBcmc7CisKKyAgICBSZXRPckFyZyhjb25zdCBGdW5jdGlvbiAqRiwgdW5zaWduZWQgSWR4LCBib29sIElzQXJnKQorICAgICAgICA6IEYoRiksIElkeChJZHgpLCBJc0FyZyhJc0FyZykge30KKworICAgIC8vLyBNYWtlIFJldE9yQXJnIGNvbXBhcmFibGUsIHNvIHdlIGNhbiBwdXQgaXQgaW50byBhIG1hcC4KKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBSZXRPckFyZyAmTykgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dGllKEYsIElkeCwgSXNBcmcpIDwgc3RkOjp0aWUoTy5GLCBPLklkeCwgTy5Jc0FyZyk7CisgICAgfQorCisgICAgLy8vIE1ha2UgUmV0T3JBcmcgY29tcGFyYWJsZSwgc28gd2UgY2FuIGVhc2lseSBpdGVyYXRlIHRoZSBtdWx0aW1hcC4KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmV0T3JBcmcgJk8pIGNvbnN0IHsKKyAgICAgIHJldHVybiBGID09IE8uRiAmJiBJZHggPT0gTy5JZHggJiYgSXNBcmcgPT0gTy5Jc0FyZzsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoVHdpbmUoSXNBcmcgPyAiQXJndW1lbnQgIyIgOiAiUmV0dXJuIHZhbHVlICMiKSArIFR3aW5lKElkeCkgKworICAgICAgICAgICAgICAiIG9mIGZ1bmN0aW9uICIgKyBGLT5nZXROYW1lKCkpCisgICAgICAgICAgLnN0cigpOworICAgIH0KKyAgfTsKKworICAvLy8gTGl2ZW5lc3MgZW51bSAtIER1cmluZyBvdXIgaW5pdGlhbCBwYXNzIG92ZXIgdGhlIHByb2dyYW0sIHdlIGRldGVybWluZQorICAvLy8gdGhhdCB0aGluZ3MgYXJlIGVpdGhlciBhbGl2ZSBvciBtYXliZSBhbGl2ZS4gV2UgZG9uJ3QgbWFyayBhbnl0aGluZworICAvLy8gZXhwbGljaXRseSBkZWFkIChldmVuIGlmIHdlIGtub3cgdGhleSBhcmUpLCBzaW5jZSBhbnl0aGluZyBub3QgYWxpdmUKKyAgLy8vIHdpdGggbm8gcmVnaXN0ZXJlZCB1c2VzIChpbiBVc2VzKSB3aWxsIG5ldmVyIGJlIG1hcmtlZCBhbGl2ZSBhbmQgd2lsbAorICAvLy8gdGh1cyBiZWNvbWUgZGVhZCBpbiB0aGUgZW5kLgorICBlbnVtIExpdmVuZXNzIHsgTGl2ZSwgTWF5YmVMaXZlIH07CisKKyAgRGVhZEFyZ3VtZW50RWxpbWluYXRpb25QYXNzKGJvb2wgU2hvdWxkSGFja0FyZ3VtZW50c18gPSBmYWxzZSkKKyAgICAgIDogU2hvdWxkSGFja0FyZ3VtZW50cyhTaG91bGRIYWNrQXJndW1lbnRzXykge30KKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJik7CisKKyAgLy8vIENvbnZlbmllbmNlIHdyYXBwZXIKKyAgUmV0T3JBcmcgQ3JlYXRlUmV0KGNvbnN0IEZ1bmN0aW9uICpGLCB1bnNpZ25lZCBJZHgpIHsKKyAgICByZXR1cm4gUmV0T3JBcmcoRiwgSWR4LCBmYWxzZSk7CisgIH0KKworICAvLy8gQ29udmVuaWVuY2Ugd3JhcHBlcgorICBSZXRPckFyZyBDcmVhdGVBcmcoY29uc3QgRnVuY3Rpb24gKkYsIHVuc2lnbmVkIElkeCkgeworICAgIHJldHVybiBSZXRPckFyZyhGLCBJZHgsIHRydWUpOworICB9CisKKyAgdXNpbmcgVXNlTWFwID0gc3RkOjptdWx0aW1hcDxSZXRPckFyZywgUmV0T3JBcmc+OworCisgIC8vLyBUaGlzIG1hcHMgYSByZXR1cm4gdmFsdWUgb3IgYXJndW1lbnQgdG8gYW55IE1heWJlTGl2ZSByZXR1cm4gdmFsdWVzIG9yCisgIC8vLyBhcmd1bWVudHMgaXQgdXNlcy4gVGhpcyBhbGxvd3MgdGhlIE1heWJlTGl2ZSB2YWx1ZXMgdG8gYmUgbWFya2VkIGxpdmUKKyAgLy8vIHdoZW4gYW55IG9mIGl0cyB1c2VycyBpcyBtYXJrZWQgbGl2ZS4KKyAgLy8vIEZvciBleGFtcGxlIChpbmRpY2VzIGFyZSBsZWZ0IG91dCBmb3IgY2xhcml0eSk6CisgIC8vLyAgLSBVc2VzW3JldCBGXSA9IHJldCBHCisgIC8vLyAgICBUaGlzIG1lYW5zIHRoYXQgRiBjYWxscyBHLCBhbmQgRiByZXR1cm5zIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBHLgorICAvLy8gIC0gVXNlc1thcmcgRl0gPSByZXQgRworICAvLy8gICAgVGhpcyBtZWFucyB0aGF0IHNvbWUgZnVuY3Rpb24gY2FsbHMgRyBhbmQgcGFzc2VzIGl0cyByZXN1bHQgYXMgYW4KKyAgLy8vICAgIGFyZ3VtZW50IHRvIEYuCisgIC8vLyAgLSBVc2VzW3JldCBGXSA9IGFyZyBGCisgIC8vLyAgICBUaGlzIG1lYW5zIHRoYXQgRiByZXR1cm5zIG9uZSBvZiBpdHMgb3duIGFyZ3VtZW50cy4KKyAgLy8vICAtIFVzZXNbYXJnIEZdID0gYXJnIEcKKyAgLy8vICAgIFRoaXMgbWVhbnMgdGhhdCBHIGNhbGxzIEYgYW5kIHBhc3NlcyBvbmUgb2YgaXRzIG93biAoRydzKSBhcmd1bWVudHMKKyAgLy8vICAgIGRpcmVjdGx5IHRvIEYuCisgIFVzZU1hcCBVc2VzOworCisgIHVzaW5nIExpdmVTZXQgPSBzdGQ6OnNldDxSZXRPckFyZz47CisgIHVzaW5nIExpdmVGdW5jU2V0ID0gc3RkOjpzZXQ8Y29uc3QgRnVuY3Rpb24gKj47CisKKyAgLy8vIFRoaXMgc2V0IGNvbnRhaW5zIGFsbCB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gZGV0ZXJtaW5lZCB0byBiZSBsaXZlLgorICBMaXZlU2V0IExpdmVWYWx1ZXM7CisKKyAgLy8vIFRoaXMgc2V0IGNvbnRhaW5zIGFsbCB2YWx1ZXMgdGhhdCBhcmUgY2Fubm90IGJlIGNoYW5nZWQgaW4gYW55IHdheS4KKyAgTGl2ZUZ1bmNTZXQgTGl2ZUZ1bmN0aW9uczsKKworICB1c2luZyBVc2VWZWN0b3IgPSBTbWFsbFZlY3RvcjxSZXRPckFyZywgNT47CisKKyAgLy8vIFRoaXMgYWxsb3dzIHRoaXMgcGFzcyB0byBkbyBkb3VibGUtZHV0eSBhcyB0aGUgZGVhZCBhcmcgaGFja2luZyBwYXNzCisgIC8vLyAodXNlZCBvbmx5IGJ5IGJ1Z3BvaW50KS4KKyAgYm9vbCBTaG91bGRIYWNrQXJndW1lbnRzID0gZmFsc2U7CisKK3ByaXZhdGU6CisgIExpdmVuZXNzIE1hcmtJZk5vdExpdmUoUmV0T3JBcmcgVXNlLCBVc2VWZWN0b3IgJk1heWJlTGl2ZVVzZXMpOworICBMaXZlbmVzcyBTdXJ2ZXlVc2UoY29uc3QgVXNlICpVLCBVc2VWZWN0b3IgJk1heWJlTGl2ZVVzZXMsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZXRWYWxOdW0gPSAtMVUpOworICBMaXZlbmVzcyBTdXJ2ZXlVc2VzKGNvbnN0IFZhbHVlICpWLCBVc2VWZWN0b3IgJk1heWJlTGl2ZVVzZXMpOworCisgIHZvaWQgU3VydmV5RnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gJkYpOworICB2b2lkIE1hcmtWYWx1ZShjb25zdCBSZXRPckFyZyAmUkEsIExpdmVuZXNzIEwsCisgICAgICAgICAgICAgICAgIGNvbnN0IFVzZVZlY3RvciAmTWF5YmVMaXZlVXNlcyk7CisgIHZvaWQgTWFya0xpdmUoY29uc3QgUmV0T3JBcmcgJlJBKTsKKyAgdm9pZCBNYXJrTGl2ZShjb25zdCBGdW5jdGlvbiAmRik7CisgIHZvaWQgUHJvcGFnYXRlTGl2ZW5lc3MoY29uc3QgUmV0T3JBcmcgJlJBKTsKKyAgYm9vbCBSZW1vdmVEZWFkU3R1ZmZGcm9tRnVuY3Rpb24oRnVuY3Rpb24gKkYpOworICBib29sIERlbGV0ZURlYWRWYXJhcmdzKEZ1bmN0aW9uICZGbik7CisgIGJvb2wgUmVtb3ZlRGVhZEFyZ3VtZW50c0Zyb21DYWxsZXJzKEZ1bmN0aW9uICZGbik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lQT19ERUFEQVJHVU1FTlRFTElNSU5BVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0VsaW1BdmFpbEV4dGVybi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9FbGltQXZhaWxFeHRlcm4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGNiOTU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9FbGltQXZhaWxFeHRlcm4uaApAQCAtMCwwICsxLDMzIEBACisvLz09PS0gRWxpbUF2YWlsRXh0ZXJuLmggLSBPcHRpbWl6ZSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgdHJhbnNmb3JtIGlzIGRlc2lnbmVkIHRvIGVsaW1pbmF0ZSBhdmFpbGFibGUgZXh0ZXJuYWwgZ2xvYmFsCisvLyBkZWZpbml0aW9ucyBmcm9tIHRoZSBwcm9ncmFtLCB0dXJuaW5nIHRoZW0gaW50byBkZWNsYXJhdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0VMSU1BVkFJTEVYVEVSTl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JUE9fRUxJTUFWQUlMRVhURVJOX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNb2R1bGU7CisKKy8vLyBBIHBhc3MgdGhhdCB0cmFuc2Zvcm1zIGV4dGVybmFsIGdsb2JhbCBkZWZpbml0aW9ucyBpbnRvIGRlY2xhcmF0aW9ucy4KK2NsYXNzIEVsaW1pbmF0ZUF2YWlsYWJsZUV4dGVybmFsbHlQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxFbGltaW5hdGVBdmFpbGFibGVFeHRlcm5hbGx5UGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lQT19FTElNQVZBSUxFWFRFUk5fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9Gb3JjZUZ1bmN0aW9uQXR0cnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vRm9yY2VGdW5jdGlvbkF0dHJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY4YTY1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vRm9yY2VGdW5jdGlvbkF0dHJzLmgKQEAgLTAsMCArMSwzMyBAQAorLy89PT0tLSBGb3JjZUZ1bmN0aW9uQXR0cnMuaCAtIEZvcmNlIGZ1bmN0aW9uIGF0dHJzIGZvciBkZWJ1Z2dpbmcgLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFN1cGVyIHNpbXBsZSBwYXNzZXMgdG8gZm9yY2Ugc3BlY2lmaWMgZnVuY3Rpb24gYXR0cnMgZnJvbSB0aGUgY29tbWFuZGxpbmUKKy8vLyBpbnRvIHRoZSBJUiBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0ZPUkNFRlVOQ1RJT05BVFRSU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JUE9fRk9SQ0VGVU5DVElPTkFUVFJTX0gKKworI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBQYXNzIHdoaWNoIGZvcmNlcyBzcGVjaWZpYyBmdW5jdGlvbiBhdHRyaWJ1dGVzIGludG8gdGhlIElSLCBwcmltYXJpbHkgYXMKKy8vLyBhIGRlYnVnZ2luZyB0b29sLgorc3RydWN0IEZvcmNlRnVuY3Rpb25BdHRyc1Bhc3MgOiBQYXNzSW5mb01peGluPEZvcmNlRnVuY3Rpb25BdHRyc1Bhc3M+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICYpOworfTsKKworLy8vIENyZWF0ZSBhIGxlZ2FjeSBwYXNzIG1hbmFnZXIgaW5zdGFuY2Ugb2YgYSBwYXNzIHRvIGZvcmNlIGZ1bmN0aW9uIGF0dHJzLgorUGFzcyAqY3JlYXRlRm9yY2VGdW5jdGlvbkF0dHJzTGVnYWN5UGFzcygpOworCit9CisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfSVBPX0ZPUkNFRlVOQ1RJT05BVFRSU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0Z1bmN0aW9uQXR0cnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vRnVuY3Rpb25BdHRycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOWYxOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0Z1bmN0aW9uQXR0cnMuaApAQCAtMCwwICsxLDc3IEBACisvLz09PS0gRnVuY3Rpb25BdHRycy5oIC0gQ29tcHV0ZSBmdW5jdGlvbiBhdHRyaWJ1dGVzIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFByb3ZpZGVzIHBhc3NlcyBmb3IgY29tcHV0aW5nIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgYmFzZWQgb24gaW50ZXJwcm9jZWR1cmFsCisvLy8gYW5hbHlzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0ZVTkNUSU9OQVRUUlNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfSVBPX0ZVTkNUSU9OQVRUUlNfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9DR1NDQ1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9MYXp5Q2FsbEdyYXBoLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFBUmVzdWx0czsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTW9kdWxlOworY2xhc3MgUGFzczsKKworLy8vIFRoZSB0aHJlZSBraW5kcyBvZiBtZW1vcnkgYWNjZXNzIHJlbGV2YW50IHRvICdyZWFkb25seScgYW5kCisvLy8gJ3JlYWRub25lJyBhdHRyaWJ1dGVzLgorZW51bSBNZW1vcnlBY2Nlc3NLaW5kIHsKKyAgTUFLX1JlYWROb25lID0gMCwKKyAgTUFLX1JlYWRPbmx5ID0gMSwKKyAgTUFLX01heVdyaXRlID0gMgorfTsKKworLy8vIFJldHVybnMgdGhlIG1lbW9yeSBhY2Nlc3MgcHJvcGVydGllcyBvZiB0aGlzIGNvcHkgb2YgdGhlIGZ1bmN0aW9uLgorTWVtb3J5QWNjZXNzS2luZCBjb21wdXRlRnVuY3Rpb25Cb2R5TWVtb3J5QWNjZXNzKEZ1bmN0aW9uICZGLCBBQVJlc3VsdHMgJkFBUik7CisKKy8vLyBDb21wdXRlcyBmdW5jdGlvbiBhdHRyaWJ1dGVzIGluIHBvc3Qtb3JkZXIgb3ZlciB0aGUgY2FsbCBncmFwaC4KKy8vLworLy8vIEJ5IG9wZXJhdGluZyBpbiBwb3N0LW9yZGVyLCB0aGlzIHBhc3MgY29tcHV0ZXMgcHJlY2lzZSBhdHRyaWJ1dGVzIGZvcgorLy8vIGNhbGxlZCBmdW5jdGlvbnMgcHJpb3IgdG8gcHJvY2Vzc3NpbmcgdGhlaXIgY2FsbGVycy4gVGhpcyAiYm90dG9tLXVwIgorLy8vIGFwcHJvYWNoIGFsbG93cyBwb3dlcmZ1bCBpbnRlcnByb2NlZHVyYWwgaW5mZXJlbmNlIG9mIGZ1bmN0aW9uIGF0dHJpYnV0ZXMKKy8vLyBsaWtlIG1lbW9yeSBhY2Nlc3MgcGF0dGVybnMsIGV0Yy4gSXQgY2FuIGRpc2NvdmVyIGZ1bmN0aW9ucyB0aGF0IGRvIG5vdAorLy8vIGFjY2VzcyBtZW1vcnksIG9yIG9ubHkgcmVhZCBtZW1vcnksIGFuZCBnaXZlIHRoZW0gdGhlIHJlYWRub25lL3JlYWRvbmx5CisvLy8gYXR0cmlidXRlLiBJdCBhbHNvIGRpc2NvdmVycyBmdW5jdGlvbiBhcmd1bWVudHMgdGhhdCBhcmUgbm90IGNhcHR1cmVkIGJ5CisvLy8gdGhlIGZ1bmN0aW9uIGFuZCBtYXJrcyB0aGVtIHdpdGggdGhlIG5vY2FwdHVyZSBhdHRyaWJ1dGUuCitzdHJ1Y3QgUG9zdE9yZGVyRnVuY3Rpb25BdHRyc1Bhc3MgOiBQYXNzSW5mb01peGluPFBvc3RPcmRlckZ1bmN0aW9uQXR0cnNQYXNzPiB7CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMYXp5Q2FsbEdyYXBoOjpTQ0MgJkMsIENHU0NDQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExhenlDYWxsR3JhcGggJkNHLCBDR1NDQ1VwZGF0ZVJlc3VsdCAmVVIpOworfTsKKworLy8vIENyZWF0ZSBhIGxlZ2FjeSBwYXNzIG1hbmFnZXIgaW5zdGFuY2Ugb2YgYSBwYXNzIHRvIGNvbXB1dGUgZnVuY3Rpb24gYXR0cnMKKy8vLyBpbiBwb3N0LW9yZGVyLgorUGFzcyAqY3JlYXRlUG9zdE9yZGVyRnVuY3Rpb25BdHRyc0xlZ2FjeVBhc3MoKTsKKworLy8vIEEgcGFzcyB0byBkbyBSUE8gZGVkdWN0aW9uIGFuZCBwcm9wYWdhdGlvbiBvZiBmdW5jdGlvbiBhdHRyaWJ1dGVzLgorLy8vCisvLy8gVGhpcyBwYXNzIHByb3ZpZGVzIGEgZ2VuZXJhbCBSUE8gb3IgInRvcCBkb3duIiBwcm9wYWdhdGlvbiBvZgorLy8vIGZ1bmN0aW9uIGF0dHJpYnV0ZXMuIEZvciBhIGZldyAocmFyZSkgY2FzZXMsIHdlIGNhbiBkZWR1Y2Ugc2lnbmlmaWNhbnRseQorLy8vIG1vcmUgYWJvdXQgZnVuY3Rpb24gYXR0cmlidXRlcyBieSB3b3JraW5nIGluIFJQTywgc28gdGhpcyBwYXNzCisvLy8gcHJvdmlkZXMgdGhlIGNvbXBsZW1lbnQgdG8gdGhlIHBvc3Qtb3JkZXIgcGFzcyBhYm92ZSB3aGVyZSB0aGUgbWFqb3JpdHkgb2YKKy8vLyBkZWR1Y3Rpb24gaXMgcGVyZm9ybWVkLgorLy8gRklYTUU6IEN1cnJlbnRseSB0aGVyZSBpcyBubyBSUE8gQ0dTQ0MgcGFzcyBzdHJ1Y3R1cmUgdG8gc2xpZGUgaW50byBhbmQgc28KKy8vIHRoaXMgaXMgYSBib3JpbmcgbW9kdWxlIHBhc3MsIGJ1dCBldmVudHVhbGx5IGl0IHNob3VsZCBiZSBhbiBSUE8gQ0dTQ0MgcGFzcworLy8gd2hlbiBzdWNoIGluZnJhc3RydWN0dXJlIGlzIGF2YWlsYWJsZS4KK2NsYXNzIFJldmVyc2VQb3N0T3JkZXJGdW5jdGlvbkF0dHJzUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48UmV2ZXJzZVBvc3RPcmRlckZ1bmN0aW9uQXR0cnNQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19JUE9fRlVOQ1RJT05BVFRSU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0Z1bmN0aW9uSW1wb3J0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0Z1bmN0aW9uSW1wb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZlZGRlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vRnVuY3Rpb25JbXBvcnQuaApAQCAtMCwwICsxLDE2MiBAQAorLy89PT0tIGxsdm0vVHJhbnNmb3Jtcy9JUE8vRnVuY3Rpb25JbXBvcnQuaCAtIFRoaW5MVE8gaW1wb3J0aW5nIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lQT19GVU5DVElPTklNUE9SVF9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JUE9fRlVOQ1RJT05JTVBPUlRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGVTdW1tYXJ5SW5kZXguaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZTsKKworLy8vIFRoZSBmdW5jdGlvbiBpbXBvcnRlciBpcyBhdXRvbWF0aWNhbGx5IGltcG9ydGluZyBmdW5jdGlvbiBmcm9tIG90aGVyIG1vZHVsZXMKKy8vLyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgc3VtbWFyeSBpbmZvcm1hdGlvbnMuCitjbGFzcyBGdW5jdGlvbkltcG9ydGVyIHsKK3B1YmxpYzoKKyAgLy8vIFNldCBvZiBmdW5jdGlvbnMgdG8gaW1wb3J0IGZyb20gYSBzb3VyY2UgbW9kdWxlLiBFYWNoIGVudHJ5IGlzIGEgbWFwCisgIC8vLyBjb250YWluaW5nIGFsbCB0aGUgZnVuY3Rpb25zIHRvIGltcG9ydCBmb3IgYSBzb3VyY2UgbW9kdWxlLgorICAvLy8gVGhlIGtleXMgaXMgdGhlIEdVSUQgaWRlbnRpZnlpbmcgYSBmdW5jdGlvbiB0byBpbXBvcnQsIGFuZCB0aGUgdmFsdWUKKyAgLy8vIGlzIHRoZSB0aHJlc2hvbGQgYXBwbGllZCB3aGVuIGRlY2lkaW5nIHRvIGltcG9ydCBpdC4KKyAgdXNpbmcgRnVuY3Rpb25zVG9JbXBvcnRUeSA9IHN0ZDo6bWFwPEdsb2JhbFZhbHVlOjpHVUlELCB1bnNpZ25lZD47CisKKyAgLy8vIFRoZSBtYXAgY29udGFpbnMgYW4gZW50cnkgZm9yIGV2ZXJ5IG1vZHVsZSB0byBpbXBvcnQgZnJvbSwgdGhlIGtleSBiZWluZworICAvLy8gdGhlIG1vZHVsZSBpZGVudGlmaWVyIHRvIHBhc3MgdG8gdGhlIE1vZHVsZUxvYWRlci4gVGhlIHZhbHVlIGlzIHRoZSBzZXQgb2YKKyAgLy8vIGZ1bmN0aW9ucyB0byBpbXBvcnQuCisgIHVzaW5nIEltcG9ydE1hcFR5ID0gU3RyaW5nTWFwPEZ1bmN0aW9uc1RvSW1wb3J0VHk+OworCisgIC8vLyBUaGUgc2V0IGNvbnRhaW5zIGFuIGVudHJ5IGZvciBldmVyeSBnbG9iYWwgdmFsdWUgdGhlIG1vZHVsZSBleHBvcnRzLgorICB1c2luZyBFeHBvcnRTZXRUeSA9IHN0ZDo6dW5vcmRlcmVkX3NldDxHbG9iYWxWYWx1ZTo6R1VJRD47CisKKyAgLy8vIEEgZnVuY3Rpb24gb2YgdGhpcyB0eXBlIGlzIHVzZWQgdG8gbG9hZCBtb2R1bGVzIHJlZmVyZW5jZWQgYnkgdGhlIGluZGV4LgorICB1c2luZyBNb2R1bGVMb2FkZXJUeSA9CisgICAgICBzdGQ6OmZ1bmN0aW9uPEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+PihTdHJpbmdSZWYgSWRlbnRpZmllcik+OworCisgIC8vLyBDcmVhdGUgYSBGdW5jdGlvbiBJbXBvcnRlci4KKyAgRnVuY3Rpb25JbXBvcnRlcihjb25zdCBNb2R1bGVTdW1tYXJ5SW5kZXggJkluZGV4LCBNb2R1bGVMb2FkZXJUeSBNb2R1bGVMb2FkZXIpCisgICAgICA6IEluZGV4KEluZGV4KSwgTW9kdWxlTG9hZGVyKHN0ZDo6bW92ZShNb2R1bGVMb2FkZXIpKSB7fQorCisgIC8vLyBJbXBvcnQgZnVuY3Rpb25zIGluIE1vZHVsZSBccCBNIGJhc2VkIG9uIHRoZSBzdXBwbGllZCBpbXBvcnQgbGlzdC4KKyAgRXhwZWN0ZWQ8Ym9vbD4gaW1wb3J0RnVuY3Rpb25zKE1vZHVsZSAmTSwgY29uc3QgSW1wb3J0TWFwVHkgJkltcG9ydExpc3QpOworCitwcml2YXRlOgorICAvLy8gVGhlIHN1bW1hcmllcyBpbmRleCB1c2VkIHRvIHRyaWdnZXIgaW1wb3J0aW5nLgorICBjb25zdCBNb2R1bGVTdW1tYXJ5SW5kZXggJkluZGV4OworCisgIC8vLyBGYWN0b3J5IGZ1bmN0aW9uIHRvIGxvYWQgYSBNb2R1bGUgZm9yIGEgZ2l2ZW4gaWRlbnRpZmllcgorICBNb2R1bGVMb2FkZXJUeSBNb2R1bGVMb2FkZXI7Cit9OworCisvLy8gVGhlIGZ1bmN0aW9uIGltcG9ydGluZyBwYXNzCitjbGFzcyBGdW5jdGlvbkltcG9ydFBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxGdW5jdGlvbkltcG9ydFBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gQ29tcHV0ZSBhbGwgdGhlIGltcG9ydHMgYW5kIGV4cG9ydHMgZm9yIGV2ZXJ5IG1vZHVsZSBpbiB0aGUgSW5kZXguCisvLy8KKy8vLyBccCBNb2R1bGVUb0RlZmluZWRHVlN1bW1hcmllcyBjb250YWlucyBmb3IgZWFjaCBNb2R1bGUgYSBtYXAKKy8vLyAoR1VJRCAtPiBTdW1tYXJ5KSBmb3IgZXZlcnkgZ2xvYmFsIGRlZmluZWQgaW4gdGhlIG1vZHVsZS4KKy8vLworLy8vIFxwIEltcG9ydExpc3RzIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYW4gZW50cnkgZm9yIGV2ZXJ5IE1vZHVsZSB3ZSBhcmUKKy8vLyBpbXBvcnRpbmcgaW50by4gVGhpcyBlbnRyeSBpcyBpdHNlbGYgYSBtYXAgdGhhdCBjYW4gYmUgcGFzc2VkIHRvCisvLy8gRnVuY3Rpb25JbXBvcnRlcjo6aW1wb3J0RnVuY3Rpb25zKCkgYWJvdmUgKHNlZSBkZXNjcmlwdGlvbiB0aGVyZSkuCisvLy8KKy8vLyBccCBFeHBvcnRMaXN0cyBjb250YWlucyBmb3IgZWFjaCBNb2R1bGUgdGhlIHNldCBvZiBnbG9iYWxzIChHVUlEKSB0aGF0IHdpbGwKKy8vLyBiZSBpbXBvcnRlZCBieSBhbm90aGVyIG1vZHVsZSwgb3IgcmVmZXJlbmNlZCBieSBzdWNoIGEgZnVuY3Rpb24uIEkuZS4gdGhpcworLy8vIGlzIHRoZSBzZXQgb2YgZ2xvYmFscyB0aGF0IG5lZWQgdG8gYmUgcHJvbW90ZWQvcmVuYW1lZCBhcHByb3ByaWF0ZWx5Lgordm9pZCBDb21wdXRlQ3Jvc3NNb2R1bGVJbXBvcnQoCisgICAgY29uc3QgTW9kdWxlU3VtbWFyeUluZGV4ICZJbmRleCwKKyAgICBjb25zdCBTdHJpbmdNYXA8R1ZTdW1tYXJ5TWFwVHk+ICZNb2R1bGVUb0RlZmluZWRHVlN1bW1hcmllcywKKyAgICBTdHJpbmdNYXA8RnVuY3Rpb25JbXBvcnRlcjo6SW1wb3J0TWFwVHk+ICZJbXBvcnRMaXN0cywKKyAgICBTdHJpbmdNYXA8RnVuY3Rpb25JbXBvcnRlcjo6RXhwb3J0U2V0VHk+ICZFeHBvcnRMaXN0cyk7CisKKy8vLyBDb21wdXRlIGFsbCB0aGUgaW1wb3J0cyBmb3IgdGhlIGdpdmVuIG1vZHVsZSB1c2luZyB0aGUgSW5kZXguCisvLy8KKy8vLyBccCBJbXBvcnRMaXN0IHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYSBtYXAgdGhhdCBjYW4gYmUgcGFzc2VkIHRvCisvLy8gRnVuY3Rpb25JbXBvcnRlcjo6aW1wb3J0RnVuY3Rpb25zKCkgYWJvdmUgKHNlZSBkZXNjcmlwdGlvbiB0aGVyZSkuCit2b2lkIENvbXB1dGVDcm9zc01vZHVsZUltcG9ydEZvck1vZHVsZSgKKyAgICBTdHJpbmdSZWYgTW9kdWxlUGF0aCwgY29uc3QgTW9kdWxlU3VtbWFyeUluZGV4ICZJbmRleCwKKyAgICBGdW5jdGlvbkltcG9ydGVyOjpJbXBvcnRNYXBUeSAmSW1wb3J0TGlzdCk7CisKKy8vLyBNYXJrIGFsbCBleHRlcm5hbCBzdW1tYXJpZXMgaW4gXHAgSW5kZXggZm9yIGltcG9ydCBpbnRvIHRoZSBnaXZlbiBtb2R1bGUuCisvLy8gVXNlZCBmb3IgZGlzdHJpYnV0ZWQgYnVpbGRzIHVzaW5nIGEgZGlzdHJpYnV0ZWQgaW5kZXguCisvLy8KKy8vLyBccCBJbXBvcnRMaXN0IHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYSBtYXAgdGhhdCBjYW4gYmUgcGFzc2VkIHRvCisvLy8gRnVuY3Rpb25JbXBvcnRlcjo6aW1wb3J0RnVuY3Rpb25zKCkgYWJvdmUgKHNlZSBkZXNjcmlwdGlvbiB0aGVyZSkuCit2b2lkIENvbXB1dGVDcm9zc01vZHVsZUltcG9ydEZvck1vZHVsZUZyb21JbmRleCgKKyAgICBTdHJpbmdSZWYgTW9kdWxlUGF0aCwgY29uc3QgTW9kdWxlU3VtbWFyeUluZGV4ICZJbmRleCwKKyAgICBGdW5jdGlvbkltcG9ydGVyOjpJbXBvcnRNYXBUeSAmSW1wb3J0TGlzdCk7CisKKy8vLyBQcmV2YWlsaW5nVHlwZSBlbnVtIHVzZWQgYXMgYSByZXR1cm4gdHlwZSBvZiBjYWxsYmFjayBwYXNzZWQKKy8vLyB0byBjb21wdXRlRGVhZFN5bWJvbHMuIFllcyBhbmQgTm8gdmFsdWVzIHVzZWQgd2hlbiBzdGF0dXMgZXhwbGljaXRseQorLy8vIHNldCBieSBzeW1ib2xzIHJlc29sdXRpb24sIG90aGVyd2lzZSBzdGF0dXMgaXMgVW5rbm93bi4KK2VudW0gY2xhc3MgUHJldmFpbGluZ1R5cGUgeyBZZXMsIE5vLCBVbmtub3duIH07CisKKy8vLyBDb21wdXRlIGFsbCB0aGUgc3ltYm9scyB0aGF0IGFyZSAiZGVhZCI6IGkuZSB0aGVzZSB0aGF0IGNhbid0IGJlIHJlYWNoZWQKKy8vLyBpbiB0aGUgZ3JhcGggZnJvbSBhbnkgb2YgdGhlIGdpdmVuIHN5bWJvbHMgbGlzdGVkIGluCisvLy8gXHAgR1VJRFByZXNlcnZlZFN5bWJvbHMuIE5vbi1wcmV2YWlsaW5nIHN5bWJvbHMgYXJlIHN5bWJvbHMgd2l0aG91dCBhCisvLy8gcHJldmFpbGluZyBjb3B5IGFueXdoZXJlIGluIElSIGFuZCBhcmUgbm9ybWFsbHkgZGVhZCwgXHAgaXNQcmV2YWlsaW5nCisvLy8gcHJlZGljYXRlIHJldHVybnMgc3RhdHVzIG9mIHN5bWJvbC4KK3ZvaWQgY29tcHV0ZURlYWRTeW1ib2xzKAorICAgIE1vZHVsZVN1bW1hcnlJbmRleCAmSW5kZXgsCisgICAgY29uc3QgRGVuc2VTZXQ8R2xvYmFsVmFsdWU6OkdVSUQ+ICZHVUlEUHJlc2VydmVkU3ltYm9scywKKyAgICBmdW5jdGlvbl9yZWY8UHJldmFpbGluZ1R5cGUoR2xvYmFsVmFsdWU6OkdVSUQpPiBpc1ByZXZhaWxpbmcpOworCisvLy8gQ29udmVydHMgdmFsdWUgXHAgR1YgdG8gZGVjbGFyYXRpb24sIG9yIHJlcGxhY2VzIHdpdGggYSBkZWNsYXJhdGlvbiBpZgorLy8vIGl0IGlzIGFuIGFsaWFzLiBSZXR1cm5zIHRydWUgaWYgY29udmVydGVkLCBmYWxzZSBpZiByZXBsYWNlZC4KK2Jvb2wgY29udmVydFRvRGVjbGFyYXRpb24oR2xvYmFsVmFsdWUgJkdWKTsKKworLy8vIENvbXB1dGUgdGhlIHNldCBvZiBzdW1tYXJpZXMgbmVlZGVkIGZvciBhIFRoaW5MVE8gYmFja2VuZCBjb21waWxhdGlvbiBvZgorLy8vIFxwIE1vZHVsZVBhdGguCisvLworLy8vIFRoaXMgaW5jbHVkZXMgc3VtbWFyaWVzIGZyb20gdGhhdCBtb2R1bGUgKGluIGNhc2UgYW55IGdsb2JhbCBzdW1tYXJ5IGJhc2VkCisvLy8gb3B0aW1pemF0aW9ucyB3ZXJlIHJlY29yZGVkKSBhbmQgZnJvbSBhbnkgZGVmaW5pdGlvbnMgaW4gb3RoZXIgbW9kdWxlcyB0aGF0CisvLy8gc2hvdWxkIGJlIGltcG9ydGVkLgorLy8KKy8vLyBccCBNb2R1bGVUb1N1bW1hcmllc0ZvckluZGV4IHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggdGhlIG5lZWRlZCBzdW1tYXJpZXMKKy8vLyBmcm9tIGVhY2ggcmVxdWlyZWQgbW9kdWxlIHBhdGguIFVzZSBhIHN0ZDo6bWFwIGluc3RlYWQgb2YgU3RyaW5nTWFwIHRvIGdldAorLy8vIHN0YWJsZSBvcmRlciBmb3IgYml0Y29kZSBlbWlzc2lvbi4KK3ZvaWQgZ2F0aGVySW1wb3J0ZWRTdW1tYXJpZXNGb3JNb2R1bGUoCisgICAgU3RyaW5nUmVmIE1vZHVsZVBhdGgsCisgICAgY29uc3QgU3RyaW5nTWFwPEdWU3VtbWFyeU1hcFR5PiAmTW9kdWxlVG9EZWZpbmVkR1ZTdW1tYXJpZXMsCisgICAgY29uc3QgRnVuY3Rpb25JbXBvcnRlcjo6SW1wb3J0TWFwVHkgJkltcG9ydExpc3QsCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEdWU3VtbWFyeU1hcFR5PiAmTW9kdWxlVG9TdW1tYXJpZXNGb3JJbmRleCk7CisKKy8vLyBFbWl0IGludG8gXHAgT3V0cHV0RmlsZW5hbWUgdGhlIGZpbGVzIG1vZHVsZSBccCBNb2R1bGVQYXRoIHdpbGwgaW1wb3J0IGZyb20uCitzdGQ6OmVycm9yX2NvZGUKK0VtaXRJbXBvcnRzRmlsZXMoU3RyaW5nUmVmIE1vZHVsZVBhdGgsIFN0cmluZ1JlZiBPdXRwdXRGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25JbXBvcnRlcjo6SW1wb3J0TWFwVHkgJk1vZHVsZUltcG9ydHMpOworCisvLy8gUmVzb2x2ZSBXZWFrRm9yTGlua2VyIHZhbHVlcyBpbiBccCBUaGVNb2R1bGUgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uCisvLy8gcmVjb3JkZWQgaW4gdGhlIHN1bW1hcmllcyBkdXJpbmcgZ2xvYmFsIHN1bW1hcnktYmFzZWQgYW5hbHlzaXMuCit2b2lkIHRoaW5MVE9SZXNvbHZlV2Vha0Zvckxpbmtlck1vZHVsZShNb2R1bGUgJlRoZU1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWU3VtbWFyeU1hcFR5ICZEZWZpbmVkR2xvYmFscyk7CisKKy8vLyBJbnRlcm5hbGl6ZSBccCBUaGVNb2R1bGUgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIHJlY29yZGVkIGluIHRoZSBzdW1tYXJpZXMKKy8vLyBkdXJpbmcgZ2xvYmFsIHN1bW1hcnktYmFzZWQgYW5hbHlzaXMuCit2b2lkIHRoaW5MVE9JbnRlcm5hbGl6ZU1vZHVsZShNb2R1bGUgJlRoZU1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWU3VtbWFyeU1hcFR5ICZEZWZpbmVkR2xvYmFscyk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfSVBPX0ZVTkNUSU9OSU1QT1JUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vR2xvYmFsRENFLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0dsb2JhbERDRS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYTI0MWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0dsb2JhbERDRS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8vPT09LS0gR2xvYmFsRENFLmggLSBEQ0UgdW5yZWFjaGFibGUgaW50ZXJuYWwgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyB0cmFuc2Zvcm0gaXMgZGVzaWduZWQgdG8gZWxpbWluYXRlIHVucmVhY2hhYmxlIGludGVybmFsIGdsb2JhbHMgZnJvbSB0aGUKKy8vIHByb2dyYW0uICBJdCB1c2VzIGFuIGFnZ3Jlc3NpdmUgYWxnb3JpdGhtLCBzZWFyY2hpbmcgb3V0IGdsb2JhbHMgdGhhdCBhcmUKKy8vIGtub3duIHRvIGJlIGFsaXZlLiAgQWZ0ZXIgaXQgZmluZHMgYWxsIG9mIHRoZSBnbG9iYWxzIHdoaWNoIGFyZSBuZWVkZWQsIGl0CisvLyBkZWxldGVzIHdoYXRldmVyIGlzIGxlZnQgb3Zlci4gIFRoaXMgYWxsb3dzIGl0IHRvIGRlbGV0ZSByZWN1cnNpdmUgY2h1bmtzIG9mCisvLyB0aGUgcHJvZ3JhbSB3aGljaCBhcmUgdW5yZWFjaGFibGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0dMT0JBTERDRV9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JUE9fR0xPQkFMRENFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBQYXNzIHRvIHJlbW92ZSB1bnVzZWQgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgorY2xhc3MgR2xvYmFsRENFUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPEdsb2JhbERDRVBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICYpOworCitwcml2YXRlOgorICBTbWFsbFB0clNldDxHbG9iYWxWYWx1ZSosIDMyPiBBbGl2ZUdsb2JhbHM7CisKKyAgLy8vIEdsb2JhbCAtPiBHbG9iYWwgdGhhdCB1c2VzIHRoaXMgZ2xvYmFsLgorICBEZW5zZU1hcDxHbG9iYWxWYWx1ZSAqLCBTbWFsbFB0clNldDxHbG9iYWxWYWx1ZSAqLCA0Pj4gR1ZEZXBlbmRlbmNpZXM7CisKKyAgLy8vIENvbnN0YW50IC0+IEdsb2JhbHMgdGhhdCB1c2UgdGhpcyBnbG9iYWwgY2FjaGUuCisgIHN0ZDo6dW5vcmRlcmVkX21hcDxDb25zdGFudCAqLCBTbWFsbFB0clNldDxHbG9iYWxWYWx1ZSAqLCA4Pj4KKyAgICAgIENvbnN0YW50RGVwZW5kZW5jaWVzQ2FjaGU7CisKKyAgLy8vIENvbWRhdCAtPiBHbG9iYWxzIGluIHRoYXQgQ29tZGF0IHNlY3Rpb24uCisgIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwPENvbWRhdCAqLCBHbG9iYWxWYWx1ZSAqPiBDb21kYXRNZW1iZXJzOworCisgIHZvaWQgVXBkYXRlR1ZEZXBlbmRlbmNpZXMoR2xvYmFsVmFsdWUgJkdWKTsKKyAgdm9pZCBNYXJrTGl2ZShHbG9iYWxWYWx1ZSAmR1YsCisgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEdsb2JhbFZhbHVlICo+ICpVcGRhdGVzID0gbnVsbHB0cik7CisgIGJvb2wgUmVtb3ZlVW51c2VkR2xvYmFsVmFsdWUoR2xvYmFsVmFsdWUgJkdWKTsKKworICB2b2lkIENvbXB1dGVEZXBlbmRlbmNpZXMoVmFsdWUgKlYsIFNtYWxsUHRyU2V0SW1wbDxHbG9iYWxWYWx1ZSAqPiAmVSk7Cit9OworCit9CisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfSVBPX0dMT0JBTERDRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0dsb2JhbE9wdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9HbG9iYWxPcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjQ4Nzg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9HbG9iYWxPcHQuaApAQCAtMCwwICsxLDMzIEBACisvLz09PS0gR2xvYmFsT3B0LmggLSBPcHRpbWl6ZSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyB0cmFuc2Zvcm1zIHNpbXBsZSBnbG9iYWwgdmFyaWFibGVzIHRoYXQgbmV2ZXIgaGF2ZSB0aGVpciBhZGRyZXNzCisvLyB0YWtlbi4gIElmIG9idmlvdXNseSB0cnVlLCBpdCBtYXJrcyByZWFkL3dyaXRlIGdsb2JhbHMgYXMgY29uc3RhbnQsIGRlbGV0ZXMKKy8vIHZhcmlhYmxlcyBvbmx5IHN0b3JlZCB0bywgZXRjLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lQT19HTE9CQUxPUFRfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfSVBPX0dMT0JBTE9QVF9ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTW9kdWxlOworCisvLy8gT3B0aW1pemUgZ2xvYmFscyB0aGF0IG5ldmVyIGhhdmUgdGhlaXIgYWRkcmVzcyB0YWtlbi4KK2NsYXNzIEdsb2JhbE9wdFBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxHbG9iYWxPcHRQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19JUE9fR0xPQkFMT1BUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vR2xvYmFsU3BsaXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vR2xvYmFsU3BsaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmNlZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9HbG9iYWxTcGxpdC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vPT09LSBHbG9iYWxTcGxpdC5oIC0gZ2xvYmFsIHZhcmlhYmxlIHNwbGl0dGVyIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIHVzZXMgaW5yYW5nZSBhbm5vdGF0aW9ucyBvbiBHRVAgaW5kaWNlcyB0byBzcGxpdCBnbG9iYWxzIHdoZXJlCisvLyBiZW5lZmljaWFsLiBDbGFuZyBjdXJyZW50bHkgYXR0YWNoZXMgdGhlc2UgYW5ub3RhdGlvbnMgdG8gcmVmZXJlbmNlcyB0bworLy8gdmlydHVhbCB0YWJsZSBnbG9iYWxzIHVuZGVyIHRoZSBJdGFuaXVtIEFCSSBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlCisvLyB3aG9sZS1wcm9ncmFtIHZpcnR1YWwgY2FsbCBvcHRpbWl6YXRpb24gYW5kIGNvbnRyb2wgZmxvdyBpbnRlZ3JpdHkgcGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lQT19HTE9CQUxTUExJVF9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JUE9fR0xPQkFMU1BMSVRfSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZTsKKworLy8vIFBhc3MgdG8gcGVyZm9ybSBzcGxpdCBvZiBnbG9iYWwgdmFyaWFibGVzLgorY2xhc3MgR2xvYmFsU3BsaXRQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48R2xvYmFsU3BsaXRQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19JUE9fR0xPQkFMU1BMSVRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9JbmZlckZ1bmN0aW9uQXR0cnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vSW5mZXJGdW5jdGlvbkF0dHJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRlMWMyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vSW5mZXJGdW5jdGlvbkF0dHJzLmgKQEAgLTAsMCArMSwzNiBAQAorLy89PT0tLSBJbmZlckZ1bmN0aW9uQXR0cnMuaCAtIEluZmVyIGltcGxpY2l0IGZ1bmN0aW9uIGF0dHJpYnV0ZXMgLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gSW50ZXJmYWNlcyBmb3IgcGFzc2VzIHdoaWNoIGluZmVyIGltcGxpY2l0IGZ1bmN0aW9uIGF0dHJpYnV0ZXMgZnJvbSB0aGUKKy8vLyBuYW1lIGFuZCBzaWduYXR1cmUgb2YgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JUE9fSU5GRVJGVU5DVElPTkFUVFJTX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19JTkZFUkZVTkNUSU9OQVRUUlNfSAorCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEEgcGFzcyB3aGljaCBpbmZlcnMgZnVuY3Rpb24gYXR0cmlidXRlcyBmcm9tIHRoZSBuYW1lcyBhbmQgc2lnbmF0dXJlcyBvZgorLy8vIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBpbiBhIG1vZHVsZS4KK3N0cnVjdCBJbmZlckZ1bmN0aW9uQXR0cnNQYXNzIDogUGFzc0luZm9NaXhpbjxJbmZlckZ1bmN0aW9uQXR0cnNQYXNzPiB7CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIENyZWF0ZSBhIGxlZ2FjeSBwYXNzIG1hbmFnZXIgaW5zdGFuY2Ugb2YgYSBwYXNzIHRvIGluZmVyIGZ1bmN0aW9uCisvLy8gYXR0cmlidXRlcy4KK1Bhc3MgKmNyZWF0ZUluZmVyRnVuY3Rpb25BdHRyc0xlZ2FjeVBhc3MoKTsKKworfQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lQT19JTkZFUkZVTkNUSU9OQVRUUlNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9JbmxpbmVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0lubGluZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGE4Y2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9JbmxpbmVyLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8vPT09LSBJbmxpbmVyLmggLSBJbmxpbmVyIHBhc3MgYW5kIGluZnJhc3RydWN0dXJlIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lQT19JTkxJTkVSX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19JTkxJTkVSX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ0dTQ0NQYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoU0NDUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvSW5saW5lQ29zdC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTGF6eUNhbGxHcmFwaC5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0ltcG9ydGVkRnVuY3Rpb25zSW5saW5pbmdTdGF0aXN0aWNzLmgiCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc3N1bXB0aW9uQ2FjaGVUcmFja2VyOworY2xhc3MgQ2FsbEdyYXBoOworY2xhc3MgUHJvZmlsZVN1bW1hcnlJbmZvOworCisvLy8gVGhpcyBjbGFzcyBjb250YWlucyBhbGwgb2YgdGhlIGhlbHBlciBjb2RlIHdoaWNoIGlzIHVzZWQgdG8gcGVyZm9ybSB0aGUKKy8vLyBpbmxpbmluZyBvcGVyYXRpb25zIHRoYXQgZG8gbm90IGRlcGVuZCBvbiB0aGUgcG9saWN5LiBJdCBjb250YWlucyB0aGUgY29yZQorLy8vIGJvdHRvbS11cCBpbmxpbmluZyBpbmZyYXN0cnVjdHVyZSB0aGF0IHNwZWNpZmljIGlubGluZXIgcGFzc2VzIHVzZS4KK3N0cnVjdCBMZWdhY3lJbmxpbmVyQmFzZSA6IHB1YmxpYyBDYWxsR3JhcGhTQ0NQYXNzIHsKKyAgZXhwbGljaXQgTGVnYWN5SW5saW5lckJhc2UoY2hhciAmSUQpOworICBleHBsaWNpdCBMZWdhY3lJbmxpbmVyQmFzZShjaGFyICZJRCwgYm9vbCBJbnNlcnRMaWZldGltZSk7CisKKyAgLy8vIEZvciB0aGlzIGNsYXNzLCB3ZSBkZWNsYXJlIHRoYXQgd2UgcmVxdWlyZSBhbmQgcHJlc2VydmUgdGhlIGNhbGwgZ3JhcGguCisgIC8vLyBJZiB0aGUgZGVyaXZlZCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kLCBpdCBzaG91bGQgYWx3YXlzIGV4cGxpY2l0bHkKKyAgLy8vIGNhbGwgdGhlIGltcGxlbWVudGF0aW9uIGhlcmUuCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZJbmZvKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIGRvSW5pdGlhbGl6YXRpb24oQ2FsbEdyYXBoICZDRykgb3ZlcnJpZGU7CisKKyAgLy8vIE1haW4gcnVuIGludGVyZmFjZSBtZXRob2QsIHRoaXMgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIHJlcXVpcmVkIGJ5IHRoZQorICAvLy8gUGFzcyBjbGFzcy4KKyAgYm9vbCBydW5PblNDQyhDYWxsR3JhcGhTQ0MgJlNDQykgb3ZlcnJpZGU7CisKKyAgdXNpbmcgbGx2bTo6UGFzczo6ZG9GaW5hbGl6YXRpb247CisKKyAgLy8vIFJlbW92ZSBub3ctZGVhZCBsaW5rb25jZSBmdW5jdGlvbnMgYXQgdGhlIGVuZCBvZiBwcm9jZXNzaW5nIHRvIGF2b2lkCisgIC8vLyBicmVha2luZyB0aGUgU0NDIHRyYXZlcnNhbC4KKyAgYm9vbCBkb0ZpbmFsaXphdGlvbihDYWxsR3JhcGggJkNHKSBvdmVycmlkZTsKKworICAvLy8gVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgc3ViY2xhc3MgdG8gZGV0ZXJtaW5lIHRoZSBjb3N0IG9mCisgIC8vLyBpbmxpbmluZyB0aGUgc3BlY2lmaWVkIGNhbGwgc2l0ZS4gIElmIHRoZSBjb3N0IHJldHVybmVkIGlzIGdyZWF0ZXIgdGhhbgorICAvLy8gdGhlIGN1cnJlbnQgaW5saW5lIHRocmVzaG9sZCwgdGhlIGNhbGwgc2l0ZSBpcyBub3QgaW5saW5lZC4KKyAgdmlydHVhbCBJbmxpbmVDb3N0IGdldElubGluZUNvc3QoQ2FsbFNpdGUgQ1MpID0gMDsKKworICAvLy8gUmVtb3ZlIGRlYWQgZnVuY3Rpb25zLgorICAvLy8KKyAgLy8vIFRoaXMgYWxzbyBpbmNsdWRlcyBhIGhhY2sgaW4gdGhlIGZvcm0gb2YgdGhlICdBbHdheXNJbmxpbmVPbmx5JyBmbGFnCisgIC8vLyB3aGljaCByZXN0cmljdHMgaXQgdG8gZGVsZXRpbmcgZnVuY3Rpb25zIHdpdGggYW4gJ0Fsd2F5c0lubGluZScKKyAgLy8vIGF0dHJpYnV0ZS4gVGhpcyBpcyB1c2VmdWwgZm9yIHRoZSBJbmxpbmVBbHdheXMgcGFzcyB0aGF0IG9ubHkgd2FudHMgdG8KKyAgLy8vIGRlYWwgd2l0aCB0aGF0IHN1YnNldCBvZiB0aGUgZnVuY3Rpb25zLgorICBib29sIHJlbW92ZURlYWRGdW5jdGlvbnMoQ2FsbEdyYXBoICZDRywgYm9vbCBBbHdheXNJbmxpbmVPbmx5ID0gZmFsc2UpOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBtYWluIHdvcmsgb2YgdGhlIHBhc3MuICBUaGUgZGVmYXVsdCBvZgorICAvLy8gSW5saW50ZXI6OnJ1bk9uU0NDKCkgY2FsbHMgc2tpcFNDQygpIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLCBidXQKKyAgLy8vIGRlcml2ZWQgY2xhc3NlcyB3aGljaCBjYW5ub3QgYmUgc2tpcHBlZCBjYW4gb3ZlcnJpZGUgdGhhdCBtZXRob2QgYW5kIGNhbGwKKyAgLy8vIHRoaXMgZnVuY3Rpb24gdW5jb25kaXRpb25hbGx5LgorICBib29sIGlubGluZUNhbGxzKENhbGxHcmFwaFNDQyAmU0NDKTsKKworcHJpdmF0ZToKKyAgLy8gSW5zZXJ0IEBsbHZtLmxpZmV0aW1lIGludHJpbnNpY3MuCisgIGJvb2wgSW5zZXJ0TGlmZXRpbWUgPSB0cnVlOworCitwcm90ZWN0ZWQ6CisgIEFzc3VtcHRpb25DYWNoZVRyYWNrZXIgKkFDVDsKKyAgUHJvZmlsZVN1bW1hcnlJbmZvICpQU0k7CisgIEltcG9ydGVkRnVuY3Rpb25zSW5saW5pbmdTdGF0aXN0aWNzIEltcG9ydGVkRnVuY3Rpb25zU3RhdHM7Cit9OworCisvLy8gVGhlIGlubGluZXIgcGFzcyBmb3IgdGhlIG5ldyBwYXNzIG1hbmFnZXIuCisvLy8KKy8vLyBUaGlzIHBhc3Mgd2lyZXMgdG9nZXRoZXIgdGhlIGlubGluaW5nIHV0aWxpdGllcyBhbmQgdGhlIGlubGluZSBjb3N0CisvLy8gYW5hbHlzaXMgaW50byBhIENHU0NDIHBhc3MuIEl0IGNvbnNpZGVycyBldmVyeSBjYWxsIGluIGV2ZXJ5IGZ1bmN0aW9uIGluCisvLy8gdGhlIFNDQyBhbmQgdHJpZXMgdG8gaW5saW5lIGlmIHByb2ZpdGFibGUuIEl0IGNhbiBiZSB0dW5lZCB3aXRoIGEgbnVtYmVyIG9mCisvLy8gcGFyYW1ldGVycyB0byBjb250cm9sIHdoYXQgY29zdCBtb2RlbCBpcyB1c2VkIGFuZCB3aGF0IHRyYWRlb2ZmcyBhcmUgbWFkZQorLy8vIHdoZW4gbWFraW5nIHRoZSBkZWNpc2lvbi4KKy8vLworLy8vIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZSBsZWdhY3kgaW5saW5lcnMgZG8gY29uc2lkZXJhYmx5IG1vcmUgdGhhbiB0aGlzCisvLy8gaW5saW5lciBwYXNzIGRvZXMuIFRoZXkgcHJvdmlkZSBsb2dpYyBmb3IgbWFudWFsbHkgbWVyZ2luZyBhbGxvY2FzLCBhbmQKKy8vLyBkb2luZyBjb25zaWRlcmFibGUgRENFIGluY2x1ZGluZyB0aGUgRENFIG9mIGRlYWQgZnVuY3Rpb25zLiBUaGlzIHBhc3MgbWFrZXMKKy8vLyBldmVyeSBhdHRlbXB0IHRvIGJlIHNpbXBsZXIuIERDRSBvZiBmdW5jdGlvbnMgcmVxdWlyZXMgY29tcGxleCByZWFzb25pbmcKKy8vLyBhYm91dCBjb21kYXQgZ3JvdXBzLCBldGMuIEluc3RlYWQsIGl0IGlzIGV4cGVjdGVkIHRoYXQgb3RoZXIgbW9yZSBmb2N1c2VkCisvLy8gcGFzc2VzIGJlIGNvbXBvc2VkIHRvIGFjaGlldmUgdGhlIHNhbWUgZW5kIHJlc3VsdC4KK2NsYXNzIElubGluZXJQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48SW5saW5lclBhc3M+IHsKK3B1YmxpYzoKKyAgSW5saW5lclBhc3MoSW5saW5lUGFyYW1zIFBhcmFtcyA9IGdldElubGluZVBhcmFtcygpKQorICAgICAgOiBQYXJhbXMoc3RkOjptb3ZlKFBhcmFtcykpIHt9CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKExhenlDYWxsR3JhcGg6OlNDQyAmQywgQ0dTQ0NBbmFseXNpc01hbmFnZXIgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgTGF6eUNhbGxHcmFwaCAmQ0csIENHU0NDVXBkYXRlUmVzdWx0ICZVUik7CisKK3ByaXZhdGU6CisgIElubGluZVBhcmFtcyBQYXJhbXM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lQT19JTkxJTkVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vSW50ZXJuYWxpemUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vSW50ZXJuYWxpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWQ2NzZkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9JbnRlcm5hbGl6ZS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8vPT09PS0gSW50ZXJuYWxpemUuaCAtIEludGVybmFsaXphdGlvbiBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBsb29wcyBvdmVyIGFsbCBvZiB0aGUgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgaW4gdGhlIGlucHV0IG1vZHVsZS4KKy8vIElmIHRoZSBmdW5jdGlvbiBvciB2YXJpYWJsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHByZXNlcnZlZCBhY2NvcmRpbmcgdG8gdGhlCisvLyBjbGllbnQgc3VwcGxpZWQgY2FsbGJhY2ssIGl0IGlzIG1hcmtlZCBhcyBpbnRlcm5hbC4KKy8vCisvLyBUaGlzIHRyYW5zZm9ybWF0aW9uIHdvdWxkIG5vdCBiZSBsZWdhbCBpbiBhIHJlZ3VsYXIgY29tcGlsYXRpb24sIGJ1dCBpdCBnZXRzCisvLyBleHRyYSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBsaW5rZXIgYWJvdXQgd2hhdCBpcyBzYWZlLgorLy8KKy8vIEZvciBleGFtcGxlOiBJbnRlcm5hbGl6aW5nIGEgZnVuY3Rpb24gd2l0aCBleHRlcm5hbCBsaW5rYWdlLiBPbmx5IGlmIHdlIGFyZQorLy8gdG9sZCBpdCBpcyBvbmx5IHVzZWQgZnJvbSB3aXRoaW4gdGhpcyBtb2R1bGUsIGl0IGlzIHNhZmUgdG8gZG8gaXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0lOVEVSTkFMSVpFX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19JTlRFUk5BTElaRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBDYWxsR3JhcGg7CisKKy8vLyBBIHBhc3MgdGhhdCBpbnRlcm5hbGl6ZXMgYWxsIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIG90aGVyIHRoYW4gdGhvc2UgdGhhdAorLy8vIG11c3QgYmUgcHJlc2VydmVkIGFjY29yZGluZyB0byBcYyBNdXN0UHJlc2VydmVHVi4KK2NsYXNzIEludGVybmFsaXplUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPEludGVybmFsaXplUGFzcz4geworICAvLy8gQ2xpZW50IHN1cHBsaWVkIGNhbGxiYWNrIHRvIGNvbnRyb2wgd2hldGVyIGEgc3ltYm9sIG11c3QgYmUgcHJlc2VydmVkLgorICBjb25zdCBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgR2xvYmFsVmFsdWUgJik+IE11c3RQcmVzZXJ2ZUdWOworICAvLy8gU2V0IG9mIHN5bWJvbHMgcHJpdmF0ZSB0byB0aGUgY29tcGlsZXIgdGhhdCB0aGlzIHBhc3Mgc2hvdWxkIG5vdCB0b3VjaC4KKyAgU3RyaW5nU2V0PD4gQWx3YXlzUHJlc2VydmVkOworCisgIC8vLyBSZXR1cm4gZmFsc2UgaWYgd2UncmUgYWxsb3dlZCB0byBpbnRlcm5hbGl6ZSB0aGlzIEdWLgorICBib29sIHNob3VsZFByZXNlcnZlR1YoY29uc3QgR2xvYmFsVmFsdWUgJkdWKTsKKyAgLy8vIEludGVybmFsaXplIEdWIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGRvIHNvLCBpLmUuIGl0IGlzIG5vdCBleHRlcm5hbGx5CisgIC8vLyB2aXNpYmxlIGFuZCBpcyBub3QgYSBtZW1iZXIgb2YgYW4gZXh0ZXJuYWxseSB2aXNpYmxlIGNvbWRhdC4KKyAgYm9vbCBtYXliZUludGVybmFsaXplKEdsb2JhbFZhbHVlICZHViwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PGNvbnN0IENvbWRhdCAqPiAmRXh0ZXJuYWxDb21kYXRzKTsKKyAgLy8vIElmIEdWIGlzIHBhcnQgb2YgYSBjb21kYXQgYW5kIGlzIGV4dGVybmFsbHkgdmlzaWJsZSwga2VlcCB0cmFjayBvZiBpdHMKKyAgLy8vIGNvbWRhdCBzbyB0aGF0IHdlIGRvbid0IGludGVybmFsaXplIGFueSBvZiBpdHMgbWVtYmVycy4KKyAgdm9pZCBjaGVja0NvbWRhdFZpc2liaWxpdHkoR2xvYmFsVmFsdWUgJkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxjb25zdCBDb21kYXQgKj4gJkV4dGVybmFsQ29tZGF0cyk7CisKK3B1YmxpYzoKKyAgSW50ZXJuYWxpemVQYXNzKCk7CisgIEludGVybmFsaXplUGFzcyhzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgR2xvYmFsVmFsdWUgJik+IE11c3RQcmVzZXJ2ZUdWKQorICAgICAgOiBNdXN0UHJlc2VydmVHVihzdGQ6Om1vdmUoTXVzdFByZXNlcnZlR1YpKSB7fQorCisgIC8vLyBSdW4gdGhlIGludGVybmFsaXplciBvbiBccCBUaGVNb2R1bGUsIHJldHVybnMgdHJ1ZSBpZiBhbnkgY2hhbmdlcyB3YXMKKyAgLy8vIG1hZGUuCisgIC8vLworICAvLy8gSWYgdGhlIENhbGxHcmFwaCBccCBDRyBpcyBzdXBwbGllZCwgaXQgd2lsbCBiZSB1cGRhdGVkIHdoZW4KKyAgLy8vIGludGVybmFsaXppbmcgYSBmdW5jdGlvbiAoYnkgcmVtb3ZpbmcgYW55IGVkZ2UgZnJvbSB0aGUgImV4dGVybmFsIG5vZGUiKQorICBib29sIGludGVybmFsaXplTW9kdWxlKE1vZHVsZSAmVGhlTW9kdWxlLCBDYWxsR3JhcGggKkNHID0gbnVsbHB0cik7CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGludGVybmFsaXplIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGluIGEgTW9kdWxlLgoraW5saW5lIGJvb2wKK2ludGVybmFsaXplTW9kdWxlKE1vZHVsZSAmVGhlTW9kdWxlLAorICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IEdsb2JhbFZhbHVlICYpPiBNdXN0UHJlc2VydmVHViwKKyAgICAgICAgICAgICAgICAgIENhbGxHcmFwaCAqQ0cgPSBudWxscHRyKSB7CisgIHJldHVybiBJbnRlcm5hbGl6ZVBhc3Moc3RkOjptb3ZlKE11c3RQcmVzZXJ2ZUdWKSkKKyAgICAgIC5pbnRlcm5hbGl6ZU1vZHVsZShUaGVNb2R1bGUsIENHKTsKK30KK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfSVBPX0lOVEVSTkFMSVpFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vTG93ZXJUeXBlVGVzdHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vTG93ZXJUeXBlVGVzdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmNmZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9Mb3dlclR5cGVUZXN0cy5oCkBAIC0wLDAgKzEsMjA1IEBACisvLz09PS0gTG93ZXJUeXBlVGVzdHMuaCAtIHR5cGUgbWV0YWRhdGEgbG93ZXJpbmcgcGFzcyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHBhcnRzIG9mIHRoZSB0eXBlIHRlc3QgbG93ZXJpbmcgcGFzcyBpbXBsZW1lbnRhdGlvbiB0aGF0CisvLyBtYXkgYmUgdXNlZnVsbHkgdW5pdCB0ZXN0ZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0xPV0VSVFlQRVRFU1RTX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19MT1dFUlRZUEVURVNUU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTW9kdWxlOworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBsb3dlcnR5cGV0ZXN0cyB7CisKK3N0cnVjdCBCaXRTZXRJbmZvIHsKKyAgLy8gVGhlIGluZGljZXMgb2YgdGhlIHNldCBiaXRzIGluIHRoZSBiaXRzZXQuCisgIHN0ZDo6c2V0PHVpbnQ2NF90PiBCaXRzOworCisgIC8vIFRoZSBieXRlIG9mZnNldCBpbnRvIHRoZSBjb21iaW5lZCBnbG9iYWwgcmVwcmVzZW50ZWQgYnkgdGhlIGJpdHNldC4KKyAgdWludDY0X3QgQnl0ZU9mZnNldDsKKworICAvLyBUaGUgc2l6ZSBvZiB0aGUgYml0c2V0IGluIGJpdHMuCisgIHVpbnQ2NF90IEJpdFNpemU7CisKKyAgLy8gTG9nMiBhbGlnbm1lbnQgb2YgdGhlIGJpdCBzZXQgcmVsYXRpdmUgdG8gdGhlIGNvbWJpbmVkIGdsb2JhbC4KKyAgLy8gRm9yIGV4YW1wbGUsIGEgbG9nMiBhbGlnbm1lbnQgb2YgMyBtZWFucyB0aGF0IGJpdHMgaW4gdGhlIGJpdHNldAorICAvLyByZXByZXNlbnQgYWRkcmVzc2VzIDggYnl0ZXMgYXBhcnQuCisgIHVuc2lnbmVkIEFsaWduTG9nMjsKKworICBib29sIGlzU2luZ2xlT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBCaXRzLnNpemUoKSA9PSAxOworICB9CisKKyAgYm9vbCBpc0FsbE9uZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEJpdHMuc2l6ZSgpID09IEJpdFNpemU7CisgIH0KKworICBib29sIGNvbnRhaW5zR2xvYmFsT2Zmc2V0KHVpbnQ2NF90IE9mZnNldCkgY29uc3Q7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworfTsKKworc3RydWN0IEJpdFNldEJ1aWxkZXIgeworICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgMTY+IE9mZnNldHM7CisgIHVpbnQ2NF90IE1pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKTsKKyAgdWludDY0X3QgTWF4ID0gMDsKKworICBCaXRTZXRCdWlsZGVyKCkgPSBkZWZhdWx0OworCisgIHZvaWQgYWRkT2Zmc2V0KHVpbnQ2NF90IE9mZnNldCkgeworICAgIGlmIChNaW4gPiBPZmZzZXQpCisgICAgICBNaW4gPSBPZmZzZXQ7CisgICAgaWYgKE1heCA8IE9mZnNldCkKKyAgICAgIE1heCA9IE9mZnNldDsKKworICAgIE9mZnNldHMucHVzaF9iYWNrKE9mZnNldCk7CisgIH0KKworICBCaXRTZXRJbmZvIGJ1aWxkKCk7Cit9OworCisvLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgbGF5b3V0IGFsZ29yaXRobSBmb3IgZ2xvYmFscyByZWZlcmVuY2VkIGJ5IGJpdCBzZXRzCisvLy8gdGhhdCB0cmllcyB0byBrZWVwIG1lbWJlcnMgb2Ygc21hbGwgYml0IHNldHMgdG9nZXRoZXIuIFRoaXMgY2FuCisvLy8gc2lnbmlmaWNhbnRseSByZWR1Y2UgYml0IHNldCBzaXplcyBpbiBtYW55IGNhc2VzLgorLy8vCisvLy8gSXQgd29ya3MgYnkgYXNzZW1ibGluZyBmcmFnbWVudHMgb2YgbGF5b3V0IGZyb20gc2V0cyBvZiByZWZlcmVuY2VkIGdsb2JhbHMuCisvLy8gRWFjaCBzZXQgb2YgcmVmZXJlbmNlZCBnbG9iYWxzIGNhdXNlcyB0aGUgYWxnb3JpdGhtIHRvIGNyZWF0ZSBhIG5ldworLy8vIGZyYWdtZW50LCB3aGljaCBpcyBhc3NlbWJsZWQgYnkgYXBwZW5kaW5nIGVhY2ggcmVmZXJlbmNlZCBnbG9iYWwgaW4gdGhlIHNldAorLy8vIGludG8gdGhlIGZyYWdtZW50LiBJZiBhIHJlZmVyZW5jZWQgZ2xvYmFsIGhhcyBhbHJlYWR5IGJlZW4gcmVmZXJlbmNlZCBieSBhbgorLy8vIGZyYWdtZW50IGNyZWF0ZWQgZWFybGllciwgd2UgaW5zdGVhZCBkZWxldGUgdGhhdCBmcmFnbWVudCBhbmQgYXBwZW5kIGl0cworLy8vIGNvbnRlbnRzIGludG8gdGhlIGZyYWdtZW50IHdlIGFyZSBhc3NlbWJsaW5nLgorLy8vCisvLy8gQnkgc3RhcnRpbmcgd2l0aCB0aGUgc21hbGxlc3QgZnJhZ21lbnRzLCB3ZSBtaW5pbWl6ZSB0aGUgc2l6ZSBvZiB0aGUKKy8vLyBmcmFnbWVudHMgdGhhdCBhcmUgY29waWVkIGludG8gbGFyZ2VyIGZyYWdtZW50cy4gVGhpcyBpcyBtb3N0IGludHVpdGl2ZWx5CisvLy8gdGhvdWdodCBhYm91dCB3aGVuIGNvbnNpZGVyaW5nIHRoZSBjYXNlIHdoZXJlIHRoZSBnbG9iYWxzIGFyZSB2aXJ0dWFsIHRhYmxlcworLy8vIGFuZCB0aGUgYml0IHNldHMgcmVwcmVzZW50IHRoZWlyIGRlcml2ZWQgY2xhc3NlczogaW4gYSBzaW5nbGUgaW5oZXJpdGFuY2UKKy8vLyBoaWVyYXJjaHksIHRoZSBvcHRpbXVtIGxheW91dCB3b3VsZCBpbnZvbHZlIGEgZGVwdGgtZmlyc3Qgc2VhcmNoIG9mIHRoZQorLy8vIGNsYXNzIGhpZXJhcmNoeSAoYW5kIGluIGZhY3QgdGhlIGNvbXB1dGVkIGxheW91dCBlbmRzIHVwIGxvb2tpbmcgYSBsb3QgbGlrZQorLy8vIGEgREZTKSwgYnV0IGEgbmFpdmUgREZTIHdvdWxkIG5vdCB3b3JrIHdlbGwgaW4gdGhlIHByZXNlbmNlIG9mIG11bHRpcGxlCisvLy8gaW5oZXJpdGFuY2UuIFRoaXMgYXNwZWN0IG9mIHRoZSBhbGdvcml0aG0gZW5kcyB1cCBmaXR0aW5nIHNtYWxsZXIKKy8vLyBoaWVyYXJjaGllcyBpbnNpZGUgbGFyZ2VyIG9uZXMgd2hlcmUgdGhhdCB3b3VsZCBiZSBiZW5lZmljaWFsLgorLy8vCisvLy8gRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoaXMgY2xhc3MgaGllcmFyY2h5OgorLy8vCisvLy8gQSAgICAgICBCCisvLy8gICBcICAgLyB8IFwKKy8vLyAgICAgQyAgIEQgICBFCisvLy8KKy8vLyBXZSBoYXZlIGZpdmUgYml0IHNldHM6IGJzQSAoQSwgQyksIGJzQiAoQiwgQywgRCwgRSksIGJzQyAoQyksIGJzRCAoRCkgYW5kCisvLy8gYnNFIChFKS4gSWYgd2UgbGFpZCBvdXQgb3VyIG9iamVjdHMgYnkgREZTIHRyYXZlcnNpbmcgQiBmb2xsb3dlZCBieSBBLCBvdXIKKy8vLyBsYXlvdXQgd291bGQgYmUge0IsIEMsIEQsIEUsIEF9LiBUaGlzIGlzIG9wdGltYWwgZm9yIGJzQiBhcyBpdCBuZWVkcyB0bworLy8vIGNvdmVyIHRoZSBvbmx5IDQgb2JqZWN0cyBpbiBpdHMgaGllcmFyY2h5LCBidXQgbm90IGZvciBic0EgYXMgaXQgbmVlZHMgdG8KKy8vLyBjb3ZlciA1IG9iamVjdHMsIGkuZS4gdGhlIGVudGlyZSBsYXlvdXQuIE91ciBhbGdvcml0aG0gcHJvY2VlZHMgYXMgZm9sbG93czoKKy8vLworLy8vIEFkZCBic0MsIGZyYWdtZW50cyB7e0N9fQorLy8vIEFkZCBic0QsIGZyYWdtZW50cyB7e0N9LCB7RH19CisvLy8gQWRkIGJzRSwgZnJhZ21lbnRzIHt7Q30sIHtEfSwge0V9fQorLy8vIEFkZCBic0EsIGZyYWdtZW50cyB7e0EsIEN9LCB7RH0sIHtFfX0KKy8vLyBBZGQgYnNCLCBmcmFnbWVudHMge3tCLCBBLCBDLCBELCBFfX0KKy8vLworLy8vIFRoaXMgbGF5b3V0IGlzIG9wdGltYWwgZm9yIGJzQSwgYXMgaXQgbm93IG9ubHkgbmVlZHMgdG8gY292ZXIgdHdvIChpLmUuIDMKKy8vLyBmZXdlcikgb2JqZWN0cywgYXQgdGhlIGNvc3Qgb2YgYnNCIG5lZWRpbmcgdG8gY292ZXIgMSBtb3JlIG9iamVjdC4KKy8vLworLy8vIFRoZSBiaXQgc2V0IGxvd2VyaW5nIHBhc3MgYXNzaWducyBhbiBvYmplY3QgaW5kZXggdG8gZWFjaCBvYmplY3QgdGhhdCBuZWVkcworLy8vIHRvIGJlIGxhaWQgb3V0LCBhbmQgY2FsbHMgYWRkRnJhZ21lbnQgZm9yIGVhY2ggYml0IHNldCBwYXNzaW5nIHRoZSBvYmplY3QKKy8vLyBpbmRpY2VzIG9mIGl0cyByZWZlcmVuY2VkIGdsb2JhbHMuIEl0IHRoZW4gYXNzZW1ibGVzIGEgbGF5b3V0IGZyb20gdGhlCisvLy8gY29tcHV0ZWQgbGF5b3V0IGluIHRoZSBGcmFnbWVudHMgZmllbGQuCitzdHJ1Y3QgR2xvYmFsTGF5b3V0QnVpbGRlciB7CisgIC8vLyBUaGUgY29tcHV0ZWQgbGF5b3V0LiBFYWNoIGVsZW1lbnQgb2YgdGhpcyB2ZWN0b3IgY29udGFpbnMgYSBmcmFnbWVudCBvZgorICAvLy8gbGF5b3V0ICh3aGljaCBtYXkgYmUgZW1wdHkpIGNvbnNpc3Rpbmcgb2Ygb2JqZWN0IGluZGljZXMuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHVpbnQ2NF90Pj4gRnJhZ21lbnRzOworCisgIC8vLyBNYXBwaW5nIGZyb20gb2JqZWN0IGluZGV4IHRvIGZyYWdtZW50IGluZGV4LgorICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gRnJhZ21lbnRNYXA7CisKKyAgR2xvYmFsTGF5b3V0QnVpbGRlcih1aW50NjRfdCBOdW1PYmplY3RzKQorICAgICAgOiBGcmFnbWVudHMoMSksIEZyYWdtZW50TWFwKE51bU9iamVjdHMpIHt9CisKKyAgLy8vIEFkZCBGIHRvIHRoZSBsYXlvdXQgd2hpbGUgdHJ5aW5nIHRvIGtlZXAgaXRzIGluZGljZXMgY29udGlndW91cy4KKyAgLy8vIElmIGEgcHJldmlvdXNseSBzZWVuIGZyYWdtZW50IHVzZXMgYW55IG9mIEYncyBpbmRpY2VzLCB0aGF0CisgIC8vLyBmcmFnbWVudCB3aWxsIGJlIGxhaWQgb3V0IGluc2lkZSBGLgorICB2b2lkIGFkZEZyYWdtZW50KGNvbnN0IHN0ZDo6c2V0PHVpbnQ2NF90PiAmRik7Cit9OworCisvLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGJ1aWxkIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIG92ZXJsYXBwaW5nIGJpdCBzZXRzLiBCeQorLy8vIGxvYWRpbmcgZnJvbSBpbmRleGVkIG9mZnNldHMgaW50byB0aGUgYnl0ZSBhcnJheSBhbmQgYXBwbHlpbmcgYSBtYXNrLCBhCisvLy8gcHJvZ3JhbSBjYW4gdGVzdCBiaXRzIGZyb20gdGhlIGJpdCBzZXQgd2l0aCBhIHJlbGF0aXZlbHkgc2hvcnQgaW5zdHJ1Y3Rpb24KKy8vLyBzZXF1ZW5jZS4gRm9yIGV4YW1wbGUsIHN1cHBvc2Ugd2UgaGF2ZSAxNSBiaXQgc2V0cyB0byBsYXkgb3V0OgorLy8vCisvLy8gQSAoMTYgYml0cyksIEIgKDE1IGJpdHMpLCBDICgxNCBiaXRzKSwgRCAoMTMgYml0cyksIEUgKDEyIGJpdHMpLAorLy8vIEYgKDExIGJpdHMpLCBHICgxMCBiaXRzKSwgSCAoOSBiaXRzKSwgSSAoNyBiaXRzKSwgSiAoNiBiaXRzKSwgSyAoNSBiaXRzKSwKKy8vLyBMICg0IGJpdHMpLCBNICgzIGJpdHMpLCBOICgyIGJpdHMpLCBPICgxIGJpdCkKKy8vLworLy8vIFRoZXNlIGJpdHMgY2FuIGJlIGxhaWQgb3V0IGluIGEgMTYtYnl0ZSBhcnJheSBsaWtlIHRoaXM6CisvLy8KKy8vLyAgICAgICBCeXRlIE9mZnNldAorLy8vICAgICAwMTIzNDU2Nzg5QUJDREVGCisvLy8gQml0CisvLy8gICA3IEhISEhISEhISElJSUlJSUkKKy8vLyAgIDYgR0dHR0dHR0dHR0pKSkpKSgorLy8vICAgNSBGRkZGRkZGRkZGRktLS0tLCisvLy8gICA0IEVFRUVFRUVFRUVFRUxMTEwKKy8vLyAgIDMgRERERERERERERERERE1NTQorLy8vICAgMiBDQ0NDQ0NDQ0NDQ0NDQ05OCisvLy8gICAxIEJCQkJCQkJCQkJCQkJCQk8KKy8vLyAgIDAgQUFBQUFBQUFBQUFBQUFBQQorLy8vCisvLy8gRm9yIGV4YW1wbGUsIHRvIHRlc3QgYml0IFggb2YgQSwgd2UgZXZhbHVhdGUgKChiaXRzW1hdICYgMSkgIT0gMCksIG9yIHRvCisvLy8gdGVzdCBiaXQgWCBvZiBJLCB3ZSBldmFsdWF0ZSAoKGJpdHNbOSArIFhdICYgMHg4MCkgIT0gMCkuIFRoaXMgY2FuIGJlIGRvbmUKKy8vLyBpbiAxLTIgbWFjaGluZSBpbnN0cnVjdGlvbnMgb24geDg2LCBvciA0LTYgaW5zdHJ1Y3Rpb25zIG9uIEFSTS4KKy8vLworLy8vIFRoaXMgaXMgYSBieXRlIGFycmF5LCByYXRoZXIgdGhhbiAoc2F5KSBhIDItYnl0ZSBhcnJheSBvciBhIDQtYnl0ZSBhcnJheSwKKy8vLyBiZWNhdXNlIGZvciBvbmUgdGhpbmcgaXQgZ2l2ZXMgdXMgYmV0dGVyIHBhY2tpbmcgKHRoZSBtb3JlIGJpbnMgdGhlcmUgYXJlLAorLy8vIHRoZSBsZXNzIGV2ZW5seSB0aGV5IHdpbGwgYmUgZmlsbGVkKSwgYW5kIGZvciBhbm90aGVyLCB0aGUgaW5zdHJ1Y3Rpb24KKy8vLyBzZXF1ZW5jZXMgY2FuIGJlIHNsaWdodGx5IHNob3J0ZXIsIGJvdGggb24geDg2IGFuZCBBUk0uCitzdHJ1Y3QgQnl0ZUFycmF5QnVpbGRlciB7CisgIC8vLyBUaGUgYnl0ZSBhcnJheSBidWlsdCBzbyBmYXIuCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEJ5dGVzOworCisgIGVudW0geyBCaXRzUGVyQnl0ZSA9IDggfTsKKworICAvLy8gVGhlIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgc28gZmFyIGZvciBlYWNoIG9mIHRoZSBiaXRzLgorICB1aW50NjRfdCBCaXRBbGxvY3NbQml0c1BlckJ5dGVdOworCisgIEJ5dGVBcnJheUJ1aWxkZXIoKSB7CisgICAgbWVtc2V0KEJpdEFsbG9jcywgMCwgc2l6ZW9mKEJpdEFsbG9jcykpOworICB9CisKKyAgLy8vIEFsbG9jYXRlIEJpdFNpemUgYml0cyBpbiB0aGUgYnl0ZSBhcnJheSB3aGVyZSBCaXRzIGNvbnRhaW5zIHRoZSBiaXRzIHRvCisgIC8vLyBzZXQuIEFsbG9jQnl0ZU9mZnNldCBpcyBzZXQgdG8gdGhlIG9mZnNldCB3aXRoaW4gdGhlIGJ5dGUgYXJyYXkgYW5kCisgIC8vLyBBbGxvY01hc2sgaXMgc2V0IHRvIHRoZSBiaXRtYXNrIGZvciB0aG9zZSBiaXRzLiBUaGlzIHVzZXMgdGhlIExQVCAoTG9uZ2VzdAorICAvLy8gUHJvY2Vzc2luZyBUaW1lKSBtdWx0aXByb2Nlc3NvciBzY2hlZHVsaW5nIGFsZ29yaXRobSB0byBsYXkgb3V0IHRoZSBiaXRzCisgIC8vLyBlZmZpY2llbnRseTsgdGhlIHBhc3MgYWxsb2NhdGVzIGJpdCBzZXRzIGluIGRlY3JlYXNpbmcgc2l6ZSBvcmRlci4KKyAgdm9pZCBhbGxvY2F0ZShjb25zdCBzdGQ6OnNldDx1aW50NjRfdD4gJkJpdHMsIHVpbnQ2NF90IEJpdFNpemUsCisgICAgICAgICAgICAgICAgdWludDY0X3QgJkFsbG9jQnl0ZU9mZnNldCwgdWludDhfdCAmQWxsb2NNYXNrKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsb3dlcnR5cGV0ZXN0cworCitjbGFzcyBMb3dlclR5cGVUZXN0c1Bhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMb3dlclR5cGVUZXN0c1Bhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lQT19MT1dFUlRZUEVURVNUU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL1BhcnRpYWxJbmxpbmluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9QYXJ0aWFsSW5saW5pbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzZkZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9QYXJ0aWFsSW5saW5pbmcuaApAQCAtMCwwICsxLDMyIEBACisvLz09PS0gUGFydGlhbElubGluaW5nLmggLSBJbmxpbmUgcGFydHMgb2YgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBwZXJmb3JtcyBwYXJ0aWFsIGlubGluaW5nLCB0eXBpY2FsbHkgYnkgaW5saW5pbmcgYW4gaWYgc3RhdGVtZW50CisvLyB0aGF0IHN1cnJvdW5kcyB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX1BBUlRJQUxJTkxJTklOR19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JUE9fUEFSVElBTElOTElOSU5HX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNb2R1bGU7CisKKy8vLyBQYXNzIHRvIHJlbW92ZSB1bnVzZWQgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgorY2xhc3MgUGFydGlhbElubGluZXJQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48UGFydGlhbElubGluZXJQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfSVBPX1BBUlRJQUxJTkxJTklOR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL1Bhc3NNYW5hZ2VyQnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9QYXNzTWFuYWdlckJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzYzMDZmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9QYXNzTWFuYWdlckJ1aWxkZXIuaApAQCAtMCwwICsxLDIxNyBAQAorLy8gbGx2bS9UcmFuc2Zvcm1zL0lQTy9QYXNzTWFuYWdlckJ1aWxkZXIuaCAtIEJ1aWxkIFN0YW5kYXJkIFBhc3MgLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUGFzc01hbmFnZXJCdWlsZGVyIGNsYXNzLCB3aGljaCBpcyB1c2VkIHRvIHNldCB1cCBhCisvLyAic3RhbmRhcmQiIG9wdGltaXphdGlvbiBzZXF1ZW5jZSBzdWl0YWJsZSBmb3IgbGFuZ3VhZ2VzIGxpa2UgQyBhbmQgQysrLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lQT19QQVNTTUFOQUdFUkJVSUxERVJfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfSVBPX1BBU1NNQU5BR0VSQlVJTERFUl9ICisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNb2R1bGVTdW1tYXJ5SW5kZXg7CitjbGFzcyBQYXNzOworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm9JbXBsOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKKworLy8gVGhlIG9sZCBwYXNzIG1hbmFnZXIgaW5mcmFzdHJ1Y3R1cmUgaXMgaGlkZGVuIGluIGEgbGVnYWN5IG5hbWVzcGFjZSBub3cuCituYW1lc3BhY2UgbGVnYWN5IHsKK2NsYXNzIEZ1bmN0aW9uUGFzc01hbmFnZXI7CitjbGFzcyBQYXNzTWFuYWdlckJhc2U7Cit9CisKKy8vLyBQYXNzTWFuYWdlckJ1aWxkZXIgLSBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc2V0IHVwIGEgc3RhbmRhcmQgb3B0aW1pemF0aW9uCisvLy8gc2VxdWVuY2UgZm9yIGxhbmd1YWdlcyBsaWtlIEMgYW5kIEMrKywgYWxsb3dpbmcgc29tZSBBUElzIHRvIGN1c3RvbWl6ZSB0aGUKKy8vLyBwYXNzIHNlcXVlbmNlIGluIHZhcmlvdXMgd2F5cy4gQSBzaW1wbGUgZXhhbXBsZSBvZiB1c2luZyBpdCB3b3VsZCBiZToKKy8vLworLy8vICBQYXNzTWFuYWdlckJ1aWxkZXIgQnVpbGRlcjsKKy8vLyAgQnVpbGRlci5PcHRMZXZlbCA9IDI7CisvLy8gIEJ1aWxkZXIucG9wdWxhdGVGdW5jdGlvblBhc3NNYW5hZ2VyKEZQTSk7CisvLy8gIEJ1aWxkZXIucG9wdWxhdGVNb2R1bGVQYXNzTWFuYWdlcihNUE0pOworLy8vCisvLy8gSW4gYWRkaXRpb24gdG8gc2V0dGluZyB1cCB0aGUgYmFzaWMgcGFzc2VzLCBQYXNzTWFuYWdlckJ1aWxkZXIgYWxsb3dzCisvLy8gZnJvbnRlbmRzIHRvIHZlbmQgYSBwbHVnaW4gQVBJLCB3aGVyZSBwbHVnaW5zIGFyZSBhbGxvd2VkIHRvIGFkZCBleHRlbnNpb25zCisvLy8gdG8gdGhlIGRlZmF1bHQgcGFzcyBtYW5hZ2VyLiAgVGhleSBkbyB0aGlzIGJ5IHNwZWNpZnlpbmcgd2hlcmUgaW4gdGhlIHBhc3MKKy8vLyBwaXBlbGluZSB0aGV5IHdhbnQgdG8gYmUgYWRkZWQsIGFsb25nIHdpdGggYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGFkZHMKKy8vLyB0aGUgcGFzcyhlcykuICBGb3IgZXhhbXBsZSwgYSBwbHVnaW4gdGhhdCB3YW50ZWQgdG8gYWRkIGEgbG9vcCBvcHRpbWl6YXRpb24KKy8vLyBjb3VsZCBkbyBzb21ldGhpbmcgbGlrZSB0aGlzOgorLy8vCisvLy8gc3RhdGljIHZvaWQgYWRkTXlMb29wUGFzcyhjb25zdCBQTUJ1aWxkZXIgJkJ1aWxkZXIsIFBhc3NNYW5hZ2VyQmFzZSAmUE0pIHsKKy8vLyAgIGlmIChCdWlsZGVyLmdldE9wdExldmVsKCkgPiAyICYmIEJ1aWxkZXIuZ2V0T3B0U2l6ZUxldmVsKCkgPT0gMCkKKy8vLyAgICAgUE0uYWRkKGNyZWF0ZU15QXdlc29tZVBhc3MoKSk7CisvLy8gfQorLy8vICAgLi4uCisvLy8gICBCdWlsZGVyLmFkZEV4dGVuc2lvbihQYXNzTWFuYWdlckJ1aWxkZXI6OkVQX0xvb3BPcHRpbWl6ZXJFbmQsCisvLy8gICAgICAgICAgICAgICAgICAgICAgICBhZGRNeUxvb3BQYXNzKTsKKy8vLyAgIC4uLgorY2xhc3MgUGFzc01hbmFnZXJCdWlsZGVyIHsKK3B1YmxpYzoKKyAgLy8vIEV4dGVuc2lvbnMgYXJlIHBhc3NlZCB0aGUgYnVpbGRlciBpdHNlbGYgKHNvIHRoZXkgY2FuIHNlZSBob3cgaXQgaXMKKyAgLy8vIGNvbmZpZ3VyZWQpIGFzIHdlbGwgYXMgdGhlIHBhc3MgbWFuYWdlciB0byBhZGQgc3R1ZmYgdG8uCisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFBhc3NNYW5hZ2VyQnVpbGRlciAmQnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5OjpQYXNzTWFuYWdlckJhc2UgJlBNKT4KKyAgICAgIEV4dGVuc2lvbkZuOworICBlbnVtIEV4dGVuc2lvblBvaW50VHkgeworICAgIC8vLyBFUF9FYXJseUFzUG9zc2libGUgLSBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYWRkaW5nIHBhc3NlcyBiZWZvcmUKKyAgICAvLy8gYW55IG90aGVyIHRyYW5zZm9ybWF0aW9ucywgYWxsb3dpbmcgdGhlbSB0byBzZWUgdGhlIGNvZGUgYXMgaXQgaXMgY29taW5nCisgICAgLy8vIG91dCBvZiB0aGUgZnJvbnRlbmQuCisgICAgRVBfRWFybHlBc1Bvc3NpYmxlLAorCisgICAgLy8vIEVQX01vZHVsZU9wdGltaXplckVhcmx5IC0gVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGFkZGluZyBwYXNzZXMKKyAgICAvLy8ganVzdCBiZWZvcmUgdGhlIG1haW4gbW9kdWxlLWxldmVsIG9wdGltaXphdGlvbiBwYXNzZXMuCisgICAgRVBfTW9kdWxlT3B0aW1pemVyRWFybHksCisKKyAgICAvLy8gRVBfTG9vcE9wdGltaXplckVuZCAtIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhZGRpbmcgbG9vcCBwYXNzZXMgdG8KKyAgICAvLy8gdGhlIGVuZCBvZiB0aGUgbG9vcCBvcHRpbWl6ZXIuCisgICAgRVBfTG9vcE9wdGltaXplckVuZCwKKworICAgIC8vLyBFUF9TY2FsYXJPcHRpbWl6ZXJMYXRlIC0gVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGFkZGluZyBvcHRpbWl6YXRpb24KKyAgICAvLy8gcGFzc2VzIGFmdGVyIG1vc3Qgb2YgdGhlIG1haW4gb3B0aW1pemF0aW9ucywgYnV0IGJlZm9yZSB0aGUgbGFzdAorICAgIC8vLyBjbGVhbnVwLWlzaCBvcHRpbWl6YXRpb25zLgorICAgIEVQX1NjYWxhck9wdGltaXplckxhdGUsCisKKyAgICAvLy8gRVBfT3B0aW1pemVyTGFzdCAtLSBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYWRkaW5nIHBhc3NlcyB0aGF0CisgICAgLy8vIHJ1biBhZnRlciBldmVyeXRoaW5nIGVsc2UuCisgICAgRVBfT3B0aW1pemVyTGFzdCwKKworICAgIC8vLyBFUF9WZWN0b3JpemVyU3RhcnQgLSBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYWRkaW5nIG9wdGltaXphdGlvbgorICAgIC8vLyBwYXNzZXMgYmVmb3JlIHRoZSB2ZWN0b3JpemVyIGFuZCBvdGhlciBoaWdobHkgdGFyZ2V0IHNwZWNpZmljCisgICAgLy8vIG9wdGltaXphdGlvbiBwYXNzZXMgYXJlIGV4ZWN1dGVkLgorICAgIEVQX1ZlY3Rvcml6ZXJTdGFydCwKKworICAgIC8vLyBFUF9FbmFibGVkT25PcHRMZXZlbDAgLSBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYWRkaW5nIHBhc3NlcyB0aGF0CisgICAgLy8vIHNob3VsZCBub3QgYmUgZGlzYWJsZWQgYnkgTzAgb3B0aW1pemF0aW9uIGxldmVsLiBUaGUgcGFzc2VzIHdpbGwgYmUKKyAgICAvLy8gaW5zZXJ0ZWQgYWZ0ZXIgdGhlIGlubGluaW5nIHBhc3MuCisgICAgRVBfRW5hYmxlZE9uT3B0TGV2ZWwwLAorCisgICAgLy8vIEVQX1BlZXBob2xlIC0gVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGFkZGluZyBwYXNzZXMgdGhhdCBwZXJmb3JtCisgICAgLy8vIHBlZXBob2xlIG9wdGltaXphdGlvbnMgc2ltaWxhciB0byB0aGUgaW5zdHJ1Y3Rpb24gY29tYmluZXIuIFRoZXNlIHBhc3NlcworICAgIC8vLyB3aWxsIGJlIGluc2VydGVkIGFmdGVyIGVhY2ggaW5zdGFuY2Ugb2YgdGhlIGluc3RydWN0aW9uIGNvbWJpbmVyIHBhc3MuCisgICAgRVBfUGVlcGhvbGUsCisKKyAgICAvLy8gRVBfTGF0ZUxvb3BPcHRpbWl6YXRpb25zIC0gVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGFkZGluZyBsYXRlIGxvb3AKKyAgICAvLy8gY2Fub25pY2FsaXphdGlvbiBhbmQgc2ltcGxpZmljYXRpb24gcGFzc2VzLiBUaGlzIGlzIHRoZSBsYXN0IHBvaW50IGluCisgICAgLy8vIHRoZSBsb29wIG9wdGltaXphdGlvbiBwaXBlbGluZSBiZWZvcmUgbG9vcCBkZWxldGlvbi4gRWFjaCBwYXNzIGFkZGVkCisgICAgLy8vIGhlcmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBMb29wUGFzcy4KKyAgICAvLy8gVGhpcyBpcyB0aGUgcGxhY2UgdG8gYWRkIHBhc3NlcyB0aGF0IGNhbiByZW1vdmUgbG9vcHMsIHN1Y2ggYXMgdGFyZ2V0LQorICAgIC8vLyBzcGVjaWZpYyBsb29wIGlkaW9tIHJlY29nbml0aW9uLgorICAgIEVQX0xhdGVMb29wT3B0aW1pemF0aW9ucywKKworICAgIC8vLyBFUF9DR1NDQ09wdGltaXplckxhdGUgLSBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYWRkaW5nIENhbGxHcmFwaFNDQworICAgIC8vLyBwYXNzZXMgYXQgdGhlIGVuZCBvZiB0aGUgbWFpbiBDYWxsR3JhcGhTQ0MgcGFzc2VzIGFuZCBiZWZvcmUgYW55CisgICAgLy8vIGZ1bmN0aW9uIHNpbXBsaWZpY2F0aW9uIHBhc3NlcyBydW4gYnkgQ0dQYXNzTWFuYWdlci4KKyAgICBFUF9DR1NDQ09wdGltaXplckxhdGUsCisgIH07CisKKyAgLy8vIFRoZSBPcHRpbWl6YXRpb24gTGV2ZWwgLSBTcGVjaWZ5IHRoZSBiYXNpYyBvcHRpbWl6YXRpb24gbGV2ZWwuCisgIC8vLyAgICAwID0gLU8wLCAxID0gLU8xLCAyID0gLU8yLCAzID0gLU8zCisgIHVuc2lnbmVkIE9wdExldmVsOworCisgIC8vLyBTaXplTGV2ZWwgLSBIb3cgbXVjaCB3ZSdyZSBvcHRpbWl6aW5nIGZvciBzaXplLgorICAvLy8gICAgMCA9IG5vbmUsIDEgPSAtT3MsIDIgPSAtT3oKKyAgdW5zaWduZWQgU2l6ZUxldmVsOworCisgIC8vLyBMaWJyYXJ5SW5mbyAtIFNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcnVudGltZSBsaWJyYXJ5IGZvciB0aGUKKyAgLy8vIG9wdGltaXplci4gIElmIHRoaXMgaXMgbm9uLW51bGwsIGl0IGlzIGFkZGVkIHRvIGJvdGggdGhlIGZ1bmN0aW9uIGFuZAorICAvLy8gcGVyLW1vZHVsZSBwYXNzIHBpcGVsaW5lLgorICBUYXJnZXRMaWJyYXJ5SW5mb0ltcGwgKkxpYnJhcnlJbmZvOworCisgIC8vLyBJbmxpbmVyIC0gU3BlY2lmaWVzIHRoZSBpbmxpbmVyIHRvIHVzZS4gIElmIHRoaXMgaXMgbm9uLW51bGwsIGl0IGlzCisgIC8vLyBhZGRlZCB0byB0aGUgcGVyLW1vZHVsZSBwYXNzZXMuCisgIFBhc3MgKklubGluZXI7CisKKyAgLy8vIFRoZSBtb2R1bGUgc3VtbWFyeSBpbmRleCB0byB1c2UgZm9yIGV4cG9ydGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZQorICAvLy8gcmVndWxhciBMVE8gcGhhc2UsIGZvciBleGFtcGxlIGZvciB0aGUgQ0ZJIGFuZCBkZXZpcnR1YWxpemF0aW9uIHR5cGUKKyAgLy8vIHRlc3RzLgorICBNb2R1bGVTdW1tYXJ5SW5kZXggKkV4cG9ydFN1bW1hcnkgPSBudWxscHRyOworCisgIC8vLyBUaGUgbW9kdWxlIHN1bW1hcnkgaW5kZXggdG8gdXNlIGZvciBpbXBvcnRpbmcgaW5mb3JtYXRpb24gdG8gdGhlCisgIC8vLyB0aGluIExUTyBiYWNrZW5kcywgZm9yIGV4YW1wbGUgZm9yIHRoZSBDRkkgYW5kIGRldmlydHVhbGl6YXRpb24gdHlwZQorICAvLy8gdGVzdHMuCisgIGNvbnN0IE1vZHVsZVN1bW1hcnlJbmRleCAqSW1wb3J0U3VtbWFyeSA9IG51bGxwdHI7CisKKyAgYm9vbCBEaXNhYmxlVGFpbENhbGxzOworICBib29sIERpc2FibGVVbml0QXRBVGltZTsKKyAgYm9vbCBEaXNhYmxlVW5yb2xsTG9vcHM7CisgIGJvb2wgU0xQVmVjdG9yaXplOworICBib29sIExvb3BWZWN0b3JpemU7CisgIGJvb2wgUmVyb2xsTG9vcHM7CisgIGJvb2wgTmV3R1ZOOworICBib29sIERpc2FibGVHVk5Mb2FkUFJFOworICBib29sIFZlcmlmeUlucHV0OworICBib29sIFZlcmlmeU91dHB1dDsKKyAgYm9vbCBNZXJnZUZ1bmN0aW9uczsKKyAgYm9vbCBQcmVwYXJlRm9yTFRPOworICBib29sIFByZXBhcmVGb3JUaGluTFRPOworICBib29sIFBlcmZvcm1UaGluTFRPOworICBib29sIERpdmVyZ2VudFRhcmdldDsKKworICAvLy8gRW5hYmxlIHByb2ZpbGUgaW5zdHJ1bWVudGF0aW9uIHBhc3MuCisgIGJvb2wgRW5hYmxlUEdPSW5zdHJHZW47CisgIC8vLyBQcm9maWxlIGRhdGEgZmlsZSBuYW1lIHRoYXQgdGhlIGluc3RydW1lbnRhdGlvbiB3aWxsIGJlIHdyaXR0ZW4gdG8uCisgIHN0ZDo6c3RyaW5nIFBHT0luc3RyR2VuOworICAvLy8gUGF0aCBvZiB0aGUgcHJvZmlsZSBkYXRhIGZpbGUuCisgIHN0ZDo6c3RyaW5nIFBHT0luc3RyVXNlOworICAvLy8gUGF0aCBvZiB0aGUgc2FtcGxlIFByb2ZpbGUgZGF0YSBmaWxlLgorICBzdGQ6OnN0cmluZyBQR09TYW1wbGVVc2U7CisKK3ByaXZhdGU6CisgIC8vLyBFeHRlbnNpb25MaXN0IC0gVGhpcyBpcyBsaXN0IG9mIGFsbCBvZiB0aGUgZXh0ZW5zaW9ucyB0aGF0IGFyZSByZWdpc3RlcmVkLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8RXh0ZW5zaW9uUG9pbnRUeSwgRXh0ZW5zaW9uRm4+PiBFeHRlbnNpb25zOworCitwdWJsaWM6CisgIFBhc3NNYW5hZ2VyQnVpbGRlcigpOworICB+UGFzc01hbmFnZXJCdWlsZGVyKCk7CisgIC8vLyBBZGRzIGFuIGV4dGVuc2lvbiB0aGF0IHdpbGwgYmUgdXNlZCBieSBhbGwgUGFzc01hbmFnZXJCdWlsZGVyIGluc3RhbmNlcy4KKyAgLy8vIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBwbHVnaW5zLCB0byByZWdpc3RlciBhIHNldCBvZgorICAvLy8gb3B0aW1pc2F0aW9ucyB0byBydW4gYXV0b21hdGljYWxseS4KKyAgc3RhdGljIHZvaWQgYWRkR2xvYmFsRXh0ZW5zaW9uKEV4dGVuc2lvblBvaW50VHkgVHksIEV4dGVuc2lvbkZuIEZuKTsKKyAgdm9pZCBhZGRFeHRlbnNpb24oRXh0ZW5zaW9uUG9pbnRUeSBUeSwgRXh0ZW5zaW9uRm4gRm4pOworCitwcml2YXRlOgorICB2b2lkIGFkZEV4dGVuc2lvbnNUb1BNKEV4dGVuc2lvblBvaW50VHkgRVR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTo6UGFzc01hbmFnZXJCYXNlICZQTSkgY29uc3Q7CisgIHZvaWQgYWRkSW5pdGlhbEFsaWFzQW5hbHlzaXNQYXNzZXMobGVnYWN5OjpQYXNzTWFuYWdlckJhc2UgJlBNKSBjb25zdDsKKyAgdm9pZCBhZGRMVE9PcHRpbWl6YXRpb25QYXNzZXMobGVnYWN5OjpQYXNzTWFuYWdlckJhc2UgJlBNKTsKKyAgdm9pZCBhZGRMYXRlTFRPT3B0aW1pemF0aW9uUGFzc2VzKGxlZ2FjeTo6UGFzc01hbmFnZXJCYXNlICZQTSk7CisgIHZvaWQgYWRkUEdPSW5zdHJQYXNzZXMobGVnYWN5OjpQYXNzTWFuYWdlckJhc2UgJk1QTSk7CisgIHZvaWQgYWRkRnVuY3Rpb25TaW1wbGlmaWNhdGlvblBhc3NlcyhsZWdhY3k6OlBhc3NNYW5hZ2VyQmFzZSAmTVBNKTsKKyAgdm9pZCBhZGRJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3MobGVnYWN5OjpQYXNzTWFuYWdlckJhc2UgJk1QTSkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIHBvcHVsYXRlRnVuY3Rpb25QYXNzTWFuYWdlciAtIFRoaXMgZmlsbHMgaW4gdGhlIGZ1bmN0aW9uIHBhc3MgbWFuYWdlciwKKyAgLy8vIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGJlIHJ1biBvbiBlYWNoIGZ1bmN0aW9uIGltbWVkaWF0ZWx5IGFzIGl0IGlzCisgIC8vLyBnZW5lcmF0ZWQuICBUaGUgaWRlYSBpcyB0byByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIElSIGluIG1lbW9yeS4KKyAgdm9pZCBwb3B1bGF0ZUZ1bmN0aW9uUGFzc01hbmFnZXIobGVnYWN5OjpGdW5jdGlvblBhc3NNYW5hZ2VyICZGUE0pOworCisgIC8vLyBwb3B1bGF0ZU1vZHVsZVBhc3NNYW5hZ2VyIC0gVGhpcyBzZXRzIHVwIHRoZSBwcmltYXJ5IHBhc3MgbWFuYWdlci4KKyAgdm9pZCBwb3B1bGF0ZU1vZHVsZVBhc3NNYW5hZ2VyKGxlZ2FjeTo6UGFzc01hbmFnZXJCYXNlICZNUE0pOworICB2b2lkIHBvcHVsYXRlTFRPUGFzc01hbmFnZXIobGVnYWN5OjpQYXNzTWFuYWdlckJhc2UgJlBNKTsKKyAgdm9pZCBwb3B1bGF0ZVRoaW5MVE9QYXNzTWFuYWdlcihsZWdhY3k6OlBhc3NNYW5hZ2VyQmFzZSAmUE0pOworfTsKKworLy8vIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGZvciBhZGRpbmcgYSBzdGFuZGFyZCBzZXQgb2YgcGFzc2VzLiAgVGhpcyBzaG91bGQgYmUKKy8vLyB1c2VkIGJ5IG9wdGltaXplciBwbHVnaW5zIHRvIGFsbG93IGFsbCBmcm9udCBlbmRzIHRvIHRyYW5zcGFyZW50bHkgdXNlCisvLy8gdGhlbS4gIENyZWF0ZSBhIHN0YXRpYyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGluIHlvdXIgcGx1Z2luLCBwcm92aWRpbmcgYQorLy8vIHByaXZhdGUgZnVuY3Rpb24gdGhhdCB0aGUgUGFzc01hbmFnZXJCdWlsZGVyIGNhbiB1c2UgdG8gYWRkIHlvdXIgcGFzc2VzLgorc3RydWN0IFJlZ2lzdGVyU3RhbmRhcmRQYXNzZXMgeworICBSZWdpc3RlclN0YW5kYXJkUGFzc2VzKFBhc3NNYW5hZ2VyQnVpbGRlcjo6RXh0ZW5zaW9uUG9pbnRUeSBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzTWFuYWdlckJ1aWxkZXI6OkV4dGVuc2lvbkZuIEZuKSB7CisgICAgUGFzc01hbmFnZXJCdWlsZGVyOjphZGRHbG9iYWxFeHRlbnNpb24oVHksIHN0ZDo6bW92ZShGbikpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL1NDQ1AuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vU0NDUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYjc4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL1NDQ1AuaApAQCAtMCwwICsxLDM4IEBACisvLz09PS0gU0NDUC5oIC0gU3BhcnNlIENvbmRpdGlvbmFsIENvbnN0YW50IFByb3BhZ2F0aW9uIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBpbXBsZW1lbnRzICBpbnRlcnByb2NlZHVyYWwgc3BhcnNlIGNvbmRpdGlvbmFsIGNvbnN0YW50CisvLyBwcm9wYWdhdGlvbiBhbmQgbWVyZ2luZy4KKy8vCisvLyBTcGVjaWZpY2FsbHksIHRoaXM6CisvLyAgICogQXNzdW1lcyB2YWx1ZXMgYXJlIGNvbnN0YW50IHVubGVzcyBwcm92ZW4gb3RoZXJ3aXNlCisvLyAgICogQXNzdW1lcyBCYXNpY0Jsb2NrcyBhcmUgZGVhZCB1bmxlc3MgcHJvdmVuIG90aGVyd2lzZQorLy8gICAqIFByb3ZlcyB2YWx1ZXMgdG8gYmUgY29uc3RhbnQsIGFuZCByZXBsYWNlcyB0aGVtIHdpdGggY29uc3RhbnRzCisvLyAgICogUHJvdmVzIGNvbmRpdGlvbmFsIGJyYW5jaGVzIHRvIGJlIHVuY29uZGl0aW9uYWwKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JUE9fU0NDUF9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JUE9fU0NDUF9ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTW9kdWxlOworCisvLy8gUGFzcyB0byBwZXJmb3JtIGludGVycHJvY2VkdXJhbCBjb25zdGFudCBwcm9wYWdhdGlvbi4KK2NsYXNzIElQU0NDUFBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxJUFNDQ1BQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19JUE9fU0NDUF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL1NhbXBsZVByb2ZpbGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vU2FtcGxlUHJvZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNWEwNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL1NhbXBsZVByb2ZpbGUuaApAQCAtMCwwICsxLDQwIEBACisvLz09PS0gU2FtcGxlUHJvZmlsZS5oIC0gU2FtcGxlUEdPIHBhc3MgLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgc2FtcGxlZCBQR08gbG9hZGVyIHBhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX1NBTVBMRVBST0ZJTEVfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfSVBPX1NBTVBMRVBST0ZJTEVfSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNb2R1bGU7CisKKy8vLyBUaGUgc2FtcGxlIHByb2ZpbGVyIGRhdGEgbG9hZGVyIHBhc3MuCitjbGFzcyBTYW1wbGVQcm9maWxlTG9hZGVyUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPFNhbXBsZVByb2ZpbGVMb2FkZXJQYXNzPiB7CitwdWJsaWM6CisgIFNhbXBsZVByb2ZpbGVMb2FkZXJQYXNzKHN0ZDo6c3RyaW5nIEZpbGUgPSAiIiwgYm9vbCBJc1RoaW5MVE9QcmVMaW5rID0gZmFsc2UpCisgICAgICA6IFByb2ZpbGVGaWxlTmFtZShGaWxlKSwgSXNUaGluTFRPUHJlTGluayhJc1RoaW5MVE9QcmVMaW5rKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBQcm9maWxlRmlsZU5hbWU7CisgIGJvb2wgSXNUaGluTFRPUHJlTGluazsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0FNUExFUFJPRklMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL1N0cmlwRGVhZFByb3RvdHlwZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vU3RyaXBEZWFkUHJvdG90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMDVjZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL1N0cmlwRGVhZFByb3RvdHlwZXMuaApAQCAtMCwwICsxLDMyIEBACisvLz09PS0tIFN0cmlwRGVhZFByb3RvdHlwZXMuaCAtIFJlbW92ZSB1bnVzZWQgZnVuY3Rpb24gZGVjbGFyYXRpb25zIC0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBsb29wcyBvdmVyIGFsbCBvZiB0aGUgZnVuY3Rpb25zIGluIHRoZSBpbnB1dCBtb2R1bGUsIGxvb2tpbmcgZm9yCisvLyBkZWFkIGRlY2xhcmF0aW9ucyBhbmQgcmVtb3ZlcyB0aGVtLiBEZWFkIGRlY2xhcmF0aW9ucyBhcmUgZGVjbGFyYXRpb25zIG9mCisvLyBmdW5jdGlvbnMgZm9yIHdoaWNoIG5vIGltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZSAoaS5lLiwgZGVjbGFyYXRpb25zIGZvcgorLy8gdW51c2VkIGxpYnJhcnkgZnVuY3Rpb25zKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JUE9fU1RSSVBERUFEUFJPVE9UWVBFU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JUE9fU1RSSVBERUFEUFJPVE9UWVBFU19ICisKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gUGFzcyB0byByZW1vdmUgdW51c2VkIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KK3N0cnVjdCBTdHJpcERlYWRQcm90b3R5cGVzUGFzcyA6IFBhc3NJbmZvTWl4aW48U3RyaXBEZWFkUHJvdG90eXBlc1Bhc3M+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICYpOworfTsKKworfQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lQT19TVFJJUERFQURQUk9UT1RZUEVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vU3ludGhldGljQ291bnRzUHJvcGFnYXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vU3ludGhldGljQ291bnRzUHJvcGFnYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjNiYTg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9TeW50aGV0aWNDb3VudHNQcm9wYWdhdGlvbi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lQT19TWU5USEVUSUNfQ09VTlRTX1BST1BBR0FUSU9OX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19TWU5USEVUSUNfQ09VTlRTX1BST1BBR0FUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NjYWxlZE51bWJlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIE1vZHVsZTsKKworY2xhc3MgU3ludGhldGljQ291bnRzUHJvcGFnYXRpb24KKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPFN5bnRoZXRpY0NvdW50c1Byb3BhZ2F0aW9uPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmTUFNKTsKK307Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vVGhpbkxUT0JpdGNvZGVXcml0ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vVGhpbkxUT0JpdGNvZGVXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjA0YmJmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9UaGluTFRPQml0Y29kZVdyaXRlci5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vPT09LSBUaGluTFRPQml0Y29kZVdyaXRlci5oIC0gQml0Y29kZSB3cml0aW5nIHBhc3MgZm9yIFRoaW5MVE8gLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIHByZXBhcmVzIGEgbW9kdWxlIGNvbnRhaW5pbmcgdHlwZSBtZXRhZGF0YSBmb3IgVGhpbkxUTyBieSBzcGxpdHRpbmcKKy8vIGl0IGludG8gcmVndWxhciBhbmQgdGhpbiBMVE8gcGFydHMgaWYgcG9zc2libGUsIGFuZCB3cml0aW5nIGJvdGggcGFydHMgdG8KKy8vIGEgbXVsdGktbW9kdWxlIGJpdGNvZGUgZmlsZS4gTW9kdWxlcyB0aGF0IGRvIG5vdCBjb250YWluIHR5cGUgbWV0YWRhdGEgYXJlCisvLyB3cml0dGVuIHVubW9kaWZpZWQgYXMgYSBzaW5nbGUgbW9kdWxlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lQT19USElOTFRPQklUQ09ERVdSSVRFUl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JUE9fVEhJTkxUT0JJVENPREVXUklURVJfSAorCisjaW5jbHVkZSA8bGx2bS9JUi9QYXNzTWFuYWdlci5oPgorI2luY2x1ZGUgPGxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFRoaW5MVE9CaXRjb2RlV3JpdGVyUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48VGhpbkxUT0JpdGNvZGVXcml0ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKyAgcmF3X29zdHJlYW0gKlRoaW5MaW5rT1M7CisKK3B1YmxpYzoKKyAgLy8gV3JpdGVzIGJpdGNvZGUgdG8gT1MuIEFsc28gd3JpdGUgdGhpbiBsaW5rIGZpbGUgdG8gVGhpbkxpbmtPUywgaWYKKyAgLy8gaXQncyBub3QgbnVsbHB0ci4KKyAgVGhpbkxUT0JpdGNvZGVXcml0ZXJQYXNzKHJhd19vc3RyZWFtICZPUywgcmF3X29zdHJlYW0gKlRoaW5MaW5rT1MpCisgICAgICA6IE9TKE9TKSwgVGhpbkxpbmtPUyhUaGluTGlua09TKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vV2hvbGVQcm9ncmFtRGV2aXJ0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL1dob2xlUHJvZ3JhbURldmlydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYTRjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL1dob2xlUHJvZ3JhbURldmlydC5oCkBAIC0wLDAgKzEsMjI2IEBACisvLz09PS0gV2hvbGVQcm9ncmFtRGV2aXJ0LmggLSBXaG9sZS1wcm9ncmFtIGRldmlydCBwYXNzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHBhcnRzIG9mIHRoZSB3aG9sZS1wcm9ncmFtIGRldmlydHVhbGl6YXRpb24gcGFzcworLy8gaW1wbGVtZW50YXRpb24gdGhhdCBtYXkgYmUgdXNlZnVsbHkgdW5pdCB0ZXN0ZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX1dIT0xFUFJPR1JBTURFVklSVF9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JUE9fV0hPTEVQUk9HUkFNREVWSVJUX0gKKworI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgTXV0YWJsZUFycmF5UmVmOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBHbG9iYWxWYXJpYWJsZTsKKworbmFtZXNwYWNlIHdob2xlcHJvZ3JhbWRldmlydCB7CisKKy8vIEEgYml0IHZlY3RvciB0aGF0IGtlZXBzIHRyYWNrIG9mIHdoaWNoIGJpdHMgYXJlIHVzZWQuIFdlIHVzZSB0aGlzIHRvCisvLyBwYWNrIGNvbnN0YW50IHZhbHVlcyBjb21wYWN0bHkgYmVmb3JlIGFuZCBhZnRlciBlYWNoIHZpcnR1YWwgdGFibGUuCitzdHJ1Y3QgQWNjdW1CaXRWZWN0b3IgeworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBCeXRlczsKKworICAvLyBCaXRzIGluIEJ5dGVzVXNlZFtJXSBhcmUgMSBpZiBtYXRjaGluZyBiaXQgaW4gQnl0ZXNbSV0gaXMgdXNlZCwgMCBpZiBub3QuCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEJ5dGVzVXNlZDsKKworICBzdGQ6OnBhaXI8dWludDhfdCAqLCB1aW50OF90ICo+IGdldFB0clRvRGF0YSh1aW50NjRfdCBQb3MsIHVpbnQ4X3QgU2l6ZSkgeworICAgIGlmIChCeXRlcy5zaXplKCkgPCBQb3MgKyBTaXplKSB7CisgICAgICBCeXRlcy5yZXNpemUoUG9zICsgU2l6ZSk7CisgICAgICBCeXRlc1VzZWQucmVzaXplKFBvcyArIFNpemUpOworICAgIH0KKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoQnl0ZXMuZGF0YSgpICsgUG9zLCBCeXRlc1VzZWQuZGF0YSgpICsgUG9zKTsKKyAgfQorCisgIC8vIFNldCBsaXR0bGUtZW5kaWFuIHZhbHVlIFZhbCB3aXRoIHNpemUgU2l6ZSBhdCBiaXQgcG9zaXRpb24gUG9zLAorICAvLyBhbmQgbWFyayBieXRlcyBhcyB1c2VkLgorICB2b2lkIHNldExFKHVpbnQ2NF90IFBvcywgdWludDY0X3QgVmFsLCB1aW50OF90IFNpemUpIHsKKyAgICBhc3NlcnQoUG9zICUgOCA9PSAwKTsKKyAgICBhdXRvIERhdGFVc2VkID0gZ2V0UHRyVG9EYXRhKFBvcyAvIDgsIFNpemUpOworICAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgIT0gU2l6ZTsgKytJKSB7CisgICAgICBEYXRhVXNlZC5maXJzdFtJXSA9IFZhbCA+PiAoSSAqIDgpOworICAgICAgYXNzZXJ0KCFEYXRhVXNlZC5zZWNvbmRbSV0pOworICAgICAgRGF0YVVzZWQuc2Vjb25kW0ldID0gMHhmZjsKKyAgICB9CisgIH0KKworICAvLyBTZXQgYmlnLWVuZGlhbiB2YWx1ZSBWYWwgd2l0aCBzaXplIFNpemUgYXQgYml0IHBvc2l0aW9uIFBvcywKKyAgLy8gYW5kIG1hcmsgYnl0ZXMgYXMgdXNlZC4KKyAgdm9pZCBzZXRCRSh1aW50NjRfdCBQb3MsIHVpbnQ2NF90IFZhbCwgdWludDhfdCBTaXplKSB7CisgICAgYXNzZXJ0KFBvcyAlIDggPT0gMCk7CisgICAgYXV0byBEYXRhVXNlZCA9IGdldFB0clRvRGF0YShQb3MgLyA4LCBTaXplKTsKKyAgICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJICE9IFNpemU7ICsrSSkgeworICAgICAgRGF0YVVzZWQuZmlyc3RbU2l6ZSAtIEkgLSAxXSA9IFZhbCA+PiAoSSAqIDgpOworICAgICAgYXNzZXJ0KCFEYXRhVXNlZC5zZWNvbmRbU2l6ZSAtIEkgLSAxXSk7CisgICAgICBEYXRhVXNlZC5zZWNvbmRbU2l6ZSAtIEkgLSAxXSA9IDB4ZmY7CisgICAgfQorICB9CisKKyAgLy8gU2V0IGJpdCBhdCBiaXQgcG9zaXRpb24gUG9zIHRvIGIgYW5kIG1hcmsgYml0IGFzIHVzZWQuCisgIHZvaWQgc2V0Qml0KHVpbnQ2NF90IFBvcywgYm9vbCBiKSB7CisgICAgYXV0byBEYXRhVXNlZCA9IGdldFB0clRvRGF0YShQb3MgLyA4LCAxKTsKKyAgICBpZiAoYikKKyAgICAgICpEYXRhVXNlZC5maXJzdCB8PSAxIDw8IChQb3MgJSA4KTsKKyAgICBhc3NlcnQoISgqRGF0YVVzZWQuc2Vjb25kICYgKDEgPDwgUG9zICUgOCkpKTsKKyAgICAqRGF0YVVzZWQuc2Vjb25kIHw9IDEgPDwgKFBvcyAlIDgpOworICB9Cit9OworCisvLyBUaGUgYml0cyB0aGF0IHdpbGwgYmUgc3RvcmVkIGJlZm9yZSBhbmQgYWZ0ZXIgYSBwYXJ0aWN1bGFyIHZ0YWJsZS4KK3N0cnVjdCBWVGFibGVCaXRzIHsKKyAgLy8gVGhlIHZ0YWJsZSBnbG9iYWwuCisgIEdsb2JhbFZhcmlhYmxlICpHVjsKKworICAvLyBDYWNoZSBvZiB0aGUgdnRhYmxlJ3Mgc2l6ZSBpbiBieXRlcy4KKyAgdWludDY0X3QgT2JqZWN0U2l6ZSA9IDA7CisKKyAgLy8gVGhlIGJpdCB2ZWN0b3IgdGhhdCB3aWxsIGJlIGxhaWQgb3V0IGJlZm9yZSB0aGUgdnRhYmxlLiBOb3RlIHRoYXQgdGhlc2UKKyAgLy8gYnl0ZXMgYXJlIHN0b3JlZCBpbiByZXZlcnNlIG9yZGVyIHVudGlsIHRoZSBnbG9iYWxzIGFyZSByZWJ1aWx0LiBUaGlzIG1lYW5zCisgIC8vIHRoYXQgYW55IHZhbHVlcyBpbiB0aGUgYXJyYXkgbXVzdCBiZSBzdG9yZWQgdXNpbmcgdGhlIG9wcG9zaXRlIGVuZGlhbm5lc3MKKyAgLy8gZnJvbSB0aGUgdGFyZ2V0LgorICBBY2N1bUJpdFZlY3RvciBCZWZvcmU7CisKKyAgLy8gVGhlIGJpdCB2ZWN0b3IgdGhhdCB3aWxsIGJlIGxhaWQgb3V0IGFmdGVyIHRoZSB2dGFibGUuCisgIEFjY3VtQml0VmVjdG9yIEFmdGVyOworfTsKKworLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBtZW1iZXIgb2YgYSBwYXJ0aWN1bGFyIHR5cGUgaWRlbnRpZmllci4KK3N0cnVjdCBUeXBlTWVtYmVySW5mbyB7CisgIC8vIFRoZSBWVGFibGVCaXRzIGZvciB0aGUgdnRhYmxlLgorICBWVGFibGVCaXRzICpCaXRzOworCisgIC8vIFRoZSBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHZ0YWJsZSAoaS5lLiB0aGUgYWRkcmVzcyBwb2ludCkuCisgIHVpbnQ2NF90IE9mZnNldDsKKworICBib29sIG9wZXJhdG9yPChjb25zdCBUeXBlTWVtYmVySW5mbyAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gQml0cyA8IG90aGVyLkJpdHMgfHwgKEJpdHMgPT0gb3RoZXIuQml0cyAmJiBPZmZzZXQgPCBvdGhlci5PZmZzZXQpOworICB9Cit9OworCisvLyBBIHZpcnR1YWwgY2FsbCB0YXJnZXQsIGkuZS4gYW4gZW50cnkgaW4gYSBwYXJ0aWN1bGFyIHZ0YWJsZS4KK3N0cnVjdCBWaXJ0dWFsQ2FsbFRhcmdldCB7CisgIFZpcnR1YWxDYWxsVGFyZ2V0KEZ1bmN0aW9uICpGbiwgY29uc3QgVHlwZU1lbWJlckluZm8gKlRNKTsKKworICAvLyBGb3IgdGVzdGluZyBvbmx5LgorICBWaXJ0dWFsQ2FsbFRhcmdldChjb25zdCBUeXBlTWVtYmVySW5mbyAqVE0sIGJvb2wgSXNCaWdFbmRpYW4pCisgICAgICA6IEZuKG51bGxwdHIpLCBUTShUTSksIElzQmlnRW5kaWFuKElzQmlnRW5kaWFuKSwgV2FzRGV2aXJ0KGZhbHNlKSB7fQorCisgIC8vIFRoZSBmdW5jdGlvbiBzdG9yZWQgaW4gdGhlIHZ0YWJsZS4KKyAgRnVuY3Rpb24gKkZuOworCisgIC8vIEEgcG9pbnRlciB0byB0aGUgdHlwZSBpZGVudGlmaWVyIG1lbWJlciB0aHJvdWdoIHdoaWNoIHRoZSBwb2ludGVyIHRvIEZuIGlzCisgIC8vIGFjY2Vzc2VkLgorICBjb25zdCBUeXBlTWVtYmVySW5mbyAqVE07CisKKyAgLy8gV2hlbiBkb2luZyB2aXJ0dWFsIGNvbnN0YW50IHByb3BhZ2F0aW9uLCB0aGlzIHN0b3JlcyB0aGUgcmV0dXJuIHZhbHVlIGZvcgorICAvLyB0aGUgZnVuY3Rpb24gd2hlbiBwYXNzZWQgdGhlIGN1cnJlbnRseSBjb25zaWRlcmVkIGFyZ3VtZW50IGxpc3QuCisgIHVpbnQ2NF90IFJldFZhbDsKKworICAvLyBXaGV0aGVyIHRoZSB0YXJnZXQgaXMgYmlnIGVuZGlhbi4KKyAgYm9vbCBJc0JpZ0VuZGlhbjsKKworICAvLyBXaGV0aGVyIGF0IGxlYXN0IG9uZSBjYWxsIHNpdGUgdG8gdGhlIHRhcmdldCB3YXMgZGV2aXJ0dWFsaXplZC4KKyAgYm9vbCBXYXNEZXZpcnQ7CisKKyAgLy8gVGhlIG1pbmltdW0gYnl0ZSBvZmZzZXQgYmVmb3JlIHRoZSBhZGRyZXNzIHBvaW50LiBUaGlzIGNvdmVycyB0aGUgYnl0ZXMgaW4KKyAgLy8gdGhlIHZ0YWJsZSBvYmplY3QgYmVmb3JlIHRoZSBhZGRyZXNzIHBvaW50IChlLmcuIFJUVEksIGFjY2Vzcy10by10b3AsCisgIC8vIHZ0YWJsZXMgZm9yIG90aGVyIGJhc2UgY2xhc3NlcykgYW5kIGlzIGVxdWFsIHRvIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQKKyAgLy8gb2YgdGhlIHZ0YWJsZSBvYmplY3QgdG8gdGhlIGFkZHJlc3MgcG9pbnQuCisgIHVpbnQ2NF90IG1pbkJlZm9yZUJ5dGVzKCkgY29uc3QgeyByZXR1cm4gVE0tPk9mZnNldDsgfQorCisgIC8vIFRoZSBtaW5pbXVtIGJ5dGUgb2Zmc2V0IGFmdGVyIHRoZSBhZGRyZXNzIHBvaW50LiBUaGlzIGNvdmVycyB0aGUgYnl0ZXMgaW4KKyAgLy8gdGhlIHZ0YWJsZSBvYmplY3QgYWZ0ZXIgdGhlIGFkZHJlc3MgcG9pbnQgKGUuZy4gdGhlIHZ0YWJsZSBmb3IgdGhlIGN1cnJlbnQKKyAgLy8gY2xhc3MgYW5kIGFueSBsYXRlciBiYXNlIGNsYXNzZXMpIGFuZCBpcyBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgdnRhYmxlCisgIC8vIG9iamVjdCBtaW51cyB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSB2dGFibGUgb2JqZWN0IHRvIHRoZSBhZGRyZXNzCisgIC8vIHBvaW50LgorICB1aW50NjRfdCBtaW5BZnRlckJ5dGVzKCkgY29uc3QgeyByZXR1cm4gVE0tPkJpdHMtPk9iamVjdFNpemUgLSBUTS0+T2Zmc2V0OyB9CisKKyAgLy8gVGhlIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgKGZvciB0aGUgdnRhYmxlIHBsdXMgdGhlIGJ5dGUgYXJyYXkpIGJlZm9yZQorICAvLyB0aGUgYWRkcmVzcyBwb2ludC4KKyAgdWludDY0X3QgYWxsb2NhdGVkQmVmb3JlQnl0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1pbkJlZm9yZUJ5dGVzKCkgKyBUTS0+Qml0cy0+QmVmb3JlLkJ5dGVzLnNpemUoKTsKKyAgfQorCisgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIChmb3IgdGhlIHZ0YWJsZSBwbHVzIHRoZSBieXRlIGFycmF5KSBhZnRlcgorICAvLyB0aGUgYWRkcmVzcyBwb2ludC4KKyAgdWludDY0X3QgYWxsb2NhdGVkQWZ0ZXJCeXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWluQWZ0ZXJCeXRlcygpICsgVE0tPkJpdHMtPkFmdGVyLkJ5dGVzLnNpemUoKTsKKyAgfQorCisgIC8vIFNldCB0aGUgYml0IGF0IHBvc2l0aW9uIFBvcyBiZWZvcmUgdGhlIGFkZHJlc3MgcG9pbnQgdG8gUmV0VmFsLgorICB2b2lkIHNldEJlZm9yZUJpdCh1aW50NjRfdCBQb3MpIHsKKyAgICBhc3NlcnQoUG9zID49IDggKiBtaW5CZWZvcmVCeXRlcygpKTsKKyAgICBUTS0+Qml0cy0+QmVmb3JlLnNldEJpdChQb3MgLSA4ICogbWluQmVmb3JlQnl0ZXMoKSwgUmV0VmFsKTsKKyAgfQorCisgIC8vIFNldCB0aGUgYml0IGF0IHBvc2l0aW9uIFBvcyBhZnRlciB0aGUgYWRkcmVzcyBwb2ludCB0byBSZXRWYWwuCisgIHZvaWQgc2V0QWZ0ZXJCaXQodWludDY0X3QgUG9zKSB7CisgICAgYXNzZXJ0KFBvcyA+PSA4ICogbWluQWZ0ZXJCeXRlcygpKTsKKyAgICBUTS0+Qml0cy0+QWZ0ZXIuc2V0Qml0KFBvcyAtIDggKiBtaW5BZnRlckJ5dGVzKCksIFJldFZhbCk7CisgIH0KKworICAvLyBTZXQgdGhlIGJ5dGVzIGF0IHBvc2l0aW9uIFBvcyBiZWZvcmUgdGhlIGFkZHJlc3MgcG9pbnQgdG8gUmV0VmFsLgorICAvLyBCZWNhdXNlIHRoZSBieXRlcyBpbiBCZWZvcmUgYXJlIHN0b3JlZCBpbiByZXZlcnNlIG9yZGVyLCB3ZSB1c2UgdGhlCisgIC8vIG9wcG9zaXRlIGVuZGlhbm5lc3MgdG8gdGhlIHRhcmdldC4KKyAgdm9pZCBzZXRCZWZvcmVCeXRlcyh1aW50NjRfdCBQb3MsIHVpbnQ4X3QgU2l6ZSkgeworICAgIGFzc2VydChQb3MgPj0gOCAqIG1pbkJlZm9yZUJ5dGVzKCkpOworICAgIGlmIChJc0JpZ0VuZGlhbikKKyAgICAgIFRNLT5CaXRzLT5CZWZvcmUuc2V0TEUoUG9zIC0gOCAqIG1pbkJlZm9yZUJ5dGVzKCksIFJldFZhbCwgU2l6ZSk7CisgICAgZWxzZQorICAgICAgVE0tPkJpdHMtPkJlZm9yZS5zZXRCRShQb3MgLSA4ICogbWluQmVmb3JlQnl0ZXMoKSwgUmV0VmFsLCBTaXplKTsKKyAgfQorCisgIC8vIFNldCB0aGUgYnl0ZXMgYXQgcG9zaXRpb24gUG9zIGFmdGVyIHRoZSBhZGRyZXNzIHBvaW50IHRvIFJldFZhbC4KKyAgdm9pZCBzZXRBZnRlckJ5dGVzKHVpbnQ2NF90IFBvcywgdWludDhfdCBTaXplKSB7CisgICAgYXNzZXJ0KFBvcyA+PSA4ICogbWluQWZ0ZXJCeXRlcygpKTsKKyAgICBpZiAoSXNCaWdFbmRpYW4pCisgICAgICBUTS0+Qml0cy0+QWZ0ZXIuc2V0QkUoUG9zIC0gOCAqIG1pbkFmdGVyQnl0ZXMoKSwgUmV0VmFsLCBTaXplKTsKKyAgICBlbHNlCisgICAgICBUTS0+Qml0cy0+QWZ0ZXIuc2V0TEUoUG9zIC0gOCAqIG1pbkFmdGVyQnl0ZXMoKSwgUmV0VmFsLCBTaXplKTsKKyAgfQorfTsKKworLy8gRmluZCB0aGUgbWluaW11bSBvZmZzZXQgdGhhdCB3ZSBtYXkgc3RvcmUgYSB2YWx1ZSBvZiBzaXplIFNpemUgYml0cyBhdC4gSWYKKy8vIElzQWZ0ZXIgaXMgc2V0LCBsb29rIGZvciBhbiBvZmZzZXQgYmVmb3JlIHRoZSBvYmplY3QsIG90aGVyd2lzZSBsb29rIGZvciBhbgorLy8gb2Zmc2V0IGFmdGVyIHRoZSBvYmplY3QuCit1aW50NjRfdCBmaW5kTG93ZXN0T2Zmc2V0KEFycmF5UmVmPFZpcnR1YWxDYWxsVGFyZ2V0PiBUYXJnZXRzLCBib29sIElzQWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUpOworCisvLyBTZXQgdGhlIHN0b3JlZCB2YWx1ZSBpbiBlYWNoIG9mIFRhcmdldHMgdG8gVmlydHVhbENhbGxUYXJnZXQ6OlJldFZhbCBhdCB0aGUKKy8vIGdpdmVuIGFsbG9jYXRpb24gb2Zmc2V0IGJlZm9yZSB0aGUgdnRhYmxlIGFkZHJlc3MuIFN0b3JlcyB0aGUgY29tcHV0ZWQKKy8vIGJ5dGUvYml0IG9mZnNldCB0byBPZmZzZXRCeXRlL09mZnNldEJpdC4KK3ZvaWQgc2V0QmVmb3JlUmV0dXJuVmFsdWVzKE11dGFibGVBcnJheVJlZjxWaXJ0dWFsQ2FsbFRhcmdldD4gVGFyZ2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEFsbG9jQmVmb3JlLCB1bnNpZ25lZCBCaXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgJk9mZnNldEJ5dGUsIHVpbnQ2NF90ICZPZmZzZXRCaXQpOworCisvLyBTZXQgdGhlIHN0b3JlZCB2YWx1ZSBpbiBlYWNoIG9mIFRhcmdldHMgdG8gVmlydHVhbENhbGxUYXJnZXQ6OlJldFZhbCBhdCB0aGUKKy8vIGdpdmVuIGFsbG9jYXRpb24gb2Zmc2V0IGFmdGVyIHRoZSB2dGFibGUgYWRkcmVzcy4gU3RvcmVzIHRoZSBjb21wdXRlZAorLy8gYnl0ZS9iaXQgb2Zmc2V0IHRvIE9mZnNldEJ5dGUvT2Zmc2V0Qml0Lgordm9pZCBzZXRBZnRlclJldHVyblZhbHVlcyhNdXRhYmxlQXJyYXlSZWY8VmlydHVhbENhbGxUYXJnZXQ+IFRhcmdldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEFsbG9jQWZ0ZXIsIHVuc2lnbmVkIEJpdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICZPZmZzZXRCeXRlLCB1aW50NjRfdCAmT2Zmc2V0Qml0KTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHdob2xlcHJvZ3JhbWRldmlydAorCitzdHJ1Y3QgV2hvbGVQcm9ncmFtRGV2aXJ0UGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPFdob2xlUHJvZ3JhbURldmlydFBhc3M+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICYpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19JUE9fV0hPTEVQUk9HUkFNREVWSVJUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkMjJkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8vPT09LSBJbnN0Q29tYmluZS5oIC0gSW5zdENvbWJpbmUgcGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLworLy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgcHJpbWFyeSBpbnRlcmZhY2UgdG8gdGhlIGluc3Rjb21iaW5lIHBhc3MuIFRoaXMgcGFzcworLy8vIGlzIHN1aXRhYmxlIGZvciB1c2UgaW4gdGhlIG5ldyBwYXNzIG1hbmFnZXIuIEZvciBhIHBhc3MgdGhhdCB3b3JrcyB3aXRoIHRoZQorLy8vIGxlZ2FjeSBwYXNzIG1hbmFnZXIsIHBsZWFzZSBsb29rIGZvciBcYyBjcmVhdGVJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3MoKSBpbgorLy8vIFNjYWxhci5oLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JTlNUQ09NQklORV9JTlNUQ09NQklORV9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JTlNUQ09NQklORV9JTlNUQ09NQklORV9ICisKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZVdvcmtsaXN0LmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgSW5zdENvbWJpbmVQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48SW5zdENvbWJpbmVQYXNzPiB7CisgIEluc3RDb21iaW5lV29ya2xpc3QgV29ya2xpc3Q7CisgIGJvb2wgRXhwZW5zaXZlQ29tYmluZXM7CisKK3B1YmxpYzoKKyAgc3RhdGljIFN0cmluZ1JlZiBuYW1lKCkgeyByZXR1cm4gIkluc3RDb21iaW5lUGFzcyI7IH0KKworICBleHBsaWNpdCBJbnN0Q29tYmluZVBhc3MoYm9vbCBFeHBlbnNpdmVDb21iaW5lcyA9IHRydWUpCisgICAgICA6IEV4cGVuc2l2ZUNvbWJpbmVzKEV4cGVuc2l2ZUNvbWJpbmVzKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBcYnJpZWYgVGhlIGxlZ2FjeSBwYXNzIG1hbmFnZXIncyBpbnN0Y29tYmluZSBwYXNzLgorLy8vCisvLy8gVGhpcyBpcyBhIGJhc2ljIHdob2xlLWZ1bmN0aW9uIHdyYXBwZXIgYXJvdW5kIHRoZSBpbnN0Y29tYmluZSB1dGlsaXR5LiBJdAorLy8vIHdpbGwgdHJ5IHRvIGNvbWJpbmUgYWxsIGluc3RydWN0aW9ucyBpbiB0aGUgZnVuY3Rpb24uCitjbGFzcyBJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgSW5zdENvbWJpbmVXb3JrbGlzdCBXb3JrbGlzdDsKKyAgY29uc3QgYm9vbCBFeHBlbnNpdmVDb21iaW5lczsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorCisgIEluc3RydWN0aW9uQ29tYmluaW5nUGFzcyhib29sIEV4cGVuc2l2ZUNvbWJpbmVzID0gdHJ1ZSkKKyAgICAgIDogRnVuY3Rpb25QYXNzKElEKSwgRXhwZW5zaXZlQ29tYmluZXMoRXhwZW5zaXZlQ29tYmluZXMpIHsKKyAgICBpbml0aWFsaXplSW5zdHJ1Y3Rpb25Db21iaW5pbmdQYXNzUGFzcygqUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKSk7CisgIH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdENvbWJpbmVXb3JrbGlzdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lV29ya2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzFlODkxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lV29ya2xpc3QuaApAQCAtMCwwICsxLDEwOSBAQAorLy89PT0tIEluc3RDb21iaW5lV29ya2xpc3QuaCAtIFdvcmtsaXN0IGZvciBJbnN0Q29tYmluZSBwYXNzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSU5TVENPTUJJTkVfSU5TVENPTUJJTkVXT1JLTElTVF9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JTlNUQ09NQklORV9JTlNUQ09NQklORVdPUktMSVNUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiaW5zdGNvbWJpbmUiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEluc3RDb21iaW5lV29ya2xpc3QgLSBUaGlzIGlzIHRoZSB3b3JrbGlzdCBtYW5hZ2VtZW50IGxvZ2ljIGZvcgorLy8vIEluc3RDb21iaW5lLgorY2xhc3MgSW5zdENvbWJpbmVXb3JrbGlzdCB7CisgIFNtYWxsVmVjdG9yPEluc3RydWN0aW9uKiwgMjU2PiBXb3JrbGlzdDsKKyAgRGVuc2VNYXA8SW5zdHJ1Y3Rpb24qLCB1bnNpZ25lZD4gV29ya2xpc3RNYXA7CisKK3B1YmxpYzoKKyAgSW5zdENvbWJpbmVXb3JrbGlzdCgpID0gZGVmYXVsdDsKKworICBJbnN0Q29tYmluZVdvcmtsaXN0KEluc3RDb21iaW5lV29ya2xpc3QgJiYpID0gZGVmYXVsdDsKKyAgSW5zdENvbWJpbmVXb3JrbGlzdCAmb3BlcmF0b3I9KEluc3RDb21iaW5lV29ya2xpc3QgJiYpID0gZGVmYXVsdDsKKworICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBXb3JrbGlzdC5lbXB0eSgpOyB9CisKKyAgLy8vIEFkZCAtIEFkZCB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIHRvIHRoZSB3b3JrbGlzdCBpZiBpdCBpc24ndCBhbHJlYWR5CisgIC8vLyBpbiBpdC4KKyAgdm9pZCBBZGQoSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICBpZiAoV29ya2xpc3RNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEksIFdvcmtsaXN0LnNpemUoKSkpLnNlY29uZCkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJJQzogQUREOiAiIDw8ICpJIDw8ICdcbicpOworICAgICAgV29ya2xpc3QucHVzaF9iYWNrKEkpOworICAgIH0KKyAgfQorCisgIHZvaWQgQWRkVmFsdWUoVmFsdWUgKlYpIHsKKyAgICBpZiAoSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVikpCisgICAgICBBZGQoSSk7CisgIH0KKworICAvLy8gQWRkSW5pdGlhbEdyb3VwIC0gQWRkIHRoZSBzcGVjaWZpZWQgYmF0Y2ggb2Ygc3R1ZmYgaW4gcmV2ZXJzZSBvcmRlci4KKyAgLy8vIHdoaWNoIHNob3VsZCBvbmx5IGJlIGRvbmUgd2hlbiB0aGUgd29ya2xpc3QgaXMgZW1wdHkgYW5kIHdoZW4gdGhlIGdyb3VwCisgIC8vLyBoYXMgbm8gZHVwbGljYXRlcy4KKyAgdm9pZCBBZGRJbml0aWFsR3JvdXAoQXJyYXlSZWY8SW5zdHJ1Y3Rpb24gKj4gTGlzdCkgeworICAgIGFzc2VydChXb3JrbGlzdC5lbXB0eSgpICYmICJXb3JrbGlzdCBtdXN0IGJlIGVtcHR5IHRvIGFkZCBpbml0aWFsIGdyb3VwIik7CisgICAgV29ya2xpc3QucmVzZXJ2ZShMaXN0LnNpemUoKSsxNik7CisgICAgV29ya2xpc3RNYXAucmVzZXJ2ZShMaXN0LnNpemUoKSk7CisgICAgREVCVUcoZGJncygpIDw8ICJJQzogQURESU5HOiAiIDw8IExpc3Quc2l6ZSgpIDw8ICIgaW5zdHJzIHRvIHdvcmtsaXN0XG4iKTsKKyAgICB1bnNpZ25lZCBJZHggPSAwOworICAgIGZvciAoSW5zdHJ1Y3Rpb24gKkkgOiByZXZlcnNlKExpc3QpKSB7CisgICAgICBXb3JrbGlzdE1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoSSwgSWR4KyspKTsKKyAgICAgIFdvcmtsaXN0LnB1c2hfYmFjayhJKTsKKyAgICB9CisgIH0KKworICAvLyBSZW1vdmUgLSByZW1vdmUgSSBmcm9tIHRoZSB3b3JrbGlzdCBpZiBpdCBleGlzdHMuCisgIHZvaWQgUmVtb3ZlKEluc3RydWN0aW9uICpJKSB7CisgICAgRGVuc2VNYXA8SW5zdHJ1Y3Rpb24qLCB1bnNpZ25lZD46Oml0ZXJhdG9yIEl0ID0gV29ya2xpc3RNYXAuZmluZChJKTsKKyAgICBpZiAoSXQgPT0gV29ya2xpc3RNYXAuZW5kKCkpIHJldHVybjsgLy8gTm90IGluIHdvcmtsaXN0LgorCisgICAgLy8gRG9uJ3QgYm90aGVyIG1vdmluZyBldmVyeXRoaW5nIGRvd24sIGp1c3QgbnVsbCBvdXQgdGhlIHNsb3QuCisgICAgV29ya2xpc3RbSXQtPnNlY29uZF0gPSBudWxscHRyOworCisgICAgV29ya2xpc3RNYXAuZXJhc2UoSXQpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKlJlbW92ZU9uZSgpIHsKKyAgICBJbnN0cnVjdGlvbiAqSSA9IFdvcmtsaXN0LnBvcF9iYWNrX3ZhbCgpOworICAgIFdvcmtsaXN0TWFwLmVyYXNlKEkpOworICAgIHJldHVybiBJOworICB9CisKKyAgLy8vIEFkZFVzZXJzVG9Xb3JrTGlzdCAtIFdoZW4gYW4gaW5zdHJ1Y3Rpb24gaXMgc2ltcGxpZmllZCwgYWRkIGFsbCB1c2VycyBvZgorICAvLy8gdGhlIGluc3RydWN0aW9uIHRvIHRoZSB3b3JrIGxpc3RzIGJlY2F1c2UgdGhleSBtaWdodCBnZXQgbW9yZSBzaW1wbGlmaWVkCisgIC8vLyBub3cuCisgIC8vLworICB2b2lkIEFkZFVzZXJzVG9Xb3JrTGlzdChJbnN0cnVjdGlvbiAmSSkgeworICAgIGZvciAoVXNlciAqVSA6IEkudXNlcnMoKSkKKyAgICAgIEFkZChjYXN0PEluc3RydWN0aW9uPihVKSk7CisgIH0KKworCisgIC8vLyBaYXAgLSBjaGVjayB0aGF0IHRoZSB3b3JrbGlzdCBpcyBlbXB0eSBhbmQgbnVrZSB0aGUgYmFja2luZyBzdG9yZSBmb3IKKyAgLy8vIHRoZSBtYXAgaWYgaXQgaXMgbGFyZ2UuCisgIHZvaWQgWmFwKCkgeworICAgIGFzc2VydChXb3JrbGlzdE1hcC5lbXB0eSgpICYmICJXb3JrbGlzdCBlbXB0eSwgYnV0IG1hcCBub3Q/Iik7CisKKyAgICAvLyBEbyBhbiBleHBsaWNpdCBjbGVhciwgdGhpcyBzaHJpbmtzIHRoZSBtYXAgaWYgbmVlZGVkLgorICAgIFdvcmtsaXN0TWFwLmNsZWFyKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtLgorCisjdW5kZWYgREVCVUdfVFlQRQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWUxM2YxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi5oCkBAIC0wLDAgKzEsMjExIEBACisvLz09PS0gVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24uaCAtIEluc3RydW1lbnRhdGlvbiBwYXNzZXMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyBmb3IgaW5zdHJ1bWVudGF0aW9uIHBhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JTlNUUlVNRU5UQVRJT05fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfSU5TVFJVTUVOVEFUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvblBhc3M7CitjbGFzcyBNb2R1bGVQYXNzOworY2xhc3MgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlcjsKKworLy8vIEluc3RydW1lbnRhdGlvbiBwYXNzZXMgb2Z0ZW4gaW5zZXJ0IGNvbmRpdGlvbmFsIGNoZWNrcyBpbnRvIGVudHJ5IGJsb2Nrcy4KKy8vLyBDYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIHNwbGl0dGluZyB0aGUgZW50cnkgYmxvY2sgdG8gbW92ZSBpbnN0cnVjdGlvbnMKKy8vLyB0aGF0IG11c3QgcmVtYWluIGluIHRoZSBlbnRyeSBibG9jayB1cCBiZWZvcmUgdGhlIHNwbGl0IHBvaW50LiBTdGF0aWMKKy8vLyBhbGxvY2FzIGFuZCBsbHZtLmxvY2FsZXNjYXBlIGNhbGxzLCBmb3IgZXhhbXBsZSwgbXVzdCByZW1haW4gaW4gdGhlIGVudHJ5CisvLy8gYmxvY2suCitCYXNpY0Jsb2NrOjppdGVyYXRvciBQcmVwYXJlVG9TcGxpdEVudHJ5QmxvY2soQmFzaWNCbG9jayAmQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSVApOworCisvLyBJbnNlcnQgR0NPViBwcm9maWxpbmcgaW5zdHJ1bWVudGF0aW9uCitzdHJ1Y3QgR0NPVk9wdGlvbnMgeworICBzdGF0aWMgR0NPVk9wdGlvbnMgZ2V0RGVmYXVsdCgpOworCisgIC8vIFNwZWNpZnkgd2hldGhlciB0byBlbWl0IC5nY25vIGZpbGVzLgorICBib29sIEVtaXROb3RlczsKKworICAvLyBTcGVjaWZ5IHdoZXRoZXIgdG8gbW9kaWZ5IHRoZSBwcm9ncmFtIHRvIGVtaXQgLmdjZGEgZmlsZXMgd2hlbiBydW4uCisgIGJvb2wgRW1pdERhdGE7CisKKyAgLy8gQSBmb3VyLWJ5dGUgdmVyc2lvbiBzdHJpbmcuIFRoZSBtZWFuaW5nIG9mIGEgdmVyc2lvbiBzdHJpbmcgaXMgZGVzY3JpYmVkIGluCisgIC8vIGdjYydzIGdjb3YtaW8uaAorICBjaGFyIFZlcnNpb25bNF07CisKKyAgLy8gRW1pdCBhICJjZmcgY2hlY2tzdW0iIHRoYXQgZm9sbG93cyB0aGUgImxpbmUgbnVtYmVyIGNoZWNrc3VtIiBvZiBhCisgIC8vIGZ1bmN0aW9uLiBUaGlzIGFmZmVjdHMgYm90aCAuZ2NubyBhbmQgLmdjZGEgZmlsZXMuCisgIGJvb2wgVXNlQ2ZnQ2hlY2tzdW07CisKKyAgLy8gQWRkIHRoZSAnbm9yZWR6b25lJyBhdHRyaWJ1dGUgdG8gYWRkZWQgcnVudGltZSBsaWJyYXJ5IGNhbGxzLgorICBib29sIE5vUmVkWm9uZTsKKworICAvLyBFbWl0IHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgLmdjZGEgZmlsZXMuIFRoaXMgaXMgcmVkdW5kYW50LCBhcworICAvLyB0aGUgZnVuY3Rpb24gaWRlbnRpZmllciBjYW4gYmUgdXNlZCB0byBmaW5kIHRoZSBuYW1lIGZyb20gdGhlIC5nY25vIGZpbGUuCisgIGJvb2wgRnVuY3Rpb25OYW1lc0luRGF0YTsKKworICAvLyBFbWl0IHRoZSBleGl0IGJsb2NrIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBzdGFydCBibG9jaywgcmF0aGVyIHRoYW4gYWZ0ZXIKKyAgLy8gYWxsIG9mIHRoZSBmdW5jdGlvbiBib2R5J3MgYmxvY2tzLgorICBib29sIEV4aXRCbG9ja0JlZm9yZUJvZHk7Cit9OworCitNb2R1bGVQYXNzICpjcmVhdGVHQ09WUHJvZmlsZXJQYXNzKGNvbnN0IEdDT1ZPcHRpb25zICZPcHRpb25zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NPVk9wdGlvbnM6OmdldERlZmF1bHQoKSk7CisKKy8vIFBHTyBJbnN0cnVtZW50aW9uCitNb2R1bGVQYXNzICpjcmVhdGVQR09JbnN0cnVtZW50YXRpb25HZW5MZWdhY3lQYXNzKCk7CitNb2R1bGVQYXNzICoKK2NyZWF0ZVBHT0luc3RydW1lbnRhdGlvblVzZUxlZ2FjeVBhc3MoU3RyaW5nUmVmIEZpbGVuYW1lID0gU3RyaW5nUmVmKCIiKSk7CitNb2R1bGVQYXNzICpjcmVhdGVQR09JbmRpcmVjdENhbGxQcm9tb3Rpb25MZWdhY3lQYXNzKGJvb2wgSW5MVE8gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTYW1wbGVQR08gPSBmYWxzZSk7CitGdW5jdGlvblBhc3MgKmNyZWF0ZVBHT01lbU9QU2l6ZU9wdExlZ2FjeVBhc3MoKTsKKworLy8gVGhlIHBnby1zcGVjaWZpYyBpbmRpcmVjdCBjYWxsIHByb21vdGlvbiBmdW5jdGlvbiBkZWNsYXJlZCBiZWxvdyBpcyB1c2VkIGJ5CisvLyB0aGUgcGdvLWRyaXZlbiBpbmRpcmVjdCBjYWxsIHByb21vdGlvbiBhbmQgc2FtcGxlIHByb2ZpbGUgcGFzc2VzLiBJdCdzIGEKKy8vIHdyYXBwZXIgYXJvdW5kIGxsdm06OnByb21vdGVDYWxsLCBldCBhbC4gdGhhdCBhZGRpdGlvbmFsbHkgY29tcHV0ZXMgIXByb2YKKy8vIG1ldGFkYXRhLiBXZSBwbGFjZSBpdCBpbiBhIHBnbyBuYW1lc3BhY2Ugc28gaXQncyBub3QgY29uZnVzZWQgd2l0aCB0aGUKKy8vIGdlbmVyaWMgdXRpbGl0aWVzLgorbmFtZXNwYWNlIHBnbyB7CisKKy8vIEhlbHBlciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgSW5zdCAoZWl0aGVyIGFuIGluZGlyZWN0LWNhbGwgaW5zdHJ1Y3Rpb24sIG9yCisvLyBhbiBpbnZva2UgaW5zdHJ1Y3Rpb24gLCB0byBhIGNvbmRpdGlvbmFsIGNhbGwgdG8gRi4gVGhpcyBpcyBsaWtlOgorLy8gICAgIGlmIChJbnN0LkNhbGxlZFZhbHVlID09IEYpCisvLyAgICAgICAgRiguLi4pOworLy8gICAgIGVsc2UKKy8vICAgICAgICBJbnN0KC4uLik7CisvLyAgICAgZW5kCisvLyBUb3RhbENvdW50IGlzIHRoZSBwcm9maWxlIGNvdW50IHZhbHVlIHRoYXQgdGhlIGluc3RydWN0aW9uIGV4ZWN1dGVzLgorLy8gQ291bnQgaXMgdGhlIHByb2ZpbGUgY291bnQgdmFsdWUgdGhhdCBGIGlzIHRoZSB0YXJnZXQgZnVuY3Rpb24uCisvLyBUaGVzZSB0d28gdmFsdWVzIGFyZSB1c2VkIHRvIHVwZGF0ZSB0aGUgYnJhbmNoIHdlaWdodC4KKy8vIElmIFxwIEF0dGFjaFByb2ZUb0RpcmVjdENhbGwgaXMgdHJ1ZSwgYSBwcm9mIG1ldGFkYXRhIGlzIGF0dGFjaGVkIHRvIHRoZQorLy8gbmV3IGRpcmVjdCBjYWxsIHRvIGNvbnRhaW4gXHAgQ291bnQuCisvLyBSZXR1cm5zIHRoZSBwcm9tb3RlZCBkaXJlY3QgY2FsbCBpbnN0cnVjdGlvbi4KK0luc3RydWN0aW9uICpwcm9tb3RlSW5kaXJlY3RDYWxsKEluc3RydWN0aW9uICpJbnN0LCBGdW5jdGlvbiAqRiwgdWludDY0X3QgQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBUb3RhbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBdHRhY2hQcm9mVG9EaXJlY3RDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAqT1JFKTsKK30gLy8gbmFtZXNwYWNlIHBnbworCisvLy8gT3B0aW9ucyBmb3IgdGhlIGZyb250ZW5kIGluc3RydW1lbnRhdGlvbiBiYXNlZCBwcm9maWxpbmcgcGFzcy4KK3N0cnVjdCBJbnN0clByb2ZPcHRpb25zIHsKKyAgLy8gQWRkIHRoZSAnbm9yZWR6b25lJyBhdHRyaWJ1dGUgdG8gYWRkZWQgcnVudGltZSBsaWJyYXJ5IGNhbGxzLgorICBib29sIE5vUmVkWm9uZSA9IGZhbHNlOworCisgIC8vIERvIGNvdW50ZXIgcmVnaXN0ZXIgcHJvbW90aW9uCisgIGJvb2wgRG9Db3VudGVyUHJvbW90aW9uID0gZmFsc2U7CisKKyAgLy8gTmFtZSBvZiB0aGUgcHJvZmlsZSBmaWxlIHRvIHVzZSBhcyBvdXRwdXQKKyAgc3RkOjpzdHJpbmcgSW5zdHJQcm9maWxlT3V0cHV0OworCisgIEluc3RyUHJvZk9wdGlvbnMoKSA9IGRlZmF1bHQ7Cit9OworCisvLy8gSW5zZXJ0IGZyb250ZW5kIGluc3RydW1lbnRhdGlvbiBiYXNlZCBwcm9maWxpbmcuCitNb2R1bGVQYXNzICpjcmVhdGVJbnN0clByb2ZpbGluZ0xlZ2FjeVBhc3MoCisgICAgY29uc3QgSW5zdHJQcm9mT3B0aW9ucyAmT3B0aW9ucyA9IEluc3RyUHJvZk9wdGlvbnMoKSk7CisKKy8vIEluc2VydCBBZGRyZXNzU2FuaXRpemVyIChhZGRyZXNzIHNhbml0eSBjaGVja2luZykgaW5zdHJ1bWVudGF0aW9uCitGdW5jdGlvblBhc3MgKmNyZWF0ZUFkZHJlc3NTYW5pdGl6ZXJGdW5jdGlvblBhc3MoYm9vbCBDb21waWxlS2VybmVsID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZWNvdmVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVc2VBZnRlclNjb3BlID0gZmFsc2UpOworTW9kdWxlUGFzcyAqY3JlYXRlQWRkcmVzc1Nhbml0aXplck1vZHVsZVBhc3MoYm9vbCBDb21waWxlS2VybmVsID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJlY292ZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVXNlR2xvYmFsc0dDID0gdHJ1ZSk7CisKKy8vIEluc2VydCBNZW1vcnlTYW5pdGl6ZXIgaW5zdHJ1bWVudGF0aW9uIChkZXRlY3Rpb24gb2YgdW5pbml0aWFsaXplZCByZWFkcykKK0Z1bmN0aW9uUGFzcyAqY3JlYXRlTWVtb3J5U2FuaXRpemVyUGFzcyhpbnQgVHJhY2tPcmlnaW5zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJlY292ZXIgPSBmYWxzZSk7CisKK0Z1bmN0aW9uUGFzcyAqY3JlYXRlSFdBZGRyZXNzU2FuaXRpemVyUGFzcyhib29sIFJlY292ZXIgPSBmYWxzZSk7CisKKy8vIEluc2VydCBUaHJlYWRTYW5pdGl6ZXIgKHJhY2UgZGV0ZWN0aW9uKSBpbnN0cnVtZW50YXRpb24KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlVGhyZWFkU2FuaXRpemVyUGFzcygpOworCisvLyBJbnNlcnQgRGF0YUZsb3dTYW5pdGl6ZXIgKGR5bmFtaWMgZGF0YSBmbG93IGFuYWx5c2lzKSBpbnN0cnVtZW50YXRpb24KK01vZHVsZVBhc3MgKmNyZWF0ZURhdGFGbG93U2FuaXRpemVyUGFzcygKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJkFCSUxpc3RGaWxlcyA9IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPigpLAorICAgIHZvaWQgKigqZ2V0QXJnVExTKSgpID0gbnVsbHB0ciwgdm9pZCAqKCpnZXRSZXRWYWxUTFMpKCkgPSBudWxscHRyKTsKKworLy8gT3B0aW9ucyBmb3IgRWZmaWNpZW5jeVNhbml0aXplciBzdWItdG9vbHMuCitzdHJ1Y3QgRWZmaWNpZW5jeVNhbml0aXplck9wdGlvbnMgeworICBlbnVtIFR5cGUgeworICAgIEVTQU5fTm9uZSA9IDAsCisgICAgRVNBTl9DYWNoZUZyYWcsCisgICAgRVNBTl9Xb3JraW5nU2V0LAorICB9IFRvb2xUeXBlID0gRVNBTl9Ob25lOworCisgIEVmZmljaWVuY3lTYW5pdGl6ZXJPcHRpb25zKCkgPSBkZWZhdWx0OworfTsKKworLy8gSW5zZXJ0IEVmZmljaWVuY3lTYW5pdGl6ZXIgaW5zdHJ1bWVudGF0aW9uLgorTW9kdWxlUGFzcyAqY3JlYXRlRWZmaWNpZW5jeVNhbml0aXplclBhc3MoCisgICAgY29uc3QgRWZmaWNpZW5jeVNhbml0aXplck9wdGlvbnMgJk9wdGlvbnMgPSBFZmZpY2llbmN5U2FuaXRpemVyT3B0aW9ucygpKTsKKworLy8gT3B0aW9ucyBmb3Igc2FuaXRpemVyIGNvdmVyYWdlIGluc3RydW1lbnRhdGlvbi4KK3N0cnVjdCBTYW5pdGl6ZXJDb3ZlcmFnZU9wdGlvbnMgeworICBlbnVtIFR5cGUgeworICAgIFNDS19Ob25lID0gMCwKKyAgICBTQ0tfRnVuY3Rpb24sCisgICAgU0NLX0JCLAorICAgIFNDS19FZGdlCisgIH0gQ292ZXJhZ2VUeXBlID0gU0NLX05vbmU7CisgIGJvb2wgSW5kaXJlY3RDYWxscyA9IGZhbHNlOworICBib29sIFRyYWNlQkIgPSBmYWxzZTsKKyAgYm9vbCBUcmFjZUNtcCA9IGZhbHNlOworICBib29sIFRyYWNlRGl2ID0gZmFsc2U7CisgIGJvb2wgVHJhY2VHZXAgPSBmYWxzZTsKKyAgYm9vbCBVc2U4Yml0Q291bnRlcnMgPSBmYWxzZTsKKyAgYm9vbCBUcmFjZVBDID0gZmFsc2U7CisgIGJvb2wgVHJhY2VQQ0d1YXJkID0gZmFsc2U7CisgIGJvb2wgSW5saW5lOGJpdENvdW50ZXJzID0gZmFsc2U7CisgIGJvb2wgUENUYWJsZSA9IGZhbHNlOworICBib29sIE5vUHJ1bmUgPSBmYWxzZTsKKyAgYm9vbCBTdGFja0RlcHRoID0gZmFsc2U7CisKKyAgU2FuaXRpemVyQ292ZXJhZ2VPcHRpb25zKCkgPSBkZWZhdWx0OworfTsKKworLy8gSW5zZXJ0IFNhbml0aXplckNvdmVyYWdlIGluc3RydW1lbnRhdGlvbi4KK01vZHVsZVBhc3MgKmNyZWF0ZVNhbml0aXplckNvdmVyYWdlTW9kdWxlUGFzcygKKyAgICBjb25zdCBTYW5pdGl6ZXJDb3ZlcmFnZU9wdGlvbnMgJk9wdGlvbnMgPSBTYW5pdGl6ZXJDb3ZlcmFnZU9wdGlvbnMoKSk7CisKKy8vLyBcYnJpZWYgQ2FsY3VsYXRlIHdoYXQgdG8gZGl2aWRlIGJ5IHRvIHNjYWxlIGNvdW50cy4KKy8vLworLy8vIEdpdmVuIHRoZSBtYXhpbXVtIGNvdW50LCBjYWxjdWxhdGUgYSBkaXZpc29yIHRoYXQgd2lsbCBzY2FsZSBhbGwgdGhlCisvLy8gd2VpZ2h0cyB0byBzdHJpY3RseSBsZXNzIHRoYW4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpLgorc3RhdGljIGlubGluZSB1aW50NjRfdCBjYWxjdWxhdGVDb3VudFNjYWxlKHVpbnQ2NF90IE1heENvdW50KSB7CisgIHJldHVybiBNYXhDb3VudCA8IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKQorICAgICAgICAgICAgID8gMQorICAgICAgICAgICAgIDogTWF4Q291bnQgLyBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkgKyAxOworfQorCisvLy8gXGJyaWVmIFNjYWxlIGFuIGluZGl2aWR1YWwgYnJhbmNoIGNvdW50LgorLy8vCisvLy8gU2NhbGUgYSA2NC1iaXQgd2VpZ2h0IGRvd24gdG8gMzItYml0cyB1c2luZyBcYyBTY2FsZS4KKy8vLworc3RhdGljIGlubGluZSB1aW50MzJfdCBzY2FsZUJyYW5jaENvdW50KHVpbnQ2NF90IENvdW50LCB1aW50NjRfdCBTY2FsZSkgeworICB1aW50NjRfdCBTY2FsZWQgPSBDb3VudCAvIFNjYWxlOworICBhc3NlcnQoU2NhbGVkIDw9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSAmJiAib3ZlcmZsb3cgMzItYml0cyIpOworICByZXR1cm4gU2NhbGVkOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lOU1RSVU1FTlRBVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uL0JvdW5kc0NoZWNraW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uL0JvdW5kc0NoZWNraW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0ZjYyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24vQm91bmRzQ2hlY2tpbmcuaApAQCAtMCwwICsxLDI5IEBACisvLz09PS0gQm91bmRzQ2hlY2tpbmcuaCAtIEJvdW5kcyBjaGVja2luZyBpbnN0cnVtZW50YXRpb24gLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JTlNUUlVNRU5UQVRJT05fQk9VTkRTQ0hFQ0tJTkdfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfSU5TVFJVTUVOVEFUSU9OX0JPVU5EU0NIRUNLSU5HX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQSBwYXNzIHRvIGluc3RydW1lbnQgY29kZSBhbmQgcGVyZm9ybSBydW4tdGltZSBib3VuZHMgY2hlY2tpbmcgb24gbG9hZHMsCisvLy8gc3RvcmVzLCBhbmQgb3RoZXIgbWVtb3J5IGludHJpbnNpY3MuCitzdHJ1Y3QgQm91bmRzQ2hlY2tpbmdQYXNzIDogUGFzc0luZm9NaXhpbjxCb3VuZHNDaGVja2luZ1Bhc3M+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworCisvLy8gTGVnYWN5IHBhc3MgY3JlYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBhYm92ZSBwYXNzLgorRnVuY3Rpb25QYXNzICpjcmVhdGVCb3VuZHNDaGVja2luZ0xlZ2FjeVBhc3MoKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19JTlNUUlVNRU5UQVRJT05fQk9VTkRTQ0hFQ0tJTkdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9HQ09WUHJvZmlsZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24vR0NPVlByb2ZpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ1NWZiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24vR0NPVlByb2ZpbGVyLmgKQEAgLTAsMCArMSwzMSBAQAorLy89PT0tIFRyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uL0dDT1ZQcm9maWxlci5oIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgR0NPViBzdHlsZSBwcm9maWxlciAgcGFzcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0dDT1ZQUk9GSUxFUl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19HQ09WUFJPRklMRVJfSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24uaCIKKworbmFtZXNwYWNlIGxsdm0geworLy8vIFRoZSBnY292LXN0eWxlIGluc3RydW1lbnRhdGlvbiBwYXNzCitjbGFzcyBHQ09WUHJvZmlsZXJQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48R0NPVlByb2ZpbGVyUGFzcz4geworcHVibGljOgorICBHQ09WUHJvZmlsZXJQYXNzKGNvbnN0IEdDT1ZPcHRpb25zICZPcHRpb25zID0gR0NPVk9wdGlvbnM6OmdldERlZmF1bHQoKSkgOiBHQ09WT3B0cyhPcHRpb25zKSB7IH0KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7CisKK3ByaXZhdGU6CisgIEdDT1ZPcHRpb25zIEdDT1ZPcHRzOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9JbnN0clByb2ZpbGluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9JbnN0clByb2ZpbGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZmIzZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uL0luc3RyUHJvZmlsaW5nLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8vPT09LSBUcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9JbnN0clByb2ZpbGluZy5oIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBmb3IgTExWTSdzIFBHTyBJbnN0cnVtZW50YXRpb24gbG93ZXJpbmcKKy8vLyBwYXNzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSU5TVFJQUk9GSUxJTkdfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfSU5TVFJQUk9GSUxJTkdfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2YuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uLmgiCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOwordXNpbmcgTG9hZFN0b3JlUGFpciA9IHN0ZDo6cGFpcjxJbnN0cnVjdGlvbiAqLCBJbnN0cnVjdGlvbiAqPjsKKworLy8vIEluc3RydW1lbnRhdGlvbiBiYXNlZCBwcm9maWxpbmcgbG93ZXJpbmcgcGFzcy4gVGhpcyBwYXNzIGxvd2VycworLy8vIHRoZSBwcm9maWxlIGluc3RydW1lbnRlZCBjb2RlIGdlbmVyYXRlZCBieSBGRSBvciB0aGUgSVIgYmFzZWQKKy8vLyBpbnN0cnVtZW50YXRpb24gcGFzcy4KK2NsYXNzIEluc3RyUHJvZmlsaW5nIDogcHVibGljIFBhc3NJbmZvTWl4aW48SW5zdHJQcm9maWxpbmc+IHsKK3B1YmxpYzoKKyAgSW5zdHJQcm9maWxpbmcoKSA9IGRlZmF1bHQ7CisgIEluc3RyUHJvZmlsaW5nKGNvbnN0IEluc3RyUHJvZk9wdGlvbnMgJk9wdGlvbnMpIDogT3B0aW9ucyhPcHRpb25zKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworICBib29sIHJ1bihNb2R1bGUgJk0sIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICZUTEkpOworCitwcml2YXRlOgorICBJbnN0clByb2ZPcHRpb25zIE9wdGlvbnM7CisgIE1vZHVsZSAqTTsKKyAgVHJpcGxlIFRUOworICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJOworICBzdHJ1Y3QgUGVyRnVuY3Rpb25Qcm9maWxlRGF0YSB7CisgICAgdWludDMyX3QgTnVtVmFsdWVTaXRlc1tJUFZLX0xhc3QgKyAxXTsKKyAgICBHbG9iYWxWYXJpYWJsZSAqUmVnaW9uQ291bnRlcnMgPSBudWxscHRyOworICAgIEdsb2JhbFZhcmlhYmxlICpEYXRhVmFyID0gbnVsbHB0cjsKKworICAgIFBlckZ1bmN0aW9uUHJvZmlsZURhdGEoKSB7CisgICAgICBtZW1zZXQoTnVtVmFsdWVTaXRlcywgMCwgc2l6ZW9mKHVpbnQzMl90KSAqIChJUFZLX0xhc3QgKyAxKSk7CisgICAgfQorICB9OworICBEZW5zZU1hcDxHbG9iYWxWYXJpYWJsZSAqLCBQZXJGdW5jdGlvblByb2ZpbGVEYXRhPiBQcm9maWxlRGF0YU1hcDsKKyAgc3RkOjp2ZWN0b3I8R2xvYmFsVmFsdWUgKj4gVXNlZFZhcnM7CisgIHN0ZDo6dmVjdG9yPEdsb2JhbFZhcmlhYmxlICo+IFJlZmVyZW5jZWROYW1lczsKKyAgR2xvYmFsVmFyaWFibGUgKk5hbWVzVmFyOworICBzaXplX3QgTmFtZXNTaXplOworCisgIC8vIHZlY3RvciBvZiBjb3VudGVyIGxvYWQvc3RvcmUgcGFpcnMgdG8gYmUgcmVnaXN0ZXIgcHJvbW90ZWQuCisgIHN0ZDo6dmVjdG9yPExvYWRTdG9yZVBhaXI+IFByb21vdGlvbkNhbmRpZGF0ZXM7CisKKyAgLy8gVGhlIHN0YXJ0IHZhbHVlIG9mIHByZWNpc2UgdmFsdWUgcHJvZmlsZSByYW5nZSBmb3IgbWVtb3J5IGludHJpbnNpYyBzaXplcy4KKyAgaW50NjRfdCBNZW1PUFNpemVSYW5nZVN0YXJ0OworICAvLyBUaGUgZW5kIHZhbHVlIG9mIHByZWNpc2UgdmFsdWUgcHJvZmlsZSByYW5nZSBmb3IgbWVtb3J5IGludHJpbnNpYyBzaXplcy4KKyAgaW50NjRfdCBNZW1PUFNpemVSYW5nZUxhc3Q7CisKKyAgaW50NjRfdCBUb3RhbENvdW50ZXJzUHJvbW90ZWQgPSAwOworCisgIC8vLyBMb3dlciBpbnN0cnVtZW50YXRpb24gaW50cmluc2ljcyBpbiB0aGUgZnVuY3Rpb24uIFJldHVybnMgdHJ1ZSBpZiB0aGVyZQorICAvLy8gYW55IGxvd2VyaW5nLgorICBib29sIGxvd2VySW50cmluc2ljcyhGdW5jdGlvbiAqRik7CisKKyAgLy8vIFJlZ2lzdGVyLXByb21vdGUgY291bnRlciBsb2FkcyBhbmQgc3RvcmVzIGluIGxvb3BzLgorICB2b2lkIHByb21vdGVDb3VudGVyTG9hZFN0b3JlcyhGdW5jdGlvbiAqRik7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBwcm9maWxlIGNvdW50ZXIgdXBkYXRlIHJlZ2lzdGVyIHByb21vdGlvbiBpcyBlbmFibGVkLgorICBib29sIGlzQ291bnRlclByb21vdGlvbkVuYWJsZWQoKSBjb25zdDsKKworICAvLy8gQ291bnQgdGhlIG51bWJlciBvZiBpbnN0cnVtZW50ZWQgdmFsdWUgc2l0ZXMgZm9yIHRoZSBmdW5jdGlvbi4KKyAgdm9pZCBjb21wdXRlTnVtVmFsdWVTaXRlQ291bnRzKEluc3RyUHJvZlZhbHVlUHJvZmlsZUluc3QgKklucyk7CisKKyAgLy8vIFJlcGxhY2UgaW5zdHJwcm9mX3ZhbHVlX3Byb2ZpbGUgd2l0aCBhIGNhbGwgdG8gcnVudGltZSBsaWJyYXJ5LgorICB2b2lkIGxvd2VyVmFsdWVQcm9maWxlSW5zdChJbnN0clByb2ZWYWx1ZVByb2ZpbGVJbnN0ICpJbnMpOworCisgIC8vLyBSZXBsYWNlIGluc3RycHJvZl9pbmNyZW1lbnQgd2l0aCBhbiBpbmNyZW1lbnQgb2YgdGhlIGFwcHJvcHJpYXRlIHZhbHVlLgorICB2b2lkIGxvd2VySW5jcmVtZW50KEluc3RyUHJvZkluY3JlbWVudEluc3QgKkluYyk7CisKKyAgLy8vIEZvcmNlIGVtaXR0aW5nIG9mIG5hbWUgdmFycyBmb3IgdW51c2VkIGZ1bmN0aW9ucy4KKyAgdm9pZCBsb3dlckNvdmVyYWdlRGF0YShHbG9iYWxWYXJpYWJsZSAqQ292ZXJhZ2VOYW1lc1Zhcik7CisKKyAgLy8vIEdldCB0aGUgcmVnaW9uIGNvdW50ZXJzIGZvciBhbiBpbmNyZW1lbnQsIGNyZWF0aW5nIHRoZW0gaWYgbmVjZXNzYXJ5LgorICAvLy8KKyAgLy8vIElmIHRoZSBjb3VudGVyIGFycmF5IGRvZXNuJ3QgeWV0IGV4aXN0LCB0aGUgcHJvZmlsZSBkYXRhIHZhcmlhYmxlcworICAvLy8gcmVmZXJyaW5nIHRvIHRoZW0gd2lsbCBhbHNvIGJlIGNyZWF0ZWQuCisgIEdsb2JhbFZhcmlhYmxlICpnZXRPckNyZWF0ZVJlZ2lvbkNvdW50ZXJzKEluc3RyUHJvZkluY3JlbWVudEluc3QgKkluYyk7CisKKyAgLy8vIEVtaXQgdGhlIHNlY3Rpb24gd2l0aCBjb21wcmVzc2VkIGZ1bmN0aW9uIG5hbWVzLgorICB2b2lkIGVtaXROYW1lRGF0YSgpOworCisgIC8vLyBFbWl0IHZhbHVlIG5vZGVzIHNlY3Rpb24gZm9yIHZhbHVlIHByb2ZpbGluZy4KKyAgdm9pZCBlbWl0Vk5vZGVzKCk7CisKKyAgLy8vIEVtaXQgcnVudGltZSByZWdpc3RyYXRpb24gZnVuY3Rpb25zIGZvciBlYWNoIHByb2ZpbGUgZGF0YSB2YXJpYWJsZS4KKyAgdm9pZCBlbWl0UmVnaXN0cmF0aW9uKCk7CisKKyAgLy8vIEVtaXQgdGhlIG5lY2Vzc2FyeSBwbHVtYmluZyB0byBwdWxsIGluIHRoZSBydW50aW1lIGluaXRpYWxpemF0aW9uLgorICAvLy8gUmV0dXJucyB0cnVlIGlmIGEgY2hhbmdlIHdhcyBtYWRlLgorICBib29sIGVtaXRSdW50aW1lSG9vaygpOworCisgIC8vLyBBZGQgdXNlcyBvZiBvdXIgZGF0YSB2YXJpYWJsZXMgYW5kIHJ1bnRpbWUgaG9vay4KKyAgdm9pZCBlbWl0VXNlcygpOworCisgIC8vLyBDcmVhdGUgYSBzdGF0aWMgaW5pdGlhbGl6ZXIgZm9yIG91ciBkYXRhLCBvbiBwbGF0Zm9ybXMgdGhhdCBuZWVkIGl0LAorICAvLy8gYW5kIGZvciBhbnkgcHJvZmlsZSBvdXRwdXQgZmlsZSB0aGF0IHdhcyBzcGVjaWZpZWQuCisgIHZvaWQgZW1pdEluaXRpYWxpemF0aW9uKCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lOU1RSUFJPRklMSU5HX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24vUEdPSW5zdHJ1bWVudGF0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uL1BHT0luc3RydW1lbnRhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYjM3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uL1BHT0luc3RydW1lbnRhdGlvbi5oCkBAIC0wLDAgKzEsNzUgQEAKKy8vPT09LSBUcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9QR09JbnN0cnVtZW50YXRpb24uaCAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgZm9yIElSIGJhc2VkIGluc3RydW1lbnRhdGlvbiBwYXNzZXMgKAorLy8vIChwcm9maWxlLWdlbiwgYW5kIHByb2ZpbGUtdXNlKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19QR09JTlNUUlVNRU5UQVRJT05fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfUEdPSU5TVFJVTUVOVEFUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBNb2R1bGU7CisKKy8vLyBUaGUgaW5zdHJ1bWVudGF0aW9uIChwcm9maWxlLWluc3RyLWdlbikgcGFzcyBmb3IgSVIgYmFzZWQgUEdPLgorY2xhc3MgUEdPSW5zdHJ1bWVudGF0aW9uR2VuIDogcHVibGljIFBhc3NJbmZvTWl4aW48UEdPSW5zdHJ1bWVudGF0aW9uR2VuPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIFRoZSBwcm9maWxlIGFubm90YXRpb24gKHByb2ZpbGUtaW5zdHItdXNlKSBwYXNzIGZvciBJUiBiYXNlZCBQR08uCitjbGFzcyBQR09JbnN0cnVtZW50YXRpb25Vc2UgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxQR09JbnN0cnVtZW50YXRpb25Vc2U+IHsKK3B1YmxpYzoKKyAgUEdPSW5zdHJ1bWVudGF0aW9uVXNlKHN0ZDo6c3RyaW5nIEZpbGVuYW1lID0gIiIpOworCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBQcm9maWxlRmlsZU5hbWU7Cit9OworCisvLy8gVGhlIGluZGlyZWN0IGZ1bmN0aW9uIGNhbGwgcHJvbW90aW9uIHBhc3MuCitjbGFzcyBQR09JbmRpcmVjdENhbGxQcm9tb3Rpb24gOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxQR09JbmRpcmVjdENhbGxQcm9tb3Rpb24+IHsKK3B1YmxpYzoKKyAgUEdPSW5kaXJlY3RDYWxsUHJvbW90aW9uKGJvb2wgSXNJbkxUTyA9IGZhbHNlLCBib29sIFNhbXBsZVBHTyA9IGZhbHNlKQorICAgICAgOiBJbkxUTyhJc0luTFRPKSwgU2FtcGxlUEdPKFNhbXBsZVBHTykge30KKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJkFNKTsKKworcHJpdmF0ZToKKyAgYm9vbCBJbkxUTzsKKyAgYm9vbCBTYW1wbGVQR087Cit9OworCisvLy8gVGhlIHByb2ZpbGUgc2l6ZSBiYXNlZCBvcHRpbWl6YXRpb24gcGFzcyBmb3IgbWVtb3J5IGludHJpbnNpY3MuCitjbGFzcyBQR09NZW1PUFNpemVPcHQgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxQR09NZW1PUFNpemVPcHQ+IHsKK3B1YmxpYzoKKyAgUEdPTWVtT1BTaXplT3B0KCkgPSBkZWZhdWx0OworCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK3ZvaWQgc2V0UHJvZk1ldGFkYXRhKE1vZHVsZSAqTSwgSW5zdHJ1Y3Rpb24gKlRJLCBBcnJheVJlZjx1aW50NjRfdD4gRWRnZUNvdW50cywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE1heENvdW50KTsKKwordm9pZCBzZXRJcnJMb29wSGVhZGVyTWV0YWRhdGEoTW9kdWxlICpNLCBJbnN0cnVjdGlvbiAqVEksIHVpbnQ2NF90IENvdW50KTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19QR09JTlNUUlVNRU5UQVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL09iakNBUkMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9PYmpDQVJDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5N2FkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9PYmpDQVJDLmgKQEAgLTAsMCArMSw0OCBAQAorLy89PT0tLSBPYmpDQVJDLmggLSBPYmpDQVJDIFNjYWxhciBUcmFuc2Zvcm1hdGlvbnMgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgcHJvdG90eXBlcyBmb3IgYWNjZXNzb3IgZnVuY3Rpb25zIHRoYXQgZXhwb3NlIHBhc3NlcworLy8gaW4gdGhlIE9iakNBUkMgU2NhbGFyIFRyYW5zZm9ybWF0aW9ucyBsaWJyYXJ5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX09CSkNBUkNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfT0JKQ0FSQ19ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgUGFzczsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBPYmpDQVJDQVBFbGltIC0gT2JqQyBBUkMgYXV0b3JlbGVhc2UgcG9vbCBlbGltaW5hdGlvbi4KKy8vCitQYXNzICpjcmVhdGVPYmpDQVJDQVBFbGltUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE9iakNBUkNFeHBhbmQgLSBPYmpDIEFSQyBwcmVsaW1pbmFyeSBzaW1wbGlmaWNhdGlvbnMuCisvLworUGFzcyAqY3JlYXRlT2JqQ0FSQ0V4cGFuZFBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBPYmpDQVJDQ29udHJhY3QgLSBMYXRlIE9iakMgQVJDIGNsZWFudXBzLgorLy8KK1Bhc3MgKmNyZWF0ZU9iakNBUkNDb250cmFjdFBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBPYmpDQVJDT3B0IC0gT2JqQyBBUkMgb3B0aW1pemF0aW9uLgorLy8KK1Bhc3MgKmNyZWF0ZU9iakNBUkNPcHRQYXNzKCk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YzdiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyLmgKQEAgLTAsMCArMSw0OTcgQEAKKy8vPT09LS0gU2NhbGFyLmggLSBTY2FsYXIgVHJhbnNmb3JtYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHByb3RvdHlwZXMgZm9yIGFjY2Vzc29yIGZ1bmN0aW9ucyB0aGF0IGV4cG9zZSBwYXNzZXMKKy8vIGluIHRoZSBTY2FsYXIgdHJhbnNmb3JtYXRpb25zIGxpYnJhcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9ICisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJhc2ljQmxvY2tQYXNzOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBGdW5jdGlvblBhc3M7CitjbGFzcyBNb2R1bGVQYXNzOworY2xhc3MgUGFzczsKK2NsYXNzIEdldEVsZW1lbnRQdHJJbnN0OworY2xhc3MgUGFzc0luZm87CitjbGFzcyBUZXJtaW5hdG9ySW5zdDsKK2NsYXNzIFRhcmdldExvd2VyaW5nOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDb25zdGFudFByb3BhZ2F0aW9uIC0gQSB3b3JrbGlzdCBkcml2ZW4gY29uc3RhbnQgcHJvcGFnYXRpb24gcGFzcworLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlQ29uc3RhbnRQcm9wYWdhdGlvblBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBBbGlnbm1lbnRGcm9tQXNzdW1wdGlvbnMgLSBVc2UgYXNzdW1lIGludHJpbnNpY3MgdG8gc2V0IGxvYWQvc3RvcmUKKy8vIGFsaWdubWVudHMuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVBbGlnbm1lbnRGcm9tQXNzdW1wdGlvbnNQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gU0NDUCAtIFNwYXJzZSBjb25kaXRpb25hbCBjb25zdGFudCBwcm9wYWdhdGlvbi4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZVNDQ1BQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVhZEluc3RFbGltaW5hdGlvbiAtIFRoaXMgcGFzcyBxdWlja2x5IHJlbW92ZXMgdHJpdmlhbGx5IGRlYWQgaW5zdHJ1Y3Rpb25zCisvLyB3aXRob3V0IG1vZGlmeWluZyB0aGUgQ0ZHIG9mIHRoZSBmdW5jdGlvbi4gIEl0IGlzIGEgQmFzaWNCbG9ja1Bhc3MsIHNvIGl0CisvLyBydW5zIGVmZmljaWVudGx5IHdoZW4gcXVldWVkIG5leHQgdG8gb3RoZXIgQmFzaWNCbG9ja1Bhc3Mncy4KKy8vCitQYXNzICpjcmVhdGVEZWFkSW5zdEVsaW1pbmF0aW9uUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIERlYWRDb2RlRWxpbWluYXRpb24gLSBUaGlzIHBhc3MgaXMgbW9yZSBwb3dlcmZ1bCB0aGFuIERlYWRJbnN0RWxpbWluYXRpb24sCisvLyBiZWNhdXNlIGl0IGlzIHdvcmtsaXN0IGRyaXZlbiB0aGF0IGNhbiBwb3RlbnRpYWxseSByZXZpc2l0IGluc3RydWN0aW9ucyB3aGVuCisvLyB0aGVpciBvdGhlciBpbnN0cnVjdGlvbnMgYmVjb21lIGRlYWQsIHRvIGVsaW1pbmF0ZSBjaGFpbnMgb2YgZGVhZAorLy8gY29tcHV0YXRpb25zLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlRGVhZENvZGVFbGltaW5hdGlvblBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZWFkU3RvcmVFbGltaW5hdGlvbiAtIFRoaXMgcGFzcyBkZWxldGVzIHN0b3JlcyB0aGF0IGFyZSBwb3N0LWRvbWluYXRlZCBieQorLy8gbXVzdC1hbGlhc2VkIHN0b3JlcyBhbmQgYXJlIG5vdCBsb2FkZWQgdXNlZCBiZXR3ZWVuIHRoZSBzdG9yZXMuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVEZWFkU3RvcmVFbGltaW5hdGlvblBhc3MoKTsKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENhbGxTaXRlU3BsaXR0aW5nIC0gVGhpcyBwYXNzIHNwbGl0IGNhbGwtc2l0ZSBiYXNlZCBvbiBpdHMga25vd24gYXJndW1lbnQKKy8vIHZhbHVlcy4KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlQ2FsbFNpdGVTcGxpdHRpbmdQYXNzKCk7CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBBZ2dyZXNzaXZlRENFIC0gVGhpcyBwYXNzIHVzZXMgdGhlIFNTQSBiYXNlZCBBZ2dyZXNzaXZlIERDRSBhbGdvcml0aG0uICBUaGlzCisvLyBhbGdvcml0aG0gYXNzdW1lcyBpbnN0cnVjdGlvbnMgYXJlIGRlYWQgdW50aWwgcHJvdmVuIG90aGVyd2lzZSwgd2hpY2ggbWFrZXMKKy8vIGl0IG1vcmUgc3VjY2Vzc2Z1bCBhcmUgcmVtb3Zpbmcgbm9uLW9idmlvdXNseSBkZWFkIGluc3RydWN0aW9ucy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUFnZ3Jlc3NpdmVEQ0VQYXNzKCk7CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBHdWFyZFdpZGVuaW5nIC0gQW4gb3B0aW1pemF0aW9uIG92ZXIgdGhlIEBsbHZtLmV4cGVyaW1lbnRhbC5ndWFyZCBpbnRyaW5zaWMKKy8vIHRoYXQgKG9wdGltaXN0aWNhbGx5KSBjb21iaW5lcyBtdWx0aXBsZSBndWFyZHMgaW50byBvbmUgdG8gaGF2ZSBmZXdlciBjaGVja3MKKy8vIGF0IHJ1bnRpbWUuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVHdWFyZFdpZGVuaW5nUGFzcygpOworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQml0VHJhY2tpbmdEQ0UgLSBUaGlzIHBhc3MgdXNlcyBhIGJpdC10cmFja2luZyBEQ0UgYWxnb3JpdGhtIGluIG9yZGVyIHRvCisvLyByZW1vdmUgY29tcHV0YXRpb25zIG9mIGRlYWQgYml0cy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUJpdFRyYWNraW5nRENFUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFNST0EgLSBSZXBsYWNlIGFnZ3JlZ2F0ZXMgb3IgcGllY2VzIG9mIGFnZ3JlZ2F0ZXMgd2l0aCBzY2FsYXIgU1NBIHZhbHVlcy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZVNST0FQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gSW5kdWN0aXZlUmFuZ2VDaGVja0VsaW1pbmF0aW9uIC0gVHJhbnNmb3JtIGxvb3BzIHRvIGVsaWRlIHJhbmdlIGNoZWNrcyBvbgorLy8gbGluZWFyIGZ1bmN0aW9ucyBvZiB0aGUgaW5kdWN0aW9uIHZhcmlhYmxlLgorLy8KK1Bhc3MgKmNyZWF0ZUluZHVjdGl2ZVJhbmdlQ2hlY2tFbGltaW5hdGlvblBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJbmR1Y3Rpb25WYXJpYWJsZVNpbXBsaWZ5IC0gVHJhbnNmb3JtIGluZHVjdGlvbiB2YXJpYWJsZXMgaW4gYSBwcm9ncmFtIHRvIGFsbAorLy8gdXNlIGEgc2luZ2xlIGNhbm9uaWNhbCBpbmR1Y3Rpb24gdmFyaWFibGUgcGVyIGxvb3AuCisvLworUGFzcyAqY3JlYXRlSW5kVmFyU2ltcGxpZnlQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gSW5zdHJ1Y3Rpb25Db21iaW5pbmcgLSBDb21iaW5lIGluc3RydWN0aW9ucyB0byBmb3JtIGZld2VyLCBzaW1wbGUKKy8vIGluc3RydWN0aW9ucy4gVGhpcyBwYXNzIGRvZXMgbm90IG1vZGlmeSB0aGUgQ0ZHLCBhbmQgaGFzIGEgdGVuZGVuY3kgdG8gbWFrZQorLy8gaW5zdHJ1Y3Rpb25zIGRlYWQsIHNvIGEgc3Vic2VxdWVudCBEQ0UgcGFzcyBpcyB1c2VmdWwuCisvLworLy8gVGhpcyBwYXNzIGNvbWJpbmVzIHRoaW5ncyBsaWtlOgorLy8gICAgJVkgPSBhZGQgaW50IDEsICVYCisvLyAgICAlWiA9IGFkZCBpbnQgMSwgJVkKKy8vIGludG86CisvLyAgICAlWiA9IGFkZCBpbnQgMiwgJVgKKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUluc3RydWN0aW9uQ29tYmluaW5nUGFzcyhib29sIEV4cGVuc2l2ZUNvbWJpbmVzID0gdHJ1ZSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQWdncmVzc2l2ZUluc3RDb21iaW5lciAtIENvbWJpbmUgZXhwcmVzc2lvbiBwYXR0ZXJucyB0byBmb3JtIGV4cHJlc3Npb25zIHdpdGgKKy8vIGZld2VyLCBzaW1wbGUgaW5zdHJ1Y3Rpb25zLiBUaGlzIHBhc3MgZG9lcyBub3QgbW9kaWZ5IHRoZSBDRkcuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVBZ2dyZXNzaXZlSW5zdENvbWJpbmVyUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExJQ00gLSBUaGlzIHBhc3MgaXMgYSBsb29wIGludmFyaWFudCBjb2RlIG1vdGlvbiBhbmQgbWVtb3J5IHByb21vdGlvbiBwYXNzLgorLy8KK1Bhc3MgKmNyZWF0ZUxJQ01QYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG9vcFNpbmsgLSBUaGlzIHBhc3Mgc2lua3MgaW52YXJpYW50cyBmcm9tIHByZWhlYWRlciB0byBsb29wIGJvZHkgd2hlcmUKKy8vIGZyZXF1ZW5jeSBpcyBsb3dlciB0aGFuIGxvb3AgcHJlaGVhZGVyLgorLy8KK1Bhc3MgKmNyZWF0ZUxvb3BTaW5rUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BQcmVkaWNhdGlvbiAtIFRoaXMgcGFzcyBkb2VzIGxvb3AgcHJlZGljYXRpb24gb24gZ3VhcmRzLgorLy8KK1Bhc3MgKmNyZWF0ZUxvb3BQcmVkaWNhdGlvblBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb29wSW50ZXJjaGFuZ2UgLSBUaGlzIHBhc3MgaW50ZXJjaGFuZ2VzIGxvb3BzIHRvIHByb3ZpZGUgYSBtb3JlCisvLyBjYWNoZS1mcmllbmRseSBtZW1vcnkgYWNjZXNzIHBhdHRlcm5zLgorLy8KK1Bhc3MgKmNyZWF0ZUxvb3BJbnRlcmNoYW5nZVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb29wU3RyZW5ndGhSZWR1Y2UgLSBUaGlzIHBhc3MgaXMgc3RyZW5ndGggcmVkdWNlcyBHRVAgaW5zdHJ1Y3Rpb25zIHRoYXQgdXNlCisvLyBhIGxvb3AncyBjYW5vbmljYWwgaW5kdWN0aW9uIHZhcmlhYmxlIGFzIG9uZSBvZiB0aGVpciBpbmRpY2VzLgorLy8KK1Bhc3MgKmNyZWF0ZUxvb3BTdHJlbmd0aFJlZHVjZVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb29wVW5zd2l0Y2ggLSBUaGlzIHBhc3MgaXMgYSBzaW1wbGUgbG9vcCB1bnN3aXRjaGluZyBwYXNzLgorLy8KK1Bhc3MgKmNyZWF0ZUxvb3BVbnN3aXRjaFBhc3MoYm9vbCBPcHRpbWl6ZUZvclNpemUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNCcmFuY2hEaXZlcmdlbmNlID0gZmFsc2UpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BVbnJvbGwgLSBUaGlzIHBhc3MgaXMgYSBzaW1wbGUgbG9vcCB1bnJvbGxpbmcgcGFzcy4KKy8vCitQYXNzICpjcmVhdGVMb29wVW5yb2xsUGFzcyhpbnQgT3B0TGV2ZWwgPSAyLCBpbnQgVGhyZXNob2xkID0gLTEsIGludCBDb3VudCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEFsbG93UGFydGlhbCA9IC0xLCBpbnQgUnVudGltZSA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFVwcGVyQm91bmQgPSAtMSwgaW50IEFsbG93UGVlbGluZyA9IC0xKTsKKy8vIENyZWF0ZSBhbiB1bnJvbGxpbmcgcGFzcyBmb3IgZnVsbCB1bnJvbGxpbmcgdGhhdCB1c2VzIGV4YWN0IHRyaXAgY291bnQgb25seS4KK1Bhc3MgKmNyZWF0ZVNpbXBsZUxvb3BVbnJvbGxQYXNzKGludCBPcHRMZXZlbCA9IDIpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BSZXJvbGwgLSBUaGlzIHBhc3MgaXMgYSBzaW1wbGUgbG9vcCByZXJvbGxpbmcgcGFzcy4KKy8vCitQYXNzICpjcmVhdGVMb29wUmVyb2xsUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BSb3RhdGUgLSBUaGlzIHBhc3MgaXMgYSBzaW1wbGUgbG9vcCByb3RhdGluZyBwYXNzLgorLy8KK1Bhc3MgKmNyZWF0ZUxvb3BSb3RhdGVQYXNzKGludCBNYXhIZWFkZXJTaXplID0gLTEpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BJZGlvbSAtIFRoaXMgcGFzcyByZWNvZ25pemVzIGFuZCByZXBsYWNlcyBpZGlvbXMgaW4gbG9vcHMuCisvLworUGFzcyAqY3JlYXRlTG9vcElkaW9tUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BWZXJzaW9uaW5nTElDTSAtIFRoaXMgcGFzcyBpcyBhIGxvb3AgdmVyc2lvbmluZyBwYXNzIGZvciBMSUNNLgorLy8KK1Bhc3MgKmNyZWF0ZUxvb3BWZXJzaW9uaW5nTElDTVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZW1vdGVSZWdpc3RlclRvTWVtb3J5UGFzcyAtIFRoaXMgcGFzcyBpcyB1c2VkIHRvIGRlbW90ZSByZWdpc3RlcnMgdG8gbWVtb3J5CisvLyByZWZlcmVuY2VzLiBJbiBiYXNpY2FsbHkgdW5kb2VzIHRoZSBQcm9tb3RlTWVtb3J5VG9SZWdpc3RlciBwYXNzIHRvIG1ha2UgY2ZnCisvLyBoYWNraW5nIGVhc2llci4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZURlbW90ZVJlZ2lzdGVyVG9NZW1vcnlQYXNzKCk7CitleHRlcm4gY2hhciAmRGVtb3RlUmVnaXN0ZXJUb01lbW9yeUlEOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFJlYXNzb2NpYXRlIC0gVGhpcyBwYXNzIHJlYXNzb2NpYXRlcyBjb21tdXRhdGl2ZSBleHByZXNzaW9ucyBpbiBhbiBvcmRlciB0aGF0CisvLyBpcyBkZXNpZ25lZCB0byBwcm9tb3RlIGJldHRlciBjb25zdGFudCBwcm9wYWdhdGlvbiwgR0NTRSwgTElDTSwgUFJFLi4uCisvLworLy8gRm9yIGV4YW1wbGU6ICA0ICsgKHggKyA1KSAgLT4gIHggKyAoNCArIDUpCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVSZWFzc29jaWF0ZVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBKdW1wVGhyZWFkaW5nIC0gVGhyZWFkIGNvbnRyb2wgdGhyb3VnaCBtdWx0LXByZWQvbXVsdGktc3VjYyBibG9ja3Mgd2hlcmUgc29tZQorLy8gcHJlZHMgYWx3YXlzIGdvIHRvIHNvbWUgc3VjYy4gVGhyZXNob2xkcyBvdGhlciB0aGFuIG1pbnVzIG9uZSBvdmVycmlkZSB0aGUKKy8vIGludGVybmFsIEJCIGR1cGxpY2F0aW9uIGRlZmF1bHQgdGhyZXNob2xkLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlSnVtcFRocmVhZGluZ1Bhc3MoaW50IFRocmVzaG9sZCA9IC0xKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDRkdTaW1wbGlmaWNhdGlvbiAtIE1lcmdlIGJhc2ljIGJsb2NrcywgZWxpbWluYXRlIHVucmVhY2hhYmxlIGJsb2NrcywKKy8vIHNpbXBsaWZ5IHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb25zLCBjb252ZXJ0IHN3aXRjaGVzIHRvIGxvb2t1cCB0YWJsZXMsIGV0Yy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUNGR1NpbXBsaWZpY2F0aW9uUGFzcygKKyAgICB1bnNpZ25lZCBUaHJlc2hvbGQgPSAxLCBib29sIEZvcndhcmRTd2l0Y2hDb25kID0gZmFsc2UsCisgICAgYm9vbCBDb252ZXJ0U3dpdGNoID0gZmFsc2UsIGJvb2wgS2VlcExvb3BzID0gdHJ1ZSwgYm9vbCBTaW5rQ29tbW9uID0gZmFsc2UsCisgICAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IEZ1bmN0aW9uICYpPiBGdG9yID0gbnVsbHB0cik7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRmxhdHRlbkNGRyAtIGZsYXR0ZW4gQ0ZHLCByZWR1Y2UgbnVtYmVyIG9mIGNvbmRpdGlvbmFsIGJyYW5jaGVzIGJ5IHVzaW5nCisvLyBwYXJhbGxlbC1hbmQgYW5kIHBhcmFsbGVsLW9yIG1vZGUsIGV0Yy4uLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlRmxhdHRlbkNGR1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDRkcgU3RydWN0dXJpemF0aW9uIC0gUmVtb3ZlIGlycmVkdWNpYmxlIGNvbnRyb2wgZmxvdworLy8KKy8vLworLy8vIFdoZW4gXHAgU2tpcFVuaWZvcm1SZWdpb25zIGlzIHRydWUgdGhlIHN0cnVjdGl6ZXIgd2lsbCBub3Qgc3RydWN0dXJpemUKKy8vLyByZWdpb25zIHRoYXQgb25seSBjb250YWluIHVuaWZvcm0gYnJhbmNoZXMuCitQYXNzICpjcmVhdGVTdHJ1Y3R1cml6ZUNGR1Bhc3MoYm9vbCBTa2lwVW5pZm9ybVJlZ2lvbnMgPSBmYWxzZSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGFpbENhbGxFbGltaW5hdGlvbiAtIFRoaXMgcGFzcyBlbGltaW5hdGVzIGNhbGwgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBjdXJyZW50CisvLyBmdW5jdGlvbiB3aGljaCBvY2N1ciBpbW1lZGlhdGVseSBiZWZvcmUgcmV0dXJuIGluc3RydWN0aW9ucy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZVRhaWxDYWxsRWxpbWluYXRpb25QYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRWFybHlDU0UgLSBUaGlzIHBhc3MgcGVyZm9ybXMgYSBzaW1wbGUgYW5kIGZhc3QgQ1NFIHBhc3Mgb3ZlciB0aGUgZG9taW5hdG9yCisvLyB0cmVlLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlRWFybHlDU0VQYXNzKGJvb2wgVXNlTWVtb3J5U1NBID0gZmFsc2UpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEdWTkhvaXN0IC0gVGhpcyBwYXNzIHBlcmZvcm1zIGEgc2ltcGxlIGFuZCBmYXN0IEdWTiBwYXNzIG92ZXIgdGhlIGRvbWluYXRvcgorLy8gdHJlZSB0byBob2lzdCBjb21tb24gZXhwcmVzc2lvbnMgZnJvbSBzaWJsaW5nIGJyYW5jaGVzLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlR1ZOSG9pc3RQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gR1ZOU2luayAtIFRoaXMgcGFzcyB1c2VzIGFuICJpbnZlcnRlZCIgdmFsdWUgbnVtYmVyaW5nIHRvIGRlY2lkZSB0aGUKKy8vIHNpbWlsYXJpdHkgb2YgZXhwcmVzc2lvbnMgYW5kIHNpbmtzIHNpbWlsYXIgZXhwcmVzc2lvbnMgaW50byBzdWNjZXNzb3JzLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlR1ZOU2lua1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBNZXJnZWRMb2FkU3RvcmVNb3Rpb24gLSBUaGlzIHBhc3MgbWVyZ2VzIGxvYWRzIGFuZCBzdG9yZXMgaW4gZGlhbW9uZHMuIExvYWRzCisvLyBhcmUgaG9pc3RlZCBpbnRvIHRoZSBoZWFkZXIsIHdoaWxlIHN0b3JlcyBzaW5rIGludG8gdGhlIGZvb3Rlci4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZU1lcmdlZExvYWRTdG9yZU1vdGlvblBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBHVk4gLSBUaGlzIHBhc3MgcGVyZm9ybXMgZ2xvYmFsIHZhbHVlIG51bWJlcmluZyBhbmQgcmVkdW5kYW50IGxvYWQKKy8vIGVsaW1pbmF0aW9uIGNvdGVtcG9yYW5lb3VzbHkuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVOZXdHVk5QYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGl2UmVtUGFpcnMgLSBIb2lzdC9kZWNvbXBvc2UgaW50ZWdlciBkaXZpc2lvbiBhbmQgcmVtYWluZGVyIGluc3RydWN0aW9ucy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZURpdlJlbVBhaXJzUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE1lbUNweU9wdCAtIFRoaXMgcGFzcyBwZXJmb3JtcyBvcHRpbWl6YXRpb25zIHJlbGF0ZWQgdG8gZWxpbWluYXRpbmcgbWVtY3B5CisvLyBjYWxscyBhbmQvb3IgY29tYmluaW5nIG11bHRpcGxlIHN0b3JlcyBpbnRvIG1lbXNldCdzLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlTWVtQ3B5T3B0UGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BEZWxldGlvbiAtIFRoaXMgcGFzcyBwZXJmb3JtcyBEQ0Ugb2Ygbm9uLWluZmluaXRlIGxvb3BzIHRoYXQgaXQKKy8vIGNhbiBwcm92ZSBhcmUgZGVhZC4KKy8vCitQYXNzICpjcmVhdGVMb29wRGVsZXRpb25QYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ29uc3RhbnRIb2lzdGluZyAtIFRoaXMgcGFzcyBwcmVwYXJlcyBhIGZ1bmN0aW9uIGZvciBleHBlbnNpdmUgY29uc3RhbnRzLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlQ29uc3RhbnRIb2lzdGluZ1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBTaW5rIC0gQ29kZSBTaW5raW5nCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVTaW5raW5nUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvd2VyQXRvbWljIC0gTG93ZXIgYXRvbWljIGludHJpbnNpY3MgdG8gbm9uLWF0b21pYyBmb3JtCisvLworUGFzcyAqY3JlYXRlTG93ZXJBdG9taWNQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG93ZXJHdWFyZEludHJpbnNpYyAtIExvd2VyIGd1YXJkIGludHJpbnNpY3MgdG8gbm9ybWFsIGNvbnRyb2wgZmxvdy4KKy8vCitQYXNzICpjcmVhdGVMb3dlckd1YXJkSW50cmluc2ljUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE1lcmdlSUNtcHMgLSBNZXJnZSBpbnRlZ2VyIGNvbXBhcmlzb24gY2hhaW5zIGludG8gYSBtZW1jbXAKKy8vCitQYXNzICpjcmVhdGVNZXJnZUlDbXBzUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFZhbHVlUHJvcGFnYXRpb24gLSBQcm9wYWdhdGUgQ0ZHLWRlcml2ZWQgdmFsdWUgaW5mb3JtYXRpb24KKy8vCitQYXNzICpjcmVhdGVDb3JyZWxhdGVkVmFsdWVQcm9wYWdhdGlvblBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJbmZlckFkZHJlc3NTcGFjZXMgLSBNb2RpZnkgdXNlcnMgb2YgYWRkcnNwYWNlY2FzdCBpbnN0cnVjdGlvbnMgd2l0aCB2YWx1ZXMKKy8vIGluIHRoZSBzb3VyY2UgYWRkcmVzcyBzcGFjZSBpZiB1c2luZyB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBzcGFjZSBpcyBzbG93ZXIKKy8vIG9uIHRoZSB0YXJnZXQuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVJbmZlckFkZHJlc3NTcGFjZXNQYXNzKCk7CitleHRlcm4gY2hhciAmSW5mZXJBZGRyZXNzU3BhY2VzSUQ7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG93ZXJFeHBlY3RJbnRyaW5zaWNzIC0gUmVtb3ZlcyBsbHZtLmV4cGVjdCBpbnRyaW5zaWNzIGFuZCBjcmVhdGVzCisvLyAiYmxvY2tfd2VpZ2h0cyIgbWV0YWRhdGEuCitGdW5jdGlvblBhc3MgKmNyZWF0ZUxvd2VyRXhwZWN0SW50cmluc2ljUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFBhcnRpYWxseUlubGluZUxpYkNhbGxzIC0gVHJpZXMgdG8gaW5saW5lIHRoZSBmYXN0IHBhdGggb2YgbGlicmFyeQorLy8gY2FsbHMgc3VjaCBhcyBzcXJ0LgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlUGFydGlhbGx5SW5saW5lTGliQ2FsbHNQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gU2NhbGFyaXplclBhc3MgLSBDb252ZXJ0cyB2ZWN0b3Igb3BlcmF0aW9ucyBpbnRvIHNjYWxhciBvcGVyYXRpb25zCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVTY2FsYXJpemVyUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFNlcGFyYXRlQ29uc3RPZmZzZXRGcm9tR0VQIC0gU3BsaXQgR0VQcyBmb3IgYmV0dGVyIENTRQorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlU2VwYXJhdGVDb25zdE9mZnNldEZyb21HRVBQYXNzKGJvb2wgTG93ZXJHRVAgPSBmYWxzZSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gU3BlY3VsYXRpdmVFeGVjdXRpb24gLSBBZ2dyZXNzaXZlbHkgaG9pc3QgaW5zdHJ1Y3Rpb25zIHRvIGVuYWJsZQorLy8gc3BlY3VsYXRpdmUgZXhlY3V0aW9uIG9uIHRhcmdldHMgd2hlcmUgYnJhbmNoZXMgYXJlIGV4cGVuc2l2ZS4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZVNwZWN1bGF0aXZlRXhlY3V0aW9uUGFzcygpOworCisvLyBTYW1lIGFzIGNyZWF0ZVNwZWN1bGF0aXZlRXhlY3V0aW9uUGFzcywgYnV0IGRvZXMgbm90aGluZyB1bmxlc3MKKy8vIFRhcmdldFRyYW5zZm9ybUluZm86Omhhc0JyYW5jaERpdmVyZ2VuY2UoKSBpcyB0cnVlLgorRnVuY3Rpb25QYXNzICpjcmVhdGVTcGVjdWxhdGl2ZUV4ZWN1dGlvbklmSGFzQnJhbmNoRGl2ZXJnZW5jZVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBTdHJhaWdodExpbmVTdHJlbmd0aFJlZHVjZSAtIFRoaXMgcGFzcyBzdHJlbmd0aC1yZWR1Y2VzIHNvbWUgY2VydGFpbgorLy8gaW5zdHJ1Y3Rpb24gcGF0dGVybnMgaW4gc3RyYWlnaHQtbGluZSBjb2RlLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlU3RyYWlnaHRMaW5lU3RyZW5ndGhSZWR1Y2VQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gUGxhY2VTYWZlcG9pbnRzIC0gUmV3cml0ZSBhbnkgSVIgY2FsbHMgdG8gZ2Muc3RhdGVwb2ludHMgYW5kIGluc2VydCBhbnkKKy8vIHNhZmVwb2ludCBwb2xscyAobWV0aG9kIGVudHJ5LCBiYWNrZWRnZSkgdGhhdCBtaWdodCBiZSByZXF1aXJlZC4gIFRoaXMgcGFzcworLy8gZG9lcyBub3QgZ2VuZXJhdGUgZXhwbGljaXQgcmVsb2NhdGlvbiBzZXF1ZW5jZXMgLSB0aGF0J3MgaGFuZGxlZCBieQorLy8gUmV3cml0ZVN0YXRlcG9pbnRzRm9yR0Mgd2hpY2ggY2FuIGJlIHJ1biBhdCBhbiBhcmJpdHJhcnkgcG9pbnQgaW4gdGhlIHBhc3MKKy8vIG9yZGVyIGZvbGxvd2luZyB0aGlzIHBhc3MuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVQbGFjZVNhZmVwb2ludHNQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gUmV3cml0ZVN0YXRlcG9pbnRzRm9yR0MgLSBSZXdyaXRlIGFueSBnYy5zdGF0ZXBvaW50cyB3aGljaCBkbyBub3QgeWV0IGhhdmUKKy8vIGV4cGxpY2l0IHJlbG9jYXRpb25zIHRvIGluY2x1ZGUgZXhwbGljaXQgcmVsb2NhdGlvbnMuCisvLworTW9kdWxlUGFzcyAqY3JlYXRlUmV3cml0ZVN0YXRlcG9pbnRzRm9yR0NMZWdhY3lQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRmxvYXQySW50IC0gRGVtb3RlIGZsb2F0cyB0byBpbnRzIHdoZXJlIHBvc3NpYmxlLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlRmxvYXQySW50UGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE5hcnlSZWFzc29jaWF0ZSAtIFNpbXBsaWZ5IG4tYXJ5IG9wZXJhdGlvbnMgYnkgcmVhc3NvY2lhdGlvbi4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZU5hcnlSZWFzc29jaWF0ZVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb29wRGlzdHJpYnV0ZSAtIERpc3RyaWJ1dGUgbG9vcHMuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVMb29wRGlzdHJpYnV0ZVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb29wTG9hZEVsaW1pbmF0aW9uIC0gUGVyZm9ybSBsb29wLWF3YXJlIGxvYWQgZWxpbWluYXRpb24uCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVMb29wTG9hZEVsaW1pbmF0aW9uUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BWZXJzaW9uaW5nIC0gUGVyZm9ybSBsb29wIG11bHRpLXZlcnNpb25pbmcuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVMb29wVmVyc2lvbmluZ1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb29wRGF0YVByZWZldGNoIC0gUGVyZm9ybSBkYXRhIHByZWZldGNoaW5nIGluIGxvb3BzLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlTG9vcERhdGFQcmVmZXRjaFBhc3MoKTsKKworLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK01vZHVsZVBhc3MgKmNyZWF0ZU5hbWVBbm9uR2xvYmFsUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExpYkNhbGxzU2hyaW5rV3JhcCAtIFNocmluay13cmFwcyBhIGNhbGwgdG8gZnVuY3Rpb24gaWYgdGhlIHJlc3VsdCBpcyBub3QKKy8vIHVzZWQuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVMaWJDYWxsc1Nocmlua1dyYXBQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG9vcFNpbXBsaWZ5Q0ZHIC0gVGhpcyBwYXNzIHBlcmZvcm1zIGJhc2ljIENGRyBzaW1wbGlmaWNhdGlvbiBvbiBsb29wcywKKy8vIHByaW1hcmlseSB0byBoZWxwIG90aGVyIGxvb3AgcGFzc2VzLgorLy8KK1Bhc3MgKmNyZWF0ZUxvb3BTaW1wbGlmeUNGR1Bhc3MoKTsKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9BRENFLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0FEQ0UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOThhZjYyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9BRENFLmgKQEAgLTAsMCArMSwzOCBAQAorLy89PT0tIEFEQ0UuaCAtIEFnZ3Jlc3NpdmUgZGVhZCBjb2RlIGVsaW1pbmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBmb3IgdGhlIEFnZ3Jlc3NpdmUgRGVhZCBDb2RlIEVsaW1pbmF0aW9uCisvLyBwYXNzLiBUaGlzIHBhc3Mgb3B0aW1pc3RpY2FsbHkgYXNzdW1lcyB0aGF0IGFsbCBpbnN0cnVjdGlvbnMgYXJlIGRlYWQgdW50aWwKKy8vIHByb3ZlbiBvdGhlcndpc2UsIGFsbG93aW5nIGl0IHRvIGVsaW1pbmF0ZSBkZWFkIGNvbXB1dGF0aW9ucyB0aGF0IG90aGVyIERDRQorLy8gcGFzc2VzIGRvIG5vdCBjYXRjaCwgcGFydGljdWxhcmx5IGludm9sdmluZyBsb29wIGNvbXB1dGF0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfQURDRV9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfQURDRV9ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CisKKy8vLyBBIERDRSBwYXNzIHRoYXQgYXNzdW1lcyBpbnN0cnVjdGlvbnMgYXJlIGRlYWQgdW50aWwgcHJvdmVuIG90aGVyd2lzZS4KKy8vLworLy8vIFRoaXMgcGFzcyBlbGltaW5hdGVzIGRlYWQgY29kZSBieSBvcHRpbWlzdGljYWxseSBhc3N1bWluZyB0aGF0IGFsbAorLy8vIGluc3RydWN0aW9ucyBhcmUgZGVhZCB1bnRpbCBwcm92ZW4gb3RoZXJ3aXNlLiBUaGlzIGFsbG93cyBpdCB0byBlbGltaW5hdGUKKy8vLyBkZWFkIGNvbXB1dGF0aW9ucyB0aGF0IG90aGVyIERDRSBwYXNzZXMgZG8gbm90IGNhdGNoLCBwYXJ0aWN1bGFybHkgaW52b2x2aW5nCisvLy8gbG9vcCBjb21wdXRhdGlvbnMuCitzdHJ1Y3QgQURDRVBhc3MgOiBQYXNzSW5mb01peGluPEFEQ0VQYXNzPiB7CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9BRENFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvQWxpZ25tZW50RnJvbUFzc3VtcHRpb25zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0FsaWdubWVudEZyb21Bc3N1bXB0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOTc1MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0FsaWdubWVudEZyb21Bc3N1bXB0aW9ucy5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vPT09LS0tLSBBbGlnbm1lbnRGcm9tQXNzdW1wdGlvbnMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSBTY2FsYXJFdm9sdXRpb24tYmFzZWQgdHJhbnNmb3JtYXRpb24gdG8gc2V0CisvLyB0aGUgYWxpZ25tZW50cyBvZiBsb2FkLCBzdG9yZXMgYW5kIG1lbW9yeSBpbnRyaW5zaWNzIGJhc2VkIG9uIHRoZSB0cnV0aAorLy8gZXhwcmVzc2lvbnMgb2YgYXNzdW1lIGludHJpbnNpY3MuIFRoZSBwcmltYXJ5IG1vdGl2YXRpb24gaXMgdG8gaGFuZGxlCisvLyBjb21wbGV4IGFsaWdubWVudCBhc3N1bXB0aW9ucyB0aGF0IGFwcGx5IHRvIHZlY3RvciBsb2FkcyBhbmQgc3RvcmVzIHRoYXQKKy8vIGFwcGVhciBhZnRlciB2ZWN0b3JpemF0aW9uIGFuZCB1bnJvbGxpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0FMSUdOTUVOVEZST01BU1NVTVBUSU9OU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfQUxJR05NRU5URlJPTUFTU1VNUFRJT05TX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitzdHJ1Y3QgQWxpZ25tZW50RnJvbUFzc3VtcHRpb25zUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48QWxpZ25tZW50RnJvbUFzc3VtcHRpb25zUGFzcz4geworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7CisKKyAgLy8gR2x1ZSBmb3Igb2xkIFBNLgorICBib29sIHJ1bkltcGwoRnVuY3Rpb24gJkYsIEFzc3VtcHRpb25DYWNoZSAmQUMsIFNjYWxhckV2b2x1dGlvbiAqU0VfLAorICAgICAgICAgICAgICAgRG9taW5hdG9yVHJlZSAqRFRfKTsKKworICBTY2FsYXJFdm9sdXRpb24gKlNFID0gbnVsbHB0cjsKKyAgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyOworCisgIGJvb2wgZXh0cmFjdEFsaWdubWVudEluZm8oQ2FsbEluc3QgKkksIFZhbHVlIComQUFQdHIsIGNvbnN0IFNDRVYgKiZBbGlnblNDRVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqJk9mZlNDRVYpOworICBib29sIHByb2Nlc3NBc3N1bXB0aW9uKENhbGxJbnN0ICpJKTsKK307Cit9CisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0FMSUdOTUVOVEZST01BU1NVTVBUSU9OU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0JEQ0UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvQkRDRS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZDI3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0JEQ0UuaApAQCAtMCwwICsxLDMxIEBACisvLz09PS0tLS0gQkRDRS5jcHAgLSBCaXQtdHJhY2tpbmcgZGVhZCBjb2RlIGVsaW1pbmF0aW9uIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBCaXQtVHJhY2tpbmcgRGVhZCBDb2RlIEVsaW1pbmF0aW9uIHBhc3MuIFNvbWUKKy8vIGluc3RydWN0aW9ucyAoc2hpZnRzLCBzb21lIGFuZHMsIG9ycywgZXRjLikga2lsbCBzb21lIG9mIHRoZWlyIGlucHV0IGJpdHMuCisvLyBXZSB0cmFjayB0aGVzZSBkZWFkIGJpdHMgYW5kIHJlbW92ZSBpbnN0cnVjdGlvbnMgdGhhdCBjb21wdXRlIG9ubHkgdGhlc2UKKy8vIGRlYWQgYml0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfQkRDRV9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfQkRDRV9ICisKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vIFRoZSBCaXQtVHJhY2tpbmcgRGVhZCBDb2RlIEVsaW1pbmF0aW9uIHBhc3MuCitzdHJ1Y3QgQkRDRVBhc3MgOiBQYXNzSW5mb01peGluPEJEQ0VQYXNzPiB7CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307Cit9CisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0JEQ0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9DYWxsU2l0ZVNwbGl0dGluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9DYWxsU2l0ZVNwbGl0dGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYjk1MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0NhbGxTaXRlU3BsaXR0aW5nLmgKQEAgLTAsMCArMSwyOSBAQAorLy89PT0tIENhbGxTaXRlU3BsaXR0aW5nLi5oIC0gQ2FsbHNpdGUgU3BsaXR0aW5nIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfQ0FMTFNJVEVTUExJVFRJTkdfX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9DQUxMU0lURVNQTElUVElOR19fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU2V0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Bc3N1bXB0aW9uQ2FjaGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitzdHJ1Y3QgQ2FsbFNpdGVTcGxpdHRpbmdQYXNzIDogUGFzc0luZm9NaXhpbjxDYWxsU2l0ZVNwbGl0dGluZ1Bhc3M+IHsKKyAgLy8vIFxicmllZiBSdW4gdGhlIHBhc3Mgb3ZlciB0aGUgZnVuY3Rpb24uCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9DQUxMU0lURVNQTElUVElOR19fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Db25zdGFudEhvaXN0aW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0NvbnN0YW50SG9pc3RpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzMyMmRjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Db25zdGFudEhvaXN0aW5nLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8vPT0tIENvbnN0YW50SG9pc3RpbmcuaCAtIFByZXBhcmUgY29kZSBmb3IgZXhwZW5zaXZlIGNvbnN0YW50cyAtLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGlkZW50aWZpZXMgZXhwZW5zaXZlIGNvbnN0YW50cyB0byBob2lzdCBhbmQgY29hbGVzY2VzIHRoZW0gdG8KKy8vIGJldHRlciBwcmVwYXJlIGl0IGZvciBTZWxlY3Rpb25EQUctYmFzZWQgY29kZSBnZW5lcmF0aW9uLiBUaGlzIHdvcmtzIGFyb3VuZAorLy8gdGhlIGxpbWl0YXRpb25zIG9mIHRoZSBiYXNpYy1ibG9jay1hdC1hLXRpbWUgYXBwcm9hY2guCisvLworLy8gRmlyc3QgaXQgc2NhbnMgYWxsIGluc3RydWN0aW9ucyBmb3IgaW50ZWdlciBjb25zdGFudHMgYW5kIGNhbGN1bGF0ZXMgaXRzCisvLyBjb3N0LiBJZiB0aGUgY29uc3RhbnQgY2FuIGJlIGZvbGRlZCBpbnRvIHRoZSBpbnN0cnVjdGlvbiAodGhlIGNvc3QgaXMKKy8vIFRDQ19GcmVlKSBvciB0aGUgY29zdCBpcyBqdXN0IGEgc2ltcGxlIG9wZXJhdGlvbiAoVENDX0JBU0lDKSwgdGhlbiB3ZSBkb24ndAorLy8gY29uc2lkZXIgaXQgZXhwZW5zaXZlIGFuZCBsZWF2ZSBpdCBhbG9uZS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBhbmQKKy8vIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGdldEludEltbUNvc3Qgd2lsbCBhbHdheXMgcmV0dXJuIFRDQ19GcmVlLgorLy8KKy8vIElmIHRoZSBjb3N0IGlzIG1vcmUgdGhhbiBUQ0NfQkFTSUMsIHRoZW4gdGhlIGludGVnZXIgY29uc3RhbnQgY2FuJ3QgYmUgZm9sZGVkCisvLyBpbnRvIHRoZSBpbnN0cnVjdGlvbiBhbmQgaXQgbWlnaHQgYmUgYmVuZWZpY2lhbCB0byBob2lzdCB0aGUgY29uc3RhbnQuCisvLyBTaW1pbGFyIGNvbnN0YW50cyBhcmUgY29hbGVzY2VkIHRvIHJlZHVjZSByZWdpc3RlciBwcmVzc3VyZSBhbmQKKy8vIG1hdGVyaWFsaXphdGlvbiBjb2RlLgorLy8KKy8vIFdoZW4gYSBjb25zdGFudCBpcyBob2lzdGVkLCBpdCBpcyBhbHNvIGhpZGRlbiBiZWhpbmQgYSBiaXRjYXN0IHRvIGZvcmNlIGl0IHRvCisvLyBiZSBsaXZlLW91dCBvZiB0aGUgYmFzaWMgYmxvY2suIE90aGVyd2lzZSB0aGUgY29uc3RhbnQgd291bGQgYmUganVzdAorLy8gZHVwbGljYXRlZCBhbmQgZWFjaCBiYXNpYyBibG9jayB3b3VsZCBoYXZlIGl0cyBvd24gY29weSBpbiB0aGUgU2VsZWN0aW9uREFHLgorLy8gVGhlIFNlbGVjdGlvbkRBRyByZWNvZ25pemVzIHN1Y2ggY29uc3RhbnRzIGFzIG9wYXF1ZSBhbmQgZG9lc24ndCBwZXJmb3JtCisvLyBjZXJ0YWluIHRyYW5zZm9ybWF0aW9ucyBvbiB0aGVtLCB3aGljaCB3b3VsZCBjcmVhdGUgYSBuZXcgZXhwZW5zaXZlIGNvbnN0YW50LgorLy8KKy8vIFRoaXMgb3B0aW1pemF0aW9uIGlzIG9ubHkgYXBwbGllZCB0byBpbnRlZ2VyIGNvbnN0YW50cyBpbiBpbnN0cnVjdGlvbnMgYW5kCisvLyBzaW1wbGUgKHRoaXMgbWVhbnMgbm90IG5lc3RlZCkgY29uc3RhbnQgY2FzdCBleHByZXNzaW9ucy4gRm9yIGV4YW1wbGU6CisvLyAlMCA9IGxvYWQgaTY0KiBpbnR0b3B0ciAoaTY0IGJpZ19jb25zdGFudCB0byBpNjQqKQorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9DT05TVEFOVEhPSVNUSU5HX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9DT05TVEFOVEhPSVNUSU5HX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBCbG9ja0ZyZXF1ZW5jeUluZm87CitjbGFzcyBDb25zdGFudDsKK2NsYXNzIENvbnN0YW50SW50OworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBUYXJnZXRUcmFuc2Zvcm1JbmZvOworCisvLy8gQSBwcml2YXRlICJtb2R1bGUiIG5hbWVzcGFjZSBmb3IgdHlwZXMgYW5kIHV0aWxpdGllcyB1c2VkIGJ5CisvLy8gQ29uc3RhbnRIb2lzdGluZy4gVGhlc2UgYXJlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieQorLy8vIGNsaWVudHMuCituYW1lc3BhY2UgY29uc3Rob2lzdCB7CisKKy8vLyBcYnJpZWYgS2VlcHMgdHJhY2sgb2YgdGhlIHVzZXIgb2YgYSBjb25zdGFudCBhbmQgdGhlIG9wZXJhbmQgaW5kZXggd2hlcmUgdGhlCisvLy8gY29uc3RhbnQgaXMgdXNlZC4KK3N0cnVjdCBDb25zdGFudFVzZXIgeworICBJbnN0cnVjdGlvbiAqSW5zdDsKKyAgdW5zaWduZWQgT3BuZElkeDsKKworICBDb25zdGFudFVzZXIoSW5zdHJ1Y3Rpb24gKkluc3QsIHVuc2lnbmVkIElkeCkgOiBJbnN0KEluc3QpLCBPcG5kSWR4KElkeCkge30KK307CisKK3VzaW5nIENvbnN0YW50VXNlTGlzdFR5cGUgPSBTbWFsbFZlY3RvcjxDb25zdGFudFVzZXIsIDg+OworCisvLy8gXGJyaWVmIEtlZXBzIHRyYWNrIG9mIGEgY29uc3RhbnQgY2FuZGlkYXRlIGFuZCBpdHMgdXNlcy4KK3N0cnVjdCBDb25zdGFudENhbmRpZGF0ZSB7CisgIENvbnN0YW50VXNlTGlzdFR5cGUgVXNlczsKKyAgQ29uc3RhbnRJbnQgKkNvbnN0SW50OworICB1bnNpZ25lZCBDdW11bGF0aXZlQ29zdCA9IDA7CisKKyAgQ29uc3RhbnRDYW5kaWRhdGUoQ29uc3RhbnRJbnQgKkNvbnN0SW50KSA6IENvbnN0SW50KENvbnN0SW50KSB7fQorCisgIC8vLyBcYnJpZWYgQWRkIHRoZSB1c2VyIHRvIHRoZSB1c2UgbGlzdCBhbmQgdXBkYXRlIHRoZSBjb3N0LgorICB2b2lkIGFkZFVzZXIoSW5zdHJ1Y3Rpb24gKkluc3QsIHVuc2lnbmVkIElkeCwgdW5zaWduZWQgQ29zdCkgeworICAgIEN1bXVsYXRpdmVDb3N0ICs9IENvc3Q7CisgICAgVXNlcy5wdXNoX2JhY2soQ29uc3RhbnRVc2VyKEluc3QsIElkeCkpOworICB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyBhIGNvbnN0YW50IHRoYXQgaGFzIGJlZW4gcmViYXNlZCB3aXRoIHJlc3BlY3QgdG8gYQorLy8vIGJhc2UgY29uc3RhbnQuIFRoZSBkaWZmZXJlbmNlIHRvIHRoZSBiYXNlIGNvbnN0YW50IGlzIHJlY29yZGVkIGluIE9mZnNldC4KK3N0cnVjdCBSZWJhc2VkQ29uc3RhbnRJbmZvIHsKKyAgQ29uc3RhbnRVc2VMaXN0VHlwZSBVc2VzOworICBDb25zdGFudCAqT2Zmc2V0OworCisgIFJlYmFzZWRDb25zdGFudEluZm8oQ29uc3RhbnRVc2VMaXN0VHlwZSAmJlVzZXMsIENvbnN0YW50ICpPZmZzZXQpCisgICAgOiBVc2VzKHN0ZDo6bW92ZShVc2VzKSksIE9mZnNldChPZmZzZXQpIHt9Cit9OworCit1c2luZyBSZWJhc2VkQ29uc3RhbnRMaXN0VHlwZSA9IFNtYWxsVmVjdG9yPFJlYmFzZWRDb25zdGFudEluZm8sIDQ+OworCisvLy8gXGJyaWVmIEEgYmFzZSBjb25zdGFudCBhbmQgYWxsIGl0cyByZWJhc2VkIGNvbnN0YW50cy4KK3N0cnVjdCBDb25zdGFudEluZm8geworICBDb25zdGFudEludCAqQmFzZUNvbnN0YW50OworICBSZWJhc2VkQ29uc3RhbnRMaXN0VHlwZSBSZWJhc2VkQ29uc3RhbnRzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvbnN0aG9pc3QKKworY2xhc3MgQ29uc3RhbnRIb2lzdGluZ1Bhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxDb25zdGFudEhvaXN0aW5nUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7CisKKyAgLy8gR2x1ZSBmb3Igb2xkIFBNLgorICBib29sIHJ1bkltcGwoRnVuY3Rpb24gJkYsIFRhcmdldFRyYW5zZm9ybUluZm8gJlRUSSwgRG9taW5hdG9yVHJlZSAmRFQsCisgICAgICAgICAgICAgICBCbG9ja0ZyZXF1ZW5jeUluZm8gKkJGSSwgQmFzaWNCbG9jayAmRW50cnkpOworCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIHsKKyAgICBDb25zdGFudFZlYy5jbGVhcigpOworICAgIENsb25lZENhc3RNYXAuY2xlYXIoKTsKKyAgICBDb25zdENhbmRWZWMuY2xlYXIoKTsKKyAgfQorCitwcml2YXRlOgorICB1c2luZyBDb25zdENhbmRNYXBUeXBlID0gRGVuc2VNYXA8Q29uc3RhbnRJbnQgKiwgdW5zaWduZWQ+OworICB1c2luZyBDb25zdENhbmRWZWNUeXBlID0gc3RkOjp2ZWN0b3I8Y29uc3Rob2lzdDo6Q29uc3RhbnRDYW5kaWRhdGU+OworCisgIGNvbnN0IFRhcmdldFRyYW5zZm9ybUluZm8gKlRUSTsKKyAgRG9taW5hdG9yVHJlZSAqRFQ7CisgIEJsb2NrRnJlcXVlbmN5SW5mbyAqQkZJOworICBCYXNpY0Jsb2NrICpFbnRyeTsKKworICAvLy8gS2VlcHMgdHJhY2sgb2YgY29uc3RhbnQgY2FuZGlkYXRlcyBmb3VuZCBpbiB0aGUgZnVuY3Rpb24uCisgIENvbnN0Q2FuZFZlY1R5cGUgQ29uc3RDYW5kVmVjOworCisgIC8vLyBLZWVwIHRyYWNrIG9mIGNhc3QgaW5zdHJ1Y3Rpb25zIHdlIGFscmVhZHkgY2xvbmVkLgorICBTbWFsbERlbnNlTWFwPEluc3RydWN0aW9uICosIEluc3RydWN0aW9uICo+IENsb25lZENhc3RNYXA7CisKKyAgLy8vIFRoZXNlIGFyZSB0aGUgZmluYWwgY29uc3RhbnRzIHdlIGRlY2lkZWQgdG8gaG9pc3QuCisgIFNtYWxsVmVjdG9yPGNvbnN0aG9pc3Q6OkNvbnN0YW50SW5mbywgOD4gQ29uc3RhbnRWZWM7CisKKyAgSW5zdHJ1Y3Rpb24gKmZpbmRNYXRJbnNlcnRQdChJbnN0cnVjdGlvbiAqSW5zdCwgdW5zaWduZWQgSWR4ID0gfjBVKSBjb25zdDsKKyAgU21hbGxQdHJTZXQ8SW5zdHJ1Y3Rpb24gKiwgOD4KKyAgZmluZENvbnN0YW50SW5zZXJ0aW9uUG9pbnQoY29uc3QgY29uc3Rob2lzdDo6Q29uc3RhbnRJbmZvICZDb25zdEluZm8pIGNvbnN0OworICB2b2lkIGNvbGxlY3RDb25zdGFudENhbmRpZGF0ZXMoQ29uc3RDYW5kTWFwVHlwZSAmQ29uc3RDYW5kTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc3QsIHVuc2lnbmVkIElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50ICpDb25zdEludCk7CisgIHZvaWQgY29sbGVjdENvbnN0YW50Q2FuZGlkYXRlcyhDb25zdENhbmRNYXBUeXBlICZDb25zdENhbmRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zdCwgdW5zaWduZWQgSWR4KTsKKyAgdm9pZCBjb2xsZWN0Q29uc3RhbnRDYW5kaWRhdGVzKENvbnN0Q2FuZE1hcFR5cGUgJkNvbnN0Q2FuZE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnN0KTsKKyAgdm9pZCBjb2xsZWN0Q29uc3RhbnRDYW5kaWRhdGVzKEZ1bmN0aW9uICZGbik7CisgIHZvaWQgZmluZEFuZE1ha2VCYXNlQ29uc3RhbnQoQ29uc3RDYW5kVmVjVHlwZTo6aXRlcmF0b3IgUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdENhbmRWZWNUeXBlOjppdGVyYXRvciBFKTsKKyAgdW5zaWduZWQgbWF4aW1pemVDb25zdGFudHNJblJhbmdlKENvbnN0Q2FuZFZlY1R5cGU6Oml0ZXJhdG9yIFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdENhbmRWZWNUeXBlOjppdGVyYXRvciBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RDYW5kVmVjVHlwZTo6aXRlcmF0b3IgJk1heENvc3RJdHIpOworICB2b2lkIGZpbmRCYXNlQ29uc3RhbnRzKCk7CisgIHZvaWQgZW1pdEJhc2VDb25zdGFudHMoSW5zdHJ1Y3Rpb24gKkJhc2UsIENvbnN0YW50ICpPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uc3Rob2lzdDo6Q29uc3RhbnRVc2VyICZDb25zdFVzZXIpOworICBib29sIGVtaXRCYXNlQ29uc3RhbnRzKCk7CisgIHZvaWQgZGVsZXRlRGVhZENhc3RJbnN0KCkgY29uc3Q7CisgIGJvb2wgb3B0aW1pemVDb25zdGFudHMoRnVuY3Rpb24gJkZuKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0NPTlNUQU5USE9JU1RJTkdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Db3JyZWxhdGVkVmFsdWVQcm9wYWdhdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Db3JyZWxhdGVkVmFsdWVQcm9wYWdhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOTMwNjkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0NvcnJlbGF0ZWRWYWx1ZVByb3BhZ2F0aW9uLmgKQEAgLTAsMCArMSwyNiBAQAorLy89PT0tIENvcnJlbGF0ZWRWYWx1ZVByb3BhZ2F0aW9uLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0NPUlJFTEFURURWQUxVRVBST1BBR0FUSU9OX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9DT1JSRUxBVEVEVkFMVUVQUk9QQUdBVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CisKK3N0cnVjdCBDb3JyZWxhdGVkVmFsdWVQcm9wYWdhdGlvblBhc3MKKyAgICA6IFBhc3NJbmZvTWl4aW48Q29ycmVsYXRlZFZhbHVlUHJvcGFnYXRpb25QYXNzPiB7CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0NPUlJFTEFURURWQUxVRVBST1BBR0FUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvRENFLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0RDRS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MzM0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0RDRS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vPT09LSBEQ0UuaCAtIERlYWQgY29kZSBlbGltaW5hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBEZWFkIENvZGUgRWxpbWluYXRpb24gcGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfRENFX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9EQ0VfSAorCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQmFzaWMgRGVhZCBDb2RlIEVsaW1pbmF0aW9uIHBhc3MuCitjbGFzcyBEQ0VQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48RENFUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworfQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9EQ0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9EZWFkU3RvcmVFbGltaW5hdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9EZWFkU3RvcmVFbGltaW5hdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZWIyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0RlYWRTdG9yZUVsaW1pbmF0aW9uLmgKQEAgLTAsMCArMSwzNiBAQAorLy89PT0tIERlYWRTdG9yZUVsaW1pbmF0aW9uLmggLSBGYXN0IERlYWQgU3RvcmUgRWxpbWluYXRpb24gLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHRyaXZpYWwgZGVhZCBzdG9yZSBlbGltaW5hdGlvbiB0aGF0IG9ubHkgY29uc2lkZXJzCisvLyBiYXNpYy1ibG9jayBsb2NhbCByZWR1bmRhbnQgc3RvcmVzLgorLy8KKy8vIEZJWE1FOiBUaGlzIHNob3VsZCBldmVudHVhbGx5IGJlIGV4dGVuZGVkIHRvIGJlIGEgcG9zdC1kb21pbmF0b3IgdHJlZQorLy8gdHJhdmVyc2FsLiAgRG9pbmcgc28gd291bGQgYmUgcHJldHR5IHRyaXZpYWwuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0RFQURTVE9SRUVMSU1JTkFUSU9OX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9ERUFEU1RPUkVFTElNSU5BVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CisKKy8vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSB0cml2aWFsIGRlYWQgc3RvcmUgZWxpbWluYXRpb24uIFdlIGNvbnNpZGVyCisvLy8gb25seSB0aGUgcmVkdW5kYW50IHN0b3JlcyB0aGF0IGFyZSBsb2NhbCB0byBhIHNpbmdsZSBCYXNpYyBCbG9jay4KK2NsYXNzIERTRVBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxEU0VQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9ERUFEU1RPUkVFTElNSU5BVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0RpdlJlbVBhaXJzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0RpdlJlbVBhaXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0MzQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvRGl2UmVtUGFpcnMuaApAQCAtMCwwICsxLDMxIEBACisvLz09PS0gRGl2UmVtUGFpcnMuaCAtIEhvaXN0L2RlY29tcG9zZSBpbnRlZ2VyIGRpdmlzaW9uIGFuZCByZW1haW5kZXIgLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBob2lzdHMgYW5kL29yIGRlY29tcG9zZXMgaW50ZWdlciBkaXZpc2lvbiBhbmQgcmVtYWluZGVyCisvLyBpbnN0cnVjdGlvbnMgdG8gZW5hYmxlIENGRyBpbXByb3ZlbWVudHMgYW5kIGJldHRlciBjb2RlZ2VuLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9ESVZSRU1QQUlSU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfRElWUkVNUEFJUlNfSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBIb2lzdC9kZWNvbXBvc2UgaW50ZWdlciBkaXZpc2lvbiBhbmQgcmVtYWluZGVyIGluc3RydWN0aW9ucyB0byBlbmFibGUgQ0ZHCisvLy8gaW1wcm92ZW1lbnRzIGFuZCBiZXR0ZXIgY29kZWdlbi4KK3N0cnVjdCBEaXZSZW1QYWlyc1Bhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxEaXZSZW1QYWlyc1Bhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmKTsKK307CisKK30KKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0RJVlJFTVBBSVJTX0gKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9FYXJseUNTRS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9FYXJseUNTRS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYTNiMmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0Vhcmx5Q1NFLmgKQEAgLTAsMCArMSw0MiBAQAorLy89PT0tIEVhcmx5Q1NFLmggLSBTaW1wbGUgYW5kIGZhc3QgQ1NFIHBhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBmb3IgYSBzaW1wbGUsIGZhc3QgQ1NFIHBhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0VBUkxZQ1NFX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9FQVJMWUNTRV9ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CisKKy8vLyBcYnJpZWYgQSBzaW1wbGUgYW5kIGZhc3QgZG9tdHJlZS1iYXNlZCBDU0UgcGFzcy4KKy8vLworLy8vIFRoaXMgcGFzcyBkb2VzIGEgc2ltcGxlIGRlcHRoLWZpcnN0IHdhbGsgb3ZlciB0aGUgZG9taW5hdG9yIHRyZWUsCisvLy8gZWxpbWluYXRpbmcgdHJpdmlhbGx5IHJlZHVuZGFudCBpbnN0cnVjdGlvbnMgYW5kIHVzaW5nIGluc3RzaW1wbGlmeSB0bworLy8vIGNhbm9uaWNhbGl6ZSB0aGluZ3MgYXMgaXQgZ29lcy4gSXQgaXMgaW50ZW5kZWQgdG8gYmUgZmFzdCBhbmQgY2F0Y2ggb2J2aW91cworLy8vIGNhc2VzIHNvIHRoYXQgaW5zdGNvbWJpbmUgYW5kIG90aGVyIHBhc3NlcyBhcmUgbW9yZSBlZmZlY3RpdmUuIEl0IGlzCisvLy8gZXhwZWN0ZWQgdGhhdCBhIGxhdGVyIHBhc3Mgb2YgR1ZOIHdpbGwgY2F0Y2ggdGhlIGludGVyZXN0aW5nL2hhcmQgY2FzZXMuCitzdHJ1Y3QgRWFybHlDU0VQYXNzIDogUGFzc0luZm9NaXhpbjxFYXJseUNTRVBhc3M+IHsKKyAgRWFybHlDU0VQYXNzKGJvb2wgVXNlTWVtb3J5U1NBID0gZmFsc2UpIDogVXNlTWVtb3J5U1NBKFVzZU1lbW9yeVNTQSkge30KKworICAvLy8gXGJyaWVmIFJ1biB0aGUgcGFzcyBvdmVyIHRoZSBmdW5jdGlvbi4KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworCisgIGJvb2wgVXNlTWVtb3J5U1NBOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfRUFSTFlDU0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9GbG9hdDJJbnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvRmxvYXQySW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA2ZWU5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvRmxvYXQySW50LmgKQEAgLTAsMCArMSw1MSBAQAorLy89PT0tLSBGbG9hdDJJbnQuaCAtIERlbW90ZSBmbG9hdGluZyBwb2ludCBvcHMgdG8gd29yayBvbiBpbnRlZ2VycyAtLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIEZsb2F0MkludCBwYXNzLCB3aGljaCBhaW1zIHRvIGRlbW90ZSBmbG9hdGluZworLy8gcG9pbnQgb3BlcmF0aW9ucyB0byB3b3JrIG9uIGludGVnZXJzLCB3aGVyZSB0aGF0IGlzIGxvc3NsZXNzbHkgcG9zc2libGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0ZMT0FUMklOVF9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfRkxPQVQySU5UX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0VxdWl2YWxlbmNlQ2xhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL01hcFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRSYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEZsb2F0MkludFBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxGbG9hdDJJbnRQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKKworICAvLyBHbHVlIGZvciBvbGQgUE0uCisgIGJvb2wgcnVuSW1wbChGdW5jdGlvbiAmRik7CisKK3ByaXZhdGU6CisgIHZvaWQgZmluZFJvb3RzKEZ1bmN0aW9uICZGLCBTbWFsbFB0clNldDxJbnN0cnVjdGlvbiAqLCA4PiAmUm9vdHMpOworICB2b2lkIHNlZW4oSW5zdHJ1Y3Rpb24gKkksIENvbnN0YW50UmFuZ2UgUik7CisgIENvbnN0YW50UmFuZ2UgYmFkUmFuZ2UoKTsKKyAgQ29uc3RhbnRSYW5nZSB1bmtub3duUmFuZ2UoKTsKKyAgQ29uc3RhbnRSYW5nZSB2YWxpZGF0ZVJhbmdlKENvbnN0YW50UmFuZ2UgUik7CisgIHZvaWQgd2Fsa0JhY2t3YXJkcyhjb25zdCBTbWFsbFB0clNldEltcGw8SW5zdHJ1Y3Rpb24gKj4gJlJvb3RzKTsKKyAgdm9pZCB3YWxrRm9yd2FyZHMoKTsKKyAgYm9vbCB2YWxpZGF0ZUFuZFRyYW5zZm9ybSgpOworICBWYWx1ZSAqY29udmVydChJbnN0cnVjdGlvbiAqSSwgVHlwZSAqVG9UeSk7CisgIHZvaWQgY2xlYW51cCgpOworCisgIE1hcFZlY3RvcjxJbnN0cnVjdGlvbiAqLCBDb25zdGFudFJhbmdlPiBTZWVuSW5zdHM7CisgIFNtYWxsUHRyU2V0PEluc3RydWN0aW9uICosIDg+IFJvb3RzOworICBFcXVpdmFsZW5jZUNsYXNzZXM8SW5zdHJ1Y3Rpb24gKj4gRUNzOworICBNYXBWZWN0b3I8SW5zdHJ1Y3Rpb24gKiwgVmFsdWUgKj4gQ29udmVydGVkSW5zdHM7CisgIExMVk1Db250ZXh0ICpDdHg7Cit9OworfQorI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfRkxPQVQySU5UX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvR1ZOLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0dWTi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MGQzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0dWTi5oCkBAIC0wLDAgKzEsMzEwIEBACisvLz09PS0gR1ZOLmggLSBFbGltaW5hdGUgcmVkdW5kYW50IHZhbHVlcyBhbmQgbG9hZHMgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgZm9yIExMVk0ncyBHbG9iYWwgVmFsdWUgTnVtYmVyaW5nIHBhc3MKKy8vLyB3aGljaCBlbGltaW5hdGVzIGZ1bGx5IHJlZHVuZGFudCBpbnN0cnVjdGlvbnMuIEl0IGFsc28gZG9lcyBzb21ld2hhdCBBZC1Ib2MKKy8vLyBQUkUgYW5kIGRlYWQgbG9hZCBlbGltaW5hdGlvbi4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0dWTl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfR1ZOX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTWFwVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9zdE9yZGVySXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0clR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvT3JkZXJlZEluc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQXNzdW1wdGlvbkNhY2hlOworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEJyYW5jaEluc3Q7CitjbGFzcyBDYWxsSW5zdDsKK2NsYXNzIENvbnN0YW50OworY2xhc3MgRXh0cmFjdFZhbHVlSW5zdDsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgRnVuY3Rpb25QYXNzOworY2xhc3MgSW50cmluc2ljSW5zdDsKK2NsYXNzIExvYWRJbnN0OworY2xhc3MgTG9vcEluZm87CitjbGFzcyBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyOworY2xhc3MgUEhJTm9kZTsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworY2xhc3MgVmFsdWU7CisKKy8vLyBBIHByaXZhdGUgIm1vZHVsZSIgbmFtZXNwYWNlIGZvciB0eXBlcyBhbmQgdXRpbGl0aWVzIHVzZWQgYnkgR1ZOLiBUaGVzZQorLy8vIGFyZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgY2xpZW50cy4KK25hbWVzcGFjZSBndm4gTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgeworCitzdHJ1Y3QgQXZhaWxhYmxlVmFsdWU7CitzdHJ1Y3QgQXZhaWxhYmxlVmFsdWVJbkJsb2NrOworY2xhc3MgR1ZOTGVnYWN5UGFzczsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGd2bgorCisvLy8gVGhlIGNvcmUgR1ZOIHBhc3Mgb2JqZWN0LgorLy8vCisvLy8gRklYTUU6IFdlIHNob3VsZCBoYXZlIGEgZ29vZCBzdW1tYXJ5IG9mIHRoZSBHVk4gYWxnb3JpdGhtIGltcGxlbWVudGVkIGJ5CisvLy8gdGhpcyBwYXJ0aWN1bGFyIHBhc3MgaGVyZS4KK2NsYXNzIEdWTiA6IHB1YmxpYyBQYXNzSW5mb01peGluPEdWTj4geworcHVibGljOgorICBzdHJ1Y3QgRXhwcmVzc2lvbjsKKworICAvLy8gXGJyaWVmIFJ1biB0aGUgcGFzcyBvdmVyIHRoZSBmdW5jdGlvbi4KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworCisgIC8vLyBUaGlzIHJlbW92ZXMgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBmcm9tCisgIC8vLyBvdXIgdmFyaW91cyBtYXBzIGFuZCBtYXJrcyBpdCBmb3IgZGVsZXRpb24uCisgIHZvaWQgbWFya0luc3RydWN0aW9uRm9yRGVsZXRpb24oSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICBWTi5lcmFzZShJKTsKKyAgICBJbnN0cnNUb0VyYXNlLnB1c2hfYmFjayhJKTsKKyAgfQorCisgIERvbWluYXRvclRyZWUgJmdldERvbWluYXRvclRyZWUoKSBjb25zdCB7IHJldHVybiAqRFQ7IH0KKyAgQWxpYXNBbmFseXNpcyAqZ2V0QWxpYXNBbmFseXNpcygpIGNvbnN0IHsgcmV0dXJuIFZOLmdldEFsaWFzQW5hbHlzaXMoKTsgfQorICBNZW1vcnlEZXBlbmRlbmNlUmVzdWx0cyAmZ2V0TWVtRGVwKCkgY29uc3QgeyByZXR1cm4gKk1EOyB9CisKKyAgLy8vIFRoaXMgY2xhc3MgaG9sZHMgdGhlIG1hcHBpbmcgYmV0d2VlbiB2YWx1ZXMgYW5kIHZhbHVlIG51bWJlcnMuICBJdCBpcyB1c2VkCisgIC8vLyBhcyBhbiBlZmZpY2llbnQgbWVjaGFuaXNtIHRvIGRldGVybWluZSB0aGUgZXhwcmVzc2lvbi13aXNlIGVxdWl2YWxlbmNlIG9mCisgIC8vLyB0d28gdmFsdWVzLgorICBjbGFzcyBWYWx1ZVRhYmxlIHsKKyAgICBEZW5zZU1hcDxWYWx1ZSAqLCB1aW50MzJfdD4gdmFsdWVOdW1iZXJpbmc7CisgICAgRGVuc2VNYXA8RXhwcmVzc2lvbiwgdWludDMyX3Q+IGV4cHJlc3Npb25OdW1iZXJpbmc7CisKKyAgICAvLyBFeHByZXNzaW9ucyBpcyB0aGUgdmVjdG9yIG9mIEV4cHJlc3Npb24uIEV4cHJJZHggaXMgdGhlIG1hcHBpbmcgZnJvbQorICAgIC8vIHZhbHVlIG51bWJlciB0byB0aGUgaW5kZXggb2YgRXhwcmVzc2lvbiBpbiBFeHByZXNzaW9ucy4gV2UgdXNlIGl0CisgICAgLy8gaW5zdGVhZCBvZiBhIERlbnNlTWFwIGJlY2F1c2UgZmlsbGluZyBzdWNoIG1hcHBpbmcgaXMgZmFzdGVyIHRoYW4KKyAgICAvLyBmaWxsaW5nIGEgRGVuc2VNYXAgYW5kIHRoZSBjb21waWxlIHRpbWUgaXMgYSBsaXR0bGUgYmV0dGVyLgorICAgIHVpbnQzMl90IG5leHRFeHByTnVtYmVyOworCisgICAgc3RkOjp2ZWN0b3I8RXhwcmVzc2lvbj4gRXhwcmVzc2lvbnM7CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IEV4cHJJZHg7CisKKyAgICAvLyBWYWx1ZSBudW1iZXIgdG8gUEhJTm9kZSBtYXBwaW5nLiBVc2VkIGZvciBwaGktdHJhbnNsYXRlIGluIHNjYWxhcnByZS4KKyAgICBEZW5zZU1hcDx1aW50MzJfdCwgUEhJTm9kZSAqPiBOdW1iZXJpbmdQaGk7CisKKyAgICAvLyBDYWNoZSBmb3IgcGhpLXRyYW5zbGF0ZSBpbiBzY2FsYXJwcmUuCisgICAgdXNpbmcgUGhpVHJhbnNsYXRlTWFwID0KKyAgICAgICAgRGVuc2VNYXA8c3RkOjpwYWlyPHVpbnQzMl90LCBjb25zdCBCYXNpY0Jsb2NrICo+LCB1aW50MzJfdD47CisgICAgUGhpVHJhbnNsYXRlTWFwIFBoaVRyYW5zbGF0ZVRhYmxlOworCisgICAgQWxpYXNBbmFseXNpcyAqQUE7CisgICAgTWVtb3J5RGVwZW5kZW5jZVJlc3VsdHMgKk1EOworICAgIERvbWluYXRvclRyZWUgKkRUOworCisgICAgdWludDMyX3QgbmV4dFZhbHVlTnVtYmVyID0gMTsKKworICAgIEV4cHJlc3Npb24gY3JlYXRlRXhwcihJbnN0cnVjdGlvbiAqSSk7CisgICAgRXhwcmVzc2lvbiBjcmVhdGVDbXBFeHByKHVuc2lnbmVkIE9wY29kZSwgQ21wSW5zdDo6UHJlZGljYXRlIFByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKkxIUywgVmFsdWUgKlJIUyk7CisgICAgRXhwcmVzc2lvbiBjcmVhdGVFeHRyYWN0dmFsdWVFeHByKEV4dHJhY3RWYWx1ZUluc3QgKkVJKTsKKyAgICB1aW50MzJfdCBsb29rdXBPckFkZENhbGwoQ2FsbEluc3QgKkMpOworICAgIHVpbnQzMl90IHBoaVRyYW5zbGF0ZUltcGwoY29uc3QgQmFzaWNCbG9jayAqQkIsIGNvbnN0IEJhc2ljQmxvY2sgKlBoaUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTnVtLCBHVk4gJkd2bik7CisgICAgc3RkOjpwYWlyPHVpbnQzMl90LCBib29sPiBhc3NpZ25FeHBOZXdWYWx1ZU51bShFeHByZXNzaW9uICZleHApOworICAgIGJvb2wgYXJlQWxsVmFsc0luQkIodWludDMyX3QgbnVtLCBjb25zdCBCYXNpY0Jsb2NrICpCQiwgR1ZOICZHdm4pOworCisgIHB1YmxpYzoKKyAgICBWYWx1ZVRhYmxlKCk7CisgICAgVmFsdWVUYWJsZShjb25zdCBWYWx1ZVRhYmxlICZBcmcpOworICAgIFZhbHVlVGFibGUoVmFsdWVUYWJsZSAmJkFyZyk7CisgICAgflZhbHVlVGFibGUoKTsKKworICAgIHVpbnQzMl90IGxvb2t1cE9yQWRkKFZhbHVlICpWKTsKKyAgICB1aW50MzJfdCBsb29rdXAoVmFsdWUgKlYsIGJvb2wgVmVyaWZ5ID0gdHJ1ZSkgY29uc3Q7CisgICAgdWludDMyX3QgbG9va3VwT3JBZGRDbXAodW5zaWduZWQgT3Bjb2RlLCBDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKTsKKyAgICB1aW50MzJfdCBwaGlUcmFuc2xhdGUoY29uc3QgQmFzaWNCbG9jayAqQkIsIGNvbnN0IEJhc2ljQmxvY2sgKlBoaUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBOdW0sIEdWTiAmR3ZuKTsKKyAgICB2b2lkIGVyYXNlVHJhbnNsYXRlQ2FjaGVFbnRyeSh1aW50MzJfdCBOdW0sIGNvbnN0IEJhc2ljQmxvY2sgJkN1cnJCbG9jayk7CisgICAgYm9vbCBleGlzdHMoVmFsdWUgKlYpIGNvbnN0OworICAgIHZvaWQgYWRkKFZhbHVlICpWLCB1aW50MzJfdCBudW0pOworICAgIHZvaWQgY2xlYXIoKTsKKyAgICB2b2lkIGVyYXNlKFZhbHVlICp2KTsKKyAgICB2b2lkIHNldEFsaWFzQW5hbHlzaXMoQWxpYXNBbmFseXNpcyAqQSkgeyBBQSA9IEE7IH0KKyAgICBBbGlhc0FuYWx5c2lzICpnZXRBbGlhc0FuYWx5c2lzKCkgY29uc3QgeyByZXR1cm4gQUE7IH0KKyAgICB2b2lkIHNldE1lbURlcChNZW1vcnlEZXBlbmRlbmNlUmVzdWx0cyAqTSkgeyBNRCA9IE07IH0KKyAgICB2b2lkIHNldERvbVRyZWUoRG9taW5hdG9yVHJlZSAqRCkgeyBEVCA9IEQ7IH0KKyAgICB1aW50MzJfdCBnZXROZXh0VW51c2VkVmFsdWVOdW1iZXIoKSB7IHJldHVybiBuZXh0VmFsdWVOdW1iZXI7IH0KKyAgICB2b2lkIHZlcmlmeVJlbW92ZWQoY29uc3QgVmFsdWUgKikgY29uc3Q7CisgIH07CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBndm46OkdWTkxlZ2FjeVBhc3M7CisgIGZyaWVuZCBzdHJ1Y3QgRGVuc2VNYXBJbmZvPEV4cHJlc3Npb24+OworCisgIE1lbW9yeURlcGVuZGVuY2VSZXN1bHRzICpNRDsKKyAgRG9taW5hdG9yVHJlZSAqRFQ7CisgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEk7CisgIEFzc3VtcHRpb25DYWNoZSAqQUM7CisgIFNldFZlY3RvcjxCYXNpY0Jsb2NrICo+IERlYWRCbG9ja3M7CisgIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgKk9SRTsKKyAgLy8gTWFwcyBhIGJsb2NrIHRvIHRoZSB0b3Btb3N0IGluc3RydWN0aW9uIHdpdGggaW1wbGljaXQgY29udHJvbCBmbG93IGluIGl0LgorICBEZW5zZU1hcDxjb25zdCBCYXNpY0Jsb2NrICosIGNvbnN0IEluc3RydWN0aW9uICo+CisgICAgICBGaXJzdEltcGxpY2l0Q29udHJvbEZsb3dJbnN0czsKKworICBPcmRlcmVkSW5zdHJ1Y3Rpb25zICpPSTsKKyAgVmFsdWVUYWJsZSBWTjsKKworICAvLy8gQSBtYXBwaW5nIGZyb20gdmFsdWUgbnVtYmVycyB0byBsaXN0cyBvZiBWYWx1ZSoncyB0aGF0CisgIC8vLyBoYXZlIHRoYXQgdmFsdWUgbnVtYmVyLiAgVXNlIGZpbmRMZWFkZXIgdG8gcXVlcnkgaXQuCisgIHN0cnVjdCBMZWFkZXJUYWJsZUVudHJ5IHsKKyAgICBWYWx1ZSAqVmFsOworICAgIGNvbnN0IEJhc2ljQmxvY2sgKkJCOworICAgIExlYWRlclRhYmxlRW50cnkgKk5leHQ7CisgIH07CisgIERlbnNlTWFwPHVpbnQzMl90LCBMZWFkZXJUYWJsZUVudHJ5PiBMZWFkZXJUYWJsZTsKKyAgQnVtcFB0ckFsbG9jYXRvciBUYWJsZUFsbG9jYXRvcjsKKworICAvLyBCbG9jay1sb2NhbCBtYXAgb2YgZXF1aXZhbGVudCB2YWx1ZXMgdG8gdGhlaXIgbGVhZGVyLCBkb2VzIG5vdAorICAvLyBwcm9wYWdhdGUgdG8gYW55IHN1Y2Nlc3NvcnMuIEVudHJpZXMgYWRkZWQgbWlkLWJsb2NrIGFyZSBhcHBsaWVkCisgIC8vIHRvIHRoZSByZW1haW5pbmcgaW5zdHJ1Y3Rpb25zIGluIHRoZSBibG9jay4KKyAgU21hbGxNYXBWZWN0b3I8VmFsdWUgKiwgQ29uc3RhbnQgKiwgND4gUmVwbGFjZVdpdGhDb25zdE1hcDsKKyAgU21hbGxWZWN0b3I8SW5zdHJ1Y3Rpb24gKiwgOD4gSW5zdHJzVG9FcmFzZTsKKworICAvLyBNYXAgdGhlIGJsb2NrIHRvIHJldmVyc2VkIHBvc3RvcmRlciB0cmF2ZXJzYWwgbnVtYmVyLiBJdCBpcyB1c2VkIHRvCisgIC8vIGZpbmQgYmFjayBlZGdlIGVhc2lseS4KKyAgRGVuc2VNYXA8Y29uc3QgQmFzaWNCbG9jayAqLCB1aW50MzJfdD4gQmxvY2tSUE9OdW1iZXI7CisKKyAgdXNpbmcgTG9hZERlcFZlY3QgPSBTbWFsbFZlY3RvcjxOb25Mb2NhbERlcFJlc3VsdCwgNjQ+OworICB1c2luZyBBdmFpbFZhbEluQmxrVmVjdCA9IFNtYWxsVmVjdG9yPGd2bjo6QXZhaWxhYmxlVmFsdWVJbkJsb2NrLCA2ND47CisgIHVzaW5nIFVuYXZhaWxCbGtWZWN0ID0gU21hbGxWZWN0b3I8QmFzaWNCbG9jayAqLCA2ND47CisKKyAgYm9vbCBydW5JbXBsKEZ1bmN0aW9uICZGLCBBc3N1bXB0aW9uQ2FjaGUgJlJ1bkFDLCBEb21pbmF0b3JUcmVlICZSdW5EVCwKKyAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICZSdW5UTEksIEFBUmVzdWx0cyAmUnVuQUEsCisgICAgICAgICAgICAgICBNZW1vcnlEZXBlbmRlbmNlUmVzdWx0cyAqUnVuTUQsIExvb3BJbmZvICpMSSwKKyAgICAgICAgICAgICAgIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgKk9SRSk7CisKKyAgLy8vIFB1c2ggYSBuZXcgVmFsdWUgdG8gdGhlIExlYWRlclRhYmxlIG9udG8gdGhlIGxpc3QgZm9yIGl0cyB2YWx1ZSBudW1iZXIuCisgIHZvaWQgYWRkVG9MZWFkZXJUYWJsZSh1aW50MzJfdCBOLCBWYWx1ZSAqViwgY29uc3QgQmFzaWNCbG9jayAqQkIpIHsKKyAgICBMZWFkZXJUYWJsZUVudHJ5ICZDdXJyID0gTGVhZGVyVGFibGVbTl07CisgICAgaWYgKCFDdXJyLlZhbCkgeworICAgICAgQ3Vyci5WYWwgPSBWOworICAgICAgQ3Vyci5CQiA9IEJCOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExlYWRlclRhYmxlRW50cnkgKk5vZGUgPSBUYWJsZUFsbG9jYXRvci5BbGxvY2F0ZTxMZWFkZXJUYWJsZUVudHJ5PigpOworICAgIE5vZGUtPlZhbCA9IFY7CisgICAgTm9kZS0+QkIgPSBCQjsKKyAgICBOb2RlLT5OZXh0ID0gQ3Vyci5OZXh0OworICAgIEN1cnIuTmV4dCA9IE5vZGU7CisgIH0KKworICAvLy8gU2NhbiB0aGUgbGlzdCBvZiB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuCisgIC8vLyB2YWx1ZSBudW1iZXIsIGFuZCByZW1vdmUgdGhlIGdpdmVuIGluc3RydWN0aW9uIGlmIGVuY291bnRlcmVkLgorICB2b2lkIHJlbW92ZUZyb21MZWFkZXJUYWJsZSh1aW50MzJfdCBOLCBJbnN0cnVjdGlvbiAqSSwgQmFzaWNCbG9jayAqQkIpIHsKKyAgICBMZWFkZXJUYWJsZUVudHJ5ICpQcmV2ID0gbnVsbHB0cjsKKyAgICBMZWFkZXJUYWJsZUVudHJ5ICpDdXJyID0gJkxlYWRlclRhYmxlW05dOworCisgICAgd2hpbGUgKEN1cnIgJiYgKEN1cnItPlZhbCAhPSBJIHx8IEN1cnItPkJCICE9IEJCKSkgeworICAgICAgUHJldiA9IEN1cnI7CisgICAgICBDdXJyID0gQ3Vyci0+TmV4dDsKKyAgICB9CisKKyAgICBpZiAoIUN1cnIpCisgICAgICByZXR1cm47CisKKyAgICBpZiAoUHJldikgeworICAgICAgUHJldi0+TmV4dCA9IEN1cnItPk5leHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghQ3Vyci0+TmV4dCkgeworICAgICAgICBDdXJyLT5WYWwgPSBudWxscHRyOworICAgICAgICBDdXJyLT5CQiA9IG51bGxwdHI7CisgICAgICB9IGVsc2UgeworICAgICAgICBMZWFkZXJUYWJsZUVudHJ5ICpOZXh0ID0gQ3Vyci0+TmV4dDsKKyAgICAgICAgQ3Vyci0+VmFsID0gTmV4dC0+VmFsOworICAgICAgICBDdXJyLT5CQiA9IE5leHQtPkJCOworICAgICAgICBDdXJyLT5OZXh0ID0gTmV4dC0+TmV4dDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBMaXN0IG9mIGNyaXRpY2FsIGVkZ2VzIHRvIGJlIHNwbGl0IGJldHdlZW4gaXRlcmF0aW9ucy4KKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPFRlcm1pbmF0b3JJbnN0ICosIHVuc2lnbmVkPiwgND4gdG9TcGxpdDsKKworICAvLyBIZWxwZXIgZnVuY3Rpb25zIG9mIHJlZHVuZGFudCBsb2FkIGVsaW1pbmF0aW9uCisgIGJvb2wgcHJvY2Vzc0xvYWQoTG9hZEluc3QgKkwpOworICBib29sIHByb2Nlc3NOb25Mb2NhbExvYWQoTG9hZEluc3QgKkwpOworICBib29sIHByb2Nlc3NBc3N1bWVJbnRyaW5zaWMoSW50cmluc2ljSW5zdCAqSUkpOworCisgIC8vLyBHaXZlbiBhIGxvY2FsIGRlcGVuZGVuY3kgKERlZiBvciBDbG9iYmVyKSBkZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcworICAvLy8gYXZhaWxhYmxlIGZvciB0aGUgbG9hZC4gIFJldHVybnMgdHJ1ZSBpZiBhbiB2YWx1ZSBpcyBrbm93biB0byBiZQorICAvLy8gYXZhaWxhYmxlIGFuZCBwb3B1bGF0ZXMgUmVzLiAgUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgQW5hbHl6ZUxvYWRBdmFpbGFiaWxpdHkoTG9hZEluc3QgKkxJLCBNZW1EZXBSZXN1bHQgRGVwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQWRkcmVzcywgZ3ZuOjpBdmFpbGFibGVWYWx1ZSAmUmVzKTsKKworICAvLy8gR2l2ZW4gYSBsaXN0IG9mIG5vbi1sb2NhbCBkZXBlbmRlbmNpZXMsIGRldGVybWluZSBpZiBhIHZhbHVlIGlzCisgIC8vLyBhdmFpbGFibGUgZm9yIHRoZSBsb2FkIGluIGVhY2ggc3BlY2lmaWVkIGJsb2NrLiAgSWYgaXQgaXMsIGFkZCBpdCB0bworICAvLy8gVmFsdWVzUGVyQmxvY2suICBJZiBub3QsIGFkZCBpdCB0byBVbmF2YWlsYWJsZUJsb2Nrcy4KKyAgdm9pZCBBbmFseXplTG9hZEF2YWlsYWJpbGl0eShMb2FkSW5zdCAqTEksIExvYWREZXBWZWN0ICZEZXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2YWlsVmFsSW5CbGtWZWN0ICZWYWx1ZXNQZXJCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmF2YWlsQmxrVmVjdCAmVW5hdmFpbGFibGVCbG9ja3MpOworCisgIGJvb2wgUGVyZm9ybUxvYWRQUkUoTG9hZEluc3QgKkxJLCBBdmFpbFZhbEluQmxrVmVjdCAmVmFsdWVzUGVyQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgVW5hdmFpbEJsa1ZlY3QgJlVuYXZhaWxhYmxlQmxvY2tzKTsKKworICAvLyBPdGhlciBoZWxwZXIgcm91dGluZXMKKyAgYm9vbCBwcm9jZXNzSW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gKkkpOworICBib29sIHByb2Nlc3NCbG9jayhCYXNpY0Jsb2NrICpCQik7CisgIHZvaWQgZHVtcChEZW5zZU1hcDx1aW50MzJfdCwgVmFsdWUgKj4gJmQpIGNvbnN0OworICBib29sIGl0ZXJhdGVPbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKTsKKyAgYm9vbCBwZXJmb3JtUFJFKEZ1bmN0aW9uICZGKTsKKyAgYm9vbCBwZXJmb3JtU2NhbGFyUFJFKEluc3RydWN0aW9uICpJKTsKKyAgYm9vbCBwZXJmb3JtU2NhbGFyUFJFSW5zZXJ0aW9uKEluc3RydWN0aW9uICpJbnN0ciwgQmFzaWNCbG9jayAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkN1cnIsIHVuc2lnbmVkIGludCBWYWxObyk7CisgIFZhbHVlICpmaW5kTGVhZGVyKGNvbnN0IEJhc2ljQmxvY2sgKkJCLCB1aW50MzJfdCBudW0pOworICB2b2lkIGNsZWFudXBHbG9iYWxTZXRzKCk7CisgIHZvaWQgZmlsbEltcGxpY2l0Q29udHJvbEZsb3dJbmZvKEJhc2ljQmxvY2sgKkJCKTsKKyAgdm9pZCB2ZXJpZnlSZW1vdmVkKGNvbnN0IEluc3RydWN0aW9uICpJKSBjb25zdDsKKyAgYm9vbCBzcGxpdENyaXRpY2FsRWRnZXMoKTsKKyAgQmFzaWNCbG9jayAqc3BsaXRDcml0aWNhbEVkZ2VzKEJhc2ljQmxvY2sgKlByZWQsIEJhc2ljQmxvY2sgKlN1Y2MpOworICBib29sIHJlcGxhY2VPcGVyYW5kc1dpdGhDb25zdHMoSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0OworICBib29sIHByb3BhZ2F0ZUVxdWFsaXR5KFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IEJhc2ljQmxvY2tFZGdlICZSb290LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRG9taW5hdGVzQnlFZGdlKTsKKyAgYm9vbCBwcm9jZXNzRm9sZGFibGVDb25kQnIoQnJhbmNoSW5zdCAqQkkpOworICB2b2lkIGFkZERlYWRCbG9jayhCYXNpY0Jsb2NrICpCQik7CisgIHZvaWQgYXNzaWduVmFsTnVtRm9yRGVhZENvZGUoKTsKKyAgdm9pZCBhc3NpZ25CbG9ja1JQT051bWJlcihGdW5jdGlvbiAmRik7Cit9OworCisvLy8gQ3JlYXRlIGEgbGVnYWN5IEdWTiBwYXNzLiBUaGlzIGFsc28gYWxsb3dzIHBhcmFtZXRlcml6aW5nIHdoZXRoZXIgb3Igbm90CisvLy8gbG9hZHMgYXJlIGVsaW1pbmF0ZWQgYnkgdGhlIHBhc3MuCitGdW5jdGlvblBhc3MgKmNyZWF0ZUdWTlBhc3MoYm9vbCBOb0xvYWRzID0gZmFsc2UpOworCisvLy8gXGJyaWVmIEEgc2ltcGxlIGFuZCBmYXN0IGRvbXRyZWUtYmFzZWQgR1ZOIHBhc3MgdG8gaG9pc3QgY29tbW9uIGV4cHJlc3Npb25zCisvLy8gZnJvbSBzaWJsaW5nIGJyYW5jaGVzLgorc3RydWN0IEdWTkhvaXN0UGFzcyA6IFBhc3NJbmZvTWl4aW48R1ZOSG9pc3RQYXNzPiB7CisgIC8vLyBcYnJpZWYgUnVuIHRoZSBwYXNzIG92ZXIgdGhlIGZ1bmN0aW9uLgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIFVzZXMgYW4gImludmVydGVkIiB2YWx1ZSBudW1iZXJpbmcgdG8gZGVjaWRlIHRoZSBzaW1pbGFyaXR5IG9mCisvLy8gZXhwcmVzc2lvbnMgYW5kIHNpbmtzIHNpbWlsYXIgZXhwcmVzc2lvbnMgaW50byBzdWNjZXNzb3JzLgorc3RydWN0IEdWTlNpbmtQYXNzIDogUGFzc0luZm9NaXhpbjxHVk5TaW5rUGFzcz4geworICAvLy8gXGJyaWVmIFJ1biB0aGUgcGFzcyBvdmVyIHRoZSBmdW5jdGlvbi4KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfR1ZOX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvR1ZORXhwcmVzc2lvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9HVk5FeHByZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkYWUxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvR1ZORXhwcmVzc2lvbi5oCkBAIC0wLDAgKzEsNjYxIEBACisvLz09PS0gR1ZORXhwcmVzc2lvbi5oIC0gR1ZOIEV4cHJlc3Npb24gY2xhc3NlcyAtLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vCisvLy8gVGhlIGhlYWRlciBmaWxlIGZvciB0aGUgR1ZOIHBhc3MgdGhhdCBjb250YWlucyBleHByZXNzaW9uIGhhbmRsaW5nCisvLy8gY2xhc3NlcworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9HVk5FWFBSRVNTSU9OX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9HVk5FWFBSRVNTSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0hhc2hpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTWVtb3J5U1NBLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudC5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQXJyYXlSZWN5Y2xlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgVHlwZTsKKworbmFtZXNwYWNlIEdWTkV4cHJlc3Npb24geworCitlbnVtIEV4cHJlc3Npb25UeXBlIHsKKyAgRVRfQmFzZSwKKyAgRVRfQ29uc3RhbnQsCisgIEVUX1ZhcmlhYmxlLAorICBFVF9EZWFkLAorICBFVF9Vbmtub3duLAorICBFVF9CYXNpY1N0YXJ0LAorICBFVF9CYXNpYywKKyAgRVRfQWdncmVnYXRlVmFsdWUsCisgIEVUX1BoaSwKKyAgRVRfTWVtb3J5U3RhcnQsCisgIEVUX0NhbGwsCisgIEVUX0xvYWQsCisgIEVUX1N0b3JlLAorICBFVF9NZW1vcnlFbmQsCisgIEVUX0Jhc2ljRW5kCit9OworCitjbGFzcyBFeHByZXNzaW9uIHsKK3ByaXZhdGU6CisgIEV4cHJlc3Npb25UeXBlIEVUeXBlOworICB1bnNpZ25lZCBPcGNvZGU7CisgIG11dGFibGUgaGFzaF9jb2RlIEhhc2hWYWwgPSAwOworCitwdWJsaWM6CisgIEV4cHJlc3Npb24oRXhwcmVzc2lvblR5cGUgRVQgPSBFVF9CYXNlLCB1bnNpZ25lZCBPID0gfjJVKQorICAgICAgOiBFVHlwZShFVCksIE9wY29kZShPKSB7fQorICBFeHByZXNzaW9uKGNvbnN0IEV4cHJlc3Npb24gJikgPSBkZWxldGU7CisgIEV4cHJlc3Npb24gJm9wZXJhdG9yPShjb25zdCBFeHByZXNzaW9uICYpID0gZGVsZXRlOworICB2aXJ0dWFsIH5FeHByZXNzaW9uKCk7CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEVtcHR5S2V5KCkgeyByZXR1cm4gfjBVOyB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiB+MVU7IH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgRXhwcmVzc2lvbiAmT3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gT3RoZXIpOyB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFeHByZXNzaW9uICZPdGhlcikgY29uc3QgeworICAgIGlmIChnZXRPcGNvZGUoKSAhPSBPdGhlci5nZXRPcGNvZGUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZ2V0T3Bjb2RlKCkgPT0gZ2V0RW1wdHlLZXkoKSB8fCBnZXRPcGNvZGUoKSA9PSBnZXRUb21ic3RvbmVLZXkoKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIC8vIENvbXBhcmUgdGhlIGV4cHJlc3Npb24gdHlwZSBmb3IgYW55dGhpbmcgYnV0IGxvYWQgYW5kIHN0b3JlLgorICAgIC8vIEZvciBsb2FkIGFuZCBzdG9yZSB3ZSBzZXQgdGhlIG9wY29kZSB0byB6ZXJvIHRvIG1ha2UgdGhlbSBlcXVhbC4KKyAgICBpZiAoZ2V0RXhwcmVzc2lvblR5cGUoKSAhPSBFVF9Mb2FkICYmIGdldEV4cHJlc3Npb25UeXBlKCkgIT0gRVRfU3RvcmUgJiYKKyAgICAgICAgZ2V0RXhwcmVzc2lvblR5cGUoKSAhPSBPdGhlci5nZXRFeHByZXNzaW9uVHlwZSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGVxdWFscyhPdGhlcik7CisgIH0KKworICBoYXNoX2NvZGUgZ2V0Q29tcHV0ZWRIYXNoKCkgY29uc3QgeworICAgIC8vIEl0J3MgdGhlb3JldGljYWxseSBwb3NzaWJsZSBmb3IgYSB0aGluZyB0byBoYXNoIHRvIHplcm8uICBJbiB0aGF0IGNhc2UsCisgICAgLy8gd2Ugd2lsbCBqdXN0IGNvbXB1dGUgdGhlIGhhc2ggYSBmZXcgZXh0cmEgdGltZXMsIHdoaWNoIGlzIG5vIHdvcnNlIHRoYXQKKyAgICAvLyB3ZSBkaWQgYmVmb3JlLCB3aGljaCB3YXMgdG8gY29tcHV0ZSBpdCBhbHdheXMuCisgICAgaWYgKHN0YXRpY19jYXN0PHVuc2lnbmVkPihIYXNoVmFsKSA9PSAwKQorICAgICAgSGFzaFZhbCA9IGdldEhhc2hWYWx1ZSgpOworICAgIHJldHVybiBIYXNoVmFsOworICB9CisKKyAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBFeHByZXNzaW9uICZPdGhlcikgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vIFJldHVybiB0cnVlIGlmIHRoZSB0d28gZXhwcmVzc2lvbnMgYXJlIGV4YWN0bHkgdGhlIHNhbWUsIGluY2x1ZGluZyB0aGUKKyAgLy8gbm9ybWFsbHkgaWdub3JlZCBmaWVsZHMuCisgIHZpcnR1YWwgYm9vbCBleGFjdGx5RXF1YWxzKGNvbnN0IEV4cHJlc3Npb24gJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEV4cHJlc3Npb25UeXBlKCkgPT0gT3RoZXIuZ2V0RXhwcmVzc2lvblR5cGUoKSAmJiBlcXVhbHMoT3RoZXIpOworICB9CisKKyAgdW5zaWduZWQgZ2V0T3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gT3Bjb2RlOyB9CisgIHZvaWQgc2V0T3Bjb2RlKHVuc2lnbmVkIG9wY29kZSkgeyBPcGNvZGUgPSBvcGNvZGU7IH0KKyAgRXhwcmVzc2lvblR5cGUgZ2V0RXhwcmVzc2lvblR5cGUoKSBjb25zdCB7IHJldHVybiBFVHlwZTsgfQorCisgIC8vIFdlIGRlbGliZXJhdGVseSBsZWF2ZSB0aGUgZXhwcmVzc2lvbiB0eXBlIG91dCBvZiB0aGUgaGFzaCB2YWx1ZS4KKyAgdmlydHVhbCBoYXNoX2NvZGUgZ2V0SGFzaFZhbHVlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3Bjb2RlKCk7IH0KKworICAvLyBEZWJ1Z2dpbmcgc3VwcG9ydAorICB2aXJ0dWFsIHZvaWQgcHJpbnRJbnRlcm5hbChyYXdfb3N0cmVhbSAmT1MsIGJvb2wgUHJpbnRFVHlwZSkgY29uc3QgeworICAgIGlmIChQcmludEVUeXBlKQorICAgICAgT1MgPDwgImV0eXBlID0gIiA8PCBnZXRFeHByZXNzaW9uVHlwZSgpIDw8ICIsIjsKKyAgICBPUyA8PCAib3Bjb2RlID0gIiA8PCBnZXRPcGNvZGUoKSA8PCAiLCAiOworICB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICBPUyA8PCAieyAiOworICAgIHByaW50SW50ZXJuYWwoT1MsIHRydWUpOworICAgIE9TIDw8ICJ9IjsKKyAgfQorCisgIExMVk1fRFVNUF9NRVRIT0Qgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBFeHByZXNzaW9uICZFKSB7CisgIEUucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK2NsYXNzIEJhc2ljRXhwcmVzc2lvbiA6IHB1YmxpYyBFeHByZXNzaW9uIHsKK3ByaXZhdGU6CisgIHVzaW5nIFJlY3ljbGVyVHlwZSA9IEFycmF5UmVjeWNsZXI8VmFsdWUgKj47CisgIHVzaW5nIFJlY3ljbGVyQ2FwYWNpdHkgPSBSZWN5Y2xlclR5cGU6OkNhcGFjaXR5OworCisgIFZhbHVlICoqT3BlcmFuZHMgPSBudWxscHRyOworICB1bnNpZ25lZCBNYXhPcGVyYW5kczsKKyAgdW5zaWduZWQgTnVtT3BlcmFuZHMgPSAwOworICBUeXBlICpWYWx1ZVR5cGUgPSBudWxscHRyOworCitwdWJsaWM6CisgIEJhc2ljRXhwcmVzc2lvbih1bnNpZ25lZCBOdW1PcGVyYW5kcykKKyAgICAgIDogQmFzaWNFeHByZXNzaW9uKE51bU9wZXJhbmRzLCBFVF9CYXNpYykge30KKyAgQmFzaWNFeHByZXNzaW9uKHVuc2lnbmVkIE51bU9wZXJhbmRzLCBFeHByZXNzaW9uVHlwZSBFVCkKKyAgICAgIDogRXhwcmVzc2lvbihFVCksIE1heE9wZXJhbmRzKE51bU9wZXJhbmRzKSB7fQorICBCYXNpY0V4cHJlc3Npb24oKSA9IGRlbGV0ZTsKKyAgQmFzaWNFeHByZXNzaW9uKGNvbnN0IEJhc2ljRXhwcmVzc2lvbiAmKSA9IGRlbGV0ZTsKKyAgQmFzaWNFeHByZXNzaW9uICZvcGVyYXRvcj0oY29uc3QgQmFzaWNFeHByZXNzaW9uICYpID0gZGVsZXRlOworICB+QmFzaWNFeHByZXNzaW9uKCkgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBFeHByZXNzaW9uICpFQikgeworICAgIEV4cHJlc3Npb25UeXBlIEVUID0gRUItPmdldEV4cHJlc3Npb25UeXBlKCk7CisgICAgcmV0dXJuIEVUID4gRVRfQmFzaWNTdGFydCAmJiBFVCA8IEVUX0Jhc2ljRW5kOworICB9CisKKyAgLy8vIFxicmllZiBTd2FwIHR3byBvcGVyYW5kcy4gVXNlZCBkdXJpbmcgR1ZOIHRvIHB1dCBjb21tdXRhdGl2ZSBvcGVyYW5kcyBpbgorICAvLy8gb3JkZXIuCisgIHZvaWQgc3dhcE9wZXJhbmRzKHVuc2lnbmVkIEZpcnN0LCB1bnNpZ25lZCBTZWNvbmQpIHsKKyAgICBzdGQ6OnN3YXAoT3BlcmFuZHNbRmlyc3RdLCBPcGVyYW5kc1tTZWNvbmRdKTsKKyAgfQorCisgIFZhbHVlICpnZXRPcGVyYW5kKHVuc2lnbmVkIE4pIGNvbnN0IHsKKyAgICBhc3NlcnQoT3BlcmFuZHMgJiYgIk9wZXJhbmRzIG5vdCBhbGxvY2F0ZWQiKTsKKyAgICBhc3NlcnQoTiA8IE51bU9wZXJhbmRzICYmICJPcGVyYW5kIG91dCBvZiByYW5nZSIpOworICAgIHJldHVybiBPcGVyYW5kc1tOXTsKKyAgfQorCisgIHZvaWQgc2V0T3BlcmFuZCh1bnNpZ25lZCBOLCBWYWx1ZSAqVikgeworICAgIGFzc2VydChPcGVyYW5kcyAmJiAiT3BlcmFuZHMgbm90IGFsbG9jYXRlZCBiZWZvcmUgc2V0dGluZyIpOworICAgIGFzc2VydChOIDwgTnVtT3BlcmFuZHMgJiYgIk9wZXJhbmQgb3V0IG9mIHJhbmdlIik7CisgICAgT3BlcmFuZHNbTl0gPSBWOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdCB7IHJldHVybiBOdW1PcGVyYW5kczsgfQorCisgIHVzaW5nIG9wX2l0ZXJhdG9yID0gVmFsdWUgKio7CisgIHVzaW5nIGNvbnN0X29wX2l0ZXJhdG9yID0gVmFsdWUgKmNvbnN0ICo7CisKKyAgb3BfaXRlcmF0b3Igb3BfYmVnaW4oKSB7IHJldHVybiBPcGVyYW5kczsgfQorICBvcF9pdGVyYXRvciBvcF9lbmQoKSB7IHJldHVybiBPcGVyYW5kcyArIE51bU9wZXJhbmRzOyB9CisgIGNvbnN0X29wX2l0ZXJhdG9yIG9wX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gT3BlcmFuZHM7IH0KKyAgY29uc3Rfb3BfaXRlcmF0b3Igb3BfZW5kKCkgY29uc3QgeyByZXR1cm4gT3BlcmFuZHMgKyBOdW1PcGVyYW5kczsgfQorICBpdGVyYXRvcl9yYW5nZTxvcF9pdGVyYXRvcj4gb3BlcmFuZHMoKSB7CisgICAgcmV0dXJuIGl0ZXJhdG9yX3JhbmdlPG9wX2l0ZXJhdG9yPihvcF9iZWdpbigpLCBvcF9lbmQoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3Rfb3BfaXRlcmF0b3I+IG9wZXJhbmRzKCkgY29uc3QgeworICAgIHJldHVybiBpdGVyYXRvcl9yYW5nZTxjb25zdF9vcF9pdGVyYXRvcj4ob3BfYmVnaW4oKSwgb3BfZW5kKCkpOworICB9CisKKyAgdm9pZCBvcF9wdXNoX2JhY2soVmFsdWUgKkFyZykgeworICAgIGFzc2VydChOdW1PcGVyYW5kcyA8IE1heE9wZXJhbmRzICYmICJUcmllZCB0byBhZGQgdG9vIG1hbnkgb3BlcmFuZHMiKTsKKyAgICBhc3NlcnQoT3BlcmFuZHMgJiYgIk9wZXJhbmRzcyBub3QgYWxsb2NhdGVkIGJlZm9yZSBwdXNoaW5nIik7CisgICAgT3BlcmFuZHNbTnVtT3BlcmFuZHMrK10gPSBBcmc7CisgIH0KKyAgYm9vbCBvcF9lbXB0eSgpIGNvbnN0IHsgcmV0dXJuIGdldE51bU9wZXJhbmRzKCkgPT0gMDsgfQorCisgIHZvaWQgYWxsb2NhdGVPcGVyYW5kcyhSZWN5Y2xlclR5cGUgJlJlY3ljbGVyLCBCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IpIHsKKyAgICBhc3NlcnQoIU9wZXJhbmRzICYmICJPcGVyYW5kcyBhbHJlYWR5IGFsbG9jYXRlZCIpOworICAgIE9wZXJhbmRzID0gUmVjeWNsZXIuYWxsb2NhdGUoUmVjeWNsZXJDYXBhY2l0eTo6Z2V0KE1heE9wZXJhbmRzKSwgQWxsb2NhdG9yKTsKKyAgfQorICB2b2lkIGRlYWxsb2NhdGVPcGVyYW5kcyhSZWN5Y2xlclR5cGUgJlJlY3ljbGVyKSB7CisgICAgUmVjeWNsZXIuZGVhbGxvY2F0ZShSZWN5Y2xlckNhcGFjaXR5OjpnZXQoTWF4T3BlcmFuZHMpLCBPcGVyYW5kcyk7CisgIH0KKworICB2b2lkIHNldFR5cGUoVHlwZSAqVCkgeyBWYWx1ZVR5cGUgPSBUOyB9CisgIFR5cGUgKmdldFR5cGUoKSBjb25zdCB7IHJldHVybiBWYWx1ZVR5cGU7IH0KKworICBib29sIGVxdWFscyhjb25zdCBFeHByZXNzaW9uICZPdGhlcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmIChnZXRPcGNvZGUoKSAhPSBPdGhlci5nZXRPcGNvZGUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IGF1dG8gJk9FID0gY2FzdDxCYXNpY0V4cHJlc3Npb24+KE90aGVyKTsKKyAgICByZXR1cm4gZ2V0VHlwZSgpID09IE9FLmdldFR5cGUoKSAmJiBOdW1PcGVyYW5kcyA9PSBPRS5OdW1PcGVyYW5kcyAmJgorICAgICAgICAgICBzdGQ6OmVxdWFsKG9wX2JlZ2luKCksIG9wX2VuZCgpLCBPRS5vcF9iZWdpbigpKTsKKyAgfQorCisgIGhhc2hfY29kZSBnZXRIYXNoVmFsdWUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGhhc2hfY29tYmluZSh0aGlzLT5FeHByZXNzaW9uOjpnZXRIYXNoVmFsdWUoKSwgVmFsdWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9jb21iaW5lX3JhbmdlKG9wX2JlZ2luKCksIG9wX2VuZCgpKSk7CisgIH0KKworICAvLyBEZWJ1Z2dpbmcgc3VwcG9ydAorICB2b2lkIHByaW50SW50ZXJuYWwocmF3X29zdHJlYW0gJk9TLCBib29sIFByaW50RVR5cGUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBpZiAoUHJpbnRFVHlwZSkKKyAgICAgIE9TIDw8ICJFeHByZXNzaW9uVHlwZUJhc2ljLCAiOworCisgICAgdGhpcy0+RXhwcmVzc2lvbjo6cHJpbnRJbnRlcm5hbChPUywgZmFsc2UpOworICAgIE9TIDw8ICJvcGVyYW5kcyA9IHsiOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kcygpOyBpICE9IGU7ICsraSkgeworICAgICAgT1MgPDwgIlsiIDw8IGkgPDwgIl0gPSAiOworICAgICAgT3BlcmFuZHNbaV0tPnByaW50QXNPcGVyYW5kKE9TKTsKKyAgICAgIE9TIDw8ICIgICI7CisgICAgfQorICAgIE9TIDw8ICJ9ICI7CisgIH0KK307CisKK2NsYXNzIG9wX2luc2VydGVyCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6Om91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+IHsKK3ByaXZhdGU6CisgIHVzaW5nIENvbnRhaW5lciA9IEJhc2ljRXhwcmVzc2lvbjsKKworICBDb250YWluZXIgKkJFOworCitwdWJsaWM6CisgIGV4cGxpY2l0IG9wX2luc2VydGVyKEJhc2ljRXhwcmVzc2lvbiAmRSkgOiBCRSgmRSkge30KKyAgZXhwbGljaXQgb3BfaW5zZXJ0ZXIoQmFzaWNFeHByZXNzaW9uICpFKSA6IEJFKEUpIHt9CisKKyAgb3BfaW5zZXJ0ZXIgJm9wZXJhdG9yPShWYWx1ZSAqdmFsKSB7CisgICAgQkUtPm9wX3B1c2hfYmFjayh2YWwpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBvcF9pbnNlcnRlciAmb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgb3BfaW5zZXJ0ZXIgJm9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQorICBvcF9pbnNlcnRlciAmb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9Cit9OworCitjbGFzcyBNZW1vcnlFeHByZXNzaW9uIDogcHVibGljIEJhc2ljRXhwcmVzc2lvbiB7Citwcml2YXRlOgorICBjb25zdCBNZW1vcnlBY2Nlc3MgKk1lbW9yeUxlYWRlcjsKKworcHVibGljOgorICBNZW1vcnlFeHByZXNzaW9uKHVuc2lnbmVkIE51bU9wZXJhbmRzLCBlbnVtIEV4cHJlc3Npb25UeXBlIEVUeXBlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbW9yeUFjY2VzcyAqTWVtb3J5TGVhZGVyKQorICAgICAgOiBCYXNpY0V4cHJlc3Npb24oTnVtT3BlcmFuZHMsIEVUeXBlKSwgTWVtb3J5TGVhZGVyKE1lbW9yeUxlYWRlcikge30KKyAgTWVtb3J5RXhwcmVzc2lvbigpID0gZGVsZXRlOworICBNZW1vcnlFeHByZXNzaW9uKGNvbnN0IE1lbW9yeUV4cHJlc3Npb24gJikgPSBkZWxldGU7CisgIE1lbW9yeUV4cHJlc3Npb24gJm9wZXJhdG9yPShjb25zdCBNZW1vcnlFeHByZXNzaW9uICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRXhwcmVzc2lvbiAqRUIpIHsKKyAgICByZXR1cm4gRUItPmdldEV4cHJlc3Npb25UeXBlKCkgPiBFVF9NZW1vcnlTdGFydCAmJgorICAgICAgICAgICBFQi0+Z2V0RXhwcmVzc2lvblR5cGUoKSA8IEVUX01lbW9yeUVuZDsKKyAgfQorCisgIGhhc2hfY29kZSBnZXRIYXNoVmFsdWUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGhhc2hfY29tYmluZSh0aGlzLT5CYXNpY0V4cHJlc3Npb246OmdldEhhc2hWYWx1ZSgpLCBNZW1vcnlMZWFkZXIpOworICB9CisKKyAgYm9vbCBlcXVhbHMoY29uc3QgRXhwcmVzc2lvbiAmT3RoZXIpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBpZiAoIXRoaXMtPkJhc2ljRXhwcmVzc2lvbjo6ZXF1YWxzKE90aGVyKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBNZW1vcnlFeHByZXNzaW9uICZPdGhlck1DRSA9IGNhc3Q8TWVtb3J5RXhwcmVzc2lvbj4oT3RoZXIpOworCisgICAgcmV0dXJuIE1lbW9yeUxlYWRlciA9PSBPdGhlck1DRS5NZW1vcnlMZWFkZXI7CisgIH0KKworICBjb25zdCBNZW1vcnlBY2Nlc3MgKmdldE1lbW9yeUxlYWRlcigpIGNvbnN0IHsgcmV0dXJuIE1lbW9yeUxlYWRlcjsgfQorICB2b2lkIHNldE1lbW9yeUxlYWRlcihjb25zdCBNZW1vcnlBY2Nlc3MgKk1MKSB7IE1lbW9yeUxlYWRlciA9IE1MOyB9Cit9OworCitjbGFzcyBDYWxsRXhwcmVzc2lvbiBmaW5hbCA6IHB1YmxpYyBNZW1vcnlFeHByZXNzaW9uIHsKK3ByaXZhdGU6CisgIENhbGxJbnN0ICpDYWxsOworCitwdWJsaWM6CisgIENhbGxFeHByZXNzaW9uKHVuc2lnbmVkIE51bU9wZXJhbmRzLCBDYWxsSW5zdCAqQywKKyAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5QWNjZXNzICpNZW1vcnlMZWFkZXIpCisgICAgICA6IE1lbW9yeUV4cHJlc3Npb24oTnVtT3BlcmFuZHMsIEVUX0NhbGwsIE1lbW9yeUxlYWRlciksIENhbGwoQykge30KKyAgQ2FsbEV4cHJlc3Npb24oKSA9IGRlbGV0ZTsKKyAgQ2FsbEV4cHJlc3Npb24oY29uc3QgQ2FsbEV4cHJlc3Npb24gJikgPSBkZWxldGU7CisgIENhbGxFeHByZXNzaW9uICZvcGVyYXRvcj0oY29uc3QgQ2FsbEV4cHJlc3Npb24gJikgPSBkZWxldGU7CisgIH5DYWxsRXhwcmVzc2lvbigpIG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRXhwcmVzc2lvbiAqRUIpIHsKKyAgICByZXR1cm4gRUItPmdldEV4cHJlc3Npb25UeXBlKCkgPT0gRVRfQ2FsbDsKKyAgfQorCisgIC8vIERlYnVnZ2luZyBzdXBwb3J0CisgIHZvaWQgcHJpbnRJbnRlcm5hbChyYXdfb3N0cmVhbSAmT1MsIGJvb2wgUHJpbnRFVHlwZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmIChQcmludEVUeXBlKQorICAgICAgT1MgPDwgIkV4cHJlc3Npb25UeXBlQ2FsbCwgIjsKKyAgICB0aGlzLT5CYXNpY0V4cHJlc3Npb246OnByaW50SW50ZXJuYWwoT1MsIGZhbHNlKTsKKyAgICBPUyA8PCAiIHJlcHJlc2VudHMgY2FsbCBhdCAiOworICAgIENhbGwtPnByaW50QXNPcGVyYW5kKE9TKTsKKyAgfQorfTsKKworY2xhc3MgTG9hZEV4cHJlc3Npb24gZmluYWwgOiBwdWJsaWMgTWVtb3J5RXhwcmVzc2lvbiB7Citwcml2YXRlOgorICBMb2FkSW5zdCAqTG9hZDsKKyAgdW5zaWduZWQgQWxpZ25tZW50OworCitwdWJsaWM6CisgIExvYWRFeHByZXNzaW9uKHVuc2lnbmVkIE51bU9wZXJhbmRzLCBMb2FkSW5zdCAqTCwKKyAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5QWNjZXNzICpNZW1vcnlMZWFkZXIpCisgICAgICA6IExvYWRFeHByZXNzaW9uKEVUX0xvYWQsIE51bU9wZXJhbmRzLCBMLCBNZW1vcnlMZWFkZXIpIHt9CisKKyAgTG9hZEV4cHJlc3Npb24oZW51bSBFeHByZXNzaW9uVHlwZSBFVHlwZSwgdW5zaWduZWQgTnVtT3BlcmFuZHMsIExvYWRJbnN0ICpMLAorICAgICAgICAgICAgICAgICBjb25zdCBNZW1vcnlBY2Nlc3MgKk1lbW9yeUxlYWRlcikKKyAgICAgIDogTWVtb3J5RXhwcmVzc2lvbihOdW1PcGVyYW5kcywgRVR5cGUsIE1lbW9yeUxlYWRlciksIExvYWQoTCkgeworICAgIEFsaWdubWVudCA9IEwgPyBMLT5nZXRBbGlnbm1lbnQoKSA6IDA7CisgIH0KKworICBMb2FkRXhwcmVzc2lvbigpID0gZGVsZXRlOworICBMb2FkRXhwcmVzc2lvbihjb25zdCBMb2FkRXhwcmVzc2lvbiAmKSA9IGRlbGV0ZTsKKyAgTG9hZEV4cHJlc3Npb24gJm9wZXJhdG9yPShjb25zdCBMb2FkRXhwcmVzc2lvbiAmKSA9IGRlbGV0ZTsKKyAgfkxvYWRFeHByZXNzaW9uKCkgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBFeHByZXNzaW9uICpFQikgeworICAgIHJldHVybiBFQi0+Z2V0RXhwcmVzc2lvblR5cGUoKSA9PSBFVF9Mb2FkOworICB9CisKKyAgTG9hZEluc3QgKmdldExvYWRJbnN0KCkgY29uc3QgeyByZXR1cm4gTG9hZDsgfQorICB2b2lkIHNldExvYWRJbnN0KExvYWRJbnN0ICpMKSB7IExvYWQgPSBMOyB9CisKKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gQWxpZ25tZW50OyB9CisgIHZvaWQgc2V0QWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKSB7IEFsaWdubWVudCA9IEFsaWduOyB9CisKKyAgYm9vbCBlcXVhbHMoY29uc3QgRXhwcmVzc2lvbiAmT3RoZXIpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGV4YWN0bHlFcXVhbHMoY29uc3QgRXhwcmVzc2lvbiAmT3RoZXIpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gRXhwcmVzc2lvbjo6ZXhhY3RseUVxdWFscyhPdGhlcikgJiYKKyAgICAgICAgICAgY2FzdDxMb2FkRXhwcmVzc2lvbj4oT3RoZXIpLmdldExvYWRJbnN0KCkgPT0gZ2V0TG9hZEluc3QoKTsKKyAgfQorCisgIC8vIERlYnVnZ2luZyBzdXBwb3J0CisgIHZvaWQgcHJpbnRJbnRlcm5hbChyYXdfb3N0cmVhbSAmT1MsIGJvb2wgUHJpbnRFVHlwZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmIChQcmludEVUeXBlKQorICAgICAgT1MgPDwgIkV4cHJlc3Npb25UeXBlTG9hZCwgIjsKKyAgICB0aGlzLT5CYXNpY0V4cHJlc3Npb246OnByaW50SW50ZXJuYWwoT1MsIGZhbHNlKTsKKyAgICBPUyA8PCAiIHJlcHJlc2VudHMgTG9hZCBhdCAiOworICAgIExvYWQtPnByaW50QXNPcGVyYW5kKE9TKTsKKyAgICBPUyA8PCAiIHdpdGggTWVtb3J5TGVhZGVyICIgPDwgKmdldE1lbW9yeUxlYWRlcigpOworICB9Cit9OworCitjbGFzcyBTdG9yZUV4cHJlc3Npb24gZmluYWwgOiBwdWJsaWMgTWVtb3J5RXhwcmVzc2lvbiB7Citwcml2YXRlOgorICBTdG9yZUluc3QgKlN0b3JlOworICBWYWx1ZSAqU3RvcmVkVmFsdWU7CisKK3B1YmxpYzoKKyAgU3RvcmVFeHByZXNzaW9uKHVuc2lnbmVkIE51bU9wZXJhbmRzLCBTdG9yZUluc3QgKlMsIFZhbHVlICpTdG9yZWRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbW9yeUFjY2VzcyAqTWVtb3J5TGVhZGVyKQorICAgICAgOiBNZW1vcnlFeHByZXNzaW9uKE51bU9wZXJhbmRzLCBFVF9TdG9yZSwgTWVtb3J5TGVhZGVyKSwgU3RvcmUoUyksCisgICAgICAgIFN0b3JlZFZhbHVlKFN0b3JlZFZhbHVlKSB7fQorICBTdG9yZUV4cHJlc3Npb24oKSA9IGRlbGV0ZTsKKyAgU3RvcmVFeHByZXNzaW9uKGNvbnN0IFN0b3JlRXhwcmVzc2lvbiAmKSA9IGRlbGV0ZTsKKyAgU3RvcmVFeHByZXNzaW9uICZvcGVyYXRvcj0oY29uc3QgU3RvcmVFeHByZXNzaW9uICYpID0gZGVsZXRlOworICB+U3RvcmVFeHByZXNzaW9uKCkgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBFeHByZXNzaW9uICpFQikgeworICAgIHJldHVybiBFQi0+Z2V0RXhwcmVzc2lvblR5cGUoKSA9PSBFVF9TdG9yZTsKKyAgfQorCisgIFN0b3JlSW5zdCAqZ2V0U3RvcmVJbnN0KCkgY29uc3QgeyByZXR1cm4gU3RvcmU7IH0KKyAgVmFsdWUgKmdldFN0b3JlZFZhbHVlKCkgY29uc3QgeyByZXR1cm4gU3RvcmVkVmFsdWU7IH0KKworICBib29sIGVxdWFscyhjb25zdCBFeHByZXNzaW9uICZPdGhlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBleGFjdGx5RXF1YWxzKGNvbnN0IEV4cHJlc3Npb24gJk90aGVyKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEV4cHJlc3Npb246OmV4YWN0bHlFcXVhbHMoT3RoZXIpICYmCisgICAgICAgICAgIGNhc3Q8U3RvcmVFeHByZXNzaW9uPihPdGhlcikuZ2V0U3RvcmVJbnN0KCkgPT0gZ2V0U3RvcmVJbnN0KCk7CisgIH0KKworICAvLyBEZWJ1Z2dpbmcgc3VwcG9ydAorICB2b2lkIHByaW50SW50ZXJuYWwocmF3X29zdHJlYW0gJk9TLCBib29sIFByaW50RVR5cGUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBpZiAoUHJpbnRFVHlwZSkKKyAgICAgIE9TIDw8ICJFeHByZXNzaW9uVHlwZVN0b3JlLCAiOworICAgIHRoaXMtPkJhc2ljRXhwcmVzc2lvbjo6cHJpbnRJbnRlcm5hbChPUywgZmFsc2UpOworICAgIE9TIDw8ICIgcmVwcmVzZW50cyBTdG9yZSAgIiA8PCAqU3RvcmU7CisgICAgT1MgPDwgIiB3aXRoIFN0b3JlZFZhbHVlICI7CisgICAgU3RvcmVkVmFsdWUtPnByaW50QXNPcGVyYW5kKE9TKTsKKyAgICBPUyA8PCAiIGFuZCBNZW1vcnlMZWFkZXIgIiA8PCAqZ2V0TWVtb3J5TGVhZGVyKCk7CisgIH0KK307CisKK2NsYXNzIEFnZ3JlZ2F0ZVZhbHVlRXhwcmVzc2lvbiBmaW5hbCA6IHB1YmxpYyBCYXNpY0V4cHJlc3Npb24geworcHJpdmF0ZToKKyAgdW5zaWduZWQgTWF4SW50T3BlcmFuZHM7CisgIHVuc2lnbmVkIE51bUludE9wZXJhbmRzID0gMDsKKyAgdW5zaWduZWQgKkludE9wZXJhbmRzID0gbnVsbHB0cjsKKworcHVibGljOgorICBBZ2dyZWdhdGVWYWx1ZUV4cHJlc3Npb24odW5zaWduZWQgTnVtT3BlcmFuZHMsIHVuc2lnbmVkIE51bUludE9wZXJhbmRzKQorICAgICAgOiBCYXNpY0V4cHJlc3Npb24oTnVtT3BlcmFuZHMsIEVUX0FnZ3JlZ2F0ZVZhbHVlKSwKKyAgICAgICAgTWF4SW50T3BlcmFuZHMoTnVtSW50T3BlcmFuZHMpIHt9CisgIEFnZ3JlZ2F0ZVZhbHVlRXhwcmVzc2lvbigpID0gZGVsZXRlOworICBBZ2dyZWdhdGVWYWx1ZUV4cHJlc3Npb24oY29uc3QgQWdncmVnYXRlVmFsdWVFeHByZXNzaW9uICYpID0gZGVsZXRlOworICBBZ2dyZWdhdGVWYWx1ZUV4cHJlc3Npb24gJgorICBvcGVyYXRvcj0oY29uc3QgQWdncmVnYXRlVmFsdWVFeHByZXNzaW9uICYpID0gZGVsZXRlOworICB+QWdncmVnYXRlVmFsdWVFeHByZXNzaW9uKCkgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBFeHByZXNzaW9uICpFQikgeworICAgIHJldHVybiBFQi0+Z2V0RXhwcmVzc2lvblR5cGUoKSA9PSBFVF9BZ2dyZWdhdGVWYWx1ZTsKKyAgfQorCisgIHVzaW5nIGludF9hcmdfaXRlcmF0b3IgPSB1bnNpZ25lZCAqOworICB1c2luZyBjb25zdF9pbnRfYXJnX2l0ZXJhdG9yID0gY29uc3QgdW5zaWduZWQgKjsKKworICBpbnRfYXJnX2l0ZXJhdG9yIGludF9vcF9iZWdpbigpIHsgcmV0dXJuIEludE9wZXJhbmRzOyB9CisgIGludF9hcmdfaXRlcmF0b3IgaW50X29wX2VuZCgpIHsgcmV0dXJuIEludE9wZXJhbmRzICsgTnVtSW50T3BlcmFuZHM7IH0KKyAgY29uc3RfaW50X2FyZ19pdGVyYXRvciBpbnRfb3BfYmVnaW4oKSBjb25zdCB7IHJldHVybiBJbnRPcGVyYW5kczsgfQorICBjb25zdF9pbnRfYXJnX2l0ZXJhdG9yIGludF9vcF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIEludE9wZXJhbmRzICsgTnVtSW50T3BlcmFuZHM7CisgIH0KKyAgdW5zaWduZWQgaW50X29wX3NpemUoKSBjb25zdCB7IHJldHVybiBOdW1JbnRPcGVyYW5kczsgfQorICBib29sIGludF9vcF9lbXB0eSgpIGNvbnN0IHsgcmV0dXJuIE51bUludE9wZXJhbmRzID09IDA7IH0KKyAgdm9pZCBpbnRfb3BfcHVzaF9iYWNrKHVuc2lnbmVkIEludE9wZXJhbmQpIHsKKyAgICBhc3NlcnQoTnVtSW50T3BlcmFuZHMgPCBNYXhJbnRPcGVyYW5kcyAmJgorICAgICAgICAgICAiVHJpZWQgdG8gYWRkIHRvbyBtYW55IGludCBvcGVyYW5kcyIpOworICAgIGFzc2VydChJbnRPcGVyYW5kcyAmJiAiT3BlcmFuZHMgbm90IGFsbG9jYXRlZCBiZWZvcmUgcHVzaGluZyIpOworICAgIEludE9wZXJhbmRzW051bUludE9wZXJhbmRzKytdID0gSW50T3BlcmFuZDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBhbGxvY2F0ZUludE9wZXJhbmRzKEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvcikgeworICAgIGFzc2VydCghSW50T3BlcmFuZHMgJiYgIk9wZXJhbmRzIGFscmVhZHkgYWxsb2NhdGVkIik7CisgICAgSW50T3BlcmFuZHMgPSBBbGxvY2F0b3IuQWxsb2NhdGU8dW5zaWduZWQ+KE1heEludE9wZXJhbmRzKTsKKyAgfQorCisgIGJvb2wgZXF1YWxzKGNvbnN0IEV4cHJlc3Npb24gJk90aGVyKSBjb25zdCBvdmVycmlkZSB7CisgICAgaWYgKCF0aGlzLT5CYXNpY0V4cHJlc3Npb246OmVxdWFscyhPdGhlcikpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgY29uc3QgQWdncmVnYXRlVmFsdWVFeHByZXNzaW9uICZPRSA9IGNhc3Q8QWdncmVnYXRlVmFsdWVFeHByZXNzaW9uPihPdGhlcik7CisgICAgcmV0dXJuIE51bUludE9wZXJhbmRzID09IE9FLk51bUludE9wZXJhbmRzICYmCisgICAgICAgICAgIHN0ZDo6ZXF1YWwoaW50X29wX2JlZ2luKCksIGludF9vcF9lbmQoKSwgT0UuaW50X29wX2JlZ2luKCkpOworICB9CisKKyAgaGFzaF9jb2RlIGdldEhhc2hWYWx1ZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gaGFzaF9jb21iaW5lKHRoaXMtPkJhc2ljRXhwcmVzc2lvbjo6Z2V0SGFzaFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2NvbWJpbmVfcmFuZ2UoaW50X29wX2JlZ2luKCksIGludF9vcF9lbmQoKSkpOworICB9CisKKyAgLy8gRGVidWdnaW5nIHN1cHBvcnQKKyAgdm9pZCBwcmludEludGVybmFsKHJhd19vc3RyZWFtICZPUywgYm9vbCBQcmludEVUeXBlKSBjb25zdCBvdmVycmlkZSB7CisgICAgaWYgKFByaW50RVR5cGUpCisgICAgICBPUyA8PCAiRXhwcmVzc2lvblR5cGVBZ2dyZWdhdGVWYWx1ZSwgIjsKKyAgICB0aGlzLT5CYXNpY0V4cHJlc3Npb246OnByaW50SW50ZXJuYWwoT1MsIGZhbHNlKTsKKyAgICBPUyA8PCAiLCBpbnRvcGVyYW5kcyA9IHsiOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBpbnRfb3Bfc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgT1MgPDwgIlsiIDw8IGkgPDwgIl0gPSAiIDw8IEludE9wZXJhbmRzW2ldIDw8ICIgICI7CisgICAgfQorICAgIE9TIDw8ICJ9IjsKKyAgfQorfTsKKworY2xhc3MgaW50X29wX2luc2VydGVyCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6Om91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+IHsKK3ByaXZhdGU6CisgIHVzaW5nIENvbnRhaW5lciA9IEFnZ3JlZ2F0ZVZhbHVlRXhwcmVzc2lvbjsKKworICBDb250YWluZXIgKkFWRTsKKworcHVibGljOgorICBleHBsaWNpdCBpbnRfb3BfaW5zZXJ0ZXIoQWdncmVnYXRlVmFsdWVFeHByZXNzaW9uICZFKSA6IEFWRSgmRSkge30KKyAgZXhwbGljaXQgaW50X29wX2luc2VydGVyKEFnZ3JlZ2F0ZVZhbHVlRXhwcmVzc2lvbiAqRSkgOiBBVkUoRSkge30KKworICBpbnRfb3BfaW5zZXJ0ZXIgJm9wZXJhdG9yPSh1bnNpZ25lZCBpbnQgdmFsKSB7CisgICAgQVZFLT5pbnRfb3BfcHVzaF9iYWNrKHZhbCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGludF9vcF9pbnNlcnRlciAmb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW50X29wX2luc2VydGVyICZvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgaW50X29wX2luc2VydGVyICZvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KK307CisKK2NsYXNzIFBISUV4cHJlc3Npb24gZmluYWwgOiBwdWJsaWMgQmFzaWNFeHByZXNzaW9uIHsKK3ByaXZhdGU6CisgIEJhc2ljQmxvY2sgKkJCOworCitwdWJsaWM6CisgIFBISUV4cHJlc3Npb24odW5zaWduZWQgTnVtT3BlcmFuZHMsIEJhc2ljQmxvY2sgKkIpCisgICAgICA6IEJhc2ljRXhwcmVzc2lvbihOdW1PcGVyYW5kcywgRVRfUGhpKSwgQkIoQikge30KKyAgUEhJRXhwcmVzc2lvbigpID0gZGVsZXRlOworICBQSElFeHByZXNzaW9uKGNvbnN0IFBISUV4cHJlc3Npb24gJikgPSBkZWxldGU7CisgIFBISUV4cHJlc3Npb24gJm9wZXJhdG9yPShjb25zdCBQSElFeHByZXNzaW9uICYpID0gZGVsZXRlOworICB+UEhJRXhwcmVzc2lvbigpIG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRXhwcmVzc2lvbiAqRUIpIHsKKyAgICByZXR1cm4gRUItPmdldEV4cHJlc3Npb25UeXBlKCkgPT0gRVRfUGhpOworICB9CisKKyAgYm9vbCBlcXVhbHMoY29uc3QgRXhwcmVzc2lvbiAmT3RoZXIpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBpZiAoIXRoaXMtPkJhc2ljRXhwcmVzc2lvbjo6ZXF1YWxzKE90aGVyKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBQSElFeHByZXNzaW9uICZPRSA9IGNhc3Q8UEhJRXhwcmVzc2lvbj4oT3RoZXIpOworICAgIHJldHVybiBCQiA9PSBPRS5CQjsKKyAgfQorCisgIGhhc2hfY29kZSBnZXRIYXNoVmFsdWUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGhhc2hfY29tYmluZSh0aGlzLT5CYXNpY0V4cHJlc3Npb246OmdldEhhc2hWYWx1ZSgpLCBCQik7CisgIH0KKworICAvLyBEZWJ1Z2dpbmcgc3VwcG9ydAorICB2b2lkIHByaW50SW50ZXJuYWwocmF3X29zdHJlYW0gJk9TLCBib29sIFByaW50RVR5cGUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBpZiAoUHJpbnRFVHlwZSkKKyAgICAgIE9TIDw8ICJFeHByZXNzaW9uVHlwZVBoaSwgIjsKKyAgICB0aGlzLT5CYXNpY0V4cHJlc3Npb246OnByaW50SW50ZXJuYWwoT1MsIGZhbHNlKTsKKyAgICBPUyA8PCAiYmIgPSAiIDw8IEJCOworICB9Cit9OworCitjbGFzcyBEZWFkRXhwcmVzc2lvbiBmaW5hbCA6IHB1YmxpYyBFeHByZXNzaW9uIHsKK3B1YmxpYzoKKyAgRGVhZEV4cHJlc3Npb24oKSA6IEV4cHJlc3Npb24oRVRfRGVhZCkge30KKyAgRGVhZEV4cHJlc3Npb24oY29uc3QgRGVhZEV4cHJlc3Npb24gJikgPSBkZWxldGU7CisgIERlYWRFeHByZXNzaW9uICZvcGVyYXRvcj0oY29uc3QgRGVhZEV4cHJlc3Npb24gJikgPSBkZWxldGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBFeHByZXNzaW9uICpFKSB7CisgICAgcmV0dXJuIEUtPmdldEV4cHJlc3Npb25UeXBlKCkgPT0gRVRfRGVhZDsKKyAgfQorfTsKKworY2xhc3MgVmFyaWFibGVFeHByZXNzaW9uIGZpbmFsIDogcHVibGljIEV4cHJlc3Npb24geworcHJpdmF0ZToKKyAgVmFsdWUgKlZhcmlhYmxlVmFsdWU7CisKK3B1YmxpYzoKKyAgVmFyaWFibGVFeHByZXNzaW9uKFZhbHVlICpWKSA6IEV4cHJlc3Npb24oRVRfVmFyaWFibGUpLCBWYXJpYWJsZVZhbHVlKFYpIHt9CisgIFZhcmlhYmxlRXhwcmVzc2lvbigpID0gZGVsZXRlOworICBWYXJpYWJsZUV4cHJlc3Npb24oY29uc3QgVmFyaWFibGVFeHByZXNzaW9uICYpID0gZGVsZXRlOworICBWYXJpYWJsZUV4cHJlc3Npb24gJm9wZXJhdG9yPShjb25zdCBWYXJpYWJsZUV4cHJlc3Npb24gJikgPSBkZWxldGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBFeHByZXNzaW9uICpFQikgeworICAgIHJldHVybiBFQi0+Z2V0RXhwcmVzc2lvblR5cGUoKSA9PSBFVF9WYXJpYWJsZTsKKyAgfQorCisgIFZhbHVlICpnZXRWYXJpYWJsZVZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFyaWFibGVWYWx1ZTsgfQorICB2b2lkIHNldFZhcmlhYmxlVmFsdWUoVmFsdWUgKlYpIHsgVmFyaWFibGVWYWx1ZSA9IFY7IH0KKworICBib29sIGVxdWFscyhjb25zdCBFeHByZXNzaW9uICZPdGhlcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGNvbnN0IFZhcmlhYmxlRXhwcmVzc2lvbiAmT0MgPSBjYXN0PFZhcmlhYmxlRXhwcmVzc2lvbj4oT3RoZXIpOworICAgIHJldHVybiBWYXJpYWJsZVZhbHVlID09IE9DLlZhcmlhYmxlVmFsdWU7CisgIH0KKworICBoYXNoX2NvZGUgZ2V0SGFzaFZhbHVlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBoYXNoX2NvbWJpbmUodGhpcy0+RXhwcmVzc2lvbjo6Z2V0SGFzaFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZVZhbHVlLT5nZXRUeXBlKCksIFZhcmlhYmxlVmFsdWUpOworICB9CisKKyAgLy8gRGVidWdnaW5nIHN1cHBvcnQKKyAgdm9pZCBwcmludEludGVybmFsKHJhd19vc3RyZWFtICZPUywgYm9vbCBQcmludEVUeXBlKSBjb25zdCBvdmVycmlkZSB7CisgICAgaWYgKFByaW50RVR5cGUpCisgICAgICBPUyA8PCAiRXhwcmVzc2lvblR5cGVWYXJpYWJsZSwgIjsKKyAgICB0aGlzLT5FeHByZXNzaW9uOjpwcmludEludGVybmFsKE9TLCBmYWxzZSk7CisgICAgT1MgPDwgIiB2YXJpYWJsZSA9ICIgPDwgKlZhcmlhYmxlVmFsdWU7CisgIH0KK307CisKK2NsYXNzIENvbnN0YW50RXhwcmVzc2lvbiBmaW5hbCA6IHB1YmxpYyBFeHByZXNzaW9uIHsKK3ByaXZhdGU6CisgIENvbnN0YW50ICpDb25zdGFudFZhbHVlID0gbnVsbHB0cjsKKworcHVibGljOgorICBDb25zdGFudEV4cHJlc3Npb24oKSA6IEV4cHJlc3Npb24oRVRfQ29uc3RhbnQpIHt9CisgIENvbnN0YW50RXhwcmVzc2lvbihDb25zdGFudCAqY29uc3RhbnRWYWx1ZSkKKyAgICAgIDogRXhwcmVzc2lvbihFVF9Db25zdGFudCksIENvbnN0YW50VmFsdWUoY29uc3RhbnRWYWx1ZSkge30KKyAgQ29uc3RhbnRFeHByZXNzaW9uKGNvbnN0IENvbnN0YW50RXhwcmVzc2lvbiAmKSA9IGRlbGV0ZTsKKyAgQ29uc3RhbnRFeHByZXNzaW9uICZvcGVyYXRvcj0oY29uc3QgQ29uc3RhbnRFeHByZXNzaW9uICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRXhwcmVzc2lvbiAqRUIpIHsKKyAgICByZXR1cm4gRUItPmdldEV4cHJlc3Npb25UeXBlKCkgPT0gRVRfQ29uc3RhbnQ7CisgIH0KKworICBDb25zdGFudCAqZ2V0Q29uc3RhbnRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIENvbnN0YW50VmFsdWU7IH0KKyAgdm9pZCBzZXRDb25zdGFudFZhbHVlKENvbnN0YW50ICpWKSB7IENvbnN0YW50VmFsdWUgPSBWOyB9CisKKyAgYm9vbCBlcXVhbHMoY29uc3QgRXhwcmVzc2lvbiAmT3RoZXIpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBjb25zdCBDb25zdGFudEV4cHJlc3Npb24gJk9DID0gY2FzdDxDb25zdGFudEV4cHJlc3Npb24+KE90aGVyKTsKKyAgICByZXR1cm4gQ29uc3RhbnRWYWx1ZSA9PSBPQy5Db25zdGFudFZhbHVlOworICB9CisKKyAgaGFzaF9jb2RlIGdldEhhc2hWYWx1ZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gaGFzaF9jb21iaW5lKHRoaXMtPkV4cHJlc3Npb246OmdldEhhc2hWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRWYWx1ZS0+Z2V0VHlwZSgpLCBDb25zdGFudFZhbHVlKTsKKyAgfQorCisgIC8vIERlYnVnZ2luZyBzdXBwb3J0CisgIHZvaWQgcHJpbnRJbnRlcm5hbChyYXdfb3N0cmVhbSAmT1MsIGJvb2wgUHJpbnRFVHlwZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmIChQcmludEVUeXBlKQorICAgICAgT1MgPDwgIkV4cHJlc3Npb25UeXBlQ29uc3RhbnQsICI7CisgICAgdGhpcy0+RXhwcmVzc2lvbjo6cHJpbnRJbnRlcm5hbChPUywgZmFsc2UpOworICAgIE9TIDw8ICIgY29uc3RhbnQgPSAiIDw8ICpDb25zdGFudFZhbHVlOworICB9Cit9OworCitjbGFzcyBVbmtub3duRXhwcmVzc2lvbiBmaW5hbCA6IHB1YmxpYyBFeHByZXNzaW9uIHsKK3ByaXZhdGU6CisgIEluc3RydWN0aW9uICpJbnN0OworCitwdWJsaWM6CisgIFVua25vd25FeHByZXNzaW9uKEluc3RydWN0aW9uICpJKSA6IEV4cHJlc3Npb24oRVRfVW5rbm93biksIEluc3QoSSkge30KKyAgVW5rbm93bkV4cHJlc3Npb24oKSA9IGRlbGV0ZTsKKyAgVW5rbm93bkV4cHJlc3Npb24oY29uc3QgVW5rbm93bkV4cHJlc3Npb24gJikgPSBkZWxldGU7CisgIFVua25vd25FeHByZXNzaW9uICZvcGVyYXRvcj0oY29uc3QgVW5rbm93bkV4cHJlc3Npb24gJikgPSBkZWxldGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBFeHByZXNzaW9uICpFQikgeworICAgIHJldHVybiBFQi0+Z2V0RXhwcmVzc2lvblR5cGUoKSA9PSBFVF9Vbmtub3duOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKmdldEluc3RydWN0aW9uKCkgY29uc3QgeyByZXR1cm4gSW5zdDsgfQorICB2b2lkIHNldEluc3RydWN0aW9uKEluc3RydWN0aW9uICpJKSB7IEluc3QgPSBJOyB9CisKKyAgYm9vbCBlcXVhbHMoY29uc3QgRXhwcmVzc2lvbiAmT3RoZXIpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBjb25zdCBhdXRvICZPVSA9IGNhc3Q8VW5rbm93bkV4cHJlc3Npb24+KE90aGVyKTsKKyAgICByZXR1cm4gSW5zdCA9PSBPVS5JbnN0OworICB9CisKKyAgaGFzaF9jb2RlIGdldEhhc2hWYWx1ZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gaGFzaF9jb21iaW5lKHRoaXMtPkV4cHJlc3Npb246OmdldEhhc2hWYWx1ZSgpLCBJbnN0KTsKKyAgfQorCisgIC8vIERlYnVnZ2luZyBzdXBwb3J0CisgIHZvaWQgcHJpbnRJbnRlcm5hbChyYXdfb3N0cmVhbSAmT1MsIGJvb2wgUHJpbnRFVHlwZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmIChQcmludEVUeXBlKQorICAgICAgT1MgPDwgIkV4cHJlc3Npb25UeXBlVW5rbm93biwgIjsKKyAgICB0aGlzLT5FeHByZXNzaW9uOjpwcmludEludGVybmFsKE9TLCBmYWxzZSk7CisgICAgT1MgPDwgIiBpbnN0ID0gIiA8PCAqSW5zdDsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEdWTkV4cHJlc3Npb24KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfR1ZORVhQUkVTU0lPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0d1YXJkV2lkZW5pbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvR3VhcmRXaWRlbmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYzA5NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0d1YXJkV2lkZW5pbmcuaApAQCAtMCwwICsxLDMyIEBACisvLz09PS0gR3VhcmRXaWRlbmluZy5oIC0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEd1YXJkIHdpZGVuaW5nIGlzIGFuIG9wdGltaXphdGlvbiBvdmVyIHRoZSBAbGx2bS5leHBlcmltZW50YWwuZ3VhcmQgaW50cmluc2ljCisvLyB0aGF0IChvcHRpbWlzdGljYWxseSkgY29tYmluZXMgbXVsdGlwbGUgZ3VhcmRzIGludG8gb25lIHRvIGhhdmUgZmV3ZXIgY2hlY2tzCisvLyBhdCBydW50aW1lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0dVQVJEX1dJREVOSU5HX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9HVUFSRF9XSURFTklOR19ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CisKK3N0cnVjdCBHdWFyZFdpZGVuaW5nUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPEd1YXJkV2lkZW5pbmdQYXNzPiB7CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307Cit9CisKKworI2VuZGlmICAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0dVQVJEX1dJREVOSU5HX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvSVZVc2Vyc1ByaW50ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvSVZVc2Vyc1ByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWQwMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9JVlVzZXJzUHJpbnRlci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vPT09LSBJVlVzZXJzUHJpbnRlci5oIC0gSW5kdWN0aW9uIFZhcmlhYmxlIFVzZXJzIFByaW50aW5nIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9JVlVTRVJTUFJJTlRFUl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfSVZVU0VSU1BSSU5URVJfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JVlVzZXJzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gUHJpbnRlciBwYXNzIGZvciB0aGUgXGMgSVZVc2VycyBmb3IgYSBsb29wLgorY2xhc3MgSVZVc2Vyc1ByaW50ZXJQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48SVZVc2Vyc1ByaW50ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKworcHVibGljOgorICBleHBsaWNpdCBJVlVzZXJzUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TKSA6IE9TKE9TKSB7fQorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTG9vcCAmTCwgTG9vcEFuYWx5c2lzTWFuYWdlciAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJkFSLCBMUE1VcGRhdGVyICZVKTsKK307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9JbmRWYXJTaW1wbGlmeS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9JbmRWYXJTaW1wbGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjFjOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0luZFZhclNpbXBsaWZ5LmgKQEAgLTAsMCArMSwzNCBAQAorLy89PT0tIEluZFZhclNpbXBsaWZ5LmggLSBJbmR1Y3Rpb24gVmFyaWFibGUgU2ltcGxpZmljYXRpb24gLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBmb3IgdGhlIEluZHVjdGlvbiBWYXJpYWJsZQorLy8gU2ltcGxpZmljYXRpb24gcGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfSU5EVkFSU0lNUExJRllfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0lORFZBUlNJTVBMSUZZX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcEFuYWx5c2lzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMb29wOworY2xhc3MgTFBNVXBkYXRlcjsKKworY2xhc3MgSW5kVmFyU2ltcGxpZnlQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48SW5kVmFyU2ltcGxpZnlQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMb29wICZMLCBMb29wQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmQVIsIExQTVVwZGF0ZXIgJlUpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfSU5EVkFSU0lNUExJRllfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9JbmR1Y3RpdmVSYW5nZUNoZWNrRWxpbWluYXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvSW5kdWN0aXZlUmFuZ2VDaGVja0VsaW1pbmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzExYzU0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvSW5kdWN0aXZlUmFuZ2VDaGVja0VsaW1pbmF0aW9uLmgKQEAgLTAsMCArMSwzMSBAQAorLy89PT0tIEluZHVjdGl2ZVJhbmdlQ2hlY2tFbGltaW5hdGlvbi5oIC0gSVJDRSAtLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBmb3IgdGhlIEluZHVjdGl2ZSBSYW5nZSBDaGVjayBFbGltaW5hdGlvbgorLy8gbG9vcCBwYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9JTkRVQ1RJVkVSQU5HRUNIRUNLRUxJTUlOQVRJT05fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0lORFVDVElWRVJBTkdFQ0hFQ0tFTElNSU5BVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBJUkNFUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPElSQ0VQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMb29wICZMLCBMb29wQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmQVIsIExQTVVwZGF0ZXIgJlUpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfSU5EVUNUSVZFUkFOR0VDSEVDS0VMSU1JTkFUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvSnVtcFRocmVhZGluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9KdW1wVGhyZWFkaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0OTNhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvSnVtcFRocmVhZGluZy5oCkBAIC0wLDAgKzEsMTYxIEBACisvLz09PS0gSnVtcFRocmVhZGluZy5oIC0gdGhyZWFkIGNvbnRyb2wgdGhyb3VnaCBjb25kaXRpb25hbCBCQnMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFNlZSB0aGUgY29tbWVudHMgb24gSnVtcFRocmVhZGluZ1Bhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0pVTVBUSFJFQURJTkdfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0pVTVBUSFJFQURJTkdfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQmxvY2tGcmVxdWVuY3lJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9CcmFuY2hQcm9iYWJpbGl0eUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEJpbmFyeU9wZXJhdG9yOworY2xhc3MgQnJhbmNoSW5zdDsKK2NsYXNzIENtcEluc3Q7CitjbGFzcyBDb25zdGFudDsKK2NsYXNzIERlZmVycmVkRG9taW5hbmNlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIEludHJpbnNpY0luc3Q7CitjbGFzcyBMYXp5VmFsdWVJbmZvOworY2xhc3MgTG9hZEluc3Q7CitjbGFzcyBQSElOb2RlOworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CitjbGFzcyBWYWx1ZTsKKworLy8vIEEgcHJpdmF0ZSAibW9kdWxlIiBuYW1lc3BhY2UgZm9yIHR5cGVzIGFuZCB1dGlsaXRpZXMgdXNlZCBieQorLy8vIEp1bXBUaHJlYWRpbmcuCisvLy8gVGhlc2UgYXJlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBjbGllbnRzLgorbmFtZXNwYWNlIGp1bXB0aHJlYWRpbmcgeworCisvLyBUaGVzZSBhcmUgYXQgZ2xvYmFsIHNjb3BlIHNvIHN0YXRpYyBmdW5jdGlvbnMgY2FuIHVzZSB0aGVtIHRvby4KK3VzaW5nIFByZWRWYWx1ZUluZm8gPSBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPENvbnN0YW50ICosIEJhc2ljQmxvY2sgKj4+OwordXNpbmcgUHJlZFZhbHVlSW5mb1R5ID0gU21hbGxWZWN0b3I8c3RkOjpwYWlyPENvbnN0YW50ICosIEJhc2ljQmxvY2sgKj4sIDg+OworCisvLyBUaGlzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGF0IGtpbmQgb2YgY29uc3RhbnQgd2UncmUgY3VycmVudGx5IGhvcGluZworLy8gdG8gZmluZC4KK2VudW0gQ29uc3RhbnRQcmVmZXJlbmNlIHsgV2FudEludGVnZXIsIFdhbnRCbG9ja0FkZHJlc3MgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGp1bXB0aHJlYWRpbmcKKworLy8vIFRoaXMgcGFzcyBwZXJmb3JtcyAnanVtcCB0aHJlYWRpbmcnLCB3aGljaCBsb29rcyBhdCBibG9ja3MgdGhhdCBoYXZlCisvLy8gbXVsdGlwbGUgcHJlZGVjZXNzb3JzIGFuZCBtdWx0aXBsZSBzdWNjZXNzb3JzLiAgSWYgb25lIG9yIG1vcmUgb2YgdGhlCisvLy8gcHJlZGVjZXNzb3JzIG9mIHRoZSBibG9jayBjYW4gYmUgcHJvdmVuIHRvIGFsd2F5cyBqdW1wIHRvIG9uZSBvZiB0aGUKKy8vLyBzdWNjZXNzb3JzLCB3ZSBmb3J3YXJkIHRoZSBlZGdlIGZyb20gdGhlIHByZWRlY2Vzc29yIHRvIHRoZSBzdWNjZXNzb3IgYnkKKy8vLyBkdXBsaWNhdGluZyB0aGUgY29udGVudHMgb2YgdGhpcyBibG9jay4KKy8vLworLy8vIEFuIGV4YW1wbGUgb2Ygd2hlbiB0aGlzIGNhbiBvY2N1ciBpcyBjb2RlIGxpa2UgdGhpczoKKy8vLworLy8vICAgaWYgKCkgeyAuLi4KKy8vLyAgICAgWCA9IDQ7CisvLy8gICB9CisvLy8gICBpZiAoWCA8IDMpIHsKKy8vLworLy8vIEluIHRoaXMgY2FzZSwgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoIGF0IHRoZSBlbmQgb2YgdGhlIGZpcnN0IGlmIGNhbiBiZQorLy8vIHJldmVjdG9yZWQgdG8gdGhlIGZhbHNlIHNpZGUgb2YgdGhlIHNlY29uZCBpZi4KK2NsYXNzIEp1bXBUaHJlYWRpbmdQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48SnVtcFRocmVhZGluZ1Bhc3M+IHsKKyAgVGFyZ2V0TGlicmFyeUluZm8gKlRMSTsKKyAgTGF6eVZhbHVlSW5mbyAqTFZJOworICBBbGlhc0FuYWx5c2lzICpBQTsKKyAgRGVmZXJyZWREb21pbmFuY2UgKkREVDsKKyAgc3RkOjp1bmlxdWVfcHRyPEJsb2NrRnJlcXVlbmN5SW5mbz4gQkZJOworICBzdGQ6OnVuaXF1ZV9wdHI8QnJhbmNoUHJvYmFiaWxpdHlJbmZvPiBCUEk7CisgIGJvb2wgSGFzUHJvZmlsZURhdGEgPSBmYWxzZTsKKyAgYm9vbCBIYXNHdWFyZHMgPSBmYWxzZTsKKyNpZmRlZiBOREVCVUcKKyAgU21hbGxQdHJTZXQ8Y29uc3QgQmFzaWNCbG9jayAqLCAxNj4gTG9vcEhlYWRlcnM7CisjZWxzZQorICBTbWFsbFNldDxBc3NlcnRpbmdWSDxjb25zdCBCYXNpY0Jsb2NrPiwgMTY+IExvb3BIZWFkZXJzOworI2VuZGlmCisgIERlbnNlU2V0PHN0ZDo6cGFpcjxWYWx1ZSAqLCBCYXNpY0Jsb2NrICo+PiBSZWN1cnNpb25TZXQ7CisKKyAgdW5zaWduZWQgQkJEdXBUaHJlc2hvbGQ7CisKKyAgLy8gUkFJSSBoZWxwZXIgZm9yIHVwZGF0aW5nIHRoZSByZWN1cnNpb24gc3RhY2suCisgIHN0cnVjdCBSZWN1cnNpb25TZXRSZW1vdmVyIHsKKyAgICBEZW5zZVNldDxzdGQ6OnBhaXI8VmFsdWUgKiwgQmFzaWNCbG9jayAqPj4gJlRoZVNldDsKKyAgICBzdGQ6OnBhaXI8VmFsdWUgKiwgQmFzaWNCbG9jayAqPiBUaGVQYWlyOworCisgICAgUmVjdXJzaW9uU2V0UmVtb3ZlcihEZW5zZVNldDxzdGQ6OnBhaXI8VmFsdWUgKiwgQmFzaWNCbG9jayAqPj4gJlMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8VmFsdWUgKiwgQmFzaWNCbG9jayAqPiBQKQorICAgICAgICA6IFRoZVNldChTKSwgVGhlUGFpcihQKSB7fQorCisgICAgflJlY3Vyc2lvblNldFJlbW92ZXIoKSB7IFRoZVNldC5lcmFzZShUaGVQYWlyKTsgfQorICB9OworCitwdWJsaWM6CisgIEp1bXBUaHJlYWRpbmdQYXNzKGludCBUID0gLTEpOworCisgIC8vIEdsdWUgZm9yIG9sZCBQTS4KKyAgYm9vbCBydW5JbXBsKEZ1bmN0aW9uICZGLCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJXywgTGF6eVZhbHVlSW5mbyAqTFZJXywKKyAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgKkFBXywgRGVmZXJyZWREb21pbmFuY2UgKkREVF8sCisgICAgICAgICAgICAgICBib29sIEhhc1Byb2ZpbGVEYXRhXywgc3RkOjp1bmlxdWVfcHRyPEJsb2NrRnJlcXVlbmN5SW5mbz4gQkZJXywKKyAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCcmFuY2hQcm9iYWJpbGl0eUluZm8+IEJQSV8pOworCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKKworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSB7CisgICAgQkZJLnJlc2V0KCk7CisgICAgQlBJLnJlc2V0KCk7CisgIH0KKworICB2b2lkIEZpbmRMb29wSGVhZGVycyhGdW5jdGlvbiAmRik7CisgIGJvb2wgUHJvY2Vzc0Jsb2NrKEJhc2ljQmxvY2sgKkJCKTsKKyAgYm9vbCBUaHJlYWRFZGdlKEJhc2ljQmxvY2sgKkJCLCBjb25zdCBTbWFsbFZlY3RvckltcGw8QmFzaWNCbG9jayAqPiAmUHJlZEJCcywKKyAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKlN1Y2NCQik7CisgIGJvb2wgRHVwbGljYXRlQ29uZEJyYW5jaE9uUEhJSW50b1ByZWQoCisgICAgICBCYXNpY0Jsb2NrICpCQiwgY29uc3QgU21hbGxWZWN0b3JJbXBsPEJhc2ljQmxvY2sgKj4gJlByZWRCQnMpOworCisgIGJvb2wKKyAgQ29tcHV0ZVZhbHVlS25vd25JblByZWRlY2Vzc29ycyhWYWx1ZSAqViwgQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVtcHRocmVhZGluZzo6UHJlZFZhbHVlSW5mbyAmUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bXB0aHJlYWRpbmc6OkNvbnN0YW50UHJlZmVyZW5jZSBQcmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpDeHRJID0gbnVsbHB0cik7CisgIGJvb2wgUHJvY2Vzc1RocmVhZGFibGVFZGdlcyhWYWx1ZSAqQ29uZCwgQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW1wdGhyZWFkaW5nOjpDb25zdGFudFByZWZlcmVuY2UgUHJlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpDeHRJID0gbnVsbHB0cik7CisKKyAgYm9vbCBQcm9jZXNzQnJhbmNoT25QSEkoUEhJTm9kZSAqUE4pOworICBib29sIFByb2Nlc3NCcmFuY2hPblhPUihCaW5hcnlPcGVyYXRvciAqQk8pOworICBib29sIFByb2Nlc3NJbXBsaWVkQ29uZGl0aW9uKEJhc2ljQmxvY2sgKkJCKTsKKworICBib29sIFNpbXBsaWZ5UGFydGlhbGx5UmVkdW5kYW50TG9hZChMb2FkSW5zdCAqTEkpOworICBib29sIFRyeVRvVW5mb2xkU2VsZWN0KENtcEluc3QgKkNvbmRDbXAsIEJhc2ljQmxvY2sgKkJCKTsKKyAgYm9vbCBUcnlUb1VuZm9sZFNlbGVjdEluQ3VyckJCKEJhc2ljQmxvY2sgKkJCKTsKKworICBib29sIFByb2Nlc3NHdWFyZHMoQmFzaWNCbG9jayAqQkIpOworICBib29sIFRocmVhZEd1YXJkKEJhc2ljQmxvY2sgKkJCLCBJbnRyaW5zaWNJbnN0ICpHdWFyZCwgQnJhbmNoSW5zdCAqQkkpOworCitwcml2YXRlOgorICBCYXNpY0Jsb2NrICpTcGxpdEJsb2NrUHJlZHMoQmFzaWNCbG9jayAqQkIsIEFycmF5UmVmPEJhc2ljQmxvY2sgKj4gUHJlZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpTdWZmaXgpOworICB2b2lkIFVwZGF0ZUJsb2NrRnJlcUFuZEVkZ2VXZWlnaHQoQmFzaWNCbG9jayAqUHJlZEJCLCBCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKk5ld0JCLCBCYXNpY0Jsb2NrICpTdWNjQkIpOworICAvLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIGhhcyBwcm9maWxlIG1ldGFkYXRhIGZvciBpdHMgb3V0Z29pbmcgZWRnZXMuCisgIGJvb2wgZG9lc0Jsb2NrSGF2ZVByb2ZpbGVEYXRhKEJhc2ljQmxvY2sgKkJCKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0pVTVBUSFJFQURJTkdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9MSUNNLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xJQ00uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGFkMTkwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9MSUNNLmgKQEAgLTAsMCArMSw1MCBAQAorLy89PT0tIExJQ00uaCAtIExvb3AgSW52YXJpYW50IENvZGUgTW90aW9uIFBhc3MgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBwZXJmb3JtcyBsb29wIGludmFyaWFudCBjb2RlIG1vdGlvbiwgYXR0ZW1wdGluZyB0byByZW1vdmUgYXMgbXVjaAorLy8gY29kZSBmcm9tIHRoZSBib2R5IG9mIGEgbG9vcCBhcyBwb3NzaWJsZS4gIEl0IGRvZXMgdGhpcyBieSBlaXRoZXIgaG9pc3RpbmcKKy8vIGNvZGUgaW50byB0aGUgcHJlaGVhZGVyIGJsb2NrLCBvciBieSBzaW5raW5nIGNvZGUgdG8gdGhlIGV4aXQgYmxvY2tzIGlmIGl0IGlzCisvLyBzYWZlLiAgVGhpcyBwYXNzIGFsc28gcHJvbW90ZXMgbXVzdC1hbGlhc2VkIG1lbW9yeSBsb2NhdGlvbnMgaW4gdGhlIGxvb3AgdG8KKy8vIGxpdmUgaW4gcmVnaXN0ZXJzLCB0aHVzIGhvaXN0aW5nIGFuZCBzaW5raW5nICJpbnZhcmlhbnQiIGxvYWRzIGFuZCBzdG9yZXMuCisvLworLy8gVGhpcyBwYXNzIHVzZXMgYWxpYXMgYW5hbHlzaXMgZm9yIHR3byBwdXJwb3NlczoKKy8vCisvLyAgMS4gTW92aW5nIGxvb3AgaW52YXJpYW50IGxvYWRzIGFuZCBjYWxscyBvdXQgb2YgbG9vcHMuICBJZiB3ZSBjYW4gZGV0ZXJtaW5lCisvLyAgICAgdGhhdCBhIGxvYWQgb3IgY2FsbCBpbnNpZGUgb2YgYSBsb29wIG5ldmVyIGFsaWFzZXMgYW55dGhpbmcgc3RvcmVkIHRvLAorLy8gICAgIHdlIGNhbiBob2lzdCBpdCBvciBzaW5rIGl0IGxpa2UgYW55IG90aGVyIGluc3RydWN0aW9uLgorLy8gIDIuIFNjYWxhciBQcm9tb3Rpb24gb2YgTWVtb3J5IC0gSWYgdGhlcmUgaXMgYSBzdG9yZSBpbnN0cnVjdGlvbiBpbnNpZGUgb2YKKy8vICAgICB0aGUgbG9vcCwgd2UgdHJ5IHRvIG1vdmUgdGhlIHN0b3JlIHRvIGhhcHBlbiBBRlRFUiB0aGUgbG9vcCBpbnN0ZWFkIG9mCisvLyAgICAgaW5zaWRlIG9mIHRoZSBsb29wLiAgVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgYSBmZXcgY29uZGl0aW9ucyBhcmUgdHJ1ZToKKy8vICAgICAgIEEuIFRoZSBwb2ludGVyIHN0b3JlZCB0aHJvdWdoIGlzIGxvb3AgaW52YXJpYW50CisvLyAgICAgICBCLiBUaGVyZSBhcmUgbm8gc3RvcmVzIG9yIGxvYWRzIGluIHRoZSBsb29wIHdoaWNoIF9tYXlfIGFsaWFzIHRoZQorLy8gICAgICAgICAgcG9pbnRlci4gIFRoZXJlIGFyZSBubyBjYWxscyBpbiB0aGUgbG9vcCB3aGljaCBtb2QvcmVmIHRoZSBwb2ludGVyLgorLy8gICAgIElmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIHRydWUsIHdlIGNhbiBwcm9tb3RlIHRoZSBsb2FkcyBhbmQgc3RvcmVzIGluIHRoZQorLy8gICAgIGxvb3Agb2YgdGhlIHBvaW50ZXIgdG8gdXNlIGEgdGVtcG9yYXJ5IGFsbG9jYSdkIHZhcmlhYmxlLiAgV2UgdGhlbiB1c2UKKy8vICAgICB0aGUgU1NBVXBkYXRlciB0byBjb25zdHJ1Y3QgdGhlIGFwcHJvcHJpYXRlIFNTQSBmb3JtIGZvciB0aGUgdmFsdWUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xJQ01fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xJQ01fSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BQYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBQZXJmb3JtcyBMb29wIEludmFyaWFudCBDb2RlIE1vdGlvbiBQYXNzLgorY2xhc3MgTElDTVBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMSUNNUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTG9vcCAmTCwgTG9vcEFuYWx5c2lzTWFuYWdlciAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJkFSLCBMUE1VcGRhdGVyICZVKTsKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MSUNNX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcEFjY2Vzc0FuYWx5c2lzUHJpbnRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wQWNjZXNzQW5hbHlzaXNQcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVkZGQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcEFjY2Vzc0FuYWx5c2lzUHJpbnRlci5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vPT09LSBsbHZtL0FuYWx5c2lzL0xvb3BBY2Nlc3NBbmFseXNpc1ByaW50ZXIuaCAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QQUNDRVNTQU5BTFlTSVNQUklOVEVSX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QQUNDRVNTQU5BTFlTSVNQUklOVEVSX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFBhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBQcmludGVyIHBhc3MgZm9yIHRoZSBcYyBMb29wQWNjZXNzSW5mbyByZXN1bHRzLgorY2xhc3MgTG9vcEFjY2Vzc0luZm9QcmludGVyUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48TG9vcEFjY2Vzc0luZm9QcmludGVyUGFzcz4geworICByYXdfb3N0cmVhbSAmT1M7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgTG9vcEFjY2Vzc0luZm9QcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmT1MpIDogT1MoT1MpIHt9CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMb29wICZMLCBMb29wQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmQVIsIExQTVVwZGF0ZXIgJlUpOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BEYXRhUHJlZmV0Y2guaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcERhdGFQcmVmZXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYzdhMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BEYXRhUHJlZmV0Y2guaApAQCAtMCwwICsxLDMzIEBACisvLz09PS0tLS0tLS0tIExvb3BEYXRhUHJlZmV0Y2guaCAtIExvb3AgRGF0YSBQcmVmZXRjaGluZyBQYXNzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGZvciBMTFZNJ3MgTG9vcCBEYXRhIFByZWZldGNoaW5nIFBhc3MuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUERBVEFQUkVGRVRDSF9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUERBVEFQUkVGRVRDSF9ICisKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBbiBvcHRpbWl6YXRpb24gcGFzcyBpbnNlcnRpbmcgZGF0YSBwcmVmZXRjaGVzIGluIGxvb3BzLgorY2xhc3MgTG9vcERhdGFQcmVmZXRjaFBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMb29wRGF0YVByZWZldGNoUGFzcz4geworcHVibGljOgorICBMb29wRGF0YVByZWZldGNoUGFzcygpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIFJ1biB0aGUgcGFzcyBvdmVyIHRoZSBmdW5jdGlvbi4KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUERBVEFQUkVGRVRDSF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BEZWxldGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wRGVsZXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjhjYjFlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wRGVsZXRpb24uaApAQCAtMCwwICsxLDM1IEBACisvLz09PS0gTG9vcERlbGV0aW9uLmggLSBMb29wIERlbGV0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgTG9vcCBEZWxldGlvbiBQYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QREVMRVRJT05fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BERUxFVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BBbmFseXNpc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMb29wRGVsZXRpb25QYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48TG9vcERlbGV0aW9uUGFzcz4geworcHVibGljOgorICBMb29wRGVsZXRpb25QYXNzKCkgPSBkZWZhdWx0OworCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMb29wICZMLCBMb29wQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmQVIsIExQTVVwZGF0ZXIgJlUpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUERFTEVUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcERpc3RyaWJ1dGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcERpc3RyaWJ1dGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmYxYzlkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wRGlzdHJpYnV0ZS5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vPT09LSBMb29wRGlzdHJpYnV0ZS5jcHAgLSBMb29wIERpc3RyaWJ1dGlvbiBQYXNzIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIExvb3AgRGlzdHJpYnV0aW9uIFBhc3MuICBJdHMgbWFpbiBmb2N1cyBpcyB0bworLy8gZGlzdHJpYnV0ZSBsb29wcyB0aGF0IGNhbm5vdCBiZSB2ZWN0b3JpemVkIGR1ZSB0byBkZXBlbmRlbmNlIGN5Y2xlcy4gIEl0CisvLyB0cmllcyB0byBpc29sYXRlIHRoZSBvZmZlbmRpbmcgZGVwZW5kZW5jZXMgaW50byBhIG5ldyBsb29wIGFsbG93aW5nCisvLyB2ZWN0b3JpemF0aW9uIG9mIHRoZSByZW1haW5pbmcgcGFydHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BESVNUUklCVVRFX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QRElTVFJJQlVURV9ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CisKK2NsYXNzIExvb3BEaXN0cmlidXRlUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPExvb3BEaXN0cmlidXRlUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QRElTVFJJQlVURV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BJZGlvbVJlY29nbml6ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wSWRpb21SZWNvZ25pemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWRkZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wSWRpb21SZWNvZ25pemUuaApAQCAtMCwwICsxLDM2IEBACisvLz09PS0gTG9vcElkaW9tUmVjb2duaXplLmggLSBMb29wIElkaW9tIFJlY29nbml6ZSBQYXNzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBpbXBsZW1lbnRzIGFuIGlkaW9tIHJlY29nbml6ZXIgdGhhdCB0cmFuc2Zvcm1zIHNpbXBsZSBsb29wcyBpbnRvIGEKKy8vIG5vbi1sb29wIGZvcm0uICBJbiBjYXNlcyB0aGF0IHRoaXMga2lja3MgaW4sIGl0IGNhbiBiZSBhIHNpZ25pZmljYW50CisvLyBwZXJmb3JtYW5jZSB3aW4uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BJRElPTVJFQ09HTklaRV9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUElESU9NUkVDT0dOSVpFX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcEFuYWx5c2lzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMb29wOworY2xhc3MgTFBNVXBkYXRlcjsKKworLy8vIFBlcmZvcm1zIExvb3AgSWRpb20gUmVjb2duaXplIFBhc3MuCitjbGFzcyBMb29wSWRpb21SZWNvZ25pemVQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48TG9vcElkaW9tUmVjb2duaXplUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTG9vcCAmTCwgTG9vcEFuYWx5c2lzTWFuYWdlciAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJkFSLCBMUE1VcGRhdGVyICZVKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BJRElPTVJFQ09HTklaRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BMb2FkRWxpbWluYXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcExvYWRFbGltaW5hdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNTE0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BMb2FkRWxpbWluYXRpb24uaApAQCAtMCwwICsxLDM0IEBACisvLz09PS0gTG9vcExvYWRFbGltaW5hdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIExvb3BMb2FkRWxpbWluYXRpb25QYXNzIG9iamVjdC4gVGhpcyBwYXNzIGZvcndhcmRzCisvLy8gbG9hZGVkIHZhbHVlcyBhcm91bmQgbG9vcCBiYWNrZWRnZXMgdG8gYWxsb3cgdGhlaXIgdXNlIGluIHN1YnNlcXVlbnQKKy8vLyBpdGVyYXRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QTE9BREVMSU1JTkFUSU9OX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QTE9BREVMSU1JTkFUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKKworLy8vIFBhc3MgdG8gZm9yd2FyZCBsb2FkcyBpbiBhIGxvb3AgYXJvdW5kIHRoZSBiYWNrZWRnZSB0byBzdWJzZXF1ZW50CisvLy8gaXRlcmF0aW9ucy4KK3N0cnVjdCBMb29wTG9hZEVsaW1pbmF0aW9uUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPExvb3BMb2FkRWxpbWluYXRpb25QYXNzPiB7CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BMT0FERUxJTUlOQVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wUGFzc01hbmFnZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFBhc3NNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhNDVlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFBhc3NNYW5hZ2VyLmgKQEAgLTAsMCArMSw0MDYgQEAKKy8vPT09LSBMb29wUGFzc01hbmFnZXIuaCAtIExvb3AgcGFzcyBtYW5hZ2VtZW50IC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLworLy8vIFRoaXMgaGVhZGVyIHByb3ZpZGVzIGNsYXNzZXMgZm9yIG1hbmFnaW5nIGEgcGlwZWxpbmUgb2YgcGFzc2VzIG92ZXIgbG9vcHMKKy8vLyBpbiBMTFZNIElSLgorLy8vCisvLy8gVGhlIHByaW1hcnkgbG9vcCBwYXNzIHBpcGVsaW5lIGlzIG1hbmFnZWQgaW4gYSB2ZXJ5IHBhcnRpY3VsYXIgd2F5IHRvCisvLy8gcHJvdmlkZSBhIHNldCBvZiBjb3JlIGd1YXJhbnRlZXM6CisvLy8gMSkgTG9vcHMgYXJlLCB3aGVyZSBwb3NzaWJsZSwgaW4gc2ltcGxpZmllZCBmb3JtLgorLy8vIDIpIExvb3BzIGFyZSAqYWx3YXlzKiBpbiBMQ1NTQSBmb3JtLgorLy8vIDMpIEEgY29sbGVjdGlvbiBvZiBMb29wLXNwZWNpZmljIGFuYWx5c2lzIHJlc3VsdHMgYXJlIGF2YWlsYWJsZToKKy8vLyAgICAtIExvb3BJbmZvCisvLy8gICAgLSBEb21pbmF0b3JUcmVlCisvLy8gICAgLSBTY2FsYXJFdm9sdXRpb24KKy8vLyAgICAtIEFBTWFuYWdlcgorLy8vIDQpIEFsbCBsb29wIHBhc3NlcyBwcmVzZXJ2ZSAjMSAod2hlcmUgcG9zc2libGUpLCAjMiwgYW5kICMzLgorLy8vIDUpIExvb3AgcGFzc2VzIHJ1biBvdmVyIGVhY2ggbG9vcCBpbiB0aGUgbG9vcCBuZXN0IGZyb20gdGhlIGlubmVybW9zdCB0bworLy8vICAgIHRoZSBvdXRlcm1vc3QuIFNwZWNpZmljYWxseSwgYWxsIGlubmVyIGxvb3BzIGFyZSBwcm9jZXNzZWQgYmVmb3JlCisvLy8gICAgcGFzc2VzIHJ1biBvdmVyIG91dGVyIGxvb3BzLiBXaGVuIHJ1bm5pbmcgdGhlIHBpcGVsaW5lIGFjcm9zcyBhbiBpbm5lcgorLy8vICAgIGxvb3AgY3JlYXRlcyBuZXcgaW5uZXIgbG9vcHMsIHRob3NlIGFyZSBhZGRlZCBhbmQgcHJvY2Vzc2VkIGluIHRoaXMKKy8vLyAgICBvcmRlciBhcyB3ZWxsLgorLy8vCisvLy8gVGhpcyBwcm9jZXNzIGlzIGRlc2lnbmVkIHRvIGZhY2lsaXRhdGUgdHJhbnNmb3JtYXRpb25zIHdoaWNoIHNpbXBsaWZ5LAorLy8vIHJlZHVjZSwgYW5kIHJlbW92ZSBsb29wcy4gRm9yIHBhc3NlcyB3aGljaCBhcmUgbW9yZSBvcmllbnRlZCB0b3dhcmRzCisvLy8gb3B0aW1pemluZyBsb29wcywgZXNwZWNpYWxseSBvcHRpbWl6aW5nIGxvb3AgKm5lc3RzKiBpbnN0ZWFkIG9mIHNpbmdsZQorLy8vIGxvb3BzIGluIGlzb2xhdGlvbiwgdGhpcyBmcmFtZXdvcmsgaXMgbGVzcyBpbnRlcmVzdGluZy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BQQVNTTUFOQUdFUl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUFBBU1NNQU5BR0VSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1Bvc3RPcmRlckl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUHJpb3JpdHlXb3JrbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQmFzaWNBbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9HbG9iYWxzTW9kUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wQW5hbHlzaXNNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9UYXJnZXRMaWJyYXJ5SW5mby5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVGFyZ2V0VHJhbnNmb3JtSW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvTENTU0EuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvTG9vcFNpbXBsaWZ5LmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgYW4gdXBkYXRlIHRyYWNraW5nIEFQSSB1c2VkIGluIHRoZSBwYXNzIG1hbmFnZXIuCitjbGFzcyBMUE1VcGRhdGVyOworCisvLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBhbmQgaW5zdGFudGlhdGlvbiBkZWNsYXJhdGlvbnMgZm9yIHRoZSBwYXNzIG1hbmFnZXIuCisvLyBTZWUgdGhlIGNvbW1lbnRzIG9uIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBzcGVjaWFsaXphdGlvbiBmb3IgZGV0YWlscyBvbiBob3cKKy8vIGl0IGRpZmZlcnMgZnJvbSB0aGUgcHJpbWFyeSB0ZW1wbGF0ZS4KK3RlbXBsYXRlIDw+CitQcmVzZXJ2ZWRBbmFseXNlcworUGFzc01hbmFnZXI8TG9vcCwgTG9vcEFuYWx5c2lzTWFuYWdlciwgTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzICYsCisgICAgICAgICAgICBMUE1VcGRhdGVyICY+OjpydW4oTG9vcCAmSW5pdGlhbEwsIExvb3BBbmFseXNpc01hbmFnZXIgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmQW5hbHlzaXNSZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQTVVwZGF0ZXIgJlUpOworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFBhc3NNYW5hZ2VyPExvb3AsIExvb3BBbmFseXNpc01hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzICYsIExQTVVwZGF0ZXIgJj47CisKKy8vLyBcYnJpZWYgVGhlIExvb3AgcGFzcyBtYW5hZ2VyLgorLy8vCisvLy8gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgUGFzc01hbmFnZXIgdGVtcGxhdGUgZm9yIGRldGFpbHMuIEl0IHJ1bnMKKy8vLyBhIHNlcXVlbmNlIG9mIExvb3AgcGFzc2VzIG92ZXIgZWFjaCBMb29wIHRoYXQgdGhlIG1hbmFnZXIgaXMgcnVuIG92ZXIuIFRoaXMKKy8vLyB0eXBlZGVmIHNlcnZlcyBhcyBhIGNvbnZlbmllbnQgd2F5IHRvIHJlZmVyIHRvIHRoaXMgY29uc3RydWN0LgordHlwZWRlZiBQYXNzTWFuYWdlcjxMb29wLCBMb29wQW5hbHlzaXNNYW5hZ2VyLCBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJiwKKyAgICAgICAgICAgICAgICAgICAgTFBNVXBkYXRlciAmPgorICAgIExvb3BQYXNzTWFuYWdlcjsKKworLy8vIEEgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBvZiB0aGUgcmVxdWlyZSBhbmFseXNpcyB0ZW1wbGF0ZSBwYXNzIHRvIGZvcndhcmQKKy8vLyB0aGUgZXh0cmEgcGFyYW1ldGVycyBmcm9tIGEgdHJhbnNmb3JtYXRpb24ncyBydW4gbWV0aG9kIHRvIHRoZQorLy8vIEFuYWx5c2lzTWFuYWdlcidzIGdldFJlc3VsdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBBbmFseXNpc1Q+CitzdHJ1Y3QgUmVxdWlyZUFuYWx5c2lzUGFzczxBbmFseXNpc1QsIExvb3AsIExvb3BBbmFseXNpc01hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJiwgTFBNVXBkYXRlciAmPgorICAgIDogUGFzc0luZm9NaXhpbjwKKyAgICAgICAgICBSZXF1aXJlQW5hbHlzaXNQYXNzPEFuYWx5c2lzVCwgTG9vcCwgTG9vcEFuYWx5c2lzTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmLCBMUE1VcGRhdGVyICY+PiB7CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMb29wICZMLCBMb29wQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmQVIsIExQTVVwZGF0ZXIgJikgeworICAgICh2b2lkKUFNLnRlbXBsYXRlIGdldFJlc3VsdDxBbmFseXNpc1Q+KEwsIEFSKTsKKyAgICByZXR1cm4gUHJlc2VydmVkQW5hbHlzZXM6OmFsbCgpOworICB9Cit9OworCisvLy8gQW4gYWxpYXMgdGVtcGxhdGUgdG8gZWFzaWx5IG5hbWUgYSByZXF1aXJlIGFuYWx5c2lzIGxvb3AgcGFzcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBBbmFseXNpc1Q+Cit1c2luZyBSZXF1aXJlQW5hbHlzaXNMb29wUGFzcyA9CisgICAgUmVxdWlyZUFuYWx5c2lzUGFzczxBbmFseXNpc1QsIExvb3AsIExvb3BBbmFseXNpc01hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJiwgTFBNVXBkYXRlciAmPjsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKy8vLyBIZWxwZXIgdG8gaW1wbGVtZW50IGFwcGVuZGluZyBvZiBsb29wcyBvbnRvIGEgd29ya2xpc3QuCisvLy8KKy8vLyBXZSB3YW50IHRvIHByb2Nlc3MgbG9vcHMgaW4gcG9zdG9yZGVyLCBidXQgdGhlIHdvcmtsaXN0IGlzIGEgTElGTyBkYXRhCisvLy8gc3RydWN0dXJlLCBzbyB3ZSBhcHBlbmQgdG8gaXQgaW4gKnJldmVyc2UqIHBvc3RvcmRlci4KKy8vLworLy8vIEZvciB0cmVlcywgYSBwcmVvcmRlciB0cmF2ZXJzYWwgaXMgYSB2aWFibGUgcmV2ZXJzZSBwb3N0b3JkZXIsIHNvIHdlCisvLy8gYWN0dWFsbHkgYXBwZW5kIHVzaW5nIGEgcHJlb3JkZXIgd2FsayBhbGdvcml0aG0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmFuZ2VUPgoraW5saW5lIHZvaWQgYXBwZW5kTG9vcHNUb1dvcmtsaXN0KFJhbmdlVCAmJkxvb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHJpb3JpdHlXb3JrbGlzdDxMb29wICosIDQ+ICZXb3JrbGlzdCkgeworICAvLyBXZSB1c2UgYW4gaW50ZXJuYWwgd29ya2xpc3QgdG8gYnVpbGQgdXAgdGhlIHByZW9yZGVyIHRyYXZlcnNhbCB3aXRob3V0CisgIC8vIHJlY3Vyc2lvbi4KKyAgU21hbGxWZWN0b3I8TG9vcCAqLCA0PiBQcmVPcmRlckxvb3BzLCBQcmVPcmRlcldvcmtsaXN0OworCisgIC8vIFdlIHdhbGsgdGhlIGluaXRpYWwgc2VxdWVuY2Ugb2YgbG9vcHMgaW4gcmV2ZXJzZSBiZWNhdXNlIHdlIGdlbmVyYWxseSB3YW50CisgIC8vIHRvIHZpc2l0IGRlZnMgYmVmb3JlIHVzZXMgYW5kIHRoZSB3b3JrbGlzdCBpcyBMSUZPLgorICBmb3IgKExvb3AgKlJvb3RMIDogcmV2ZXJzZShMb29wcykpIHsKKyAgICBhc3NlcnQoUHJlT3JkZXJMb29wcy5lbXB0eSgpICYmICJNdXN0IHN0YXJ0IHdpdGggYW4gZW1wdHkgcHJlb3JkZXIgd2Fsay4iKTsKKyAgICBhc3NlcnQoUHJlT3JkZXJXb3JrbGlzdC5lbXB0eSgpICYmCisgICAgICAgICAgICJNdXN0IHN0YXJ0IHdpdGggYW4gZW1wdHkgcHJlb3JkZXIgd2FsayB3b3JrbGlzdC4iKTsKKyAgICBQcmVPcmRlcldvcmtsaXN0LnB1c2hfYmFjayhSb290TCk7CisgICAgZG8geworICAgICAgTG9vcCAqTCA9IFByZU9yZGVyV29ya2xpc3QucG9wX2JhY2tfdmFsKCk7CisgICAgICBQcmVPcmRlcldvcmtsaXN0LmFwcGVuZChMLT5iZWdpbigpLCBMLT5lbmQoKSk7CisgICAgICBQcmVPcmRlckxvb3BzLnB1c2hfYmFjayhMKTsKKyAgICB9IHdoaWxlICghUHJlT3JkZXJXb3JrbGlzdC5lbXB0eSgpKTsKKworICAgIFdvcmtsaXN0Lmluc2VydChzdGQ6Om1vdmUoUHJlT3JkZXJMb29wcykpOworICAgIFByZU9yZGVyTG9vcHMuY2xlYXIoKTsKKyAgfQorfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9vcFBhc3NUPiBjbGFzcyBGdW5jdGlvblRvTG9vcFBhc3NBZGFwdG9yOworCisvLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIHVwZGF0aW5nIHRoZSBsb29wIHBhc3MgbWFuYWdlciBiYXNlZAorLy8vIG9uIG11dGF0aW9ucyB0byB0aGUgbG9vcCBuZXN0LgorLy8vCisvLy8gQSByZWZlcmVuY2UgdG8gYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gZWFjaAorLy8vIExvb3AgcGFzcywgYW5kIExvb3AgcGFzc2VzIHNob3VsZCB1c2UgaXQgdG8gdXBkYXRlIExQTSBpbmZyYXN0cnVjdHVyZSBpZgorLy8vIHRoZXkgbW9kaWZ5IHRoZSBsb29wIG5lc3Qgc3RydWN0dXJlLgorY2xhc3MgTFBNVXBkYXRlciB7CitwdWJsaWM6CisgIC8vLyBUaGlzIGNhbiBiZSBxdWVyaWVkIGJ5IGxvb3AgcGFzc2VzIHdoaWNoIHJ1biBvdGhlciBsb29wIHBhc3NlcyAobGlrZSBwYXNzCisgIC8vLyBtYW5hZ2VycykgdG8ga25vdyB3aGV0aGVyIHRoZSBsb29wIG5lZWRzIHRvIGJlIHNraXBwZWQgZHVlIHRvIHVwZGF0ZXMgdG8KKyAgLy8vIHRoZSBsb29wIG5lc3QuCisgIC8vLworICAvLy8gSWYgdGhpcyByZXR1cm5zIHRydWUsIHRoZSBsb29wIG9iamVjdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQsIHNvIHBhc3NlcworICAvLy8gc2hvdWxkIHRha2UgY2FyZSBub3QgdG8gdG91Y2ggdGhlIG9iamVjdC4KKyAgYm9vbCBza2lwQ3VycmVudExvb3AoKSBjb25zdCB7IHJldHVybiBTa2lwQ3VycmVudExvb3A7IH0KKworICAvLy8gTG9vcCBwYXNzZXMgc2hvdWxkIHVzZSB0aGlzIG1ldGhvZCB0byBpbmRpY2F0ZSB0aGV5IGhhdmUgZGVsZXRlZCBhIGxvb3AKKyAgLy8vIGZyb20gdGhlIG5lc3QuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgbG9vcCBtdXN0IGVpdGhlciBiZSB0aGUgY3VycmVudCBsb29wIG9yIGEgc3VibG9vcCBvZiB0aGUKKyAgLy8vIGN1cnJlbnQgbG9vcC4gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIHJlbW92aW5nIHRoZSBsb29wIGZyb20KKyAgLy8vIHRoZSBsb29wIG5lc3QuCisgIC8vLworICAvLy8gSWYgdGhpcyBpcyBjYWxsZWQgZm9yIHRoZSBjdXJyZW50IGxvb3AsIGluIGFkZGl0aW9uIHRvIGNsZWFyaW5nIGFueQorICAvLy8gc3RhdGUsIHRoaXMgcm91dGluZSB3aWxsIG1hcmsgdGhhdCB0aGUgY3VycmVudCBsb29wIHNob3VsZCBiZSBza2lwcGVkIGJ5CisgIC8vLyB0aGUgcmVzdCBvZiB0aGUgcGFzcyBtYW5hZ2VtZW50IGluZnJhc3RydWN0dXJlLgorICB2b2lkIG1hcmtMb29wQXNEZWxldGVkKExvb3AgJkwsIGxsdm06OlN0cmluZ1JlZiBOYW1lKSB7CisgICAgTEFNLmNsZWFyKEwsIE5hbWUpOworICAgIGFzc2VydCgoJkwgPT0gQ3VycmVudEwgfHwgQ3VycmVudEwtPmNvbnRhaW5zKCZMKSkgJiYKKyAgICAgICAgICAgIkNhbm5vdCBkZWxldGUgYSBsb29wIG91dHNpZGUgb2YgdGhlICIKKyAgICAgICAgICAgInN1Ymxvb3AgdHJlZSBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiIpOworICAgIGlmICgmTCA9PSBDdXJyZW50TCkKKyAgICAgIFNraXBDdXJyZW50TG9vcCA9IHRydWU7CisgIH0KKworICAvLy8gTG9vcCBwYXNzZXMgc2hvdWxkIHVzZSB0aGlzIG1ldGhvZCB0byBpbmRpY2F0ZSB0aGV5IGhhdmUgYWRkZWQgbmV3IGNoaWxkCisgIC8vLyBsb29wcyBvZiB0aGUgY3VycmVudCBsb29wLgorICAvLy8KKyAgLy8vIFxwIE5ld0NoaWxkTG9vcHMgbXVzdCBjb250YWluIG9ubHkgdGhlIGltbWVkaWF0ZSBjaGlsZHJlbi4gQW55IG5lc3RlZAorICAvLy8gbG9vcHMgd2l0aGluIHRoZW0gd2lsbCBiZSB2aXNpdGVkIGluIHBvc3RvcmRlciBhcyB1c3VhbCBmb3IgdGhlIGxvb3AgcGFzcworICAvLy8gbWFuYWdlci4KKyAgdm9pZCBhZGRDaGlsZExvb3BzKEFycmF5UmVmPExvb3AgKj4gTmV3Q2hpbGRMb29wcykgeworICAgIC8vIEluc2VydCBvdXJzZWx2ZXMgYmFjayBpbnRvIHRoZSB3b3JrbGlzdCBmaXJzdCwgYXMgdGhpcyBsb29wIHNob3VsZCBiZQorICAgIC8vIHJldmlzaXRlZCBhZnRlciBhbGwgdGhlIGNoaWxkcmVuIGhhdmUgYmVlbiBwcm9jZXNzZWQuCisgICAgV29ya2xpc3QuaW5zZXJ0KEN1cnJlbnRMKTsKKworI2lmbmRlZiBOREVCVUcKKyAgICBmb3IgKExvb3AgKk5ld0wgOiBOZXdDaGlsZExvb3BzKQorICAgICAgYXNzZXJ0KE5ld0wtPmdldFBhcmVudExvb3AoKSA9PSBDdXJyZW50TCAmJiAiQWxsIG9mIHRoZSBuZXcgbG9vcHMgbXVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGN1cnJlbnQgbG9vcCEiKTsKKyNlbmRpZgorCisgICAgaW50ZXJuYWw6OmFwcGVuZExvb3BzVG9Xb3JrbGlzdChOZXdDaGlsZExvb3BzLCBXb3JrbGlzdCk7CisKKyAgICAvLyBBbHNvIHNraXAgZnVydGhlciBwcm9jZXNzaW5nIG9mIHRoZSBjdXJyZW50IGxvb3AtLWl0IHdpbGwgYmUgcmV2aXNpdGVkCisgICAgLy8gYWZ0ZXIgYWxsIG9mIGl0cyBuZXdseSBhZGRlZCBjaGlsZHJlbiBhcmUgYWNjb3VudGVkIGZvci4KKyAgICBTa2lwQ3VycmVudExvb3AgPSB0cnVlOworICB9CisKKyAgLy8vIExvb3AgcGFzc2VzIHNob3VsZCB1c2UgdGhpcyBtZXRob2QgdG8gaW5kaWNhdGUgdGhleSBoYXZlIGFkZGVkIG5ldworICAvLy8gc2libGluZyBsb29wcyB0byB0aGUgY3VycmVudCBsb29wLgorICAvLy8KKyAgLy8vIFxwIE5ld1NpYkxvb3BzIG11c3Qgb25seSBjb250YWluIHRoZSBpbW1lZGlhdGUgc2libGluZyBsb29wcy4gQW55IG5lc3RlZAorICAvLy8gbG9vcHMgd2l0aGluIHRoZW0gd2lsbCBiZSB2aXNpdGVkIGluIHBvc3RvcmRlciBhcyB1c3VhbCBmb3IgdGhlIGxvb3AgcGFzcworICAvLy8gbWFuYWdlci4KKyAgdm9pZCBhZGRTaWJsaW5nTG9vcHMoQXJyYXlSZWY8TG9vcCAqPiBOZXdTaWJMb29wcykgeworI2lmbmRlZiBOREVCVUcKKyAgICBmb3IgKExvb3AgKk5ld0wgOiBOZXdTaWJMb29wcykKKyAgICAgIGFzc2VydChOZXdMLT5nZXRQYXJlbnRMb29wKCkgPT0gUGFyZW50TCAmJgorICAgICAgICAgICAgICJBbGwgb2YgdGhlIG5ldyBsb29wcyBtdXN0IGJlIHNpYmxpbmdzIG9mIHRoZSBjdXJyZW50IGxvb3AhIik7CisjZW5kaWYKKworICAgIGludGVybmFsOjphcHBlbmRMb29wc1RvV29ya2xpc3QoTmV3U2liTG9vcHMsIFdvcmtsaXN0KTsKKworICAgIC8vIE5vIG5lZWQgdG8gc2tpcCB0aGUgY3VycmVudCBsb29wIG9yIHJldmlzaXQgaXQsIGFzIHNpYmxpbmcgbG9vcHMKKyAgICAvLyBzaG91bGRuJ3QgaW1wYWN0IGFueXRoaW5nLgorICB9CisKKyAgLy8vIFJlc3RhcnQgdGhlIGN1cnJlbnQgbG9vcC4KKyAgLy8vCisgIC8vLyBMb29wIHBhc3NlcyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCB0byBpbmRpY2F0ZSB0aGUgY3VycmVudCBsb29wIGhhcyBiZWVuCisgIC8vLyBzdWZmaWNpZW50bHkgY2hhbmdlZCB0aGF0IGl0IHNob3VsZCBiZSByZS12aXNpdGVkIGZyb20gdGhlIGJlZ2luaW5nIG9mCisgIC8vLyB0aGUgbG9vcCBwYXNzIHBpcGVsaW5lIHJhdGhlciB0aGFuIGNvbnRpbnVpbmcuCisgIHZvaWQgcmV2aXNpdEN1cnJlbnRMb29wKCkgeworICAgIC8vIFRlbGwgdGhlIGN1cnJlbnRseSBpbi1mbGlnaHQgcGlwZWxpbmUgdG8gc3RvcCBydW5uaW5nLgorICAgIFNraXBDdXJyZW50TG9vcCA9IHRydWU7CisKKyAgICAvLyBBbmQgaW5zZXJ0IG91cnNlbHZlcyBiYWNrIGludG8gdGhlIHdvcmtsaXN0LgorICAgIFdvcmtsaXN0Lmluc2VydChDdXJyZW50TCk7CisgIH0KKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIExvb3BQYXNzVD4gZnJpZW5kIGNsYXNzIGxsdm06OkZ1bmN0aW9uVG9Mb29wUGFzc0FkYXB0b3I7CisKKyAgLy8vIFRoZSBcYyBGdW5jdGlvblRvTG9vcFBhc3NBZGFwdG9yJ3Mgd29ya2xpc3Qgb2YgbG9vcHMgdG8gcHJvY2Vzcy4KKyAgU21hbGxQcmlvcml0eVdvcmtsaXN0PExvb3AgKiwgND4gJldvcmtsaXN0OworCisgIC8vLyBUaGUgYW5hbHlzaXMgbWFuYWdlciBmb3IgdXNlIGluIHRoZSBjdXJyZW50IGxvb3AgbmVzdC4KKyAgTG9vcEFuYWx5c2lzTWFuYWdlciAmTEFNOworCisgIExvb3AgKkN1cnJlbnRMOworICBib29sIFNraXBDdXJyZW50TG9vcDsKKworI2lmbmRlZiBOREVCVUcKKyAgLy8gSW4gZGVidWcgYnVpbGRzIHdlIGFsc28gdHJhY2sgdGhlIHBhcmVudCBsb29wIHRvIGltcGxlbWVudCBhc3NlcnRzIGV2ZW4gaW4KKyAgLy8gdGhlIGZhY2Ugb2YgbG9vcCBkZWxldGlvbi4KKyAgTG9vcCAqUGFyZW50TDsKKyNlbmRpZgorCisgIExQTVVwZGF0ZXIoU21hbGxQcmlvcml0eVdvcmtsaXN0PExvb3AgKiwgND4gJldvcmtsaXN0LAorICAgICAgICAgICAgIExvb3BBbmFseXNpc01hbmFnZXIgJkxBTSkKKyAgICAgIDogV29ya2xpc3QoV29ya2xpc3QpLCBMQU0oTEFNKSB7fQorfTsKKworLy8vIFxicmllZiBBZGFwdG9yIHRoYXQgbWFwcyBmcm9tIGEgZnVuY3Rpb24gdG8gaXRzIGxvb3BzLgorLy8vCisvLy8gRGVzaWduZWQgdG8gYWxsb3cgY29tcG9zaXRpb24gb2YgYSBMb29wUGFzcyhNYW5hZ2VyKSBhbmQgYQorLy8vIEZ1bmN0aW9uUGFzc01hbmFnZXIuIE5vdGUgdGhhdCBpZiB0aGlzIHBhc3MgaXMgY29uc3RydWN0ZWQgd2l0aCBhIFxjCisvLy8gRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgaXQgd2lsbCBydW4gdGhlIFxjIExvb3BBbmFseXNpc01hbmFnZXJGdW5jdGlvblByb3h5CisvLy8gYW5hbHlzaXMgcHJpb3IgdG8gcnVubmluZyB0aGUgbG9vcCBwYXNzZXMgb3ZlciB0aGUgZnVuY3Rpb24gdG8gZW5hYmxlIGEgXGMKKy8vLyBMb29wQW5hbHlzaXNNYW5hZ2VyIHRvIGJlIHVzZWQgd2l0aGluIHRoaXMgcnVuIHNhZmVseS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBMb29wUGFzc1Q+CitjbGFzcyBGdW5jdGlvblRvTG9vcFBhc3NBZGFwdG9yCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxGdW5jdGlvblRvTG9vcFBhc3NBZGFwdG9yPExvb3BQYXNzVD4+IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRnVuY3Rpb25Ub0xvb3BQYXNzQWRhcHRvcihMb29wUGFzc1QgUGFzcywgYm9vbCBEZWJ1Z0xvZ2dpbmcgPSBmYWxzZSkKKyAgICAgIDogUGFzcyhzdGQ6Om1vdmUoUGFzcykpLCBMb29wQ2Fub25pY2FsaXphdGlvbkZQTShEZWJ1Z0xvZ2dpbmcpIHsKKyAgICBMb29wQ2Fub25pY2FsaXphdGlvbkZQTS5hZGRQYXNzKExvb3BTaW1wbGlmeVBhc3MoKSk7CisgICAgTG9vcENhbm9uaWNhbGl6YXRpb25GUE0uYWRkUGFzcyhMQ1NTQVBhc3MoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJ1bnMgdGhlIGxvb3AgcGFzc2VzIGFjcm9zcyBldmVyeSBsb29wIGluIHRoZSBmdW5jdGlvbi4KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pIHsKKyAgICAvLyBCZWZvcmUgd2UgZXZlbiBjb21wdXRlIGFueSBsb29wIGFuYWx5c2VzLCBmaXJzdCBydW4gYSBtaW5pYXR1cmUgZnVuY3Rpb24KKyAgICAvLyBwYXNzIHBpcGVsaW5lIHRvIHB1dCBsb29wcyBpbnRvIHRoZWlyIGNhbm9uaWNhbCBmb3JtLiBOb3RlIHRoYXQgd2UgY2FuCisgICAgLy8gZGlyZWN0bHkgYnVpbGQgdXAgZnVuY3Rpb24gYW5hbHlzZXMgYWZ0ZXIgdGhpcyBhcyB0aGUgZnVuY3Rpb24gcGFzcworICAgIC8vIG1hbmFnZXIgaGFuZGxlcyBhbGwgdGhlIGludmFsaWRhdGlvbiBhdCB0aGF0IGxheWVyLgorICAgIFByZXNlcnZlZEFuYWx5c2VzIFBBID0gTG9vcENhbm9uaWNhbGl6YXRpb25GUE0ucnVuKEYsIEFNKTsKKworICAgIC8vIEdldCB0aGUgbG9vcCBzdHJ1Y3R1cmUgZm9yIHRoaXMgZnVuY3Rpb24KKyAgICBMb29wSW5mbyAmTEkgPSBBTS5nZXRSZXN1bHQ8TG9vcEFuYWx5c2lzPihGKTsKKworICAgIC8vIElmIHRoZXJlIGFyZSBubyBsb29wcywgdGhlcmUgaXMgbm90aGluZyB0byBkbyBoZXJlLgorICAgIGlmIChMSS5lbXB0eSgpKQorICAgICAgcmV0dXJuIFBBOworCisgICAgLy8gR2V0IHRoZSBhbmFseXNpcyByZXN1bHRzIG5lZWRlZCBieSBsb29wIHBhc3Nlcy4KKyAgICBNZW1vcnlTU0EgKk1TU0EgPSBFbmFibGVNU1NBTG9vcERlcGVuZGVuY3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoJkFNLmdldFJlc3VsdDxNZW1vcnlTU0FBbmFseXNpcz4oRikuZ2V0TVNTQSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgICAgTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzIExBUiA9IHtBTS5nZXRSZXN1bHQ8QUFNYW5hZ2VyPihGKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNLmdldFJlc3VsdDxBc3N1bXB0aW9uQW5hbHlzaXM+KEYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU0uZ2V0UmVzdWx0PERvbWluYXRvclRyZWVBbmFseXNpcz4oRiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTS5nZXRSZXN1bHQ8TG9vcEFuYWx5c2lzPihGKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNLmdldFJlc3VsdDxTY2FsYXJFdm9sdXRpb25BbmFseXNpcz4oRiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTS5nZXRSZXN1bHQ8VGFyZ2V0TGlicmFyeUFuYWx5c2lzPihGKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNLmdldFJlc3VsdDxUYXJnZXRJUkFuYWx5c2lzPihGKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TU0F9OworCisgICAgLy8gU2V0dXAgdGhlIGxvb3AgYW5hbHlzaXMgbWFuYWdlciBmcm9tIGl0cyBwcm94eS4gSXQgaXMgaW1wb3J0YW50IHRoYXQKKyAgICAvLyB0aGlzIGlzIG9ubHkgZG9uZSB3aGVuIHRoZXJlIGFyZSBsb29wcyB0byBwcm9jZXNzIGFuZCB3ZSBoYXZlIGJ1aWx0IHRoZQorICAgIC8vIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyBvYmplY3QuIFRoZSBsb29wIGFuYWx5c2VzIGNhY2hlZCBpbiB0aGlzCisgICAgLy8gbWFuYWdlciBoYXZlIGFjY2VzcyB0byB0aG9zZSBhbmFseXNpcyByZXN1bHRzIGFuZCBzbyBpdCBtdXN0IGludmFsaWRhdGUKKyAgICAvLyBpdHNlbGYgd2hlbiB0aGV5IGdvIGF3YXkuCisgICAgTG9vcEFuYWx5c2lzTWFuYWdlciAmTEFNID0KKyAgICAgICAgQU0uZ2V0UmVzdWx0PExvb3BBbmFseXNpc01hbmFnZXJGdW5jdGlvblByb3h5PihGKS5nZXRNYW5hZ2VyKCk7CisKKyAgICAvLyBBIHBvc3RvcmRlciB3b3JrbGlzdCBvZiBsb29wcyB0byBwcm9jZXNzLgorICAgIFNtYWxsUHJpb3JpdHlXb3JrbGlzdDxMb29wICosIDQ+IFdvcmtsaXN0OworCisgICAgLy8gUmVnaXN0ZXIgdGhlIHdvcmtsaXN0IGFuZCBsb29wIGFuYWx5c2lzIG1hbmFnZXIgc28gdGhhdCBsb29wIHBhc3NlcyBjYW4KKyAgICAvLyB1cGRhdGUgdGhlbSB3aGVuIHRoZXkgbXV0YXRlIHRoZSBsb29wIG5lc3Qgc3RydWN0dXJlLgorICAgIExQTVVwZGF0ZXIgVXBkYXRlcihXb3JrbGlzdCwgTEFNKTsKKworICAgIC8vIEFkZCB0aGUgbG9vcCBuZXN0cyBpbiB0aGUgcmV2ZXJzZSBvcmRlciBvZiBMb29wSW5mby4gRm9yIHNvbWUgcmVhc29uLAorICAgIC8vIHRoZXkgYXJlIHN0b3JlZCBpbiBSUE8gdy5yLnQuIHRoZSBjb250cm9sIGZsb3cgZ3JhcGggaW4gTG9vcEluZm8uIEZvcgorICAgIC8vIHRoZSBwdXJwb3NlIG9mIHVucm9sbGluZywgbG9vcCBkZWxldGlvbiwgYW5kIExJQ00sIHdlIGxhcmdlbHkgd2FudCB0bworICAgIC8vIHdvcmsgZm9yd2FyZCBhY3Jvc3MgdGhlIENGRyBzbyB0aGF0IHdlIHZpc2l0IGRlZnMgYmVmb3JlIHVzZXMgYW5kIGNhbgorICAgIC8vIHByb3BhZ2F0ZSBzaW1wbGlmaWNhdGlvbnMgZnJvbSBvbmUgbG9vcCBuZXN0IGludG8gdGhlIG5leHQuCisgICAgLy8gRklYTUU6IENvbnNpZGVyIGNoYW5naW5nIHRoZSBvcmRlciBpbiBMb29wSW5mby4KKyAgICBpbnRlcm5hbDo6YXBwZW5kTG9vcHNUb1dvcmtsaXN0KHJldmVyc2UoTEkpLCBXb3JrbGlzdCk7CisKKyAgICBkbyB7CisgICAgICBMb29wICpMID0gV29ya2xpc3QucG9wX2JhY2tfdmFsKCk7CisKKyAgICAgIC8vIFJlc2V0IHRoZSB1cGRhdGUgc3RydWN0dXJlIGZvciB0aGlzIGxvb3AuCisgICAgICBVcGRhdGVyLkN1cnJlbnRMID0gTDsKKyAgICAgIFVwZGF0ZXIuU2tpcEN1cnJlbnRMb29wID0gZmFsc2U7CisKKyNpZm5kZWYgTkRFQlVHCisgICAgICAvLyBTYXZlIGEgcGFyZW50IGxvb3AgcG9pbnRlciBmb3IgYXNzZXJ0cy4KKyAgICAgIFVwZGF0ZXIuUGFyZW50TCA9IEwtPmdldFBhcmVudExvb3AoKTsKKworICAgICAgLy8gVmVyaWZ5IHRoZSBsb29wIHN0cnVjdHVyZSBhbmQgTENTU0EgZm9ybSBiZWZvcmUgdmlzaXRpbmcgdGhlIGxvb3AuCisgICAgICBMLT52ZXJpZnlMb29wKCk7CisgICAgICBhc3NlcnQoTC0+aXNSZWN1cnNpdmVseUxDU1NBRm9ybShMQVIuRFQsIExJKSAmJgorICAgICAgICAgICAgICJMb29wcyBtdXN0IHJlbWFpbiBpbiBMQ1NTQSBmb3JtISIpOworI2VuZGlmCisKKyAgICAgIFByZXNlcnZlZEFuYWx5c2VzIFBhc3NQQSA9IFBhc3MucnVuKCpMLCBMQU0sIExBUiwgVXBkYXRlcik7CisgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHZlcmlmeSB0aGUgc2V0IG9mIGFuYWx5c2VzIHJlbGV2YW50IHRvIExvb3AgcGFzc2VzCisgICAgICAvLyBhcmUgcHJlc2VydmVkLgorCisgICAgICAvLyBJZiB0aGUgbG9vcCBoYXNuJ3QgYmVlbiBkZWxldGVkLCB3ZSBuZWVkIHRvIGhhbmRsZSBpbnZhbGlkYXRpb24gaGVyZS4KKyAgICAgIGlmICghVXBkYXRlci5za2lwQ3VycmVudExvb3AoKSkKKyAgICAgICAgLy8gV2Uga25vdyB0aGF0IHRoZSBsb29wIHBhc3MgY291bGRuJ3QgaGF2ZSBpbnZhbGlkYXRlZCBhbnkgb3RoZXIKKyAgICAgICAgLy8gbG9vcCdzIGFuYWx5c2VzICh0aGF0J3MgdGhlIGNvbnRyYWN0IG9mIGEgbG9vcCBwYXNzKSwgc28gZGlyZWN0bHkKKyAgICAgICAgLy8gaGFuZGxlIHRoZSBsb29wIGFuYWx5c2lzIG1hbmFnZXIncyBpbnZhbGlkYXRpb24gaGVyZS4KKyAgICAgICAgTEFNLmludmFsaWRhdGUoKkwsIFBhc3NQQSk7CisKKyAgICAgIC8vIFRoZW4gaW50ZXJzZWN0IHRoZSBwcmVzZXJ2ZWQgc2V0IHNvIHRoYXQgaW52YWxpZGF0aW9uIG9mIG1vZHVsZQorICAgICAgLy8gYW5hbHlzZXMgd2lsbCBldmVudHVhbGx5IG9jY3VyIHdoZW4gdGhlIG1vZHVsZSBwYXNzIGNvbXBsZXRlcy4KKyAgICAgIFBBLmludGVyc2VjdChzdGQ6Om1vdmUoUGFzc1BBKSk7CisgICAgfSB3aGlsZSAoIVdvcmtsaXN0LmVtcHR5KCkpOworCisgICAgLy8gQnkgZGVmaW5pdGlvbiB3ZSBwcmVzZXJ2ZSB0aGUgcHJveHkuIFdlIGFsc28gcHJlc2VydmUgYWxsIGFuYWx5c2VzIG9uCisgICAgLy8gTG9vcHMuIFRoaXMgcHJlY2x1ZGVzICphbnkqIGludmFsaWRhdGlvbiBvZiBsb29wIGFuYWx5c2VzIGJ5IHRoZSBwcm94eSwKKyAgICAvLyBidXQgdGhhdCdzIE9LIGJlY2F1c2Ugd2UndmUgdGFrZW4gY2FyZSB0byBpbnZhbGlkYXRlIGFuYWx5c2VzIGluIHRoZQorICAgIC8vIGxvb3AgYW5hbHlzaXMgbWFuYWdlciBpbmNyZW1lbnRhbGx5IGFib3ZlLgorICAgIFBBLnByZXNlcnZlU2V0PEFsbEFuYWx5c2VzT248TG9vcD4+KCk7CisgICAgUEEucHJlc2VydmU8TG9vcEFuYWx5c2lzTWFuYWdlckZ1bmN0aW9uUHJveHk+KCk7CisgICAgLy8gV2UgYWxzbyBwcmVzZXJ2ZSB0aGUgc2V0IG9mIHN0YW5kYXJkIGFuYWx5c2VzLgorICAgIFBBLnByZXNlcnZlPERvbWluYXRvclRyZWVBbmFseXNpcz4oKTsKKyAgICBQQS5wcmVzZXJ2ZTxMb29wQW5hbHlzaXM+KCk7CisgICAgUEEucHJlc2VydmU8U2NhbGFyRXZvbHV0aW9uQW5hbHlzaXM+KCk7CisgICAgLy8gRklYTUU6IFVuY29tbWVudCB0aGlzIHdoZW4gYWxsIGxvb3AgcGFzc2VzIHByZXNlcnZlIE1lbW9yeVNTQQorICAgIC8vIFBBLnByZXNlcnZlPE1lbW9yeVNTQUFuYWx5c2lzPigpOworICAgIC8vIEZJWE1FOiBXaGF0IHdlIHJlYWxseSB3YW50IHRvIGRvIGhlcmUgaXMgcHJlc2VydmUgYW4gQUEgY2F0ZWdvcnksIGJ1dAorICAgIC8vIHRoYXQgY29uY2VwdCBkb2Vzbid0IGV4aXN0IHlldC4KKyAgICBQQS5wcmVzZXJ2ZTxBQU1hbmFnZXI+KCk7CisgICAgUEEucHJlc2VydmU8QmFzaWNBQT4oKTsKKyAgICBQQS5wcmVzZXJ2ZTxHbG9iYWxzQUE+KCk7CisgICAgUEEucHJlc2VydmU8U0NFVkFBPigpOworICAgIHJldHVybiBQQTsKKyAgfQorCitwcml2YXRlOgorICBMb29wUGFzc1QgUGFzczsKKworICBGdW5jdGlvblBhc3NNYW5hZ2VyIExvb3BDYW5vbmljYWxpemF0aW9uRlBNOworfTsKKworLy8vIFxicmllZiBBIGZ1bmN0aW9uIHRvIGRlZHVjZSBhIGxvb3AgcGFzcyB0eXBlIGFuZCB3cmFwIGl0IGluIHRoZSB0ZW1wbGF0ZWQKKy8vLyBhZGFwdG9yLgordGVtcGxhdGUgPHR5cGVuYW1lIExvb3BQYXNzVD4KK0Z1bmN0aW9uVG9Mb29wUGFzc0FkYXB0b3I8TG9vcFBhc3NUPgorY3JlYXRlRnVuY3Rpb25Ub0xvb3BQYXNzQWRhcHRvcihMb29wUGFzc1QgUGFzcywgYm9vbCBEZWJ1Z0xvZ2dpbmcgPSBmYWxzZSkgeworICByZXR1cm4gRnVuY3Rpb25Ub0xvb3BQYXNzQWRhcHRvcjxMb29wUGFzc1Q+KHN0ZDo6bW92ZShQYXNzKSwgRGVidWdMb2dnaW5nKTsKK30KKworLy8vIFxicmllZiBQYXNzIGZvciBwcmludGluZyBhIGxvb3AncyBjb250ZW50cyBhcyB0ZXh0dWFsIElSLgorY2xhc3MgUHJpbnRMb29wUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPFByaW50TG9vcFBhc3M+IHsKKyAgcmF3X29zdHJlYW0gJk9TOworICBzdGQ6OnN0cmluZyBCYW5uZXI7CisKK3B1YmxpYzoKKyAgUHJpbnRMb29wUGFzcygpOworICBQcmludExvb3BQYXNzKHJhd19vc3RyZWFtICZPUywgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lciA9ICIiKTsKKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTG9vcCAmTCwgTG9vcEFuYWx5c2lzTWFuYWdlciAmLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzICYsIExQTVVwZGF0ZXIgJik7Cit9OworfQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QUEFTU01BTkFHRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wUHJlZGljYXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFByZWRpY2F0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTczOThiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFByZWRpY2F0aW9uLmgKQEAgLTAsMCArMSwzMiBAQAorLy89PT0tIExvb3BQcmVkaWNhdGlvbi5oIC0gR3VhcmQgYmFzZWQgbG9vcCBwcmVkaWNhdGlvbiBwYXNzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgdHJpZXMgdG8gY29udmVydCBsb29wIHZhcmlhbnQgcmFuZ2UgY2hlY2tzIHRvIGxvb3AgaW52YXJpYW50IGJ5CisvLyB3aWRlbmluZyBjaGVja3MgYWNyb3NzIGxvb3AgaXRlcmF0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUFBSRURJQ0FUSU9OX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QUFJFRElDQVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BQYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBQZXJmb3JtcyBMb29wIFByZWRpY2F0aW9uIFBhc3MuCitjbGFzcyBMb29wUHJlZGljYXRpb25QYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48TG9vcFByZWRpY2F0aW9uUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTG9vcCAmTCwgTG9vcEFuYWx5c2lzTWFuYWdlciAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJkFSLCBMUE1VcGRhdGVyICZVKTsKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QUFJFRElDQVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wUm90YXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFJvdGF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4ZDU2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFJvdGF0aW9uLmgKQEAgLTAsMCArMSwzNSBAQAorLy89PT0tIExvb3BSb3RhdGlvbi5oIC0gTG9vcCBSb3RhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBmb3IgdGhlIExvb3AgUm90YXRpb24gcGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUFJPVEFUSU9OX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QUk9UQVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BQYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBIHNpbXBsZSBsb29wIHJvdGF0aW9uIHRyYW5zZm9ybWF0aW9uLgorY2xhc3MgTG9vcFJvdGF0ZVBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMb29wUm90YXRlUGFzcz4geworcHVibGljOgorICBMb29wUm90YXRlUGFzcyhib29sIEVuYWJsZUhlYWRlckR1cGxpY2F0aW9uID0gdHJ1ZSk7CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMb29wICZMLCBMb29wQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmQVIsIExQTVVwZGF0ZXIgJlUpOworCitwcml2YXRlOgorICBjb25zdCBib29sIEVuYWJsZUhlYWRlckR1cGxpY2F0aW9uOworfTsKK30KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUFJPVEFUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFNpbXBsaWZ5Q0ZHLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BTaW1wbGlmeUNGRy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MjhjNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BTaW1wbGlmeUNGRy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vPT09LSBMb29wU2ltcGxpZnlDRkcuY3BwIC0gTG9vcCBDRkcgU2ltcGxpZmljYXRpb24gUGFzcyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIExvb3AgU2ltcGxpZnlDRkcgUGFzcy4gVGhpcyBwYXNzIGlzIHJlc3BvbnNpYmxlIGZvcgorLy8gYmFzaWMgbG9vcCBDRkcgY2xlYW51cCwgcHJpbWFyaWx5IHRvIGFzc2lzdCBvdGhlciBsb29wIHBhc3Nlcy4gSWYgeW91CisvLyBlbmNvdW50ZXIgYSBub25jYW5vbmljYWwgQ0ZHIGNvbnN0cnVjdCB0aGF0IGNhdXNlcyBhbm90aGVyIGxvb3AgcGFzcyB0bworLy8gcGVyZm9ybSBzdWJvcHRpbWFsbHksIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGZpeCBpdCB1cC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUFNJTVBMSUZZQ0ZHX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QU0lNUExJRllDRkdfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BQYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBQZXJmb3JtcyBiYXNpYyBDRkcgc2ltcGxpZmljYXRpb25zIHRvIGFzc2lzdCBvdGhlciBsb29wIHBhc3Nlcy4KK2NsYXNzIExvb3BTaW1wbGlmeUNGR1Bhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMb29wU2ltcGxpZnlDRkdQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMb29wICZMLCBMb29wQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmQVIsIExQTVVwZGF0ZXIgJlUpOworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BTSU1QTElGWUNGR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BTaW5rLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BTaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcxYTdjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFNpbmsuaApAQCAtMCwwICsxLDQwIEBACisvLz09PS0gTG9vcFNpbmsuaCAtIExvb3AgU2luayBQYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgTG9vcCBTaW5rIHBhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BTSU5LX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QU0lOS19ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFBhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEEgcGFzcyB0aGF0IGRvZXMgcHJvZmlsZS1ndWlkZWQgc2lua2luZyBvZiBpbnN0cnVjdGlvbnMgaW50byBsb29wcy4KKy8vLworLy8vIFRoaXMgaXMgYSBmdW5jdGlvbiBwYXNzIGFzIGl0IHNob3VsZG4ndCBiZSBjb21wb3NlZCBpbnRvIGFueSBraW5kIG9mCisvLy8gdW5pZmllZCBsb29wIHBhc3MgcGlwZWxpbmUuIFRoZSBnb2FsIG9mIGl0IGlzIHRvIHNpbmsgY29kZSBpbnRvIGxvb3BzIHRoYXQKKy8vLyBpcyBsb29wIGludmFyaWFudCBidXQgb25seSByZXF1aXJlZCB3aXRoaW4gdGhlIGxvb3AgYm9keSB3aGVuIGRvaW5nIHNvCisvLy8gcmVkdWNlcyB0aGUgZ2xvYmFsIGV4cGVjdGVkIGR5bmFtaWMgZnJlcXVlbmN5IHdpdGggd2hpY2ggaXQgZXhlY3V0ZXMuCisvLy8gQSBjbGFzc2ljIGV4YW1wbGUgaXMgYW4gZXh0cmVtZWx5IGNvbGQgYnJhbmNoIHdpdGhpbiBhIGxvb3AgYm9keS4KKy8vLworLy8vIFdlIGRvIHRoaXMgYXMgYSBzZXBhcmF0ZSBwYXNzIHNvIHRoYXQgZHVyaW5nIG5vcm1hbCBvcHRpbWl6YXRpb24gYWxsCisvLy8gaW52YXJpYW50IG9wZXJhdGlvbnMgY2FuIGJlIGhlbGQgb3V0c2lkZSB0aGUgbG9vcCBib2R5IHRvIHNpbXBsaWZ5CisvLy8gZnVuZGFtZW50YWwgYW5hbHlzZXMgYW5kIHRyYW5zZm9ybXMgb2YgdGhlIGxvb3AuCitjbGFzcyBMb29wU2lua1Bhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMb29wU2lua1Bhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmRkFNKTsKK307Cit9CisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BTSU5LX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFN0cmVuZ3RoUmVkdWNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BTdHJlbmd0aFJlZHVjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYzAzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BTdHJlbmd0aFJlZHVjZS5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vPT09LSBMb29wU3RyZW5ndGhSZWR1Y2UuaCAtIExvb3AgU3RyZW5ndGggUmVkdWNlIFBhc3MgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyB0cmFuc2Zvcm1hdGlvbiBhbmFseXplcyBhbmQgdHJhbnNmb3JtcyB0aGUgaW5kdWN0aW9uIHZhcmlhYmxlcyAoYW5kCisvLyBjb21wdXRhdGlvbnMgZGVyaXZlZCBmcm9tIHRoZW0pIGludG8gZm9ybXMgc3VpdGFibGUgZm9yIGVmZmljaWVudCBleGVjdXRpb24KKy8vIG9uIHRoZSB0YXJnZXQuCisvLworLy8gVGhpcyBwYXNzIHBlcmZvcm1zIGEgc3RyZW5ndGggcmVkdWN0aW9uIG9uIGFycmF5IHJlZmVyZW5jZXMgaW5zaWRlIGxvb3BzIHRoYXQKKy8vIGhhdmUgYXMgb25lIG9yIG1vcmUgb2YgdGhlaXIgY29tcG9uZW50cyB0aGUgbG9vcCBpbmR1Y3Rpb24gdmFyaWFibGUsIGl0CisvLyByZXdyaXRlcyBleHByZXNzaW9ucyB0byB0YWtlIGFkdmFudGFnZSBvZiBzY2FsZWQtaW5kZXggYWRkcmVzc2luZyBtb2RlcworLy8gYXZhaWxhYmxlIG9uIHRoZSB0YXJnZXQsIGFuZCBpdCBwZXJmb3JtcyBhIHZhcmlldHkgb2Ygb3RoZXIgb3B0aW1pemF0aW9ucworLy8gcmVsYXRlZCB0byBsb29wIGluZHVjdGlvbiB2YXJpYWJsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BTVFJFTkdUSFJFRFVDRV9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUFNUUkVOR1RIUkVEVUNFX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcEFuYWx5c2lzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMb29wOworY2xhc3MgTFBNVXBkYXRlcjsKKworLy8vIFBlcmZvcm1zIExvb3AgU3RyZW5ndGggUmVkdWNlIFBhc3MuCitjbGFzcyBMb29wU3RyZW5ndGhSZWR1Y2VQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48TG9vcFN0cmVuZ3RoUmVkdWNlUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTG9vcCAmTCwgTG9vcEFuYWx5c2lzTWFuYWdlciAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJkFSLCBMUE1VcGRhdGVyICZVKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BTVFJFTkdUSFJFRFVDRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BVbnJvbGxQYXNzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BVbnJvbGxQYXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg0OGUwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFVucm9sbFBhc3MuaApAQCAtMCwwICsxLDQ5IEBACisvLz09PS0gTG9vcFVucm9sbFBhc3MuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUFVOUk9MTFBBU1NfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BVTlJPTExQQVNTX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcEFuYWx5c2lzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIExvb3A7CitjbGFzcyBMUE1VcGRhdGVyOworCisvLy8gTG9vcCB1bnJvbGwgcGFzcyB0aGF0IG9ubHkgZG9lcyBmdWxsIGxvb3AgdW5yb2xsaW5nLgorY2xhc3MgTG9vcEZ1bGxVbnJvbGxQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48TG9vcEZ1bGxVbnJvbGxQYXNzPiB7CisgIGNvbnN0IGludCBPcHRMZXZlbDsKKworcHVibGljOgorICBleHBsaWNpdCBMb29wRnVsbFVucm9sbFBhc3MoaW50IE9wdExldmVsID0gMikgOiBPcHRMZXZlbChPcHRMZXZlbCkge30KKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTG9vcCAmTCwgTG9vcEFuYWx5c2lzTWFuYWdlciAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJkFSLCBMUE1VcGRhdGVyICZVKTsKK307CisKKy8vLyBMb29wIHVucm9sbCBwYXNzIHRoYXQgd2lsbCBzdXBwb3J0IGJvdGggZnVsbCBhbmQgcGFydGlhbCB1bnJvbGxpbmcuCisvLy8gSXQgaXMgYSBmdW5jdGlvbiBwYXNzIHRvIGhhdmUgYWNjZXNzIHRvIGZ1bmN0aW9uIGFuZCBtb2R1bGUgYW5hbHlzZXMuCisvLy8gSXQgd2lsbCBhbHNvIHB1dCBsb29wcyBpbnRvIGNhbm9uaWNhbCBmb3JtIChzaW1wbGlmaWVkIGFuZCBMQ1NTQSkuCitjbGFzcyBMb29wVW5yb2xsUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPExvb3BVbnJvbGxQYXNzPiB7CisgIGNvbnN0IGludCBPcHRMZXZlbDsKKworcHVibGljOgorICAvLy8gVGhpcyB1c2VzIHRoZSB0YXJnZXQgaW5mb3JtYXRpb24gKG9yIGZsYWdzKSB0byBjb250cm9sIHRoZSB0aHJlc2hvbGRzIGZvcgorICAvLy8gZGlmZmVyZW50IHVucm9sbGluZyBzdGF0ZWdpZXMgYnV0IHN1cHBvcnRzIGFsbCBvZiB0aGVtLgorICBleHBsaWNpdCBMb29wVW5yb2xsUGFzcyhpbnQgT3B0TGV2ZWwgPSAyKSA6IE9wdExldmVsKE9wdExldmVsKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BVTlJPTExQQVNTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG93ZXJBdG9taWMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG93ZXJBdG9taWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGEyZTdhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb3dlckF0b21pYy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vPT09LSBMb3dlckF0b21pYy5jcHAgLSBMb3dlciBhdG9taWMgaW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vIFRoaXMgcGFzcyBsb3dlcnMgYXRvbWljIGludHJpbnNpY3MgdG8gbm9uLWF0b21pYyBmb3JtIGZvciB1c2UgaW4gYSBrbm93bgorLy8gbm9uLXByZWVtcHRpYmxlIGVudmlyb25tZW50LgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9XRVJBVE9NSUNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPV0VSQVRPTUlDX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQSBwYXNzIHRoYXQgbG93ZXJzIGF0b21pYyBpbnRyaW5zaWMgaW50byBub24tYXRvbWljIGludHJpbnNpY3MuCitjbGFzcyBMb3dlckF0b21pY1Bhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMb3dlckF0b21pY1Bhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmKTsKK307Cit9CisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPV0VSQVRPTUlDX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG93ZXJFeHBlY3RJbnRyaW5zaWMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG93ZXJFeHBlY3RJbnRyaW5zaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjlkZWMwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb3dlckV4cGVjdEludHJpbnNpYy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vPT09LSBMb3dlckV4cGVjdEludHJpbnNpYy5oIC0gTG93ZXJFeHBlY3RJbnRyaW5zaWMgcGFzcyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLworLy8vIFRoZSBoZWFkZXIgZmlsZSBmb3IgdGhlIExvd2VyRXhwZWN0SW50cmluc2ljIHBhc3MgYXMgdXNlZCBieSB0aGUgbmV3IHBhc3MKKy8vLyBtYW5hZ2VyLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9XRVJFWFBFQ1RJTlRSSU5TSUNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPV0VSRVhQRUNUSU5UUklOU0lDX0gKKworI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworc3RydWN0IExvd2VyRXhwZWN0SW50cmluc2ljUGFzcyA6IFBhc3NJbmZvTWl4aW48TG93ZXJFeHBlY3RJbnRyaW5zaWNQYXNzPiB7CisgIC8vLyBcYnJpZWYgUnVuIHRoZSBwYXNzIG92ZXIgdGhlIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgd2lsbCBsb3dlciBhbGwgb2YgdGhlIGV4cGVjdCBpbnRyaW5zaWMgY2FsbHMgaW4gdGhpcyBmdW5jdGlvbiBpbnRvCisgIC8vLyBicmFuY2ggd2VpZ2h0IG1ldGFkYXRhLiBUaGF0IG1ldGFkYXRhIHdpbGwgc3Vic2VxdWVudGx5IGZlZWQgdGhlIGFuYWx5c2lzCisgIC8vLyBvZiB0aGUgcHJvYmFiaWxpdGllcyBhbmQgZnJlcXVlbmNpZXMgb2YgdGhlIENGRy4gQWZ0ZXIgcnVubmluZyB0aGlzIHBhc3MsCisgIC8vLyBubyBtb3JlIGV4cGVjdCBpbnRyaW5zaWNzIHJlbWFpbiwgYWxsb3dpbmcgdGhlIHJlc3Qgb2YgdGhlIG9wdGltaXplciB0bworICAvLy8gaWdub3JlIHRoZW0uCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJik7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb3dlckd1YXJkSW50cmluc2ljLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvd2VyR3VhcmRJbnRyaW5zaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWYxOWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb3dlckd1YXJkSW50cmluc2ljLmgKQEAgLTAsMCArMSwyOCBAQAorLy89PT0tLS0gTG93ZXJHdWFyZEludHJpbnNpYy5oIC0gTG93ZXIgdGhlIGd1YXJkIGludHJpbnNpYyAtLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBsb3dlcnMgdGhlIGxsdm0uZXhwZXJpbWVudGFsLmd1YXJkIGludHJpbnNpYyB0byBhIGNvbmRpdGlvbmFsIGNhbGwKKy8vIHRvIEBsbHZtLmV4cGVyaW1lbnRhbC5kZW9wdGltaXplLiAgT25jZSB0aGlzIGhhcHBlbnMsIHRoZSBndWFyZCBjYW4gbm8gbG9uZ2VyCisvLyBiZSB3aWRlbmVkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9XRVJHVUFSRElOVFJJTlNJQ19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9XRVJHVUFSRElOVFJJTlNJQ19ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworc3RydWN0IExvd2VyR3VhcmRJbnRyaW5zaWNQYXNzIDogUGFzc0luZm9NaXhpbjxMb3dlckd1YXJkSW50cmluc2ljUGFzcz4geworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9CisKKyNlbmRpZiAvL0xMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9XRVJHVUFSRElOVFJJTlNJQ19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL01lbUNweU9wdGltaXplci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9NZW1DcHlPcHRpbWl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDZjODA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9NZW1DcHlPcHRpbWl6ZXIuaApAQCAtMCwwICsxLDc5IEBACisvLz09PS0gTWVtQ3B5T3B0aW1pemVyLmggLSBtZW1jcHkgb3B0aW1pemF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBwZXJmb3JtcyB2YXJpb3VzIHRyYW5zZm9ybWF0aW9ucyByZWxhdGVkIHRvIGVsaW1pbmF0aW5nIG1lbWNweQorLy8gY2FsbHMsIG9yIHRyYW5zZm9ybWluZyBzZXRzIG9mIHN0b3JlcyBpbnRvIG1lbXNldCdzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9NRU1DUFlPUFRJTUlaRVJfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX01FTUNQWU9QVElNSVpFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc3N1bXB0aW9uQ2FjaGU7CitjbGFzcyBDYWxsSW5zdDsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTWVtQ3B5SW5zdDsKK2NsYXNzIE1lbU1vdmVJbnN0OworY2xhc3MgTWVtb3J5RGVwZW5kZW5jZVJlc3VsdHM7CitjbGFzcyBNZW1TZXRJbnN0OworY2xhc3MgU3RvcmVJbnN0OworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CitjbGFzcyBWYWx1ZTsKKworY2xhc3MgTWVtQ3B5T3B0UGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPE1lbUNweU9wdFBhc3M+IHsKKyAgTWVtb3J5RGVwZW5kZW5jZVJlc3VsdHMgKk1EID0gbnVsbHB0cjsKKyAgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSA9IG51bGxwdHI7CisgIHN0ZDo6ZnVuY3Rpb248QWxpYXNBbmFseXNpcyAmKCk+IExvb2t1cEFsaWFzQW5hbHlzaXM7CisgIHN0ZDo6ZnVuY3Rpb248QXNzdW1wdGlvbkNhY2hlICYoKT4gTG9va3VwQXNzdW1wdGlvbkNhY2hlOworICBzdGQ6OmZ1bmN0aW9uPERvbWluYXRvclRyZWUgJigpPiBMb29rdXBEb21UcmVlOworCitwdWJsaWM6CisgIE1lbUNweU9wdFBhc3MoKSA9IGRlZmF1bHQ7CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworCisgIC8vIEdsdWUgZm9yIHRoZSBvbGQgUE0uCisgIGJvb2wgcnVuSW1wbChGdW5jdGlvbiAmRiwgTWVtb3J5RGVwZW5kZW5jZVJlc3VsdHMgKk1EXywKKyAgICAgICAgICAgICAgIFRhcmdldExpYnJhcnlJbmZvICpUTElfLAorICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxBbGlhc0FuYWx5c2lzICYoKT4gTG9va3VwQWxpYXNBbmFseXNpc18sCisgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPEFzc3VtcHRpb25DYWNoZSAmKCk+IExvb2t1cEFzc3VtcHRpb25DYWNoZV8sCisgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPERvbWluYXRvclRyZWUgJigpPiBMb29rdXBEb21UcmVlXyk7CisKK3ByaXZhdGU6CisgIC8vIEhlbHBlciBmdW5jdGlvbnMKKyAgYm9vbCBwcm9jZXNzU3RvcmUoU3RvcmVJbnN0ICpTSSwgQmFzaWNCbG9jazo6aXRlcmF0b3IgJkJCSSk7CisgIGJvb2wgcHJvY2Vzc01lbVNldChNZW1TZXRJbnN0ICpTSSwgQmFzaWNCbG9jazo6aXRlcmF0b3IgJkJCSSk7CisgIGJvb2wgcHJvY2Vzc01lbUNweShNZW1DcHlJbnN0ICpNKTsKKyAgYm9vbCBwcm9jZXNzTWVtTW92ZShNZW1Nb3ZlSW5zdCAqTSk7CisgIGJvb2wgcGVyZm9ybUNhbGxTbG90T3B0em4oSW5zdHJ1Y3Rpb24gKmNweSwgVmFsdWUgKmNweURzdCwgVmFsdWUgKmNweVNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjcHlMZW4sIHVuc2lnbmVkIGNweUFsaWduLCBDYWxsSW5zdCAqQyk7CisgIGJvb2wgcHJvY2Vzc01lbUNweU1lbUNweURlcGVuZGVuY2UoTWVtQ3B5SW5zdCAqTSwgTWVtQ3B5SW5zdCAqTURlcCk7CisgIGJvb2wgcHJvY2Vzc01lbVNldE1lbUNweURlcGVuZGVuY2UoTWVtQ3B5SW5zdCAqTSwgTWVtU2V0SW5zdCAqTURlcCk7CisgIGJvb2wgcGVyZm9ybU1lbUNweVRvTWVtU2V0T3B0em4oTWVtQ3B5SW5zdCAqTSwgTWVtU2V0SW5zdCAqTURlcCk7CisgIGJvb2wgcHJvY2Vzc0J5VmFsQXJndW1lbnQoQ2FsbFNpdGUgQ1MsIHVuc2lnbmVkIEFyZ05vKTsKKyAgSW5zdHJ1Y3Rpb24gKnRyeU1lcmdpbmdJbnRvTWVtc2V0KEluc3RydWN0aW9uICpJLCBWYWx1ZSAqU3RhcnRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQnl0ZVZhbCk7CisKKyAgYm9vbCBpdGVyYXRlT25GdW5jdGlvbihGdW5jdGlvbiAmRik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9NRU1DUFlPUFRJTUlaRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9NZXJnZWRMb2FkU3RvcmVNb3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTWVyZ2VkTG9hZFN0b3JlTW90aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhZDdiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTWVyZ2VkTG9hZFN0b3JlTW90aW9uLmgKQEAgLTAsMCArMSwzOSBAQAorLy89PT0tIE1lcmdlZExvYWRTdG9yZU1vdGlvbi5oIC0gbWVyZ2UgYW5kIGhvaXN0L3NpbmsgbG9hZC9zdG9yZXMgLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyEgXGZpbGUKKy8vISBcYnJpZWYgVGhpcyBwYXNzIHBlcmZvcm1zIG1lcmdlcyBvZiBsb2FkcyBhbmQgc3RvcmVzIG9uIGJvdGggc2lkZXMgb2YgYQorLy8gIGRpYW1vbmQgKGhhbW1vY2spLiBJdCBob2lzdHMgdGhlIGxvYWRzIGFuZCBzaW5rcyB0aGUgc3RvcmVzLgorLy8KKy8vIFRoZSBhbGdvcml0aG0gaXRlcmF0aXZlbHkgaG9pc3RzIHR3byBsb2FkcyB0byB0aGUgc2FtZSBhZGRyZXNzIG91dCBvZiBhCisvLyBkaWFtb25kIChoYW1tb2NrKSBhbmQgbWVyZ2VzIHRoZW0gaW50byBhIHNpbmdsZSBsb2FkIGluIHRoZSBoZWFkZXIuIFNpbWlsYXIKKy8vIGl0IHNpbmtzIGFuZCBtZXJnZXMgdHdvIHN0b3JlcyB0byB0aGUgdGFpbCBibG9jayAoZm9vdGVyKS4gVGhlIGFsZ29yaXRobQorLy8gaXRlcmF0ZXMgb3ZlciB0aGUgaW5zdHJ1Y3Rpb25zIG9mIG9uZSBzaWRlIG9mIHRoZSBkaWFtb25kIGFuZCBhdHRlbXB0cyB0bworLy8gZmluZCBhIG1hdGNoaW5nIGxvYWQvc3RvcmUgb24gdGhlIG90aGVyIHNpZGUuIEl0IGhvaXN0cyAvIHNpbmtzIHdoZW4gaXQKKy8vIHRoaW5rcyBpdCBzYWZlIHRvIGRvIHNvLiAgVGhpcyBvcHRpbWl6YXRpb24gaGVscHMgd2l0aCBlZy4gaGlkaW5nIGxvYWQKKy8vIGxhdGVuY2llcywgdHJpZ2dlcmluZyBpZi1jb252ZXJzaW9uLCBhbmQgcmVkdWNpbmcgc3RhdGljIGNvZGUgc2l6ZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTUVSR0VETE9BRFNUT1JFTU9USU9OX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9NRVJHRURMT0FEU1RPUkVNT1RJT05fSAorCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1lcmdlZExvYWRTdG9yZU1vdGlvblBhc3MKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPE1lcmdlZExvYWRTdG9yZU1vdGlvblBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9NRVJHRURMT0FEU1RPUkVNT1RJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9OYXJ5UmVhc3NvY2lhdGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTmFyeVJlYXNzb2NpYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzNWJkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTmFyeVJlYXNzb2NpYXRlLmgKQEAgLTAsMCArMSwxODkgQEAKKy8vPT09LSBOYXJ5UmVhc3NvY2lhdGUuaCAtIFJlYXNzb2NpYXRlIG4tYXJ5IGV4cHJlc3Npb25zIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIHJlYXNzb2NpYXRlcyBuLWFyeSBhZGQgZXhwcmVzc2lvbnMgYW5kIGVsaW1pbmF0ZXMgdGhlIHJlZHVuZGFuY3kKKy8vIGV4cG9zZWQgYnkgdGhlIHJlYXNzb2NpYXRpb24uCisvLworLy8gQSBtb3RpdmF0aW5nIGV4YW1wbGU6CisvLworLy8gICB2b2lkIGZvbyhpbnQgYSwgaW50IGIpIHsKKy8vICAgICBiYXIoYSArIGIpOworLy8gICAgIGJhcigoYSArIDIpICsgYik7CisvLyAgIH0KKy8vCisvLyBBbiBpZGVhbCBjb21waWxlciBzaG91bGQgcmVhc3NvY2lhdGUgKGEgKyAyKSArIGIgdG8gKGEgKyBiKSArIDIgYW5kIHNpbXBsaWZ5CisvLyB0aGUgYWJvdmUgY29kZSB0bworLy8KKy8vICAgaW50IHQgPSBhICsgYjsKKy8vICAgYmFyKHQpOworLy8gICBiYXIodCArIDIpOworLy8KKy8vIEhvd2V2ZXIsIHRoZSBSZWFzc29jaWF0ZSBwYXNzIGlzIHVuYWJsZSB0byBkbyB0aGF0IGJlY2F1c2UgaXQgcHJvY2Vzc2VzIGVhY2gKKy8vIGluc3RydWN0aW9uIGluZGl2aWR1YWxseSBhbmQgYmVsaWV2ZXMgKGEgKyAyKSArIGIgaXMgdGhlIGJlc3QgZm9ybSBhY2NvcmRpbmcKKy8vIHRvIGl0cyByYW5rIHN5c3RlbS4KKy8vCisvLyBUbyBhZGRyZXNzIHRoaXMgbGltaXRhdGlvbiwgTmFyeVJlYXNzb2NpYXRlIHJlYXNzb2NpYXRlcyBhbiBleHByZXNzaW9uIGluIGEKKy8vIGZvcm0gdGhhdCByZXVzZXMgZXhpc3RpbmcgaW5zdHJ1Y3Rpb25zLiBBcyBhIHJlc3VsdCwgTmFyeVJlYXNzb2NpYXRlIGNhbgorLy8gcmVhc3NvY2lhdGUgKGEgKyAyKSArIGIgaW4gdGhlIGV4YW1wbGUgdG8gKGEgKyBiKSArIDIgYmVjYXVzZSBpdCBkZXRlY3RzIHRoYXQKKy8vIChhICsgYikgaXMgY29tcHV0ZWQgYmVmb3JlLgorLy8KKy8vIE5hcnlSZWFzc29jaWF0ZSB3b3JrcyBhcyBmb2xsb3dzLiBGb3IgZXZlcnkgaW5zdHJ1Y3Rpb24gaW4gdGhlIGZvcm0gb2YgKGEgKworLy8gYikgKyBjLCBpdCBjaGVja3Mgd2hldGhlciBhICsgYyBvciBiICsgYyBpcyBhbHJlYWR5IGNvbXB1dGVkIGJ5IGEgZG9taW5hdGluZworLy8gaW5zdHJ1Y3Rpb24uIElmIHNvLCBpdCB0aGVuIHJlYXNzb2NpYXRlcyAoYSArIGIpICsgYyBpbnRvIChhICsgYykgKyBiIG9yIChiICsKKy8vIGMpICsgYSBhbmQgcmVtb3ZlcyB0aGUgcmVkdW5kYW5jeSBhY2NvcmRpbmdseS4gVG8gZWZmaWNpZW50bHkgbG9vayB1cCB3aGV0aGVyCisvLyBhbiBleHByZXNzaW9uIGlzIGNvbXB1dGVkIGJlZm9yZSwgd2Ugc3RvcmUgZWFjaCBpbnN0cnVjdGlvbiBzZWVuIGFuZCBpdHMgU0NFVgorLy8gaW50byBhbiBTQ0VWLXRvLWluc3RydWN0aW9uIG1hcC4KKy8vCisvLyBBbHRob3VnaCB0aGUgYWxnb3JpdGhtIHBhdHRlcm4tbWF0Y2hlcyBvbmx5IHRlcm5hcnkgYWRkaXRpb25zLCBpdAorLy8gYXV0b21hdGljYWxseSBoYW5kbGVzIG1hbnkgPjMtYXJ5IGV4cHJlc3Npb25zIGJ5IHdhbGtpbmcgdGhyb3VnaCB0aGUgZnVuY3Rpb24KKy8vIGluIHRoZSBkZXB0aC1maXJzdCBvcmRlci4gRm9yIGV4YW1wbGUsIGdpdmVuCisvLworLy8gICAoYSArIGMpICsgZAorLy8gICAoKGEgKyBiKSArIGMpICsgZAorLy8KKy8vIE5hcnlSZWFzc29jaWF0ZSBmaXJzdCByZXdyaXRlcyAoYSArIGIpICsgYyB0byAoYSArIGMpICsgYiwgYW5kIHRoZW4gcmV3cml0ZXMKKy8vICgoYSArIGMpICsgYikgKyBkIGludG8gKChhICsgYykgKyBkKSArIGIuCisvLworLy8gRmluYWxseSwgdGhlIGFib3ZlIGRvbWluYXRvci1iYXNlZCBhbGdvcml0aG0gbWF5IG5lZWQgdG8gYmUgcnVuIG11bHRpcGxlCisvLyBpdGVyYXRpb25zIGJlZm9yZSBlbWl0dGluZyBvcHRpbWFsIGNvZGUuIE9uZSBzb3VyY2Ugb2YgdGhpcyBuZWVkIGlzIHRoYXQgd2UKKy8vIG9ubHkgc3BsaXQgYW4gb3BlcmFuZCB3aGVuIGl0IGlzIHVzZWQgb25seSBvbmNlLiBUaGUgYWJvdmUgYWxnb3JpdGhtIGNhbgorLy8gZWxpbWluYXRlIGFuIGluc3RydWN0aW9uIGFuZCBkZWNyZWFzZSB0aGUgdXNhZ2UgY291bnQgb2YgaXRzIG9wZXJhbmRzLiBBcyBhCisvLyByZXN1bHQsIGFuIGluc3RydWN0aW9uIHRoYXQgcHJldmlvdXNseSBoYWQgbXVsdGlwbGUgdXNlcyBtYXkgYmVjb21lIGEKKy8vIHNpbmdsZS11c2UgaW5zdHJ1Y3Rpb24gYW5kIHRodXMgZWxpZ2libGUgZm9yIHNwbGl0IGNvbnNpZGVyYXRpb24uIEZvcgorLy8gZXhhbXBsZSwKKy8vCisvLyAgIGFjID0gYSArIGMKKy8vICAgYWIgPSBhICsgYgorLy8gICBhYmMgPSBhYiArIGMKKy8vICAgYWIyID0gYWIgKyBiCisvLyAgIGFiMmMgPSBhYjIgKyBjCisvLworLy8gSW4gdGhlIGZpcnN0IGl0ZXJhdGlvbiwgd2UgY2Fubm90IHJlYXNzb2NpYXRlIGFiYyB0byBhYytiIGJlY2F1c2UgYWIgaXMgdXNlZAorLy8gdHdpY2UuIEhvd2V2ZXIsIHdlIGNhbiByZWFzc29jaWF0ZSBhYjJjIHRvIGFiYytiIGluIHRoZSBmaXJzdCBpdGVyYXRpb24uIEFzIGEKKy8vIHJlc3VsdCwgYWIyIGJlY29tZXMgZGVhZCBhbmQgYWIgd2lsbCBiZSB1c2VkIG9ubHkgb25jZSBpbiB0aGUgc2Vjb25kCisvLyBpdGVyYXRpb24uCisvLworLy8gTGltaXRhdGlvbnMgYW5kIFRPRE8gaXRlbXM6CisvLworLy8gMSkgV2Ugb25seSBjb25zaWRlcnMgbi1hcnkgYWRkcyBhbmQgbXVscyBmb3Igbm93LiBUaGlzIHNob3VsZCBiZSBleHRlbmRlZAorLy8gYW5kIGdlbmVyYWxpemVkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9OQVJZUkVBU1NPQ0lBVEVfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX05BUllSRUFTU09DSUFURV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc3N1bXB0aW9uQ2FjaGU7CitjbGFzcyBCaW5hcnlPcGVyYXRvcjsKK2NsYXNzIERhdGFMYXlvdXQ7CitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBHZXRFbGVtZW50UHRySW5zdDsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworY2xhc3MgU0NFVjsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworY2xhc3MgVGFyZ2V0VHJhbnNmb3JtSW5mbzsKK2NsYXNzIFR5cGU7CitjbGFzcyBWYWx1ZTsKKworY2xhc3MgTmFyeVJlYXNzb2NpYXRlUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPE5hcnlSZWFzc29jaWF0ZVBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworCisgIC8vIEdsdWUgZm9yIG9sZCBQTS4KKyAgYm9vbCBydW5JbXBsKEZ1bmN0aW9uICZGLCBBc3N1bXB0aW9uQ2FjaGUgKkFDXywgRG9taW5hdG9yVHJlZSAqRFRfLAorICAgICAgICAgICAgICAgU2NhbGFyRXZvbHV0aW9uICpTRV8sIFRhcmdldExpYnJhcnlJbmZvICpUTElfLAorICAgICAgICAgICAgICAgVGFyZ2V0VHJhbnNmb3JtSW5mbyAqVFRJXyk7CisKK3ByaXZhdGU6CisgIC8vIFJ1bnMgb25seSBvbmUgaXRlcmF0aW9uIG9mIHRoZSBkb21pbmF0b3ItYmFzZWQgYWxnb3JpdGhtLiBTZWUgdGhlIGhlYWRlcgorICAvLyBjb21tZW50cyBmb3Igd2h5IHdlIG5lZWQgbXVsdGlwbGUgaXRlcmF0aW9ucy4KKyAgYm9vbCBkb09uZUl0ZXJhdGlvbihGdW5jdGlvbiAmRik7CisKKyAgLy8gUmVhc3NvY2lhdGVzIEkgZm9yIGJldHRlciBDU0UuCisgIEluc3RydWN0aW9uICp0cnlSZWFzc29jaWF0ZShJbnN0cnVjdGlvbiAqSSk7CisKKyAgLy8gUmVhc3NvY2lhdGUgR0VQIGZvciBiZXR0ZXIgQ1NFLgorICBJbnN0cnVjdGlvbiAqdHJ5UmVhc3NvY2lhdGVHRVAoR2V0RWxlbWVudFB0ckluc3QgKkdFUCk7CisKKyAgLy8gVHJ5IHNwbGl0dGluZyBHRVAgYXQgdGhlIEktdGggaW5kZXggYW5kIHNlZSB3aGV0aGVyIGVpdGhlciBwYXJ0IGNhbiBiZQorICAvLyBDU0UnZWQuIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRyeVJlYXNzb2NpYXRlR0VQLgorICAvLworICAvLyBccCBJbmRleGVkVHlwZSBUaGUgZWxlbWVudCB0eXBlIGluZGV4ZWQgYnkgR0VQJ3MgSS10aCBpbmRleC4gVGhpcyBpcworICAvLyAgICAgICAgICAgICAgICBlcXVpdmFsZW50IHRvCisgIC8vICAgICAgICAgICAgICAgICAgR0VQLT5nZXRJbmRleGVkVHlwZShHRVAtPmdldFBvaW50ZXJPcGVyYW5kKCksIDAtdGggaW5kZXgsCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4sIGktdGggaW5kZXgpLgorICBHZXRFbGVtZW50UHRySW5zdCAqdHJ5UmVhc3NvY2lhdGVHRVBBdEluZGV4KEdldEVsZW1lbnRQdHJJbnN0ICpHRVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSSwgVHlwZSAqSW5kZXhlZFR5cGUpOworCisgIC8vIEdpdmVuIEdFUCdzIEktdGggaW5kZXggPSBMSFMgKyBSSFMsIHNlZSB3aGV0aGVyICZCYXNlWy4uXVtMSFNdWy4uXSBvcgorICAvLyAmQmFzZVsuLl1bUkhTXVsuLl0gY2FuIGJlIENTRSdlZCBhbmQgcmV3cml0ZSBHRVAgYWNjb3JkaW5nbHkuCisgIEdldEVsZW1lbnRQdHJJbnN0ICp0cnlSZWFzc29jaWF0ZUdFUEF0SW5kZXgoR2V0RWxlbWVudFB0ckluc3QgKkdFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJLCBWYWx1ZSAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpSSFMsIFR5cGUgKkluZGV4ZWRUeXBlKTsKKworICAvLyBSZWFzc29jaWF0ZSBiaW5hcnkgb3BlcmF0b3JzIGZvciBiZXR0ZXIgQ1NFLgorICBJbnN0cnVjdGlvbiAqdHJ5UmVhc3NvY2lhdGVCaW5hcnlPcChCaW5hcnlPcGVyYXRvciAqSSk7CisKKyAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRyeVJlYXNzb2NpYXRlQmluYXJ5T3AuIExIUyBhbmQgUkhTIGFyZSBleHBsaWNpdGx5CisgIC8vIHBhc3NlZC4KKyAgSW5zdHJ1Y3Rpb24gKnRyeVJlYXNzb2NpYXRlQmluYXJ5T3AoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3IgKkkpOworICAvLyBSZXdyaXRlcyBJIHRvIChMSFMgb3AgUkhTKSBpZiBMSFMgaXMgY29tcHV0ZWQgYWxyZWFkeS4KKyAgSW5zdHJ1Y3Rpb24gKnRyeVJlYXNzb2NpYXRlZEJpbmFyeU9wKGNvbnN0IFNDRVYgKkxIUywgVmFsdWUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yICpJKTsKKworICAvLyBUcmllcyB0byBtYXRjaCBPcDEgYW5kIE9wMiBieSB1c2luZyBWLgorICBib29sIG1hdGNoVGVybmFyeU9wKEJpbmFyeU9wZXJhdG9yICpJLCBWYWx1ZSAqViwgVmFsdWUgKiZPcDEsIFZhbHVlIComT3AyKTsKKworICAvLyBHZXRzIFNDRVYgZm9yIChMSFMgb3AgUkhTKS4KKyAgY29uc3QgU0NFViAqZ2V0QmluYXJ5U0NFVihCaW5hcnlPcGVyYXRvciAqSSwgY29uc3QgU0NFViAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlJIUyk7CisKKyAgLy8gUmV0dXJucyB0aGUgY2xvc2VzdCBkb21pbmF0b3Igb2YgXGMgRG9taW5hdGVlIHRoYXQgY29tcHV0ZXMKKyAgLy8gXGMgQ2FuZGlkYXRlRXhwci4gUmV0dXJucyBudWxsIGlmIG5vdCBmb3VuZC4KKyAgSW5zdHJ1Y3Rpb24gKmZpbmRDbG9zZXN0TWF0Y2hpbmdEb21pbmF0b3IoY29uc3QgU0NFViAqQ2FuZGlkYXRlRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkRvbWluYXRlZSk7CisKKyAgLy8gR2V0RWxlbWVudFB0ckluc3QgaW1wbGljaXRseSBzaWduLWV4dGVuZHMgYW4gaW5kZXggaWYgdGhlIGluZGV4IGlzIHNob3J0ZXIKKyAgLy8gdGhhbiB0aGUgcG9pbnRlciBzaXplLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgd2hldGhlciBJbmRleCBpcyBzaG9ydGVyIHRoYW4KKyAgLy8gR0VQJ3MgcG9pbnRlciBzaXplLCBpLmUuLCB3aGV0aGVyIEluZGV4IG5lZWRzIHRvIGJlIHNpZ24tZXh0ZW5kZWQgaW4gb3JkZXIKKyAgLy8gdG8gYmUgYW4gaW5kZXggb2YgR0VQLgorICBib29sIHJlcXVpcmVzU2lnbkV4dGVuc2lvbihWYWx1ZSAqSW5kZXgsIEdldEVsZW1lbnRQdHJJbnN0ICpHRVApOworCisgIEFzc3VtcHRpb25DYWNoZSAqQUM7CisgIGNvbnN0IERhdGFMYXlvdXQgKkRMOworICBEb21pbmF0b3JUcmVlICpEVDsKKyAgU2NhbGFyRXZvbHV0aW9uICpTRTsKKyAgVGFyZ2V0TGlicmFyeUluZm8gKlRMSTsKKyAgVGFyZ2V0VHJhbnNmb3JtSW5mbyAqVFRJOworCisgIC8vIEEgbG9va3VwIHRhYmxlIHF1aWNrbHkgdGVsbGluZyB3aGljaCBpbnN0cnVjdGlvbnMgY29tcHV0ZSB0aGUgZ2l2ZW4gU0NFVi4KKyAgLy8gTm90ZSB0aGF0IHRoZXJlIGNhbiBiZSBtdWx0aXBsZSBpbnN0cnVjdGlvbnMgYXQgZGlmZmVyZW50IGxvY2F0aW9ucworICAvLyBjb21wdXRpbmcgdG8gdGhlIHNhbWUgU0NFViwgc28gd2UgbWFwIGEgU0NFViB0byBhbiBpbnN0cnVjdGlvbiBsaXN0LiAgRm9yCisgIC8vIGV4YW1wbGUsCisgIC8vCisgIC8vICAgaWYgKHAxKQorICAvLyAgICAgZm9vKGEgKyBiKTsKKyAgLy8gICBpZiAocDIpCisgIC8vICAgICBiYXIoYSArIGIpOworICBEZW5zZU1hcDxjb25zdCBTQ0VWICosIFNtYWxsVmVjdG9yPFdlYWtUcmFja2luZ1ZILCAyPj4gU2VlbkV4cHJzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTkFSWVJFQVNTT0NJQVRFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTmV3R1ZOLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL05ld0dWTi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZGIyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL05ld0dWTi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vPT09LSBOZXdHVk4uaCAtIEdsb2JhbCBWYWx1ZSBOdW1iZXJpbmcgUGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgZm9yIExMVk0ncyBHbG9iYWwgVmFsdWUgTnVtYmVyaW5nIHBhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX05FV0dWTl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTkVXR1ZOX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKKworY2xhc3MgTmV3R1ZOUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPE5ld0dWTlBhc3M+IHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBSdW4gdGhlIHBhc3Mgb3ZlciB0aGUgZnVuY3Rpb24uCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgQW5hbHlzaXNNYW5hZ2VyPEZ1bmN0aW9uPiAmQU0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTkVXR1ZOX0gKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9QYXJ0aWFsbHlJbmxpbmVMaWJDYWxscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9QYXJ0aWFsbHlJbmxpbmVMaWJDYWxscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNzM4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1BhcnRpYWxseUlubGluZUxpYkNhbGxzLmgKQEAgLTAsMCArMSwzMCBAQAorLy89PT0tLS0gUGFydGlhbGx5SW5saW5lTGliQ2FsbHMuaCAtIFBhcnRpYWxseSBpbmxpbmUgbGliY2FsbHMgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgdHJpZXMgdG8gcGFydGlhbGx5IGlubGluZSB0aGUgZmFzdCBwYXRoIG9mIHdlbGwta25vd24gbGlicmFyeQorLy8gZnVuY3Rpb25zLCBzdWNoIGFzIHVzaW5nIHNxdWFyZS1yb290IGluc3RydWN0aW9ucyBmb3IgY2FzZXMgd2hlcmUgc3FydCgpCisvLyBkb2VzIG5vdCBuZWVkIHRvIHNldCBlcnJuby4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfUEFSVElBTExZSU5MSU5FTElCQ0FMTFNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1BBUlRJQUxMWUlOTElORUxJQkNBTExTX0gKKworI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBQYXJ0aWFsbHlJbmxpbmVMaWJDYWxsc1Bhc3MKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPFBhcnRpYWxseUlubGluZUxpYkNhbGxzUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworfQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9QQVJUSUFMTFlJTkxJTkVMSUJDQUxMU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1JlYXNzb2NpYXRlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1JlYXNzb2NpYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5N2RmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvUmVhc3NvY2lhdGUuaApAQCAtMCwwICsxLDEyMCBAQAorLy89PT0tIFJlYXNzb2NpYXRlLmggLSBSZWFzc29jaWF0ZSBiaW5hcnkgZXhwcmVzc2lvbnMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgcmVhc3NvY2lhdGVzIGNvbW11dGF0aXZlIGV4cHJlc3Npb25zIGluIGFuIG9yZGVyIHRoYXQgaXMgZGVzaWduZWQKKy8vIHRvIHByb21vdGUgYmV0dGVyIGNvbnN0YW50IHByb3BhZ2F0aW9uLCBHQ1NFLCBMSUNNLCBQUkUsIGV0Yy4KKy8vCisvLyBGb3IgZXhhbXBsZTogNCArICh4ICsgNSkgLT4geCArICg0ICsgNSkKKy8vCisvLyBJbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBhbGdvcml0aG0sIGNvbnN0YW50cyBhcmUgYXNzaWduZWQgcmFuayA9IDAsCisvLyBmdW5jdGlvbiBhcmd1bWVudHMgYXJlIHJhbmsgPSAxLCBhbmQgb3RoZXIgdmFsdWVzIGFyZSBhc3NpZ25lZCByYW5rcworLy8gY29ycmVzcG9uZGluZyB0byB0aGUgcmV2ZXJzZSBwb3N0IG9yZGVyIHRyYXZlcnNhbCBvZiBjdXJyZW50IGZ1bmN0aW9uCisvLyAoc3RhcnRpbmcgYXQgMiksIHdoaWNoIGVmZmVjdGl2ZWx5IGdpdmVzIHZhbHVlcyBpbiBkZWVwIGxvb3BzIGhpZ2hlciByYW5rCisvLyB0aGFuIHZhbHVlcyBub3QgaW4gbG9vcHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1JFQVNTT0NJQVRFX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9SRUFTU09DSUFURV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1Bvc3RPcmRlckl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU2V0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JUkJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFQSW50OworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEJpbmFyeU9wZXJhdG9yOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIFZhbHVlOworCisvLy8gQSBwcml2YXRlICJtb2R1bGUiIG5hbWVzcGFjZSBmb3IgdHlwZXMgYW5kIHV0aWxpdGllcyB1c2VkIGJ5IFJlYXNzb2NpYXRlLgorLy8vIFRoZXNlIGFyZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgY2xpZW50cy4KK25hbWVzcGFjZSByZWFzc29jaWF0ZSB7CisKK3N0cnVjdCBWYWx1ZUVudHJ5IHsKKyAgdW5zaWduZWQgUmFuazsKKyAgVmFsdWUgKk9wOworCisgIFZhbHVlRW50cnkodW5zaWduZWQgUiwgVmFsdWUgKk8pIDogUmFuayhSKSwgT3AoTykge30KK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBWYWx1ZUVudHJ5ICZMSFMsIGNvbnN0IFZhbHVlRW50cnkgJlJIUykgeworICByZXR1cm4gTEhTLlJhbmsgPiBSSFMuUmFuazsgLy8gU29ydCBzbyB0aGF0IGhpZ2hlc3QgcmFuayBnb2VzIHRvIHN0YXJ0LgorfQorCisvLy8gXGJyaWVmIFV0aWxpdHkgY2xhc3MgcmVwcmVzZW50aW5nIGEgYmFzZSBhbmQgZXhwb25lbnQgcGFpciB3aGljaCBmb3JtIG9uZQorLy8vIGZhY3RvciBvZiBzb21lIHByb2R1Y3QuCitzdHJ1Y3QgRmFjdG9yIHsKKyAgVmFsdWUgKkJhc2U7CisgIHVuc2lnbmVkIFBvd2VyOworCisgIEZhY3RvcihWYWx1ZSAqQmFzZSwgdW5zaWduZWQgUG93ZXIpIDogQmFzZShCYXNlKSwgUG93ZXIoUG93ZXIpIHt9Cit9OworCitjbGFzcyBYb3JPcG5kOworCit9IC8vIGVuZCBuYW1lc3BhY2UgcmVhc3NvY2lhdGUKKworLy8vIFJlYXNzb2NpYXRlIGNvbW11dGF0aXZlIGV4cHJlc3Npb25zLgorY2xhc3MgUmVhc3NvY2lhdGVQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48UmVhc3NvY2lhdGVQYXNzPiB7CisgIERlbnNlTWFwPEJhc2ljQmxvY2sgKiwgdW5zaWduZWQ+IFJhbmtNYXA7CisgIERlbnNlTWFwPEFzc2VydGluZ1ZIPFZhbHVlPiwgdW5zaWduZWQ+IFZhbHVlUmFua01hcDsKKyAgU2V0VmVjdG9yPEFzc2VydGluZ1ZIPEluc3RydWN0aW9uPj4gUmVkb0luc3RzOworCisgIC8vIEFyYml0cmFyeSwgYnV0IHByZXZlbnRzIHF1YWRyYXRpYyBiZWhhdmlvci4KKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEdsb2JhbFJlYXNzb2NpYXRlTGltaXQgPSAxMDsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE51bUJpbmFyeU9wcyA9CisgICAgICBJbnN0cnVjdGlvbjo6QmluYXJ5T3BzRW5kIC0gSW5zdHJ1Y3Rpb246OkJpbmFyeU9wc0JlZ2luOworICBEZW5zZU1hcDxzdGQ6OnBhaXI8VmFsdWUgKiwgVmFsdWUgKj4sIHVuc2lnbmVkPiBQYWlyTWFwW051bUJpbmFyeU9wc107CisKKyAgYm9vbCBNYWRlQ2hhbmdlOworCitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJik7CisKK3ByaXZhdGU6CisgIHZvaWQgQnVpbGRSYW5rTWFwKEZ1bmN0aW9uICZGLCBSZXZlcnNlUG9zdE9yZGVyVHJhdmVyc2FsPEZ1bmN0aW9uICo+ICZSUE9UKTsKKyAgdW5zaWduZWQgZ2V0UmFuayhWYWx1ZSAqVik7CisgIHZvaWQgY2Fub25pY2FsaXplT3BlcmFuZHMoSW5zdHJ1Y3Rpb24gKkkpOworICB2b2lkIFJlYXNzb2NpYXRlRXhwcmVzc2lvbihCaW5hcnlPcGVyYXRvciAqSSk7CisgIHZvaWQgUmV3cml0ZUV4cHJUcmVlKEJpbmFyeU9wZXJhdG9yICpJLAorICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8cmVhc3NvY2lhdGU6OlZhbHVlRW50cnk+ICZPcHMpOworICBWYWx1ZSAqT3B0aW1pemVFeHByZXNzaW9uKEJpbmFyeU9wZXJhdG9yICpJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxyZWFzc29jaWF0ZTo6VmFsdWVFbnRyeT4gJk9wcyk7CisgIFZhbHVlICpPcHRpbWl6ZUFkZChJbnN0cnVjdGlvbiAqSSwKKyAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxyZWFzc29jaWF0ZTo6VmFsdWVFbnRyeT4gJk9wcyk7CisgIFZhbHVlICpPcHRpbWl6ZVhvcihJbnN0cnVjdGlvbiAqSSwKKyAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxyZWFzc29jaWF0ZTo6VmFsdWVFbnRyeT4gJk9wcyk7CisgIGJvb2wgQ29tYmluZVhvck9wbmQoSW5zdHJ1Y3Rpb24gKkksIHJlYXNzb2NpYXRlOjpYb3JPcG5kICpPcG5kMSwKKyAgICAgICAgICAgICAgICAgICAgICBBUEludCAmQ29uc3RPcG5kLCBWYWx1ZSAqJlJlcyk7CisgIGJvb2wgQ29tYmluZVhvck9wbmQoSW5zdHJ1Y3Rpb24gKkksIHJlYXNzb2NpYXRlOjpYb3JPcG5kICpPcG5kMSwKKyAgICAgICAgICAgICAgICAgICAgICByZWFzc29jaWF0ZTo6WG9yT3BuZCAqT3BuZDIsIEFQSW50ICZDb25zdE9wbmQsCisgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKiZSZXMpOworICBWYWx1ZSAqYnVpbGRNaW5pbWFsTXVsdGlwbHlEQUcoSVJCdWlsZGVyPD4gJkJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8cmVhc3NvY2lhdGU6OkZhY3Rvcj4gJkZhY3RvcnMpOworICBWYWx1ZSAqT3B0aW1pemVNdWwoQmluYXJ5T3BlcmF0b3IgKkksCisgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8cmVhc3NvY2lhdGU6OlZhbHVlRW50cnk+ICZPcHMpOworICBWYWx1ZSAqUmVtb3ZlRmFjdG9yRnJvbUV4cHJlc3Npb24oVmFsdWUgKlYsIFZhbHVlICpGYWN0b3IpOworICB2b2lkIEVyYXNlSW5zdChJbnN0cnVjdGlvbiAqSSk7CisgIHZvaWQgUmVjdXJzaXZlbHlFcmFzZURlYWRJbnN0cyhJbnN0cnVjdGlvbiAqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldFZlY3RvcjxBc3NlcnRpbmdWSDxJbnN0cnVjdGlvbj4+ICZJbnN0cyk7CisgIHZvaWQgT3B0aW1pemVJbnN0KEluc3RydWN0aW9uICpJKTsKKyAgSW5zdHJ1Y3Rpb24gKmNhbm9uaWNhbGl6ZU5lZ0NvbnN0RXhwcihJbnN0cnVjdGlvbiAqSSk7CisgIHZvaWQgQnVpbGRQYWlyTWFwKFJldmVyc2VQb3N0T3JkZXJUcmF2ZXJzYWw8RnVuY3Rpb24gKj4gJlJQT1QpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfUkVBU1NPQ0lBVEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9SZXdyaXRlU3RhdGVwb2ludHNGb3JHQy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9SZXdyaXRlU3RhdGVwb2ludHNGb3JHQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOGYxNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1Jld3JpdGVTdGF0ZXBvaW50c0ZvckdDLmgKQEAgLTAsMCArMSwzOSBAQAorLy89PT0tIFJld3JpdGVTdGF0ZXBvaW50c0ZvckdDLmggLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgaW50ZXJmYWNlIHRvICJSZXdyaXRlIFN0YXRlcG9pbnRzIGZvciBHQyIgcGFzcy4KKy8vCisvLyBUaGlzIHBhc3NlIHJld3JpdGVzIGNhbGwvaW52b2tlIGluc3RydWN0aW9ucyBzbyBhcyB0byBtYWtlIHBvdGVudGlhbAorLy8gcmVsb2NhdGlvbnMgcGVyZm9ybWVkIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3RvciBleHBsaWNpdCBpbiB0aGUgSVIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1JFV1JJVEVfU1RBVEVQT0lOVFNfRk9SX0dDX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9SRVdSSVRFX1NUQVRFUE9JTlRTX0ZPUl9HQ19ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTW9kdWxlOworY2xhc3MgVGFyZ2V0VHJhbnNmb3JtSW5mbzsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworCitzdHJ1Y3QgUmV3cml0ZVN0YXRlcG9pbnRzRm9yR0MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxSZXdyaXRlU3RhdGVwb2ludHNGb3JHQz4geworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJkFNKTsKKworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYsIERvbWluYXRvclRyZWUgJiwgVGFyZ2V0VHJhbnNmb3JtSW5mbyAmLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJik7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1JFV1JJVEVfU1RBVEVQT0lOVFNfRk9SX0dDX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvU0NDUC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9TQ0NQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEyOTRjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvU0NDUC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vPT09LSBTQ0NQLmNwcCAtIFNwYXJzZSBDb25kaXRpb25hbCBDb25zdGFudCBQcm9wYWdhdGlvbiAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gXGZpbGUKKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNwYXJzZSBjb25kaXRpb25hbCBjb25zdGFudCBwcm9wYWdhdGlvbiBhbmQgbWVyZ2luZzoKKy8vCisvLyBTcGVjaWZpY2FsbHksIHRoaXM6CisvLyAgICogQXNzdW1lcyB2YWx1ZXMgYXJlIGNvbnN0YW50IHVubGVzcyBwcm92ZW4gb3RoZXJ3aXNlCisvLyAgICogQXNzdW1lcyBCYXNpY0Jsb2NrcyBhcmUgZGVhZCB1bmxlc3MgcHJvdmVuIG90aGVyd2lzZQorLy8gICAqIFByb3ZlcyB2YWx1ZXMgdG8gYmUgY29uc3RhbnQsIGFuZCByZXBsYWNlcyB0aGVtIHdpdGggY29uc3RhbnRzCisvLyAgICogUHJvdmVzIGNvbmRpdGlvbmFsIGJyYW5jaGVzIHRvIGJlIHVuY29uZGl0aW9uYWwKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfU0NDUF9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfU0NDUF9ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1RhcmdldExpYnJhcnlJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EYXRhTGF5b3V0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworCisvLy8gVGhpcyBwYXNzIHBlcmZvcm1zIGZ1bmN0aW9uLWxldmVsIGNvbnN0YW50IHByb3BhZ2F0aW9uIGFuZCBtZXJnaW5nLgorY2xhc3MgU0NDUFBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxTQ0NQUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCitib29sIHJ1bklQU0NDUChNb2R1bGUgJk0sIGNvbnN0IERhdGFMYXlvdXQgJkRMLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1NDQ1BfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9TUk9BLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1NST0EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTMyMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9TUk9BLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8vPT09LSBTUk9BLmggLSBTY2FsYXIgUmVwbGFjZW1lbnQgT2YgQWdncmVnYXRlcyAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBmb3IgTExWTSdzIFNjYWxhciBSZXBsYWNlbWVudCBvZgorLy8vIEFnZ3JlZ2F0ZXMgcGFzcy4gVGhpcyBwYXNzIHByb3ZpZGVzIGJvdGggYWdncmVnYXRlIHNwbGl0dGluZyBhbmQgdGhlCisvLy8gcHJpbWFyeSBTU0EgZm9ybWF0aW9uIHVzZWQgaW4gdGhlIGNvbXBpbGVyLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfU1JPQV9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfU1JPQV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQWxsb2NhSW5zdDsKK2NsYXNzIEFzc3VtcHRpb25DYWNoZTsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBQSElOb2RlOworY2xhc3MgU2VsZWN0SW5zdDsKK2NsYXNzIFVzZTsKKworLy8vIEEgcHJpdmF0ZSAibW9kdWxlIiBuYW1lc3BhY2UgZm9yIHR5cGVzIGFuZCB1dGlsaXRpZXMgdXNlZCBieSBTUk9BLiBUaGVzZQorLy8vIGFyZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgY2xpZW50cy4KK25hbWVzcGFjZSBzcm9hIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIHsKKworY2xhc3MgQWxsb2NhU2xpY2VSZXdyaXRlcjsKK2NsYXNzIEFsbG9jYVNsaWNlczsKK2NsYXNzIFBhcnRpdGlvbjsKK2NsYXNzIFNST0FMZWdhY3lQYXNzOworCit9IC8vIGVuZCBuYW1lc3BhY2Ugc3JvYQorCisvLy8gXGJyaWVmIEFuIG9wdGltaXphdGlvbiBwYXNzIHByb3ZpZGluZyBTY2FsYXIgUmVwbGFjZW1lbnQgb2YgQWdncmVnYXRlcy4KKy8vLworLy8vIFRoaXMgcGFzcyB0YWtlcyBhbGxvY2F0aW9ucyB3aGljaCBjYW4gYmUgY29tcGxldGVseSBhbmFseXplZCAodGhhdCBpcywgdGhleQorLy8vIGRvbid0IGVzY2FwZSkgYW5kIHRyaWVzIHRvIHR1cm4gdGhlbSBpbnRvIHNjYWxhciBTU0EgdmFsdWVzLiBUaGVyZSBhcmUKKy8vLyBhIGZldyBzdGVwcyB0byB0aGlzIHByb2Nlc3MuCisvLy8KKy8vLyAxKSBJdCB0YWtlcyBhbGxvY2F0aW9ucyBvZiBhZ2dyZWdhdGVzIGFuZCBhbmFseXplcyB0aGUgd2F5cyBpbiB3aGljaCB0aGV5CisvLy8gICAgYXJlIHVzZWQgdG8gdHJ5IHRvIHNwbGl0IHRoZW0gaW50byBzbWFsbGVyIGFsbG9jYXRpb25zLCBpZGVhbGx5IG9mCisvLy8gICAgYSBzaW5nbGUgc2NhbGFyIGRhdGEgdHlwZS4gSXQgd2lsbCBzcGxpdCB1cCBtZW1jcHkgYW5kIG1lbXNldCBhY2Nlc3NlcworLy8vICAgIGFzIG5lY2Vzc2FyeSBhbmQgdHJ5IHRvIGlzb2xhdGUgaW5kaXZpZHVhbCBzY2FsYXIgYWNjZXNzZXMuCisvLy8gMikgSXQgd2lsbCB0cmFuc2Zvcm0gYWNjZXNzZXMgaW50byBmb3JtcyB3aGljaCBhcmUgc3VpdGFibGUgZm9yIFNTQSB2YWx1ZQorLy8vICAgIHByb21vdGlvbi4gVGhpcyBjYW4gYmUgcmVwbGFjaW5nIGEgbWVtc2V0IHdpdGggYSBzY2FsYXIgc3RvcmUgb2YgYW4KKy8vLyAgICBpbnRlZ2VyIHZhbHVlLCBvciBpdCBjYW4gaW52b2x2ZSBzcGVjdWxhdGluZyBvcGVyYXRpb25zIG9uIGEgUEhJIG9yCisvLy8gICAgc2VsZWN0IHRvIGJlIGEgUEhJIG9yIHNlbGVjdCBvZiB0aGUgcmVzdWx0cy4KKy8vLyAzKSBGaW5hbGx5LCB0aGlzIHdpbGwgdHJ5IHRvIGRldGVjdCBhIHBhdHRlcm4gb2YgYWNjZXNzZXMgd2hpY2ggbWFwIGNsZWFubHkKKy8vLyAgICBvbnRvIGluc2VydCBhbmQgZXh0cmFjdCBvcGVyYXRpb25zIG9uIGEgdmVjdG9yIHZhbHVlLCBhbmQgY29udmVydCB0aGVtIHRvCisvLy8gICAgdGhpcyBmb3JtLiBCeSBkb2luZyBzbywgaXQgd2lsbCBlbmFibGUgcHJvbW90aW9uIG9mIHZlY3RvciBhZ2dyZWdhdGVzIHRvCisvLy8gICAgU1NBIHZlY3RvciB2YWx1ZXMuCitjbGFzcyBTUk9BIDogcHVibGljIFBhc3NJbmZvTWl4aW48U1JPQT4geworICBMTFZNQ29udGV4dCAqQyA9IG51bGxwdHI7CisgIERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cjsKKyAgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBXb3JrbGlzdCBvZiBhbGxvY2EgaW5zdHJ1Y3Rpb25zIHRvIHNpbXBsaWZ5LgorICAvLy8KKyAgLy8vIEVhY2ggYWxsb2NhIGluIHRoZSBmdW5jdGlvbiBpcyBhZGRlZCB0byB0aGlzLiBFYWNoIG5ldyBhbGxvY2EgZm9ybWVkIGdldHMKKyAgLy8vIGFkZGVkIHRvIGl0IGFzIHdlbGwgdG8gcmVjdXJzaXZlbHkgc2ltcGxpZnkgdW5sZXNzIHRoYXQgYWxsb2NhIGNhbiBiZQorICAvLy8gZGlyZWN0bHkgcHJvbW90ZWQuIEZpbmFsbHksIGVhY2ggdGltZSB3ZSByZXdyaXRlIGEgdXNlIG9mIGFuIGFsbG9jYSBvdGhlcgorICAvLy8gdGhlIG9uZSBiZWluZyBhY3RpdmVseSByZXdyaXR0ZW4sIHdlIGFkZCBpdCBiYWNrIG9udG8gdGhlIGxpc3QgaWYgbm90CisgIC8vLyBhbHJlYWR5IHByZXNlbnQgdG8gZW5zdXJlIGl0IGlzIHJlLXZpc2l0ZWQuCisgIFNldFZlY3RvcjxBbGxvY2FJbnN0ICosIFNtYWxsVmVjdG9yPEFsbG9jYUluc3QgKiwgMTY+PiBXb3JrbGlzdDsKKworICAvLy8gXGJyaWVmIEEgY29sbGVjdGlvbiBvZiBpbnN0cnVjdGlvbnMgdG8gZGVsZXRlLgorICAvLy8gV2UgdHJ5IHRvIGJhdGNoIGRlbGV0aW9ucyB0byBzaW1wbGlmeSBjb2RlIGFuZCBtYWtlIHRoaW5ncyBhIGJpdCBtb3JlCisgIC8vLyBlZmZpY2llbnQuCisgIFNldFZlY3RvcjxJbnN0cnVjdGlvbiAqLCBTbWFsbFZlY3RvcjxJbnN0cnVjdGlvbiAqLCA4Pj4gRGVhZEluc3RzOworCisgIC8vLyBcYnJpZWYgUG9zdC1wcm9tb3Rpb24gd29ya2xpc3QuCisgIC8vLworICAvLy8gU29tZXRpbWVzIHdlIGRpc2NvdmVyIGFuIGFsbG9jYSB3aGljaCBoYXMgYSBoaWdoIHByb2JhYmlsaXR5IG9mIGJlY29taW5nCisgIC8vLyB2aWFibGUgZm9yIFNST0EgYWZ0ZXIgYSByb3VuZCBvZiBwcm9tb3Rpb24gdGFrZXMgcGxhY2UuIEluIHRob3NlIGNhc2VzLAorICAvLy8gdGhlIGFsbG9jYSBpcyBlbnF1ZXVlZCBoZXJlIGZvciByZS1wcm9jZXNzaW5nLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIGJlIHZlcnkgY2FyZWZ1bCB0byBjbGVhciBhbGxvY2FzIG91dCBvZiB0aGlzIGxpc3QgaW4KKyAgLy8vIHRoZSBldmVudCB0aGV5IGFyZSBkZWxldGVkLgorICBTZXRWZWN0b3I8QWxsb2NhSW5zdCAqLCBTbWFsbFZlY3RvcjxBbGxvY2FJbnN0ICosIDE2Pj4gUG9zdFByb21vdGlvbldvcmtsaXN0OworCisgIC8vLyBcYnJpZWYgQSBjb2xsZWN0aW9uIG9mIGFsbG9jYSBpbnN0cnVjdGlvbnMgd2UgY2FuIGRpcmVjdGx5IHByb21vdGUuCisgIHN0ZDo6dmVjdG9yPEFsbG9jYUluc3QgKj4gUHJvbW90YWJsZUFsbG9jYXM7CisKKyAgLy8vIFxicmllZiBBIHdvcmtsaXN0IG9mIFBISXMgdG8gc3BlY3VsYXRlIHByaW9yIHRvIHByb21vdGluZyBhbGxvY2FzLgorICAvLy8KKyAgLy8vIEFsbCBvZiB0aGVzZSBQSElzIGhhdmUgYmVlbiBjaGVja2VkIGZvciB0aGUgc2FmZXR5IG9mIHNwZWN1bGF0aW9uIGFuZCBieQorICAvLy8gYmVpbmcgc3BlY3VsYXRlZCB3aWxsIGFsbG93IHByb21vdGluZyBhbGxvY2FzIGN1cnJlbnRseSBpbiB0aGUgcHJvbW90YWJsZQorICAvLy8gcXVldWUuCisgIFNldFZlY3RvcjxQSElOb2RlICosIFNtYWxsVmVjdG9yPFBISU5vZGUgKiwgMj4+IFNwZWN1bGF0YWJsZVBISXM7CisKKyAgLy8vIFxicmllZiBBIHdvcmtsaXN0IG9mIHNlbGVjdCBpbnN0cnVjdGlvbnMgdG8gc3BlY3VsYXRlIHByaW9yIHRvIHByb21vdGluZworICAvLy8gYWxsb2Nhcy4KKyAgLy8vCisgIC8vLyBBbGwgb2YgdGhlc2Ugc2VsZWN0IGluc3RydWN0aW9ucyBoYXZlIGJlZW4gY2hlY2tlZCBmb3IgdGhlIHNhZmV0eSBvZgorICAvLy8gc3BlY3VsYXRpb24gYW5kIGJ5IGJlaW5nIHNwZWN1bGF0ZWQgd2lsbCBhbGxvdyBwcm9tb3RpbmcgYWxsb2NhcworICAvLy8gY3VycmVudGx5IGluIHRoZSBwcm9tb3RhYmxlIHF1ZXVlLgorICBTZXRWZWN0b3I8U2VsZWN0SW5zdCAqLCBTbWFsbFZlY3RvcjxTZWxlY3RJbnN0ICosIDI+PiBTcGVjdWxhdGFibGVTZWxlY3RzOworCitwdWJsaWM6CisgIFNST0EoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBSdW4gdGhlIHBhc3Mgb3ZlciB0aGUgZnVuY3Rpb24uCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIHNyb2E6OkFsbG9jYVNsaWNlUmV3cml0ZXI7CisgIGZyaWVuZCBjbGFzcyBzcm9hOjpTUk9BTGVnYWN5UGFzczsKKworICAvLy8gSGVscGVyIHVzZWQgYnkgYm90aCB0aGUgcHVibGljIHJ1biBtZXRob2QgYW5kIGJ5IHRoZSBsZWdhY3kgcGFzcy4KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuSW1wbChGdW5jdGlvbiAmRiwgRG9taW5hdG9yVHJlZSAmUnVuRFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbkNhY2hlICZSdW5BQyk7CisKKyAgYm9vbCBwcmVzcGxpdExvYWRzQW5kU3RvcmVzKEFsbG9jYUluc3QgJkFJLCBzcm9hOjpBbGxvY2FTbGljZXMgJkFTKTsKKyAgQWxsb2NhSW5zdCAqcmV3cml0ZVBhcnRpdGlvbihBbGxvY2FJbnN0ICZBSSwgc3JvYTo6QWxsb2NhU2xpY2VzICZBUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcm9hOjpQYXJ0aXRpb24gJlApOworICBib29sIHNwbGl0QWxsb2NhKEFsbG9jYUluc3QgJkFJLCBzcm9hOjpBbGxvY2FTbGljZXMgJkFTKTsKKyAgYm9vbCBydW5PbkFsbG9jYShBbGxvY2FJbnN0ICZBSSk7CisgIHZvaWQgY2xvYmJlclVzZShVc2UgJlUpOworICBib29sIGRlbGV0ZURlYWRJbnN0cnVjdGlvbnMoU21hbGxQdHJTZXRJbXBsPEFsbG9jYUluc3QgKj4gJkRlbGV0ZWRBbGxvY2FzKTsKKyAgYm9vbCBwcm9tb3RlQWxsb2NhcyhGdW5jdGlvbiAmRik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9TUk9BX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvU2ltcGxlTG9vcFVuc3dpdGNoLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1NpbXBsZUxvb3BVbnN3aXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYmZlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1NpbXBsZUxvb3BVbnN3aXRjaC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vPT09LSBTaW1wbGVMb29wVW5zd2l0Y2guaCAtIEhvaXN0IGxvb3AtaW52YXJpYW50IGNvbnRyb2wgZmxvdyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9TSU1QTEVMT09QVU5TV0lUQ0hfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1NJTVBMRUxPT1BVTlNXSVRDSF9ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BBbmFseXNpc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFBhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFRoaXMgcGFzcyB0cmFuc2Zvcm1zIGxvb3BzIHRoYXQgY29udGFpbiBicmFuY2hlcyBvbiBsb29wLWludmFyaWFudAorLy8vIGNvbmRpdGlvbnMgdG8gaGF2ZSBtdWx0aXBsZSBsb29wcy4gRm9yIGV4YW1wbGUsIGl0IHR1cm5zIHRoZSBsZWZ0IGludG8gdGhlCisvLy8gcmlnaHQgY29kZToKKy8vLworLy8vICBmb3IgKC4uLikgICAgICAgICAgICAgICAgICBpZiAobGljKQorLy8vICAgIEEgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoLi4uKQorLy8vICAgIGlmIChsaWMpICAgICAgICAgICAgICAgICAgICAgQTsgQjsgQworLy8vICAgICAgQiAgICAgICAgICAgICAgICAgICAgICBlbHNlCisvLy8gICAgQyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICguLi4pCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBOyBDCisvLy8KKy8vLyBUaGlzIGNhbiBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgY29kZSBleHBvbmVudGlhbGx5IChkb3VibGluZyBpdCBldmVyeSB0aW1lCisvLy8gYSBsb29wIGlzIHVuc3dpdGNoZWQpIHNvIHdlIG9ubHkgdW5zd2l0Y2ggaWYgdGhlIHJlc3VsdGFudCBjb2RlIHdpbGwgYmUKKy8vLyBzbWFsbGVyIHRoYW4gYSB0aHJlc2hvbGQuCisvLy8KKy8vLyBUaGlzIHBhc3MgZXhwZWN0cyBMSUNNIHRvIGJlIHJ1biBiZWZvcmUgaXQgdG8gaG9pc3QgaW52YXJpYW50IGNvbmRpdGlvbnMgb3V0CisvLy8gb2YgdGhlIGxvb3AsIHRvIG1ha2UgdGhlIHVuc3dpdGNoaW5nIG9wcG9ydHVuaXR5IG9idmlvdXMuCisvLy8KK2NsYXNzIFNpbXBsZUxvb3BVbnN3aXRjaFBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxTaW1wbGVMb29wVW5zd2l0Y2hQYXNzPiB7CisgIGJvb2wgTm9uVHJpdmlhbDsKKworcHVibGljOgorICBTaW1wbGVMb29wVW5zd2l0Y2hQYXNzKGJvb2wgTm9uVHJpdmlhbCA9IGZhbHNlKSA6IE5vblRyaXZpYWwoTm9uVHJpdmlhbCkge30KKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTG9vcCAmTCwgTG9vcEFuYWx5c2lzTWFuYWdlciAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJkFSLCBMUE1VcGRhdGVyICZVKTsKK307CisKKy8vLyBDcmVhdGUgdGhlIGxlZ2FjeSBwYXNzIG9iamVjdCBmb3IgdGhlIHNpbXBsZSBsb29wIHVuc3dpdGNoZXIuCisvLy8KKy8vLyBTZWUgdGhlIGRvY3VtZW50YWlvbiBmb3IgYFNpbXBsZUxvb3BVbnN3aXRjaFBhc3NgIGZvciBkZXRhaWxzLgorUGFzcyAqY3JlYXRlU2ltcGxlTG9vcFVuc3dpdGNoTGVnYWN5UGFzcyhib29sIE5vblRyaXZpYWwgPSBmYWxzZSk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1NJTVBMRUxPT1BVTlNXSVRDSF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1NpbXBsaWZ5Q0ZHLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1NpbXBsaWZ5Q0ZHLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5ODk1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvU2ltcGxpZnlDRkcuaApAQCAtMCwwICsxLDU1IEBACisvLz09PS0gU2ltcGxpZnlDRkcuaCAtIFNpbXBsaWZ5IGFuZCBjYW5vbmljYWxpemUgdGhlIENGRyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBwYXNzIHJlc3BvbnNpYmxlIGZvciBib3RoCisvLy8gc2ltcGxpZnlpbmcgYW5kIGNhbm9uaWNhbGl6aW5nIHRoZSBDRkcuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9TSU1QTElGWUNGR19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfU0lNUExJRllDRkdfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9VdGlscy9Mb2NhbC5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEEgcGFzcyB0byBzaW1wbGlmeSBhbmQgY2Fub25pY2FsaXplIHRoZSBDRkcgb2YgYSBmdW5jdGlvbi4KKy8vLworLy8vIFRoaXMgcGFzcyBpdGVyYXRpdmVseSBzaW1wbGlmaWVzIHRoZSBlbnRpcmUgQ0ZHIG9mIGEgZnVuY3Rpb24uIEl0IG1heSBjaGFuZ2UKKy8vLyBvciByZW1vdmUgY29udHJvbCBmbG93IHRvIHB1dCB0aGUgQ0ZHIGludG8gYSBjYW5vbmljYWwgZm9ybSBleHBlY3RlZCBieQorLy8vIG90aGVyIHBhc3NlcyBvZiB0aGUgbWlkLWxldmVsIG9wdGltaXplci4gRGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpZWQgb3B0aW9ucywKKy8vLyBpdCBtYXkgZnVydGhlciBvcHRpbWl6ZSBjb250cm9sLWZsb3cgdG8gY3JlYXRlIG5vbi1jYW5vbmljYWwgZm9ybXMuCitjbGFzcyBTaW1wbGlmeUNGR1Bhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxTaW1wbGlmeUNGR1Bhc3M+IHsKKyAgU2ltcGxpZnlDRkdPcHRpb25zIE9wdGlvbnM7CisKK3B1YmxpYzoKKyAgLy8vIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIHNldHMgdGhlIHBhc3Mgb3B0aW9ucyB0byBjcmVhdGUgY2Fub25pY2FsIElSLAorICAvLy8gcmF0aGVyIHRoYW4gb3B0aW1hbCBJUi4gVGhhdCBpcywgYnkgZGVmYXVsdCB3ZSBieXBhc3MgdHJhbnNmb3JtYXRpb25zIHRoYXQKKyAgLy8vIGFyZSBsaWtlbHkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBidXQgbWFrZSBhbmFseXNpcyBmb3Igb3RoZXIgcGFzc2VzIG1vcmUKKyAgLy8vIGRpZmZpY3VsdC4KKyAgU2ltcGxpZnlDRkdQYXNzKCkKKyAgICAgIDogU2ltcGxpZnlDRkdQYXNzKFNpbXBsaWZ5Q0ZHT3B0aW9ucygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcndhcmRTd2l0Y2hDb25kVG9QaGkoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnZlcnRTd2l0Y2hUb0xvb2t1cFRhYmxlKGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZWVkQ2Fub25pY2FsTG9vcHModHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2lua0NvbW1vbkluc3RzKGZhbHNlKSkge30KKworCisgIC8vLyBDb25zdHJ1Y3QgYSBwYXNzIHdpdGggb3B0aW9uYWwgb3B0aW1pemF0aW9ucy4KKyAgU2ltcGxpZnlDRkdQYXNzKGNvbnN0IFNpbXBsaWZ5Q0ZHT3B0aW9ucyAmUGFzc09wdGlvbnMpOworCisgIC8vLyBcYnJpZWYgUnVuIHRoZSBwYXNzIG92ZXIgdGhlIGZ1bmN0aW9uLgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9TaW5rLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1NpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWIzY2IwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9TaW5rLmgKQEAgLTAsMCArMSwzMCBAQAorLy89PT0tLSBTaW5rLmggLSBDb2RlIFNpbmtpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgbW92ZXMgaW5zdHJ1Y3Rpb25zIGludG8gc3VjY2Vzc29yIGJsb2Nrcywgd2hlbiBwb3NzaWJsZSwgc28gdGhhdAorLy8gdGhleSBhcmVuJ3QgZXhlY3V0ZWQgb24gcGF0aHMgd2hlcmUgdGhlaXIgcmVzdWx0cyBhcmVuJ3QgbmVlZGVkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9TSU5LX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9TSU5LX0gKKworI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIE1vdmUgaW5zdHJ1Y3Rpb25zIGludG8gc3VjY2Vzc29yIGJsb2NrcyB3aGVuIHBvc3NpYmxlLgorY2xhc3MgU2lua2luZ1Bhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxTaW5raW5nUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworfQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9TSU5LX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvU3BlY3VsYXRlQXJvdW5kUEhJcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9TcGVjdWxhdGVBcm91bmRQSElzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5ZTAzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvU3BlY3VsYXRlQXJvdW5kUEhJcy5oCkBAIC0wLDAgKzEsMTExIEBACisvLz09PS0gU3BlY3VsYXRlQXJvdW5kUEhJcy5oIC0gU3BlY3VsYXRlIGFyb3VuZCBQSElzIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfU1BFQ1VMQVRFQVJPVU5EUEhJU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfU1BFQ1VMQVRFQVJPVU5EUEhJU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0Fzc3VtcHRpb25DYWNoZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUaGlzIHBhc3MgaGFuZGxlcyBzaW1wbGUgc3BlY3VsYXRpbmcgb2YgIGluc3RydWN0aW9ucyBhcm91bmQgUEhJcyB3aGVuCisvLy8gZG9pbmcgc28gaXMgcHJvZml0YWJsZSBmb3IgYSBwYXJ0aWN1bGFyIHRhcmdldCBkZXNwaXRlIGR1cGxpY2F0ZWQKKy8vLyBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBUaGUgbW90aXZhdGluZyBleGFtcGxlIGFyZSBQSElzIG9mIGNvbnN0YW50cyB3aGljaCB3aWxsIHJlcXVpcmUKKy8vLyBtYXRlcmlhbGl6aW5nIHRoZSBjb25zdGFudHMgYWxvbmcgZWFjaCBlZGdlLiBJZiB0aGUgUEhJIGlzIHVzZWQgYnkgYW4KKy8vLyBpbnN0cnVjdGlvbiB3aGVyZSB0aGUgdGFyZ2V0IGNhbiBtYXRlcmlhbGl6ZSB0aGUgY29uc3RhbnQgYXMgcGFydCBvZiB0aGUKKy8vLyBpbnN0cnVjdGlvbiwgaXQgaXMgcHJvZml0YWJsZSB0byBzcGVjdWxhdGUgdGhvc2UgaW5zdHJ1Y3Rpb25zIGFyb3VuZCB0aGUKKy8vLyBQSEkgbm9kZS4gVGhpcyBjYW4gcmVkdWNlIGR5bmFtaWMgaW5zdHJ1Y3Rpb24gY291bnQgYXMgd2VsbCBhcyBkZWNyZWFzZQorLy8vIHJlZ2lzdGVyIHByZXNzdXJlLgorLy8vCisvLy8gQ29uc2lkZXIgdGhpcyBJUiBmb3IgZXhhbXBsZToKKy8vLyAgIGBgYAorLy8vICAgZW50cnk6CisvLy8gICAgIGJyIGkxICVmbGFnLCBsYWJlbCAlYSwgbGFiZWwgJWIKKy8vLworLy8vICAgYToKKy8vLyAgICAgYnIgbGFiZWwgJWV4aXQKKy8vLworLy8vICAgYjoKKy8vLyAgICAgYnIgbGFiZWwgJWV4aXQKKy8vLworLy8vICAgZXhpdDoKKy8vLyAgICAgJXAgPSBwaGkgaTMyIFsgNywgJWEgXSwgWyAxMSwgJWIgXQorLy8vICAgICAlc3VtID0gYWRkIGkzMiAlYXJnLCAlcAorLy8vICAgICByZXQgaTMyICVzdW0KKy8vLyAgIGBgYAorLy8vIFRvIG1hdGVyaWFsaXplIHRoZSBpbnB1dHMgdG8gdGhpcyBQSEkgbm9kZSBtYXkgcmVxdWlyZSBhbiBleHBsaWNpdAorLy8vIGluc3RydWN0aW9uLiBGb3IgZXhhbXBsZSwgb24geDg2IHRoaXMgd291bGQgdHVybiBpbnRvIHNvbWV0aGluZyBsaWtlCisvLy8gICBgYGAKKy8vLyAgICAgdGVzdHEgJWVheCwgJWVheAorLy8vICAgICBtb3ZsICQ3LCAlck5OCisvLy8gICAgIGpuZSAuTAorLy8vICAgICBtb3ZsICQxMSwgJXJOTgorLy8vICAgLkw6CisvLy8gICAgIGFkZGwgJWVkaSwgJXJOTgorLy8vICAgICBtb3ZsICVyTk4sICVlYXgKKy8vLyAgICAgcmV0cQorLy8vICAgYGBgCisvLy8gV2hlbiB0aGVzZSBjb25zdGFudHMgY2FuIGJlIGZvbGRlZCBkaXJlY3RseSBpbnRvIGFub3RoZXIgaW5zdHJ1Y3Rpb24sIGl0CisvLy8gd291bGQgYmUgcHJlZmVyYWJsZSB0byBhdm9pZCB0aGUgcG90ZW50aWFsIGZvciByZWdpc3RlciBwcmVzc3VyZSAoYWJvdmUgd2UKKy8vLyBjYW4gZWFzaWx5IGF2b2lkIGl0LCBidXQgdGhhdCBpc24ndCBhbHdheXMgdHJ1ZSkgYW5kIHNpbXBseSBkdXBsaWNhdGUgdGhlCisvLy8gaW5zdHJ1Y3Rpb24gdXNpbmcgdGhlIFBISToKKy8vLyAgIGBgYAorLy8vICAgZW50cnk6CisvLy8gICAgIGJyIGkxICVmbGFnLCBsYWJlbCAlYSwgbGFiZWwgJWIKKy8vLworLy8vICAgYToKKy8vLyAgICAgJXN1bS4xID0gYWRkIGkzMiAlYXJnLCA3CisvLy8gICAgIGJyIGxhYmVsICVleGl0CisvLy8KKy8vLyAgIGI6CisvLy8gICAgICVzdW0uMiA9IGFkZCBpMzIgJWFyZywgMTEKKy8vLyAgICAgYnIgbGFiZWwgJWV4aXQKKy8vLworLy8vICAgZXhpdDoKKy8vLyAgICAgJXAgPSBwaGkgaTMyIFsgJXN1bS4xLCAlYSBdLCBbICVzdW0uMiwgJWIgXQorLy8vICAgICByZXQgaTMyICVwCisvLy8gICBgYGAKKy8vLyBXaGljaCB3aWxsIGdlbmVyYXRlIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgb24geDg2OgorLy8vICAgYGBgCisvLy8gICAgIHRlc3RxICVlYXgsICVlYXgKKy8vLyAgICAgYWRkbCAkNywgJWVkaQorLy8vICAgICBqbmUgLkwKKy8vLyAgICAgYWRkbCAkMTEsICVlZGkKKy8vLyAgIC5MOgorLy8vICAgICBtb3ZsICVlZGksICVlYXgKKy8vLyAgICAgcmV0cQorLy8vICAgYGBgCisvLy8KKy8vLyBJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoaXMgcGFzcyBpcyBuZXZlciBpbnRlbmRlZCB0byBoYW5kbGUgbW9yZQorLy8vIGNvbXBsZXggY2FzZXMgd2hlcmUgc3BlY3VsYXRpbmcgYXJvdW5kIFBISXMgYWxsb3dzIHNpbXBsaWZpY2F0aW9ucyBvZiB0aGUKKy8vLyBJUiBpdHNlbGYgb3Igb3RoZXIgc3Vic2VxdWVudCBvcHRpbWl6YXRpb25zLiBUaG9zZSBjYW4gYW5kIHNob3VsZCBhbHJlYWR5CisvLy8gYmUgaGFuZGxlZCBiZWZvcmUgdGhpcyBwYXNzIGlzIGV2ZXIgcnVuIGJ5IGEgbW9yZSBwb3dlcmZ1bCBhbmFseXNpcyB0aGF0CisvLy8gY2FuIHJlYXNvbiBhYm91dCBlcXVpdmFsZW5jZXMgYW5kIGNvbW1vbiBzdWJleHByZXNzaW9ucy4gQ2xhc3NpY2FsbHksIHRob3NlCisvLy8gY2FzZXMgd291bGQgYmUgaGFuZGxlZCBieSBhIEdWTi1wb3dlcmVkIFBSRSBvciBzaW1pbGFyIHRyYW5zZm9ybS4gVGhpcworLy8vIHBhc3MsIGluIGNvbnRyYXN0LCBpcyAqb25seSogaW50ZXJlc3RlZCBpbiBjYXNlcyB3aGVyZSBkZXNwaXRlIG5vCisvLy8gc2ltcGxpZmljYXRpb25zIHRvIHRoZSBJUiBpdHNlbGYsIHNwZWN1bGF0aW9uIGlzICpmYXN0ZXIqIHRvIGV4ZWN1dGUuIFRoZQorLy8vIHJlc3VsdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGNvc3QgbW9kZWxzIHdoaWNoIGFyZSBhcHByb3ByaWF0ZSB0byBjb25zaWRlcgorLy8vIGhlcmUgYXJlIHJlbGF0aXZlbHkgc2ltcGxlIG9uZXMgYXJvdW5kIGV4ZWN1dGlvbiBhbmQgY29kZXNpemUgY29zdCwgd2l0aG91dAorLy8vIGFueSBuZWVkIHRvIGNvbnNpZGVyIHNpbXBsaWZpY2F0aW9ucyBvciBvdGhlciB0cmFuc2Zvcm1hdGlvbnMuCitzdHJ1Y3QgU3BlY3VsYXRlQXJvdW5kUEhJc1Bhc3MgOiBQYXNzSW5mb01peGluPFNwZWN1bGF0ZUFyb3VuZFBISXNQYXNzPiB7CisgIC8vLyBcYnJpZWYgUnVuIHRoZSBwYXNzIG92ZXIgdGhlIGZ1bmN0aW9uLgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9TUEVDVUxBVEVBUk9VTkRQSElTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvU3BlY3VsYXRpdmVFeGVjdXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvU3BlY3VsYXRpdmVFeGVjdXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjhmODE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9TcGVjdWxhdGl2ZUV4ZWN1dGlvbi5oCkBAIC0wLDAgKzEsOTIgQEAKKy8vPT09LSBTcGVjdWxhdGl2ZUV4ZWN1dGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGhvaXN0cyBpbnN0cnVjdGlvbnMgdG8gZW5hYmxlIHNwZWN1bGF0aXZlIGV4ZWN1dGlvbiBvbgorLy8gdGFyZ2V0cyB3aGVyZSBicmFuY2hlcyBhcmUgZXhwZW5zaXZlLiBUaGlzIGlzIGFpbWVkIGF0IEdQVXMuIEl0CisvLyBjdXJyZW50bHkgd29ya3Mgb24gc2ltcGxlIGlmLXRoZW4gYW5kIGlmLXRoZW4tZWxzZQorLy8gcGF0dGVybnMuCisvLworLy8gUmVtb3ZpbmcgYnJhbmNoZXMgaXMgbm90IHRoZSBvbmx5IG1vdGl2YXRpb24gZm9yIHRoaXMKKy8vIHBhc3MuIEUuZy4gY29uc2lkZXIgdGhpcyBjb2RlIGFuZCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBubworLy8gYWRkcmVzc2luZyBtb2RlIGZvciBtdWx0aXBseWluZyBieSBzaXplb2YoKmEpOgorLy8KKy8vICAgaWYgKGIgPiAwKQorLy8gICAgIGMgPSBhW2kgKyAxXQorLy8gICBpZiAoZCA+IDApCisvLyAgICAgZSA9IGFbaSArIDJdCisvLworLy8gdHVybnMgaW50bworLy8KKy8vICAgcCA9ICZhW2kgKyAxXTsKKy8vICAgaWYgKGIgPiAwKQorLy8gICAgIGMgPSAqcDsKKy8vICAgcSA9ICZhW2kgKyAyXTsKKy8vICAgaWYgKGQgPiAwKQorLy8gICAgIGUgPSAqcTsKKy8vCisvLyB3aGljaCBjb3VsZCBsYXRlciBiZSBvcHRpbWl6ZWQgdG8KKy8vCisvLyAgIHIgPSAmYVtpXTsKKy8vICAgaWYgKGIgPiAwKQorLy8gICAgIGMgPSByWzFdOworLy8gICBpZiAoZCA+IDApCisvLyAgICAgZSA9IHJbMl07CisvLworLy8gTGF0ZXIgcGFzc2VzIHNpbmsgYmFjayBtdWNoIG9mIHRoZSBzcGVjdWxhdGVkIGNvZGUgdGhhdCBkaWQgbm90IGVuYWJsZQorLy8gZnVydGhlciBvcHRpbWl6YXRpb24uCisvLworLy8gVGhpcyBwYXNzIGlzIG1vcmUgYWdncmVzc2l2ZSB0aGFuIHRoZSBmdW5jdGlvbiBTcGVjdWxhdGl2ZXlFeGVjdXRlQkIgaW4KKy8vIFNpbXBsaWZ5Q0ZHLiBTaW1wbGlmeUNGRyB3aWxsIG5vdCBzcGVjdWxhdGUgaWYgbm8gc2VsZWN0cyBhcmUgaW50cm9kdWNlZCBhbmQKKy8vIGl0IHdpbGwgc3BlY3VsYXRlIGF0IG1vc3Qgb25lIGluc3RydWN0aW9uLiBJdCBhbHNvIHdpbGwgbm90IHNwZWN1bGF0ZSBpZgorLy8gdGhlcmUgaXMgYSB2YWx1ZSBkZWZpbmVkIGluIHRoZSBpZi1ibG9jayB0aGF0IGlzIG9ubHkgdXNlZCBpbiB0aGUgdGhlbi1ibG9jay4KKy8vIFRoZXNlIHJlc3RyaWN0aW9ucyBtYWtlIHNlbnNlIHNpbmNlIHRoZSBzcGVjdWxhdGlvbiBpbiBTaW1wbGlmeUNGRyBzZWVtcworLy8gYWltZWQgYXQgaW50cm9kdWNpbmcgY2hlYXAgc2VsZWN0cywgd2hpbGUgdGhpcyBwYXNzIGlzIGludGVuZGVkIHRvIGRvIG1vcmUKKy8vIGFnZ3Jlc3NpdmUgc3BlY3VsYXRpb24gd2hpbGUgY291bnRpbmcgb24gbGF0ZXIgcGFzc2VzIHRvIGVpdGhlciBjYXBpdGFsaXplIG9uCisvLyB0aGF0IG9yIGNsZWFuIGl0IHVwLgorLy8KKy8vIElmIHRoZSBwYXNzIHdhcyBjcmVhdGVkIGJ5IGNhbGxpbmcKKy8vIGNyZWF0ZVNwZWN1bGF0aXZlRXhlY3V0aW9uSWZIYXNCcmFuY2hEaXZlcmdlbmNlUGFzcyBvciB0aGUKKy8vIC1zcGVjLWV4ZWMtb25seS1pZi1kaXZlcmdlbnQtdGFyZ2V0IG9wdGlvbiBpcyBwcmVzZW50LCB0aGlzIHBhc3Mgb25seSBoYXMgYW4KKy8vIGVmZmVjdCBvbiB0YXJnZXRzIHdoZXJlIFRhcmdldFRyYW5zZm9ybUluZm86Omhhc0JyYW5jaERpdmVyZ2VuY2UoKSBpcyB0cnVlOworLy8gb24gb3RoZXIgdGFyZ2V0cywgaXQgaXMgYSBub3AuCisvLworLy8gVGhpcyBsZXRzIHlvdSBpbmNsdWRlIHRoaXMgcGFzcyB1bmNvbmRpdGlvbmFsbHkgaW4gdGhlIElSIHBhc3MgcGlwZWxpbmUsIGJ1dAorLy8gb25seSBlbmFibGUgaXQgZm9yIHJlbGV2YW50IHRhcmdldHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9TUEVDVUxBVElWRUVYRUNVVElPTl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfU1BFQ1VMQVRJVkVFWEVDVVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9UYXJnZXRUcmFuc2Zvcm1JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBTcGVjdWxhdGl2ZUV4ZWN1dGlvblBhc3MKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPFNwZWN1bGF0aXZlRXhlY3V0aW9uUGFzcz4geworcHVibGljOgorICBTcGVjdWxhdGl2ZUV4ZWN1dGlvblBhc3MoYm9vbCBPbmx5SWZEaXZlcmdlbnRUYXJnZXQgPSBmYWxzZSk7CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworCisgIC8vIEdsdWUgZm9yIG9sZCBQTQorICBib29sIHJ1bkltcGwoRnVuY3Rpb24gJkYsIFRhcmdldFRyYW5zZm9ybUluZm8gKlRUSSk7CisKK3ByaXZhdGU6CisgIGJvb2wgcnVuT25CYXNpY0Jsb2NrKEJhc2ljQmxvY2sgJkIpOworICBib29sIGNvbnNpZGVySG9pc3RpbmdGcm9tVG8oQmFzaWNCbG9jayAmRnJvbUJsb2NrLCBCYXNpY0Jsb2NrICZUb0Jsb2NrKTsKKworICAvLyBJZiB0cnVlLCB0aGlzIHBhc3MgaXMgYSBub3AgdW5sZXNzIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGhhcyBicmFuY2gKKyAgLy8gZGl2ZXJnZW5jZS4gIAorICBjb25zdCBib29sIE9ubHlJZkRpdmVyZ2VudFRhcmdldCA9IGZhbHNlOworCisgIFRhcmdldFRyYW5zZm9ybUluZm8gKlRUSSA9IG51bGxwdHI7Cit9OworfQorCisjZW5kaWYgLy9MTFZNX1RSQU5TRk9STVNfU0NBTEFSX1NQRUNVTEFUSVZFRVhFQ1VUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvVGFpbFJlY3Vyc2lvbkVsaW1pbmF0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1RhaWxSZWN1cnNpb25FbGltaW5hdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5M2Y5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1RhaWxSZWN1cnNpb25FbGltaW5hdGlvbi5oCkBAIC0wLDAgKzEsNjYgQEAKKy8vPT09LS0tLSBUYWlsUmVjdXJzaW9uRWxpbWluYXRpb24uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHRyYW5zZm9ybXMgY2FsbHMgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24gKHNlbGYgcmVjdXJzaW9uKSBmb2xsb3dlZAorLy8gYnkgYSByZXR1cm4gaW5zdHJ1Y3Rpb24gd2l0aCBhIGJyYW5jaCB0byB0aGUgZW50cnkgb2YgdGhlIGZ1bmN0aW9uLCBjcmVhdGluZworLy8gYSBsb29wLiAgVGhpcyBwYXNzIGFsc28gaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIGV4dGVuc2lvbnMgdG8gdGhlIGJhc2ljCisvLyBhbGdvcml0aG06CisvLworLy8gIDEuIFRyaXZpYWwgaW5zdHJ1Y3Rpb25zIGJldHdlZW4gdGhlIGNhbGwgYW5kIHJldHVybiBkbyBub3QgcHJldmVudCB0aGUKKy8vICAgICB0cmFuc2Zvcm1hdGlvbiBmcm9tIHRha2luZyBwbGFjZSwgdGhvdWdoIGN1cnJlbnRseSB0aGUgYW5hbHlzaXMgY2Fubm90CisvLyAgICAgc3VwcG9ydCBtb3ZpbmcgYW55IHJlYWxseSB1c2VmdWwgaW5zdHJ1Y3Rpb25zIChvbmx5IGRlYWQgb25lcykuCisvLyAgMi4gVGhpcyBwYXNzIHRyYW5zZm9ybXMgZnVuY3Rpb25zIHRoYXQgYXJlIHByZXZlbnRlZCBmcm9tIGJlaW5nIHRhaWwKKy8vICAgICByZWN1cnNpdmUgYnkgYW4gYXNzb2NpYXRpdmUgYW5kIGNvbW11dGF0aXZlIGV4cHJlc3Npb24gdG8gdXNlIGFuCisvLyAgICAgYWNjdW11bGF0b3IgdmFyaWFibGUsIHRodXMgY29tcGlsaW5nIHRoZSB0eXBpY2FsIG5haXZlIGZhY3RvcmlhbCBvcgorLy8gICAgICdmaWInIGltcGxlbWVudGF0aW9uIGludG8gZWZmaWNpZW50IGNvZGUuCisvLyAgMy4gVFJFIGlzIHBlcmZvcm1lZCBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucyB2b2lkLCBpZiB0aGUgcmV0dXJuCisvLyAgICAgcmV0dXJucyB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBjYWxsLCBvciBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBhCisvLyAgICAgcnVuLXRpbWUgY29uc3RhbnQgb24gYWxsIGV4aXRzIGZyb20gdGhlIGZ1bmN0aW9uLiAgSXQgaXMgcG9zc2libGUsIHRob3VnaAorLy8gICAgIHVubGlrZWx5LCB0aGF0IHRoZSByZXR1cm4gcmV0dXJucyBzb21ldGhpbmcgZWxzZSAobGlrZSBjb25zdGFudCAwKSwgYW5kCisvLyAgICAgY2FuIHN0aWxsIGJlIFRSRSdkLiAgSXQgY2FuIGJlIFRSRSdkIGlmIEFMTCBPVEhFUiByZXR1cm4gaW5zdHJ1Y3Rpb25zIGluCisvLyAgICAgdGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgZXhhY3Qgc2FtZSB2YWx1ZS4KKy8vICA0LiBJZiBpdCBjYW4gcHJvdmUgdGhhdCBjYWxsZWVzIGRvIG5vdCBhY2Nlc3MgdGhlaXIgY2FsbGVyIHN0YWNrIGZyYW1lLAorLy8gICAgIHRoZXkgYXJlIG1hcmtlZCBhcyBlbGlnaWJsZSBmb3IgdGFpbCBjYWxsIGVsaW1pbmF0aW9uIChieSB0aGUgY29kZQorLy8gICAgIGdlbmVyYXRvcikuCisvLworLy8gVGhlcmUgYXJlIHNldmVyYWwgaW1wcm92ZW1lbnRzIHRoYXQgY291bGQgYmUgbWFkZToKKy8vCisvLyAgMS4gSWYgdGhlIGZ1bmN0aW9uIGhhcyBhbnkgYWxsb2NhIGluc3RydWN0aW9ucywgdGhlc2UgaW5zdHJ1Y3Rpb25zIHdpbGwgYmUKKy8vICAgICBtb3ZlZCBvdXQgb2YgdGhlIGVudHJ5IGJsb2NrIG9mIHRoZSBmdW5jdGlvbiwgY2F1c2luZyB0aGVtIHRvIGJlCisvLyAgICAgZXZhbHVhdGVkIGVhY2ggdGltZSB0aHJvdWdoIHRoZSB0YWlsIHJlY3Vyc2lvbi4gIFNhZmVseSBrZWVwaW5nIGFsbG9jYXMKKy8vICAgICBpbiB0aGUgZW50cnkgYmxvY2sgcmVxdWlyZXMgYW5hbHlzaXMgdG8gcHJvdmVzIHRoYXQgdGhlIHRhaWwtY2FsbGVkCisvLyAgICAgZnVuY3Rpb24gZG9lcyBub3QgcmVhZCBvciB3cml0ZSB0aGUgc3RhY2sgb2JqZWN0LgorLy8gIDIuIFRhaWwgcmVjdXJzaW9uIGlzIG9ubHkgcGVyZm9ybWVkIGlmIHRoZSBjYWxsIGltbWVkaWF0ZWx5IHByZWNlZGVzIHRoZQorLy8gICAgIHJldHVybiBpbnN0cnVjdGlvbi4gIEl0J3MgcG9zc2libGUgdGhhdCB0aGVyZSBjb3VsZCBiZSBhIGp1bXAgYmV0d2VlbgorLy8gICAgIHRoZSBjYWxsIGFuZCB0aGUgcmV0dXJuLgorLy8gIDMuIFRoZXJlIGNhbiBiZSBpbnRlcnZlbmluZyBvcGVyYXRpb25zIGJldHdlZW4gdGhlIGNhbGwgYW5kIHRoZSByZXR1cm4gdGhhdAorLy8gICAgIHByZXZlbnQgdGhlIFRSRSBmcm9tIG9jY3VycmluZy4gIEZvciBleGFtcGxlLCB0aGVyZSBjb3VsZCBiZSBHRVAncyBhbmQKKy8vICAgICBzdG9yZXMgdG8gbWVtb3J5IHRoYXQgd2lsbCBub3QgYmUgcmVhZCBvciB3cml0dGVuIGJ5IHRoZSBjYWxsLiAgVGhpcworLy8gICAgIHJlcXVpcmVzIHNvbWUgc3Vic3RhbnRpYWwgYW5hbHlzaXMgKHN1Y2ggYXMgd2l0aCBEU0EpIHRvIHByb3ZlIHNhZmUgdG8KKy8vICAgICBtb3ZlIGFoZWFkIG9mIHRoZSBjYWxsLCBidXQgZG9pbmcgc28gY291bGQgYWxsb3cgbWFueSBtb3JlIFRSRXMgdG8gYmUKKy8vICAgICBwZXJmb3JtZWQsIGZvciBleGFtcGxlIGluIFRyZWVBZGQvVHJlZUFsbG9jIGZyb20gdGhlIHRyZWVhZGQgYmVuY2htYXJrLgorLy8gIDQuIFRoZSBhbGdvcml0aG0gd2UgdXNlIHRvIGRldGVjdCBpZiBjYWxsZWVzIGFjY2VzcyB0aGVpciBjYWxsZXIgc3RhY2sKKy8vICAgICBmcmFtZXMgaXMgdmVyeSBwcmltaXRpdmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1RBSUxSRUNVUlNJT05FTElNSU5BVElPTl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfVEFJTFJFQ1VSU0lPTkVMSU1JTkFUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworc3RydWN0IFRhaWxDYWxsRWxpbVBhc3MgOiBQYXNzSW5mb01peGluPFRhaWxDYWxsRWxpbVBhc3M+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKK30KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfVEFJTFJFQ1VSU0lPTkVMSU1JTkFUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiODlkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy5oCkBAIC0wLDAgKzEsMTI1IEBACisvLz09PS0gbGx2bS9UcmFuc2Zvcm1zL1V0aWxzLmggLSBVdGlsaXR5IFRyYW5zZm9ybWF0aW9ucyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyBwcm90b3R5cGVzIGZvciBhY2Nlc3NvciBmdW5jdGlvbnMgdGhhdCBleHBvc2UgcGFzc2VzCisvLyBpbiB0aGUgVXRpbHMgdHJhbnNmb3JtYXRpb25zIGxpYnJhcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfSAorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZVBhc3M7CitjbGFzcyBGdW5jdGlvblBhc3M7CitjbGFzcyBQYXNzOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gY3JlYXRlTWV0YVJlbmFtZXJQYXNzIC0gUmVuYW1lIGV2ZXJ5dGhpbmcgd2l0aCBtZXRhc3ludGF0aWMgbmFtZXMuCisvLworTW9kdWxlUGFzcyAqY3JlYXRlTWV0YVJlbmFtZXJQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG93ZXJJbnZva2UgLSBUaGlzIHBhc3MgcmVtb3ZlcyBpbnZva2UgaW5zdHJ1Y3Rpb25zLCBjb252ZXJ0aW5nIHRoZW0gdG8gY2FsbAorLy8gaW5zdHJ1Y3Rpb25zLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlTG93ZXJJbnZva2VQYXNzKCk7CitleHRlcm4gY2hhciAmTG93ZXJJbnZva2VQYXNzSUQ7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gSW5zdHJ1Y3Rpb25OYW1lciAtIEdpdmUgYW55IHVubmFtZWQgbm9uLXZvaWQgaW5zdHJ1Y3Rpb25zICJ0bXAiIG5hbWVzLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlSW5zdHJ1Y3Rpb25OYW1lclBhc3MoKTsKK2V4dGVybiBjaGFyICZJbnN0cnVjdGlvbk5hbWVySUQ7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG93ZXJTd2l0Y2ggLSBUaGlzIHBhc3MgY29udmVydHMgU3dpdGNoSW5zdCBpbnN0cnVjdGlvbnMgaW50byBhIHNlcXVlbmNlIG9mCisvLyBjaGFpbmVkIGJpbmFyeSBicmFuY2ggaW5zdHJ1Y3Rpb25zLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlTG93ZXJTd2l0Y2hQYXNzKCk7CitleHRlcm4gY2hhciAmTG93ZXJTd2l0Y2hJRDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBFbnRyeUV4aXRJbnN0cnVtZW50ZXIgcGFzcyAtIEluc3RydW1lbnQgZnVuY3Rpb24gZW50cnkvZXhpdCB3aXRoIGNhbGxzIHRvCisvLyBtY291bnQoKSwgQF9fY3lnX3Byb2ZpbGVfZnVuY197ZW50ZXIsZXhpdH0gYW5kIHRoZSBsaWtlLiBUaGVyZSBhcmUgdHdvCisvLyB2YXJpYW50cywgaW50ZW5kZWQgdG8gcnVuIHByZS0gYW5kIHBvc3QtaW5saW5pbmcsIHJlc3BlY3RpdmVseS4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUVudHJ5RXhpdEluc3RydW1lbnRlclBhc3MoKTsKK0Z1bmN0aW9uUGFzcyAqY3JlYXRlUG9zdElubGluZUVudHJ5RXhpdEluc3RydW1lbnRlclBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBCcmVha0NyaXRpY2FsRWRnZXMgLSBCcmVhayBhbGwgb2YgdGhlIGNyaXRpY2FsIGVkZ2VzIGluIHRoZSBDRkcgYnkgaW5zZXJ0aW5nCisvLyBhIGR1bW15IGJhc2ljIGJsb2NrLiBUaGlzIHBhc3MgbWF5IGJlICJyZXF1aXJlZCIgYnkgcGFzc2VzIHRoYXQgY2Fubm90IGRlYWwKKy8vIHdpdGggY3JpdGljYWwgZWRnZXMuIEZvciB0aGlzIHVzYWdlLCBhIHBhc3MgbXVzdCBjYWxsOgorLy8KKy8vICAgQVUuYWRkUmVxdWlyZWRJRChCcmVha0NyaXRpY2FsRWRnZXNJRCk7CisvLworLy8gVGhpcyBwYXNzIG9idmlvdXNseSBpbnZhbGlkYXRlcyB0aGUgQ0ZHLCBidXQgY2FuIHVwZGF0ZSBmb3J3YXJkIGRvbWluYXRvcgorLy8gKHNldCwgaW1tZWRpYXRlIGRvbWluYXRvcnMsIHRyZWUsIGFuZCBmcm9udGllcikgaW5mb3JtYXRpb24uCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVCcmVha0NyaXRpY2FsRWRnZXNQYXNzKCk7CitleHRlcm4gY2hhciAmQnJlYWtDcml0aWNhbEVkZ2VzSUQ7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTENTU0EgLSBUaGlzIHBhc3MgaW5zZXJ0cyBwaGkgbm9kZXMgYXQgbG9vcCBib3VuZGFyaWVzIHRvIHNpbXBsaWZ5IG90aGVyIGxvb3AKKy8vIG9wdGltaXphdGlvbnMuCisvLworUGFzcyAqY3JlYXRlTENTU0FQYXNzKCk7CitleHRlcm4gY2hhciAmTENTU0FJRDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBBZGREaXNjcmltaW5hdG9ycyAtIEFkZCBEV0FSRiBwYXRoIGRpc2NyaW1pbmF0b3JzIHRvIHRoZSBJUi4KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlQWRkRGlzY3JpbWluYXRvcnNQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gUHJvbW90ZU1lbW9yeVRvUmVnaXN0ZXIgLSBUaGlzIHBhc3MgaXMgdXNlZCB0byBwcm9tb3RlIG1lbW9yeSByZWZlcmVuY2VzIHRvCisvLyBiZSByZWdpc3RlciByZWZlcmVuY2VzLiBBIHNpbXBsZSBleGFtcGxlIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBwZXJmb3JtZWQgYnkKKy8vIHRoaXMgcGFzcyBpczoKKy8vCisvLyAgICAgICAgRlJPTSBDT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgVE8gQ09ERQorLy8gICAlWCA9IGFsbG9jYSBpMzIsIGkzMiAxICAgICAgICAgICAgICAgICByZXQgaTMyIDQyCisvLyAgIHN0b3JlIGkzMiA0MiwgaTMyIColWAorLy8gICAlWSA9IGxvYWQgaTMyKiAlWAorLy8gICByZXQgaTMyICVZCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVQcm9tb3RlTWVtb3J5VG9SZWdpc3RlclBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb29wU2ltcGxpZnkgLSBJbnNlcnQgUHJlLWhlYWRlciBibG9ja3MgaW50byB0aGUgQ0ZHIGZvciBldmVyeSBmdW5jdGlvbiBpbgorLy8gdGhlIG1vZHVsZS4gIFRoaXMgcGFzcyB1cGRhdGVzIGRvbWluYXRvciBpbmZvcm1hdGlvbiwgbG9vcCBpbmZvcm1hdGlvbiwgYW5kCisvLyBkb2VzIG5vdCBhZGQgY3JpdGljYWwgZWRnZXMgdG8gdGhlIENGRy4KKy8vCisvLyAgIEFVLmFkZFJlcXVpcmVkSUQoTG9vcFNpbXBsaWZ5SUQpOworLy8KK1Bhc3MgKmNyZWF0ZUxvb3BTaW1wbGlmeVBhc3MoKTsKK2V4dGVybiBjaGFyICZMb29wU2ltcGxpZnlJRDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJbnN0cnVjdGlvblNpbXBsaWZpZXIgLSBSZW1vdmUgcmVkdW5kYW50IGluc3RydWN0aW9ucy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUluc3RydWN0aW9uU2ltcGxpZmllclBhc3MoKTsKK2V4dGVybiBjaGFyICZJbnN0cnVjdGlvblNpbXBsaWZpZXJJRDsKKworLy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5ldyBwYXNzIHRoYXQgZG93bmdyYWRlcyB0aGUgZGVidWcgaW5mbyBpbiB0aGUKKy8vLyBtb2R1bGUgdG8gbGluZSB0YWJsZXMgb25seS4KK01vZHVsZVBhc3MgKmNyZWF0ZVN0cmlwTm9uTGluZVRhYmxlRGVidWdJbmZvUGFzcygpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9BU2FuU3RhY2tGcmFtZUxheW91dC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0FTYW5TdGFja0ZyYW1lTGF5b3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhZDA2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9BU2FuU3RhY2tGcmFtZUxheW91dC5oCkBAIC0wLDAgKzEsODEgQEAKKy8vPT09LSBBU2FuU3RhY2tGcmFtZUxheW91dC5oIC0gQ29tcHV0ZUFTYW5TdGFja0ZyYW1lTGF5b3V0IC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyBDb21wdXRlQVNhblN0YWNrRnJhbWVMYXlvdXQgYW5kIGF1eGlsaWFyeSBkYXRhIHN0cnVjdHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0FTQU5TVEFDS0ZSQU1FTEFZT1VUX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0FTQU5TVEFDS0ZSQU1FTEFZT1VUX0gKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQWxsb2NhSW5zdDsKKworLy8gVGhlc2UgbWFnaWMgY29uc3RhbnRzIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBpbgorLy8gaW4gYXNhbl9pbnRlcm5hbC5oIGZyb20gQVNhbiBydW50aW1lIGluIGNvbXBpbGVyLXJ0Lgorc3RhdGljIGNvbnN0IGludCBrQXNhblN0YWNrTGVmdFJlZHpvbmVNYWdpYyA9IDB4ZjE7CitzdGF0aWMgY29uc3QgaW50IGtBc2FuU3RhY2tNaWRSZWR6b25lTWFnaWMgPSAweGYyOworc3RhdGljIGNvbnN0IGludCBrQXNhblN0YWNrUmlnaHRSZWR6b25lTWFnaWMgPSAweGYzOworc3RhdGljIGNvbnN0IGludCBrQXNhblN0YWNrVXNlQWZ0ZXJSZXR1cm5NYWdpYyA9IDB4ZjU7CitzdGF0aWMgY29uc3QgaW50IGtBc2FuU3RhY2tVc2VBZnRlclNjb3BlTWFnaWMgPSAweGY4OworCisvLyBJbnB1dC9vdXRwdXQgZGF0YSBzdHJ1Y3QgZm9yIENvbXB1dGVBU2FuU3RhY2tGcmFtZUxheW91dC4KK3N0cnVjdCBBU2FuU3RhY2tWYXJpYWJsZURlc2NyaXB0aW9uIHsKKyAgY29uc3QgY2hhciAqTmFtZTsgICAgLy8gTmFtZSBvZiB0aGUgdmFyaWFibGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBieSBhc2FuCisgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGEgc3RhY2stcmVsYXRlZCBidWcgaXMgcmVwb3J0ZWQuCisgIHVpbnQ2NF90IFNpemU7ICAgICAgIC8vIFNpemUgb2YgdGhlIHZhcmlhYmxlIGluIGJ5dGVzLgorICBzaXplX3QgTGlmZXRpbWVTaXplOyAvLyBTaXplIGluIGJ5dGVzIHRvIHVzZSBmb3IgbGlmZXRpbWUgYW5hbHlzaXMgY2hlY2suCisgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpbGwgYmUgcm91bmRlZCB1cCB0byBHcmFudWxhcml0eS4KKyAgc2l6ZV90IEFsaWdubWVudDsgICAgLy8gQWxpZ25tZW50IG9mIHRoZSB2YXJpYWJsZSAocG93ZXIgb2YgMikuCisgIEFsbG9jYUluc3QgKkFJOyAgICAgIC8vIFRoZSBhY3R1YWwgQWxsb2NhSW5zdC4KKyAgc2l6ZV90IE9mZnNldDsgICAgICAgLy8gT2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZnJhbWU7CisgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBieSBDb21wdXRlQVNhblN0YWNrRnJhbWVMYXlvdXQuCisgIHVuc2lnbmVkIExpbmU7ICAgICAgIC8vIExpbmUgbnVtYmVyLgorfTsKKworLy8gT3V0cHV0IGRhdGEgc3RydWN0IGZvciBDb21wdXRlQVNhblN0YWNrRnJhbWVMYXlvdXQuCitzdHJ1Y3QgQVNhblN0YWNrRnJhbWVMYXlvdXQgeworICBzaXplX3QgR3JhbnVsYXJpdHk7ICAgICAvLyBTaGFkb3cgZ3JhbnVsYXJpdHkuCisgIHNpemVfdCBGcmFtZUFsaWdubWVudDsgIC8vIEFsaWdubWVudCBmb3IgdGhlIGVudGlyZSBmcmFtZS4KKyAgc2l6ZV90IEZyYW1lU2l6ZTsgICAgICAgLy8gU2l6ZSBvZiB0aGUgZnJhbWUgaW4gYnl0ZXMuCit9OworCitBU2FuU3RhY2tGcmFtZUxheW91dCBDb21wdXRlQVNhblN0YWNrRnJhbWVMYXlvdXQoCisgICAgLy8gVGhlIGFycmF5IG9mIHN0YWNrIHZhcmlhYmxlcy4gVGhlIGVsZW1lbnRzIG1heSBnZXQgcmVvcmRlcmVkIGFuZCBjaGFuZ2VkLgorICAgIFNtYWxsVmVjdG9ySW1wbDxBU2FuU3RhY2tWYXJpYWJsZURlc2NyaXB0aW9uPiAmVmFycywKKyAgICAvLyBBZGRyZXNzU2FuaXRpemVyJ3Mgc2hhZG93IGdyYW51bGFyaXR5LiBVc3VhbGx5IDgsIG1heSBhbHNvIGJlIDE2LCAzMiwgNjQuCisgICAgc2l6ZV90IEdyYW51bGFyaXR5LAorICAgIC8vIFRoZSBtaW5pbWFsIHNpemUgb2YgdGhlIGxlZnQtbW9zdCByZWR6b25lIChoZWFkZXIpLgorICAgIC8vIEF0IGxlYXN0IDQgcG9pbnRlciBzaXplcywgcG93ZXIgb2YgMiwgYW5kID49IEdyYW51bGFyaXR5LgorICAgIC8vIFRoZSByZXN1bHRpbmcgRnJhbWVTaXplIHNob3VsZCBiZSBtdWx0aXBsZSBvZiBNaW5IZWFkZXJTaXplLgorICAgIHNpemVfdCBNaW5IZWFkZXJTaXplKTsKKworLy8gQ29tcHV0ZSBmcmFtZSBkZXNjcmlwdGlvbiwgc2VlIERlc2NyaWJlQWRkcmVzc0lmU3RhY2sgaW4gQVNhbiBydW50aW1lLgorU21hbGxTdHJpbmc8NjQ+IENvbXB1dGVBU2FuU3RhY2tGcmFtZURlc2NyaXB0aW9uKAorICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxBU2FuU3RhY2tWYXJpYWJsZURlc2NyaXB0aW9uPiAmVmFycyk7CisKKy8vIFJldHVybnMgc2hhZG93IGJ5dGVzIHdpdGggbWFya2VkIHJlZCB6b25lcy4gVGhpcyBzaGFkb3cgcmVwcmVzZW50cyB0aGUgc3RhdGUKKy8vIGlmIHRoZSBzdGFjayBmcmFtZSB3aGVuIGFsbCBsb2NhbCB2YXJpYWJsZXMgYXJlIGluc2lkZSBvZiB0aGUgb3duIHNjb3BlLgorU21hbGxWZWN0b3I8dWludDhfdCwgNjQ+CitHZXRTaGFkb3dCeXRlcyhjb25zdCBTbWFsbFZlY3RvckltcGw8QVNhblN0YWNrVmFyaWFibGVEZXNjcmlwdGlvbj4gJlZhcnMsCisgICAgICAgICAgICAgICBjb25zdCBBU2FuU3RhY2tGcmFtZUxheW91dCAmTGF5b3V0KTsKKworLy8gUmV0dXJucyBzaGFkb3cgYnl0ZXMgd2l0aCBtYXJrZWQgcmVkIHpvbmVzIGFuZCBhZnRlciBzY29wZS4gVGhpcyBzaGFkb3cKKy8vIHJlcHJlc2VudHMgdGhlIHN0YXRlIGlmIHRoZSBzdGFjayBmcmFtZSB3aGVuIGFsbCBsb2NhbCB2YXJpYWJsZXMgYXJlIG91dHNpZGUKKy8vIG9mIHRoZSBvd24gc2NvcGUuCitTbWFsbFZlY3Rvcjx1aW50OF90LCA2ND4gR2V0U2hhZG93Qnl0ZXNBZnRlclNjb3BlKAorICAgIC8vIFRoZSBhcnJheSBvZiBzdGFjayB2YXJpYWJsZXMuIFRoZSBlbGVtZW50cyBtYXkgZ2V0IHJlb3JkZXJlZCBhbmQgY2hhbmdlZC4KKyAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8QVNhblN0YWNrVmFyaWFibGVEZXNjcmlwdGlvbj4gJlZhcnMsCisgICAgY29uc3QgQVNhblN0YWNrRnJhbWVMYXlvdXQgJkxheW91dCk7CisKK30gLy8gbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmICAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQVNBTlNUQUNLRlJBTUVMQVlPVVRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0FkZERpc2NyaW1pbmF0b3JzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQWRkRGlzY3JpbWluYXRvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGFkMDZlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0FkZERpc2NyaW1pbmF0b3JzLmgKQEAgLTAsMCArMSwzMiBAQAorLy89PT0tIEFkZERpc2NyaW1pbmF0b3JzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgYWRkcyBEV0FSRiBkaXNjcmltaW5hdG9ycyB0byB0aGUgSVIuIFBhdGggZGlzY3JpbWluYXRvcnMgYXJlIHVzZWQKKy8vIHRvIGRlY2lkZSB3aGF0IENGRyBwYXRoIHdhcyB0YWtlbiBpbnNpZGUgc3ViLWdyYXBocyB3aG9zZSBpbnN0cnVjdGlvbnMgc2hhcmUKKy8vIHRoZSBzYW1lIGxpbmUgYW5kIGNvbHVtbiBudW1iZXIgaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQURERElTQ1JJTUlOQVRPUlNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQURERElTQ1JJTUlOQVRPUlNfSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworCitjbGFzcyBBZGREaXNjcmltaW5hdG9yc1Bhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxBZGREaXNjcmltaW5hdG9yc1Bhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19BRERESVNDUklNSU5BVE9SU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQmFzaWNCbG9ja1V0aWxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQmFzaWNCbG9ja1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYwZDJkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9CYXNpY0Jsb2NrVXRpbHMuaApAQCAtMCwwICsxLDMxNCBAQAorLy89PT0tIFRyYW5zZm9ybS9VdGlscy9CYXNpY0Jsb2NrVXRpbHMuaCAtIEJhc2ljQmxvY2sgVXRpbHMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZhbWlseSBvZiBmdW5jdGlvbnMgcGVyZm9ybSBtYW5pcHVsYXRpb25zIG9uIGJhc2ljIGJsb2NrcywgYW5kCisvLyBpbnN0cnVjdGlvbnMgY29udGFpbmVkIHdpdGhpbiBiYXNpYyBibG9ja3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQkFTSUNCTE9DS1VUSUxTX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0JBU0lDQkxPQ0tVVElMU19ICisKKy8vIEZJWE1FOiBNb3ZlIHRvIHRoaXMgZmlsZTogQmFzaWNCbG9jazo6cmVtb3ZlUHJlZGVjZXNzb3IsIEJCOjpzcGxpdEJhc2ljQmxvY2sKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DRkcuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RyVHlwZXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJsb2NrRnJlcXVlbmN5SW5mbzsKK2NsYXNzIEJyYW5jaFByb2JhYmlsaXR5SW5mbzsKK2NsYXNzIERlZmVycmVkRG9taW5hbmNlOworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBMb29wSW5mbzsKK2NsYXNzIE1ETm9kZTsKK2NsYXNzIE1lbW9yeURlcGVuZGVuY2VSZXN1bHRzOworY2xhc3MgUmV0dXJuSW5zdDsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworY2xhc3MgVmFsdWU7CisKKy8vLyBEZWxldGUgdGhlIHNwZWNpZmllZCBibG9jaywgd2hpY2ggbXVzdCBoYXZlIG5vIHByZWRlY2Vzc29ycy4KK3ZvaWQgRGVsZXRlRGVhZEJsb2NrKEJhc2ljQmxvY2sgKkJCLCBEZWZlcnJlZERvbWluYW5jZSAqRERUID0gbnVsbHB0cik7CisKKy8vLyBXZSBrbm93IHRoYXQgQkIgaGFzIG9uZSBwcmVkZWNlc3Nvci4gSWYgdGhlcmUgYXJlIGFueSBzaW5nbGUtZW50cnkgUEhJIG5vZGVzCisvLy8gaW4gaXQsIGZvbGQgdGhlbSBhd2F5LiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlbiBhbGwgZW50cmllcyB0byB0aGUgUEhJCisvLy8gbm9kZXMgaW4gYSBibG9jayBhcmUgZ3VhcmFudGVlZCBlcXVhbCwgc3VjaCBhcyB3aGVuIHRoZSBibG9jayBoYXMgZXhhY3RseQorLy8vIG9uZSBwcmVkZWNlc3Nvci4KK3ZvaWQgRm9sZFNpbmdsZUVudHJ5UEhJTm9kZXMoQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeURlcGVuZGVuY2VSZXN1bHRzICpNZW1EZXAgPSBudWxscHRyKTsKKworLy8vIEV4YW1pbmUgZWFjaCBQSEkgaW4gdGhlIGdpdmVuIGJsb2NrIGFuZCBkZWxldGUgaXQgaWYgaXQgaXMgZGVhZC4gQWxzbworLy8vIHJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbnkgb3BlcmFuZHMgdGhhdCBiZWNvbWUgZGVhZCBhcyBhIHJlc3VsdC4gVGhpcyBpbmNsdWRlcworLy8vIHRyYWNpbmcgdGhlIGRlZi11c2UgbGlzdCBmcm9tIHRoZSBQSEkgdG8gc2VlIGlmIGl0IGlzIHVsdGltYXRlbHkgdW51c2VkIG9yCisvLy8gaWYgaXQgcmVhY2hlcyBhbiB1bnVzZWQgY3ljbGUuIFJldHVybiB0cnVlIGlmIGFueSBQSElzIHdlcmUgZGVsZXRlZC4KK2Jvb2wgRGVsZXRlRGVhZFBISXMoQmFzaWNCbG9jayAqQkIsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkgPSBudWxscHRyKTsKKworLy8vIEF0dGVtcHRzIHRvIG1lcmdlIGEgYmxvY2sgaW50byBpdHMgcHJlZGVjZXNzb3IsIGlmIHBvc3NpYmxlLiBUaGUgcmV0dXJuCisvLy8gdmFsdWUgaW5kaWNhdGVzIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KK2Jvb2wgTWVyZ2VCbG9ja0ludG9QcmVkZWNlc3NvcihCYXNpY0Jsb2NrICpCQiwgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BJbmZvICpMSSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5RGVwZW5kZW5jZVJlc3VsdHMgKk1lbURlcCA9IG51bGxwdHIpOworCisvLy8gUmVwbGFjZSBhbGwgdXNlcyBvZiBhbiBpbnN0cnVjdGlvbiAoc3BlY2lmaWVkIGJ5IEJJKSB3aXRoIGEgdmFsdWUsIHRoZW4KKy8vLyByZW1vdmUgYW5kIGRlbGV0ZSB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24uCit2b2lkIFJlcGxhY2VJbnN0V2l0aFZhbHVlKEJhc2ljQmxvY2s6Okluc3RMaXN0VHlwZSAmQklMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciAmQkksIFZhbHVlICpWKTsKKworLy8vIFJlcGxhY2UgdGhlIGluc3RydWN0aW9uIHNwZWNpZmllZCBieSBCSSB3aXRoIHRoZSBpbnN0cnVjdGlvbiBzcGVjaWZpZWQgYnkgSS4KKy8vLyBDb3BpZXMgRGVidWdMb2MgZnJvbSBCSSB0byBJLCBpZiBJIGRvZXNuJ3QgYWxyZWFkeSBoYXZlIGEgRGVidWdMb2MuIFRoZQorLy8vIG9yaWdpbmFsIGluc3RydWN0aW9uIGlzIGRlbGV0ZWQgYW5kIEJJIGlzIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIG5ldworLy8vIGluc3RydWN0aW9uLgordm9pZCBSZXBsYWNlSW5zdFdpdGhJbnN0KEJhc2ljQmxvY2s6Okluc3RMaXN0VHlwZSAmQklMLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yICZCSSwgSW5zdHJ1Y3Rpb24gKkkpOworCisvLy8gUmVwbGFjZSB0aGUgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVkIGJ5IEZyb20gd2l0aCB0aGUgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVkIGJ5CisvLy8gVG8uIENvcGllcyBEZWJ1Z0xvYyBmcm9tIEJJIHRvIEksIGlmIEkgZG9lc24ndCBhbHJlYWR5IGhhdmUgYSBEZWJ1Z0xvYy4KK3ZvaWQgUmVwbGFjZUluc3RXaXRoSW5zdChJbnN0cnVjdGlvbiAqRnJvbSwgSW5zdHJ1Y3Rpb24gKlRvKTsKKworLy8vIE9wdGlvbiBjbGFzcyBmb3IgY3JpdGljYWwgZWRnZSBzcGxpdHRpbmcuCisvLy8KKy8vLyBUaGlzIHByb3ZpZGVzIGEgYnVpbGRlciBpbnRlcmZhY2UgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgb3B0aW9ucyB1c2VkCisvLy8gZHVyaW5nIGNyaXRpY2FsIGVkZ2Ugc3BsaXR0aW5nLgorc3RydWN0IENyaXRpY2FsRWRnZVNwbGl0dGluZ09wdGlvbnMgeworICBEb21pbmF0b3JUcmVlICpEVDsKKyAgTG9vcEluZm8gKkxJOworICBib29sIE1lcmdlSWRlbnRpY2FsRWRnZXMgPSBmYWxzZTsKKyAgYm9vbCBEb250RGVsZXRlVXNlbGVzc1BISXMgPSBmYWxzZTsKKyAgYm9vbCBQcmVzZXJ2ZUxDU1NBID0gZmFsc2U7CisKKyAgQ3JpdGljYWxFZGdlU3BsaXR0aW5nT3B0aW9ucyhEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcEluZm8gKkxJID0gbnVsbHB0cikKKyAgICAgIDogRFQoRFQpLCBMSShMSSkge30KKworICBDcml0aWNhbEVkZ2VTcGxpdHRpbmdPcHRpb25zICZzZXRNZXJnZUlkZW50aWNhbEVkZ2VzKCkgeworICAgIE1lcmdlSWRlbnRpY2FsRWRnZXMgPSB0cnVlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIENyaXRpY2FsRWRnZVNwbGl0dGluZ09wdGlvbnMgJnNldERvbnREZWxldGVVc2VsZXNzUEhJcygpIHsKKyAgICBEb250RGVsZXRlVXNlbGVzc1BISXMgPSB0cnVlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIENyaXRpY2FsRWRnZVNwbGl0dGluZ09wdGlvbnMgJnNldFByZXNlcnZlTENTU0EoKSB7CisgICAgUHJlc2VydmVMQ1NTQSA9IHRydWU7CisgICAgcmV0dXJuICp0aGlzOworICB9Cit9OworCisvLy8gSWYgdGhpcyBlZGdlIGlzIGEgY3JpdGljYWwgZWRnZSwgaW5zZXJ0IGEgbmV3IG5vZGUgdG8gc3BsaXQgdGhlIGNyaXRpY2FsCisvLy8gZWRnZS4gVGhpcyB3aWxsIHVwZGF0ZSB0aGUgYW5hbHlzZXMgcGFzc2VkIGluIHRocm91Z2ggdGhlIG9wdGlvbiBzdHJ1Y3QuCisvLy8gVGhpcyByZXR1cm5zIHRoZSBuZXcgYmxvY2sgaWYgdGhlIGVkZ2Ugd2FzIHNwbGl0LCBudWxsIG90aGVyd2lzZS4KKy8vLworLy8vIElmIE1lcmdlSWRlbnRpY2FsRWRnZXMgaW4gdGhlIG9wdGlvbnMgc3RydWN0IGlzIHRydWUgKG5vdCB0aGUgZGVmYXVsdCksCisvLy8gKmFsbCogZWRnZXMgZnJvbSBUSSB0byB0aGUgc3BlY2lmaWVkIHN1Y2Nlc3NvciB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZSBzYW1lCisvLy8gY3JpdGljYWwgZWRnZSBibG9jay4gVGhpcyBpcyBtb3N0IGNvbW1vbmx5IGludGVyZXN0aW5nIHdpdGggc3dpdGNoCisvLy8gaW5zdHJ1Y3Rpb25zLCB3aGljaCBtYXkgaGF2ZSBtYW55IGVkZ2VzIHRvIGFueSBvbmUgZGVzdGluYXRpb24uICBUaGlzCisvLy8gZW5zdXJlcyB0aGF0IGFsbCBlZGdlcyB0byB0aGF0IGRlc3QgZ28gdG8gb25lIGJsb2NrIGluc3RlYWQgb2YgZWFjaCBnb2luZworLy8vIHRvIGEgZGlmZmVyZW50IGJsb2NrLCBidXQgaXNuJ3QgdGhlIHN0YW5kYXJkIGRlZmluaXRpb24gb2YgYSAiY3JpdGljYWwKKy8vLyBlZGdlIi4KKy8vLworLy8vIEl0IGlzIGludmFsaWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIG9uIGEgY3JpdGljYWwgZWRnZSB0aGF0IHN0YXJ0cyBhdCBhbgorLy8vIEluZGlyZWN0QnJJbnN0LiAgU3BsaXR0aW5nIHRoZXNlIGVkZ2VzIHdpbGwgYWxtb3N0IGFsd2F5cyBjcmVhdGUgYW4gaW52YWxpZAorLy8vIHByb2dyYW0gYmVjYXVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgbmV3IGJsb2NrIHdvbid0IGJlIHRoZSBvbmUgdGhhdCBpcyBqdW1wZWQKKy8vLyB0by4KK0Jhc2ljQmxvY2sgKlNwbGl0Q3JpdGljYWxFZGdlKFRlcm1pbmF0b3JJbnN0ICpUSSwgdW5zaWduZWQgU3VjY051bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENyaXRpY2FsRWRnZVNwbGl0dGluZ09wdGlvbnMgJk9wdGlvbnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyaXRpY2FsRWRnZVNwbGl0dGluZ09wdGlvbnMoKSk7CisKK2lubGluZSBCYXNpY0Jsb2NrICoKK1NwbGl0Q3JpdGljYWxFZGdlKEJhc2ljQmxvY2sgKkJCLCBzdWNjX2l0ZXJhdG9yIFNJLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ3JpdGljYWxFZGdlU3BsaXR0aW5nT3B0aW9ucyAmT3B0aW9ucyA9CisgICAgICAgICAgICAgICAgICAgICAgQ3JpdGljYWxFZGdlU3BsaXR0aW5nT3B0aW9ucygpKSB7CisgIHJldHVybiBTcGxpdENyaXRpY2FsRWRnZShCQi0+Z2V0VGVybWluYXRvcigpLCBTSS5nZXRTdWNjZXNzb3JJbmRleCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyk7Cit9CisKKy8vLyBJZiB0aGUgZWRnZSBmcm9tICpQSSB0byBCQiBpcyBub3QgY3JpdGljYWwsIHJldHVybiBmYWxzZS4gT3RoZXJ3aXNlLCBzcGxpdAorLy8vIGFsbCBlZGdlcyBiZXR3ZWVuIHRoZSB0d28gYmxvY2tzIGFuZCByZXR1cm4gdHJ1ZS4gVGhpcyB1cGRhdGVzIGFsbCBvZiB0aGUKKy8vLyBzYW1lIGFuYWx5c2VzIGFzIHRoZSBvdGhlciBTcGxpdENyaXRpY2FsRWRnZSBmdW5jdGlvbi4gSWYgUCBpcyBzcGVjaWZpZWQsIGl0CisvLy8gdXBkYXRlcyB0aGUgYW5hbHlzZXMgZGVzY3JpYmVkIGFib3ZlLgoraW5saW5lIGJvb2wgU3BsaXRDcml0aWNhbEVkZ2UoQmFzaWNCbG9jayAqU3VjYywgcHJlZF9pdGVyYXRvciBQSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENyaXRpY2FsRWRnZVNwbGl0dGluZ09wdGlvbnMgJk9wdGlvbnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyaXRpY2FsRWRnZVNwbGl0dGluZ09wdGlvbnMoKSkgeworICBib29sIE1hZGVDaGFuZ2UgPSBmYWxzZTsKKyAgVGVybWluYXRvckluc3QgKlRJID0gKCpQSSktPmdldFRlcm1pbmF0b3IoKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFRJLT5nZXROdW1TdWNjZXNzb3JzKCk7IGkgIT0gZTsgKytpKQorICAgIGlmIChUSS0+Z2V0U3VjY2Vzc29yKGkpID09IFN1Y2MpCisgICAgICBNYWRlQ2hhbmdlIHw9ICEhU3BsaXRDcml0aWNhbEVkZ2UoVEksIGksIE9wdGlvbnMpOworICByZXR1cm4gTWFkZUNoYW5nZTsKK30KKworLy8vIElmIGFuIGVkZ2UgZnJvbSBTcmMgdG8gRHN0IGlzIGNyaXRpY2FsLCBzcGxpdCB0aGUgZWRnZSBhbmQgcmV0dXJuIHRydWUsCisvLy8gb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4gVGhpcyBtZXRob2QgcmVxdWlyZXMgdGhhdCB0aGVyZSBiZSBhbiBlZGdlIGJldHdlZW4KKy8vLyB0aGUgdHdvIGJsb2Nrcy4gSXQgdXBkYXRlcyB0aGUgYW5hbHlzZXMgcGFzc2VkIGluIHRoZSBvcHRpb25zIHN0cnVjdAoraW5saW5lIEJhc2ljQmxvY2sgKgorU3BsaXRDcml0aWNhbEVkZ2UoQmFzaWNCbG9jayAqU3JjLCBCYXNpY0Jsb2NrICpEc3QsCisgICAgICAgICAgICAgICAgICBjb25zdCBDcml0aWNhbEVkZ2VTcGxpdHRpbmdPcHRpb25zICZPcHRpb25zID0KKyAgICAgICAgICAgICAgICAgICAgICBDcml0aWNhbEVkZ2VTcGxpdHRpbmdPcHRpb25zKCkpIHsKKyAgVGVybWluYXRvckluc3QgKlRJID0gU3JjLT5nZXRUZXJtaW5hdG9yKCk7CisgIHVuc2lnbmVkIGkgPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIGFzc2VydChpICE9IFRJLT5nZXROdW1TdWNjZXNzb3JzKCkgJiYgIkVkZ2UgZG9lc24ndCBleGlzdCEiKTsKKyAgICBpZiAoVEktPmdldFN1Y2Nlc3NvcihpKSA9PSBEc3QpCisgICAgICByZXR1cm4gU3BsaXRDcml0aWNhbEVkZ2UoVEksIGksIE9wdGlvbnMpOworICAgICsraTsKKyAgfQorfQorCisvLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgZWRnZXMgaW4gdGhlIENGRywgYnJlYWtpbmcgY3JpdGljYWwgZWRnZXMgYXMgdGhleSBhcmUKKy8vLyBmb3VuZC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJyb2tlbiBlZGdlcy4KK3Vuc2lnbmVkIFNwbGl0QWxsQ3JpdGljYWxFZGdlcyhGdW5jdGlvbiAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDcml0aWNhbEVkZ2VTcGxpdHRpbmdPcHRpb25zICZPcHRpb25zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JpdGljYWxFZGdlU3BsaXR0aW5nT3B0aW9ucygpKTsKKworLy8vIFNwbGl0IHRoZSBlZGdlIGNvbm5lY3Rpbmcgc3BlY2lmaWVkIGJsb2NrLgorQmFzaWNCbG9jayAqU3BsaXRFZGdlKEJhc2ljQmxvY2sgKkZyb20sIEJhc2ljQmxvY2sgKlRvLAorICAgICAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0ciwgTG9vcEluZm8gKkxJID0gbnVsbHB0cik7CisKKy8vLyBTcGxpdCB0aGUgc3BlY2lmaWVkIGJsb2NrIGF0IHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gLSBldmVyeXRoaW5nIGJlZm9yZQorLy8vIFNwbGl0UHQgc3RheXMgaW4gT2xkIGFuZCBldmVyeXRoaW5nIHN0YXJ0aW5nIHdpdGggU3BsaXRQdCBtb3ZlcyB0byBhIG5ldworLy8vIGJsb2NrLiBUaGUgdHdvIGJsb2NrcyBhcmUgam9pbmVkIGJ5IGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIGFuZCB0aGUgbG9vcAorLy8vIGluZm8gaXMgdXBkYXRlZC4KK0Jhc2ljQmxvY2sgKlNwbGl0QmxvY2soQmFzaWNCbG9jayAqT2xkLCBJbnN0cnVjdGlvbiAqU3BsaXRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyLCBMb29wSW5mbyAqTEkgPSBudWxscHRyKTsKKworLy8vIFRoaXMgbWV0aG9kIGludHJvZHVjZXMgYXQgbGVhc3Qgb25lIG5ldyBiYXNpYyBibG9jayBpbnRvIHRoZSBmdW5jdGlvbiBhbmQKKy8vLyBtb3ZlcyBzb21lIG9mIHRoZSBwcmVkZWNlc3NvcnMgb2YgQkIgdG8gYmUgcHJlZGVjZXNzb3JzIG9mIHRoZSBuZXcgYmxvY2suCisvLy8gVGhlIG5ldyBwcmVkZWNlc3NvcnMgYXJlIGluZGljYXRlZCBieSB0aGUgUHJlZHMgYXJyYXkuIFRoZSBuZXcgYmxvY2sgaXMKKy8vLyBnaXZlbiBhIHN1ZmZpeCBvZiAnU3VmZml4Jy4gUmV0dXJucyBuZXcgYmFzaWMgYmxvY2sgdG8gd2hpY2ggcHJlZGVjZXNzb3JzCisvLy8gZnJvbSBQcmVkcyBhcmUgbm93IHBvaW50aW5nLgorLy8vCisvLy8gSWYgQkIgaXMgYSBsYW5kaW5ncGFkIGJsb2NrIHRoZW4gYWRkaXRpb25hbCBiYXNpY2Jsb2NrIG1pZ2h0IGJlIGludHJvZHVjZWQuCisvLy8gSXQgd2lsbCBoYXZlIFN1ZmZpeCsiLnNwbGl0X2xwIi4gU2VlIFNwbGl0TGFuZGluZ1BhZFByZWRlY2Vzc29ycyBmb3IgbW9yZQorLy8vIGRldGFpbHMgb24gdGhpcyBjYXNlLgorLy8vCisvLy8gVGhpcyBjdXJyZW50bHkgdXBkYXRlcyB0aGUgTExWTSBJUiwgRG9taW5hdG9yVHJlZSwgTG9vcEluZm8sIGFuZCBMQ0NTQSBidXQKKy8vLyBubyBvdGhlciBhbmFseXNlcy4gSW4gcGFydGljdWxhciwgaXQgZG9lcyBub3QgcHJlc2VydmUgTG9vcFNpbXBsaWZ5CisvLy8gKGJlY2F1c2UgaXQncyBjb21wbGljYXRlZCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgb25lIG9mIHRoZSBlZGdlcyBiZWluZworLy8vIHNwbGl0IGlzIGFuIGV4aXQgb2YgYSBsb29wIHdpdGggb3RoZXIgZXhpdHMpLgorQmFzaWNCbG9jayAqU3BsaXRCbG9ja1ByZWRlY2Vzc29ycyhCYXNpY0Jsb2NrICpCQiwgQXJyYXlSZWY8QmFzaWNCbG9jayAqPiBQcmVkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqU3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BJbmZvICpMSSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUHJlc2VydmVMQ1NTQSA9IGZhbHNlKTsKKworLy8vIFRoaXMgbWV0aG9kIHRyYW5zZm9ybXMgdGhlIGxhbmRpbmcgcGFkLCBPcmlnQkIsIGJ5IGludHJvZHVjaW5nIHR3byBuZXcgYmFzaWMKKy8vLyBibG9ja3MgaW50byB0aGUgZnVuY3Rpb24uIE9uZSBvZiB0aG9zZSBuZXcgYmFzaWMgYmxvY2tzIGdldHMgdGhlCisvLy8gcHJlZGVjZXNzb3JzIGxpc3RlZCBpbiBQcmVkcy4gVGhlIG90aGVyIGJhc2ljIGJsb2NrIGdldHMgdGhlIHJlbWFpbmluZworLy8vIHByZWRlY2Vzc29ycyBvZiBPcmlnQkIuIFRoZSBsYW5kaW5ncGFkIGluc3RydWN0aW9uIE9yaWdCQiBpcyBjbG9uZSBpbnRvIGJvdGgKKy8vLyBvZiB0aGUgbmV3IGJhc2ljIGJsb2Nrcy4gVGhlIG5ldyBibG9ja3MgYXJlIGdpdmVuIHRoZSBzdWZmaXhlcyAnU3VmZml4MScgYW5kCisvLy8gJ1N1ZmZpeDInLCBhbmQgYXJlIHJldHVybmVkIGluIHRoZSBOZXdCQnMgdmVjdG9yLgorLy8vCisvLy8gVGhpcyBjdXJyZW50bHkgdXBkYXRlcyB0aGUgTExWTSBJUiwgRG9taW5hdG9yVHJlZSwgTG9vcEluZm8sIGFuZCBMQ0NTQSBidXQKKy8vLyBubyBvdGhlciBhbmFseXNlcy4gSW4gcGFydGljdWxhciwgaXQgZG9lcyBub3QgcHJlc2VydmUgTG9vcFNpbXBsaWZ5CisvLy8gKGJlY2F1c2UgaXQncyBjb21wbGljYXRlZCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgb25lIG9mIHRoZSBlZGdlcyBiZWluZworLy8vIHNwbGl0IGlzIGFuIGV4aXQgb2YgYSBsb29wIHdpdGggb3RoZXIgZXhpdHMpLgordm9pZCBTcGxpdExhbmRpbmdQYWRQcmVkZWNlc3NvcnMoQmFzaWNCbG9jayAqT3JpZ0JCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8QmFzaWNCbG9jayAqPiBQcmVkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlN1ZmZpeCwgY29uc3QgY2hhciAqU3VmZml4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxCYXNpY0Jsb2NrICo+ICZOZXdCQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wSW5mbyAqTEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQcmVzZXJ2ZUxDU1NBID0gZmFsc2UpOworCisvLy8gVGhpcyBtZXRob2QgZHVwbGljYXRlcyB0aGUgc3BlY2lmaWVkIHJldHVybiBpbnN0cnVjdGlvbiBpbnRvIGEgcHJlZGVjZXNzb3IKKy8vLyB3aGljaCBlbmRzIGluIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoLiBJZiB0aGUgcmV0dXJuIGluc3RydWN0aW9uIHJldHVybnMgYQorLy8vIHZhbHVlIGRlZmluZWQgYnkgYSBQSEksIHByb3BhZ2F0ZSB0aGUgcmlnaHQgdmFsdWUgaW50byB0aGUgcmV0dXJuLiBJdAorLy8vIHJldHVybnMgdGhlIG5ldyByZXR1cm4gaW5zdHJ1Y3Rpb24gaW4gdGhlIHByZWRlY2Vzc29yLgorUmV0dXJuSW5zdCAqRm9sZFJldHVybkludG9VbmNvbmRCcmFuY2goUmV0dXJuSW5zdCAqUkksIEJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqUHJlZCk7CisKKy8vLyBTcGxpdCB0aGUgY29udGFpbmluZyBibG9jayBhdCB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIC0gZXZlcnl0aGluZyBiZWZvcmUKKy8vLyBTcGxpdEJlZm9yZSBzdGF5cyBpbiB0aGUgb2xkIGJhc2ljIGJsb2NrLCBhbmQgdGhlIHJlc3Qgb2YgdGhlIGluc3RydWN0aW9ucworLy8vIGluIHRoZSBCQiBhcmUgbW92ZWQgdG8gYSBuZXcgYmxvY2suIFRoZSB0d28gYmxvY2tzIGFyZSBjb25uZWN0ZWQgYnkgYQorLy8vIGNvbmRpdGlvbmFsIGJyYW5jaCAod2l0aCB2YWx1ZSBvZiBDbXAgYmVpbmcgdGhlIGNvbmRpdGlvbikuCisvLy8gQmVmb3JlOgorLy8vICAgSGVhZAorLy8vICAgU3BsaXRCZWZvcmUKKy8vLyAgIFRhaWwKKy8vLyBBZnRlcjoKKy8vLyAgIEhlYWQKKy8vLyAgIGlmIChDb25kKQorLy8vICAgICBUaGVuQmxvY2sKKy8vLyAgIFNwbGl0QmVmb3JlCisvLy8gICBUYWlsCisvLy8KKy8vLyBJZiBVbnJlYWNoYWJsZSBpcyB0cnVlLCB0aGVuIFRoZW5CbG9jayBlbmRzIHdpdGgKKy8vLyBVbnJlYWNoYWJsZUluc3QsIG90aGVyd2lzZSBpdCBicmFuY2hlcyB0byBUYWlsLgorLy8vIFJldHVybnMgdGhlIE5ld0Jhc2ljQmxvY2sncyB0ZXJtaW5hdG9yLgorLy8vCisvLy8gVXBkYXRlcyBEVCBhbmQgTEkgaWYgZ2l2ZW4uCitUZXJtaW5hdG9ySW5zdCAqU3BsaXRCbG9ja0FuZEluc2VydElmVGhlbihWYWx1ZSAqQ29uZCwgSW5zdHJ1Y3Rpb24gKlNwbGl0QmVmb3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVbnJlYWNoYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqQnJhbmNoV2VpZ2h0cyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wSW5mbyAqTEkgPSBudWxscHRyKTsKKworLy8vIFNwbGl0QmxvY2tBbmRJbnNlcnRJZlRoZW5FbHNlIGlzIHNpbWlsYXIgdG8gU3BsaXRCbG9ja0FuZEluc2VydElmVGhlbiwKKy8vLyBidXQgYWxzbyBjcmVhdGVzIHRoZSBFbHNlQmxvY2suCisvLy8gQmVmb3JlOgorLy8vICAgSGVhZAorLy8vICAgU3BsaXRCZWZvcmUKKy8vLyAgIFRhaWwKKy8vLyBBZnRlcjoKKy8vLyAgIEhlYWQKKy8vLyAgIGlmIChDb25kKQorLy8vICAgICBUaGVuQmxvY2sKKy8vLyAgIGVsc2UKKy8vLyAgICAgRWxzZUJsb2NrCisvLy8gICBTcGxpdEJlZm9yZQorLy8vICAgVGFpbAordm9pZCBTcGxpdEJsb2NrQW5kSW5zZXJ0SWZUaGVuRWxzZShWYWx1ZSAqQ29uZCwgSW5zdHJ1Y3Rpb24gKlNwbGl0QmVmb3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXJtaW5hdG9ySW5zdCAqKlRoZW5UZXJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXJtaW5hdG9ySW5zdCAqKkVsc2VUZXJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkJyYW5jaFdlaWdodHMgPSBudWxscHRyKTsKKworLy8vIENoZWNrIHdoZXRoZXIgQkIgaXMgdGhlIG1lcmdlIHBvaW50IG9mIGEgaWYtcmVnaW9uLgorLy8vIElmIHNvLCByZXR1cm4gdGhlIGJvb2xlYW4gY29uZGl0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBlbnRyeSBpbnRvCisvLy8gQkIgd2lsbCBiZSB0YWtlbi4gIEFsc28sIHJldHVybiBieSByZWZlcmVuY2VzIHRoZSBibG9jayB0aGF0IHdpbGwgYmUKKy8vLyBlbnRlcmVkIGZyb20gaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLCBhbmQgdGhlIGJsb2NrIHRoYXQgd2lsbCBiZQorLy8vIGVudGVyZWQgaWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZS4KKy8vLworLy8vIFRoaXMgZG9lcyBubyBjaGVja2luZyB0byBzZWUgaWYgdGhlIHRydWUvZmFsc2UgYmxvY2tzIGhhdmUgbGFyZ2Ugb3IgdW5zYXZvcnkKKy8vLyBpbnN0cnVjdGlvbnMgaW4gdGhlbS4KK1ZhbHVlICpHZXRJZkNvbmRpdGlvbihCYXNpY0Jsb2NrICpCQiwgQmFzaWNCbG9jayAqJklmVHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrIComSWZGYWxzZSk7CisKKy8vIFNwbGl0IGNyaXRpY2FsIGVkZ2VzIHdoZXJlIHRoZSBzb3VyY2Ugb2YgdGhlIGVkZ2UgaXMgYW4gaW5kaXJlY3RicgorLy8gaW5zdHJ1Y3Rpb24uIFRoaXMgaXNuJ3QgYWx3YXlzIHBvc3NpYmxlLCBidXQgd2UgY2FuIGhhbmRsZSBzb21lIGVhc3kgY2FzZXMuCisvLyBUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIE1JIGlzIHVuYWJsZSB0byBzcGxpdCBzdWNoIGNyaXRpY2FsIGVkZ2VzLAorLy8gd2hpY2ggbWVhbnMgaXQgd2lsbCBub3QgYmUgYWJsZSB0byBzaW5rIGluc3RydWN0aW9ucyBhbG9uZyB0aG9zZSBlZGdlcy4KKy8vIFRoaXMgaXMgZXNwZWNpYWxseSBwYWluZnVsIGZvciBpbmRpcmVjdCBicmFuY2hlcyB3aXRoIG1hbnkgc3VjY2Vzc29ycywgd2hlcmUKKy8vIHdlIGVuZCB1cCBoYXZpbmcgdG8gcHJlcGFyZSBhbGwgb3V0Z29pbmcgdmFsdWVzIGluIHRoZSBvcmlnaW4gYmxvY2suCisvLworLy8gT3VyIG5vcm1hbCBhbGdvcml0aG0gZm9yIHNwbGl0dGluZyBjcml0aWNhbCBlZGdlcyByZXF1aXJlcyB1cyB0byB1cGRhdGUKKy8vIHRoZSBvdXRnb2luZyBlZGdlcyBvZiB0aGUgZWRnZSBvcmlnaW4gYmxvY2ssIGJ1dCBmb3IgYW4gaW5kaXJlY3RiciB0aGlzCisvLyBpcyBoYXJkLCBzaW5jZSBpdCB3b3VsZCByZXF1aXJlIGZpbmRpbmcgYW5kIHVwZGF0aW5nIHRoZSBibG9jayBhZGRyZXNzZXMKKy8vIHRoZSBpbmRpcmVjdCBicmFuY2ggdXNlcy4gQnV0IGlmIGEgYmxvY2sgb25seSBoYXMgYSBzaW5nbGUgaW5kaXJlY3RicgorLy8gcHJlZGVjZXNzb3IsIHdpdGggdGhlIG90aGVycyBiZWluZyByZWd1bGFyIGJyYW5jaGVzLCB3ZSBjYW4gZG8gaXQgaW4gYQorLy8gZGlmZmVyZW50IHdheS4KKy8vIFNheSB3ZSBoYXZlIEEgLT4gRCwgQiAtPiBELCBJIC0+IEQgd2hlcmUgb25seSBJIC0+IEQgaXMgYW4gaW5kaXJlY3Rici4KKy8vIFdlIGNhbiBzcGxpdCBEIGludG8gRDAgYW5kIEQxLCB3aGVyZSBEMCBjb250YWlucyBvbmx5IHRoZSBQSElzIGZyb20gRCwKKy8vIGFuZCBEMSBpcyB0aGUgRCBibG9jayBib2R5LiBXZSBjYW4gdGhlbiBkdXBsaWNhdGUgRDAgYXMgRDBBIGFuZCBEMEIsIGFuZAorLy8gY3JlYXRlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorLy8gQSAtPiBEMEEsIEIgLT4gRDBBLCBJIC0+IEQwQiwgRDBBIC0+IEQxLCBEMEIgLT4gRDEKKy8vIElmIEJQSSBhbmQgQkZJIGFyZW4ndCBub24tbnVsbCwgQlBJL0JGSSB3aWxsIGJlIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCitib29sIFNwbGl0SW5kaXJlY3RCckNyaXRpY2FsRWRnZXMoRnVuY3Rpb24gJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnJhbmNoUHJvYmFiaWxpdHlJbmZvICpCUEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrRnJlcXVlbmN5SW5mbyAqQkZJID0gbnVsbHB0cik7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQkFTSUNCTE9DS1VUSUxTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9CcmVha0NyaXRpY2FsRWRnZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9CcmVha0NyaXRpY2FsRWRnZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2M4MWExCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0JyZWFrQ3JpdGljYWxFZGdlcy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vPT09LSBCcmVha0NyaXRpY2FsRWRnZXMuaCAtIENyaXRpY2FsIEVkZ2UgRWxpbWluYXRpb24gUGFzcyAtLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQnJlYWtDcml0aWNhbEVkZ2VzIHBhc3MgLSBCcmVhayBhbGwgb2YgdGhlIGNyaXRpY2FsIGVkZ2VzIGluIHRoZSBDRkcgYnkKKy8vIGluc2VydGluZyBhIGR1bW15IGJhc2ljIGJsb2NrLiAgVGhpcyBwYXNzIG1heSBiZSAicmVxdWlyZWQiIGJ5IHBhc3NlcyB0aGF0CisvLyBjYW5ub3QgZGVhbCB3aXRoIGNyaXRpY2FsIGVkZ2VzLiAgRm9yIHRoaXMgdXNhZ2UsIHRoZSBzdHJ1Y3R1cmUgdHlwZSBpcworLy8gZm9yd2FyZCBkZWNsYXJlZC4gIFRoaXMgcGFzcyBvYnZpb3VzbHkgaW52YWxpZGF0ZXMgdGhlIENGRywgYnV0IGNhbiB1cGRhdGUKKy8vIGRvbWluYXRvciB0cmVlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19CUkVBS0NSSVRJQ0FMRURHRVNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQlJFQUtDUklUSUNBTEVER0VTX0gKKworI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK3N0cnVjdCBCcmVha0NyaXRpY2FsRWRnZXNQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48QnJlYWtDcml0aWNhbEVkZ2VzUGFzcz4geworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworfSAvLyBuYW1lc3BhY2UgbGx2bQorI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19CUkVBS0NSSVRJQ0FMRURHRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0J1aWxkTGliQ2FsbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9CdWlsZExpYkNhbGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3MTU1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9CdWlsZExpYkNhbGxzLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8vPT09LSBCdWlsZExpYkNhbGxzLmggLSBVdGlsaXR5IGJ1aWxkZXIgZm9yIGxpYmNhbGxzIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGV4cG9zZXMgYW4gaW50ZXJmYWNlIHRvIGJ1aWxkIHNvbWUgQyBsYW5ndWFnZSBsaWJjYWxscyBmb3IKKy8vIG9wdGltaXphdGlvbiBwYXNzZXMgdGhhdCBuZWVkIHRvIGNhbGwgdGhlIHZhcmlvdXMgZnVuY3Rpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0JVSUxETElCQ0FMTFNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQlVJTERMSUJDQUxMU19ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1RhcmdldExpYnJhcnlJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JUkJ1aWxkZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBWYWx1ZTsKKyAgY2xhc3MgRGF0YUxheW91dDsKKyAgY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CisKKyAgLy8vIEFuYWx5emUgdGhlIG5hbWUgYW5kIHByb3RvdHlwZSBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gYW5kIHNldCBhbnkKKyAgLy8vIGFwcGxpY2FibGUgYXR0cmlidXRlcy4KKyAgLy8vIElmIHRoZSBsaWJyYXJ5IGZ1bmN0aW9uIGlzIHVuYXZhaWxhYmxlLCB0aGlzIGRvZXNuJ3QgbW9kaWZ5IGl0LgorICAvLy8KKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgYXR0cmlidXRlcyB3ZXJlIHNldCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGluZmVyTGliRnVuY0F0dHJpYnV0ZXMoRnVuY3Rpb24gJkYsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICZUTEkpOworCisgIC8vLyBDaGVjayB3aGV0aGVyIHRoZSBvdmVybG9hZGVkIHVuYXJ5IGZsb2F0aW5nIHBvaW50IGZ1bmN0aW9uCisgIC8vLyBjb3JyZXNwb25kaW5nIHRvIFxhIFR5IGlzIGF2YWlsYWJsZS4KKyAgYm9vbCBoYXNVbmFyeUZsb2F0Rm4oY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSwgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgIExpYkZ1bmMgRG91YmxlRm4sIExpYkZ1bmMgRmxvYXRGbiwKKyAgICAgICAgICAgICAgICAgICAgICAgTGliRnVuYyBMb25nRG91YmxlRm4pOworCisgIC8vLyBSZXR1cm4gViBpZiBpdCBpcyBhbiBpOCosIG90aGVyd2lzZSBjYXN0IGl0IHRvIGk4Ki4KKyAgVmFsdWUgKmNhc3RUb0NTdHIoVmFsdWUgKlYsIElSQnVpbGRlcjw+ICZCKTsKKworICAvLy8gRW1pdCBhIGNhbGwgdG8gdGhlIHN0cmxlbiBmdW5jdGlvbiB0byB0aGUgYnVpbGRlciwgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHBvaW50ZXIuIFB0ciBpcyByZXF1aXJlZCB0byBiZSBzb21lIHBvaW50ZXIgdHlwZSwgYW5kIHRoZSByZXR1cm4gdmFsdWUgaGFzCisgIC8vLyAnaW50cHRyX3QnIHR5cGUuCisgIFZhbHVlICplbWl0U3RyTGVuKFZhbHVlICpQdHIsIElSQnVpbGRlcjw+ICZCLCBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSk7CisKKyAgLy8vIEVtaXQgYSBjYWxsIHRvIHRoZSBzdHJubGVuIGZ1bmN0aW9uIHRvIHRoZSBidWlsZGVyLCBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gcG9pbnRlci4gUHRyIGlzIHJlcXVpcmVkIHRvIGJlIHNvbWUgcG9pbnRlciB0eXBlLCBNYXhMZW4gbXVzdCBiZSBvZiBzaXplX3QKKyAgLy8vIHR5cGUsIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGhhcyAnaW50cHRyX3QnIHR5cGUuCisgIFZhbHVlICplbWl0U3RyTkxlbihWYWx1ZSAqUHRyLCBWYWx1ZSAqTWF4TGVuLCBJUkJ1aWxkZXI8PiAmQiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKKworICAvLy8gRW1pdCBhIGNhbGwgdG8gdGhlIHN0cmNociBmdW5jdGlvbiB0byB0aGUgYnVpbGRlciwgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHBvaW50ZXIgYW5kIGNoYXJhY3Rlci4gUHRyIGlzIHJlcXVpcmVkIHRvIGJlIHNvbWUgcG9pbnRlciB0eXBlLCBhbmQgdGhlCisgIC8vLyByZXR1cm4gdmFsdWUgaGFzICdpOConIHR5cGUuCisgIFZhbHVlICplbWl0U3RyQ2hyKFZhbHVlICpQdHIsIGNoYXIgQywgSVJCdWlsZGVyPD4gJkIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpOworCisgIC8vLyBFbWl0IGEgY2FsbCB0byB0aGUgc3RybmNtcCBmdW5jdGlvbiB0byB0aGUgYnVpbGRlci4KKyAgVmFsdWUgKmVtaXRTdHJOQ21wKFZhbHVlICpQdHIxLCBWYWx1ZSAqUHRyMiwgVmFsdWUgKkxlbiwgSVJCdWlsZGVyPD4gJkIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSk7CisKKyAgLy8vIEVtaXQgYSBjYWxsIHRvIHRoZSBzdHJjcHkgZnVuY3Rpb24gdG8gdGhlIGJ1aWxkZXIsIGZvciB0aGUgc3BlY2lmaWVkCisgIC8vLyBwb2ludGVyIGFyZ3VtZW50cy4KKyAgVmFsdWUgKmVtaXRTdHJDcHkoVmFsdWUgKkRzdCwgVmFsdWUgKlNyYywgSVJCdWlsZGVyPD4gJkIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEksIFN0cmluZ1JlZiBOYW1lID0gInN0cmNweSIpOworCisgIC8vLyBFbWl0IGEgY2FsbCB0byB0aGUgc3RybmNweSBmdW5jdGlvbiB0byB0aGUgYnVpbGRlciwgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHBvaW50ZXIgYXJndW1lbnRzIGFuZCBsZW5ndGguCisgIFZhbHVlICplbWl0U3RyTkNweShWYWx1ZSAqRHN0LCBWYWx1ZSAqU3JjLCBWYWx1ZSAqTGVuLCBJUkJ1aWxkZXI8PiAmQiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEksIFN0cmluZ1JlZiBOYW1lID0gInN0cm5jcHkiKTsKKworICAvLy8gRW1pdCBhIGNhbGwgdG8gdGhlIF9fbWVtY3B5X2NoayBmdW5jdGlvbiB0byB0aGUgYnVpbGRlci4gVGhpcyBleHBlY3RzIHRoYXQKKyAgLy8vIHRoZSBMZW4gYW5kIE9ialNpemUgaGF2ZSB0eXBlICdpbnRwdHJfdCcgYW5kIERzdC9TcmMgYXJlIHBvaW50ZXJzLgorICBWYWx1ZSAqZW1pdE1lbUNweUNoayhWYWx1ZSAqRHN0LCBWYWx1ZSAqU3JjLCBWYWx1ZSAqTGVuLCBWYWx1ZSAqT2JqU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgSVJCdWlsZGVyPD4gJkIsIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKKworICAvLy8gRW1pdCBhIGNhbGwgdG8gdGhlIG1lbWNociBmdW5jdGlvbi4gVGhpcyBhc3N1bWVzIHRoYXQgUHRyIGlzIGEgcG9pbnRlciwKKyAgLy8vIFZhbCBpcyBhbiBpMzIgdmFsdWUsIGFuZCBMZW4gaXMgYW4gJ2ludHB0cl90JyB2YWx1ZS4KKyAgVmFsdWUgKmVtaXRNZW1DaHIoVmFsdWUgKlB0ciwgVmFsdWUgKlZhbCwgVmFsdWUgKkxlbiwgSVJCdWlsZGVyPD4gJkIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKKworICAvLy8gRW1pdCBhIGNhbGwgdG8gdGhlIG1lbWNtcCBmdW5jdGlvbi4KKyAgVmFsdWUgKmVtaXRNZW1DbXAoVmFsdWUgKlB0cjEsIFZhbHVlICpQdHIyLCBWYWx1ZSAqTGVuLCBJUkJ1aWxkZXI8PiAmQiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpOworCisgIC8vLyBFbWl0IGEgY2FsbCB0byB0aGUgdW5hcnkgZnVuY3Rpb24gbmFtZWQgJ05hbWUnIChlLmcuICAnZmxvb3InKS4gVGhpcworICAvLy8gZnVuY3Rpb24gaXMga25vd24gdG8gdGFrZSBhIHNpbmdsZSBvZiB0eXBlIG1hdGNoaW5nICdPcCcgYW5kIHJldHVybnMgb25lCisgIC8vLyB2YWx1ZSB3aXRoIHRoZSBzYW1lIHR5cGUuIElmICdPcCcgaXMgYSBsb25nIGRvdWJsZSwgJ2wnIGlzIGFkZGVkIGFzIHRoZQorICAvLy8gc3VmZml4IG9mIG5hbWUsIGlmICdPcCcgaXMgYSBmbG9hdCwgd2UgYWRkIGEgJ2YnIHN1ZmZpeC4KKyAgVmFsdWUgKmVtaXRVbmFyeUZsb2F0Rm5DYWxsKFZhbHVlICpPcCwgU3RyaW5nUmVmIE5hbWUsIElSQnVpbGRlcjw+ICZCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cnMpOworCisgIC8vLyBFbWl0IGEgY2FsbCB0byB0aGUgYmluYXJ5IGZ1bmN0aW9uIG5hbWVkICdOYW1lJyAoZS5nLiAnZm1pbicpLiBUaGlzCisgIC8vLyBmdW5jdGlvbiBpcyBrbm93biB0byB0YWtlIHR5cGUgbWF0Y2hpbmcgJ09wMScgYW5kICdPcDInIGFuZCByZXR1cm4gb25lCisgIC8vLyB2YWx1ZSB3aXRoIHRoZSBzYW1lIHR5cGUuIElmICdPcDEvT3AyJyBhcmUgbG9uZyBkb3VibGUsICdsJyBpcyBhZGRlZCBhcworICAvLy8gdGhlIHN1ZmZpeCBvZiBuYW1lLCBpZiAnT3AxL09wMicgYXJlIGZsb2F0LCB3ZSBhZGQgYSAnZicgc3VmZml4LgorICBWYWx1ZSAqZW1pdEJpbmFyeUZsb2F0Rm5DYWxsKFZhbHVlICpPcDEsIFZhbHVlICpPcDIsIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSQnVpbGRlcjw+ICZCLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRycyk7CisKKyAgLy8vIEVtaXQgYSBjYWxsIHRvIHRoZSBwdXRjaGFyIGZ1bmN0aW9uLiBUaGlzIGFzc3VtZXMgdGhhdCBDaGFyIGlzIGFuIGludGVnZXIuCisgIFZhbHVlICplbWl0UHV0Q2hhcihWYWx1ZSAqQ2hhciwgSVJCdWlsZGVyPD4gJkIsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpOworCisgIC8vLyBFbWl0IGEgY2FsbCB0byB0aGUgcHV0cyBmdW5jdGlvbi4gVGhpcyBhc3N1bWVzIHRoYXQgU3RyIGlzIHNvbWUgcG9pbnRlci4KKyAgVmFsdWUgKmVtaXRQdXRTKFZhbHVlICpTdHIsIElSQnVpbGRlcjw+ICZCLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKKworICAvLy8gRW1pdCBhIGNhbGwgdG8gdGhlIGZwdXRjIGZ1bmN0aW9uLiBUaGlzIGFzc3VtZXMgdGhhdCBDaGFyIGlzIGFuIGkzMiwgYW5kCisgIC8vLyBGaWxlIGlzIGEgcG9pbnRlciB0byBGSUxFLgorICBWYWx1ZSAqZW1pdEZQdXRDKFZhbHVlICpDaGFyLCBWYWx1ZSAqRmlsZSwgSVJCdWlsZGVyPD4gJkIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSk7CisKKyAgLy8vIEVtaXQgYSBjYWxsIHRvIHRoZSBwdXRzIGZ1bmN0aW9uLiBTdHIgaXMgcmVxdWlyZWQgdG8gYmUgYSBwb2ludGVyIGFuZAorICAvLy8gRmlsZSBpcyBhIHBvaW50ZXIgdG8gRklMRS4KKyAgVmFsdWUgKmVtaXRGUHV0UyhWYWx1ZSAqU3RyLCBWYWx1ZSAqRmlsZSwgSVJCdWlsZGVyPD4gJkIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSk7CisKKyAgLy8vIEVtaXQgYSBjYWxsIHRvIHRoZSBmd3JpdGUgZnVuY3Rpb24uIFRoaXMgYXNzdW1lcyB0aGF0IFB0ciBpcyBhIHBvaW50ZXIsCisgIC8vLyBTaXplIGlzIGFuICdpbnRwdHJfdCcsIGFuZCBGaWxlIGlzIGEgcG9pbnRlciB0byBGSUxFLgorICBWYWx1ZSAqZW1pdEZXcml0ZShWYWx1ZSAqUHRyLCBWYWx1ZSAqU2l6ZSwgVmFsdWUgKkZpbGUsIElSQnVpbGRlcjw+ICZCLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0J5cGFzc1Nsb3dEaXZpc2lvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0J5cGFzc1Nsb3dEaXZpc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlY2E1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQnlwYXNzU2xvd0RpdmlzaW9uLmgKQEAgLTAsMCArMSw3MCBAQAorLy89PT0tIGxsdm0vVHJhbnNmb3Jtcy9VdGlscy9CeXBhc3NTbG93RGl2aXNpb24uaCAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgYW4gb3B0aW1pemF0aW9uIGZvciBkaXYgYW5kIHJlbSBvbiBhcmNoaXRlY3R1cmVzIHRoYXQKKy8vIGV4ZWN1dGUgc2hvcnQgaW5zdHJ1Y3Rpb25zIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4gbG9uZ2VyIGluc3RydWN0aW9ucy4KKy8vIEZvciBleGFtcGxlLCBvbiBJbnRlbCBBdG9tIDMyLWJpdCBkaXZpZGVzIGFyZSBzbG93IGVub3VnaCB0aGF0IGR1cmluZworLy8gcnVudGltZSBpdCBpcyBwcm9maXRhYmxlIHRvIGNoZWNrIHRoZSB2YWx1ZSBvZiB0aGUgb3BlcmFuZHMsIGFuZCBpZiB0aGV5IGFyZQorLy8gcG9zaXRpdmUgYW5kIGxlc3MgdGhhbiAyNTYgdXNlIGFuIHVuc2lnbmVkIDgtYml0IGRpdmlkZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19CWVBBU1NTTE9XRElWSVNJT05fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQllQQVNTU0xPV0RJVklTSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgVmFsdWU7CisKK3N0cnVjdCBEaXZSZW1NYXBLZXkgeworICBib29sIFNpZ25lZE9wOworICBWYWx1ZSAqRGl2aWRlbmQ7CisgIFZhbHVlICpEaXZpc29yOworCisgIERpdlJlbU1hcEtleShib29sIEluU2lnbmVkT3AsIFZhbHVlICpJbkRpdmlkZW5kLCBWYWx1ZSAqSW5EaXZpc29yKQorICAgICAgOiBTaWduZWRPcChJblNpZ25lZE9wKSwgRGl2aWRlbmQoSW5EaXZpZGVuZCksIERpdmlzb3IoSW5EaXZpc29yKSB7fQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IERlbnNlTWFwSW5mbzxEaXZSZW1NYXBLZXk+IHsKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBEaXZSZW1NYXBLZXkgJlZhbDEsIGNvbnN0IERpdlJlbU1hcEtleSAmVmFsMikgeworICAgIHJldHVybiBWYWwxLlNpZ25lZE9wID09IFZhbDIuU2lnbmVkT3AgJiYgVmFsMS5EaXZpZGVuZCA9PSBWYWwyLkRpdmlkZW5kICYmCisgICAgICAgICAgIFZhbDEuRGl2aXNvciA9PSBWYWwyLkRpdmlzb3I7CisgIH0KKworICBzdGF0aWMgRGl2UmVtTWFwS2V5IGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBEaXZSZW1NYXBLZXkoZmFsc2UsIG51bGxwdHIsIG51bGxwdHIpOworICB9CisKKyAgc3RhdGljIERpdlJlbU1hcEtleSBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgcmV0dXJuIERpdlJlbU1hcEtleSh0cnVlLCBudWxscHRyLCBudWxscHRyKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgRGl2UmVtTWFwS2V5ICZWYWwpIHsKKyAgICByZXR1cm4gKHVuc2lnbmVkKShyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oVmFsLkRpdmlkZW5kKSBeCisgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFZhbC5EaXZpc29yKSkgXgorICAgICAgICAgICAodW5zaWduZWQpVmFsLlNpZ25lZE9wOworICB9Cit9OworCisvLy8gVGhpcyBvcHRpbWl6YXRpb24gaWRlbnRpZmllcyBESVYgaW5zdHJ1Y3Rpb25zIGluIGEgQkIgdGhhdCBjYW4gYmUKKy8vLyBwcm9maXRhYmx5IGJ5cGFzc2VkIGFuZCBjYXJyaWVkIG91dCB3aXRoIGEgc2hvcnRlciwgZmFzdGVyIGRpdmlkZS4KKy8vLworLy8vIFRoaXMgb3B0aW1pemF0aW9uIG1heSBhZGQgYmFzaWMgYmxvY2tzIGltbWVkaWF0ZWx5IGFmdGVyIEJCOyBmb3Igb2J2aW91cworLy8vIHJlYXNvbnMsIHlvdSBzaG91bGRuJ3QgcGFzcyB0aG9zZSBibG9ja3MgdG8gYnlwYXNzU2xvd0RpdmlzaW9uLgorYm9vbCBieXBhc3NTbG93RGl2aXNpb24oCisgICAgQmFzaWNCbG9jayAqQkIsIGNvbnN0IERlbnNlTWFwPHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50PiAmQnlwYXNzV2lkdGgpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0JZUEFTU1NMT1dESVZJU0lPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQ2FsbFByb21vdGlvblV0aWxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQ2FsbFByb21vdGlvblV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU4ZWNlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9DYWxsUHJvbW90aW9uVXRpbHMuaApAQCAtMCwwICsxLDU0IEBACisvLz09PS0gQ2FsbFByb21vdGlvblV0aWxzLmggLSBVdGlsaXRpZXMgZm9yIGNhbGwgcHJvbW90aW9uIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB1dGlsaXRpZXMgdXNlZnVsIGZvciBwcm9tb3RpbmcgaW5kaXJlY3QgY2FsbCBzaXRlcyB0bworLy8gZGlyZWN0IGNhbGwgc2l0ZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQ0FMTFBST01PVElPTlVUSUxTX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0NBTExQUk9NT1RJT05VVElMU19ICisKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBpbmRpcmVjdCBjYWxsIHNpdGUgY2FuIGJlIG1hZGUgdG8gY2FsbCBccCBDYWxsZWUuCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIGVuc3VyZXMgdGhhdCB0aGUgbnVtYmVyIGFuZCB0eXBlIG9mIHRoZSBjYWxsIHNpdGUncyBhcmd1bWVudHMKKy8vLyBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRob3NlIG9mIHRoZSBnaXZlbiBmdW5jdGlvbi4gSWYgdGhlIHR5cGVzIGRvIG5vdAorLy8vIG1hdGNoIGV4YWN0bHksIHRoZXkgbXVzdCBhdCBsZWFzdCBiZSBiaXRjYXN0IGNvbXBhdGlibGUuIElmIFxwIEZhaWx1cmVSZWFzb24KKy8vLyBpcyBub24tbnVsbCBhbmQgdGhlIGluZGlyZWN0IGNhbGwgY2Fubm90IGJlIHByb21vdGVkLCB0aGUgZmFpbHVyZSByZWFzb24KKy8vLyB3aWxsIGJlIHN0b3JlZCBpbiBpdC4KK2Jvb2wgaXNMZWdhbFRvUHJvbW90ZShDYWxsU2l0ZSBDUywgRnVuY3Rpb24gKkNhbGxlZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqRmFpbHVyZVJlYXNvbiA9IG51bGxwdHIpOworCisvLy8gUHJvbW90ZSB0aGUgZ2l2ZW4gaW5kaXJlY3QgY2FsbCBzaXRlIHRvIHVuY29uZGl0aW9uYWxseSBjYWxsIFxwIENhbGxlZS4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gcHJvbW90ZXMgdGhlIGdpdmVuIGNhbGwgc2l0ZSwgcmV0dXJuaW5nIHRoZSBkaXJlY3QgY2FsbCBvcgorLy8vIGludm9rZSBpbnN0cnVjdGlvbi4gSWYgdGhlIGZ1bmN0aW9uIHR5cGUgb2YgdGhlIGNhbGwgc2l0ZSBkb2Vzbid0IG1hdGNoIHRoYXQKKy8vLyBvZiB0aGUgY2FsbGVlLCBiaXRjYXN0IGluc3RydWN0aW9ucyBhcmUgaW5zZXJ0ZWQgd2hlcmUgYXBwcm9wcmlhdGUuIElmIFxwCisvLy8gUmV0Qml0Q2FzdCBpcyBub24tbnVsbCwgaXQgd2lsbCBiZSB1c2VkIHRvIHN0b3JlIHRoZSByZXR1cm4gdmFsdWUgYml0Y2FzdCwKKy8vLyBpZiBjcmVhdGVkLgorSW5zdHJ1Y3Rpb24gKnByb21vdGVDYWxsKENhbGxTaXRlIENTLCBGdW5jdGlvbiAqQ2FsbGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIENhc3RJbnN0ICoqUmV0Qml0Q2FzdCA9IG51bGxwdHIpOworCisvLy8gUHJvbW90ZSB0aGUgZ2l2ZW4gaW5kaXJlY3QgY2FsbCBzaXRlIHRvIGNvbmRpdGlvbmFsbHkgY2FsbCBccCBDYWxsZWUuCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW4gaWYtdGhlbi1lbHNlIHN0cnVjdHVyZSBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIGNhbGwKKy8vLyBzaXRlLiBUaGUgb3JpZ2luYWwgY2FsbCBzaXRlIGlzIG1vdmVkIGludG8gdGhlICJlbHNlIiBibG9jay4gQSBjbG9uZSBvZiB0aGUKKy8vLyBpbmRpcmVjdCBjYWxsIHNpdGUgaXMgcHJvbW90ZWQsIHBsYWNlZCBpbiB0aGUgInRoZW4iIGJsb2NrLCBhbmQgcmV0dXJuZWQuIElmCisvLy8gXHAgQnJhbmNoV2VpZ2h0cyBpcyBub24tbnVsbCwgaXQgd2lsbCBiZSB1c2VkIHRvIHNldCAhcHJvZiBtZXRhZGF0YSBvbiB0aGUKKy8vLyBuZXcgY29uZGl0aW9uYWwgYnJhbmNoLgorSW5zdHJ1Y3Rpb24gKnByb21vdGVDYWxsV2l0aElmVGhlbkVsc2UoQ2FsbFNpdGUgQ1MsIEZ1bmN0aW9uICpDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkJyYW5jaFdlaWdodHMgPSBudWxscHRyKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19DQUxMUFJPTU9USU9OVVRJTFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0Nsb25pbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9DbG9uaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QwMmNhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9DbG9uaW5nLmgKQEAgLTAsMCArMSwyNzIgQEAKKy8vPT09LSBDbG9uaW5nLmggLSBDbG9uZSB2YXJpb3VzIHBhcnRzIG9mIExMVk0gcHJvZ3JhbXMgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdmFyaW91cyBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZCB0byBjbG9uZSBjaHVua3Mgb2YgTExWTQorLy8gY29kZSBmb3IgdmFyaW91cyBwdXJwb3Nlcy4gIFRoaXMgdmFyaWVzIGZyb20gY29weWluZyB3aG9sZSBtb2R1bGVzIGludG8gbmV3CisvLyBtb2R1bGVzLCB0byBjbG9uaW5nIGZ1bmN0aW9ucyB3aXRoIGRpZmZlcmVudCBhcmd1bWVudHMsIHRvIGlubGluaW5nCisvLyBmdW5jdGlvbnMsIHRvIGNvcHlpbmcgYmFzaWMgYmxvY2tzIHRvIHN1cHBvcnQgbG9vcCB1bnJvbGxpbmcgb3Igc3VwZXJibG9jaworLy8gZm9ybWF0aW9uLCBldGMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQ0xPTklOR19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19DTE9OSU5HX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0Fzc3VtcHRpb25DYWNoZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1ZhbHVlTWFwcGVyLmgiCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFsbG9jYUluc3Q7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgQmxvY2tGcmVxdWVuY3lJbmZvOworY2xhc3MgQ2FsbEluc3Q7CitjbGFzcyBDYWxsR3JhcGg7CitjbGFzcyBEZWJ1Z0luZm9GaW5kZXI7CitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIEludm9rZUluc3Q7CitjbGFzcyBMb29wOworY2xhc3MgTG9vcEluZm87CitjbGFzcyBNb2R1bGU7CitjbGFzcyBQcm9maWxlU3VtbWFyeUluZm87CitjbGFzcyBSZXR1cm5JbnN0OworCisvLy8gUmV0dXJuIGFuIGV4YWN0IGNvcHkgb2YgdGhlIHNwZWNpZmllZCBtb2R1bGUKKy8vLworc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gQ2xvbmVNb2R1bGUoY29uc3QgTW9kdWxlICZNKTsKK3N0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IENsb25lTW9kdWxlKGNvbnN0IE1vZHVsZSAmTSwgVmFsdWVUb1ZhbHVlTWFwVHkgJlZNYXApOworCisvLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIG1vZHVsZS4gVGhlIFNob3VsZENsb25lRGVmaW5pdGlvbiBmdW5jdGlvbgorLy8vIGNvbnRyb2xzIHdoZXRoZXIgYSBzcGVjaWZpYyBHbG9iYWxWYWx1ZSdzIGRlZmluaXRpb24gaXMgY2xvbmVkLiBJZiB0aGUKKy8vLyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgbW9kdWxlIGNvcHkgd2lsbCBjb250YWluIGFuIGV4dGVybmFsIHJlZmVyZW5jZQorLy8vIGluIHBsYWNlIG9mIHRoZSBnbG9iYWwgZGVmaW5pdGlvbi4KK3N0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+CitDbG9uZU1vZHVsZShjb25zdCBNb2R1bGUgJk0sIFZhbHVlVG9WYWx1ZU1hcFR5ICZWTWFwLAorICAgICAgICAgICAgZnVuY3Rpb25fcmVmPGJvb2woY29uc3QgR2xvYmFsVmFsdWUgKik+IFNob3VsZENsb25lRGVmaW5pdGlvbik7CisKKy8vLyBDbG9uZWRDb2RlSW5mbyAtIFRoaXMgc3RydWN0IGNhbiBiZSB1c2VkIHRvIGNhcHR1cmUgaW5mb3JtYXRpb24gYWJvdXQgY29kZQorLy8vIGJlaW5nIGNsb25lZCwgd2hpbGUgaXQgaXMgYmVpbmcgY2xvbmVkLgorc3RydWN0IENsb25lZENvZGVJbmZvIHsKKyAgLy8vIENvbnRhaW5zQ2FsbHMgLSBUaGlzIGlzIHNldCB0byB0cnVlIGlmIHRoZSBjbG9uZWQgY29kZSBjb250YWlucyBhIG5vcm1hbAorICAvLy8gY2FsbCBpbnN0cnVjdGlvbi4KKyAgYm9vbCBDb250YWluc0NhbGxzID0gZmFsc2U7CisKKyAgLy8vIENvbnRhaW5zRHluYW1pY0FsbG9jYXMgLSBUaGlzIGlzIHNldCB0byB0cnVlIGlmIHRoZSBjbG9uZWQgY29kZSBjb250YWlucworICAvLy8gYSAnZHluYW1pYycgYWxsb2NhLiAgRHluYW1pYyBhbGxvY2FzIGFyZSBhbGxvY2FzIHRoYXQgYXJlIGVpdGhlciBub3QgaW4KKyAgLy8vIHRoZSBlbnRyeSBibG9jayBvciB0aGV5IGFyZSBpbiB0aGUgZW50cnkgYmxvY2sgYnV0IGFyZSBub3QgYSBjb25zdGFudAorICAvLy8gc2l6ZS4KKyAgYm9vbCBDb250YWluc0R5bmFtaWNBbGxvY2FzID0gZmFsc2U7CisKKyAgLy8vIEFsbCBjbG9uZWQgY2FsbCBzaXRlcyB0aGF0IGhhdmUgb3BlcmFuZCBidW5kbGVzIGF0dGFjaGVkIGFyZSBhcHBlbmRlZCB0bworICAvLy8gdGhpcyB2ZWN0b3IuICBUaGlzIHZlY3RvciBtYXkgY29udGFpbiBudWxscyBvciB1bmRlZnMgaWYgc29tZSBvZiB0aGUKKyAgLy8vIG9yaWdpbmFsbHkgaW5zZXJ0ZWQgY2FsbHNpdGVzIHdlcmUgRENFJ2VkIGFmdGVyIHRoZXkgd2VyZSBjbG9uZWQuCisgIHN0ZDo6dmVjdG9yPFdlYWtUcmFja2luZ1ZIPiBPcGVyYW5kQnVuZGxlQ2FsbFNpdGVzOworCisgIENsb25lZENvZGVJbmZvKCkgPSBkZWZhdWx0OworfTsKKworLy8vIENsb25lQmFzaWNCbG9jayAtIFJldHVybiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jaywgYnV0IHdpdGhvdXQKKy8vLyBlbWJlZGRpbmcgdGhlIGJsb2NrIGludG8gYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uLiAgVGhlIGJsb2NrIHJldHVybmVkIGlzIGFuCisvLy8gZXhhY3QgY29weSBvZiB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrLCB3aXRob3V0IGFueSByZW1hcHBpbmcgaGF2aW5nIGJlZW4KKy8vLyBwZXJmb3JtZWQuICBCZWNhdXNlIG9mIHRoaXMsIHRoaXMgaXMgb25seSBzdWl0YWJsZSBmb3IgYXBwbGljYXRpb25zIHdoZXJlCisvLy8gdGhlIGJhc2ljIGJsb2NrIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgc2FtZSBmdW5jdGlvbiB0aGF0IGl0IHdhcyBjbG9uZWQKKy8vLyBmcm9tIChsb29wIHVucm9sbGluZyB3b3VsZCB1c2UgdGhpcywgZm9yIGV4YW1wbGUpLgorLy8vCisvLy8gQWxzbywgbm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gbWFrZXMgYSBkaXJlY3QgY29weSBvZiB0aGUgYmFzaWMgYmxvY2ssIGFuZAorLy8vIGNhbiB0aHVzIHByb2R1Y2UgaWxsZWdhbCBMTFZNIGNvZGUuICBJbiBwYXJ0aWN1bGFyLCBpdCB3aWxsIGNvcHkgYW55IFBISQorLy8vIG5vZGVzIGZyb20gdGhlIG9yaWdpbmFsIGJsb2NrLCBldmVuIHRob3VnaCB0aGVyZSBhcmUgbm8gcHJlZGVjZXNzb3JzIGZvciB0aGUKKy8vLyBuZXdseSBjbG9uZWQgYmxvY2sgKHRodXMsIHBoaSBub2RlcyB3aWxsIGhhdmUgdG8gYmUgdXBkYXRlZCkuICBBbHNvLCB0aGlzCisvLy8gYmxvY2sgd2lsbCBicmFuY2ggdG8gdGhlIG9sZCBzdWNjZXNzb3JzIG9mIHRoZSBvcmlnaW5hbCBibG9jazogdGhlc2UKKy8vLyBzdWNjZXNzb3JzIHdpbGwgaGF2ZSB0byBoYXZlIGFueSBQSEkgbm9kZXMgdXBkYXRlZCB0byBhY2NvdW50IGZvciB0aGUgbmV3CisvLy8gaW5jb21pbmcgZWRnZXMuCisvLy8KKy8vLyBUaGUgY29ycmVsYXRpb24gYmV0d2VlbiBpbnN0cnVjdGlvbnMgaW4gdGhlIHNvdXJjZSBhbmQgcmVzdWx0IGJhc2ljIGJsb2NrcworLy8vIGlzIHJlY29yZGVkIGluIHRoZSBWTWFwIG1hcC4KKy8vLworLy8vIElmIHlvdSBoYXZlIGEgcGFydGljdWxhciBzdWZmaXggeW91J2QgbGlrZSB0byB1c2UgdG8gYWRkIHRvIGFueSBjbG9uZWQKKy8vLyBuYW1lcywgc3BlY2lmeSBpdCBhcyB0aGUgb3B0aW9uYWwgdGhpcmQgcGFyYW1ldGVyLgorLy8vCisvLy8gSWYgeW91IHdvdWxkIGxpa2UgdGhlIGJhc2ljIGJsb2NrIHRvIGJlIGF1dG8taW5zZXJ0ZWQgaW50byB0aGUgZW5kIG9mIGEKKy8vLyBmdW5jdGlvbiwgeW91IGNhbiBzcGVjaWZ5IGl0IGFzIHRoZSBvcHRpb25hbCBmb3VydGggcGFyYW1ldGVyLgorLy8vCisvLy8gSWYgeW91IHdvdWxkIGxpa2UgdG8gY29sbGVjdCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjbG9uZWQKKy8vLyBmdW5jdGlvbiwgeW91IGNhbiBzcGVjaWZ5IGEgQ2xvbmVkQ29kZUluZm8gb2JqZWN0IHdpdGggdGhlIG9wdGlvbmFsIGZpZnRoCisvLy8gcGFyYW1ldGVyLgorLy8vCitCYXNpY0Jsb2NrICpDbG9uZUJhc2ljQmxvY2soY29uc3QgQmFzaWNCbG9jayAqQkIsIFZhbHVlVG9WYWx1ZU1hcFR5ICZWTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3VmZml4ID0gIiIsIEZ1bmN0aW9uICpGID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9uZWRDb2RlSW5mbyAqQ29kZUluZm8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnSW5mb0ZpbmRlciAqRElGaW5kZXIgPSBudWxscHRyKTsKKworLy8vIENsb25lRnVuY3Rpb24gLSBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gYW5kIGFkZCBpdCB0byB0aGF0CisvLy8gZnVuY3Rpb24ncyBtb2R1bGUuICBBbHNvLCBhbnkgcmVmZXJlbmNlcyBzcGVjaWZpZWQgaW4gdGhlIFZNYXAgYXJlIGNoYW5nZWQKKy8vLyB0byByZWZlciB0byB0aGVpciBtYXBwZWQgdmFsdWUgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgb25lLiAgSWYgYW55IG9mIHRoZQorLy8vIGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24gYXJlIGluIHRoZSBWTWFwLCB0aGUgYXJndW1lbnRzIGFyZSBkZWxldGVkIGZyb20KKy8vLyB0aGUgcmVzdWx0YW50IGZ1bmN0aW9uLiAgVGhlIFZNYXAgaXMgdXBkYXRlZCB0byBpbmNsdWRlIG1hcHBpbmdzIGZyb20gYWxsIG9mCisvLy8gdGhlIGluc3RydWN0aW9ucyBhbmQgYmFzaWNibG9ja3MgaW4gdGhlIGZ1bmN0aW9uIGZyb20gdGhlaXIgb2xkIHRvIG5ldworLy8vIHZhbHVlcy4gIFRoZSBmaW5hbCBhcmd1bWVudCBjYXB0dXJlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xvbmVkIGNvZGUgaWYKKy8vLyBub24tbnVsbC4KKy8vLworLy8vIFZNYXAgY29udGFpbnMgbm8gbm9uLWlkZW50aXR5IEdsb2JhbFZhbHVlIG1hcHBpbmdzIGFuZCBkZWJ1ZyBpbmZvIG1ldGFkYXRhCisvLy8gd2lsbCBub3QgYmUgY2xvbmVkLgorLy8vCitGdW5jdGlvbiAqQ2xvbmVGdW5jdGlvbihGdW5jdGlvbiAqRiwgVmFsdWVUb1ZhbHVlTWFwVHkgJlZNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBDbG9uZWRDb2RlSW5mbyAqQ29kZUluZm8gPSBudWxscHRyKTsKKworLy8vIENsb25lIE9sZEZ1bmMgaW50byBOZXdGdW5jLCB0cmFuc2Zvcm1pbmcgdGhlIG9sZCBhcmd1bWVudHMgaW50byByZWZlcmVuY2VzCisvLy8gdG8gVk1hcCB2YWx1ZXMuICBOb3RlIHRoYXQgaWYgTmV3RnVuYyBhbHJlYWR5IGhhcyBiYXNpYyBibG9ja3MsIHRoZSBvbmVzCisvLy8gY2xvbmVkIGludG8gaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24KKy8vLyBmaWxscyBpbiBhIGxpc3Qgb2YgcmV0dXJuIGluc3RydWN0aW9ucywgYW5kIGNhbiBvcHRpb25hbGx5IHJlbWFwIHR5cGVzCisvLy8gYW5kL29yIGFwcGVuZCB0aGUgc3BlY2lmaWVkIHN1ZmZpeCB0byBhbGwgdmFsdWVzIGNsb25lZC4KKy8vLworLy8vIElmIE1vZHVsZUxldmVsQ2hhbmdlcyBpcyBmYWxzZSwgVk1hcCBjb250YWlucyBubyBub24taWRlbnRpdHkgR2xvYmFsVmFsdWUKKy8vLyBtYXBwaW5ncy4KKy8vLwordm9pZCBDbG9uZUZ1bmN0aW9uSW50byhGdW5jdGlvbiAqTmV3RnVuYywgY29uc3QgRnVuY3Rpb24gKk9sZEZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlVG9WYWx1ZU1hcFR5ICZWTWFwLCBib29sIE1vZHVsZUxldmVsQ2hhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFJldHVybkluc3QqPiAmUmV0dXJucywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTmFtZVN1ZmZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICBDbG9uZWRDb2RlSW5mbyAqQ29kZUluZm8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZU1hcFR5cGVSZW1hcHBlciAqVHlwZU1hcHBlciA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTWF0ZXJpYWxpemVyICpNYXRlcmlhbGl6ZXIgPSBudWxscHRyKTsKKwordm9pZCBDbG9uZUFuZFBydW5lSW50b0Zyb21JbnN0KEZ1bmN0aW9uICpOZXdGdW5jLCBjb25zdCBGdW5jdGlvbiAqT2xkRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqU3RhcnRpbmdJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlVG9WYWx1ZU1hcFR5ICZWTWFwLCBib29sIE1vZHVsZUxldmVsQ2hhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8UmV0dXJuSW5zdCAqPiAmUmV0dXJucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lU3VmZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvbmVkQ29kZUluZm8gKkNvZGVJbmZvID0gbnVsbHB0cik7CisKKy8vLyBDbG9uZUFuZFBydW5lRnVuY3Rpb25JbnRvIC0gVGhpcyB3b3JrcyBleGFjdGx5IGxpa2UgQ2xvbmVGdW5jdGlvbkludG8sCisvLy8gZXhjZXB0IHRoYXQgaXQgZG9lcyBzb21lIHNpbXBsZSBjb25zdGFudCBwcm9wIGFuZCBEQ0Ugb24gdGhlIGZseS4gIFRoZQorLy8vIGVmZmVjdCBvZiB0aGlzIGlzIHRvIGNvcHkgc2lnbmlmaWNhbnRseSBsZXNzIGNvZGUgaW4gY2FzZXMgd2hlcmUgKGZvcgorLy8vIGV4YW1wbGUpIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGNvbnN0YW50IGFyZ3VtZW50cyBpcyBpbmxpbmVkLCBhbmQgdGhvc2UKKy8vLyBjb25zdGFudCBhcmd1bWVudHMgY2F1c2UgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgY29kZSBpbiB0aGUgY2FsbGVlIHRvIGJlCisvLy8gZGVhZC4gIFNpbmNlIHRoaXMgZG9lc24ndCBwcm9kdWNlIGFuIGV4YWN0bHkgY29weSBvZiB0aGUgaW5wdXQsIGl0IGNhbid0IGJlCisvLy8gdXNlZCBmb3IgdGhpbmdzIGxpa2UgQ2xvbmVGdW5jdGlvbiBvciBDbG9uZU1vZHVsZS4KKy8vLworLy8vIElmIE1vZHVsZUxldmVsQ2hhbmdlcyBpcyBmYWxzZSwgVk1hcCBjb250YWlucyBubyBub24taWRlbnRpdHkgR2xvYmFsVmFsdWUKKy8vLyBtYXBwaW5ncy4KKy8vLwordm9pZCBDbG9uZUFuZFBydW5lRnVuY3Rpb25JbnRvKEZ1bmN0aW9uICpOZXdGdW5jLCBjb25zdCBGdW5jdGlvbiAqT2xkRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVRvVmFsdWVNYXBUeSAmVk1hcCwgYm9vbCBNb2R1bGVMZXZlbENoYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFJldHVybkluc3QqPiAmUmV0dXJucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lU3VmZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvbmVkQ29kZUluZm8gKkNvZGVJbmZvID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqVGhlQ2FsbCA9IG51bGxwdHIpOworCisvLy8gSW5saW5lRnVuY3Rpb25JbmZvIC0gVGhpcyBjbGFzcyBjYXB0dXJlcyB0aGUgZGF0YSBpbnB1dCB0byB0aGUKKy8vLyBJbmxpbmVGdW5jdGlvbiBjYWxsLCBhbmQgcmVjb3JkcyB0aGUgYXV4aWxpYXJ5IHJlc3VsdHMgcHJvZHVjZWQgYnkgaXQuCitjbGFzcyBJbmxpbmVGdW5jdGlvbkluZm8geworcHVibGljOgorICBleHBsaWNpdCBJbmxpbmVGdW5jdGlvbkluZm8oQ2FsbEdyYXBoICpjZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPEFzc3VtcHRpb25DYWNoZSAmKEZ1bmN0aW9uICYpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpHZXRBc3N1bXB0aW9uQ2FjaGUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZVN1bW1hcnlJbmZvICpQU0kgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tGcmVxdWVuY3lJbmZvICpDYWxsZXJCRkkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tGcmVxdWVuY3lJbmZvICpDYWxsZWVCRkkgPSBudWxscHRyKQorICAgICAgOiBDRyhjZyksIEdldEFzc3VtcHRpb25DYWNoZShHZXRBc3N1bXB0aW9uQ2FjaGUpLCBQU0koUFNJKSwKKyAgICAgICAgQ2FsbGVyQkZJKENhbGxlckJGSSksIENhbGxlZUJGSShDYWxsZWVCRkkpIHt9CisKKyAgLy8vIENHIC0gSWYgbm9uLW51bGwsIElubGluZUZ1bmN0aW9uIHdpbGwgdXBkYXRlIHRoZSBjYWxsZ3JhcGggdG8gcmVmbGVjdCB0aGUKKyAgLy8vIGNoYW5nZXMgaXQgbWFrZXMuCisgIENhbGxHcmFwaCAqQ0c7CisgIHN0ZDo6ZnVuY3Rpb248QXNzdW1wdGlvbkNhY2hlICYoRnVuY3Rpb24gJik+ICpHZXRBc3N1bXB0aW9uQ2FjaGU7CisgIFByb2ZpbGVTdW1tYXJ5SW5mbyAqUFNJOworICBCbG9ja0ZyZXF1ZW5jeUluZm8gKkNhbGxlckJGSSwgKkNhbGxlZUJGSTsKKworICAvLy8gU3RhdGljQWxsb2NhcyAtIElubGluZUZ1bmN0aW9uIGZpbGxzIHRoaXMgaW4gd2l0aCBhbGwgc3RhdGljIGFsbG9jYXMgdGhhdAorICAvLy8gZ2V0IGNvcGllZCBpbnRvIHRoZSBjYWxsZXIuCisgIFNtYWxsVmVjdG9yPEFsbG9jYUluc3QgKiwgND4gU3RhdGljQWxsb2NhczsKKworICAvLy8gSW5saW5lZENhbGxzIC0gSW5saW5lRnVuY3Rpb24gZmlsbHMgdGhpcyBpbiB3aXRoIGNhbGxzaXRlcyB0aGF0IHdlcmUKKyAgLy8vIGlubGluZWQgZnJvbSB0aGUgY2FsbGVlLiAgVGhpcyBpcyBvbmx5IGZpbGxlZCBpbiBpZiBDRyBpcyBub24tbnVsbC4KKyAgU21hbGxWZWN0b3I8V2Vha1RyYWNraW5nVkgsIDg+IElubGluZWRDYWxsczsKKworICAvLy8gQWxsIG9mIHRoZSBuZXcgY2FsbCBzaXRlcyBpbmxpbmVkIGludG8gdGhlIGNhbGxlci4KKyAgLy8vCisgIC8vLyAnSW5saW5lRnVuY3Rpb24nIGZpbGxzIHRoaXMgaW4gYnkgc2Nhbm5pbmcgdGhlIGlubGluZWQgaW5zdHJ1Y3Rpb25zLCBhbmQKKyAgLy8vIG9ubHkgaWYgQ0cgaXMgbnVsbC4gSWYgQ0cgaXMgbm9uLW51bGwsIGluc3RlYWQgdGhlIHZhbHVlIGhhbmRsZQorICAvLy8gYElubGluZWRDYWxsc2AgYWJvdmUgaXMgdXNlZC4KKyAgU21hbGxWZWN0b3I8Q2FsbFNpdGUsIDg+IElubGluZWRDYWxsU2l0ZXM7CisKKyAgdm9pZCByZXNldCgpIHsKKyAgICBTdGF0aWNBbGxvY2FzLmNsZWFyKCk7CisgICAgSW5saW5lZENhbGxzLmNsZWFyKCk7CisgICAgSW5saW5lZENhbGxTaXRlcy5jbGVhcigpOworICB9Cit9OworCisvLy8gSW5saW5lRnVuY3Rpb24gLSBUaGlzIGZ1bmN0aW9uIGlubGluZXMgdGhlIGNhbGxlZCBmdW5jdGlvbiBpbnRvIHRoZSBiYXNpYworLy8vIGJsb2NrIG9mIHRoZSBjYWxsZXIuICBUaGlzIHJldHVybnMgZmFsc2UgaWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGlubGluZQorLy8vIHRoaXMgY2FsbC4gIFRoZSBwcm9ncmFtIGlzIHN0aWxsIGluIGEgd2VsbCBkZWZpbmVkIHN0YXRlIGlmIHRoaXMgb2NjdXJzCisvLy8gdGhvdWdoLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgb25seSBkb2VzIG9uZSBsZXZlbCBvZiBpbmxpbmluZy4gIEZvciBleGFtcGxlLCBpZiB0aGUKKy8vLyBpbnN0cnVjdGlvbiAnY2FsbCBCJyBpcyBpbmxpbmVkLCBhbmQgJ0InIGNhbGxzICdDJywgdGhlbiB0aGUgY2FsbCB0byAnQycgbm93CisvLy8gZXhpc3RzIGluIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0uICBTaW1pbGFybHkgdGhpcyB3aWxsIGlubGluZSBhIHJlY3Vyc2l2ZQorLy8vIGZ1bmN0aW9uIGJ5IG9uZSBsZXZlbC4KKy8vLworLy8vIE5vdGUgdGhhdCB3aGlsZSB0aGlzIHJvdXRpbmUgaXMgYWxsb3dlZCB0byBjbGVhbnVwIGFuZCBvcHRpbWl6ZSB0aGUKKy8vLyAqaW5saW5lZCogY29kZSB0byBtaW5pbWl6ZSB0aGUgYWN0dWFsIGluc2VydGVkIGNvZGUsIGl0IG11c3Qgbm90IGRlbGV0ZQorLy8vIGNvZGUgaW4gdGhlIGNhbGxlciBhcyB1c2VycyBvZiB0aGlzIHJvdXRpbmUgbWF5IGhhdmUgcG9pbnRlcnMgdG8KKy8vLyBpbnN0cnVjdGlvbnMgaW4gdGhlIGNhbGxlciB0aGF0IG5lZWQgdG8gcmVtYWluIHN0YWJsZS4KKy8vLworLy8vIElmIEZvcndhcmRWYXJBcmdzVG8gaXMgcGFzc2VkLCBpbmxpbmluZyBhIGZ1bmN0aW9uIHdpdGggdmFyYXJncyBpcyBhbGxvd2VkCisvLy8gYW5kIGFsbCB2YXJhcmdzIGF0IHRoZSBjYWxsc2l0ZSB3aWxsIGJlIHBhc3NlZCB0byBhbnkgY2FsbHMgdG8KKy8vLyBGb3J3YXJkVmFyQXJnc1RvLiBUaGUgY2FsbGVyIG9mIElubGluZUZ1bmN0aW9uIGhhcyB0byBtYWtlIHN1cmUgYW55IHZhcmFyZ3MKKy8vLyBhcmUgb25seSB1c2VkIGJ5IEZvcndhcmRWYXJBcmdzVG8uCitib29sIElubGluZUZ1bmN0aW9uKENhbGxJbnN0ICpDLCBJbmxpbmVGdW5jdGlvbkluZm8gJklGSSwKKyAgICAgICAgICAgICAgICAgICAgQUFSZXN1bHRzICpDYWxsZWVBQVIgPSBudWxscHRyLCBib29sIEluc2VydExpZmV0aW1lID0gdHJ1ZSk7Citib29sIElubGluZUZ1bmN0aW9uKEludm9rZUluc3QgKklJLCBJbmxpbmVGdW5jdGlvbkluZm8gJklGSSwKKyAgICAgICAgICAgICAgICAgICAgQUFSZXN1bHRzICpDYWxsZWVBQVIgPSBudWxscHRyLCBib29sIEluc2VydExpZmV0aW1lID0gdHJ1ZSk7Citib29sIElubGluZUZ1bmN0aW9uKENhbGxTaXRlIENTLCBJbmxpbmVGdW5jdGlvbkluZm8gJklGSSwKKyAgICAgICAgICAgICAgICAgICAgQUFSZXN1bHRzICpDYWxsZWVBQVIgPSBudWxscHRyLCBib29sIEluc2VydExpZmV0aW1lID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gKkZvcndhcmRWYXJBcmdzVG8gPSBudWxscHRyKTsKKworLy8vIFxicmllZiBDbG9uZXMgYSBsb29wIFxwIE9yaWdMb29wLiAgUmV0dXJucyB0aGUgbG9vcCBhbmQgdGhlIGJsb2NrcyBpbiBccAorLy8vIEJsb2Nrcy4KKy8vLworLy8vIFVwZGF0ZXMgTG9vcEluZm8gYW5kIERvbWluYXRvclRyZWUgYXNzdW1pbmcgdGhlIGxvb3AgaXMgZG9taW5hdGVkIGJ5IGJsb2NrCisvLy8gXHAgTG9vcERvbUJCLiAgSW5zZXJ0IHRoZSBuZXcgYmxvY2tzIGJlZm9yZSBibG9jayBzcGVjaWZpZWQgaW4gXHAgQmVmb3JlLgorLy8vIE5vdGU6IE9ubHkgaW5uZXJtb3N0IGxvb3BzIGFyZSBzdXBwb3J0ZWQuCitMb29wICpjbG9uZUxvb3BXaXRoUHJlaGVhZGVyKEJhc2ljQmxvY2sgKkJlZm9yZSwgQmFzaWNCbG9jayAqTG9vcERvbUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wICpPcmlnTG9vcCwgVmFsdWVUb1ZhbHVlTWFwVHkgJlZNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3VmZml4LCBMb29wSW5mbyAqTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgKkRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8QmFzaWNCbG9jayAqPiAmQmxvY2tzKTsKKworLy8vIFxicmllZiBSZW1hcHMgaW5zdHJ1Y3Rpb25zIGluIFxwIEJsb2NrcyB1c2luZyB0aGUgbWFwcGluZyBpbiBccCBWTWFwLgordm9pZCByZW1hcEluc3RydWN0aW9uc0luQmxvY2tzKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxCYXNpY0Jsb2NrICo+ICZCbG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVUb1ZhbHVlTWFwVHkgJlZNYXApOworCisvLy8gU3BsaXQgZWRnZSBiZXR3ZWVuIEJCIGFuZCBQcmVkQkIgYW5kIGR1cGxpY2F0ZSBhbGwgbm9uLVBoaSBpbnN0cnVjdGlvbnMKKy8vLyBmcm9tIEJCIGJldHdlZW4gaXRzIGJlZ2lubmluZyBhbmQgdGhlIFN0b3BBdCBpbnN0cnVjdGlvbiBpbnRvIHRoZSBzcGxpdAorLy8vIGJsb2NrLiBQaGkgbm9kZXMgYXJlIG5vdCBkdXBsaWNhdGVkLCBidXQgdGhlaXIgdXNlcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHk6CisvLy8gd2UgcmVwbGFjZSB0aGVtIHdpdGggdGhlIHVzZXMgb2YgY29ycmVzcG9uZGluZyBQaGkgaW5wdXRzLiBWYWx1ZU1hcHBpbmcKKy8vLyBpcyB1c2VkIHRvIG1hcCB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb25zIGZyb20gQkIgdG8gdGhlaXIgbmV3bHktY3JlYXRlZAorLy8vIGNvcGllcy4gUmV0dXJucyB0aGUgc3BsaXQgYmxvY2suCitCYXNpY0Jsb2NrICoKK0R1cGxpY2F0ZUluc3RydWN0aW9uc0luU3BsaXRCZXR3ZWVuKEJhc2ljQmxvY2sgKkJCLCBCYXNpY0Jsb2NrICpQcmVkQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqU3RvcEF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVUb1ZhbHVlTWFwVHkgJlZhbHVlTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cik7Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0NMT05JTkdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0NvZGVFeHRyYWN0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Db2RlRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkMzQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Db2RlRXh0cmFjdG9yLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8vPT09LSBUcmFuc2Zvcm0vVXRpbHMvQ29kZUV4dHJhY3Rvci5oIC0gQ29kZSBleHRyYWN0aW9uIHV0aWwgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQSB1dGlsaXR5IHRvIHN1cHBvcnQgZXh0cmFjdGluZyBjb2RlIGZyb20gb25lIGZ1bmN0aW9uIGludG8gaXRzIG93bgorLy8gc3RhbmQtYWxvbmUgZnVuY3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQ09ERUVYVFJBQ1RPUl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19DT0RFRVhUUkFDVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEJsb2NrRnJlcXVlbmN5OworY2xhc3MgQmxvY2tGcmVxdWVuY3lJbmZvOworY2xhc3MgQnJhbmNoUHJvYmFiaWxpdHlJbmZvOworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBMb29wOworY2xhc3MgTW9kdWxlOworY2xhc3MgVHlwZTsKK2NsYXNzIFZhbHVlOworCisgIC8vLyBcYnJpZWYgVXRpbGl0eSBjbGFzcyBmb3IgZXh0cmFjdGluZyBjb2RlIGludG8gYSBuZXcgZnVuY3Rpb24uCisgIC8vLworICAvLy8gVGhpcyB1dGlsaXR5IHByb3ZpZGVzIGEgc2ltcGxlIGludGVyZmFjZSBmb3IgZXh0cmFjdGluZyBzb21lIHNlcXVlbmNlIG9mCisgIC8vLyBjb2RlIGludG8gaXRzIG93biBmdW5jdGlvbiwgcmVwbGFjaW5nIGl0IHdpdGggYSBjYWxsIHRvIHRoYXQgZnVuY3Rpb24uIEl0CisgIC8vLyBhbHNvIHByb3ZpZGVzIHZhcmlvdXMgbWV0aG9kcyB0byBxdWVyeSBhYm91dCB0aGUgbmF0dXJlIGFuZCByZXN1bHQgb2YKKyAgLy8vIHN1Y2ggYSB0cmFuc2Zvcm1hdGlvbi4KKyAgLy8vCisgIC8vLyBUaGUgcm91Z2ggYWxnb3JpdGhtIHVzZWQgaXM6CisgIC8vLyAxKSBGaW5kIGJvdGggdGhlIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgdGhlIGV4dHJhY3RlZCByZWdpb24uCisgIC8vLyAyKSBQYXNzIHRoZSBpbnB1dHMgYXMgYXJndW1lbnRzLCByZW1hcHBpbmcgdGhlbSB3aXRoaW4gdGhlIGV4dHJhY3RlZAorICAvLy8gICAgZnVuY3Rpb24gdG8gYXJndW1lbnRzLgorICAvLy8gMykgQWRkIGFsbG9jYXMgZm9yIGFueSBzY2FsYXIgb3V0cHV0cywgYWRkaW5nIGFsbCBvZiB0aGUgb3V0cHV0cycgYWxsb2NhcworICAvLy8gICAgYXMgYXJndW1lbnRzLCBhbmQgaW5zZXJ0aW5nIHN0b3JlcyB0byB0aGUgYXJndW1lbnRzIGZvciBhbnkgc2NhbGFycy4KKyAgY2xhc3MgQ29kZUV4dHJhY3RvciB7CisgICAgdXNpbmcgVmFsdWVTZXQgPSBTZXRWZWN0b3I8VmFsdWUgKj47CisKKyAgICAvLyBWYXJpb3VzIGJpdHMgb2Ygc3RhdGUgY29tcHV0ZWQgb24gY29uc3RydWN0aW9uLgorICAgIERvbWluYXRvclRyZWUgKmNvbnN0IERUOworICAgIGNvbnN0IGJvb2wgQWdncmVnYXRlQXJnczsKKyAgICBCbG9ja0ZyZXF1ZW5jeUluZm8gKkJGSTsKKyAgICBCcmFuY2hQcm9iYWJpbGl0eUluZm8gKkJQSTsKKworICAgIC8vIElmIHRydWUsIHZhcmFyZ3MgZnVuY3Rpb25zIGNhbiBiZSBleHRyYWN0ZWQuCisgICAgYm9vbCBBbGxvd1ZhckFyZ3M7CisKKyAgICAvLyBCaXRzIG9mIGludGVybWVkaWF0ZSBzdGF0ZSBjb21wdXRlZCBhdCB2YXJpb3VzIHBoYXNlcyBvZiBleHRyYWN0aW9uLgorICAgIFNldFZlY3RvcjxCYXNpY0Jsb2NrICo+IEJsb2NrczsKKyAgICB1bnNpZ25lZCBOdW1FeGl0QmxvY2tzID0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpOworICAgIFR5cGUgKlJldFR5OworCisgIHB1YmxpYzoKKyAgICAvLy8gXGJyaWVmIENyZWF0ZSBhIGNvZGUgZXh0cmFjdG9yIGZvciBhIHNlcXVlbmNlIG9mIGJsb2Nrcy4KKyAgICAvLy8KKyAgICAvLy8gR2l2ZW4gYSBzZXF1ZW5jZSBvZiBiYXNpYyBibG9ja3Mgd2hlcmUgdGhlIGZpcnN0IGJsb2NrIGluIHRoZSBzZXF1ZW5jZQorICAgIC8vLyBkb21pbmF0ZXMgdGhlIHJlc3QsIHByZXBhcmUgYSBjb2RlIGV4dHJhY3RvciBvYmplY3QgZm9yIHB1bGxpbmcgdGhpcworICAgIC8vLyBzZXF1ZW5jZSBvdXQgaW50byBpdHMgbmV3IGZ1bmN0aW9uLiBXaGVuIGEgRG9taW5hdG9yVHJlZSBpcyBhbHNvIGdpdmVuLAorICAgIC8vLyBleHRyYSBjaGVja2luZyBhbmQgdHJhbnNmb3JtYXRpb25zIGFyZSBlbmFibGVkLiBJZiBBbGxvd1ZhckFyZ3MgaXMgdHJ1ZSwKKyAgICAvLy8gdmFyYXJnIGZ1bmN0aW9ucyBjYW4gYmUgZXh0cmFjdGVkLiBUaGlzIGlzIHNhZmUsIGlmIGFsbCB2YXJhcmcgaGFuZGxpbmcKKyAgICAvLy8gY29kZSBpcyBleHRyYWN0ZWQsIGluY2x1ZGluZyB2YXN0YXJ0LgorICAgIENvZGVFeHRyYWN0b3IoQXJyYXlSZWY8QmFzaWNCbG9jayAqPiBCQnMsIERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgIGJvb2wgQWdncmVnYXRlQXJncyA9IGZhbHNlLCBCbG9ja0ZyZXF1ZW5jeUluZm8gKkJGSSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICBCcmFuY2hQcm9iYWJpbGl0eUluZm8gKkJQSSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICBib29sIEFsbG93VmFyQXJncyA9IGZhbHNlKTsKKworICAgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgY29kZSBleHRyYWN0b3IgZm9yIGEgbG9vcCBib2R5LgorICAgIC8vLworICAgIC8vLyBCZWhhdmVzIGp1c3QgbGlrZSB0aGUgZ2VuZXJpYyBjb2RlIHNlcXVlbmNlIGNvbnN0cnVjdG9yLCBidXQgdXNlcyB0aGUKKyAgICAvLy8gYmxvY2sgc2VxdWVuY2Ugb2YgdGhlIGxvb3AuCisgICAgQ29kZUV4dHJhY3RvcihEb21pbmF0b3JUcmVlICZEVCwgTG9vcCAmTCwgYm9vbCBBZ2dyZWdhdGVBcmdzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICBCbG9ja0ZyZXF1ZW5jeUluZm8gKkJGSSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICBCcmFuY2hQcm9iYWJpbGl0eUluZm8gKkJQSSA9IG51bGxwdHIpOworCisgICAgLy8vIFxicmllZiBDaGVjayB0byBzZWUgaWYgYSBibG9jayBpcyB2YWxpZCBmb3IgZXh0cmFjdGlvbi4KKyAgICAvLy8KKyAgICAvLy8gQmxvY2tzIGNvbnRhaW5pbmcgRUhQYWRzLCBhbGxvY2FzIGFuZCBpbnZva2VzIGFyZSBub3QgdmFsaWQuIElmCisgICAgLy8vIEFsbG93VmFyQXJncyBpcyB0cnVlLCBibG9ja3Mgd2l0aCB2YXN0YXJ0IGNhbiBiZSBleHRyYWN0ZWQuIFRoaXMgaXMKKyAgICAvLy8gc2FmZSwgaWYgYWxsIHZhcmFyZyBoYW5kbGluZyBjb2RlIGlzIGV4dHJhY3RlZCwgaW5jbHVkaW5nIHZhc3RhcnQuCisgICAgc3RhdGljIGJvb2wgaXNCbG9ja1ZhbGlkRm9yRXh0cmFjdGlvbihjb25zdCBCYXNpY0Jsb2NrICZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dWYXJBcmdzKTsKKworICAgIC8vLyBcYnJpZWYgUGVyZm9ybSB0aGUgZXh0cmFjdGlvbiwgcmV0dXJuaW5nIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgLy8vCisgICAgLy8vIFJldHVybnMgemVybyB3aGVuIGNhbGxlZCBvbiBhIENvZGVFeHRyYWN0b3IgaW5zdGFuY2Ugd2hlcmUgaXNFbGlnaWJsZQorICAgIC8vLyByZXR1cm5zIGZhbHNlLgorICAgIEZ1bmN0aW9uICpleHRyYWN0Q29kZVJlZ2lvbigpOworCisgICAgLy8vIFxicmllZiBUZXN0IHdoZXRoZXIgdGhpcyBjb2RlIGV4dHJhY3RvciBpcyBlbGlnaWJsZS4KKyAgICAvLy8KKyAgICAvLy8gQmFzZWQgb24gdGhlIGJsb2NrcyB1c2VkIHdoZW4gY29uc3RydWN0aW5nIHRoZSBjb2RlIGV4dHJhY3RvciwKKyAgICAvLy8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgZWxpZ2libGUgZm9yIGV4dHJhY3Rpb24uCisgICAgYm9vbCBpc0VsaWdpYmxlKCkgY29uc3QgeyByZXR1cm4gIUJsb2Nrcy5lbXB0eSgpOyB9CisKKyAgICAvLy8gXGJyaWVmIENvbXB1dGUgdGhlIHNldCBvZiBpbnB1dCB2YWx1ZXMgYW5kIG91dHB1dCB2YWx1ZXMgZm9yIHRoZSBjb2RlLgorICAgIC8vLworICAgIC8vLyBUaGVzZSBjYW4gYmUgdXNlZCBlaXRoZXIgd2hlbiBwZXJmb3JtaW5nIHRoZSBleHRyYWN0aW9uIG9yIHRvIGV2YWx1YXRlCisgICAgLy8vIHRoZSBleHBlY3RlZCBzaXplIG9mIGEgY2FsbCB0byB0aGUgZXh0cmFjdGVkIGZ1bmN0aW9uLiBOb3RlIHRoYXQgdGhpcworICAgIC8vLyB3b3JrIGNhbm5vdCBiZSBjYWNoZWQgYmV0d2VlbiB0aGUgdHdvIGFzIG9uY2Ugd2UgZGVjaWRlIHRvIGV4dHJhY3QKKyAgICAvLy8gYSBjb2RlIHNlcXVlbmNlLCB0aGF0IHNlcXVlbmNlIGlzIG1vZGlmaWVkLCBpbmNsdWRpbmcgY2hhbmdpbmcgdGhlc2UKKyAgICAvLy8gc2V0cywgYmVmb3JlIGV4dHJhY3Rpb24gb2NjdXJzLiBUaGVzZSBtb2RpZmljYXRpb25zIHdvbid0IGhhdmUgYW55CisgICAgLy8vIHNpZ25pZmljYW50IGltcGFjdCBvbiB0aGUgY29zdCBob3dldmVyLgorICAgIHZvaWQgZmluZElucHV0c091dHB1dHMoVmFsdWVTZXQgJklucHV0cywgVmFsdWVTZXQgJk91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZVNldCAmQWxsb2NhcykgY29uc3Q7CisKKyAgICAvLy8gQ2hlY2sgaWYgbGlmZSB0aW1lIG1hcmtlciBub2RlcyBjYW4gYmUgaG9pc3RlZC9zdW5rIGludG8gdGhlIG91dGxpbmUKKyAgICAvLy8gcmVnaW9uLgorICAgIC8vLworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgaXQgaXMgc2FmZSB0byBkbyB0aGUgY29kZSBtb3Rpb24uCisgICAgYm9vbCBpc0xlZ2FsVG9TaHJpbmt3cmFwTGlmZXRpbWVNYXJrZXJzKEluc3RydWN0aW9uICpBbGxvY2FBZGRyKSBjb25zdDsKKworICAgIC8vLyBGaW5kIHRoZSBzZXQgb2YgYWxsb2NhcyB3aG9zZSBsaWZlIHJhbmdlcyBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGUKKyAgICAvLy8gb3V0bGluZWQgcmVnaW9uLgorICAgIC8vLworICAgIC8vLyBBbGxvY2FzIHdoaWNoIGhhdmUgbGlmZV90aW1lIG1hcmtlcnMgY29udGFpbmVkIGluIHRoZSBvdXRsaW5lZCByZWdpb24KKyAgICAvLy8gc2hvdWxkIGJlIHB1c2hlZCB0byB0aGUgb3V0bGluZWQgZnVuY3Rpb24uIFRoZSBhZGRyZXNzIGJpdGNhc3RzIHRoYXQKKyAgICAvLy8gYXJlIHVzZWQgYnkgdGhlIGxpZmV0aW1lIG1hcmtlcnMgYXJlIGFsc28gY2FuZGlkYXRlcyBmb3Igc2hyaW5rLQorICAgIC8vLyB3cmFwcGluZy4gVGhlIGluc3RydWN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgc3VuayBhcmUgY29sbGVjdGVkIGluCisgICAgLy8vICdBbGxvY2FzJy4KKyAgICB2b2lkIGZpbmRBbGxvY2FzKFZhbHVlU2V0ICZTaW5rQ2FuZHMsIFZhbHVlU2V0ICZIb2lzdENhbmRzLAorICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqJkV4aXRCbG9jaykgY29uc3Q7CisKKyAgICAvLy8gRmluZCBvciBjcmVhdGUgYSBibG9jayB3aXRoaW4gdGhlIG91dGxpbmUgcmVnaW9uIGZvciBwbGFjaW5nIGhvaXN0ZWQKKyAgICAvLy8gY29kZS4KKyAgICAvLy8KKyAgICAvLy8gQ29tbW9uRXhpdEJsb2NrIGlzIGJsb2NrIG91dHNpZGUgdGhlIG91dGxpbmUgcmVnaW9uLiBJdCBpcyB0aGUgY29tbW9uCisgICAgLy8vIHN1Y2Nlc3NvciBvZiBibG9ja3MgaW5zaWRlIHRoZSByZWdpb24uIElmIHRoZXJlIGV4aXN0cyBhIHNpbmdsZSBibG9jaworICAgIC8vLyBpbnNpZGUgdGhlIHJlZ2lvbiB0aGF0IGlzIHRoZSBwcmVkZWNlc3NvciBvZiBDb21tb25FeGl0QmxvY2ssIHRoYXQgYmxvY2sKKyAgICAvLy8gd2lsbCBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlIENvbW1vbkV4aXRCbG9jayB3aWxsIGJlIHNwbGl0IGFuZCB0aGUKKyAgICAvLy8gb3JpZ2luYWwgYmxvY2sgd2lsbCBiZSBhZGRlZCB0byB0aGUgb3V0bGluZSByZWdpb24uCisgICAgQmFzaWNCbG9jayAqZmluZE9yQ3JlYXRlQmxvY2tGb3JIb2lzdGluZyhCYXNpY0Jsb2NrICpDb21tb25FeGl0QmxvY2spOworCisgIHByaXZhdGU6CisgICAgdm9pZCBzZXZlclNwbGl0UEhJTm9kZXMoQmFzaWNCbG9jayAqJkhlYWRlcik7CisgICAgdm9pZCBzcGxpdFJldHVybkJsb2NrcygpOworCisgICAgRnVuY3Rpb24gKmNvbnN0cnVjdEZ1bmN0aW9uKGNvbnN0IFZhbHVlU2V0ICZpbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlU2V0ICZvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKm5ld1Jvb3ROb2RlLCBCYXNpY0Jsb2NrICpuZXdIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uICpvbGRGdW5jdGlvbiwgTW9kdWxlICpNKTsKKworICAgIHZvaWQgbW92ZUNvZGVUb0Z1bmN0aW9uKEZ1bmN0aW9uICpuZXdGdW5jdGlvbik7CisKKyAgICB2b2lkIGNhbGN1bGF0ZU5ld0NhbGxUZXJtaW5hdG9yV2VpZ2h0cygKKyAgICAgICAgQmFzaWNCbG9jayAqQ29kZVJlcGxhY2VyLAorICAgICAgICBEZW5zZU1hcDxCYXNpY0Jsb2NrICosIEJsb2NrRnJlcXVlbmN5PiAmRXhpdFdlaWdodHMsCisgICAgICAgIEJyYW5jaFByb2JhYmlsaXR5SW5mbyAqQlBJKTsKKworICAgIHZvaWQgZW1pdENhbGxBbmRTd2l0Y2hTdGF0ZW1lbnQoRnVuY3Rpb24gKm5ld0Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqbmV3SGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVTZXQgJmlucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlU2V0ICZvdXRwdXRzKTsKKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19DT0RFRVhUUkFDVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9DdG9yVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9DdG9yVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2U1NjRkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0N0b3JVdGlscy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vPT09LSBDdG9yVXRpbHMuaCAtIEhlbHBlcnMgZm9yIHdvcmtpbmcgd2l0aCBnbG9iYWxfY3RvcnMgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQgdG8gcHJvY2VzcyBsbHZtLmdsb2JhbF9jdG9ycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19DVE9SVVRJTFNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQ1RPUlVUSUxTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEdsb2JhbFZhcmlhYmxlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBNb2R1bGU7CisKKy8vLyBDYWxsICJTaG91bGRSZW1vdmUiIGZvciBldmVyeSBlbnRyeSBpbiBNJ3MgZ2xvYmFsX2N0b3IgbGlzdCBhbmQgcmVtb3ZlIHRoZQorLy8vIGVudHJpZXMgZm9yIHdoaWNoIGl0IHJldHVybnMgdHJ1ZS4gIFJldHVybiB0cnVlIGlmIGFueXRoaW5nIGNoYW5nZWQuCitib29sIG9wdGltaXplR2xvYmFsQ3RvcnNMaXN0KE1vZHVsZSAmTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25fcmVmPGJvb2woRnVuY3Rpb24gKik+IFNob3VsZFJlbW92ZSk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0VudHJ5RXhpdEluc3RydW1lbnRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0VudHJ5RXhpdEluc3RydW1lbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MGM1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvRW50cnlFeGl0SW5zdHJ1bWVudGVyLmgKQEAgLTAsMCArMSwzNiBAQAorLy89PT0tIEVudHJ5RXhpdEluc3RydW1lbnRlci5oIC0gRnVuY3Rpb24gRW50cnkvRXhpdCBJbnN0cnVtZW50YXRpb24gLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBFbnRyeUV4aXRJbnN0cnVtZW50ZXIgcGFzcyAtIEluc3RydW1lbnQgZnVuY3Rpb24gZW50cnkvZXhpdCB3aXRoIGNhbGxzIHRvCisvLyBtY291bnQoKSwgQF9fY3lnX3Byb2ZpbGVfZnVuY197ZW50ZXIsZXhpdH0gYW5kIHRoZSBsaWtlLiBUaGVyZSBhcmUgdHdvCisvLyB2YXJpYW50cywgaW50ZW5kZWQgdG8gcnVuIHByZS0gYW5kIHBvc3QtaW5saW5pbmcsIHJlc3BlY3RpdmVseS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19FTlRSWUVYSVRJTlNUUlVNRU5URVJfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfRU5UUllFWElUSU5TVFJVTUVOVEVSX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKKworc3RydWN0IEVudHJ5RXhpdEluc3RydW1lbnRlclBhc3MKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPEVudHJ5RXhpdEluc3RydW1lbnRlclBhc3M+IHsKKyAgRW50cnlFeGl0SW5zdHJ1bWVudGVyUGFzcyhib29sIFBvc3RJbmxpbmluZykgOiBQb3N0SW5saW5pbmcoUG9zdElubGluaW5nKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKKworICBib29sIFBvc3RJbmxpbmluZzsKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19FTlRSWUVYSVRJTlNUUlVNRU5URVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0VzY2FwZUVudW1lcmF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Fc2NhcGVFbnVtZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI1NmRmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Fc2NhcGVFbnVtZXJhdG9yLmgKQEAgLTAsMCArMSw0OSBAQAorLy89PT0tLSBFc2NhcGVFbnVtZXJhdG9yLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZWZpbmVzIGEgaGVscGVyIGNsYXNzIHRoYXQgZW51bWVyYXRlcyBhbGwgcG9zc2libGUgZXhpdHMgZnJvbSBhIGZ1bmN0aW9uLAorLy8gaW5jbHVkaW5nIGV4Y2VwdGlvbiBoYW5kbGluZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19FU0NBUEVFTlVNRVJBVE9SX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0VTQ0FQRUVOVU1FUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSVJCdWlsZGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEVzY2FwZUVudW1lcmF0b3IgLSBUaGlzIGlzIGEgbGl0dGxlIGFsZ29yaXRobSB0byBmaW5kIGFsbCBlc2NhcGUgcG9pbnRzCisvLy8gZnJvbSBhIGZ1bmN0aW9uIHNvIHRoYXQgImZpbmFsbHkiLXN0eWxlIGNvZGUgY2FuIGJlIGluc2VydGVkLiBJbiBhZGRpdGlvbgorLy8vIHRvIGZpbmRpbmcgdGhlIGV4aXN0aW5nIHJldHVybiBhbmQgdW53aW5kIGluc3RydWN0aW9ucywgaXQgYWxzbyAoaWYKKy8vLyBuZWNlc3NhcnkpIHRyYW5zZm9ybXMgYW55IGNhbGwgaW5zdHJ1Y3Rpb25zIGludG8gaW52b2tlcyBhbmQgc2VuZHMgdGhlbSB0bworLy8vIGEgbGFuZGluZyBwYWQuCitjbGFzcyBFc2NhcGVFbnVtZXJhdG9yIHsKKyAgRnVuY3Rpb24gJkY7CisgIGNvbnN0IGNoYXIgKkNsZWFudXBCQk5hbWU7CisKKyAgRnVuY3Rpb246Oml0ZXJhdG9yIFN0YXRlQkIsIFN0YXRlRTsKKyAgSVJCdWlsZGVyPD4gQnVpbGRlcjsKKyAgYm9vbCBEb25lOworICBib29sIEhhbmRsZUV4Y2VwdGlvbnM7CisKK3B1YmxpYzoKKyAgRXNjYXBlRW51bWVyYXRvcihGdW5jdGlvbiAmRiwgY29uc3QgY2hhciAqTiA9ICJjbGVhbnVwIiwKKyAgICAgICAgICAgICAgICAgICBib29sIEhhbmRsZUV4Y2VwdGlvbnMgPSB0cnVlKQorICAgICAgOiBGKEYpLCBDbGVhbnVwQkJOYW1lKE4pLCBTdGF0ZUJCKEYuYmVnaW4oKSksIFN0YXRlRShGLmVuZCgpKSwKKyAgICAgICAgQnVpbGRlcihGLmdldENvbnRleHQoKSksIERvbmUoZmFsc2UpLAorICAgICAgICBIYW5kbGVFeGNlcHRpb25zKEhhbmRsZUV4Y2VwdGlvbnMpIHt9CisKKyAgSVJCdWlsZGVyPD4gKk5leHQoKTsKK307CisKK30KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19FU0NBUEVFTlVNRVJBVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9FdmFsdWF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9FdmFsdWF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTk4N2I5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0V2YWx1YXRvci5oCkBAIC0wLDAgKzEsMTIwIEBACisvLz09PS0gRXZhbHVhdG9yLmggLSBMTFZNIElSIGV2YWx1YXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEZ1bmN0aW9uIGV2YWx1YXRvciBmb3IgTExWTSBJUi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19FVkFMVUFUT1JfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfRVZBTFVBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFyaWFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBEYXRhTGF5b3V0OworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbzsKKworLy8vIFRoaXMgY2xhc3MgZXZhbHVhdGVzIExMVk0gSVIsIHByb2R1Y2luZyB0aGUgQ29uc3RhbnQgcmVwcmVzZW50aW5nIGVhY2ggU1NBCisvLy8gaW5zdHJ1Y3Rpb24uICBDaGFuZ2VzIHRvIGdsb2JhbCB2YXJpYWJsZXMgYXJlIHN0b3JlZCBpbiBhIG1hcHBpbmcgdGhhdCBjYW4KKy8vLyBiZSBpdGVyYXRlZCBvdmVyIGFmdGVyIHRoZSBldmFsdWF0aW9uIGlzIGNvbXBsZXRlLiAgT25jZSBhbiBldmFsdWF0aW9uIGNhbGwKKy8vLyBmYWlscywgdGhlIGV2YWx1YXRpb24gb2JqZWN0IHNob3VsZCBub3QgYmUgcmV1c2VkLgorY2xhc3MgRXZhbHVhdG9yIHsKK3B1YmxpYzoKKyAgRXZhbHVhdG9yKGNvbnN0IERhdGFMYXlvdXQgJkRMLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKQorICAgICAgOiBETChETCksIFRMSShUTEkpIHsKKyAgICBWYWx1ZVN0YWNrLmVtcGxhY2VfYmFjaygpOworICB9CisKKyAgfkV2YWx1YXRvcigpIHsKKyAgICBmb3IgKGF1dG8gJlRtcCA6IEFsbG9jYVRtcHMpCisgICAgICAvLyBJZiB0aGVyZSBhcmUgc3RpbGwgdXNlcnMgb2YgdGhlIGFsbG9jYSwgdGhlIHByb2dyYW0gaXMgZG9pbmcgc29tZXRoaW5nCisgICAgICAvLyBzaWxseSwgZS5nLiBzdG9yaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBhbGxvY2Egc29tZXdoZXJlIGFuZCB1c2luZyBpdAorICAgICAgLy8gbGF0ZXIuICBTaW5jZSB0aGlzIGlzIHVuZGVmaW5lZCwgd2UnbGwganVzdCBtYWtlIGl0IGJlIG51bGwuCisgICAgICBpZiAoIVRtcC0+dXNlX2VtcHR5KCkpCisgICAgICAgIFRtcC0+cmVwbGFjZUFsbFVzZXNXaXRoKENvbnN0YW50OjpnZXROdWxsVmFsdWUoVG1wLT5nZXRUeXBlKCkpKTsKKyAgfQorCisgIC8vLyBFdmFsdWF0ZSBhIGNhbGwgdG8gZnVuY3Rpb24gRiwgcmV0dXJuaW5nIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgd2UKKyAgLy8vIGNhbid0IGV2YWx1YXRlIGl0LiAgQWN0dWFsQXJncyBjb250YWlucyB0aGUgZm9ybWFsIGFyZ3VtZW50cyBmb3IgdGhlCisgIC8vLyBmdW5jdGlvbi4KKyAgYm9vbCBFdmFsdWF0ZUZ1bmN0aW9uKEZ1bmN0aW9uICpGLCBDb25zdGFudCAqJlJldFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxDb25zdGFudCo+ICZBY3R1YWxBcmdzKTsKKworICAvLy8gRXZhbHVhdGUgYWxsIGluc3RydWN0aW9ucyBpbiBibG9jayBCQiwgcmV0dXJuaW5nIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UKKyAgLy8vIGlmIHdlIGNhbid0IGV2YWx1YXRlIGl0LiAgTmV3QkIgcmV0dXJucyB0aGUgbmV4dCBCQiB0aGF0IGNvbnRyb2wgZmxvd3MKKyAgLy8vIGludG8sIG9yIG51bGwgdXBvbiByZXR1cm4uCisgIGJvb2wgRXZhbHVhdGVCbG9jayhCYXNpY0Jsb2NrOjppdGVyYXRvciBDdXJJbnN0LCBCYXNpY0Jsb2NrIComTmV4dEJCKTsKKworICBDb25zdGFudCAqZ2V0VmFsKFZhbHVlICpWKSB7CisgICAgaWYgKENvbnN0YW50ICpDViA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkgcmV0dXJuIENWOworICAgIENvbnN0YW50ICpSID0gVmFsdWVTdGFjay5iYWNrKCkubG9va3VwKFYpOworICAgIGFzc2VydChSICYmICJSZWZlcmVuY2UgdG8gYW4gdW5jb21wdXRlZCB2YWx1ZSEiKTsKKyAgICByZXR1cm4gUjsKKyAgfQorCisgIHZvaWQgc2V0VmFsKFZhbHVlICpWLCBDb25zdGFudCAqQykgeworICAgIFZhbHVlU3RhY2suYmFjaygpW1ZdID0gQzsKKyAgfQorCisgIGNvbnN0IERlbnNlTWFwPENvbnN0YW50KiwgQ29uc3RhbnQqPiAmZ2V0TXV0YXRlZE1lbW9yeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTXV0YXRlZE1lbW9yeTsKKyAgfQorCisgIGNvbnN0IFNtYWxsUHRyU2V0SW1wbDxHbG9iYWxWYXJpYWJsZSo+ICZnZXRJbnZhcmlhbnRzKCkgY29uc3QgeworICAgIHJldHVybiBJbnZhcmlhbnRzOworICB9CisKK3ByaXZhdGU6CisgIENvbnN0YW50ICpDb21wdXRlTG9hZFJlc3VsdChDb25zdGFudCAqUCk7CisKKyAgLy8vIEFzIHdlIGNvbXB1dGUgU1NBIHJlZ2lzdGVyIHZhbHVlcywgd2Ugc3RvcmUgdGhlaXIgY29udGVudHMgaGVyZS4gVGhlIGJhY2sKKyAgLy8vIG9mIHRoZSBkZXF1ZSBjb250YWlucyB0aGUgY3VycmVudCBmdW5jdGlvbiBhbmQgdGhlIHN0YWNrIGNvbnRhaW5zIHRoZQorICAvLy8gdmFsdWVzIGluIHRoZSBjYWxsaW5nIGZyYW1lcy4KKyAgc3RkOjpkZXF1ZTxEZW5zZU1hcDxWYWx1ZSosIENvbnN0YW50Kj4+IFZhbHVlU3RhY2s7CisKKyAgLy8vIFRoaXMgaXMgdXNlZCB0byBkZXRlY3QgcmVjdXJzaW9uLiAgSW4gcGF0aG9sb2dpY2FsIHNpdHVhdGlvbnMgd2UgY291bGQgaGl0CisgIC8vLyBleHBvbmVudGlhbCBiZWhhdmlvciwgYnV0IGF0IGxlYXN0IHRoZXJlIGlzIG5vdGhpbmcgdW5ib3VuZGVkLgorICBTbWFsbFZlY3RvcjxGdW5jdGlvbiosIDQ+IENhbGxTdGFjazsKKworICAvLy8gRm9yIGVhY2ggc3RvcmUgd2UgZXhlY3V0ZSwgd2UgdXBkYXRlIHRoaXMgbWFwLiAgTG9hZHMgY2hlY2sgdGhpcyB0byBnZXQKKyAgLy8vIHRoZSBtb3N0IHVwLXRvLWRhdGUgdmFsdWUuICBJZiBldmFsdWF0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoaXMgc3RhdGUgaXMKKyAgLy8vIGNvbW1pdHRlZCB0byB0aGUgcHJvY2Vzcy4KKyAgRGVuc2VNYXA8Q29uc3RhbnQqLCBDb25zdGFudCo+IE11dGF0ZWRNZW1vcnk7CisKKyAgLy8vIFRvICdleGVjdXRlJyBhbiBhbGxvY2EsIHdlIGNyZWF0ZSBhIHRlbXBvcmFyeSBnbG9iYWwgdmFyaWFibGUgdG8gcmVwcmVzZW50CisgIC8vLyBpdHMgYm9keS4gIFRoaXMgdmVjdG9yIGlzIG5lZWRlZCBzbyB3ZSBjYW4gZGVsZXRlIHRoZSB0ZW1wb3JhcnkgZ2xvYmFscworICAvLy8gd2hlbiB3ZSBhcmUgZG9uZS4KKyAgU21hbGxWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEdsb2JhbFZhcmlhYmxlPiwgMzI+IEFsbG9jYVRtcHM7CisKKyAgLy8vIFRoZXNlIGdsb2JhbCB2YXJpYWJsZXMgaGF2ZSBiZWVuIG1hcmtlZCBpbnZhcmlhbnQgYnkgdGhlIHN0YXRpYworICAvLy8gY29uc3RydWN0b3IuCisgIFNtYWxsUHRyU2V0PEdsb2JhbFZhcmlhYmxlKiwgOD4gSW52YXJpYW50czsKKworICAvLy8gVGhlc2UgYXJlIGNvbnN0YW50cyB3ZSBoYXZlIGNoZWNrZWQgYW5kIGtub3cgdG8gYmUgc2ltcGxlIGVub3VnaCB0byBsaXZlCisgIC8vLyBpbiBhIHN0YXRpYyBpbml0aWFsaXplciBvZiBhIGdsb2JhbC4KKyAgU21hbGxQdHJTZXQ8Q29uc3RhbnQqLCA4PiBTaW1wbGVDb25zdGFudHM7CisKKyAgY29uc3QgRGF0YUxheW91dCAmREw7CisgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0VWQUxVQVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvRnVuY3Rpb25Db21wYXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvRnVuY3Rpb25Db21wYXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5OGEwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9GdW5jdGlvbkNvbXBhcmF0b3IuaApAQCAtMCwwICsxLDM5MyBAQAorLy89PT0tIEZ1bmN0aW9uQ29tcGFyYXRvci5oIC0gRnVuY3Rpb24gQ29tcGFyYXRvciAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRnVuY3Rpb25Db21wYXJhdG9yIGFuZCBHbG9iYWxOdW1iZXJTdGF0ZSBjbGFzc2VzIHdoaWNoCisvLyBhcmUgdXNlZCBieSB0aGUgTWVyZ2VGdW5jdGlvbnMgcGFzcyBmb3IgY29tcGFyaW5nIGZ1bmN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19GVU5DVElPTkNPTVBBUkFUT1JfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfRlVOQ1RJT05DT01QQVJBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIgCisjaW5jbHVkZSAibGx2bS9JUi9PcGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVNYXAuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQXRvbWljT3JkZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dHVwbGU+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQVBGbG9hdDsKK2NsYXNzIEFQSW50OworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIENvbnN0YW50OworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIElubGluZUFzbTsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTUROb2RlOworY2xhc3MgVHlwZTsKK2NsYXNzIFZhbHVlOworCisvLy8gR2xvYmFsTnVtYmVyU3RhdGUgYXNzaWducyBhbiBpbnRlZ2VyIHRvIGVhY2ggZ2xvYmFsIHZhbHVlIGluIHRoZSBwcm9ncmFtLAorLy8vIHdoaWNoIGlzIHVzZWQgYnkgdGhlIGNvbXBhcmlzb24gcm91dGluZSB0byBvcmRlciByZWZlcmVuY2VzIHRvIGdsb2JhbHMuIFRoaXMKKy8vLyBzdGF0ZSBtdXN0IGJlIHByZXNlcnZlZCB0aHJvdWdob3V0IHRoZSBwYXNzLCBiZWNhdXNlIEZ1bmN0aW9ucyBhbmQgb3RoZXIKKy8vLyBnbG9iYWxzIG5lZWQgdG8gbWFpbnRhaW4gdGhlaXIgcmVsYXRpdmUgb3JkZXIuIEdsb2JhbHMgYXJlIGFzc2lnbmVkIGEgbnVtYmVyCisvLy8gd2hlbiB0aGV5IGFyZSBmaXJzdCB2aXNpdGVkLiBUaGlzIG9yZGVyIGlzIGRldGVybWluaXN0aWMsIGFuZCBzbyB0aGUKKy8vLyBhc3NpZ25lZCBudW1iZXJzIGFyZSBhcyB3ZWxsLiBXaGVuIHR3byBmdW5jdGlvbnMgYXJlIG1lcmdlZCwgbmVpdGhlciBudW1iZXIKKy8vLyBpcyB1cGRhdGVkLiBJZiB0aGUgc3ltYm9scyBhcmUgd2VhaywgdGhpcyB3b3VsZCBiZSBpbmNvcnJlY3QuIElmIHRoZXkgYXJlCisvLy8gc3Ryb25nLCB0aGVuIG9uZSB3aWxsIGJlIHJlcGxhY2VkIGF0IGFsbCByZWZlcmVuY2VzIHRvIHRoZSBvdGhlciwgYW5kIHNvCisvLy8gZGlyZWN0IGNhbGxzaXRlcyB3aWxsIG5vdyBzZWUgb25lIG9yIHRoZSBvdGhlciBzeW1ib2wsIGFuZCBubyB1cGRhdGUgaXMKKy8vLyBuZWNlc3NhcnkuIE5vdGUgdGhhdCBpZiB3ZSB3ZXJlIGd1YXJhbnRlZWQgdW5pcXVlIG5hbWVzLCB3ZSBjb3VsZCBqdXN0CisvLy8gY29tcGFyZSB0aG9zZSwgYnV0IHRoaXMgd291bGQgbm90IHdvcmsgZm9yIHN0cmlwcGVkIGJpdGNvZGVzIG9yIGZvciB0aG9zZQorLy8vIGZldyBzeW1ib2xzIHdpdGhvdXQgYSBuYW1lLgorY2xhc3MgR2xvYmFsTnVtYmVyU3RhdGUgeworICBzdHJ1Y3QgQ29uZmlnIDogVmFsdWVNYXBDb25maWc8R2xvYmFsVmFsdWUgKj4geworICAgIGVudW0geyBGb2xsb3dSQVVXID0gZmFsc2UgfTsKKyAgfTsKKworICAvLyBFYWNoIEdsb2JhbFZhbHVlIGlzIG1hcHBlZCB0byBhbiBpZGVudGlmaWVyLiBUaGUgQ29uZmlnIGVuc3VyZXMgd2hlbiBSQVVXCisgIC8vIG9jY3VycywgdGhlIG1hcHBpbmcgZG9lcyBub3QgY2hhbmdlLiBUcmFja2luZyBjaGFuZ2VzIGlzIHVubmVjZXNzYXJ5LCBhbmQKKyAgLy8gYWxzbyBwcm9ibGVtYXRpYyBmb3Igd2VhayBzeW1ib2xzICh3aGljaCBtYXkgYmUgb3ZlcndyaXR0ZW4pLgorICB1c2luZyBWYWx1ZU51bWJlck1hcCA9IFZhbHVlTWFwPEdsb2JhbFZhbHVlICosIHVpbnQ2NF90LCBDb25maWc+OworICBWYWx1ZU51bWJlck1hcCBHbG9iYWxOdW1iZXJzOworCisgIC8vIFRoZSBuZXh0IHVudXNlZCBzZXJpYWwgbnVtYmVyIHRvIGFzc2lnbiB0byBhIGdsb2JhbC4KKyAgdWludDY0X3QgTmV4dE51bWJlciA9IDA7CisKK3B1YmxpYzoKKyAgR2xvYmFsTnVtYmVyU3RhdGUoKSA9IGRlZmF1bHQ7CisKKyAgdWludDY0X3QgZ2V0TnVtYmVyKEdsb2JhbFZhbHVlKiBHbG9iYWwpIHsKKyAgICBWYWx1ZU51bWJlck1hcDo6aXRlcmF0b3IgTWFwSXRlcjsKKyAgICBib29sIEluc2VydGVkOworICAgIHN0ZDo6dGllKE1hcEl0ZXIsIEluc2VydGVkKSA9IEdsb2JhbE51bWJlcnMuaW5zZXJ0KHtHbG9iYWwsIE5leHROdW1iZXJ9KTsKKyAgICBpZiAoSW5zZXJ0ZWQpCisgICAgICBOZXh0TnVtYmVyKys7CisgICAgcmV0dXJuIE1hcEl0ZXItPnNlY29uZDsKKyAgfQorCisgIHZvaWQgZXJhc2UoR2xvYmFsVmFsdWUgKkdsb2JhbCkgeworICAgIEdsb2JhbE51bWJlcnMuZXJhc2UoR2xvYmFsKTsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgR2xvYmFsTnVtYmVycy5jbGVhcigpOworICB9Cit9OworCisvLy8gRnVuY3Rpb25Db21wYXJhdG9yIC0gQ29tcGFyZXMgdHdvIGZ1bmN0aW9ucyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QKKy8vLyB0aGV5IHdpbGwgZ2VuZXJhdGUgbWFjaGluZSBjb2RlIHdpdGggdGhlIHNhbWUgYmVoYXZpb3VyLiBEYXRhTGF5b3V0IGlzCisvLy8gdXNlZCBpZiBhdmFpbGFibGUuIFRoZSBjb21wYXJhdG9yIGFsd2F5cyBmYWlscyBjb25zZXJ2YXRpdmVseSAoZXJyaW5nIG9uIHRoZQorLy8vIHNpZGUgb2YgY2xhaW1pbmcgdGhhdCB0d28gZnVuY3Rpb25zIGFyZSBkaWZmZXJlbnQpLgorY2xhc3MgRnVuY3Rpb25Db21wYXJhdG9yIHsKK3B1YmxpYzoKKyAgRnVuY3Rpb25Db21wYXJhdG9yKGNvbnN0IEZ1bmN0aW9uICpGMSwgY29uc3QgRnVuY3Rpb24gKkYyLAorICAgICAgICAgICAgICAgICAgICAgR2xvYmFsTnVtYmVyU3RhdGUqIEdOKQorICAgICAgOiBGbkwoRjEpLCBGblIoRjIpLCBHbG9iYWxOdW1iZXJzKEdOKSB7fQorCisgIC8vLyBUZXN0IHdoZXRoZXIgdGhlIHR3byBmdW5jdGlvbnMgaGF2ZSBlcXVpdmFsZW50IGJlaGF2aW91ci4KKyAgaW50IGNvbXBhcmUoKTsKKworICAvLy8gSGFzaCBhIGZ1bmN0aW9uLiBFcXVpdmFsZW50IGZ1bmN0aW9ucyB3aWxsIGhhdmUgdGhlIHNhbWUgaGFzaCwgYW5kIHVuZXF1YWwKKyAgLy8vIGZ1bmN0aW9ucyB3aWxsIGhhdmUgZGlmZmVyZW50IGhhc2hlcyB3aXRoIGhpZ2ggcHJvYmFiaWxpdHkuCisgIHVzaW5nIEZ1bmN0aW9uSGFzaCA9IHVpbnQ2NF90OworICBzdGF0aWMgRnVuY3Rpb25IYXNoIGZ1bmN0aW9uSGFzaChGdW5jdGlvbiAmKTsKKworcHJvdGVjdGVkOgorICAvLy8gU3RhcnQgdGhlIGNvbXBhcmlzb24uCisgIHZvaWQgYmVnaW5Db21wYXJlKCkgeworICAgIHNuX21hcEwuY2xlYXIoKTsKKyAgICBzbl9tYXBSLmNsZWFyKCk7CisgIH0KKworICAvLy8gQ29tcGFyZXMgdGhlIHNpZ25hdHVyZSBhbmQgb3RoZXIgZ2VuZXJhbCBhdHRyaWJ1dGVzIG9mIHRoZSB0d28gZnVuY3Rpb25zLgorICBpbnQgY29tcGFyZVNpZ25hdHVyZSgpIGNvbnN0OworCisgIC8vLyBUZXN0IHdoZXRoZXIgdHdvIGJhc2ljIGJsb2NrcyBoYXZlIGVxdWl2YWxlbnQgYmVoYXZpb3VyLgorICBpbnQgY21wQmFzaWNCbG9ja3MoY29uc3QgQmFzaWNCbG9jayAqQkJMLCBjb25zdCBCYXNpY0Jsb2NrICpCQlIpIGNvbnN0OworCisgIC8vLyBDb25zdGFudHMgY29tcGFyaXNvbi4KKyAgLy8vIEl0cyBhbmFsb2cgdG8gbGV4aWNvZ3JhcGhpY2FsIGNvbXBhcmlzb24gYmV0d2VlbiBoeXBvdGhldGljYWwgbnVtYmVycworICAvLy8gb2YgbmV4dCBmb3JtYXQ6CisgIC8vLyA8Yml0Y2FzdGFiaWxpdHktdHJhaXQ+PHJhdy1iaXQtY29udGVudHM+CisgIC8vLworICAvLy8gMS4gQml0Y2FzdGFiaWxpdHkuCisgIC8vLyBDaGVjayB3aGV0aGVyIEwncyB0eXBlIGNvdWxkIGJlIGxvc3NsZXNzbHkgYml0Y2FzdGVkIHRvIFIncyB0eXBlLgorICAvLy8gT24gdGhpcyBzdGFnZSBtZXRob2QsIGluIGNhc2Ugd2hlbiBsb3NzbGVzcyBiaXRjYXN0IGlzIG5vdCBwb3NzaWJsZQorICAvLy8gbWV0aG9kIHJldHVybnMgLTEgb3IgMSwgdGh1cyBhbHNvIGRlZmluaW5nIHdoaWNoIHR5cGUgaXMgZ3JlYXRlciBpbgorICAvLy8gY29udGV4dCBvZiBiaXRjYXN0YWJpbGl0eS4KKyAgLy8vIFN0YWdlIDA6IElmIHR5cGVzIGFyZSBlcXVhbCBpbiB0ZXJtcyBvZiBjbXBUeXBlcywgdGhlbiB3ZSBjYW4gZ28gc3RyYWlnaHQKKyAgLy8vICAgICAgICAgIHRvIHRoZSBjb250ZW50cyBjb21wYXJpc29uLgorICAvLy8gICAgICAgICAgSWYgdHlwZXMgZGlmZmVyLCByZW1lbWJlciB0eXBlcyBjb21wYXJpc29uIHJlc3VsdCBhbmQgY2hlY2sKKyAgLy8vICAgICAgICAgIHdoZXRoZXIgd2Ugc3RpbGwgY2FuIGJpdGNhc3QgdHlwZXMuCisgIC8vLyBTdGFnZSAxOiBUeXBlcyB0aGF0IHNhdGlzZmllcyBpc0ZpcnN0Q2xhc3NUeXBlIGNvbmRpdGlvbnMgYXJlIGFsd2F5cworICAvLy8gICAgICAgICAgZ3JlYXRlciB0aGVuIG90aGVycy4KKyAgLy8vIFN0YWdlIDI6IFZlY3RvciBpcyBncmVhdGVyIHRoZW4gbm9uLXZlY3Rvci4KKyAgLy8vICAgICAgICAgIElmIGJvdGggdHlwZXMgYXJlIHZlY3RvcnMsIHRoZW4gdmVjdG9yIHdpdGggZ3JlYXRlciBiaXR3aWR0aCBpcworICAvLy8gICAgICAgICAgZ3JlYXRlci4KKyAgLy8vICAgICAgICAgIElmIGJvdGggdHlwZXMgYXJlIHZlY3RvcnMgd2l0aCB0aGUgc2FtZSBiaXR3aWR0aCwgdGhlbiB0eXBlcworICAvLy8gICAgICAgICAgYXJlIGJpdGNhc3RhYmxlLCBhbmQgd2UgY2FuIHNraXAgb3RoZXIgc3RhZ2VzLCBhbmQgZ28gdG8gY29udGVudHMKKyAgLy8vICAgICAgICAgIGNvbXBhcmlzb24uCisgIC8vLyBTdGFnZSAzOiBQb2ludGVyIHR5cGVzIGFyZSBncmVhdGVyIHRoYW4gbm9uLXBvaW50ZXJzLiBJZiBib3RoIHR5cGVzIGFyZQorICAvLy8gICAgICAgICAgcG9pbnRlcnMgb2YgdGhlIHNhbWUgYWRkcmVzcyBzcGFjZSAtIGdvIHRvIGNvbnRlbnRzIGNvbXBhcmlzb24uCisgIC8vLyAgICAgICAgICBEaWZmZXJlbnQgYWRkcmVzcyBzcGFjZXM6IHBvaW50ZXIgd2l0aCBncmVhdGVyIGFkZHJlc3Mgc3BhY2UgaXMKKyAgLy8vICAgICAgICAgIGdyZWF0ZXIuCisgIC8vLyBTdGFnZSA0OiBUeXBlcyBhcmUgbmVpdGhlciB2ZWN0b3JzLCBub3IgcG9pbnRlcnMuIEFuZCB0aGV5IGRpZmZlci4KKyAgLy8vICAgICAgICAgIFdlIGRvbid0IGtub3cgaG93IHRvIGJpdGNhc3QgdGhlbS4gU28sIHdlIGJldHRlciBkb24ndCBkbyBpdCwKKyAgLy8vICAgICAgICAgIGFuZCByZXR1cm4gdHlwZXMgY29tcGFyaXNvbiByZXN1bHQgKHNvIGl0IGRldGVybWluZXMgdGhlCisgIC8vLyAgICAgICAgICByZWxhdGlvbnNoaXAgYW1vbmcgY29uc3RhbnRzIHdlIGRvbid0IGtub3cgaG93IHRvIGJpdGNhc3QpLgorICAvLy8KKyAgLy8vIEp1c3QgZm9yIGNsZWFyYW5jZSwgbGV0J3Mgc2VlIGhvdyB0aGUgc2V0IG9mIGNvbnN0YW50cyBjb3VsZCBsb29rCisgIC8vLyBvbiBzaW5nbGUgZGltZW5zaW9uIGF4aXM6CisgIC8vLworICAvLy8gW05GQ1RdLCBbRkNULCAib3RoZXJzIl0sIFtGQ1QsIHBvaW50ZXJzXSwgW0ZDVCwgdmVjdG9yc10KKyAgLy8vIFdoZXJlOiBORkNUIC0gTm90IGEgRmlyc3RDbGFzc1R5cGUKKyAgLy8vICAgICAgICBGQ1QgLSBGaXJzdENsYXNzVHlwOgorICAvLy8KKyAgLy8vIDIuIENvbXBhcmUgcmF3IGNvbnRlbnRzLgorICAvLy8gSXQgaWdub3JlcyB0eXBlcyBvbiB0aGlzIHN0YWdlIGFuZCBvbmx5IGNvbXBhcmVzIGJpdHMgZnJvbSBMIGFuZCBSLgorICAvLy8gUmV0dXJucyAwLCBpZiBMIGFuZCBSIGhhcyBlcXVpdmFsZW50IGNvbnRlbnRzLgorICAvLy8gLTEgb3IgMSBpZiB2YWx1ZXMgYXJlIGRpZmZlcmVudC4KKyAgLy8vIFByZXR0eSB0cml2aWFsOgorICAvLy8gMi4xLiBJZiBjb250ZW50cyBhcmUgbnVtYmVycywgY29tcGFyZSBudW1iZXJzLgorICAvLy8gICAgSW50cyB3aXRoIGdyZWF0ZXIgYml0d2lkdGggYXJlIGdyZWF0ZXIuIEludHMgd2l0aCBzYW1lIGJpdHdpZHRocworICAvLy8gICAgY29tcGFyZWQgYnkgdGhlaXIgY29udGVudHMuCisgIC8vLyAyLjIuICJBbmQgc28gb24iLiBKdXN0IHRvIGF2b2lkIGRpc2NyZXBhbmNpZXMgd2l0aCBjb21tZW50cworICAvLy8gcGVyaGFwcyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gcmVhZCB0aGUgaW1wbGVtZW50YXRpb24gaXRzZWxmLgorICAvLy8gMy4gQW5kIGFnYWluIGFib3V0IG92ZXJhbGwgcGljdHVyZS4gTGV0J3MgbG9vayBiYWNrIGF0IGhvdyB0aGUgb3JkZXJlZCBzZXQKKyAgLy8vIG9mIGNvbnN0YW50cyB3aWxsIGxvb2sgbGlrZToKKyAgLy8vIFtORkNUXSwgW0ZDVCwgIm90aGVycyJdLCBbRkNULCBwb2ludGVyc10sIFtGQ1QsIHZlY3RvcnNdCisgIC8vLworICAvLy8gTm93IGxvb2ssIHdoYXQgY291bGQgYmUgaW5zaWRlIFtGQ1QsICJvdGhlcnMiXSwgZm9yIGV4YW1wbGU6CisgIC8vLyBbRkNULCAib3RoZXJzIl0gPQorICAvLy8gWworICAvLy8gICBbZG91YmxlIDAuMV0sIFtkb3VibGUgMS4yM10sCisgIC8vLyAgIFtpMzIgMV0sIFtpMzIgMl0sCisgIC8vLyAgIHsgZG91YmxlIDEuMCB9LCAgICAgICA7IFN0cnVjdFR5SUQsIE51bUVsZW1lbnRzID0gMQorICAvLy8gICB7IGkzMiAxIH0sICAgICAgICAgICAgOyBTdHJ1Y3RUeUlELCBOdW1FbGVtZW50cyA9IDEKKyAgLy8vICAgeyBkb3VibGUgMSwgaTMyIDEgfSwgIDsgU3RydWN0VHlJRCwgTnVtRWxlbWVudHMgPSAyCisgIC8vLyAgIHsgaTMyIDEsIGRvdWJsZSAxIH0gICA7IFN0cnVjdFR5SUQsIE51bUVsZW1lbnRzID0gMgorICAvLy8gXQorICAvLy8KKyAgLy8vIExldCdzIGV4cGxhaW4gdGhlIG9yZGVyLiBGbG9hdCBudW1iZXJzIHdpbGwgYmUgbGVzcyB0aGFuIGludGVnZXJzLCBqdXN0CisgIC8vLyBiZWNhdXNlIG9mIGNtcFR5cGUgdGVybXM6IEZsb2F0VHlJRCA8IEludGVnZXJUeUlELgorICAvLy8gRmxvYXRzICh3aXRoIHNhbWUgZmx0U2VtYW50aWNzKSBhcmUgc29ydGVkIGFjY29yZGluZyB0byB0aGVpciB2YWx1ZS4KKyAgLy8vIFRoZW4geW91IGNhbiBzZWUgaW50ZWdlcnMsIGFuZCB0aGV5IGFyZSwgbGlrZSBhIGZsb2F0cywKKyAgLy8vIGNvdWxkIGJlIGVhc3kgc29ydGVkIGFtb25nIGVhY2ggb3RoZXJzLgorICAvLy8gVGhlIHN0cnVjdHVyZXMuIFN0cnVjdHVyZXMgYXJlIGdyb3VwZWQgYXQgdGhlIHRhaWwsIGFnYWluIGJlY2F1c2Ugb2YgdGhlaXIKKyAgLy8vIFR5cGVJRDogU3RydWN0VHlJRCA+IEludGVnZXJUeUlEID4gRmxvYXRUeUlELgorICAvLy8gU3RydWN0dXJlcyB3aXRoIGdyZWF0ZXIgbnVtYmVyIG9mIGVsZW1lbnRzIGFyZSBncmVhdGVyLiBTdHJ1Y3R1cmVzIHdpdGgKKyAgLy8vIGdyZWF0ZXIgZWxlbWVudHMgZ29pbmcgZmlyc3QgYXJlIGdyZWF0ZXIuCisgIC8vLyBUaGUgc2FtZSBsb2dpYyB3aXRoIHZlY3RvcnMsIGFycmF5cyBhbmQgb3RoZXIgcG9zc2libGUgY29tcGxleCB0eXBlcy4KKyAgLy8vCisgIC8vLyBCaXRjYXN0YWJsZSBjb25zdGFudHMuCisgIC8vLyBMZXQncyBhc3N1bWUsIHRoYXQgc29tZSBjb25zdGFudCwgYmVsb25ncyB0byBzb21lIGdyb3VwIG9mCisgIC8vLyAic28tY2FsbGVkLWVxdWFsIiB2YWx1ZXMgd2l0aCBkaWZmZXJlbnQgdHlwZXMsIGFuZCBhdCB0aGUgc2FtZSB0aW1lCisgIC8vLyBiZWxvbmdzIHRvIGFub3RoZXIgZ3JvdXAgb2YgY29uc3RhbnRzIHdpdGggZXF1YWwgdHlwZXMKKyAgLy8vIGFuZCAicmVhbGx5IiBlcXVhbCB2YWx1ZXMuCisgIC8vLworICAvLy8gTm93LCBwcm92ZSB0aGF0IHRoaXMgaXMgaW1wb3NzaWJsZToKKyAgLy8vCisgIC8vLyBJZiBjb25zdGFudCBBIHdpdGggdHlwZSBUeUEgaXMgYml0Y2FzdGFibGUgdG8gQiB3aXRoIHR5cGUgVHlCLCB0aGVuOgorICAvLy8gMS4gQWxsIGNvbnN0YW50cyB3aXRoIGVxdWFsIHR5cGVzIHRvIFR5QSwgYXJlIGJpdGNhc3RhYmxlIHRvIEIuIFNpbmNlCisgIC8vLyAgICB0aG9zZSBzaG91bGQgYmUgdmVjdG9ycyAoaWYgVHlBIGlzIHZlY3RvciksIHBvaW50ZXJzCisgIC8vLyAgICAoaWYgVHlBIGlzIHBvaW50ZXIpLCBvciBlbHNlIChpZiBUeUEgZXF1YWwgdG8gVHlCKSwgdGhvc2UgdHlwZXMgc2hvdWxkCisgIC8vLyAgICBiZSBlcXVhbCB0byBUeUIuCisgIC8vLyAyLiBBbGwgY29uc3RhbnRzIHdpdGggbm9uLWVxdWFsLCBidXQgYml0Y2FzdGFibGUgdHlwZXMgdG8gVHlBLCBhcmUKKyAgLy8vICAgIGJpdGNhc3RhYmxlIHRvIEIuCisgIC8vLyAgICBPbmNlIGFnYWluLCBqdXN0IGJlY2F1c2Ugd2UgYWxsb3cgaXQgdG8gdmVjdG9ycyBhbmQgcG9pbnRlcnMgb25seS4KKyAgLy8vICAgIFRoaXMgc3RhdGVtZW50IGNvdWxkIGJlIGV4cGFuZGVkIGFzIGJlbG93OgorICAvLy8gMi4xLiBBbGwgdmVjdG9ycyB3aXRoIGVxdWFsIGJpdHdpZHRoIHRvIHZlY3RvciBBLCBoYXMgZXF1YWwgYml0d2lkdGggdG8KKyAgLy8vICAgICAgdmVjdG9yIEIsIGFuZCB0aHVzIGJpdGNhc3RhYmxlIHRvIEIgYXMgd2VsbC4KKyAgLy8vIDIuMi4gQWxsIHBvaW50ZXJzIG9mIHRoZSBzYW1lIGFkZHJlc3Mgc3BhY2UsIG5vIG1hdHRlciB3aGF0IHRoZXkgcG9pbnQgdG8sCisgIC8vLyAgICAgIGJpdGNhc3RhYmxlLiBTbyBpZiBDIGlzIHBvaW50ZXIsIGl0IGNvdWxkIGJlIGJpdGNhc3RlZCB0byBBIGFuZCB0byBCLgorICAvLy8gU28gYW55IGNvbnN0YW50IGVxdWFsIG9yIGJpdGNhc3RhYmxlIHRvIEEgaXMgZXF1YWwgb3IgYml0Y2FzdGFibGUgdG8gQi4KKyAgLy8vIFFFRC4KKyAgLy8vCisgIC8vLyBJbiBhbm90aGVyIHdvcmRzLCBmb3IgcG9pbnRlcnMgYW5kIHZlY3RvcnMsIHdlIGlnbm9yZSB0b3AtbGV2ZWwgdHlwZSBhbmQKKyAgLy8vIGxvb2sgYXQgdGhlaXIgcGFydGljdWxhciBwcm9wZXJ0aWVzIChiaXQtd2lkdGggZm9yIHZlY3RvcnMsIGFuZAorICAvLy8gYWRkcmVzcyBzcGFjZSBmb3IgcG9pbnRlcnMpLgorICAvLy8gSWYgdGhlc2UgcHJvcGVydGllcyBhcmUgZXF1YWwgLSBjb21wYXJlIHRoZWlyIGNvbnRlbnRzLgorICBpbnQgY21wQ29uc3RhbnRzKGNvbnN0IENvbnN0YW50ICpMLCBjb25zdCBDb25zdGFudCAqUikgY29uc3Q7CisKKyAgLy8vIENvbXBhcmVzIHR3byBnbG9iYWwgdmFsdWVzIGJ5IG51bWJlci4gVXNlcyB0aGUgR2xvYmFsTnVtYmVyc1N0YXRlIHRvCisgIC8vLyBpZGVudGlmeSB0aGUgc2FtZSBnb2JhbHMgYWNyb3NzIGZ1bmN0aW9uIGNhbGxzLgorICBpbnQgY21wR2xvYmFsVmFsdWVzKEdsb2JhbFZhbHVlICpMLCBHbG9iYWxWYWx1ZSAqUikgY29uc3Q7CisKKyAgLy8vIEFzc2lnbiBvciBsb29rIHVwIHByZXZpb3VzbHkgYXNzaWduZWQgbnVtYmVycyBmb3IgdGhlIHR3byB2YWx1ZXMsIGFuZAorICAvLy8gcmV0dXJuIHdoZXRoZXIgdGhlIG51bWJlcnMgYXJlIGVxdWFsLiBOdW1iZXJzIGFyZSBhc3NpZ25lZCBpbiB0aGUgb3JkZXIKKyAgLy8vIHZpc2l0ZWQuCisgIC8vLyBDb21wYXJpc29uIG9yZGVyOgorICAvLy8gU3RhZ2UgMDogVmFsdWUgdGhhdCBpcyBmdW5jdGlvbiBpdHNlbGYgaXMgYWx3YXlzIGdyZWF0ZXIgdGhlbiBvdGhlcnMuCisgIC8vLyAgICAgICAgICBJZiBsZWZ0IGFuZCByaWdodCB2YWx1ZXMgYXJlIHJlZmVyZW5jZXMgdG8gdGhlaXIgZnVuY3Rpb25zLCB0aGVuCisgIC8vLyAgICAgICAgICB0aGV5IGFyZSBlcXVhbC4KKyAgLy8vIFN0YWdlIDE6IENvbnN0YW50cyBhcmUgZ3JlYXRlciB0aGFuIG5vbi1jb25zdGFudHMuCisgIC8vLyAgICAgICAgICBJZiBib3RoIGxlZnQgYW5kIHJpZ2h0IGFyZSBjb25zdGFudHMsIHRoZW4gdGhlIHJlc3VsdCBvZgorICAvLy8gICAgICAgICAgY21wQ29uc3RhbnRzIGlzIHVzZWQgYXMgY21wVmFsdWVzIHJlc3VsdC4KKyAgLy8vIFN0YWdlIDI6IElubGluZUFzbSBpbnN0YW5jZXMgYXJlIGdyZWF0ZXIgdGhhbiBvdGhlcnMuIElmIGJvdGggbGVmdCBhbmQKKyAgLy8vICAgICAgICAgIHJpZ2h0IGFyZSBJbmxpbmVBc20gaW5zdGFuY2VzLCBJbmxpbmVBc20qIHBvaW50ZXJzIGNhc3RlZCB0bworICAvLy8gICAgICAgICAgaW50ZWdlcnMgYW5kIGNvbXBhcmVkIGFzIG51bWJlcnMuCisgIC8vLyBTdGFnZSAzOiBGb3IgYWxsIG90aGVyIGNhc2VzIHdlIGNvbXBhcmUgb3JkZXIgd2UgbWVldCB0aGVzZSB2YWx1ZXMgaW4KKyAgLy8vICAgICAgICAgIHRoZWlyIGZ1bmN0aW9ucy4gSWYgcmlnaHQgdmFsdWUgd2FzIG1ldCBmaXJzdCBkdXJpbmcgc2Nhbm5pbmcsCisgIC8vLyAgICAgICAgICB0aGVuIGxlZnQgdmFsdWUgaXMgZ3JlYXRlci4KKyAgLy8vICAgICAgICAgIEluIGFub3RoZXIgd29yZHMsIHdlIGNvbXBhcmUgc2VyaWFsIG51bWJlcnMsIGZvciBtb3JlIGRldGFpbHMKKyAgLy8vICAgICAgICAgIHNlZSBjb21tZW50cyBmb3Igc25fbWFwTCBhbmQgc25fbWFwUi4KKyAgaW50IGNtcFZhbHVlcyhjb25zdCBWYWx1ZSAqTCwgY29uc3QgVmFsdWUgKlIpIGNvbnN0OworCisgIC8vLyBDb21wYXJlIHR3byBJbnN0cnVjdGlvbnMgZm9yIGVxdWl2YWxlbmNlLCBzaW1pbGFyIHRvCisgIC8vLyBJbnN0cnVjdGlvbjo6aXNTYW1lT3BlcmF0aW9uQXMuCisgIC8vLworICAvLy8gU3RhZ2VzIGFyZSBsaXN0ZWQgaW4gIm1vc3Qgc2lnbmlmaWNhbnQgc3RhZ2UgZmlyc3QiIG9yZGVyOgorICAvLy8gT24gZWFjaCBzdGFnZSBiZWxvdywgd2UgZG8gY29tcGFyaXNvbiBiZXR3ZWVuIHNvbWUgbGVmdCBhbmQgcmlnaHQKKyAgLy8vIG9wZXJhdGlvbiBwYXJ0cy4gSWYgcGFydHMgYXJlIG5vbi1lcXVhbCwgd2UgYXNzaWduIHBhcnRzIGNvbXBhcmlzb24KKyAgLy8vIHJlc3VsdCB0byB0aGUgb3BlcmF0aW9uIGNvbXBhcmlzb24gcmVzdWx0IGFuZCBleGl0IGZyb20gbWV0aG9kLgorICAvLy8gT3RoZXJ3aXNlIHdlIHByb2NlZWQgdG8gdGhlIG5leHQgc3RhZ2UuCisgIC8vLyBTdGFnZXM6CisgIC8vLyAxLiBPcGVyYXRpb25zIG9wY29kZXMuIENvbXBhcmVkIGFzIG51bWJlcnMuCisgIC8vLyAyLiBOdW1iZXIgb2Ygb3BlcmFuZHMuCisgIC8vLyAzLiBPcGVyYXRpb24gdHlwZXMuIENvbXBhcmVkIHdpdGggY21wVHlwZSBtZXRob2QuCisgIC8vLyA0LiBDb21wYXJlIG9wZXJhdGlvbiBzdWJjbGFzcyBvcHRpb25hbCBkYXRhIGFzIHN0cmVhbSBvZiBieXRlczoKKyAgLy8vIGp1c3QgY29udmVydCBpdCB0byBpbnRlZ2VycyBhbmQgY2FsbCBjbXBOdW1iZXJzLgorICAvLy8gNS4gQ29tcGFyZSBpbiBvcGVyYXRpb24gb3BlcmFuZCB0eXBlcyB3aXRoIGNtcFR5cGUgaW4KKyAgLy8vIG1vc3Qgc2lnbmlmaWNhbnQgb3BlcmFuZCBmaXJzdCBvcmRlci4KKyAgLy8vIDYuIExhc3Qgc3RhZ2UuIENoZWNrIG9wZXJhdGlvbnMgZm9yIHNvbWUgc3BlY2lmaWMgYXR0cmlidXRlcy4KKyAgLy8vIEZvciBleGFtcGxlLCBmb3IgTG9hZCBpdCB3b3VsZCBiZToKKyAgLy8vIDYuMS5Mb2FkOiB2b2xhdGlsZSAoYXMgYm9vbGVhbiBmbGFnKQorICAvLy8gNi4yLkxvYWQ6IGFsaWdubWVudCAoYXMgaW50ZWdlciBudW1iZXJzKQorICAvLy8gNi4zLkxvYWQ6IG9yZGVyaW5nIChhcyB1bmRlcmx5aW5nIGVudW0gY2xhc3MgdmFsdWUpCisgIC8vLyA2LjQuTG9hZDogc3luY2gtc2NvcGUgKGFzIGludGVnZXIgbnVtYmVycykKKyAgLy8vIDYuNS5Mb2FkOiByYW5nZSBtZXRhZGF0YSAoYXMgaW50ZWdlciByYW5nZXMpCisgIC8vLyBPbiB0aGlzIHN0YWdlIGl0cyBiZXR0ZXIgdG8gc2VlIHRoZSBjb2RlLCBzaW5jZSBpdHMgbm90IG1vcmUgdGhhbiAxMC0xNQorICAvLy8gc3RyaW5ncyBmb3IgcGFydGljdWxhciBpbnN0cnVjdGlvbiwgYW5kIGNvdWxkIGNoYW5nZSBzb21ldGltZXMuCisgIC8vLworICAvLy8gU2V0cyBccCBuZWVkVG9DbXBPcGVyYW5kcyB0byB0cnVlIGlmIHRoZSBvcGVyYW5kcyBvZiB0aGUgaW5zdHJ1Y3Rpb25zCisgIC8vLyBzdGlsbCBtdXN0IGJlIGNvbXBhcmVkIGFmdGVyd2FyZHMuIEluIHRoaXMgY2FzZSBpdCdzIGFscmVhZHkgZ3VhcmFudGVlZAorICAvLy8gdGhhdCBib3RoIGluc3RydWN0aW9ucyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBvcGVyYW5kcy4KKyAgaW50IGNtcE9wZXJhdGlvbnMoY29uc3QgSW5zdHJ1Y3Rpb24gKkwsIGNvbnN0IEluc3RydWN0aW9uICpSLAorICAgICAgICAgICAgICAgICAgICBib29sICZuZWVkVG9DbXBPcGVyYW5kcykgY29uc3Q7CisKKyAgLy8vIGNtcFR5cGUgLSBjb21wYXJlcyB0d28gdHlwZXMsCisgIC8vLyBkZWZpbmVzIHRvdGFsIG9yZGVyaW5nIGFtb25nIHRoZSB0eXBlcyBzZXQuCisgIC8vLworICAvLy8gUmV0dXJuIHZhbHVlczoKKyAgLy8vIDAgaWYgdHlwZXMgYXJlIGVxdWFsLAorICAvLy8gLTEgaWYgTGVmdCBpcyBsZXNzIHRoYW4gUmlnaHQsCisgIC8vLyArMSBpZiBMZWZ0IGlzIGdyZWF0ZXIgdGhhbiBSaWdodC4KKyAgLy8vCisgIC8vLyBEZXNjcmlwdGlvbjoKKyAgLy8vIENvbXBhcmlzb24gaXMgYnJva2VuIG9udG8gc3RhZ2VzLiBMaWtlIGluIGxleGljb2dyYXBoaWNhbCBjb21wYXJpc29uCisgIC8vLyBzdGFnZSBjb21pbmcgZmlyc3QgaGFzIGhpZ2hlciBwcmlvcml0eS4KKyAgLy8vIE9uIGVhY2ggZXhwbGFuYXRpb24gc3RhZ2Uga2VlcCBpbiBtaW5kIHRvdGFsIG9yZGVyaW5nIHByb3BlcnRpZXMuCisgIC8vLworICAvLy8gMC4gQmVmb3JlIGNvbXBhcmlzb24gd2UgY29lcmNlIHBvaW50ZXIgdHlwZXMgb2YgMCBhZGRyZXNzIHNwYWNlIHRvCisgIC8vLyBpbnRlZ2VyLgorICAvLy8gV2UgYWxzbyBkb24ndCBib3RoZXIgd2l0aCBzYW1lIHR5cGUgYXQgbGVmdCBhbmQgcmlnaHQsIHNvCisgIC8vLyBqdXN0IHJldHVybiAwIGluIHRoaXMgY2FzZS4KKyAgLy8vCisgIC8vLyAxLiBJZiB0eXBlcyBhcmUgb2YgZGlmZmVyZW50IGtpbmQgKGRpZmZlcmVudCB0eXBlIElEcykuCisgIC8vLyAgICBSZXR1cm4gcmVzdWx0IG9mIHR5cGUgSURzIGNvbXBhcmlzb24sIHRyZWF0aW5nIHRoZW0gYXMgbnVtYmVycy4KKyAgLy8vIDIuIElmIHR5cGVzIGFyZSBpbnRlZ2VycywgY2hlY2sgdGhhdCB0aGV5IGhhdmUgdGhlIHNhbWUgd2lkdGguIElmIHRoZXkKKyAgLy8vIGFyZSB2ZWN0b3JzLCBjaGVjayB0aGF0IHRoZXkgaGF2ZSB0aGUgc2FtZSBjb3VudCBhbmQgc3VidHlwZS4KKyAgLy8vIDMuIFR5cGVzIGhhdmUgdGhlIHNhbWUgSUQsIHNvIGNoZWNrIHdoZXRoZXIgdGhleSBhcmUgb25lIG9mOgorICAvLy8gKiBWb2lkCisgIC8vLyAqIEZsb2F0CisgIC8vLyAqIERvdWJsZQorICAvLy8gKiBYODZfRlA4MAorICAvLy8gKiBGUDEyOAorICAvLy8gKiBQUENfRlAxMjgKKyAgLy8vICogTGFiZWwKKyAgLy8vICogTWV0YWRhdGEKKyAgLy8vIFdlIGNhbiB0cmVhdCB0aGVzZSB0eXBlcyBhcyBlcXVhbCB3aGVuZXZlciB0aGVpciBJRHMgYXJlIHNhbWUuCisgIC8vLyA0LiBJZiBMZWZ0IGFuZCBSaWdodCBhcmUgcG9pbnRlcnMsIHJldHVybiByZXN1bHQgb2YgYWRkcmVzcyBzcGFjZQorICAvLy8gY29tcGFyaXNvbiAobnVtYmVycyBjb21wYXJpc29uKS4gV2UgY2FuIHRyZWF0IHBvaW50ZXIgdHlwZXMgb2Ygc2FtZQorICAvLy8gYWRkcmVzcyBzcGFjZSBhcyBlcXVhbC4KKyAgLy8vIDUuIElmIHR5cGVzIGFyZSBjb21wbGV4LgorICAvLy8gVGhlbiBib3RoIExlZnQgYW5kIFJpZ2h0IGFyZSB0byBiZSBleHBhbmRlZCBhbmQgdGhlaXIgZWxlbWVudCB0eXBlcyB3aWxsCisgIC8vLyBiZSBjaGVja2VkIHdpdGggdGhlIHNhbWUgd2F5LiBJZiB3ZSBnZXQgUmVzICE9IDAgb24gc29tZSBzdGFnZSwgcmV0dXJuIGl0LgorICAvLy8gT3RoZXJ3aXNlIHJldHVybiAwLgorICAvLy8gNi4gRm9yIGFsbCBvdGhlciBjYXNlcyBwdXQgbGx2bV91bnJlYWNoYWJsZS4KKyAgaW50IGNtcFR5cGVzKFR5cGUgKlR5TCwgVHlwZSAqVHlSKSBjb25zdDsKKworICBpbnQgY21wTnVtYmVycyh1aW50NjRfdCBMLCB1aW50NjRfdCBSKSBjb25zdDsKKyAgaW50IGNtcEFQSW50cyhjb25zdCBBUEludCAmTCwgY29uc3QgQVBJbnQgJlIpIGNvbnN0OworICBpbnQgY21wQVBGbG9hdHMoY29uc3QgQVBGbG9hdCAmTCwgY29uc3QgQVBGbG9hdCAmUikgY29uc3Q7CisgIGludCBjbXBNZW0oU3RyaW5nUmVmIEwsIFN0cmluZ1JlZiBSKSBjb25zdDsKKworICAvLyBUaGUgdHdvIGZ1bmN0aW9ucyB1bmRlcmdvaW5nIGNvbXBhcmlzb24uCisgIGNvbnN0IEZ1bmN0aW9uICpGbkwsICpGblI7CisKK3ByaXZhdGU6CisgIGludCBjbXBPcmRlcmluZ3MoQXRvbWljT3JkZXJpbmcgTCwgQXRvbWljT3JkZXJpbmcgUikgY29uc3Q7CisgIGludCBjbXBJbmxpbmVBc20oY29uc3QgSW5saW5lQXNtICpMLCBjb25zdCBJbmxpbmVBc20gKlIpIGNvbnN0OworICBpbnQgY21wQXR0cnMoY29uc3QgQXR0cmlidXRlTGlzdCBMLCBjb25zdCBBdHRyaWJ1dGVMaXN0IFIpIGNvbnN0OworICBpbnQgY21wUmFuZ2VNZXRhZGF0YShjb25zdCBNRE5vZGUgKkwsIGNvbnN0IE1ETm9kZSAqUikgY29uc3Q7CisgIGludCBjbXBPcGVyYW5kQnVuZGxlc1NjaGVtYShjb25zdCBJbnN0cnVjdGlvbiAqTCwgY29uc3QgSW5zdHJ1Y3Rpb24gKlIpIGNvbnN0OworCisgIC8vLyBDb21wYXJlIHR3byBHRVBzIGZvciBlcXVpdmFsZW50IHBvaW50ZXIgYXJpdGhtZXRpYy4KKyAgLy8vIFBhcnRzIHRvIGJlIGNvbXBhcmVkIGZvciBlYWNoIGNvbXBhcmlzb24gc3RhZ2UsCisgIC8vLyBtb3N0IHNpZ25pZmljYW50IHN0YWdlIGZpcnN0OgorICAvLy8gMS4gQWRkcmVzcyBzcGFjZS4gQXMgbnVtYmVycy4KKyAgLy8vIDIuIENvbnN0YW50IG9mZnNldCwgKHVzaW5nIEdFUE9wZXJhdG9yOjphY2N1bXVsYXRlQ29uc3RhbnRPZmZzZXQgbWV0aG9kKS4KKyAgLy8vIDMuIFBvaW50ZXIgb3BlcmFuZCB0eXBlICh1c2luZyBjbXBUeXBlIG1ldGhvZCkuCisgIC8vLyA0LiBOdW1iZXIgb2Ygb3BlcmFuZHMuCisgIC8vLyA1LiBDb21wYXJlIG9wZXJhbmRzLCB1c2luZyBjbXBWYWx1ZXMgbWV0aG9kLgorICBpbnQgY21wR0VQcyhjb25zdCBHRVBPcGVyYXRvciAqR0VQTCwgY29uc3QgR0VQT3BlcmF0b3IgKkdFUFIpIGNvbnN0OworICBpbnQgY21wR0VQcyhjb25zdCBHZXRFbGVtZW50UHRySW5zdCAqR0VQTCwKKyAgICAgICAgICAgICAgY29uc3QgR2V0RWxlbWVudFB0ckluc3QgKkdFUFIpIGNvbnN0IHsKKyAgICByZXR1cm4gY21wR0VQcyhjYXN0PEdFUE9wZXJhdG9yPihHRVBMKSwgY2FzdDxHRVBPcGVyYXRvcj4oR0VQUikpOworICB9CisKKyAgLy8vIEFzc2lnbiBzZXJpYWwgbnVtYmVycyB0byB2YWx1ZXMgZnJvbSBsZWZ0IGZ1bmN0aW9uLCBhbmQgdmFsdWVzIGZyb20KKyAgLy8vIHJpZ2h0IGZ1bmN0aW9uLgorICAvLy8gRXhwbGFuYXRpb246CisgIC8vLyBCZWluZyBjb21wYXJpbmcgZnVuY3Rpb25zIHdlIG5lZWQgdG8gY29tcGFyZSB2YWx1ZXMgd2UgbWVldCBhdCBsZWZ0IGFuZAorICAvLy8gcmlnaHQgc2lkZXMuCisgIC8vLyBJdHMgZWFzeSB0byBzb3J0IHRoaW5ncyBvdXQgZm9yIGV4dGVybmFsIHZhbHVlcy4gSXQganVzdCBzaG91bGQgYmUKKyAgLy8vIHRoZSBzYW1lIHZhbHVlIGF0IGxlZnQgYW5kIHJpZ2h0LgorICAvLy8gQnV0IGZvciBsb2NhbCB2YWx1ZXMgKHRob3NlIHdlcmUgaW50cm9kdWNlZCBpbnNpZGUgZnVuY3Rpb24gYm9keSkKKyAgLy8vIHdlIGhhdmUgdG8gZW5zdXJlIHRoZXkgd2VyZSBpbnRyb2R1Y2VkIGF0IGV4YWN0bHkgdGhlIHNhbWUgcGxhY2UsCisgIC8vLyBhbmQgcGxheXMgdGhlIHNhbWUgcm9sZS4KKyAgLy8vIExldCdzIGFzc2lnbiBzZXJpYWwgbnVtYmVyIHRvIGVhY2ggdmFsdWUgd2hlbiB3ZSBtZWV0IGl0IGZpcnN0IHRpbWUuCisgIC8vLyBWYWx1ZXMgdGhhdCB3ZXJlIG1ldCBhdCBzYW1lIHBsYWNlIHdpbGwgYmUgd2l0aCBzYW1lIHNlcmlhbCBudW1iZXJzLgorICAvLy8gSW4gdGhpcyBjYXNlIGl0IHdvdWxkIGJlIGdvb2QgdG8gZXhwbGFpbiBmZXcgcG9pbnRzIGFib3V0IHZhbHVlcyBhc3NpZ25lZAorICAvLy8gdG8gQkJzIGFuZCBvdGhlciB3YXlzIG9mIGltcGxlbWVudGF0aW9uIChzZWUgYmVsb3cpLgorICAvLy8KKyAgLy8vIDEuIFNhZmV0eSBvZiBCQiByZW9yZGVyaW5nLgorICAvLy8gSXQncyBzYWZlIHRvIGNoYW5nZSB0aGUgb3JkZXIgb2YgQmFzaWNCbG9ja3MgaW4gZnVuY3Rpb24uCisgIC8vLyBSZWxhdGlvbnNoaXAgd2l0aCBvdGhlciBmdW5jdGlvbnMgYW5kIHNlcmlhbCBudW1iZXJpbmcgd2lsbCBub3QgYmUKKyAgLy8vIGNoYW5nZWQgaW4gdGhpcyBjYXNlLgorICAvLy8gQXMgZm9sbG93cyBmcm9tIEZ1bmN0aW9uQ29tcGFyYXRvcjo6Y29tcGFyZSgpLCB3ZSBkbyBDRkcgd2Fsazogd2Ugc3RhcnQKKyAgLy8vIGZyb20gdGhlIGVudHJ5LCBhbmQgdGhlbiB0YWtlIGVhY2ggdGVybWluYXRvci4gU28gaXQgZG9lc24ndCBtYXR0ZXIgaG93IGluCisgIC8vLyBmYWN0IEJCcyBhcmUgb3JkZXJlZCBpbiBmdW5jdGlvbi4gQW5kIHNpbmNlIGNtcFZhbHVlcyBhcmUgY2FsbGVkIGR1cmluZworICAvLy8gdGhpcyB3YWxrLCB0aGUgbnVtYmVyaW5nIGRlcGVuZHMgb25seSBvbiBob3cgQkJzIGxvY2F0ZWQgaW5zaWRlIHRoZSBDRkcuCisgIC8vLyBTbyB0aGUgYW5zd2VyIGlzIC0geWVzLiBXZSB3aWxsIGdldCB0aGUgc2FtZSBudW1iZXJpbmcuCisgIC8vLworICAvLy8gMi4gSW1wb3NzaWJpbGl0eSB0byB1c2UgZG9taW5hbmNlIHByb3BlcnRpZXMgb2YgdmFsdWVzLgorICAvLy8gSWYgd2UgY29tcGFyZSB0d28gaW5zdHJ1Y3Rpb24gb3BlcmFuZHM6IGZpcnN0IGlzIHVzYWdlIG9mIGxvY2FsCisgIC8vLyB2YXJpYWJsZSBBTCBmcm9tIGZ1bmN0aW9uIEZMLCBhbmQgc2Vjb25kIGlzIHVzYWdlIG9mIGxvY2FsIHZhcmlhYmxlIEFSCisgIC8vLyBmcm9tIEZSLCB3ZSBjb3VsZCBjb21wYXJlIHRoZWlyIG9yaWdpbnMgYW5kIGNoZWNrIHdoZXRoZXIgdGhleSBhcmUKKyAgLy8vIGRlZmluZWQgYXQgdGhlIHNhbWUgcGxhY2UuCisgIC8vLyBCdXQsIHdlIGFyZSBzdGlsbCBub3QgYWJsZSB0byBjb21wYXJlIG9wZXJhbmRzIG9mIFBISSBub2Rlcywgc2luY2UgdGhvc2UKKyAgLy8vIGNvdWxkIGJlIG9wZXJhbmRzIGZyb20gZnVydGhlciBCQnMgd2UgZGlkbid0IHNjYW4geWV0LgorICAvLy8gU28gaXQncyBpbXBvc3NpYmxlIHRvIHVzZSBkb21pbmFuY2UgcHJvcGVydGllcyBpbiBnZW5lcmFsLgorICBtdXRhYmxlIERlbnNlTWFwPGNvbnN0IFZhbHVlKiwgaW50PiBzbl9tYXBMLCBzbl9tYXBSOworCisgIC8vIFRoZSBnbG9iYWwgc3RhdGUgd2Ugd2lsbCB1c2UKKyAgR2xvYmFsTnVtYmVyU3RhdGUqIEdsb2JhbE51bWJlcnM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0ZVTkNUSU9OQ09NUEFSQVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvRnVuY3Rpb25JbXBvcnRVdGlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0Z1bmN0aW9uSW1wb3J0VXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWZiZWYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0Z1bmN0aW9uSW1wb3J0VXRpbHMuaApAQCAtMCwwICsxLDExOSBAQAorLy89PT0tIEZ1bmN0aW9uSW1wb3J0VXRpbHMuaCAtIEltcG9ydGluZyBzdXBwb3J0IHV0aWxpdGllcyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBGdW5jdGlvbkltcG9ydEdsb2JhbFByb2Nlc3NpbmcgY2xhc3Mgd2hpY2ggaXMgdXNlZAorLy8gdG8gcGVyZm9ybSB0aGUgbmVjZXNzYXJ5IGdsb2JhbCB2YWx1ZSBoYW5kbGluZyBmb3IgZnVuY3Rpb24gaW1wb3J0aW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0ZVTkNUSU9OSU1QT1JUVVRJTFNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfRlVOQ1RJT05JTVBPUlRVVElMU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZVN1bW1hcnlJbmRleC5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNb2R1bGU7CisKKy8vLyBDbGFzcyB0byBoYW5kbGUgbmVjZXNzYXJ5IEdsb2JhbFZhbHVlIGNoYW5nZXMgcmVxdWlyZWQgYnkgVGhpbkxUTworLy8vIGZ1bmN0aW9uIGltcG9ydGluZywgaW5jbHVkaW5nIGxpbmthZ2UgY2hhbmdlcyBhbmQgYW55IG5lY2Vzc2FyeSByZW5hbWluZy4KK2NsYXNzIEZ1bmN0aW9uSW1wb3J0R2xvYmFsUHJvY2Vzc2luZyB7CisgIC8vLyBUaGUgTW9kdWxlIHdoaWNoIHdlIGFyZSBleHBvcnRpbmcgb3IgaW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tLgorICBNb2R1bGUgJk07CisKKyAgLy8vIE1vZHVsZSBzdW1tYXJ5IGluZGV4IHBhc3NlZCBpbiBmb3IgZnVuY3Rpb24gaW1wb3J0aW5nL2V4cG9ydGluZyBoYW5kbGluZy4KKyAgY29uc3QgTW9kdWxlU3VtbWFyeUluZGV4ICZJbXBvcnRJbmRleDsKKworICAvLy8gR2xvYmFscyB0byBpbXBvcnQgZnJvbSB0aGlzIG1vZHVsZSwgYWxsIG90aGVyIGZ1bmN0aW9ucyB3aWxsIGJlCisgIC8vLyBpbXBvcnRlZCBhcyBkZWNsYXJhdGlvbnMgaW5zdGVhZCBvZiBkZWZpbml0aW9ucy4KKyAgU2V0VmVjdG9yPEdsb2JhbFZhbHVlICo+ICpHbG9iYWxzVG9JbXBvcnQ7CisKKyAgLy8vIFNldCB0byB0cnVlIGlmIHRoZSBnaXZlbiBNb2R1bGVTdW1tYXJ5SW5kZXggY29udGFpbnMgYW55IGZ1bmN0aW9ucworICAvLy8gZnJvbSB0aGlzIHNvdXJjZSBtb2R1bGUsIGluIHdoaWNoIGNhc2Ugd2UgbXVzdCBjb25zZXJ2YXRpdmVseSBhc3N1bWUKKyAgLy8vIHRoYXQgYW55IG9mIGl0cyBmdW5jdGlvbnMgbWF5IGJlIGltcG9ydGVkIGludG8gYW5vdGhlciBtb2R1bGUKKyAgLy8vIGFzIHBhcnQgb2YgYSBkaWZmZXJlbnQgYmFja2VuZCBjb21waWxhdGlvbiBwcm9jZXNzLgorICBib29sIEhhc0V4cG9ydGVkRnVuY3Rpb25zID0gZmFsc2U7CisKKyAgLy8vIFNldCBvZiBsbHZtLip1c2VkIHZhbHVlcywgaW4gb3JkZXIgdG8gdmFsaWRhdGUgdGhhdCB3ZSBkb24ndCB0cnkKKyAgLy8vIHRvIHByb21vdGUgYW55IG5vbi1yZW5hbWFibGUgdmFsdWVzLgorICBTbWFsbFB0clNldDxHbG9iYWxWYWx1ZSAqLCA4PiBVc2VkOworCisgIC8vLyBDaGVjayBpZiB3ZSBzaG91bGQgcHJvbW90ZSB0aGUgZ2l2ZW4gbG9jYWwgdmFsdWUgdG8gZ2xvYmFsIHNjb3BlLgorICBib29sIHNob3VsZFByb21vdGVMb2NhbFRvR2xvYmFsKGNvbnN0IEdsb2JhbFZhbHVlICpTR1YpOworCisjaWZuZGVmIE5ERUJVRworICAvLy8gQ2hlY2sgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGEgbG9jYWwgdGhhdCBjYW4ndCBiZSByZW5hbWVkIChwcm9tb3RlZCkuCisgIC8vLyBPbmx5IHVzZWQgaW4gYXNzZXJ0aW9uIGNoZWNraW5nLCBhbmQgZGlzYWJsZWQgdW5kZXIgTkRFQlVHIHNpbmNlIHRoZSBVc2VkCisgIC8vLyBzZXQgd2lsbCBub3QgYmUgcG9wdWxhdGVkLgorICBib29sIGlzTm9uUmVuYW1hYmxlTG9jYWwoY29uc3QgR2xvYmFsVmFsdWUgJkdWKSBjb25zdDsKKyNlbmRpZgorCisgIC8vLyBIZWxwZXIgbWV0aG9kcyB0byBjaGVjayBpZiB3ZSBhcmUgaW1wb3J0aW5nIGZyb20gb3IgcG90ZW50aWFsbHkKKyAgLy8vIGV4cG9ydGluZyBmcm9tIHRoZSBjdXJyZW50IHNvdXJjZSBtb2R1bGUuCisgIGJvb2wgaXNQZXJmb3JtaW5nSW1wb3J0KCkgY29uc3QgeyByZXR1cm4gR2xvYmFsc1RvSW1wb3J0ICE9IG51bGxwdHI7IH0KKyAgYm9vbCBpc01vZHVsZUV4cG9ydGluZygpIGNvbnN0IHsgcmV0dXJuIEhhc0V4cG9ydGVkRnVuY3Rpb25zOyB9CisKKyAgLy8vIElmIHdlIGFyZSBpbXBvcnRpbmcgZnJvbSB0aGUgc291cmNlIG1vZHVsZSwgY2hlY2tzIGlmIHdlIHNob3VsZAorICAvLy8gaW1wb3J0IFNHViBhcyBhIGRlZmluaXRpb24sIG90aGVyd2lzZSBpbXBvcnQgYXMgYSBkZWNsYXJhdGlvbi4KKyAgYm9vbCBkb0ltcG9ydEFzRGVmaW5pdGlvbihjb25zdCBHbG9iYWxWYWx1ZSAqU0dWKTsKKworICAvLy8gR2V0IHRoZSBuYW1lIGZvciBTR1YgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiB0aGUgbGlua2VkIGRlc3RpbmF0aW9uCisgIC8vLyBtb2R1bGUuIFNwZWNpZmljYWxseSwgdGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gcmVuYW1lCisgIC8vLyBhIGxvY2FsIHRoYXQgaXMgYmVpbmcgcHJvbW90ZWQgdG8gZ2xvYmFsIHNjb3BlLCB3aGljaCBpdCB3aWxsIGFsd2F5cworICAvLy8gZG8gd2hlbiBccCBEb1Byb21vdGUgaXMgdHJ1ZSAob3Igd2hlbiBpbXBvcnRpbmcgYSBsb2NhbCkuCisgIHN0ZDo6c3RyaW5nIGdldE5hbWUoY29uc3QgR2xvYmFsVmFsdWUgKlNHViwgYm9vbCBEb1Byb21vdGUpOworCisgIC8vLyBQcm9jZXNzIGdsb2JhbHMgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGluIFRoaW5MVE8uIFRoaXMgaW5jbHVkZXMKKyAgLy8vIHByb21vdGluZyBsb2NhbCB2YXJpYWJsZXMgc28gdGhhdCB0aGV5IGNhbiBiZSByZWZlcmVuY2UgZXh0ZXJuYWxseSBieQorICAvLy8gdGhpbiBsdG8gaW1wb3J0ZWQgZ2xvYmFscyBhbmQgY29udmVydGluZyBzdHJvbmcgZXh0ZXJuYWwgZ2xvYmFscyB0bworICAvLy8gYXZhaWxhYmxlX2V4dGVybmFsbHkuCisgIHZvaWQgcHJvY2Vzc0dsb2JhbHNGb3JUaGluTFRPKCk7CisgIHZvaWQgcHJvY2Vzc0dsb2JhbEZvclRoaW5MVE8oR2xvYmFsVmFsdWUgJkdWKTsKKworICAvLy8gR2V0IHRoZSBuZXcgbGlua2FnZSBmb3IgU0dWIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIGxpbmtlZCBkZXN0aW5hdGlvbgorICAvLy8gbW9kdWxlLiBTcGVjaWZpY2FsbHksIGZvciBUaGluTFRPIGltcG9ydGluZyBvciBleHBvcnRpbmcgaXQgbWF5IG5lZWQKKyAgLy8vIHRvIGJlIGFkanVzdGVkLiBXaGVuIFxwIERvUHJvbW90ZSBpcyB0cnVlIHRoZW4gd2UgbXVzdCBhZGp1c3QgdGhlCisgIC8vLyBsaW5rYWdlIGZvciBhIHJlcXVpcmVkIHByb21vdGlvbiBvZiBhIGxvY2FsIHRvIGdsb2JhbCBzY29wZS4KKyAgR2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyBnZXRMaW5rYWdlKGNvbnN0IEdsb2JhbFZhbHVlICpTR1YsIGJvb2wgRG9Qcm9tb3RlKTsKKworcHVibGljOgorICBGdW5jdGlvbkltcG9ydEdsb2JhbFByb2Nlc3NpbmcoCisgICAgICBNb2R1bGUgJk0sIGNvbnN0IE1vZHVsZVN1bW1hcnlJbmRleCAmSW5kZXgsCisgICAgICBTZXRWZWN0b3I8R2xvYmFsVmFsdWUgKj4gKkdsb2JhbHNUb0ltcG9ydCA9IG51bGxwdHIpCisgICAgICA6IE0oTSksIEltcG9ydEluZGV4KEluZGV4KSwgR2xvYmFsc1RvSW1wb3J0KEdsb2JhbHNUb0ltcG9ydCkgeworICAgIC8vIElmIHdlIGhhdmUgYSBNb2R1bGVTdW1tYXJ5SW5kZXggYnV0IG5vIGZ1bmN0aW9uIHRvIGltcG9ydCwKKyAgICAvLyB0aGVuIHRoaXMgaXMgdGhlIHByaW1hcnkgbW9kdWxlIGJlaW5nIGNvbXBpbGVkIGluIGEgVGhpbkxUTworICAgIC8vIGJhY2tlbmQgY29tcGlsYXRpb24sIGFuZCB3ZSBuZWVkIHRvIHNlZSBpZiBpdCBoYXMgZnVuY3Rpb25zIHRoYXQKKyAgICAvLyBtYXkgYmUgZXhwb3J0ZWQgdG8gYW5vdGhlciBiYWNrZW5kIGNvbXBpbGF0aW9uLgorICAgIGlmICghR2xvYmFsc1RvSW1wb3J0KQorICAgICAgSGFzRXhwb3J0ZWRGdW5jdGlvbnMgPSBJbXBvcnRJbmRleC5oYXNFeHBvcnRlZEZ1bmN0aW9ucyhNKTsKKworI2lmbmRlZiBOREVCVUcKKyAgICAvLyBGaXJzdCBjb2xsZWN0IHRob3NlIGluIHRoZSBsbHZtLnVzZWQgc2V0LgorICAgIGNvbGxlY3RVc2VkR2xvYmFsVmFyaWFibGVzKE0sIFVzZWQsIC8qQ29tcGlsZXJVc2VkKi8gZmFsc2UpOworICAgIC8vIE5leHQgY29sbGVjdCB0aG9zZSBpbiB0aGUgbGx2bS5jb21waWxlci51c2VkIHNldC4KKyAgICBjb2xsZWN0VXNlZEdsb2JhbFZhcmlhYmxlcyhNLCBVc2VkLCAvKkNvbXBpbGVyVXNlZCovIHRydWUpOworI2VuZGlmCisgIH0KKworICBib29sIHJ1bigpOworCisgIHN0YXRpYyBib29sIGRvSW1wb3J0QXNEZWZpbml0aW9uKGNvbnN0IEdsb2JhbFZhbHVlICpTR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldFZlY3RvcjxHbG9iYWxWYWx1ZSAqPiAqR2xvYmFsc1RvSW1wb3J0KTsKK307CisKKy8vLyBQZXJmb3JtIGluLXBsYWNlIGdsb2JhbCB2YWx1ZSBoYW5kbGluZyBvbiB0aGUgZ2l2ZW4gTW9kdWxlIGZvcgorLy8vIGV4cG9ydGVkIGxvY2FsIGZ1bmN0aW9ucyByZW5hbWVkIGFuZCBwcm9tb3RlZCBmb3IgVGhpbkxUTy4KK2Jvb2wgcmVuYW1lTW9kdWxlRm9yVGhpbkxUTygKKyAgICBNb2R1bGUgJk0sIGNvbnN0IE1vZHVsZVN1bW1hcnlJbmRleCAmSW5kZXgsCisgICAgU2V0VmVjdG9yPEdsb2JhbFZhbHVlICo+ICpHbG9iYWxzVG9JbXBvcnQgPSBudWxscHRyKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvR2xvYmFsU3RhdHVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvR2xvYmFsU3RhdHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNjMjY1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9HbG9iYWxTdGF0dXMuaApAQCAtMCwwICsxLDg1IEBACisvLz09PS0gR2xvYmFsU3RhdHVzLmggLSBDb21wdXRlIHN0YXR1cyBpbmZvIGZvciBnbG9iYWxzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19HTE9CQUxTVEFUVVNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfR0xPQkFMU1RBVFVTX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BdG9taWNPcmRlcmluZy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIENvbnN0YW50OworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBWYWx1ZTsKKworLy8vIEl0IGlzIHNhZmUgdG8gZGVzdHJveSBhIGNvbnN0YW50IGlmZiBpdCBpcyBvbmx5IHVzZWQgYnkgY29uc3RhbnRzIGl0c2VsZi4KKy8vLyBOb3RlIHRoYXQgY29uc3RhbnRzIGNhbm5vdCBiZSBjeWNsaWMsIHNvIHRoaXMgdGVzdCBpcyBwcmV0dHkgZWFzeSB0bworLy8vIGltcGxlbWVudCByZWN1cnNpdmVseS4KKy8vLworYm9vbCBpc1NhZmVUb0Rlc3Ryb3lDb25zdGFudChjb25zdCBDb25zdGFudCAqQyk7CisKKy8vLyBBcyB3ZSBhbmFseXplIGVhY2ggZ2xvYmFsLCBrZWVwIHRyYWNrIG9mIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgaXQuICBJZiB3ZQorLy8vIGZpbmQgb3V0IHRoYXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGdsb2JhbCBpcyB0YWtlbiwgbm9uZSBvZiB0aGlzIGluZm8gd2lsbCBiZQorLy8vIGFjY3VyYXRlLgorc3RydWN0IEdsb2JhbFN0YXR1cyB7CisgIC8vLyBUcnVlIGlmIHRoZSBnbG9iYWwncyBhZGRyZXNzIGlzIHVzZWQgaW4gYSBjb21wYXJpc29uLgorICBib29sIElzQ29tcGFyZWQgPSBmYWxzZTsKKworICAvLy8gVHJ1ZSBpZiB0aGUgZ2xvYmFsIGlzIGV2ZXIgbG9hZGVkLiAgSWYgdGhlIGdsb2JhbCBpc24ndCBldmVyIGxvYWRlZCBpdAorICAvLy8gY2FuIGJlIGRlbGV0ZWQuCisgIGJvb2wgSXNMb2FkZWQgPSBmYWxzZTsKKworICAvLy8gS2VlcCB0cmFjayBvZiB3aGF0IHN0b3JlcyB0byB0aGUgZ2xvYmFsIGxvb2sgbGlrZS4KKyAgZW51bSBTdG9yZWRUeXBlIHsKKyAgICAvLy8gVGhlcmUgaXMgbm8gc3RvcmUgdG8gdGhpcyBnbG9iYWwuICBJdCBjYW4gdGh1cyBiZSBtYXJrZWQgY29uc3RhbnQuCisgICAgTm90U3RvcmVkLAorCisgICAgLy8vIFRoaXMgZ2xvYmFsIGlzIHN0b3JlZCB0bywgYnV0IHRoZSBvbmx5IHRoaW5nIHN0b3JlZCBpcyB0aGUgY29uc3RhbnQgaXQKKyAgICAvLy8gd2FzIGluaXRpYWxpemVkIHdpdGguIFRoaXMgaXMgb25seSB0cmFja2VkIGZvciBzY2FsYXIgZ2xvYmFscy4KKyAgICBJbml0aWFsaXplclN0b3JlZCwKKworICAgIC8vLyBUaGlzIGdsb2JhbCBpcyBzdG9yZWQgdG8sIGJ1dCBvbmx5IGl0cyBpbml0aWFsaXplciBhbmQgb25lIG90aGVyIHZhbHVlCisgICAgLy8vIGlzIGV2ZXIgc3RvcmVkIHRvIGl0LiAgSWYgdGhpcyBnbG9iYWwgaXNTdG9yZWRPbmNlLCB3ZSB0cmFjayB0aGUgdmFsdWUKKyAgICAvLy8gc3RvcmVkIHRvIGl0IGluIFN0b3JlZE9uY2VWYWx1ZSBiZWxvdy4gIFRoaXMgaXMgb25seSB0cmFja2VkIGZvciBzY2FsYXIKKyAgICAvLy8gZ2xvYmFscy4KKyAgICBTdG9yZWRPbmNlLAorCisgICAgLy8vIFRoaXMgZ2xvYmFsIGlzIHN0b3JlZCB0byBieSBtdWx0aXBsZSB2YWx1ZXMgb3Igc29tZXRoaW5nIGVsc2UgdGhhdCB3ZQorICAgIC8vLyBjYW5ub3QgdHJhY2suCisgICAgU3RvcmVkCisgIH0gU3RvcmVkVHlwZSA9IE5vdFN0b3JlZDsKKworICAvLy8gSWYgb25seSBvbmUgdmFsdWUgKGJlc2lkZXMgdGhlIGluaXRpYWxpemVyIGNvbnN0YW50KSBpcyBldmVyIHN0b3JlZCB0bworICAvLy8gdGhpcyBnbG9iYWwsIGtlZXAgdHJhY2sgb2Ygd2hhdCB2YWx1ZSBpdCBpcy4KKyAgVmFsdWUgKlN0b3JlZE9uY2VWYWx1ZSA9IG51bGxwdHI7CisKKyAgLy8vIFRoZXNlIHN0YXJ0IG91dCBudWxsL2ZhbHNlLiAgV2hlbiB0aGUgZmlyc3QgYWNjZXNzaW5nIGZ1bmN0aW9uIGlzIG5vdGljZWQsCisgIC8vLyBpdCBpcyByZWNvcmRlZC4gV2hlbiBhIHNlY29uZCBkaWZmZXJlbnQgYWNjZXNzaW5nIGZ1bmN0aW9uIGlzIG5vdGljZWQsCisgIC8vLyBIYXNNdWx0aXBsZUFjY2Vzc2luZ0Z1bmN0aW9ucyBpcyBzZXQgdG8gdHJ1ZS4KKyAgY29uc3QgRnVuY3Rpb24gKkFjY2Vzc2luZ0Z1bmN0aW9uID0gbnVsbHB0cjsKKyAgYm9vbCBIYXNNdWx0aXBsZUFjY2Vzc2luZ0Z1bmN0aW9ucyA9IGZhbHNlOworCisgIC8vLyBTZXQgdG8gdHJ1ZSBpZiB0aGlzIGdsb2JhbCBoYXMgYSB1c2VyIHRoYXQgaXMgbm90IGFuIGluc3RydWN0aW9uIChlLmcuIGEKKyAgLy8vIGNvbnN0YW50IGV4cHIgb3IgR1YgaW5pdGlhbGl6ZXIpLgorICBib29sIEhhc05vbkluc3RydWN0aW9uVXNlciA9IGZhbHNlOworCisgIC8vLyBTZXQgdG8gdGhlIHN0cm9uZ2VzdCBhdG9taWMgb3JkZXJpbmcgcmVxdWlyZW1lbnQuCisgIEF0b21pY09yZGVyaW5nIE9yZGVyaW5nID0gQXRvbWljT3JkZXJpbmc6Ok5vdEF0b21pYzsKKworICBHbG9iYWxTdGF0dXMoKTsKKworICAvLy8gTG9vayBhdCBhbGwgdXNlcyBvZiB0aGUgZ2xvYmFsIGFuZCBmaWxsIGluIHRoZSBHbG9iYWxTdGF0dXMgc3RydWN0dXJlLiAgSWYKKyAgLy8vIHRoZSBnbG9iYWwgaGFzIGl0cyBhZGRyZXNzIHRha2VuLCByZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB3ZSBjYW4ndCBkbworICAvLy8gYW55dGhpbmcgd2l0aCBpdC4KKyAgc3RhdGljIGJvb2wgYW5hbHl6ZUdsb2JhbChjb25zdCBWYWx1ZSAqViwgR2xvYmFsU3RhdHVzICZHUyk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0dMT0JBTFNUQVRVU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvSW1wb3J0ZWRGdW5jdGlvbnNJbmxpbmluZ1N0YXRpc3RpY3MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9JbXBvcnRlZEZ1bmN0aW9uc0lubGluaW5nU3RhdGlzdGljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YTNkMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvSW1wb3J0ZWRGdW5jdGlvbnNJbmxpbmluZ1N0YXRpc3RpY3MuaApAQCAtMCwwICsxLDEwNyBAQAorLy89PT0tLSBJbXBvcnRlZEZ1bmN0aW9uc0lubGluaW5nU3RhdHMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEdlbmVyYXRpbmcgaW5saW5lciBzdGF0aXN0aWNzIGZvciBpbXBvcnRlZCBmdW5jdGlvbnMsIG1vc3RseSB1c2VmdWwgZm9yCisvLyBUaGluTFRPLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfSU1QT1JURURGVU5DVElPTlNJTkxJTklOR1NUQVRJU1RJQ1NfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfSU1QT1JURURGVU5DVElPTlNJTkxJTklOR1NUQVRJU1RJQ1NfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBGdW5jdGlvbjsKKy8vLyBcYnJpZWYgQ2FsY3VsYXRlIGFuZCBkdW1wIFRoaW5MVE8gc3BlY2lmaWMgaW5saW5lciBzdGF0cy4KKy8vLyBUaGUgbWFpbiBzdGF0aXN0aWNzIGFyZToKKy8vLyAoMSkgTnVtYmVyIG9mIGlubGluZWQgaW1wb3J0ZWQgZnVuY3Rpb25zLAorLy8vICgyKSBOdW1iZXIgb2YgaW1wb3J0ZWQgZnVuY3Rpb25zIGlubGluZWQgaW50byBpbXBvcnRpbmcgbW9kdWxlIChpbmRpcmVjdCksCisvLy8gKDMpIE51bWJlciBvZiBub24gaW1wb3J0ZWQgZnVuY3Rpb25zIGlubGluZWQgaW50byBpbXBvcnRpbmcgbW9kdWxlCisvLy8gKGluZGlyZWN0KS4KKy8vLyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGZpcnN0IGFuZCB0aGUgc2Vjb25kIGlzIHRoYXQgZmlyc3Qgc3RhdCBjb3VudHMKKy8vLyBhbGwgcGVyZm9ybWVkIGlubGluZXMgb24gaW1wb3J0ZWQgZnVuY3Rpb25zLCBidXQgdGhlIHNlY29uZCBvbmUgb25seSB0aGUKKy8vLyBmdW5jdGlvbnMgdGhhdCBoYXZlIGJlZW4gZXZlbnR1YWxseSBpbmxpbmVkIHRvIGEgZnVuY3Rpb24gaW4gdGhlIGltcG9ydGluZworLy8vIG1vZHVsZSAoYnkgYSBjaGFpbiBvZiBpbmxpbmVzKS4gQmVjYXVzZSBsbHZtIHVzZXMgYm90dG9tLXVwIGlubGluZXIsIGl0IGlzCisvLy8gcG9zc2libGUgdG8gZS5nLiBpbXBvcnQgZnVuY3Rpb24gYEFgLCBgQmAgYW5kIHRoZW4gaW5saW5lIGBCYCB0byBgQWAsCisvLy8gYW5kIGFmdGVyIHRoaXMgYEFgIG1pZ2h0IGJlIHRvbyBiaWcgdG8gYmUgaW5saW5lZCBpbnRvIHNvbWUgb3RoZXIgZnVuY3Rpb24KKy8vLyB0aGF0IGNhbGxzIGl0LiBJdCBjYWxjdWxhdGVzIHRoaXMgc3RhdGlzdGljIGJ5IGJ1aWxkaW5nIGdyYXBoLCB3aGVyZQorLy8vIHRoZSBub2RlcyBhcmUgZnVuY3Rpb25zLCBhbmQgZWRnZXMgYXJlIHBlcmZvcm1lZCBpbmxpbmVzIGFuZCB0aGVuIGJ5IG1hcmtpbmcKKy8vLyB0aGUgZWRnZXMgc3RhcnRpbmcgZnJvbSBub3QgaW1wb3J0ZWQgZnVuY3Rpb24uCisvLy8KKy8vLyBJZiBgVmVyYm9zZWAgaXMgc2V0IHRvIHRydWUsIHRoZW4gaXQgYWxzbyBkdW1wcyBzdGF0aXN0aWNzCisvLy8gcGVyIGVhY2ggaW5saW5lZCBmdW5jdGlvbiwgc29ydGVkIGJ5IHRoZSBncmVhdGVzdCBpbmxpbmVzIGNvdW50IGxpa2UKKy8vLyAtIG51bWJlciBvZiBwZXJmb3JtZWQgaW5saW5lcworLy8vIC0gbnVtYmVyIG9mIHBlcmZvcm1lZCBpbmxpbmVzIHRvIGltcG9ydGluZyBtb2R1bGUKK2NsYXNzIEltcG9ydGVkRnVuY3Rpb25zSW5saW5pbmdTdGF0aXN0aWNzIHsKK3ByaXZhdGU6CisgIC8vLyBJbmxpbmVHcmFwaE5vZGUgcmVwcmVzZW50cyBub2RlIGluIGdyYXBoIG9mIGlubGluZWQgZnVuY3Rpb25zLgorICBzdHJ1Y3QgSW5saW5lR3JhcGhOb2RlIHsKKyAgICAvLyBEZWZhdWx0LWNvbnN0cnVjdGlibGUgYW5kIG1vdmFibGUuCisgICAgSW5saW5lR3JhcGhOb2RlKCkgPSBkZWZhdWx0OworICAgIElubGluZUdyYXBoTm9kZShJbmxpbmVHcmFwaE5vZGUgJiYpID0gZGVmYXVsdDsKKyAgICBJbmxpbmVHcmFwaE5vZGUgJm9wZXJhdG9yPShJbmxpbmVHcmFwaE5vZGUgJiYpID0gZGVmYXVsdDsKKworICAgIGxsdm06OlNtYWxsVmVjdG9yPElubGluZUdyYXBoTm9kZSAqLCA4PiBJbmxpbmVkQ2FsbGVlczsKKyAgICAvLy8gSW5jcmVtZW50ZWQgZXZlcnkgZGlyZWN0IGlubGluZS4KKyAgICBpbnQzMl90IE51bWJlck9mSW5saW5lcyA9IDA7CisgICAgLy8vIE51bWJlciBvZiBpbmxpbmVzIGludG8gbm9uIGltcG9ydGVkIGZ1bmN0aW9uIChwb3NzaWJseSBpbmRpcmVjdCB2aWEKKyAgICAvLy8gaW50ZXJtZWRpYXRlIGlubGluZXMpLiBDb21wdXRlZCBiYXNlZCBvbiBncmFwaCBzZWFyY2guCisgICAgaW50MzJfdCBOdW1iZXJPZlJlYWxJbmxpbmVzID0gMDsKKyAgICBib29sIEltcG9ydGVkID0gZmFsc2U7CisgICAgYm9vbCBWaXNpdGVkID0gZmFsc2U7CisgIH07CisKK3B1YmxpYzoKKyAgSW1wb3J0ZWRGdW5jdGlvbnNJbmxpbmluZ1N0YXRpc3RpY3MoKSA9IGRlZmF1bHQ7CisgIEltcG9ydGVkRnVuY3Rpb25zSW5saW5pbmdTdGF0aXN0aWNzKAorICAgICAgY29uc3QgSW1wb3J0ZWRGdW5jdGlvbnNJbmxpbmluZ1N0YXRpc3RpY3MgJikgPSBkZWxldGU7CisKKyAgLy8vIFNldCBpbmZvcm1hdGlvbiBsaWtlIEFsbEZ1bmN0aW9ucywgSW1wb3J0ZWRGdW5jdGlvbnMsIE1vZHVsZU5hbWUuCisgIHZvaWQgc2V0TW9kdWxlSW5mbyhjb25zdCBNb2R1bGUgJk0pOworICAvLy8gUmVjb3JkIGlubGluZSBvZiBAcGFyYW0gQ2FsbGVlIHRvIEBwYXJhbSBDYWxsZXIgZm9yIHN0YXRpc3Rpcy4KKyAgdm9pZCByZWNvcmRJbmxpbmUoY29uc3QgRnVuY3Rpb24gJkNhbGxlciwgY29uc3QgRnVuY3Rpb24gJkNhbGxlZSk7CisgIC8vLyBEdW1wIHN0YXRzIGNvbXB1dGVkIHdpdGggSW5saW5lclN0YXRpc3RpY3MgY2xhc3MuCisgIC8vLyBJZiBAcGFyYW0gVmVyYm9zZSBpcyB0cnVlIHRoZW4gc2VwYXJhdGUgc3RhdGlzdGljcyBmb3IgZXZlcnkgaW5saW5lZAorICAvLy8gZnVuY3Rpb24gd2lsbCBiZSBwcmludGVkLgorICB2b2lkIGR1bXAoYm9vbCBWZXJib3NlKTsKKworcHJpdmF0ZToKKyAgLy8vIENyZWF0ZXMgbmV3IE5vZGUgaW4gTm9kZU1hcCBhbmQgc2V0cyBhdHRyaWJ1dGVzLCBvciByZXR1cm5zIGV4aXN0ZWQgb25lLgorICBJbmxpbmVHcmFwaE5vZGUgJmNyZWF0ZUlubGluZUdyYXBoTm9kZShjb25zdCBGdW5jdGlvbiAmKTsKKyAgdm9pZCBjYWxjdWxhdGVSZWFsSW5saW5lcygpOworICB2b2lkIGRmcyhJbmxpbmVHcmFwaE5vZGUgJkdyYXBoTm9kZSk7CisKKyAgdXNpbmcgTm9kZXNNYXBUeSA9CisgICAgICBsbHZtOjpTdHJpbmdNYXA8c3RkOjp1bmlxdWVfcHRyPElubGluZUdyYXBoTm9kZT4+OworICB1c2luZyBTb3J0ZWROb2Rlc1R5ID0KKyAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IE5vZGVzTWFwVHk6Ok1hcEVudHJ5VHkqPjsKKyAgLy8vIFJldHVybnMgdmVjdG9yIG9mIGVsZW1lbnRzIHNvcnRlZCBieQorICAvLy8gKC1OdW1iZXJPZklubGluZXMsIC1OdW1iZXJPZlJlYWxJbmxpbmVzLCBGdW5jdGlvbk5hbWUpLgorICBTb3J0ZWROb2Rlc1R5IGdldFNvcnRlZE5vZGVzKCk7CisKK3ByaXZhdGU6CisgIC8vLyBUaGlzIG1hcCBtYW5hZ2UgbGlmZSBvZiBhbGwgSW5saW5lR3JhcGhOb2Rlcy4gVW5pcXVlIHBvaW50ZXIgdG8KKyAgLy8vIElubGluZUdyYXBoTm9kZSB1c2VkIHNpbmNlIHRoZSBub2RlIHBvaW50ZXJzIGFyZSBhbHNvIHNhdmVkIGluIHRoZQorICAvLy8gSW5saW5lZENhbGxlZXMgdmVjdG9yLiBJZiBpdCB3b3VsZCBzdG9yZSBJbmxpbmVHcmFwaE5vZGUgaW5zdGVhZCB0aGVuIHRoZQorICAvLy8gYWRkcmVzcyBvZiB0aGUgbm9kZSB3b3VsZCBub3QgYmUgaW52YXJpYW50LgorICBOb2Rlc01hcFR5IE5vZGVzTWFwOworICAvLy8gTm9uIGV4dGVybmFsIGZ1bmN0aW9ucyB0aGF0IGhhdmUgc29tZSBvdGhlciBmdW5jdGlvbiBpbmxpbmVkIGluc2lkZS4KKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBOb25JbXBvcnRlZENhbGxlcnM7CisgIGludCBBbGxGdW5jdGlvbnMgPSAwOworICBpbnQgSW1wb3J0ZWRGdW5jdGlvbnMgPSAwOworICBTdHJpbmdSZWYgTW9kdWxlTmFtZTsKK307CisKK30gLy8gbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0lNUE9SVEVERlVOQ1RJT05TSU5MSU5JTkdTVEFUSVNUSUNTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9JbnRlZ2VyRGl2aXNpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9JbnRlZ2VyRGl2aXNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWMzMzIxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0ludGVnZXJEaXZpc2lvbi5oCkBAIC0wLDAgKzEsNzMgQEAKKy8vPT09LSBsbHZtL1RyYW5zZm9ybXMvVXRpbHMvSW50ZWdlckRpdmlzaW9uLmggLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIG9mIDMyYml0IGFuZCA2NGJpdCBzY2FsYXIgaW50ZWdlcgorLy8gZGl2aXNpb24gZm9yIHRhcmdldHMgdGhhdCBkb24ndCBoYXZlIG5hdGl2ZSBzdXBwb3J0LiBJdCdzIGxhcmdlbHkgZGVyaXZlZAorLy8gZnJvbSBjb21waWxlci1ydCdzIGltcGxlbWVudGF0aW9ucyBvZiBfX3VkaXZzaTMgYW5kIF9fdWRpdm1vZGRpNCwKKy8vIGJ1dCBoYW5kLXR1bmVkIGZvciB0YXJnZXRzIHRoYXQgcHJlZmVyIGxlc3MgY29udHJvbCBmbG93LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0lOVEVHRVJESVZJU0lPTl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19JTlRFR0VSRElWSVNJT05fSAorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEJpbmFyeU9wZXJhdG9yOworfQorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgLy8vIEdlbmVyYXRlIGNvZGUgdG8gY2FsY3VsYXRlIHRoZSByZW1haW5kZXIgb2YgdHdvIGludGVnZXJzLCByZXBsYWNpbmcgUmVtCisgIC8vLyB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhpcyBjdXJyZW50bHkgZ2VuZXJhdGVzIGNvZGUgdXNpbmcgdGhlIHVkaXYKKyAgLy8vIGV4cGFuc2lvbiwgYnV0IGZ1dHVyZSB3b3JrIGluY2x1ZGVzIGdlbmVyYXRpbmcgbW9yZSBzcGVjaWFsaXplZCBjb2RlLAorICAvLy8gZS5nLiB3aGVuIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9wZXJhbmRzIGFyZSBrbm93bi4gSW1wbGVtZW50cyBib3RoCisgIC8vLyAzMmJpdCBhbmQgNjRiaXQgc2NhbGFyIGRpdmlzaW9uLgorICAvLy8KKyAgLy8vIEBicmllZiBSZXBsYWNlIFJlbSB3aXRoIGdlbmVyYXRlZCBjb2RlLgorICBib29sIGV4cGFuZFJlbWFpbmRlcihCaW5hcnlPcGVyYXRvciAqUmVtKTsKKworICAvLy8gR2VuZXJhdGUgY29kZSB0byBkaXZpZGUgdHdvIGludGVnZXJzLCByZXBsYWNpbmcgRGl2IHdpdGggdGhlIGdlbmVyYXRlZAorICAvLy8gY29kZS4gVGhpcyBjdXJyZW50bHkgZ2VuZXJhdGVzIGNvZGUgc2ltaWxhcmx5IHRvIGNvbXBpbGVyLXJ0J3MKKyAgLy8vIGltcGxlbWVudGF0aW9ucywgYnV0IGZ1dHVyZSB3b3JrIGluY2x1ZGVzIGdlbmVyYXRpbmcgbW9yZSBzcGVjaWFsaXplZCBjb2RlCisgIC8vLyB3aGVuIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9wZXJhbmRzIGFyZSBrbm93bi4gSW1wbGVtZW50cyBib3RoCisgIC8vLyAzMmJpdCBhbmQgNjRiaXQgc2NhbGFyIGRpdmlzaW9uLgorICAvLy8KKyAgLy8vIEBicmllZiBSZXBsYWNlIERpdiB3aXRoIGdlbmVyYXRlZCBjb2RlLgorICBib29sIGV4cGFuZERpdmlzaW9uKEJpbmFyeU9wZXJhdG9yKiBEaXYpOworCisgIC8vLyBHZW5lcmF0ZSBjb2RlIHRvIGNhbGN1bGF0ZSB0aGUgcmVtYWluZGVyIG9mIHR3byBpbnRlZ2VycywgcmVwbGFjaW5nIFJlbQorICAvLy8gd2l0aCB0aGUgZ2VuZXJhdGVkIGNvZGUuIFVzZXMgRXhwYW5kUmVtaW5kZXIgd2l0aCBhIDMyYml0IFJlbSB3aGljaAorICAvLy8gbWFrZXMgaXQgdXNlZnVsIGZvciB0YXJnZXRzIHdpdGggbGl0dGxlIG9yIG5vIHN1cHBvcnQgZm9yIGxlc3MgdGhhbgorICAvLy8gMzIgYml0IGFyaXRobWV0aWMuCisgIC8vLworICAvLy8gQGJyaWVmIFJlcGxhY2UgUmVtIHdpdGggZ2VuZXJhdGVkIGNvZGUuCisgIGJvb2wgZXhwYW5kUmVtYWluZGVyVXBUbzMyQml0cyhCaW5hcnlPcGVyYXRvciAqUmVtKTsKKworICAvLy8gR2VuZXJhdGUgY29kZSB0byBjYWxjdWxhdGUgdGhlIHJlbWFpbmRlciBvZiB0d28gaW50ZWdlcnMsIHJlcGxhY2luZyBSZW0KKyAgLy8vIHdpdGggdGhlIGdlbmVyYXRlZCBjb2RlLiBVc2VzIEV4cGFuZFJlbWluZGVyIHdpdGggYSA2NGJpdCBSZW0uCisgIC8vLworICAvLy8gQGJyaWVmIFJlcGxhY2UgUmVtIHdpdGggZ2VuZXJhdGVkIGNvZGUuCisgIGJvb2wgZXhwYW5kUmVtYWluZGVyVXBUbzY0Qml0cyhCaW5hcnlPcGVyYXRvciAqUmVtKTsKKworICAvLy8gR2VuZXJhdGUgY29kZSB0byBkaXZpZGUgdHdvIGludGVnZXJzLCByZXBsYWNpbmcgRGl2IHdpdGggdGhlIGdlbmVyYXRlZAorICAvLy8gY29kZS4gVXNlcyBFeHBhbmREaXZpc2lvbiB3aXRoIGEgMzJiaXQgRGl2IHdoaWNoIG1ha2VzIGl0IHVzZWZ1bCBmb3IKKyAgLy8vIHRhcmdldHMgd2l0aCBsaXR0bGUgb3Igbm8gc3VwcG9ydCBmb3IgbGVzcyB0aGFuIDMyIGJpdCBhcml0aG1ldGljLgorICAvLy8KKyAgLy8vIEBicmllZiBSZXBsYWNlIFJlbSB3aXRoIGdlbmVyYXRlZCBjb2RlLgorICBib29sIGV4cGFuZERpdmlzaW9uVXBUbzMyQml0cyhCaW5hcnlPcGVyYXRvciAqRGl2KTsKKworICAvLy8gR2VuZXJhdGUgY29kZSB0byBkaXZpZGUgdHdvIGludGVnZXJzLCByZXBsYWNpbmcgRGl2IHdpdGggdGhlIGdlbmVyYXRlZAorICAvLy8gY29kZS4gVXNlcyBFeHBhbmREaXZpc2lvbiB3aXRoIGEgNjRiaXQgRGl2LgorICAvLy8KKyAgLy8vIEBicmllZiBSZXBsYWNlIFJlbSB3aXRoIGdlbmVyYXRlZCBjb2RlLgorICBib29sIGV4cGFuZERpdmlzaW9uVXBUbzY0Qml0cyhCaW5hcnlPcGVyYXRvciAqRGl2KTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTENTU0EuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9MQ1NTQS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNzE3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTENTU0EuaApAQCAtMCwwICsxLDQ0IEBACisvLz09PS0gTENTU0EuaCAtIExvb3AtY2xvc2VkIFNTQSB0cmFuc2Zvcm0gUGFzcyAtLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyB0cmFuc2Zvcm1zIGxvb3BzIGJ5IHBsYWNpbmcgcGhpIG5vZGVzIGF0IHRoZSBlbmQgb2YgdGhlIGxvb3BzIGZvcgorLy8gYWxsIHZhbHVlcyB0aGF0IGFyZSBsaXZlIGFjcm9zcyB0aGUgbG9vcCBib3VuZGFyeS4gIEZvciBleGFtcGxlLCBpdCB0dXJucworLy8gdGhlIGxlZnQgaW50byB0aGUgcmlnaHQgY29kZToKKy8vCisvLyBmb3IgKC4uLikgICAgICAgICAgICAgICAgZm9yICguLi4pCisvLyAgIGlmIChjKSAgICAgICAgICAgICAgICAgICBpZiAoYykKKy8vICAgICBYMSA9IC4uLiAgICAgICAgICAgICAgICAgWDEgPSAuLi4KKy8vICAgZWxzZSAgICAgICAgICAgICAgICAgICAgIGVsc2UKKy8vICAgICBYMiA9IC4uLiAgICAgICAgICAgICAgICAgWDIgPSAuLi4KKy8vICAgWDMgPSBwaGkoWDEsIFgyKSAgICAgICAgIFgzID0gcGhpKFgxLCBYMikKKy8vIC4uLiA9IFgzICsgNCAgICAgICAgICAgICBYNCA9IHBoaShYMykKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gPSBYNCArIDQKKy8vCisvLyBUaGlzIGlzIHN0aWxsIHZhbGlkIExMVk07IHRoZSBleHRyYSBwaGkgbm9kZXMgYXJlIHB1cmVseSByZWR1bmRhbnQsIGFuZCB3aWxsCisvLyBiZSB0cml2aWFsbHkgZWxpbWluYXRlZCBieSBJbnN0Q29tYmluZS4gIFRoZSBtYWpvciBiZW5lZml0IG9mIHRoaXMKKy8vIHRyYW5zZm9ybWF0aW9uIGlzIHRoYXQgaXQgbWFrZXMgbWFueSBvdGhlciBsb29wIG9wdGltaXphdGlvbnMsIHN1Y2ggYXMKKy8vIExvb3BVbnN3aXRjaGluZywgc2ltcGxlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19MQ1NTQV9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19MQ1NTQV9ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIENvbnZlcnRzIGxvb3BzIGludG8gbG9vcC1jbG9zZWQgU1NBIGZvcm0uCitjbGFzcyBMQ1NTQVBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMQ1NTQVBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTENTU0FfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xpYkNhbGxzU2hyaW5rV3JhcC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xpYkNhbGxzU2hyaW5rV3JhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZGY1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTGliQ2FsbHNTaHJpbmtXcmFwLmgKQEAgLTAsMCArMSwyNyBAQAorLy89PT0tIExpYkNhbGxzU2hyaW5rV3JhcC5oIC0gU2hyaW5rIFdyYXAgTGlicmFyeSBDYWxscyAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19MSUJDQUxMU1NIUklOS1dSQVBfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTElCQ0FMTFNTSFJJTktXUkFQX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMaWJDYWxsc1Nocmlua1dyYXBQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48TGliQ2FsbHNTaHJpbmtXcmFwUGFzcz4geworcHVibGljOgorICBzdGF0aWMgU3RyaW5nUmVmIG5hbWUoKSB7IHJldHVybiAiTGliQ2FsbHNTaHJpbmtXcmFwUGFzcyI7IH0KKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZGQU0pOworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTElCQ0FMTFNTSFJJTktXUkFQX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb29wUm90YXRpb25VdGlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvb3BSb3RhdGlvblV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE0ZDJjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb29wUm90YXRpb25VdGlscy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vPT09LSBMb29wUm90YXRpb25VdGlscy5oIC0gVXRpbGl0aWVzIHRvIHBlcmZvcm0gbG9vcCByb3RhdGlvbiAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHV0aWxpdGllcyB0byBjb252ZXJ0IGEgbG9vcCBpbnRvIGEgbG9vcCB3aXRoIGJvdHRvbSB0ZXN0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xPT1BST1RBVElPTlVUSUxTX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xPT1BST1RBVElPTlVUSUxTX0gKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc3N1bXB0aW9uQ2FjaGU7CitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgTG9vcDsKK2NsYXNzIExvb3BJbmZvOworY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworc3RydWN0IFNpbXBsaWZ5UXVlcnk7CitjbGFzcyBUYXJnZXRUcmFuc2Zvcm1JbmZvOworCisvLy8gXGJyaWVmIENvbnZlcnQgYSBsb29wIGludG8gYSBsb29wIHdpdGggYm90dG9tIHRlc3QuCitib29sIExvb3BSb3RhdGlvbihMb29wICpMLCB1bnNpZ25lZCBNYXhIZWFkZXJTaXplLCBMb29wSW5mbyAqTEksCisgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRUcmFuc2Zvcm1JbmZvICpUVEksIEFzc3VtcHRpb25DYWNoZSAqQUMsCisgICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICpEVCwgU2NhbGFyRXZvbHV0aW9uICpTRSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlNRKTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb29wU2ltcGxpZnkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb29wU2ltcGxpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzgyOGJjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvb3BTaW1wbGlmeS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8vPT09LSBMb29wU2ltcGxpZnkuaCAtIExvb3AgQ2Fub25pY2FsaXphdGlvbiBQYXNzIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIHBlcmZvcm1zIHNldmVyYWwgdHJhbnNmb3JtYXRpb25zIHRvIHRyYW5zZm9ybSBuYXR1cmFsIGxvb3BzIGludG8gYQorLy8gc2ltcGxlciBmb3JtLCB3aGljaCBtYWtlcyBzdWJzZXF1ZW50IGFuYWx5c2VzIGFuZCB0cmFuc2Zvcm1hdGlvbnMgc2ltcGxlciBhbmQKKy8vIG1vcmUgZWZmZWN0aXZlLgorLy8KKy8vIExvb3AgcHJlLWhlYWRlciBpbnNlcnRpb24gZ3VhcmFudGVlcyB0aGF0IHRoZXJlIGlzIGEgc2luZ2xlLCBub24tY3JpdGljYWwKKy8vIGVudHJ5IGVkZ2UgZnJvbSBvdXRzaWRlIG9mIHRoZSBsb29wIHRvIHRoZSBsb29wIGhlYWRlci4gIFRoaXMgc2ltcGxpZmllcyBhCisvLyBudW1iZXIgb2YgYW5hbHlzZXMgYW5kIHRyYW5zZm9ybWF0aW9ucywgc3VjaCBhcyBMSUNNLgorLy8KKy8vIExvb3AgZXhpdC1ibG9jayBpbnNlcnRpb24gZ3VhcmFudGVlcyB0aGF0IGFsbCBleGl0IGJsb2NrcyBmcm9tIHRoZSBsb29wCisvLyAoYmxvY2tzIHdoaWNoIGFyZSBvdXRzaWRlIG9mIHRoZSBsb29wIHRoYXQgaGF2ZSBwcmVkZWNlc3NvcnMgaW5zaWRlIG9mIHRoZQorLy8gbG9vcCkgb25seSBoYXZlIHByZWRlY2Vzc29ycyBmcm9tIGluc2lkZSBvZiB0aGUgbG9vcCAoYW5kIGFyZSB0aHVzIGRvbWluYXRlZAorLy8gYnkgdGhlIGxvb3AgaGVhZGVyKS4gIFRoaXMgc2ltcGxpZmllcyB0cmFuc2Zvcm1hdGlvbnMgc3VjaCBhcyBzdG9yZS1zaW5raW5nCisvLyB0aGF0IGFyZSBidWlsdCBpbnRvIExJQ00uCisvLworLy8gVGhpcyBwYXNzIGFsc28gZ3VhcmFudGVlcyB0aGF0IGxvb3BzIHdpbGwgaGF2ZSBleGFjdGx5IG9uZSBiYWNrZWRnZS4KKy8vCisvLyBJbmRpcmVjdGJyIGluc3RydWN0aW9ucyBpbnRyb2R1Y2Ugc2V2ZXJhbCBjb21wbGljYXRpb25zLiBJZiB0aGUgbG9vcAorLy8gY29udGFpbnMgb3IgaXMgZW50ZXJlZCBieSBhbiBpbmRpcmVjdGJyIGluc3RydWN0aW9uLCBpdCBtYXkgbm90IGJlIHBvc3NpYmxlCisvLyB0byB0cmFuc2Zvcm0gdGhlIGxvb3AgYW5kIG1ha2UgdGhlc2UgZ3VhcmFudGVlcy4gQ2xpZW50IGNvZGUgc2hvdWxkIGNoZWNrCisvLyB0aGF0IHRoZXNlIGNvbmRpdGlvbnMgYXJlIHRydWUgYmVmb3JlIHJlbHlpbmcgb24gdGhlbS4KKy8vCisvLyBOb3RlIHRoYXQgdGhlIHNpbXBsaWZ5Y2ZnIHBhc3Mgd2lsbCBjbGVhbiB1cCBibG9ja3Mgd2hpY2ggYXJlIHNwbGl0IG91dCBidXQKKy8vIGVuZCB1cCBiZWluZyB1bm5lY2Vzc2FyeSwgc28gdXNhZ2Ugb2YgdGhpcyBwYXNzIHNob3VsZCBub3QgcGVzc2ltaXplCisvLyBnZW5lcmF0ZWQgY29kZS4KKy8vCisvLyBUaGlzIHBhc3Mgb2J2aW91c2x5IG1vZGlmaWVzIHRoZSBDRkcsIGJ1dCB1cGRhdGVzIGxvb3AgaW5mb3JtYXRpb24gYW5kCisvLyBkb21pbmF0b3IgaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xPT1BTSU1QTElGWV9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19MT09QU0lNUExJRllfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Bc3N1bXB0aW9uQ2FjaGUuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVGhpcyBwYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBsb29wIGNhbm9uaWNhbGl6YXRpb24uCitjbGFzcyBMb29wU2ltcGxpZnlQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48TG9vcFNpbXBsaWZ5UGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIFNpbXBsaWZ5IGVhY2ggbG9vcCBpbiBhIGxvb3AgbmVzdCByZWN1cnNpdmVseS4KKy8vLworLy8vIFRoaXMgdGFrZXMgYSBwb3RlbnRpYWxseSB1bi1zaW1wbGlmaWVkIGxvb3AgTCAoYW5kIGl0cyBjaGlsZHJlbikgYW5kIHR1cm5zCisvLy8gaXQgaW50byBhIHNpbXBsaWZpZWQgbG9vcCBuZXN0IHdpdGggcHJlaGVhZGVycyBhbmQgc2luZ2xlIGJhY2tlZGdlcy4gSXQgd2lsbAorLy8vIHVwZGF0ZSBcYyBBbGlhc0FuYWx5c2lzIGFuZCBcYyBTY2FsYXJFdm9sdXRpb24gYW5hbHlzZXMgaWYgdGhleSdyZSBub24tbnVsbC4KK2Jvb2wgc2ltcGxpZnlMb29wKExvb3AgKkwsIERvbWluYXRvclRyZWUgKkRULCBMb29wSW5mbyAqTEksIFNjYWxhckV2b2x1dGlvbiAqU0UsCisgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDLCBib29sIFByZXNlcnZlTENTU0EpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xPT1BTSU1QTElGWV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTG9vcFV0aWxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTG9vcFV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMxYTRiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb29wVXRpbHMuaApAQCAtMCwwICsxLDU0NiBAQAorLy89PT0tIGxsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb29wVXRpbHMuaCAtIExvb3AgdXRpbGl0aWVzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBzb21lIGxvb3AgdHJhbnNmb3JtYXRpb24gdXRpbGl0aWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xPT1BVVElMU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19MT09QVVRJTFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RlbWFuZGVkQml0cy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRUhQZXJzb25hbGl0aWVzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9NdXN0RXhlY3V0ZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVGFyZ2V0VHJhbnNmb3JtSW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSVJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0clR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9PcGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFsaWFzU2V0OworY2xhc3MgQWxpYXNTZXRUcmFja2VyOworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIERhdGFMYXlvdXQ7CitjbGFzcyBMb29wOworY2xhc3MgTG9vcEluZm87CitjbGFzcyBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyOworY2xhc3MgUHJlZGljYXRlZFNjYWxhckV2b2x1dGlvbjsKK2NsYXNzIFByZWRJdGVyYXRvckNhY2hlOworY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworY2xhc3MgU0NFVjsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworY2xhc3MgVGFyZ2V0VHJhbnNmb3JtSW5mbzsKKworCisvLy8gVGhlIFJlY3VycmVuY2VEZXNjcmlwdG9yIGlzIHVzZWQgdG8gaWRlbnRpZnkgcmVjdXJyZW5jZXMgdmFyaWFibGVzIGluIGEKKy8vLyBsb29wLiBSZWR1Y3Rpb24gaXMgYSBzcGVjaWFsIGNhc2Ugb2YgcmVjdXJyZW5jZSB0aGF0IGhhcyB1c2VzIG9mIHRoZQorLy8vIHJlY3VycmVuY2UgdmFyaWFibGUgb3V0c2lkZSB0aGUgbG9vcC4gVGhlIG1ldGhvZCBpc1JlZHVjdGlvblBISSBpZGVudGlmaWVzCisvLy8gcmVkdWN0aW9ucyB0aGF0IGFyZSBiYXNpYyByZWN1cnJlbmNlcy4KKy8vLworLy8vIEJhc2ljIHJlY3VycmVuY2VzIGFyZSBkZWZpbmVkIGFzIHRoZSBzdW1tYXRpb24sIHByb2R1Y3QsIE9SLCBBTkQsIFhPUiwgbWluLAorLy8vIG9yIG1heCBvZiBhIHNldCBvZiB0ZXJtcy4gRm9yIGV4YW1wbGU6IGZvcihpPTA7IGk8bjsgaSsrKSB7IHRvdGFsICs9CisvLy8gYXJyYXlbaV07IH0gaXMgYSBzdW1tYXRpb24gb2YgYXJyYXkgZWxlbWVudHMuIEJhc2ljIHJlY3VycmVuY2VzIGFyZSBhCisvLy8gc3BlY2lhbCBjYXNlIG9mIGNoYWlucyBvZiByZWN1cnJlbmNlcyAoQ1IpLiBTZWUgU2NhbGFyRXZvbHV0aW9uIGZvciBDUgorLy8vIHJlZmVyZW5jZXMuCisKKy8vLyBUaGlzIHN0cnVjdCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCByZWN1cnJlbmNlIHZhcmlhYmxlcy4KK2NsYXNzIFJlY3VycmVuY2VEZXNjcmlwdG9yIHsKK3B1YmxpYzoKKyAgLy8vIFRoaXMgZW51bSByZXByZXNlbnRzIHRoZSBraW5kcyBvZiByZWN1cnJlbmNlcyB0aGF0IHdlIHN1cHBvcnQuCisgIGVudW0gUmVjdXJyZW5jZUtpbmQgeworICAgIFJLX05vUmVjdXJyZW5jZSwgIC8vLzwgTm90IGEgcmVjdXJyZW5jZS4KKyAgICBSS19JbnRlZ2VyQWRkLCAgICAvLy88IFN1bSBvZiBpbnRlZ2Vycy4KKyAgICBSS19JbnRlZ2VyTXVsdCwgICAvLy88IFByb2R1Y3Qgb2YgaW50ZWdlcnMuCisgICAgUktfSW50ZWdlck9yLCAgICAgLy8vPCBCaXR3aXNlIG9yIGxvZ2ljYWwgT1Igb2YgbnVtYmVycy4KKyAgICBSS19JbnRlZ2VyQW5kLCAgICAvLy88IEJpdHdpc2Ugb3IgbG9naWNhbCBBTkQgb2YgbnVtYmVycy4KKyAgICBSS19JbnRlZ2VyWG9yLCAgICAvLy88IEJpdHdpc2Ugb3IgbG9naWNhbCBYT1Igb2YgbnVtYmVycy4KKyAgICBSS19JbnRlZ2VyTWluTWF4LCAvLy88IE1pbi9tYXggaW1wbGVtZW50ZWQgaW4gdGVybXMgb2Ygc2VsZWN0KGNtcCgpKS4KKyAgICBSS19GbG9hdEFkZCwgICAgICAvLy88IFN1bSBvZiBmbG9hdHMuCisgICAgUktfRmxvYXRNdWx0LCAgICAgLy8vPCBQcm9kdWN0IG9mIGZsb2F0cy4KKyAgICBSS19GbG9hdE1pbk1heCAgICAvLy88IE1pbi9tYXggaW1wbGVtZW50ZWQgaW4gdGVybXMgb2Ygc2VsZWN0KGNtcCgpKS4KKyAgfTsKKworICAvLyBUaGlzIGVudW0gcmVwcmVzZW50cyB0aGUga2luZCBvZiBtaW5tYXggcmVjdXJyZW5jZS4KKyAgZW51bSBNaW5NYXhSZWN1cnJlbmNlS2luZCB7CisgICAgTVJLX0ludmFsaWQsCisgICAgTVJLX1VJbnRNaW4sCisgICAgTVJLX1VJbnRNYXgsCisgICAgTVJLX1NJbnRNaW4sCisgICAgTVJLX1NJbnRNYXgsCisgICAgTVJLX0Zsb2F0TWluLAorICAgIE1SS19GbG9hdE1heAorICB9OworCisgIFJlY3VycmVuY2VEZXNjcmlwdG9yKCkgPSBkZWZhdWx0OworCisgIFJlY3VycmVuY2VEZXNjcmlwdG9yKFZhbHVlICpTdGFydCwgSW5zdHJ1Y3Rpb24gKkV4aXQsIFJlY3VycmVuY2VLaW5kIEssCisgICAgICAgICAgICAgICAgICAgICAgIE1pbk1heFJlY3VycmVuY2VLaW5kIE1LLCBJbnN0cnVjdGlvbiAqVUFJLCBUeXBlICpSVCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaWduZWQsIFNtYWxsUHRyU2V0SW1wbDxJbnN0cnVjdGlvbiAqPiAmQ0kpCisgICAgICA6IFN0YXJ0VmFsdWUoU3RhcnQpLCBMb29wRXhpdEluc3RyKEV4aXQpLCBLaW5kKEspLCBNaW5NYXhLaW5kKE1LKSwKKyAgICAgICAgVW5zYWZlQWxnZWJyYUluc3QoVUFJKSwgUmVjdXJyZW5jZVR5cGUoUlQpLCBJc1NpZ25lZChTaWduZWQpIHsKKyAgICBDYXN0SW5zdHMuaW5zZXJ0KENJLmJlZ2luKCksIENJLmVuZCgpKTsKKyAgfQorCisgIC8vLyBUaGlzIFBPRCBzdHJ1Y3QgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYSBwb3RlbnRpYWwgcmVjdXJyZW5jZSBvcGVyYXRpb24uCisgIGNsYXNzIEluc3REZXNjIHsKKyAgcHVibGljOgorICAgIEluc3REZXNjKGJvb2wgSXNSZWN1ciwgSW5zdHJ1Y3Rpb24gKkksIEluc3RydWN0aW9uICpVQUkgPSBudWxscHRyKQorICAgICAgICA6IElzUmVjdXJyZW5jZShJc1JlY3VyKSwgUGF0dGVybkxhc3RJbnN0KEkpLCBNaW5NYXhLaW5kKE1SS19JbnZhbGlkKSwKKyAgICAgICAgICBVbnNhZmVBbGdlYnJhSW5zdChVQUkpIHt9CisKKyAgICBJbnN0RGVzYyhJbnN0cnVjdGlvbiAqSSwgTWluTWF4UmVjdXJyZW5jZUtpbmQgSywgSW5zdHJ1Y3Rpb24gKlVBSSA9IG51bGxwdHIpCisgICAgICAgIDogSXNSZWN1cnJlbmNlKHRydWUpLCBQYXR0ZXJuTGFzdEluc3QoSSksIE1pbk1heEtpbmQoSyksCisgICAgICAgICAgVW5zYWZlQWxnZWJyYUluc3QoVUFJKSB7fQorCisgICAgYm9vbCBpc1JlY3VycmVuY2UoKSB7IHJldHVybiBJc1JlY3VycmVuY2U7IH0KKworICAgIGJvb2wgaGFzVW5zYWZlQWxnZWJyYSgpIHsgcmV0dXJuIFVuc2FmZUFsZ2VicmFJbnN0ICE9IG51bGxwdHI7IH0KKworICAgIEluc3RydWN0aW9uICpnZXRVbnNhZmVBbGdlYnJhSW5zdCgpIHsgcmV0dXJuIFVuc2FmZUFsZ2VicmFJbnN0OyB9CisKKyAgICBNaW5NYXhSZWN1cnJlbmNlS2luZCBnZXRNaW5NYXhLaW5kKCkgeyByZXR1cm4gTWluTWF4S2luZDsgfQorCisgICAgSW5zdHJ1Y3Rpb24gKmdldFBhdHRlcm5JbnN0KCkgeyByZXR1cm4gUGF0dGVybkxhc3RJbnN0OyB9CisKKyAgcHJpdmF0ZToKKyAgICAvLyBJcyB0aGlzIGluc3RydWN0aW9uIGEgcmVjdXJyZW5jZSBjYW5kaWRhdGUuCisgICAgYm9vbCBJc1JlY3VycmVuY2U7CisgICAgLy8gVGhlIGxhc3QgaW5zdHJ1Y3Rpb24gaW4gYSBtaW4vbWF4IHBhdHRlcm4gKHNlbGVjdCBvZiB0aGUgc2VsZWN0KGljbXAoKSkKKyAgICAvLyBwYXR0ZXJuKSwgb3IgdGhlIGN1cnJlbnQgcmVjdXJyZW5jZSBpbnN0cnVjdGlvbiBvdGhlcndpc2UuCisgICAgSW5zdHJ1Y3Rpb24gKlBhdHRlcm5MYXN0SW5zdDsKKyAgICAvLyBJZiB0aGlzIGlzIGEgbWluL21heCBwYXR0ZXJuIHRoZSBjb21wYXJpc29uIHByZWRpY2F0ZS4KKyAgICBNaW5NYXhSZWN1cnJlbmNlS2luZCBNaW5NYXhLaW5kOworICAgIC8vIFJlY3VycmVuY2UgaGFzIHVuc2FmZSBhbGdlYnJhLgorICAgIEluc3RydWN0aW9uICpVbnNhZmVBbGdlYnJhSW5zdDsKKyAgfTsKKworICAvLy8gUmV0dXJucyBhIHN0cnVjdCBkZXNjcmliaW5nIGlmIHRoZSBpbnN0cnVjdGlvbiAnSScgY2FuIGJlIGEgcmVjdXJyZW5jZQorICAvLy8gdmFyaWFibGUgb2YgdHlwZSAnS2luZCcuIElmIHRoZSByZWN1cnJlbmNlIGlzIGEgbWluL21heCBwYXR0ZXJuIG9mCisgIC8vLyBzZWxlY3QoaWNtcCgpKSB0aGlzIGZ1bmN0aW9uIGFkdmFuY2VzIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyICdJJyBmcm9tIHRoZQorICAvLy8gY29tcGFyZSBpbnN0cnVjdGlvbiB0byB0aGUgc2VsZWN0IGluc3RydWN0aW9uIGFuZCBzdG9yZXMgdGhpcyBwb2ludGVyIGluCisgIC8vLyAnUGF0dGVybkxhc3RJbnN0JyBtZW1iZXIgb2YgdGhlIHJldHVybmVkIHN0cnVjdC4KKyAgc3RhdGljIEluc3REZXNjIGlzUmVjdXJyZW5jZUluc3RyKEluc3RydWN0aW9uICpJLCBSZWN1cnJlbmNlS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdERlc2MgJlByZXYsIGJvb2wgSGFzRnVuTm9OYU5BdHRyKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIGluc3RydWN0aW9uIEkgaGFzIG11bHRpcGxlIHVzZXMgaW4gSW5zdHMKKyAgc3RhdGljIGJvb2wgaGFzTXVsdGlwbGVVc2VzT2YoSW5zdHJ1Y3Rpb24gKkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0SW1wbDxJbnN0cnVjdGlvbiAqPiAmSW5zdHMpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYWxsIHVzZXMgb2YgdGhlIGluc3RydWN0aW9uIEkgaXMgd2l0aGluIHRoZSBTZXQuCisgIHN0YXRpYyBib29sIGFyZUFsbFVzZXNJbihJbnN0cnVjdGlvbiAqSSwgU21hbGxQdHJTZXRJbXBsPEluc3RydWN0aW9uICo+ICZTZXQpOworCisgIC8vLyBSZXR1cm5zIGEgc3RydWN0IGRlc2NyaWJpbmcgaWYgdGhlIGluc3RydWN0aW9uIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhCisgIC8vLyBTZWxlY3QoSUNtcChYLCBZKSwgWCwgWSkgaW5zdHJ1Y3Rpb24gcGF0dGVybiBjb3JyZXNwb25kaW5nIHRvIGEgbWluKFgsIFkpCisgIC8vLyBvciBtYXgoWCwgWSkuCisgIHN0YXRpYyBJbnN0RGVzYyBpc01pbk1heFNlbGVjdENtcFBhdHRlcm4oSW5zdHJ1Y3Rpb24gKkksIEluc3REZXNjICZQcmV2KTsKKworICAvLy8gUmV0dXJucyBpZGVudGl0eSBjb3JyZXNwb25kaW5nIHRvIHRoZSBSZWN1cnJlbmNlS2luZC4KKyAgc3RhdGljIENvbnN0YW50ICpnZXRSZWN1cnJlbmNlSWRlbnRpdHkoUmVjdXJyZW5jZUtpbmQgSywgVHlwZSAqVHApOworCisgIC8vLyBSZXR1cm5zIHRoZSBvcGNvZGUgb2YgYmluYXJ5IG9wZXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAvLy8gUmVjdXJyZW5jZUtpbmQuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRSZWN1cnJlbmNlQmluT3AoUmVjdXJyZW5jZUtpbmQgS2luZCk7CisKKyAgLy8vIFJldHVybnMgYSBNaW4vTWF4IG9wZXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIE1pbk1heFJlY3VycmVuY2VLaW5kLgorICBzdGF0aWMgVmFsdWUgKmNyZWF0ZU1pbk1heE9wKElSQnVpbGRlcjw+ICZCdWlsZGVyLCBNaW5NYXhSZWN1cnJlbmNlS2luZCBSSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqTGVmdCwgVmFsdWUgKlJpZ2h0KTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIFBoaSBpcyBhIHJlZHVjdGlvbiBvZiB0eXBlIEtpbmQgYW5kIGFkZHMgaXQgdG8gdGhlCisgIC8vLyBSZWN1cnJlbmNlRGVzY3JpcHRvci4gSWYgZWl0aGVyIFxwIERCIGlzIG5vbi1udWxsIG9yIFxwIEFDIGFuZCBccCBEVCBhcmUKKyAgLy8vIG5vbi1udWxsLCB0aGUgbWluaW1hbCBiaXQgd2lkdGggbmVlZGVkIHRvIGNvbXB1dGUgdGhlIHJlZHVjdGlvbiB3aWxsIGJlCisgIC8vLyBjb21wdXRlZC4KKyAgc3RhdGljIGJvb2wgQWRkUmVkdWN0aW9uVmFyKFBISU5vZGUgKlBoaSwgUmVjdXJyZW5jZUtpbmQgS2luZCwgTG9vcCAqVGhlTG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzRnVuTm9OYU5BdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdXJyZW5jZURlc2NyaXB0b3IgJlJlZERlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbWFuZGVkQml0cyAqREIgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgUGhpIGlzIGEgcmVkdWN0aW9uIGluIFRoZUxvb3AuIFRoZSBSZWN1cnJlbmNlRGVzY3JpcHRvcgorICAvLy8gaXMgcmV0dXJuZWQgaW4gUmVkRGVzLiBJZiBlaXRoZXIgXHAgREIgaXMgbm9uLW51bGwgb3IgXHAgQUMgYW5kIFxwIERUIGFyZQorICAvLy8gbm9uLW51bGwsIHRoZSBtaW5pbWFsIGJpdCB3aWR0aCBuZWVkZWQgdG8gY29tcHV0ZSB0aGUgcmVkdWN0aW9uIHdpbGwgYmUKKyAgLy8vIGNvbXB1dGVkLgorICBzdGF0aWMgYm9vbCBpc1JlZHVjdGlvblBISShQSElOb2RlICpQaGksIExvb3AgKlRoZUxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3VycmVuY2VEZXNjcmlwdG9yICZSZWREZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbWFuZGVkQml0cyAqREIgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIFBoaSBpcyBhIGZpcnN0LW9yZGVyIHJlY3VycmVuY2UuIEEgZmlyc3Qtb3JkZXIgcmVjdXJyZW5jZQorICAvLy8gaXMgYSBub24tcmVkdWN0aW9uIHJlY3VycmVuY2UgcmVsYXRpb24gaW4gd2hpY2ggdGhlIHZhbHVlIG9mIHRoZQorICAvLy8gcmVjdXJyZW5jZSBpbiB0aGUgY3VycmVudCBsb29wIGl0ZXJhdGlvbiBlcXVhbHMgYSB2YWx1ZSBkZWZpbmVkIGluIHRoZQorICAvLy8gcHJldmlvdXMgaXRlcmF0aW9uLiBccCBTaW5rQWZ0ZXIgaW5jbHVkZXMgcGFpcnMgb2YgaW5zdHJ1Y3Rpb25zIHdoZXJlIHRoZQorICAvLy8gZmlyc3Qgd2lsbCBiZSByZXNjaGVkdWxlZCB0byBhcHBlYXIgYWZ0ZXIgdGhlIHNlY29uZCBpZi93aGVuIHRoZSBsb29wIGlzCisgIC8vLyB2ZWN0b3JpemVkLiBJdCBtYXkgYmUgYXVnbWVudGVkIHdpdGggYWRkaXRpb25hbCBwYWlycyBpZiBuZWVkZWQgaW4gb3JkZXIKKyAgLy8vIHRvIGhhbmRsZSBQaGkgYXMgYSBmaXJzdC1vcmRlciByZWN1cnJlbmNlLgorICBzdGF0aWMgYm9vbAorICBpc0ZpcnN0T3JkZXJSZWN1cnJlbmNlKFBISU5vZGUgKlBoaSwgTG9vcCAqVGhlTG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxJbnN0cnVjdGlvbiAqLCBJbnN0cnVjdGlvbiAqPiAmU2lua0FmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgKkRUKTsKKworICBSZWN1cnJlbmNlS2luZCBnZXRSZWN1cnJlbmNlS2luZCgpIHsgcmV0dXJuIEtpbmQ7IH0KKworICBNaW5NYXhSZWN1cnJlbmNlS2luZCBnZXRNaW5NYXhSZWN1cnJlbmNlS2luZCgpIHsgcmV0dXJuIE1pbk1heEtpbmQ7IH0KKworICBUcmFja2luZ1ZIPFZhbHVlPiBnZXRSZWN1cnJlbmNlU3RhcnRWYWx1ZSgpIHsgcmV0dXJuIFN0YXJ0VmFsdWU7IH0KKworICBJbnN0cnVjdGlvbiAqZ2V0TG9vcEV4aXRJbnN0cigpIHsgcmV0dXJuIExvb3BFeGl0SW5zdHI7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSByZWN1cnJlbmNlIGhhcyB1bnNhZmUgYWxnZWJyYSB3aGljaCByZXF1aXJlcyBhIHJlbGF4ZWQKKyAgLy8vIGZsb2F0aW5nLXBvaW50IG1vZGVsLgorICBib29sIGhhc1Vuc2FmZUFsZ2VicmEoKSB7IHJldHVybiBVbnNhZmVBbGdlYnJhSW5zdCAhPSBudWxscHRyOyB9CisKKyAgLy8vIFJldHVybnMgZmlyc3QgdW5zYWZlIGFsZ2VicmEgaW5zdHJ1Y3Rpb24gaW4gdGhlIFBISSBub2RlJ3MgdXNlLWNoYWluLgorICBJbnN0cnVjdGlvbiAqZ2V0VW5zYWZlQWxnZWJyYUluc3QoKSB7IHJldHVybiBVbnNhZmVBbGdlYnJhSW5zdDsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHJlY3VycmVuY2Uga2luZCBpcyBhbiBpbnRlZ2VyIGtpbmQuCisgIHN0YXRpYyBib29sIGlzSW50ZWdlclJlY3VycmVuY2VLaW5kKFJlY3VycmVuY2VLaW5kIEtpbmQpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHJlY3VycmVuY2Uga2luZCBpcyBhIGZsb2F0aW5nIHBvaW50IGtpbmQuCisgIHN0YXRpYyBib29sIGlzRmxvYXRpbmdQb2ludFJlY3VycmVuY2VLaW5kKFJlY3VycmVuY2VLaW5kIEtpbmQpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHJlY3VycmVuY2Uga2luZCBpcyBhbiBhcml0aG1ldGljIGtpbmQuCisgIHN0YXRpYyBib29sIGlzQXJpdGhtZXRpY1JlY3VycmVuY2VLaW5kKFJlY3VycmVuY2VLaW5kIEtpbmQpOworCisgIC8vLyBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSByZWN1cnJlbmNlLiBUaGlzIHR5cGUgY2FuIGJlIG5hcnJvd2VyIHRoYW4gdGhlCisgIC8vLyBhY3R1YWwgdHlwZSBvZiB0aGUgUGhpIGlmIHRoZSByZWN1cnJlbmNlIGhhcyBiZWVuIHR5cGUtcHJvbW90ZWQuCisgIFR5cGUgKmdldFJlY3VycmVuY2VUeXBlKCkgeyByZXR1cm4gUmVjdXJyZW5jZVR5cGU7IH0KKworICAvLy8gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgaW5zdHJ1Y3Rpb25zIHVzZWQgZm9yIHR5cGUtcHJvbW90aW5nIHRoZQorICAvLy8gcmVjdXJyZW5jZS4KKyAgU21hbGxQdHJTZXQ8SW5zdHJ1Y3Rpb24gKiwgOD4gJmdldENhc3RJbnN0cygpIHsgcmV0dXJuIENhc3RJbnN0czsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYWxsIHNvdXJjZSBvcGVyYW5kcyBvZiB0aGUgcmVjdXJyZW5jZSBhcmUgU0V4dEluc3RzLgorICBib29sIGlzU2lnbmVkKCkgeyByZXR1cm4gSXNTaWduZWQ7IH0KKworcHJpdmF0ZToKKyAgLy8gVGhlIHN0YXJ0aW5nIHZhbHVlIG9mIHRoZSByZWN1cnJlbmNlLgorICAvLyBJdCBkb2VzIG5vdCBoYXZlIHRvIGJlIHplcm8hCisgIFRyYWNraW5nVkg8VmFsdWU+IFN0YXJ0VmFsdWU7CisgIC8vIFRoZSBpbnN0cnVjdGlvbiB3aG8ncyB2YWx1ZSBpcyB1c2VkIG91dHNpZGUgdGhlIGxvb3AuCisgIEluc3RydWN0aW9uICpMb29wRXhpdEluc3RyID0gbnVsbHB0cjsKKyAgLy8gVGhlIGtpbmQgb2YgdGhlIHJlY3VycmVuY2UuCisgIFJlY3VycmVuY2VLaW5kIEtpbmQgPSBSS19Ob1JlY3VycmVuY2U7CisgIC8vIElmIHRoaXMgYSBtaW4vbWF4IHJlY3VycmVuY2UgdGhlIGtpbmQgb2YgcmVjdXJyZW5jZS4KKyAgTWluTWF4UmVjdXJyZW5jZUtpbmQgTWluTWF4S2luZCA9IE1SS19JbnZhbGlkOworICAvLyBGaXJzdCBvY2N1cnJlbmNlIG9mIHVuYXNmZSBhbGdlYnJhIGluIHRoZSBQSEkncyB1c2UtY2hhaW4uCisgIEluc3RydWN0aW9uICpVbnNhZmVBbGdlYnJhSW5zdCA9IG51bGxwdHI7CisgIC8vIFRoZSB0eXBlIG9mIHRoZSByZWN1cnJlbmNlLgorICBUeXBlICpSZWN1cnJlbmNlVHlwZSA9IG51bGxwdHI7CisgIC8vIFRydWUgaWYgYWxsIHNvdXJjZSBvcGVyYW5kcyBvZiB0aGUgcmVjdXJyZW5jZSBhcmUgU0V4dEluc3RzLgorICBib29sIElzU2lnbmVkID0gZmFsc2U7CisgIC8vIEluc3RydWN0aW9ucyB1c2VkIGZvciB0eXBlLXByb21vdGluZyB0aGUgcmVjdXJyZW5jZS4KKyAgU21hbGxQdHJTZXQ8SW5zdHJ1Y3Rpb24gKiwgOD4gQ2FzdEluc3RzOworfTsKKworLy8vIEEgc3RydWN0IGZvciBzYXZpbmcgaW5mb3JtYXRpb24gYWJvdXQgaW5kdWN0aW9uIHZhcmlhYmxlcy4KK2NsYXNzIEluZHVjdGlvbkRlc2NyaXB0b3IgeworcHVibGljOgorICAvLy8gVGhpcyBlbnVtIHJlcHJlc2VudHMgdGhlIGtpbmRzIG9mIGluZHVjdGlvbnMgdGhhdCB3ZSBzdXBwb3J0LgorICBlbnVtIEluZHVjdGlvbktpbmQgeworICAgIElLX05vSW5kdWN0aW9uLCAgLy8vPCBOb3QgYW4gaW5kdWN0aW9uIHZhcmlhYmxlLgorICAgIElLX0ludEluZHVjdGlvbiwgLy8vPCBJbnRlZ2VyIGluZHVjdGlvbiB2YXJpYWJsZS4gU3RlcCA9IEMuCisgICAgSUtfUHRySW5kdWN0aW9uLCAvLy88IFBvaW50ZXIgaW5kdWN0aW9uIHZhci4gU3RlcCA9IEMgLyBzaXplb2YoZWxlbSkuCisgICAgSUtfRnBJbmR1Y3Rpb24gICAvLy88IEZsb2F0aW5nIHBvaW50IGluZHVjdGlvbiB2YXJpYWJsZS4KKyAgfTsKKworcHVibGljOgorICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciAtIGNyZWF0ZXMgYW4gaW52YWxpZCBpbmR1Y3Rpb24uCisgIEluZHVjdGlvbkRlc2NyaXB0b3IoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIEdldCB0aGUgY29uc2VjdXRpdmUgZGlyZWN0aW9uLiBSZXR1cm5zOgorICAvLy8gICAwIC0gdW5rbm93biBvciBub24tY29uc2VjdXRpdmUuCisgIC8vLyAgIDEgLSBjb25zZWN1dGl2ZSBhbmQgaW5jcmVhc2luZy4KKyAgLy8vICAtMSAtIGNvbnNlY3V0aXZlIGFuZCBkZWNyZWFzaW5nLgorICBpbnQgZ2V0Q29uc2VjdXRpdmVEaXJlY3Rpb24oKSBjb25zdDsKKworICAvLy8gQ29tcHV0ZSB0aGUgdHJhbnNmb3JtZWQgdmFsdWUgb2YgSW5kZXggYXQgb2Zmc2V0IFN0YXJ0VmFsdWUgdXNpbmcgc3RlcAorICAvLy8gU3RlcFZhbHVlLgorICAvLy8gRm9yIGludGVnZXIgaW5kdWN0aW9uLCByZXR1cm5zIFN0YXJ0VmFsdWUgKyBJbmRleCAqIFN0ZXBWYWx1ZS4KKyAgLy8vIEZvciBwb2ludGVyIGluZHVjdGlvbiwgcmV0dXJucyBTdGFydFZhbHVlW0luZGV4ICogU3RlcFZhbHVlXS4KKyAgLy8vIEZJWE1FOiBUaGUgbmV3bHkgY3JlYXRlZCBiaW5hcnkgaW5zdHJ1Y3Rpb25zIHNob3VsZCBjb250YWluIG5zdy9udXcKKyAgLy8vIGZsYWdzLCB3aGljaCBjYW4gYmUgZm91bmQgZnJvbSB0aGUgb3JpZ2luYWwgc2NhbGFyIG9wZXJhdGlvbnMuCisgIFZhbHVlICp0cmFuc2Zvcm0oSVJCdWlsZGVyPD4gJkIsIFZhbHVlICpJbmRleCwgU2NhbGFyRXZvbHV0aW9uICpTRSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0JiBETCkgY29uc3Q7CisKKyAgVmFsdWUgKmdldFN0YXJ0VmFsdWUoKSBjb25zdCB7IHJldHVybiBTdGFydFZhbHVlOyB9CisgIEluZHVjdGlvbktpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIElLOyB9CisgIGNvbnN0IFNDRVYgKmdldFN0ZXAoKSBjb25zdCB7IHJldHVybiBTdGVwOyB9CisgIENvbnN0YW50SW50ICpnZXRDb25zdEludFN0ZXBWYWx1ZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgXHAgUGhpIGlzIGFuIGluZHVjdGlvbiBpbiB0aGUgbG9vcCBccCBMLiBJZiBccCBQaGkgaXMgYW4KKyAgLy8vIGluZHVjdGlvbiwgdGhlIGluZHVjdGlvbiBkZXNjcmlwdG9yIFxwIEQgd2lsbCBjb250YWluIHRoZSBkYXRhIGRlc2NyaWJpbmcKKyAgLy8vIHRoaXMgaW5kdWN0aW9uLiBJZiBieSBzb21lIG90aGVyIG1lYW5zIHRoZSBjYWxsZXIgaGFzIGEgYmV0dGVyIFNDRVYKKyAgLy8vIGV4cHJlc3Npb24gZm9yIFxwIFBoaSB0aGFuIHRoZSBvbmUgcmV0dXJuZWQgYnkgdGhlIFNjYWxhckV2b2x1dGlvbgorICAvLy8gYW5hbHlzaXMsIGl0IGNhbiBiZSBwYXNzZWQgdGhyb3VnaCBccCBFeHByLiBJZiB0aGUgZGVmLXVzZSBjaGFpbiAKKyAgLy8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGhpIGluY2x1ZGVzIGNhc3RzICh0aGF0IHdlIGtub3cgd2UgY2FuIGlnbm9yZQorICAvLy8gdW5kZXIgcHJvcGVyIHJ1bnRpbWUgY2hlY2tzKSwgdGhleSBhcmUgcGFzc2VkIHRocm91Z2ggXHAgQ2FzdHNUb0lnbm9yZS4KKyAgc3RhdGljIGJvb2wgCisgIGlzSW5kdWN0aW9uUEhJKFBISU5vZGUgKlBoaSwgY29uc3QgTG9vcCogTCwgU2NhbGFyRXZvbHV0aW9uICpTRSwKKyAgICAgICAgICAgICAgICAgSW5kdWN0aW9uRGVzY3JpcHRvciAmRCwgY29uc3QgU0NFViAqRXhwciA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbiAqPiAqQ2FzdHNUb0lnbm9yZSA9IG51bGxwdHIpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgXHAgUGhpIGlzIGEgZmxvYXRpbmcgcG9pbnQgaW5kdWN0aW9uIGluIHRoZSBsb29wIFxwIEwuCisgIC8vLyBJZiBccCBQaGkgaXMgYW4gaW5kdWN0aW9uLCB0aGUgaW5kdWN0aW9uIGRlc2NyaXB0b3IgXHAgRCB3aWxsIGNvbnRhaW4gCisgIC8vLyB0aGUgZGF0YSBkZXNjcmliaW5nIHRoaXMgaW5kdWN0aW9uLgorICBzdGF0aWMgYm9vbCBpc0ZQSW5kdWN0aW9uUEhJKFBISU5vZGUgKlBoaSwgY29uc3QgTG9vcCogTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gKlNFLCBJbmR1Y3Rpb25EZXNjcmlwdG9yICZEKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIFxwIFBoaSBpcyBhIGxvb3AgXHAgTCBpbmR1Y3Rpb24sIGluIHRoZSBjb250ZXh0IGFzc29jaWF0ZWQKKyAgLy8vIHdpdGggdGhlIHJ1bi10aW1lIHByZWRpY2F0ZSBvZiBQU0UuIElmIFxwIEFzc3VtZSBpcyB0cnVlLCB0aGlzIGNhbiBhZGQKKyAgLy8vIGZ1cnRoZXIgU0NFViBwcmVkaWNhdGVzIHRvIFxwIFBTRSBpbiBvcmRlciB0byBwcm92ZSB0aGF0IFxwIFBoaSBpcyBhbgorICAvLy8gaW5kdWN0aW9uLgorICAvLy8gSWYgXHAgUGhpIGlzIGFuIGluZHVjdGlvbiwgXHAgRCB3aWxsIGNvbnRhaW4gdGhlIGRhdGEgZGVzY3JpYmluZyB0aGlzCisgIC8vLyBpbmR1Y3Rpb24uCisgIHN0YXRpYyBib29sIGlzSW5kdWN0aW9uUEhJKFBISU5vZGUgKlBoaSwgY29uc3QgTG9vcCogTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZGljYXRlZFNjYWxhckV2b2x1dGlvbiAmUFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmR1Y3Rpb25EZXNjcmlwdG9yICZELCBib29sIEFzc3VtZSA9IGZhbHNlKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBpbmR1Y3Rpb24gdHlwZSBpcyBGUCBhbmQgdGhlIGJpbmFyeSBvcGVyYXRvciBkb2VzCisgIC8vLyBub3QgaGF2ZSB0aGUgImZhc3QtbWF0aCIgcHJvcGVydHkuIFN1Y2ggb3BlcmF0aW9uIHJlcXVpcmVzIGEgcmVsYXhlZCBGUAorICAvLy8gbW9kZS4KKyAgYm9vbCBoYXNVbnNhZmVBbGdlYnJhKCkgeworICAgIHJldHVybiBJbmR1Y3Rpb25CaW5PcCAmJiAhY2FzdDxGUE1hdGhPcGVyYXRvcj4oSW5kdWN0aW9uQmluT3ApLT5pc0Zhc3QoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGluZHVjdGlvbiBvcGVyYXRvciB0aGF0IGRvZXMgbm90IGhhdmUgImZhc3QtbWF0aCIgcHJvcGVydHkKKyAgLy8vIGFuZCByZXF1aXJlcyBGUCB1bnNhZmUgbW9kZS4KKyAgSW5zdHJ1Y3Rpb24gKmdldFVuc2FmZUFsZ2VicmFJbnN0KCkgeworICAgIGlmICghSW5kdWN0aW9uQmluT3AgfHwgY2FzdDxGUE1hdGhPcGVyYXRvcj4oSW5kdWN0aW9uQmluT3ApLT5pc0Zhc3QoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBJbmR1Y3Rpb25CaW5PcDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGJpbmFyeSBvcGNvZGUgb2YgdGhlIGluZHVjdGlvbiBvcGVyYXRvci4KKyAgSW5zdHJ1Y3Rpb246OkJpbmFyeU9wcyBnZXRJbmR1Y3Rpb25PcGNvZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIEluZHVjdGlvbkJpbk9wID8gSW5kdWN0aW9uQmluT3AtPmdldE9wY29kZSgpIDoKKyAgICAgIEluc3RydWN0aW9uOjpCaW5hcnlPcHNFbmQ7CisgIH0KKworICAvLy8gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBjYXN0IGluc3RydWN0aW9ucyBpbiB0aGUgaW5kdWN0aW9uIAorICAvLy8gdXBkYXRlIGNoYWluLCB0aGF0IGFyZSByZWR1bmRhbnQgd2hlbiBndWFyZGVkIHdpdGggYSBydW50aW1lCisgIC8vLyBTQ0VWIG92ZXJmbG93IGNoZWNrLgorICBjb25zdCBTbWFsbFZlY3RvckltcGw8SW5zdHJ1Y3Rpb24gKj4gJmdldENhc3RJbnN0cygpIGNvbnN0IHsgCisgICAgcmV0dXJuIFJlZHVuZGFudENhc3RzOyAKKyAgfQorCitwcml2YXRlOgorICAvLy8gUHJpdmF0ZSBjb25zdHJ1Y3RvciAtIHVzZWQgYnkgXGMgaXNJbmR1Y3Rpb25QSEkuCisgIEluZHVjdGlvbkRlc2NyaXB0b3IoVmFsdWUgKlN0YXJ0LCBJbmR1Y3Rpb25LaW5kIEssIGNvbnN0IFNDRVYgKlN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3IgKkluZHVjdGlvbkJpbk9wID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8SW5zdHJ1Y3Rpb24gKj4gKkNhc3RzID0gbnVsbHB0cik7CisKKyAgLy8vIFN0YXJ0IHZhbHVlLgorICBUcmFja2luZ1ZIPFZhbHVlPiBTdGFydFZhbHVlOworICAvLy8gSW5kdWN0aW9uIGtpbmQuCisgIEluZHVjdGlvbktpbmQgSUsgPSBJS19Ob0luZHVjdGlvbjsKKyAgLy8vIFN0ZXAgdmFsdWUuCisgIGNvbnN0IFNDRVYgKlN0ZXAgPSBudWxscHRyOworICAvLyBJbnN0cnVjdGlvbiB0aGF0IGFkdmFuY2VzIGluZHVjdGlvbiB2YXJpYWJsZS4KKyAgQmluYXJ5T3BlcmF0b3IgKkluZHVjdGlvbkJpbk9wID0gbnVsbHB0cjsKKyAgLy8gSW5zdHJ1Y3Rpb25zIHVzZWQgZm9yIHR5cGUtY2FzdHMgb2YgdGhlIGluZHVjdGlvbiB2YXJpYWJsZSwKKyAgLy8gdGhhdCBhcmUgcmVkdW5kYW50IHdoZW4gZ3VhcmRlZCB3aXRoIGEgcnVudGltZSBTQ0VWIG92ZXJmbG93IGNoZWNrLgorICBTbWFsbFZlY3RvcjxJbnN0cnVjdGlvbiAqLCAyPiBSZWR1bmRhbnRDYXN0czsKK307CisKK0Jhc2ljQmxvY2sgKkluc2VydFByZWhlYWRlckZvckxvb3AoTG9vcCAqTCwgRG9taW5hdG9yVHJlZSAqRFQsIExvb3BJbmZvICpMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQcmVzZXJ2ZUxDU1NBKTsKKworLy8vIEVuc3VyZSB0aGF0IGFsbCBleGl0IGJsb2NrcyBvZiB0aGUgbG9vcCBhcmUgZGVkaWNhdGVkIGV4aXRzLgorLy8vCisvLy8gRm9yIGFueSBsb29wIGV4aXQgYmxvY2sgd2l0aCBub24tbG9vcCBwcmVkZWNlc3NvcnMsIHdlIHNwbGl0IHRoZSBsb29wCisvLy8gcHJlZGVjZXNzb3JzIHRvIHVzZSBhIGRlZGljYXRlZCBsb29wIGV4aXQgYmxvY2suIFdlIHVwZGF0ZSB0aGUgZG9taW5hdG9yCisvLy8gdHJlZSBhbmQgbG9vcCBpbmZvIGlmIHByb3ZpZGVkLCBhbmQgd2lsbCBwcmVzZXJ2ZSBMQ1NTQSBpZiByZXF1ZXN0ZWQuCitib29sIGZvcm1EZWRpY2F0ZWRFeGl0QmxvY2tzKExvb3AgKkwsIERvbWluYXRvclRyZWUgKkRULCBMb29wSW5mbyAqTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUHJlc2VydmVMQ1NTQSk7CisKKy8vLyBFbnN1cmVzIExDU1NBIGZvcm0gZm9yIGV2ZXJ5IGluc3RydWN0aW9uIGZyb20gdGhlIFdvcmtsaXN0IGluIHRoZSBzY29wZSBvZgorLy8vIGlubmVybW9zdCBjb250YWluaW5nIGxvb3AuCisvLy8KKy8vLyBGb3IgdGhlIGdpdmVuIGluc3RydWN0aW9uIHdoaWNoIGhhdmUgdXNlcyBvdXRzaWRlIG9mIHRoZSBsb29wLCBhbiBMQ1NTQSBQSEkKKy8vLyBub2RlIGlzIGluc2VydGVkIGFuZCB0aGUgdXNlcyBvdXRzaWRlIHRoZSBsb29wIGFyZSByZXdyaXR0ZW4gdG8gdXNlIHRoaXMKKy8vLyBub2RlLgorLy8vCisvLy8gTG9vcEluZm8gYW5kIERvbWluYXRvclRyZWUgYXJlIHJlcXVpcmVkIGFuZCwgc2luY2UgdGhlIHJvdXRpbmUgbWFrZXMgbm8KKy8vLyBjaGFuZ2VzIHRvIENGRywgcHJlc2VydmVkLgorLy8vCisvLy8gUmV0dXJucyB0cnVlIGlmIGFueSBtb2RpZmljYXRpb25zIGFyZSBtYWRlLgorYm9vbCBmb3JtTENTU0FGb3JJbnN0cnVjdGlvbnMoU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uICo+ICZXb3JrbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgJkRULCBMb29wSW5mbyAmTEkpOworCisvLy8gXGJyaWVmIFB1dCBsb29wIGludG8gTENTU0EgZm9ybS4KKy8vLworLy8vIExvb2tzIGF0IGFsbCBpbnN0cnVjdGlvbnMgaW4gdGhlIGxvb3Agd2hpY2ggaGF2ZSB1c2VzIG91dHNpZGUgb2YgdGhlCisvLy8gY3VycmVudCBsb29wLiBGb3IgZWFjaCwgYW4gTENTU0EgUEhJIG5vZGUgaXMgaW5zZXJ0ZWQgYW5kIHRoZSB1c2VzIG91dHNpZGUKKy8vLyB0aGUgbG9vcCBhcmUgcmV3cml0dGVuIHRvIHVzZSB0aGlzIG5vZGUuCisvLy8KKy8vLyBMb29wSW5mbyBhbmQgRG9taW5hdG9yVHJlZSBhcmUgcmVxdWlyZWQgYW5kIHByZXNlcnZlZC4KKy8vLworLy8vIElmIFNjYWxhckV2b2x1dGlvbiBpcyBwYXNzZWQgaW4sIGl0IHdpbGwgYmUgcHJlc2VydmVkLgorLy8vCisvLy8gUmV0dXJucyB0cnVlIGlmIGFueSBtb2RpZmljYXRpb25zIGFyZSBtYWRlIHRvIHRoZSBsb29wLgorYm9vbCBmb3JtTENTU0EoTG9vcCAmTCwgRG9taW5hdG9yVHJlZSAmRFQsIExvb3BJbmZvICpMSSwgU2NhbGFyRXZvbHV0aW9uICpTRSk7CisKKy8vLyBcYnJpZWYgUHV0IGEgbG9vcCBuZXN0IGludG8gTENTU0EgZm9ybS4KKy8vLworLy8vIFRoaXMgcmVjdXJzaXZlbHkgZm9ybXMgTENTU0EgZm9yIGEgbG9vcCBuZXN0LgorLy8vCisvLy8gTG9vcEluZm8gYW5kIERvbWluYXRvclRyZWUgYXJlIHJlcXVpcmVkIGFuZCBwcmVzZXJ2ZWQuCisvLy8KKy8vLyBJZiBTY2FsYXJFdm9sdXRpb24gaXMgcGFzc2VkIGluLCBpdCB3aWxsIGJlIHByZXNlcnZlZC4KKy8vLworLy8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSB0byB0aGUgbG9vcC4KK2Jvb2wgZm9ybUxDU1NBUmVjdXJzaXZlbHkoTG9vcCAmTCwgRG9taW5hdG9yVHJlZSAmRFQsIExvb3BJbmZvICpMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyRXZvbHV0aW9uICpTRSk7CisKKy8vLyBcYnJpZWYgV2FsayB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBvZiB0aGUgQ0ZHIChkZWZpbmVkIGJ5IGFsbCBibG9ja3MKKy8vLyBkb21pbmF0ZWQgYnkgdGhlIHNwZWNpZmllZCBibG9jaywgYW5kIHRoYXQgYXJlIGluIHRoZSBjdXJyZW50IGxvb3ApIGluCisvLy8gcmV2ZXJzZSBkZXB0aCBmaXJzdCBvcmRlciB3LnIudCB0aGUgRG9taW5hdG9yVHJlZS4gVGhpcyBhbGxvd3MgdXMgdG8gdmlzaXQKKy8vLyB1c2VzIGJlZm9yZSBkZWZpbml0aW9ucywgYWxsb3dpbmcgdXMgdG8gc2luayBhIGxvb3AgYm9keSBpbiBvbmUgcGFzcyB3aXRob3V0CisvLy8gaXRlcmF0aW9uLiBUYWtlcyBEb21UcmVlTm9kZSwgQWxpYXNBbmFseXNpcywgTG9vcEluZm8sIERvbWluYXRvclRyZWUsCisvLy8gRGF0YUxheW91dCwgVGFyZ2V0TGlicmFyeUluZm8sIExvb3AsIEFsaWFzU2V0IGluZm9ybWF0aW9uIGZvciBhbGwKKy8vLyBpbnN0cnVjdGlvbnMgb2YgdGhlIGxvb3AgYW5kIGxvb3Agc2FmZXR5IGluZm9ybWF0aW9uIGFzCisvLy8gYXJndW1lbnRzLiBEaWFnbm9zdGljcyBpcyBlbWl0dGVkIHZpYSBccCBPUkUuIEl0IHJldHVybnMgY2hhbmdlZCBzdGF0dXMuCitib29sIHNpbmtSZWdpb24oRG9tVHJlZU5vZGUgKiwgQWxpYXNBbmFseXNpcyAqLCBMb29wSW5mbyAqLCBEb21pbmF0b3JUcmVlICosCisgICAgICAgICAgICAgICAgVGFyZ2V0TGlicmFyeUluZm8gKiwgVGFyZ2V0VHJhbnNmb3JtSW5mbyAqLCBMb29wICosCisgICAgICAgICAgICAgICAgQWxpYXNTZXRUcmFja2VyICosIExvb3BTYWZldHlJbmZvICosCisgICAgICAgICAgICAgICAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAqT1JFKTsKKworLy8vIFxicmllZiBXYWxrIHRoZSBzcGVjaWZpZWQgcmVnaW9uIG9mIHRoZSBDRkcgKGRlZmluZWQgYnkgYWxsIGJsb2NrcworLy8vIGRvbWluYXRlZCBieSB0aGUgc3BlY2lmaWVkIGJsb2NrLCBhbmQgdGhhdCBhcmUgaW4gdGhlIGN1cnJlbnQgbG9vcCkgaW4gZGVwdGgKKy8vLyBmaXJzdCBvcmRlciB3LnIudCB0aGUgRG9taW5hdG9yVHJlZS4gIFRoaXMgYWxsb3dzIHVzIHRvIHZpc2l0IGRlZmluaXRpb25zCisvLy8gYmVmb3JlIHVzZXMsIGFsbG93aW5nIHVzIHRvIGhvaXN0IGEgbG9vcCBib2R5IGluIG9uZSBwYXNzIHdpdGhvdXQgaXRlcmF0aW9uLgorLy8vIFRha2VzIERvbVRyZWVOb2RlLCBBbGlhc0FuYWx5c2lzLCBMb29wSW5mbywgRG9taW5hdG9yVHJlZSwgRGF0YUxheW91dCwKKy8vLyBUYXJnZXRMaWJyYXJ5SW5mbywgTG9vcCwgQWxpYXNTZXQgaW5mb3JtYXRpb24gZm9yIGFsbCBpbnN0cnVjdGlvbnMgb2YgdGhlCisvLy8gbG9vcCBhbmQgbG9vcCBzYWZldHkgaW5mb3JtYXRpb24gYXMgYXJndW1lbnRzLiBEaWFnbm9zdGljcyBpcyBlbWl0dGVkIHZpYSBccAorLy8vIE9SRS4gSXQgcmV0dXJucyBjaGFuZ2VkIHN0YXR1cy4KK2Jvb2wgaG9pc3RSZWdpb24oRG9tVHJlZU5vZGUgKiwgQWxpYXNBbmFseXNpcyAqLCBMb29wSW5mbyAqLCBEb21pbmF0b3JUcmVlICosCisgICAgICAgICAgICAgICAgIFRhcmdldExpYnJhcnlJbmZvICosIExvb3AgKiwgQWxpYXNTZXRUcmFja2VyICosCisgICAgICAgICAgICAgICAgIExvb3BTYWZldHlJbmZvICosIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgKk9SRSk7CisKKy8vLyBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgZGVhZCBsb29wcy4gVGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvCisvLy8gZ3VhcmFudGVlIHRoYXQgdGhlIGxvb3AgaXMgaW5mYWN0IGRlYWQuCisvLy8gVGhlIGZ1bmN0aW9uIHJlcXVpcmVzIGEgYnVuY2ggb3IgcHJlcmVxdWlzaXRlcyB0byBiZSBwcmVzZW50OgorLy8vICAgLSBUaGUgbG9vcCBuZWVkcyB0byBiZSBpbiBMQ1NTQSBmb3JtCisvLy8gICAtIFRoZSBsb29wIG5lZWRzIHRvIGhhdmUgYSBQcmVoZWFkZXIKKy8vLyAgIC0gQSB1bmlxdWUgZGVkaWNhdGVkIGV4aXQgYmxvY2sgbXVzdCBleGlzdAorLy8vCisvLy8gVGhpcyBhbHNvIHVwZGF0ZXMgdGhlIHJlbGV2YW50IGFuYWx5c2lzIGluZm9ybWF0aW9uIGluIFxwIERULCBccCBTRSwgYW5kIFxwCisvLy8gTEkgaWYgcG9pbnRlcnMgdG8gdGhvc2UgYXJlIHByb3ZpZGVkLgorLy8vIEl0IGFsc28gdXBkYXRlcyB0aGUgbG9vcCBQTSBpZiBhbiB1cGRhdGVyIHN0cnVjdCBpcyBwcm92aWRlZC4KKwordm9pZCBkZWxldGVEZWFkTG9vcChMb29wICpMLCBEb21pbmF0b3JUcmVlICpEVCwgU2NhbGFyRXZvbHV0aW9uICpTRSwKKyAgICAgICAgICAgICAgICAgICAgTG9vcEluZm8gKkxJKTsKKworLy8vIFxicmllZiBUcnkgdG8gcHJvbW90ZSBtZW1vcnkgdmFsdWVzIHRvIHNjYWxhcnMgYnkgc2lua2luZyBzdG9yZXMgb3V0IG9mCisvLy8gdGhlIGxvb3AgYW5kIG1vdmluZyBsb2FkcyB0byBiZWZvcmUgdGhlIGxvb3AuICBXZSBkbyB0aGlzIGJ5IGxvb3Bpbmcgb3ZlcgorLy8vIHRoZSBzdG9yZXMgaW4gdGhlIGxvb3AsIGxvb2tpbmcgZm9yIHN0b3JlcyB0byBNdXN0IHBvaW50ZXJzIHdoaWNoIGFyZQorLy8vIGxvb3AgaW52YXJpYW50LiBJdCB0YWtlcyBhIHNldCBvZiBtdXN0LWFsaWFzIHZhbHVlcywgTG9vcCBleGl0IGJsb2NrcworLy8vIHZlY3RvciwgbG9vcCBleGl0IGJsb2NrcyBpbnNlcnRpb24gcG9pbnQgdmVjdG9yLCBQcmVkSXRlcmF0b3JDYWNoZSwKKy8vLyBMb29wSW5mbywgRG9taW5hdG9yVHJlZSwgTG9vcCwgQWxpYXNTZXQgaW5mb3JtYXRpb24gZm9yIGFsbCBpbnN0cnVjdGlvbnMKKy8vLyBvZiB0aGUgbG9vcCBhbmQgbG9vcCBzYWZldHkgaW5mb3JtYXRpb24gYXMgYXJndW1lbnRzLgorLy8vIERpYWdub3N0aWNzIGlzIGVtaXR0ZWQgdmlhIFxwIE9SRS4gSXQgcmV0dXJucyBjaGFuZ2VkIHN0YXR1cy4KK2Jvb2wgcHJvbW90ZUxvb3BBY2Nlc3Nlc1RvU2NhbGFycyhjb25zdCBTbWFsbFNldFZlY3RvcjxWYWx1ZSAqLCA4PiAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxCYXNpY0Jsb2NrICo+ICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uICo+ICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZEl0ZXJhdG9yQ2FjaGUgJiwgTG9vcEluZm8gKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICosIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcCAqLCBBbGlhc1NldFRyYWNrZXIgKiwgTG9vcFNhZmV0eUluZm8gKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICopOworCisvLy8gRG9lcyBhIEJGUyBmcm9tIGEgZ2l2ZW4gbm9kZSB0byBhbGwgb2YgaXRzIGNoaWxkcmVuIGluc2lkZSBhIGdpdmVuIGxvb3AuCisvLy8gVGhlIHJldHVybmVkIHZlY3RvciBvZiBub2RlcyBpbmNsdWRlcyB0aGUgc3RhcnRpbmcgcG9pbnQuCitTbWFsbFZlY3RvcjxEb21UcmVlTm9kZSAqLCAxNj4gY29sbGVjdENoaWxkcmVuSW5Mb29wKERvbVRyZWVOb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpDdXJMb29wKTsKKworLy8vIFxicmllZiBSZXR1cm5zIHRoZSBpbnN0cnVjdGlvbnMgdGhhdCB1c2UgdmFsdWVzIGRlZmluZWQgaW4gdGhlIGxvb3AuCitTbWFsbFZlY3RvcjxJbnN0cnVjdGlvbiAqLCA4PiBmaW5kRGVmc1VzZWRPdXRzaWRlT2ZMb29wKExvb3AgKkwpOworCisvLy8gXGJyaWVmIEZpbmQgc3RyaW5nIG1ldGFkYXRhIGZvciBsb29wCisvLy8KKy8vLyBJZiBpdCBoYXMgYSB2YWx1ZSAoZS5nLiB7Imxsdm0uZGlzdHJpYnV0ZSIsIDF9IHJldHVybiB0aGUgdmFsdWUgYXMgYW4KKy8vLyBvcGVyYW5kIG9yIG51bGwgb3RoZXJ3aXNlLiAgSWYgdGhlIHN0cmluZyBtZXRhZGF0YSBpcyBub3QgZm91bmQgcmV0dXJuCisvLy8gT3B0aW9uYWwncyBub3QtYS12YWx1ZS4KK09wdGlvbmFsPGNvbnN0IE1ET3BlcmFuZCAqPiBmaW5kU3RyaW5nTWV0YWRhdGFGb3JMb29wKExvb3AgKlRoZUxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSk7CisKKy8vLyBcYnJpZWYgU2V0IGlucHV0IHN0cmluZyBpbnRvIGxvb3AgbWV0YWRhdGEgYnkga2VlcGluZyBvdGhlciB2YWx1ZXMgaW50YWN0Lgordm9pZCBhZGRTdHJpbmdNZXRhZGF0YVRvTG9vcChMb29wICpUaGVMb29wLCBjb25zdCBjaGFyICpNRFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgViA9IDApOworCisvLy8gXGJyaWVmIEdldCBhIGxvb3AncyBlc3RpbWF0ZWQgdHJpcCBjb3VudCBiYXNlZCBvbiBicmFuY2ggd2VpZ2h0IG1ldGFkYXRhLgorLy8vIFJldHVybnMgMCB3aGVuIHRoZSBjb3VudCBpcyBlc3RpbWF0ZWQgdG8gYmUgMCwgb3IgTm9uZSB3aGVuIGEgbWVhbmluZ2Z1bAorLy8vIGVzdGltYXRlIGNhbiBub3QgYmUgbWFkZS4KK09wdGlvbmFsPHVuc2lnbmVkPiBnZXRMb29wRXN0aW1hdGVkVHJpcENvdW50KExvb3AgKkwpOworCisvLy8gSGVscGVyIHRvIGNvbnNpc3RlbnRseSBhZGQgdGhlIHNldCBvZiBzdGFuZGFyZCBwYXNzZXMgdG8gYSBsb29wIHBhc3MncyBcYworLy8vIEFuYWx5c2lzVXNhZ2UuCisvLy8KKy8vLyBBbGwgbG9vcCBwYXNzZXMgc2hvdWxkIGNhbGwgdGhpcyBhcyBwYXJ0IG9mIGltcGxlbWVudGluZyB0aGVpciBcYworLy8vIGdldEFuYWx5c2lzVXNhZ2UuCit2b2lkIGdldExvb3BBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKTsKKworLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgaG9pc3RlciBhbmQgc2lua2VyIGNhbiBoYW5kbGUgdGhpcyBpbnN0cnVjdGlvbi4KKy8vLyBJZiBTYWZldHlJbmZvIGlzIG51bGwsIHdlIGFyZSBjaGVja2luZyBmb3Igc2lua2luZyBpbnN0cnVjdGlvbnMgZnJvbQorLy8vIHByZWhlYWRlciB0byBsb29wIGJvZHkgKG5vIHNwZWN1bGF0aW9uKS4KKy8vLyBJZiBTYWZldHlJbmZvIGlzIG5vdCBudWxsLCB3ZSBhcmUgY2hlY2tpbmcgZm9yIGhvaXN0aW5nL3NpbmtpbmcKKy8vLyBpbnN0cnVjdGlvbnMgZnJvbSBsb29wIGJvZHkgdG8gcHJlaGVhZGVyL2V4aXQuIENoZWNrIGlmIHRoZSBpbnN0cnVjdGlvbgorLy8vIGNhbiBleGVjdXRlIHNwZWN1bGF0aXZlbHkuCisvLy8gSWYgXHAgT1JFIGlzIHNldCB1c2UgaXQgdG8gZW1pdCBvcHRpbWl6YXRpb24gcmVtYXJrcy4KK2Jvb2wgY2FuU2lua09ySG9pc3RJbnN0KEluc3RydWN0aW9uICZJLCBBQVJlc3VsdHMgKkFBLCBEb21pbmF0b3JUcmVlICpEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3AgKkN1ckxvb3AsIEFsaWFzU2V0VHJhY2tlciAqQ3VyQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgTG9vcFNhZmV0eUluZm8gKlNhZmV0eUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICpPUkUgPSBudWxscHRyKTsKKworLy8vIEdlbmVyYXRlcyBhIHZlY3RvciByZWR1Y3Rpb24gdXNpbmcgc2h1ZmZsZXZlY3RvcnMgdG8gcmVkdWNlIHRoZSB2YWx1ZS4KK1ZhbHVlICpnZXRTaHVmZmxlUmVkdWN0aW9uKElSQnVpbGRlcjw+ICZCdWlsZGVyLCBWYWx1ZSAqU3JjLCB1bnNpZ25lZCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3VycmVuY2VEZXNjcmlwdG9yOjpNaW5NYXhSZWN1cnJlbmNlS2luZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbk1heEtpbmQgPSBSZWN1cnJlbmNlRGVzY3JpcHRvcjo6TVJLX0ludmFsaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBSZWRPcHMgPSBBcnJheVJlZjxWYWx1ZSAqPigpKTsKKworLy8vIENyZWF0ZSBhIHRhcmdldCByZWR1Y3Rpb24gb2YgdGhlIGdpdmVuIHZlY3Rvci4gVGhlIHJlZHVjdGlvbiBvcGVyYXRpb24KKy8vLyBpcyBkZXNjcmliZWQgYnkgdGhlIFxwIE9wY29kZSBwYXJhbWV0ZXIuIG1pbi9tYXggcmVkdWN0aW9ucyByZXF1aXJlCisvLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBzdXBwbGllZCBpbiBccCBGbGFncy4KKy8vLyBUaGUgdGFyZ2V0IGlzIHF1ZXJpZWQgdG8gZGV0ZXJtaW5lIGlmIGludHJpbnNpY3Mgb3Igc2h1ZmZsZSBzZXF1ZW5jZXMgYXJlCisvLy8gcmVxdWlyZWQgdG8gaW1wbGVtZW50IHRoZSByZWR1Y3Rpb24uCitWYWx1ZSAqCitjcmVhdGVTaW1wbGVUYXJnZXRSZWR1Y3Rpb24oSVJCdWlsZGVyPD4gJkIsIGNvbnN0IFRhcmdldFRyYW5zZm9ybUluZm8gKlRUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcGNvZGUsIFZhbHVlICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0VHJhbnNmb3JtSW5mbzo6UmVkdWN0aW9uRmxhZ3MgRmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpSZWR1Y3Rpb25GbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IFJlZE9wcyA9IEFycmF5UmVmPFZhbHVlICo+KCkpOworCisvLy8gQ3JlYXRlIGEgZ2VuZXJpYyB0YXJnZXQgcmVkdWN0aW9uIHVzaW5nIGEgcmVjdXJyZW5jZSBkZXNjcmlwdG9yIFxwIERlc2MKKy8vLyBUaGUgdGFyZ2V0IGlzIHF1ZXJpZWQgdG8gZGV0ZXJtaW5lIGlmIGludHJpbnNpY3Mgb3Igc2h1ZmZsZSBzZXF1ZW5jZXMgYXJlCisvLy8gcmVxdWlyZWQgdG8gaW1wbGVtZW50IHRoZSByZWR1Y3Rpb24uCitWYWx1ZSAqY3JlYXRlVGFyZ2V0UmVkdWN0aW9uKElSQnVpbGRlcjw+ICZCLCBjb25zdCBUYXJnZXRUcmFuc2Zvcm1JbmZvICpUVEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3VycmVuY2VEZXNjcmlwdG9yICZEZXNjLCBWYWx1ZSAqU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE5vTmFOID0gZmFsc2UpOworCisvLy8gR2V0IHRoZSBpbnRlcnNlY3Rpb24gKGxvZ2ljYWwgYW5kKSBvZiBhbGwgb2YgdGhlIHBvdGVudGlhbCBJUiBmbGFncworLy8vIG9mIGVhY2ggc2NhbGFyIG9wZXJhdGlvbiAoVkwpIHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhIHZlY3RvciAoSSkuCisvLy8gSWYgT3BWYWx1ZSBpcyBub24tbnVsbCwgd2Ugb25seSBjb25zaWRlciBvcGVyYXRpb25zIHNpbWlsYXIgdG8gT3BWYWx1ZQorLy8vIHdoZW4gaW50ZXJzZWN0aW5nLgorLy8vIEZsYWcgc2V0OiBOU1csIE5VVywgZXhhY3QsIGFuZCBhbGwgb2YgZmFzdC1tYXRoLgordm9pZCBwcm9wYWdhdGVJUkZsYWdzKFZhbHVlICpJLCBBcnJheVJlZjxWYWx1ZSAqPiBWTCwgVmFsdWUgKk9wVmFsdWUgPSBudWxscHRyKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19MT09QVVRJTFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvb3BWZXJzaW9uaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTG9vcFZlcnNpb25pbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTVkNzg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvb3BWZXJzaW9uaW5nLmgKQEAgLTAsMCArMSwxNTIgQEAKKy8vPT09LSBMb29wVmVyc2lvbmluZy5oIC0gVXRpbGl0eSB0byB2ZXJzaW9uIGEgbG9vcCAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSB1dGlsaXR5IGNsYXNzIHRvIHBlcmZvcm0gbG9vcCB2ZXJzaW9uaW5nLiAgVGhlIHZlcnNpb25lZAorLy8gbG9vcCBzcGVjdWxhdGVzIHRoYXQgb3RoZXJ3aXNlIG1heS1hbGlhc2luZyBtZW1vcnkgYWNjZXNzZXMgZG9uJ3Qgb3ZlcmxhcCBhbmQKKy8vIGVtaXRzIGNoZWNrcyB0byBwcm92ZSB0aGlzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xPT1BWRVJTSU9OSU5HX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xPT1BWRVJTSU9OSU5HX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcEFjY2Vzc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvTG9vcFV0aWxzLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1ZhbHVlTWFwcGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTG9vcDsKK2NsYXNzIExvb3BBY2Nlc3NJbmZvOworY2xhc3MgTG9vcEluZm87CitjbGFzcyBTY2FsYXJFdm9sdXRpb247CisKKy8vLyBcYnJpZWYgVGhpcyBjbGFzcyBlbWl0cyBhIHZlcnNpb24gb2YgdGhlIGxvb3Agd2hlcmUgcnVuLXRpbWUgY2hlY2tzIGVuc3VyZQorLy8vIHRoYXQgbWF5LWFsaWFzIHBvaW50ZXJzIGNhbid0IG92ZXJsYXAuCisvLy8KKy8vLyBJdCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBzaW5nbGUtZXhpdCBsb29wcyBhbmQgYXNzdW1lcyB0aGF0IHRoZSBsb29wCisvLy8gYWxyZWFkeSBoYXMgYSBwcmVoZWFkZXIuCitjbGFzcyBMb29wVmVyc2lvbmluZyB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgRXhwZWN0cyBMb29wQWNjZXNzSW5mbywgTG9vcCwgTG9vcEluZm8sIERvbWluYXRvclRyZWUgYXMgaW5wdXQuCisgIC8vLyBJdCB1c2VzIHJ1bnRpbWUgY2hlY2sgcHJvdmlkZWQgYnkgdGhlIHVzZXIuIElmIFxwIFVzZUxBSUNoZWNrcyBpcyB0cnVlLAorICAvLy8gd2Ugd2lsbCByZXRhaW4gdGhlIGRlZmF1bHQgY2hlY2tzIG1hZGUgYnkgTEFJLiBPdGhlcndpc2UsIGNvbnN0cnVjdCBhbgorICAvLy8gb2JqZWN0IGhhdmluZyBubyBjaGVja3MgYW5kIHdlIGV4cGVjdCB0aGUgdXNlciB0byBhZGQgdGhlbS4KKyAgTG9vcFZlcnNpb25pbmcoY29uc3QgTG9vcEFjY2Vzc0luZm8gJkxBSSwgTG9vcCAqTCwgTG9vcEluZm8gKkxJLAorICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICpEVCwgU2NhbGFyRXZvbHV0aW9uICpTRSwKKyAgICAgICAgICAgICAgICAgYm9vbCBVc2VMQUlDaGVja3MgPSB0cnVlKTsKKworICAvLy8gXGJyaWVmIFBlcmZvcm1zIHRoZSBDRkcgbWFuaXB1bGF0aW9uIHBhcnQgb2YgdmVyc2lvbmluZyB0aGUgbG9vcCBpbmNsdWRpbmcKKyAgLy8vIHRoZSBEb21pbmF0b3JUcmVlIGFuZCBMb29wSW5mbyB1cGRhdGVzLgorICAvLy8KKyAgLy8vIFRoZSBsb29wIHRoYXQgd2FzIHVzZWQgdG8gY29uc3RydWN0IHRoZSBjbGFzcyB3aWxsIGJlIHRoZSAidmVyc2lvbmVkIiBsb29wCisgIC8vLyBpLmUuIHRoZSBsb29wIHRoYXQgd2lsbCByZWNlaXZlIGNvbnRyb2wgaWYgYWxsIHRoZSBtZW1jaGVja3MgcGFzcy4KKyAgLy8vCisgIC8vLyBUaGlzIGFsbG93cyB0aGUgbG9vcCB0cmFuc2Zvcm0gcGFzcyB0byBvcGVyYXRlIG9uIHRoZSBzYW1lIGxvb3AgcmVnYXJkbGVzcworICAvLy8gb2Ygd2hldGhlciB2ZXJzaW9uaW5nIHdhcyBuZWNlc3Nhcnkgb3Igbm90OgorICAvLy8KKyAgLy8vICAgIGZvciBlYWNoIGxvb3AgTDoKKyAgLy8vICAgICAgICBhbmFseXplIEwKKyAgLy8vICAgICAgICBpZiB2ZXJzaW9uaW5nIGlzIG5lY2Vzc2FyeSB2ZXJzaW9uIEwKKyAgLy8vICAgICAgICB0cmFuc2Zvcm0gTAorICB2b2lkIHZlcnNpb25Mb29wKCkgeyB2ZXJzaW9uTG9vcChmaW5kRGVmc1VzZWRPdXRzaWRlT2ZMb29wKFZlcnNpb25lZExvb3ApKTsgfQorCisgIC8vLyBcYnJpZWYgU2FtZSBidXQgaWYgdGhlIGNsaWVudCBoYXMgYWxyZWFkeSBwcmVjb21wdXRlZCB0aGUgc2V0IG9mIHZhbHVlcworICAvLy8gdXNlZCBvdXRzaWRlIHRoZSBsb29wLCB0aGlzIEFQSSB3aWxsIGFsbG93cyBwYXNzaW5nIHRoYXQuCisgIHZvaWQgdmVyc2lvbkxvb3AoY29uc3QgU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uICo+ICZEZWZzVXNlZE91dHNpZGUpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgdmVyc2lvbmVkIGxvb3AuICBDb250cm9sIGZsb3dzIGhlcmUgaWYgcG9pbnRlcnMgaW4gdGhlCisgIC8vLyBsb29wIGRvbid0IGFsaWFzIChpLmUuIGFsbCBtZW1jaGVja3MgcGFzc2VkKS4gIChUaGlzIGxvb3AgaXMgYWN0dWFsbHkgdGhlCisgIC8vLyBzYW1lIGFzIHRoZSBvcmlnaW5hbCBsb29wIHRoYXQgd2UgZ290IGNvbnN0cnVjdGVkIHdpdGguKQorICBMb29wICpnZXRWZXJzaW9uZWRMb29wKCkgeyByZXR1cm4gVmVyc2lvbmVkTG9vcDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZmFsbC1iYWNrIGxvb3AuICBDb250cm9sIGZsb3dzIGhlcmUgaWYgcG9pbnRlcnMgaW4gdGhlCisgIC8vLyBsb29wIG1heSBhbGlhcyAoaS5lLiBvbmUgb2YgdGhlIG1lbWNoZWNrcyBmYWlsZWQpLgorICBMb29wICpnZXROb25WZXJzaW9uZWRMb29wKCkgeyByZXR1cm4gTm9uVmVyc2lvbmVkTG9vcDsgfQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgcnVudGltZSBhbGlhcyBjaGVja3MgZm9yIHZlcnNpb25pbmcgdGhlIGxvb3AuCisgIHZvaWQgc2V0QWxpYXNDaGVja3MoCisgICAgICBTbWFsbFZlY3RvcjxSdW50aW1lUG9pbnRlckNoZWNraW5nOjpQb2ludGVyQ2hlY2ssIDQ+IENoZWNrcyk7CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBydW50aW1lIFNDRVYgY2hlY2tzIGZvciB2ZXJzaW9uaW5nIHRoZSBsb29wLgorICB2b2lkIHNldFNDRVZDaGVja3MoU0NFVlVuaW9uUHJlZGljYXRlIENoZWNrKTsKKworICAvLy8gXGJyaWVmIEFubm90YXRlIG1lbW9yeSBpbnN0cnVjdGlvbnMgaW4gdGhlIHZlcnNpb25lZCBsb29wIHdpdGggbm8tYWxpYXMKKyAgLy8vIG1ldGFkYXRhIGJhc2VkIG9uIHRoZSBtZW1jaGVja3MgaXNzdWVkLgorICAvLy8KKyAgLy8vIFRoaXMgaXMganVzdCB3cmFwcGVyIHRoYXQgY2FsbHMgcHJlcGFyZU5vQWxpYXNNZXRhZGF0YSBhbmQKKyAgLy8vIGFubm90YXRlSW5zdFdpdGhOb0FsaWFzIG9uIHRoZSBpbnN0cnVjdGlvbnMgb2YgdGhlIHZlcnNpb25lZCBsb29wLgorICB2b2lkIGFubm90YXRlTG9vcFdpdGhOb0FsaWFzKCk7CisKKyAgLy8vIFxicmllZiBTZXQgdXAgdGhlIGFsaWFzaW5nIHNjb3BlcyBiYXNlZCBvbiB0aGUgbWVtY2hlY2tzLiAgVGhpcyBuZWVkcyB0bworICAvLy8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCB0byBhbm5vdGF0ZUluc3RXaXRoTm9BbGlhcy4KKyAgdm9pZCBwcmVwYXJlTm9BbGlhc01ldGFkYXRhKCk7CisKKyAgLy8vIFxicmllZiBBZGQgdGhlIG5vYWxpYXMgYW5ub3RhdGlvbnMgdG8gXHAgVmVyc2lvbmVkSW5zdC4KKyAgLy8vCisgIC8vLyBccCBPcmlnSW5zdCBpcyB0aGUgaW5zdHJ1Y3Rpb24gY29ycmVzcG9uZGluZyB0byBccCBWZXJzaW9uZWRJbnN0IGluIHRoZQorICAvLy8gb3JpZ2luYWwgbG9vcC4gIEluaXRpYWxpemUgdGhlIGFsaWFzaW5nIHNjb3BlcyB3aXRoCisgIC8vLyBwcmVwYXJlTm9BbGlhc01ldGFkYXRhIG9uY2UgYmVmb3JlIHRoaXMgY2FuIGJlIGNhbGxlZC4KKyAgdm9pZCBhbm5vdGF0ZUluc3RXaXRoTm9BbGlhcyhJbnN0cnVjdGlvbiAqVmVyc2lvbmVkSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqT3JpZ0luc3QpOworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIEFkZHMgdGhlIG5lY2Vzc2FyeSBQSEkgbm9kZXMgZm9yIHRoZSB2ZXJzaW9uZWQgbG9vcHMgYmFzZWQgb24gdGhlCisgIC8vLyBsb29wLWRlZmluZWQgdmFsdWVzIHVzZWQgb3V0c2lkZSBvZiB0aGUgbG9vcC4KKyAgLy8vCisgIC8vLyBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBhZnRlciB2ZXJzaW9uTG9vcCBpZiB0aGVyZSBhcmUgZGVmcyBpbiB0aGUgbG9vcAorICAvLy8gdGhhdCBhcmUgdXNlZCBvdXRzaWRlIHRoZSBsb29wLgorICB2b2lkIGFkZFBISU5vZGVzKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbiAqPiAmRGVmc1VzZWRPdXRzaWRlKTsKKworICAvLy8gXGJyaWVmIEFkZCB0aGUgbm9hbGlhcyBhbm5vdGF0aW9ucyB0byBccCBJLiAgSW5pdGlhbGl6ZSB0aGUgYWxpYXNpbmcKKyAgLy8vIHNjb3BlcyB3aXRoIHByZXBhcmVOb0FsaWFzTWV0YWRhdGEgb25jZSBiZWZvcmUgdGhpcyBjYW4gYmUgY2FsbGVkLgorICB2b2lkIGFubm90YXRlSW5zdFdpdGhOb0FsaWFzKEluc3RydWN0aW9uICpJKSB7CisgICAgYW5ub3RhdGVJbnN0V2l0aE5vQWxpYXMoSSwgSSk7CisgIH0KKworICAvLy8gXGJyaWVmIFRoZSBvcmlnaW5hbCBsb29wLiAgVGhpcyBiZWNvbWVzIHRoZSAidmVyc2lvbmVkIiBvbmUuICBJLmUuLAorICAvLy8gY29udHJvbCBmbG93cyBoZXJlIGlmIHBvaW50ZXJzIGluIHRoZSBsb29wIGRvbid0IGFsaWFzLgorICBMb29wICpWZXJzaW9uZWRMb29wOworICAvLy8gXGJyaWVmIFRoZSBmYWxsLWJhY2sgbG9vcC4gIEkuZS4gY29udHJvbCBmbG93cyBoZXJlIGlmIHBvaW50ZXJzIGluIHRoZQorICAvLy8gbG9vcCBtYXkgYWxpYXMgKG1lbWNoZWNrcyBmYWlsZWQpLgorICBMb29wICpOb25WZXJzaW9uZWRMb29wOworCisgIC8vLyBcYnJpZWYgVGhpcyBtYXBzIHRoZSBpbnN0cnVjdGlvbnMgZnJvbSBWZXJzaW9uZWRMb29wIHRvIHRoZWlyIGNvdW50ZXJwYXJ0CisgIC8vLyBpbiBOb25WZXJzaW9uZWRMb29wLgorICBWYWx1ZVRvVmFsdWVNYXBUeSBWTWFwOworCisgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiBhbGlhcyBjaGVja3MgdGhhdCB3ZSBhcmUgdmVyc2lvbmluZyBmb3IuCisgIFNtYWxsVmVjdG9yPFJ1bnRpbWVQb2ludGVyQ2hlY2tpbmc6OlBvaW50ZXJDaGVjaywgND4gQWxpYXNDaGVja3M7CisKKyAgLy8vIFxicmllZiBUaGUgc2V0IG9mIFNDRVYgY2hlY2tzIHRoYXQgd2UgYXJlIHZlcnNpb25pbmcgZm9yLgorICBTQ0VWVW5pb25QcmVkaWNhdGUgUHJlZHM7CisKKyAgLy8vIFxicmllZiBNYXBzIGEgcG9pbnRlciB0byB0aGUgcG9pbnRlciBjaGVja2luZyBncm91cCB0aGF0IHRoZSBwb2ludGVyCisgIC8vLyBiZWxvbmdzIHRvLgorICBEZW5zZU1hcDxjb25zdCBWYWx1ZSAqLCBjb25zdCBSdW50aW1lUG9pbnRlckNoZWNraW5nOjpDaGVja2luZ1B0ckdyb3VwICo+CisgICAgICBQdHJUb0dyb3VwOworCisgIC8vLyBcYnJpZWYgVGhlIGFsaWFzIHNjb3BlIGNvcnJlc3BvbmRpbmcgdG8gYSBwb2ludGVyIGNoZWNraW5nIGdyb3VwLgorICBEZW5zZU1hcDxjb25zdCBSdW50aW1lUG9pbnRlckNoZWNraW5nOjpDaGVja2luZ1B0ckdyb3VwICosIE1ETm9kZSAqPgorICAgICAgR3JvdXBUb1Njb3BlOworCisgIC8vLyBcYnJpZWYgVGhlIGxpc3Qgb2YgYWxpYXMgc2NvcGVzIHRoYXQgYSBwb2ludGVyIGNoZWNraW5nIGdyb3VwIGNhbid0IGFsaWFzLgorICBEZW5zZU1hcDxjb25zdCBSdW50aW1lUG9pbnRlckNoZWNraW5nOjpDaGVja2luZ1B0ckdyb3VwICosIE1ETm9kZSAqPgorICAgICAgR3JvdXBUb05vbkFsaWFzaW5nU2NvcGVMaXN0OworCisgIC8vLyBcYnJpZWYgQW5hbHlzZXMgdXNlZC4KKyAgY29uc3QgTG9vcEFjY2Vzc0luZm8gJkxBSTsKKyAgTG9vcEluZm8gKkxJOworICBEb21pbmF0b3JUcmVlICpEVDsKKyAgU2NhbGFyRXZvbHV0aW9uICpTRTsKK307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvd2VySW52b2tlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTG93ZXJJbnZva2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjc3NGM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvd2VySW52b2tlLmgKQEAgLTAsMCArMSwzMCBAQAorLy89PT0tIExvd2VySW52b2tlLmggLSBFbGltaW5hdGUgSW52b2tlIGluc3RydWN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHRyYW5zZm9ybWF0aW9uIGlzIGRlc2lnbmVkIGZvciB1c2UgYnkgY29kZSBnZW5lcmF0b3JzIHdoaWNoIGRvIG5vdCB5ZXQKKy8vIHN1cHBvcnQgc3RhY2sgdW53aW5kaW5nLiAgVGhpcyBwYXNzIGNvbnZlcnRzICdpbnZva2UnIGluc3RydWN0aW9ucyB0byAnY2FsbCcKKy8vIGluc3RydWN0aW9ucywgc28gdGhhdCBhbnkgZXhjZXB0aW9uLWhhbmRsaW5nICdsYW5kaW5ncGFkJyBibG9ja3MgYmVjb21lIGRlYWQKKy8vIGNvZGUgKHdoaWNoIGNhbiBiZSByZW1vdmVkIGJ5IHJ1bm5pbmcgdGhlICctc2ltcGxpZnljZmcnIHBhc3MgYWZ0ZXJ3YXJkcykuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xPV0VSSU5WT0tFX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xPV0VSSU5WT0tFX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMb3dlckludm9rZVBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMb3dlckludm9rZVBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xPV0VSSU5WT0tFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb3dlck1lbUludHJpbnNpY3MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb3dlck1lbUludHJpbnNpY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjdkMGY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvd2VyTWVtSW50cmluc2ljcy5oCkBAIC0wLDAgKzEsNTYgQEAKKy8vPT09LSBsbHZtL1RyYW5zZm9ybXMvVXRpbHMvTG93ZXJNZW1pbnRyaW5zaWNzLmggLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG93ZXIgbWVtc2V0LCBtZW1jcHksIG1lbW1vdiBpbnRyaW5zaWNzIHRvIGxvb3BzIChlLmcuIGZvciB0YXJnZXRzIHdpdGhvdXQKKy8vIGxpYnJhcnkgc3VwcG9ydCkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTE9XRVJNRU1JTlRSSU5TSUNTX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xPV0VSTUVNSU5UUklOU0lDU19ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ29uc3RhbnRJbnQ7CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIE1lbUNweUluc3Q7CitjbGFzcyBNZW1Nb3ZlSW5zdDsKK2NsYXNzIE1lbVNldEluc3Q7CitjbGFzcyBUYXJnZXRUcmFuc2Zvcm1JbmZvOworY2xhc3MgVmFsdWU7CisKKy8vLyBFbWl0IGEgbG9vcCBpbXBsZW1lbnRpbmcgdGhlIHNlbWFudGljcyBvZiBsbHZtLm1lbWNweSB3aGVyZSB0aGUgc2l6ZSBpcyBub3QKKy8vLyBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4gTG9vcCB3aWxsIGJlIGluc3RlcnRlZCBhdCBccCBJbnNlcnRCZWZvcmUuCit2b2lkIGNyZWF0ZU1lbUNweUxvb3BVbmtub3duU2l6ZShJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlLCBWYWx1ZSAqU3JjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpEc3RBZGRyLCBWYWx1ZSAqQ29weUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY0FsaWduLCB1bnNpZ25lZCBEZXN0QWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNyY0lzVm9sYXRpbGUsIGJvb2wgRHN0SXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFRyYW5zZm9ybUluZm8gJlRUSSk7CisKKy8vLyBFbWl0IGEgbG9vcCBpbXBsZW1lbnRpbmcgdGhlIHNlbWFudGljcyBvZiBhbiBsbHZtLm1lbWNweSB3aG9zZSBzaXplIGlzIGEKKy8vLyBjb21waWxlIHRpbWUgY29uc3RhbnQuIExvb3AgaXMgaW5zZXJ0ZWQgYXQgXHAgSW5zZXJ0QmVmb3JlLgordm9pZCBjcmVhdGVNZW1DcHlMb29wS25vd25TaXplKEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUsIFZhbHVlICpTcmNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpEc3RBZGRyLCBDb25zdGFudEludCAqQ29weUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNBbGlnbiwgdW5zaWduZWQgRGVzdEFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3JjSXNWb2xhdGlsZSwgYm9vbCBEc3RJc1ZvbGF0aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFRyYW5zZm9ybUluZm8gJlRUSSk7CisKKworLy8vIEV4cGFuZCBccCBNZW1DcHkgYXMgYSBsb29wLiBccCBNZW1DcHkgaXMgbm90IGRlbGV0ZWQuCit2b2lkIGV4cGFuZE1lbUNweUFzTG9vcChNZW1DcHlJbnN0ICpNZW1DcHksIGNvbnN0IFRhcmdldFRyYW5zZm9ybUluZm8gJlRUSSk7CisKKy8vLyBFeHBhbmQgXHAgTWVtTW92ZSBhcyBhIGxvb3AuIFxwIE1lbU1vdmUgaXMgbm90IGRlbGV0ZWQuCit2b2lkIGV4cGFuZE1lbU1vdmVBc0xvb3AoTWVtTW92ZUluc3QgKk1lbU1vdmUpOworCisvLy8gRXhwYW5kIFxwIE1lbVNldCBhcyBhIGxvb3AuIFxwIE1lbVNldCBpcyBub3QgZGVsZXRlZC4KK3ZvaWQgZXhwYW5kTWVtU2V0QXNMb29wKE1lbVNldEluc3QgKk1lbVNldCk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL01lbTJSZWcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9NZW0yUmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3Njg0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9NZW0yUmVnLmgKQEAgLTAsMCArMSwzMSBAQAorLy89PT0tIE1lbTJSZWcuaCAtIFRoZSAtbWVtMnJlZyBwYXNzLCBhIHdyYXBwZXIgYXJvdW5kIHRoZSBVdGlscyBsaWIgLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgaXMgYSBzaW1wbGUgcGFzcyB3cmFwcGVyIGFyb3VuZCB0aGUgUHJvbW90ZU1lbVRvUmVnIGZ1bmN0aW9uIGNhbGwKKy8vIGV4cG9zZWQgYnkgdGhlIFV0aWxzIGxpYnJhcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTUVNMlJFR19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19NRU0yUkVHX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKKworY2xhc3MgUHJvbW90ZVBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxQcm9tb3RlUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX01FTTJSRUdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL01vZHVsZVV0aWxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTW9kdWxlVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjliYzgyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL01vZHVsZVV0aWxzLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8vPT09LS0gTW9kdWxlVXRpbHMuaCAtIEZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIE1vZHVsZXMgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmYW1pbHkgb2YgZnVuY3Rpb25zIHBlcmZvcm0gbWFuaXB1bGF0aW9ucyBvbiBNb2R1bGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX01PRFVMRVVUSUxTX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX01PRFVMRVVUSUxTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPHV0aWxpdHk+IC8vIGZvciBzdGQ6OnBhaXIKKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEdsb2JhbFZhbHVlOworY2xhc3MgR2xvYmFsVmFyaWFibGU7CitjbGFzcyBDb25zdGFudDsKK2NsYXNzIFN0cmluZ1JlZjsKK2NsYXNzIFZhbHVlOworY2xhc3MgVHlwZTsKKworLy8vIEFwcGVuZCBGIHRvIHRoZSBsaXN0IG9mIGdsb2JhbCBjdG9ycyBvZiBtb2R1bGUgTSB3aXRoIHRoZSBnaXZlbiBQcmlvcml0eS4KKy8vLyBUaGlzIHdyYXBzIHRoZSBmdW5jdGlvbiBpbiB0aGUgYXBwcm9wcmlhdGUgc3RydWN0dXJlIGFuZCBzdG9yZXMgaXQgYWxvbmcKKy8vLyBzaWRlIG90aGVyIGdsb2JhbCBjb25zdHJ1Y3RvcnMuIEZvciBkZXRhaWxzIHNlZQorLy8vIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xhbmdSZWYuaHRtbCNpbnRnX2dsb2JhbF9jdG9ycwordm9pZCBhcHBlbmRUb0dsb2JhbEN0b3JzKE1vZHVsZSAmTSwgRnVuY3Rpb24gKkYsIGludCBQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqRGF0YSA9IG51bGxwdHIpOworCisvLy8gU2FtZSBhcyBhcHBlbmRUb0dsb2JhbEN0b3JzKCksIGJ1dCBmb3IgZ2xvYmFsIGR0b3JzLgordm9pZCBhcHBlbmRUb0dsb2JhbER0b3JzKE1vZHVsZSAmTSwgRnVuY3Rpb24gKkYsIGludCBQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqRGF0YSA9IG51bGxwdHIpOworCisvLyBWYWxpZGF0ZSB0aGUgcmVzdWx0IG9mIE1vZHVsZTo6Z2V0T3JJbnNlcnRGdW5jdGlvbiBjYWxsZWQgZm9yIGFuIGludGVyZmFjZQorLy8gZnVuY3Rpb24gb2YgZ2l2ZW4gc2FuaXRpemVyLiBJZiB0aGUgaW5zdHJ1bWVudGVkIG1vZHVsZSBkZWZpbmVzIGEgZnVuY3Rpb24KKy8vIHdpdGggdGhlIHNhbWUgbmFtZSwgdGhlaXIgcHJvdG90eXBlcyBtdXN0IG1hdGNoLCBvdGhlcndpc2UKKy8vIGdldE9ySW5zZXJ0RnVuY3Rpb24gcmV0dXJucyBhIGJpdGNhc3QuCitGdW5jdGlvbiAqY2hlY2tTYW5pdGl6ZXJJbnRlcmZhY2VGdW5jdGlvbihDb25zdGFudCAqRnVuY09yQml0Y2FzdCk7CisKK0Z1bmN0aW9uICpkZWNsYXJlU2FuaXRpemVySW5pdEZ1bmN0aW9uKE1vZHVsZSAmTSwgU3RyaW5nUmVmIEluaXROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZSAqPiBJbml0QXJnVHlwZXMpOworCisvLy8gXGJyaWVmIENyZWF0ZXMgc2FuaXRpemVyIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLCBhbmQgY2FsbHMgc2FuaXRpemVyJ3MgaW5pdAorLy8vIGZ1bmN0aW9uIGZyb20gaXQuCisvLy8gXHJldHVybiBSZXR1cm5zIHBhaXIgb2YgcG9pbnRlcnMgdG8gY29uc3RydWN0b3IsIGFuZCBpbml0IGZ1bmN0aW9ucworLy8vIHJlc3BlY3RpdmVseS4KK3N0ZDo6cGFpcjxGdW5jdGlvbiAqLCBGdW5jdGlvbiAqPiBjcmVhdGVTYW5pdGl6ZXJDdG9yQW5kSW5pdEZ1bmN0aW9ucygKKyAgICBNb2R1bGUgJk0sIFN0cmluZ1JlZiBDdG9yTmFtZSwgU3RyaW5nUmVmIEluaXROYW1lLAorICAgIEFycmF5UmVmPFR5cGUgKj4gSW5pdEFyZ1R5cGVzLCBBcnJheVJlZjxWYWx1ZSAqPiBJbml0QXJncywKKyAgICBTdHJpbmdSZWYgVmVyc2lvbkNoZWNrTmFtZSA9IFN0cmluZ1JlZigpKTsKKworLy8vIFJlbmFtZSBhbGwgdGhlIGFub24gZ2xvYmFscyBpbiB0aGUgbW9kdWxlIHVzaW5nIGEgaGFzaCBjb21wdXRlZCBmcm9tCisvLy8gdGhlIGxpc3Qgb2YgcHVibGljIGdsb2JhbHMgaW4gdGhlIG1vZHVsZS4KK2Jvb2wgbmFtZVVuYW1lZEdsb2JhbHMoTW9kdWxlICZNKTsKKworLy8vIFxicmllZiBBZGRzIGdsb2JhbCB2YWx1ZXMgdG8gdGhlIGxsdm0udXNlZCBsaXN0Lgordm9pZCBhcHBlbmRUb1VzZWQoTW9kdWxlICZNLCBBcnJheVJlZjxHbG9iYWxWYWx1ZSAqPiBWYWx1ZXMpOworCisvLy8gXGJyaWVmIEFkZHMgZ2xvYmFsIHZhbHVlcyB0byB0aGUgbGx2bS5jb21waWxlci51c2VkIGxpc3QuCit2b2lkIGFwcGVuZFRvQ29tcGlsZXJVc2VkKE1vZHVsZSAmTSwgQXJyYXlSZWY8R2xvYmFsVmFsdWUgKj4gVmFsdWVzKTsKKworLy8vIEZpbHRlciBvdXQgcG90ZW50aWFsbHkgZGVhZCBjb21kYXQgZnVuY3Rpb25zIHdoZXJlIG90aGVyIGVudHJpZXMga2VlcCB0aGUKKy8vLyBlbnRpcmUgY29tZGF0IGdyb3VwIGFsaXZlLgorLy8vCisvLy8gVGhpcyBpcyBkZXNpZ25lZCBmb3IgY2FzZXMgd2hlcmUgZnVuY3Rpb25zIGFwcGVhciB0byBiZWNvbWUgZGVhZCBidXQgcmVtYWluCisvLy8gYWxpdmUgZHVlIHRvIG90aGVyIGxpdmUgZW50cmllcyBpbiB0aGVpciBjb21kYXQgZ3JvdXAuCisvLy8KKy8vLyBUaGUgXHAgRGVhZENvbWRhdEZ1bmN0aW9ucyBjb250YWluZXIgc2hvdWxkIG9ubHkgaGF2ZSBwb2ludGVycyB0bworLy8vIGBGdW5jdGlvbmBzIHdoaWNoIGFyZSBtZW1iZXJzIG9mIGEgY29tZGF0IGdyb3VwIGFuZCBhcmUgYmVsaWV2ZWQgdG8gYmUKKy8vLyBkZWFkLgorLy8vCisvLy8gQWZ0ZXIgdGhpcyByb3V0aW5lIGZpbmlzaGVzLCB0aGUgb25seSByZW1haW5pbmcgYEZ1bmN0aW9uYHMgaW4gXHAKKy8vLyBEZWFkQ29tZGF0RnVuY3Rpb25zIGFyZSB0aG9zZSB3aGVyZSBldmVyeSBtZW1iZXIgb2YgdGhlIGNvbWRhdCBpcyBsaXN0ZWQKKy8vLyBhbmQgdGh1cyByZW1vdmluZyB0aGVtIGlzIHNhZmUgKHByb3ZpZGVkICphbGwqIGFyZSByZW1vdmVkKS4KK3ZvaWQgZmlsdGVyRGVhZENvbWRhdEZ1bmN0aW9ucygKKyAgICBNb2R1bGUgJk0sIFNtYWxsVmVjdG9ySW1wbDxGdW5jdGlvbiAqPiAmRGVhZENvbWRhdEZ1bmN0aW9ucyk7CisKKy8vLyBcYnJpZWYgUHJvZHVjZSBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIG1vZHVsZSBieSB0YWtpbmcgdGhlIE1ENSBzdW0gb2YKKy8vLyB0aGUgbmFtZXMgb2YgdGhlIG1vZHVsZSdzIHN0cm9uZyBleHRlcm5hbCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBjb21kYXQKKy8vLyBtZW1iZXJzLgorLy8vCisvLy8gVGhpcyBpZGVudGlmaWVyIGlzIG5vcm1hbGx5IGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlLCBvciB0aGUgcHJvZ3JhbSB3b3VsZAorLy8vIGZhaWwgdG8gbGluayBkdWUgdG8gbXVsdGlwbHkgZGVmaW5lZCBzeW1ib2xzLgorLy8vCisvLy8gSWYgdGhlIG1vZHVsZSBoYXMgbm8gc3Ryb25nIGV4dGVybmFsIHN5bWJvbHMgKHN1Y2ggYSBtb2R1bGUgbWF5IHN0aWxsIGhhdmUgYQorLy8vIHNlbWFudGljIGVmZmVjdCBpZiBpdCBwZXJmb3JtcyBnbG9iYWwgaW5pdGlhbGl6YXRpb24pLCB3ZSBjYW5ub3QgcHJvZHVjZSBhCisvLy8gdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgbW9kdWxlLCBzbyB3ZSByZXR1cm4gdGhlIGVtcHR5IHN0cmluZy4KK3N0ZDo6c3RyaW5nIGdldFVuaXF1ZU1vZHVsZUlkKE1vZHVsZSAqTSk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyAgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX01PRFVMRVVUSUxTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9OYW1lQW5vbkdsb2JhbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9OYW1lQW5vbkdsb2JhbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2ZjOTAyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL05hbWVBbm9uR2xvYmFscy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vPT09LS0gTmFtZUFub25HbG9iYWxzLmggLSBBbm9ueW1vdXMgR2xvYmFsIE5hbWluZyBQYXNzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgbmFtaW5nIGFub255bW91cyBnbG9iYWxzIHRvIG1ha2Ugc3VyZSB0aGV5IGNhbiBiZQorLy8gcmVmZXJyZWQgdG8gYnkgVGhpbkxUTy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19OQU1FQU5PTkdMT0JBTFNTX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX05BTUVBTk9OR0xPQkFMU1NfSAorCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFNpbXBsZSBwYXNzIHRoYXQgcHJvdmlkZXMgYSBuYW1lIHRvIGV2ZXJ5IGFub255bW91cyBnbG9iYWxzLgorY2xhc3MgTmFtZUFub25HbG9iYWxQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48TmFtZUFub25HbG9iYWxQYXNzPiB7CitwdWJsaWM6CisgIE5hbWVBbm9uR2xvYmFsUGFzcygpID0gZGVmYXVsdDsKKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTkFNRUFOT05HTE9CQUxTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9PcmRlcmVkSW5zdHJ1Y3Rpb25zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvT3JkZXJlZEluc3RydWN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NWQ0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvT3JkZXJlZEluc3RydWN0aW9ucy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vPT09LSBsbHZtL1RyYW5zZm9ybXMvVXRpbHMvT3JkZXJlZEluc3RydWN0aW9ucy5oIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbiBlZmZpY2llbnQgd2F5IHRvIGNoZWNrIGZvciBkb21pbmFuY2UgcmVsYXRpb24gYmV0d2VlbiAyCisvLyBpbnN0cnVjdGlvbnMuCisvLworLy8gVGhpcyBpbnRlcmZhY2UgZGlzcGF0Y2hlcyB0byBhcHByb3ByaWF0ZSBkb21pbmFuY2UgY2hlY2sgZ2l2ZW4gMgorLy8gaW5zdHJ1Y3Rpb25zLCBpLmUuIGluIGNhc2UgdGhlIGluc3RydWN0aW9ucyBhcmUgaW4gdGhlIHNhbWUgYmFzaWMgYmxvY2ssCisvLyBPcmRlcmVkQmFzaWNCbG9jayAod2l0aCBpbnN0cnVjdGlvbiBudW1iZXJpbmcgYW5kIGNhY2hpbmcpIGFyZSB1c2VkLgorLy8gT3RoZXJ3aXNlLCBkb21pbmF0b3IgdHJlZSBpcyB1c2VkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX09SREVSRURJTlNUUlVDVElPTlNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfT1JERVJFRElOU1RSVUNUSU9OU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvT3JkZXJlZEJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL09wZXJhdG9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgT3JkZXJlZEluc3RydWN0aW9ucyB7CisgIC8vLyBVc2VkIHRvIGNoZWNrIGRvbWluYW5jZSBmb3IgaW5zdHJ1Y3Rpb25zIGluIHNhbWUgYmFzaWMgYmxvY2suCisgIG11dGFibGUgRGVuc2VNYXA8Y29uc3QgQmFzaWNCbG9jayAqLCBzdGQ6OnVuaXF1ZV9wdHI8T3JkZXJlZEJhc2ljQmxvY2s+PgorICAgICAgT0JCTWFwOworCisgIC8vLyBUaGUgZG9taW5hdG9yIHRyZWUgb2YgdGhlIHBhcmVudCBmdW5jdGlvbi4KKyAgRG9taW5hdG9yVHJlZSAqRFQ7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yLgorICBPcmRlcmVkSW5zdHJ1Y3Rpb25zKERvbWluYXRvclRyZWUgKkRUKSA6IERUKERUKSB7fQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBmaXJzdCBpbnN0cnVjdGlvbiBkb21pbmF0ZXMgdGhlIHNlY29uZC4KKyAgYm9vbCBkb21pbmF0ZXMoY29uc3QgSW5zdHJ1Y3Rpb24gKiwgY29uc3QgSW5zdHJ1Y3Rpb24gKikgY29uc3Q7CisKKyAgLy8vIEludmFsaWRhdGUgdGhlIE9yZGVyZWRCYXNpY0Jsb2NrIGNhY2hlIHdoZW4gaXRzIGJhc2ljIGJsb2NrIGNoYW5nZXMuCisgIC8vLyBpLmUuIElmIGFuIGluc3RydWN0aW9uIGlzIGRlbGV0ZWQgb3IgYWRkZWQgdG8gdGhlIGJhc2ljIGJsb2NrLCB0aGUgdXNlcgorICAvLy8gc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBpbnZhbGlkYXRlIHRoZSBPcmRlcmVkQmFzaWNCbG9jayBjYWNoZSBmb3IKKyAgLy8vIHRoaXMgYmFzaWMgYmxvY2suCisgIHZvaWQgaW52YWxpZGF0ZUJsb2NrKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSB7IE9CQk1hcC5lcmFzZShCQik7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfT1JERVJFRElOU1RSVUNUSU9OU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvUHJlZGljYXRlSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1ByZWRpY2F0ZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTUwZjE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1ByZWRpY2F0ZUluZm8uaApAQCAtMCwwICsxLDI5NSBAQAorLy89PT0tIFByZWRpY2F0ZUluZm8uaCAtIEJ1aWxkIFByZWRpY2F0ZUluZm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQysrLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgUHJlZGljYXRlSW5mbyBhbmFseXNpcywgd2hpY2ggY3JlYXRlcyBhbiBFeHRlbmRlZAorLy8vIFNTQSBmb3JtIGZvciBvcGVyYXRpb25zIHVzZWQgaW4gYnJhbmNoIGNvbXBhcmlzb25zIGFuZCBsbHZtLmFzc3VtZQorLy8vIGNvbXBhcmlzb25zLgorLy8vCisvLy8gQ29waWVzIG9mIHRoZXNlIG9wZXJhdGlvbnMgYXJlIGluc2VydGVkIGludG8gdGhlIHRydWUvZmFsc2UgZWRnZSAoYW5kIGFmdGVyCisvLy8gYXNzdW1lcyksIGFuZCBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byB0aGUgY29waWVzLiAgQWxsIHVzZXMgb2YgdGhlIG9yaWdpbmFsCisvLy8gb3BlcmF0aW9uIGluIGJsb2NrcyBkb21pbmF0ZWQgYnkgdGhlIHRydWUvZmFsc2UgZWRnZSAoYW5kIGFzc3VtZSksIGFyZQorLy8vIHJlcGxhY2VkIHdpdGggdXNlcyBvZiB0aGUgY29waWVzLiAgVGhpcyBlbmFibGVzIHBhc3NlcyB0byBlYXNpbHkgYW5kIHNwYXJzZWx5CisvLy8gcHJvcGFnYXRlIGNvbmRpdGlvbiBiYXNlZCBpbmZvIGludG8gdGhlIG9wZXJhdGlvbnMgdGhhdCBtYXkgYmUgYWZmZWN0ZWQuCisvLy8KKy8vLyBFeGFtcGxlOgorLy8vICVjbXAgPSBpY21wIGVxIGkzMiAleCwgNTAKKy8vLyBiciBpMSAlY21wLCBsYWJlbCAldHJ1ZSwgbGFiZWwgJWZhbHNlCisvLy8gdHJ1ZToKKy8vLyByZXQgaTMyICV4CisvLy8gZmFsc2U6CisvLy8gcmV0IGkzMiAxCisvLy8KKy8vLyB3aWxsIGJlY29tZQorLy8vCisvLy8gJWNtcCA9IGljbXAgZXEgaTMyLCAleCwgNTAKKy8vLyBiciBpMSAlY21wLCBsYWJlbCAldHJ1ZSwgbGFiZWwgJWZhbHNlCisvLy8gdHJ1ZToKKy8vLyAleC4wID0gY2FsbCBAbGx2bS5zc2FfY29weS5pMzIoaTMyICV4KQorLy8vIHJldCBpMzIgJXguMAorLy8vIGZhbHNlOgorLy8vIHJldCBpMzIgMQorLy8vCisvLy8gVXNpbmcgZ2V0UHJlZGljYXRlSW5mb0ZvciBvbiB4LjAgd2lsbCBnaXZlIHlvdSB0aGUgY29tcGFyaXNvbiBpdCBpcworLy8vIGRvbWluYXRlZCBieSAodGhlIGljbXApLCBhbmQgdGhhdCB5b3UgYXJlIGxvY2F0ZWQgaW4gdGhlIHRydWUgZWRnZSBvZiB0aGF0CisvLy8gY29tcGFyaXNvbiwgd2hpY2ggdGVsbHMgeW91IHguMCBpcyA1MC4KKy8vLworLy8vIEluIG9yZGVyIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGNvcGllcyBpbnNlcnRlZCwgcHJlZGljYXRlaW5mbyBpcyBvbmx5CisvLy8gaW5zZXJ0ZWQgd2hlcmUgaXQgd291bGQgYWN0dWFsbHkgYmUgbGl2ZS4gIFRoaXMgbWVhbnMgaWYgdGhlcmUgYXJlIG5vIHVzZXMgb2YKKy8vLyBhbiBvcGVyYXRpb24gZG9taW5hdGVkIGJ5IHRoZSBicmFuY2ggZWRnZXMsIG9yIGJ5IGFuIGFzc3VtZSwgdGhlIGFzc29jaWF0ZWQKKy8vLyBwcmVkaWNhdGUgaW5mbyBpcyBuZXZlciBpbnNlcnRlZC4KKy8vLworLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19QUkVESUNBVEVJTkZPX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1BSRURJQ0FURUlORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQXNzdW1wdGlvbkNhY2hlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvT3BlcmFuZFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVXNlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Vc2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vUGFzc0FuYWx5c2lzU3VwcG9ydC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvT3JkZXJlZEluc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBNZW1vcnlBY2Nlc3M7CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIHJhd19vc3RyZWFtOworCitlbnVtIFByZWRpY2F0ZVR5cGUgeyBQVF9CcmFuY2gsIFBUX0Fzc3VtZSwgUFRfU3dpdGNoIH07CisKKy8vIEJhc2UgY2xhc3MgZm9yIGFsbCBwcmVkaWNhdGUgaW5mb3JtYXRpb24gd2UgcHJvdmlkZS4KKy8vIEFsbCBvZiBvdXIgcHJlZGljYXRlIGluZm9ybWF0aW9uIGhhcyBhdCBsZWFzdCBhIGNvbXBhcmlzb24uCitjbGFzcyBQcmVkaWNhdGVCYXNlIDogcHVibGljIGlsaXN0X25vZGU8UHJlZGljYXRlQmFzZT4geworcHVibGljOgorICBQcmVkaWNhdGVUeXBlIFR5cGU7CisgIC8vIFRoZSBvcmlnaW5hbCBvcGVyYW5kIGJlZm9yZSB3ZSByZW5hbWVkIGl0LgorICAvLyBUaGlzIGNhbiBiZSB1c2UgYnkgcGFzc2VzLCB3aGVuIGRlc3Ryb3lpbmcgcHJlZGljYXRlaW5mbywgdG8ga25vdworICAvLyB3aGV0aGVyIHRoZXkgY2FuIGp1c3QgZHJvcCB0aGUgaW50cmluc2ljLCBvciBoYXZlIHRvIG1lcmdlIG1ldGFkYXRhLgorICBWYWx1ZSAqT3JpZ2luYWxPcDsKKyAgUHJlZGljYXRlQmFzZShjb25zdCBQcmVkaWNhdGVCYXNlICYpID0gZGVsZXRlOworICBQcmVkaWNhdGVCYXNlICZvcGVyYXRvcj0oY29uc3QgUHJlZGljYXRlQmFzZSAmKSA9IGRlbGV0ZTsKKyAgUHJlZGljYXRlQmFzZSgpID0gZGVsZXRlOworICB2aXJ0dWFsIH5QcmVkaWNhdGVCYXNlKCkgPSBkZWZhdWx0OworCitwcm90ZWN0ZWQ6CisgIFByZWRpY2F0ZUJhc2UoUHJlZGljYXRlVHlwZSBQVCwgVmFsdWUgKk9wKSA6IFR5cGUoUFQpLCBPcmlnaW5hbE9wKE9wKSB7fQorfTsKKworY2xhc3MgUHJlZGljYXRlV2l0aENvbmRpdGlvbiA6IHB1YmxpYyBQcmVkaWNhdGVCYXNlIHsKK3B1YmxpYzoKKyAgVmFsdWUgKkNvbmRpdGlvbjsKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBQcmVkaWNhdGVCYXNlICpQQikgeworICAgIHJldHVybiBQQi0+VHlwZSA9PSBQVF9Bc3N1bWUgfHwgUEItPlR5cGUgPT0gUFRfQnJhbmNoIHx8CisgICAgICAgICAgIFBCLT5UeXBlID09IFBUX1N3aXRjaDsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIFByZWRpY2F0ZVdpdGhDb25kaXRpb24oUHJlZGljYXRlVHlwZSBQVCwgVmFsdWUgKk9wLCBWYWx1ZSAqQ29uZGl0aW9uKQorICAgICAgOiBQcmVkaWNhdGVCYXNlKFBULCBPcCksIENvbmRpdGlvbihDb25kaXRpb24pIHt9Cit9OworCisvLyBQcm92aWRlcyBwcmVkaWNhdGUgaW5mb3JtYXRpb24gZm9yIGFzc3VtZXMuICBTaW5jZSBhc3N1bWVzIGFyZSBhbHdheXMgdHJ1ZSwKKy8vIHdlIHNpbXBseSBwcm92aWRlIHRoZSBhc3N1bWUgaW5zdHJ1Y3Rpb24sIHNvIHlvdSBjYW4gdGVsbCB5b3VyIHJlbGF0aXZlCisvLyBwb3NpdGlvbiB0byBpdC4KK2NsYXNzIFByZWRpY2F0ZUFzc3VtZSA6IHB1YmxpYyBQcmVkaWNhdGVXaXRoQ29uZGl0aW9uIHsKK3B1YmxpYzoKKyAgSW50cmluc2ljSW5zdCAqQXNzdW1lSW5zdDsKKyAgUHJlZGljYXRlQXNzdW1lKFZhbHVlICpPcCwgSW50cmluc2ljSW5zdCAqQXNzdW1lSW5zdCwgVmFsdWUgKkNvbmRpdGlvbikKKyAgICAgIDogUHJlZGljYXRlV2l0aENvbmRpdGlvbihQVF9Bc3N1bWUsIE9wLCBDb25kaXRpb24pLAorICAgICAgICBBc3N1bWVJbnN0KEFzc3VtZUluc3QpIHt9CisgIFByZWRpY2F0ZUFzc3VtZSgpID0gZGVsZXRlOworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFByZWRpY2F0ZUJhc2UgKlBCKSB7CisgICAgcmV0dXJuIFBCLT5UeXBlID09IFBUX0Fzc3VtZTsKKyAgfQorfTsKKworLy8gTWl4aW4gY2xhc3MgZm9yIGVkZ2UgcHJlZGljYXRlcy4gIFRoZSBGUk9NIGJsb2NrIGlzIHRoZSBibG9jayB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZSBvcmlnaW5hdGVzLCBhbmQgdGhlIFRPIGJsb2NrIGlzIHRoZSBibG9jayB3aGVyZSB0aGUgcHJlZGljYXRlIGlzCisvLyB2YWxpZC4KK2NsYXNzIFByZWRpY2F0ZVdpdGhFZGdlIDogcHVibGljIFByZWRpY2F0ZVdpdGhDb25kaXRpb24geworcHVibGljOgorICBCYXNpY0Jsb2NrICpGcm9tOworICBCYXNpY0Jsb2NrICpUbzsKKyAgUHJlZGljYXRlV2l0aEVkZ2UoKSA9IGRlbGV0ZTsKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBQcmVkaWNhdGVCYXNlICpQQikgeworICAgIHJldHVybiBQQi0+VHlwZSA9PSBQVF9CcmFuY2ggfHwgUEItPlR5cGUgPT0gUFRfU3dpdGNoOworICB9CisKK3Byb3RlY3RlZDoKKyAgUHJlZGljYXRlV2l0aEVkZ2UoUHJlZGljYXRlVHlwZSBQVHlwZSwgVmFsdWUgKk9wLCBCYXNpY0Jsb2NrICpGcm9tLAorICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpUbywgVmFsdWUgKkNvbmQpCisgICAgICA6IFByZWRpY2F0ZVdpdGhDb25kaXRpb24oUFR5cGUsIE9wLCBDb25kKSwgRnJvbShGcm9tKSwgVG8oVG8pIHt9Cit9OworCisvLyBQcm92aWRlcyBwcmVkaWNhdGUgaW5mb3JtYXRpb24gZm9yIGJyYW5jaGVzLgorY2xhc3MgUHJlZGljYXRlQnJhbmNoIDogcHVibGljIFByZWRpY2F0ZVdpdGhFZGdlIHsKK3B1YmxpYzoKKyAgLy8gSWYgdHJ1ZSwgU3BsaXRCQiBpcyB0aGUgdHJ1ZSBzdWNjZXNzb3IsIG90aGVyd2lzZSBpdCdzIHRoZSBmYWxzZSBzdWNjZXNzb3IuCisgIGJvb2wgVHJ1ZUVkZ2U7CisgIFByZWRpY2F0ZUJyYW5jaChWYWx1ZSAqT3AsIEJhc2ljQmxvY2sgKkJyYW5jaEJCLCBCYXNpY0Jsb2NrICpTcGxpdEJCLAorICAgICAgICAgICAgICAgICAgVmFsdWUgKkNvbmRpdGlvbiwgYm9vbCBUYWtlbkVkZ2UpCisgICAgICA6IFByZWRpY2F0ZVdpdGhFZGdlKFBUX0JyYW5jaCwgT3AsIEJyYW5jaEJCLCBTcGxpdEJCLCBDb25kaXRpb24pLAorICAgICAgICBUcnVlRWRnZShUYWtlbkVkZ2UpIHt9CisgIFByZWRpY2F0ZUJyYW5jaCgpID0gZGVsZXRlOworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFByZWRpY2F0ZUJhc2UgKlBCKSB7CisgICAgcmV0dXJuIFBCLT5UeXBlID09IFBUX0JyYW5jaDsKKyAgfQorfTsKKworY2xhc3MgUHJlZGljYXRlU3dpdGNoIDogcHVibGljIFByZWRpY2F0ZVdpdGhFZGdlIHsKK3B1YmxpYzoKKyAgVmFsdWUgKkNhc2VWYWx1ZTsKKyAgLy8gVGhpcyBpcyB0aGUgc3dpdGNoIGluc3RydWN0aW9uLgorICBTd2l0Y2hJbnN0ICpTd2l0Y2g7CisgIFByZWRpY2F0ZVN3aXRjaChWYWx1ZSAqT3AsIEJhc2ljQmxvY2sgKlN3aXRjaEJCLCBCYXNpY0Jsb2NrICpUYXJnZXRCQiwKKyAgICAgICAgICAgICAgICAgIFZhbHVlICpDYXNlVmFsdWUsIFN3aXRjaEluc3QgKlNJKQorICAgICAgOiBQcmVkaWNhdGVXaXRoRWRnZShQVF9Td2l0Y2gsIE9wLCBTd2l0Y2hCQiwgVGFyZ2V0QkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNJLT5nZXRDb25kaXRpb24oKSksCisgICAgICAgIENhc2VWYWx1ZShDYXNlVmFsdWUpLCBTd2l0Y2goU0kpIHt9CisgIFByZWRpY2F0ZVN3aXRjaCgpID0gZGVsZXRlOworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFByZWRpY2F0ZUJhc2UgKlBCKSB7CisgICAgcmV0dXJuIFBCLT5UeXBlID09IFBUX1N3aXRjaDsKKyAgfQorfTsKKworLy8gVGhpcyBuYW1lIGlzIHVzZWQgaW4gYSBmZXcgcGxhY2VzLCBzbyBraWNrIGl0IGludG8gdGhlaXIgb3duIG5hbWVzcGFjZQorbmFtZXNwYWNlIFByZWRpY2F0ZUluZm9DbGFzc2VzIHsKK3N0cnVjdCBWYWx1ZURGUzsKK30KKworLy8vIFxicmllZiBFbmNhcHN1bGF0ZXMgUHJlZGljYXRlSW5mbywgaW5jbHVkaW5nIGFsbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBtZW1vcnkKKy8vLyBhY2Nlc3Nlcy4KK2NsYXNzIFByZWRpY2F0ZUluZm8geworcHJpdmF0ZToKKyAgLy8gVXNlZCB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHZhbHVlIHdlIG1pZ2h0IHJlbmFtZS4KKyAgc3RydWN0IFZhbHVlSW5mbyB7CisgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgZWFjaCBwb3NzaWJsZSBjb3B5LiBEdXJpbmcgcHJvY2Vzc2luZywgdGhpcyBpcyBlYWNoCisgICAgLy8gaW5zZXJ0ZWQgaW5mby4gQWZ0ZXIgcHJvY2Vzc2luZywgd2UgbW92ZSB0aGUgdW5pbnNlcnRlZCBvbmVzIHRvIHRoZQorICAgIC8vIHVuaW5zZXJ0ZWQgdmVjdG9yLgorICAgIFNtYWxsVmVjdG9yPFByZWRpY2F0ZUJhc2UgKiwgND4gSW5mb3M7CisgICAgU21hbGxWZWN0b3I8UHJlZGljYXRlQmFzZSAqLCA0PiBVbmluc2VydGVkSW5mb3M7CisgIH07CisgIC8vIFRoaXMgb3ducyB0aGUgYWxsIHRoZSBwcmVkaWNhdGUgaW5mb3MgaW4gdGhlIGZ1bmN0aW9uLCBwbGFjZWQgb3Igbm90LgorICBpcGxpc3Q8UHJlZGljYXRlQmFzZT4gQWxsSW5mb3M7CisKK3B1YmxpYzoKKyAgUHJlZGljYXRlSW5mbyhGdW5jdGlvbiAmLCBEb21pbmF0b3JUcmVlICYsIEFzc3VtcHRpb25DYWNoZSAmKTsKKyAgflByZWRpY2F0ZUluZm8oKTsKKworICB2b2lkIHZlcmlmeVByZWRpY2F0ZUluZm8oKSBjb25zdDsKKworICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmKSBjb25zdDsKKworICBjb25zdCBQcmVkaWNhdGVCYXNlICpnZXRQcmVkaWNhdGVJbmZvRm9yKGNvbnN0IFZhbHVlICpWKSBjb25zdCB7CisgICAgcmV0dXJuIFByZWRpY2F0ZU1hcC5sb29rdXAoVik7CisgIH0KKworcHJvdGVjdGVkOgorICAvLyBVc2VkIGJ5IFByZWRpY2F0ZUluZm8gYW5ub3RhdGVyLCBkdW1wZXJzLCBhbmQgd3JhcHBlciBwYXNzLgorICBmcmllbmQgY2xhc3MgUHJlZGljYXRlSW5mb0Fubm90YXRlZFdyaXRlcjsKKyAgZnJpZW5kIGNsYXNzIFByZWRpY2F0ZUluZm9QcmludGVyTGVnYWN5UGFzczsKKworcHJpdmF0ZToKKyAgdm9pZCBidWlsZFByZWRpY2F0ZUluZm8oKTsKKyAgdm9pZCBwcm9jZXNzQXNzdW1lKEludHJpbnNpY0luc3QgKiwgQmFzaWNCbG9jayAqLCBTbWFsbFB0clNldEltcGw8VmFsdWUgKj4gJik7CisgIHZvaWQgcHJvY2Vzc0JyYW5jaChCcmFuY2hJbnN0ICosIEJhc2ljQmxvY2sgKiwgU21hbGxQdHJTZXRJbXBsPFZhbHVlICo+ICYpOworICB2b2lkIHByb2Nlc3NTd2l0Y2goU3dpdGNoSW5zdCAqLCBCYXNpY0Jsb2NrICosIFNtYWxsUHRyU2V0SW1wbDxWYWx1ZSAqPiAmKTsKKyAgdm9pZCByZW5hbWVVc2VzKFNtYWxsUHRyU2V0SW1wbDxWYWx1ZSAqPiAmKTsKKyAgdXNpbmcgVmFsdWVERlMgPSBQcmVkaWNhdGVJbmZvQ2xhc3Nlczo6VmFsdWVERlM7CisgIHR5cGVkZWYgU21hbGxWZWN0b3JJbXBsPFZhbHVlREZTPiBWYWx1ZURGU1N0YWNrOworICB2b2lkIGNvbnZlcnRVc2VzVG9ERlNPcmRlcmVkKFZhbHVlICosIFNtYWxsVmVjdG9ySW1wbDxWYWx1ZURGUz4gJik7CisgIFZhbHVlICptYXRlcmlhbGl6ZVN0YWNrKHVuc2lnbmVkIGludCAmLCBWYWx1ZURGU1N0YWNrICYsIFZhbHVlICopOworICBib29sIHN0YWNrSXNJblNjb3BlKGNvbnN0IFZhbHVlREZTU3RhY2sgJiwgY29uc3QgVmFsdWVERlMgJikgY29uc3Q7CisgIHZvaWQgcG9wU3RhY2tVbnRpbERGU1Njb3BlKFZhbHVlREZTU3RhY2sgJiwgY29uc3QgVmFsdWVERlMgJik7CisgIFZhbHVlSW5mbyAmZ2V0T3JDcmVhdGVWYWx1ZUluZm8oVmFsdWUgKik7CisgIHZvaWQgYWRkSW5mb0ZvcihTbWFsbFB0clNldEltcGw8VmFsdWUgKj4gJk9wc1RvUmVuYW1lLCBWYWx1ZSAqT3AsCisgICAgICAgICAgICAgICAgICBQcmVkaWNhdGVCYXNlICpQQik7CisgIGNvbnN0IFZhbHVlSW5mbyAmZ2V0VmFsdWVJbmZvKFZhbHVlICopIGNvbnN0OworICBGdW5jdGlvbiAmRjsKKyAgRG9taW5hdG9yVHJlZSAmRFQ7CisgIEFzc3VtcHRpb25DYWNoZSAmQUM7CisgIE9yZGVyZWRJbnN0cnVjdGlvbnMgT0k7CisgIC8vIFRoaXMgbWFwcyBmcm9tIGNvcHkgb3BlcmFuZHMgdG8gUHJlZGljYXRlIEluZm8uIE5vdGUgdGhhdCBpdCBkb2VzIG5vdCBvd24KKyAgLy8gdGhlIFByZWRpY2F0ZSBJbmZvLCB0aGV5IGJlbG9uZyB0byB0aGUgVmFsdWVJbmZvIHN0cnVjdHMgaW4gdGhlIFZhbHVlSW5mb3MKKyAgLy8gdmVjdG9yLgorICBEZW5zZU1hcDxjb25zdCBWYWx1ZSAqLCBjb25zdCBQcmVkaWNhdGVCYXNlICo+IFByZWRpY2F0ZU1hcDsKKyAgLy8gVGhpcyBzdG9yZXMgaW5mbyBhYm91dCBlYWNoIG9wZXJhbmQgb3IgY29tcGFyaXNvbiByZXN1bHQgd2UgbWFrZSBjb3BpZXMKKyAgLy8gb2YuICBUaGUgcmVhbCBWYWx1ZUluZm9zIHN0YXJ0IGF0IGluZGV4IDEsIGluZGV4IDAgaXMgdW51c2VkIHNvIHRoYXQgd2UgY2FuCisgIC8vIG1vcmUgZWFzaWx5IGRldGVjdCBpbnZhbGlkIGluZGV4aW5nLgorICBTbWFsbFZlY3RvcjxWYWx1ZUluZm8sIDMyPiBWYWx1ZUluZm9zOworICAvLyBUaGlzIGdpdmVzIHRoZSBpbmRleCBpbnRvIHRoZSBWYWx1ZUluZm9zIGFycmF5IGZvciBhIGdpdmVuIFZhbHVlLiAgQmVjYXVzZQorICAvLyAwIGlzIG5vdCBhIHZhbGlkIFZhbHVlIEluZm8gaW5kZXgsIHlvdSBjYW4gdXNlIERlbnNlTWFwOjpsb29rdXAgYW5kIHRlbGwKKyAgLy8gd2hldGhlciBpdCByZXR1cm5lZCBhIHZhbGlkIHJlc3VsdC4KKyAgRGVuc2VNYXA8VmFsdWUgKiwgdW5zaWduZWQgaW50PiBWYWx1ZUluZm9OdW1zOworICAvLyBUaGUgc2V0IG9mIGVkZ2VzIGFsb25nIHdoaWNoIHdlIGNhbiBvbmx5IGhhbmRsZSBwaGkgdXNlcywgZHVlIHRvIGNyaXRpY2FsCisgIC8vIGVkZ2VzLgorICBEZW5zZVNldDxzdGQ6OnBhaXI8QmFzaWNCbG9jayAqLCBCYXNpY0Jsb2NrICo+PiBFZGdlVXNlc09ubHk7Cit9OworCisvLyBUaGlzIHBhc3MgZG9lcyBlYWdlciBidWlsZGluZyBhbmQgdGhlbiBwcmludGluZyBvZiBQcmVkaWNhdGVJbmZvLiBJdCBpcyB1c2VkCisvLyBieQorLy8gdGhlIHRlc3RzIHRvIGJlIGFibGUgdG8gYnVpbGQsIGR1bXAsIGFuZCB2ZXJpZnkgUHJlZGljYXRlSW5mby4KK2NsYXNzIFByZWRpY2F0ZUluZm9QcmludGVyTGVnYWN5UGFzcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworcHVibGljOgorICBQcmVkaWNhdGVJbmZvUHJpbnRlckxlZ2FjeVBhc3MoKTsKKworICBzdGF0aWMgY2hhciBJRDsKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICYpIG92ZXJyaWRlOworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vIFxicmllZiBQcmludGVyIHBhc3MgZm9yIFxjIFByZWRpY2F0ZUluZm8uCitjbGFzcyBQcmVkaWNhdGVJbmZvUHJpbnRlclBhc3MKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPFByZWRpY2F0ZUluZm9QcmludGVyUGFzcz4geworICByYXdfb3N0cmVhbSAmT1M7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgUHJlZGljYXRlSW5mb1ByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPUykgOiBPUyhPUykge30KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIFxicmllZiBWZXJpZmllciBwYXNzIGZvciBcYyBQcmVkaWNhdGVJbmZvLgorc3RydWN0IFByZWRpY2F0ZUluZm9WZXJpZmllclBhc3MgOiBQYXNzSW5mb01peGluPFByZWRpY2F0ZUluZm9WZXJpZmllclBhc3M+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19QUkVESUNBVEVJTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Qcm9tb3RlTWVtVG9SZWcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Qcm9tb3RlTWVtVG9SZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjhhNjFhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1Byb21vdGVNZW1Ub1JlZy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vPT09LSBQcm9tb3RlTWVtVG9SZWcuaCAtIFByb21vdGUgQWxsb2NhcyB0byBTY2FsYXJzIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGV4cG9zZXMgYW4gaW50ZXJmYWNlIHRvIHByb21vdGUgYWxsb2NhIGluc3RydWN0aW9ucyB0byBTU0EKKy8vIHJlZ2lzdGVycywgYnkgdXNpbmcgdGhlIFNTQSBjb25zdHJ1Y3Rpb24gYWxnb3JpdGhtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1BST01PVEVNRU1UT1JFR19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19QUk9NT1RFTUVNVE9SRUdfSAorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKK2NsYXNzIEFsbG9jYUluc3Q7CitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgQWxpYXNTZXRUcmFja2VyOworY2xhc3MgQXNzdW1wdGlvbkNhY2hlOworCisvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgYWxsb2NhIGlzIGxlZ2FsIGZvciBwcm9tb3Rpb24uCisvLy8KKy8vLyBUaGlzIGlzIHRydWUgaWYgdGhlcmUgYXJlIG9ubHkgbG9hZHMsIHN0b3JlcywgYW5kIGxpZmV0aW1lIG1hcmtlcnMKKy8vLyAodHJhbnNpdGl2ZWx5KSB1c2luZyB0aGlzIGFsbG9jYS4gVGhpcyBhbHNvIGVuZm9yY2VzIHRoYXQgdGhlcmUgaXMgb25seQorLy8vIGV2ZXIgb25lIGxheWVyIG9mIGJpdGNhc3RzIG9yIEdFUHMgYmV0d2VlbiB0aGUgYWxsb2NhIGFuZCB0aGUgbGlmZXRpbWUKKy8vLyBtYXJrZXJzLgorYm9vbCBpc0FsbG9jYVByb21vdGFibGUoY29uc3QgQWxsb2NhSW5zdCAqQUkpOworCisvLy8gXGJyaWVmIFByb21vdGUgdGhlIHNwZWNpZmllZCBsaXN0IG9mIGFsbG9jYSBpbnN0cnVjdGlvbnMgaW50byBzY2FsYXIKKy8vLyByZWdpc3RlcnMsIGluc2VydGluZyBQSEkgbm9kZXMgYXMgYXBwcm9wcmlhdGUuCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIG1ha2VzIHVzZSBvZiBEb21pbmFuY2VGcm9udGllciBpbmZvcm1hdGlvbi4gIFRoaXMgZnVuY3Rpb24KKy8vLyBkb2VzIG5vdCBtb2RpZnkgdGhlIENGRyBvZiB0aGUgZnVuY3Rpb24gYXQgYWxsLiAgQWxsIGFsbG9jYXMgbXVzdCBiZSBmcm9tCisvLy8gdGhlIHNhbWUgZnVuY3Rpb24uCisvLy8KK3ZvaWQgUHJvbW90ZU1lbVRvUmVnKEFycmF5UmVmPEFsbG9jYUluc3QgKj4gQWxsb2NhcywgRG9taW5hdG9yVHJlZSAmRFQsCisgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0cik7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NTQVVwZGF0ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9TU0FVcGRhdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkOWYxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9TU0FVcGRhdGVyLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8vPT09LSBTU0FVcGRhdGVyLmggLSBVbnN0cnVjdHVyZWQgU1NBIFVwZGF0ZSBUb29sIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBTU0FVcGRhdGVyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1NTQVVQREFURVJfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfU1NBVVBEQVRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBMb2FkSW5zdDsKK2NsYXNzIFBISU5vZGU7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgU21hbGxWZWN0b3JJbXBsOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNTQVVwZGF0ZXJUcmFpdHM7CitjbGFzcyBUeXBlOworY2xhc3MgVXNlOworY2xhc3MgVmFsdWU7CisKKy8vLyBcYnJpZWYgSGVscGVyIGNsYXNzIGZvciBTU0EgZm9ybWF0aW9uIG9uIGEgc2V0IG9mIHZhbHVlcyBkZWZpbmVkIGluCisvLy8gbXVsdGlwbGUgYmxvY2tzLgorLy8vCisvLy8gVGhpcyBpcyB1c2VkIHdoZW4gY29kZSBkdXBsaWNhdGlvbiBvciBhbm90aGVyIHVuc3RydWN0dXJlZAorLy8vIHRyYW5zZm9ybWF0aW9uIHdhbnRzIHRvIHJld3JpdGUgYSBzZXQgb2YgdXNlcyBvZiBvbmUgdmFsdWUgd2l0aCB1c2VzIG9mIGEKKy8vLyBzZXQgb2YgdmFsdWVzLgorY2xhc3MgU1NBVXBkYXRlciB7CisgIGZyaWVuZCBjbGFzcyBTU0FVcGRhdGVyVHJhaXRzPFNTQVVwZGF0ZXI+OworCitwcml2YXRlOgorICAvLy8gVGhpcyBrZWVwcyB0cmFjayBvZiB3aGljaCB2YWx1ZSB0byB1c2Ugb24gYSBwZXItYmxvY2sgYmFzaXMuIFdoZW4gd2UKKyAgLy8vIGluc2VydCBQSEkgbm9kZXMsIHdlIGtlZXAgdHJhY2sgb2YgdGhlbSBoZXJlLgorICB2b2lkICpBViA9IG51bGxwdHI7CisKKyAgLy8vIFByb3RvVHlwZSBob2xkcyB0aGUgdHlwZSBvZiB0aGUgdmFsdWVzIGJlaW5nIHJld3JpdHRlbi4KKyAgVHlwZSAqUHJvdG9UeXBlID0gbnVsbHB0cjsKKworICAvLy8gUEhJIG5vZGVzIGFyZSBnaXZlbiBhIG5hbWUgYmFzZWQgb24gUHJvdG9OYW1lLgorICBzdGQ6OnN0cmluZyBQcm90b05hbWU7CisKKyAgLy8vIElmIHRoaXMgaXMgbm9uLW51bGwsIHRoZSBTU0FVcGRhdGVyIGFkZHMgYWxsIFBISSBub2RlcyB0aGF0IGl0IGNyZWF0ZXMgdG8KKyAgLy8vIHRoZSB2ZWN0b3IuCisgIFNtYWxsVmVjdG9ySW1wbDxQSElOb2RlICo+ICpJbnNlcnRlZFBISXM7CisKK3B1YmxpYzoKKyAgLy8vIElmIEluc2VydGVkUEhJcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgZmlsbGVkCisgIC8vLyBpbiB3aXRoIGFsbCBQSEkgTm9kZXMgY3JlYXRlZCBieSByZXdyaXRpbmcuCisgIGV4cGxpY2l0IFNTQVVwZGF0ZXIoU21hbGxWZWN0b3JJbXBsPFBISU5vZGUgKj4gKkluc2VydGVkUEhJcyA9IG51bGxwdHIpOworICBTU0FVcGRhdGVyKGNvbnN0IFNTQVVwZGF0ZXIgJikgPSBkZWxldGU7CisgIFNTQVVwZGF0ZXIgJm9wZXJhdG9yPShjb25zdCBTU0FVcGRhdGVyICYpID0gZGVsZXRlOworICB+U1NBVXBkYXRlcigpOworCisgIC8vLyBcYnJpZWYgUmVzZXQgdGhpcyBvYmplY3QgdG8gZ2V0IHJlYWR5IGZvciBhIG5ldyBzZXQgb2YgU1NBIHVwZGF0ZXMgd2l0aAorICAvLy8gdHlwZSAnVHknLgorICAvLy8KKyAgLy8vIFBISSBub2RlcyBnZXQgYSBuYW1lIGJhc2VkIG9uICdOYW1lJy4KKyAgdm9pZCBJbml0aWFsaXplKFR5cGUgKlR5LCBTdHJpbmdSZWYgTmFtZSk7CisKKyAgLy8vIFxicmllZiBJbmRpY2F0ZSB0aGF0IGEgcmV3cml0dGVuIHZhbHVlIGlzIGF2YWlsYWJsZSBpbiB0aGUgc3BlY2lmaWVkIGJsb2NrCisgIC8vLyB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgIHZvaWQgQWRkQXZhaWxhYmxlVmFsdWUoQmFzaWNCbG9jayAqQkIsIFZhbHVlICpWKTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBTU0FVcGRhdGVyIGFscmVhZHkgaGFzIGEgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIGJsb2NrLgorICBib29sIEhhc1ZhbHVlRm9yQmxvY2soQmFzaWNCbG9jayAqQkIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IFNTQSBmb3JtLCBtYXRlcmlhbGl6aW5nIGEgdmFsdWUgdGhhdCBpcyBsaXZlIGF0IHRoZSBlbmQKKyAgLy8vIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2suCisgIFZhbHVlICpHZXRWYWx1ZUF0RW5kT2ZCbG9jayhCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgU1NBIGZvcm0sIG1hdGVyaWFsaXppbmcgYSB2YWx1ZSB0aGF0IGlzIGxpdmUgaW4gdGhlCisgIC8vLyBtaWRkbGUgb2YgdGhlIHNwZWNpZmllZCBibG9jay4KKyAgLy8vCisgIC8vLyBcYyBHZXRWYWx1ZUluTWlkZGxlT2ZCbG9jayBpcyB0aGUgc2FtZSBhcyBcYyBHZXRWYWx1ZUF0RW5kT2ZCbG9jayBleGNlcHQKKyAgLy8vIGluIG9uZSBpbXBvcnRhbnQgY2FzZTogaWYgdGhlcmUgaXMgYSBkZWZpbml0aW9uIG9mIHRoZSByZXdyaXR0ZW4gdmFsdWUKKyAgLy8vIGFmdGVyIHRoZSAndXNlJyBpbiBCQi4gIENvbnNpZGVyIGNvZGUgbGlrZSB0aGlzOgorICAvLy8KKyAgLy8vIFxjb2RlCisgIC8vLyAgICAgIFgxID0gLi4uCisgIC8vLyAgIFNvbWVCQjoKKyAgLy8vICAgICAgdXNlKFgpCisgIC8vLyAgICAgIFgyID0gLi4uCisgIC8vLyAgICAgIGJyIENvbmQsIFNvbWVCQiwgT3V0QkIKKyAgLy8vIFxlbmRjb2RlCisgIC8vLworICAvLy8gSW4gdGhpcyBjYXNlLCB0aGVyZSBhcmUgdHdvIHZhbHVlcyAoWDEgYW5kIFgyKSBhZGRlZCB0byB0aGUgQXZhaWxhYmxlVmFscworICAvLy8gc2V0IGJ5IHRoZSBjbGllbnQgb2YgdGhlIHJld3JpdGVyLCBhbmQgdGhvc2UgdmFsdWVzIGFyZSBib3RoIGxpdmUgb3V0IG9mCisgIC8vLyB0aGVpciByZXNwZWN0aXZlIGJsb2Nrcy4gIEhvd2V2ZXIsIHRoZSB1c2Ugb2YgWCBoYXBwZW5zIGluIHRoZSAqbWlkZGxlKiBvZgorICAvLy8gYSBibG9jay4gIEJlY2F1c2Ugb2YgdGhpcywgd2UgbmVlZCB0byBpbnNlcnQgYSBuZXcgUEhJIG5vZGUgaW4gU29tZUJCIHRvCisgIC8vLyBtZXJnZSB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzLCBhbmQgdGhpcyB2YWx1ZSBpc24ndCBsaXZlIG91dCBvZiB0aGUgYmxvY2suCisgIFZhbHVlICpHZXRWYWx1ZUluTWlkZGxlT2ZCbG9jayhCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIFxicmllZiBSZXdyaXRlIGEgdXNlIG9mIHRoZSBzeW1ib2xpYyB2YWx1ZS4KKyAgLy8vCisgIC8vLyBUaGlzIGhhbmRsZXMgUEhJIG5vZGVzLCB3aGljaCB1c2UgdGhlaXIgdmFsdWUgaW4gdGhlIGNvcnJlc3BvbmRpbmcKKyAgLy8vIHByZWRlY2Vzc29yLiBOb3RlIHRoYXQgdGhpcyB3aWxsIG5vdCB3b3JrIGlmIHRoZSB1c2UgaXMgc3VwcG9zZWQgdG8gYmUKKyAgLy8vIHJld3JpdHRlbiB0byBhIHZhbHVlIGRlZmluZWQgaW4gdGhlIHNhbWUgYmxvY2sgYXMgdGhlIHVzZSwgYnV0IGFib3ZlIGl0LgorICAvLy8gQW55ICdBZGRBdmFpbGFibGVWYWx1ZSdzIGFkZGVkIGZvciB0aGUgdXNlJ3MgYmxvY2sgd2lsbCBiZSBjb25zaWRlcmVkIHRvCisgIC8vLyBiZSBiZWxvdyBpdC4KKyAgdm9pZCBSZXdyaXRlVXNlKFVzZSAmVSk7CisKKyAgLy8vIFxicmllZiBSZXdyaXRlIGEgdXNlIGxpa2UgXGMgUmV3cml0ZVVzZSBidXQgaGFuZGxpbmcgaW4tYmxvY2sgZGVmaW5pdGlvbnMuCisgIC8vLworICAvLy8gVGhpcyB2ZXJzaW9uIG9mIHRoZSBtZXRob2QgY2FuIHJld3JpdGUgdXNlcyBpbiB0aGUgc2FtZSBibG9jayBhcworICAvLy8gYSBkZWZpbml0aW9uLCBiZWNhdXNlIGl0IGFzc3VtZXMgdGhhdCBhbGwgdXNlcyBvZiBhIHZhbHVlIGFyZSBiZWxvdyBhbnkKKyAgLy8vIGluc2VydGVkIHZhbHVlcy4KKyAgdm9pZCBSZXdyaXRlVXNlQWZ0ZXJJbnNlcnRpb25zKFVzZSAmVSk7CisKK3ByaXZhdGU6CisgIFZhbHVlICpHZXRWYWx1ZUF0RW5kT2ZCbG9ja0ludGVybmFsKEJhc2ljQmxvY2sgKkJCKTsKK307CisKKy8vLyBcYnJpZWYgSGVscGVyIGNsYXNzIGZvciBwcm9tb3RpbmcgYSBjb2xsZWN0aW9uIG9mIGxvYWRzIGFuZCBzdG9yZXMgaW50byBTU0EKKy8vLyBGb3JtIHVzaW5nIHRoZSBTU0FVcGRhdGVyLgorLy8vCisvLy8gVGhpcyBoYW5kbGVzIGNvbXBsZXhpdGllcyB0aGF0IFNTQVVwZGF0ZXIgZG9lc24ndCwgc3VjaCBhcyBtdWx0aXBsZSBsb2FkcworLy8vIGFuZCBzdG9yZXMgaW4gb25lIGJsb2NrLgorLy8vCisvLy8gQ2xpZW50cyBvZiB0aGlzIGNsYXNzIGFyZSBleHBlY3RlZCB0byBzdWJjbGFzcyB0aGlzIGFuZCBpbXBsZW1lbnQgdGhlCisvLy8gdmlydHVhbCBtZXRob2RzLgorY2xhc3MgTG9hZEFuZFN0b3JlUHJvbW90ZXIgeworcHJvdGVjdGVkOgorICBTU0FVcGRhdGVyICZTU0E7CisKK3B1YmxpYzoKKyAgTG9hZEFuZFN0b3JlUHJvbW90ZXIoQXJyYXlSZWY8Y29uc3QgSW5zdHJ1Y3Rpb24gKj4gSW5zdHMsCisgICAgICAgICAgICAgICAgICAgICAgIFNTQVVwZGF0ZXIgJlMsIFN0cmluZ1JlZiBOYW1lID0gU3RyaW5nUmVmKCkpOworICB2aXJ0dWFsIH5Mb2FkQW5kU3RvcmVQcm9tb3RlcigpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIFRoaXMgZG9lcyB0aGUgcHJvbW90aW9uLgorICAvLy8KKyAgLy8vIEluc3RzIGlzIGEgbGlzdCBvZiBsb2FkcyBhbmQgc3RvcmVzIHRvIHByb21vdGUsIGFuZCBOYW1lIGlzIHRoZSBiYXNlbmFtZQorICAvLy8gZm9yIHRoZSBQSElzIHRvIGluc2VydC4gQWZ0ZXIgdGhpcyBpcyBjb21wbGV0ZSwgdGhlIGxvYWRzIGFuZCBzdG9yZXMgYXJlCisgIC8vLyByZW1vdmVkIGZyb20gdGhlIGNvZGUuCisgIHZvaWQgcnVuKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbiAqPiAmSW5zdHMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBpcyBpbiB0aGUgSW5zdCBsaXN0LgorICAvLy8KKyAgLy8vIFRoZSBJbnN0cyBsaXN0IGlzIHRoZSBvbmUgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yLiBDbGllbnRzIHNob3VsZAorICAvLy8gaW1wbGVtZW50IHRoaXMgd2l0aCBhIG1vcmUgZWZmaWNpZW50IHZlcnNpb24gaWYgcG9zc2libGUuCisgIHZpcnR1YWwgYm9vbCBpc0luc3RJbkxpc3QoSW5zdHJ1Y3Rpb24gKkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uICo+ICZJbnN0cykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUaGlzIGhvb2sgaXMgaW52b2tlZCBhZnRlciBhbGwgdGhlIHN0b3JlcyBhcmUgZm91bmQgYW5kIGluc2VydGVkIGFzCisgIC8vLyBhdmFpbGFibGUgdmFsdWVzLgorICB2aXJ0dWFsIHZvaWQgZG9FeHRyYVJld3JpdGVzQmVmb3JlRmluYWxEZWxldGlvbigpIGNvbnN0IHt9CisKKyAgLy8vIFxicmllZiBDbGllbnRzIGNhbiBjaG9vc2UgdG8gaW1wbGVtZW50IHRoaXMgdG8gZ2V0IG5vdGlmaWVkIHJpZ2h0IGJlZm9yZQorICAvLy8gYSBsb2FkIGlzIFJBVVcnZCBhbm90aGVyIHZhbHVlLgorICB2aXJ0dWFsIHZvaWQgcmVwbGFjZUxvYWRXaXRoVmFsdWUoTG9hZEluc3QgKkxJLCBWYWx1ZSAqVikgY29uc3Qge30KKworICAvLy8gXGJyaWVmIENhbGxlZCBiZWZvcmUgZWFjaCBpbnN0cnVjdGlvbiBpcyBkZWxldGVkLgorICB2aXJ0dWFsIHZvaWQgaW5zdHJ1Y3Rpb25EZWxldGVkKEluc3RydWN0aW9uICpJKSBjb25zdCB7fQorCisgIC8vLyBcYnJpZWYgQ2FsbGVkIHRvIHVwZGF0ZSBkZWJ1ZyBpbmZvIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdHJ1Y3Rpb24uCisgIHZpcnR1YWwgdm9pZCB1cGRhdGVEZWJ1Z0luZm8oSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0IHt9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1NTQVVQREFURVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NTQVVwZGF0ZXJJbXBsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU1NBVXBkYXRlckltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzhiZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NTQVVwZGF0ZXJJbXBsLmgKQEAgLTAsMCArMSw0NjkgQEAKKy8vPT09LSBTU0FVcGRhdGVySW1wbC5oIC0gU1NBIFVwZGF0ZXIgSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGEgdGVtcGxhdGUgdGhhdCBpbXBsZW1lbnRzIHRoZSBjb3JlIGFsZ29yaXRobSBmb3IgdGhlCisvLyBTU0FVcGRhdGVyIGFuZCBNYWNoaW5lU1NBVXBkYXRlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19TU0FVUERBVEVSSU1QTF9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19TU0FVUERBVEVSSU1QTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCisjZGVmaW5lIERFQlVHX1RZUEUgInNzYXVwZGF0ZXIiCisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgU1NBVXBkYXRlclRyYWl0czsKKwordGVtcGxhdGU8dHlwZW5hbWUgVXBkYXRlclQ+CitjbGFzcyBTU0FVcGRhdGVySW1wbCB7Citwcml2YXRlOgorICBVcGRhdGVyVCAqVXBkYXRlcjsKKworICB1c2luZyBUcmFpdHMgPSBTU0FVcGRhdGVyVHJhaXRzPFVwZGF0ZXJUPjsKKyAgdXNpbmcgQmxrVCA9IHR5cGVuYW1lIFRyYWl0czo6QmxrVDsKKyAgdXNpbmcgVmFsVCA9IHR5cGVuYW1lIFRyYWl0czo6VmFsVDsKKyAgdXNpbmcgUGhpVCA9IHR5cGVuYW1lIFRyYWl0czo6UGhpVDsKKworICAvLy8gQkJJbmZvIC0gUGVyLWJhc2ljIGJsb2NrIGluZm9ybWF0aW9uIHVzZWQgaW50ZXJuYWxseSBieSBTU0FVcGRhdGVySW1wbC4KKyAgLy8vIFRoZSBwcmVkZWNlc3NvcnMgb2YgZWFjaCBibG9jayBhcmUgY2FjaGVkIGhlcmUgc2luY2UgcHJlZF9pdGVyYXRvciBpcworICAvLy8gc2xvdyBhbmQgd2UgbmVlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGJsb2NrcyBhdCBsZWFzdCBhIGZldyB0aW1lcy4KKyAgY2xhc3MgQkJJbmZvIHsKKyAgcHVibGljOgorICAgIC8vIEJhY2stcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZyBibG9jay4KKyAgICBCbGtUICpCQjsKKworICAgIC8vIFZhbHVlIHRvIHVzZSBpbiB0aGlzIGJsb2NrLgorICAgIFZhbFQgQXZhaWxhYmxlVmFsOworCisgICAgLy8gQmxvY2sgdGhhdCBkZWZpbmVzIHRoZSBhdmFpbGFibGUgdmFsdWUuCisgICAgQkJJbmZvICpEZWZCQjsKKworICAgIC8vIFBvc3RvcmRlciBudW1iZXIuCisgICAgaW50IEJsa051bSA9IDA7CisKKyAgICAvLyBJbW1lZGlhdGUgZG9taW5hdG9yLgorICAgIEJCSW5mbyAqSURvbSA9IG51bGxwdHI7CisKKyAgICAvLyBOdW1iZXIgb2YgcHJlZGVjZXNzb3IgYmxvY2tzLgorICAgIHVuc2lnbmVkIE51bVByZWRzID0gMDsKKworICAgIC8vIEFycmF5W051bVByZWRzXSBvZiBwcmVkZWNlc3NvciBibG9ja3MuCisgICAgQkJJbmZvICoqUHJlZHMgPSBudWxscHRyOworCisgICAgLy8gTWFya2VyIGZvciBleGlzdGluZyBQSElzIHRoYXQgbWF0Y2guCisgICAgUGhpVCAqUEhJVGFnID0gbnVsbHB0cjsKKworICAgIEJCSW5mbyhCbGtUICpUaGlzQkIsIFZhbFQgVikKKyAgICAgIDogQkIoVGhpc0JCKSwgQXZhaWxhYmxlVmFsKFYpLCBEZWZCQihWID8gdGhpcyA6IG51bGxwdHIpIHt9CisgIH07CisKKyAgdXNpbmcgQXZhaWxhYmxlVmFsc1R5ID0gRGVuc2VNYXA8QmxrVCAqLCBWYWxUPjsKKworICBBdmFpbGFibGVWYWxzVHkgKkF2YWlsYWJsZVZhbHM7CisKKyAgU21hbGxWZWN0b3JJbXBsPFBoaVQgKj4gKkluc2VydGVkUEhJczsKKworICB1c2luZyBCbG9ja0xpc3RUeSA9IFNtYWxsVmVjdG9ySW1wbDxCQkluZm8gKj47CisgIHVzaW5nIEJCTWFwVHkgPSBEZW5zZU1hcDxCbGtUICosIEJCSW5mbyAqPjsKKworICBCQk1hcFR5IEJCTWFwOworICBCdW1wUHRyQWxsb2NhdG9yIEFsbG9jYXRvcjsKKworcHVibGljOgorICBleHBsaWNpdCBTU0FVcGRhdGVySW1wbChVcGRhdGVyVCAqVSwgQXZhaWxhYmxlVmFsc1R5ICpBLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8UGhpVCAqPiAqSW5zKSA6CisgICAgVXBkYXRlcihVKSwgQXZhaWxhYmxlVmFscyhBKSwgSW5zZXJ0ZWRQSElzKElucykge30KKworICAvLy8gR2V0VmFsdWUgLSBDaGVjayB0byBzZWUgaWYgQXZhaWxhYmxlVmFscyBoYXMgYW4gZW50cnkgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIEJCIGFuZCBpZiBzbywgcmV0dXJuIGl0LiAgSWYgbm90LCBjb25zdHJ1Y3QgU1NBIGZvcm0gYnkgZmlyc3QKKyAgLy8vIGNhbGN1bGF0aW5nIHRoZSByZXF1aXJlZCBwbGFjZW1lbnQgb2YgUEhJcyBhbmQgdGhlbiBpbnNlcnRpbmcgbmV3IFBISXMKKyAgLy8vIHdoZXJlIG5lZWRlZC4KKyAgVmFsVCBHZXRWYWx1ZShCbGtUICpCQikgeworICAgIFNtYWxsVmVjdG9yPEJCSW5mbyAqLCAxMDA+IEJsb2NrTGlzdDsKKyAgICBCQkluZm8gKlBzZXVkb0VudHJ5ID0gQnVpbGRCbG9ja0xpc3QoQkIsICZCbG9ja0xpc3QpOworCisgICAgLy8gU3BlY2lhbCBjYXNlOiBiYWlsIG91dCBpZiBCQiBpcyB1bnJlYWNoYWJsZS4KKyAgICBpZiAoQmxvY2tMaXN0LnNpemUoKSA9PSAwKSB7CisgICAgICBWYWxUIFYgPSBUcmFpdHM6OkdldFVuZGVmVmFsKEJCLCBVcGRhdGVyKTsKKyAgICAgICgqQXZhaWxhYmxlVmFscylbQkJdID0gVjsKKyAgICAgIHJldHVybiBWOworICAgIH0KKworICAgIEZpbmREb21pbmF0b3JzKCZCbG9ja0xpc3QsIFBzZXVkb0VudHJ5KTsKKyAgICBGaW5kUEhJUGxhY2VtZW50KCZCbG9ja0xpc3QpOworICAgIEZpbmRBdmFpbGFibGVWYWxzKCZCbG9ja0xpc3QpOworCisgICAgcmV0dXJuIEJCTWFwW0JCXS0+RGVmQkItPkF2YWlsYWJsZVZhbDsKKyAgfQorCisgIC8vLyBCdWlsZEJsb2NrTGlzdCAtIFN0YXJ0aW5nIGZyb20gdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jaywgdHJhdmVyc2UgYmFjaworICAvLy8gdGhyb3VnaCBpdHMgcHJlZGVjZXNzb3JzIHVudGlsIHJlYWNoaW5nIGJsb2NrcyB3aXRoIGtub3duIHZhbHVlcy4KKyAgLy8vIENyZWF0ZSBCQkluZm8gc3RydWN0dXJlcyBmb3IgdGhlIGJsb2NrcyBhbmQgYXBwZW5kIHRoZW0gdG8gdGhlIGJsb2NrCisgIC8vLyBsaXN0LgorICBCQkluZm8gKkJ1aWxkQmxvY2tMaXN0KEJsa1QgKkJCLCBCbG9ja0xpc3RUeSAqQmxvY2tMaXN0KSB7CisgICAgU21hbGxWZWN0b3I8QkJJbmZvICosIDEwPiBSb290TGlzdDsKKyAgICBTbWFsbFZlY3RvcjxCQkluZm8gKiwgNjQ+IFdvcmtMaXN0OworCisgICAgQkJJbmZvICpJbmZvID0gbmV3IChBbGxvY2F0b3IpIEJCSW5mbyhCQiwgMCk7CisgICAgQkJNYXBbQkJdID0gSW5mbzsKKyAgICBXb3JrTGlzdC5wdXNoX2JhY2soSW5mbyk7CisKKyAgICAvLyBTZWFyY2ggYmFja3dhcmQgZnJvbSBCQiwgY3JlYXRpbmcgQkJJbmZvcyBhbG9uZyB0aGUgd2F5IGFuZCBzdG9wcGluZworICAgIC8vIHdoZW4gcmVhY2hpbmcgYmxvY2tzIHRoYXQgZGVmaW5lIHRoZSB2YWx1ZS4gIFJlY29yZCB0aG9zZSBkZWZpbmluZworICAgIC8vIGJsb2NrcyBvbiB0aGUgUm9vdExpc3QuCisgICAgU21hbGxWZWN0b3I8QmxrVCAqLCAxMD4gUHJlZHM7CisgICAgd2hpbGUgKCFXb3JrTGlzdC5lbXB0eSgpKSB7CisgICAgICBJbmZvID0gV29ya0xpc3QucG9wX2JhY2tfdmFsKCk7CisgICAgICBQcmVkcy5jbGVhcigpOworICAgICAgVHJhaXRzOjpGaW5kUHJlZGVjZXNzb3JCbG9ja3MoSW5mby0+QkIsICZQcmVkcyk7CisgICAgICBJbmZvLT5OdW1QcmVkcyA9IFByZWRzLnNpemUoKTsKKyAgICAgIGlmIChJbmZvLT5OdW1QcmVkcyA9PSAwKQorICAgICAgICBJbmZvLT5QcmVkcyA9IG51bGxwdHI7CisgICAgICBlbHNlCisgICAgICAgIEluZm8tPlByZWRzID0gc3RhdGljX2Nhc3Q8QkJJbmZvICoqPihBbGxvY2F0b3IuQWxsb2NhdGUoCisgICAgICAgICAgICBJbmZvLT5OdW1QcmVkcyAqIHNpemVvZihCQkluZm8gKiksIGFsaWdub2YoQkJJbmZvICopKSk7CisKKyAgICAgIGZvciAodW5zaWduZWQgcCA9IDA7IHAgIT0gSW5mby0+TnVtUHJlZHM7ICsrcCkgeworICAgICAgICBCbGtUICpQcmVkID0gUHJlZHNbcF07CisgICAgICAgIC8vIENoZWNrIGlmIEJCTWFwIGFscmVhZHkgaGFzIGEgQkJJbmZvIGZvciB0aGUgcHJlZGVjZXNzb3IgYmxvY2suCisgICAgICAgIHR5cGVuYW1lIEJCTWFwVHk6OnZhbHVlX3R5cGUgJkJCTWFwQnVja2V0ID0KKyAgICAgICAgICBCQk1hcC5GaW5kQW5kQ29uc3RydWN0KFByZWQpOworICAgICAgICBpZiAoQkJNYXBCdWNrZXQuc2Vjb25kKSB7CisgICAgICAgICAgSW5mby0+UHJlZHNbcF0gPSBCQk1hcEJ1Y2tldC5zZWNvbmQ7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgQkJJbmZvIGZvciB0aGUgcHJlZGVjZXNzb3IuCisgICAgICAgIFZhbFQgUHJlZFZhbCA9IEF2YWlsYWJsZVZhbHMtPmxvb2t1cChQcmVkKTsKKyAgICAgICAgQkJJbmZvICpQcmVkSW5mbyA9IG5ldyAoQWxsb2NhdG9yKSBCQkluZm8oUHJlZCwgUHJlZFZhbCk7CisgICAgICAgIEJCTWFwQnVja2V0LnNlY29uZCA9IFByZWRJbmZvOworICAgICAgICBJbmZvLT5QcmVkc1twXSA9IFByZWRJbmZvOworCisgICAgICAgIGlmIChQcmVkSW5mby0+QXZhaWxhYmxlVmFsKSB7CisgICAgICAgICAgUm9vdExpc3QucHVzaF9iYWNrKFByZWRJbmZvKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBXb3JrTGlzdC5wdXNoX2JhY2soUHJlZEluZm8pOworICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdyB0aGF0IHdlIGtub3cgd2hhdCBibG9ja3MgYXJlIGJhY2t3YXJkcy1yZWFjaGFibGUgZnJvbSB0aGUgc3RhcnRpbmcKKyAgICAvLyBibG9jaywgZG8gYSBmb3J3YXJkIGRlcHRoLWZpcnN0IHRyYXZlcnNhbCB0byBhc3NpZ24gcG9zdG9yZGVyIG51bWJlcnMKKyAgICAvLyB0byB0aG9zZSBibG9ja3MuCisgICAgQkJJbmZvICpQc2V1ZG9FbnRyeSA9IG5ldyAoQWxsb2NhdG9yKSBCQkluZm8obnVsbHB0ciwgMCk7CisgICAgdW5zaWduZWQgQmxrTnVtID0gMTsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIHdvcmtsaXN0IHdpdGggdGhlIHJvb3RzIGZyb20gdGhlIGJhY2t3YXJkIHRyYXZlcnNhbC4KKyAgICB3aGlsZSAoIVJvb3RMaXN0LmVtcHR5KCkpIHsKKyAgICAgIEluZm8gPSBSb290TGlzdC5wb3BfYmFja192YWwoKTsKKyAgICAgIEluZm8tPklEb20gPSBQc2V1ZG9FbnRyeTsKKyAgICAgIEluZm8tPkJsa051bSA9IC0xOworICAgICAgV29ya0xpc3QucHVzaF9iYWNrKEluZm8pOworICAgIH0KKworICAgIHdoaWxlICghV29ya0xpc3QuZW1wdHkoKSkgeworICAgICAgSW5mbyA9IFdvcmtMaXN0LmJhY2soKTsKKworICAgICAgaWYgKEluZm8tPkJsa051bSA9PSAtMikgeworICAgICAgICAvLyBBbGwgdGhlIHN1Y2Nlc3NvcnMgaGF2ZSBiZWVuIGhhbmRsZWQ7IGFzc2lnbiB0aGUgcG9zdG9yZGVyIG51bWJlci4KKyAgICAgICAgSW5mby0+QmxrTnVtID0gQmxrTnVtKys7CisgICAgICAgIC8vIElmIG5vdCBhIHJvb3QsIHB1dCBpdCBvbiB0aGUgQmxvY2tMaXN0LgorICAgICAgICBpZiAoIUluZm8tPkF2YWlsYWJsZVZhbCkKKyAgICAgICAgICBCbG9ja0xpc3QtPnB1c2hfYmFjayhJbmZvKTsKKyAgICAgICAgV29ya0xpc3QucG9wX2JhY2soKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIExlYXZlIHRoaXMgZW50cnkgb24gdGhlIHdvcmtsaXN0LCBidXQgc2V0IGl0cyBCbGtOdW0gdG8gbWFyayB0aGF0IGl0cworICAgICAgLy8gc3VjY2Vzc29ycyBoYXZlIGJlZW4gcHV0IG9uIHRoZSB3b3JrbGlzdC4gIFdoZW4gaXQgcmV0dXJucyB0byB0aGUgdG9wCisgICAgICAvLyB0aGUgbGlzdCwgYWZ0ZXIgaGFuZGxpbmcgaXRzIHN1Y2Nlc3NvcnMsIGl0IHdpbGwgYmUgYXNzaWduZWQgYQorICAgICAgLy8gbnVtYmVyLgorICAgICAgSW5mby0+QmxrTnVtID0gLTI7CisKKyAgICAgIC8vIEFkZCB1bnZpc2l0ZWQgc3VjY2Vzc29ycyB0byB0aGUgd29yayBsaXN0LgorICAgICAgZm9yICh0eXBlbmFtZSBUcmFpdHM6OkJsa1N1Y2NfaXRlcmF0b3IgU0kgPQorICAgICAgICAgICAgIFRyYWl0czo6QmxrU3VjY19iZWdpbihJbmZvLT5CQiksCisgICAgICAgICAgICAgRSA9IFRyYWl0czo6QmxrU3VjY19lbmQoSW5mby0+QkIpOyBTSSAhPSBFOyArK1NJKSB7CisgICAgICAgIEJCSW5mbyAqU3VjY0luZm8gPSBCQk1hcFsqU0ldOworICAgICAgICBpZiAoIVN1Y2NJbmZvIHx8IFN1Y2NJbmZvLT5CbGtOdW0pCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIFN1Y2NJbmZvLT5CbGtOdW0gPSAtMTsKKyAgICAgICAgV29ya0xpc3QucHVzaF9iYWNrKFN1Y2NJbmZvKTsKKyAgICAgIH0KKyAgICB9CisgICAgUHNldWRvRW50cnktPkJsa051bSA9IEJsa051bTsKKyAgICByZXR1cm4gUHNldWRvRW50cnk7CisgIH0KKworICAvLy8gSW50ZXJzZWN0RG9taW5hdG9ycyAtIFRoaXMgaXMgdGhlIGRhdGFmbG93IGxhdHRpY2UgIm1lZXQiIG9wZXJhdGlvbiBmb3IKKyAgLy8vIGZpbmRpbmcgZG9taW5hdG9ycy4gIEdpdmVuIHR3byBiYXNpYyBibG9ja3MsIGl0IHdhbGtzIHVwIHRoZSBkb21pbmF0b3IKKyAgLy8vIHRyZWUgdW50aWwgaXQgZmluZHMgYSBjb21tb24gZG9taW5hdG9yIG9mIGJvdGguICBJdCB1c2VzIHRoZSBwb3N0b3JkZXIKKyAgLy8vIG51bWJlciBvZiB0aGUgYmxvY2tzIHRvIGRldGVybWluZSBob3cgdG8gZG8gdGhhdC4KKyAgQkJJbmZvICpJbnRlcnNlY3REb21pbmF0b3JzKEJCSW5mbyAqQmxrMSwgQkJJbmZvICpCbGsyKSB7CisgICAgd2hpbGUgKEJsazEgIT0gQmxrMikgeworICAgICAgd2hpbGUgKEJsazEtPkJsa051bSA8IEJsazItPkJsa051bSkgeworICAgICAgICBCbGsxID0gQmxrMS0+SURvbTsKKyAgICAgICAgaWYgKCFCbGsxKQorICAgICAgICAgIHJldHVybiBCbGsyOworICAgICAgfQorICAgICAgd2hpbGUgKEJsazItPkJsa051bSA8IEJsazEtPkJsa051bSkgeworICAgICAgICBCbGsyID0gQmxrMi0+SURvbTsKKyAgICAgICAgaWYgKCFCbGsyKQorICAgICAgICAgIHJldHVybiBCbGsxOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQmxrMTsKKyAgfQorCisgIC8vLyBGaW5kRG9taW5hdG9ycyAtIENhbGN1bGF0ZSB0aGUgZG9taW5hdG9yIHRyZWUgZm9yIHRoZSBzdWJzZXQgb2YgdGhlIENGRworICAvLy8gY29ycmVzcG9uZGluZyB0byB0aGUgYmFzaWMgYmxvY2tzIG9uIHRoZSBCbG9ja0xpc3QuICBUaGlzIHVzZXMgdGhlCisgIC8vLyBhbGdvcml0aG0gZnJvbTogIkEgU2ltcGxlLCBGYXN0IERvbWluYW5jZSBBbGdvcml0aG0iIGJ5IENvb3BlciwgSGFydmV5CisgIC8vLyBhbmQgS2VubmVkeSwgcHVibGlzaGVkIGluIFNvZnR3YXJlLS1QcmFjdGljZSBhbmQgRXhwZXJpZW5jZSwgMjAwMSwKKyAgLy8vIDQ6MS0xMC4gIEJlY2F1c2UgdGhlIENGRyBzdWJzZXQgZG9lcyBub3QgaW5jbHVkZSBhbnkgZWRnZXMgbGVhZGluZyBpbnRvCisgIC8vLyBibG9ja3MgdGhhdCBkZWZpbmUgdGhlIHZhbHVlLCB0aGUgcmVzdWx0cyBhcmUgbm90IHRoZSB1c3VhbCBkb21pbmF0b3IKKyAgLy8vIHRyZWUuICBUaGUgQ0ZHIHN1YnNldCBoYXMgYSBzaW5nbGUgcHNldWRvLWVudHJ5IG5vZGUgd2l0aCBlZGdlcyB0byBhIHNldAorICAvLy8gb2Ygcm9vdCBub2RlcyBmb3IgYmxvY2tzIHRoYXQgZGVmaW5lIHRoZSB2YWx1ZS4gIFRoZSBkb21pbmF0b3JzIGZvciB0aGlzCisgIC8vLyBzdWJzZXQgQ0ZHIGFyZSBub3QgdGhlIHN0YW5kYXJkIGRvbWluYXRvcnMgYnV0IHRoZXkgYXJlIGFkZXF1YXRlIGZvcgorICAvLy8gcGxhY2luZyBQSElzIHdpdGhpbiB0aGUgc3Vic2V0IENGRy4KKyAgdm9pZCBGaW5kRG9taW5hdG9ycyhCbG9ja0xpc3RUeSAqQmxvY2tMaXN0LCBCQkluZm8gKlBzZXVkb0VudHJ5KSB7CisgICAgYm9vbCBDaGFuZ2VkOworICAgIGRvIHsKKyAgICAgIENoYW5nZWQgPSBmYWxzZTsKKyAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgbGlzdCBpbiByZXZlcnNlIG9yZGVyLCBpLmUuLCBmb3J3YXJkIG9uIENGRyBlZGdlcy4KKyAgICAgIGZvciAodHlwZW5hbWUgQmxvY2tMaXN0VHk6OnJldmVyc2VfaXRlcmF0b3IgSSA9IEJsb2NrTGlzdC0+cmJlZ2luKCksCisgICAgICAgICAgICAgRSA9IEJsb2NrTGlzdC0+cmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgICBCQkluZm8gKkluZm8gPSAqSTsKKyAgICAgICAgQkJJbmZvICpOZXdJRG9tID0gbnVsbHB0cjsKKworICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGJsb2NrJ3MgcHJlZGVjZXNzb3JzLgorICAgICAgICBmb3IgKHVuc2lnbmVkIHAgPSAwOyBwICE9IEluZm8tPk51bVByZWRzOyArK3ApIHsKKyAgICAgICAgICBCQkluZm8gKlByZWQgPSBJbmZvLT5QcmVkc1twXTsKKworICAgICAgICAgIC8vIFRyZWF0IGFuIHVucmVhY2hhYmxlIHByZWRlY2Vzc29yIGFzIGEgZGVmaW5pdGlvbiB3aXRoICd1bmRlZicuCisgICAgICAgICAgaWYgKFByZWQtPkJsa051bSA9PSAwKSB7CisgICAgICAgICAgICBQcmVkLT5BdmFpbGFibGVWYWwgPSBUcmFpdHM6OkdldFVuZGVmVmFsKFByZWQtPkJCLCBVcGRhdGVyKTsKKyAgICAgICAgICAgICgqQXZhaWxhYmxlVmFscylbUHJlZC0+QkJdID0gUHJlZC0+QXZhaWxhYmxlVmFsOworICAgICAgICAgICAgUHJlZC0+RGVmQkIgPSBQcmVkOworICAgICAgICAgICAgUHJlZC0+QmxrTnVtID0gUHNldWRvRW50cnktPkJsa051bTsKKyAgICAgICAgICAgIFBzZXVkb0VudHJ5LT5CbGtOdW0rKzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIU5ld0lEb20pCisgICAgICAgICAgICBOZXdJRG9tID0gUHJlZDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBOZXdJRG9tID0gSW50ZXJzZWN0RG9taW5hdG9ycyhOZXdJRG9tLCBQcmVkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBJRG9tIHZhbHVlIGhhcyBjaGFuZ2VkLgorICAgICAgICBpZiAoTmV3SURvbSAmJiBOZXdJRG9tICE9IEluZm8tPklEb20pIHsKKyAgICAgICAgICBJbmZvLT5JRG9tID0gTmV3SURvbTsKKyAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gd2hpbGUgKENoYW5nZWQpOworICB9CisKKyAgLy8vIElzRGVmSW5Eb21Gcm9udGllciAtIFNlYXJjaCB1cCB0aGUgZG9taW5hdG9yIHRyZWUgZnJvbSBQcmVkIHRvIElEb20gZm9yCisgIC8vLyBhbnkgYmxvY2tzIGNvbnRhaW5pbmcgZGVmaW5pdGlvbnMgb2YgdGhlIHZhbHVlLiAgSWYgb25lIGlzIGZvdW5kLCB0aGVuCisgIC8vLyB0aGUgc3VjY2Vzc29yIG9mIFByZWQgaXMgaW4gdGhlIGRvbWluYW5jZSBmcm9udGllciBmb3IgdGhlIGRlZmluaXRpb24sCisgIC8vLyBhbmQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUuCisgIGJvb2wgSXNEZWZJbkRvbUZyb250aWVyKGNvbnN0IEJCSW5mbyAqUHJlZCwgY29uc3QgQkJJbmZvICpJRG9tKSB7CisgICAgZm9yICg7IFByZWQgIT0gSURvbTsgUHJlZCA9IFByZWQtPklEb20pIHsKKyAgICAgIGlmIChQcmVkLT5EZWZCQiA9PSBQcmVkKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIEZpbmRQSElQbGFjZW1lbnQgLSBQSElzIGFyZSBuZWVkZWQgaW4gdGhlIGl0ZXJhdGVkIGRvbWluYW5jZSBmcm9udGllcnMKKyAgLy8vIG9mIHRoZSBrbm93biBkZWZpbml0aW9ucy4gIEl0ZXJhdGl2ZWx5IGFkZCBQSElzIGluIHRoZSBkb20gZnJvbnRpZXJzCisgIC8vLyB1bnRpbCBub3RoaW5nIGNoYW5nZXMuICBBbG9uZyB0aGUgd2F5LCBrZWVwIHRyYWNrIG9mIHRoZSBuZWFyZXN0CisgIC8vLyBkb21pbmF0aW5nIGRlZmluaXRpb25zIGZvciBub24tUEhJIGJsb2Nrcy4KKyAgdm9pZCBGaW5kUEhJUGxhY2VtZW50KEJsb2NrTGlzdFR5ICpCbG9ja0xpc3QpIHsKKyAgICBib29sIENoYW5nZWQ7CisgICAgZG8geworICAgICAgQ2hhbmdlZCA9IGZhbHNlOworICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBsaXN0IGluIHJldmVyc2Ugb3JkZXIsIGkuZS4sIGZvcndhcmQgb24gQ0ZHIGVkZ2VzLgorICAgICAgZm9yICh0eXBlbmFtZSBCbG9ja0xpc3RUeTo6cmV2ZXJzZV9pdGVyYXRvciBJID0gQmxvY2tMaXN0LT5yYmVnaW4oKSwKKyAgICAgICAgICAgICBFID0gQmxvY2tMaXN0LT5yZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIEJCSW5mbyAqSW5mbyA9ICpJOworCisgICAgICAgIC8vIElmIHRoaXMgYmxvY2sgYWxyZWFkeSBuZWVkcyBhIFBISSwgdGhlcmUgaXMgbm90aGluZyB0byBkbyBoZXJlLgorICAgICAgICBpZiAoSW5mby0+RGVmQkIgPT0gSW5mbykKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBEZWZhdWx0IHRvIHVzZSB0aGUgc2FtZSBkZWYgYXMgdGhlIGltbWVkaWF0ZSBkb21pbmF0b3IuCisgICAgICAgIEJCSW5mbyAqTmV3RGVmQkIgPSBJbmZvLT5JRG9tLT5EZWZCQjsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBwID0gMDsgcCAhPSBJbmZvLT5OdW1QcmVkczsgKytwKSB7CisgICAgICAgICAgaWYgKElzRGVmSW5Eb21Gcm9udGllcihJbmZvLT5QcmVkc1twXSwgSW5mby0+SURvbSkpIHsKKyAgICAgICAgICAgIC8vIE5lZWQgYSBQSEkgaGVyZS4KKyAgICAgICAgICAgIE5ld0RlZkJCID0gSW5mbzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGlmIGFueXRoaW5nIGNoYW5nZWQuCisgICAgICAgIGlmIChOZXdEZWZCQiAhPSBJbmZvLT5EZWZCQikgeworICAgICAgICAgIEluZm8tPkRlZkJCID0gTmV3RGVmQkI7CisgICAgICAgICAgQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IHdoaWxlIChDaGFuZ2VkKTsKKyAgfQorCisgIC8vLyBGaW5kQXZhaWxhYmxlVmFsIC0gSWYgdGhpcyBibG9jayByZXF1aXJlcyBhIFBISSwgZmlyc3QgY2hlY2sgaWYgYW4KKyAgLy8vIGV4aXN0aW5nIFBISSBtYXRjaGVzIHRoZSBQSEkgcGxhY2VtZW50IGFuZCByZWFjaGluZyBkZWZpbml0aW9ucyBjb21wdXRlZAorICAvLy8gZWFybGllciwgYW5kIGlmIG5vdCwgY3JlYXRlIGEgbmV3IFBISS4gIFZpc2l0IGFsbCB0aGUgYmxvY2sncworICAvLy8gcHJlZGVjZXNzb3JzIHRvIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIHZhbHVlIGZvciBlYWNoIG9uZSBhbmQgZmlsbCBpbgorICAvLy8gdGhlIGluY29taW5nIHZhbHVlcyBmb3IgYSBuZXcgUEhJLgorICB2b2lkIEZpbmRBdmFpbGFibGVWYWxzKEJsb2NrTGlzdFR5ICpCbG9ja0xpc3QpIHsKKyAgICAvLyBHbyB0aHJvdWdoIHRoZSB3b3JrbGlzdCBpbiBmb3J3YXJkIG9yZGVyIChpLmUuLCBiYWNrd2FyZCB0aHJvdWdoIHRoZSBDRkcpCisgICAgLy8gYW5kIGNoZWNrIGlmIGV4aXN0aW5nIFBISXMgY2FuIGJlIHVzZWQuICBJZiBub3QsIGNyZWF0ZSBlbXB0eSBQSElzIHdoZXJlCisgICAgLy8gdGhleSBhcmUgbmVlZGVkLgorICAgIGZvciAodHlwZW5hbWUgQmxvY2tMaXN0VHk6Oml0ZXJhdG9yIEkgPSBCbG9ja0xpc3QtPmJlZ2luKCksCisgICAgICAgICAgIEUgPSBCbG9ja0xpc3QtPmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgQkJJbmZvICpJbmZvID0gKkk7CisgICAgICAvLyBDaGVjayBpZiB0aGVyZSBuZWVkcyB0byBiZSBhIFBISSBpbiBCQi4KKyAgICAgIGlmIChJbmZvLT5EZWZCQiAhPSBJbmZvKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLy8gTG9vayBmb3IgYW4gZXhpc3RpbmcgUEhJLgorICAgICAgRmluZEV4aXN0aW5nUEhJKEluZm8tPkJCLCBCbG9ja0xpc3QpOworICAgICAgaWYgKEluZm8tPkF2YWlsYWJsZVZhbCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIFZhbFQgUEhJID0gVHJhaXRzOjpDcmVhdGVFbXB0eVBISShJbmZvLT5CQiwgSW5mby0+TnVtUHJlZHMsIFVwZGF0ZXIpOworICAgICAgSW5mby0+QXZhaWxhYmxlVmFsID0gUEhJOworICAgICAgKCpBdmFpbGFibGVWYWxzKVtJbmZvLT5CQl0gPSBQSEk7CisgICAgfQorCisgICAgLy8gTm93IGdvIGJhY2sgdGhyb3VnaCB0aGUgd29ya2xpc3QgaW4gcmV2ZXJzZSBvcmRlciB0byBmaWxsIGluIHRoZQorICAgIC8vIGFyZ3VtZW50cyBmb3IgYW55IG5ldyBQSElzIGFkZGVkIGluIHRoZSBmb3J3YXJkIHRyYXZlcnNhbC4KKyAgICBmb3IgKHR5cGVuYW1lIEJsb2NrTGlzdFR5OjpyZXZlcnNlX2l0ZXJhdG9yIEkgPSBCbG9ja0xpc3QtPnJiZWdpbigpLAorICAgICAgICAgICBFID0gQmxvY2tMaXN0LT5yZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBCQkluZm8gKkluZm8gPSAqSTsKKworICAgICAgaWYgKEluZm8tPkRlZkJCICE9IEluZm8pIHsKKyAgICAgICAgLy8gUmVjb3JkIHRoZSBhdmFpbGFibGUgdmFsdWUgYXQgam9pbiBub2RlcyB0byBzcGVlZCB1cCBzdWJzZXF1ZW50CisgICAgICAgIC8vIHVzZXMgb2YgdGhpcyBTU0FVcGRhdGVyIGZvciB0aGUgc2FtZSB2YWx1ZS4KKyAgICAgICAgaWYgKEluZm8tPk51bVByZWRzID4gMSkKKyAgICAgICAgICAoKkF2YWlsYWJsZVZhbHMpW0luZm8tPkJCXSA9IEluZm8tPkRlZkJCLT5BdmFpbGFibGVWYWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBDaGVjayBpZiB0aGlzIGJsb2NrIGNvbnRhaW5zIGEgbmV3bHkgYWRkZWQgUEhJLgorICAgICAgUGhpVCAqUEhJID0gVHJhaXRzOjpWYWx1ZUlzTmV3UEhJKEluZm8tPkF2YWlsYWJsZVZhbCwgVXBkYXRlcik7CisgICAgICBpZiAoIVBISSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYmxvY2sncyBwcmVkZWNlc3NvcnMuCisgICAgICBmb3IgKHVuc2lnbmVkIHAgPSAwOyBwICE9IEluZm8tPk51bVByZWRzOyArK3ApIHsKKyAgICAgICAgQkJJbmZvICpQcmVkSW5mbyA9IEluZm8tPlByZWRzW3BdOworICAgICAgICBCbGtUICpQcmVkID0gUHJlZEluZm8tPkJCOworICAgICAgICAvLyBTa2lwIHRvIHRoZSBuZWFyZXN0IHByZWNlZGluZyBkZWZpbml0aW9uLgorICAgICAgICBpZiAoUHJlZEluZm8tPkRlZkJCICE9IFByZWRJbmZvKQorICAgICAgICAgIFByZWRJbmZvID0gUHJlZEluZm8tPkRlZkJCOworICAgICAgICBUcmFpdHM6OkFkZFBISU9wZXJhbmQoUEhJLCBQcmVkSW5mby0+QXZhaWxhYmxlVmFsLCBQcmVkKTsKKyAgICAgIH0KKworICAgICAgREVCVUcoZGJncygpIDw8ICIgIEluc2VydGVkIFBISTogIiA8PCAqUEhJIDw8ICJcbiIpOworCisgICAgICAvLyBJZiB0aGUgY2xpZW50IHdhbnRzIHRvIGtub3cgYWJvdXQgYWxsIG5ldyBpbnN0cnVjdGlvbnMsIHRlbGwgaXQuCisgICAgICBpZiAoSW5zZXJ0ZWRQSElzKSBJbnNlcnRlZFBISXMtPnB1c2hfYmFjayhQSEkpOworICAgIH0KKyAgfQorCisgIC8vLyBGaW5kRXhpc3RpbmdQSEkgLSBMb29rIHRocm91Z2ggdGhlIFBISSBub2RlcyBpbiBhIGJsb2NrIHRvIHNlZSBpZiBhbnkgb2YKKyAgLy8vIHRoZW0gbWF0Y2ggd2hhdCBpcyBuZWVkZWQuCisgIHZvaWQgRmluZEV4aXN0aW5nUEhJKEJsa1QgKkJCLCBCbG9ja0xpc3RUeSAqQmxvY2tMaXN0KSB7CisgICAgZm9yIChhdXRvICZTb21lUEhJIDogQkItPnBoaXMoKSkgeworICAgICAgaWYgKENoZWNrSWZQSElNYXRjaGVzKCZTb21lUEhJKSkgeworICAgICAgICBSZWNvcmRNYXRjaGluZ1BISXMoQmxvY2tMaXN0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvLyBNYXRjaCBmYWlsZWQ6IGNsZWFyIGFsbCB0aGUgUEhJVGFnIHZhbHVlcy4KKyAgICAgIGZvciAodHlwZW5hbWUgQmxvY2tMaXN0VHk6Oml0ZXJhdG9yIEkgPSBCbG9ja0xpc3QtPmJlZ2luKCksCisgICAgICAgICAgICAgRSA9IEJsb2NrTGlzdC0+ZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgICAoKkkpLT5QSElUYWcgPSBudWxscHRyOworICAgIH0KKyAgfQorCisgIC8vLyBDaGVja0lmUEhJTWF0Y2hlcyAtIENoZWNrIGlmIGEgUEhJIG5vZGUgbWF0Y2hlcyB0aGUgcGxhY2VtZW50IGFuZCB2YWx1ZXMKKyAgLy8vIGluIHRoZSBCQk1hcC4KKyAgYm9vbCBDaGVja0lmUEhJTWF0Y2hlcyhQaGlUICpQSEkpIHsKKyAgICBTbWFsbFZlY3RvcjxQaGlUICosIDIwPiBXb3JrTGlzdDsKKyAgICBXb3JrTGlzdC5wdXNoX2JhY2soUEhJKTsKKworICAgIC8vIE1hcmsgdGhhdCB0aGUgYmxvY2sgY29udGFpbmluZyB0aGlzIFBISSBoYXMgYmVlbiB2aXNpdGVkLgorICAgIEJCTWFwW1BISS0+Z2V0UGFyZW50KCldLT5QSElUYWcgPSBQSEk7CisKKyAgICB3aGlsZSAoIVdvcmtMaXN0LmVtcHR5KCkpIHsKKyAgICAgIFBISSA9IFdvcmtMaXN0LnBvcF9iYWNrX3ZhbCgpOworCisgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIFBISSdzIGluY29taW5nIHZhbHVlcy4KKyAgICAgIGZvciAodHlwZW5hbWUgVHJhaXRzOjpQSElfaXRlcmF0b3IgSSA9IFRyYWl0czo6UEhJX2JlZ2luKFBISSksCisgICAgICAgICAgICAgRSA9IFRyYWl0czo6UEhJX2VuZChQSEkpOyBJICE9IEU7ICsrSSkgeworICAgICAgICBWYWxUIEluY29taW5nVmFsID0gSS5nZXRJbmNvbWluZ1ZhbHVlKCk7CisgICAgICAgIEJCSW5mbyAqUHJlZEluZm8gPSBCQk1hcFtJLmdldEluY29taW5nQmxvY2soKV07CisgICAgICAgIC8vIFNraXAgdG8gdGhlIG5lYXJlc3QgcHJlY2VkaW5nIGRlZmluaXRpb24uCisgICAgICAgIGlmIChQcmVkSW5mby0+RGVmQkIgIT0gUHJlZEluZm8pCisgICAgICAgICAgUHJlZEluZm8gPSBQcmVkSW5mby0+RGVmQkI7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgaXQgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgdmFsdWUuCisgICAgICAgIGlmIChQcmVkSW5mby0+QXZhaWxhYmxlVmFsKSB7CisgICAgICAgICAgaWYgKEluY29taW5nVmFsID09IFByZWRJbmZvLT5BdmFpbGFibGVWYWwpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBQSEkgaW4gdGhlIGNvcnJlY3QgYmxvY2suCisgICAgICAgIFBoaVQgKkluY29taW5nUEhJVmFsID0gVHJhaXRzOjpWYWx1ZUlzUEhJKEluY29taW5nVmFsLCBVcGRhdGVyKTsKKyAgICAgICAgaWYgKCFJbmNvbWluZ1BISVZhbCB8fCBJbmNvbWluZ1BISVZhbC0+Z2V0UGFyZW50KCkgIT0gUHJlZEluZm8tPkJCKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBJZiB0aGlzIGJsb2NrIGhhcyBhbHJlYWR5IGJlZW4gdmlzaXRlZCwgY2hlY2sgaWYgdGhpcyBQSEkgbWF0Y2hlcy4KKyAgICAgICAgaWYgKFByZWRJbmZvLT5QSElUYWcpIHsKKyAgICAgICAgICBpZiAoSW5jb21pbmdQSElWYWwgPT0gUHJlZEluZm8tPlBISVRhZykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBQcmVkSW5mby0+UEhJVGFnID0gSW5jb21pbmdQSElWYWw7CisKKyAgICAgICAgV29ya0xpc3QucHVzaF9iYWNrKEluY29taW5nUEhJVmFsKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gUmVjb3JkTWF0Y2hpbmdQSElzIC0gRm9yIGVhY2ggUEhJIG5vZGUgdGhhdCBtYXRjaGVzLCByZWNvcmQgaXQgaW4gYm90aAorICAvLy8gdGhlIEJCTWFwIGFuZCB0aGUgQXZhaWxhYmxlVmFscyBtYXBwaW5nLgorICB2b2lkIFJlY29yZE1hdGNoaW5nUEhJcyhCbG9ja0xpc3RUeSAqQmxvY2tMaXN0KSB7CisgICAgZm9yICh0eXBlbmFtZSBCbG9ja0xpc3RUeTo6aXRlcmF0b3IgSSA9IEJsb2NrTGlzdC0+YmVnaW4oKSwKKyAgICAgICAgICAgRSA9IEJsb2NrTGlzdC0+ZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgaWYgKFBoaVQgKlBISSA9ICgqSSktPlBISVRhZykgeworICAgICAgICBCbGtUICpCQiA9IFBISS0+Z2V0UGFyZW50KCk7CisgICAgICAgIFZhbFQgUEhJVmFsID0gVHJhaXRzOjpHZXRQSElWYWx1ZShQSEkpOworICAgICAgICAoKkF2YWlsYWJsZVZhbHMpW0JCXSA9IFBISVZhbDsKKyAgICAgICAgQkJNYXBbQkJdLT5BdmFpbGFibGVWYWwgPSBQSElWYWw7CisgICAgICB9CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyN1bmRlZiBERUJVR19UWVBFIC8vICJzc2F1cGRhdGVyIgorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1NTQVVQREFURVJJTVBMX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9TYW5pdGl6ZXJTdGF0cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1Nhbml0aXplclN0YXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM2ZTM0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9TYW5pdGl6ZXJTdGF0cy5oCkBAIC0wLDAgKzEsNTYgQEAKKy8vPT09LSBTYW5pdGl6ZXJTdGF0cy5oIC0gU2FuaXRpemVyIHN0YXRpc3RpY3MgZ2F0aGVyaW5nICAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVjbGFyZXMgZnVuY3Rpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHNhbml0aXplciBzdGF0aXN0aWNzIGdhdGhlcmluZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19TQU5JVElaRVJTVEFUU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19TQU5JVElaRVJTVEFUU19ICisKKyNpbmNsdWRlICJsbHZtL0lSL0lSQnVpbGRlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vIE51bWJlciBvZiBiaXRzIGluIGRhdGEgdGhhdCBhcmUgdXNlZCBmb3IgdGhlIHNhbml0aXplciBraW5kLiBOZWVkcyB0byBtYXRjaAorLy8gX19zYW5pdGl6ZXI6OmtLaW5kQml0cyBpbiBjb21waWxlci1ydC9saWIvc3RhdHMvc3RhdHMuaAorZW51bSB7IGtTYW5pdGl6ZXJTdGF0S2luZEJpdHMgPSAzIH07CisKK2VudW0gU2FuaXRpemVyU3RhdEtpbmQgeworICBTYW5TdGF0X0NGSV9WQ2FsbCwKKyAgU2FuU3RhdF9DRklfTlZDYWxsLAorICBTYW5TdGF0X0NGSV9EZXJpdmVkQ2FzdCwKKyAgU2FuU3RhdF9DRklfVW5yZWxhdGVkQ2FzdCwKKyAgU2FuU3RhdF9DRklfSUNhbGwsCit9OworCitzdHJ1Y3QgU2FuaXRpemVyU3RhdFJlcG9ydCB7CisgIFNhbml0aXplclN0YXRSZXBvcnQoTW9kdWxlICpNKTsKKworICAvLy8gR2VuZXJhdGVzIGNvZGUgaW50byBCIHRoYXQgaW5jcmVtZW50cyBhIGxvY2F0aW9uLXNwZWNpZmljIGNvdW50ZXIgdGFnZ2VkCisgIC8vLyB3aXRoIHRoZSBnaXZlbiBzYW5pdGl6ZXIga2luZCBTSy4KKyAgdm9pZCBjcmVhdGUoSVJCdWlsZGVyPD4gJkIsIFNhbml0aXplclN0YXRLaW5kIFNLKTsKKworICAvLy8gRmluYWxpemUgbW9kdWxlIHN0YXRzIGFycmF5IGFuZCBhZGQgZ2xvYmFsIGNvbnN0cnVjdG9yIHRvIHJlZ2lzdGVyIGl0LgorICB2b2lkIGZpbmlzaCgpOworCitwcml2YXRlOgorICBNb2R1bGUgKk07CisgIEdsb2JhbFZhcmlhYmxlICpNb2R1bGVTdGF0c0dWOworICBBcnJheVR5cGUgKlN0YXRUeTsKKyAgU3RydWN0VHlwZSAqRW1wdHlNb2R1bGVTdGF0c1R5OworCisgIHN0ZDo6dmVjdG9yPENvbnN0YW50ICo+IEluaXRzOworICBBcnJheVR5cGUgKm1ha2VNb2R1bGVTdGF0c0FycmF5VHkoKTsKKyAgU3RydWN0VHlwZSAqbWFrZU1vZHVsZVN0YXRzVHkoKTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU2ltcGxpZnlJbmRWYXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9TaW1wbGlmeUluZFZhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZGZlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU2ltcGxpZnlJbmRWYXIuaApAQCAtMCwwICsxLDYwIEBACisvLz09PS0tIGxsdm0vVHJhbnNmb3Jtcy9VdGlscy9TaW1wbGlmeUluZFZhci5oIC0gSW5kdmFyIFV0aWxzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGluIGludGVyZmFjZSBmb3IgaW5kdWN0aW9uIHZhcmlhYmxlIHNpbXBsaWZpY2F0aW9uLiBJdCBkb2VzCisvLyBub3QgZGVmaW5lIGFueSBhY3R1YWwgcGFzcyBvciBwb2xpY3ksIGJ1dCBwcm92aWRlcyBhIHNpbmdsZSBmdW5jdGlvbiB0bworLy8gc2ltcGxpZnkgYSBsb29wJ3MgaW5kdWN0aW9uIHZhcmlhYmxlcyBiYXNlZCBvbiBTY2FsYXJFdm9sdXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfU0lNUExJRllJTkRWQVJfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfU0lNUExJRllJTkRWQVJfSAorCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIENhc3RJbnN0OworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIExvb3A7CitjbGFzcyBMb29wSW5mbzsKK2NsYXNzIFBISU5vZGU7CitjbGFzcyBTY2FsYXJFdm9sdXRpb247CitjbGFzcyBTQ0VWRXhwYW5kZXI7CisKKy8vLyBJbnRlcmZhY2UgZm9yIHZpc2l0aW5nIGludGVyZXN0aW5nIElWIHVzZXJzIHRoYXQgYXJlIHJlY29nbml6ZWQgYnV0IG5vdAorLy8vIHNpbXBsaWZpZWQgYnkgdGhpcyB1dGlsaXR5LgorY2xhc3MgSVZWaXNpdG9yIHsKK3Byb3RlY3RlZDoKKyAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyOworCisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHVibGljOgorICBJVlZpc2l0b3IoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgfklWVmlzaXRvcigpID0gZGVmYXVsdDsKKworICBjb25zdCBEb21pbmF0b3JUcmVlICpnZXREb21UcmVlKCkgY29uc3QgeyByZXR1cm4gRFQ7IH0KKyAgdmlydHVhbCB2b2lkIHZpc2l0Q2FzdChDYXN0SW5zdCAqQ2FzdCkgPSAwOworfTsKKworLy8vIHNpbXBsaWZ5VXNlcnNPZklWIC0gU2ltcGxpZnkgaW5zdHJ1Y3Rpb25zIHRoYXQgdXNlIHRoaXMgaW5kdWN0aW9uIHZhcmlhYmxlCisvLy8gYnkgdXNpbmcgU2NhbGFyRXZvbHV0aW9uIHRvIGFuYWx5emUgdGhlIElWJ3MgcmVjdXJyZW5jZS4KK2Jvb2wgc2ltcGxpZnlVc2Vyc09mSVYoUEhJTm9kZSAqQ3VycklWLCBTY2FsYXJFdm9sdXRpb24gKlNFLCBEb21pbmF0b3JUcmVlICpEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgTG9vcEluZm8gKkxJLCBTbWFsbFZlY3RvckltcGw8V2Vha1RyYWNraW5nVkg+ICZEZWFkLAorICAgICAgICAgICAgICAgICAgICAgICBTQ0VWRXhwYW5kZXIgJlJld3JpdGVyLCBJVlZpc2l0b3IgKlYgPSBudWxscHRyKTsKKworLy8vIFNpbXBsaWZ5TG9vcElWcyAtIFNpbXBsaWZ5IHVzZXJzIG9mIGluZHVjdGlvbiB2YXJpYWJsZXMgd2l0aGluIHRoaXMKKy8vLyBsb29wLiBUaGlzIGRvZXMgbm90IGFjdHVhbGx5IGNoYW5nZSBvciBhZGQgSVZzLgorYm9vbCBzaW1wbGlmeUxvb3BJVnMoTG9vcCAqTCwgU2NhbGFyRXZvbHV0aW9uICpTRSwgRG9taW5hdG9yVHJlZSAqRFQsCisgICAgICAgICAgICAgICAgICAgICBMb29wSW5mbyAqTEksIFNtYWxsVmVjdG9ySW1wbDxXZWFrVHJhY2tpbmdWSD4gJkRlYWQpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1NJTVBMSUZZSU5EVkFSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9TaW1wbGlmeUluc3RydWN0aW9ucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NpbXBsaWZ5SW5zdHJ1Y3Rpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4Mzg2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9TaW1wbGlmeUluc3RydWN0aW9ucy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vPT09LSBTaW1wbGlmeUluc3RydWN0aW9ucy5oIC0gUmVtb3ZlIHJlZHVuZGFudCBpbnN0cnVjdGlvbnMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpcyBhIHV0aWxpdHkgcGFzcyB1c2VkIGZvciB0ZXN0aW5nIHRoZSBJbnN0cnVjdGlvblNpbXBsaWZ5IGFuYWx5c2lzLgorLy8gVGhlIGFuYWx5c2lzIGlzIGFwcGxpZWQgdG8gZXZlcnkgaW5zdHJ1Y3Rpb24sIGFuZCBpZiBpdCBzaW1wbGlmaWVzIHRoZW4gdGhlCisvLyBpbnN0cnVjdGlvbiBpcyByZXBsYWNlZCBieSB0aGUgc2ltcGxpZmljYXRpb24uICBJZiB5b3UgYXJlIGxvb2tpbmcgZm9yIGEgcGFzcworLy8gdGhhdCBwZXJmb3JtcyBzZXJpb3VzIGluc3RydWN0aW9uIGZvbGRpbmcsIHVzZSB0aGUgaW5zdGNvbWJpbmUgcGFzcyBpbnN0ZWFkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1NJTVBMSUZZSU5TVFJVQ1RJT05TX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1NJTVBMSUZZSU5TVFJVQ1RJT05TX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVGhpcyBwYXNzIHJlbW92ZXMgcmVkdW5kYW50IGluc3RydWN0aW9ucy4KK2NsYXNzIEluc3RTaW1wbGlmaWVyUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPEluc3RTaW1wbGlmaWVyUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19TSU1QTElGWUlOU1RSVUNUSU9OU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU2ltcGxpZnlMaWJDYWxscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NpbXBsaWZ5TGliQ2FsbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2E2MmY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NpbXBsaWZ5TGliQ2FsbHMuaApAQCAtMCwwICsxLDE4MyBAQAorLy89PT0tIFNpbXBsaWZ5TGliQ2FsbHMuaCAtIExpYnJhcnkgY2FsbCBzaW1wbGlmaWVyIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZXhwb3NlcyBhbiBpbnRlcmZhY2UgdG8gYnVpbGQgc29tZSBDIGxhbmd1YWdlIGxpYmNhbGxzIGZvcgorLy8gb3B0aW1pemF0aW9uIHBhc3NlcyB0aGF0IG5lZWQgdG8gY2FsbCB0aGUgdmFyaW91cyBmdW5jdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfU0lNUExJRllMSUJDQUxMU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19TSU1QTElGWUxJQkNBTExTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVGFyZ2V0TGlicmFyeUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0lSQnVpbGRlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBTdHJpbmdSZWY7CitjbGFzcyBWYWx1ZTsKK2NsYXNzIENhbGxJbnN0OworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyOworCisvLy8gXGJyaWVmIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBzaW1wbGlmaWNhdGlvbnMgZm9yIGNhbGxzIHRvIGZvcnRpZmllZCBsaWJyYXJ5CisvLy8gZnVuY3Rpb25zIChfX3N0KmNweV9jaGssIF9fbWVtY3B5X2NoaywgX19tZW1tb3ZlX2NoaywgX19tZW1zZXRfY2hrKSwgdG8sCisvLy8gd2hlbiBwb3NzaWJsZSwgcmVwbGFjZSB0aGVtIHdpdGggdGhlaXIgbm9uLWNoZWNraW5nIGNvdW50ZXJwYXJ0cy4KKy8vLyBPdGhlciBvcHRpbWl6YXRpb25zIGNhbiBhbHNvIGJlIGRvbmUsIGJ1dCBpdCdzIHBvc3NpYmxlIHRvIGRpc2FibGUgdGhlbSBhbmQKKy8vLyBvbmx5IHNpbXBsaWZ5IG5lZWRsZXNzIHVzZSBvZiB0aGUgY2hlY2tpbmcgdmVyc2lvbnMgKHdoZW4gdGhlIG9iamVjdCBzaXplCisvLy8gaXMgdW5rbm93bikgYnkgcGFzc2luZyB0cnVlIGZvciBPbmx5TG93ZXJVbmtub3duU2l6ZS4KK2NsYXNzIEZvcnRpZmllZExpYkNhbGxTaW1wbGlmaWVyIHsKK3ByaXZhdGU6CisgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEk7CisgIGJvb2wgT25seUxvd2VyVW5rbm93blNpemU7CisKK3B1YmxpYzoKKyAgRm9ydGlmaWVkTGliQ2FsbFNpbXBsaWZpZXIoY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPbmx5TG93ZXJVbmtub3duU2l6ZSA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIFRha2UgdGhlIGdpdmVuIGNhbGwgaW5zdHJ1Y3Rpb24gYW5kIHJldHVybiBhIG1vcmUKKyAgLy8vIG9wdGltYWwgdmFsdWUgdG8gcmVwbGFjZSB0aGUgaW5zdHJ1Y3Rpb24gd2l0aCBvciAwIGlmIGEgbW9yZQorICAvLy8gb3B0aW1hbCBmb3JtIGNhbid0IGJlIGZvdW5kLgorICAvLy8gVGhlIGNhbGwgbXVzdCBub3QgYmUgYW4gaW5kaXJlY3QgY2FsbC4KKyAgVmFsdWUgKm9wdGltaXplQ2FsbChDYWxsSW5zdCAqQ0kpOworCitwcml2YXRlOgorICBWYWx1ZSAqb3B0aW1pemVNZW1DcHlDaGsoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZU1lbU1vdmVDaGsoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZU1lbVNldENoayhDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKworICAvLyBTdHIvU3RwIGNweSBhcmUgc2ltaWxhciBlbm91Z2ggdG8gYmUgaGFuZGxlZCBpbiB0aGUgc2FtZSBmdW5jdGlvbnMuCisgIFZhbHVlICpvcHRpbWl6ZVN0cnBDcHlDaGsoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQiwgTGliRnVuYyBGdW5jKTsKKyAgVmFsdWUgKm9wdGltaXplU3RycE5DcHlDaGsoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQiwgTGliRnVuYyBGdW5jKTsKKworICAvLy8gXGJyaWVmIENoZWNrcyB3aGV0aGVyIHRoZSBjYWxsIFxwIENJIHRvIGEgZm9ydGlmaWVkIGxpYmNhbGwgaXMgZm9sZGFibGUKKyAgLy8vIHRvIHRoZSBub24tZm9ydGlmaWVkIHZlcnNpb24uCisgIGJvb2wgaXNGb3J0aWZpZWRDYWxsRm9sZGFibGUoQ2FsbEluc3QgKkNJLCB1bnNpZ25lZCBPYmpTaXplT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZU9wLCBib29sIGlzU3RyaW5nKTsKK307CisKKy8vLyBMaWJDYWxsU2ltcGxpZmllciAtIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIGNvbGxlY3Rpb24gb2Ygb3B0aW1pemF0aW9ucworLy8vIHRoYXQgcmVwbGFjZSB3ZWxsIGZvcm1lZCBjYWxscyB0byBsaWJyYXJ5IGZ1bmN0aW9ucyB3aXRoIGEgbW9yZSBvcHRpbWFsCisvLy8gZm9ybS4gIEZvciBleGFtcGxlLCByZXBsYWNpbmcgJ3ByaW50ZigiSGVsbG8hIiknIHdpdGggJ3B1dHMoIkhlbGxvISIpJy4KK2NsYXNzIExpYkNhbGxTaW1wbGlmaWVyIHsKK3ByaXZhdGU6CisgIEZvcnRpZmllZExpYkNhbGxTaW1wbGlmaWVyIEZvcnRpZmllZFNpbXBsaWZpZXI7CisgIGNvbnN0IERhdGFMYXlvdXQgJkRMOworICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJOworICBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICZPUkU7CisgIGJvb2wgVW5zYWZlRlBTaHJpbms7CisgIGZ1bmN0aW9uX3JlZjx2b2lkKEluc3RydWN0aW9uICosIFZhbHVlICopPiBSZXBsYWNlcjsKKworICAvLy8gXGJyaWVmIEludGVybmFsIHdyYXBwZXIgZm9yIFJBVVcgdGhhdCBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KKyAgLy8vCisgIC8vLyBPdGhlciB1c2VycyBtYXkgcHJvdmlkZSBhbiBhbHRlcm5hdGUgZnVuY3Rpb24gd2l0aCB0aGlzIHNpZ25hdHVyZSBpbnN0ZWFkCisgIC8vLyBvZiB0aGlzIG9uZS4KKyAgc3RhdGljIHZvaWQgcmVwbGFjZUFsbFVzZXNXaXRoRGVmYXVsdChJbnN0cnVjdGlvbiAqSSwgVmFsdWUgKldpdGgpOworCisgIC8vLyBcYnJpZWYgUmVwbGFjZSBhbiBpbnN0cnVjdGlvbidzIHVzZXMgd2l0aCBhIHZhbHVlIHVzaW5nIG91ciByZXBsYWNlci4KKyAgdm9pZCByZXBsYWNlQWxsVXNlc1dpdGgoSW5zdHJ1Y3Rpb24gKkksIFZhbHVlICpXaXRoKTsKKworcHVibGljOgorICBMaWJDYWxsU2ltcGxpZmllcihjb25zdCBEYXRhTGF5b3V0ICZETCwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSwKKyAgICAgICAgICAgICAgICAgICAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAmT1JFLAorICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9yZWY8dm9pZChJbnN0cnVjdGlvbiAqLCBWYWx1ZSAqKT4gUmVwbGFjZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGxhY2VBbGxVc2VzV2l0aERlZmF1bHQpOworCisgIC8vLyBvcHRpbWl6ZUNhbGwgLSBUYWtlIHRoZSBnaXZlbiBjYWxsIGluc3RydWN0aW9uIGFuZCByZXR1cm4gYSBtb3JlCisgIC8vLyBvcHRpbWFsIHZhbHVlIHRvIHJlcGxhY2UgdGhlIGluc3RydWN0aW9uIHdpdGggb3IgMCBpZiBhIG1vcmUKKyAgLy8vIG9wdGltYWwgZm9ybSBjYW4ndCBiZSBmb3VuZC4gIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgdmFsdWUgbWF5CisgIC8vLyBiZSBlcXVhbCB0byB0aGUgaW5zdHJ1Y3Rpb24gYmVpbmcgb3B0aW1pemVkLiAgSW4gdGhpcyBjYXNlIGFsbAorICAvLy8gb3RoZXIgaW5zdHJ1Y3Rpb25zIHRoYXQgdXNlIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiB3ZXJlIG1vZGlmaWVkCisgIC8vLyBhbmQgdGhlIGdpdmVuIGluc3RydWN0aW9uIGlzIGRlYWQuCisgIC8vLyBUaGUgY2FsbCBtdXN0IG5vdCBiZSBhbiBpbmRpcmVjdCBjYWxsLgorICBWYWx1ZSAqb3B0aW1pemVDYWxsKENhbGxJbnN0ICpDSSk7CisKK3ByaXZhdGU6CisgIC8vIFN0cmluZyBhbmQgTWVtb3J5IExpYnJhcnkgQ2FsbCBPcHRpbWl6YXRpb25zCisgIFZhbHVlICpvcHRpbWl6ZVN0ckNhdChDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplU3RyTkNhdChDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplU3RyQ2hyKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVTdHJSQ2hyKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVTdHJDbXAoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVN0ck5DbXAoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVN0ckNweShDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplU3RwQ3B5KENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVTdHJOQ3B5KENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVTdHJMZW4oQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVN0clBCcmsoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVN0clRvKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVTdHJTcG4oQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVN0ckNTcG4oQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVN0clN0cihDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplTWVtQ2hyKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVNZW1DbXAoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZU1lbUNweShDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplTWVtTW92ZShDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplTWVtU2V0KENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVXY3NsZW4oQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIC8vIFdyYXBwZXIgZm9yIGFsbCBTdHJpbmcvTWVtb3J5IExpYnJhcnkgQ2FsbCBPcHRpbWl6YXRpb25zCisgIFZhbHVlICpvcHRpbWl6ZVN0cmluZ01lbW9yeUxpYkNhbGwoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisKKyAgLy8gTWF0aCBMaWJyYXJ5IE9wdGltaXphdGlvbnMKKyAgVmFsdWUgKm9wdGltaXplQ0FicyhDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplQ29zKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVQb3coQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpyZXBsYWNlUG93V2l0aFNxcnQoQ2FsbEluc3QgKlBvdywgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVFeHAyKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVGTWluRk1heChDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplTG9nKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVTcXJ0KENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVTaW5Db3NQaShDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplVGFuKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICAvLyBXcmFwcGVyIGZvciBhbGwgZmxvYXRpbmcgcG9pbnQgbGlicmFyeSBjYWxsIG9wdGltaXphdGlvbnMKKyAgVmFsdWUgKm9wdGltaXplRmxvYXRpbmdQb2ludExpYkNhbGwoQ2FsbEluc3QgKkNJLCBMaWJGdW5jIEZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSQnVpbGRlcjw+ICZCKTsKKworICAvLyBJbnRlZ2VyIExpYnJhcnkgQ2FsbCBPcHRpbWl6YXRpb25zCisgIFZhbHVlICpvcHRpbWl6ZUZGUyhDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplRmxzKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVBYnMoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZUlzRGlnaXQoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZUlzQXNjaWkoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVRvQXNjaWkoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisKKyAgLy8gRm9ybWF0dGluZyBhbmQgSU8gTGlicmFyeSBDYWxsIE9wdGltaXphdGlvbnMKKyAgVmFsdWUgKm9wdGltaXplRXJyb3JSZXBvcnRpbmcoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFN0cmVhbUFyZyA9IC0xKTsKKyAgVmFsdWUgKm9wdGltaXplUHJpbnRGKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVTUHJpbnRGKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVGUHJpbnRGKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVGV3JpdGUoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZUZQdXRzKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVQdXRzKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworCisgIC8vIEhlbHBlciBtZXRob2RzCisgIFZhbHVlICplbWl0U3RyTGVuTWVtQ3B5KFZhbHVlICpTcmMsIFZhbHVlICpEc3QsIHVpbnQ2NF90IExlbiwgSVJCdWlsZGVyPD4gJkIpOworICB2b2lkIGNsYXNzaWZ5QXJnVXNlKFZhbHVlICpWYWwsIEZ1bmN0aW9uICpGLCBib29sIElzRmxvYXQsCisgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPENhbGxJbnN0ICo+ICZTaW5DYWxscywKKyAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q2FsbEluc3QgKj4gJkNvc0NhbGxzLAorICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxDYWxsSW5zdCAqPiAmU2luQ29zQ2FsbHMpOworICBWYWx1ZSAqb3B0aW1pemVQcmludEZTdHJpbmcoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVNQcmludEZTdHJpbmcoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZUZQcmludEZTdHJpbmcoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisKKyAgLy8vIGhhc0Zsb2F0VmVyc2lvbiAtIENoZWNrcyBpZiB0aGVyZSBpcyBhIGZsb2F0IHZlcnNpb24gb2YgdGhlIHNwZWNpZmllZAorICAvLy8gZnVuY3Rpb24gYnkgY2hlY2tpbmcgZm9yIGFuIGV4aXN0aW5nIGZ1bmN0aW9uIHdpdGggbmFtZSBGdW5jTmFtZSArIGYKKyAgYm9vbCBoYXNGbG9hdFZlcnNpb24oU3RyaW5nUmVmIEZ1bmNOYW1lKTsKKworICAvLy8gU2hhcmVkIGNvZGUgdG8gb3B0aW1pemUgc3RybGVuK3djc2xlbi4KKyAgVmFsdWUgKm9wdGltaXplU3RyaW5nTGVuZ3RoKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIsIHVuc2lnbmVkIENoYXJTaXplKTsKK307Cit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9TcGxpdE1vZHVsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NwbGl0TW9kdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJjMzFmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9TcGxpdE1vZHVsZS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vPT09LSBTcGxpdE1vZHVsZS5oIC0gU3BsaXQgYSBtb2R1bGUgaW50byBwYXJ0aXRpb25zIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGZ1bmN0aW9uIGxsdm06OlNwbGl0TW9kdWxlLCB3aGljaCBzcGxpdHMgYSBtb2R1bGUKKy8vIGludG8gbXVsdGlwbGUgbGlua2FibGUgcGFydGl0aW9ucy4gSXQgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHBhcmFsbGVsIGNvZGUKKy8vIGdlbmVyYXRpb24gZm9yIGxpbmstdGltZSBvcHRpbWl6YXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfU1BMSVRNT0RVTEVfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfU1BMSVRNT0RVTEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZTsKKworLy8vIFNwbGl0cyB0aGUgbW9kdWxlIE0gaW50byBOIGxpbmthYmxlIHBhcnRpdGlvbnMuIFRoZSBmdW5jdGlvbiBNb2R1bGVDYWxsYmFjaworLy8vIGlzIGNhbGxlZCBOIHRpbWVzIHBhc3NpbmcgZWFjaCBpbmRpdmlkdWFsIHBhcnRpdGlvbiBhcyB0aGUgTVBhcnQgYXJndW1lbnQuCisvLy8KKy8vLyBGSVhNRTogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkZWFsIHdpdGggdGhlIHNvbWV3aGF0IHN1YnRsZSBzeW1ib2wKKy8vLyB2aXNpYmlsaXR5IGlzc3VlcyBhcm91bmQgbW9kdWxlIHNwbGl0dGluZywgaW5jbHVkaW5nIChidXQgbm90IGxpbWl0ZWQgdG8pOgorLy8vCisvLy8gLSBJbnRlcm5hbCBzeW1ib2xzIHNob3VsZCBub3QgY29sbGlkZSB3aXRoIHN5bWJvbHMgZGVmaW5lZCBvdXRzaWRlIHRoZQorLy8vICAgbW9kdWxlLgorLy8vIC0gSW50ZXJuYWwgc3ltYm9scyBkZWZpbmVkIGluIG1vZHVsZS1sZXZlbCBpbmxpbmUgYXNtIHNob3VsZCBiZSB2aXNpYmxlIHRvCisvLy8gICBlYWNoIHBhcnRpdGlvbi4KK3ZvaWQgU3BsaXRNb2R1bGUoCisgICAgc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gTSwgdW5zaWduZWQgTiwKKyAgICBmdW5jdGlvbl9yZWY8dm9pZChzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNUGFydCk+IE1vZHVsZUNhbGxiYWNrLAorICAgIGJvb2wgUHJlc2VydmVMb2NhbHMgPSBmYWxzZSk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfU1BMSVRNT0RVTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1N5bWJvbFJld3JpdGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU3ltYm9sUmV3cml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGNhZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1N5bWJvbFJld3JpdGVyLmgKQEAgLTAsMCArMSwxNDIgQEAKKy8vPT09LSBTeW1ib2xSZXdyaXRlci5oIC0gU3ltYm9sIFJld3JpdGluZyBQYXNzIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBwcm90b3R5cGVzIGFuZCBkZWZpbml0aW9ucyByZWxhdGVkIHRvIHRoZSBTeW1ib2wKKy8vIFJld3JpdGVyIHBhc3MuCisvLworLy8gVGhlIFN5bWJvbCBSZXdyaXRlciBwYXNzIHRha2VzIGEgc2V0IG9mIHJld3JpdGUgZGVzY3JpcHRvcnMgd2hpY2ggZGVmaW5lCisvLyB0cmFuc2Zvcm1hdGlvbnMgZm9yIHN5bWJvbCBuYW1lcy4gIFRoZXNlIGNhbiBiZSBlaXRoZXIgc2luZ2xlIG5hbWUgdG8gbmFtZQorLy8gdHJuc2Zvcm1hdGlvbiBvciBtb3JlIGJyb2FkIHJlZ3VsYXIgZXhwcmVzc2lvbiBiYXNlZCB0cmFuc2Zvcm1hdGlvbnMuCisvLworLy8gQWxsIHRoZSBmdW5jdGlvbnMgYXJlIHJlLXdyaXR0ZW4gYXQgdGhlIElSIGxldmVsLiAgVGhlIFN5bWJvbCBSZXdyaXRlciBpdHNlbGYKKy8vIGlzIGV4cG9zZWQgYXMgYSBtb2R1bGUgbGV2ZWwgcGFzcy4gIEFsbCBzeW1ib2xzIGF0IHRoZSBtb2R1bGUgbGV2ZWwgYXJlCisvLyBpdGVyYXRlZC4gIEZvciBhbnkgbWF0Y2hpbmcgc3ltYm9sLCB0aGUgcmVxdWVzdGVkIHRyYW5zZm9ybWF0aW9uIGlzIGFwcGxpZWQsCisvLyB1cGRhdGluZyByZWZlcmVuY2VzIHRvIGl0IGFzIHdlbGwgKGEgbGEgUkFVVykuICBUaGUgcmVzdWx0aW5nIGJpbmFyeSB3aWxsCisvLyBvbmx5IGNvbnRhaW4gdGhlIHJld3JpdHRlbiBzeW1ib2xzLgorLy8KKy8vIEJ5IHBlcmZvcm1pbmcgdGhpcyBvcGVyYXRpb24gaW4gdGhlIGNvbXBpbGVyLCB3ZSBhcmUgYWJsZSB0byBjYXRjaCBzeW1ib2xzCisvLyB0aGF0IHdvdWxkIG90aGVyd2lzZSBub3QgYmUgcG9zc2libGUgdG8gY2F0Y2ggKGUuZy4gaW5saW5lZCBzeW1ib2xzKS4KKy8vCisvLyBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGNsZWFubHkgdHJhbnNmb3JtIHN5bWJvbHMgd2l0aG91dCByZXNvcnRpbmcgdG8KKy8vIG92ZXJseS1jb21wbGV4IG1hY3JvIHRyaWNrcyBhbmQgdGhlIHByZS1wcm9jZXNzb3IuICBBbiBleGFtcGxlIG9mIHdoZXJlIHRoaXMKKy8vIGlzIHVzZWZ1bCBpcyB0aGUgc2FuaXRpemVycyB3aGVyZSB3ZSB3b3VsZCBsaWtlIHRvIGludGVyY2VwdCBhIHdlbGwtZGVmaW5lZAorLy8gc2V0IG9mIGZ1bmN0aW9ucyBhY3Jvc3MgdGhlIG1vZHVsZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19TWU1CT0xSRVdSSVRFUl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19TWU1CT0xSRVdSSVRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1lbW9yeUJ1ZmZlcjsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIE1vZHVsZVBhc3M7CisKK25hbWVzcGFjZSB5YW1sIHsKKworY2xhc3MgS2V5VmFsdWVOb2RlOworY2xhc3MgTWFwcGluZ05vZGU7CitjbGFzcyBTY2FsYXJOb2RlOworY2xhc3MgU3RyZWFtOworCit9IC8vIGVuZCBuYW1lc3BhY2UgeWFtbAorCituYW1lc3BhY2UgU3ltYm9sUmV3cml0ZXIgeworCisvLy8gVGhlIGJhc2ljIGVudGl0eSByZXByZXNlbnRpbmcgYSByZXdyaXRlIG9wZXJhdGlvbi4gIEl0IHNlcnZlcyBhcyB0aGUgYmFzZQorLy8vIGNsYXNzIGZvciBhbnkgcmV3cml0ZSBkZXNjcmlwdG9yLiAgSXQgaGFzIGEgY2VydGFpbiBzZXQgb2Ygc3BlY2lhbGl6YXRpb25zCisvLy8gd2hpY2ggZGVzY3JpYmUgYSBwYXJ0aWN1bGFyIHJld3JpdGUuCisvLy8KKy8vLyBUaGUgUmV3cml0ZU1hcFBhcnNlciBjYW4gYmUgdXNlZCB0byBwYXJzZSBhIG1hcHBpbmcgZmlsZSB0aGF0IHByb3ZpZGVzIHRoZQorLy8vIG1hcHBpbmcgZm9yIHJld3JpdGluZyB0aGUgc3ltYm9scy4gIFRoZSBkZXNjcmlwdG9ycyBpbmRpdmlkdWFsbHkgZGVzY3JpYmUKKy8vLyB3aGV0aGVyIHRvIHJld3JpdGUgYSBmdW5jdGlvbiwgZ2xvYmFsIHZhcmlhYmxlLCBvciBnbG9iYWwgYWxpYXMuICBFYWNoIG9mCisvLy8gdGhlc2UgY2FuIGJlIHNlbGVjdGVkIGVpdGhlciBieSBleHBsaWNpdGx5IHByb3ZpZGluZyBhIG5hbWUgZm9yIHRoZSBvbmVzIHRvCisvLy8gYmUgcmV3cml0dGVuIG9yIHByb3ZpZGluZyBhIChwb3NpeCBjb21wYXRpYmxlKSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCB3aWxsCisvLy8gc2VsZWN0IHRoZSBzeW1ib2xzIHRvIHJld3JpdGUuICBUaGlzIGRlc2NyaXB0b3IgbGlzdCBpcyBwYXNzZWQgdG8gdGhlCisvLy8gU3ltYm9sUmV3cml0ZXIgcGFzcy4KK2NsYXNzIFJld3JpdGVEZXNjcmlwdG9yIHsKK3B1YmxpYzoKKyAgZW51bSBjbGFzcyBUeXBlIHsKKyAgICBJbnZhbGlkLCAgICAgICAgLy8vIGludmFsaWQKKyAgICBGdW5jdGlvbiwgICAgICAgLy8vIGZ1bmN0aW9uIC0gZGVzY3JpcHRvciByZXdyaXRlcyBhIGZ1bmN0aW9uCisgICAgR2xvYmFsVmFyaWFibGUsIC8vLyBnbG9iYWwgdmFyaWFibGUgLSBkZXNjcmlwdG9yIHJld3JpdGVzIGEgZ2xvYmFsIHZhcmlhYmxlCisgICAgTmFtZWRBbGlhcywgICAgIC8vLyBuYW1lZCBhbGlhcyAtIGRlc2NyaXB0b3IgcmV3cml0ZXMgYSBnbG9iYWwgYWxpYXMKKyAgfTsKKworICBSZXdyaXRlRGVzY3JpcHRvcihjb25zdCBSZXdyaXRlRGVzY3JpcHRvciAmKSA9IGRlbGV0ZTsKKyAgUmV3cml0ZURlc2NyaXB0b3IgJm9wZXJhdG9yPShjb25zdCBSZXdyaXRlRGVzY3JpcHRvciAmKSA9IGRlbGV0ZTsKKyAgdmlydHVhbCB+UmV3cml0ZURlc2NyaXB0b3IoKSA9IGRlZmF1bHQ7CisKKyAgVHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorCisgIHZpcnR1YWwgYm9vbCBwZXJmb3JtT25Nb2R1bGUoTW9kdWxlICZNKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgUmV3cml0ZURlc2NyaXB0b3IoVHlwZSBUKSA6IEtpbmQoVCkge30KKworcHJpdmF0ZToKKyAgY29uc3QgVHlwZSBLaW5kOworfTsKKwordXNpbmcgUmV3cml0ZURlc2NyaXB0b3JMaXN0ID0gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxSZXdyaXRlRGVzY3JpcHRvcj4+OworCitjbGFzcyBSZXdyaXRlTWFwUGFyc2VyIHsKK3B1YmxpYzoKKyAgYm9vbCBwYXJzZShjb25zdCBzdGQ6OnN0cmluZyAmTWFwRmlsZSwgUmV3cml0ZURlc2NyaXB0b3JMaXN0ICpEZXNjcmlwdG9ycyk7CisKK3ByaXZhdGU6CisgIGJvb2wgcGFyc2Uoc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gJk1hcEZpbGUsIFJld3JpdGVEZXNjcmlwdG9yTGlzdCAqREwpOworICBib29sIHBhcnNlRW50cnkoeWFtbDo6U3RyZWFtICZTdHJlYW0sIHlhbWw6OktleVZhbHVlTm9kZSAmRW50cnksCisgICAgICAgICAgICAgICAgICBSZXdyaXRlRGVzY3JpcHRvckxpc3QgKkRMKTsKKyAgYm9vbCBwYXJzZVJld3JpdGVGdW5jdGlvbkRlc2NyaXB0b3IoeWFtbDo6U3RyZWFtICZTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlhbWw6OlNjYWxhck5vZGUgKktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWFtbDo6TWFwcGluZ05vZGUgKlZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXdyaXRlRGVzY3JpcHRvckxpc3QgKkRMKTsKKyAgYm9vbCBwYXJzZVJld3JpdGVHbG9iYWxWYXJpYWJsZURlc2NyaXB0b3IoeWFtbDo6U3RyZWFtICZTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlhbWw6OlNjYWxhck5vZGUgKktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWFtbDo6TWFwcGluZ05vZGUgKlZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXdyaXRlRGVzY3JpcHRvckxpc3QgKkRMKTsKKyAgYm9vbCBwYXJzZVJld3JpdGVHbG9iYWxBbGlhc0Rlc2NyaXB0b3IoeWFtbDo6U3RyZWFtICZZUywgeWFtbDo6U2NhbGFyTm9kZSAqSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWFtbDo6TWFwcGluZ05vZGUgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJld3JpdGVEZXNjcmlwdG9yTGlzdCAqREwpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIFN5bWJvbFJld3JpdGVyCisKK01vZHVsZVBhc3MgKmNyZWF0ZVJld3JpdGVTeW1ib2xzUGFzcygpOworTW9kdWxlUGFzcyAqY3JlYXRlUmV3cml0ZVN5bWJvbHNQYXNzKFN5bWJvbFJld3JpdGVyOjpSZXdyaXRlRGVzY3JpcHRvckxpc3QgJik7CisKK2NsYXNzIFJld3JpdGVTeW1ib2xQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48UmV3cml0ZVN5bWJvbFBhc3M+IHsKK3B1YmxpYzoKKyAgUmV3cml0ZVN5bWJvbFBhc3MoKSB7IGxvYWRBbmRQYXJzZU1hcEZpbGVzKCk7IH0KKworICBSZXdyaXRlU3ltYm9sUGFzcyhTeW1ib2xSZXdyaXRlcjo6UmV3cml0ZURlc2NyaXB0b3JMaXN0ICZETCkgeworICAgIERlc2NyaXB0b3JzLnNwbGljZShEZXNjcmlwdG9ycy5iZWdpbigpLCBETCk7CisgIH0KKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJkFNKTsKKworICAvLyBHbHVlIGZvciBvbGQgUE0KKyAgYm9vbCBydW5JbXBsKE1vZHVsZSAmTSk7CisKK3ByaXZhdGU6CisgIHZvaWQgbG9hZEFuZFBhcnNlTWFwRmlsZXMoKTsKKworICBTeW1ib2xSZXdyaXRlcjo6UmV3cml0ZURlc2NyaXB0b3JMaXN0IERlc2NyaXB0b3JzOyAgCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy9MTFZNX1RSQU5TRk9STVNfVVRJTFNfU1lNQk9MUkVXUklURVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1VuaWZ5RnVuY3Rpb25FeGl0Tm9kZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9VbmlmeUZ1bmN0aW9uRXhpdE5vZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyYzYwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9VbmlmeUZ1bmN0aW9uRXhpdE5vZGVzLmgKQEAgLTAsMCArMSw1NCBAQAorLy89PT0tLSBVbmlmeUZ1bmN0aW9uRXhpdE5vZGVzLmggLSBFbnN1cmUgZm4ncyBoYXZlIG9uZSByZXR1cm4gLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBmdW5jdGlvbnMgaGF2ZSBhdCBtb3N0IG9uZSByZXR1cm4gYW5kIG9uZQorLy8gdW53aW5kIGluc3RydWN0aW9uIGluIHRoZW0uICBBZGRpdGlvbmFsbHksIGl0IGtlZXBzIHRyYWNrIG9mIHdoaWNoIG5vZGUgaXMKKy8vIHRoZSBuZXcgZXhpdCBub2RlIG9mIHRoZSBDRkcuICBJZiB0aGVyZSBhcmUgbm8gcmV0dXJuIG9yIHVud2luZCBpbnN0cnVjdGlvbnMKKy8vIGluIHRoZSBmdW5jdGlvbiwgdGhlIGdldFJldHVybkJsb2NrL2dldFVud2luZEJsb2NrIG1ldGhvZHMgd2lsbCByZXR1cm4gYSBudWxsCisvLyBwb2ludGVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1VOSUZZRlVOQ1RJT05FWElUTk9ERVNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfVU5JRllGVU5DVElPTkVYSVROT0RFU19ICisKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3NSZWdpc3RyeS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK3N0cnVjdCBVbmlmeUZ1bmN0aW9uRXhpdE5vZGVzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgIEJhc2ljQmxvY2sgKlJldHVybkJsb2NrID0gbnVsbHB0cjsKKyAgQmFzaWNCbG9jayAqVW53aW5kQmxvY2sgPSBudWxscHRyOworICBCYXNpY0Jsb2NrICpVbnJlYWNoYWJsZUJsb2NrOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgIFVuaWZ5RnVuY3Rpb25FeGl0Tm9kZXMoKSA6IEZ1bmN0aW9uUGFzcyhJRCkgeworICAgIGluaXRpYWxpemVVbmlmeUZ1bmN0aW9uRXhpdE5vZGVzUGFzcygqUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKSk7CisgIH0KKworICAvLyBXZSBjYW4gcHJlc2VydmUgbm9uLWNyaXRpY2FsLWVkZ2VuZXNzIHdoZW4gd2UgdW5pZnkgZnVuY3Rpb24gZXhpdCBub2RlcworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vIGdldFJldHVybnxVbndpbmR8VW5yZWFjaGFibGVCbG9jayAtIFJldHVybiB0aGUgbmV3IHNpbmdsZSAob3Igbm9uZXhpc3RlbnQpCisgIC8vIHJldHVybiwgdW53aW5kLCBvciB1bnJlYWNoYWJsZSAgYmFzaWMgYmxvY2tzIGluIHRoZSBDRkcuCisgIC8vCisgIEJhc2ljQmxvY2sgKmdldFJldHVybkJsb2NrKCkgY29uc3QgeyByZXR1cm4gUmV0dXJuQmxvY2s7IH0KKyAgQmFzaWNCbG9jayAqZ2V0VW53aW5kQmxvY2soKSBjb25zdCB7IHJldHVybiBVbndpbmRCbG9jazsgfQorICBCYXNpY0Jsb2NrICpnZXRVbnJlYWNoYWJsZUJsb2NrKCkgY29uc3QgeyByZXR1cm4gVW5yZWFjaGFibGVCbG9jazsgfQorCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGU7Cit9OworCitQYXNzICpjcmVhdGVVbmlmeUZ1bmN0aW9uRXhpdE5vZGVzUGFzcygpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1VOSUZZRlVOQ1RJT05FWElUTk9ERVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1Vucm9sbExvb3AuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9VbnJvbGxMb29wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk4MzYzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9VbnJvbGxMb29wLmgKQEAgLTAsMCArMSw4MyBAQAorLy89PT0tIGxsdm0vVHJhbnNmb3Jtcy9VdGlscy9VbnJvbGxMb29wLmggLSBVbnJvbGxpbmcgdXRpbGl0aWVzIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBzb21lIGxvb3AgdW5yb2xsaW5nIHV0aWxpdGllcy4gSXQgZG9lcyBub3QgZGVmaW5lIGFueQorLy8gYWN0dWFsIHBhc3Mgb3IgcG9saWN5LCBidXQgcHJvdmlkZXMgYSBzaW5nbGUgZnVuY3Rpb24gdG8gcGVyZm9ybSBsb29wCisvLyB1bnJvbGxpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfVU5ST0xMTE9PUF9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19VTlJPTExMT09QX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9UYXJnZXRUcmFuc2Zvcm1JbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQXNzdW1wdGlvbkNhY2hlOworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBMb29wOworY2xhc3MgTG9vcEluZm87CitjbGFzcyBNRE5vZGU7CitjbGFzcyBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyOworY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworCit1c2luZyBOZXdMb29wc01hcCA9IFNtYWxsRGVuc2VNYXA8Y29uc3QgTG9vcCAqLCBMb29wICosIDQ+OworCitjb25zdCBMb29wKiBhZGRDbG9uZWRCbG9ja1RvTG9vcEluZm8oQmFzaWNCbG9jayAqT3JpZ2luYWxCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpDbG9uZWRCQiwgTG9vcEluZm8gKkxJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld0xvb3BzTWFwICZOZXdMb29wcyk7CisKKy8vLyBSZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYSBcYyBVbnJvbGxMb29wIGludm9jYXRpb24uCitlbnVtIGNsYXNzIExvb3BVbnJvbGxSZXN1bHQgeworICAvLy8gVGhlIGxvb3Agd2FzIG5vdCBtb2RpZmllZC4KKyAgVW5tb2RpZmllZCwKKworICAvLy8gVGhlIGxvb3Agd2FzIHBhcnRpYWxseSB1bnJvbGxlZCAtLSB3ZSBzdGlsbCBoYXZlIGEgbG9vcCwgYnV0IHdpdGggYQorICAvLy8gc21hbGxlciB0cmlwIGNvdW50LiAgV2UgbWF5IGFsc28gaGF2ZSBlbWl0dGVkIGVwaWxvZ3VlIGxvb3AgaWYgdGhlIGxvb3AKKyAgLy8vIGhhZCBhIG5vbi1jb25zdGFudCB0cmlwIGNvdW50LgorICBQYXJ0aWFsbHlVbnJvbGxlZCwKKworICAvLy8gVGhlIGxvb3Agd2FzIGZ1bGx5IHVucm9sbGVkIGludG8gc3RyYWlnaHQtbGluZSBjb2RlLiAgV2Ugbm8gbG9uZ2VyIGhhdmUKKyAgLy8vIGFueSBiYWNrLWVkZ2VzLgorICBGdWxseVVucm9sbGVkCit9OworCitMb29wVW5yb2xsUmVzdWx0IFVucm9sbExvb3AoTG9vcCAqTCwgdW5zaWduZWQgQ291bnQsIHVuc2lnbmVkIFRyaXBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEZvcmNlLCBib29sIEFsbG93UnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93RXhwZW5zaXZlVHJpcENvdW50LCBib29sIFByZXNlcnZlQ29uZEJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUHJlc2VydmVPbmx5Rmlyc3QsIHVuc2lnbmVkIFRyaXBNdWx0aXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQZWVsQ291bnQsIGJvb2wgVW5yb2xsUmVtYWluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BJbmZvICpMSSwgU2NhbGFyRXZvbHV0aW9uICpTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICpEVCwgQXNzdW1wdGlvbkNhY2hlICpBQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICpPUkUsIGJvb2wgUHJlc2VydmVMQ1NTQSk7CisKK2Jvb2wgVW5yb2xsUnVudGltZUxvb3BSZW1haW5kZXIoTG9vcCAqTCwgdW5zaWduZWQgQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dFeHBlbnNpdmVUcmlwQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVXNlRXBpbG9nUmVtYWluZGVyLCBib29sIFVucm9sbFJlbWFpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcEluZm8gKkxJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gKlNFLCBEb21pbmF0b3JUcmVlICpEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbkNhY2hlICpBQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQcmVzZXJ2ZUxDU1NBKTsKKwordm9pZCBjb21wdXRlUGVlbENvdW50KExvb3AgKkwsIHVuc2lnbmVkIExvb3BTaXplLAorICAgICAgICAgICAgICAgICAgICAgIFRhcmdldFRyYW5zZm9ybUluZm86OlVucm9sbGluZ1ByZWZlcmVuY2VzICZVUCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmVHJpcENvdW50LCBTY2FsYXJFdm9sdXRpb24gJlNFKTsKKworYm9vbCBwZWVsTG9vcChMb29wICpMLCB1bnNpZ25lZCBQZWVsQ291bnQsIExvb3BJbmZvICpMSSwgU2NhbGFyRXZvbHV0aW9uICpTRSwKKyAgICAgICAgICAgICAgRG9taW5hdG9yVHJlZSAqRFQsIEFzc3VtcHRpb25DYWNoZSAqQUMsIGJvb2wgUHJlc2VydmVMQ1NTQSk7CisKK01ETm9kZSAqR2V0VW5yb2xsTWV0YWRhdGEoTUROb2RlICpMb29wSUQsIFN0cmluZ1JlZiBOYW1lKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19VTlJPTExMT09QX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9WTkNvZXJjaW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvVk5Db2VyY2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYWE5YjYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvVk5Db2VyY2lvbi5oCkBAIC0wLDAgKzEsMTA4IEBACisvLz09PS0gVk5Db2VyY2lvbi5oIC0gVmFsdWUgTnVtYmVyaW5nIENvZXJjaW9uIFV0aWxpdGllcyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlIC8gVGhpcyBmaWxlIHByb3ZpZGVzIHJvdXRpbmVzIHVzZWQgYnkgTExWTSdzIHZhbHVlIG51bWJlcmluZyBwYXNzZXMgdG8KKy8vLyBwZXJmb3JtIHZhcmlvdXMgZm9ybXMgb2YgdmFsdWUgZXh0cmFjdGlvbiBmcm9tIG1lbW9yeSB3aGVuIHRoZSB0eXBlcyBhcmUgbm90CisvLy8gaWRlbnRpY2FsLiAgRm9yIGV4YW1wbGUsIGdpdmVuCisvLy8KKy8vLyBzdG9yZSBpMzIgOCwgaTMyIColZm9vCisvLy8gJWEgPSBiaXRjYXN0IGkzMiAqJWZvbyB0byBpMTYKKy8vLyAldmFsID0gbG9hZCBpMTYsIGkxNiAqJWEKKy8vLworLy8vIEl0IHBvc3NpYmxlIHRvIGV4dHJhY3QgdGhlIHZhbHVlIG9mIHRoZSBsb2FkIG9mICVhIGZyb20gdGhlIHN0b3JlIHRvICVmb28uCisvLy8gVGhlc2Ugcm91dGluZXMga25vdyBob3cgdG8gdGVsbCB3aGV0aGVyIHRoZXkgY2FuIGRvIHRoYXQgKHRoZSBhbmFseXplKgorLy8vIHJvdXRpbmVzKSwgYW5kIGNhbiBhbHNvIGluc2VydCB0aGUgbmVjZXNzYXJ5IElSIHRvIGRvIGl0ICh0aGUgZ2V0KgorLy8vIHJvdXRpbmVzKS4KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfVk5DT0VSQ0lPTl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19WTkNPRVJDSU9OX0gKKyNpbmNsdWRlICJsbHZtL0lSL0lSQnVpbGRlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIFN0b3JlSW5zdDsKK2NsYXNzIExvYWRJbnN0OworY2xhc3MgTWVtSW50cmluc2ljOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBWYWx1ZTsKK2NsYXNzIFR5cGU7CitjbGFzcyBEYXRhTGF5b3V0OworbmFtZXNwYWNlIFZOQ29lcmNpb24geworLy8vIFJldHVybiB0cnVlIGlmIENvZXJjZUF2YWlsYWJsZVZhbHVlVG9Mb2FkVHlwZSB3b3VsZCBzdWNjZWVkIGlmIGl0IHdhcworLy8vIGNhbGxlZC4KK2Jvb2wgY2FuQ29lcmNlTXVzdEFsaWFzZWRWYWx1ZVRvTG9hZChWYWx1ZSAqU3RvcmVkVmFsLCBUeXBlICpMb2FkVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpOworCisvLy8gSWYgd2Ugc2F3IGEgc3RvcmUgb2YgYSB2YWx1ZSB0byBtZW1vcnksIGFuZCB0aGVuIGEgbG9hZCBmcm9tIGEgbXVzdC1hbGlhc2VkCisvLy8gcG9pbnRlciBvZiBhIGRpZmZlcmVudCB0eXBlLCB0cnkgdG8gY29lcmNlIHRoZSBzdG9yZWQgdmFsdWUgdG8gdGhlIGxvYWRlZAorLy8vIHR5cGUuICBMb2FkZWRUeSBpcyB0aGUgdHlwZSBvZiB0aGUgbG9hZCB3ZSB3YW50IHRvIHJlcGxhY2UuICBJUkIgaXMKKy8vLyBJUkJ1aWxkZXIgdXNlZCB0byBpbnNlcnQgbmV3IGluc3RydWN0aW9ucy4KKy8vLworLy8vIElmIHdlIGNhbid0IGRvIGl0LCByZXR1cm4gbnVsbC4KK1ZhbHVlICpjb2VyY2VBdmFpbGFibGVWYWx1ZVRvTG9hZFR5cGUoVmFsdWUgKlN0b3JlZFZhbCwgVHlwZSAqTG9hZGVkVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSQnVpbGRlcjw+ICZJUkIsIGNvbnN0IERhdGFMYXlvdXQgJkRMKTsKKworLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyB3aGV0aGVyIGEgdmFsdWUgZm9yIHRoZSBwb2ludGVyIExvYWRQdHIgY2FuIGJlCisvLy8gZXh0cmFjdGVkIGZyb20gdGhlIHN0b3JlIGF0IERlcFNJLgorLy8vCisvLy8gT24gc3VjY2VzcywgaXQgcmV0dXJucyB0aGUgb2Zmc2V0IGludG8gRGVwU0kgdGhhdCBleHRyYWN0aW9uIHdvdWxkIHN0YXJ0LgorLy8vIE9uIGZhaWx1cmUsIGl0IHJldHVybnMgLTEuCitpbnQgYW5hbHl6ZUxvYWRGcm9tQ2xvYmJlcmluZ1N0b3JlKFR5cGUgKkxvYWRUeSwgVmFsdWUgKkxvYWRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlSW5zdCAqRGVwU0ksIGNvbnN0IERhdGFMYXlvdXQgJkRMKTsKKworLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyB3aGV0aGVyIGEgdmFsdWUgZm9yIHRoZSBwb2ludGVyIExvYWRQdHIgY2FuIGJlCisvLy8gZXh0cmFjdGVkIGZyb20gdGhlIGxvYWQgYXQgRGVwTEkuCisvLy8KKy8vLyBPbiBzdWNjZXNzLCBpdCByZXR1cm5zIHRoZSBvZmZzZXQgaW50byBEZXBMSSB0aGF0IGV4dHJhY3Rpb24gd291bGQgc3RhcnQuCisvLy8gT24gZmFpbHVyZSwgaXQgcmV0dXJucyAtMS4KK2ludCBhbmFseXplTG9hZEZyb21DbG9iYmVyaW5nTG9hZChUeXBlICpMb2FkVHksIFZhbHVlICpMb2FkUHRyLCBMb2FkSW5zdCAqRGVwTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpOworCisvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIHdoZXRoZXIgYSB2YWx1ZSBmb3IgdGhlIHBvaW50ZXIgTG9hZFB0ciBjYW4gYmUKKy8vLyBleHRyYWN0ZWQgZnJvbSB0aGUgbWVtb3J5IGludHJpbnNpYyBhdCBEZXBNSS4KKy8vLworLy8vIE9uIHN1Y2Nlc3MsIGl0IHJldHVybnMgdGhlIG9mZnNldCBpbnRvIERlcE1JIHRoYXQgZXh0cmFjdGlvbiB3b3VsZCBzdGFydC4KKy8vLyBPbiBmYWlsdXJlLCBpdCByZXR1cm5zIC0xLgoraW50IGFuYWx5emVMb2FkRnJvbUNsb2JiZXJpbmdNZW1JbnN0KFR5cGUgKkxvYWRUeSwgVmFsdWUgKkxvYWRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtSW50cmluc2ljICpEZXBNSSwgY29uc3QgRGF0YUxheW91dCAmREwpOworCisvLy8gSWYgYW5hbHl6ZUxvYWRGcm9tQ2xvYmJlcmluZ1N0b3JlIHJldHVybmVkIGFuIG9mZnNldCwgdGhpcyBmdW5jdGlvbiBjYW4gYmUKKy8vLyB1c2VkIHRvIGFjdHVhbGx5IHBlcmZvcm0gdGhlIGV4dHJhY3Rpb24gb2YgdGhlIGJpdHMgZnJvbSB0aGUgc3RvcmUuIEl0CisvLy8gaW5zZXJ0cyBpbnN0cnVjdGlvbnMgdG8gZG8gc28gYXQgSW5zZXJ0UHQsIGFuZCByZXR1cm5zIHRoZSBleHRyYWN0ZWQgdmFsdWUuCitWYWx1ZSAqZ2V0U3RvcmVWYWx1ZUZvckxvYWQoVmFsdWUgKlNyY1ZhbCwgdW5zaWduZWQgT2Zmc2V0LCBUeXBlICpMb2FkVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydFB0LCBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisvLyBUaGlzIGlzIHRoZSBzYW1lIGFzIGdldFN0b3JlVmFsdWVGb3JMb2FkLCBleGNlcHQgaXQgcGVyZm9ybXMgbm8gaW5zZXJ0aW9uCisvLyBJdCBvbmx5IGFsbG93cyBjb25zdGFudCBpbnB1dHMuCitDb25zdGFudCAqZ2V0Q29uc3RhbnRTdG9yZVZhbHVlRm9yTG9hZChDb25zdGFudCAqU3JjVmFsLCB1bnNpZ25lZCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpMb2FkVHksIGNvbnN0IERhdGFMYXlvdXQgJkRMKTsKKworLy8vIElmIGFuYWx5emVMb2FkRnJvbUNsb2JiZXJpbmdMb2FkIHJldHVybmVkIGFuIG9mZnNldCwgdGhpcyBmdW5jdGlvbiBjYW4gYmUKKy8vLyB1c2VkIHRvIGFjdHVhbGx5IHBlcmZvcm0gdGhlIGV4dHJhY3Rpb24gb2YgdGhlIGJpdHMgZnJvbSB0aGUgbG9hZCwgaW5jbHVkaW5nCisvLy8gYW55IG5lY2Vzc2FyeSBsb2FkIHdpZGVuaW5nLiAgSXQgaW5zZXJ0cyBpbnN0cnVjdGlvbnMgdG8gZG8gc28gYXQgSW5zZXJ0UHQsCisvLy8gYW5kIHJldHVybnMgdGhlIGV4dHJhY3RlZCB2YWx1ZS4KK1ZhbHVlICpnZXRMb2FkVmFsdWVGb3JMb2FkKExvYWRJbnN0ICpTcmNWYWwsIHVuc2lnbmVkIE9mZnNldCwgVHlwZSAqTG9hZFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydFB0LCBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisvLyBUaGlzIGlzIHRoZSBzYW1lIGFzIGdldExvYWRWYWx1ZUZvckxvYWQsIGV4Y2VwdCBpdCBpcyBnaXZlbiB0aGUgbG9hZCB2YWx1ZSBhcworLy8gYSBjb25zdGFudC4gSXQgcmV0dXJucyBudWxscHRyIGlmIGl0IHdvdWxkIHJlcXVpcmUgd2lkZW5pbmcgdGhlIGxvYWQuCitDb25zdGFudCAqZ2V0Q29uc3RhbnRMb2FkVmFsdWVGb3JMb2FkKENvbnN0YW50ICpTcmNWYWwsIHVuc2lnbmVkIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqTG9hZFR5LCBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisKKy8vLyBJZiBhbmFseXplTG9hZEZyb21DbG9iYmVyaW5nTWVtSW5zdCByZXR1cm5lZCBhbiBvZmZzZXQsIHRoaXMgZnVuY3Rpb24gY2FuIGJlCisvLy8gdXNlZCB0byBhY3R1YWxseSBwZXJmb3JtIHRoZSBleHRyYWN0aW9uIG9mIHRoZSBiaXRzIGZyb20gdGhlIG1lbW9yeQorLy8vIGludHJpbnNpYy4gIEl0IGluc2VydHMgaW5zdHJ1Y3Rpb25zIHRvIGRvIHNvIGF0IEluc2VydFB0LCBhbmQgcmV0dXJucyB0aGUKKy8vLyBleHRyYWN0ZWQgdmFsdWUuCitWYWx1ZSAqZ2V0TWVtSW5zdFZhbHVlRm9yTG9hZChNZW1JbnRyaW5zaWMgKlNyY0luc3QsIHVuc2lnbmVkIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKkxvYWRUeSwgSW5zdHJ1Y3Rpb24gKkluc2VydFB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpOworLy8gVGhpcyBpcyB0aGUgc2FtZSBhcyBnZXRTdG9yZVZhbHVlRm9yTG9hZCwgZXhjZXB0IGl0IHBlcmZvcm1zIG5vIGluc2VydGlvbi4KKy8vIEl0IHJldHVybnMgbnVsbHB0ciBpZiBpdCBjYW5ub3QgcHJvZHVjZSBhIGNvbnN0YW50LgorQ29uc3RhbnQgKmdldENvbnN0YW50TWVtSW5zdFZhbHVlRm9yTG9hZChNZW1JbnRyaW5zaWMgKlNyY0luc3QsIHVuc2lnbmVkIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqTG9hZFR5LCBjb25zdCBEYXRhTGF5b3V0ICZETCk7Cit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9WYWx1ZU1hcHBlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1ZhbHVlTWFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjYjIzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9WYWx1ZU1hcHBlci5oCkBAIC0wLDAgKzEsMjgxIEBACisvLz09PS0gVmFsdWVNYXBwZXIuaCAtIFJlbWFwcGluZyBmb3IgY29uc3RhbnRzIGFuZCBtZXRhZGF0YSAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNYXBWYWx1ZSBpbnRlcmZhY2Ugd2hpY2ggaXMgdXNlZCBieSB2YXJpb3VzIHBhcnRzIG9mCisvLyB0aGUgVHJhbnNmb3Jtcy9VdGlscyBsaWJyYXJ5IHRvIGltcGxlbWVudCBjbG9uaW5nIGFuZCBsaW5raW5nIGZhY2lsaXRpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfVkFMVUVNQVBQRVJfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfVkFMVUVNQVBQRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZU1hcC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIENvbnN0YW50OworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBHbG9iYWxBbGlhczsKK2NsYXNzIEdsb2JhbFZhcmlhYmxlOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBNRE5vZGU7CitjbGFzcyBNZXRhZGF0YTsKK2NsYXNzIFR5cGU7CitjbGFzcyBWYWx1ZTsKKwordXNpbmcgVmFsdWVUb1ZhbHVlTWFwVHkgPSBWYWx1ZU1hcDxjb25zdCBWYWx1ZSAqLCBXZWFrVHJhY2tpbmdWSD47CisKKy8vLyBUaGlzIGlzIGEgY2xhc3MgdGhhdCBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cyB0byByZW1hcCB0eXBlcyB3aGVuCisvLy8gY2xvbmluZyBjb25zdGFudHMgYW5kIGluc3RydWN0aW9ucy4KK2NsYXNzIFZhbHVlTWFwVHlwZVJlbWFwcGVyIHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOyAvLyBPdXQgb2YgbGluZSBtZXRob2QuCisKK3B1YmxpYzoKKyAgdmlydHVhbCB+VmFsdWVNYXBUeXBlUmVtYXBwZXIoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFRoZSBjbGllbnQgc2hvdWxkIGltcGxlbWVudCB0aGlzIG1ldGhvZCBpZiB0aGV5IHdhbnQgdG8gcmVtYXAgdHlwZXMgd2hpbGUKKyAgLy8vIG1hcHBpbmcgdmFsdWVzLgorICB2aXJ0dWFsIFR5cGUgKnJlbWFwVHlwZShUeXBlICpTcmNUeSkgPSAwOworfTsKKworLy8vIFRoaXMgaXMgYSBjbGFzcyB0aGF0IGNhbiBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzIHRvIG1hdGVyaWFsaXplIFZhbHVlcyBvbgorLy8vIGRlbWFuZC4KK2NsYXNzIFZhbHVlTWF0ZXJpYWxpemVyIHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOyAvLyBPdXQgb2YgbGluZSBtZXRob2QuCisKK3Byb3RlY3RlZDoKKyAgVmFsdWVNYXRlcmlhbGl6ZXIoKSA9IGRlZmF1bHQ7CisgIFZhbHVlTWF0ZXJpYWxpemVyKGNvbnN0IFZhbHVlTWF0ZXJpYWxpemVyICYpID0gZGVmYXVsdDsKKyAgVmFsdWVNYXRlcmlhbGl6ZXIgJm9wZXJhdG9yPShjb25zdCBWYWx1ZU1hdGVyaWFsaXplciAmKSA9IGRlZmF1bHQ7CisgIH5WYWx1ZU1hdGVyaWFsaXplcigpID0gZGVmYXVsdDsKKworcHVibGljOgorICAvLy8gVGhpcyBtZXRob2QgY2FuIGJlIGltcGxlbWVudGVkIHRvIGdlbmVyYXRlIGEgbWFwcGVkIFZhbHVlIG9uIGRlbWFuZC4gRm9yCisgIC8vLyBleGFtcGxlLCBpZiBsaW5raW5nIGxhemlseS4gUmV0dXJucyBudWxsIGlmIHRoZSB2YWx1ZSBpcyBub3QgbWF0ZXJpYWxpemVkLgorICB2aXJ0dWFsIFZhbHVlICptYXRlcmlhbGl6ZShWYWx1ZSAqVikgPSAwOworfTsKKworLy8vIFRoZXNlIGFyZSBmbGFncyB0aGF0IHRoZSB2YWx1ZSBtYXBwaW5nIEFQSXMgYWxsb3cuCitlbnVtIFJlbWFwRmxhZ3MgeworICBSRl9Ob25lID0gMCwKKworICAvLy8gSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlIHJlbWFwcGVyIGtub3dzIHRoYXQgb25seSBsb2NhbCB2YWx1ZXMgd2l0aGluIGEKKyAgLy8vIGZ1bmN0aW9uIChzdWNoIGFzIGFuIGluc3RydWN0aW9uIG9yIGFyZ3VtZW50KSBhcmUgbWFwcGVkLCBub3QgZ2xvYmFsCisgIC8vLyB2YWx1ZXMgbGlrZSBmdW5jdGlvbnMgYW5kIGdsb2JhbCBtZXRhZGF0YS4KKyAgUkZfTm9Nb2R1bGVMZXZlbENoYW5nZXMgPSAxLAorCisgIC8vLyBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgcmVtYXBwZXIgaWdub3JlcyBtaXNzaW5nIGZ1bmN0aW9uLWxvY2FsIGVudHJpZXMKKyAgLy8vIChBcmd1bWVudCwgSW5zdHJ1Y3Rpb24sIEJhc2ljQmxvY2spIHRoYXQgYXJlIG5vdCBpbiB0aGUgdmFsdWUgbWFwLiAgSWYgaXQKKyAgLy8vIGlzIHVuc2V0LCBpdCBhYm9ydHMgaWYgYW4gb3BlcmFuZCBpcyBhc2tlZCB0byBiZSByZW1hcHBlZCB3aGljaCBkb2Vzbid0CisgIC8vLyBleGlzdCBpbiB0aGUgbWFwcGluZy4KKyAgLy8vCisgIC8vLyBUaGVyZSBhcmUgbm8gc3VjaCBhc3NlcnRpb25zIGluIE1hcFZhbHVlKCksIHdob3NlIHJlc3VsdHMgYXJlIGFsbW9zdAorICAvLy8gdW5jaGFuZ2VkIGJ5IHRoaXMgZmxhZy4gIFRoaXMgZmxhZyBtYWlubHkgY2hhbmdlcyB0aGUgYXNzZXJ0aW9uIGJlaGF2aW91cgorICAvLy8gaW4gUmVtYXBJbnN0cnVjdGlvbigpLgorICAvLy8KKyAgLy8vIFNpbmNlIGFuIEluc3RydWN0aW9uJ3MgbWV0YWRhdGEgb3BlcmFuZHMgKGV2ZW4gdGhhdCBwb2ludCB0byBTU0EgdmFsdWVzKQorICAvLy8gYXJlbid0IGd1YXJhbnRlZWQgdG8gYmUgZG9taW5hdGVkIGJ5IHRoZWlyIGRlZmluaXRpb25zLCBNYXBNZXRhZGF0YSB3aWxsCisgIC8vLyByZXR1cm4gIiF7fSIgaW5zdGVhZCBvZiAibnVsbCIgZm9yIFxhIExvY2FsQXNNZXRhZGF0YSBpbnN0YW5jZXMgd2hvc2UgU1NBCisgIC8vLyB2YWx1ZXMgYXJlIHVubWFwcGVkIHdoZW4gdGhpcyBmbGFnIGlzIHNldC4gIE90aGVyd2lzZSwgXGEgTWFwVmFsdWUoKQorICAvLy8gY29tcGxldGVseSBpZ25vcmVzIHRoaXMgZmxhZy4KKyAgLy8vCisgIC8vLyBcYSBNYXBNZXRhZGF0YSgpIGFsd2F5cyBpZ25vcmVzIHRoaXMgZmxhZy4KKyAgUkZfSWdub3JlTWlzc2luZ0xvY2FscyA9IDIsCisKKyAgLy8vIEluc3RydWN0IHRoZSByZW1hcHBlciB0byBtb3ZlIGRpc3RpbmN0IG1ldGFkYXRhIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgaXQKKyAgLy8vIHdoZW4gdGhlcmUgYXJlIG1vZHVsZS1sZXZlbCBjaGFuZ2VzLgorICBSRl9Nb3ZlRGlzdGluY3RNRHMgPSA0LAorCisgIC8vLyBBbnkgZ2xvYmFsIHZhbHVlcyBub3QgaW4gdmFsdWUgbWFwIGFyZSBtYXBwZWQgdG8gbnVsbCBpbnN0ZWFkIG9mIG1hcHBpbmcKKyAgLy8vIHRvIHNlbGYuICBJbGxlZ2FsIGlmIFJGX0lnbm9yZU1pc3NpbmdMb2NhbHMgaXMgYWxzbyBzZXQuCisgIFJGX051bGxNYXBNaXNzaW5nR2xvYmFsVmFsdWVzID0gOCwKK307CisKK2lubGluZSBSZW1hcEZsYWdzIG9wZXJhdG9yfChSZW1hcEZsYWdzIExIUywgUmVtYXBGbGFncyBSSFMpIHsKKyAgcmV0dXJuIFJlbWFwRmxhZ3ModW5zaWduZWQoTEhTKSB8IHVuc2lnbmVkKFJIUykpOworfQorCisvLy8gQ29udGV4dCBmb3IgKHJlLSltYXBwaW5nIHZhbHVlcyAoYW5kIG1ldGFkYXRhKS4KKy8vLworLy8vIEEgc2hhcmVkIGNvbnRleHQgdXNlZCBmb3IgbWFwcGluZyBhbmQgcmVtYXBwaW5nIG9mIFZhbHVlIGFuZCBNZXRhZGF0YQorLy8vIGluc3RhbmNlcyB1c2luZyBcYSBWYWx1ZVRvVmFsdWVNYXBUeSwgXGEgUmVtYXBGbGFncywgXGEKKy8vLyBWYWx1ZU1hcFR5cGVSZW1hcHBlciwgYW5kIFxhIFZhbHVlTWF0ZXJpYWxpemVyLgorLy8vCisvLy8gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRvcC1sZXZlbCBlbnRyeSBwb2ludHM6CisvLy8gLSBcYSBtYXBWYWx1ZSgpIChhbmQgXGEgbWFwQ29uc3RhbnQoKSk7CisvLy8gLSBcYSBtYXBNZXRhZGF0YSgpIChhbmQgXGEgbWFwTUROb2RlKCkpOworLy8vIC0gXGEgcmVtYXBJbnN0cnVjdGlvbigpOyBhbmQKKy8vLyAtIFxhIHJlbWFwRnVuY3Rpb24oKS4KKy8vLworLy8vIFRoZSBcYSBWYWx1ZU1hdGVyaWFsaXplciBjYW4gYmUgdXNlZCBhcyBhIGNhbGxiYWNrLCBidXQgY2Fubm90IGludm9rZSBhbnkKKy8vLyBvZiB0aGVzZSB0b3AtbGV2ZWwgZnVuY3Rpb25zIHJlY3Vyc2l2ZWx5LiAgSW5zdGVhZCwgY2FsbGJhY2tzIHNob3VsZCB1c2UKKy8vLyBvbmUgb2YgdGhlIGZvbGxvd2luZyB0byBzY2hlZHVsZSB3b3JrIGxhemlseSBpbiB0aGUgXGEgVmFsdWVNYXBwZXIKKy8vLyBpbnN0YW5jZToKKy8vLyAtIFxhIHNjaGVkdWxlTWFwR2xvYmFsSW5pdGlhbGl6ZXIoKQorLy8vIC0gXGEgc2NoZWR1bGVNYXBBcHBlbmRpbmdWYXJpYWJsZSgpCisvLy8gLSBcYSBzY2hlZHVsZU1hcEdsb2JhbEFsaWFzZWUoKQorLy8vIC0gXGEgc2NoZWR1bGVSZW1hcEZ1bmN0aW9uKCkKKy8vLworLy8vIFNvbWV0aW1lcyBhIGNhbGxiYWNrIG5lZWRzIGEgZGlmZmVyZW50IG1hcHBpbmcgY29udGV4dC4gIFN1Y2ggYSBjb250ZXh0IGNhbgorLy8vIGJlIHJlZ2lzdGVyZWQgdXNpbmcgXGEgcmVnaXN0ZXJBbHRlcm5hdGVNYXBwaW5nQ29udGV4dCgpLCB3aGljaCB0YWtlcyBhbgorLy8vIGFsdGVybmF0ZSBcYSBWYWx1ZVRvVmFsdWVNYXBUeSBhbmQgXGEgVmFsdWVNYXRlcmlhbGl6ZXIgYW5kIHJldHVybnMgYSBJRCB0bworLy8vIHBhc3MgaW50byB0aGUgc2NoZWR1bGUqKCkgZnVuY3Rpb25zLgorLy8vCisvLy8gVE9ETzogbGliL0xpbmtlciByZWFsbHkgZG9lc24ndCBuZWVkIHRoZSBcYSBWYWx1ZUhhbmRsZSBpbiB0aGUgXGEKKy8vLyBWYWx1ZVRvVmFsdWVNYXBUeS4gIFdlIHNob3VsZCB0ZW1wbGF0ZSBcYSBWYWx1ZU1hcHBlciAoYW5kIGl0cworLy8vIGltcGxlbWVudGF0aW9uIGNsYXNzZXMpLCBhbmQgZXhwbGljaXRseSBpbnN0YW50aWF0ZSBvbiB0d28gY29uY3JldGUKKy8vLyBpbnN0YW5jZXMgb2YgXGEgVmFsdWVNYXAgKG9uZSBhcyBcYSBWYWx1ZVRvVmFsdWVNYXAsIGFuZCBvbmUgd2l0aCByYXcgXGEKKy8vLyBWYWx1ZSBwb2ludGVycykuICBJdCBtYXkgYmUgdmlhYmxlIHRvIGRvIGF3YXkgd2l0aCBcYSBUcmFja2luZ01EUmVmIGluIHRoZQorLy8vIFxhIE1ldGFkYXRhIHNpZGUgbWFwIGZvciB0aGUgbGliL0xpbmtlciBjYXNlIGFzIHdlbGwsIGluIHdoaWNoIGNhc2Ugd2UnbGwKKy8vLyBuZWVkIGEgbmV3IHRlbXBsYXRlIHBhcmFtZXRlciBvbiBcYSBWYWx1ZU1hcC4KKy8vLworLy8vIFRPRE86IFVwZGF0ZSBjYWxsZXJzIG9mIFxhIFJlbWFwSW5zdHJ1Y3Rpb24oKSBhbmQgXGEgTWFwVmFsdWUoKSAoZXRjLikgdG8KKy8vLyB1c2UgXGEgVmFsdWVNYXBwZXIgZGlyZWN0bHkuCitjbGFzcyBWYWx1ZU1hcHBlciB7CisgIHZvaWQgKnBJbXBsOworCitwdWJsaWM6CisgIFZhbHVlTWFwcGVyKFZhbHVlVG9WYWx1ZU1hcFR5ICZWTSwgUmVtYXBGbGFncyBGbGFncyA9IFJGX05vbmUsCisgICAgICAgICAgICAgIFZhbHVlTWFwVHlwZVJlbWFwcGVyICpUeXBlTWFwcGVyID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgVmFsdWVNYXRlcmlhbGl6ZXIgKk1hdGVyaWFsaXplciA9IG51bGxwdHIpOworICBWYWx1ZU1hcHBlcihWYWx1ZU1hcHBlciAmJikgPSBkZWxldGU7CisgIFZhbHVlTWFwcGVyKGNvbnN0IFZhbHVlTWFwcGVyICYpID0gZGVsZXRlOworICBWYWx1ZU1hcHBlciAmb3BlcmF0b3I9KFZhbHVlTWFwcGVyICYmKSA9IGRlbGV0ZTsKKyAgVmFsdWVNYXBwZXIgJm9wZXJhdG9yPShjb25zdCBWYWx1ZU1hcHBlciAmKSA9IGRlbGV0ZTsKKyAgflZhbHVlTWFwcGVyKCk7CisKKyAgLy8vIFJlZ2lzdGVyIGFuIGFsdGVybmF0ZSBtYXBwaW5nIGNvbnRleHQuCisgIC8vLworICAvLy8gUmV0dXJucyBhIE1hcHBpbmdDb250ZXh0SUQgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHRoZSB2YXJpb3VzIHNjaGVkdWxlKigpCisgIC8vLyBBUEkgdG8gc3dpdGNoIGluIGEgZGlmZmVyZW50IHZhbHVlIG1hcCBvbi10aGUtZmx5LgorICB1bnNpZ25lZAorICByZWdpc3RlckFsdGVybmF0ZU1hcHBpbmdDb250ZXh0KFZhbHVlVG9WYWx1ZU1hcFR5ICZWTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZU1hdGVyaWFsaXplciAqTWF0ZXJpYWxpemVyID0gbnVsbHB0cik7CisKKyAgLy8vIEFkZCB0byB0aGUgY3VycmVudCBcYSBSZW1hcEZsYWdzLgorICAvLy8KKyAgLy8vIFxub3RlIExpa2UgdGhlIHRvcC1sZXZlbCBtYXBwaW5nIGZ1bmN0aW9ucywgXGEgYWRkRmxhZ3MoKSBtdXN0IGJlIGNhbGxlZAorICAvLy8gYXQgdGhlIHRvcCBsZXZlbCwgbm90IGR1cmluZyBhIGNhbGxiYWNrIGluIGEgXGEgVmFsdWVNYXRlcmlhbGl6ZXIuCisgIHZvaWQgYWRkRmxhZ3MoUmVtYXBGbGFncyBGbGFncyk7CisKKyAgTWV0YWRhdGEgKm1hcE1ldGFkYXRhKGNvbnN0IE1ldGFkYXRhICZNRCk7CisgIE1ETm9kZSAqbWFwTUROb2RlKGNvbnN0IE1ETm9kZSAmTik7CisKKyAgVmFsdWUgKm1hcFZhbHVlKGNvbnN0IFZhbHVlICZWKTsKKyAgQ29uc3RhbnQgKm1hcENvbnN0YW50KGNvbnN0IENvbnN0YW50ICZDKTsKKworICB2b2lkIHJlbWFwSW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gJkkpOworICB2b2lkIHJlbWFwRnVuY3Rpb24oRnVuY3Rpb24gJkYpOworCisgIHZvaWQgc2NoZWR1bGVNYXBHbG9iYWxJbml0aWFsaXplcihHbG9iYWxWYXJpYWJsZSAmR1YsIENvbnN0YW50ICZJbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWFwcGluZ0NvbnRleHRJRCA9IDApOworICB2b2lkIHNjaGVkdWxlTWFwQXBwZW5kaW5nVmFyaWFibGUoR2xvYmFsVmFyaWFibGUgJkdWLCBDb25zdGFudCAqSW5pdFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNPbGRDdG9yRHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENvbnN0YW50ICo+IE5ld01lbWJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXBwaW5nQ29udGV4dElEID0gMCk7CisgIHZvaWQgc2NoZWR1bGVNYXBHbG9iYWxBbGlhc2VlKEdsb2JhbEFsaWFzICZHQSwgQ29uc3RhbnQgJkFsaWFzZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1hcHBpbmdDb250ZXh0SUQgPSAwKTsKKyAgdm9pZCBzY2hlZHVsZVJlbWFwRnVuY3Rpb24oRnVuY3Rpb24gJkYsIHVuc2lnbmVkIE1hcHBpbmdDb250ZXh0SUQgPSAwKTsKK307CisKKy8vLyBMb29rIHVwIG9yIGNvbXB1dGUgYSB2YWx1ZSBpbiB0aGUgdmFsdWUgbWFwLgorLy8vCisvLy8gUmV0dXJuIGEgbWFwcGVkIHZhbHVlIGZvciBhIGZ1bmN0aW9uLWxvY2FsIHZhbHVlIChBcmd1bWVudCwgSW5zdHJ1Y3Rpb24sCisvLy8gQmFzaWNCbG9jayksIG9yIGNvbXB1dGUgYW5kIG1lbW9pemUgYSB2YWx1ZSBmb3IgYSBDb25zdGFudC4KKy8vLworLy8vICAxLiBJZiBcYyBWIGlzIGluIFZNLCByZXR1cm4gdGhlIHJlc3VsdC4KKy8vLyAgMi4gRWxzZSBpZiBcYyBWIGNhbiBiZSBtYXRlcmlhbGl6ZWQgd2l0aCBcYyBNYXRlcmlhbGl6ZXIsIGRvIHNvLCBtZW1vaXplCisvLy8gICAgIGl0IGluIFxjIFZNLCBhbmQgcmV0dXJuIGl0LgorLy8vICAzLiBFbHNlIGlmIFxjIFYgaXMgYSBmdW5jdGlvbi1sb2NhbCB2YWx1ZSwgcmV0dXJuIG51bGxwdHIuCisvLy8gIDQuIEVsc2UgaWYgXGMgViBpcyBhIFxhIEdsb2JhbFZhbHVlLCByZXR1cm4gXGMgbnVsbHB0ciBvciBcYyBWIGRlcGVuZGluZworLy8vICAgICBvbiBcYSBSRl9OdWxsTWFwTWlzc2luZ0dsb2JhbFZhbHVlcy4KKy8vLyAgNS4gRWxzZSBpZiBcYyBWIGlzIGEgXGEgTWV0YWRhdGFBc1ZhbHVlIHdyYXBwaW5nIGEgTG9jYWxBc01ldGFkYXRhLAorLy8vICAgICByZWN1cnNlIG9uIHRoZSBsb2NhbCBTU0EgdmFsdWUsIGFuZCByZXR1cm4gbnVsbHB0ciBvciAibWV0YWRhdGEgIXt9IiBvbgorLy8vICAgICBtaXNzaW5nIGRlcGVuZGluZyBvbiBSRl9JZ25vcmVNaXNzaW5nVmFsdWVzLgorLy8vICA2LiBFbHNlIGlmIFxjIFYgaXMgYSBcYSBNZXRhZGF0YUFzVmFsdWUsIHJld3JhcCB0aGUgcmV0dXJuIG9mIFxhCisvLy8gICAgIE1hcE1ldGFkYXRhKCkuCisvLy8gIDcuIEVsc2UsIGNvbXB1dGUgdGhlIGVxdWl2YWxlbnQgY29uc3RhbnQsIGFuZCByZXR1cm4gaXQuCitpbmxpbmUgVmFsdWUgKk1hcFZhbHVlKGNvbnN0IFZhbHVlICpWLCBWYWx1ZVRvVmFsdWVNYXBUeSAmVk0sCisgICAgICAgICAgICAgICAgICAgICAgIFJlbWFwRmxhZ3MgRmxhZ3MgPSBSRl9Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZU1hcFR5cGVSZW1hcHBlciAqVHlwZU1hcHBlciA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTWF0ZXJpYWxpemVyICpNYXRlcmlhbGl6ZXIgPSBudWxscHRyKSB7CisgIHJldHVybiBWYWx1ZU1hcHBlcihWTSwgRmxhZ3MsIFR5cGVNYXBwZXIsIE1hdGVyaWFsaXplcikubWFwVmFsdWUoKlYpOworfQorCisvLy8gTG9va3VwIG9yIGNvbXB1dGUgYSBtYXBwaW5nIGZvciBhIHBpZWNlIG9mIG1ldGFkYXRhLgorLy8vCisvLy8gQ29tcHV0ZSBhbmQgbWVtb2l6ZSBhIG1hcHBpbmcgZm9yIFxjIE1ELgorLy8vCisvLy8gIDEuIElmIFxjIE1EIGlzIG1hcHBlZCwgcmV0dXJuIGl0LgorLy8vICAyLiBFbHNlIGlmIFxhIFJGX05vTW9kdWxlTGV2ZWxDaGFuZ2VzIG9yIFxjIE1EIGlzIGFuIFxhIE1EU3RyaW5nLCByZXR1cm4KKy8vLyAgICAgXGMgTUQuCisvLy8gIDMuIEVsc2UgaWYgXGMgTUQgaXMgYSBcYSBDb25zdGFudEFzTWV0YWRhdGEsIGNhbGwgXGEgTWFwVmFsdWUoKSBhbmQKKy8vLyAgICAgcmUtd3JhcCBpdHMgcmV0dXJuIChyZXR1cm5pbmcgbnVsbHB0ciBvbiBudWxscHRyKS4KKy8vLyAgNC4gRWxzZSwgXGMgTUQgaXMgYW4gXGEgTUROb2RlLiAgVGhlc2UgYXJlIHJlbWFwcGVkLCBhbG9uZyB3aXRoIHRoZWlyCisvLy8gICAgIHRyYW5zaXRpdmUgb3BlcmFuZHMuICBEaXN0aW5jdCBub2RlcyBhcmUgZHVwbGljYXRlZCBvciBtb3ZlZCBkZXBlbmRpbmcKKy8vLyAgICAgb24gXGEgUkZfTW92ZURpc3RpbmN0Tm9kZXMuICBVbmlxdWVkIG5vZGVzIGFyZSByZW1hcHBlZCBsaWtlIGNvbnN0YW50cy4KKy8vLworLy8vIFxub3RlIFxhIExvY2FsQXNNZXRhZGF0YSBpcyBjb21wbGV0ZWx5IHVuc3VwcG9ydGVkIGJ5IFxhIE1hcE1ldGFkYXRhLgorLy8vIEluc3RlYWQsIHVzZSBcYSBNYXBWYWx1ZSgpIHdpdGggaXRzIHdyYXBwaW5nIFxhIE1ldGFkYXRhQXNWYWx1ZSBpbnN0YW5jZS4KK2lubGluZSBNZXRhZGF0YSAqTWFwTWV0YWRhdGEoY29uc3QgTWV0YWRhdGEgKk1ELCBWYWx1ZVRvVmFsdWVNYXBUeSAmVk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbWFwRmxhZ3MgRmxhZ3MgPSBSRl9Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZU1hcFR5cGVSZW1hcHBlciAqVHlwZU1hcHBlciA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTWF0ZXJpYWxpemVyICpNYXRlcmlhbGl6ZXIgPSBudWxscHRyKSB7CisgIHJldHVybiBWYWx1ZU1hcHBlcihWTSwgRmxhZ3MsIFR5cGVNYXBwZXIsIE1hdGVyaWFsaXplcikubWFwTWV0YWRhdGEoKk1EKTsKK30KKworLy8vIFZlcnNpb24gb2YgTWFwTWV0YWRhdGEgd2l0aCB0eXBlIHNhZmV0eSBmb3IgTUROb2RlLgoraW5saW5lIE1ETm9kZSAqTWFwTWV0YWRhdGEoY29uc3QgTUROb2RlICpNRCwgVmFsdWVUb1ZhbHVlTWFwVHkgJlZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtYXBGbGFncyBGbGFncyA9IFJGX05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZU1hcFR5cGVSZW1hcHBlciAqVHlwZU1hcHBlciA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZU1hdGVyaWFsaXplciAqTWF0ZXJpYWxpemVyID0gbnVsbHB0cikgeworICByZXR1cm4gVmFsdWVNYXBwZXIoVk0sIEZsYWdzLCBUeXBlTWFwcGVyLCBNYXRlcmlhbGl6ZXIpLm1hcE1ETm9kZSgqTUQpOworfQorCisvLy8gQ29udmVydCB0aGUgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMgZnJvbSByZWZlcmVuY2luZyB0aGUgY3VycmVudCB2YWx1ZXMgaW50bworLy8vIHRob3NlIHNwZWNpZmllZCBieSBWTS4KKy8vLworLy8vIElmIFxhIFJGX0lnbm9yZU1pc3NpbmdMb2NhbHMgaXMgc2V0IGFuZCBhbiBvcGVyYW5kIGNhbid0IGJlIGZvdW5kIHZpYSBcYQorLy8vIE1hcFZhbHVlKCksIHVzZSB0aGUgb2xkIHZhbHVlLiAgT3RoZXJ3aXNlIGFzc2VydCB0aGF0IHRoaXMgZG9lc24ndCBoYXBwZW4uCisvLy8KKy8vLyBOb3RlIHRoYXQgXGEgTWFwVmFsdWUoKSBvbmx5IHJldHVybnMgXGMgbnVsbHB0ciBmb3IgU1NBIHZhbHVlcyBtaXNzaW5nIGZyb20KKy8vLyBcYyBWTS4KK2lubGluZSB2b2lkIFJlbWFwSW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gKkksIFZhbHVlVG9WYWx1ZU1hcFR5ICZWTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtYXBGbGFncyBGbGFncyA9IFJGX05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTWFwVHlwZVJlbWFwcGVyICpUeXBlTWFwcGVyID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVNYXRlcmlhbGl6ZXIgKk1hdGVyaWFsaXplciA9IG51bGxwdHIpIHsKKyAgVmFsdWVNYXBwZXIoVk0sIEZsYWdzLCBUeXBlTWFwcGVyLCBNYXRlcmlhbGl6ZXIpLnJlbWFwSW5zdHJ1Y3Rpb24oKkkpOworfQorCisvLy8gUmVtYXAgdGhlIG9wZXJhbmRzLCBtZXRhZGF0YSwgYXJndW1lbnRzLCBhbmQgaW5zdHJ1Y3Rpb25zIG9mIGEgZnVuY3Rpb24uCisvLy8KKy8vLyBDYWxscyBcYSBNYXBWYWx1ZSgpIG9uIHByZWZpeCBkYXRhLCBwcm9sb2d1ZSBkYXRhLCBhbmQgcGVyc29uYWxpdHkKKy8vLyBmdW5jdGlvbjsgY2FsbHMgXGEgTWFwTWV0YWRhdGEoKSBvbiBlYWNoIGF0dGFjaGVkIE1ETm9kZTsgcmVtYXBzIHRoZQorLy8vIGFyZ3VtZW50IHR5cGVzIHVzaW5nIHRoZSBwcm92aWRlZCBcYyBUeXBlTWFwcGVyOyBhbmQgY2FsbHMgXGEKKy8vLyBSZW1hcEluc3RydWN0aW9uKCkgb24gZXZlcnkgaW5zdHJ1Y3Rpb24uCitpbmxpbmUgdm9pZCBSZW1hcEZ1bmN0aW9uKEZ1bmN0aW9uICZGLCBWYWx1ZVRvVmFsdWVNYXBUeSAmVk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbWFwRmxhZ3MgRmxhZ3MgPSBSRl9Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZU1hcFR5cGVSZW1hcHBlciAqVHlwZU1hcHBlciA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTWF0ZXJpYWxpemVyICpNYXRlcmlhbGl6ZXIgPSBudWxscHRyKSB7CisgIFZhbHVlTWFwcGVyKFZNLCBGbGFncywgVHlwZU1hcHBlciwgTWF0ZXJpYWxpemVyKS5yZW1hcEZ1bmN0aW9uKEYpOworfQorCisvLy8gVmVyc2lvbiBvZiBNYXBWYWx1ZSB3aXRoIHR5cGUgc2FmZXR5IGZvciBDb25zdGFudC4KK2lubGluZSBDb25zdGFudCAqTWFwVmFsdWUoY29uc3QgQ29uc3RhbnQgKlYsIFZhbHVlVG9WYWx1ZU1hcFR5ICZWTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtYXBGbGFncyBGbGFncyA9IFJGX05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTWFwVHlwZVJlbWFwcGVyICpUeXBlTWFwcGVyID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVNYXRlcmlhbGl6ZXIgKk1hdGVyaWFsaXplciA9IG51bGxwdHIpIHsKKyAgcmV0dXJuIFZhbHVlTWFwcGVyKFZNLCBGbGFncywgVHlwZU1hcHBlciwgTWF0ZXJpYWxpemVyKS5tYXBDb25zdGFudCgqVik7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfVkFMVUVNQVBQRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1ZlY3Rvcml6ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1ZlY3Rvcml6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ODQ1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVmVjdG9yaXplLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8vPT09LS0gVmVjdG9yaXplLmggLSBWZWN0b3JpemF0aW9uIFRyYW5zZm9ybWF0aW9ucyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHByb3RvdHlwZXMgZm9yIGFjY2Vzc29yIGZ1bmN0aW9ucyB0aGF0IGV4cG9zZSBwYXNzZXMKKy8vIGluIHRoZSBWZWN0b3JpemUgdHJhbnNmb3JtYXRpb25zIGxpYnJhcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVkVDVE9SSVpFX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1ZFQ1RPUklaRV9ICisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBCYXNpY0Jsb2NrUGFzczsKK2NsYXNzIFBhc3M7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQGJyaWVmIFZlY3Rvcml6ZSBjb25maWd1cmF0aW9uLgorc3RydWN0IFZlY3Rvcml6ZUNvbmZpZyB7CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBUYXJnZXQgYXJjaGl0ZWN0dXJlIHJlbGF0ZWQgcGFyYW1ldGVycworCisgIC8vLyBAYnJpZWYgVGhlIHNpemUgb2YgdGhlIG5hdGl2ZSB2ZWN0b3IgcmVnaXN0ZXJzLgorICB1bnNpZ25lZCBWZWN0b3JCaXRzOworCisgIC8vLyBAYnJpZWYgVmVjdG9yaXplIGJvb2xlYW4gdmFsdWVzLgorICBib29sIFZlY3Rvcml6ZUJvb2xzOworCisgIC8vLyBAYnJpZWYgVmVjdG9yaXplIGludGVnZXIgdmFsdWVzLgorICBib29sIFZlY3Rvcml6ZUludHM7CisKKyAgLy8vIEBicmllZiBWZWN0b3JpemUgZmxvYXRpbmctcG9pbnQgdmFsdWVzLgorICBib29sIFZlY3Rvcml6ZUZsb2F0czsKKworICAvLy8gQGJyaWVmIFZlY3Rvcml6ZSBwb2ludGVyIHZhbHVlcy4KKyAgYm9vbCBWZWN0b3JpemVQb2ludGVyczsKKworICAvLy8gQGJyaWVmIFZlY3Rvcml6ZSBjYXN0aW5nIChjb252ZXJzaW9uKSBvcGVyYXRpb25zLgorICBib29sIFZlY3Rvcml6ZUNhc3RzOworCisgIC8vLyBAYnJpZWYgVmVjdG9yaXplIGZsb2F0aW5nLXBvaW50IG1hdGggaW50cmluc2ljcy4KKyAgYm9vbCBWZWN0b3JpemVNYXRoOworCisgIC8vLyBAYnJpZWYgVmVjdG9yaXplIGJpdCBpbnRyaW5zaWNzLgorICBib29sIFZlY3Rvcml6ZUJpdE1hbmlwdWxhdGlvbnM7CisKKyAgLy8vIEBicmllZiBWZWN0b3JpemUgdGhlIGZ1c2VkLW11bHRpcGx5LWFkZCBpbnRyaW5zaWMuCisgIGJvb2wgVmVjdG9yaXplRk1BOworCisgIC8vLyBAYnJpZWYgVmVjdG9yaXplIHNlbGVjdCBpbnN0cnVjdGlvbnMuCisgIGJvb2wgVmVjdG9yaXplU2VsZWN0OworCisgIC8vLyBAYnJpZWYgVmVjdG9yaXplIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb25zLgorICBib29sIFZlY3Rvcml6ZUNtcDsKKworICAvLy8gQGJyaWVmIFZlY3Rvcml6ZSBnZXRlbGVtZW50cHRyIGluc3RydWN0aW9ucy4KKyAgYm9vbCBWZWN0b3JpemVHRVA7CisKKyAgLy8vIEBicmllZiBWZWN0b3JpemUgbG9hZHMgYW5kIHN0b3Jlcy4KKyAgYm9vbCBWZWN0b3JpemVNZW1PcHM7CisKKyAgLy8vIEBicmllZiBPbmx5IGdlbmVyYXRlIGFsaWduZWQgbG9hZHMgYW5kIHN0b3Jlcy4KKyAgYm9vbCBBbGlnbmVkT25seTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTWlzYyBwYXJhbWV0ZXJzCisKKyAgLy8vIEBicmllZiBUaGUgcmVxdWlyZWQgY2hhaW4gZGVwdGggZm9yIHZlY3Rvcml6YXRpb24uCisgIHVuc2lnbmVkIFJlcUNoYWluRGVwdGg7CisKKyAgLy8vIEBicmllZiBUaGUgbWF4aW11bSBzZWFyY2ggZGlzdGFuY2UgZm9yIGluc3RydWN0aW9uIHBhaXJzLgorICB1bnNpZ25lZCBTZWFyY2hMaW1pdDsKKworICAvLy8gQGJyaWVmIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjYW5kaWRhdGUgcGFpcnMgd2l0aCB3aGljaCB0byB1c2UgYSBmdWxsCisgIC8vLyAgICAgICAgY3ljbGUgY2hlY2suCisgIHVuc2lnbmVkIE1heENhbmRQYWlyc0ZvckN5Y2xlQ2hlY2s7CisKKyAgLy8vIEBicmllZiBSZXBsaWNhdGluZyBvbmUgZWxlbWVudCB0byBhIHBhaXIgYnJlYWtzIHRoZSBjaGFpbi4KKyAgYm9vbCBTcGxhdEJyZWFrc0NoYWluOworCisgIC8vLyBAYnJpZWYgVGhlIG1heGltdW0gbnVtYmVyIG9mIHBhaXJhYmxlIGluc3RydWN0aW9ucyBwZXIgZ3JvdXAuCisgIHVuc2lnbmVkIE1heEluc3RzOworCisgIC8vLyBAYnJpZWYgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNhbmRpZGF0ZSBpbnN0cnVjdGlvbiBwYWlycyBwZXIgZ3JvdXAuCisgIHVuc2lnbmVkIE1heFBhaXJzOworCisgIC8vLyBAYnJpZWYgVGhlIG1heGltdW0gbnVtYmVyIG9mIHBhaXJpbmcgaXRlcmF0aW9ucy4KKyAgdW5zaWduZWQgTWF4SXRlcjsKKworICAvLy8gQGJyaWVmIERvbid0IHRyeSB0byBmb3JtIG9kZC1sZW5ndGggdmVjdG9ycy4KKyAgYm9vbCBQb3cyTGVuT25seTsKKworICAvLy8gQGJyaWVmIERvbid0IGJvb3N0IHRoZSBjaGFpbi1kZXB0aCBjb250cmlidXRpb24gb2YgbG9hZHMgYW5kIHN0b3Jlcy4KKyAgYm9vbCBOb01lbU9wQm9vc3Q7CisKKyAgLy8vIEBicmllZiBVc2UgYSBmYXN0IGluc3RydWN0aW9uIGRlcGVuZGVuY3kgYW5hbHlzaXMuCisgIGJvb2wgRmFzdERlcDsKKworICAvLy8gQGJyaWVmIEluaXRpYWxpemUgdGhlIFZlY3Rvcml6ZUNvbmZpZyBmcm9tIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICBWZWN0b3JpemVDb25maWcoKTsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG9vcFZlY3Rvcml6ZSAtIENyZWF0ZSBhIGxvb3AgdmVjdG9yaXphdGlvbiBwYXNzLgorLy8KK1Bhc3MgKmNyZWF0ZUxvb3BWZWN0b3JpemVQYXNzKGJvb2wgTm9VbnJvbGxpbmcgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWx3YXlzVmVjdG9yaXplID0gdHJ1ZSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gU0xQVmVjdG9yaXplciAtIENyZWF0ZSBhIGJvdHRvbS11cCBTTFAgdmVjdG9yaXplciBwYXNzLgorLy8KK1Bhc3MgKmNyZWF0ZVNMUFZlY3Rvcml6ZXJQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQGJyaWVmIFZlY3Rvcml6ZSB0aGUgQmFzaWNCbG9jay4KKy8vLworLy8vIEBwYXJhbSBCQiBUaGUgQmFzaWNCbG9jayB0byBiZSB2ZWN0b3JpemVkCisvLy8gQHBhcmFtIFAgIFRoZSBjdXJyZW50IHJ1bm5pbmcgcGFzcywgc2hvdWxkIHJlcXVpcmUgQWxpYXNBbmFseXNpcyBhbmQKKy8vLyAgICAgICAgICAgU2NhbGFyRXZvbHV0aW9uLiBBZnRlciB0aGUgdmVjdG9yaXphdGlvbiwgQWxpYXNBbmFseXNpcywKKy8vLyAgICAgICAgICAgU2NhbGFyRXZvbHV0aW9uIGFuZCBDRkcgYXJlIHByZXNlcnZlZC4KKy8vLworLy8vIEByZXR1cm4gVHJ1ZSBpZiB0aGUgQkIgaXMgY2hhbmdlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorLy8vCitib29sIHZlY3Rvcml6ZUJhc2ljQmxvY2soUGFzcyAqUCwgQmFzaWNCbG9jayAmQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yaXplQ29uZmlnICZDID0gVmVjdG9yaXplQ29uZmlnKCkpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvYWRTdG9yZVZlY3Rvcml6ZXIgLSBDcmVhdGUgdmVjdG9yIGxvYWRzIGFuZCBzdG9yZXMsIGJ1dCBsZWF2ZSBzY2FsYXIKKy8vIG9wZXJhdGlvbnMuCisvLworUGFzcyAqY3JlYXRlTG9hZFN0b3JlVmVjdG9yaXplclBhc3MoKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVmVjdG9yaXplL0xvb3BWZWN0b3JpemUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9WZWN0b3JpemUvTG9vcFZlY3Rvcml6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYjU2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVmVjdG9yaXplL0xvb3BWZWN0b3JpemUuaApAQCAtMCwwICsxLDEwNyBAQAorLy89PT0tIExvb3BWZWN0b3JpemUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGlzIHRoZSBMTFZNIGxvb3AgdmVjdG9yaXplci4gVGhpcyBwYXNzIG1vZGlmaWVzICd2ZWN0b3JpemFibGUnIGxvb3BzCisvLyBhbmQgZ2VuZXJhdGVzIHRhcmdldC1pbmRlcGVuZGVudCBMTFZNLUlSLgorLy8gVGhlIHZlY3Rvcml6ZXIgdXNlcyB0aGUgVGFyZ2V0VHJhbnNmb3JtSW5mbyBhbmFseXNpcyB0byBlc3RpbWF0ZSB0aGUgY29zdHMKKy8vIG9mIGluc3RydWN0aW9ucyBpbiBvcmRlciB0byBlc3RpbWF0ZSB0aGUgcHJvZml0YWJpbGl0eSBvZiB2ZWN0b3JpemF0aW9uLgorLy8KKy8vIFRoZSBsb29wIHZlY3Rvcml6ZXIgY29tYmluZXMgY29uc2VjdXRpdmUgbG9vcCBpdGVyYXRpb25zIGludG8gYSBzaW5nbGUKKy8vICd3aWRlJyBpdGVyYXRpb24uIEFmdGVyIHRoaXMgdHJhbnNmb3JtYXRpb24gdGhlIGluZGV4IGlzIGluY3JlbWVudGVkCisvLyBieSB0aGUgU0lNRCB2ZWN0b3Igd2lkdGgsIGFuZCBub3QgYnkgb25lLgorLy8KKy8vIFRoaXMgcGFzcyBoYXMgdGhyZWUgcGFydHM6CisvLyAxLiBUaGUgbWFpbiBsb29wIHBhc3MgdGhhdCBkcml2ZXMgdGhlIGRpZmZlcmVudCBwYXJ0cy4KKy8vIDIuIExvb3BWZWN0b3JpemF0aW9uTGVnYWxpdHkgLSBBIHVuaXQgdGhhdCBjaGVja3MgZm9yIHRoZSBsZWdhbGl0eQorLy8gICAgb2YgdGhlIHZlY3Rvcml6YXRpb24uCisvLyAzLiBJbm5lckxvb3BWZWN0b3JpemVyIC0gQSB1bml0IHRoYXQgcGVyZm9ybXMgdGhlIGFjdHVhbAorLy8gICAgd2lkZW5pbmcgb2YgaW5zdHJ1Y3Rpb25zLgorLy8gNC4gTG9vcFZlY3Rvcml6YXRpb25Db3N0TW9kZWwgLSBBIHVuaXQgdGhhdCBjaGVja3MgZm9yIHRoZSBwcm9maXRhYmlsaXR5CisvLyAgICBvZiB2ZWN0b3JpemF0aW9uLiBJdCBkZWNpZGVzIG9uIHRoZSBvcHRpbWFsIHZlY3RvciB3aWR0aCwgd2hpY2gKKy8vICAgIGNhbiBiZSBvbmUsIGlmIHZlY3Rvcml6YXRpb24gaXMgbm90IHByb2ZpdGFibGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGUgcmVkdWN0aW9uLXZhcmlhYmxlIHZlY3Rvcml6YXRpb24gaXMgYmFzZWQgb24gdGhlIHBhcGVyOgorLy8gIEQuIE51em1hbiBhbmQgUi4gSGVuZGVyc29uLiBNdWx0aS1wbGF0Zm9ybSBBdXRvLXZlY3Rvcml6YXRpb24uCisvLworLy8gVmFyaWFibGUgdW5pZm9ybWl0eSBjaGVja3MgYXJlIGluc3BpcmVkIGJ5OgorLy8gIEthcnJlbmJlcmcsIFIuIGFuZCBIYWNrLCBTLiBXaG9sZSBGdW5jdGlvbiBWZWN0b3JpemF0aW9uLgorLy8KKy8vIFRoZSBpbnRlcmxlYXZlZCBhY2Nlc3MgdmVjdG9yaXphdGlvbiBpcyBiYXNlZCBvbiB0aGUgcGFwZXI6CisvLyAgRG9yaXQgTnV6bWFuLCBJcmEgUm9zZW4gYW5kIEF5YWwgWmFrcy4gIEF1dG8tVmVjdG9yaXphdGlvbiBvZiBJbnRlcmxlYXZlZAorLy8gIERhdGEgZm9yIFNJTUQKKy8vCisvLyBPdGhlciBpZGVhcy9jb25jZXB0cyBhcmUgZnJvbToKKy8vICBBLiBaYWtzIGFuZCBELiBOdXptYW4uIEF1dG92ZWN0b3JpemF0aW9uIGluIEdDQy10d28geWVhcnMgbGF0ZXIuCisvLworLy8gIFMuIE1hbGVraSwgWS4gR2FvLCBNLiBHYXJ6YXJhbiwgVC4gV29uZyBhbmQgRC4gUGFkdWEuICBBbiBFdmFsdWF0aW9uIG9mCisvLyAgVmVjdG9yaXppbmcgQ29tcGlsZXJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1ZFQ1RPUklaRV9MT09QVkVDVE9SSVpFX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1ZFQ1RPUklaRV9MT09QVkVDVE9SSVpFX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFzc3VtcHRpb25DYWNoZTsKK2NsYXNzIEJsb2NrRnJlcXVlbmN5SW5mbzsKK2NsYXNzIERlbWFuZGVkQml0czsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIExvb3A7CitjbGFzcyBMb29wQWNjZXNzSW5mbzsKK2NsYXNzIExvb3BJbmZvOworY2xhc3MgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlcjsKK2NsYXNzIFNjYWxhckV2b2x1dGlvbjsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworY2xhc3MgVGFyZ2V0VHJhbnNmb3JtSW5mbzsKKworLy8vIFRoZSBMb29wVmVjdG9yaXplIFBhc3MuCitzdHJ1Y3QgTG9vcFZlY3Rvcml6ZVBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMb29wVmVjdG9yaXplUGFzcz4geworICBib29sIERpc2FibGVVbnJvbGxpbmcgPSBmYWxzZTsKKworICAvLy8gSWYgdHJ1ZSwgY29uc2lkZXIgYWxsIGxvb3BzIGZvciB2ZWN0b3JpemF0aW9uLgorICAvLy8gSWYgZmFsc2UsIG9ubHkgbG9vcHMgdGhhdCBleHBsaWNpdGx5IHJlcXVlc3QgdmVjdG9yaXphdGlvbiBhcmUKKyAgLy8vIGNvbnNpZGVyZWQuCisgIGJvb2wgQWx3YXlzVmVjdG9yaXplID0gdHJ1ZTsKKworICBTY2FsYXJFdm9sdXRpb24gKlNFOworICBMb29wSW5mbyAqTEk7CisgIFRhcmdldFRyYW5zZm9ybUluZm8gKlRUSTsKKyAgRG9taW5hdG9yVHJlZSAqRFQ7CisgIEJsb2NrRnJlcXVlbmN5SW5mbyAqQkZJOworICBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJOworICBEZW1hbmRlZEJpdHMgKkRCOworICBBbGlhc0FuYWx5c2lzICpBQTsKKyAgQXNzdW1wdGlvbkNhY2hlICpBQzsKKyAgc3RkOjpmdW5jdGlvbjxjb25zdCBMb29wQWNjZXNzSW5mbyAmKExvb3AgJik+ICpHZXRMQUE7CisgIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgKk9SRTsKKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7CisKKyAgLy8gU2hpbSBmb3Igb2xkIFBNLgorICBib29sIHJ1bkltcGwoRnVuY3Rpb24gJkYsIFNjYWxhckV2b2x1dGlvbiAmU0VfLCBMb29wSW5mbyAmTElfLAorICAgICAgICAgICAgICAgVGFyZ2V0VHJhbnNmb3JtSW5mbyAmVFRJXywgRG9taW5hdG9yVHJlZSAmRFRfLAorICAgICAgICAgICAgICAgQmxvY2tGcmVxdWVuY3lJbmZvICZCRklfLCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJXywKKyAgICAgICAgICAgICAgIERlbWFuZGVkQml0cyAmREJfLCBBbGlhc0FuYWx5c2lzICZBQV8sIEFzc3VtcHRpb25DYWNoZSAmQUNfLAorICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjb25zdCBMb29wQWNjZXNzSW5mbyAmKExvb3AgJik+ICZHZXRMQUFfLAorICAgICAgICAgICAgICAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAmT1JFKTsKKworICBib29sIHByb2Nlc3NMb29wKExvb3AgKkwpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19WRUNUT1JJWkVfTE9PUFZFQ1RPUklaRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVmVjdG9yaXplL1NMUFZlY3Rvcml6ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9WZWN0b3JpemUvU0xQVmVjdG9yaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OWQ1ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVmVjdG9yaXplL1NMUFZlY3Rvcml6ZXIuaApAQCAtMCwwICsxLDE1NCBAQAorLy89PT0tIFNMUFZlY3Rvcml6ZXIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoaXMgcGFzcyBpbXBsZW1lbnRzIHRoZSBCb3R0b20gVXAgU0xQIHZlY3Rvcml6ZXIuIEl0IGRldGVjdHMgY29uc2VjdXRpdmUKKy8vIHN0b3JlcyB0aGF0IGNhbiBiZSBwdXQgdG9nZXRoZXIgaW50byB2ZWN0b3Itc3RvcmVzLiBOZXh0LCBpdCBhdHRlbXB0cyB0bworLy8gY29uc3RydWN0IHZlY3Rvcml6YWJsZSB0cmVlIHVzaW5nIHRoZSB1c2UtZGVmIGNoYWlucy4gSWYgYSBwcm9maXRhYmxlIHRyZWUKKy8vIHdhcyBmb3VuZCwgdGhlIFNMUCB2ZWN0b3JpemVyIHBlcmZvcm1zIHZlY3Rvcml6YXRpb24gb24gdGhlIHRyZWUuCisvLworLy8gVGhlIHBhc3MgaXMgaW5zcGlyZWQgYnkgdGhlIHdvcmsgZGVzY3JpYmVkIGluIHRoZSBwYXBlcjoKKy8vICAiTG9vcC1Bd2FyZSBTTFAgaW4gR0NDIiBieSBJcmEgUm9zZW4sIERvcml0IE51em1hbiwgQXlhbCBaYWtzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1ZFQ1RPUklaRV9TTFBWRUNUT1JJWkVSX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1ZFQ1RPUklaRV9TTFBWRUNUT1JJWkVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTWFwVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc3N1bXB0aW9uQ2FjaGU7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgQ21wSW5zdDsKK2NsYXNzIERhdGFMYXlvdXQ7CitjbGFzcyBEZW1hbmRlZEJpdHM7CitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbnNlcnRFbGVtZW50SW5zdDsKK2NsYXNzIEluc2VydFZhbHVlSW5zdDsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTG9vcEluZm87CitjbGFzcyBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyOworY2xhc3MgUEhJTm9kZTsKK2NsYXNzIFNjYWxhckV2b2x1dGlvbjsKK2NsYXNzIFN0b3JlSW5zdDsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworY2xhc3MgVGFyZ2V0VHJhbnNmb3JtSW5mbzsKK2NsYXNzIFZhbHVlOworCisvLy8gQSBwcml2YXRlICJtb2R1bGUiIG5hbWVzcGFjZSBmb3IgdHlwZXMgYW5kIHV0aWxpdGllcyB1c2VkIGJ5IHRoaXMgcGFzcy4KKy8vLyBUaGVzZSBhcmUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGNsaWVudHMuCituYW1lc3BhY2Ugc2xwdmVjdG9yaXplciB7CisKK2NsYXNzIEJvVXBTTFA7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBzbHB2ZWN0b3JpemVyCisKK3N0cnVjdCBTTFBWZWN0b3JpemVyUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPFNMUFZlY3Rvcml6ZXJQYXNzPiB7CisgIHVzaW5nIFN0b3JlTGlzdCA9IFNtYWxsVmVjdG9yPFN0b3JlSW5zdCAqLCA4PjsKKyAgdXNpbmcgU3RvcmVMaXN0TWFwID0gTWFwVmVjdG9yPFZhbHVlICosIFN0b3JlTGlzdD47CisgIHVzaW5nIFdlYWtUcmFja2luZ1ZITGlzdCA9IFNtYWxsVmVjdG9yPFdlYWtUcmFja2luZ1ZILCA4PjsKKyAgdXNpbmcgV2Vha1RyYWNraW5nVkhMaXN0TWFwID0gTWFwVmVjdG9yPFZhbHVlICosIFdlYWtUcmFja2luZ1ZITGlzdD47CisKKyAgU2NhbGFyRXZvbHV0aW9uICpTRSA9IG51bGxwdHI7CisgIFRhcmdldFRyYW5zZm9ybUluZm8gKlRUSSA9IG51bGxwdHI7CisgIFRhcmdldExpYnJhcnlJbmZvICpUTEkgPSBudWxscHRyOworICBBbGlhc0FuYWx5c2lzICpBQSA9IG51bGxwdHI7CisgIExvb3BJbmZvICpMSSA9IG51bGxwdHI7CisgIERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cjsKKyAgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHI7CisgIERlbWFuZGVkQml0cyAqREIgPSBudWxscHRyOworICBjb25zdCBEYXRhTGF5b3V0ICpETCA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworCisgIC8vIEdsdWUgZm9yIG9sZCBQTS4KKyAgYm9vbCBydW5JbXBsKEZ1bmN0aW9uICZGLCBTY2FsYXJFdm9sdXRpb24gKlNFXywgVGFyZ2V0VHJhbnNmb3JtSW5mbyAqVFRJXywKKyAgICAgICAgICAgICAgIFRhcmdldExpYnJhcnlJbmZvICpUTElfLCBBbGlhc0FuYWx5c2lzICpBQV8sIExvb3BJbmZvICpMSV8sCisgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICpEVF8sIEFzc3VtcHRpb25DYWNoZSAqQUNfLCBEZW1hbmRlZEJpdHMgKkRCXywKKyAgICAgICAgICAgICAgIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgKk9SRV8pOworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIENvbGxlY3Qgc3RvcmUgYW5kIGdldGVsZW1lbnRwdHIgaW5zdHJ1Y3Rpb25zIGFuZCBvcmdhbml6ZSB0aGVtCisgIC8vLyBhY2NvcmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgb2JqZWN0IG9mIHRoZWlyIHBvaW50ZXIgb3BlcmFuZHMuIFdlIHNvcnQgdGhlCisgIC8vLyBpbnN0cnVjdGlvbnMgYnkgdGhlaXIgdW5kZXJseWluZyBvYmplY3RzIHRvIHJlZHVjZSB0aGUgY29zdCBvZgorICAvLy8gY29uc2VjdXRpdmUgYWNjZXNzIHF1ZXJpZXMuCisgIC8vLworICAvLy8gVE9ETzogV2UgY2FuIGZ1cnRoZXIgcmVkdWNlIHRoaXMgY29zdCBpZiB3ZSBmbHVzaCB0aGUgY2hhaW4gY3JlYXRpb24KKyAgLy8vICAgICAgIGV2ZXJ5IHRpbWUgd2UgcnVuIGludG8gYSBtZW1vcnkgYmFycmllci4KKyAgdm9pZCBjb2xsZWN0U2VlZEluc3RydWN0aW9ucyhCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIFxicmllZiBUcnkgdG8gdmVjdG9yaXplIGEgY2hhaW4gdGhhdCBzdGFydHMgYXQgdHdvIGFyaXRobWV0aWMgaW5zdHJzLgorICBib29sIHRyeVRvVmVjdG9yaXplUGFpcihWYWx1ZSAqQSwgVmFsdWUgKkIsIHNscHZlY3Rvcml6ZXI6OkJvVXBTTFAgJlIpOworCisgIC8vLyBcYnJpZWYgVHJ5IHRvIHZlY3Rvcml6ZSBhIGxpc3Qgb2Ygb3BlcmFuZHMuCisgIC8vLyBccGFyYW0gVXNlckNvc3QgQ29zdCBvZiB0aGUgdXNlciBvcGVyYXRpb25zIG9mIFxwIFZMIGlmIHRoZXkgbWF5IGFmZmVjdAorICAvLy8gdGhlIGNvc3Qgb2YgdGhlIHZlY3Rvcml6YXRpb24uCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGEgdmFsdWUgd2FzIHZlY3Rvcml6ZWQuCisgIGJvb2wgdHJ5VG9WZWN0b3JpemVMaXN0KEFycmF5UmVmPFZhbHVlICo+IFZMLCBzbHB2ZWN0b3JpemVyOjpCb1VwU0xQICZSLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVXNlckNvc3QgPSAwLCBib29sIEFsbG93UmVvcmRlciA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIFRyeSB0byB2ZWN0b3JpemUgYSBjaGFpbiB0aGF0IG1heSBzdGFydCBhdCB0aGUgb3BlcmFuZHMgb2YgXHAgSS4KKyAgYm9vbCB0cnlUb1ZlY3Rvcml6ZShJbnN0cnVjdGlvbiAqSSwgc2xwdmVjdG9yaXplcjo6Qm9VcFNMUCAmUik7CisKKyAgLy8vIFxicmllZiBWZWN0b3JpemUgdGhlIHN0b3JlIGluc3RydWN0aW9ucyBjb2xsZWN0ZWQgaW4gU3RvcmVzLgorICBib29sIHZlY3Rvcml6ZVN0b3JlQ2hhaW5zKHNscHZlY3Rvcml6ZXI6OkJvVXBTTFAgJlIpOworCisgIC8vLyBcYnJpZWYgVmVjdG9yaXplIHRoZSBpbmRleCBjb21wdXRhdGlvbnMgb2YgdGhlIGdldGVsZW1lbnRwdHIgaW5zdHJ1Y3Rpb25zCisgIC8vLyBjb2xsZWN0ZWQgaW4gR0VQcy4KKyAgYm9vbCB2ZWN0b3JpemVHRVBJbmRpY2VzKEJhc2ljQmxvY2sgKkJCLCBzbHB2ZWN0b3JpemVyOjpCb1VwU0xQICZSKTsKKworICAvLy8gVHJ5IHRvIGZpbmQgaG9yaXpvbnRhbCByZWR1Y3Rpb24gb3Igb3RoZXJ3aXNlIHZlY3Rvcml6ZSBhIGNoYWluIG9mIGJpbmFyeQorICAvLy8gb3BlcmF0b3JzLgorICBib29sIHZlY3Rvcml6ZVJvb3RJbnN0cnVjdGlvbihQSElOb2RlICpQLCBWYWx1ZSAqViwgQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNscHZlY3Rvcml6ZXI6OkJvVXBTTFAgJlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldFRyYW5zZm9ybUluZm8gKlRUSSk7CisKKyAgLy8vIFRyeSB0byB2ZWN0b3JpemUgdHJlZXMgdGhhdCBzdGFydCBhdCBpbnNlcnR2YWx1ZSBpbnN0cnVjdGlvbnMuCisgIGJvb2wgdmVjdG9yaXplSW5zZXJ0VmFsdWVJbnN0KEluc2VydFZhbHVlSW5zdCAqSVZJLCBCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xwdmVjdG9yaXplcjo6Qm9VcFNMUCAmUik7CisKKyAgLy8vIFRyeSB0byB2ZWN0b3JpemUgdHJlZXMgdGhhdCBzdGFydCBhdCBpbnNlcnRlbGVtZW50IGluc3RydWN0aW9ucy4KKyAgYm9vbCB2ZWN0b3JpemVJbnNlcnRFbGVtZW50SW5zdChJbnNlcnRFbGVtZW50SW5zdCAqSUVJLCBCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbHB2ZWN0b3JpemVyOjpCb1VwU0xQICZSKTsKKworICAvLy8gVHJ5IHRvIHZlY3Rvcml6ZSB0cmVlcyB0aGF0IHN0YXJ0IGF0IGNvbXBhcmUgaW5zdHJ1Y3Rpb25zLgorICBib29sIHZlY3Rvcml6ZUNtcEluc3QoQ21wSW5zdCAqQ0ksIEJhc2ljQmxvY2sgKkJCLCBzbHB2ZWN0b3JpemVyOjpCb1VwU0xQICZSKTsKKworICAvLy8gVHJpZXMgdG8gdmVjdG9yaXplIGNvbnN0cnVjdHMgc3RhcnRlZCBmcm9tIENtcEluc3QsIEluc2VydFZhbHVlSW5zdCBvcgorICAvLy8gSW5zZXJ0RWxlbWVudEluc3QgaW5zdHJ1Y3Rpb25zLgorICBib29sIHZlY3Rvcml6ZVNpbXBsZUluc3RydWN0aW9ucyhTbWFsbFZlY3RvckltcGw8V2Vha1ZIPiAmSW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpCQiwgc2xwdmVjdG9yaXplcjo6Qm9VcFNMUCAmUik7CisKKyAgLy8vIFxicmllZiBTY2FuIHRoZSBiYXNpYyBibG9jayBhbmQgbG9vayBmb3IgcGF0dGVybnMgdGhhdCBhcmUgbGlrZWx5IHRvIHN0YXJ0CisgIC8vLyBhIHZlY3Rvcml6YXRpb24gY2hhaW4uCisgIGJvb2wgdmVjdG9yaXplQ2hhaW5zSW5CbG9jayhCYXNpY0Jsb2NrICpCQiwgc2xwdmVjdG9yaXplcjo6Qm9VcFNMUCAmUik7CisKKyAgYm9vbCB2ZWN0b3JpemVTdG9yZUNoYWluKEFycmF5UmVmPFZhbHVlICo+IENoYWluLCBzbHB2ZWN0b3JpemVyOjpCb1VwU0xQICZSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmVjUmVnU2l6ZSk7CisKKyAgYm9vbCB2ZWN0b3JpemVTdG9yZXMoQXJyYXlSZWY8U3RvcmVJbnN0ICo+IFN0b3Jlcywgc2xwdmVjdG9yaXplcjo6Qm9VcFNMUCAmUik7CisKKyAgLy8vIFRoZSBzdG9yZSBpbnN0cnVjdGlvbnMgaW4gYSBiYXNpYyBibG9jayBvcmdhbml6ZWQgYnkgYmFzZSBwb2ludGVyLgorICBTdG9yZUxpc3RNYXAgU3RvcmVzOworCisgIC8vLyBUaGUgZ2V0ZWxlbWVudHB0ciBpbnN0cnVjdGlvbnMgaW4gYSBiYXNpYyBibG9jayBvcmdhbml6ZWQgYnkgYmFzZSBwb2ludGVyLgorICBXZWFrVHJhY2tpbmdWSExpc3RNYXAgR0VQczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVkVDVE9SSVpFX1NMUFZFQ1RPUklaRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9XaW5kb3dzTWFuaWZlc3QvV2luZG93c01hbmlmZXN0TWVyZ2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1dpbmRvd3NNYW5pZmVzdC9XaW5kb3dzTWFuaWZlc3RNZXJnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDJkMzcwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9XaW5kb3dzTWFuaWZlc3QvV2luZG93c01hbmlmZXN0TWVyZ2VyLmgKQEAgLTAsMCArMSw2NiBAQAorLy89PT0tLSBXaW5kb3dzTWFuaWZlc3RNZXJnZXIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKystKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGEgdXRpbGl0eSBmb3IgbWVyZ2luZyBNaWNyb3NvZnQgLm1hbmlmZXN0IGZpbGVzLiAgVGhlc2UKKy8vIGZpbGVzIGFyZSB4bWwgZG9jdW1lbnRzIHdoaWNoIGNvbnRhaW4gbWV0YS1pbmZvcm1hdGlvbiBhYm91dCBhcHBsaWNhdGlvbnMsCisvLyBzdWNoIGFzIHdoZXRoZXIgb3Igbm90IGFkbWluIGFjY2VzcyBpcyByZXF1aXJlZCwgc3lzdGVtIGNvbXBhdGliaWxpdHksCisvLyB2ZXJzaW9ucywgZXRjLiAgUGFydCBvZiB0aGUgbGlua2luZyBwcm9jZXNzIG9mIGFuIGV4ZWN1dGFibGUgbWF5IHJlcXVpcmUKKy8vIG1lcmdpbmcgc2V2ZXJhbCBvZiB0aGVzZSAubWFuaWZlc3QgZmlsZXMgdXNpbmcgYSB0cmVlLW1lcmdlIGZvbGxvd2luZworLy8gc3BlY2lmaWMgcnVsZXMuICBVbmZvcnR1bmF0ZWx5LCB0aGVzZSBydWxlcyBhcmUgbm90IGRvY3VtZW50ZWQgd2VsbAorLy8gYW55d2hlcmUuICBIb3dldmVyLCBhIGNhcmVmdWwgaW52ZXN0aWdhdGlvbiBvZiB0aGUgYmVoYXZpb3Igb2YgdGhlIG9yaWdpbmFsCisvLyBNaWNyb3NvZnQgTWFuaWZlc3QgVG9vbCAobXQuZXhlKSByZXZlYWxlZCB0aGUgcnVsZXMgb2YgdGhpcyBtZXJnZS4gIEFzIHRoZQorLy8gc2F5aW5nIGdvZXMsIGNvZGUgaXMgdGhlIGJlc3QgZG9jdW1lbnRhdGlvbiwgc28gcGxlYXNlIGxvb2sgYmVsb3cgaWYgeW91IGFyZQorLy8gaW50ZXJlc3RlZCBpbiB0aGUgZXhhY3QgbWVyZ2luZyByZXF1aXJlbWVudHMuCisvLworLy8gUmVmOgorLy8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvYWEzNzQxOTEodj12cy44NSkuYXNweAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lOQ0xVREVfTExWTV9TVVBQT1JUX1dJTkRPV1NfTUFOSUZFU1RfTUVSR0VSX0gKKyNkZWZpbmUgTExWTV9JTkNMVURFX0xMVk1fU1VQUE9SVF9XSU5ET1dTX01BTklGRVNUX01FUkdFUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNZW1vcnlCdWZmZXI7CisKK25hbWVzcGFjZSB3aW5kb3dzX21hbmlmZXN0IHsKKworYm9vbCBpc0F2YWlsYWJsZSgpOworCitjbGFzcyBXaW5kb3dzTWFuaWZlc3RFcnJvciA6IHB1YmxpYyBFcnJvckluZm88V2luZG93c01hbmlmZXN0RXJyb3IsIEVDRXJyb3I+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIFdpbmRvd3NNYW5pZmVzdEVycm9yKGNvbnN0IFR3aW5lICZNc2cpOworICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBNc2c7Cit9OworCitjbGFzcyBXaW5kb3dzTWFuaWZlc3RNZXJnZXIgeworcHVibGljOgorICBXaW5kb3dzTWFuaWZlc3RNZXJnZXIoKTsKKyAgfldpbmRvd3NNYW5pZmVzdE1lcmdlcigpOworICBFcnJvciBtZXJnZShjb25zdCBNZW1vcnlCdWZmZXIgJk1hbmlmZXN0KTsKKworICAvLyBSZXR1cm5zIHZlY3RvciBjb250YWluaW5nIG1lcmdlZCB4bWwgbWFuaWZlc3QsIG9yIHVuaW5pdGlhbGl6ZWQgdmVjdG9yIGZvcgorICAvLyBlbXB0eSBtYW5pZmVzdC4KKyAgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gZ2V0TWVyZ2VkTWFuaWZlc3QoKTsKKworcHJpdmF0ZToKKyAgY2xhc3MgV2luZG93c01hbmlmZXN0TWVyZ2VySW1wbDsKKyAgc3RkOjp1bmlxdWVfcHRyPFdpbmRvd3NNYW5pZmVzdE1lcmdlckltcGw+IEltcGw7Cit9OworCit9IC8vIG5hbWVzcGFjZSB3aW5kb3dzX21hbmlmZXN0Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vV2luZG93c1Jlc291cmNlL1Jlc291cmNlUHJvY2Vzc29yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1dpbmRvd3NSZXNvdXJjZS9SZXNvdXJjZVByb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYTBhNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1dpbmRvd3NSZXNvdXJjZS9SZXNvdXJjZVByb2Nlc3Nvci5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vPT09LS0gUmVzb3VyY2VQcm9jZXNzb3IuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSU5DTFVERV9MTFZNX1NVUFBPUlRfV0lORE9XU19SRVNPVVJDRV9QUk9DRVNTT1JfSAorI2RlZmluZSBMTFZNX0lOQ0xVREVfTExWTV9TVVBQT1JUX1dJTkRPV1NfUkVTT1VSQ0VfUFJPQ0VTU09SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFdpbmRvd3NSZXNvdXJjZVByb2Nlc3NvciB7CitwdWJsaWM6CisgIHVzaW5nIFBhdGhUeXBlID0gU21hbGxWZWN0b3I8Y2hhciwgNjQ+OworCisgIFdpbmRvd3NSZXNvdXJjZVByb2Nlc3NvcigpIHt9CisKKyAgdm9pZCBhZGREZWZpbmUoU3RyaW5nUmVmIEtleSwgU3RyaW5nUmVmIFZhbHVlID0gU3RyaW5nUmVmKCkpIHsKKyAgICBQcmVwcm9jZXNzb3JEZWZpbmVzLmVtcGxhY2VfYmFjayhLZXksIFZhbHVlKTsKKyAgfQorICB2b2lkIGFkZEluY2x1ZGUoY29uc3QgUGF0aFR5cGUgJkluY2x1ZGVQYXRoKSB7CisgICAgSW5jbHVkZUxpc3QucHVzaF9iYWNrKEluY2x1ZGVQYXRoKTsKKyAgfQorICB2b2lkIHNldFZlcmJvc2UoYm9vbCBWZXJib3NlKSB7IElzVmVyYm9zZSA9IFZlcmJvc2U7IH0KKyAgdm9pZCBzZXROdWxsQXRFbmQoYm9vbCBOdWxsQXRFbmQpIHsgQXBwZW5kTnVsbCA9IE51bGxBdEVuZDsgfQorCisgIEVycm9yIHByb2Nlc3MoU3RyaW5nUmVmIElucHV0RGF0YSwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8cmF3X2ZkX29zdHJlYW0+IE91dHB1dFN0cmVhbSk7CisKK3ByaXZhdGU6CisgIFN0cmluZ1JlZiBJbnB1dERhdGE7CisgIHN0ZDo6dmVjdG9yPFBhdGhUeXBlPiBJbmNsdWRlTGlzdDsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFN0cmluZ1JlZiwgU3RyaW5nUmVmPj4gUHJlcHJvY2Vzc29yRGVmaW5lczsKKyAgYm9vbCBJc1ZlcmJvc2UsIEFwcGVuZE51bGw7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9XaW5kb3dzUmVzb3VyY2UvUmVzb3VyY2VTY3JpcHRUb2tlbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9XaW5kb3dzUmVzb3VyY2UvUmVzb3VyY2VTY3JpcHRUb2tlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NGFlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1dpbmRvd3NSZXNvdXJjZS9SZXNvdXJjZVNjcmlwdFRva2VuLmgKQEAgLTAsMCArMSw1OSBAQAorLy89PT0tLSBSZXNvdXJjZVNjcmlwdFRva2VuLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKystKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBkZWNsYXJlcyB0aGUgLnJjIHNjcmlwdCB0b2tlbnMuCisvLyBUaGUgbGlzdCBvZiBhdmFpbGFibGUgdG9rZW5zIGlzIGxvY2F0ZWQgYXQgUmVzb3VyY2VTY3JpcHRUb2tlbkxpc3QuaC4KKy8vCisvLyBSZWY6IG1zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9hYTM4MDU5OSh2PXZzLjg1KS5hc3B4CisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSU5DTFVERV9MTFZNX1NVUFBPUlRfV0lORE9XU19SRVNPVVJDRV9TQ1JJUFRUT0tFTl9ICisjZGVmaW5lIExMVk1fSU5DTFVERV9MTFZNX1NVUFBPUlRfV0lORE9XU19SRVNPVVJDRV9TQ1JJUFRUT0tFTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLyBBIGRlZmluaXRpb24gb2YgYSBzaW5nbGUgcmVzb3VyY2Ugc2NyaXB0IHRva2VuLiBFYWNoIHRva2VuIGhhcyBpdHMga2luZAorLy8gKGRlY2xhcmVkIGluIFJlc291cmNlU2NyaXB0VG9rZW5MaXN0KSBhbmQgaG9sZHMgYSB2YWx1ZSAtIGEgcmVmZXJlbmNlCisvLyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdG9rZW4uCisvLyBSQ1Rva2VuIGRvZXMgbm90IGNsYWltIG93bmVyc2hpcCBvbiBpdHMgdmFsdWUuIEEgbWVtb3J5IGJ1ZmZlciBjb250YWluaW5nCisvLyB0aGUgdG9rZW4gdmFsdWUgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHNhZmUgcGxhY2UgYW5kIGNhbm5vdCBiZSBmcmVlZAorLy8gbm9yIHJlYWxsb2NhdGVkLgorY2xhc3MgUkNUb2tlbiB7CitwdWJsaWM6CisgIGVudW0gY2xhc3MgS2luZCB7CisjZGVmaW5lIFRPS0VOKE5hbWUpIE5hbWUsCisjZGVmaW5lIFNIT1JUX1RPS0VOKE5hbWUsIENoKSBOYW1lLAorI2luY2x1ZGUgIlJlc291cmNlU2NyaXB0VG9rZW5MaXN0LmgiCisjdW5kZWYgVE9LRU4KKyN1bmRlZiBTSE9SVF9UT0tFTgorICB9OworCisgIFJDVG9rZW4oUkNUb2tlbjo6S2luZCBSQ1Rva2VuS2luZCwgU3RyaW5nUmVmIFZhbHVlKTsKKworICAvLyBHZXQgYW4gaW50ZWdlciB2YWx1ZSBvZiB0aGUgaW50ZWdlciB0b2tlbi4KKyAgdWludDMyX3QgaW50VmFsdWUoKSBjb25zdDsKKyAgYm9vbCBpc0xvbmdJbnQoKSBjb25zdDsKKworICBTdHJpbmdSZWYgdmFsdWUoKSBjb25zdDsKKyAgS2luZCBraW5kKCkgY29uc3Q7CisKKyAgLy8gQ2hlY2sgaWYgYSB0b2tlbiBkZXNjcmliZXMgYSBiaW5hcnkgb3BlcmF0b3IuCisgIGJvb2wgaXNCaW5hcnlPcCgpIGNvbnN0OworCitwcml2YXRlOgorICBLaW5kIFRva2VuS2luZDsKKyAgU3RyaW5nUmVmIFRva2VuVmFsdWU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9XaW5kb3dzUmVzb3VyY2UvUmVzb3VyY2VTY3JpcHRUb2tlbkxpc3QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vV2luZG93c1Jlc291cmNlL1Jlc291cmNlU2NyaXB0VG9rZW5MaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlZWQxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vV2luZG93c1Jlc291cmNlL1Jlc291cmNlU2NyaXB0VG9rZW5MaXN0LmgKQEAgLTAsMCArMSwzNSBAQAorLy89PT0tLSBSZXNvdXJjZVNjcmlwdFRva2VuTGlzdC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKystKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpcyBhIHBhcnQgb2YgbGx2bS1yYyB0b2tlbnMgaGVhZGVyLiBJdCBsaXN0cyBhbGwgdGhlIHBvc3NpYmxlIHRva2VucworLy8gdGhhdCBtaWdodCBvY2N1ciBpbiBhIGNvcnJlY3QgLnJjIHNjcmlwdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gTG9uZyB0b2tlbnMuIFRoZXkgbWlnaHQgY29uc2lzdCBvZiBtb3JlIHRoYW4gb25lIGNoYXJhY3Rlci4KK1RPS0VOKEludmFsaWQpICAgICAgLy8gSW52YWxpZCB0b2tlbi4gU2hvdWxkIG5vdCBvY2N1ciBpbiBhIHZhbGlkIHNjcmlwdC4KK1RPS0VOKEludCkgICAgICAgICAgLy8gSW50ZWdlciAoZGVjaW1hbCwgb2N0YWwgb3IgaGV4YWRlY2ltYWwpLgorVE9LRU4oU3RyaW5nKSAgICAgICAvLyBTdHJpbmcgdmFsdWUuCitUT0tFTihJZGVudGlmaWVyKSAgIC8vIFNjcmlwdCBpZGVudGlmaWVyIChyZXNvdXJjZSBuYW1lIG9yIHR5cGUpLgorCisvLyBTaG9ydCB0b2tlbnMuIFRoZXkgdXN1YWxseSBjb25zaXN0IG9mIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4KKy8vIFRoZSBkZWZpbml0aW9ucyBhcmUgb2YgdGhlIGZvcm0gU0hPUlRfVE9LRU4oVG9rZW5OYW1lLCBUb2tlbkNoYXIpLgorLy8gVG9rZW5DaGFyIGlzIHRoZSBvbmUtY2hhcmFjdGVyIHRva2VuIHJlcHJlc2VudGF0aW9uIG9jY3VyaW5nIGluIHRoZSBjb3JyZWN0CisvLyAucmMgc2NyaXB0cy4KK1NIT1JUX1RPS0VOKEJsb2NrQmVnaW4sICd7JykgICAvLyBTdGFydCBvZiB0aGUgc2NyaXB0IGJsb2NrOyBjYW4gYWxzbyBiZSBCRUdJTi4KK1NIT1JUX1RPS0VOKEJsb2NrRW5kLCAnfScpICAgICAvLyBFbmQgb2YgdGhlIGJsb2NrOyBjYW4gYWxzbyBiZSBFTkQuCitTSE9SVF9UT0tFTihDb21tYSwgJywnKSAgICAgICAgLy8gQ29tbWEgLSByZXNvdXJjZSBhcmd1bWVudHMgc2VwYXJhdG9yLgorU0hPUlRfVE9LRU4oUGx1cywgJysnKSAgICAgICAgIC8vIEFkZGl0aW9uIG9wZXJhdG9yLgorU0hPUlRfVE9LRU4oTWludXMsICctJykgICAgICAgIC8vIFN1YnRyYWN0aW9uIG9wZXJhdG9yLgorU0hPUlRfVE9LRU4oUGlwZSwgJ3wnKSAgICAgICAgIC8vIEJpdHdpc2UtT1Igb3BlcmF0b3IuCitTSE9SVF9UT0tFTihBbXAsICcmJykgICAgICAgICAgLy8gQml0d2lzZS1BTkQgb3BlcmF0b3IuCitTSE9SVF9UT0tFTihUaWxkZSwgJ34nKSAgICAgICAgLy8gQml0d2lzZS1OT1Qgb3BlcmF0b3IuCitTSE9SVF9UT0tFTihMZWZ0UGFyZW4sICcoJykgICAgLy8gTGVmdCBwYXJlbnRoZXNpcyBpbiB0aGUgc2NyaXB0IGV4cHJlc3Npb25zLgorU0hPUlRfVE9LRU4oUmlnaHRQYXJlbiwgJyknKSAgIC8vIFJpZ2h0IHBhcmVudGhlc2lzLgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9YUmF5L0dyYXBoLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1hSYXkvR3JhcGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGQzNGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9YUmF5L0dyYXBoLmgKQEAgLTAsMCArMSw0OTQgQEAKKy8vPT09LS0gR3JhcGguaCAtIFhSYXkgR3JhcGggQ2xhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQSBHcmFwaCBEYXRhdHlwZSBmb3IgWFJheS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fWFJBWV9HUkFQSF9UX0gKKyNkZWZpbmUgTExWTV9YUkFZX0dSQVBIX1RfSAorCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSB4cmF5IHsKKworLy8vIEEgR3JhcGggb2JqZWN0IHJlcHJlc2VudHMgYSBEaXJlY3RlZCBHcmFwaCBhbmQgaXMgdXNlZCBpbiBYUmF5IHRvIGNvbXB1dGUKKy8vLyBhbmQgc3RvcmUgZnVuY3Rpb24gY2FsbCBncmFwaHMgYW5kIGFzc29jaWF0ZWQgc3RhdGlzdGljYWwgaW5mb3JtYXRpb24uCisvLy8KKy8vLyBUaGUgZ3JhcGggdGFrZXMgaW4gZm91ciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLCB0aGVzZSBhcmU6CisvLy8gIC0gVmVydGV4QXR0cmlidXRlLCB0aGlzIGlzIGEgc3RydWN0dXJlIHdoaWNoIGlzIHN0b3JlZCBmb3IgZWFjaCB2ZXJ0ZXguCisvLy8gICAgTXVzdCBiZSBEZWZhdWx0Q29uc3RydWN0aWJsZSwgQ29weUNvbnN0cnVjdGlibGUsIENvcHlBc3NpZ25hYmxlIGFuZAorLy8vICAgIERlc3RydWN0aWJsZS4KKy8vLyAgLSBFZGdlQXR0cmlidXRlLCB0aGlzIGlzIGEgc3RydWN0dXJlIHdoaWNoIGlzIHN0b3JlZCBmb3IgZWFjaCBlZGdlCisvLy8gICAgTXVzdCBiZSBEZWZhdWx0Q29uc3RydWN0aWJsZSwgQ29weUNvbnN0cnVjdGlibGUsIENvcHlBc3NpZ25hYmxlIGFuZAorLy8vICAgIERlc3RydWN0aWJsZS4KKy8vLyAgLSBFZGdlQXR0cmlidXRlLCB0aGlzIGlzIGEgc3RydWN0dXJlIHdoaWNoIGlzIHN0b3JlZCBmb3IgZWFjaCB2YXJpYWJsZQorLy8vICAtIFZJLCB0aGlzIGlzIGEgdHlwZSBvdmVyIHdoaWNoIERlbnNlTWFwSW5mbyBpcyBkZWZpbmVkIGFuZCBpcyB0aGUgdHlwZQorLy8vICAgIHVzZWQgbG9vayB1cCBzdHJpbmdzLCBhdmFpbGFibGUgYXMgVmVydGV4SWRlbnRpZmllci4KKy8vLyAgLSBJZiB0aGUgYnVpbHQgaW4gRGVuc2VNYXBJbmZvIGlzIG5vdCBkZWZpbmVkLCBwcm92aWRlIGEgc3BlY2lhbGl6YXRpb24KKy8vLyAgICBjbGFzcyB0eXBlIGhlcmUuCisvLy8KKy8vLyBHcmFwaCBpcyBDb3B5Q29uc3RydWN0aWJsZSwgQ29weUFzc2lnbmFibGUsIE1vdmVDb25zdHJ1Y3RpYmxlIGFuZAorLy8vIE1vdmVBc3NpZ25hYmxlIGJ1dCBpcyBub3QgRXF1YWxpdHlDb21wYXJpYmxlIG9yIExlc3NUaGFuQ29tcGFyaWJsZS4KKy8vLworLy8vIFVzYWdlIEV4YW1wbGUgR3JhcGggd2l0aCB3ZWlnaHRlZCBlZGdlcyBhbmQgdmVydGljZXM6CisvLy8gICBHcmFwaDxpbnQsIGludCwgaW50PiBHOworLy8vCisvLy8gICBHWzFdID0gMDsKKy8vLyAgIEdbMl0gPSAyOworLy8vICAgR1t7MSwyfV0gPSAxOworLy8vICAgR1t7MiwxfV0gPSAtMTsKKy8vLyAgIGZvcihjb25zdCBhdXRvICZ2IDogRy52ZXJ0aWNlcygpKXsKKy8vLyAgICAgLy8gRG8gc29tZXRoaW5nIHdpdGggdGhlIHZlcnRpY2VzIGluIHRoZSBncmFwaDsKKy8vLyAgIH0KKy8vLyAgIGZvcihjb25zdCBhdXRvICZlIDogRy5lZGdlcygpKXsKKy8vLyAgICAgLy8gRG8gc29tZXRoaW5nIHdpdGggdGhlIGVkZ2VzIGluIHRoZSBncmFwaDsKKy8vLyAgIH0KKy8vLworLy8vIFVzYWdlIEV4YW1wbGUgd2l0aCBTdHJSZWYga2V5cy4KKy8vLyAgIEdyYXBoPGludCwgZG91YmxlLCBTdHJSZWY+IFN0ckc7CisvLy8gICAgY2hhciB2YVtdID0gIlZlcnRleCBBIjsKKy8vLyAgICBjaGFyIHZhYVtdID0gIlZlcnRleCBBIjsKKy8vLyAgICBjaGFyIHZiW10gPSAiVmVydGV4IEIiOyAvLyBWZXJ0aWNlcyBhcmUgcmVmZXJlbmNlZCBieSBTdHJpbmcgUmVmcy4KKy8vLyAgICBHW3ZhXSA9IDA7CisvLy8gICAgR1t2Yl0gPSAxOworLy8vICAgIEdbe3ZhLCB2Yn1dID0gMS4wOworLy8vICAgIGNvdXQoKSA8PCBHW3ZhYV0gPDwgIiAiIDw8IEdbe3ZhYSwgdmJ9XTsgLy9wcmludHMgIjAgMS4wIi4KKy8vLwordGVtcGxhdGUgPHR5cGVuYW1lIFZlcnRleEF0dHJpYnV0ZSwgdHlwZW5hbWUgRWRnZUF0dHJpYnV0ZSwKKyAgICAgICAgICB0eXBlbmFtZSBWSSA9IGludDMyX3Q+CitjbGFzcyBHcmFwaCB7CitwdWJsaWM6CisgIC8vLyBUaGVzZSBvYmplY3RzIGFyZSB1c2VkIHRvIG5hbWUgZWRnZXMgYW5kIHZlcnRpY2VzIGluIHRoZSBncmFwaC4KKyAgdHlwZWRlZiBWSSBWZXJ0ZXhJZGVudGlmaWVyOworICB0eXBlZGVmIHN0ZDo6cGFpcjxWSSwgVkk+IEVkZ2VJZGVudGlmaWVyOworCisgIC8vLyBUaGlzIHR5cGUgaXMgdGhlIHZhbHVlX3R5cGUgb2YgYWxsIGl0ZXJhdG9ycyB3aGljaCByYW5nZSBvdmVyIHZlcnRpY2VzLAorICAvLy8gRGV0ZXJtaW5lZCBieSB0aGUgVmVydGljZXMgRGVuc2VNYXAKKyAgdXNpbmcgVmVydGV4VmFsdWVUeXBlID0KKyAgICAgIGRldGFpbDo6RGVuc2VNYXBQYWlyPFZlcnRleElkZW50aWZpZXIsIFZlcnRleEF0dHJpYnV0ZT47CisKKyAgLy8vIFRoaXMgdHlwZSBpcyB0aGUgdmFsdWVfdHlwZSBvZiBhbGwgaXRlcmF0b3JzIHdoaWNoIHJhbmdlIG92ZXIgZWRnZXMsCisgIC8vLyBEZXRlcm1pbmVkIGJ5IHRoZSBFZGdlcyBEZW5zZU1hcC4KKyAgdXNpbmcgRWRnZVZhbHVlVHlwZSA9IGRldGFpbDo6RGVuc2VNYXBQYWlyPEVkZ2VJZGVudGlmaWVyLCBFZGdlQXR0cmlidXRlPjsKKworICB1c2luZyBzaXplX3R5cGUgPSBzdGQ6OnNpemVfdDsKKworcHJpdmF0ZToKKyAgLy8vIFRoZSB0eXBlIHVzZWQgZm9yIHN0b3JpbmcgdGhlIEVkZ2VBdHRyaWJ1dGUgZm9yIGVhY2ggZWRnZSBpbiB0aGUgZ3JhcGgKKyAgdXNpbmcgRWRnZU1hcFQgPSBEZW5zZU1hcDxFZGdlSWRlbnRpZmllciwgRWRnZUF0dHJpYnV0ZT47CisKKyAgLy8vIFRoZSB0eXBlIHVzZWQgZm9yIHN0b3JpbmcgdGhlIFZlcnRleEF0dHJpYnV0ZSBmb3IgZWFjaCB2ZXJ0ZXggaW4KKyAgLy8vIHRoZSBncmFwaC4KKyAgdXNpbmcgVmVydGV4TWFwVCA9IERlbnNlTWFwPFZlcnRleElkZW50aWZpZXIsIFZlcnRleEF0dHJpYnV0ZT47CisKKyAgLy8vIFRoZSB0eXBlIHVzZWQgZm9yIHN0b3JpbmcgdGhlIGVkZ2VzIGVudGVyaW5nIGEgdmVydGV4LiBJbmRleGVkIGJ5CisgIC8vLyB0aGUgVmVydGV4SWRlbnRpZmllciBvZiB0aGUgc3RhcnQgb2YgdGhlIGVkZ2UuIE9ubHkgdXNlZCB0byBkZXRlcm1pbmUKKyAgLy8vIHdoZXJlIHRoZSBpbmNvbWluZyBlZGdlcyBhcmUsIHRoZSBFZGdlSWRlbnRpZmllcnMgYXJlIHN0b3JlZCBpbiBhbgorICAvLy8gSW5uZXJFZGdlTWFwVC4KKyAgdXNpbmcgTmVpZ2hib3JTZXRUID0gRGVuc2VTZXQ8VmVydGV4SWRlbnRpZmllcj47CisKKyAgLy8vIFRoZSB0eXBlIHN0b3JpbmcgdGhlIElubmVySW52R3JhcGhUIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCB2ZXJ0ZXggaW4KKyAgLy8vIHRoZSBncmFwaCAoV2hlbiBhIHZlcnRleCBoYXMgYW4gaW5jb21pbmcgZWRnZSBpbmNpZGVudCB0byBpdCkKKyAgdXNpbmcgTmVpZ2hib3JMb29rdXBUID0gRGVuc2VNYXA8VmVydGV4SWRlbnRpZmllciwgTmVpZ2hib3JTZXRUPjsKKworcHJpdmF0ZToKKyAgLy8vIFN0b3JlcyB0aGUgbWFwIGZyb20gdGhlIHN0YXJ0IGFuZCBlbmQgdmVydGV4IG9mIGFuIGVkZ2UgdG8gaXQncworICAvLy8gRWRnZUF0dHJpYnV0ZQorICBFZGdlTWFwVCBFZGdlczsKKworICAvLy8gU3RvcmVzIHRoZSBtYXAgZnJvbSBWZXJ0ZXhJZGVudGlmaWVyIHRvIFZlcnRleEF0dHJpYnV0ZQorICBWZXJ0ZXhNYXBUIFZlcnRpY2VzOworCisgIC8vLyBBbGxvd3MgZmFzdCBsb29rdXAgZm9yIHRoZSBpbmNvbWluZyBlZGdlIHNldCBvZiBhbnkgZ2l2ZW4gdmVydGV4LgorICBOZWlnaGJvckxvb2t1cFQgSW5OZWlnaGJvcnM7CisKKyAgLy8vIEFsbG93cyBmYXN0IGxvb2t1cCBmb3IgdGhlIG91dGdvaW5nIGVkZ2Ugc2V0IG9mIGFueSBnaXZlbiB2ZXJ0ZXguCisgIE5laWdoYm9yTG9va3VwVCBPdXROZWlnaGJvcnM7CisKKyAgLy8vIEFuIEl0ZXJhdG9yIGFkYXB0ZXIgdXNpbmcgYW4gSW5uZXJJbnZHcmFwaFQ6Oml0ZXJhdG9yIGFzIGEgYmFzZSBpdGVyYXRvciwKKyAgLy8vIGFuZCBzdG9yaW5nIHRoZSBWZXJ0ZXhJZGVudGlmaWVyIHRoZSBpdGVyYXRvciByYW5nZSBjb21lcyBmcm9tLiBUaGUKKyAgLy8vIGRlcmVmZXJlbmNlIG9wZXJhdG9yIGlzIHRoZW4gcGVyZm9ybWVkIHVzaW5nIGEgcG9pbnRlciB0byB0aGUgZ3JhcGgncyBlZGdlCisgIC8vLyBzZXQuCisgIHRlbXBsYXRlIDxib29sIElzQ29uc3QsIGJvb2wgSXNPdXQsCisgICAgICAgICAgICB0eXBlbmFtZSBCYXNlSXQgPSB0eXBlbmFtZSBOZWlnaGJvclNldFQ6OmNvbnN0X2l0ZXJhdG9yLAorICAgICAgICAgICAgdHlwZW5hbWUgVCA9IHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8SXNDb25zdCwgY29uc3QgRWRnZVZhbHVlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkZ2VWYWx1ZVR5cGU+Ojp0eXBlPgorICBjbGFzcyBOZWlnaGJvckVkZ2VJdGVyYXRvclQKKyAgICAgIDogcHVibGljIGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTwKKyAgICAgICAgICAgIE5laWdoYm9yRWRnZUl0ZXJhdG9yVDxJc0NvbnN0LCBJc091dD4sIEJhc2VJdCwKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEJhc2VJdD46Oml0ZXJhdG9yX2NhdGVnb3J5LCBUPiB7CisgICAgdXNpbmcgSW50ZXJuYWxFZGdlTWFwVCA9CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8SXNDb25zdCwgY29uc3QgRWRnZU1hcFQsIEVkZ2VNYXBUPjo6dHlwZTsKKworICAgIGZyaWVuZCBjbGFzcyBOZWlnaGJvckVkZ2VJdGVyYXRvclQ8ZmFsc2UsIElzT3V0LCBCYXNlSXQsIEVkZ2VWYWx1ZVR5cGU+OworICAgIGZyaWVuZCBjbGFzcyBOZWlnaGJvckVkZ2VJdGVyYXRvclQ8dHJ1ZSwgSXNPdXQsIEJhc2VJdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVkZ2VWYWx1ZVR5cGU+OworCisgICAgSW50ZXJuYWxFZGdlTWFwVCAqTVA7CisgICAgVmVydGV4SWRlbnRpZmllciBTSTsKKworICBwdWJsaWM6CisgICAgdGVtcGxhdGUgPGJvb2wgSXNDb25zdERlc3QsCisgICAgICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8SXNDb25zdERlc3QgJiYgIUlzQ29uc3Q+Ojp0eXBlPgorICAgIG9wZXJhdG9yIE5laWdoYm9yRWRnZUl0ZXJhdG9yVDxJc0NvbnN0RGVzdCwgSXNPdXQsIEJhc2VJdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRWRnZVZhbHVlVHlwZT4oKSBjb25zdCB7CisgICAgICByZXR1cm4gTmVpZ2hib3JFZGdlSXRlcmF0b3JUPElzQ29uc3REZXN0LCBJc091dCwgQmFzZUl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFZGdlVmFsdWVUeXBlPih0aGlzLT5JLCBNUCwgU0kpOworICAgIH0KKworICAgIE5laWdoYm9yRWRnZUl0ZXJhdG9yVCgpID0gZGVmYXVsdDsKKyAgICBOZWlnaGJvckVkZ2VJdGVyYXRvclQoQmFzZUl0IF9JLCBJbnRlcm5hbEVkZ2VNYXBUICpfTVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRleElkZW50aWZpZXIgX1NJKQorICAgICAgICA6IGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTwKKyAgICAgICAgICAgICAgTmVpZ2hib3JFZGdlSXRlcmF0b3JUPElzQ29uc3QsIElzT3V0PiwgQmFzZUl0LAorICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxCYXNlSXQ+OjppdGVyYXRvcl9jYXRlZ29yeSwgVD4oX0kpLAorICAgICAgICAgIE1QKF9NUCksIFNJKF9TSSkge30KKworICAgIFQgJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgIGlmICghSXNPdXQpCisgICAgICAgIHJldHVybiAqKE1QLT5maW5kKHsqKHRoaXMtPkkpLCBTSX0pKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICooTVAtPmZpbmQoe1NJLCAqKHRoaXMtPkkpfSkpOworICAgIH0KKyAgfTsKKworcHVibGljOgorICAvLy8gQSBjb25zdCBpdGVyYXRvciB0eXBlIGZvciBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgc2V0IG9mIGVkZ2VzIGVudGVyaW5nIGEKKyAgLy8vIHZlcnRleC4KKyAgLy8vCisgIC8vLyBIYXMgYSBjb25zdCBFZGdlVmFsdWVUeXBlIGFzIGl0cyB2YWx1ZV90eXBlCisgIHVzaW5nIENvbnN0SW5FZGdlSXRlcmF0b3IgPSBOZWlnaGJvckVkZ2VJdGVyYXRvclQ8dHJ1ZSwgZmFsc2U+OworCisgIC8vLyBBbiBpdGVyYXRvciB0eXBlIGZvciBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgc2V0IG9mIGVkZ2VzIGxlYXZpbmcgYSB2ZXJ0ZXguCisgIC8vLworICAvLy8gSGFzIGFuIEVkZ2VWYWx1ZVR5cGUgYXMgaXRzIHZhbHVlX3R5cGUKKyAgdXNpbmcgSW5FZGdlSXRlcmF0b3IgPSBOZWlnaGJvckVkZ2VJdGVyYXRvclQ8ZmFsc2UsIGZhbHNlPjsKKworICAvLy8gQSBjb25zdCBpdGVyYXRvciB0eXBlIGZvciBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgc2V0IG9mIGVkZ2VzIGVudGVyaW5nIGEKKyAgLy8vIHZlcnRleC4KKyAgLy8vCisgIC8vLyBIYXMgYSBjb25zdCBFZGdlVmFsdWVUeXBlIGFzIGl0cyB2YWx1ZV90eXBlCisgIHVzaW5nIENvbnN0T3V0RWRnZUl0ZXJhdG9yID0gTmVpZ2hib3JFZGdlSXRlcmF0b3JUPHRydWUsIHRydWU+OworCisgIC8vLyBBbiBpdGVyYXRvciB0eXBlIGZvciBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgc2V0IG9mIGVkZ2VzIGxlYXZpbmcgYSB2ZXJ0ZXguCisgIC8vLworICAvLy8gSGFzIGFuIEVkZ2VWYWx1ZVR5cGUgYXMgaXRzIHZhbHVlX3R5cGUKKyAgdXNpbmcgT3V0RWRnZUl0ZXJhdG9yID0gTmVpZ2hib3JFZGdlSXRlcmF0b3JUPGZhbHNlLCB0cnVlPjsKKworICAvLy8gQSBjbGFzcyBmb3IgcmFuZ2luZyBvdmVyIHRoZSBpbmNvbWluZyBlZGdlcyBpbmNpZGVudCB0byBhIHZlcnRleC4KKyAgLy8vCisgIC8vLyBMaWtlIGFsbCB2aWV3cyBpbiB0aGlzIGNsYXNzIGl0IHByb3ZpZGVzIG1ldGhvZHMgdG8gZ2V0IHRoZSBiZWdpbm5pbmcgYW5kCisgIC8vLyBwYXN0IHRoZSByYW5nZSBpdGVyYXRvcnMgZm9yIHRoZSByYW5nZSwgYXMgd2VsbCBhcyBtZXRob2RzIHRvIGRldGVybWluZQorICAvLy8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgYW5kIHdoZXRoZXIgdGhlIHJhbmdlIGlzIGVtcHR5LgorICB0ZW1wbGF0ZSA8Ym9vbCBpc0NvbnN0LCBib29sIGlzT3V0PiBjbGFzcyBJbk91dEVkZ2VWaWV3IHsKKyAgcHVibGljOgorICAgIHVzaW5nIGl0ZXJhdG9yID0gTmVpZ2hib3JFZGdlSXRlcmF0b3JUPGlzQ29uc3QsIGlzT3V0PjsKKyAgICB1c2luZyBjb25zdF9pdGVyYXRvciA9IE5laWdoYm9yRWRnZUl0ZXJhdG9yVDx0cnVlLCBpc091dD47CisgICAgdXNpbmcgR3JhcGhUID0gdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxpc0NvbnN0LCBjb25zdCBHcmFwaCwgR3JhcGg+Ojp0eXBlOworICAgIHVzaW5nIEludGVybmFsRWRnZU1hcFQgPQorICAgICAgICB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPGlzQ29uc3QsIGNvbnN0IEVkZ2VNYXBULCBFZGdlTWFwVD46OnR5cGU7CisKKyAgcHJpdmF0ZToKKyAgICBJbnRlcm5hbEVkZ2VNYXBUICZNOworICAgIGNvbnN0IFZlcnRleElkZW50aWZpZXIgQTsKKyAgICBjb25zdCBOZWlnaGJvckxvb2t1cFQgJk5MOworCisgIHB1YmxpYzoKKyAgICBpdGVyYXRvciBiZWdpbigpIHsKKyAgICAgIGF1dG8gSXQgPSBOTC5maW5kKEEpOworICAgICAgaWYgKEl0ID09IE5MLmVuZCgpKQorICAgICAgICByZXR1cm4gaXRlcmF0b3IoKTsKKyAgICAgIHJldHVybiBpdGVyYXRvcihJdC0+c2Vjb25kLmJlZ2luKCksICZNLCBBKTsKKyAgICB9CisKKyAgICBjb25zdF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdCB7CisgICAgICBhdXRvIEl0ID0gTkwuZmluZChBKTsKKyAgICAgIGlmIChJdCA9PSBOTC5lbmQoKSkKKyAgICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCk7CisgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoSXQtPnNlY29uZC5iZWdpbigpLCAmTSwgQSk7CisgICAgfQorCisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjYmVnaW4oKTsgfQorCisgICAgaXRlcmF0b3IgZW5kKCkgeworICAgICAgYXV0byBJdCA9IE5MLmZpbmQoQSk7CisgICAgICBpZiAoSXQgPT0gTkwuZW5kKCkpCisgICAgICAgIHJldHVybiBpdGVyYXRvcigpOworICAgICAgcmV0dXJuIGl0ZXJhdG9yKEl0LT5zZWNvbmQuZW5kKCksICZNLCBBKTsKKyAgICB9CisgICAgY29uc3RfaXRlcmF0b3IgY2VuZCgpIGNvbnN0IHsKKyAgICAgIGF1dG8gSXQgPSBOTC5maW5kKEEpOworICAgICAgaWYgKEl0ID09IE5MLmVuZCgpKQorICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoKTsKKyAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihJdC0+c2Vjb25kLmVuZCgpLCAmTSwgQSk7CisgICAgfQorCisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY2VuZCgpOyB9CisKKyAgICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsKKyAgICAgIGF1dG8gSSA9IE5MLmZpbmQoQSk7CisgICAgICBpZiAoSSA9PSBOTC5lbmQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBJLT5zZWNvbmQuc2l6ZSgpOworICAgIH0KKworICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBOTC5jb3VudChBKSA9PSAwOyB9OworCisgICAgSW5PdXRFZGdlVmlldyhHcmFwaFQgJkcsIFZlcnRleElkZW50aWZpZXIgQSkKKyAgICAgICAgOiBNKEcuRWRnZXMpLCBBKEEpLCBOTChpc091dCA/IEcuT3V0TmVpZ2hib3JzIDogRy5Jbk5laWdoYm9ycykge30KKyAgfTsKKworICAvLy8gQSBjb25zdCBpdGVyYXRvciB0eXBlIGZvciBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgd2hvbGUgdmVydGV4IHNldCBvZiB0aGUKKyAgLy8vIGdyYXBoLgorICAvLy8KKyAgLy8vIEhhcyBhIGNvbnN0IFZlcnRleFZhbHVlVHlwZSBhcyBpdHMgdmFsdWVfdHlwZQorICB1c2luZyBDb25zdFZlcnRleEl0ZXJhdG9yID0gdHlwZW5hbWUgVmVydGV4TWFwVDo6Y29uc3RfaXRlcmF0b3I7CisKKyAgLy8vIEFuIGl0ZXJhdG9yIHR5cGUgZm9yIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSB3aG9sZSB2ZXJ0ZXggc2V0IG9mIHRoZSBncmFwaC4KKyAgLy8vCisgIC8vLyBIYXMgYSBWZXJ0ZXhWYWx1ZVR5cGUgYXMgaXRzIHZhbHVlX3R5cGUKKyAgdXNpbmcgVmVydGV4SXRlcmF0b3IgPSB0eXBlbmFtZSBWZXJ0ZXhNYXBUOjppdGVyYXRvcjsKKworICAvLy8gQSBjbGFzcyBmb3IgcmFuZ2luZyBvdmVyIHRoZSB2ZXJ0aWNlcyBpbiB0aGUgZ3JhcGguCisgIC8vLworICAvLy8gTGlrZSBhbGwgdmlld3MgaW4gdGhpcyBjbGFzcyBpdCBwcm92aWRlcyBtZXRob2RzIHRvIGdldCB0aGUgYmVnaW5uaW5nIGFuZAorICAvLy8gcGFzdCB0aGUgcmFuZ2UgaXRlcmF0b3JzIGZvciB0aGUgcmFuZ2UsIGFzIHdlbGwgYXMgbWV0aG9kcyB0byBkZXRlcm1pbmUKKyAgLy8vIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHJhbmdlIGFuZCB3aGV0aGVyIHRoZSByYW5nZSBpcyBlbXB0eS4KKyAgdGVtcGxhdGUgPGJvb2wgaXNDb25zdD4gY2xhc3MgVmVydGV4VmlldyB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBpdGVyYXRvciA9IHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8aXNDb25zdCwgQ29uc3RWZXJ0ZXhJdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGV4SXRlcmF0b3I+Ojp0eXBlOworICAgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gQ29uc3RWZXJ0ZXhJdGVyYXRvcjsKKyAgICB1c2luZyBHcmFwaFQgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPGlzQ29uc3QsIGNvbnN0IEdyYXBoLCBHcmFwaD46OnR5cGU7CisKKyAgcHJpdmF0ZToKKyAgICBHcmFwaFQgJkc7CisKKyAgcHVibGljOgorICAgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gRy5WZXJ0aWNlcy5iZWdpbigpOyB9CisgICAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gRy5WZXJ0aWNlcy5lbmQoKTsgfQorICAgIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEcuVmVydGljZXMuY2JlZ2luKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBjZW5kKCkgY29uc3QgeyByZXR1cm4gRy5WZXJ0aWNlcy5jZW5kKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEcuVmVydGljZXMuYmVnaW4oKTsgfQorICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEcuVmVydGljZXMuZW5kKCk7IH0KKyAgICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEcuVmVydGljZXMuc2l6ZSgpOyB9CisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEcuVmVydGljZXMuZW1wdHkoKTsgfQorICAgIFZlcnRleFZpZXcoR3JhcGhUICZfRykgOiBHKF9HKSB7fQorICB9OworCisgIC8vLyBBIGNvbnN0IGl0ZXJhdG9yIGZvciBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgZW50aXJlIGVkZ2Ugc2V0IG9mIHRoZSBncmFwaC4KKyAgLy8vCisgIC8vLyBIYXMgYSBjb25zdCBFZGdlVmFsdWVUeXBlIGFzIGl0cyB2YWx1ZV90eXBlCisgIHVzaW5nIENvbnN0RWRnZUl0ZXJhdG9yID0gdHlwZW5hbWUgRWRnZU1hcFQ6OmNvbnN0X2l0ZXJhdG9yOworCisgIC8vLyBBbiBpdGVyYXRvciBmb3IgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGVudGlyZSBlZGdlIHNldCBvZiB0aGUgZ3JhcGguCisgIC8vLworICAvLy8gSGFzIGFuIEVkZ2VWYWx1ZVR5cGUgYXMgaXRzIHZhbHVlX3R5cGUKKyAgdXNpbmcgRWRnZUl0ZXJhdG9yID0gdHlwZW5hbWUgRWRnZU1hcFQ6Oml0ZXJhdG9yOworCisgIC8vLyBBIGNsYXNzIGZvciByYW5naW5nIG92ZXIgYWxsIHRoZSBlZGdlcyBpbiB0aGUgZ3JhcGguCisgIC8vLworICAvLy8gTGlrZSBhbGwgdmlld3MgaW4gdGhpcyBjbGFzcyBpdCBwcm92aWRlcyBtZXRob2RzIHRvIGdldCB0aGUgYmVnaW5uaW5nIGFuZAorICAvLy8gcGFzdCB0aGUgcmFuZ2UgaXRlcmF0b3JzIGZvciB0aGUgcmFuZ2UsIGFzIHdlbGwgYXMgbWV0aG9kcyB0byBkZXRlcm1pbmUKKyAgLy8vIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHJhbmdlIGFuZCB3aGV0aGVyIHRoZSByYW5nZSBpcyBlbXB0eS4KKyAgdGVtcGxhdGUgPGJvb2wgaXNDb25zdD4gY2xhc3MgRWRnZVZpZXcgeworICBwdWJsaWM6CisgICAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPGlzQ29uc3QsIENvbnN0RWRnZUl0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGdlSXRlcmF0b3I+Ojp0eXBlOworICAgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gQ29uc3RFZGdlSXRlcmF0b3I7CisgICAgdXNpbmcgR3JhcGhUID0gdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxpc0NvbnN0LCBjb25zdCBHcmFwaCwgR3JhcGg+Ojp0eXBlOworCisgIHByaXZhdGU6CisgICAgR3JhcGhUICZHOworCisgIHB1YmxpYzoKKyAgICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIEcuRWRnZXMuYmVnaW4oKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIEcuRWRnZXMuZW5kKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdCB7IHJldHVybiBHLkVkZ2VzLmNiZWdpbigpOyB9CisgICAgY29uc3RfaXRlcmF0b3IgY2VuZCgpIGNvbnN0IHsgcmV0dXJuIEcuRWRnZXMuY2VuZCgpOyB9CisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBHLkVkZ2VzLmJlZ2luKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBHLkVkZ2VzLmVuZCgpOyB9CisgICAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBHLkVkZ2VzLnNpemUoKTsgfQorICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBHLkVkZ2VzLmVtcHR5KCk7IH0KKyAgICBFZGdlVmlldyhHcmFwaFQgJl9HKSA6IEcoX0cpIHt9CisgIH07CisKK3B1YmxpYzoKKyAgLy8gVE9ETzogaW1wbGVtZW50IGNvbnN0cnVjdG9yIHRvIGVuYWJsZSBHcmFwaCBJbml0aWFsaXNhdGlvbi5cCisgIC8vIFNvbWV0aGluZyBsaWtlOgorICAvLyAgIEdyYXBoPGludCwgaW50LCBpbnQ+IEcoCisgIC8vICAgezEsIDIsIDMsIDQsIDV9LAorICAvLyAgIHt7MSwgMn0sIHsyLCAzfSwgezMsIDR9fSk7CisKKyAgLy8vIEVtcHR5IHRoZSBHcmFwaAorICB2b2lkIGNsZWFyKCkgeworICAgIEVkZ2VzLmNsZWFyKCk7CisgICAgVmVydGljZXMuY2xlYXIoKTsKKyAgICBJbk5laWdoYm9ycy5jbGVhcigpOworICAgIE91dE5laWdoYm9ycy5jbGVhcigpOworICB9CisKKyAgLy8vIFJldHVybnMgYSB2aWV3IG9iamVjdCBhbGxvd2luZyBpdGVyYXRpb24gb3ZlciB0aGUgdmVydGljZXMgb2YgdGhlIGdyYXBoLgorICAvLy8gYWxzbyBhbGxvd3MgYWNjZXNzIHRvIHRoZSBzaXplIG9mIHRoZSB2ZXJ0ZXggc2V0LgorICBWZXJ0ZXhWaWV3PGZhbHNlPiB2ZXJ0aWNlcygpIHsgcmV0dXJuIFZlcnRleFZpZXc8ZmFsc2U+KCp0aGlzKTsgfQorCisgIFZlcnRleFZpZXc8dHJ1ZT4gdmVydGljZXMoKSBjb25zdCB7IHJldHVybiBWZXJ0ZXhWaWV3PHRydWU+KCp0aGlzKTsgfQorCisgIC8vLyBSZXR1cm5zIGEgdmlldyBvYmplY3QgYWxsb3dpbmcgaXRlcmF0aW9uIG92ZXIgdGhlIGVkZ2VzIG9mIHRoZSBncmFwaC4KKyAgLy8vIGFsc28gYWxsb3dzIGFjY2VzcyB0byB0aGUgc2l6ZSBvZiB0aGUgZWRnZSBzZXQuCisgIEVkZ2VWaWV3PGZhbHNlPiBlZGdlcygpIHsgcmV0dXJuIEVkZ2VWaWV3PGZhbHNlPigqdGhpcyk7IH0KKworICBFZGdlVmlldzx0cnVlPiBlZGdlcygpIGNvbnN0IHsgcmV0dXJuIEVkZ2VWaWV3PHRydWU+KCp0aGlzKTsgfQorCisgIC8vLyBSZXR1cm5zIGEgdmlldyBvYmplY3QgYWxsb3dpbmcgaXRlcmF0aW9uIG92ZXIgdGhlIGVkZ2VzIHdoaWNoIHN0YXJ0IGF0CisgIC8vLyBhIHZlcnRleCBJLgorICBJbk91dEVkZ2VWaWV3PGZhbHNlLCB0cnVlPiBvdXRFZGdlcyhjb25zdCBWZXJ0ZXhJZGVudGlmaWVyIEkpIHsKKyAgICByZXR1cm4gSW5PdXRFZGdlVmlldzxmYWxzZSwgdHJ1ZT4oKnRoaXMsIEkpOworICB9CisKKyAgSW5PdXRFZGdlVmlldzx0cnVlLCB0cnVlPiBvdXRFZGdlcyhjb25zdCBWZXJ0ZXhJZGVudGlmaWVyIEkpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5PdXRFZGdlVmlldzx0cnVlLCB0cnVlPigqdGhpcywgSSk7CisgIH0KKworICAvLy8gUmV0dXJucyBhIHZpZXcgb2JqZWN0IGFsbG93aW5nIGl0ZXJhdGlvbiBvdmVyIHRoZSBlZGdlcyB3aGljaCBwb2ludCB0bworICAvLy8gYSB2ZXJ0ZXggSS4KKyAgSW5PdXRFZGdlVmlldzxmYWxzZSwgZmFsc2U+IGluRWRnZXMoY29uc3QgVmVydGV4SWRlbnRpZmllciBJKSB7CisgICAgcmV0dXJuIEluT3V0RWRnZVZpZXc8ZmFsc2UsIGZhbHNlPigqdGhpcywgSSk7CisgIH0KKworICBJbk91dEVkZ2VWaWV3PHRydWUsIGZhbHNlPiBpbkVkZ2VzKGNvbnN0IFZlcnRleElkZW50aWZpZXIgSSkgY29uc3QgeworICAgIHJldHVybiBJbk91dEVkZ2VWaWV3PHRydWUsIGZhbHNlPigqdGhpcywgSSk7CisgIH0KKworICAvLy8gTG9va3MgdXAgdGhlIHZlcnRleCB3aXRoIGlkZW50aWZpZXIgSSwgaWYgaXQgZG9lcyBub3QgZXhpc3QgaXQgZGVmYXVsdAorICAvLy8gY29uc3RydWN0cyBpdC4KKyAgVmVydGV4QXR0cmlidXRlICZvcGVyYXRvcltdKGNvbnN0IFZlcnRleElkZW50aWZpZXIgJkkpIHsKKyAgICByZXR1cm4gVmVydGljZXMuRmluZEFuZENvbnN0cnVjdChJKS5zZWNvbmQ7CisgIH0KKworICAvLy8gTG9va3MgdXAgdGhlIGVkZ2Ugd2l0aCBpZGVudGlmaWVyIEksIGlmIGl0IGRvZXMgbm90IGV4aXN0IGl0IGRlZmF1bHQKKyAgLy8vIGNvbnN0cnVjdHMgaXQsIGlmIGl0J3MgZW5kcG9pbnRzIGRvIG5vdCBleGlzdCBpdCBhbHNvIGRlZmF1bHQgY29uc3RydWN0cworICAvLy8gdGhlbS4KKyAgRWRnZUF0dHJpYnV0ZSAmb3BlcmF0b3JbXShjb25zdCBFZGdlSWRlbnRpZmllciAmSSkgeworICAgIGF1dG8gJlAgPSBFZGdlcy5GaW5kQW5kQ29uc3RydWN0KEkpOworICAgIFZlcnRpY2VzLkZpbmRBbmRDb25zdHJ1Y3QoSS5maXJzdCk7CisgICAgVmVydGljZXMuRmluZEFuZENvbnN0cnVjdChJLnNlY29uZCk7CisgICAgSW5OZWlnaGJvcnNbSS5zZWNvbmRdLmluc2VydChJLmZpcnN0KTsKKyAgICBPdXROZWlnaGJvcnNbSS5maXJzdF0uaW5zZXJ0KEkuc2Vjb25kKTsKKyAgICByZXR1cm4gUC5zZWNvbmQ7CisgIH0KKworICAvLy8gTG9va3MgdXAgYSB2ZXJ0ZXggd2l0aCBJZGVudGlmaWVyIEksIG9yIGFuIGVycm9yIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICBFeHBlY3RlZDxWZXJ0ZXhBdHRyaWJ1dGUgJj4gYXQoY29uc3QgVmVydGV4SWRlbnRpZmllciAmSSkgeworICAgIGF1dG8gSXQgPSBWZXJ0aWNlcy5maW5kKEkpOworICAgIGlmIChJdCA9PSBWZXJ0aWNlcy5lbmQoKSkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPFN0cmluZ0Vycm9yPigKKyAgICAgICAgICAiVmVydGV4IElkZW50aWZpZXIgRG9lcyBOb3QgRXhpc3QiLAorICAgICAgICAgIHN0ZDo6bWFrZV9lcnJvcl9jb2RlKHN0ZDo6ZXJyYzo6aW52YWxpZF9hcmd1bWVudCkpOworICAgIHJldHVybiBJdC0+c2Vjb25kOworICB9CisKKyAgRXhwZWN0ZWQ8Y29uc3QgVmVydGV4QXR0cmlidXRlICY+IGF0KGNvbnN0IFZlcnRleElkZW50aWZpZXIgJkkpIGNvbnN0IHsKKyAgICBhdXRvIEl0ID0gVmVydGljZXMuZmluZChJKTsKKyAgICBpZiAoSXQgPT0gVmVydGljZXMuZW5kKCkpCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxTdHJpbmdFcnJvcj4oCisgICAgICAgICAgIlZlcnRleCBJZGVudGlmaWVyIERvZXMgTm90IEV4aXN0IiwKKyAgICAgICAgICBzdGQ6Om1ha2VfZXJyb3JfY29kZShzdGQ6OmVycmM6OmludmFsaWRfYXJndW1lbnQpKTsKKyAgICByZXR1cm4gSXQtPnNlY29uZDsKKyAgfQorCisgIC8vLyBMb29rcyB1cCBhbiBlZGdlIHdpdGggSWRlbnRpZmllciBJLCBvciBhbiBlcnJvciBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgRXhwZWN0ZWQ8RWRnZUF0dHJpYnV0ZSAmPiBhdChjb25zdCBFZGdlSWRlbnRpZmllciAmSSkgeworICAgIGF1dG8gSXQgPSBFZGdlcy5maW5kKEkpOworICAgIGlmIChJdCA9PSBFZGdlcy5lbmQoKSkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPFN0cmluZ0Vycm9yPigKKyAgICAgICAgICAiRWRnZSBJZGVudGlmaWVyIERvZXMgTm90IEV4aXN0IiwKKyAgICAgICAgICBzdGQ6Om1ha2VfZXJyb3JfY29kZShzdGQ6OmVycmM6OmludmFsaWRfYXJndW1lbnQpKTsKKyAgICByZXR1cm4gSXQtPnNlY29uZDsKKyAgfQorCisgIEV4cGVjdGVkPGNvbnN0IEVkZ2VBdHRyaWJ1dGUgJj4gYXQoY29uc3QgRWRnZUlkZW50aWZpZXIgJkkpIGNvbnN0IHsKKyAgICBhdXRvIEl0ID0gRWRnZXMuZmluZChJKTsKKyAgICBpZiAoSXQgPT0gRWRnZXMuZW5kKCkpCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxTdHJpbmdFcnJvcj4oCisgICAgICAgICAgIkVkZ2UgSWRlbnRpZmllciBEb2VzIE5vdCBFeGlzdCIsCisgICAgICAgICAgc3RkOjptYWtlX2Vycm9yX2NvZGUoc3RkOjplcnJjOjppbnZhbGlkX2FyZ3VtZW50KSk7CisgICAgcmV0dXJuIEl0LT5zZWNvbmQ7CisgIH0KKworICAvLy8gTG9va3MgZm9yIGEgdmVydGV4IHdpdGggaWRlbnRpZmllciBJLCByZXR1cm5zIDEgaWYgb25lIGV4aXN0cywgYW5kCisgIC8vLyAwIG90aGVyd2lzZQorICBzaXplX3R5cGUgY291bnQoY29uc3QgVmVydGV4SWRlbnRpZmllciAmSSkgY29uc3QgeworICAgIHJldHVybiBWZXJ0aWNlcy5jb3VudChJKTsKKyAgfQorCisgIC8vLyBMb29rcyBmb3IgYW4gZWRnZSB3aXRoIElkZW50aWZpZXIgSSwgcmV0dXJucyAxIGlmIG9uZSBleGlzdHMgYW5kIDAKKyAgLy8vIG90aGVyd2lzZQorICBzaXplX3R5cGUgY291bnQoY29uc3QgRWRnZUlkZW50aWZpZXIgJkkpIGNvbnN0IHsgcmV0dXJuIEVkZ2VzLmNvdW50KEkpOyB9CisKKyAgLy8vIEluc2VydHMgYSB2ZXJ0ZXggaW50byB0aGUgZ3JhcGggd2l0aCBJZGVudGlmaWVyIFZhbC5maXJzdCwgYW5kCisgIC8vLyBBdHRyaWJ1dGUgVmFsLnNlY29uZC4KKyAgc3RkOjpwYWlyPFZlcnRleEl0ZXJhdG9yLCBib29sPgorICBpbnNlcnQoY29uc3Qgc3RkOjpwYWlyPFZlcnRleElkZW50aWZpZXIsIFZlcnRleEF0dHJpYnV0ZT4gJlZhbCkgeworICAgIHJldHVybiBWZXJ0aWNlcy5pbnNlcnQoVmFsKTsKKyAgfQorCisgIHN0ZDo6cGFpcjxWZXJ0ZXhJdGVyYXRvciwgYm9vbD4KKyAgaW5zZXJ0KHN0ZDo6cGFpcjxWZXJ0ZXhJZGVudGlmaWVyLCBWZXJ0ZXhBdHRyaWJ1dGU+ICYmVmFsKSB7CisgICAgcmV0dXJuIFZlcnRpY2VzLmluc2VydChzdGQ6Om1vdmUoVmFsKSk7CisgIH0KKworICAvLy8gSW5zZXJ0cyBhbiBlZGdlIGludG8gdGhlIGdyYXBoIHdpdGggSWRlbnRpZmllciBWYWwuZmlyc3QsIGFuZAorICAvLy8gQXR0cmlidXRlIFZhbC5zZWNvbmQuIElmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiB0aGUgbWFwLCBpdCByZXR1cm5zIGZhbHNlCisgIC8vLyBhbmQgZG9lc24ndCB1cGRhdGUgdGhlIHZhbHVlLgorICBzdGQ6OnBhaXI8RWRnZUl0ZXJhdG9yLCBib29sPgorICBpbnNlcnQoY29uc3Qgc3RkOjpwYWlyPEVkZ2VJZGVudGlmaWVyLCBFZGdlQXR0cmlidXRlPiAmVmFsKSB7CisgICAgY29uc3QgYXV0byAmcCA9IEVkZ2VzLmluc2VydChWYWwpOworICAgIGlmIChwLnNlY29uZCkgeworICAgICAgY29uc3QgYXV0byAmRUkgPSBWYWwuZmlyc3Q7CisgICAgICBWZXJ0aWNlcy5GaW5kQW5kQ29uc3RydWN0KEVJLmZpcnN0KTsKKyAgICAgIFZlcnRpY2VzLkZpbmRBbmRDb25zdHJ1Y3QoRUkuc2Vjb25kKTsKKyAgICAgIEluTmVpZ2hib3JzW0VJLnNlY29uZF0uaW5zZXJ0KEVJLmZpcnN0KTsKKyAgICAgIE91dE5laWdoYm9yc1tFSS5maXJzdF0uaW5zZXJ0KEVJLnNlY29uZCk7CisgICAgfTsKKworICAgIHJldHVybiBwOworICB9CisKKyAgLy8vIEluc2VydHMgYW4gZWRnZSBpbnRvIHRoZSBncmFwaCB3aXRoIElkZW50aWZpZXIgVmFsLmZpcnN0LCBhbmQKKyAgLy8vIEF0dHJpYnV0ZSBWYWwuc2Vjb25kLiBJZiB0aGUga2V5IGlzIGFscmVhZHkgaW4gdGhlIG1hcCwgaXQgcmV0dXJucyBmYWxzZQorICAvLy8gYW5kIGRvZXNuJ3QgdXBkYXRlIHRoZSB2YWx1ZS4KKyAgc3RkOjpwYWlyPEVkZ2VJdGVyYXRvciwgYm9vbD4KKyAgaW5zZXJ0KHN0ZDo6cGFpcjxFZGdlSWRlbnRpZmllciwgRWRnZUF0dHJpYnV0ZT4gJiZWYWwpIHsKKyAgICBhdXRvIEVJID0gVmFsLmZpcnN0OworICAgIGNvbnN0IGF1dG8gJnAgPSBFZGdlcy5pbnNlcnQoc3RkOjptb3ZlKFZhbCkpOworICAgIGlmIChwLnNlY29uZCkgeworICAgICAgVmVydGljZXMuRmluZEFuZENvbnN0cnVjdChFSS5maXJzdCk7CisgICAgICBWZXJ0aWNlcy5GaW5kQW5kQ29uc3RydWN0KEVJLnNlY29uZCk7CisgICAgICBJbk5laWdoYm9yc1tFSS5zZWNvbmRdLmluc2VydChFSS5maXJzdCk7CisgICAgICBPdXROZWlnaGJvcnNbRUkuZmlyc3RdLmluc2VydChFSS5zZWNvbmQpOworICAgIH07CisKKyAgICByZXR1cm4gcDsKKyAgfQorfTsKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9YUmF5L0luc3RydW1lbnRhdGlvbk1hcC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9YUmF5L0luc3RydW1lbnRhdGlvbk1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYmZjYTMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1hSYXkvSW5zdHJ1bWVudGF0aW9uTWFwLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8vPT09LSBJbnN0cnVtZW50YXRpb25NYXAuaCAtIFhSYXkgSW5zdHJ1bWVudGF0aW9uIE1hcCAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVmaW5lcyB0aGUgaW50ZXJmYWNlIGZvciBleHRyYWN0aW5nIHRoZSBpbnN0cnVtZW50YXRpb24gbWFwIGZyb20gYW4KKy8vIFhSYXktaW5zdHJ1bWVudGVkIGJpbmFyeS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fWFJBWV9JTlNUUlVNRU5UQVRJT05fTUFQX0gKKyNkZWZpbmUgTExWTV9YUkFZX0lOU1RSVU1FTlRBVElPTl9NQVBfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvWUFNTFRyYWl0cy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIHhyYXkgeworCisvLyBGb3J3YXJkIGRlY2xhcmUgdG8gbWFrZSBhIGZyaWVuZC4KK2NsYXNzIEluc3RydW1lbnRhdGlvbk1hcDsKKworLy8vIExvYWRzIHRoZSBpbnN0cnVtZW50YXRpb24gbWFwIGZyb20gfEZpbGVuYW1lfC4gVGhpcyBhdXRvLWRlZHVjZXMgdGhlIHR5cGUgb2YKKy8vLyB0aGUgaW5zdHJ1bWVudGF0aW9uIG1hcC4KK0V4cGVjdGVkPEluc3RydW1lbnRhdGlvbk1hcD4gbG9hZEluc3RydW1lbnRhdGlvbk1hcChTdHJpbmdSZWYgRmlsZW5hbWUpOworCisvLy8gUmVwcmVzZW50cyBhbiBYUmF5IGluc3RydW1lbnRhdGlvbiBzbGVkIGVudHJ5IGZyb20gYW4gb2JqZWN0IGZpbGUuCitzdHJ1Y3QgU2xlZEVudHJ5IHsKKyAgLy8vIEVhY2ggZW50cnkgaGVyZSByZXByZXNlbnRzIHRoZSBraW5kcyBvZiBzdXBwb3J0ZWQgaW5zdHJ1bWVudGF0aW9uIG1hcAorICAvLy8gZW50cmllcy4KKyAgZW51bSBjbGFzcyBGdW5jdGlvbktpbmRzIHsgRU5UUlksIEVYSVQsIFRBSUwsIExPR19BUkdTX0VOVEVSLCBDVVNUT01fRVZFTlQgfTsKKworICAvLy8gVGhlIGFkZHJlc3Mgb2YgdGhlIHNsZWQuCisgIHVpbnQ2NF90IEFkZHJlc3M7CisKKyAgLy8vIFRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbi4KKyAgdWludDY0X3QgRnVuY3Rpb247CisKKyAgLy8vIFRoZSBraW5kIG9mIHNsZWQuCisgIEZ1bmN0aW9uS2luZHMgS2luZDsKKworICAvLy8gV2hldGhlciB0aGUgc2xlZCB3YXMgYW5ub3RhdGVkIHRvIGFsd2F5cyBiZSBpbnN0cnVtZW50ZWQuCisgIGJvb2wgQWx3YXlzSW5zdHJ1bWVudDsKK307CisKK3N0cnVjdCBZQU1MWFJheVNsZWRFbnRyeSB7CisgIGludDMyX3QgRnVuY0lkOworICB5YW1sOjpIZXg2NCBBZGRyZXNzOworICB5YW1sOjpIZXg2NCBGdW5jdGlvbjsKKyAgU2xlZEVudHJ5OjpGdW5jdGlvbktpbmRzIEtpbmQ7CisgIGJvb2wgQWx3YXlzSW5zdHJ1bWVudDsKKyAgc3RkOjpzdHJpbmcgRnVuY3Rpb25OYW1lOworfTsKKworLy8vIFRoZSBJbnN0cnVtZW50YXRpb25NYXAgcmVwcmVzZW50cyB0aGUgY29tcHV0ZWQgZnVuY3Rpb24gaWQncyBhbmQgaW5kaWNhdGVkCisvLy8gZnVuY3Rpb24gYWRkcmVzc2VzIGZyb20gYW4gb2JqZWN0IGZpbGUgKG9yIGEgWUFNTCBmaWxlKS4gVGhpcyBwcm92aWRlcyBhbgorLy8vIGludGVyZmFjZSB0byBqdXN0IHRoZSBtYXBwaW5nIGJldHdlZW4gdGhlIGZ1bmN0aW9uIGlkLCBhbmQgdGhlIGZ1bmN0aW9uCisvLy8gYWRkcmVzcy4KKy8vLworLy8vIFdlIGFsc28gcHJvdmlkZSByYXcgYWNjZXNzIHRvIHRoZSBhY3R1YWwgaW5zdHJ1bWVudGF0aW9uIG1hcCBlbnRyaWVzIHdlIGZpbmQKKy8vLyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlLgorLy8vCitjbGFzcyBJbnN0cnVtZW50YXRpb25NYXAgeworcHVibGljOgorICB1c2luZyBGdW5jdGlvbkFkZHJlc3NNYXAgPSBzdGQ6OnVub3JkZXJlZF9tYXA8aW50MzJfdCwgdWludDY0X3Q+OworICB1c2luZyBGdW5jdGlvbkFkZHJlc3NSZXZlcnNlTWFwID0gc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBpbnQzMl90PjsKKyAgdXNpbmcgU2xlZENvbnRhaW5lciA9IHN0ZDo6dmVjdG9yPFNsZWRFbnRyeT47CisKK3ByaXZhdGU6CisgIFNsZWRDb250YWluZXIgU2xlZHM7CisgIEZ1bmN0aW9uQWRkcmVzc01hcCBGdW5jdGlvbkFkZHJlc3NlczsKKyAgRnVuY3Rpb25BZGRyZXNzUmV2ZXJzZU1hcCBGdW5jdGlvbklkczsKKworICBmcmllbmQgRXhwZWN0ZWQ8SW5zdHJ1bWVudGF0aW9uTWFwPiBsb2FkSW5zdHJ1bWVudGF0aW9uTWFwKFN0cmluZ1JlZik7CisKK3B1YmxpYzoKKyAgLy8vIFByb3ZpZGVzIGEgcmF3IGFjY2Vzc29yIHRvIHRoZSB1bm9yZGVyZWQgbWFwIG9mIGZ1bmN0aW9uIGFkZHJlc3Nlcy4KKyAgY29uc3QgRnVuY3Rpb25BZGRyZXNzTWFwICZnZXRGdW5jdGlvbkFkZHJlc3NlcygpIHsgcmV0dXJuIEZ1bmN0aW9uQWRkcmVzc2VzOyB9CisKKyAgLy8vIFJldHVybnMgYW4gWFJheSBjb21wdXRlZCBmdW5jdGlvbiBpZCwgcHJvdmlkZWQgYSBmdW5jdGlvbiBhZGRyZXNzLgorICBPcHRpb25hbDxpbnQzMl90PiBnZXRGdW5jdGlvbklkKHVpbnQ2NF90IEFkZHIpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBmdW5jdGlvbiBhZGRyZXNzIGZvciBhIGZ1bmN0aW9uIGlkLgorICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0RnVuY3Rpb25BZGRyKGludDMyX3QgRnVuY0lkKSBjb25zdDsKKworICAvLy8gUHJvdmlkZSByZWFkLW9ubHkgYWNjZXNzIHRvIHRoZSBlbnRyaWVzIG9mIHRoZSBpbnN0cnVtZW50YXRpb24gbWFwLgorICBjb25zdCBTbGVkQ29udGFpbmVyICZzbGVkcygpIGNvbnN0IHsgcmV0dXJuIFNsZWRzOyB9OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHhyYXkKKworbmFtZXNwYWNlIHlhbWwgeworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8eHJheTo6U2xlZEVudHJ5OjpGdW5jdGlvbktpbmRzPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgeHJheTo6U2xlZEVudHJ5OjpGdW5jdGlvbktpbmRzICZLaW5kKSB7CisgICAgSU8uZW51bUNhc2UoS2luZCwgImZ1bmN0aW9uLWVudGVyIiwgeHJheTo6U2xlZEVudHJ5OjpGdW5jdGlvbktpbmRzOjpFTlRSWSk7CisgICAgSU8uZW51bUNhc2UoS2luZCwgImZ1bmN0aW9uLWV4aXQiLCB4cmF5OjpTbGVkRW50cnk6OkZ1bmN0aW9uS2luZHM6OkVYSVQpOworICAgIElPLmVudW1DYXNlKEtpbmQsICJ0YWlsLWV4aXQiLCB4cmF5OjpTbGVkRW50cnk6OkZ1bmN0aW9uS2luZHM6OlRBSUwpOworICAgIElPLmVudW1DYXNlKEtpbmQsICJsb2ctYXJncy1lbnRlciIsCisgICAgICAgICAgICAgICAgeHJheTo6U2xlZEVudHJ5OjpGdW5jdGlvbktpbmRzOjpMT0dfQVJHU19FTlRFUik7CisgICAgSU8uZW51bUNhc2UoS2luZCwgImN1c3RvbS1ldmVudCIsCisgICAgICAgICAgICAgICAgeHJheTo6U2xlZEVudHJ5OjpGdW5jdGlvbktpbmRzOjpDVVNUT01fRVZFTlQpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czx4cmF5OjpZQU1MWFJheVNsZWRFbnRyeT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgeHJheTo6WUFNTFhSYXlTbGVkRW50cnkgJkVudHJ5KSB7CisgICAgSU8ubWFwUmVxdWlyZWQoImlkIiwgRW50cnkuRnVuY0lkKTsKKyAgICBJTy5tYXBSZXF1aXJlZCgiYWRkcmVzcyIsIEVudHJ5LkFkZHJlc3MpOworICAgIElPLm1hcFJlcXVpcmVkKCJmdW5jdGlvbiIsIEVudHJ5LkZ1bmN0aW9uKTsKKyAgICBJTy5tYXBSZXF1aXJlZCgia2luZCIsIEVudHJ5LktpbmQpOworICAgIElPLm1hcFJlcXVpcmVkKCJhbHdheXMtaW5zdHJ1bWVudCIsIEVudHJ5LkFsd2F5c0luc3RydW1lbnQpOworICAgIElPLm1hcE9wdGlvbmFsKCJmdW5jdGlvbi1uYW1lIiwgRW50cnkuRnVuY3Rpb25OYW1lKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBmbG93ID0gdHJ1ZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSB5YW1sCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IoeHJheTo6WUFNTFhSYXlTbGVkRW50cnkpCisKKyNlbmRpZiAvLyBMTFZNX1hSQVlfSU5TVFJVTUVOVEFUSU9OX01BUF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1hSYXkvVHJhY2UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vWFJheS9UcmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMDMzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1hSYXkvVHJhY2UuaApAQCAtMCwwICsxLDcxIEBACisvLz09PS0gVHJhY2UuaCAtIFhSYXkgVHJhY2UgQWJzdHJhY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIERlZmluZXMgdGhlIFhSYXkgVHJhY2UgY2xhc3MgcmVwcmVzZW50aW5nIHJlY29yZHMgaW4gYW4gWFJheSB0cmFjZSBmaWxlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fWFJBWV9UUkFDRV9ICisjZGVmaW5lIExMVk1fWFJBWV9UUkFDRV9ICisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAibGx2bS9YUmF5L1hSYXlSZWNvcmQuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHhyYXkgeworCisvLy8gQSBUcmFjZSBvYmplY3QgcmVwcmVzZW50cyB0aGUgcmVjb3JkcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgZnJvbSBYUmF5CisvLy8gbG9nIGZpbGVzIGdlbmVyYXRlZCBieSBpbnN0cnVtZW50ZWQgYmluYXJpZXMuIFdlIGVuY2Fwc3VsYXRlIHRoZSBsb2dpYyBvZgorLy8vIHJlYWRpbmcgdGhlIHRyYWNlcyBpbiBmYWN0b3J5IGZ1bmN0aW9ucyB0aGF0IHBvcHVsYXRlIHRoZSBUcmFjZSBvYmplY3QKKy8vLyBhcHByb3ByaWF0ZWx5LgorLy8vCisvLy8gVHJhY2Ugb2JqZWN0cyBwcm92aWRlIGFuIGFjY2Vzc29yIHRvIGFuIFhSYXlGaWxlSGVhZGVyIHdoaWNoIHNheXMgbW9yZSBhYm91dAorLy8vIGRldGFpbHMgb2YgdGhlIGZpbGUgZnJvbSB3aGljaCB0aGUgWFJheSB0cmFjZSB3YXMgbG9hZGVkIGZyb20uCisvLy8KKy8vLyBVc2FnZToKKy8vLworLy8vICAgaWYgKGF1dG8gVHJhY2VPckVyciA9IGxvYWRUcmFjZUZpbGUoInhyYXktbG9nLnNvbWV0aGluZy54cmF5IikpIHsKKy8vLyAgICAgYXV0byYgVCA9ICpUcmFjZU9yRXJyOworLy8vICAgICAvLyBULmdldEZpbGVIZWFkZXIoKSB3aWxsIHByb3ZpZGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdHJhY2UgaGVhZGVyLgorLy8vICAgICBmb3IgKGNvbnN0IFhSYXlSZWNvcmQgJlIgOiBUKSB7CisvLy8gICAgICAgLy8gLi4uIGRvIHNvbWV0aGluZyB3aXRoIFIgaGVyZS4KKy8vLyAgICAgfQorLy8vICAgfSBlbHNlIHsKKy8vLyAgICAgLy8gSGFuZGxlIHRoZSBlcnJvciBoZXJlLgorLy8vICAgfQorLy8vCitjbGFzcyBUcmFjZSB7CisgIFhSYXlGaWxlSGVhZGVyIEZpbGVIZWFkZXI7CisgIHN0ZDo6dmVjdG9yPFhSYXlSZWNvcmQ+IFJlY29yZHM7CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxYUmF5UmVjb3JkPjo6Y29uc3RfaXRlcmF0b3IgY2l0ZXJhdG9yOworCisgIGZyaWVuZCBFeHBlY3RlZDxUcmFjZT4gbG9hZFRyYWNlRmlsZShTdHJpbmdSZWYsIGJvb2wpOworCitwdWJsaWM6CisgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGxvYWRlZCBYUmF5IHRyYWNlIGZpbGUgaGVhZGVyLgorICBjb25zdCBYUmF5RmlsZUhlYWRlciAmZ2V0RmlsZUhlYWRlcigpIGNvbnN0IHsgcmV0dXJuIEZpbGVIZWFkZXI7IH0KKworICBjaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBSZWNvcmRzLmJlZ2luKCk7IH0KKyAgY2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFJlY29yZHMuZW5kKCk7IH0KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBSZWNvcmRzLnNpemUoKTsgfQorfTsKKworLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBhdHRlbXB0IHRvIGxvYWQgWFJheSB0cmFjZSByZWNvcmRzIGZyb20gdGhlIHByb3ZpZGVkCisvLy8gfEZpbGVuYW1lfC4KK0V4cGVjdGVkPFRyYWNlPiBsb2FkVHJhY2VGaWxlKFN0cmluZ1JlZiBGaWxlbmFtZSwgYm9vbCBTb3J0ID0gZmFsc2UpOworCit9IC8vIG5hbWVzcGFjZSB4cmF5Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1hSQVlfVFJBQ0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9YUmF5L1hSYXlSZWNvcmQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vWFJheS9YUmF5UmVjb3JkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1ZTlmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vWFJheS9YUmF5UmVjb3JkLmgKQEAgLTAsMCArMSw4NSBAQAorLy89PT0tIFhSYXlSZWNvcmQuaCAtIFhSYXkgVHJhY2UgUmVjb3JkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcmVwbGljYXRlcyB0aGUgcmVjb3JkIGRlZmluaXRpb24gZm9yIFhSYXkgbG9nIGVudHJpZXMuIFRoaXMgc2hvdWxkCisvLyBmb2xsb3cgdGhlIGV2b2x1dGlvbiBvZiB0aGUgbG9nIHJlY29yZCB2ZXJzaW9ucyBzdXBwb3J0ZWQgaW4gdGhlIGNvbXBpbGVyLXJ0CisvLyB4cmF5IHByb2plY3QuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9YUkFZX1hSQVlfUkVDT1JEX0gKKyNkZWZpbmUgTExWTV9YUkFZX1hSQVlfUkVDT1JEX0gKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgeHJheSB7CisKKy8vLyBYUmF5IHRyYWNlcyBhbGwgaGF2ZSBhIGhlYWRlciBwcm92aWRpbmcgc29tZSB0b3AtbWF0dGVyIGluZm9ybWF0aW9uIHVzZWZ1bAorLy8vIHRvIGhlbHAgdG9vbHMgZGV0ZXJtaW5lIGhvdyB0byBpbnRlcnByZXQgdGhlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBpbiB0aGUKKy8vLyB0cmFjZS4KK3N0cnVjdCBYUmF5RmlsZUhlYWRlciB7CisgIC8vLyBWZXJzaW9uIG9mIHRoZSBYUmF5IGltcGxlbWVudGF0aW9uIHRoYXQgcHJvZHVjZWQgdGhpcyBmaWxlLgorICB1aW50MTZfdCBWZXJzaW9uID0gMDsKKworICAvLy8gQSBudW1lcmljIGlkZW50aWZpZXIgZm9yIHRoZSB0eXBlIG9mIGZpbGUgdGhpcyBpcy4gQmVzdCB1c2VkIGluCisgIC8vLyBjb21iaW5hdGlvbiB3aXRoIFZlcnNpb24uCisgIHVpbnQxNl90IFR5cGUgPSAwOworCisgIC8vLyBXaGV0aGVyIHRoZSBDUFUgdGhhdCBwcm9kdWNlZCB0aGUgdGltZXN0YW1wIGNvdW50ZXJzIChUU0MpIG1vdmUgYXQgYQorICAvLy8gY29uc3RhbnQgcmF0ZS4KKyAgYm9vbCBDb25zdGFudFRTQzsKKworICAvLy8gV2hldGhlciB0aGUgQ1BVIHRoYXQgcHJvZHVjZWQgdGhlIHRpbWVzdGFtcCBjb3VudGVycyAoVFNDKSBkbyBub3Qgc3RvcC4KKyAgYm9vbCBOb25zdG9wVFNDOworCisgIC8vLyBUaGUgbnVtYmVyIG9mIGN5Y2xlcyBwZXIgc2Vjb25kIGZvciB0aGUgQ1BVIHRoYXQgcHJvZHVjZWQgdGhlIHRpbWVzdGFtcAorICAvLy8gY291bnRlciAoVFNDKSB2YWx1ZXMuIFVzZWZ1bCBmb3IgZXN0aW1hdGluZyB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdAorICAvLy8gZWxhcHNlZCBiZXR3ZWVuIHR3byBUU0NzIG9uIHNvbWUgcGxhdGZvcm1zLgorICB1aW50NjRfdCBDeWNsZUZyZXF1ZW5jeSA9IDA7CisKKyAgLy8gVGhpcyBpcyBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHhyYXkgcmVjb3JkLiBUaGUgbmFpdmUgZm9ybWF0CisgIC8vIHN0b3JlcyBhIFdhbGxjbG9jayB0aW1lc3BlYy4gRkRSIGxvZ2dpbmcgc3RvcmVzIHRoZSBzaXplIG9mIGEgdGhyZWFkCisgIC8vIGJ1ZmZlci4KKyAgY2hhciBGcmVlRm9ybURhdGFbMTZdOworfTsKKworLy8vIERldGVybWluZXMgdGhlIHN1cHBvcnRlZCB0eXBlcyBvZiByZWNvcmRzIHRoYXQgY291bGQgYmUgc2VlbiBpbiBYUmF5IHRyYWNlcy4KKy8vLyBUaGlzIG1heSBvciBtYXkgbm90IGNvcnJlc3BvbmQgdG8gYWN0dWFsIHJlY29yZCB0eXBlcyBpbiB0aGUgcmF3IHRyYWNlIChhcworLy8vIHRoZSBsb2FkZXIgaW1wbGVtZW50YXRpb24gbWF5IHN5bnRoZXNpemUgdGhpcyBpbmZvcm1hdGlvbiBpbiB0aGUgcHJvY2VzcyBvZgorLy8vIG9mIGxvYWRpbmcpLgorZW51bSBjbGFzcyBSZWNvcmRUeXBlcyB7IEVOVEVSLCBFWElULCBUQUlMX0VYSVQsIEVOVEVSX0FSRyB9OworCitzdHJ1Y3QgWFJheVJlY29yZCB7CisgIC8vLyBUaGUgdHlwZSBvZiByZWNvcmQuCisgIHVpbnQxNl90IFJlY29yZFR5cGU7CisKKyAgLy8vIFRoZSBDUFUgd2hlcmUgdGhlIHRocmVhZCBpcyBydW5uaW5nLiBXZSBhc3N1bWUgbnVtYmVyIG9mIENQVXMgPD0gNjU1MzYuCisgIHVpbnQxNl90IENQVTsKKworICAvLy8gSWRlbnRpZmllcyB0aGUgdHlwZSBvZiByZWNvcmQuCisgIFJlY29yZFR5cGVzIFR5cGU7CisKKyAgLy8vIFRoZSBmdW5jdGlvbiBJRCBmb3IgdGhlIHJlY29yZC4KKyAgaW50MzJfdCBGdW5jSWQ7CisKKyAgLy8vIEdldCB0aGUgZnVsbCA4IGJ5dGVzIG9mIHRoZSBUU0Mgd2hlbiB3ZSBnZXQgdGhlIGxvZyByZWNvcmQuCisgIHVpbnQ2NF90IFRTQzsKKworICAvLy8gVGhlIHRocmVhZCBJRCBmb3IgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRocmVhZC4KKyAgdWludDMyX3QgVElkOworCisgIC8vLyBUaGUgZnVuY3Rpb24gY2FsbCBhcmd1bWVudHMuCisgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBDYWxsQXJnczsKK307CisKK30gLy8gbmFtZXNwYWNlIHhyYXkKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fWFJBWV9YUkFZX1JFQ09SRF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1hSYXkvWUFNTFhSYXlSZWNvcmQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vWFJheS9ZQU1MWFJheVJlY29yZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MzZhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1hSYXkvWUFNTFhSYXlSZWNvcmQuaApAQCAtMCwwICsxLDEwMyBAQAorLy89PT0tIFlBTUxYUmF5UmVjb3JkLmggLSBYUmF5IFJlY29yZCBZQU1MIFN1cHBvcnQgRGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUeXBlcyBhbmQgdHJhaXRzIHNwZWNpYWxpc2F0aW9ucyBmb3IgWUFNTCBJL08gb2YgWFJheSBsb2cgZW50cmllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX1hSQVlfWUFNTF9YUkFZX1JFQ09SRF9ICisjZGVmaW5lIExMVk1fWFJBWV9ZQU1MX1hSQVlfUkVDT1JEX0gKKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1lBTUxUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL1hSYXkvWFJheVJlY29yZC5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgeHJheSB7CisKK3N0cnVjdCBZQU1MWFJheUZpbGVIZWFkZXIgeworICB1aW50MTZfdCBWZXJzaW9uOworICB1aW50MTZfdCBUeXBlOworICBib29sIENvbnN0YW50VFNDOworICBib29sIE5vbnN0b3BUU0M7CisgIHVpbnQ2NF90IEN5Y2xlRnJlcXVlbmN5OworfTsKKworc3RydWN0IFlBTUxYUmF5UmVjb3JkIHsKKyAgdWludDE2X3QgUmVjb3JkVHlwZTsKKyAgdWludDE2X3QgQ1BVOworICBSZWNvcmRUeXBlcyBUeXBlOworICBpbnQzMl90IEZ1bmNJZDsKKyAgc3RkOjpzdHJpbmcgRnVuY3Rpb247CisgIHVpbnQ2NF90IFRTQzsKKyAgdWludDMyX3QgVElkOworICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gQ2FsbEFyZ3M7Cit9OworCitzdHJ1Y3QgWUFNTFhSYXlUcmFjZSB7CisgIFlBTUxYUmF5RmlsZUhlYWRlciBIZWFkZXI7CisgIHN0ZDo6dmVjdG9yPFlBTUxYUmF5UmVjb3JkPiBSZWNvcmRzOworfTsKKworfSAvLyBuYW1lc3BhY2UgeHJheQorCituYW1lc3BhY2UgeWFtbCB7CisKKy8vIFlBTUwgVHJhaXRzCisvLyAtLS0tLS0tLS0tLQordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPHhyYXk6OlJlY29yZFR5cGVzPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgeHJheTo6UmVjb3JkVHlwZXMgJlR5cGUpIHsKKyAgICBJTy5lbnVtQ2FzZShUeXBlLCAiZnVuY3Rpb24tZW50ZXIiLCB4cmF5OjpSZWNvcmRUeXBlczo6RU5URVIpOworICAgIElPLmVudW1DYXNlKFR5cGUsICJmdW5jdGlvbi1leGl0IiwgeHJheTo6UmVjb3JkVHlwZXM6OkVYSVQpOworICAgIElPLmVudW1DYXNlKFR5cGUsICJmdW5jdGlvbi10YWlsLWV4aXQiLCB4cmF5OjpSZWNvcmRUeXBlczo6VEFJTF9FWElUKTsKKyAgICBJTy5lbnVtQ2FzZShUeXBlLCAiZnVuY3Rpb24tZW50ZXItYXJnIiwgeHJheTo6UmVjb3JkVHlwZXM6OkVOVEVSX0FSRyk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPHhyYXk6OllBTUxYUmF5RmlsZUhlYWRlcj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgeHJheTo6WUFNTFhSYXlGaWxlSGVhZGVyICZIZWFkZXIpIHsKKyAgICBJTy5tYXBSZXF1aXJlZCgidmVyc2lvbiIsIEhlYWRlci5WZXJzaW9uKTsKKyAgICBJTy5tYXBSZXF1aXJlZCgidHlwZSIsIEhlYWRlci5UeXBlKTsKKyAgICBJTy5tYXBSZXF1aXJlZCgiY29uc3RhbnQtdHNjIiwgSGVhZGVyLkNvbnN0YW50VFNDKTsKKyAgICBJTy5tYXBSZXF1aXJlZCgibm9uc3RvcC10c2MiLCBIZWFkZXIuTm9uc3RvcFRTQyk7CisgICAgSU8ubWFwUmVxdWlyZWQoImN5Y2xlLWZyZXF1ZW5jeSIsIEhlYWRlci5DeWNsZUZyZXF1ZW5jeSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPHhyYXk6OllBTUxYUmF5UmVjb3JkPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCB4cmF5OjpZQU1MWFJheVJlY29yZCAmUmVjb3JkKSB7CisgICAgLy8gRklYTUU6IE1ha2UgdGhpcyB0eXBlIGFjdHVhbGx5IGJlIGRlc2NyaXB0aXZlCisgICAgSU8ubWFwUmVxdWlyZWQoInR5cGUiLCBSZWNvcmQuUmVjb3JkVHlwZSk7CisgICAgSU8ubWFwUmVxdWlyZWQoImZ1bmMtaWQiLCBSZWNvcmQuRnVuY0lkKTsKKyAgICBJTy5tYXBPcHRpb25hbCgiZnVuY3Rpb24iLCBSZWNvcmQuRnVuY3Rpb24pOworICAgIElPLm1hcE9wdGlvbmFsKCJhcmdzIiwgUmVjb3JkLkNhbGxBcmdzKTsKKyAgICBJTy5tYXBSZXF1aXJlZCgiY3B1IiwgUmVjb3JkLkNQVSk7CisgICAgSU8ubWFwUmVxdWlyZWQoInRocmVhZCIsIFJlY29yZC5USWQpOworICAgIElPLm1hcFJlcXVpcmVkKCJraW5kIiwgUmVjb3JkLlR5cGUpOworICAgIElPLm1hcFJlcXVpcmVkKCJ0c2MiLCBSZWNvcmQuVFNDKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBmbG93ID0gdHJ1ZTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPHhyYXk6OllBTUxYUmF5VHJhY2U+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIHhyYXk6OllBTUxYUmF5VHJhY2UgJlRyYWNlKSB7CisgICAgLy8gQSB0cmFjZSBmaWxlIGNvbnRhaW5zIHR3byBwYXJ0cywgdGhlIGhlYWRlciBhbmQgdGhlIGxpc3Qgb2YgYWxsIHRoZQorICAgIC8vIHRyYWNlIHJlY29yZHMuCisgICAgSU8ubWFwUmVxdWlyZWQoImhlYWRlciIsIFRyYWNlLkhlYWRlcik7CisgICAgSU8ubWFwUmVxdWlyZWQoInJlY29yZHMiLCBUcmFjZS5SZWNvcmRzKTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgeWFtbAorfSAvLyBuYW1lc3BhY2UgbGx2bQorCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKHhyYXk6OllBTUxYUmF5UmVjb3JkKQorCisjZW5kaWYgLy8gTExWTV9YUkFZX1lBTUxfWFJBWV9SRUNPUkRfSAo=